ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uLzAwLUlOREVYCmluZGV4IDQwYWM3NzUuLjZlOWM0MDUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi8wMC1JTkRFWApAQCAtMTQsNiArMTQsNyBAQAogCS0gdGhpcyBmaWxlLgogQUJJLwogCS0gaW5mbyBvbiBrZXJuZWwgPC0+IHVzZXJzcGFjZSBBQkkgYW5kIHJlbGF0aXZlIGludGVyZmFjZSBzdGFiaWxpdHkuCisKIEJVRy1IVU5USU5HCiAJLSBicnV0ZSBmb3JjZSBtZXRob2Qgb2YgZG9pbmcgYmluYXJ5IHNlYXJjaCBvZiBwYXRjaGVzIHRvIGZpbmQgYnVnLgogQ2hhbmdlcwpAQCAtNjYsNiArNjcsOCBAQAogCS0gaG93IHRvIGNoYW5nZSB5b3VyIFZHQSBjdXJzb3IgZnJvbSBhIGJsaW5raW5nIHVuZGVyc2NvcmUuCiBhY2NvdW50aW5nLwogCS0gZG9jdW1lbnRhdGlvbiBvbiBhY2NvdW50aW5nIGFuZCB0YXNrc3RhdHMuCithY3BpLworCS0gaW5mbyBvbiBBQ1BJLXNwZWNpZmljIGhvb2tzIGluIHRoZSBrZXJuZWwuCiBhb2UvCiAJLSBkZXNjcmlwdGlvbiBvZiBBb0UgKEFUQSBvdmVyIEV0aGVybmV0KSBhbG9uZyB3aXRoIGNvbmZpZyBleGFtcGxlcy4KIGFwcGx5aW5nLXBhdGNoZXMudHh0CkBAIC0xMjYsMTggKzEyOSwxNiBAQAogCS0gcGxhaW4gQVNDSUkgbGlzdGluZyBvZiBhbGwgdGhlIG5vZGVzIGluIC9kZXYvIHdpdGggbWFqb3IgbWlub3IgIydzLgogZGlnaWVwY2EudHh0CiAJLSBpbmZvIG9uIERpZ2kgSW50bC4ge1BDLFBDSSxFSVNBfVh4IGFuZCBYZW0gc2VyaWVzIGNhcmRzLgotZG5vdGlmeS50eHQKLQktIGluZm8gYWJvdXQgZGlyZWN0b3J5IG5vdGlmaWNhdGlvbiBpbiBMaW51eC4KIGRvbnRkaWZmCiAJLSBmaWxlIGNvbnRhaW5pbmcgYSBsaXN0IG9mIGZpbGVzIHRoYXQgc2hvdWxkIG5ldmVyIGJlIGRpZmYnZWQuCiBkcml2ZXItbW9kZWwvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIGFib3V0IExpbnV4IGRyaXZlciBtb2RlbC4KLWRyaXZlcnMvCi0JLSBkaXJlY3Rvcnkgd2l0aCBkcml2ZXIgZG9jdW1lbnRhdGlvbiAoY3VycmVudGx5IG9ubHkgRURBQykuCiBkdmIvCiAJLSBpbmZvIG9uIExpbnV4IERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0IChEVkIpIHN1YnN5c3RlbS4KIGVhcmx5LXVzZXJzcGFjZS8KIAktIGluZm8gYWJvdXQgaW5pdHJhbWZzLCBrbGliYywgYW5kIHVzZXJzcGFjZSBlYXJseSBkdXJpbmcgYm9vdC4KK2VkYWMudHh0CisJLSBpbmZvcm1hdGlvbiBvbiBFREFDIC0gRXJyb3IgRGV0ZWN0aW9uIEFuZCBDb3JyZWN0aW9uCiBlaXNhLnR4dAogCS0gaW5mbyBvbiBFSVNBIGJ1cyBzdXBwb3J0LgogZXhjZXB0aW9uLnR4dApAQCAtMzM0LDIwICszMzUsOCBAQAogCS0gbm90ZXMgb24gaG93IHRvIHVzZSB0aGUgUmVhbCBUaW1lIENsb2NrIChha2EgQ01PUyBjbG9jaykgZHJpdmVyLgogczM5MC8KIAktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdXNpbmcgTGludXggb24gdGhlIElCTSBTMzkwLgotc2NoZWQtYXJjaC50eHQKLQktIENQVSBTY2hlZHVsZXIgaW1wbGVtZW50YXRpb24gaGludHMgZm9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb2RlLgotc2NoZWQtY29kaW5nLnR4dAotCS0gcmVmZXJlbmNlIGZvciB2YXJpb3VzIHNjaGVkdWxlci1yZWxhdGVkIG1ldGhvZHMgaW4gdGhlIE8oMSkgc2NoZWR1bGVyLgotc2NoZWQtZGVzaWduLnR4dAotCS0gZ29hbHMsIGRlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIExpbnV4IE8oMSkgc2NoZWR1bGVyLgotc2NoZWQtZGVzaWduLUNGUy50eHQKLQktIGdvYWxzLCBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb21wbGV0ZSBGYWlyIFNjaGVkdWxlci4KLXNjaGVkLWRvbWFpbnMudHh0Ci0JLSBpbmZvcm1hdGlvbiBvbiBzY2hlZHVsaW5nIGRvbWFpbnMuCi1zY2hlZC1uaWNlLWRlc2lnbi50eHQKLQktIEhvdyBhbmQgd2h5IHRoZSBzY2hlZHVsZXIncyBuaWNlIGxldmVscyBhcmUgaW1wbGVtZW50ZWQuCi1zY2hlZC1zdGF0cy50eHQKLQktIGluZm9ybWF0aW9uIG9uIHNjaGVkc3RhdHMgKExpbnV4IFNjaGVkdWxlciBTdGF0aXN0aWNzKS4KK3NjaGVkdWxlci8KKwktIGRpcmVjdG9yeSB3aXRoIGluZm8gb24gdGhlIHNjaGVkdWxlci4KIHNjc2kvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIG9uIExpbnV4IHNjc2kgc3VwcG9ydC4KIHNlcmlhbC8KQEAgLTM2MCw4ICszNDksNiBAQAogCS0gc2hvcnQgYmx1cmIgb24gdGhlIFNHSSBWaXN1YWwgV29ya3N0YXRpb25zLgogc2gvCiAJLSBkaXJlY3Rvcnkgd2l0aCBpbmZvIG9uIHBvcnRpbmcgTGludXggdG8gYSBuZXcgYXJjaGl0ZWN0dXJlLgotc2hhcmVkc3VidHJlZS50eHQKLQktIGEgZGVzY3JpcHRpb24gb2Ygc2hhcmVkIHN1YnRyZWVzIGZvciBuYW1lc3BhY2VzLgogc21hcnQtY29uZmlnLnR4dAogCS0gZGVzY3JpcHRpb24gb2YgdGhlIFNtYXJ0IENvbmZpZyBtYWtlZmlsZSBmZWF0dXJlLgogc29ueS1sYXB0b3AudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3Byb2Nmcy1kaXNrc3RhdHMgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3Byb2Nmcy1kaXNrc3RhdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyMzM5MAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvcHJvY2ZzLWRpc2tzdGF0cwpAQCAtMCwwICsxLDIyIEBACitXaGF0OgkJL3Byb2MvZGlza3N0YXRzCitEYXRlOgkJRmVicnVhcnkgMjAwOAorQ29udGFjdDoJSmVyb21lIE1hcmNoYW5kIDxqbWFyY2hhbkByZWRoYXQuY29tPgorRGVzY3JpcHRpb246CisJCVRoZSAvcHJvYy9kaXNrc3RhdHMgZmlsZSBkaXNwbGF5cyB0aGUgSS9PIHN0YXRpc3RpY3MKKwkJb2YgYmxvY2sgZGV2aWNlcy4gRWFjaCBsaW5lIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgMTQKKwkJZmllbGRzOgorCQkgMSAtIG1ham9yIG51bWJlcgorCQkgMiAtIG1pbm9yIG11bWJlcgorCQkgMyAtIGRldmljZSBuYW1lCisJCSA0IC0gcmVhZHMgY29tcGxldGVkIHN1Y2Nlc2Z1bGx5CisJCSA1IC0gcmVhZHMgbWVyZ2VkCisJCSA2IC0gc2VjdG9ycyByZWFkCisJCSA3IC0gdGltZSBzcGVudCByZWFkaW5nIChtcykKKwkJIDggLSB3cml0ZXMgY29tcGxldGVkCisJCSA5IC0gd3JpdGVzIG1lcmdlZAorCQkxMCAtIHNlY3RvcnMgd3JpdHRlbgorCQkxMSAtIHRpbWUgc3BlbnQgd3JpdGluZyAobXMpCisJCTEyIC0gSS9PcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MKKwkJMTMgLSB0aW1lIHNwZW50IGRvaW5nIEkvT3MgKG1zKQorCQkxNCAtIHdlaWdodGVkIHRpbWUgc3BlbnQgZG9pbmcgSS9PcyAobXMpCisJCUZvciBtb3JlIGRldGFpbHMgcmVmZXIgdG8gRG9jdW1lbnRhdGlvbi9pb3N0YXRzLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1ibG9jayBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYmxvY2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkOWVhNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYmxvY2sKQEAgLTAsMCArMSwyOCBAQAorV2hhdDoJCS9zeXMvYmxvY2svPGRpc2s+L3N0YXQKK0RhdGU6CQlGZWJydWFyeSAyMDA4CitDb250YWN0OglKZXJvbWUgTWFyY2hhbmQgPGptYXJjaGFuQHJlZGhhdC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhlIC9zeXMvYmxvY2svPGRpc2s+L3N0YXQgZmlsZXMgZGlzcGxheXMgdGhlIEkvTworCQlzdGF0aXN0aWNzIG9mIGRpc2sgPGRpc2s+LiBUaGV5IGNvbnRhaW4gMTEgZmllbGRzOgorCQkgMSAtIHJlYWRzIGNvbXBsZXRlZCBzdWNjZXNmdWxseQorCQkgMiAtIHJlYWRzIG1lcmdlZAorCQkgMyAtIHNlY3RvcnMgcmVhZAorCQkgNCAtIHRpbWUgc3BlbnQgcmVhZGluZyAobXMpCisJCSA1IC0gd3JpdGVzIGNvbXBsZXRlZAorCQkgNiAtIHdyaXRlcyBtZXJnZWQKKwkJIDcgLSBzZWN0b3JzIHdyaXR0ZW4KKwkJIDggLSB0aW1lIHNwZW50IHdyaXRpbmcgKG1zKQorCQkgOSAtIEkvT3MgY3VycmVudGx5IGluIHByb2dyZXNzCisJCTEwIC0gdGltZSBzcGVudCBkb2luZyBJL09zIChtcykKKwkJMTEgLSB3ZWlnaHRlZCB0aW1lIHNwZW50IGRvaW5nIEkvT3MgKG1zKQorCQlGb3IgbW9yZSBkZXRhaWxzIHJlZmVyIERvY3VtZW50YXRpb24vaW9zdGF0cy50eHQKKworCitXaGF0OgkJL3N5cy9ibG9jay88ZGlzaz4vPHBhcnQ+L3N0YXQKK0RhdGU6CQlGZWJydWFyeSAyMDA4CitDb250YWN0OglKZXJvbWUgTWFyY2hhbmQgPGptYXJjaGFuQHJlZGhhdC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhlIC9zeXMvYmxvY2svPGRpc2s+LzxwYXJ0Pi9zdGF0IGZpbGVzIGRpc3BsYXkgdGhlCisJCUkvTyBzdGF0aXN0aWNzIG9mIHBhcnRpdGlvbiA8cGFydD4uIFRoZSBmb3JtYXQgaXMgdGhlCisJCXNhbWUgYXMgdGhlIGFib3ZlLXdyaXR0ZW4gL3N5cy9ibG9jay88ZGlzaz4vc3RhdAorCQlmb3JtYXQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWZpcm13YXJlLWFjcGkgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWZpcm13YXJlLWFjcGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ3MGVkOQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZmlybXdhcmUtYWNwaQpAQCAtMCwwICsxLDk5IEBACitXaGF0OgkJL3N5cy9maXJtd2FyZS9hY3BpL2ludGVycnVwdHMvCitEYXRlOgkJRmVicnVhcnkgMjAwOAorQ29udGFjdDoJTGVuIEJyb3duIDxsZW5iQGtlcm5lbC5vcmc+CitEZXNjcmlwdGlvbjoKKwkJQWxsIEFDUEkgaW50ZXJydXB0cyBhcmUgaGFuZGxlZCB2aWEgYSBzaW5nbGUgSVJRLAorCQl0aGUgU3lzdGVtIENvbnRyb2wgSW50ZXJydXB0IChTQ0kpLCB3aGljaCBhcHBlYXJzCisJCWFzICJhY3BpIiBpbiAvcHJvYy9pbnRlcnJ1cHRzLgorCisJCUhvd2V2ZXIsIG9uZSBvZiB0aGUgbWFpbiBmdW5jdGlvbnMgb2YgQUNQSSBpcyB0byBtYWtlCisJCXRoZSBwbGF0Zm9ybSB1bmRlcnN0YW5kIHJhbmRvbSBoYXJkd2FyZSB3aXRob3V0CisJCXNwZWNpYWwgZHJpdmVyIHN1cHBvcnQuICBTbyB3aGlsZSB0aGUgU0NJIGhhbmRsZXMgYSBmZXcKKwkJd2VsbCBrbm93biAoZml4ZWQgZmVhdHVyZSkgaW50ZXJydXB0cyBzb3VyY2VzLCBzdWNoCisJCWFzIHRoZSBwb3dlciBidXR0b24sIGl0IGNhbiBhbHNvIGhhbmRsZSBhIHZhcmlhYmxlCisJCW51bWJlciBvZiBhICJHZW5lcmFsIFB1cnBvc2UgRXZlbnRzIiAoR1BFKS4KKworCQlBIEdQRSB2ZWN0b3JzIHRvIGEgc3BlY2lmaWVkIGhhbmRsZXIgaW4gQU1MLCB3aGljaAorCQljYW4gZG8gYSBhbnl0aGluZyB0aGUgQklPUyB3cml0ZXIgd2FudHMgZnJvbQorCQlPUyBjb250ZXh0LiAgR1BFIDB4MTIsIGZvciBleGFtcGxlLCB3b3VsZCB2ZWN0b3IKKwkJdG8gYSBsZXZlbCBvciBlZGdlIGhhbmRsZXIgY2FsbGVkIF9MMTIgb3IgX0UxMi4KKwkJVGhlIGhhbmRsZXIgbWF5IGRvIGl0cyBidXNpbmVzcyBhbmQgcmV0dXJuLgorCQlPciB0aGUgaGFuZGxlciBtYXkgc2VuZCBzZW5kIGEgTm90aWZ5IGV2ZW50CisJCXRvIGEgTGludXggZGV2aWNlIGRyaXZlciByZWdpc3RlcmVkIG9uIGFuIEFDUEkgZGV2aWNlLAorCQlzdWNoIGFzIGEgYmF0dGVyeSwgb3IgYSBwcm9jZXNzb3IuCisKKwkJVG8gZmlndXJlIG91dCB3aGVyZSBhbGwgdGhlIFNDSSdzIGFyZSBjb21pbmcgZnJvbSwKKwkJL3N5cy9maXJtd2FyZS9hY3BpL2ludGVycnVwdHMgY29udGFpbnMgYSBmaWxlIGxpc3RpbmcKKwkJZXZlcnkgcG9zc2libGUgc291cmNlLCBhbmQgdGhlIGNvdW50IG9mIGhvdyBtYW55CisJCXRpbWVzIGl0IGhhcyB0cmlnZ2VyZWQuCisKKwkJJCBjZCAvc3lzL2Zpcm13YXJlL2FjcGkvaW50ZXJydXB0cworCQkkIGdyZXAgLiAqCisJCWVycm9yOjAKKwkJZmZfZ2JsX2xvY2s6MAorCQlmZl9wbXRpbWVyOjAKKwkJZmZfcHdyX2J0bjowCisJCWZmX3J0X2NsazowCisJCWZmX3NscF9idG46MAorCQlncGUwMDowCisJCWdwZTAxOjAKKwkJZ3BlMDI6MAorCQlncGUwMzowCisJCWdwZTA0OjAKKwkJZ3BlMDU6MAorCQlncGUwNjowCisJCWdwZTA3OjAKKwkJZ3BlMDg6MAorCQlncGUwOToxNzQKKwkJZ3BlMEE6MAorCQlncGUwQjowCisJCWdwZTBDOjAKKwkJZ3BlMEQ6MAorCQlncGUwRTowCisJCWdwZTBGOjAKKwkJZ3BlMTA6MAorCQlncGUxMTo2MAorCQlncGUxMjowCisJCWdwZTEzOjAKKwkJZ3BlMTQ6MAorCQlncGUxNTowCisJCWdwZTE2OjAKKwkJZ3BlMTc6MAorCQlncGUxODowCisJCWdwZTE5OjcKKwkJZ3BlMUE6MAorCQlncGUxQjowCisJCWdwZTFDOjAKKwkJZ3BlMUQ6MAorCQlncGUxRTowCisJCWdwZTFGOjAKKwkJZ3BlX2FsbDoyNDEKKwkJc2NpOjI0MQorCisJCXNjaSAtIFRoZSB0b3RhbCBudW1iZXIgb2YgdGltZXMgdGhlIEFDUEkgU0NJCisJCWhhcyBjbGFpbWVkIGFuIGludGVycnVwdC4KKworCQlncGVfYWxsIC0gY291bnQgb2YgU0NJIGNhdXNlZCBieSBHUEVzLgorCisJCWdwZVhYIC0gY291bnQgZm9yIGluZGl2aWR1YWwgR1BFIHNvdXJjZQorCisJCWZmX2dibF9sb2NrIC0gR2xvYmFsIExvY2sKKworCQlmZl9wbXRpbWVyIC0gUE0gVGltZXIKKworCQlmZl9wd3JfYnRuIC0gUG93ZXIgQnV0dG9uCisKKwkJZmZfcnRfY2xrIC0gUmVhbCBUaW1lIENsb2NrCisKKwkJZmZfc2xwX2J0biAtIFNsZWVwIEJ1dHRvbgorCisJCWVycm9yIC0gYW4gaW50ZXJydXB0IHRoYXQgY2FuJ3QgYmUgYWNjb3VudGVkIGZvciBhYm92ZS4KKworCQlSb290IGhhcyBwZXJtaXNzaW9uIHRvIGNsZWFyIGFueSBvZiB0aGVzZSBjb3VudGVycy4gIEVnLgorCQkjIGVjaG8gMCA+IGdwZTExCisKKwkJQWxsIGNvdW50ZXJzIGNhbiBiZSBjbGVhcmVkIGJ5IGNsZWFyaW5nIHRoZSB0b3RhbCAic2NpIjoKKwkJIyBlY2hvIDAgPiBzY2kKKworCQlOb25lIG9mIHRoZXNlIGNvdW50ZXJzIGhhcyBhbiBlZmZlY3Qgb24gdGhlIGZ1bmN0aW9uCisJCW9mIHRoZSBzeXN0ZW0sIHRoZXkgYXJlIHNpbXBseSBzdGF0aXN0aWNzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1rZXJuZWwtdWlkcyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMta2VybmVsLXVpZHMKaW5kZXggNjQ4ZDY1ZC4uMjhmMTQ2OSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1rZXJuZWwtdWlkcworKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWtlcm5lbC11aWRzCkBAIC0xMSw0ICsxMSw0IEBACiAJCWV4YW1wbGUgd291bGQgYmUsIGlmIFVzZXIgQSBoYXMgc2hhcmVzID0gMTAyNCBhbmQgdXNlcgogCQlCIGhhcyBzaGFyZXMgPSAyMDQ4LCBVc2VyIEIgd2lsbCBnZXQgdHdpY2UgdGhlIENQVQogCQliYW5kd2lkdGggdXNlciBBIHdpbGwuIEZvciBtb3JlIGRldGFpbHMgcmVmZXIKLQkJRG9jdW1lbnRhdGlvbi9zY2hlZC1kZXNpZ24tQ0ZTLnR4dAorCQlEb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1kZXNpZ24tQ0ZTLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2dlbmVyaWNpcnEudG1wbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9nZW5lcmljaXJxLnRtcGwKaW5kZXggNDIxNWY2OS4uM2E4ODJkOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2dlbmVyaWNpcnEudG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZ2VuZXJpY2lycS50bXBsCkBAIC0xNzIsNyArMTcyLDcgQEAKIAkgIDxsaXN0aXRlbT48cGFyYT5DaGlwbGV2ZWwgaGFyZHdhcmUgZW5jYXBzdWxhdGlvbjwvcGFyYT48L2xpc3RpdGVtPgogCTwvb3JkZXJlZGxpc3Q+CiAgICAgPC9wYXJhPgotICAgIDxzZWN0MT4KKyAgICA8c2VjdDEgaWQ9IkludGVycnVwdF9jb250cm9sX2Zsb3ciPgogCTx0aXRsZT5JbnRlcnJ1cHQgY29udHJvbCBmbG93PC90aXRsZT4KIAk8cGFyYT4KIAlFYWNoIGludGVycnVwdCBpcyBkZXNjcmliZWQgYnkgYW4gaW50ZXJydXB0IGRlc2NyaXB0b3Igc3RydWN0dXJlCkBAIC0xOTAsNyArMTkwLDcgQEAKIAlyZWZlcmVuY2VkIGJ5IHRoZSBhc3NpZ25lZCBjaGlwIGRlc2NyaXB0b3Igc3RydWN0dXJlLgogCTwvcGFyYT4KICAgICA8L3NlY3QxPgotICAgIDxzZWN0MT4KKyAgICA8c2VjdDEgaWQ9IkhpZ2hsZXZlbF9Ecml2ZXJfQVBJIj4KIAk8dGl0bGU+SGlnaGxldmVsIERyaXZlciBBUEk8L3RpdGxlPgogCTxwYXJhPgogCSAgVGhlIGhpZ2hsZXZlbCBEcml2ZXIgQVBJIGNvbnNpc3RzIG9mIGZvbGxvd2luZyBmdW5jdGlvbnM6CkBAIC0yMTAsNyArMjEwLDcgQEAKIAkgIFNlZSB0aGUgYXV0b2dlbmVyYXRlZCBmdW5jdGlvbiBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgogCTwvcGFyYT4KICAgICA8L3NlY3QxPgotICAgIDxzZWN0MT4KKyAgICA8c2VjdDEgaWQ9IkhpZ2hsZXZlbF9JUlFfZmxvd19oYW5kbGVycyI+CiAJPHRpdGxlPkhpZ2hsZXZlbCBJUlEgZmxvdyBoYW5kbGVyczwvdGl0bGU+CiAJPHBhcmE+CiAJICBUaGUgZ2VuZXJpYyBsYXllciBwcm92aWRlcyBhIHNldCBvZiBwcmUtZGVmaW5lZCBpcnEtZmxvdyBtZXRob2RzOgpAQCAtMjI0LDkgKzIyNCw5IEBACiAJICBzcGVjaWZpYykgYXJlIGFzc2lnbmVkIHRvIHNwZWNpZmljIGludGVycnVwdHMgYnkgdGhlIGFyY2hpdGVjdHVyZQogCSAgZWl0aGVyIGR1cmluZyBib290dXAgb3IgZHVyaW5nIGRldmljZSBpbml0aWFsaXphdGlvbi4KIAk8L3BhcmE+Ci0JPHNlY3QyPgorCTxzZWN0MiBpZD0iRGVmYXVsdF9mbG93X2ltcGxlbWVudGF0aW9ucyI+CiAJPHRpdGxlPkRlZmF1bHQgZmxvdyBpbXBsZW1lbnRhdGlvbnM8L3RpdGxlPgotCSAgICA8c2VjdDM+CisJICAgIDxzZWN0MyBpZD0iSGVscGVyX2Z1bmN0aW9ucyI+CiAJIAk8dGl0bGU+SGVscGVyIGZ1bmN0aW9uczwvdGl0bGU+CiAJCTxwYXJhPgogCQlUaGUgaGVscGVyIGZ1bmN0aW9ucyBjYWxsIHRoZSBjaGlwIHByaW1pdGl2ZXMgYW5kCkBAIC0yNjcsOSArMjY3LDkgQEAKIAkgICAgICAgIDwvcGFyYT4KIAkgICAgPC9zZWN0Mz4KIAk8L3NlY3QyPgotCTxzZWN0Mj4KKwk8c2VjdDIgaWQ9IkRlZmF1bHRfZmxvd19oYW5kbGVyX2ltcGxlbWVudGF0aW9ucyI+CiAJPHRpdGxlPkRlZmF1bHQgZmxvdyBoYW5kbGVyIGltcGxlbWVudGF0aW9uczwvdGl0bGU+Ci0JICAgIDxzZWN0Mz4KKwkgICAgPHNlY3QzIGlkPSJEZWZhdWx0X0xldmVsX0lSUV9mbG93X2hhbmRsZXIiPgogCSAJPHRpdGxlPkRlZmF1bHQgTGV2ZWwgSVJRIGZsb3cgaGFuZGxlcjwvdGl0bGU+CiAJCTxwYXJhPgogCQloYW5kbGVfbGV2ZWxfaXJxIHByb3ZpZGVzIGEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbgpAQCAtMjg0LDcgKzI4NCw3IEBACiAJCTwvcHJvZ3JhbWxpc3Rpbmc+CiAJCTwvcGFyYT4KICAgIAkgICAgPC9zZWN0Mz4KLQkgICAgPHNlY3QzPgorCSAgICA8c2VjdDMgaWQ9IkRlZmF1bHRfRWRnZV9JUlFfZmxvd19oYW5kbGVyIj4KIAkgCTx0aXRsZT5EZWZhdWx0IEVkZ2UgSVJRIGZsb3cgaGFuZGxlcjwvdGl0bGU+CiAJCTxwYXJhPgogCQloYW5kbGVfZWRnZV9pcnEgcHJvdmlkZXMgYSBnZW5lcmljIGltcGxlbWVudGF0aW9uCkBAIC0zMTEsNyArMzExLDcgQEAKIAkJPC9wcm9ncmFtbGlzdGluZz4KIAkJPC9wYXJhPgogICAgCSAgICA8L3NlY3QzPgotCSAgICA8c2VjdDM+CisJICAgIDxzZWN0MyBpZD0iRGVmYXVsdF9zaW1wbGVfSVJRX2Zsb3dfaGFuZGxlciI+CiAJIAk8dGl0bGU+RGVmYXVsdCBzaW1wbGUgSVJRIGZsb3cgaGFuZGxlcjwvdGl0bGU+CiAJCTxwYXJhPgogCQloYW5kbGVfc2ltcGxlX2lycSBwcm92aWRlcyBhIGdlbmVyaWMgaW1wbGVtZW50YXRpb24KQEAgLTMyOCw3ICszMjgsNyBAQAogCQk8L3Byb2dyYW1saXN0aW5nPgogCQk8L3BhcmE+CiAgICAJICAgIDwvc2VjdDM+Ci0JICAgIDxzZWN0Mz4KKwkgICAgPHNlY3QzIGlkPSJEZWZhdWx0X3Blcl9DUFVfZmxvd19oYW5kbGVyIj4KIAkgCTx0aXRsZT5EZWZhdWx0IHBlciBDUFUgZmxvdyBoYW5kbGVyPC90aXRsZT4KIAkJPHBhcmE+CiAJCWhhbmRsZV9wZXJjcHVfaXJxIHByb3ZpZGVzIGEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbgpAQCAtMzQ5LDcgKzM0OSw3IEBACiAJCTwvcGFyYT4KICAgIAkgICAgPC9zZWN0Mz4KIAk8L3NlY3QyPgotCTxzZWN0Mj4KKwk8c2VjdDIgaWQ9IlF1aXJrc19hbmRfb3B0aW1pemF0aW9ucyI+CiAJPHRpdGxlPlF1aXJrcyBhbmQgb3B0aW1pemF0aW9uczwvdGl0bGU+CiAJPHBhcmE+CiAJVGhlIGdlbmVyaWMgZnVuY3Rpb25zIGFyZSBpbnRlbmRlZCBmb3IgJ2NsZWFuJyBhcmNoaXRlY3R1cmVzIGFuZCBjaGlwcywKQEAgLTM1OCw3ICszNTgsNyBAQAogCW92ZXJyaWRpbmcgdGhlIGhpZ2hsZXZlbCBpcnEtZmxvdyBoYW5kbGVyLgogCTwvcGFyYT4KIAk8L3NlY3QyPgotCTxzZWN0Mj4KKwk8c2VjdDIgaWQ9IkRlbGF5ZWRfaW50ZXJydXB0X2Rpc2FibGUiPgogCTx0aXRsZT5EZWxheWVkIGludGVycnVwdCBkaXNhYmxlPC90aXRsZT4KIAk8cGFyYT4KIAlUaGlzIHBlciBpbnRlcnJ1cHQgc2VsZWN0YWJsZSBmZWF0dXJlLCB3aGljaCB3YXMgaW50cm9kdWNlZCBieSBSdXNzZWxsCkBAIC0zODAsNyArMzgwLDcgQEAKIAk8L3BhcmE+CiAJPC9zZWN0Mj4KICAgICA8L3NlY3QxPgotICAgIDxzZWN0MT4KKyAgICA8c2VjdDEgaWQ9IkNoaXBsZXZlbF9oYXJkd2FyZV9lbmNhcHN1bGF0aW9uIj4KIAk8dGl0bGU+Q2hpcGxldmVsIGhhcmR3YXJlIGVuY2Fwc3VsYXRpb248L3RpdGxlPgogCTxwYXJhPgogCVRoZSBjaGlwIGxldmVsIGhhcmR3YXJlIGRlc2NyaXB0b3Igc3RydWN0dXJlIGlycV9jaGlwCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbHNtLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbHNtLnRtcGwKaW5kZXggZjYzODIyMS4uZmU3NjY0YyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2xzbS50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9sc20udG1wbApAQCAtMzMsNyArMzMsNyBAQAogIDwvYXV0aG9yZ3JvdXA+CiAgPC9hcnRpY2xlaW5mbz4KIAotPHNlY3QxPjx0aXRsZT5JbnRyb2R1Y3Rpb248L3RpdGxlPgorPHNlY3QxIGlkPSJJbnRyb2R1Y3Rpb24iPjx0aXRsZT5JbnRyb2R1Y3Rpb248L3RpdGxlPgogCiA8cGFyYT4KIEluIE1hcmNoIDIwMDEsIHRoZSBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kgKE5TQSkgZ2F2ZSBhIHByZXNlbnRhdGlvbgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL210ZG5hbmQudG1wbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tdGRuYW5kLnRtcGwKaW5kZXggOTU3Y2Y1Yy4uOGUxNDU4NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL210ZG5hbmQudG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbXRkbmFuZC50bXBsCkBAIC04MCw3ICs4MCw3IEBACiAgICAgIHN0cnVjdCBtZW1iZXIgaGFzIGEgc2hvcnQgZGVzY3JpcHRpb24gd2hpY2ggaXMgbWFya2VkIHdpdGggYW4gW1hYWF0gaWRlbnRpZmllci4KICAgICAgVGhlIGZvbGxvd2luZyBjaGFwdGVycyBleHBsYWluIHRoZSBtZWFuaW5nIG9mIHRob3NlIGlkZW50aWZpZXJzLgogICAgICA8L3BhcmE+Ci0gICAgIDxzZWN0MT4gICAKKyAgICAgPHNlY3QxIGlkPSJGdW5jdGlvbl9pZGVudGlmaWVyc19YWFgiPgogCTx0aXRsZT5GdW5jdGlvbiBpZGVudGlmaWVycyBbWFhYXTwvdGl0bGU+CiAgICAgIAk8cGFyYT4KIAlUaGUgZnVuY3Rpb25zIGFyZSBtYXJrZWQgd2l0aCBbWFhYXSBpZGVudGlmaWVycyBpbiB0aGUgc2hvcnQKQEAgLTExNSw3ICsxMTUsNyBAQAogCQk8L3BhcmE+PC9saXN0aXRlbT4KIAk8L2l0ZW1pemVkbGlzdD4KICAgICAgPC9zZWN0MT4KLSAgICAgPHNlY3QxPiAgIAorICAgICA8c2VjdDEgaWQ9IlN0cnVjdF9tZW1iZXJfaWRlbnRpZmllcnNfWFhYIj4KIAk8dGl0bGU+U3RydWN0IG1lbWJlciBpZGVudGlmaWVycyBbWFhYXTwvdGl0bGU+CiAgICAgIAk8cGFyYT4KIAlUaGUgc3RydWN0IG1lbWJlcnMgYXJlIG1hcmtlZCB3aXRoIFtYWFhdIGlkZW50aWZpZXJzIGluIHRoZSAKQEAgLTE1OSw3ICsxNTksNyBAQAogCQliYXNpYyBmdW5jdGlvbnMgYW5kIGZpbGwgb3V0IHNvbWUgcmVhbGx5IGJvYXJkIGRlcGVuZGVudAogCQltZW1iZXJzIGluIHRoZSBuYW5kIGNoaXAgZGVzY3JpcHRpb24gc3RydWN0dXJlLgogCTwvcGFyYT4KLQk8c2VjdDE+CisJPHNlY3QxIGlkPSJCYXNpY19kZWZpbmVzIj4KIAkJPHRpdGxlPkJhc2ljIGRlZmluZXM8L3RpdGxlPgogCQk8cGFyYT4KIAkJCUF0IGxlYXN0IHlvdSBoYXZlIHRvIHByb3ZpZGUgYSBtdGQgc3RydWN0dXJlIGFuZApAQCAtMTg1LDcgKzE4NSw3IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyBiYXNlYWRkcjsKIAkJPC9wcm9ncmFtbGlzdGluZz4KIAk8L3NlY3QxPgotCTxzZWN0MT4KKwk8c2VjdDEgaWQ9IlBhcnRpdGlvbl9kZWZpbmVzIj4KIAkJPHRpdGxlPlBhcnRpdGlvbiBkZWZpbmVzPC90aXRsZT4KIAkJPHBhcmE+CiAJCQlJZiB5b3Ugd2FudCB0byBkaXZpZGUgeW91ciBkZXZpY2UgaW50byBwYXJ0aXRpb25zLCB0aGVuCkBAIC0yMDQsNyArMjA0LDcgQEAKIH07CiAJCTwvcHJvZ3JhbWxpc3Rpbmc+CiAJPC9zZWN0MT4KLQk8c2VjdDE+CisJPHNlY3QxIGlkPSJIYXJkd2FyZV9jb250cm9sX2Z1bmN0aW9ucyI+CiAJCTx0aXRsZT5IYXJkd2FyZSBjb250cm9sIGZ1bmN0aW9uPC90aXRsZT4KIAkJPHBhcmE+CiAJCQlUaGUgaGFyZHdhcmUgY29udHJvbCBmdW5jdGlvbiBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIApAQCAtMjQ2LDcgKzI0Niw3IEBACiB9CiAJCTwvcHJvZ3JhbWxpc3Rpbmc+CiAJPC9zZWN0MT4KLQk8c2VjdDE+CisJPHNlY3QxIGlkPSJEZXZpY2VfcmVhZHlfZnVuY3Rpb24iPgogCQk8dGl0bGU+RGV2aWNlIHJlYWR5IGZ1bmN0aW9uPC90aXRsZT4KIAkJPHBhcmE+CiAJCQlJZiB0aGUgaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyB0aGUgcmVhZHkgYnVzeSBwaW4gb2YgdGhlIE5BTkQgY2hpcCBjb25uZWN0ZWQgdG8gYQpAQCAtMjU3LDcgKzI1Nyw3IEBACiAJCQl0aGUgZnVuY3Rpb24gbXVzdCBub3QgYmUgZGVmaW5lZCBhbmQgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdGhpcy0+ZGV2X3JlYWR5IGlzIHNldCB0byBOVUxMLgkJCiAJCTwvcGFyYT4KIAk8L3NlY3QxPgotCTxzZWN0MT4KKwk8c2VjdDEgaWQ9IkluaXRfZnVuY3Rpb24iPgogCQk8dGl0bGU+SW5pdCBmdW5jdGlvbjwvdGl0bGU+CiAJCTxwYXJhPgogCQkJVGhlIGluaXQgZnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSBhbmQgc2V0cyB1cCBhbGwgdGhlIGJvYXJkCkBAIC0zMjUsNyArMzI1LDcgQEAKIG1vZHVsZV9pbml0KGJvYXJkX2luaXQpOwogCQk8L3Byb2dyYW1saXN0aW5nPgogCTwvc2VjdDE+Ci0JPHNlY3QxPgorCTxzZWN0MSBpZD0iRXhpdF9mdW5jdGlvbiI+CiAJCTx0aXRsZT5FeGl0IGZ1bmN0aW9uPC90aXRsZT4KIAkJPHBhcmE+CiAJCQlUaGUgZXhpdCBmdW5jdGlvbiBpcyBvbmx5IG5lY2NlY2FyeSBpZiB0aGUgZHJpdmVyIGlzCkBAIC0zNTksNyArMzU5LDcgQEAKIAkJZHJpdmVyLiBGb3IgYSBsaXN0IG9mIGZ1bmN0aW9ucyB3aGljaCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgYm9hcmQKIAkJZHJpdmVyIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgbmFuZF9jaGlwIHN0cnVjdHVyZS4KIAk8L3BhcmE+Ci0JPHNlY3QxPgorCTxzZWN0MSBpZD0iTXVsdGlwbGVfY2hpcF9jb250cm9sIj4KIAkJPHRpdGxlPk11bHRpcGxlIGNoaXAgY29udHJvbDwvdGl0bGU+CiAJCTxwYXJhPgogCQkJVGhlIG5hbmQgZHJpdmVyIGNhbiBjb250cm9sIGNoaXAgYXJyYXlzLiBUaGVyZWZvciB0aGUKQEAgLTQxOSw5ICs0MTksOSBAQAogfQogCQk8L3Byb2dyYW1saXN0aW5nPgogCTwvc2VjdDE+Ci0JPHNlY3QxPgorCTxzZWN0MSBpZD0iSGFyZHdhcmVfRUNDX3N1cHBvcnQiPgogCQk8dGl0bGU+SGFyZHdhcmUgRUNDIHN1cHBvcnQ8L3RpdGxlPgotCQk8c2VjdDI+CisJCTxzZWN0MiBpZD0iRnVuY3Rpb25zX2FuZF9jb25zdGFudHMiPgogCQkJPHRpdGxlPkZ1bmN0aW9ucyBhbmQgY29uc3RhbnRzPC90aXRsZT4KIAkJCTxwYXJhPgogCQkJCVRoZSBuYW5kIGRyaXZlciBzdXBwb3J0cyB0aHJlZSBkaWZmZXJlbnQgdHlwZXMgb2YKQEAgLTQ3NSw3ICs0NzUsNyBAQAogCQkJCTwvaXRlbWl6ZWRsaXN0PgogCQkJPC9wYXJhPgogCQk8L3NlY3QyPgotCQk8c2VjdDI+CisJCTxzZWN0MiBpZD0iSGFyZHdhcmVfRUNDX3dpdGhfc3luZHJvbWVfY2FsY3VsYXRpb24iPgogCQk8dGl0bGU+SGFyZHdhcmUgRUNDIHdpdGggc3luZHJvbWUgY2FsY3VsYXRpb248L3RpdGxlPgogCQkJPHBhcmE+CiAJCQkJTWFueSBoYXJkd2FyZSBFQ0MgaW1wbGVtZW50YXRpb25zIHByb3ZpZGUgUmVlZC1Tb2xvbW9uCkBAIC01MDAsNyArNTAwLDcgQEAKIAkJCTwvcGFyYT4KIAkJPC9zZWN0Mj4KIAk8L3NlY3QxPgotCTxzZWN0MT4KKwk8c2VjdDEgaWQ9IkJhZF9CbG9ja190YWJsZV9zdXBwb3J0Ij4KIAkJPHRpdGxlPkJhZCBibG9jayB0YWJsZSBzdXBwb3J0PC90aXRsZT4KIAkJPHBhcmE+CiAJCQlNb3N0IE5BTkQgY2hpcHMgbWFyayB0aGUgYmFkIGJsb2NrcyBhdCBhIGRlZmluZWQKQEAgLTU1Miw3ICs1NTIsNyBAQAogCQkJYWxsb3dzIGZhc3RlciBhY2Nlc3MgdGhhbiBhbHdheXMgY2hlY2tpbmcgdGhlCiAJCQliYWQgYmxvY2sgaW5mb3JtYXRpb24gb24gdGhlIGZsYXNoIGNoaXAgaXRzZWxmLgogCQk8L3BhcmE+Ci0JCTxzZWN0Mj4KKwkJPHNlY3QyIGlkPSJGbGFzaF9iYXNlZF90YWJsZXMiPgogCQkJPHRpdGxlPkZsYXNoIGJhc2VkIHRhYmxlczwvdGl0bGU+CiAJCQk8cGFyYT4KIAkJCQlJdCBtYXkgYmUgZGVzaXJlZCBvciBuZWNjZWNhcnkgdG8ga2VlcCBhIGJhZCBibG9jayB0YWJsZSBpbiBGTEFTSC4gCkBAIC01ODcsNyArNTg3LDcgQEAKIAkJCQk8L2l0ZW1pemVkbGlzdD4KIAkJCTwvcGFyYT4KIAkJPC9zZWN0Mj4KLQkJPHNlY3QyPgorCQk8c2VjdDIgaWQ9IlVzZXJfZGVmaW5lZF90YWJsZXMiPgogCQkJPHRpdGxlPlVzZXIgZGVmaW5lZCB0YWJsZXM8L3RpdGxlPgogCQkJPHBhcmE+CiAJCQkJVXNlciBkZWZpbmVkIHRhYmxlcyBhcmUgY3JlYXRlZCBieSBmaWxsaW5nIG91dCBhIApAQCAtNjc2LDcgKzY3Niw3IEBACiAJCQk8L3BhcmE+CiAJCTwvc2VjdDI+CiAJPC9zZWN0MT4KLQk8c2VjdDE+CisJPHNlY3QxIGlkPSJTcGFyZV9hcmVhX3BsYWNlbWVudCI+CiAJCTx0aXRsZT5TcGFyZSBhcmVhIChhdXRvKXBsYWNlbWVudDwvdGl0bGU+CiAJCTxwYXJhPgogCQkJVGhlIG5hbmQgZHJpdmVyIGltcGxlbWVudHMgZGlmZmVyZW50IHBvc3NpYmlsaXRpZXMgZm9yCkBAIC03MzAsNyArNzMwLDcgQEAKIAkJCTwvcGFyYT48L2xpc3RpdGVtPgogCQkJPC9pdGVtaXplZGxpc3Q+CiAJCTwvcGFyYT4KLQkJPHNlY3QyPgorCQk8c2VjdDIgaWQ9IlBsYWNlbWVudF9kZWZpbmVkX2J5X2ZzX2RyaXZlciI+CiAJCQk8dGl0bGU+UGxhY2VtZW50IGRlZmluZWQgYnkgZnMgZHJpdmVyPC90aXRsZT4KIAkJCTxwYXJhPgogCQkJCVRoZSBjYWxsaW5nIGZ1bmN0aW9uIHByb3ZpZGVzIGEgcG9pbnRlciB0byBhIG5hbmRfb29iaW5mbwpAQCAtNzYwLDcgKzc2MCw3IEBACiAJCQkJZG9uZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHNjaGVtZSBpbiB0aGUgbmFuZF9vb2JpbmZvIHN0cnVjdHVyZS4KIAkJCTwvcGFyYT4KIAkJPC9zZWN0Mj4KLQkJPHNlY3QyPgorCQk8c2VjdDIgaWQ9IkF1dG9tYXRpY19wbGFjZW1lbnQiPgogCQkJPHRpdGxlPkF1dG9tYXRpYyBwbGFjZW1lbnQ8L3RpdGxlPgogCQkJPHBhcmE+CiAJCQkJQXV0b21hdGljIHBsYWNlbWVudCB1c2VzIHRoZSBidWlsdCBpbiBkZWZhdWx0cyB0byBwbGFjZSB0aGUKQEAgLTc3NCw3ICs3NzQsNyBAQAogCQkJCWRvbmUgYWNjb3JkaW5nIHRvIHRoZSBkZWZhdWx0IGJ1aWx0aW4gc2NoZW1lLgogCQkJPC9wYXJhPgogCQk8L3NlY3QyPgotCQk8c2VjdDI+CisJCTxzZWN0MiBpZD0iVXNlcl9zcGFjZV9wbGFjZW1lbnRfc2VsZWN0aW9uIj4KIAkJCTx0aXRsZT5Vc2VyIHNwYWNlIHBsYWNlbWVudCBzZWxlY3Rpb248L3RpdGxlPgogCQk8cGFyYT4KIAkJCUFsbCBub24gZWNjIGZ1bmN0aW9ucyBsaWtlIG10ZC0+cmVhZCBhbmQgbXRkLT53cml0ZSB1c2UgYW4gaW50ZXJuYWwgCkBAIC03ODksOSArNzg5LDkgQEAKIAkJPC9wYXJhPgogCQk8L3NlY3QyPgogCTwvc2VjdDE+CQotCTxzZWN0MT4KKwk8c2VjdDEgaWQ9IlNwYXJlX2FyZWFfYXV0b3BsYWNlbWVudF9kZWZhdWx0Ij4KIAkJPHRpdGxlPlNwYXJlIGFyZWEgYXV0b3BsYWNlbWVudCBkZWZhdWx0IHNjaGVtZXM8L3RpdGxlPgotCQk8c2VjdDI+CisJCTxzZWN0MiBpZD0icGFnZXNpemVfMjU2Ij4KIAkJCTx0aXRsZT4yNTYgYnl0ZSBwYWdlc2l6ZTwvdGl0bGU+CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjMiPjx0Ym9keT4KIDxyb3c+CkBAIC04NDMsNyArODQzLDcgQEAKIDwvcm93PgogPC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAJCTwvc2VjdDI+Ci0JCTxzZWN0Mj4KKwkJPHNlY3QyIGlkPSJwYWdlc2l6ZV81MTIiPgogCQkJPHRpdGxlPjUxMiBieXRlIHBhZ2VzaXplPC90aXRsZT4KIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMyI+PHRib2R5PgogPHJvdz4KQEAgLTkwNiw3ICs5MDYsNyBAQAogPC9yb3c+CiA8L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAkJPC9zZWN0Mj4KLQkJPHNlY3QyPgorCQk8c2VjdDIgaWQ9InBhZ2VzaXplXzIwNDgiPgogCQkJPHRpdGxlPjIwNDggYnl0ZSBwYWdlc2l6ZTwvdGl0bGU+CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjMiPjx0Ym9keT4KIDxyb3c+CkBAIC0xMTI2LDkgKzExMjYsOSBAQAogICAgICA8cGFyYT4KICAgICAgVGhpcyBjaGFwdGVyIGRlc2NyaWJlcyB0aGUgY29uc3RhbnRzIHdoaWNoIG1pZ2h0IGJlIHJlbGV2YW50IGZvciBhIGRyaXZlciBkZXZlbG9wZXIuCiAgICAgIDwvcGFyYT4KLSAgICAgPHNlY3QxPiAgIAorICAgICA8c2VjdDEgaWQ9IkNoaXBfb3B0aW9uX2NvbnN0YW50cyI+CiAJPHRpdGxlPkNoaXAgb3B0aW9uIGNvbnN0YW50czwvdGl0bGU+Ci0gICAgIAk8c2VjdDI+ICAgCisgICAgIAk8c2VjdDIgaWQ9IkNvbnN0YW50c19mb3JfY2hpcF9pZF90YWJsZSI+CiAJCTx0aXRsZT5Db25zdGFudHMgZm9yIGNoaXAgaWQgdGFibGU8L3RpdGxlPgogICAgICAJCTxwYXJhPgogCQlUaGVzZSBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gbmFuZC5oLiBUaGV5IGFyZSBvcmVkIHRvZ2V0aGVyIHRvIGRlc2NyaWJlCkBAIC0xMTUzLDcgKzExNTMsNyBAQAogCQk8L3Byb2dyYW1saXN0aW5nPgogICAgICAJCTwvcGFyYT4KICAgICAgCTwvc2VjdDI+Ci0gICAgIAk8c2VjdDI+ICAgCisgICAgIAk8c2VjdDIgaWQ9IkNvbnN0YW50c19mb3JfcnVudGltZV9vcHRpb25zIj4KIAkJPHRpdGxlPkNvbnN0YW50cyBmb3IgcnVudGltZSBvcHRpb25zPC90aXRsZT4KICAgICAgCQk8cGFyYT4KIAkJVGhlc2UgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluIG5hbmQuaC4gVGhleSBhcmUgb3JlZCB0b2dldGhlciB0byBkZXNjcmliZQpAQCAtMTE3MSw3ICsxMTcxLDcgQEAKICAgICAgCTwvc2VjdDI+CiAgICAgIDwvc2VjdDE+CQogCi0gICAgIDxzZWN0MT4gICAKKyAgICAgPHNlY3QxIGlkPSJFRUNfc2VsZWN0aW9uX2NvbnN0YW50cyI+CiAJPHRpdGxlPkVDQyBzZWxlY3Rpb24gY29uc3RhbnRzPC90aXRsZT4KIAk8cGFyYT4KIAlVc2UgdGhlc2UgY29uc3RhbnRzIHRvIHNlbGVjdCB0aGUgRUNDIGFsZ29yaXRobS4KQEAgLTExOTIsNyArMTE5Miw3IEBACiAJPC9wYXJhPgogICAgICA8L3NlY3QxPgkKIAotICAgICA8c2VjdDE+ICAgCisgICAgIDxzZWN0MSBpZD0iSGFyZHdhcmVfY29udHJvbF9yZWxhdGVkX2NvbnN0YW50cyI+CiAJPHRpdGxlPkhhcmR3YXJlIGNvbnRyb2wgcmVsYXRlZCBjb25zdGFudHM8L3RpdGxlPgogCTxwYXJhPgogCVRoZXNlIGNvbnN0YW50cyBkZXNjcmliZSB0aGUgcmVxdWVzdGVkIGhhcmR3YXJlIGFjY2VzcyBmdW5jdGlvbiB3aGVuCkBAIC0xMjE4LDcgKzEyMTgsNyBAQAogCTwvcGFyYT4KICAgICAgPC9zZWN0MT4JCiAKLSAgICAgPHNlY3QxPiAgIAorICAgICA8c2VjdDEgaWQ9IkJhZF9ibG9ja190YWJsZV9jb25zdGFudHMiPgogCTx0aXRsZT5CYWQgYmxvY2sgdGFibGUgcmVsYXRlZCBjb25zdGFudHM8L3RpdGxlPgogCTxwYXJhPgogCVRoZXNlIGNvbnN0YW50cyBkZXNjcmliZSB0aGUgb3B0aW9ucyB1c2VkIGZvciBiYWQgYmxvY2sKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9wcm9jZnMtZ3VpZGUudG1wbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9wcm9jZnMtZ3VpZGUudG1wbAppbmRleCAyZGU4NGRjLi4xZmQ2YTFlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svcHJvY2ZzLWd1aWRlLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Byb2Nmcy1ndWlkZS50bXBsCkBAIC04NSw3ICs4NSw3IEBACiAKIAogCi0gIDxwcmVmYWNlPgorICA8cHJlZmFjZSBpZD0iUHJlZmFjZSI+CiAgICAgPHRpdGxlPlByZWZhY2U8L3RpdGxlPgogCiAgICAgPHBhcmE+CkBAIC0yMzAsNyArMjMwLDcgQEAKIAogCiAKLSAgICA8c2VjdDE+CisgICAgPHNlY3QxIGlkPSJDcmVhdGluZ19hX3N5bWxpbmsiPgogICAgICAgPHRpdGxlPkNyZWF0aW5nIGEgc3ltbGluazwvdGl0bGU+CiAKICAgICAgIDxmdW5jc3lub3BzaXM+CkBAIC0yNTQsNyArMjU0LDcgQEAKICAgICAgIDwvcGFyYT4KICAgICA8L3NlY3QxPgogCi0gICAgPHNlY3QxPgorICAgIDxzZWN0MSBpZD0iQ3JlYXRpbmdfYV9kaXJlY3RvcnkiPgogICAgICAgPHRpdGxlPkNyZWF0aW5nIGEgZGlyZWN0b3J5PC90aXRsZT4KICAgICAgIAogICAgICAgPGZ1bmNzeW5vcHNpcz4KQEAgLTI3NCw3ICsyNzQsNyBAQAogCiAKIAotICAgIDxzZWN0MT4KKyAgICA8c2VjdDEgaWQ9IlJlbW92aW5nX2FuX2VudHJ5Ij4KICAgICAgIDx0aXRsZT5SZW1vdmluZyBhbiBlbnRyeTwvdGl0bGU+CiAgICAgICAKICAgICAgIDxmdW5jc3lub3BzaXM+CkBAIC0zNDAsNyArMzQwLDcgQEAKIAogCiAKLSAgICA8c2VjdDE+CisgICAgPHNlY3QxIGlkPSJSZWFkaW5nX2RhdGEiPgogICAgICAgPHRpdGxlPlJlYWRpbmcgZGF0YTwvdGl0bGU+CiAKICAgICAgIDxwYXJhPgpAQCAtNDQ4LDcgKzQ0OCw3IEBACiAKIAogCi0gICAgPHNlY3QxPgorICAgIDxzZWN0MSBpZD0iV3JpdGluZ19kYXRhIj4KICAgICAgIDx0aXRsZT5Xcml0aW5nIGRhdGE8L3RpdGxlPgogCiAgICAgICA8cGFyYT4KQEAgLTU3OSw3ICs1NzksNyBAQAogCiAKIAotICAgIDxzZWN0MT4KKyAgICA8c2VjdDEgaWQ9Ik1vZHVsZXMiPgogICAgICAgPHRpdGxlPk1vZHVsZXM8L3RpdGxlPgogCiAgICAgICA8cGFyYT4KQEAgLTU5OSw3ICs1OTksNyBAQAogCiAKIAotICAgIDxzZWN0MT4KKyAgICA8c2VjdDEgaWQ9Ik1vZGVfYW5kX293bmVyc2hpcCI+CiAgICAgICA8dGl0bGU+TW9kZSBhbmQgb3duZXJzaGlwPC90aXRsZT4KIAogICAgICAgPHBhcmE+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svcmFwaWRpby50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3JhcGlkaW8udG1wbAppbmRleCBhOGI4OGM0Li5iOWUxNDNlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svcmFwaWRpby50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9yYXBpZGlvLnRtcGwKQEAgLTc3LDExICs3NywxMSBAQAogICA8Y2hhcHRlciBpZD0iYnVncyI+CiAgICAgIDx0aXRsZT5Lbm93biBCdWdzIGFuZCBMaW1pdGF0aW9uczwvdGl0bGU+CiAKLSAgICAgPHNlY3QxPgorICAgICA8c2VjdDEgaWQ9Imtub3duX2J1Z3MiPgogICAgICAJPHRpdGxlPkJ1Z3M8L3RpdGxlPgogCSAgPHBhcmE+Tm9uZS4gOyk8L3BhcmE+CiAgICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT4KKyAgICAgPHNlY3QxIGlkPSJMaW1pdGF0aW9ucyI+CiAgICAgIAk8dGl0bGU+TGltaXRhdGlvbnM8L3RpdGxlPgogCSAgPHBhcmE+CiAJICAgIDxvcmRlcmVkbGlzdD4KQEAgLTEwMCw3ICsxMDAsNyBAQAogCQlvbiBkZXZpY2VzLCByZXF1ZXN0L21hcCBtZW1vcnkgcmVnaW9uIHJlc291cmNlcywKIAkJYW5kIG1hbmFnZSBtYWlsYm94ZXMvZG9vcmJlbGxzLgogCTwvcGFyYT4KLQk8c2VjdDE+CisJPHNlY3QxIGlkPSJGdW5jdGlvbnMiPgogCQk8dGl0bGU+RnVuY3Rpb25zPC90aXRsZT4KICFJaW5jbHVkZS9saW51eC9yaW9fZHJ2LmgKICFFZHJpdmVycy9yYXBpZGlvL3Jpby1kcml2ZXIuYwpAQCAtMTE2LDIzICsxMTYsMjMgQEAKICAgICAgc3Vic3lzdGVtLgogICAgICA8L3BhcmE+CiAKLSAgICAgPHNlY3QxPjx0aXRsZT5TdHJ1Y3R1cmVzPC90aXRsZT4KKyAgICAgPHNlY3QxIGlkPSJTdHJ1Y3R1cmVzIj48dGl0bGU+U3RydWN0dXJlczwvdGl0bGU+CiAhSWluY2x1ZGUvbGludXgvcmlvLmgKICAgICAgPC9zZWN0MT4KLSAgICAgPHNlY3QxPjx0aXRsZT5FbnVtZXJhdGlvbiBhbmQgRGlzY292ZXJ5PC90aXRsZT4KKyAgICAgPHNlY3QxIGlkPSJFbnVtZXJhdGlvbl9hbmRfRGlzY292ZXJ5Ij48dGl0bGU+RW51bWVyYXRpb24gYW5kIERpc2NvdmVyeTwvdGl0bGU+CiAhSWRyaXZlcnMvcmFwaWRpby9yaW8tc2Nhbi5jCiAgICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+RHJpdmVyIGZ1bmN0aW9uYWxpdHk8L3RpdGxlPgorICAgICA8c2VjdDEgaWQ9IkRyaXZlcl9mdW5jdGlvbmFsaXR5Ij48dGl0bGU+RHJpdmVyIGZ1bmN0aW9uYWxpdHk8L3RpdGxlPgogIUlkcml2ZXJzL3JhcGlkaW8vcmlvLmMKICFJZHJpdmVycy9yYXBpZGlvL3Jpby1hY2Nlc3MuYwogICAgICA8L3NlY3QxPgotICAgICA8c2VjdDE+PHRpdGxlPkRldmljZSBtb2RlbCBzdXBwb3J0PC90aXRsZT4KKyAgICAgPHNlY3QxIGlkPSJEZXZpY2VfbW9kZWxfc3VwcG9ydCI+PHRpdGxlPkRldmljZSBtb2RlbCBzdXBwb3J0PC90aXRsZT4KICFJZHJpdmVycy9yYXBpZGlvL3Jpby1kcml2ZXIuYwogICAgICA8L3NlY3QxPgotICAgICA8c2VjdDE+PHRpdGxlPlN5c2ZzIHN1cHBvcnQ8L3RpdGxlPgorICAgICA8c2VjdDEgaWQ9IlN5c2ZzX3N1cHBvcnQiPjx0aXRsZT5TeXNmcyBzdXBwb3J0PC90aXRsZT4KICFJZHJpdmVycy9yYXBpZGlvL3Jpby1zeXNmcy5jCiAgICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+UFBDMzIgc3VwcG9ydDwvdGl0bGU+CisgICAgIDxzZWN0MSBpZD0iUFBDMzJfc3VwcG9ydCI+PHRpdGxlPlBQQzMyIHN1cHBvcnQ8L3RpdGxlPgogIUlhcmNoL3Bvd2VycGMva2VybmVsL3Jpby5jCiAhRWFyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3Jpby5jCiAhSWFyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3Jpby5jCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svc2NzaS50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Njc2kudG1wbAppbmRleCBmMjk5YWIxLi4xMGExNTBhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svc2NzaS50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9zY3NpLnRtcGwKQEAgLTEyLDcgKzEyLDcgQEAKICAgICAgICAgPHN1cm5hbWU+Qm90dG9tbGV5PC9zdXJuYW1lPgogICAgICAgICA8YWZmaWxpYXRpb24+CiAgICAgICAgICAgPGFkZHJlc3M+Ci0gICAgICAgICAgICA8ZW1haWw+SmFtZXMuQm90dG9tbGV5QHN0ZWVsZXllLmNvbTwvZW1haWw+CisgICAgICAgICAgICA8ZW1haWw+SmFtZXMuQm90dG9tbGV5QGhhbnNlbnBhcnRuZXJzaGlwLmNvbTwvZW1haWw+CiAgICAgICAgICAgPC9hZGRyZXNzPgogICAgICAgICA8L2FmZmlsaWF0aW9uPgogICAgICAgPC9hdXRob3I+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdmlkZW9ib29rLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdmlkZW9ib29rLnRtcGwKaW5kZXggYjNkOTNlZS4uODk4MTc3OSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3ZpZGVvYm9vay50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay92aWRlb2Jvb2sudG1wbApAQCAtMTcwLDcgKzE3MCw3IEBACiAgIDxwYXJhPgogICAgICAgICBUaGUgdHlwZXMgYXZhaWxhYmxlIGFyZQogICA8L3BhcmE+Ci0gICA8dGFibGUgZnJhbWU9ImFsbCI+PHRpdGxlPkRldmljZSBUeXBlczwvdGl0bGU+CisgICA8dGFibGUgZnJhbWU9ImFsbCIgaWQ9IkRldmljZV9UeXBlcyI+PHRpdGxlPkRldmljZSBUeXBlczwvdGl0bGU+CiAgICA8dGdyb3VwIGNvbHM9IjMiIGFsaWduPSJsZWZ0Ij4KICAgIDx0Ym9keT4KICAgIDxyb3c+CkBAIC0yOTEsNyArMjkxLDcgQEAKICAgICAgICAgYWxsb3dzIHRoZSBhcHBsaWNhdGlvbnMgdG8gZmluZCBvdXQgd2hhdCBzb3J0IG9mIGEgY2FyZCB0aGV5IGhhdmUgZm91bmQgYW5kCiAgICAgICAgIHRvIGZpZ3VyZSBvdXQgd2hhdCB0aGV5IHdhbnQgdG8gZG8gYWJvdXQgaXQuIFRoZSBmaWVsZHMgaW4gdGhlIHN0cnVjdHVyZSBhcmUKICAgPC9wYXJhPgotICAgPHRhYmxlIGZyYW1lPSJhbGwiPjx0aXRsZT5zdHJ1Y3QgdmlkZW9fY2FwYWJpbGl0eSBmaWVsZHM8L3RpdGxlPgorICAgPHRhYmxlIGZyYW1lPSJhbGwiIGlkPSJ2aWRlb19jYXBhYmlsaXR5X2ZpZWxkcyI+PHRpdGxlPnN0cnVjdCB2aWRlb19jYXBhYmlsaXR5IGZpZWxkczwvdGl0bGU+CiAgICA8dGdyb3VwIGNvbHM9IjIiIGFsaWduPSJsZWZ0Ij4KICAgIDx0Ym9keT4KICAgIDxyb3c+CkBAIC0zNjUsNyArMzY1LDcgQEAKICAgPHBhcmE+CiAgICAgICAgIFRoZSB2aWRlb190dW5lciBzdHJ1Y3R1cmUgaGFzIHRoZSBmb2xsb3dpbmcgZmllbGRzCiAgIDwvcGFyYT4KLSAgIDx0YWJsZSBmcmFtZT0iYWxsIj48dGl0bGU+c3RydWN0IHZpZGVvX3R1bmVyIGZpZWxkczwvdGl0bGU+CisgICA8dGFibGUgZnJhbWU9ImFsbCIgaWQ9InZpZGVvX3R1bmVyX2ZpZWxkcyI+PHRpdGxlPnN0cnVjdCB2aWRlb190dW5lciBmaWVsZHM8L3RpdGxlPgogICAgPHRncm91cCBjb2xzPSIyIiBhbGlnbj0ibGVmdCI+CiAgICA8dGJvZHk+CiAgICA8cm93PgpAQCAtMzk4LDcgKzM5OCw3IEBACiAgICAgPC90Z3JvdXA+CiAgICAgPC90YWJsZT4KIAotICAgPHRhYmxlIGZyYW1lPSJhbGwiPjx0aXRsZT5zdHJ1Y3QgdmlkZW9fdHVuZXIgZmxhZ3M8L3RpdGxlPgorICAgPHRhYmxlIGZyYW1lPSJhbGwiIGlkPSJ2aWRlb190dW5lcl9mbGFncyI+PHRpdGxlPnN0cnVjdCB2aWRlb190dW5lciBmbGFnczwvdGl0bGU+CiAgICA8dGdyb3VwIGNvbHM9IjIiIGFsaWduPSJsZWZ0Ij4KICAgIDx0Ym9keT4KICAgIDxyb3c+CkBAIC00MjEsNyArNDIxLDcgQEAKICAgICA8L3Rncm91cD4KICAgICA8L3RhYmxlPgogCi0gICA8dGFibGUgZnJhbWU9ImFsbCI+PHRpdGxlPnN0cnVjdCB2aWRlb190dW5lciBtb2RlczwvdGl0bGU+CisgICA8dGFibGUgZnJhbWU9ImFsbCIgaWQ9InZpZGVvX3R1bmVyX21vZGVzIj48dGl0bGU+c3RydWN0IHZpZGVvX3R1bmVyIG1vZGVzPC90aXRsZT4KICAgIDx0Z3JvdXAgY29scz0iMiIgYWxpZ249ImxlZnQiPgogICAgPHRib2R5PgogICAgPHJvdz4KQEAgLTU3Miw3ICs1NzIsNyBAQAogICA8cGFyYT4KICAgICAgICAgVGhlbiB3ZSBmaWxsIGluIHRoZSB2aWRlb19hdWRpbyBzdHJ1Y3R1cmUuIFRoaXMgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0CiAgIDwvcGFyYT4KLSAgIDx0YWJsZSBmcmFtZT0iYWxsIj48dGl0bGU+c3RydWN0IHZpZGVvX2F1ZGlvIGZpZWxkczwvdGl0bGU+CisgICA8dGFibGUgZnJhbWU9ImFsbCIgaWQ9InZpZGVvX2F1ZGlvX2ZpZWxkcyI+PHRpdGxlPnN0cnVjdCB2aWRlb19hdWRpbyBmaWVsZHM8L3RpdGxlPgogICAgPHRncm91cCBjb2xzPSIyIiBhbGlnbj0ibGVmdCI+CiAgICA8dGJvZHk+CiAgICA8cm93PgpAQCAtNjA3LDcgKzYwNyw3IEBACiAgICA8L3Rncm91cD4KICAgIDwvdGFibGU+CiAKLSAgIDx0YWJsZSBmcmFtZT0iYWxsIj48dGl0bGU+c3RydWN0IHZpZGVvX2F1ZGlvIGZsYWdzPC90aXRsZT4KKyAgIDx0YWJsZSBmcmFtZT0iYWxsIiBpZD0idmlkZW9fYXVkaW9fZmxhZ3MiPjx0aXRsZT5zdHJ1Y3QgdmlkZW9fYXVkaW8gZmxhZ3M8L3RpdGxlPgogICAgPHRncm91cCBjb2xzPSIyIiBhbGlnbj0ibGVmdCI+CiAgICA8dGJvZHk+CiAgICA8cm93PgpAQCAtNjI1LDcgKzYyNSw3IEBACiAgICA8L3Rncm91cD4KICAgIDwvdGFibGU+CiAKLSAgIDx0YWJsZSBmcmFtZT0iYWxsIj48dGl0bGU+c3RydWN0IHZpZGVvX2F1ZGlvIG1vZGVzPC90aXRsZT4KKyAgIDx0YWJsZSBmcmFtZT0iYWxsIiBpZD0idmlkZW9fYXVkaW9fbW9kZXMiPjx0aXRsZT5zdHJ1Y3QgdmlkZW9fYXVkaW8gbW9kZXM8L3RpdGxlPgogICAgPHRncm91cCBjb2xzPSIyIiBhbGlnbj0ibGVmdCI+CiAgICA8dGJvZHk+CiAgICA8cm93PgpAQCAtNzc1LDcgKzc3NSw3IEBACiAgIDwvcGFyYT4KICAgPC9zZWN0MT4KICAgPC9jaGFwdGVyPgotICA8Y2hhcHRlcj4KKyAgPGNoYXB0ZXIgaWQ9IlZpZGVvX0NhcHR1cmVfRGV2aWNlcyI+CiAgICAgICAgIDx0aXRsZT5WaWRlbyBDYXB0dXJlIERldmljZXM8L3RpdGxlPgogICA8c2VjdDEgaWQ9ImludHJvdmlkIj4KICAgPHRpdGxlPlZpZGVvIENhcHR1cmUgRGV2aWNlIFR5cGVzPC90aXRsZT4KQEAgLTg1NSw3ICs4NTUsNyBAQAogICAgICAgICBXZSB1c2UgdGhlIGV4dHJhIHZpZGVvIGNhcGFiaWxpdHkgZmxhZ3MgdGhhdCBkaWQgbm90IGFwcGx5IHRvIHRoZQogICAgICAgICByYWRpbyBpbnRlcmZhY2UuIFRoZSB2aWRlbyByZWxhdGVkIGZsYWdzIGFyZQogICA8L3BhcmE+Ci0gICA8dGFibGUgZnJhbWU9ImFsbCI+PHRpdGxlPkNhcHR1cmUgQ2FwYWJpbGl0aWVzPC90aXRsZT4KKyAgIDx0YWJsZSBmcmFtZT0iYWxsIiBpZD0iQ2FwdHVyZV9DYXBhYmlsaXRpZXMiPjx0aXRsZT5DYXB0dXJlIENhcGFiaWxpdGllczwvdGl0bGU+CiAgICA8dGdyb3VwIGNvbHM9IjIiIGFsaWduPSJsZWZ0Ij4KICAgIDx0Ym9keT4KICAgIDxyb3c+CkBAIC0xMTk1LDcgKzExOTUsNyBAQAogICAgICAgICBpbnB1dHMgdG8gdGhlIHZpZGVvIGNhcmQpLiBPdXIgZXhhbXBsZSBjYXJkIGhhcyBhIHNpbmdsZSBjYW1lcmEgaW5wdXQuIFRoZQogICAgICAgICBmaWVsZHMgaW4gdGhlIHN0cnVjdHVyZSBhcmUKICAgPC9wYXJhPgotICAgPHRhYmxlIGZyYW1lPSJhbGwiPjx0aXRsZT5zdHJ1Y3QgdmlkZW9fY2hhbm5lbCBmaWVsZHM8L3RpdGxlPgorICAgPHRhYmxlIGZyYW1lPSJhbGwiIGlkPSJ2aWRlb19jaGFubmVsX2ZpZWxkcyI+PHRpdGxlPnN0cnVjdCB2aWRlb19jaGFubmVsIGZpZWxkczwvdGl0bGU+CiAgICA8dGdyb3VwIGNvbHM9IjIiIGFsaWduPSJsZWZ0Ij4KICAgIDx0Ym9keT4KICAgIDxyb3c+CkBAIC0xMjE4LDcgKzEyMTgsNyBAQAogICAgIDwvdGJvZHk+CiAgICAgPC90Z3JvdXA+CiAgICAgPC90YWJsZT4KLSAgICA8dGFibGUgZnJhbWU9ImFsbCI+PHRpdGxlPnN0cnVjdCB2aWRlb19jaGFubmVsIGZsYWdzPC90aXRsZT4KKyAgICA8dGFibGUgZnJhbWU9ImFsbCIgaWQ9InZpZGVvX2NoYW5uZWxfZmxhZ3MiPjx0aXRsZT5zdHJ1Y3QgdmlkZW9fY2hhbm5lbCBmbGFnczwvdGl0bGU+CiAgICAgPHRncm91cCBjb2xzPSIyIiBhbGlnbj0ibGVmdCI+CiAgICAgPHRib2R5PgogICAgIDxyb3c+CkBAIC0xMjI5LDcgKzEyMjksNyBAQAogICAgIDwvdGJvZHk+CiAgICAgPC90Z3JvdXA+CiAgICAgPC90YWJsZT4KLSAgICA8dGFibGUgZnJhbWU9ImFsbCI+PHRpdGxlPnN0cnVjdCB2aWRlb19jaGFubmVsIHR5cGVzPC90aXRsZT4KKyAgICA8dGFibGUgZnJhbWU9ImFsbCIgaWQ9InZpZGVvX2NoYW5uZWxfdHlwZXMiPjx0aXRsZT5zdHJ1Y3QgdmlkZW9fY2hhbm5lbCB0eXBlczwvdGl0bGU+CiAgICAgPHRncm91cCBjb2xzPSIyIiBhbGlnbj0ibGVmdCI+CiAgICAgPHRib2R5PgogICAgIDxyb3c+CkBAIC0xMjQyLDcgKzEyNDIsNyBAQAogICAgIDwvdGJvZHk+CiAgICAgPC90Z3JvdXA+CiAgICAgPC90YWJsZT4KLSAgICA8dGFibGUgZnJhbWU9ImFsbCI+PHRpdGxlPnN0cnVjdCB2aWRlb19jaGFubmVsIG5vcm1zPC90aXRsZT4KKyAgICA8dGFibGUgZnJhbWU9ImFsbCIgaWQ9InZpZGVvX2NoYW5uZWxfbm9ybXMiPjx0aXRsZT5zdHJ1Y3QgdmlkZW9fY2hhbm5lbCBub3JtczwvdGl0bGU+CiAgICAgPHRncm91cCBjb2xzPSIyIiBhbGlnbj0ibGVmdCI+CiAgICAgPHRib2R5PgogICAgIDxyb3c+CkBAIC0xMzI4LDcgKzEzMjgsNyBAQAogICAgICAgICBmb3IgZXZlcnkgb3RoZXIgcGl4ZWwgaW4gdGhlIGltYWdlLiBUaGUgb3RoZXIgY29tbW9uIGZvcm1hdHMgdGhlIGludGVyZmFjZSAKICAgICAgICAgZGVmaW5lcyBhcmUKICAgPC9wYXJhPgotICAgPHRhYmxlIGZyYW1lPSJhbGwiPjx0aXRsZT5GcmFtZWJ1ZmZlciBFbmNvZGluZ3M8L3RpdGxlPgorICAgPHRhYmxlIGZyYW1lPSJhbGwiIGlkPSJGcmFtZWJ1ZmZlcl9FbmNvZGluZ3MiPjx0aXRsZT5GcmFtZWJ1ZmZlciBFbmNvZGluZ3M8L3RpdGxlPgogICAgPHRncm91cCBjb2xzPSIyIiBhbGlnbj0ibGVmdCI+CiAgICA8dGJvZHk+CiAgICA8cm93PgpAQCAtMTQ2Niw3ICsxNDY2LDcgQEAKICAgICAgICAgZGlzcGxheS4gVGhlIHZpZGVvX3dpbmRvdyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZXNjcmliZSB0aGUgd2F5IHRoZSBpbWFnZSAKICAgICAgICAgc2hvdWxkIGJlIGRpc3BsYXllZC4gCiAgICA8L3BhcmE+Ci0gICA8dGFibGUgZnJhbWU9ImFsbCI+PHRpdGxlPnN0cnVjdCB2aWRlb193aW5kb3cgZmllbGRzPC90aXRsZT4KKyAgIDx0YWJsZSBmcmFtZT0iYWxsIiBpZD0idmlkZW9fd2luZG93X2ZpZWxkcyI+PHRpdGxlPnN0cnVjdCB2aWRlb193aW5kb3cgZmllbGRzPC90aXRsZT4KICAgIDx0Z3JvdXAgY29scz0iMiIgYWxpZ249ImxlZnQiPgogICAgPHRib2R5PgogICAgPHJvdz4KQEAgLTE1MDMsNyArMTUwMyw3IEBACiAgICAgPHBhcmE+CiAgICAgICAgIEVhY2ggY2xpcCBpcyBhIHN0cnVjdCB2aWRlb19jbGlwIHdoaWNoIGhhcyB0aGUgZm9sbG93aW5nIGZpZWxkcwogICAgPC9wYXJhPgotICAgPHRhYmxlIGZyYW1lPSJhbGwiPjx0aXRsZT52aWRlb19jbGlwIGZpZWxkczwvdGl0bGU+CisgICA8dGFibGUgZnJhbWU9ImFsbCIgaWQ9InZpZGVvX2NsaXBfZmllbGRzIj48dGl0bGU+dmlkZW9fY2xpcCBmaWVsZHM8L3RpdGxlPgogICAgPHRncm91cCBjb2xzPSIyIiBhbGlnbj0ibGVmdCI+CiAgICA8dGJvZHk+CiAgICA8cm93PgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3o4NTMwYm9vay50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3o4NTMwYm9vay50bXBsCmluZGV4IGE1MDc4NzYuLjQyYzc1YmEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay96ODUzMGJvb2sudG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svejg1MzBib29rLnRtcGwKQEAgLTc3LDcgKzc3LDcgQEAKICAgPC9wYXJhPgogICA8L2NoYXB0ZXI+CiAgIAotICA8Y2hhcHRlcj4KKyAgPGNoYXB0ZXIgaWQ9IkRyaXZlcl9Nb2RlcyI+CiAgCTx0aXRsZT5Ecml2ZXIgTW9kZXM8L3RpdGxlPgogICA8cGFyYT4KIAlUaGUgWjg1MjMwIGRyaXZlciBsYXllciBjYW4gZHJpdmUgWjg1MzAsIFo4NUMzMCBhbmQgWjg1MjMwIGRldmljZXMKQEAgLTEwOCw3ICsxMDgsNyBAQAogICA8L3BhcmE+CiAgIDwvY2hhcHRlcj4KIAotICA8Y2hhcHRlcj4KKyAgPGNoYXB0ZXIgaWQ9IlVzaW5nX3RoZV9aODUyMzBfZHJpdmVyIj4KICAJPHRpdGxlPlVzaW5nIHRoZSBaODUyMzAgZHJpdmVyPC90aXRsZT4KICAgPHBhcmE+CiAJVGhlIFo4NTIzMCBkcml2ZXIgcHJvdmlkZXMgdGhlIGJhY2sgZW5kIGludGVyZmFjZSB0byB5b3VyIGJvYXJkLiBUbwpAQCAtMTc0LDcgKzE3NCw3IEBACiAgIDwvcGFyYT4KICAgPC9jaGFwdGVyPgogCi0gIDxjaGFwdGVyPgorICA8Y2hhcHRlciBpZD0iQXR0YWNoaW5nX05ldHdvcmtfSW50ZXJmYWNlcyI+CiAgCTx0aXRsZT5BdHRhY2hpbmcgTmV0d29yayBJbnRlcmZhY2VzPC90aXRsZT4KICAgPHBhcmE+CiAJSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBuZXR3b3JrIGludGVyZmFjZSBmYWNpbGl0aWVzIG9mIHRoZSBkcml2ZXIsCkBAIC0yMTYsNyArMjE2LDcgQEAKICAgPC9wYXJhPgogICA8L2NoYXB0ZXI+CiAKLSAgPGNoYXB0ZXI+CisgIDxjaGFwdGVyIGlkPSJDb25maWd1cmluZ19BbmRfQWN0aXZhdGluZ19UaGVfUG9ydCI+CiAgCTx0aXRsZT5Db25maWd1cmluZyBBbmQgQWN0aXZhdGluZyBUaGUgUG9ydDwvdGl0bGU+CiAgIDxwYXJhPgogCVRoZSBaODUyMzAgZHJpdmVyIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgYW5kIHRhYmxlcyB0byBsb2FkIHRoZQpAQCAtMzAwLDcgKzMwMCw3IEBACiAgIDwvcGFyYT4KICAgPC9jaGFwdGVyPgogCi0gIDxjaGFwdGVyPgorICA8Y2hhcHRlciBpZD0iTmV0d29ya19MYXllcl9GdW5jdGlvbnMiPgogIAk8dGl0bGU+TmV0d29yayBMYXllciBGdW5jdGlvbnM8L3RpdGxlPgogICA8cGFyYT4KIAlUaGUgWjg1MzAgbGF5ZXIgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIHF1ZXVlIHBhY2tldHMgZm9yCkBAIC0zMjcsNyArMzI3LDcgQEAKICAgPC9wYXJhPgogICA8L2NoYXB0ZXI+CiAKLSAgPGNoYXB0ZXI+CisgIDxjaGFwdGVyIGlkPSJQb3J0aW5nX1RoZV9aODUzMF9Ecml2ZXIiPgogICAgICA8dGl0bGU+UG9ydGluZyBUaGUgWjg1MzAgRHJpdmVyPC90aXRsZT4KICAgPHBhcmE+CiAJVGhlIFo4NTMwIGRyaXZlciBpcyB3cml0dGVuIHRvIGJlIHBvcnRhYmxlLiBJbiBETUEgbW9kZSBpdCBtYWtlcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hY2NvdW50aW5nL2dldGRlbGF5cy5jIGIvRG9jdW1lbnRhdGlvbi9hY2NvdW50aW5nL2dldGRlbGF5cy5jCmluZGV4IGQ2Y2IxYTguLjQwMTIxYjUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYWNjb3VudGluZy9nZXRkZWxheXMuYworKysgYi9Eb2N1bWVudGF0aW9uL2FjY291bnRpbmcvZ2V0ZGVsYXlzLmMKQEAgLTE2OCw3ICsxNjgsNyBAQAogCQljaGFyIGJ1ZlsyNTZdOwogCX0gYW5zOwogCi0JaW50IGlkLCByYzsKKwlpbnQgaWQgPSAwLCByYzsKIAlzdHJ1Y3QgbmxhdHRyICpuYTsKIAlpbnQgcmVwX2xlbjsKIApAQCAtMjA5LDcgKzIwOSw3IEBACiB2b2lkIHRhc2tfY29udGV4dF9zd2l0Y2hfY291bnRzKHN0cnVjdCB0YXNrc3RhdHMgKnQpCiB7CiAJcHJpbnRmKCJcblxuVGFzayAgICUxNXMlMTVzXG4iCi0JICAgICAgICIgICAgICAgJTE1bHUlMTVsdVxuIiwKKwkgICAgICAgIiAgICAgICAlMTVsbHUlMTVsbHVcbiIsCiAJICAgICAgICJ2b2x1bnRhcnkiLCAibm9udm9sdW50YXJ5IiwKIAkgICAgICAgdC0+bnZjc3csIHQtPm5pdmNzdyk7CiB9CkBAIC0zOTksNyArMzk5LDcgQEAKIAkJCWdvdG8gZG9uZTsKIAkJfQogCi0JCVBSSU5URigibmxtc2doZHIgc2l6ZT0lZCwgbmxtc2dfbGVuPSVkLCByZXBfbGVuPSVkXG4iLAorCQlQUklOVEYoIm5sbXNnaGRyIHNpemU9JXp1LCBubG1zZ19sZW49JWQsIHJlcF9sZW49JWRcbiIsCiAJCSAgICAgICBzaXplb2Yoc3RydWN0IG5sbXNnaGRyKSwgbXNnLm4ubmxtc2dfbGVuLCByZXBfbGVuKTsKIAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FjcGkvZHNkdC1vdmVycmlkZS50eHQgYi9Eb2N1bWVudGF0aW9uL2FjcGkvZHNkdC1vdmVycmlkZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAwOGYyNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vYWNwaS9kc2R0LW92ZXJyaWRlLnR4dApAQCAtMCwwICsxLDE1IEBACitMaW51eCBzdXBwb3J0cyB0d28gbWV0aG9kcyBvZiBvdmVycmlkaW5nIHRoZSBCSU9TIERTRFQ6CisKK0NPTkZJR19BQ1BJX0NVU1RPTV9EU0RUIGJ1aWxkcyB0aGUgaW1hZ2UgaW50byB0aGUga2VybmVsLgorCitDT05GSUdfQUNQSV9DVVNUT01fRFNEVF9JTklUUkQgYWRkcyB0aGUgaW1hZ2UgdG8gdGhlIGluaXRyZC4KKworV2hlbiB0byB1c2UgdGhlc2UgbWV0aG9kcyBpcyBkZXNjcmliZWQgaW4gZGV0YWlsIG9uIHRoZQorTGludXgvQUNQSSBob21lIHBhZ2U6CitodHRwOi8vd3d3Lmxlc3N3YXR0cy5vcmcvcHJvamVjdHMvYWNwaS9vdmVycmlkaW5nRFNEVC5waHAKKworTm90ZSB0aGF0IGlmIGJvdGggb3B0aW9ucyBhcmUgdXNlZCwgdGhlIERTRFQgc3VwcGxpZWQKK2J5IHRoZSBJTklUUkQgbWV0aG9kIHRha2VzIHByZWNlZGVuY2UuCisKK0RvY3VtZW50YXRpb24vaW5pdHJhbWZzLWFkZC1kc2R0LnNoIGlzIHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZQorZm9yIHVzZSB3aXRoIHRoZSBDT05GSUdfQUNQSV9DVVNUT01fRFNEVF9JTklUUkQgbWV0aG9kLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hY3BpL2luaXRyYW1mcy1hZGQtZHNkdC5zaCBiL0RvY3VtZW50YXRpb24vYWNwaS9pbml0cmFtZnMtYWRkLWRzZHQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTdlZjZlOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vYWNwaS9pbml0cmFtZnMtYWRkLWRzZHQuc2gKQEAgLTAsMCArMSw0MyBAQAorIyEvYmluL2Jhc2gKKyMgQWRkcyBhIERTRFQgZmlsZSB0byB0aGUgaW5pdHJkIChpZiBpdCdzIGFuIGluaXRyYW1mcykKKyMgZmlyc3QgYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgYXJjaGl2ZQorIyBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gYWRkCisjIFRoZSBmaWxlIHdpbGwgYmUgY29waWVkIGFzIC9EU0RULmFtbAorCisjIDIwMDYwMTI2OiBmaXggIlByZW1hdHVyZSBlbmQgb2YgZmlsZSIgd2l0aCBzb21lIG9sZCBjcGlvIChSb2xhbmQgUm9iaWMpCisjIDIwMDYwMjA1OiB0aGlzIHRpbWUgaXQgc2hvdWxkIHJlYWxseSB3b3JrCisKKyMgY2hlY2sgdGhlIGFyZ3VtZW50cworaWYgWyAkIyAtbmUgMiBdOyB0aGVuCisJcHJvZ3JhbV9uYW1lPSQoYmFzZW5hbWUgJDApCisJZWNobyAiXAorJHByb2dyYW1fbmFtZTogdG9vIGZldyBhcmd1bWVudHMKK1VzYWdlOiAkcHJvZ3JhbV9uYW1lIGluaXRyZC1uYW1lLmltZyBEU0RULXRvLWFkZC5hbWwKK0FkZHMgYSBEU0RUIGZpbGUgdG8gYW4gaW5pdHJkIChpbiBpbml0cmFtZnMgZm9ybWF0KQorCisgIGluaXRyZC1uYW1lLmltZzogZmlsZW5hbWUgb2YgdGhlIGluaXRyZCBpbiBpbml0cmFtZnMgZm9ybWF0CisgIERTRFQtdG8tYWRkLmFtbDogZmlsZW5hbWUgb2YgdGhlIERTRFQgZmlsZSB0byBhZGQKKyAgIiAxPiYyCisgICAgZXhpdCAxCitmaQorCisjIHdlIHNob3VsZCBjaGVjayBpdCdzIGFuIGluaXRyYW1mcworCit0ZW1wY3Bpbz0kKG1rdGVtcCAtZCkKKyMgY2xlYW51cCBvbiBleGl0LCBoYW5ndXAsIGludGVycnVwdCwgcXVpdCwgdGVybWluYXRpb24KK3RyYXAgJ3JtIC1yZiAkdGVtcGNwaW8nIDAgMSAyIDMgMTUKKworIyBleHRyYWN0IHRoZSBhcmNoaXZlCitndW56aXAgLWMgIiQxIiA+ICIkdGVtcGNwaW8iL2luaXRyYW1mcy5jcGlvIHx8IGV4aXQgMQorCisjIGNvcHkgdGhlIERTRFQgZmlsZSBhdCB0aGUgcm9vdCBvZiB0aGUgZGlyZWN0b3J5IHNvIHRoYXQgd2UgY2FuIGNhbGwgaXQgIi9EU0RULmFtbCIKK2NwIC1mICIkMiIgIiR0ZW1wY3BpbyIvRFNEVC5hbWwKKworIyBhZGQgdGhlIGZpbGUKK2NkICIkdGVtcGNwaW8iCisoZWNobyBEU0RULmFtbCB8IGNwaW8gLS1xdWlldCAtSCBuZXdjIC1vIC1BIC1PICIkdGVtcGNwaW8iL2luaXRyYW1mcy5jcGlvKSB8fCBleGl0IDEKK2NkICIkT0xEUFdEIgorCisjIHJlLWNvbXByZXNzIHRoZSBhcmNoaXZlCitnemlwIC1jICIkdGVtcGNwaW8iL2luaXRyYW1mcy5jcGlvID4gIiQxIgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FjcGkvbWV0aG9kLXRyYWNpbmcudHh0IGIvRG9jdW1lbnRhdGlvbi9hY3BpL21ldGhvZC10cmFjaW5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmVmYjFlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9hY3BpL21ldGhvZC10cmFjaW5nLnR4dApAQCAtMCwwICsxLDI2IEBACisvc3lzL21vZHVsZS9hY3BpL3BhcmFtZXRlcnMvOgorCit0cmFjZV9tZXRob2RfbmFtZQorCVRoZSBBTUwgbWV0aG9kIG5hbWUgdGhhdCB0aGUgdXNlciB3YW50cyB0byB0cmFjZQorCit0cmFjZV9kZWJ1Z19sYXllcgorCVRoZSB0ZW1wb3JhcnkgZGVidWdfbGF5ZXIgdXNlZCB3aGVuIHRyYWNpbmcgdGhlIG1ldGhvZC4KKwlVc2luZyAweGZmZmZmZmZmIGJ5IGRlZmF1bHQgaWYgaXQgaXMgMC4KKwordHJhY2VfZGVidWdfbGV2ZWwKKwlUaGUgdGVtcG9yYXJ5IGRlYnVnX2xldmVsIHVzZWQgd2hlbiB0cmFjaW5nIHRoZSBtZXRob2QuCisJVXNpbmcgMHgwMGZmZmZmZiBieSBkZWZhdWx0IGlmIGl0IGlzIDAuCisKK3RyYWNlX3N0YXRlCisJVGhlIHN0YXR1cyBvZiB0aGUgdHJhY2luZyBmZWF0dXJlLgorCisJImVuYWJsZWQiIG1lYW5zIHRoaXMgZmVhdHVyZSBpcyBlbmFibGVkCisJYW5kIHRoZSBBTUwgbWV0aG9kIGlzIHRyYWNlZCBldmVyeSB0aW1lIGl0J3MgZXhlY3V0ZWQuCisKKwkiMSIgbWVhbnMgdGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQgYW5kIHRoZSBBTUwgbWV0aG9kCisJd2lsbCBvbmx5IGJlIHRyYWNlZCBkdXJpbmcgdGhlIG5leHQgZXhlY3V0aW9uLgorCisJImRpc2FibGVkIiBtZWFucyB0aGlzIGZlYXR1cmUgaXMgZGlzYWJsZWQuCisJVXNlcnMgY2FuIGVuYWJsZS9kaXNhYmxlIHRoaXMgZGVidWcgdHJhY2luZyBmZWF0dXJlIGJ5CisJImVjaG8gc3RyaW5nID4gL3N5cy9tb2R1bGUvYWNwaS9wYXJhbWV0ZXJzL3RyYWNlX3N0YXRlIi4KKwkic3RyaW5nIiBzaG91bGQgYmUgb25lIG9mICJlbmFibGUiLCAiZGlzYWJsZSIgYW5kICIxIi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYW9lL21rZGV2cy5zaCBiL0RvY3VtZW50YXRpb24vYW9lL21rZGV2cy5zaAppbmRleCA5NzM3NGFhLi40NGMwYWI3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FvZS9ta2RldnMuc2gKKysrIGIvRG9jdW1lbnRhdGlvbi9hb2UvbWtkZXZzLnNoCkBAIC0yOSw2ICsyOSw4IEBACiBta25vZCAtbSAwMjAwICRkaXIvaW50ZXJmYWNlcyBjICRNQUpPUiA0CiBybSAtZiAkZGlyL3JldmFsaWRhdGUKIG1rbm9kIC1tIDAyMDAgJGRpci9yZXZhbGlkYXRlIGMgJE1BSk9SIDUKK3JtIC1mICRkaXIvZmx1c2gKK21rbm9kIC1tIDAyMDAgJGRpci9mbHVzaCBjICRNQUpPUiA2CiAKIGV4cG9ydCBuX3BhcnRpdGlvbnMKIG1rc2hlbGY9YGVjaG8gJDAgfCBzZWQgJ3MhbWtkZXZzIW1rc2hlbGYhJ2AKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYW9lL3VkZXYtaW5zdGFsbC5zaCBiL0RvY3VtZW50YXRpb24vYW9lL3VkZXYtaW5zdGFsbC5zaAppbmRleCA2NDQ5OTExLi4xNWU4NmY1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FvZS91ZGV2LWluc3RhbGwuc2gKKysrIGIvRG9jdW1lbnRhdGlvbi9hb2UvdWRldi1pbnN0YWxsLnNoCkBAIC0yMyw3ICsyMywxMCBAQAogIyAvZXRjL3VkZXYvcnVsZXMuZAogIwogcnVsZXNfZD0iYHNlZCAtbiAnL151ZGV2X3J1bGVzPS97IHMhdWRldl9ydWxlcz0hITsgcyFcIiEhZzsgcDsgfScgJGNvbmZgIgotaWYgdGVzdCAteiAiJHJ1bGVzX2QiIHx8IHRlc3QgISAtZCAiJHJ1bGVzX2QiOyB0aGVuCitpZiB0ZXN0IC16ICIkcnVsZXNfZCIgOyB0aGVuCisJcnVsZXNfZD0vZXRjL3VkZXYvcnVsZXMuZAorZmkKK2lmIHRlc3QgISAtZCAiJHJ1bGVzX2QiOyB0aGVuCiAJZWNobyAiJG1lIEVycm9yOiBjYW5ub3QgZmluZCB1ZGV2IHJ1bGVzIGRpcmVjdG9yeSIgMT4mMgogCWV4aXQgMQogZmkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYW9lL3VkZXYudHh0IGIvRG9jdW1lbnRhdGlvbi9hb2UvdWRldi50eHQKaW5kZXggYTdlZDFkYy4uODY4NmU3OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hb2UvdWRldi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9hb2UvdWRldi50eHQKQEAgLTEsNiArMSw3IEBACiAjIFRoZXNlIHJ1bGVzIHRlbGwgdWRldiB3aGF0IGRldmljZSBub2RlcyB0byBjcmVhdGUgZm9yIGFvZSBzdXBwb3J0LgotIyBUaGV5IG1heSBiZSBpbnN0YWxsZWQgYWxvbmcgdGhlIGZvbGxvd2luZyBsaW5lcyAoYWRqdXN0ZWQgdG8gd2hhdAotIyB5b3Ugc2VlIG9uIHlvdXIgc3lzdGVtKS4KKyMgVGhleSBtYXkgYmUgaW5zdGFsbGVkIGFsb25nIHRoZSBmb2xsb3dpbmcgbGluZXMuICBDaGVjayB0aGUgc2VjdGlvbgorIyA4IHVkZXYgbWFucGFnZSB0byBzZWUgd2hldGhlciB5b3VyIHVkZXYgc3VwcG9ydHMgU1VCU1lTVEVNLCBhbmQKKyMgd2hldGhlciBpdCB1c2VzIG9uZSBvciB0d28gZXF1YWwgc2lnbnMgZm9yIFNVQlNZU1RFTSBhbmQgS0VSTkVMLgogIyAKICMgICBlY2FzaGluQG1ha2tpIH4kIHN1CiAjICAgUGFzc3dvcmQ6CkBAIC0xNSwxMCArMTYsMTEgQEAKICMgIAogCiAjIGFvZSBjaGFyIGRldmljZXMKLVNVQlNZU1RFTT0iYW9lIiwgS0VSTkVMPSJkaXNjb3ZlciIsCU5BTUU9ImV0aGVyZC8layIsIEdST1VQPSJkaXNrIiwgTU9ERT0iMDIyMCIKLVNVQlNZU1RFTT0iYW9lIiwgS0VSTkVMPSJlcnIiLAkJTkFNRT0iZXRoZXJkLyVrIiwgR1JPVVA9ImRpc2siLCBNT0RFPSIwNDQwIgotU1VCU1lTVEVNPSJhb2UiLCBLRVJORUw9ImludGVyZmFjZXMiLAlOQU1FPSJldGhlcmQvJWsiLCBHUk9VUD0iZGlzayIsIE1PREU9IjAyMjAiCi1TVUJTWVNURU09ImFvZSIsIEtFUk5FTD0icmV2YWxpZGF0ZSIsCU5BTUU9ImV0aGVyZC8layIsIEdST1VQPSJkaXNrIiwgTU9ERT0iMDIyMCIKK1NVQlNZU1RFTT09ImFvZSIsIEtFUk5FTD09ImRpc2NvdmVyIiwJTkFNRT0iZXRoZXJkLyVrIiwgR1JPVVA9ImRpc2siLCBNT0RFPSIwMjIwIgorU1VCU1lTVEVNPT0iYW9lIiwgS0VSTkVMPT0iZXJyIiwJTkFNRT0iZXRoZXJkLyVrIiwgR1JPVVA9ImRpc2siLCBNT0RFPSIwNDQwIgorU1VCU1lTVEVNPT0iYW9lIiwgS0VSTkVMPT0iaW50ZXJmYWNlcyIsCU5BTUU9ImV0aGVyZC8layIsIEdST1VQPSJkaXNrIiwgTU9ERT0iMDIyMCIKK1NVQlNZU1RFTT09ImFvZSIsIEtFUk5FTD09InJldmFsaWRhdGUiLAlOQU1FPSJldGhlcmQvJWsiLCBHUk9VUD0iZGlzayIsIE1PREU9IjAyMjAiCitTVUJTWVNURU09PSJhb2UiLCBLRVJORUw9PSJmbHVzaCIsCU5BTUU9ImV0aGVyZC8layIsIEdST1VQPSJkaXNrIiwgTU9ERT0iMDIyMCIKIAogIyBhb2UgYmxvY2sgZGV2aWNlcyAgICAgCi1LRVJORUw9ImV0aGVyZCoiLCAgICAgICBOQU1FPSIlayIsIEdST1VQPSJkaXNrIgorS0VSTkVMPT0iZXRoZXJkKiIsICAgICAgIE5BTUU9IiVrIiwgR1JPVVA9ImRpc2siCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMudHh0IGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzLnR4dAppbmRleCA5OGEyNmY4Li40MmQ3YzRjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy50eHQKQEAgLTQ1Niw3ICs0NTYsNyBAQAogYmUgc3VjY2Vzc2Z1bCBuby1vcHMuCiAKIHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjcmVhdGUoc3RydWN0IGNncm91cCAqY29udCkKLUxMPWNncm91cF9tdXRleAorKGNncm91cF9tdXRleCBoZWxkIGJ5IGNhbGxlcikKIAogQ2FsbGVkIHRvIGNyZWF0ZSBhIHN1YnN5c3RlbSBzdGF0ZSBvYmplY3QgZm9yIGEgY2dyb3VwLiBUaGUKIHN1YnN5c3RlbSBzaG91bGQgYWxsb2NhdGUgaXRzIHN1YnN5c3RlbSBzdGF0ZSBvYmplY3QgZm9yIHRoZSBwYXNzZWQKQEAgLTQ3MSwxNCArNDcxLDE5IEBACiBpbml0aWFsaXphdGlvbiBjb2RlLgogCiB2b2lkIGRlc3Ryb3koc3RydWN0IGNncm91cCAqY29udCkKLUxMPWNncm91cF9tdXRleAorKGNncm91cF9tdXRleCBoZWxkIGJ5IGNhbGxlcikKIAotVGhlIGNncm91cCBzeXN0ZW0gaXMgYWJvdXQgdG8gZGVzdHJveSB0aGUgcGFzc2VkIGNncm91cDsgdGhlCi1zdWJzeXN0ZW0gc2hvdWxkIGRvIGFueSBuZWNlc3NhcnkgY2xlYW51cAorVGhlIGNncm91cCBzeXN0ZW0gaXMgYWJvdXQgdG8gZGVzdHJveSB0aGUgcGFzc2VkIGNncm91cDsgdGhlIHN1YnN5c3RlbQorc2hvdWxkIGRvIGFueSBuZWNlc3NhcnkgY2xlYW51cCBhbmQgZnJlZSBpdHMgc3Vic3lzdGVtIHN0YXRlCitvYmplY3QuIEJ5IHRoZSB0aW1lIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIGNncm91cCBoYXMgYWxyZWFkeSBiZWVuCit1bmxpbmtlZCBmcm9tIHRoZSBmaWxlIHN5c3RlbSBhbmQgZnJvbSB0aGUgY2hpbGQgbGlzdCBvZiBpdHMgcGFyZW50OworY2dyb3VwLT5wYXJlbnQgaXMgc3RpbGwgdmFsaWQuIChOb3RlIC0gY2FuIGFsc28gYmUgY2FsbGVkIGZvciBhCituZXdseS1jcmVhdGVkIGNncm91cCBpZiBhbiBlcnJvciBvY2N1cnMgYWZ0ZXIgdGhpcyBzdWJzeXN0ZW0ncworY3JlYXRlKCkgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCBmb3IgdGhlIG5ldyBjZ3JvdXApLgogCiBpbnQgY2FuX2F0dGFjaChzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNvbnQsCiAJICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKLUxMPWNncm91cF9tdXRleAorKGNncm91cF9tdXRleCBoZWxkIGJ5IGNhbGxlcikKIAogQ2FsbGVkIHByaW9yIHRvIG1vdmluZyBhIHRhc2sgaW50byBhIGNncm91cDsgaWYgdGhlIHN1YnN5c3RlbQogcmV0dXJucyBhbiBlcnJvciwgdGhpcyB3aWxsIGFib3J0IHRoZSBhdHRhY2ggb3BlcmF0aW9uLiAgSWYgYSBOVUxMCkBAIC00ODksMjUgKzQ5NCwyMCBAQAogCiB2b2lkIGF0dGFjaChzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNvbnQsCiAJICAgIHN0cnVjdCBjZ3JvdXAgKm9sZF9jb250LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCi1MTD1jZ3JvdXBfbXV0ZXgKLQogCiBDYWxsZWQgYWZ0ZXIgdGhlIHRhc2sgaGFzIGJlZW4gYXR0YWNoZWQgdG8gdGhlIGNncm91cCwgdG8gYWxsb3cgYW55CiBwb3N0LWF0dGFjaG1lbnQgYWN0aXZpdHkgdGhhdCByZXF1aXJlcyBtZW1vcnkgYWxsb2NhdGlvbnMgb3IgYmxvY2tpbmcuCiAKIHZvaWQgZm9yayhzdHJ1Y3QgY2dyb3VwX3N1YnN5ICpzcywgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQotTEw9Y2FsbGJhY2tfbXV0ZXgsIG1heWJlIHJlYWRfbG9jayh0YXNrbGlzdF9sb2NrKQogCiBDYWxsZWQgd2hlbiBhIHRhc2sgaXMgZm9ya2VkIGludG8gYSBjZ3JvdXAuIEFsc28gY2FsbGVkIGR1cmluZwogcmVnaXN0cmF0aW9uIGZvciBhbGwgZXhpc3RpbmcgdGFza3MuCiAKIHZvaWQgZXhpdChzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKLUxMPWNhbGxiYWNrX211dGV4CiAKIENhbGxlZCBkdXJpbmcgdGFzayBleGl0CiAKIGludCBwb3B1bGF0ZShzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNvbnQpCi1MTD1ub25lCiAKIENhbGxlZCBhZnRlciBjcmVhdGlvbiBvZiBhIGNncm91cCB0byBhbGxvdyBhIHN1YnN5c3RlbSB0byBwb3B1bGF0ZQogdGhlIGNncm91cCBkaXJlY3Rvcnkgd2l0aCBmaWxlIGVudHJpZXMuICBUaGUgc3Vic3lzdGVtIHNob3VsZCBtYWtlCkBAIC01MjQsNyArNTI0LDcgQEAKIHVwLgogCiB2b2lkIGJpbmQoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLCBzdHJ1Y3QgY2dyb3VwICpyb290KQotTEw9Y2FsbGJhY2tfbXV0ZXgKKyhjZ3JvdXBfbXV0ZXggaGVsZCBieSBjYWxsZXIpCiAKIENhbGxlZCB3aGVuIGEgY2dyb3VwIHN1YnN5c3RlbSBpcyByZWJvdW5kIHRvIGEgZGlmZmVyZW50IGhpZXJhcmNoeQogYW5kIHJvb3QgY2dyb3VwLiBDdXJyZW50bHkgdGhpcyB3aWxsIG9ubHkgaW52b2x2ZSBtb3ZlbWVudCBiZXR3ZWVuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NvbnRyb2xsZXJzL21lbW9yeS50eHQgYi9Eb2N1bWVudGF0aW9uL2NvbnRyb2xsZXJzL21lbW9yeS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViYmVhOQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vY29udHJvbGxlcnMvbWVtb3J5LnR4dApAQCAtMCwwICsxLDI3OSBAQAorTWVtb3J5IENvbnRyb2xsZXIKKworU2FsaWVudCBmZWF0dXJlcworCithLiBFbmFibGUgY29udHJvbCBvZiBib3RoIFJTUyAobWFwcGVkKSBhbmQgUGFnZSBDYWNoZSAodW5tYXBwZWQpIHBhZ2VzCitiLiBUaGUgaW5mcmFzdHJ1Y3R1cmUgYWxsb3dzIGVhc3kgYWRkaXRpb24gb2Ygb3RoZXIgdHlwZXMgb2YgbWVtb3J5IHRvIGNvbnRyb2wKK2MuIFByb3ZpZGVzICp6ZXJvIG92ZXJoZWFkKiBmb3Igbm9uIG1lbW9yeSBjb250cm9sbGVyIHVzZXJzCitkLiBQcm92aWRlcyBhIGRvdWJsZSBMUlU6IGdsb2JhbCBtZW1vcnkgcHJlc3N1cmUgY2F1c2VzIHJlY2xhaW0gZnJvbSB0aGUKKyAgIGdsb2JhbCBMUlU7IGEgY2dyb3VwIG9uIGhpdHRpbmcgYSBsaW1pdCwgcmVjbGFpbXMgZnJvbSB0aGUgcGVyCisgICBjZ3JvdXAgTFJVCisKK05PVEU6IFN3YXAgQ2FjaGUgKHVubWFwcGVkKSBpcyBub3QgYWNjb3VudGVkIG5vdy4KKworQmVuZWZpdHMgYW5kIFB1cnBvc2Ugb2YgdGhlIG1lbW9yeSBjb250cm9sbGVyCisKK1RoZSBtZW1vcnkgY29udHJvbGxlciBpc29sYXRlcyB0aGUgbWVtb3J5IGJlaGF2aW91ciBvZiBhIGdyb3VwIG9mIHRhc2tzCitmcm9tIHRoZSByZXN0IG9mIHRoZSBzeXN0ZW0uIFRoZSBhcnRpY2xlIG9uIExXTiBbMTJdIG1lbnRpb25zIHNvbWUgcHJvYmFibGUKK3VzZXMgb2YgdGhlIG1lbW9yeSBjb250cm9sbGVyLiBUaGUgbWVtb3J5IGNvbnRyb2xsZXIgY2FuIGJlIHVzZWQgdG8KKworYS4gSXNvbGF0ZSBhbiBhcHBsaWNhdGlvbiBvciBhIGdyb3VwIG9mIGFwcGxpY2F0aW9ucworICAgTWVtb3J5IGh1bmdyeSBhcHBsaWNhdGlvbnMgY2FuIGJlIGlzb2xhdGVkIGFuZCBsaW1pdGVkIHRvIGEgc21hbGxlcgorICAgYW1vdW50IG9mIG1lbW9yeS4KK2IuIENyZWF0ZSBhIGNncm91cCB3aXRoIGxpbWl0ZWQgYW1vdW50IG9mIG1lbW9yeSwgdGhpcyBjYW4gYmUgdXNlZAorICAgYXMgYSBnb29kIGFsdGVybmF0aXZlIHRvIGJvb3Rpbmcgd2l0aCBtZW09WFhYWC4KK2MuIFZpcnR1YWxpemF0aW9uIHNvbHV0aW9ucyBjYW4gY29udHJvbCB0aGUgYW1vdW50IG9mIG1lbW9yeSB0aGV5IHdhbnQKKyAgIHRvIGFzc2lnbiB0byBhIHZpcnR1YWwgbWFjaGluZSBpbnN0YW5jZS4KK2QuIEEgQ0QvRFZEIGJ1cm5lciBjb3VsZCBjb250cm9sIHRoZSBhbW91bnQgb2YgbWVtb3J5IHVzZWQgYnkgdGhlCisgICByZXN0IG9mIHRoZSBzeXN0ZW0gdG8gZW5zdXJlIHRoYXQgYnVybmluZyBkb2VzIG5vdCBmYWlsIGR1ZSB0byBsYWNrCisgICBvZiBhdmFpbGFibGUgbWVtb3J5LgorZS4gVGhlcmUgYXJlIHNldmVyYWwgb3RoZXIgdXNlIGNhc2VzLCBmaW5kIG9uZSBvciB1c2UgdGhlIGNvbnRyb2xsZXIganVzdAorICAgZm9yIGZ1biAodG8gbGVhcm4gYW5kIGhhY2sgb24gdGhlIFZNIHN1YnN5c3RlbSkuCisKKzEuIEhpc3RvcnkKKworVGhlIG1lbW9yeSBjb250cm9sbGVyIGhhcyBhIGxvbmcgaGlzdG9yeS4gQSByZXF1ZXN0IGZvciBjb21tZW50cyBmb3IgdGhlIG1lbW9yeQorY29udHJvbGxlciB3YXMgcG9zdGVkIGJ5IEJhbGJpciBTaW5naCBbMV0uIEF0IHRoZSB0aW1lIHRoZSBSRkMgd2FzIHBvc3RlZAordGhlcmUgd2VyZSBzZXZlcmFsIGltcGxlbWVudGF0aW9ucyBmb3IgbWVtb3J5IGNvbnRyb2wuIFRoZSBnb2FsIG9mIHRoZQorUkZDIHdhcyB0byBidWlsZCBjb25zZW5zdXMgYW5kIGFncmVlbWVudCBmb3IgdGhlIG1pbmltYWwgZmVhdHVyZXMgcmVxdWlyZWQKK2ZvciBtZW1vcnkgY29udHJvbC4gVGhlIGZpcnN0IFJTUyBjb250cm9sbGVyIHdhcyBwb3N0ZWQgYnkgQmFsYmlyIFNpbmdoWzJdCitpbiBGZWIgMjAwNy4gUGF2ZWwgRW1lbGlhbm92IFszXVs0XVs1XSBoYXMgc2luY2UgcG9zdGVkIHRocmVlIHZlcnNpb25zIG9mIHRoZQorUlNTIGNvbnRyb2xsZXIuIEF0IE9MUywgYXQgdGhlIHJlc291cmNlIG1hbmFnZW1lbnQgQm9GLCBldmVyeW9uZSBzdWdnZXN0ZWQKK3RoYXQgd2UgaGFuZGxlIGJvdGggcGFnZSBjYWNoZSBhbmQgUlNTIHRvZ2V0aGVyLiBBbm90aGVyIHJlcXVlc3Qgd2FzIHJhaXNlZAordG8gYWxsb3cgdXNlciBzcGFjZSBoYW5kbGluZyBvZiBPT00uIFRoZSBjdXJyZW50IG1lbW9yeSBjb250cm9sbGVyIGlzCithdCB2ZXJzaW9uIDY7IGl0IGNvbWJpbmVzIGJvdGggbWFwcGVkIChSU1MpIGFuZCB1bm1hcHBlZCBQYWdlCitDYWNoZSBDb250cm9sIFsxMV0uCisKKzIuIE1lbW9yeSBDb250cm9sCisKK01lbW9yeSBpcyBhIHVuaXF1ZSByZXNvdXJjZSBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBpcyBwcmVzZW50IGluIGEgbGltaXRlZAorYW1vdW50LiBJZiBhIHRhc2sgcmVxdWlyZXMgYSBsb3Qgb2YgQ1BVIHByb2Nlc3NpbmcsIHRoZSB0YXNrIGNhbiBzcHJlYWQKK2l0cyBwcm9jZXNzaW5nIG92ZXIgYSBwZXJpb2Qgb2YgaG91cnMsIGRheXMsIG1vbnRocyBvciB5ZWFycywgYnV0IHdpdGgKK21lbW9yeSwgdGhlIHNhbWUgcGh5c2ljYWwgbWVtb3J5IG5lZWRzIHRvIGJlIHJldXNlZCB0byBhY2NvbXBsaXNoIHRoZSB0YXNrLgorCitUaGUgbWVtb3J5IGNvbnRyb2xsZXIgaW1wbGVtZW50YXRpb24gaGFzIGJlZW4gZGl2aWRlZCBpbnRvIHBoYXNlcy4gVGhlc2UKK2FyZToKKworMS4gTWVtb3J5IGNvbnRyb2xsZXIKKzIuIG1sb2NrKDIpIGNvbnRyb2xsZXIKKzMuIEtlcm5lbCB1c2VyIG1lbW9yeSBhY2NvdW50aW5nIGFuZCBzbGFiIGNvbnRyb2wKKzQuIHVzZXIgbWFwcGluZ3MgbGVuZ3RoIGNvbnRyb2xsZXIKKworVGhlIG1lbW9yeSBjb250cm9sbGVyIGlzIHRoZSBmaXJzdCBjb250cm9sbGVyIGRldmVsb3BlZC4KKworMi4xLiBEZXNpZ24KKworVGhlIGNvcmUgb2YgdGhlIGRlc2lnbiBpcyBhIGNvdW50ZXIgY2FsbGVkIHRoZSByZXNfY291bnRlci4gVGhlIHJlc19jb3VudGVyCit0cmFja3MgdGhlIGN1cnJlbnQgbWVtb3J5IHVzYWdlIGFuZCBsaW1pdCBvZiB0aGUgZ3JvdXAgb2YgcHJvY2Vzc2VzIGFzc29jaWF0ZWQKK3dpdGggdGhlIGNvbnRyb2xsZXIuIEVhY2ggY2dyb3VwIGhhcyBhIG1lbW9yeSBjb250cm9sbGVyIHNwZWNpZmljIGRhdGEKK3N0cnVjdHVyZSAobWVtX2Nncm91cCkgYXNzb2NpYXRlZCB3aXRoIGl0LgorCisyLjIuIEFjY291bnRpbmcKKworCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCXwgIG1lbV9jZ3JvdXAgICAgIHwKKwkJfCAgKHJlc19jb3VudGVyKSAgICAgfAorCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisJCSAvICAgICAgICAgICAgXiAgICAgIFwKKwkJLyAgICAgICAgICAgICB8ICAgICAgIFwKKyAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsgIHwgICAgICAgICstLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgIHwgbW1fc3RydWN0ICAgICB8ICB8Li4uLiAgICB8IG1tX3N0cnVjdCAgICAgfAorICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCAgfCAgICAgICAgfCAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsgIHwgICAgICAgICstLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC0tLS0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICstLS0tLS0rLS0tLS0tLS0rCisgICAgICAgICAgIHwgcGFnZSAgICAgICAgICArLS0tLS0tLS0tLT4gIHBhZ2VfY2dyb3VwfAorICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0rCisKKyAgICAgICAgICAgICAoRmlndXJlIDE6IEhpZXJhcmNoeSBvZiBBY2NvdW50aW5nKQorCisKK0ZpZ3VyZSAxIHNob3dzIHRoZSBpbXBvcnRhbnQgYXNwZWN0cyBvZiB0aGUgY29udHJvbGxlcgorCisxLiBBY2NvdW50aW5nIGhhcHBlbnMgcGVyIGNncm91cAorMi4gRWFjaCBtbV9zdHJ1Y3Qga25vd3MgYWJvdXQgd2hpY2ggY2dyb3VwIGl0IGJlbG9uZ3MgdG8KKzMuIEVhY2ggcGFnZSBoYXMgYSBwb2ludGVyIHRvIHRoZSBwYWdlX2Nncm91cCwgd2hpY2ggaW4gdHVybiBrbm93cyB0aGUKKyAgIGNncm91cCBpdCBiZWxvbmdzIHRvCisKK1RoZSBhY2NvdW50aW5nIGlzIGRvbmUgYXMgZm9sbG93czogbWVtX2Nncm91cF9jaGFyZ2UoKSBpcyBpbnZva2VkIHRvIHNldHVwCit0aGUgbmVjZXNzYXJ5IGRhdGEgc3RydWN0dXJlcyBhbmQgY2hlY2sgaWYgdGhlIGNncm91cCB0aGF0IGlzIGJlaW5nIGNoYXJnZWQKK2lzIG92ZXIgaXRzIGxpbWl0LiBJZiBpdCBpcyB0aGVuIHJlY2xhaW0gaXMgaW52b2tlZCBvbiB0aGUgY2dyb3VwLgorTW9yZSBkZXRhaWxzIGNhbiBiZSBmb3VuZCBpbiB0aGUgcmVjbGFpbSBzZWN0aW9uIG9mIHRoaXMgZG9jdW1lbnQuCitJZiBldmVyeXRoaW5nIGdvZXMgd2VsbCwgYSBwYWdlIG1ldGEtZGF0YS1zdHJ1Y3R1cmUgY2FsbGVkIHBhZ2VfY2dyb3VwIGlzCithbGxvY2F0ZWQgYW5kIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFnZS4gIFRoaXMgcm91dGluZSBhbHNvIGFkZHMgdGhlIHBhZ2UgdG8KK3RoZSBwZXIgY2dyb3VwIExSVS4KKworMi4yLjEgQWNjb3VudGluZyBkZXRhaWxzCisKK0FsbCBtYXBwZWQgcGFnZXMgKFJTUykgYW5kIHVubWFwcGVkIHVzZXIgcGFnZXMgKFBhZ2UgQ2FjaGUpIGFyZSBhY2NvdW50ZWQuCitSU1MgcGFnZXMgYXJlIGFjY291bnRlZCBhdCB0aGUgdGltZSBvZiBwYWdlX2FkZF8qX3JtYXAoKSB1bmxlc3MgdGhleSd2ZSBhbHJlYWR5CitiZWVuIGFjY291bnRlZCBmb3IgZWFybGllci4gQSBmaWxlIHBhZ2Ugd2lsbCBiZSBhY2NvdW50ZWQgZm9yIGFzIFBhZ2UgQ2FjaGU7CitpdCdzIG1hcHBlZCBpbnRvIHRoZSBwYWdlIHRhYmxlcyBvZiBhIHByb2Nlc3MsIGR1cGxpY2F0ZSBhY2NvdW50aW5nIGlzIGNhcmVmdWxseQorYXZvaWRlZC4gUGFnZSBDYWNoZSBwYWdlcyBhcmUgYWNjb3VudGVkIGF0IHRoZSB0aW1lIG9mIGFkZF90b19wYWdlX2NhY2hlKCkuCitUaGUgY29ycmVzcG9uZGluZyByb3V0aW5lcyB0aGF0IHJlbW92ZSBhIHBhZ2UgZnJvbSB0aGUgcGFnZSB0YWJsZXMgb3IgcmVtb3ZlcworYSBwYWdlIGZyb20gUGFnZSBDYWNoZSBpcyB1c2VkIHRvIGRlY3JlbWVudCB0aGUgYWNjb3VudGluZyBjb3VudGVycyBvZiB0aGUKK2Nncm91cC4KKworMi4zIFNoYXJlZCBQYWdlIEFjY291bnRpbmcKKworU2hhcmVkIHBhZ2VzIGFyZSBhY2NvdW50ZWQgb24gdGhlIGJhc2lzIG9mIHRoZSBmaXJzdCB0b3VjaCBhcHByb2FjaC4gVGhlCitjZ3JvdXAgdGhhdCBmaXJzdCB0b3VjaGVzIGEgcGFnZSBpcyBhY2NvdW50ZWQgZm9yIHRoZSBwYWdlLiBUaGUgcHJpbmNpcGxlCitiZWhpbmQgdGhpcyBhcHByb2FjaCBpcyB0aGF0IGEgY2dyb3VwIHRoYXQgYWdncmVzc2l2ZWx5IHVzZXMgYSBzaGFyZWQKK3BhZ2Ugd2lsbCBldmVudHVhbGx5IGdldCBjaGFyZ2VkIGZvciBpdCAob25jZSBpdCBpcyB1bmNoYXJnZWQgZnJvbQordGhlIGNncm91cCB0aGF0IGJyb3VnaHQgaXQgaW4gLS0gdGhpcyB3aWxsIGhhcHBlbiBvbiBtZW1vcnkgcHJlc3N1cmUpLgorCisyLjQgUmVjbGFpbQorCitFYWNoIGNncm91cCBtYWludGFpbnMgYSBwZXIgY2dyb3VwIExSVSB0aGF0IGNvbnNpc3RzIG9mIGFuIGFjdGl2ZQorYW5kIGluYWN0aXZlIGxpc3QuIFdoZW4gYSBjZ3JvdXAgZ29lcyBvdmVyIGl0cyBsaW1pdCwgd2UgZmlyc3QgdHJ5Cit0byByZWNsYWltIG1lbW9yeSBmcm9tIHRoZSBjZ3JvdXAgc28gYXMgdG8gbWFrZSBzcGFjZSBmb3IgdGhlIG5ldworcGFnZXMgdGhhdCB0aGUgY2dyb3VwIGhhcyB0b3VjaGVkLiBJZiB0aGUgcmVjbGFpbSBpcyB1bnN1Y2Nlc3NmdWwsCithbiBPT00gcm91dGluZSBpcyBpbnZva2VkIHRvIHNlbGVjdCBhbmQga2lsbCB0aGUgYnVsa2llc3QgdGFzayBpbiB0aGUKK2Nncm91cC4KKworVGhlIHJlY2xhaW0gYWxnb3JpdGhtIGhhcyBub3QgYmVlbiBtb2RpZmllZCBmb3IgY2dyb3VwcywgZXhjZXB0IHRoYXQKK3BhZ2VzIHRoYXQgYXJlIHNlbGVjdGVkIGZvciByZWNsYWltaW5nIGNvbWUgZnJvbSB0aGUgcGVyIGNncm91cCBMUlUKK2xpc3QuCisKKzIuIExvY2tpbmcKKworVGhlIG1lbW9yeSBjb250cm9sbGVyIHVzZXMgdGhlIGZvbGxvd2luZyBoaWVyYXJjaHkKKworMS4gem9uZS0+bHJ1X2xvY2sgaXMgdXNlZCBmb3Igc2VsZWN0aW5nIHBhZ2VzIHRvIGJlIGlzb2xhdGVkCisyLiBtZW0tPnBlcl96b25lLT5scnVfbG9jayBwcm90ZWN0cyB0aGUgcGVyIGNncm91cCBMUlUgKHBlciB6b25lKQorMy4gbG9ja19wYWdlX2Nncm91cCgpIGlzIHVzZWQgdG8gcHJvdGVjdCBwYWdlLT5wYWdlX2Nncm91cAorCiszLiBVc2VyIEludGVyZmFjZQorCiswLiBDb25maWd1cmF0aW9uCisKK2EuIEVuYWJsZSBDT05GSUdfQ0dST1VQUworYi4gRW5hYmxlIENPTkZJR19SRVNPVVJDRV9DT1VOVEVSUworYy4gRW5hYmxlIENPTkZJR19DR1JPVVBfTUVNX0NPTlQKKworMS4gUHJlcGFyZSB0aGUgY2dyb3VwcworIyBta2RpciAtcCAvY2dyb3VwcworIyBtb3VudCAtdCBjZ3JvdXAgbm9uZSAvY2dyb3VwcyAtbyBtZW1vcnkKKworMi4gTWFrZSB0aGUgbmV3IGdyb3VwIGFuZCBtb3ZlIGJhc2ggaW50byBpdAorIyBta2RpciAvY2dyb3Vwcy8wCisjIGVjaG8gJCQgPiAgL2Nncm91cHMvMC90YXNrcworCitTaW5jZSBub3cgd2UncmUgaW4gdGhlIDAgY2dyb3VwLAorV2UgY2FuIGFsdGVyIHRoZSBtZW1vcnkgbGltaXQ6CisjIGVjaG8gLW4gNE0gPiAvY2dyb3Vwcy8wL21lbW9yeS5saW1pdF9pbl9ieXRlcworCitOT1RFOiBXZSBjYW4gdXNlIGEgc3VmZml4IChrLCBLLCBtLCBNLCBnIG9yIEcpIHRvIGluZGljYXRlIHZhbHVlcyBpbiBraWxvLAorbWVnYSBvciBnaWdhYnl0ZXMuCisKKyMgY2F0IC9jZ3JvdXBzLzAvbWVtb3J5LmxpbWl0X2luX2J5dGVzCis0MTk0MzA0IEJ5dGVzCisKK05PVEU6IFRoZSBpbnRlcmZhY2UgaGFzIG5vdyBjaGFuZ2VkIHRvIGRpc3BsYXkgdGhlIHVzYWdlIGluIGJ5dGVzCitpbnN0ZWFkIG9mIHBhZ2VzCisKK1dlIGNhbiBjaGVjayB0aGUgdXNhZ2U6CisjIGNhdCAvY2dyb3Vwcy8wL21lbW9yeS51c2FnZV9pbl9ieXRlcworMTIxNjUxMiBCeXRlcworCitBIHN1Y2Nlc3NmdWwgd3JpdGUgdG8gdGhpcyBmaWxlIGRvZXMgbm90IGd1YXJhbnRlZSBhIHN1Y2Nlc3NmdWwgc2V0IG9mCit0aGlzIGxpbWl0IHRvIHRoZSB2YWx1ZSB3cml0dGVuIGludG8gdGhlIGZpbGUuICBUaGlzIGNhbiBiZSBkdWUgdG8gYQorbnVtYmVyIG9mIGZhY3RvcnMsIHN1Y2ggYXMgcm91bmRpbmcgdXAgdG8gcGFnZSBib3VuZGFyaWVzIG9yIHRoZSB0b3RhbAorYXZhaWxhYmlsaXR5IG9mIG1lbW9yeSBvbiB0aGUgc3lzdGVtLiAgVGhlIHVzZXIgaXMgcmVxdWlyZWQgdG8gcmUtcmVhZAordGhpcyBmaWxlIGFmdGVyIGEgd3JpdGUgdG8gZ3VhcmFudGVlIHRoZSB2YWx1ZSBjb21taXR0ZWQgYnkgdGhlIGtlcm5lbC4KKworIyBlY2hvIC1uIDEgPiBtZW1vcnkubGltaXRfaW5fYnl0ZXMKKyMgY2F0IG1lbW9yeS5saW1pdF9pbl9ieXRlcworNDA5NiBCeXRlcworCitUaGUgbWVtb3J5LmZhaWxjbnQgZmllbGQgZ2l2ZXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoZSBjZ3JvdXAgbGltaXQgd2FzCitleGNlZWRlZC4KKworVGhlIG1lbW9yeS5zdGF0IGZpbGUgZ2l2ZXMgYWNjb3VudGluZyBpbmZvcm1hdGlvbi4gTm93LCB0aGUgbnVtYmVyIG9mCitjYWNoZXMsIFJTUyBhbmQgQWN0aXZlIHBhZ2VzL0luYWN0aXZlIHBhZ2VzIGFyZSBzaG93bi4KKworVGhlIG1lbW9yeS5mb3JjZV9lbXB0eSBnaXZlcyBhbiBpbnRlcmZhY2UgdG8gZHJvcCAqYWxsKiBjaGFyZ2VzIGJ5IGZvcmNlLgorCisjIGVjaG8gLW4gMSA+IG1lbW9yeS5mb3JjZV9lbXB0eQorCit3aWxsIGRyb3AgYWxsIGNoYXJnZXMgaW4gY2dyb3VwLiBDdXJyZW50bHksIHRoaXMgaXMgbWFpbnRhaW5lZCBmb3IgdGVzdC4KKworNC4gVGVzdGluZworCitCYWxiaXIgcG9zdGVkIGxtYmVuY2gsIEFJTTksIExUUCBhbmQgdm1tc3RyZXNzIHJlc3VsdHMgWzEwXSBhbmQgWzExXS4KK0FwYXJ0IGZyb20gdGhhdCB2NiBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBzZXZlcmFsIGFwcGxpY2F0aW9ucyBhbmQgcmVndWxhcgorZGFpbHkgdXNlLiBUaGUgY29udHJvbGxlciBoYXMgYWxzbyBiZWVuIHRlc3RlZCBvbiB0aGUgUFBDNjQsIHg4Nl82NCBhbmQKK1VNTCBwbGF0Zm9ybXMuCisKKzQuMSBUcm91Ymxlc2hvb3RpbmcKKworU29tZXRpbWVzIGEgdXNlciBtaWdodCBmaW5kIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIGEgY2dyb3VwIGlzCit0ZXJtaW5hdGVkLiBUaGVyZSBhcmUgc2V2ZXJhbCBjYXVzZXMgZm9yIHRoaXM6CisKKzEuIFRoZSBjZ3JvdXAgbGltaXQgaXMgdG9vIGxvdyAoanVzdCB0b28gbG93IHRvIGRvIGFueXRoaW5nIHVzZWZ1bCkKKzIuIFRoZSB1c2VyIGlzIHVzaW5nIGFub255bW91cyBtZW1vcnkgYW5kIHN3YXAgaXMgdHVybmVkIG9mZiBvciB0b28gbG93CisKK0Egc3luYyBmb2xsb3dlZCBieSBlY2hvIDEgPiAvcHJvYy9zeXMvdm0vZHJvcF9jYWNoZXMgd2lsbCBoZWxwIGdldCByaWQgb2YKK3NvbWUgb2YgdGhlIHBhZ2VzIGNhY2hlZCBpbiB0aGUgY2dyb3VwIChwYWdlIGNhY2hlIHBhZ2VzKS4KKworNC4yIFRhc2sgbWlncmF0aW9uCisKK1doZW4gYSB0YXNrIG1pZ3JhdGVzIGZyb20gb25lIGNncm91cCB0byBhbm90aGVyLCBpdCdzIGNoYXJnZSBpcyBub3QKK2NhcnJpZWQgZm9yd2FyZC4gVGhlIHBhZ2VzIGFsbG9jYXRlZCBmcm9tIHRoZSBvcmlnaW5hbCBjZ3JvdXAgc3RpbGwKK3JlbWFpbiBjaGFyZ2VkIHRvIGl0LCB0aGUgY2hhcmdlIGlzIGRyb3BwZWQgd2hlbiB0aGUgcGFnZSBpcyBmcmVlZCBvcgorcmVjbGFpbWVkLgorCis0LjMgUmVtb3ZpbmcgYSBjZ3JvdXAKKworQSBjZ3JvdXAgY2FuIGJlIHJlbW92ZWQgYnkgcm1kaXIsIGJ1dCBhcyBkaXNjdXNzZWQgaW4gc2VjdGlvbnMgNC4xIGFuZCA0LjIsIGEKK2Nncm91cCBtaWdodCBoYXZlIHNvbWUgY2hhcmdlIGFzc29jaWF0ZWQgd2l0aCBpdCwgZXZlbiB0aG91Z2ggYWxsCit0YXNrcyBoYXZlIG1pZ3JhdGVkIGF3YXkgZnJvbSBpdC4gU3VjaCBjaGFyZ2VzIGFyZSBhdXRvbWF0aWNhbGx5IGRyb3BwZWQgYXQKK3JtZGlyKCkgaWYgdGhlcmUgYXJlIG5vIHRhc2tzLgorCis0LjQgQ2hvb3Npbmcgd2hhdCB0byBhY2NvdW50ICAtLSBQYWdlIENhY2hlICh1bm1hcHBlZCkgdnMgUlNTIChtYXBwZWQpPworCitUaGUgdHlwZSBvZiBtZW1vcnkgYWNjb3VudGVkIGJ5IHRoZSBjZ3JvdXAgY2FuIGJlIGxpbWl0ZWQgdG8ganVzdAorbWFwcGVkIHBhZ2VzIGJ5IHdyaXRpbmcgIjEiIHRvIG1lbW9yeS5jb250cm9sX3R5cGUgZmllbGQKKworZWNobyAtbiAxID4gbWVtb3J5LmNvbnRyb2xfdHlwZQorCis1LiBUT0RPCisKKzEuIEFkZCBzdXBwb3J0IGZvciBhY2NvdW50aW5nIGh1Z2UgcGFnZXMgKGFzIGEgc2VwYXJhdGUgY29udHJvbGxlcikKKzIuIE1ha2UgcGVyLWNncm91cCBzY2FubmVyIHJlY2xhaW0gbm90LXNoYXJlZCBwYWdlcyBmaXJzdAorMy4gVGVhY2ggY29udHJvbGxlciB0byBhY2NvdW50IGZvciBzaGFyZWQtcGFnZXMKKzQuIFN0YXJ0IHJlY2xhbWF0aW9uIHdoZW4gdGhlIGxpbWl0IGlzIGxvd2VyZWQKKzUuIFN0YXJ0IHJlY2xhbWF0aW9uIGluIHRoZSBiYWNrZ3JvdW5kIHdoZW4gdGhlIGxpbWl0IGlzCisgICBub3QgeWV0IGhpdCBidXQgdGhlIHVzYWdlIGlzIGdldHRpbmcgY2xvc2VyCisKK1N1bW1hcnkKKworT3ZlcmFsbCwgdGhlIG1lbW9yeSBjb250cm9sbGVyIGhhcyBiZWVuIGEgc3RhYmxlIGNvbnRyb2xsZXIgYW5kIGhhcyBiZWVuCitjb21tZW50ZWQgYW5kIGRpc2N1c3NlZCBxdWl0ZSBleHRlbnNpdmVseSBpbiB0aGUgY29tbXVuaXR5LgorCitSZWZlcmVuY2VzCisKKzEuIFNpbmdoLCBCYWxiaXIuIFJGQzogTWVtb3J5IENvbnRyb2xsZXIsIGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzIwNjY5Ny8KKzIuIFNpbmdoLCBCYWxiaXIuIE1lbW9yeSBDb250cm9sbGVyIChSU1MgQ29udHJvbCksCisgICBodHRwOi8vbHduLm5ldC9BcnRpY2xlcy8yMjI3NjIvCiszLiBFbWVsaWFub3YsIFBhdmVsLiBSZXNvdXJjZSBjb250cm9sbGVycyBiYXNlZCBvbiBwcm9jZXNzIGNncm91cHMKKyAgIGh0dHA6Ly9sa21sLm9yZy9sa21sLzIwMDcvMy82LzE5OAorNC4gRW1lbGlhbm92LCBQYXZlbC4gUlNTIGNvbnRyb2xsZXIgYmFzZWQgb24gcHJvY2VzcyBjZ3JvdXBzICh2MikKKyAgIGh0dHA6Ly9sa21sLm9yZy9sa21sLzIwMDcvNC85Lzc0Cis1LiBFbWVsaWFub3YsIFBhdmVsLiBSU1MgY29udHJvbGxlciBiYXNlZCBvbiBwcm9jZXNzIGNncm91cHMgKHYzKQorICAgaHR0cDovL2xrbWwub3JnL2xrbWwvMjAwNy81LzMwLzI0NAorNi4gTWVuYWdlLCBQYXVsLiBDb250cm9sIEdyb3VwcyB2MTAsIGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzIzNjAzMi8KKzcuIFZhaWR5YW5hdGhhbiwgU3Jpbml2YXNhbiwgQ29udHJvbCBHcm91cHM6IFBhZ2VjYWNoZSBhY2NvdW50aW5nIGFuZCBjb250cm9sCisgICBzdWJzeXN0ZW0gKHYzKSwgaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvMjM1NTM0LworOC4gU2luZ2gsIEJhbGJpci4gUlNTIGNvbnRyb2xsZXIgVjIgdGVzdCByZXN1bHRzIChsbWJlbmNoKSwKKyAgIGh0dHA6Ly9sa21sLm9yZy9sa21sLzIwMDcvNS8xNy8yMzIKKzkuIFNpbmdoLCBCYWxiaXIuIFJTUyBjb250cm9sbGVyIFYyIEFJTTkgcmVzdWx0cworICAgaHR0cDovL2xrbWwub3JnL2xrbWwvMjAwNy81LzE4LzEKKzEwLiBTaW5naCwgQmFsYmlyLiBNZW1vcnkgY29udHJvbGxlciB2NiByZXN1bHRzLAorICAgIGh0dHA6Ly9sa21sLm9yZy9sa21sLzIwMDcvOC8xOS8zNgorMTEuIFNpbmdoLCBCYWxiaXIuIE1lbW9yeSBjb250cm9sbGVyIHY2LCBodHRwOi8vbGttbC5vcmcvbGttbC8yMDA3LzgvMTcvNjkKKzEyLiBDb3JiZXQsIEpvbmF0aGFuLCBDb250cm9sbGluZyBtZW1vcnkgdXNlIGluIGNncm91cHMsCisgICAgaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvMjQzNzk1LwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jcHVzZXRzLnR4dCBiL0RvY3VtZW50YXRpb24vY3B1c2V0cy50eHQKaW5kZXggMTQxYmVmMS4uNDNkYjZmZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jcHVzZXRzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NwdXNldHMudHh0CkBAIC01MjMsMjEgKzUyMywxNCBAQAogbWVtb3J5IHBsYWNlbWVudCwgYXMgYWJvdmUsIHRoZSBuZXh0IHRpbWUgdGhhdCB0aGUga2VybmVsIGF0dGVtcHRzCiB0byBhbGxvY2F0ZSBhIHBhZ2Ugb2YgbWVtb3J5IGZvciB0aGF0IHRhc2suCiAKLUlmIGEgY3B1c2V0IGhhcyBpdHMgQ1BVcyBtb2RpZmllZCwgdGhlbiBlYWNoIHRhc2sgdXNpbmcgdGhhdAotY3B1c2V0IGRvZXMgX25vdF8gY2hhbmdlIGl0cyBiZWhhdmlvciBhdXRvbWF0aWNhbGx5LiAgSW4gb3JkZXIgdG8KLW1pbmltaXplIHRoZSBpbXBhY3Qgb24gdGhlIGNyaXRpY2FsIHNjaGVkdWxpbmcgY29kZSBpbiB0aGUga2VybmVsLAotdGFza3Mgd2lsbCBjb250aW51ZSB0byB1c2UgdGhlaXIgcHJpb3IgQ1BVIHBsYWNlbWVudCB1bnRpbCB0aGV5Ci1hcmUgcmVib3VuZCB0byB0aGVpciBjcHVzZXQsIGJ5IHJld3JpdGluZyB0aGVpciBwaWQgdG8gdGhlICd0YXNrcycKLWZpbGUgb2YgdGhlaXIgY3B1c2V0LiAgSWYgYSB0YXNrIGhhZCBiZWVuIGJvdW5kIHRvIHNvbWUgc3Vic2V0IG9mIGl0cwotY3B1c2V0IHVzaW5nIHRoZSBzY2hlZF9zZXRhZmZpbml0eSgpIGNhbGwsIGFuZCBpZiBhbnkgb2YgdGhhdCBzdWJzZXQKLWlzIHN0aWxsIGFsbG93ZWQgaW4gaXRzIG5ldyBjcHVzZXQgc2V0dGluZ3MsIHRoZW4gdGhlIHRhc2sgd2lsbCBiZQotcmVzdHJpY3RlZCB0byB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBDUFVzIGl0IHdhcyBhbGxvd2VkIG9uIGJlZm9yZSwKLWFuZCBpdHMgbmV3IGNwdXNldCBDUFUgcGxhY2VtZW50LiAgSWYsIG9uIHRoZSBvdGhlciBoYW5kLCB0aGVyZSBpcwotbm8gb3ZlcmxhcCBiZXR3ZWVuIGEgdGFza3MgcHJpb3IgcGxhY2VtZW50IGFuZCBpdHMgbmV3IGNwdXNldCBDUFUKLXBsYWNlbWVudCwgdGhlbiB0aGUgdGFzayB3aWxsIGJlIGFsbG93ZWQgdG8gcnVuIG9uIGFueSBDUFUgYWxsb3dlZAotaW4gaXRzIG5ldyBjcHVzZXQuICBJZiBhIHRhc2sgaXMgbW92ZWQgZnJvbSBvbmUgY3B1c2V0IHRvIGFub3RoZXIsCi1pdHMgQ1BVIHBsYWNlbWVudCBpcyB1cGRhdGVkIGluIHRoZSBzYW1lIHdheSBhcyBpZiB0aGUgdGFza3MgcGlkIGlzCi1yZXdyaXR0ZW4gdG8gdGhlICd0YXNrcycgZmlsZSBvZiBpdHMgY3VycmVudCBjcHVzZXQuCitJZiBhIGNwdXNldCBoYXMgaXRzICdjcHVzJyBtb2RpZmllZCwgdGhlbiBlYWNoIHRhc2sgaW4gdGhhdCBjcHVzZXQKK3dpbGwgaGF2ZSBpdHMgYWxsb3dlZCBDUFUgcGxhY2VtZW50IGNoYW5nZWQgaW1tZWRpYXRlbHkuICBTaW1pbGFybHksCitpZiBhIHRhc2tzIHBpZCBpcyB3cml0dGVuIHRvIGEgY3B1c2V0cyAndGFza3MnIGZpbGUsIGluIGVpdGhlciBpdHMKK2N1cnJlbnQgY3B1c2V0IG9yIGFub3RoZXIgY3B1c2V0LCB0aGVuIGl0cyBhbGxvd2VkIENQVSBwbGFjZW1lbnQgaXMKK2NoYW5nZWQgaW1tZWRpYXRlbHkuICBJZiBzdWNoIGEgdGFzayBoYWQgYmVlbiBib3VuZCB0byBzb21lIHN1YnNldAorb2YgaXRzIGNwdXNldCB1c2luZyB0aGUgc2NoZWRfc2V0YWZmaW5pdHkoKSBjYWxsLCB0aGUgdGFzayB3aWxsIGJlCithbGxvd2VkIHRvIHJ1biBvbiBhbnkgQ1BVIGFsbG93ZWQgaW4gaXRzIG5ldyBjcHVzZXQsIG5lZ2F0aW5nIHRoZQorYWZmZWN0IG9mIHRoZSBwcmlvciBzY2hlZF9zZXRhZmZpbml0eSgpIGNhbGwuCiAKIEluIHN1bW1hcnksIHRoZSBtZW1vcnkgcGxhY2VtZW50IG9mIGEgdGFzayB3aG9zZSBjcHVzZXQgaXMgY2hhbmdlZCBpcwogdXBkYXRlZCBieSB0aGUga2VybmVsLCBvbiB0aGUgbmV4dCBhbGxvY2F0aW9uIG9mIGEgcGFnZSBmb3IgdGhhdCB0YXNrLApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kbm90aWZ5LnR4dCBiL0RvY3VtZW50YXRpb24vZG5vdGlmeS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ODRmY2EuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9kbm90aWZ5LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLQkJTGludXggRGlyZWN0b3J5IE5vdGlmaWNhdGlvbgotCQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQkgICBTdGVwaGVuIFJvdGh3ZWxsIDxzZnJAY2FuYi5hdXVnLm9yZy5hdT4KLQotVGhlIGludGVudGlvbiBvZiBkaXJlY3Rvcnkgbm90aWZpY2F0aW9uIGlzIHRvIGFsbG93IHVzZXIgYXBwbGljYXRpb25zCi10byBiZSBub3RpZmllZCB3aGVuIGEgZGlyZWN0b3J5LCBvciBhbnkgb2YgdGhlIGZpbGVzIGluIGl0LCBhcmUgY2hhbmdlZC4KLVRoZSBiYXNpYyBtZWNoYW5pc20gaW52b2x2ZXMgdGhlIGFwcGxpY2F0aW9uIHJlZ2lzdGVyaW5nIGZvciBub3RpZmljYXRpb24KLW9uIGEgZGlyZWN0b3J5IHVzaW5nIGEgZmNudGwoMikgY2FsbCBhbmQgdGhlIG5vdGlmaWNhdGlvbnMgdGhlbXNlbHZlcwotYmVpbmcgZGVsaXZlcmVkIHVzaW5nIHNpZ25hbHMuCi0KLVRoZSBhcHBsaWNhdGlvbiBkZWNpZGVzIHdoaWNoICJldmVudHMiIGl0IHdhbnRzIHRvIGJlIG5vdGlmaWVkIGFib3V0LgotVGhlIGN1cnJlbnRseSBkZWZpbmVkIGV2ZW50cyBhcmU6Ci0KLQlETl9BQ0NFU1MJQSBmaWxlIGluIHRoZSBkaXJlY3Rvcnkgd2FzIGFjY2Vzc2VkIChyZWFkKQotCUROX01PRElGWQlBIGZpbGUgaW4gdGhlIGRpcmVjdG9yeSB3YXMgbW9kaWZpZWQgKHdyaXRlLHRydW5jYXRlKQotCUROX0NSRUFURQlBIGZpbGUgd2FzIGNyZWF0ZWQgaW4gdGhlIGRpcmVjdG9yeQotCUROX0RFTEVURQlBIGZpbGUgd2FzIHVubGlua2VkIGZyb20gZGlyZWN0b3J5Ci0JRE5fUkVOQU1FCUEgZmlsZSBpbiB0aGUgZGlyZWN0b3J5IHdhcyByZW5hbWVkCi0JRE5fQVRUUklCCUEgZmlsZSBpbiB0aGUgZGlyZWN0b3J5IGhhZCBpdHMgYXR0cmlidXRlcwotCQkJY2hhbmdlZCAoY2htb2QsY2hvd24pCi0KLVVzdWFsbHksIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHJlcmVnaXN0ZXIgYWZ0ZXIgZWFjaCBub3RpZmljYXRpb24sIGJ1dAotaWYgRE5fTVVMVElTSE9UIGlzIG9yJ2VkIHdpdGggdGhlIGV2ZW50IG1hc2ssIHRoZW4gdGhlIHJlZ2lzdHJhdGlvbiB3aWxsCi1yZW1haW4gdW50aWwgZXhwbGljaXRseSByZW1vdmVkIChieSByZWdpc3RlcmluZyBmb3Igbm8gZXZlbnRzKS4KLQotQnkgZGVmYXVsdCwgU0lHSU8gd2lsbCBiZSBkZWxpdmVyZWQgdG8gdGhlIHByb2Nlc3MgYW5kIG5vIG90aGVyIHVzZWZ1bAotaW5mb3JtYXRpb24uICBIb3dldmVyLCBpZiB0aGUgRl9TRVRTSUcgZmNudGwoMikgY2FsbCBpcyB1c2VkIHRvIGxldCB0aGUKLWtlcm5lbCBrbm93IHdoaWNoIHNpZ25hbCB0byBkZWxpdmVyLCBhIHNpZ2luZm8gc3RydWN0dXJlIHdpbGwgYmUgcGFzc2VkIHRvCi10aGUgc2lnbmFsIGhhbmRsZXIgYW5kIHRoZSBzaV9mZCBtZW1iZXIgb2YgdGhhdCBzdHJ1Y3R1cmUgd2lsbCBjb250YWluIHRoZQotZmlsZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBldmVudCBvY2N1cnJlZC4KLQotUHJlZmVyYWJseSB0aGUgYXBwbGljYXRpb24gd2lsbCBjaG9vc2Ugb25lIG9mIHRoZSByZWFsIHRpbWUgc2lnbmFscwotKFNJR1JUTUlOICsgPG4+KSBzbyB0aGF0IHRoZSBub3RpZmljYXRpb25zIG1heSBiZSBxdWV1ZWQuICBUaGlzIGlzCi1lc3BlY2lhbGx5IGltcG9ydGFudCBpZiBETl9NVUxUSVNIT1QgaXMgc3BlY2lmaWVkLiAgTm90ZSB0aGF0IFNJR1JUTUlOCi1pcyBvZnRlbiBibG9ja2VkLCBzbyBpdCBpcyBiZXR0ZXIgdG8gdXNlIChhdCBsZWFzdCkgU0lHUlRNSU4gKyAxLgotCi1JbXBsZW1lbnRhdGlvbiBleHBlY3RhdGlvbnMgKGZlYXR1cmVzIGFuZCBidWdzIDotKSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgbm90aWZpY2F0aW9uIHNob3VsZCB3b3JrIGZvciBhbnkgbG9jYWwgYWNjZXNzIHRvIGZpbGVzIGV2ZW4gaWYgdGhlCi1hY3R1YWwgZmlsZSBzeXN0ZW0gaXMgb24gYSByZW1vdGUgc2VydmVyLiAgVGhpcyBpbXBsaWVzIHRoYXQgcmVtb3RlCi1hY2Nlc3MgdG8gZmlsZXMgc2VydmVkIGJ5IGxvY2FsIHVzZXIgbW9kZSBzZXJ2ZXJzIHNob3VsZCBiZSBub3RpZmllZC4KLUFsc28sIHJlbW90ZSBhY2Nlc3NlcyB0byBmaWxlcyBzZXJ2ZWQgYnkgYSBsb2NhbCBrZXJuZWwgTkZTIHNlcnZlciBzaG91bGQKLWJlIG5vdGlmaWVkLgotCi1JbiBvcmRlciB0byBtYWtlIHRoZSBpbXBhY3Qgb24gdGhlIGZpbGUgc3lzdGVtIGNvZGUgYXMgc21hbGwgYXMgcG9zc2libGUsCi10aGUgcHJvYmxlbSBvZiBoYXJkIGxpbmtzIHRvIGZpbGVzIGhhcyBiZWVuIGlnbm9yZWQuICBTbyBpZiBhIGZpbGUgKHgpCi1leGlzdHMgaW4gdHdvIGRpcmVjdG9yaWVzIChhIGFuZCBiKSB0aGVuIGEgY2hhbmdlIHRvIHRoZSBmaWxlIHVzaW5nIHRoZQotbmFtZSAiYS94IiBzaG91bGQgYmUgbm90aWZpZWQgdG8gYSBwcm9ncmFtIGV4cGVjdGluZyBub3RpZmljYXRpb25zIG9uCi1kaXJlY3RvcnkgImEiLCBidXQgd2lsbCBub3QgYmUgbm90aWZpZWQgdG8gb25lIGV4cGVjdGluZyBub3RpZmljYXRpb25zIG9uCi1kaXJlY3RvcnkgImIiLgotCi1BbHNvLCBmaWxlcyB0aGF0IGFyZSB1bmxpbmtlZCwgd2lsbCBzdGlsbCBjYXVzZSBub3RpZmljYXRpb25zIGluIHRoZQotbGFzdCBkaXJlY3RvcnkgdGhhdCB0aGV5IHdlcmUgbGlua2VkIHRvLgotCi1Db25maWd1cmF0aW9uCi0tLS0tLS0tLS0tLS0tCi0KLURub3RpZnkgaXMgY29udHJvbGxlZCB2aWEgdGhlIENPTkZJR19ETk9USUZZIGNvbmZpZ3VyYXRpb24gb3B0aW9uLiAgV2hlbgotZGlzYWJsZWQsIGZjbnRsKGZkLCBGX05PVElGWSwgLi4uKSB3aWxsIHJldHVybiAtRUlOVkFMLgotCi1FeGFtcGxlCi0tLS0tLS0tCi0KLQkjZGVmaW5lIF9HTlVfU09VUkNFCS8qIG5lZWRlZCB0byBnZXQgdGhlIGRlZmluZXMgKi8KLQkjaW5jbHVkZSA8ZmNudGwuaD4JLyogaW4gZ2xpYmMgMi4yIHRoaXMgaGFzIHRoZSBuZWVkZWQKLQkJCQkJICAgdmFsdWVzIGRlZmluZWQgKi8KLQkjaW5jbHVkZSA8c2lnbmFsLmg+Ci0JI2luY2x1ZGUgPHN0ZGlvLmg+Ci0JI2luY2x1ZGUgPHVuaXN0ZC5oPgotCQotCXN0YXRpYyB2b2xhdGlsZSBpbnQgZXZlbnRfZmQ7Ci0JCi0Jc3RhdGljIHZvaWQgaGFuZGxlcihpbnQgc2lnLCBzaWdpbmZvX3QgKnNpLCB2b2lkICpkYXRhKQotCXsKLQkJZXZlbnRfZmQgPSBzaS0+c2lfZmQ7Ci0JfQotCQotCWludCBtYWluKHZvaWQpCi0JewotCQlzdHJ1Y3Qgc2lnYWN0aW9uIGFjdDsKLQkJaW50IGZkOwotCQkKLQkJYWN0LnNhX3NpZ2FjdGlvbiA9IGhhbmRsZXI7Ci0JCXNpZ2VtcHR5c2V0KCZhY3Quc2FfbWFzayk7Ci0JCWFjdC5zYV9mbGFncyA9IFNBX1NJR0lORk87Ci0JCXNpZ2FjdGlvbihTSUdSVE1JTiArIDEsICZhY3QsIE5VTEwpOwotCQkKLQkJZmQgPSBvcGVuKCIuIiwgT19SRE9OTFkpOwotCQlmY250bChmZCwgRl9TRVRTSUcsIFNJR1JUTUlOICsgMSk7Ci0JCWZjbnRsKGZkLCBGX05PVElGWSwgRE5fTU9ESUZZfEROX0NSRUFURXxETl9NVUxUSVNIT1QpOwotCQkvKiB3ZSB3aWxsIG5vdyBiZSBub3RpZmllZCBpZiBhbnkgb2YgdGhlIGZpbGVzCi0JCSAgIGluICIuIiBpcyBtb2RpZmllZCBvciBuZXcgZmlsZXMgYXJlIGNyZWF0ZWQgKi8KLQkJd2hpbGUgKDEpIHsKLQkJCXBhdXNlKCk7Ci0JCQlwcmludGYoIkdvdCBldmVudCBvbiBmZD0lZFxuIiwgZXZlbnRfZmQpOwotCQl9Ci0JfQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kcml2ZXJzL2VkYWMvZWRhYy50eHQgYi9Eb2N1bWVudGF0aW9uL2VkYWMudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RyaXZlcnMvZWRhYy9lZGFjLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9lZGFjLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9lbWFpbC1jbGllbnRzLnR4dCBiL0RvY3VtZW50YXRpb24vZW1haWwtY2xpZW50cy50eHQKaW5kZXggMTEzMTY1Yi4uMmViYjk0ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9lbWFpbC1jbGllbnRzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2VtYWlsLWNsaWVudHMudHh0CkBAIC0xNzAsNyArMTcwLDYgQEAKIAogLSBXb3JrcyB3ZWxsIGZvciBpbmxpbmluZyB0ZXh0IChvciB1c2luZyBhdHRhY2htZW50cykuCiAtIEFsbG93cyB1c2Ugb2YgYW4gZXh0ZXJuYWwgZWRpdG9yLgotLSBOb3QgZ29vZCBmb3IgSU1BUC4KIC0gSXMgc2xvdyBvbiBsYXJnZSBmb2xkZXJzLgogLSBXb24ndCBkbyBUTFMgU01UUCBhdXRoIG92ZXIgYSBub24tU1NMIGNvbm5lY3Rpb24uCiAtIEhhcyBhIGhlbHBmdWwgcnVsZXIgYmFyIGluIHRoZSBjb21wb3NlIHdpbmRvdy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAppbmRleCA2OGNlMTMwLi5jZTk1MDNjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CkBAIC02LDE0ICs2LDYgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVdoYXQ6CU1YU0VSCi1XaGVuOglEZWNlbWJlciAyMDA3Ci1XaHk6CU9sZCBteHNlciBkcml2ZXIgaXMgb2Jzb2xldGVkIGJ5IHRoZSBteHNlcl9uZXcuIEdpdmUgaXQgc29tZSB0aW1lIHlldAotCWFuZCByZW1vdmUgaXQuCi1XaG86CUppcmkgU2xhYnkgPGppcmlzbGFieUBnbWFpbC5jb20+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBXaGF0OglkZXYtPnBvd2VyLnBvd2VyX3N0YXRlCiBXaGVuOglKdWx5IDIwMDcKIFdoeToJQnJva2VuIGRlc2lnbiBmb3IgcnVudGltZSBjb250cm9sIG92ZXIgZHJpdmVyIHBvd2VyIHN0YXRlcywgY29uZnVzaW5nCkBAIC0xMDcsMTcgKzk5LDYgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVdoYXQ6ICBhLm91dCBpbnRlcnByZXRlciBzdXBwb3J0IGZvciBFTEYgZXhlY3V0YWJsZXMKLVdoZW46ICAyLjYuMjUKLUZpbGVzOiBmcy9iaW5mbXRfZWxmLmMKLVdoeTogICBVc2luZyBhLm91dCBpbnRlcnByZXRlcnMgZm9yIEVMRiBleGVjdXRhYmxlcyB3YXMgYSBmZWF0dXJlIGZvcgotICAgICAgIHRyYW5zaXRpb24gZnJvbSBhLm91dCB0byBFTEYuIEJ1dCBub3cgaXQgaXMgdW5saWtlbHkgdG8gYmUgc3RpbGwKLSAgICAgICBuZWVkZWQgYW55bW9yZSBhbmQgcmVtb3ZpbmcgaXQgd291bGQgc2ltcGxpZnkgdGhlIGhhaXJ5IEVMRgotICAgICAgIGxvYWRlciBjb2RlLgotV2hvOiAgIEFuZGkgS2xlZW4gPGFrQHN1c2UuZGU+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBXaGF0OglyZW1vdmUgRVhQT1JUX1NZTUJPTChrZXJuZWxfdGhyZWFkKQogV2hlbjoJQXVndXN0IDIwMDYKIEZpbGVzOglhcmNoLyova2VybmVsLypfa3N5bXMuYwpAQCAtMjAwLDE0ICsxODEsNiBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDoJJ3RpbWUnIGtlcm5lbCBib290IHBhcmFtZXRlcgotV2hlbjoJSmFudWFyeSAyMDA4Ci1XaHk6CXJlcGxhY2VkIGJ5ICdwcmludGsudGltZT08dmFsdWU+JyBzbyB0aGF0IHByaW50ayB0aW1lc3RhbXBzIGNhbiBiZQotCWVuYWJsZWQgb3IgZGlzYWJsZWQgYXMgbmVlZGVkCi1XaG86CVJhbmR5IER1bmxhcCA8cmFuZHkuZHVubGFwQG9yYWNsZS5jb20+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBXaGF0OiBsaWJhdGEgc3BpbmRvd24gc2tpcHBpbmcgYW5kIHdhcm5pbmcKIFdoZW46IERlYyAyMDA4CiBXaHk6ICBTb21lIGhhbHQoOCkgaW1wbGVtZW50YXRpb25zIHN5bmNocm9uaXplIGNhY2hlcyBmb3IgYW5kIHNwaW4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zLzAwLUlOREVYCmluZGV4IDFkZTE1NWUuLmU2ODAyMWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy8wMC1JTkRFWApAQCAtMzIsNiArMzIsOCBAQAogCS0gaW5mbyBhYm91dCB0aGUgbG9ja2luZyBzY2hlbWUgdXNlZCBmb3IgZGlyZWN0b3J5IG9wZXJhdGlvbnMuCiBkbG1mcy50eHQKIAktIGluZm8gb24gdGhlIHVzZXJzcGFjZSBpbnRlcmZhY2UgdG8gdGhlIE9DRlMyIERMTS4KK2Rub3RpZnkudHh0CisJLSBpbmZvIGFib3V0IGRpcmVjdG9yeSBub3RpZmljYXRpb24gaW4gTGludXguCiBlY3J5cHRmcy50eHQKIAktIGRvY3Mgb24gZUNyeXB0ZnM6IHN0YWNrZWQgY3J5cHRvZ3JhcGhpYyBmaWxlc3lzdGVtIGZvciBMaW51eC4KIGV4dDIudHh0CkBAIC04MCw2ICs4Miw4IEBACiAJLSBpbmZvIG9uIHJlbGF5LCBmb3IgZWZmaWNpZW50IHN0cmVhbWluZyBmcm9tIGtlcm5lbCB0byB1c2VyIHNwYWNlLgogcm9tZnMudHh0CiAJLSBkZXNjcmlwdGlvbiBvZiB0aGUgUk9NRlMgZmlsZXN5c3RlbS4KK3NoYXJlZHN1YnRyZWUudHh0CisJLSBhIGRlc2NyaXB0aW9uIG9mIHNoYXJlZCBzdWJ0cmVlcyBmb3IgbmFtZXNwYWNlcy4KIHNtYmZzLnR4dAogCS0gaW5mbyBvbiB1c2luZyBmaWxlc3lzdGVtcyB3aXRoIHRoZSBTTUIgcHJvdG9jb2wgKFdpbiAzLjExIGFuZCBOVCkuCiBzcHVmcy50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvTG9ja2luZyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvTG9ja2luZwppbmRleCAzN2MxMGNiLi40MmQ0YjMwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL0xvY2tpbmcKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9Mb2NraW5nCkBAIC05MCw3ICs5MCw2IEBACiBwcm90b3R5cGVzOgogCXN0cnVjdCBpbm9kZSAqKCphbGxvY19pbm9kZSkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiAJdm9pZCAoKmRlc3Ryb3lfaW5vZGUpKHN0cnVjdCBpbm9kZSAqKTsKLQl2b2lkICgqcmVhZF9pbm9kZSkgKHN0cnVjdCBpbm9kZSAqKTsKIAl2b2lkICgqZGlydHlfaW5vZGUpIChzdHJ1Y3QgaW5vZGUgKik7CiAJaW50ICgqd3JpdGVfaW5vZGUpIChzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKIAl2b2lkICgqcHV0X2lub2RlKSAoc3RydWN0IGlub2RlICopOwpAQCAtMTE0LDcgKzExMyw2IEBACiAJCQlCS0wJc19sb2NrCXNfdW1vdW50CiBhbGxvY19pbm9kZToJCW5vCW5vCW5vCiBkZXN0cm95X2lub2RlOgkJbm8KLXJlYWRfaW5vZGU6CQlubwkJCQkoc2VlIGJlbG93KQogZGlydHlfaW5vZGU6CQlubwkJCQkobXVzdCBub3Qgc2xlZXApCiB3cml0ZV9pbm9kZToJCW5vCiBwdXRfaW5vZGU6CQlubwpAQCAtMTMzLDcgKzEzMSw2IEBACiBxdW90YV9yZWFkOgkJbm8Jbm8Jbm8JCShzZWUgYmVsb3cpCiBxdW90YV93cml0ZToJCW5vCW5vCW5vCQkoc2VlIGJlbG93KQogCi0tPnJlYWRfaW5vZGUoKSBpcyBub3QgYSBtZXRob2QgLSBpdCdzIGEgY2FsbGJhY2sgdXNlZCBpbiBpZ2V0KCkuCiAtPnJlbW91bnRfZnMoKSB3aWxsIGhhdmUgdGhlIHNfdW1vdW50IGxvY2sgaWYgaXQncyBhbHJlYWR5IG1vdW50ZWQuCiBXaGVuIGNhbGxlZCBmcm9tIGdldF9zYl9zaW5nbGUsIGl0IGRvZXMgTk9UIGhhdmUgdGhlIHNfdW1vdW50IGxvY2suCiAtPnF1b3RhX3JlYWQoKSBhbmQgLT5xdW90YV93cml0ZSgpIGZ1bmN0aW9ucyBhcmUgYm90aCBndWFyYW50ZWVkIHRvCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2Rub3RpZnkudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9kbm90aWZ5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjVkMzM4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9kbm90aWZ5LnR4dApAQCAtMCwwICsxLDk5IEBACisJCUxpbnV4IERpcmVjdG9yeSBOb3RpZmljYXRpb24KKwkJPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJICAgU3RlcGhlbiBSb3Rod2VsbCA8c2ZyQGNhbmIuYXV1Zy5vcmcuYXU+CisKK1RoZSBpbnRlbnRpb24gb2YgZGlyZWN0b3J5IG5vdGlmaWNhdGlvbiBpcyB0byBhbGxvdyB1c2VyIGFwcGxpY2F0aW9ucwordG8gYmUgbm90aWZpZWQgd2hlbiBhIGRpcmVjdG9yeSwgb3IgYW55IG9mIHRoZSBmaWxlcyBpbiBpdCwgYXJlIGNoYW5nZWQuCitUaGUgYmFzaWMgbWVjaGFuaXNtIGludm9sdmVzIHRoZSBhcHBsaWNhdGlvbiByZWdpc3RlcmluZyBmb3Igbm90aWZpY2F0aW9uCitvbiBhIGRpcmVjdG9yeSB1c2luZyBhIGZjbnRsKDIpIGNhbGwgYW5kIHRoZSBub3RpZmljYXRpb25zIHRoZW1zZWx2ZXMKK2JlaW5nIGRlbGl2ZXJlZCB1c2luZyBzaWduYWxzLgorCitUaGUgYXBwbGljYXRpb24gZGVjaWRlcyB3aGljaCAiZXZlbnRzIiBpdCB3YW50cyB0byBiZSBub3RpZmllZCBhYm91dC4KK1RoZSBjdXJyZW50bHkgZGVmaW5lZCBldmVudHMgYXJlOgorCisJRE5fQUNDRVNTCUEgZmlsZSBpbiB0aGUgZGlyZWN0b3J5IHdhcyBhY2Nlc3NlZCAocmVhZCkKKwlETl9NT0RJRlkJQSBmaWxlIGluIHRoZSBkaXJlY3Rvcnkgd2FzIG1vZGlmaWVkICh3cml0ZSx0cnVuY2F0ZSkKKwlETl9DUkVBVEUJQSBmaWxlIHdhcyBjcmVhdGVkIGluIHRoZSBkaXJlY3RvcnkKKwlETl9ERUxFVEUJQSBmaWxlIHdhcyB1bmxpbmtlZCBmcm9tIGRpcmVjdG9yeQorCUROX1JFTkFNRQlBIGZpbGUgaW4gdGhlIGRpcmVjdG9yeSB3YXMgcmVuYW1lZAorCUROX0FUVFJJQglBIGZpbGUgaW4gdGhlIGRpcmVjdG9yeSBoYWQgaXRzIGF0dHJpYnV0ZXMKKwkJCWNoYW5nZWQgKGNobW9kLGNob3duKQorCitVc3VhbGx5LCB0aGUgYXBwbGljYXRpb24gbXVzdCByZXJlZ2lzdGVyIGFmdGVyIGVhY2ggbm90aWZpY2F0aW9uLCBidXQKK2lmIEROX01VTFRJU0hPVCBpcyBvcidlZCB3aXRoIHRoZSBldmVudCBtYXNrLCB0aGVuIHRoZSByZWdpc3RyYXRpb24gd2lsbAorcmVtYWluIHVudGlsIGV4cGxpY2l0bHkgcmVtb3ZlZCAoYnkgcmVnaXN0ZXJpbmcgZm9yIG5vIGV2ZW50cykuCisKK0J5IGRlZmF1bHQsIFNJR0lPIHdpbGwgYmUgZGVsaXZlcmVkIHRvIHRoZSBwcm9jZXNzIGFuZCBubyBvdGhlciB1c2VmdWwKK2luZm9ybWF0aW9uLiAgSG93ZXZlciwgaWYgdGhlIEZfU0VUU0lHIGZjbnRsKDIpIGNhbGwgaXMgdXNlZCB0byBsZXQgdGhlCitrZXJuZWwga25vdyB3aGljaCBzaWduYWwgdG8gZGVsaXZlciwgYSBzaWdpbmZvIHN0cnVjdHVyZSB3aWxsIGJlIHBhc3NlZCB0bwordGhlIHNpZ25hbCBoYW5kbGVyIGFuZCB0aGUgc2lfZmQgbWVtYmVyIG9mIHRoYXQgc3RydWN0dXJlIHdpbGwgY29udGFpbiB0aGUKK2ZpbGUgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgZXZlbnQgb2NjdXJyZWQuCisKK1ByZWZlcmFibHkgdGhlIGFwcGxpY2F0aW9uIHdpbGwgY2hvb3NlIG9uZSBvZiB0aGUgcmVhbCB0aW1lIHNpZ25hbHMKKyhTSUdSVE1JTiArIDxuPikgc28gdGhhdCB0aGUgbm90aWZpY2F0aW9ucyBtYXkgYmUgcXVldWVkLiAgVGhpcyBpcworZXNwZWNpYWxseSBpbXBvcnRhbnQgaWYgRE5fTVVMVElTSE9UIGlzIHNwZWNpZmllZC4gIE5vdGUgdGhhdCBTSUdSVE1JTgoraXMgb2Z0ZW4gYmxvY2tlZCwgc28gaXQgaXMgYmV0dGVyIHRvIHVzZSAoYXQgbGVhc3QpIFNJR1JUTUlOICsgMS4KKworSW1wbGVtZW50YXRpb24gZXhwZWN0YXRpb25zIChmZWF0dXJlcyBhbmQgYnVncyA6LSkpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIG5vdGlmaWNhdGlvbiBzaG91bGQgd29yayBmb3IgYW55IGxvY2FsIGFjY2VzcyB0byBmaWxlcyBldmVuIGlmIHRoZQorYWN0dWFsIGZpbGUgc3lzdGVtIGlzIG9uIGEgcmVtb3RlIHNlcnZlci4gIFRoaXMgaW1wbGllcyB0aGF0IHJlbW90ZQorYWNjZXNzIHRvIGZpbGVzIHNlcnZlZCBieSBsb2NhbCB1c2VyIG1vZGUgc2VydmVycyBzaG91bGQgYmUgbm90aWZpZWQuCitBbHNvLCByZW1vdGUgYWNjZXNzZXMgdG8gZmlsZXMgc2VydmVkIGJ5IGEgbG9jYWwga2VybmVsIE5GUyBzZXJ2ZXIgc2hvdWxkCitiZSBub3RpZmllZC4KKworSW4gb3JkZXIgdG8gbWFrZSB0aGUgaW1wYWN0IG9uIHRoZSBmaWxlIHN5c3RlbSBjb2RlIGFzIHNtYWxsIGFzIHBvc3NpYmxlLAordGhlIHByb2JsZW0gb2YgaGFyZCBsaW5rcyB0byBmaWxlcyBoYXMgYmVlbiBpZ25vcmVkLiAgU28gaWYgYSBmaWxlICh4KQorZXhpc3RzIGluIHR3byBkaXJlY3RvcmllcyAoYSBhbmQgYikgdGhlbiBhIGNoYW5nZSB0byB0aGUgZmlsZSB1c2luZyB0aGUKK25hbWUgImEveCIgc2hvdWxkIGJlIG5vdGlmaWVkIHRvIGEgcHJvZ3JhbSBleHBlY3Rpbmcgbm90aWZpY2F0aW9ucyBvbgorZGlyZWN0b3J5ICJhIiwgYnV0IHdpbGwgbm90IGJlIG5vdGlmaWVkIHRvIG9uZSBleHBlY3Rpbmcgbm90aWZpY2F0aW9ucyBvbgorZGlyZWN0b3J5ICJiIi4KKworQWxzbywgZmlsZXMgdGhhdCBhcmUgdW5saW5rZWQsIHdpbGwgc3RpbGwgY2F1c2Ugbm90aWZpY2F0aW9ucyBpbiB0aGUKK2xhc3QgZGlyZWN0b3J5IHRoYXQgdGhleSB3ZXJlIGxpbmtlZCB0by4KKworQ29uZmlndXJhdGlvbgorLS0tLS0tLS0tLS0tLQorCitEbm90aWZ5IGlzIGNvbnRyb2xsZWQgdmlhIHRoZSBDT05GSUdfRE5PVElGWSBjb25maWd1cmF0aW9uIG9wdGlvbi4gIFdoZW4KK2Rpc2FibGVkLCBmY250bChmZCwgRl9OT1RJRlksIC4uLikgd2lsbCByZXR1cm4gLUVJTlZBTC4KKworRXhhbXBsZQorLS0tLS0tLQorCisJI2RlZmluZSBfR05VX1NPVVJDRQkvKiBuZWVkZWQgdG8gZ2V0IHRoZSBkZWZpbmVzICovCisJI2luY2x1ZGUgPGZjbnRsLmg+CS8qIGluIGdsaWJjIDIuMiB0aGlzIGhhcyB0aGUgbmVlZGVkCisJCQkJCSAgIHZhbHVlcyBkZWZpbmVkICovCisJI2luY2x1ZGUgPHNpZ25hbC5oPgorCSNpbmNsdWRlIDxzdGRpby5oPgorCSNpbmNsdWRlIDx1bmlzdGQuaD4KKworCXN0YXRpYyB2b2xhdGlsZSBpbnQgZXZlbnRfZmQ7CisKKwlzdGF0aWMgdm9pZCBoYW5kbGVyKGludCBzaWcsIHNpZ2luZm9fdCAqc2ksIHZvaWQgKmRhdGEpCisJeworCQlldmVudF9mZCA9IHNpLT5zaV9mZDsKKwl9CisKKwlpbnQgbWFpbih2b2lkKQorCXsKKwkJc3RydWN0IHNpZ2FjdGlvbiBhY3Q7CisJCWludCBmZDsKKworCQlhY3Quc2Ffc2lnYWN0aW9uID0gaGFuZGxlcjsKKwkJc2lnZW1wdHlzZXQoJmFjdC5zYV9tYXNrKTsKKwkJYWN0LnNhX2ZsYWdzID0gU0FfU0lHSU5GTzsKKwkJc2lnYWN0aW9uKFNJR1JUTUlOICsgMSwgJmFjdCwgTlVMTCk7CisKKwkJZmQgPSBvcGVuKCIuIiwgT19SRE9OTFkpOworCQlmY250bChmZCwgRl9TRVRTSUcsIFNJR1JUTUlOICsgMSk7CisJCWZjbnRsKGZkLCBGX05PVElGWSwgRE5fTU9ESUZZfEROX0NSRUFURXxETl9NVUxUSVNIT1QpOworCQkvKiB3ZSB3aWxsIG5vdyBiZSBub3RpZmllZCBpZiBhbnkgb2YgdGhlIGZpbGVzCisJCSAgIGluICIuIiBpcyBtb2RpZmllZCBvciBuZXcgZmlsZXMgYXJlIGNyZWF0ZWQgKi8KKwkJd2hpbGUgKDEpIHsKKwkJCXBhdXNlKCk7CisJCQlwcmludGYoIkdvdCBldmVudCBvbiBmZD0lZFxuIiwgZXZlbnRfZmQpOworCQl9CisJfQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9pc29mcy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2lzb2ZzLnR4dAppbmRleCA3NThlNTA0Li42OTczYjk4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2lzb2ZzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2lzb2ZzLnR4dApAQCAtMjQsNiArMjQsNyBAQAogICBtYXA9bm9ybWFsICAgIE1hcCBub24tUm9jayBSaWRnZSBmaWxlbmFtZXMgdG8gbG93ZXIgY2FzZQogICBtYXA9YWNvcm4gICAgIEFzIG1hcD1ub3JtYWwgYnV0IGFsc28gYXBwbHkgQWNvcm4gZXh0ZW5zaW9ucyBpZiBwcmVzZW50CiAgIG1vZGU9eHh4ICAgICAgU2V0cyB0aGUgcGVybWlzc2lvbnMgb24gZmlsZXMgdG8geHh4CisgIGRtb2RlPXh4eCAgICAgU2V0cyB0aGUgcGVybWlzc2lvbnMgb24gZGlyZWN0b3JpZXMgdG8geHh4CiAgIG5vam9saWV0ICAgICAgSWdub3JlIEpvbGlldCBleHRlbnNpb25zIGlmIHRoZXkgYXJlIHByZXNlbnQuCiAgIG5vcm9jayAgICAgICAgSWdub3JlIFJvY2sgUmlkZ2UgZXh0ZW5zaW9ucyBpZiB0aGV5IGFyZSBwcmVzZW50LgogICBoaWRlCQlDb21wbGV0ZWx5IHN0cmlwIGhpZGRlbiBmaWxlcyBmcm9tIHRoZSBmaWxlIHN5c3RlbS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcG9ydGluZyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcG9ydGluZwppbmRleCAwZjMzYzc3Li45MmI4ODhkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3BvcnRpbmcKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wb3J0aW5nCkBAIC0zNCw4ICszNCw4IEBACiAKIE1ha2UgdGhlbSAtPmFsbG9jX2lub2RlIGFuZCAtPmRlc3Ryb3lfaW5vZGUgaW4geW91ciBzdXBlcl9vcGVyYXRpb25zLgogCi1LZWVwIGluIG1pbmQgdGhhdCBub3cgeW91IG5lZWQgZXhwbGljaXQgaW5pdGlhbGl6YXRpb24gb2YgcHJpdmF0ZSBkYXRhIC0KLXR5cGljYWxseSBpbiAtPnJlYWRfaW5vZGUoKSBhbmQgYWZ0ZXIgZ2V0dGluZyBhbiBpbm9kZSBmcm9tIG5ld19pbm9kZSgpLgorS2VlcCBpbiBtaW5kIHRoYXQgbm93IHlvdSBuZWVkIGV4cGxpY2l0IGluaXRpYWxpemF0aW9uIG9mIHByaXZhdGUgZGF0YQordHlwaWNhbGx5IGJldHdlZW4gY2FsbGluZyBpZ2V0X2xvY2tlZCgpIGFuZCB1bmxvY2tpbmcgdGhlIGlub2RlLgogCiBBdCBzb21lIHBvaW50IHRoYXQgd2lsbCBiZWNvbWUgbWFuZGF0b3J5LgogCkBAIC0xNzMsMTAgKzE3MywxMCBAQAogbmV3bHkgY3JlYXRlZCBpbm9kZSB0byBhbGxvdyB0aGUgdGVzdCBmdW5jdGlvbiB0byBzdWNjZWVkLiAnZGF0YScgaXMKIHBhc3NlZCBhcyBhbiBvcGFxdWUgdmFsdWUgdG8gYm90aCB0ZXN0IGFuZCBzZXQgZnVuY3Rpb25zLgogCi1XaGVuIHRoZSBpbm9kZSBoYXMgYmVlbiBjcmVhdGVkIGJ5IGlnZXQ1X2xvY2tlZCgpLCBpdCB3aWxsIGJlIHJldHVybmVkIHdpdGgKLXRoZSBJX05FVyBmbGFnIHNldCBhbmQgd2lsbCBzdGlsbCBiZSBsb2NrZWQuIHJlYWRfaW5vZGUgaGFzIG5vdCBiZWVuCi1jYWxsZWQgc28gdGhlIGZpbGUgc3lzdGVtIHN0aWxsIGhhcyB0byBmaW5hbGl6ZSB0aGUgaW5pdGlhbGl6YXRpb24uIE9uY2UKLXRoZSBpbm9kZSBpcyBpbml0aWFsaXplZCBpdCBtdXN0IGJlIHVubG9ja2VkIGJ5IGNhbGxpbmcgdW5sb2NrX25ld19pbm9kZSgpLgorV2hlbiB0aGUgaW5vZGUgaGFzIGJlZW4gY3JlYXRlZCBieSBpZ2V0NV9sb2NrZWQoKSwgaXQgd2lsbCBiZSByZXR1cm5lZCB3aXRoIHRoZQorSV9ORVcgZmxhZyBzZXQgYW5kIHdpbGwgc3RpbGwgYmUgbG9ja2VkLiAgVGhlIGZpbGVzeXN0ZW0gdGhlbiBuZWVkcyB0byBmaW5hbGl6ZQordGhlIGluaXRpYWxpemF0aW9uLiBPbmNlIHRoZSBpbm9kZSBpcyBpbml0aWFsaXplZCBpdCBtdXN0IGJlIHVubG9ja2VkIGJ5CitjYWxsaW5nIHVubG9ja19uZXdfaW5vZGUoKS4KIAogVGhlIGZpbGVzeXN0ZW0gaXMgcmVzcG9uc2libGUgZm9yIHNldHRpbmcgKGFuZCBwb3NzaWJseSB0ZXN0aW5nKSBpX2lubwogd2hlbiBhcHByb3ByaWF0ZS4gVGhlcmUgaXMgYWxzbyBhIHNpbXBsZXIgaWdldF9sb2NrZWQgZnVuY3Rpb24gdGhhdApAQCAtMTg0LDExICsxODQsMTkgQEAKIHRlc3QgYW5kIHNldCBmb3IgeW91LgogCiBlLmcuCi0gICAgICAgaW5vZGUgPSBpZ2V0X2xvY2tlZChzYiwgaW5vKTsKLSAgICAgICBpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykgewotICAgICAgICAgICAgICAgcmVhZF9pbm9kZV9mcm9tX2Rpc2soaW5vZGUpOwotICAgICAgICAgICAgICAgdW5sb2NrX25ld19pbm9kZShpbm9kZSk7Ci0gICAgICAgfQorCWlub2RlID0gaWdldF9sb2NrZWQoc2IsIGlubyk7CisJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKKwkJZXJyID0gcmVhZF9pbm9kZV9mcm9tX2Rpc2soaW5vZGUpOworCQlpZiAoZXJyIDwgMCkgeworCQkJaWdldF9mYWlsZWQoaW5vZGUpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKwl9CisKK05vdGUgdGhhdCBpZiB0aGUgcHJvY2VzcyBvZiBzZXR0aW5nIHVwIGEgbmV3IGlub2RlIGZhaWxzLCB0aGVuIGlnZXRfZmFpbGVkKCkKK3Nob3VsZCBiZSBjYWxsZWQgb24gdGhlIGlub2RlIHRvIHJlbmRlciBpdCBkZWFkLCBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3IKK3Nob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY2FsbGVyLgogCiAtLS0KIFtyZWNvbW1lbmRlZF0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2hhcmVkc3VidHJlZS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3NoYXJlZHN1YnRyZWUudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL3NoYXJlZHN1YnRyZWUudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3NoYXJlZHN1YnRyZWUudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQKaW5kZXggOWQwMTlkMy4uODFlNWJlNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dApAQCAtMTUxLDcgKzE1MSw3IEBACiAgIGNvbnN0IGNoYXIgKmRldl9uYW1lOiB0aGUgZGV2aWNlIG5hbWUgd2UgYXJlIG1vdW50aW5nLgogCiAgIHZvaWQgKmRhdGE6IGFyYml0cmFyeSBtb3VudCBvcHRpb25zLCB1c3VhbGx5IGNvbWVzIGFzIGFuIEFTQ0lJCi0Jc3RyaW5nCisJc3RyaW5nIChzZWUgIk1vdW50IE9wdGlvbnMiIHNlY3Rpb24pCiAKICAgc3RydWN0IHZmc21vdW50ICptbnQ6IGEgdmZzLWludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgbW91bnQgcG9pbnQKIApAQCAtMTgyLDcgKzE4Miw3IEBACiAgIAltdXN0IGluaXRpYWxpemUgdGhpcyBwcm9wZXJseS4KIAogICB2b2lkICpkYXRhOiBhcmJpdHJhcnkgbW91bnQgb3B0aW9ucywgdXN1YWxseSBjb21lcyBhcyBhbiBBU0NJSQotCXN0cmluZworCXN0cmluZyAoc2VlICJNb3VudCBPcHRpb25zIiBzZWN0aW9uKQogCiAgIGludCBzaWxlbnQ6IHdoZXRoZXIgb3Igbm90IHRvIGJlIHNpbGVudCBvbiBlcnJvcgogCkBAIC0yMDMsOCArMjAzLDYgQEAKICAgICAgICAgc3RydWN0IGlub2RlICooKmFsbG9jX2lub2RlKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKICAgICAgICAgdm9pZCAoKmRlc3Ryb3lfaW5vZGUpKHN0cnVjdCBpbm9kZSAqKTsKIAotICAgICAgICB2b2lkICgqcmVhZF9pbm9kZSkgKHN0cnVjdCBpbm9kZSAqKTsKLQogICAgICAgICB2b2lkICgqZGlydHlfaW5vZGUpIChzdHJ1Y3QgaW5vZGUgKik7CiAgICAgICAgIGludCAoKndyaXRlX2lub2RlKSAoc3RydWN0IGlub2RlICosIGludCk7CiAgICAgICAgIHZvaWQgKCpwdXRfaW5vZGUpIChzdHJ1Y3QgaW5vZGUgKik7CkBAIC0yNDIsMTUgKzI0MCw2IEBACiAgIAktPmFsbG9jX2lub2RlIHdhcyBkZWZpbmVkIGFuZCBzaW1wbHkgdW5kb2VzIGFueXRoaW5nIGRvbmUgYnkKIAktPmFsbG9jX2lub2RlLgogCi0gIHJlYWRfaW5vZGU6IHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byByZWFkIGEgc3BlY2lmaWMgaW5vZGUgZnJvbSB0aGUKLSAgICAgICAgbW91bnRlZCBmaWxlc3lzdGVtLiAgVGhlIGlfaW5vIG1lbWJlciBpbiB0aGUgc3RydWN0IGlub2RlIGlzCi0JaW5pdGlhbGl6ZWQgYnkgdGhlIFZGUyB0byBpbmRpY2F0ZSB3aGljaCBpbm9kZSB0byByZWFkLiBPdGhlcgotCW1lbWJlcnMgYXJlIGZpbGxlZCBpbiBieSB0aGlzIG1ldGhvZC4KLQotCVlvdSBjYW4gc2V0IHRoaXMgdG8gTlVMTCBhbmQgdXNlIGlnZXQ1X2xvY2tlZCgpIGluc3RlYWQgb2YgaWdldCgpCi0JdG8gcmVhZCBpbm9kZXMuICBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgZmlsZXN5c3RlbXMgZm9yIHdoaWNoIHRoZQotCWlub2RlIG51bWJlciBpcyBub3Qgc3VmZmljaWVudCB0byBpZGVudGlmeSBhbiBpbm9kZS4KLQogICBkaXJ0eV9pbm9kZTogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBWRlMgdG8gbWFyayBhbiBpbm9kZSBkaXJ0eS4KIAogICB3cml0ZV9pbm9kZTogdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIFZGUyBuZWVkcyB0byB3cml0ZSBhbgpAQCAtMzAyLDE1ICsyOTEsMTYgQEAKIAogICB1bW91bnRfYmVnaW46IGNhbGxlZCB3aGVuIHRoZSBWRlMgaXMgdW5tb3VudGluZyBhIGZpbGVzeXN0ZW0uCiAKLSAgc2hvd19vcHRpb25zOiBjYWxsZWQgYnkgdGhlIFZGUyB0byBzaG93IG1vdW50IG9wdGlvbnMgZm9yIC9wcm9jLzxwaWQ+L21vdW50cy4KKyAgc2hvd19vcHRpb25zOiBjYWxsZWQgYnkgdGhlIFZGUyB0byBzaG93IG1vdW50IG9wdGlvbnMgZm9yCisJL3Byb2MvPHBpZD4vbW91bnRzLiAgKHNlZSAiTW91bnQgT3B0aW9ucyIgc2VjdGlvbikKIAogICBxdW90YV9yZWFkOiBjYWxsZWQgYnkgdGhlIFZGUyB0byByZWFkIGZyb20gZmlsZXN5c3RlbSBxdW90YSBmaWxlLgogCiAgIHF1b3RhX3dyaXRlOiBjYWxsZWQgYnkgdGhlIFZGUyB0byB3cml0ZSB0byBmaWxlc3lzdGVtIHF1b3RhIGZpbGUuCiAKLVRoZSByZWFkX2lub2RlKCkgbWV0aG9kIGlzIHJlc3BvbnNpYmxlIGZvciBmaWxsaW5nIGluIHRoZSAiaV9vcCIKLWZpZWxkLiBUaGlzIGlzIGEgcG9pbnRlciB0byBhICJzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyIgd2hpY2gKLWRlc2NyaWJlcyB0aGUgbWV0aG9kcyB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgb24gaW5kaXZpZHVhbCBpbm9kZXMuCitXaG9ldmVyIHNldHMgdXAgdGhlIGlub2RlIGlzIHJlc3BvbnNpYmxlIGZvciBmaWxsaW5nIGluIHRoZSAiaV9vcCIgZmllbGQuIFRoaXMKK2lzIGEgcG9pbnRlciB0byBhICJzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyIgd2hpY2ggZGVzY3JpYmVzIHRoZSBtZXRob2RzIHRoYXQKK2NhbiBiZSBwZXJmb3JtZWQgb24gaW5kaXZpZHVhbCBpbm9kZXMuCiAKIAogVGhlIElub2RlIE9iamVjdApAQCAtOTgwLDYgKzk3MCw0OSBAQAogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gZGVudHJ5IGxvY2tpbmcsIHBsZWFzZSByZWZlciB0byB0aGUgZG9jdW1lbnQKIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZGVudHJ5LWxvY2tpbmcudHh0LgogCitNb3VudCBPcHRpb25zCis9PT09PT09PT09PT09CisKK1BhcnNpbmcgb3B0aW9ucworLS0tLS0tLS0tLS0tLS0tCisKK09uIG1vdW50IGFuZCByZW1vdW50IHRoZSBmaWxlc3lzdGVtIGlzIHBhc3NlZCBhIHN0cmluZyBjb250YWluaW5nIGEKK2NvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIG1vdW50IG9wdGlvbnMuICBUaGUgb3B0aW9ucyBjYW4gaGF2ZSBlaXRoZXIgb2YKK3RoZXNlIGZvcm1zOgorCisgIG9wdGlvbgorICBvcHRpb249dmFsdWUKKworVGhlIDxsaW51eC9wYXJzZXIuaD4gaGVhZGVyIGRlZmluZXMgYW4gQVBJIHRoYXQgaGVscHMgcGFyc2UgdGhlc2UKK29wdGlvbnMuICBUaGVyZSBhcmUgcGxlbnR5IG9mIGV4YW1wbGVzIG9uIGhvdyB0byB1c2UgaXQgaW4gZXhpc3RpbmcKK2ZpbGVzeXN0ZW1zLgorCitTaG93aW5nIG9wdGlvbnMKKy0tLS0tLS0tLS0tLS0tLQorCitJZiBhIGZpbGVzeXN0ZW0gYWNjZXB0cyBtb3VudCBvcHRpb25zLCBpdCBtdXN0IGRlZmluZSBzaG93X29wdGlvbnMoKQordG8gc2hvdyBhbGwgdGhlIGN1cnJlbnRseSBhY3RpdmUgb3B0aW9ucy4gIFRoZSBydWxlcyBhcmU6CisKKyAgLSBvcHRpb25zIE1VU1QgYmUgc2hvd24gd2hpY2ggYXJlIG5vdCBkZWZhdWx0IG9yIHRoZWlyIHZhbHVlcyBkaWZmZXIKKyAgICBmcm9tIHRoZSBkZWZhdWx0CisKKyAgLSBvcHRpb25zIE1BWSBiZSBzaG93biB3aGljaCBhcmUgZW5hYmxlZCBieSBkZWZhdWx0IG9yIGhhdmUgdGhlaXIKKyAgICBkZWZhdWx0IHZhbHVlCisKK09wdGlvbnMgdXNlZCBvbmx5IGludGVybmFsbHkgYmV0d2VlbiBhIG1vdW50IGhlbHBlciBhbmQgdGhlIGtlcm5lbAorKHN1Y2ggYXMgZmlsZSBkZXNjcmlwdG9ycyksIG9yIHdoaWNoIG9ubHkgaGF2ZSBhbiBlZmZlY3QgZHVyaW5nIHRoZQorbW91bnRpbmcgKHN1Y2ggYXMgb25lcyBjb250cm9sbGluZyB0aGUgY3JlYXRpb24gb2YgYSBqb3VybmFsKSBhcmUgZXhlbXB0Citmcm9tIHRoZSBhYm92ZSBydWxlcy4KKworVGhlIHVuZGVybHlpbmcgcmVhc29uIGZvciB0aGUgYWJvdmUgcnVsZXMgaXMgdG8gbWFrZSBzdXJlLCB0aGF0IGEKK21vdW50IGNhbiBiZSBhY2N1cmF0ZWx5IHJlcGxpY2F0ZWQgKGUuZy4gdW1vdW50aW5nIGFuZCBtb3VudGluZyBhZ2FpbikKK2Jhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiBmb3VuZCBpbiAvcHJvYy9tb3VudHMuCisKK0Egc2ltcGxlIG1ldGhvZCBvZiBzYXZpbmcgb3B0aW9ucyBhdCBtb3VudC9yZW1vdW50IHRpbWUgYW5kIHNob3dpbmcKK3RoZW0gaXMgcHJvdmlkZWQgd2l0aCB0aGUgc2F2ZV9tb3VudF9vcHRpb25zKCkgYW5kCitnZW5lcmljX3Nob3dfb3B0aW9ucygpIGhlbHBlciBmdW5jdGlvbnMuICBQbGVhc2Ugbm90ZSwgdGhhdCB1c2luZwordGhlc2UgbWF5IGhhdmUgZHJhd2JhY2tzLiAgRm9yIG1vcmUgaW5mbyBzZWUgaGVhZGVyIGNvbW1lbnRzIGZvciB0aGVzZQorZnVuY3Rpb25zIGluIGZzL25hbWVzcGFjZS5jLgogCiBSZXNvdXJjZXMKID09PT09PT09PQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9hZHM3ODI4IGIvRG9jdW1lbnRhdGlvbi9od21vbi9hZHM3ODI4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YmM0YmUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2Fkczc4MjgKQEAgLTAsMCArMSwzNiBAQAorS2VybmVsIGRyaXZlciBhZHM3ODI4Cis9PT09PT09PT09PT09PT09PT09PT0KKworU3VwcG9ydGVkIGNoaXBzOgorICAqIFRleGFzIEluc3RydW1lbnRzL0J1cnItQnJvd24gQURTNzgyOAorICAgIFByZWZpeDogJ2Fkczc4MjgnCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IEkyQyAweDQ4LCAweDQ5LCAweDRhLCAweDRiCisgICAgRGF0YXNoZWV0OiBQdWJsaWNseSBhdmFpbGFibGUgYXQgdGhlIFRleGFzIEluc3RydW1lbnRzIHdlYnNpdGUgOgorICAgICAgICAgICAgICAgaHR0cDovL2ZvY3VzLnRpLmNvbS9saXQvZHMvc3ltbGluay9hZHM3ODI4LnBkZgorCitBdXRob3JzOgorICAgICAgICBTdGV2ZSBIYXJkeSA8c3RldmVAbGludXhyZWFsdGltZS5jby51az4KKworTW9kdWxlIFBhcmFtZXRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKyogc2VfaW5wdXQ6IGJvb2wgKGRlZmF1bHQgWSkKKyAgU2luZ2xlIGVuZGVkIG9wZXJhdGlvbiAtIHNldCB0byBOIGZvciBkaWZmZXJlbnRpYWwgbW9kZQorKiBpbnRfdnJlZjogYm9vbCAoZGVmYXVsdCBZKQorICBPcGVyYXRlIHdpdGggdGhlIGludGVybmFsIDIuNVYgcmVmZXJlbmNlIC0gc2V0IHRvIE4gZm9yIGV4dGVybmFsIHJlZmVyZW5jZQorKiB2cmVmX212OiBpbnQgKGRlZmF1bHQgMjUwMCkKKyAgSWYgdXNpbmcgYW4gZXh0ZXJuYWwgcmVmZXJlbmNlLCBzZXQgdGhpcyB0byB0aGUgcmVmZXJlbmNlIHZvbHRhZ2UgaW4gbVYKKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK1RoaXMgZHJpdmVyIGltcGxlbWVudHMgc3VwcG9ydCBmb3IgdGhlIFRleGFzIEluc3RydW1lbnRzIEFEUzc4MjguCisKK1RoaXMgZGV2aWNlIGlzIGEgMTItYml0IDgtY2hhbm5lbCBBLUQgY29udmVydGVyLgorCitJdCBjYW4gb3BlcmF0ZSBpbiBzaW5nbGUgZW5kZWQgbW9kZSAoOCArdmUgaW5wdXRzKSBvciBpbiBkaWZmZXJlbnRpYWwgbW9kZSwKK3doZXJlIDQgZGlmZmVyZW50aWFsIHBhaXJzIGNhbiBiZSBtZWFzdXJlZC4KKworVGhlIGNoaXAgYWxzbyBoYXMgdGhlIGZhY2lsaXR5IHRvIHVzZSBhbiBleHRlcm5hbCB2b2x0YWdlIHJlZmVyZW5jZS4gIFRoaXMKK21heSBiZSByZXF1aXJlZCBpZiB5b3VyIGhhcmR3YXJlIHN1cHBsaWVzIHRoZSBBRFM3ODI4IGZyb20gYSA1ViBzdXBwbHksIHNlZQordGhlIGRhdGFzaGVldCBmb3IgbW9yZSBkZXRhaWxzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9pdDg3IGIvRG9jdW1lbnRhdGlvbi9od21vbi9pdDg3CmluZGV4IDViNzA0YTQuLmY0Y2UxZmQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vaXQ4NworKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2l0ODcKQEAgLTMwLDcgKzMwLDcgQEAKICAgICBEYXRhc2hlZXQ6IE5vIGxvbmdlciBiZSBhdmFpbGFibGUKIAogQXV0aG9yczoKLSAgICBDaHJpc3RvcGhlIEdhdXRocm9uIDxjaHJpc2dAMC1pbi5jb20+CisgICAgQ2hyaXN0b3BoZSBHYXV0aHJvbgogICAgIEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgogCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vbG03OCBiL0RvY3VtZW50YXRpb24vaHdtb24vbG03OAppbmRleCBkZmMzMThhLi42MDkzMmUyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtNzgKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTc4CkBAIC00LDEyICs0LDEyIEBACiBTdXBwb3J0ZWQgY2hpcHM6CiAgICogTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc4IC8gTE03OC1KCiAgICAgUHJlZml4OiAnbG03OCcKLSAgICBBZGRyZXNzZXMgc2Nhbm5lZDogSTJDIDB4MjAgLSAweDJmLCBJU0EgMHgyOTAgKDggSS9PIHBvcnRzKQorICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJMkMgMHgyOCAtIDB4MmYsIElTQSAweDI5MCAoOCBJL08gcG9ydHMpCiAgICAgRGF0YXNoZWV0OiBQdWJsaWNseSBhdmFpbGFibGUgYXQgdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3Igd2Vic2l0ZQogICAgICAgICAgICAgICAgaHR0cDovL3d3dy5uYXRpb25hbC5jb20vCiAgICogTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc5CiAgICAgUHJlZml4OiAnbG03OScKLSAgICBBZGRyZXNzZXMgc2Nhbm5lZDogSTJDIDB4MjAgLSAweDJmLCBJU0EgMHgyOTAgKDggSS9PIHBvcnRzKQorICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJMkMgMHgyOCAtIDB4MmYsIElTQSAweDI5MCAoOCBJL08gcG9ydHMpCiAgICAgRGF0YXNoZWV0OiBQdWJsaWNseSBhdmFpbGFibGUgYXQgdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3Igd2Vic2l0ZQogICAgICAgICAgICAgICAgaHR0cDovL3d3dy5uYXRpb25hbC5jb20vCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vbG04NyBiL0RvY3VtZW50YXRpb24vaHdtb24vbG04NwppbmRleCBjOTUyYzU3Li5lYzI3YWExIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtODcKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTg3CkBAIC00LDggKzQsMTIgQEAKIFN1cHBvcnRlZCBjaGlwczoKICAgKiBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODcKICAgICBQcmVmaXg6ICdsbTg3JwotICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJMkMgMHgyYyAtIDB4MmYKKyAgICBBZGRyZXNzZXMgc2Nhbm5lZDogSTJDIDB4MmMgLSAweDJlCiAgICAgRGF0YXNoZWV0OiBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9wZi9MTS9MTTg3Lmh0bWwKKyAgKiBBbmFsb2cgRGV2aWNlcyBBRE0xMDI0CisgICAgUHJlZml4OiAnYWRtMTAyNCcKKyAgICBBZGRyZXNzZXMgc2Nhbm5lZDogSTJDIDB4MmMgLSAweDJlCisgICAgRGF0YXNoZWV0OiBodHRwOi8vd3d3LmFuYWxvZy5jb20vZW4vcHJvZC8wLDI4NzcsQURNMTAyNCwwMC5odG1sCiAKIEF1dGhvcnM6CiAgICAgICAgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sCkBAIC0xOSwxMSArMjMsMTIgQEAKIERlc2NyaXB0aW9uCiAtLS0tLS0tLS0tLQogCi1UaGlzIGRyaXZlciBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODcuCitUaGlzIGRyaXZlciBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODcKK2FuZCB0aGUgQW5hbG9nIERldmljZXMgQURNMTAyNC4KIAogVGhlIExNODcgaW1wbGVtZW50cyB1cCB0byB0aHJlZSB0ZW1wZXJhdHVyZSBzZW5zb3JzLCB1cCB0byB0d28gZmFuCiByb3RhdGlvbiBzcGVlZCBzZW5zb3JzLCB1cCB0byBzZXZlbiB2b2x0YWdlIHNlbnNvcnMsIGFsYXJtcywgYW5kIHNvbWUKLW1pc2NlbGxhbmVvdXMgc3R1ZmYuCittaXNjZWxsYW5lb3VzIHN0dWZmLiBUaGUgQURNMTAyNCBpcyBmdWxseSBjb21wYXRpYmxlLgogCiBUZW1wZXJhdHVyZXMgYXJlIG1lYXN1cmVkIGluIGRlZ3JlZXMgQ2Vsc2l1cy4gRWFjaCBpbnB1dCBoYXMgYSBoaWdoCiBhbmQgbG93IGFsYXJtIHNldHRpbmdzLiBBIGhpZ2ggbGltaXQgcHJvZHVjZXMgYW4gYWxhcm0gd2hlbiB0aGUgdmFsdWUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vdXNlcnNwYWNlLXRvb2xzIGIvRG9jdW1lbnRhdGlvbi9od21vbi91c2Vyc3BhY2UtdG9vbHMKaW5kZXggMTk5MDBhOC4uOTg2NWFlZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi91c2Vyc3BhY2UtdG9vbHMKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi91c2Vyc3BhY2UtdG9vbHMKQEAgLTE0LDcgKzE0LDcgQEAKIAogQ29yZSBzZXQgb2YgdXRpbGl0aWVzIHRoYXQgd2lsbCBhbGxvdyB5b3UgdG8gb2J0YWluIGhlYWx0aCBpbmZvcm1hdGlvbiwKIHNldHVwIG1vbml0b3JpbmcgbGltaXRzIGV0Yy4gWW91IGNhbiBnZXQgdGhlbSBvbiB0aGVpciBob21lcGFnZQotaHR0cDovL3d3dy5sbS1zZW5zb3JzLm51LyBvciBhcyBhIHBhY2thZ2UgZnJvbSB5b3VyIExpbnV4IGRpc3RyaWJ1dGlvbi4KK2h0dHA6Ly93d3cubG0tc2Vuc29ycy5vcmcvIG9yIGFzIGEgcGFja2FnZSBmcm9tIHlvdXIgTGludXggZGlzdHJpYnV0aW9uLgogCiBJZiBmcm9tIHdlYnNpdGU6CiBHZXQgbG0tc2Vuc29ycyBmcm9tIHByb2plY3Qgd2ViIHNpdGUuIFBsZWFzZSBub3RlLCB5b3UgbmVlZCBvbmx5IHVzZXJzcGFjZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi93ODM2MjdlaGYgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4MzYyN2VoZgppbmRleCBjY2MyYmNiLi5kNmUxYWUzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4MzYyN2VoZgorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4MzYyN2VoZgpAQCAtMjMsOCArMjMsOSBAQAogCiBUaGUgY2hpcHMgaW1wbGVtZW50IHRocmVlIHRlbXBlcmF0dXJlIHNlbnNvcnMsIGZpdmUgZmFuIHJvdGF0aW9uCiBzcGVlZCBzZW5zb3JzLCB0ZW4gYW5hbG9nIHZvbHRhZ2Ugc2Vuc29ycyAob25seSBuaW5lIGZvciB0aGUgNjI3REhHKSwgb25lCi1WSUQgKDYgcGlucyksIGFsYXJtcyB3aXRoIGJlZXAgd2FybmluZ3MgKGNvbnRyb2wgdW5pbXBsZW1lbnRlZCksIGFuZAotc29tZSBhdXRvbWF0aWMgZmFuIHJlZ3VsYXRpb24gc3RyYXRlZ2llcyAocGx1cyBtYW51YWwgZmFuIGNvbnRyb2wgbW9kZSkuCitWSUQgKDYgcGlucyBmb3IgdGhlIDYyN0VIRi9FSEcsIDggcGlucyBmb3IgdGhlIDYyN0RIRyksIGFsYXJtcyB3aXRoIGJlZXAKK3dhcm5pbmdzIChjb250cm9sIHVuaW1wbGVtZW50ZWQpLCBhbmQgc29tZSBhdXRvbWF0aWMgZmFuIHJlZ3VsYXRpb24KK3N0cmF0ZWdpZXMgKHBsdXMgbWFudWFsIGZhbiBjb250cm9sIG1vZGUpLgogCiBUZW1wZXJhdHVyZXMgYXJlIG1lYXN1cmVkIGluIGRlZ3JlZXMgQ2Vsc2l1cyBhbmQgbWVhc3VyZW1lbnQgcmVzb2x1dGlvbiBpcyAxCiBkZWdDIGZvciB0ZW1wMSBhbmQgMC41IGRlZ0MgZm9yIHRlbXAyIGFuZCB0ZW1wMy4gQW4gYWxhcm0gaXMgdHJpZ2dlcmVkIHdoZW4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNjI3aGYgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4MzYyN2hmCmluZGV4IDc5MjIzMTkuLjg4MGE1OWYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNjI3aGYKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi93ODM2MjdoZgpAQCAtNzMsNSArNzMsNCBAQAogCiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiBvbiB0aGlzIGRyaXZlciBzZWUgdGhlIHc4Mzc4MWQgZHJpdmVyIGRvY3VtZW50YXRpb24uCiAKLVsxXSBodHRwOi8vd3d3Mi5sbS1zZW5zb3JzLm51L35sbTc4L2N2cy9icm93c2UuY2dpL2xtX3NlbnNvcnMyL2RvYy92aWQKLQorWzFdIGh0dHA6Ly93d3cubG0tc2Vuc29ycy5vcmcvYnJvd3Nlci9sbS1zZW5zb3JzL3RydW5rL2RvYy92aWQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNzgxZCBiL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNzgxZAppbmRleCBiMWU5ZjgwLi42ZjgwMGEwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4Mzc4MWQKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi93ODM3ODFkCkBAIC00LDIwICs0LDE2IEBACiBTdXBwb3J0ZWQgY2hpcHM6CiAgICogV2luYm9uZCBXODM3ODFECiAgICAgUHJlZml4OiAndzgzNzgxZCcKLSAgICBBZGRyZXNzZXMgc2Nhbm5lZDogSTJDIDB4MjAgLSAweDJmLCBJU0EgMHgyOTAgKDggSS9PIHBvcnRzKQorICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJMkMgMHgyOCAtIDB4MmYsIElTQSAweDI5MCAoOCBJL08gcG9ydHMpCiAgICAgRGF0YXNoZWV0OiBodHRwOi8vd3d3LndpbmJvbmQtdXNhLmNvbS9wcm9kdWN0cy93aW5ib25kX3Byb2R1Y3RzL3BkZnMvUENJQy93ODM3ODFkLnBkZgogICAqIFdpbmJvbmQgVzgzNzgyRAogICAgIFByZWZpeDogJ3c4Mzc4MmQnCi0gICAgQWRkcmVzc2VzIHNjYW5uZWQ6IEkyQyAweDIwIC0gMHgyZiwgSVNBIDB4MjkwICg4IEkvTyBwb3J0cykKKyAgICBBZGRyZXNzZXMgc2Nhbm5lZDogSTJDIDB4MjggLSAweDJmLCBJU0EgMHgyOTAgKDggSS9PIHBvcnRzKQogICAgIERhdGFzaGVldDogaHR0cDovL3d3dy53aW5ib25kLmNvbS9QREYvc2hlZXQvdzgzNzgyZC5wZGYKICAgKiBXaW5ib25kIFc4Mzc4M1MKICAgICBQcmVmaXg6ICd3ODM3ODNzJwogICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJMkMgMHgyZAogICAgIERhdGFzaGVldDogaHR0cDovL3d3dy53aW5ib25kLXVzYS5jb20vcHJvZHVjdHMvd2luYm9uZF9wcm9kdWN0cy9wZGZzL1BDSUMvdzgzNzgzcy5wZGYKLSAgKiBXaW5ib25kIFc4MzYyN0hGCi0gICAgUHJlZml4OiAndzgzNjI3aGYnCi0gICAgQWRkcmVzc2VzIHNjYW5uZWQ6IEkyQyAweDIwIC0gMHgyZiwgSVNBIDB4MjkwICg4IEkvTyBwb3J0cykKLSAgICBEYXRhc2hlZXQ6IGh0dHA6Ly93d3cud2luYm9uZC5jb20vUERGL3NoZWV0L3c4MzYyN2hmLnBkZgogICAqIEFzdXMgQVM5OTEyN0YKICAgICBQcmVmaXg6ICdhczk5MTI3ZicKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogSTJDIDB4MjggLSAweDJmCkBAIC01MCwyMCArNDYsMTggQEAKIERlc2NyaXB0aW9uCiAtLS0tLS0tLS0tLQogCi1UaGlzIGRyaXZlciBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIHRoZSBXaW5ib25kIFc4Mzc4MUQsIFc4Mzc4MkQsIFc4Mzc4M1MsCi1XODM2MjdIRiBjaGlwcywgYW5kIHRoZSBBc3VzIEFTOTkxMjdGIGNoaXBzLiBXZSB3aWxsIHJlZmVyIHRvIHRoZW0KLWNvbGxlY3RpdmVseSBhcyBXODM3OCogY2hpcHMuCitUaGlzIGRyaXZlciBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIHRoZSBXaW5ib25kIFc4Mzc4MUQsIFc4Mzc4MkQsIFc4Mzc4M1MKK2NoaXBzLCBhbmQgdGhlIEFzdXMgQVM5OTEyN0YgY2hpcHMuIFdlIHdpbGwgcmVmZXIgdG8gdGhlbSBjb2xsZWN0aXZlbHkgYXMKK1c4Mzc4KiBjaGlwcy4KIAogVGhlcmUgaXMgcXVpdGUgc29tZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlc2UgY2hpcHMsIGJ1dCB0aGV5IGFyZSBzaW1pbGFyCiBlbm91Z2ggdGhhdCBpdCB3YXMgc2Vuc2libGUgdG8gcHV0IHRoZW0gdG9nZXRoZXIgaW4gb25lIGRyaXZlci4KLVRoZSBXODM2MjdIRiBjaGlwIGlzIGFzc3VtZWQgdG8gYmUgaWRlbnRpY2FsIHRvIHRoZSBJU0EgVzgzNzgyRC4KIFRoZSBBc3VzIGNoaXBzIGFyZSBzaW1pbGFyIHRvIGFuIEkyQy1vbmx5IFc4Mzc4MkQuCiAKIENoaXAgICAgICAgICN2aW4gICAgI2ZhbmluICAjcHdtICAgICN0ZW1wICAgd2NoaXBpZCB2ZW5kaWQgIGkyYyAgICAgSVNBCiBhczk5MTI3ZiAgICA3ICAgICAgIDMgICAgICAgMCAgICAgICAzICAgICAgIDB4MzEgICAgMHgxMmMzICB5ZXMgICAgIG5vCiBhczk5MTI3ZiByZXYuMiAodHlwZV9uYW1lID0gYXM5OTEyN2YpICAgICAgIDB4MzEgICAgMHg1Y2EzICB5ZXMgICAgIG5vCiB3ODM3ODFkICAgICA3ICAgICAgIDMgICAgICAgMCAgICAgICAzICAgICAgIDB4MTAtMSAgMHg1Y2EzICB5ZXMgICAgIHllcwotdzgzNjI3aGYgICAgOSAgICAgICAzICAgICAgIDIgICAgICAgMyAgICAgICAweDIxICAgIDB4NWNhMyAgeWVzICAgICB5ZXMoTFBDKQogdzgzNzgyZCAgICAgOSAgICAgICAzICAgICAgIDItNCAgICAgMyAgICAgICAweDMwICAgIDB4NWNhMyAgeWVzICAgICB5ZXMKIHc4Mzc4M3MgICAgIDUtNiAgICAgMyAgICAgICAyICAgICAgIDEtMiAgICAgMHg0MCAgICAweDVjYTMgIHllcyAgICAgbm8KIApAQCAtMTQzLDkgKzEzNyw5IEBACiAweDAwMDQwMDogaW42CiAweDAwMDgwMDogZmFuMwogMHgwMDEwMDA6IGNoYXNzaXMKLTB4MDAyMDAwOiB0ZW1wMyAoVzgzNzgyRCBhbmQgVzgzNjI3SEYgb25seSkKLTB4MDEwMDAwOiBpbjcgKFc4Mzc4MkQgYW5kIFc4MzYyN0hGIG9ubHkpCi0weDAyMDAwMDogaW44IChXODM3ODJEIGFuZCBXODM2MjdIRiBvbmx5KQorMHgwMDIwMDA6IHRlbXAzIChXODM3ODJEIG9ubHkpCisweDAxMDAwMDogaW43IChXODM3ODJEIG9ubHkpCisweDAyMDAwMDogaW44IChXODM3ODJEIG9ubHkpCiAKIElmIGFuIGFsYXJtIHRyaWdnZXJzLCBpdCB3aWxsIHJlbWFpbiB0cmlnZ2VyZWQgdW50aWwgdGhlIGhhcmR3YXJlIHJlZ2lzdGVyCiBpcyByZWFkIGF0IGxlYXN0IG9uY2UuIFRoaXMgbWVhbnMgdGhhdCB0aGUgY2F1c2UgZm9yIHRoZSBhbGFybSBtYXkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vdzgzbDc4Nm5nIGIvRG9jdW1lbnRhdGlvbi9od21vbi93ODNsNzg2bmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmNTVkNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vdzgzbDc4Nm5nCkBAIC0wLDAgKzEsNTQgQEAKK0tlcm5lbCBkcml2ZXIgdzgzbDc4Nm5nCis9PT09PT09PT09PT09PT09PT09PT0KKworU3VwcG9ydGVkIGNoaXBzOgorICAqIFdpbmJvbmQgVzgzTDc4Nk5HL1c4M0w3ODZOUgorICAgIFByZWZpeDogJ3c4M2w3ODZuZycKKyAgICBBZGRyZXNzZXMgc2Nhbm5lZDogSTJDIDB4MmUgLSAweDJmCisgICAgRGF0YXNoZWV0OiBodHRwOi8vd3d3LndpbmJvbmQtdXNhLmNvbS9wcm9kdWN0cy93aW5ib25kX3Byb2R1Y3RzL3BkZnMvUENJQy9XODNMNzg2TlJORzA5LnBkZgorCitBdXRob3I6IEtldmluIExvIDxrZXZsb0BrZXZsby5vcmc+CisKKworTW9kdWxlIFBhcmFtZXRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKyogcmVzZXQgYm9vbGVhbgorICAoZGVmYXVsdCAwKQorICBVc2UgJ3Jlc2V0PTEnIHRvIHJlc2V0IHRoZSBjaGlwICh2aWEgaW5kZXggMHg0MCwgYml0IDcpLiBUaGUgZGVmYXVsdAorICBiZWhhdmlvciBpcyBubyBjaGlwIHJlc2V0IHRvIHByZXNlcnZlIEJJT1Mgc2V0dGluZ3MKKworCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworVGhpcyBkcml2ZXIgaW1wbGVtZW50cyBzdXBwb3J0IGZvciBXaW5ib25kIFc4M0w3ODZORy9XODNMNzg2TlIgY2hpcHMuCisKK1RoZSBkcml2ZXIgaW1wbGVtZW50cyB0d28gdGVtcGVyYXR1cmUgc2Vuc29ycywgdHdvIGZhbiByb3RhdGlvbiBzcGVlZAorc2Vuc29ycywgYW5kIHRocmVlIHZvbHRhZ2Ugc2Vuc29ycy4KKworVGVtcGVyYXR1cmVzIGFyZSBtZWFzdXJlZCBpbiBkZWdyZWVzIENlbHNpdXMgYW5kIG1lYXN1cmVtZW50IHJlc29sdXRpb24gaXMgMQorZGVnQyBmb3IgdGVtcDEgYW5kIHRlbXAyLgorCitGYW4gcm90YXRpb24gc3BlZWRzIGFyZSByZXBvcnRlZCBpbiBSUE0gKHJvdGF0aW9ucyBwZXIgbWludXRlKS4gRmFuIHJlYWRpbmdzCityZWFkaW5ncyBjYW4gYmUgZGl2aWRlZCBieSBhIHByb2dyYW1tYWJsZSBkaXZpZGVyICgxLCAyLCA0LCA4LCAxNiwgMzIsIDY0CitvciAxMjggZm9yIGZhbiAxLzIpIHRvIGdpdmUgdGhlIHJlYWRpbmdzIG1vcmUgcmFuZ2Ugb3IgYWNjdXJhY3kuCisKK1ZvbHRhZ2Ugc2Vuc29ycyAoYWxzbyBrbm93biBhcyBJTiBzZW5zb3JzKSByZXBvcnQgdGhlaXIgdmFsdWVzIGluIG1pbGxpdm9sdHMuCitBbiBhbGFybSBpcyB0cmlnZ2VyZWQgaWYgdGhlIHZvbHRhZ2UgaGFzIGNyb3NzZWQgYSBwcm9ncmFtbWFibGUgbWluaW11bQorb3IgbWF4aW11bSBsaW1pdC4KKworL3N5cyBmaWxlcworLS0tLS0tLS0tLQorCitwd21bMS0yXSAtIHRoaXMgZmlsZSBzdG9yZXMgUFdNIGR1dHkgY3ljbGUgb3IgREMgdmFsdWUgKGZhbiBzcGVlZCkgaW4gcmFuZ2U6CisJICAgIDAgKHN0b3ApIHRvIDI1NSAoZnVsbCkKK3B3bVsxLTJdX2VuYWJsZSAtIHRoaXMgZmlsZSBjb250cm9scyBtb2RlIG9mIGZhbi90ZW1wZXJhdHVyZSBjb250cm9sOgorICAgICAgICAgICAgKiAwIE1hbnVhbCBNb2RlCisgICAgICAgICAgICAqIDEgVGhlcm1hbCBDcnVpc2UKKyAgICAgICAgICAgICogMiBTbWFydCBGYW4gSUkKKyAgICAgICAgICAgICogNCBGQU5fU0VUCitwd21bMS0yXV9tb2RlIC0gU2VsZWN0IFBXTSBvZiBEQyBtb2RlCisgICAgICAgICAgICAqIDAgREMKKyAgICAgICAgICAgICogMSBQV00KK3RvbGVyYW5jZVsxLTJdIC0gVmFsdWUgaW4gZGVncmVlcyBvZiBDZWxzaXVzIChkZWdDKSBmb3IgKy0gVApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy1waWl4NCBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtcGlpeDQKaW5kZXggY2Y2YjZjYi4uZWYxZWZhNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy1waWl4NAorKysgYi9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLXBpaXg0CkBAIC05NSw0ICs5NSw0IEBACiB0aGUgU01CdXMgb24gYWxsIElCTSBzeXN0ZW1zIChkZXRlY3RlZCB1c2luZyBETUkgZGF0YS4pCiAKIEZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCByZWFkOgotaHR0cDovL3d3dzIubG0tc2Vuc29ycy5udS9+bG03OC9jdnMvbG1fc2Vuc29yczIvUkVBRE1FLnRoaW5rcGFkCitodHRwOi8vd3d3LmxtLXNlbnNvcnMub3JnL2Jyb3dzZXIvbG0tc2Vuc29ycy90cnVuay9SRUFETUUudGhpbmtwYWQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW5wdXQvaW5wdXQtcHJvZ3JhbW1pbmcudHh0IGIvRG9jdW1lbnRhdGlvbi9pbnB1dC9pbnB1dC1wcm9ncmFtbWluZy50eHQKaW5kZXggNDdmYzg2OC4uODE5MDVlOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pbnB1dC9pbnB1dC1wcm9ncmFtbWluZy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9pbnB1dC9pbnB1dC1wcm9ncmFtbWluZy50eHQKQEAgLTIyLDcgKzIyLDcgQEAKIAogc3RhdGljIHZvaWQgYnV0dG9uX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkdW1teSwgc3RydWN0IHB0X3JlZ3MgKmZwKQogewotCWlucHV0X3JlcG9ydF9rZXkoYnV0dG9uX2RldiwgQlROXzEsIGluYihCVVRUT05fUE9SVCkgJiAxKTsKKwlpbnB1dF9yZXBvcnRfa2V5KGJ1dHRvbl9kZXYsIEJUTl8wLCBpbmIoQlVUVE9OX1BPUlQpICYgMSk7CiAJaW5wdXRfc3luYyhidXR0b25fZGV2KTsKIH0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pb3N0YXRzLnR4dCBiL0RvY3VtZW50YXRpb24vaW9zdGF0cy50eHQKaW5kZXggYjk2M2MzYi4uNTkyNWMzYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pb3N0YXRzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lvc3RhdHMudHh0CkBAIC01OCw3ICs1OCw3IEBACiBFYWNoIHNldCBvZiBzdGF0cyBvbmx5IGFwcGxpZXMgdG8gdGhlIGluZGljYXRlZCBkZXZpY2U7IGlmIHlvdSB3YW50CiBzeXN0ZW0td2lkZSBzdGF0cyB5b3UnbGwgaGF2ZSB0byBmaW5kIGFsbCB0aGUgZGV2aWNlcyBhbmQgc3VtIHRoZW0gYWxsIHVwLgogCi1GaWVsZCAgMSAtLSAjIG9mIHJlYWRzIGlzc3VlZAorRmllbGQgIDEgLS0gIyBvZiByZWFkcyBjb21wbGV0ZWQKICAgICBUaGlzIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgcmVhZHMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KIEZpZWxkICAyIC0tICMgb2YgcmVhZHMgbWVyZ2VkLCBmaWVsZCA2IC0tICMgb2Ygd3JpdGVzIG1lcmdlZAogICAgIFJlYWRzIGFuZCB3cml0ZXMgd2hpY2ggYXJlIGFkamFjZW50IHRvIGVhY2ggb3RoZXIgbWF5IGJlIG1lcmdlZCBmb3IKQEAgLTEzMiw2ICsxMzIsMTkgQEAKIG9mIHF1ZXVpbmcgZm9yIHBhcnRpdGlvbnMsIGFuZCBhdCBjb21wbGV0aW9uIGZvciB3aG9sZSBkaXNrcy4gIFRoaXMgaXMKIGEgc3VidGxlIGRpc3RpbmN0aW9uIHRoYXQgaXMgcHJvYmFibHkgdW5pbnRlcmVzdGluZyBmb3IgbW9zdCBjYXNlcy4KIAorTW9yZSBzaWduaWZpY2FudCBpcyB0aGUgZXJyb3IgaW5kdWNlZCBieSBjb3VudGluZyB0aGUgbnVtYmVycyBvZgorcmVhZHMvd3JpdGVzIGJlZm9yZSBtZXJnZXMgZm9yIHBhcnRpdGlvbnMgYW5kIGFmdGVyIGZvciBkaXNrcy4gU2luY2UgYQordHlwaWNhbCB3b3JrbG9hZCB1c3VhbGx5IGNvbnRhaW5zIGEgbG90IG9mIHN1Y2Nlc3NpdmUgYW5kIGFkamFjZW50IHJlcXVlc3RzLAordGhlIG51bWJlciBvZiByZWFkcy93cml0ZXMgaXNzdWVkIGNhbiBiZSBzZXZlcmFsIHRpbWVzIGhpZ2hlciB0aGFuIHRoZQorbnVtYmVyIG9mIHJlYWRzL3dyaXRlcyBjb21wbGV0ZWQuCisKK0luIDIuNi4yNSwgdGhlIGZ1bGwgc3RhdGlzdGljIHNldCBpcyBhZ2FpbiBhdmFpbGFibGUgZm9yIHBhcnRpdGlvbnMgYW5kCitkaXNrIGFuZCBwYXJ0aXRpb24gc3RhdGlzdGljcyBhcmUgY29uc2lzdGVudCBhZ2Fpbi4gU2luY2Ugd2Ugc3RpbGwgZG9uJ3QKK2tlZXAgcmVjb3JkIG9mIHRoZSBwYXJ0aXRpb24tcmVsYXRpdmUgYWRkcmVzcywgYW4gb3BlcmF0aW9uIGlzIGF0dHJpYnV0ZWQgdG8KK3RoZSBwYXJ0aXRpb24gd2hpY2ggY29udGFpbnMgdGhlIGZpcnN0IHNlY3RvciBvZiB0aGUgcmVxdWVzdCBhZnRlciB0aGUKK2V2ZW50dWFsIG1lcmdlcy4gQXMgcmVxdWVzdHMgY2FuIGJlIG1lcmdlZCBhY3Jvc3MgcGFydGl0aW9uLCB0aGlzIGNvdWxkIGxlYWQKK3RvIHNvbWUgKHByb2JhYmx5IGluc2lnbmlmaWNhbnQpIGlubmFjdXJhY3kuCisKIEFkZGl0aW9uYWwgbm90ZXMKIC0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCA4ZmQ1YWE0Li5hNGZjN2ZjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dApAQCAtMTQ3LDggKzE0NywxMCBAQAogCQkJZGVmYXVsdDogMAogCiAJYWNwaV9zbGVlcD0JW0hXLEFDUEldIFNsZWVwIG9wdGlvbnMKLQkJCUZvcm1hdDogeyBzM19iaW9zLCBzM19tb2RlIH0KLQkJCVNlZSBEb2N1bWVudGF0aW9uL3Bvd2VyL3ZpZGVvLnR4dAorCQkJRm9ybWF0OiB7IHMzX2Jpb3MsIHMzX21vZGUsIHMzX2JlZXAgfQorCQkJU2VlIERvY3VtZW50YXRpb24vcG93ZXIvdmlkZW8udHh0IGZvciBzM19iaW9zIGFuZCBzM19tb2RlLgorCQkJczNfYmVlcCBpcyBmb3IgZGVidWdnaW5nOyBpdCBtYWtlcyB0aGUgUEMncyBzcGVha2VyIGJlZXAKKwkJCWFzIHNvb24gYXMgdGhlIGtlcm5lbCdzIHJlYWwtbW9kZSBlbnRyeSBwb2ludCBpcyBjYWxsZWQuCiAKIAlhY3BpX3NjaT0JW0hXLEFDUEldIEFDUEkgU3lzdGVtIENvbnRyb2wgSW50ZXJydXB0IHRyaWdnZXIgbW9kZQogCQkJRm9ybWF0OiB7IGxldmVsIHwgZWRnZSB8IGhpZ2ggfCBsb3cgfQpAQCAtMTc1LDYgKzE3Nyw5IEBACiAKIAlhY3BpX25vX2F1dG9fc3NkdAlbSFcsQUNQSV0gRGlzYWJsZSBhdXRvbWF0aWMgbG9hZGluZyBvZiBTU0RUCiAKKwlhY3BpX25vX2luaXRyZF9vdmVycmlkZQlbS05MLEFDUEldCisJCQlEaXNhYmxlIGxvYWRpbmcgY3VzdG9tIEFDUEkgdGFibGVzIGZyb20gdGhlIGluaXRyYW1mcworCiAJYWNwaV9vc19uYW1lPQlbSFcsQUNQSV0gVGVsbCBBQ1BJIEJJT1MgdGhlIG5hbWUgb2YgdGhlIE9TCiAJCQlGb3JtYXQ6IFRvIHNwb29mIGFzIFdpbmRvd3MgOTg6ID0iTWljcm9zb2Z0IFdpbmRvd3MiCiAKQEAgLTE5NjgsOSArMTk3Myw2IEBACiAJCQk8ZGVjaS1zZWNvbmRzPjogcG9sbCBhbGwgdGhpcyBmcmVxdWVuY3kKIAkJCTA6IG5vIHBvbGxpbmcgKGRlZmF1bHQpCiAKLQl0aW1lCQlTaG93IHRpbWluZyBkYXRhIHByZWZpeGVkIHRvIGVhY2ggcHJpbnRrIG1lc3NhZ2UgbGluZQotCQkJW2RlcHJlY2F0ZWQsIHNlZSAncHJpbnRrLnRpbWUnXQotCiAJdGlwYXIudGltZW91dD0JW0hXLFBQVF0KIAkJCVNldCBjb21tdW5pY2F0aW9ucyB0aW1lb3V0IGluIHRlbnRocyBvZiBhIHNlY29uZAogCQkJKGRlZmF1bHQgMTUpLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9sZWRzLWNsYXNzLnR4dCBiL0RvY3VtZW50YXRpb24vbGVkcy1jbGFzcy50eHQKaW5kZXggOGMzNWMwNC4uNTY3NTdjNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9sZWRzLWNsYXNzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2xlZHMtY2xhc3MudHh0CkBAIC0zOSwxMiArMzksMzMgQEAKIAogSXMgY3VycmVudGx5IG9mIHRoZSBmb3JtOgogCi0iZGV2aWNlbmFtZTpjb2xvdXIiCisiZGV2aWNlbmFtZTpjb2xvdXI6ZnVuY3Rpb24iCiAKIFRoZXJlIGhhdmUgYmVlbiBjYWxscyBmb3IgTEVEIHByb3BlcnRpZXMgc3VjaCBhcyBjb2xvdXIgdG8gYmUgZXhwb3J0ZWQgYXMKIGluZGl2aWR1YWwgbGVkIGNsYXNzIGF0dHJpYnV0ZXMuIEFzIGEgc29sdXRpb24gd2hpY2ggZG9lc24ndCBpbmN1ciBhcyBtdWNoCiBvdmVyaGVhZCwgSSBzdWdnZXN0IHRoZXNlIGJlY29tZSBwYXJ0IG9mIHRoZSBkZXZpY2UgbmFtZS4gVGhlIG5hbWluZyBzY2hlbWUKLWFib3ZlIGxlYXZlcyBzY29wZSBmb3IgZnVydGhlciBhdHRyaWJ1dGVzIHNob3VsZCB0aGV5IGJlIG5lZWRlZC4KK2Fib3ZlIGxlYXZlcyBzY29wZSBmb3IgZnVydGhlciBhdHRyaWJ1dGVzIHNob3VsZCB0aGV5IGJlIG5lZWRlZC4gSWYgc2VjdGlvbnMKK29mIHRoZSBuYW1lIGRvbid0IGFwcGx5LCBqdXN0IGxlYXZlIHRoYXQgc2VjdGlvbiBibGFuay4KKworCitIYXJkd2FyZSBhY2NlbGVyYXRlZCBibGluayBvZiBMRURzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1NvbWUgTEVEcyBjYW4gYmUgcHJvZ3JhbW1lZCB0byBibGluayB3aXRob3V0IGFueSBDUFUgaW50ZXJhY3Rpb24uIFRvCitzdXBwb3J0IHRoaXMgZmVhdHVyZSwgYSBMRUQgZHJpdmVyIGNhbiBvcHRpb25hbGx5IGltcGxlbWVudCB0aGUKK2JsaW5rX3NldCgpIGZ1bmN0aW9uIChzZWUgPGxpbnV4L2xlZHMuaD4pLiBJZiBpbXBsZW1ldGVkLCB0cmlnZ2VycyBjYW4KK2F0dGVtcHQgdG8gdXNlIGl0IGJlZm9yZSBmYWxsaW5nIGJhY2sgdG8gc29mdHdhcmUgdGltZXJzLiBUaGUgYmxpbmtfc2V0KCkKK2Z1bmN0aW9uIHNob3VsZCByZXR1cm4gMCBpZiB0aGUgYmxpbmsgc2V0dGluZyBpcyBzdXBwb3J0ZWQsIG9yIC1FSU5WQUwKK290aGVyd2lzZSwgd2hpY2ggbWVhbnMgdGhhdCBMRUQgYmxpbmtpbmcgd2lsbCBiZSBoYW5kbGVkIGJ5IHNvZnR3YXJlLgorCitUaGUgYmxpbmtfc2V0KCkgZnVuY3Rpb24gc2hvdWxkIGNob29zZSBhIHVzZXIgZnJpZW5kbHkgYmxpbmtpbmcKK3ZhbHVlIGlmIGl0IGlzIGNhbGxlZCB3aXRoICpkZWxheV9vbj09MCAmJiAqZGVsYXlfb2ZmPT0wIHBhcmFtZXRlcnMuIEluCit0aGlzIGNhc2UgdGhlIGRyaXZlciBzaG91bGQgZ2l2ZSBiYWNrIHRoZSBjaG9zZW4gdmFsdWUgdGhyb3VnaCBkZWxheV9vbgorYW5kIGRlbGF5X29mZiBwYXJhbWV0ZXJzIHRvIHRoZSBsZWRzIHN1YnN5c3RlbS4KKworQW55IGNhbGwgdG8gdGhlIGJyaWdodG5lc3Nfc2V0KCkgY2FsbGJhY2sgZnVuY3Rpb24gc2hvdWxkIGNhbmNlbCB0aGUKK3ByZXZpb3VzbHkgcHJvZ3JhbW1lZCBoYXJkd2FyZSBibGlua2luZyBmdW5jdGlvbiBzbyBzZXR0aW5nIHRoZSBicmlnaHRuZXNzCit0byAwIGNhbiBhbHNvIGNhbmNlbCB0aGUgYmxpbmtpbmcgb2YgdGhlIExFRC4KIAogCiBLbm93biBJc3N1ZXMKQEAgLTU1LDEwICs3Niw2IEBACiBjb21wYXJlZCB0byB0aGUgYmVuZWZpdHMgdGhlIHNpbXBsZSB0cmlnZ2VyIGZ1bmN0aW9uYWxpdHkgYnJpbmdzLiBUaGUKIHJlc3Qgb2YgdGhlIExFRCBzdWJzeXN0ZW0gY2FuIGJlIG1vZHVsYXIuCiAKLVNvbWUgbGVkcyBjYW4gYmUgcHJvZ3JhbW1lZCB0byBmbGFzaCBpbiBoYXJkd2FyZS4gQXMgdGhpcyBpc24ndCBhIGdlbmVyaWMKLUxFRCBkZXZpY2UgcHJvcGVydHksIHRoaXMgc2hvdWxkIGJlIGV4cG9ydGVkIGFzIGEgZGV2aWNlIHNwZWNpZmljIHN5c2ZzCi1hdHRyaWJ1dGUgcmF0aGVyIHRoYW4gcGFydCBvZiB0aGUgY2xhc3MgaWYgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIHJlcXVpcmVkLgotCiAKIEZ1dHVyZSBEZXZlbG9wbWVudAogPT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21uMTAzMDAvQUJJLnR4dCBiL0RvY3VtZW50YXRpb24vbW4xMDMwMC9BQkkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZWYxZjAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL21uMTAzMDAvQUJJLnR4dApAQCAtMCwwICsxLDE0OSBAQAorCQkJICAgPT09PT09PT09PT09PT09PT09PT09PT09PQorCQkJICAgTU4xMDMwMCBGVU5DVElPTiBDQUxMIEFCSQorCQkJICAgPT09PT09PT09PT09PT09PT09PT09PT09PQorCis9PT09PT09CitHRU5FUkFMCis9PT09PT09CisKK1RoZSBNTjEwMzAwL0FNMzMga2VybmVsIHJ1bnMgaW4gbGl0dGxlLWVuZGlhbiBtb2RlOyBiaWctZW5kaWFuIG1vZGUgaXMgbm90CitzdXBwb3J0ZWQuCisKK1RoZSBzdGFjayBncm93cyBkb3dud2FyZHMsIGFuZCBzaG91bGQgYWx3YXlzIGJlIDMyLWJpdCBhbGlnbmVkLiBUaGVyZSBhcmUKK3NlcGFyYXRlIHN0YWNrIHBvaW50ZXIgcmVnaXN0ZXJzIGZvciB1c2Vyc3BhY2UgYW5kIHRoZSBrZXJuZWwuCisKKworPT09PT09PT09PT09PT09PQorQVJHVU1FTlQgUEFTU0lORworPT09PT09PT09PT09PT09PQorCitUaGUgZmlyc3QgdHdvIGFyZ3VtZW50cyAoYXNzdW1pbmcgdXAgdG8gMzItYml0cyBwZXIgYXJndW1lbnQpIHRvIGEgZnVuY3Rpb24gYXJlCitwYXNzZWQgaW4gdGhlIEQwIGFuZCBEMSByZWdpc3RlcnMgcmVzcGVjdGl2ZWx5OyBhbGwgb3RoZXIgYXJndW1lbnRzIGFyZSBwYXNzZWQKK29uIHRoZSBzdGFjay4KKworSWYgNjQtYml0IGFyZ3VtZW50cyBhcmUgYmVpbmcgcGFzc2VkLCB0aGVuIHRoZXkgYXJlIG5ldmVyIHNwbGl0IGJldHdlZW4KK3JlZ2lzdGVycyBhbmQgdGhlIHN0YWNrLiBJZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYSA2NC1iaXQgdmFsdWUsIGl0IHdpbGwgYmUKK3Bhc3NlZCBpbiBEMDpEMS4gSWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIG5vdCBhIDY0LWJpdCB2YWx1ZSwgYnV0IHRoZSBzZWNvbmQKK2lzLCB0aGUgc2Vjb25kIHdpbGwgYmUgcGFzc2VkIGVudGlyZWx5IG9uIHRoZSBzdGFjayBhbmQgRDEgd2lsbCBiZSB1bnVzZWQuCisKK0FyZ3VtZW50cyBzbWFsbGVyIHRoYW4gMzItYml0cyBhcmUgbm90IGNvZWxlc2NlZCB3aXRoaW4gYSByZWdpc3RlciBvciBhIHN0YWNrCit3b3JkLiBGb3IgZXhhbXBsZSwgdHdvIGJ5dGUtc2l6ZWQgYXJndW1lbnRzIHdpbGwgYWx3YXlzIGJlIHBhc3NlZCBpbiBzZXBhcmF0ZQorcmVnaXN0ZXJzIG9yIHdvcmQtc2l6ZWQgc3RhY2sgc2xvdHMuCisKKworPT09PT09PT09PT09PT09PT0KK0NBTExJTkcgRlVOQ1RJT05TCis9PT09PT09PT09PT09PT09PQorCitUaGUgY2FsbGVyIG11c3QgYWxsb2NhdGUgdHdlbHZlIGJ5dGVzIG9uIHRoZSBzdGFjayBmb3IgdGhlIGNhbGxlZSdzIHVzZSBiZWZvcmUKK2l0IGluc2VydHMgYSBDQUxMIGluc3RydWN0aW9uLiBUaGUgQ0FMTCBpbnN0cnVjdGlvbiB3aWxsIHdyaXRlIGludG8gdGhlIFRPUword29yZCwgYnV0IHdvbid0IGFjdHVhbGx5IG1vZGlmeSB0aGUgc3RhY2sgcG9pbnRlcjsgc2ltaWxhcmx5LCB0aGUgUkVUCitpbnN0cnVjdGlvbiByZWFkcyBmcm9tIHRoZSBUT1Mgd29yZCBvZiB0aGUgc3RhY2ssIGJ1dCBkb2Vzbid0IG1vdmUgdGhlIHN0YWNrCitwb2ludGVyIGJleW9uZCBpdC4KKworCisJU3RhY2s6CisJfAkJfAorCXwJCXwKKwl8LS0tLS0tLS0tLS0tLS0tfCBTUCsyMAorCXwgNHRoIEFyZwl8CisJfC0tLS0tLS0tLS0tLS0tLXwgU1ArMTYKKwl8IDNyZCBBcmcJfAorCXwtLS0tLS0tLS0tLS0tLS18IFNQKzEyCisJfCBEMSBTYXZlIFNsb3QJfAorCXwtLS0tLS0tLS0tLS0tLS18IFNQKzgKKwl8IEQwIFNhdmUgU2xvdAl8CisJfC0tLS0tLS0tLS0tLS0tLXwgU1ArNAorCXwgUmV0dXJuIEFkZHIJfAorCXwtLS0tLS0tLS0tLS0tLS18IFNQCisJfAkJfAorCXwJCXwKKworCitUaGUgY2FsbGVyIG11c3QgbGVhdmUgc3BhY2Ugb24gdGhlIHN0YWNrIChoZW5jZSBhbiBhbGxvY2F0aW9uIG9mIHR3ZWx2ZSBieXRlcykKK2luIHdoaWNoIHRoZSBjYWxsZWUgbWF5IHN0b3JlIHRoZSBmaXJzdCB0d28gYXJndW1lbnRzLgorCisKKz09PT09PT09PT09PQorUkVUVVJOIFZBTFVFCis9PT09PT09PT09PT0KKworVGhlIHJldHVybiB2YWx1ZSBpcyBwYXNzZWQgaW4gRDAgZm9yIGFuIGludGVnZXIgKG9yIEQwOkQxIGZvciBhIDY0LWJpdCB2YWx1ZSksCitvciBBMCBmb3IgYSBwb2ludGVyLgorCitJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgdmFsdWUgbGFyZ2VyIHRoYW4gNjQtYml0cywgb3IgaXMgYSBzdHJ1Y3R1cmUgb3IgYW4KK2FycmF5LCB0aGVuIGEgaGlkZGVuIGZpcnN0IGFyZ3VtZW50IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjYWxsZWUgYnkgdGhlIGNhbGxlcjoKK3RoaXMgd2lsbCBwb2ludCB0byBhIHBpZWNlIG9mIG1lbW9yeSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgcmVzdWx0IG9mIHRoZQorZnVuY3Rpb24uIEluIHRoaXMgY2FzZSwgdGhlIGNhbGxlZSB3aWxsIHJldHVybiB0aGUgdmFsdWUgaW4gdGhhdCBwaWVjZSBvZgorbWVtb3J5LCBhbmQgbm8gdmFsdWUgd2lsbCBiZSByZXR1cm5lZCBpbiBEMCBvciBBMC4KKworCis9PT09PT09PT09PT09PT09PT09CitSRUdJU1RFUiBDTE9CQkVSSU5HCis9PT09PT09PT09PT09PT09PT09CisKK1RoZSB2YWx1ZXMgaW4gY2VydGFpbiByZWdpc3RlcnMgbWF5IGJlIGNsb2JiZXJlZCBieSB0aGUgY2FsbGVlLCBhbmQgb3RoZXIKK3ZhbHVlcyBtdXN0IGJlIHNhdmVkOgorCisJQ2xvYmJlcjoJRDAtRDEsIEEwLUExLCBFMC1FMworCVNhdmU6CQlEMi1EMywgQTItQTMsIEU0LUU3LCBTUAorCitBbGwgb3RoZXIgbm9uLXN1cGVydmlzb3Itb25seSByZWdpc3RlcnMgYXJlIGNsb2JiZXJhYmxlIChzdWNoIGFzIE1EUiwgTUNSTCwKK01DUkgpLgorCisKKz09PT09PT09PT09PT09PT09CitTUEVDSUFMIFJFR0lTVEVSUworPT09PT09PT09PT09PT09PT0KKworQ2VydGFpbiBvcmRpbmFyeSByZWdpc3RlcnMgbWF5IGNhcnJ5IHNwZWNpYWwgdXNhZ2UgZm9yIHRoZSBjb21waWxlcjoKKworCUEzOglGcmFtZSBwb2ludGVyCisJRTI6CVRMUyBwb2ludGVyCisKKworPT09PT09PT09PQorS0VSTkVMIEFCSQorPT09PT09PT09PQorCitUaGUga2VybmVsIG1heSB1c2UgYSBzbGlnaHRseSBkaWZmZXJlbnQgQUJJIGludGVybmFsbHkuCisKKyAoKikgRTIKKworICAgICBJZiBDT05GSUdfTU4xMDMwMF9DVVJSRU5UX0lOX0UyIGlzIGRlZmluZWQsIHRoZW4gdGhlIGN1cnJlbnQgdGFzayBwb2ludGVyCisgICAgIHdpbGwgYmUga2VwdCBpbiB0aGUgRTIgcmVnaXN0ZXIsIGFuZCB0aGF0IHJlZ2lzdGVyIHdpbGwgYmUgbWFya2VkCisgICAgIHVuYXZhaWxhYmxlIGZvciB0aGUgY29tcGlsZXIgdG8gdXNlIGFzIGEgc2NyYXRjaCByZWdpc3Rlci4KKworICAgICBOb3JtYWxseSB0aGUga2VybmVsIHVzZXMgc29tZXRoaW5nIGxpa2U6CisKKwlNT1YJU1AsQW4KKwlBTkQJMHhGRkZGRTAwMCxBbgorCU1PVgkoQW4pLFJtCQkvLyBSbSBob2xkcyBjdXJyZW50CisJTU9WCSh5eXksUm0pCS8vIEFjY2VzcyBjdXJyZW50LT55eXkKKworICAgICBUbyBmaW5kIHRoZSBhZGRyZXNzIG9mIGN1cnJlbnQ7IGJ1dCBzaW5jZSB0aGlzIG9wdGlvbiBwZXJtaXRzIGN1cnJlbnQgdG8KKyAgICAgYmUgY2FycmllZCBnbG9iYWxseSBpbiBhbiByZWdpc3RlciwgaXQgY2FuIHVzZToKKworCU1PVgkoeXl5LEUyKQkvLyBBY2Nlc3MgY3VycmVudC0+eXl5CisKKyAgICAgaW5zdGVhZC4KKworCis9PT09PT09PT09PT09PT0KK1NZU1RFTSBDQUxMIEFCSQorPT09PT09PT09PT09PT09CisKK1N5c3RlbSBjYWxscyBhcmUgY2FsbGVkIHdpdGggdGhlIGZvbGxvd2luZyBjb252ZW50aW9uOgorCisJUkVHSVNURVIJRU5UUlkJCQlFWElUCisJPT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09CisJRDAJCVN5c2NhbGwgbnVtYmVyCQlSZXR1cm4gdmFsdWUKKwlBMAkJMXN0IHN5c2NhbGwgYXJndW1lbnQJU2F2ZWQKKwlEMQkJMm5kIHN5c2NhbGwgYXJndW1lbnQJU2F2ZWQKKwlBMwkJM3JkIHN5c2NhbGwgYXJndW1lbnQJU2F2ZWQKKwlBMgkJNHRoIHN5c2NhbGwgYXJndW1lbnQJU2F2ZWQKKwlEMwkJNXRoIHN5c2NhbGwgYXJndW1lbnQJU2F2ZWQKKwlEMgkJNnRoIHN5c2NhbGwgYXJndW1lbnQJU2F2ZWQKKworQWxsIG90aGVyIHJlZ2lzdGVycyBhcmUgc2F2ZWQuICBUaGUgbGF5b3V0IGlzIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHdheSB0aGUgTU9WTQoraW5zdHJ1Y3Rpb24gc3RvcmVzIHJlZ2lzdGVycyBvbnRvIHRoZSBzdGFjay4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbW4xMDMwMC9jb21wYXJ0bWVudGFsaXNhdGlvbi50eHQgYi9Eb2N1bWVudGF0aW9uL21uMTAzMDAvY29tcGFydG1lbnRhbGlzYXRpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NThiNTEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL21uMTAzMDAvY29tcGFydG1lbnRhbGlzYXRpb24udHh0CkBAIC0wLDAgKzEsNjAgQEAKKwkJICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJICAgUEFSVC1TUEVDSUZJQyBTT1VSQ0UgQ09NUEFSVE1FTlRBTElTQVRJT04KKwkJICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIHNvdXJjZXMgZm9yIHZhcmlvdXMgcGFydHMgYXJlIGNvbXBhcnRtZW50YWxpc2VkIGF0IHR3byBkaWZmZXJlbnQgbGV2ZWxzOgorCisgKDEpIFByb2Nlc3NvciBsZXZlbAorCisgICAgIFRoZSAicHJvY2Vzc29yIGxldmVsIiBpcyBhIENQVSBjb3JlIHBsdXMgdGhlIG90aGVyIG9uLXNpbGljb24KKyAgICAgcGVyaXBoZXJhbHMuCisKKyAgICAgUHJvY2Vzc29yLXNwZWNpZmljIGhlYWRlciBmaWxlcyBhcmUgZGl2aWRlZCBhbW9uZyBkaXJlY3RvcmllcyBpbiBhIHNpbWlsYXIKKyAgICAgd2F5IHRvIHRoZSBDUFUgbGV2ZWw6CisKKwkoKikgaW5jbHVkZS9hc20tbW4xMDMwMC9wcm9jLW1uMTAzZTAxMC8KKworCSAgICBTdXBwb3J0IGZvciB0aGUgQU0zM3YyIENQVSBjb3JlLgorCisgICAgIFRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzb3IgaXMgc2VsZWN0ZWQgYnkgYSBDT05GSUdfTU4xMDMwMF9QUk9DX1lZWVkgb3B0aW9uCisgICAgIGZyb20gdGhlICJQcm9jZXNzb3Igc3VwcG9ydCIgY2hvaWNlIG1lbnUgaW4gdGhlIGFyY2gvbW4xMDMwMC9LY29uZmlnIGZpbGUuCisKKworICgyKSBVbml0IGxldmVsCisKKyAgICAgVGhlICJ1bml0IGxldmVsIiBpcyBhIHByb2Nlc3NvciBwbHVzIGFsbCB0aGUgZXh0ZXJuYWwgcGVyaXBoZXJhbHMKKyAgICAgY29udHJvbGxlZCBieSB0aGF0IHByb2Nlc3Nvci4KKworICAgICBVbml0LXNwZWNpZmljIGhlYWRlciBmaWxlcyBhcmUgZGl2aWRlZCBhbW9uZyBkaXJlY3RvcmllcyBpbiBhIHNpbWlsYXIgd2F5CisgICAgIHRvIHRoZSBDUFUgbGV2ZWw7IG5vdCBvbmx5IHRoYXQsIGJ1dCBzcGVjaWZpYyBzb3VyY2VzIG1heSBhbHNvIGJlCisgICAgIHNlZ3JlZ2F0ZWQgaW50byBzZXBhcmF0ZSBkaXJlY3RvcmllcyB1bmRlciB0aGUgYXJjaCBkaXJlY3Rvcnk6CisKKwkoKikgaW5jbHVkZS9hc20tbW4xMDMwMC91bml0LWFzYjIzMDMvCisJKCopIGFyY2gvbW4xMDMwMC91bml0LWFzYjIzMDMvCisKKwkgICAgU3VwcG9ydCBmb3IgdGhlIEFTQjIzMDMgYm9hcmQgd2l0aCBhbiBBU0IyMzA4IGRhdWdodGVyIGJvYXJkLgorCisJKCopIGluY2x1ZGUvYXNtLW1uMTAzMDAvdW5pdC1hc2IyMzA1LworCSgqKSBhcmNoL21uMTAzMDAvdW5pdC1hc2IyMzA1LworCisJICAgIFN1cHBvcnQgZm9yIHRoZSBBU0IyMzA1IGJvYXJkLgorCisgICAgIFRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzb3IgaXMgc2VsZWN0ZWQgYnkgYSBDT05GSUdfTU4xMDMwMF9VTklUX1paWlogb3B0aW9uCisgICAgIGZyb20gdGhlICJVbml0IHR5cGUiIGNob2ljZSBtZW51IGluIHRoZSBhcmNoL21uMTAzMDAvS2NvbmZpZyBmaWxlLgorCisKKz09PT09PT09PT09PQorQ09NUElMRSBUSU1FCis9PT09PT09PT09PT0KKworV2hlbiB0aGUga2VybmVsIGlzIGNvbXBpbGVkLCBzeW1ib2xpYyBsaW5rcyB3aWxsIGJlIG1hZGUgaW4gdGhlIGFzbSBoZWFkZXIgZmlsZQorZGlyZWN0b3J5IGZvciB0aGlzIGFyY2g6CisKKwlpbmNsdWRlL2FzbS1tbjEwMzAwL3Byb2MgPT4gaW5jbHVkZS9hc20tbW4xMDMwMC9wcm9jLVlZWVkvCisJaW5jbHVkZS9hc20tbW4xMDMwMC91bml0ID0+IGluY2x1ZGUvYXNtLW1uMTAzMDAvdW5pdC1aWlpaLworCitTbyB0aGF0IHRoZSBoZWFkZXIgZmlsZXMgY29udGFpbmVkIGluIHRob3NlIGRpcmVjdG9yaWVzIGNhbiBiZSBhY2Nlc3NlZCB3aXRob3V0Citsb3RzIG9mICNpZmRlZi1hZ2UuCisKK1RoZSBhcHByb3ByaWF0ZSBhcmNoL21uMTAzMDAvdW5pdC1aWlpaIGRpcmVjdG9yeSB3aWxsIGFsc28gYmUgZW50ZXJlZCBieSB0aGUKK2NvbXBpbGF0aW9uIHByb2Nlc3M7IGFsbCBvdGhlciB1bml0LXNwZWNpZmljIGRpcmVjdG9yaWVzIHdpbGwgYmUgaWdub3JlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvc3dzdXNwLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvc3dzdXNwLnR4dAppbmRleCBhZWE3ZTkyLi45ZDYwYWI3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3N3c3VzcC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci9zd3N1c3AudHh0CkBAIC0zODYsNiArMzg2LDExIEBACiBUaGVyZSBpcyBhIHdvcmstYXJvdW5kIGZvciB0aGlzIHByb2JsZW0uICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlCiBEb2N1bWVudGF0aW9uL3VzYi9wZXJzaXN0LnR4dC4KIAorUTogQ2FuIEkgc3VzcGVuZC10by1kaXNrIHVzaW5nIGEgc3dhcCBwYXJ0aXRpb24gdW5kZXIgTFZNPworCitBOiBOby4gWW91IGNhbiBzdXNwZW5kIHN1Y2Nlc3NmdWxseSwgYnV0IHlvdSdsbCBub3QgYmUgYWJsZSB0bworcmVzdW1lLiB1c3dzdXNwIHNob3VsZCBiZSBhYmxlIHRvIHdvcmsgd2l0aCBMVk0uIFNlZSBzdXNwZW5kLnNmLm5ldC4KKwogUTogSSB1cGdyYWRlZCB0aGUga2VybmVsIGZyb20gMi42LjE1IHRvIDIuNi4xNi4gQm90aCBrZXJuZWxzIHdlcmUKIGNvbXBpbGVkIHdpdGggdGhlIHNpbWlsYXIgY29uZmlndXJhdGlvbiBmaWxlcy4gQW55d2F5IEkgZm91bmQgdGhhdAogc3VzcGVuZCB0byBkaXNrIChhbmQgcmVzdW1lKSBpcyBtdWNoIHNsb3dlciBvbiAyLjYuMTYgY29tcGFyZWQgdG8KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9ib290aW5nLXdpdGhvdXQtb2YudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2Jvb3Rpbmctd2l0aG91dC1vZi50eHQKaW5kZXggYjVlNDZlZi4uN2I0ZThhNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2Jvb3Rpbmctd2l0aG91dC1vZi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2Jvb3Rpbmctd2l0aG91dC1vZi50eHQKQEAgLTU3LDYgKzU3LDcgQEAKICAgICAgIG4pIDR4eC9BeG9uIEVNQUMgZXRoZXJuZXQgbm9kZXMKICAgICAgIG8pIFhpbGlueCBJUCBjb3JlcwogICAgICAgcCkgRnJlZXNjYWxlIFN5bmNocm9ub3VzIFNlcmlhbCBJbnRlcmZhY2UKKwkgIHEpIFVTQiBFSENJIGNvbnRyb2xsZXJzCiAKICAgVklJIC0gU3BlY2lmeWluZyBpbnRlcnJ1cHQgaW5mb3JtYXRpb24gZm9yIGRldmljZXMKICAgICAxKSBpbnRlcnJ1cHRzIHByb3BlcnR5CkBAIC0yNTc3LDYgKzI1NzgsMjAgQEAKICAgICAgIFJlcXVyZWQgcHJvcGVydGllczoKICAgICAgICAtIGN1cnJlbnQtc3BlZWQgOiBCYXVkIHJhdGUgb2YgdWFydGxpdGUKIAorICAgICAgdikgWGlsaW54IGh3aWNhcAorCisJCVhpbGlueCBod2ljYXAgZGV2aWNlcyBwcm92aWRlIGFjY2VzcyB0byB0aGUgY29uZmlndXJhdGlvbiBsb2dpYworCQlvZiB0aGUgRlBHQSB0aHJvdWdoIHRoZSBJbnRlcm5hbCBDb25maWd1cmF0aW9uIEFjY2VzcyBQb3J0CisJCShJQ0FQKS4gIFRoZSBJQ0FQIGVuYWJsZXMgcGFydGlhbCByZWNvbmZpZ3VyYXRpb24gb2YgdGhlIEZQR0EsCisJCXJlYWRiYWNrIG9mIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLCBhbmQgc29tZSBjb250cm9sIG92ZXIKKwkJJ3dhcm0gYm9vdHMnIG9mIHRoZSBGUEdBIGZhYnJpYy4KKworCQlSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCQktIHhsbngsZmFtaWx5IDogVGhlIGZhbWlseSBvZiB0aGUgRlBHQSwgbmVjZXNzYXJ5IHNpbmNlIHRoZQorICAgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcyBvZiB0aGUgdW5kZXJseWluZyBJQ0FQIGhhcmR3YXJlCisgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyIGJldHdlZW4gZGlmZmVyZW50IGZhbWlsaWVzLiAgTWF5IGJlCisgICAgICAgICAgICAgICAgICAgICAgJ3ZpcnRleDJwJywgJ3ZpcnRleDQnLCBvciAndmlydGV4NScuCisKICAgICBwKSBGcmVlc2NhbGUgU3luY2hyb25vdXMgU2VyaWFsIEludGVyZmFjZQogCiAgICAgICAgVGhlIFNTSSBpcyBhIHNlcmlhbCBkZXZpY2UgdGhhdCBjb21tdW5pY2F0ZXMgd2l0aCBhdWRpbyBjb2RlY3MuICBJdCBjYW4KQEAgLTI3NzUsNiArMjc5MCwzMyBAQAogCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCAmaXBpYyA+OwogICAgICAgICB9OwogCisgICAgcSkgVVNCIEVIQ0kgY29udHJvbGxlcnMKKworICAgIFJlcXVpcmVkIHByb3BlcnRpZXM6CisgICAgICAtIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgInVzYi1laGNpIi4KKyAgICAgIC0gcmVnIDogc2hvdWxkIGNvbnRhaW4gYXQgbGVhc3QgYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSBzdGFuZGFyZCBFSENJCisgICAgICAgIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZS4gT3B0aW9uYWwgcGxhdGZvcm0tZGVwZW5kZW50IHJlZ2lzdGVycworICAgICAgICAoZGVidWctcG9ydCBvciBvdGhlcikgY2FuIGJlIGFsc28gc3BlY2lmaWVkIGhlcmUsIGJ1dCBvbmx5IGFmdGVyCisgICAgICAgIGRlZmluaXRpb24gb2Ygc3RhbmRhcmQgRUhDSSByZWdpc3RlcnMuCisgICAgICAtIGludGVycnVwdHMgOiBvbmUgRUhDSSBpbnRlcnJ1cHQgc2hvdWxkIGJlIGRlc2NyaWJlZCBoZXJlLgorICAgIElmIGRldmljZSByZWdpc3RlcnMgYXJlIGltcGxlbWVudGVkIGluIGJpZyBlbmRpYW4gbW9kZSwgdGhlIGRldmljZQorICAgIG5vZGUgc2hvdWxkIGhhdmUgImJpZy1lbmRpYW4tcmVncyIgcHJvcGVydHkuCisgICAgSWYgY29udHJvbGxlciBpbXBsZW1lbnRhdGlvbiBvcGVyYXRlcyB3aXRoIGJpZyBlbmRpYW4gZGVzY3JpcHRvcnMsCisgICAgImJpZy1lbmRpYW4tZGVzYyIgcHJvcGVydHkgc2hvdWxkIGJlIHNwZWNpZmllZC4KKyAgICBJZiBib3RoIGJpZyBlbmRpYW4gcmVnaXN0ZXJzIGFuZCBkZXNjcmlwdG9ycyBhcmUgdXNlZCBieSB0aGUgY29udHJvbGxlcgorICAgIGltcGxlbWVudGF0aW9uLCAiYmlnLWVuZGlhbiIgcHJvcGVydHkgY2FuIGJlIHNwZWNpZmllZCBpbnN0ZWFkIG9mIGhhdmluZworICAgIGJvdGggImJpZy1lbmRpYW4tcmVncyIgYW5kICJiaWctZW5kaWFuLWRlc2MiLgorCisgICAgIEV4YW1wbGUgKFNlcXVvaWEgNDQwRVB4KToKKwkgICAgZWhjaUBlMDAwMDMwMCB7CisJCSAgIGNvbXBhdGlibGUgPSAiaWJtLHVzYi1laGNpLTQ0MGVweCIsICJ1c2ItZWhjaSI7CisJCSAgIGludGVycnVwdC1wYXJlbnQgPSA8JlVJQzA+OworCQkgICBpbnRlcnJ1cHRzID0gPDFhIDQ+OworCQkgICByZWcgPSA8MCBlMDAwMDMwMCA5MCAwIGUwMDAwMzkwIDcwPjsKKwkJICAgYmlnLWVuZGlhbjsKKwkgICB9OworCisKICAgIE1vcmUgZGV2aWNlcyB3aWxsIGJlIGRlZmluZWQgYXMgdGhpcyBzcGVjIG1hdHVyZXMuCiAKIFZJSSAtIFNwZWNpZnlpbmcgaW50ZXJydXB0IGluZm9ybWF0aW9uIGZvciBkZXZpY2VzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vc2NoZWR1bGVyLzAwLUlOREVYCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZjVjYTAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci8wMC1JTkRFWApAQCAtMCwwICsxLDE2IEBACiswMC1JTkRFWAorCS0gdGhpcyBmaWxlLgorc2NoZWQtYXJjaC50eHQKKwktIENQVSBTY2hlZHVsZXIgaW1wbGVtZW50YXRpb24gaGludHMgZm9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb2RlLgorc2NoZWQtY29kaW5nLnR4dAorCS0gcmVmZXJlbmNlIGZvciB2YXJpb3VzIHNjaGVkdWxlci1yZWxhdGVkIG1ldGhvZHMgaW4gdGhlIE8oMSkgc2NoZWR1bGVyLgorc2NoZWQtZGVzaWduLnR4dAorCS0gZ29hbHMsIGRlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIExpbnV4IE8oMSkgc2NoZWR1bGVyLgorc2NoZWQtZGVzaWduLUNGUy50eHQKKwktIGdvYWxzLCBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb21wbGV0ZSBGYWlyIFNjaGVkdWxlci4KK3NjaGVkLWRvbWFpbnMudHh0CisJLSBpbmZvcm1hdGlvbiBvbiBzY2hlZHVsaW5nIGRvbWFpbnMuCitzY2hlZC1uaWNlLWRlc2lnbi50eHQKKwktIEhvdyBhbmQgd2h5IHRoZSBzY2hlZHVsZXIncyBuaWNlIGxldmVscyBhcmUgaW1wbGVtZW50ZWQuCitzY2hlZC1zdGF0cy50eHQKKwktIGluZm9ybWF0aW9uIG9uIHNjaGVkc3RhdHMgKExpbnV4IFNjaGVkdWxlciBTdGF0aXN0aWNzKS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NoZWQtYXJjaC50eHQgYi9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1hcmNoLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9zY2hlZC1hcmNoLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtYXJjaC50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NoZWQtY29kaW5nLnR4dCBiL0RvY3VtZW50YXRpb24vc2NoZWR1bGVyL3NjaGVkLWNvZGluZy50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vc2NoZWQtY29kaW5nLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtY29kaW5nLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY2hlZC1kZXNpZ24tQ0ZTLnR4dCBiL0RvY3VtZW50YXRpb24vc2NoZWR1bGVyL3NjaGVkLWRlc2lnbi1DRlMudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL3NjaGVkLWRlc2lnbi1DRlMudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1kZXNpZ24tQ0ZTLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY2hlZC1kZXNpZ24udHh0IGIvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtZGVzaWduLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9zY2hlZC1kZXNpZ24udHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1kZXNpZ24udHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NjaGVkLWRvbWFpbnMudHh0IGIvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtZG9tYWlucy50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vc2NoZWQtZG9tYWlucy50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vc2NoZWR1bGVyL3NjaGVkLWRvbWFpbnMudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NjaGVkLW5pY2UtZGVzaWduLnR4dCBiL0RvY3VtZW50YXRpb24vc2NoZWR1bGVyL3NjaGVkLW5pY2UtZGVzaWduLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9zY2hlZC1uaWNlLWRlc2lnbi50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vc2NoZWR1bGVyL3NjaGVkLW5pY2UtZGVzaWduLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY2hlZC1zdGF0cy50eHQgYi9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1zdGF0cy50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vc2NoZWQtc3RhdHMudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1zdGF0cy50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cuYXJjbXNyIGIvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5hcmNtc3IKaW5kZXggY2Q4NDAzYS4uZGUyYmNhYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5hcmNtc3IKKysrIGIvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5hcmNtc3IKQEAgLTY4LDQgKzY4LDQ1IEBACiAqKgkJCQkJCTIuIG1vZGlmeSB0aGUgYXJjbXNyX3BjaV9zbG90X3Jlc2V0IGZ1bmN0aW9uCiAqKgkJCQkJCTMuIG1vZGlmeSB0aGUgYXJjbXNyX3BjaV9lcnNfZGlzY29ubmVjdF9mb3JlcGFydCBmdW5jdGlvbgogKioJCQkJCQk0LiBtb2RpZnkgdGhlIGFyY21zcl9wY2lfZXJzX25lZWRfcmVzZXRfZm9yZXBhcnQgZnVuY3Rpb24KKyoqIDEuMjAuMDAuMTUgICAwOS8yNy8yMDA3CSBFcmljaCBDaGVuICYgTmljayBDaGVuZworKioJCQkJCQkxLiBhZGQgYXJjbXNyX2VuYWJsZV9lb2lfbW9kZSgpIG9uIGFkYXB0ZXIgVHlwZSBCCisqKiAJCQkJCQkyLiBhZGQgcmVhZGwocmVnLT5pb3AyZHJ2X2Rvb3JiZWxsX3JlZykgaW4gYXJjbXNyX2hhbmRsZV9oYmJfaXNyKCkKKyoqCQkJCQkJaW4gY2FzZSBvZiB0aGUgZG9vcmJlbGwgaW50ZXJydXB0IGNsZWFyYW5jZSBpcyBjYWNoZWQKKyoqIDEuMjAuMDAuMTUgICAxMC8wMS8yMDA3CSBFcmljaCBDaGVuICYgTmljayBDaGVuZworKioJCQkJCQkxLiBtb2RpZnkgYWNiLT5kZXZzdGF0ZVtpXVtqXQorKioJCQkJCQlhcyBBUkVDQV9SQUlEX0dPT0QgaW5zdGVhZCBvZgorKioJCQkJCQlBUkVDQV9SQUlEX0dPTkUgaW4gYXJjbXNyX2FsbG9jX2NjYl9wb29sCisqKiAxLjIwLjAwLjE1ICAgMTEvMDYvMjAwNyAgICAgICBFcmljaCBDaGVuICYgTmljayBDaGVuZworKioJCQkJCQkxLiBhZGQgY29uZGl0aW9uYWwgZGVjbGFyYXRpb24gZm9yCisqKiAJCQkJCQlhcmNtc3JfcGNpX2Vycm9yX2RldGVjdGVkKCkgYW5kCisqKgkJCQkJCWFyY21zcl9wY2lfc2xvdF9yZXNldAorKiogMS4yMC4wMC4xNQkxMS8yMy8yMDA3ICAgICAgIEVyaWNoIENoZW4gJiBOaWNrIENoZW5nCisqKgkJCQkJCTEuY2hlY2sgaWYgdGhlIHNnIGxpc3QgbWVtYmVyIG51bWJlcgorKioJCQkJCQlleGNlZWRzIGFyY21zciBkZWZhdWx0IGxpbWl0IGluIGFyY21zcl9idWlsZF9jY2IoKQorKioJCQkJCQkyLmNoYW5nZSB0aGUgcmV0dXJuZWQgdmFsdWUgdHlwZSBvZiBhcmNtc3JfYnVpbGRfY2NiKCkKKyoqCQkJCQkJZnJvbSAidm9pZCIgdG8gImludCIKKyoqCQkJCQkJMy5hZGQgdGhlIGNvbmRpdGlvbmFsIGNoZWNrIGlmIGFyY21zcl9idWlsZF9jY2IoKQorKioJCQkJCQlyZXR1cm5zIEZBSUxFRAorKiogMS4yMC4wMC4xNQkxMi8wNC8yMDA3CSBFcmljaCBDaGVuICYgTmljayBDaGVuZworKioJCQkJCQkxLiBtb2RpZnkgYXJjbXNyX2RyYWluX2RvbmVxdWV1ZSgpIHRvIGlnbm9yZSB1bmtub3duCisqKgkJCQkJCWNvbW1hbmQgYW5kIGxldCBrZXJuZWwgcHJvY2VzcyBjb21tYW5kIHRpbWVvdXQuCisqKgkJCQkJCVRoaXMgY291bGQgaGFuZGxlIElPIHJlcXVlc3QgdmlvbGF0aW5nIG1heC4gc2VnbWVudHMKKyoqCQkJCQkJd2hpbGUgTGludXggWEZTIG92ZXIgRE0tQ1JZUFQuCisqKgkJCQkJCVRoYW5rcyB0byBNaWxhbiBCcm96J3MgY29tbWVudHMgPG1icm96QHJlZGhhdC5jb20+CisqKiAxLjIwLjAwLjE1CTEyLzI0LzIwMDcJIEVyaWNoIENoZW4gJiBOaWNrIENoZW5nCisqKgkJCQkJCTEuZml4IHRoZSBwb3J0YWJpbGl0eSBwcm9ibGVtcworKioJCQkJCQkyLmZpeCB0eXBlIEIgd2hlcmUgd2Ugc2hvdWxkIF9ub3RfIGlvdW5tYXAoKSBhY2ItPnBtdTsKKyoqCQkJCQkJaXQncyBub3QgaW9yZW1hcHBlZC4KKyoqCQkJCQkJMy5hZGQgcmV0dXJuIC1FTk9NRU0gaWYgaW9yZW1hcCgpIGZhaWxzCisqKgkJCQkJCTQudHJhbnNmZXIgSVNfU0c2NF9BRERSIHcvIGNwdV90b19sZTMyKCkKKyoqCQkJCQkJaW4gYXJjbXNyX2J1aWxkX2NjYgorKioJCQkJCQk1LiBtb2RpZnkgYWNiLT5kZXZzdGF0ZVtpXVtqXSBhcyBBUkVDQV9SQUlEX0dPTkUgaW5zdGVhZCBvZgorKioJCQkJCQlBUkVDQV9SQUlEX0dPT0QgaW4gYXJjbXNyX2FsbG9jX2NjYl9wb29sKCkKKyoqCQkJCQkJNi5maXggYXJjbXNyX2NkYi0+Q29udGV4dCBhcyAodW5zaWduZWQgbG9uZylhcmNtc3JfY2RiCisqKgkJCQkJCTcuYWRkIHRoZSBjaGVja2luZyBzdGF0ZSBvZgorKioJCQkJCQkob3V0Ym91bmRfaW50c3RhdHVzICYgQVJDTVNSX01VX09VVEJPVU5EX0hBTkRMRV9JTlQpID09IDAKKyoqCQkJCQkJaW4gYXJjbXNyX2hhbmRsZV9oYmFfaXNyCisqKgkJCQkJCTgucmVwbGFjZSBwY2lfYWxsb2NfY29uc2lzdGVudCgpL3BjaV9mcmVlX2NvbnNpc3RlbnQoKSB3aXRoIGttYWxsb2MoKS9rZnJlZSgpIGluIGFyY21zcl9pb3BfbWVzc2FnZV94ZmVyKCkKKyoqCQkJCQkJOS4gZml4IHRoZSByZWxlYXNlIG9mIGRtYSBtZW1vcnkgZm9yIHR5cGUgQiBpbiBhcmNtc3JfZnJlZV9jY2JfcG9vbCgpCisqKgkJCQkJCTEwLmZpeCB0aGUgYXJjbXNyX3BvbGxpbmdfaGJiX2NjYmRvbmUoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NzaS9zY3NpX21pZF9sb3dfYXBpLnR4dCBiL0RvY3VtZW50YXRpb24vc2NzaS9zY3NpX21pZF9sb3dfYXBpLnR4dAppbmRleCA2ZjcwZjJiLi5hNmQ1MzU0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvc2NzaV9taWRfbG93X2FwaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2lfbWlkX2xvd19hcGkudHh0CkBAIC0xNDA3LDcgKzE0MDcsNyBAQAogPT09PT09PQogVGhlIGZvbGxvd2luZyBwZW9wbGUgaGF2ZSBjb250cmlidXRlZCB0byB0aGlzIGRvY3VtZW50OgogICAgICAgICBNaWtlIEFuZGVyc29uIDxhbmRtaWtlIGF0IHVzIGRvdCBpYm0gZG90IGNvbT4KLSAgICAgICAgSmFtZXMgQm90dG9tbGV5IDxKYW1lcyBkb3QgQm90dG9tbGV5IGF0IHN0ZWVsZXllIGRvdCBjb20+IAorICAgICAgICBKYW1lcyBCb3R0b21sZXkgPEphbWVzIGRvdCBCb3R0b21sZXkgYXQgaGFuc2VucGFydG5lcnNoaXAgZG90IGNvbT4KICAgICAgICAgUGF0cmljayBNYW5zZmllbGQgPHBhdG1hbnMgYXQgdXMgZG90IGlibSBkb3QgY29tPiAKICAgICAgICAgQ2hyaXN0b3BoIEhlbGx3aWcgPGhjaCBhdCBpbmZyYWRlYWQgZG90IG9yZz4KICAgICAgICAgRG91ZyBMZWRmb3JkIDxkbGVkZm9yZCBhdCByZWRoYXQgZG90IGNvbT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dCBiL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dAppbmRleCAyNGVhYzFiLi44YTQ4NjNjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0CkBAIC0zMiw2ICszMiw3IEBACiAtIG1pbl91bm1hcHBlZF9yYXRpbwogLSBtaW5fc2xhYl9yYXRpbwogLSBwYW5pY19vbl9vb20KKy0gb29tX2R1bXBfdGFza3MKIC0gb29tX2tpbGxfYWxsb2NhdGluZ190YXNrCiAtIG1tYXBfbWluX2FkZHJlc3MKIC0gbnVtYV96b25lbGlzdF9vcmRlcgpAQCAtMjMyLDYgKzIzMywyNyBAQAogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKK29vbV9kdW1wX3Rhc2tzCisKK0VuYWJsZXMgYSBzeXN0ZW0td2lkZSB0YXNrIGR1bXAgKGV4Y2x1ZGluZyBrZXJuZWwgdGhyZWFkcykgdG8gYmUKK3Byb2R1Y2VkIHdoZW4gdGhlIGtlcm5lbCBwZXJmb3JtcyBhbiBPT00ta2lsbGluZyBhbmQgaW5jbHVkZXMgc3VjaAoraW5mb3JtYXRpb24gYXMgcGlkLCB1aWQsIHRnaWQsIHZtIHNpemUsIHJzcywgY3B1LCBvb21fYWRqIHNjb3JlLCBhbmQKK25hbWUuICBUaGlzIGlzIGhlbHBmdWwgdG8gZGV0ZXJtaW5lIHdoeSB0aGUgT09NIGtpbGxlciB3YXMgaW52b2tlZAorYW5kIHRvIGlkZW50aWZ5IHRoZSByb2d1ZSB0YXNrIHRoYXQgY2F1c2VkIGl0LgorCitJZiB0aGlzIGlzIHNldCB0byB6ZXJvLCB0aGlzIGluZm9ybWF0aW9uIGlzIHN1cHByZXNzZWQuICBPbiB2ZXJ5CitsYXJnZSBzeXN0ZW1zIHdpdGggdGhvdXNhbmRzIG9mIHRhc2tzIGl0IG1heSBub3QgYmUgZmVhc2libGUgdG8gZHVtcAordGhlIG1lbW9yeSBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBvbmUuICBTdWNoIHN5c3RlbXMgc2hvdWxkIG5vdAorYmUgZm9yY2VkIHRvIGluY3VyIGEgcGVyZm9ybWFuY2UgcGVuYWx0eSBpbiBPT00gY29uZGl0aW9ucyB3aGVuIHRoZQoraW5mb3JtYXRpb24gbWF5IG5vdCBiZSBkZXNpcmVkLgorCitJZiB0aGlzIGlzIHNldCB0byBub24temVybywgdGhpcyBpbmZvcm1hdGlvbiBpcyBzaG93biB3aGVuZXZlciB0aGUKK09PTSBraWxsZXIgYWN0dWFsbHkga2lsbHMgYSBtZW1vcnktaG9nZ2luZyB0YXNrLgorCitUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKIG9vbV9raWxsX2FsbG9jYXRpbmdfdGFzawogCiBUaGlzIGVuYWJsZXMgb3IgZGlzYWJsZXMga2lsbGluZyB0aGUgT09NLXRyaWdnZXJpbmcgdGFzayBpbgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90aGVybWFsL3N5c2ZzLWFwaS50eHQgYi9Eb2N1bWVudGF0aW9uL3RoZXJtYWwvc3lzZnMtYXBpLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTljMmRhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi90aGVybWFsL3N5c2ZzLWFwaS50eHQKQEAgLTAsMCArMSwyNDUgQEAKK0dlbmVyaWMgVGhlcm1hbCBTeXNmcyBkcml2ZXIgSG93IFRvCis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK1dyaXR0ZW4gYnkgU3VqaXRoIFRob21hcyA8c3VqaXRoLnRob21hc0BpbnRlbC5jb20+LCBaaGFuZyBSdWkgPHJ1aS56aGFuZ0BpbnRlbC5jb20+CisKK1VwZGF0ZWQ6IDIgSmFudWFyeSAyMDA4CisKK0NvcHlyaWdodCAoYykgIDIwMDggSW50ZWwgQ29ycG9yYXRpb24KKworCiswLiBJbnRyb2R1Y3Rpb24KKworVGhlIGdlbmVyaWMgdGhlcm1hbCBzeXNmcyBwcm92aWRlcyBhIHNldCBvZiBpbnRlcmZhY2VzIGZvciB0aGVybWFsIHpvbmUgZGV2aWNlcyAoc2Vuc29ycykKK2FuZCB0aGVybWFsIGNvb2xpbmcgZGV2aWNlcyAoZmFuLCBwcm9jZXNzb3IuLi4pIHRvIHJlZ2lzdGVyIHdpdGggdGhlIHRoZXJtYWwgbWFuYWdlbWVudAorc29sdXRpb24gYW5kIHRvIGJlIGEgcGFydCBvZiBpdC4KKworVGhpcyBob3ctdG8gZm9jdXNlcyBvbiBlbmFibGluZyBuZXcgdGhlcm1hbCB6b25lIGFuZCBjb29saW5nIGRldmljZXMgdG8gcGFydGljaXBhdGUKK2luIHRoZXJtYWwgbWFuYWdlbWVudC4KK1RoaXMgc29sdXRpb24gaXMgcGxhdGZvcm0gaW5kZXBlbmRlbnQgYW5kIGFueSB0eXBlIG9mIHRoZXJtYWwgem9uZSBkZXZpY2VzIGFuZAorY29vbGluZyBkZXZpY2VzIHNob3VsZCBiZSBhYmxlIHRvIG1ha2UgdXNlIG9mIHRoZSBpbmZyYXN0cnVjdHVyZS4KKworVGhlIG1haW4gdGFzayBvZiB0aGUgdGhlcm1hbCBzeXNmcyBkcml2ZXIgaXMgdG8gZXhwb3NlIHRoZXJtYWwgem9uZSBhdHRyaWJ1dGVzIGFzIHdlbGwKK2FzIGNvb2xpbmcgZGV2aWNlIGF0dHJpYnV0ZXMgdG8gdGhlIHVzZXIgc3BhY2UuCitBbiBpbnRlbGxpZ2VudCB0aGVybWFsIG1hbmFnZW1lbnQgYXBwbGljYXRpb24gY2FuIG1ha2UgZGVjaXNpb25zIGJhc2VkIG9uIGlucHV0cworZnJvbSB0aGVybWFsIHpvbmUgYXR0cmlidXRlcyAodGhlIGN1cnJlbnQgdGVtcGVyYXR1cmUgYW5kIHRyaXAgcG9pbnQgdGVtcGVyYXR1cmUpCithbmQgdGhyb3R0bGUgYXBwcm9wcmlhdGUgZGV2aWNlcy4KKworWzAtKl0JZGVub3RlcyBhbnkgcG9zaXRpdmUgbnVtYmVyIHN0YXJ0aW5nIGZyb20gMAorWzEtKl0JZGVub3RlcyBhbnkgcG9zaXRpdmUgbnVtYmVyIHN0YXJ0aW5nIGZyb20gMQorCisxLiB0aGVybWFsIHN5c2ZzIGRyaXZlciBpbnRlcmZhY2UgZnVuY3Rpb25zCisKKzEuMSB0aGVybWFsIHpvbmUgZGV2aWNlIGludGVyZmFjZQorMS4xLjEgc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnRoZXJtYWxfem9uZV9kZXZpY2VfcmVnaXN0ZXIoY2hhciAqbmFtZSwgaW50IHRyaXBzLAorCQkJCXZvaWQgKmRldmRhdGEsIHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlX29wcyAqb3BzKQorCisJVGhpcyBpbnRlcmZhY2UgZnVuY3Rpb24gYWRkcyBhIG5ldyB0aGVybWFsIHpvbmUgZGV2aWNlIChzZW5zb3IpIHRvCisJL3N5cy9jbGFzcy90aGVybWFsIGZvbGRlciBhcyB0aGVybWFsX3pvbmVbMC0qXS4KKwlJdCB0cmllcyB0byBiaW5kIGFsbCB0aGUgdGhlcm1hbCBjb29saW5nIGRldmljZXMgcmVnaXN0ZXJlZCBhdCB0aGUgc2FtZSB0aW1lLgorCisJbmFtZTogdGhlIHRoZXJtYWwgem9uZSBuYW1lLgorCXRyaXBzOiB0aGUgdG90YWwgbnVtYmVyIG9mIHRyaXAgcG9pbnRzIHRoaXMgdGhlcm1hbCB6b25lIHN1cHBvcnRzLgorCWRldmRhdGE6IGRldmljZSBwcml2YXRlIGRhdGEKKwlvcHM6IHRoZXJtYWwgem9uZSBkZXZpY2UgY2FsbC1iYWNrcy4KKwkJLmJpbmQ6IGJpbmQgdGhlIHRoZXJtYWwgem9uZSBkZXZpY2Ugd2l0aCBhIHRoZXJtYWwgY29vbGluZyBkZXZpY2UuCisJCS51bmJpbmQ6IHVuYmluZCB0aGUgdGhlcm1hbCB6b25lIGRldmljZSB3aXRoIGEgdGhlcm1hbCBjb29saW5nIGRldmljZS4KKwkJLmdldF90ZW1wOiBnZXQgdGhlIGN1cnJlbnQgdGVtcGVyYXR1cmUgb2YgdGhlIHRoZXJtYWwgem9uZS4KKwkJLmdldF9tb2RlOiBnZXQgdGhlIGN1cnJlbnQgbW9kZSAodXNlci9rZXJuZWwpIG9mIHRoZSB0aGVybWFsIHpvbmUuCisJCQkgICAia2VybmVsIiBtZWFucyB0aGVybWFsIG1hbmFnZW1lbnQgaXMgZG9uZSBpbiBrZXJuZWwuCisJCQkgICAidXNlciIgd2lsbCBwcmV2ZW50IGtlcm5lbCB0aGVybWFsIGRyaXZlciBhY3Rpb25zIHVwb24gdHJpcCBwb2ludHMKKwkJCSAgIHNvIHRoYXQgdXNlciBhcHBsaWNhdGlvbnMgY2FuIHRha2UgY2hhcmdlIG9mIHRoZXJtYWwgbWFuYWdlbWVudC4KKwkJLnNldF9tb2RlOiBzZXQgdGhlIG1vZGUgKHVzZXIva2VybmVsKSBvZiB0aGUgdGhlcm1hbCB6b25lLgorCQkuZ2V0X3RyaXBfdHlwZTogZ2V0IHRoZSB0eXBlIG9mIGNlcnRhaW4gdHJpcCBwb2ludC4KKwkJLmdldF90cmlwX3RlbXA6IGdldCB0aGUgdGVtcGVyYXR1cmUgYWJvdmUgd2hpY2ggdGhlIGNlcnRhaW4gdHJpcCBwb2ludAorCQkJCXdpbGwgYmUgZmlyZWQuCisKKzEuMS4yIHZvaWQgdGhlcm1hbF96b25lX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0eikKKworCVRoaXMgaW50ZXJmYWNlIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIHRoZXJtYWwgem9uZSBkZXZpY2UuCisJSXQgZGVsZXRlcyB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBmb3JtIC9zeXMvY2xhc3MvdGhlcm1hbCBmb2xkZXIgYW5kIHVuYmluZCBhbGwKKwl0aGUgdGhlcm1hbCBjb29saW5nIGRldmljZXMgaXQgdXNlcy4KKworMS4yIHRoZXJtYWwgY29vbGluZyBkZXZpY2UgaW50ZXJmYWNlCisxLjIuMSBzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqdGhlcm1hbF9jb29saW5nX2RldmljZV9yZWdpc3RlcihjaGFyICpuYW1lLAorCQkJCQl2b2lkICpkZXZkYXRhLCBzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZV9vcHMgKikKKworCVRoaXMgaW50ZXJmYWNlIGZ1bmN0aW9uIGFkZHMgYSBuZXcgdGhlcm1hbCBjb29saW5nIGRldmljZSAoZmFuL3Byb2Nlc3Nvci8uLi4pIHRvCisJL3N5cy9jbGFzcy90aGVybWFsLyBmb2xkZXIgYXMgY29vbGluZ19kZXZpY2VbMC0qXS4KKwlJdCB0cmllcyB0byBiaW5kIGl0c2VsZiB0byBhbGwgdGhlIHRoZXJtYWwgem9uZSBkZXZpY2VzIHJlZ2lzdGVyIGF0IHRoZSBzYW1lIHRpbWUuCisJbmFtZTogdGhlIGNvb2xpbmcgZGV2aWNlIG5hbWUuCisJZGV2ZGF0YTogZGV2aWNlIHByaXZhdGUgZGF0YS4KKwlvcHM6IHRoZXJtYWwgY29vbGluZyBkZXZpY2VzIGNhbGwtYmFja3MuCisJCS5nZXRfbWF4X3N0YXRlOiBnZXQgdGhlIE1heGltdW0gdGhyb3R0bGUgc3RhdGUgb2YgdGhlIGNvb2xpbmcgZGV2aWNlLgorCQkuZ2V0X2N1cl9zdGF0ZTogZ2V0IHRoZSBDdXJyZW50IHRocm90dGxlIHN0YXRlIG9mIHRoZSBjb29saW5nIGRldmljZS4KKwkJLnNldF9jdXJfc3RhdGU6IHNldCB0aGUgQ3VycmVudCB0aHJvdHRsZSBzdGF0ZSBvZiB0aGUgY29vbGluZyBkZXZpY2UuCisKKzEuMi4yIHZvaWQgdGhlcm1hbF9jb29saW5nX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2KQorCisJVGhpcyBpbnRlcmZhY2UgZnVuY3Rpb24gcmVtb3ZlIHRoZSB0aGVybWFsIGNvb2xpbmcgZGV2aWNlLgorCUl0IGRlbGV0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgZm9ybSAvc3lzL2NsYXNzL3RoZXJtYWwgZm9sZGVyIGFuZCB1bmJpbmQKKwlpdHNlbGYgZnJvbSBhbGwJdGhlIHRoZXJtYWwgem9uZSBkZXZpY2VzIHVzaW5nIGl0LgorCisxLjMgaW50ZXJmYWNlIGZvciBiaW5kaW5nIGEgdGhlcm1hbCB6b25lIGRldmljZSB3aXRoIGEgdGhlcm1hbCBjb29saW5nIGRldmljZQorMS4zLjEgaW50IHRoZXJtYWxfem9uZV9iaW5kX2Nvb2xpbmdfZGV2aWNlKHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0eiwKKwkJCWludCB0cmlwLCBzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2Rldik7CisKKwlUaGlzIGludGVyZmFjZSBmdW5jdGlvbiBiaW5kIGEgdGhlcm1hbCBjb29saW5nIGRldmljZSB0byB0aGUgY2VydGFpbiB0cmlwIHBvaW50CisJb2YgYSB0aGVybWFsIHpvbmUgZGV2aWNlLgorCVRoaXMgZnVuY3Rpb24gaXMgdXN1YWxseSBjYWxsZWQgaW4gdGhlIHRoZXJtYWwgem9uZSBkZXZpY2UgLmJpbmQgY2FsbGJhY2suCisJdHo6IHRoZSB0aGVybWFsIHpvbmUgZGV2aWNlCisJY2RldjogdGhlcm1hbCBjb29saW5nIGRldmljZQorCXRyaXA6IGluZGljYXRlcyB3aGljaCB0cmlwIHBvaW50IHRoZSBjb29saW5nIGRldmljZXMgaXMgYXNzb2NpYXRlZCB3aXRoCisJCSBpbiB0aGlzIHRoZXJtYWwgem9uZS4KKworMS4zLjIgaW50IHRoZXJtYWxfem9uZV91bmJpbmRfY29vbGluZ19kZXZpY2Uoc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6LAorCQkJCWludCB0cmlwLCBzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2Rldik7CisKKwlUaGlzIGludGVyZmFjZSBmdW5jdGlvbiB1bmJpbmQgYSB0aGVybWFsIGNvb2xpbmcgZGV2aWNlIGZyb20gdGhlIGNlcnRhaW4gdHJpcCBwb2ludAorCW9mIGEgdGhlcm1hbCB6b25lIGRldmljZS4KKwlUaGlzIGZ1bmN0aW9uIGlzIHVzdWFsbHkgY2FsbGVkIGluIHRoZSB0aGVybWFsIHpvbmUgZGV2aWNlIC51bmJpbmQgY2FsbGJhY2suCisJdHo6IHRoZSB0aGVybWFsIHpvbmUgZGV2aWNlCisJY2RldjogdGhlcm1hbCBjb29saW5nIGRldmljZQorCXRyaXA6IGluZGljYXRlcyB3aGljaCB0cmlwIHBvaW50IHRoZSBjb29saW5nIGRldmljZXMgaXMgYXNzb2NpYXRlZCB3aXRoCisJCWluIHRoaXMgdGhlcm1hbCB6b25lLgorCisyLiBzeXNmcyBhdHRyaWJ1dGVzIHN0cnVjdHVyZQorCitSTwlyZWFkIG9ubHkgdmFsdWUKK1JXCXJlYWQvd3JpdGUgdmFsdWUKKworQWxsIHRoZXJtYWwgc3lzZnMgYXR0cmlidXRlcyB3aWxsIGJlIHJlcHJlc2VudGVkIHVuZGVyIC9zeXMvY2xhc3MvdGhlcm1hbAorCitUaGVybWFsIHpvbmUgZGV2aWNlIHN5cyBJL0YsIGNyZWF0ZWQgb25jZSBpdCdzIHJlZ2lzdGVyZWQ6Cit8dGhlcm1hbF96b25lWzAtKl06CisJfC0tLS0tdHlwZToJCQlUeXBlIG9mIHRoZSB0aGVybWFsIHpvbmUKKwl8LS0tLS10ZW1wOgkJCUN1cnJlbnQgdGVtcGVyYXR1cmUKKwl8LS0tLS1tb2RlOgkJCVdvcmtpbmcgbW9kZSBvZiB0aGUgdGhlcm1hbCB6b25lCisJfC0tLS0tdHJpcF9wb2ludF9bMC0qXV90ZW1wOglUcmlwIHBvaW50IHRlbXBlcmF0dXJlCisJfC0tLS0tdHJpcF9wb2ludF9bMC0qXV90eXBlOglUcmlwIHBvaW50IHR5cGUKKworVGhlcm1hbCBjb29saW5nIGRldmljZSBzeXMgSS9GLCBjcmVhdGVkIG9uY2UgaXQncyByZWdpc3RlcmVkOgorfGNvb2xpbmdfZGV2aWNlWzAtKl06CisJfC0tLS0tdHlwZSA6CQkJVHlwZSBvZiB0aGUgY29vbGluZyBkZXZpY2UocHJvY2Vzc29yL2Zhbi8uLi4pCisJfC0tLS0tbWF4X3N0YXRlOgkJTWF4aW11bSBjb29saW5nIHN0YXRlIG9mIHRoZSBjb29saW5nIGRldmljZQorCXwtLS0tLWN1cl9zdGF0ZToJCUN1cnJlbnQgY29vbGluZyBzdGF0ZSBvZiB0aGUgY29vbGluZyBkZXZpY2UKKworCitUaGVzZSB0d28gZHluYW1pYyBhdHRyaWJ1dGVzIGFyZSBjcmVhdGVkL3JlbW92ZWQgaW4gcGFpcnMuCitUaGV5IHJlcHJlc2VudCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYSB0aGVybWFsIHpvbmUgYW5kIGl0cyBhc3NvY2lhdGVkIGNvb2xpbmcgZGV2aWNlLgorVGhleSBhcmUgY3JlYXRlZC9yZW1vdmVkIGZvciBlYWNoCit0aGVybWFsX3pvbmVfYmluZF9jb29saW5nX2RldmljZS90aGVybWFsX3pvbmVfdW5iaW5kX2Nvb2xpbmdfZGV2aWNlIHN1Y2Nlc3NmdWwgZXhlY3V0aW9uLgorCit8dGhlcm1hbF96b25lWzAtKl0KKwl8LS0tLS1jZGV2WzAtKl06CQlUaGUgWzAtKl10aCBjb29saW5nIGRldmljZSBpbiB0aGUgY3VycmVudCB0aGVybWFsIHpvbmUKKwl8LS0tLS1jZGV2WzAtKl1fdHJpcF9wb2ludDoJVHJpcCBwb2ludCB0aGF0IGNkZXZbMC0qXSBpcyBhc3NvY2lhdGVkIHdpdGgKKworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogVGhlcm1hbCB6b25lIGF0dHJpYnV0ZXMgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK3R5cGUJCQkJU3RyaW5ncyB3aGljaCByZXByZXNlbnQgdGhlIHRoZXJtYWwgem9uZSB0eXBlLgorCQkJCVRoaXMgaXMgZ2l2ZW4gYnkgdGhlcm1hbCB6b25lIGRyaXZlciBhcyBwYXJ0IG9mIHJlZ2lzdHJhdGlvbi4KKwkJCQlFZzogIkFDUEkgdGhlcm1hbCB6b25lIiBpbmRpY2F0ZXMgaXQncyBhIEFDUEkgdGhlcm1hbCBkZXZpY2UKKwkJCQlSTworCQkJCU9wdGlvbmFsCisKK3RlbXAJCQkJQ3VycmVudCB0ZW1wZXJhdHVyZSBhcyByZXBvcnRlZCBieSB0aGVybWFsIHpvbmUgKHNlbnNvcikKKwkJCQlVbml0OiBkZWdyZWUgQ2Vsc2l1cworCQkJCVJPCisJCQkJUmVxdWlyZWQKKworbW9kZQkJCQlPbmUgb2YgdGhlIHByZWRlZmluZWQgdmFsdWVzIGluIFtrZXJuZWwsIHVzZXJdCisJCQkJVGhpcyBmaWxlIGdpdmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhbGdvcml0aG0KKwkJCQl0aGF0IGlzIGN1cnJlbnRseSBtYW5hZ2luZyB0aGUgdGhlcm1hbCB6b25lLgorCQkJCUl0IGNhbiBiZSBlaXRoZXIgZGVmYXVsdCBrZXJuZWwgYmFzZWQgYWxnb3JpdGhtCisJCQkJb3IgdXNlciBzcGFjZSBhcHBsaWNhdGlvbi4KKwkJCQlSVworCQkJCU9wdGlvbmFsCisJCQkJa2VybmVsCT0gVGhlcm1hbCBtYW5hZ2VtZW50IGluIGtlcm5lbCB0aGVybWFsIHpvbmUgZHJpdmVyLgorCQkJCXVzZXIJPSBQcmV2ZW50aW5nIGtlcm5lbCB0aGVybWFsIHpvbmUgZHJpdmVyIGFjdGlvbnMgdXBvbgorCQkJCQkgIHRyaXAgcG9pbnRzIHNvIHRoYXQgdXNlciBhcHBsaWNhdGlvbiBjYW4gdGFrZSBmdWxsCisJCQkJCSAgY2hhcmdlIG9mIHRoZSB0aGVybWFsIG1hbmFnZW1lbnQuCisKK3RyaXBfcG9pbnRfWzAtKl1fdGVtcAkJVGhlIHRlbXBlcmF0dXJlIGFib3ZlIHdoaWNoIHRyaXAgcG9pbnQgd2lsbCBiZSBmaXJlZAorCQkJCVVuaXQ6IGRlZ3JlZSBDZWxzaXVzCisJCQkJUk8KKwkJCQlPcHRpb25hbAorCit0cmlwX3BvaW50X1swLSpdX3R5cGUgCQlTdHJpbmdzIHdoaWNoIGluZGljYXRlIHRoZSB0eXBlIG9mIHRoZSB0cmlwIHBvaW50CisJCQkJRS5nLiBpdCBjYW4gYmUgb25lIG9mIGNyaXRpY2FsLCBob3QsIHBhc3NpdmUsCisJCQkJICAgIGFjdGl2ZVswLSpdIGZvciBBQ1BJIHRoZXJtYWwgem9uZS4KKwkJCQlSTworCQkJCU9wdGlvbmFsCisKK2NkZXZbMC0qXQkJCVN5c2ZzIGxpbmsgdG8gdGhlIHRoZXJtYWwgY29vbGluZyBkZXZpY2Ugbm9kZSB3aGVyZSB0aGUgc3lzIEkvRgorCQkJCWZvciBjb29saW5nIGRldmljZSB0aHJvdHRsaW5nIGNvbnRyb2wgcmVwcmVzZW50cy4KKwkJCQlSTworCQkJCU9wdGlvbmFsCisKK2NkZXZbMC0qXV90cmlwX3BvaW50CQlUaGUgdHJpcCBwb2ludCB3aXRoIHdoaWNoIGNkZXZbMC0qXSBpcyBhc3NvY2lhdGVkIGluIHRoaXMgdGhlcm1hbCB6b25lCisJCQkJLTEgbWVhbnMgdGhlIGNvb2xpbmcgZGV2aWNlIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IHRyaXAgcG9pbnQuCisJCQkJUk8KKwkJCQlPcHRpb25hbAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29vbGluZyBkZXZpY2UgIGF0dHJpYnV0ZXMgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK3R5cGUJCQkJU3RyaW5nIHdoaWNoIHJlcHJlc2VudHMgdGhlIHR5cGUgb2YgZGV2aWNlCisJCQkJZWc6IEZvciBnZW5lcmljIEFDUEk6IHRoaXMgc2hvdWxkIGJlICJGYW4iLAorCQkJCSJQcm9jZXNzb3IiIG9yICJMQ0QiCisJCQkJZWcuIEZvciBtZW1vcnkgY29udHJvbGxlciBkZXZpY2Ugb24gaW50ZWxfbWVubG93IHBsYXRmb3JtOgorCQkJCXRoaXMgc2hvdWxkIGJlICJNZW1vcnkgY29udHJvbGxlciIKKwkJCQlSTworCQkJCU9wdGlvbmFsCisKK21heF9zdGF0ZQkJCVRoZSBtYXhpbXVtIHBlcm1pc3NpYmxlIGNvb2xpbmcgc3RhdGUgb2YgdGhpcyBjb29saW5nIGRldmljZS4KKwkJCQlSTworCQkJCVJlcXVpcmVkCisKK2N1cl9zdGF0ZQkJCVRoZSBjdXJyZW50IGNvb2xpbmcgc3RhdGUgb2YgdGhpcyBjb29saW5nIGRldmljZS4KKwkJCQl0aGUgdmFsdWUgY2FuIGFueSBpbnRlZ2VyIG51bWJlcnMgYmV0d2VlbiAwIGFuZCBtYXhfc3RhdGUsCisJCQkJY3VyX3N0YXRlID09IDAgbWVhbnMgbm8gY29vbGluZworCQkJCWN1cl9zdGF0ZSA9PSBtYXhfc3RhdGUgbWVhbnMgdGhlIG1heGltdW0gY29vbGluZy4KKwkJCQlSVworCQkJCVJlcXVpcmVkCisKKzMuIEEgc2ltcGxlIGltcGxlbWVudGF0aW9uCisKK0FDUEkgdGhlcm1hbCB6b25lIG1heSBzdXBwb3J0IG11bHRpcGxlIHRyaXAgcG9pbnRzIGxpa2UgY3JpdGljYWwvaG90L3Bhc3NpdmUvYWN0aXZlLgorSWYgYW4gQUNQSSB0aGVybWFsIHpvbmUgc3VwcG9ydHMgY3JpdGljYWwsIHBhc3NpdmUsIGFjdGl2ZVswXSBhbmQgYWN0aXZlWzFdIGF0IHRoZSBzYW1lIHRpbWUsCitpdCBtYXkgcmVnaXN0ZXIgaXRzZWxmIGFzIGEgdGhlcm1hbF96b25lX2RldmljZSAodGhlcm1hbF96b25lMSkgd2l0aCA0IHRyaXAgcG9pbnRzIGluIGFsbC4KK0l0IGhhcyBvbmUgcHJvY2Vzc29yIGFuZCBvbmUgZmFuLCB3aGljaCBhcmUgYm90aCByZWdpc3RlcmVkIGFzIHRoZXJtYWxfY29vbGluZ19kZXZpY2UuCitJZiB0aGUgcHJvY2Vzc29yIGlzIGxpc3RlZCBpbiBfUFNMIG1ldGhvZCwgYW5kIHRoZSBmYW4gaXMgbGlzdGVkIGluIF9BTDAgbWV0aG9kLAordGhlIHN5cyBJL0Ygc3RydWN0dXJlIHdpbGwgYmUgYnVpbHQgbGlrZSB0aGlzOgorCisvc3lzL2NsYXNzL3RoZXJtYWw6CisKK3x0aGVybWFsX3pvbmUxOgorCXwtLS0tLXR5cGU6CQkJQUNQSSB0aGVybWFsIHpvbmUKKwl8LS0tLS10ZW1wOgkJCTM3CisJfC0tLS0tbW9kZToJCQlrZXJuZWwKKwl8LS0tLS10cmlwX3BvaW50XzBfdGVtcDoJMTAwCisJfC0tLS0tdHJpcF9wb2ludF8wX3R5cGU6CWNyaXRpY2FsCisJfC0tLS0tdHJpcF9wb2ludF8xX3RlbXA6CTgwCisJfC0tLS0tdHJpcF9wb2ludF8xX3R5cGU6CXBhc3NpdmUKKwl8LS0tLS10cmlwX3BvaW50XzJfdGVtcDoJNzAKKwl8LS0tLS10cmlwX3BvaW50XzJfdHlwZToJYWN0aXZlWzBdCisJfC0tLS0tdHJpcF9wb2ludF8zX3RlbXA6CTYwCisJfC0tLS0tdHJpcF9wb2ludF8zX3R5cGU6CWFjdGl2ZVsxXQorCXwtLS0tLWNkZXYwOgkJCS0tLT4vc3lzL2NsYXNzL3RoZXJtYWwvY29vbGluZ19kZXZpY2UwCisJfC0tLS0tY2RldjBfdHJpcF9wb2ludDoJCTEJLyogY2RldjAgY2FuIGJlIHVzZWQgZm9yIHBhc3NpdmUgKi8KKwl8LS0tLS1jZGV2MToJCQktLS0+L3N5cy9jbGFzcy90aGVybWFsL2Nvb2xpbmdfZGV2aWNlMworCXwtLS0tLWNkZXYxX3RyaXBfcG9pbnQ6CQkyCS8qIGNkZXYxIGNhbiBiZSB1c2VkIGZvciBhY3RpdmVbMF0qLworCit8Y29vbGluZ19kZXZpY2UwOgorCXwtLS0tLXR5cGU6CQkJUHJvY2Vzc29yCisJfC0tLS0tbWF4X3N0YXRlOgkJOAorCXwtLS0tLWN1cl9zdGF0ZToJCTAKKworfGNvb2xpbmdfZGV2aWNlMzoKKwl8LS0tLS10eXBlOgkJCUZhbgorCXwtLS0tLW1heF9zdGF0ZToJCTIKKwl8LS0tLS1jdXJfc3RhdGU6CQkwCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RoaW5rcGFkLWFjcGkudHh0IGIvRG9jdW1lbnRhdGlvbi90aGlua3BhZC1hY3BpLnR4dAppbmRleCAxMGMwNDFjLi42YzI0Nzc3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3RoaW5rcGFkLWFjcGkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdGhpbmtwYWQtYWNwaS50eHQKQEAgLTEsNyArMSw3IEBACiAJCSAgICAgVGhpbmtQYWQgQUNQSSBFeHRyYXMgRHJpdmVyCiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDAuMTcKLSAgICAgICAgICAgICAgICAgICAgICAgICBPY3RvYmVyIDA0dGgsIDIwMDcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDAuMTkKKyAgICAgICAgICAgICAgICAgICAgICAgICBKYW51YXJ5IDA2dGgsIDIwMDgKIAogICAgICAgICAgICAgICAgQm9yaXNsYXYgRGVpYW5vdiA8Ym9yaXNsYXZAdXNlcnMuc2YubmV0PgogICAgICAgICAgICAgIEhlbnJpcXVlIGRlIE1vcmFlcyBIb2xzY2h1aCA8aG1oQGhtaC5lbmcuYnI+CkBAIC0yMTUsNiArMjE1LDExIEBACiAJLi4uIGFueSBvdGhlciA4LWhleC1kaWdpdCBtYXNrIC4uLgogCWVjaG8gcmVzZXQgPiAvcHJvYy9hY3BpL2libS9ob3RrZXkgLS0gcmVzdG9yZSB0aGUgb3JpZ2luYWwgbWFzawogCitUaGUgcHJvY2ZzIGludGVyZmFjZSBkb2VzIG5vdCBzdXBwb3J0IE5WUkFNIHBvbGxpbmcgY29udHJvbC4gIFNvIGFzIHRvCittYWludGFpbiBtYXhpbXVtIGJ1Zy10by1idWcgY29tcGF0aWJpbGl0eSwgaXQgZG9lcyBub3QgcmVwb3J0IGFueSBtYXNrcywKK25vciBkb2VzIGl0IGFsbG93IG9uZSB0byBtYW5pcHVsYXRlIHRoZSBob3Qga2V5IG1hc2sgd2hlbiB0aGUgZmlybXdhcmUKK2RvZXMgbm90IHN1cHBvcnQgbWFza3MgYXQgYWxsLCBldmVuIGlmIE5WUkFNIHBvbGxpbmcgaXMgaW4gdXNlLgorCiBzeXNmcyBub3RlczoKIAogCWhvdGtleV9iaW9zX2VuYWJsZWQ6CkBAIC0yMzEsMTcgKzIzNiwyNiBAQAogCQl0byB0aGlzIHZhbHVlLgogCiAJaG90a2V5X2VuYWJsZToKLQkJRW5hYmxlcy9kaXNhYmxlcyB0aGUgaG90IGtleXMgZmVhdHVyZSwgYW5kIHJlcG9ydHMKLQkJY3VycmVudCBzdGF0dXMgb2YgdGhlIGhvdCBrZXlzIGZlYXR1cmUuCisJCUVuYWJsZXMvZGlzYWJsZXMgdGhlIGhvdCBrZXlzIGZlYXR1cmUgaW4gdGhlIEFDUEkKKwkJZmlybXdhcmUsIGFuZCByZXBvcnRzIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBob3Qga2V5cworCQlmZWF0dXJlLiAgSGFzIG5vIGVmZmVjdCBvbiB0aGUgTlZSQU0gaG90IGtleSBwb2xsaW5nCisJCWZ1bmN0aW9uYWxpdHkuCiAKIAkJMDogZGlzYWJsZXMgdGhlIGhvdCBrZXlzIGZlYXR1cmUgLyBmZWF0dXJlIGRpc2FibGVkCiAJCTE6IGVuYWJsZXMgdGhlIGhvdCBrZXlzIGZlYXR1cmUgLyBmZWF0dXJlIGVuYWJsZWQKIAogCWhvdGtleV9tYXNrOgotCQliaXQgbWFzayB0byBlbmFibGUgZHJpdmVyLWhhbmRsaW5nIGFuZCBBQ1BJIGV2ZW50Ci0JCWdlbmVyYXRpb24gZm9yIGVhY2ggaG90IGtleSAoc2VlIGFib3ZlKS4gIFJldHVybnMgdGhlCi0JCWN1cnJlbnQgc3RhdHVzIG9mIHRoZSBob3Qga2V5cyBtYXNrLCBhbmQgYWxsb3dzIG9uZSB0bwotCQltb2RpZnkgaXQuCisJCWJpdCBtYXNrIHRvIGVuYWJsZSBkcml2ZXItaGFuZGxpbmcgKGFuZCBkZXBlbmRpbmcgb24KKwkJdGhlIGZpcm13YXJlLCBBQ1BJIGV2ZW50IGdlbmVyYXRpb24pIGZvciBlYWNoIGhvdCBrZXkKKwkJKHNlZSBhYm92ZSkuICBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgaG90IGtleXMKKwkJbWFzaywgYW5kIGFsbG93cyBvbmUgdG8gbW9kaWZ5IGl0LgorCisJCU5vdGU6IHdoZW4gTlZSQU0gcG9sbGluZyBpcyBhY3RpdmUsIHRoZSBmaXJtd2FyZSBtYXNrCisJCXdpbGwgYmUgZGlmZmVyZW50IGZyb20gdGhlIHZhbHVlIHJldHVybmVkIGJ5CisJCWhvdGtleV9tYXNrLiAgVGhlIGRyaXZlciB3aWxsIHJldGFpbiBlbmFibGVkIGJpdHMgZm9yCisJCWhvdGtleXMgdGhhdCBhcmUgdW5kZXIgTlZSQU0gcG9sbGluZyBldmVuIGlmIHRoZQorCQlmaXJtd2FyZSByZWZ1c2VzIHRoZW0sIGFuZCB3aWxsIG5vdCBzZXQgdGhlc2UgYml0cyBvbgorCQl0aGUgZmlybXdhcmUgaG90IGtleSBtYXNrLgogCiAJaG90a2V5X2FsbF9tYXNrOgogCQliaXQgbWFzayB0aGF0IHNob3VsZCBlbmFibGUgZXZlbnQgcmVwb3J0aW5nIGZvciBhbGwKQEAgLTI1NywxMiArMjcxLDQ4IEBACiAJCWhhbmRsZWQgYnkgdGhlIGZpcm13YXJlIGFueXdheS4gIEVjaG8gaXQgdG8KIAkJaG90a2V5X21hc2sgYWJvdmUsIHRvIHVzZS4KIAorCWhvdGtleV9zb3VyY2VfbWFzazoKKwkJYml0IG1hc2sgdGhhdCBzZWxlY3RzIHdoaWNoIGhvdCBrZXlzIHdpbGwgdGhlIGRyaXZlcgorCQlwb2xsIHRoZSBOVlJBTSBmb3IuICBUaGlzIGlzIGF1dG8tZGV0ZWN0ZWQgYnkgdGhlIGRyaXZlcgorCQliYXNlZCBvbiB0aGUgY2FwYWJpbGl0aWVzIHJlcG9ydGVkIGJ5IHRoZSBBQ1BJIGZpcm13YXJlLAorCQlidXQgaXQgY2FuIGJlIG92ZXJyaWRkZW4gYXQgcnVudGltZS4KKworCQlIb3Qga2V5cyB3aG9zZSBiaXRzIGFyZSBzZXQgaW4gYm90aCBob3RrZXlfc291cmNlX21hc2sKKwkJYW5kIGFsc28gb24gaG90a2V5X21hc2sgYXJlIHBvbGxlZCBmb3IgaW4gTlZSQU0uICBPbmx5IGEKKwkJZmV3IGhvdCBrZXlzIGFyZSBhdmFpbGFibGUgdGhyb3VnaCBDTU9TIE5WUkFNIHBvbGxpbmcuCisKKwkJV2FybmluZzogd2hlbiBpbiBOVlJBTSBtb2RlLCB0aGUgdm9sdW1lIHVwL2Rvd24vbXV0ZQorCQlrZXlzIGFyZSBzeW50aGVzaXplZCBhY2NvcmRpbmcgdG8gY2hhbmdlcyBpbiB0aGUgbWl4ZXIsCisJCXNvIHlvdSBoYXZlIHRvIHVzZSB2b2x1bWUgdXAgb3Igdm9sdW1lIGRvd24gdG8gdW5tdXRlLAorCQlhcyBwZXIgdGhlIFRoaW5rUGFkIHZvbHVtZSBtaXhlciB1c2VyIGludGVyZmFjZS4gIFdoZW4KKwkJaW4gQUNQSSBldmVudCBtb2RlLCB2b2x1bWUgdXAvZG93bi9tdXRlIGFyZSByZXBvcnRlZCBhcworCQlzZXBhcmF0ZSBldmVudHMsIGJ1dCB0aGlzIGJlaGF2aW91ciBtYXkgYmUgY29ycmVjdGVkIGluCisJCWZ1dHVyZSByZWxlYXNlcyBvZiB0aGlzIGRyaXZlciwgaW4gd2hpY2ggY2FzZSB0aGUKKwkJVGhpbmtQYWQgdm9sdW1lIG1peGVyIHVzZXIgaW50ZXJmYWNlIHNlbWFudGhpY3Mgd2lsbCBiZQorCQllbmZvcmNlZC4KKworCWhvdGtleV9wb2xsX2ZyZXE6CisJCWZyZXF1ZW5jeSBpbiBIeiBmb3IgaG90IGtleSBwb2xsaW5nLiBJdCBtdXN0IGJlIGJldHdlZW4KKwkJMCBhbmQgMjUgSHouICBQb2xsaW5nIGlzIG9ubHkgY2FycmllZCBvdXQgd2hlbiBzdHJpY3RseQorCQluZWVkZWQuCisKKwkJU2V0dGluZyBob3RrZXlfcG9sbF9mcmVxIHRvIHplcm8gZGlzYWJsZXMgcG9sbGluZywgYW5kCisJCXdpbGwgY2F1c2UgaG90IGtleSBwcmVzc2VzIHRoYXQgcmVxdWlyZSBOVlJBTSBwb2xsaW5nCisJCXRvIG5ldmVyIGJlIHJlcG9ydGVkLgorCisJCVNldHRpbmcgaG90a2V5X3BvbGxfZnJlcSB0b28gbG93IHdpbGwgY2F1c2UgcmVwZWF0ZWQKKwkJcHJlc3NpbmdzIG9mIHRoZSBzYW1lIGhvdCBrZXkgdG8gYmUgbWlzcmVwb3J0ZWQgYXMgYQorCQlzaW5nbGUga2V5IHByZXNzLCBvciB0byBub3QgZXZlbiBiZSBkZXRlY3RlZCBhdCBhbGwuCisJCVRoZSByZWNvbW1lbmRlZCBwb2xsaW5nIGZyZXF1ZW5jeSBpcyAxMEh6LgorCiAJaG90a2V5X3JhZGlvX3N3OgogCQlpZiB0aGUgVGhpbmtQYWQgaGFzIGEgaGFyZHdhcmUgcmFkaW8gc3dpdGNoLCB0aGlzCiAJCWF0dHJpYnV0ZSB3aWxsIHJlYWQgMCBpZiB0aGUgc3dpdGNoIGlzIGluIHRoZSAicmFkaW9zCiAJCWRpc2FibGVkIiBwb3N0aXRpb24sIGFuZCAxIGlmIHRoZSBzd2l0Y2ggaXMgaW4gdGhlCiAJCSJyYWRpb3MgZW5hYmxlZCIgcG9zaXRpb24uCiAKKwkJVGhpcyBhdHRyaWJ1dGUgaGFzIHBvbGwoKS9zZWxlY3QoKSBzdXBwb3J0LgorCiAJaG90a2V5X3JlcG9ydF9tb2RlOgogCQlSZXR1cm5zIHRoZSBzdGF0ZSBvZiB0aGUgcHJvY2ZzIEFDUEkgZXZlbnQgcmVwb3J0IG1vZGUKIAkJZmlsdGVyIGZvciBob3Qga2V5cy4gIElmIGl0IGlzIHNldCB0byAxICh0aGUgZGVmYXVsdCksCkBAIC0yNzcsNiArMzI3LDI1IEBACiAJCU1heSByZXR1cm4gLUVQRVJNICh3cml0ZSBhY2Nlc3MgbG9ja2VkIG91dCBieSBtb2R1bGUKIAkJcGFyYW1ldGVyKSBvciAtRUFDQ0VTIChyZWFkLW9ubHkpLgogCisJd2FrZXVwX3JlYXNvbjoKKwkJU2V0IHRvIDEgaWYgdGhlIHN5c3RlbSBpcyB3YWtpbmcgdXAgYmVjYXVzZSB0aGUgdXNlcgorCQlyZXF1ZXN0ZWQgYSBiYXkgZWplY3Rpb24uICBTZXQgdG8gMiBpZiB0aGUgc3lzdGVtIGlzCisJCXdha2luZyB1cCBiZWNhdXNlIHRoZSB1c2VyIHJlcXVlc3RlZCB0aGUgc3lzdGVtIHRvCisJCXVuZG9jay4gIFNldCB0byB6ZXJvIGZvciBub3JtYWwgd2FrZS11cHMgb3Igd2FrZS11cHMKKwkJZHVlIHRvIHVua25vd24gcmVhc29ucy4KKworCQlUaGlzIGF0dHJpYnV0ZSBoYXMgcG9sbCgpL3NlbGVjdCgpIHN1cHBvcnQuCisKKwl3YWtldXBfaG90dW5wbHVnX2NvbXBsZXRlOgorCQlTZXQgdG8gMSBpZiB0aGUgc3lzdGVtIHdhcyB3YWtlbiB1cCBiZWNhdXNlIG9mIGFuCisJCXVuZG9jayBvciBiYXkgZWplY3Rpb24gcmVxdWVzdCwgYW5kIHRoYXQgcmVxdWVzdAorCQl3YXMgc3VjZXNzZnVsbHkgY29tcGxldGVkLiAgQXQgdGhpcyBwb2ludCwgaXQgbWlnaHQKKwkJYmUgdXNlZnVsIHRvIHNlbmQgdGhlIHN5c3RlbSBiYWNrIHRvIHNsZWVwLCBhdCB0aGUKKwkJdXNlcidzIGNob2ljZS4gIFJlZmVyIHRvIEhLRVkgZXZlbnRzIDB4NDAwMyBhbmQKKwkJMHgzMDAzLCBiZWxvdy4KKworCQlUaGlzIGF0dHJpYnV0ZSBoYXMgcG9sbCgpL3NlbGVjdCgpIHN1cHBvcnQuCisKIGlucHV0IGxheWVyIG5vdGVzOgogCiBBIEhvdCBrZXkgaXMgbWFwcGVkIHRvIGEgc2luZ2xlIGlucHV0IGxheWVyIEVWX0tFWSBldmVudCwgcG9zc2libHkKQEAgLTQyNyw2ICs0OTYsMjMgQEAKIFRoZSBhYm92ZSBldmVudHMgYXJlIG5vdCBwcm9wYWdhdGVkIGJ5IHRoZSBkcml2ZXIsIGV4Y2VwdCBmb3IgbGVnYWN5CiBjb21wYXRpYmlsaXR5IHB1cnBvc2VzIHdoZW4gaG90a2V5X3JlcG9ydF9tb2RlIGlzIHNldCB0byAxLgogCisweDIzMDQJCVN5c3RlbSBpcyB3YWtpbmcgdXAgZnJvbSBzdXNwZW5kIHRvIHVuZG9jaworMHgyMzA1CQlTeXN0ZW0gaXMgd2FraW5nIHVwIGZyb20gc3VzcGVuZCB0byBlamVjdCBiYXkKKzB4MjQwNAkJU3lzdGVtIGlzIHdha2luZyB1cCBmcm9tIGhpYmVybmF0aW9uIHRvIHVuZG9jaworMHgyNDA1CQlTeXN0ZW0gaXMgd2FraW5nIHVwIGZyb20gaGliZXJuYXRpb24gdG8gZWplY3QgYmF5CisKK1RoZSBhYm92ZSBldmVudHMgYXJlIG5ldmVyIHByb3BhZ2F0ZWQgYnkgdGhlIGRyaXZlci4KKworMHgzMDAzCQlCYXkgZWplY3Rpb24gKHNlZSAweDJ4MDUpIGNvbXBsZXRlLCBjYW4gc2xlZXAgYWdhaW4KKzB4NDAwMwkJVW5kb2NrZWQgKHNlZSAweDJ4MDQpLCBjYW4gc2xlZXAgYWdhaW4KKzB4NTAwOQkJVGFibGV0IHN3aXZlbDogc3dpdGNoZWQgdG8gdGFibGV0IG1vZGUKKzB4NTAwQQkJVGFibGV0IHN3aXZlbDogc3dpdGNoZWQgdG8gbm9ybWFsIG1vZGUKKzB4NTAwQgkJVGFibGV0IHBlbiBpbnN0ZXJ0ZWQgaW50byBpdHMgc3RvcmFnZSBiYXkKKzB4NTAwQwkJVGFibGV0IHBlbiByZW1vdmVkIGZyb20gaXRzIHN0b3JhZ2UgYmF5CisweDUwMTAJCUJyaWdodG5lc3MgbGV2ZWwgY2hhbmdlZCAobmV3ZXIgTGVub3ZvIEJJT1NlcykKKworVGhlIGFib3ZlIGV2ZW50cyBhcmUgcHJvcGFnYXRlZCBieSB0aGUgZHJpdmVyLgorCiBDb21wYXRpYmlsaXR5IG5vdGVzOgogCiBpYm0tYWNwaSBhbmQgdGhpbmtwYWQtYWNwaSAwLjE1IChtYWlubGluZSBrZXJuZWxzIGJlZm9yZSAyLjYuMjMpIG5ldmVyCkBAIC0xMjYzLDMgKzEzNDksMTcgQEAKIAkJYW5kIHRoZSBod21vbiBjbGFzcyBmb3IgbGlic2Vuc29yczQgKGxtLXNlbnNvcnMgMykKIAkJY29tcGF0aWJpbGl0eS4gIE1vdmVkIGFsbCBod21vbiBhdHRyaWJ1dGVzIHRvIHRoaXMKIAkJbmV3IHBsYXRmb3JtIGRldmljZS4KKworMHgwMjAxMDA6CU1hcmtlciBmb3IgdGhpbmtwYWQtYWNwaSB3aXRoIGhvdCBrZXkgTlZSQU0gcG9sbGluZworCQlzdXBwb3J0LiAgSWYgeW91IG11c3QsIHVzZSBpdCB0byBrbm93IHlvdSBzaG91bGQgbm90CisJCXN0YXJ0IGFuIHVzZXJzcGFjZSBOVlJBTSBwb2xsZXIgKGFsbG93cyB0byBkZXRlY3Qgd2hlbgorCQlOVlJBTSBpcyBjb21waWxlZCBvdXQgYnkgdGhlIHVzZXIgYmVjYXVzZSBpdCBpcworCQl1bm5lZWRlZC91bmRlc2lyZWQgaW4gdGhlIGZpcnN0IHBsYWNlKS4KKzB4MDIwMTAxOglNYXJrZXIgZm9yIHRoaW5rcGFkLWFjcGkgd2l0aCBob3Qga2V5IE5WUkFNIHBvbGxpbmcKKwkJYW5kIHByb3BlciBob3RrZXlfbWFzayBzZW1hbnRoaWNzICh2ZXJzaW9uIDggb2YgdGhlCisJCU5WUkFNIHBvbGxpbmcgcGF0Y2gpLiAgU29tZSBkZXZlbG9wbWVudCBzbmFwc2hvdHMgb2YKKwkJMC4xOCBoYWQgYW4gZWFybGllciB2ZXJzaW9uIHRoYXQgZGlkIHN0cmFuZ2UgdGhpbmdzCisJCXRvIGhvdGtleV9tYXNrLgorCisweDAyMDIwMDoJQWRkIHBvbGwoKS9zZWxlY3QoKSBzdXBwb3J0IHRvIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKKwkJaG90a2V5X3JhZGlvX3N3LCB3YWtldXBfaG90dW5wbHVnX2NvbXBsZXRlLCB3YWtldXBfcmVhc29uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZtL3NsYWJpbmZvLmMgYi9Eb2N1bWVudGF0aW9uL3ZtL3NsYWJpbmZvLmMKaW5kZXggNDg4YzFmMy4uNzEyM2ZlZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92bS9zbGFiaW5mby5jCisrKyBiL0RvY3VtZW50YXRpb24vdm0vc2xhYmluZm8uYwpAQCAtMzIsNiArMzIsMTMgQEAKIAlpbnQgc2FuaXR5X2NoZWNrcywgc2xhYl9zaXplLCBzdG9yZV91c2VyLCB0cmFjZTsKIAlpbnQgb3JkZXIsIHBvaXNvbiwgcmVjbGFpbV9hY2NvdW50LCByZWRfem9uZTsKIAl1bnNpZ25lZCBsb25nIHBhcnRpYWwsIG9iamVjdHMsIHNsYWJzOworCXVuc2lnbmVkIGxvbmcgYWxsb2NfZmFzdHBhdGgsIGFsbG9jX3Nsb3dwYXRoOworCXVuc2lnbmVkIGxvbmcgZnJlZV9mYXN0cGF0aCwgZnJlZV9zbG93cGF0aDsKKwl1bnNpZ25lZCBsb25nIGZyZWVfZnJvemVuLCBmcmVlX2FkZF9wYXJ0aWFsLCBmcmVlX3JlbW92ZV9wYXJ0aWFsOworCXVuc2lnbmVkIGxvbmcgYWxsb2NfZnJvbV9wYXJ0aWFsLCBhbGxvY19zbGFiLCBmcmVlX3NsYWIsIGFsbG9jX3JlZmlsbDsKKwl1bnNpZ25lZCBsb25nIGNwdXNsYWJfZmx1c2gsIGRlYWN0aXZhdGVfZnVsbCwgZGVhY3RpdmF0ZV9lbXB0eTsKKwl1bnNpZ25lZCBsb25nIGRlYWN0aXZhdGVfdG9faGVhZCwgZGVhY3RpdmF0ZV90b190YWlsOworCXVuc2lnbmVkIGxvbmcgZGVhY3RpdmF0ZV9yZW1vdGVfZnJlZXM7CiAJaW50IG51bWFbTUFYX05PREVTXTsKIAlpbnQgbnVtYV9wYXJ0aWFsW01BWF9OT0RFU107CiB9IHNsYWJpbmZvW01BWF9TTEFCU107CkBAIC02NCw4ICs3MSwxMCBAQAogaW50IHNob3dfc2luZ2xlX3JlZiA9IDA7CiBpbnQgc2hvd190b3RhbHMgPSAwOwogaW50IHNvcnRfc2l6ZSA9IDA7CitpbnQgc29ydF9hY3RpdmUgPSAwOwogaW50IHNldF9kZWJ1ZyA9IDA7CiBpbnQgc2hvd19vcHMgPSAwOworaW50IHNob3dfYWN0aXZpdHkgPSAwOwogCiAvKiBEZWJ1ZyBvcHRpb25zICovCiBpbnQgc2FuaXR5ID0gMDsKQEAgLTkzLDggKzEwMiwxMCBAQAogCXByaW50Zigic2xhYmluZm8gNS83LzIwMDcuIChjKSAyMDA3IHNnaS4gY2xhbWV0ZXJAc2dpLmNvbVxuXG4iCiAJCSJzbGFiaW5mbyBbLWFobnB2dHN6XSBbLWQgZGVidWdvcHRzXSBbc2xhYi1yZWdleHBdXG4iCiAJCSItYXwtLWFsaWFzZXMgICAgICAgICAgIFNob3cgYWxpYXNlc1xuIgorCQkiLUF8LS1hY3Rpdml0eSAgICAgICAgICBNb3N0IGFjdGl2ZSBzbGFicyBmaXJzdFxuIgogCQkiLWQ8b3B0aW9ucz58LS1kZWJ1Zz08b3B0aW9ucz4gU2V0L0NsZWFyIERlYnVnIG9wdGlvbnNcbiIKLQkJIi1lfC0tZW1wdHkJCVNob3cgZW1wdHkgc2xhYnNcbiIKKwkJIi1EfC0tZGlzcGxheS1hY3RpdmUgICAgU3dpdGNoIGxpbmUgZm9ybWF0IHRvIGFjdGl2aXR5XG4iCisJCSItZXwtLWVtcHR5ICAgICAgICAgICAgIFNob3cgZW1wdHkgc2xhYnNcbiIKIAkJIi1mfC0tZmlyc3QtYWxpYXMgICAgICAgU2hvdyBmaXJzdCBhbGlhc1xuIgogCQkiLWh8LS1oZWxwICAgICAgICAgICAgICBTaG93IHVzYWdlIGluZm9ybWF0aW9uXG4iCiAJCSItaXwtLWludmVydGVkICAgICAgICAgIEludmVydGVkIGxpc3RcbiIKQEAgLTI4MSw4ICsyOTIsMTEgQEAKIAogdm9pZCBmaXJzdF9saW5lKHZvaWQpCiB7Ci0JcHJpbnRmKCJOYW1lICAgICAgICAgICAgICAgICAgIE9iamVjdHMgT2Jqc2l6ZSAgICBTcGFjZSAiCi0JCSJTbGFicy9QYXJ0L0NwdSAgTy9TIE8gJSVGciAlJUVmIEZsZ1xuIik7CisJaWYgKHNob3dfYWN0aXZpdHkpCisJCXByaW50ZigiTmFtZSAgICAgICAgICAgICAgICAgICBPYmplY3RzICAgIEFsbG9jICAgICBGcmVlICAgJSVGYXN0XG4iKTsKKwllbHNlCisJCXByaW50ZigiTmFtZSAgICAgICAgICAgICAgICAgICBPYmplY3RzIE9ianNpemUgICAgU3BhY2UgIgorCQkJIlNsYWJzL1BhcnQvQ3B1ICBPL1MgTyAlJUZyICUlRWYgRmxnXG4iKTsKIH0KIAogLyoKQEAgLTMwOSw2ICszMjMsMTIgQEAKIAlyZXR1cm4gCXMtPnNsYWJzICogKHBhZ2Vfc2l6ZSA8PCBzLT5vcmRlcik7CiB9CiAKK3Vuc2lnbmVkIGxvbmcgc2xhYl9hY3Rpdml0eShzdHJ1Y3Qgc2xhYmluZm8gKnMpCit7CisJcmV0dXJuIAlzLT5hbGxvY19mYXN0cGF0aCArIHMtPmZyZWVfZmFzdHBhdGggKworCQlzLT5hbGxvY19zbG93cGF0aCArIHMtPmZyZWVfc2xvd3BhdGg7Cit9CisKIHZvaWQgc2xhYl9udW1hKHN0cnVjdCBzbGFiaW5mbyAqcywgaW50IG1vZGUpCiB7CiAJaW50IG5vZGU7CkBAIC0zOTIsNiArNDEyLDcxIEBACiAJcmV0dXJuICJPZmYiOwogfQogCit2b2lkIHNsYWJfc3RhdHMoc3RydWN0IHNsYWJpbmZvICpzKQoreworCXVuc2lnbmVkIGxvbmcgdG90YWxfYWxsb2M7CisJdW5zaWduZWQgbG9uZyB0b3RhbF9mcmVlOworCXVuc2lnbmVkIGxvbmcgdG90YWw7CisKKwlpZiAoIXMtPmFsbG9jX3NsYWIpCisJCXJldHVybjsKKworCXRvdGFsX2FsbG9jID0gcy0+YWxsb2NfZmFzdHBhdGggKyBzLT5hbGxvY19zbG93cGF0aDsKKwl0b3RhbF9mcmVlID0gcy0+ZnJlZV9mYXN0cGF0aCArIHMtPmZyZWVfc2xvd3BhdGg7CisKKwlpZiAoIXRvdGFsX2FsbG9jKQorCQlyZXR1cm47CisKKwlwcmludGYoIlxuIik7CisJcHJpbnRmKCJTbGFiIFBlcmYgQ291bnRlciAgICAgICBBbGxvYyAgICAgRnJlZSAlJUFsICUlRnJcbiIpOworCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCXByaW50ZigiRmFzdHBhdGggICAgICAgICAgICAgJThsdSAlOGx1ICUzbHUgJTNsdVxuIiwKKwkJcy0+YWxsb2NfZmFzdHBhdGgsIHMtPmZyZWVfZmFzdHBhdGgsCisJCXMtPmFsbG9jX2Zhc3RwYXRoICogMTAwIC8gdG90YWxfYWxsb2MsCisJCXMtPmZyZWVfZmFzdHBhdGggKiAxMDAgLyB0b3RhbF9mcmVlKTsKKwlwcmludGYoIlNsb3dwYXRoICAgICAgICAgICAgICU4bHUgJThsdSAlM2x1ICUzbHVcbiIsCisJCXRvdGFsX2FsbG9jIC0gcy0+YWxsb2NfZmFzdHBhdGgsIHMtPmZyZWVfc2xvd3BhdGgsCisJCSh0b3RhbF9hbGxvYyAtIHMtPmFsbG9jX2Zhc3RwYXRoKSAqIDEwMCAvIHRvdGFsX2FsbG9jLAorCQlzLT5mcmVlX3Nsb3dwYXRoICogMTAwIC8gdG90YWxfZnJlZSk7CisJcHJpbnRmKCJQYWdlIEFsbG9jICAgICAgICAgICAlOGx1ICU4bHUgJTNsdSAlM2x1XG4iLAorCQlzLT5hbGxvY19zbGFiLCBzLT5mcmVlX3NsYWIsCisJCXMtPmFsbG9jX3NsYWIgKiAxMDAgLyB0b3RhbF9hbGxvYywKKwkJcy0+ZnJlZV9zbGFiICogMTAwIC8gdG90YWxfZnJlZSk7CisJcHJpbnRmKCJBZGQgcGFydGlhbCAgICAgICAgICAlOGx1ICU4bHUgJTNsdSAlM2x1XG4iLAorCQlzLT5kZWFjdGl2YXRlX3RvX2hlYWQgKyBzLT5kZWFjdGl2YXRlX3RvX3RhaWwsCisJCXMtPmZyZWVfYWRkX3BhcnRpYWwsCisJCShzLT5kZWFjdGl2YXRlX3RvX2hlYWQgKyBzLT5kZWFjdGl2YXRlX3RvX3RhaWwpICogMTAwIC8gdG90YWxfYWxsb2MsCisJCXMtPmZyZWVfYWRkX3BhcnRpYWwgKiAxMDAgLyB0b3RhbF9mcmVlKTsKKwlwcmludGYoIlJlbW92ZSBwYXJ0aWFsICAgICAgICU4bHUgJThsdSAlM2x1ICUzbHVcbiIsCisJCXMtPmFsbG9jX2Zyb21fcGFydGlhbCwgcy0+ZnJlZV9yZW1vdmVfcGFydGlhbCwKKwkJcy0+YWxsb2NfZnJvbV9wYXJ0aWFsICogMTAwIC8gdG90YWxfYWxsb2MsCisJCXMtPmZyZWVfcmVtb3ZlX3BhcnRpYWwgKiAxMDAgLyB0b3RhbF9mcmVlKTsKKworCXByaW50ZigiUmVtb3RlT2JqL1NsYWJGcm96ZW4gJThsdSAlOGx1ICUzbHUgJTNsdVxuIiwKKwkJcy0+ZGVhY3RpdmF0ZV9yZW1vdGVfZnJlZXMsIHMtPmZyZWVfZnJvemVuLAorCQlzLT5kZWFjdGl2YXRlX3JlbW90ZV9mcmVlcyAqIDEwMCAvIHRvdGFsX2FsbG9jLAorCQlzLT5mcmVlX2Zyb3plbiAqIDEwMCAvIHRvdGFsX2ZyZWUpOworCisJcHJpbnRmKCJUb3RhbCAgICAgICAgICAgICAgICAlOGx1ICU4bHVcblxuIiwgdG90YWxfYWxsb2MsIHRvdGFsX2ZyZWUpOworCisJaWYgKHMtPmNwdXNsYWJfZmx1c2gpCisJCXByaW50ZigiRmx1c2hlcyAlOGx1XG4iLCBzLT5jcHVzbGFiX2ZsdXNoKTsKKworCWlmIChzLT5hbGxvY19yZWZpbGwpCisJCXByaW50ZigiUmVmaWxsICU4bHVcbiIsIHMtPmFsbG9jX3JlZmlsbCk7CisKKwl0b3RhbCA9IHMtPmRlYWN0aXZhdGVfZnVsbCArIHMtPmRlYWN0aXZhdGVfZW1wdHkgKworCQkJcy0+ZGVhY3RpdmF0ZV90b19oZWFkICsgcy0+ZGVhY3RpdmF0ZV90b190YWlsOworCisJaWYgKHRvdGFsKQorCQlwcmludGYoIkRlYWN0aXZhdGUgRnVsbD0lbHUoJWx1JSUpIEVtcHR5PSVsdSglbHUlJSkgIgorCQkJIlRvSGVhZD0lbHUoJWx1JSUpIFRvVGFpbD0lbHUoJWx1JSUpXG4iLAorCQkJcy0+ZGVhY3RpdmF0ZV9mdWxsLCAocy0+ZGVhY3RpdmF0ZV9mdWxsICogMTAwKSAvIHRvdGFsLAorCQkJcy0+ZGVhY3RpdmF0ZV9lbXB0eSwgKHMtPmRlYWN0aXZhdGVfZW1wdHkgKiAxMDApIC8gdG90YWwsCisJCQlzLT5kZWFjdGl2YXRlX3RvX2hlYWQsIChzLT5kZWFjdGl2YXRlX3RvX2hlYWQgKiAxMDApIC8gdG90YWwsCisJCQlzLT5kZWFjdGl2YXRlX3RvX3RhaWwsIChzLT5kZWFjdGl2YXRlX3RvX3RhaWwgKiAxMDApIC8gdG90YWwpOworfQorCiB2b2lkIHJlcG9ydChzdHJ1Y3Qgc2xhYmluZm8gKnMpCiB7CiAJaWYgKHN0cmNtcChzLT5uYW1lLCAiKiIpID09IDApCkBAIC00MzAsNiArNTE1LDcgQEAKIAlvcHMocyk7CiAJc2hvd190cmFja2luZyhzKTsKIAlzbGFiX251bWEocywgMSk7CisJc2xhYl9zdGF0cyhzKTsKIH0KIAogdm9pZCBzbGFiY2FjaGUoc3RydWN0IHNsYWJpbmZvICpzKQpAQCAtNDc5LDEzICs1NjUsMjcgQEAKIAkJKnArKyA9ICdUJzsKIAogCSpwID0gMDsKLQlwcmludGYoIiUtMjFzICU4bGQgJTdkICU4cyAlMTRzICU0ZCAlMWQgJTNsZCAlM2xkICVzXG4iLAotCQlzLT5uYW1lLCBzLT5vYmplY3RzLCBzLT5vYmplY3Rfc2l6ZSwgc2l6ZV9zdHIsIGRpc3Rfc3RyLAotCQlzLT5vYmpzX3Blcl9zbGFiLCBzLT5vcmRlciwKLQkJcy0+c2xhYnMgPyAocy0+cGFydGlhbCAqIDEwMCkgLyBzLT5zbGFicyA6IDEwMCwKLQkJcy0+c2xhYnMgPyAocy0+b2JqZWN0cyAqIHMtPm9iamVjdF9zaXplICogMTAwKSAvCi0JCQkocy0+c2xhYnMgKiAocGFnZV9zaXplIDw8IHMtPm9yZGVyKSkgOiAxMDAsCi0JCWZsYWdzKTsKKwlpZiAoc2hvd19hY3Rpdml0eSkgeworCQl1bnNpZ25lZCBsb25nIHRvdGFsX2FsbG9jOworCQl1bnNpZ25lZCBsb25nIHRvdGFsX2ZyZWU7CisKKwkJdG90YWxfYWxsb2MgPSBzLT5hbGxvY19mYXN0cGF0aCArIHMtPmFsbG9jX3Nsb3dwYXRoOworCQl0b3RhbF9mcmVlID0gcy0+ZnJlZV9mYXN0cGF0aCArIHMtPmZyZWVfc2xvd3BhdGg7CisKKwkJcHJpbnRmKCIlLTIxcyAlOGxkICU4bGQgJThsZCAlM2xkICUzbGQgXG4iLAorCQkJcy0+bmFtZSwgcy0+b2JqZWN0cywKKwkJCXRvdGFsX2FsbG9jLCB0b3RhbF9mcmVlLAorCQkJdG90YWxfYWxsb2MgPyAocy0+YWxsb2NfZmFzdHBhdGggKiAxMDAgLyB0b3RhbF9hbGxvYykgOiAwLAorCQkJdG90YWxfZnJlZSA/IChzLT5mcmVlX2Zhc3RwYXRoICogMTAwIC8gdG90YWxfZnJlZSkgOiAwKTsKKwl9CisJZWxzZQorCQlwcmludGYoIiUtMjFzICU4bGQgJTdkICU4cyAlMTRzICU0ZCAlMWQgJTNsZCAlM2xkICVzXG4iLAorCQkJcy0+bmFtZSwgcy0+b2JqZWN0cywgcy0+b2JqZWN0X3NpemUsIHNpemVfc3RyLCBkaXN0X3N0ciwKKwkJCXMtPm9ianNfcGVyX3NsYWIsIHMtPm9yZGVyLAorCQkJcy0+c2xhYnMgPyAocy0+cGFydGlhbCAqIDEwMCkgLyBzLT5zbGFicyA6IDEwMCwKKwkJCXMtPnNsYWJzID8gKHMtPm9iamVjdHMgKiBzLT5vYmplY3Rfc2l6ZSAqIDEwMCkgLworCQkJCShzLT5zbGFicyAqIChwYWdlX3NpemUgPDwgcy0+b3JkZXIpKSA6IDEwMCwKKwkJCWZsYWdzKTsKIH0KIAogLyoKQEAgLTg5Miw2ICs5OTIsOCBAQAogCiAJCQlpZiAoc29ydF9zaXplKQogCQkJCXJlc3VsdCA9IHNsYWJfc2l6ZShzMSkgPCBzbGFiX3NpemUoczIpOworCQkJZWxzZSBpZiAoc29ydF9hY3RpdmUpCisJCQkJcmVzdWx0ID0gc2xhYl9hY3Rpdml0eShzMSkgPCBzbGFiX2FjdGl2aXR5KHMyKTsKIAkJCWVsc2UKIAkJCQlyZXN1bHQgPSBzdHJjYXNlY21wKHMxLT5uYW1lLCBzMi0+bmFtZSk7CiAKQEAgLTEwNzQsNiArMTE3NiwyMyBAQAogCQkJZnJlZSh0KTsKIAkJCXNsYWItPnN0b3JlX3VzZXIgPSBnZXRfb2JqKCJzdG9yZV91c2VyIik7CiAJCQlzbGFiLT50cmFjZSA9IGdldF9vYmooInRyYWNlIik7CisJCQlzbGFiLT5hbGxvY19mYXN0cGF0aCA9IGdldF9vYmooImFsbG9jX2Zhc3RwYXRoIik7CisJCQlzbGFiLT5hbGxvY19zbG93cGF0aCA9IGdldF9vYmooImFsbG9jX3Nsb3dwYXRoIik7CisJCQlzbGFiLT5mcmVlX2Zhc3RwYXRoID0gZ2V0X29iaigiZnJlZV9mYXN0cGF0aCIpOworCQkJc2xhYi0+ZnJlZV9zbG93cGF0aCA9IGdldF9vYmooImZyZWVfc2xvd3BhdGgiKTsKKwkJCXNsYWItPmZyZWVfZnJvemVuPSBnZXRfb2JqKCJmcmVlX2Zyb3plbiIpOworCQkJc2xhYi0+ZnJlZV9hZGRfcGFydGlhbCA9IGdldF9vYmooImZyZWVfYWRkX3BhcnRpYWwiKTsKKwkJCXNsYWItPmZyZWVfcmVtb3ZlX3BhcnRpYWwgPSBnZXRfb2JqKCJmcmVlX3JlbW92ZV9wYXJ0aWFsIik7CisJCQlzbGFiLT5hbGxvY19mcm9tX3BhcnRpYWwgPSBnZXRfb2JqKCJhbGxvY19mcm9tX3BhcnRpYWwiKTsKKwkJCXNsYWItPmFsbG9jX3NsYWIgPSBnZXRfb2JqKCJhbGxvY19zbGFiIik7CisJCQlzbGFiLT5hbGxvY19yZWZpbGwgPSBnZXRfb2JqKCJhbGxvY19yZWZpbGwiKTsKKwkJCXNsYWItPmZyZWVfc2xhYiA9IGdldF9vYmooImZyZWVfc2xhYiIpOworCQkJc2xhYi0+Y3B1c2xhYl9mbHVzaCA9IGdldF9vYmooImNwdXNsYWJfZmx1c2giKTsKKwkJCXNsYWItPmRlYWN0aXZhdGVfZnVsbCA9IGdldF9vYmooImRlYWN0aXZhdGVfZnVsbCIpOworCQkJc2xhYi0+ZGVhY3RpdmF0ZV9lbXB0eSA9IGdldF9vYmooImRlYWN0aXZhdGVfZW1wdHkiKTsKKwkJCXNsYWItPmRlYWN0aXZhdGVfdG9faGVhZCA9IGdldF9vYmooImRlYWN0aXZhdGVfdG9faGVhZCIpOworCQkJc2xhYi0+ZGVhY3RpdmF0ZV90b190YWlsID0gZ2V0X29iaigiZGVhY3RpdmF0ZV90b190YWlsIik7CisJCQlzbGFiLT5kZWFjdGl2YXRlX3JlbW90ZV9mcmVlcyA9IGdldF9vYmooImRlYWN0aXZhdGVfcmVtb3RlX2ZyZWVzIik7CiAJCQljaGRpcigiLi4iKTsKIAkJCWlmIChzbGFiLT5uYW1lWzBdID09ICc6JykKIAkJCQlhbGlhc190YXJnZXRzKys7CkBAIC0xMTI0LDcgKzEyNDMsOSBAQAogCiBzdHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9IHsKIAl7ICJhbGlhc2VzIiwgMCwgTlVMTCwgJ2EnIH0sCisJeyAiYWN0aXZpdHkiLCAwLCBOVUxMLCAnQScgfSwKIAl7ICJkZWJ1ZyIsIDIsIE5VTEwsICdkJyB9LAorCXsgImRpc3BsYXktYWN0aXZpdHkiLCAwLCBOVUxMLCAnRCcgfSwKIAl7ICJlbXB0eSIsIDAsIE5VTEwsICdlJyB9LAogCXsgImZpcnN0LWFsaWFzIiwgMCwgTlVMTCwgJ2YnIH0sCiAJeyAiaGVscCIsIDAsIE5VTEwsICdoJyB9LApAQCAtMTE0OSw3ICsxMjcwLDcgQEAKIAogCXBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7CiAKLQl3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiYWQ6OmVmaGlsMW5vcHJzdHZ6VFMiLAorCXdoaWxlICgoYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJhQWQ6OkRlZmhpbDFub3Byc3R2elRTIiwKIAkJCQkJCW9wdHMsIE5VTEwpKSAhPSAtMSkKIAkJc3dpdGNoIChjKSB7CiAJCWNhc2UgJzEnOgpAQCAtMTE1OCwxMSArMTI3OSwxNyBAQAogCQljYXNlICdhJzoKIAkJCXNob3dfYWxpYXMgPSAxOwogCQkJYnJlYWs7CisJCWNhc2UgJ0EnOgorCQkJc29ydF9hY3RpdmUgPSAxOworCQkJYnJlYWs7CiAJCWNhc2UgJ2QnOgogCQkJc2V0X2RlYnVnID0gMTsKIAkJCWlmICghZGVidWdfb3B0X3NjYW4ob3B0YXJnKSkKIAkJCQlmYXRhbCgiSW52YWxpZCBkZWJ1ZyBvcHRpb24gJyVzJ1xuIiwgb3B0YXJnKTsKIAkJCWJyZWFrOworCQljYXNlICdEJzoKKwkJCXNob3dfYWN0aXZpdHkgPSAxOworCQkJYnJlYWs7CiAJCWNhc2UgJ2UnOgogCQkJc2hvd19lbXB0eSA9IDE7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggMWY4MWI0ZS4uYzQwZjBhZSAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTIwMiw2ICsyMDIsMTMgQEAKIFc6CWh0dHA6Ly93d3cuYWRhcHRlYy5jb20vCiBTOglTdXBwb3J0ZWQKIAorQUNFUiBXTUkgTEFQVE9QIEVYVFJBUworUDoJQ2FybG9zIENvcmJhY2hvCitNOgljYXJsb3NAc3RyYW5nZXdvcmxkcy5jby51aworTDoJYWNlcmFjcGlAZ29vZ2xlZ3JvdXBzLmNvbSAoc3Vic2NyaWJlcnMtb25seSkKK1c6CWh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9hY2VyYWNwaQorUzoJTWFpbnRhaW5lZAorCiBBQ1BJCiBQOglMZW4gQnJvd24KIE06CWxlbi5icm93bkBpbnRlbC5jb20KQEAgLTI1Miw2ICsyNTksMTMgQEAKIFc6CWh0dHA6Ly9hY3BpLnNvdXJjZWZvcmdlLm5ldC8KIFM6CVN1cHBvcnRlZAogCitBQ1BJIFdNSSBEUklWRVIKK1A6ICAgICAgQ2FybG9zIENvcmJhY2hvCitNOiAgICAgIGNhcmxvc0BzdHJhbmdld29ybGRzLmNvLnVrCitMOiAgICAgIGxpbnV4LWFjcGlAdmdlci5rZXJuZWwub3JnCitXOiAgICAgIGh0dHA6Ly93d3cubGVzc3dhdHRzLm9yZy9wcm9qZWN0cy9hY3BpLworUzogICAgICBNYWludGFpbmVkCisKIEFETTEwMjUgSEFSRFdBUkUgTU9OSVRPUiBEUklWRVIKIFA6CUplYW4gRGVsdmFyZQogTToJa2hhbGlAbGludXgtZnIub3JnCkBAIC02NzQsNiArNjg4LDEyIEBACiBXOglodHRwOi8vd3d3LmF0OTEuY29tLwogUzoJTWFpbnRhaW5lZAogCitBVE1FTCBBVDkxIC8gQVQzMiBTRVJJQUwgRFJJVkVSCitQOglIYWF2YXJkIFNraW5uZW1vZW4KK006CWhza2lubmVtb2VuQGF0bWVsLmNvbQorTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZworUzoJU3VwcG9ydGVkCisKIEFUTUVMIExDREZCIERSSVZFUgogUDoJTmljb2xhcyBGZXJyZQogTToJbmljb2xhcy5mZXJyZUBhdG1lbC5jb20KQEAgLTExNTMsNiArMTE3Myw4IEBACiBDUklTIFBPUlQKIFA6CU1pa2FlbCBTdGFydmlrCiBNOglzdGFydmlrQGF4aXMuY29tCitQOglKZXNwZXIgTmlsc3NvbgorTToJamVzcGVyLm5pbHNzb25AYXhpcy5jb20KIEw6CWRldi1ldHJheEBheGlzLmNvbQogVzoJaHR0cDovL2RldmVsb3Blci5heGlzLmNvbQogUzoJTWFpbnRhaW5lZApAQCAtMTM3MSw2ICsxMzkzLDExIEBACiBUOglnaXQga2VybmVsLm9yZzovcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21jaGVoYWIvdjRsLWR2Yi5naXQKIFM6CU1haW50YWluZWQKIAorRFogREVDU1RBVElPTiBEWjExIFNFUklBTCBEUklWRVIKK1A6CU1hY2llaiBXLiBSb3p5Y2tpCitNOgltYWNyb0BsaW51eC1taXBzLm9yZworUzoJTWFpbnRhaW5lZAorCiBFQVRBLURNQSBTQ1NJIERSSVZFUgogUDoJTWljaGFlbCBOZXVmZmVyCiBMOglsaW51eC1lYXRhQGktY29ubmVjdC5uZXQsIGxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCkBAIC0xNzg1LDYgKzE4MTIsMTEgQEAKIE06CXBlcmV4QHBlcmV4LmN6CiBTOglNYWludGFpbmVkCiAKK0hQIENPTVBBUSBUQzExMDAgVEFCTEVUIFdNSSBFWFRSQVMgRFJJVkVSCitQOglDYXJsb3MgQ29yYmFjaG8KK006CWNhcmxvc0BzdHJhbmdld29ybGRzLmNvLnVrCitTOglPZGQgRml4ZXMKKwogSFBFVDoJSGlnaCBQcmVjaXNpb24gRXZlbnQgVGltZXJzIGRyaXZlciAoaHBldC5jKQogUDoJQ2xlbWVucyBMYWRpc2NoCiBNOgljbGVtZW5zQGxhZGlzY2guZGUKQEAgLTIxMjYsNiArMjE1OCwxNCBAQAogTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogCitJUFdJUkVMRVMgRFJJVkVSCitQOglKaXJpIEtvc2luYQorTToJamtvc2luYUBzdXNlLmN6CitQOglEYXZpZCBTdGVyYmEKK006CWRzdGVyYmFAc3VzZS5jegorUzoJTWFpbnRhaW5lZAorVDoJZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2ppa29zL2lwd2lyZWxlc3NfY3MuZ2l0CisKIElSREEgU1VCU1lTVEVNCiBQOglTYW11ZWwgT3J0aXoKIE06CXNhbXVlbEBzb3J0aXoub3JnCkBAIC0yNTgyLDYgKzI2MjIsMTUgQEAKIFc6CWh0dHA6Ly93d3cubGludXgtbW0ub3JnCiBTOglNYWludGFpbmVkCiAKK01FSSBNTjEwMzAwL0FNMzMgUE9SVAorUDoJRGF2aWQgSG93ZWxscworTToJZGhvd2VsbHNAcmVkaGF0LmNvbQorUDoJS29pY2hpIFlhc3V0YWtlCitNOgl5YXN1dGFrZS5rb2ljaGlAanAucGFuYXNvbmljLmNvbQorTDoJbGludXgtYW0zMy1saXN0QHJlZGhhdC5jb20KK1c6CWZ0cDovL2Z0cC5yZWRoYXQuY29tL3B1Yi9yZWRoYXQvZ251cHJvL0FNMzMvCitTOglNYWludGFpbmVkCisKIE1FTU9SWSBURUNITk9MT0dZIERFVklDRVMgKE1URCkKIFA6CURhdmlkIFdvb2Rob3VzZQogTToJZHdtdzJAaW5mcmFkZWFkLm9yZwpAQCAtMzIxMiw2ICszMjYxLDExIEBACiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvCiAKK1JBTURJU0sgUkFNIEJMT0NLIERFVklDRSBEUklWRVIKK1A6CU5pY2sgUGlnZ2luCitNOglucGlnZ2luQHN1c2UuZGUKK1M6CU1haW50YWluZWQKKwogUkFORE9NIE5VTUJFUiBEUklWRVIKIFA6CU1hdHQgTWFja2FsbAogTToJbXBtQHNlbGVuaWMuY29tCkBAIC0zNTcyLDYgKzM2MjYsMTMgQEAKIFc6CWh0dHA6Ly93d3cubGludXguaXQvfm1hbGF0dGlhL3dpa2kvaW5kZXgucGhwL1NvbnlfZHJpdmVycwogUzoJTWFpbnRhaW5lZAogCitTT05ZIE1FTU9SWVNUSUNLIENBUkQgU1VQUE9SVAorUDoJQWxleCBEdWJvdgorTToJb2FrYWRAeWFob28uY29tCitMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCitXOglodHRwOi8vdGlmbXh4LmJlcmxpb3MuZGUvCitTOglNYWludGFpbmVkCisKIFNPVU5ECiBQOglKYXJvc2xhdiBLeXNlbGEKIE06CXBlcmV4QHBlcmV4LmN6CkBAIC0zODQ3LDggKzM5MDgsOCBAQAogUzoJTWFpbnRhaW5lZAogCiBVREYgRklMRVNZU1RFTQotUDoJQmVuIEZlbm5lbWEKLU06CWJmZW5uZW1hQGZhbGNvbi5jc2MuY2FscG9seS5lZHUKK1A6CUphbiBLYXJhCitNOglqYWNrQHN1c2UuY3oKIFc6CWh0dHA6Ly9saW51eC11ZGYuc291cmNlZm9yZ2UubmV0CiBTOglNYWludGFpbmVkCiAKZGlmZiAtLWdpdCBhL1JFUE9SVElORy1CVUdTIGIvUkVQT1JUSU5HLUJVR1MKaW5kZXggYWMwMmU0Mi4uYWIwYzU2NiAxMDA2NDQKLS0tIGEvUkVQT1JUSU5HLUJVR1MKKysrIGIvUkVQT1JUSU5HLUJVR1MKQEAgLTEwLDExICsxMCwxMiBAQAogdG8gbWFrZSBpdCB1c2VmdWwgdG8gdGhlIHJlY2lwaWVudC4KIAogICAgICAgU2VuZCB0aGUgb3V0cHV0IHRvIHRoZSBtYWludGFpbmVyIG9mIHRoZSBrZXJuZWwgYXJlYSB0aGF0IHNlZW1zIHRvCi1iZSBpbnZvbHZlZCB3aXRoIHRoZSBwcm9ibGVtLiBEb24ndCB3b3JyeSB0b28gbXVjaCBhYm91dCBnZXR0aW5nIHRoZQotd3JvbmcgcGVyc29uLiBJZiB5b3UgYXJlIHVuc3VyZSBzZW5kIGl0IHRvIHRoZSBwZXJzb24gcmVzcG9uc2libGUgZm9yIHRoZQotY29kZSByZWxldmFudCB0byB3aGF0IHlvdSB3ZXJlIGRvaW5nLiBJZiBpdCBvY2N1cnMgcmVwZWF0YWJseSB0cnkgYW5kCi1kZXNjcmliZSBob3cgdG8gcmVjcmVhdGUgaXQuIFRoYXQgaXMgd29ydGggZXZlbiBtb3JlIHRoYW4gdGhlIG9vcHMgaXRzZWxmLgotVGhlIGxpc3Qgb2YgbWFpbnRhaW5lcnMgaXMgaW4gdGhlIE1BSU5UQUlORVJTIGZpbGUgaW4gdGhpcyBkaXJlY3RvcnkuCitiZSBpbnZvbHZlZCB3aXRoIHRoZSBwcm9ibGVtLCBhbmQgY2MgdGhlIHJlbGV2YW50IG1haWxpbmcgbGlzdC4gRG9uJ3QKK3dvcnJ5IHRvbyBtdWNoIGFib3V0IGdldHRpbmcgdGhlIHdyb25nIHBlcnNvbi4gSWYgeW91IGFyZSB1bnN1cmUgc2VuZCBpdAordG8gdGhlIHBlcnNvbiByZXNwb25zaWJsZSBmb3IgdGhlIGNvZGUgcmVsZXZhbnQgdG8gd2hhdCB5b3Ugd2VyZSBkb2luZy4KK0lmIGl0IG9jY3VycyByZXBlYXRhYmx5IHRyeSBhbmQgZGVzY3JpYmUgaG93IHRvIHJlY3JlYXRlIGl0LiBUaGF0IGlzCit3b3J0aCBldmVuIG1vcmUgdGhhbiB0aGUgb29wcyBpdHNlbGYuICBUaGUgbGlzdCBvZiBtYWludGFpbmVycyBhbmQKK21haWxpbmcgbGlzdHMgaXMgaW4gdGhlIE1BSU5UQUlORVJTIGZpbGUgaW4gdGhpcyBkaXJlY3RvcnkuCiAKICAgICAgIElmIGl0IGlzIGEgc2VjdXJpdHkgYnVnLCBwbGVhc2UgY29weSB0aGUgU2VjdXJpdHkgQ29udGFjdCBsaXN0ZWQKIGluIHRoZSBNQUlOVEFJTkVSUyBmaWxlLiAgVGhleSBjYW4gaGVscCBjb29yZGluYXRlIGJ1Z2ZpeCBhbmQgZGlzY2xvc3VyZS4KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvS2NvbmZpZyBiL2FyY2gvYWxwaGEvS2NvbmZpZwppbmRleCAwMWIxMGFiLi41YjdkY2Q1IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL0tjb25maWcKKysrIGIvYXJjaC9hbHBoYS9LY29uZmlnCkBAIC02Nyw2ICs2Nyw5IEBACiAJZGVwZW5kcyBvbiBTTVAKIAlkZWZhdWx0IHkKIAorY29uZmlnIEFSQ0hfU1VQUE9SVFNfQU9VVAorCWRlZl9ib29sIHkKKwogc291cmNlICJpbml0L0tjb25maWciCiAKIApAQCAtNjEyLDYgKzYxNSwxMSBAQAogCiAJICBUYWtlIHRoZSBkZWZhdWx0ICgxKSB1bmxlc3MgeW91IHdhbnQgbW9yZSBjb250cm9sIG9yIG1vcmUgaW5mby4KIAorY29uZmlnIEhaCisJaW50CisJZGVmYXVsdCAxMjAwIGlmIEFMUEhBX1JBV0hJREUKKwlkZWZhdWx0IDEwMjQKKwogc291cmNlICJkcml2ZXJzL3BjaS9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL2Vpc2EvS2NvbmZpZyIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvY29yZV9pcm9uZ2F0ZS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvY29yZV9pcm9uZ2F0ZS5jCmluZGV4IGU0YTBiY2YuLmE4NzIwNzggMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL2NvcmVfaXJvbmdhdGUuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9jb3JlX2lyb25nYXRlLmMKQEAgLTI0MSw3ICsyNDEsOCBAQAogCQkJCSAgICAgICBzaXplIC8gMTAyNCk7CiAJCX0KICNlbmRpZgotCQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoMCksIHBjaV9tZW0sIG1lbXRvcCAtIHBjaV9tZW0pOworCQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoMCksIHBjaV9tZW0sIG1lbXRvcCAtCisJCQkJcGNpX21lbSwgQk9PVE1FTV9ERUZBVUxUKTsKIAkJcHJpbnRrKCJpcm9uZ2F0ZV9pbml0X2FyY2g6IHRlbXBvcmFyaWx5IHJlc2VydmluZyAiCiAJCQkicmVnaW9uICUwOGx4LSUwOGx4IGZvciBQQ0lcbiIsIHBjaV9tZW0sIG1lbXRvcCAtIDEpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL29zZl9zeXMuYyBiL2FyY2gvYWxwaGEva2VybmVsL29zZl9zeXMuYwppbmRleCA3MmY5YTYxLi45NzNjNWMzIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9vc2Zfc3lzLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvb3NmX3N5cy5jCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXguaD4KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvYWxwaGEva2VybmVsL3Byb2Nlc3MuYwppbmRleCA5MmI2MTYyLi45NmVkODJmIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KQEAgLTMxOCw2OCArMzE3LDYgQEAKIH0KIAogLyoKLSAqIEZpbGwgaW4gdGhlIHVzZXIgc3RydWN0dXJlIGZvciBhbiBFQ09GRiBjb3JlIGR1bXAuCi0gKi8KLXZvaWQKLWR1bXBfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICogcHQsIHN0cnVjdCB1c2VyICogZHVtcCkKLXsKLQkvKiBzd2l0Y2ggc3RhY2sgZm9sbG93cyByaWdodCBiZWxvdyBwdF9yZWdzOiAqLwotCXN0cnVjdCBzd2l0Y2hfc3RhY2sgKiBzdyA9ICgoc3RydWN0IHN3aXRjaF9zdGFjayAqKSBwdCkgLSAxOwotCi0JZHVtcC0+bWFnaWMgPSBDTUFHSUM7Ci0JZHVtcC0+c3RhcnRfY29kZSAgPSBjdXJyZW50LT5tbS0+c3RhcnRfY29kZTsKLQlkdW1wLT5zdGFydF9kYXRhICA9IGN1cnJlbnQtPm1tLT5zdGFydF9kYXRhOwotCWR1bXAtPnN0YXJ0X3N0YWNrID0gcmR1c3AoKSAmIH4oUEFHRV9TSVpFIC0gMSk7Ci0JZHVtcC0+dV90c2l6ZSA9ICgoY3VycmVudC0+bW0tPmVuZF9jb2RlIC0gZHVtcC0+c3RhcnRfY29kZSkKLQkJCSA+PiBQQUdFX1NISUZUKTsKLQlkdW1wLT51X2RzaXplID0gKChjdXJyZW50LT5tbS0+YnJrICsgUEFHRV9TSVpFLTEgLSBkdW1wLT5zdGFydF9kYXRhKQotCQkJID4+IFBBR0VfU0hJRlQpOwotCWR1bXAtPnVfc3NpemUgPSAoY3VycmVudC0+bW0tPnN0YXJ0X3N0YWNrIC0gZHVtcC0+c3RhcnRfc3RhY2sKLQkJCSArIFBBR0VfU0laRS0xKSA+PiBQQUdFX1NISUZUOwotCi0JLyoKLQkgKiBXZSBzdG9yZSB0aGUgcmVnaXN0ZXJzIGluIGFuIG9yZGVyL2Zvcm1hdCB0aGF0IGlzCi0JICogY29tcGF0aWJsZSB3aXRoIERFQyBVbml4L09TRi8xIGFzIHRoaXMgbWFrZXMgbGlmZSBlYXNpZXIKLQkgKiBmb3IgZ2RiLgotCSAqLwotCWR1bXAtPnJlZ3NbRUZfVjBdICA9IHB0LT5yMDsKLQlkdW1wLT5yZWdzW0VGX1QwXSAgPSBwdC0+cjE7Ci0JZHVtcC0+cmVnc1tFRl9UMV0gID0gcHQtPnIyOwotCWR1bXAtPnJlZ3NbRUZfVDJdICA9IHB0LT5yMzsKLQlkdW1wLT5yZWdzW0VGX1QzXSAgPSBwdC0+cjQ7Ci0JZHVtcC0+cmVnc1tFRl9UNF0gID0gcHQtPnI1OwotCWR1bXAtPnJlZ3NbRUZfVDVdICA9IHB0LT5yNjsKLQlkdW1wLT5yZWdzW0VGX1Q2XSAgPSBwdC0+cjc7Ci0JZHVtcC0+cmVnc1tFRl9UN10gID0gcHQtPnI4OwotCWR1bXAtPnJlZ3NbRUZfUzBdICA9IHN3LT5yOTsKLQlkdW1wLT5yZWdzW0VGX1MxXSAgPSBzdy0+cjEwOwotCWR1bXAtPnJlZ3NbRUZfUzJdICA9IHN3LT5yMTE7Ci0JZHVtcC0+cmVnc1tFRl9TM10gID0gc3ctPnIxMjsKLQlkdW1wLT5yZWdzW0VGX1M0XSAgPSBzdy0+cjEzOwotCWR1bXAtPnJlZ3NbRUZfUzVdICA9IHN3LT5yMTQ7Ci0JZHVtcC0+cmVnc1tFRl9TNl0gID0gc3ctPnIxNTsKLQlkdW1wLT5yZWdzW0VGX0EzXSAgPSBwdC0+cjE5OwotCWR1bXAtPnJlZ3NbRUZfQTRdICA9IHB0LT5yMjA7Ci0JZHVtcC0+cmVnc1tFRl9BNV0gID0gcHQtPnIyMTsKLQlkdW1wLT5yZWdzW0VGX1Q4XSAgPSBwdC0+cjIyOwotCWR1bXAtPnJlZ3NbRUZfVDldICA9IHB0LT5yMjM7Ci0JZHVtcC0+cmVnc1tFRl9UMTBdID0gcHQtPnIyNDsKLQlkdW1wLT5yZWdzW0VGX1QxMV0gPSBwdC0+cjI1OwotCWR1bXAtPnJlZ3NbRUZfUkFdICA9IHB0LT5yMjY7Ci0JZHVtcC0+cmVnc1tFRl9UMTJdID0gcHQtPnIyNzsKLQlkdW1wLT5yZWdzW0VGX0FUXSAgPSBwdC0+cjI4OwotCWR1bXAtPnJlZ3NbRUZfU1BdICA9IHJkdXNwKCk7Ci0JZHVtcC0+cmVnc1tFRl9QU10gID0gcHQtPnBzOwotCWR1bXAtPnJlZ3NbRUZfUENdICA9IHB0LT5wYzsKLQlkdW1wLT5yZWdzW0VGX0dQXSAgPSBwdC0+Z3A7Ci0JZHVtcC0+cmVnc1tFRl9BMF0gID0gcHQtPnIxNjsKLQlkdW1wLT5yZWdzW0VGX0ExXSAgPSBwdC0+cjE3OwotCWR1bXAtPnJlZ3NbRUZfQTJdICA9IHB0LT5yMTg7Ci0JbWVtY3B5KChjaGFyICopZHVtcC0+cmVncyArIEVGX1NJWkUsIHN3LT5mcCwgMzIgKiA4KTsKLX0KLUVYUE9SVF9TWU1CT0woZHVtcF90aHJlYWQpOwotCi0vKgogICogRmlsbCBpbiB0aGUgdXNlciBzdHJ1Y3R1cmUgZm9yIGEgRUxGIGNvcmUgZHVtcC4KICAqLwogdm9pZApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvYWxwaGEva2VybmVsL3NldHVwLmMKaW5kZXggYmVmZjYyOS4uYTQ0OWU5OSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zZXR1cC5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjcmVlbl9pbmZvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgpAQCAtNDI4LDcgKzQyNyw4IEBACiAJfQogCiAJLyogUmVzZXJ2ZSB0aGUgYm9vdG1hcCBtZW1vcnkuICAqLwotCXJlc2VydmVfYm9vdG1lbShQRk5fUEhZUyhib290bWFwX3N0YXJ0KSwgYm9vdG1hcF9zaXplKTsKKwlyZXNlcnZlX2Jvb3RtZW0oUEZOX1BIWVMoYm9vdG1hcF9zdGFydCksIGJvb3RtYXBfc2l6ZSwKKwkJCUJPT1RNRU1fREVGQVVMVCk7CiAJcHJpbnRrKCJyZXNlcnZpbmcgcGFnZXMgJWxkOiVsZFxuIiwgYm9vdG1hcF9zdGFydCwgYm9vdG1hcF9zdGFydCtQRk5fVVAoYm9vdG1hcF9zaXplKSk7CiAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKQEAgLTQ0Niw3ICs0NDYsNyBAQAogCQkJCSAgICAgICBwaHlzX3RvX3ZpcnQoUEZOX1BIWVMobWF4X2xvd19wZm4pKSk7CiAJCX0gZWxzZSB7CiAJCQlyZXNlcnZlX2Jvb3RtZW0odmlydF90b19waHlzKCh2b2lkICopaW5pdHJkX3N0YXJ0KSwKLQkJCQkJSU5JVFJEX1NJWkUpOworCQkJCQlJTklUUkRfU0laRSwgQk9PVE1FTV9ERUZBVUxUKTsKIAkJfQogCX0KICNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JTklUUkQgKi8KQEAgLTE0NzEsNyArMTQ3MSw3IEBACiB7CiB9CiAKLXN0cnVjdCBzZXFfb3BlcmF0aW9ucyBjcHVpbmZvX29wID0geworY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGNwdWluZm9fb3AgPSB7CiAJLnN0YXJ0CT0gY19zdGFydCwKIAkubmV4dAk9IGNfbmV4dCwKIAkuc3RvcAk9IGNfc3RvcCwKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvbW0vbnVtYS5jIGIvYXJjaC9hbHBoYS9tbS9udW1hLmMKaW5kZXggZTNlMzgwNi4uMTBhYjc4MyAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9tbS9udW1hLmMKKysrIGIvYXJjaC9hbHBoYS9tbS9udW1hLmMKQEAgLTI0Miw3ICsyNDIsOCBAQAogCX0KIAogCS8qIFJlc2VydmUgdGhlIGJvb3RtYXAgbWVtb3J5LiAgKi8KLQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobmlkKSwgUEZOX1BIWVMoYm9vdG1hcF9zdGFydCksIGJvb3RtYXBfc2l6ZSk7CisJcmVzZXJ2ZV9ib290bWVtX25vZGUoTk9ERV9EQVRBKG5pZCksIFBGTl9QSFlTKGJvb3RtYXBfc3RhcnQpLAorCQkJYm9vdG1hcF9zaXplLCBCT09UTUVNX0RFRkFVTFQpOwogCXByaW50aygiIHJlc2VydmluZyBwYWdlcyAlbGQ6JWxkXG4iLCBib290bWFwX3N0YXJ0LCBib290bWFwX3N0YXJ0K1BGTl9VUChib290bWFwX3NpemUpKTsKIAogCW5vZGVfc2V0X29ubGluZShuaWQpOwpAQCAtMjgxLDcgKzI4Miw3IEBACiAJCQluaWQgPSBrdmFkZHJfdG9fbmlkKGluaXRyZF9zdGFydCk7CiAJCQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobmlkKSwKIAkJCQkJICAgICB2aXJ0X3RvX3BoeXMoKHZvaWQgKilpbml0cmRfc3RhcnQpLAotCQkJCQkgICAgIElOSVRSRF9TSVpFKTsKKwkJCQkJICAgICBJTklUUkRfU0laRSwgQk9PVE1FTV9ERUZBVUxUKTsKIAkJfQogCX0KICNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JTklUUkQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL0tjb25maWcgYi9hcmNoL2FybS9LY29uZmlnCmluZGV4IGUxOWU3NzQuLjQxMjdhZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL0tjb25maWcKKysrIGIvYXJjaC9hcm0vS2NvbmZpZwpAQCAtMTI2LDYgKzEyNiw5IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgQVJDSF9TVVBQT1JUU19BT1VUCisJZGVmX2Jvb2wgeQorCiBjb25maWcgQVJDSF9NQVlfSEFWRV9QQ19GREMKIAlib29sCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDRmMWEwMzEuLjQ2YmYyZWRlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNlci5oPgotI2luY2x1ZGUgPGxpbnV4L2Eub3V0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTM2OCwzNSArMzY3LDYgQEAKIEVYUE9SVF9TWU1CT0woZHVtcF9mcHUpOwogCiAvKgotICogZmlsbCBpbiB0aGUgdXNlciBzdHJ1Y3R1cmUgZm9yIGEgY29yZSBkdW1wLi4KLSAqLwotdm9pZCBkdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIHN0cnVjdCB1c2VyICogZHVtcCkKLXsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7Ci0KLQlkdW1wLT5tYWdpYyA9IENNQUdJQzsKLQlkdW1wLT5zdGFydF9jb2RlID0gdHNrLT5tbS0+c3RhcnRfY29kZTsKLQlkdW1wLT5zdGFydF9zdGFjayA9IHJlZ3MtPkFSTV9zcCAmIH4oUEFHRV9TSVpFIC0gMSk7Ci0KLQlkdW1wLT51X3RzaXplID0gKHRzay0+bW0tPmVuZF9jb2RlIC0gdHNrLT5tbS0+c3RhcnRfY29kZSkgPj4gUEFHRV9TSElGVDsKLQlkdW1wLT51X2RzaXplID0gKHRzay0+bW0tPmJyayAtIHRzay0+bW0tPnN0YXJ0X2RhdGEgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOwotCWR1bXAtPnVfc3NpemUgPSAwOwotCi0JZHVtcC0+dV9kZWJ1Z3JlZ1swXSA9IHRzay0+dGhyZWFkLmRlYnVnLmJwWzBdLmFkZHJlc3M7Ci0JZHVtcC0+dV9kZWJ1Z3JlZ1sxXSA9IHRzay0+dGhyZWFkLmRlYnVnLmJwWzFdLmFkZHJlc3M7Ci0JZHVtcC0+dV9kZWJ1Z3JlZ1syXSA9IHRzay0+dGhyZWFkLmRlYnVnLmJwWzBdLmluc24uYXJtOwotCWR1bXAtPnVfZGVidWdyZWdbM10gPSB0c2stPnRocmVhZC5kZWJ1Zy5icFsxXS5pbnNuLmFybTsKLQlkdW1wLT51X2RlYnVncmVnWzRdID0gdHNrLT50aHJlYWQuZGVidWcubnNhdmVkOwotCi0JaWYgKGR1bXAtPnN0YXJ0X3N0YWNrIDwgMHgwNDAwMDAwMCkKLQkJZHVtcC0+dV9zc2l6ZSA9ICgweDA0MDAwMDAwIC0gZHVtcC0+c3RhcnRfc3RhY2spID4+IFBBR0VfU0hJRlQ7Ci0KLQlkdW1wLT5yZWdzID0gKnJlZ3M7Ci0JZHVtcC0+dV9mcHZhbGlkID0gZHVtcF9mcHUgKHJlZ3MsICZkdW1wLT51X2ZwKTsKLX0KLUVYUE9SVF9TWU1CT0woZHVtcF90aHJlYWQpOwotCi0vKgogICogU2h1ZmZsZSB0aGUgYXJndW1lbnQgaW50byB0aGUgY29ycmVjdCByZWdpc3RlciBiZWZvcmUgY2FsbGluZyB0aGUKICAqIHRocmVhZCBmdW5jdGlvbi4gIHIxIGlzIHRoZSB0aHJlYWQgYXJndW1lbnQsIHIyIGlzIHRoZSBwb2ludGVyIHRvCiAgKiB0aGUgdGhyZWFkIGZ1bmN0aW9uLCBhbmQgcjMgcG9pbnRzIHRvIHRoZSBleGl0IGZ1bmN0aW9uLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZHNtZzYwMC1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZHNtZzYwMC1zZXR1cC5jCmluZGV4IDY4ODY1OTYuLjhjYjA3NDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2RzbWc2MDAtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9kc21nNjAwLXNldHVwLmMKQEAgLTcxLDExICs3MSwxMSBAQAogCiBzdGF0aWMgc3RydWN0IGdwaW9fbGVkIGRzbWc2MDBfbGVkX3BpbnNbXSA9IHsKIAl7Ci0JCS5uYW1lCQk9ICJwb3dlciIsCisJCS5uYW1lCQk9ICJkc21nNjAwOmdyZWVuOnBvd2VyIiwKIAkJLmdwaW8JCT0gRFNNRzYwMF9MRURfUFdSX0dQSU8sCiAJfSwKIAl7Ci0JCS5uYW1lCQk9ICJ3bGFuIiwKKwkJLm5hbWUJCT0gImRzbWc2MDA6Z3JlZW46d2xhbiIsCiAJCS5ncGlvCQk9IERTTUc2MDBfTEVEX1dMQU5fR1BJTywKIAkJLmFjdGl2ZV9sb3cJPSB0cnVlLAogCX0sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9uYXMxMDBkLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9uYXMxMDBkLXNldHVwLmMKaW5kZXggNGNlY2FlOC4uMTU5ZTFjNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvbmFzMTAwZC1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L25hczEwMGQtc2V0dXAuYwpAQCAtNjAsMTcgKzYwLDE3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgbmFzMTAwZF9sZWRfcGluc1tdID0gewogCXsKLQkJLm5hbWUJCT0gIndsYW4iLCAgIC8qIGdyZWVuIGxlZCAqLworCQkubmFtZQkJPSAibmFzMTAwZDpncmVlbjp3bGFuIiwKIAkJLmdwaW8JCT0gTkFTMTAwRF9MRURfV0xBTl9HUElPLAogCQkuYWN0aXZlX2xvdwk9IHRydWUsCiAJfSwKIAl7Ci0JCS5uYW1lCQk9ICJwb3dlciIsICAvKiBibHVlIHBvd2VyIGxlZCAob2ZmPWZsYXNoaW5nKSAqLworCQkubmFtZQkJPSAibmFzMTAwZDpibHVlOnBvd2VyIiwgIC8qIChvZmY9Zmxhc2hpbmcpICovCiAJCS5ncGlvCQk9IE5BUzEwMERfTEVEX1BXUl9HUElPLAogCQkuYWN0aXZlX2xvdwk9IHRydWUsCiAJfSwKIAl7Ci0JCS5uYW1lCQk9ICJkaXNrIiwgICAvKiB5ZWxsb3cgbGVkICovCisJCS5uYW1lCQk9ICJuYXMxMDBkOnllbGxvdzpkaXNrIiwKIAkJLmdwaW8JCT0gTkFTMTAwRF9MRURfRElTS19HUElPLAogCQkuYWN0aXZlX2xvdwk9IHRydWUsCiAJfSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L25zbHUyLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9uc2x1Mi1zZXR1cC5jCmluZGV4IGFjYWViY2IuLmQ5YTE4MjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L25zbHUyLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItc2V0dXAuYwpAQCAtNjMsMjAgKzYzLDIwIEBACiAKIHN0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgbnNsdTJfbGVkX3BpbnNbXSA9IHsKIAl7Ci0JCS5uYW1lCQk9ICJyZWFkeSIsICAvKiBncmVlbiBsZWQgKi8KKwkJLm5hbWUJCT0gIm5zbHUyOmdyZWVuOnJlYWR5IiwKIAkJLmdwaW8JCT0gTlNMVTJfTEVEX0dSTl9HUElPLAogCX0sCiAJewotCQkubmFtZQkJPSAic3RhdHVzIiwgLyogcmVkIGxlZCAqLworCQkubmFtZQkJPSAibnNsdTI6cmVkOnN0YXR1cyIsCiAJCS5ncGlvCQk9IE5TTFUyX0xFRF9SRURfR1BJTywKIAl9LAogCXsKLQkJLm5hbWUJCT0gImRpc2stMSIsCisJCS5uYW1lCQk9ICJuc2x1MjpncmVlbjpkaXNrLTEiLAogCQkuZ3BpbwkJPSBOU0xVMl9MRURfRElTSzFfR1BJTywKIAkJLmFjdGl2ZV9sb3cJPSB0cnVlLAogCX0sCiAJewotCQkubmFtZQkJPSAiZGlzay0yIiwKKwkJLm5hbWUJCT0gIm5zbHUyOmdyZWVuOmRpc2stMiIsCiAJCS5ncGlvCQk9IE5TTFUyX0xFRF9ESVNLMl9HUElPLAogCQkuYWN0aXZlX2xvdwk9IHRydWUsCiAJfSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3Rvc2EuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3Rvc2EuYwppbmRleCA5YjI2ZmE1Li5mOTkxMTJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS90b3NhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvdG9zYS5jCkBAIC0yMSw2ICsyMSw4IEBACiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpb19rZXlzLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KQEAgLTI0Niw2ICsyNDgsNDYgQEAKIAkuaWQJCT0gLTEsCiB9OwogCitzdGF0aWMgc3RydWN0IGdwaW9fa2V5c19idXR0b24gdG9zYV9ncGlvX2tleXNbXSA9IHsKKwl7CisJCS50eXBlCT0gRVZfUFdSLAorCQkuY29kZQk9IEtFWV9TVVNQRU5ELAorCQkuZ3Bpbwk9IFRPU0FfR1BJT19PTl9LRVksCisJCS5kZXNjCT0gIk9uIGtleSIsCisJCS53YWtldXAJPSAxLAorCQkuYWN0aXZlX2xvdyA9IDEsCisJfSwKKwl7CisJCS50eXBlCT0gRVZfS0VZLAorCQkuY29kZQk9IFRPU0FfS0VZX1JFQ09SRCwKKwkJLmdwaW8JPSBUT1NBX0dQSU9fUkVDT1JEX0JUTiwKKwkJLmRlc2MJPSAiUmVjb3JkIEJ1dHRvbiIsCisJCS53YWtldXAJPSAxLAorCQkuYWN0aXZlX2xvdyA9IDEsCisJfSwKKwl7CisJCS50eXBlCT0gRVZfS0VZLAorCQkuY29kZQk9IFRPU0FfS0VZX1NZTkMsCisJCS5ncGlvCT0gVE9TQV9HUElPX1NZTkMsCisJCS5kZXNjCT0gIlN5bmMgQnV0dG9uIiwKKwkJLndha2V1cAk9IDEsCisJCS5hY3RpdmVfbG93ID0gMSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2tleXNfcGxhdGZvcm1fZGF0YSB0b3NhX2dwaW9fa2V5c19wbGF0Zm9ybV9kYXRhID0geworCS5idXR0b25zCT0gdG9zYV9ncGlvX2tleXMsCisJLm5idXR0b25zCT0gQVJSQVlfU0laRSh0b3NhX2dwaW9fa2V5cyksCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0b3NhX2dwaW9fa2V5c19kZXZpY2UgPSB7CisJLm5hbWUJPSAiZ3Bpby1rZXlzIiwKKwkuaWQJPSAtMSwKKwkuZGV2CT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0b3NhX2dwaW9fa2V5c19wbGF0Zm9ybV9kYXRhLAorCX0sCit9OworCiAvKgogICogVG9zYSBMRURzCiAgKi8KQEAgLTI1OCw2ICszMDAsNyBAQAogCSZ0b3Nhc2Nvb3BfZGV2aWNlLAogCSZ0b3Nhc2Nvb3BfamNfZGV2aWNlLAogCSZ0b3Nha2JkX2RldmljZSwKKwkmdG9zYV9ncGlvX2tleXNfZGV2aWNlLAogCSZ0b3NhbGVkX2RldmljZSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2luaXQuYyBiL2FyY2gvYXJtL21tL2luaXQuYwppbmRleCBjMGFkN2MwLi5lYzAwZjI2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9pbml0LmMKKysrIGIvYXJjaC9hcm0vbW0vaW5pdC5jCkBAIC0yMzksNyArMjM5LDcgQEAKIAkgKiBSZXNlcnZlIHRoZSBib290bWVtIGJpdG1hcCBmb3IgdGhpcyBub2RlLgogCSAqLwogCXJlc2VydmVfYm9vdG1lbV9ub2RlKHBnZGF0LCBib290X3BmbiA8PCBQQUdFX1NISUZULAotCQkJICAgICBib290X3BhZ2VzIDw8IFBBR0VfU0hJRlQpOworCQkJICAgICBib290X3BhZ2VzIDw8IFBBR0VfU0hJRlQsIEJPT1RNRU1fREVGQVVMVCk7CiAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKIAkvKgpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJICovCiAJaWYgKG5vZGUgPT0gaW5pdHJkX25vZGUpIHsKIAkJcmVzZXJ2ZV9ib290bWVtX25vZGUocGdkYXQsIHBoeXNfaW5pdHJkX3N0YXJ0LAotCQkJCSAgICAgcGh5c19pbml0cmRfc2l6ZSk7CisJCQkJICAgICBwaHlzX2luaXRyZF9zaXplLCBCT09UTUVNX0RFRkFVTFQpOwogCQlpbml0cmRfc3RhcnQgPSBfX3BoeXNfdG9fdmlydChwaHlzX2luaXRyZF9zdGFydCk7CiAJCWluaXRyZF9lbmQgPSBpbml0cmRfc3RhcnQgKyBwaHlzX2luaXRyZF9zaXplOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL21tdS5jIGIvYXJjaC9hcm0vbW0vbW11LmMKaW5kZXggZTVkNjFlZS4uZDQxYTc1ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vbW11LmMKKysrIGIvYXJjaC9hcm0vbW0vbW11LmMKQEAgLTYwNSw5ICs2MDUsMTEgQEAKIAkgKiBOb3RlIHRoYXQgdGhpcyBjYW4gb25seSBiZSBpbiBub2RlIDAuCiAJICovCiAjaWZkZWYgQ09ORklHX1hJUF9LRVJORUwKLQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShwZ2RhdCwgX19wYSgmX19kYXRhX3N0YXJ0KSwgJl9lbmQgLSAmX19kYXRhX3N0YXJ0KTsKKwlyZXNlcnZlX2Jvb3RtZW1fbm9kZShwZ2RhdCwgX19wYSgmX19kYXRhX3N0YXJ0KSwgJl9lbmQgLSAmX19kYXRhX3N0YXJ0LAorCQkJQk9PVE1FTV9ERUZBVUxUKTsKICNlbHNlCi0JcmVzZXJ2ZV9ib290bWVtX25vZGUocGdkYXQsIF9fcGEoJl9zdGV4dCksICZfZW5kIC0gJl9zdGV4dCk7CisJcmVzZXJ2ZV9ib290bWVtX25vZGUocGdkYXQsIF9fcGEoJl9zdGV4dCksICZfZW5kIC0gJl9zdGV4dCwKKwkJCUJPT1RNRU1fREVGQVVMVCk7CiAjZW5kaWYKIAogCS8qCkBAIC02MTUsNyArNjE3LDcgQEAKIAkgKiBhbmQgY2FuIG9ubHkgYmUgaW4gbm9kZSAwLgogCSAqLwogCXJlc2VydmVfYm9vdG1lbV9ub2RlKHBnZGF0LCBfX3BhKHN3YXBwZXJfcGdfZGlyKSwKLQkJCSAgICAgUFRSU19QRVJfUEdEICogc2l6ZW9mKHBnZF90KSk7CisJCQkgICAgIFBUUlNfUEVSX1BHRCAqIHNpemVvZihwZ2RfdCksIEJPT1RNRU1fREVGQVVMVCk7CiAKIAkvKgogCSAqIEhtbS4uLiBUaGlzIHNob3VsZCBnbyBlbHNld2hlcmUsIGJ1dCB3ZSByZWFsbHkgcmVhbGx5IG5lZWQgdG8KQEAgLTYzOCw4ICs2NDAsMTAgQEAKIAkvKiBIMTk0MCBhbmQgUlgzNzE1IG5lZWQgdG8gcmVzZXJ2ZSB0aGlzIGZvciBzdXNwZW5kICovCiAKIAlpZiAobWFjaGluZV9pc19oMTk0MCgpIHx8IG1hY2hpbmVfaXNfcngzNzE1KCkpIHsKLQkJcmVzZXJ2ZV9ib290bWVtX25vZGUocGdkYXQsIDB4MzAwMDMwMDAsIDB4MTAwMCk7Ci0JCXJlc2VydmVfYm9vdG1lbV9ub2RlKHBnZGF0LCAweDMwMDgxMDAwLCAweDEwMDApOworCQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShwZ2RhdCwgMHgzMDAwMzAwMCwgMHgxMDAwLAorCQkJCUJPT1RNRU1fREVGQVVMVCk7CisJCXJlc2VydmVfYm9vdG1lbV9ub2RlKHBnZGF0LCAweDMwMDgxMDAwLCAweDEwMDAsCisJCQkJQk9PVE1FTV9ERUZBVUxUKTsKIAl9CiAKICNpZmRlZiBDT05GSUdfU0ExMTExCkBAIC02NTAsNyArNjU0LDggQEAKIAlyZXNfc2l6ZSA9IF9fcGEoc3dhcHBlcl9wZ19kaXIpIC0gUEhZU19PRkZTRVQ7CiAjZW5kaWYKIAlpZiAocmVzX3NpemUpCi0JCXJlc2VydmVfYm9vdG1lbV9ub2RlKHBnZGF0LCBQSFlTX09GRlNFVCwgcmVzX3NpemUpOworCQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShwZ2RhdCwgUEhZU19PRkZTRVQsIHJlc19zaXplLAorCQkJCUJPT1RNRU1fREVGQVVMVCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9ub21tdS5jIGIvYXJjaC9hcm0vbW0vbm9tbXUuYwppbmRleCA4Y2QzYTYwLi42M2M2MmZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9ub21tdS5jCisrKyBiL2FyY2gvYXJtL21tL25vbW11LmMKQEAgLTI3LDkgKzI3LDExIEBACiAJICogTm90ZSB0aGF0IHRoaXMgY2FuIG9ubHkgYmUgaW4gbm9kZSAwLgogCSAqLwogI2lmZGVmIENPTkZJR19YSVBfS0VSTkVMCi0JcmVzZXJ2ZV9ib290bWVtX25vZGUocGdkYXQsIF9fcGEoJl9fZGF0YV9zdGFydCksICZfZW5kIC0gJl9fZGF0YV9zdGFydCk7CisJcmVzZXJ2ZV9ib290bWVtX25vZGUocGdkYXQsIF9fcGEoJl9fZGF0YV9zdGFydCksICZfZW5kIC0gJl9fZGF0YV9zdGFydCwKKwkJCUJPT1RNRU1fREVGQVVMVCk7CiAjZWxzZQotCXJlc2VydmVfYm9vdG1lbV9ub2RlKHBnZGF0LCBfX3BhKCZfc3RleHQpLCAmX2VuZCAtICZfc3RleHQpOworCXJlc2VydmVfYm9vdG1lbV9ub2RlKHBnZGF0LCBfX3BhKCZfc3RleHQpLCAmX2VuZCAtICZfc3RleHQsCisJCQlCT09UTUVNX0RFRkFVTFQpOwogI2VuZGlmCiAKIAkvKgpAQCAtMzcsNyArMzksOCBAQAogCSAqIHNvbWUgYXJjaGl0ZWN0dXJlcyB3aGljaCB0aGUgRFJBTSBpcyB0aGUgZXhjZXB0aW9uIHZlY3RvciB0byB0cmFwLAogCSAqIGFsbG9jX3BhZ2UgYnJlYWtzIHdpdGggZXJyb3IsIGFsdGhvdWdoIGl0IGlzIG5vdCBOVUxMLCBidXQgIjAuIgogCSAqLwotCXJlc2VydmVfYm9vdG1lbV9ub2RlKHBnZGF0LCBDT05GSUdfVkVDVE9SU19CQVNFLCBQQUdFX1NJWkUpOworCXJlc2VydmVfYm9vdG1lbV9ub2RlKHBnZGF0LCBDT05GSUdfVkVDVE9SU19CQVNFLCBQQUdFX1NJWkUsCisJCQlCT09UTUVNX0RFRkFVTFQpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2ZiLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvZmIuYwppbmRleCBlZTQwYzFhMC4uNzg1NGYxOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2ZiLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2ZiLmMKQEAgLTIwNyw3ICsyMDcsNyBAQAogCQkJcmV0dXJuOwogCQl9CiAJCWlmIChyZy5wYWRkcikKLQkJCXJlc2VydmVfYm9vdG1lbShyZy5wYWRkciwgcmcuc2l6ZSk7CisJCQlyZXNlcnZlX2Jvb3RtZW0ocmcucGFkZHIsIHJnLnNpemUsIEJPT1RNRU1fREVGQVVMVCk7CiAJCXJlc2VydmVkICs9IHJnLnNpemU7CiAJCW9tYXBmYl9jb25maWcubWVtX2Rlc2MucmVnaW9uW2ldID0gcmc7CiAJCWNvbmZpZ3VyZWRfcmVnaW9ucysrOwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvb2NkLmMgYi9hcmNoL2F2cjMyL2tlcm5lbC9vY2QuYwppbmRleCBjNGYwMjMyLi4xYjAyNDVkIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC9vY2QuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC9vY2QuYwpAQCAtOTAsMjUgKzkwLDI5IEBACiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqb2NkX2RlYnVnZnNfRFM7CiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqb2NkX2RlYnVnZnNfY291bnQ7CiAKLXN0YXRpYyB1NjQgb2NkX0RDX2dldCh2b2lkICpkYXRhKQorc3RhdGljIGludCBvY2RfRENfZ2V0KHZvaWQgKmRhdGEsIHU2NCAqdmFsKQogewotCXJldHVybiBvY2RfcmVhZChEQyk7CisJKnZhbCA9IG9jZF9yZWFkKERDKTsKKwlyZXR1cm4gMDsKIH0KLXN0YXRpYyB2b2lkIG9jZF9EQ19zZXQodm9pZCAqZGF0YSwgdTY0IHZhbCkKK3N0YXRpYyBpbnQgb2NkX0RDX3NldCh2b2lkICpkYXRhLCB1NjQgdmFsKQogewogCW9jZF93cml0ZShEQywgdmFsKTsKKwlyZXR1cm4gMDsKIH0KIERFRklORV9TSU1QTEVfQVRUUklCVVRFKGZvcHNfREMsIG9jZF9EQ19nZXQsIG9jZF9EQ19zZXQsICIweCUwOGxseFxuIik7CiAKLXN0YXRpYyB1NjQgb2NkX0RTX2dldCh2b2lkICpkYXRhKQorc3RhdGljIGludCBvY2RfRFNfZ2V0KHZvaWQgKmRhdGEsIHU2NCAqdmFsKQogewotCXJldHVybiBvY2RfcmVhZChEUyk7CisJKnZhbCA9IG9jZF9yZWFkKERTKTsKKwlyZXR1cm4gMDsKIH0KIERFRklORV9TSU1QTEVfQVRUUklCVVRFKGZvcHNfRFMsIG9jZF9EU19nZXQsIE5VTEwsICIweCUwOGxseFxuIik7CiAKLXN0YXRpYyB1NjQgb2NkX2NvdW50X2dldCh2b2lkICpkYXRhKQorc3RhdGljIGludCBvY2RfY291bnRfZ2V0KHZvaWQgKmRhdGEsIHU2NCAqdmFsKQogewotCXJldHVybiBvY2RfY291bnQ7CisJKnZhbCA9IG9jZF9jb3VudDsKKwlyZXR1cm4gMDsKIH0KIERFRklORV9TSU1QTEVfQVRUUklCVVRFKGZvcHNfY291bnQsIG9jZF9jb3VudF9nZXQsIE5VTEwsICIlbGxkXG4iKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvYXZyMzIva2VybmVsL3NldHVwLmMKaW5kZXggNGI0YzE4OC4uZTY2YTA3YSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC9zZXR1cC5jCkBAIC00ODksNyArNDg5LDggQEAKIAkJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIGJvb3RtZW0gYml0bWFwLi4uICovCiAJCXJlc2VydmVfYm9vdG1lbV9ub2RlKE5PREVfREFUQShub2RlKSwKIAkJCQkgICAgIFBGTl9QSFlTKGJvb3RtYXBfcGZuKSwKLQkJCQkgICAgIGJvb3RtYXBfc2l6ZSk7CisJCQkJICAgICBib290bWFwX3NpemUsCisJCQkJICAgICBCT09UTUVNX0RFRkFVTFQpOwogCiAJCS8qIC4uLmFuZCBhbnkgb3RoZXIgcmVzZXJ2ZWQgcmVnaW9ucy4gKi8KIAkJZm9yIChyZXMgPSByZXNlcnZlZDsgcmVzOyByZXMgPSByZXMtPnNpYmxpbmcpIHsKQEAgLTUwNSw3ICs1MDYsOCBAQAogCQkJICAgICYmIHJlcy0+ZW5kIDwgUEZOX1BIWVMobWF4X3BmbikpCiAJCQkJcmVzZXJ2ZV9ib290bWVtX25vZGUoCiAJCQkJCU5PREVfREFUQShub2RlKSwgcmVzLT5zdGFydCwKLQkJCQkJcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMSk7CisJCQkJCXJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEsCisJCQkJCUJPT1RNRU1fREVGQVVMVCk7CiAJCX0KIAogCQlub2RlX3NldF9vbmxpbmUobm9kZSk7CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2F0MzJhcDcwMHguYyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvYXQzMmFwNzAweC5jCmluZGV4IDE0ZTYxZjAuLjc2NzhmZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvYXQzMmFwNzAweC5jCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvYXQzMmFwNzAweC5jCkBAIC0xMTg2LDYgKzExODYsNTkgQEAKICNlbmRpZgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFBXTQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXRtZWxfcHdtMF9yZXNvdXJjZVtdIF9faW5pdGRhdGEgPSB7CisJUEJNRU0oMHhmZmYwMTQwMCksCisJSVJRKDI0KSwKK307CitzdGF0aWMgc3RydWN0IGNsayBhdG1lbF9wd20wX21jayA9IHsKKwkubmFtZQkJPSAibWNrIiwKKwkucGFyZW50CQk9ICZwYmJfY2xrLAorCS5tb2RlCQk9IHBiYl9jbGtfbW9kZSwKKwkuZ2V0X3JhdGUJPSBwYmJfY2xrX2dldF9yYXRlLAorCS5pbmRleAkJPSA1LAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IGF0MzJfYWRkX2RldmljZV9wd20odTMyIG1hc2spCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKworCWlmICghbWFzaykKKwkJcmV0dXJuIE5VTEw7CisKKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJhdG1lbF9wd20iLCAwKTsKKwlpZiAoIXBkZXYpCisJCXJldHVybiBOVUxMOworCisJaWYgKHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsIGF0bWVsX3B3bTBfcmVzb3VyY2UsCisJCQkJQVJSQVlfU0laRShhdG1lbF9wd20wX3Jlc291cmNlKSkpCisJCWdvdG8gb3V0X2ZyZWVfcGRldjsKKworCWlmIChwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEocGRldiwgJm1hc2ssIHNpemVvZihtYXNrKSkpCisJCWdvdG8gb3V0X2ZyZWVfcGRldjsKKworCWlmIChtYXNrICYgKDEgPDwgMCkpCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBBKDI4KSwgUEVSSVBIX0EsIDApOworCWlmIChtYXNrICYgKDEgPDwgMSkpCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBBKDI5KSwgUEVSSVBIX0EsIDApOworCWlmIChtYXNrICYgKDEgPDwgMikpCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBBKDIxKSwgUEVSSVBIX0IsIDApOworCWlmIChtYXNrICYgKDEgPDwgMykpCisJCXNlbGVjdF9wZXJpcGhlcmFsKFBBKDIyKSwgUEVSSVBIX0IsIDApOworCisJYXRtZWxfcHdtMF9tY2suZGV2ID0gJnBkZXYtPmRldjsKKworCXBsYXRmb3JtX2RldmljZV9hZGQocGRldik7CisKKwlyZXR1cm4gcGRldjsKKworb3V0X2ZyZWVfcGRldjoKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBkZXYpOworCXJldHVybiBOVUxMOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogIFNTQwogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc3NjMF9yZXNvdXJjZVtdID0gewpAQCAtMTY0Niw2ICsxNjk5LDcgQEAKIAkmYXRtZWxfdXNhcnQxX3VzYXJ0LAogCSZhdG1lbF91c2FydDJfdXNhcnQsCiAJJmF0bWVsX3VzYXJ0M191c2FydCwKKwkmYXRtZWxfcHdtMF9tY2ssCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX0FUMzJBUDcwMDApCiAJJm1hY2IwX2hjbGssCiAJJm1hY2IwX3BjbGssCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL0tjb25maWcgYi9hcmNoL2JsYWNrZmluL0tjb25maWcKaW5kZXggYmEyMWUzMy4uMzY4YmM3ZiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9LY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vS2NvbmZpZwpAQCAtNTQ0LDcgKzU0NCw3IEBACiAJZGVmYXVsdCB5CiAJaGVscAogCSAgSWYgZW5hYmxlZCwgdGhlIGVudGlyZSBBU00gbG93bGV2ZWwgZXhjZXB0aW9uIGFuZCBpbnRlcnJ1cHQgZW50cnkgY29kZQotCSAgKFNUT1JFL1JFU1RPUkUgQ09OVEVYVCkgaXMgbGlua2VkIGludG8gTDEgaW5zdHJ1Y3Rpb24gbWVtb3J5LiAKKwkgIChTVE9SRS9SRVNUT1JFIENPTlRFWFQpIGlzIGxpbmtlZCBpbnRvIEwxIGluc3RydWN0aW9uIG1lbW9yeS4KIAkgIChsZXNzIGxhdGVuY3kpCiAKIGNvbmZpZyBET19JUlFfTDEKQEAgLTkwNCwyOSArOTA0LDM4IEBACiAJZGVwZW5kcyBvbiAhU01QCiAKIGNob2ljZQotCXByb21wdCAiU2VsZWN0IFBNIFdha2V1cCBFdmVudCBTb3VyY2UiCi0JZGVmYXVsdCBQTV9XQUtFVVBfR1BJT19CWV9TSUNfSVdSCisJcHJvbXB0ICJEZWZhdWx0IFBvd2VyIFNhdmluZyBNb2RlIgogCWRlcGVuZHMgb24gUE0KKwlkZWZhdWx0IFBNX0JGSU5fU0xFRVBfREVFUEVSCitjb25maWcgIFBNX0JGSU5fU0xFRVBfREVFUEVSCisJYm9vbCAiU2xlZXAgRGVlcGVyIgogCWhlbHAKLQkgIElmIHlvdSBoYXZlIGEgR1BJTyBhbHJlYWR5IGNvbmZpZ3VyZWQgYXMgaW5wdXQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBQT1JUeF9NQVNLCi0JICBiaXQgc2V0IC0gIlNwZWNpZnkgV2FrZXVwIEV2ZW50IGJ5IFNJQ19JV1IgdmFsdWUiCisJICBTbGVlcCAiRGVlcGVyIiBNb2RlIChIaWdoIFBvd2VyIFNhdmluZ3MpIC0gVGhpcyBtb2RlIHJlZHVjZXMgZHluYW1pYworCSAgcG93ZXIgZGlzc2lwYXRpb24gYnkgZGlzYWJsaW5nIHRoZSBjbG9jayB0byB0aGUgcHJvY2Vzc29yIGNvcmUgKENDTEspLgorCSAgRnVydGhlcm1vcmUsIFN0YW5kYnkgc2V0cyB0aGUgaW50ZXJuYWwgcG93ZXIgc3VwcGx5IHZvbHRhZ2UgKFZERElOVCkKKwkgIHRvIDAuODUgViB0byBwcm92aWRlIHRoZSBncmVhdGVzdCBwb3dlciBzYXZpbmdzLCB3aGlsZSBwcmVzZXJ2aW5nIHRoZQorCSAgcHJvY2Vzc29yIHN0YXRlLgorCSAgVGhlIFBMTCBhbmQgc3lzdGVtIGNsb2NrIChTQ0xLKSBjb250aW51ZSB0byBvcGVyYXRlIGF0IGEgdmVyeSBsb3cKKwkgIGZyZXF1ZW5jeSBvZiBhYm91dCAzLjMgTUh6LiBUbyBwcmVzZXJ2ZSBkYXRhIGludGVncml0eSBpbiB0aGUgU0RSQU0sCisJICB0aGUgU0RSQU0gaXMgcHV0IGludG8gU2VsZiBSZWZyZXNoIE1vZGUuIFR5cGljYWxseSBhbiBleHRlcm5hbCBldmVudAorCSAgc3VjaCBhcyBHUElPIGludGVycnVwdCBvciBSVEMgYWN0aXZpdHkgd2FrZXMgdXAgdGhlIHByb2Nlc3Nvci4KKwkgIFZhcmlvdXMgUGVyaXBoZXJhbHMgc3VjaCBhcyBVQVJULCBTUE9SVCwgUFBJIG1heSBub3QgZnVuY3Rpb24gYXMKKwkgIG5vcm1hbCBkdXJpbmcgU2xlZXAgRGVlcGVyLCBkdWUgdG8gdGhlIHJlZHVjZWQgU0NMSyBmcmVxdWVuY3kuCisJICBXaGVuIGluIHRoZSBzbGVlcCBtb2RlLCBzeXN0ZW0gRE1BIGFjY2VzcyB0byBMMSBtZW1vcnkgaXMgbm90IHN1cHBvcnRlZC4KIAotY29uZmlnIFBNX1dBS0VVUF9HUElPX0JZX1NJQ19JV1IKLQlib29sICJTcGVjaWZ5IFdha2V1cCBFdmVudCBieSBTSUNfSVdSIHZhbHVlIgotY29uZmlnIFBNX1dBS0VVUF9CWV9HUElPCi0JYm9vbCAiQ2F1c2UgV2FrZXVwIEV2ZW50IGJ5IEdQSU8iCi1jb25maWcgUE1fV0FLRVVQX0dQSU9fQVBJCi0JYm9vbCAiQ29uZmlndXJlIFdha2V1cCBFdmVudCBieSBQTSBHUElPIEFQSSIKLQorY29uZmlnICBQTV9CRklOX1NMRUVQCisJYm9vbCAiU2xlZXAiCisJaGVscAorCSAgU2xlZXAgTW9kZSAoSGlnaCBQb3dlciBTYXZpbmdzKSAtIFRoZSBzbGVlcCBtb2RlIHJlZHVjZXMgcG93ZXIKKwkgIGRpc3NpcGF0aW9uIGJ5IGRpc2FibGluZyB0aGUgY2xvY2sgdG8gdGhlIHByb2Nlc3NvciBjb3JlIChDQ0xLKS4KKwkgIFRoZSBQTEwgYW5kIHN5c3RlbSBjbG9jayAoU0NMSyksIGhvd2V2ZXIsIGNvbnRpbnVlIHRvIG9wZXJhdGUgaW4KKwkgIHRoaXMgbW9kZS4gVHlwaWNhbGx5IGFuIGV4dGVybmFsIGV2ZW50IG9yIFJUQyBhY3Rpdml0eSB3aWxsIHdha2UKKwkgIHVwIHRoZSBwcm9jZXNzb3IuIFdoZW4gaW4gdGhlIHNsZWVwIG1vZGUsCisJICBzeXN0ZW0gRE1BIGFjY2VzcyB0byBMMSBtZW1vcnkgaXMgbm90IHN1cHBvcnRlZC4KIGVuZGNob2ljZQogCi1jb25maWcgUE1fV0FLRVVQX1NJQ19JV1IKLQloZXggIldha2V1cCBFdmVudHMgKFNJQ19JV1IpIgotCWRlcGVuZHMgb24gUE1fV0FLRVVQX0dQSU9fQllfU0lDX0lXUgotCWRlZmF1bHQgMHg4IGlmIChCRjUzNyB8fCBCRjUzNiB8fCBCRjUzNCkKLQlkZWZhdWx0IDB4ODAgaWYgKEJGNTMzIHx8IEJGNTMyIHx8IEJGNTMxKQotCWRlZmF1bHQgMHg4MCBpZiAoQkY1NHgpCi0JZGVmYXVsdCAweDgwIGlmIChCRjUyeCkKK2NvbmZpZyBQTV9XQUtFVVBfQllfR1BJTworCWJvb2wgIkNhdXNlIFdha2V1cCBFdmVudCBieSBHUElPIgogCiBjb25maWcgUE1fV0FLRVVQX0dQSU9fTlVNQkVSCiAJaW50ICJXYWtldXAgR1BJTyBudW1iZXIiCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL0tjb25maWcuZGVidWcgYi9hcmNoL2JsYWNrZmluL0tjb25maWcuZGVidWcKaW5kZXggNTliODdhNC4uYzYxYmRlYiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9LY29uZmlnLmRlYnVnCisrKyBiL2FyY2gvYmxhY2tmaW4vS2NvbmZpZy5kZWJ1ZwpAQCAtMTY0LDcgKzE2NCw3IEBACiBjb25maWcgQ1BMQl9JTkZPCiAJYm9vbCAiRGlzcGxheSB0aGUgQ1BMQiBpbmZvcm1hdGlvbiIKIAloZWxwCi0JICBEaXNwbGF5IHRoZSBDUExCIGluZm9ybWF0aW9uLgorCSAgRGlzcGxheSB0aGUgQ1BMQiBpbmZvcm1hdGlvbiB2aWEgL3Byb2MvY3BsYmluZm8uCiAKIGNvbmZpZyBBQ0NFU1NfQ0hFQ0sKIAlib29sICJDaGVjayB0aGUgdXNlciBwb2ludGVyIGFkZHJlc3MiCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL01ha2VmaWxlIGIvYXJjaC9ibGFja2Zpbi9NYWtlZmlsZQppbmRleCAwZWRjNDAyLi5mZTI1NGY4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL01ha2VmaWxlCisrKyBiL2FyY2gvYmxhY2tmaW4vTWFrZWZpbGUKQEAgLTExOSw2ICsxMTksNyBAQAogCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQoYm9vdCkKIAogCitJTlNUQUxMX1BBVEggPz0gL3RmdHBib290CiBib290IDo9IGFyY2gvJChBUkNIKS9ib290CiBCT09UX1RBUkdFVFMgPSB2bUltYWdlCiBQSE9OWSArPSAkKEJPT1RfVEFSR0VUUykgaW5zdGFsbApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTMzLVNUQU1QX2RlZmNvbmZpZyBiL2FyY2gvYmxhY2tmaW4vY29uZmlncy9CRjUzMy1TVEFNUF9kZWZjb25maWcKaW5kZXggOWI3MTIzYy4uMTk4ZjQxMiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9jb25maWdzL0JGNTMzLVNUQU1QX2RlZmNvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL2NvbmZpZ3MvQkY1MzMtU1RBTVBfZGVmY29uZmlnCkBAIC0yMTYsOCArMjE2LDYgQEAKIENPTkZJR19NRU1fQUREX1dJRFRIPTExCiBDT05GSUdfRU5FVF9GTEFTSF9QSU49MAogQ09ORklHX0JPT1RfTE9BRD0weDEwMDAKLQotCiBDT05GSUdfQkZJTl9TQ1JBVENIX1JFR19SRVROPXkKICMgQ09ORklHX0JGSU5fU0NSQVRDSF9SRUdfUkVURSBpcyBub3Qgc2V0CiAjIENPTkZJR19CRklOX1NDUkFUQ0hfUkVHX0NZQ0xFUyBpcyBub3Qgc2V0CkBAIC00ODMsNyArNDgxLDcgQEAKICMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAogQ09ORklHX01URF9QQVJUSVRJT05TPXkKICMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ01ETElORV9QQVJUUz15CiAKICMKICMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKQEAgLTUwMCw4ICs0OTgsOCBAQAogIwogIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycwogIwotIyBDT05GSUdfTVREX0NGSSBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX0pFREVDUFJPQkU9bQorQ09ORklHX01URF9DRkk9bQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAogQ09ORklHX01URF9HRU5fUFJPQkU9bQogIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CiBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQpAQCAtNTE1LDggKzUxMyw5IEBACiAjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAogIyBDT05GSUdfTVREX0NGSV9JTlRFTEVYVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfQ0ZJX0FNRFNURCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9BTURTVEQ9bQogIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9bQogQ09ORklHX01URF9SQU09eQogQ09ORklHX01URF9ST009bQogIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CkBAIC01MjYsNiArNTI1LDExIEBACiAjCiBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1M9eQogIyBDT05GSUdfTVREX1BIWVNNQVAgaXMgbm90IHNldAorQ09ORklHX01URF9CRjV4eD1tCitDT05GSUdfQkZJTl9GTEFTSF9CQU5LXzA9MHg3QkIwCitDT05GSUdfQkZJTl9GTEFTSF9CQU5LXzE9MHg3QkIwCitDT05GSUdfQkZJTl9GTEFTSF9CQU5LXzI9MHg3QkIwCitDT05GSUdfQkZJTl9GTEFTSF9CQU5LXzM9MHg3QkIwCiAjIENPTkZJR19NVERfVUNMSU5VWCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fZG1hXzV4eC5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYmZpbl9kbWFfNXh4LmMKaW5kZXggZmE5ZGViZTguLjU0NTNiYzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fZG1hXzV4eC5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fZG1hXzV4eC5jCkBAIC0xMDQsNiArMTA0LDE2IEBACiAKIAltdXRleF91bmxvY2soJihkbWFfY2hbY2hhbm5lbF0uZG1hbG9jaykpOwogCisjaWZkZWYgQ09ORklHX0JGNTR4CisJaWYgKGNoYW5uZWwgPj0gQ0hfVUFSVDJfUlggJiYgY2hhbm5lbCA8PSBDSF9VQVJUM19UWCAmJgorCQlzdHJuY21wKGRldmljZV9pZCwgIkJGSU5fVUFSVCIsIDkpID09IDApCisJCWRtYV9jaFtjaGFubmVsXS5yZWdzLT5wZXJpcGhlcmFsX21hcCB8PQorCQkJKGNoYW5uZWwgLSBDSF9VQVJUMl9SWCArIDB4Qyk7CisJZWxzZQorCQlkbWFfY2hbY2hhbm5lbF0ucmVncy0+cGVyaXBoZXJhbF9tYXAgfD0KKwkJCShjaGFubmVsIC0gQ0hfVUFSVDJfUlggKyAweDYpOworI2VuZGlmCisKIAlkbWFfY2hbY2hhbm5lbF0uZGV2aWNlX2lkID0gZGV2aWNlX2lkOwogCWRtYV9jaFtjaGFubmVsXS5pcnFfY2FsbGJhY2sgPSBOVUxMOwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9iZmluX2dwaW8uYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fZ3Bpby5jCmluZGV4IDZiYmUwYTIuLjA4Nzg4ZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fZ3Bpby5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2JmaW5fZ3Bpby5jCkBAIC0xODYsNyArMTg2LDcgQEAKIAljaGFyIG5hbWVbUkVTT1VSQ0VfTEFCRUxfU0laRV07CiB9IHN0cl9pZGVudFtNQVhfUkVTT1VSQ0VTXTsKIAotI2lmZGVmIENPTkZJR19QTQorI2lmIGRlZmluZWQoQ09ORklHX1BNKSAmJiAhZGVmaW5lZChDT05GSUdfQkY1NHgpCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgd2FrZXVwX21hcFtncGlvX2JhbmsoTUFYX0JMQUNLRklOX0dQSU9TKV07CiBzdGF0aWMgdW5zaWduZWQgY2hhciB3YWtldXBfZmxhZ3NfbWFwW01BWF9CTEFDS0ZJTl9HUElPU107CiBzdGF0aWMgc3RydWN0IGdwaW9fcG9ydF9zIGdwaW9fYmFua19zYXZlZFtncGlvX2JhbmsoTUFYX0JMQUNLRklOX0dQSU9TKV07CkBAIC02OTYsOSArNjk2LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotdTMyIGdwaW9fcG1fc2V0dXAodm9pZCkKK3UzMiBiZmluX3BtX3NldHVwKHZvaWQpCiB7Ci0JdTMyIHNpY19pd3IgPSAwOwogCXUxNiBiYW5rLCBtYXNrLCBpLCBncGlvOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9CTEFDS0ZJTl9HUElPUzsgaSArPSBHUElPX0JBTktTSVpFKSB7CkBAIC03MjMsNyArNzIyLDggQEAKIAkJCWdwaW8gPSBpOwogCiAJCQl3aGlsZSAobWFzaykgewotCQkJCWlmIChtYXNrICYgMSkgeworCQkJCWlmICgobWFzayAmIDEpICYmICh3YWtldXBfZmxhZ3NfbWFwW2dwaW9dICE9CisJCQkJCVBNX1dBS0VfSUdOT1JFKSkgewogCQkJCQlyZXNlcnZlZF9ncGlvX21hcFtncGlvX2JhbmsoZ3BpbyldIHw9CiAJCQkJCQkJZ3Bpb19iaXQoZ3Bpbyk7CiAJCQkJCWJmaW5fZ3Bpb193YWtldXBfdHlwZShncGlvLApAQCAtNzM0LDIxICs3MzQsMTcgQEAKIAkJCQltYXNrID4+PSAxOwogCQkJfQogCi0JCQlzaWNfaXdyIHw9IDEgPDwKLQkJCQkoc2ljX2l3cl9pcnFzW2JhbmtdIC0gKElSUV9DT1JFVE1SICsgMSkpOworCQkJYmZpbl9pbnRlcm5hbF9zZXRfd2FrZShzaWNfaXdyX2lycXNbYmFua10sIDEpOwogCQkJZ3Bpb19iYW5rYltiYW5rXS0+bWFza2Jfc2V0ID0gd2FrZXVwX21hcFtncGlvX2JhbmsoaSldOwogCQl9CiAJfQogCiAJQVdBX0RVTU1ZX1JFQUQobWFza2Jfc2V0KTsKIAotCWlmIChzaWNfaXdyKQotCQlyZXR1cm4gc2ljX2l3cjsKLQllbHNlCi0JCXJldHVybiBJV1JfRU5BQkxFX0FMTDsKKwlyZXR1cm4gMDsKIH0KIAotdm9pZCBncGlvX3BtX3Jlc3RvcmUodm9pZCkKK3ZvaWQgYmZpbl9wbV9yZXN0b3JlKHZvaWQpCiB7CiAJdTE2IGJhbmssIG1hc2ssIGk7CiAKQEAgLTc2OCw3ICs3NjQsNyBAQAogCiAJCQlyZXNlcnZlZF9ncGlvX21hcFtiYW5rXSA9CiAJCQkJCWdwaW9fYmFua19zYXZlZFtiYW5rXS5yZXNlcnZlZDsKLQorCQkJYmZpbl9pbnRlcm5hbF9zZXRfd2FrZShzaWNfaXdyX2lycXNbYmFua10sIDApOwogCQl9CiAKIAkJZ3Bpb19iYW5rYltiYW5rXS0+bWFza2IgPSBncGlvX2Jhbmtfc2F2ZWRbYmFua10ubWFza2I7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9jcGxiaW5pdC5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvY3BsYi1tcHUvY3BsYmluaXQuYwppbmRleCBlMmUyYjUwLi5kYzZlOGE3IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9jcGxiLW1wdS9jcGxiaW5pdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2NwbGItbXB1L2NwbGJpbml0LmMKQEAgLTI2LDYgKzI2LDEwIEBACiAjaW5jbHVkZSA8YXNtL2NwbGIuaD4KICNpbmNsdWRlIDxhc20vY3BsYmluaXQuaD4KIAorI2lmIEFOT01BTFlfMDUwMDAyNjMKKyMgZXJyb3IgdGhlIE1QVSB3aWxsIG5vdCBmdW5jdGlvbiBzYWZlbHkgd2hpbGUgQW5vbWFseSAwNTAwMDI2MyBhcHBsaWVzCisjZW5kaWYKKwogc3RydWN0IGNwbGJfZW50cnkgaWNwbGJfdGJsW01BWF9DUExCU107CiBzdHJ1Y3QgY3BsYl9lbnRyeSBkY3BsYl90YmxbTUFYX0NQTEJTXTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvaW5pdF90YXNrLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9pbml0X3Rhc2suYwppbmRleCA2NzNjODYwLi5jNjQwMTU0IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9pbml0X3Rhc2suYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9pbml0X3Rhc2suYwpAQCAtNTcsNSArNTcsNSBAQAogICogImluaXRfdGFzayIgbGlua2VyIG1hcCBlbnRyeS4KICAqLwogdW5pb24gdGhyZWFkX3VuaW9uIGluaXRfdGhyZWFkX3VuaW9uCi0gICAgX19hdHRyaWJ1dGVfXyAoKF9fc2VjdGlvbl9fKCIuZGF0YS5pbml0X3Rhc2siKSkpID0geworICAgIF9fYXR0cmlidXRlX18gKChfX3NlY3Rpb25fXygiLmluaXRfdGFzay5kYXRhIikpKSA9IHsKIElOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKX07CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggMDIzZGM4MC4uNmI4NDU5YzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3NldHVwLmMKaW5kZXggNDYyY2FlOC4uODIyOWIxMCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9zZXR1cC5jCkBAIC0xLDMwICsxLDExIEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL2tlcm5lbC9zZXR1cC5jCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKKyAqIGFyY2gvYmxhY2tmaW4va2VybmVsL3NldHVwLmMKICAqCi0gKiBDcmVhdGVkOgotICogRGVzY3JpcHRpb246CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA2IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCi0gKiBNb2RpZmllZDoKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KICAqCi0gKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIHRoZSBmaWxlIENPUFlJTkcsIG9yIHdyaXRlCi0gKiB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTM0LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9wZm4uaD4KIAogI2luY2x1ZGUgPGxpbnV4L2V4dDJfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9jcmFtZnNfZnMuaD4KQEAgLTQ3LDYgKzI5LDggQEAKICNpbmNsdWRlIDxhc20vZml4ZWRfY29kZS5oPgogI2luY2x1ZGUgPGFzbS9lYXJseV9wcmludGsuaD4KIAorc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHUsIGNwdV9kZXZpY2VzKTsKKwogdTE2IF9iZmluX3N3cnN0OwogCiB1bnNpZ25lZCBsb25nIG1lbW9yeV9zdGFydCwgbWVtb3J5X2VuZCwgcGh5c2ljYWxfbWVtX2VuZDsKQEAgLTY3LDYgKzUxLDI5IEBACiAKIGNoYXIgX19pbml0ZGF0YSBjb21tYW5kX2xpbmVbQ09NTUFORF9MSU5FX1NJWkVdOwogCisvKiBib290IG1lbW1hcCwgZm9yIHBhcnNpbmcgIm1lbW1hcD0iICovCisjZGVmaW5lIEJGSU5fTUVNTUFQX01BWAkJMTI4IC8qIG51bWJlciBvZiBlbnRyaWVzIGluIGJmaW5fbWVtbWFwICovCisjZGVmaW5lIEJGSU5fTUVNTUFQX1JBTQkJMQorI2RlZmluZSBCRklOX01FTU1BUF9SRVNFUlZFRAkyCitzdHJ1Y3QgYmZpbl9tZW1tYXAgeworCWludCBucl9tYXA7CisJc3RydWN0IGJmaW5fbWVtbWFwX2VudHJ5IHsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGFkZHI7IC8qIHN0YXJ0IG9mIG1lbW9yeSBzZWdtZW50ICovCisJCXVuc2lnbmVkIGxvbmcgbG9uZyBzaXplOworCQl1bnNpZ25lZCBsb25nIHR5cGU7CisJfSBtYXBbQkZJTl9NRU1NQVBfTUFYXTsKK30gYmZpbl9tZW1tYXAgX19pbml0ZGF0YTsKKworLyogZm9yIG1lbW1hcCBzYW5pdGl6YXRpb24gKi8KK3N0cnVjdCBjaGFuZ2VfbWVtYmVyIHsKKwlzdHJ1Y3QgYmZpbl9tZW1tYXBfZW50cnkgKnBlbnRyeTsgLyogcG9pbnRlciB0byBvcmlnaW5hbCBlbnRyeSAqLworCXVuc2lnbmVkIGxvbmcgbG9uZyBhZGRyOyAvKiBhZGRyZXNzIGZvciB0aGlzIGNoYW5nZSBwb2ludCAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgY2hhbmdlX21lbWJlciBjaGFuZ2VfcG9pbnRfbGlzdFsyKkJGSU5fTUVNTUFQX01BWF0gX19pbml0ZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgY2hhbmdlX21lbWJlciAqY2hhbmdlX3BvaW50WzIqQkZJTl9NRU1NQVBfTUFYXSBfX2luaXRkYXRhOworc3RhdGljIHN0cnVjdCBiZmluX21lbW1hcF9lbnRyeSAqb3ZlcmxhcF9saXN0W0JGSU5fTUVNTUFQX01BWF0gX19pbml0ZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgYmZpbl9tZW1tYXBfZW50cnkgbmV3X21hcFtCRklOX01FTU1BUF9NQVhdIF9faW5pdGRhdGE7CisKIHZvaWQgX19pbml0IGJmNTN4X2NhY2hlX2luaXQodm9pZCkKIHsKICNpZiBkZWZpbmVkKENPTkZJR19CRklOX0RDQUNIRSkgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9JQ0FDSEUpCkBAIC0xMjMsMTIgKzEzMCwyMjQgQEAKIAogfQogCisvKiBhZGRfbWVtb3J5X3JlZ2lvbiB0byBtZW1tYXAgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBhZGRfbWVtb3J5X3JlZ2lvbih1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSwgaW50IHR5cGUpCit7CisJaW50IGk7CisKKwlpID0gYmZpbl9tZW1tYXAubnJfbWFwOworCisJaWYgKGkgPT0gQkZJTl9NRU1NQVBfTUFYKSB7CisJCXByaW50ayhLRVJOX0VSUiAiT29vcHMhIFRvbyBtYW55IGVudHJpZXMgaW4gdGhlIG1lbW9yeSBtYXAhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWJmaW5fbWVtbWFwLm1hcFtpXS5hZGRyID0gc3RhcnQ7CisJYmZpbl9tZW1tYXAubWFwW2ldLnNpemUgPSBzaXplOworCWJmaW5fbWVtbWFwLm1hcFtpXS50eXBlID0gdHlwZTsKKwliZmluX21lbW1hcC5ucl9tYXArKzsKK30KKworLyoKKyAqIFNhbml0aXplIHRoZSBib290IG1lbW1hcCwgcmVtb3Zpbmcgb3ZlcmxhcHMuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNhbml0aXplX21lbW1hcChzdHJ1Y3QgYmZpbl9tZW1tYXBfZW50cnkgKm1hcCwgaW50ICpwbnJfbWFwKQoreworCXN0cnVjdCBjaGFuZ2VfbWVtYmVyICpjaGFuZ2VfdG1wOworCXVuc2lnbmVkIGxvbmcgY3VycmVudF90eXBlLCBsYXN0X3R5cGU7CisJdW5zaWduZWQgbG9uZyBsb25nIGxhc3RfYWRkcjsKKwlpbnQgY2hnaWR4LCBzdGlsbF9jaGFuZ2luZzsKKwlpbnQgb3ZlcmxhcF9lbnRyaWVzOworCWludCBuZXdfZW50cnk7CisJaW50IG9sZF9uciwgbmV3X25yLCBjaGdfbnI7CisJaW50IGk7CisKKwkvKgorCQlWaXN1YWxseSB3ZSdyZSBwZXJmb3JtaW5nIHRoZSBmb2xsb3dpbmcgKDEsMiwzLDQgPSBtZW1vcnkgdHlwZXMpCisKKwkJU2FtcGxlIG1lbW9yeSBtYXAgKHcvb3ZlcmxhcHMpOgorCQkgICBfX19fMjJfX19fX19fX19fX19fX19fX18KKwkJICAgX19fX19fX19fX19fX19fX19fX19fXzRfCisJCSAgIF9fX18xMTExX19fX19fX19fX19fX19fXworCQkgICBfNDRfX19fX19fX19fX19fX19fX19fX18KKwkJICAgMTExMTExMTFfX19fX19fX19fX19fX19fCisJCSAgIF9fX19fX19fX19fX19fX19fX19fMzNfXworCQkgICBfX19fX19fX19fXzQ0X19fX19fX19fX18KKwkJICAgX19fX19fX19fXzMzMzMzX19fX19fX19fCisJCSAgIF9fX19fX19fX19fX19fMjJfX19fX19fXworCQkgICBfX19fX19fX19fX19fX19fX19fMjIyMl8KKwkJICAgX19fX19fX19fMTExMTExMTExX19fX19fCisJCSAgIF9fX19fX19fX19fX19fX19fX19fXzExXworCQkgICBfX19fX19fX19fX19fX19fXzRfX19fX18KKworCQlTYW5pdGl6ZWQgZXF1aXZhbGVudCAobm8gb3ZlcmxhcCk6CisJCSAgIDFfX19fX19fX19fX19fX19fX19fX19fXworCQkgICBfNDRfX19fX19fX19fX19fX19fX19fX18KKwkJICAgX19fMV9fX19fX19fX19fX19fX19fX19fCisJCSAgIF9fX18yMl9fX19fX19fX19fX19fX19fXworCQkgICBfX19fX18xMV9fX19fX19fX19fX19fX18KKwkJICAgX19fX19fX19fMV9fX19fX19fX19fX19fCisJCSAgIF9fX19fX19fX18zX19fX19fX19fX19fXworCQkgICBfX19fX19fX19fXzQ0X19fX19fX19fX18KKwkJICAgX19fX19fX19fX19fXzMzX19fX19fX19fCisJCSAgIF9fX19fX19fX19fX19fXzJfX19fX19fXworCQkgICBfX19fX19fX19fX19fX19fMV9fX19fX18KKwkJICAgX19fX19fX19fX19fX19fX180X19fX19fCisJCSAgIF9fX19fX19fX19fX19fX19fX18yX19fXworCQkgICBfX19fX19fX19fX19fX19fX19fXzMzX18KKwkJICAgX19fX19fX19fX19fX19fX19fX19fXzRfCisJKi8KKwkvKiBpZiB0aGVyZSdzIG9ubHkgb25lIG1lbW9yeSByZWdpb24sIGRvbid0IGJvdGhlciAqLworCWlmICgqcG5yX21hcCA8IDIpCisJCXJldHVybiAtMTsKKworCW9sZF9uciA9ICpwbnJfbWFwOworCisJLyogYmFpbCBvdXQgaWYgd2UgZmluZCBhbnkgdW5yZWFzb25hYmxlIGFkZHJlc3NlcyBpbiBtZW1tYXAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgb2xkX25yOyBpKyspCisJCWlmIChtYXBbaV0uYWRkciArIG1hcFtpXS5zaXplIDwgbWFwW2ldLmFkZHIpCisJCQlyZXR1cm4gLTE7CisKKwkvKiBjcmVhdGUgcG9pbnRlcnMgZm9yIGluaXRpYWwgY2hhbmdlLXBvaW50IGluZm9ybWF0aW9uIChmb3Igc29ydGluZykgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMipvbGRfbnI7IGkrKykKKwkJY2hhbmdlX3BvaW50W2ldID0gJmNoYW5nZV9wb2ludF9saXN0W2ldOworCisJLyogcmVjb3JkIGFsbCBrbm93biBjaGFuZ2UtcG9pbnRzIChzdGFydGluZyBhbmQgZW5kaW5nIGFkZHJlc3NlcyksCisJICAgb21pdHRpbmcgdGhvc2UgdGhhdCBhcmUgZm9yIGVtcHR5IG1lbW9yeSByZWdpb25zICovCisJY2hnaWR4ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgb2xkX25yOyBpKyspCXsKKwkJaWYgKG1hcFtpXS5zaXplICE9IDApIHsKKwkJCWNoYW5nZV9wb2ludFtjaGdpZHhdLT5hZGRyID0gbWFwW2ldLmFkZHI7CisJCQljaGFuZ2VfcG9pbnRbY2hnaWR4KytdLT5wZW50cnkgPSAmbWFwW2ldOworCQkJY2hhbmdlX3BvaW50W2NoZ2lkeF0tPmFkZHIgPSBtYXBbaV0uYWRkciArIG1hcFtpXS5zaXplOworCQkJY2hhbmdlX3BvaW50W2NoZ2lkeCsrXS0+cGVudHJ5ID0gJm1hcFtpXTsKKwkJfQorCX0KKwljaGdfbnIgPSBjaGdpZHg7ICAgIAkvKiB0cnVlIG51bWJlciBvZiBjaGFuZ2UtcG9pbnRzICovCisKKwkvKiBzb3J0IGNoYW5nZS1wb2ludCBsaXN0IGJ5IG1lbW9yeSBhZGRyZXNzZXMgKGxvdyAtPiBoaWdoKSAqLworCXN0aWxsX2NoYW5naW5nID0gMTsKKwl3aGlsZSAoc3RpbGxfY2hhbmdpbmcpCXsKKwkJc3RpbGxfY2hhbmdpbmcgPSAwOworCQlmb3IgKGkgPSAxOyBpIDwgY2hnX25yOyBpKyspICB7CisJCQkvKiBpZiA8Y3VycmVudF9hZGRyPiA+IDxsYXN0X2FkZHI+LCBzd2FwICovCisJCQkvKiBvciwgaWYgY3VycmVudD08c3RhcnRfYWRkcj4gJiBsYXN0PTxlbmRfYWRkcj4sIHN3YXAgKi8KKwkJCWlmICgoY2hhbmdlX3BvaW50W2ldLT5hZGRyIDwgY2hhbmdlX3BvaW50W2ktMV0tPmFkZHIpIHx8CisJCQkJKChjaGFuZ2VfcG9pbnRbaV0tPmFkZHIgPT0gY2hhbmdlX3BvaW50W2ktMV0tPmFkZHIpICYmCisJCQkJIChjaGFuZ2VfcG9pbnRbaV0tPmFkZHIgPT0gY2hhbmdlX3BvaW50W2ldLT5wZW50cnktPmFkZHIpICYmCisJCQkJIChjaGFuZ2VfcG9pbnRbaS0xXS0+YWRkciAhPSBjaGFuZ2VfcG9pbnRbaS0xXS0+cGVudHJ5LT5hZGRyKSkKKwkJCSAgICkgeworCQkJCWNoYW5nZV90bXAgPSBjaGFuZ2VfcG9pbnRbaV07CisJCQkJY2hhbmdlX3BvaW50W2ldID0gY2hhbmdlX3BvaW50W2ktMV07CisJCQkJY2hhbmdlX3BvaW50W2ktMV0gPSBjaGFuZ2VfdG1wOworCQkJCXN0aWxsX2NoYW5naW5nID0gMTsKKwkJCX0KKwkJfQorCX0KKworCS8qIGNyZWF0ZSBhIG5ldyBtZW1tYXAsIHJlbW92aW5nIG92ZXJsYXBzICovCisJb3ZlcmxhcF9lbnRyaWVzID0gMDsJIC8qIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBvdmVybGFwIHRhYmxlICovCisJbmV3X2VudHJ5ID0gMDsJIC8qIGluZGV4IGZvciBjcmVhdGluZyBuZXcgbWVtbWFwIGVudHJpZXMgKi8KKwlsYXN0X3R5cGUgPSAwOwkJIC8qIHN0YXJ0IHdpdGggdW5kZWZpbmVkIG1lbW9yeSB0eXBlICovCisJbGFzdF9hZGRyID0gMDsJCSAvKiBzdGFydCB3aXRoIDAgYXMgbGFzdCBzdGFydGluZyBhZGRyZXNzICovCisJLyogbG9vcCB0aHJvdWdoIGNoYW5nZS1wb2ludHMsIGRldGVybWluaW5nIGFmZmVjdCBvbiB0aGUgbmV3IG1lbW1hcCAqLworCWZvciAoY2hnaWR4ID0gMDsgY2hnaWR4IDwgY2hnX25yOyBjaGdpZHgrKykgeworCQkvKiBrZWVwIHRyYWNrIG9mIGFsbCBvdmVybGFwcGluZyBtZW1tYXAgZW50cmllcyAqLworCQlpZiAoY2hhbmdlX3BvaW50W2NoZ2lkeF0tPmFkZHIgPT0gY2hhbmdlX3BvaW50W2NoZ2lkeF0tPnBlbnRyeS0+YWRkcikgeworCQkJLyogYWRkIG1hcCBlbnRyeSB0byBvdmVybGFwIGxpc3QgKD4gMSBlbnRyeSBpbXBsaWVzIGFuIG92ZXJsYXApICovCisJCQlvdmVybGFwX2xpc3Rbb3ZlcmxhcF9lbnRyaWVzKytdID0gY2hhbmdlX3BvaW50W2NoZ2lkeF0tPnBlbnRyeTsKKwkJfSBlbHNlIHsKKwkJCS8qIHJlbW92ZSBlbnRyeSBmcm9tIGxpc3QgKG9yZGVyIGluZGVwZW5kZW50LCBzbyBzd2FwIHdpdGggbGFzdCkgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBvdmVybGFwX2VudHJpZXM7IGkrKykgeworCQkJCWlmIChvdmVybGFwX2xpc3RbaV0gPT0gY2hhbmdlX3BvaW50W2NoZ2lkeF0tPnBlbnRyeSkKKwkJCQkJb3ZlcmxhcF9saXN0W2ldID0gb3ZlcmxhcF9saXN0W292ZXJsYXBfZW50cmllcy0xXTsKKwkJCX0KKwkJCW92ZXJsYXBfZW50cmllcy0tOworCQl9CisJCS8qIGlmIHRoZXJlIGFyZSBvdmVybGFwcGluZyBlbnRyaWVzLCBkZWNpZGUgd2hpY2ggInR5cGUiIHRvIHVzZSAqLworCQkvKiAobGFyZ2VyIHZhbHVlIHRha2VzIHByZWNlZGVuY2UgLS0gMT11c2FibGUsIDIsMyw0LDQrPXVudXNhYmxlKSAqLworCQljdXJyZW50X3R5cGUgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgb3ZlcmxhcF9lbnRyaWVzOyBpKyspCisJCQlpZiAob3ZlcmxhcF9saXN0W2ldLT50eXBlID4gY3VycmVudF90eXBlKQorCQkJCWN1cnJlbnRfdHlwZSA9IG92ZXJsYXBfbGlzdFtpXS0+dHlwZTsKKwkJLyogY29udGludWUgYnVpbGRpbmcgdXAgbmV3IG1lbW1hcCBiYXNlZCBvbiB0aGlzIGluZm9ybWF0aW9uICovCisJCWlmIChjdXJyZW50X3R5cGUgIT0gbGFzdF90eXBlKQl7CisJCQlpZiAobGFzdF90eXBlICE9IDApIHsKKwkJCQluZXdfbWFwW25ld19lbnRyeV0uc2l6ZSA9CisJCQkJCWNoYW5nZV9wb2ludFtjaGdpZHhdLT5hZGRyIC0gbGFzdF9hZGRyOworCQkJCS8qIG1vdmUgZm9yd2FyZCBvbmx5IGlmIHRoZSBuZXcgc2l6ZSB3YXMgbm9uLXplcm8gKi8KKwkJCQlpZiAobmV3X21hcFtuZXdfZW50cnldLnNpemUgIT0gMCkKKwkJCQkJaWYgKCsrbmV3X2VudHJ5ID49IEJGSU5fTUVNTUFQX01BWCkKKwkJCQkJCWJyZWFrOyAJLyogbm8gbW9yZSBzcGFjZSBsZWZ0IGZvciBuZXcgZW50cmllcyAqLworCQkJfQorCQkJaWYgKGN1cnJlbnRfdHlwZSAhPSAwKSB7CisJCQkJbmV3X21hcFtuZXdfZW50cnldLmFkZHIgPSBjaGFuZ2VfcG9pbnRbY2hnaWR4XS0+YWRkcjsKKwkJCQluZXdfbWFwW25ld19lbnRyeV0udHlwZSA9IGN1cnJlbnRfdHlwZTsKKwkJCQlsYXN0X2FkZHIgPSBjaGFuZ2VfcG9pbnRbY2hnaWR4XS0+YWRkcjsKKwkJCX0KKwkJCWxhc3RfdHlwZSA9IGN1cnJlbnRfdHlwZTsKKwkJfQorCX0KKwluZXdfbnIgPSBuZXdfZW50cnk7ICAgLyogcmV0YWluIGNvdW50IGZvciBuZXcgZW50cmllcyAqLworCisJLyogY29weSBuZXcgIG1hcHBpbmcgaW50byBvcmlnaW5hbCBsb2NhdGlvbiAqLworCW1lbWNweShtYXAsIG5ld19tYXAsIG5ld19ucipzaXplb2Yoc3RydWN0IGJmaW5fbWVtbWFwX2VudHJ5KSk7CisJKnBucl9tYXAgPSBuZXdfbnI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHByaW50X21lbW9yeV9tYXAoY2hhciAqd2hvKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGJmaW5fbWVtbWFwLm5yX21hcDsgaSsrKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIgJXM6ICUwMTZMeCAtICUwMTZMeCAiLCB3aG8sCisJCQliZmluX21lbW1hcC5tYXBbaV0uYWRkciwKKwkJCWJmaW5fbWVtbWFwLm1hcFtpXS5hZGRyICsgYmZpbl9tZW1tYXAubWFwW2ldLnNpemUpOworCQlzd2l0Y2ggKGJmaW5fbWVtbWFwLm1hcFtpXS50eXBlKSB7CisJCWNhc2UgQkZJTl9NRU1NQVBfUkFNOgorCQkJCXByaW50aygiKHVzYWJsZSlcbiIpOworCQkJCWJyZWFrOworCQljYXNlIEJGSU5fTUVNTUFQX1JFU0VSVkVEOgorCQkJCXByaW50aygiKHJlc2VydmVkKVxuIik7CisJCQkJYnJlYWs7CisJCWRlZmF1bHQ6CXByaW50aygidHlwZSAlbHVcbiIsIGJmaW5fbWVtbWFwLm1hcFtpXS50eXBlKTsKKwkJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIF9faW5pdCBpbnQgcGFyc2VfbWVtbWFwKGNoYXIgKmFyZykKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnRfYXQsIG1lbV9zaXplOworCisJaWYgKCFhcmcpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtX3NpemUgPSBtZW1wYXJzZShhcmcsICZhcmcpOworCWlmICgqYXJnID09ICdAJykgeworCQlzdGFydF9hdCA9IG1lbXBhcnNlKGFyZysxLCAmYXJnKTsKKwkJYWRkX21lbW9yeV9yZWdpb24oc3RhcnRfYXQsIG1lbV9zaXplLCBCRklOX01FTU1BUF9SQU0pOworCX0gZWxzZSBpZiAoKmFyZyA9PSAnJCcpIHsKKwkJc3RhcnRfYXQgPSBtZW1wYXJzZShhcmcrMSwgJmFyZyk7CisJCWFkZF9tZW1vcnlfcmVnaW9uKHN0YXJ0X2F0LCBtZW1fc2l6ZSwgQkZJTl9NRU1NQVBfUkVTRVJWRUQpOworCX0KKworCXJldHVybiAwOworfQorCiAvKgogICogSW5pdGlhbCBwYXJzaW5nIG9mIHRoZSBjb21tYW5kIGxpbmUuICBDdXJyZW50bHksIHdlIHN1cHBvcnQ6CiAgKiAgLSBDb250cm9sbGluZyB0aGUgbGludXggbWVtb3J5IHNpemU6IG1lbT14eHhbS01HXQogICogIC0gQ29udHJvbGxpbmcgdGhlIHBoeXNpY2FsIG1lbW9yeSBzaXplOiBtYXhfbWVtPXh4eFtLTUddWyRdWyNdCiAgKiAgICAgICAkIC0+IHJlc2VydmVkIG1lbW9yeSBpcyBkY2FjaGVhYmxlCiAgKiAgICAgICAjIC0+IHJlc2VydmVkIG1lbW9yeSBpcyBpY2FjaGVhYmxlCisgKiAgLSAibWVtbWFwPVhYWFtLa21NXVtAXVskXVhYWFtLa21NXSIgZGVmaW5lcyBhIG1lbW9yeSByZWdpb24KKyAqICAgICAgIEAgZnJvbSA8c3RhcnQ+IHRvIDxzdGFydD4rPG1lbT4sIHR5cGUgUkFNCisgKiAgICAgICAkIGZyb20gPHN0YXJ0PiB0byA8c3RhcnQ+KzxtZW0+LCB0eXBlIFJFU0VSVkVECisgKgogICovCiBzdGF0aWMgX19pbml0IHZvaWQgcGFyc2VfY21kbGluZV9lYXJseShjaGFyICpjbWRsaW5lX3ApCiB7CkBAIC0xMzYsNyArMzU1LDYgQEAKIAl1bnNpZ25lZCBpbnQgbWVtc2l6ZTsKIAlmb3IgKDs7KSB7CiAJCWlmIChjID09ICcgJykgewotCiAJCQlpZiAoIW1lbWNtcCh0bywgIm1lbT0iLCA0KSkgewogCQkJCXRvICs9IDQ7CiAJCQkJbWVtc2l6ZSA9IG1lbXBhcnNlKHRvLCAmdG8pOwpAQCAtMTYyLDYgKzM4MCw5IEBACiAJCQl9IGVsc2UgaWYgKCFtZW1jbXAodG8sICJlYXJseXByaW50az0iLCAxMikpIHsKIAkJCQl0byArPSAxMjsKIAkJCQlzZXR1cF9lYXJseV9wcmludGsodG8pOworCQkJfSBlbHNlIGlmICghbWVtY21wKHRvLCAibWVtbWFwPSIsIDcpKSB7CisJCQkJdG8gKz0gNzsKKwkJCQlwYXJzZV9tZW1tYXAodG8pOwogCQkJfQogCQl9CiAJCWMgPSAqKHRvKyspOwpAQCAtMTcwLDc1ICszOTEsMzYgQEAKIAl9CiB9CiAKLXZvaWQgX19pbml0IHNldHVwX2FyY2goY2hhciAqKmNtZGxpbmVfcCkKKy8qCisgKiBTZXR1cCBtZW1vcnkgZGVmYXVsdHMgZnJvbSB1c2VyIGNvbmZpZy4KKyAqIFRoZSBwaHlzaWNhbCBtZW1vcnkgbGF5b3V0IGxvb2tzIGxpa2U6CisgKgorICogIFtfcmFtYmFzZSwgX3JhbXN0YXJ0XToJCWtlcm5lbCBpbWFnZQorICogIFttZW1vcnlfc3RhcnQsIG1lbW9yeV9lbmRdOgkJZHluYW1pYyBtZW1vcnkgbWFuYWdlZCBieSBrZXJuZWwKKyAqICBbbWVtb3J5X2VuZCwgX3JhbWVuZF06CQlyZXNlcnZlZCBtZW1vcnkKKyAqICAJW21lb3J5X210ZF9zdGFydChtZW1vcnlfZW5kKSwKKyAqICAJCW1lbW9yeV9tdGRfc3RhcnQgKyBtdGRfc2l6ZV06CXJvb3RmcyAoaWYgYW55KQorICoJW19yYW1lbmQgLSBETUFfVU5DQUNIRURfUkVHSU9OLAorICoJCV9yYW1lbmRdOgkJCXVuY2FjaGVkIERNQSByZWdpb24KKyAqICBbX3JhbWVuZCwgcGh5c2ljYWxfbWVtX2VuZF06CW1lbW9yeSBub3QgbWFuYWdlZCBieSBrZXJuZWwKKyAqCisgKi8KK3N0YXRpYyBfX2luaXQgdm9pZCAgbWVtb3J5X3NldHVwKHZvaWQpCiB7Ci0JaW50IGJvb3RtYXBfc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGwxX2xlbmd0aCwgc2NsaywgY2NsazsKICNpZmRlZiBDT05GSUdfTVREX1VDTElOVVgKIAl1bnNpZ25lZCBsb25nIG10ZF9waHlzID0gMDsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0RVTU1ZX0NPTlNPTEUKLQljb25zd2l0Y2hwID0gJmR1bW15X2NvbjsKLSNlbmRpZgorCV9yYW1iYXNlID0gKHVuc2lnbmVkIGxvbmcpX3N0ZXh0OworCV9yYW1zdGFydCA9ICh1bnNpZ25lZCBsb25nKV9lbmQ7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19DTURMSU5FX0JPT0wpCi0Jc3RybmNweSgmY29tbWFuZF9saW5lWzBdLCBDT05GSUdfQ01ETElORSwgc2l6ZW9mKGNvbW1hbmRfbGluZSkpOwotCWNvbW1hbmRfbGluZVtzaXplb2YoY29tbWFuZF9saW5lKSAtIDFdID0gMDsKLSNlbmRpZgotCi0JLyogS2VlcCBhIGNvcHkgb2YgY29tbWFuZCBsaW5lICovCi0JKmNtZGxpbmVfcCA9ICZjb21tYW5kX2xpbmVbMF07Ci0JbWVtY3B5KGJvb3RfY29tbWFuZF9saW5lLCBjb21tYW5kX2xpbmUsIENPTU1BTkRfTElORV9TSVpFKTsKLQlib290X2NvbW1hbmRfbGluZVtDT01NQU5EX0xJTkVfU0laRSAtIDFdID0gJ1wwJzsKLQotCS8qIHNldHVwIG1lbW9yeSBkZWZhdWx0cyBmcm9tIHRoZSB1c2VyIGNvbmZpZyAqLwotCXBoeXNpY2FsX21lbV9lbmQgPSAwOwotCV9yYW1lbmQgPSBDT05GSUdfTUVNX1NJWkUgKiAxMDI0ICogMTAyNDsKLQotCXBhcnNlX2NtZGxpbmVfZWFybHkoJmNvbW1hbmRfbGluZVswXSk7Ci0KLQljY2xrID0gZ2V0X2NjbGsoKTsKLQlzY2xrID0gZ2V0X3NjbGsoKTsKLQotI2lmICFkZWZpbmVkKENPTkZJR19CRklOX0tFUk5FTF9DTE9DSykKLQlpZiAoQU5PTUFMWV8wNTAwMDI3MyAmJiBjY2xrID09IHNjbGspCi0JCXBhbmljKCJBTk9NQUxZIDA1MDAwMjczLCBTQ0xLIGNhbiBub3QgYmUgc2FtZSBhcyBDQ0xLIik7Ci0jZW5kaWYKLQotI2lmZGVmIEJGNTYxX0ZBTUlMWQotCWlmIChBTk9NQUxZXzA1MDAwMjY2KSB7Ci0JCWJmaW5fcmVhZF9JTURNQV9EMF9JUlFfU1RBVFVTKCk7Ci0JCWJmaW5fcmVhZF9JTURNQV9EMV9JUlFfU1RBVFVTKCk7CisJaWYgKERNQV9VTkNBQ0hFRF9SRUdJT04gPiAoX3JhbWVuZCAtIF9yYW1zdGFydCkpIHsKKwkJY29uc29sZV9pbml0KCk7CisJCXBhbmljKCJETUEgcmVnaW9uIGV4Y2VlZHMgbWVtb3J5IGxpbWl0OiAlbHUuXG4iLAorCQkJX3JhbWVuZCAtIF9yYW1zdGFydCk7CiAJfQotI2VuZGlmCi0KLQlwcmludGsoS0VSTl9JTkZPICJIYXJkd2FyZSBUcmFjZSAiKTsKLQlpZiAoYmZpbl9yZWFkX1RCVUZDVEwoKSAmIDB4MSApCi0JCXByaW50aygiQWN0aXZlICIpOwotCWVsc2UKLQkJcHJpbnRrKCJPZmYgIik7Ci0JaWYgKGJmaW5fcmVhZF9UQlVGQ1RMKCkgJiAweDIpCi0JCXByaW50aygiYW5kIEVuYWJsZWRcbiIpOwotCWVsc2UKLQlwcmludGsoImFuZCBEaXNhYmxlZFxuIik7Ci0KLQotI2lmIGRlZmluZWQoQ09ORklHX0NIUl9ERVZfRkxBU0gpIHx8IGRlZmluZWQoQ09ORklHX0JMS19ERVZfRkxBU0gpCi0JLyogd2UgbmVlZCB0byBpbml0aWFsaXplIHRoZSBGbGFzaHJvbSBkZXZpY2UgaGVyZSBzaW5jZSB3ZSBtaWdodAotCSAqIGRvIHRoaW5ncyB3aXRoIGZsYXNoIGVhcmx5IG9uIGluIHRoZSBib290Ci0JICovCi0JZmxhc2hfcHJvYmUoKTsKLSNlbmRpZgotCi0JaWYgKHBoeXNpY2FsX21lbV9lbmQgPT0gMCkKLQkJcGh5c2ljYWxfbWVtX2VuZCA9IF9yYW1lbmQ7Ci0KLQkvKiBieSBub3cgdGhlIHN0YWNrIGlzIHBhcnQgb2YgdGhlIGluaXQgdGFzayAqLwogCW1lbW9yeV9lbmQgPSBfcmFtZW5kIC0gRE1BX1VOQ0FDSEVEX1JFR0lPTjsKIAotCV9yYW1zdGFydCA9ICh1bnNpZ25lZCBsb25nKV9fYnNzX3N0b3A7Ci0JX3JhbWJhc2UgPSAodW5zaWduZWQgbG9uZylfc3RleHQ7CiAjaWZkZWYgQ09ORklHX01QVQogCS8qIFJvdW5kIHVwIHRvIG11bHRpcGxlIG9mIDRNQi4gICovCiAJbWVtb3J5X3N0YXJ0ID0gKF9yYW1zdGFydCArIDB4M2ZmZmZmKSAmIH4weDNmZmZmZjsKQEAgLTI5Miw3ICs0NzQsNyBAQAogCX0KIAogCS8qIFJlbG9jYXRlIE1URCBpbWFnZSB0byB0aGUgdG9wIG9mIG1lbW9yeSBhZnRlciB0aGUgdW5jYWNoZWQgbWVtb3J5IGFyZWEgKi8KLQlkbWFfbWVtY3B5KChjaGFyICopbWVtb3J5X2VuZCwgX19ic3Nfc3RvcCwgbXRkX3NpemUpOworCWRtYV9tZW1jcHkoKGNoYXIgKiltZW1vcnlfZW5kLCBfZW5kLCBtdGRfc2l6ZSk7CiAKIAltZW1vcnlfbXRkX3N0YXJ0ID0gbWVtb3J5X2VuZDsKIAlfZWJzcyA9IG1lbW9yeV9tdGRfc3RhcnQ7CS8qIGRlZmluZSBfZWJzcyBmb3IgY29tcGF0aWJsZSAqLwpAQCAtMzE5LDEzICs1MDEsMTc1IEBACiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKENPTkZJR19NVERfVUNMSU5VWCkKLQltZW1vcnlfZW5kIC09IFNJWkVfNEs7IC8qSW4gY2FzZSB0aGVyZSBpcyBubyB2YWxpZCBDUExCIGJlaGluZCBtZW1vcnlfZW5kIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgdG8gY2xvc2UqLworCS8qSW4gY2FzZSB0aGVyZSBpcyBubyB2YWxpZCBDUExCIGJlaGluZCBtZW1vcnlfZW5kIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgdG8gY2xvc2UqLworCW1lbW9yeV9lbmQgLT0gU0laRV80SzsKICNlbmRpZgorCiAJaW5pdF9tbS5zdGFydF9jb2RlID0gKHVuc2lnbmVkIGxvbmcpX3N0ZXh0OwogCWluaXRfbW0uZW5kX2NvZGUgPSAodW5zaWduZWQgbG9uZylfZXRleHQ7CiAJaW5pdF9tbS5lbmRfZGF0YSA9ICh1bnNpZ25lZCBsb25nKV9lZGF0YTsKIAlpbml0X21tLmJyayA9ICh1bnNpZ25lZCBsb25nKTA7CiAKKwlwcmludGsoS0VSTl9JTkZPICJCb2FyZCBNZW1vcnk6ICVsZE1CXG4iLCBwaHlzaWNhbF9tZW1fZW5kID4+IDIwKTsKKwlwcmludGsoS0VSTl9JTkZPICJLZXJuZWwgTWFuYWdlZCBNZW1vcnk6ICVsZE1CXG4iLCBfcmFtZW5kID4+IDIwKTsKKworCXByaW50ayhLRVJOX0lORk8gIk1lbW9yeSBtYXA6XG4iCisJCUtFUk5fSU5GTyAiICB0ZXh0ICAgICAgPSAweCVwLTB4JXBcbiIKKwkJS0VSTl9JTkZPICIgIHJvZGF0YSAgICA9IDB4JXAtMHglcFxuIgorCQlLRVJOX0lORk8gIiAgYnNzICAgICAgID0gMHglcC0weCVwXG4iCisJCUtFUk5fSU5GTyAiICBkYXRhICAgICAgPSAweCVwLTB4JXBcbiIKKwkJS0VSTl9JTkZPICIgICAgc3RhY2sgICA9IDB4JXAtMHglcFxuIgorCQlLRVJOX0lORk8gIiAgaW5pdCAgICAgID0gMHglcC0weCVwXG4iCisJCUtFUk5fSU5GTyAiICBhdmFpbGFibGUgPSAweCVwLTB4JXBcbiIKKyNpZmRlZiBDT05GSUdfTVREX1VDTElOVVgKKwkJS0VSTl9JTkZPICIgIHJvb3RmcyAgICA9IDB4JXAtMHglcFxuIgorI2VuZGlmCisjaWYgRE1BX1VOQ0FDSEVEX1JFR0lPTiA+IDAKKwkJS0VSTl9JTkZPICIgIERNQSBab25lICA9IDB4JXAtMHglcFxuIgorI2VuZGlmCisJCSwgX3N0ZXh0LCBfZXRleHQsCisJCV9fc3RhcnRfcm9kYXRhLCBfX2VuZF9yb2RhdGEsCisJCV9fYnNzX3N0YXJ0LCBfX2Jzc19zdG9wLAorCQlfc2RhdGEsIF9lZGF0YSwKKwkJKHZvaWQgKikmaW5pdF90aHJlYWRfdW5pb24sCisJCSh2b2lkICopKChpbnQpKCZpbml0X3RocmVhZF91bmlvbikgKyAweDIwMDApLAorCQlfX2luaXRfYmVnaW4sIF9faW5pdF9lbmQsCisJCSh2b2lkICopX3JhbXN0YXJ0LCAodm9pZCAqKW1lbW9yeV9lbmQKKyNpZmRlZiBDT05GSUdfTVREX1VDTElOVVgKKwkJLCAodm9pZCAqKW1lbW9yeV9tdGRfc3RhcnQsICh2b2lkICopKG1lbW9yeV9tdGRfc3RhcnQgKyBtdGRfc2l6ZSkKKyNlbmRpZgorI2lmIERNQV9VTkNBQ0hFRF9SRUdJT04gPiAwCisJCSwgKHZvaWQgKikoX3JhbWVuZCAtIERNQV9VTkNBQ0hFRF9SRUdJT04pLCAodm9pZCAqKShfcmFtZW5kKQorI2VuZGlmCisJCSk7Cit9CisKK3N0YXRpYyBfX2luaXQgdm9pZCBzZXR1cF9ib290bWVtX2FsbG9jYXRvcih2b2lkKQoreworCWludCBib290bWFwX3NpemU7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBtaW5fcGZuLCBtYXhfcGZuOworCXVuc2lnbmVkIGxvbmcgY3Vycl9wZm4sIGxhc3RfcGZuLCBzaXplOworCisJLyogbWFyayBtZW1vcnkgYmV0d2VlbiBtZW1vcnlfc3RhcnQgYW5kIG1lbW9yeV9lbmQgdXNhYmxlICovCisJYWRkX21lbW9yeV9yZWdpb24obWVtb3J5X3N0YXJ0LAorCQltZW1vcnlfZW5kIC0gbWVtb3J5X3N0YXJ0LCBCRklOX01FTU1BUF9SQU0pOworCS8qIHNhbml0eSBjaGVjayBmb3Igb3ZlcmxhcCAqLworCXNhbml0aXplX21lbW1hcChiZmluX21lbW1hcC5tYXAsICZiZmluX21lbW1hcC5ucl9tYXApOworCXByaW50X21lbW9yeV9tYXAoImJvb3QgbWVtbWFwIik7CisKKwltaW5fcGZuID0gUEFHRV9PRkZTRVQgPj4gUEFHRV9TSElGVDsKKwltYXhfcGZuID0gbWVtb3J5X2VuZCA+PiBQQUdFX1NISUZUOworCisJLyoKKwkgKiBnaXZlIGFsbCB0aGUgbWVtb3J5IHRvIHRoZSBib290bWFwIGFsbG9jYXRvciwgIHRlbGwgaXQgdG8gcHV0IHRoZQorCSAqIGJvb3QgbWVtX21hcCBhdCB0aGUgc3RhcnQgb2YgbWVtb3J5LgorCSAqLworCWJvb3RtYXBfc2l6ZSA9IGluaXRfYm9vdG1lbV9ub2RlKE5PREVfREFUQSgwKSwKKwkJCW1lbW9yeV9zdGFydCA+PiBQQUdFX1NISUZULAkvKiBtYXAgZ29lcyBoZXJlICovCisJCQltaW5fcGZuLCBtYXhfcGZuKTsKKworCS8qIHJlZ2lzdGVyIHRoZSBtZW1tYXAgcmVnaW9ucyB3aXRoIHRoZSBib290bWVtIGFsbG9jYXRvciAqLworCWZvciAoaSA9IDA7IGkgPCBiZmluX21lbW1hcC5ucl9tYXA7IGkrKykgeworCQkvKgorCQkgKiBSZXNlcnZlIHVzYWJsZSBtZW1vcnkKKwkJICovCisJCWlmIChiZmluX21lbW1hcC5tYXBbaV0udHlwZSAhPSBCRklOX01FTU1BUF9SQU0pCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogV2UgYXJlIHJvdW5kaW5nIHVwIHRoZSBzdGFydCBhZGRyZXNzIG9mIHVzYWJsZSBtZW1vcnk6CisJCSAqLworCQljdXJyX3BmbiA9IFBGTl9VUChiZmluX21lbW1hcC5tYXBbaV0uYWRkcik7CisJCWlmIChjdXJyX3BmbiA+PSBtYXhfcGZuKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIC4uLiBhbmQgYXQgdGhlIGVuZCBvZiB0aGUgdXNhYmxlIHJhbmdlIGRvd253YXJkczoKKwkJICovCisJCWxhc3RfcGZuID0gUEZOX0RPV04oYmZpbl9tZW1tYXAubWFwW2ldLmFkZHIgKworCQkJCQkgYmZpbl9tZW1tYXAubWFwW2ldLnNpemUpOworCisJCWlmIChsYXN0X3BmbiA+IG1heF9wZm4pCisJCQlsYXN0X3BmbiA9IG1heF9wZm47CisKKwkJLyoKKwkJICogLi4gZmluYWxseSwgZGlkIGFsbCB0aGUgcm91bmRpbmcgYW5kIHBsYXlpbmcKKwkJICogYXJvdW5kIGp1c3QgbWFrZSB0aGUgYXJlYSBnbyBhd2F5PworCQkgKi8KKwkJaWYgKGxhc3RfcGZuIDw9IGN1cnJfcGZuKQorCQkJY29udGludWU7CisKKwkJc2l6ZSA9IGxhc3RfcGZuIC0gY3Vycl9wZm47CisJCWZyZWVfYm9vdG1lbShQRk5fUEhZUyhjdXJyX3BmbiksIFBGTl9QSFlTKHNpemUpKTsKKwl9CisKKwkvKiByZXNlcnZlIG1lbW9yeSBiZWZvcmUgbWVtb3J5X3N0YXJ0LCBpbmNsdWRpbmcgYm9vdG1hcCAqLworCXJlc2VydmVfYm9vdG1lbShQQUdFX09GRlNFVCwKKwkJbWVtb3J5X3N0YXJ0ICsgYm9vdG1hcF9zaXplICsgUEFHRV9TSVpFIC0gMSAtIFBBR0VfT0ZGU0VULAorCQlCT09UTUVNX0RFRkFVTFQpOworfQorCit2b2lkIF9faW5pdCBzZXR1cF9hcmNoKGNoYXIgKipjbWRsaW5lX3ApCit7CisJdW5zaWduZWQgbG9uZyBsMV9sZW5ndGgsIHNjbGssIGNjbGs7CisKKyNpZmRlZiBDT05GSUdfRFVNTVlfQ09OU09MRQorCWNvbnN3aXRjaHAgPSAmZHVtbXlfY29uOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19DTURMSU5FX0JPT0wpCisJc3RybmNweSgmY29tbWFuZF9saW5lWzBdLCBDT05GSUdfQ01ETElORSwgc2l6ZW9mKGNvbW1hbmRfbGluZSkpOworCWNvbW1hbmRfbGluZVtzaXplb2YoY29tbWFuZF9saW5lKSAtIDFdID0gMDsKKyNlbmRpZgorCisJLyogS2VlcCBhIGNvcHkgb2YgY29tbWFuZCBsaW5lICovCisJKmNtZGxpbmVfcCA9ICZjb21tYW5kX2xpbmVbMF07CisJbWVtY3B5KGJvb3RfY29tbWFuZF9saW5lLCBjb21tYW5kX2xpbmUsIENPTU1BTkRfTElORV9TSVpFKTsKKwlib290X2NvbW1hbmRfbGluZVtDT01NQU5EX0xJTkVfU0laRSAtIDFdID0gJ1wwJzsKKworCS8qIHNldHVwIG1lbW9yeSBkZWZhdWx0cyBmcm9tIHRoZSB1c2VyIGNvbmZpZyAqLworCXBoeXNpY2FsX21lbV9lbmQgPSAwOworCV9yYW1lbmQgPSBDT05GSUdfTUVNX1NJWkUgKiAxMDI0ICogMTAyNDsKKworCW1lbXNldCgmYmZpbl9tZW1tYXAsIDAsIHNpemVvZihiZmluX21lbW1hcCkpOworCisJcGFyc2VfY21kbGluZV9lYXJseSgmY29tbWFuZF9saW5lWzBdKTsKKworCWlmIChwaHlzaWNhbF9tZW1fZW5kID09IDApCisJCXBoeXNpY2FsX21lbV9lbmQgPSBfcmFtZW5kOworCisJbWVtb3J5X3NldHVwKCk7CisKKwljY2xrID0gZ2V0X2NjbGsoKTsKKwlzY2xrID0gZ2V0X3NjbGsoKTsKKworI2lmICFkZWZpbmVkKENPTkZJR19CRklOX0tFUk5FTF9DTE9DSykKKwlpZiAoQU5PTUFMWV8wNTAwMDI3MyAmJiBjY2xrID09IHNjbGspCisJCXBhbmljKCJBTk9NQUxZIDA1MDAwMjczLCBTQ0xLIGNhbiBub3QgYmUgc2FtZSBhcyBDQ0xLIik7CisjZW5kaWYKKworI2lmZGVmIEJGNTYxX0ZBTUlMWQorCWlmIChBTk9NQUxZXzA1MDAwMjY2KSB7CisJCWJmaW5fcmVhZF9JTURNQV9EMF9JUlFfU1RBVFVTKCk7CisJCWJmaW5fcmVhZF9JTURNQV9EMV9JUlFfU1RBVFVTKCk7CisJfQorI2VuZGlmCisJcHJpbnRrKEtFUk5fSU5GTyAiSGFyZHdhcmUgVHJhY2UgIik7CisJaWYgKGJmaW5fcmVhZF9UQlVGQ1RMKCkgJiAweDEpCisJCXByaW50aygiQWN0aXZlICIpOworCWVsc2UKKwkJcHJpbnRrKCJPZmYgIik7CisJaWYgKGJmaW5fcmVhZF9UQlVGQ1RMKCkgJiAweDIpCisJCXByaW50aygiYW5kIEVuYWJsZWRcbiIpOworCWVsc2UKKwlwcmludGsoImFuZCBEaXNhYmxlZFxuIik7CisKKyNpZiBkZWZpbmVkKENPTkZJR19DSFJfREVWX0ZMQVNIKSB8fCBkZWZpbmVkKENPTkZJR19CTEtfREVWX0ZMQVNIKQorCS8qIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgRmxhc2hyb20gZGV2aWNlIGhlcmUgc2luY2Ugd2UgbWlnaHQKKwkgKiBkbyB0aGluZ3Mgd2l0aCBmbGFzaCBlYXJseSBvbiBpbiB0aGUgYm9vdAorCSAqLworCWZsYXNoX3Byb2JlKCk7CisjZW5kaWYKKwogCV9iZmluX3N3cnN0ID0gYmZpbl9yZWFkX1NXUlNUKCk7CiAKIAlpZiAoX2JmaW5fc3dyc3QgJiBSRVNFVF9ET1VCTEUpCkBAIC0zMzUsNyArNjc5LDcgQEAKIAllbHNlIGlmIChfYmZpbl9zd3JzdCAmIFJFU0VUX1NPRlRXQVJFKQogCQlwcmludGsoS0VSTl9OT1RJQ0UgIlJlc2V0IGNhdXNlZCBieSBTb2Z0d2FyZSByZXNldFxuIik7CiAKLQlwcmludGsoS0VSTl9JTkZPICJCbGFja2ZpbiBzdXBwb3J0IChDKSAyMDA0LTIwMDcgQW5hbG9nIERldmljZXMsIEluYy5cbiIpOworCXByaW50ayhLRVJOX0lORk8gIkJsYWNrZmluIHN1cHBvcnQgKEMpIDIwMDQtMjAwOCBBbmFsb2cgRGV2aWNlcywgSW5jLlxuIik7CiAJaWYgKGJmaW5fY29tcGlsZWRfcmV2aWQoKSA9PSAweGZmZmYpCiAJCXByaW50ayhLRVJOX0lORk8gIkNvbXBpbGVkIGZvciBBRFNQLSVzIFJldiBhbnlcbiIsIENQVSk7CiAJZWxzZSBpZiAoYmZpbl9jb21waWxlZF9yZXZpZCgpID09IC0xKQpAQCAtMzYxLDU1ICs3MDUsOCBAQAogCWlmIChBTk9NQUxZXzA1MDAwMjczICYmIChjY2xrID4+IDEpIDw9IHNjbGspCiAJCXByaW50aygiXG5cblxuQU5PTUFMWV8wNTAwMDI3MzogQ0NMSyBtdXN0IGJlID49IDIqU0NMSyAhISFcblxuXG4iKTsKIAotCXByaW50ayhLRVJOX0lORk8gIkJvYXJkIE1lbW9yeTogJWxkTUJcbiIsIHBoeXNpY2FsX21lbV9lbmQgPj4gMjApOwotCXByaW50ayhLRVJOX0lORk8gIktlcm5lbCBNYW5hZ2VkIE1lbW9yeTogJWxkTUJcbiIsIF9yYW1lbmQgPj4gMjApOworCXNldHVwX2Jvb3RtZW1fYWxsb2NhdG9yKCk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJNZW1vcnkgbWFwOlxuIgotCSAgICAgICBLRVJOX0lORk8gIiAgdGV4dCAgICAgID0gMHglcC0weCVwXG4iCi0JICAgICAgIEtFUk5fSU5GTyAiICByb2RhdGEgICAgPSAweCVwLTB4JXBcbiIKLQkgICAgICAgS0VSTl9JTkZPICIgIGRhdGEgICAgICA9IDB4JXAtMHglcFxuIgotCSAgICAgICBLRVJOX0lORk8gIiAgICBzdGFjayAgID0gMHglcC0weCVwXG4iCi0JICAgICAgIEtFUk5fSU5GTyAiICBpbml0ICAgICAgPSAweCVwLTB4JXBcbiIKLQkgICAgICAgS0VSTl9JTkZPICIgIGJzcyAgICAgICA9IDB4JXAtMHglcFxuIgotCSAgICAgICBLRVJOX0lORk8gIiAgYXZhaWxhYmxlID0gMHglcC0weCVwXG4iCi0jaWZkZWYgQ09ORklHX01URF9VQ0xJTlVYCi0JICAgICAgIEtFUk5fSU5GTyAiICByb290ZnMgICAgPSAweCVwLTB4JXBcbiIKLSNlbmRpZgotI2lmIERNQV9VTkNBQ0hFRF9SRUdJT04gPiAwCi0JICAgICAgIEtFUk5fSU5GTyAiICBETUEgWm9uZSAgPSAweCVwLTB4JXBcbiIKLSNlbmRpZgotCSAgICAgICAsIF9zdGV4dCwgX2V0ZXh0LAotCSAgICAgICBfX3N0YXJ0X3JvZGF0YSwgX19lbmRfcm9kYXRhLAotCSAgICAgICBfc2RhdGEsIF9lZGF0YSwKLQkgICAgICAgKHZvaWQgKikmaW5pdF90aHJlYWRfdW5pb24sICh2b2lkICopKChpbnQpKCZpbml0X3RocmVhZF91bmlvbikgKyAweDIwMDApLAotCSAgICAgICBfX2luaXRfYmVnaW4sIF9faW5pdF9lbmQsCi0JICAgICAgIF9fYnNzX3N0YXJ0LCBfX2Jzc19zdG9wLAotCSAgICAgICAodm9pZCAqKV9yYW1zdGFydCwgKHZvaWQgKiltZW1vcnlfZW5kCi0jaWZkZWYgQ09ORklHX01URF9VQ0xJTlVYCi0JICAgICAgICwgKHZvaWQgKiltZW1vcnlfbXRkX3N0YXJ0LCAodm9pZCAqKShtZW1vcnlfbXRkX3N0YXJ0ICsgbXRkX3NpemUpCi0jZW5kaWYKLSNpZiBETUFfVU5DQUNIRURfUkVHSU9OID4gMAotCSAgICAgICAsICh2b2lkICopKF9yYW1lbmQgLSBETUFfVU5DQUNIRURfUkVHSU9OKSwgKHZvaWQgKikoX3JhbWVuZCkKLSNlbmRpZgotCSAgICAgICApOwotCi0JLyoKLQkgKiBnaXZlIGFsbCB0aGUgbWVtb3J5IHRvIHRoZSBib290bWFwIGFsbG9jYXRvciwgIHRlbGwgaXQgdG8gcHV0IHRoZQotCSAqIGJvb3QgbWVtX21hcCBhdCB0aGUgc3RhcnQgb2YgbWVtb3J5Ci0JICovCi0JYm9vdG1hcF9zaXplID0gaW5pdF9ib290bWVtX25vZGUoTk9ERV9EQVRBKDApLCBtZW1vcnlfc3RhcnQgPj4gUEFHRV9TSElGVCwJLyogbWFwIGdvZXMgaGVyZSAqLwotCQkJCQkgUEFHRV9PRkZTRVQgPj4gUEFHRV9TSElGVCwKLQkJCQkJIG1lbW9yeV9lbmQgPj4gUEFHRV9TSElGVCk7Ci0JLyoKLQkgKiBmcmVlIHRoZSB1c2FibGUgbWVtb3J5LCAgd2UgaGF2ZSB0byBtYWtlIHN1cmUgd2UgZG8gbm90IGZyZWUKLQkgKiB0aGUgYm9vdG1lbSBiaXRtYXAgc28gd2UgdGhlbiByZXNlcnZlIGl0IGFmdGVyIGZyZWVpbmcgaXQgOi0pCi0JICovCi0JZnJlZV9ib290bWVtKG1lbW9yeV9zdGFydCwgbWVtb3J5X2VuZCAtIG1lbW9yeV9zdGFydCk7Ci0KLQlyZXNlcnZlX2Jvb3RtZW0obWVtb3J5X3N0YXJ0LCBib290bWFwX3NpemUpOwotCS8qCi0JICogZ2V0IGttYWxsb2MgaW50byBnZWFyCi0JICovCiAJcGFnaW5nX2luaXQoKTsKIAogCS8qIGNoZWNrIHRoZSBzaXplIG9mIHRoZSBsMSBhcmVhICovCkBAIC00NTAsMTUgKzc0NywxNSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCB0b3BvbG9neV9pbml0KHZvaWQpCiB7Ci0jaWYgZGVmaW5lZCAoQ09ORklHX0JGNTYxKQotCXN0YXRpYyBzdHJ1Y3QgY3B1IGNwdVsyXTsKLQlyZWdpc3Rlcl9jcHUoJmNwdVswXSwgMCk7Ci0JcmVnaXN0ZXJfY3B1KCZjcHVbMV0sIDEpOworCWludCBjcHU7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCXN0cnVjdCBjcHUgKmMgPSAmcGVyX2NwdShjcHVfZGV2aWNlcywgY3B1KTsKKworCQlyZWdpc3Rlcl9jcHUoYywgY3B1KTsKKwl9CisKIAlyZXR1cm4gMDsKLSNlbHNlCi0Jc3RhdGljIHN0cnVjdCBjcHUgY3B1WzFdOwotCXJldHVybiByZWdpc3Rlcl9jcHUoY3B1LCAwKTsKLSNlbmRpZgogfQogCiBzdWJzeXNfaW5pdGNhbGwodG9wb2xvZ3lfaW5pdCk7CkBAIC03MDAsNyArOTk3LDcgQEAKIHsKIH0KIAotc3RydWN0IHNlcV9vcGVyYXRpb25zIGNwdWluZm9fb3AgPSB7Citjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgY3B1aW5mb19vcCA9IHsKIAkuc3RhcnQgPSBjX3N0YXJ0LAogCS5uZXh0ID0gY19uZXh0LAogCS5zdG9wID0gY19zdG9wLApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3RyYXBzLmMKaW5kZXggNjZiNWYzZS4uNTg3MTdjYiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC90cmFwcy5jCkBAIC02NDksNyArNjQ5LDcgQEAKIAlpZiAoY29udGV4dCAmIDB4MDAyMCAmJiAoZnAtPnNlcXN0YXQgJiBTRVFTVEFUX0VYQ0FVU0UpID09IFZFQ19IV0VSUikKIAkJcHJpbnRrKEtFUk5fTk9USUNFICJIVyBFcnJvciBjb250ZXh0XG4iKTsKIAllbHNlIGlmIChjb250ZXh0ICYgMHgwMDIwKQotCQlwcmludGsoS0VSTl9OT1RJQ0UgIkRlZmVyZWQgRXhjZXB0aW9uIGNvbnRleHRcbiIpOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIkRlZmVycmVkIEV4Y2VwdGlvbiBjb250ZXh0XG4iKTsKIAllbHNlIGlmIChjb250ZXh0ICYgMHgzRkMwKQogCQlwcmludGsoS0VSTl9OT1RJQ0UgIkludGVycnVwdCBjb250ZXh0XG4iKTsKIAllbHNlIGlmIChjb250ZXh0ICYgMHg0MDAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggODU4NzIyNC4uYWVkODMyNSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC00MSw2ICs0MSw5IEBACiBTRUNUSU9OUwogewogCS4gPSBDT05GSUdfQk9PVF9MT0FEOworCS8qIE5laXRoZXIgdGhlIHRleHQsIHJvX2RhdGEgb3IgYnNzIHNlY3Rpb24gbmVlZCB0byBiZSBhbGlnbmVkCisJICogU28gcGFjayB0aGVtIGJhY2sgdG8gYmFjaworCSAqLwogCS50ZXh0IDoKIAl7CiAJCV9fdGV4dCA9IC47CkBAIC01OCwyMiArNjEsMjUgQEAKIAkJKihfX2V4X3RhYmxlKQogCQlfX19zdG9wX19fZXhfdGFibGUgPSAuOwogCi0JCS4gPSBBTElHTig0KTsKIAkJX19ldGV4dCA9IC47CiAJfQogCi0JUk9fREFUQShQQUdFX1NJWkUpCisJLyogSnVzdCBpbiBjYXNlIHRoZSBmaXJzdCByZWFkIG9ubHkgaXMgYSAzMi1iaXQgYWNjZXNzICovCisJUk9fREFUQSg0KQorCisJLmJzcyA6CisJeworCQkuID0gQUxJR04oNCk7CisJCV9fX2Jzc19zdGFydCA9IC47CisJCSooLmJzcyAuYnNzLiopCisJCSooQ09NTU9OKQorCQlfX19ic3Nfc3RvcCA9IC47CisJfQogCiAJLmRhdGEgOgogCXsKLQkJLyogbWFrZSBzdXJlIHRoZSBpbml0X3Rhc2sgaXMgYWxpZ25lZCB0byB0aGUKLQkJICoga2VybmVsIHRocmVhZCBzaXplIHNvIHdlIGNhbiBsb2NhdGUgdGhlIGtlcm5lbAotCQkgKiBzdGFjayBwcm9wZXJseSBhbmQgcXVpY2tseS4KLQkJICovCiAJCV9fc2RhdGEgPSAuOwotCQkuID0gQUxJR04oVEhSRUFEX1NJWkUpOwotCQkqKC5kYXRhLmluaXRfdGFzaykKLQorCQkvKiBUaGlzIGdldHMgZG9uZSBmaXJzdCwgc28gdGhlIGdsb2IgZG9lc24ndCBzdWNrIGl0IGluICovCiAJCS4gPSBBTElHTigzMik7CiAJCSooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpCiAKQEAgLTgxLDEwICs4NywyMiBAQAogCQkqKC5kYXRhLiopCiAJCUNPTlNUUlVDVE9SUwogCisJCS8qIG1ha2Ugc3VyZSB0aGUgaW5pdF90YXNrIGlzIGFsaWduZWQgdG8gdGhlCisJCSAqIGtlcm5lbCB0aHJlYWQgc2l6ZSBzbyB3ZSBjYW4gbG9jYXRlIHRoZSBrZXJuZWwKKwkJICogc3RhY2sgcHJvcGVybHkgYW5kIHF1aWNrbHkuCisJCSAqLwogCQkuID0gQUxJR04oVEhSRUFEX1NJWkUpOworCQkqKC5pbml0X3Rhc2suZGF0YSkKKwogCQlfX2VkYXRhID0gLjsKIAl9CiAKKwkvKiBUaGUgaW5pdCBzZWN0aW9uIHNob3VsZCBiZSBsYXN0LCBzbyB3aGVuIHdlIGZyZWUgaXQsIGl0IGdvZXMgaW50bworCSAqIHRoZSBnZW5lcmFsIG1lbW9yeSBwb29sLCBhbmQgKGhvcGVmdWxseSkgd2lsbCBkZWNyZWFzZSBmcmFnbWVudGF0aW9uCisJICogYSB0aW55IGJpdC4gVGhlIGluaXQgc2VjdGlvbiBoYXMgYSBfcmVxdWlyZW1lbnRfIHRoYXQgaXQgYmUKKwkgKiBQQUdFX1NJWkUgYWxpZ25lZAorCSAqLworCS4gPSBBTElHTihQQUdFX1NJWkUpOwogCV9fX2luaXRfYmVnaW4gPSAuOwogCiAJLmluaXQudGV4dCA6CkBAIC0xNzksMTYgKzE5Nyw3IEBACiAJLiA9IEFMSUdOKFBBR0VfU0laRSk7CiAJX19faW5pdF9lbmQgPSAuOwogCi0JLmJzcyA6Ci0JewotCQkuID0gQUxJR04oNCk7Ci0JCV9fX2Jzc19zdGFydCA9IC47Ci0JCSooLmJzcyAuYnNzLiopCi0JCSooQ09NTU9OKQotCQkuID0gQUxJR04oNCk7Ci0JCV9fX2Jzc19zdG9wID0gLjsKLQkJX19lbmQgPSAuOwotCX0KKwlfX2VuZCA9LjsKIAogCVNUQUJTX0RFQlVHCiAKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpraXQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUyNy9ib2FyZHMvZXpraXQuYwppbmRleCAxNzk1YWFiLi4zMzc1MTVmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MjcvYm9hcmRzL2V6a2l0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTI3L2JvYXJkcy9lemtpdC5jCkBAIC00MSw3ICs0MSw5IEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL3NsODExLmg+CisjaWYgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfSERSQykgfHwgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfSERSQ19NT0RVTEUpCiAjaW5jbHVkZSA8bGludXgvdXNiL211c2IuaD4KKyNlbmRpZgogI2luY2x1ZGUgPGFzbS9jcGxiLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9iZmluNXh4X3NwaS5oPgpAQCAtNTE3LDYgKzUxOSwxNCBAQAogCS5iaXRzX3Blcl93b3JkID0gMTYsCiB9OwogI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWKSB8fCBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlkZXZfY2hpcF9pbmZvID0geworCS5lbmFibGVfZG1hID0gMCwKKwkuYml0c19wZXJfd29yZCA9IDgsCit9OworI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gYmZpbl9zcGlfYm9hcmRfaW5mb1tdIF9faW5pdGRhdGEgPSB7CiAjaWYgZGVmaW5lZChDT05GSUdfTVREX00yNVA4MCkgXAogCXx8IGRlZmluZWQoQ09ORklHX01URF9NMjVQODBfTU9EVUxFKQpAQCAtNjM0LDYgKzY0NCwxNSBAQAogCQkubW9kZSA9IFNQSV9NT0RFXzAsCiAJfSwKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NQSV9TUElERVYpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9TUElERVZfTU9EVUxFKQorCXsKKwkJLm1vZGFsaWFzID0gInNwaWRldiIsCisJCS5tYXhfc3BlZWRfaHogPSAzMTI1MDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLworCQkuYnVzX251bSA9IDAsCisJCS5jaGlwX3NlbGVjdCA9IDEsCisJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpZGV2X2NoaXBfaW5mbywKKwl9LAorI2VuZGlmCiB9OwogCiAvKiBTUEkgY29udHJvbGxlciBkYXRhICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2V6a2l0LmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL2V6a2l0LmMKaW5kZXggNDAyNmMyZi4uMmIwOWFhMyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9lemtpdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvZXpraXQuYwpAQCAtMzQsNyArMzQsOSBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9mbGFzaC5oPgorI2lmIGRlZmluZWQoQ09ORklHX1VTQl9JU1AxMzYyX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX0lTUDEzNjJfSENEX01PRFVMRSkKICNpbmNsdWRlIDxsaW51eC91c2IvaXNwMTM2Mi5oPgorI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvYXRhX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgpAQCAtMTM0LDYgKzEzNiwxMyBAQAogfTsKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVikgfHwgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVl9NT0RVTEUpCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpZGV2X2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYSA9IDAsCisJLmJpdHNfcGVyX3dvcmQgPSA4LAorfTsKKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIGJmaW5fc3BpX2JvYXJkX2luZm9bXSBfX2luaXRkYXRhID0gewogI2lmIGRlZmluZWQoQ09ORklHX01URF9NMjVQODApIHx8IGRlZmluZWQoQ09ORklHX01URF9NMjVQODBfTU9EVUxFKQogCXsKQEAgLTE2OCw2ICsxNzcsMTUgQEAKIAkJLmNvbnRyb2xsZXJfZGF0YSA9ICZhZDE4MzZfc3BpX2NoaXBfaW5mbywKIAl9LAogI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVikgfHwgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVl9NT0RVTEUpCisJeworCQkubW9kYWxpYXMgPSAic3BpZGV2IiwKKwkJLm1heF9zcGVlZF9oeiA9IDMxMjUwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCisJCS5idXNfbnVtID0gMCwKKwkJLmNoaXBfc2VsZWN0ID0gMSwKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlkZXZfY2hpcF9pbmZvLAorCX0sCisjZW5kaWYKIH07CiAKIC8qIFNQSSAoMCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvc3RhbXAuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzMy9ib2FyZHMvc3RhbXAuYwppbmRleCAwMTg1MzUwLi5hNjQ1ZjZmIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzMvYm9hcmRzL3N0YW1wLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTMzL2JvYXJkcy9zdGFtcC5jCkBAIC0yMjYsNiArMjI2LDEzIEBACiB9OwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWKSB8fCBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlkZXZfY2hpcF9pbmZvID0geworCS5lbmFibGVfZG1hID0gMCwKKwkuYml0c19wZXJfd29yZCA9IDgsCit9OworI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gYmZpbl9zcGlfYm9hcmRfaW5mb1tdIF9faW5pdGRhdGEgPSB7CiAjaWYgZGVmaW5lZChDT05GSUdfTVREX00yNVA4MCkgfHwgZGVmaW5lZChDT05GSUdfTVREX00yNVA4MF9NT0RVTEUpCiAJewpAQCAtMzEyLDYgKzMxOSwxNSBAQAogCQkubW9kZSA9IFNQSV9NT0RFXzIsCiAJfSwKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NQSV9TUElERVYpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9TUElERVZfTU9EVUxFKQorCXsKKwkJLm1vZGFsaWFzID0gInNwaWRldiIsCisJCS5tYXhfc3BlZWRfaHogPSAzMTI1MDAwLCAgICAgLyogbWF4IHNwaSBjbG9jayAoU0NLKSBzcGVlZCBpbiBIWiAqLworCQkuYnVzX251bSA9IDAsCisJCS5jaGlwX3NlbGVjdCA9IDEsCisJCS5jb250cm9sbGVyX2RhdGEgPSAmc3BpZGV2X2NoaXBfaW5mbywKKwl9LAorI2VuZGlmCiB9OwogCiAvKiBTUEkgKDApICovCkBAIC00MjMsOSArNDM5LDkgQEAKICNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KIAogc3RhdGljIHN0cnVjdCBncGlvX2tleXNfYnV0dG9uIGJmaW5fZ3Bpb19rZXlzX3RhYmxlW10gPSB7Ci0Je0JUTl8wLCBHUElPX1BGNSwgMSwgImdwaW8ta2V5czogQlROMCJ9LAotCXtCVE5fMSwgR1BJT19QRjYsIDEsICJncGlvLWtleXM6IEJUTjEifSwKLQl7QlROXzIsIEdQSU9fUEY4LCAxLCAiZ3Bpby1rZXlzOiBCVE4yIn0sCisJe0JUTl8wLCBHUElPX1BGNSwgMCwgImdwaW8ta2V5czogQlROMCJ9LAorCXtCVE5fMSwgR1BJT19QRjYsIDAsICJncGlvLWtleXM6IEJUTjEifSwKKwl7QlROXzIsIEdQSU9fUEY4LCAwLCAiZ3Bpby1rZXlzOiBCVE4yIn0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGdwaW9fa2V5c19wbGF0Zm9ybV9kYXRhIGJmaW5fZ3Bpb19rZXlzX2RhdGEgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3N0YW1wLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1MzcvYm9hcmRzL3N0YW1wLmMKaW5kZXggMTE5ZTZlYS4uOWUyMjc3ZSAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTM3L2JvYXJkcy9zdGFtcC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjUzNy9ib2FyZHMvc3RhbXAuYwpAQCAtNDg3LDYgKzQ4NywxMyBAQAogfTsKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVikgfHwgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVl9NT0RVTEUpCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpZGV2X2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYSA9IDAsCisJLmJpdHNfcGVyX3dvcmQgPSA4LAorfTsKKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIGJmaW5fc3BpX2JvYXJkX2luZm9bXSBfX2luaXRkYXRhID0gewogI2lmIGRlZmluZWQoQ09ORklHX01URF9NMjVQODApIFwKIAl8fCBkZWZpbmVkKENPTkZJR19NVERfTTI1UDgwX01PRFVMRSkKQEAgLTU5Myw2ICs2MDAsMTUgQEAKIAkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfYWQ3ODc3X2NoaXBfaW5mbywKIAl9LAogI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVikgfHwgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVl9NT0RVTEUpCisJeworCQkubW9kYWxpYXMgPSAic3BpZGV2IiwKKwkJLm1heF9zcGVlZF9oeiA9IDMxMjUwMDAsICAgICAvKiBtYXggc3BpIGNsb2NrIChTQ0spIHNwZWVkIGluIEhaICovCisJCS5idXNfbnVtID0gMCwKKwkJLmNoaXBfc2VsZWN0ID0gMSwKKwkJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlkZXZfY2hpcF9pbmZvLAorCX0sCisjZW5kaWYKIH07CiAKIC8qIFNQSSBjb250cm9sbGVyIGRhdGEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvZXpraXQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9ib2FyZHMvZXpraXQuYwppbmRleCAxNDg2MGYwLi45MTZlOTYzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvYm9hcmRzL2V6a2l0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2JvYXJkcy9lemtpdC5jCkBAIC0zNyw3ICszNyw5IEBACiAjaW5jbHVkZSA8bGludXgvc3BpL2ZsYXNoLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaWYgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfSERSQykgfHwgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfSERSQ19NT0RVTEUpCiAjaW5jbHVkZSA8bGludXgvdXNiL211c2IuaD4KKyNlbmRpZgogI2luY2x1ZGUgPGFzbS9iZmluNXh4X3NwaS5oPgogI2luY2x1ZGUgPGFzbS9jcGxiLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgpAQCAtNDIwLDYgKzQyMiwxMyBAQAogfTsKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVikgfHwgZGVmaW5lZChDT05GSUdfU1BJX1NQSURFVl9NT0RVTEUpCitzdGF0aWMgc3RydWN0IGJmaW41eHhfc3BpX2NoaXAgc3BpZGV2X2NoaXBfaW5mbyA9IHsKKwkuZW5hYmxlX2RtYSA9IDAsCisJLmJpdHNfcGVyX3dvcmQgPSA4LAorfTsKKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIGJmNTR4X3NwaV9ib2FyZF9pbmZvW10gX19pbml0ZGF0YSA9IHsKICNpZiBkZWZpbmVkKENPTkZJR19NVERfTTI1UDgwKSBcCiAJfHwgZGVmaW5lZChDT05GSUdfTVREX00yNVA4MF9NT0RVTEUpCkBAIC00NDUsNiArNDU0LDE1IEBACiAJLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfYWQ3ODc3X2NoaXBfaW5mbywKIH0sCiAjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWKSB8fCBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWX01PRFVMRSkKKwl7CisJCS5tb2RhbGlhcyA9ICJzcGlkZXYiLAorCQkubWF4X3NwZWVkX2h6ID0gMzEyNTAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0gPSAwLAorCQkuY2hpcF9zZWxlY3QgPSAxLAorCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaWRldl9jaGlwX2luZm8sCisJfSwKKyNlbmRpZgogfTsKIAogLyogU1BJICgwKSAqLwpAQCAtNjMxLDcgKzY0OSw3IEBACiAJJmV6a2l0X2ZsYXNoX2RldmljZSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHN0YW1wX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGV6a2l0X2luaXQodm9pZCkKIHsKIAlwcmludGsoS0VSTl9JTkZPICIlcygpOiByZWdpc3RlcmluZyBkZXZpY2UgcmVzb3VyY2VzXG4iLCBfX0ZVTkNUSU9OX18pOwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGV6a2l0X2RldmljZXMsIEFSUkFZX1NJWkUoZXpraXRfZGV2aWNlcykpOwpAQCAtNjQ0LDQgKzY2Miw0IEBACiAJcmV0dXJuIDA7CiB9CiAKLWFyY2hfaW5pdGNhbGwoc3RhbXBfaW5pdCk7CithcmNoX2luaXRjYWxsKGV6a2l0X2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2RtYS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2RtYS5jCmluZGV4IDk1N2JmMTMuLjM3NDgwM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU0OC9kbWEuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NDgvZG1hLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogRmlsZTogICAgICAgICBhcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvZG1hLmMKKyAqIEZpbGU6ICAgICAgICAgYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTQ4L2RtYS5jCiAgKiBCYXNlZCBvbjoKICAqIEF1dGhvcjoKICAqCkBAIC03LDcgKzcsNyBAQAogICogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHNpbXBsZSBETUEgSW1wbGVtZW50YXRpb24gZm9yIEJsYWNrZmluCiAgKgogICogTW9kaWZpZWQ6Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDcgQW5hbG9nIERldmljZXMgSW5jLgorICogICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwNC0yMDA4IEFuYWxvZyBEZXZpY2VzIEluYy4KICAqCiAgKiBCdWdzOiAgICAgICAgIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLwogICoKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvZXpraXQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvZXpraXQuYwppbmRleCBlZDg2M2NlLi40M2MxYjA5IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2V6a2l0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9lemtpdC5jCkBAIC05Miw2ICs5Miw2OCBAQAogYXJjaF9pbml0Y2FsbChiZmluX2lzcDE3NjFfaW5pdCk7CiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1VTQl9JU1AxMzYyX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX0lTUDEzNjJfSENEX01PRFVMRSkKKyNpbmNsdWRlIDxsaW51eC91c2IvaXNwMTM2Mi5oPgorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGlzcDEzNjJfaGNkX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gMHgyYzA2MDAwMCwKKwkJLmVuZCA9IDB4MmMwNjAwMDAsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sIHsKKwkJLnN0YXJ0ID0gMHgyYzA2MDAwNCwKKwkJLmVuZCA9IDB4MmMwNjAwMDQsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sIHsKKwkJLnN0YXJ0ID0gSVJRX1BGOCwKKwkJLmVuZCA9IElSUV9QRjgsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGlzcDEzNjJfcGxhdGZvcm1fZGF0YSBpc3AxMzYyX3ByaXYgPSB7CisJLnNlbDE1S3JlcyA9IDEsCisJLmNsa25vdHN0b3AgPSAwLAorCS5vY19lbmFibGUgPSAwLAorCS5pbnRfYWN0X2hpZ2ggPSAwLAorCS5pbnRfZWRnZV90cmlnZ2VyZWQgPSAwLAorCS5yZW1vdGVfd2FrZXVwX2Nvbm5lY3RlZCA9IDAsCisJLm5vX3Bvd2VyX3N3aXRjaGluZyA9IDEsCisJLnBvd2VyX3N3aXRjaGluZ19tb2RlID0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlzcDEzNjJfaGNkX2RldmljZSA9IHsKKwkubmFtZSA9ICJpc3AxMzYyLWhjZCIsCisJLmlkID0gMCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZpc3AxMzYyX3ByaXYsCisJfSwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoaXNwMTM2Ml9oY2RfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBpc3AxMzYyX2hjZF9yZXNvdXJjZXMsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfTkVUMjI3MikgfHwgZGVmaW5lZChDT05GSUdfVVNCX05FVDIyNzJfTU9EVUxFKQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBuZXQyMjcyX2JmaW5fcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQgPSAweDJDMDAwMDAwLAorCQkuZW5kID0gMHgyQzAwMDAwMCArIDB4N0YsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sIHsKKwkJLnN0YXJ0ID0gSVJRX1BGMTAsCisJCS5lbmQgPSBJUlFfUEYxMCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEgfCBJT1JFU09VUkNFX0lSUV9MT1dMRVZFTCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbmV0MjI3Ml9iZmluX2RldmljZSA9IHsKKwkubmFtZSA9ICJuZXQyMjcyIiwKKwkuaWQgPSAtMSwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUobmV0MjI3Ml9iZmluX3Jlc291cmNlcyksCisJLnJlc291cmNlID0gbmV0MjI3Ml9iZmluX3Jlc291cmNlcywKK307CisjZW5kaWYKKwogLyoKICAqICBVU0ItTEFOIEV6RXh0ZW5kZXIgYm9hcmQKICAqICBEcml2ZXIgbmVlZHMgdG8ga25vdyBhZGRyZXNzLCBpcnEgYW5kIGZsYWcgcGluLgpAQCAtMjA0LDYgKzI2NiwxMyBAQAogCS5iaXRzX3Blcl93b3JkID0gMTYsCiB9OwogI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWKSB8fCBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWX01PRFVMRSkKK3N0YXRpYyBzdHJ1Y3QgYmZpbjV4eF9zcGlfY2hpcCBzcGlkZXZfY2hpcF9pbmZvID0geworCS5lbmFibGVfZG1hID0gMCwKKwkuYml0c19wZXJfd29yZCA9IDgsCit9OworI2VuZGlmCiAjZW5kaWYKIAogLyogU1BJICgwKSAqLwpAQCAtMjQ4LDYgKzMxNywxNSBAQAogCQkuY29udHJvbGxlcl9kYXRhID0gJmFkMTgzNl9zcGlfY2hpcF9pbmZvLAogCX0sCiAjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWKSB8fCBkZWZpbmVkKENPTkZJR19TUElfU1BJREVWX01PRFVMRSkKKwl7CisJCS5tb2RhbGlhcyA9ICJzcGlkZXYiLAorCQkubWF4X3NwZWVkX2h6ID0gMzEyNTAwMCwgICAgIC8qIG1heCBzcGkgY2xvY2sgKFNDSykgc3BlZWQgaW4gSFogKi8KKwkJLmJ1c19udW0gPSAwLAorCQkuY2hpcF9zZWxlY3QgPSAxLAorCQkuY29udHJvbGxlcl9kYXRhID0gJnNwaWRldl9jaGlwX2luZm8sCisJfSwKKyNlbmRpZgogfTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1BBVEFfUExBVEZPUk0pIHx8IGRlZmluZWQoQ09ORklHX1BBVEFfUExBVEZPUk1fTU9EVUxFKQpAQCAtMzQwLDYgKzQxOCwxMCBAQAogCSZheDg4MTgwX2RldmljZSwKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX05FVDIyNzIpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9ORVQyMjcyX01PRFVMRSkKKwkmbmV0MjI3Ml9iZmluX2RldmljZSwKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChDT05GSUdfU1BJX0JGSU4pIHx8IGRlZmluZWQoQ09ORklHX1NQSV9CRklOX01PRFVMRSkKIAkmYmZpbl9zcGkwX2RldmljZSwKICNlbmRpZgpAQCAtMzU5LDYgKzQ0MSwxMSBAQAogI2lmIGRlZmluZWQoQ09ORklHX0kyQ19HUElPKSB8fCBkZWZpbmVkKENPTkZJR19JMkNfR1BJT19NT0RVTEUpCiAJJmkyY19ncGlvX2RldmljZSwKICNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfVVNCX0lTUDEzNjJfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfSVNQMTM2Ml9IQ0RfTU9EVUxFKQorCSZpc3AxMzYyX2hjZF9kZXZpY2UsCisjZW5kaWYKKwogCSZlemtpdF9mbGFzaF9kZXZpY2UsCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL01ha2VmaWxlIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9NYWtlZmlsZQppbmRleCA4NjM2ZDQyLi4xNWUzM2NhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL01ha2VmaWxlCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vTWFrZWZpbGUKQEAgLTQsOCArNCw2IEBACiAKIG9iai15IDo9IFwKIAljYWNoZS5vIGNhY2hlaW5pdC5vIGVudHJ5Lm8gXAotCWludGVycnVwdC5vIGxvY2subyBpcnFwYW5pYy5vIGFyY2hfY2hlY2tzLm8KKwlpbnRlcnJ1cHQubyBsb2NrLm8gaXJxcGFuaWMubyBhcmNoX2NoZWNrcy5vIGludHMtcHJpb3JpdHkubwogCi1vYmotJChDT05GSUdfQkZJTl9TSU5HTEVfQ09SRSkgICArPSBpbnRzLXByaW9yaXR5LXNjLm8KLW9iai0kKENPTkZJR19CRklOX0RVQUxfQ09SRSkgICAgICs9IGludHMtcHJpb3JpdHktZGMubwogb2JqLSQoQ09ORklHX1BNKSAgICAgICAgICAgICAgICAgKz0gcG0ubyBkcG1jLm8KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vZHBtYy5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9kcG1jLlMKaW5kZXggYjgyYzA5NmUuLmI4MGRkZDggMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vZHBtYy5TCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vZHBtYy5TCkBAIC0xOTEsNiArMTkxLDkgQEAKIAljYWxsIF90ZXN0X3BsbF9sb2NrZWQ7CiAKIAlSMCA9IElXUl9FTkFCTEUoMCk7CisJUjEgPSBJV1JfRElTQUJMRV9BTEw7CisJUjIgPSBJV1JfRElTQUJMRV9BTEw7CisKIAljYWxsIF9zZXRfc2ljX2l3cjsKIAogCVAwLkggPSBoaShQTExfQ1RMKTsKQEAgLTIzNyw2ICsyNDAsMTAgQEAKIAogCUNMSSBSNDsKIAorCVIwID0gSVdSX0VOQUJMRSgwKTsKKwlSMSA9IElXUl9ESVNBQkxFX0FMTDsKKwlSMiA9IElXUl9ESVNBQkxFX0FMTDsKKwogCWNhbGwgX3NldF9zaWNfaXdyOwogCiAJY2FsbCBfc2V0X2RyYW1fc3JmczsKQEAgLTI2MSw2ICsyNjgsOSBAQAogCWNhbGwgX3Rlc3RfcGxsX2xvY2tlZDsKIAogCVIwID0gSVdSX0VOQUJMRSgwKTsKKwlSMSA9IElXUl9ESVNBQkxFX0FMTDsKKwlSMiA9IElXUl9ESVNBQkxFX0FMTDsKKwogCWNhbGwgX3NldF9zaWNfaXdyOwogCiAJUDAuSCA9IGhpKFBMTF9DVEwpOwpAQCAtMjg2LDcgKzI5NiwxMyBAQAogCUNMSSBSNDsKIAogCVAzID0gUjA7CisJUDQgPSBSMTsKKwlQNSA9IFIyOworCiAJUjAgPSBJV1JfRU5BQkxFKDApOworCVIxID0gSVdSX0RJU0FCTEVfQUxMOworCVIyID0gSVdSX0RJU0FCTEVfQUxMOworCiAJY2FsbCBfc2V0X3NpY19pd3I7CiAJY2FsbCBfc2V0X2RyYW1fc3JmczsJLyogU2V0IFNEUkFNIFNlbGYgUmVmcmVzaCAqLwogCkBAIC0zMjcsNiArMzQzLDggQEAKIAljYWxsIF90ZXN0X3BsbF9sb2NrZWQ7CiAKIAlSMCA9IFAzOworCVIxID0gUDQ7CisJUjMgPSBQNTsKIAljYWxsIF9zZXRfc2ljX2l3cjsJLyogU2V0IEF3YWtlIGZyb20gSURMRSAqLwogCiAJUDAuSCA9IGhpKFBMTF9DVEwpOwpAQCAtMzQwLDYgKzM1OCw5IEBACiAJY2FsbCBfdGVzdF9wbGxfbG9ja2VkOwogCiAJUjAgPSBJV1JfRU5BQkxFKDApOworCVIxID0gSVdSX0RJU0FCTEVfQUxMOworCVIyID0gSVdSX0RJU0FCTEVfQUxMOworCiAJY2FsbCBfc2V0X3NpY19pd3I7CS8qIFNldCBBd2FrZSBmcm9tIElETEUgUExMICovCiAKIAlQMC5IID0gaGkoVlJfQ1RMKTsKQEAgLTQxNywxNCArNDM4LDIzIEBACiAJUlRTOwogCiBFTlRSWShfc2V0X3NpY19pd3IpCi0jaWYgZGVmaW5lZChDT05GSUdfQkY1NHgpIHx8IGRlZmluZWQoQ09ORklHX0JGNTJ4KQorI2lmIGRlZmluZWQoQ09ORklHX0JGNTR4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUyeCkgIHx8IGRlZmluZWQoQ09ORklHX0JGNTYxKQogCVAwLkggPSBoaShTSUNfSVdSMCk7CiAJUDAuTCA9IGxvKFNJQ19JV1IwKTsKKwlQMS5IID0gaGkoU0lDX0lXUjEpOworCVAxLkwgPSBsbyhTSUNfSVdSMSk7CisJW1AxXSA9IFIxOworI2lmIGRlZmluZWQoQ09ORklHX0JGNTR4KQorCVAxLkggPSBoaShTSUNfSVdSMik7CisJUDEuTCA9IGxvKFNJQ19JV1IyKTsKKwlbUDFdID0gUjI7CisjZW5kaWYKICNlbHNlCiAJUDAuSCA9IGhpKFNJQ19JV1IpOwogCVAwLkwgPSBsbyhTSUNfSVdSKTsKICNlbmRpZgogCVtQMF0gPSBSMDsKKwogCVNTWU5DOwogCVJUUzsKIApkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9lbnRyeS5TIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9lbnRyeS5TCmluZGV4IGZkZDliZjQzLi4yY2JiN2EwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2VudHJ5LlMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9lbnRyeS5TCkBAIC0xMjEsNiArMTIxLDcgQEAKIAkoUjc6NixQNTo0KSA9IFtzcCsrXTsKIAlBU1RBVCA9IFtzcCsrXTsKIAlTQVZFX0FMTF9TWVMKKwlERUJVR19IV1RSQUNFX1NBVkUocDUsIHI3KQogI2lmZGVmIENPTkZJR19NUFUKIAlSMCA9IFNFUVNUQVQ7CiAJUjEgPSBTUDsKQEAgLTEzMiwxNCArMTMzLDEzIEBACiAjZWxzZQogCWNhbGwgX19jcGxiX2hkcjsKICNlbmRpZgotCURFQlVHX1NUQVJUX0hXVFJBQ0UocDUsIHI3KQorCURFQlVHX0hXVFJBQ0VfUkVTVE9SRShwNSwgcjcpCiAJUkVTVE9SRV9BTExfU1lTCiAJU1AgPSBFWF9TQ1JBVENIX1JFRzsKIAlydHg7CiBFTkRQUk9DKF9leF9pY3BsYl9taXNzKQogCiBFTlRSWShfZXhfc3lzY2FsbCkKLQlERUJVR19TVEFSVF9IV1RSQUNFKHA1LCByNykKIAkoUjc6NixQNTo0KSA9IFtzcCsrXTsKIAlBU1RBVCA9IFtzcCsrXTsKIAlyYWlzZSAxNTsJCS8qIGludm9rZWQgYnkgVFJBUCAjMCwgZm9yIHN5cyBjYWxsICovCkBAIC0xNzgsNyArMTc4LDYgQEAKIEVORFBST0MoX2V4X3NpbmdsZV9zdGVwKQogCiBFTlRSWShfYmZpbl9yZXR1cm5fZnJvbV9leGNlcHRpb24pCi0JREVCVUdfU1RBUlRfSFdUUkFDRShwNSwgcjcpCiAjaWYgQU5PTUFMWV8wNTAwMDI1NwogCVI3PUxDMDsKIAlMQzA9Ujc7CkBAIC0yMDAsMTAgKzE5OSw5IEBACiAJICogbmVlZCB0byBtYWtlIGEgQ1BMQiBleGNlcHRpb24gbG9vayBsaWtlIGEgbm9ybWFsIGV4Y2VwdGlvbgogCSAqLwogCi0JREVCVUdfU1RBUlRfSFdUUkFDRShwNSwgcjcpCiAJUkVTVE9SRV9BTExfU1lTCiAJWy0tc3BdID0gQVNUQVQ7Ci0JWy0tc3BdID0gKFI3OjYsIFA1OjQpOworCVstLXNwXSA9IChSNzo2LFA1OjQpOwogCiBFTlRSWShfZXhfcmVwbGFjZWFibGUpCiAJbm9wOwpAQCAtMjUzLDcgKzI1MSw2IEBACiAJUjYgPSBTRVFTVEFUOwogCVtQNV0gPSBSNjsKIAotCURFQlVHX1NUQVJUX0hXVFJBQ0UocDUsIHI3KQogCShSNzo2LFA1OjQpID0gW3NwKytdOwogCUFTVEFUID0gW3NwKytdOwogCVNQID0gRVhfU0NSQVRDSF9SRUc7CkBAIC0zODIsOCArMzc5LDcgQEAKIAlzcC5oID0gX2V4Y2VwdGlvbl9zdGFja190b3A7CiAJLyogVHJ5IHRvIGRlYWwgd2l0aCBzeXNjYWxscyBxdWlja2x5LiAgKi8KIAlbLS1zcF0gPSBBU1RBVDsKLQlbLS1zcF0gPSAoUjc6NiwgUDU6NCk7Ci0JREVCVUdfU1RPUF9IV1RSQUNFKHA1LCByNykKKwlbLS1zcF0gPSAoUjc6NixQNTo0KTsKIAlyNyA9IFNFUVNUQVQ7CQkvKiByZWFzb24gY29kZSBpcyBpbiBiaXQgNTowICovCiAJcjYubCA9IGxvKFNFUVNUQVRfRVhDQVVTRSk7CiAJcjYuaCA9IGhpKFNFUVNUQVRfRVhDQVVTRSk7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludHMtcHJpb3JpdHktZGMuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50cy1wcmlvcml0eS1kYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDE4ZDZiLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50cy1wcmlvcml0eS1kYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDg0ICswLDAgQEAKLS8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50cy1wcmlvcml0eS1kYy5jCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKLSAqCi0gKiBDcmVhdGVkOiAgICAgID8KLSAqIERlc2NyaXB0aW9uOiAgU2V0IHVwIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdGllcwotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICAxOTk2IFJvbWFuIFppcHBlbAotICogICAgICAgICAgICAgICAxOTk5IEQuIEplZmYgRGlvbm5lIDxqZWZmQHVjbGludXgub3JnPgotICogICAgICAgICAgICAgICAyMDAwLTIwMDEgTGluZW8sIEluYy4gRC4gSmVmZmYgRGlvbm5lIDxqZWZmQGxpbmVvLmNhPgotICogICAgICAgICAgICAgICAyMDAyIEFyY3R1cnVzIE5ldHdvcmtzIEluYy4gTWFUZWQgPG1hdGVkQHN5bXBhdGljby5jYT4KLSAqICAgICAgICAgICAgICAgMjAwMyBNZXRyb3dlcmtzL01vdG9yb2xhCi0gKiAgICAgICAgICAgICAgIDIwMDMgQmFzIFZlcm1ldWxlbiA8YmFzQGJ1eXdheXMubmw+Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDYgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaWZkZWYgQ09ORklHX0tHREIKLSNpbmNsdWRlIDxsaW51eC9rZ2RiLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxhc20vdHJhcHMuaD4KLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgotI2luY2x1ZGUgPGFzbS9pcnFfaGFuZGxlci5oPgotCi0vKgotICogTk9URVM6Ci0gKiAtIHdlIGhhdmUgc2VwYXJhdGVkIHRoZSBwaHlzaWNhbCBIYXJkd2FyZSBpbnRlcnJ1cHQgZnJvbSB0aGUKLSAqIGxldmVscyB0aGF0IHRoZSBMSU5VWCBrZXJuZWwgc2VlcyAoc2VlIHRoZSBkZXNjcmlwdGlvbiBpbiBpcnEuaCkKLSAqIC0KLSAqLwotCi0vKiBJbml0aWFsaXplIHRoaXMgdG8gYW4gYWN0dWFsIHZhbHVlIHRvIGZvcmNlIGl0IGludG8gdGhlIC5kYXRhCi0gKiBzZWN0aW9uIHNvIHRoYXQgd2Uga25vdyBpdCBpcyBwcm9wZXJseSBpbml0aWFsaXplZCBhdCBlbnRyeSBpbnRvCi0gKiB0aGUga2VybmVsIGJ1dCBiZWZvcmUgYnNzIGlzIGluaXRpYWxpemVkIHRvIHplcm8gKHdoaWNoIGlzIHdoZXJlCi0gKiBpdCB3b3VsZCBsaXZlIG90aGVyd2lzZSkuICBUaGUgMHgxZiBtYWdpYyByZXByZXNlbnRzIHRoZSBJUlFzIHdlCi0gKiBjYW5ub3QgYWN0dWFsbHkgbWFzayBvdXQgaW4gaGFyZHdhcmUuCi0gKi8KLXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzID0gMHgxZjsKLQotLyogVGhlIG51bWJlciBvZiBzcHVyaW91cyBpbnRlcnJ1cHRzICovCi1hdG9taWNfdCBudW1fc3B1cmlvdXM7Ci0KLXN0cnVjdCBpdmd4IHsKLQkvKiBpcnEgbnVtYmVyIGZvciByZXF1ZXN0X2lycSwgYXZhaWxhYmxlIGluIG1hY2gtYmY1NjEvaXJxLmggKi8KLQlpbnQgaXJxbm87Ci0JLyogY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIFNJQ0FfSVNSMCByZWdpc3RlciAqLwotCWludCBpc3JmbGFnMDsKLQkvKiBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgU0lDQV9JU1IxIHJlZ2lzdGVyICovCi0JaW50IGlzcmZsYWcxOwotfSBpdmdfdGFibGVbTlJfUEVSSV9JTlRTXTsKLQotc3RydWN0IGl2Z19zbGljZSB7Ci0JLyogcG9zaXRpb24gb2YgZmlyc3QgaXJxIGluIGl2Z190YWJsZSBmb3IgZ2l2ZW4gaXZnICovCi0Jc3RydWN0IGl2Z3ggKmlmaXJzdDsKLQlzdHJ1Y3QgaXZneCAqaXN0b3A7Ci19IGl2ZzdfMTNbSVZHMTMgLSBJVkc3ICsgMV07Ci0KLXN0YXRpYyB2b2lkIHNlYXJjaF9JQVIodm9pZCk7Ci0KLS8qCi0gKiBTZWFyY2ggU0lDX0lBUiBhbmQgZmlsbCB0YWJsZXMgd2l0aCB0aGUgaXJxdmFsdWVzCi0gKiBhbmQgdGhlaXIgcG9zaXRpb25zIGluIHRoZSBTSUNfSVNSIHJlZ2lzdGVyLgotICovCi1zdGF0aWMgdm9pZCBfX2luaXQgc2VhcmNoX0lBUih2b2lkKQotewotCXVuc2lnbmVkIGl2ZywgaXJxX3BvcyA9IDA7Ci0JZm9yIChpdmcgPSAwOyBpdmcgPD0gSVZHMTMgLSBJVkc3OyBpdmcrKykgewotCQlpbnQgaXJxbjsKLQotCQlpdmc3XzEzW2l2Z10uaXN0b3AgPSBpdmc3XzEzW2l2Z10uaWZpcnN0ID0gJml2Z190YWJsZVtpcnFfcG9zXTsKLQotCQlmb3IgKGlycW4gPSAwOyBpcnFuIDwgTlJfUEVSSV9JTlRTOyBpcnFuKyspIHsKLQkJCWludCBpYXJfc2hpZnQgPSAoaXJxbiAmIDcpICogNDsKLQkJCWlmIChpdmcgPT0KLQkJCSAgICAoMHhmICYKLQkJCSAgICAgYmZpbl9yZWFkMzIoKHVuc2lnbmVkIGxvbmcgKilTSUNBX0lBUjAgKwotCQkJCQkgKGlycW4gPj4gMykpID4+IGlhcl9zaGlmdCkpIHsKLQkJCQlpdmdfdGFibGVbaXJxX3Bvc10uaXJxbm8gPSBJVkc3ICsgaXJxbjsKLQkJCQlpdmdfdGFibGVbaXJxX3Bvc10uaXNyZmxhZzAgPQotCQkJCSAgICAoaXJxbiA8IDMyID8gKDEgPDwgaXJxbikgOiAwKTsKLQkJCQlpdmdfdGFibGVbaXJxX3Bvc10uaXNyZmxhZzEgPQotCQkJCSAgICAoaXJxbiA8IDMyID8gMCA6ICgxIDw8IChpcnFuIC0gMzIpKSk7Ci0JCQkJaXZnN18xM1tpdmddLmlzdG9wKys7Ci0JCQkJaXJxX3BvcysrOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKgotICogVGhpcyBpcyBmb3IgQkY1NjEgaW50ZXJuYWwgSVJRcwotICovCi0KLXN0YXRpYyB2b2lkIGFja19ub29wKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JLyogRHVtbXkgZnVuY3Rpb24uICAqLwotfQotCi1zdGF0aWMgdm9pZCBiZjU2MV9jb3JlX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaXJxX2ZsYWdzICY9IH4oMSA8PCBpcnEpOwotCWlmICghaXJxc19kaXNhYmxlZCgpKQotCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJmNTYxX2NvcmVfdW5tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWlycV9mbGFncyB8PSAxIDw8IGlycTsKLQkvKgotCSAqIElmIGludGVycnVwdHMgYXJlIGVuYWJsZWQsIElNQVNLIG11c3QgY29udGFpbiB0aGUgc2FtZSB2YWx1ZQotCSAqIGFzIGlycV9mbGFncy4gIE1ha2Ugc3VyZSB0aGF0IGludmFyaWFudCBob2xkcy4gIElmIGludGVycnVwdHMKLQkgKiBhcmUgY3VycmVudGx5IGRpc2FibGVkIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nOyBvbmUgb2YgdGhlCi0JICogY2FsbGVycyB3aWxsIHRha2UgY2FyZSBvZiBzZXR0aW5nIElNQVNLIHRvIHRoZSBwcm9wZXIgdmFsdWUKLQkgKiB3aGVuIHJlZW5hYmxpbmcgaW50ZXJydXB0cy4KLQkgKiBsb2NhbF9pcnFfZW5hYmxlIGp1c3QgZG9lcyAiU1RJIGlycV9mbGFncyIsIHNvIGl0J3MgZXhhY3RseQotCSAqIHdoYXQgd2UgbmVlZC4KLQkgKi8KLQlpZiAoIWlycXNfZGlzYWJsZWQoKSkKLQkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgYmY1NjFfaW50ZXJuYWxfbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bnNpZ25lZCBsb25nIGlycV9tYXNrOwotCWlmICgoaXJxIC0gKElSUV9DT1JFVE1SICsgMSkpIDwgMzIpIHsKLQkJaXJxX21hc2sgPSAoMSA8PCAoaXJxIC0gKElSUV9DT1JFVE1SICsgMSkpKTsKLQkJYmZpbl93cml0ZV9TSUNBX0lNQVNLMChiZmluX3JlYWRfU0lDQV9JTUFTSzAoKSAmIH5pcnFfbWFzayk7Ci0JfSBlbHNlIHsKLQkJaXJxX21hc2sgPSAoMSA8PCAoaXJxIC0gKElSUV9DT1JFVE1SICsgMSkgLSAzMikpOwotCQliZmluX3dyaXRlX1NJQ0FfSU1BU0sxKGJmaW5fcmVhZF9TSUNBX0lNQVNLMSgpICYgfmlycV9tYXNrKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJmNTYxX2ludGVybmFsX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bnNpZ25lZCBsb25nIGlycV9tYXNrOwotCi0JaWYgKChpcnEgLSAoSVJRX0NPUkVUTVIgKyAxKSkgPCAzMikgewotCQlpcnFfbWFzayA9ICgxIDw8IChpcnEgLSAoSVJRX0NPUkVUTVIgKyAxKSkpOwotCQliZmluX3dyaXRlX1NJQ0FfSU1BU0swKGJmaW5fcmVhZF9TSUNBX0lNQVNLMCgpIHwgaXJxX21hc2spOwotCX0gZWxzZSB7Ci0JCWlycV9tYXNrID0gKDEgPDwgKGlycSAtIChJUlFfQ09SRVRNUiArIDEpIC0gMzIpKTsKLQkJYmZpbl93cml0ZV9TSUNBX0lNQVNLMShiZmluX3JlYWRfU0lDQV9JTUFTSzEoKSB8IGlycV9tYXNrKTsKLQl9Ci0JU1NZTkMoKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBiZjU2MV9jb3JlX2lycWNoaXAgPSB7Ci0JLmFjayA9IGFja19ub29wLAotCS5tYXNrID0gYmY1NjFfY29yZV9tYXNrX2lycSwKLQkudW5tYXNrID0gYmY1NjFfY29yZV91bm1hc2tfaXJxLAotfTsKLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBiZjU2MV9pbnRlcm5hbF9pcnFjaGlwID0gewotCS5hY2sgPSBhY2tfbm9vcCwKLQkubWFzayA9IGJmNTYxX2ludGVybmFsX21hc2tfaXJxLAotCS51bm1hc2sgPSBiZjU2MV9pbnRlcm5hbF91bm1hc2tfaXJxLAotfTsKLQotc3RhdGljIHVuc2lnbmVkIHNob3J0IGdwaW9fZW5hYmxlZFtncGlvX2JhbmsoTUFYX0JMQUNLRklOX0dQSU9TKV07Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQgZ3Bpb19lZGdlX3RyaWdnZXJlZFtncGlvX2JhbmsoTUFYX0JMQUNLRklOX0dQSU9TKV07Ci0KLXN0YXRpYyB2b2lkIGJmNTYxX2dwaW9fYWNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXUxNiBncGlvbnIgPSBpcnEgLSBJUlFfUEYwOwotCi0JaWYgKGdwaW9fZWRnZV90cmlnZ2VyZWRbZ3Bpb19iYW5rKGdwaW9ucildICYgZ3Bpb19iaXQoZ3Bpb25yKSkgewotCQlzZXRfZ3Bpb19kYXRhKGdwaW9uciwgMCk7Ci0JCVNTWU5DKCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBiZjU2MV9ncGlvX21hc2tfYWNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXUxNiBncGlvbnIgPSBpcnEgLSBJUlFfUEYwOwotCi0JaWYgKGdwaW9fZWRnZV90cmlnZ2VyZWRbZ3Bpb19iYW5rKGdwaW9ucildICYgZ3Bpb19iaXQoZ3Bpb25yKSkgewotCQlzZXRfZ3Bpb19kYXRhKGdwaW9uciwgMCk7Ci0JCVNTWU5DKCk7Ci0JfQotCi0Jc2V0X2dwaW9fbWFza2EoZ3Bpb25yLCAwKTsKLQlTU1lOQygpOwotfQotCi1zdGF0aWMgdm9pZCBiZjU2MV9ncGlvX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0Jc2V0X2dwaW9fbWFza2EoaXJxIC0gSVJRX1BGMCwgMCk7Ci0JU1NZTkMoKTsKLX0KLQotc3RhdGljIHZvaWQgYmY1NjFfZ3Bpb191bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0Jc2V0X2dwaW9fbWFza2EoaXJxIC0gSVJRX1BGMCwgMSk7Ci0JU1NZTkMoKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBiZjU2MV9ncGlvX2lycV9zdGFydHVwKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdW5zaWduZWQgaW50IHJldDsKLQljaGFyIGJ1Zls4XTsKLQl1MTYgZ3Bpb25yID0gaXJxIC0gSVJRX1BGMDsKLQotCWlmICghKGdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJiBncGlvX2JpdChncGlvbnIpKSkgewotCQlzbnByaW50ZihidWYsIHNpemVvZiBidWYsICJJUlEgJWQiLCBpcnEpOwotCQlyZXQgPSBncGlvX3JlcXVlc3QoZ3Bpb25yLCBidWYpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQotCX0KLQotCWdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gfD0gZ3Bpb19iaXQoZ3Bpb25yKTsKLQliZjU2MV9ncGlvX3VubWFza19pcnEoaXJxKTsKLQotICByZXR1cm4gcmV0OwotCi19Ci0KLXN0YXRpYyB2b2lkIGJmNTYxX2dwaW9faXJxX3NodXRkb3duKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JYmY1NjFfZ3Bpb19tYXNrX2lycShpcnEpOwotCWdwaW9fZnJlZShpcnEgLSBJUlFfUEYwKTsKLQlncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGlycSAtIElSUV9QRjApXSAmPSB+Z3Bpb19iaXQoaXJxIC0gSVJRX1BGMCk7Ci19Ci0KLXN0YXRpYyBpbnQgYmY1NjFfZ3Bpb19pcnFfdHlwZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgdHlwZSkKLXsKLQotCXVuc2lnbmVkIGludCByZXQ7Ci0JY2hhciBidWZbOF07Ci0JdTE2IGdwaW9uciA9IGlycSAtIElSUV9QRjA7Ci0KLQotCQlpZiAodHlwZSA9PSBJUlFfVFlQRV9QUk9CRSkgewotCQkJLyogb25seSBwcm9iZSB1bmVuYWJsZWQgR1BJTyBpbnRlcnJ1cHQgbGluZXMgKi8KLQkJCWlmIChncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW9ucildICYgZ3Bpb19iaXQoZ3Bpb25yKSkKLQkJCQlyZXR1cm4gMDsKLQkJCXR5cGUgPSBJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORzsKLQotCQl9Ci0KLQkJaWYgKHR5cGUgJiAoSVJRX1RZUEVfRURHRV9SSVNJTkcgfCBJUlFfVFlQRV9FREdFX0ZBTExJTkcgfAotCQkJICAgIElSUV9UWVBFX0xFVkVMX0hJR0ggfCBJUlFfVFlQRV9MRVZFTF9MT1cpKSB7Ci0KLQkJaWYgKCEoZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhncGlvbnIpXSAmIGdwaW9fYml0KGdwaW9ucikpKSB7Ci0JCQlzbnByaW50ZihidWYsIHNpemVvZiBidWYsICJJUlEgJWQiLCBpcnEpOwotCQkJcmV0ID0gZ3Bpb19yZXF1ZXN0KGdwaW9uciwgYnVmKTsKLQkJCWlmIChyZXQpCi0JCQkJcmV0dXJuIHJldDsKLQotCQl9Ci0KLQkJCWdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gfD0gZ3Bpb19iaXQoZ3Bpb25yKTsKLQkJfSBlbHNlIHsKLQkJCWdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJj0gfmdwaW9fYml0KGdwaW9ucik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0KLQkJc2V0X2dwaW9fZGlyKGdwaW9uciwgMCk7Ci0JCXNldF9ncGlvX2luZW4oZ3Bpb25yLCAxKTsKLQotCi0JCWlmICh0eXBlICYgKElSUV9UWVBFX0VER0VfUklTSU5HIHwgSVJRX1RZUEVfRURHRV9GQUxMSU5HKSkgewotCQkJZ3Bpb19lZGdlX3RyaWdnZXJlZFtncGlvX2JhbmsoZ3Bpb25yKV0gfD0gZ3Bpb19iaXQoZ3Bpb25yKTsKLQkJCXNldF9ncGlvX2VkZ2UoZ3Bpb25yLCAxKTsKLQkJfSBlbHNlIHsKLQkJCXNldF9ncGlvX2VkZ2UoZ3Bpb25yLCAwKTsKLQkJCWdwaW9fZWRnZV90cmlnZ2VyZWRbZ3Bpb19iYW5rKGdwaW9ucildICY9IH5ncGlvX2JpdChncGlvbnIpOwotCQl9Ci0KLQkJaWYgKCh0eXBlICYgKElSUV9UWVBFX0VER0VfUklTSU5HIHwgSVJRX1RZUEVfRURHRV9GQUxMSU5HKSkKLQkJICAgID09IChJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORykpCi0JCQlzZXRfZ3Bpb19ib3RoKGdwaW9uciwgMSk7Ci0JCWVsc2UKLQkJCXNldF9ncGlvX2JvdGgoZ3Bpb25yLCAwKTsKLQotCQlpZiAoKHR5cGUgJiAoSVJRX1RZUEVfRURHRV9GQUxMSU5HIHwgSVJRX1RZUEVfTEVWRUxfTE9XKSkpCi0JCQlzZXRfZ3Bpb19wb2xhcihncGlvbnIsIDEpOwkvKiBsb3cgb3IgZmFsbGluZyBlZGdlIGRlbm90ZWQgYnkgb25lICovCi0JCWVsc2UKLQkJCXNldF9ncGlvX3BvbGFyKGdwaW9uciwgMCk7CS8qIGhpZ2ggb3IgcmlzaW5nIGVkZ2UgZGVub3RlZCBieSB6ZXJvICovCi0KLQlTU1lOQygpOwotCi0JaWYgKHR5cGUgJiAoSVJRX1RZUEVfRURHRV9SSVNJTkcgfCBJUlFfVFlQRV9FREdFX0ZBTExJTkcpKQotCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfZWRnZV9pcnEpOwotCWVsc2UKLQkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2xldmVsX2lycSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBiZjU2MV9ncGlvX2lycWNoaXAgPSB7Ci0JLmFjayA9IGJmNTYxX2dwaW9fYWNrX2lycSwKLQkubWFzayA9IGJmNTYxX2dwaW9fbWFza19pcnEsCi0JLm1hc2tfYWNrID0gYmY1NjFfZ3Bpb19tYXNrX2Fja19pcnEsCi0JLnVubWFzayA9IGJmNTYxX2dwaW9fdW5tYXNrX2lycSwKLQkuc2V0X3R5cGUgPSBiZjU2MV9ncGlvX2lycV90eXBlLAotCS5zdGFydHVwID0gYmY1NjFfZ3Bpb19pcnFfc3RhcnR1cCwKLQkuc2h1dGRvd24gPSBiZjU2MV9ncGlvX2lycV9zaHV0ZG93bgotfTsKLQotc3RhdGljIHZvaWQgYmY1NjFfZGVtdXhfZ3Bpb19pcnEodW5zaWduZWQgaW50IGludGFfaXJxLAotCQkJCSBzdHJ1Y3QgaXJxX2Rlc2MgKmludGJfZGVzYykKLXsKLQlpbnQgaXJxLCBmbGFnX2QsIG1hc2s7Ci0JdTE2IGdwaW87Ci0KLQlzd2l0Y2ggKGludGFfaXJxKSB7Ci0JY2FzZSBJUlFfUFJPRzBfSU5UQToKLQkJaXJxID0gSVJRX1BGMDsKLQkJYnJlYWs7Ci0JY2FzZSBJUlFfUFJPRzFfSU5UQToKLQkJaXJxID0gSVJRX1BGMTY7Ci0JCWJyZWFrOwotCWNhc2UgSVJRX1BST0cyX0lOVEE6Ci0JCWlycSA9IElSUV9QRjMyOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkdW1wX3N0YWNrKCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlncGlvID0gaXJxIC0gSVJRX1BGMDsKLQotCQlmbGFnX2QgPSBnZXRfZ3Bpb3BfZGF0YShncGlvKTsKLQkJbWFzayA9IGZsYWdfZCAmIChncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW8pXSAmCi0JCQkgICAgICBnZXRfZ3Bpb3BfbWFza2EoZ3BpbykpOwotCi0JCQlkbyB7Ci0JCQkJaWYgKG1hc2sgJiAxKSB7Ci0JCQkJCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOwotCQkJCQlkZXNjLT5oYW5kbGVfaXJxKGlycSwgZGVzYyk7Ci0JCQkJfQotCQkJCWlycSsrOwotCQkJCW1hc2sgPj49IDE7Ci0JCQl9IHdoaWxlIChtYXNrKTsKLQotCi19Ci0KLXZvaWQgX19pbml0IGluaXRfZXhjZXB0aW9uX3ZlY3RvcnModm9pZCkKLXsKLQlTU1lOQygpOwotCi0JLyogY2Fubm90IHByb2dyYW0gaW4gc29mdHdhcmU6Ci0JICogZXZ0MCAtIGVtdWxhdGlvbiAoanRhZykKLQkgKiBldnQxIC0gcmVzZXQKLQkgKi8KLQliZmluX3dyaXRlX0VWVDIoZXZ0X25taSk7Ci0JYmZpbl93cml0ZV9FVlQzKHRyYXApOwotCWJmaW5fd3JpdGVfRVZUNShldnRfaXZodyk7Ci0JYmZpbl93cml0ZV9FVlQ2KGV2dF90aW1lcik7Ci0JYmZpbl93cml0ZV9FVlQ3KGV2dF9ldnQ3KTsKLQliZmluX3dyaXRlX0VWVDgoZXZ0X2V2dDgpOwotCWJmaW5fd3JpdGVfRVZUOShldnRfZXZ0OSk7Ci0JYmZpbl93cml0ZV9FVlQxMChldnRfZXZ0MTApOwotCWJmaW5fd3JpdGVfRVZUMTEoZXZ0X2V2dDExKTsKLQliZmluX3dyaXRlX0VWVDEyKGV2dF9ldnQxMik7Ci0JYmZpbl93cml0ZV9FVlQxMyhldnRfZXZ0MTMpOwotCWJmaW5fd3JpdGVfRVZUMTQoZXZ0MTRfc29mdGlycSk7Ci0JYmZpbl93cml0ZV9FVlQxNShldnRfc3lzdGVtX2NhbGwpOwotCUNTWU5DKCk7Ci19Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZHVyaW5nIGtlcm5lbCBzdGFydHVwIHRvIGluaXRpYWxpemUKLSAqIHRoZSBCRmluIElSUSBoYW5kbGluZyByb3V0aW5lcy4KLSAqLwotaW50IF9faW5pdCBpbml0X2FyY2hfaXJxKHZvaWQpCi17Ci0JaW50IGlycTsKLQl1bnNpZ25lZCBsb25nIGlsYXQgPSAwOwotCS8qICBEaXNhYmxlIGFsbCB0aGUgcGVyaXBoZXJhbCBpbnRycyAgLSBwYWdlIDQtMjkgSFcgUmVmIG1hbnVhbCAqLwotCWJmaW5fd3JpdGVfU0lDQV9JTUFTSzAoU0lDX1VOTUFTS19BTEwpOwotCWJmaW5fd3JpdGVfU0lDQV9JTUFTSzEoU0lDX1VOTUFTS19BTEwpOwotCVNTWU5DKCk7Ci0KLQliZmluX3dyaXRlX1NJQ0FfSVdSMChJV1JfRU5BQkxFX0FMTCk7Ci0JYmZpbl93cml0ZV9TSUNBX0lXUjEoSVdSX0VOQUJMRV9BTEwpOwotCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQotCWluaXRfZXhjZXB0aW9uX2J1ZmYoKTsKLQotCWZvciAoaXJxID0gMDsgaXJxIDw9IFNZU19JUlFTOyBpcnErKykgewotCQlpZiAoaXJxIDw9IElSUV9DT1JFVE1SKQotCQkJc2V0X2lycV9jaGlwKGlycSwgJmJmNTYxX2NvcmVfaXJxY2hpcCk7Ci0JCWVsc2UKLQkJCXNldF9pcnFfY2hpcChpcnEsICZiZjU2MV9pbnRlcm5hbF9pcnFjaGlwKTsKLQotCQlpZiAoKGlycSAhPSBJUlFfUFJPRzBfSU5UQSkgJiYKLQkJICAgIChpcnEgIT0gSVJRX1BST0cxX0lOVEEpICYmCi0JCSAgICAoaXJxICE9IElSUV9QUk9HMl9JTlRBKSkKLQkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9zaW1wbGVfaXJxKTsKLQkJZWxzZQotCQkJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoaXJxLCBiZjU2MV9kZW11eF9ncGlvX2lycSk7Ci0JfQotCi0JZm9yIChpcnEgPSBJUlFfUEYwOyBpcnEgPD0gSVJRX1BGNDc7IGlycSsrKSB7Ci0JCXNldF9pcnFfY2hpcChpcnEsICZiZjU2MV9ncGlvX2lycWNoaXApOwotCQkvKiBpZiBjb25maWd1cmVkIGFzIGVkZ2UsIHRoZW4gd2lsbCBiZSBjaGFuZ2VkIHRvIGRvX2VkZ2VfSVJRICovCi0JCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOwotCX0KLQotCWJmaW5fd3JpdGVfSU1BU0soMCk7Ci0JQ1NZTkMoKTsKLQlpbGF0ID0gYmZpbl9yZWFkX0lMQVQoKTsKLQlDU1lOQygpOwotCWJmaW5fd3JpdGVfSUxBVChpbGF0KTsKLQlDU1lOQygpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiQ29uZmlndXJpbmcgQmxhY2tmaW4gUHJpb3JpdHkgRHJpdmVuIEludGVycnVwdHNcbiIpOwotCS8qIElNQVNLPXh4eCBpcyBlcXVpdmFsZW50IHRvIFNUSSB4eCBvciBpcnFfZmxhZ3M9eHgsCi0JICogbG9jYWxfaXJxX2VuYWJsZSgpCi0JICovCi0JcHJvZ3JhbV9JQVIoKTsKLQkvKiBUaGVyZWZvcmUgaXQncyBiZXR0ZXIgdG8gc2V0dXAgSUFScyBiZWZvcmUgaW50ZXJydXB0cyBlbmFibGVkICovCi0Jc2VhcmNoX0lBUigpOwotCi0JLyogRW5hYmxlIGludGVycnVwdHMgSVZHNy0xNSAqLwotCWlycV9mbGFncyA9IGlycV9mbGFncyB8IElNQVNLX0lWRzE1IHwKLQkgICAgSU1BU0tfSVZHMTQgfCBJTUFTS19JVkcxMyB8IElNQVNLX0lWRzEyIHwgSU1BU0tfSVZHMTEgfAotCSAgICBJTUFTS19JVkcxMCB8IElNQVNLX0lWRzkgfCBJTUFTS19JVkc4IHwgSU1BU0tfSVZHNyB8IElNQVNLX0lWR0hXOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfRE9fSVJRX0wxCi1fX2F0dHJpYnV0ZV9fKChsMV90ZXh0KSkKLSNlbmRpZgotdm9pZCBkb19pcnEoaW50IHZlYywgc3RydWN0IHB0X3JlZ3MgKmZwKQotewotCWlmICh2ZWMgPT0gRVZUX0lWVE1SX1ApIHsKLQkJdmVjID0gSVJRX0NPUkVUTVI7Ci0JfSBlbHNlIHsKLQkJc3RydWN0IGl2Z3ggKml2ZyA9IGl2ZzdfMTNbdmVjIC0gSVZHN10uaWZpcnN0OwotCQlzdHJ1Y3QgaXZneCAqaXZnX3N0b3AgPSBpdmc3XzEzW3ZlYyAtIElWRzddLmlzdG9wOwotCQl1bnNpZ25lZCBsb25nIHNpY19zdGF0dXMwLCBzaWNfc3RhdHVzMTsKLQotCQlTU1lOQygpOwotCQlzaWNfc3RhdHVzMCA9IGJmaW5fcmVhZF9TSUNBX0lNQVNLMCgpICYgYmZpbl9yZWFkX1NJQ0FfSVNSMCgpOwotCQlzaWNfc3RhdHVzMSA9IGJmaW5fcmVhZF9TSUNBX0lNQVNLMSgpICYgYmZpbl9yZWFkX1NJQ0FfSVNSMSgpOwotCi0JCWZvciAoOzsgaXZnKyspIHsKLQkJCWlmIChpdmcgPj0gaXZnX3N0b3ApIHsKLQkJCQlhdG9taWNfaW5jKCZudW1fc3B1cmlvdXMpOwotCQkJCXJldHVybjsKLQkJCX0gZWxzZSBpZiAoKHNpY19zdGF0dXMwICYgaXZnLT5pc3JmbGFnMCkgfHwKLQkJCQkgICAoc2ljX3N0YXR1czEgJiBpdmctPmlzcmZsYWcxKSkKLQkJCQlicmVhazsKLQkJfQotCQl2ZWMgPSBpdmctPmlycW5vOwotCX0KLQlhc21fZG9fSVJRKHZlYywgZnApOwotCi0jaWZkZWYgQ09ORklHX0tHREIKLQlrZ2RiX3Byb2Nlc3NfYnJlYWtwb2ludCgpOwotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludHMtcHJpb3JpdHktc2MuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50cy1wcmlvcml0eS1zYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWM0MmFjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50cy1wcmlvcml0eS1zYy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTc2ICswLDAgQEAKLS8qCi0gKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50cy1wcmlvcml0eS1zYy5jCi0gKiBCYXNlZCBvbjoKLSAqIEF1dGhvcjoKLSAqCi0gKiBDcmVhdGVkOiAgICAgID8KLSAqIERlc2NyaXB0aW9uOiAgU2V0IHVwIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdGllcwotICoKLSAqIE1vZGlmaWVkOgotICogICAgICAgICAgICAgICAxOTk2IFJvbWFuIFppcHBlbAotICogICAgICAgICAgICAgICAxOTk5IEQuIEplZmYgRGlvbm5lIDxqZWZmQHVjbGludXgub3JnPgotICogICAgICAgICAgICAgICAyMDAwLTIwMDEgTGluZW8sIEluYy4gRC4gSmVmZmYgRGlvbm5lIDxqZWZmQGxpbmVvLmNhPgotICogICAgICAgICAgICAgICAyMDAyIEFyY3R1cnVzIE5ldHdvcmtzIEluYy4gTWFUZWQgPG1hdGVkQHN5bXBhdGljby5jYT4KLSAqICAgICAgICAgICAgICAgMjAwMyBNZXRyb3dlcmtzL01vdG9yb2xhCi0gKiAgICAgICAgICAgICAgIDIwMDMgQmFzIFZlcm1ldWxlbiA8YmFzQGJ1eXdheXMubmw+Ci0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDcgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKLSAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaWZkZWYgQ09ORklHX0tHREIKLSNpbmNsdWRlIDxsaW51eC9rZ2RiLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxhc20vdHJhcHMuaD4KLSNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgotI2luY2x1ZGUgPGFzbS9pcnFfaGFuZGxlci5oPgotCi0jaWZkZWYgQkY1MzdfRkFNSUxZCi0jIGRlZmluZSBCRjUzN19HRU5FUklDX0VSUk9SX0lOVF9ERU1VWAotI2Vsc2UKLSMgdW5kZWYgQkY1MzdfR0VORVJJQ19FUlJPUl9JTlRfREVNVVgKLSNlbmRpZgotCi0vKgotICogTk9URVM6Ci0gKiAtIHdlIGhhdmUgc2VwYXJhdGVkIHRoZSBwaHlzaWNhbCBIYXJkd2FyZSBpbnRlcnJ1cHQgZnJvbSB0aGUKLSAqIGxldmVscyB0aGF0IHRoZSBMSU5VWCBrZXJuZWwgc2VlcyAoc2VlIHRoZSBkZXNjcmlwdGlvbiBpbiBpcnEuaCkKLSAqIC0KLSAqLwotCi0vKiBJbml0aWFsaXplIHRoaXMgdG8gYW4gYWN0dWFsIHZhbHVlIHRvIGZvcmNlIGl0IGludG8gdGhlIC5kYXRhCi0gKiBzZWN0aW9uIHNvIHRoYXQgd2Uga25vdyBpdCBpcyBwcm9wZXJseSBpbml0aWFsaXplZCBhdCBlbnRyeSBpbnRvCi0gKiB0aGUga2VybmVsIGJ1dCBiZWZvcmUgYnNzIGlzIGluaXRpYWxpemVkIHRvIHplcm8gKHdoaWNoIGlzIHdoZXJlCi0gKiBpdCB3b3VsZCBsaXZlIG90aGVyd2lzZSkuICBUaGUgMHgxZiBtYWdpYyByZXByZXNlbnRzIHRoZSBJUlFzIHdlCi0gKiBjYW5ub3QgYWN0dWFsbHkgbWFzayBvdXQgaW4gaGFyZHdhcmUuCi0gKi8KLXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzID0gMHgxZjsKLQotLyogVGhlIG51bWJlciBvZiBzcHVyaW91cyBpbnRlcnJ1cHRzICovCi1hdG9taWNfdCBudW1fc3B1cmlvdXM7Ci0KLXN0cnVjdCBpdmd4IHsKLQkvKiBpcnEgbnVtYmVyIGZvciByZXF1ZXN0X2lycSwgYXZhaWxhYmxlIGluIG1hY2gtYmY1MzMvaXJxLmggKi8KLQl1bnNpZ25lZCBpbnQgaXJxbm87Ci0JLyogY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIFNJQ19JU1IgcmVnaXN0ZXIgKi8KLQl1bnNpZ25lZCBpbnQgaXNyZmxhZzsKLX0gaXZnX3RhYmxlW05SX1BFUklfSU5UU107Ci0KLXN0cnVjdCBpdmdfc2xpY2UgewotCS8qIHBvc2l0aW9uIG9mIGZpcnN0IGlycSBpbiBpdmdfdGFibGUgZm9yIGdpdmVuIGl2ZyAqLwotCXN0cnVjdCBpdmd4ICppZmlyc3Q7Ci0Jc3RydWN0IGl2Z3ggKmlzdG9wOwotfSBpdmc3XzEzW0lWRzEzIC0gSVZHNyArIDFdOwotCi1zdGF0aWMgdm9pZCBzZWFyY2hfSUFSKHZvaWQpOwotCi0vKgotICogU2VhcmNoIFNJQ19JQVIgYW5kIGZpbGwgdGFibGVzIHdpdGggdGhlIGlycXZhbHVlcwotICogYW5kIHRoZWlyIHBvc2l0aW9ucyBpbiB0aGUgU0lDX0lTUiByZWdpc3Rlci4KLSAqLwotc3RhdGljIHZvaWQgX19pbml0IHNlYXJjaF9JQVIodm9pZCkKLXsKLQl1bnNpZ25lZCBpdmcsIGlycV9wb3MgPSAwOwotCWZvciAoaXZnID0gMDsgaXZnIDw9IElWRzEzIC0gSVZHNzsgaXZnKyspIHsKLQkJaW50IGlycW47Ci0KLQkJaXZnN18xM1tpdmddLmlzdG9wID0gaXZnN18xM1tpdmddLmlmaXJzdCA9ICZpdmdfdGFibGVbaXJxX3Bvc107Ci0KLQkJZm9yIChpcnFuID0gMDsgaXJxbiA8IE5SX1BFUklfSU5UUzsgaXJxbisrKSB7Ci0JCQlpbnQgaWFyX3NoaWZ0ID0gKGlycW4gJiA3KSAqIDQ7Ci0JCQkJaWYgKGl2ZyA9PQotCQkJICAgICgweGYgJgotI2lmbmRlZiBDT05GSUdfQkY1MngKLQkJCSAgICAgYmZpbl9yZWFkMzIoKHVuc2lnbmVkIGxvbmcgKilTSUNfSUFSMCArCi0JCQkJCSAoaXJxbiA+PiAzKSkgPj4gaWFyX3NoaWZ0KSkgewotI2Vsc2UKLQkJCSAgICAgYmZpbl9yZWFkMzIoKHVuc2lnbmVkIGxvbmcgKilTSUNfSUFSMCArCi0JCQkJCSAoKGlycW4lMzIpID4+IDMpICsgKChpcnFuIC8gMzIpICogMTYpKSA+PiBpYXJfc2hpZnQpKSB7Ci0jZW5kaWYKLQkJCQlpdmdfdGFibGVbaXJxX3Bvc10uaXJxbm8gPSBJVkc3ICsgaXJxbjsKLQkJCQlpdmdfdGFibGVbaXJxX3Bvc10uaXNyZmxhZyA9IDEgPDwgKGlycW4gJSAzMik7Ci0JCQkJaXZnN18xM1tpdmddLmlzdG9wKys7Ci0JCQkJaXJxX3BvcysrOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKgotICogVGhpcyBpcyBmb3IgQkY1MzMgaW50ZXJuYWwgSVJRcwotICovCi0KLXN0YXRpYyB2b2lkIGFja19ub29wKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JLyogRHVtbXkgZnVuY3Rpb24uICAqLwotfQotCi1zdGF0aWMgdm9pZCBiZmluX2NvcmVfbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlpcnFfZmxhZ3MgJj0gfigxIDw8IGlycSk7Ci0JaWYgKCFpcnFzX2Rpc2FibGVkKCkpCi0JCWxvY2FsX2lycV9lbmFibGUoKTsKLX0KLQotc3RhdGljIHZvaWQgYmZpbl9jb3JlX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlpcnFfZmxhZ3MgfD0gMSA8PCBpcnE7Ci0JLyoKLQkgKiBJZiBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkLCBJTUFTSyBtdXN0IGNvbnRhaW4gdGhlIHNhbWUgdmFsdWUKLQkgKiBhcyBpcnFfZmxhZ3MuICBNYWtlIHN1cmUgdGhhdCBpbnZhcmlhbnQgaG9sZHMuICBJZiBpbnRlcnJ1cHRzCi0JICogYXJlIGN1cnJlbnRseSBkaXNhYmxlZCB3ZSBuZWVkIG5vdCBkbyBhbnl0aGluZzsgb25lIG9mIHRoZQotCSAqIGNhbGxlcnMgd2lsbCB0YWtlIGNhcmUgb2Ygc2V0dGluZyBJTUFTSyB0byB0aGUgcHJvcGVyIHZhbHVlCi0JICogd2hlbiByZWVuYWJsaW5nIGludGVycnVwdHMuCi0JICogbG9jYWxfaXJxX2VuYWJsZSBqdXN0IGRvZXMgIlNUSSBpcnFfZmxhZ3MiLCBzbyBpdCdzIGV4YWN0bHkKLQkgKiB3aGF0IHdlIG5lZWQuCi0JICovCi0JaWYgKCFpcnFzX2Rpc2FibGVkKCkpCi0JCWxvY2FsX2lycV9lbmFibGUoKTsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGJmaW5faW50ZXJuYWxfbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLSNpZmRlZiBDT05GSUdfQkY1M3gKLQliZmluX3dyaXRlX1NJQ19JTUFTSyhiZmluX3JlYWRfU0lDX0lNQVNLKCkgJgotCQkJICAgICB+KDEgPDwgKGlycSAtIChJUlFfQ09SRVRNUiArIDEpKSkpOwotI2Vsc2UKLQl1bnNpZ25lZCBtYXNrX2JhbmssIG1hc2tfYml0OwotCW1hc2tfYmFuayA9IChpcnEgLSAoSVJRX0NPUkVUTVIgKyAxKSkgLyAzMjsKLQltYXNrX2JpdCA9IChpcnEgLSAoSVJRX0NPUkVUTVIgKyAxKSkgJSAzMjsKLQliZmluX3dyaXRlX1NJQ19JTUFTSyhtYXNrX2JhbmssIGJmaW5fcmVhZF9TSUNfSU1BU0sobWFza19iYW5rKSAmCi0JCQkgICAgIH4oMSA8PCBtYXNrX2JpdCkpOwotI2VuZGlmCi0JU1NZTkMoKTsKLX0KLQotc3RhdGljIHZvaWQgYmZpbl9pbnRlcm5hbF91bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0jaWZkZWYgQ09ORklHX0JGNTN4Ci0JYmZpbl93cml0ZV9TSUNfSU1BU0soYmZpbl9yZWFkX1NJQ19JTUFTSygpIHwKLQkJCSAgICAgKDEgPDwgKGlycSAtIChJUlFfQ09SRVRNUiArIDEpKSkpOwotI2Vsc2UKLQl1bnNpZ25lZCBtYXNrX2JhbmssIG1hc2tfYml0OwotCW1hc2tfYmFuayA9IChpcnEgLSAoSVJRX0NPUkVUTVIgKyAxKSkgLyAzMjsKLQltYXNrX2JpdCA9IChpcnEgLSAoSVJRX0NPUkVUTVIgKyAxKSkgJSAzMjsKLQliZmluX3dyaXRlX1NJQ19JTUFTSyhtYXNrX2JhbmssIGJmaW5fcmVhZF9TSUNfSU1BU0sobWFza19iYW5rKSB8Ci0JCQkgICAgICgxIDw8IG1hc2tfYml0KSk7Ci0jZW5kaWYKLQlTU1lOQygpOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIGJmaW5fY29yZV9pcnFjaGlwID0gewotCS5hY2sgPSBhY2tfbm9vcCwKLQkubWFzayA9IGJmaW5fY29yZV9tYXNrX2lycSwKLQkudW5tYXNrID0gYmZpbl9jb3JlX3VubWFza19pcnEsCi19OwotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIGJmaW5faW50ZXJuYWxfaXJxY2hpcCA9IHsKLQkuYWNrID0gYWNrX25vb3AsCi0JLm1hc2sgPSBiZmluX2ludGVybmFsX21hc2tfaXJxLAotCS51bm1hc2sgPSBiZmluX2ludGVybmFsX3VubWFza19pcnEsCi19OwotCi0jaWZkZWYgQkY1MzdfR0VORVJJQ19FUlJPUl9JTlRfREVNVVgKLXN0YXRpYyBpbnQgZXJyb3JfaW50X21hc2s7Ci0KLXN0YXRpYyB2b2lkIGJmaW5fZ2VuZXJpY19lcnJvcl9hY2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0KLX0KLQotc3RhdGljIHZvaWQgYmZpbl9nZW5lcmljX2Vycm9yX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZXJyb3JfaW50X21hc2sgJj0gfigxTCA8PCAoaXJxIC0gSVJRX1BQSV9FUlJPUikpOwotCi0JaWYgKCFlcnJvcl9pbnRfbWFzaykgewotCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCQliZmluX3dyaXRlX1NJQ19JTUFTSyhiZmluX3JlYWRfU0lDX0lNQVNLKCkgJgotCQkJCSAgICAgfigxIDw8Ci0JCQkJICAgICAgIChJUlFfR0VORVJJQ19FUlJPUiAtCi0JCQkJCShJUlFfQ09SRVRNUiArIDEpKSkpOwotCQlTU1lOQygpOwotCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBiZmluX2dlbmVyaWNfZXJyb3JfdW5tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JYmZpbl93cml0ZV9TSUNfSU1BU0soYmZpbl9yZWFkX1NJQ19JTUFTSygpIHwgMSA8PAotCQkJICAgICAoSVJRX0dFTkVSSUNfRVJST1IgLSAoSVJRX0NPUkVUTVIgKyAxKSkpOwotCVNTWU5DKCk7Ci0JbG9jYWxfaXJxX2VuYWJsZSgpOwotCi0JZXJyb3JfaW50X21hc2sgfD0gMUwgPDwgKGlycSAtIElSUV9QUElfRVJST1IpOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIGJmaW5fZ2VuZXJpY19lcnJvcl9pcnFjaGlwID0gewotCS5hY2sgPSBiZmluX2dlbmVyaWNfZXJyb3JfYWNrX2lycSwKLQkubWFzayA9IGJmaW5fZ2VuZXJpY19lcnJvcl9tYXNrX2lycSwKLQkudW5tYXNrID0gYmZpbl9nZW5lcmljX2Vycm9yX3VubWFza19pcnEsCi19OwotCi1zdGF0aWMgdm9pZCBiZmluX2RlbXV4X2Vycm9yX2lycSh1bnNpZ25lZCBpbnQgaW50X2Vycl9pcnEsCi0JCQkJIHN0cnVjdCBpcnFfZGVzYyAqaW50Yl9kZXNjKQotewotCWludCBpcnEgPSAwOwotCi0JU1NZTkMoKTsKLQotI2lmIChkZWZpbmVkKENPTkZJR19CRjUzNykgfHwgZGVmaW5lZChDT05GSUdfQkY1MzYpKQotCWlmIChiZmluX3JlYWRfRU1BQ19TWVNUQVQoKSAmIEVNQUNfRVJSX01BU0spCi0JCWlycSA9IElSUV9NQUNfRVJST1I7Ci0JZWxzZQotI2VuZGlmCi0JaWYgKGJmaW5fcmVhZF9TUE9SVDBfU1RBVCgpICYgU1BPUlRfRVJSX01BU0spCi0JCWlycSA9IElSUV9TUE9SVDBfRVJST1I7Ci0JZWxzZSBpZiAoYmZpbl9yZWFkX1NQT1JUMV9TVEFUKCkgJiBTUE9SVF9FUlJfTUFTSykKLQkJaXJxID0gSVJRX1NQT1JUMV9FUlJPUjsKLQllbHNlIGlmIChiZmluX3JlYWRfUFBJX1NUQVRVUygpICYgUFBJX0VSUl9NQVNLKQotCQlpcnEgPSBJUlFfUFBJX0VSUk9SOwotCWVsc2UgaWYgKGJmaW5fcmVhZF9DQU5fR0lGKCkgJiBDQU5fRVJSX01BU0spCi0JCWlycSA9IElSUV9DQU5fRVJST1I7Ci0JZWxzZSBpZiAoYmZpbl9yZWFkX1NQSV9TVEFUKCkgJiBTUElfRVJSX01BU0spCi0JCWlycSA9IElSUV9TUElfRVJST1I7Ci0JZWxzZSBpZiAoKGJmaW5fcmVhZF9VQVJUMF9JSVIoKSAmIFVBUlRfRVJSX01BU0tfU1RBVDEpICYmCi0JCSAoYmZpbl9yZWFkX1VBUlQwX0lJUigpICYgVUFSVF9FUlJfTUFTS19TVEFUMCkpCi0JCWlycSA9IElSUV9VQVJUMF9FUlJPUjsKLQllbHNlIGlmICgoYmZpbl9yZWFkX1VBUlQxX0lJUigpICYgVUFSVF9FUlJfTUFTS19TVEFUMSkgJiYKLQkJIChiZmluX3JlYWRfVUFSVDFfSUlSKCkgJiBVQVJUX0VSUl9NQVNLX1NUQVQwKSkKLQkJaXJxID0gSVJRX1VBUlQxX0VSUk9SOwotCi0JaWYgKGlycSkgewotCQlpZiAoZXJyb3JfaW50X21hc2sgJiAoMUwgPDwgKGlycSAtIElSUV9QUElfRVJST1IpKSkgewotCQkJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7Ci0JCQlkZXNjLT5oYW5kbGVfaXJxKGlycSwgZGVzYyk7Ci0JCX0gZWxzZSB7Ci0KLQkJCXN3aXRjaCAoaXJxKSB7Ci0JCQljYXNlIElSUV9QUElfRVJST1I6Ci0JCQkJYmZpbl93cml0ZV9QUElfU1RBVFVTKFBQSV9FUlJfTUFTSyk7Ci0JCQkJYnJlYWs7Ci0jaWYgKGRlZmluZWQoQ09ORklHX0JGNTM3KSB8fCBkZWZpbmVkKENPTkZJR19CRjUzNikpCi0JCQljYXNlIElSUV9NQUNfRVJST1I6Ci0JCQkJYmZpbl93cml0ZV9FTUFDX1NZU1RBVChFTUFDX0VSUl9NQVNLKTsKLQkJCQlicmVhazsKLSNlbmRpZgotCQkJY2FzZSBJUlFfU1BPUlQwX0VSUk9SOgotCQkJCWJmaW5fd3JpdGVfU1BPUlQwX1NUQVQoU1BPUlRfRVJSX01BU0spOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIElSUV9TUE9SVDFfRVJST1I6Ci0JCQkJYmZpbl93cml0ZV9TUE9SVDFfU1RBVChTUE9SVF9FUlJfTUFTSyk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgSVJRX0NBTl9FUlJPUjoKLQkJCQliZmluX3dyaXRlX0NBTl9HSVMoQ0FOX0VSUl9NQVNLKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBJUlFfU1BJX0VSUk9SOgotCQkJCWJmaW5fd3JpdGVfU1BJX1NUQVQoU1BJX0VSUl9NQVNLKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJcHJfZGVidWcoIklSUSAlZDoiCi0JCQkJICIgTUFTS0VEIFBFUklQSEVSQUwgRVJST1IgSU5URVJSVVBUIEFTU0VSVEVEXG4iLAotCQkJCSBpcnEpOwotCQl9Ci0JfSBlbHNlCi0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgIiVzIDogJXMgOiBMSU5FICVkIDpcbklSUSA/OiBQRVJJUEhFUkFMIEVSUk9SIgotCQkgICAgICAgIiBJTlRFUlJVUFQgQVNTRVJURUQgQlVUIE5PIFNPVVJDRSBGT1VORFxuIiwKLQkJICAgICAgIF9fRlVOQ1RJT05fXywgX19GSUxFX18sIF9fTElORV9fKTsKLQotfQotI2VuZGlmCQkJCS8qIEJGNTM3X0dFTkVSSUNfRVJST1JfSU5UX0RFTVVYICovCi0KLSNpZiAhZGVmaW5lZChDT05GSUdfQkY1NHgpCi0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldOwotc3RhdGljIHVuc2lnbmVkIHNob3J0IGdwaW9fZWRnZV90cmlnZ2VyZWRbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldOwotCi0KLXN0YXRpYyB2b2lkIGJmaW5fZ3Bpb19hY2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdTE2IGdwaW9uciA9IGlycSAtIElSUV9QRjA7Ci0KLQlpZiAoZ3Bpb19lZGdlX3RyaWdnZXJlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJiBncGlvX2JpdChncGlvbnIpKSB7Ci0JCXNldF9ncGlvX2RhdGEoZ3Bpb25yLCAwKTsKLQkJU1NZTkMoKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJmaW5fZ3Bpb19tYXNrX2Fja19pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQl1MTYgZ3Bpb25yID0gaXJxIC0gSVJRX1BGMDsKLQotCWlmIChncGlvX2VkZ2VfdHJpZ2dlcmVkW2dwaW9fYmFuayhncGlvbnIpXSAmIGdwaW9fYml0KGdwaW9ucikpIHsKLQkJc2V0X2dwaW9fZGF0YShncGlvbnIsIDApOwotCQlTU1lOQygpOwotCX0KLQotCXNldF9ncGlvX21hc2thKGdwaW9uciwgMCk7Ci0JU1NZTkMoKTsKLX0KLQotc3RhdGljIHZvaWQgYmZpbl9ncGlvX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0Jc2V0X2dwaW9fbWFza2EoaXJxIC0gSVJRX1BGMCwgMCk7Ci0JU1NZTkMoKTsKLX0KLQotc3RhdGljIHZvaWQgYmZpbl9ncGlvX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlzZXRfZ3Bpb19tYXNrYShpcnEgLSBJUlFfUEYwLCAxKTsKLQlTU1lOQygpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGJmaW5fZ3Bpb19pcnFfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVuc2lnbmVkIGludCByZXQ7Ci0JdTE2IGdwaW9uciA9IGlycSAtIElSUV9QRjA7Ci0JY2hhciBidWZbOF07Ci0KLQlpZiAoIShncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW9ucildICYgZ3Bpb19iaXQoZ3Bpb25yKSkpIHsKLQkJc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiSVJRICVkIiwgaXJxKTsKLQkJcmV0ID0gZ3Bpb19yZXF1ZXN0KGdwaW9uciwgYnVmKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhncGlvbnIpXSB8PSBncGlvX2JpdChncGlvbnIpOwotCWJmaW5fZ3Bpb191bm1hc2tfaXJxKGlycSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBiZmluX2dwaW9faXJxX3NodXRkb3duKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JYmZpbl9ncGlvX21hc2tfaXJxKGlycSk7Ci0JZ3Bpb19mcmVlKGlycSAtIElSUV9QRjApOwotCWdwaW9fZW5hYmxlZFtncGlvX2JhbmsoaXJxIC0gSVJRX1BGMCldICY9IH5ncGlvX2JpdChpcnEgLSBJUlFfUEYwKTsKLX0KLQotc3RhdGljIGludCBiZmluX2dwaW9faXJxX3R5cGUodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHR5cGUpCi17Ci0KLQl1bnNpZ25lZCBpbnQgcmV0OwotCWNoYXIgYnVmWzhdOwotCXUxNiBncGlvbnIgPSBpcnEgLSBJUlFfUEYwOwotCi0JaWYgKHR5cGUgPT0gSVJRX1RZUEVfUFJPQkUpIHsKLQkJLyogb25seSBwcm9iZSB1bmVuYWJsZWQgR1BJTyBpbnRlcnJ1cHQgbGluZXMgKi8KLQkJaWYgKGdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJiBncGlvX2JpdChncGlvbnIpKQotCQkJcmV0dXJuIDA7Ci0JCXR5cGUgPSBJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORzsKLQl9Ci0KLQlpZiAodHlwZSAmIChJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORyB8Ci0JCSAgICBJUlFfVFlQRV9MRVZFTF9ISUdIIHwgSVJRX1RZUEVfTEVWRUxfTE9XKSkgewotCQlpZiAoIShncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW9ucildICYgZ3Bpb19iaXQoZ3Bpb25yKSkpIHsKLQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIklSUSAlZCIsIGlycSk7Ci0JCQlyZXQgPSBncGlvX3JlcXVlc3QoZ3Bpb25yLCBidWYpOwotCQkJaWYgKHJldCkKLQkJCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhncGlvbnIpXSB8PSBncGlvX2JpdChncGlvbnIpOwotCX0gZWxzZSB7Ci0JCWdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJj0gfmdwaW9fYml0KGdwaW9ucik7Ci0JCXJldHVybiAwOwotCX0KLQotCXNldF9ncGlvX2RpcihncGlvbnIsIDApOwotCXNldF9ncGlvX2luZW4oZ3Bpb25yLCAxKTsKLQotCWlmICh0eXBlICYgKElSUV9UWVBFX0VER0VfUklTSU5HIHwgSVJRX1RZUEVfRURHRV9GQUxMSU5HKSkgewotCQlncGlvX2VkZ2VfdHJpZ2dlcmVkW2dwaW9fYmFuayhncGlvbnIpXSB8PSBncGlvX2JpdChncGlvbnIpOwotCQlzZXRfZ3Bpb19lZGdlKGdwaW9uciwgMSk7Ci0JfSBlbHNlIHsKLQkJc2V0X2dwaW9fZWRnZShncGlvbnIsIDApOwotCQlncGlvX2VkZ2VfdHJpZ2dlcmVkW2dwaW9fYmFuayhncGlvbnIpXSAmPSB+Z3Bpb19iaXQoZ3Bpb25yKTsKLQl9Ci0KLQlpZiAoKHR5cGUgJiAoSVJRX1RZUEVfRURHRV9SSVNJTkcgfCBJUlFfVFlQRV9FREdFX0ZBTExJTkcpKQotCSAgICA9PSAoSVJRX1RZUEVfRURHRV9SSVNJTkcgfCBJUlFfVFlQRV9FREdFX0ZBTExJTkcpKQotCQlzZXRfZ3Bpb19ib3RoKGdwaW9uciwgMSk7Ci0JZWxzZQotCQlzZXRfZ3Bpb19ib3RoKGdwaW9uciwgMCk7Ci0KLQlpZiAoKHR5cGUgJiAoSVJRX1RZUEVfRURHRV9GQUxMSU5HIHwgSVJRX1RZUEVfTEVWRUxfTE9XKSkpCi0JCXNldF9ncGlvX3BvbGFyKGdwaW9uciwgMSk7CS8qIGxvdyBvciBmYWxsaW5nIGVkZ2UgZGVub3RlZCBieSBvbmUgKi8KLQllbHNlCi0JCXNldF9ncGlvX3BvbGFyKGdwaW9uciwgMCk7CS8qIGhpZ2ggb3IgcmlzaW5nIGVkZ2UgZGVub3RlZCBieSB6ZXJvICovCi0KLQlTU1lOQygpOwotCi0JaWYgKHR5cGUgJiAoSVJRX1RZUEVfRURHRV9SSVNJTkcgfCBJUlFfVFlQRV9FREdFX0ZBTExJTkcpKQotCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfZWRnZV9pcnEpOwotCWVsc2UKLQkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2xldmVsX2lycSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBiZmluX2dwaW9faXJxY2hpcCA9IHsKLQkuYWNrID0gYmZpbl9ncGlvX2Fja19pcnEsCi0JLm1hc2sgPSBiZmluX2dwaW9fbWFza19pcnEsCi0JLm1hc2tfYWNrID0gYmZpbl9ncGlvX21hc2tfYWNrX2lycSwKLQkudW5tYXNrID0gYmZpbl9ncGlvX3VubWFza19pcnEsCi0JLnNldF90eXBlID0gYmZpbl9ncGlvX2lycV90eXBlLAotCS5zdGFydHVwID0gYmZpbl9ncGlvX2lycV9zdGFydHVwLAotCS5zaHV0ZG93biA9IGJmaW5fZ3Bpb19pcnFfc2h1dGRvd24KLX07Ci0KLXN0YXRpYyB2b2lkIGJmaW5fZGVtdXhfZ3Bpb19pcnEodW5zaWduZWQgaW50IGludGJfaXJxLAotCQkJCXN0cnVjdCBpcnFfZGVzYyAqaW50Yl9kZXNjKQotewotCXUxNiBpOwotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfQkxBQ0tGSU5fR1BJT1M7IGkgKz0gMTYpIHsKLQkJaW50IGlycSA9IElSUV9QRjAgKyBpOwotCQlpbnQgZmxhZ19kID0gZ2V0X2dwaW9wX2RhdGEoaSk7Ci0JCWludCBtYXNrID0KLQkJICAgIGZsYWdfZCAmIChncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGkpXSAmIGdldF9ncGlvcF9tYXNrYShpKSk7Ci0KLQkJd2hpbGUgKG1hc2spIHsKLQkJCWlmIChtYXNrICYgMSkgewotCQkJCWRlc2MgPSBpcnFfZGVzYyArIGlycTsKLQkJCQlkZXNjLT5oYW5kbGVfaXJxKGlycSwgZGVzYyk7Ci0JCQl9Ci0JCQlpcnErKzsKLQkJCW1hc2sgPj49IDE7Ci0JCX0KLQl9Ci19Ci0KLSNlbHNlCQkJCS8qIENPTkZJR19CRjU0eCAqLwotCi0jZGVmaW5lIE5SX1BJTlRfU1lTX0lSUVMJNAotI2RlZmluZSBOUl9QSU5UX0JJVFMJCTMyCi0jZGVmaW5lIE5SX1BJTlRTCQkxNjAKLSNkZWZpbmUgSVJRX05PVF9BVkFJTAkJMHhGRgotCi0jZGVmaW5lIFBJTlRfMl9CQU5LKHgpCQkoKHgpID4+IDUpCi0jZGVmaW5lIFBJTlRfMl9CSVQoeCkJCSgoeCkgJiAweDFGKQotI2RlZmluZSBQSU5UX0JJVCh4KQkJKDEgPDwgKFBJTlRfMl9CSVQoeCkpKQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBpcnEycGludF9sdXRbTlJfUElOVFNdOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgcGludDJpcnFfbHV0W05SX1BJTlRfU1lTX0lSUVMgKiBOUl9QSU5UX0JJVFNdOwotCi1zdGF0aWMgdW5zaWduZWQgaW50IGdwaW9fYm90aF9lZGdlX3RyaWdnZXJlZFtOUl9QSU5UX1NZU19JUlFTXTsKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldOwotCi0KLXN0cnVjdCBwaW5faW50X3QgewotCXVuc2lnbmVkIGludCBtYXNrX3NldDsKLQl1bnNpZ25lZCBpbnQgbWFza19jbGVhcjsKLQl1bnNpZ25lZCBpbnQgcmVxdWVzdDsKLQl1bnNpZ25lZCBpbnQgYXNzaWduOwotCXVuc2lnbmVkIGludCBlZGdlX3NldDsKLQl1bnNpZ25lZCBpbnQgZWRnZV9jbGVhcjsKLQl1bnNpZ25lZCBpbnQgaW52ZXJ0X3NldDsKLQl1bnNpZ25lZCBpbnQgaW52ZXJ0X2NsZWFyOwotCXVuc2lnbmVkIGludCBwaW5zdGF0ZTsKLQl1bnNpZ25lZCBpbnQgbGF0Y2g7Ci19OwotCi1zdGF0aWMgc3RydWN0IHBpbl9pbnRfdCAqcGludFtOUl9QSU5UX1NZU19JUlFTXSA9IHsKLQkoc3RydWN0IHBpbl9pbnRfdCAqKVBJTlQwX01BU0tfU0VULAotCShzdHJ1Y3QgcGluX2ludF90ICopUElOVDFfTUFTS19TRVQsCi0JKHN0cnVjdCBwaW5faW50X3QgKilQSU5UMl9NQVNLX1NFVCwKLQkoc3RydWN0IHBpbl9pbnRfdCAqKVBJTlQzX01BU0tfU0VULAotfTsKLQotdW5zaWduZWQgc2hvcnQgZ2V0X2lycV9iYXNlKHU4IGJhbmssIHU4IGJtYXApCi17Ci0KLQl1MTYgaXJxX2Jhc2U7Ci0KLQlpZiAoYmFuayA8IDIpIHsJCS8qUEEtUEIgKi8KLQkJaXJxX2Jhc2UgPSBJUlFfUEEwICsgYm1hcCAqIDE2OwotCX0gZWxzZSB7CQkvKlBDLVBKICovCi0JCWlycV9iYXNlID0gSVJRX1BDMCArIGJtYXAgKiAxNjsKLQl9Ci0KLQlyZXR1cm4gaXJxX2Jhc2U7Ci0KLX0KLQotCS8qIFdoZW5ldmVyIFBJTlR4X0FTU0lHTiBpcyBhbHRlcmVkIGluaXRfcGludF9sdXQoKSBtdXN0IGJlIGV4ZWN1dGVkISAqLwotdm9pZCBpbml0X3BpbnRfbHV0KHZvaWQpCi17Ci0JdTE2IGJhbmssIGJpdCwgaXJxX2Jhc2UsIGJpdF9wb3M7Ci0JdTMyIHBpbnRfYXNzaWduOwotCXU4IGJtYXA7Ci0KLQltZW1zZXQoaXJxMnBpbnRfbHV0LCBJUlFfTk9UX0FWQUlMLCBzaXplb2YoaXJxMnBpbnRfbHV0KSk7Ci0KLQlmb3IgKGJhbmsgPSAwOyBiYW5rIDwgTlJfUElOVF9TWVNfSVJRUzsgYmFuaysrKSB7Ci0KLQkJcGludF9hc3NpZ24gPSBwaW50W2JhbmtdLT5hc3NpZ247Ci0KLQkJZm9yIChiaXQgPSAwOyBiaXQgPCBOUl9QSU5UX0JJVFM7IGJpdCsrKSB7Ci0KLQkJCWJtYXAgPSAocGludF9hc3NpZ24gPj4gKChiaXQgLyA4KSAqIDgpKSAmIDB4RkY7Ci0KLQkJCWlycV9iYXNlID0gZ2V0X2lycV9iYXNlKGJhbmssIGJtYXApOwotCi0JCQlpcnFfYmFzZSArPSAoYml0ICUgOCkgKyAoKGJpdCAvIDgpICYgMSA/IDggOiAwKTsKLQkJCWJpdF9wb3MgPSBiaXQgKyBiYW5rICogTlJfUElOVF9CSVRTOwotCi0JCQlwaW50MmlycV9sdXRbYml0X3Bvc10gPSBpcnFfYmFzZSAtIFNZU19JUlFTOwotCQkJaXJxMnBpbnRfbHV0W2lycV9iYXNlIC0gU1lTX0lSUVNdID0gYml0X3BvczsKLQotCQl9Ci0KLQl9Ci0KLX0KLQotc3RhdGljIHZvaWQgYmZpbl9ncGlvX2Fja19pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQl1OCBwaW50X3ZhbCA9IGlycTJwaW50X2x1dFtpcnEgLSBTWVNfSVJRU107Ci0JdTMyIHBpbnRiaXQgPSBQSU5UX0JJVChwaW50X3ZhbCk7Ci0JdTggYmFuayA9IFBJTlRfMl9CQU5LKHBpbnRfdmFsKTsKLQotCWlmICh1bmxpa2VseShncGlvX2JvdGhfZWRnZV90cmlnZ2VyZWRbYmFua10gJiBwaW50Yml0KSkgewotCQlpZiAocGludFtiYW5rXS0+aW52ZXJ0X3NldCAmIHBpbnRiaXQpCi0JCQlwaW50W2JhbmtdLT5pbnZlcnRfY2xlYXIgPSBwaW50Yml0OwotCQllbHNlCi0JCQlwaW50W2JhbmtdLT5pbnZlcnRfc2V0ID0gcGludGJpdDsKLQl9Ci0JcGludFtiYW5rXS0+cmVxdWVzdCA9IHBpbnRiaXQ7Ci0KLQlTU1lOQygpOwotfQotCi1zdGF0aWMgdm9pZCBiZmluX2dwaW9fbWFza19hY2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdTggcGludF92YWwgPSBpcnEycGludF9sdXRbaXJxIC0gU1lTX0lSUVNdOwotCXUzMiBwaW50Yml0ID0gUElOVF9CSVQocGludF92YWwpOwotCXU4IGJhbmsgPSBQSU5UXzJfQkFOSyhwaW50X3ZhbCk7Ci0KLQlpZiAodW5saWtlbHkoZ3Bpb19ib3RoX2VkZ2VfdHJpZ2dlcmVkW2JhbmtdICYgcGludGJpdCkpIHsKLQkJaWYgKHBpbnRbYmFua10tPmludmVydF9zZXQgJiBwaW50Yml0KQotCQkJcGludFtiYW5rXS0+aW52ZXJ0X2NsZWFyID0gcGludGJpdDsKLQkJZWxzZQotCQkJcGludFtiYW5rXS0+aW52ZXJ0X3NldCA9IHBpbnRiaXQ7Ci0JfQotCi0JcGludFtiYW5rXS0+cmVxdWVzdCA9IHBpbnRiaXQ7Ci0JcGludFtiYW5rXS0+bWFza19jbGVhciA9IHBpbnRiaXQ7Ci0JU1NZTkMoKTsKLX0KLQotc3RhdGljIHZvaWQgYmZpbl9ncGlvX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdTggcGludF92YWwgPSBpcnEycGludF9sdXRbaXJxIC0gU1lTX0lSUVNdOwotCi0JcGludFtQSU5UXzJfQkFOSyhwaW50X3ZhbCldLT5tYXNrX2NsZWFyID0gUElOVF9CSVQocGludF92YWwpOwotCVNTWU5DKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJmaW5fZ3Bpb191bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdTggcGludF92YWwgPSBpcnEycGludF9sdXRbaXJxIC0gU1lTX0lSUVNdOwotCXUzMiBwaW50Yml0ID0gUElOVF9CSVQocGludF92YWwpOwotCXU4IGJhbmsgPSBQSU5UXzJfQkFOSyhwaW50X3ZhbCk7Ci0KLQlwaW50W2JhbmtdLT5yZXF1ZXN0ID0gcGludGJpdDsKLQlwaW50W2JhbmtdLT5tYXNrX3NldCA9IHBpbnRiaXQ7Ci0JU1NZTkMoKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBiZmluX2dwaW9faXJxX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bnNpZ25lZCBpbnQgcmV0OwotCWNoYXIgYnVmWzhdOwotCXUxNiBncGlvbnIgPSBpcnFfdG9fZ3BpbyhpcnEpOwotCXU4IHBpbnRfdmFsID0gaXJxMnBpbnRfbHV0W2lycSAtIFNZU19JUlFTXTsKLQotCWlmIChwaW50X3ZhbCA9PSBJUlFfTk9UX0FWQUlMKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkiR1BJTyBJUlEgJWQgOk5vdCBpbiBQSU5UIEFzc2lnbiB0YWJsZSAiCi0JCSJSZWNvbmZpZ3VyZSBJbnRlcnJ1cHQgdG8gUG9ydCBBc3NpZ25lbXRcbiIsIGlycSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmICghKGdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJiBncGlvX2JpdChncGlvbnIpKSkgewotCQlzbnByaW50ZihidWYsIHNpemVvZiBidWYsICJJUlEgJWQiLCBpcnEpOwotCQlyZXQgPSBncGlvX3JlcXVlc3QoZ3Bpb25yLCBidWYpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW9ucildIHw9IGdwaW9fYml0KGdwaW9ucik7Ci0JYmZpbl9ncGlvX3VubWFza19pcnEoaXJxKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGJmaW5fZ3Bpb19pcnFfc2h1dGRvd24odW5zaWduZWQgaW50IGlycSkKLXsKLQl1MTYgZ3Bpb25yID0gaXJxX3RvX2dwaW8oaXJxKTsKLQotCWJmaW5fZ3Bpb19tYXNrX2lycShpcnEpOwotCWdwaW9fZnJlZShncGlvbnIpOwotCWdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJj0gfmdwaW9fYml0KGdwaW9ucik7Ci19Ci0KLXN0YXRpYyBpbnQgYmZpbl9ncGlvX2lycV90eXBlKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCB0eXBlKQotewotCi0JdW5zaWduZWQgaW50IHJldDsKLQljaGFyIGJ1Zls4XTsKLQl1MTYgZ3Bpb25yID0gaXJxX3RvX2dwaW8oaXJxKTsKLQl1OCBwaW50X3ZhbCA9IGlycTJwaW50X2x1dFtpcnEgLSBTWVNfSVJRU107Ci0JdTMyIHBpbnRiaXQgPSBQSU5UX0JJVChwaW50X3ZhbCk7Ci0JdTggYmFuayA9IFBJTlRfMl9CQU5LKHBpbnRfdmFsKTsKLQotCWlmIChwaW50X3ZhbCA9PSBJUlFfTk9UX0FWQUlMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmICh0eXBlID09IElSUV9UWVBFX1BST0JFKSB7Ci0JCS8qIG9ubHkgcHJvYmUgdW5lbmFibGVkIEdQSU8gaW50ZXJydXB0IGxpbmVzICovCi0JCWlmIChncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW9ucildICYgZ3Bpb19iaXQoZ3Bpb25yKSkKLQkJCXJldHVybiAwOwotCQl0eXBlID0gSVJRX1RZUEVfRURHRV9SSVNJTkcgfCBJUlFfVFlQRV9FREdFX0ZBTExJTkc7Ci0JfQotCi0JaWYgKHR5cGUgJiAoSVJRX1RZUEVfRURHRV9SSVNJTkcgfCBJUlFfVFlQRV9FREdFX0ZBTExJTkcgfAotCQkgICAgSVJRX1RZUEVfTEVWRUxfSElHSCB8IElSUV9UWVBFX0xFVkVMX0xPVykpIHsKLQkJaWYgKCEoZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhncGlvbnIpXSAmIGdwaW9fYml0KGdwaW9ucikpKSB7Ci0JCQlzbnByaW50ZihidWYsIHNpemVvZiBidWYsICJJUlEgJWQiLCBpcnEpOwotCQkJcmV0ID0gZ3Bpb19yZXF1ZXN0KGdwaW9uciwgYnVmKTsKLQkJCWlmIChyZXQpCi0JCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCWdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gfD0gZ3Bpb19iaXQoZ3Bpb25yKTsKLQl9IGVsc2UgewotCQlncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW9ucildICY9IH5ncGlvX2JpdChncGlvbnIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlncGlvX2RpcmVjdGlvbl9pbnB1dChncGlvbnIpOwotCi0JaWYgKCh0eXBlICYgKElSUV9UWVBFX0VER0VfRkFMTElORyB8IElSUV9UWVBFX0xFVkVMX0xPVykpKQotCQlwaW50W2JhbmtdLT5pbnZlcnRfc2V0ID0gcGludGJpdDsJLyogbG93IG9yIGZhbGxpbmcgZWRnZSBkZW5vdGVkIGJ5IG9uZSAqLwotCWVsc2UKLQkJcGludFtiYW5rXS0+aW52ZXJ0X2NsZWFyID0gcGludGJpdDsJLyogaGlnaCBvciByaXNpbmcgZWRnZSBkZW5vdGVkIGJ5IHplcm8gKi8KLQotCWlmICgodHlwZSAmIChJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORykpCi0JICAgID09IChJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORykpIHsKLQotCQlncGlvX2JvdGhfZWRnZV90cmlnZ2VyZWRbYmFua10gfD0gcGludGJpdDsKLQotCQlpZiAoZ3Bpb19nZXRfdmFsdWUoZ3Bpb25yKSkKLQkJCXBpbnRbYmFua10tPmludmVydF9zZXQgPSBwaW50Yml0OwotCQllbHNlCi0JCQlwaW50W2JhbmtdLT5pbnZlcnRfY2xlYXIgPSBwaW50Yml0OwotCX0gZWxzZSB7Ci0JCWdwaW9fYm90aF9lZGdlX3RyaWdnZXJlZFtiYW5rXSAmPSB+cGludGJpdDsKLQl9Ci0KLQlpZiAodHlwZSAmIChJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORykpIHsKLQkJcGludFtiYW5rXS0+ZWRnZV9zZXQgPSBwaW50Yml0OwotCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfZWRnZV9pcnEpOwotCX0gZWxzZSB7Ci0JCXBpbnRbYmFua10tPmVkZ2VfY2xlYXIgPSBwaW50Yml0OwotCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKLQl9Ci0KLQlTU1lOQygpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgYmZpbl9ncGlvX2lycWNoaXAgPSB7Ci0JLmFjayA9IGJmaW5fZ3Bpb19hY2tfaXJxLAotCS5tYXNrID0gYmZpbl9ncGlvX21hc2tfaXJxLAotCS5tYXNrX2FjayA9IGJmaW5fZ3Bpb19tYXNrX2Fja19pcnEsCi0JLnVubWFzayA9IGJmaW5fZ3Bpb191bm1hc2tfaXJxLAotCS5zZXRfdHlwZSA9IGJmaW5fZ3Bpb19pcnFfdHlwZSwKLQkuc3RhcnR1cCA9IGJmaW5fZ3Bpb19pcnFfc3RhcnR1cCwKLQkuc2h1dGRvd24gPSBiZmluX2dwaW9faXJxX3NodXRkb3duCi19OwotCi1zdGF0aWMgdm9pZCBiZmluX2RlbXV4X2dwaW9faXJxKHVuc2lnbmVkIGludCBpbnRiX2lycSwKLQkJCQlzdHJ1Y3QgaXJxX2Rlc2MgKmludGJfZGVzYykKLXsKLQl1OCBiYW5rLCBwaW50X3ZhbDsKLQl1MzIgcmVxdWVzdCwgaXJxOwotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKLQotCXN3aXRjaCAoaW50Yl9pcnEpIHsKLQljYXNlIElSUV9QSU5UMDoKLQkJYmFuayA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgSVJRX1BJTlQyOgotCQliYW5rID0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBJUlFfUElOVDM6Ci0JCWJhbmsgPSAzOwotCQlicmVhazsKLQljYXNlIElSUV9QSU5UMToKLQkJYmFuayA9IDE7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybjsKLQl9Ci0KLQlwaW50X3ZhbCA9IGJhbmsgKiBOUl9QSU5UX0JJVFM7Ci0KLQlyZXF1ZXN0ID0gcGludFtiYW5rXS0+cmVxdWVzdDsKLQotCXdoaWxlIChyZXF1ZXN0KSB7Ci0JCWlmIChyZXF1ZXN0ICYgMSkgewotCQkJaXJxID0gcGludDJpcnFfbHV0W3BpbnRfdmFsXSArIFNZU19JUlFTOwotCQkJZGVzYyA9IGlycV9kZXNjICsgaXJxOwotCQkJZGVzYy0+aGFuZGxlX2lycShpcnEsIGRlc2MpOwotCQl9Ci0JCXBpbnRfdmFsKys7Ci0JCXJlcXVlc3QgPj49IDE7Ci0JfQotCi19Ci0jZW5kaWYKLQotdm9pZCBfX2luaXQgaW5pdF9leGNlcHRpb25fdmVjdG9ycyh2b2lkKQotewotCVNTWU5DKCk7Ci0KLQkvKiBjYW5ub3QgcHJvZ3JhbSBpbiBzb2Z0d2FyZToKLQkgKiBldnQwIC0gZW11bGF0aW9uIChqdGFnKQotCSAqIGV2dDEgLSByZXNldAotCSAqLwotCWJmaW5fd3JpdGVfRVZUMihldnRfbm1pKTsKLQliZmluX3dyaXRlX0VWVDModHJhcCk7Ci0JYmZpbl93cml0ZV9FVlQ1KGV2dF9pdmh3KTsKLQliZmluX3dyaXRlX0VWVDYoZXZ0X3RpbWVyKTsKLQliZmluX3dyaXRlX0VWVDcoZXZ0X2V2dDcpOwotCWJmaW5fd3JpdGVfRVZUOChldnRfZXZ0OCk7Ci0JYmZpbl93cml0ZV9FVlQ5KGV2dF9ldnQ5KTsKLQliZmluX3dyaXRlX0VWVDEwKGV2dF9ldnQxMCk7Ci0JYmZpbl93cml0ZV9FVlQxMShldnRfZXZ0MTEpOwotCWJmaW5fd3JpdGVfRVZUMTIoZXZ0X2V2dDEyKTsKLQliZmluX3dyaXRlX0VWVDEzKGV2dF9ldnQxMyk7Ci0JYmZpbl93cml0ZV9FVlQxNChldnQxNF9zb2Z0aXJxKTsKLQliZmluX3dyaXRlX0VWVDE1KGV2dF9zeXN0ZW1fY2FsbCk7Ci0JQ1NZTkMoKTsKLX0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcga2VybmVsIHN0YXJ0dXAgdG8gaW5pdGlhbGl6ZQotICogdGhlIEJGaW4gSVJRIGhhbmRsaW5nIHJvdXRpbmVzLgotICovCi1pbnQgX19pbml0IGluaXRfYXJjaF9pcnEodm9pZCkKLXsKLQlpbnQgaXJxOwotCXVuc2lnbmVkIGxvbmcgaWxhdCA9IDA7Ci0JLyogIERpc2FibGUgYWxsIHRoZSBwZXJpcGhlcmFsIGludHJzICAtIHBhZ2UgNC0yOSBIVyBSZWYgbWFudWFsICovCi0jaWYgZGVmaW5lZChDT05GSUdfQkY1NHgpIHx8IGRlZmluZWQoQ09ORklHX0JGNTJ4KQotCWJmaW5fd3JpdGVfU0lDX0lNQVNLMChTSUNfVU5NQVNLX0FMTCk7Ci0JYmZpbl93cml0ZV9TSUNfSU1BU0sxKFNJQ19VTk1BU0tfQUxMKTsKLQliZmluX3dyaXRlX1NJQ19JV1IwKElXUl9FTkFCTEVfQUxMKTsKLQliZmluX3dyaXRlX1NJQ19JV1IxKElXUl9FTkFCTEVfQUxMKTsKLSMgaWZkZWYgQ09ORklHX0JGNTR4Ci0JYmZpbl93cml0ZV9TSUNfSU1BU0syKFNJQ19VTk1BU0tfQUxMKTsKLQliZmluX3dyaXRlX1NJQ19JV1IyKElXUl9FTkFCTEVfQUxMKTsKLSMgZW5kaWYKLSNlbHNlCi0JYmZpbl93cml0ZV9TSUNfSU1BU0soU0lDX1VOTUFTS19BTEwpOwotCWJmaW5fd3JpdGVfU0lDX0lXUihJV1JfRU5BQkxFX0FMTCk7Ci0jZW5kaWYKLQlTU1lOQygpOwotCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQotI2lmZGVmIENPTkZJR19CRjU0eAotIyBpZmRlZiBDT05GSUdfUElOVHhfUkVBU1NJR04KLQlwaW50WzBdLT5hc3NpZ24gPSBDT05GSUdfUElOVDBfQVNTSUdOOwotCXBpbnRbMV0tPmFzc2lnbiA9IENPTkZJR19QSU5UMV9BU1NJR047Ci0JcGludFsyXS0+YXNzaWduID0gQ09ORklHX1BJTlQyX0FTU0lHTjsKLQlwaW50WzNdLT5hc3NpZ24gPSBDT05GSUdfUElOVDNfQVNTSUdOOwotIyBlbmRpZgotCS8qIFdoZW5ldmVyIFBJTlR4X0FTU0lHTiBpcyBhbHRlcmVkIGluaXRfcGludF9sdXQoKSBtdXN0IGJlIGV4ZWN1dGVkISAqLwotCWluaXRfcGludF9sdXQoKTsKLSNlbmRpZgotCi0JZm9yIChpcnEgPSAwOyBpcnEgPD0gU1lTX0lSUVM7IGlycSsrKSB7Ci0JCWlmIChpcnEgPD0gSVJRX0NPUkVUTVIpCi0JCQlzZXRfaXJxX2NoaXAoaXJxLCAmYmZpbl9jb3JlX2lycWNoaXApOwotCQllbHNlCi0JCQlzZXRfaXJxX2NoaXAoaXJxLCAmYmZpbl9pbnRlcm5hbF9pcnFjaGlwKTsKLSNpZmRlZiBCRjUzN19HRU5FUklDX0VSUk9SX0lOVF9ERU1VWAotCQlpZiAoaXJxICE9IElSUV9HRU5FUklDX0VSUk9SKSB7Ci0jZW5kaWYKLQotCQkJc3dpdGNoIChpcnEpIHsKLSNpZiBkZWZpbmVkKENPTkZJR19CRjUzeCkKLQkJCWNhc2UgSVJRX1BST0dfSU5UQToKLQkJCQlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihpcnEsCi0JCQkJCQkJYmZpbl9kZW11eF9ncGlvX2lycSk7Ci0JCQkJYnJlYWs7Ci0jIGlmIGRlZmluZWQoQkY1MzdfRkFNSUxZKSAmJiAhKGRlZmluZWQoQ09ORklHX0JGSU5fTUFDKSB8fCBkZWZpbmVkKENPTkZJR19CRklOX01BQ19NT0RVTEUpKQotCQkJY2FzZSBJUlFfTUFDX1JYOgotCQkJCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKGlycSwKLQkJCQkJCQliZmluX2RlbXV4X2dwaW9faXJxKTsKLQkJCQlicmVhazsKLSMgZW5kaWYKLSNlbGlmIGRlZmluZWQoQ09ORklHX0JGNTR4KQotCQkJY2FzZSBJUlFfUElOVDA6Ci0JCQkJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoaXJxLAotCQkJCQkJCWJmaW5fZGVtdXhfZ3Bpb19pcnEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJUlFfUElOVDE6Ci0JCQkJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoaXJxLAotCQkJCQkJCWJmaW5fZGVtdXhfZ3Bpb19pcnEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJUlFfUElOVDI6Ci0JCQkJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoaXJxLAotCQkJCQkJCWJmaW5fZGVtdXhfZ3Bpb19pcnEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJUlFfUElOVDM6Ci0JCQkJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoaXJxLAotCQkJCQkJCWJmaW5fZGVtdXhfZ3Bpb19pcnEpOwotCQkJCWJyZWFrOwotI2VsaWYgZGVmaW5lZChDT05GSUdfQkY1MngpCi0JCQljYXNlIElSUV9QT1JURl9JTlRBOgotCQkJCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKGlycSwKLQkJCQkJCQliZmluX2RlbXV4X2dwaW9faXJxKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVJRX1BPUlRHX0lOVEE6Ci0JCQkJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoaXJxLAotCQkJCQkJCWJmaW5fZGVtdXhfZ3Bpb19pcnEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJUlFfUE9SVEhfSU5UQToKLQkJCQlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihpcnEsCi0JCQkJCQkJYmZpbl9kZW11eF9ncGlvX2lycSk7Ci0JCQkJYnJlYWs7Ci0jZW5kaWYKLQkJCWRlZmF1bHQ6Ci0JCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX3NpbXBsZV9pcnEpOwotCQkJCWJyZWFrOwotCQkJfQotCi0jaWZkZWYgQkY1MzdfR0VORVJJQ19FUlJPUl9JTlRfREVNVVgKLQkJfSBlbHNlIHsKLQkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGJmaW5fZGVtdXhfZXJyb3JfaXJxKTsKLQkJfQotI2VuZGlmCi0JfQotI2lmZGVmIEJGNTM3X0dFTkVSSUNfRVJST1JfSU5UX0RFTVVYCi0JZm9yIChpcnEgPSBJUlFfUFBJX0VSUk9SOyBpcnEgPD0gSVJRX1VBUlQxX0VSUk9SOyBpcnErKykgewotCQlzZXRfaXJxX2NoaXAoaXJxLCAmYmZpbl9nZW5lcmljX2Vycm9yX2lycWNoaXApOwotCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKLQl9Ci0jZW5kaWYKLQotI2lmbmRlZiBDT05GSUdfQkY1NHgKLQlmb3IgKGlycSA9IElSUV9QRjA7IGlycSA8IE5SX0lSUVM7IGlycSsrKSB7Ci0jZWxzZQotCWZvciAoaXJxID0gSVJRX1BBMDsgaXJxIDwgTlJfSVJRUzsgaXJxKyspIHsKLSNlbmRpZgotCQlzZXRfaXJxX2NoaXAoaXJxLCAmYmZpbl9ncGlvX2lycWNoaXApOwotCQkvKiBpZiBjb25maWd1cmVkIGFzIGVkZ2UsIHRoZW4gd2lsbCBiZSBjaGFuZ2VkIHRvIGRvX2VkZ2VfSVJRICovCi0JCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9sZXZlbF9pcnEpOwotCX0KLQotCWJmaW5fd3JpdGVfSU1BU0soMCk7Ci0JQ1NZTkMoKTsKLQlpbGF0ID0gYmZpbl9yZWFkX0lMQVQoKTsKLQlDU1lOQygpOwotCWJmaW5fd3JpdGVfSUxBVChpbGF0KTsKLQlDU1lOQygpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiQ29uZmlndXJpbmcgQmxhY2tmaW4gUHJpb3JpdHkgRHJpdmVuIEludGVycnVwdHNcbiIpOwotCS8qIElNQVNLPXh4eCBpcyBlcXVpdmFsZW50IHRvIFNUSSB4eCBvciBpcnFfZmxhZ3M9eHgsCi0JICogbG9jYWxfaXJxX2VuYWJsZSgpCi0JICovCi0JcHJvZ3JhbV9JQVIoKTsKLQkvKiBUaGVyZWZvcmUgaXQncyBiZXR0ZXIgdG8gc2V0dXAgSUFScyBiZWZvcmUgaW50ZXJydXB0cyBlbmFibGVkICovCi0Jc2VhcmNoX0lBUigpOwotCi0JLyogRW5hYmxlIGludGVycnVwdHMgSVZHNy0xNSAqLwotCWlycV9mbGFncyA9IGlycV9mbGFncyB8IElNQVNLX0lWRzE1IHwKLQkgICAgSU1BU0tfSVZHMTQgfCBJTUFTS19JVkcxMyB8IElNQVNLX0lWRzEyIHwgSU1BU0tfSVZHMTEgfAotCSAgICBJTUFTS19JVkcxMCB8IElNQVNLX0lWRzkgfCBJTUFTS19JVkc4IHwgSU1BU0tfSVZHNyB8IElNQVNLX0lWR0hXOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfRE9fSVJRX0wxCi1fX2F0dHJpYnV0ZV9fKChsMV90ZXh0KSkKLSNlbmRpZgotdm9pZCBkb19pcnEoaW50IHZlYywgc3RydWN0IHB0X3JlZ3MgKmZwKQotewotCWlmICh2ZWMgPT0gRVZUX0lWVE1SX1ApIHsKLQkJdmVjID0gSVJRX0NPUkVUTVI7Ci0JfSBlbHNlIHsKLQkJc3RydWN0IGl2Z3ggKml2ZyA9IGl2ZzdfMTNbdmVjIC0gSVZHN10uaWZpcnN0OwotCQlzdHJ1Y3QgaXZneCAqaXZnX3N0b3AgPSBpdmc3XzEzW3ZlYyAtIElWRzddLmlzdG9wOwotI2lmIGRlZmluZWQoQ09ORklHX0JGNTR4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUyeCkKLQkJdW5zaWduZWQgbG9uZyBzaWNfc3RhdHVzWzNdOwotCi0JCVNTWU5DKCk7Ci0JCXNpY19zdGF0dXNbMF0gPSBiZmluX3JlYWRfU0lDX0lTUjAoKSAmIGJmaW5fcmVhZF9TSUNfSU1BU0swKCk7Ci0JCXNpY19zdGF0dXNbMV0gPSBiZmluX3JlYWRfU0lDX0lTUjEoKSAmIGJmaW5fcmVhZF9TSUNfSU1BU0sxKCk7Ci0jaWZkZWYgQ09ORklHX0JGNTR4Ci0JCXNpY19zdGF0dXNbMl0gPSBiZmluX3JlYWRfU0lDX0lTUjIoKSAmIGJmaW5fcmVhZF9TSUNfSU1BU0syKCk7Ci0jZW5kaWYKLQkJZm9yICg7OyBpdmcrKykgewotCQkJaWYgKGl2ZyA+PSBpdmdfc3RvcCkgewotCQkJCWF0b21pY19pbmMoJm51bV9zcHVyaW91cyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKHNpY19zdGF0dXNbKGl2Zy0+aXJxbm8gLSBJVkc3KSAvIDMyXSAmIGl2Zy0+aXNyZmxhZykKLQkJCQlicmVhazsKLQkJfQotI2Vsc2UKLQkJdW5zaWduZWQgbG9uZyBzaWNfc3RhdHVzOwotCQlTU1lOQygpOwotCQlzaWNfc3RhdHVzID0gYmZpbl9yZWFkX1NJQ19JTUFTSygpICYgYmZpbl9yZWFkX1NJQ19JU1IoKTsKLQotCQlmb3IgKDs7IGl2ZysrKSB7Ci0JCQlpZiAoaXZnID49IGl2Z19zdG9wKSB7Ci0JCQkJYXRvbWljX2luYygmbnVtX3NwdXJpb3VzKTsKLQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgaWYgKHNpY19zdGF0dXMgJiBpdmctPmlzcmZsYWcpCi0JCQkJYnJlYWs7Ci0JCX0KLSNlbmRpZgotCQl2ZWMgPSBpdmctPmlycW5vOwotCX0KLQlhc21fZG9fSVJRKHZlYywgZnApOwotCi0jaWZkZWYgQ09ORklHX0tHREIKLQlrZ2RiX3Byb2Nlc3NfYnJlYWtwb2ludCgpOwotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludHMtcHJpb3JpdHkuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50cy1wcmlvcml0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MDU5NWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL2ludHMtcHJpb3JpdHkuYwpAQCAtMCwwICsxLDExNTkgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGFyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vaW50cy1wcmlvcml0eS5jCisgKiBCYXNlZCBvbjoKKyAqIEF1dGhvcjoKKyAqCisgKiBDcmVhdGVkOiAgICAgID8KKyAqIERlc2NyaXB0aW9uOiAgU2V0IHVwIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdGllcworICoKKyAqIE1vZGlmaWVkOgorICogICAgICAgICAgICAgICAxOTk2IFJvbWFuIFppcHBlbAorICogICAgICAgICAgICAgICAxOTk5IEQuIEplZmYgRGlvbm5lIDxqZWZmQHVjbGludXgub3JnPgorICogICAgICAgICAgICAgICAyMDAwLTIwMDEgTGluZW8sIEluYy4gRC4gSmVmZmYgRGlvbm5lIDxqZWZmQGxpbmVvLmNhPgorICogICAgICAgICAgICAgICAyMDAyIEFyY3R1cnVzIE5ldHdvcmtzIEluYy4gTWFUZWQgPG1hdGVkQHN5bXBhdGljby5jYT4KKyAqICAgICAgICAgICAgICAgMjAwMyBNZXRyb3dlcmtzL01vdG9yb2xhCisgKiAgICAgICAgICAgICAgIDIwMDMgQmFzIFZlcm1ldWxlbiA8YmFzQGJ1eXdheXMubmw+CisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgdGhlIGZpbGUgQ09QWUlORywgb3Igd3JpdGUKKyAqIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaWZkZWYgQ09ORklHX0tHREIKKyNpbmNsdWRlIDxsaW51eC9rZ2RiLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxhc20vdHJhcHMuaD4KKyNpbmNsdWRlIDxhc20vYmxhY2tmaW4uaD4KKyNpbmNsdWRlIDxhc20vZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9pcnFfaGFuZGxlci5oPgorCisjaWZkZWYgQkY1MzdfRkFNSUxZCisjIGRlZmluZSBCRjUzN19HRU5FUklDX0VSUk9SX0lOVF9ERU1VWAorI2Vsc2UKKyMgdW5kZWYgQkY1MzdfR0VORVJJQ19FUlJPUl9JTlRfREVNVVgKKyNlbmRpZgorCisvKgorICogTk9URVM6CisgKiAtIHdlIGhhdmUgc2VwYXJhdGVkIHRoZSBwaHlzaWNhbCBIYXJkd2FyZSBpbnRlcnJ1cHQgZnJvbSB0aGUKKyAqIGxldmVscyB0aGF0IHRoZSBMSU5VWCBrZXJuZWwgc2VlcyAoc2VlIHRoZSBkZXNjcmlwdGlvbiBpbiBpcnEuaCkKKyAqIC0KKyAqLworCisvKiBJbml0aWFsaXplIHRoaXMgdG8gYW4gYWN0dWFsIHZhbHVlIHRvIGZvcmNlIGl0IGludG8gdGhlIC5kYXRhCisgKiBzZWN0aW9uIHNvIHRoYXQgd2Uga25vdyBpdCBpcyBwcm9wZXJseSBpbml0aWFsaXplZCBhdCBlbnRyeSBpbnRvCisgKiB0aGUga2VybmVsIGJ1dCBiZWZvcmUgYnNzIGlzIGluaXRpYWxpemVkIHRvIHplcm8gKHdoaWNoIGlzIHdoZXJlCisgKiBpdCB3b3VsZCBsaXZlIG90aGVyd2lzZSkuICBUaGUgMHgxZiBtYWdpYyByZXByZXNlbnRzIHRoZSBJUlFzIHdlCisgKiBjYW5ub3QgYWN0dWFsbHkgbWFzayBvdXQgaW4gaGFyZHdhcmUuCisgKi8KK3Vuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzID0gMHgxZjsKKworLyogVGhlIG51bWJlciBvZiBzcHVyaW91cyBpbnRlcnJ1cHRzICovCithdG9taWNfdCBudW1fc3B1cmlvdXM7CisKKyNpZmRlZiBDT05GSUdfUE0KK3Vuc2lnbmVkIGxvbmcgYmZpbl9zaWNfaXdyWzNdOwkvKiBVcCB0byAzIFNJQ19JV1J4IHJlZ2lzdGVycyAqLworI2VuZGlmCisKK3N0cnVjdCBpdmd4IHsKKwkvKiBpcnEgbnVtYmVyIGZvciByZXF1ZXN0X2lycSwgYXZhaWxhYmxlIGluIG1hY2gtYmY1MzMvaXJxLmggKi8KKwl1bnNpZ25lZCBpbnQgaXJxbm87CisJLyogY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIFNJQ19JU1IgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBpbnQgaXNyZmxhZzsKK30gaXZnX3RhYmxlW05SX1BFUklfSU5UU107CisKK3N0cnVjdCBpdmdfc2xpY2UgeworCS8qIHBvc2l0aW9uIG9mIGZpcnN0IGlycSBpbiBpdmdfdGFibGUgZm9yIGdpdmVuIGl2ZyAqLworCXN0cnVjdCBpdmd4ICppZmlyc3Q7CisJc3RydWN0IGl2Z3ggKmlzdG9wOworfSBpdmc3XzEzW0lWRzEzIC0gSVZHNyArIDFdOworCitzdGF0aWMgdm9pZCBzZWFyY2hfSUFSKHZvaWQpOworCisvKgorICogU2VhcmNoIFNJQ19JQVIgYW5kIGZpbGwgdGFibGVzIHdpdGggdGhlIGlycXZhbHVlcworICogYW5kIHRoZWlyIHBvc2l0aW9ucyBpbiB0aGUgU0lDX0lTUiByZWdpc3Rlci4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHNlYXJjaF9JQVIodm9pZCkKK3sKKwl1bnNpZ25lZCBpdmcsIGlycV9wb3MgPSAwOworCWZvciAoaXZnID0gMDsgaXZnIDw9IElWRzEzIC0gSVZHNzsgaXZnKyspIHsKKwkJaW50IGlycW47CisKKwkJaXZnN18xM1tpdmddLmlzdG9wID0gaXZnN18xM1tpdmddLmlmaXJzdCA9ICZpdmdfdGFibGVbaXJxX3Bvc107CisKKwkJZm9yIChpcnFuID0gMDsgaXJxbiA8IE5SX1BFUklfSU5UUzsgaXJxbisrKSB7CisJCQlpbnQgaWFyX3NoaWZ0ID0gKGlycW4gJiA3KSAqIDQ7CisJCQkJaWYgKGl2ZyA9PSAoMHhmICYKKyNpZm5kZWYgQ09ORklHX0JGNTJ4CisJCQkgICAgIGJmaW5fcmVhZDMyKCh1bnNpZ25lZCBsb25nICopU0lDX0lBUjAgKworCQkJCQkgKGlycW4gPj4gMykpID4+IGlhcl9zaGlmdCkpIHsKKyNlbHNlCisJCQkgICAgIGJmaW5fcmVhZDMyKCh1bnNpZ25lZCBsb25nICopU0lDX0lBUjAgKworCQkJCQkgKChpcnFuJTMyKSA+PiAzKSArICgoaXJxbiAvIDMyKSAqIDE2KSkgPj4gaWFyX3NoaWZ0KSkgeworI2VuZGlmCisJCQkJaXZnX3RhYmxlW2lycV9wb3NdLmlycW5vID0gSVZHNyArIGlycW47CisJCQkJaXZnX3RhYmxlW2lycV9wb3NdLmlzcmZsYWcgPSAxIDw8IChpcnFuICUgMzIpOworCQkJCWl2ZzdfMTNbaXZnXS5pc3RvcCsrOworCQkJCWlycV9wb3MrKzsKKwkJCX0KKwkJfQorCX0KK30KKworLyoKKyAqIFRoaXMgaXMgZm9yIEJGNTMzIGludGVybmFsIElSUXMKKyAqLworCitzdGF0aWMgdm9pZCBhY2tfbm9vcCh1bnNpZ25lZCBpbnQgaXJxKQoreworCS8qIER1bW15IGZ1bmN0aW9uLiAgKi8KK30KKworc3RhdGljIHZvaWQgYmZpbl9jb3JlX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJaXJxX2ZsYWdzICY9IH4oMSA8PCBpcnEpOworCWlmICghaXJxc19kaXNhYmxlZCgpKQorCQlsb2NhbF9pcnFfZW5hYmxlKCk7Cit9CisKK3N0YXRpYyB2b2lkIGJmaW5fY29yZV91bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJaXJxX2ZsYWdzIHw9IDEgPDwgaXJxOworCS8qCisJICogSWYgaW50ZXJydXB0cyBhcmUgZW5hYmxlZCwgSU1BU0sgbXVzdCBjb250YWluIHRoZSBzYW1lIHZhbHVlCisJICogYXMgaXJxX2ZsYWdzLiAgTWFrZSBzdXJlIHRoYXQgaW52YXJpYW50IGhvbGRzLiAgSWYgaW50ZXJydXB0cworCSAqIGFyZSBjdXJyZW50bHkgZGlzYWJsZWQgd2UgbmVlZCBub3QgZG8gYW55dGhpbmc7IG9uZSBvZiB0aGUKKwkgKiBjYWxsZXJzIHdpbGwgdGFrZSBjYXJlIG9mIHNldHRpbmcgSU1BU0sgdG8gdGhlIHByb3BlciB2YWx1ZQorCSAqIHdoZW4gcmVlbmFibGluZyBpbnRlcnJ1cHRzLgorCSAqIGxvY2FsX2lycV9lbmFibGUganVzdCBkb2VzICJTVEkgaXJxX2ZsYWdzIiwgc28gaXQncyBleGFjdGx5CisJICogd2hhdCB3ZSBuZWVkLgorCSAqLworCWlmICghaXJxc19kaXNhYmxlZCgpKQorCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBiZmluX2ludGVybmFsX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisjaWZkZWYgQ09ORklHX0JGNTN4CisJYmZpbl93cml0ZV9TSUNfSU1BU0soYmZpbl9yZWFkX1NJQ19JTUFTSygpICYKKwkJCSAgICAgfigxIDw8IChpcnEgLSAoSVJRX0NPUkVUTVIgKyAxKSkpKTsKKyNlbHNlCisJdW5zaWduZWQgbWFza19iYW5rLCBtYXNrX2JpdDsKKwltYXNrX2JhbmsgPSAoaXJxIC0gKElSUV9DT1JFVE1SICsgMSkpIC8gMzI7CisJbWFza19iaXQgPSAoaXJxIC0gKElSUV9DT1JFVE1SICsgMSkpICUgMzI7CisJYmZpbl93cml0ZV9TSUNfSU1BU0sobWFza19iYW5rLCBiZmluX3JlYWRfU0lDX0lNQVNLKG1hc2tfYmFuaykgJgorCQkJICAgICB+KDEgPDwgbWFza19iaXQpKTsKKyNlbmRpZgorCVNTWU5DKCk7Cit9CisKK3N0YXRpYyB2b2lkIGJmaW5faW50ZXJuYWxfdW5tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworI2lmZGVmIENPTkZJR19CRjUzeAorCWJmaW5fd3JpdGVfU0lDX0lNQVNLKGJmaW5fcmVhZF9TSUNfSU1BU0soKSB8CisJCQkgICAgICgxIDw8IChpcnEgLSAoSVJRX0NPUkVUTVIgKyAxKSkpKTsKKyNlbHNlCisJdW5zaWduZWQgbWFza19iYW5rLCBtYXNrX2JpdDsKKwltYXNrX2JhbmsgPSAoaXJxIC0gKElSUV9DT1JFVE1SICsgMSkpIC8gMzI7CisJbWFza19iaXQgPSAoaXJxIC0gKElSUV9DT1JFVE1SICsgMSkpICUgMzI7CisJYmZpbl93cml0ZV9TSUNfSU1BU0sobWFza19iYW5rLCBiZmluX3JlYWRfU0lDX0lNQVNLKG1hc2tfYmFuaykgfAorCQkJICAgICAoMSA8PCBtYXNrX2JpdCkpOworI2VuZGlmCisJU1NZTkMoKTsKK30KKworI2lmZGVmIENPTkZJR19QTQoraW50IGJmaW5faW50ZXJuYWxfc2V0X3dha2UodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHN0YXRlKQoreworCXVuc2lnbmVkIGJhbmssIGJpdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJhbmsgPSAoaXJxIC0gKElSUV9DT1JFVE1SICsgMSkpIC8gMzI7CisJYml0ID0gKGlycSAtIChJUlFfQ09SRVRNUiArIDEpKSAlIDMyOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJaWYgKHN0YXRlKQorCQliZmluX3NpY19pd3JbYmFua10gfD0gKDEgPDwgYml0KTsKKwllbHNlCisJCWJmaW5fc2ljX2l3cltiYW5rXSAmPSB+KDEgPDwgYml0KTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgYmZpbl9jb3JlX2lycWNoaXAgPSB7CisJLmFjayA9IGFja19ub29wLAorCS5tYXNrID0gYmZpbl9jb3JlX21hc2tfaXJxLAorCS51bm1hc2sgPSBiZmluX2NvcmVfdW5tYXNrX2lycSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgYmZpbl9pbnRlcm5hbF9pcnFjaGlwID0geworCS5hY2sgPSBhY2tfbm9vcCwKKwkubWFzayA9IGJmaW5faW50ZXJuYWxfbWFza19pcnEsCisJLnVubWFzayA9IGJmaW5faW50ZXJuYWxfdW5tYXNrX2lycSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc2V0X3dha2UgPSBiZmluX2ludGVybmFsX3NldF93YWtlLAorI2VuZGlmCit9OworCisjaWZkZWYgQkY1MzdfR0VORVJJQ19FUlJPUl9JTlRfREVNVVgKK3N0YXRpYyBpbnQgZXJyb3JfaW50X21hc2s7CisKK3N0YXRpYyB2b2lkIGJmaW5fZ2VuZXJpY19lcnJvcl9hY2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisKK30KKworc3RhdGljIHZvaWQgYmZpbl9nZW5lcmljX2Vycm9yX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJZXJyb3JfaW50X21hc2sgJj0gfigxTCA8PCAoaXJxIC0gSVJRX1BQSV9FUlJPUikpOworCisJaWYgKCFlcnJvcl9pbnRfbWFzaykgeworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQliZmluX3dyaXRlX1NJQ19JTUFTSyhiZmluX3JlYWRfU0lDX0lNQVNLKCkgJgorCQkJCSAgICAgfigxIDw8IChJUlFfR0VORVJJQ19FUlJPUiAtCisJCQkJCShJUlFfQ09SRVRNUiArIDEpKSkpOworCQlTU1lOQygpOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBiZmluX2dlbmVyaWNfZXJyb3JfdW5tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJYmZpbl93cml0ZV9TSUNfSU1BU0soYmZpbl9yZWFkX1NJQ19JTUFTSygpIHwgMSA8PAorCQkJICAgICAoSVJRX0dFTkVSSUNfRVJST1IgLSAoSVJRX0NPUkVUTVIgKyAxKSkpOworCVNTWU5DKCk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJZXJyb3JfaW50X21hc2sgfD0gMUwgPDwgKGlycSAtIElSUV9QUElfRVJST1IpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGJmaW5fZ2VuZXJpY19lcnJvcl9pcnFjaGlwID0geworCS5hY2sgPSBiZmluX2dlbmVyaWNfZXJyb3JfYWNrX2lycSwKKwkubWFzayA9IGJmaW5fZ2VuZXJpY19lcnJvcl9tYXNrX2lycSwKKwkudW5tYXNrID0gYmZpbl9nZW5lcmljX2Vycm9yX3VubWFza19pcnEsCit9OworCitzdGF0aWMgdm9pZCBiZmluX2RlbXV4X2Vycm9yX2lycSh1bnNpZ25lZCBpbnQgaW50X2Vycl9pcnEsCisJCQkJIHN0cnVjdCBpcnFfZGVzYyAqaW50YV9kZXNjKQoreworCWludCBpcnEgPSAwOworCisJU1NZTkMoKTsKKworI2lmIChkZWZpbmVkKENPTkZJR19CRjUzNykgfHwgZGVmaW5lZChDT05GSUdfQkY1MzYpKQorCWlmIChiZmluX3JlYWRfRU1BQ19TWVNUQVQoKSAmIEVNQUNfRVJSX01BU0spCisJCWlycSA9IElSUV9NQUNfRVJST1I7CisJZWxzZQorI2VuZGlmCisJaWYgKGJmaW5fcmVhZF9TUE9SVDBfU1RBVCgpICYgU1BPUlRfRVJSX01BU0spCisJCWlycSA9IElSUV9TUE9SVDBfRVJST1I7CisJZWxzZSBpZiAoYmZpbl9yZWFkX1NQT1JUMV9TVEFUKCkgJiBTUE9SVF9FUlJfTUFTSykKKwkJaXJxID0gSVJRX1NQT1JUMV9FUlJPUjsKKwllbHNlIGlmIChiZmluX3JlYWRfUFBJX1NUQVRVUygpICYgUFBJX0VSUl9NQVNLKQorCQlpcnEgPSBJUlFfUFBJX0VSUk9SOworCWVsc2UgaWYgKGJmaW5fcmVhZF9DQU5fR0lGKCkgJiBDQU5fRVJSX01BU0spCisJCWlycSA9IElSUV9DQU5fRVJST1I7CisJZWxzZSBpZiAoYmZpbl9yZWFkX1NQSV9TVEFUKCkgJiBTUElfRVJSX01BU0spCisJCWlycSA9IElSUV9TUElfRVJST1I7CisJZWxzZSBpZiAoKGJmaW5fcmVhZF9VQVJUMF9JSVIoKSAmIFVBUlRfRVJSX01BU0tfU1RBVDEpICYmCisJCSAoYmZpbl9yZWFkX1VBUlQwX0lJUigpICYgVUFSVF9FUlJfTUFTS19TVEFUMCkpCisJCWlycSA9IElSUV9VQVJUMF9FUlJPUjsKKwllbHNlIGlmICgoYmZpbl9yZWFkX1VBUlQxX0lJUigpICYgVUFSVF9FUlJfTUFTS19TVEFUMSkgJiYKKwkJIChiZmluX3JlYWRfVUFSVDFfSUlSKCkgJiBVQVJUX0VSUl9NQVNLX1NUQVQwKSkKKwkJaXJxID0gSVJRX1VBUlQxX0VSUk9SOworCisJaWYgKGlycSkgeworCQlpZiAoZXJyb3JfaW50X21hc2sgJiAoMUwgPDwgKGlycSAtIElSUV9QUElfRVJST1IpKSkgeworCQkJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJCQlkZXNjLT5oYW5kbGVfaXJxKGlycSwgZGVzYyk7CisJCX0gZWxzZSB7CisKKwkJCXN3aXRjaCAoaXJxKSB7CisJCQljYXNlIElSUV9QUElfRVJST1I6CisJCQkJYmZpbl93cml0ZV9QUElfU1RBVFVTKFBQSV9FUlJfTUFTSyk7CisJCQkJYnJlYWs7CisjaWYgKGRlZmluZWQoQ09ORklHX0JGNTM3KSB8fCBkZWZpbmVkKENPTkZJR19CRjUzNikpCisJCQljYXNlIElSUV9NQUNfRVJST1I6CisJCQkJYmZpbl93cml0ZV9FTUFDX1NZU1RBVChFTUFDX0VSUl9NQVNLKTsKKwkJCQlicmVhazsKKyNlbmRpZgorCQkJY2FzZSBJUlFfU1BPUlQwX0VSUk9SOgorCQkJCWJmaW5fd3JpdGVfU1BPUlQwX1NUQVQoU1BPUlRfRVJSX01BU0spOworCQkJCWJyZWFrOworCisJCQljYXNlIElSUV9TUE9SVDFfRVJST1I6CisJCQkJYmZpbl93cml0ZV9TUE9SVDFfU1RBVChTUE9SVF9FUlJfTUFTSyk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSVJRX0NBTl9FUlJPUjoKKwkJCQliZmluX3dyaXRlX0NBTl9HSVMoQ0FOX0VSUl9NQVNLKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBJUlFfU1BJX0VSUk9SOgorCQkJCWJmaW5fd3JpdGVfU1BJX1NUQVQoU1BJX0VSUl9NQVNLKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcHJfZGVidWcoIklSUSAlZDoiCisJCQkJICIgTUFTS0VEIFBFUklQSEVSQUwgRVJST1IgSU5URVJSVVBUIEFTU0VSVEVEXG4iLAorCQkJCSBpcnEpOworCQl9CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiVzIDogJXMgOiBMSU5FICVkIDpcbklSUSA/OiBQRVJJUEhFUkFMIEVSUk9SIgorCQkgICAgICAgIiBJTlRFUlJVUFQgQVNTRVJURUQgQlVUIE5PIFNPVVJDRSBGT1VORFxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgX19GSUxFX18sIF9fTElORV9fKTsKKworfQorI2VuZGlmCQkJCS8qIEJGNTM3X0dFTkVSSUNfRVJST1JfSU5UX0RFTVVYICovCisKKyNpZiAhZGVmaW5lZChDT05GSUdfQkY1NHgpCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldOworc3RhdGljIHVuc2lnbmVkIHNob3J0IGdwaW9fZWRnZV90cmlnZ2VyZWRbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldOworCisKK3N0YXRpYyB2b2lkIGJmaW5fZ3Bpb19hY2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdTE2IGdwaW9uciA9IGlycSAtIElSUV9QRjA7CisKKwlpZiAoZ3Bpb19lZGdlX3RyaWdnZXJlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJiBncGlvX2JpdChncGlvbnIpKSB7CisJCXNldF9ncGlvX2RhdGEoZ3Bpb25yLCAwKTsKKwkJU1NZTkMoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJmaW5fZ3Bpb19tYXNrX2Fja19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1MTYgZ3Bpb25yID0gaXJxIC0gSVJRX1BGMDsKKworCWlmIChncGlvX2VkZ2VfdHJpZ2dlcmVkW2dwaW9fYmFuayhncGlvbnIpXSAmIGdwaW9fYml0KGdwaW9ucikpIHsKKwkJc2V0X2dwaW9fZGF0YShncGlvbnIsIDApOworCQlTU1lOQygpOworCX0KKworCXNldF9ncGlvX21hc2thKGdwaW9uciwgMCk7CisJU1NZTkMoKTsKK30KKworc3RhdGljIHZvaWQgYmZpbl9ncGlvX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJc2V0X2dwaW9fbWFza2EoaXJxIC0gSVJRX1BGMCwgMCk7CisJU1NZTkMoKTsKK30KKworc3RhdGljIHZvaWQgYmZpbl9ncGlvX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlzZXRfZ3Bpb19tYXNrYShpcnEgLSBJUlFfUEYwLCAxKTsKKwlTU1lOQygpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGJmaW5fZ3Bpb19pcnFfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCByZXQ7CisJdTE2IGdwaW9uciA9IGlycSAtIElSUV9QRjA7CisJY2hhciBidWZbOF07CisKKwlpZiAoIShncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW9ucildICYgZ3Bpb19iaXQoZ3Bpb25yKSkpIHsKKwkJc25wcmludGYoYnVmLCBzaXplb2YgYnVmLCAiSVJRICVkIiwgaXJxKTsKKwkJcmV0ID0gZ3Bpb19yZXF1ZXN0KGdwaW9uciwgYnVmKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhncGlvbnIpXSB8PSBncGlvX2JpdChncGlvbnIpOworCWJmaW5fZ3Bpb191bm1hc2tfaXJxKGlycSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBiZmluX2dwaW9faXJxX3NodXRkb3duKHVuc2lnbmVkIGludCBpcnEpCit7CisJYmZpbl9ncGlvX21hc2tfaXJxKGlycSk7CisJZ3Bpb19mcmVlKGlycSAtIElSUV9QRjApOworCWdwaW9fZW5hYmxlZFtncGlvX2JhbmsoaXJxIC0gSVJRX1BGMCldICY9IH5ncGlvX2JpdChpcnEgLSBJUlFfUEYwKTsKK30KKworc3RhdGljIGludCBiZmluX2dwaW9faXJxX3R5cGUodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHR5cGUpCit7CisKKwl1bnNpZ25lZCBpbnQgcmV0OworCWNoYXIgYnVmWzhdOworCXUxNiBncGlvbnIgPSBpcnEgLSBJUlFfUEYwOworCisJaWYgKHR5cGUgPT0gSVJRX1RZUEVfUFJPQkUpIHsKKwkJLyogb25seSBwcm9iZSB1bmVuYWJsZWQgR1BJTyBpbnRlcnJ1cHQgbGluZXMgKi8KKwkJaWYgKGdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJiBncGlvX2JpdChncGlvbnIpKQorCQkJcmV0dXJuIDA7CisJCXR5cGUgPSBJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORzsKKwl9CisKKwlpZiAodHlwZSAmIChJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORyB8CisJCSAgICBJUlFfVFlQRV9MRVZFTF9ISUdIIHwgSVJRX1RZUEVfTEVWRUxfTE9XKSkgeworCQlpZiAoIShncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW9ucildICYgZ3Bpb19iaXQoZ3Bpb25yKSkpIHsKKwkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIklSUSAlZCIsIGlycSk7CisJCQlyZXQgPSBncGlvX3JlcXVlc3QoZ3Bpb25yLCBidWYpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhncGlvbnIpXSB8PSBncGlvX2JpdChncGlvbnIpOworCX0gZWxzZSB7CisJCWdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJj0gfmdwaW9fYml0KGdwaW9ucik7CisJCXJldHVybiAwOworCX0KKworCXNldF9ncGlvX2luZW4oZ3Bpb25yLCAwKTsKKwlzZXRfZ3Bpb19kaXIoZ3Bpb25yLCAwKTsKKworCWlmICgodHlwZSAmIChJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORykpCisJICAgID09IChJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORykpCisJCXNldF9ncGlvX2JvdGgoZ3Bpb25yLCAxKTsKKwllbHNlCisJCXNldF9ncGlvX2JvdGgoZ3Bpb25yLCAwKTsKKworCWlmICgodHlwZSAmIChJUlFfVFlQRV9FREdFX0ZBTExJTkcgfCBJUlFfVFlQRV9MRVZFTF9MT1cpKSkKKwkJc2V0X2dwaW9fcG9sYXIoZ3Bpb25yLCAxKTsJLyogbG93IG9yIGZhbGxpbmcgZWRnZSBkZW5vdGVkIGJ5IG9uZSAqLworCWVsc2UKKwkJc2V0X2dwaW9fcG9sYXIoZ3Bpb25yLCAwKTsJLyogaGlnaCBvciByaXNpbmcgZWRnZSBkZW5vdGVkIGJ5IHplcm8gKi8KKworCWlmICh0eXBlICYgKElSUV9UWVBFX0VER0VfUklTSU5HIHwgSVJRX1RZUEVfRURHRV9GQUxMSU5HKSkgeworCQlzZXRfZ3Bpb19lZGdlKGdwaW9uciwgMSk7CisJCXNldF9ncGlvX2luZW4oZ3Bpb25yLCAxKTsKKwkJZ3Bpb19lZGdlX3RyaWdnZXJlZFtncGlvX2JhbmsoZ3Bpb25yKV0gfD0gZ3Bpb19iaXQoZ3Bpb25yKTsKKwkJc2V0X2dwaW9fZGF0YShncGlvbnIsIDApOworCisJfSBlbHNlIHsKKwkJc2V0X2dwaW9fZWRnZShncGlvbnIsIDApOworCQlncGlvX2VkZ2VfdHJpZ2dlcmVkW2dwaW9fYmFuayhncGlvbnIpXSAmPSB+Z3Bpb19iaXQoZ3Bpb25yKTsKKwkJc2V0X2dwaW9faW5lbihncGlvbnIsIDEpOworCX0KKworCVNTWU5DKCk7CisKKwlpZiAodHlwZSAmIChJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORykpCisJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9lZGdlX2lycSk7CisJZWxzZQorCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitpbnQgYmZpbl9ncGlvX3NldF93YWtlKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBzdGF0ZSkKK3sKKwl1bnNpZ25lZCBncGlvID0gaXJxX3RvX2dwaW8oaXJxKTsKKworCWlmIChzdGF0ZSkKKwkJZ3Bpb19wbV93YWtldXBfcmVxdWVzdChncGlvLCBQTV9XQUtFX0lHTk9SRSk7CisJZWxzZQorCQlncGlvX3BtX3dha2V1cF9mcmVlKGdwaW8pOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBiZmluX2dwaW9faXJxY2hpcCA9IHsKKwkuYWNrID0gYmZpbl9ncGlvX2Fja19pcnEsCisJLm1hc2sgPSBiZmluX2dwaW9fbWFza19pcnEsCisJLm1hc2tfYWNrID0gYmZpbl9ncGlvX21hc2tfYWNrX2lycSwKKwkudW5tYXNrID0gYmZpbl9ncGlvX3VubWFza19pcnEsCisJLnNldF90eXBlID0gYmZpbl9ncGlvX2lycV90eXBlLAorCS5zdGFydHVwID0gYmZpbl9ncGlvX2lycV9zdGFydHVwLAorCS5zaHV0ZG93biA9IGJmaW5fZ3Bpb19pcnFfc2h1dGRvd24sCisjaWZkZWYgQ09ORklHX1BNCisJLnNldF93YWtlID0gYmZpbl9ncGlvX3NldF93YWtlLAorI2VuZGlmCit9OworCitzdGF0aWMgdm9pZCBiZmluX2RlbXV4X2dwaW9faXJxKHVuc2lnbmVkIGludCBpbnRhX2lycSwKKwkJCQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJdW5zaWduZWQgaW50IGksIGdwaW8sIG1hc2ssIGlycSwgc2VhcmNoID0gMDsKKworCXN3aXRjaCAoaW50YV9pcnEpIHsKKyNpZiBkZWZpbmVkKENPTkZJR19CRjUzeCkKKwljYXNlIElSUV9QUk9HX0lOVEE6CisJCWlycSA9IElSUV9QRjA7CisJCXNlYXJjaCA9IDE7CisJCWJyZWFrOworIyBpZiBkZWZpbmVkKEJGNTM3X0ZBTUlMWSkgJiYgIShkZWZpbmVkKENPTkZJR19CRklOX01BQykgfHwgZGVmaW5lZChDT05GSUdfQkZJTl9NQUNfTU9EVUxFKSkKKwljYXNlIElSUV9NQUNfUlg6CisJCWlycSA9IElSUV9QSDA7CisJCWJyZWFrOworIyBlbmRpZgorI2VsaWYgZGVmaW5lZChDT05GSUdfQkY1MngpCisJY2FzZSBJUlFfUE9SVEZfSU5UQToKKwkJaXJxID0gSVJRX1BGMDsKKwkJYnJlYWs7CisJY2FzZSBJUlFfUE9SVEdfSU5UQToKKwkJaXJxID0gSVJRX1BHMDsKKwkJYnJlYWs7CisJY2FzZSBJUlFfUE9SVEhfSU5UQToKKwkJaXJxID0gSVJRX1BIMDsKKwkJYnJlYWs7CisjZWxpZiBkZWZpbmVkKENPTkZJR19CRjU2MSkKKwljYXNlIElSUV9QUk9HMF9JTlRBOgorCQlpcnEgPSBJUlFfUEYwOworCQlicmVhazsKKwljYXNlIElSUV9QUk9HMV9JTlRBOgorCQlpcnEgPSBJUlFfUEYxNjsKKwkJYnJlYWs7CisJY2FzZSBJUlFfUFJPRzJfSU5UQToKKwkJaXJxID0gSVJRX1BGMzI7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc2VhcmNoKSB7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfQkxBQ0tGSU5fR1BJT1M7IGkgKz0gR1BJT19CQU5LU0laRSkgeworCQkJaXJxICs9IGk7CisKKwkJCW1hc2sgPSBnZXRfZ3Bpb3BfZGF0YShpKSAmCisJCQkJKGdwaW9fZW5hYmxlZFtncGlvX2JhbmsoaSldICYKKwkJCQlnZXRfZ3Bpb3BfbWFza2EoaSkpOworCisJCQl3aGlsZSAobWFzaykgeworCQkJCWlmIChtYXNrICYgMSkgeworCQkJCQlkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisJCQkJCWRlc2MtPmhhbmRsZV9pcnEoaXJxLCBkZXNjKTsKKwkJCQl9CisJCQkJaXJxKys7CisJCQkJbWFzayA+Pj0gMTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCQlncGlvID0gaXJxX3RvX2dwaW8oaXJxKTsKKwkJCW1hc2sgPSBnZXRfZ3Bpb3BfZGF0YShncGlvKSAmCisJCQkJKGdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3BpbyldICYKKwkJCQlnZXRfZ3Bpb3BfbWFza2EoZ3BpbykpOworCisJCQlkbyB7CisJCQkJaWYgKG1hc2sgJiAxKSB7CisJCQkJCWRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwkJCQkJZGVzYy0+aGFuZGxlX2lycShpcnEsIGRlc2MpOworCQkJCX0KKwkJCQlpcnErKzsKKwkJCQltYXNrID4+PSAxOworCQkJfSB3aGlsZSAobWFzayk7CisJfQorCit9CisKKyNlbHNlCQkJCS8qIENPTkZJR19CRjU0eCAqLworCisjZGVmaW5lIE5SX1BJTlRfU1lTX0lSUVMJNAorI2RlZmluZSBOUl9QSU5UX0JJVFMJCTMyCisjZGVmaW5lIE5SX1BJTlRTCQkxNjAKKyNkZWZpbmUgSVJRX05PVF9BVkFJTAkJMHhGRgorCisjZGVmaW5lIFBJTlRfMl9CQU5LKHgpCQkoKHgpID4+IDUpCisjZGVmaW5lIFBJTlRfMl9CSVQoeCkJCSgoeCkgJiAweDFGKQorI2RlZmluZSBQSU5UX0JJVCh4KQkJKDEgPDwgKFBJTlRfMl9CSVQoeCkpKQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBpcnEycGludF9sdXRbTlJfUElOVFNdOworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGludDJpcnFfbHV0W05SX1BJTlRfU1lTX0lSUVMgKiBOUl9QSU5UX0JJVFNdOworCitzdGF0aWMgdW5zaWduZWQgaW50IGdwaW9fYm90aF9lZGdlX3RyaWdnZXJlZFtOUl9QSU5UX1NZU19JUlFTXTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKE1BWF9CTEFDS0ZJTl9HUElPUyldOworCisKK3N0cnVjdCBwaW5faW50X3QgeworCXVuc2lnbmVkIGludCBtYXNrX3NldDsKKwl1bnNpZ25lZCBpbnQgbWFza19jbGVhcjsKKwl1bnNpZ25lZCBpbnQgcmVxdWVzdDsKKwl1bnNpZ25lZCBpbnQgYXNzaWduOworCXVuc2lnbmVkIGludCBlZGdlX3NldDsKKwl1bnNpZ25lZCBpbnQgZWRnZV9jbGVhcjsKKwl1bnNpZ25lZCBpbnQgaW52ZXJ0X3NldDsKKwl1bnNpZ25lZCBpbnQgaW52ZXJ0X2NsZWFyOworCXVuc2lnbmVkIGludCBwaW5zdGF0ZTsKKwl1bnNpZ25lZCBpbnQgbGF0Y2g7Cit9OworCitzdGF0aWMgc3RydWN0IHBpbl9pbnRfdCAqcGludFtOUl9QSU5UX1NZU19JUlFTXSA9IHsKKwkoc3RydWN0IHBpbl9pbnRfdCAqKVBJTlQwX01BU0tfU0VULAorCShzdHJ1Y3QgcGluX2ludF90ICopUElOVDFfTUFTS19TRVQsCisJKHN0cnVjdCBwaW5faW50X3QgKilQSU5UMl9NQVNLX1NFVCwKKwkoc3RydWN0IHBpbl9pbnRfdCAqKVBJTlQzX01BU0tfU0VULAorfTsKKwordW5zaWduZWQgc2hvcnQgZ2V0X2lycV9iYXNlKHU4IGJhbmssIHU4IGJtYXApCit7CisKKwl1MTYgaXJxX2Jhc2U7CisKKwlpZiAoYmFuayA8IDIpIHsJCS8qUEEtUEIgKi8KKwkJaXJxX2Jhc2UgPSBJUlFfUEEwICsgYm1hcCAqIDE2OworCX0gZWxzZSB7CQkvKlBDLVBKICovCisJCWlycV9iYXNlID0gSVJRX1BDMCArIGJtYXAgKiAxNjsKKwl9CisKKwlyZXR1cm4gaXJxX2Jhc2U7CisKK30KKworCS8qIFdoZW5ldmVyIFBJTlR4X0FTU0lHTiBpcyBhbHRlcmVkIGluaXRfcGludF9sdXQoKSBtdXN0IGJlIGV4ZWN1dGVkISAqLwordm9pZCBpbml0X3BpbnRfbHV0KHZvaWQpCit7CisJdTE2IGJhbmssIGJpdCwgaXJxX2Jhc2UsIGJpdF9wb3M7CisJdTMyIHBpbnRfYXNzaWduOworCXU4IGJtYXA7CisKKwltZW1zZXQoaXJxMnBpbnRfbHV0LCBJUlFfTk9UX0FWQUlMLCBzaXplb2YoaXJxMnBpbnRfbHV0KSk7CisKKwlmb3IgKGJhbmsgPSAwOyBiYW5rIDwgTlJfUElOVF9TWVNfSVJRUzsgYmFuaysrKSB7CisKKwkJcGludF9hc3NpZ24gPSBwaW50W2JhbmtdLT5hc3NpZ247CisKKwkJZm9yIChiaXQgPSAwOyBiaXQgPCBOUl9QSU5UX0JJVFM7IGJpdCsrKSB7CisKKwkJCWJtYXAgPSAocGludF9hc3NpZ24gPj4gKChiaXQgLyA4KSAqIDgpKSAmIDB4RkY7CisKKwkJCWlycV9iYXNlID0gZ2V0X2lycV9iYXNlKGJhbmssIGJtYXApOworCisJCQlpcnFfYmFzZSArPSAoYml0ICUgOCkgKyAoKGJpdCAvIDgpICYgMSA/IDggOiAwKTsKKwkJCWJpdF9wb3MgPSBiaXQgKyBiYW5rICogTlJfUElOVF9CSVRTOworCisJCQlwaW50MmlycV9sdXRbYml0X3Bvc10gPSBpcnFfYmFzZSAtIFNZU19JUlFTOworCQkJaXJxMnBpbnRfbHV0W2lycV9iYXNlIC0gU1lTX0lSUVNdID0gYml0X3BvczsKKworCQl9CisKKwl9CisKK30KKworc3RhdGljIHZvaWQgYmZpbl9ncGlvX2Fja19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1OCBwaW50X3ZhbCA9IGlycTJwaW50X2x1dFtpcnEgLSBTWVNfSVJRU107CisJdTMyIHBpbnRiaXQgPSBQSU5UX0JJVChwaW50X3ZhbCk7CisJdTggYmFuayA9IFBJTlRfMl9CQU5LKHBpbnRfdmFsKTsKKworCWlmICh1bmxpa2VseShncGlvX2JvdGhfZWRnZV90cmlnZ2VyZWRbYmFua10gJiBwaW50Yml0KSkgeworCQlpZiAocGludFtiYW5rXS0+aW52ZXJ0X3NldCAmIHBpbnRiaXQpCisJCQlwaW50W2JhbmtdLT5pbnZlcnRfY2xlYXIgPSBwaW50Yml0OworCQllbHNlCisJCQlwaW50W2JhbmtdLT5pbnZlcnRfc2V0ID0gcGludGJpdDsKKwl9CisJcGludFtiYW5rXS0+cmVxdWVzdCA9IHBpbnRiaXQ7CisKKwlTU1lOQygpOworfQorCitzdGF0aWMgdm9pZCBiZmluX2dwaW9fbWFza19hY2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdTggcGludF92YWwgPSBpcnEycGludF9sdXRbaXJxIC0gU1lTX0lSUVNdOworCXUzMiBwaW50Yml0ID0gUElOVF9CSVQocGludF92YWwpOworCXU4IGJhbmsgPSBQSU5UXzJfQkFOSyhwaW50X3ZhbCk7CisKKwlpZiAodW5saWtlbHkoZ3Bpb19ib3RoX2VkZ2VfdHJpZ2dlcmVkW2JhbmtdICYgcGludGJpdCkpIHsKKwkJaWYgKHBpbnRbYmFua10tPmludmVydF9zZXQgJiBwaW50Yml0KQorCQkJcGludFtiYW5rXS0+aW52ZXJ0X2NsZWFyID0gcGludGJpdDsKKwkJZWxzZQorCQkJcGludFtiYW5rXS0+aW52ZXJ0X3NldCA9IHBpbnRiaXQ7CisJfQorCisJcGludFtiYW5rXS0+cmVxdWVzdCA9IHBpbnRiaXQ7CisJcGludFtiYW5rXS0+bWFza19jbGVhciA9IHBpbnRiaXQ7CisJU1NZTkMoKTsKK30KKworc3RhdGljIHZvaWQgYmZpbl9ncGlvX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdTggcGludF92YWwgPSBpcnEycGludF9sdXRbaXJxIC0gU1lTX0lSUVNdOworCisJcGludFtQSU5UXzJfQkFOSyhwaW50X3ZhbCldLT5tYXNrX2NsZWFyID0gUElOVF9CSVQocGludF92YWwpOworCVNTWU5DKCk7Cit9CisKK3N0YXRpYyB2b2lkIGJmaW5fZ3Bpb191bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdTggcGludF92YWwgPSBpcnEycGludF9sdXRbaXJxIC0gU1lTX0lSUVNdOworCXUzMiBwaW50Yml0ID0gUElOVF9CSVQocGludF92YWwpOworCXU4IGJhbmsgPSBQSU5UXzJfQkFOSyhwaW50X3ZhbCk7CisKKwlwaW50W2JhbmtdLT5yZXF1ZXN0ID0gcGludGJpdDsKKwlwaW50W2JhbmtdLT5tYXNrX3NldCA9IHBpbnRiaXQ7CisJU1NZTkMoKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBiZmluX2dwaW9faXJxX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgcmV0OworCWNoYXIgYnVmWzhdOworCXUxNiBncGlvbnIgPSBpcnFfdG9fZ3BpbyhpcnEpOworCXU4IHBpbnRfdmFsID0gaXJxMnBpbnRfbHV0W2lycSAtIFNZU19JUlFTXTsKKworCWlmIChwaW50X3ZhbCA9PSBJUlFfTk9UX0FWQUlMKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkiR1BJTyBJUlEgJWQgOk5vdCBpbiBQSU5UIEFzc2lnbiB0YWJsZSAiCisJCSJSZWNvbmZpZ3VyZSBJbnRlcnJ1cHQgdG8gUG9ydCBBc3NpZ25lbXRcbiIsIGlycSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICghKGdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJiBncGlvX2JpdChncGlvbnIpKSkgeworCQlzbnByaW50ZihidWYsIHNpemVvZiBidWYsICJJUlEgJWQiLCBpcnEpOworCQlyZXQgPSBncGlvX3JlcXVlc3QoZ3Bpb25yLCBidWYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW9ucildIHw9IGdwaW9fYml0KGdwaW9ucik7CisJYmZpbl9ncGlvX3VubWFza19pcnEoaXJxKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGJmaW5fZ3Bpb19pcnFfc2h1dGRvd24odW5zaWduZWQgaW50IGlycSkKK3sKKwl1MTYgZ3Bpb25yID0gaXJxX3RvX2dwaW8oaXJxKTsKKworCWJmaW5fZ3Bpb19tYXNrX2lycShpcnEpOworCWdwaW9fZnJlZShncGlvbnIpOworCWdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gJj0gfmdwaW9fYml0KGdwaW9ucik7Cit9CisKK3N0YXRpYyBpbnQgYmZpbl9ncGlvX2lycV90eXBlKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCB0eXBlKQoreworCisJdW5zaWduZWQgaW50IHJldDsKKwljaGFyIGJ1Zls4XTsKKwl1MTYgZ3Bpb25yID0gaXJxX3RvX2dwaW8oaXJxKTsKKwl1OCBwaW50X3ZhbCA9IGlycTJwaW50X2x1dFtpcnEgLSBTWVNfSVJRU107CisJdTMyIHBpbnRiaXQgPSBQSU5UX0JJVChwaW50X3ZhbCk7CisJdTggYmFuayA9IFBJTlRfMl9CQU5LKHBpbnRfdmFsKTsKKworCWlmIChwaW50X3ZhbCA9PSBJUlFfTk9UX0FWQUlMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICh0eXBlID09IElSUV9UWVBFX1BST0JFKSB7CisJCS8qIG9ubHkgcHJvYmUgdW5lbmFibGVkIEdQSU8gaW50ZXJydXB0IGxpbmVzICovCisJCWlmIChncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW9ucildICYgZ3Bpb19iaXQoZ3Bpb25yKSkKKwkJCXJldHVybiAwOworCQl0eXBlID0gSVJRX1RZUEVfRURHRV9SSVNJTkcgfCBJUlFfVFlQRV9FREdFX0ZBTExJTkc7CisJfQorCisJaWYgKHR5cGUgJiAoSVJRX1RZUEVfRURHRV9SSVNJTkcgfCBJUlFfVFlQRV9FREdFX0ZBTExJTkcgfAorCQkgICAgSVJRX1RZUEVfTEVWRUxfSElHSCB8IElSUV9UWVBFX0xFVkVMX0xPVykpIHsKKwkJaWYgKCEoZ3Bpb19lbmFibGVkW2dwaW9fYmFuayhncGlvbnIpXSAmIGdwaW9fYml0KGdwaW9ucikpKSB7CisJCQlzbnByaW50ZihidWYsIHNpemVvZiBidWYsICJJUlEgJWQiLCBpcnEpOworCQkJcmV0ID0gZ3Bpb19yZXF1ZXN0KGdwaW9uciwgYnVmKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWdwaW9fZW5hYmxlZFtncGlvX2JhbmsoZ3Bpb25yKV0gfD0gZ3Bpb19iaXQoZ3Bpb25yKTsKKwl9IGVsc2UgeworCQlncGlvX2VuYWJsZWRbZ3Bpb19iYW5rKGdwaW9ucildICY9IH5ncGlvX2JpdChncGlvbnIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlncGlvX2RpcmVjdGlvbl9pbnB1dChncGlvbnIpOworCisJaWYgKCh0eXBlICYgKElSUV9UWVBFX0VER0VfRkFMTElORyB8IElSUV9UWVBFX0xFVkVMX0xPVykpKQorCQlwaW50W2JhbmtdLT5pbnZlcnRfc2V0ID0gcGludGJpdDsJLyogbG93IG9yIGZhbGxpbmcgZWRnZSBkZW5vdGVkIGJ5IG9uZSAqLworCWVsc2UKKwkJcGludFtiYW5rXS0+aW52ZXJ0X2NsZWFyID0gcGludGJpdDsJLyogaGlnaCBvciByaXNpbmcgZWRnZSBkZW5vdGVkIGJ5IHplcm8gKi8KKworCWlmICgodHlwZSAmIChJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORykpCisJICAgID09IChJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORykpIHsKKworCQlncGlvX2JvdGhfZWRnZV90cmlnZ2VyZWRbYmFua10gfD0gcGludGJpdDsKKworCQlpZiAoZ3Bpb19nZXRfdmFsdWUoZ3Bpb25yKSkKKwkJCXBpbnRbYmFua10tPmludmVydF9zZXQgPSBwaW50Yml0OworCQllbHNlCisJCQlwaW50W2JhbmtdLT5pbnZlcnRfY2xlYXIgPSBwaW50Yml0OworCX0gZWxzZSB7CisJCWdwaW9fYm90aF9lZGdlX3RyaWdnZXJlZFtiYW5rXSAmPSB+cGludGJpdDsKKwl9CisKKwlpZiAodHlwZSAmIChJUlFfVFlQRV9FREdFX1JJU0lORyB8IElSUV9UWVBFX0VER0VfRkFMTElORykpIHsKKwkJcGludFtiYW5rXS0+ZWRnZV9zZXQgPSBwaW50Yml0OworCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfZWRnZV9pcnEpOworCX0gZWxzZSB7CisJCXBpbnRbYmFua10tPmVkZ2VfY2xlYXIgPSBwaW50Yml0OworCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKKwl9CisKKwlTU1lOQygpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3UzMiBwaW50X3NhdmVkX21hc2tzW05SX1BJTlRfU1lTX0lSUVNdOwordTMyIHBpbnRfd2FrZXVwX21hc2tzW05SX1BJTlRfU1lTX0lSUVNdOworCitpbnQgYmZpbl9ncGlvX3NldF93YWtlKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBzdGF0ZSkKK3sKKwl1MzIgcGludF9pcnE7CisJdTggcGludF92YWwgPSBpcnEycGludF9sdXRbaXJxIC0gU1lTX0lSUVNdOworCXUzMiBiYW5rID0gUElOVF8yX0JBTksocGludF92YWwpOworCXUzMiBwaW50Yml0ID0gUElOVF9CSVQocGludF92YWwpOworCisJc3dpdGNoIChiYW5rKSB7CisJY2FzZSAwOgorCQlwaW50X2lycSA9IElSUV9QSU5UMDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlwaW50X2lycSA9IElSUV9QSU5UMjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlwaW50X2lycSA9IElSUV9QSU5UMzsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlwaW50X2lycSA9IElSUV9QSU5UMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYmZpbl9pbnRlcm5hbF9zZXRfd2FrZShwaW50X2lycSwgc3RhdGUpOworCisJaWYgKHN0YXRlKQorCQlwaW50X3dha2V1cF9tYXNrc1tiYW5rXSB8PSBwaW50Yml0OworCWVsc2UKKwkJcGludF93YWtldXBfbWFza3NbYmFua10gJj0gfnBpbnRiaXQ7CisKKwlyZXR1cm4gMDsKK30KKwordTMyIGJmaW5fcG1fc2V0dXAodm9pZCkKK3sKKwl1MzIgdmFsLCBpOworCisJZm9yIChpID0gMDsgaSA8IE5SX1BJTlRfU1lTX0lSUVM7IGkrKykgeworCQl2YWwgPSBwaW50W2ldLT5tYXNrX2NsZWFyOworCQlwaW50X3NhdmVkX21hc2tzW2ldID0gdmFsOworCQlpZiAodmFsIF4gcGludF93YWtldXBfbWFza3NbaV0pIHsKKwkJCXBpbnRbaV0tPm1hc2tfY2xlYXIgPSB2YWw7CisJCQlwaW50W2ldLT5tYXNrX3NldCA9IHBpbnRfd2FrZXVwX21hc2tzW2ldOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYmZpbl9wbV9yZXN0b3JlKHZvaWQpCit7CisJdTMyIGksIHZhbDsKKworCWZvciAoaSA9IDA7IGkgPCBOUl9QSU5UX1NZU19JUlFTOyBpKyspIHsKKwkJdmFsID0gcGludF9zYXZlZF9tYXNrc1tpXTsKKwkJaWYgKHZhbCBeIHBpbnRfd2FrZXVwX21hc2tzW2ldKSB7CisJCQlwaW50W2ldLT5tYXNrX2NsZWFyID0gcGludFtpXS0+bWFza19jbGVhcjsKKwkJCXBpbnRbaV0tPm1hc2tfc2V0ID0gdmFsOworCQl9CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgYmZpbl9ncGlvX2lycWNoaXAgPSB7CisJLmFjayA9IGJmaW5fZ3Bpb19hY2tfaXJxLAorCS5tYXNrID0gYmZpbl9ncGlvX21hc2tfaXJxLAorCS5tYXNrX2FjayA9IGJmaW5fZ3Bpb19tYXNrX2Fja19pcnEsCisJLnVubWFzayA9IGJmaW5fZ3Bpb191bm1hc2tfaXJxLAorCS5zZXRfdHlwZSA9IGJmaW5fZ3Bpb19pcnFfdHlwZSwKKwkuc3RhcnR1cCA9IGJmaW5fZ3Bpb19pcnFfc3RhcnR1cCwKKwkuc2h1dGRvd24gPSBiZmluX2dwaW9faXJxX3NodXRkb3duLAorI2lmZGVmIENPTkZJR19QTQorCS5zZXRfd2FrZSA9IGJmaW5fZ3Bpb19zZXRfd2FrZSwKKyNlbmRpZgorfTsKKworc3RhdGljIHZvaWQgYmZpbl9kZW11eF9ncGlvX2lycSh1bnNpZ25lZCBpbnQgaW50YV9pcnEsCisJCQkJc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXU4IGJhbmssIHBpbnRfdmFsOworCXUzMiByZXF1ZXN0LCBpcnE7CisKKwlzd2l0Y2ggKGludGFfaXJxKSB7CisJY2FzZSBJUlFfUElOVDA6CisJCWJhbmsgPSAwOworCQlicmVhazsKKwljYXNlIElSUV9QSU5UMjoKKwkJYmFuayA9IDI7CisJCWJyZWFrOworCWNhc2UgSVJRX1BJTlQzOgorCQliYW5rID0gMzsKKwkJYnJlYWs7CisJY2FzZSBJUlFfUElOVDE6CisJCWJhbmsgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCisJcGludF92YWwgPSBiYW5rICogTlJfUElOVF9CSVRTOworCisJcmVxdWVzdCA9IHBpbnRbYmFua10tPnJlcXVlc3Q7CisKKwl3aGlsZSAocmVxdWVzdCkgeworCQlpZiAocmVxdWVzdCAmIDEpIHsKKwkJCWlycSA9IHBpbnQyaXJxX2x1dFtwaW50X3ZhbF0gKyBTWVNfSVJRUzsKKwkJCWRlc2MgPSBpcnFfZGVzYyArIGlycTsKKwkJCWRlc2MtPmhhbmRsZV9pcnEoaXJxLCBkZXNjKTsKKwkJfQorCQlwaW50X3ZhbCsrOworCQlyZXF1ZXN0ID4+PSAxOworCX0KKworfQorI2VuZGlmCisKK3ZvaWQgX19pbml0IGluaXRfZXhjZXB0aW9uX3ZlY3RvcnModm9pZCkKK3sKKwlTU1lOQygpOworCisJLyogY2Fubm90IHByb2dyYW0gaW4gc29mdHdhcmU6CisJICogZXZ0MCAtIGVtdWxhdGlvbiAoanRhZykKKwkgKiBldnQxIC0gcmVzZXQKKwkgKi8KKwliZmluX3dyaXRlX0VWVDIoZXZ0X25taSk7CisJYmZpbl93cml0ZV9FVlQzKHRyYXApOworCWJmaW5fd3JpdGVfRVZUNShldnRfaXZodyk7CisJYmZpbl93cml0ZV9FVlQ2KGV2dF90aW1lcik7CisJYmZpbl93cml0ZV9FVlQ3KGV2dF9ldnQ3KTsKKwliZmluX3dyaXRlX0VWVDgoZXZ0X2V2dDgpOworCWJmaW5fd3JpdGVfRVZUOShldnRfZXZ0OSk7CisJYmZpbl93cml0ZV9FVlQxMChldnRfZXZ0MTApOworCWJmaW5fd3JpdGVfRVZUMTEoZXZ0X2V2dDExKTsKKwliZmluX3dyaXRlX0VWVDEyKGV2dF9ldnQxMik7CisJYmZpbl93cml0ZV9FVlQxMyhldnRfZXZ0MTMpOworCWJmaW5fd3JpdGVfRVZUMTQoZXZ0MTRfc29mdGlycSk7CisJYmZpbl93cml0ZV9FVlQxNShldnRfc3lzdGVtX2NhbGwpOworCUNTWU5DKCk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZHVyaW5nIGtlcm5lbCBzdGFydHVwIHRvIGluaXRpYWxpemUKKyAqIHRoZSBCRmluIElSUSBoYW5kbGluZyByb3V0aW5lcy4KKyAqLworaW50IF9faW5pdCBpbml0X2FyY2hfaXJxKHZvaWQpCit7CisJaW50IGlycTsKKwl1bnNpZ25lZCBsb25nIGlsYXQgPSAwOworCS8qICBEaXNhYmxlIGFsbCB0aGUgcGVyaXBoZXJhbCBpbnRycyAgLSBwYWdlIDQtMjkgSFcgUmVmIG1hbnVhbCAqLworI2lmIGRlZmluZWQoQ09ORklHX0JGNTR4KSB8fCBkZWZpbmVkKENPTkZJR19CRjUyeCkgfHwgZGVmaW5lZChDT05GSUdfQkY1NjEpCisJYmZpbl93cml0ZV9TSUNfSU1BU0swKFNJQ19VTk1BU0tfQUxMKTsKKwliZmluX3dyaXRlX1NJQ19JTUFTSzEoU0lDX1VOTUFTS19BTEwpOworCWJmaW5fd3JpdGVfU0lDX0lXUjAoSVdSX0VOQUJMRV9BTEwpOworCWJmaW5fd3JpdGVfU0lDX0lXUjEoSVdSX0VOQUJMRV9BTEwpOworIyBpZmRlZiBDT05GSUdfQkY1NHgKKwliZmluX3dyaXRlX1NJQ19JTUFTSzIoU0lDX1VOTUFTS19BTEwpOworCWJmaW5fd3JpdGVfU0lDX0lXUjIoSVdSX0VOQUJMRV9BTEwpOworIyBlbmRpZgorI2Vsc2UKKwliZmluX3dyaXRlX1NJQ19JTUFTSyhTSUNfVU5NQVNLX0FMTCk7CisJYmZpbl93cml0ZV9TSUNfSVdSKElXUl9FTkFCTEVfQUxMKTsKKyNlbmRpZgorCVNTWU5DKCk7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJaW5pdF9leGNlcHRpb25fYnVmZigpOworCisjaWZkZWYgQ09ORklHX0JGNTR4CisjIGlmZGVmIENPTkZJR19QSU5UeF9SRUFTU0lHTgorCXBpbnRbMF0tPmFzc2lnbiA9IENPTkZJR19QSU5UMF9BU1NJR047CisJcGludFsxXS0+YXNzaWduID0gQ09ORklHX1BJTlQxX0FTU0lHTjsKKwlwaW50WzJdLT5hc3NpZ24gPSBDT05GSUdfUElOVDJfQVNTSUdOOworCXBpbnRbM10tPmFzc2lnbiA9IENPTkZJR19QSU5UM19BU1NJR047CisjIGVuZGlmCisJLyogV2hlbmV2ZXIgUElOVHhfQVNTSUdOIGlzIGFsdGVyZWQgaW5pdF9waW50X2x1dCgpIG11c3QgYmUgZXhlY3V0ZWQhICovCisJaW5pdF9waW50X2x1dCgpOworI2VuZGlmCisKKwlmb3IgKGlycSA9IDA7IGlycSA8PSBTWVNfSVJRUzsgaXJxKyspIHsKKwkJaWYgKGlycSA8PSBJUlFfQ09SRVRNUikKKwkJCXNldF9pcnFfY2hpcChpcnEsICZiZmluX2NvcmVfaXJxY2hpcCk7CisJCWVsc2UKKwkJCXNldF9pcnFfY2hpcChpcnEsICZiZmluX2ludGVybmFsX2lycWNoaXApOworI2lmZGVmIEJGNTM3X0dFTkVSSUNfRVJST1JfSU5UX0RFTVVYCisJCWlmIChpcnEgIT0gSVJRX0dFTkVSSUNfRVJST1IpIHsKKyNlbmRpZgorCisJCQlzd2l0Y2ggKGlycSkgeworI2lmIGRlZmluZWQoQ09ORklHX0JGNTN4KQorCQkJY2FzZSBJUlFfUFJPR19JTlRBOgorCQkJCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKGlycSwKKwkJCQkJCQliZmluX2RlbXV4X2dwaW9faXJxKTsKKwkJCQlicmVhazsKKyMgaWYgZGVmaW5lZChCRjUzN19GQU1JTFkpICYmICEoZGVmaW5lZChDT05GSUdfQkZJTl9NQUMpIHx8IGRlZmluZWQoQ09ORklHX0JGSU5fTUFDX01PRFVMRSkpCisJCQljYXNlIElSUV9NQUNfUlg6CisJCQkJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoaXJxLAorCQkJCQkJCWJmaW5fZGVtdXhfZ3Bpb19pcnEpOworCQkJCWJyZWFrOworIyBlbmRpZgorI2VsaWYgZGVmaW5lZChDT05GSUdfQkY1NHgpCisJCQljYXNlIElSUV9QSU5UMDoKKwkJCQlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihpcnEsCisJCQkJCQkJYmZpbl9kZW11eF9ncGlvX2lycSk7CisJCQkJYnJlYWs7CisJCQljYXNlIElSUV9QSU5UMToKKwkJCQlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihpcnEsCisJCQkJCQkJYmZpbl9kZW11eF9ncGlvX2lycSk7CisJCQkJYnJlYWs7CisJCQljYXNlIElSUV9QSU5UMjoKKwkJCQlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihpcnEsCisJCQkJCQkJYmZpbl9kZW11eF9ncGlvX2lycSk7CisJCQkJYnJlYWs7CisJCQljYXNlIElSUV9QSU5UMzoKKwkJCQlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihpcnEsCisJCQkJCQkJYmZpbl9kZW11eF9ncGlvX2lycSk7CisJCQkJYnJlYWs7CisjZWxpZiBkZWZpbmVkKENPTkZJR19CRjUyeCkKKwkJCWNhc2UgSVJRX1BPUlRGX0lOVEE6CisJCQkJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoaXJxLAorCQkJCQkJCWJmaW5fZGVtdXhfZ3Bpb19pcnEpOworCQkJCWJyZWFrOworCQkJY2FzZSBJUlFfUE9SVEdfSU5UQToKKwkJCQlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihpcnEsCisJCQkJCQkJYmZpbl9kZW11eF9ncGlvX2lycSk7CisJCQkJYnJlYWs7CisJCQljYXNlIElSUV9QT1JUSF9JTlRBOgorCQkJCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKGlycSwKKwkJCQkJCQliZmluX2RlbXV4X2dwaW9faXJxKTsKKwkJCQlicmVhazsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0JGNTYxKQorCQkJY2FzZSBJUlFfUFJPRzBfSU5UQToKKwkJCQlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihpcnEsCisJCQkJCQkJYmZpbl9kZW11eF9ncGlvX2lycSk7CisJCQkJYnJlYWs7CisJCQljYXNlIElSUV9QUk9HMV9JTlRBOgorCQkJCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKGlycSwKKwkJCQkJCQliZmluX2RlbXV4X2dwaW9faXJxKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSVJRX1BST0cyX0lOVEE6CisJCQkJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoaXJxLAorCQkJCQkJCWJmaW5fZGVtdXhfZ3Bpb19pcnEpOworCQkJCWJyZWFrOworI2VuZGlmCisJCQlkZWZhdWx0OgorCQkJCXNldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZV9zaW1wbGVfaXJxKTsKKwkJCQlicmVhazsKKwkJCX0KKworI2lmZGVmIEJGNTM3X0dFTkVSSUNfRVJST1JfSU5UX0RFTVVYCisJCX0gZWxzZSB7CisJCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBiZmluX2RlbXV4X2Vycm9yX2lycSk7CisJCX0KKyNlbmRpZgorCX0KKyNpZmRlZiBCRjUzN19HRU5FUklDX0VSUk9SX0lOVF9ERU1VWAorCWZvciAoaXJxID0gSVJRX1BQSV9FUlJPUjsgaXJxIDw9IElSUV9VQVJUMV9FUlJPUjsgaXJxKyspIHsKKwkJc2V0X2lycV9jaGlwKGlycSwgJmJmaW5fZ2VuZXJpY19lcnJvcl9pcnFjaGlwKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2xldmVsX2lycSk7CisJfQorI2VuZGlmCisKKwlmb3IgKGlycSA9IEdQSU9fSVJRX0JBU0U7IGlycSA8IE5SX0lSUVM7IGlycSsrKSB7CisKKwkJc2V0X2lycV9jaGlwKGlycSwgJmJmaW5fZ3Bpb19pcnFjaGlwKTsKKwkJLyogaWYgY29uZmlndXJlZCBhcyBlZGdlLCB0aGVuIHdpbGwgYmUgY2hhbmdlZCB0byBkb19lZGdlX0lSUSAqLworCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKKwl9CisKKwliZmluX3dyaXRlX0lNQVNLKDApOworCUNTWU5DKCk7CisJaWxhdCA9IGJmaW5fcmVhZF9JTEFUKCk7CisJQ1NZTkMoKTsKKwliZmluX3dyaXRlX0lMQVQoaWxhdCk7CisJQ1NZTkMoKTsKKworCXByaW50ayhLRVJOX0lORk8gIkNvbmZpZ3VyaW5nIEJsYWNrZmluIFByaW9yaXR5IERyaXZlbiBJbnRlcnJ1cHRzXG4iKTsKKwkvKiBJTUFTSz14eHggaXMgZXF1aXZhbGVudCB0byBTVEkgeHggb3IgaXJxX2ZsYWdzPXh4LAorCSAqIGxvY2FsX2lycV9lbmFibGUoKQorCSAqLworCXByb2dyYW1fSUFSKCk7CisJLyogVGhlcmVmb3JlIGl0J3MgYmV0dGVyIHRvIHNldHVwIElBUnMgYmVmb3JlIGludGVycnVwdHMgZW5hYmxlZCAqLworCXNlYXJjaF9JQVIoKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIElWRzctMTUgKi8KKwlpcnFfZmxhZ3MgPSBpcnFfZmxhZ3MgfCBJTUFTS19JVkcxNSB8CisJICAgIElNQVNLX0lWRzE0IHwgSU1BU0tfSVZHMTMgfCBJTUFTS19JVkcxMiB8IElNQVNLX0lWRzExIHwKKwkgICAgSU1BU0tfSVZHMTAgfCBJTUFTS19JVkc5IHwgSU1BU0tfSVZHOCB8IElNQVNLX0lWRzcgfCBJTUFTS19JVkdIVzsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0RPX0lSUV9MMQorX19hdHRyaWJ1dGVfXygobDFfdGV4dCkpCisjZW5kaWYKK3ZvaWQgZG9faXJxKGludCB2ZWMsIHN0cnVjdCBwdF9yZWdzICpmcCkKK3sKKwlpZiAodmVjID09IEVWVF9JVlRNUl9QKSB7CisJCXZlYyA9IElSUV9DT1JFVE1SOworCX0gZWxzZSB7CisJCXN0cnVjdCBpdmd4ICppdmcgPSBpdmc3XzEzW3ZlYyAtIElWRzddLmlmaXJzdDsKKwkJc3RydWN0IGl2Z3ggKml2Z19zdG9wID0gaXZnN18xM1t2ZWMgLSBJVkc3XS5pc3RvcDsKKyNpZiBkZWZpbmVkKENPTkZJR19CRjU0eCkgfHwgZGVmaW5lZChDT05GSUdfQkY1MngpIHx8IGRlZmluZWQoQ09ORklHX0JGNTYxKQorCQl1bnNpZ25lZCBsb25nIHNpY19zdGF0dXNbM107CisKKwkJU1NZTkMoKTsKKwkJc2ljX3N0YXR1c1swXSA9IGJmaW5fcmVhZF9TSUNfSVNSMCgpICYgYmZpbl9yZWFkX1NJQ19JTUFTSzAoKTsKKwkJc2ljX3N0YXR1c1sxXSA9IGJmaW5fcmVhZF9TSUNfSVNSMSgpICYgYmZpbl9yZWFkX1NJQ19JTUFTSzEoKTsKKyNpZmRlZiBDT05GSUdfQkY1NHgKKwkJc2ljX3N0YXR1c1syXSA9IGJmaW5fcmVhZF9TSUNfSVNSMigpICYgYmZpbl9yZWFkX1NJQ19JTUFTSzIoKTsKKyNlbmRpZgorCQlmb3IgKDs7IGl2ZysrKSB7CisJCQlpZiAoaXZnID49IGl2Z19zdG9wKSB7CisJCQkJYXRvbWljX2luYygmbnVtX3NwdXJpb3VzKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpZiAoc2ljX3N0YXR1c1soaXZnLT5pcnFubyAtIElWRzcpIC8gMzJdICYgaXZnLT5pc3JmbGFnKQorCQkJCWJyZWFrOworCQl9CisjZWxzZQorCQl1bnNpZ25lZCBsb25nIHNpY19zdGF0dXM7CisJCVNTWU5DKCk7CisJCXNpY19zdGF0dXMgPSBiZmluX3JlYWRfU0lDX0lNQVNLKCkgJiBiZmluX3JlYWRfU0lDX0lTUigpOworCisJCWZvciAoOzsgaXZnKyspIHsKKwkJCWlmIChpdmcgPj0gaXZnX3N0b3ApIHsKKwkJCQlhdG9taWNfaW5jKCZudW1fc3B1cmlvdXMpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSBpZiAoc2ljX3N0YXR1cyAmIGl2Zy0+aXNyZmxhZykKKwkJCQlicmVhazsKKwkJfQorI2VuZGlmCisJCXZlYyA9IGl2Zy0+aXJxbm87CisJfQorCWFzbV9kb19JUlEodmVjLCBmcCk7CisKKyNpZmRlZiBDT05GSUdfS0dEQgorCWtnZGJfcHJvY2Vzc19icmVha3BvaW50KCk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vcG0uYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vcG0uYwppbmRleCA4MTkzMGY3Li4wYmU4MDVjIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL3BtLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9wbS5jCkBAIC00LDcgKzQsNyBAQAogICogQXV0aG9yOiAgICAgICBDbGlmZiBCcmFrZSA8Y2JyYWtlQGFjY2VsZW50LmNvbT4gQ29weXJpZ2h0IChjKSAyMDAxCiAgKgogICogQ3JlYXRlZDogICAgICAyMDAxCi0gKiBEZXNjcmlwdGlvbjogIFBvd2VyIG1hbmFnZW1lbnQgZm9yIHRoZSBiZmluCisgKiBEZXNjcmlwdGlvbjogIEJsYWNrZmluIHBvd2VyIG1hbmFnZW1lbnQKICAqCiAgKiBNb2RpZmllZDogICAgIE5pY29sYXMgUGl0cmUgLSBQWEEyNTAgc3VwcG9ydAogICogICAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAyIE1vbnRhIFZpc3RhIFNvZnR3YXJlLCBJbmMuCkBAIC0xMiw3ICsxMiw3IEBACiAgKiAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDIgTW9udGEgVmlzdGEgU29mdHdhcmUsIEluYy4KICAqICAgICAgICAgICAgICAgRGlyayBCZWhtZSA8ZGlyay5iZWhtZUBkZS5ib3NjaC5jb20+IC0gT01BUDE1MTAvMTYxMAogICogICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQKLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDQtMjAwNiBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKiAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDA0LTIwMDggQW5hbG9nIERldmljZXMgSW5jLgogICoKICAqIEJ1Z3M6ICAgICAgICAgRW50ZXIgYnVncyBhdCBodHRwOi8vYmxhY2tmaW4udWNsaW51eC5vcmcvCiAgKgpAQCAtNjcsNDIgKzY3LDMwIEBACiAJZ3Bpb19wbV93YWtldXBfcmVxdWVzdChDT05GSUdfUE1fV0FLRVVQX0dQSU9fTlVNQkVSLCBXQUtFVVBfVFlQRSk7CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX1BNX1dBS0VVUF9CWV9HUElPKSB8fCBkZWZpbmVkKENPTkZJR19QTV9XQUtFVVBfR1BJT19BUEkpCi0JewotCQl1MzIgZmxhZ3M7CisJdTMyIGZsYWdzOwogCi0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJYmZpbl9wbV9zZXR1cCgpOwogCi0JCXNsZWVwX2RlZXBlcihncGlvX3BtX3NldHVwKCkpOyAvKkdvdG8gU2xlZXAqLwotCi0JCWdwaW9fcG1fcmVzdG9yZSgpOwotCi0jaWYgZGVmaW5lZChDT05GSUdfQkY1NHgpIHx8IGRlZmluZWQoQ09ORklHX0JGNTJ4KQotCQliZmluX3dyaXRlX1NJQ19JV1IwKElXUl9FTkFCTEVfQUxMKTsKLQkJYmZpbl93cml0ZV9TSUNfSVdSMShJV1JfRU5BQkxFX0FMTCk7Ci0jIGlmZGVmIENPTkZJR19CRjU0eAotCQliZmluX3dyaXRlX1NJQ19JV1IyKElXUl9FTkFCTEVfQUxMKTsKLSMgZW5kaWYKKyNpZmRlZiBDT05GSUdfUE1fQkZJTl9TTEVFUF9ERUVQRVIKKwlzbGVlcF9kZWVwZXIoYmZpbl9zaWNfaXdyWzBdLCBiZmluX3NpY19pd3JbMV0sIGJmaW5fc2ljX2l3clsyXSk7CiAjZWxzZQotCQliZmluX3dyaXRlX1NJQ19JV1IoSVdSX0VOQUJMRV9BTEwpOworCXNsZWVwX21vZGUoYmZpbl9zaWNfaXdyWzBdLCBiZmluX3NpY19pd3JbMV0sIGJmaW5fc2ljX2l3clsyXSk7CiAjZW5kaWYKIAotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JfQotI2VuZGlmCisJYmZpbl9wbV9yZXN0b3JlKCk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19QTV9XQUtFVVBfR1BJT19CWV9TSUNfSVdSKQotCXNsZWVwX2RlZXBlcihDT05GSUdfUE1fV0FLRVVQX1NJQ19JV1IpOwotIyBpZiBkZWZpbmVkKENPTkZJR19CRjU0eCkgfHwgZGVmaW5lZChDT05GSUdfQkY1MngpCisjaWYgZGVmaW5lZChDT05GSUdfQkY1NHgpIHx8IGRlZmluZWQoQ09ORklHX0JGNTJ4KSAgfHwgZGVmaW5lZChDT05GSUdfQkY1NjEpCiAJYmZpbl93cml0ZV9TSUNfSVdSMChJV1JfRU5BQkxFX0FMTCk7CiAJYmZpbl93cml0ZV9TSUNfSVdSMShJV1JfRU5BQkxFX0FMTCk7Ci0jICBpZmRlZiBDT05GSUdfQkY1NHgKKyMgaWZkZWYgQ09ORklHX0JGNTR4CiAJYmZpbl93cml0ZV9TSUNfSVdSMihJV1JfRU5BQkxFX0FMTCk7Ci0jICBlbmRpZgotIyBlbHNlCi0JYmZpbl93cml0ZV9TSUNfSVdSKElXUl9FTkFCTEVfQUxMKTsKICMgZW5kaWYKLSNlbmRpZgkJCQkvKiBDT05GSUdfUE1fV0FLRVVQX0dQSU9fQllfU0lDX0lXUiAqLworI2Vsc2UKKwliZmluX3dyaXRlX1NJQ19JV1IoSVdSX0VOQUJMRV9BTEwpOworI2VuZGlmCisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21tL2luaXQuYyBiL2FyY2gvYmxhY2tmaW4vbW0vaW5pdC5jCmluZGV4IGViMWExMmEuLjFmNTE2YzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbW0vaW5pdC5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbW0vaW5pdC5jCkBAIC0xMzgsOCArMTM4LDcgQEAKIAogCXN0YXJ0X21lbSA9IFBBR0VfQUxJR04oc3RhcnRfbWVtKTsKIAltYXhfbWFwbnIgPSBudW1fcGh5c3BhZ2VzID0gTUFQX05SKGhpZ2hfbWVtb3J5KTsKLQlwcmludGsoS0VSTl9JTkZPICJLZXJuZWwgbWFuYWdlZCBwaHlzaWNhbCBwYWdlczogJWx1XG4iLAotCQludW1fcGh5c3BhZ2VzKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiS2VybmVsIG1hbmFnZWQgcGh5c2ljYWwgcGFnZXM6ICVsdVxuIiwgbnVtX3BoeXNwYWdlcyk7CiAKIAkvKiBUaGlzIHdpbGwgcHV0IGFsbCBtZW1vcnkgb250byB0aGUgZnJlZWxpc3RzLiAqLwogCXRvdGFscmFtX3BhZ2VzID0gZnJlZV9hbGxfYm9vdG1lbSgpOwpAQCAtMTUzLDggKzE1Miw3IEBACiAJLyogZG8gbm90IGNvdW50IGluIGtlcm5lbCBpbWFnZSBiZXR3ZWVuIF9yYW1iYXNlIGFuZCBfcmFtc3RhcnQgKi8KIAlyZXNlcnZlZHBhZ2VzIC09IChfcmFtc3RhcnQgLSBfcmFtYmFzZSkgPj4gUEFHRV9TSElGVDsKICNpZiAoZGVmaW5lZChDT05GSUdfQkZJTl9JQ0FDSEUpICYmIEFOT01BTFlfMDUwMDAyNjMpCi0JcmVzZXJ2ZWRwYWdlcyArPSAoX3JhbWVuZCAtIG1lbW9yeV9lbmQgLSBETUFfVU5DQUNIRURfUkVHSU9OKSA+PgotCQkJCVBBR0VfU0hJRlQ7CisJcmVzZXJ2ZWRwYWdlcyArPSAoX3JhbWVuZCAtIG1lbW9yeV9lbmQgLSBETUFfVU5DQUNIRURfUkVHSU9OKSA+PiBQQUdFX1NISUZUOwogI2VuZGlmCiAKIAljb2RlayA9IChfZXRleHQgLSBfc3RleHQpID4+IDEwOwpAQCAtMTYzLDExICsxNjEsOSBAQAogCiAJcHJpbnRrKEtFUk5fSU5GTwogCSAgICAgIk1lbW9yeSBhdmFpbGFibGU6ICVsdWsvJWx1ayBSQU0sICIKLQkJIigldWsgaW5pdCBjb2RlLCAldWsga2VybmVsIGNvZGUsICIKLQkJIiV1ayBkYXRhLCAldWsgZG1hLCAldWsgcmVzZXJ2ZWQpXG4iLAorCQkiKCV1ayBpbml0IGNvZGUsICV1ayBrZXJuZWwgY29kZSwgJXVrIGRhdGEsICV1ayBkbWEsICV1ayByZXNlcnZlZClcbiIsCiAJCSh1bnNpZ25lZCBsb25nKSBmcmVlcGFnZXMgPDwgKFBBR0VfU0hJRlQtMTApLCBfcmFtZW5kID4+IDEwLAotCQlpbml0aywgY29kZWssIGRhdGFrLCBETUFfVU5DQUNIRURfUkVHSU9OID4+IDEwLAotCQkocmVzZXJ2ZWRwYWdlcyA8PCAoUEFHRV9TSElGVC0xMCkpKTsKKwkJaW5pdGssIGNvZGVrLCBkYXRhaywgRE1BX1VOQ0FDSEVEX1JFR0lPTiA+PiAxMCwgKHJlc2VydmVkcGFnZXMgPDwgKFBBR0VfU0hJRlQtMTApKSk7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBibGFja2ZpbiBMMSBNZW1vcnkuICovCiAJbDFzcmFtX2luaXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9LY29uZmlnIGIvYXJjaC9jcmlzL0tjb25maWcKaW5kZXggMjdiMDgyYS4uODQ1NmJjOCAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL0tjb25maWcKKysrIGIvYXJjaC9jcmlzL0tjb25maWcKQEAgLTEzLDEwICsxMyw2IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCi1jb25maWcgTk9fRE1BCi0JYm9vbAotCWRlZmF1bHQgeQotCiBjb25maWcgUldTRU1fR0VORVJJQ19TUElOTE9DSwogCWJvb2wKIAlkZWZhdWx0IHkKQEAgLTI0LDYgKzIwLDEwIEBACiBjb25maWcgUldTRU1fWENIR0FERF9BTEdPUklUSE0KIAlib29sCiAKK2NvbmZpZyBHRU5FUklDX0lPTUFQCisgICAgICAgYm9vbAorICAgICAgIGRlZmF1bHQgeQorCiBjb25maWcgQVJDSF9IQVNfSUxPRzJfVTMyCiAJYm9vbAogCWRlZmF1bHQgbgpAQCAtNDQsMTcgKzQ0LDIxIEBACiAJYm9vbAogCWRlZmF1bHQgeQogCi1jb25maWcgSVJRX1BFUl9DUFUKLQlib29sCi0JZGVmYXVsdCB5Ci0KIGNvbmZpZyBOT19JT1BPUlQKIAlkZWZfYm9vbCB5CiAKK2NvbmZpZyBGT1JDRV9NQVhfWk9ORU9SREVSCisJaW50CisJZGVmYXVsdCA2CisKIGNvbmZpZyBDUklTCiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgSFoKKwlpbnQKKwlkZWZhdWx0IDEwMAorCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIAogbWVudSAiR2VuZXJhbCBzZXR1cCIKQEAgLTkzLDE3ICs5NywxNSBAQAogCSB0aW1lcnMpLgogCSBUaGlzIGlzIG5lZWRlZCBpZiBDT05GSUdfRVRSQVhfU0VSSUFMX0ZBU1RfVElNRVIgaXMgZW5hYmxlZC4KIAotY29uZmlnIFBSRUVNUFQKLQlib29sICJQcmVlbXB0aWJsZSBLZXJuZWwiCitjb25maWcgRVRSQVhfS01BTExPQ0VEX01PRFVMRVMKKwlib29sICJFbmFibGUgbW9kdWxlIGFsbG9jYXRpb24gd2l0aCBrbWFsbG9jIgogCWhlbHAKLQkgIFRoaXMgb3B0aW9uIHJlZHVjZXMgdGhlIGxhdGVuY3kgb2YgdGhlIGtlcm5lbCB3aGVuIHJlYWN0aW5nIHRvCi0JICByZWFsLXRpbWUgb3IgaW50ZXJhY3RpdmUgZXZlbnRzIGJ5IGFsbG93aW5nIGEgbG93IHByaW9yaXR5IHByb2Nlc3MgdG8KLQkgIGJlIHByZWVtcHRlZCBldmVuIGlmIGl0IGlzIGluIGtlcm5lbCBtb2RlIGV4ZWN1dGluZyBhIHN5c3RlbSBjYWxsLgotCSAgVGhpcyBhbGxvd3MgYXBwbGljYXRpb25zIHRvIHJ1biBtb3JlIHJlbGlhYmx5IGV2ZW4gd2hlbiB0aGUgc3lzdGVtIGlzCi0JICB1bmRlciBsb2FkLgorCSAgRW5hYmxlIG1vZHVsZSBhbGxvY2F0aW9uIHdpdGgga21hbGxvYyBpbnN0ZWFkIG9mIHZtYWxsb2MuCiAKLQkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSBidWlsZGluZyBhIGtlcm5lbCBmb3IgYSBkZXNrdG9wLCBlbWJlZGRlZAotCSAgb3IgcmVhbC10aW1lIHN5c3RlbS4gIFNheSBOIGlmIHlvdSBhcmUgdW5zdXJlLgorY29uZmlnIE9PTV9SRUJPT1QKKyAgICAgICBib29sICJFbmFibGUgcmVib290IGF0IG91dCBvZiBtZW1vcnkiCisKK3NvdXJjZSAia2VybmVsL0tjb25maWcucHJlZW1wdCIKIAogc291cmNlIG1tL0tjb25maWcKIApAQCAtMTMwLDI0ICsxMzIsMTI0IEBACiAJaGVscAogCSAgU3VwcG9ydCB0aGUgeHNpbSBFVFJBWCBTaW11bGF0b3IuCiAKK2NvbmZpZyBFVFJBWEZTCisJYm9vbCAiRVRSQVgtRlMtVjMyIgorCWhlbHAKKwkgIFN1cHBvcnQgQ1JJUyBWMzIuCisKK2NvbmZpZyBDUklTX01BQ0hfQVJUUEVDMworICAgICAgICBib29sICJBUlRQRUMtMyIKKyAgICAgICAgaGVscAorICAgICAgICAgIFN1cHBvcnQgQXhpcyBBUlRQRUMtMy4KKwogZW5kY2hvaWNlCiAKK2NvbmZpZyBFVFJBWF9WQ1NfU0lNCisJYm9vbCAiVkNTIFNpbXVsYXRvciIKKwloZWxwCisJICBTZXR1cCBoYXJkd2FyZSB0byBiZSBydW4gaW4gdGhlIFZDUyBzaW11bGF0b3IuCisKIGNvbmZpZyBFVFJBWF9BUkNIX1YxMAogICAgICAgIGJvb2wKICAgICAgICBkZWZhdWx0IHkgaWYgRVRSQVgxMDBMWCB8fCBFVFJBWDEwMExYX1YyCiAgICAgICAgZGVmYXVsdCBuIGlmICEoRVRSQVgxMDBMWCB8fCBFVFJBWDEwMExYX1YyKQogCitjb25maWcgRVRSQVhfQVJDSF9WMzIKKyAgICAgICBib29sCisgICAgICAgZGVmYXVsdCB5IGlmIChFVFJBWEZTIHx8IENSSVNfTUFDSF9BUlRQRUMzKQorICAgICAgIGRlZmF1bHQgbiBpZiAhKEVUUkFYRlMgfHwgQ1JJU19NQUNIX0FSVFBFQzMpCisKIGNvbmZpZyBFVFJBWF9EUkFNX1NJWkUKIAlpbnQgIkRSQU0gc2l6ZSAoZGVjLCBpbiBNQikiCiAJZGVmYXVsdCAiOCIKIAloZWxwCiAJICBTaXplIG9mIERSQU0gKGRlY2ltYWwgaW4gTUIpIHR5cGljYWxseSAyLCA4IG9yIDE2LgogCitjb25maWcgRVRSQVhfVk1FTV9TSVpFCisgICAgICAgaW50ICJWaWRlbyBtZW1vcnkgc2l6ZSAoZGVjLCBpbiBNQikiCisgICAgICAgZGVwZW5kcyBvbiBFVFJBWF9BUkNIX1YzMiAmJiAhRVRSQVhGUworICAgICAgIGRlZmF1bHQgOCBpZiAhRVRSQVhGUworICAgICAgIGhlbHAKKwlTaXplIG9mIFZpZGVvIGFjY2Vzc2libGUgbWVtb3J5IChkZWNpbWFsLCBpbiBNQikuCisKIGNvbmZpZyBFVFJBWF9GTEFTSF9CVVNXSURUSAotCWludCAiQnVzd2lkdGggb2YgZmxhc2ggaW4gYnl0ZXMiCisJaW50ICJCdXN3aWR0aCBvZiBOT1IgZmxhc2ggaW4gYnl0ZXMiCiAJZGVmYXVsdCAiMiIKIAloZWxwCi0JICBXaWR0aCBpbiBieXRlcyBvZiB0aGUgRmxhc2ggYnVzICgxLCAyIG9yIDQpLiBJcyB1c3VhbGx5IDIuCisJICBXaWR0aCBpbiBieXRlcyBvZiB0aGUgTk9SIEZsYXNoIGJ1cyAoMSwgMiBvciA0KS4gSXMgdXN1YWxseSAyLgorCitjb25maWcgRVRSQVhfTkFOREZMQVNIX0JVU1dJRFRICisJaW50ICJCdXN3aWR0aCBvZiBOQU5EIGZsYXNoIGluIGJ5dGVzIgorCWRlZmF1bHQgIjEiCisJaGVscAorCSAgV2lkdGggaW4gYnl0ZXMgb2YgdGhlIE5BTkQgZmxhc2ggKDEgb3IgMikuCisKK2NvbmZpZyBFVFJBWF9GTEFTSDFfU0laRQorICAgICAgIGludCAiRkxBU0gxIHNpemUgKGRlYywgaW4gTUIuIDAgPSBVbmtub3duKSIKKyAgICAgICBkZWZhdWx0ICIwIgorCitjaG9pY2UKKwlwcm9tcHQgIlByb2R1Y3QgZGVidWctcG9ydCIKKwlkZWZhdWx0IEVUUkFYX0RFQlVHX1BPUlQwCisKK2NvbmZpZyBFVFJBWF9ERUJVR19QT1JUMAorCWJvb2wgIlNlcmlhbC0wIgorCWhlbHAKKwkgIENob29zZSBhIHNlcmlhbCBwb3J0IGZvciB0aGUgRVRSQVggZGVidWcgY29uc29sZS4gIERlZmF1bHQgdG8KKwkgIHBvcnQgMC4KKworY29uZmlnIEVUUkFYX0RFQlVHX1BPUlQxCisJYm9vbCAiU2VyaWFsLTEiCisJaGVscAorCSAgVXNlIHNlcmlhbCBwb3J0IDEgZm9yIHRoZSBjb25zb2xlLgorCitjb25maWcgRVRSQVhfREVCVUdfUE9SVDIKKwlib29sICJTZXJpYWwtMiIKKwloZWxwCisJICBVc2Ugc2VyaWFsIHBvcnQgMiBmb3IgdGhlIGNvbnNvbGUuCisKK2NvbmZpZyBFVFJBWF9ERUJVR19QT1JUMworCWJvb2wgIlNlcmlhbC0zIgorCWhlbHAKKwkgIFVzZSBzZXJpYWwgcG9ydCAzIGZvciB0aGUgY29uc29sZS4KKworY29uZmlnIEVUUkFYX0RFQlVHX1BPUlRfTlVMTAorCWJvb2wgImRpc2FibGVkIgorCWhlbHAKKwkgIERpc2FibGUgc2VyaWFsLXBvcnQgZGVidWdnaW5nLgorCitlbmRjaG9pY2UKKworY2hvaWNlCisJcHJvbXB0ICJLZXJuZWwgR0RCIHBvcnQiCisJZGVwZW5kcyBvbiBFVFJBWF9LR0RCCisJZGVmYXVsdCBFVFJBWF9LR0RCX1BPUlQwCisJaGVscAorCSAgQ2hvb3NlIGEgc2VyaWFsIHBvcnQgZm9yIGtlcm5lbCBkZWJ1Z2dpbmcuICBOT1RFOiBUaGlzIHBvcnQgc2hvdWxkCisJICBub3QgYmUgZW5hYmxlZCB1bmRlciBEcml2ZXJzIGZvciBidWlsdC1pbiBpbnRlcmZhY2VzIChhcyBpdCBoYXMgaXRzCisJICBvd24gaW5pdGlhbGl6YXRpb24gY29kZSkgYW5kIHNob3VsZCBub3QgYmUgdGhlIHNhbWUgYXMgdGhlIGRlYnVnIHBvcnQuCisKK2NvbmZpZyBFVFJBWF9LR0RCX1BPUlQwCisJYm9vbCAiU2VyaWFsLTAiCisJaGVscAorCSAgVXNlIHNlcmlhbCBwb3J0IDAgZm9yIGtlcm5lbCBkZWJ1Z2dpbmcuCisKK2NvbmZpZyBFVFJBWF9LR0RCX1BPUlQxCisJYm9vbCAiU2VyaWFsLTEiCisJaGVscAorCSAgVXNlIHNlcmlhbCBwb3J0IDEgZm9yIGtlcm5lbCBkZWJ1Z2dpbmcuCisKK2NvbmZpZyBFVFJBWF9LR0RCX1BPUlQyCisJYm9vbCAiU2VyaWFsLTIiCisJaGVscAorCSAgVXNlIHNlcmlhbCBwb3J0IDIgZm9yIGtlcm5lbCBkZWJ1Z2dpbmcuCisKK2NvbmZpZyBFVFJBWF9LR0RCX1BPUlQzCisJYm9vbCAiU2VyaWFsLTMiCisJaGVscAorCSAgVXNlIHNlcmlhbCBwb3J0IDMgZm9yIGtlcm5lbCBkZWJ1Z2dpbmcuCisKK2VuZGNob2ljZQogCiBzb3VyY2UgYXJjaC9jcmlzL2FyY2gtdjEwL0tjb25maWcKIHNvdXJjZSBhcmNoL2NyaXMvYXJjaC12MzIvS2NvbmZpZwpAQCAtMTYxLDYgKzI2MywzODcgQEAKIHNvdXJjZSBhcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9LY29uZmlnCiBzb3VyY2UgYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvS2NvbmZpZwogCitjb25maWcgRVRSQVhfQVhJU0ZMQVNITUFQCisJYm9vbCAiQXhpcyBmbGFzaC1tYXAgc3VwcG9ydCIKKwlzZWxlY3QgTVRECisJc2VsZWN0IE1URF9DRkkKKwlzZWxlY3QgTVREX0NGSV9BTURTVEQKKwlzZWxlY3QgTVREX0pFREVDUFJPQkUgaWYgRVRSQVhfQVJDSF9WMzIKKwlzZWxlY3QgTVREX0NIQVIKKwlzZWxlY3QgTVREX0JMT0NLCisJc2VsZWN0IE1URF9QQVJUSVRJT05TCisJc2VsZWN0IE1URF9DT05DQVQKKwlzZWxlY3QgTVREX0NPTVBMRVhfTUFQUElOR1MKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIE1URCBtYXBwaW5nIG9mIGZsYXNoIGRldmljZXMuICBOZWVkZWQgdG8gdXNlCisJICBmbGFzaCBtZW1vcmllcy4gIElmIHVuc3VyZSwgc2F5IFkuCisKK2NvbmZpZyBFVFJBWF9SVEMKKwlib29sICJSZWFsIFRpbWUgQ2xvY2sgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEVUUkFYX0kyQworCWhlbHAKKwkgIEVuYWJsZXMgZHJpdmVycyBmb3IgdGhlIFJlYWwtVGltZSBDbG9jayBiYXR0ZXJ5LWJhY2tlZCBjaGlwcyBvbgorCSAgc29tZSBwcm9kdWN0cy4gVGhlIGtlcm5lbCByZWFkcyB0aGUgdGltZSB3aGVuIGJvb3RpbmcsIGFuZAorCSAgdGhlIGRhdGUgY2FuIGJlIHNldCB1c2luZyBpb2N0bChmZCwgUlRDX1NFVF9USU1FLCAmcnQpIHdpdGggcnQgYQorCSAgcnRjX3RpbWUgc3RydWN0IChzZWUgPGZpbGU6aW5jbHVkZS9hc20tY3Jpcy9ydGMuaD4pIG9uIHRoZSAvZGV2L3J0YworCSAgZGV2aWNlLiAgWW91IGNhbiBjaGVjayB0aGUgdGltZSB3aXRoIGNhdCAvcHJvYy9ydGMsIGJ1dAorCSAgbm9ybWFsIHRpbWUgcmVhZGluZyBzaG91bGQgYmUgZG9uZSB1c2luZyBsaWJjIGZ1bmN0aW9uIHRpbWUgYW5kCisJICBmcmllbmRzLgorCitjaG9pY2UKKwlwcm9tcHQgIlJUQyBjaGlwIgorCWRlcGVuZHMgb24gRVRSQVhfUlRDCisJZGVmYXVsdCBFVFJBWF9QQ0Y4NTYzIGlmIEVUUkFYX0FSQ0hfVjMyCisJZGVmYXVsdCBFVFJBWF9EUzEzMDIgaWYgRVRSQVhfQVJDSF9WMTAKKworY29uZmlnIEVUUkFYX0RTMTMwMgorCWRlcGVuZHMgb24gRVRSQVhfQVJDSF9WMTAKKwlib29sICJEUzEzMDIiCisJaGVscAorCSAgRW5hYmxlcyB0aGUgZHJpdmVyIGZvciB0aGUgRFMxMzAyIFJlYWwtVGltZSBDbG9jayBiYXR0ZXJ5LWJhY2tlZAorCSAgY2hpcCBvbiBzb21lIHByb2R1Y3RzLgorCitjb25maWcgRVRSQVhfUENGODU2MworCWJvb2wgIlBDRjg1NjMiCisJaGVscAorCSAgRW5hYmxlcyB0aGUgZHJpdmVyIGZvciB0aGUgUENGODU2MyBSZWFsLVRpbWUgQ2xvY2sgYmF0dGVyeS1iYWNrZWQKKwkgIGNoaXAgb24gc29tZSBwcm9kdWN0cy4KKworZW5kY2hvaWNlCisKK2NvbmZpZyBFVFJBWF9TWU5DSFJPTk9VU19TRVJJQUwKKwlib29sICJTeW5jaHJvbm91cyBzZXJpYWwtcG9ydCBzdXBwb3J0IgorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIHRvIGVuYWJsZSB0aGUgc3luY2hyb25vdXMgc2VyaWFsIHBvcnQgZHJpdmVyLgorCitjb25maWcgRVRSQVhfU1lOQ0hST05PVVNfU0VSSUFMX1BPUlQwCisJYm9vbCAiU3luY2hyb25vdXMgc2VyaWFsIHBvcnQgMCBlbmFibGVkIgorCWRlcGVuZHMgb24gRVRSQVhfU1lOQ0hST05PVVNfU0VSSUFMCisJaGVscAorCSAgRW5hYmxlZCBzeW5jaHJvbm91cyBzZXJpYWwgcG9ydCAwLgorCitjb25maWcgRVRSQVhfU1lOQ0hST05PVVNfU0VSSUFMMF9ETUEKKwlib29sICJFbmFibGUgRE1BIG9uIHN5bmNocm9ub3VzIHNlcmlhbCBwb3J0IDAuIgorCWRlcGVuZHMgb24gRVRSQVhfU1lOQ0hST05PVVNfU0VSSUFMX1BPUlQwCisJaGVscAorCSAgQSBzeW5jaHJvbm91cyBzZXJpYWwgcG9ydCBjYW4gcnVuIGluIG1hbnVhbCBvciBETUEgbW9kZS4KKwkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIG1ha2UgaXQgcnVuIGluIERNQSBtb2RlLgorCitjb25maWcgRVRSQVhfU1lOQ0hST05PVVNfU0VSSUFMX1BPUlQxCisJYm9vbCAiU3luY2hyb25vdXMgc2VyaWFsIHBvcnQgMSBlbmFibGVkIgorCWRlcGVuZHMgb24gRVRSQVhfU1lOQ0hST05PVVNfU0VSSUFMICYmIChFVFJBWEZTIHx8IEVUUkFYX0FSQ0hfVjEwKQorCWhlbHAKKwkgIEVuYWJsZWQgc3luY2hyb25vdXMgc2VyaWFsIHBvcnQgMS4KKworY29uZmlnIEVUUkFYX1NZTkNIUk9OT1VTX1NFUklBTDFfRE1BCisJYm9vbCAiRW5hYmxlIERNQSBvbiBzeW5jaHJvbm91cyBzZXJpYWwgcG9ydCAxLiIKKwlkZXBlbmRzIG9uIEVUUkFYX1NZTkNIUk9OT1VTX1NFUklBTF9QT1JUMQorCWhlbHAKKwkgIEEgc3luY2hyb25vdXMgc2VyaWFsIHBvcnQgY2FuIHJ1biBpbiBtYW51YWwgb3IgRE1BIG1vZGUuCisJICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gd2lsbCBtYWtlIGl0IHJ1biBpbiBETUEgbW9kZS4KKworY2hvaWNlCisJcHJvbXB0ICJOZXR3b3JrIExFRCBiZWhhdmlvciIKKwlkZXBlbmRzIG9uIEVUUkFYX0VUSEVSTkVUCisJZGVmYXVsdCBFVFJBWF9ORVRXT1JLX0xFRF9PTl9XSEVOX0FDVElWSVRZCisKK2NvbmZpZyBFVFJBWF9ORVRXT1JLX0xFRF9PTl9XSEVOX0xJTksKKwlib29sICJMRURfb25fd2hlbl9saW5rIgorCWhlbHAKKwkgIFNlbGVjdGluZyBMRURfb25fd2hlbl9saW5rIHdpbGwgbGlnaHQgdGhlIExFRCB3aGVuIHRoZXJlIGlzIGEKKwkgIGNvbm5lY3Rpb24gYW5kIHdpbGwgZmxhc2ggb2ZmIHdoZW4gdGhlcmUgaXMgYWN0aXZpdHkuCisKKwkgIFNlbGVjdGluZyBMRURfb25fd2hlbl9hY3Rpdml0eSB3aWxsIGxpZ2h0IHRoZSBMRUQgb25seSB3aGVuCisJICB0aGVyZSBpcyBhY3Rpdml0eS4KKworCSAgVGhpcyBzZXR0aW5nIHdpbGwgYWxzbyBhZmZlY3QgdGhlIGJlaGF2aW91ciBvZiBvdGhlciBhY3Rpdml0eSBMRURzCisJICBlLmcuIEJsdWV0b290aC4KKworY29uZmlnIEVUUkFYX05FVFdPUktfTEVEX09OX1dIRU5fQUNUSVZJVFkKKwlib29sICJMRURfb25fd2hlbl9hY3Rpdml0eSIKKwloZWxwCisJICBTZWxlY3RpbmcgTEVEX29uX3doZW5fbGluayB3aWxsIGxpZ2h0IHRoZSBMRUQgd2hlbiB0aGVyZSBpcyBhCisJICBjb25uZWN0aW9uIGFuZCB3aWxsIGZsYXNoIG9mZiB3aGVuIHRoZXJlIGlzIGFjdGl2aXR5LgorCisJICBTZWxlY3RpbmcgTEVEX29uX3doZW5fYWN0aXZpdHkgd2lsbCBsaWdodCB0aGUgTEVEIG9ubHkgd2hlbgorCSAgdGhlcmUgaXMgYWN0aXZpdHkuCisKKwkgIFRoaXMgc2V0dGluZyB3aWxsIGFsc28gYWZmZWN0IHRoZSBiZWhhdmlvdXIgb2Ygb3RoZXIgYWN0aXZpdHkgTEVEcworCSAgZS5nLiBCbHVldG9vdGguCisKK2VuZGNob2ljZQorCitjaG9pY2UKKwlwcm9tcHQgIlNlcjAgRE1BIG91dCBjaGFubmVsIgorCWRlcGVuZHMgb24gRVRSQVhfU0VSSUFMX1BPUlQwCisJZGVmYXVsdCBFVFJBWF9TRVJJQUxfUE9SVDBfRE1BNl9PVVQgaWYgRVRSQVhfQVJDSF9WMzIKKwlkZWZhdWx0IEVUUkFYX1NFUklBTF9QT1JUMF9OT19ETUFfT1VUIGlmIEVUUkFYX0FSQ0hfVjEwCisKK2NvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDBfTk9fRE1BX09VVAorCWJvb2wgIlNlcjAgdXNlcyBubyBETUEgZm9yIG91dHB1dCIKKwloZWxwCisJICBEbyBub3QgdXNlIERNQSBmb3Igc2VyMCBvdXRwdXQuCisKK2NvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDBfRE1BNl9PVVQKKwlib29sICJTZXIwIHVzZXMgRE1BNiBmb3Igb3V0cHV0IgorCWRlcGVuZHMgb24gRVRSQVhGUworCWhlbHAKKwkgIEVuYWJsZXMgdGhlIERNQTYgb3V0cHV0IGNoYW5uZWwgZm9yIHNlcjAgKHR0eVMwKS4KKwkgIElmIHlvdSBkbyBub3QgZW5hYmxlIERNQSwgYW4gaW50ZXJydXB0IGZvciBlYWNoIGNoYXJhY3RlciB3aWxsIGJlCisJICB1c2VkIHdoZW4gdHJhbnNtaXR0aW5nIGRhdGEuCisJICBOb3JtYWxseSB5b3Ugd2FudCB0byB1c2UgRE1BLCB1bmxlc3MgeW91IHVzZSB0aGUgRE1BIGNoYW5uZWwgZm9yCisJICBzb21ldGhpbmcgZWxzZS4KKworY29uZmlnIEVUUkFYX1NFUklBTF9QT1JUMF9ETUEwX09VVAorCWJvb2wgIlNlcjAgdXNlcyBETUEwIGZvciBvdXRwdXQiCisJZGVwZW5kcyBvbiBDUklTX01BQ0hfQVJUUEVDMworCWhlbHAKKwkgIEVuYWJsZXMgdGhlIERNQTAgb3V0cHV0IGNoYW5uZWwgZm9yIHNlcjAgKHR0eVMwKS4KKwkgIElmIHlvdSBkbyBub3QgZW5hYmxlIERNQSwgYW4gaW50ZXJydXB0IGZvciBlYWNoIGNoYXJhY3RlciB3aWxsIGJlCisJICB1c2VkIHdoZW4gdHJhbnNtaXR0aW5nIGRhdGEuCisJICBOb3JtYWxseSB5b3Ugd2FudCB0byB1c2UgRE1BLCB1bmxlc3MgeW91IHVzZSB0aGUgRE1BIGNoYW5uZWwgZm9yCisJICBzb21ldGhpbmcgZWxzZS4KKworZW5kY2hvaWNlCisKK2Nob2ljZQorCXByb21wdCAiU2VyMCBETUEgaW4gY2hhbm5lbCAiCisJZGVwZW5kcyBvbiBFVFJBWF9TRVJJQUxfUE9SVDAKKwlkZWZhdWx0IEVUUkFYX1NFUklBTF9QT1JUMF9OT19ETUFfSU4gaWYgRVRSQVhfQVJDSF9WMzIKKwlkZWZhdWx0IEVUUkFYX1NFUklBTF9QT1JUMF9ETUE3X0lOIGlmIEVUUkFYX0FSQ0hfVjEwCisJaGVscAorCSAgV2hhdCBETUEgY2hhbm5lbCB0byB1c2UgZm9yIHNlcjAuCisKK2NvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDBfTk9fRE1BX0lOCisJYm9vbCAiU2VyMCB1c2VzIG5vIERNQSBmb3IgaW5wdXQiCisJaGVscAorCSAgRG8gbm90IHVzZSBETUEgZm9yIHNlcjAgaW5wdXQuCisKK2NvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDBfRE1BN19JTgorCWJvb2wgIlNlcjAgdXNlcyBETUE3IGZvciBpbnB1dCIKKwlkZXBlbmRzIG9uIEVUUkFYRlMKKwloZWxwCisJICBFbmFibGVzIHRoZSBETUE3IGlucHV0IGNoYW5uZWwgZm9yIHNlcjAgKHR0eVMwKS4KKwkgIElmIHlvdSBkbyBub3QgZW5hYmxlIERNQSwgYW4gaW50ZXJydXB0IGZvciBlYWNoIGNoYXJhY3RlciB3aWxsIGJlCisJICB1c2VkIHdoZW4gcmVjZWl2aW5nIGRhdGEuCisJICBOb3JtYWxseSB5b3Ugd2FudCB0byB1c2UgRE1BLCB1bmxlc3MgeW91IHVzZSB0aGUgRE1BIGNoYW5uZWwgZm9yCisJICBzb21ldGhpbmcgZWxzZS4KKworY29uZmlnIEVUUkFYX1NFUklBTF9QT1JUMF9ETUExX0lOCisJYm9vbCAiU2VyMCB1c2VzIERNQTEgZm9yIGlucHV0IgorCWRlcGVuZHMgb24gQ1JJU19NQUNIX0FSVFBFQzMKKwloZWxwCisJICBFbmFibGVzIHRoZSBETUExIGlucHV0IGNoYW5uZWwgZm9yIHNlcjAgKHR0eVMwKS4KKwkgIElmIHlvdSBkbyBub3QgZW5hYmxlIERNQSwgYW4gaW50ZXJydXB0IGZvciBlYWNoIGNoYXJhY3RlciB3aWxsIGJlCisJICB1c2VkIHdoZW4gcmVjZWl2ZWluZyBkYXRhLgorCSAgTm9ybWFsbHkgeW91IHdhbnQgdG8gdXNlIERNQSwgdW5sZXNzIHlvdSB1c2UgdGhlIERNQSBjaGFubmVsIGZvcgorCSAgc29tZXRoaW5nIGVsc2UuCisKK2VuZGNob2ljZQorCitjaG9pY2UKKwlwcm9tcHQgIlNlcjEgRE1BIGluIGNoYW5uZWwgIgorCWRlcGVuZHMgb24gRVRSQVhfU0VSSUFMX1BPUlQxCisJZGVmYXVsdCBFVFJBWF9TRVJJQUxfUE9SVDFfTk9fRE1BX0lOIGlmIEVUUkFYX0FSQ0hfVjMyCisJZGVmYXVsdCBFVFJBWF9TRVJJQUxfUE9SVDFfRE1BOV9JTiBpZiBFVFJBWF9BUkNIX1YxMAorCWhlbHAKKwkgIFdoYXQgRE1BIGNoYW5uZWwgdG8gdXNlIGZvciBzZXIxLgorCitjb25maWcgRVRSQVhfU0VSSUFMX1BPUlQxX05PX0RNQV9JTgorCWJvb2wgIlNlcjEgdXNlcyBubyBETUEgZm9yIGlucHV0IgorCWhlbHAKKwkgIERvIG5vdCB1c2UgRE1BIGZvciBzZXIxIGlucHV0LgorCitjb25maWcgRVRSQVhfU0VSSUFMX1BPUlQxX0RNQTVfSU4KKwlib29sICJTZXIxIHVzZXMgRE1BNSBmb3IgaW5wdXQiCisJZGVwZW5kcyBvbiBFVFJBWF9BUkNIX1YzMgorCWhlbHAKKwkgIEVuYWJsZXMgdGhlIERNQTUgaW5wdXQgY2hhbm5lbCBmb3Igc2VyMSAodHR5UzEpLgorCSAgSWYgeW91IGRvIG5vdCBlbmFibGUgRE1BLCBhbiBpbnRlcnJ1cHQgZm9yIGVhY2ggY2hhcmFjdGVyIHdpbGwgYmUKKwkgIHVzZWQgd2hlbiByZWNlaXZpbmcgZGF0YS4KKwkgIE5vcm1hbGx5IHlvdSB3YW50IHRoaXMgb24sIHVubGVzcyB5b3UgdXNlIHRoZSBETUEgY2hhbm5lbCBmb3IKKwkgIHNvbWV0aGluZyBlbHNlLgorCitjb25maWcgRVRSQVhfU0VSSUFMX1BPUlQxX0RNQTlfSU4KKwlkZXBlbmRzIG9uIEVUUkFYX0FSQ0hfVjEwCisJYm9vbCAiU2VyMSB1c2VzIERNQTkgZm9yIGlucHV0IgorCitlbmRjaG9pY2UKKworCitjaG9pY2UKKwlwcm9tcHQgIlNlcjEgRE1BIG91dCBjaGFubmVsIgorCWRlcGVuZHMgb24gRVRSQVhfU0VSSUFMX1BPUlQxCisJZGVmYXVsdCBFVFJBWF9TRVJJQUxfUE9SVDFfTk9fRE1BX09VVCBpZiBFVFJBWF9BUkNIX1YzMgorCWRlZmF1bHQgRVRSQVhfU0VSSUFMX1BPUlQxX0RNQThfT1VUIGlmIEVUUkFYX0FSQ0hfVjEwCisJaGVscAorCSAgV2hhdCBETUEgY2hhbm5lbCB0byB1c2UgZm9yIHNlcjEuCisKK2NvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDFfTk9fRE1BX09VVAorCWJvb2wgIlNlcjEgdXNlcyBubyBETUEgZm9yIG91dHB1dCIKKwloZWxwCisJICBEbyBub3QgdXNlIERNQSBmb3Igc2VyMSBvdXRwdXQuCisKK2NvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDFfRE1BOF9PVVQKKwlkZXBlbmRzIG9uIEVUUkFYX0FSQ0hfVjEwCisJYm9vbCAiU2VyMSB1c2VzIERNQTggZm9yIG91dHB1dCIKKworY29uZmlnIEVUUkFYX1NFUklBTF9QT1JUMV9ETUE0X09VVAorCWRlcGVuZHMgb24gRVRSQVhfQVJDSF9WMzIKKwlib29sICJTZXIxIHVzZXMgRE1BNCBmb3Igb3V0cHV0IgorCWhlbHAKKwkgIEVuYWJsZXMgdGhlIERNQTQgb3V0cHV0IGNoYW5uZWwgZm9yIHNlcjEgKHR0eVMxKS4KKwkgIElmIHlvdSBkbyBub3QgZW5hYmxlIERNQSwgYW4gaW50ZXJydXB0IGZvciBlYWNoIGNoYXJhY3RlciB3aWxsIGJlCisJICB1c2VkIHdoZW4gdHJhbnNtaXR0aW5nIGRhdGEuCisJICBOb3JtYWxseSB5b3Ugd2FudCB0aGlzIG9uLCB1bmxlc3MgeW91IHVzZSB0aGUgRE1BIGNoYW5uZWwgZm9yCisJICBzb21ldGhpbmcgZWxzZS4KKworZW5kY2hvaWNlCisKK2Nob2ljZQorCXByb21wdCAiU2VyMiBETUEgb3V0IGNoYW5uZWwiCisJZGVwZW5kcyBvbiBFVFJBWF9TRVJJQUxfUE9SVDIKKwlkZWZhdWx0IEVUUkFYX1NFUklBTF9QT1JUMl9OT19ETUFfT1VUIGlmIEVUUkFYX0FSQ0hfVjMyCisJZGVmYXVsdCBFVFJBWF9TRVJJQUxfUE9SVDJfRE1BMl9PVVQgaWYgRVRSQVhfQVJDSF9WMTAKKworY29uZmlnIEVUUkFYX1NFUklBTF9QT1JUMl9OT19ETUFfT1VUCisJYm9vbCAiU2VyMiB1c2VzIG5vIERNQSBmb3Igb3V0cHV0IgorCWhlbHAKKwkgIERvIG5vdCB1c2UgRE1BIGZvciBzZXIyIG91dHB1dC4KKworY29uZmlnIEVUUkFYX1NFUklBTF9QT1JUMl9ETUEyX09VVAorCWJvb2wgIlNlcjIgdXNlcyBETUEyIGZvciBvdXRwdXQiCisJZGVwZW5kcyBvbiBFVFJBWEZTIHx8IEVUUkFYX0FSQ0hfVjEwCisJaGVscAorCSAgRW5hYmxlcyB0aGUgRE1BMiBvdXRwdXQgY2hhbm5lbCBmb3Igc2VyMiAodHR5UzIpLgorCSAgSWYgeW91IGRvIG5vdCBlbmFibGUgRE1BLCBhbiBpbnRlcnJ1cHQgZm9yIGVhY2ggY2hhcmFjdGVyIHdpbGwgYmUKKwkgIHVzZWQgd2hlbiB0cmFuc21pdHRpbmcgZGF0YS4KKwkgIE5vcm1hbGx5IHlvdSB3YW50IHRvIHVzZSBETUEsIHVubGVzcyB5b3UgdXNlIHRoZSBETUEgY2hhbm5lbCBmb3IKKwkgIHNvbWV0aGluZyBlbHNlLgorCitjb25maWcgRVRSQVhfU0VSSUFMX1BPUlQyX0RNQTZfT1VUCisJYm9vbCAiU2VyMiB1c2VzIERNQTYgZm9yIG91dHB1dCIKKwlkZXBlbmRzIG9uIENSSVNfTUFDSF9BUlRQRUMzCisJaGVscAorCSAgRW5hYmxlcyB0aGUgRE1BNiBvdXRwdXQgY2hhbm5lbCBmb3Igc2VyMiAodHR5UzIpLgorCSAgSWYgeW91IGRvIG5vdCBlbmFibGUgRE1BLCBhbiBpbnRlcnJ1cHQgZm9yIGVhY2ggY2hhcmFjdGVyIHdpbGwgYmUKKwkgIHVzZWQgd2hlbiB0cmFuc21pdHRpbmcgZGF0YS4KKwkgIE5vcm1hbGx5IHlvdSB3YW50IHRvIHVzZSBETUEsIHVubGVzcyB5b3UgdXNlIHRoZSBETUEgY2hhbm5lbCBmb3IKKwkgIHNvbWV0aGluZyBlbHNlLgorCitlbmRjaG9pY2UKKworY2hvaWNlCisJcHJvbXB0ICJTZXIyIERNQSBpbiBjaGFubmVsIgorCWRlcGVuZHMgb24gRVRSQVhfU0VSSUFMX1BPUlQyCisJZGVmYXVsdCBFVFJBWF9TRVJJQUxfUE9SVDJfTk9fRE1BX0lOIGlmIEVUUkFYX0FSQ0hfVjMyCisJZGVmYXVsdCBFVFJBWF9TRVJJQUxfUE9SVDJfRE1BM19JTiBpZiBFVFJBWF9BUkNIX1YxMAorCWhlbHAKKwkgIFdoYXQgRE1BIGNoYW5uZWwgdG8gdXNlIGZvciBzZXIyLgorCitjb25maWcgRVRSQVhfU0VSSUFMX1BPUlQyX05PX0RNQV9JTgorCWJvb2wgIlNlcjIgdXNlcyBubyBETUEgZm9yIGlucHV0IgorCWhlbHAKKwkgIERvIG5vdCB1c2UgRE1BIGZvciBzZXIyIGlucHV0LgorCitjb25maWcgRVRSQVhfU0VSSUFMX1BPUlQyX0RNQTNfSU4KKwlib29sICJTZXIyIHVzZXMgRE1BMyBmb3IgaW5wdXQiCisJZGVwZW5kcyBvbiBFVFJBWEZTIHx8IEVUUkFYX0FSQ0hfVjEwCisJaGVscAorCSAgRW5hYmxlcyB0aGUgRE1BMyBpbnB1dCBjaGFubmVsIGZvciBzZXIyICh0dHlTMikuCisJICBJZiB5b3UgZG8gbm90IGVuYWJsZSBETUEsIGFuIGludGVycnVwdCBmb3IgZWFjaCBjaGFyYWN0ZXIgd2lsbCBiZQorCSAgdXNlZCB3aGVuIHJlY2VpdmluZyBkYXRhLgorCSAgTm9ybWFsbHkgeW91IHdhbnQgdG8gdXNlIERNQSwgdW5sZXNzIHlvdSB1c2UgdGhlIERNQSBjaGFubmVsIGZvcgorCSAgc29tZXRoaW5nIGVsc2UuCisKK2NvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDJfRE1BN19JTgorCWJvb2wgIlNlcjIgdXNlcyBETUE3IGZvciBpbnB1dCIKKwlkZXBlbmRzIG9uIENSSVNfTUFDSF9BUlRQRUMzCisJaGVscAorCSAgRW5hYmxlcyB0aGUgRE1BNyBpbnB1dCBjaGFubmVsIGZvciBzZXIyICh0dHlTMikuCisJICBJZiB5b3UgZG8gbm90IGVuYWJsZSBETUEsIGFuIGludGVycnVwdCBmb3IgZWFjaCBjaGFyYWN0ZXIgd2lsbCBiZQorCSAgdXNlZCB3aGVuIHJlY2VpdmVpbmcgZGF0YS4KKwkgIE5vcm1hbGx5IHlvdSB3YW50IHRvIHVzZSBETUEsIHVubGVzcyB5b3UgdXNlIHRoZSBETUEgY2hhbm5lbCBmb3IKKwkgIHNvbWV0aGluZyBlbHNlLgorCitlbmRjaG9pY2UKKworY2hvaWNlCisJcHJvbXB0ICJTZXIzIERNQSBpbiBjaGFubmVsIgorCWRlcGVuZHMgb24gRVRSQVhfU0VSSUFMX1BPUlQzCisJZGVmYXVsdCBFVFJBWF9TRVJJQUxfUE9SVDNfTk9fRE1BX0lOIGlmIEVUUkFYX0FSQ0hfVjMyCisJZGVmYXVsdCBFVFJBWF9TRVJJQUxfUE9SVDNfRE1BNV9JTiBpZiBFVFJBWF9BUkNIX1YxMAorCWhlbHAKKwkgIFdoYXQgRE1BIGNoYW5uZWwgdG8gdXNlIGZvciBzZXIzLgorCitjb25maWcgRVRSQVhfU0VSSUFMX1BPUlQzX05PX0RNQV9JTgorCWJvb2wgIlNlcjMgdXNlcyBubyBETUEgZm9yIGlucHV0IgorCWhlbHAKKwkgIERvIG5vdCB1c2UgRE1BIGZvciBzZXIzIGlucHV0LgorCitjb25maWcgRVRSQVhfU0VSSUFMX1BPUlQzX0RNQTVfSU4KKwlkZXBlbmRzIG9uIEVUUkFYX0FSQ0hfVjEwCisJYm9vbCAiRE1BIDUiCisKK2NvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDNfRE1BOV9JTgorCWJvb2wgIlNlcjMgdXNlcyBETUE5IGZvciBpbnB1dCIKKwlkZXBlbmRzIG9uIEVUUkFYRlMKKwloZWxwCisJICBFbmFibGVzIHRoZSBETUE5IGlucHV0IGNoYW5uZWwgZm9yIHNlcjMgKHR0eVMzKS4KKwkgIElmIHlvdSBkbyBub3QgZW5hYmxlIERNQSwgYW4gaW50ZXJydXB0IGZvciBlYWNoIGNoYXJhY3RlciB3aWxsIGJlCisJICB1c2VkIHdoZW4gcmVjZWl2aW5nIGRhdGEuCisJICBOb3JtYWxseSB5b3Ugd2FudCB0byB1c2UgRE1BLCB1bmxlc3MgeW91IHVzZSB0aGUgRE1BIGNoYW5uZWwgZm9yCisJICBzb21ldGhpbmcgZWxzZS4KKworY29uZmlnIEVUUkFYX1NFUklBTF9QT1JUM19ETUEzX0lOCisJYm9vbCAiU2VyMyB1c2VzIERNQTMgZm9yIGlucHV0IgorCWRlcGVuZHMgb24gQ1JJU19NQUNIX0FSVFBFQzMKKwloZWxwCisJICBFbmFibGVzIHRoZSBETUEzIGlucHV0IGNoYW5uZWwgZm9yIHNlcjMgKHR0eVMzKS4KKwkgIElmIHlvdSBkbyBub3QgZW5hYmxlIERNQSwgYW4gaW50ZXJydXB0IGZvciBlYWNoIGNoYXJhY3RlciB3aWxsIGJlCisJICB1c2VkIHdoZW4gcmVjZWl2ZWluZyBkYXRhLgorCSAgTm9ybWFsbHkgeW91IHdhbnQgdG8gdXNlIERNQSwgdW5sZXNzIHlvdSB1c2UgdGhlIERNQSBjaGFubmVsIGZvcgorCSAgc29tZXRoaW5nIGVsc2UuCisKK2VuZGNob2ljZQorCitjaG9pY2UKKwlwcm9tcHQgIlNlcjMgRE1BIG91dCBjaGFubmVsIgorCWRlcGVuZHMgb24gRVRSQVhfU0VSSUFMX1BPUlQzCisJZGVmYXVsdCBFVFJBWF9TRVJJQUxfUE9SVDNfTk9fRE1BX09VVCBpZiBFVFJBWF9BUkNIX1YzMgorCWRlZmF1bHQgRVRSQVhfU0VSSUFMX1BPUlQzX0RNQTRfT1VUIGlmIEVUUkFYX0FSQ0hfVjEwCisKK2NvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDNfTk9fRE1BX09VVAorCWJvb2wgIlNlcjMgdXNlcyBubyBETUEgZm9yIG91dHB1dCIKKwloZWxwCisJICBEbyBub3QgdXNlIERNQSBmb3Igc2VyMyBvdXRwdXQuCisKK2NvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDNfRE1BNF9PVVQKKwlkZXBlbmRzIG9uIEVUUkFYX0FSQ0hfVjEwCisJYm9vbCAiRE1BIDQiCisKK2NvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDNfRE1BOF9PVVQKKwlib29sICJTZXIzIHVzZXMgRE1BOCBmb3Igb3V0cHV0IgorCWRlcGVuZHMgb24gRVRSQVhGUworCWhlbHAKKwkgIEVuYWJsZXMgdGhlIERNQTggb3V0cHV0IGNoYW5uZWwgZm9yIHNlcjMgKHR0eVMzKS4KKwkgIElmIHlvdSBkbyBub3QgZW5hYmxlIERNQSwgYW4gaW50ZXJydXB0IGZvciBlYWNoIGNoYXJhY3RlciB3aWxsIGJlCisJICB1c2VkIHdoZW4gdHJhbnNtaXR0aW5nIGRhdGEuCisJICBOb3JtYWxseSB5b3Ugd2FudCB0byB1c2UgRE1BLCB1bmxlc3MgeW91IHVzZSB0aGUgRE1BIGNoYW5uZWwgZm9yCisJICBzb21ldGhpbmcgZWxzZS4KKworY29uZmlnIEVUUkFYX1NFUklBTF9QT1JUM19ETUEyX09VVAorCWJvb2wgIlNlcjMgdXNlcyBETUEyIGZvciBvdXRwdXQiCisJZGVwZW5kcyBvbiBDUklTX01BQ0hfQVJUUEVDMworCWhlbHAKKwkgIEVuYWJsZXMgdGhlIERNQTIgb3V0cHV0IGNoYW5uZWwgZm9yIHNlcjMgKHR0eVMzKS4KKwkgIElmIHlvdSBkbyBub3QgZW5hYmxlIERNQSwgYW4gaW50ZXJydXB0IGZvciBlYWNoIGNoYXJhY3RlciB3aWxsIGJlCisJICB1c2VkIHdoZW4gdHJhbnNtaXR0aW5nIGRhdGEuCisJICBOb3JtYWxseSB5b3Ugd2FudCB0byB1c2UgRE1BLCB1bmxlc3MgeW91IHVzZSB0aGUgRE1BIGNoYW5uZWwgZm9yCisJICBzb21ldGhpbmcgZWxzZS4KKworZW5kY2hvaWNlCisKIGVuZG1lbnUKIAogc291cmNlICJkcml2ZXJzL2Jhc2UvS2NvbmZpZyIKQEAgLTE3NCwyMiArNjU3LDEwIEBACiAKIHNvdXJjZSAiZHJpdmVycy9ibG9jay9LY29uZmlnIgogCi1zb3VyY2UgImRyaXZlcnMvbWQvS2NvbmZpZyIKLQogc291cmNlICJkcml2ZXJzL2lkZS9LY29uZmlnIgogCi1zb3VyY2UgImRyaXZlcnMvc2NzaS9LY29uZmlnIgotCi1zb3VyY2UgImRyaXZlcnMvaWVlZTEzOTQvS2NvbmZpZyIKLQotc291cmNlICJkcml2ZXJzL21lc3NhZ2UvaTJvL0tjb25maWciCi0KIHNvdXJjZSAiZHJpdmVycy9uZXQvS2NvbmZpZyIKIAotc291cmNlICJkcml2ZXJzL2lzZG4vS2NvbmZpZyIKLQotc291cmNlICJkcml2ZXJzL3RlbGVwaG9ueS9LY29uZmlnIgotCiBzb3VyY2UgImRyaXZlcnMvaTJjL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9ydGMvS2NvbmZpZyIKQEAgLTIwMSwxNyArNjcyLDggQEAKIAogc291cmNlICJkcml2ZXJzL2NoYXIvS2NvbmZpZyIKIAotI3NvdXJjZSBkcml2ZXJzL21pc2MvQ29uZmlnLmluCi1zb3VyY2UgImRyaXZlcnMvbWVkaWEvS2NvbmZpZyIKLQogc291cmNlICJmcy9LY29uZmlnIgogCi1zb3VyY2UgInNvdW5kL0tjb25maWciCi0KLXNvdXJjZSAiZHJpdmVycy9wY21jaWEvS2NvbmZpZyIKLQotc291cmNlICJkcml2ZXJzL3BjaS9LY29uZmlnIgotCiBzb3VyY2UgImRyaXZlcnMvdXNiL0tjb25maWciCiAKIHNvdXJjZSAiYXJjaC9jcmlzL0tjb25maWcuZGVidWciCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvTWFrZWZpbGUgYi9hcmNoL2NyaXMvTWFrZWZpbGUKaW5kZXggZTZiZjAwYy4uODM4Y2QyYSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL01ha2VmaWxlCisrKyBiL2FyY2gvY3Jpcy9NYWtlZmlsZQpAQCAtMSw0ICsxLDQgQEAKLSMgJElkOiBNYWtlZmlsZSx2IDEuMjggMjAwNS8wMy8xNyAxMDo0NDozNyBsYXJzdiBFeHAgJAorIwogIyBjcmlzL01ha2VmaWxlCiAjCiAjIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBieSB0aGUgZ2xvYmFsIG1ha2VmaWxlIHNvIHRoYXQgeW91IGNhbiBhZGQgeW91ciBvd24KQEAgLTEwLDI4ICsxMCwzNiBAQAogIyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAjIGZvciBtb3JlIGRldGFpbHMuCiAKLSMgQSBidWcgaW4gbGQgcHJldmVudHMgdXMgZnJvbSBoYXZpbmcgYSAoY29uc3RhbnQtdmFsdWUpIHN5bWJvbCBpbiBhCi0jICJPUklHSU4gPSIgb3IgIkxFTkdUSCA9IiBleHByZXNzaW9uLgotCiBhcmNoLXkgOj0gdjEwCiBhcmNoLSQoQ09ORklHX0VUUkFYX0FSQ0hfVjEwKSA6PSB2MTAKIGFyY2gtJChDT05GSUdfRVRSQVhfQVJDSF9WMzIpIDo9IHYzMgogCi0jIE5vIGNvbmZpZyBhdmFpYWJsZSBmb3IgbWFrZSBjbGVhbiBldGMKKyMgTm8gY29uZmlnIGF2YWlsYWJsZSBmb3IgbWFrZSBjbGVhbiBldGMKK21hY2gteSA6PSBmcworbWFjaC0kKENPTkZJR19DUklTX01BQ0hfQVJUUEVDMykgOj0gYTMKK21hY2gtJChDT05GSUdfRVRSQVhGUykgOj0gZnMKKwogaWZuZXEgKCQoYXJjaC15KSwpCiBTQVJDSCA6PSBhcmNoLSQoYXJjaC15KQogZWxzZQogU0FSQ0ggOj0KIGVuZGlmCiAKK2lmbmVxICgkKG1hY2gteSksKQorTUFDSCA6PSBtYWNoLSQobWFjaC15KQorZWxzZQorTUFDSCA6PQorZW5kaWYKKwogTEQgPSAkKENST1NTX0NPTVBJTEUpbGQgLW1jcmlzbGludXgKIAogT0JKQ09QWUZMQUdTIDo9IC1PIGJpbmFyeSAtUiAubm90ZSAtUiAuY29tbWVudCAtUwogCiBDUFBGTEFHU192bWxpbnV4LmxkcyA9IC1ERFJBTV9WSVJUVUFMX0JBU0U9MHgkKENPTkZJR19FVFJBWF9EUkFNX1ZJUlRVQUxfQkFTRSkKLUtCVUlMRF9BRkxBR1MgKz0gLW1saW51eAogCi1LQlVJTERfQ0ZMQUdTICs9IC1tbGludXggLW1hcmNoPSQoYXJjaC15KSAtcGlwZQorS0JVSUxEX0FGTEFHUyArPSAtbWxpbnV4IC1tYXJjaD0kKGFyY2gteSkgLUlpbmNsdWRlL2FzbS9hcmNoL21hY2ggLUlpbmNsdWRlL2FzbS9hcmNoCisKK0tCVUlMRF9DRkxBR1MgKz0gLW1saW51eCAtbWFyY2g9JChhcmNoLXkpIC1waXBlIC1JaW5jbHVkZS9hc20vYXJjaC9tYWNoIC1JaW5jbHVkZS9hc20vYXJjaAogCiBpZmRlZiBDT05GSUdfRlJBTUVfUE9JTlRFUgogS0JVSUxEX0NGTEFHUyA6PSAkKHN1YnN0IC1mb21pdC1mcmFtZS1wb2ludGVyLCwkKEtCVUlMRF9DRkxBR1MpKSAtZwpAQCAtNDQsNiArNTIsOSBAQAogCiBjb3JlLXkJCSs9IGFyY2gvJChBUkNIKS9rZXJuZWwvIGFyY2gvJChBUkNIKS9tbS8KIGNvcmUteQkJKz0gYXJjaC8kKEFSQ0gpLyQoU0FSQ0gpL2tlcm5lbC8gYXJjaC8kKEFSQ0gpLyQoU0FSQ0gpL21tLworaWZkZWYgQ09ORklHX0VUUkFYX0FSQ0hfVjMyCitjb3JlLXkJCSs9IGFyY2gvJChBUkNIKS8kKFNBUkNIKS8kKE1BQ0gpLworZW5kaWYKIGRyaXZlcnMteQkrPSBhcmNoLyQoQVJDSCkvJChTQVJDSCkvZHJpdmVycy8KIGxpYnMteQkJKz0gYXJjaC8kKEFSQ0gpLyQoU0FSQ0gpL2xpYi8gJChMSUJHQ0MpCiAKQEAgLTUyLDc5ICs2Myw2OSBAQAogIyBjcmlzIG9iamVjdCBmaWxlcyBwYXRoCiBPQkpfQVJDSCAgICAgICAgICAgICAgPSAkKG9ianRyZWUpL2FyY2gvJChBUkNIKQogCi10YXJnZXRfYm9vdF9hcmNoX2RpciAgPSAkKE9CSl9BUkNIKS8kKFNBUkNIKS9ib290Ci10YXJnZXRfYm9vdF9kaXIgICAgICAgPSAkKE9CSl9BUkNIKS9ib290Ci1zcmNfYm9vdF9kaXIgICAgICAgICAgPSAkKFNSQ19BUkNIKS9ib290Ci10YXJnZXRfY29tcHJlc3NlZF9kaXIgPSAkKE9CSl9BUkNIKS9ib290L2NvbXByZXNzZWQKLXNyY19jb21wcmVzc2VkX2RpciAgICA9ICQoU1JDX0FSQ0gpL2Jvb3QvY29tcHJlc3NlZAotdGFyZ2V0X3Jlc2N1ZV9kaXIgICAgID0gJChPQkpfQVJDSCkvYm9vdC9yZXNjdWUKLXNyY19yZXNjdWVfZGlyICAgICAgICA9ICQoU1JDX0FSQ0gpL2Jvb3QvcmVzY3VlCitib290IDo9IGFyY2gvJChBUkNIKS9ib290CitNQUNISU5FIDo9IGFyY2gvJChBUkNIKS8kKFNBUkNIKQogCi1leHBvcnQgdGFyZ2V0X2Jvb3RfYXJjaF9kaXIgdGFyZ2V0X2Jvb3RfZGlyIHNyY19ib290X2RpciB0YXJnZXRfY29tcHJlc3NlZF9kaXIgc3JjX2NvbXByZXNzZWRfZGlyIHRhcmdldF9yZXNjdWVfZGlyIHNyY19yZXNjdWVfZGlyCithbGw6IHpJbWFnZQogCi12bWxpbnV4LmJpbjogdm1saW51eAotCSQoT0JKQ09QWSkgJChPQkpDT1BZRkxBR1MpIHZtbGludXggdm1saW51eC5iaW4KK3pJbWFnZSBJbWFnZTogdm1saW51eAorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgTUFDSElORT0kKE1BQ0hJTkUpICQoYm9vdCkvJEAKIAotdGltYWdlOiB2bWxpbnV4LmJpbgotCWNhdCB2bWxpbnV4LmJpbiBjcmFtZnMuaW1nID50aW1hZ2UKLQotc2ltaW1hZ2U6IHRpbWFnZQotCWNwIHZtbGludXguYmluIHNpbXZtbGludXguYmluCi0KLSMgdGhlIGZvbGxvd2luZyB3aWxsIHJlbWFrZSB0aW1hZ2Ugd2l0aG91dCBjb21waWxpbmcgdGhlIGtlcm5lbAotIyBpdCBkb2VzIG9mIGNvdXJzZSByZXF1aXJlIHRoYXQgYWxsIG9iamVjdCBmaWxlcyBleGlzdC4uLgotCi1jcmFtZnM6Ci0jIyBjcmFtZnMgICAgICAtIENyZWF0ZXMgYSBjcmFtZnMgaW1hZ2UKLQlta2NyYW1mcyAtYiA4MTkyIC1tIHJvbWZzX21ldGEudHh0IHJvb3QgY3JhbWZzLmltZwotCWNhdCB2bWxpbnV4LmJpbiBjcmFtZnMuaW1nID50aW1hZ2UKLQotY2xpbnV4OiB2bWxpbnV4LmJpbiBkZWNvbXByZXNzLmJpbiByZXNjdWUuYmluCi0KLWRlY29tcHJlc3MuYmluOiAkKHRhcmdldF9ib290X2RpcikKLQlAJChNQUtFKSAtZiAkKHNyY19jb21wcmVzc2VkX2RpcikvTWFrZWZpbGUgJCh0YXJnZXRfY29tcHJlc3NlZF9kaXIpL2RlY29tcHJlc3MuYmluCi0KLSQodGFyZ2V0X3Jlc2N1ZV9kaXIpL3Jlc2N1ZS5iaW46ICQodGFyZ2V0X2Jvb3RfZGlyKQotCUAkKE1BS0UpIC1mICQoc3JjX3Jlc2N1ZV9kaXIpL01ha2VmaWxlICQodGFyZ2V0X3Jlc2N1ZV9kaXIpL3Jlc2N1ZS5iaW4KLQotekltYWdlOiAkKHRhcmdldF9ib290X2Rpcikgdm1saW51eC5iaW4gJCh0YXJnZXRfcmVzY3VlX2RpcikvcmVzY3VlLmJpbgotIyMgekltYWdlICAgICAtIENvbXByZXNzZWQga2VybmVsIChnemlwKQotCUAkKE1BS0UpIC1mICQoc3JjX2Jvb3RfZGlyKS9NYWtlZmlsZSB6SW1hZ2UKLQotJCh0YXJnZXRfYm9vdF9kaXIpOiAkKHRhcmdldF9ib290X2FyY2hfZGlyKQotCWxuIC1zZm4gJDwgJEAKLQotJCh0YXJnZXRfYm9vdF9hcmNoX2Rpcik6Ci0JbWtkaXIgLXAgJEAKLQotY29tcHJlc3NlZDogekltYWdlCi0KLWFyY2htcnByb3BlcjoKLWFyY2hjbGVhbjoKLQlAaWYgWyAtZCBhcmNoLyQoQVJDSCkvYm9vdCBdOyB0aGVuIFwKLQkJJChNQUtFKSAkKGNsZWFuKT1hcmNoLyQoQVJDSCkvYm9vdCA7IFwKLQlmaQotCXJtIC1mIHRpbWFnZSB2bWxpbnV4LmJpbiBkZWNvbXByZXNzLmJpbiByZXNjdWUuYmluIGNyYW1mcy5pbWcKLQlybSAtcmYgJChMRF9TQ1JJUFQpLnRtcAotCi1hcmNocHJlcGFyZTogJChTUkNfQVJDSCkvLmxpbmtzICQoc3JjdHJlZSkvaW5jbHVkZS9hc20tJChBUkNIKS8uYXJjaAorYXJjaHByZXBhcmU6ICQoU1JDX0FSQ0gpLy5saW5rcyAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLSQoQVJDSCkvLmFyY2ggRk9SQ0UKIAogIyBDcmVhdGUgc29tZSBsaW5rcyB0byBtYWtlIGFsbCB0b29scyBoYXBweQogJChTUkNfQVJDSCkvLmxpbmtzOgogCUBybSAtcmYgJChTUkNfQVJDSCkvZHJpdmVycwotCUBsbiAtc2ZuICQoU1JDX0FSQ0gpLyQoU0FSQ0gpL2RyaXZlcnMgJChTUkNfQVJDSCkvZHJpdmVycworCUBsbiAtc2ZuICQoU0FSQ0gpL2RyaXZlcnMgJChTUkNfQVJDSCkvZHJpdmVycwogCUBybSAtcmYgJChTUkNfQVJDSCkvYm9vdAotCUBsbiAtc2ZuICQoU1JDX0FSQ0gpLyQoU0FSQ0gpL2Jvb3QgJChTUkNfQVJDSCkvYm9vdAorCUBsbiAtc2ZuICQoU0FSQ0gpL2Jvb3QgJChTUkNfQVJDSCkvYm9vdAogCUBybSAtcmYgJChTUkNfQVJDSCkvbGliCi0JQGxuIC1zZm4gJChTUkNfQVJDSCkvJChTQVJDSCkvbGliICQoU1JDX0FSQ0gpL2xpYgotCUBsbiAtc2ZuICQoU1JDX0FSQ0gpLyQoU0FSQ0gpICQoU1JDX0FSQ0gpL2FyY2gKLQlAbG4gLXNmbiAkKFNSQ19BUkNIKS8kKFNBUkNIKS92bWxpbnV4Lmxkcy5TICQoU1JDX0FSQ0gpL2tlcm5lbC92bWxpbnV4Lmxkcy5TCi0JQGxuIC1zZm4gJChTUkNfQVJDSCkvJChTQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLmMgJChTUkNfQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLmMKKwlAbG4gLXNmbiAkKFNBUkNIKS9saWIgJChTUkNfQVJDSCkvbGliCisJQHJtIC1mICQoU1JDX0FSQ0gpL2FyY2gvbWFjaAorCUBybSAtcmYgJChTUkNfQVJDSCkvYXJjaAorCUBsbiAtc2ZuICQoU0FSQ0gpICQoU1JDX0FSQ0gpL2FyY2gKK2lmZGVmIENPTkZJR19FVFJBWF9BUkNIX1YzMgorCUBsbiAtc2ZuIC4uLyQoU0FSQ0gpLyQoTUFDSCkgJChTUkNfQVJDSCkvYXJjaC9tYWNoCitlbmRpZgorCUBybSAtcmYgJChTUkNfQVJDSCkva2VybmVsL3ZtbGludXgubGRzLlMKKwlAbG4gLXNmbiAuLi8kKFNBUkNIKS92bWxpbnV4Lmxkcy5TICQoU1JDX0FSQ0gpL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisJQHJtIC1yZiAkKFNSQ19BUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMuYworCUBsbiAtc2ZuIC4uLyQoU0FSQ0gpL2tlcm5lbC9hc20tb2Zmc2V0cy5jICQoU1JDX0FSQ0gpL2tlcm5lbC9hc20tb2Zmc2V0cy5jCiAJQHRvdWNoICRACiAKICMgQ3JlYXRlIGxpbmsgdG8gc3ViIGFyY2ggaW5jbHVkZXMKICQoc3JjdHJlZSkvaW5jbHVkZS9hc20tJChBUkNIKS8uYXJjaDogJCh3aWxkY2FyZCBpbmNsdWRlL2NvbmZpZy9hcmNoLyouaCkKLQlAZWNobyAnICBNYWtpbmcgJChzcmN0cmVlKS9pbmNsdWRlL2FzbS0kKEFSQ0gpL2FyY2ggLT4gJChzcmN0cmVlKS9pbmNsdWRlL2FzbS0kKEFSQ0gpLyQoU0FSQ0gpIHN5bWxpbmsnCi0JQHJtIC1mIGluY2x1ZGUvYXNtLSQoQVJDSCkvYXJjaAotCUBsbiAtc2YgJChzcmN0cmVlKS9pbmNsdWRlL2FzbS0kKEFSQ0gpLyQoU0FSQ0gpICQoc3JjdHJlZSkvaW5jbHVkZS9hc20tJChBUkNIKS9hcmNoCisJQGVjaG8gJyAgU1lNTElOSyBpbmNsdWRlL2FzbS0kKEFSQ0gpL2FyY2ggLT4gaW5jbHVkZS9hc20tJChBUkNIKS8kKFNBUkNIKScKKwlAcm0gLWYgJChzcmN0cmVlKS9pbmNsdWRlL2FzbS0kKEFSQ0gpL2FyY2gvbWFjaAorCUBybSAtZiAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLSQoQVJDSCkvYXJjaAorCUBsbiAtc2YgJChTQVJDSCkgJChzcmN0cmVlKS9pbmNsdWRlL2FzbS0kKEFSQ0gpL2FyY2gKK2lmZGVmIENPTkZJR19FVFJBWF9BUkNIX1YzMgorCUBsbiAtc2YgJChNQUNIKSAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLSQoQVJDSCkvYXJjaC9tYWNoCitlbmRpZgogCUB0b3VjaCAkQAorCithcmNoY2xlYW46CisJJChRKWlmIFsgLWUgYXJjaC8kKEFSQ0gpL2Jvb3QgXTsgdGhlbiBcCisJCSQoTUFLRSkgJChjbGVhbik9YXJjaC8kKEFSQ0gpL2Jvb3Q7IFwKKwlmaQorCitDTEVBTl9GSUxFUyArPSBcCisJJChNQUNISU5FKS9ib290L3pJbWFnZSBcCisJJChNQUNISU5FKS9ib290L2NvbXByZXNzZWQvZGVjb21wcmVzcy5iaW4gXAorCSQoTUFDSElORSkvYm9vdC9jb21wcmVzc2VkL3BpZ2d5Lmd6IFwKKwkkKE1BQ0hJTkUpL2Jvb3QvcmVzY3VlL3Jlc2N1ZS5iaW4gXAorCSQoU1JDX0FSQ0gpLy5saW5rcyBcCisJJChzcmN0cmVlKS9pbmNsdWRlL2FzbS0kKEFSQ0gpLy5hcmNoCisKK01SUFJPUEVSX0ZJTEVTICs9IFwKKwkkKFNSQ19BUkNIKS9kcml2ZXJzIFwKKwkkKFNSQ19BUkNIKS9ib290IFwKKwkkKFNSQ19BUkNIKS9saWIgXAorCSQoU1JDX0FSQ0gpL2FyY2ggXAorCSQoU1JDX0FSQ0gpL2tlcm5lbC92bWxpbnV4Lmxkcy5TIFwKKwkkKFNSQ19BUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMuYworCitkZWZpbmUgYXJjaGhlbHAKKyAgZWNobyAgJyogekltYWdlICAgICAgICAtIENvbXByZXNzZWQga2VybmVsIGltYWdlIChhcmNoLyQoQVJDSCkvYm9vdC96SW1hZ2UpJworICBlY2hvICAnKiBJbWFnZSAgICAgICAgIC0gVW5jb21wcmVzc2VkIGtlcm5lbCBpbWFnZSAoYXJjaC8kKEFSQ0gpL2Jvb3QvSW1hZ2UpJworZW5kZWYKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9LY29uZmlnIGIvYXJjaC9jcmlzL2FyY2gtdjEwL0tjb25maWcKaW5kZXggMWQ2MWZhZS4uYWRjMTY0ZSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjEwL0tjb25maWcKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL0tjb25maWcKQEAgLTEsNSArMSw3IEBACiBpZiBFVFJBWF9BUkNIX1YxMAogCittZW51ICJDUklTIHYxMCBvcHRpb25zIgorCiAjIEVUUkFYIDEwMExYIHYxIGhhcyBhIE1NVSAiZmVhdHVyZSIgcmVxdWlyaW5nIGEgbG93IG1hcHBpbmcKIGNvbmZpZyBDUklTX0xPV19NQVAKIAlib29sCkBAIC0yMjgsNjkgKzIzMCw2IEBACiAJICBGb3IgcHJvZHVjdHMgd2l0aCBvbmx5IG9uZSBvciB0d28gY29udHJvbGxhYmxlIExFRHMsCiAJICBzZXQgdGhpcyB0byBzYW1lIGFzIENPTkZJR19FVFJBWF9MRUQxRyAobm9ybWFsbHkgMikuCiAKLWNob2ljZQotCXByb21wdCAiUHJvZHVjdCBkZWJ1Zy1wb3J0IgotCWRlcGVuZHMgb24gRVRSQVhfQVJDSF9WMTAKLQlkZWZhdWx0IEVUUkFYX0RFQlVHX1BPUlQwCi0KLWNvbmZpZyBFVFJBWF9ERUJVR19QT1JUMAotCWJvb2wgIlNlcmlhbC0wIgotCWhlbHAKLQkgIENob29zZSBhIHNlcmlhbCBwb3J0IGZvciB0aGUgRVRSQVggZGVidWcgY29uc29sZS4gIERlZmF1bHQgdG8KLQkgIHBvcnQgMC4KLQotY29uZmlnIEVUUkFYX0RFQlVHX1BPUlQxCi0JYm9vbCAiU2VyaWFsLTEiCi0JaGVscAotCSAgVXNlIHNlcmlhbCBwb3J0IDEgZm9yIHRoZSBjb25zb2xlLgotCi1jb25maWcgRVRSQVhfREVCVUdfUE9SVDIKLQlib29sICJTZXJpYWwtMiIKLQloZWxwCi0JICBVc2Ugc2VyaWFsIHBvcnQgMiBmb3IgdGhlIGNvbnNvbGUuCi0KLWNvbmZpZyBFVFJBWF9ERUJVR19QT1JUMwotCWJvb2wgIlNlcmlhbC0zIgotCWhlbHAKLQkgIFVzZSBzZXJpYWwgcG9ydCAzIGZvciB0aGUgY29uc29sZS4KLQotY29uZmlnIEVUUkFYX0RFQlVHX1BPUlRfTlVMTAotCWJvb2wgImRpc2FibGVkIgotCWhlbHAKLQkgIERpc2FibGUgc2VyaWFsLXBvcnQgZGVidWdnaW5nLgotCi1lbmRjaG9pY2UKLQotY2hvaWNlCi0JcHJvbXB0ICJLZXJuZWwgR0RCIHBvcnQiCi0JZGVwZW5kcyBvbiBFVFJBWF9LR0RCCi0JZGVmYXVsdCBFVFJBWF9LR0RCX1BPUlQwCi0JaGVscAotCSAgQ2hvb3NlIGEgc2VyaWFsIHBvcnQgZm9yIGtlcm5lbCBkZWJ1Z2dpbmcuICBOT1RFOiBUaGlzIHBvcnQgc2hvdWxkCi0JICBub3QgYmUgZW5hYmxlZCB1bmRlciBEcml2ZXJzIGZvciBidWlsdC1pbiBpbnRlcmZhY2VzIChhcyBpdCBoYXMgaXRzCi0JICBvd24gaW5pdGlhbGl6YXRpb24gY29kZSkgYW5kIHNob3VsZCBub3QgYmUgdGhlIHNhbWUgYXMgdGhlIGRlYnVnIHBvcnQuCi0KLWNvbmZpZyBFVFJBWF9LR0RCX1BPUlQwCi0JYm9vbCAiU2VyaWFsLTAiCi0JaGVscAotCSAgVXNlIHNlcmlhbCBwb3J0IDAgZm9yIGtlcm5lbCBkZWJ1Z2dpbmcuCi0KLWNvbmZpZyBFVFJBWF9LR0RCX1BPUlQxCi0JYm9vbCAiU2VyaWFsLTEiCi0JaGVscAotCSAgVXNlIHNlcmlhbCBwb3J0IDEgZm9yIGtlcm5lbCBkZWJ1Z2dpbmcuCi0KLWNvbmZpZyBFVFJBWF9LR0RCX1BPUlQyCi0JYm9vbCAiU2VyaWFsLTIiCi0JaGVscAotCSAgVXNlIHNlcmlhbCBwb3J0IDIgZm9yIGtlcm5lbCBkZWJ1Z2dpbmcuCi0KLWNvbmZpZyBFVFJBWF9LR0RCX1BPUlQzCi0JYm9vbCAiU2VyaWFsLTMiCi0JaGVscAotCSAgVXNlIHNlcmlhbCBwb3J0IDMgZm9yIGtlcm5lbCBkZWJ1Z2dpbmcuCi0KLWVuZGNob2ljZQogCiBjaG9pY2UKIAlwcm9tcHQgIlByb2R1Y3QgcmVzY3VlLXBvcnQiCkBAIC00NTQsNCArMzkzLDYgQEAKIAloZWxwCiAJICBDb25maWd1cmUgd2hlcmUgcG93ZXIgYnV0dG9uIGlzIGNvbm5lY3RlZC4KIAorZW5kbWVudQorCiBlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2Jvb3QvTWFrZWZpbGUgYi9hcmNoL2NyaXMvYXJjaC12MTAvYm9vdC9NYWtlZmlsZQppbmRleCBlNWIxMDU4Li4yMGM4M2E1IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAvYm9vdC9NYWtlZmlsZQorKysgYi9hcmNoL2NyaXMvYXJjaC12MTAvYm9vdC9NYWtlZmlsZQpAQCAtMSwxMyArMSwyMSBAQAogIwotIyBhcmNoL2NyaXMvYm9vdC9NYWtlZmlsZQorIyBhcmNoL2NyaXMvYXJjaC12MTAvYm9vdC9NYWtlZmlsZQogIwotdGFyZ2V0ID0gJCh0YXJnZXRfYm9vdF9kaXIpCi1zcmMgICAgPSAkKHNyY19ib290X2RpcikKIAotekltYWdlOiBjb21wcmVzc2VkL3ZtbGludXoKK09CSkNPUFkgPSBvYmpjb3B5LWNyaXMKK09CSkNPUFlGTEFHUyA9IC1PIGJpbmFyeSAtLXJlbW92ZS1zZWN0aW9uPS5ic3MKIAotY29tcHJlc3NlZC92bWxpbnV6OgotCUAkKE1BS0UpIC1mICQoc3JjKS9jb21wcmVzc2VkL01ha2VmaWxlICQodGFyZ2V0X2NvbXByZXNzZWRfZGlyKS92bWxpbnV6CitzdWJkaXItIDo9IGNvbXByZXNzZWQgcmVzY3VlCit0YXJnZXRzIDo9IEltYWdlCiAKLWNsZWFuOgotCUAkKE1BS0UpIC1mICQoc3JjKS9jb21wcmVzc2VkL01ha2VmaWxlIGNsZWFuCiskKG9iaikvSW1hZ2U6IHZtbGludXggRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxvYmpjb3B5KQorCUBlY2hvICcgIEtlcm5lbDogJEAgaXMgcmVhZHknCisKKyQob2JqKS9jb21wcmVzc2VkL3ZtbGludXg6ICQob2JqKS9JbWFnZSBGT1JDRQorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQob2JqKS9jb21wcmVzc2VkICRACisJJChRKSQoTUFLRSkgJChidWlsZCk9JChvYmopL3Jlc2N1ZSAkKG9iaikvcmVzY3VlL3Jlc2N1ZS5iaW4KKworJChvYmopL3pJbWFnZTogICQob2JqKS9jb21wcmVzc2VkL3ZtbGludXgKKwlAY3AgJDwgJEAKKwlAZWNobyAnICBLZXJuZWw6ICRAIGlzIHJlYWR5JwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZSBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKaW5kZXggNjU4NGE0NC4uNGEwMzFjYiAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjEwL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQorKysgYi9hcmNoL2NyaXMvYXJjaC12MTAvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCkBAIC0xLDQ1ICsxLDM1IEBACiAjCi0jIGNyZWF0ZSBhIGNvbXByZXNzZWQgdm1saW51eiBpbWFnZSBmcm9tIHRoZSBiaW5hcnkgdm1saW51eC5iaW4gZmlsZQorIyBhcmNoL2NyaXMvYXJjaC12MTAvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCiAjCi10YXJnZXQgPSAkKHRhcmdldF9jb21wcmVzc2VkX2RpcikKLXNyYyAgICA9ICQoc3JjX2NvbXByZXNzZWRfZGlyKQogCiBDQyA9IGdjYy1jcmlzIC1tZWxmICQoTElOVVhJTkNMVURFKQotQ0ZMQUdTID0gLU8yCitjY2ZsYWdzLXkgKz0gLU8yCiBMRCA9IGxkLWNyaXMKK2xkZmxhZ3MteSArPSAtVCAkKG9iaikvZGVjb21wcmVzcy5sZAorT0JKRUNUUyA9ICQob2JqKS9oZWFkLm8gJChvYmopL21pc2MubwogT0JKQ09QWSA9IG9iamNvcHktY3JpcwogT0JKQ09QWUZMQUdTID0gLU8gYmluYXJ5IC0tcmVtb3ZlLXNlY3Rpb249LmJzcwotT0JKRUNUUyA9ICQodGFyZ2V0KS9oZWFkLm8gJCh0YXJnZXQpL21pc2MubwogCi0jIGZpbGVzIHRvIGNvbXByZXNzCi1TWVNURU0gPSAkKG9ianRyZWUpL3ZtbGludXguYmluCitxdWlldF9jbWRfaW1hZ2UgPSBCVUlMRCAgICRACitjbWRfaW1hZ2UgPSBjYXQgJChvYmopL2RlY29tcHJlc3MuYmluICQob2JqKS9waWdneS5neiA+ICRACiAKLWFsbDogJCh0YXJnZXRfY29tcHJlc3NlZF9kaXIpL3ZtbGludXoKK3RhcmdldHMgOj0gdm1saW51eCBwaWdneS5neiBkZWNvbXByZXNzLm8gZGVjb21wcmVzcy5iaW4KIAotJCh0YXJnZXQpL2RlY29tcHJlc3MuYmluOiAkKE9CSkVDVFMpCi0JJChMRCkgLVQgJChzcmMpL2RlY29tcHJlc3MubGQgLW8gJCh0YXJnZXQpL2RlY29tcHJlc3MubyAkKE9CSkVDVFMpCi0JJChPQkpDT1BZKSAkKE9CSkNPUFlGTEFHUykgJCh0YXJnZXQpL2RlY29tcHJlc3MubyAkKHRhcmdldCkvZGVjb21wcmVzcy5iaW4KKyQob2JqKS9kZWNvbXByZXNzLm86ICQoT0JKRUNUUykgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxsZCkKIAotIyBDcmVhdGUgdm1saW51eiBpbWFnZSBpbiB0b3AtbGV2ZWwgYnVpbGQgZGlyZWN0b3J5Ci0kKHRhcmdldF9jb21wcmVzc2VkX2Rpcikvdm1saW51ejogJCh0YXJnZXQpIHBpZ2d5LmltZyAkKHRhcmdldCkvZGVjb21wcmVzcy5iaW4KLQlAZWNobyAiICBDT01QUiAgIHZtbGludXguYmluIC0tPiB2bWxpbnV6IgotCUBjYXQgJCh0YXJnZXQpL2RlY29tcHJlc3MuYmluIHBpZ2d5LmltZyA+ICQodGFyZ2V0X2NvbXByZXNzZWRfZGlyKS92bWxpbnV6Ci0JQHJtIC1mIHBpZ2d5LmltZworJChvYmopL2RlY29tcHJlc3MuYmluOiAkKG9iaikvZGVjb21wcmVzcy5vIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsb2JqY29weSkKIAotJCh0YXJnZXQpL2hlYWQubzogJChzcmMpL2hlYWQuUwotCSQoQ0MpIC1EX19BU1NFTUJMWV9fIC10cmFkaXRpb25hbCAtYyAkPCAtbyAkQAorJChvYmopL2hlYWQubzogJChvYmopL2hlYWQuUyAuY29uZmlnCisJQCQoQ0MpIC1EX19BU1NFTUJMWV9fIC10cmFkaXRpb25hbCAtYyAkPCAtbyAkQAogCi0kKHRhcmdldCkvbWlzYy5vOiAkKHNyYykvbWlzYy5jCi0JJChDQykgLURfX0tFUk5FTF9fIC1jICQ8IC1vICRACiskKG9iaikvbWlzYy5vOiAkKG9iaikvbWlzYy5jIC5jb25maWcKKwlAJChDQykgLURfX0tFUk5FTF9fIC1jICQ8IC1vICRACiAKLSMgZ3ppcCB0aGUga2VybmVsIGltYWdlCiskKG9iaikvdm1saW51eDogJChvYmopL3BpZ2d5Lmd6ICQob2JqKS9kZWNvbXByZXNzLmJpbiBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGltYWdlKQogCi1waWdneS5pbWc6ICQoU1lTVEVNKQotCUBjYXQgJChTWVNURU0pIHwgZ3ppcCAtZiAtOSA+IHBpZ2d5LmltZwotCi0kKHRhcmdldCk6Ci0JbWtkaXIgLXAgJCh0YXJnZXQpCi0KLWNsZWFuOgotCXJtIC1mIHBpZ2d5LmltZyAkKG9ianRyZWUpL3ZtbGludXoKKyQob2JqKS9waWdneS5nejogJChvYmopLy4uL0ltYWdlIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsZ3ppcCkKIApkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2Jvb3QvY29tcHJlc3NlZC9taXNjLmMgYi9hcmNoL2NyaXMvYXJjaC12MTAvYm9vdC9jb21wcmVzc2VkL21pc2MuYwppbmRleCBlMjA1ZDJlLi45YTQzYWIxIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAvYm9vdC9jb21wcmVzc2VkL21pc2MuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAvYm9vdC9jb21wcmVzc2VkL21pc2MuYwpAQCAtMSwxNSArMSwxMyBAQAogLyoKICAqIG1pc2MuYwogICoKLSAqICRJZDogbWlzYy5jLHYgMS42IDIwMDMvMTAvMjcgMDg6MDQ6MzEgc3RhcnZpayBFeHAgJAotICogCi0gKiBUaGlzIGlzIGEgY29sbGVjdGlvbiBvZiBzZXZlcmFsIHJvdXRpbmVzIGZyb20gZ3ppcC0xLjAuMyAKKyAqIFRoaXMgaXMgYSBjb2xsZWN0aW9uIG9mIHNldmVyYWwgcm91dGluZXMgZnJvbSBnemlwLTEuMC4zCiAgKiBhZGFwdGVkIGZvciBMaW51eC4KICAqCiAgKiBtYWxsb2MgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzIGFuZCBNYXR0aGlhcyBVcmxpY2hzIDE5OTQKICAqIHB1dHMgYnkgTmljayBIb2xsb3dheSAxOTkzLCBiZXR0ZXIgcHV0cyBieSBNYXJ0aW4gTWFyZXMgMTk5NQogICogYWRhcHRhdGlvbiBmb3IgTGludXgvQ1JJUyBBeGlzIENvbW11bmljYXRpb25zIEFCLCAxOTk5Ci0gKiAKKyAqCiAgKi8KIAogLyogd2hlcmUgdGhlIHBpZ2d5YmFja2VkIGtlcm5lbCBpbWFnZSBleHBlY3RzIGl0c2VsZiB0byBsaXZlLgpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2Jvb3QvcmVzY3VlL01ha2VmaWxlIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2Jvb3QvcmVzY3VlL01ha2VmaWxlCmluZGV4IDhiZTliMzEuLjJlNTA0NWIgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9ib290L3Jlc2N1ZS9NYWtlZmlsZQorKysgYi9hcmNoL2NyaXMvYXJjaC12MTAvYm9vdC9yZXNjdWUvTWFrZWZpbGUKQEAgLTEsNTYgKzEsMzggQEAKICMKLSMgTWFrZWZpbGUgZm9yIHJlc2N1ZSBjb2RlCisjIE1ha2VmaWxlIGZvciByZXNjdWUgKGJvb3RzdHJhcCkgY29kZQogIwotdGFyZ2V0ID0gJCh0YXJnZXRfcmVzY3VlX2RpcikKLXNyYyAgICA9ICQoc3JjX3Jlc2N1ZV9kaXIpCiAKIENDID0gZ2NjLWNyaXMgLW1saW51eCAkKExJTlVYSU5DTFVERSkKLUNGTEFHUyA9IC1PMgorY2NmbGFncy15ICs9IC1PMgorYXNmbGFncy15ICs9IC10cmFkaXRpb25hbAogTEQgPSBnY2MtY3JpcyAtbWxpbnV4IC1ub3N0ZGxpYgorbGRmbGFncy15ICs9IC1UICQob2JqKS9yZXNjdWUubGQKIE9CSkNPUFkgPSBvYmpjb3B5LWNyaXMKIE9CSkNPUFlGTEFHUyA9IC1PIGJpbmFyeSAtLXJlbW92ZS1zZWN0aW9uPS5ic3MKK29iai0kKENPTkZJR19FVFJBWF9BWElTRkxBU0hNQVApID0gaGVhZC5vCitPQkpFQ1QgOj0gJChvYmopL2hlYWQubwogCi1hbGw6ICQodGFyZ2V0KS9yZXNjdWUuYmluICQodGFyZ2V0KS90ZXN0cmVzY3VlLmJpbiAkKHRhcmdldCkva2ltYWdlcmVzY3VlLmJpbgordGFyZ2V0cyA6PSByZXNjdWUubyByZXNjdWUuYmluCiAKLSQodGFyZ2V0KS9yZXNjdWUuYmluOiAkKHRhcmdldCkgJCh0YXJnZXQpL2hlYWQubwotCSQoTEQpIC1UICQoc3JjKS9yZXNjdWUubGQgLW8gJCh0YXJnZXQpL3Jlc2N1ZS5vICQodGFyZ2V0KS9oZWFkLm8KLQkkKE9CSkNPUFkpICQoT0JKQ09QWUZMQUdTKSAkKHRhcmdldCkvcmVzY3VlLm8gJCh0YXJnZXQpL3Jlc2N1ZS5iaW4KLSMgUGxhY2UgYSBjb3B5IGluIHRvcC1sZXZlbCBidWlsZCBkaXJlY3RvcnkKLQljcCAtcCAkKHRhcmdldCkvcmVzY3VlLmJpbiAkKG9ianRyZWUpCiskKG9iaikvcmVzY3VlLm86ICQoT0JKRUNUKSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGxkKQogCi0kKHRhcmdldCkvdGVzdHJlc2N1ZS5iaW46ICQodGFyZ2V0KSAkKHRhcmdldCkvdGVzdHJlc2N1ZS5vCi0JJChPQkpDT1BZKSAkKE9CSkNPUFlGTEFHUykgJCh0YXJnZXQpL3Rlc3RyZXNjdWUubyB0ci5iaW4KKyQob2JqKS9yZXNjdWUuYmluOiAkKG9iaikvcmVzY3VlLm8gRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxvYmpjb3B5KQorCWNwIC1wICQob2JqKS9yZXNjdWUuYmluICQob2JqdHJlZSkKKworJChvYmopL3Rlc3RyZXNjdWUuYmluOiAkKG9iaikvdGVzdHJlc2N1ZS5vCisJJChPQkpDT1BZKSAkKE9CSkNPUFlGTEFHUykgJChvYmopL3Rlc3RyZXNjdWUubyB0ci5iaW4KICMgUGFkIGl0IHRvIDc4NCBieXRlcwogCWRkIGlmPS9kZXYvemVybyBvZj10bXAyNDIzIGJzPTEgY291bnQ9Nzg0CiAJY2F0IHRyLmJpbiB0bXAyNDIzID50ZXN0cmVzY3VlX3RtcC5iaW4KLQlkZCBpZj10ZXN0cmVzY3VlX3RtcC5iaW4gb2Y9JCh0YXJnZXQpL3Rlc3RyZXNjdWUuYmluIGJzPTEgY291bnQ9Nzg0CisJZGQgaWY9dGVzdHJlc2N1ZV90bXAuYmluIG9mPSQob2JqKS90ZXN0cmVzY3VlLmJpbiBicz0xIGNvdW50PTc4NAogCXJtIHRyLmJpbiB0bXAyNDIzIHRlc3RyZXNjdWVfdG1wLmJpbgogCi0kKHRhcmdldCkva2ltYWdlcmVzY3VlLmJpbjogJCh0YXJnZXQpICQodGFyZ2V0KS9raW1hZ2VyZXNjdWUubwotCSQoT0JKQ09QWSkgJChPQkpDT1BZRkxBR1MpICQodGFyZ2V0KS9raW1hZ2VyZXNjdWUubyBrdHIuYmluCiskKG9iaikva2ltYWdlcmVzY3VlLmJpbjogJChvYmopL2tpbWFnZXJlc2N1ZS5vCisJJChPQkpDT1BZKSAkKE9CSkNPUFlGTEFHUykgJChvYmopL2tpbWFnZXJlc2N1ZS5vIGt0ci5iaW4KICMgUGFkIGl0IHRvIDc4NCBieXRlcywgdGhhdCdzIHdoYXQgdGhlIHJlc2N1ZSBsb2FkZXIgZXhwZWN0cwogCWRkIGlmPS9kZXYvemVybyBvZj10bXAyNDIzIGJzPTEgY291bnQ9Nzg0CiAJY2F0IGt0ci5iaW4gdG1wMjQyMyA+a2ltYWdlcmVzY3VlX3RtcC5iaW4KLQlkZCBpZj1raW1hZ2VyZXNjdWVfdG1wLmJpbiBvZj0kKHRhcmdldCkva2ltYWdlcmVzY3VlLmJpbiBicz0xIGNvdW50PTc4NAorCWRkIGlmPWtpbWFnZXJlc2N1ZV90bXAuYmluIG9mPSQob2JqKS9raW1hZ2VyZXNjdWUuYmluIGJzPTEgY291bnQ9Nzg0CiAJcm0ga3RyLmJpbiB0bXAyNDIzIGtpbWFnZXJlc2N1ZV90bXAuYmluCi0KLSQodGFyZ2V0KToKLQlta2RpciAtcCAkKHRhcmdldCkKLQotJCh0YXJnZXQpL2hlYWQubzogJChzcmMpL2hlYWQuUwotCSQoQ0MpIC1EX19BU1NFTUJMWV9fIC10cmFkaXRpb25hbCAtYyAkPCAtbyAkKi5vCi0KLSQodGFyZ2V0KS90ZXN0cmVzY3VlLm86ICQoc3JjKS90ZXN0cmVzY3VlLlMKLQkkKENDKSAtRF9fQVNTRU1CTFlfXyAtdHJhZGl0aW9uYWwgLWMgJDwgLW8gJCoubwotCi0kKHRhcmdldCkva2ltYWdlcmVzY3VlLm86ICQoc3JjKS9raW1hZ2VyZXNjdWUuUwotCSQoQ0MpIC1EX19BU1NFTUJMWV9fIC10cmFkaXRpb25hbCAtYyAkPCAtbyAkKi5vCi0KLWNsZWFuOgotCXJtIC1mICQodGFyZ2V0KS8qLm8gJCh0YXJnZXQpLyouYmluCi0KLWZhc3RkZXA6Ci0KLW1vZHVsZXM6Ci0KLW1vZHVsZXMtaW5zdGFsbDoKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9ib290L3Jlc2N1ZS9oZWFkLlMgYi9hcmNoL2NyaXMvYXJjaC12MTAvYm9vdC9yZXNjdWUvaGVhZC5TCmluZGV4IGYyMjNjYzAuLjZiYTdiZTggMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9ib290L3Jlc2N1ZS9oZWFkLlMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2Jvb3QvcmVzY3VlL2hlYWQuUwpAQCAtMSw1ICsxLDQgQEAKLS8qICRJZDogaGVhZC5TLHYgMS43IDIwMDUvMDMvMDcgMTI6MTE6MDYgc3RhcnZpayBFeHAgJAotICogCisvKgogICogUmVzY3VlIGNvZGUsIG1hZGUgdG8gcmVzaWRlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCiAgKiBmbGFzaC1tZW1vcnkuIHdoZW4gaXQgc3RhcnRzLCBpdCBjaGVja3MgYSBwYXJ0aXRpb24KICAqIHRhYmxlIGF0IHRoZSBmaXJzdCBzZWN0b3IgYWZ0ZXIgdGhlIHJlc2N1ZSBzZWN0b3IuCkBAIC0yMywyMCArMjIsMjAgQEAKICAqIFBhcnRpdGlvbiB0YWJsZSBmb3JtYXQ6CiAgKgogICogICAgIENvZGUgdHJhbnNwYXJlbmN5OgotICogCisgKgogICogICAgIDIgYnl0ZXMgICAgW29wY29kZSAnbm9wJ10KICAqICAgICAyIGJ5dGVzICAgIFtvcGNvZGUgJ2RpJ10KICAqICAgICA0IGJ5dGVzICAgIFtvcGNvZGUgJ2JhIDxvZmZzZXQ+JywgOC1iaXQgb3IgMTYtYml0IHZlcnNpb25dCiAgKiAgICAgMiBieXRlcyAgICBbb3Bjb2RlICdub3AnLCBkZWxheSBzbG90XQogICoKLSAqICAgICBUYWJsZSB2YWxpZGF0aW9uIChhdCArMTApOgkKLSAqIAorICogICAgIFRhYmxlIHZhbGlkYXRpb24gKGF0ICsxMCk6CisgKgogICogICAgIDIgYnl0ZXMgICAgW21hZ2ljL3ZlcnNpb24gd29yZCBmb3IgcGFydGl0aW9udGFibGUgLSAweGVmLCAweGJlXQogICogICAgIDIgYnl0ZXMgICAgW2xlbmd0aCBvZiBhbGwgZW50cmllcyBwbHVzIHRoZSBlbmQgbWFya2VyXQogICogICAgIDQgYnl0ZXMgICAgW2NoZWNrc3VtIGZvciB0aGUgcGFydGl0aW9udGFibGUgaXRzZWxmXQogICoKLSAqICAgICBFbnRyaWVzLCBlYWNoIHdpdGggdGhlIGZvbGxvd2luZyBmb3JtYXQsIGxhc3QgaGFzIG9mZnNldCAtMToJCi0gKiAgICAKKyAqICAgICBFbnRyaWVzLCBlYWNoIHdpdGggdGhlIGZvbGxvd2luZyBmb3JtYXQsIGxhc3QgaGFzIG9mZnNldCAtMToKKyAqCiAgKiAgICAgICAgNCBieXRlcyAgICBbb2Zmc2V0IGluIGJ5dGVzLCBmcm9tIHN0YXJ0IG9mIGZsYXNoXQogICogICAgICAgIDQgYnl0ZXMgICAgW2xlbmd0aCBpbiBieXRlcyBvZiBwYXJ0aXRpb25dCiAgKiAgICAgICAgNCBieXRlcyAgICBbY2hlY2tzdW0sIHNpbXBsZSBsb25nd29yZCBzdW1dCkBAIC00Nyw5ICs0Niw5IEBACiAgKiAgICAgRW5kIG1hcmtlcgogICoKICAqICAgICAgICA0IGJ5dGVzICAgIFstMV0KLSAqIAorICoKICAqCSAxMCBieXRlcyAgICBbMCwgcGFkZGluZ10KLSAqIAorICoKICAqIEJpdCAwIGluIGZsYWdzIHNpZ25pZmllcyBSVyBvciBSTy4gVGhlIHJlc2N1ZSBjb2RlIG9ubHkgYm90aGVycwogICogdG8gY2hlY2sgdGhlIGNoZWNrc3VtIGZvciBSTyBwYXJ0aXRpb25zLCBzaW5jZSB0aGUgb3RoZXJzIHdpbGwKICAqIGNoYW5nZSB0aGVpciBkYXRhIHdpdGhvdXQgdXBkYXRpbmcgdGhlIGNoZWNrc3Vtcy4gQSAxIGluIGJpdCAwCkBAIC01OSwyNiArNTgsMjkgQEAKICAqCiAgKiBEdXJpbmcgdGhlIHdhaXQgZm9yIHNlcmlhbCBpbnB1dCwgdGhlIHN0YXR1cyBMRUQgd2lsbCBmbGFzaCBzbyB0aGUKICAqIHVzZXIga25vd3Mgc29tZXRoaW5nIHdlbnQgd3JvbmcuCi0gKiAKLSAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMyBBeGlzIENvbW11bmljYXRpb25zIEFCCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDcgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgogICovCiAKKyNpZmRlZiBDT05GSUdfRVRSQVhfQVhJU0ZMQVNITUFQCisKICNkZWZpbmUgQVNTRU1CTEVSX01BQ1JPU19PTkxZCiAjaW5jbHVkZSA8YXNtL2FyY2gvc3ZfYWRkcl9hZy5oPgogCiAJOzsgVGhlIHBhcnRpdGlvbnRhYmxlIGlzIGxvb2tlZCBmb3IgYXQgdGhlIGZpcnN0IHNlY3RvciBhZnRlciB0aGUgYm9vdAogCTs7IHNlY3Rvci4gU2VjdG9yIHNpemUgaXMgNjU1MzYgYnl0ZXMgaW4gYWxsIGZsYXNoZXMgd2UgdXNlLgotCQkKKwogI2RlZmluZSBQVEFCTEVfU1RBUlQgQ09ORklHX0VUUkFYX1BUQUJMRV9TRUNUT1IKICNkZWZpbmUgUFRBQkxFX01BR0lDIDB4YmVlZgogCiAJOzsgVGhlIG5vcm1hbCBFdHJheDEwMCBvbi1jaGlwIGJvb3QgUk9NIGRvZXMgc2VyaWFsIGJvb3QgYXQgMHgzODAwMDBmMC4KLQk7OyBUaGF0IGlzIG5vdCB3aGVyZSB3ZSBwdXQgb3VyIGRvd25sb2FkZWQgc2VyaWFsIGJvb3QtY29kZS4gVGhlIGxlbmd0aCBpcwotCTs7IGVub3VnaCBmb3IgZG93bmxvYWRpbmcgY29kZSB0aGF0IGxvYWRzIHRoZSByZXN0IG9mIGl0c2VsZiAoYWZ0ZXIKLQk7OyBoYXZpbmcgc2V0dXAgdGhlIERSQU0gZXRjKS4gSXQgaXMgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBvbi1jaGlwCi0JOzsgUk9NIGxvYWRzLCBzbyB0aGUgc2FtZSBob3N0IGxvYWRlciBjYW4gYmUgdXNlZCB0byBsb2FkIGEgcmVzY3VlZAotCTs7IHByb2R1Y3QgYXMgd2VsbCBhcyBvbmUgYm9vdGVkIHRocm91Z2ggdGhlIEV0cmF4IHNlcmlhbCBib290IGNvZGUuCi0JCQorCTs7IFRoYXQgaXMgbm90IHdoZXJlIHdlIHB1dCBvdXIgZG93bmxvYWRlZCBzZXJpYWwgYm9vdC1jb2RlLgorCTs7IFRoZSBsZW5ndGggaXMgZW5vdWdoIGZvciBkb3dubG9hZGluZyBjb2RlIHRoYXQgbG9hZHMgdGhlIHJlc3QKKwk7OyBvZiBpdHNlbGYgKGFmdGVyIGhhdmluZyBzZXR1cCB0aGUgRFJBTSBldGMpLgorCTs7IEl0IGlzIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgb24tY2hpcCBST00gbG9hZHMsIHNvIHRoZSBzYW1lCisJOzsgaG9zdCBsb2FkZXIgY2FuIGJlIHVzZWQgdG8gbG9hZCBhIHJlc2N1ZWQgcHJvZHVjdCBhcyB3ZWxsIGFzCisJOzsgb25lIGJvb3RlZCB0aHJvdWdoIHRoZSBFdHJheCBzZXJpYWwgYm9vdCBjb2RlLgorCiAjZGVmaW5lIENPREVfU1RBUlQgMHg0MDAwMDAwMAogI2RlZmluZSBDT0RFX0xFTkdUSCA3ODQKIApAQCAtMTAyLDcgKzEwNCw3IEBACiAjZGVmaW5lIFNFUlJFQ0MgUl9TRVJJQUwyX1JFQ19DVFJMCiAjZGVmaW5lIFNFUlJEQVQgUl9TRVJJQUwyX1JFQ19EQVRBCiAjZGVmaW5lIFNFUlNUQVQgUl9TRVJJQUwyX1NUQVRVUwotI2VuZGlmCQorI2VuZGlmCiAjaWZkZWYgQ09ORklHX0VUUkFYX1JFU0NVRV9TRVIzCiAjZGVmaW5lIFNFUlhPRkYgUl9TRVJJQUwzX1hPRkYKICNkZWZpbmUgU0VSQkFVRCBSX1NFUklBTDNfQkFVRApAQCAtMTE1LDYwICsxMTcsNjEgQEAKICNkZWZpbmUgUkFNX0lOSVRfTUFHSUMgMHg1NjkwMjM4NwogCiAJLnRleHQKLQkKKwogCTs7IFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IG9mIHRoZSByZXNjdWUgY29kZQogCTs7IDB4ODAwMDAwMDAgaWYgbG9hZGVkIGluIGZsYXNoIChhcyBpdCBzaG91bGQgYmUpCi0JOzsgc2luY2UgZXRyYXggYWN0dWFsbHkgc3RhcnRzIGF0IGFkZHJlc3MgMiB3aGVuIGJvb3RpbmcgZnJvbSBmbGFzaCwgd2UKKwk7OyBTaW5jZSBldHJheCBhY3R1YWxseSBzdGFydHMgYXQgYWRkcmVzcyAyIHdoZW4gYm9vdGluZyBmcm9tIGZsYXNoLCB3ZQogCTs7IHB1dCBhIG5vcCAoMiBieXRlcykgaGVyZSBmaXJzdCBzbyB3ZSBkb250IGFjY2lkZW50YWxseSBza2lwIHRoZSBkaQogCi0Jbm9wCQorCW5vcAogCWRpCiAKIAlqdW1wCWluX2NhY2hlCTsgZW50ZXIgY2FjaGVkIGFyZWEgaW5zdGVhZAogaW5fY2FjaGU6CiAKIAotCTs7IGZpcnN0IHB1dCBhIGp1bXAgdGVzdCB0byBnaXZlIGEgcG9zc2liaWxpdHkgb2YgdXBncmFkaW5nIHRoZSByZXNjdWUgY29kZQotCTs7IHdpdGhvdXQgZXJhc2luZy9yZWZsYXNoaW5nIHRoZSBzZWN0b3IuIHdlIHB1dCBhIGxvbmd3b3JkIG9mIC0xIGhlcmUgYW5kIGlmCi0JOzsgaXQgaXMgbm90IC0xLCB3ZSBqdW1wIHVzaW5nIHRoZSB2YWx1ZSBhcyBqdW1wIHRhcmdldC4gc2luY2Ugd2UgY2FuIGFsd2F5cwotCTs7IGNoYW5nZSAxJ3MgdG8gMCdzIHdpdGhvdXQgZXJhc2luZyB0aGUgc2VjdG9yLCBpdCBpcyBwb3NzaWJsZSB0byBhZGQgbmV3CisJOzsgRmlyc3QgcHV0IGEganVtcCB0ZXN0IHRvIGdpdmUgYSBwb3NzaWJpbGl0eSBvZiB1cGdyYWRpbmcgdGhlCisJOzsgcmVzY3VlIGNvZGUgd2l0aG91dCBlcmFzaW5nL3JlZmxhc2hpbmcgdGhlIHNlY3Rvci4KKwk7OyBXZSBwdXQgYSBsb25nd29yZCBvZiAtMSBoZXJlIGFuZCBpZiBpdCBpcyBub3QgLTEsIHdlIGp1bXAgdXNpbmcKKwk7OyB0aGUgdmFsdWUgYXMganVtcCB0YXJnZXQuIFNpbmNlIHdlIGNhbiBhbHdheXMgY2hhbmdlIDEncyB0byAwJ3MKKwk7OyB3aXRob3V0IGVyYXNpbmcgdGhlIHNlY3RvciwgaXQgaXMgcG9zc2libGUgdG8gYWRkIG5ldwogCTs7IGNvZGUgYWZ0ZXIgdGhpcyBhbmQgYWx0ZXJpbmcgdGhlIGp1bXB0YXJnZXQgaW4gYW4gdXBncmFkZS4KIAoganRjZDoJbW92ZS5kCVtqdW1wdGFyZ2V0XSwgJHIwCiAJY21wLmQJMHhmZmZmZmZmZiwgJHIwCiAJYmVxCW5vX25ld2p1bXAKIAlub3AKLQkKKwogCWp1bXAJWyRyMF0KIAotanVtcHRhcmdldDoJCitqdW1wdGFyZ2V0OgogCS5kd29yZAkweGZmZmZmZmZmCTsgY2FuIGJlIG92ZXJ3cml0dGVuIGxhdGVyIHRvIGluc2VydCBuZXcgY29kZQotCQorCiBub19uZXdqdW1wOgotI2lmZGVmIENPTkZJR19FVFJBWF9FVEhFUk5FVAkJCisjaWZkZWYgQ09ORklHX0VUUkFYX0VUSEVSTkVUCiAJOzsgU3RhcnQgTUlJIGNsb2NrIHRvIG1ha2Ugc3VyZSBpdCBpcyBydW5uaW5nIHdoZW4gdHJhbmNlaXZlciBpcyByZXNldAogCW1vdmUuZCAweDMsICRyMCAgICA7IGVuYWJsZSA9IG9uLCBwaHkgPSBtaWlfY2xrCiAJbW92ZS5kICRyMCwgW1JfTkVUV09SS19HRU5fQ09ORklHXQogI2VuZGlmCi0JCisKIAk7OyBXZSBuZWVkIHRvIHNldHVwIHRoZSBidXMgcmVnaXN0ZXJzIGJlZm9yZSB3ZSBzdGFydCB1c2luZyB0aGUgRFJBTQogI2luY2x1ZGUgIi4uLy4uL2xpYi9kcmFtX2luaXQuUyIKIAogCTs7IHdlIG5vdyBzaG91bGQgZ28gdGhyb3VnaCB0aGUgY2hlY2tzdW0tdGFibGUgYW5kIGNoZWNrIHRoZSBsaXN0ZWQKIAk7OyBwYXJ0aXRpb25zIGZvciBlcnJvcnMuCi0JCisKIAltb3ZlLmQJUFRBQkxFX1NUQVJULCAkcjMKIAltb3ZlLmQJWyRyM10sICRyMAogCWNtcC5kCU5PUF9ESSwgJHIwCTsgbWFrZSBzdXJlIHRoZSBub3AvZGkgaXMgdGhlcmUuLi4KIAlibmUJZG9fcmVzY3VlCiAJbm9wCi0JCisKIAk7OyBza2lwIHRoZSBjb2RlIHRyYW5zcGFyZW5jeSBibG9jayAoMTAgYnl0ZXMpLgogCiAJYWRkcQkxMCwgJHIzCi0JCisKIAk7OyBjaGVjayBmb3IgY29ycmVjdCBtYWdpYwotCQorCiAJbW92ZS53CVskcjMrXSwgJHIwCiAJY21wLncJUFRBQkxFX01BR0lDLCAkcjAKIAlibmUJZG9fcmVzY3VlCTsgZGlkbid0IHJlY29nbml6ZSAtIHRyaWcgcmVzY3VlCkBAIC0xODYsMTEgKzE4OSwxMSBAQAogCWNtcC5kCSRyMCwgJHI0CiAJYm5lCWRvX3Jlc2N1ZQk7IGRpZG4ndCBtYXRjaCAtIHRyaWcgcmVzY3VlCiAJbm9wCi0JCisKIAk7OyBwdGFibGUgaXMgb2suIHZhbGlkYXRlIGVhY2ggZW50cnkuCiAKIAltb3ZlcQktMSwgJHI3Ci0JCisKIHBsb29wOgltb3ZlLmQJWyRyMytdLCAkcjEJOyBwYXJ0aXRpb24gb2Zmc2V0IChmcm9tIHB0YWJsZSBzdGFydCkKIAlibmUJbm90Zmlyc3QJOyBjaGVjayBpZiBpdCBpcyB0aGUgcGFydGl0aW9uIGNvbnRhaW5pbmcgcHRhYmxlCiAJbm9wCQkJOyB5ZXMuLgpAQCAtMTk5LDcgKzIwMiw3IEBACiAJc3ViLmQJJHI4LCAkcjIJOyBtaW51cyB0aGUgcHRhYmxlIGxlbmd0aAogCWJhCWJvc3NlCiAJbm9wCi1ub3RmaXJzdDoJCitub3RmaXJzdDoKIAljbXAuZAktMSwgJHIxCQk7IHRoZSBlbmQgb2YgdGhlIHB0YWJsZSA/CiAJYmVxCWZsYXNoX29rCTsgICBpZiBzbywgdGhlIGZsYXNoIGlzIHZhbGlkYXRlZAogCW1vdmUuZAlbJHIzK10sICRyMgk7IHBhcnRpdGlvbiBsZW5ndGgKQEAgLTIxMyw0NyArMjE2LDQ2IEBACiAJYnBsCTFmCiAJbm9wCiAJbW92ZS5kCSRyMSwgJHI3CTsgcmVtZW1iZXIgYm9vdCBwYXJ0aXRpb24gb2Zmc2V0Ci0xOgkKLQorMToKIAlhZGQuZAlQVEFCTEVfU1RBUlQsICRyMQotCQorCiAJanNyCWNoZWNrc3VtCTsgY2hlY2tzdW0gdGhlIHBhcnRpdGlvbgotCQorCiAJY21wLmQJJHIwLCAkcjUKIAliZXEJcGxvb3AJCTsgY2hlY2tzdW1zIG1hdGNoZWQsIGdvIHRvIG5leHQgZW50cnkKIAlub3AKIAogCTs7IG90aGVyd2lzZSBmYWxsIHRocm91Z2ggdG8gdGhlIHJlc2N1ZSBjb2RlLgotCQorCiBkb19yZXNjdWU6CiAJOzsgc2V0dXAgcG9ydCBQQSBhbmQgUEIgZGVmYXVsdCBpbml0aWFsIGRpcmVjdGlvbnMgYW5kIGRhdGEKIAk7OyAoc28gd2UgY2FuIGZsYXNoIExFRHMsIGFuZCBzbyB0aGF0IERUUiBhbmQgb3RoZXJzIGFyZSBzZXQpCi0JCisKIAltb3ZlLmIJQ09ORklHX0VUUkFYX0RFRl9SX1BPUlRfUEFfRElSLCAkcjAKIAltb3ZlLmIJJHIwLCBbUl9QT1JUX1BBX0RJUl0KIAltb3ZlLmIJQ09ORklHX0VUUkFYX0RFRl9SX1BPUlRfUEFfREFUQSwgJHIwCiAJbW92ZS5iCSRyMCwgW1JfUE9SVF9QQV9EQVRBXQotCQorCiAJbW92ZS5iCUNPTkZJR19FVFJBWF9ERUZfUl9QT1JUX1BCX0RJUiwgJHIwCiAJbW92ZS5iCSRyMCwgW1JfUE9SVF9QQl9ESVJdCiAJbW92ZS5iCUNPTkZJR19FVFJBWF9ERUZfUl9QT1JUX1BCX0RBVEEsICRyMAogCW1vdmUuYgkkcjAsIFtSX1BPUlRfUEJfREFUQV0KIAogCTs7IHNldHVwIHRoZSBzZXJpYWwgcG9ydCBhdCAxMTUyMDAgYmF1ZAotCQorCiAJbW92ZXEJMCwgJHIwCi0JbW92ZS5kCSRyMCwgW1NFUlhPRkZdIAorCW1vdmUuZAkkcjAsIFtTRVJYT0ZGXQogCiAJbW92ZS5iCTB4OTksICRyMAotCW1vdmUuYgkkcjAsIFtTRVJCQVVEXQkJOyAxMTUuMmtiYXVkIGZvciBib3RoIHRyYW5zbWl0IGFuZCByZWNlaXZlCisJbW92ZS5iCSRyMCwgW1NFUkJBVURdCTsgMTE1LjJrYmF1ZCBmb3IgYm90aCB0cmFuc21pdCBhbmQgcmVjZWl2ZQogCi0JbW92ZS5iCTB4NDAsICRyMAkJOyByZWMgZW5hYmxlCi0JbW92ZS5iCSRyMCwgW1NFUlJFQ0NdIAorCW1vdmUuYgkweDQwLCAkcjAJOyByZWMgZW5hYmxlCisJbW92ZS5iCSRyMCwgW1NFUlJFQ0NdCiAKIAltb3ZlcQkwLCAkcjEJCTsgInRpbWVyIiB0byBjbG9jayBvdXQgYSBMRUQgcmVkIGZsYXNoCiAJbW92ZS5kCUNPREVfU1RBUlQsICRyMwk7IGRlc3RpbmF0aW9uIGNvdW50ZXIKIAltb3Z1LncJQ09ERV9MRU5HVEgsICRyNDsgbGVuZ3RoCi0JCisKIHdhaXRfc2VyOgogCWFkZHEJMSwgJHIxCiAjaWZuZGVmIENPTkZJR19FVFJBWF9OT19MRURTCkBAIC0yNzIsMjAgKzI3NCwyMCBAQAogCW5vcAogMToJbm90CSRyMAkJOyBjbGVhciBiaXQKIAlhbmQuZAkkcjAsICRyMgotMjoJCisyOgogI2lmZGVmIENPTkZJR19FVFJBWF9QQV9MRURTCi0JbW92ZS5iCSRyMiwgW1JfUE9SVF9QQV9EQVRBXQkKLSNlbmRpZgkKKwltb3ZlLmIJJHIyLCBbUl9QT1JUX1BBX0RBVEFdCisjZW5kaWYKICNpZmRlZiBDT05GSUdfRVRSQVhfUEJfTEVEUwotCW1vdmUuYgkkcjIsIFtSX1BPUlRfUEJfREFUQV0JCisJbW92ZS5iCSRyMiwgW1JfUE9SVF9QQl9EQVRBXQogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0VUUkFYXzkwMDAwMDAwX0xFRFMKIAltb3ZlLmIJJHIyLCBbMHg5MDAwMDAwMF0KICNlbmRpZgogI2VuZGlmCi0JCisKIAk7OyBjaGVjayBpZiB3ZSBnb3Qgc29tZXRoaW5nIG9uIHRoZSBzZXJpYWwgcG9ydAotCQorCiAJbW92ZS5iCVtTRVJTVEFUXSwgJHIwCiAJYnRzdHEJMCwgJHIwCQk7IGRhdGFfYXZhaWwKIAlicGwJd2FpdF9zZXIKQEAgLTI5NSwxNCArMjk3LDE1IEBACiAKIAltb3ZlLmIJW1NFUlJEQVRdLCAkcjAKIAltb3ZlLmIJJHIwLCBbJHIzK10KLQkKKwogCXN1YnEJMSwgJHI0CQk7IGRlY3JlYXNlIGxlbmd0aAogCWJuZQl3YWl0X3NlcgogCW5vcAogCiAJOzsganVtcCBpbnRvIGRvd25sb2FkZWQgY29kZQogCi0JbW92ZS5kCVJBTV9JTklUX01BR0lDLCAkcjgJOyBUZWxsIG5leHQgcHJvZHVjdCB0aGF0IERSQU0gaXMgaW5pdGlhbGl6ZWQKKwltb3ZlLmQJUkFNX0lOSVRfTUFHSUMsICRyOAk7IFRlbGwgbmV4dCBwcm9kdWN0IHRoYXQgRFJBTSBpcworCQkJCQk7IGluaXRpYWxpemVkCiAJanVtcAlDT0RFX1NUQVJUCiAKIGZsYXNoX29rOgpAQCAtMzEzLDcgKzMxNiw4IEBACiAJbm9wCiAJbW92ZS5kCVBUQUJMRV9TVEFSVCwgJHI3OyBvdGhlcndpc2UgdXNlIHRoZSBwdGFibGUgc3RhcnQKIDE6Ci0JbW92ZS5kCVJBTV9JTklUX01BR0lDLCAkcjgJOyBUZWxsIG5leHQgcHJvZHVjdCB0aGF0IERSQU0gaXMgaW5pdGlhbGl6ZWQKKwltb3ZlLmQJUkFNX0lOSVRfTUFHSUMsICRyOAk7IFRlbGwgbmV4dCBwcm9kdWN0IHRoYXQgRFJBTSBpcworCQkJCQk7IGluaXRpYWxpemVkCiAJanVtcAkkcjcJCTsgYm9vdCEKIAogCkBAIC0zMjcsNyArMzMxLDggQEAKIAltb3ZlcQkwLCAkcjAKIAltb3ZlcSAgIENPTkZJR19FVFJBWF9GTEFTSDFfU0laRSwgJHI2CiAKLQk7OyBJZiB0aGUgZmlyc3QgcGh5c2ljYWwgZmxhc2ggbWVtb3J5IGlzIGV4Y2VlZGVkIHdyYXAgdG8gdGhlIHNlY29uZCBvbmUuCisJOzsgSWYgdGhlIGZpcnN0IHBoeXNpY2FsIGZsYXNoIG1lbW9yeSBpcyBleGNlZWRlZCB3cmFwIHRvIHRoZQorCTs7IHNlY29uZCBvbmUKIAlidHN0cQkyNiwgJHIxCQk7IEFyZSB3ZSBhZGRyZXNzaW5nIGZpcnN0IGZsYXNoPwogCWJwbAkxZgogCW5vcApAQCAtMzUxLDMgKzM1Niw1IEBACiAzOgltb3ZlLmQJTUVNX0NTRTFfU1RBUlQsICRyMSA7IHdyYXAgdG8gc2Vjb25kIGZsYXNoCiAJYmEJMmIKIAlub3AKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAvYm9vdC9yZXNjdWUva2ltYWdlcmVzY3VlLlMgYi9hcmNoL2NyaXMvYXJjaC12MTAvYm9vdC9yZXNjdWUva2ltYWdlcmVzY3VlLlMKaW5kZXggY2JjY2Q2MzE2Li41NWVlZmY4IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAvYm9vdC9yZXNjdWUva2ltYWdlcmVzY3VlLlMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2Jvb3QvcmVzY3VlL2tpbWFnZXJlc2N1ZS5TCkBAIC0xLDUgKzEsNCBAQAotLyogJElkOiBraW1hZ2VyZXNjdWUuUyx2IDEuMSAyMDAxLzEyLzE3IDEzOjU5OjI3IGJqb3JudyBFeHAgJAotICogCisvKgogICogUmVzY3VlIGNvZGUgdG8gYmUgcHJlcGVuZGVkIG9uIGEga2ltYWdlIGFuZCBjb3BpZWQgdG8gdGhlCiAgKiByZXNjdWUgc2VyaWFsIHBvcnQuCiAgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIHRoZSByZXNjdWUgY29kZSwgaXQgd2lsbCBjb3B5IHJlY2VpdmVkIGRhdGEgdG8KQEAgLTcsMTMgKzYsMTMgQEAKICAqLwogCiAjZGVmaW5lIEFTU0VNQkxFUl9NQUNST1NfT05MWQotI2luY2x1ZGUgPGFzbS9zdl9hZGRyX2FnLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3ZfYWRkcl9hZy5oPgogCiAjZGVmaW5lIENPREVfU1RBUlQgMHg0MDAwNDAwMAogI2RlZmluZSBDT0RFX0xFTkdUSCA3ODQKICNkZWZpbmUgVElNRU9VVF9WQUxVRSAxMDAwCi0JCi0JCQorCisKICNpZmRlZiBDT05GSUdfRVRSQVhfUkVTQ1VFX1NFUjAKICNkZWZpbmUgU0VSWE9GRiBSX1NFUklBTDBfWE9GRgogI2RlZmluZSBTRVJCQVVEIFJfU0VSSUFMMF9CQVVECkBAIC0zNCw3ICszMyw3IEBACiAjZGVmaW5lIFNFUlJFQ0MgUl9TRVJJQUwyX1JFQ19DVFJMCiAjZGVmaW5lIFNFUlJEQVQgUl9TRVJJQUwyX1JFQ19EQVRBCiAjZGVmaW5lIFNFUlNUQVQgUl9TRVJJQUwyX1NUQVRVUwotI2VuZGlmCQorI2VuZGlmCiAjaWZkZWYgQ09ORklHX0VUUkFYX1JFU0NVRV9TRVIzCiAjZGVmaW5lIFNFUlhPRkYgUl9TRVJJQUwzX1hPRkYKICNkZWZpbmUgU0VSQkFVRCBSX1NFUklBTDNfQkFVRApAQCAtNDgsNTQgKzQ3LDU1IEBACiAJOzsgMHg4MDAwMDAwMCBpZiBsb2FkZWQgaW4gZmxhc2ggKGFzIGl0IHNob3VsZCBiZSkKIAk7OyBzaW5jZSBldHJheCBhY3R1YWxseSBzdGFydHMgYXQgYWRkcmVzcyAyIHdoZW4gYm9vdGluZyBmcm9tIGZsYXNoLCB3ZQogCTs7IHB1dCBhIG5vcCAoMiBieXRlcykgaGVyZSBmaXJzdCBzbyB3ZSBkb250IGFjY2lkZW50YWxseSBza2lwIHRoZSBkaQotCQotCW5vcAkKKworCW5vcAogCWRpCi0jaWZuZGVmIENPTkZJR19TVklOVE9fU0lNCQorI2lmbmRlZiBDT05GSUdfU1ZJTlRPX1NJTQogCTs7IHNldHVwIHBvcnQgUEEgYW5kIFBCIGRlZmF1bHQgaW5pdGlhbCBkaXJlY3Rpb25zIGFuZCBkYXRhCiAJOzsgKHNvIHdlIGNhbiBmbGFzaCBMRURzLCBhbmQgc28gdGhhdCBEVFIgYW5kIG90aGVycyBhcmUgc2V0KQotCQorCiAJbW92ZS5iCUNPTkZJR19FVFJBWF9ERUZfUl9QT1JUX1BBX0RJUiwgJHIwCiAJbW92ZS5iCSRyMCwgW1JfUE9SVF9QQV9ESVJdCiAJbW92ZS5iCUNPTkZJR19FVFJBWF9ERUZfUl9QT1JUX1BBX0RBVEEsICRyMAogCW1vdmUuYgkkcjAsIFtSX1BPUlRfUEFfREFUQV0KLQkKKwogCW1vdmUuYglDT05GSUdfRVRSQVhfREVGX1JfUE9SVF9QQl9ESVIsICRyMAogCW1vdmUuYgkkcjAsIFtSX1BPUlRfUEJfRElSXQogCW1vdmUuYglDT05GSUdfRVRSQVhfREVGX1JfUE9SVF9QQl9EQVRBLCAkcjAKIAltb3ZlLmIJJHIwLCBbUl9QT1JUX1BCX0RBVEFdCi0JCisKIAk7OyBXZSBuZWVkIHRvIHNldHVwIHRoZSBidXMgcmVnaXN0ZXJzIGJlZm9yZSB3ZSBzdGFydCB1c2luZyB0aGUgRFJBTQogI2luY2x1ZGUgIi4uLy4uL2xpYi9kcmFtX2luaXQuUyIKLQkKKwogI2VuZGlmCiAJOzsgU2V0dXAgdGhlIHN0YWNrIHRvIGEgc3VpdGFibHkgaGlnaCBhZGRyZXNzLgogCTs7IFdlIGFzc3VtZSA4IE1CIGlzIHRoZSBtaW5pbXVtIERSQU0gaW4gYW4gZUxpbnV4CiAJOzsgcHJvZHVjdCBhbmQgcHV0IHRoZSBzcCBhdCB0aGUgdG9wIGZvciBub3cuCiAKIAltb3ZlLmQJMHg0MDgwMDAwMCwgJHNwCi0JCisKIAk7OyBzZXR1cCB0aGUgc2VyaWFsIHBvcnQgYXQgMTE1MjAwIGJhdWQKLQkKKwogCW1vdmVxCTAsICRyMAotCW1vdmUuZAkkcjAsIFtTRVJYT0ZGXSAKKwltb3ZlLmQJJHIwLCBbU0VSWE9GRl0KIAogCW1vdmUuYgkweDk5LCAkcjAKLQltb3ZlLmIJJHIwLCBbU0VSQkFVRF0JCTsgMTE1LjJrYmF1ZCBmb3IgYm90aCB0cmFuc21pdCBhbmQgcmVjZWl2ZQorCW1vdmUuYgkkcjAsIFtTRVJCQVVEXQkJOyAxMTUuMmtiYXVkIGZvciBib3RoIHRyYW5zbWl0CisJCQkJCTsgYW5kIHJlY2VpdmUKIAogCW1vdmUuYgkweDQwLCAkcjAJCTsgcmVjIGVuYWJsZQotCW1vdmUuYgkkcjAsIFtTRVJSRUNDXSAKKwltb3ZlLmIJJHIwLCBbU0VSUkVDQ10KIAogCi0JbW92ZXEJMCwgJHIxCQk7ICJ0aW1lciIgdG8gY2xvY2sgb3V0IGEgTEVEIHJlZCBmbGFzaAotCW1vdmUuZAlDT0RFX1NUQVJULCAkcjMJOyBkZXN0aW5hdGlvbiBjb3VudGVyCisJbW92ZXEJMCwgJHIxCQkJOyAidGltZXIiIHRvIGNsb2NrIG91dCBhIExFRCByZWQgZmxhc2gKKwltb3ZlLmQJQ09ERV9TVEFSVCwgJHIzCQk7IGRlc3RpbmF0aW9uIGNvdW50ZXIKIAltb3ZlLmQJQ09ERV9MRU5HVEgsICRyNAk7IGxlbmd0aAogCW1vdmUuZAlUSU1FT1VUX1ZBTFVFLCAkcjUJOyAidGltZW91dCIgdW50aWwganVtcAogCiB3YWl0X3NlcjoKIAlhZGRxCTEsICRyMQotCXN1YnEJMSwgJHI1CQk7IGRlY3JlYXNlIHRpbWVvdXQKLQliZXEJanVtcF9zdGFydAk7IHRpbWVkIG91dAorCXN1YnEJMSwgJHI1CQkJOyBkZWNyZWFzZSB0aW1lb3V0CisJYmVxCWp1bXBfc3RhcnQJCTsgdGltZWQgb3V0CiAJbm9wCiAjaWZuZGVmIENPTkZJR19FVFJBWF9OT19MRURTCiAjaWZkZWYgQ09ORklHX0VUUkFYX1BBX0xFRFMKQEAgLTExMSwyMSArMTExLDIxIEBACiAJb3IuZAkkcjAsICRyMgkJOyBzZXQgYml0CiAJYmEJMmYKIAlub3AKLTE6CW5vdAkkcjAJCTsgY2xlYXIgYml0CisxOglub3QJJHIwCQkJOyBjbGVhciBiaXQKIAlhbmQuZAkkcjAsICRyMgotMjoJCisyOgogI2lmZGVmIENPTkZJR19FVFJBWF9QQV9MRURTCiAJbW92ZS5iCSRyMiwgW1JfUE9SVF9QQV9EQVRBXQotI2VuZGlmCQorI2VuZGlmCiAjaWZkZWYgQ09ORklHX0VUUkFYX1BCX0xFRFMKIAltb3ZlLmIJJHIyLCBbUl9QT1JUX1BCX0RBVEFdCiAjZW5kaWYKICNlbmRpZgotCQkKKwogCTs7IGNoZWNrIGlmIHdlIGdvdCBzb21ldGhpbmcgb24gdGhlIHNlcmlhbCBwb3J0Ci0JCisKIAltb3ZlLmIJW1NFUlNUQVRdLCAkcjAKLQlidHN0cQkwLCAkcjAJCTsgZGF0YV9hdmFpbAorCWJ0c3RxCTAsICRyMAkJCTsgZGF0YV9hdmFpbAogCWJwbAl3YWl0X3NlcgogCW5vcAogCkBAIC0xMzQsNyArMTM0LDcgQEAKIAltb3ZlLmIJW1NFUlJEQVRdLCAkcjAKIAltb3ZlLmIJJHIwLCBbJHIzK10KIAltb3ZlLmQJVElNRU9VVF9WQUxVRSwgJHI1CTsgcmVzZXQgInRpbWVvdXQiCi0Jc3VicQkxLCAkcjQJCTsgZGVjcmVhc2UgbGVuZ3RoCisJc3VicQkxLCAkcjQJCQk7IGRlY3JlYXNlIGxlbmd0aAogCWJuZQl3YWl0X3NlcgogCW5vcAoganVtcF9zdGFydDoKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9ib290L3Jlc2N1ZS90ZXN0cmVzY3VlLlMgYi9hcmNoL2NyaXMvYXJjaC12MTAvYm9vdC9yZXNjdWUvdGVzdHJlc2N1ZS5TCmluZGV4IDU2NmE5ZjMuLjJkOTM3ZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9ib290L3Jlc2N1ZS90ZXN0cmVzY3VlLlMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2Jvb3QvcmVzY3VlL3Rlc3RyZXNjdWUuUwpAQCAtMSwxMyArMSwxMiBAQAotLyogJElkOiB0ZXN0cmVzY3VlLlMsdiAxLjEgMjAwMS8xMi8xNyAxMzo1OToyNyBiam9ybncgRXhwICQKLSAqCisvKgogICogU2ltcGxlIHRlc3Rjb2RlIHRvIGRvd25sb2FkIGJ5IHRoZSByZXNjdWUgYmxvY2suCi0gKiBKdXN0IGxpdHMgc29tZSBMRURzIHRvIHNob3cgaXQgd2FzIGRvd25sb2FkZWQgY29ycmVjdGx5LgotICogCisgKiBKdXN0IGxpZ2h0cyBzb21lIExFRHMgdG8gc2hvdyBpdCB3YXMgZG93bmxvYWRlZCBjb3JyZWN0bHkuCisgKgogICogQ29weXJpZ2h0IChDKSAxOTk5IEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIKICAqLwogCiAjZGVmaW5lIEFTU0VNQkxFUl9NQUNST1NfT05MWQotI2luY2x1ZGUgPGFzbS9zdl9hZGRyX2FnLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3ZfYWRkcl9hZy5oPgogCiAJLnRleHQKIApAQCAtMTYsMTEgKzE1LDEwIEBACiAJbW92ZXEJLTEsICRyMgogCW1vdmUuYgkkcjIsIFtSX1BPUlRfUEFfRElSXQogCW1vdmVxCTAsICRyMgotCW1vdmUuYgkkcjIsIFtSX1BPUlRfUEFfREFUQV0JCisJbW92ZS5iCSRyMiwgW1JfUE9SVF9QQV9EQVRBXQogCiBlbmRsZXNzOgogCW5vcAogCWJhCWVuZGxlc3MKIAlub3AKIAotCQpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvS2NvbmZpZyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL0tjb25maWcKaW5kZXggOTY3NDBlZi4uNThmNTg2NCAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvS2NvbmZpZworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9LY29uZmlnCkBAIC05LDM3ICs5LDYgQEAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIEVUUkFYIDEwMExYIGJ1aWx0LWluIDEwLzEwME1iaXQgRXRoZXJuZXQKIAkgIGNvbnRyb2xsZXIuCiAKLWNob2ljZQotCXByb21wdCAiTmV0d29yayBMRUQgYmVoYXZpb3IiCi0JZGVwZW5kcyBvbiBFVFJBWF9FVEhFUk5FVAotCWRlZmF1bHQgRVRSQVhfTkVUV09SS19MRURfT05fV0hFTl9BQ1RJVklUWQotCi1jb25maWcgRVRSQVhfTkVUV09SS19MRURfT05fV0hFTl9MSU5LCi0JYm9vbCAiTEVEX29uX3doZW5fbGluayIKLQloZWxwCi0JICBTZWxlY3RpbmcgTEVEX29uX3doZW5fbGluayB3aWxsIGxpZ2h0IHRoZSBMRUQgd2hlbiB0aGVyZSBpcyBhCi0JICBjb25uZWN0aW9uIGFuZCB3aWxsIGZsYXNoIG9mZiB3aGVuIHRoZXJlIGlzIGFjdGl2aXR5LgotCi0JICBTZWxlY3RpbmcgTEVEX29uX3doZW5fYWN0aXZpdHkgd2lsbCBsaWdodCB0aGUgTEVEIG9ubHkgd2hlbgotCSAgdGhlcmUgaXMgYWN0aXZpdHkuCi0KLQkgIFRoaXMgc2V0dGluZyB3aWxsIGFsc28gYWZmZWN0IHRoZSBiZWhhdmlvdXIgb2Ygb3RoZXIgYWN0aXZpdHkgTEVEcwotCSAgZS5nLiBCbHVldG9vdGguCi0KLWNvbmZpZyBFVFJBWF9ORVRXT1JLX0xFRF9PTl9XSEVOX0FDVElWSVRZCi0JYm9vbCAiTEVEX29uX3doZW5fYWN0aXZpdHkiCi0JaGVscAotCSAgU2VsZWN0aW5nIExFRF9vbl93aGVuX2xpbmsgd2lsbCBsaWdodCB0aGUgTEVEIHdoZW4gdGhlcmUgaXMgYQotCSAgY29ubmVjdGlvbiBhbmQgd2lsbCBmbGFzaCBvZmYgd2hlbiB0aGVyZSBpcyBhY3Rpdml0eS4KLQotCSAgU2VsZWN0aW5nIExFRF9vbl93aGVuX2FjdGl2aXR5IHdpbGwgbGlnaHQgdGhlIExFRCBvbmx5IHdoZW4KLQkgIHRoZXJlIGlzIGFjdGl2aXR5LgotCi0JICBUaGlzIHNldHRpbmcgd2lsbCBhbHNvIGFmZmVjdCB0aGUgYmVoYXZpb3VyIG9mIG90aGVyIGFjdGl2aXR5IExFRHMKLQkgIGUuZy4gQmx1ZXRvb3RoLgotCi1lbmRjaG9pY2UKLQogY29uZmlnIEVUUkFYX1NFUklBTAogCWJvb2wgIlNlcmlhbC1wb3J0IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBFVFJBWF9BUkNIX1YxMApAQCAtODQsMzIgKzUzLDYgQEAKIAkgIHRoZSBzYW1lIERNQSBjaGFubmVscy4KIAogY2hvaWNlCi0JcHJvbXB0ICJTZXIwIERNQSBvdXQgYXNzaWdubWVudCIKLQlkZXBlbmRzIG9uIEVUUkFYX1NFUklBTF9QT1JUMAotCWRlZmF1bHQgRVRSQVhfU0VSSUFMX1BPUlQwX0RNQTZfT1VUCi0KLWNvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDBfTk9fRE1BX09VVAotCWJvb2wgIk5vIERNQSBvdXQiCi0KLWNvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDBfRE1BNl9PVVQKLQlib29sICJETUEgNiIKLQotZW5kY2hvaWNlCi0KLWNob2ljZQotCXByb21wdCAiU2VyMCBETUEgaW4gYXNzaWdubWVudCIKLQlkZXBlbmRzIG9uIEVUUkFYX1NFUklBTF9QT1JUMAotCWRlZmF1bHQgRVRSQVhfU0VSSUFMX1BPUlQwX0RNQTdfSU4KLQotY29uZmlnIEVUUkFYX1NFUklBTF9QT1JUMF9OT19ETUFfSU4KLQlib29sICJObyBETUEgaW4iCi0KLWNvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDBfRE1BN19JTgotCWJvb2wgIkRNQSA3IgotCi1lbmRjaG9pY2UKLQotY2hvaWNlCiAJcHJvbXB0ICJTZXIwIERUUiwgUkksIERTUiBhbmQgQ0QgYXNzaWdubWVudCIKIAlkZXBlbmRzIG9uIEVUUkFYX1NFUklBTF9QT1JUMAogCWRlZmF1bHQgRVRSQVhfU0VSMF9EVFJfUklfRFNSX0NEX09OX05PTkUKQEAgLTE5OCwzMiArMTQxLDYgQEAKIAkgIEVuYWJsZXMgdGhlIEVUUkFYIDEwMCBzZXJpYWwgZHJpdmVyIGZvciBzZXIxICh0dHlTMSkuCiAKIGNob2ljZQotCXByb21wdCAiU2VyMSBETUEgb3V0IGFzc2lnbm1lbnQiCi0JZGVwZW5kcyBvbiBFVFJBWF9TRVJJQUxfUE9SVDEKLQlkZWZhdWx0IEVUUkFYX1NFUklBTF9QT1JUMV9ETUE4X09VVAotCi1jb25maWcgRVRSQVhfU0VSSUFMX1BPUlQxX05PX0RNQV9PVVQKLQlib29sICJObyBETUEgb3V0IgotCi1jb25maWcgRVRSQVhfU0VSSUFMX1BPUlQxX0RNQThfT1VUCi0JYm9vbCAiRE1BIDgiCi0KLWVuZGNob2ljZQotCi1jaG9pY2UKLQlwcm9tcHQgIlNlcjEgRE1BIGluIGFzc2lnbm1lbnQiCi0JZGVwZW5kcyBvbiBFVFJBWF9TRVJJQUxfUE9SVDEKLQlkZWZhdWx0IEVUUkFYX1NFUklBTF9QT1JUMV9ETUE5X0lOCi0KLWNvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDFfTk9fRE1BX0lOCi0JYm9vbCAiTm8gRE1BIGluIgotCi1jb25maWcgRVRSQVhfU0VSSUFMX1BPUlQxX0RNQTlfSU4KLQlib29sICJETUEgOSIKLQotZW5kY2hvaWNlCi0KLWNob2ljZQogCXByb21wdCAiU2VyMSBEVFIsIFJJLCBEU1IgYW5kIENEIGFzc2lnbm1lbnQiCiAJZGVwZW5kcyBvbiBFVFJBWF9TRVJJQUxfUE9SVDEKIAlkZWZhdWx0IEVUUkFYX1NFUjFfRFRSX1JJX0RTUl9DRF9PTl9OT05FCkBAIC0zMTUsMzIgKzIzMiw2IEBACiAJICBFbmFibGVzIHRoZSBFVFJBWCAxMDAgc2VyaWFsIGRyaXZlciBmb3Igc2VyMiAodHR5UzIpLgogCiBjaG9pY2UKLQlwcm9tcHQgIlNlcjIgRE1BIG91dCBhc3NpZ25tZW50IgotCWRlcGVuZHMgb24gRVRSQVhfU0VSSUFMX1BPUlQyCi0JZGVmYXVsdCBFVFJBWF9TRVJJQUxfUE9SVDJfRE1BMl9PVVQKLQotY29uZmlnIEVUUkFYX1NFUklBTF9QT1JUMl9OT19ETUFfT1VUCi0JYm9vbCAiTm8gRE1BIG91dCIKLQotY29uZmlnIEVUUkFYX1NFUklBTF9QT1JUMl9ETUEyX09VVAotCWJvb2wgIkRNQSAyIgotCi1lbmRjaG9pY2UKLQotY2hvaWNlCi0JcHJvbXB0ICJTZXIyIERNQSBpbiBhc3NpZ25tZW50IgotCWRlcGVuZHMgb24gRVRSQVhfU0VSSUFMX1BPUlQyCi0JZGVmYXVsdCBFVFJBWF9TRVJJQUxfUE9SVDJfRE1BM19JTgotCi1jb25maWcgRVRSQVhfU0VSSUFMX1BPUlQyX05PX0RNQV9JTgotCWJvb2wgIk5vIERNQSBpbiIKLQotY29uZmlnIEVUUkFYX1NFUklBTF9QT1JUMl9ETUEzX0lOCi0JYm9vbCAiRE1BIDMiCi0KLWVuZGNob2ljZQotCi1jaG9pY2UKIAlwcm9tcHQgIlNlcjIgRFRSLCBSSSwgRFNSIGFuZCBDRCBhc3NpZ25tZW50IgogCWRlcGVuZHMgb24gRVRSQVhfU0VSSUFMX1BPUlQyCiAJZGVmYXVsdCBFVFJBWF9TRVIyX0RUUl9SSV9EU1JfQ0RfT05fTk9ORQpAQCAtNDI5LDMyICszMjAsNiBAQAogCSAgRW5hYmxlcyB0aGUgRVRSQVggMTAwIHNlcmlhbCBkcml2ZXIgZm9yIHNlcjMgKHR0eVMzKS4KIAogY2hvaWNlCi0JcHJvbXB0ICJTZXIzIERNQSBvdXQgYXNzaWdubWVudCIKLQlkZXBlbmRzIG9uIEVUUkFYX1NFUklBTF9QT1JUMwotCWRlZmF1bHQgRVRSQVhfU0VSSUFMX1BPUlQzX0RNQTRfT1VUCi0KLWNvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDNfTk9fRE1BX09VVAotCWJvb2wgIk5vIERNQSBvdXQiCi0KLWNvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDNfRE1BNF9PVVQKLQlib29sICJETUEgNCIKLQotZW5kY2hvaWNlCi0KLWNob2ljZQotCXByb21wdCAiU2VyMyBETUEgaW4gYXNzaWdubWVudCIKLQlkZXBlbmRzIG9uIEVUUkFYX1NFUklBTF9QT1JUMwotCWRlZmF1bHQgRVRSQVhfU0VSSUFMX1BPUlQzX0RNQTVfSU4KLQotY29uZmlnIEVUUkFYX1NFUklBTF9QT1JUM19OT19ETUFfSU4KLQlib29sICJObyBETUEgaW4iCi0KLWNvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDNfRE1BNV9JTgotCWJvb2wgIkRNQSA1IgotCi1lbmRjaG9pY2UKLQotY2hvaWNlCiAJcHJvbXB0ICJTZXIzIERUUiwgUkksIERTUiBhbmQgQ0QgYXNzaWdubWVudCIKIAlkZXBlbmRzIG9uIEVUUkFYX1NFUklBTF9QT1JUMwogCWRlZmF1bHQgRVRSQVhfU0VSM19EVFJfUklfRFNSX0NEX09OX05PTkUKQEAgLTU2MywyMSArNDI4LDYgQEAKIAlkZXBlbmRzIG9uIEVUUkFYX1VTQl9IT1NUCiAJZGVmYXVsdCBuCiAKLWNvbmZpZyBFVFJBWF9BWElTRkxBU0hNQVAKLQlib29sICJBeGlzIGZsYXNoLW1hcCBzdXBwb3J0IgotCWRlcGVuZHMgb24gRVRSQVhfQVJDSF9WMTAKLQlzZWxlY3QgTVRECi0Jc2VsZWN0IE1URF9DRkkKLQlzZWxlY3QgTVREX0NGSV9BTURTVEQKLQlzZWxlY3QgTVREX0NIQVIKLQlzZWxlY3QgTVREX0JMT0NLCi0Jc2VsZWN0IE1URF9QQVJUSVRJT05TCi0Jc2VsZWN0IE1URF9DT05DQVQKLQlzZWxlY3QgTVREX0NPTVBMRVhfTUFQUElOR1MKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIE1URCBtYXBwaW5nIG9mIGZsYXNoIGRldmljZXMuICBOZWVkZWQgdG8gdXNlCi0JICBmbGFzaCBtZW1vcmllcy4gIElmIHVuc3VyZSwgc2F5IFkuCi0KIGNvbmZpZyBFVFJBWF9QVEFCTEVfU0VDVE9SCiAJaW50ICJCeXRlLW9mZnNldCBvZiBwYXJ0aXRpb24gdGFibGUgc2VjdG9yIgogCWRlcGVuZHMgb24gRVRSQVhfQVhJU0ZMQVNITUFQCkBAIC03MzEsMzcgKzU4MSw2IEBACiAJICBCaXQgc2V0ID0gY2hhbmdlYWJsZS4KIAkgIFlvdSBwcm9iYWJseSB3YW50IDAwIGhlcmUuCiAKLWNvbmZpZyBFVFJBWF9SVEMKLQlib29sICJSZWFsIFRpbWUgQ2xvY2sgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEVUUkFYX0FSQ0hfVjEwCi0JaGVscAotCSAgRW5hYmxlcyBkcml2ZXJzIGZvciB0aGUgUmVhbC1UaW1lIENsb2NrIGJhdHRlcnktYmFja2VkIGNoaXBzIG9uCi0JICBzb21lIHByb2R1Y3RzLiBUaGUga2VybmVsIHJlYWRzIHRoZSB0aW1lIHdoZW4gYm9vdGluZywgYW5kCi0JICB0aGUgZGF0ZSBjYW4gYmUgc2V0IHVzaW5nIGlvY3RsKGZkLCBSVENfU0VUX1RJTUUsICZydCkgd2l0aCBydCBhCi0JICBydGNfdGltZSBzdHJ1Y3QgKHNlZSA8ZmlsZTppbmNsdWRlL2FzbS1jcmlzL3J0Yy5oPikgb24gdGhlIC9kZXYvcnRjCi0JICBkZXZpY2UsIG1ham9yIDEyMS4gIFlvdSBjYW4gY2hlY2sgdGhlIHRpbWUgd2l0aCBjYXQgL3Byb2MvcnRjLCBidXQKLQkgIG5vcm1hbCB0aW1lIHJlYWRpbmcgc2hvdWxkIGJlIGRvbmUgdXNpbmcgbGliYyBmdW5jdGlvbiB0aW1lIGFuZAotCSAgZnJpZW5kcy4KLQotY2hvaWNlCi0JcHJvbXB0ICJSVEMgY2hpcCIKLQlkZXBlbmRzIG9uIEVUUkFYX1JUQwotCWRlZmF1bHQgRVRSQVhfRFMxMzAyCi0KLWNvbmZpZyBFVFJBWF9EUzEzMDIKLQlib29sICJEUzEzMDIiCi0JaGVscAotCSAgRW5hYmxlcyB0aGUgZHJpdmVyIGZvciB0aGUgRFMxMzAyIFJlYWwtVGltZSBDbG9jayBiYXR0ZXJ5LWJhY2tlZAotCSAgY2hpcCBvbiBzb21lIHByb2R1Y3RzLgotCi1jb25maWcgRVRSQVhfUENGODU2MwotCWJvb2wgIlBDRjg1NjMiCi0JaGVscAotCSAgRW5hYmxlcyB0aGUgZHJpdmVyIGZvciB0aGUgUENGODU2MyBSZWFsLVRpbWUgQ2xvY2sgYmF0dGVyeS1iYWNrZWQKLQkgIGNoaXAgb24gc29tZSBwcm9kdWN0cy4KLQotZW5kY2hvaWNlCi0KIGNvbmZpZyBFVFJBWF9EUzEzMDJfUlNUX09OX0dFTkVSSUNfUE9SVAogCWJvb2wgIkRTMTMwMiBSU1Qgb24gR2VuZXJpYyBQb3J0IgogCWRlcGVuZHMgb24gRVRSQVhfRFMxMzAyCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9NYWtlZmlsZSBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL01ha2VmaWxlCmluZGV4IDIwMjU4ZTMuLjQ0YmYyZTggMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL01ha2VmaWxlCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL01ha2VmaWxlCkBAIC0yLDExICsyLDExIEBACiAjIE1ha2VmaWxlIGZvciBFdHJheC1zcGVjaWZpYyBkcml2ZXJzCiAjCiAKLW9iai0kKENPTkZJR19FVFJBWF9BWElTRkxBU0hNQVApICAgICAgICArPSBheGlzZmxhc2htYXAubwotb2JqLSQoQ09ORklHX0VUUkFYX0kyQykgCSAgICAgICAgKz0gaTJjLm8KLW9iai0kKENPTkZJR19FVFJBWF9JMkNfRUVQUk9NKSAgICAgICAgICArPSBlZXByb20ubwotb2JqLSQoQ09ORklHX0VUUkFYX0dQSU8pIAkgICAgICAgICs9IGdwaW8ubwotb2JqLSQoQ09ORklHX0VUUkFYX0RTMTMwMikgICAgICAgICAgICAgICs9IGRzMTMwMi5vCitvYmotJChDT05GSUdfRVRSQVhfQVhJU0ZMQVNITUFQKQkrPSBheGlzZmxhc2htYXAubworb2JqLSQoQ09ORklHX0VUUkFYX0kyQykJCQkrPSBpMmMubworb2JqLSQoQ09ORklHX0VUUkFYX0kyQ19FRVBST00pCQkrPSBlZXByb20ubworb2JqLSQoQ09ORklHX0VUUkFYX0dQSU8pCQkrPSBncGlvLm8KK29iai0kKENPTkZJR19FVFJBWF9EUzEzMDIpCQkrPSBkczEzMDIubwogb2JqLSQoQ09ORklHX0VUUkFYX1BDRjg1NjMpCQkrPSBwY2Y4NTYzLm8KLQorb2JqLSQoQ09ORklHX0VUUkFYX1NZTkNIUk9OT1VTX1NFUklBTCkJKz0gc3luY19zZXJpYWwubwogCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9heGlzZmxhc2htYXAuYyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL2F4aXNmbGFzaG1hcC5jCmluZGV4IGVhM2NmMmUuLmIzYmRkYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL2F4aXNmbGFzaG1hcC5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL2F4aXNmbGFzaG1hcC5jCkBAIC0xMCwxMjkgKzEwLDYgQEAKICAqIHRlbGxzIHVzIHdoYXQgb3RoZXIgcGFydGl0aW9ucyB0byBkZWZpbmUuIElmIHRoZXJlIGlzbid0LCB3ZSB1c2UgYSBkZWZhdWx0CiAgKiBwYXJ0aXRpb24gc3BsaXQgZGVmaW5lZCBiZWxvdy4KICAqCi0gKiAkTG9nOiBheGlzZmxhc2htYXAuYyx2ICQKLSAqIFJldmlzaW9uIDEuMTEgIDIwMDQvMTEvMTUgMTA6Mjc6MTQgIHN0YXJ2aWsKLSAqIENvcnJlY3RlZCB0eXBvIChUaGFua3MgdG8gTWlsdG9uIE1pbGxlciA8bWlsdG9ubUBiZ2EuY29tPikuCi0gKgotICogUmV2aXNpb24gMS4xMCAgMjAwNC8wOC8xNiAxMjozNzoyMiAgc3RhcnZpawotICogTWVyZ2Ugb2YgTGludXggMi42LjgKLSAqCi0gKiBSZXZpc2lvbiAxLjggIDIwMDQvMDUvMTQgMDc6NTg6MDMgIHN0YXJ2aWsKLSAqIE1lcmdlIG9mIGNoYW5nZXMgZnJvbSAyLjQKLSAqCi0gKiBSZXZpc2lvbiAxLjYgIDIwMDMvMDcvMDQgMDg6Mjc6MzcgIHN0YXJ2aWsKLSAqIE1lcmdlIG9mIExpbnV4IDIuNS43NAotICoKLSAqIFJldmlzaW9uIDEuNSAgMjAwMi8xMi8xMSAxMzoxMzo1NyAgc3RhcnZpawotICogQWRkZWQgYXJjaC8gdG8gdjEwIHNwZWNpZmljIGluY2x1ZGVzCi0gKiBBZGRlZCBmaXggZnJvbSBMaW51eCAyLjQgaW4gc2VyaWFsLmMgKGZsdXNoX3RvX2ZsaXBfYnVmZmVyKQotICoKLSAqIFJldmlzaW9uIDEuNCAgMjAwMi8xMS8yMCAxMTo1NjoxMCAgc3RhcnZpawotICogTWVyZ2Ugb2YgTGludXggMi41LjQ4Ci0gKgotICogUmV2aXNpb24gMS4zICAyMDAyLzExLzEzIDE0OjU0OjEzICBzdGFydmlrCi0gKiBDb3BpZWQgZnJvbSBsaW51eCAyLjQKLSAqCi0gKiBSZXZpc2lvbiAxLjI4ICAyMDAyLzEwLzAxIDA4OjA4OjQzICBqb25hc2hnCi0gKiBUaGUgZmlyc3QgcGFydGl0aW9uIGVuZHMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwYXJ0aXRpb24gdGFibGUuCi0gKgotICogUmV2aXNpb24gMS4yNyAgMjAwMi8wOC8yMSAwOToyMzoxMyAgam9uYXNoZwotICogU3BlbGluZy4KLSAqCi0gKiBSZXZpc2lvbiAxLjI2ICAyMDAyLzA4LzIxIDA4OjM1OjIwICBqb25hc2hnCi0gKiBDb3NtZXRpYyBjaGFuZ2UgdG8gcHJpbnRvdXRzLgotICoKLSAqIFJldmlzaW9uIDEuMjUgIDIwMDIvMDgvMjEgMDg6MTU6NDIgIGpvbmFzaGcKLSAqIE1hZGUgaXQgY29tcGlsZSBldmVuIHdpdGhvdXQgQ09ORklHX01URF9DT05DQVQgZGVmaW5lZC4KLSAqCi0gKiBSZXZpc2lvbiAxLjI0ICAyMDAyLzA4LzIwIDEzOjEyOjM1ICBqb25hc2hnCi0gKiAqIE5ldyBhcHByb2FjaCB0byBwcm9iaW5nLiBQcm9iZSBjc2UwIGFuZCBjc2UxIHNlcGFyYXRlbHkgYW5kIChtdGQpY29uY2F0Ci0gKiAgIHRoZSByZXN1bHRzLgotICogKiBSZW1vdmVkIGNvbXBpbGUgdGltZSB0ZXN0cyBjb25jZXJuaW5nIGhvdyB0aGUgbXRkcmFtIGRyaXZlciBoYXMgYmVlbgotICogICBjb25maWd1cmVkLiBUaGUgdXNlciB3aWxsIGtub3cgYWJvdXQgdGhlIG1pc2NvbmZpZ3VyYXRpb24gYXQgcnVudGltZQotICogICBpbnN0ZWFkLiAoVGhlIG9sZCBhcHByb2FjaCBtYWRlIGl0IGltcG9zc2libGUgdG8gdXNlIG10ZHJhbSBmb3IgYW55dGhpbmcKLSAqICAgZWxzZSB0aGFuIFJBTSBib290KS4KLSAqCi0gKiBSZXZpc2lvbiAxLjIzICAyMDAyLzA1LzEzIDEyOjEyOjI4ICBqb2hhbmEKLSAqIEFsbG93IGNvbXBpbGUgd2l0aG91dCBDT05GSUdfTVREX01URFJBTSBidXQgd2FybiBhdCBjb21waWxldGltZSBhbmQKLSAqIGJlIGluZm9ybWF0aXZlIGF0IHJ1bnRpbWUuCi0gKgotICogUmV2aXNpb24gMS4yMiAgMjAwMi8wNS8xMyAxMDoyNDo0NCAgam9oYW5hCi0gKiBBZGRlZCAjaWYgY2hlY2tzIG9uIE1URFJBTSBDT05GSUcKLSAqCi0gKiBSZXZpc2lvbiAxLjIxICAyMDAyLzA1LzA2IDE2OjA1OjIwICBqb2hhbmEKLSAqIFJlbW92ZWQgZGVidWcgcHJpbnRvdXQuCi0gKgotICogUmV2aXNpb24gMS4yMCAgMjAwMi8wNS8wNiAxNjowMzowMCAgam9oYW5hCi0gKiBObyBtb3JlIGNyYW1mcyBhcyByb290IGhhY2sgaW4gZ2VuZXJpYyBjb2RlLgotICogSXQncyBoYW5kbGVkIGJ5IGF4aXNmbGFzaG1hcCB1c2luZyBtdGRyYW0uCi0gKgotICogUmV2aXNpb24gMS4xOSAgMjAwMi8wMy8xNSAxNzoxMDoyOCAgYmpvcm53Ci0gKiBDaGFuZ2VkIGNvbW1lbnQgYWJvdXQgY2FjaGVkIGFjY2VzcyBzaW5jZSB3ZSBjaGFuZ2VkIHRoaXMgYmVmb3JlCi0gKgotICogUmV2aXNpb24gMS4xOCAgMjAwMi8wMy8wNSAxNzowNjoxNSAgam9uYXNoZwotICogVHJ5IGFtZF9mbGFzaCBwcm9iZSBiZWZvcmUgY2ZpX3Byb2JlIHNpbmNlIGFtZF9mbGFzaCBkcml2ZXIgY2FuIGhhbmRsZSB0d28KLSAqIChvciBtb3JlKSBmbGFzaCBjaGlwcyBvZiBkaWZmZXJlbnQgbW9kZWwgYW5kIHRoZSBjZmkgZHJpdmVyIGNhbm5vdC4KLSAqCi0gKiBSZXZpc2lvbiAxLjE3ICAyMDAxLzExLzEyIDE5OjQyOjM4ICBwa2oKLSAqIEZpeGVkIGNvbXBpbGVyIHdhcm5pbmdzLgotICoKLSAqIFJldmlzaW9uIDEuMTYgIDIwMDEvMTEvMDggMTE6MTg6NTggIGpvbmFzaGcKLSAqIEFsd2F5cyByZWFkIGZyb20gdW5jYWNoZWQgYWRkcmVzcyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIGZsdXNoaW5nCi0gKiBjYWNoZWxpbmVzIGFmdGVyIHdyaXRlIGFuZCBNVEQtZXJhc2UuIE5vIHBlcmZvcm1hbmNlIGxvc3MgaGF2ZSBiZWVuCi0gKiBzZWVuIHlldC4KLSAqCi0gKiBSZXZpc2lvbiAxLjE1ICAyMDAxLzEwLzE5IDEyOjQxOjA0ICBqb25hc2hnCi0gKiBOYW1lIG9mIHByb2JlIGhhcyBjaGFuZ2VkIGluIE1URC4KLSAqCi0gKiBSZXZpc2lvbiAxLjE0ICAyMDAxLzA5LzIxIDA3OjE0OjEwICBqb25hc2hnCi0gKiBNYWRlIHJvb3QgZmlsZXN5c3RlbSAoY3JhbWZzKSB1c2UgbXRkYmxvY2sgZHJpdmVyIHdoZW4gYm9vdGluZyBmcm9tIGZsYXNoLgotICoKLSAqIFJldmlzaW9uIDEuMTMgIDIwMDEvMDgvMTUgMTM6NTc6MzUgIGpvbmFzaGcKLSAqIEVudGlyZSBNVEQgdXBkYXRlZCB0byB0aGUgbGludXggMi40LjcgdmVyc2lvbi4KLSAqCi0gKiBSZXZpc2lvbiAxLjEyICAyMDAxLzA2LzExIDA5OjUwOjMwICBqb25hc2hnCi0gKiBPb3BzLCAyTUIgaXMgMHgyMDAwMDAgYnl0ZXMuCi0gKgotICogUmV2aXNpb24gMS4xMSAgMjAwMS8wNi8wOCAxMTozOTo0NCAgam9uYXNoZwotICogQ2hhbmdlZCBzaXplcyBhbmQgb2Zmc2V0cyBpbiBheGlzX2RlZmF1bHRfcGFydGl0aW9ucyB0byB1c2UKLSAqIENPTkZJR19FVFJBWF9QVEFCTEVfU0VDVE9SLgotICoKLSAqIFJldmlzaW9uIDEuMTAgIDIwMDEvMDUvMjkgMDk6NDI6MDMgIGpvbmFzaGcKLSAqIFVzZSBtYWNybyBmb3IgZW5kIG1hcmtlciBsZW5ndGggaW5zdGVhZCBvZiBzaXplb2YuCi0gKgotICogUmV2aXNpb24gMS45ICAyMDAxLzA1LzI5IDA4OjUyOjUyICBqb25hc2hnCi0gKiBHYXZlIG5hbWVzIHRvIHRoZSBtYWdpYyBmb3VycyAoc2l6ZSBvZiB0aGUgcHRhYmxlIGVuZCBtYXJrZXIpLgotICoKLSAqIFJldmlzaW9uIDEuOCAgMjAwMS8wNS8yOCAxNTozNjoyMCAgam9uYXNoZwotICogKiBSZW1vdmVkIG9sZCBjb21tZW50IGFib3V0IHB0YWJsZSBsb2NhdGlvbiBpbiBmbGFzaCAoaXQncyBhIENPTkZJR18gb3B0aW9uKS4KLSAqICogVmFyaWFibGUgcHRhYmxlIHdhcyBpbml0aWFsaXplZCB0d2ljZSB0byB0aGUgc2FtZSB2YWx1ZS4KLSAqCi0gKiBSZXZpc2lvbiAxLjcgIDIwMDEvMDQvMDUgMTM6NDE6NDYgIG1hcmt1c2wKLSAqIFVwZGF0ZWQgYWNjb3JkaW5nIHRvIHJldmlldyByZW1hcmtzCi0gKgotICogUmV2aXNpb24gMS42ICAyMDAxLzAzLzA3IDA5OjIxOjIxICBiam9ybncKLSAqIE5vIG5lZWQgdG8gd2FzdGUgLmRhdGEKLSAqCi0gKiBSZXZpc2lvbiAxLjUgIDIwMDEvMDMvMDYgMTY6Mjc6MDEgIGpvbmFzaGcKLSAqIFByb2JlIHRoZSBlbnRpcmUgZmxhc2ggYXJlYSBmb3IgZmxhc2ggZGV2aWNlcy4KLSAqCi0gKiBSZXZpc2lvbiAxLjQgIDIwMDEvMDIvMjMgMTI6NDc6MTUgIGJqb3JudwotICogVW5jYWNoZWQgZmxhc2ggaW4gTE9XX01BUCBtb3ZlZCBmcm9tIDB4ZSB0byAweDgKLSAqCi0gKiBSZXZpc2lvbiAxLjMgIDIwMDEvMDIvMTYgMTI6MTE6NDUgIGpvbmFzaGcKLSAqIE1URCBkcml2ZXIgYW1kX2ZsYXNoIGlzIG5vdyBpbmNsdWRlZCBpbiBNVEQgQ1ZTIHJlcG9zaXRvcnkuCi0gKiAoSXQncyBub3cgaW4gZHJpdmVycy9tdGQpLgotICoKLSAqIFJldmlzaW9uIDEuMiAgMjAwMS8wMi8wOSAxMToxMjoyMiAgam9uYXNoZwotICogU3VwcG9ydCBmb3IgQU1EIGNvbXBhdGlibGUgbm9uLUNGSSBmbGFzaCBjaGlwcy4KLSAqIE9ubHkgdGVzdGVkIHdpdGggVG9zaGliYSBUQzU4RlZUMTYwIHNvIGZhci4KLSAqCi0gKiBSZXZpc2lvbiAxLjEgIDIwMDEvMDEvMTIgMTc6MDE6MTggIGJqb3JudwotICogKiBBZGRlZCBheGlzZmxhc2htYXAuYywgYSBwaHlzaWNhbCBtYXBwaW5nIGZvciBNVEQgdGhhdCByZWFkcyBhbmQgdW5kZXJzdGFuZHMKLSAqICAgQXhpcyBwYXJ0aXRpb24tdGFibGUgZm9ybWF0LgotICoKLSAqCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMjM1LDcgKzExMiw3IEBACiB9OwogCiAvKiBJZiBubyBwYXJ0aXRpb24tdGFibGUgd2FzIGZvdW5kLCB3ZSB1c2UgdGhpcyBkZWZhdWx0LXNldC4gKi8KLSNkZWZpbmUgTUFYX1BBUlRJVElPTlMgICAgICAgICA3ICAKKyNkZWZpbmUgTUFYX1BBUlRJVElPTlMgICAgICAgICA3CiAjZGVmaW5lIE5VTV9ERUZBVUxUX1BBUlRJVElPTlMgMwogCiAvKgpAQCAtMzAwLDYgKzE3NywxNSBAQAogCX0sCiB9OwogCisjaWZkZWYgQ09ORklHX0VUUkFYX0FYSVNGTEFTSE1BUF9NVEQwV0hPTEUKKy8qIE1haW4gZmxhc2ggZGV2aWNlICovCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gbWFpbl9wYXJ0aXRpb24gPSB7CisJLm5hbWUgPSAibWFpbiIsCisJLnNpemUgPSAwLAorCS5vZmZzZXQgPSAwCit9OworI2VuZGlmCisKIC8qCiAgKiBQcm9iZSBhIGNoaXAgc2VsZWN0IGZvciBBTUQtY29tcGF0aWJsZSAoSkVERUMpIG9yIENGSS1jb21wYXRpYmxlIGZsYXNoCiAgKiBjaGlwcyBpbiB0aGF0IG9yZGVyIChiZWNhdXNlIHRoZSBhbWRfZmxhc2gtZHJpdmVyIGlzIGZhc3RlcikuCkBAIC0zMTYsMTUgKzIwMiwxNCBAQAogCW10ZF9jcyA9IGRvX21hcF9wcm9iZSgiY2ZpX3Byb2JlIiwgbWFwX2NzKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19NVERfSkVERUNQUk9CRQotCWlmICghbXRkX2NzKSB7CisJaWYgKCFtdGRfY3MpCiAJCW10ZF9jcyA9IGRvX21hcF9wcm9iZSgiamVkZWNfcHJvYmUiLCBtYXBfY3MpOwotCX0KICNlbmRpZgogCiAJcmV0dXJuIG10ZF9jczsKIH0KIAotLyogCisvKgogICogUHJvYmUgZWFjaCBjaGlwIHNlbGVjdCBpbmRpdmlkdWFsbHkgZm9yIGZsYXNoIGNoaXBzLiBJZiB0aGVyZSBhcmUgY2hpcHMgb24KICAqIGJvdGggY3NlMCBhbmQgY3NlMSwgdGhlIG10ZF9pbmZvIHN0cnVjdHMgd2lsbCBiZSBjb25jYXRlbmF0ZWQgdG8gb25lIHN0cnVjdAogICogc28gdGhhdCBNVEQgcGFydGl0aW9ucyBjYW4gY3Jvc3MgY2hpcCBib3VuZHJpZXMuCkBAIC0zNTEsNyArMjM2LDcgQEAKIAlpZiAobXRkX2NzZTAgJiYgbXRkX2NzZTEpIHsKICNpZmRlZiBDT05GSUdfTVREX0NPTkNBVAogCQlzdHJ1Y3QgbXRkX2luZm8gKm10ZHNbXSA9IHsgbXRkX2NzZTAsIG10ZF9jc2UxIH07Ci0JCQorCiAJCS8qIFNpbmNlIHRoZSBjb25jYXRlbmF0aW9uIGxheWVyIGFkZHMgYSBzbWFsbCBvdmVyaGVhZCB3ZQogCQkgKiBjb3VsZCB0cnkgdG8gZmlndXJlIG91dCBpZiB0aGUgY2hpcHMgaW4gY3NlMCBhbmQgY3NlMSBhcmUKIAkJICogaWRlbnRpY2FsIGFuZCByZXByb2JlIHRoZSB3aG9sZSBjc2UwK2NzZTEgd2luZG93LiBCdXQgc2luY2UKQEAgLTM3Miw3ICsyNTcsNyBAQAogCiAJCQkvKiBUaGUgYmVzdCB3ZSBjYW4gZG8gbm93IGlzIHRvIG9ubHkgdXNlIHdoYXQgd2UgZm91bmQKIAkJCSAqIGF0IGNzZTAuCi0JCQkgKi8gCisJCQkgKi8KIAkJCW10ZF9jc2UgPSBtdGRfY3NlMDsKIAkJCW1hcF9kZXN0cm95KG10ZF9jc2UxKTsKIAkJfQpAQCAtMzk1LDcgKzI4MCw3IEBACiAJc3RydWN0IHBhcnRpdGlvbnRhYmxlX2hlYWQgKnB0YWJsZV9oZWFkID0gTlVMTDsKIAlzdHJ1Y3QgcGFydGl0aW9udGFibGVfZW50cnkgKnB0YWJsZTsKIAlpbnQgdXNlX2RlZmF1bHRfcHRhYmxlID0gMTsgLyogVW50aWwgcHJvdmVuIG90aGVyd2lzZS4gKi8KLQljb25zdCBjaGFyICpwbXNnID0gIiAgL2Rldi9mbGFzaCVkIGF0IDB4JTA4eCwgc2l6ZSAweCUwOHhcbiI7CisJY29uc3QgY2hhciBwbXNnW10gPSAiICAvZGV2L2ZsYXNoJWQgYXQgMHglMDh4LCBzaXplIDB4JTA4eFxuIjsKIAogCWlmICghKG15bXRkID0gZmxhc2hfcHJvYmUoKSkpIHsKIAkJLyogVGhlcmUncyBubyByZWFzb24gdG8gdXNlIHRoaXMgbW9kdWxlIGlmIG5vIGZsYXNoIGNoaXAgY2FuCkBAIC00MzUsNyArMzIwLDcgQEAKIAkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSBDT05GSUdfRVRSQVhfUFRBQkxFX1NFQ1RPUjsKIAkJdW5zaWduZWQgY2hhciAqcDsKIAkJdW5zaWduZWQgbG9uZyBjc3VtID0gMDsKLQkJCisKIAkJcHRhYmxlID0gKHN0cnVjdCBwYXJ0aXRpb250YWJsZV9lbnRyeSAqKQogCQkJKCh1bnNpZ25lZCBsb25nKXB0YWJsZV9oZWFkICsgc2l6ZW9mKCpwdGFibGVfaGVhZCkpOwogCkBAIC00OTAsNiArMzc1LDE2IEBACiAJCXBpZHgrKzsKIAl9CiAKKyNpZmRlZiBDT05GSUdfRVRSQVhfQVhJU0ZMQVNITUFQX01URDBXSE9MRQorCWlmIChteW10ZCkgeworCQltYWluX3BhcnRpdGlvbi5zaXplID0gbXltdGQtPnNpemU7CisJCWVyciA9IGFkZF9tdGRfcGFydGl0aW9ucyhteW10ZCwgJm1haW5fcGFydGl0aW9uLCAxKTsKKwkJaWYgKGVycikKKwkJCXBhbmljKCJheGlzZmxhc2htYXA6IENvdWxkIG5vdCBpbml0aWFsaXplICIKKwkJCSAgICAgICJwYXJ0aXRpb24gZm9yIHdob2xlIG1haW4gbXRkIGRldmljZSFcbiIpOworCX0KKyNlbmRpZgorCiAgICAgICAgIGlmIChteW10ZCkgewogCQlpZiAodXNlX2RlZmF1bHRfcHRhYmxlKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPICIgVXNpbmcgZGVmYXVsdCBwYXJ0aXRpb24gdGFibGUuXG4iKTsKQEAgLTQ5OSw5ICszOTQsOCBAQAogCQkJZXJyID0gYWRkX210ZF9wYXJ0aXRpb25zKG15bXRkLCBheGlzX3BhcnRpdGlvbnMsIHBpZHgpOwogCQl9CiAKLQkJaWYgKGVycikgeworCQlpZiAoZXJyKQogCQkJcGFuaWMoImF4aXNmbGFzaG1hcCBjb3VsZCBub3QgYWRkIE1URCBwYXJ0aXRpb25zIVxuIik7Ci0JCX0KIAl9CiAKIAlpZiAoIXJvbWZzX2luX2ZsYXNoKSB7CkBAIC01MTUsMjUgKzQwOSwyNCBAQAogI2Vsc2UKIAkJc3RydWN0IG10ZF9pbmZvICptdGRfcmFtOwogCi0JCW10ZF9yYW0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXRkX2luZm8pLAotCQkJCQkJICAgICBHRlBfS0VSTkVMKTsKLQkJaWYgKCFtdGRfcmFtKSB7CisJCW10ZF9yYW0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXRkX2luZm8pLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFtdGRfcmFtKQogCQkJcGFuaWMoImF4aXNmbGFzaG1hcCBjb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKIAkJCSAgICAgICJtdGRfaW5mbyFcbiIpOwotCQl9CiAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiIEFkZGluZyBSQU0gcGFydGl0aW9uIGZvciByb21mcyBpbWFnZTpcbiIpOwotCQlwcmludGsocG1zZywgcGlkeCwgcm9tZnNfc3RhcnQsIHJvbWZzX2xlbmd0aCk7CisJCXByaW50ayhwbXNnLCBwaWR4LCAodW5zaWduZWQpcm9tZnNfc3RhcnQsCisJCQkodW5zaWduZWQpcm9tZnNfbGVuZ3RoKTsKIAotCQllcnIgPSBtdGRyYW1faW5pdF9kZXZpY2UobXRkX3JhbSwgKHZvaWQqKXJvbWZzX3N0YXJ0LCAKLQkJICAgICAgICAgICAgICAgICAgICAgICAgIHJvbWZzX2xlbmd0aCwgInJvbWZzIik7Ci0JCWlmIChlcnIpIHsKKwkJZXJyID0gbXRkcmFtX2luaXRfZGV2aWNlKG10ZF9yYW0sCisJCQkodm9pZCAqKXJvbWZzX3N0YXJ0LAorCQkJcm9tZnNfbGVuZ3RoLAorCQkJInJvbWZzIik7CisJCWlmIChlcnIpCiAJCQlwYW5pYygiYXhpc2ZsYXNobWFwIGNvdWxkIG5vdCBpbml0aWFsaXplIE1URCBSQU0gIgogCQkJICAgICAgImRldmljZSFcbiIpOwotCQl9CiAjZW5kaWYKIAl9Ci0KIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9kczEzMDIuYyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL2RzMTMwMi5jCmluZGV4IDFkMTkzNmEuLmM5YWEzOTAgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL2RzMTMwMi5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL2RzMTMwMi5jCkBAIC0zMzMsNyArMzMzLDcgQEAKIAkJCWRzMTMwMl93cml0ZXJlZyhSVENfVFJJQ0tMRUNIQVJHRVIsIHRjc192YWwpOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJY2FzZSBSVENfVkxPV19SRDoKKwkJY2FzZSBSVENfVkxfUkVBRDoKIAkJewogCQkJLyogVE9ETzoKIAkJCSAqIEltcGxlbWVudCB2b2x0YWdlIGxvdyBkZXRlY3Rpb24gc3VwcG9ydApAQCAtMzQyLDcgKzM0Miw3IEBACiAJCQkgICAgICAgIiBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJCXJldHVybiAwOwogCQl9Ci0JCWNhc2UgUlRDX1ZMT1dfU0VUOgorCQljYXNlIFJUQ19WTF9DTFI6CiAJCXsKIAkJCS8qIFRPRE86CiAJCQkgKiBOb3RoaW5nIHRvIGRvIHNpbmNlIFZvbHRhZ2UgTG93IGRldGVjdGlvbiBpcyBub3Qgc3VwcG9ydGVkCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9lZXByb20uYyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL2VlcHJvbS5jCmluZGV4IGJlMzVhNzA3Li5mMWNhYzlkIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9lZXByb20uYworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9lZXByb20uYwpAQCAtMTksNzcgKzE5LDYgQEAKICohICBTZXAgIDAzIDE5OTkgIEVkZ2FyIElnbGVzaWFzICAgIEFkZGVkIGJhaWwtb3V0IHN0dWZmIGlmIHdlIGdldCBpbnRlcnJ1cHRlZAogKiEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHNwaW4tbG9jay4KICohCi0qISAgJExvZzogZWVwcm9tLmMsdiAkCi0qISAgUmV2aXNpb24gMS4xMiAgMjAwNS8wNi8xOSAxNzowNjo0NiAgc3RhcnZpawotKiEgIE1lcmdlIG9mIExpbnV4IDIuNi4xMi4KLSohCi0qISAgUmV2aXNpb24gMS4xMSAgMjAwNS8wMS8yNiAwNzoxNDo0NiAgc3RhcnZpawotKiEgIEFwcGxpZWQgZGlmZiBmcm9tIGtlcm5lbCBqYW5pdG9ycyAoTmlzaCBBcmF2YW11ZGFuKS4KLSohCi0qISAgUmV2aXNpb24gMS4xMCAgMjAwMy8wOS8xMSAwNzoyOTo0OCAgc3RhcnZpawotKiEgIE1lcmdlIG9mIExpbnV4IDIuNi4wLXRlc3Q1Ci0qIQotKiEgIFJldmlzaW9uIDEuOSAgMjAwMy8wNy8wNCAwODoyNzozNyAgc3RhcnZpawotKiEgIE1lcmdlIG9mIExpbnV4IDIuNS43NAotKiEKLSohICBSZXZpc2lvbiAxLjggIDIwMDMvMDQvMDkgMDU6MjA6NDcgIHN0YXJ2aWsKLSohICBNZXJnZSBvZiBMaW51eCAyLjUuNjcKLSohCi0qISAgUmV2aXNpb24gMS42ICAyMDAzLzAyLzEwIDA3OjE5OjI4ICBzdGFydmlrCi0qISAgUmVtb3ZlZCBtaXNwbGFjZWQgOwotKiEKLSohICBSZXZpc2lvbiAxLjUgIDIwMDIvMTIvMTEgMTM6MTM6NTcgIHN0YXJ2aWsKLSohICBBZGRlZCBhcmNoLyB0byB2MTAgc3BlY2lmaWMgaW5jbHVkZXMKLSohICBBZGRlZCBmaXggZnJvbSBMaW51eCAyLjQgaW4gc2VyaWFsLmMgKGZsdXNoX3RvX2ZsaXBfYnVmZmVyKQotKiEKLSohICBSZXZpc2lvbiAxLjQgIDIwMDIvMTEvMjAgMTE6NTY6MTAgIHN0YXJ2aWsKLSohICBNZXJnZSBvZiBMaW51eCAyLjUuNDgKLSohCi0qISAgUmV2aXNpb24gMS4zICAyMDAyLzExLzE4IDEzOjE2OjA2ICBzdGFydmlrCi0qISAgTGludXggMi41IHBvcnQgb2YgbGF0ZXN0IDIuNCBkcml2ZXJzCi0qIQotKiEgIFJldmlzaW9uIDEuOCAgMjAwMS8wNi8xNSAxMzoyNDoyOSAgam9uYXNoZwotKiEgICogQWRkZWQgdmVyaWZpY2F0aW9uIG9mIHBvaW50ZXJzIGZyb20gdXNlcnNwYWNlIGluIHJlYWQgYW5kIHdyaXRlLgotKiEgICogTWFkZSBidXN5IGNvdW50ZXIgdm9sYXRpbGUuCi0qISAgKiBBZGRlZCBkZWZpbmUgZm9yIGluaXRpYWwgd3JpdGUgZGVsYXkuCi0qISAgKiBSZW1vdmVkIHdhcm5pbmdzIGJ5IHVzaW5nIGxvZmZfdCBpbnN0ZWFkIG9mIHVuc2lnbmVkIGxvbmcuCi0qIQotKiEgIFJldmlzaW9uIDEuNyAgMjAwMS8wNi8xNCAxNToyNjo1NCAgam9uYXNoZwotKiEgIFJlbW92ZWQgdGVzdCBiZWNhdXNlIGNvbmRpdGlvbiBpcyBhbHdheXMgdHJ1ZS4KLSohCi0qISAgUmV2aXNpb24gMS42ICAyMDAxLzA2LzE0IDE1OjE4OjIwICBqb25hc2hnCi0qISAgS2IgLT4ga0IgKG1ha2VzIHF1aXRlIGEgZGlmZmVyZW5jZSBpZiB5b3UgZG9uJ3Qga25vdyBpZiB5b3UgaGF2ZSAyayBvciAxNmspLgotKiEKLSohICBSZXZpc2lvbiAxLjUgIDIwMDEvMDYvMTQgMTQ6Mzk6NTEgIGpvbmFzaGcKLSohICBGb3Jnb3QgdG8gdXNlIG5hbWUgd2hlbiByZWdpc3RlcmluZyB0aGUgZHJpdmVyLgotKiEKLSohICBSZXZpc2lvbiAxLjQgIDIwMDEvMDYvMTQgMTQ6MzU6NDcgIGpvbmFzaGcKLSohICAqIEdhdmUgZHJpdmVyIGEgbmFtZSBhbmQgdXNlZCBpdCBpbiBwcmludGsncy4KLSohICAqIENsZWFudXAuCi0qIQotKiEgIFJldmlzaW9uIDEuMyAgMjAwMS8wMy8xOSAxNjowNDo0NiAgbWFya3VzbAotKiEgIEZpeGVkIGluaXQgb2YgZm9wcyBzdHJ1Y3QKLSohCi0qISAgUmV2aXNpb24gMS4yICAyMDAxLzAzLzE5IDEwOjM1OjA3ICBtYXJrdXNsCi0qISAgMi40IHBvcnQgb2YgZWVwcm9tIGRyaXZlcgotKiEKLSohICBSZXZpc2lvbiAxLjggIDIwMDAvMDUvMTggMTA6NDI6MjUgIGVkZ2FyCi0qISAgTWFrZSBzdXJlIHRvIGVuZCB3cml0ZSBjeWNsZSBvbiBfZXZlcnlfIHdyaXRlCi0qIQotKiEgIFJldmlzaW9uIDEuNyAgMjAwMC8wMS8xNyAxNzo0MTowMSAgam9oYW5hCi0qISAgQWRqdXN0ZWQgcHJvYmluZyBhbmQgcmV0dXJuIC1FTk9TUEMgd2hlbiB3cml0aW5nIG91dHNpZGUgRUVQUk9NCi0qIQotKiEgIFJldmlzaW9uIDEuNiAgMjAwMC8wMS8xNyAxNTo1MDozNiAgam9oYW5hCi0qISAgQWRkZWQgYWRhcHRpdmUgdGltaW5nIGFkanVzdG1lbnRzIGFuZCBmaXhlZCBhdXRvcHJvYmluZyBmb3IgMmsgYW5kIDE2ayg/KQotKiEgIEVFUFJPTXMKLSohCi0qISAgUmV2aXNpb24gMS41ICAxOTk5LzA5LzAzIDE1OjA3OjM3ICBlZGdhcgotKiEgIEFkZGVkIGJhaWwtb3V0IGNoZWNrIHRvIHRoZSBzcGlubG9jawotKiEKLSohICBSZXZpc2lvbiAxLjQgIDE5OTkvMDkvMDMgMTI6MTE6MTcgIGJqb3JudwotKiEgIFByb3BlciBhdG9taWNpdHkgKG5lZWQgdG8gdXNlIHNwaW5sb2Nrcywgbm90IGlmJ3MpLiB1c2VycyAtPiBidXN5LgotKiEKLSohCiAqISAgICAgICAgKGMpIDE5OTkgQXhpcyBDb21tdW5pY2F0aW9ucyBBQiwgTHVuZCwgU3dlZGVuCiAqISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0xMDMsMTAgKzMyLDEwIEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlICJpMmMuaCIKIAotI2RlZmluZSBEKHgpIAorI2RlZmluZSBEKHgpCiAKIC8qIElmIHdlIHNob3VsZCB1c2UgYWRhcHRpdmUgdGltaW5nIG9yIG5vdDogKi8KLS8vI2RlZmluZSBFRVBST01fQURBUFRJVkVfVElNSU5HICAgICAgCisvKiAjZGVmaW5lIEVFUFJPTV9BREFQVElWRV9USU1JTkcgKi8KIAogI2RlZmluZSBFRVBST01fTUFKT1JfTlIgMTIyICAvKiB1c2UgYSBMT0NBTC9FWFBFUklNRU5UQUwgbWFqb3IgZm9yIG5vdyAqLwogI2RlZmluZSBFRVBST01fTUlOT1JfTlIgMApkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvZ3Bpby5jIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvZ3Bpby5jCmluZGV4IDBkMzQ3YTcuLjY4YTk5OGIgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL2dwaW8uYworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9ncGlvLmMKQEAgLTEsMTM4ICsxLDExIEBACi0vKiAkSWQ6IGdwaW8uYyx2IDEuMTcgMjAwNS8wNi8xOSAxNzowNjo0NiBzdGFydmlrIEV4cCAkCi0gKgorLyoKICAqIEV0cmF4IGdlbmVyYWwgcG9ydCBJL08gZGV2aWNlCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIKKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA3IEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIKICAqCiAgKiBBdXRob3JzOiAgICBCam9ybiBXZXNlbiAgICAgIChpbml0aWFsIHZlcnNpb24pCiAgKiAgICAgICAgICAgICBPbGEgS251dHNzb24gICAgIChMRUQgaGFuZGxpbmcpCiAgKiAgICAgICAgICAgICBKb2hhbiBBZG9sZnNzb24gIChyZWFkL3NldCBkaXJlY3Rpb25zLCB3cml0ZSwgcG9ydCBHKQotICoKLSAqICRMb2c6IGdwaW8uYyx2ICQKLSAqIFJldmlzaW9uIDEuMTcgIDIwMDUvMDYvMTkgMTc6MDY6NDYgIHN0YXJ2aWsKLSAqIE1lcmdlIG9mIExpbnV4IDIuNi4xMi4KLSAqCi0gKiBSZXZpc2lvbiAxLjE2ICAyMDA1LzAzLzA3IDEzOjAyOjI5ICBzdGFydmlrCi0gKiBQcm90ZWN0IGRyaXZlciBnbG9iYWwgc3RhdGVzIHdpdGggc3BpbmxvY2sKLSAqCi0gKiBSZXZpc2lvbiAxLjE1ICAyMDA1LzAxLzA1IDA2OjA4OjU1ICBzdGFydmlrCi0gKiBObyBuZWVkIHRvIGRvIGxvY2FsX2lycV9kaXNhYmxlIGFmdGVyIGxvY2FsX2lycV9zYXZlLgotICoKLSAqIFJldmlzaW9uIDEuMTQgIDIwMDQvMTIvMTMgMTI6MjE6NTIgIHN0YXJ2aWsKLSAqIEFkZGVkIEkvTyBhbmQgRE1BIGFsbG9jYXRvcnMgZnJvbSBMaW51eCAyLjQKLSAqCi0gKiBSZXZpc2lvbiAxLjEyICAyMDA0LzA4LzI0IDA3OjE5OjU5ICBzdGFydmlrCi0gKiBXaGl0ZXNwYWNlIGNsZWFudXAKLSAqCi0gKiBSZXZpc2lvbiAxLjExICAyMDA0LzA1LzE0IDA3OjU4OjAzICBzdGFydmlrCi0gKiBNZXJnZSBvZiBjaGFuZ2VzIGZyb20gMi40Ci0gKgotICogUmV2aXNpb24gMS45ICAyMDAzLzA5LzExIDA3OjI5OjQ4ICBzdGFydmlrCi0gKiBNZXJnZSBvZiBMaW51eCAyLjYuMC10ZXN0NQotICoKLSAqIFJldmlzaW9uIDEuOCAgMjAwMy8wNy8wNCAwODoyNzozNyAgc3RhcnZpawotICogTWVyZ2Ugb2YgTGludXggMi41Ljc0Ci0gKgotICogUmV2aXNpb24gMS43ICAyMDAzLzAxLzEwIDA3OjQ0OjA3ICBzdGFydmlrCi0gKiBpbml0X2lvcmVtYXAgaXMgbm93IGNhbGxlZCBieSBrZXJuZWwgYmVmb3JlIGRyaXZlcnMgYXJlIGluaXRpYWxpemVkCi0gKgotICogUmV2aXNpb24gMS42ICAyMDAyLzEyLzExIDEzOjEzOjU3ICBzdGFydmlrCi0gKiBBZGRlZCBhcmNoLyB0byB2MTAgc3BlY2lmaWMgaW5jbHVkZXMKLSAqIEFkZGVkIGZpeCBmcm9tIExpbnV4IDIuNCBpbiBzZXJpYWwuYyAoZmx1c2hfdG9fZmxpcF9idWZmZXIpCi0gKgotICogUmV2aXNpb24gMS41ICAyMDAyLzExLzIwIDExOjU2OjExICBzdGFydmlrCi0gKiBNZXJnZSBvZiBMaW51eCAyLjUuNDgKLSAqCi0gKiBSZXZpc2lvbiAxLjQgIDIwMDIvMTEvMTggMTA6MTA6MDUgIHN0YXJ2aWsKLSAqIExpbnV4IDIuNSBwb3J0IG9mIGxhdGVzdCBncGlvLmMgZnJvbSBMaW51eCAyLjQKLSAqCi0gKiBSZXZpc2lvbiAxLjIwICAyMDAyLzEwLzE2IDIxOjE2OjI0ICBqb2hhbmEKLSAqIEFkZGVkIHN1cHBvcnQgZm9yIFBBIGhpZ2ggbGV2ZWwgaW50ZXJydXB0LgotICogVGhhdCBnaXZlcyAybXMgcmVzcG9uc2UgdGltZSB3aXRoIGlvZHRlc3QgZm9yIGhpZ2ggbGV2ZWxzIGFuZCAyLTEyIG1zCi0gKiByZXNwb25zZSB0aW1lIG9uIGxvdyBsZXZlbHMgaWYgdGhlIGNoZWNrIGlzIG5vdCBtYWRlIGluCi0gKiBwcm9jZXNzLmM6Y3B1X2lkbGUoKSBhcyB3ZWxsLgotICoKLSAqIFJldmlzaW9uIDEuMTkgIDIwMDIvMTAvMTQgMTg6Mjc6MzMgIGpvaGFuYQotICogSW1wbGVtZW50ZWQgYWxhcm0gaGFuZGxpbmcgc28gc2VsZWN0KCkgbm93IHdvcmtzLgotICogTGF0ZW5jeSBpcyBhcm91bmQgNi05IG1zIHdpdGggYSBldHJheF9ncGlvX3dha2VfdXBfY2hlY2soKSBpbgotICogY3B1X2lkbGUoKS4KLSAqIE90aGVyd2lzZSBJIGdldCAxNS0xOCBtcyAoc2FtZSBhcyBkb2luZyB0aGUgcG9sbCBpbiB1c2Vyc3BhY2UgLQotICogYnV0IGxlc3Mgb3ZlcmhlYWQpLgotICogVE9ETz8gUGVyaGFwcyB3ZSBzaG91bGQgYWRkIHRoZSBjaGVjayBpbiBJTU1FRElBVEVfQkggKG9yIHdoYXRldmVyIGl0Ci0gKiBpcyBpbiAyLjQpIGFzIHdlbGw/Ci0gKiBUT0RPPyBQZXJoYXBzIGNhbGwgcmVxdWVzdF9pcnEoKS9mcmVlX2lycSgpIG9ubHkgd2hlbiBuZWVkZWQ/Ci0gKiBJbmNyZWFzZWQgdmVyc2lvbiB0byAyLjUKLSAqCi0gKiBSZXZpc2lvbiAxLjE4ICAyMDAyLzEwLzExIDE1OjAyOjAwICBqb2hhbmEKLSAqIE1hc2sgaW52ZXJ0ZWQgOCBiaXQgdmFsdWUgaW4gc2V0Z2V0X2lucHV0KCkuCi0gKgotICogUmV2aXNpb24gMS4xNyAgMjAwMi8wNi8xNyAxNTo1MzowMSAgam9oYW5hCi0gKiBBZGRlZCBJT19SRUFEX0lOQklUUywgSU9fUkVBRF9PVVRCSVRTLCBJT19TRVRHRVRfSU5QVVQgYW5kIElPX1NFVEdFVF9PVVRQVVQKLSAqIHRoYXQgdGFrZSBhIHBvaW50ZXIgYXMgYXJndW1lbnQgYW5kIHRodXMgY2FuIGhhbmRsZSAzMiBiaXQgcG9ydHMgKEcpCi0gKiBjb3JyZWN0bHkuCi0gKiBUaGVzZSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIElPX1JFQURCSVRTLCBJT19TRVRJTlBVVCBhbmQgSU9fU0VUT1VUUFVULgotICogKGVzcGVjaWFsbHkgaWYgUG9ydCBHIGJpdCAzMSBpcyB1c2VkKQotICoKLSAqIFJldmlzaW9uIDEuMTYgIDIwMDIvMDYvMTcgMDk6NTk6NTEgIGpvaGFuYQotICogUmV0dXJuaW5nIDMyIGJpdCB2YWx1ZXMgaW4gdGhlIGlvY3RsIHJldHVybiB2YWx1ZSBkb2Vzbid0IHdvcmsgaWYgYml0Ci0gKiAzMSBpcyBzZXQgKGNvdWxkIGhhcHBlbiBmb3IgcG9ydCBHKSwgc28gbWFzayBpdCBvZiB3aXRoIDB4N0ZGRkZGRkYuCi0gKiBBIG5ldyBzZXQgb2YgaW9jdGwncyB3aWxsIGJlIGFkZGVkLgotICoKLSAqIFJldmlzaW9uIDEuMTUgIDIwMDIvMDUvMDYgMTM6MTk6MTMgIGpvaGFuYQotICogSU9fU0VUSU5QVVQgcmV0dXJucyBtYXNrIHdpdGggYml0IHNldCA9IGlucHV0cyBmb3IgUEEgYW5kIFBCIGFzIHdlbGwuCi0gKgotICogUmV2aXNpb24gMS4xNCAgMjAwMi8wNC8xMiAxMjowMTo1MyAgam9oYW5hCi0gKiBVc2UgZ2xvYmFsIHJfcG9ydF9nX2RhdGFfc2hhZG93LgotICogTW92ZWQgZ3Bpb19pbml0X3BvcnRfZygpIGNsb3NlciB0byBncGlvX2luaXQoKSBhbmQgbWFya2VkIGl0IF9faW5pdC4KLSAqCi0gKiBSZXZpc2lvbiAxLjEzICAyMDAyLzA0LzEwIDEyOjAzOjU1ICBqb2hhbmEKLSAqIEFkZGVkIHN1cHBvcnQgZm9yIHBvcnQgRyAvZGV2L2dwaW9nIChtaW5vciAzKS4KLSAqIENoYW5nZWQgaW5kZW50YXRpb24gb24gc3dpdGNoIGNhc2VzLgotICogRml4ZWQgb3RoZXIgc3BhY2VzIHRvIHRhYnMuCi0gKgotICogUmV2aXNpb24gMS4xMiAgMjAwMS8xMS8xMiAxOTo0MjoxNSAgcGtqCi0gKiAqIENvcnJlY3RlZCByZXR1cm4gdmFsdWVzIGZyb20gZ3Bpb19sZWRzX2lvY3RsKCkuCi0gKiAqIEZpeGVkIGNvbXBpbGVyIHdhcm5pbmdzLgotICoKLSAqIFJldmlzaW9uIDEuMTEgIDIwMDEvMTAvMzAgMTQ6Mzk6MTIgIGpvaGFuYQotICogQWRkZWQgRCgpIGFyb3VuZCBncGlvX3dyaXRlIHByaW50ay4KLSAqCi0gKiBSZXZpc2lvbiAxLjEwICAyMDAxLzEwLzI1IDEwOjI0OjQyICBqb2hhbmEKLSAqIEFkZGVkIElPX0NGR19XUklURV9NT0RFIGlvY3RsIGFuZCB3cml0ZSBtZXRob2QgdGhhdCBjYW4gZG8gZmFzdAotICogYml0dG9nZ2xpbmcgaW4gdGhlIGtlcm5lbC4gKFRoaXMgc3BlZWRzIHVwIHByb2dyYW1taW5nIGFuIEZQR0Egd2l0aCA0NTBrQgotICogZnJvbSB+NjAgc2Vjb25kcyB0byA0IHNlY29uZHMpLgotICogQWRkZWQgc2F2ZV9mbGFncy9jbGkvcmVzdG9yZV9mbGFncyBpbiBpb2N0bC4KLSAqCi0gKiBSZXZpc2lvbiAxLjkgIDIwMDEvMDUvMDQgMTQ6MTY6MDcgIG1hdHNmZwotICogQ29ycmVjdGVkIHNwZWxsaW5nIGVycm9yCi0gKgotICogUmV2aXNpb24gMS44ICAyMDAxLzA0LzI3IDEzOjU1OjI2ICBtYXRzZmcKLSAqIE1vdmVkIGluaXRpb3JlbWFwLgotICogVHVybnMgb2ZmIGFsbCBMRURTIG9uIGluaXQuCi0gKiBBZGRlZCBzdXBwb3J0IGZvciBzaHV0ZG93biBhbmQgcG93ZXJidXR0b24uCi0gKgotICogUmV2aXNpb24gMS43ICAyMDAxLzA0LzA0IDEzOjMwOjA4ICBtYXRzZmcKLSAqIEFkZGVkIGJpdHNldCBhbmQgYml0Y2xlYXIgZm9yIGxlZHMuIENhbGxzIGluaXRfaW9yZW1hcCB0byBzZXQgdXAgbWVtbWFwcGluZwotICoKLSAqIFJldmlzaW9uIDEuNiAgMjAwMS8wMy8yNiAxNjowMzowNiAgYmpvcm53Ci0gKiBOZWVkcyBsaW51eC9jb25maWcuaAotICoKLSAqIFJldmlzaW9uIDEuNSAgMjAwMS8wMy8yNiAxNDoyMjowMyAgYmpvcm53Ci0gKiBOYW1lY2hhbmdlIG9mIHNvbWUgY29uZmlnIG9wdGlvbnMKLSAqCi0gKiBSZXZpc2lvbiAxLjQgIDIwMDEvMDIvMjcgMTM6NTI6NDggIGJqb3JudwotICogbWFsbG9jLmggLT4gc2xhYi5oCi0gKgotICogUmV2aXNpb24gMS4zICAyMDAxLzAxLzI0IDE1OjA2OjQ4ICBiam9ybncKLSAqIGdwaW9fd3EgY29ycmVjdCB0eXBlCi0gKgotICogUmV2aXNpb24gMS4yICAyMDAxLzAxLzE4IDE2OjA3OjMwICBiam9ybncKLSAqIDIuNCBwb3J0Ci0gKgotICogUmV2aXNpb24gMS4xICAyMDAxLzAxLzE4IDE1OjU1OjE2ICBiam9ybncKLSAqIFZlcmJhdGltIGNvcHkgb2YgZXRyYXhncGlvLmMgZnJvbSBlbGludXggMi4wIGFkZGVkCi0gKgotICoKICAqLwogCiAKQEAgLTE2NSw3ICszOCw3IEBACiAjZWxzZQogI2RlZmluZSBEUCh4KQogI2VuZGlmCi0JCisKIHN0YXRpYyBjaGFyIGdwaW9fbmFtZVtdID0gImV0cmF4IGdwaW8iOwogCiAjaWYgMApAQCAtMTczLDkgKzQ2LDkgQEAKICNlbmRpZgogCiBzdGF0aWMgaW50IGdwaW9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLXN0YXRpYyBzc2l6ZV90IGdwaW9fd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyICogYnVmLCBzaXplX3QgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxvZmZfdCAqb2ZmKTsKKwl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgc3NpemVfdCBncGlvX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCXNpemVfdCBjb3VudCwgbG9mZl90ICpvZmYpOwogc3RhdGljIGludCBncGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOwogc3RhdGljIGludCBncGlvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOwogc3RhdGljIHVuc2lnbmVkIGludCBncGlvX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCk7CkBAIC0yMDEsMjIgKzc0LDIyIEBACiAKIC8qIGxpbmtlZCBsaXN0IG9mIGFsYXJtcyB0byBjaGVjayBmb3IgKi8KIAotc3RhdGljIHN0cnVjdCBncGlvX3ByaXZhdGUgKmFsYXJtbGlzdCA9IDA7CitzdGF0aWMgc3RydWN0IGdwaW9fcHJpdmF0ZSAqYWxhcm1saXN0OwogCi1zdGF0aWMgaW50IGdwaW9fc29tZV9hbGFybXMgPSAwOyAvKiBTZXQgaWYgc29tZW9uZSB1c2VzIGFsYXJtICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBncGlvX3BhX2lycV9lbmFibGVkX21hc2sgPSAwOworc3RhdGljIGludCBncGlvX3NvbWVfYWxhcm1zOyAvKiBTZXQgaWYgc29tZW9uZSB1c2VzIGFsYXJtICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBncGlvX3BhX2lycV9lbmFibGVkX21hc2s7CiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZ3Bpb19sb2NrKTsgLyogUHJvdGVjdCBkaXJlY3Rpb25zIGV0YyAqLwogCiAvKiBQb3J0IEEgYW5kIEIgdXNlIDggYml0IGFjY2VzcywgYnV0IFBvcnQgRyBpcyAzMiBiaXQgKi8KICNkZWZpbmUgTlVNX1BPUlRTIChHUElPX01JTk9SX0IrMSkKIAotc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnBvcnRzW05VTV9QT1JUU10gPSB7IAotCVJfUE9SVF9QQV9EQVRBLCAKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpwb3J0c1tOVU1fUE9SVFNdID0geworCVJfUE9SVF9QQV9EQVRBLAogCVJfUE9SVF9QQl9EQVRBLAogfTsKIHN0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpzaGFkc1tOVU1fUE9SVFNdID0gewotCSZwb3J0X3BhX2RhdGFfc2hhZG93LCAKKwkmcG9ydF9wYV9kYXRhX3NoYWRvdywKIAkmcG9ydF9wYl9kYXRhX3NoYWRvdwogfTsKIApAQCAtMjM2LDI5ICsxMDksMjkgQEAKICNlbmRpZgogCiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYW5nZWFibGVfZGlyW05VTV9QT1JUU10gPSB7IAorc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhbmdlYWJsZV9kaXJbTlVNX1BPUlRTXSA9IHsKIAlDT05GSUdfRVRSQVhfUEFfQ0hBTkdFQUJMRV9ESVIsCi0JQ09ORklHX0VUUkFYX1BCX0NIQU5HRUFCTEVfRElSIAorCUNPTkZJR19FVFJBWF9QQl9DSEFOR0VBQkxFX0RJUgogfTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYW5nZWFibGVfYml0c1tOVU1fUE9SVFNdID0geyAKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYW5nZWFibGVfYml0c1tOVU1fUE9SVFNdID0gewogCUNPTkZJR19FVFJBWF9QQV9DSEFOR0VBQkxFX0JJVFMsCi0JQ09ORklHX0VUUkFYX1BCX0NIQU5HRUFCTEVfQklUUyAKKwlDT05GSUdfRVRSQVhfUEJfQ0hBTkdFQUJMRV9CSVRTCiB9OwogCi1zdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqZGlyW05VTV9QT1JUU10gPSB7IAotCVJfUE9SVF9QQV9ESVIsIAotCVJfUE9SVF9QQl9ESVIgCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqZGlyW05VTV9QT1JUU10gPSB7CisJUl9QT1JUX1BBX0RJUiwKKwlSX1BPUlRfUEJfRElSCiB9OwogCiBzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqZGlyX3NoYWRvd1tOVU1fUE9SVFNdID0gewotCSZwb3J0X3BhX2Rpcl9zaGFkb3csIAotCSZwb3J0X3BiX2Rpcl9zaGFkb3cgCisJJnBvcnRfcGFfZGlyX3NoYWRvdywKKwkmcG9ydF9wYl9kaXJfc2hhZG93CiB9OwogCiAvKiBBbGwgYml0cyBpbiBwb3J0IGcgdGhhdCBjYW4gY2hhbmdlIGRpci4gKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGludCBjaGFuZ2VhYmxlX2Rpcl9nX21hc2sgPSAweDAxRkZGRjAxOwogCi0vKiBQb3J0IEcgaXMgMzIgYml0LCBoYW5kbGUgaXQgc3BlY2lhbCwgc29tZSBiaXRzIGFyZSBib3RoIGlucHV0cyAKKy8qIFBvcnQgRyBpcyAzMiBiaXQsIGhhbmRsZSBpdCBzcGVjaWFsLCBzb21lIGJpdHMgYXJlIGJvdGggaW5wdXRzCiAgICBhbmQgb3V0cHV0cyBhdCB0aGUgc2FtZSB0aW1lLCBvbmx5IHNvbWUgb2YgdGhlIGJpdHMgY2FuIGNoYW5nZSBkaXJlY3Rpb24KICAgIGFuZCBzb21lIG9mIHRoZW0gaW4gZ3JvdXBzIG9mIDggYml0LiAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgY2hhbmdlYWJsZV9kaXJfZzsKQEAgLTI2OSwxOCArMTQyLDE3IEBACiAjZGVmaW5lIFVTRV9QT1JUUyhwcml2KSAoKHByaXYpLT5taW5vciA8PSBHUElPX01JTk9SX0IpCiAKIAotCi1zdGF0aWMgdW5zaWduZWQgaW50IAotZ3Bpb19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAotCSAgcG9sbF90YWJsZSAqd2FpdCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ3Bpb19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQogewogCXVuc2lnbmVkIGludCBtYXNrID0gMDsKLQlzdHJ1Y3QgZ3Bpb19wcml2YXRlICpwcml2ID0gKHN0cnVjdCBncGlvX3ByaXZhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGdwaW9fcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGRhdGE7Ci0Jc3Bpbl9sb2NrKCZncGlvX2xvY2spOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisKIAlwb2xsX3dhaXQoZmlsZSwgJnByaXYtPmFsYXJtX3dxLCB3YWl0KTsKIAlpZiAocHJpdi0+bWlub3IgPT0gR1BJT19NSU5PUl9BKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCXVuc2lnbmVkIGxvbmcgdG1wOwogCQlkYXRhID0gKlJfUE9SVF9QQV9EQVRBOwogCQkvKiBQQSBoYXMgc3VwcG9ydCBmb3IgaGlnaCBsZXZlbCBpbnRlcnJ1cHQgLQpAQCAtMjg4LDI3ICsxNjAsMjUgQEAKIAkJICovCiAJCXRtcCA9IH5kYXRhICYgcHJpdi0+aGlnaGFsYXJtICYgMHhGRjsKIAkJdG1wID0gKHRtcCA8PCBSX0lSUV9NQVNLMV9TRVRfX3BhMF9fQklUTlIpOwotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKIAkJZ3Bpb19wYV9pcnFfZW5hYmxlZF9tYXNrIHw9IHRtcDsKIAkJKlJfSVJRX01BU0sxX1NFVCA9IHRtcDsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCiAJfSBlbHNlIGlmIChwcml2LT5taW5vciA9PSBHUElPX01JTk9SX0IpCiAJCWRhdGEgPSAqUl9QT1JUX1BCX0RBVEE7CiAJZWxzZSBpZiAocHJpdi0+bWlub3IgPT0gR1BJT19NSU5PUl9HKQogCQlkYXRhID0gKlJfUE9SVF9HX0RBVEE7CiAJZWxzZSB7Ci0JCXNwaW5fdW5sb2NrKCZncGlvX2xvY2spOwotCQlyZXR1cm4gMDsKKwkJbWFzayA9IDA7CisJCWdvdG8gb3V0OwogCX0KLQkKKwogCWlmICgoZGF0YSAmIHByaXYtPmhpZ2hhbGFybSkgfHwKIAkgICAgKH5kYXRhICYgcHJpdi0+bG93YWxhcm0pKSB7CiAJCW1hc2sgPSBQT0xMSU58UE9MTFJETk9STTsKIAl9CiAKLQlzcGluX3VubG9jaygmZ3Bpb19sb2NrKTsKLQkKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2xvY2ssIGZsYWdzKTsKIAlEUChwcmludGsoImdwaW9fcG9sbCByZWFkeTogbWFzayAweCUwOFhcbiIsIG1hc2spKTsKIAogCXJldHVybiBtYXNrOwpAQCAtMzE2LDE2ICsxODYsMTkgQEAKIAogaW50IGV0cmF4X2dwaW9fd2FrZV91cF9jaGVjayh2b2lkKQogewotCXN0cnVjdCBncGlvX3ByaXZhdGUgKnByaXYgPSBhbGFybWxpc3Q7CisJc3RydWN0IGdwaW9fcHJpdmF0ZSAqcHJpdjsKIAl1bnNpZ25lZCBsb25nIGRhdGEgPSAwOwogICAgICAgICBpbnQgcmV0ID0gMDsKLQlzcGluX2xvY2soJmdwaW9fbG9jayk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssIGZsYWdzKTsKKwlwcml2ID0gYWxhcm1saXN0OwogCXdoaWxlIChwcml2KSB7Ci0JCWlmIChVU0VfUE9SVFMocHJpdikpIHsKKwkJaWYgKFVTRV9QT1JUUyhwcml2KSkKIAkJCWRhdGEgPSAqcHJpdi0+cG9ydDsKLQkJfSBlbHNlIGlmIChwcml2LT5taW5vciA9PSBHUElPX01JTk9SX0cpIHsKKwkJZWxzZSBpZiAocHJpdi0+bWlub3IgPT0gR1BJT19NSU5PUl9HKQogCQkJZGF0YSA9ICpSX1BPUlRfR19EQVRBOwotCQl9CisKIAkJaWYgKChkYXRhICYgcHJpdi0+aGlnaGFsYXJtKSB8fAogCQkgICAgKH5kYXRhICYgcHJpdi0+bG93YWxhcm0pKSB7CiAJCQlEUChwcmludGsoImV0cmF4X2dwaW9fd2FrZV91cF9jaGVjayAlaVxuIixwcml2LT5taW5vcikpOwpAQCAtMzM0LDEyICsyMDcsMTIgQEAKIAkJfQogCQlwcml2ID0gcHJpdi0+bmV4dDsKIAl9Ci0Jc3Bpbl91bmxvY2soJmdwaW9fbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCBmbGFncyk7CiAgICAgICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdAotZ3Bpb19wb2xsX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorZ3Bpb19wb2xsX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJaWYgKGdwaW9fc29tZV9hbGFybXMpIHsKIAkJZXRyYXhfZ3Bpb193YWtlX3VwX2NoZWNrKCk7CkBAIC0zNDksMTAgKzIyMiwxMyBAQAogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QKLWdwaW9fcGFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitncGlvX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJdW5zaWduZWQgbG9uZyB0bXA7Ci0Jc3Bpbl9sb2NrKCZncGlvX2xvY2spOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisKIAkvKiBGaW5kIHdoYXQgUEEgaW50ZXJydXB0cyBhcmUgYWN0aXZlICovCiAJdG1wID0gKCpSX0lSUV9SRUFEMSk7CiAKQEAgLTM2Myw3NSArMjM5LDcwIEBACiAJKlJfSVJRX01BU0sxX0NMUiA9IHRtcDsKIAlncGlvX3BhX2lycV9lbmFibGVkX21hc2sgJj0gfnRtcDsKIAotCXNwaW5fdW5sb2NrKCZncGlvX2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOwogCi0JaWYgKGdwaW9fc29tZV9hbGFybXMpIHsKKwlpZiAoZ3Bpb19zb21lX2FsYXJtcykKIAkJcmV0dXJuIElSUV9SRVRWQUwoZXRyYXhfZ3Bpb193YWtlX3VwX2NoZWNrKCkpOwotCX0KKwogICAgICAgICByZXR1cm4gSVJRX05PTkU7CiB9CiAKLQotc3RhdGljIHNzaXplX3QgZ3Bpb193cml0ZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgKiBidWYsIHNpemVfdCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbG9mZl90ICpvZmYpCitzdGF0aWMgdm9pZCBncGlvX3dyaXRlX2JpdChzdHJ1Y3QgZ3Bpb19wcml2YXRlICpwcml2LAorCXVuc2lnbmVkIGNoYXIgZGF0YSwgaW50IGJpdCkKIHsKLQlzdHJ1Y3QgZ3Bpb19wcml2YXRlICpwcml2ID0gKHN0cnVjdCBncGlvX3ByaXZhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7Ci0JdW5zaWduZWQgY2hhciBkYXRhLCBjbGtfbWFzaywgZGF0YV9tYXNrLCB3cml0ZV9tc2I7CisJKnByaXYtPnBvcnQgPSAqcHJpdi0+c2hhZG93ICY9IH4ocHJpdi0+Y2xrX21hc2spOworCWlmIChkYXRhICYgMSA8PCBiaXQpCisJCSpwcml2LT5wb3J0ID0gKnByaXYtPnNoYWRvdyB8PSBwcml2LT5kYXRhX21hc2s7CisJZWxzZQorCQkqcHJpdi0+cG9ydCA9ICpwcml2LT5zaGFkb3cgJj0gfihwcml2LT5kYXRhX21hc2spOworCisJLyogRm9yIEZQR0E6IG1pbiA1LjBucyAoRENDKSBiZWZvcmUgQ0NMSyBoaWdoICovCisJKnByaXYtPnBvcnQgPSAqcHJpdi0+c2hhZG93IHw9IHByaXYtPmNsa19tYXNrOworfQorCitzdGF0aWMgdm9pZCBncGlvX3dyaXRlX2J5dGUoc3RydWN0IGdwaW9fcHJpdmF0ZSAqcHJpdiwgdW5zaWduZWQgY2hhciBkYXRhKQoreworCWludCBpOworCisJaWYgKHByaXYtPndyaXRlX21zYikKKwkJZm9yIChpID0gNzsgaSA+PSAwOyBpLS0pCisJCQlncGlvX3dyaXRlX2JpdChwcml2LCBkYXRhLCBpKTsKKwllbHNlCisJCWZvciAoaSA9IDA7IGkgPD0gNzsgaSsrKQorCQkJZ3Bpb193cml0ZV9iaXQocHJpdiwgZGF0YSwgaSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdwaW9fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZikKK3sKKwlzdHJ1Y3QgZ3Bpb19wcml2YXRlICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2soJmdwaW9fbG9jayk7Ci0KIAlzc2l6ZV90IHJldHZhbCA9IGNvdW50OwotCWlmIChwcml2LT5taW5vciAhPUdQSU9fTUlOT1JfQSAmJiBwcml2LT5taW5vciAhPSBHUElPX01JTk9SX0IpIHsKLQkJcmV0dmFsID0gLUVGQVVMVDsKLQkJZ290byBvdXQ7Ci0JfQotICAgIAotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWYsIGNvdW50KSkgewotCQlyZXR2YWwgPSAtRUZBVUxUOwotCQlnb3RvIG91dDsKLQl9Ci0JY2xrX21hc2sgPSBwcml2LT5jbGtfbWFzazsKLQlkYXRhX21hc2sgPSBwcml2LT5kYXRhX21hc2s7CisKKwlpZiAocHJpdi0+bWlub3IgIT0gR1BJT19NSU5PUl9BICYmIHByaXYtPm1pbm9yICE9IEdQSU9fTUlOT1JfQikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCiAJLyogSXQgbXVzdCBoYXZlIGJlZW4gY29uZmlndXJlZCB1c2luZyB0aGUgSU9fQ0ZHX1dSSVRFX01PREUgKi8KIAkvKiBQZXJoYXBzIGEgYmV0dGVyIGVycm9yIGNvZGU/ICovCi0JaWYgKGNsa19tYXNrID09IDAgfHwgZGF0YV9tYXNrID09IDApIHsKKwlpZiAocHJpdi0+Y2xrX21hc2sgPT0gMCB8fCBwcml2LT5kYXRhX21hc2sgPT0gMCkgewogCQlyZXR2YWwgPSAtRVBFUk07CiAJCWdvdG8gb3V0OwogCX0KLQl3cml0ZV9tc2IgPSBwcml2LT53cml0ZV9tc2I7Ci0JRChwcmludGsoImdwaW9fd3JpdGU6ICVsdSB0byBkYXRhIDB4JTAyWCBjbGsgMHglMDJYIG1zYjogJWlcbiIsY291bnQsIGRhdGFfbWFzaywgY2xrX21hc2ssIHdyaXRlX21zYikpOwotCXdoaWxlIChjb3VudC0tKSB7Ci0JCWludCBpOwotCQlkYXRhID0gKmJ1ZisrOwotCQlpZiAocHJpdi0+d3JpdGVfbXNiKSB7Ci0JCQlmb3IgKGkgPSA3OyBpID49IDA7aS0tKSB7Ci0JCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQkJCSpwcml2LT5wb3J0ID0gKnByaXYtPnNoYWRvdyAmPSB+Y2xrX21hc2s7Ci0JCQkJaWYgKGRhdGEgJiAxPDxpKQotCQkJCQkqcHJpdi0+cG9ydCA9ICpwcml2LT5zaGFkb3cgfD0gZGF0YV9tYXNrOwotCQkJCWVsc2UKLQkJCQkJKnByaXYtPnBvcnQgPSAqcHJpdi0+c2hhZG93ICY9IH5kYXRhX21hc2s7Ci0JCQkvKiBGb3IgRlBHQTogbWluIDUuMG5zIChEQ0MpIGJlZm9yZSBDQ0xLIGhpZ2ggKi8KLQkJCQkqcHJpdi0+cG9ydCA9ICpwcml2LT5zaGFkb3cgfD0gY2xrX21hc2s7Ci0JCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChpID0gMDsgaSA8PSA3O2krKykgewotCQkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJCQkqcHJpdi0+cG9ydCA9ICpwcml2LT5zaGFkb3cgJj0gfmNsa19tYXNrOwotCQkJCWlmIChkYXRhICYgMTw8aSkKLQkJCQkJKnByaXYtPnBvcnQgPSAqcHJpdi0+c2hhZG93IHw9IGRhdGFfbWFzazsKLQkJCQllbHNlCi0JCQkJCSpwcml2LT5wb3J0ID0gKnByaXYtPnNoYWRvdyAmPSB+ZGF0YV9tYXNrOwotCQkJLyogRm9yIEZQR0E6IG1pbiA1LjBucyAoRENDKSBiZWZvcmUgQ0NMSyBoaWdoICovCi0JCQkJKnByaXYtPnBvcnQgPSAqcHJpdi0+c2hhZG93IHw9IGNsa19tYXNrOwotCQkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJCX0KLQkJfQotCX0KKworCUQocHJpbnRrKEtFUk5fREVCVUcgImdwaW9fd3JpdGU6ICUwMlggdG8gZGF0YSAweCUwMlggIgorCQkiY2xrIDB4JTAyWCBtc2I6ICVpXG4iLAorCQljb3VudCwgcHJpdi0+ZGF0YV9tYXNrLCBwcml2LT5jbGtfbWFzaywgcHJpdi0+d3JpdGVfbXNiKSk7CisKKwl3aGlsZSAoY291bnQtLSkKKwkJZ3Bpb193cml0ZV9ieXRlKHByaXYsICpidWYrKyk7CisKIG91dDoKLQlzcGluX3VubG9jaygmZ3Bpb19sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC00NDIsMjIgKzMxMywyMCBAQAogewogCXN0cnVjdCBncGlvX3ByaXZhdGUgKnByaXY7CiAJaW50IHAgPSBpbWlub3IoaW5vZGUpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAocCA+IEdQSU9fTUlOT1JfTEFTVCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwcml2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGdwaW9fcHJpdmF0ZSksCi0JCQkJCSAgICAgIEdGUF9LRVJORUwpOworCXByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZ3Bpb19wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIXByaXYpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJcHJpdi0+bWlub3IgPSBwOwogCi0JLyogaW5pdGlhbGl6ZSB0aGUgaW8vYWxhcm0gc3RydWN0IGFuZCBsaW5rIGl0IGludG8gb3VyIGFsYXJtbGlzdCAqLworCS8qIGluaXRpYWxpemUgdGhlIGlvL2FsYXJtIHN0cnVjdCAqLwogCi0JcHJpdi0+bmV4dCA9IGFsYXJtbGlzdDsKLQlhbGFybWxpc3QgPSBwcml2OwogCWlmIChVU0VfUE9SVFMocHJpdikpIHsgLyogQSBhbmQgQiAqLwogCQlwcml2LT5wb3J0ID0gcG9ydHNbcF07CiAJCXByaXYtPnNoYWRvdyA9IHNoYWRzW3BdOwpAQCAtNDgwLDcgKzM0OSwxMyBAQAogCXByaXYtPmRhdGFfbWFzayA9IDA7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmcHJpdi0+YWxhcm1fd3EpOwogCi0JZmlscC0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKilwcml2OworCWZpbHAtPnByaXZhdGVfZGF0YSA9IHByaXY7CisKKwkvKiBsaW5rIGl0IGludG8gb3VyIGFsYXJtbGlzdCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssIGZsYWdzKTsKKwlwcml2LT5uZXh0ID0gYWxhcm1saXN0OworCWFsYXJtbGlzdCA9IHByaXY7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ5MCwxMSArMzY1LDEyIEBACiB7CiAJc3RydWN0IGdwaW9fcHJpdmF0ZSAqcDsKIAlzdHJ1Y3QgZ3Bpb19wcml2YXRlICp0b2RlbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrKCZncGlvX2xvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssIGZsYWdzKTsKIAotICAgICAgICBwID0gYWxhcm1saXN0OwotICAgICAgICB0b2RlbCA9IChzdHJ1Y3QgZ3Bpb19wcml2YXRlICopZmlscC0+cHJpdmF0ZV9kYXRhOworCXAgPSBhbGFybWxpc3Q7CisJdG9kZWwgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAKIAkvKiB1bmxpbmsgZnJvbSBhbGFybWxpc3QgYW5kIGZyZWUgdGhlIHByaXZhdGUgc3RydWN0dXJlICovCiAKQEAgLTUxMiwxMjMgKzM4OCwxMTQgQEAKIAl3aGlsZSAocCkgewogCQlpZiAocC0+aGlnaGFsYXJtIHwgcC0+bG93YWxhcm0pIHsKIAkJCWdwaW9fc29tZV9hbGFybXMgPSAxOwotCQkJc3Bpbl91bmxvY2soJmdwaW9fbG9jayk7Ci0JCQlyZXR1cm4gMDsKKwkJCWdvdG8gb3V0OwogCQl9CiAJCXAgPSBwLT5uZXh0OwogCX0KIAlncGlvX3NvbWVfYWxhcm1zID0gMDsKLQlzcGluX3VubG9jaygmZ3Bpb19sb2NrKTsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KIAotLyogTWFpbiBkZXZpY2UgQVBJLiBpb2N0bCdzIHRvIHJlYWQvc2V0L2NsZWFyIGJpdHMsIGFzIHdlbGwgYXMgdG8gCisvKiBNYWluIGRldmljZSBBUEkuIGlvY3RsJ3MgdG8gcmVhZC9zZXQvY2xlYXIgYml0cywgYXMgd2VsbCBhcyB0bwogICogc2V0IGFsYXJtcyB0byB3YWl0IGZvciB1c2luZyBhIHN1YnNlcXVlbnQgc2VsZWN0KCkuCiAgKi8KLQogdW5zaWduZWQgbG9uZyBpbmxpbmUgc2V0Z2V0X2lucHV0KHN0cnVjdCBncGlvX3ByaXZhdGUgKnByaXYsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCS8qIFNldCBkaXJlY3Rpb24gMD11bmNoYW5nZWQgMT1pbnB1dCwgCi0JICogcmV0dXJuIG1hc2sgd2l0aCAxPWlucHV0IAotCSAqLwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJLyogU2V0IGRpcmVjdGlvbiAwPXVuY2hhbmdlZCAxPWlucHV0LAorCSAqIHJldHVybiBtYXNrIHdpdGggMT1pbnB1dCAqLwogCWlmIChVU0VfUE9SVFMocHJpdikpIHsKLQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQkqcHJpdi0+ZGlyID0gKnByaXYtPmRpcl9zaGFkb3cgJj0gCisJCSpwcml2LT5kaXIgPSAqcHJpdi0+ZGlyX3NoYWRvdyAmPQogCQl+KCh1bnNpZ25lZCBjaGFyKWFyZyAmIHByaXYtPmNoYW5nZWFibGVfZGlyKTsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCQlyZXR1cm4gfigqcHJpdi0+ZGlyX3NoYWRvdykgJiAweEZGOyAvKiBPbmx5IDggYml0cyAqLwotCX0gZWxzZSBpZiAocHJpdi0+bWlub3IgPT0gR1BJT19NSU5PUl9HKSB7Ci0JCS8qIFdlIG11c3QgZmlkZGxlIHdpdGggUl9HRU5fQ09ORklHIHRvIGNoYW5nZSBkaXIgKi8KLQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQlpZiAoKChhcmcgJiBkaXJfZ19pbl9iaXRzKSAhPSBhcmcpICYmIAotCQkgICAgKGFyZyAmIGNoYW5nZWFibGVfZGlyX2cpKSB7Ci0JCQlhcmcgJj0gY2hhbmdlYWJsZV9kaXJfZzsKLQkJCS8qIENsZWFyIGJpdHMgaW4gZ2VuY29uZmlnIHRvIHNldCB0byBpbnB1dCAqLwotCQkJaWYgKGFyZyAmICgxPDwwKSkgewotCQkJCWdlbmNvbmZpZ19zaGFkb3cgJj0gfklPX01BU0soUl9HRU5fQ09ORklHLGcwZGlyKTsKLQkJCQlkaXJfZ19pbl9iaXRzIHw9ICgxPDwwKTsKLQkJCQlkaXJfZ19vdXRfYml0cyAmPSB+KDE8PDApOwotCQkJfQotCQkJaWYgKChhcmcgJiAweDAwMDBGRjAwKSA9PSAweDAwMDBGRjAwKSB7Ci0JCQkJZ2VuY29uZmlnX3NoYWRvdyAmPSB+SU9fTUFTSyhSX0dFTl9DT05GSUcsZzhfMTVkaXIpOwotCQkJCWRpcl9nX2luX2JpdHMgfD0gMHgwMDAwRkYwMDsKLQkJCQlkaXJfZ19vdXRfYml0cyAmPSB+MHgwMDAwRkYwMDsKLQkJCX0KLQkJCWlmICgoYXJnICYgMHgwMEZGMDAwMCkgPT0gMHgwMEZGMDAwMCkgewotCQkJCWdlbmNvbmZpZ19zaGFkb3cgJj0gfklPX01BU0soUl9HRU5fQ09ORklHLGcxNl8yM2Rpcik7Ci0JCQkJZGlyX2dfaW5fYml0cyB8PSAweDAwRkYwMDAwOwotCQkJCWRpcl9nX291dF9iaXRzICY9IH4weDAwRkYwMDAwOwotCQkJfQotCQkJaWYgKGFyZyAmICgxPDwyNCkpIHsKLQkJCQlnZW5jb25maWdfc2hhZG93ICY9IH5JT19NQVNLKFJfR0VOX0NPTkZJRyxnMjRkaXIpOwotCQkJCWRpcl9nX2luX2JpdHMgfD0gKDE8PDI0KTsKLQkJCQlkaXJfZ19vdXRfYml0cyAmPSB+KDE8PDI0KTsKLQkJCX0KLQkJCUQocHJpbnRrKEtFUk5fSU5GTyAiZ3BpbzogU0VUSU5QVVQgb24gcG9ydCBHIHNldCAiCi0JCQkJICJnZW5jb25maWcgdG8gMHglMDhsWCAiCi0JCQkJICJpbl9iaXRzOiAweCUwOGxYICIKLQkJCQkgIm91dF9iaXRzOiAweCUwOGxYXG4iLAotCQkJICAgICAgICAgKHVuc2lnbmVkIGxvbmcpZ2VuY29uZmlnX3NoYWRvdywKLQkJCSAgICAgICAgIGRpcl9nX2luX2JpdHMsIGRpcl9nX291dF9iaXRzKSk7Ci0JCQkqUl9HRU5fQ09ORklHID0gZ2VuY29uZmlnX3NoYWRvdzsKLQkJCS8qIE11c3QgYmUgYSA+MTIwIG5zIGRlbGF5IGJlZm9yZSB3cml0aW5nIHRoaXMgYWdhaW4gKi8KLQkJCQkKLQkJfQotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCXJldHVybiBkaXJfZ19pbl9iaXRzOwogCX0KLQlyZXR1cm4gMDsKKworCWlmIChwcml2LT5taW5vciAhPSBHUElPX01JTk9SX0cpCisJCXJldHVybiAwOworCisJLyogV2UgbXVzdCBmaWRkbGUgd2l0aCBSX0dFTl9DT05GSUcgdG8gY2hhbmdlIGRpciAqLworCWlmICgoKGFyZyAmIGRpcl9nX2luX2JpdHMpICE9IGFyZykgJiYKKwkgICAgKGFyZyAmIGNoYW5nZWFibGVfZGlyX2cpKSB7CisJCWFyZyAmPSBjaGFuZ2VhYmxlX2Rpcl9nOworCQkvKiBDbGVhciBiaXRzIGluIGdlbmNvbmZpZyB0byBzZXQgdG8gaW5wdXQgKi8KKwkJaWYgKGFyZyAmICgxPDwwKSkgeworCQkJZ2VuY29uZmlnX3NoYWRvdyAmPSB+SU9fTUFTSyhSX0dFTl9DT05GSUcsIGcwZGlyKTsKKwkJCWRpcl9nX2luX2JpdHMgfD0gKDE8PDApOworCQkJZGlyX2dfb3V0X2JpdHMgJj0gfigxPDwwKTsKKwkJfQorCQlpZiAoKGFyZyAmIDB4MDAwMEZGMDApID09IDB4MDAwMEZGMDApIHsKKwkJCWdlbmNvbmZpZ19zaGFkb3cgJj0gfklPX01BU0soUl9HRU5fQ09ORklHLCBnOF8xNWRpcik7CisJCQlkaXJfZ19pbl9iaXRzIHw9IDB4MDAwMEZGMDA7CisJCQlkaXJfZ19vdXRfYml0cyAmPSB+MHgwMDAwRkYwMDsKKwkJfQorCQlpZiAoKGFyZyAmIDB4MDBGRjAwMDApID09IDB4MDBGRjAwMDApIHsKKwkJCWdlbmNvbmZpZ19zaGFkb3cgJj0gfklPX01BU0soUl9HRU5fQ09ORklHLCBnMTZfMjNkaXIpOworCQkJZGlyX2dfaW5fYml0cyB8PSAweDAwRkYwMDAwOworCQkJZGlyX2dfb3V0X2JpdHMgJj0gfjB4MDBGRjAwMDA7CisJCX0KKwkJaWYgKGFyZyAmICgxPDwyNCkpIHsKKwkJCWdlbmNvbmZpZ19zaGFkb3cgJj0gfklPX01BU0soUl9HRU5fQ09ORklHLCBnMjRkaXIpOworCQkJZGlyX2dfaW5fYml0cyB8PSAoMTw8MjQpOworCQkJZGlyX2dfb3V0X2JpdHMgJj0gfigxPDwyNCk7CisJCX0KKwkJRChwcmludGsoS0VSTl9ERUJVRyAiZ3BpbzogU0VUSU5QVVQgb24gcG9ydCBHIHNldCAiCisJCQkgImdlbmNvbmZpZyB0byAweCUwOGxYICIKKwkJCSAiaW5fYml0czogMHglMDhsWCAiCisJCQkgIm91dF9iaXRzOiAweCUwOGxYXG4iLAorCQkJICh1bnNpZ25lZCBsb25nKWdlbmNvbmZpZ19zaGFkb3csCisJCQkgZGlyX2dfaW5fYml0cywgZGlyX2dfb3V0X2JpdHMpKTsKKwkJKlJfR0VOX0NPTkZJRyA9IGdlbmNvbmZpZ19zaGFkb3c7CisJCS8qIE11c3QgYmUgYSA+MTIwIG5zIGRlbGF5IGJlZm9yZSB3cml0aW5nIHRoaXMgYWdhaW4gKi8KKworCX0KKwlyZXR1cm4gZGlyX2dfaW5fYml0czsKIH0gLyogc2V0Z2V0X2lucHV0ICovCiAKIHVuc2lnbmVkIGxvbmcgaW5saW5lIHNldGdldF9vdXRwdXQoc3RydWN0IGdwaW9fcHJpdmF0ZSAqcHJpdiwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpZiAoVVNFX1BPUlRTKHByaXYpKSB7Ci0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJKnByaXYtPmRpciA9ICpwcml2LT5kaXJfc2hhZG93IHw9IAotCQkgICgodW5zaWduZWQgY2hhcilhcmcgJiBwcml2LT5jaGFuZ2VhYmxlX2Rpcik7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJKnByaXYtPmRpciA9ICpwcml2LT5kaXJfc2hhZG93IHw9CisJCQkoKHVuc2lnbmVkIGNoYXIpYXJnICYgcHJpdi0+Y2hhbmdlYWJsZV9kaXIpOwogCQlyZXR1cm4gKnByaXYtPmRpcl9zaGFkb3c7Ci0JfSBlbHNlIGlmIChwcml2LT5taW5vciA9PSBHUElPX01JTk9SX0cpIHsKLQkJLyogV2UgbXVzdCBmaWRkbGUgd2l0aCBSX0dFTl9DT05GSUcgdG8gY2hhbmdlIGRpciAqLwkJCQotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCWlmICgoKGFyZyAmIGRpcl9nX291dF9iaXRzKSAhPSBhcmcpICYmCi0JCSAgICAoYXJnICYgY2hhbmdlYWJsZV9kaXJfZykpIHsKLQkJCS8qIFNldCBiaXRzIGluIGdlbmNvbmZpZyB0byBzZXQgdG8gb3V0cHV0ICovCi0JCQlpZiAoYXJnICYgKDE8PDApKSB7Ci0JCQkJZ2VuY29uZmlnX3NoYWRvdyB8PSBJT19NQVNLKFJfR0VOX0NPTkZJRyxnMGRpcik7Ci0JCQkJZGlyX2dfb3V0X2JpdHMgfD0gKDE8PDApOwotCQkJCWRpcl9nX2luX2JpdHMgJj0gfigxPDwwKTsKLQkJCX0KLQkJCWlmICgoYXJnICYgMHgwMDAwRkYwMCkgPT0gMHgwMDAwRkYwMCkgewotCQkJCWdlbmNvbmZpZ19zaGFkb3cgfD0gSU9fTUFTSyhSX0dFTl9DT05GSUcsZzhfMTVkaXIpOwotCQkJCWRpcl9nX291dF9iaXRzIHw9IDB4MDAwMEZGMDA7Ci0JCQkJZGlyX2dfaW5fYml0cyAmPSB+MHgwMDAwRkYwMDsKLQkJCX0KLQkJCWlmICgoYXJnICYgMHgwMEZGMDAwMCkgPT0gMHgwMEZGMDAwMCkgewotCQkJCWdlbmNvbmZpZ19zaGFkb3cgfD0gSU9fTUFTSyhSX0dFTl9DT05GSUcsZzE2XzIzZGlyKTsKLQkJCQlkaXJfZ19vdXRfYml0cyB8PSAweDAwRkYwMDAwOwotCQkJCWRpcl9nX2luX2JpdHMgJj0gfjB4MDBGRjAwMDA7Ci0JCQl9Ci0JCQlpZiAoYXJnICYgKDE8PDI0KSkgewotCQkJCWdlbmNvbmZpZ19zaGFkb3cgfD0gSU9fTUFTSyhSX0dFTl9DT05GSUcsZzI0ZGlyKTsKLQkJCQlkaXJfZ19vdXRfYml0cyB8PSAoMTw8MjQpOwotCQkJCWRpcl9nX2luX2JpdHMgJj0gfigxPDwyNCk7Ci0JCQl9Ci0JCQlEKHByaW50ayhLRVJOX0lORk8gImdwaW86IFNFVE9VVFBVVCBvbiBwb3J0IEcgc2V0ICIKLQkJCQkgImdlbmNvbmZpZyB0byAweCUwOGxYICIKLQkJCQkgImluX2JpdHM6IDB4JTA4bFggIgotCQkJCSAib3V0X2JpdHM6IDB4JTA4bFhcbiIsCi0JCQkgICAgICAgICAodW5zaWduZWQgbG9uZylnZW5jb25maWdfc2hhZG93LAotCQkJICAgICAgICAgZGlyX2dfaW5fYml0cywgZGlyX2dfb3V0X2JpdHMpKTsKLQkJCSpSX0dFTl9DT05GSUcgPSBnZW5jb25maWdfc2hhZG93OwotCQkJLyogTXVzdCBiZSBhID4xMjAgbnMgZGVsYXkgYmVmb3JlIHdyaXRpbmcgdGhpcyBhZ2FpbiAqLwotCQl9Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJcmV0dXJuIGRpcl9nX291dF9iaXRzICYgMHg3RkZGRkZGRjsKIAl9Ci0JcmV0dXJuIDA7CisJaWYgKHByaXYtPm1pbm9yICE9IEdQSU9fTUlOT1JfRykKKwkJcmV0dXJuIDA7CisKKwkvKiBXZSBtdXN0IGZpZGRsZSB3aXRoIFJfR0VOX0NPTkZJRyB0byBjaGFuZ2UgZGlyICovCisJaWYgKCgoYXJnICYgZGlyX2dfb3V0X2JpdHMpICE9IGFyZykgJiYKKwkgICAgKGFyZyAmIGNoYW5nZWFibGVfZGlyX2cpKSB7CisJCS8qIFNldCBiaXRzIGluIGdlbmNvbmZpZyB0byBzZXQgdG8gb3V0cHV0ICovCisJCWlmIChhcmcgJiAoMTw8MCkpIHsKKwkJCWdlbmNvbmZpZ19zaGFkb3cgfD0gSU9fTUFTSyhSX0dFTl9DT05GSUcsIGcwZGlyKTsKKwkJCWRpcl9nX291dF9iaXRzIHw9ICgxPDwwKTsKKwkJCWRpcl9nX2luX2JpdHMgJj0gfigxPDwwKTsKKwkJfQorCQlpZiAoKGFyZyAmIDB4MDAwMEZGMDApID09IDB4MDAwMEZGMDApIHsKKwkJCWdlbmNvbmZpZ19zaGFkb3cgfD0gSU9fTUFTSyhSX0dFTl9DT05GSUcsIGc4XzE1ZGlyKTsKKwkJCWRpcl9nX291dF9iaXRzIHw9IDB4MDAwMEZGMDA7CisJCQlkaXJfZ19pbl9iaXRzICY9IH4weDAwMDBGRjAwOworCQl9CisJCWlmICgoYXJnICYgMHgwMEZGMDAwMCkgPT0gMHgwMEZGMDAwMCkgeworCQkJZ2VuY29uZmlnX3NoYWRvdyB8PSBJT19NQVNLKFJfR0VOX0NPTkZJRywgZzE2XzIzZGlyKTsKKwkJCWRpcl9nX291dF9iaXRzIHw9IDB4MDBGRjAwMDA7CisJCQlkaXJfZ19pbl9iaXRzICY9IH4weDAwRkYwMDAwOworCQl9CisJCWlmIChhcmcgJiAoMTw8MjQpKSB7CisJCQlnZW5jb25maWdfc2hhZG93IHw9IElPX01BU0soUl9HRU5fQ09ORklHLCBnMjRkaXIpOworCQkJZGlyX2dfb3V0X2JpdHMgfD0gKDE8PDI0KTsKKwkJCWRpcl9nX2luX2JpdHMgJj0gfigxPDwyNCk7CisJCX0KKwkJRChwcmludGsoS0VSTl9JTkZPICJncGlvOiBTRVRPVVRQVVQgb24gcG9ydCBHIHNldCAiCisJCQkgImdlbmNvbmZpZyB0byAweCUwOGxYICIKKwkJCSAiaW5fYml0czogMHglMDhsWCAiCisJCQkgIm91dF9iaXRzOiAweCUwOGxYXG4iLAorCQkJICh1bnNpZ25lZCBsb25nKWdlbmNvbmZpZ19zaGFkb3csCisJCQkgZGlyX2dfaW5fYml0cywgZGlyX2dfb3V0X2JpdHMpKTsKKwkJKlJfR0VOX0NPTkZJRyA9IGdlbmNvbmZpZ19zaGFkb3c7CisJCS8qIE11c3QgYmUgYSA+MTIwIG5zIGRlbGF5IGJlZm9yZSB3cml0aW5nIHRoaXMgYWdhaW4gKi8KKwl9CisJcmV0dXJuIGRpcl9nX291dF9iaXRzICYgMHg3RkZGRkZGRjsKIH0gLyogc2V0Z2V0X291dHB1dCAqLwogCiBzdGF0aWMgaW50CkBAIC02NDIsMTIgKzUwOSwxMSBAQAogCXVuc2lnbmVkIGxvbmcgdmFsOwogICAgICAgICBpbnQgcmV0ID0gMDsKIAotCXN0cnVjdCBncGlvX3ByaXZhdGUgKnByaXYgPSAoc3RydWN0IGdwaW9fcHJpdmF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKLQlpZiAoX0lPQ19UWVBFKGNtZCkgIT0gRVRSQVhHUElPX0lPQ1RZUEUpIHsKKwlzdHJ1Y3QgZ3Bpb19wcml2YXRlICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmIChfSU9DX1RZUEUoY21kKSAhPSBFVFJBWEdQSU9fSU9DVFlQRSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCi0Jc3Bpbl9sb2NrKCZncGlvX2xvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssIGZsYWdzKTsKIAogCXN3aXRjaCAoX0lPQ19OUihjbWQpKSB7CiAJY2FzZSBJT19SRUFEQklUUzogLyogVXNlIElPX1JFQURfSU5CSVRTIGFuZCBJT19SRUFEX09VVEJJVFMgaW5zdGVhZCAqLwpAQCAtNjU5LDcgKzUyNSw2IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBJT19TRVRCSVRTOgotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJCS8vIHNldCBjaGFuZ2VhYmxlIGJpdHMgd2l0aCBhIDEgaW4gYXJnCiAJCWlmIChVU0VfUE9SVFMocHJpdikpIHsKIAkJCSpwcml2LT5wb3J0ID0gKnByaXYtPnNoYWRvdyB8PSAKQEAgLTY2NywxMCArNTMyLDggQEAKIAkJfSBlbHNlIGlmIChwcml2LT5taW5vciA9PSBHUElPX01JTk9SX0cpIHsKIAkJCSpSX1BPUlRfR19EQVRBID0gcG9ydF9nX2RhdGFfc2hhZG93IHw9IChhcmcgJiBkaXJfZ19vdXRfYml0cyk7CiAJCX0KLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCQlicmVhazsKIAljYXNlIElPX0NMUkJJVFM6Ci0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkJLy8gY2xlYXIgY2hhbmdlYWJsZSBiaXRzIHdpdGggYSAxIGluIGFyZwogCQlpZiAoVVNFX1BPUlRTKHByaXYpKSB7CiAJCQkqcHJpdi0+cG9ydCA9ICpwcml2LT5zaGFkb3cgJj0gCkBAIC02NzgsNyArNTQxLDYgQEAKIAkJfSBlbHNlIGlmIChwcml2LT5taW5vciA9PSBHUElPX01JTk9SX0cpIHsKIAkJCSpSX1BPUlRfR19EQVRBID0gcG9ydF9nX2RhdGFfc2hhZG93ICY9IH4oKHVuc2lnbmVkIGxvbmcpYXJnICYgZGlyX2dfb3V0X2JpdHMpOwogCQl9Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAkJYnJlYWs7CiAJY2FzZSBJT19ISUdIQUxBUk06CiAJCS8vIHNldCBhbGFybSB3aGVuIGJpdHMgd2l0aCAxIGluIGFyZyBnbyBoaWdoCkBAIC02OTgsNiArNTYwLDggQEAKIAkJCS8qIE11c3QgdXBkYXRlIGdwaW9fc29tZV9hbGFybXMgKi8KIAkJCXN0cnVjdCBncGlvX3ByaXZhdGUgKnAgPSBhbGFybWxpc3Q7CiAJCQlpbnQgc29tZV9hbGFybXM7CisJCQlzcGluX2xvY2tfaXJxKCZncGlvX2xvY2spOworCQkJcCA9IGFsYXJtbGlzdDsKIAkJCXNvbWVfYWxhcm1zID0gMDsKIAkJCXdoaWxlIChwKSB7CiAJCQkJaWYgKHAtPmhpZ2hhbGFybSB8IHAtPmxvd2FsYXJtKSB7CkBAIC03MDcsNiArNTcxLDcgQEAKIAkJCQlwID0gcC0+bmV4dDsKIAkJCX0KIAkJCWdwaW9fc29tZV9hbGFybXMgPSBzb21lX2FsYXJtczsKKwkJCXNwaW5fdW5sb2NrX2lycSgmZ3Bpb19sb2NrKTsKIAkJfQogCQlicmVhazsKIAljYXNlIElPX1JFQURESVI6IC8qIFVzZSBJT19TRVRHRVRfSU5QVVQvT1VUUFVUIGluc3RlYWQhICovCkBAIC03NjYsNyArNjMxLDcgQEAKIAkJfSBlbHNlIGlmIChwcml2LT5taW5vciA9PSBHUElPX01JTk9SX0cpIHsKIAkJCXZhbCA9ICpSX1BPUlRfR19EQVRBOwogCQl9Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHVuc2lnbmVkIGxvbmcqKWFyZywgJnZhbCwgc2l6ZW9mKHZhbCkpKQorCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnZhbCwgc2l6ZW9mKHZhbCkpKQogCQkJcmV0ID0gLUVGQVVMVDsKIAkJYnJlYWs7CiAJY2FzZSBJT19SRUFEX09VVEJJVFM6CkBAIC03NzYsMzMgKzY0MSwzMiBAQAogCQl9IGVsc2UgaWYgKHByaXYtPm1pbm9yID09IEdQSU9fTUlOT1JfRykgewogCQkJdmFsID0gcG9ydF9nX2RhdGFfc2hhZG93OwogCQl9Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHVuc2lnbmVkIGxvbmcqKWFyZywgJnZhbCwgc2l6ZW9mKHZhbCkpKQorCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnZhbCwgc2l6ZW9mKHZhbCkpKQogCQkJcmV0ID0gLUVGQVVMVDsKIAkJYnJlYWs7CiAJY2FzZSBJT19TRVRHRVRfSU5QVVQ6IAogCQkvKiBiaXRzIHNldCBpbiAqYXJnIGlzIHNldCB0byBpbnB1dCwKIAkJICogKmFyZyB1cGRhdGVkIHdpdGggY3VycmVudCBpbnB1dCBwaW5zLgogCQkgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWwsICh1bnNpZ25lZCBsb25nKilhcmcsIHNpemVvZih2YWwpKSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWwsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHZhbCkpKQogCQl7CiAJCQlyZXQgPSAtRUZBVUxUOwogCQkJYnJlYWs7CiAJCX0KIAkJdmFsID0gc2V0Z2V0X2lucHV0KHByaXYsIHZhbCk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHVuc2lnbmVkIGxvbmcqKWFyZywgJnZhbCwgc2l6ZW9mKHZhbCkpKQorCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnZhbCwgc2l6ZW9mKHZhbCkpKQogCQkJcmV0ID0gLUVGQVVMVDsKIAkJYnJlYWs7CiAJY2FzZSBJT19TRVRHRVRfT1VUUFVUOgogCQkvKiBiaXRzIHNldCBpbiAqYXJnIGlzIHNldCB0byBvdXRwdXQsCiAJCSAqICphcmcgdXBkYXRlZCB3aXRoIGN1cnJlbnQgb3V0cHV0IHBpbnMuCiAJCSAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgKHVuc2lnbmVkIGxvbmcqKWFyZywgc2l6ZW9mKHZhbCkpKQotCQl7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZih2YWwpKSkgewogCQkJcmV0ID0gLUVGQVVMVDsKIAkJCWJyZWFrOwogCQl9CiAJCXZhbCA9IHNldGdldF9vdXRwdXQocHJpdiwgdmFsKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodW5zaWduZWQgbG9uZyopYXJnLCAmdmFsLCBzaXplb2YodmFsKSkpCisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdmFsLCBzaXplb2YodmFsKSkpCiAJCQlyZXQgPSAtRUZBVUxUOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtODEyLDcgKzY3Niw3IEBACiAJCQlyZXQgPSAtRUlOVkFMOwogCX0gLyogc3dpdGNoICovCiAKLQlzcGluX3VubG9jaygmZ3Bpb19sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC04MjQsMTggKzY4OCwxOCBAQAogCiAJc3dpdGNoIChfSU9DX05SKGNtZCkpIHsKIAljYXNlIElPX0xFREFDVElWRV9TRVQ6Ci0JCWdyZWVuID0gKCh1bnNpZ25lZCBjaGFyKSBhcmcpICYgMTsKLQkJcmVkICAgPSAoKCh1bnNpZ25lZCBjaGFyKSBhcmcpID4+IDEpICYgMTsKLQkJTEVEX0FDVElWRV9TRVRfRyhncmVlbik7Ci0JCUxFRF9BQ1RJVkVfU0VUX1IocmVkKTsKKwkJZ3JlZW4gPSAoKHVuc2lnbmVkIGNoYXIpYXJnKSAmIDE7CisJCXJlZCAgID0gKCgodW5zaWduZWQgY2hhcilhcmcpID4+IDEpICYgMTsKKwkJQ1JJU19MRURfQUNUSVZFX1NFVF9HKGdyZWVuKTsKKwkJQ1JJU19MRURfQUNUSVZFX1NFVF9SKHJlZCk7CiAJCWJyZWFrOwogCiAJY2FzZSBJT19MRURfU0VUQklUOgotCQlMRURfQklUX1NFVChhcmcpOworCQlDUklTX0xFRF9CSVRfU0VUKGFyZyk7CiAJCWJyZWFrOwogCiAJY2FzZSBJT19MRURfQ0xSQklUOgotCQlMRURfQklUX0NMUihhcmcpOworCQlDUklTX0xFRF9CSVRfQ0xSKGFyZyk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTg0NSw3ICs3MDksNyBAQAogCXJldHVybiAwOwogfQogCi1jb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGdwaW9fZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGdwaW9fZm9wcyA9IHsKIAkub3duZXIgICAgICAgPSBUSElTX01PRFVMRSwKIAkucG9sbCAgICAgICAgPSBncGlvX3BvbGwsCiAJLmlvY3RsICAgICAgID0gZ3Bpb19pb2N0bCwKQEAgLTg1NCwxNiArNzE4LDE4IEBACiAJLnJlbGVhc2UgICAgID0gZ3Bpb19yZWxlYXNlLAogfTsKIAotCi12b2lkIGlvaWZfd2F0Y2hlcihjb25zdCB1bnNpZ25lZCBpbnQgZ3Bpb19pbl9hdmFpbGFibGUsCi0JCSAgY29uc3QgdW5zaWduZWQgaW50IGdwaW9fb3V0X2F2YWlsYWJsZSwKLQkJICBjb25zdCB1bnNpZ25lZCBjaGFyIHBhX2F2YWlsYWJsZSwKLQkJICBjb25zdCB1bnNpZ25lZCBjaGFyIHBiX2F2YWlsYWJsZSkKK3N0YXRpYyB2b2lkIGlvaWZfd2F0Y2hlcihjb25zdCB1bnNpZ25lZCBpbnQgZ3Bpb19pbl9hdmFpbGFibGUsCisJY29uc3QgdW5zaWduZWQgaW50IGdwaW9fb3V0X2F2YWlsYWJsZSwKKwljb25zdCB1bnNpZ25lZCBjaGFyIHBhX2F2YWlsYWJsZSwKKwljb25zdCB1bnNpZ25lZCBjaGFyIHBiX2F2YWlsYWJsZSkKIHsKIAl1bnNpZ25lZCBsb25nIGludCBmbGFnczsKLQlEKHByaW50aygiZ3Bpby5jOiBpb2lmX3dhdGNoZXIgY2FsbGVkXG4iKSk7Ci0JRChwcmludGsoImdwaW8uYzogRyBpbjogMHglMDh4IEcgb3V0OiAweCUwOHggUEE6IDB4JTAyeCBQQjogMHglMDJ4XG4iLAotCQkgZ3Bpb19pbl9hdmFpbGFibGUsIGdwaW9fb3V0X2F2YWlsYWJsZSwgcGFfYXZhaWxhYmxlLCBwYl9hdmFpbGFibGUpKTsKKworCUQocHJpbnRrKEtFUk5fREVCVUcgImdwaW8uYzogaW9pZl93YXRjaGVyIGNhbGxlZFxuIikpOworCUQocHJpbnRrKEtFUk5fREVCVUcgImdwaW8uYzogRyBpbjogMHglMDh4IEcgb3V0OiAweCUwOHggIgorCQkiUEE6IDB4JTAyeCBQQjogMHglMDJ4XG4iLAorCQlncGlvX2luX2F2YWlsYWJsZSwgZ3Bpb19vdXRfYXZhaWxhYmxlLAorCQlwYV9hdmFpbGFibGUsIHBiX2F2YWlsYWJsZSkpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOwogCkBAIC04NzIsNyArNzM4LDcgQEAKIAogCS8qIEluaXRpYWxpc2UgdGhlIGRpcl9nX3NoYWRvdyBldGMuIGRlcGVuZGluZyBvbiBnZW5jb25maWcgKi8KIAkvKiAwPWlucHV0IDE9b3V0cHV0ICovCi0JaWYgKGdlbmNvbmZpZ19zaGFkb3cgJiBJT19TVEFURShSX0dFTl9DT05GSUcsIGcwZGlyLCBvdXQpKSAKKwlpZiAoZ2VuY29uZmlnX3NoYWRvdyAmIElPX1NUQVRFKFJfR0VOX0NPTkZJRywgZzBkaXIsIG91dCkpCiAJCWRpcl9nX3NoYWRvdyB8PSAoMSA8PCAwKTsKIAlpZiAoZ2VuY29uZmlnX3NoYWRvdyAmIElPX1NUQVRFKFJfR0VOX0NPTkZJRywgZzhfMTVkaXIsIG91dCkpCiAJCWRpcl9nX3NoYWRvdyB8PSAweDAwMDBGRjAwOwpAQCAtODg0LDcgKzc1MCw4IEBACiAJY2hhbmdlYWJsZV9kaXJfZyA9IGNoYW5nZWFibGVfZGlyX2dfbWFzazsKIAljaGFuZ2VhYmxlX2Rpcl9nICY9IGRpcl9nX291dF9iaXRzOwogCWNoYW5nZWFibGVfZGlyX2cgJj0gZGlyX2dfaW5fYml0czsKLQkvKiBDb3JyZWN0IHRoZSBiaXRzIHRoYXQgY2FuIGNoYW5nZSBkaXJlY3Rpb24gKi8gCisKKwkvKiBDb3JyZWN0IHRoZSBiaXRzIHRoYXQgY2FuIGNoYW5nZSBkaXJlY3Rpb24gKi8KIAlkaXJfZ19vdXRfYml0cyAmPSB+Y2hhbmdlYWJsZV9kaXJfZzsKIAlkaXJfZ19vdXRfYml0cyB8PSBkaXJfZ19zaGFkb3c7CiAJZGlyX2dfaW5fYml0cyAmPSB+Y2hhbmdlYWJsZV9kaXJfZzsKQEAgLTg5Miw3ICs3NTksOCBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCBmbGFncyk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJHUElPIHBvcnQgRzogaW5fYml0czogMHglMDhsWCBvdXRfYml0czogMHglMDhsWCB2YWw6ICUwOGxYXG4iLAorCXByaW50ayhLRVJOX0lORk8gIkdQSU8gcG9ydCBHOiBpbl9iaXRzOiAweCUwOGxYIG91dF9iaXRzOiAweCUwOGxYICIKKwkJInZhbDogJTA4bFhcbiIsCiAJICAgICAgIGRpcl9nX2luX2JpdHMsIGRpcl9nX291dF9iaXRzLCAodW5zaWduZWQgbG9uZykqUl9QT1JUX0dfREFUQSk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiR1BJTyBwb3J0IEc6IGRpcjogJTA4bFggY2hhbmdlYWJsZTogJTA4bFhcbiIsCiAJICAgICAgIGRpcl9nX3NoYWRvdywgY2hhbmdlYWJsZV9kaXJfZyk7CkBAIC05MDAsMTYgKzc2OCwxMiBAQAogCiAvKiBtYWluIGRyaXZlciBpbml0aWFsaXphdGlvbiByb3V0aW5lLCBjYWxsZWQgZnJvbSBtZW0uYyAqLwogCi1zdGF0aWMgX19pbml0IGludAotZ3Bpb19pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBncGlvX2luaXQodm9pZCkKIHsKIAlpbnQgcmVzOwogI2lmIGRlZmluZWQgKENPTkZJR19FVFJBWF9DU1AwX0xFRFMpCiAJaW50IGk7CiAjZW5kaWYKLSAgICAgICAgcHJpbnRrKCJncGlvIGluaXRcbiIpOwotCi0JLyogZG8gdGhlIGZvcm1hbGl0aWVzICovCiAKIAlyZXMgPSByZWdpc3Rlcl9jaHJkZXYoR1BJT19NQUpPUiwgZ3Bpb19uYW1lLCAmZ3Bpb19mb3BzKTsKIAlpZiAocmVzIDwgMCkgewpAQCAtOTE5LDQzICs3ODMsNDUgQEAKIAogCS8qIENsZWFyIGFsbCBsZWRzICovCiAjaWYgZGVmaW5lZCAoQ09ORklHX0VUUkFYX0NTUDBfTEVEUykgfHwgIGRlZmluZWQgKENPTkZJR19FVFJBWF9QQV9MRURTKSB8fCBkZWZpbmVkIChDT05GSUdfRVRSQVhfUEJfTEVEUykKLQlMRURfTkVUV09SS19TRVQoMCk7Ci0JTEVEX0FDVElWRV9TRVQoMCk7Ci0JTEVEX0RJU0tfUkVBRCgwKTsKLQlMRURfRElTS19XUklURSgwKTsKKwlDUklTX0xFRF9ORVRXT1JLX1NFVCgwKTsKKwlDUklTX0xFRF9BQ1RJVkVfU0VUKDApOworCUNSSVNfTEVEX0RJU0tfUkVBRCgwKTsKKwlDUklTX0xFRF9ESVNLX1dSSVRFKDApOwogCiAjaWYgZGVmaW5lZCAoQ09ORklHX0VUUkFYX0NTUDBfTEVEUykKLQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQlMRURfQklUX1NFVChpKTsKLQl9CisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJCUNSSVNfTEVEX0JJVF9TRVQoaSk7CiAjZW5kaWYKIAogI2VuZGlmCiAJLyogVGhlIEkvTyBpbnRlcmZhY2UgYWxsb2NhdGlvbiB3YXRjaGVyIHdpbGwgYmUgY2FsbGVkIHdoZW4KIAkgKiByZWdpc3RlcmluZyBpdC4gKi8KIAlpZiAoY3Jpc19pb19pbnRlcmZhY2VfcmVnaXN0ZXJfd2F0Y2hlcihpb2lmX3dhdGNoZXIpKXsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZ3Bpb19pbml0OiBGYWlsZWQgdG8gaW5zdGFsbCBJTyBpZiBhbGxvY2F0b3Igd2F0Y2hlclxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImdwaW9faW5pdDogRmFpbGVkIHRvIGluc3RhbGwgSU8gIgorCQkJImlmIGFsbG9jYXRvciB3YXRjaGVyXG4iKTsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPICJFVFJBWCAxMDBMWCBHUElPIGRyaXZlciB2Mi41LCAoYykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCBBeGlzIENvbW11bmljYXRpb25zIEFCXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJFVFJBWCAxMDBMWCBHUElPIGRyaXZlciB2Mi41LCAoYykgMjAwMS0yMDA4ICIKKwkJIkF4aXMgQ29tbXVuaWNhdGlvbnMgQUJcbiIpOwogCS8qIFdlIGNhbGwgZXRyYXhfZ3Bpb193YWtlX3VwX2NoZWNrKCkgZnJvbSB0aW1lciBpbnRlcnJ1cHQgYW5kCiAJICogZnJvbSBjcHVfaWRsZSgpIGluIGtlcm5lbC9wcm9jZXNzLmMKIAkgKiBUaGUgY2hlY2sgaW4gY3B1X2lkbGUoKSByZWR1Y2VzIGxhdGVuY3kgZnJvbSB+MTUgbXMgdG8gfjYgbXMKIAkgKiBpbiBzb21lIHRlc3RzLgotCSAqLyAgCi0JaWYgKHJlcXVlc3RfaXJxKFRJTUVSMF9JUlFfTkJSLCBncGlvX3BvbGxfdGltZXJfaW50ZXJydXB0LAotCQkJSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVELCJncGlvIHBvbGwiLCBOVUxMKSkgeworCSAqLworCXJlcyA9IHJlcXVlc3RfaXJxKFRJTUVSMF9JUlFfTkJSLCBncGlvX3BvbGxfdGltZXJfaW50ZXJydXB0LAorCQlJUlFGX1NIQVJFRCB8IElSUUZfRElTQUJMRUQsICJncGlvIHBvbGwiLCBncGlvX25hbWUpOworCWlmIChyZXMpIHsKIAkJcHJpbnRrKEtFUk5fQ1JJVCAiZXJyOiB0aW1lcjAgaXJxIGZvciBncGlvXG4iKTsKKwkJcmV0dXJuIHJlczsKIAl9Ci0JaWYgKHJlcXVlc3RfaXJxKFBBX0lSUV9OQlIsIGdwaW9fcGFfaW50ZXJydXB0LAotCQkJSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVELCJncGlvIFBBIiwgTlVMTCkpIHsKKwlyZXMgPSByZXF1ZXN0X2lycShQQV9JUlFfTkJSLCBncGlvX2ludGVycnVwdCwKKwkJSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVELCAiZ3BpbyBQQSIsIGdwaW9fbmFtZSk7CisJaWYgKHJlcykKIAkJcHJpbnRrKEtFUk5fQ1JJVCAiZXJyOiBQQSBpcnEgZm9yIGdwaW9cbiIpOwotCX0KLQkKIAogCXJldHVybiByZXM7CiB9CiAKIC8qIHRoaXMgbWFrZXMgc3VyZSB0aGF0IGdwaW9faW5pdCBpcyBjYWxsZWQgZHVyaW5nIGtlcm5lbCBib290ICovCi0KIG1vZHVsZV9pbml0KGdwaW9faW5pdCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL2kyYy5jIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvaTJjLmMKaW5kZXggYWNhODFkZC4uZDZkMjIwNiAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvaTJjLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvaTJjLmMKQEAgLTYsODUgKzYsOSBAQAogKiEgICAgICAgICAgICAgIGtlcm5lbCBtb2R1bGVzIChpMmNfd3JpdGVyZWcvcmVhZHJlZykgYW5kIGZyb20gdXNlcnNwYWNlIHVzaW5nCiAqISAgICAgICAgICAgICAgaW9jdGwoKSdzCiAqIQotKiEgTm92IDMwIDE5OTggIFRvcmJqb3JuIEVsaWFzc29uICBJbml0aWFsIHZlcnNpb24uCi0qISAgICAgICAgICAgICAgQmpvcm4gV2VzZW4gICAgICAgIEVsaW51eCBrZXJuZWwgdmVyc2lvbi4KLSohIEphbiAxNCAyMDAwICBKb2hhbiBBZG9sZnNzb24gICAgRml4ZWQgUEIgc2hhZG93IHJlZ2lzdGVyIHN0dWZmIC0gCi0qISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbid0IHVzZSBQQl9JMkMgaWYgRFMxMzAyIHVzZXMgc2FtZSBiaXRzLAotKiEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2UgUEIuCi0qISAkTG9nOiBpMmMuYyx2ICQKLSohIFJldmlzaW9uIDEuMTMgIDIwMDUvMDMvMDcgMTM6MTM6MDcgIHN0YXJ2aWsKLSohIEFkZGVkIHNwaW5sb2NrcyB0byBwcm90ZWN0IHN0YXRlcyBldGMKLSohCi0qISBSZXZpc2lvbiAxLjEyICAyMDA1LzAxLzA1IDA2OjExOjIyICBzdGFydmlrCi0qISBObyBuZWVkIHRvIGRvIGxvY2FsX2lycV9kaXNhYmxlIGFmdGVyIGxvY2FsX2lycV9zYXZlLgotKiEKLSohIFJldmlzaW9uIDEuMTEgIDIwMDQvMTIvMTMgMTI6MjE6NTIgIHN0YXJ2aWsKLSohIEFkZGVkIEkvTyBhbmQgRE1BIGFsbG9jYXRvcnMgZnJvbSBMaW51eCAyLjQKLSohCi0qISBSZXZpc2lvbiAxLjkgIDIwMDQvMDgvMjQgMDY6NDk6MTQgIHN0YXJ2aWsKLSohIFdoaXRlc3BhY2UgY2xlYW51cAotKiEKLSohIFJldmlzaW9uIDEuOCAgMjAwNC8wNi8wOCAwODo0ODoyNiAgc3RhcnZpawotKiEgUmVtb3ZlZCB1bnVzZWQgY29kZQotKiEKLSohIFJldmlzaW9uIDEuNyAgMjAwNC8wNS8yOCAwOToyNjo1OSAgc3RhcnZpawotKiEgTW9kaWZpZWQgSTJDIGluaXRpYWxpemF0aW9uIHRvIHdvcmsgaW4gMi42LgotKiEKLSohIFJldmlzaW9uIDEuNiAgMjAwNC8wNS8xNCAwNzo1ODowMyAgc3RhcnZpawotKiEgTWVyZ2Ugb2YgY2hhbmdlcyBmcm9tIDIuNAotKiEKLSohIFJldmlzaW9uIDEuNCAgMjAwMi8xMi8xMSAxMzoxMzo1NyAgc3RhcnZpawotKiEgQWRkZWQgYXJjaC8gdG8gdjEwIHNwZWNpZmljIGluY2x1ZGVzCi0qISBBZGRlZCBmaXggZnJvbSBMaW51eCAyLjQgaW4gc2VyaWFsLmMgKGZsdXNoX3RvX2ZsaXBfYnVmZmVyKQotKiEKLSohIFJldmlzaW9uIDEuMyAgMjAwMi8xMS8yMCAxMTo1NjoxMSAgc3RhcnZpawotKiEgTWVyZ2Ugb2YgTGludXggMi41LjQ4Ci0qIQotKiEgUmV2aXNpb24gMS4yICAyMDAyLzExLzE4IDEzOjE2OjA2ICBzdGFydmlrCi0qISBMaW51eCAyLjUgcG9ydCBvZiBsYXRlc3QgMi40IGRyaXZlcnMKLSohCi0qISBSZXZpc2lvbiAxLjkgIDIwMDIvMTAvMzEgMTU6MzI6MjYgIHN0YXJ2aWsKLSohIFVwZGF0ZSBQb3J0IEIgcmVnaXN0ZXIgYW5kIHNoYWRvdyBldmVuIHdoZW4gcnVubmluZyB3aXRoIGhhcmR3YXJlIHN1cHBvcnQKLSohICAgdG8gYXZvaWQgZ2xpdGNoZXMgd2hlbiByZWFkaW5nIGJpdHMKLSohIE5ldmVyIHNldCBkaXJlY3Rpb24gdG8gb3V0IGluIGkyY19pbmJ5dGUKLSohIFJlbW92ZWQgaW5jb3JyZWN0IGNsb2NrIHRvZ2dsaW5nIGF0IGVuZCBvZiBpMmNfaW5ieXRlCi0qIQotKiEgUmV2aXNpb24gMS44ICAyMDAyLzA4LzEzIDA2OjMxOjUzICBzdGFydmlrCi0qISBNYWRlIFNEQSBhbmQgU0NMIGxpbmUgY29uZmlndXJhYmxlCi0qISBNb2RpZmllZCBpMmNfaW5ieXRlIHRvIHdvcmsgd2l0aCBQQ0Y4NTYzCi0qIQotKiEgUmV2aXNpb24gMS43ICAyMDAxLzA0LzA0IDEzOjExOjM2ICBtYXJrdXNsCi0qISBVcGRhdGVkIGFjY29yZGluZyB0byByZXZpZXcgcmVtYXJrcwotKiEKLSohIFJldmlzaW9uIDEuNiAgMjAwMS8wMy8xOSAxMjo0MzowMCAgbWFya3VzbAotKiEgTWFkZSBzb21lIHN5bWJvbHMgdW5zdGF0aWMgKHVzZWQgYnkgdGhlIGVlcHJvbSBkcml2ZXIpCi0qIQotKiEgUmV2aXNpb24gMS41ICAyMDAxLzAyLzI3IDEzOjUyOjQ4ICBiam9ybncKLSohIG1hbGxvYy5oIC0+IHNsYWIuaAotKiEKLSohIFJldmlzaW9uIDEuNCAgMjAwMS8wMi8xNSAwNzoxNzo0MCAgc3RhcnZpawotKiEgQ29ycmVjdGVkIHVzYWdlIGlmIHBvcnRfcGJfaTJjX3NoYWRvdwotKiEKLSohIFJldmlzaW9uIDEuMyAgMjAwMS8wMS8yNiAxNzo1NToxMyAgYmpvcm53Ci0qISAqIE1hZGUgSTJDX1VTRVNfUEJfTk9UX1BCX0kyQyBhIENPTkZJRyBvcHRpb24gaW5zdGVhZCBvZiBhc3NpZ25pbmcgaXQKLSohICAgbWFnaWNhbGx5LiBDb25maWcuaW4gbmVlZHMgdG8gc2V0IGl0IGZvciB0aGUgb3B0aW9ucyB0aGF0IG5lZWQgaXQsIGxpa2UKLSohICAgRGFsbGFzIDEzMDIgc3VwcG9ydC4gQWN0dWFsbHksIGl0IHNob3VsZCBiZSBkZWZhdWx0IHNpbmNlIGl0IHNjcmV3cyB1cAotKiEgICB0aGUgUEIgYml0cyBldmVuIGlmIHlvdSBkb24ndCB1c2UgSTJDLi4KLSohICogSW5jbHVkZSBsaW51eC9jb25maWcuaCB0byBnZXQgdGhlIGFib3ZlCi0qIQotKiEgUmV2aXNpb24gMS4yICAyMDAxLzAxLzE4IDE1OjQ5OjMwICBiam9ybncKLSohIDIuNCBwb3J0IG9mIEkyQyBpbmNsdWRpbmcgc29tZSBjbGVhbnVwcyAodW50ZXN0ZWQgb2YgY291cnNlKQotKiEKLSohIFJldmlzaW9uIDEuMSAgMjAwMS8wMS8xOCAxNTozNToyNSAgYmpvcm53Ci0qISBWZXJiYXRpbSBjb3B5IG9mIHRoZSBFdHJheCBpMmMgZHJpdmVyLCAyLjAgZWxpbnV4IHZlcnNpb24KLSohCi0qIQotKiEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIQotKiEgKEMpIENvcHlyaWdodCAxOTk5LTIwMDIgQXhpcyBDb21tdW5pY2F0aW9ucyBBQiwgTFVORCwgU1dFREVOCisqISAoQykgQ29weXJpZ2h0IDE5OTktMjAwNyBBeGlzIENvbW11bmljYXRpb25zIEFCLCBMVU5ELCBTV0VERU4KICohCiAqISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICRJZDogaTJjLmMsdiAxLjEzIDIwMDUvMDMvMDcgMTM6MTM6MDcgc3RhcnZpayBFeHAgJCAqLwogCiAvKioqKioqKioqKioqKioqKioqIElOQ0xVREUgRklMRVMgU0VDVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNjIyLDcgKzU0Niw3IEBACiAJCSAqIGxhc3QgcmVjZWl2ZWQgYnl0ZSBuZWVkcyB0byBiZSBuYWNrZWQKIAkJICogaW5zdGVhZCBvZiBhY2tlZAogCQkgKi8KLQkJaTJjX3NlbmRhY2soKTsKKwkJaTJjX3NlbmRuYWNrKCk7CiAJCS8qCiAJCSAqIGVuZCBzZXF1ZW5jZQogCQkgKi8KQEAgLTcwOCw2ICs2MzIsNyBAQAogCWlmICghZmlyc3QpIHsKIAkJcmV0dXJuIHJlczsKIAl9CisJZmlyc3QgPSAwOwogCiAJLyogU2V0dXAgYW5kIGVuYWJsZSB0aGUgUG9ydCBCIEkyQyBpbnRlcmZhY2UgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvcGNmODU2My5jIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvcGNmODU2My5jCmluZGV4IGMyNjNiODIuLjUyMTAzZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL3BjZjg1NjMuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9wY2Y4NTYzLmMKQEAgLTgsMTQgKzgsMTMgQEAKICAqIGxvdyBkZXRlY3RvciBhcmUgYWxzbyBwcm92aWRlZC4gQWxsIGFkZHJlc3MgYW5kIGRhdGEgYXJlIHRyYW5zZmVycmVkCiAgKiBzZXJpYWxseSB2aWEgdHdvLWxpbmUgYmlkaXJlY3Rpb25hbCBJMkMtYnVzLiBNYXhpbXVtIGJ1cyBzcGVlZCBpcwogICogNDAwIGtiaXRzL3MuIFRoZSBidWlsdC1pbiB3b3JkIGFkZHJlc3MgcmVnaXN0ZXIgaXMgaW5jcmVtZW50ZWQKLSAqIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgZWFjaCB3cml0dGVuIG9yIHJlYWQgYnV0ZS4KKyAqIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgZWFjaCB3cml0dGVuIG9yIHJlYWQgYnl0ZS4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA3LCBBeGlzIENvbW11bmljYXRpb25zIEFCCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIEF1dGhvcjogVG9iaWFzIEFuZGVyYmVyZyA8dG9iaWFzYUBheGlzLmNvbT4uCiAgKgotICogJElkOiBwY2Y4NTYzLmMsdiAxLjExIDIwMDUvMDMvMDcgMTM6MTM6MDcgc3RhcnZpayBFeHAgJAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTI3LDE5ICsyNiwxOSBAQAogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9iY2QuaD4KLSNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL3N2aW50by5oPgogI2luY2x1ZGUgPGFzbS9ydGMuaD4KKwogI2luY2x1ZGUgImkyYy5oIgogCi0jZGVmaW5lIFBDRjg1NjNfTUFKT1IgMTIxCQkvKiBMb2NhbCBtYWpvciBudW1iZXIuICovCi0jZGVmaW5lIERFVklDRV9OQU1FICJydGMiCQkvKiBOYW1lIHdoaWNoIGlzIHJlZ2lzdGVyZWQgaW4gL3Byb2MvZGV2aWNlcy4gKi8KKyNkZWZpbmUgUENGODU2M19NQUpPUiAxMjEJLyogTG9jYWwgbWFqb3IgbnVtYmVyLiAqLworI2RlZmluZSBERVZJQ0VfTkFNRSAicnRjIgkvKiBOYW1lIHdoaWNoIGlzIHJlZ2lzdGVyZWQgaW4gL3Byb2MvZGV2aWNlcy4gKi8KICNkZWZpbmUgUENGODU2M19OQU1FICJQQ0Y4NTYzIgotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiJFJldmlzaW9uOiAxLjExICQiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIkUmV2aXNpb246IDEuMjQgJCIKIAogLyogSTJDIGJ1cyBzbGF2ZSByZWdpc3RlcnMuICovCiAjZGVmaW5lIFJUQ19JMkNfUkVBRAkJMHhhMwpAQCAtNDksNzEgKzQ4LDg4IEBACiAjZGVmaW5lIHJ0Y19yZWFkKHgpIGkyY19yZWFkcmVnKFJUQ19JMkNfUkVBRCwgeCkKICNkZWZpbmUgcnRjX3dyaXRlKHgseSkgaTJjX3dyaXRlcmVnKFJUQ19JMkNfV1JJVEUsIHgsIHkpCiAKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0socnRjX2xvY2spOyAvKiBQcm90ZWN0IHN0YXRlIGV0YyAqLwotCQorc3RhdGljIERFRklORV9NVVRFWChydGNfbG9jayk7IC8qIFByb3RlY3Qgc3RhdGUgZXRjICovCisKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRheXNfaW5fbW9udGhbXSA9CiAJeyAwLCAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxIH07CiAKIGludCBwY2Y4NTYzX2lvY3RsKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwogCisvKiBDYWNoZSBWTCBiaXQgdmFsdWUgcmVhZCBhdCBkcml2ZXIgaW5pdCBzaW5jZSB3cml0aW5nIHRoZSBSVENfU0VDT05ECisgKiByZWdpc3RlciBjbGVhcnMgdGhlIFZMIHN0YXR1cy4KKyAqLworc3RhdGljIGludCB2b2x0YWdlX2xvdzsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcGNmODU2M19mb3BzID0gewogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5pb2N0bCA9IHBjZjg1NjNfaW9jdGwsCiB9OwogCiB1bnNpZ25lZCBjaGFyCi1wY2Y4NTYzX3JlYWRyZWcoaW50IHJlZykgCitwY2Y4NTYzX3JlYWRyZWcoaW50IHJlZykKIHsKLQl1bnNpZ25lZCBjaGFyIHJlcyA9IGkyY19yZWFkcmVnKFJUQ19JMkNfUkVBRCwgcmVnKTsKKwl1bnNpZ25lZCBjaGFyIHJlcyA9IHJ0Y19yZWFkKHJlZyk7CiAKLQkvKiBUaGUgUENGODU2MyBkb2VzIG5vdCByZXR1cm4gMCBmb3IgdW5pbXBsZW1lbnRlZCBiaXRzICovCi0Jc3dpdGNoKHJlZykKLQl7Ci0JCWNhc2UgUlRDX1NFQ09ORFM6Ci0JCWNhc2UgUlRDX01JTlVURVM6Ci0JCSAgICAgcmVzICY9IDB4N2Y7Ci0JCSAgICAgYnJlYWs7Ci0JCWNhc2UgUlRDX0hPVVJTOgotCQljYXNlIFJUQ19EQVlfT0ZfTU9OVEg6Ci0JCSAgICAgcmVzICY9IDB4M2Y7Ci0JCSAgICAgYnJlYWs7Ci0JCWNhc2UgUlRDX01PTlRIOgotCQkgICAgIHJlcyA9IChyZXMgJiAweDFmKSAtIDE7ICAvKiBQQ0Y4NTYzIHJldHVybnMgbW9udGggaW4gcmFuZ2UgMS0xMiAqLwotCQkgICAgIGJyZWFrOworCS8qIFRoZSBQQ0Y4NTYzIGRvZXMgbm90IHJldHVybiAwIGZvciB1bmltcGxlbWVudGVkIGJpdHMuICovCisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFJUQ19TRUNPTkRTOgorCWNhc2UgUlRDX01JTlVURVM6CisJCXJlcyAmPSAweDdGOworCQlicmVhazsKKwljYXNlIFJUQ19IT1VSUzoKKwljYXNlIFJUQ19EQVlfT0ZfTU9OVEg6CisJCXJlcyAmPSAweDNGOworCQlicmVhazsKKwljYXNlIFJUQ19XRUVLREFZOgorCQlyZXMgJj0gMHgwNzsKKwkJYnJlYWs7CisJY2FzZSBSVENfTU9OVEg6CisJCXJlcyAmPSAweDFGOworCQlicmVhazsKKwljYXNlIFJUQ19DT05UUk9MMToKKwkJcmVzICY9IDB4QTg7CisJCWJyZWFrOworCWNhc2UgUlRDX0NPTlRST0wyOgorCQlyZXMgJj0gMHgxRjsKKwkJYnJlYWs7CisJY2FzZSBSVENfQ0xPQ0tPVVRfRlJFUToKKwljYXNlIFJUQ19USU1FUl9DT05UUk9MOgorCQlyZXMgJj0gMHg4MzsKKwkJYnJlYWs7CiAJfQogCXJldHVybiByZXM7CiB9CiAKIHZvaWQKLXBjZjg1NjNfd3JpdGVyZWcoaW50IHJlZywgdW5zaWduZWQgY2hhciB2YWwpIAorcGNmODU2M193cml0ZXJlZyhpbnQgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCkKIHsKLSNpZmRlZiBDT05GSUdfRVRSQVhfUlRDX1JFQURPTkxZCi0JaWYgKHJlZyA9PSBSVENfQ09OVFJPTDEgfHwgKHJlZyA+PSBSVENfU0VDT05EUyAmJiByZWcgPD0gUlRDX1lFQVIpKQotCQlyZXR1cm47Ci0jZW5kaWYKLQogCXJ0Y193cml0ZShyZWcsIHZhbCk7CiB9CiAKIHZvaWQKIGdldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRtKQogewotCXRtLT50bV9zZWMgPSBydGNfcmVhZChSVENfU0VDT05EUyk7Ci0JdG0tPnRtX21pbiA9IHJ0Y19yZWFkKFJUQ19NSU5VVEVTKTsKKwl0bS0+dG1fc2VjICA9IHJ0Y19yZWFkKFJUQ19TRUNPTkRTKTsKKwl0bS0+dG1fbWluICA9IHJ0Y19yZWFkKFJUQ19NSU5VVEVTKTsKIAl0bS0+dG1faG91ciA9IHJ0Y19yZWFkKFJUQ19IT1VSUyk7CiAJdG0tPnRtX21kYXkgPSBydGNfcmVhZChSVENfREFZX09GX01PTlRIKTsKLQl0bS0+dG1fbW9uID0gcnRjX3JlYWQoUlRDX01PTlRIKTsKKwl0bS0+dG1fd2RheSA9IHJ0Y19yZWFkKFJUQ19XRUVLREFZKTsKKwl0bS0+dG1fbW9uICA9IHJ0Y19yZWFkKFJUQ19NT05USCk7CiAJdG0tPnRtX3llYXIgPSBydGNfcmVhZChSVENfWUVBUik7CiAKLQlpZiAodG0tPnRtX3NlYyAmIDB4ODApCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSVEMgTG93IFZvbHRhZ2UgLSBkYXRlL3RpbWUgaXMgbm90IHJlbGlhYmxlIVxuIiwgUENGODU2M19OQU1FKTsKKwlpZiAodG0tPnRtX3NlYyAmIDB4ODApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUlRDIFZvbHRhZ2UgTG93IC0gcmVsaWFibGUgZGF0ZS90aW1lICIKKwkJICAgICAgICJpbmZvcm1hdGlvbiBpcyBubyBsb25nZXIgZ3VhcmFudGVlZCFcbiIsIFBDRjg1NjNfTkFNRSk7CisJfQogCi0JdG0tPnRtX3llYXIgPSBCQ0RfVE9fQklOKHRtLT50bV95ZWFyKSArICgodG0tPnRtX21vbiAmIDB4ODApID8gMTAwIDogMCk7Ci0JdG0tPnRtX3NlYyAmPSAweDdmOwotCXRtLT50bV9taW4gJj0gMHg3ZjsKLQl0bS0+dG1faG91ciAmPSAweDNmOwotCXRtLT50bV9tZGF5ICY9IDB4M2Y7Ci0JdG0tPnRtX21vbiAmPSAweDFmOworCXRtLT50bV95ZWFyICA9IEJDRF9UT19CSU4odG0tPnRtX3llYXIpICsKKwkJICAgICAgICgodG0tPnRtX21vbiAmIDB4ODApID8gMTAwIDogMCk7CisJdG0tPnRtX3NlYyAgJj0gMHg3RjsKKwl0bS0+dG1fbWluICAmPSAweDdGOworCXRtLT50bV9ob3VyICY9IDB4M0Y7CisJdG0tPnRtX21kYXkgJj0gMHgzRjsKKwl0bS0+dG1fd2RheSAmPSAweDA3OyAvKiBOb3QgY29kZWQgaW4gQkNELiAqLworCXRtLT50bV9tb24gICY9IDB4MUY7CiAKIAlCQ0RfVE9fQklOKHRtLT50bV9zZWMpOwogCUJDRF9UT19CSU4odG0tPnRtX21pbik7CkBAIC0xMjYsMTcgKzE0MiwyNCBAQAogaW50IF9faW5pdAogcGNmODU2M19pbml0KHZvaWQpCiB7Ci0JaW50IHJldDsKKwlzdGF0aWMgaW50IHJlczsKKwlzdGF0aWMgaW50IGZpcnN0ID0gMTsKIAotCWlmICgocmV0ID0gaTJjX2luaXQoKSkpIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAicGNmODU2M19pbml0OiBmYWlsZWQgdG8gaW5pdCBpMmNcbiIpOwotCQlyZXR1cm4gcmV0OworCWlmICghZmlyc3QpCisJCXJldHVybiByZXM7CisJZmlyc3QgPSAwOworCisJLyogSW5pdGlhdGUgdGhlIGkyYyBwcm90b2NvbC4gKi8KKwlyZXMgPSBpMmNfaW5pdCgpOworCWlmIChyZXMgPCAwKSB7CisJCXByaW50ayhLRVJOX0NSSVQgInBjZjg1NjNfaW5pdDogRmFpbGVkIHRvIGluaXQgaTJjLlxuIik7CisJCXJldHVybiByZXM7CiAJfQogCiAJLyoKIAkgKiBGaXJzdCBvZiBhbGwgd2UgbmVlZCB0byByZXNldCB0aGUgY2hpcC4gVGhpcyBpcyBkb25lIGJ5Ci0JICogY2xlYXJpbmcgY29udHJvbDEsIGNvbnRyb2wyIGFuZCBjbGsgZnJlcSwgY2xlYXIgdGhlIAotCSAqIFZvbHRhZ2UgTG93IGJpdCwgYW5kIHJlc2V0dGluZyBhbGwgYWxhcm1zLgorCSAqIGNsZWFyaW5nIGNvbnRyb2wxLCBjb250cm9sMiBhbmQgY2xrIGZyZXEgYW5kIHJlc2V0dGluZworCSAqIGFsbCBhbGFybXMuCiAJICovCiAJaWYgKHJ0Y193cml0ZShSVENfQ09OVFJPTDEsIDB4MDApIDwgMCkKIAkJZ290byBlcnI7CkBAIC0xNDcsMzQgKzE3MCwzNiBAQAogCWlmIChydGNfd3JpdGUoUlRDX0NMT0NLT1VUX0ZSRVEsIDB4MDApIDwgMCkKIAkJZ290byBlcnI7CiAKLQkvKiBDbGVhciB0aGUgVkwgYml0IGluIHRoZSBzZWNvbmRzIHJlZ2lzdGVyLiAqLwotCXJldCA9IHJ0Y19yZWFkKFJUQ19TRUNPTkRTKTsKLQkKLQlpZiAocnRjX3dyaXRlKFJUQ19TRUNPTkRTLCAocmV0ICYgMHg3ZikpIDwgMCkKKwlpZiAocnRjX3dyaXRlKFJUQ19USU1FUl9DT05UUk9MLCAweDAzKSA8IDApCiAJCWdvdG8gZXJyOwotCQkKKwogCS8qIFJlc2V0IHRoZSBhbGFybXMuICovCi0JaWYgKHJ0Y193cml0ZShSVENfTUlOVVRFX0FMQVJNLCAweDAwKSA8IDApCisJaWYgKHJ0Y193cml0ZShSVENfTUlOVVRFX0FMQVJNLCAweDgwKSA8IDApCiAJCWdvdG8gZXJyOwotCQotCWlmIChydGNfd3JpdGUoUlRDX0hPVVJfQUxBUk0sIDB4MDApIDwgMCkKKworCWlmIChydGNfd3JpdGUoUlRDX0hPVVJfQUxBUk0sIDB4ODApIDwgMCkKIAkJZ290byBlcnI7Ci0JCi0JaWYgKHJ0Y193cml0ZShSVENfREFZX0FMQVJNLCAweDAwKSA8IDApCisKKwlpZiAocnRjX3dyaXRlKFJUQ19EQVlfQUxBUk0sIDB4ODApIDwgMCkKIAkJZ290byBlcnI7Ci0JCi0JaWYgKHJ0Y193cml0ZShSVENfV0VFS0RBWV9BTEFSTSwgMHgwMCkgPCAwKQorCisJaWYgKHJ0Y193cml0ZShSVENfV0VFS0RBWV9BTEFSTSwgMHg4MCkgPCAwKQogCQlnb3RvIGVycjsKLSAgICAgICAgCi0JLyogQ2hlY2sgZm9yIGxvdyB2b2x0YWdlLCBhbmQgd2FybiBhYm91dCBpdC4uICovCi0JaWYgKHJ0Y19yZWFkKFJUQ19TRUNPTkRTKSAmIDB4ODApCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSVEMgTG93IFZvbHRhZ2UgLSBkYXRlL3RpbWUgaXMgbm90IHJlbGlhYmxlIVxuIiwgUENGODU2M19OQU1FKTsKLQkKLQlyZXR1cm4gMDsKKworCS8qIENoZWNrIGZvciBsb3cgdm9sdGFnZSwgYW5kIHdhcm4gYWJvdXQgaXQuICovCisJaWYgKHJ0Y19yZWFkKFJUQ19TRUNPTkRTKSAmIDB4ODApIHsKKwkJdm9sdGFnZV9sb3cgPSAxOworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUlRDIFZvbHRhZ2UgTG93IC0gcmVsaWFibGUgIgorCQkgICAgICAgImRhdGUvdGltZSBpbmZvcm1hdGlvbiBpcyBubyBsb25nZXIgZ3VhcmFudGVlZCFcbiIsCisJCSAgICAgICBQQ0Y4NTYzX05BTUUpOworCX0KKworCXJldHVybiByZXM7CiAKIGVycjoKIAlwcmludGsoS0VSTl9JTkZPICIlczogRXJyb3IgaW5pdGlhbGl6aW5nIGNoaXAuXG4iLCBQQ0Y4NTYzX05BTUUpOwotCXJldHVybiAtMTsKKwlyZXMgPSAtMTsKKwlyZXR1cm4gcmVzOwogfQogCiB2b2lkIF9fZXhpdApAQCAtMTg3LDggKzIxMiw4IEBACiAgKiBpb2N0bCBjYWxscyBmb3IgdGhpcyBkcml2ZXIuIFdoeSByZXR1cm4gLUVOT1RUWSB1cG9uIGVycm9yPyBCZWNhdXNlCiAgKiBQT1NJWCBzYXlzIHNvIQogICovCi1pbnQKLXBjZjg1NjNfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoraW50IHBjZjg1NjNfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJLyogU29tZSBzYW5pdHkgY2hlY2tzLiAqLwogCWlmIChfSU9DX1RZUEUoY21kKSAhPSBSVENfTUFHSUMpCkBAIC0xOTgsMTI0ICsyMjMsMTQ2IEBACiAJCXJldHVybiAtRU5PVFRZOwogCiAJc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBSVENfUkRfVElNRToKLQkJCXsKLQkJCQlzdHJ1Y3QgcnRjX3RpbWUgdG07CisJY2FzZSBSVENfUkRfVElNRToKKwl7CisJCXN0cnVjdCBydGNfdGltZSB0bTsKIAotCQkJCXNwaW5fbG9jaygmcnRjX2xvY2spOwotCQkJCWdldF9ydGNfdGltZSgmdG0pOworCQltdXRleF9sb2NrKCZydGNfbG9jayk7CisJCW1lbXNldCgmdG0sIDAsIHNpemVvZiB0bSk7CisJCWdldF9ydGNfdGltZSgmdG0pOwogCi0JCQkJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IHJ0Y190aW1lICopIGFyZywgJnRtLCBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSkpIHsKLQkJCQkJc3Bpbl91bmxvY2soJnJ0Y19sb2NrKTsKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCi0JCQkJc3Bpbl91bmxvY2soJnJ0Y19sb2NrKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFJUQ19TRVRfVElNRToKLQkJCXsKLSNpZmRlZiBDT05GSUdfRVRSQVhfUlRDX1JFQURPTkxZCi0JCQkJcmV0dXJuIC1FUEVSTTsKLSNlbHNlCi0JCQkJaW50IGxlYXA7Ci0JCQkJaW50IGNlbnR1cnk7Ci0JCQkJc3RydWN0IHJ0Y190aW1lIHRtOwotCi0JCQkJbWVtc2V0KCZ0bSwgMCwgc2l6ZW9mIChzdHJ1Y3QgcnRjX3RpbWUpKTsKLQkJCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19USU1FKSkKLQkJCQkJcmV0dXJuIC1FUEVSTTsKLQotCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmdG0sIChzdHJ1Y3QgcnRjX3RpbWUgKikgYXJnLCBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCi0JCQkJLyogQ29udmVydCBmcm9tIHN0cnVjdCB0bSB0byBzdHJ1Y3QgcnRjX3RpbWUuICovCi0JCQkJdG0udG1feWVhciArPSAxOTAwOwotCQkJCXRtLnRtX21vbiArPSAxOwotCQkJCQotCQkJCWxlYXAgPSAoKHRtLnRtX21vbiA9PSAyKSAmJiAoKHRtLnRtX3llYXIgJSA0KSA9PSAwKSkgPyAxIDogMDsKLQotCQkJCS8qIFBlcmZvcm0gc29tZSBzYW5pdHkgY2hlY2tzLiAqLwotCQkJCWlmICgodG0udG1feWVhciA8IDE5NzApIHx8Ci0JCQkJICAgICh0bS50bV9tb24gPiAxMikgfHwKLQkJCQkgICAgKHRtLnRtX21kYXkgPT0gMCkgfHwKLQkJCQkgICAgKHRtLnRtX21kYXkgPiBkYXlzX2luX21vbnRoW3RtLnRtX21vbl0gKyBsZWFwKSB8fAotCQkJCSAgICAodG0udG1faG91ciA+PSAyNCkgfHwKLQkJCQkgICAgKHRtLnRtX21pbiA+PSA2MCkgfHwKLQkJCQkgICAgKHRtLnRtX3NlYyA+PSA2MCkpCi0JCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQkJY2VudHVyeSA9ICh0bS50bV95ZWFyID49IDIwMDApID8gMHg4MCA6IDA7Ci0JCQkJdG0udG1feWVhciA9IHRtLnRtX3llYXIgJSAxMDA7Ci0KLQkJCQlCSU5fVE9fQkNEKHRtLnRtX3llYXIpOwotCQkJCUJJTl9UT19CQ0QodG0udG1fbWRheSk7Ci0JCQkJQklOX1RPX0JDRCh0bS50bV9ob3VyKTsKLQkJCQlCSU5fVE9fQkNEKHRtLnRtX21pbik7Ci0JCQkJQklOX1RPX0JDRCh0bS50bV9zZWMpOwotCQkJCXRtLnRtX21vbiB8PSBjZW50dXJ5OwotCi0JCQkJc3Bpbl9sb2NrKCZydGNfbG9jayk7Ci0JCQkJCi0JCQkJcnRjX3dyaXRlKFJUQ19ZRUFSLCB0bS50bV95ZWFyKTsKLQkJCQlydGNfd3JpdGUoUlRDX01PTlRILCB0bS50bV9tb24pOwotCQkJCXJ0Y193cml0ZShSVENfREFZX09GX01PTlRILCB0bS50bV9tZGF5KTsKLQkJCQlydGNfd3JpdGUoUlRDX0hPVVJTLCB0bS50bV9ob3VyKTsKLQkJCQlydGNfd3JpdGUoUlRDX01JTlVURVMsIHRtLnRtX21pbik7Ci0JCQkJcnRjX3dyaXRlKFJUQ19TRUNPTkRTLCB0bS50bV9zZWMpOwotCi0JCQkJc3Bpbl91bmxvY2soJnJ0Y19sb2NrKTsKLQotCQkJCXJldHVybiAwOwotI2VuZGlmIC8qICFDT05GSUdfRVRSQVhfUlRDX1JFQURPTkxZICovCi0JCQl9Ci0KLQkJY2FzZSBSVENfVkxPV19SRDoKLQkJewotCQkJaW50IHZsX2JpdCA9IDA7Ci0KLQkJCWlmIChydGNfcmVhZChSVENfU0VDT05EUykgJiAweDgwKSB7Ci0JCQkJdmxfYml0ID0gMTsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUlRDIFZvbHRhZ2UgTG93IC0gcmVsaWFibGUgIgotCQkJCSAgICAgICAiZGF0ZS90aW1lIGluZm9ybWF0aW9uIGlzIG5vIGxvbmdlciBndWFyYW50ZWVkIVxuIiwKLQkJCQkgICAgICAgUENGODU2M19OQU1FKTsKLQkJCX0KLQkJCWlmIChjb3B5X3RvX3VzZXIoKGludCAqKSBhcmcsICZ2bF9iaXQsIHNpemVvZihpbnQpKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkJcmV0dXJuIDA7CisJCWlmIChjb3B5X3RvX3VzZXIoKHN0cnVjdCBydGNfdGltZSAqKSBhcmcsICZ0bSwKKwkJCQkgc2l6ZW9mIHRtKSkgeworCQkJc3Bpbl91bmxvY2soJnJ0Y19sb2NrKTsKKwkJCXJldHVybiAtRUZBVUxUOwogCQl9CiAKLQkJY2FzZSBSVENfVkxPV19TRVQ6Ci0JCXsKLQkJCS8qIENsZWFyIHRoZSBWTCBiaXQgaW4gdGhlIHNlY29uZHMgcmVnaXN0ZXIgKi8KLQkJCWludCByZXQgPSBydGNfcmVhZChSVENfU0VDT05EUyk7CisJCW11dGV4X3VubG9jaygmcnRjX2xvY2spOwogCi0JCQlydGNfd3JpdGUoUlRDX1NFQ09ORFMsIChyZXQgJiAweDdGKSk7CisJCXJldHVybiAwOworCX0KKwljYXNlIFJUQ19TRVRfVElNRToKKwl7CisJCWludCBsZWFwOworCQlpbnQgeWVhcjsKKwkJaW50IGNlbnR1cnk7CisJCXN0cnVjdCBydGNfdGltZSB0bTsKIAotCQkJcmV0dXJuIDA7CisJCW1lbXNldCgmdG0sIDAsIHNpemVvZiB0bSk7CisJCWlmICghY2FwYWJsZShDQVBfU1lTX1RJTUUpKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnRtLCAoc3RydWN0IHJ0Y190aW1lICopIGFyZywgc2l6ZW9mIHRtKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCS8qIENvbnZlcnQgZnJvbSBzdHJ1Y3QgdG0gdG8gc3RydWN0IHJ0Y190aW1lLiAqLworCQl0bS50bV95ZWFyICs9IDE5MDA7CisJCXRtLnRtX21vbiArPSAxOworCisJCS8qCisJCSAqIENoZWNrIGlmIHRtLnRtX3llYXIgaXMgYSBsZWFwIHllYXIuIEEgeWVhciBpcyBhIGxlYXAKKwkJICogeWVhciBpZiBpdCBpcyBkaXZpc2libGUgYnkgNCBidXQgbm90IDEwMCwgZXhjZXB0CisJCSAqIHRoYXQgeWVhcnMgZGl2aXNpYmxlIGJ5IDQwMCBfYXJlXyBsZWFwIHllYXJzLgorCQkgKi8KKwkJeWVhciA9IHRtLnRtX3llYXI7CisJCWxlYXAgPSAodG0udG1fbW9uID09IDIpICYmCisJCQkoKHllYXIgJSA0ID09IDAgJiYgeWVhciAlIDEwMCAhPSAwKSB8fCB5ZWFyICUgNDAwID09IDApOworCisJCS8qIFBlcmZvcm0gc29tZSBzYW5pdHkgY2hlY2tzLiAqLworCQlpZiAoKHRtLnRtX3llYXIgPCAxOTcwKSB8fAorCQkgICAgKHRtLnRtX21vbiA+IDEyKSB8fAorCQkgICAgKHRtLnRtX21kYXkgPT0gMCkgfHwKKwkJICAgICh0bS50bV9tZGF5ID4gZGF5c19pbl9tb250aFt0bS50bV9tb25dICsgbGVhcCkgfHwKKwkJICAgICh0bS50bV93ZGF5ID49IDcpIHx8CisJCSAgICAodG0udG1faG91ciA+PSAyNCkgfHwKKwkJICAgICh0bS50bV9taW4gPj0gNjApIHx8CisJCSAgICAodG0udG1fc2VjID49IDYwKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWNlbnR1cnkgPSAodG0udG1feWVhciA+PSAyMDAwKSA/IDB4ODAgOiAwOworCQl0bS50bV95ZWFyID0gdG0udG1feWVhciAlIDEwMDsKKworCQlCSU5fVE9fQkNEKHRtLnRtX3llYXIpOworCQlCSU5fVE9fQkNEKHRtLnRtX21vbik7CisJCUJJTl9UT19CQ0QodG0udG1fbWRheSk7CisJCUJJTl9UT19CQ0QodG0udG1faG91cik7CisJCUJJTl9UT19CQ0QodG0udG1fbWluKTsKKwkJQklOX1RPX0JDRCh0bS50bV9zZWMpOworCQl0bS50bV9tb24gfD0gY2VudHVyeTsKKworCQltdXRleF9sb2NrKCZydGNfbG9jayk7CisKKwkJcnRjX3dyaXRlKFJUQ19ZRUFSLCB0bS50bV95ZWFyKTsKKwkJcnRjX3dyaXRlKFJUQ19NT05USCwgdG0udG1fbW9uKTsKKwkJcnRjX3dyaXRlKFJUQ19XRUVLREFZLCB0bS50bV93ZGF5KTsgLyogTm90IGNvZGVkIGluIEJDRC4gKi8KKwkJcnRjX3dyaXRlKFJUQ19EQVlfT0ZfTU9OVEgsIHRtLnRtX21kYXkpOworCQlydGNfd3JpdGUoUlRDX0hPVVJTLCB0bS50bV9ob3VyKTsKKwkJcnRjX3dyaXRlKFJUQ19NSU5VVEVTLCB0bS50bV9taW4pOworCQlydGNfd3JpdGUoUlRDX1NFQ09ORFMsIHRtLnRtX3NlYyk7CisKKwkJbXV0ZXhfdW5sb2NrKCZydGNfbG9jayk7CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgUlRDX1ZMX1JFQUQ6CisJCWlmICh2b2x0YWdlX2xvdykgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogUlRDIFZvbHRhZ2UgTG93IC0gIgorCQkJICAgICAgICJyZWxpYWJsZSBkYXRlL3RpbWUgaW5mb3JtYXRpb24gaXMgbm8gIgorCQkJICAgICAgICJsb25nZXIgZ3VhcmFudGVlZCFcbiIsIFBDRjg1NjNfTkFNRSk7CiAJCX0KIAotCQlkZWZhdWx0OgotCQkJCXJldHVybiAtRU5PVFRZOworCQlpZiAoY29weV90b191c2VyKChpbnQgKikgYXJnLCAmdm9sdGFnZV9sb3csIHNpemVvZihpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgUlRDX1ZMX0NMUjoKKwl7CisJCS8qIENsZWFyIHRoZSBWTCBiaXQgaW4gdGhlIHNlY29uZHMgcmVnaXN0ZXIgaW4gY2FzZQorCQkgKiB0aGUgdGltZSBoYXMgbm90IGJlZW4gc2V0IGFscmVhZHkgKHdoaWNoIHdvdWxkCisJCSAqIGhhdmUgY2xlYXJlZCBpdCkuIFRoaXMgZG9lcyBub3QgcmVhbGx5IG1hdHRlcgorCQkgKiBiZWNhdXNlIG9mIHRoZSBjYWNoZWQgdm9sdGFnZV9sb3cgdmFsdWUgYnV0IGRvIGl0CisJCSAqIGFueXdheSBmb3IgY29uc2lzdGVuY3kuICovCisKKwkJaW50IHJldCA9IHJ0Y19yZWFkKFJUQ19TRUNPTkRTKTsKKworCQlydGNfd3JpdGUoUlRDX1NFQ09ORFMsIChyZXQgJiAweDdGKSk7CisKKwkJLyogQ2xlYXIgdGhlIGNhY2hlZCB2YWx1ZS4gKi8KKwkJdm9sdGFnZV9sb3cgPSAwOworCisJCXJldHVybiAwOworCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RUWTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2luaXQKLXBjZjg1NjNfcmVnaXN0ZXIodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHBjZjg1NjNfcmVnaXN0ZXIodm9pZCkKIHsKLQlwY2Y4NTYzX2luaXQoKTsKKwlpZiAocGNmODU2M19pbml0KCkgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbmFibGUgdG8gaW5pdGlhbGl6ZSBSZWFsLVRpbWUgQ2xvY2sgIgorCQkgICAgICAgIkRyaXZlciwgJXNcbiIsIFBDRjg1NjNfTkFNRSwgRFJJVkVSX1ZFUlNJT04pOworCQlyZXR1cm4gLTE7CisJfQorCiAJaWYgKHJlZ2lzdGVyX2NocmRldihQQ0Y4NTYzX01BSk9SLCBERVZJQ0VfTkFNRSwgJnBjZjg1NjNfZm9wcykgPCAwKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbmFibGUgdG8gZ2V0IG1ham9yIG51bWJlciAlZCBmb3IgUlRDIGRldmljZS5cbiIsCiAJCSAgICAgICBQQ0Y4NTYzX05BTUUsIFBDRjg1NjNfTUFKT1IpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXMgUmVhbC1UaW1lIENsb2NrIERyaXZlciwgJXNcbiIsIFBDRjg1NjNfTkFNRSwgRFJJVkVSX1ZFUlNJT04pOwotICAgICAgICByZXR1cm4gMDsKKwlwcmludGsoS0VSTl9JTkZPICIlcyBSZWFsLVRpbWUgQ2xvY2sgRHJpdmVyLCAlc1xuIiwgUENGODU2M19OQU1FLAorCSAgICAgICBEUklWRVJfVkVSU0lPTik7CisKKwkvKiBDaGVjayBmb3IgbG93IHZvbHRhZ2UsIGFuZCB3YXJuIGFib3V0IGl0LiAqLworCWlmICh2b2x0YWdlX2xvdykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUlRDIFZvbHRhZ2UgTG93IC0gcmVsaWFibGUgZGF0ZS90aW1lICIKKwkJICAgICAgICJpbmZvcm1hdGlvbiBpcyBubyBsb25nZXIgZ3VhcmFudGVlZCFcbiIsIFBDRjg1NjNfTkFNRSk7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIG1vZHVsZV9pbml0KHBjZjg1NjNfcmVnaXN0ZXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvc3luY19zZXJpYWwuYyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL3N5bmNfc2VyaWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY5NTQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL3N5bmNfc2VyaWFsLmMKQEAgLTAsMCArMSwxNDQxIEBACisvKgorICogU2ltcGxlIHN5bmNocm9ub3VzIHNlcmlhbCBwb3J0IGRyaXZlciBmb3IgRVRSQVggMTAwTFguCisgKgorICogU3luY2hyb25vdXMgc2VyaWFsIHBvcnRzIGFyZSB1c2VkIGZvciBjb250aW51b3VzIHN0cmVhbWVkIGRhdGEgbGlrZSBhdWRpby4KKyAqIFRoZSBkZWZhdWx0IHNldHRpbmcgZm9yIHRoaXMgZHJpdmVyIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgU1RBIDAxMyBNUDMKKyAqIGRlY29kZXIuIFRoZSBkcml2ZXIgY2FuIGVhc2lseSBiZSB0dW5lZCB0byBmaXQgb3RoZXIgYXVkaW8gZW5jb2Rlci9kZWNvZGVycworICogYW5kIFNQSQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA4IEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIKKyAqCisgKiBBdXRob3I6IE1pa2FlbCBTdGFydmlrLCBKb2hhbiBBZG9sZnNzb24KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zdmludG8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vc3luY19zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9pb19pbnRlcmZhY2VfbXV4Lmg+CisKKy8qIFRoZSByZWNlaXZlciBpcyBhIGJpdCB0cmlja3kgYmVhY3VzZSBvZiB0aGUgY29udGludW91cyBzdHJlYW0gb2YgZGF0YS4qLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaHJlZSBETUEgZGVzY3JpcHRvcnMgYXJlIGxpbmtlZCB0b2dldGhlci4gRWFjaCBETUEgZGVzY3JpcHRvciBpcyAgICAgKi8KKy8qIHJlc3BvbnNpYmxlIGZvciBwb3J0LT5idWZjaHVuayBvZiBhIGNvbW1vbiBidWZmZXIuICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHwgICArLS0tLS0tLS0tLSsgICArLS0tLS0tLS0tLSsgICArLS0tLS0tLS0tLSsgfCAgICAgICAgICAgICAgICAgICAgICAqLworLyogKy0+IHwgRGVzY3JbMF0gfC0tPnwgRGVzY3JbMV0gfC0tPnwgRGVzY3JbMl0gfC0rICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgKy0tLS0tLS0tLS0rICAgKy0tLS0tLS0tLS0rICAgKy0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICB2ICAgICAgICAgICAgdiAgICAgICAgICAgICAgdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgfCAgICAgICAgQlVGRkVSICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHw8LSBkYXRhX2F2YWlsIC0+fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHJlYWRwICAgICAgICAgIHdyaXRlcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBJZiB0aGUgYXBwbGljYXRpb24ga2VlcHMgdXAgdGhlIHBhY2UgcmVhZHAgd2lsbCBiZSByaWdodCBhZnRlciB3cml0ZXAuKi8KKy8qIElmIHRoZSBhcHBsaWNhdGlvbiBjYW4ndCBrZWVwIHRoZSBwYWNlIHdlIGhhdmUgdG8gdGhyb3cgYXdheSBkYXRhLiAgICAqLworLyogVGhlIGlkZWEgaXMgdGhhdCByZWFkcCBzaG91bGQgYmUgcmVhZHkgd2l0aCB0aGUgZGF0YSBwb2ludGVkIG91dCBieQkgKi8KKy8qIERlc2NyW2ldIHdoZW4gdGhlIERNQSBoYXMgZmlsbGVkIGluIERlc2NyW2krMV0uICAgICAgICAgICAgICAgICAgICAgICAqLworLyogT3RoZXJ3aXNlIHdlIHdpbGwgZGlzY2FyZAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiB0aGUgcmVzdCBvZiB0aGUgZGF0YSBwb2ludGVkIG91dCBieSBEZXNjcjEgYW5kIHNldCByZWFkcCB0byB0aGUgc3RhcnQgKi8KKy8qIG9mIERlc2NyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFNZTkNfU0VSSUFMX01BSk9SIDEyNQorCisvKiBJTl9CVUZGRVJfU0laRSBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiA2IHRvIG1ha2Ugc3VyZSB0aGF0IDI0IGJpdCAqLworLyogd29yZHMgY2FuIGJlIGhhbmRsZWQgKi8KKyNkZWZpbmUgSU5fQlVGRkVSX1NJWkUgMTIyODgKKyNkZWZpbmUgSU5fREVTQ1JfU0laRSAyNTYKKyNkZWZpbmUgTlVNX0lOX0RFU0NSIChJTl9CVUZGRVJfU0laRS9JTl9ERVNDUl9TSVpFKQorI2RlZmluZSBPVVRfQlVGRkVSX1NJWkUgNDA5NgorCisjZGVmaW5lIERFRkFVTFRfRlJBTUVfUkFURSAwCisjZGVmaW5lIERFRkFVTFRfV09SRF9SQVRFIDcKKworLyogTk9URTogRW5hYmxpbmcgc29tZSBkZWJ1ZyB3aWxsIGxpa2VseSBjYXVzZSBvdmVycnVuIG9yIHVuZGVycnVuLAorICogZXNwZWNpYWxseSBpZiBtYW51YWwgbW9kZSBpcyB1c2UuCisgKi8KKyNkZWZpbmUgREVCVUcoeCkKKyNkZWZpbmUgREVCVUdSRUFEKHgpCisjZGVmaW5lIERFQlVHV1JJVEUoeCkKKyNkZWZpbmUgREVCVUdQT0xMKHgpCisjZGVmaW5lIERFQlVHUlhJTlQoeCkKKyNkZWZpbmUgREVCVUdUWElOVCh4KQorCisvKiBEZWZpbmUgc29tZSBtYWNyb3MgdG8gYWNjZXNzIEVUUkFYIDEwMCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU0VURih2YXIsIHJlZywgZmllbGQsIHZhbCkgXAorCWRvIHsgXAorCQl2YXIgPSAodmFyICYgfklPX01BU0tfKHJlZyMjXywgZmllbGQjI18pKSB8IFwKKwkJCUlPX0ZJRUxEXyhyZWcjI18sIGZpZWxkIyNfLCB2YWwpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBTRVRTKHZhciwgcmVnLCBmaWVsZCwgdmFsKSBcCisJZG8geyBcCisJCXZhciA9ICh2YXIgJiB+SU9fTUFTS18ocmVnIyNfLCBmaWVsZCMjXykpIHwgXAorCQkJSU9fU1RBVEVfKHJlZyMjXywgZmllbGQjI18sIF8jI3ZhbCk7IFwKKwl9IHdoaWxlICgwKQorCitzdHJ1Y3Qgc3luY19wb3J0IHsKKwkvKiBFdHJheCByZWdpc3RlcnMgYW5kIGJpdHMqLworCWNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkICpjb25zdCBzdGF0dXM7CisJdm9sYXRpbGUgdW5zaWduZWQgKmNvbnN0IGN0cmxfZGF0YTsKKwl2b2xhdGlsZSB1bnNpZ25lZCAqY29uc3Qgb3V0cHV0X2RtYV9maXJzdDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpjb25zdCBvdXRwdXRfZG1hX2NtZDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpjb25zdCBvdXRwdXRfZG1hX2Nscl9pcnE7CisJdm9sYXRpbGUgdW5zaWduZWQgKmNvbnN0IGlucHV0X2RtYV9maXJzdDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpjb25zdCBpbnB1dF9kbWFfY21kOworCXZvbGF0aWxlIHVuc2lnbmVkICpjb25zdCBpbnB1dF9kbWFfZGVzY3I7CisJLyogOCo0ICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqY29uc3QgaW5wdXRfZG1hX2Nscl9pcnE7CisJdm9sYXRpbGUgdW5zaWduZWQgKmNvbnN0IGRhdGFfb3V0OworCWNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkICpjb25zdCBkYXRhX2luOworCWNoYXIgZGF0YV9hdmFpbF9iaXQ7IC8qIEluIFJfSVJRX01BU0sxX1JEL1NFVC9DTFIgKi8KKwljaGFyIHRyYW5zbWl0dGVyX3JlYWR5X2JpdDsgLyogSW4gUl9JUlFfTUFTSzFfUkQvU0VUL0NMUiAqLworCWNoYXIgaW5wdXRfZG1hX2Rlc2NyX2JpdDsgLyogSW4gUl9JUlFfTUFTSzJfUkQgKi8KKworCWNoYXIgb3V0cHV0X2RtYV9iaXQ7IC8qIEluIFJfSVJRX01BU0syX1JEICovCisJLyogRW5kIG9mIGZpZWxkcyBpbml0aWFsaXNlZCBpbiBhcnJheSAqLworCWNoYXIgc3RhcnRlZDsgLyogMSBpZiBwb3J0IGhhcyBiZWVuIHN0YXJ0ZWQgKi8KKwljaGFyIHBvcnRfbmJyOyAvKiBQb3J0IDAgb3IgMSAqLworCWNoYXIgYnVzeTsgLyogMSBpZiBwb3J0IGlzIGJ1c3kgKi8KKworCWNoYXIgZW5hYmxlZDsgIC8qIDEgaWYgcG9ydCBpcyBlbmFibGVkICovCisJY2hhciB1c2VfZG1hOyAgLyogMSBpZiBwb3J0IHVzZXMgZG1hICovCisJY2hhciB0cl9ydW5uaW5nOworCisJY2hhciBpbml0X2lycXM7CisKKwkvKiBSZWdpc3RlciBzaGFkb3cgKi8KKwl1bnNpZ25lZCBpbnQgY3RybF9kYXRhX3NoYWRvdzsKKwkvKiBSZW1haW5pbmcgYnl0ZXMgZm9yIGN1cnJlbnQgdHJhbnNmZXIgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgb3V0X2NvdW50OworCS8qIEN1cnJlbnQgcG9zaXRpb24gaW4gb3V0X2J1ZmZlciAqLworCXVuc2lnbmVkIGNoYXIgKm91dHA7CisJLyogMTYqNCAqLworCS8qIE5leHQgYnl0ZSB0byBiZSByZWFkIGJ5IGFwcGxpY2F0aW9uICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqdm9sYXRpbGUgcmVhZHA7CisJLyogTmV4dCBieXRlIHRvIGJlIHdyaXR0ZW4gYnkgZXRyYXggKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICp2b2xhdGlsZSB3cml0ZXA7CisKKwl1bnNpZ25lZCBpbnQgaW5fYnVmZmVyX3NpemU7CisJdW5zaWduZWQgaW50IGluYnVmY2h1bms7CisJc3RydWN0IGV0cmF4X2RtYV9kZXNjciBvdXRfZGVzY3IgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMzIpKSk7CisJc3RydWN0IGV0cmF4X2RtYV9kZXNjciBpbl9kZXNjcltOVU1fSU5fREVTQ1JdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDMyKSkpOworCXVuc2lnbmVkIGNoYXIgb3V0X2J1ZmZlcltPVVRfQlVGRkVSX1NJWkVdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDMyKSkpOworCXVuc2lnbmVkIGNoYXIgaW5fYnVmZmVyW0lOX0JVRkZFUl9TSVpFXV9fYXR0cmlidXRlX18gKChhbGlnbmVkKDMyKSkpOworCXVuc2lnbmVkIGNoYXIgZmxpcFtJTl9CVUZGRVJfU0laRV0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMzIpKSk7CisJc3RydWN0IGV0cmF4X2RtYV9kZXNjciAqbmV4dF9yeF9kZXNjOworCXN0cnVjdCBldHJheF9kbWFfZGVzY3IgKnByZXZfcnhfZGVzYzsKKwlpbnQgZnVsbDsKKworCXdhaXRfcXVldWVfaGVhZF90IG91dF93YWl0X3E7CisJd2FpdF9xdWV1ZV9oZWFkX3QgaW5fd2FpdF9xOworfTsKKworCitzdGF0aWMgaW50IGV0cmF4X3N5bmNfc2VyaWFsX2luaXQodm9pZCk7CitzdGF0aWMgdm9pZCBpbml0aWFsaXplX3BvcnQoaW50IHBvcnRuYnIpOworc3RhdGljIGlubGluZSBpbnQgc3luY19kYXRhX2F2YWlsKHN0cnVjdCBzeW5jX3BvcnQgKnBvcnQpOworCitzdGF0aWMgaW50IHN5bmNfc2VyaWFsX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCBzeW5jX3NlcmlhbF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3luY19zZXJpYWxfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgcG9sbF90YWJsZSAqd2FpdCk7CisKK3N0YXRpYyBpbnQgc3luY19zZXJpYWxfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHNzaXplX3Qgc3luY19zZXJpYWxfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZiwKKwlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CitzdGF0aWMgc3NpemVfdCBzeW5jX3NlcmlhbF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsCisJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworCisjaWYgKChkZWZpbmVkKENPTkZJR19FVFJBWF9TWU5DSFJPTk9VU19TRVJJQUxfUE9SVDApICYmIFwKKyAgICAgZGVmaW5lZChDT05GSUdfRVRSQVhfU1lOQ0hST05PVVNfU0VSSUFMMF9ETUEpKSB8fCBcCisgICAgKGRlZmluZWQoQ09ORklHX0VUUkFYX1NZTkNIUk9OT1VTX1NFUklBTF9QT1JUMSkgJiYgXAorICAgICBkZWZpbmVkKENPTkZJR19FVFJBWF9TWU5DSFJPTk9VU19TRVJJQUwxX0RNQSkpKQorI2RlZmluZSBTWU5DX1NFUl9ETUEKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzZW5kX3dvcmQoc3RydWN0IHN5bmNfcG9ydCAqcG9ydCk7CitzdGF0aWMgdm9pZCBzdGFydF9kbWEoc3RydWN0IHN5bmNfcG9ydCAqcG9ydCwgY29uc3QgY2hhciAqZGF0YSwgaW50IGNvdW50KTsKK3N0YXRpYyB2b2lkIHN0YXJ0X2RtYV9pbihzdHJ1Y3Qgc3luY19wb3J0ICpwb3J0KTsKKyNpZmRlZiBTWU5DX1NFUl9ETUEKK3N0YXRpYyBpcnFyZXR1cm5fdCB0cl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCByeF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKKyNlbmRpZgorI2lmICgoZGVmaW5lZChDT05GSUdfRVRSQVhfU1lOQ0hST05PVVNfU0VSSUFMX1BPUlQwKSAmJiBcCisgICAgICFkZWZpbmVkKENPTkZJR19FVFJBWF9TWU5DSFJPTk9VU19TRVJJQUwwX0RNQSkpIHx8IFwKKyAgICAoZGVmaW5lZChDT05GSUdfRVRSQVhfU1lOQ0hST05PVVNfU0VSSUFMX1BPUlQxKSAmJiBcCisgICAgICFkZWZpbmVkKENPTkZJR19FVFJBWF9TWU5DSFJPTk9VU19TRVJJQUwxX0RNQSkpKQorI2RlZmluZSBTWU5DX1NFUl9NQU5VQUwKKyNlbmRpZgorI2lmZGVmIFNZTkNfU0VSX01BTlVBTAorc3RhdGljIGlycXJldHVybl90IG1hbnVhbF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKKyNlbmRpZgorCisvKiBUaGUgcG9ydHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3luY19wb3J0IHBvcnRzW10gPSB7CisJeworCQkuc3RhdHVzICAgICAgICAgICAgICAgID0gUl9TWU5DX1NFUklBTDFfU1RBVFVTLAorCQkuY3RybF9kYXRhICAgICAgICAgICAgID0gUl9TWU5DX1NFUklBTDFfQ1RSTCwKKwkJLm91dHB1dF9kbWFfZmlyc3QgICAgICA9IFJfRE1BX0NIOF9GSVJTVCwKKwkJLm91dHB1dF9kbWFfY21kICAgICAgICA9IFJfRE1BX0NIOF9DTUQsCisJCS5vdXRwdXRfZG1hX2Nscl9pcnEgICAgPSBSX0RNQV9DSDhfQ0xSX0lOVFIsCisJCS5pbnB1dF9kbWFfZmlyc3QgICAgICAgPSBSX0RNQV9DSDlfRklSU1QsCisJCS5pbnB1dF9kbWFfY21kICAgICAgICAgPSBSX0RNQV9DSDlfQ01ELAorCQkuaW5wdXRfZG1hX2Rlc2NyICAgICAgID0gUl9ETUFfQ0g5X0RFU0NSLAorCQkuaW5wdXRfZG1hX2Nscl9pcnEgICAgID0gUl9ETUFfQ0g5X0NMUl9JTlRSLAorCQkuZGF0YV9vdXQgICAgICAgICAgICAgID0gUl9TWU5DX1NFUklBTDFfVFJfREFUQSwKKwkJLmRhdGFfaW4gICAgICAgICAgICAgICA9IFJfU1lOQ19TRVJJQUwxX1JFQ19EQVRBLAorCQkuZGF0YV9hdmFpbF9iaXQgICAgICAgID0gSU9fQklUTlIoUl9JUlFfTUFTSzFfUkQsIHNlcjFfZGF0YSksCisJCS50cmFuc21pdHRlcl9yZWFkeV9iaXQgPSBJT19CSVROUihSX0lSUV9NQVNLMV9SRCwgc2VyMV9yZWFkeSksCisJCS5pbnB1dF9kbWFfZGVzY3JfYml0ICAgPSBJT19CSVROUihSX0lSUV9NQVNLMl9SRCwgZG1hOV9kZXNjciksCisJCS5vdXRwdXRfZG1hX2JpdCAgICAgICAgPSBJT19CSVROUihSX0lSUV9NQVNLMl9SRCwgZG1hOF9lb3ApLAorCQkuaW5pdF9pcnFzICAgICAgICAgICAgID0gMSwKKyNpZiBkZWZpbmVkKENPTkZJR19FVFJBWF9TWU5DSFJPTk9VU19TRVJJQUwwX0RNQSkKKwkJLnVzZV9kbWEgICAgICAgICAgICAgICA9IDEsCisjZWxzZQorCQkudXNlX2RtYSAgICAgICAgICAgICAgID0gMCwKKyNlbmRpZgorCX0sCisJeworCQkuc3RhdHVzICAgICAgICAgICAgICAgID0gUl9TWU5DX1NFUklBTDNfU1RBVFVTLAorCQkuY3RybF9kYXRhICAgICAgICAgICAgID0gUl9TWU5DX1NFUklBTDNfQ1RSTCwKKwkJLm91dHB1dF9kbWFfZmlyc3QgICAgICA9IFJfRE1BX0NINF9GSVJTVCwKKwkJLm91dHB1dF9kbWFfY21kICAgICAgICA9IFJfRE1BX0NINF9DTUQsCisJCS5vdXRwdXRfZG1hX2Nscl9pcnEgICAgPSBSX0RNQV9DSDRfQ0xSX0lOVFIsCisJCS5pbnB1dF9kbWFfZmlyc3QgICAgICAgPSBSX0RNQV9DSDVfRklSU1QsCisJCS5pbnB1dF9kbWFfY21kICAgICAgICAgPSBSX0RNQV9DSDVfQ01ELAorCQkuaW5wdXRfZG1hX2Rlc2NyICAgICAgID0gUl9ETUFfQ0g1X0RFU0NSLAorCQkuaW5wdXRfZG1hX2Nscl9pcnEgICAgID0gUl9ETUFfQ0g1X0NMUl9JTlRSLAorCQkuZGF0YV9vdXQgICAgICAgICAgICAgID0gUl9TWU5DX1NFUklBTDNfVFJfREFUQSwKKwkJLmRhdGFfaW4gICAgICAgICAgICAgICA9IFJfU1lOQ19TRVJJQUwzX1JFQ19EQVRBLAorCQkuZGF0YV9hdmFpbF9iaXQgICAgICAgID0gSU9fQklUTlIoUl9JUlFfTUFTSzFfUkQsIHNlcjNfZGF0YSksCisJCS50cmFuc21pdHRlcl9yZWFkeV9iaXQgPSBJT19CSVROUihSX0lSUV9NQVNLMV9SRCwgc2VyM19yZWFkeSksCisJCS5pbnB1dF9kbWFfZGVzY3JfYml0ICAgPSBJT19CSVROUihSX0lSUV9NQVNLMl9SRCwgZG1hNV9kZXNjciksCisJCS5vdXRwdXRfZG1hX2JpdCAgICAgICAgPSBJT19CSVROUihSX0lSUV9NQVNLMl9SRCwgZG1hNF9lb3ApLAorCQkuaW5pdF9pcnFzICAgICAgICAgICAgID0gMSwKKyNpZiBkZWZpbmVkKENPTkZJR19FVFJBWF9TWU5DSFJPTk9VU19TRVJJQUwxX0RNQSkKKwkJLnVzZV9kbWEgICAgICAgICAgICAgICA9IDEsCisjZWxzZQorCQkudXNlX2RtYSAgICAgICAgICAgICAgID0gMCwKKyNlbmRpZgorCX0KK307CisKKy8qIFJlZ2lzdGVyIHNoYWRvd3MgKi8KK3N0YXRpYyB1bnNpZ25lZCBzeW5jX3NlcmlhbF9wcmVzY2FsZV9zaGFkb3c7CisKKyNkZWZpbmUgTlVNQkVSX09GX1BPUlRTIDIKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3luY19zZXJpYWxfZm9wcyA9IHsKKwkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCS53cml0ZSAgID0gc3luY19zZXJpYWxfd3JpdGUsCisJLnJlYWQgICAgPSBzeW5jX3NlcmlhbF9yZWFkLAorCS5wb2xsICAgID0gc3luY19zZXJpYWxfcG9sbCwKKwkuaW9jdGwgICA9IHN5bmNfc2VyaWFsX2lvY3RsLAorCS5vcGVuICAgID0gc3luY19zZXJpYWxfb3BlbiwKKwkucmVsZWFzZSA9IHN5bmNfc2VyaWFsX3JlbGVhc2UKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGV0cmF4X3N5bmNfc2VyaWFsX2luaXQodm9pZCkKK3sKKwlwb3J0c1swXS5lbmFibGVkID0gMDsKKwlwb3J0c1sxXS5lbmFibGVkID0gMDsKKworI2lmIGRlZmluZWQoQ09ORklHX0VUUkFYX1NZTkNIUk9OT1VTX1NFUklBTF9QT1JUMCkKKwlpZiAoY3Jpc19yZXF1ZXN0X2lvX2ludGVyZmFjZShpZl9zeW5jX3NlcmlhbF8xLCAic3luY19zZXIxIikpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiRVRSQVgxMDBMWCBzeW5jX3NlcmlhbDogIgorCQkJIkNvdWxkIG5vdCBhbGxvY2F0ZSBJTyBncm91cCBmb3IgcG9ydCAlZFxuIiwgMCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfRVRSQVhfU1lOQ0hST05PVVNfU0VSSUFMX1BPUlQxKQorCWlmIChjcmlzX3JlcXVlc3RfaW9faW50ZXJmYWNlKGlmX3N5bmNfc2VyaWFsXzMsICJzeW5jX3NlcjMiKSkgeworI2lmIGRlZmluZWQoQ09ORklHX0VUUkFYX1NZTkNIUk9OT1VTX1NFUklBTF9QT1JUMCkKKwkJY3Jpc19mcmVlX2lvX2ludGVyZmFjZShpZl9zeW5jX3NlcmlhbF8xKTsKKyNlbmRpZgorCQlwcmludGsoS0VSTl9DUklUICJFVFJBWDEwMExYIHN5bmNfc2VyaWFsOiAiCisJCQkiQ291bGQgbm90IGFsbG9jYXRlIElPIGdyb3VwIGZvciBwb3J0ICVkXG4iLCAxKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisjZW5kaWYKKworCWlmIChyZWdpc3Rlcl9jaHJkZXYoU1lOQ19TRVJJQUxfTUFKT1IsICJzeW5jIHNlcmlhbCIsCisJCQkmc3luY19zZXJpYWxfZm9wcykgPCAwKSB7CisjaWYgZGVmaW5lZChDT05GSUdfRVRSQVhfU1lOQ0hST05PVVNfU0VSSUFMX1BPUlQxKQorCQljcmlzX2ZyZWVfaW9faW50ZXJmYWNlKGlmX3N5bmNfc2VyaWFsXzMpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfRVRSQVhfU1lOQ0hST05PVVNfU0VSSUFMX1BPUlQwKQorCQljcmlzX2ZyZWVfaW9faW50ZXJmYWNlKGlmX3N5bmNfc2VyaWFsXzEpOworI2VuZGlmCisJCXByaW50aygidW5hYmxlIHRvIGdldCBtYWpvciBmb3Igc3luY2hyb25vdXMgc2VyaWFsIHBvcnRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qIERlc2VsZWN0IHN5bmNocm9ub3VzIHNlcmlhbCBwb3J0cyB3aGlsZSBjb25maWd1cmluZy4gKi8KKwlTRVRTKGdlbl9jb25maWdfaWlfc2hhZG93LCBSX0dFTl9DT05GSUdfSUksIHNlcm1vZGUxLCBhc3luYyk7CisJU0VUUyhnZW5fY29uZmlnX2lpX3NoYWRvdywgUl9HRU5fQ09ORklHX0lJLCBzZXJtb2RlMywgYXN5bmMpOworCSpSX0dFTl9DT05GSUdfSUkgPSBnZW5fY29uZmlnX2lpX3NoYWRvdzsKKworCS8qIEluaXRpYWxpemUgUG9ydHMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19FVFJBWF9TWU5DSFJPTk9VU19TRVJJQUxfUE9SVDApCisJcG9ydHNbMF0uZW5hYmxlZCA9IDE7CisJU0VUUyhwb3J0X3BiX2kyY19zaGFkb3csIFJfUE9SVF9QQl9JMkMsIHN5bmNzZXIxLCBzczFleHRyYSk7CisJU0VUUyhnZW5fY29uZmlnX2lpX3NoYWRvdywgUl9HRU5fQ09ORklHX0lJLCBzZXJtb2RlMSwgc3luYyk7CisjaWYgZGVmaW5lZChDT05GSUdfRVRSQVhfU1lOQ0hST05PVVNfU0VSSUFMMF9ETUEpCisJcG9ydHNbMF0udXNlX2RtYSA9IDE7CisjZWxzZQorCXBvcnRzWzBdLnVzZV9kbWEgPSAwOworI2VuZGlmCisJaW5pdGlhbGl6ZV9wb3J0KDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19FVFJBWF9TWU5DSFJPTk9VU19TRVJJQUxfUE9SVDEpCisJcG9ydHNbMV0uZW5hYmxlZCA9IDE7CisJU0VUUyhwb3J0X3BiX2kyY19zaGFkb3csIFJfUE9SVF9QQl9JMkMsIHN5bmNzZXIzLCBzczNleHRyYSk7CisJU0VUUyhnZW5fY29uZmlnX2lpX3NoYWRvdywgUl9HRU5fQ09ORklHX0lJLCBzZXJtb2RlMywgc3luYyk7CisjaWYgZGVmaW5lZChDT05GSUdfRVRSQVhfU1lOQ0hST05PVVNfU0VSSUFMMV9ETUEpCisJcG9ydHNbMV0udXNlX2RtYSA9IDE7CisjZWxzZQorCXBvcnRzWzFdLnVzZV9kbWEgPSAwOworI2VuZGlmCisJaW5pdGlhbGl6ZV9wb3J0KDEpOworI2VuZGlmCisKKwkqUl9QT1JUX1BCX0kyQyA9IHBvcnRfcGJfaTJjX3NoYWRvdzsgLyogVXNlIFBCNC9QQjcgKi8KKworCS8qIFNldCB1cCB0aW1pbmcgKi8KKwkqUl9TWU5DX1NFUklBTF9QUkVTQ0FMRSA9IHN5bmNfc2VyaWFsX3ByZXNjYWxlX3NoYWRvdyA9ICgKKwkJSU9fU1RBVEUoUl9TWU5DX1NFUklBTF9QUkVTQ0FMRSwgY2xrX3NlbF91MSwgY29kZWMpIHwKKwkJSU9fU1RBVEUoUl9TWU5DX1NFUklBTF9QUkVTQ0FMRSwgd29yZF9zdGJfc2VsX3UxLCBleHRlcm5hbCkgfAorCQlJT19TVEFURShSX1NZTkNfU0VSSUFMX1BSRVNDQUxFLCBjbGtfc2VsX3UzLCBjb2RlYykgfAorCQlJT19TVEFURShSX1NZTkNfU0VSSUFMX1BSRVNDQUxFLCB3b3JkX3N0Yl9zZWxfdTMsIGV4dGVybmFsKSB8CisJCUlPX1NUQVRFKFJfU1lOQ19TRVJJQUxfUFJFU0NBTEUsIHByZXNjYWxlciwgZGl2NCkgfAorCQlJT19GSUVMRChSX1NZTkNfU0VSSUFMX1BSRVNDQUxFLCBmcmFtZV9yYXRlLAorCQkJREVGQVVMVF9GUkFNRV9SQVRFKSB8CisJCUlPX0ZJRUxEKFJfU1lOQ19TRVJJQUxfUFJFU0NBTEUsIHdvcmRfcmF0ZSwgREVGQVVMVF9XT1JEX1JBVEUpIHwKKwkJSU9fU1RBVEUoUl9TWU5DX1NFUklBTF9QUkVTQ0FMRSwgd2FycF9tb2RlLCBub3JtYWwpKTsKKworCS8qIFNlbGVjdCBzeW5jaHJvbm91cyBwb3J0cyAqLworCSpSX0dFTl9DT05GSUdfSUkgPSBnZW5fY29uZmlnX2lpX3NoYWRvdzsKKworCXByaW50ayhLRVJOX0lORk8gIkVUUkFYIDEwMExYIHN5bmNocm9ub3VzIHNlcmlhbCBwb3J0IGRyaXZlclxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0aWFsaXplX3BvcnQoaW50IHBvcnRuYnIpCit7CisJc3RydWN0IHN5bmNfcG9ydCAqcG9ydCA9ICZwb3J0c1twb3J0bmJyXTsKKworCURFQlVHKHByaW50ayhLRVJOX0RFQlVHICJJbml0IHN5bmMgc2VyaWFsIHBvcnQgJWRcbiIsIHBvcnRuYnIpKTsKKworCXBvcnQtPnN0YXJ0ZWQgPSAwOworCXBvcnQtPnBvcnRfbmJyID0gcG9ydG5icjsKKwlwb3J0LT5idXN5ID0gMDsKKwlwb3J0LT50cl9ydW5uaW5nID0gMDsKKworCXBvcnQtPm91dF9jb3VudCA9IDA7CisJcG9ydC0+b3V0cCA9IHBvcnQtPm91dF9idWZmZXI7CisKKwlwb3J0LT5yZWFkcCA9IHBvcnQtPmZsaXA7CisJcG9ydC0+d3JpdGVwID0gcG9ydC0+ZmxpcDsKKwlwb3J0LT5pbl9idWZmZXJfc2l6ZSA9IElOX0JVRkZFUl9TSVpFOworCXBvcnQtPmluYnVmY2h1bmsgPSBJTl9ERVNDUl9TSVpFOworCXBvcnQtPm5leHRfcnhfZGVzYyA9ICZwb3J0LT5pbl9kZXNjclswXTsKKwlwb3J0LT5wcmV2X3J4X2Rlc2MgPSAmcG9ydC0+aW5fZGVzY3JbTlVNX0lOX0RFU0NSLTFdOworCXBvcnQtPnByZXZfcnhfZGVzYy0+Y3RybCA9IGRfZW9sOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydC0+b3V0X3dhaXRfcSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydC0+aW5fd2FpdF9xKTsKKworCXBvcnQtPmN0cmxfZGF0YV9zaGFkb3cgPQorCQlJT19TVEFURShSX1NZTkNfU0VSSUFMMV9DVFJMLCB0cl9iYXVkLCBjMTE1azJIeikgICB8CisJCUlPX1NUQVRFKFJfU1lOQ19TRVJJQUwxX0NUUkwsIG1vZGUsIG1hc3Rlcl9vdXRwdXQpIHwKKwkJSU9fU1RBVEUoUl9TWU5DX1NFUklBTDFfQ1RSTCwgZXJyb3IsIGlnbm9yZSkgICAgICAgfAorCQlJT19TVEFURShSX1NZTkNfU0VSSUFMMV9DVFJMLCByZWNfZW5hYmxlLCBkaXNhYmxlKSB8CisJCUlPX1NUQVRFKFJfU1lOQ19TRVJJQUwxX0NUUkwsIGZfc3luY3R5cGUsIG5vcm1hbCkgIHwKKwkJSU9fU1RBVEUoUl9TWU5DX1NFUklBTDFfQ1RSTCwgZl9zeW5jc2l6ZSwgd29yZCkgICAgfAorCQlJT19TVEFURShSX1NZTkNfU0VSSUFMMV9DVFJMLCBmX3N5bmMsIG9uKQkgICAgIHwKKwkJSU9fU1RBVEUoUl9TWU5DX1NFUklBTDFfQ1RSTCwgY2xrX21vZGUsIG5vcm1hbCkgICAgfAorCQlJT19TVEFURShSX1NZTkNfU0VSSUFMMV9DVFJMLCBjbGtfaGFsdCwgc3RvcHBlZCkgICB8CisJCUlPX1NUQVRFKFJfU1lOQ19TRVJJQUwxX0NUUkwsIGJpdG9yZGVyLCBtc2IpCSAgICAgfAorCQlJT19TVEFURShSX1NZTkNfU0VSSUFMMV9DVFJMLCB0cl9lbmFibGUsIGRpc2FibGUpICB8CisJCUlPX1NUQVRFKFJfU1lOQ19TRVJJQUwxX0NUUkwsIHdvcmRzaXplLCBzaXplOGJpdCkgIHwKKwkJSU9fU1RBVEUoUl9TWU5DX1NFUklBTDFfQ1RSTCwgYnVmX2VtcHR5LCBsbXRfOCkgICAgfAorCQlJT19TVEFURShSX1NZTkNfU0VSSUFMMV9DVFJMLCBidWZfZnVsbCwgbG10XzgpICAgICB8CisJCUlPX1NUQVRFKFJfU1lOQ19TRVJJQUwxX0NUUkwsIGZsb3dfY3RybCwgZW5hYmxlZCkgIHwKKwkJSU9fU1RBVEUoUl9TWU5DX1NFUklBTDFfQ1RSTCwgY2xrX3BvbGFyaXR5LCBuZWcpICAgfAorCQlJT19TVEFURShSX1NZTkNfU0VSSUFMMV9DVFJMLCBmcmFtZV9wb2xhcml0eSwgbm9ybWFsKXwKKwkJSU9fU1RBVEUoUl9TWU5DX1NFUklBTDFfQ1RSTCwgc3RhdHVzX3BvbGFyaXR5LCBpbnZlcnRlZCl8CisJCUlPX1NUQVRFKFJfU1lOQ19TRVJJQUwxX0NUUkwsIGNsa19kcml2ZXIsIG5vcm1hbCkgICB8CisJCUlPX1NUQVRFKFJfU1lOQ19TRVJJQUwxX0NUUkwsIGZyYW1lX2RyaXZlciwgbm9ybWFsKSB8CisJCUlPX1NUQVRFKFJfU1lOQ19TRVJJQUwxX0NUUkwsIHN0YXR1c19kcml2ZXIsIG5vcm1hbCl8CisJCUlPX1NUQVRFKFJfU1lOQ19TRVJJQUwxX0NUUkwsIGRlZl9vdXQwLCBoaWdoKTsKKworCWlmIChwb3J0LT51c2VfZG1hKQorCQlwb3J0LT5jdHJsX2RhdGFfc2hhZG93IHw9IElPX1NUQVRFKFJfU1lOQ19TRVJJQUwxX0NUUkwsCisJCQlkbWFfZW5hYmxlLCBvbik7CisJZWxzZQorCQlwb3J0LT5jdHJsX2RhdGFfc2hhZG93IHw9IElPX1NUQVRFKFJfU1lOQ19TRVJJQUwxX0NUUkwsCisJCQlkbWFfZW5hYmxlLCBvZmYpOworCisJKnBvcnQtPmN0cmxfZGF0YSA9IHBvcnQtPmN0cmxfZGF0YV9zaGFkb3c7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHN5bmNfZGF0YV9hdmFpbChzdHJ1Y3Qgc3luY19wb3J0ICpwb3J0KQoreworCWludCBhdmFpbDsKKwl1bnNpZ25lZCBjaGFyICpzdGFydDsKKwl1bnNpZ25lZCBjaGFyICplbmQ7CisKKwlzdGFydCA9ICh1bnNpZ25lZCBjaGFyICopcG9ydC0+cmVhZHA7IC8qIGNhc3QgYXdheSB2b2xhdGlsZSAqLworCWVuZCA9ICh1bnNpZ25lZCBjaGFyICopcG9ydC0+d3JpdGVwOyAgLyogY2FzdCBhd2F5IHZvbGF0aWxlICovCisJLyogMDEyMzQ1Njc4OSAgMDEyMzQ1Njc4OQorCSAqICAtLS0tLSAgICAgIC0gICAgLS0tLS0KKwkgKiAgXnJwICBed3AgICAgXndwIF5ycAorCSAqLworCWlmIChlbmQgPj0gc3RhcnQpCisJCWF2YWlsID0gZW5kIC0gc3RhcnQ7CisJZWxzZQorCQlhdmFpbCA9IHBvcnQtPmluX2J1ZmZlcl9zaXplIC0gKHN0YXJ0IC0gZW5kKTsKKwlyZXR1cm4gYXZhaWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHN5bmNfZGF0YV9hdmFpbF90b19lbmQoc3RydWN0IHN5bmNfcG9ydCAqcG9ydCkKK3sKKwlpbnQgYXZhaWw7CisJdW5zaWduZWQgY2hhciAqc3RhcnQ7CisJdW5zaWduZWQgY2hhciAqZW5kOworCisJc3RhcnQgPSAodW5zaWduZWQgY2hhciAqKXBvcnQtPnJlYWRwOyAvKiBjYXN0IGF3YXkgdm9sYXRpbGUgKi8KKwllbmQgPSAodW5zaWduZWQgY2hhciAqKXBvcnQtPndyaXRlcDsgIC8qIGNhc3QgYXdheSB2b2xhdGlsZSAqLworCS8qIDAxMjM0NTY3ODkgIDAxMjM0NTY3ODkKKwkgKiAgLS0tLS0gICAgICAgICAgIC0tLS0tCisJICogIF5ycCAgXndwICAgIF53cCBecnAKKwkgKi8KKworCWlmIChlbmQgPj0gc3RhcnQpCisJCWF2YWlsID0gZW5kIC0gc3RhcnQ7CisJZWxzZQorCQlhdmFpbCA9IHBvcnQtPmZsaXAgKyBwb3J0LT5pbl9idWZmZXJfc2l6ZSAtIHN0YXJ0OworCXJldHVybiBhdmFpbDsKK30KKworCitzdGF0aWMgaW50IHN5bmNfc2VyaWFsX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGRldiA9IE1JTk9SKGlub2RlLT5pX3JkZXYpOworCXN0cnVjdCBzeW5jX3BvcnQgKnBvcnQ7CisJaW50IG1vZGU7CisKKwlERUJVRyhwcmludGsoS0VSTl9ERUJVRyAiT3BlbiBzeW5jIHNlcmlhbCBwb3J0ICVkXG4iLCBkZXYpKTsKKworCWlmIChkZXYgPCAwIHx8IGRldiA+PSBOVU1CRVJfT0ZfUE9SVFMgfHwgIXBvcnRzW2Rldl0uZW5hYmxlZCkgeworCQlERUJVRyhwcmludGsoS0VSTl9ERUJVRyAiSW52YWxpZCBtaW5vciAlZFxuIiwgZGV2KSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlwb3J0ID0gJnBvcnRzW2Rldl07CisJLyogQWxsb3cgb3BlbiB0aGlzIGRldmljZSB0d2ljZSAoYXNzdW1pbmcgb25lIHJlYWRlciBhbmQgb25lIHdyaXRlcikgKi8KKwlpZiAocG9ydC0+YnVzeSA9PSAyKSB7CisJCURFQlVHKHByaW50ayhLRVJOX0RFQlVHICJEZXZpY2UgaXMgYnVzeS4uIFxuIikpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlpZiAocG9ydC0+aW5pdF9pcnFzKSB7CisJCWlmIChwb3J0LT51c2VfZG1hKSB7CisJCQlpZiAocG9ydCA9PSAmcG9ydHNbMF0pIHsKKyNpZmRlZiBTWU5DX1NFUl9ETUEKKwkJCQlpZiAocmVxdWVzdF9pcnEoMjQsIHRyX2ludGVycnVwdCwgMCwKKwkJCQkJCSJzeW5jaHJvbm91cyBzZXJpYWwgMSBkbWEgdHIiLAorCQkJCQkJJnBvcnRzWzBdKSkgeworCQkJCQlwcmludGsoS0VSTl9DUklUICJDYW4ndCBhbGxvYyAiCisJCQkJCQkic3luYyBzZXJpYWwgcG9ydCAxIElSUSIpOworCQkJCQlyZXR1cm4gLUVCVVNZOworCQkJCX0gZWxzZSBpZiAocmVxdWVzdF9pcnEoMjUsIHJ4X2ludGVycnVwdCwgMCwKKwkJCQkJCSJzeW5jaHJvbm91cyBzZXJpYWwgMSBkbWEgcngiLAorCQkJCQkJJnBvcnRzWzBdKSkgeworCQkJCQlmcmVlX2lycSgyNCwgJnBvcnRbMF0pOworCQkJCQlwcmludGsoS0VSTl9DUklUICJDYW4ndCBhbGxvYyAiCisJCQkJCQkic3luYyBzZXJpYWwgcG9ydCAxIElSUSIpOworCQkJCQlyZXR1cm4gLUVCVVNZOworCQkJCX0gZWxzZSBpZiAoY3Jpc19yZXF1ZXN0X2RtYSg4LAorCQkJCQkJInN5bmNocm9ub3VzIHNlcmlhbCAxIGRtYSB0ciIsCisJCQkJCQlETUFfVkVSQk9TRV9PTl9FUlJPUiwKKwkJCQkJCWRtYV9zZXIxKSkgeworCQkJCQlmcmVlX2lycSgyNCwgJnBvcnRbMF0pOworCQkJCQlmcmVlX2lycSgyNSwgJnBvcnRbMF0pOworCQkJCQlwcmludGsoS0VSTl9DUklUICJDYW4ndCBhbGxvYyAiCisJCQkJCQkic3luYyBzZXJpYWwgcG9ydCAxICIKKwkJCQkJCSJUWCBETUEgY2hhbm5lbCIpOworCQkJCQlyZXR1cm4gLUVCVVNZOworCQkJCX0gZWxzZSBpZiAoY3Jpc19yZXF1ZXN0X2RtYSg5LAorCQkJCQkJInN5bmNocm9ub3VzIHNlcmlhbCAxIGRtYSByZWMiLAorCQkJCQkJRE1BX1ZFUkJPU0VfT05fRVJST1IsCisJCQkJCQlkbWFfc2VyMSkpIHsKKwkJCQkJY3Jpc19mcmVlX2RtYSg4LCBOVUxMKTsKKwkJCQkJZnJlZV9pcnEoMjQsICZwb3J0WzBdKTsKKwkJCQkJZnJlZV9pcnEoMjUsICZwb3J0WzBdKTsKKwkJCQkJcHJpbnRrKEtFUk5fQ1JJVCAiQ2FuJ3QgYWxsb2MgIgorCQkJCQkJInN5bmMgc2VyaWFsIHBvcnQgMSAiCisJCQkJCQkiUlggRE1BIGNoYW5uZWwiKTsKKwkJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCQl9CisjZW5kaWYKKwkJCQlSRVNFVF9ETUEoOCk7IFdBSVRfRE1BKDgpOworCQkJCVJFU0VUX0RNQSg5KTsgV0FJVF9ETUEoOSk7CisJCQkJKlJfRE1BX0NIOF9DTFJfSU5UUiA9CisJCQkJCUlPX1NUQVRFKFJfRE1BX0NIOF9DTFJfSU5UUiwgY2xyX2VvcCwKKwkJCQkJCWRvKSB8CisJCQkJCUlPX1NUQVRFKFJfRE1BX0NIOF9DTFJfSU5UUiwgY2xyX2Rlc2NyLAorCQkJCQkJZG8pOworCQkJCSpSX0RNQV9DSDlfQ0xSX0lOVFIgPQorCQkJCQlJT19TVEFURShSX0RNQV9DSDlfQ0xSX0lOVFIsIGNscl9lb3AsCisJCQkJCQlkbykgfAorCQkJCQlJT19TVEFURShSX0RNQV9DSDlfQ0xSX0lOVFIsIGNscl9kZXNjciwKKwkJCQkJCWRvKTsKKwkJCQkqUl9JUlFfTUFTSzJfU0VUID0KKwkJCQkJSU9fU1RBVEUoUl9JUlFfTUFTSzJfU0VULCBkbWE4X2VvcCwKKwkJCQkJCXNldCkgfAorCQkJCQlJT19TVEFURShSX0lSUV9NQVNLMl9TRVQsIGRtYTlfZGVzY3IsCisJCQkJCQlzZXQpOworCQkJfSBlbHNlIGlmIChwb3J0ID09ICZwb3J0c1sxXSkgeworI2lmZGVmIFNZTkNfU0VSX0RNQQorCQkJCWlmIChyZXF1ZXN0X2lycSgyMCwgdHJfaW50ZXJydXB0LCAwLAorCQkJCQkJInN5bmNocm9ub3VzIHNlcmlhbCAzIGRtYSB0ciIsCisJCQkJCQkmcG9ydHNbMV0pKSB7CisJCQkJCXByaW50ayhLRVJOX0NSSVQgIkNhbid0IGFsbG9jICIKKwkJCQkJCSJzeW5jIHNlcmlhbCBwb3J0IDMgSVJRIik7CisJCQkJCXJldHVybiAtRUJVU1k7CisJCQkJfSBlbHNlIGlmIChyZXF1ZXN0X2lycSgyMSwgcnhfaW50ZXJydXB0LCAwLAorCQkJCQkJInN5bmNocm9ub3VzIHNlcmlhbCAzIGRtYSByeCIsCisJCQkJCQkmcG9ydHNbMV0pKSB7CisJCQkJCWZyZWVfaXJxKDIwLCAmcG9ydHNbMV0pOworCQkJCQlwcmludGsoS0VSTl9DUklUICJDYW4ndCBhbGxvYyAiCisJCQkJCQkic3luYyBzZXJpYWwgcG9ydCAzIElSUSIpOworCQkJCQlyZXR1cm4gLUVCVVNZOworCQkJCX0gZWxzZSBpZiAoY3Jpc19yZXF1ZXN0X2RtYSg0LAorCQkJCQkJInN5bmNocm9ub3VzIHNlcmlhbCAzIGRtYSB0ciIsCisJCQkJCQlETUFfVkVSQk9TRV9PTl9FUlJPUiwKKwkJCQkJCWRtYV9zZXIzKSkgeworCQkJCQlmcmVlX2lycSgyMSwgJnBvcnRzWzFdKTsKKwkJCQkJZnJlZV9pcnEoMjAsICZwb3J0c1sxXSk7CisJCQkJCXByaW50ayhLRVJOX0NSSVQgIkNhbid0IGFsbG9jICIKKwkJCQkJCSJzeW5jIHNlcmlhbCBwb3J0IDMgIgorCQkJCQkJIlRYIERNQSBjaGFubmVsIik7CisJCQkJCXJldHVybiAtRUJVU1k7CisJCQkJfSBlbHNlIGlmIChjcmlzX3JlcXVlc3RfZG1hKDUsCisJCQkJCQkic3luY2hyb25vdXMgc2VyaWFsIDMgZG1hIHJlYyIsCisJCQkJCQlETUFfVkVSQk9TRV9PTl9FUlJPUiwKKwkJCQkJCWRtYV9zZXIzKSkgeworCQkJCQljcmlzX2ZyZWVfZG1hKDQsIE5VTEwpOworCQkJCQlmcmVlX2lycSgyMSwgJnBvcnRzWzFdKTsKKwkJCQkJZnJlZV9pcnEoMjAsICZwb3J0c1sxXSk7CisJCQkJCXByaW50ayhLRVJOX0NSSVQgIkNhbid0IGFsbG9jICIKKwkJCQkJCSJzeW5jIHNlcmlhbCBwb3J0IDMgIgorCQkJCQkJIlJYIERNQSBjaGFubmVsIik7CisJCQkJCXJldHVybiAtRUJVU1k7CisJCQkJfQorI2VuZGlmCisJCQkJUkVTRVRfRE1BKDQpOyBXQUlUX0RNQSg0KTsKKwkJCQlSRVNFVF9ETUEoNSk7IFdBSVRfRE1BKDUpOworCQkJCSpSX0RNQV9DSDRfQ0xSX0lOVFIgPQorCQkJCQlJT19TVEFURShSX0RNQV9DSDRfQ0xSX0lOVFIsIGNscl9lb3AsCisJCQkJCQlkbykgfAorCQkJCQlJT19TVEFURShSX0RNQV9DSDRfQ0xSX0lOVFIsIGNscl9kZXNjciwKKwkJCQkJCWRvKTsKKwkJCQkqUl9ETUFfQ0g1X0NMUl9JTlRSID0KKwkJCQkJSU9fU1RBVEUoUl9ETUFfQ0g1X0NMUl9JTlRSLCBjbHJfZW9wLAorCQkJCQkJZG8pIHwKKwkJCQkJSU9fU1RBVEUoUl9ETUFfQ0g1X0NMUl9JTlRSLCBjbHJfZGVzY3IsCisJCQkJCQlkbyk7CisJCQkJKlJfSVJRX01BU0syX1NFVCA9CisJCQkJCUlPX1NUQVRFKFJfSVJRX01BU0syX1NFVCwgZG1hNF9lb3AsCisJCQkJCQlzZXQpIHwKKwkJCQkJSU9fU1RBVEUoUl9JUlFfTUFTSzJfU0VULCBkbWE1X2Rlc2NyLAorCQkJCQkJc2V0KTsKKwkJCX0KKwkJCXN0YXJ0X2RtYV9pbihwb3J0KTsKKwkJCXBvcnQtPmluaXRfaXJxcyA9IDA7CisJCX0gZWxzZSB7IC8qICFwb3J0LT51c2VfZG1hICovCisjaWZkZWYgU1lOQ19TRVJfTUFOVUFMCisJCQlpZiAocG9ydCA9PSAmcG9ydHNbMF0pIHsKKwkJCQlpZiAocmVxdWVzdF9pcnEoOCwKKwkJCQkJCW1hbnVhbF9pbnRlcnJ1cHQsCisJCQkJCQlJUlFGX1NIQVJFRCB8IElSUUZfRElTQUJMRUQsCisJCQkJCQkic3luY2hyb25vdXMgc2VyaWFsIG1hbnVhbCBpcnEiLAorCQkJCQkJJnBvcnRzWzBdKSkgeworCQkJCQlwcmludGsoS0VSTl9DUklUICJDYW4ndCBhbGxvYyAiCisJCQkJCQkic3luYyBzZXJpYWwgbWFudWFsIGlycSIpOworCQkJCQlyZXR1cm4gLUVCVVNZOworCQkJCX0KKwkJCX0gZWxzZSBpZiAocG9ydCA9PSAmcG9ydHNbMV0pIHsKKwkJCQlpZiAocmVxdWVzdF9pcnEoOCwKKwkJCQkJCW1hbnVhbF9pbnRlcnJ1cHQsCisJCQkJCQlJUlFGX1NIQVJFRCB8IElSUUZfRElTQUJMRUQsCisJCQkJCQkic3luY2hyb25vdXMgc2VyaWFsIG1hbnVhbCBpcnEiLAorCQkJCQkJJnBvcnRzWzFdKSkgeworCQkJCQlwcmludGsoS0VSTl9DUklUICJDYW4ndCBhbGxvYyAiCisJCQkJCQkic3luYyBzZXJpYWwgbWFudWFsIGlycSIpOworCQkJCQlyZXR1cm4gLUVCVVNZOworCQkJCX0KKwkJCX0KKwkJCXBvcnQtPmluaXRfaXJxcyA9IDA7CisjZWxzZQorCQkJcGFuaWMoInN5bmNfc2VyaWFsOiBNYW51YWwgbW9kZSBub3Qgc3VwcG9ydGVkLlxuIik7CisjZW5kaWYgLyogU1lOQ19TRVJfTUFOVUFMICovCisJCX0KKwl9IC8qIHBvcnQtPmluaXRfaXJxcyAqLworCisJcG9ydC0+YnVzeSsrOworCS8qIFN0YXJ0IHBvcnQgaWYgd2UgdXNlIGl0IGFzIGlucHV0ICovCisJbW9kZSA9IElPX0VYVFJBQ1QoUl9TWU5DX1NFUklBTDFfQ1RSTCwgbW9kZSwgcG9ydC0+Y3RybF9kYXRhX3NoYWRvdyk7CisJaWYgKG1vZGUgPT0gSU9fU1RBVEVfVkFMVUUoUl9TWU5DX1NFUklBTDFfQ1RSTCwgbW9kZSwgbWFzdGVyX2lucHV0KSB8fAorCSAgICBtb2RlID09IElPX1NUQVRFX1ZBTFVFKFJfU1lOQ19TRVJJQUwxX0NUUkwsIG1vZGUsIHNsYXZlX2lucHV0KSB8fAorCSAgICBtb2RlID09IElPX1NUQVRFX1ZBTFVFKFJfU1lOQ19TRVJJQUwxX0NUUkwsIG1vZGUsIG1hc3Rlcl9iaWRpcikgfHwKKwkgICAgbW9kZSA9PSBJT19TVEFURV9WQUxVRShSX1NZTkNfU0VSSUFMMV9DVFJMLCBtb2RlLCBzbGF2ZV9iaWRpcikpIHsKKwkJU0VUUyhwb3J0LT5jdHJsX2RhdGFfc2hhZG93LCBSX1NZTkNfU0VSSUFMMV9DVFJMLCBjbGtfaGFsdCwKKwkJCXJ1bm5pbmcpOworCQlTRVRTKHBvcnQtPmN0cmxfZGF0YV9zaGFkb3csIFJfU1lOQ19TRVJJQUwxX0NUUkwsIHRyX2VuYWJsZSwKKwkJCWVuYWJsZSk7CisJCVNFVFMocG9ydC0+Y3RybF9kYXRhX3NoYWRvdywgUl9TWU5DX1NFUklBTDFfQ1RSTCwgcmVjX2VuYWJsZSwKKwkJCWVuYWJsZSk7CisJCXBvcnQtPnN0YXJ0ZWQgPSAxOworCQkqcG9ydC0+Y3RybF9kYXRhID0gcG9ydC0+Y3RybF9kYXRhX3NoYWRvdzsKKwkJaWYgKCFwb3J0LT51c2VfZG1hKQorCQkJKlJfSVJRX01BU0sxX1NFVCA9IDEgPDwgcG9ydC0+ZGF0YV9hdmFpbF9iaXQ7CisJCURFQlVHKHByaW50ayhLRVJOX0RFQlVHICJzc2VyJWQgcmVjIHN0YXJ0ZWRcbiIsIGRldikpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzeW5jX3NlcmlhbF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBkZXYgPSBNSU5PUihpbm9kZS0+aV9yZGV2KTsKKwlzdHJ1Y3Qgc3luY19wb3J0ICpwb3J0OworCisJaWYgKGRldiA8IDAgfHwgZGV2ID49IE5VTUJFUl9PRl9QT1JUUyB8fCAhcG9ydHNbZGV2XS5lbmFibGVkKSB7CisJCURFQlVHKHByaW50ayhLRVJOX0RFQlVHICJJbnZhbGlkIG1pbm9yICVkXG4iLCBkZXYpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXBvcnQgPSAmcG9ydHNbZGV2XTsKKwlpZiAocG9ydC0+YnVzeSkKKwkJcG9ydC0+YnVzeS0tOworCWlmICghcG9ydC0+YnVzeSkKKwkJKlJfSVJRX01BU0sxX0NMUiA9ICgoMSA8PCBwb3J0LT5kYXRhX2F2YWlsX2JpdCkgfAorCQkJCSAgICAoMSA8PCBwb3J0LT50cmFuc21pdHRlcl9yZWFkeV9iaXQpKTsKKworCXJldHVybiAwOworfQorCisKKworc3RhdGljIHVuc2lnbmVkIGludCBzeW5jX3NlcmlhbF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCWludCBkZXYgPSBNSU5PUihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9yZGV2KTsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisJc3RydWN0IHN5bmNfcG9ydCAqcG9ydDsKKwlERUJVR1BPTEwoc3RhdGljIHVuc2lnbmVkIGludCBwcmV2X21hc2sgPSAwKTsKKworCXBvcnQgPSAmcG9ydHNbZGV2XTsKKwlwb2xsX3dhaXQoZmlsZSwgJnBvcnQtPm91dF93YWl0X3EsIHdhaXQpOworCXBvbGxfd2FpdChmaWxlLCAmcG9ydC0+aW5fd2FpdF9xLCB3YWl0KTsKKwkvKiBTb21lIHJvb20gdG8gd3JpdGUgKi8KKwlpZiAocG9ydC0+b3V0X2NvdW50IDwgT1VUX0JVRkZFUl9TSVpFKQorCQltYXNrIHw9ICBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkvKiBBdCBsZWFzdCBhbiBpbmJ1ZmNodW5rIG9mIGRhdGEgKi8KKwlpZiAoc3luY19kYXRhX2F2YWlsKHBvcnQpID49IHBvcnQtPmluYnVmY2h1bmspCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKworCURFQlVHUE9MTChpZiAobWFzayAhPSBwcmV2X21hc2spCisJCXByaW50ayhLRVJOX0RFQlVHICJzeW5jX3NlcmlhbF9wb2xsOiBtYXNrIDB4JTA4WCAlcyAlc1xuIiwKKwkJCW1hc2ssCisJCQltYXNrICYgUE9MTE9VVCA/ICJQT0xMT1VUIiA6ICIiLAorCQkJbWFzayAmIFBPTExJTiA/ICJQT0xMSU4iIDogIiIpOworCQlwcmV2X21hc2sgPSBtYXNrOworCSk7CisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgc3luY19zZXJpYWxfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJldHVybl92YWwgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpbnQgZGV2ID0gTUlOT1IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfcmRldik7CisJc3RydWN0IHN5bmNfcG9ydCAqcG9ydDsKKworCWlmIChkZXYgPCAwIHx8IGRldiA+PSBOVU1CRVJfT0ZfUE9SVFMgfHwgIXBvcnRzW2Rldl0uZW5hYmxlZCkgeworCQlERUJVRyhwcmludGsoS0VSTl9ERUJVRyAiSW52YWxpZCBtaW5vciAlZFxuIiwgZGV2KSk7CisJCXJldHVybiAtMTsKKwl9CisJcG9ydCA9ICZwb3J0c1tkZXZdOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCS8qIERpc2FibGUgcG9ydCB3aGlsZSBjaGFuZ2luZyBjb25maWcgKi8KKwlpZiAoZGV2KSB7CisJCWlmIChwb3J0LT51c2VfZG1hKSB7CisJCQlSRVNFVF9ETUEoNCk7IFdBSVRfRE1BKDQpOworCQkJcG9ydC0+dHJfcnVubmluZyA9IDA7CisJCQlwb3J0LT5vdXRfY291bnQgPSAwOworCQkJcG9ydC0+b3V0cCA9IHBvcnQtPm91dF9idWZmZXI7CisJCQkqUl9ETUFfQ0g0X0NMUl9JTlRSID0KKwkJCQlJT19TVEFURShSX0RNQV9DSDRfQ0xSX0lOVFIsIGNscl9lb3AsIGRvKSB8CisJCQkJSU9fU1RBVEUoUl9ETUFfQ0g0X0NMUl9JTlRSLCBjbHJfZGVzY3IsIGRvKTsKKwkJfQorCQlTRVRTKGdlbl9jb25maWdfaWlfc2hhZG93LCBSX0dFTl9DT05GSUdfSUksIHNlcm1vZGUzLCBhc3luYyk7CisJfSBlbHNlIHsKKwkJaWYgKHBvcnQtPnVzZV9kbWEpIHsKKwkJCVJFU0VUX0RNQSg4KTsgV0FJVF9ETUEoOCk7CisJCQlwb3J0LT50cl9ydW5uaW5nID0gMDsKKwkJCXBvcnQtPm91dF9jb3VudCA9IDA7CisJCQlwb3J0LT5vdXRwID0gcG9ydC0+b3V0X2J1ZmZlcjsKKwkJCSpSX0RNQV9DSDhfQ0xSX0lOVFIgPQorCQkJCUlPX1NUQVRFKFJfRE1BX0NIOF9DTFJfSU5UUiwgY2xyX2VvcCwgZG8pIHwKKwkJCQlJT19TVEFURShSX0RNQV9DSDhfQ0xSX0lOVFIsIGNscl9kZXNjciwgZG8pOworCQl9CisJCVNFVFMoZ2VuX2NvbmZpZ19paV9zaGFkb3csIFJfR0VOX0NPTkZJR19JSSwgc2VybW9kZTEsIGFzeW5jKTsKKwl9CisJKlJfR0VOX0NPTkZJR19JSSA9IGdlbl9jb25maWdfaWlfc2hhZG93OworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTU1BfU1BFRUQ6CisJCWlmIChHRVRfU1BFRUQoYXJnKSA9PSBDT0RFQykgeworCQkJaWYgKGRldikKKwkJCQlTRVRTKHN5bmNfc2VyaWFsX3ByZXNjYWxlX3NoYWRvdywKKwkJCQkJUl9TWU5DX1NFUklBTF9QUkVTQ0FMRSwgY2xrX3NlbF91MywKKwkJCQkJY29kZWMpOworCQkJZWxzZQorCQkJCVNFVFMoc3luY19zZXJpYWxfcHJlc2NhbGVfc2hhZG93LAorCQkJCQlSX1NZTkNfU0VSSUFMX1BSRVNDQUxFLCBjbGtfc2VsX3UxLAorCQkJCQljb2RlYyk7CisKKwkJCVNFVEYoc3luY19zZXJpYWxfcHJlc2NhbGVfc2hhZG93LAorCQkJCVJfU1lOQ19TRVJJQUxfUFJFU0NBTEUsIHByZXNjYWxlciwKKwkJCQlHRVRfRlJFUShhcmcpKTsKKwkJCVNFVEYoc3luY19zZXJpYWxfcHJlc2NhbGVfc2hhZG93LAorCQkJCVJfU1lOQ19TRVJJQUxfUFJFU0NBTEUsIGZyYW1lX3JhdGUsCisJCQkJR0VUX0ZSQU1FX1JBVEUoYXJnKSk7CisJCQlTRVRGKHN5bmNfc2VyaWFsX3ByZXNjYWxlX3NoYWRvdywKKwkJCQlSX1NZTkNfU0VSSUFMX1BSRVNDQUxFLCB3b3JkX3JhdGUsCisJCQkJR0VUX1dPUkRfUkFURShhcmcpKTsKKwkJfSBlbHNlIHsKKwkJCVNFVEYocG9ydC0+Y3RybF9kYXRhX3NoYWRvdywgUl9TWU5DX1NFUklBTDFfQ1RSTCwKKwkJCQl0cl9iYXVkLCBHRVRfU1BFRUQoYXJnKSk7CisJCQlpZiAoZGV2KQorCQkJCVNFVFMoc3luY19zZXJpYWxfcHJlc2NhbGVfc2hhZG93LAorCQkJCQlSX1NZTkNfU0VSSUFMX1BSRVNDQUxFLCBjbGtfc2VsX3UzLAorCQkJCQliYXVkcmF0ZSk7CisJCQllbHNlCisJCQkJU0VUUyhzeW5jX3NlcmlhbF9wcmVzY2FsZV9zaGFkb3csCisJCQkJCVJfU1lOQ19TRVJJQUxfUFJFU0NBTEUsIGNsa19zZWxfdTEsCisJCQkJCWJhdWRyYXRlKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNTUF9NT0RFOgorCQlpZiAoYXJnID4gNSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoYXJnID09IE1BU1RFUl9PVVRQVVQgfHwgYXJnID09IFNMQVZFX09VVFBVVCkKKwkJCSpSX0lSUV9NQVNLMV9DTFIgPSAxIDw8IHBvcnQtPmRhdGFfYXZhaWxfYml0OworCQllbHNlIGlmICghcG9ydC0+dXNlX2RtYSkKKwkJCSpSX0lSUV9NQVNLMV9TRVQgPSAxIDw8IHBvcnQtPmRhdGFfYXZhaWxfYml0OworCQlTRVRGKHBvcnQtPmN0cmxfZGF0YV9zaGFkb3csIFJfU1lOQ19TRVJJQUwxX0NUUkwsIG1vZGUsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgU1NQX0ZSQU1FX1NZTkM6CisJCWlmIChhcmcgJiBOT1JNQUxfU1lOQykKKwkJCVNFVFMocG9ydC0+Y3RybF9kYXRhX3NoYWRvdywgUl9TWU5DX1NFUklBTDFfQ1RSTCwKKwkJCQlmX3N5bmN0eXBlLCBub3JtYWwpOworCQllbHNlIGlmIChhcmcgJiBFQVJMWV9TWU5DKQorCQkJU0VUUyhwb3J0LT5jdHJsX2RhdGFfc2hhZG93LCBSX1NZTkNfU0VSSUFMMV9DVFJMLAorCQkJCWZfc3luY3R5cGUsIGVhcmx5KTsKKworCQlpZiAoYXJnICYgQklUX1NZTkMpCisJCQlTRVRTKHBvcnQtPmN0cmxfZGF0YV9zaGFkb3csIFJfU1lOQ19TRVJJQUwxX0NUUkwsCisJCQkJZl9zeW5jc2l6ZSwgYml0KTsKKwkJZWxzZSBpZiAoYXJnICYgV09SRF9TWU5DKQorCQkJU0VUUyhwb3J0LT5jdHJsX2RhdGFfc2hhZG93LCBSX1NZTkNfU0VSSUFMMV9DVFJMLAorCQkJCWZfc3luY3NpemUsIHdvcmQpOworCQllbHNlIGlmIChhcmcgJiBFWFRFTkRFRF9TWU5DKQorCQkJU0VUUyhwb3J0LT5jdHJsX2RhdGFfc2hhZG93LCBSX1NZTkNfU0VSSUFMMV9DVFJMLAorCQkJCWZfc3luY3NpemUsIGV4dGVuZGVkKTsKKworCQlpZiAoYXJnICYgU1lOQ19PTikKKwkJCVNFVFMocG9ydC0+Y3RybF9kYXRhX3NoYWRvdywgUl9TWU5DX1NFUklBTDFfQ1RSTCwKKwkJCQlmX3N5bmMsIG9uKTsKKwkJZWxzZSBpZiAoYXJnICYgU1lOQ19PRkYpCisJCQlTRVRTKHBvcnQtPmN0cmxfZGF0YV9zaGFkb3csIFJfU1lOQ19TRVJJQUwxX0NUUkwsCisJCQkJZl9zeW5jLCBvZmYpOworCisJCWlmIChhcmcgJiBXT1JEX1NJWkVfOCkKKwkJCVNFVFMocG9ydC0+Y3RybF9kYXRhX3NoYWRvdywgUl9TWU5DX1NFUklBTDFfQ1RSTCwKKwkJCQl3b3Jkc2l6ZSwgc2l6ZThiaXQpOworCQllbHNlIGlmIChhcmcgJiBXT1JEX1NJWkVfMTIpCisJCQlTRVRTKHBvcnQtPmN0cmxfZGF0YV9zaGFkb3csIFJfU1lOQ19TRVJJQUwxX0NUUkwsCisJCQkJd29yZHNpemUsIHNpemUxMmJpdCk7CisJCWVsc2UgaWYgKGFyZyAmIFdPUkRfU0laRV8xNikKKwkJCVNFVFMocG9ydC0+Y3RybF9kYXRhX3NoYWRvdywgUl9TWU5DX1NFUklBTDFfQ1RSTCwKKwkJCQl3b3Jkc2l6ZSwgc2l6ZTE2Yml0KTsKKwkJZWxzZSBpZiAoYXJnICYgV09SRF9TSVpFXzI0KQorCQkJU0VUUyhwb3J0LT5jdHJsX2RhdGFfc2hhZG93LCBSX1NZTkNfU0VSSUFMMV9DVFJMLAorCQkJCXdvcmRzaXplLCBzaXplMjRiaXQpOworCQllbHNlIGlmIChhcmcgJiBXT1JEX1NJWkVfMzIpCisJCQlTRVRTKHBvcnQtPmN0cmxfZGF0YV9zaGFkb3csIFJfU1lOQ19TRVJJQUwxX0NUUkwsCisJCQkJd29yZHNpemUsIHNpemUzMmJpdCk7CisKKwkJaWYgKGFyZyAmIEJJVF9PUkRFUl9NU0IpCisJCQlTRVRTKHBvcnQtPmN0cmxfZGF0YV9zaGFkb3csIFJfU1lOQ19TRVJJQUwxX0NUUkwsCisJCQkJYml0b3JkZXIsIG1zYik7CisJCWVsc2UgaWYgKGFyZyAmIEJJVF9PUkRFUl9MU0IpCisJCQlTRVRTKHBvcnQtPmN0cmxfZGF0YV9zaGFkb3csIFJfU1lOQ19TRVJJQUwxX0NUUkwsCisJCQkJYml0b3JkZXIsIGxzYik7CisKKwkJaWYgKGFyZyAmIEZMT1dfQ09OVFJPTF9FTkFCTEUpCisJCQlTRVRTKHBvcnQtPmN0cmxfZGF0YV9zaGFkb3csIFJfU1lOQ19TRVJJQUwxX0NUUkwsCisJCQkJZmxvd19jdHJsLCBlbmFibGVkKTsKKwkJZWxzZSBpZiAoYXJnICYgRkxPV19DT05UUk9MX0RJU0FCTEUpCisJCQlTRVRTKHBvcnQtPmN0cmxfZGF0YV9zaGFkb3csIFJfU1lOQ19TRVJJQUwxX0NUUkwsCisJCQkJZmxvd19jdHJsLCBkaXNhYmxlZCk7CisKKwkJaWYgKGFyZyAmIENMT0NLX05PVF9HQVRFRCkKKwkJCVNFVFMocG9ydC0+Y3RybF9kYXRhX3NoYWRvdywgUl9TWU5DX1NFUklBTDFfQ1RSTCwKKwkJCQljbGtfbW9kZSwgbm9ybWFsKTsKKwkJZWxzZSBpZiAoYXJnICYgQ0xPQ0tfR0FURUQpCisJCQlTRVRTKHBvcnQtPmN0cmxfZGF0YV9zaGFkb3csIFJfU1lOQ19TRVJJQUwxX0NUUkwsCisJCQkJY2xrX21vZGUsIGdhdGVkKTsKKworCQlicmVhazsKKwljYXNlIFNTUF9JUE9MQVJJVFk6CisJCS8qIE5PVEUhISBuZWdlZGdlIGlzIGNvbnNpZGVyZWQgTk9STUFMICovCisJCWlmIChhcmcgJiBDTE9DS19OT1JNQUwpCisJCQlTRVRTKHBvcnQtPmN0cmxfZGF0YV9zaGFkb3csIFJfU1lOQ19TRVJJQUwxX0NUUkwsCisJCQkJY2xrX3BvbGFyaXR5LCBuZWcpOworCQllbHNlIGlmIChhcmcgJiBDTE9DS19JTlZFUlQpCisJCQlTRVRTKHBvcnQtPmN0cmxfZGF0YV9zaGFkb3csIFJfU1lOQ19TRVJJQUwxX0NUUkwsCisJCQkJY2xrX3BvbGFyaXR5LCBwb3MpOworCisJCWlmIChhcmcgJiBGUkFNRV9OT1JNQUwpCisJCQlTRVRTKHBvcnQtPmN0cmxfZGF0YV9zaGFkb3csIFJfU1lOQ19TRVJJQUwxX0NUUkwsCisJCQkJZnJhbWVfcG9sYXJpdHksIG5vcm1hbCk7CisJCWVsc2UgaWYgKGFyZyAmIEZSQU1FX0lOVkVSVCkKKwkJCVNFVFMocG9ydC0+Y3RybF9kYXRhX3NoYWRvdywgUl9TWU5DX1NFUklBTDFfQ1RSTCwKKwkJCQlmcmFtZV9wb2xhcml0eSwgaW52ZXJ0ZWQpOworCisJCWlmIChhcmcgJiBTVEFUVVNfTk9STUFMKQorCQkJU0VUUyhwb3J0LT5jdHJsX2RhdGFfc2hhZG93LCBSX1NZTkNfU0VSSUFMMV9DVFJMLAorCQkJCXN0YXR1c19wb2xhcml0eSwgbm9ybWFsKTsKKwkJZWxzZSBpZiAoYXJnICYgU1RBVFVTX0lOVkVSVCkKKwkJCVNFVFMocG9ydC0+Y3RybF9kYXRhX3NoYWRvdywgUl9TWU5DX1NFUklBTDFfQ1RSTCwKKwkJCQlzdGF0dXNfcG9sYXJpdHksIGludmVydGVkKTsKKwkJYnJlYWs7CisJY2FzZSBTU1BfT1BPTEFSSVRZOgorCQlpZiAoYXJnICYgQ0xPQ0tfTk9STUFMKQorCQkJU0VUUyhwb3J0LT5jdHJsX2RhdGFfc2hhZG93LCBSX1NZTkNfU0VSSUFMMV9DVFJMLAorCQkJCWNsa19kcml2ZXIsIG5vcm1hbCk7CisJCWVsc2UgaWYgKGFyZyAmIENMT0NLX0lOVkVSVCkKKwkJCVNFVFMocG9ydC0+Y3RybF9kYXRhX3NoYWRvdywgUl9TWU5DX1NFUklBTDFfQ1RSTCwKKwkJCQljbGtfZHJpdmVyLCBpbnZlcnRlZCk7CisKKwkJaWYgKGFyZyAmIEZSQU1FX05PUk1BTCkKKwkJCVNFVFMocG9ydC0+Y3RybF9kYXRhX3NoYWRvdywgUl9TWU5DX1NFUklBTDFfQ1RSTCwKKwkJCQlmcmFtZV9kcml2ZXIsIG5vcm1hbCk7CisJCWVsc2UgaWYgKGFyZyAmIEZSQU1FX0lOVkVSVCkKKwkJCVNFVFMocG9ydC0+Y3RybF9kYXRhX3NoYWRvdywgUl9TWU5DX1NFUklBTDFfQ1RSTCwKKwkJCQlmcmFtZV9kcml2ZXIsIGludmVydGVkKTsKKworCQlpZiAoYXJnICYgU1RBVFVTX05PUk1BTCkKKwkJCVNFVFMocG9ydC0+Y3RybF9kYXRhX3NoYWRvdywgUl9TWU5DX1NFUklBTDFfQ1RSTCwKKwkJCQlzdGF0dXNfZHJpdmVyLCBub3JtYWwpOworCQllbHNlIGlmIChhcmcgJiBTVEFUVVNfSU5WRVJUKQorCQkJU0VUUyhwb3J0LT5jdHJsX2RhdGFfc2hhZG93LCBSX1NZTkNfU0VSSUFMMV9DVFJMLAorCQkJCXN0YXR1c19kcml2ZXIsIGludmVydGVkKTsKKwkJYnJlYWs7CisJY2FzZSBTU1BfU1BJOgorCQlTRVRTKHBvcnQtPmN0cmxfZGF0YV9zaGFkb3csIFJfU1lOQ19TRVJJQUwxX0NUUkwsIGZsb3dfY3RybCwKKwkJCWRpc2FibGVkKTsKKwkJU0VUUyhwb3J0LT5jdHJsX2RhdGFfc2hhZG93LCBSX1NZTkNfU0VSSUFMMV9DVFJMLCBiaXRvcmRlciwKKwkJCW1zYik7CisJCVNFVFMocG9ydC0+Y3RybF9kYXRhX3NoYWRvdywgUl9TWU5DX1NFUklBTDFfQ1RSTCwgd29yZHNpemUsCisJCQlzaXplOGJpdCk7CisJCVNFVFMocG9ydC0+Y3RybF9kYXRhX3NoYWRvdywgUl9TWU5DX1NFUklBTDFfQ1RSTCwgZl9zeW5jLCBvbik7CisJCVNFVFMocG9ydC0+Y3RybF9kYXRhX3NoYWRvdywgUl9TWU5DX1NFUklBTDFfQ1RSTCwgZl9zeW5jc2l6ZSwKKwkJCXdvcmQpOworCQlTRVRTKHBvcnQtPmN0cmxfZGF0YV9zaGFkb3csIFJfU1lOQ19TRVJJQUwxX0NUUkwsIGZfc3luY3R5cGUsCisJCQlub3JtYWwpOworCQlpZiAoYXJnICYgU1BJX1NMQVZFKSB7CisJCQlTRVRTKHBvcnQtPmN0cmxfZGF0YV9zaGFkb3csIFJfU1lOQ19TRVJJQUwxX0NUUkwsCisJCQkJZnJhbWVfcG9sYXJpdHksIGludmVydGVkKTsKKwkJCVNFVFMocG9ydC0+Y3RybF9kYXRhX3NoYWRvdywgUl9TWU5DX1NFUklBTDFfQ1RSTCwKKwkJCQljbGtfcG9sYXJpdHksIG5lZyk7CisJCQlTRVRGKHBvcnQtPmN0cmxfZGF0YV9zaGFkb3csIFJfU1lOQ19TRVJJQUwxX0NUUkwsCisJCQkJbW9kZSwgU0xBVkVfSU5QVVQpOworCQl9IGVsc2UgeworCQkJU0VUUyhwb3J0LT5jdHJsX2RhdGFfc2hhZG93LCBSX1NZTkNfU0VSSUFMMV9DVFJMLAorCQkJCWZyYW1lX2RyaXZlciwgaW52ZXJ0ZWQpOworCQkJU0VUUyhwb3J0LT5jdHJsX2RhdGFfc2hhZG93LCBSX1NZTkNfU0VSSUFMMV9DVFJMLAorCQkJCWNsa19kcml2ZXIsIGludmVydGVkKTsKKwkJCVNFVEYocG9ydC0+Y3RybF9kYXRhX3NoYWRvdywgUl9TWU5DX1NFUklBTDFfQ1RSTCwKKwkJCQltb2RlLCBNQVNURVJfT1VUUFVUKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNTUF9JTkJVRkNIVU5LOgorI2lmIDAKKwkJaWYgKGFyZyA+IHBvcnQtPmluX2J1ZmZlcl9zaXplL05VTV9JTl9ERVNDUikKKwkJCXJldHVybiAtRUlOVkFMOworCQlwb3J0LT5pbmJ1ZmNodW5rID0gYXJnOworCQkvKiBNYWtlIHN1cmUgaW5fYnVmZmVyX3NpemUgaXMgYSBtdWx0aXBsZSBvZiBpbmJ1ZmNodW5rICovCisJCXBvcnQtPmluX2J1ZmZlcl9zaXplID0KKwkJCShwb3J0LT5pbl9idWZmZXJfc2l6ZS9wb3J0LT5pbmJ1ZmNodW5rKSAqCisJCQlwb3J0LT5pbmJ1ZmNodW5rOworCQlERUJVRyhwcmludGsoS0VSTl9ERUJVRyAiaW5idWZjaHVuayAlaSBpbl9idWZmZXJfc2l6ZTogJWlcbiIsCisJCQlwb3J0LT5pbmJ1ZmNodW5rLCBwb3J0LT5pbl9idWZmZXJfc2l6ZSkpOworCQlpZiAocG9ydC0+dXNlX2RtYSkgeworCQkJaWYgKHBvcnQtPnBvcnRfbmJyID09IDApIHsKKwkJCQlSRVNFVF9ETUEoOSk7CisJCQkJV0FJVF9ETUEoOSk7CisJCQl9IGVsc2UgeworCQkJCVJFU0VUX0RNQSg1KTsKKwkJCQlXQUlUX0RNQSg1KTsKKwkJCX0KKwkJCXN0YXJ0X2RtYV9pbihwb3J0KTsKKwkJfQorI2VuZGlmCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybl92YWwgPSAtMTsKKwl9CisJLyogTWFrZSBzdXJlIHdlIHdyaXRlIHRoZSBjb25maWcgd2l0aG91dCBpbnRlcnJ1cHRpb24gKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJLyogU2V0IGNvbmZpZyBhbmQgZW5hYmxlIHBvcnQgKi8KKwkqcG9ydC0+Y3RybF9kYXRhID0gcG9ydC0+Y3RybF9kYXRhX3NoYWRvdzsKKwlub3AoKTsgbm9wKCk7IG5vcCgpOyBub3AoKTsKKwkqUl9TWU5DX1NFUklBTF9QUkVTQ0FMRSA9IHN5bmNfc2VyaWFsX3ByZXNjYWxlX3NoYWRvdzsKKwlub3AoKTsgbm9wKCk7IG5vcCgpOyBub3AoKTsKKwlpZiAoZGV2KQorCQlTRVRTKGdlbl9jb25maWdfaWlfc2hhZG93LCBSX0dFTl9DT05GSUdfSUksIHNlcm1vZGUzLCBzeW5jKTsKKwllbHNlCisJCVNFVFMoZ2VuX2NvbmZpZ19paV9zaGFkb3csIFJfR0VOX0NPTkZJR19JSSwgc2VybW9kZTEsIHN5bmMpOworCisJKlJfR0VOX0NPTkZJR19JSSA9IGdlbl9jb25maWdfaWlfc2hhZG93OworCS8qIFJlc2V0IERNQS4gQXQgcmVhZG91dCBmcm9tIHNlcmlhbCBwb3J0IHRoZSBkYXRhIGNvdWxkIGJlIHNoaWZ0ZWQKKwkgKiBvbmUgYnl0ZSBpZiBub3QgcmVzZXR0aW5nIERNQS4KKwkgKi8KKwlpZiAocG9ydC0+dXNlX2RtYSkgeworCQlpZiAocG9ydC0+cG9ydF9uYnIgPT0gMCkgeworCQkJUkVTRVRfRE1BKDkpOworCQkJV0FJVF9ETUEoOSk7CisJCX0gZWxzZSB7CisJCQlSRVNFVF9ETUEoNSk7CisJCQlXQUlUX0RNQSg1KTsKKwkJfQorCQlzdGFydF9kbWFfaW4ocG9ydCk7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gcmV0dXJuX3ZhbDsKK30KKworCitzdGF0aWMgc3NpemVfdCBzeW5jX3NlcmlhbF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLAorCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWludCBkZXYgPSBNSU5PUihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9yZGV2KTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3Qgc3luY19wb3J0ICpwb3J0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBjLCBjMTsKKwl1bnNpZ25lZCBsb25nIGZyZWVfb3V0cDsKKwl1bnNpZ25lZCBsb25nIG91dHA7CisJdW5zaWduZWQgbG9uZyBvdXRfYnVmZmVyOworCisJaWYgKGRldiA8IDAgfHwgZGV2ID49IE5VTUJFUl9PRl9QT1JUUyB8fCAhcG9ydHNbZGV2XS5lbmFibGVkKSB7CisJCURFQlVHKHByaW50ayhLRVJOX0RFQlVHICJJbnZhbGlkIG1pbm9yICVkXG4iLCBkZXYpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXBvcnQgPSAmcG9ydHNbZGV2XTsKKworCURFQlVHV1JJVEUocHJpbnRrKEtFUk5fREVCVUcgIlcgZCVkIGMgJWx1ICglZC8lZClcbiIsCisJCXBvcnQtPnBvcnRfbmJyLCBjb3VudCwgcG9ydC0+b3V0X2NvdW50LCBPVVRfQlVGRkVSX1NJWkUpKTsKKwkvKiBTcGFjZSB0byBlbmQgb2YgYnVmZmVyICovCisJLyoKKwkgKiBvdXRfYnVmZmVyIDxjMT4wMTIzNDU8LSAgIGMgICAgLT5PVVRfQlVGRkVSX1NJWkUKKwkgKiAgICAgICAgICAgIG91dHBeICAgICtvdXRfY291bnQKKwkgKiAgICAgICAgICAgICAgICAgICAgICBeZnJlZV9vdXRwCisJICogb3V0X2J1ZmZlciA0NTwtICAgICBjICAgICAgLT4wMTIzT1VUX0JVRkZFUl9TSVpFCisJICogICAgICAgICAgICAgK291dF9jb3VudCAgIG91dHBeCisJICogICAgICAgICAgICAgIGZyZWVfb3V0cAorCSAqCisJICovCisKKwkvKiBSZWFkIHZhcmlhYmxlcyB0aGF0IG1heSBiZSB1cGRhdGVkIGJ5IGludGVycnVwdHMgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKGNvdW50ID4gT1VUX0JVRkZFUl9TSVpFIC0gcG9ydC0+b3V0X2NvdW50KQorCQljb3VudCA9IE9VVF9CVUZGRVJfU0laRSAtIHBvcnQtPm91dF9jb3VudDsKKworCW91dHAgPSAodW5zaWduZWQgbG9uZylwb3J0LT5vdXRwOworCWZyZWVfb3V0cCA9IG91dHAgKyBwb3J0LT5vdXRfY291bnQ7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCW91dF9idWZmZXIgPSAodW5zaWduZWQgbG9uZylwb3J0LT5vdXRfYnVmZmVyOworCisJLyogRmluZCBvdXQgd2hlcmUgYW5kIGhvdyBtdWNoIHRvIHdyaXRlICovCisJaWYgKGZyZWVfb3V0cCA+PSBvdXRfYnVmZmVyICsgT1VUX0JVRkZFUl9TSVpFKQorCQlmcmVlX291dHAgLT0gT1VUX0JVRkZFUl9TSVpFOworCWlmIChmcmVlX291dHAgPj0gb3V0cCkKKwkJYyA9IG91dF9idWZmZXIgKyBPVVRfQlVGRkVSX1NJWkUgLSBmcmVlX291dHA7CisJZWxzZQorCQljID0gb3V0cCAtIGZyZWVfb3V0cDsKKwlpZiAoYyA+IGNvdW50KQorCQljID0gY291bnQ7CisKKwlERUJVR1dSSVRFKHByaW50ayhLRVJOX0RFQlVHICJ3IG9wICUwOGxYIGZvcCAlMDhsWCBjICVsdVxuIiwKKwkJb3V0cCwgZnJlZV9vdXRwLCBjKSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopZnJlZV9vdXRwLCBidWYsIGMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjICE9IGNvdW50KSB7CisJCWJ1ZiArPSBjOworCQljMSA9IGNvdW50IC0gYzsKKwkJREVCVUdXUklURShwcmludGsoS0VSTl9ERUJVRyAidzIgZmkgJWx1IGMgJWx1IGMxICVsdVxuIiwKKwkJCWZyZWVfb3V0cC1vdXRfYnVmZmVyLCBjLCBjMSkpOworCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKilvdXRfYnVmZmVyLCBidWYsIGMxKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJcG9ydC0+b3V0X2NvdW50ICs9IGNvdW50OworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCS8qIE1ha2Ugc3VyZSB0cmFuc21pdHRlci9yZWNlaXZlciBpcyBydW5uaW5nICovCisJaWYgKCFwb3J0LT5zdGFydGVkKSB7CisJCVNFVFMocG9ydC0+Y3RybF9kYXRhX3NoYWRvdywgUl9TWU5DX1NFUklBTDFfQ1RSTCwgY2xrX2hhbHQsCisJCQlydW5uaW5nKTsKKwkJU0VUUyhwb3J0LT5jdHJsX2RhdGFfc2hhZG93LCBSX1NZTkNfU0VSSUFMMV9DVFJMLCB0cl9lbmFibGUsCisJCQllbmFibGUpOworCQlTRVRTKHBvcnQtPmN0cmxfZGF0YV9zaGFkb3csIFJfU1lOQ19TRVJJQUwxX0NUUkwsIHJlY19lbmFibGUsCisJCQllbmFibGUpOworCQlwb3J0LT5zdGFydGVkID0gMTsKKwl9CisKKwkqcG9ydC0+Y3RybF9kYXRhID0gcG9ydC0+Y3RybF9kYXRhX3NoYWRvdzsKKworCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykJeworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCWlmICghcG9ydC0+dHJfcnVubmluZykgeworCQkJaWYgKCFwb3J0LT51c2VfZG1hKSB7CisJCQkJLyogU3RhcnQgc2VuZGVyIGJ5IHdyaXRpbmcgZGF0YSAqLworCQkJCXNlbmRfd29yZChwb3J0KTsKKwkJCQkvKiBhbmQgZW5hYmxlIHRyYW5zbWl0dGVyIHJlYWR5IElSUSAqLworCQkJCSpSX0lSUV9NQVNLMV9TRVQgPSAxIDw8CisJCQkJCXBvcnQtPnRyYW5zbWl0dGVyX3JlYWR5X2JpdDsKKwkJCX0gZWxzZQorCQkJCXN0YXJ0X2RtYShwb3J0LAorCQkJCQkodW5zaWduZWQgY2hhciAqdm9sYXRpbGUpcG9ydC0+b3V0cCwgYyk7CisJCX0KKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlERUJVR1dSSVRFKHByaW50ayhLRVJOX0RFQlVHICJ3IGQlZCBjICVsdSBOQlxuIiwKKwkJCXBvcnQtPnBvcnRfbmJyLCBjb3VudCkpOworCQlyZXR1cm4gY291bnQ7CisJfQorCisJLyogU2xlZXAgdW50aWwgYWxsIHNlbnQgKi8KKwlhZGRfd2FpdF9xdWV1ZSgmcG9ydC0+b3V0X3dhaXRfcSwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmICghcG9ydC0+dHJfcnVubmluZykgeworCQlpZiAoIXBvcnQtPnVzZV9kbWEpIHsKKwkJCS8qIFN0YXJ0IHNlbmRlciBieSB3cml0aW5nIGRhdGEgKi8KKwkJCXNlbmRfd29yZChwb3J0KTsKKwkJCS8qIGFuZCBlbmFibGUgdHJhbnNtaXR0ZXIgcmVhZHkgSVJRICovCisJCQkqUl9JUlFfTUFTSzFfU0VUID0gMSA8PCBwb3J0LT50cmFuc21pdHRlcl9yZWFkeV9iaXQ7CisJCX0gZWxzZQorCQkJc3RhcnRfZG1hKHBvcnQsIHBvcnQtPm91dHAsIGMpOworCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJc2NoZWR1bGUoKTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZwb3J0LT5vdXRfd2FpdF9xLCAmd2FpdCk7CisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXR1cm4gLUVJTlRSOworCisJREVCVUdXUklURShwcmludGsoS0VSTl9ERUJVRyAidyBkJWQgYyAlbHVcbiIsIHBvcnQtPnBvcnRfbmJyLCBjb3VudCkpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc3luY19zZXJpYWxfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLAorCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWludCBkZXYgPSBNSU5PUihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9yZGV2KTsKKwlpbnQgYXZhaWw7CisJc3RydWN0IHN5bmNfcG9ydCAqcG9ydDsKKwl1bnNpZ25lZCBjaGFyICpzdGFydDsKKwl1bnNpZ25lZCBjaGFyICplbmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZXYgPCAwIHx8IGRldiA+PSBOVU1CRVJfT0ZfUE9SVFMgfHwgIXBvcnRzW2Rldl0uZW5hYmxlZCkgeworCQlERUJVRyhwcmludGsoS0VSTl9ERUJVRyAiSW52YWxpZCBtaW5vciAlZFxuIiwgZGV2KSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlwb3J0ID0gJnBvcnRzW2Rldl07CisKKwlERUJVR1JFQUQocHJpbnRrKEtFUk5fREVCVUcgIlIlZCBjICVkIHJpICVsdSB3aSAlbHUgLyVsdVxuIiwKKwkJZGV2LCBjb3VudCwgcG9ydC0+cmVhZHAgLSBwb3J0LT5mbGlwLAorCQlwb3J0LT53cml0ZXAgLSBwb3J0LT5mbGlwLCBwb3J0LT5pbl9idWZmZXJfc2l6ZSkpOworCisJaWYgKCFwb3J0LT5zdGFydGVkKSB7CisJCVNFVFMocG9ydC0+Y3RybF9kYXRhX3NoYWRvdywgUl9TWU5DX1NFUklBTDFfQ1RSTCwgY2xrX2hhbHQsCisJCQlydW5uaW5nKTsKKwkJU0VUUyhwb3J0LT5jdHJsX2RhdGFfc2hhZG93LCBSX1NZTkNfU0VSSUFMMV9DVFJMLCB0cl9lbmFibGUsCisJCQllbmFibGUpOworCQlTRVRTKHBvcnQtPmN0cmxfZGF0YV9zaGFkb3csIFJfU1lOQ19TRVJJQUwxX0NUUkwsIHJlY19lbmFibGUsCisJCQllbmFibGUpOworCQlwb3J0LT5zdGFydGVkID0gMTsKKwl9CisJKnBvcnQtPmN0cmxfZGF0YSA9IHBvcnQtPmN0cmxfZGF0YV9zaGFkb3c7CisKKwkvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBieXRlcyAqLworCS8qIFNhdmUgcG9pbnRlcnMgdG8gYXZvaWQgdGhhdCB0aGV5IGFyZSBtb2RpZmllZCBieSBpbnRlcnJ1cHQgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJc3RhcnQgPSAodW5zaWduZWQgY2hhciAqKXBvcnQtPnJlYWRwOyAvKiBjYXN0IGF3YXkgdm9sYXRpbGUgKi8KKwllbmQgPSAodW5zaWduZWQgY2hhciAqKXBvcnQtPndyaXRlcDsgIC8qIGNhc3QgYXdheSB2b2xhdGlsZSAqLworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwl3aGlsZSAoc3RhcnQgPT0gZW5kICYmICFwb3J0LT5mdWxsKSB7CisJCS8qIE5vIGRhdGEgKi8KKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJcmV0dXJuIC1FQUdBSU47CisKKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcG9ydC0+aW5fd2FpdF9xKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0dXJuIC1FSU5UUjsKKworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCXN0YXJ0ID0gKHVuc2lnbmVkIGNoYXIgKilwb3J0LT5yZWFkcDsgLyogY2FzdCBhd2F5IHZvbGF0aWxlICovCisJCWVuZCA9ICh1bnNpZ25lZCBjaGFyICopcG9ydC0+d3JpdGVwOyAgLyogY2FzdCBhd2F5IHZvbGF0aWxlICovCisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwl9CisKKwkvKiBMYXp5IHJlYWQsIG5ldmVyIHJldHVybiB3cmFwcGVkIGRhdGEuICovCisJaWYgKHBvcnQtPmZ1bGwpCisJCWF2YWlsID0gcG9ydC0+aW5fYnVmZmVyX3NpemU7CisJZWxzZSBpZiAoZW5kID4gc3RhcnQpCisJCWF2YWlsID0gZW5kIC0gc3RhcnQ7CisJZWxzZQorCQlhdmFpbCA9IHBvcnQtPmZsaXAgKyBwb3J0LT5pbl9idWZmZXJfc2l6ZSAtIHN0YXJ0OworCisJY291bnQgPSBjb3VudCA+IGF2YWlsID8gYXZhaWwgOiBjb3VudDsKKwlpZiAoY29weV90b191c2VyKGJ1Ziwgc3RhcnQsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIHdoaWxlIHVwZGF0aW5nIHJlYWRwICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXBvcnQtPnJlYWRwICs9IGNvdW50OworCWlmIChwb3J0LT5yZWFkcCA+PSBwb3J0LT5mbGlwICsgcG9ydC0+aW5fYnVmZmVyX3NpemUpIC8qIFdyYXA/ICovCisJCXBvcnQtPnJlYWRwID0gcG9ydC0+ZmxpcDsKKwlwb3J0LT5mdWxsID0gMDsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJREVCVUdSRUFEKHByaW50ayhLRVJOX0RFQlVHICJyICVkXG4iLCBjb3VudCkpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHZvaWQgc2VuZF93b3JkKHN0cnVjdCBzeW5jX3BvcnQgKnBvcnQpCit7CisJc3dpdGNoIChJT19FWFRSQUNUKFJfU1lOQ19TRVJJQUwxX0NUUkwsIHdvcmRzaXplLAorCQkJcG9ydC0+Y3RybF9kYXRhX3NoYWRvdykpIHsKKwljYXNlIElPX1NUQVRFX1ZBTFVFKFJfU1lOQ19TRVJJQUwxX0NUUkwsIHdvcmRzaXplLCBzaXplOGJpdCk6CisJCSBwb3J0LT5vdXRfY291bnQtLTsKKwkJICpwb3J0LT5kYXRhX291dCA9ICpwb3J0LT5vdXRwKys7CisJCSBpZiAocG9ydC0+b3V0cCA+PSBwb3J0LT5vdXRfYnVmZmVyICsgT1VUX0JVRkZFUl9TSVpFKQorCQkJIHBvcnQtPm91dHAgPSBwb3J0LT5vdXRfYnVmZmVyOworCQkgYnJlYWs7CisJY2FzZSBJT19TVEFURV9WQUxVRShSX1NZTkNfU0VSSUFMMV9DVFJMLCB3b3Jkc2l6ZSwgc2l6ZTEyYml0KToKKwl7CisJCWludCBkYXRhID0gKCpwb3J0LT5vdXRwKyspIDw8IDg7CisJCWRhdGEgfD0gKnBvcnQtPm91dHArKzsKKwkJcG9ydC0+b3V0X2NvdW50IC09IDI7CisJCSpwb3J0LT5kYXRhX291dCA9IGRhdGE7CisJCWlmIChwb3J0LT5vdXRwID49IHBvcnQtPm91dF9idWZmZXIgKyBPVVRfQlVGRkVSX1NJWkUpCisJCQlwb3J0LT5vdXRwID0gcG9ydC0+b3V0X2J1ZmZlcjsKKwkJYnJlYWs7CisJfQorCWNhc2UgSU9fU1RBVEVfVkFMVUUoUl9TWU5DX1NFUklBTDFfQ1RSTCwgd29yZHNpemUsIHNpemUxNmJpdCk6CisJCXBvcnQtPm91dF9jb3VudCAtPSAyOworCQkqcG9ydC0+ZGF0YV9vdXQgPSAqKHVuc2lnbmVkIHNob3J0ICopcG9ydC0+b3V0cDsKKwkJcG9ydC0+b3V0cCArPSAyOworCQlpZiAocG9ydC0+b3V0cCA+PSBwb3J0LT5vdXRfYnVmZmVyICsgT1VUX0JVRkZFUl9TSVpFKQorCQkJcG9ydC0+b3V0cCA9IHBvcnQtPm91dF9idWZmZXI7CisJCWJyZWFrOworCWNhc2UgSU9fU1RBVEVfVkFMVUUoUl9TWU5DX1NFUklBTDFfQ1RSTCwgd29yZHNpemUsIHNpemUyNGJpdCk6CisJCXBvcnQtPm91dF9jb3VudCAtPSAzOworCQkqcG9ydC0+ZGF0YV9vdXQgPSAqKHVuc2lnbmVkIGludCAqKXBvcnQtPm91dHA7CisJCXBvcnQtPm91dHAgKz0gMzsKKwkJaWYgKHBvcnQtPm91dHAgPj0gcG9ydC0+b3V0X2J1ZmZlciArIE9VVF9CVUZGRVJfU0laRSkKKwkJCXBvcnQtPm91dHAgPSBwb3J0LT5vdXRfYnVmZmVyOworCQlicmVhazsKKwljYXNlIElPX1NUQVRFX1ZBTFVFKFJfU1lOQ19TRVJJQUwxX0NUUkwsIHdvcmRzaXplLCBzaXplMzJiaXQpOgorCQlwb3J0LT5vdXRfY291bnQgLT0gNDsKKwkJKnBvcnQtPmRhdGFfb3V0ID0gKih1bnNpZ25lZCBpbnQgKilwb3J0LT5vdXRwOworCQlwb3J0LT5vdXRwICs9IDQ7CisJCWlmIChwb3J0LT5vdXRwID49IHBvcnQtPm91dF9idWZmZXIgKyBPVVRfQlVGRkVSX1NJWkUpCisJCQlwb3J0LT5vdXRwID0gcG9ydC0+b3V0X2J1ZmZlcjsKKwkJYnJlYWs7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHN0YXJ0X2RtYShzdHJ1Y3Qgc3luY19wb3J0ICpwb3J0LCBjb25zdCBjaGFyICpkYXRhLCBpbnQgY291bnQpCit7CisJcG9ydC0+dHJfcnVubmluZyA9IDE7CisJcG9ydC0+b3V0X2Rlc2NyLmh3X2xlbiA9IDA7CisJcG9ydC0+b3V0X2Rlc2NyLm5leHQgPSAwOworCXBvcnQtPm91dF9kZXNjci5jdHJsID0gZF9lb2wgfCBkX2VvcDsgLyogTm8gZF93YWl0IHRvIGF2b2lkIGdsaXRjaGVzICovCisJcG9ydC0+b3V0X2Rlc2NyLnN3X2xlbiA9IGNvdW50OworCXBvcnQtPm91dF9kZXNjci5idWYgPSB2aXJ0X3RvX3BoeXMoZGF0YSk7CisJcG9ydC0+b3V0X2Rlc2NyLnN0YXR1cyA9IDA7CisKKwkqcG9ydC0+b3V0cHV0X2RtYV9maXJzdCA9IHZpcnRfdG9fcGh5cygmcG9ydC0+b3V0X2Rlc2NyKTsKKwkqcG9ydC0+b3V0cHV0X2RtYV9jbWQgPSBJT19TVEFURShSX0RNQV9DSDBfQ01ELCBjbWQsIHN0YXJ0KTsKKwlERUJVR1RYSU5UKHByaW50ayhLRVJOX0RFQlVHICJkbWEgJTA4bFggYyAlZFxuIiwKKwkJKHVuc2lnbmVkIGxvbmcpZGF0YSwgY291bnQpKTsKK30KKworc3RhdGljIHZvaWQgc3RhcnRfZG1hX2luKHN0cnVjdCBzeW5jX3BvcnQgKnBvcnQpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBidWY7CisJcG9ydC0+d3JpdGVwID0gcG9ydC0+ZmxpcDsKKworCWlmIChwb3J0LT53cml0ZXAgPiBwb3J0LT5mbGlwICsgcG9ydC0+aW5fYnVmZmVyX3NpemUpIHsKKwkJcGFuaWMoIk9mZnNldCB0b28gbGFyZ2UgaW4gc3luYyBzZXJpYWwgZHJpdmVyXG4iKTsKKwkJcmV0dXJuOworCX0KKwlidWYgPSB2aXJ0X3RvX3BoeXMocG9ydC0+aW5fYnVmZmVyKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0lOX0RFU0NSOyBpKyspIHsKKwkJcG9ydC0+aW5fZGVzY3JbaV0uc3dfbGVuID0gcG9ydC0+aW5idWZjaHVuazsKKwkJcG9ydC0+aW5fZGVzY3JbaV0uY3RybCA9IGRfaW50OworCQlwb3J0LT5pbl9kZXNjcltpXS5uZXh0ID0gdmlydF90b19waHlzKCZwb3J0LT5pbl9kZXNjcltpKzFdKTsKKwkJcG9ydC0+aW5fZGVzY3JbaV0uYnVmID0gYnVmOworCQlwb3J0LT5pbl9kZXNjcltpXS5od19sZW4gPSAwOworCQlwb3J0LT5pbl9kZXNjcltpXS5zdGF0dXMgPSAwOworCQlwb3J0LT5pbl9kZXNjcltpXS5maWZvX2xlbiA9IDA7CisJCWJ1ZiArPSBwb3J0LT5pbmJ1ZmNodW5rOworCQlwcmVwYXJlX3J4X2Rlc2NyaXB0b3IoJnBvcnQtPmluX2Rlc2NyW2ldKTsKKwl9CisJLyogTGluayB0aGUgbGFzdCBkZXNjcmlwdG9yIHRvIHRoZSBmaXJzdCAqLworCXBvcnQtPmluX2Rlc2NyW2ktMV0ubmV4dCA9IHZpcnRfdG9fcGh5cygmcG9ydC0+aW5fZGVzY3JbMF0pOworCXBvcnQtPmluX2Rlc2NyW2ktMV0uY3RybCB8PSBkX2VvbDsKKwlwb3J0LT5uZXh0X3J4X2Rlc2MgPSAmcG9ydC0+aW5fZGVzY3JbMF07CisJcG9ydC0+cHJldl9yeF9kZXNjID0gJnBvcnQtPmluX2Rlc2NyW05VTV9JTl9ERVNDUiAtIDFdOworCSpwb3J0LT5pbnB1dF9kbWFfZmlyc3QgPSB2aXJ0X3RvX3BoeXMocG9ydC0+bmV4dF9yeF9kZXNjKTsKKwkqcG9ydC0+aW5wdXRfZG1hX2NtZCA9IElPX1NUQVRFKFJfRE1BX0NIMF9DTUQsIGNtZCwgc3RhcnQpOworfQorCisjaWZkZWYgU1lOQ19TRVJfRE1BCitzdGF0aWMgaXJxcmV0dXJuX3QgdHJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGlyZWcgPSAqUl9JUlFfTUFTSzJfUkQ7CisJc3RydWN0IGV0cmF4X2RtYV9kZXNjciAqZGVzY3I7CisJdW5zaWduZWQgaW50IHNlbnRsOworCWludCBoYW5kbGVkID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1CRVJfT0ZfUE9SVFM7IGkrKykgeworCQlzdHJ1Y3Qgc3luY19wb3J0ICpwb3J0ID0gJnBvcnRzW2ldOworCQlpZiAoIXBvcnQtPmVuYWJsZWQgIHx8ICFwb3J0LT51c2VfZG1hKQorCQkJY29udGludWU7CisKKwkJLyogSVJRIGFjdGl2ZSBmb3IgdGhlIHBvcnQ/ICovCisJCWlmICghKGlyZWcgJiAoMSA8PCBwb3J0LT5vdXRwdXRfZG1hX2JpdCkpKQorCQkJY29udGludWU7CisKKwkJaGFuZGxlZCA9IDE7CisKKwkJLyogQ2xlYXIgSVJRICovCisJCSpwb3J0LT5vdXRwdXRfZG1hX2Nscl9pcnEgPQorCQkJSU9fU1RBVEUoUl9ETUFfQ0gwX0NMUl9JTlRSLCBjbHJfZW9wLCBkbykgfAorCQkJSU9fU1RBVEUoUl9ETUFfQ0gwX0NMUl9JTlRSLCBjbHJfZGVzY3IsIGRvKTsKKworCQlkZXNjciA9ICZwb3J0LT5vdXRfZGVzY3I7CisJCWlmICghKGRlc2NyLT5zdGF0dXMgJiBkX3N0b3ApKQorCQkJc2VudGwgPSBkZXNjci0+c3dfbGVuOworCQllbHNlCisJCQkvKiBPdGhlcndpc2UgZmluZCBhbW91bnQgb2YgZGF0YSBzZW50IGhlcmUgKi8KKwkJCXNlbnRsID0gZGVzY3ItPmh3X2xlbjsKKworCQlwb3J0LT5vdXRfY291bnQgLT0gc2VudGw7CisJCXBvcnQtPm91dHAgKz0gc2VudGw7CisJCWlmIChwb3J0LT5vdXRwID49IHBvcnQtPm91dF9idWZmZXIgKyBPVVRfQlVGRkVSX1NJWkUpCisJCQlwb3J0LT5vdXRwID0gcG9ydC0+b3V0X2J1ZmZlcjsKKwkJaWYgKHBvcnQtPm91dF9jb3VudCkgeworCQkJaW50IGMgPSBwb3J0LT5vdXRfYnVmZmVyICsgT1VUX0JVRkZFUl9TSVpFIC0gcG9ydC0+b3V0cDsKKwkJCWlmIChjID4gcG9ydC0+b3V0X2NvdW50KQorCQkJCWMgPSBwb3J0LT5vdXRfY291bnQ7CisJCQlERUJVR1RYSU5UKHByaW50ayhLRVJOX0RFQlVHCisJCQkJInR4X2ludCBETUFXUklURSAlaSAlaVxuIiwgc2VudGwsIGMpKTsKKwkJCXN0YXJ0X2RtYShwb3J0LCBwb3J0LT5vdXRwLCBjKTsKKwkJfSBlbHNlICB7CisJCQlERUJVR1RYSU5UKHByaW50ayhLRVJOX0RFQlVHCisJCQkJInR4X2ludCBETUEgc3RvcCAlaVxuIiwgc2VudGwpKTsKKwkJCXBvcnQtPnRyX3J1bm5pbmcgPSAwOworCQl9CisJCS8qIHdha2UgdXAgdGhlIHdhaXRpbmcgcHJvY2VzcyAqLworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPm91dF93YWl0X3EpOworCX0KKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30gLyogdHJfaW50ZXJydXB0ICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCByeF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXVuc2lnbmVkIGxvbmcgaXJlZyA9ICpSX0lSUV9NQVNLMl9SRDsKKwlpbnQgaTsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNQkVSX09GX1BPUlRTOyBpKyspIHsKKwkJc3RydWN0IHN5bmNfcG9ydCAqcG9ydCA9ICZwb3J0c1tpXTsKKworCQlpZiAoIXBvcnQtPmVuYWJsZWQgfHwgIXBvcnQtPnVzZV9kbWEpCisJCQljb250aW51ZTsKKworCQlpZiAoIShpcmVnICYgKDEgPDwgcG9ydC0+aW5wdXRfZG1hX2Rlc2NyX2JpdCkpKQorCQkJY29udGludWU7CisKKwkJLyogRGVzY3JpcHRvciBpbnRlcnJ1cHQgKi8KKwkJaGFuZGxlZCA9IDE7CisJCXdoaWxlICgqcG9ydC0+aW5wdXRfZG1hX2Rlc2NyICE9CisJCQkJdmlydF90b19waHlzKHBvcnQtPm5leHRfcnhfZGVzYykpIHsKKwkJCWlmIChwb3J0LT53cml0ZXAgKyBwb3J0LT5pbmJ1ZmNodW5rID4gcG9ydC0+ZmxpcCArCisJCQkJCXBvcnQtPmluX2J1ZmZlcl9zaXplKSB7CisJCQkJaW50IGZpcnN0X3NpemUgPSBwb3J0LT5mbGlwICsKKwkJCQkJcG9ydC0+aW5fYnVmZmVyX3NpemUgLSBwb3J0LT53cml0ZXA7CisJCQkJbWVtY3B5KHBvcnQtPndyaXRlcCwKKwkJCQkJcGh5c190b192aXJ0KHBvcnQtPm5leHRfcnhfZGVzYy0+YnVmKSwKKwkJCQkJZmlyc3Rfc2l6ZSk7CisJCQkJbWVtY3B5KHBvcnQtPmZsaXAsCisJCQkJCXBoeXNfdG9fdmlydChwb3J0LT5uZXh0X3J4X2Rlc2MtPmJ1ZiArCisJCQkJCWZpcnN0X3NpemUpLAorCQkJCQlwb3J0LT5pbmJ1ZmNodW5rIC0gZmlyc3Rfc2l6ZSk7CisJCQkJcG9ydC0+d3JpdGVwID0gcG9ydC0+ZmxpcCArCisJCQkJCXBvcnQtPmluYnVmY2h1bmsgLSBmaXJzdF9zaXplOworCQkJfSBlbHNlIHsKKwkJCQltZW1jcHkocG9ydC0+d3JpdGVwLAorCQkJCQlwaHlzX3RvX3ZpcnQocG9ydC0+bmV4dF9yeF9kZXNjLT5idWYpLAorCQkJCQlwb3J0LT5pbmJ1ZmNodW5rKTsKKwkJCQlwb3J0LT53cml0ZXAgKz0gcG9ydC0+aW5idWZjaHVuazsKKwkJCQlpZiAocG9ydC0+d3JpdGVwID49IHBvcnQtPmZsaXAKKwkJCQkJCSsgcG9ydC0+aW5fYnVmZmVyX3NpemUpCisJCQkJCXBvcnQtPndyaXRlcCA9IHBvcnQtPmZsaXA7CisJCQl9CisJCQlpZiAocG9ydC0+d3JpdGVwID09IHBvcnQtPnJlYWRwKQorCQkJCXBvcnQtPmZ1bGwgPSAxOworCQkJcHJlcGFyZV9yeF9kZXNjcmlwdG9yKHBvcnQtPm5leHRfcnhfZGVzYyk7CisJCQlwb3J0LT5uZXh0X3J4X2Rlc2MtPmN0cmwgfD0gZF9lb2w7CisJCQlwb3J0LT5wcmV2X3J4X2Rlc2MtPmN0cmwgJj0gfmRfZW9sOworCQkJcG9ydC0+cHJldl9yeF9kZXNjID0gcGh5c190b192aXJ0KCh1bnNpZ25lZCkKKwkJCQlwb3J0LT5uZXh0X3J4X2Rlc2MpOworCQkJcG9ydC0+bmV4dF9yeF9kZXNjID0gcGh5c190b192aXJ0KCh1bnNpZ25lZCkKKwkJCQlwb3J0LT5uZXh0X3J4X2Rlc2MtPm5leHQpOworCQkJLyogV2FrZSB1cCB0aGUgd2FpdGluZyBwcm9jZXNzICovCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPmluX3dhaXRfcSk7CisJCQkqcG9ydC0+aW5wdXRfZG1hX2NtZCA9IElPX1NUQVRFKFJfRE1BX0NIMV9DTUQsCisJCQkJY21kLCByZXN0YXJ0KTsKKwkJCS8qIERNQSBoYXMgcmVhY2hlZCBlbmQgb2YgZGVzY3JpcHRvciAqLworCQkJKnBvcnQtPmlucHV0X2RtYV9jbHJfaXJxID0gSU9fU1RBVEUoUl9ETUFfQ0gwX0NMUl9JTlRSLAorCQkJCWNscl9kZXNjciwgZG8pOworCQl9CisJfQorCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfSAvKiByeF9pbnRlcnJ1cHQgKi8KKyNlbmRpZiAvKiBTWU5DX1NFUl9ETUEgKi8KKworI2lmZGVmIFNZTkNfU0VSX01BTlVBTAorc3RhdGljIGlycXJldHVybl90IG1hbnVhbF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCWludCBpOworCWludCBoYW5kbGVkID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1CRVJfT0ZfUE9SVFM7IGkrKykgeworCQlzdHJ1Y3Qgc3luY19wb3J0ICpwb3J0ID0gJnBvcnRzW2ldOworCisJCWlmICghcG9ydC0+ZW5hYmxlZCB8fCBwb3J0LT51c2VfZG1hKQorCQkJY29udGludWU7CisKKwkJLyogRGF0YSByZWNlaXZlZD8gKi8KKwkJaWYgKCpSX0lSUV9NQVNLMV9SRCAmICgxIDw8IHBvcnQtPmRhdGFfYXZhaWxfYml0KSkgeworCQkJaGFuZGxlZCA9IDE7CisJCQkvKiBSZWFkIGRhdGEgKi8KKwkJCXN3aXRjaCAocG9ydC0+Y3RybF9kYXRhX3NoYWRvdyAmCisJCQkJSU9fTUFTSyhSX1NZTkNfU0VSSUFMMV9DVFJMLCB3b3Jkc2l6ZSkpIHsKKwkJCWNhc2UgSU9fU1RBVEUoUl9TWU5DX1NFUklBTDFfQ1RSTCwgd29yZHNpemUsIHNpemU4Yml0KToKKwkJCQkqcG9ydC0+d3JpdGVwKysgPQorCQkJCQkqKHZvbGF0aWxlIGNoYXIgKilwb3J0LT5kYXRhX2luOworCQkJCWJyZWFrOworCQkJY2FzZSBJT19TVEFURShSX1NZTkNfU0VSSUFMMV9DVFJMLCB3b3Jkc2l6ZSwgc2l6ZTEyYml0KToKKwkJCXsKKwkJCQlpbnQgZGF0YSA9ICoodW5zaWduZWQgc2hvcnQgKilwb3J0LT5kYXRhX2luOworCQkJCSpwb3J0LT53cml0ZXAgPSAoZGF0YSAmIDB4MGZmMCkgPj4gNDsKKwkJCQkqKHBvcnQtPndyaXRlcCArIDEpID0gZGF0YSAmIDB4MGY7CisJCQkJcG9ydC0+d3JpdGVwICs9IDI7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIElPX1NUQVRFKFJfU1lOQ19TRVJJQUwxX0NUUkwsIHdvcmRzaXplLCBzaXplMTZiaXQpOgorCQkJCSoodW5zaWduZWQgc2hvcnQgKilwb3J0LT53cml0ZXAgPQorCQkJCQkqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydC0+ZGF0YV9pbjsKKwkJCQlwb3J0LT53cml0ZXAgKz0gMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgSU9fU1RBVEUoUl9TWU5DX1NFUklBTDFfQ1RSTCwgd29yZHNpemUsIHNpemUyNGJpdCk6CisJCQkJKih1bnNpZ25lZCBpbnQgKilwb3J0LT53cml0ZXAgPSAqcG9ydC0+ZGF0YV9pbjsKKwkJCQlwb3J0LT53cml0ZXAgKz0gMzsKKwkJCQlicmVhazsKKwkJCWNhc2UgSU9fU1RBVEUoUl9TWU5DX1NFUklBTDFfQ1RSTCwgd29yZHNpemUsIHNpemUzMmJpdCk6CisJCQkJKih1bnNpZ25lZCBpbnQgKilwb3J0LT53cml0ZXAgPSAqcG9ydC0+ZGF0YV9pbjsKKwkJCQlwb3J0LT53cml0ZXAgKz0gNDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogV3JhcD8gKi8KKwkJCWlmIChwb3J0LT53cml0ZXAgPj0gcG9ydC0+ZmxpcCArIHBvcnQtPmluX2J1ZmZlcl9zaXplKQorCQkJCXBvcnQtPndyaXRlcCA9IHBvcnQtPmZsaXA7CisJCQlpZiAocG9ydC0+d3JpdGVwID09IHBvcnQtPnJlYWRwKSB7CisJCQkJLyogUmVjZWl2ZSBidWZmZXIgb3ZlcnJ1biwgZGlzY2FyZCBvbGRlc3QgKi8KKwkJCQlwb3J0LT5yZWFkcCsrOworCQkJCS8qIFdyYXA/ICovCisJCQkJaWYgKHBvcnQtPnJlYWRwID49IHBvcnQtPmZsaXAgKworCQkJCQkJcG9ydC0+aW5fYnVmZmVyX3NpemUpCisJCQkJCXBvcnQtPnJlYWRwID0gcG9ydC0+ZmxpcDsKKwkJCX0KKwkJCWlmIChzeW5jX2RhdGFfYXZhaWwocG9ydCkgPj0gcG9ydC0+aW5idWZjaHVuaykgeworCQkJCS8qIFdha2UgdXAgYXBwbGljYXRpb24gKi8KKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPmluX3dhaXRfcSk7CisJCQl9CisJCX0KKworCQkvKiBUcmFuc21pdHRlciByZWFkeT8gKi8KKwkJaWYgKCpSX0lSUV9NQVNLMV9SRCAmICgxIDw8IHBvcnQtPnRyYW5zbWl0dGVyX3JlYWR5X2JpdCkpIHsKKwkJCWlmIChwb3J0LT5vdXRfY291bnQgPiAwKSB7CisJCQkJLyogTW9yZSBkYXRhIHRvIHNlbmQgKi8KKwkJCQlzZW5kX3dvcmQocG9ydCk7CisJCQl9IGVsc2UgeworCQkJCS8qIFRyYW5zbWlzc2lvbiBmaW5pc2hlZCAqLworCQkJCS8qIFR1cm4gb2ZmIElSUSAqLworCQkJCSpSX0lSUV9NQVNLMV9DTFIgPSAxIDw8CisJCQkJCXBvcnQtPnRyYW5zbWl0dGVyX3JlYWR5X2JpdDsKKwkJCQkvKiBXYWtlIHVwIGFwcGxpY2F0aW9uICovCisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5vdXRfd2FpdF9xKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKyNlbmRpZgorCittb2R1bGVfaW5pdChldHJheF9zeW5jX3NlcmlhbF9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvZGVidWdwb3J0LmMgYi9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL2RlYnVncG9ydC5jCmluZGV4IDkzNjc5YTQuLjA0ZDVlZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvZGVidWdwb3J0LmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9kZWJ1Z3BvcnQuYwpAQCAtMSw2ICsxLDYgQEAKIC8qIFNlcmlhbHBvcnQgZnVuY3Rpb25zIGZvciBkZWJ1Z2dpbmcKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDcgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgogICoKICAqIEF1dGhvcnM6ICBCam9ybiBXZXNlbgogICoKQEAgLTExLDk2ICsxMSw2IEBACiAgKiAgICBlbmFibGVEZWJ1Z0lSUSgpCiAgKiAgICBpbml0X2V0cmF4X2RlYnVnKCkKICAqCi0gKiAkTG9nOiBkZWJ1Z3BvcnQuYyx2ICQKLSAqIFJldmlzaW9uIDEuMjcgIDIwMDUvMDYvMTAgMTA6MzQ6MTQgIHN0YXJ2aWsKLSAqIFJlYWwgY29uc29sZSBzdXBwb3J0Ci0gKgotICogUmV2aXNpb24gMS4yNiAgMjAwNS8wNi8wNyAwNzowNjowNyAgc3RhcnZpawotICogQWRkZWQgTEYtPkNSIHRyYW5zbGF0aW9uIHRvIG1ha2UgRVRSQVggY3VzdG9tZXJzIGhhcHB5LgotICoKLSAqIFJldmlzaW9uIDEuMjUgIDIwMDUvMDMvMDggMDg6NTY6NDcgIG1pa2FlbGFtCi0gKiBEbyBvbmx5IHNldCBpbmRleCBhcyBwb3J0LT5pbmRleCBpZiBwb3J0IGlzIGRlZmluZWQsIG90aGVyd2lzZSB1c2UgdGhlIGluZGV4IGZyb20gdGhlIGNvbW1hbmQgbGluZQotICoKLSAqIFJldmlzaW9uIDEuMjQgIDIwMDUvMDEvMTkgMTA6MjY6MzMgIG1pa2FlbGFtCi0gKiBSZXR1cm4gdGhlIGNyaXMgc2VyaWFsIGRyaXZlciBpbiBjb25zb2xlIGRldmljZSBkcml2ZXIgY2FsbGJhY2sgZnVuY3Rpb24KLSAqCi0gKiBSZXZpc2lvbiAxLjIzICAyMDA1LzAxLzE0IDEwOjEyOjE3ICBzdGFydmlrCi0gKiBLR0RCIG9uIHNlcGFyYXRlIHBvcnQuCi0gKiBDb25zb2xlIGZpeGVzIGZyb20gMi40LgotICoKLSAqIFJldmlzaW9uIDEuMjIgIDIwMDUvMDEvMTEgMTY6MDY6MTMgIHN0YXJ2aWsKLSAqIHR5cG8KLSAqCi0gKiBSZXZpc2lvbiAxLjIxICAyMDA1LzAxLzExIDEzOjQ5OjE0ICBzdGFydmlrCi0gKiBBZGRlZCByYXdfcHJpbnRrIHRvIGJlIHVzZWQgd2hlcmUgd2UgZG9uJ3QgdHJ1c3QgdGhlIGNvbnNvbGUuCi0gKgotICogUmV2aXNpb24gMS4yMCAgMjAwNC8xMi8yNyAxMToxODozMiAgc3RhcnZpawotICogTWVyZ2Ugb2YgTGludXggMi42LjEwIChub3QgZnVuY3Rpb25hbCB5ZXQpLgotICoKLSAqIFJldmlzaW9uIDEuMTkgIDIwMDQvMTAvMjEgMDc6MjY6MTYgIHN0YXJ2aWsKLSAqIE1hZGUgaXQgcG9zc2libGUgdG8gc3BlY2lmeSBjb25zb2xlIHNldHRpbmdzIG9uIGtlcm5lbCBjb21tYW5kIGxpbmUuCi0gKgotICogUmV2aXNpb24gMS4xOCAgMjAwNC8xMC8xOSAxMzowNzozNyAgc3RhcnZpawotICogTWVyZ2Ugb2YgTGludXggMi42LjkKLSAqCi0gKiBSZXZpc2lvbiAxLjE3ICAyMDA0LzA5LzI5IDEwOjMzOjQ2ICBzdGFydmlrCi0gKiBSZXNvbHZlZCBhIGRlYWxvY2sgd2hlbiBwcmludGluZyBkZWJ1ZyBmcm9tIGtlcm5lbC4KLSAqCi0gKiBSZXZpc2lvbiAxLjE2ICAyMDA0LzA4LzI0IDA2OjEyOjE5ICBzdGFydmlrCi0gKiBXaGl0ZXNwYWNlIGNsZWFudXAKLSAqCi0gKiBSZXZpc2lvbiAxLjE1ICAyMDA0LzA4LzE2IDEyOjM3OjE5ICBzdGFydmlrCi0gKiBNZXJnZSBvZiBMaW51eCAyLjYuOAotICoKLSAqIFJldmlzaW9uIDEuMTQgIDIwMDQvMDUvMTcgMTM6MTE6MjkgIHN0YXJ2aWsKLSAqIERpc2FibGUgRE1BIHVudGlsIHJlYWwgc2VyaWFsIGRyaXZlciBpcyB1cAotICoKLSAqIFJldmlzaW9uIDEuMTMgIDIwMDQvMDUvMTQgMDc6NTg6MDEgIHN0YXJ2aWsKLSAqIE1lcmdlIG9mIGNoYW5nZXMgZnJvbSAyLjQKLSAqCi0gKiBSZXZpc2lvbiAxLjEyICAyMDAzLzA5LzExIDA3OjI5OjQ5ICBzdGFydmlrCi0gKiBNZXJnZSBvZiBMaW51eCAyLjYuMC10ZXN0NQotICoKLSAqIFJldmlzaW9uIDEuMTEgIDIwMDMvMDcvMDcgMDk6NTM6MzYgIHN0YXJ2aWsKLSAqIFJldmVydCBhbGwgdGhlIDIuNS43NCBtZXJnZSBjaGFuZ2VzIHRvIG1ha2UgdGhlIGNvbnNvbGUgd29yayBhZ2FpbgotICoKLSAqIFJldmlzaW9uIDEuOSAgMjAwMy8wMi8xNyAxNzowNzoyMyAgc3RhcnZpawotICogU29sdmVkIHRoZSBwcm9ibGVtIHdpdGggY29ycnVwdGVkIGRlYnVnIG91dHB1dCAoZnJvbSBMaW51eCAyLjQpCi0gKiAgICogV2FpdCB1bnRpbCBETUEsIEZJRk8gYW5kIHBpcGUgaXMgZW1wdHkgYmVmb3JlIGFuZCBhZnRlciB0cmFuc21pc3Npb25zCi0gKiAgICogQnVmZmVyIGRhdGEgdW50aWwgYSBGSUZPIGZsdXNoIGNhbiBiZSB0cmlnZ2VyZWQuCi0gKgotICogUmV2aXNpb24gMS44ICAyMDAzLzAxLzIyIDA2OjQ4OjM2ICBzdGFydmlrCi0gKiBGaXhlZCB3YXJuaW5ncyBpc3N1ZWQgYnkgR0NDIDMuMi4xCi0gKgotICogUmV2aXNpb24gMS43ICAyMDAyLzEyLzEyIDA4OjI2OjMyICBzdGFydmlrCi0gKiBEb24ndCB1c2UgQy1jb21tZW50cyBpbnNpZGUgQ1ZTIGNvbW1lbnRzCi0gKgotICogUmV2aXNpb24gMS42ICAyMDAyLzEyLzExIDE1OjQyOjAyICBzdGFydmlrCi0gKiBFeHRyYWN0ZWQgdjEwIChFVFJBWCAxMDBMWCkgc3BlY2lmaWMgc3R1ZmYgZnJvbSBhcmNoL2NyaXMva2VybmVsLwotICoKLSAqIFJldmlzaW9uIDEuNSAgMjAwMi8xMS8yMCAwNjo1ODowMyAgc3RhcnZpawotICogQ29tcGlsZXMgd2l0aCBrZ2RiCi0gKgotICogUmV2aXNpb24gMS40ICAyMDAyLzExLzE5IDE0OjM1OjI0ICBzdGFydmlrCi0gKiBDaGFuZ2VzIGZyb20gbGludXggMi40Ci0gKiBDaGFuZ2VkIHN0cnVjdCBpbml0aWFsaXplciBzeW50YXggdG8gdGhlIGN1cnJlbnRseSBwcmVmZXJyZWQgbm90YXRpb24KLSAqCi0gKiBSZXZpc2lvbiAxLjMgIDIwMDIvMTEvMDYgMDk6NDc6MDMgIHN0YXJ2aWsKLSAqIE1vZGlmaWVkIGZvciBuZXcgaW50ZXJydXB0IG1hY3JvcwotICoKLSAqIFJldmlzaW9uIDEuMiAgMjAwMi8wMS8yMSAxNToyMTo1MCAgYmpvcm53Ci0gKiBVcGRhdGUgZm9yIGtkZXZfdCBjaGFuZ2VzCi0gKgotICogUmV2aXNpb24gMS42ICAyMDAxLzA0LzE3IDEzOjU4OjM5ICBvcmphbmYKLSAqICogUmVuYW1lZCBDT05GSUdfS0dEQiB0byBDT05GSUdfRVRSQVhfS0dEQi4KLSAqCi0gKiBSZXZpc2lvbiAxLjUgIDIwMDEvMDMvMjYgMTQ6MjI6MDUgIGJqb3JudwotICogTmFtZWNoYW5nZSBvZiBzb21lIGNvbmZpZyBvcHRpb25zCi0gKgotICogUmV2aXNpb24gMS40ICAyMDAwLzEwLzA2IDEyOjM3OjI2ICBiam9ybncKLSAqIFVzZSBwaHlzaWNhbCBhZGRyZXNzZXMgd2hlbiB0YWxraW5nIHRvIERNQQotICoKLSAqCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KQEAgLTExMiw2ICsyMiw4IEBACiAjaW5jbHVkZSA8YXNtL2FyY2gvc3ZpbnRvLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+ICAgICAgICAgICAgIC8qIEdldCBTSU1DT1VULiAqLwogCitleHRlcm4gdm9pZCByZXNldF93YXRjaGRvZyh2b2lkKTsKKwogc3RydWN0IGRiZ19wb3J0CiB7CiAgIHVuc2lnbmVkIGludCBpbmRleDsKQEAgLTE4OCw3ICsxMDAsOSBAQAogICB9CiB9OwogCisjaWZkZWYgQ09ORklHX0VUUkFYX1NFUklBTAogZXh0ZXJuIHN0cnVjdCB0dHlfZHJpdmVyICpzZXJpYWxfZHJpdmVyOworI2VuZGlmCiAKIHN0cnVjdCBkYmdfcG9ydCogcG9ydCA9CiAjaWYgZGVmaW5lZChDT05GSUdfRVRSQVhfREVCVUdfUE9SVDApCkBAIC0zNjgsMTEgKzI4MiwxMiBAQAogewogCWludCBpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCiAgICAgICAgIGlmICghcG9ydCkKIAkJcmV0dXJuOwogCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCiAJLyogU2VuZCBkYXRhICovCiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAJCS8qIExGIC0+IENSTEYgKi8KQEAgLTM4NiwyNiArMzAxLDE2IEBACiAJCQk7CiAJCSpwb3J0LT53cml0ZSA9IGJ1ZltpXTsKIAl9Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQogCi1pbnQgcmF3X3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQlzdGF0aWMgY2hhciBidWZbMTAyNF07Ci0JaW50IHByaW50ZWRfbGVuOwotCXN0YXRpYyBpbnQgZmlyc3QgPSAxOwotCWlmIChmaXJzdCkgewotCQkvKiBGb3JjZSByZWluaXRpYWxpemF0aW9uIG9mIHRoZSBwb3J0IHRvIGdldCBtYW51YWwgbW9kZS4gKi8KLQkJcG9ydC0+c3RhcnRlZCA9IDA7Ci0JCXN0YXJ0X3BvcnQocG9ydCk7Ci0JCWZpcnN0ID0gMDsKLQl9Ci0JdmFfbGlzdCBhcmdzOwotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0JcHJpbnRlZF9sZW4gPSB2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci0JY29uc29sZV93cml0ZV9kaXJlY3QoTlVMTCwgYnVmLCBzdHJsZW4oYnVmKSk7Ci0JcmV0dXJuIHByaW50ZWRfbGVuOworCS8qCisJICogRmVlZCB0aGUgd2F0Y2hkb2csIG90aGVyd2lzZSBpdCB3aWxsIHJlc2V0IHRoZSBjaGlwIGR1cmluZyBib290LgorCSAqIFRoZSB0aW1lIHRvIHNlbmQgYW4gb3JkaW5hcnkgYm9vdCBtZXNzYWdlIGxpbmUgKDEwLTkwIGNoYXJzKQorCSAqIHZhcmllcyBiZXR3ZWVuIDEtOG1zIGF0IDExNTIwMC4gV2hhdCBtYWtlcyB1cCBmb3IgdGhlIGFkZGl0aW9uYWwKKwkgKiA5MG1zIHRoYXQgYWxsb3dzIHRoZSB3YXRjaGRvZyB0byBiaXRlPworCSovCisJcmVzZXRfd2F0Y2hkb2coKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTUwMCw2ICs0MDUsNyBAQAogCXJldHVybiAwOwogfQogCisKIC8qIFRoaXMgaXMgYSBkdW1teSBzZXJpYWwgZGV2aWNlIHRoYXQgdGhyb3dzIGF3YXkgYW55dGhpbmcgd3JpdHRlbiB0byBpdC4KICAqIFRoaXMgaXMgdXNlZCB3aGVuIG5vIGRlYnVnIG91dHB1dCBpcyB3YW50ZWQuCiAgKi8KQEAgLTU1NSw3ICs0NjEsMTMgQEAKIHsKIAlpZiAocG9ydCkKIAkJKmluZGV4ID0gcG9ydC0+aW5kZXg7CisJZWxzZQorCQkqaW5kZXggPSAwOworI2lmZGVmIENPTkZJR19FVFJBWF9TRVJJQUwKICAgICAgICAgcmV0dXJuIHBvcnQgPyBzZXJpYWxfZHJpdmVyIDogJmR1bW15X2RyaXZlcjsKKyNlbHNlCisJcmV0dXJuICZkdW1teV9kcml2ZXI7CisjZW5kaWYKIH0KIAogc3RhdGljIHN0cnVjdCBjb25zb2xlIHNlcmNvbnMgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL2RtYS5jIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9kbWEuYwppbmRleCBlOWEwMzExLi5lYjFmYTBkIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL2RtYS5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvZG1hLmMKQEAgLTEsNiArMSw1IEBACiAvKiBXcmFwcGVyIGZvciBETUEgY2hhbm5lbCBhbGxvY2F0b3IgdGhhdCB1cGRhdGVzIERNQSBjbGllbnQgbXV4aW5nLgotICogQ29weXJpZ2h0IDIwMDQsIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIKLSAqICRJZDogZG1hLmMsdiAxLjEgMjAwNC8xMi8xMyAxMjoyMTo1MSBzdGFydmlrIEV4cCAkCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA3LCBBeGlzIENvbW11bmljYXRpb25zIEFCCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9lbnRyeS5TCmluZGV4IGQxMzYxZGMuLjNhNjVmMzIgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL2VudHJ5LlMKQEAgLTEsMjUyICsxLDkgQEAKLS8qICRJZDogZW50cnkuUyx2IDEuMjggMjAwNS8wNi8yMCAwNTowNjozMCBzdGFydmlrIEV4cCAkCi0gKgorLyoKICAqICBsaW51eC9hcmNoL2NyaXMvZW50cnkuUwogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgogICoKICAqICBBdXRob3JzOglCam9ybiBXZXNlbiAoYmpvcm53QGF4aXMuY29tKQotICoKLSAqICAkTG9nOiBlbnRyeS5TLHYgJAotICogIFJldmlzaW9uIDEuMjggIDIwMDUvMDYvMjAgMDU6MDY6MzAgIHN0YXJ2aWsKLSAqICBSZW1vdmUgdW5uZWNlc3NhcnkgZGlmZiB0byBrZXJuZWwub3JnIHRyZWUKLSAqCi0gKiAgUmV2aXNpb24gMS4yNyAgMjAwNS8wMy8wNCAwODoxNjoxNiAgc3RhcnZpawotICogIE1lcmdlIG9mIExpbnV4IDIuNi4xMS4KLSAqCi0gKiAgUmV2aXNpb24gMS4yNiAgMjAwNS8wMS8xMSAxMzo0OTo0NyAgc3RhcnZpawotICogIEFkZGVkIE5NSSBoYW5kbGVyLgotICoKLSAqICBSZXZpc2lvbiAxLjI1ICAyMDA0LzEyLzI3IDExOjE4OjMyICBzdGFydmlrCi0gKiAgTWVyZ2Ugb2YgTGludXggMi42LjEwIChub3QgZnVuY3Rpb25hbCB5ZXQpLgotICoKLSAqICBSZXZpc2lvbiAxLjI0ICAyMDA0LzEyLzIyIDEwOjQxOjIzICBzdGFydmlrCi0gKiAgVXBkYXRlcyB0byBtYWtlIHYxMCBjb21waWxlIHdpdGggdGhlIGxhdGVzdCBTTVAgYXdhcmUgZ2VuZXJpYyBjb2RlIChldmVuCi0gKiAgdGhvdWdoIHYxMCB3aWxsIG5ldmVyIGhhdmUgU01QKS4KLSAqCi0gKiAgUmV2aXNpb24gMS4yMyAgMjAwNC8xMC8xOSAxMzowNzozNyAgc3RhcnZpawotICogIE1lcmdlIG9mIExpbnV4IDIuNi45Ci0gKgotICogIFJldmlzaW9uIDEuMjIgIDIwMDQvMDYvMjEgMTA6Mjk6NTUgIHN0YXJ2aWsKLSAqICBNZXJnZSBvZiBMaW51eCAyLjYuNwotICoKLSAqICBSZXZpc2lvbiAxLjIxICAyMDA0LzA2LzA5IDA1OjMwOjI3ICBzdGFydmlrCi0gKiAgQ2xlYW4gdXAgbXVsdGlwbGUgaW50ZXJydXB0IGhhbmRsaW5nLgotICogICAgUHJldmVudCBpbnRlcnJ1cHRzIGZyb20gaW50ZXJydXB0aW5nIGVhY2ggb3RoZXIuCi0gKiAgICBIYW5kbGUgYWxsIGFjdGl2ZSBpbnRlcnJ1cHRzLgotICoKLSAqICBSZXZpc2lvbiAxLjIwICAyMDA0LzA2LzA4IDA4OjU1OjMyICBzdGFydmlrCi0gKiAgUmVtb3ZlZCB1bnVzZWQgY29kZQotICoKLSAqICBSZXZpc2lvbiAxLjE5ICAyMDA0LzA2LzA0IDExOjU2OjE1ICBzdGFydmlrCi0gKiAgSW1wbGVtZW50ZWQgcGFnZSB0YWJsZSBsb29rdXAgZm9yIHJlZmlsbHMgaW4gYXNzZW1ibGVyIGZvciBpbXByb3ZlZCBwZXJmb3JtYW5jZS4KLSAqCi0gKiAgUmV2aXNpb24gMS4xOCAgMjAwNC8wNS8xMSAxMjoyODoyNSAgc3RhcnZpawotICogIE1lcmdlIG9mIExpbnV4IDIuNi42Ci0gKgotICogIFJldmlzaW9uIDEuMTcgIDIwMDMvMDkvMTEgMDc6Mjk6NDkgIHN0YXJ2aWsKLSAqICBNZXJnZSBvZiBMaW51eCAyLjYuMC10ZXN0NQotICoKLSAqICBSZXZpc2lvbiAxLjE2ICAyMDAzLzA3LzA0IDA4OjI3OjQxICBzdGFydmlrCi0gKiAgTWVyZ2Ugb2YgTGludXggMi41Ljc0Ci0gKgotICogIFJldmlzaW9uIDEuMTUgIDIwMDMvMDQvMDkgMDc6MzI6NTUgIHN0YXJ2aWsKLSAqICByZXN1bWUgc2hvdWxkIHJldHVybiB0YXNrX3N0cnVjdCwgbm90IHRocmVhZF9pbmZvCi0gKgotICogIFJldmlzaW9uIDEuMTQgIDIwMDMvMDQvMDkgMDU6MjA6NDQgIHN0YXJ2aWsKLSAqICBNZXJnZSBvZiBMaW51eCAyLjUuNjcKLSAqCi0gKiAgUmV2aXNpb24gMS4xMyAgMjAwMi8xMi8xMSAxNTo0MjowMiAgc3RhcnZpawotICogIEV4dHJhY3RlZCB2MTAgKEVUUkFYIDEwMExYKSBzcGVjaWZpYyBzdHVmZiBmcm9tIGFyY2gvY3Jpcy9rZXJuZWwvKi5jCi0gKgotICogIFJldmlzaW9uIDEuMTIgIDIwMDIvMTIvMTAgMDk6MDA6MTAgIHN0YXJ2aWsKLSAqICBNZXJnZSBvZiBMaW51eCAyLjUuNTEKLSAqCi0gKiAgUmV2aXNpb24gMS4xMSAgMjAwMi8xMi8wNSAwNzo1MzoxMCAgc3RhcnZpawotICogIENvcnJlY3RlZCBjb25zdGFudHMgdXNlZCB3aXRoIGJ0c3RxCi0gKgotICogIFJldmlzaW9uIDEuMTAgIDIwMDIvMTEvMjcgMDg6NDU6MTAgIHN0YXJ2aWsKLSAqICBwaWQgaXMgaW4gdGFza19zdHJ1Y3QsIG5vdCB0aHJlYWRfaW5mbwotICoKLSAqICBSZXZpc2lvbiAxLjkgIDIwMDIvMTEvMjYgMDk6NTI6MDUgIHN0YXJ2aWsKLSAqICBBZGRlZCBwcmVlbXB0aXZlIGtlcm5lbCBzY2hlZHVsaW5nIChpZiBDT05GSUdfUFJFRU1QVCkKLSAqCi0gKiAgUmV2aXNpb24gMS44ICAyMDAyLzExLzIwIDExOjU2OjExICBzdGFydmlrCi0gKiAgTWVyZ2Ugb2YgTGludXggMi41LjQ4Ci0gKgotICogIFJldmlzaW9uIDEuNyAgMjAwMi8xMS8xOCAxMzowMjo0MiAgc3RhcnZpawotICogIEFkZGVkIGZvdXJ0aCBwYXJhbWV0ZXIgdG8gZG9fbm90aWZ5X3Jlc3VtZQotICogIE1pbm9yIGNsZWFudXAKLSAqCi0gKiAgUmV2aXNpb24gMS42ICAyMDAyLzExLzExIDEwOjM3OjUwICBzdGFydmlrCi0gKiAgVXNlIG5ldyBhc20tb2Zmc2V0IGRlZmluZXMKLSAqICBNb2RpZmllZCBmb3IgbmV3IGxvY2F0aW9uIG9mIGN1cnJlbnQtPndvcmsgZXRjCi0gKiAgUmVtb3ZlZCBTWU1CT0xfTkFNRSBmcm9tIHN5c2NhbGxzCi0gKiAgQWRkZWQgc29tZSBuZXcgc3lzY2FsbHMKLSAqCi0gKiAgUmV2aXNpb24gMS41ICAyMDAyLzExLzA1IDA2OjQ1OjExICBzdGFydmlrCi0gKiAgTWVyZ2Ugb2YgTGludXggMi41LjQ1Ci0gKgotICogIFJldmlzaW9uIDEuNCAgMjAwMi8wMi8wNSAxNTo0MTozMSAgYmpvcm53Ci0gKiAgUmV3cml0dGVuIHRvIGNvbmZvcm0gYmV0dGVyIHRvIGN1cnJlbnQgMi41IGNvZGUgKHNpbWlsYXIgdG8gYXJjaC9pMzg2KQotICoKLSAqICBSZXZpc2lvbiAxLjMgIDIwMDIvMDEvMjEgMTU6MjI6MjAgIGJqb3JudwotICogIE5JQ0VfRE9HR1kgZml4IGZyb20gMi40IGFyY2gvY3JpcwotICoKLSAqICBSZXZpc2lvbiAxLjM3ICAyMDAxLzEyLzA3IDE3OjAzOjU1ICBiam9ybncKLSAqICBDYWxsIGEgYy1ob29rIGNhbGxlZCB3YXRjaGRvZ19iaXRlX2hvb2sgaW5zdGVhZCBvZiBzaG93X3JlZ2lzdGVycyBkaXJlY3RseQotICoKLSAqICBSZXZpc2lvbiAxLjM2ICAyMDAxLzExLzIyIDEzOjM2OjM2ICBiam9ybncKLSAqICAqIEluIHJldF9mcm9tX2ludHIsIGNoZWNrIHJlZ3MtPmRjY3IgZm9yIHVzZXJtb2RlIHJlZW50cmFuY2UgaW5zdGVhZCBvZgotICogICAgRENDUiBleHBsaWNpdGx5IChiZWNhdXNlIHRoZSBsYXR0ZXIgbWlnaHQgbm90IHJlZmxlY3QgY3VycmVudCByZWFsaXR5KQotICogICogSW4gbW11X2J1c19mYXVsdCwgc2V0ICRyOSBfYWZ0ZXJfIGNhbGxpbmcgdGhlIEMtY29kZSBpbnN0ZWFkIG9mIGJlZm9yZQotICogICAgc2luY2UgJHI5IGlzIGNhbGwtY2xvYmJlcmVkIGFuZCBpcyBwb3RlbnRpYWxseSBuZWVkZWQgYWZ0ZXJ3YXJkcwotICoKLSAqICBSZXZpc2lvbiAxLjM1ICAyMDAxLzEwLzMwIDE3OjEwOjE1ICBiam9ybncKLSAqICBBZGQgc29tZSBzeXNjYWxscwotICoKLSAqICBSZXZpc2lvbiAxLjM0ICAyMDAxLzEwLzAxIDE0OjQ1OjAzICBiam9ybncKLSAqICBSZW1vdmVkIHVuZGVyc2NvcmVzIGFuZCBhZGRlZCByZWdpc3RlciBwcmVmaXhlcwotICoKLSAqICBSZXZpc2lvbiAxLjMzICAyMDAxLzA4LzIxIDEzOjQ4OjAxICBqb25hc2hnCi0gKiAgQWRkZWQgZml4IGJ5IEhQIHRvIGF2b2lkIG9vcHMgd2hlbiBkb2luZyBhIGhhcmRfcmVzZXRfbm93LgotICoKLSAqICBSZXZpc2lvbiAxLjMyICAyMDAxLzA4LzE0IDA0OjMyOjAyICBocAotICogIEluIF9yZXN1bWUsIGFkZCBjb21tZW50IHdoeSBSOSBpcyBzYXZlZDsgZG9uJ3Qgc291bmQgbGlrZSBpdCdzIGNhbGwtc2F2ZWQuCi0gKgotICogIFJldmlzaW9uIDEuMzEgIDIwMDEvMDcvMjUgMTY6MDc6NDIgIGJqb3JudwotICogIHNvZnRpcnFfYWN0aXZlL21hc2sgLT4gc29mdGlycV9wZW5kaW5nIG9ubHkKLSAqCi0gKiAgUmV2aXNpb24gMS4zMCAgMjAwMS8wNy8wNSAwMTowMzozMiAgaHAKLSAqICAtIGluY2x1ZGUgYXNtL2Vycm5vLmggdG8gZ2V0IEVOT1NZUy4KLSAqICAtIFVzZSBFTk9TWVMsIG5vdCBsb2NhbCBjb25zdGFudCBMRU5PU1lTOyB0d2VhayBjb21tZW50cy4KLSAqICAtIEV4cGxhaW4gd2h5IC5pbmNsdWRlLCBub3QgI2luY2x1ZGUgaXMgdXNlZC4KLSAqICAtIE1ha2Ugb29wcy1yZWdpc3Rlci1kdW1wIGlmIHdhdGNoZG9nIGJpdHMgYW5kIGl0J3Mgbm90IGV4cGVjdGVkLgotICogIC0gRG9uJ3QganNyLCB1c2UganVtcCBfaGFyZF9yZXNldF9ub3csIGFuZCBza2lwIHNwdXJpb3VzIG5vcC4KLSAqICAtIFVzZSBjb3JyZWN0IHNlY3Rpb24gYXR0cmlidXRlIGZvciBzZWN0aW9uIC5yb2RhdGEuCi0gKiAgLSBBZGp1c3Qgc3lzX25pX3N5c2NhbGwgZmlsbCBudW1iZXIuCi0gKgotICogIFJldmlzaW9uIDEuMjkgIDIwMDEvMDYvMjUgMTQ6MDc6MDAgIGhwCi0gKiAgCUZpeCByZXZpZXcgY29tbWVudC4KLSAqICAJKiBoZWFkLlM6IFVzZSBJT19TVEFURSwgSU9fRklFTEQgYW5kIElPX01BU0sgY29uc3RydWN0cyBpbnN0ZWFkIG9mCi0gKiAgCW1hZ2ljIG51bWJlcnMuICBBZGQgY29tbWVudCB0aGF0IC10cmFkaXRpb25hbCBtdXN0IG5vdCBiZSB1c2VkLgotICogIAkqIGVudHJ5LlMgKFNZTUJPTF9OQU1FKTogQ2hhbmdlIHJlZGVmaW5pdGlvbiB0byB1c2UgIyMgY29uY2F0ZW5hdGlvbi4KLSAqICAJQ29ycmVjdCBhbmQgdXBkYXRlIGNvbW1lbnQuCi0gKiAgCSogTWFrZWZpbGUgKC5TLm8pOiBEb24ndCB1c2UgLXRyYWRpdGlvbmFsLiAgQWRkIGNvbW1lbnQgd2h5IHRoZQotICogIAl0b3BsZXZlbCBydWxlIGNhbid0IGJlIHVzZWQgKG5vdyB0aGF0IHRoZXJlJ3MgYSByZWFzb24pLgotICoKLSAqICBSZXZpc2lvbiAxLjI4ICAyMDAxLzA2LzIxIDAyOjAwOjQwICBocAotICogIAkqIGVudHJ5LlM6IEluY2x1ZGUgYXNtL3VuaXN0ZC5oLgotICogIAkoX3N5c19jYWxsX3RhYmxlKTogVXNlIHNlY3Rpb24gLnJvZGF0YSwgbm90IC5kYXRhLgotICogIAkoX2tlcm5lbF90aHJlYWQpOiBNb3ZlIGZyb20uLi4KLSAqICAJKiBwcm9jZXNzLmM6IC4uLiBoZXJlLgotICogIAkqIGVudHJ5b2Zmc2V0cy5jIChWQUwpOiBCcmVhayBvdXQgZnJvbS4uLgotICogIAkoT0YpOiBVc2UgVkFMLgotICogIAkoTENMT05FX1ZNKTogTmV3IGFzbWlmaWVkIHZhbHVlIGZyb20gQ0xPTkVfVk0uCi0gKgotICogIFJldmlzaW9uIDEuMjcgIDIwMDEvMDUvMjkgMTE6MjU6MjcgIG1hcmt1c2wKLSAqICBJbiBjYXNlIG9mICJzcHVyaW91c19pbnRlcnJ1cHQiLCBkbyBoYXJkX3Jlc2V0IGluc3RlYWQgb2YgaGFuZ2luZyBzeXN0ZW0gaW4gYSBsb29wLi4uCi0gKgotICogIFJldmlzaW9uIDEuMjYgIDIwMDEvMDUvMTUgMTU6NDY6MDMgIGJqb3JudwotICogIEluY2x1ZGUgY29uZmlnLmggbm93IHRoYXQgd2UgdXNlIHNvbWUgQ09ORklHXyBvcHRpb25zCi0gKgotICogIFJldmlzaW9uIDEuMjUgIDIwMDEvMDUvMTUgMDU6Mzg6NDcgIGhwCi0gKiAgVHdlYWtlZCBjb2RlIGluIF9yZXRfZnJvbV9zeXNfY2FsbAotICoKLSAqICBSZXZpc2lvbiAxLjI0ICAyMDAxLzA1LzE1IDA1OjI3OjQ5ICBocAotICogIFNhdmUgcjkgaW4gcjEgb3ZlciBmdW5jdGlvbiBjYWxsIHJhdGhlciB0aGFuIG9uIHN0YWNrLgotICoKLSAqICBSZXZpc2lvbiAxLjIzICAyMDAxLzA1LzE1IDA1OjEwOjAwICBocAotICogIEdlbmVyYXRlIGVudHJ5LlMgc3RydWN0dXJlIG9mZnNldHMgZnJvbSBDCi0gKgotICogIFJldmlzaW9uIDEuMjIgIDIwMDEvMDQvMTcgMTM6NTg6MzkgIG9yamFuZgotICogICogUmVuYW1lZCBDT05GSUdfS0dEQiB0byBDT05GSUdfRVRSQVhfS0dEQi4KLSAqCi0gKiAgUmV2aXNpb24gMS4yMSAgMjAwMS8wNC8xNyAxMTozMzoyOSAgb3JqYW5mCi0gKiAgVXBkYXRlZCBhY2NvcmRpbmcgdG8gcmV2aWV3OgotICogICogSW5jbHVkZWQgYXNtL3N2X2FkZHJfYWcuaCB0byBnZXQgbWFjcm8gZm9yIGludGVybmFsIHJlZ2lzdGVyLgotICogICogQ29ycmVjdGVkIGNvbW1lbnQgcmVnYXJkaW5nIHN5c3RlbSBjYWxsIGFyZ3VtZW50IHBhc3NpbmcuCi0gKiAgKiBSZW1vdmVkIGNvbW1lbnQgYWJvdXQgaW5zdHJ1Y3Rpb24gYmVpbmcgaW4gYSBkZWxheSBzbG90LgotICogICogQWRkZWQgY29tbWVudCBhYm91dCBTWU1CT0xfTkFNRSBtYWNyby4KLSAqCi0gKiAgUmV2aXNpb24gMS4yMCAgMjAwMS8wNC8xMiAwODo1MTowNyAgaHAKLSAqICAtIEFkZCBlbnRyeSBmb3Igc3lzX2ZjbnRsNjQuICBJbiBmYWN0IGNvcHkgbGFzdCBwaWVjZSBmcm9tIGkzODYgaW5jbHVkaW5nIC4uLgotICogIC0gLnJlcHQgdG8gZmlsbCB0YWJsZSB0byBzYWZlIHN0YXRlIHdpdGggc3lzX25pX3N5c2NhbGwuCi0gKgotICogIFJldmlzaW9uIDEuMTkgIDIwMDEvMDQvMDQgMDk6NDM6MzIgIG9yamFuZgotICogICogTW92ZWQgZG9fc2lndHJhcCBmcm9tIHRyYXBzLmMgdG8gZW50cnkuUy4KLSAqICAqIExUQVNLX1BJRCBuZWVkIG5vdCBiZSBnbG9iYWwgYW55bW9yZS4KLSAqCi0gKiAgUmV2aXNpb24gMS4xOCAgMjAwMS8wMy8yNiAwOToyNTowMiAgbWFya3VzbAotICogIFVwZGF0ZWQgYWZ0ZXIgcmV2aWV3LCBzaG91bGQgbm93IGhhbmRsZSBVU0IgaW50ZXJydXB0cyBjb3JyZWN0bHkuCi0gKgotICogIFJldmlzaW9uIDEuMTcgIDIwMDEvMDMvMjEgMTY6MTI6NTUgIGJqb3JudwotICogICogQWx3YXlzIG1ha2Ugcm9vbSBmb3IgdGhlIGNwdSBzdGF0dXMgcmVjb3JkIGluIHRoZSBmcmFtZSwgaW4gb3JkZXIgdG8KLSAqICAgIHVzZSB0aGUgc2FtZSBmcmFtZWxlbmd0aCBhbmQgbGF5b3V0IGZvciBib3RoIG1tdSBidXNmYXVsdHMgYW5kIG5vcm1hbAotICogICAgaXJxcy4gTm8gbmVlZCB0byBjaGVjayBmb3IgdGhlIGV4cGxpY2l0IENSSVNfRlJBTUVfRklYVVAgdHlwZSBhbnltb3JlLgotICogICogRml4ZWQgYnVnIHdpdGggdXNpbmcgYWRkcSBmb3IgcG9wcGluZyB0aGUgc3RhY2sgaW4gdGhlIGVwaWxvZ3VlIC0gaXQKLSAqICAgIGRlc3Ryb3llZCB0aGUgZmxhZyByZWdpc3Rlci4gVXNlIGluc3RydWN0aW9ucyB0aGF0IGRvbid0IGFmZmVjdCB0aGUKLSAqICAgIGZsYWcgcmVnaXN0ZXIgaW5zdGVhZC4KLSAqICAqIFJlbW92ZWQgd3JpdGUgdG8gUl9QT1JUX1BBX0RBVEEgZHVyaW5nIHNwdXJpb3VzX2ludGVycnVwdAotICoKLSAqICBSZXZpc2lvbiAxLjE2ICAyMDAxLzAzLzIwIDE5OjQzOjAyICBiam9ybncKLSAqICAqIEdldCByaWQgb2YgZXNwMCBzZXR0aW5nCi0gKiAgKiBHaXZlIGEgN3RoIGFyZ3VtZW50IHRvIGEgc3lzdGVtY2FsbCAtIHRoZSBzdGFja2ZyYW1lCi0gKgotICogIFJldmlzaW9uIDEuMTUgIDIwMDEvMDMvMDUgMTM6MTQ6MzAgIGJqb3JudwotICogIFNwZWxsaW5nIGZpeAotICoKLSAqICBSZXZpc2lvbiAxLjE0ICAyMDAxLzAyLzIzIDA4OjM2OjM2ICBwZXJmCi0gKiAgTmV3IEFCSTsgc3lzY2FsbG5yPXI5LCBhcmc1PW1vZiwgYXJnNj1zcnAuCi0gKiAgQ29ycmVjdGVkIHRyYWNlc3lzIGNhbGwgY2hlY2suCi0gKgotICogIFJldmlzaW9uIDEuMTMgIDIwMDEvMDIvMTUgMDg6NDA6NTUgIHBlcmYKLSAqICBILVAgYnkgd2F5IG9mIHBlcmY7Ci0gKiAgLSAoX3N5c3RlbV9jYWxsKTogRG9uJ3QgcmVhZCBzeXN0ZW0gY2FsbCBmdW5jdGlvbiBhZGRyZXNzIGludG8gcjEuCi0gKiAgLSAoUkJGRXhpdCk6IFRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcgYXMgYSBudWxsIHBvcC4gIEFkanVzdCBzcCBieSBhZGRxLgotICogIC0gKF9zeXN0ZW1fY2FsbCk6IERvbid0IHVzZSByMTAgYW5kIGRvbid0IHNhdmUgYW5kIHJlc3RvcmUgaXQuCi0gKiAgLSAoVEhSRUFEX0VTUDApOiBOZXcgY29uc3RhbnQuCi0gKiAgLSAoX3N5c3RlbV9jYWxsKTogSW5saW5lIHNldF9lc3AwLgotICoKLSAqICBSZXZpc2lvbiAxLjEyICAyMDAxLzAxLzMxIDE3OjU2OjI1ICBvcmphbmYKLSAqICBBZGRlZCBkZWZpbml0aW9uIG9mIExUQVNLX1BJRCBhbmQgbWFkZSBpdCBnbG9iYWwuCi0gKgotICogIFJldmlzaW9uIDEuMTEgIDIwMDEvMDEvMTAgMjE6MTM6MjkgIGJqb3JudwotICogIFNZTUJPTF9OQU1FIGlzIGRlZmluZWQgaW5jb3JyZWN0bHkgZm9yIHRoZSBjb21waWxlciBvcHRpb25zIHdlIGN1cnJlbnRseSB1c2UKLSAqCi0gKiAgUmV2aXNpb24gMS4xMCAgMjAwMC8xMi8xOCAyMzo0Nzo1NiAgYmpvcm53Ci0gKiAgKiBBZGRlZCBzeXNjYWxsIHRyYWNlIHN1cHBvcnQgKHB0cmFjZSksIGNvbXBsZXRlbHkgdW50ZXN0ZWQgb2YgY291cnNlCi0gKiAgKiBSZW1vdmVkIHJlZHVuZGFudCBjaGVjayBmb3IgTlVMTCBlbnRyaWVzIGluIHN5c2NhbGxfdGFibGUKLSAqCi0gKiAgUmV2aXNpb24gMS45ICAyMDAwLzExLzIxIDE2OjQwOjUxICBiam9ybncKLSAqICAqIE5ldyBmcmFtZSB0eXBlIHVzZWQgd2hlbiBhbiBTQkZTIGZyYW1lIG5lZWRzIHRvIGJlIHBvcHBlZCB3aXRob3V0Ci0gKiAgICBhY3R1YWxseSByZXN0YXJ0aW5nIHRoZSBpbnN0cnVjdGlvbgotICogICogRW5hYmxlIGludGVycnVwdHMgaW4gc2lnbmFsX3JldHVybiAodGhleSBkaWQgc28gaW4geDg2LCBJIGhvcGUgaXQncyBhIGdvb2QKLSAqICAgIGlkZWEpCi0gKgotICogIFJldmlzaW9uIDEuOCAgMjAwMC8xMS8xNyAxNjo1MzozNSAgYmpvcm53Ci0gKiAgQWRkZWQgZGV0ZWN0aW9uIG9mIGZyYW1lLXR5cGUgaW4gUmV4aXQsIHNvIHRoYXQgbW11X2J1c19mYXVsdCBjYW4KLSAqICB1c2UgcmV0X2Zyb21faW50ciBpbiB0aGUgcmV0dXJuLXBhdGggdG8gY2hlY2sgZm9yIHNpZ25hbHMgKGxpa2UgU0VHVikKLSAqICBhbmQgb3RoZXIgZm91bCB0aGluZ3MgdGhhdCBtaWdodCBoYXZlIG9jY3VycmVkIGR1cmluZyB0aGUgZmF1bHQuCi0gKgotICogIFJldmlzaW9uIDEuNyAgMjAwMC8xMC8wNiAxNTowNDoyOCAgYmpvcm53Ci0gKiAgSW5jbHVkZSBtb2YgaW4gcmVnaXN0ZXIgc2F2aW5ncwotICoKLSAqICBSZXZpc2lvbiAxLjYgIDIwMDAvMDkvMTIgMTY6MDI6NDQgIGJqb3JudwotICogIExpbnV4LTIuNC4wLXRlc3Q3IGRlcml2ZWQgdXBkYXRlcwotICoKLSAqICBSZXZpc2lvbiAxLjUgIDIwMDAvMDgvMTcgMTU6MzU6MTUgIGJqb3JudwotICogIDIuNC4wLXRlc3Q2IGNoYW5nZWQgbG9jYWxfaXJxX2NvdW50IGFuZCBmcmllbmRzIEFQSQotICoKLSAqICBSZXZpc2lvbiAxLjQgIDIwMDAvMDgvMDIgMTM6NTk6MzAgIGJqb3JudwotICogIFJlbW92ZWQgb2xkdW5hbWUgYW5kIHVuYW1lIGZyb20gdGhlIHN5c2NhbGwgbGlzdAotICoKLSAqICBSZXZpc2lvbiAxLjMgIDIwMDAvMDcvMzEgMTM6MzI6NTggIGJqb3JudwotICogICogRXhwb3J0IHJldF9mcm9tX2ludHIKLSAqICAqIF9yZXN1bWUgdXBkYXRlZCAocHJldi9sYXN0IHRqb2hlanNhbikKLSAqICAqIHRpbWVyX2ludGVycnVwdCBvYnNvbGV0ZQotICogICogU0lHU0VHViBkZXRlY3Rpb24gaW4gbW11X2J1c19mYXVsdCB0ZW1wb3JhcmlseSBkaXNhYmxlZAotICoKLSAqCiAgKi8KIAogLyoKQEAgLTExNjcsOSArOTI0LDExIEBACiAJLmxvbmcgc3lzX2Vwb2xsX3B3YWl0CiAJLmxvbmcgc3lzX3V0aW1lbnNhdAkJLyogMzIwICovCiAJLmxvbmcgc3lzX3NpZ25hbGZkCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwKKwkubG9uZyBzeXNfdGltZXJmZF9jcmVhdGUKIAkubG9uZyBzeXNfZXZlbnRmZAogCS5sb25nIHN5c19mYWxsb2NhdGUKKwkubG9uZyBzeXNfdGltZXJmZF9zZXR0aW1lCS8qIDMyNSAqLworCS5sb25nIHN5c190aW1lcmZkX2dldHRpbWUKIAogICAgICAgICAvKgogICAgICAgICAgKiBOT1RFISEgVGhpcyBkb2Vzbid0IGhhdmUgdG8gYmUgZXhhY3QgLSB3ZSBqdXN0IGhhdmUKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvZmFzdHRpbWVyLmMgYi9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL2Zhc3R0aW1lci5jCmluZGV4IGMxYTNhMjEuLjMxZmYzNWMgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvZmFzdHRpbWVyLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9mYXN0dGltZXIuYwpAQCAtMzEsMTUgKzMxLDEyIEBACiAKICNkZWZpbmUgREVCVUdfTE9HX0lOQ0xVREVECiAjZGVmaW5lIEZBU1RfVElNRVJfTE9HCi0vLyNkZWZpbmUgRkFTVF9USU1FUl9URVNUCisvKiAjZGVmaW5lIEZBU1RfVElNRVJfVEVTVCAqLwogCiAjZGVmaW5lIEZBU1RfVElNRVJfU0FOSVRZX0NIRUNLUwogCiAjaWZkZWYgRkFTVF9USU1FUl9TQU5JVFlfQ0hFQ0tTCi0jZGVmaW5lIFNBTklUWUNIRUNLKHgpIHgKIHN0YXRpYyBpbnQgc2FuaXR5X2ZhaWxlZDsKLSNlbHNlCi0jZGVmaW5lIFNBTklUWUNIRUNLKHgpCiAjZW5kaWYKIAogI2RlZmluZSBEMSh4KQpAQCAtMjI2LDIzICsyMjMsMTkgQEAKICAgZG9fZ2V0dGltZW9mZGF5X2Zhc3QoJnQtPnR2X3NldCk7CiAgIHRtcCA9IGZhc3RfdGltZXJfbGlzdDsKIAotICBTQU5JVFlDSEVDSyh7IC8qIENoZWNrIHNvIHRoaXMgaXMgbm90IGluIHRoZSBsaXN0IGFscmVhZHkuLi4gKi8KLSAgICB3aGlsZSAodG1wICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKHRtcCA9PSB0KQotICAgICAgewotICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HCi0gICAgICAgICAgICAgICAidGltZXIgbmFtZTogJXMgZGF0YTogMHglMDhsWCBhbHJlYWR5IGluIGxpc3QhXG4iLCBuYW1lLCBkYXRhKTsKLSAgICAgICAgc2FuaXR5X2ZhaWxlZCsrOwotCQkJCWdvdG8gZG9uZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdG1wID0gdG1wLT5uZXh0OwotICAgICAgfQotICAgIH0KLSAgICB0bXAgPSBmYXN0X3RpbWVyX2xpc3Q7Ci0gIH0pOworI2lmZGVmIEZBU1RfVElNRVJfU0FOSVRZX0NIRUNLUworCS8qIENoZWNrIHNvIHRoaXMgaXMgbm90IGluIHRoZSBsaXN0IGFscmVhZHkuLi4gKi8KKwl3aGlsZSAodG1wICE9IE5VTEwpIHsKKwkJaWYgKHRtcCA9PSB0KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0aW1lciBuYW1lOiAlcyBkYXRhOiAiCisJCQkJIjB4JTA4bFggYWxyZWFkeSBpbiBsaXN0IVxuIiwgbmFtZSwgZGF0YSk7CisJCQlzYW5pdHlfZmFpbGVkKys7CisJCQlnb3RvIGRvbmU7CisJCX0gZWxzZQorCQkJdG1wID0gdG1wLT5uZXh0OworCX0KKwl0bXAgPSBmYXN0X3RpbWVyX2xpc3Q7CisjZW5kaWYKIAogICB0LT5kZWxheV91cyA9IGRlbGF5X3VzOwogICB0LT5mdW5jdGlvbiA9IGZ1bmN0aW9uOwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9oZWFkLlMgYi9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL2hlYWQuUwppbmRleCBkOTQ2ZDhiLi45NjM0NGFmIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL2hlYWQuUworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL2hlYWQuUwpAQCAtMSwxODYgKzEsMTAgQEAKLS8qICRJZDogaGVhZC5TLHYgMS4xMCAyMDA1LzA2LzIwIDA1OjEyOjU0IHN0YXJ2aWsgRXhwICQKLSAqIAorLyoKICAqIEhlYWQgb2YgdGhlIGtlcm5lbCAtIGFsdGVyIHdpdGggY2FyZQogICoKICAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSBBeGlzIENvbW11bmljYXRpb25zIEFCCiAgKgogICogQXV0aG9yczoJQmpvcm4gV2VzZW4gKGJqb3Jud0BheGlzLmNvbSkKICAqIAotICogJExvZzogaGVhZC5TLHYgJAotICogUmV2aXNpb24gMS4xMCAgMjAwNS8wNi8yMCAwNToxMjo1NCAgc3RhcnZpawotICogUmVtb3ZlIHVubmVjZXNzYXJ5IGRpZmYgdG8ga2VybmVsLm9yZyB0cmVlCi0gKgotICogUmV2aXNpb24gMS45ICAyMDA0LzEyLzEzIDEyOjIxOjUxICBzdGFydmlrCi0gKiBBZGRlZCBJL08gYW5kIERNQSBhbGxvY2F0b3JzIGZyb20gTGludXggMi40Ci0gKgotICogUmV2aXNpb24gMS44ICAyMDA0LzExLzIyIDExOjQxOjE0ICBzdGFydmlrCi0gKiBLZXJuZWwgY29tbWFuZCBsaW5lIG1heSBiZSBzdXBwbGllZCB0byBrZXJuZWwuIE5vdCB1c2VkIGJ5IEF4aXMgYnV0IG1heQotICogYmUgdXNlZCBieSBjdXN0b21lcnMuCi0gKgotICogUmV2aXNpb24gMS43ICAyMDA0LzA1LzE0IDA3OjU4OjAxICBzdGFydmlrCi0gKiBNZXJnZSBvZiBjaGFuZ2VzIGZyb20gMi40Ci0gKgotICogUmV2aXNpb24gMS42ICAyMDAzLzA0LzI4IDA1OjMxOjQ2ICBzdGFydmlrCi0gKiBBZGRlZCBzZWN0aW9uIGF0dHJpYnV0ZXMKLSAqCi0gKiBSZXZpc2lvbiAxLjUgIDIwMDIvMTIvMTEgMTU6NDI6MDIgIHN0YXJ2aWsKLSAqIEV4dHJhY3RlZCB2MTAgKEVUUkFYIDEwMExYKSBzcGVjaWZpYyBzdHVmZiBmcm9tIGFyY2gvY3Jpcy9rZXJuZWwvKi5jCi0gKgotICogUmV2aXNpb24gMS40ICAyMDAyLzExLzA3IDA5OjAwOjQ0ICBzdGFydmlrCi0gKiBOYW1lcyBjaGFuZ2VkIGZvciBpbml0IHNlY3Rpb25zCi0gKiBpbml0X3Rhc2tfdW5pb24gLT4gaW5pdF90aHJlYWRfdW5pb24KLSAqCi0gKiBSZXZpc2lvbiAxLjMgIDIwMDIvMDIvMDUgMTU6Mzg6MjMgIGJqb3JudwotICogT29wcy4uIG5vbi1DUkFNRlNfTUFHSUMgc2hvdWxkIGp1bXAgb3ZlciB0aGUgY29weWluZywgbm90IGludG8gaXQuLi4KLSAqCi0gKiBSZXZpc2lvbiAxLjIgIDIwMDEvMTIvMTggMTM6MzU6MTkgIGJqb3JudwotICogQXBwbGllZCB0aGUgMi40LjEzLT4yLjQuMTYgQ1JJUyBwYXRjaCB0byAyLjUuMSAoaXMgYSBjb3B5IG9mIDIuNC4xNSkuCi0gKgotICogUmV2aXNpb24gMS40MyAgMjAwMS8xMS8wOCAxNTowOTo0MyAgc3RhcnZpawotICogT25seSBzdGFydCBNSUkgY2xvY2sgaWYgRXRoZXJuZXQgaXMgY29uZmlndXJlZAotICoKLSAqIFJldmlzaW9uIDEuNDIgIDIwMDEvMTEvMDggMTQ6Mzc6MzQgIHN0YXJ2aWsKLSAqIFN0YXJ0IE1JSSBjbG9jayBlYXJseSB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBydW5uaW5nIGF0IHRyYW5jZWl2ZXIgcmVzZXQKLSAqCi0gKiBSZXZpc2lvbiAxLjQxICAyMDAxLzEwLzI5IDE0OjU1OjU4ICBwa2oKLSAqIENvcnJlY3RlZCBwYSRyMCB0byBwYXIwLgotICoKLSAqIFJldmlzaW9uIDEuNDAgIDIwMDEvMTAvMDMgMTQ6NTk6NTcgIHBragotICogQWRkZWQgc3VwcG9ydCBmb3IgcmVzZXR0aW5nIHRoZSBCbHVldG9vdGggaGFyZHdhcmUuCi0gKgotICogUmV2aXNpb24gMS4zOSAgMjAwMS8xMC8wMSAxNDo0NTowMyAgYmpvcm53Ci0gKiBSZW1vdmVkIHVuZGVyc2NvcmVzIGFuZCBhZGRlZCByZWdpc3RlciBwcmVmaXhlcwotICoKLSAqIFJldmlzaW9uIDEuMzggIDIwMDEvMDkvMjEgMDc6MTQ6MTEgIGpvbmFzaGcKLSAqIE1hZGUgcm9vdCBmaWxlc3lzdGVtIChjcmFtZnMpIHVzZSBtdGRibG9jayBkcml2ZXIgd2hlbiBib290aW5nIGZyb20gZmxhc2guCi0gKgotICogUmV2aXNpb24gMS4zNyAgMjAwMS8wOS8xMSAxMzo0NDoyOSAgb3JqYW5mCi0gKiBEZWNvdXBsZSB1c2FnZSBvZiBzZXJpYWwgcG9ydHMgZm9yIGRlYnVnIGFuZCBrZ2RiLgotICoKLSAqIFJldmlzaW9uIDEuMzYgIDIwMDEvMDYvMjkgMTI6Mzk6MzEgIHBragotICogQWRkZWQgc3VwcG9ydCBmb3IgbWlycm9yaW5nIHRoZSBmaXJzdCBmbGFzaCB0byBqdXN0IGJlbG93IHRoZQotICogc2Vjb25kIG9uZSwgdG8gbWFrZSB0aGVtIGxvb2sgY29uc2VjdXRpdmUgdG8gY3JhbWZzLgotICoKLSAqIFJldmlzaW9uIDEuMzUgIDIwMDEvMDYvMjUgMTQ6MDc6MDAgIGhwCi0gKiAJRml4IHJldmlldyBjb21tZW50LgotICogCSogaGVhZC5TOiBVc2UgSU9fU1RBVEUsIElPX0ZJRUxEIGFuZCBJT19NQVNLIGNvbnN0cnVjdHMgaW5zdGVhZCBvZgotICogCW1hZ2ljIG51bWJlcnMuICBBZGQgY29tbWVudCB0aGF0IC10cmFkaXRpb25hbCBtdXN0IG5vdCBiZSB1c2VkLgotICogCSogZW50cnkuUyAoU1lNQk9MX05BTUUpOiBDaGFuZ2UgcmVkZWZpbml0aW9uIHRvIHVzZSAjIyBjb25jYXRlbmF0aW9uLgotICogCUNvcnJlY3QgYW5kIHVwZGF0ZSBjb21tZW50LgotICogCSogTWFrZWZpbGUgKC5TLm8pOiBEb24ndCB1c2UgLXRyYWRpdGlvbmFsLiAgQWRkIGNvbW1lbnQgd2h5IHRoZQotICogCXRvcGxldmVsIHJ1bGUgY2FuJ3QgYmUgdXNlZCAobm93IHRoYXQgdGhlcmUncyBhIHJlYXNvbikuCi0gKgotICogUmV2aXNpb24gMS4zNCAgMjAwMS8wNS8xNSAwNzowODoxNCAgaHAKLSAqIFR3ZWFrICJub3RpY2UiIHRvIHJlZmxlY3QgdGhhdCBib3RoIHI4IHI5IGFyZSB1c2VkCi0gKgotICogUmV2aXNpb24gMS4zMyAgMjAwMS8wNS8xNSAwNjo0MDowNSAgaHAKLSAqIFB1dCBidWxrIG9mIGNvZGUgaW4gLnRleHQuaW5pdCwgZGF0YSBpbiAuZGF0YS5pbml0Ci0gKgotICogUmV2aXNpb24gMS4zMiAgMjAwMS8wNS8xNSAwNjoxODo1NiAgaHAKLSAqIEV4ZWN1dGUgcmV2aWV3IGNvbW1lbnQ6IHMvYmNjL2Jocy9nOyBzL2Jjcy9ibG8vZwotICoKLSAqIFJldmlzaW9uIDEuMzEgIDIwMDEvMDUvMTUgMDY6MDg6NDAgIGhwCi0gKiBBZGQgc2VudGVuY2UgYWJvdXQgYXV0b2RldGVjdGluZyB0aGUgYml0MzEtTU1VLWJ1ZwotICoKLSAqIFJldmlzaW9uIDEuMzAgIDIwMDEvMDUvMTUgMDY6MDA6MDUgIGhwCi0gKiBVcGRhdGUgY29tbWVudDogTE9XX01BUCBpcyBub3QgZm9yY2VkIG9uIHhzaW0gYW55bW9yZS4KLSAqCi0gKiBSZXZpc2lvbiAxLjI5ICAyMDAxLzA0LzE4IDEyOjUxOjU5ICBvcmphbmYKLSAqICogUmV2ZXJ0ZWQgcmV2aWV3IGNoYW5nZSByZWdhcmRpbmcgdGhlIHVzZSBvZiBiY3MvYmNjLgotICogKiBSZW1vdmVkIG5vbi13b3JraW5nIExFRC1jbGVhcmluZyBjb2RlLgotICoKLSAqIFJldmlzaW9uIDEuMjggIDIwMDEvMDQvMTcgMTM6NTg6MzkgIG9yamFuZgotICogKiBSZW5hbWVkIENPTkZJR19LR0RCIHRvIENPTkZJR19FVFJBWF9LR0RCLgotICoKLSAqIFJldmlzaW9uIDEuMjcgIDIwMDEvMDQvMTcgMTE6NDI6MzUgIG9yamFuZgotICogQ2hhbmdlZCBhY2NvcmRpbmcgdG8gcmV2aWV3OgotICogKiBBZGRlZCBjb21tZW50IGV4cGxhaW5pbmcgbWVtb3J5IG1hcCBidWcuCi0gKiAqIENoYW5nZWQgYmNzIGFuZCBiY2MgdG8gYmxvIGFuZCBiaHMsIHJlc3BlY3RpdmVseS4KLSAqICogUmVtb3ZlZCBtZW50aW9uaW5nIG9mIFN0YWxsb25lIGFuZCBPbGdhIGJvYXJkcy4KLSAqCi0gKiBSZXZpc2lvbiAxLjI2ICAyMDAxLzA0LzA2IDEyOjMxOjA3ICBqb25hc2hnCi0gKiBDaGVjayBmb3IgY3JhbWZzIGluIGZsYXNoIGJlZm9yZSBSQU0gaW5zdGVhZCBvZiBSQU0gYmVmb3JlIGZsYXNoLgotICoKLSAqIFJldmlzaW9uIDEuMjUgIDIwMDEvMDQvMDQgMDY6MjM6NTMgIHN0YXJ2aWsKLSAqIEluaXRpYWxpemUgRFJBTSBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXplZAotICoKLSAqIFJldmlzaW9uIDEuMjQgIDIwMDEvMDQvMDMgMTE6MTI6MDAgIHN0YXJ2aWsKLSAqIFJlbW92ZWQgZHJhbSBpbml0IChkb25lIGJ5IHJlc2N1ZSBvciBldHJheDEwMGJvb3QKLSAqIENvcnJlY3RlZCBpbmNsdWRlCi0gKgotICogUmV2aXNpb24gMS4yMyAgMjAwMS8wNC8wMyAwOTo1MzowMyAgc3RhcnZpawotICogSW5jbHVkZSBod19zZXR0aW5ncy5TCi0gKgotICogUmV2aXNpb24gMS4yMiAgMjAwMS8wMy8yNiAxNDoyMzoyNiAgYmpvcm53Ci0gKiBOYW1lY2hhbmdlIG9mIHNvbWUgY29uZmlnIG9wdGlvbnMKLSAqCi0gKiBSZXZpc2lvbiAxLjIxICAyMDAxLzAzLzA4IDEyOjE0OjQxICBiam9ybncKLSAqICogQ29uZmlnIG5hbWUgZm9yIEVUUkFYIElERSB3YXMgcmVuYW1lZAotICogKiBSZW1vdmVkIEcyNyBhdXRvLXNldHRpbmcgd2hlbiBKVUxJRVRURSBpcyBjaG9zZW4gKG5lZWQgdG8gbWFrZSB0aGlzCi0gKiAgIGEgbmV3IGNvbmZpZyBvcHRpb24gbGF0ZXIpCi0gKgotICogUmV2aXNpb24gMS4yMCAgMjAwMS8wMi8yMyAxMjo0Nzo1NiAgYmpvcm53Ci0gKiBNTVUgcmVncyBkdXJpbmcgTE9XX01BUCB1cGRhdGVkIHRvIHJlZmxlY3QgYSBuZXdlciByZWFsaXR5Ci0gKgotICogUmV2aXNpb24gMS4xOSAgMjAwMS8wMi8xOSAxMToxMjowNyAgYmpvcm53Ci0gKiBDaGFuZ2VkIGNvbW1lbnQgaGVhZGVyIGZvcm1hdAotICoKLSAqIFJldmlzaW9uIDEuMTggIDIwMDEvMDIvMTUgMDc6MjU6MzggIHN0YXJ2aWsKLSAqIEFkZGVkIHN1cHBvcnQgZm9yIHN5bmNocm9ub3VzIHNlcmlhbCBwb3J0cwotICoKLSAqIFJldmlzaW9uIDEuMTcgIDIwMDEvMDIvMDggMTU6NTM6MTMgIHN0YXJ2aWsKLSAqIExhc3QgY29tbWl0IHJlbW92ZWQgc29tZSBpbXBvcnRhbnQgaWZkZWZzCi0gKgotICogUmV2aXNpb24gMS4xNiAgMjAwMS8wMi8wOCAxNToyMDozOCAgc3RhcnZpawotICogSW5jbHVkZSBkcmFtX2luaXQuUyBhcyBpbmxpbmUKLSAqCi0gKiBSZXZpc2lvbiAxLjE1ICAyMDAxLzAxLzI5IDE4OjEyOjAxICBiam9ybncKLSAqIENvcnJlY3RlZCBzb21lIGNvbW1lbnRzCi0gKgotICogUmV2aXNpb24gMS4xNCAgMjAwMS8wMS8yOSAxMzoxMToyOSAgc3RhcnZpawotICogSW5jbHVkZSBkcmFtX2luaXQuUyAod2l0aCBEUkFNL1NEUkFNIGluaXRpYWxpemF0aW9uKQotICoKLSAqIFJldmlzaW9uIDEuMTMgIDIwMDEvMDEvMjMgMTQ6NTQ6NTcgIG1hcmt1c2wKLSAqIFVwZGF0ZWQgZm9yIFVTQgotICogaS5lLiBhZGRlZCByX2dlbl9jb25maWcgc2V0dGluZ3MKLSAqCi0gKiBSZXZpc2lvbiAxLjEyICAyMDAxLzAxLzE5IDE2OjE2OjI5ICBwZXJmCi0gKiBBZGRlZCB0ZW1wb3JhcnkgbWFwcGluZyBvZiAweDBjLT4weDBjIHRvIGF2b2lkIGZsYXNoIGxvYWRpbmcgY29uZnVzaW9uLgotICogUmVuYW1lZCBzZXJpYWwgb3B0aW9ucyBmcm9tIEVUUkFYMTAwIHRvIEVUUkFYLgotICoKLSAqIFJldmlzaW9uIDEuMTEgIDIwMDEvMDEvMTYgMTY6MzE6MzggIGJqb3JudwotICogKiBDaGFuZ2VkIG5hbWUgYW5kIHNlbWFudGljcyBvZiBydW5uaW5nX2Zyb21fZmxhc2ggdG8gcm9tZnNfaW5fZmxhc2gsCi0gKiAgIHNldCBieSBoZWFkLlMgdG8gaW5kaWNhdGUgdG8gc2V0dXAuYyB3aGV0aGVyIHRoZXJlIGlzIGEgY3JhbWZzIGltYWdlCi0gKiAgIGFmdGVyIHRoZSBrZXJuZWxzIEJTUyBvciBub3QuIFNob3VsZCB3b3JrIGZvciBhbGwgdGhyZWUgYm9vdC1jYXNlcwotICogICAoRFJBTSB3aXRoIGNyYW1mcyBpbiBEUkFNLCBEUkFNIHdpdGggY3JhbWZzIGluIGZsYXNoIChjb21wcmVzc2VkIGJvb3QpLAotICogICAgYW5kIGZsYXNoIHdpdGggY3JhbWZzIGluIGZsYXNoKQotICoKLSAqIFJldmlzaW9uIDEuMTAgIDIwMDEvMDEvMTYgMTQ6MTI6MjEgIGJqb3JudwotICogKiBDaGVjayBmb3IgY3JhbWZzIHN0YXJ0IHBhc3NlZCBpbiByOSBmcm9tIHRoZSBkZWNvbXByZXNzb3IsIGlmIGFsbCBvdGhlcgotICogICBjcmFtZnMgb3B0aW9ucyBmYWlsIChpZiB3ZSBib290IGZyb20gRFJBTSBidXQgZG9uJ3QgZmluZCBhIGNyYW1mcyBpbWFnZQotICogICBhZnRlciB0aGUga2VybmVsIGluIERSQU0sIGl0IGlzIHByb2JhYmx5IHN0aWxsIGluIHRoZSBmbGFzaCkKLSAqICogQ2hlY2sgbWFnaWMgaW4gY3JhbWZzIGRldGVjdGlvbiB3aGVuIGJvb3RpbmcgZnJvbSBmbGFzaCBkaXJlY3RseQotICoKLSAqIFJldmlzaW9uIDEuOSAgMjAwMS8wMS8xNSAxNzoxNzowMiAgYmpvcm53Ci0gKiAqIENvcnJlY3RlZCB0aGUgY29kZSB0aGF0IGRldGVjdHMgdGhlIGNyYW1mcyBsZW5ndGhzCi0gKiAqIEFkZGVkIGEgY29tbWVudCBzYXlpbmcgdGhhdCB0aGUgYWJvdmUgZG9lcyBub3Qgd29yayBkdWUgdG8gb3RoZXIKLSAqICAgcmVhc29ucy4uCi0gKgotICogUmV2aXNpb24gMS44ICAyMDAxLzAxLzE1IDE2OjI3OjUxICBqb25hc2hnCi0gKiBNYWRlIGJvb3QgYWZ0ZXIgZmxhc2hpbmcgd29yay4KLSAqICogZW5kIGRlc3RpbmF0aW9uIGlzIF9fdm1saW51eF9lbmQgaW4gUkFNLgotICogKiBfcm9tZnNfc3RhcnQgbW92ZWQgYmVjYXVzZSBvZiB2aXJ0dWFsIG1lbW9yeS4KLSAqCi0gKiBSZXZpc2lvbiAxLjcgIDIwMDAvMTEvMjEgMTM6NTU6MjkgIGJqb3JudwotICogVXNlIENPTkZJR19DUklTX0xPV19NQVAgZm9yIHRoZSBsb3cgVk0gbWFwIGluc3RlYWQgb2YgZXhwbGljaXQgQ1BVIHR5cGUKLSAqCi0gKiBSZXZpc2lvbiAxLjYgIDIwMDAvMTAvMDYgMTI6MzY6NTUgIGJqb3JudwotICogRm9yZ290IHN3YXBwZXJfcGdfZGlyIHdoZW4gY2hhbmdpbmcgbWVtb3J5IG1hcC4uCi0gKgotICogUmV2aXNpb24gMS41ICAyMDAwLzEwLzA0IDE2OjQ5OjMwICBiam9ybncKLSAqICogRml4ZWQgbWVtb3J5IG1hcHBpbmcgaW4gTFgKLSAqICogQ2hlY2sgZm9yIGNyYW1mcyBpbnN0ZWFkIG9mIHJvbWZzCi0gKgogICovCiAJCiAjZGVmaW5lIEFTU0VNQkxFUl9NQUNST1NfT05MWQpAQCAtNTk1LDExICs0MTksMTcgQEAKIAogCW1vdmVxCTAsJHIwCiAKKwk7OyBTZWxlY3Qgb3IgZGlzYWJsZSBzZXJpYWwgcG9ydCAyCisjaWZkZWYgQ09ORklHX0VUUkFYX1NFUklBTF9QT1JUMgorCW9yLmQJICBJT19TVEFURSAoUl9HRU5fQ09ORklHLCBzZXIyLCBzZWxlY3QpLCRyMAorI2Vsc2UKKwlvci5kCSAgSU9fU1RBVEUgKFJfR0VOX0NPTkZJRywgc2VyMiwgZGlzYWJsZSksJHIwCisjZW5kaWYKKwogCTs7IEluaXQgaW50ZXJmYWNlcyAoZGlzYWJsZSB0aGVtKS4KIAlvci5kCSAgSU9fU1RBVEUgKFJfR0VOX0NPTkZJRywgc2NzaTAsIGRpc2FibGUpIFwKIAkJfCBJT19TVEFURSAoUl9HRU5fQ09ORklHLCBhdGEsIGRpc2FibGUpIFwKIAkJfCBJT19TVEFURSAoUl9HRU5fQ09ORklHLCBwYXIwLCBkaXNhYmxlKSBcCi0JCXwgSU9fU1RBVEUgKFJfR0VOX0NPTkZJRywgc2VyMiwgZGlzYWJsZSkgXAogCQl8IElPX1NUQVRFIChSX0dFTl9DT05GSUcsIG1pbywgZGlzYWJsZSkgXAogCQl8IElPX1NUQVRFIChSX0dFTl9DT05GSUcsIHNjc2kxLCBkaXNhYmxlKSBcCiAJCXwgSU9fU1RBVEUgKFJfR0VOX0NPTkZJRywgc2NzaTB3LCBkaXNhYmxlKSBcCkBAIC04MDEsNiArNjMxLDQxIEBACiAJCXwgSU9fU1RBVEUgKFJfU0VSSUFMMV9UUl9DVFJMLCB0cl9iaXRuciwgdHJfOGJpdCksJHIwCiAJbW92ZS5iCSRyMCxbUl9TRVJJQUwxX1RSX0NUUkxdCiAKKyNpZmRlZiBDT05GSUdfRVRSQVhfU0VSSUFMX1BPUlQyCisJOzsgc2V0dXAgdGhlIHNlcmlhbCBwb3J0IDIgYXQgMTE1MjAwIGJhdWQgZm9yIGRlYnVnIHB1cnBvc2VzCisKKwltb3ZlcQkgIElPX1NUQVRFIChSX1NFUklBTDJfWE9GRiwgdHhfc3RvcCwgZW5hYmxlKQkJXAorCQl8IElPX1NUQVRFIChSX1NFUklBTDJfWE9GRiwgYXV0b194b2ZmLCBkaXNhYmxlKQkJXAorCQl8IElPX0ZJRUxEIChSX1NFUklBTDJfWE9GRiwgeG9mZl9jaGFyLCAwKSwkcjAKKwltb3ZlLmQJJHIwLFtSX1NFUklBTDJfWE9GRl0KKworCTsgMTE1LjJrYmF1ZCBmb3IgYm90aCB0cmFuc21pdCBhbmQgcmVjZWl2ZQorCW1vdmUuYgkgIElPX1NUQVRFIChSX1NFUklBTDJfQkFVRCwgdHJfYmF1ZCwgYzExNWsySHopCQlcCisJCXwgSU9fU1RBVEUgKFJfU0VSSUFMMl9CQVVELCByZWNfYmF1ZCwgYzExNWsySHopLCRyMAorCW1vdmUuYgkkcjAsW1JfU0VSSUFMMl9CQVVEXQorCisJOyBTZXQgdXAgYW5kIGVuYWJsZSB0aGUgc2VyaWFsMiByZWNlaXZlci4KKwltb3ZlLmIJICBJT19TVEFURSAoUl9TRVJJQUwyX1JFQ19DVFJMLCBkbWFfZXJyLCBzdG9wKQkJXAorCQl8IElPX1NUQVRFIChSX1NFUklBTDJfUkVDX0NUUkwsIHJlY19lbmFibGUsIGVuYWJsZSkJXAorCQl8IElPX1NUQVRFIChSX1NFUklBTDJfUkVDX0NUUkwsIHJ0c18sIGFjdGl2ZSkJCVwKKwkJfCBJT19TVEFURSAoUl9TRVJJQUwyX1JFQ19DVFJMLCBzYW1wbGluZywgbWlkZGxlKQlcCisJCXwgSU9fU1RBVEUgKFJfU0VSSUFMMl9SRUNfQ1RSTCwgcmVjX3N0aWNrX3Bhciwgbm9ybWFsKQlcCisJCXwgSU9fU1RBVEUgKFJfU0VSSUFMMl9SRUNfQ1RSTCwgcmVjX3BhciwgZXZlbikJCVwKKwkJfCBJT19TVEFURSAoUl9TRVJJQUwyX1JFQ19DVFJMLCByZWNfcGFyX2VuLCBkaXNhYmxlKQlcCisJCXwgSU9fU1RBVEUgKFJfU0VSSUFMMl9SRUNfQ1RSTCwgcmVjX2JpdG5yLCByZWNfOGJpdCksJHIwCisJbW92ZS5iCSRyMCxbUl9TRVJJQUwyX1JFQ19DVFJMXQorCisJOyBTZXQgdXAgYW5kIGVuYWJsZSB0aGUgc2VyaWFsMiB0cmFuc21pdHRlci4KKwltb3ZlLmIJICBJT19GSUVMRCAoUl9TRVJJQUwyX1RSX0NUUkwsIHR4ZCwgMCkJCQlcCisJCXwgSU9fU1RBVEUgKFJfU0VSSUFMMl9UUl9DVFJMLCB0cl9lbmFibGUsIGVuYWJsZSkJXAorCQl8IElPX1NUQVRFIChSX1NFUklBTDJfVFJfQ1RSTCwgYXV0b19jdHMsIGRpc2FibGVkKQlcCisJCXwgSU9fU1RBVEUgKFJfU0VSSUFMMl9UUl9DVFJMLCBzdG9wX2JpdHMsIG9uZV9iaXQpCVwKKwkJfCBJT19TVEFURSAoUl9TRVJJQUwyX1RSX0NUUkwsIHRyX3N0aWNrX3Bhciwgbm9ybWFsKQlcCisJCXwgSU9fU1RBVEUgKFJfU0VSSUFMMl9UUl9DVFJMLCB0cl9wYXIsIGV2ZW4pCQlcCisJCXwgSU9fU1RBVEUgKFJfU0VSSUFMMl9UUl9DVFJMLCB0cl9wYXJfZW4sIGRpc2FibGUpCVwKKwkJfCBJT19TVEFURSAoUl9TRVJJQUwyX1RSX0NUUkwsIHRyX2JpdG5yLCB0cl84Yml0KSwkcjAKKwltb3ZlLmIJJHIwLFtSX1NFUklBTDJfVFJfQ1RSTF0KKyNlbmRpZgogCQogI2lmZGVmIENPTkZJR19FVFJBWF9TRVJJQUxfUE9SVDMJCiAJOzsgc2V0dXAgdGhlIHNlcmlhbCBwb3J0IDMgYXQgMTE1MjAwIGJhdWQgZm9yIGRlYnVnIHB1cnBvc2VzCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL2lvX2ludGVyZmFjZV9tdXguYyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvaW9faW50ZXJmYWNlX211eC5jCmluZGV4IGYzYjMyN2QuLmFkZDk4ZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvaW9faW50ZXJmYWNlX211eC5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvaW9faW50ZXJmYWNlX211eC5jCkBAIC0xLDEwICsxLDkgQEAKIC8qIElPIGludGVyZmFjZSBtdXggYWxsb2NhdG9yIGZvciBFVFJBWDEwMExYLgotICogQ29weXJpZ2h0IDIwMDQsIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIKLSAqICRJZDogaW9faW50ZXJmYWNlX211eC5jLHYgMS4yIDIwMDQvMTIvMjEgMTI6MDg6Mzggc3RhcnZpayBFeHAgJAorICogQ29weXJpZ2h0IDIwMDQtMjAwNywgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgogICovCiAKIAotLyogQy5mLiBFVFJBWDEwMExYIERlc2lnbmVyJ3MgUmVmZXJlbmNlIDIwLjkgKi8KKy8qIEMuZi4gRVRSQVgxMDBMWCBEZXNpZ25lcidzIFJlZmVyZW5jZSBjaGFwdGVyIDE5LjkgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTQ1LDE3ICs0NCwzOSBAQAogc3RydWN0IGlmX2dyb3VwCiB7CiAJZW51bSBpb19pZl9ncm91cCAgICAgICAgZ3JvdXA7Ci0JdW5zaWduZWQgY2hhciAgICAgICAgICAgdXNlZDsKLQllbnVtIGNyaXNfaW9faW50ZXJmYWNlICBvd25lcjsKKwkvKiBuYW1lCS0gdGhlIG5hbWUgb2YgdGhlIGdyb3VwICdBJyB0byAnRicgKi8KKwljaGFyICAgICAgICAgICAgICAgICAgICpuYW1lOworCS8qIHVzZWQJLSBhIGJpdCBtYXNrIG9mIGFsbCBwaW5zIGluIHRoZSBncm91cCBpbiB0aGUgb3JkZXIgbGlzdGVkCisJICogaW4gdGhlIHRhYmxlcyBpbiAxOS45LjEgdG8gMTkuOS42LiAgTm90ZSB0aGF0IG5vCisJICogZGlzdGluY3Rpb24gaXMgbWFkZSBiZXR3ZWVuIGluLCBvdXQgYW5kIGluL291dCBwaW5zLiAqLworCXVuc2lnbmVkIGludCAgICAgICAgICAgIHVzZWQ7CiB9OwogCiAKIHN0cnVjdCBpbnRlcmZhY2UKIHsKIAllbnVtIGNyaXNfaW9faW50ZXJmYWNlICAgaW9pZjsKKwkvKiBuYW1lIC0gdGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSAqLworCWNoYXIgICAgICAgICAgICAgICAgICAgICpuYW1lOworCS8qIGdyb3VwcyAtIE9SJ2VkIHRvZ2V0aGVyIGlvX2lmX2dyb3VwIGZsYWdzIGRlc2NyaWJpbmcgd2hhdCBwaW4gZ3JvdXBzCisJICogdGhlIGludGVyZmFjZSB1c2VzIHBpbnMgaW4uICovCiAJdW5zaWduZWQgY2hhciAgICAgICAgICAgIGdyb3VwczsKKwkvKiB1c2VkIC0gc2V0IHdoZW4gdGhlIGludGVyZmFjZSBpcyBhbGxvY2F0ZWQuICovCiAJdW5zaWduZWQgY2hhciAgICAgICAgICAgIHVzZWQ7CiAJY2hhciAgICAgICAgICAgICAgICAgICAgKm93bmVyOworCS8qIGdyb3VwX2EgdGhyb3VnaCBncm91cF9mIC0gYml0IG1hc2tzIGRlc2NyaWJpbmcgd2hhdCBwaW5zIGluIHRoZQorCSAqIHBpbiBncm91cHMgdGhlIGludGVyZmFjZSB1c2VzLiAqLworCXVuc2lnbmVkIGludCAgICAgICAgICAgICBncm91cF9hOworCXVuc2lnbmVkIGludCAgICAgICAgICAgICBncm91cF9iOworCXVuc2lnbmVkIGludCAgICAgICAgICAgICBncm91cF9jOworCXVuc2lnbmVkIGludCAgICAgICAgICAgICBncm91cF9kOworCXVuc2lnbmVkIGludCAgICAgICAgICAgICBncm91cF9lOworCXVuc2lnbmVkIGludCAgICAgICAgICAgICBncm91cF9mOworCisJLyogZ3Bpb19nX2luLCBncGlvX2dfb3V0LCBncGlvX2IgLSBiaXQgbWFza3MgdGVsbGluZyB3aGF0IHBpbnMgaW4gdGhlCisJICogR1BJTyBwb3J0cyB0aGUgaW50ZXJmYWNlIHVzZXMuICBUaGlzIGNvdWxkIGJlIHJlY29uc3R1Y3RlZCB1c2luZworCSAqIHRoZSBncm91cF9YIG1hc2tzIGFuZCBhIHRhYmxlIG9mIHdoYXQgcGlucyB0aGUgR1BJTyBwb3J0cyB1c2UsCisJICogYnV0IHRoYXQgd291bGQgYmUgbWVzc3kuICovCiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgIGdwaW9fZ19pbjsKIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgZ3Bpb19nX291dDsKIAl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgZ3Bpb19iOwpAQCAtNjQsMjYgKzg1LDMyIEBACiBzdGF0aWMgc3RydWN0IGlmX2dyb3VwIGlmX2dyb3Vwc1s2XSA9IHsKIAl7CiAJCS5ncm91cCA9IGdyb3VwX2EsCisJCS5uYW1lID0gIkEiLAogCQkudXNlZCA9IDAsCiAJfSwKIAl7CiAJCS5ncm91cCA9IGdyb3VwX2IsCisJCS5uYW1lID0gIkIiLAogCQkudXNlZCA9IDAsCiAJfSwKIAl7CiAJCS5ncm91cCA9IGdyb3VwX2MsCisJCS5uYW1lID0gIkMiLAogCQkudXNlZCA9IDAsCiAJfSwKIAl7CiAJCS5ncm91cCA9IGdyb3VwX2QsCisJCS5uYW1lID0gIkQiLAogCQkudXNlZCA9IDAsCiAJfSwKIAl7CiAJCS5ncm91cCA9IGdyb3VwX2UsCisJCS5uYW1lID0gIkUiLAogCQkudXNlZCA9IDAsCiAJfSwKIAl7CiAJCS5ncm91cCA9IGdyb3VwX2YsCisJCS5uYW1lID0gIkYiLAogCQkudXNlZCA9IDAsCiAJfQogfTsKQEAgLTk0LDE0ICsxMjEsMzIgQEAKIAkvKiBCZWdpbiBOb24tbXVsdGlwbGV4ZWQgaW50ZXJmYWNlcyAqLwogCXsKIAkJLmlvaWYgPSBpZl9ldGgsCisJCS5uYW1lID0gImV0aGVybmV0IiwKIAkJLmdyb3VwcyA9IDAsCisKKwkJLmdyb3VwX2EgPSAwLAorCQkuZ3JvdXBfYiA9IDAsCisJCS5ncm91cF9jID0gMCwKKwkJLmdyb3VwX2QgPSAwLAorCQkuZ3JvdXBfZSA9IDAsCisJCS5ncm91cF9mID0gMCwKKwogCQkuZ3Bpb19nX2luID0gMCwKIAkJLmdwaW9fZ19vdXQgPSAwLAogCQkuZ3Bpb19iID0gMAogCX0sCiAJewogCQkuaW9pZiA9IGlmX3NlcmlhbF8wLAorCQkubmFtZSA9ICJzZXJpYWxfMCIsCiAJCS5ncm91cHMgPSAwLAorCisJCS5ncm91cF9hID0gMCwKKwkJLmdyb3VwX2IgPSAwLAorCQkuZ3JvdXBfYyA9IDAsCisJCS5ncm91cF9kID0gMCwKKwkJLmdyb3VwX2UgPSAwLAorCQkuZ3JvdXBfZiA9IDAsCisKIAkJLmdwaW9fZ19pbiA9IDAsCiAJCS5ncGlvX2dfb3V0ID0gMCwKIAkJLmdwaW9fYiA9IDAKQEAgLTEwOSwxNzIgKzE1NCwzODUgQEAKIAkvKiBFbmQgTm9uLW11bHRpcGxleGVkIGludGVyZmFjZXMgKi8KIAl7CiAJCS5pb2lmID0gaWZfc2VyaWFsXzEsCisJCS5uYW1lID0gInNlcmlhbF8xIiwKIAkJLmdyb3VwcyA9IGdyb3VwX2UsCisKKwkJLmdyb3VwX2EgPSAwLAorCQkuZ3JvdXBfYiA9IDAsCisJCS5ncm91cF9jID0gMCwKKwkJLmdyb3VwX2QgPSAwLAorCQkuZ3JvdXBfZSA9IDB4MGYsCisJCS5ncm91cF9mID0gMCwKKwogCQkuZ3Bpb19nX2luID0gIDB4MDAwMDAwMDAsCiAJCS5ncGlvX2dfb3V0ID0gMHgwMDAwMDAwMCwKIAkJLmdwaW9fYiA9IDB4MDAKIAl9LAogCXsKIAkJLmlvaWYgPSBpZl9zZXJpYWxfMiwKKwkJLm5hbWUgPSAic2VyaWFsXzIiLAogCQkuZ3JvdXBzID0gZ3JvdXBfYiwKKworCQkuZ3JvdXBfYSA9IDAsCisJCS5ncm91cF9iID0gMHgwZiwKKwkJLmdyb3VwX2MgPSAwLAorCQkuZ3JvdXBfZCA9IDAsCisJCS5ncm91cF9lID0gMCwKKwkJLmdyb3VwX2YgPSAwLAorCiAJCS5ncGlvX2dfaW4gPSAgMHgwMDAwMDBjMCwKIAkJLmdwaW9fZ19vdXQgPSAweDAwMDAwMGMwLAogCQkuZ3Bpb19iID0gMHgwMAogCX0sCiAJewogCQkuaW9pZiA9IGlmX3NlcmlhbF8zLAorCQkubmFtZSA9ICJzZXJpYWxfMyIsCiAJCS5ncm91cHMgPSBncm91cF9jLAorCisJCS5ncm91cF9hID0gMCwKKwkJLmdyb3VwX2IgPSAwLAorCQkuZ3JvdXBfYyA9IDB4MGYsCisJCS5ncm91cF9kID0gMCwKKwkJLmdyb3VwX2UgPSAwLAorCQkuZ3JvdXBfZiA9IDAsCisKIAkJLmdwaW9fZ19pbiA9ICAweGMwMDAwMDAwLAogCQkuZ3Bpb19nX291dCA9IDB4YzAwMDAwMDAsCiAJCS5ncGlvX2IgPSAweDAwCiAJfSwKIAl7CiAJCS5pb2lmID0gaWZfc3luY19zZXJpYWxfMSwKLQkJLmdyb3VwcyA9IGdyb3VwX2UgfCBncm91cF9mLCAvKiBpZl9zeW5jX3NlcmlhbF8xIGFuZCBpZl9zeW5jX3NlcmlhbF8zCi0JCQkJCSAgICAgICBjYW4gYmUgdXNlZCBzaW11bHRhbmVvdXNseSAqLworCQkubmFtZSA9ICJzeW5jX3NlcmlhbF8xIiwKKwkJLmdyb3VwcyA9IGdyb3VwX2UgfCBncm91cF9mLAorCisJCS5ncm91cF9hID0gMCwKKwkJLmdyb3VwX2IgPSAwLAorCQkuZ3JvdXBfYyA9IDAsCisJCS5ncm91cF9kID0gMCwKKwkJLmdyb3VwX2UgPSAweDBmLAorCQkuZ3JvdXBfZiA9IDB4MTAsCisKIAkJLmdwaW9fZ19pbiA9ICAweDAwMDAwMDAwLAogCQkuZ3Bpb19nX291dCA9IDB4MDAwMDAwMDAsCiAJCS5ncGlvX2IgPSAweDEwCiAJfSwKIAl7CiAJCS5pb2lmID0gaWZfc3luY19zZXJpYWxfMywKKwkJLm5hbWUgPSAic3luY19zZXJpYWxfMyIsCiAJCS5ncm91cHMgPSBncm91cF9jIHwgZ3JvdXBfZiwKKworCQkuZ3JvdXBfYSA9IDAsCisJCS5ncm91cF9iID0gMCwKKwkJLmdyb3VwX2MgPSAweDBmLAorCQkuZ3JvdXBfZCA9IDAsCisJCS5ncm91cF9lID0gMCwKKwkJLmdyb3VwX2YgPSAweDgwLAorCiAJCS5ncGlvX2dfaW4gPSAgMHhjMDAwMDAwMCwKIAkJLmdwaW9fZ19vdXQgPSAweGMwMDAwMDAwLAogCQkuZ3Bpb19iID0gMHg4MAogCX0sCiAJewogCQkuaW9pZiA9IGlmX3NoYXJlZF9yYW0sCisJCS5uYW1lID0gInNoYXJlZF9yYW0iLAogCQkuZ3JvdXBzID0gZ3JvdXBfYSwKKworCQkuZ3JvdXBfYSA9IDB4N2Y4ZmYsCisJCS5ncm91cF9iID0gMCwKKwkJLmdyb3VwX2MgPSAwLAorCQkuZ3JvdXBfZCA9IDAsCisJCS5ncm91cF9lID0gMCwKKwkJLmdyb3VwX2YgPSAwLAorCiAJCS5ncGlvX2dfaW4gPSAgMHgwMDAwZmYzZSwKIAkJLmdwaW9fZ19vdXQgPSAweDAwMDBmZjM4LAogCQkuZ3Bpb19iID0gMHgwMAogCX0sCiAJewogCQkuaW9pZiA9IGlmX3NoYXJlZF9yYW1fdywKKwkJLm5hbWUgPSAic2hhcmVkX3JhbV93IiwKIAkJLmdyb3VwcyA9IGdyb3VwX2EgfCBncm91cF9kLAorCisJCS5ncm91cF9hID0gMHg3ZjhmZiwKKwkJLmdyb3VwX2IgPSAwLAorCQkuZ3JvdXBfYyA9IDAsCisJCS5ncm91cF9kID0gMHhmZiwKKwkJLmdyb3VwX2UgPSAwLAorCQkuZ3JvdXBfZiA9IDAsCisKIAkJLmdwaW9fZ19pbiA9ICAweDAwZmZmZjNlLAogCQkuZ3Bpb19nX291dCA9IDB4MDBmZmZmMzgsCiAJCS5ncGlvX2IgPSAweDAwCiAJfSwKIAl7CiAJCS5pb2lmID0gaWZfcGFyXzAsCisJCS5uYW1lID0gInBhcl8wIiwKIAkJLmdyb3VwcyA9IGdyb3VwX2EsCisKKwkJLmdyb3VwX2EgPSAweDdmYmZmLAorCQkuZ3JvdXBfYiA9IDAsCisJCS5ncm91cF9jID0gMCwKKwkJLmdyb3VwX2QgPSAwLAorCQkuZ3JvdXBfZSA9IDAsCisJCS5ncm91cF9mID0gMCwKKwogCQkuZ3Bpb19nX2luID0gIDB4MDAwMGZmM2UsCiAJCS5ncGlvX2dfb3V0ID0gMHgwMDAwZmYzZSwKIAkJLmdwaW9fYiA9IDB4MDAKIAl9LAogCXsKIAkJLmlvaWYgPSBpZl9wYXJfMSwKKwkJLm5hbWUgPSAicGFyXzEiLAogCQkuZ3JvdXBzID0gZ3JvdXBfZCwKKworCQkuZ3JvdXBfYSA9IDAsCisJCS5ncm91cF9iID0gMCwKKwkJLmdyb3VwX2MgPSAwLAorCQkuZ3JvdXBfZCA9IDB4N2ZlZmYsCisJCS5ncm91cF9lID0gMCwKKwkJLmdyb3VwX2YgPSAwLAorCiAJCS5ncGlvX2dfaW4gPSAgMHgzZWZmMDAwMCwKIAkJLmdwaW9fZ19vdXQgPSAweDNlZmYwMDAwLAogCQkuZ3Bpb19iID0gMHgwMAogCX0sCiAJewogCQkuaW9pZiA9IGlmX3Bhcl93LAorCQkubmFtZSA9ICJwYXJfdyIsCiAJCS5ncm91cHMgPSBncm91cF9hIHwgZ3JvdXBfZCwKKworCQkuZ3JvdXBfYSA9IDB4N2ZiZmYsCisJCS5ncm91cF9iID0gMCwKKwkJLmdyb3VwX2MgPSAwLAorCQkuZ3JvdXBfZCA9IDB4ZmYsCisJCS5ncm91cF9lID0gMCwKKwkJLmdyb3VwX2YgPSAwLAorCiAJCS5ncGlvX2dfaW4gPSAgMHgwMGZmZmYzZSwKIAkJLmdwaW9fZ19vdXQgPSAweDAwZmZmZjNlLAogCQkuZ3Bpb19iID0gMHgwMAogCX0sCiAJewogCQkuaW9pZiA9IGlmX3Njc2k4XzAsCi0JCS5ncm91cHMgPSBncm91cF9hIHwgZ3JvdXBfYiB8IGdyb3VwX2YsIC8qIGlmX3Njc2k4XzAgYW5kIGlmX3Njc2k4XzEKLQkJCQkJCQkgIGNhbiBiZSB1c2VkIHNpbXVsdGFuZW91c2x5ICovCisJCS5uYW1lID0gInNjc2k4XzAiLAorCQkuZ3JvdXBzID0gZ3JvdXBfYSB8IGdyb3VwX2IgfCBncm91cF9mLAorCisJCS5ncm91cF9hID0gMHg3ZmZmZiwKKwkJLmdyb3VwX2IgPSAweDBmLAorCQkuZ3JvdXBfYyA9IDAsCisJCS5ncm91cF9kID0gMCwKKwkJLmdyb3VwX2UgPSAwLAorCQkuZ3JvdXBfZiA9IDB4MTAsCisKIAkJLmdwaW9fZ19pbiA9ICAweDAwMDBmZmZmLAogCQkuZ3Bpb19nX291dCA9IDB4MDAwMGZmZmYsCiAJCS5ncGlvX2IgPSAweDEwCiAJfSwKIAl7CiAJCS5pb2lmID0gaWZfc2NzaThfMSwKLQkJLmdyb3VwcyA9IGdyb3VwX2MgfCBncm91cF9kIHwgZ3JvdXBfZiwgLyogaWZfc2NzaThfMCBhbmQgaWZfc2NzaThfMQotCQkJCQkJCSAgY2FuIGJlIHVzZWQgc2ltdWx0YW5lb3VzbHkgKi8KKwkJLm5hbWUgPSAic2NzaThfMSIsCisJCS5ncm91cHMgPSBncm91cF9jIHwgZ3JvdXBfZCB8IGdyb3VwX2YsCisKKwkJLmdyb3VwX2EgPSAwLAorCQkuZ3JvdXBfYiA9IDAsCisJCS5ncm91cF9jID0gMHgwZiwKKwkJLmdyb3VwX2QgPSAweDdmZmZmLAorCQkuZ3JvdXBfZSA9IDAsCisJCS5ncm91cF9mID0gMHg4MCwKKwogCQkuZ3Bpb19nX2luID0gIDB4ZmZmZjAwMDAsCiAJCS5ncGlvX2dfb3V0ID0gMHhmZmZmMDAwMCwKIAkJLmdwaW9fYiA9IDB4ODAKIAl9LAogCXsKIAkJLmlvaWYgPSBpZl9zY3NpX3csCisJCS5uYW1lID0gInNjc2lfdyIsCiAJCS5ncm91cHMgPSBncm91cF9hIHwgZ3JvdXBfYiB8IGdyb3VwX2QgfCBncm91cF9mLAorCisJCS5ncm91cF9hID0gMHg3ZmZmZiwKKwkJLmdyb3VwX2IgPSAweDBmLAorCQkuZ3JvdXBfYyA9IDAsCisJCS5ncm91cF9kID0gMHg2MDFmZiwKKwkJLmdyb3VwX2UgPSAwLAorCQkuZ3JvdXBfZiA9IDB4OTAsCisKIAkJLmdwaW9fZ19pbiA9ICAweDAxZmZmZmZmLAogCQkuZ3Bpb19nX291dCA9IDB4MDdmZmZmZmYsCiAJCS5ncGlvX2IgPSAweDgwCiAJfSwKIAl7CiAJCS5pb2lmID0gaWZfYXRhLAorCQkubmFtZSA9ICJhdGEiLAogCQkuZ3JvdXBzID0gZ3JvdXBfYSB8IGdyb3VwX2IgfCBncm91cF9jIHwgZ3JvdXBfZCwKKworCQkuZ3JvdXBfYSA9IDB4N2ZmZmYsCisJCS5ncm91cF9iID0gMHgwZiwKKwkJLmdyb3VwX2MgPSAweDBmLAorCQkuZ3JvdXBfZCA9IDB4N2NmZmYsCisJCS5ncm91cF9lID0gMCwKKwkJLmdyb3VwX2YgPSAwLAorCiAJCS5ncGlvX2dfaW4gPSAgMHhmOWZmZmZmZiwKIAkJLmdwaW9fZ19vdXQgPSAweGZmZmZmZmZmLAogCQkuZ3Bpb19iID0gMHg4MAogCX0sCiAJewogCQkuaW9pZiA9IGlmX2NzcCwKLQkJLmdyb3VwcyA9IGdyb3VwX2YsIC8qIGlmX2NzcCBhbmQgaWZfaTJjIGNhbiBiZSB1c2VkIHNpbXVsdGFuZW91c2x5ICovCisJCS5uYW1lID0gImNzcCIsCisJCS5ncm91cHMgPSBncm91cF9mLAorCisJCS5ncm91cF9hID0gMCwKKwkJLmdyb3VwX2IgPSAwLAorCQkuZ3JvdXBfYyA9IDAsCisJCS5ncm91cF9kID0gMCwKKwkJLmdyb3VwX2UgPSAwLAorCQkuZ3JvdXBfZiA9IDB4ZmMsCisKIAkJLmdwaW9fZ19pbiA9ICAweDAwMDAwMDAwLAogCQkuZ3Bpb19nX291dCA9IDB4MDAwMDAwMDAsCiAJCS5ncGlvX2IgPSAweGZjCiAJfSwKIAl7CiAJCS5pb2lmID0gaWZfaTJjLAotCQkuZ3JvdXBzID0gZ3JvdXBfZiwgLyogaWZfY3NwIGFuZCBpZl9pMmMgY2FuIGJlIHVzZWQgc2ltdWx0YW5lb3VzbHkgKi8KKwkJLm5hbWUgPSAiaTJjIiwKKwkJLmdyb3VwcyA9IGdyb3VwX2YsCisKKwkJLmdyb3VwX2EgPSAwLAorCQkuZ3JvdXBfYiA9IDAsCisJCS5ncm91cF9jID0gMCwKKwkJLmdyb3VwX2QgPSAwLAorCQkuZ3JvdXBfZSA9IDAsCisJCS5ncm91cF9mID0gMHgwMywKKwogCQkuZ3Bpb19nX2luID0gIDB4MDAwMDAwMDAsCiAJCS5ncGlvX2dfb3V0ID0gMHgwMDAwMDAwMCwKIAkJLmdwaW9fYiA9IDB4MDMKIAl9LAogCXsKIAkJLmlvaWYgPSBpZl91c2JfMSwKKwkJLm5hbWUgPSAidXNiXzEiLAogCQkuZ3JvdXBzID0gZ3JvdXBfZSB8IGdyb3VwX2YsCisKKwkJLmdyb3VwX2EgPSAwLAorCQkuZ3JvdXBfYiA9IDAsCisJCS5ncm91cF9jID0gMCwKKwkJLmdyb3VwX2QgPSAwLAorCQkuZ3JvdXBfZSA9IDB4MGYsCisJCS5ncm91cF9mID0gMHgyYywKKwogCQkuZ3Bpb19nX2luID0gIDB4MDAwMDAwMDAsCiAJCS5ncGlvX2dfb3V0ID0gMHgwMDAwMDAwMCwKIAkJLmdwaW9fYiA9IDB4MmMKIAl9LAogCXsKIAkJLmlvaWYgPSBpZl91c2JfMiwKKwkJLm5hbWUgPSAidXNiXzIiLAogCQkuZ3JvdXBzID0gZ3JvdXBfZCwKLQkJLmdwaW9fZ19pbiA9ICAweDBlMDAwMDAwLAotCQkuZ3Bpb19nX291dCA9IDB4M2MwMDAwMDAsCisKKwkJLmdyb3VwX2EgPSAwLAorCQkuZ3JvdXBfYiA9IDAsCisJCS5ncm91cF9jID0gMCwKKwkJLmdyb3VwX2QgPSAwLAorCQkuZ3JvdXBfZSA9IDB4MzNlMDAsCisJCS5ncm91cF9mID0gMCwKKworCQkuZ3Bpb19nX2luID0gIDB4M2UwMDAwMDAsCisJCS5ncGlvX2dfb3V0ID0gMHgwYzAwMDAwMCwKIAkJLmdwaW9fYiA9IDB4MDAKIAl9LAogCS8qIEdQSU8gcGlucyAqLwogCXsKIAkJLmlvaWYgPSBpZl9ncGlvX2dycF9hLAorCQkubmFtZSA9ICJncGlvX2EiLAogCQkuZ3JvdXBzID0gZ3JvdXBfYSwKKworCQkuZ3JvdXBfYSA9IDAsCisJCS5ncm91cF9iID0gMCwKKwkJLmdyb3VwX2MgPSAwLAorCQkuZ3JvdXBfZCA9IDAsCisJCS5ncm91cF9lID0gMCwKKwkJLmdyb3VwX2YgPSAwLAorCiAJCS5ncGlvX2dfaW4gPSAgMHgwMDAwZmYzZiwKIAkJLmdwaW9fZ19vdXQgPSAweDAwMDBmZjNmLAogCQkuZ3Bpb19iID0gMHgwMAogCX0sCiAJewogCQkuaW9pZiA9IGlmX2dwaW9fZ3JwX2IsCisJCS5uYW1lID0gImdwaW9fYiIsCiAJCS5ncm91cHMgPSBncm91cF9iLAorCisJCS5ncm91cF9hID0gMCwKKwkJLmdyb3VwX2IgPSAwLAorCQkuZ3JvdXBfYyA9IDAsCisJCS5ncm91cF9kID0gMCwKKwkJLmdyb3VwX2UgPSAwLAorCQkuZ3JvdXBfZiA9IDAsCisKIAkJLmdwaW9fZ19pbiA9ICAweDAwMDAwMGMwLAogCQkuZ3Bpb19nX291dCA9IDB4MDAwMDAwYzAsCiAJCS5ncGlvX2IgPSAweDAwCiAJfSwKIAl7CiAJCS5pb2lmID0gaWZfZ3Bpb19ncnBfYywKKwkJLm5hbWUgPSAiZ3Bpb19jIiwKIAkJLmdyb3VwcyA9IGdyb3VwX2MsCisKKwkJLmdyb3VwX2EgPSAwLAorCQkuZ3JvdXBfYiA9IDAsCisJCS5ncm91cF9jID0gMCwKKwkJLmdyb3VwX2QgPSAwLAorCQkuZ3JvdXBfZSA9IDAsCisJCS5ncm91cF9mID0gMCwKKwogCQkuZ3Bpb19nX2luID0gIDB4YzAwMDAwMDAsCiAJCS5ncGlvX2dfb3V0ID0gMHhjMDAwMDAwMCwKIAkJLmdwaW9fYiA9IDB4MDAKIAl9LAogCXsKIAkJLmlvaWYgPSBpZl9ncGlvX2dycF9kLAorCQkubmFtZSA9ICJncGlvX2QiLAogCQkuZ3JvdXBzID0gZ3JvdXBfZCwKKworCQkuZ3JvdXBfYSA9IDAsCisJCS5ncm91cF9iID0gMCwKKwkJLmdyb3VwX2MgPSAwLAorCQkuZ3JvdXBfZCA9IDAsCisJCS5ncm91cF9lID0gMCwKKwkJLmdyb3VwX2YgPSAwLAorCiAJCS5ncGlvX2dfaW4gPSAgMHgzZmZmMDAwMCwKIAkJLmdwaW9fZ19vdXQgPSAweDNmZmYwMDAwLAogCQkuZ3Bpb19iID0gMHgwMAogCX0sCiAJewogCQkuaW9pZiA9IGlmX2dwaW9fZ3JwX2UsCisJCS5uYW1lID0gImdwaW9fZSIsCiAJCS5ncm91cHMgPSBncm91cF9lLAorCisJCS5ncm91cF9hID0gMCwKKwkJLmdyb3VwX2IgPSAwLAorCQkuZ3JvdXBfYyA9IDAsCisJCS5ncm91cF9kID0gMCwKKwkJLmdyb3VwX2UgPSAwLAorCQkuZ3JvdXBfZiA9IDAsCisKIAkJLmdwaW9fZ19pbiA9ICAweDAwMDAwMDAwLAogCQkuZ3Bpb19nX291dCA9IDB4MDAwMDAwMDAsCiAJCS5ncGlvX2IgPSAweDAwCiAJfSwKIAl7CiAJCS5pb2lmID0gaWZfZ3Bpb19ncnBfZiwKKwkJLm5hbWUgPSAiZ3Bpb19mIiwKIAkJLmdyb3VwcyA9IGdyb3VwX2YsCisKKwkJLmdyb3VwX2EgPSAwLAorCQkuZ3JvdXBfYiA9IDAsCisJCS5ncm91cF9jID0gMCwKKwkJLmdyb3VwX2QgPSAwLAorCQkuZ3JvdXBfZSA9IDAsCisJCS5ncm91cF9mID0gMCwKKwogCQkuZ3Bpb19nX2luID0gIDB4MDAwMDAwMDAsCiAJCS5ncGlvX2dfb3V0ID0gMHgwMDAwMDAwMCwKIAkJLmdwaW9fYiA9IDB4ZmYKQEAgLTI4NCwxMSArNTQyLDEzIEBACiAKIHN0YXRpYyBzdHJ1Y3Qgd2F0Y2hlciAqd2F0Y2hlcnMgPSBOVUxMOwogCisvKiBUaGUgcGlucyB0aGF0IGFyZSBmcmVlIHRvIHVzZSBpbiB0aGUgR1BJTyBwb3J0cy4gKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgZ3Bpb19pbl9waW5zID0gIDB4ZmZmZmZmZmY7CiBzdGF0aWMgdW5zaWduZWQgaW50IGdwaW9fb3V0X3BpbnMgPSAweGZmZmZmZmZmOwogc3RhdGljIHVuc2lnbmVkIGNoYXIgZ3Bpb19wYl9waW5zID0gMHhmZjsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGdwaW9fcGFfcGlucyA9IDB4ZmY7CiAKKy8qIElkZW50aWZpZXJzIGZvciB0aGUgb3duZXJzIG9mIHRoZSBHUElPIHBpbnMuICovCiBzdGF0aWMgZW51bSBjcmlzX2lvX2ludGVyZmFjZSBncGlvX3BhX293bmVyc1s4XTsKIHN0YXRpYyBlbnVtIGNyaXNfaW9faW50ZXJmYWNlIGdwaW9fcGJfb3duZXJzWzhdOwogc3RhdGljIGVudW0gY3Jpc19pb19pbnRlcmZhY2UgZ3Bpb19wZ19vd25lcnNbMzJdOwpAQCAtMzM4LDEzICs1OTgsMTUgQEAKIAlzdHJ1Y3QgaWZfZ3JvdXAgKmdycDsKIAl1bnNpZ25lZCBjaGFyIGdyb3VwX3NldDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXMgPSAwOwogCiAJKHZvaWQpY3Jpc19pb19pbnRlcmZhY2VfaW5pdCgpOwogCiAJREJHKHByaW50aygiY3Jpc19yZXF1ZXN0X2lvX2ludGVyZmFjZSglZCwgXCIlc1wiKVxuIiwgaW9pZiwgZGV2aWNlX2lkKSk7CiAKIAlpZiAoKGlvaWYgPj0gaWZfbWF4X2ludGVyZmFjZXMpIHx8IChpb2lmIDwgMCkpIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiY3Jpc19yZXF1ZXN0X2lvX2ludGVyZmFjZTogQmFkIGludGVyZmFjZSAldSBzdWJtaXR0ZWQgZm9yICVzXG4iLAorCQlwcmludGsoS0VSTl9DUklUICJjcmlzX3JlcXVlc3RfaW9faW50ZXJmYWNlOiBCYWQgaW50ZXJmYWNlICIKKwkJCSIldSBzdWJtaXR0ZWQgZm9yICVzXG4iLAogCQkgICAgICAgaW9pZiwKIAkJICAgICAgIGRldmljZV9pZCk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzUzLDU5ICs2MTUsNjkgQEAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKIAlpZiAoaW50ZXJmYWNlc1tpb2lmXS51c2VkKSB7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiY3Jpc19pb19pbnRlcmZhY2U6IENhbm5vdCBhbGxvY2F0ZSBpbnRlcmZhY2UgZm9yICVzLCBpbiB1c2UgYnkgJXNcbiIsCisJCXByaW50ayhLRVJOX0NSSVQgImNyaXNfaW9faW50ZXJmYWNlOiBDYW5ub3QgYWxsb2NhdGUgaW50ZXJmYWNlICIKKwkJCSIlcyBmb3IgJXMsIGluIHVzZSBieSAlc1xuIiwKKwkJICAgICAgIGludGVyZmFjZXNbaW9pZl0ubmFtZSwKIAkJICAgICAgIGRldmljZV9pZCwKIAkJICAgICAgIGludGVyZmFjZXNbaW9pZl0ub3duZXIpOwotCQlyZXR1cm4gLUVCVVNZOworCQlyZXMgPSAtRUJVU1k7CisJCWdvdG8gZXhpdDsKIAl9CiAKLQkvKiBDaGVjayB0aGF0IGFsbCByZXF1aXJlZCBncm91cHMgYXJlIGZyZWUgYmVmb3JlIGFsbG9jYXRpbmcsICovCisJLyogQ2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgcGlucyBpbiB0aGUgdXNlZCBncm91cHMgYXJlIGZyZWUKKwkgKiBiZWZvcmUgYWxsb2NhdGluZy4gKi8KIAlncm91cF9zZXQgPSBpbnRlcmZhY2VzW2lvaWZdLmdyb3VwczsKIAl3aGlsZSAoTlVMTCAhPSAoZ3JwID0gZ2V0X2dyb3VwKGdyb3VwX3NldCkpKSB7Ci0JCWlmIChncnAtPnVzZWQpIHsKLQkJCWlmIChncnAtPmdyb3VwID09IGdyb3VwX2YpIHsKLQkJCQlpZiAoKGlmX3N5bmNfc2VyaWFsXzEgPT0gIGlvaWYpIHx8Ci0JCQkJICAgIChpZl9zeW5jX3NlcmlhbF8zID09ICBpb2lmKSkgewotCQkJCQlpZiAoKGdycC0+b3duZXIgIT0gaWZfc3luY19zZXJpYWxfMSkgJiYKLQkJCQkJICAgIChncnAtPm93bmVyICE9IGlmX3N5bmNfc2VyaWFsXzMpKSB7Ci0JCQkJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCQkJCQlyZXR1cm4gLUVCVVNZOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICgoaWZfc2NzaThfMCA9PSBpb2lmKSB8fAotCQkJCQkgICAoaWZfc2NzaThfMSA9PSBpb2lmKSkgewotCQkJCQlpZiAoKGdycC0+b3duZXIgIT0gaWZfc2NzaThfMCkgJiYKLQkJCQkJICAgIChncnAtPm93bmVyICE9IGlmX3Njc2k4XzEpKSB7Ci0JCQkJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCQkJCQlyZXR1cm4gLUVCVVNZOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCQkJcmV0dXJuIC1FQlVTWTsKLQkJCX0KKwkJdW5zaWduZWQgaW50IGlmX2dyb3VwX3VzZSA9IDA7CisKKwkJc3dpdGNoIChncnAtPmdyb3VwKSB7CisJCWNhc2UgZ3JvdXBfYToKKwkJCWlmX2dyb3VwX3VzZSA9IGludGVyZmFjZXNbaW9pZl0uZ3JvdXBfYTsKKwkJCWJyZWFrOworCQljYXNlIGdyb3VwX2I6CisJCQlpZl9ncm91cF91c2UgPSBpbnRlcmZhY2VzW2lvaWZdLmdyb3VwX2I7CisJCQlicmVhazsKKwkJY2FzZSBncm91cF9jOgorCQkJaWZfZ3JvdXBfdXNlID0gaW50ZXJmYWNlc1tpb2lmXS5ncm91cF9jOworCQkJYnJlYWs7CisJCWNhc2UgZ3JvdXBfZDoKKwkJCWlmX2dyb3VwX3VzZSA9IGludGVyZmFjZXNbaW9pZl0uZ3JvdXBfZDsKKwkJCWJyZWFrOworCQljYXNlIGdyb3VwX2U6CisJCQlpZl9ncm91cF91c2UgPSBpbnRlcmZhY2VzW2lvaWZdLmdyb3VwX2U7CisJCQlicmVhazsKKwkJY2FzZSBncm91cF9mOgorCQkJaWZfZ3JvdXBfdXNlID0gaW50ZXJmYWNlc1tpb2lmXS5ncm91cF9mOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlCVUdfT04oMSk7CiAJCX0KKworCQlpZiAoaWZfZ3JvdXBfdXNlICYgZ3JwLT51c2VkKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJjcmlzX3JlcXVlc3RfaW9faW50ZXJmYWNlOiBncm91cCAiCisJCQkJIiVzIG5lZWRlZCBieSAlcyBub3QgYXZhaWxhYmxlXG4iLAorCQkJCWdycC0+bmFtZSwgaW50ZXJmYWNlc1tpb2lmXS5uYW1lKTsKKwkJCXJlcyA9IC1FQlVTWTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCiAJCWdyb3VwX3NldCA9IGNsZWFyX2dyb3VwX2Zyb21fc2V0KGdyb3VwX3NldCwgZ3JwKTsKIAl9CiAKIAkvKiBBcmUgdGhlIHJlcXVpcmVkIEdQSU8gcGlucyBhdmFpbGFibGUgdG9vPyAqLwotCWlmICgoKGludGVyZmFjZXNbaW9pZl0uZ3Bpb19nX2luICYgZ3Bpb19pbl9waW5zKSAhPSBpbnRlcmZhY2VzW2lvaWZdLmdwaW9fZ19pbikgfHwKLQkgICAgKChpbnRlcmZhY2VzW2lvaWZdLmdwaW9fZ19vdXQgJiBncGlvX291dF9waW5zKSAhPSBpbnRlcmZhY2VzW2lvaWZdLmdwaW9fZ19vdXQpIHx8Ci0JICAgICgoaW50ZXJmYWNlc1tpb2lmXS5ncGlvX2IgJiBncGlvX3BiX3BpbnMpICE9IGludGVyZmFjZXNbaW9pZl0uZ3Bpb19iKSkgewotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCXByaW50ayhLRVJOX0NSSVQgImNyaXNfcmVxdWVzdF9pb19pbnRlcmZhY2U6IENvdWxkIG5vdCBnZXQgcmVxdWlyZWQgcGlucyBmb3IgaW50ZXJmYWNlICV1XG4iLAotCQkgICAgICAgaW9pZik7Ci0JCXJldHVybiAtRUJVU1k7CisJaWYgKCgoaW50ZXJmYWNlc1tpb2lmXS5ncGlvX2dfaW4gJiBncGlvX2luX3BpbnMpICE9CisJCQlpbnRlcmZhY2VzW2lvaWZdLmdwaW9fZ19pbikgfHwKKwkJKChpbnRlcmZhY2VzW2lvaWZdLmdwaW9fZ19vdXQgJiBncGlvX291dF9waW5zKSAhPQorCQkJaW50ZXJmYWNlc1tpb2lmXS5ncGlvX2dfb3V0KSB8fAorCQkoKGludGVyZmFjZXNbaW9pZl0uZ3Bpb19iICYgZ3Bpb19wYl9waW5zKSAhPQorCQkJaW50ZXJmYWNlc1tpb2lmXS5ncGlvX2IpKSB7CisJCXByaW50ayhLRVJOX0NSSVQgImNyaXNfcmVxdWVzdF9pb19pbnRlcmZhY2U6IENvdWxkIG5vdCBnZXQgIgorCQkJInJlcXVpcmVkIHBpbnMgZm9yIGludGVyZmFjZSAldVxuIiwgaW9pZik7CisJCXJlcyA9IC1FQlVTWTsKKwkJZ290byBleGl0OwogCX0KIAotCS8qIEFsbCBuZWVkZWQgSS9PIHBpbnMgYW5kIHBpbiBncm91cHMgYXJlIGZyZWUsIGFsbG9jYXRlLiAqLwotCWdyb3VwX3NldCA9IGludGVyZmFjZXNbaW9pZl0uZ3JvdXBzOwotCXdoaWxlIChOVUxMICE9IChncnAgPSBnZXRfZ3JvdXAoZ3JvdXBfc2V0KSkpIHsKLQkJZ3JwLT51c2VkID0gMTsKLQkJZ3JwLT5vd25lciA9IGlvaWY7Ci0JCWdyb3VwX3NldCA9IGNsZWFyX2dyb3VwX2Zyb21fc2V0KGdyb3VwX3NldCwgZ3JwKTsKLQl9Ci0KKwkvKiBDaGVjayB3aGljaCByZWdpc3RlcnMgbmVlZCB0byBiZSByZWNvbmZpZ3VyZWQuICovCiAJZ2VucyA9IGdlbmNvbmZpZ19zaGFkb3c7CiAJZ2Vuc19paSA9IGdlbl9jb25maWdfaWlfc2hhZG93OwogCkBAIC00OTUsOSArNzY3LDQzIEBACiAJCXNldF9nZW5fY29uZmlnID0gMDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcGFuaWMoImNyaXNfcmVxdWVzdF9pb19pbnRlcmZhY2U6IEJhZCBpbnRlcmZhY2UgJXUgc3VibWl0dGVkIGZvciAlc1xuIiwKLQkJICAgICAgaW9pZiwKLQkJICAgICAgZGV2aWNlX2lkKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiY3Jpc19yZXF1ZXN0X2lvX2ludGVyZmFjZTogQmFkIGludGVyZmFjZSAiCisJCQkiJXUgc3VibWl0dGVkIGZvciAlc1xuIiwKKwkJCWlvaWYsIGRldmljZV9pZCk7CisJCXJlcyA9IC1FQlVTWTsKKwkJZ290byBleGl0OworCX0KKworCS8qIEFsbCBuZWVkZWQgSS9PIHBpbnMgYW5kIHBpbiBncm91cHMgYXJlIGZyZWUsIGFsbG9jYXRlLiAqLworCWdyb3VwX3NldCA9IGludGVyZmFjZXNbaW9pZl0uZ3JvdXBzOworCXdoaWxlIChOVUxMICE9IChncnAgPSBnZXRfZ3JvdXAoZ3JvdXBfc2V0KSkpIHsKKwkJdW5zaWduZWQgaW50IGlmX2dyb3VwX3VzZSA9IDA7CisKKwkJc3dpdGNoIChncnAtPmdyb3VwKSB7CisJCWNhc2UgZ3JvdXBfYToKKwkJCWlmX2dyb3VwX3VzZSA9IGludGVyZmFjZXNbaW9pZl0uZ3JvdXBfYTsKKwkJCWJyZWFrOworCQljYXNlIGdyb3VwX2I6CisJCQlpZl9ncm91cF91c2UgPSBpbnRlcmZhY2VzW2lvaWZdLmdyb3VwX2I7CisJCQlicmVhazsKKwkJY2FzZSBncm91cF9jOgorCQkJaWZfZ3JvdXBfdXNlID0gaW50ZXJmYWNlc1tpb2lmXS5ncm91cF9jOworCQkJYnJlYWs7CisJCWNhc2UgZ3JvdXBfZDoKKwkJCWlmX2dyb3VwX3VzZSA9IGludGVyZmFjZXNbaW9pZl0uZ3JvdXBfZDsKKwkJCWJyZWFrOworCQljYXNlIGdyb3VwX2U6CisJCQlpZl9ncm91cF91c2UgPSBpbnRlcmZhY2VzW2lvaWZdLmdyb3VwX2U7CisJCQlicmVhazsKKwkJY2FzZSBncm91cF9mOgorCQkJaWZfZ3JvdXBfdXNlID0gaW50ZXJmYWNlc1tpb2lmXS5ncm91cF9mOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlCVUdfT04oMSk7CisJCX0KKwkJZ3JwLT51c2VkIHw9IGlmX2dyb3VwX3VzZTsKKworCQlncm91cF9zZXQgPSBjbGVhcl9ncm91cF9mcm9tX3NldChncm91cF9zZXQsIGdycCk7CiAJfQogCiAJaW50ZXJmYWNlc1tpb2lmXS51c2VkID0gMTsKQEAgLTUxNiwyNSArODIyLDI4IEBACiAJCSpSX0dFTl9DT05GSUdfSUkgPSBnZW5fY29uZmlnX2lpX3NoYWRvdzsKIAl9CiAKLQlEQkcocHJpbnRrKCJHUElPIHBpbnM6IGF2YWlsYWJsZSBiZWZvcmU6IGdfaW49MHglMDh4IGdfb3V0PTB4JTA4eCBwYj0weCUwMnhcbiIsCi0JCSAgIGdwaW9faW5fcGlucywgZ3Bpb19vdXRfcGlucywgZ3Bpb19wYl9waW5zKSk7Ci0JREJHKHByaW50aygiZ3JhYmJpbmcgcGluczogZ19pbj0weCUwOHggZ19vdXQ9MHglMDh4IHBiPTB4JTAyeFxuIiwKLQkJICAgaW50ZXJmYWNlc1tpb2lmXS5ncGlvX2dfaW4sCi0JCSAgIGludGVyZmFjZXNbaW9pZl0uZ3Bpb19nX291dCwKLQkJICAgaW50ZXJmYWNlc1tpb2lmXS5ncGlvX2IpKTsKKwlEQkcocHJpbnRrKEtFUk5fREVCVUcgIkdQSU8gcGluczogYXZhaWxhYmxlIGJlZm9yZTogIgorCQkiZ19pbj0weCUwOHggZ19vdXQ9MHglMDh4IHBiPTB4JTAyeFxuIiwKKwkJZ3Bpb19pbl9waW5zLCBncGlvX291dF9waW5zLCBncGlvX3BiX3BpbnMpKTsKKwlEQkcocHJpbnRrKEtFUk5fREVCVUcKKwkJImdyYWJiaW5nIHBpbnM6IGdfaW49MHglMDh4IGdfb3V0PTB4JTA4eCBwYj0weCUwMnhcbiIsCisJCWludGVyZmFjZXNbaW9pZl0uZ3Bpb19nX2luLAorCQlpbnRlcmZhY2VzW2lvaWZdLmdwaW9fZ19vdXQsCisJCWludGVyZmFjZXNbaW9pZl0uZ3Bpb19iKSk7CiAKIAlncGlvX2luX3BpbnMgJj0gfmludGVyZmFjZXNbaW9pZl0uZ3Bpb19nX2luOwogCWdwaW9fb3V0X3BpbnMgJj0gfmludGVyZmFjZXNbaW9pZl0uZ3Bpb19nX291dDsKIAlncGlvX3BiX3BpbnMgJj0gfmludGVyZmFjZXNbaW9pZl0uZ3Bpb19iOwogCi0JREJHKHByaW50aygiR1BJTyBwaW5zOiBhdmFpbGFibGUgYWZ0ZXI6IGdfaW49MHglMDh4IGdfb3V0PTB4JTA4eCBwYj0weCUwMnhcbiIsCi0JCSAgIGdwaW9faW5fcGlucywgZ3Bpb19vdXRfcGlucywgZ3Bpb19wYl9waW5zKSk7CisJREJHKHByaW50ayhLRVJOX0RFQlVHICJHUElPIHBpbnM6IGF2YWlsYWJsZSBhZnRlcjogIgorCQkiZ19pbj0weCUwOHggZ19vdXQ9MHglMDh4IHBiPTB4JTAyeFxuIiwKKwkJZ3Bpb19pbl9waW5zLCBncGlvX291dF9waW5zLCBncGlvX3BiX3BpbnMpKTsKIAorZXhpdDoKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQlub3RpZnlfd2F0Y2hlcnMoKTsKLQotCXJldHVybiAwOworCWlmIChyZXMgPT0gMCkKKwkJbm90aWZ5X3dhdGNoZXJzKCk7CisJcmV0dXJuIHJlczsKIH0KIAogCkBAIC01NjAsNDMgKzg2OSwzNSBAQAogCX0KIAlncm91cF9zZXQgPSBpbnRlcmZhY2VzW2lvaWZdLmdyb3VwczsKIAl3aGlsZSAoTlVMTCAhPSAoZ3JwID0gZ2V0X2dyb3VwKGdyb3VwX3NldCkpKSB7Ci0JCWlmIChncnAtPmdyb3VwID09IGdyb3VwX2YpIHsKLQkJCXN3aXRjaCAoaW9pZikKLQkJCXsKLQkJCWNhc2UgaWZfc3luY19zZXJpYWxfMToKLQkJCQlpZiAoKGdycC0+b3duZXIgPT0gaWZfc3luY19zZXJpYWxfMSkgJiYKLQkJCQkgICAgaW50ZXJmYWNlc1tpZl9zeW5jX3NlcmlhbF8zXS51c2VkKSB7Ci0JCQkJCWdycC0+b3duZXIgPSBpZl9zeW5jX3NlcmlhbF8zOwotCQkJCX0gZWxzZQotCQkJCQlncnAtPnVzZWQgPSAwOwotCQkJCWJyZWFrOwotCQkJY2FzZSBpZl9zeW5jX3NlcmlhbF8zOgotCQkJCWlmICgoZ3JwLT5vd25lciA9PSBpZl9zeW5jX3NlcmlhbF8zKSAmJgotCQkJCSAgICBpbnRlcmZhY2VzW2lmX3N5bmNfc2VyaWFsXzFdLnVzZWQpIHsKLQkJCQkJZ3JwLT5vd25lciA9IGlmX3N5bmNfc2VyaWFsXzE7Ci0JCQkJfSBlbHNlCi0JCQkJCWdycC0+dXNlZCA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIGlmX3Njc2k4XzA6Ci0JCQkJaWYgKChncnAtPm93bmVyID09IGlmX3Njc2k4XzApICYmCi0JCQkJICAgIGludGVyZmFjZXNbaWZfc2NzaThfMV0udXNlZCkgewotCQkJCQlncnAtPm93bmVyID0gaWZfc2NzaThfMTsKLQkJCQl9IGVsc2UKLQkJCQkJZ3JwLT51c2VkID0gMDsKLQkJCQlicmVhazsKLQkJCWNhc2UgaWZfc2NzaThfMToKLQkJCQlpZiAoKGdycC0+b3duZXIgPT0gaWZfc2NzaThfMSkgJiYKLQkJCQkgICAgaW50ZXJmYWNlc1tpZl9zY3NpOF8wXS51c2VkKSB7Ci0JCQkJCWdycC0+b3duZXIgPSBpZl9zY3NpOF8wOwotCQkJCX0gZWxzZQotCQkJCQlncnAtPnVzZWQgPSAwOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlncnAtPnVzZWQgPSAwOwotCQkJfQotCQl9IGVsc2UgewotCQkJZ3JwLT51c2VkID0gMDsKKwkJdW5zaWduZWQgaW50IGlmX2dyb3VwX3VzZSA9IDA7CisKKwkJc3dpdGNoIChncnAtPmdyb3VwKSB7CisJCWNhc2UgZ3JvdXBfYToKKwkJCWlmX2dyb3VwX3VzZSA9IGludGVyZmFjZXNbaW9pZl0uZ3JvdXBfYTsKKwkJCWJyZWFrOworCQljYXNlIGdyb3VwX2I6CisJCQlpZl9ncm91cF91c2UgPSBpbnRlcmZhY2VzW2lvaWZdLmdyb3VwX2I7CisJCQlicmVhazsKKwkJY2FzZSBncm91cF9jOgorCQkJaWZfZ3JvdXBfdXNlID0gaW50ZXJmYWNlc1tpb2lmXS5ncm91cF9jOworCQkJYnJlYWs7CisJCWNhc2UgZ3JvdXBfZDoKKwkJCWlmX2dyb3VwX3VzZSA9IGludGVyZmFjZXNbaW9pZl0uZ3JvdXBfZDsKKwkJCWJyZWFrOworCQljYXNlIGdyb3VwX2U6CisJCQlpZl9ncm91cF91c2UgPSBpbnRlcmZhY2VzW2lvaWZdLmdyb3VwX2U7CisJCQlicmVhazsKKwkJY2FzZSBncm91cF9mOgorCQkJaWZfZ3JvdXBfdXNlID0gaW50ZXJmYWNlc1tpb2lmXS5ncm91cF9mOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlCVUdfT04oMSk7CiAJCX0KKworCQlpZiAoKGdycC0+dXNlZCAmIGlmX2dyb3VwX3VzZSkgIT0gaWZfZ3JvdXBfdXNlKQorCQkJQlVHX09OKDEpOworCQlncnAtPnVzZWQgPSBncnAtPnVzZWQgJiB+aWZfZ3JvdXBfdXNlOworCiAJCWdyb3VwX3NldCA9IGNsZWFyX2dyb3VwX2Zyb21fc2V0KGdyb3VwX3NldCwgZ3JwKTsKIAl9CiAJaW50ZXJmYWNlc1tpb2lmXS51c2VkID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvaXJxLmMgYi9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL2lycS5jCmluZGV4IGUwNmFiMDAuLjY1ZWQ4MDMgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9pcnEuYwpAQCAtMSw1ICsxLDQgQEAKLS8qICRJZDogaXJxLmMsdiAxLjQgMjAwNS8wMS8wNCAxMjoyMjoyOCBzdGFydmlrIEV4cCAkCi0gKgorLyoKICAqCWxpbnV4L2FyY2gvY3Jpcy9rZXJuZWwvaXJxLmMKICAqCiAgKiAgICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIKQEAgLTE4LDEwICsxNyw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCi0vKiBGcm9tIGtnZGIuYy4gKi8KLWV4dGVybiB2b2lkIGtnZGJfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIGJyZWFrcG9pbnQodm9pZCk7Ci0KICNkZWZpbmUgbWFza19pcnEoaXJxX25yKSAoKlJfVkVDVF9NQVNLX0NMUiA9IDEgPDwgKGlycV9ucikpOwogI2RlZmluZSB1bm1hc2tfaXJxKGlycV9ucikgKCpSX1ZFQ1RfTUFTS19TRVQgPSAxIDw8IChpcnFfbnIpKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9rZ2RiLmMgYi9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL2tnZGIuYwppbmRleCA3N2Y0YjE0Li5hM2NhNTUxIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL2tnZGIuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL2tnZGIuYwpAQCAtMTcsNjYgKzE3LDggQEAKICohIEp1biAxNyAxOTk5ICBIZW5kcmlrIFJ1aWp0ZXIgQWRkZWQgZ2RiIDQuMTggc3VwcG9ydC4gJ1gnLCAncUMnIGFuZCAncUwnLgogKiEgSnVsIDIxIDE5OTkgIEJqb3JuIFdlc2VuICAgICBlTGludXggcG9ydAogKiEKLSohICRMb2c6IGtnZGIuYyx2ICQKLSohIFJldmlzaW9uIDEuNiAgMjAwNS8wMS8xNCAxMDoxMjoxNyAgc3RhcnZpawotKiEgS0dEQiBvbiBzZXBhcmF0ZSBwb3J0LgotKiEgQ29uc29sZSBmaXhlcyBmcm9tIDIuNC4KLSohCi0qISBSZXZpc2lvbiAxLjUgIDIwMDQvMTAvMDcgMTM6NTk6MDggIHN0YXJ2aWsKLSohIENvcnJlY3RlZCBjYWxsIHRvIHNldF9pbnRfdmVjdG9yCi0qIQotKiEgUmV2aXNpb24gMS40ICAyMDAzLzA0LzA5IDA1OjIwOjQ0ICBzdGFydmlrCi0qISBNZXJnZSBvZiBMaW51eCAyLjUuNjcKLSohCi0qISBSZXZpc2lvbiAxLjMgIDIwMDMvMDEvMjEgMTk6MTE6MDggIHN0YXJ2aWsKLSohIE1vZGlmaWVkIGluY2x1ZGUgcGF0aCBmb3IgbmV3IGRpciBsYXlvdXQKLSohCi0qISBSZXZpc2lvbiAxLjIgIDIwMDIvMTEvMTkgMTQ6MzU6MjQgIHN0YXJ2aWsKLSohIENoYW5nZXMgZnJvbSBsaW51eCAyLjQKLSohIENoYW5nZWQgc3RydWN0IGluaXRpYWxpemVyIHN5bnRheCB0byB0aGUgY3VycmVudGx5IHByZWZlcnJlZCBub3RhdGlvbgotKiEKLSohIFJldmlzaW9uIDEuMSAgMjAwMS8xMi8xNyAxMzo1OToyNyAgYmpvcm53Ci0qISBJbml0aWFsIHJldmlzaW9uCi0qIQotKiEgUmV2aXNpb24gMS42ICAyMDAxLzEwLzA5IDEzOjEwOjAzICBtYXRzZmcKLSohIEFkZGVkICQgb24gcmVnaXN0ZXJzIGFuZCByZW1vdmVkIHNvbWUgdW5kZXJzY29yZXMKLSohCi0qISBSZXZpc2lvbiAxLjUgIDIwMDEvMDQvMTcgMTM6NTg6MzkgIG9yamFuZgotKiEgKiBSZW5hbWVkIENPTkZJR19LR0RCIHRvIENPTkZJR19FVFJBWF9LR0RCLgotKiEKLSohIFJldmlzaW9uIDEuNCAgMjAwMS8wMi8yMyAxMzo0NToxOSAgYmpvcm53Ci0qISBjb25maWcuaCBjaGVjawotKiEKLSohIFJldmlzaW9uIDEuMyAgMjAwMS8wMS8zMSAxODowODoyMyAgb3JqYW5mCi0qISBSZW1vdmVkIGtnZGJfaGFuZGxlX2JyZWFrcG9pbnQgZnJvbSBiZWluZyB0aGUgYnJlYWsgOCBoYW5kbGVyLgotKiEKLSohIFJldmlzaW9uIDEuMiAgMjAwMS8wMS8xMiAxNDoyMjoyNSAgb3JqYW5mCi0qISBVcGRhdGVkIGtlcm5lbCBkZWJ1Z2dpbmcgc3VwcG9ydCB0byB3b3JrIHdpdGggRVRSQVggMTAwTFguCi0qIQotKiEgUmV2aXNpb24gMS4xICAyMDAwLzA3LzEwIDE2OjI1OjIxICBiam9ybncKLSohIEluaXRpYWwgcmV2aXNpb24KLSohCi0qISBSZXZpc2lvbiAxLjEuMS4xICAxOTk5LzEyLzAzIDE0OjU3OjMxICBiam9ybncKLSohICogSW5pdGlhbCB2ZXJzaW9uIG9mIGFyY2gvY3JpcywgdGhlIGxhdGVzdCBDUklTIGFyY2hpdGVjdHVyZSB3aXRoIGFuIE1NVS4KLSohICAgTW9zdGx5IGNvcGllZCBmcm9tIGFyY2gvZXRyYXgxMDAgd2l0aCBhcHByb3ByaWF0ZSByZW5hbWVzIG9mIGZpbGVzLgotKiEgICBUaGUgbW0vIHN1YmRpciBpcyBjb3BpZWQgZnJvbSBhcmNoL2kzODYuCi0qISAgIFRoaXMgZG9lcyBub3QgY29tcGlsZSB5ZXQgYXQgYWxsLgotKiEKLSohCi0qISBSZXZpc2lvbiAxLjQgIDE5OTkvMDcvMjIgMTc6MjU6MjUgIGJqb3JudwotKiEgRG9udCB3YWl0IGZvciArIGluIHB1dHBhY2tldCBpZiB3ZSBoYXZlbnQgaGl0IHRoZSBpbml0aWFsIGJyZWFrcG9pbnQgeWV0LiBBZGRlZCBhIGtnZGJfaW5pdCBmdW5jdGlvbiB3aGljaCBzZXRzIHVwIHRoZSBicmVhayBhbmQgaXJxIHZlY3RvcnMuCi0qIQotKiEgUmV2aXNpb24gMS4zICAxOTk5LzA3LzIxIDE5OjUxOjE4ICBiam9ybncKLSohIENoZWNrIGlmIHRoZSBpbnRlcnJ1cHRpbmcgY2hhciBpcyBhIGN0cmwtQywgaWdub3JlIG90aGVyd2lzZS4KLSohCi0qISBSZXZpc2lvbiAxLjIgIDE5OTkvMDcvMjEgMTg6MDk6MzkgIGJqb3JudwotKiEgUG9ydGVkIHRvIGVMaW51eCBhcmNoaXRlY3R1cmUsIGFuZCBhZGRlZCBzb21lIGtnZGIgZG9jdW1lbnRhdGlvbi4KLSohCi0qIQogKiEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICohCi0qISAkSWQ6IGtnZGIuYyx2IDEuNiAyMDA1LzAxLzE0IDEwOjEyOjE3IHN0YXJ2aWsgRXhwICQKLSohCiAqISAoQykgQ29weXJpZ2h0IDE5OTksIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIsIExVTkQsIFNXRURFTgogKiEKICohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDFhMzc2MGMuLjUzMTE3ZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xLDUgKzEsNCBAQAotLyogJElkOiBwcm9jZXNzLmMsdiAxLjEyIDIwMDQvMTIvMjcgMTE6MTg6MzIgc3RhcnZpayBFeHAgJAotICogCisvKgogICogIGxpbnV4L2FyY2gvY3Jpcy9rZXJuZWwvcHJvY2Vzcy5jCiAgKgogICogIENvcHlyaWdodCAoQykgMTk5NSAgTGludXMgVG9ydmFsZHMKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3B0cmFjZS5jCmluZGV4IGI1NzBhZTkuLmVlNTA1YjIgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9wdHJhY2UuYwpAQCAtNjUsNiArNjUsNyBAQAogcHRyYWNlX2Rpc2FibGUoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKIHsKICAgICAgICAvKiBUb2RvIC0gcGVuZGluZyBzaW5nbGVzdGVwcz8gKi8KKyAgICAgICBjbGVhcl90c2tfdGhyZWFkX2ZsYWcoY2hpbGQsIFRJRl9TWVNDQUxMX1RSQUNFKTsKIH0KIAogLyogCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3NoYWRvd3MuYyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvc2hhZG93cy5jCmluZGV4IDMyNjE3OGEuLjI0NTRhMGIgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvc2hhZG93cy5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvc2hhZG93cy5jCkBAIC0xLDUgKzEsNCBAQAotLyogJElkOiBzaGFkb3dzLmMsdiAxLjIgMjAwNC8xMi8xMyAxMjoyMTo1MSBzdGFydmlrIEV4cCAkCi0gKiAKKy8qCiAgKiBWYXJpb3VzIHNoYWRvdyByZWdpc3RlcnMuIERlZmluZXMgZm9yIHRoZXNlIGFyZSBpbiBpbmNsdWRlL2FzbS1ldHJheDEwMC9pby5oCiAgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC90cmFwcy5jCmluZGV4IDRiZWNjMWIuLjllYWRhNWQgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3RyYXBzLmMKQEAgLTEsMTMgKzEsMTAgQEAKLS8qICRJZDogdHJhcHMuYyx2IDEuNCAyMDA1LzA0LzI0IDE4OjQ3OjU1IHN0YXJ2aWsgRXhwICQKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb25zIGZvciB0cmFwIGhhbmRsZXJzCiAgKgotICogIGxpbnV4L2FyY2gvY3Jpcy9hcmNoLXYxMC90cmFwcy5jCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNywgQXhpcyBDb21tdW5pY2F0aW9ucyBBQi4KICAqCi0gKiAgSGVsZXIgZnVuY3Rpb25zIGZvciB0cmFwIGhhbmRsZXJzCi0gKiAKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiBBeGlzIENvbW11bmljYXRpb25zIEFCCi0gKgotICogIEF1dGhvcnM6ICAgQmpvcm4gV2VzZW4KLSAqICAJICAgICAgIEhhbnMtUGV0ZXIgTmlsc3NvbgorICogQXV0aG9yczogICBCam9ybiBXZXNlbgorICogICAgICAgICAgICBIYW5zLVBldGVyIE5pbHNzb24KICAqCiAgKi8KIApAQCAtMTUsMTI0ICsxMiwxMTkgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3N2X2FkZHJfYWcuaD4KIAotZXh0ZXJuIGludCByYXdfcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKLQotdm9pZCAKLXNob3dfcmVnaXN0ZXJzKHN0cnVjdCBwdF9yZWdzICogcmVncykKK3ZvaWQKK3Nob3dfcmVnaXN0ZXJzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCS8qIFdlIGVpdGhlciB1c2UgcmR1c3AoKSAtIHRoZSBVU1AgcmVnaXN0ZXIsIHdoaWNoIG1pZ2h0IG5vdAotCSAgIGNvcnJlc3BvbmQgdG8gdGhlIGN1cnJlbnQgcHJvY2VzcyBmb3IgYWxsIGNhc2VzIHdlJ3JlIGNhbGxlZCwKLQkgICBvciB3ZSB1c2UgdGhlIGN1cnJlbnQtPnRocmVhZC51c3AsIHdoaWNoIGlzIG5vdCB1cCB0byBkYXRlIGZvcgotCSAgIHRoZSBjdXJyZW50IHByb2Nlc3MuICBFeHBlcmllbmNlIHNob3dzIHdlIHdhbnQgdGhlIFVTUAotCSAgIHJlZ2lzdGVyLiAgKi8KKwkvKgorCSAqIEl0J3MgcG9zc2libGUgdG8gdXNlIGVpdGhlciB0aGUgVVNQIHJlZ2lzdGVyIG9yIGN1cnJlbnQtPnRocmVhZC51c3AuCisJICogVVNQIG1pZ2h0IG5vdCBjb3JyZXNwb25kIHRvIHRoZSBjdXJyZW50IHByb2Nlc3MgZm9yIGFsbCBjYXNlcyB0aGlzCisJICogZnVuY3Rpb24gaXMgY2FsbGVkLCBhbmQgY3VycmVudC0+dGhyZWFkLnVzcCBpc24ndCB1cCB0byBkYXRlIGZvciB0aGUKKwkgKiBjdXJyZW50IHByb2Nlc3MuIEV4cGVyaWVuY2Ugc2hvd3MgdGhhdCB1c2luZyBVU1AgaXMgdGhlIHdheSB0byBnby4KKwkgKi8KIAl1bnNpZ25lZCBsb25nIHVzcCA9IHJkdXNwKCk7CiAKLQlyYXdfcHJpbnRrKCJJUlA6ICUwOGx4IFNSUDogJTA4bHggRENDUjogJTA4bHggVVNQOiAlMDhseCBNT0Y6ICUwOGx4XG4iLAotCSAgICAgICByZWdzLT5pcnAsIHJlZ3MtPnNycCwgcmVncy0+ZGNjciwgdXNwLCByZWdzLT5tb2YgKTsKLQlyYXdfcHJpbnRrKCIgcjA6ICUwOGx4ICByMTogJTA4bHggICByMjogJTA4bHggIHIzOiAlMDhseFxuIiwKKwlwcmludGsoIklSUDogJTA4bHggU1JQOiAlMDhseCBEQ0NSOiAlMDhseCBVU1A6ICUwOGx4IE1PRjogJTA4bHhcbiIsCisJICAgICAgIHJlZ3MtPmlycCwgcmVncy0+c3JwLCByZWdzLT5kY2NyLCB1c3AsIHJlZ3MtPm1vZik7CisKKwlwcmludGsoIiByMDogJTA4bHggIHIxOiAlMDhseCAgIHIyOiAlMDhseCAgcjM6ICUwOGx4XG4iLAogCSAgICAgICByZWdzLT5yMCwgcmVncy0+cjEsIHJlZ3MtPnIyLCByZWdzLT5yMyk7Ci0JcmF3X3ByaW50aygiIHI0OiAlMDhseCAgcjU6ICUwOGx4ICAgcjY6ICUwOGx4ICByNzogJTA4bHhcbiIsCisKKwlwcmludGsoIiByNDogJTA4bHggIHI1OiAlMDhseCAgIHI2OiAlMDhseCAgcjc6ICUwOGx4XG4iLAogCSAgICAgICByZWdzLT5yNCwgcmVncy0+cjUsIHJlZ3MtPnI2LCByZWdzLT5yNyk7Ci0JcmF3X3ByaW50aygiIHI4OiAlMDhseCAgcjk6ICUwOGx4ICByMTA6ICUwOGx4IHIxMTogJTA4bHhcbiIsCisKKwlwcmludGsoIiByODogJTA4bHggIHI5OiAlMDhseCAgcjEwOiAlMDhseCByMTE6ICUwOGx4XG4iLAogCSAgICAgICByZWdzLT5yOCwgcmVncy0+cjksIHJlZ3MtPnIxMCwgcmVncy0+cjExKTsKLQlyYXdfcHJpbnRrKCJyMTI6ICUwOGx4IHIxMzogJTA4bHggb1IxMDogJTA4bHggIHNwOiAlMDhseFxuIiwKLQkgICAgICAgcmVncy0+cjEyLCByZWdzLT5yMTMsIHJlZ3MtPm9yaWdfcjEwLCByZWdzKTsKLQlyYXdfcHJpbnRrKCJSX01NVV9DQVVTRTogJTA4bHhcbiIsICh1bnNpZ25lZCBsb25nKSpSX01NVV9DQVVTRSk7Ci0JcmF3X3ByaW50aygiUHJvY2VzcyAlcyAocGlkOiAlZCwgc3RhY2twYWdlPSUwOGx4KVxuIiwKKworCXByaW50aygicjEyOiAlMDhseCByMTM6ICUwOGx4IG9SMTA6ICUwOGx4ICBzcDogJTA4bHhcbiIsCisJICAgICAgIHJlZ3MtPnIxMiwgcmVncy0+cjEzLCByZWdzLT5vcmlnX3IxMCwgKGxvbmcgdW5zaWduZWQpcmVncyk7CisKKwlwcmludGsoIlJfTU1VX0NBVVNFOiAlMDhseFxuIiwgKHVuc2lnbmVkIGxvbmcpKlJfTU1VX0NBVVNFKTsKKworCXByaW50aygiUHJvY2VzcyAlcyAocGlkOiAlZCwgc3RhY2twYWdlPSUwOGx4KVxuIiwKIAkgICAgICAgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCAodW5zaWduZWQgbG9uZyljdXJyZW50KTsKIAogCS8qCi0gICAgICAgICAqIFdoZW4gaW4ta2VybmVsLCB3ZSBhbHNvIHByaW50IG91dCB0aGUgc3RhY2sgYW5kIGNvZGUgYXQgdGhlCi0gICAgICAgICAqIHRpbWUgb2YgdGhlIGZhdWx0Li4KLSAgICAgICAgICovCi0gICAgICAgIGlmICghIHVzZXJfbW9kZShyZWdzKSkgewotCSAgCWludCBpOworCSAqIFdoZW4gaW4ta2VybmVsLCB3ZSBhbHNvIHByaW50IG91dCB0aGUgc3RhY2sgYW5kIGNvZGUgYXQgdGhlCisJICogdGltZSBvZiB0aGUgZmF1bHQuLgorCSAqLworCWlmICghdXNlcl9tb2RlKHJlZ3MpKSB7CisJCWludCBpOwogCi0gICAgICAgICAgICAgICAgc2hvd19zdGFjayhOVUxMLCAodW5zaWduZWQgbG9uZyopdXNwKTsKKwkJc2hvd19zdGFjayhOVUxMLCAodW5zaWduZWQgbG9uZyAqKXVzcCk7CiAKLQkJLyogRHVtcCBrZXJuZWwgc3RhY2sgaWYgdGhlIHByZXZpb3VzIGR1bXAgd2Fzbid0IG9uZS4gICovCisJCS8qCisJCSAqIElmIHRoZSBwcmV2aW91cyBzdGFjay1kdW1wIHdhc24ndCBhIGtlcm5lbCBvbmUsIGR1bXAgdGhlCisJCSAqIGtlcm5lbCBzdGFjayBub3cuCisJCSAqLwogCQlpZiAodXNwICE9IDApCi0JCQlzaG93X3N0YWNrIChOVUxMLCBOVUxMKTsKKwkJCXNob3dfc3RhY2soTlVMTCwgTlVMTCk7CiAKLSAgICAgICAgICAgICAgICByYXdfcHJpbnRrKCJcbkNvZGU6ICIpOwotICAgICAgICAgICAgICAgIGlmKHJlZ3MtPmlycCA8IFBBR0VfT0ZGU0VUKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWQ7CisJCXByaW50aygiXG5Db2RlOiAiKTsKIAotCQkvKiBPZnRlbiBlbm91Z2ggdGhlIHZhbHVlIGF0IHJlZ3MtPmlycCBkb2VzIG5vdCBwb2ludCB0bwotCQkgICB0aGUgaW50ZXJlc3RpbmcgaW5zdHJ1Y3Rpb24sIHdoaWNoIGlzIG1vc3Qgb2Z0ZW4gdGhlCi0JCSAgIF9wcmV2aW91c18gaW5zdHJ1Y3Rpb24uICBTbyB3ZSBkdW1wIGF0IGFuIG9mZnNldCBsYXJnZQotCQkgICBlbm91Z2ggdGhhdCBpbnN0cnVjdGlvbiBkZWNvZGluZyBzaG91bGQgYmUgaW4gc3luYyBhdAotCQkgICB0aGUgaW50ZXJlc3RpbmcgcG9pbnQsIGJ1dCBzbWFsbCBlbm91Z2ggdG8gZml0IG9uIGEgcm93Ci0JCSAgIChzb3J0IG9mKS4gIFdlIHBvaW50IG91dCB0aGUgcmVncy0+aXJwIGxvY2F0aW9uIGluIGEKLQkJICAga3N5bW9vcHMtZnJpZW5kbHkgd2F5IGJ5IHdyYXBwaW5nIHRoZSBieXRlIGZvciB0aGF0Ci0JCSAgIGFkZHJlc3MgaW4gcGFyZW50aGVzZXMuICAqLwotICAgICAgICAgICAgICAgIGZvcihpID0gLTEyOyBpIDwgMTI7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihfX2dldF91c2VyKGMsICYoKHVuc2lnbmVkIGNoYXIqKXJlZ3MtPmlycClbaV0pKSB7Ci1iYWQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19wcmludGsoIiBCYWQgSVAgdmFsdWUuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQorCQlpZiAocmVncy0+aXJwIDwgUEFHRV9PRkZTRVQpCisJCQlnb3RvIGJhZF92YWx1ZTsKKworCQkvKgorCQkgKiBRdWl0ZSBvZnRlbiB0aGUgdmFsdWUgYXQgcmVncy0+aXJwIGRvZXNuJ3QgcG9pbnQgdG8gdGhlCisJCSAqIGludGVyZXN0aW5nIGluc3RydWN0aW9uLCB3aGljaCBvZnRlbiBpcyB0aGUgcHJldmlvdXMKKwkJICogaW5zdHJ1Y3Rpb24uIFNvIGR1bXAgYXQgYW4gb2Zmc2V0IGxhcmdlIGVub3VnaCB0aGF0IHRoZQorCQkgKiBpbnN0cnVjdGlvbiBkZWNvZGluZyBzaG91bGQgYmUgaW4gc3luYyBhdCB0aGUgaW50ZXJlc3RpbmcKKwkJICogcG9pbnQsIGJ1dCBzbWFsbCBlbm91Z2ggdG8gZml0IG9uIGEgcm93LiBUaGUgcmVncy0+aXJwCisJCSAqIGxvY2F0aW9uIGlzIHBvaW50ZWQgb3V0IGluIGEga3N5bW9vcHMtZnJpZW5kbHkgd2F5IGJ5CisJCSAqIHdyYXBwaW5nIHRoZSBieXRlIGZvciB0aGF0IGFkZHJlc3MgaW4gcGFyZW50aGVzaXNlcy4KKwkJICovCisJCWZvciAoaSA9IC0xMjsgaSA8IDEyOyBpKyspIHsKKwkJCXVuc2lnbmVkIGNoYXIgYzsKKworCQkJaWYgKF9fZ2V0X3VzZXIoYywgJigodW5zaWduZWQgY2hhciAqKXJlZ3MtPmlycClbaV0pKSB7CitiYWRfdmFsdWU6CisJCQkJcHJpbnRrKCIgQmFkIElQIHZhbHVlLiIpOworCQkJCWJyZWFrOworCQkJfQogCiAJCQlpZiAoaSA9PSAwKQotCQkJICByYXdfcHJpbnRrKCIoJTAyeCkgIiwgYyk7CisJCQkJcHJpbnRrKCIoJTAyeCkgIiwgYyk7CiAJCQllbHNlCi0JCQkgIHJhd19wcmludGsoIiUwMnggIiwgYyk7Ci0gICAgICAgICAgICAgICAgfQotCQlyYXdfcHJpbnRrKCJcbiIpOwotICAgICAgICB9CisJCQkJcHJpbnRrKCIlMDJ4ICIsIGMpOworCQl9CisJCXByaW50aygiXG4iKTsKKwl9CiB9CiAKLS8qIENhbGxlZCBmcm9tIGVudHJ5LlMgd2hlbiB0aGUgd2F0Y2hkb2cgaGFzIGJpdHRlbgotICogV2UgcHJpbnQgb3V0IHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIG9vcHMgZHVtcCwgYW5kIGlmCi0gKiB3ZSBoYXZlIHRoZSBuaWNlIGRvZ2d5IGRldmVsb3BtZW50IGZsYWcgc2V0LCB3ZSBoYWx0IGhlcmUKLSAqIGluc3RlYWQgb2YgcmVib290aW5nLgotICovCi0KLWV4dGVybiB2b2lkIHJlc2V0X3dhdGNoZG9nKHZvaWQpOwotZXh0ZXJuIHZvaWQgc3RvcF93YXRjaGRvZyh2b2lkKTsKLQotCiB2b2lkCi13YXRjaGRvZ19iaXRlX2hvb2soc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCithcmNoX2VuYWJsZV9ubWkodm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfRVRSQVhfV0FUQ0hET0dfTklDRV9ET0dHWQotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0Jc3RvcF93YXRjaGRvZygpOwotCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOwotCXdoaWxlKDEpIC8qIG5vdGhpbmcgKi87Ci0jZWxzZQotCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOwotI2VuZGlmCQorCWFzbSB2b2xhdGlsZSAoInNldGYgbSIpOwogfQogCi0vKiBUaGlzIGlzIG5vcm1hbGx5IHRoZSAnT29wcycgcm91dGluZSAqLwotdm9pZCAKLWRpZV9pZl9rZXJuZWwoY29uc3QgY2hhciAqIHN0ciwgc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycikKK2V4dGVybiB2b2lkICgqbm1pX2hhbmRsZXIpKHN0cnVjdCBwdF9yZWdzICopOwordm9pZCBoYW5kbGVfbm1pKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCWlmKHVzZXJfbW9kZShyZWdzKSkKKwlpZiAobm1pX2hhbmRsZXIpCisJCW5taV9oYW5kbGVyKHJlZ3MpOworCisJLyogV2FpdCB1bnRpbCBubWkgaXMgbm8gbG9uZ2VyIGFjdGl2ZS4gKFdlIGVuYWJsZSBOTUkgaW1tZWRpYXRlbHkgYWZ0ZXIKKwkgICByZXR1cm5pbmcgZnJvbSB0aGlzIGZ1bmN0aW9uLCBhbmQgd2UgZG9uJ3Qgd2FudCBpdCBoYXBwZW5pbmcgd2hpbGUKKwkgICBleGl0aW5nIGZyb20gdGhlIE5NSSBpbnRlcnJ1cHQgaGFuZGxlci4pICovCisJd2hpbGUgKCpSX0lSUV9NQVNLMF9SRCAmIElPX1NUQVRFKFJfSVJRX01BU0swX1JELCBubWlfcGluLCBhY3RpdmUpKQorCQk7Cit9CisKKyNpZmRlZiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRQordm9pZAoraGFuZGxlX0JVRyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgYnVnX2ZyYW1lIGY7CisJdW5zaWduZWQgY2hhciBjOworCXVuc2lnbmVkIGxvbmcgaXJwID0gcmVncy0+aXJwOworCisJaWYgKF9fY29weV9mcm9tX3VzZXIoJmYsIChjb25zdCB2b2lkIF9fdXNlciAqKShpcnAgLSA4KSwgc2l6ZW9mIGYpKQogCQlyZXR1cm47CisJaWYgKGYucHJlZml4ICE9IEJVR19QUkVGSVggfHwgZi5tYWdpYyAhPSBCVUdfTUFHSUMpCisJCXJldHVybjsKKwlpZiAoX19nZXRfdXNlcihjLCBmLmZpbGVuYW1lKSkKKwkJZi5maWxlbmFtZSA9ICI8YmFkIGZpbGVuYW1lPiI7CiAKLSNpZmRlZiBDT05GSUdfRVRSQVhfV0FUQ0hET0dfTklDRV9ET0dHWQotCS8qIFRoaXMgcHJpbnRvdXQgbWlnaHQgdGFrZSB0b28gbG9uZyBhbmQgdHJpZ2dlciB0aGUgCi0JICogd2F0Y2hkb2cgbm9ybWFsbHkuIElmIHdlJ3JlIGluIHRoZSBuaWNlIGRvZ2d5Ci0JICogZGV2ZWxvcG1lbnQgbW9kZSwgc3RvcCB0aGUgd2F0Y2hkb2cgZHVyaW5nIHByaW50b3V0LgotCSAqLwotCXN0b3Bfd2F0Y2hkb2coKTsKLSNlbmRpZgotCi0JcmF3X3ByaW50aygiJXM6ICUwNGx4XG4iLCBzdHIsIGVyciAmIDB4ZmZmZik7Ci0KLQlzaG93X3JlZ2lzdGVycyhyZWdzKTsKLQotI2lmZGVmIENPTkZJR19FVFJBWF9XQVRDSERPR19OSUNFX0RPR0dZCi0JcmVzZXRfd2F0Y2hkb2coKTsKLSNlbmRpZgotCWRvX2V4aXQoU0lHU0VHVik7CisJcHJpbnRrKCJrZXJuZWwgQlVHIGF0ICVzOiVkIVxuIiwgZi5maWxlbmFtZSwgZi5saW5lKTsKIH0KLQotdm9pZCBhcmNoX2VuYWJsZV9ubWkodm9pZCkKLXsKLSAgYXNtIHZvbGF0aWxlKCJzZXRmIG0iKTsKLX0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2xpYi9jaGVja3N1bS5TIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2xpYi9jaGVja3N1bS5TCmluZGV4IDg1YzQ4ZjAuLjdkNTUyZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9saWIvY2hlY2tzdW0uUworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAvbGliL2NoZWNrc3VtLlMKQEAgLTEsNCArMSw0IEBACi0vKiAkSWQ6IGNoZWNrc3VtLlMsdiAxLjEgMjAwMS8xMi8xNyAxMzo1OToyNyBiam9ybncgRXhwICQKKy8qCiAgKiBBIGZhc3QgY2hlY2tzdW0gcm91dGluZSB1c2luZyBtb3ZlbQogICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDEgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgogICoKQEAgLTYxLDggKzYxLDYgQEAKIAkKIAlheAogCWFkZHEJMCwkcjEyCi0JYXgJCQk7IGRvIGl0IGFnYWluLCBzaW5jZSB3ZSBtaWdodCBoYXZlIGdlbmVyYXRlZCBhIGNhcnJ5Ci0JYWRkcQkwLCRyMTIKIAogCXN1YnEJMTAqNCwkcjExCiAJYmdlCV9tbG9vcApAQCAtODgsMTAgKzg2LDYgQEAKIAlsc3JxCTE2LCRyMTMJCTsgcjEzID0gY2hlY2tzdW0gPj4gMTYKIAlhbmQuZAkkcjksJHIxMgkJOyBjaGVja3N1bSA9IGNoZWNrc3VtICYgMHhmZmZmCiAJYWRkLmQJJHIxMywkcjEyCQk7IGNoZWNrc3VtICs9IHIxMwotCW1vdmUuZAkkcjEyLCRyMTMJCTsgZG8gdGhlIHNhbWUgYWdhaW4sIG1heWJlIHdlIGdvdCBhIGNhcnJ5IGxhc3QgYWRkCi0JbHNycQkxNiwkcjEzCi0JYW5kLmQJJHI5LCRyMTIKLQlhZGQuZAkkcjEzLCRyMTIKIAogX25vX2ZvbGQ6CiAJY21wcQkyLCRyMTEKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9saWIvY2hlY2tzdW1jb3B5LlMgYi9hcmNoL2NyaXMvYXJjaC12MTAvbGliL2NoZWNrc3VtY29weS5TCmluZGV4IDM1Y2JmZmIuLjU0MGRiOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9saWIvY2hlY2tzdW1jb3B5LlMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2xpYi9jaGVja3N1bWNvcHkuUwpAQCAtMSw0ICsxLDQgQEAKLS8qICRJZDogY2hlY2tzdW1jb3B5LlMsdiAxLjEgMjAwMS8xMi8xNyAxMzo1OToyNyBiam9ybncgRXhwICQKKy8qCiAgKiBBIGZhc3QgY2hlY2tzdW0rY29weSByb3V0aW5lIHVzaW5nIG1vdmVtCiAgKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDEgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgogICoKQEAgLTY3LDggKzY3LDYgQEAKIAkKIAlheAogCWFkZHEJMCwkcjEzCi0JYXgJCQk7IGRvIGl0IGFnYWluLCBzaW5jZSB3ZSBtaWdodCBoYXZlIGdlbmVyYXRlZCBhIGNhcnJ5Ci0JYWRkcQkwLCRyMTMKIAogCXN1YnEJMTAqNCwkcjEyCiAJYmdlCV9tbG9vcApAQCAtOTEsMTAgKzg5LDYgQEAKIAlsc3JxCTE2LCRyOQkJOyByMCA9IGNoZWNrc3VtID4+IDE2CiAJYW5kLmQJMHhmZmZmLCRyMTMJOyBjaGVja3N1bSA9IGNoZWNrc3VtICYgMHhmZmZmCiAJYWRkLmQJJHI5LCRyMTMJOyBjaGVja3N1bSArPSByMAotCW1vdmUuZAkkcjEzLCRyOQk7IGRvIHRoZSBzYW1lIGFnYWluLCBtYXliZSB3ZSBnb3QgYSBjYXJyeSBsYXN0IGFkZAotCWxzcnEJMTYsJHI5Ci0JYW5kLmQJMHhmZmZmLCRyMTMKLQlhZGQuZAkkcjksJHIxMwogCQogX25vX2ZvbGQ6CiAJY21wcQkyLCRyMTIKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9saWIvZHJhbV9pbml0LlMgYi9hcmNoL2NyaXMvYXJjaC12MTAvbGliL2RyYW1faW5pdC5TCmluZGV4IDZhNmJkZmQuLmI5MTkwZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9saWIvZHJhbV9pbml0LlMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2xpYi9kcmFtX2luaXQuUwpAQCAtMSw1ICsxLDQgQEAKLS8qICRJZDogZHJhbV9pbml0LlMsdiAxLjQgMjAwMy8wOS8yMiAwOToyMTo1OSBzdGFydmlrIEV4cCAkCi0gKiAKKy8qCiAgKiBEUkFNL1NEUkFNIGluaXRpYWxpemF0aW9uIC0gYWx0ZXIgd2l0aCBjYXJlCiAgKiBUaGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgaW5jbHVkZWQgZnJvbSBvdGhlciBhc3NlbWJsZXIgZmlsZXMKICAqCkBAIC04LDYwICs3LDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgogICoKLSAqIEF1dGhvcnM6ICBNaWthZWwgU3RhcnZpayAoc3RhcnZpa0BheGlzLmNvbSkJCi0gKiAKLSAqICRMb2c6IGRyYW1faW5pdC5TLHYgJAotICogUmV2aXNpb24gMS40ICAyMDAzLzA5LzIyIDA5OjIxOjU5ICBzdGFydmlrCi0gKiBEZWNvbXByZXNzZXIgaXMgbGlua2VkIHRvIDB4NDA3eHh4eHggYW5kIHNkcmFtIGNvbW1hbmRzIGFyZSBhdCAweDAwMHh4eHh4Ci0gKiBzbyB3ZSBuZWVkIHRvIG1hc2sgb2ZmIDEyIGJpdHMuCi0gKgotICogUmV2aXNpb24gMS4zICAyMDAzLzAzLzMxIDA5OjM4OjM3ICBzdGFydmlrCi0gKiBDb3JyZWN0ZWQgY2FsY3VsYXRpb24gb2YgZW5kIG9mIHNkcmFtIGluaXQgY29tbWFuZHMKLSAqCi0gKiBSZXZpc2lvbiAxLjIgIDIwMDIvMTEvMTkgMTM6MzM6MjkgIHN0YXJ2aWsKLSAqIENoYW5nZXMgZnJvbSBMaW51eCAyLjQKLSAqCi0gKiBSZXZpc2lvbiAxLjEzICAyMDAyLzEwLzMwIDA3OjQyOjI4ICBzdGFydmlrCi0gKiBBbHdheXMgcmVhZCBTRFJBTSBjb21tYW5kIHNlcXVlbmNlIGZyb20gZmxhc2gKLSAqCi0gKiBSZXZpc2lvbiAxLjEyICAyMDAyLzA4LzA5IDExOjM3OjM3ICBvcmphbmYKLSAqIEFkZGVkIGRvdWJsZSBpbml0aWFsaXphdGlvbiB3b3JrLWFyb3VuZCBmb3IgU2Ftc3VuZyBTRFJBTXMuCi0gKgotICogUmV2aXNpb24gMS4xMSAgMjAwMi8wNi8wNCAxMTo0MzoyMSAgc3RhcnZpawotICogQ2hlY2sgaWYgbXJzX2RhdGEgaXMgc3BlY2lmaWVkIGluIGtlcm5lbGNvbmZpZyAobmVjZXNzYXJ5IGZvciBNQ00pCi0gKgotICogUmV2aXNpb24gMS4xMCAgMjAwMS8xMC8wNCAxMjowMDoyMSAgbWFydGlubm4KLSAqIEFkZGVkIG1pc3NpbmcgdW5kZXJzY29yZXMuCi0gKgotICogUmV2aXNpb24gMS45ICAyMDAxLzEwLzAxIDE0OjQ3OjM1ICBiam9ybncKLSAqIEFkZGVkIHJlZ2lzdGVyIHByZWZpeGVzIGFuZCByZW1vdmVkIHVuZGVyc2NvcmVzCi0gKgotICogUmV2aXNpb24gMS44ICAyMDAxLzA1LzE1IDA3OjEyOjQ1ICBocAotICogQ29weSB3YXJuaW5nIGZyb20gaGVhZC5TIGFib3V0IHI4IGFuZCByOQotICoKLSAqIFJldmlzaW9uIDEuNyAgMjAwMS8wNC8xOCAxMjowNTozOSAgYmpvcm53Ci0gKiBGaXhlZCBjb21tZW50cywgYW5kIGV4cGxpY2l0bHkgaW5jbHVkZSBjb25maWcuaCB0byBiZSBzdXJlIGl0cyB0aGVyZQotICoKLSAqIFJldmlzaW9uIDEuNiAgMjAwMS8wNC8xMCAwNjoyMDoxNiAgc3RhcnZpawotICogRGVsYXkgc2hvdWxkIGJlIDIwMHVzLCBub3QgMjAwbnMKLSAqCi0gKiBSZXZpc2lvbiAxLjUgIDIwMDEvMDQvMDkgMDY6MDE6MTMgIHN0YXJ2aWsKLSAqIEFkZGVkIHN1cHBvcnQgZm9yIDEwMCBNSHogU0RSQU1zCi0gKgotICogUmV2aXNpb24gMS40ICAyMDAxLzAzLzI2IDE0OjI0OjAxICBiam9ybncKLSAqIE5hbWVjaGFuZ2Ugb2Ygc29tZSBjb25maWcgb3B0aW9ucwotICoKLSAqIFJldmlzaW9uIDEuMyAgMjAwMS8wMy8yMyAwODoyOTo0MSAgc3RhcnZpawotICogQ29ycmVjdGVkIGNhbGN1bGF0aW9uIG9mIG1yc19kYXRhCi0gKgotICogUmV2aXNpb24gMS4yICAyMDAxLzAyLzA4IDE1OjIwOjAwICBzdGFydmlrCi0gKiBDb3JyZWN0ZWQgU0RSQU0gaW5pdGlhbGl6YXRpb24KLSAqIFNob3VsZCBub3cgYmUgaW5jbHVkZWQgYXMgaW5saW5lCi0gKgotICogUmV2aXNpb24gMS4xICAyMDAxLzAxLzI5IDEzOjA4OjAyICBzdGFydmlrCi0gKiBJbml0aWFsIHZlcnNpb24KLSAqIFRoaXMgZmlsZSBzaG91bGQgYmUgaW5jbHVkZWQgZnJvbSBhbGwgYXNzZW1ibGVyIGZpbGVzIHRoYXQgbmVlZHMgdG8KLSAqIGluaXRpYWxpemUgRFJBTS9TRFJBTS4KKyAqIEF1dGhvcnM6ICBNaWthZWwgU3RhcnZpayAoc3RhcnZpa0BheGlzLmNvbSkKICAqCiAgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2xpYi9vbGRfY2hlY2tzdW0uYyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9saWIvb2xkX2NoZWNrc3VtLmMKaW5kZXggNDk3NjM0YS4uMTczNGI0NiAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjEwL2xpYi9vbGRfY2hlY2tzdW0uYworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAvbGliL29sZF9jaGVja3N1bS5jCkBAIC0xLDUgKzEsNCBAQAotLyogJElkOiBvbGRfY2hlY2tzdW0uYyx2IDEuMyAyMDAzLzEwLzI3IDA4OjA0OjMyIHN0YXJ2aWsgRXhwICQKLSAqCisvKgogICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCiAgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CiAgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAvbW0vZmF1bHQuYyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9tbS9mYXVsdC5jCmluZGV4IGZlMjYxNTAuLjY1NTA0ZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9tbS9mYXVsdC5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9tbS9mYXVsdC5jCkBAIC00LDEwICs0LDEwIEBACiAgKiAgTG93IGxldmVsIGJ1cyBmYXVsdCBoYW5kbGVyCiAgKgogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEgIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNyAgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgogICoKLSAqICBBdXRob3JzOiAgQmpvcm4gV2VzZW4gCi0gKiAKKyAqICBBdXRob3JzOiAgQmpvcm4gV2VzZW4KKyAqCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CkBAIC02MCw3ICs2MCw3IEBACiAjaWZkZWYgREVCVUcKIAlwYWdlX2lkID0gSU9fRVhUUkFDVChSX01NVV9DQVVTRSwgIHBhZ2VfaWQsICAgY2F1c2UpOwogCWFjYyAgICAgPSBJT19FWFRSQUNUKFJfTU1VX0NBVVNFLCAgYWNjX2V4Y3AsICBjYXVzZSk7Ci0JaW52ICAgICA9IElPX0VYVFJBQ1QoUl9NTVVfQ0FVU0UsICBpbnZfZXhjcCwgIGNhdXNlKTsgIAorCWludiAgICAgPSBJT19FWFRSQUNUKFJfTU1VX0NBVVNFLCAgaW52X2V4Y3AsICBjYXVzZSk7CiAJaW5kZXggICA9IElPX0VYVFJBQ1QoUl9UTEJfU0VMRUNULCBpbmRleCwgICAgIHNlbGVjdCk7CiAjZW5kaWYKIAltaXNzICAgID0gSU9fRVhUUkFDVChSX01NVV9DQVVTRSwgIG1pc3NfZXhjcCwgY2F1c2UpOwpAQCAtODQsMTIgKzg0LDEzIEBACiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAlwbWQgPSAocG1kX3QgKikocGdkICsgcGdkX2luZGV4KGFkZHJlc3MpKTsKIAlpZiAocG1kX25vbmUoKnBtZCkpCi0JCXJldHVybjsKKwkJZ290byBleGl0OwogCXB0ZSA9ICpwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIGFkZHJlc3MpOwogCWlmICghcHRlX3ByZXNlbnQocHRlKSkKLQkJcmV0dXJuOworCQlnb3RvIGV4aXQ7CiAJKlJfVExCX1NFTEVDVCA9IHNlbGVjdDsKIAkqUl9UTEJfSEkgPSBjYXVzZTsKIAkqUl9UTEJfTE8gPSBwdGVfdmFsKHB0ZSk7CitleGl0OgogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9tbS90bGIuYyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9tbS90bGIuYwppbmRleCA3ZDlmZWM4Li42YmFmNWJkIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAvbW0vdGxiLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL21tL3RsYi5jCkBAIC00LDggKzQsOCBAQAogICogIExvdyBsZXZlbCBUTEIgaGFuZGxpbmcKICAqCiAgKgotICogIENvcHlyaWdodCAoQykgMjAwMC0yMDAyICBBeGlzIENvbW11bmljYXRpb25zIEFCCi0gKiAgCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDcgIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIKKyAqCiAgKiAgQXV0aG9yczogICBCam9ybiBXZXNlbiAoYmpvcm53QGF4aXMuY29tKQogICoKICAqLwpAQCAtMzksNyArMzksNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiB0aGUgdnBuIG9mIGkgJiAweGYgaXMgc28gd2UgZG9udCB3cml0ZSBzaW1pbGFyIFRMQiBlbnRyaWVzCi0JICogaW4gdGhlIHNhbWUgNC13YXkgZW50cnkgZ3JvdXAuIGRldGFpbHMuLiAKKwkgKiBpbiB0aGUgc2FtZSA0LXdheSBlbnRyeSBncm91cC4gZGV0YWlscy4uLgogCSAqLwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwpAQCAtNDcsNyArNDcsNyBAQAogCQkqUl9UTEJfU0VMRUNUID0gKCBJT19GSUVMRChSX1RMQl9TRUxFQ1QsIGluZGV4LCBpKSApOwogCQkqUl9UTEJfSEkgPSAoIElPX0ZJRUxEKFJfVExCX0hJLCBwYWdlX2lkLCBJTlZBTElEX1BBR0VJRCApIHwKIAkJCSAgICAgIElPX0ZJRUxEKFJfVExCX0hJLCB2cG4sICAgICBpICYgMHhmICkgKTsKLQkJCisKIAkJKlJfVExCX0xPID0gKCBJT19TVEFURShSX1RMQl9MTywgZ2xvYmFsLG5vICAgICAgICkgfAogCQkJICAgICAgSU9fU1RBVEUoUl9UTEJfTE8sIHZhbGlkLCBubyAgICAgICApIHwKIAkJCSAgICAgIElPX1NUQVRFKFJfVExCX0xPLCBrZXJuZWwsbm8JICkgfApAQCAtNzEsMTAgKzcxLDEwIEBACiAKIAlpZihwYWdlX2lkID09IE5PX0NPTlRFWFQpCiAJCXJldHVybjsKLQkKKwogCS8qIG1hcmsgdGhlIFRMQiBlbnRyaWVzIHRoYXQgbWF0Y2ggdGhlIHBhZ2VfaWQgYXMgaW52YWxpZC4KIAkgKiBoZXJlIHdlIGNvdWxkIGFsc28gY2hlY2sgdGhlIF9QQUdFX0dMT0JBTCBiaXQgYW5kIE5PVCBmbHVzaAotCSAqIGdsb2JhbCBwYWdlcy4gaXMgaXQgd29ydGggdGhlIGV4dHJhIEkvTyA/IAorCSAqIGdsb2JhbCBwYWdlcy4gaXMgaXQgd29ydGggdGhlIGV4dHJhIEkvTyA/CiAJICovCiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CkBAIC04Myw3ICs4Myw3IEBACiAJCWlmIChJT19FWFRSQUNUKFJfVExCX0hJLCBwYWdlX2lkLCAqUl9UTEJfSEkpID09IHBhZ2VfaWQpIHsKIAkJCSpSX1RMQl9ISSA9ICggSU9fRklFTEQoUl9UTEJfSEksIHBhZ2VfaWQsIElOVkFMSURfUEFHRUlEICkgfAogCQkJCSAgICAgIElPX0ZJRUxEKFJfVExCX0hJLCB2cG4sICAgICBpICYgMHhmICkgKTsKLQkJCQorCiAJCQkqUl9UTEJfTE8gPSAoIElPX1NUQVRFKFJfVExCX0xPLCBnbG9iYWwsbm8gICkgfAogCQkJCSAgICAgIElPX1NUQVRFKFJfVExCX0xPLCB2YWxpZCwgbm8gICkgfAogCQkJCSAgICAgIElPX1NUQVRFKFJfVExCX0xPLCBrZXJuZWwsbm8gICkgfApAQCAtOTYsOSArOTYsNyBAQAogCiAvKiBpbnZhbGlkYXRlIGEgc2luZ2xlIHBhZ2UgKi8KIAotdm9pZAotZmx1c2hfdGxiX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIAotCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHIpCit2b2lkIGZsdXNoX3RsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOwogCWludCBwYWdlX2lkID0gbW0tPmNvbnRleHQucGFnZV9pZDsKQEAgLTExMyw3ICsxMTEsNyBAQAogCWFkZHIgJj0gUEFHRV9NQVNLOyAvKiBwZXJoYXBzIG5vdCBuZWNlc3NhcnkgKi8KIAogCS8qIGludmFsaWRhdGUgdGhvc2UgVExCIGVudHJpZXMgdGhhdCBtYXRjaCBib3RoIHRoZSBtbSBjb250ZXh0Ci0JICogYW5kIHRoZSB2aXJ0dWFsIGFkZHJlc3MgcmVxdWVzdGVkIAorCSAqIGFuZCB0aGUgdmlydHVhbCBhZGRyZXNzIHJlcXVlc3RlZAogCSAqLwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwpAQCAtMTI1LDcgKzEyMyw3IEBACiAJCSAgICAodGxiX2hpICYgUEFHRV9NQVNLKSA9PSBhZGRyKSB7CiAJCQkqUl9UTEJfSEkgPSBJT19GSUVMRChSX1RMQl9ISSwgcGFnZV9pZCwgSU5WQUxJRF9QQUdFSUQgKSB8CiAJCQkJYWRkcjsgLyogc2FtZSBhZGRyIGFzIGJlZm9yZSB3b3Jrcy4gKi8KLQkJCQorCiAJCQkqUl9UTEJfTE8gPSAoIElPX1NUQVRFKFJfVExCX0xPLCBnbG9iYWwsbm8gICkgfAogCQkJCSAgICAgIElPX1NUQVRFKFJfVExCX0xPLCB2YWxpZCwgbm8gICkgfAogCQkJCSAgICAgIElPX1NUQVRFKFJfVExCX0xPLCBrZXJuZWwsbm8gICkgfApAQCAtMTQ0LDcgKzE0Miw3IEBACiB7CiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkKKwogCXByaW50aygiVExCIGR1bXAuIExPIGlzOiBwZm4gfCByZXNlcnZlZCB8IGdsb2JhbCB8IHZhbGlkIHwga2VybmVsIHwgd2UgIHxcbiIpOwogCiAJbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7CkBAIC0xNzIsMjcgKzE3MCwyOSBAQAogCiAvKiBjYWxsZWQgaW4gc2NoZWR1bGUoKSBqdXN0IGJlZm9yZSBhY3R1YWxseSBkb2luZyB0aGUgc3dpdGNoX3RvICovCiAKLXZvaWQgCi1zd2l0Y2hfbW0oc3RydWN0IG1tX3N0cnVjdCAqcHJldiwgc3RydWN0IG1tX3N0cnVjdCAqbmV4dCwKLQkgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQordm9pZCBzd2l0Y2hfbW0oc3RydWN0IG1tX3N0cnVjdCAqcHJldiwgc3RydWN0IG1tX3N0cnVjdCAqbmV4dCwKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKLQkvKiBtYWtlIHN1cmUgd2UgaGF2ZSBhIGNvbnRleHQgKi8KKwlpZiAocHJldiAhPSBuZXh0KSB7CisJCS8qIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgY29udGV4dCAqLworCQlnZXRfbW11X2NvbnRleHQobmV4dCk7CiAKLQlnZXRfbW11X2NvbnRleHQobmV4dCk7CisJCS8qIHJlbWVtYmVyIHRoZSBwZ2QgZm9yIHRoZSBmYXVsdCBoYW5kbGVycworCQkgKiB0aGlzIGlzIHNpbWlsYXIgdG8gdGhlIHBnZCByZWdpc3RlciBpbiBzb21lIG90aGVyIENQVSdzLgorCQkgKiB3ZSBuZWVkIG91ciBvd24gY29weSBvZiBpdCBiZWNhdXNlIGN1cnJlbnQgYW5kIGFjdGl2ZV9tbQorCQkgKiBtaWdodCBiZSBpbnZhbGlkIGF0IHBvaW50cyB3aGVyZSB3ZSBzdGlsbCBuZWVkIHRvIGRlcmVmZXIKKwkJICogdGhlIHBnZC4KKwkJICovCiAKLQkvKiByZW1lbWJlciB0aGUgcGdkIGZvciB0aGUgZmF1bHQgaGFuZGxlcnMKLQkgKiB0aGlzIGlzIHNpbWlsYXIgdG8gdGhlIHBnZCByZWdpc3RlciBpbiBzb21lIG90aGVyIENQVSdzLgotCSAqIHdlIG5lZWQgb3VyIG93biBjb3B5IG9mIGl0IGJlY2F1c2UgY3VycmVudCBhbmQgYWN0aXZlX21tCi0JICogbWlnaHQgYmUgaW52YWxpZCBhdCBwb2ludHMgd2hlcmUgd2Ugc3RpbGwgbmVlZCB0byBkZXJlZmVyCi0JICogdGhlIHBnZC4KLQkgKi8KKwkJcGVyX2NwdShjdXJyZW50X3BnZCwgc21wX3Byb2Nlc3Nvcl9pZCgpKSA9IG5leHQtPnBnZDsKIAotCXBlcl9jcHUoY3VycmVudF9wZ2QsIHNtcF9wcm9jZXNzb3JfaWQoKSkgPSBuZXh0LT5wZ2Q7CisJCS8qIHN3aXRjaCBjb250ZXh0IGluIHRoZSBNTVUgKi8KIAotCS8qIHN3aXRjaCBjb250ZXh0IGluIHRoZSBNTVUgKi8KLQkKLQlEKHByaW50aygic3dpdGNoaW5nIG1tdV9jb250ZXh0IHRvICVkICglcClcbiIsIG5leHQtPmNvbnRleHQsIG5leHQpKTsKKwkJRChwcmludGsoS0VSTl9ERUJVRyAic3dpdGNoaW5nIG1tdV9jb250ZXh0IHRvICVkICglcClcbiIsCisJCQluZXh0LT5jb250ZXh0LCBuZXh0KSk7CiAKLQkqUl9NTVVfQ09OVEVYVCA9IElPX0ZJRUxEKFJfTU1VX0NPTlRFWFQsIHBhZ2VfaWQsIG5leHQtPmNvbnRleHQucGFnZV9pZCk7CisJCSpSX01NVV9DT05URVhUID0gSU9fRklFTEQoUl9NTVVfQ09OVEVYVCwKKwkJCQkJICBwYWdlX2lkLCBuZXh0LT5jb250ZXh0LnBhZ2VfaWQpOworCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL0tjb25maWcgYi9hcmNoL2NyaXMvYXJjaC12MzIvS2NvbmZpZwppbmRleCBkOGFjYWE5Li4wMDVlZDJiIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvS2NvbmZpZworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvS2NvbmZpZwpAQCAtMSwyNyArMSw3MyBAQAogaWYgRVRSQVhfQVJDSF9WMzIKIAorc291cmNlIGFyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL0tjb25maWcKK3NvdXJjZSBhcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1hMy9LY29uZmlnCisKK3NvdXJjZSBkcml2ZXJzL2NwdWZyZXEvS2NvbmZpZworCiBjb25maWcgRVRSQVhfRFJBTV9WSVJUVUFMX0JBU0UKIAloZXgKIAlkZXBlbmRzIG9uIEVUUkFYX0FSQ0hfVjMyCiAJZGVmYXVsdCAiYzAwMDAwMDAiCiAKLWNvbmZpZyBFVFJBWF9MRUQxRwotCXN0cmluZyAiRmlyc3QgZ3JlZW4gTEVEIGJpdCIKK2Nob2ljZQorCXByb21wdCAiTmJyIG9mIEV0aGVybmV0IExFRCBncm91cHMiCiAJZGVwZW5kcyBvbiBFVFJBWF9BUkNIX1YzMgorCWRlZmF1bHQgRVRSQVhfTkJSX0xFRF9HUlBfT05FCisJaGVscAorCSAgU2VsZWN0IGhvdyBtYW55IEV0aGVybmV0IExFRCBncm91cHMgdGhhdCBjYW4gYmUgdXNlZC4gVXN1YWxseSBvbmUgcGVyIEV0aGVybmV0CisJICBpbnRlcmZhY2UgaXMgYSBnb29kIGNob2ljZS4KKworY29uZmlnCUVUUkFYX05CUl9MRURfR1JQX1pFUk8KKwlib29sICJVc2UgemVybyBMRUQgZ3JvdXBzIgorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIGlmIHlvdSBkbyBub3Qgd2FudCBhbnkgRXRoZXJuZXQgTEVEcy4KKworY29uZmlnCUVUUkFYX05CUl9MRURfR1JQX09ORQorCWJvb2wgIlVzZSBvbmUgTEVEIGdyb3VwIgorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIGlmIHlvdSB3YW50IG9uZSBFdGhlcm5ldCBMRUQgZ3JvdXAuIFRoaXMgTEVEIGdyb3VwCisJICBjYW4gYmUgdXNlZCBmb3Igb25lIG9yIG1vcmUgRXRoZXJuZXQgaW50ZXJmYWNlcy4gSG93ZXZlciwgaXQgaXMKKwkgIHJlY29tZW5kZWQgdGhhdCBlYWNoIEV0aGVybmV0IGludGVyZmFjZSB1c2UgYSBkZWRpY2F0ZWQgTEVEIGdyb3VwLgorCitjb25maWcJRVRSQVhfTkJSX0xFRF9HUlBfVFdPCisJYm9vbCAiVXNlIHR3byBMRUQgZ3JvdXBzIgorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIGlmIHlvdSB3YW50IHR3byBFdGhlcm5ldCBMRUQgZ3JvdXBzLiBUaGlzIGlzIHRoZQorCSAgYmVzdCBjaG9pY2UgaWYgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSBFdGhlcm5ldCBpbnRlcmZhY2UgYW5kCisJICB3b3VsZCBsaWtlIHRvIGhhdmUgc2VwYXJhdGUgTEVEcyBmb3IgdGhlIGludGVyZmFjZXMuCisKK2VuZGNob2ljZQorCitjb25maWcgRVRSQVhfTEVEX0dfTkVUMAorCXN0cmluZyAiRXRoZXJuZXQgTEVEIGdyb3VwIDAgZ3JlZW4gTEVEIGJpdCIKKwlkZXBlbmRzIG9uIEVUUkFYX0FSQ0hfVjMyICYmIChFVFJBWF9OQlJfTEVEX0dSUF9PTkUgfHwgRVRSQVhfTkJSX0xFRF9HUlBfVFdPKQogCWRlZmF1bHQgIlBBMyIKIAloZWxwCi0JICBCaXQgdG8gdXNlIGZvciB0aGUgZmlyc3QgZ3JlZW4gTEVEIChuZXR3b3JrIExFRCkuCi0JICBNb3N0IEF4aXMgcHJvZHVjdHMgdXNlIGJpdCBBMyBoZXJlLgorCSAgQml0IHRvIHVzZSBmb3IgdGhlIGdyZWVuIExFRCBpbiBFdGhlcm5ldCBMRUQgZ3JvdXAgMC4KIAotY29uZmlnIEVUUkFYX0xFRDFSCi0Jc3RyaW5nICJGaXJzdCByZWQgTEVEIGJpdCIKLQlkZXBlbmRzIG9uIEVUUkFYX0FSQ0hfVjMyCitjb25maWcgRVRSQVhfTEVEX1JfTkVUMAorCXN0cmluZyAiRXRoZXJuZXQgTEVEIGdyb3VwIDAgcmVkIExFRCBiaXQiCisJZGVwZW5kcyBvbiBFVFJBWF9BUkNIX1YzMiAmJiAoRVRSQVhfTkJSX0xFRF9HUlBfT05FIHx8IEVUUkFYX05CUl9MRURfR1JQX1RXTykKIAlkZWZhdWx0ICJQQTQiCiAJaGVscAotCSAgQml0IHRvIHVzZSBmb3IgdGhlIGZpcnN0IHJlZCBMRUQgKG5ldHdvcmsgTEVEKS4KLQkgIE1vc3QgQXhpcyBwcm9kdWN0cyB1c2UgYml0IEE0IGhlcmUuCisJICBCaXQgdG8gdXNlIGZvciB0aGUgcmVkIExFRCBpbiBFdGhlcm5ldCBMRUQgZ3JvdXAgMC4KIAotY29uZmlnIEVUUkFYX0xFRDJHCitjb25maWcgRVRSQVhfTEVEX0dfTkVUMQorCXN0cmluZyAiRXRoZXJuZXQgZ3JvdXAgMSBncmVlbiBMRUQgYml0IgorCWRlcGVuZHMgb24gRVRSQVhfQVJDSF9WMzIgJiYgRVRSQVhfTkJSX0xFRF9HUlBfVFdPCisJZGVmYXVsdCAiIgorCWhlbHAKKwkgIEJpdCB0byB1c2UgZm9yIHRoZSBncmVlbiBMRUQgaW4gRXRoZXJuZXQgTEVEIGdyb3VwIDEuCisKK2NvbmZpZyBFVFJBWF9MRURfUl9ORVQxCisJc3RyaW5nICJFdGhlcm5ldCBncm91cCAxIHJlZCBMRUQgYml0IgorCWRlcGVuZHMgb24gRVRSQVhfQVJDSF9WMzIgJiYgRVRSQVhfTkJSX0xFRF9HUlBfVFdPCisJZGVmYXVsdCAiIgorCWhlbHAKKwkgIEJpdCB0byB1c2UgZm9yIHRoZSByZWQgTEVEIGluIEV0aGVybmV0IExFRCBncm91cCAxLgorCitjb25maWcgRVRSQVhfVjMyX0xFRDJHCiAJc3RyaW5nICJTZWNvbmQgZ3JlZW4gTEVEIGJpdCIKIAlkZXBlbmRzIG9uIEVUUkFYX0FSQ0hfVjMyCiAJZGVmYXVsdCAiUEE1IgpAQCAtMjksNyArNzUsNyBAQAogCSAgQml0IHRvIHVzZSBmb3IgdGhlIGZpcnN0IGdyZWVuIExFRCAoc3RhdHVzIExFRCkuCiAJICBNb3N0IEF4aXMgcHJvZHVjdHMgdXNlIGJpdCBBNSBoZXJlLgogCi1jb25maWcgRVRSQVhfTEVEMlIKK2NvbmZpZyBFVFJBWF9WMzJfTEVEMlIKIAlzdHJpbmcgIlNlY29uZCByZWQgTEVEIGJpdCIKIAlkZXBlbmRzIG9uIEVUUkFYX0FSQ0hfVjMyCiAJZGVmYXVsdCAiUEE2IgpAQCAtMzcsNyArODMsNyBAQAogCSAgQml0IHRvIHVzZSBmb3IgdGhlIGZpcnN0IHJlZCBMRUQgKG5ldHdvcmsgTEVEKS4KIAkgIE1vc3QgQXhpcyBwcm9kdWN0cyB1c2UgYml0IEE2IGhlcmUuCiAKLWNvbmZpZyBFVFJBWF9MRUQzRworY29uZmlnIEVUUkFYX1YzMl9MRUQzRwogCXN0cmluZyAiVGhpcmQgZ3JlZW4gTEVEIGJpdCIKIAlkZXBlbmRzIG9uIEVUUkFYX0FSQ0hfVjMyCiAJZGVmYXVsdCAiUEE3IgpAQCAtNDUsNyArOTEsNyBAQAogCSAgQml0IHRvIHVzZSBmb3IgdGhlIGZpcnN0IGdyZWVuIExFRCAoZHJpdmUvcG93ZXIgTEVEKS4KIAkgIE1vc3QgQXhpcyBwcm9kdWN0cyB1c2UgYml0IEE3IGhlcmUuCiAKLWNvbmZpZyBFVFJBWF9MRUQzUgorY29uZmlnIEVUUkFYX1YzMl9MRUQzUgogCXN0cmluZyAiVGhpcmQgcmVkIExFRCBiaXQiCiAJZGVwZW5kcyBvbiBFVFJBWF9BUkNIX1YzMgogCWRlZmF1bHQgIlBBNyIKQEAgLTU0LDM5ICsxMDAsNiBAQAogCSAgTW9zdCBBeGlzIHByb2R1Y3RzIHVzZSBiaXQgQTcgaGVyZS4KIAogY2hvaWNlCi0JcHJvbXB0ICJQcm9kdWN0IGRlYnVnLXBvcnQiCi0JZGVwZW5kcyBvbiBFVFJBWF9BUkNIX1YzMgotCWRlZmF1bHQgRVRSQVhfREVCVUdfUE9SVDAKLQotY29uZmlnIEVUUkFYX0RFQlVHX1BPUlQwCi0JYm9vbCAiU2VyaWFsLTAiCi0JaGVscAotCSAgQ2hvb3NlIGEgc2VyaWFsIHBvcnQgZm9yIHRoZSBFVFJBWCBkZWJ1ZyBjb25zb2xlLiAgRGVmYXVsdCB0bwotCSAgcG9ydCAwLgotCi1jb25maWcgRVRSQVhfREVCVUdfUE9SVDEKLQlib29sICJTZXJpYWwtMSIKLQloZWxwCi0JICBVc2Ugc2VyaWFsIHBvcnQgMSBmb3IgdGhlIGNvbnNvbGUuCi0KLWNvbmZpZyBFVFJBWF9ERUJVR19QT1JUMgotCWJvb2wgIlNlcmlhbC0yIgotCWhlbHAKLQkgIFVzZSBzZXJpYWwgcG9ydCAyIGZvciB0aGUgY29uc29sZS4KLQotY29uZmlnIEVUUkFYX0RFQlVHX1BPUlQzCi0JYm9vbCAiU2VyaWFsLTMiCi0JaGVscAotCSAgVXNlIHNlcmlhbCBwb3J0IDMgZm9yIHRoZSBjb25zb2xlLgotCi1jb25maWcgRVRSQVhfREVCVUdfUE9SVF9OVUxMCi0JYm9vbCAiZGlzYWJsZWQiCi0JaGVscAotCSAgRGlzYWJsZSBzZXJpYWwtcG9ydCBkZWJ1Z2dpbmcuCi0KLWVuZGNob2ljZQotCi1jaG9pY2UKIAlwcm9tcHQgIktlcm5lbCBHREIgcG9ydCIKIAlkZXBlbmRzIG9uIEVUUkFYX0tHREIKIAlkZWZhdWx0IEVUUkFYX0tHREJfUE9SVDAKQEAgLTk1LDI1ICsxMDgsMTEgQEAKIAkgIG5vdCBiZSBlbmFibGVkIHVuZGVyIERyaXZlcnMgZm9yIGJ1aWx0LWluIGludGVyZmFjZXMgKGFzIGl0IGhhcyBpdHMKIAkgIG93biBpbml0aWFsaXphdGlvbiBjb2RlKSBhbmQgc2hvdWxkIG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgZGVidWcgcG9ydC4KIAotY29uZmlnIEVUUkFYX0tHREJfUE9SVDAKLQlib29sICJTZXJpYWwtMCIKK2NvbmZpZyBFVFJBWF9LR0RCX1BPUlQ0CisJYm9vbCAiU2VyaWFsLTQiCisJZGVwZW5kcyBvbiBFVFJBWF9TRVJJQUxfUE9SVFMgPSA1CiAJaGVscAotCSAgVXNlIHNlcmlhbCBwb3J0IDAgZm9yIGtlcm5lbCBkZWJ1Z2dpbmcuCi0KLWNvbmZpZyBFVFJBWF9LR0RCX1BPUlQxCi0JYm9vbCAiU2VyaWFsLTEiCi0JaGVscAotCSAgVXNlIHNlcmlhbCBwb3J0IDEgZm9yIGtlcm5lbCBkZWJ1Z2dpbmcuCi0KLWNvbmZpZyBFVFJBWF9LR0RCX1BPUlQyCi0JYm9vbCAiU2VyaWFsLTIiCi0JaGVscAotCSAgVXNlIHNlcmlhbCBwb3J0IDIgZm9yIGtlcm5lbCBkZWJ1Z2dpbmcuCi0KLWNvbmZpZyBFVFJBWF9LR0RCX1BPUlQzCi0JYm9vbCAiU2VyaWFsLTMiCi0JaGVscAotCSAgVXNlIHNlcmlhbCBwb3J0IDMgZm9yIGtlcm5lbCBkZWJ1Z2dpbmcuCisJICBVc2Ugc2VyaWFsIHBvcnQgNCBmb3Iga2VybmVsIGRlYnVnZ2luZy4KIAogZW5kY2hvaWNlCiAKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9ib290L01ha2VmaWxlIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2Jvb3QvTWFrZWZpbGUKaW5kZXggMjZmMjkzYS4uM2Y5MTM0OSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2Jvb3QvTWFrZWZpbGUKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2Jvb3QvTWFrZWZpbGUKQEAgLTEsMTQgKzEsMjEgQEAKICMKICMgYXJjaC9jcmlzL2FyY2gtdjMyL2Jvb3QvTWFrZWZpbGUKICMKLXRhcmdldCA9ICQodGFyZ2V0X2Jvb3RfZGlyKQotc3JjICAgID0gJChzcmNfYm9vdF9kaXIpCiAKLXpJbWFnZTogY29tcHJlc3NlZC92bWxpbnV6CitPQkpDT1BZID0gb2JqY29weS1jcmlzCitPQkpDT1BZRkxBR1MgPSAtTyBiaW5hcnkgLVIgLm5vdGUgLVIgLmNvbW1lbnQKIAotY29tcHJlc3NlZC92bWxpbnV6OiAkKG9ianRyZWUpL3ZtbGludXgKLQlAJChNQUtFKSAtZiAkKHNyYykvY29tcHJlc3NlZC9NYWtlZmlsZSAkKG9ianRyZWUpL3ZtbGludXoKK3N1YmRpci0gOj0gY29tcHJlc3NlZCByZXNjdWUKK3RhcmdldHMgOj0gSW1hZ2UKIAotY2xlYW46Ci0Jcm0gLWYgekltYWdlIHRvb2xzL2J1aWxkIGNvbXByZXNzZWQvdm1saW51eC5vdXQKLQlAJChNQUtFKSAtZiAkKHNyYykvY29tcHJlc3NlZC9NYWtlZmlsZSBjbGVhbgorJChvYmopL0ltYWdlOiB2bWxpbnV4IEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsb2JqY29weSkKKwlAZWNobyAnICBLZXJuZWw6ICRAIGlzIHJlYWR5JworCiskKG9iaikvY29tcHJlc3NlZC92bWxpbnV4OiAkKG9iaikvSW1hZ2UgRk9SQ0UKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKG9iaikvY29tcHJlc3NlZCAkQAorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQob2JqKS9yZXNjdWUgJChvYmopL3Jlc2N1ZS9yZXNjdWUuYmluCisKKyQob2JqKS96SW1hZ2U6ICAkKG9iaikvY29tcHJlc3NlZC92bWxpbnV4CisJQGNwICQ8ICRACisJQGVjaG8gJyAgS2VybmVsOiAkQCBpcyByZWFkeScKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUgYi9hcmNoL2NyaXMvYXJjaC12MzIvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCmluZGV4IDYwOTY5MmYuLjJjOGMyYzMgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQpAQCAtMSw0MSArMSwzMCBAQAogIwotIyBseDI1L2FyY2gvY3Jpcy9hcmNoLXYzMi9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKKyMgYXJjaC9jcmlzL2FyY2gtdjMyL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQogIwotIyBjcmVhdGUgYSBjb21wcmVzc2VkIHZtbGludXggaW1hZ2UgZnJvbSB0aGUgb3JpZ2luYWwgdm1saW51eCBmaWxlcyBhbmQgcm9tZnMKLSMKLQotdGFyZ2V0ID0gJCh0YXJnZXRfY29tcHJlc3NlZF9kaXIpCi1zcmMgICAgPSAkKHNyY19jb21wcmVzc2VkX2RpcikKIAogQ0MgPSBnY2MtY3JpcyAtbWxpbnV4IC1tYXJjaD12MzIgJChMSU5VWElOQ0xVREUpCi1DRkxBR1MgPSAtTzIKK2FzZmxhZ3MteSArPSAtSSAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtL21hY2gvIC1JICQoc3JjdHJlZSkvaW5jbHVkZS9hc20vYXJjaAorY2NmbGFncy15ICs9IC1PMiAtSSAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtL21hY2gvIC1JICQoc3JjdHJlZSkvaW5jbHVkZS9hc20vYXJjaAogTEQgPSBnY2MtY3JpcyAtbWxpbnV4IC1tYXJjaD12MzIgLW5vc3RkbGliCitsZGZsYWdzLXkgKz0gLVQgJChvYmopL2RlY29tcHJlc3MubGQKK29iai15ID0gaGVhZC5vIG1pc2MubworT0JKRUNUUyA9ICQob2JqKS9oZWFkLm8gJChvYmopL21pc2MubwogT0JKQ09QWSA9IG9iamNvcHktY3JpcwogT0JKQ09QWUZMQUdTID0gLU8gYmluYXJ5IC0tcmVtb3ZlLXNlY3Rpb249LmJzcwotT0JKRUNUUyA9ICQodGFyZ2V0KS9oZWFkLm8gJCh0YXJnZXQpL21pc2MubwogCi0jIGZpbGVzIHRvIGNvbXByZXNzCi1TWVNURU0gPSAkKG9ianRyZWUpL3ZtbGludXguYmluCitxdWlldF9jbWRfaW1hZ2UgPSBCVUlMRCAgICRACitjbWRfaW1hZ2UgPSBjYXQgJChvYmopL2RlY29tcHJlc3MuYmluICQob2JqKS9waWdneS5neiA+ICRACiAKLWFsbDogdm1saW51egordGFyZ2V0cyA6PSB2bWxpbnV4IHBpZ2d5Lmd6IGRlY29tcHJlc3MubyBkZWNvbXByZXNzLmJpbgogCi0kKHRhcmdldCkvZGVjb21wcmVzcy5iaW46ICQoT0JKRUNUUykKLQkkKExEKSAtVCAkKHNyYykvZGVjb21wcmVzcy5sZCAtbyAkKHRhcmdldCkvZGVjb21wcmVzcy5vICQoT0JKRUNUUykKLQkkKE9CSkNPUFkpICQoT0JKQ09QWUZMQUdTKSAkKHRhcmdldCkvZGVjb21wcmVzcy5vICQodGFyZ2V0KS9kZWNvbXByZXNzLmJpbgorJChvYmopL2RlY29tcHJlc3MubzogJChPQkpFQ1RTKSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGxkKQogCi0kKG9ianRyZWUpL3ZtbGludXo6ICQodGFyZ2V0KSBwaWdneS5pbWcgJCh0YXJnZXQpL2RlY29tcHJlc3MuYmluCi0JY2F0ICQodGFyZ2V0KS9kZWNvbXByZXNzLmJpbiBwaWdneS5pbWcgPiAkKG9ianRyZWUpL3ZtbGludXoKLQlybSAtZiBwaWdneS5pbWcKLQljcCAkKG9ianRyZWUpL3ZtbGludXogJChzcmMpCiskKG9iaikvZGVjb21wcmVzcy5iaW46ICQob2JqKS9kZWNvbXByZXNzLm8gRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxvYmpjb3B5KQogCi0kKHRhcmdldCkvaGVhZC5vOiAkKHNyYykvaGVhZC5TCi0JJChDQykgLURfX0FTU0VNQkxZX18gLWMgJDwgLW8gJEAKKyQob2JqKS92bWxpbnV4OiAkKG9iaikvcGlnZ3kuZ3ogJChvYmopL2RlY29tcHJlc3MuYmluIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsaW1hZ2UpCiAKLSMgZ3ppcCB0aGUga2VybmVsIGltYWdlCi0KLXBpZ2d5LmltZzogJChTWVNURU0pCi0JY2F0ICQoU1lTVEVNKSB8IGd6aXAgLWYgLTkgPiBwaWdneS5pbWcKLQotY2xlYW46Ci0Jcm0gLWYgcGlnZ3kuaW1nICQob2JqdHJlZSkvdm1saW51eiB2bWxpbnV6Lm8gZGVjb21wcmVzcy5vIGRlY29tcHJlc3MuYmluICQoT0JKRUNUUykKLQorJChvYmopL3BpZ2d5Lmd6OiAkKG9iaikvLi4vSW1hZ2UgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxnemlwKQpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2Jvb3QvY29tcHJlc3NlZC9SRUFETUUgYi9hcmNoL2NyaXMvYXJjaC12MzIvYm9vdC9jb21wcmVzc2VkL1JFQURNRQppbmRleCBlMzM2OTFkLi4xODJjNWQ3IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvYm9vdC9jb21wcmVzc2VkL1JFQURNRQorKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvYm9vdC9jb21wcmVzc2VkL1JFQURNRQpAQCAtMSw2ICsxLDUgQEAKIENyZWF0aW9uIG9mIHRoZSBzZWxmLWV4dHJhY3RpbmcgY29tcHJlc3NlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXopCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotJElkOiBSRUFETUUsdiAxLjEgMjAwMy8wOC8yMSAwOTozNzowMyBqb2hhbmEgRXhwICQKIAogVGhpcyBjYW4gYmUgc2xpZ2h0bHkgY29uZnVzaW5nIGJlY2F1c2UgaXQncyBhIHByb2Nlc3Mgd2l0aCBtYW55IHN0ZXBzLgogCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvYm9vdC9jb21wcmVzc2VkL2hlYWQuUyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9ib290L2NvbXByZXNzZWQvaGVhZC5TCmluZGV4IDM0Y2VhMTAuLmY4NjIwOGMgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9ib290L2NvbXByZXNzZWQvaGVhZC5TCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9ib290L2NvbXByZXNzZWQvaGVhZC5TCkBAIC0yLDEzICsyLDEyIEBACiAgKiAgQ29kZSB0aGF0IHNldHMgdXAgdGhlIERSQU0gcmVnaXN0ZXJzLCBjYWxscyB0aGUKICAqICBkZWNvbXByZXNzb3IgdG8gdW5wYWNrIHRoZSBwaWdneWJhY2tlZCBrZXJuZWwsIGFuZCBqdW1wcy4KICAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk5IC0gMjAwMywgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgorICogIENvcHlyaWdodCAoQykgMTk5OSAtIDIwMDYsIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIKICAqLwogCiAjZGVmaW5lIEFTU0VNQkxFUl9NQUNST1NfT05MWQotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9hc20vcmVnX21hcF9hc20uaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvYXNtL2dpb19kZWZzX2FzbS5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9hc20vY29uZmlnX2RlZnNfYXNtLmg+CisjaW5jbHVkZSA8aHdyZWdzL2FzbS9yZWdfbWFwX2FzbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21hY2gvc3RhcnR1cC5pbmM+CiAKICNkZWZpbmUgUkFNX0lOSVRfTUFHSUMgMHg1NjkwMjM4NwogI2RlZmluZSBDT01NQU5EX0xJTkVfTUFHSUMgMHg4NzEwOTU2MwpAQCAtMjIsMTE0ICsyMSw0OSBAQAogCWRpCiAKIAk7OyBTdGFydCBjbG9ja3MgZm9yIHVzZWQgYmxvY2tzLgotCW1vdmUuZCBSRUdfQUREUihjb25maWcsIHJlZ2lfY29uZmlnLCByd19jbGtfY3RybCksICRyMQotCW1vdmUuZCBbJHIxXSwgJHIwCi0Jb3IuZCAgIFJFR19TVEFURShjb25maWcsIHJ3X2Nsa19jdHJsLCBjcHUsIHllcykgfCBcCi0JICAgICAgIFJFR19TVEFURShjb25maWcsIHJ3X2Nsa19jdHJsLCBiaWYsIHllcykgfCBcCi0JICAgICAgIFJFR19TVEFURShjb25maWcsIHJ3X2Nsa19jdHJsLCBmaXhfaW8sIHllcyksICRyMAotCW1vdmUuZCAkcjAsIFskcjFdCisJU1RBUlRfQ0xPQ0tTCiAKLQk7OyBJZiBib290aW5nIGZyb20gTkFORCBmbGFzaCB3ZSBmaXJzdCBoYXZlIHRvIGNvcHkgc29tZQotCTs7IGRhdGEgZnJvbSBOQU5EIGZsYXNoIHRvIGludGVybmFsIFJBTSB0byBnZXQgdGhlIGNvZGUKLQk7OyB0aGF0IGluaXRpYWxpemVzIHRoZSBTRFJBTS4gTGV0cyBjb3B5IDIwIEtCLiBUaGlzCi0JOzsgY29kZSBleGVjdXRlcyBhdCAweDM4MDEwMDAwIGlmIGJvb3RpbmcgZnJvbSBOQU5EIGFuZAotCTs7IHdlIGFyZSBndWFyYW50ZWQgdGhhdCBhdCBsZWFzdCAweDIwMCBieXRlcyBhcmUgZ29vZCBzbwotCTs7IGxldHMgc3RhcnQgZnJvbSB0aGVyZS4gVGhlIGZpcnN0IDgxOTIgYnl0ZXMgaW4gdGhlIG5hbmQKLQk7OyBmbGFzaCBpcyBzcGxpY2VkIHdpdGggemVyb2VzIGFuZCBpcyB0aHVzIDE2Mzg0IGJ5dGVzLgotCW1vdmUuZCAweDM4MDEwMjAwLCAkcjEwCi0JbW92ZS5kIDB4MTQyMDAsICRyMTEJOyBTdGFydCBvZmZzZXQgaW4gTkFORCBmbGFzaCAweDEwMjAwICsgMTYzODQKLQltb3ZlLmQgMHg1MDAwLCAkcjEyCTsgTGVuZ3RoIG9mIGNvcHkKLQotCTs7IEJlZm9yZSB0aGlzIGNvZGUgdGhlIHRvb2xzIGFkZCBhIHBhcnRpdGlvbnRhYmxlIHNvIHRoZSBQQwotCTs7IGhhcyBhbiBvZmZzZXQgZnJvbSB0aGUgbGlua2VkIGFkZHJlc3MuCi1vZmZzZXQxOgotCWxhcGNxICAuLCAkcjEzCQk7IGdldCBQQwotCWFkZC5kCWZpcnN0X2NvcHlfY29tcGxldGUtb2Zmc2V0MSwgJHIxMwotCi0jaW5jbHVkZSAiLi4vLi4vbGliL25hbmRfaW5pdC5TIgotCi1maXJzdF9jb3B5X2NvbXBsZXRlOgotCTs7IEluaXRpYWx6ZSB0aGUgRFJBTSByZWdpc3RlcnMuCisJOzsgSW5pdGlhbGl6ZSB0aGUgRFJBTSByZWdpc3RlcnMuCiAJY21wLmQJUkFNX0lOSVRfTUFHSUMsICRyOAk7IEFscmVhZHkgaW5pdGlhbGl6ZWQ/CiAJYmVxCWRyYW1faW5pdF9maW5pc2hlZAogCW5vcAogCi0jaW5jbHVkZSAiLi4vLi4vbGliL2RyYW1faW5pdC5TIgorI2luY2x1ZGUgIi4uLy4uL21hY2gvZHJhbV9pbml0LlMiCiAKIGRyYW1faW5pdF9maW5pc2hlZDoKLQlsYXBjcSAgLiwgJHIxMwkJOyBnZXQgUEMKLQlhZGQuZAlzZWNvbmRfY29weV9jb21wbGV0ZS1kcmFtX2luaXRfZmluaXNoZWQsICRyMTMKIAotCW1vdmUuZCBSRUdfQUREUihjb25maWcsIHJlZ2lfY29uZmlnLCByX2Jvb3RzZWwpLCAkcjAKLQltb3ZlLmQgWyRyMF0sICRyMAotCWFuZC5kICBSRUdfTUFTSyhjb25maWcsIHJfYm9vdHNlbCwgYm9vdF9tb2RlKSwgJHIwCi0JY21wLmQgIFJFR19TVEFURShjb25maWcsIHJfYm9vdHNlbCwgYm9vdF9tb2RlLCBuYW5kKSwgJHIwCi0JYm5lIHNlY29uZF9jb3B5X2NvbXBsZXRlIDsgTm8gTkFORCBib290Ci0Jbm9wCi0KLQk7OyBDb3B5IDJNQiBmcm9tIE5BTkQgZmxhc2ggdG8gU0RSQU0gKGF0IDItNE1CIGludG8gdGhlIFNEUkFNKQotCW1vdmUuZCAweDQwMjA0MDAwLCAkcjEwCi0JbW92ZS5kIDB4ODAwMCwgJHIxMQotCW1vdmUuZCAweDIwMDAwMCwgJHIxMgotCWJhIGNvcHlfbmFuZF90b19yYW0KLQlub3AKLXNlY29uZF9jb3B5X2NvbXBsZXRlOgotCi0JOzsgSW5pdGlhdGUgdGhlIFBBIHBvcnQuCi0JbW92ZS5kCUNPTkZJR19FVFJBWF9ERUZfR0lPX1BBX09VVCwgJHIwCi0JbW92ZS5kCVJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3BhX2RvdXQpLCAkcjEKLQltb3ZlLmQJJHIwLCBbJHIxXQotCi0JbW92ZS5kCUNPTkZJR19FVFJBWF9ERUZfR0lPX1BBX09FLCAkcjAKLQltb3ZlLmQJUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcndfcGFfb2UpLCAkcjEKLQltb3ZlLmQJJHIwLCBbJHIxXQotCisJR0lPX0lOSVQKIAk7OyBTZXR1cCB0aGUgc3RhY2sgdG8gYSBzdWl0YWJseSBoaWdoIGFkZHJlc3MuCiAJOzsgV2UgYXNzdW1lIDggTUIgaXMgdGhlIG1pbmltdW0gRFJBTSBhbmQgcHV0CiAJOzsgdGhlIFNQIGF0IHRoZSB0b3AgZm9yIG5vdy4KIAogCW1vdmUuZAkweDQwODAwMDAwLCAkc3AKIAotCTs7IEZpZ3VyZSBvdXQgd2hlcmUgdGhlIGNvbXByZXNzZWQgcGlnZ3liYWNrIGltYWdlIGlzCi0JOzsgaW4gdGhlIGZsYXNoIChzaW5jZSB3ZSB3b250IHRyeSB0byBjb3B5IGl0IHRvIERSQU0KLQk7OyBiZWZvcmUgdW5wYWNraW5nKS4gSXQgaXMgYXQgX2VkYXRhLCBidXQgaW4gZmxhc2guCisJOzsgRmlndXJlIG91dCB3aGVyZSB0aGUgY29tcHJlc3NlZCBwaWdneWJhY2sgaW1hZ2UgaXMuCisJOzsgSXQgaXMgZWl0aGVyIGluIFtOT1JdIGZsYXNoICh3ZSBkb24ndCB3YW50IHRvIGNvcHkgaXQKKwk7OyB0byBEUkFNIGJlZm9yZSB1bnBhY2tpbmcpLCBvciBjb3BpZWQgdG8gRFJBTQorCTs7IGJ5IHRoZSBbTkFORF0gZmxhc2ggYm9vdCBsb2FkZXIuCisJOzsgVGhlIHBpZ2d5YmFjayBpbWFnZSBpcyBhdCBfZWRhdGEsIGJ1dCByZWxhdGl2ZSB0byB3aGVyZSB0aGUKKwk7OyBpbWFnZSBpcyBhY3R1YWxseSBsb2NhdGVkIGluIG1lbW9yeSwgbm90IHdoZXJlIGl0IGlzIGxpbmtlZAorCTs7ICh0aGUgZGVjb21wcmVzc29yIGlzIGxpbmtlZCBhdCAweDQwNzAwMDAwKyBhbmQgcnVucyB0aGVyZSkuCiAJOzsgVXNlIChfZWRhdGEgLSBoZXJhbWkpIGFzIG9mZnNldCB0byB0aGUgY3VycmVudCBQQy4KIAotCW1vdmUuZCBSRUdfQUREUihjb25maWcsIHJlZ2lfY29uZmlnLCByX2Jvb3RzZWwpLCAkcjAKLQltb3ZlLmQgWyRyMF0sICRyMAotCWFuZC5kICBSRUdfTUFTSyhjb25maWcsIHJfYm9vdHNlbCwgYm9vdF9tb2RlKSwgJHIwCi0JY21wLmQgIFJFR19TVEFURShjb25maWcsIHJfYm9vdHNlbCwgYm9vdF9tb2RlLCBuYW5kKSwgJHIwCi0JYmVxIGhlcmVhbWkyCi0Jbm9wCiBoZXJlYW1pOgogCWxhcGNxCS4sICRyNQkJOyBnZXQgUEMKIAlhbmQuZAkweDdmZmZmZmZmLCAkcjUJOyBzdHJpcCBhbnkgbm9uLWNhY2hlIGJpdAotCW1vdmUuZAkkcjUsICRyMAk7IHNhdmUgZm9yIGxhdGVyIC0gZmxhc2ggYWRkcmVzcyBvZiAnaGVyYW1pJworCW1vdmUuZAkkcjUsICRyMAk7IHNvdXJjZSBhZGRyZXNzIG9mICdoZXJhbWknCiAJYWRkLmQJX2VkYXRhLCAkcjUKIAlzdWIuZAloZXJlYW1pLCAkcjUJOyByNSA9IGZsYXNoIGFkZHJlc3Mgb2YgJ19lZGF0YScKIAltb3ZlLmQJaGVyZWFtaSwgJHIxCTsgZGVzdGluYXRpb24KLQliYSAyZgotCW5vcAotaGVyZWFtaTI6Ci0JbGFwY3EJLiwgJHI1CQk7IGdldCBQQwotCWFuZC5kCTB4MDBmZmZmZmYsICRyNQk7IHN0cmlwIGFueSBub24tY2FjaGUgYml0Ci0JbW92ZS5kICAkcjUsICRyNgotCW9yLmQgICAgMHg0MDIwMDAwMCwgJHI2Ci0JbW92ZS5kCSRyNiwgJHIwCTsgc2F2ZSBmb3IgbGF0ZXIgLSBmbGFzaCBhZGRyZXNzIG9mICdoZXJhbWknCi0JYWRkLmQJX2VkYXRhLCAkcjUKLQlzdWIuZAloZXJlYW1pMiwgJHI1CTsgcjUgPSBmbGFzaCBhZGRyZXNzIG9mICdfZWRhdGEnCi0JYWRkLmQgICAweDQwMjAwMDAwLCAkcjUKLQltb3ZlLmQJaGVyZWFtaTIsICRyMQk7IGRlc3RpbmF0aW9uCi0yOgorCiAJOzsgQ29weSB0ZXh0K2RhdGEgdG8gRFJBTQogCiAJbW92ZS5kCV9lZGF0YSwgJHIyCTsgZW5kIGRlc3RpbmF0aW9uCi0xOgltb3ZlLncJWyRyMCtdLCAkcjMKLQltb3ZlLncJJHIzLCBbJHIxK10KLQljbXAuZAkkcjIsICRyMQorMToJbW92ZS53CVskcjArXSwgJHIzCTsgZnJvbSBoZXJhbWkrIHNvdXJjZQorCW1vdmUudwkkcjMsIFskcjErXQk7IHRvIGhlcmVhbWkrIGRlc3RpbmF0aW9uIChsaW5rZWQgYWRkcmVzcykKKwljbXAuZAkkcjIsICRyMQk7IGZpbmlzaCB3aGVuIGRlc3RpbmF0aW9uID09IF9lZGF0YQogCWJjcwkxYgogCW5vcAotCiAJbW92ZS5kCWlucHV0X2RhdGEsICRyMCA7IGZvciB0aGUgZGVjb21wcmVzc29yCiAJbW92ZS5kCSRyNSwgWyRyMF0JOyBmb3IgdGhlIGRlY29tcHJlc3NvcgogCkBAIC0xNDQsMTYgKzc4LDI0IEBACiAJbm9wCiAKIAk7OyAgU2F2ZSBjb21tYW5kIGxpbmUgbWFnaWMgYW5kIGFkZHJlc3MuCi0JbW92ZS5kCV9jbWRfbGluZV9tYWdpYywgJHIxMgotCW1vdmUuZCAgJHIxMCwgWyRyMTJdCi0JbW92ZS5kCV9jbWRfbGluZV9hZGRyLCAkcjEyCi0JbW92ZS5kICAkcjExLCBbJHIxMl0KKwltb3ZlLmQJX2NtZF9saW5lX21hZ2ljLCAkcjAKKwltb3ZlLmQgICRyMTAsIFskcjBdCisJbW92ZS5kCV9jbWRfbGluZV9hZGRyLCAkcjAKKwltb3ZlLmQgICRyMTEsIFskcjBdCisKKwk7OyAgU2F2ZSBib290IHNvdXJjZSBpbmRpY2F0b3IKKwltb3ZlLmQJX2Jvb3Rfc291cmNlLCAkcjAKKwltb3ZlLmQJJHIxMiwgWyRyMF0KIAogCTs7IERvIHRoZSBkZWNvbXByZXNzaW9uIGFuZCBzYXZlIGNvbXByZXNzZWQgc2l6ZSBpbiBfaW5wdHIKIAogCWpzcglkZWNvbXByZXNzX2tlcm5lbAogCW5vcAogCisJOzsgUmVzdG9yZSBib290IHNvdXJjZSBpbmRpY2F0b3IKKwltb3ZlLmQJX2Jvb3Rfc291cmNlLCAkcjEyCisJbW92ZS5kCVskcjEyXSwgJHIxMgorCiAJOzsgUmVzdG9yZSBjb21tYW5kIGxpbmUgbWFnaWMgYW5kIGFkZHJlc3MuCiAJbW92ZS5kICBfY21kX2xpbmVfbWFnaWMsICRyMTAKIAltb3ZlLmQgIFskcjEwXSwgJHIxMApAQCAtMTY2LDExICsxMDgsMTAgQEAKIAltb3ZlLmQJWyRyMF0sICRyOQkJOyBmbGFzaCBhZGRyZXNzIG9mIGNvbXByZXNzZWQga2VybmVsCiAJbW92ZS5kICBpbnB0ciwgJHIwCiAJYWRkLmQJWyRyMF0sICRyOQkJOyBzaXplIG9mIGNvbXByZXNzZWQga2VybmVsCi0JY21wLmQgICAweDQwMjAwMDAwLCAkcjkKLQlibG8JZW50ZXJfa2VybmVsCi0Jbm9wCi0Jc3ViLmQgICAweDQwMjAwMDAwLCAkcjkKLQlhZGQuZCAgIDB4NDAwMCwgJHI5CisJY21wLmQgICAweDQwMDAwMDAwLCAkcjkJCTsgaW1hZ2UgaW4gRFJBTSA/CisJYmxvCWVudGVyX2tlcm5lbAkJOyBubywgbXVzdCBiZSBbTk9SXSBmbGFzaCwganVtcAorCW5vcAkJCQk7IGRlbGF5IHNsb3QKKwlhbmQuZCAgIDB4MDAxZmZmZmYsICRyOQkJOyBhc3N1bWUgY29tcHJlc3NlZCBrZXJuZWwgd2FzIDwgMk0KIAogZW50ZXJfa2VybmVsOgogCTs7IEVudGVyIHRoZSBkZWNvbXByZXNzZWQga2VybmVsCkBAIC0xODYsNyArMTI3LDcgQEAKIAkuZHdvcmQgMAogX2NtZF9saW5lX2FkZHI6CiAJLmR3b3JkIDAKLWlzX25hbmRfYm9vdDoKLQkuZHdvcmQgIDAKK19ib290X3NvdXJjZToKKwkuZHdvcmQgMAogCi0jaW5jbHVkZSAiLi4vLi4vbGliL2h3X3NldHRpbmdzLlMiCisjaW5jbHVkZSAiLi4vLi4vbWFjaC9od19zZXR0aW5ncy5TIgpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2Jvb3QvY29tcHJlc3NlZC9taXNjLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIvYm9vdC9jb21wcmVzc2VkL21pc2MuYwppbmRleCAwMTY5YmExLi41NWIyNjk1IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvYm9vdC9jb21wcmVzc2VkL21pc2MuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvYm9vdC9jb21wcmVzc2VkL21pc2MuYwpAQCAtMSw4ICsxLDYgQEAKIC8qCiAgKiBtaXNjLmMKICAqCi0gKiAkSWQ6IG1pc2MuYyx2IDEuOCAyMDA1LzA0LzI0IDE4OjM0OjI5IHN0YXJ2aWsgRXhwICQKLSAqCiAgKiBUaGlzIGlzIGEgY29sbGVjdGlvbiBvZiBzZXZlcmFsIHJvdXRpbmVzIGZyb20gZ3ppcC0xLjAuMwogICogYWRhcHRlZCBmb3IgTGludXguCiAgKgpAQCAtMjIsOSArMjAsMTMgQEAKIAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvcmVnX3Jkd3IuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvcmVnX21hcC5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9zZXJfZGVmcy5oPgorI2luY2x1ZGUgPGh3cmVncy9yZWdfcmR3ci5oPgorI2luY2x1ZGUgPGh3cmVncy9yZWdfbWFwLmg+CisjaW5jbHVkZSA8aHdyZWdzL3Nlcl9kZWZzLmg+CisjaW5jbHVkZSA8aHdyZWdzL3Bpbm11eF9kZWZzLmg+CisjaWZkZWYgQ09ORklHX0NSSVNfTUFDSF9BUlRQRUMzCisjaW5jbHVkZSA8aHdyZWdzL2Nsa2dlbl9kZWZzLmg+CisjZW5kaWYKIAogLyoKICAqIGd6aXAgZGVjbGFyYXRpb25zCkBAIC04NSw3ICs4Nyw2IEBACiAjICBkZWZpbmUgVHJhY2VjdihjLHgpCiAjZW5kaWYKIAotc3RhdGljIGludCAgZmlsbF9pbmJ1Zih2b2lkKTsKIHN0YXRpYyB2b2lkIGZsdXNoX3dpbmRvdyh2b2lkKTsKIHN0YXRpYyB2b2lkIGVycm9yKGNoYXIgKm0pOwogc3RhdGljIHZvaWQgZ3ppcF9tYXJrKHZvaWQgKiopOwpAQCAtMTg2LDYgKzE4Nyw4IEBACiAJY2hhciAqc3MgPSAoY2hhciopczsKIAogCWZvciAoaT0wO2k8bjtpKyspIHNzW2ldID0gYzsKKworCXJldHVybiBzOwogfQogCiB2b2lkKgpAQCAtMTk2LDYgKzE5OSw4IEBACiAJY2hhciAqZCA9IChjaGFyICopX19kZXN0LCAqcyA9IChjaGFyICopX19zcmM7CiAKIAlmb3IgKGk9MDtpPF9fbjtpKyspIGRbaV0gPSBzW2ldOworCisJcmV0dXJuIF9fZGVzdDsKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0yMjUsMTUgKzIzMCwxNSBAQAogc3RhdGljIHZvaWQKIGVycm9yKGNoYXIgKngpCiB7Ci0JcHV0cygiXG5cbiIpOworCXB1dHMoIlxyXG5cbiIpOwogCXB1dHMoeCk7Ci0JcHV0cygiXG5cbiAtLSBTeXN0ZW0gaGFsdGVkXG4iKTsKKwlwdXRzKCJcclxuXG4gLS0gU3lzdGVtIGhhbHRlZFxuIik7CiAKIAl3aGlsZSgxKTsJLyogSGFsdCAqLwogfQogCiB2b2lkCi1zZXR1cF9ub3JtYWxfb3V0cHV0X2J1ZmZlcigpCitzZXR1cF9ub3JtYWxfb3V0cHV0X2J1ZmZlcih2b2lkKQogewogCW91dHB1dF9kYXRhID0gKGNoYXIgKilLRVJORUxfTE9BRF9BRFI7CiB9CkBAIC0yNjIsMTUgKzI2NywxNyBAQAogCXJlY19iYXVkID0gUkVHX1JEKHNlciwgcmVnaV9zZXIsIHJ3X3JlY19iYXVkX2Rpdik7CiAKIAl0cl9jdHJsLnN0b3BfYml0cyA9IDE7CS8qIDIgc3RvcCBiaXRzLiAqLworCXRyX2N0cmwuZW4gPSAxOyAvKiBlbmFibGUgdHJhbnNtaXR0ZXIgKi8KKwlyZWNfY3RybC5lbiA9IDE7IC8qIGVuYWJsZXIgcmVjZWl2ZXIgKi8KIAogCS8qCi0JICogVGhlIGJhdWRyYXRlIHNldHVwIGlzIGEgYml0IGZpc2h5LCBidXQgaW4gdGhlIGVuZCB0aGUgdHJhbnNjZWl2ZXIgaXMKLQkgKiBzZXQgdG8gNDgwMCBhbmQgdGhlIHJlY2VpdmVyIHRvIDExNTIwMC4gVGhlIG1hZ2ljIHZhbHVlIGlzCi0JICogMjkuNDkzIE1Iei4KKwkgKiBUaGUgYmF1ZHJhdGUgc2V0dXAgdXNlZCB0byBiZSBhIGJpdCBmaXNoeSwgYnV0IG5vdyB0cmFuc21pdHRlciBhbmQKKwkgKiByZWNlaXZlciBhcmUgYm90aCBzZXQgdG8gdGhlIGludGVuZGVkIGJhdWQgcmF0ZSwgMTE1MjAwLgorCSAqIFRoZSBtYWdpYyB2YWx1ZSBpcyAyOS40OTMgTUh6LgogCSAqLwogCXRyX2N0cmwuYmFzZV9mcmVxID0gcmVna19zZXJfZjI5XzQ5MzsKIAlyZWNfY3RybC5iYXNlX2ZyZXEgPSByZWdrX3Nlcl9mMjlfNDkzOwotCXRyX2JhdWQuZGl2ID0gKDI5NDkzMDAwIC8gOCkgLyA0ODAwOworCXRyX2JhdWQuZGl2ID0gKDI5NDkzMDAwIC8gOCkgLyAxMTUyMDA7CiAJcmVjX2JhdWQuZGl2ID0gKDI5NDkzMDAwIC8gOCkgLyAxMTUyMDA7CiAKIAlSRUdfV1Ioc2VyLCByZWdpX3NlciwgcndfdHJfY3RybCwgdHJfY3RybCk7CkBAIC0yODAsMjUgKzI4Nyw1MiBAQAogfQogCiB2b2lkCi1kZWNvbXByZXNzX2tlcm5lbCgpCitkZWNvbXByZXNzX2tlcm5lbCh2b2lkKQogewogCWNoYXIgcmV2aXNpb247CiAKLQkvKiBpbnB1dF9kYXRhIGlzIHNldCBpbiBoZWFkLlMgKi8KLQlpbmJ1ZiA9IGlucHV0X2RhdGE7CisjaWYgZGVmaW5lZChDT05GSUdfRVRSQVhfREVCVUdfUE9SVDEpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19FVFJBWF9ERUJVR19QT1JUMikgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0VUUkFYX0RFQlVHX1BPUlQzKQorCXJlZ19waW5tdXhfcndfaHdwcm90IGh3cHJvdDsKKworI2lmZGVmIENPTkZJR19DUklTX01BQ0hfQVJUUEVDMworCXJlZ19jbGtnZW5fcndfY2xrX2N0cmwgY2xrX2N0cmw7CisKKwkvKiBFbmFibGUgY29ycmVzcG9uZGluZyBjbG9jayByZWdpb24gd2hlbiBzZXJpYWwgMS4uMyBzZWxlY3RlZCAqLworCisJY2xrX2N0cmwgPSBSRUdfUkQoY2xrZ2VuLCByZWdpX2Nsa2dlbiwgcndfY2xrX2N0cmwpOworCWNsa19jdHJsLnNzZXJfc2VyX2RtYTZfNyA9IHJlZ2tfY2xrZ2VuX3llczsKKwlSRUdfV1IoY2xrZ2VuLCByZWdpX2Nsa2dlbiwgcndfY2xrX2N0cmwsIGNsa19jdHJsKTsKKyNlbmRpZgorCisJLyogcGlubXV4IHNldHVwIGZvciBwb3J0cyAxLi4zICovCisJaHdwcm90ID0gUkVHX1JEKHBpbm11eCwgcmVnaV9waW5tdXgsIHJ3X2h3cHJvdCk7CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19FVFJBWF9ERUJVR19QT1JUMAogCXNlcmlhbF9zZXR1cChyZWdpX3NlcjApOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0VUUkFYX0RFQlVHX1BPUlQxCisJaHdwcm90LnNlcjEgPSByZWdrX3Bpbm11eF95ZXM7CiAJc2VyaWFsX3NldHVwKHJlZ2lfc2VyMSk7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfRVRSQVhfREVCVUdfUE9SVDIKKwlod3Byb3Quc2VyMiA9IHJlZ2tfcGlubXV4X3llczsKIAlzZXJpYWxfc2V0dXAocmVnaV9zZXIyKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19FVFJBWF9ERUJVR19QT1JUMworCWh3cHJvdC5zZXIzID0gcmVna19waW5tdXhfeWVzOwogCXNlcmlhbF9zZXR1cChyZWdpX3NlcjMpOwogI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfRVRSQVhfREVCVUdfUE9SVDEpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19FVFJBWF9ERUJVR19QT1JUMikgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0VUUkFYX0RFQlVHX1BPUlQzKQorCVJFR19XUihwaW5tdXgsIHJlZ2lfcGlubXV4LCByd19od3Byb3QsIGh3cHJvdCk7CisjZW5kaWYKKworCS8qIGlucHV0X2RhdGEgaXMgc2V0IGluIGhlYWQuUyAqLworCWluYnVmID0gaW5wdXRfZGF0YTsKIAogCXNldHVwX25vcm1hbF9vdXRwdXRfYnVmZmVyKCk7CiAKQEAgLTMwNywxMSArMzQxLDExIEBACiAJX19hc21fXyB2b2xhdGlsZSAoIm1vdmUgJHZyLCUwIiA6ICI9cm0iIChyZXZpc2lvbikpOwogCWlmIChyZXZpc2lvbiA8IDMyKQogCXsKLQkJcHV0cygiWW91IG5lZWQgYW4gRVRSQVggRlMgdG8gcnVuIExpbnV4IDIuNi9jcmlzdjMyLlxuIik7CisJCXB1dHMoIllvdSBuZWVkIGFuIEVUUkFYIEZTIHRvIHJ1biBMaW51eCAyLjYvY3Jpc3YzMi5cclxuIik7CiAJCXdoaWxlKDEpOwogCX0KIAotCXB1dHMoIlVuY29tcHJlc3NpbmcgTGludXguLi5cbiIpOworCXB1dHMoIlVuY29tcHJlc3NpbmcgTGludXguLi5cclxuIik7CiAJZ3VuemlwKCk7Ci0JcHV0cygiRG9uZS4gTm93IGJvb3RpbmcgdGhlIGtlcm5lbC5cbiIpOworCXB1dHMoIkRvbmUuIE5vdyBib290aW5nIHRoZSBrZXJuZWwuXHJcbiIpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2Jvb3QvcmVzY3VlL01ha2VmaWxlIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2Jvb3QvcmVzY3VlL01ha2VmaWxlCmluZGV4IGY2NjhhODEuLmMwOTg3NzkgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9ib290L3Jlc2N1ZS9NYWtlZmlsZQorKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvYm9vdC9yZXNjdWUvTWFrZWZpbGUKQEAgLTEsMzYgKzEsMjcgQEAKICMKLSMgTWFrZWZpbGUgZm9yIHJlc2N1ZSBjb2RlCisjIE1ha2VmaWxlIGZvciByZXNjdWUgKGJvb3RzdHJhcCkgY29kZQogIwotdGFyZ2V0ID0gJCh0YXJnZXRfcmVzY3VlX2RpcikKLXNyYyAgICA9ICQoc3JjX3Jlc2N1ZV9kaXIpCiAKIENDID0gZ2NjLWNyaXMgLW1saW51eCAtbWFyY2g9djMyICQoTElOVVhJTkNMVURFKQotQ0ZMQUdTID0gLU8yCitjY2ZsYWdzLXkgKz0gLU8yIC1JICQoc3JjdHJlZSkvaW5jbHVkZS9hc20vYXJjaC9tYWNoLyBcCisJCS1JICQoc3JjdHJlZSkvaW5jbHVkZS9hc20vYXJjaAorYXNmbGFncy15ICs9IC1JICQoc3JjdHJlZSkvaW5jbHVkZS9hc20vYXJjaC9tYWNoLyAtSSAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtL2FyY2gKIExEID0gZ2NjLWNyaXMgLW1saW51eCAtbWFyY2g9djMyIC1ub3N0ZGxpYgorbGRmbGFncy15ICs9IC1UICQob2JqKS9yZXNjdWUubGQKK0xEUE9TVEZMQUdTID0gLWxnY2MKIE9CSkNPUFkgPSBvYmpjb3B5LWNyaXMKIE9CSkNPUFlGTEFHUyA9IC1PIGJpbmFyeSAtLXJlbW92ZS1zZWN0aW9uPS5ic3MKK29iai0kKENPTkZJR19FVFJBWF9BWElTRkxBU0hNQVApID0gaGVhZC5vCitPQkpFQ1QgOj0gJChvYmopL2hlYWQubwogCi1hbGw6ICQodGFyZ2V0KS9yZXNjdWUuYmluCit0YXJnZXRzIDo9IHJlc2N1ZS5vIHJlc2N1ZS5iaW4KIAotcmVzY3VlOiByZXNjdWUuYmluCi0JIyBkbyBub3RoaW5nCitxdWlldF9jbWRfbGRsaWJnY2MgPSBMRCAgICAgICRACitjbWRfbGRsaWJnY2MgPSAkKExEKSAkKExERkxBR1MpICQoZmlsdGVyLW91dCBGT1JDRSwkXikgJChMRFBPU1RGTEFHUykgLW8gJEAKIAotJCh0YXJnZXQpL3Jlc2N1ZS5iaW46ICQodGFyZ2V0KSAkKHRhcmdldCkvaGVhZC5vCi0JJChMRCkgLVQgJChzcmMpL3Jlc2N1ZS5sZCAtbyAkKHRhcmdldCkvcmVzY3VlLm8gJCh0YXJnZXQpL2hlYWQubwotCSQoT0JKQ09QWSkgJChPQkpDT1BZRkxBR1MpICQodGFyZ2V0KS9yZXNjdWUubyAkKHRhcmdldCkvcmVzY3VlLmJpbgotCWNwIC1wICQodGFyZ2V0KS9yZXNjdWUuYmluICQob2JqdHJlZSkKKyQob2JqKS9yZXNjdWUubzogJChPQkpFQ1RTKSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGxkbGliZ2NjKQogCi0kKHRhcmdldCk6Ci0JbWtkaXIgLXAgJCh0YXJnZXQpCi0KLSQodGFyZ2V0KS9oZWFkLm86ICQoc3JjKS9oZWFkLlMKLQkkKENDKSAtRF9fQVNTRU1CTFlfXyAtYyAkPCAtbyAkKi5vCi0KLWNsZWFuOgotCXJtIC1mICQodGFyZ2V0KS8qLm8gJCh0YXJnZXQpLyouYmluCi0KLWZhc3RkZXA6Ci0KLW1vZHVsZXM6Ci0KLW1vZHVsZXMtaW5zdGFsbDoKKyQob2JqKS9yZXNjdWUuYmluOiAkKG9iaikvcmVzY3VlLm8gRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxvYmpjb3B5KQorCWNwIC1wICQob2JqKS9yZXNjdWUuYmluICQob2JqdHJlZSkKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9ib290L3Jlc2N1ZS9oZWFkLlMgYi9hcmNoL2NyaXMvYXJjaC12MzIvYm9vdC9yZXNjdWUvaGVhZC5TCmluZGV4IDhjZGI0MDEuLjVmODQ2YjcgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9ib290L3Jlc2N1ZS9oZWFkLlMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2Jvb3QvcmVzY3VlL2hlYWQuUwpAQCAtMSwzOCArMSwyNiBAQAotLyogJElkOiBoZWFkLlMsdiAxLjQgMjAwNC8xMS8wMSAxNjoxMDoyOCBzdGFydmlrIEV4cCAkCisvKgorICogSnVzdCBnZXQgc3RhcnRlZCBieSBqdW1waW5nIHRvIENPTkZJR19FVFJBWF9QVEFCTEVfU0VDVE9SIHRvIHN0YXJ0CisgKiBrZXJuZWwgZGVjb21wcmVzc29yLgogICoKLSAqIFRoaXMgdXNlZCB0byBiZSB0aGUgcmVzY3VlIGNvZGUgYnV0IG5vdyB0aGF0IGlzIGhhbmRsZWQgYnkgdGhlCi0gKiBSZWRCb290IGJhc2VkIFJGTCBpbnN0ZWFkLiBOb3RoaW5nIHRvIHNlZSBoZXJlLCBtb3ZlIGFsb25nLgorICogSW4gcHJhY3RpY2UsIHRoaXMgb25seSB3b3JrcyBmb3IgTk9SIGZsYXNoIChvciBzb21lIGNvbnZvbHV0ZWQgUkFNIGJvb3QpCisgKiBhbmQgaGVuY2UgaXMgbm90IHJlYWxseSB1c2VmdWwgZm9yIEFydHBlYy0zLCBzbyBpdCdzIEV0cmF4IEZTIC8gTk9SIG9ubHkuCisgKgogICovCiAKLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvcmVnX21hcF9hc20uaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvY29uZmlnX2RlZnNfYXNtLmg+CisjaW5jbHVkZSA8bWFjaC9zdGFydHVwLmluYz4KKworI2lmZGVmIENPTkZJR19FVFJBWF9BWElTRkxBU0hNQVAKKworOzsgQ29kZQogCiAJLnRleHQKK3N0YXJ0OgogCiAJOzsgU3RhcnQgY2xvY2tzIGZvciB1c2VkIGJsb2Nrcy4KLQltb3ZlLmQgUkVHX0FERFIoY29uZmlnLCByZWdpX2NvbmZpZywgcndfY2xrX2N0cmwpLCAkcjEKLQltb3ZlLmQgWyRyMV0sICRyMAotCW9yLmQgICBSRUdfU1RBVEUoY29uZmlnLCByd19jbGtfY3RybCwgY3B1LCB5ZXMpIHwgXAotCSAgICAgICBSRUdfU1RBVEUoY29uZmlnLCByd19jbGtfY3RybCwgYmlmLCB5ZXMpIHwgXAotCSAgICAgICBSRUdfU1RBVEUoY29uZmlnLCByd19jbGtfY3RybCwgZml4X2lvLCB5ZXMpLCAkcjAKLQltb3ZlLmQgJHIwLCBbJHIxXQorCVNUQVJUX0NMT0NLUwogCi0JOzsgQ29weSA2OEtCIE5BTkQgZmxhc2ggdG8gSW50ZXJuYWwgUkFNIChpZiBOQU5EIGJvb3QpCi0JbW92ZS5kIDB4MzgwMDQwMDAsICRyMTAKLQltb3ZlLmQgMHg4MDAwLCAkcjExCi0JbW92ZS5kIDB4MTEwMDAsICRyMTIKLQltb3ZlLmQgY29weV9jb21wbGV0ZSwgJHIxMwotCWFuZC5kICAweDAwMGZmZmZmLCAkcjEzCi0Jb3IuZCAgIDB4MzgwMDAwMDAsICRyMTMKLQotI2luY2x1ZGUgIi4uLy4uL2xpYi9uYW5kX2luaXQuUyIKLQotCTs7IE5vIE5BTkQgZm91bmQKIAltb3ZlLmQJQ09ORklHX0VUUkFYX1BUQUJMRV9TRUNUT1IsICRyMTAKLQlqdW1wCSRyMTAgOyBKdW1wIHRvIGRlY29tcHJlc3NlcgorCWp1bXAJJHIxMAkJCTsgSnVtcCB0byBkZWNvbXByZXNzb3IKIAlub3AKIAotY29weV9jb21wbGV0ZToKLQltb3ZlLmQJMHgzODAwMDAwMCArIENPTkZJR19FVFJBWF9QVEFCTEVfU0VDVE9SLCAkcjEwCi0JanVtcAkkcjEwIDsgSnVtcCB0byBkZWNvbXByZXNzZXIKLQlub3AKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2Jvb3QvcmVzY3VlL3Jlc2N1ZS5sZCBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9ib290L3Jlc2N1ZS9yZXNjdWUubGQKaW5kZXggNDJiMTFhYS4uOGFjNjQ2YiAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2Jvb3QvcmVzY3VlL3Jlc2N1ZS5sZAorKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvYm9vdC9yZXNjdWUvcmVzY3VlLmxkCkBAIC0xLDIwICsxLDQzIEBACisvKiNPVVRQVVRfRk9STUFUKGVsZjMyLXVzLWNyaXMpICovCitPVVRQVVRfQVJDSCAoY3Jpc3YzMikKKy8qIE5vdyB0aGF0IE5BTkQgc3VwcG9ydCBoYXMgYmVlbiBzdHJpcHBlZCwgdGhpcyBmaWxlIGNvdWxkIGJlIHNpbXBsaWZpZWQsCisgKiBidXQgaXQgZG9lc24ndCBkbyBhbnkgaGFybSBvbiB0aGUgb3RoZXIgaGFuZCBzbyB3aHkgYm90aGVyLiAqLworCiBNRU1PUlkKIAl7Ci0JZmxhc2ggOiBPUklHSU4gPSAweDAwMDAwMDAwLAotCSAgICAgICAgTEVOR1RIID0gMHgwMDEwMDAwMAorCWJvb3RibGsgOiBPUklHSU4gPSAweDM4MDAwMDAwLAorCSAgICAgICAgICBMRU5HVEggPSAweDAwMDA0MDAwCisJaW50bWVtICA6IE9SSUdJTiA9IDB4MzgwMDQwMDAsCisJCSAgTEVOR1RIID0gMHgwMDAwNTAwMAogCX0KIAogU0VDVElPTlMKIHsKIAkudGV4dCA6CiAJewotCQlzdGV4dCA9IC4gOworCQlfc3RleHQgPSAuIDsKIAkJKigudGV4dCkKLQkJZXRleHQgPSAuIDsKLQl9ID4gZmxhc2gKKwkJKiguaW5pdC50ZXh0KQorCQkqKC5yb2RhdGEpCisJCSooLnJvZGF0YS4qKQorCQlfZXRleHQgPSAuIDsKKwl9ID4gYm9vdGJsawogCS5kYXRhIDoKIAl7CiAJCSooLmRhdGEpCi0JCWVkYXRhID0gLiA7Ci0JfSA+IGZsYXNoCisJCV9lZGF0YSA9IC4gOworCX0gPiBib290YmxrCisJLmJzcyA6CisJeworCQlfYnNzID0gLiA7CisJCSooLmJzcykKKwkJX2VuZCA9IEFMSUdOKCAweDEwICkgOworCX0gPiBpbnRtZW0KKworCS8qIEdldCByaWQgb2Ygc3R1ZmYgZnJvbSBFWFBPUlRfU1lNQk9MKGZvbykuICovCisJL0RJU0NBUkQvIDoKKwl7CisJICAgICAgICAqKF9fa3N5bXRhYl9zdHJpbmdzKQorCSAgICAgICAgKihfX2tzeW10YWIpCisJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvS2NvbmZpZyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL0tjb25maWcKaW5kZXggYzMyOWNjZS4uMmE5MmNiMSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvS2NvbmZpZworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9LY29uZmlnCkBAIC00LDY0ICs0LDEwMiBAQAogCWJvb2wgIkV0aGVybmV0IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBFVFJBWF9BUkNIX1YzMgogCXNlbGVjdCBORVRfRVRIRVJORVQKKwlzZWxlY3QgTUlJCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgRVRSQVggRlMgYnVpbHQtaW4gMTAvMTAwTWJpdCBFdGhlcm5ldAogCSAgY29udHJvbGxlci4KIAotY29uZmlnIEVUUkFYX0VUSEVSTkVUX0hXX0NTVU0KLQlib29sICJIYXJkd2FyZSBhY2NlbGVyYXRlZCBldGhlcm5ldCBjaGVja3N1bSBhbmQgc2NhdHRlci9nYXRoZXIiCitjb25maWcgRVRSQVhfTk9fUEhZCisJYm9vbCAiUEhZIG5vdCBwcmVzZW50IgogCWRlcGVuZHMgb24gRVRSQVhfRVRIRVJORVQKLQlkZXBlbmRzIG9uIEVUUkFYX1NUUkVBTUNPUFJPQwotCWRlZmF1bHQgeQorCWRlZmF1bHQgTgogCWhlbHAKLQkgIEhhcmR3YXJlIGFjY2VsZXJhdGlvbiBvZiBjaGVja3N1bW1pbmcgYW5kIHNjYXR0ZXIvZ2F0aGVyCisJICBUaGlzIG9wdGlvbiBkaXNhYmxlcyBhbGwgTURJTyBjb21tdW5pY2F0aW9uIHdpdGggYW4gZXRoZXJuZXQKKwkgIHRyYW5zY2VpdmVyIGNvbm5lY3RlZCB0byB0aGUgTUlJIGludGVyZmFjZS4gVGhpcyBvcHRpb24gc2hhbGwKKwkgIHR5cGljYWxseSBiZSBlbmFibGVkIGlmIHRoZSBNSUkgaW50ZXJmYWNlIGlzIGNvbm5lY3RlZCB0byBhCisJICBzd2l0Y2guIFRoaXMgb3B0aW9uIHNob3VsZCBub3JtYWxseSBiZSBkaXNhYmxlZC4gSWYgZW5hYmxlZCwKKwkgIHNwZWVkIGFuZCBkdXBsZXggd2lsbCBiZSBsb2NrZWQgdG8gMTAwIE1iaXQgYW5kIGZ1bGwgZHVwbGV4LgogCiBjb25maWcgRVRSQVhfRVRIRVJORVRfSUZBQ0UwCiAJZGVwZW5kcyBvbiBFVFJBWF9FVEhFUk5FVAogCWJvb2wgIkVuYWJsZSBuZXR3b3JrIGludGVyZmFjZSAwIgogCiBjb25maWcgRVRSQVhfRVRIRVJORVRfSUZBQ0UxCi0JZGVwZW5kcyBvbiBFVFJBWF9FVEhFUk5FVAorCWRlcGVuZHMgb24gKEVUUkFYX0VUSEVSTkVUICYmIEVUUkFYRlMpCiAJYm9vbCAiRW5hYmxlIG5ldHdvcmsgaW50ZXJmYWNlIDEgKHVzZXMgRE1BNiBhbmQgRE1BNykiCiAKK2NvbmZpZyBFVFJBWF9FVEhFUk5FVF9HQklUCisJZGVwZW5kcyBvbiAoRVRSQVhfRVRIRVJORVQgJiYgQ1JJU19NQUNIX0FSVFBFQzMpCisJYm9vbCAiRW5hYmxlIGdpZ2FiaXQgRXRoZXJuZXQgc3VwcG9ydCIKKwogY2hvaWNlCi0JcHJvbXB0ICJOZXR3b3JrIExFRCBiZWhhdmlvciIKLQlkZXBlbmRzIG9uIEVUUkFYX0VUSEVSTkVUCi0JZGVmYXVsdCBFVFJBWF9ORVRXT1JLX0xFRF9PTl9XSEVOX0FDVElWSVRZCisJcHJvbXB0ICJFdGgwIGxlZCBncm91cCIKKwlkZXBlbmRzIG9uIEVUUkFYX0VUSEVSTkVUX0lGQUNFMAorCWRlZmF1bHQgRVRSQVhfRVRIMF9VU0VfTEVER1JQMAogCi1jb25maWcgRVRSQVhfTkVUV09SS19MRURfT05fV0hFTl9MSU5LCi0JYm9vbCAiTEVEX29uX3doZW5fbGluayIKK2NvbmZpZyBFVFJBWF9FVEgwX1VTRV9MRURHUlAwCisJYm9vbCAiVXNlIExFRCBncnAgMCIKKwlkZXBlbmRzIG9uIEVUUkFYX05CUl9MRURfR1JQX09ORSB8fCBFVFJBWF9OQlJfTEVEX0dSUF9UV08KIAloZWxwCi0JICBTZWxlY3RpbmcgTEVEX29uX3doZW5fbGluayB3aWxsIGxpZ2h0IHRoZSBMRUQgd2hlbiB0aGVyZSBpcyBhCi0JICBjb25uZWN0aW9uIGFuZCB3aWxsIGZsYXNoIG9mZiB3aGVuIHRoZXJlIGlzIGFjdGl2aXR5LgorCSAgVXNlIExFRCBncnAgMCBmb3IgZXRoMAogCi0JICBTZWxlY3RpbmcgTEVEX29uX3doZW5fYWN0aXZpdHkgd2lsbCBsaWdodCB0aGUgTEVEIG9ubHkgd2hlbgotCSAgdGhlcmUgaXMgYWN0aXZpdHkuCi0KLQkgIFRoaXMgc2V0dGluZyB3aWxsIGFsc28gYWZmZWN0IHRoZSBiZWhhdmlvdXIgb2Ygb3RoZXIgYWN0aXZpdHkgTEVEcwotCSAgZS5nLiBCbHVldG9vdGguCi0KLWNvbmZpZyBFVFJBWF9ORVRXT1JLX0xFRF9PTl9XSEVOX0FDVElWSVRZCi0JYm9vbCAiTEVEX29uX3doZW5fYWN0aXZpdHkiCitjb25maWcgRVRSQVhfRVRIMF9VU0VfTEVER1JQMQorCWJvb2wgIlVzZSBMRUQgZ3JwIDEiCisJZGVwZW5kcyBvbiBFVFJBWF9OQlJfTEVEX0dSUF9UV08KIAloZWxwCi0JICBTZWxlY3RpbmcgTEVEX29uX3doZW5fbGluayB3aWxsIGxpZ2h0IHRoZSBMRUQgd2hlbiB0aGVyZSBpcyBhCi0JICBjb25uZWN0aW9uIGFuZCB3aWxsIGZsYXNoIG9mZiB3aGVuIHRoZXJlIGlzIGFjdGl2aXR5LgorCSAgVXNlIExFRCBncnAgMSBmb3IgZXRoMAogCi0JICBTZWxlY3RpbmcgTEVEX29uX3doZW5fYWN0aXZpdHkgd2lsbCBsaWdodCB0aGUgTEVEIG9ubHkgd2hlbgotCSAgdGhlcmUgaXMgYWN0aXZpdHkuCitjb25maWcgRVRSQVhfRVRIMF9VU0VfTEVER1JQTlVMTAorCWJvb2wgIlVzZSBubyBMRURzIGZvciBldGgwIgorCWhlbHAKKwkgIFVzZSBubyBMRURzIGZvciBldGgwCitlbmRjaG9pY2UKIAotCSAgVGhpcyBzZXR0aW5nIHdpbGwgYWxzbyBhZmZlY3QgdGhlIGJlaGF2aW91ciBvZiBvdGhlciBhY3Rpdml0eSBMRURzCi0JICBlLmcuIEJsdWV0b290aC4KK2Nob2ljZQorCXByb21wdCAiRXRoMSBsZWQgZ3JvdXAiCisJZGVwZW5kcyBvbiBFVFJBWF9FVEhFUk5FVF9JRkFDRTEKKwlkZWZhdWx0IEVUUkFYX0VUSDFfVVNFX0xFREdSUDEKIAorY29uZmlnIEVUUkFYX0VUSDFfVVNFX0xFREdSUDAKKwlib29sICJVc2UgTEVEIGdycCAwIgorCWRlcGVuZHMgb24gRVRSQVhfTkJSX0xFRF9HUlBfT05FIHx8IEVUUkFYX05CUl9MRURfR1JQX1RXTworCWhlbHAKKwkgIFVzZSBMRUQgZ3JwIDAgZm9yIGV0aDEKKworY29uZmlnIEVUUkFYX0VUSDFfVVNFX0xFREdSUDEKKwlib29sICJVc2UgTEVEIGdycCAxIgorCWRlcGVuZHMgb24gRVRSQVhfTkJSX0xFRF9HUlBfVFdPCisJaGVscAorCSAgVXNlIExFRCBncnAgMSBmb3IgZXRoMQorCitjb25maWcgRVRSQVhfRVRIMV9VU0VfTEVER1JQTlVMTAorCWJvb2wgIlVzZSBubyBMRURzIGZvciBldGgxIgorCWhlbHAKKwkgIFVzZSBubyBMRURzIGZvciBldGgxCiBlbmRjaG9pY2UKIAogY29uZmlnIEVUUkFYRlNfU0VSSUFMCiAJYm9vbCAiU2VyaWFsLXBvcnQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEVUUkFYX0FSQ0hfVjMyCisJc2VsZWN0IFNFUklBTF9DT1JFCisJc2VsZWN0IFNFUklBTF9DT1JFX0NPTlNPTEUKIAloZWxwCiAJICBFbmFibGVzIHRoZSBFVFJBWCBGUyBzZXJpYWwgZHJpdmVyIGZvciBzZXIwICh0dHlTMCkKIAkgIFlvdSBwcm9iYWJseSB3YW50IHRoaXMgZW5hYmxlZC4KIAorY29uZmlnIEVUUkFYX1JTNDg1CisJYm9vbCAiUlMtNDg1IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBFVFJBWEZTX1NFUklBTAorCWhlbHAKKwkgIEVuYWJsZXMgc3VwcG9ydCBmb3IgUlMtNDg1IHNlcmlhbCBjb21tdW5pY2F0aW9uLgorCitjb25maWcgRVRSQVhfUlM0ODVfRElTQUJMRV9SRUNFSVZFUgorCWJvb2wgIkRpc2FibGUgc2VyaWFsIHJlY2VpdmVyIgorCWRlcGVuZHMgb24gRVRSQVhfUlM0ODUKKwloZWxwCisJICBJdCBpcyBuZWNlc3NhcnkgdG8gZGlzYWJsZSB0aGUgc2VyaWFsIHJlY2VpdmVyIHRvIGF2b2lkIHNlcmlhbAorCSAgbG9vcGJhY2suICBOb3QgYWxsIHByb2R1Y3RzIGFyZSBhYmxlIHRvIGRvIHRoaXMgaW4gc29mdHdhcmUgb25seS4KKwogY29uZmlnIEVUUkFYX1NFUklBTF9QT1JUMAogCWJvb2wgIlNlcmlhbCBwb3J0IDAgZW5hYmxlZCIKIAlkZXBlbmRzIG9uIEVUUkFYRlNfU0VSSUFMCkBAIC03Miw1MCArMTEwLDI4IEBACiAJICBzZXIwIGNhbiB1c2UgZG1hNCBvciBkbWE2IGZvciBvdXRwdXQgYW5kIGRtYTUgb3IgZG1hNyBmb3IgaW5wdXQuCiAKIGNob2ljZQotCXByb21wdCAiU2VyMCBETUEgaW4gY2hhbm5lbCAiCisJcHJvbXB0ICJTZXIwIGRlZmF1bHQgcG9ydCB0eXBlICIKIAlkZXBlbmRzIG9uIEVUUkFYX1NFUklBTF9QT1JUMAotCWRlZmF1bHQgRVRSQVhfU0VSSUFMX1BPUlQwX05PX0RNQV9JTgorCWRlZmF1bHQgRVRSQVhfU0VSSUFMX1BPUlQwX1RZUEVfMjMyCiAJaGVscAotCSAgV2hhdCBETUEgY2hhbm5lbCB0byB1c2UgZm9yIHNlcjAuCisJICBUeXBlIG9mIHNlcmlhbCBwb3J0LgogCi0KLWNvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDBfTk9fRE1BX0lOCi0JYm9vbCAiU2VyMCB1c2VzIG5vIERNQSBmb3IgaW5wdXQiCitjb25maWcgRVRSQVhfU0VSSUFMX1BPUlQwX1RZUEVfMjMyCisJYm9vbCAiU2VyMCBpcyBhIFJTLTIzMiBwb3J0IgogCWhlbHAKLQkgIERvIG5vdCB1c2UgRE1BIGZvciBzZXIwIGlucHV0LgorCSAgQ29uZmlndXJlIHNlcmlhbCBwb3J0IDAgdG8gYmUgYSBSUy0yMzIgcG9ydC4KIAotY29uZmlnIEVUUkFYX1NFUklBTF9QT1JUMF9ETUE3X0lOCi0JYm9vbCAiU2VyMCB1c2VzIERNQTcgZm9yIGlucHV0IgotCWRlcGVuZHMgb24gRVRSQVhfU0VSSUFMX1BPUlQwCitjb25maWcgRVRSQVhfU0VSSUFMX1BPUlQwX1RZUEVfNDg1SEQKKwlib29sICJTZXIwIGlzIGEgaGFsZiBkdXBsZXggUlMtNDg1IHBvcnQiCisJZGVwZW5kcyBvbiBFVFJBWF9SUzQ4NQogCWhlbHAKLQkgIEVuYWJsZXMgdGhlIERNQTcgaW5wdXQgY2hhbm5lbCBmb3Igc2VyMCAodHR5UzApLgotCSAgSWYgeW91IGRvIG5vdCBlbmFibGUgRE1BLCBhbiBpbnRlcnJ1cHQgZm9yIGVhY2ggY2hhcmFjdGVyIHdpbGwgYmUKLQkgIHVzZWQgd2hlbiByZWNlaXZpbmcgZGF0YS4KLQkgIE5vcm1hbGx5IHlvdSB3YW50IHRvIHVzZSBETUEsIHVubGVzcyB5b3UgdXNlIHRoZSBETUEgY2hhbm5lbCBmb3IKLQkgIHNvbWV0aGluZyBlbHNlLgorCSAgQ29uZmlndXJlIHNlcmlhbCBwb3J0IDAgdG8gYmUgYSBoYWxmIGR1cGxleCAodHdvIHdpcmVzKSBSUy00ODUgcG9ydC4KIAotZW5kY2hvaWNlCi0KLWNob2ljZQotCXByb21wdCAiU2VyMCBETUEgb3V0IGNoYW5uZWwiCi0JZGVwZW5kcyBvbiBFVFJBWF9TRVJJQUxfUE9SVDAKLQlkZWZhdWx0IEVUUkFYX1NFUklBTF9QT1JUMF9OT19ETUFfT1VUCi0KLWNvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDBfTk9fRE1BX09VVAotCWJvb2wgIlNlcjAgdXNlcyBubyBETUEgZm9yIG91dHB1dCIKK2NvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDBfVFlQRV80ODVGRAorCWJvb2wgIlNlcjAgaXMgYSBmdWxsIGR1cGxleCBSUy00ODUgcG9ydCIKKwlkZXBlbmRzIG9uIEVUUkFYX1JTNDg1CiAJaGVscAotCSAgRG8gbm90IHVzZSBETUEgZm9yIHNlcjAgb3V0cHV0LgotCi1jb25maWcgRVRSQVhfU0VSSUFMX1BPUlQwX0RNQTZfT1VUCi0JYm9vbCAiU2VyMCB1c2VzIERNQTYgZm9yIG91dHB1dCIKLQlkZXBlbmRzIG9uIEVUUkFYX1NFUklBTF9QT1JUMAotCWhlbHAKLQkgIEVuYWJsZXMgdGhlIERNQTYgb3V0cHV0IGNoYW5uZWwgZm9yIHNlcjAgKHR0eVMwKS4KLQkgIElmIHlvdSBkbyBub3QgZW5hYmxlIERNQSwgYW4gaW50ZXJydXB0IGZvciBlYWNoIGNoYXJhY3RlciB3aWxsIGJlCi0JICB1c2VkIHdoZW4gdHJhbnNtaXR0aW5nIGRhdGEuCi0JICBOb3JtYWxseSB5b3Ugd2FudCB0byB1c2UgRE1BLCB1bmxlc3MgeW91IHVzZSB0aGUgRE1BIGNoYW5uZWwgZm9yCi0JICBzb21ldGhpbmcgZWxzZS4KLQorCSAgQ29uZmlndXJlIHNlcmlhbCBwb3J0IDAgdG8gYmUgYSBmdWxsIGR1cGxleCAoZm91ciB3aXJlcykgUlMtNDg1IHBvcnQuCiBlbmRjaG9pY2UKIAogY29uZmlnIEVUUkFYX1NFUjBfRFRSX0JJVApAQCAtMTQxLDUyICsxNTcsMjggQEAKIAkgIEVuYWJsZXMgdGhlIEVUUkFYIEZTIHNlcmlhbCBkcml2ZXIgZm9yIHNlcjEgKHR0eVMxKS4KIAogY2hvaWNlCi0JcHJvbXB0ICJTZXIxIERNQSBpbiBjaGFubmVsICIKKwlwcm9tcHQgIlNlcjEgZGVmYXVsdCBwb3J0IHR5cGUiCiAJZGVwZW5kcyBvbiBFVFJBWF9TRVJJQUxfUE9SVDEKLQlkZWZhdWx0IEVUUkFYX1NFUklBTF9QT1JUMV9OT19ETUFfSU4KKwlkZWZhdWx0IEVUUkFYX1NFUklBTF9QT1JUMV9UWVBFXzIzMgogCWhlbHAKLQkgIFdoYXQgRE1BIGNoYW5uZWwgdG8gdXNlIGZvciBzZXIxLgorCSAgVHlwZSBvZiBzZXJpYWwgcG9ydC4KIAotCi1jb25maWcgRVRSQVhfU0VSSUFMX1BPUlQxX05PX0RNQV9JTgotCWJvb2wgIlNlcjEgdXNlcyBubyBETUEgZm9yIGlucHV0IgorY29uZmlnIEVUUkFYX1NFUklBTF9QT1JUMV9UWVBFXzIzMgorCWJvb2wgIlNlcjEgaXMgYSBSUy0yMzIgcG9ydCIKIAloZWxwCi0JICBEbyBub3QgdXNlIERNQSBmb3Igc2VyMSBpbnB1dC4KKwkgIENvbmZpZ3VyZSBzZXJpYWwgcG9ydCAxIHRvIGJlIGEgUlMtMjMyIHBvcnQuCiAKLWNvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDFfRE1BNV9JTgotCWJvb2wgIlNlcjEgdXNlcyBETUE1IGZvciBpbnB1dCIKLQlkZXBlbmRzIG9uIEVUUkFYX1NFUklBTF9QT1JUMQorY29uZmlnIEVUUkFYX1NFUklBTF9QT1JUMV9UWVBFXzQ4NUhECisJYm9vbCAiU2VyMSBpcyBhIGhhbGYgZHVwbGV4IFJTLTQ4NSBwb3J0IgorCWRlcGVuZHMgb24gRVRSQVhfUlM0ODUKIAloZWxwCi0JICBFbmFibGVzIHRoZSBETUE1IGlucHV0IGNoYW5uZWwgZm9yIHNlcjEgKHR0eVMxKS4KLQkgIElmIHlvdSBkbyBub3QgZW5hYmxlIERNQSwgYW4gaW50ZXJydXB0IGZvciBlYWNoIGNoYXJhY3RlciB3aWxsIGJlCi0JICB1c2VkIHdoZW4gcmVjZWl2aW5nIGRhdGEuCi0JICBOb3JtYWxseSB5b3Ugd2FudCB0aGlzIG9uLCB1bmxlc3MgeW91IHVzZSB0aGUgRE1BIGNoYW5uZWwgZm9yCi0JICBzb21ldGhpbmcgZWxzZS4KKwkgIENvbmZpZ3VyZSBzZXJpYWwgcG9ydCAxIHRvIGJlIGEgaGFsZiBkdXBsZXggKHR3byB3aXJlcykgUlMtNDg1IHBvcnQuCiAKLWVuZGNob2ljZQotCi1jaG9pY2UKLQlwcm9tcHQgIlNlcjEgRE1BIG91dCBjaGFubmVsICIKLQlkZXBlbmRzIG9uIEVUUkFYX1NFUklBTF9QT1JUMQotCWRlZmF1bHQgRVRSQVhfU0VSSUFMX1BPUlQxX05PX0RNQV9PVVQKK2NvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDFfVFlQRV80ODVGRAorCWJvb2wgIlNlcjEgaXMgYSBmdWxsIGR1cGxleCBSUy00ODUgcG9ydCIKKwlkZXBlbmRzIG9uIEVUUkFYX1JTNDg1CiAJaGVscAotCSAgV2hhdCBETUEgY2hhbm5lbCB0byB1c2UgZm9yIHNlcjEuCi0KLWNvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDFfTk9fRE1BX09VVAotCWJvb2wgIlNlcjEgdXNlcyBubyBETUEgZm9yIG91dHB1dCIKLQloZWxwCi0JICBEbyBub3QgdXNlIERNQSBmb3Igc2VyMSBvdXRwdXQuCi0KLWNvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDFfRE1BNF9PVVQKLQlib29sICJTZXIxIHVzZXMgRE1BNCBmb3Igb3V0cHV0IgotCWRlcGVuZHMgb24gRVRSQVhfU0VSSUFMX1BPUlQxCi0JaGVscAotCSAgRW5hYmxlcyB0aGUgRE1BNCBvdXRwdXQgY2hhbm5lbCBmb3Igc2VyMSAodHR5UzEpLgotCSAgSWYgeW91IGRvIG5vdCBlbmFibGUgRE1BLCBhbiBpbnRlcnJ1cHQgZm9yIGVhY2ggY2hhcmFjdGVyIHdpbGwgYmUKLQkgIHVzZWQgd2hlbiB0cmFuc21pdHRpbmcgZGF0YS4KLQkgIE5vcm1hbGx5IHlvdSB3YW50IHRoaXMgb24sIHVubGVzcyB5b3UgdXNlIHRoZSBETUEgY2hhbm5lbCBmb3IKLQkgIHNvbWV0aGluZyBlbHNlLgotCisJICBDb25maWd1cmUgc2VyaWFsIHBvcnQgMSB0byBiZSBhIGZ1bGwgZHVwbGV4IChmb3VyIHdpcmVzKSBSUy00ODUgcG9ydC4KIGVuZGNob2ljZQogCiBjb25maWcgRVRSQVhfU0VSMV9EVFJfQklUCkBAIC0yMTIsNTEgKzIwNCwzMCBAQAogCSAgRW5hYmxlcyB0aGUgRVRSQVggRlMgc2VyaWFsIGRyaXZlciBmb3Igc2VyMiAodHR5UzIpLgogCiBjaG9pY2UKLQlwcm9tcHQgIlNlcjIgRE1BIGluIGNoYW5uZWwgIgorCXByb21wdCAiU2VyMiBkZWZhdWx0IHBvcnQgdHlwZSIKIAlkZXBlbmRzIG9uIEVUUkFYX1NFUklBTF9QT1JUMgotCWRlZmF1bHQgRVRSQVhfU0VSSUFMX1BPUlQyX05PX0RNQV9JTgorCWRlZmF1bHQgRVRSQVhfU0VSSUFMX1BPUlQyX1RZUEVfMjMyCiAJaGVscAotCSAgV2hhdCBETUEgY2hhbm5lbCB0byB1c2UgZm9yIHNlcjIuCisJICBXaGF0IERNQSBjaGFubmVsIHRvIHVzZSBmb3Igc2VyMgogCi0KLWNvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDJfTk9fRE1BX0lOCi0JYm9vbCAiU2VyMiB1c2VzIG5vIERNQSBmb3IgaW5wdXQiCitjb25maWcgRVRSQVhfU0VSSUFMX1BPUlQyX1RZUEVfMjMyCisJYm9vbCAiU2VyMiBpcyBhIFJTLTIzMiBwb3J0IgogCWhlbHAKLQkgIERvIG5vdCB1c2UgRE1BIGZvciBzZXIyIGlucHV0LgorCSAgQ29uZmlndXJlIHNlcmlhbCBwb3J0IDIgdG8gYmUgYSBSUy0yMzIgcG9ydC4KIAotY29uZmlnIEVUUkFYX1NFUklBTF9QT1JUMl9ETUEzX0lOCi0JYm9vbCAiU2VyMiB1c2VzIERNQTMgZm9yIGlucHV0IgotCWRlcGVuZHMgb24gRVRSQVhfU0VSSUFMX1BPUlQyCitjb25maWcgRVRSQVhfU0VSSUFMX1BPUlQyX1RZUEVfNDg1SEQKKwlib29sICJTZXIyIGlzIGEgaGFsZiBkdXBsZXggUlMtNDg1IHBvcnQiCisJZGVwZW5kcyBvbiBFVFJBWF9SUzQ4NQogCWhlbHAKLQkgIEVuYWJsZXMgdGhlIERNQTMgaW5wdXQgY2hhbm5lbCBmb3Igc2VyMiAodHR5UzIpLgotCSAgSWYgeW91IGRvIG5vdCBlbmFibGUgRE1BLCBhbiBpbnRlcnJ1cHQgZm9yIGVhY2ggY2hhcmFjdGVyIHdpbGwgYmUKLQkgIHVzZWQgd2hlbiByZWNlaXZpbmcgZGF0YS4KLQkgIE5vcm1hbGx5IHlvdSB3YW50IHRvIHVzZSBETUEsIHVubGVzcyB5b3UgdXNlIHRoZSBETUEgY2hhbm5lbCBmb3IKLQkgIHNvbWV0aGluZyBlbHNlLgorCSAgQ29uZmlndXJlIHNlcmlhbCBwb3J0IDIgdG8gYmUgYSBoYWxmIGR1cGxleCAodHdvIHdpcmVzKSBSUy00ODUgcG9ydC4KIAorY29uZmlnIEVUUkFYX1NFUklBTF9QT1JUMl9UWVBFXzQ4NUZECisJYm9vbCAiU2VyMiBpcyBhIGZ1bGwgZHVwbGV4IFJTLTQ4NSBwb3J0IgorCWRlcGVuZHMgb24gRVRSQVhfUlM0ODUKKwloZWxwCisJICBDb25maWd1cmUgc2VyaWFsIHBvcnQgMiB0byBiZSBhIGZ1bGwgZHVwbGV4IChmb3VyIHdpcmVzKSBSUy00ODUgcG9ydC4KIGVuZGNob2ljZQogCi1jaG9pY2UKLQlwcm9tcHQgIlNlcjIgRE1BIG91dCBjaGFubmVsIgotCWRlcGVuZHMgb24gRVRSQVhfU0VSSUFMX1BPUlQyCi0JZGVmYXVsdCBFVFJBWF9TRVJJQUxfUE9SVDJfTk9fRE1BX09VVAotCi1jb25maWcgRVRSQVhfU0VSSUFMX1BPUlQyX05PX0RNQV9PVVQKLQlib29sICJTZXIyIHVzZXMgbm8gRE1BIGZvciBvdXRwdXQiCi0JaGVscAotCSAgRG8gbm90IHVzZSBETUEgZm9yIHNlcjIgb3V0cHV0LgotCi1jb25maWcgRVRSQVhfU0VSSUFMX1BPUlQyX0RNQTJfT1VUCi0JYm9vbCAiU2VyMiB1c2VzIERNQTIgZm9yIG91dHB1dCIKLQlkZXBlbmRzIG9uIEVUUkFYX1NFUklBTF9QT1JUMgotCWhlbHAKLQkgIEVuYWJsZXMgdGhlIERNQTIgb3V0cHV0IGNoYW5uZWwgZm9yIHNlcjIgKHR0eVMyKS4KLQkgIElmIHlvdSBkbyBub3QgZW5hYmxlIERNQSwgYW4gaW50ZXJydXB0IGZvciBlYWNoIGNoYXJhY3RlciB3aWxsIGJlCi0JICB1c2VkIHdoZW4gdHJhbnNtaXR0aW5nIGRhdGEuCi0JICBOb3JtYWxseSB5b3Ugd2FudCB0byB1c2UgRE1BLCB1bmxlc3MgeW91IHVzZSB0aGUgRE1BIGNoYW5uZWwgZm9yCi0JICBzb21ldGhpbmcgZWxzZS4KLQotZW5kY2hvaWNlCiAKIGNvbmZpZyBFVFJBWF9TRVIyX0RUUl9CSVQKIAlzdHJpbmcgIlNlciAyIERUUiBiaXQgKGVtcHR5ID0gbm90IHVzZWQpIgpAQCAtMjgxLDUwICsyNTIsMjggQEAKIAkgIEVuYWJsZXMgdGhlIEVUUkFYIEZTIHNlcmlhbCBkcml2ZXIgZm9yIHNlcjMgKHR0eVMzKS4KIAogY2hvaWNlCi0JcHJvbXB0ICJTZXIzIERNQSBpbiBjaGFubmVsICIKKwlwcm9tcHQgIlNlcjMgZGVmYXVsdCBwb3J0IHR5cGUiCiAJZGVwZW5kcyBvbiBFVFJBWF9TRVJJQUxfUE9SVDMKLQlkZWZhdWx0IEVUUkFYX1NFUklBTF9QT1JUM19OT19ETUFfSU4KKwlkZWZhdWx0IEVUUkFYX1NFUklBTF9QT1JUM19UWVBFXzIzMgogCWhlbHAKIAkgIFdoYXQgRE1BIGNoYW5uZWwgdG8gdXNlIGZvciBzZXIzLgogCi0KLWNvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDNfTk9fRE1BX0lOCi0JYm9vbCAiU2VyMyB1c2VzIG5vIERNQSBmb3IgaW5wdXQiCitjb25maWcgRVRSQVhfU0VSSUFMX1BPUlQzX1RZUEVfMjMyCisJYm9vbCAiU2VyMyBpcyBhIFJTLTIzMiBwb3J0IgogCWhlbHAKLQkgIERvIG5vdCB1c2UgRE1BIGZvciBzZXIzIGlucHV0LgorCSAgQ29uZmlndXJlIHNlcmlhbCBwb3J0IDMgdG8gYmUgYSBSUy0yMzIgcG9ydC4KIAotY29uZmlnIEVUUkFYX1NFUklBTF9QT1JUM19ETUE5X0lOCi0JYm9vbCAiU2VyMyB1c2VzIERNQTkgZm9yIGlucHV0IgotCWRlcGVuZHMgb24gRVRSQVhfU0VSSUFMX1BPUlQzCitjb25maWcgRVRSQVhfU0VSSUFMX1BPUlQzX1RZUEVfNDg1SEQKKwlib29sICJTZXIzIGlzIGEgaGFsZiBkdXBsZXggUlMtNDg1IHBvcnQiCisJZGVwZW5kcyBvbiBFVFJBWF9SUzQ4NQogCWhlbHAKLQkgIEVuYWJsZXMgdGhlIERNQTkgaW5wdXQgY2hhbm5lbCBmb3Igc2VyMyAodHR5UzMpLgotCSAgSWYgeW91IGRvIG5vdCBlbmFibGUgRE1BLCBhbiBpbnRlcnJ1cHQgZm9yIGVhY2ggY2hhcmFjdGVyIHdpbGwgYmUKLQkgIHVzZWQgd2hlbiByZWNlaXZpbmcgZGF0YS4KLQkgIE5vcm1hbGx5IHlvdSB3YW50IHRvIHVzZSBETUEsIHVubGVzcyB5b3UgdXNlIHRoZSBETUEgY2hhbm5lbCBmb3IKLQkgIHNvbWV0aGluZyBlbHNlLgorCSAgQ29uZmlndXJlIHNlcmlhbCBwb3J0IDMgdG8gYmUgYSBoYWxmIGR1cGxleCAodHdvIHdpcmVzKSBSUy00ODUgcG9ydC4KIAotZW5kY2hvaWNlCi0KLWNob2ljZQotCXByb21wdCAiU2VyMyBETUEgb3V0IGNoYW5uZWwiCi0JZGVwZW5kcyBvbiBFVFJBWF9TRVJJQUxfUE9SVDMKLQlkZWZhdWx0IEVUUkFYX1NFUklBTF9QT1JUM19OT19ETUFfT1VUCi0KLWNvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDNfTk9fRE1BX09VVAotCWJvb2wgIlNlcjMgdXNlcyBubyBETUEgZm9yIG91dHB1dCIKK2NvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDNfVFlQRV80ODVGRAorCWJvb2wgIlNlcjMgaXMgYSBmdWxsIGR1cGxleCBSUy00ODUgcG9ydCIKKwlkZXBlbmRzIG9uIEVUUkFYX1JTNDg1CiAJaGVscAotCSAgRG8gbm90IHVzZSBETUEgZm9yIHNlcjMgb3V0cHV0LgotCi1jb25maWcgRVRSQVhfU0VSSUFMX1BPUlQzX0RNQThfT1VUCi0JYm9vbCAiU2VyMyB1c2VzIERNQTggZm9yIG91dHB1dCIKLQlkZXBlbmRzIG9uIEVUUkFYX1NFUklBTF9QT1JUMwotCWhlbHAKLQkgIEVuYWJsZXMgdGhlIERNQTggb3V0cHV0IGNoYW5uZWwgZm9yIHNlcjMgKHR0eVMzKS4KLQkgIElmIHlvdSBkbyBub3QgZW5hYmxlIERNQSwgYW4gaW50ZXJydXB0IGZvciBlYWNoIGNoYXJhY3RlciB3aWxsIGJlCi0JICB1c2VkIHdoZW4gdHJhbnNtaXR0aW5nIGRhdGEuCi0JICBOb3JtYWxseSB5b3Ugd2FudCB0byB1c2UgRE1BLCB1bmxlc3MgeW91IHVzZSB0aGUgRE1BIGNoYW5uZWwgZm9yCi0JICBzb21ldGhpbmcgZWxzZS4KLQorCSAgQ29uZmlndXJlIHNlcmlhbCBwb3J0IDMgdG8gYmUgYSBmdWxsIGR1cGxleCAoZm91ciB3aXJlcykgUlMtNDg1IHBvcnQuCiBlbmRjaG9pY2UKIAogY29uZmlnIEVUUkFYX1NFUjNfRFRSX0JJVApAQCAtMzQzLDkgKzI5Miw4MSBAQAogCXN0cmluZyAiU2VyIDMgQ0QgYml0IChlbXB0eSA9IG5vdCB1c2VkKSIKIAlkZXBlbmRzIG9uIEVUUkFYX1NFUklBTF9QT1JUMwogCitjb25maWcgRVRSQVhfU0VSSUFMX1BPUlQ0CisJYm9vbCAiU2VyaWFsIHBvcnQgNCBlbmFibGVkIgorCWRlcGVuZHMgb24gRVRSQVhGU19TRVJJQUwgJiYgQ1JJU19NQUNIX0FSVFBFQzMKKwloZWxwCisJICBFbmFibGVzIHRoZSBFVFJBWCBGUyBzZXJpYWwgZHJpdmVyIGZvciBzZXI0ICh0dHlTNCkuCisKK2Nob2ljZQorCXByb21wdCAiU2VyNCBkZWZhdWx0IHBvcnQgdHlwZSIKKwlkZXBlbmRzIG9uIEVUUkFYX1NFUklBTF9QT1JUNAorCWRlZmF1bHQgRVRSQVhfU0VSSUFMX1BPUlQ0X1RZUEVfMjMyCisJaGVscAorCSAgV2hhdCBETUEgY2hhbm5lbCB0byB1c2UgZm9yIHNlcjQuCisKK2NvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVDRfVFlQRV8yMzIKKwlib29sICJTZXI0IGlzIGEgUlMtMjMyIHBvcnQiCisJaGVscAorCSAgQ29uZmlndXJlIHNlcmlhbCBwb3J0IDQgdG8gYmUgYSBSUy0yMzIgcG9ydC4KKworY29uZmlnIEVUUkFYX1NFUklBTF9QT1JUNF9UWVBFXzQ4NUhECisJYm9vbCAiU2VyNCBpcyBhIGhhbGYgZHVwbGV4IFJTLTQ4NSBwb3J0IgorCWRlcGVuZHMgb24gRVRSQVhfUlM0ODUKKwloZWxwCisJICBDb25maWd1cmUgc2VyaWFsIHBvcnQgNCB0byBiZSBhIGhhbGYgZHVwbGV4ICh0d28gd2lyZXMpIFJTLTQ4NSBwb3J0LgorCitjb25maWcgRVRSQVhfU0VSSUFMX1BPUlQ0X1RZUEVfNDg1RkQKKwlib29sICJTZXI0IGlzIGEgZnVsbCBkdXBsZXggUlMtNDg1IHBvcnQiCisJZGVwZW5kcyBvbiBFVFJBWF9SUzQ4NQorCWhlbHAKKwkgIENvbmZpZ3VyZSBzZXJpYWwgcG9ydCA0IHRvIGJlIGEgZnVsbCBkdXBsZXggKGZvdXIgd2lyZXMpIFJTLTQ4NSBwb3J0LgorZW5kY2hvaWNlCisKK2Nob2ljZQorCXByb21wdCAiU2VyNCBETUEgaW4gY2hhbm5lbCAiCisJZGVwZW5kcyBvbiBFVFJBWF9TRVJJQUxfUE9SVDQKKwlkZWZhdWx0IEVUUkFYX1NFUklBTF9QT1JUNF9OT19ETUFfSU4KKwloZWxwCisJICBXaGF0IERNQSBjaGFubmVsIHRvIHVzZSBmb3Igc2VyNC4KKworCitjb25maWcgRVRSQVhfU0VSSUFMX1BPUlQ0X05PX0RNQV9JTgorCWJvb2wgIlNlcjQgdXNlcyBubyBETUEgZm9yIGlucHV0IgorCWhlbHAKKwkgIERvIG5vdCB1c2UgRE1BIGZvciBzZXI0IGlucHV0LgorCitjb25maWcgRVRSQVhfU0VSSUFMX1BPUlQ0X0RNQTlfSU4KKwlib29sICJTZXI0IHVzZXMgRE1BOSBmb3IgaW5wdXQiCisJZGVwZW5kcyBvbiBFVFJBWF9TRVJJQUxfUE9SVDQKKwloZWxwCisJICBFbmFibGVzIHRoZSBETUE5IGlucHV0IGNoYW5uZWwgZm9yIHNlcjQgKHR0eVM0KS4KKwkgIElmIHlvdSBkbyBub3QgZW5hYmxlIERNQSwgYW4gaW50ZXJydXB0IGZvciBlYWNoIGNoYXJhY3RlciB3aWxsIGJlCisJICB1c2VkIHdoZW4gcmVjZWl2ZWluZyBkYXRhLgorCSAgTm9ybWFsbHkgeW91IHdhbnQgdG8gdXNlIERNQSwgdW5sZXNzIHlvdSB1c2UgdGhlIERNQSBjaGFubmVsIGZvcgorCSAgc29tZXRoaW5nIGVsc2UuCisKK2VuZGNob2ljZQorCitjb25maWcgRVRSQVhfU0VSNF9EVFJfQklUCisJc3RyaW5nICJTZXIgNCBEVFIgYml0IChlbXB0eSA9IG5vdCB1c2VkKSIKKwlkZXBlbmRzIG9uIEVUUkFYX1NFUklBTF9QT1JUNAorCitjb25maWcgRVRSQVhfU0VSNF9SSV9CSVQKKwlzdHJpbmcgIlNlciA0IFJJIGJpdCAoZW1wdHkgPSBub3QgdXNlZCkiCisJZGVwZW5kcyBvbiBFVFJBWF9TRVJJQUxfUE9SVDQKKworY29uZmlnIEVUUkFYX1NFUjRfRFNSX0JJVAorCXN0cmluZyAiU2VyIDQgRFNSIGJpdCAoZW1wdHkgPSBub3QgdXNlZCkiCisJZGVwZW5kcyBvbiBFVFJBWF9TRVJJQUxfUE9SVDQKKworY29uZmlnIEVUUkFYX1NFUjNfQ0RfQklUCisJc3RyaW5nICJTZXIgNCBDRCBiaXQgKGVtcHR5ID0gbm90IHVzZWQpIgorCWRlcGVuZHMgb24gRVRSQVhfU0VSSUFMX1BPUlQ0CisKIGNvbmZpZyBFVFJBWF9SUzQ4NQogCWJvb2wgIlJTLTQ4NSBzdXBwb3J0IgotCWRlcGVuZHMgb24gRVRSQVhfU0VSSUFMCisJZGVwZW5kcyBvbiBFVFJBWEZTX1NFUklBTAogCWhlbHAKIAkgIEVuYWJsZXMgc3VwcG9ydCBmb3IgUlMtNDg1IHNlcmlhbCBjb21tdW5pY2F0aW9uLiAgRm9yIGEgcHJpbWVyIG9uCiAJICBSUy00ODUsIHNlZSA8aHR0cDovL3d3dy5ody5jei9lbmdsaXNoL2RvY3MvcnM0ODUvcnM0ODUuaHRtbD4uCkBAIC0zNTYsMjIgKzM3Nyw2IEBACiAJaGVscAogCSAgSXQgaXMgbmVjZXNzYXJ5IHRvIGRpc2FibGUgdGhlIHNlcmlhbCByZWNlaXZlciB0byBhdm9pZCBzZXJpYWwKIAkgIGxvb3BiYWNrLiAgTm90IGFsbCBwcm9kdWN0cyBhcmUgYWJsZSB0byBkbyB0aGlzIGluIHNvZnR3YXJlIG9ubHkuCi0JICBBeGlzIDI0MDAvMjQwMSBtdXN0IGRpc2FibGUgcmVjZWl2ZXIuCi0KLWNvbmZpZyBFVFJBWF9BWElTRkxBU0hNQVAKLQlib29sICJBeGlzIGZsYXNoLW1hcCBzdXBwb3J0IgotCWRlcGVuZHMgb24gRVRSQVhfQVJDSF9WMzIKLQlzZWxlY3QgTVRECi0Jc2VsZWN0IE1URF9DRkkKLQlzZWxlY3QgTVREX0NGSV9BTURTVEQKLQlzZWxlY3QgTVREX0NIQVIKLQlzZWxlY3QgTVREX0JMT0NLCi0Jc2VsZWN0IE1URF9QQVJUSVRJT05TCi0Jc2VsZWN0IE1URF9DT05DQVQKLQlzZWxlY3QgTVREX0NPTVBMRVhfTUFQUElOR1MKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIE1URCBtYXBwaW5nIG9mIGZsYXNoIGRldmljZXMuICBOZWVkZWQgdG8gdXNlCi0JICBmbGFzaCBtZW1vcmllcy4gIElmIHVuc3VyZSwgc2F5IFkuCiAKIGNvbmZpZyBFVFJBWF9TWU5DSFJPTk9VU19TRVJJQUwKIAlib29sICJTeW5jaHJvbm91cyBzZXJpYWwtcG9ydCBzdXBwb3J0IgpAQCAtMzk0LDcgKzM5OSw3IEBACiAKIGNvbmZpZyBFVFJBWF9TWU5DSFJPTk9VU19TRVJJQUxfUE9SVDEKICAgICAgICAgIGJvb2wgIlN5bmNocm9ub3VzIHNlcmlhbCBwb3J0IDEgZW5hYmxlZCIKLSAgICAgICAgIGRlcGVuZHMgb24gRVRSQVhfU1lOQ0hST05PVVNfU0VSSUFMCisgICAgICAgICBkZXBlbmRzIG9uIEVUUkFYX1NZTkNIUk9OT1VTX1NFUklBTCAmJiBFVFJBWEZTCiAgICAgICAgICBoZWxwCiAgICAgICAgICAgIEVuYWJsZWQgc3luY2hyb25vdXMgc2VyaWFsIHBvcnQgMS4KIApAQCAtNDA1LDYgKzQxMCwzMSBAQAogICAgICAgICAgICBBIHN5bmNocm9ub3VzIHNlcmlhbCBwb3J0IGNhbiBydW4gaW4gbWFudWFsIG9yIERNQSBtb2RlLgogICAgICAgICAgICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gd2lsbCBtYWtlIGl0IHJ1biBpbiBETUEgbW9kZS4KIAorY29uZmlnIEVUUkFYX0FYSVNGTEFTSE1BUAorCWJvb2wgIkF4aXMgZmxhc2gtbWFwIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBFVFJBWF9BUkNIX1YzMgorCXNlbGVjdCBNVEQKKwlzZWxlY3QgTVREX0NGSQorCXNlbGVjdCBNVERfQ0ZJX0FNRFNURAorCXNlbGVjdCBNVERfSkVERUNQUk9CRQorCXNlbGVjdCBNVERfQ0hBUgorCXNlbGVjdCBNVERfQkxPQ0sKKwlzZWxlY3QgTVREX1BBUlRJVElPTlMKKwlzZWxlY3QgTVREX0NPTkNBVAorCXNlbGVjdCBNVERfQ09NUExFWF9NQVBQSU5HUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgTVREIG1hcHBpbmcgb2YgZmxhc2ggZGV2aWNlcy4gIE5lZWRlZCB0byB1c2UKKwkgIGZsYXNoIG1lbW9yaWVzLiAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIEVUUkFYX0FYSVNGTEFTSE1BUF9NVEQwV0hPTEUKKwlib29sICJNVEQwIGlzIHdob2xlIGJvb3QgZmxhc2ggZGV2aWNlIgorCWRlcGVuZHMgb24gRVRSQVhfQVhJU0ZMQVNITUFQCisJZGVmYXVsdCBOCisJaGVscAorCSAgV2hlbiB0aGlzIG9wdGlvbiBpcyBub3Qgc2V0LCBtdGQwIHJlZmVycyB0byB0aGUgZmlyc3QgcGFydGl0aW9uCisJICBvbiB0aGUgYm9vdCBmbGFzaCBkZXZpY2UuIFdoZW4gc2V0LCBtdGQwIHJlZmVycyB0byB0aGUgd2hvbGUKKwkgIGRldmljZSwgd2l0aCBtdGQxIHJlZmVycmluZyB0byB0aGUgZmlyc3QgcGFydGl0aW9uIGV0Yy4KKwogY29uZmlnIEVUUkFYX1BUQUJMRV9TRUNUT1IKIAlpbnQgIkJ5dGUtb2Zmc2V0IG9mIHBhcnRpdGlvbiB0YWJsZSBzZWN0b3IiCiAJZGVwZW5kcyBvbiBFVFJBWF9BWElTRkxBU0hNQVAKQEAgLTQyNSw0MiArNDU1LDMyIEBACiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIE1URCBtYXBwaW5nIG9mIE5BTkQgZmxhc2ggZGV2aWNlcy4gIE5lZWRlZCB0byB1c2UKIAkgIE5BTkQgZmxhc2ggbWVtb3JpZXMuICBJZiB1bnN1cmUsIHNheSBZLgogCitjb25maWcgRVRSQVhfTkFOREJPT1QKKwlib29sICJCb290IGZyb20gTkFORCBmbGFzaCIKKwlkZXBlbmRzIG9uIEVUUkFYX05BTkRGTEFTSAorCWhlbHAKKwkgIFRoaXMgb3B0aW9ucyBlbmFibGVzIGJvb3RpbmcgZnJvbSBOQU5EIGZsYXNoIGRldmljZXMuCisJICBTYXkgWSBpZiB5b3VyIGJvb3QgY29kZSwga2VybmVsIGFuZCByb290IGZpbGUgc3lzdGVtIGlzIGluCisJICBOQU5EIGZsYXNoLiBTYXkgTiBpZiB0aGV5IGFyZSBpbiBOT1IgZmxhc2guCisKIGNvbmZpZyBFVFJBWF9JMkMKIAlib29sICJJMkMgZHJpdmVyIgogCWRlcGVuZHMgb24gRVRSQVhfQVJDSF9WMzIKIAloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVkIHRoZSBJMkMgZHJpdmVyIHVzZWQgYnkgZS5nLiB0aGUgUlRDIGRyaXZlci4KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIEkyQyBkcml2ZXIgdXNlZCBieSBlLmcuIHRoZSBSVEMgZHJpdmVyLgogCi1jb25maWcgRVRSQVhfSTJDX0RBVEFfUE9SVAorY29uZmlnIEVUUkFYX1YzMl9JMkNfREFUQV9QT1JUCiAJc3RyaW5nICJJMkMgZGF0YSBwaW4iCiAJZGVwZW5kcyBvbiBFVFJBWF9JMkMKIAloZWxwCiAJICBUaGUgcGluIHRvIHVzZSBmb3IgSTJDIGRhdGEuCiAKLWNvbmZpZyBFVFJBWF9JMkNfQ0xLX1BPUlQKK2NvbmZpZyBFVFJBWF9WMzJfSTJDX0NMS19QT1JUCiAJc3RyaW5nICJJMkMgY2xvY2sgcGluIgogCWRlcGVuZHMgb24gRVRSQVhfSTJDCiAJaGVscAogCSAgVGhlIHBpbiB0byB1c2UgZm9yIEkyQyBjbG9jay4KIAotY29uZmlnIEVUUkFYX1JUQwotCWJvb2wgIlJlYWwgVGltZSBDbG9jayBzdXBwb3J0IgotCWRlcGVuZHMgb24gRVRSQVhfQVJDSF9WMzIKLQloZWxwCi0JICBFbmFibGVkIFJUQyBzdXBwb3J0LgotCi1jaG9pY2UKLQlwcm9tcHQgIlJUQyBjaGlwIgotCWRlcGVuZHMgb24gRVRSQVhfUlRDCi0JZGVmYXVsdCBFVFJBWF9QQ0Y4NTYzCi0KLWNvbmZpZyBFVFJBWF9QQ0Y4NTYzCi0JYm9vbCAiUENGODU2MyIKLQloZWxwCi0JICBQaGlsaXBzIFBDRjg1NjMgUlRDCi0KLWVuZGNob2ljZQotCiBjb25maWcgRVRSQVhfR1BJTwogCWJvb2wgIkdQSU8gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEVUUkFYX0FSQ0hfVjMyCkBAIC00NzYsMzMgKzQ5NiwzNiBAQAogCSAgUmVtZW1iZXIgdGhhdCB5b3UgbmVlZCB0byBzZXR1cCB0aGUgcG9ydCBkaXJlY3Rpb25zIGFwcHJvcHJpYXRlbHkgaW4KIAkgIHRoZSBHZW5lcmFsIGNvbmZpZ3VyYXRpb24uCiAKLWNvbmZpZyBFVFJBWF9QQV9CVVRUT05fQklUTUFTSwotCWhleCAiUEEtYnV0dG9ucyBiaXRtYXNrIgorY29uZmlnIEVUUkFYX1ZJUlRVQUxfR1BJTworCWJvb2wgIlZpcnR1YWwgR1BJTyBzdXBwb3J0IgogCWRlcGVuZHMgb24gRVRSQVhfR1BJTwotCWRlZmF1bHQgIjB4MDIiCiAJaGVscAotCSAgVGhpcyBpcyBhIGJpdG1hc2sgKDggYml0cykgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGJpdHMgb24gUEEKLQkgIHRoYXQgYXJlIHVzZWQgZm9yIGJ1dHRvbnMuCi0JICBNb3N0IHByb2R1Y3RzIGhhcyBhIHNvIGNhbGxlZCBURVNUIGJ1dHRvbiBvbiBQQTEsIGlmIHRoYXQgaXMgdHJ1ZQotCSAgdXNlIDB4MDIgaGVyZS4KLQkgIFVzZSAwMCBpZiB0aGVyZSBhcmUgbm8gYnV0dG9ucyBvbiBQQS4KLQkgIElmIHRoZSBiaXRtYXNrIGlzIDw+IDAwIGEgYnV0dG9uIGRyaXZlciB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBncGlvCi0JICBkcml2ZXIuIEVUUkFYIGdlbmVyYWwgSS9PIHN1cHBvcnQgbXVzdCBiZSBlbmFibGVkLgorCSAgRW5hYmxlcyB0aGUgdmlydHVhbCBFdHJheCBnZW5lcmFsIHBvcnQgZGV2aWNlIChtYWpvciAxMjAsIG1pbm9yIDYpLgorCSAgSXQgdXNlcyBhbiBJL08gZXhwYW5kZXIgZm9yIHRoZSBJMkMtYnVzLgorCitjb25maWcgRVRSQVhfVklSVFVBTF9HUElPX0lOVEVSUlVQVF9QQV9QSU4KKwlpbnQgIlZpcnR1YWwgR1BJTyBpbnRlcnJ1cHQgcGluIG9uIFBBIHBpbiIKKwlyYW5nZSAwIDcKKwlkZXBlbmRzIG9uIEVUUkFYX1ZJUlRVQUxfR1BJTworCWhlbHAKKwkgIFRoZSBwaW4gdG8gdXNlIG9uIFBBIGZvciB2aXJ0dWFsIGdwaW8gaW50ZXJydXB0LgogCiBjb25maWcgRVRSQVhfUEFfQ0hBTkdFQUJMRV9ESVIKIAloZXggIlBBIHVzZXIgY2hhbmdlYWJsZSBkaXIgbWFzayIKIAlkZXBlbmRzIG9uIEVUUkFYX0dQSU8KLQlkZWZhdWx0ICIweDAwIgorCWRlZmF1bHQgIjB4MDAiIGlmIEVUUkFYRlMKKwlkZWZhdWx0ICIweDAwMDAwMDAwIiBpZiAhRVRSQVhGUwogCWhlbHAKIAkgIFRoaXMgaXMgYSBiaXRtYXNrICg4IGJpdHMpIHdpdGggaW5mb3JtYXRpb24gb2Ygd2hhdCBiaXRzIGluIFBBIHRoYXQgYQogCSAgdXNlciBjYW4gY2hhbmdlIGRpcmVjdGlvbiBvbiB1c2luZyBpb2N0bCdzLgogCSAgQml0IHNldCA9IGNoYW5nZWFibGUuCi0JICBZb3UgcHJvYmFibHkgd2FudCAweDAwIGhlcmUsIGJ1dCBpdCBkZXBlbmRzIG9uIHlvdXIgaGFyZHdhcmUuCisJICBZb3UgcHJvYmFibHkgd2FudCAwIGhlcmUsIGJ1dCBpdCBkZXBlbmRzIG9uIHlvdXIgaGFyZHdhcmUuCiAKIGNvbmZpZyBFVFJBWF9QQV9DSEFOR0VBQkxFX0JJVFMKIAloZXggIlBBIHVzZXIgY2hhbmdlYWJsZSBiaXRzIG1hc2siCiAJZGVwZW5kcyBvbiBFVFJBWF9HUElPCi0JZGVmYXVsdCAiMHgwMCIKKwlkZWZhdWx0ICIweDAwIiBpZiBFVFJBWEZTCisJZGVmYXVsdCAiMHgwMDAwMDAwMCIgaWYgIUVUUkFYRlMKIAloZWxwCiAJICBUaGlzIGlzIGEgYml0bWFzayAoOCBiaXRzKSB3aXRoIGluZm9ybWF0aW9uIG9mIHdoYXQgYml0cyBpbiBQQQogCSAgdGhhdCBhIHVzZXIgY2FuIGNoYW5nZSB0aGUgdmFsdWUgb24gdXNpbmcgaW9jdGwncy4KQEAgLTUxMSwxNyArNTM0LDE5IEBACiBjb25maWcgRVRSQVhfUEJfQ0hBTkdFQUJMRV9ESVIKIAloZXggIlBCIHVzZXIgY2hhbmdlYWJsZSBkaXIgbWFzayIKIAlkZXBlbmRzIG9uIEVUUkFYX0dQSU8KLQlkZWZhdWx0ICIweDAwMDAwIgorCWRlZmF1bHQgIjB4MDAwMDAiIGlmIEVUUkFYRlMKKwlkZWZhdWx0ICIweDAwMDAwMDAwIiBpZiAhRVRSQVhGUwogCWhlbHAKIAkgIFRoaXMgaXMgYSBiaXRtYXNrICgxOCBiaXRzKSB3aXRoIGluZm9ybWF0aW9uIG9mIHdoYXQgYml0cyBpbiBQQgogCSAgdGhhdCBhIHVzZXIgY2FuIGNoYW5nZSBkaXJlY3Rpb24gb24gdXNpbmcgaW9jdGwncy4KIAkgIEJpdCBzZXQgPSBjaGFuZ2VhYmxlLgotCSAgWW91IHByb2JhYmx5IHdhbnQgMHgwMDAwMCBoZXJlLCBidXQgaXQgZGVwZW5kcyBvbiB5b3VyIGhhcmR3YXJlLgorCSAgWW91IHByb2JhYmx5IHdhbnQgMCBoZXJlLCBidXQgaXQgZGVwZW5kcyBvbiB5b3VyIGhhcmR3YXJlLgogCiBjb25maWcgRVRSQVhfUEJfQ0hBTkdFQUJMRV9CSVRTCiAJaGV4ICJQQiB1c2VyIGNoYW5nZWFibGUgYml0cyBtYXNrIgogCWRlcGVuZHMgb24gRVRSQVhfR1BJTwotCWRlZmF1bHQgIjB4MDAwMDAiCisJZGVmYXVsdCAiMHgwMDAwMCIgaWYgRVRSQVhGUworCWRlZmF1bHQgIjB4MDAwMDAwMDAiIGlmICFFVFJBWEZTCiAJaGVscAogCSAgVGhpcyBpcyBhIGJpdG1hc2sgKDE4IGJpdHMpIHdpdGggaW5mb3JtYXRpb24gb2Ygd2hhdCBiaXRzIGluIFBCCiAJICB0aGF0IGEgdXNlciBjYW4gY2hhbmdlIHRoZSB2YWx1ZSBvbiB1c2luZyBpb2N0bCdzLgpAQCAtNTMwLDE3ICs1NTUsMTkgQEAKIGNvbmZpZyBFVFJBWF9QQ19DSEFOR0VBQkxFX0RJUgogCWhleCAiUEMgdXNlciBjaGFuZ2VhYmxlIGRpciBtYXNrIgogCWRlcGVuZHMgb24gRVRSQVhfR1BJTwotCWRlZmF1bHQgIjB4MDAwMDAiCisJZGVmYXVsdCAiMHgwMDAwMCIgaWYgRVRSQVhGUworCWRlZmF1bHQgIjB4MDAwMDAwMDAiIGlmICFFVFJBWEZTCiAJaGVscAogCSAgVGhpcyBpcyBhIGJpdG1hc2sgKDE4IGJpdHMpIHdpdGggaW5mb3JtYXRpb24gb2Ygd2hhdCBiaXRzIGluIFBDCiAJICB0aGF0IGEgdXNlciBjYW4gY2hhbmdlIGRpcmVjdGlvbiBvbiB1c2luZyBpb2N0bCdzLgogCSAgQml0IHNldCA9IGNoYW5nZWFibGUuCi0JICBZb3UgcHJvYmFibHkgd2FudCAweDAwMDAwIGhlcmUsIGJ1dCBpdCBkZXBlbmRzIG9uIHlvdXIgaGFyZHdhcmUuCisJICBZb3UgcHJvYmFibHkgd2FudCAwIGhlcmUsIGJ1dCBpdCBkZXBlbmRzIG9uIHlvdXIgaGFyZHdhcmUuCiAKIGNvbmZpZyBFVFJBWF9QQ19DSEFOR0VBQkxFX0JJVFMKIAloZXggIlBDIHVzZXIgY2hhbmdlYWJsZSBiaXRzIG1hc2siCiAJZGVwZW5kcyBvbiBFVFJBWF9HUElPCi0JZGVmYXVsdCAiMHgwMDAwMCIKKwlkZWZhdWx0ICIweDAwMDAwIiBpZiBFVFJBWEZTCisJZGVmYXVsdCAiMHgwMDAwMDAwMCIgaWYgRVRSQVhGUwogCWhlbHAKIAkgIFRoaXMgaXMgYSBiaXRtYXNrICgxOCBiaXRzKSB3aXRoIGluZm9ybWF0aW9uIG9mIHdoYXQgYml0cyBpbiBQQwogCSAgdGhhdCBhIHVzZXIgY2FuIGNoYW5nZSB0aGUgdmFsdWUgb24gdXNpbmcgaW9jdGwncy4KQEAgLTU0OCw3ICs1NzUsNyBAQAogCiBjb25maWcgRVRSQVhfUERfQ0hBTkdFQUJMRV9ESVIKIAloZXggIlBEIHVzZXIgY2hhbmdlYWJsZSBkaXIgbWFzayIKLQlkZXBlbmRzIG9uIEVUUkFYX0dQSU8KKwlkZXBlbmRzIG9uIEVUUkFYX0dQSU8gJiYgRVRSQVhGUwogCWRlZmF1bHQgIjB4MDAwMDAiCiAJaGVscAogCSAgVGhpcyBpcyBhIGJpdG1hc2sgKDE4IGJpdHMpIHdpdGggaW5mb3JtYXRpb24gb2Ygd2hhdCBiaXRzIGluIFBECkBAIC01NTgsNyArNTg1LDcgQEAKIAogY29uZmlnIEVUUkFYX1BEX0NIQU5HRUFCTEVfQklUUwogCWhleCAiUEQgdXNlciBjaGFuZ2VhYmxlIGJpdHMgbWFzayIKLQlkZXBlbmRzIG9uIEVUUkFYX0dQSU8KKwlkZXBlbmRzIG9uIEVUUkFYX0dQSU8gJiYgRVRSQVhGUwogCWRlZmF1bHQgIjB4MDAwMDAiCiAJaGVscAogCSAgVGhpcyBpcyBhIGJpdG1hc2sgKDE4IGJpdHMpIHdpdGggaW5mb3JtYXRpb24gb2Ygd2hhdCBiaXRzIGluIFBECkBAIC01NjcsNyArNTk0LDcgQEAKIAogY29uZmlnIEVUUkFYX1BFX0NIQU5HRUFCTEVfRElSCiAJaGV4ICJQRSB1c2VyIGNoYW5nZWFibGUgZGlyIG1hc2siCi0JZGVwZW5kcyBvbiBFVFJBWF9HUElPCisJZGVwZW5kcyBvbiBFVFJBWF9HUElPICYmIEVUUkFYRlMKIAlkZWZhdWx0ICIweDAwMDAwIgogCWhlbHAKIAkgIFRoaXMgaXMgYSBiaXRtYXNrICgxOCBiaXRzKSB3aXRoIGluZm9ybWF0aW9uIG9mIHdoYXQgYml0cyBpbiBQRQpAQCAtNTc3LDIwICs2MDQsMzYgQEAKIAogY29uZmlnIEVUUkFYX1BFX0NIQU5HRUFCTEVfQklUUwogCWhleCAiUEUgdXNlciBjaGFuZ2VhYmxlIGJpdHMgbWFzayIKLQlkZXBlbmRzIG9uIEVUUkFYX0dQSU8KKyAJZGVwZW5kcyBvbiBFVFJBWF9HUElPICYmIEVUUkFYRlMKIAlkZWZhdWx0ICIweDAwMDAwIgogCWhlbHAKIAkgIFRoaXMgaXMgYSBiaXRtYXNrICgxOCBiaXRzKSB3aXRoIGluZm9ybWF0aW9uIG9mIHdoYXQgYml0cyBpbiBQRQogCSAgdGhhdCBhIHVzZXIgY2FuIGNoYW5nZSB0aGUgdmFsdWUgb24gdXNpbmcgaW9jdGwncy4KIAkgIEJpdCBzZXQgPSBjaGFuZ2VhYmxlLgogCitjb25maWcgRVRSQVhfUFZfQ0hBTkdFQUJMRV9ESVIKKwloZXggIlBWIHVzZXIgY2hhbmdlYWJsZSBkaXIgbWFzayIKKwlkZXBlbmRzIG9uIEVUUkFYX1ZJUlRVQUxfR1BJTworCWRlZmF1bHQgIjB4MDAwMCIKKwloZWxwCisJICBUaGlzIGlzIGEgYml0bWFzayAoMTYgYml0cykgd2l0aCBpbmZvcm1hdGlvbiBvZiB3aGF0IGJpdHMgaW4gUFYKKwkgIHRoYXQgYSB1c2VyIGNhbiBjaGFuZ2UgZGlyZWN0aW9uIG9uIHVzaW5nIGlvY3RsJ3MuCisJICBCaXQgc2V0ID0gY2hhbmdlYWJsZS4KKwkgIFlvdSBwcm9iYWJseSB3YW50IDB4MDAwMCBoZXJlLCBidXQgaXQgZGVwZW5kcyBvbiB5b3VyIGhhcmR3YXJlLgorCitjb25maWcgRVRSQVhfUFZfQ0hBTkdFQUJMRV9CSVRTCisJaGV4ICJQViB1c2VyIGNoYW5nZWFibGUgYml0cyBtYXNrIgorCWRlcGVuZHMgb24gRVRSQVhfVklSVFVBTF9HUElPCisJZGVmYXVsdCAiMHgwMDAwIgorCWhlbHAKKwkgIFRoaXMgaXMgYSBiaXRtYXNrICgxNiBiaXRzKSB3aXRoIGluZm9ybWF0aW9uIG9mIHdoYXQgYml0cyBpbiBQVgorCSAgdGhhdCBhIHVzZXIgY2FuIGNoYW5nZSB0aGUgdmFsdWUgb24gdXNpbmcgaW9jdGwncy4KKwkgIEJpdCBzZXQgPSBjaGFuZ2VhYmxlLgorCiBjb25maWcgRVRSQVhfQ0FSREJVUwogICAgICAgICBib29sICJDYXJkYnVzIHN1cHBvcnQiCiAgICAgICAgIGRlcGVuZHMgb24gRVRSQVhfQVJDSF9WMzIKLSAgICAgICAgc2VsZWN0IFBDQ0FSRAotICAgICAgICBzZWxlY3QgQ0FSREJVUwogICAgICAgICBzZWxlY3QgSE9UUExVRwotICAgICAgICBzZWxlY3QgUENDQVJEX05PTlNUQVRJQwogICAgICAgICBoZWxwCiAJIEVuYWJsZWQgdGhlIEVUUkFYIENhcmRidXMgZHJpdmVyLgogCkBAIC02MTMsNCArNjU2LDIwMiBAQAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBhIGRyaXZlciBmb3IgdGhlIHN0cmVhbSBjby1wcm9jZXNzb3IKIAkgIGZvciBjcnlwdG9ncmFwaGljIG9wZXJhdGlvbnMuCiAKK3NvdXJjZSBkcml2ZXJzL21tYy9LY29uZmlnCisKK2NvbmZpZyBFVFJBWF9NTUNfSU9QCisJdHJpc3RhdGUgIk1NQy9TRCBob3N0IGRyaXZlciB1c2luZyBJTy1wcm9jZXNzb3IiCisJZGVwZW5kcyBvbiBFVFJBWF9BUkNIX1YzMiAmJiBNTUMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBTRC9NTUMgaG9zdCBjb250cm9sbGVyIGludGVyZmFjZS4KKwkgIFRoZSBob3N0IGNvbnRyb2xsZXIgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlIGJ1aWx0IGluCisJICBJTy1Qcm9jZXNzb3IuIE9ubHkgdGhlIFNQVSBpcyB1c2VkIGluIHRoaXMgaW1wbGVtZW50YXRpb24uCisKK2NvbmZpZyBFVFJBWF9TUElfTU1DCisjIE1ha2UgdGhpcyBvbmUgb2Ygc2V2ZXJhbCAiY2hvaWNlcyIgKHBvc3NpYmxlIHNpbXVsdGFuZW91c2x5IGJ1dAorIyBzdWdnZXN0ZWQgdW5pcXVlbHkpIHdoZW4gYW4gSU9QIGRyaXZlciBlbWVyZ2VzIGZvciAicmVhbCIgTU1DL1NECisjIHByb3RvY29sIHN1cHBvcnQuCisJdHJpc3RhdGUKKwlkZXBlbmRzIG9uICFFVFJBWF9NTUNfSU9QCisJZGVmYXVsdCBNTUMKKwlzZWxlY3QgU1BJCisJc2VsZWN0IE1NQ19TUEkKKwlzZWxlY3QgRVRSQVhfU1BJX01NQ19CT0FSRAorCisjIEZvciB0aGUgcGFydHMgdGhhdCBjYW4ndCBiZSBhIG1vZHVsZSAoZHVlIHRvIHJlc3RyaWN0aW9ucyBpbgorIyBmcmFtZXdvcmsgZWxzZXdoZXJlKS4KK2NvbmZpZyBFVFJBWF9TUElfTU1DX0JPQVJECisgICAgICAgYm9vbGVhbgorICAgICAgIGRlZmF1bHQgbgorCisjIFdoaWxlIHRoZSBib2FyZCBpbmZvIGlzIE1NQ19TUEkgb25seSwgdGhlIGRyaXZlcnMgYXJlIHdyaXR0ZW4gdG8gYmUKKyMgaW5kZXBlbmRlbnQgb2YgTU1DX1NQSSwgc28gd2UnbGwga2VlcCBTUEkgbm9uLWRlcGVuZGVudCBvbiB0aGUKKyMgTU1DX1NQSSBjb25maWcgY2hvaWNlcyAod2VsbCwgZXhjZXB0IGZvciBhIHNpbmdsZSBkZXBlbmRzLW9uLWxpbmUKKyMgZm9yIHRoZSBib2FyZC1pbmZvIGZpbGUgdW50aWwgYSBzZXBhcmF0ZSBub24tTU1DIFNQSSBib2FyZCBmaWxlCisjIGVtZXJnZXMpLgorIyBGSVhNRTogV2hlbiB0aGF0IGhhcHBlbnMsIHdlJ2xsIG5lZWQgdG8gYmUgYWJsZSB0byBhc2sgZm9yIGFuZAorIyBjb25maWd1cmUgbm9uLU1NQyBTUEkgcG9ydHMgdG9nZXRoZXIgd2l0aCBNTUNfU1BJIHBvcnRzIChpZiBtdWx0aXBsZQorIyBTUEkgcG9ydHMgYXJlIGVuYWJsZWQpLgorCitjb25maWcgU1BJX0VUUkFYX1NTRVIKKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gU1BJX01BU1RFUiAmJiBFVFJBWF9BUkNIX1YzMiAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgU1BJX0JJVEJBTkcKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgdXNpbmcgYW4gc3luY2hyb25vdXMgc2VyaWFsIChzc2VyKSBwb3J0IGFzIGEKKwkgIFNQSSBtYXN0ZXIgY29udHJvbGxlciBvbiBBeGlzIEVUUkFYIEZTIGFuZCBsYXRlci4gIFRoZQorCSAgZHJpdmVyIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZSBhbnkgc3NlciBwb3J0LgorCitjb25maWcgU1BJX0VUUkFYX0dQSU8KKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gU1BJX01BU1RFUiAmJiBFVFJBWF9BUkNIX1YzMiAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgU1BJX0JJVEJBTkcKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgdXNpbmcgR1BJTyBwaW5zIHBvcnQgYXMgYSBTUEkgbWFzdGVyIGNvbnRyb2xsZXIKKwkgIG9uIEF4aXMgRVRSQVggRlMgYW5kIGxhdGVyLiAgVGhlIGRyaXZlciBjYW4gYmUgY29uZmlndXJlZCB0bworCSAgdXNlIGFueSBHUElPIHBpbnMuCisKK2NvbmZpZyBFVFJBWF9TUElfU1NFUjAKKwl0cmlzdGF0ZSAiU1BJIHVzaW5nIHN5bmNocm9ub3VzIHNlcmlhbCBwb3J0IDAgKHNzZXIwKSIKKwlkZXBlbmRzIG9uIEVUUkFYX1NQSV9NTUMKKwlkZWZhdWx0IG0gaWYgTU1DX1NQST1tCisJZGVmYXVsdCB5IGlmIE1NQ19TUEk9eQorCWRlZmF1bHQgeSBpZiBNTUNfU1BJPW4KKwlzZWxlY3QgU1BJX0VUUkFYX1NTRVIKKwloZWxwCisJICBTYXkgWSBmb3IgYW4gTU1DL1NEIHNvY2tldCBjb25uZWN0ZWQgdG8gc3luY2hyb25vdXMgc2VyaWFsIHBvcnQgMCwKKwkgIG9yIGZvciBkZXZpY2VzIHVzaW5nIHRoZSBTUEkgcHJvdG9jb2wgb24gdGhhdCBwb3J0LiAgU2F5IG0gaWYgeW91CisJICB3YW50IHRvIGJ1aWxkIGl0IGFzIGEgbW9kdWxlLCB3aGljaCB3aWxsIGJlIG5hbWVkIHNwaV9jcmlzdjMyX3NzZXIuCisJICAoWW91IG5lZWQgdG8gc2VsZWN0IE1NQyBzZXBhcmF0ZWx5LikKKworY29uZmlnIEVUUkFYX1NQSV9TU0VSMF9ETUEKKwlib29sICJETUEgZm9yIFNQSSBvbiBzc2VyMCBlbmFibGVkIgorCWRlcGVuZHMgb24gRVRSQVhfU1BJX1NTRVIwCisJZGVwZW5kcyBvbiAhRVRSQVhfU0VSSUFMX1BPUlQxX0RNQTRfT1VUICYmICFFVFJBWF9TRVJJQUxfUE9SVDFfRE1BNV9JTgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNheSBZIGlmIHVzaW5nIERNQSAoZG1hNC9kbWE1KSBmb3IgU1BJIG9uIHN5bmNocm9ub3VzIHNlcmlhbCBwb3J0IDAuCisKK2NvbmZpZyBFVFJBWF9TUElfTU1DX0NEX1NTRVIwX1BJTgorCXN0cmluZyAiTU1DL1NEIGNhcmQgZGV0ZWN0IHBpbiBmb3IgU1BJIG9uIHNzZXIwIgorCWRlcGVuZHMgb24gRVRSQVhfU1BJX1NTRVIwICYmIE1NQ19TUEkKKwlkZWZhdWx0ICJwZDExIgorCWhlbHAKKwkgIFRoZSBwaW4gdG8gdXNlIGZvciBTRC9NTUMgY2FyZCBkZXRlY3QuICBUaGlzIHBpbiBzaG91bGQgYmUgcHVsbGVkIHVwCisJICBhbmQgZ3JvdW5kZWQgd2hlbiBhIGNhcmQgaXMgcHJlc2VudC4gIElmIGRlZmluZWQgYXMgIiAiIChzcGFjZSksIG5vCisJICBwaW4gaXMgc2VsZWN0ZWQuICBBIGNhcmQgbXVzdCB0aGVuIGFsd2F5cyBiZSBpbnNlcnRlZCBmb3IgcHJvcGVyCisJICBhY3Rpb24uCisKK2NvbmZpZyBFVFJBWF9TUElfTU1DX1dQX1NTRVIwX1BJTgorCXN0cmluZyAiTU1DL1NEIGNhcmQgd3JpdGUtcHJvdGVjdCBwaW4gZm9yIFNQSSBvbiBzc2VyMCIKKwlkZXBlbmRzIG9uIEVUUkFYX1NQSV9TU0VSMCAmJiBNTUNfU1BJCisJZGVmYXVsdCAicGQxMCIKKwloZWxwCisJICBUaGUgcGluIHRvIHVzZSBmb3IgdGhlIFNEL01NQyB3cml0ZS1wcm90ZWN0IHNpZ25hbCBmb3IgYSBtZW1vcnkKKwkgIGNhcmQuICBJZiBkZWZpbmVkIGFzICIgIiAoc3BhY2UpLCB0aGUgY2FyZCBpcyBjb25zaWRlcmVkIHdyaXRhYmxlLgorCitjb25maWcgRVRSQVhfU1BJX1NTRVIxCisJdHJpc3RhdGUgIlNQSSB1c2luZyBzeW5jaHJvbm91cyBzZXJpYWwgcG9ydCAxIChzc2VyMSkiCisJZGVwZW5kcyBvbiBFVFJBWF9TUElfTU1DCisJZGVmYXVsdCBtIGlmIE1NQ19TUEk9bSAmJiBFVFJBWF9TUElfU1NFUjA9bgorCWRlZmF1bHQgeSBpZiBNTUNfU1BJPXkgJiYgRVRSQVhfU1BJX1NTRVIwPW4KKwlkZWZhdWx0IHkgaWYgTU1DX1NQST1uICYmIEVUUkFYX1NQSV9TU0VSMD1uCisJc2VsZWN0IFNQSV9FVFJBWF9TU0VSCisJaGVscAorCSAgU2F5IFkgZm9yIGFuIE1NQy9TRCBzb2NrZXQgY29ubmVjdGVkIHRvIHN5bmNocm9ub3VzIHNlcmlhbCBwb3J0IDEsCisJICBvciBmb3IgZGV2aWNlcyB1c2luZyB0aGUgU1BJIHByb3RvY29sIG9uIHRoYXQgcG9ydC4gIFNheSBtIGlmIHlvdQorCSAgd2FudCB0byBidWlsZCBpdCBhcyBhIG1vZHVsZSwgd2hpY2ggd2lsbCBiZSBuYW1lZCBzcGlfY3Jpc3YzMl9zc2VyLgorCSAgKFlvdSBuZWVkIHRvIHNlbGVjdCBNTUMgc2VwYXJhdGVseS4pCisKK2NvbmZpZyBFVFJBWF9TUElfU1NFUjFfRE1BCisJYm9vbCAiRE1BIGZvciBTUEkgb24gc3NlcjEgZW5hYmxlZCIKKwlkZXBlbmRzIG9uIEVUUkFYX1NQSV9TU0VSMSAmJiAhRVRSQVhfRVRIRVJORVRfSUZBQ0UxCisJZGVwZW5kcyBvbiAhRVRSQVhfU0VSSUFMX1BPUlQwX0RNQTZfT1VUICYmICFFVFJBWF9TRVJJQUxfUE9SVDBfRE1BN19JTgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNheSBZIGlmIHVzaW5nIERNQSAoZG1hNi9kbWE3KSBmb3IgU1BJIG9uIHN5bmNocm9ub3VzIHNlcmlhbCBwb3J0IDEuCisKK2NvbmZpZyBFVFJBWF9TUElfTU1DX0NEX1NTRVIxX1BJTgorCXN0cmluZyAiTU1DL1NEIGNhcmQgZGV0ZWN0IHBpbiBmb3IgU1BJIG9uIHNzZXIxIgorCWRlcGVuZHMgb24gRVRSQVhfU1BJX1NTRVIxICYmIE1NQ19TUEkKKwlkZWZhdWx0ICJwZDEyIgorCWhlbHAKKwkgIFRoZSBwaW4gdG8gdXNlIGZvciBTRC9NTUMgY2FyZCBkZXRlY3QuICBUaGlzIHBpbiBzaG91bGQgYmUgcHVsbGVkIHVwCisJICBhbmQgZ3JvdW5kZWQgd2hlbiBhIGNhcmQgaXMgcHJlc2VudC4gIElmIGRlZmluZWQgYXMgIiAiIChzcGFjZSksIG5vCisJICBwaW4gaXMgc2VsZWN0ZWQuICBBIGNhcmQgbXVzdCB0aGVuIGFsd2F5cyBiZSBpbnNlcnRlZCBmb3IgcHJvcGVyCisJICBhY3Rpb24uCisKK2NvbmZpZyBFVFJBWF9TUElfTU1DX1dQX1NTRVIxX1BJTgorCXN0cmluZyAiTU1DL1NEIGNhcmQgd3JpdGUtcHJvdGVjdCBwaW4gZm9yIFNQSSBvbiBzc2VyMSIKKwlkZXBlbmRzIG9uIEVUUkFYX1NQSV9TU0VSMSAmJiBNTUNfU1BJCisJZGVmYXVsdCAicGQ5IgorCWhlbHAKKwkgIFRoZSBwaW4gdG8gdXNlIGZvciB0aGUgU0QvTU1DIHdyaXRlLXByb3RlY3Qgc2lnbmFsIGZvciBhIG1lbW9yeQorCSAgY2FyZC4gIElmIGRlZmluZWQgYXMgIiAiIChzcGFjZSksIHRoZSBjYXJkIGlzIGNvbnNpZGVyZWQgd3JpdGFibGUuCisKK2NvbmZpZyBFVFJBWF9TUElfR1BJTworCXRyaXN0YXRlICJCaXRiYW5nZWQgU1BJIHVzaW5nIGdwaW8gcGlucyIKKwlkZXBlbmRzIG9uIEVUUkFYX1NQSV9NTUMKKwlzZWxlY3QgU1BJX0VUUkFYX0dQSU8KKwlkZWZhdWx0IG0gaWYgTU1DX1NQST1tICYmIEVUUkFYX1NQSV9TU0VSMD1uICYmIEVUUkFYX1NQSV9TU0VSMT1uCisJZGVmYXVsdCB5IGlmIE1NQ19TUEk9eSAmJiBFVFJBWF9TUElfU1NFUjA9biAmJiBFVFJBWF9TUElfU1NFUjE9bgorCWRlZmF1bHQgeSBpZiBNTUNfU1BJPW4gJiYgRVRSQVhfU1BJX1NTRVIwPW4gJiYgRVRSQVhfU1BJX1NTRVIxPW4KKwloZWxwCisJICBTYXkgWSBmb3IgYW4gTU1DL1NEIHNvY2tldCBjb25uZWN0ZWQgdG8gZ2VuZXJhbCBJL08gcGlucyAoYnV0IG5vdAorCSAgYSBjb21wbGV0ZSBzeW5jaHJvbm91cyBzZXJpYWwgcG9ydHMpLCBvciBmb3IgZGV2aWNlcyB1c2luZyB0aGUgU1BJCisJICBwcm90b2NvbCBvbiBnZW5lcmFsIEkvTyBwaW5zLiAgU2xvdyBhbmQgc2xvd3MgZG93biB0aGUgc3lzdGVtLgorCSAgU2F5IG0gdG8gYnVpbGQgaXQgYXMgYSBtb2R1bGUsIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHNwaV9jcmlzdjMyX2dwaW8uCisJICAoWW91IG5lZWQgdG8gc2VsZWN0IE1NQyBzZXBhcmF0ZWx5LikKKworIyBUaGUgZGVmYXVsdCBtYXRjaCB0aGF0IG9mIHNzZXIwLCBvbmx5IGJlY2F1c2UgdGhhdCdzIGhvdyBpdCB3YXMgdGVzdGVkLgorY29uZmlnIEVUUkFYX1NQSV9DU19QSU4KKwlzdHJpbmcgIlNQSSBjaGlwIHNlbGVjdCBwaW4iCisJZGVwZW5kcyBvbiBFVFJBWF9TUElfR1BJTworCWRlZmF1bHQgInBjMyIKKwloZWxwCisJICBUaGUgcGluIHRvIHVzZSBmb3IgU1BJIGNoaXAgc2VsZWN0LgorCitjb25maWcgRVRSQVhfU1BJX0NMS19QSU4KKwlzdHJpbmcgIlNQSSBjbG9jayBwaW4iCisJZGVwZW5kcyBvbiBFVFJBWF9TUElfR1BJTworCWRlZmF1bHQgInBjMSIKKwloZWxwCisJICBUaGUgcGluIHRvIHVzZSBmb3IgdGhlIFNQSSBjbG9jay4KKworY29uZmlnIEVUUkFYX1NQSV9EQVRBSU5fUElOCisJc3RyaW5nICJTUEkgTUlTTyAoZGF0YSBpbikgcGluIgorCWRlcGVuZHMgb24gRVRSQVhfU1BJX0dQSU8KKwlkZWZhdWx0ICJwYzE2IgorCWhlbHAKKwkgIFRoZSBwaW4gdG8gdXNlIGZvciBTUEkgZGF0YSBpbiBmcm9tIHRoZSBkZXZpY2UuCisKK2NvbmZpZyBFVFJBWF9TUElfREFUQU9VVF9QSU4KKwlzdHJpbmcgIlNQSSBNT1NJIChkYXRhIG91dCkgcGluIgorCWRlcGVuZHMgb24gRVRSQVhfU1BJX0dQSU8KKwlkZWZhdWx0ICJwYzAiCisJaGVscAorCSAgVGhlIHBpbiB0byB1c2UgZm9yIFNQSSBkYXRhIG91dCB0byB0aGUgZGV2aWNlLgorCitjb25maWcgRVRSQVhfU1BJX01NQ19DRF9HUElPX1BJTgorCXN0cmluZyAiTU1DL1NEIGNhcmQgZGV0ZWN0IHBpbiBmb3IgU1BJIHVzaW5nIGdwaW8gKHNwYWNlIGZvciBub25lKSIKKwlkZXBlbmRzIG9uIEVUUkFYX1NQSV9HUElPICYmIE1NQ19TUEkKKwlkZWZhdWx0ICJwZDExIgorCWhlbHAKKwkgIFRoZSBwaW4gdG8gdXNlIGZvciBTRC9NTUMgY2FyZCBkZXRlY3QuICBUaGlzIHBpbiBzaG91bGQgYmUgcHVsbGVkIHVwCisJICBhbmQgZ3JvdW5kZWQgd2hlbiBhIGNhcmQgaXMgcHJlc2VudC4gIElmIGRlZmluZWQgYXMgIiAiIChzcGFjZSksIG5vCisJICBwaW4gaXMgc2VsZWN0ZWQuICBBIGNhcmQgbXVzdCB0aGVuIGFsd2F5cyBiZSBpbnNlcnRlZCBmb3IgcHJvcGVyCisJICBhY3Rpb24uCisKK2NvbmZpZyBFVFJBWF9TUElfTU1DX1dQX0dQSU9fUElOCisJc3RyaW5nICJNTUMvU0QgY2FyZCB3cml0ZS1wcm90ZWN0IHBpbiBmb3IgU1BJIHVzaW5nIGdwaW8gKHNwYWNlIGZvciBub25lKSIKKwlkZXBlbmRzIG9uIEVUUkFYX1NQSV9HUElPICYmIE1NQ19TUEkKKwlkZWZhdWx0ICJwZDEwIgorCWhlbHAKKwkgIFRoZSBwaW4gdG8gdXNlIGZvciB0aGUgU0QvTU1DIHdyaXRlLXByb3RlY3Qgc2lnbmFsIGZvciBhIG1lbW9yeQorCSAgY2FyZC4gIElmIGRlZmluZWQgYXMgIiAiIChzcGFjZSksIHRoZSBjYXJkIGlzIGNvbnNpZGVyZWQgd3JpdGFibGUuCisKKyMgQXZvaWQgY2hvaWNlcyBjYXVzaW5nIG5vbi13b3JraW5nIGNvbmZpZ3MgYnkgY29uZGl0aW9uYWxpemluZyB0aGUgaW5jbHVzaW9uLgoraWYgRVRSQVhfU1BJX01NQworc291cmNlIGRyaXZlcnMvc3BpL0tjb25maWcKK2VuZGlmCisKIGVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9NYWtlZmlsZSBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL01ha2VmaWxlCmluZGV4IGEzNTljZDIuLmU4YzAyNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL01ha2VmaWxlCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL01ha2VmaWxlCkBAIC00LDEwICs0LDExIEBACiAKIG9iai0kKENPTkZJR19FVFJBWF9TVFJFQU1DT1BST0MpICAgICAgICArPSBjcnlwdG9jb3Aubwogb2JqLSQoQ09ORklHX0VUUkFYX0FYSVNGTEFTSE1BUCkgICAgICAgICs9IGF4aXNmbGFzaG1hcC5vCi1vYmotJChDT05GSUdfRVRSQVhfTkFOREZMQVNIKSAgICAgICAgICAgKz0gbmFuZGZsYXNoLm8KLW9iai0kKENPTkZJR19FVFJBWF9HUElPKSAJICAgICAgICArPSBncGlvLm8KK29iai0kKENPTkZJR19FVFJBWEZTKSAgICAgICAgICAgICAgICAgICArPSBtYWNoLWZzLworb2JqLSQoQ09ORklHX0NSSVNfTUFDSF9BUlRQRUMzKSAgICAgICAgICs9IG1hY2gtYTMvCiBvYmotJChDT05GSUdfRVRSQVhfSU9QX0ZXX0xPQUQpICAgICAgICAgKz0gaW9wX2Z3X2xvYWQubwogb2JqLSQoQ09ORklHX0VUUkFYX1BDRjg1NjMpCQkrPSBwY2Y4NTYzLm8KIG9iai0kKENPTkZJR19FVFJBWF9JMkMpCQkJKz0gaTJjLm8KIG9iai0kKENPTkZJR19FVFJBWF9TWU5DSFJPTk9VU19TRVJJQUwpCSs9IHN5bmNfc2VyaWFsLm8KIG9iai0kKENPTkZJR19QQ0kpCQkJKz0gcGNpLworb2JqLSQoQ09ORklHX0VUUkFYX1NQSV9NTUNfQk9BUkQpCSs9IGJvYXJkX21tY3NwaS5vCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9heGlzZmxhc2htYXAuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2F4aXNmbGFzaG1hcC5jCmluZGV4IGM1ZmY5NWUuLjUxZTFlODUgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2F4aXNmbGFzaG1hcC5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2F4aXNmbGFzaG1hcC5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFBoeXNpY2FsIG1hcHBpbmcgbGF5ZXIgZm9yIE1URCB1c2luZyB0aGUgQXhpcyBwYXJ0aXRpb250YWJsZSBmb3JtYXQKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDcgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgogICoKICAqIFRoaXMgZmlsZSBpcyB1bmRlciB0aGUgR1BMLgogICoKQEAgLTEwLDkgKzEwLDYgQEAKICAqIHRlbGxzIHVzIHdoYXQgb3RoZXIgcGFydGl0aW9ucyB0byBkZWZpbmUuIElmIHRoZXJlIGlzbid0LCB3ZSB1c2UgYSBkZWZhdWx0CiAgKiBwYXJ0aXRpb24gc3BsaXQgZGVmaW5lZCBiZWxvdy4KICAqCi0gKiBDb3B5IG9mIG9zL2x4MjUvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvYXhpc2ZsYXNobWFwLmMgMS41Ci0gKiB3aXRoIG1pbm9yIGNoYW5nZXMuCi0gKgogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTI3LDcgKzI0LDggQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KIAotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9jb25maWdfZGVmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYW1mc19mcy5oPgorCiAjaW5jbHVkZSA8YXNtL2F4aXNmbGFzaG1hcC5oPgogI2luY2x1ZGUgPGFzbS9tbXUuaD4KIApAQCAtMzcsMTYgKzM1LDI0IEBACiAjZGVmaW5lIEZMQVNIX1VOQ0FDSEVEX0FERFIgIEtTRUdfRQogI2RlZmluZSBGTEFTSF9DQUNIRURfQUREUiAgICBLU0VHX0YKIAorI2RlZmluZSBQQUdFU0laRSAoNTEyKQorCiAjaWYgQ09ORklHX0VUUkFYX0ZMQVNIX0JVU1dJRFRIPT0xCiAjZGVmaW5lIGZsYXNoX2RhdGEgX191OAogI2VsaWYgQ09ORklHX0VUUkFYX0ZMQVNIX0JVU1dJRFRIPT0yCiAjZGVmaW5lIGZsYXNoX2RhdGEgX191MTYKICNlbGlmIENPTkZJR19FVFJBWF9GTEFTSF9CVVNXSURUSD09NAotI2RlZmluZSBmbGFzaF9kYXRhIF9fdTE2CisjZGVmaW5lIGZsYXNoX2RhdGEgX191MzIKICNlbmRpZgogCiAvKiBGcm9tIGhlYWQuUyAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcm9tZnNfc3RhcnQsIHJvbWZzX2xlbmd0aCwgcm9tZnNfaW5fZmxhc2g7CitleHRlcm4gdW5zaWduZWQgbG9uZyByb21mc19pbl9mbGFzaDsgLyogMSB3aGVuIHJvbWZzX3N0YXJ0LCBfbGVuZ3RoIGluIGZsYXNoICovCitleHRlcm4gdW5zaWduZWQgbG9uZyByb21mc19zdGFydCwgcm9tZnNfbGVuZ3RoOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbmFuZF9ib290OyAvKiAxIHdoZW4gYm9vdGVkIGZyb20gbmFuZCBmbGFzaCAqLworCitzdHJ1Y3QgcGFydGl0aW9uX25hbWUgeworCWNoYXIgbmFtZVs2XTsKK307CiAKIC8qIFRoZSBtYXN0ZXIgbXRkIGZvciB0aGUgZW50aXJlIGZsYXNoLiAqLwogc3RydWN0IG10ZF9pbmZvKiBheGlzZmxhc2hfbXRkID0gTlVMTDsKQEAgLTExMiwzMiArMTE4LDIwIEBACiAJLm1hcF9wcml2XzEgPSBGTEFTSF9VTkNBQ0hFRF9BRERSICsgTUVNX0NTRTBfU0laRQogfTsKIAotLyogSWYgbm8gcGFydGl0aW9uLXRhYmxlIHdhcyBmb3VuZCwgd2UgdXNlIHRoaXMgZGVmYXVsdC1zZXQuICovCi0jZGVmaW5lIE1BWF9QQVJUSVRJT05TICAgICAgICAgNwotI2RlZmluZSBOVU1fREVGQVVMVF9QQVJUSVRJT05TIDMKKyNkZWZpbmUgTUFYX1BBUlRJVElPTlMJCQk3CisjaWZkZWYgQ09ORklHX0VUUkFYX05BTkRCT09UCisjZGVmaW5lIE5VTV9ERUZBVUxUX1BBUlRJVElPTlMJCTQKKyNkZWZpbmUgREVGQVVMVF9ST09URlNfUEFSVElUSU9OX05PCTIKKyNkZWZpbmUgREVGQVVMVF9NRURJQV9TSVpFICAgICAgICAgICAgICAweDIwMDAwMDAgLyogMzIgbWVncyAqLworI2Vsc2UKKyNkZWZpbmUgTlVNX0RFRkFVTFRfUEFSVElUSU9OUwkJMworI2RlZmluZSBERUZBVUxUX1JPT1RGU19QQVJUSVRJT05fTk8JKC0xKQorI2RlZmluZSBERUZBVUxUX01FRElBX1NJWkUgICAgICAgICAgICAgIDB4ODAwMDAwIC8qIDggbWVncyAqLworI2VuZGlmCiAKLS8qCi0gKiBEZWZhdWx0IGZsYXNoIHNpemUgaXMgMk1CLiBDT05GSUdfRVRSQVhfUFRBQkxFX1NFQ1RPUiBpcyBtb3N0IGxpa2VseSB0aGUKLSAqIHNpemUgb2Ygb25lIGZsYXNoIGJsb2NrIGFuZCAiZmlsZXN5c3RlbSItcGFydGl0aW9uIG5lZWRzIDUgYmxvY2tzIHRvIGJlIGFibGUKLSAqIHRvIHVzZSBKRkZTLgotICovCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gYXhpc19kZWZhdWx0X3BhcnRpdGlvbnNbTlVNX0RFRkFVTFRfUEFSVElUSU9OU10gPSB7Ci0JewotCQkubmFtZSA9ICJib290IGZpcm13YXJlIiwKLQkJLnNpemUgPSBDT05GSUdfRVRSQVhfUFRBQkxFX1NFQ1RPUiwKLQkJLm9mZnNldCA9IDAKLQl9LAotCXsKLQkJLm5hbWUgPSAia2VybmVsIiwKLQkJLnNpemUgPSAweDIwMDAwMCAtICg2ICogQ09ORklHX0VUUkFYX1BUQUJMRV9TRUNUT1IpLAotCQkub2Zmc2V0ID0gQ09ORklHX0VUUkFYX1BUQUJMRV9TRUNUT1IKLQl9LAotCXsKLQkJLm5hbWUgPSAiZmlsZXN5c3RlbSIsCi0JCS5zaXplID0gNSAqIENPTkZJR19FVFJBWF9QVEFCTEVfU0VDVE9SLAotCQkub2Zmc2V0ID0gMHgyMDAwMDAgLSAoNSAqIENPTkZJR19FVFJBWF9QVEFCTEVfU0VDVE9SKQotCX0KLX07CisjaWYgKE1BWF9QQVJUSVRJT05TIDwgTlVNX0RFRkFVTFRfUEFSVElUSU9OUykKKyNlcnJvciBNQVhfUEFSVElUSU9OUyBtdXN0IGJlID49IHRoYW4gTlVNX0RFRkFVTFRfUEFSVElUSU9OUworI2VuZGlmCiAKIC8qIEluaXRpYWxpemUgdGhlIG9uZXMgbm9ybWFsbHkgdXNlZC4gKi8KIHN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBheGlzX3BhcnRpdGlvbnNbTUFYX1BBUlRJVElPTlNdID0gewpAQCAtMTc4LDYgKzE3Miw1NiBAQAogCX0sCiB9OwogCisKKy8qIElmIG5vIHBhcnRpdGlvbi10YWJsZSB3YXMgZm91bmQsIHdlIHVzZSB0aGlzIGRlZmF1bHQtc2V0LgorICogRGVmYXVsdCBmbGFzaCBzaXplIGlzIDhNQiAoTk9SKS4gQ09ORklHX0VUUkFYX1BUQUJMRV9TRUNUT1IgaXMgbW9zdAorICogbGlrZWx5IHRoZSBzaXplIG9mIG9uZSBmbGFzaCBibG9jayBhbmQgImZpbGVzeXN0ZW0iLXBhcnRpdGlvbiBuZWVkcworICogdG8gYmUgPj01IGJsb2NrcyB0byBiZSBhYmxlIHRvIHVzZSBKRkZTLgorICovCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gYXhpc19kZWZhdWx0X3BhcnRpdGlvbnNbTlVNX0RFRkFVTFRfUEFSVElUSU9OU10gPSB7CisJeworCQkubmFtZSA9ICJib290IGZpcm13YXJlIiwKKwkJLnNpemUgPSBDT05GSUdfRVRSQVhfUFRBQkxFX1NFQ1RPUiwKKwkJLm9mZnNldCA9IDAKKwl9LAorCXsKKwkJLm5hbWUgPSAia2VybmVsIiwKKwkJLnNpemUgPSAxMCAqIENPTkZJR19FVFJBWF9QVEFCTEVfU0VDVE9SLAorCQkub2Zmc2V0ID0gQ09ORklHX0VUUkFYX1BUQUJMRV9TRUNUT1IKKwl9LAorI2RlZmluZSBGSUxFU1lTVEVNX1NFQ1RPUiAoMTEgKiBDT05GSUdfRVRSQVhfUFRBQkxFX1NFQ1RPUikKKyNpZmRlZiBDT05GSUdfRVRSQVhfTkFOREJPT1QKKwl7CisJCS5uYW1lID0gInJvb3RmcyIsCisJCS5zaXplID0gMTAgKiBDT05GSUdfRVRSQVhfUFRBQkxFX1NFQ1RPUiwKKwkJLm9mZnNldCA9IEZJTEVTWVNURU1fU0VDVE9SCisJfSwKKyN1bmRlZiBGSUxFU1lTVEVNX1NFQ1RPUgorI2RlZmluZSBGSUxFU1lTVEVNX1NFQ1RPUiAoMjEgKiBDT05GSUdfRVRSQVhfUFRBQkxFX1NFQ1RPUikKKyNlbmRpZgorCXsKKwkJLm5hbWUgPSAicndmcyIsCisJCS5zaXplID0gREVGQVVMVF9NRURJQV9TSVpFIC0gRklMRVNZU1RFTV9TRUNUT1IsCisJCS5vZmZzZXQgPSBGSUxFU1lTVEVNX1NFQ1RPUgorCX0KK307CisKKyNpZmRlZiBDT05GSUdfRVRSQVhfQVhJU0ZMQVNITUFQX01URDBXSE9MRQorLyogTWFpbiBmbGFzaCBkZXZpY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBtYWluX3BhcnRpdGlvbiA9IHsKKwkubmFtZSA9ICJtYWluIiwKKwkuc2l6ZSA9IDAsCisJLm9mZnNldCA9IDAKK307CisjZW5kaWYKKworLyogQXV4aWxsaWFyeSBwYXJ0aXRpb24gaWYgd2UgZmluZCBhbm90aGVyIGZsYXNoICovCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gYXV4X3BhcnRpdGlvbiA9IHsKKwkubmFtZSA9ICJhdXgiLAorCS5zaXplID0gMCwKKwkub2Zmc2V0ID0gMAorfTsKKwogLyoKICAqIFByb2JlIGEgY2hpcCBzZWxlY3QgZm9yIEFNRC1jb21wYXRpYmxlIChKRURFQykgb3IgQ0ZJLWNvbXBhdGlibGUgZmxhc2gKICAqIGNoaXBzIGluIHRoYXQgb3JkZXIgKGJlY2F1c2UgdGhlIGFtZF9mbGFzaC1kcml2ZXIgaXMgZmFzdGVyKS4KQEAgLTE5MSw3ICsyMzUsNyBAQAogCSAgICAgICBtYXBfY3MtPm5hbWUsIG1hcF9jcy0+c2l6ZSwgbWFwX2NzLT5tYXBfcHJpdl8xKTsKIAogI2lmZGVmIENPTkZJR19NVERfQ0ZJCi0JCW10ZF9jcyA9IGRvX21hcF9wcm9iZSgiY2ZpX3Byb2JlIiwgbWFwX2NzKTsKKwltdGRfY3MgPSBkb19tYXBfcHJvYmUoImNmaV9wcm9iZSIsIG1hcF9jcyk7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTVREX0pFREVDUFJPQkUKIAlpZiAoIW10ZF9jcykKQEAgLTIwNCw3ICsyNDgsNyBAQAogLyoKICAqIFByb2JlIGVhY2ggY2hpcCBzZWxlY3QgaW5kaXZpZHVhbGx5IGZvciBmbGFzaCBjaGlwcy4gSWYgdGhlcmUgYXJlIGNoaXBzIG9uCiAgKiBib3RoIGNzZTAgYW5kIGNzZTEsIHRoZSBtdGRfaW5mbyBzdHJ1Y3RzIHdpbGwgYmUgY29uY2F0ZW5hdGVkIHRvIG9uZSBzdHJ1Y3QKLSAqIHNvIHRoYXQgTVREIHBhcnRpdGlvbnMgY2FuIGNyb3NzIGNoaXAgYm91bmRhcmllcy4KKyAqIHNvIHRoYXQgTVREIHBhcnRpdGlvbnMgY2FuIGNyb3NzIGNoaXAgYm91bmRyaWVzLgogICoKICAqIFRoZSBvbmx5IGtub3duIHJlc3RyaWN0aW9uIHRvIGhvdyB5b3UgY2FuIG1vdW50IHlvdXIgY2hpcHMgaXMgdGhhdCBlYWNoCiAgKiBjaGlwIHNlbGVjdCBtdXN0IGhvbGQgc2ltaWxhciBmbGFzaCBjaGlwcy4gQnV0IHlvdSBuZWVkIGV4dGVybmFsIGhhcmR3YXJlCkBAIC0yMTYsOSArMjYwLDggQEAKIHsKIAlzdHJ1Y3QgbXRkX2luZm8gKm10ZF9jc2UwOwogCXN0cnVjdCBtdGRfaW5mbyAqbXRkX2NzZTE7Ci0Jc3RydWN0IG10ZF9pbmZvICptdGRfbmFuZCA9IE5VTEw7CiAJc3RydWN0IG10ZF9pbmZvICptdGRfdG90YWw7Ci0Jc3RydWN0IG10ZF9pbmZvICptdGRzWzNdOworCXN0cnVjdCBtdGRfaW5mbyAqbXRkc1syXTsKIAlpbnQgY291bnQgPSAwOwogCiAJaWYgKChtdGRfY3NlMCA9IHByb2JlX2NzKCZtYXBfY3NlMCkpICE9IE5VTEwpCkBAIC0yMjYsMTIgKzI2OSw3IEBACiAJaWYgKChtdGRfY3NlMSA9IHByb2JlX2NzKCZtYXBfY3NlMSkpICE9IE5VTEwpCiAJCW10ZHNbY291bnQrK10gPSBtdGRfY3NlMTsKIAotI2lmZGVmIENPTkZJR19FVFJBWF9OQU5ERkxBU0gKLQlpZiAoKG10ZF9uYW5kID0gY3Jpc3YzMl9uYW5kX2ZsYXNoX3Byb2JlKCkpICE9IE5VTEwpCi0JCW10ZHNbY291bnQrK10gPSBtdGRfbmFuZDsKLSNlbmRpZgotCi0JaWYgKCFtdGRfY3NlMCAmJiAhbXRkX2NzZTEgJiYgIW10ZF9uYW5kKSB7CisJaWYgKCFtdGRfY3NlMCAmJiAhbXRkX2NzZTEpIHsKIAkJLyogTm8gY2hpcCBmb3VuZC4gKi8KIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMjQ1LDkgKzI4Myw3IEBACiAJCSAqIFNvIHdlIHVzZSB0aGUgTVREIGNvbmNhdGVuYXRpb24gbGF5ZXIgaW5zdGVhZCBvZiBmdXJ0aGVyCiAJCSAqIGNvbXBsaWNhdGluZyB0aGUgcHJvYmluZyBwcm9jZWR1cmUuCiAJCSAqLwotCQltdGRfdG90YWwgPSBtdGRfY29uY2F0X2NyZWF0ZShtdGRzLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNzZTArY3NlMStuYW5kIik7CisJCW10ZF90b3RhbCA9IG10ZF9jb25jYXRfY3JlYXRlKG10ZHMsIGNvdW50LCAiY3NlMCtjc2UxIik7CiAjZWxzZQogCQlwcmludGsoS0VSTl9FUlIgIiVzIGFuZCAlczogQ2Fubm90IGNvbmNhdGVuYXRlIGR1ZSB0byBrZXJuZWwgIgogCQkgICAgICAgIihtaXMpY29uZmlndXJhdGlvbiFcbiIsIG1hcF9jc2UwLm5hbWUsIG1hcF9jc2UxLm5hbWUpOwpAQCAtMjU1LDYxICsyOTEsMTYyIEBACiAjZW5kaWYKIAkJaWYgKCFtdGRfdG90YWwpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXMgYW5kICVzOiBDb25jYXRlbmF0aW9uIGZhaWxlZCFcbiIsCi0JCQkgICAgICAgbWFwX2NzZTAubmFtZSwgbWFwX2NzZTEubmFtZSk7CisJCQkJbWFwX2NzZTAubmFtZSwgbWFwX2NzZTEubmFtZSk7CiAKIAkJCS8qIFRoZSBiZXN0IHdlIGNhbiBkbyBub3cgaXMgdG8gb25seSB1c2Ugd2hhdCB3ZSBmb3VuZAotCQkJICogYXQgY3NlMC4KLQkJCSAqLworCQkJICogYXQgY3NlMC4gKi8KIAkJCW10ZF90b3RhbCA9IG10ZF9jc2UwOwogCQkJbWFwX2Rlc3Ryb3kobXRkX2NzZTEpOwogCQl9Ci0JfSBlbHNlIHsKLQkJbXRkX3RvdGFsID0gbXRkX2NzZTA/IG10ZF9jc2UwIDogbXRkX2NzZTEgPyBtdGRfY3NlMSA6IG10ZF9uYW5kOwotCi0JfQorCX0gZWxzZQorCQltdGRfdG90YWwgPSBtdGRfY3NlMCA/IG10ZF9jc2UwIDogbXRkX2NzZTE7CiAKIAlyZXR1cm4gbXRkX3RvdGFsOwogfQogCi1leHRlcm4gdW5zaWduZWQgbG9uZyBjcmlzdjMyX25hbmRfYm9vdDsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGNyaXN2MzJfbmFuZF9jcmFtZnNfb2Zmc2V0OwotCiAvKgogICogUHJvYmUgdGhlIGZsYXNoIGNoaXAocykgYW5kLCBpZiBpdCBzdWNjZWVkcywgcmVhZCB0aGUgcGFydGl0aW9uLXRhYmxlCiAgKiBhbmQgcmVnaXN0ZXIgdGhlIHBhcnRpdGlvbnMgd2l0aCBNVEQuCiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IGluaXRfYXhpc19mbGFzaCh2b2lkKQogewotCXN0cnVjdCBtdGRfaW5mbyAqbXltdGQ7CisJc3RydWN0IG10ZF9pbmZvICptYWluX210ZDsKKwlzdHJ1Y3QgbXRkX2luZm8gKmF1eF9tdGQgPSBOVUxMOwogCWludCBlcnIgPSAwOwogCWludCBwaWR4ID0gMDsKIAlzdHJ1Y3QgcGFydGl0aW9udGFibGVfaGVhZCAqcHRhYmxlX2hlYWQgPSBOVUxMOwogCXN0cnVjdCBwYXJ0aXRpb250YWJsZV9lbnRyeSAqcHRhYmxlOwotCWludCB1c2VfZGVmYXVsdF9wdGFibGUgPSAxOyAvKiBVbnRpbCBwcm92ZW4gb3RoZXJ3aXNlLiAqLwotCWNvbnN0IGNoYXIgKnBtc2cgPSBLRVJOX0lORk8gIiAgL2Rldi9mbGFzaCVkIGF0IDB4JTA4eCwgc2l6ZSAweCUwOHhcbiI7Ci0Jc3RhdGljIGNoYXIgcGFnZVs1MTJdOworCWludCBwdGFibGVfb2sgPSAwOworCXN0YXRpYyBjaGFyIHBhZ2VbUEFHRVNJWkVdOwogCXNpemVfdCBsZW47CisJaW50IHJhbV9yb290ZnNfcGFydGl0aW9uID0gLTE7IC8qIC0xID0+IG5vIFJBTSByb290ZnMgcGFydGl0aW9uICovCisJaW50IHBhcnQ7CiAKLSNpZm5kZWYgQ09ORklHX0VUUkFYRlNfU0lNCi0JbXltdGQgPSBmbGFzaF9wcm9iZSgpOwotCW15bXRkLT5yZWFkKG15bXRkLCBDT05GSUdfRVRSQVhfUFRBQkxFX1NFQ1RPUiwgNTEyLCAmbGVuLCBwYWdlKTsKLQlwdGFibGVfaGVhZCA9IChzdHJ1Y3QgcGFydGl0aW9udGFibGVfaGVhZCAqKShwYWdlICsgUEFSVElUSU9OX1RBQkxFX09GRlNFVCk7CisJLyogV2UgbmVlZCBhIHJvb3QgZnMuIElmIGl0IHJlc2lkZXMgaW4gUkFNLCB3ZSBuZWVkIHRvIHVzZSBhbgorCSAqIE1URFJBTSBkZXZpY2UsIHNvIGl0IG11c3QgYmUgZW5hYmxlZCBpbiB0aGUga2VybmVsIGNvbmZpZywKKwkgKiBidXQgaXRzIHNpemUgbXVzdCBiZSBjb25maWd1cmVkIGFzIDAgc28gYXMgbm90IHRvIGNvbmZsaWN0CisJICogd2l0aCBvdXIgdXNhZ2UuCisJICovCisjaWYgIWRlZmluZWQoQ09ORklHX01URF9NVERSQU0pIHx8IChDT05GSUdfTVREUkFNX1RPVEFMX1NJWkUgIT0gMCkgfHwgKENPTkZJR19NVERSQU1fQUJTX1BPUyAhPSAwKQorCWlmICghcm9tZnNfaW5fZmxhc2ggJiYgIW5hbmRfYm9vdCkgeworCQlwcmludGsoS0VSTl9FTUVSRyAiYXhpc2ZsYXNobWFwOiBDYW5ub3QgY3JlYXRlIGFuIE1URCBSQU0gIgorCQkgICAgICAgImRldmljZTsgY29uZmlndXJlIENPTkZJR19NVERfTVREUkFNIHdpdGggc2l6ZSA9IDAhXG4iKTsKKwkJcGFuaWMoIlRoaXMga2VybmVsIGNhbm5vdCBib290IGZyb20gUkFNIVxuIik7CisJfQorI2VuZGlmCiAKLQlpZiAoIW15bXRkKSB7CisjaWZuZGVmIENPTkZJR19FVFJBWF9WQ1NfU0lNCisJbWFpbl9tdGQgPSBmbGFzaF9wcm9iZSgpOworCWlmIChtYWluX210ZCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IDB4JTA4eCBieXRlcyBvZiBOT1IgZmxhc2ggbWVtb3J5LlxuIiwKKwkJICAgICAgIG1haW5fbXRkLT5uYW1lLCBtYWluX210ZC0+c2l6ZSk7CisKKyNpZmRlZiBDT05GSUdfRVRSQVhfTkFOREZMQVNICisJYXV4X210ZCA9IGNyaXN2MzJfbmFuZF9mbGFzaF9wcm9iZSgpOworCWlmIChhdXhfbXRkKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogMHglMDh4IGJ5dGVzIG9mIE5BTkQgZmxhc2ggbWVtb3J5LlxuIiwKKwkJCWF1eF9tdGQtPm5hbWUsIGF1eF9tdGQtPnNpemUpOworCisjaWZkZWYgQ09ORklHX0VUUkFYX05BTkRCT09UCisJeworCQlzdHJ1Y3QgbXRkX2luZm8gKnRtcF9tdGQ7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYXhpc2ZsYXNobWFwOiBTZXQgdG8gYm9vdCBmcm9tIE5BTkQgZmxhc2gsICIKKwkJICAgICAgICJtYWtpbmcgTkFORCBmbGFzaCBwcmltYXJ5IGRldmljZS5cbiIpOworCQl0bXBfbXRkID0gbWFpbl9tdGQ7CisJCW1haW5fbXRkID0gYXV4X210ZDsKKwkJYXV4X210ZCA9IHRtcF9tdGQ7CisJfQorI2VuZGlmIC8qIENPTkZJR19FVFJBWF9OQU5EQk9PVCAqLworI2VuZGlmIC8qIENPTkZJR19FVFJBWF9OQU5ERkxBU0ggKi8KKworCWlmICghbWFpbl9tdGQgJiYgIWF1eF9tdGQpIHsKIAkJLyogVGhlcmUncyBubyByZWFzb24gdG8gdXNlIHRoaXMgbW9kdWxlIGlmIG5vIGZsYXNoIGNoaXAgY2FuCiAJCSAqIGJlIGlkZW50aWZpZWQuIE1ha2Ugc3VyZSB0aGF0J3MgdW5kZXJzdG9vZC4KIAkJICovCiAJCXByaW50ayhLRVJOX0lORk8gImF4aXNmbGFzaG1hcDogRm91bmQgbm8gZmxhc2ggY2hpcC5cbiIpOwotCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiAweCUwOHggYnl0ZXMgb2YgZmxhc2ggbWVtb3J5LlxuIiwKLQkJICAgICAgIG15bXRkLT5uYW1lLCBteW10ZC0+c2l6ZSk7Ci0JCWF4aXNmbGFzaF9tdGQgPSBteW10ZDsKIAl9CiAKLQlpZiAobXltdGQpIHsKLQkJbXltdGQtPm93bmVyID0gVEhJU19NT0RVTEU7CisjaWYgMCAvKiBEdW1wIGZsYXNoIG1lbW9yeSBzbyB3ZSBjYW4gc2VlIHdoYXQgaXMgZ29pbmcgb24gKi8KKwlpZiAobWFpbl9tdGQpIHsKKwkJaW50IHNlY3RvcmFkZHIsIGk7CisJCWZvciAoc2VjdG9yYWRkciA9IDA7IHNlY3RvcmFkZHIgPCAyKjY1NTM2KzQwOTY7CisJCQkJc2VjdG9yYWRkciArPSBQQUdFU0laRSkgeworCQkJbWFpbl9tdGQtPnJlYWQobWFpbl9tdGQsIHNlY3RvcmFkZHIsIFBBR0VTSVpFLCAmbGVuLAorCQkJCXBhZ2UpOworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICJTZWN0b3IgYXQgJWQgKGxlbmd0aCAlZCk6XG4iLAorCQkJICAgICAgIHNlY3RvcmFkZHIsIGxlbik7CisJCQlmb3IgKGkgPSAwOyBpIDwgUEFHRVNJWkU7IGkgKz0gMTYpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJICAgICAgICIlMDJ4ICUwMnggJTAyeCAlMDJ4ICIKKwkJCQkgICAgICAgIiUwMnggJTAyeCAlMDJ4ICUwMnggIgorCQkJCSAgICAgICAiJTAyeCAlMDJ4ICUwMnggJTAyeCAiCisJCQkJICAgICAgICIlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJCSAgICAgICBwYWdlW2ldICYgMjU1LCBwYWdlW2krMV0gJiAyNTUsCisJCQkJICAgICAgIHBhZ2VbaSsyXSAmIDI1NSwgcGFnZVtpKzNdICYgMjU1LAorCQkJCSAgICAgICBwYWdlW2krNF0gJiAyNTUsIHBhZ2VbaSs1XSAmIDI1NSwKKwkJCQkgICAgICAgcGFnZVtpKzZdICYgMjU1LCBwYWdlW2krN10gJiAyNTUsCisJCQkJICAgICAgIHBhZ2VbaSs4XSAmIDI1NSwgcGFnZVtpKzldICYgMjU1LAorCQkJCSAgICAgICBwYWdlW2krMTBdICYgMjU1LCBwYWdlW2krMTFdICYgMjU1LAorCQkJCSAgICAgICBwYWdlW2krMTJdICYgMjU1LCBwYWdlW2krMTNdICYgMjU1LAorCQkJCSAgICAgICBwYWdlW2krMTRdICYgMjU1LCBwYWdlW2krMTVdICYgMjU1KTsKKwkJCX0KKwkJfQogCX0KLQlwaWR4Kys7ICAvKiBGaXJzdCBwYXJ0aXRpb24gaXMgYWx3YXlzIHNldCB0byB0aGUgZGVmYXVsdC4gKi8KKyNlbmRpZgorCisJaWYgKG1haW5fbXRkKSB7CisJCW1haW5fbXRkLT5vd25lciA9IFRISVNfTU9EVUxFOworCQlheGlzZmxhc2hfbXRkID0gbWFpbl9tdGQ7CisKKwkJbG9mZl90IHB0YWJsZV9zZWN0b3IgPSBDT05GSUdfRVRSQVhfUFRBQkxFX1NFQ1RPUjsKKworCQkvKiBGaXJzdCBwYXJ0aXRpb24gKHJlc2N1ZSkgaXMgYWx3YXlzIHNldCB0byB0aGUgZGVmYXVsdC4gKi8KKwkJcGlkeCsrOworI2lmZGVmIENPTkZJR19FVFJBWF9OQU5EQk9PVAorCQkvKiBXZSBrbm93IHdoZXJlIHRoZSBwYXJ0aXRpb24gdGFibGUgc2hvdWxkIGJlIGxvY2F0ZWQsCisJCSAqIGl0IHdpbGwgYmUgaW4gZmlyc3QgZ29vZCBibG9jayBhZnRlciB0aGF0LgorCQkgKi8KKwkJaW50IGJsb2Nrc3RhdDsKKwkJZG8geworCQkJYmxvY2tzdGF0ID0gbWFpbl9tdGQtPmJsb2NrX2lzYmFkKG1haW5fbXRkLAorCQkJCXB0YWJsZV9zZWN0b3IpOworCQkJaWYgKGJsb2Nrc3RhdCA8IDApCisJCQkJcHRhYmxlX3NlY3RvciA9IDA7IC8qIHJlYWQgZXJyb3IgKi8KKwkJCWVsc2UgaWYgKGJsb2Nrc3RhdCkKKwkJCQlwdGFibGVfc2VjdG9yICs9IG1haW5fbXRkLT5lcmFzZXNpemU7CisJCX0gd2hpbGUgKGJsb2Nrc3RhdCAmJiBwdGFibGVfc2VjdG9yKTsKKyNlbmRpZgorCQlpZiAocHRhYmxlX3NlY3RvcikgeworCQkJbWFpbl9tdGQtPnJlYWQobWFpbl9tdGQsIHB0YWJsZV9zZWN0b3IsIFBBR0VTSVpFLAorCQkJCSZsZW4sIHBhZ2UpOworCQkJcHRhYmxlX2hlYWQgPSAmKChzdHJ1Y3QgcGFydGl0aW9udGFibGUgKikgcGFnZSktPmhlYWQ7CisJCX0KKworI2lmIDAgLyogRHVtcCBwYXJ0aXRpb24gdGFibGUgc28gd2UgY2FuIHNlZSB3aGF0IGlzIGdvaW5nIG9uICovCisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICJheGlzZmxhc2htYXA6IGZsYXNoIHJlYWQgJWQgYnl0ZXMgYXQgMHglMDh4LCBkYXRhOiAiCisJCSAgICAgICAiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkgICAgICAgbGVuLCBDT05GSUdfRVRSQVhfUFRBQkxFX1NFQ1RPUiwKKwkJICAgICAgIHBhZ2VbMF0gJiAyNTUsIHBhZ2VbMV0gJiAyNTUsCisJCSAgICAgICBwYWdlWzJdICYgMjU1LCBwYWdlWzNdICYgMjU1LAorCQkgICAgICAgcGFnZVs0XSAmIDI1NSwgcGFnZVs1XSAmIDI1NSwKKwkJICAgICAgIHBhZ2VbNl0gJiAyNTUsIHBhZ2VbN10gJiAyNTUpOworCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiYXhpc2ZsYXNobWFwOiBwYXJ0aXRpb24gdGFibGUgb2Zmc2V0ICVkLCBkYXRhOiAiCisJCSAgICAgICAiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkgICAgICAgUEFSVElUSU9OX1RBQkxFX09GRlNFVCwKKwkJICAgICAgIHBhZ2VbUEFSVElUSU9OX1RBQkxFX09GRlNFVCswXSAmIDI1NSwKKwkJICAgICAgIHBhZ2VbUEFSVElUSU9OX1RBQkxFX09GRlNFVCsxXSAmIDI1NSwKKwkJICAgICAgIHBhZ2VbUEFSVElUSU9OX1RBQkxFX09GRlNFVCsyXSAmIDI1NSwKKwkJICAgICAgIHBhZ2VbUEFSVElUSU9OX1RBQkxFX09GRlNFVCszXSAmIDI1NSwKKwkJICAgICAgIHBhZ2VbUEFSVElUSU9OX1RBQkxFX09GRlNFVCs0XSAmIDI1NSwKKwkJICAgICAgIHBhZ2VbUEFSVElUSU9OX1RBQkxFX09GRlNFVCs1XSAmIDI1NSwKKwkJICAgICAgIHBhZ2VbUEFSVElUSU9OX1RBQkxFX09GRlNFVCs2XSAmIDI1NSwKKwkJICAgICAgIHBhZ2VbUEFSVElUSU9OX1RBQkxFX09GRlNFVCs3XSAmIDI1NSk7CisjZW5kaWYKKwl9CiAKIAlpZiAocHRhYmxlX2hlYWQgJiYgKHB0YWJsZV9oZWFkLT5tYWdpYyA9PSBQQVJUSVRJT05fVEFCTEVfTUFHSUMpCiAJICAgICYmIChwdGFibGVfaGVhZC0+c2l6ZSA8CkBAIC0zMjIsNyArNDU5LDYgQEAKIAkJLyogTG9va3MgbGlrZSBhIHN0YXJ0LCBzYW5lIGxlbmd0aCBhbmQgZW5kIG9mIGEKIAkJICogcGFydGl0aW9uIHRhYmxlLCBsZXRzIGNoZWNrIGNzdW0gZXRjLgogCQkgKi8KLQkJaW50IHB0YWJsZV9vayA9IDA7CiAJCXN0cnVjdCBwYXJ0aXRpb250YWJsZV9lbnRyeSAqbWF4X2FkZHIgPQogCQkJKHN0cnVjdCBwYXJ0aXRpb250YWJsZV9lbnRyeSAqKQogCQkJKCh1bnNpZ25lZCBsb25nKXB0YWJsZV9oZWFkICsgc2l6ZW9mKCpwdGFibGVfaGVhZCkgKwpAQCAtMzQ2LDEwNSArNDgyLDE3MSBAQAogCQlwdGFibGVfb2sgPSAoY3N1bSA9PSBwdGFibGVfaGVhZC0+Y2hlY2tzdW0pOwogCiAJCS8qIFJlYWQgdGhlIGVudHJpZXMgYW5kIHVzZS9zaG93IHRoZSBpbmZvLiAgKi8KLQkJcHJpbnRrKEtFUk5fSU5GTyAiIEZvdW5kIGElcyBwYXJ0aXRpb24gdGFibGUgYXQgMHglcC0weCVwLlxuIiwKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYXhpc2ZsYXNobWFwOiAiCisJCSAgICAgICAiRm91bmQgYSVzIHBhcnRpdGlvbiB0YWJsZSBhdCAweCVwLTB4JXAuXG4iLAogCQkgICAgICAgKHB0YWJsZV9vayA/ICIgdmFsaWQiIDogIm4gaW52YWxpZCIpLCBwdGFibGVfaGVhZCwKIAkJICAgICAgIG1heF9hZGRyKTsKIAogCQkvKiBXZSBoYXZlIGZvdW5kIGEgd29ya2luZyBib290YmxvY2suICBOb3cgcmVhZCB0aGUKLQkJICogcGFydGl0aW9uIHRhYmxlLiAgU2NhbiB0aGUgdGFibGUuICBJdCBlbmRzIHdoZW4KLQkJICogdGhlcmUgaXMgMHhmZmZmZmZmZiwgdGhhdCBpcywgZW1wdHkgZmxhc2guCisJCSAqIHBhcnRpdGlvbiB0YWJsZS4gIFNjYW4gdGhlIHRhYmxlLiAgSXQgZW5kcyB3aXRoIDB4ZmZmZmZmZmYuCiAJCSAqLwogCQl3aGlsZSAocHRhYmxlX29rCi0JCSAgICAgICAmJiBwdGFibGUtPm9mZnNldCAhPSAweGZmZmZmZmZmCisJCSAgICAgICAmJiBwdGFibGUtPm9mZnNldCAhPSBQQVJUSVRJT05UQUJMRV9FTkRfTUFSS0VSCiAJCSAgICAgICAmJiBwdGFibGUgPCBtYXhfYWRkcgotCQkgICAgICAgJiYgcGlkeCA8IE1BWF9QQVJUSVRJT05TKSB7CisJCSAgICAgICAmJiBwaWR4IDwgTUFYX1BBUlRJVElPTlMgLSAxKSB7CiAKLQkJCWF4aXNfcGFydGl0aW9uc1twaWR4XS5vZmZzZXQgPSBvZmZzZXQgKyBwdGFibGUtPm9mZnNldCArIChjcmlzdjMyX25hbmRfYm9vdCA/IDE2Mzg0IDogMCk7Ci0JCQlheGlzX3BhcnRpdGlvbnNbcGlkeF0uc2l6ZSA9IHB0YWJsZS0+c2l6ZTsKKwkJCWF4aXNfcGFydGl0aW9uc1twaWR4XS5vZmZzZXQgPSBvZmZzZXQgKyBwdGFibGUtPm9mZnNldDsKKyNpZmRlZiBDT05GSUdfRVRSQVhfTkFOREZMQVNICisJCQlpZiAobWFpbl9tdGQtPnR5cGUgPT0gTVREX05BTkRGTEFTSCkgeworCQkJCWF4aXNfcGFydGl0aW9uc1twaWR4XS5zaXplID0KKwkJCQkJKCgocHRhYmxlKzEpLT5vZmZzZXQgPT0KKwkJCQkJICBQQVJUSVRJT05UQUJMRV9FTkRfTUFSS0VSKSA/CisJCQkJCSAgbWFpbl9tdGQtPnNpemUgOgorCQkJCQkgICgocHRhYmxlKzEpLT5vZmZzZXQgKyBvZmZzZXQpKSAtCisJCQkJCShwdGFibGUtPm9mZnNldCArIG9mZnNldCk7CiAKLQkJCXByaW50ayhwbXNnLCBwaWR4LCBheGlzX3BhcnRpdGlvbnNbcGlkeF0ub2Zmc2V0LAotCQkJICAgICAgIGF4aXNfcGFydGl0aW9uc1twaWR4XS5zaXplKTsKKwkJCX0gZWxzZQorI2VuZGlmIC8qIENPTkZJR19FVFJBWF9OQU5ERkxBU0ggKi8KKwkJCQlheGlzX3BhcnRpdGlvbnNbcGlkeF0uc2l6ZSA9IHB0YWJsZS0+c2l6ZTsKKyNpZmRlZiBDT05GSUdfRVRSQVhfTkFOREJPT1QKKwkJCS8qIFNhdmUgcGFydGl0aW9uIG51bWJlciBvZiBqZmZzMiBybyBwYXJ0aXRpb24uCisJCQkgKiBOZWVkZWQgaWYgUkFNIGJvb3Rpbmcgb3Igcm9vdCBmaWxlIHN5c3RlbSBpbiBSQU0uCisJCQkgKi8KKwkJCWlmICghbmFuZF9ib290ICYmCisJCQkgICAgcmFtX3Jvb3Rmc19wYXJ0aXRpb24gPCAwICYmIC8qIG5vdCBhbHJlYWR5IHNldCAqLworCQkJICAgIHB0YWJsZS0+dHlwZSA9PSBQQVJUSVRJT05fVFlQRV9KRkZTMiAmJgorCQkJICAgIChwdGFibGUtPmZsYWdzICYgUEFSVElUSU9OX0ZMQUdTX1JFQURPTkxZX01BU0spID09CisJCQkJUEFSVElUSU9OX0ZMQUdTX1JFQURPTkxZKQorCQkJCXJhbV9yb290ZnNfcGFydGl0aW9uID0gcGlkeDsKKyNlbmRpZiAvKiBDT05GSUdfRVRSQVhfTkFOREJPT1QgKi8KIAkJCXBpZHgrKzsKIAkJCXB0YWJsZSsrOwogCQl9Ci0JCXVzZV9kZWZhdWx0X3B0YWJsZSA9ICFwdGFibGVfb2s7CiAJfQogCisJLyogRGVjaWRlIHdoZXRoZXIgdG8gdXNlIGRlZmF1bHQgcGFydGl0aW9uIHRhYmxlLiAqLworCS8qIE9ubHkgdXNlIGRlZmF1bHQgdGFibGUgaWYgd2UgYWN0dWFsbHkgaGF2ZSBhIGRldmljZSAobWFpbl9tdGQpICovCisKKwlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydGl0aW9uID0gJmF4aXNfcGFydGl0aW9uc1swXTsKKwlpZiAobWFpbl9tdGQgJiYgIXB0YWJsZV9vaykgeworCQltZW1jcHkoYXhpc19wYXJ0aXRpb25zLCBheGlzX2RlZmF1bHRfcGFydGl0aW9ucywKKwkJICAgICAgIHNpemVvZihheGlzX2RlZmF1bHRfcGFydGl0aW9ucykpOworCQlwaWR4ID0gTlVNX0RFRkFVTFRfUEFSVElUSU9OUzsKKwkJcmFtX3Jvb3Rmc19wYXJ0aXRpb24gPSBERUZBVUxUX1JPT1RGU19QQVJUSVRJT05fTk87CisJfQorCisJLyogQWRkIGFydGlmaWNpYWwgcGFydGl0aW9ucyBmb3Igcm9vdGZzIGlmIG5lY2Vzc2FyeSAqLwogCWlmIChyb21mc19pbl9mbGFzaCkgewotCQkvKiBBZGQgYW4gb3ZlcmxhcHBpbmcgZGV2aWNlIGZvciB0aGUgcm9vdCBwYXJ0aXRpb24gKHJvbWZzKS4gKi8KLQorCQkvKiByb290ZnMgaXMgaW4gZGlyZWN0bHkgYWNjZXNzaWJsZSBmbGFzaCBtZW1vcnkgPSBOT1IgZmxhc2guCisJCSAgIEFkZCBhbiBvdmVybGFwcGluZyBkZXZpY2UgZm9yIHRoZSByb290ZnMgcGFydGl0aW9uLiAqLworCQlwcmludGsoS0VSTl9JTkZPICJheGlzZmxhc2htYXA6IEFkZGluZyBwYXJ0aXRpb24gZm9yICIKKwkJICAgICAgICJvdmVybGFwcGluZyByb290IGZpbGUgc3lzdGVtIGltYWdlXG4iKTsKKwkJYXhpc19wYXJ0aXRpb25zW3BpZHhdLnNpemUgPSByb21mc19sZW5ndGg7CisJCWF4aXNfcGFydGl0aW9uc1twaWR4XS5vZmZzZXQgPSByb21mc19zdGFydCAtIEZMQVNIX0NBQ0hFRF9BRERSOwogCQlheGlzX3BhcnRpdGlvbnNbcGlkeF0ubmFtZSA9ICJyb21mcyI7Ci0JCWlmIChjcmlzdjMyX25hbmRfYm9vdCkgewotCQkJY2hhciogZGF0YSA9IGttYWxsb2MoMTAyNCwgR0ZQX0tFUk5FTCk7Ci0JCQlpbnQgbGVuOwotCQkJaW50IG9mZnNldCA9IGNyaXN2MzJfbmFuZF9jcmFtZnNfb2Zmc2V0ICYgfigxMDI0LTEpOwotCQkJY2hhciogdG1wOwotCi0JCQlteW10ZC0+cmVhZChteW10ZCwgb2Zmc2V0LCAxMDI0LCAmbGVuLCBkYXRhKTsKLQkJCXRtcCA9ICZkYXRhW2NyaXN2MzJfbmFuZF9jcmFtZnNfb2Zmc2V0ICUgNTEyXTsKLQkJCWF4aXNfcGFydGl0aW9uc1twaWR4XS5zaXplID0gKih1bnNpZ25lZCopKHRtcCArIDQpOwotCQkJYXhpc19wYXJ0aXRpb25zW3BpZHhdLm9mZnNldCA9IGNyaXN2MzJfbmFuZF9jcmFtZnNfb2Zmc2V0OwotCQkJa2ZyZWUoZGF0YSk7Ci0JCX0gZWxzZSB7Ci0JCQlheGlzX3BhcnRpdGlvbnNbcGlkeF0uc2l6ZSA9IHJvbWZzX2xlbmd0aDsKLQkJCWF4aXNfcGFydGl0aW9uc1twaWR4XS5vZmZzZXQgPSByb21mc19zdGFydCAtIEZMQVNIX0NBQ0hFRF9BRERSOwotCQl9Ci0KIAkJYXhpc19wYXJ0aXRpb25zW3BpZHhdLm1hc2tfZmxhZ3MgfD0gTVREX1dSSVRFQUJMRTsKLQotCQlwcmludGsoS0VSTl9JTkZPCi0gICAgICAgICAgICAgICAgICAgICAgICIgQWRkaW5nIHJlYWRvbmx5IGZsYXNoIHBhcnRpdGlvbiBmb3Igcm9tZnMgaW1hZ2U6XG4iKTsKLQkJcHJpbnRrKHBtc2csIHBpZHgsIGF4aXNfcGFydGl0aW9uc1twaWR4XS5vZmZzZXQsCi0JCSAgICAgICBheGlzX3BhcnRpdGlvbnNbcGlkeF0uc2l6ZSk7CisJCXJhbV9yb290ZnNfcGFydGl0aW9uID0gLTE7CiAJCXBpZHgrKzsKKwl9IGVsc2UgaWYgKHJvbWZzX2xlbmd0aCAmJiAhbmFuZF9ib290KSB7CisJCS8qIHJvbWZzIGV4aXN0cyBpbiBtZW1vcnksIGJ1dCBub3QgaW4gZmxhc2gsIHNvIG11c3QgYmUgaW4gUkFNLgorCQkgKiBDb25maWd1cmUgYW4gTVREUkFNIHBhcnRpdGlvbi4gKi8KKwkJaWYgKHJhbV9yb290ZnNfcGFydGl0aW9uIDwgMCkgeworCQkJLyogTm9uZSBzZXQgeWV0LCBwdXQgaXQgYXQgdGhlIGVuZCAqLworCQkJcmFtX3Jvb3Rmc19wYXJ0aXRpb24gPSBwaWR4OworCQkJcGlkeCsrOworCQl9CisJCXByaW50ayhLRVJOX0lORk8gImF4aXNmbGFzaG1hcDogQWRkaW5nIHBhcnRpdGlvbiBmb3IgIgorCQkgICAgICAgInJvb3QgZmlsZSBzeXN0ZW0gaW1hZ2UgaW4gUkFNXG4iKTsKKwkJYXhpc19wYXJ0aXRpb25zW3JhbV9yb290ZnNfcGFydGl0aW9uXS5zaXplID0gcm9tZnNfbGVuZ3RoOworCQlheGlzX3BhcnRpdGlvbnNbcmFtX3Jvb3Rmc19wYXJ0aXRpb25dLm9mZnNldCA9IHJvbWZzX3N0YXJ0OworCQlheGlzX3BhcnRpdGlvbnNbcmFtX3Jvb3Rmc19wYXJ0aXRpb25dLm5hbWUgPSAicm9tZnMiOworCQlheGlzX3BhcnRpdGlvbnNbcmFtX3Jvb3Rmc19wYXJ0aXRpb25dLm1hc2tfZmxhZ3MgfD0KKwkJCU1URF9XUklURUFCTEU7CiAJfQogCi0gICAgICAgIGlmIChteW10ZCkgewotCQlpZiAodXNlX2RlZmF1bHRfcHRhYmxlKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIgVXNpbmcgZGVmYXVsdCBwYXJ0aXRpb24gdGFibGUuXG4iKTsKLQkJCWVyciA9IGFkZF9tdGRfcGFydGl0aW9ucyhteW10ZCwgYXhpc19kZWZhdWx0X3BhcnRpdGlvbnMsCi0JCQkJCQkgTlVNX0RFRkFVTFRfUEFSVElUSU9OUyk7CisjaWZkZWYgQ09ORklHX0VUUkFYX0FYSVNGTEFTSE1BUF9NVEQwV0hPTEUKKwlpZiAobWFpbl9tdGQpIHsKKwkJbWFpbl9wYXJ0aXRpb24uc2l6ZSA9IG1haW5fbXRkLT5zaXplOworCQllcnIgPSBhZGRfbXRkX3BhcnRpdGlvbnMobWFpbl9tdGQsICZtYWluX3BhcnRpdGlvbiwgMSk7CisJCWlmIChlcnIpCisJCQlwYW5pYygiYXhpc2ZsYXNobWFwOiBDb3VsZCBub3QgaW5pdGlhbGl6ZSAiCisJCQkgICAgICAicGFydGl0aW9uIGZvciB3aG9sZSBtYWluIG10ZCBkZXZpY2UhXG4iKTsKKwl9CisjZW5kaWYKKworCS8qIE5vdywgcmVnaXN0ZXIgYWxsIHBhcnRpdGlvbnMgd2l0aCBtdGQuCisJICogV2UgZG8gdGhpcyBvbmUgYXQgYSB0aW1lIHNvIHdlIGNhbiBzbGlwIGluIGFuIE1URFJBTSBkZXZpY2UKKwkgKiBpbiB0aGUgcHJvcGVyIHBsYWNlIGlmIHJlcXVpcmVkLiAqLworCisJZm9yIChwYXJ0ID0gMDsgcGFydCA8IHBpZHg7IHBhcnQrKykgeworCQlpZiAocGFydCA9PSByYW1fcm9vdGZzX3BhcnRpdGlvbikgeworCQkJLyogYWRkIE1URFJBTSBwYXJ0aXRpb24gaGVyZSAqLworCQkJc3RydWN0IG10ZF9pbmZvICptdGRfcmFtOworCisJCQltdGRfcmFtID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIW10ZF9yYW0pCisJCQkJcGFuaWMoImF4aXNmbGFzaG1hcDogQ291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5ICIKKwkJCQkgICAgICAiZm9yIG10ZF9pbmZvIVxuIik7CisJCQlwcmludGsoS0VSTl9JTkZPICJheGlzZmxhc2htYXA6IEFkZGluZyBSQU0gcGFydGl0aW9uICIKKwkJCSAgICAgICAiZm9yIHJvb3RmcyBpbWFnZS5cbiIpOworCQkJZXJyID0gbXRkcmFtX2luaXRfZGV2aWNlKG10ZF9yYW0sCisJCQkJCQkgKHZvaWQgKilwYXJ0aXRpb25bcGFydF0ub2Zmc2V0LAorCQkJCQkJIHBhcnRpdGlvbltwYXJ0XS5zaXplLAorCQkJCQkJIHBhcnRpdGlvbltwYXJ0XS5uYW1lKTsKKwkJCWlmIChlcnIpCisJCQkJcGFuaWMoImF4aXNmbGFzaG1hcDogQ291bGQgbm90IGluaXRpYWxpemUgIgorCQkJCSAgICAgICJNVEQgUkFNIGRldmljZSFcbiIpOworCQkJLyogSkZGUzIgbGlrZXMgdG8gaGF2ZSBhbiBlcmFzZXNpemUuIEtlZXAgcG90ZW50aWFsCisJCQkgKiBKRkZTMiByb290ZnMgaGFwcHkgYnkgcHJvdmlkaW5nIG9uZS4gU2luY2UgaW1hZ2UKKwkJCSAqIHdhcyBtb3N0IGxpa2VseSBjcmVhdGVkIGZvciBtYWluIG10ZCwgdXNlIHRoYXQKKwkJCSAqIGVyYXNlc2l6ZSwgaWYgYXZhaWxhYmxlLiBPdGhlcndpc2UsIG1ha2UgYSBndWVzcy4gKi8KKwkJCW10ZF9yYW0tPmVyYXNlc2l6ZSA9IChtYWluX210ZCA/IG1haW5fbXRkLT5lcmFzZXNpemUgOgorCQkJCUNPTkZJR19FVFJBWF9QVEFCTEVfU0VDVE9SKTsKIAkJfSBlbHNlIHsKLQkJCWVyciA9IGFkZF9tdGRfcGFydGl0aW9ucyhteW10ZCwgYXhpc19wYXJ0aXRpb25zLCBwaWR4KTsKLQkJfQotCi0JCWlmIChlcnIpIHsKLQkJCXBhbmljKCJheGlzZmxhc2htYXAgY291bGQgbm90IGFkZCBNVEQgcGFydGl0aW9ucyFcbiIpOworCQkJZXJyID0gYWRkX210ZF9wYXJ0aXRpb25zKG1haW5fbXRkLCAmcGFydGl0aW9uW3BhcnRdLCAxKTsKKwkJCWlmIChlcnIpCisJCQkJcGFuaWMoImF4aXNmbGFzaG1hcDogQ291bGQgbm90IGFkZCBtdGQgIgorCQkJCQkicGFydGl0aW9uICVkXG4iLCBwYXJ0KTsKIAkJfQogCX0KLS8qIENPTkZJR19FWFRSQVhGU19TSU0gKi8KLSNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19FWFRSQVhfVkNTX1NJTSAqLwogCi0JaWYgKCFyb21mc19pbl9mbGFzaCkgewotCQkvKiBDcmVhdGUgYW4gUkFNIGRldmljZSBmb3IgdGhlIHJvb3QgcGFydGl0aW9uIChyb21mcykuICovCisjaWZkZWYgQ09ORklHX0VUUkFYX1ZDU19TSU0KKwkvKiBGb3Igc2ltdWxhdG9yLCBhbHdheXMgdXNlIGEgUkFNIHBhcnRpdGlvbi4KKwkgKiBUaGUgcm9vdGZzIHdpbGwgYmUgZm91bmQgYWZ0ZXIgdGhlIGtlcm5lbCBpbiBSQU0sCisJICogd2l0aCByb21mc19zdGFydCBhbmQgcm9tZnNfZW5kIGluZGljYXRpbmcgbG9jYXRpb24gYW5kIHNpemUuCisJICovCisJc3RydWN0IG10ZF9pbmZvICptdGRfcmFtOwogCi0jaWYgIWRlZmluZWQoQ09ORklHX01URF9NVERSQU0pIHx8IChDT05GSUdfTVREUkFNX1RPVEFMX1NJWkUgIT0gMCkgfHwgKENPTkZJR19NVERSQU1fQUJTX1BPUyAhPSAwKQotCQkvKiBObyB1c2UgdHJ5aW5nIHRvIGJvb3QgdGhpcyBrZXJuZWwgZnJvbSBSQU0uIFBhbmljISAqLwotCQlwcmludGsoS0VSTl9FTUVSRyAiYXhpc2ZsYXNobWFwOiBDYW5ub3QgY3JlYXRlIGFuIE1URCBSQU0gIgotCQkgICAgICAgImRldmljZSBkdWUgdG8ga2VybmVsIChtaXMpY29uZmlndXJhdGlvbiFcbiIpOwotCQlwYW5pYygiVGhpcyBrZXJuZWwgY2Fubm90IGJvb3QgZnJvbSBSQU0hXG4iKTsKLSNlbHNlCi0JCXN0cnVjdCBtdGRfaW5mbyAqbXRkX3JhbTsKLQotCQltdGRfcmFtID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSwKLQkJCQkJCSAgICAgR0ZQX0tFUk5FTCk7Ci0JCWlmICghbXRkX3JhbSkgewotCQkJcGFuaWMoImF4aXNmbGFzaG1hcCBjb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKLQkJCSAgICAgICJtdGRfaW5mbyFcbiIpOwotCQl9Ci0KLQkJcHJpbnRrKEtFUk5fSU5GTyAiIEFkZGluZyBSQU0gcGFydGl0aW9uIGZvciByb21mcyBpbWFnZTpcbiIpOwotCQlwcmludGsocG1zZywgcGlkeCwgcm9tZnNfc3RhcnQsIHJvbWZzX2xlbmd0aCk7Ci0KLQkJZXJyID0gbXRkcmFtX2luaXRfZGV2aWNlKG10ZF9yYW0sICh2b2lkKilyb21mc19zdGFydCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgIHJvbWZzX2xlbmd0aCwgInJvbWZzIik7Ci0JCWlmIChlcnIpIHsKLQkJCXBhbmljKCJheGlzZmxhc2htYXAgY291bGQgbm90IGluaXRpYWxpemUgTVREIFJBTSAiCi0JCQkgICAgICAiZGV2aWNlIVxuIik7Ci0JCX0KLSNlbmRpZgorCW10ZF9yYW0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXRkX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW10ZF9yYW0pIHsKKwkJcGFuaWMoImF4aXNmbGFzaG1hcDogQ291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciAiCisJCSAgICAgICJtdGRfaW5mbyFcbiIpOwogCX0KIAorCXByaW50ayhLRVJOX0lORk8gImF4aXNmbGFzaG1hcDogQWRkaW5nIFJBTSBwYXJ0aXRpb24gZm9yIHJvbWZzLCAiCisJICAgICAgICJhdCAldSwgc2l6ZSAldVxuIiwKKwkgICAgICAgKHVuc2lnbmVkKSByb21mc19zdGFydCwgKHVuc2lnbmVkKSByb21mc19sZW5ndGgpOworCisJZXJyID0gbXRkcmFtX2luaXRfZGV2aWNlKG10ZF9yYW0sICh2b2lkICopcm9tZnNfc3RhcnQsCisJCQkJIHJvbWZzX2xlbmd0aCwgInJvbWZzIik7CisJaWYgKGVycikgeworCQlwYW5pYygiYXhpc2ZsYXNobWFwOiBDb3VsZCBub3QgaW5pdGlhbGl6ZSBNVEQgUkFNICIKKwkJICAgICAgImRldmljZSFcbiIpOworCX0KKyNlbmRpZiAvKiBDT05GSUdfRVhUUkFYX1ZDU19TSU0gKi8KKworI2lmbmRlZiBDT05GSUdfRVRSQVhfVkNTX1NJTQorCWlmIChhdXhfbXRkKSB7CisJCWF1eF9wYXJ0aXRpb24uc2l6ZSA9IGF1eF9tdGQtPnNpemU7CisJCWVyciA9IGFkZF9tdGRfcGFydGl0aW9ucyhhdXhfbXRkLCAmYXV4X3BhcnRpdGlvbiwgMSk7CisJCWlmIChlcnIpCisJCQlwYW5pYygiYXhpc2ZsYXNobWFwOiBDb3VsZCBub3QgaW5pdGlhbGl6ZSAiCisJCQkgICAgICAiYXV4IG10ZCBkZXZpY2UhXG4iKTsKKworCX0KKyNlbmRpZiAvKiBDT05GSUdfRVhUUkFYX1ZDU19TSU0gKi8KKwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2NyeXB0b2NvcC5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvY3J5cHRvY29wLmMKaW5kZXggZTg5MTRkNC4uOWZiNTgyMCAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvY3J5cHRvY29wLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvY3J5cHRvY29wLmMKQEAgLTEsOCArMSw3IEBACi0vKiAkSWQ6IGNyeXB0b2NvcC5jLHYgMS4xMyAyMDA1LzA0LzIxIDE3OjI3OjU1IGhlbnJpa2VuIEV4cCAkCi0gKgorLyoKICAqIFN0cmVhbSBjby1wcm9jZXNzb3IgZHJpdmVyIGZvciB0aGUgRVRSQVggRlMKICAqCi0gKiAgICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSAgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgorICogICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDcgIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMjUsMTcgKzI0LDI5IEBACiAjaW5jbHVkZSA8YXNtL3NpZ25hbC5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAotI2luY2x1ZGUgPGFzbS9hcmNoL2RtYS5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9kbWEuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvcmVnX21hcC5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9yZWdfcmR3ci5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9pbnRyX3ZlY3RfZGVmcy5oPgorI2luY2x1ZGUgPGRtYS5oPgorI2luY2x1ZGUgPGh3cmVncy9kbWEuaD4KKyNpbmNsdWRlIDxod3JlZ3MvcmVnX21hcC5oPgorI2luY2x1ZGUgPGh3cmVncy9yZWdfcmR3ci5oPgorI2luY2x1ZGUgPGh3cmVncy9pbnRyX3ZlY3RfZGVmcy5oPgogCi0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL3N0cmNvcC5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9zdHJjb3BfZGVmcy5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2NyeXB0b2NvcC5oPgorI2luY2x1ZGUgPGh3cmVncy9zdHJjb3AuaD4KKyNpbmNsdWRlIDxod3JlZ3Mvc3RyY29wX2RlZnMuaD4KKyNpbmNsdWRlIDxjcnlwdG9jb3AuaD4KIAotCisjaWZkZWYgQ09ORklHX0VUUkFYRlMKKyNkZWZpbmUgSU5fRE1BIDkKKyNkZWZpbmUgT1VUX0RNQSA4CisjZGVmaW5lIElOX0RNQV9JTlNUIHJlZ2lfZG1hOQorI2RlZmluZSBPVVRfRE1BX0lOU1QgcmVnaV9kbWE4CisjZGVmaW5lIERNQV9JUlEgRE1BOV9JTlRSX1ZFQ1QKKyNlbHNlCisjZGVmaW5lIElOX0RNQSAzCisjZGVmaW5lIE9VVF9ETUEgMgorI2RlZmluZSBJTl9ETUFfSU5TVCByZWdpX2RtYTMKKyNkZWZpbmUgT1VUX0RNQV9JTlNUIHJlZ2lfZG1hMgorI2RlZmluZSBETUFfSVJRIERNQTNfSU5UUl9WRUNUCisjZW5kaWYKIAogI2RlZmluZSBERVNDUl9BTExPQ19QQUQgICgzMSkKIApAQCAtMTg4NiwxNCArMTg5NywxNCBAQAogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QKLWRtYV9kb25lX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK2RtYV9kb25lX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IGNyeXB0b2NvcF9wcmlvX2pvYiAqZG9uZV9qb2I7CiAJcmVnX2RtYV9yd19hY2tfaW50ciBhY2tfaW50ciA9IHsKIAkJLmRhdGEgPSAxLAogCX07CiAKLQlSRUdfV1IgKGRtYSwgcmVnaV9kbWE5LCByd19hY2tfaW50ciwgYWNrX2ludHIpOworCVJFR19XUihkbWEsIElOX0RNQV9JTlNULCByd19hY2tfaW50ciwgYWNrX2ludHIpOwogCiAJREVCVUcocHJpbnRrKCJjcnlwdG9jb3AgRE1BIGRvbmVcbiIpKTsKIApAQCAtMTkzNyw3ICsxOTQ4LDYgQEAKIHN0YXRpYyBpbnQgaW5pdF9jcnlwdG9jb3Aodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nICAgICAgICAgIGZsYWdzOwotCXJlZ19pbnRyX3ZlY3RfcndfbWFzayAgaW50cl9tYXNrOwogCXJlZ19kbWFfcndfY2ZnICAgICAgICAgZG1hX2NmZyA9IHsuZW4gPSAxfTsKIAlyZWdfZG1hX3J3X2ludHJfbWFzayAgIGludHJfbWFza19pbiA9IHsuZGF0YSA9IHJlZ2tfZG1hX3llc307IC8qIE9ubHkgd2FudCBkZXNjcmlwdG9yIGludGVycnVwdHMgZnJvbSB0aGUgRE1BIGluIGNoYW5uZWwuICovCiAJcmVnX2RtYV9yd19hY2tfaW50ciAgICBhY2tfaW50ciA9IHsuZGF0YSA9IDEsLmluX2VvcCA9IDEgfTsKQEAgLTE5NTAsMTAgKzE5NjAsMTQgQEAKIAkJLmVuID0gMQogCX07CiAKLQlpZiAocmVxdWVzdF9pcnEoRE1BOV9JTlRSX1ZFQ1QsIGRtYV9kb25lX2ludGVycnVwdCwgMCwgInN0cmVhbSBjby1wcm9jZXNzb3IgRE1BIiwgTlVMTCkpIHBhbmljKCJyZXF1ZXN0X2lycSBzdHJlYW0gY28tcHJvY2Vzc29yIGlycSBkbWE5Iik7CisJaWYgKHJlcXVlc3RfaXJxKERNQV9JUlEsIGRtYV9kb25lX2ludGVycnVwdCwgMCwKKwkJCSJzdHJlYW0gY28tcHJvY2Vzc29yIERNQSIsIE5VTEwpKQorCQlwYW5pYygicmVxdWVzdF9pcnEgc3RyZWFtIGNvLXByb2Nlc3NvciBpcnEgZG1hOSIpOwogCi0JKHZvaWQpY3Jpc3YzMl9yZXF1ZXN0X2RtYSg4LCAic3RyY29wIiwgRE1BX1BBTklDX09OX0VSUk9SLCAwLCBkbWFfc3RycCk7Ci0JKHZvaWQpY3Jpc3YzMl9yZXF1ZXN0X2RtYSg5LCAic3RyY29wIiwgRE1BX1BBTklDX09OX0VSUk9SLCAwLCBkbWFfc3RycCk7CisJKHZvaWQpY3Jpc3YzMl9yZXF1ZXN0X2RtYShPVVRfRE1BLCAic3RyY29wIiwgRE1BX1BBTklDX09OX0VSUk9SLAorCQkwLCBkbWFfc3RycCk7CisJKHZvaWQpY3Jpc3YzMl9yZXF1ZXN0X2RtYShJTl9ETUEsICJzdHJjb3AiLCBETUFfUEFOSUNfT05fRVJST1IsCisJCTAsIGRtYV9zdHJwKTsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIApAQCAtMTk2MywyNCArMTk3NywxOSBAQAogCXN0cmNvcF9jZmcuZW4gPSAxOwogCVJFR19XUihzdHJjb3AsIHJlZ2lfc3RyY29wLCByd19jZmcsIHN0cmNvcF9jZmcpOwogCi0JLyogRW5hYmxlIERNQTkgaW50ZXJydXB0ICovCi0JaW50cl9tYXNrID0gUkVHX1JEKGludHJfdmVjdCwgcmVnaV9pcnEsIHJ3X21hc2spOwotCWludHJfbWFzay5kbWE5ID0gMTsKLQlSRUdfV1IoaW50cl92ZWN0LCByZWdpX2lycSwgcndfbWFzaywgaW50cl9tYXNrKTsKLQogCS8qIEVuYWJsZSBETUFzLiAqLwotCVJFR19XUihkbWEsIHJlZ2lfZG1hOSwgcndfY2ZnLCBkbWFfY2ZnKTsgLyogaW5wdXQgRE1BICovCi0JUkVHX1dSKGRtYSwgcmVnaV9kbWE4LCByd19jZmcsIGRtYV9jZmcpOyAvKiBvdXRwdXQgRE1BICovCisJUkVHX1dSKGRtYSwgSU5fRE1BX0lOU1QsIHJ3X2NmZywgZG1hX2NmZyk7IC8qIGlucHV0IERNQSAqLworCVJFR19XUihkbWEsIE9VVF9ETUFfSU5TVCwgcndfY2ZnLCBkbWFfY2ZnKTsgLyogb3V0cHV0IERNQSAqLwogCiAJLyogU2V0IHVwIHdvcmRzaXplID0gNCBmb3IgRE1Bcy4gKi8KLQlETUFfV1JfQ01EIChyZWdpX2RtYTgsIHJlZ2tfZG1hX3NldF93X3NpemU0KTsKLQlETUFfV1JfQ01EIChyZWdpX2RtYTksIHJlZ2tfZG1hX3NldF93X3NpemU0KTsKKwlETUFfV1JfQ01EKE9VVF9ETUFfSU5TVCwgcmVna19kbWFfc2V0X3dfc2l6ZTQpOworCURNQV9XUl9DTUQoSU5fRE1BX0lOU1QsIHJlZ2tfZG1hX3NldF93X3NpemU0KTsKIAogCS8qIEVuYWJsZSBpbnRlcnJ1cHRzLiAqLwotCVJFR19XUihkbWEsIHJlZ2lfZG1hOSwgcndfaW50cl9tYXNrLCBpbnRyX21hc2tfaW4pOworCVJFR19XUihkbWEsIElOX0RNQV9JTlNULCByd19pbnRyX21hc2ssIGludHJfbWFza19pbik7CiAKIAkvKiBDbGVhciBpbnRyIGFjay4gKi8KLQlSRUdfV1IoZG1hLCByZWdpX2RtYTksIHJ3X2Fja19pbnRyLCBhY2tfaW50cik7CisJUkVHX1dSKGRtYSwgSU5fRE1BX0lOU1QsIHJ3X2Fja19pbnRyLCBhY2tfaW50cik7CiAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKQEAgLTE5OTEsNyArMjAwMCw2IEBACiBzdGF0aWMgdm9pZCByZWxlYXNlX2NyeXB0b2NvcCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgICAgICAgICAgZmxhZ3M7Ci0JcmVnX2ludHJfdmVjdF9yd19tYXNrICBpbnRyX21hc2s7CiAJcmVnX2RtYV9yd19jZmcgICAgICAgICBkbWFfY2ZnID0gey5lbiA9IDB9OwogCXJlZ19kbWFfcndfaW50cl9tYXNrICAgaW50cl9tYXNrX2luID0gezB9OwogCXJlZ19kbWFfcndfYWNrX2ludHIgICAgYWNrX2ludHIgPSB7LmRhdGEgPSAxLC5pbl9lb3AgPSAxIH07CkBAIC0xOTk5LDI2ICsyMDA3LDIxIEBACiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCiAJLyogQ2xlYXIgaW50ciBhY2suICovCi0JUkVHX1dSKGRtYSwgcmVnaV9kbWE5LCByd19hY2tfaW50ciwgYWNrX2ludHIpOwotCi0JLyogRGlzYWJsZSBETUE5IGludGVycnVwdCAqLwotCWludHJfbWFzayA9IFJFR19SRChpbnRyX3ZlY3QsIHJlZ2lfaXJxLCByd19tYXNrKTsKLQlpbnRyX21hc2suZG1hOSA9IDA7Ci0JUkVHX1dSKGludHJfdmVjdCwgcmVnaV9pcnEsIHJ3X21hc2ssIGludHJfbWFzayk7CisJUkVHX1dSKGRtYSwgSU5fRE1BX0lOU1QsIHJ3X2Fja19pbnRyLCBhY2tfaW50cik7CiAKIAkvKiBEaXNhYmxlIERNQXMuICovCi0JUkVHX1dSKGRtYSwgcmVnaV9kbWE5LCByd19jZmcsIGRtYV9jZmcpOyAvKiBpbnB1dCBETUEgKi8KLQlSRUdfV1IoZG1hLCByZWdpX2RtYTgsIHJ3X2NmZywgZG1hX2NmZyk7IC8qIG91dHB1dCBETUEgKi8KKwlSRUdfV1IoZG1hLCBJTl9ETUFfSU5TVCwgcndfY2ZnLCBkbWFfY2ZnKTsgLyogaW5wdXQgRE1BICovCisJUkVHX1dSKGRtYSwgT1VUX0RNQV9JTlNULCByd19jZmcsIGRtYV9jZmcpOyAvKiBvdXRwdXQgRE1BICovCiAKIAkvKiBEaXNhYmxlIGludGVycnVwdHMuICovCi0JUkVHX1dSKGRtYSwgcmVnaV9kbWE5LCByd19pbnRyX21hc2ssIGludHJfbWFza19pbik7CisJUkVHX1dSKGRtYSwgSU5fRE1BX0lOU1QsIHJ3X2ludHJfbWFzaywgaW50cl9tYXNrX2luKTsKIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAotCWZyZWVfaXJxKERNQTlfSU5UUl9WRUNULCBOVUxMKTsKKwlmcmVlX2lycShETUFfSVJRLCBOVUxMKTsKIAotCSh2b2lkKWNyaXN2MzJfZnJlZV9kbWEoOCk7Ci0JKHZvaWQpY3Jpc3YzMl9mcmVlX2RtYSg5KTsKKwkodm9pZCljcmlzdjMyX2ZyZWVfZG1hKE9VVF9ETUEpOworCSh2b2lkKWNyaXN2MzJfZnJlZV9kbWEoSU5fRE1BKTsKIH0KIAogCkBAIC0yMDc2LDEzICsyMDc5LDEzIEBACiAJCXJlZ19kbWFfcndfY2ZnICAgIGRtYV9vdXRfY2ZnLCBkbWFfaW5fY2ZnOwogCiAJCS8qIFN0b3AgRE1BLiAqLwotCQlkbWFfb3V0X2NmZyA9IFJFR19SRChkbWEsIHJlZ2lfZG1hOCwgcndfY2ZnKTsKKwkJZG1hX291dF9jZmcgPSBSRUdfUkQoZG1hLCBPVVRfRE1BX0lOU1QsIHJ3X2NmZyk7CiAJCWRtYV9vdXRfY2ZnLmVuID0gcmVna19kbWFfbm87Ci0JCVJFR19XUihkbWEsIHJlZ2lfZG1hOCwgcndfY2ZnLCBkbWFfb3V0X2NmZyk7CisJCVJFR19XUihkbWEsIE9VVF9ETUFfSU5TVCwgcndfY2ZnLCBkbWFfb3V0X2NmZyk7CiAKLQkJZG1hX2luX2NmZyA9IFJFR19SRChkbWEsIHJlZ2lfZG1hOSwgcndfY2ZnKTsKKwkJZG1hX2luX2NmZyA9IFJFR19SRChkbWEsIElOX0RNQV9JTlNULCByd19jZmcpOwogCQlkbWFfaW5fY2ZnLmVuID0gcmVna19kbWFfbm87Ci0JCVJFR19XUihkbWEsIHJlZ2lfZG1hOSwgcndfY2ZnLCBkbWFfaW5fY2ZnKTsKKwkJUkVHX1dSKGRtYSwgSU5fRE1BX0lOU1QsIHJ3X2NmZywgZG1hX2luX2NmZyk7CiAKIAkJLyogRGlzYmxlIHRoZSBjcnlwdG9jb3AuICovCiAJCXJ3X2NmZyA9IFJFR19SRChzdHJjb3AsIHJlZ2lfc3RyY29wLCByd19jZmcpOwpAQCAtMjIyNiwxMCArMjIyOSwxMSBAQAogCQkgICAgICZwai0+aW9wLT5jdHhfb3V0LCAoY2hhciopdmlydF90b19waHlzKCZwai0+aW9wLT5jdHhfb3V0KSkpOwogCiAJLyogU3RhcnQgaW5wdXQgRE1BLiAqLwotCURNQV9TVEFSVF9DT05URVhUKHJlZ2lfZG1hOSwgdmlydF90b19waHlzKCZwai0+aW9wLT5jdHhfaW4pKTsKKwlmbHVzaF9kbWFfY29udGV4dCgmcGotPmlvcC0+Y3R4X2luKTsKKwlETUFfU1RBUlRfQ09OVEVYVChJTl9ETUFfSU5TVCwgdmlydF90b19waHlzKCZwai0+aW9wLT5jdHhfaW4pKTsKIAogCS8qIFN0YXJ0IG91dHB1dCBETUEuICovCi0JRE1BX1NUQVJUX0NPTlRFWFQocmVnaV9kbWE4LCB2aXJ0X3RvX3BoeXMoJnBqLT5pb3AtPmN0eF9vdXQpKTsKKwlETUFfU1RBUlRfQ09OVEVYVChPVVRfRE1BX0lOU1QsIHZpcnRfdG9fcGh5cygmcGotPmlvcC0+Y3R4X291dCkpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnVubmluZ19qb2JfbG9jaywgcnVubmluZ19qb2JfZmxhZ3MpOwogCURFQlVHKHByaW50aygiY3J5cHRvY29wX3N0YXJ0X2pvYjogZXhpdGluZ1xuIikpOwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvZ3Bpby5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvZ3Bpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODJjNWM1Li4wMDAwMDAwCi0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2dwaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDc2NSArMCwwIEBACi0vKiAkSWQ6IGdwaW8uYyx2IDEuMTYgMjAwNS8wNi8xOSAxNzowNjo0OSBzdGFydmlrIEV4cCAkCi0gKgotICogRVRSQVggQ1JJU3YzMiBnZW5lcmFsIHBvcnQgSS9PIGRldmljZQotICoKLSAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMyBBeGlzIENvbW11bmljYXRpb25zIEFCCi0gKgotICogQXV0aG9yczogICAgQmpvcm4gV2VzZW4gICAgICAoaW5pdGlhbCB2ZXJzaW9uKQotICogICAgICAgICAgICAgT2xhIEtudXRzc29uICAgICAoTEVEIGhhbmRsaW5nKQotICogICAgICAgICAgICAgSm9oYW4gQWRvbGZzc29uICAocmVhZC9zZXQgZGlyZWN0aW9ucywgd3JpdGUsIHBvcnQgRywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgdG8gRVRSQVggRlMuCi0gKgotICogJExvZzogZ3Bpby5jLHYgJAotICogUmV2aXNpb24gMS4xNiAgMjAwNS8wNi8xOSAxNzowNjo0OSAgc3RhcnZpawotICogTWVyZ2Ugb2YgTGludXggMi42LjEyLgotICoKLSAqIFJldmlzaW9uIDEuMTUgIDIwMDUvMDUvMjUgMDg6MjI6MjAgIHN0YXJ2aWsKLSAqIENoYW5nZWQgR1BJTyBwb3J0IG9yZGVyIHRvIGZpdCBwYWNrYWdlcy9kZXZpY2VzL2F4aXMtMi40LgotICoKLSAqIFJldmlzaW9uIDEuMTQgIDIwMDUvMDQvMjQgMTg6MzU6MDggIHN0YXJ2aWsKLSAqIFVwZGF0ZWQgd2l0aCBmaW5hbCByZWdpc3RlciBoZWFkZXJzLgotICoKLSAqIFJldmlzaW9uIDEuMTMgIDIwMDUvMDMvMTUgMTU6NDM6MDAgIHN0YXJ2aWsKLSAqIGRldl9pZCBuZWVkcyB0byBiZSBzdXBwbGllZCBmb3Igc2hhcmVkIElSUXMuCi0gKgotICogUmV2aXNpb24gMS4xMiAgMjAwNS8wMy8xMCAxNzoxMjowMCAgc3RhcnZpawotICogUHJvdGVjdCBhbGFybSBsaXN0IHdpdGggc3BpbmxvY2suCi0gKgotICogUmV2aXNpb24gMS4xMSAgMjAwNS8wMS8wNSAwNjowODo1OSAgc3RhcnZpawotICogTm8gbmVlZCB0byBkbyBsb2NhbF9pcnFfZGlzYWJsZSBhZnRlciBsb2NhbF9pcnFfc2F2ZS4KLSAqCi0gKiBSZXZpc2lvbiAxLjEwICAyMDA0LzExLzE5IDA4OjM4OjMxICBzdGFydmlrCi0gKiBSZW1vdmVkIG9sZCBjcmFwLgotICoKLSAqIFJldmlzaW9uIDEuOSAgMjAwNC8wNS8xNCAwNzo1ODowMiAgc3RhcnZpawotICogTWVyZ2Ugb2YgY2hhbmdlcyBmcm9tIDIuNAotICoKLSAqIFJldmlzaW9uIDEuOCAgMjAwMy8wOS8xMSAwNzoyOTo1MCAgc3RhcnZpawotICogTWVyZ2Ugb2YgTGludXggMi42LjAtdGVzdDUKLSAqCi0gKiBSZXZpc2lvbiAxLjcgIDIwMDMvMDcvMTAgMTM6MjU6NDYgIHN0YXJ2aWsKLSAqIENvbXBpbGVzIGZvciAyLjUuNzQKLSAqIExpbmRlbnRlZCBldGhlcm5ldC5jCi0gKgotICogUmV2aXNpb24gMS42ICAyMDAzLzA3LzA0IDA4OjI3OjQ2ICBzdGFydmlrCi0gKiBNZXJnZSBvZiBMaW51eCAyLjUuNzQKLSAqCi0gKiBSZXZpc2lvbiAxLjUgIDIwMDMvMDYvMTAgMDg6MjY6MzcgIGpvaGFuYQotICogRXRyYXggLT4gRVRSQVggQ1JJU3YzMgotICoKLSAqIFJldmlzaW9uIDEuNCAgMjAwMy8wNi8wNSAxNDoyMjo0OCAgam9oYW5hCi0gKiBJbml0aWFsaXNlIHNvbWVfYWxhcm1zLgotICoKLSAqIFJldmlzaW9uIDEuMyAgMjAwMy8wNi8wNSAxMDoxNTo0NiAgam9oYW5hCi0gKiBOZXcgSU5UUl9WRUNUIG1hY3Jvcy4KLSAqIEVuYWJsZSBpbnRlcnJ1cHRzIGluIGdsb2JhbCBjb25maWcuCi0gKgotICogUmV2aXNpb24gMS4yICAyMDAzLzA2LzAzIDE1OjUyOjUwICBqb2hhbmEKLSAqIEluaXRpYWwgQ1JJUyB2MzIgdmVyc2lvbi4KLSAqCi0gKiBSZXZpc2lvbiAxLjEgIDIwMDMvMDYvMDMgMDg6NTM6MTUgIGpvaGFuYQotICogQ29weSBvZiBvcy9seDI1L2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL2dwaW8uYyB2ZXJzaW9uIDEuNy4KLSAqCi0gKi8KLQotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLQotI2luY2x1ZGUgPGFzbS9ldHJheGdwaW8uaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvcmVnX21hcC5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9yZWdfcmR3ci5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9naW9fZGVmcy5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9pbnRyX3ZlY3RfZGVmcy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0KLS8qIFRoZSBmb2xsb3dpbmcgZ2lvIHBvcnRzIG9uIEVUUkFYIEZTIGlzIGF2YWlsYWJsZToKLSAqIHBhICA4IGJpdHMsIHN1cHBvcnRzIGludGVycnVwdHMgb2ZmLCBoaSwgbG93LCBzZXQsIHBvc2VkZ2UsIG5lZ2VkZ2UgYW55ZWRnZQotICogcGIgMTggYml0cwotICogcGMgMTggYml0cwotICogcGQgMTggYml0cwotICogcGUgMTggYml0cwotICogZWFjaCBwb3J0IGhhcyBhIHJ3X3B4X2RvdXQsIHJfcHhfZGluIGFuZCByd19weF9vZSByZWdpc3Rlci4KLSAqLwotCi0jZGVmaW5lIEdQSU9fTUFKT1IgMTIwICAvKiBleHBlcmltZW50YWwgTUFKT1IgbnVtYmVyICovCi0KLSNkZWZpbmUgRCh4KQotCi0jaWYgMAotc3RhdGljIGludCBkcF9jbnQ7Ci0jZGVmaW5lIERQKHgpIGRvIHsgZHBfY250Kys7IGlmIChkcF9jbnQgJSAxMDAwID09IDApIHg7IH13aGlsZSgwKQotI2Vsc2UKLSNkZWZpbmUgRFAoeCkKLSNlbmRpZgotCi1zdGF0aWMgY2hhciBncGlvX25hbWVbXSA9ICJldHJheCBncGlvIjsKLQotI2lmIDAKLXN0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCAqZ3Bpb193cTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IGdwaW9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLXN0YXRpYyBzc2l6ZV90IGdwaW9fd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyICogYnVmLCBzaXplX3QgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxvZmZfdCAqb2ZmKTsKLXN0YXRpYyBpbnQgZ3Bpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKLXN0YXRpYyBpbnQgZ3Bpb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZ3Bpb19wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpOwotCi0vKiBwcml2YXRlIGRhdGEgcGVyIG9wZW4oKSBvZiB0aGlzIGRyaXZlciAqLwotCi1zdHJ1Y3QgZ3Bpb19wcml2YXRlIHsKLQlzdHJ1Y3QgZ3Bpb19wcml2YXRlICpuZXh0OwotCS8qIFRoZSBJT19DRkdfV1JJVEVfTU9ERV9WQUxVRSBvbmx5IHN1cHBvcnQgOCBiaXRzOiAqLwotCXVuc2lnbmVkIGNoYXIgY2xrX21hc2s7Ci0JdW5zaWduZWQgY2hhciBkYXRhX21hc2s7Ci0JdW5zaWduZWQgY2hhciB3cml0ZV9tc2I7Ci0JdW5zaWduZWQgY2hhciBwYWQxOwotCS8qIFRoZXNlIGZpZWxkcyBhcmUgZ2VuZXJpYyAqLwotCXVuc2lnbmVkIGxvbmcgaGlnaGFsYXJtLCBsb3dhbGFybTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBhbGFybV93cTsKLQlpbnQgbWlub3I7Ci19OwotCi0vKiBsaW5rZWQgbGlzdCBvZiBhbGFybXMgdG8gY2hlY2sgZm9yICovCi0KLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19wcml2YXRlICphbGFybWxpc3QgPSAwOwotCi1zdGF0aWMgaW50IGdwaW9fc29tZV9hbGFybXMgPSAwOyAvKiBTZXQgaWYgc29tZW9uZSB1c2VzIGFsYXJtICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBncGlvX3BhX2hpZ2hfYWxhcm1zID0gMDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGdwaW9fcGFfbG93X2FsYXJtcyA9IDA7Ci0KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWxhcm1fbG9jayk7Ci0KLSNkZWZpbmUgTlVNX1BPUlRTIChHUElPX01JTk9SX0xBU1QrMSkKLSNkZWZpbmUgR0lPX1JFR19SRF9BRERSKHJlZykgKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcqKSAocmVnaV9naW8gKyBSRUdfUkRfQUREUl9naW9fIyNyZWcgKQotI2RlZmluZSBHSU9fUkVHX1dSX0FERFIocmVnKSAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyopIChyZWdpX2dpbyArIFJFR19SRF9BRERSX2dpb18jI3JlZyApCi11bnNpZ25lZCBsb25nIGxlZF9kdW1teTsKLQotc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmRhdGFfb3V0W05VTV9QT1JUU10gPSB7Ci0JR0lPX1JFR19XUl9BRERSKHJ3X3BhX2RvdXQpLAotCUdJT19SRUdfV1JfQUREUihyd19wYl9kb3V0KSwKLQkmbGVkX2R1bW15LAotCUdJT19SRUdfV1JfQUREUihyd19wY19kb3V0KSwKLQlHSU9fUkVHX1dSX0FERFIocndfcGRfZG91dCksCi0JR0lPX1JFR19XUl9BRERSKHJ3X3BlX2RvdXQpLAotfTsKLQotc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmRhdGFfaW5bTlVNX1BPUlRTXSA9IHsKLQlHSU9fUkVHX1JEX0FERFIocl9wYV9kaW4pLAotCUdJT19SRUdfUkRfQUREUihyX3BiX2RpbiksCi0JJmxlZF9kdW1teSwKLQlHSU9fUkVHX1JEX0FERFIocl9wY19kaW4pLAotCUdJT19SRUdfUkRfQUREUihyX3BkX2RpbiksCi0JR0lPX1JFR19SRF9BRERSKHJfcGVfZGluKSwKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNoYW5nZWFibGVfZGlyW05VTV9QT1JUU10gPSB7Ci0JQ09ORklHX0VUUkFYX1BBX0NIQU5HRUFCTEVfRElSLAotCUNPTkZJR19FVFJBWF9QQl9DSEFOR0VBQkxFX0RJUiwKLQkwLAotCUNPTkZJR19FVFJBWF9QQ19DSEFOR0VBQkxFX0RJUiwKLQlDT05GSUdfRVRSQVhfUERfQ0hBTkdFQUJMRV9ESVIsCi0JQ09ORklHX0VUUkFYX1BFX0NIQU5HRUFCTEVfRElSLAotfTsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2hhbmdlYWJsZV9iaXRzW05VTV9QT1JUU10gPSB7Ci0JQ09ORklHX0VUUkFYX1BBX0NIQU5HRUFCTEVfQklUUywKLQlDT05GSUdfRVRSQVhfUEJfQ0hBTkdFQUJMRV9CSVRTLAotCTAsCi0JQ09ORklHX0VUUkFYX1BDX0NIQU5HRUFCTEVfQklUUywKLQlDT05GSUdfRVRSQVhfUERfQ0hBTkdFQUJMRV9CSVRTLAotCUNPTkZJR19FVFJBWF9QRV9DSEFOR0VBQkxFX0JJVFMsCi19OwotCi1zdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqZGlyX29lW05VTV9QT1JUU10gPSB7Ci0JR0lPX1JFR19XUl9BRERSKHJ3X3BhX29lKSwKLQlHSU9fUkVHX1dSX0FERFIocndfcGJfb2UpLAotCSZsZWRfZHVtbXksCi0JR0lPX1JFR19XUl9BRERSKHJ3X3BjX29lKSwKLQlHSU9fUkVHX1dSX0FERFIocndfcGRfb2UpLAotCUdJT19SRUdfV1JfQUREUihyd19wZV9vZSksCi19OwotCi0KLQotc3RhdGljIHVuc2lnbmVkIGludAotZ3Bpb19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAotCSAgcG9sbF90YWJsZSAqd2FpdCkKLXsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IDA7Ci0Jc3RydWN0IGdwaW9fcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgZ3Bpb19wcml2YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZGF0YTsKLQlwb2xsX3dhaXQoZmlsZSwgJnByaXYtPmFsYXJtX3dxLCB3YWl0KTsKLQlpZiAocHJpdi0+bWlub3IgPT0gR1BJT19NSU5PUl9BKSB7Ci0JCXJlZ19naW9fcndfaW50cl9jZmcgaW50cl9jZmc7Ci0JCXVuc2lnbmVkIGxvbmcgdG1wOwotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJZGF0YSA9IFJFR19UWVBFX0NPTlYodW5zaWduZWQgbG9uZywgcmVnX2dpb19yX3BhX2RpbiwgUkVHX1JEKGdpbywgcmVnaV9naW8sIHJfcGFfZGluKSk7Ci0JCS8qIFBBIGhhcyBzdXBwb3J0IGZvciBpbnRlcnJ1cHQKLQkJICogbGV0cyBhY3RpdmF0ZSBoaWdoIGZvciB0aG9zZSBsb3cgYW5kIHdpdGggaGlnaGFsYXJtIHNldAotCQkgKi8KLQkJaW50cl9jZmcgPSBSRUdfUkQoZ2lvLCByZWdpX2dpbywgcndfaW50cl9jZmcpOwotCi0JCXRtcCA9IH5kYXRhICYgcHJpdi0+aGlnaGFsYXJtICYgMHhGRjsKLSAgICAgICAgICAgICAgICBpZiAodG1wICYgKDEgPDwgMCkpIHsKLQkJCWludHJfY2ZnLnBhMCA9IHJlZ2tfZ2lvX2hpOwotCQl9Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAmICgxIDw8IDEpKSB7Ci0JCQlpbnRyX2NmZy5wYTEgPSByZWdrX2dpb19oaTsKLQkJfQotICAgICAgICAgICAgICAgIGlmICh0bXAgJiAoMSA8PCAyKSkgewotCQkJaW50cl9jZmcucGEyID0gcmVna19naW9faGk7Ci0JCX0KLSAgICAgICAgICAgICAgICBpZiAodG1wICYgKDEgPDwgMykpIHsKLQkJCWludHJfY2ZnLnBhMyA9IHJlZ2tfZ2lvX2hpOwotCQl9Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAmICgxIDw8IDQpKSB7Ci0JCQlpbnRyX2NmZy5wYTQgPSByZWdrX2dpb19oaTsKLQkJfQotICAgICAgICAgICAgICAgIGlmICh0bXAgJiAoMSA8PCA1KSkgewotCQkJaW50cl9jZmcucGE1ID0gcmVna19naW9faGk7Ci0JCX0KLSAgICAgICAgICAgICAgICBpZiAodG1wICYgKDEgPDwgNikpIHsKLQkJCWludHJfY2ZnLnBhNiA9IHJlZ2tfZ2lvX2hpOwotCQl9Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAmICgxIDw8IDcpKSB7Ci0JCQlpbnRyX2NmZy5wYTcgPSByZWdrX2dpb19oaTsKLQkJfQotCQkvKgotCQkgKiBsZXRzIGFjdGl2YXRlIGxvdyBmb3IgdGhvc2UgaGlnaCBhbmQgd2l0aCBsb3dhbGFybSBzZXQKLQkJICovCi0JCXRtcCA9IGRhdGEgJiBwcml2LT5sb3dhbGFybSAmIDB4RkY7Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAmICgxIDw8IDApKSB7Ci0JCQlpbnRyX2NmZy5wYTAgPSByZWdrX2dpb19sbzsKLQkJfQotICAgICAgICAgICAgICAgIGlmICh0bXAgJiAoMSA8PCAxKSkgewotCQkJaW50cl9jZmcucGExID0gcmVna19naW9fbG87Ci0JCX0KLSAgICAgICAgICAgICAgICBpZiAodG1wICYgKDEgPDwgMikpIHsKLQkJCWludHJfY2ZnLnBhMiA9IHJlZ2tfZ2lvX2xvOwotCQl9Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAmICgxIDw8IDMpKSB7Ci0JCQlpbnRyX2NmZy5wYTMgPSByZWdrX2dpb19sbzsKLQkJfQotICAgICAgICAgICAgICAgIGlmICh0bXAgJiAoMSA8PCA0KSkgewotCQkJaW50cl9jZmcucGE0ID0gcmVna19naW9fbG87Ci0JCX0KLSAgICAgICAgICAgICAgICBpZiAodG1wICYgKDEgPDwgNSkpIHsKLQkJCWludHJfY2ZnLnBhNSA9IHJlZ2tfZ2lvX2xvOwotCQl9Ci0gICAgICAgICAgICAgICAgaWYgKHRtcCAmICgxIDw8IDYpKSB7Ci0JCQlpbnRyX2NmZy5wYTYgPSByZWdrX2dpb19sbzsKLQkJfQotICAgICAgICAgICAgICAgIGlmICh0bXAgJiAoMSA8PCA3KSkgewotCQkJaW50cl9jZmcucGE3ID0gcmVna19naW9fbG87Ci0JCX0KLQotCQlSRUdfV1IoZ2lvLCByZWdpX2dpbywgcndfaW50cl9jZmcsIGludHJfY2ZnKTsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCX0gZWxzZSBpZiAocHJpdi0+bWlub3IgPD0gR1BJT19NSU5PUl9FKQotCQlkYXRhID0gKmRhdGFfaW5bcHJpdi0+bWlub3JdOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoKGRhdGEgJiBwcml2LT5oaWdoYWxhcm0pIHx8Ci0JICAgICh+ZGF0YSAmIHByaXYtPmxvd2FsYXJtKSkgewotCQltYXNrID0gUE9MTElOfFBPTExSRE5PUk07Ci0JfQotCi0JRFAocHJpbnRrKCJncGlvX3BvbGwgcmVhZHk6IG1hc2sgMHglMDhYXG4iLCBtYXNrKSk7Ci0JcmV0dXJuIG1hc2s7Ci19Ci0KLWludCBldHJheF9ncGlvX3dha2VfdXBfY2hlY2sodm9pZCkKLXsKLQlzdHJ1Y3QgZ3Bpb19wcml2YXRlICpwcml2ID0gYWxhcm1saXN0OwotCXVuc2lnbmVkIGxvbmcgZGF0YSA9IDA7Ci0gICAgICAgIGludCByZXQgPSAwOwotCXdoaWxlIChwcml2KSB7Ci0JCWRhdGEgPSAqZGF0YV9pbltwcml2LT5taW5vcl07Ci0JCWlmICgoZGF0YSAmIHByaXYtPmhpZ2hhbGFybSkgfHwKLQkJICAgICh+ZGF0YSAmIHByaXYtPmxvd2FsYXJtKSkgewotCQkJRFAocHJpbnRrKCJldHJheF9ncGlvX3dha2VfdXBfY2hlY2sgJWlcbiIscHJpdi0+bWlub3IpKTsKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+YWxhcm1fd3EpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gMTsKLQkJfQotCQlwcml2ID0gcHJpdi0+bmV4dDsKLQl9Ci0gICAgICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdAotZ3Bpb19wb2xsX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWlmIChncGlvX3NvbWVfYWxhcm1zKSB7Ci0JCXJldHVybiBJUlFfUkVUVkFMKGV0cmF4X2dwaW9fd2FrZV91cF9jaGVjaygpKTsKLQl9Ci0gICAgICAgIHJldHVybiBJUlFfTk9ORTsKLX0KLQotc3RhdGljIGlycXJldHVybl90Ci1ncGlvX3BhX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXJlZ19naW9fcndfaW50cl9tYXNrIGludHJfbWFzazsKLQlyZWdfZ2lvX3JfbWFza2VkX2ludHIgbWFza2VkX2ludHI7Ci0JcmVnX2dpb19yd19hY2tfaW50ciBhY2tfaW50cjsKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQl1bnNpZ25lZCBsb25nIHRtcDI7Ci0KLQkvKiBGaW5kIHdoYXQgUEEgaW50ZXJydXB0cyBhcmUgYWN0aXZlICovCi0JbWFza2VkX2ludHIgPSBSRUdfUkQoZ2lvLCByZWdpX2dpbywgcl9tYXNrZWRfaW50cik7Ci0JdG1wID0gUkVHX1RZUEVfQ09OVih1bnNpZ25lZCBsb25nLCByZWdfZ2lvX3JfbWFza2VkX2ludHIsIG1hc2tlZF9pbnRyKTsKLQotCS8qIEZpbmQgdGhvc2UgdGhhdCB3ZSBoYXZlIGVuYWJsZWQgKi8KLQlzcGluX2xvY2soJmFsYXJtX2xvY2spOwotCXRtcCAmPSAoZ3Bpb19wYV9oaWdoX2FsYXJtcyB8IGdwaW9fcGFfbG93X2FsYXJtcyk7Ci0Jc3Bpbl91bmxvY2soJmFsYXJtX2xvY2spOwotCi0JLyogQWNrIHRoZW0gKi8KLQlhY2tfaW50ciA9IFJFR19UWVBFX0NPTlYocmVnX2dpb19yd19hY2tfaW50ciwgdW5zaWduZWQgbG9uZywgdG1wKTsKLQlSRUdfV1IoZ2lvLCByZWdpX2dpbywgcndfYWNrX2ludHIsIGFja19pbnRyKTsKLQotCS8qIERpc2FibGUgdGhvc2UgaW50ZXJydXB0cy4uICovCi0JaW50cl9tYXNrID0gUkVHX1JEKGdpbywgcmVnaV9naW8sIHJ3X2ludHJfbWFzayk7Ci0JdG1wMiA9IFJFR19UWVBFX0NPTlYodW5zaWduZWQgbG9uZywgcmVnX2dpb19yd19pbnRyX21hc2ssIGludHJfbWFzayk7Ci0JdG1wMiAmPSB+dG1wOwotCWludHJfbWFzayA9IFJFR19UWVBFX0NPTlYocmVnX2dpb19yd19pbnRyX21hc2ssIHVuc2lnbmVkIGxvbmcsIHRtcDIpOwotCVJFR19XUihnaW8sIHJlZ2lfZ2lvLCByd19pbnRyX21hc2ssIGludHJfbWFzayk7Ci0KLQlpZiAoZ3Bpb19zb21lX2FsYXJtcykgewotCQlyZXR1cm4gSVJRX1JFVFZBTChldHJheF9ncGlvX3dha2VfdXBfY2hlY2soKSk7Ci0JfQotICAgICAgICByZXR1cm4gSVJRX05PTkU7Ci19Ci0KLQotc3RhdGljIHNzaXplX3QgZ3Bpb193cml0ZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgKiBidWYsIHNpemVfdCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbG9mZl90ICpvZmYpCi17Ci0Jc3RydWN0IGdwaW9fcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgZ3Bpb19wcml2YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGNoYXIgZGF0YSwgY2xrX21hc2ssIGRhdGFfbWFzaywgd3JpdGVfbXNiOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyBzaGFkb3c7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqcG9ydDsKLQlzc2l6ZV90IHJldHZhbCA9IGNvdW50OwotCS8qIE9ubHkgYml0cyAwLTcgbWF5IGJlIHVzZWQgZm9yIHdyaXRlIG9wZXJhdGlvbnMgYnV0IGFsbG93IGFsbAotCSAgIGRldmljZXMgZXhjZXB0IGxlZHMuLi4gKi8KLQlpZiAocHJpdi0+bWlub3IgPT0gR1BJT19NSU5PUl9MRURTKSB7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWYsIGNvdW50KSkgewotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JY2xrX21hc2sgPSBwcml2LT5jbGtfbWFzazsKLQlkYXRhX21hc2sgPSBwcml2LT5kYXRhX21hc2s7Ci0JLyogSXQgbXVzdCBoYXZlIGJlZW4gY29uZmlndXJlZCB1c2luZyB0aGUgSU9fQ0ZHX1dSSVRFX01PREUgKi8KLQkvKiBQZXJoYXBzIGEgYmV0dGVyIGVycm9yIGNvZGU/ICovCi0JaWYgKGNsa19tYXNrID09IDAgfHwgZGF0YV9tYXNrID09IDApIHsKLQkJcmV0dXJuIC1FUEVSTTsKLQl9Ci0Jd3JpdGVfbXNiID0gcHJpdi0+d3JpdGVfbXNiOwotCUQocHJpbnRrKCJncGlvX3dyaXRlOiAlbHUgdG8gZGF0YSAweCUwMlggY2xrIDB4JTAyWCBtc2I6ICVpXG4iLGNvdW50LCBkYXRhX21hc2ssIGNsa19tYXNrLCB3cml0ZV9tc2IpKTsKLQlwb3J0ID0gZGF0YV9vdXRbcHJpdi0+bWlub3JdOwotCi0Jd2hpbGUgKGNvdW50LS0pIHsKLQkJaW50IGk7Ci0JCWRhdGEgPSAqYnVmKys7Ci0JCWlmIChwcml2LT53cml0ZV9tc2IpIHsKLQkJCWZvciAoaSA9IDc7IGkgPj0gMDtpLS0pIHsKLQkJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCQkJc2hhZG93ID0gKnBvcnQ7Ci0JCQkJKnBvcnQgPSBzaGFkb3cgJj0gfmNsa19tYXNrOwotCQkJCWlmIChkYXRhICYgMTw8aSkKLQkJCQkJKnBvcnQgPSBzaGFkb3cgfD0gZGF0YV9tYXNrOwotCQkJCWVsc2UKLQkJCQkJKnBvcnQgPSBzaGFkb3cgJj0gfmRhdGFfbWFzazsKLQkJCS8qIEZvciBGUEdBOiBtaW4gNS4wbnMgKERDQykgYmVmb3JlIENDTEsgaGlnaCAqLwotCQkJCSpwb3J0ID0gc2hhZG93IHw9IGNsa19tYXNrOwotCQkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoaSA9IDA7IGkgPD0gNztpKyspIHsKLQkJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCQkJc2hhZG93ID0gKnBvcnQ7Ci0JCQkJKnBvcnQgPSBzaGFkb3cgJj0gfmNsa19tYXNrOwotCQkJCWlmIChkYXRhICYgMTw8aSkKLQkJCQkJKnBvcnQgPSBzaGFkb3cgfD0gZGF0YV9tYXNrOwotCQkJCWVsc2UKLQkJCQkJKnBvcnQgPSBzaGFkb3cgJj0gfmRhdGFfbWFzazsKLQkJCS8qIEZvciBGUEdBOiBtaW4gNS4wbnMgKERDQykgYmVmb3JlIENDTEsgaGlnaCAqLwotCQkJCSpwb3J0ID0gc2hhZG93IHw9IGNsa19tYXNrOwotCQkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0KLQotc3RhdGljIGludAotZ3Bpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQotewotCXN0cnVjdCBncGlvX3ByaXZhdGUgKnByaXY7Ci0JaW50IHAgPSBpbWlub3IoaW5vZGUpOwotCi0JaWYgKHAgPiBHUElPX01JTk9SX0xBU1QpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcHJpdiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBncGlvX3ByaXZhdGUpLAotCQkJCQkgICAgICBHRlBfS0VSTkVMKTsKLQotCWlmICghcHJpdikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwcml2LT5taW5vciA9IHA7Ci0KLQkvKiBpbml0aWFsaXplIHRoZSBpby9hbGFybSBzdHJ1Y3QgYW5kIGxpbmsgaXQgaW50byBvdXIgYWxhcm1saXN0ICovCi0KLQlwcml2LT5uZXh0ID0gYWxhcm1saXN0OwotCWFsYXJtbGlzdCA9IHByaXY7Ci0JcHJpdi0+Y2xrX21hc2sgPSAwOwotCXByaXYtPmRhdGFfbWFzayA9IDA7Ci0JcHJpdi0+aGlnaGFsYXJtID0gMDsKLQlwcml2LT5sb3dhbGFybSA9IDA7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmcHJpdi0+YWxhcm1fd3EpOwotCi0JZmlscC0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKilwcml2OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWdwaW9fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKLXsKLQlzdHJ1Y3QgZ3Bpb19wcml2YXRlICpwID0gYWxhcm1saXN0OwotCXN0cnVjdCBncGlvX3ByaXZhdGUgKnRvZGVsID0gKHN0cnVjdCBncGlvX3ByaXZhdGUgKilmaWxwLT5wcml2YXRlX2RhdGE7Ci0JLyogbG9jYWwgY29waWVzIHdoaWxlIHVwZGF0aW5nIHRoZW06ICovCi0JdW5zaWduZWQgbG9uZyBhX2hpZ2gsIGFfbG93OwotCXVuc2lnbmVkIGxvbmcgc29tZV9hbGFybXM7Ci0KLQkvKiB1bmxpbmsgZnJvbSBhbGFybWxpc3QgYW5kIGZyZWUgdGhlIHByaXZhdGUgc3RydWN0dXJlICovCi0KLQlpZiAocCA9PSB0b2RlbCkgewotCQlhbGFybWxpc3QgPSB0b2RlbC0+bmV4dDsKLQl9IGVsc2UgewotCQl3aGlsZSAocC0+bmV4dCAhPSB0b2RlbCkKLQkJCXAgPSBwLT5uZXh0OwotCQlwLT5uZXh0ID0gdG9kZWwtPm5leHQ7Ci0JfQotCi0Ja2ZyZWUodG9kZWwpOwotCS8qIENoZWNrIGlmIHRoZXJlIGFyZSBzdGlsbCBhbnkgYWxhcm1zIHNldCAqLwotCXAgPSBhbGFybWxpc3Q7Ci0gICAgICAgIHNvbWVfYWxhcm1zID0gMDsKLQlhX2hpZ2ggPSAwOwotCWFfbG93ID0gMDsKLQl3aGlsZSAocCkgewotCQlpZiAocC0+bWlub3IgPT0gR1BJT19NSU5PUl9BKSB7Ci0JCQlhX2hpZ2ggfD0gcC0+aGlnaGFsYXJtOwotCQkJYV9sb3cgfD0gcC0+bG93YWxhcm07Ci0JCX0KLQotCQlpZiAocC0+aGlnaGFsYXJtIHwgcC0+bG93YWxhcm0pIHsKLQkJCXNvbWVfYWxhcm1zID0gMTsKLQkJfQotCQlwID0gcC0+bmV4dDsKLQl9Ci0KLQlzcGluX2xvY2soJmFsYXJtX2xvY2spOwotCWdwaW9fc29tZV9hbGFybXMgPSBzb21lX2FsYXJtczsKLQlncGlvX3BhX2hpZ2hfYWxhcm1zID0gYV9oaWdoOwotCWdwaW9fcGFfbG93X2FsYXJtcyA9IGFfbG93OwotCXNwaW5fdW5sb2NrKCZhbGFybV9sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBNYWluIGRldmljZSBBUEkuIGlvY3RsJ3MgdG8gcmVhZC9zZXQvY2xlYXIgYml0cywgYXMgd2VsbCBhcyB0bwotICogc2V0IGFsYXJtcyB0byB3YWl0IGZvciB1c2luZyBhIHN1YnNlcXVlbnQgc2VsZWN0KCkuCi0gKi8KLQotdW5zaWduZWQgbG9uZyBpbmxpbmUgc2V0Z2V0X2lucHV0KHN0cnVjdCBncGlvX3ByaXZhdGUgKnByaXYsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCS8qIFNldCBkaXJlY3Rpb24gMD11bmNoYW5nZWQgMT1pbnB1dCwKLQkgKiByZXR1cm4gbWFzayB3aXRoIDE9aW5wdXQKLQkgKi8KLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgZGlyX3NoYWRvdzsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlkaXJfc2hhZG93ID0gKmRpcl9vZVtwcml2LT5taW5vcl07Ci0JZGlyX3NoYWRvdyAmPSB+KGFyZyAmIGNoYW5nZWFibGVfZGlyW3ByaXYtPm1pbm9yXSk7Ci0JKmRpcl9vZVtwcml2LT5taW5vcl0gPSBkaXJfc2hhZG93OwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCWlmIChwcml2LT5taW5vciA9PSBHUElPX01JTk9SX0EpCi0JCWRpcl9zaGFkb3cgXj0gMHhGRjsgICAgLyogT25seSA4IGJpdHMgKi8KLQllbHNlCi0JCWRpcl9zaGFkb3cgXj0gMHgzRkZGRjsgLyogT25seSAxOCBiaXRzICovCi0JcmV0dXJuIGRpcl9zaGFkb3c7Ci0KLX0gLyogc2V0Z2V0X2lucHV0ICovCi0KLXVuc2lnbmVkIGxvbmcgaW5saW5lIHNldGdldF9vdXRwdXQoc3RydWN0IGdwaW9fcHJpdmF0ZSAqcHJpdiwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIGRpcl9zaGFkb3c7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JZGlyX3NoYWRvdyA9ICpkaXJfb2VbcHJpdi0+bWlub3JdOwotCWRpcl9zaGFkb3cgfD0gIChhcmcgJiBjaGFuZ2VhYmxlX2Rpcltwcml2LT5taW5vcl0pOwotCSpkaXJfb2VbcHJpdi0+bWlub3JdID0gZGlyX3NoYWRvdzsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JcmV0dXJuIGRpcl9zaGFkb3c7Ci19IC8qIHNldGdldF9vdXRwdXQgKi8KLQotc3RhdGljIGludAotZ3Bpb19sZWRzX2lvY3RsKHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLQotc3RhdGljIGludAotZ3Bpb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgdmFsOwotCXVuc2lnbmVkIGxvbmcgc2hhZG93OwotCXN0cnVjdCBncGlvX3ByaXZhdGUgKnByaXYgPSAoc3RydWN0IGdwaW9fcHJpdmF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKLQlpZiAoX0lPQ19UWVBFKGNtZCkgIT0gRVRSQVhHUElPX0lPQ1RZUEUpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3dpdGNoIChfSU9DX05SKGNtZCkpIHsKLQljYXNlIElPX1JFQURCSVRTOiAvKiBVc2UgSU9fUkVBRF9JTkJJVFMgYW5kIElPX1JFQURfT1VUQklUUyBpbnN0ZWFkICovCi0JCS8vIHJlYWQgdGhlIHBvcnQKLQkJcmV0dXJuICpkYXRhX2luW3ByaXYtPm1pbm9yXTsKLQkJYnJlYWs7Ci0JY2FzZSBJT19TRVRCSVRTOgotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZyAmIDB4MDQpCi0gICAgICAgICAgICAgICAgICBwcmludGsoIkdQSU8gU0VUIDJcbiIpOwotCQkvLyBzZXQgY2hhbmdlYWJsZSBiaXRzIHdpdGggYSAxIGluIGFyZwotCQlzaGFkb3cgPSAqZGF0YV9vdXRbcHJpdi0+bWlub3JdOwotCQlzaGFkb3cgfD0gIChhcmcgJiBjaGFuZ2VhYmxlX2JpdHNbcHJpdi0+bWlub3JdKTsKLQkJKmRhdGFfb3V0W3ByaXYtPm1pbm9yXSA9IHNoYWRvdzsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQlicmVhazsKLQljYXNlIElPX0NMUkJJVFM6Ci0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLSAgICAgICAgICAgICAgICBpZiAoYXJnICYgMHgwNCkKLSAgICAgICAgICAgICAgICAgIHByaW50aygiR1BJTyBDTFIgMlxuIik7Ci0JCS8vIGNsZWFyIGNoYW5nZWFibGUgYml0cyB3aXRoIGEgMSBpbiBhcmcKLQkJc2hhZG93ID0gKmRhdGFfb3V0W3ByaXYtPm1pbm9yXTsKLQkJc2hhZG93ICY9ICB+KGFyZyAmIGNoYW5nZWFibGVfYml0c1twcml2LT5taW5vcl0pOwotCQkqZGF0YV9vdXRbcHJpdi0+bWlub3JdID0gc2hhZG93OwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCWJyZWFrOwotCWNhc2UgSU9fSElHSEFMQVJNOgotCQkvLyBzZXQgYWxhcm0gd2hlbiBiaXRzIHdpdGggMSBpbiBhcmcgZ28gaGlnaAotCQlwcml2LT5oaWdoYWxhcm0gfD0gYXJnOwotCQlzcGluX2xvY2soJmFsYXJtX2xvY2spOwotCQlncGlvX3NvbWVfYWxhcm1zID0gMTsKLQkJaWYgKHByaXYtPm1pbm9yID09IEdQSU9fTUlOT1JfQSkgewotCQkJZ3Bpb19wYV9oaWdoX2FsYXJtcyB8PSBhcmc7Ci0JCX0KLQkJc3Bpbl91bmxvY2soJmFsYXJtX2xvY2spOwotCQlicmVhazsKLQljYXNlIElPX0xPV0FMQVJNOgotCQkvLyBzZXQgYWxhcm0gd2hlbiBiaXRzIHdpdGggMSBpbiBhcmcgZ28gbG93Ci0JCXByaXYtPmxvd2FsYXJtIHw9IGFyZzsKLQkJc3Bpbl9sb2NrKCZhbGFybV9sb2NrKTsKLQkJZ3Bpb19zb21lX2FsYXJtcyA9IDE7Ci0JCWlmIChwcml2LT5taW5vciA9PSBHUElPX01JTk9SX0EpIHsKLQkJCWdwaW9fcGFfbG93X2FsYXJtcyB8PSBhcmc7Ci0JCX0KLQkJc3Bpbl91bmxvY2soJmFsYXJtX2xvY2spOwotCQlicmVhazsKLQljYXNlIElPX0NMUkFMQVJNOgotCQkvLyBjbGVhciBhbGFybSBmb3IgYml0cyB3aXRoIDEgaW4gYXJnCi0JCXByaXYtPmhpZ2hhbGFybSAmPSB+YXJnOwotCQlwcml2LT5sb3dhbGFybSAgJj0gfmFyZzsKLQkJc3Bpbl9sb2NrKCZhbGFybV9sb2NrKTsKLQkJaWYgKHByaXYtPm1pbm9yID09IEdQSU9fTUlOT1JfQSkgewotCQkJaWYgKGdwaW9fcGFfaGlnaF9hbGFybXMgJiBhcmcgfHwKLQkJCSAgICBncGlvX3BhX2xvd19hbGFybXMgJiBhcmcpIHsKLQkJCQkvKiBNdXN0IHVwZGF0ZSB0aGUgZ3Bpb19wYV8qYWxhcm1zIG1hc2tzICovCi0JCQl9Ci0JCX0KLQkJc3Bpbl91bmxvY2soJmFsYXJtX2xvY2spOwotCQlicmVhazsKLQljYXNlIElPX1JFQURESVI6IC8qIFVzZSBJT19TRVRHRVRfSU5QVVQvT1VUUFVUIGluc3RlYWQhICovCi0JCS8qIFJlYWQgZGlyZWN0aW9uIDA9aW5wdXQgMT1vdXRwdXQgKi8KLQkJcmV0dXJuICpkaXJfb2VbcHJpdi0+bWlub3JdOwotCWNhc2UgSU9fU0VUSU5QVVQ6IC8qIFVzZSBJT19TRVRHRVRfSU5QVVQgaW5zdGVhZCEgKi8KLQkJLyogU2V0IGRpcmVjdGlvbiAwPXVuY2hhbmdlZCAxPWlucHV0LAotCQkgKiByZXR1cm4gbWFzayB3aXRoIDE9aW5wdXQKLQkJICovCi0JCXJldHVybiBzZXRnZXRfaW5wdXQocHJpdiwgYXJnKTsKLQkJYnJlYWs7Ci0JY2FzZSBJT19TRVRPVVRQVVQ6IC8qIFVzZSBJT19TRVRHRVRfT1VUUFVUIGluc3RlYWQhICovCi0JCS8qIFNldCBkaXJlY3Rpb24gMD11bmNoYW5nZWQgMT1vdXRwdXQsCi0JCSAqIHJldHVybiBtYXNrIHdpdGggMT1vdXRwdXQKLQkJICovCi0JCXJldHVybiBzZXRnZXRfb3V0cHV0KHByaXYsIGFyZyk7Ci0KLQljYXNlIElPX0NGR19XUklURV9NT0RFOgotCXsKLQkJdW5zaWduZWQgbG9uZyBkaXJfc2hhZG93OwotCQlkaXJfc2hhZG93ID0gKmRpcl9vZVtwcml2LT5taW5vcl07Ci0KLQkJcHJpdi0+Y2xrX21hc2sgPSBhcmcgJiAweEZGOwotCQlwcml2LT5kYXRhX21hc2sgPSAoYXJnID4+IDgpICYgMHhGRjsKLQkJcHJpdi0+d3JpdGVfbXNiID0gKGFyZyA+PiAxNikgJiAweDAxOwotCQkvKiBDaGVjayBpZiB3ZSdyZSBhbGxvd2VkIHRvIGNoYW5nZSB0aGUgYml0cyBhbmQKLQkJICogdGhlIGRpcmVjdGlvbiBpcyBjb3JyZWN0Ci0JCSAqLwotCQlpZiAoISgocHJpdi0+Y2xrX21hc2sgJiBjaGFuZ2VhYmxlX2JpdHNbcHJpdi0+bWlub3JdKSAmJgotCQkgICAgICAocHJpdi0+ZGF0YV9tYXNrICYgY2hhbmdlYWJsZV9iaXRzW3ByaXYtPm1pbm9yXSkgJiYKLQkJICAgICAgKHByaXYtPmNsa19tYXNrICYgZGlyX3NoYWRvdykgJiYKLQkJICAgICAgKHByaXYtPmRhdGFfbWFzayAmIGRpcl9zaGFkb3cpKSkKLQkJewotCQkJcHJpdi0+Y2xrX21hc2sgPSAwOwotCQkJcHJpdi0+ZGF0YV9tYXNrID0gMDsKLQkJCXJldHVybiAtRVBFUk07Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgSU9fUkVBRF9JTkJJVFM6Ci0JCS8qICphcmcgaXMgcmVzdWx0IG9mIHJlYWRpbmcgdGhlIGlucHV0IHBpbnMgKi8KLQkJdmFsID0gKmRhdGFfaW5bcHJpdi0+bWlub3JdOwotCQlpZiAoY29weV90b191c2VyKCh1bnNpZ25lZCBsb25nKilhcmcsICZ2YWwsIHNpemVvZih2YWwpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKLQkJYnJlYWs7Ci0JY2FzZSBJT19SRUFEX09VVEJJVFM6Ci0JCSAvKiAqYXJnIGlzIHJlc3VsdCBvZiByZWFkaW5nIHRoZSBvdXRwdXQgc2hhZG93ICovCi0JCXZhbCA9ICpkYXRhX291dFtwcml2LT5taW5vcl07Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHVuc2lnbmVkIGxvbmcqKWFyZywgJnZhbCwgc2l6ZW9mKHZhbCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWJyZWFrOwotCWNhc2UgSU9fU0VUR0VUX0lOUFVUOgotCQkvKiBiaXRzIHNldCBpbiAqYXJnIGlzIHNldCB0byBpbnB1dCwKLQkJICogKmFyZyB1cGRhdGVkIHdpdGggY3VycmVudCBpbnB1dCBwaW5zLgotCQkgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWwsICh1bnNpZ25lZCBsb25nKilhcmcsIHNpemVvZih2YWwpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQl2YWwgPSBzZXRnZXRfaW5wdXQocHJpdiwgdmFsKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodW5zaWduZWQgbG9uZyopYXJnLCAmdmFsLCBzaXplb2YodmFsKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JY2FzZSBJT19TRVRHRVRfT1VUUFVUOgotCQkvKiBiaXRzIHNldCBpbiAqYXJnIGlzIHNldCB0byBvdXRwdXQsCi0JCSAqICphcmcgdXBkYXRlZCB3aXRoIGN1cnJlbnQgb3V0cHV0IHBpbnMuCi0JCSAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgKHVuc2lnbmVkIGxvbmcqKWFyZywgc2l6ZW9mKHZhbCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXZhbCA9IHNldGdldF9vdXRwdXQocHJpdiwgdmFsKTsKLQkJaWYgKGNvcHlfdG9fdXNlcigodW5zaWduZWQgbG9uZyopYXJnLCAmdmFsLCBzaXplb2YodmFsKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJaWYgKHByaXYtPm1pbm9yID09IEdQSU9fTUlOT1JfTEVEUykKLQkJCXJldHVybiBncGlvX2xlZHNfaW9jdGwoY21kLCBhcmcpOwotCQllbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9IC8qIHN3aXRjaCAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWdwaW9fbGVkc19pb2N0bCh1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQl1bnNpZ25lZCBjaGFyIGdyZWVuOwotCXVuc2lnbmVkIGNoYXIgcmVkOwotCi0Jc3dpdGNoIChfSU9DX05SKGNtZCkpIHsKLQljYXNlIElPX0xFREFDVElWRV9TRVQ6Ci0JCWdyZWVuID0gKCh1bnNpZ25lZCBjaGFyKSBhcmcpICYgMTsKLQkJcmVkICAgPSAoKCh1bnNpZ25lZCBjaGFyKSBhcmcpID4+IDEpICYgMTsKLQkJTEVEX0FDVElWRV9TRVRfRyhncmVlbik7Ci0JCUxFRF9BQ1RJVkVfU0VUX1IocmVkKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9IC8qIHN3aXRjaCAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ3Bpb19mb3BzID0gewotCS5vd25lciAgICAgICA9IFRISVNfTU9EVUxFLAotCS5wb2xsICAgICAgICA9IGdwaW9fcG9sbCwKLQkuaW9jdGwgICAgICAgPSBncGlvX2lvY3RsLAotCS53cml0ZSAgICAgICA9IGdwaW9fd3JpdGUsCi0JLm9wZW4gICAgICAgID0gZ3Bpb19vcGVuLAotCS5yZWxlYXNlICAgICA9IGdwaW9fcmVsZWFzZSwKLX07Ci0KLQotLyogbWFpbiBkcml2ZXIgaW5pdGlhbGl6YXRpb24gcm91dGluZSwgY2FsbGVkIGZyb20gbWVtLmMgKi8KLQotc3RhdGljIF9faW5pdCBpbnQKLWdwaW9faW5pdCh2b2lkKQotewotCWludCByZXM7Ci0JcmVnX2ludHJfdmVjdF9yd19tYXNrIGludHJfbWFzazsKLQotCS8qIGRvIHRoZSBmb3JtYWxpdGllcyAqLwotCi0JcmVzID0gcmVnaXN0ZXJfY2hyZGV2KEdQSU9fTUFKT1IsIGdwaW9fbmFtZSwgJmdwaW9fZm9wcyk7Ci0JaWYgKHJlcyA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJncGlvOiBjb3VsZG4ndCBnZXQgYSBtYWpvciBudW1iZXIuXG4iKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQkvKiBDbGVhciBhbGwgbGVkcyAqLwotCUxFRF9ORVRXT1JLX1NFVCgwKTsKLQlMRURfQUNUSVZFX1NFVCgwKTsKLQlMRURfRElTS19SRUFEKDApOwotCUxFRF9ESVNLX1dSSVRFKDApOwotCi0JcHJpbnRrKCJFVFJBWCBGUyBHUElPIGRyaXZlciB2Mi41LCAoYykgMjAwMy0yMDA1IEF4aXMgQ29tbXVuaWNhdGlvbnMgQUJcbiIpOwotCS8qIFdlIGNhbGwgZXRyYXhfZ3Bpb193YWtlX3VwX2NoZWNrKCkgZnJvbSB0aW1lciBpbnRlcnJ1cHQgYW5kCi0JICogZnJvbSBjcHVfaWRsZSgpIGluIGtlcm5lbC9wcm9jZXNzLmMKLQkgKiBUaGUgY2hlY2sgaW4gY3B1X2lkbGUoKSByZWR1Y2VzIGxhdGVuY3kgZnJvbSB+MTUgbXMgdG8gfjYgbXMKLQkgKiBpbiBzb21lIHRlc3RzLgotCSAqLwotCWlmIChyZXF1ZXN0X2lycShUSU1FUl9JTlRSX1ZFQ1QsIGdwaW9fcG9sbF90aW1lcl9pbnRlcnJ1cHQsCi0JCQlJUlFGX1NIQVJFRCB8IElSUUZfRElTQUJMRUQsImdwaW8gcG9sbCIsICZhbGFybWxpc3QpKSB7Ci0JCXByaW50aygiZXJyOiB0aW1lcjAgaXJxIGZvciBncGlvXG4iKTsKLQl9Ci0JaWYgKHJlcXVlc3RfaXJxKEdFTl9JT19JTlRSX1ZFQ1QsIGdwaW9fcGFfaW50ZXJydXB0LAotCQkJSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVELCJncGlvIFBBIiwgJmFsYXJtbGlzdCkpIHsKLQkJcHJpbnRrKCJlcnI6IFBBIGlycSBmb3IgZ3Bpb1xuIik7Ci0JfQotCS8qIGVuYWJsZSB0aGUgZ2lvIGFuZCB0aW1lciBpcnEgaW4gZ2xvYmFsIGNvbmZpZyAqLwotCWludHJfbWFzayA9IFJFR19SRChpbnRyX3ZlY3QsIHJlZ2lfaXJxLCByd19tYXNrKTsKLQlpbnRyX21hc2sudGltZXIgPSAxOwotCWludHJfbWFzay5nZW5faW8gPSAxOwotCVJFR19XUihpbnRyX3ZlY3QsIHJlZ2lfaXJxLCByd19tYXNrLCBpbnRyX21hc2spOwotCi0JcmV0dXJuIHJlczsKLX0KLQotLyogdGhpcyBtYWtlcyBzdXJlIHRoYXQgZ3Bpb19pbml0IGlzIGNhbGxlZCBkdXJpbmcga2VybmVsIGJvb3QgKi8KLQotbW9kdWxlX2luaXQoZ3Bpb19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2kyYy5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvaTJjLmMKaW5kZXggZjFlZGQyZS4uYzJmYjdhNSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvaTJjLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvaTJjLmMKQEAgLTE5LDEwICsxOSwxMCBAQAogKiEKICohIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiEKLSohIChDKSBDb3B5cmlnaHQgMTk5OS0yMDAyIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIsIExVTkQsIFNXRURFTgorKiEgKEMpIENvcHlyaWdodCAxOTk5LTIwMDcgQXhpcyBDb21tdW5pY2F0aW9ucyBBQiwgTFVORCwgU1dFREVOCiAqIQogKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAkSWQ6IGkyYy5jLHYgMS4yIDIwMDUvMDUvMDkgMTU6Mjk6NDkgc3RhcnZpayBFeHAgJCAqLworCiAvKioqKioqKioqKioqKioqKioqIElOQ0xVREUgRklMRVMgU0VDVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNzksNiArNzksOCBAQAogCiAjZGVmaW5lIGkyY19kZWxheSh1c2VjcykgdWRlbGF5KHVzZWNzKQogCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGkyY19sb2NrKTsgLyogUHJvdGVjdCBkaXJlY3Rpb25zIGV0YyAqLworCiAvKioqKioqKioqKioqKioqKioqIFZBUklBQkxFIFNFQ1RJT04gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgc3RydWN0IGNyaXN2MzJfaW9waW4gY3Jpc19pMmNfY2xrOwpAQCAtMjUyLDYgKzI1NCw3IEBACiAJICogZ2VuZXJhdGUgQUNLIGNsb2NrIHB1bHNlCiAJICovCiAJaTJjX2NsayhJMkNfQ0xPQ0tfSElHSCk7CisjaWYgMAogCS8qCiAJICogVXNlIFBPUlQgUEIgaW5zdGVhZCBvZiBJMkMKIAkgKiBmb3IgaW5wdXQuIChJMkMgbm90IHdvcmtpbmcpCkBAIC0yNjQsNiArMjY3LDggQEAKIAlpMmNfZGF0YSgxKTsKIAlpMmNfZGlzYWJsZSgpOwogCWkyY19kaXJfaW4oKTsKKyNlbmRpZgorCiAJLyoKIAkgKiBub3cgd2FpdCBmb3IgYWNrCiAJICovCkBAIC0yNzEsMTEgKzI3NiwxMSBAQAogCS8qCiAJICogY2hlY2sgZm9yIGFjawogCSAqLwotCWlmKGkyY19nZXRiaXQoKSkKKwlpZiAoaTJjX2dldGJpdCgpKQogCQlhY2sgPSAwOwogCWkyY19kZWxheShDTE9DS19ISUdIX1RJTUUvMik7Ci0JaWYoIWFjayl7Ci0JCWlmKCFpMmNfZ2V0Yml0KCkpIC8qIHJlY2VpdmVyIHB1bGxlZCBTREEgbG93ICovCisJaWYgKCFhY2spIHsKKwkJaWYgKCFpMmNfZ2V0Yml0KCkpIC8qIHJlY2VpdmVyIHB1bGxkIFNEQSBsb3cgKi8KIAkJCWFjayA9IDE7CiAJCWkyY19kZWxheShDTE9DS19ISUdIX1RJTUUvMik7CiAJfQpAQCAtMjg1LDYgKzI5MCw3IEBACiAgICAgKiBiZWZvcmUgd2UgZW5hYmxlIG91ciBvdXRwdXQuIElmIHdlIGtlZXAgZGF0YSBoaWdoCiAgICAgKiBhbmQgZW5hYmxlIG91dHB1dCwgd2Ugd291bGQgZ2VuZXJhdGUgYSBzdG9wIGNvbmRpdGlvbi4KICAgICAqLworI2lmIDAKICAgIGkyY19kYXRhKEkyQ19EQVRBX0xPVyk7CiAKIAkvKgpAQCAtMjkyLDYgKzI5OCw3IEBACiAJICovCiAJaTJjX2VuYWJsZSgpOwogCWkyY19kaXJfb3V0KCk7CisjZW5kaWYKIAlpMmNfY2xrKEkyQ19DTE9DS19MT1cpOwogCWkyY19kZWxheShDTE9DS19ISUdIX1RJTUUvNCk7CiAJLyoKQEAgLTM3NSw2ICszODIsMTIxIEBACiAKIC8qIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiMKKyojIEZVTkNUSU9OIE5BTUU6IGkyY193cml0ZQorKiMKKyojIERFU0NSSVBUSU9OICA6IFdyaXRlcyBhIHZhbHVlIHRvIGFuIEkyQyBkZXZpY2UKKyojCisqIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludAoraTJjX3dyaXRlKHVuc2lnbmVkIGNoYXIgdGhlU2xhdmUsIHZvaWQgKmRhdGEsIHNpemVfdCBuYnl0ZXMpCit7CisJaW50IGVycm9yLCBjbnRyID0gMzsKKwl1bnNpZ25lZCBjaGFyIGJ5dGVzX3dyb3RlID0gMDsKKwl1bnNpZ25lZCBjaGFyIHZhbHVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTJjX2xvY2ssIGZsYWdzKTsKKworCWRvIHsKKwkJZXJyb3IgPSAwOworCisJCWkyY19zdGFydCgpOworCQkvKgorCQkgKiBzZW5kIHNsYXZlIGFkZHJlc3MKKwkJICovCisJCWkyY19vdXRieXRlKCh0aGVTbGF2ZSAmIDB4ZmUpKTsKKwkJLyoKKwkJICogd2FpdCBmb3IgYWNrCisJCSAqLworCQlpZiAoIWkyY19nZXRhY2soKSkKKwkJCWVycm9yID0gMTsKKwkJLyoKKwkJICogc2VuZCBkYXRhCisJCSAqLworCQlmb3IgKGJ5dGVzX3dyb3RlID0gMDsgYnl0ZXNfd3JvdGUgPCBuYnl0ZXM7IGJ5dGVzX3dyb3RlKyspIHsKKwkJCW1lbWNweSgmdmFsdWUsIGRhdGEgKyBieXRlc193cm90ZSwgc2l6ZW9mIHZhbHVlKTsKKwkJCWkyY19vdXRieXRlKHZhbHVlKTsKKwkJCS8qCisJCQkgKiBub3cgaXQncyB0aW1lIHRvIHdhaXQgZm9yIGFjaworCQkJICovCisJCQlpZiAoIWkyY19nZXRhY2soKSkKKwkJCQllcnJvciB8PSA0OworCQl9CisJCS8qCisJCSAqIGVuZCBieXRlIHN0cmVhbQorCQkgKi8KKwkJaTJjX3N0b3AoKTsKKworCX0gd2hpbGUgKGVycm9yICYmIGNudHItLSk7CisKKwlpMmNfZGVsYXkoQ0xPQ0tfTE9XX1RJTUUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTJjX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAtZXJyb3I7Cit9CisKKy8qIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKiMKKyojIEZVTkNUSU9OIE5BTUU6IGkyY19yZWFkCisqIworKiMgREVTQ1JJUFRJT04gIDogUmVhZHMgYSB2YWx1ZSBmcm9tIGFuIEkyQyBkZXZpY2UKKyojCisqIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludAoraTJjX3JlYWQodW5zaWduZWQgY2hhciB0aGVTbGF2ZSwgdm9pZCAqZGF0YSwgc2l6ZV90IG5ieXRlcykKK3sKKwl1bnNpZ25lZCBjaGFyIGIgPSAwOworCXVuc2lnbmVkIGNoYXIgYnl0ZXNfcmVhZCA9IDA7CisJaW50IGVycm9yLCBjbnRyID0gMzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmkyY19sb2NrLCBmbGFncyk7CisKKwlkbyB7CisJCWVycm9yID0gMDsKKwkJbWVtc2V0KGRhdGEsIDAsIG5ieXRlcyk7CisJCS8qCisJCSAqIGdlbmVyYXRlIHN0YXJ0IGNvbmRpdGlvbgorCQkgKi8KKwkJaTJjX3N0YXJ0KCk7CisJCS8qCisJCSAqIHNlbmQgc2xhdmUgYWRkcmVzcworCQkgKi8KKwkJaTJjX291dGJ5dGUoKHRoZVNsYXZlIHwgMHgwMSkpOworCQkvKgorCQkgKiB3YWl0IGZvciBhY2sKKwkJICovCisJCWlmICghaTJjX2dldGFjaygpKQorCQkJZXJyb3IgPSAxOworCQkvKgorCQkgKiBmZXRjaCBkYXRhCisJCSAqLworCQlmb3IgKGJ5dGVzX3JlYWQgPSAwOyBieXRlc19yZWFkIDwgbmJ5dGVzOyBieXRlc19yZWFkKyspIHsKKwkJCWIgPSBpMmNfaW5ieXRlKCk7CisJCQltZW1jcHkoZGF0YSArIGJ5dGVzX3JlYWQsICZiLCBzaXplb2YgYik7CisKKwkJCWlmIChieXRlc19yZWFkIDwgKG5ieXRlcyAtIDEpKQorCQkJCWkyY19zZW5kYWNrKCk7CisJCX0KKwkJLyoKKwkJICogbGFzdCByZWNlaXZlZCBieXRlIG5lZWRzIHRvIGJlIG5hY2tlZAorCQkgKiBpbnN0ZWFkIG9mIGFja2VkCisJCSAqLworCQlpMmNfc2VuZG5hY2soKTsKKwkJLyoKKwkJICogZW5kIHNlcXVlbmNlCisJCSAqLworCQlpMmNfc3RvcCgpOworCX0gd2hpbGUgKGVycm9yICYmIGNudHItLSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMmNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIC1lcnJvcjsKK30KKworLyojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqIwogKiMgRlVOQ1RJT04gTkFNRTogaTJjX3dyaXRlcmVnCiAqIwogKiMgREVTQ1JJUFRJT04gIDogV3JpdGVzIGEgdmFsdWUgdG8gYW4gSTJDIGRldmljZQpAQCAtMzg3LDEyICs1MDksMTAgQEAKIAlpbnQgZXJyb3IsIGNudHIgPSAzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTJjX2xvY2ssIGZsYWdzKTsKKwogCWRvIHsKIAkJZXJyb3IgPSAwOwotCQkvKgotCQkgKiB3ZSBkb24ndCBsaWtlIHRvIGJlIGludGVycnVwdGVkCi0JCSAqLwotICAgICAgICAgICAgICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAogCQlpMmNfc3RhcnQoKTsKIAkJLyoKQEAgLTQyNywxNSArNTQ3LDEyIEBACiAJCSAqIGVuZCBieXRlIHN0cmVhbQogCQkgKi8KIAkJaTJjX3N0b3AoKTsKLQkJLyoKLQkJICogZW5hYmxlIGludGVycnVwdCBhZ2FpbgotCQkgKi8KLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCiAJfSB3aGlsZShlcnJvciAmJiBjbnRyLS0pOwogCiAJaTJjX2RlbGF5KENMT0NLX0xPV19USU1FKTsKIAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyY19sb2NrLCBmbGFncyk7CisKIAlyZXR1cm4gLWVycm9yOwogfQogCkBAIC00NTMsMTMgKzU3MCwxMSBAQAogCWludCBlcnJvciwgY250ciA9IDM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZpMmNfbG9jaywgZmxhZ3MpOworCiAJZG8gewogCQllcnJvciA9IDA7CiAJCS8qCi0JCSAqIHdlIGRvbid0IGxpa2UgdG8gYmUgaW50ZXJydXB0ZWQKLQkJICovCi0gICAgICAgICAgICAgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQkvKgogCQkgKiBnZW5lcmF0ZSBzdGFydCBjb25kaXRpb24KIAkJICovCiAJCWkyY19zdGFydCgpOwpAQCAtNDgyLDcgKzU5Nyw3IEBACiAJCSAqIG5vdyBpdCdzIHRpbWUgdG8gd2FpdCBmb3IgYWNrCiAJCSAqLwogCQlpZighaTJjX2dldGFjaygpKQotCQkJZXJyb3IgPSAxOworCQkJZXJyb3IgfD0gMjsKIAkJLyoKIAkJICogcmVwZWF0IHN0YXJ0IGNvbmRpdGlvbgogCQkgKi8KQEAgLTQ5Niw3ICs2MTEsNyBAQAogCQkgKiB3YWl0IGZvciBhY2sKIAkJICovCiAJCWlmKCFpMmNfZ2V0YWNrKCkpCi0JCQllcnJvciA9IDE7CisJCQllcnJvciB8PSA0OwogCQkvKgogCQkgKiBmZXRjaCByZWdpc3RlcgogCQkgKi8KQEAgLTUxMCwxMyArNjI1LDExIEBACiAJCSAqIGVuZCBzZXF1ZW5jZQogCQkgKi8KIAkJaTJjX3N0b3AoKTsKLQkJLyoKLQkJICogZW5hYmxlIGludGVycnVwdCBhZ2FpbgotCQkgKi8KLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCiAJfSB3aGlsZShlcnJvciAmJiBjbnRyLS0pOwogCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTJjX2xvY2ssIGZsYWdzKTsKKwogCXJldHVybiBiOwogfQogCkBAIC01NDAsNyArNjUzLDcgQEAKIAkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCWlmKF9JT0NfVFlQRShjbWQpICE9IEVUUkFYSTJDX0lPQ1RZUEUpIHsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAtRU5PVFRZOwogCX0KIAogCXN3aXRjaCAoX0lPQ19OUihjbWQpKSB7CkBAIC01ODAsMzEgKzY5Myw1MiBAQAogCS5yZWxlYXNlID0gIGkyY19yZWxlYXNlLAogfTsKIAotaW50IF9faW5pdAotaTJjX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGkyY19pbml0KHZvaWQpCit7CisJc3RhdGljIGludCByZXM7CisJc3RhdGljIGludCBmaXJzdCA9IDE7CisKKwlpZiAoIWZpcnN0KQorCQlyZXR1cm4gcmVzOworCisJZmlyc3QgPSAwOworCisJLyogU2V0dXAgYW5kIGVuYWJsZSB0aGUgREFUQSBhbmQgQ0xLIHBpbnMgKi8KKworCXJlcyA9IGNyaXN2MzJfaW9fZ2V0X25hbWUoJmNyaXNfaTJjX2RhdGEsCisJCUNPTkZJR19FVFJBWF9WMzJfSTJDX0RBVEFfUE9SVCk7CisJaWYgKHJlcyA8IDApCisJCXJldHVybiByZXM7CisKKwlyZXMgPSBjcmlzdjMyX2lvX2dldF9uYW1lKCZjcmlzX2kyY19jbGssIENPTkZJR19FVFJBWF9WMzJfSTJDX0NMS19QT1JUKTsKKwljcmlzdjMyX2lvX3NldF9kaXIoJmNyaXNfaTJjX2NsaywgY3Jpc3YzMl9pb19kaXJfb3V0KTsKKworCXJldHVybiByZXM7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgaTJjX3JlZ2lzdGVyKHZvaWQpCiB7CiAJaW50IHJlczsKIAotCS8qIFNldHVwIGFuZCBlbmFibGUgdGhlIFBvcnQgQiBJMkMgaW50ZXJmYWNlICovCi0KLSAgICAgICAgY3Jpc3YzMl9pb19nZXRfbmFtZSgmY3Jpc19pMmNfZGF0YSwgQ09ORklHX0VUUkFYX0kyQ19EQVRBX1BPUlQpOwotICAgICAgICBjcmlzdjMyX2lvX2dldF9uYW1lKCZjcmlzX2kyY19jbGssIENPTkZJR19FVFJBWF9JMkNfQ0xLX1BPUlQpOworCXJlcyA9IGkyY19pbml0KCk7CisJaWYgKHJlcyA8IDApCisJCXJldHVybiByZXM7CiAKIAkvKiByZWdpc3RlciBjaGFyIGRldmljZSAqLwogCiAJcmVzID0gcmVnaXN0ZXJfY2hyZGV2KEkyQ19NQUpPUiwgaTJjX25hbWUsICZpMmNfZm9wcyk7Ci0JaWYocmVzIDwgMCkgeworCWlmIChyZXMgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaTJjOiBjb3VsZG4ndCBnZXQgYSBtYWpvciBudW1iZXIuXG4iKTsKIAkJcmV0dXJuIHJlczsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPICJJMkMgZHJpdmVyIHYyLjIsIChjKSAxOTk5LTIwMDEgQXhpcyBDb21tdW5pY2F0aW9ucyBBQlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTworCQkiSTJDIGRyaXZlciB2Mi4yLCAoYykgMTk5OS0yMDA3IEF4aXMgQ29tbXVuaWNhdGlvbnMgQUJcbiIpOwogCiAJcmV0dXJuIDA7CiB9Ci0KIC8qIHRoaXMgbWFrZXMgc3VyZSB0aGF0IGkyY19pbml0IGlzIGNhbGxlZCBkdXJpbmcgYm9vdCAqLwotCi1tb2R1bGVfaW5pdChpMmNfaW5pdCk7Cittb2R1bGVfaW5pdChpMmNfcmVnaXN0ZXIpOwogCiAvKioqKioqKioqKioqKioqKioqIEVORCBPRiBGSUxFIGkyYy5jICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvaTJjLmggYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9pMmMuaAppbmRleCBiZmUxYTEzLi5jMDczY2Y0IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9pMmMuaAorKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9pMmMuaApAQCAtMyw2ICszLDggQEAKIAogLyogSGlnaCBsZXZlbCBJMkMgYWN0aW9ucyAqLwogaW50IF9faW5pdCBpMmNfaW5pdCh2b2lkKTsKK2ludCBpMmNfd3JpdGUodW5zaWduZWQgY2hhciB0aGVTbGF2ZSwgdm9pZCAqZGF0YSwgc2l6ZV90IG5ieXRlcyk7CitpbnQgaTJjX3JlYWQodW5zaWduZWQgY2hhciB0aGVTbGF2ZSwgdm9pZCAqZGF0YSwgc2l6ZV90IG5ieXRlcyk7CiBpbnQgaTJjX3dyaXRlcmVnKHVuc2lnbmVkIGNoYXIgdGhlU2xhdmUsIHVuc2lnbmVkIGNoYXIgdGhlUmVnLCB1bnNpZ25lZCBjaGFyIHRoZVZhbHVlKTsKIHVuc2lnbmVkIGNoYXIgaTJjX3JlYWRyZWcodW5zaWduZWQgY2hhciB0aGVTbGF2ZSwgdW5zaWduZWQgY2hhciB0aGVSZWcpOwogCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9pb3BfZndfbG9hZC5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvaW9wX2Z3X2xvYWQuYwppbmRleCBmNGJkYzFkLi4zYjM4NTdlIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9pb3BfZndfbG9hZC5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL2lvcF9md19sb2FkLmMKQEAgLTEsNSArMSw0IEBACi0vKiAkSWQ6IGlvcF9md19sb2FkLmMsdiAxLjQgMjAwNS8wNC8wNyAwOToyNzo0NiBsYXJzdiBFeHAgJAotICoKKy8qCiAgKiBGaXJtd2FyZSBsb2FkZXIgZm9yIEVUUkFYIEZTIElPLVByb2Nlc3NvcgogICoKICAqIENvcHlyaWdodCAoQykgMjAwNCAgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgpAQCAtMTEsMTIgKzEwLDEzIEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KIAotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9yZWdfbWFwLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL2lvcC9pb3BfcmVnX3NwYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL2lvcC9pb3BfbXB1X21hY3Jvcy5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9pb3AvaW9wX21wdV9kZWZzLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL2lvcC9pb3Bfc3B1X2RlZnMuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvaW9wL2lvcF9zd19jcHVfZGVmcy5oPgorI2luY2x1ZGUgPGh3cmVncy9yZWdfcmR3ci5oPgorI2luY2x1ZGUgPGh3cmVncy9yZWdfbWFwLmg+CisjaW5jbHVkZSA8aHdyZWdzL2lvcC9pb3BfcmVnX3NwYWNlLmg+CisjaW5jbHVkZSA8aHdyZWdzL2lvcC9pb3BfbXB1X21hY3Jvcy5oPgorI2luY2x1ZGUgPGh3cmVncy9pb3AvaW9wX21wdV9kZWZzLmg+CisjaW5jbHVkZSA8aHdyZWdzL2lvcC9pb3Bfc3B1X2RlZnMuaD4KKyNpbmNsdWRlIDxod3JlZ3MvaW9wL2lvcF9zd19jcHVfZGVmcy5oPgogCiAjZGVmaW5lIElPUF9USU1FT1VUIDEwMAogCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9tYWNoLWEzL01ha2VmaWxlIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvbWFjaC1hMy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzZkMmEyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvbWFjaC1hMy9NYWtlZmlsZQpAQCAtMCwwICsxLDYgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIEV0cmF4LXNwZWNpZmljIGRyaXZlcnMKKyMKKworb2JqLSQoQ09ORklHX0VUUkFYX05BTkRGTEFTSCkgICArPSBuYW5kZmxhc2gubworb2JqLSQoQ09ORklHX0VUUkFYX0dQSU8pICAgICAgICArPSBncGlvLm8KZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL21hY2gtYTMvZ3Bpby5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvbWFjaC1hMy9ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUxMDdkYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL21hY2gtYTMvZ3Bpby5jCkBAIC0wLDAgKzEsOTg0IEBACisvKgorICogQXJ0ZWMtMyBnZW5lcmFsIHBvcnQgSS9PIGRldmljZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBBeGlzIENvbW11bmljYXRpb25zIEFCCisgKgorICogQXV0aG9yczogICAgQmpvcm4gV2VzZW4gICAgICAoaW5pdGlhbCB2ZXJzaW9uKQorICogICAgICAgICAgICAgT2xhIEtudXRzc29uICAgICAoTEVEIGhhbmRsaW5nKQorICogICAgICAgICAgICAgSm9oYW4gQWRvbGZzc29uICAocmVhZC9zZXQgZGlyZWN0aW9ucywgd3JpdGUsIHBvcnQgRywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgdG8gRVRSQVggRlMuCisgKiAgICAgICAgICAgICBSaWNhcmQgV2FuZGVybG9mIChQV00gZm9yIEFydHBlYy0zKQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGFzbS9ldHJheGdwaW8uaD4KKyNpbmNsdWRlIDxod3JlZ3MvcmVnX21hcC5oPgorI2luY2x1ZGUgPGh3cmVncy9yZWdfcmR3ci5oPgorI2luY2x1ZGUgPGh3cmVncy9naW9fZGVmcy5oPgorI2luY2x1ZGUgPGh3cmVncy9pbnRyX3ZlY3RfZGVmcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWFjaC9waW5tdXguaD4KKworI2lmZGVmIENPTkZJR19FVFJBWF9WSVJUVUFMX0dQSU8KKyNpbmNsdWRlICIuLi9pMmMuaCIKKworI2RlZmluZSBWSVJUX0kyQ19BRERSIDB4NDAKKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIGdpbyBwb3J0cyBvbiBBUlRQRUMtMyBpcyBhdmFpbGFibGU6CisgKiBwYSAzMiBiaXRzCisgKiBwYiAzMiBiaXRzCisgKiBwYyAxNiBiaXRzCisgKiBlYWNoIHBvcnQgaGFzIGEgcndfcHhfZG91dCwgcl9weF9kaW4gYW5kIHJ3X3B4X29lIHJlZ2lzdGVyLgorICovCisKKyNkZWZpbmUgR1BJT19NQUpPUiAxMjAgIC8qIGV4cGVyaW1lbnRhbCBNQUpPUiBudW1iZXIgKi8KKworI2RlZmluZSBJMkNfSU5URVJSVVBUX0JJVFMgMHgzMDAgLyogaTJjMF9kb25lIGFuZCBpMmMxX2RvbmUgYml0cyAqLworCisjZGVmaW5lIEQoeCkKKworI2lmIDAKK3N0YXRpYyBpbnQgZHBfY250OworI2RlZmluZSBEUCh4KSBcCisJZG8geyBcCisJCWRwX2NudCsrOyBcCisJCWlmIChkcF9jbnQgJSAxMDAwID09IDApIFwKKwkJCXg7IFwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgRFAoeCkKKyNlbmRpZgorCitzdGF0aWMgY2hhciBncGlvX25hbWVbXSA9ICJldHJheCBncGlvIjsKKworI2lmZGVmIENPTkZJR19FVFJBWF9WSVJUVUFMX0dQSU8KK3N0YXRpYyBpbnQgdmlydHVhbF9ncGlvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpOworI2VuZGlmCitzdGF0aWMgaW50IGdwaW9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHNzaXplX3QgZ3Bpb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwlzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmKTsKK3N0YXRpYyBpbnQgZ3Bpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKK3N0YXRpYyBpbnQgZ3Bpb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ3Bpb19wb2xsKHN0cnVjdCBmaWxlICpmaWxwLAorCXN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCk7CisKKy8qIHByaXZhdGUgZGF0YSBwZXIgb3BlbigpIG9mIHRoaXMgZHJpdmVyICovCisKK3N0cnVjdCBncGlvX3ByaXZhdGUgeworCXN0cnVjdCBncGlvX3ByaXZhdGUgKm5leHQ7CisJLyogVGhlIElPX0NGR19XUklURV9NT0RFX1ZBTFVFIG9ubHkgc3VwcG9ydCA4IGJpdHM6ICovCisJdW5zaWduZWQgY2hhciBjbGtfbWFzazsKKwl1bnNpZ25lZCBjaGFyIGRhdGFfbWFzazsKKwl1bnNpZ25lZCBjaGFyIHdyaXRlX21zYjsKKwl1bnNpZ25lZCBjaGFyIHBhZDE7CisJLyogVGhlc2UgZmllbGRzIGFyZSBnZW5lcmljICovCisJdW5zaWduZWQgbG9uZyBoaWdoYWxhcm0sIGxvd2FsYXJtOworCXdhaXRfcXVldWVfaGVhZF90IGFsYXJtX3dxOworCWludCBtaW5vcjsKK307CisKK3N0YXRpYyB2b2lkIGdwaW9fc2V0X2FsYXJtKHN0cnVjdCBncGlvX3ByaXZhdGUgKnByaXYpOworc3RhdGljIGludCBncGlvX2xlZHNfaW9jdGwodW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCBncGlvX3B3bV9pb2N0bChzdHJ1Y3QgZ3Bpb19wcml2YXRlICpwcml2LCB1bnNpZ25lZCBpbnQgY21kLAorCXVuc2lnbmVkIGxvbmcgYXJnKTsKKworCisvKiBsaW5rZWQgbGlzdCBvZiBhbGFybXMgdG8gY2hlY2sgZm9yICovCisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19wcml2YXRlICphbGFybWxpc3Q7CisKK3N0YXRpYyBpbnQgd2FudGVkX2ludGVycnVwdHM7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZ3Bpb19sb2NrKTsKKworI2RlZmluZSBOVU1fUE9SVFMgKEdQSU9fTUlOT1JfTEFTVCsxKQorI2RlZmluZSBHSU9fUkVHX1JEX0FERFIocmVnKSBcCisJKHVuc2lnbmVkIGxvbmcgKikocmVnaV9naW8gKyBSRUdfUkRfQUREUl9naW9fIyNyZWcpCisjZGVmaW5lIEdJT19SRUdfV1JfQUREUihyZWcpIFwKKwkodW5zaWduZWQgbG9uZyAqKShyZWdpX2dpbyArIFJFR19XUl9BRERSX2dpb18jI3JlZykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxlZF9kdW1teTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBvcnRfZF9kdW1teTsJLyogT25seSBpbnB1dCBvbiBBcnRwZWMtMyAqLworI2lmZGVmIENPTkZJR19FVFJBWF9WSVJUVUFMX0dQSU8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBvcnRfZV9kdW1teTsJLyogTm9uIGV4aXN0ZW50IG9uIEFydHBlYy0zICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyB2aXJ0dWFsX2R1bW15Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgdmlydHVhbF9yd19wdl9vZSA9IENPTkZJR19FVFJBWF9ERUZfR0lPX1BWX09FOworc3RhdGljIHVuc2lnbmVkIHNob3J0IGNhY2hlZF92aXJ0dWFsX2dwaW9fcmVhZDsKKyNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyAqZGF0YV9vdXRbTlVNX1BPUlRTXSA9IHsKKwlHSU9fUkVHX1dSX0FERFIocndfcGFfZG91dCksCisJR0lPX1JFR19XUl9BRERSKHJ3X3BiX2RvdXQpLAorCSZsZWRfZHVtbXksCisJR0lPX1JFR19XUl9BRERSKHJ3X3BjX2RvdXQpLAorCSZwb3J0X2RfZHVtbXksCisjaWZkZWYgQ09ORklHX0VUUkFYX1ZJUlRVQUxfR1BJTworCSZwb3J0X2VfZHVtbXksCisJJnZpcnR1YWxfZHVtbXksCisjZW5kaWYKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nICpkYXRhX2luW05VTV9QT1JUU10gPSB7CisJR0lPX1JFR19SRF9BRERSKHJfcGFfZGluKSwKKwlHSU9fUkVHX1JEX0FERFIocl9wYl9kaW4pLAorCSZsZWRfZHVtbXksCisJR0lPX1JFR19SRF9BRERSKHJfcGNfZGluKSwKKwlHSU9fUkVHX1JEX0FERFIocl9wZF9kaW4pLAorI2lmZGVmIENPTkZJR19FVFJBWF9WSVJUVUFMX0dQSU8KKwkmcG9ydF9lX2R1bW15LAorCSZ2aXJ0dWFsX2R1bW15LAorI2VuZGlmCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjaGFuZ2VhYmxlX2RpcltOVU1fUE9SVFNdID0geworCUNPTkZJR19FVFJBWF9QQV9DSEFOR0VBQkxFX0RJUiwKKwlDT05GSUdfRVRSQVhfUEJfQ0hBTkdFQUJMRV9ESVIsCisJMCwKKwlDT05GSUdfRVRSQVhfUENfQ0hBTkdFQUJMRV9ESVIsCisJMCwKKyNpZmRlZiBDT05GSUdfRVRSQVhfVklSVFVBTF9HUElPCisJMCwKKwlDT05GSUdfRVRSQVhfUFZfQ0hBTkdFQUJMRV9ESVIsCisjZW5kaWYKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNoYW5nZWFibGVfYml0c1tOVU1fUE9SVFNdID0geworCUNPTkZJR19FVFJBWF9QQV9DSEFOR0VBQkxFX0JJVFMsCisJQ09ORklHX0VUUkFYX1BCX0NIQU5HRUFCTEVfQklUUywKKwkwLAorCUNPTkZJR19FVFJBWF9QQ19DSEFOR0VBQkxFX0JJVFMsCisJMCwKKyNpZmRlZiBDT05GSUdfRVRSQVhfVklSVFVBTF9HUElPCisJMCwKKwlDT05GSUdfRVRSQVhfUFZfQ0hBTkdFQUJMRV9CSVRTLAorI2VuZGlmCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyAqZGlyX29lW05VTV9QT1JUU10gPSB7CisJR0lPX1JFR19XUl9BRERSKHJ3X3BhX29lKSwKKwlHSU9fUkVHX1dSX0FERFIocndfcGJfb2UpLAorCSZsZWRfZHVtbXksCisJR0lPX1JFR19XUl9BRERSKHJ3X3BjX29lKSwKKwkmcG9ydF9kX2R1bW15LAorI2lmZGVmIENPTkZJR19FVFJBWF9WSVJUVUFMX0dQSU8KKwkmcG9ydF9lX2R1bW15LAorCSZ2aXJ0dWFsX3J3X3B2X29lLAorI2VuZGlmCit9OworCitzdGF0aWMgdm9pZCBncGlvX3NldF9hbGFybShzdHJ1Y3QgZ3Bpb19wcml2YXRlICpwcml2KQoreworCWludCBiaXQ7CisJaW50IGludHJfY2ZnOworCWludCBtYXNrOworCWludCBwaW5zOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisJaW50cl9jZmcgPSBSRUdfUkRfSU5UKGdpbywgcmVnaV9naW8sIHJ3X2ludHJfY2ZnKTsKKwlwaW5zID0gUkVHX1JEX0lOVChnaW8sIHJlZ2lfZ2lvLCByd19pbnRyX3BpbnMpOworCW1hc2sgPSBSRUdfUkRfSU5UKGdpbywgcmVnaV9naW8sIHJ3X2ludHJfbWFzaykgJiBJMkNfSU5URVJSVVBUX0JJVFM7CisKKwlmb3IgKGJpdCA9IDA7IGJpdCA8IDMyOyBiaXQrKykgeworCQlpbnQgaW50ciA9IGJpdCAlIDg7CisJCWludCBwaW4gPSBiaXQgLyA4OworCQlpZiAocHJpdi0+bWlub3IgPCBHUElPX01JTk9SX0xFRFMpCisJCQlwaW4gKz0gcHJpdi0+bWlub3IgKiA0OworCQllbHNlCisJCQlwaW4gKz0gKHByaXYtPm1pbm9yIC0gMSkgKiA0OworCisJCWlmIChwcml2LT5oaWdoYWxhcm0gJiAoMTw8Yml0KSkgeworCQkJaW50cl9jZmcgfD0gKHJlZ2tfZ2lvX2hpIDw8IChpbnRyICogMykpOworCQkJbWFzayB8PSAxIDw8IGludHI7CisJCQl3YW50ZWRfaW50ZXJydXB0cyA9IG1hc2sgJiAweGZmOworCQkJcGlucyB8PSBwaW4gPDwgKGludHIgKiA0KTsKKwkJfSBlbHNlIGlmIChwcml2LT5sb3dhbGFybSAmICgxPDxiaXQpKSB7CisJCQlpbnRyX2NmZyB8PSAocmVna19naW9fbG8gPDwgKGludHIgKiAzKSk7CisJCQltYXNrIHw9IDEgPDwgaW50cjsKKwkJCXdhbnRlZF9pbnRlcnJ1cHRzID0gbWFzayAmIDB4ZmY7CisJCQlwaW5zIHw9IHBpbiA8PCAoaW50ciAqIDQpOworCQl9CisJfQorCisJUkVHX1dSX0lOVChnaW8sIHJlZ2lfZ2lvLCByd19pbnRyX2NmZywgaW50cl9jZmcpOworCVJFR19XUl9JTlQoZ2lvLCByZWdpX2dpbywgcndfaW50cl9waW5zLCBwaW5zKTsKKwlSRUdfV1JfSU5UKGdpbywgcmVnaV9naW8sIHJ3X2ludHJfbWFzaywgbWFzayk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBncGlvX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisJc3RydWN0IGdwaW9fcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwlpZiAocHJpdi0+bWlub3IgPj0gR1BJT19NSU5PUl9QV00wICYmCisJICAgIHByaXYtPm1pbm9yIDw9IEdQSU9fTUlOT1JfTEFTVF9QV00pCisJCXJldHVybiAwOworCisJcG9sbF93YWl0KGZpbGUsICZwcml2LT5hbGFybV93cSwgd2FpdCk7CisJaWYgKHByaXYtPm1pbm9yIDw9IEdQSU9fTUlOT1JfRCkgeworCQlkYXRhID0gcmVhZGwoZGF0YV9pbltwcml2LT5taW5vcl0pOworCQlSRUdfV1JfSU5UKGdpbywgcmVnaV9naW8sIHJ3X2Fja19pbnRyLCB3YW50ZWRfaW50ZXJydXB0cyk7CisJCXRtcCA9IFJFR19SRF9JTlQoZ2lvLCByZWdpX2dpbywgcndfaW50cl9tYXNrKTsKKwkJdG1wICY9IEkyQ19JTlRFUlJVUFRfQklUUzsKKwkJdG1wIHw9IHdhbnRlZF9pbnRlcnJ1cHRzOworCQlSRUdfV1JfSU5UKGdpbywgcmVnaV9naW8sIHJ3X2ludHJfbWFzaywgdG1wKTsKKwl9IGVsc2UKKwkJcmV0dXJuIDA7CisKKwlpZiAoKGRhdGEgJiBwcml2LT5oaWdoYWxhcm0pIHx8ICh+ZGF0YSAmIHByaXYtPmxvd2FsYXJtKSkKKwkJbWFzayA9IFBPTExJTnxQT0xMUkROT1JNOworCisJRFAocHJpbnRrKEtFUk5fREVCVUcgImdwaW9fcG9sbCByZWFkeTogbWFzayAweCUwOFhcbiIsIG1hc2spKTsKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGlycXJldHVybl90IGdwaW9faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlyZWdfZ2lvX3J3X2ludHJfbWFzayBpbnRyX21hc2s7CisJcmVnX2dpb19yX21hc2tlZF9pbnRyIG1hc2tlZF9pbnRyOworCXJlZ19naW9fcndfYWNrX2ludHIgYWNrX2ludHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwl1bnNpZ25lZCBsb25nIHRtcDI7CisjaWZkZWYgQ09ORklHX0VUUkFYX1ZJUlRVQUxfR1BJTworCXVuc2lnbmVkIGNoYXIgZW5hYmxlX2dwaW92X2FjayA9IDA7CisjZW5kaWYKKworCS8qIEZpbmQgd2hhdCBQQSBpbnRlcnJ1cHRzIGFyZSBhY3RpdmUgKi8KKwltYXNrZWRfaW50ciA9IFJFR19SRChnaW8sIHJlZ2lfZ2lvLCByX21hc2tlZF9pbnRyKTsKKwl0bXAgPSBSRUdfVFlQRV9DT05WKHVuc2lnbmVkIGxvbmcsIHJlZ19naW9fcl9tYXNrZWRfaW50ciwgbWFza2VkX2ludHIpOworCisJLyogRmluZCB0aG9zZSB0aGF0IHdlIGhhdmUgZW5hYmxlZCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssIGZsYWdzKTsKKwl0bXAgJj0gd2FudGVkX2ludGVycnVwdHM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisKKyNpZmRlZiBDT05GSUdfRVRSQVhfVklSVFVBTF9HUElPCisJLyogU29tZXRoaW5nIGNoYW5nZWQgb24gdmlydHVhbCBHUElPLiBJbnRlcnJ1cHQgaXMgYWNrZWQgYnkKKwkgKiByZWFkaW5nIHRoZSBkZXZpY2UuCisJICovCisJaWYgKHRtcCAmICgxIDw8IENPTkZJR19FVFJBWF9WSVJUVUFMX0dQSU9fSU5URVJSVVBUX1BBX1BJTikpIHsKKwkJaTJjX3JlYWQoVklSVF9JMkNfQUREUiwgKHZvaWQgKikmY2FjaGVkX3ZpcnR1YWxfZ3Bpb19yZWFkLAorCQkJc2l6ZW9mKGNhY2hlZF92aXJ0dWFsX2dwaW9fcmVhZCkpOworCQllbmFibGVfZ3Bpb3ZfYWNrID0gMTsKKwl9CisjZW5kaWYKKworCS8qIEFjayB0aGVtICovCisJYWNrX2ludHIgPSBSRUdfVFlQRV9DT05WKHJlZ19naW9fcndfYWNrX2ludHIsIHVuc2lnbmVkIGxvbmcsIHRtcCk7CisJUkVHX1dSKGdpbywgcmVnaV9naW8sIHJ3X2Fja19pbnRyLCBhY2tfaW50cik7CisKKwkvKiBEaXNhYmxlIHRob3NlIGludGVycnVwdHMuLiAqLworCWludHJfbWFzayA9IFJFR19SRChnaW8sIHJlZ2lfZ2lvLCByd19pbnRyX21hc2spOworCXRtcDIgPSBSRUdfVFlQRV9DT05WKHVuc2lnbmVkIGxvbmcsIHJlZ19naW9fcndfaW50cl9tYXNrLCBpbnRyX21hc2spOworCXRtcDIgJj0gfnRtcDsKKyNpZmRlZiBDT05GSUdfRVRSQVhfVklSVFVBTF9HUElPCisJLyogRG8gbm90IGRpc2FibGUgaW50ZXJydXB0IG9uIHZpcnR1YWwgR1BJTy4gQ2hhbmdlcyBvbiB2aXJ0dWFsCisJICogcGlucyBhcmUgb25seSBub3RpY2VkIGJ5IGFuIGludGVycnVwdC4KKwkgKi8KKwlpZiAoZW5hYmxlX2dwaW92X2FjaykKKwkJdG1wMiB8PSAoMSA8PCBDT05GSUdfRVRSQVhfVklSVFVBTF9HUElPX0lOVEVSUlVQVF9QQV9QSU4pOworI2VuZGlmCisJaW50cl9tYXNrID0gUkVHX1RZUEVfQ09OVihyZWdfZ2lvX3J3X2ludHJfbWFzaywgdW5zaWduZWQgbG9uZywgdG1wMik7CisJUkVHX1dSKGdpbywgcmVnaV9naW8sIHJ3X2ludHJfbWFzaywgaW50cl9tYXNrKTsKKworCXJldHVybiBJUlFfUkVUVkFMKHRtcCk7Cit9CisKK3N0YXRpYyB2b2lkIGdwaW9fd3JpdGVfYml0KHVuc2lnbmVkIGxvbmcgKnBvcnQsIHVuc2lnbmVkIGNoYXIgZGF0YSwgaW50IGJpdCwKKwl1bnNpZ25lZCBjaGFyIGNsa19tYXNrLCB1bnNpZ25lZCBjaGFyIGRhdGFfbWFzaykKK3sKKwl1bnNpZ25lZCBsb25nIHNoYWRvdyA9IHJlYWRsKHBvcnQpICYgfmNsa19tYXNrOworCXdyaXRlbChzaGFkb3csIHBvcnQpOworCWlmIChkYXRhICYgMSA8PCBiaXQpCisJCXNoYWRvdyB8PSBkYXRhX21hc2s7CisJZWxzZQorCQlzaGFkb3cgJj0gfmRhdGFfbWFzazsKKwl3cml0ZWwoc2hhZG93LCBwb3J0KTsKKwkvKiBGb3IgRlBHQTogbWluIDUuMG5zIChEQ0MpIGJlZm9yZSBDQ0xLIGhpZ2ggKi8KKwlzaGFkb3cgfD0gY2xrX21hc2s7CisJd3JpdGVsKHNoYWRvdywgcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGdwaW9fd3JpdGVfYnl0ZShzdHJ1Y3QgZ3Bpb19wcml2YXRlICpwcml2LCB1bnNpZ25lZCBsb25nICpwb3J0LAorCQl1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJaW50IGk7CisKKwlpZiAocHJpdi0+d3JpdGVfbXNiKQorCQlmb3IgKGkgPSA3OyBpID49IDA7IGktLSkKKwkJCWdwaW9fd3JpdGVfYml0KHBvcnQsIGRhdGEsIGksIHByaXYtPmNsa19tYXNrLAorCQkJCXByaXYtPmRhdGFfbWFzayk7CisJZWxzZQorCQlmb3IgKGkgPSAwOyBpIDw9IDc7IGkrKykKKwkJCWdwaW9fd3JpdGVfYml0KHBvcnQsIGRhdGEsIGksIHByaXYtPmNsa19tYXNrLAorCQkJCXByaXYtPmRhdGFfbWFzayk7Cit9CisKKworc3RhdGljIHNzaXplX3QgZ3Bpb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwlzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmKQoreworCXN0cnVjdCBncGlvX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzc2l6ZV90IHJldHZhbCA9IGNvdW50OworCS8qIE9ubHkgYml0cyAwLTcgbWF5IGJlIHVzZWQgZm9yIHdyaXRlIG9wZXJhdGlvbnMgYnV0IGFsbG93IGFsbAorCSAgIGRldmljZXMgZXhjZXB0IGxlZHMuLi4gKi8KKyNpZmRlZiBDT05GSUdfRVRSQVhfVklSVFVBTF9HUElPCisJaWYgKHByaXYtPm1pbm9yID09IEdQSU9fTUlOT1JfVikKKwkJcmV0dXJuIC1FRkFVTFQ7CisjZW5kaWYKKwlpZiAocHJpdi0+bWlub3IgPT0gR1BJT19NSU5PUl9MRURTKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChwcml2LT5taW5vciA+PSBHUElPX01JTk9SX1BXTTAgJiYKKwkgICAgcHJpdi0+bWlub3IgPD0gR1BJT19NSU5PUl9MQVNUX1BXTSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogSXQgbXVzdCBoYXZlIGJlZW4gY29uZmlndXJlZCB1c2luZyB0aGUgSU9fQ0ZHX1dSSVRFX01PREUgKi8KKwkvKiBQZXJoYXBzIGEgYmV0dGVyIGVycm9yIGNvZGU/ICovCisJaWYgKHByaXYtPmNsa19tYXNrID09IDAgfHwgcHJpdi0+ZGF0YV9tYXNrID09IDApCisJCXJldHVybiAtRVBFUk07CisKKwlEKHByaW50ayhLRVJOX0RFQlVHICJncGlvX3dyaXRlOiAlbHUgdG8gZGF0YSAweCUwMlggY2xrIDB4JTAyWCAiCisJCSJtc2I6ICVpXG4iLAorCQljb3VudCwgcHJpdi0+ZGF0YV9tYXNrLCBwcml2LT5jbGtfbWFzaywgcHJpdi0+d3JpdGVfbXNiKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisKKwl3aGlsZSAoY291bnQtLSkKKwkJZ3Bpb193cml0ZV9ieXRlKHByaXYsIGRhdGFfb3V0W3ByaXYtPm1pbm9yXSwgKmJ1ZisrKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBncGlvX3ByaXZhdGUgKnByaXY7CisJaW50IHAgPSBpbWlub3IoaW5vZGUpOworCisJaWYgKHAgPiBHUElPX01JTk9SX0xBU1RfUFdNIHx8CisJICAgIChwID4gR1BJT19NSU5PUl9MQVNUICYmIHAgPCBHUElPX01JTk9SX1BXTTApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByaXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZ3Bpb19wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChwcml2LCAwLCBzaXplb2YoKnByaXYpKTsKKworCXByaXYtPm1pbm9yID0gcDsKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBwcml2OworCisJLyogaW5pdGlhbGl6ZSB0aGUgaW8vYWxhcm0gc3RydWN0LCBub3QgZm9yIFBXTSBwb3J0cyB0aG91Z2ggICovCisJaWYgKHAgPD0gR1BJT19NSU5PUl9MQVNUKSB7CisKKwkJcHJpdi0+Y2xrX21hc2sgPSAwOworCQlwcml2LT5kYXRhX21hc2sgPSAwOworCQlwcml2LT5oaWdoYWxhcm0gPSAwOworCQlwcml2LT5sb3dhbGFybSA9IDA7CisKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcHJpdi0+YWxhcm1fd3EpOworCisJCS8qIGxpbmsgaXQgaW50byBvdXIgYWxhcm1saXN0ICovCisJCXNwaW5fbG9ja19pcnEoJmdwaW9fbG9jayk7CisJCXByaXYtPm5leHQgPSBhbGFybWxpc3Q7CisJCWFsYXJtbGlzdCA9IHByaXY7CisJCXNwaW5fdW5sb2NrX2lycSgmZ3Bpb19sb2NrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBncGlvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGdwaW9fcHJpdmF0ZSAqcDsKKwlzdHJ1Y3QgZ3Bpb19wcml2YXRlICp0b2RlbDsKKwkvKiBsb2NhbCBjb3BpZXMgd2hpbGUgdXBkYXRpbmcgdGhlbTogKi8KKwl1bnNpZ25lZCBsb25nIGFfaGlnaCwgYV9sb3c7CisKKwkvKiBwcmVwYXJlIHRvIGZyZWUgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KKwl0b2RlbCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCS8qIHVubGluayBmcm9tIGFsYXJtbGlzdCAtIG9ubHkgZm9yIG5vbi1QV00gcG9ydHMgdGhvdWdoICovCisJaWYgKHRvZGVsLT5taW5vciA8PSBHUElPX01JTk9SX0xBU1QpIHsKKwkJc3Bpbl9sb2NrX2lycSgmZ3Bpb19sb2NrKTsKKwkJcCA9IGFsYXJtbGlzdDsKKworCQlpZiAocCA9PSB0b2RlbCkKKwkJCWFsYXJtbGlzdCA9IHRvZGVsLT5uZXh0OworCQkgZWxzZSB7CisJCQl3aGlsZSAocC0+bmV4dCAhPSB0b2RlbCkKKwkJCQlwID0gcC0+bmV4dDsKKwkJCXAtPm5leHQgPSB0b2RlbC0+bmV4dDsKKwkJfQorCisJCS8qIENoZWNrIGlmIHRoZXJlIGFyZSBzdGlsbCBhbnkgYWxhcm1zIHNldCAqLworCQlwID0gYWxhcm1saXN0OworCQlhX2hpZ2ggPSAwOworCQlhX2xvdyA9IDA7CisJCXdoaWxlIChwKSB7CisJCQlpZiAocC0+bWlub3IgPT0gR1BJT19NSU5PUl9BKSB7CisjaWZkZWYgQ09ORklHX0VUUkFYX1ZJUlRVQUxfR1BJTworCQkJCXAtPmxvd2FsYXJtIHw9ICgxIDw8IENPTkZJR19FVFJBWF9WSVJUVUFMX0dQSU9fSU5URVJSVVBUX1BBX1BJTik7CisjZW5kaWYKKwkJCQlhX2hpZ2ggfD0gcC0+aGlnaGFsYXJtOworCQkJCWFfbG93IHw9IHAtPmxvd2FsYXJtOworCQkJfQorCisJCQlwID0gcC0+bmV4dDsKKwkJfQorCisjaWZkZWYgQ09ORklHX0VUUkFYX1ZJUlRVQUxfR1BJTworCS8qIFZhcmlhYmxlICdhX2xvdycgbmVlZHMgdG8gYmUgc2V0IGhlcmUgYWdhaW4KKwkgKiB0byBlbnN1cmUgdGhhdCBpbnRlcnJ1cHQgZm9yIHZpcnR1YWwgR1BJTyBpcyBoYW5kbGVkLgorCSAqLworCQlhX2xvdyB8PSAoMSA8PCBDT05GSUdfRVRSQVhfVklSVFVBTF9HUElPX0lOVEVSUlVQVF9QQV9QSU4pOworI2VuZGlmCisKKwkJc3Bpbl91bmxvY2tfaXJxKCZncGlvX2xvY2spOworCX0KKwlrZnJlZSh0b2RlbCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogTWFpbiBkZXZpY2UgQVBJLiBpb2N0bCdzIHRvIHJlYWQvc2V0L2NsZWFyIGJpdHMsIGFzIHdlbGwgYXMgdG8KKyAqIHNldCBhbGFybXMgdG8gd2FpdCBmb3IgdXNpbmcgYSBzdWJzZXF1ZW50IHNlbGVjdCgpLgorICovCisKK2lubGluZSB1bnNpZ25lZCBsb25nIHNldGdldF9pbnB1dChzdHJ1Y3QgZ3Bpb19wcml2YXRlICpwcml2LCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwkvKiBTZXQgZGlyZWN0aW9uIDA9dW5jaGFuZ2VkIDE9aW5wdXQsCisJICogcmV0dXJuIG1hc2sgd2l0aCAxPWlucHV0CisJICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGRpcl9zaGFkb3c7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisKKwlkaXJfc2hhZG93ID0gcmVhZGwoZGlyX29lW3ByaXYtPm1pbm9yXSkgJgorCQl+KGFyZyAmIGNoYW5nZWFibGVfZGlyW3ByaXYtPm1pbm9yXSk7CisJd3JpdGVsKGRpcl9zaGFkb3csIGRpcl9vZVtwcml2LT5taW5vcl0pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisKKwlpZiAocHJpdi0+bWlub3IgPT0gR1BJT19NSU5PUl9DKQorCQlkaXJfc2hhZG93IF49IDB4RkZGRjsJCS8qIE9ubHkgMTYgYml0cyAqLworI2lmZGVmIENPTkZJR19FVFJBWF9WSVJUVUFMX0dQSU8KKwllbHNlIGlmIChwcml2LT5taW5vciA9PSBHUElPX01JTk9SX1YpCisJCWRpcl9zaGFkb3cgXj0gMHhGRkZGOwkJLyogT25seSAxNiBiaXRzICovCisjZW5kaWYKKwllbHNlCisJCWRpcl9zaGFkb3cgXj0gMHhGRkZGRkZGRjsJLyogUEEsIFBCIGFuZCBQRCAzMiBiaXRzICovCisKKwlyZXR1cm4gZGlyX3NoYWRvdzsKKworfSAvKiBzZXRnZXRfaW5wdXQgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHNldGdldF9vdXRwdXQoc3RydWN0IGdwaW9fcHJpdmF0ZSAqcHJpdiwKKwl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgZGlyX3NoYWRvdzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssIGZsYWdzKTsKKworCWRpcl9zaGFkb3cgPSByZWFkbChkaXJfb2VbcHJpdi0+bWlub3JdKSB8CisJCShhcmcgJiBjaGFuZ2VhYmxlX2Rpcltwcml2LT5taW5vcl0pOworCXdyaXRlbChkaXJfc2hhZG93LCBkaXJfb2VbcHJpdi0+bWlub3JdKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCXJldHVybiBkaXJfc2hhZG93OworfSAvKiBzZXRnZXRfb3V0cHV0ICovCisKK3N0YXRpYyBpbnQgZ3Bpb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdmFsOworCXVuc2lnbmVkIGxvbmcgc2hhZG93OworCXN0cnVjdCBncGlvX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoX0lPQ19UWVBFKGNtZCkgIT0gRVRSQVhHUElPX0lPQ1RZUEUpCisJCXJldHVybiAtRU5PVFRZOworCisJLyogQ2hlY2sgZm9yIHNwZWNpYWwgaW9jdGwgaGFuZGxlcnMgZmlyc3QgKi8KKworI2lmZGVmIENPTkZJR19FVFJBWF9WSVJUVUFMX0dQSU8KKwlpZiAocHJpdi0+bWlub3IgPT0gR1BJT19NSU5PUl9WKQorCQlyZXR1cm4gdmlydHVhbF9ncGlvX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKKyNlbmRpZgorCisJaWYgKHByaXYtPm1pbm9yID09IEdQSU9fTUlOT1JfTEVEUykKKwkJcmV0dXJuIGdwaW9fbGVkc19pb2N0bChjbWQsIGFyZyk7CisKKwlpZiAocHJpdi0+bWlub3IgPj0gR1BJT19NSU5PUl9QV00wICYmCisJICAgIHByaXYtPm1pbm9yIDw9IEdQSU9fTUlOT1JfTEFTVF9QV00pCisJCXJldHVybiBncGlvX3B3bV9pb2N0bChwcml2LCBjbWQsIGFyZyk7CisKKwlzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworCWNhc2UgSU9fUkVBREJJVFM6IC8qIFVzZSBJT19SRUFEX0lOQklUUyBhbmQgSU9fUkVBRF9PVVRCSVRTIGluc3RlYWQgKi8KKwkJLyogUmVhZCB0aGUgcG9ydC4gKi8KKwkJcmV0dXJuIHJlYWRsKGRhdGFfaW5bcHJpdi0+bWlub3JdKTsKKwljYXNlIElPX1NFVEJJVFM6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssIGZsYWdzKTsKKwkJLyogU2V0IGNoYW5nZWFibGUgYml0cyB3aXRoIGEgMSBpbiBhcmcuICovCisJCXNoYWRvdyA9IHJlYWRsKGRhdGFfb3V0W3ByaXYtPm1pbm9yXSkgfAorCQkJKGFyZyAmIGNoYW5nZWFibGVfYml0c1twcml2LT5taW5vcl0pOworCQl3cml0ZWwoc2hhZG93LCBkYXRhX291dFtwcml2LT5taW5vcl0pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2xvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBJT19DTFJCSVRTOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisJCS8qIENsZWFyIGNoYW5nZWFibGUgYml0cyB3aXRoIGEgMSBpbiBhcmcuICovCisJCXNoYWRvdyA9IHJlYWRsKGRhdGFfb3V0W3ByaXYtPm1pbm9yXSkgJgorCQkJfihhcmcgJiBjaGFuZ2VhYmxlX2JpdHNbcHJpdi0+bWlub3JdKTsKKwkJd3JpdGVsKHNoYWRvdywgZGF0YV9vdXRbcHJpdi0+bWlub3JdKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCWNhc2UgSU9fSElHSEFMQVJNOgorCQkvKiBTZXQgYWxhcm0gd2hlbiBiaXRzIHdpdGggMSBpbiBhcmcgZ28gaGlnaC4gKi8KKwkJcHJpdi0+aGlnaGFsYXJtIHw9IGFyZzsKKwkJZ3Bpb19zZXRfYWxhcm0ocHJpdik7CisJCWJyZWFrOworCWNhc2UgSU9fTE9XQUxBUk06CisJCS8qIFNldCBhbGFybSB3aGVuIGJpdHMgd2l0aCAxIGluIGFyZyBnbyBsb3cuICovCisJCXByaXYtPmxvd2FsYXJtIHw9IGFyZzsKKwkJZ3Bpb19zZXRfYWxhcm0ocHJpdik7CisJCWJyZWFrOworCWNhc2UgSU9fQ0xSQUxBUk06CisJCS8qIENsZWFyIGFsYXJtIGZvciBiaXRzIHdpdGggMSBpbiBhcmcuICovCisJCXByaXYtPmhpZ2hhbGFybSAmPSB+YXJnOworCQlwcml2LT5sb3dhbGFybSAgJj0gfmFyZzsKKwkJZ3Bpb19zZXRfYWxhcm0ocHJpdik7CisJCWJyZWFrOworCWNhc2UgSU9fUkVBRERJUjogLyogVXNlIElPX1NFVEdFVF9JTlBVVC9PVVRQVVQgaW5zdGVhZCEgKi8KKwkJLyogUmVhZCBkaXJlY3Rpb24gMD1pbnB1dCAxPW91dHB1dCAqLworCQlyZXR1cm4gcmVhZGwoZGlyX29lW3ByaXYtPm1pbm9yXSk7CisKKwljYXNlIElPX1NFVElOUFVUOiAvKiBVc2UgSU9fU0VUR0VUX0lOUFVUIGluc3RlYWQhICovCisJCS8qIFNldCBkaXJlY3Rpb24gMD11bmNoYW5nZWQgMT1pbnB1dCwKKwkJICogcmV0dXJuIG1hc2sgd2l0aCAxPWlucHV0CisJCSAqLworCQlyZXR1cm4gc2V0Z2V0X2lucHV0KHByaXYsIGFyZyk7CisKKwljYXNlIElPX1NFVE9VVFBVVDogLyogVXNlIElPX1NFVEdFVF9PVVRQVVQgaW5zdGVhZCEgKi8KKwkJLyogU2V0IGRpcmVjdGlvbiAwPXVuY2hhbmdlZCAxPW91dHB1dCwKKwkJICogcmV0dXJuIG1hc2sgd2l0aCAxPW91dHB1dAorCQkgKi8KKwkJcmV0dXJuIHNldGdldF9vdXRwdXQocHJpdiwgYXJnKTsKKworCWNhc2UgSU9fQ0ZHX1dSSVRFX01PREU6CisJeworCQlpbnQgcmVzID0gLUVQRVJNOworCQl1bnNpZ25lZCBsb25nIGRpcl9zaGFkb3csIGNsa19tYXNrLCBkYXRhX21hc2ssIHdyaXRlX21zYjsKKworCQljbGtfbWFzayA9IGFyZyAmIDB4RkY7CisJCWRhdGFfbWFzayA9IChhcmcgPj4gOCkgJiAweEZGOworCQl3cml0ZV9tc2IgPSAoYXJnID4+IDE2KSAmIDB4MDE7CisKKwkJLyogQ2hlY2sgaWYgd2UncmUgYWxsb3dlZCB0byBjaGFuZ2UgdGhlIGJpdHMgYW5kCisJCSAqIHRoZSBkaXJlY3Rpb24gaXMgY29ycmVjdAorCQkgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCQlkaXJfc2hhZG93ID0gcmVhZGwoZGlyX29lW3ByaXYtPm1pbm9yXSk7CisJCWlmICgoY2xrX21hc2sgJiBjaGFuZ2VhYmxlX2JpdHNbcHJpdi0+bWlub3JdKSAmJgorCQkgICAgKGRhdGFfbWFzayAmIGNoYW5nZWFibGVfYml0c1twcml2LT5taW5vcl0pICYmCisJCSAgICAoY2xrX21hc2sgJiBkaXJfc2hhZG93KSAmJgorCQkgICAgKGRhdGFfbWFzayAmIGRpcl9zaGFkb3cpKSB7CisJCQlwcml2LT5jbGtfbWFzayA9IGNsa19tYXNrOworCQkJcHJpdi0+ZGF0YV9tYXNrID0gZGF0YV9tYXNrOworCQkJcHJpdi0+d3JpdGVfbXNiID0gd3JpdGVfbXNiOworCQkJcmVzID0gMDsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2xvY2ssIGZsYWdzKTsKKworCQlyZXR1cm4gcmVzOworCX0KKwljYXNlIElPX1JFQURfSU5CSVRTOgorCQkvKiAqYXJnIGlzIHJlc3VsdCBvZiByZWFkaW5nIHRoZSBpbnB1dCBwaW5zICovCisJCXZhbCA9IHJlYWRsKGRhdGFfaW5bcHJpdi0+bWlub3JdKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2YWwsIHNpemVvZih2YWwpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwljYXNlIElPX1JFQURfT1VUQklUUzoKKwkJIC8qICphcmcgaXMgcmVzdWx0IG9mIHJlYWRpbmcgdGhlIG91dHB1dCBzaGFkb3cgKi8KKwkJdmFsID0gKmRhdGFfb3V0W3ByaXYtPm1pbm9yXTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2YWwsIHNpemVvZih2YWwpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIElPX1NFVEdFVF9JTlBVVDoKKwkJLyogYml0cyBzZXQgaW4gKmFyZyBpcyBzZXQgdG8gaW5wdXQsCisJCSAqICphcmcgdXBkYXRlZCB3aXRoIGN1cnJlbnQgaW5wdXQgcGlucy4KKwkJICovCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZih2YWwpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl2YWwgPSBzZXRnZXRfaW5wdXQocHJpdiwgdmFsKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ2YWwsIHNpemVvZih2YWwpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIElPX1NFVEdFVF9PVVRQVVQ6CisJCS8qIGJpdHMgc2V0IGluICphcmcgaXMgc2V0IHRvIG91dHB1dCwKKwkJICogKmFyZyB1cGRhdGVkIHdpdGggY3VycmVudCBvdXRwdXQgcGlucy4KKwkJICovCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZih2YWwpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl2YWwgPSBzZXRnZXRfb3V0cHV0KHByaXYsIHZhbCk7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdmFsLCBzaXplb2YodmFsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSAvKiBzd2l0Y2ggKi8KKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0VUUkFYX1ZJUlRVQUxfR1BJTworc3RhdGljIGludCB2aXJ0dWFsX2dwaW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisJdW5zaWduZWQgc2hvcnQgc2hhZG93OworCXN0cnVjdCBncGlvX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworCWNhc2UgSU9fU0VUQklUUzoKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCQkvKiBTZXQgY2hhbmdlYWJsZSBiaXRzIHdpdGggYSAxIGluIGFyZy4gKi8KKwkJaTJjX3JlYWQoVklSVF9JMkNfQUREUiwgKHZvaWQgKikmc2hhZG93LCBzaXplb2Yoc2hhZG93KSk7CisJCXNoYWRvdyB8PSB+cmVhZGwoZGlyX29lW3ByaXYtPm1pbm9yXSkgfAorCQkJKGFyZyAmIGNoYW5nZWFibGVfYml0c1twcml2LT5taW5vcl0pOworCQlpMmNfd3JpdGUoVklSVF9JMkNfQUREUiwgKHZvaWQgKikmc2hhZG93LCBzaXplb2Yoc2hhZG93KSk7CisJCXNwaW5fbG9ja19pcnFyZXN0b3JlKCZncGlvX2xvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBJT19DTFJCSVRTOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7CisJCS8qIENsZWFyIGNoYW5nZWFibGUgYml0cyB3aXRoIGEgMSBpbiBhcmcuICovCisJCWkyY19yZWFkKFZJUlRfSTJDX0FERFIsICh2b2lkICopJnNoYWRvdywgc2l6ZW9mKHNoYWRvdykpOworCQlzaGFkb3cgfD0gfnJlYWRsKGRpcl9vZVtwcml2LT5taW5vcl0pICYKKwkJCX4oYXJnICYgY2hhbmdlYWJsZV9iaXRzW3ByaXYtPm1pbm9yXSk7CisJCWkyY193cml0ZShWSVJUX0kyQ19BRERSLCAodm9pZCAqKSZzaGFkb3csIHNpemVvZihzaGFkb3cpKTsKKwkJc3Bpbl9sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCQlicmVhazsKKwljYXNlIElPX0hJR0hBTEFSTToKKwkJLyogU2V0IGFsYXJtIHdoZW4gYml0cyB3aXRoIDEgaW4gYXJnIGdvIGhpZ2guICovCisJCXByaXYtPmhpZ2hhbGFybSB8PSBhcmc7CisJCWJyZWFrOworCWNhc2UgSU9fTE9XQUxBUk06CisJCS8qIFNldCBhbGFybSB3aGVuIGJpdHMgd2l0aCAxIGluIGFyZyBnbyBsb3cuICovCisJCXByaXYtPmxvd2FsYXJtIHw9IGFyZzsKKwkJYnJlYWs7CisJY2FzZSBJT19DTFJBTEFSTToKKwkJLyogQ2xlYXIgYWxhcm0gZm9yIGJpdHMgd2l0aCAxIGluIGFyZy4gKi8KKwkJcHJpdi0+aGlnaGFsYXJtICY9IH5hcmc7CisJCXByaXYtPmxvd2FsYXJtICAmPSB+YXJnOworCQlicmVhazsKKwljYXNlIElPX0NGR19XUklURV9NT0RFOgorCXsKKwkJdW5zaWduZWQgbG9uZyBkaXJfc2hhZG93OworCQlkaXJfc2hhZG93ID0gcmVhZGwoZGlyX29lW3ByaXYtPm1pbm9yXSk7CisKKwkJcHJpdi0+Y2xrX21hc2sgPSBhcmcgJiAweEZGOworCQlwcml2LT5kYXRhX21hc2sgPSAoYXJnID4+IDgpICYgMHhGRjsKKwkJcHJpdi0+d3JpdGVfbXNiID0gKGFyZyA+PiAxNikgJiAweDAxOworCQkvKiBDaGVjayBpZiB3ZSdyZSBhbGxvd2VkIHRvIGNoYW5nZSB0aGUgYml0cyBhbmQKKwkJICogdGhlIGRpcmVjdGlvbiBpcyBjb3JyZWN0CisJCSAqLworCQlpZiAoISgocHJpdi0+Y2xrX21hc2sgJiBjaGFuZ2VhYmxlX2JpdHNbcHJpdi0+bWlub3JdKSAmJgorCQkgICAgICAocHJpdi0+ZGF0YV9tYXNrICYgY2hhbmdlYWJsZV9iaXRzW3ByaXYtPm1pbm9yXSkgJiYKKwkJICAgICAgKHByaXYtPmNsa19tYXNrICYgZGlyX3NoYWRvdykgJiYKKwkJICAgICAgKHByaXYtPmRhdGFfbWFzayAmIGRpcl9zaGFkb3cpKSkgeworCQkJcHJpdi0+Y2xrX21hc2sgPSAwOworCQkJcHJpdi0+ZGF0YV9tYXNrID0gMDsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgSU9fUkVBRF9JTkJJVFM6CisJCS8qICphcmcgaXMgcmVzdWx0IG9mIHJlYWRpbmcgdGhlIGlucHV0IHBpbnMgKi8KKwkJdmFsID0gY2FjaGVkX3ZpcnR1YWxfZ3Bpb19yZWFkICYgfnJlYWRsKGRpcl9vZVtwcml2LT5taW5vcl0pOworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnZhbCwgc2l6ZW9mKHZhbCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBJT19SRUFEX09VVEJJVFM6CisJCSAvKiAqYXJnIGlzIHJlc3VsdCBvZiByZWFkaW5nIHRoZSBvdXRwdXQgc2hhZG93ICovCisJCWkyY19yZWFkKFZJUlRfSTJDX0FERFIsICh2b2lkICopJnZhbCwgc2l6ZW9mKHZhbCkpOworCQl2YWwgJj0gcmVhZGwoZGlyX29lW3ByaXYtPm1pbm9yXSk7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdmFsLCBzaXplb2YodmFsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBJT19TRVRHRVRfSU5QVVQ6CisJeworCQkvKiBiaXRzIHNldCBpbiAqYXJnIGlzIHNldCB0byBpbnB1dCwKKwkJICogKmFyZyB1cGRhdGVkIHdpdGggY3VycmVudCBpbnB1dCBwaW5zLgorCQkgKi8KKwkJdW5zaWduZWQgc2hvcnQgaW5wdXRfbWFzayA9IH5yZWFkbChkaXJfb2VbcHJpdi0+bWlub3JdKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWwsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHZhbCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXZhbCA9IHNldGdldF9pbnB1dChwcml2LCB2YWwpOworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJnZhbCwgc2l6ZW9mKHZhbCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICgoaW5wdXRfbWFzayAmIHZhbCkgIT0gaW5wdXRfbWFzaykgeworCQkJLyogSW5wdXQgcGlucyBjaGFuZ2VkLiBBbGwgcG9ydHMgZGVzaXJlZCBhcyBpbnB1dAorCQkJICogc2hvdWxkIGJlIHNldCB0byBsb2dpYyAxLgorCQkJICovCisJCQl1bnNpZ25lZCBzaG9ydCBjaGFuZ2UgPSBpbnB1dF9tYXNrIF4gdmFsOworCQkJaTJjX3JlYWQoVklSVF9JMkNfQUREUiwgKHZvaWQgKikmc2hhZG93LAorCQkJCXNpemVvZihzaGFkb3cpKTsKKwkJCXNoYWRvdyAmPSB+Y2hhbmdlOworCQkJc2hhZG93IHw9IHZhbDsKKwkJCWkyY193cml0ZShWSVJUX0kyQ19BRERSLCAodm9pZCAqKSZzaGFkb3csCisJCQkJc2l6ZW9mKHNoYWRvdykpOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIElPX1NFVEdFVF9PVVRQVVQ6CisJCS8qIGJpdHMgc2V0IGluICphcmcgaXMgc2V0IHRvIG91dHB1dCwKKwkJICogKmFyZyB1cGRhdGVkIHdpdGggY3VycmVudCBvdXRwdXQgcGlucy4KKwkJICovCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZih2YWwpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl2YWwgPSBzZXRnZXRfb3V0cHV0KHByaXYsIHZhbCk7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmdmFsLCBzaXplb2YodmFsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSAvKiBzd2l0Y2ggKi8KKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfRVRSQVhfVklSVFVBTF9HUElPICovCisKK3N0YXRpYyBpbnQgZ3Bpb19sZWRzX2lvY3RsKHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuc2lnbmVkIGNoYXIgZ3JlZW47CisJdW5zaWduZWQgY2hhciByZWQ7CisKKwlzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworCWNhc2UgSU9fTEVEQUNUSVZFX1NFVDoKKwkJZ3JlZW4gPSAoKHVuc2lnbmVkIGNoYXIpIGFyZykgJiAxOworCQlyZWQgICA9ICgoKHVuc2lnbmVkIGNoYXIpIGFyZykgPj4gMSkgJiAxOworCQlDUklTX0xFRF9BQ1RJVkVfU0VUX0coZ3JlZW4pOworCQlDUklTX0xFRF9BQ1RJVkVfU0VUX1IocmVkKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9IC8qIHN3aXRjaCAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb19wd21fc2V0X21vZGUodW5zaWduZWQgbG9uZyBhcmcsIGludCBwd21fcG9ydCkKK3sKKwlpbnQgcGlubXV4X3B3bSA9IHBpbm11eF9wd20wICsgcHdtX3BvcnQ7CisJaW50IG1vZGU7CisJcmVnX2dpb19yd19wd20wX2N0cmwgcndfcHdtX2N0cmwgPSB7CisJCS5jY2RfdmFsID0gMCwKKwkJLmNjZF9vdmVycmlkZSA9IHJlZ2tfZ2lvX25vLAorCQkubW9kZSA9IHJlZ2tfZ2lvX25vCisJfTsKKwlpbnQgYWxsb2NzdGF0dXM7CisKKwlpZiAoZ2V0X3VzZXIobW9kZSwgJigoc3RydWN0IGlvX3B3bV9zZXRfbW9kZSAqKSBhcmcpLT5tb2RlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcndfcHdtX2N0cmwubW9kZSA9IG1vZGU7CisJaWYgKG1vZGUgIT0gUFdNX09GRikKKwkJYWxsb2NzdGF0dXMgPSBjcmlzdjMyX3Bpbm11eF9hbGxvY19maXhlZChwaW5tdXhfcHdtKTsKKwllbHNlCisJCWFsbG9jc3RhdHVzID0gY3Jpc3YzMl9waW5tdXhfZGVhbGxvY19maXhlZChwaW5tdXhfcHdtKTsKKwlpZiAoYWxsb2NzdGF0dXMpCisJCXJldHVybiBhbGxvY3N0YXR1czsKKwlSRUdfV1JJVEUocmVnX2dpb19yd19wd20wX2N0cmwsIFJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3B3bTBfY3RybCkgKworCQkxMiAqIHB3bV9wb3J0LCByd19wd21fY3RybCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb19wd21fc2V0X3BlcmlvZCh1bnNpZ25lZCBsb25nIGFyZywgaW50IHB3bV9wb3J0KQoreworCXN0cnVjdCBpb19wd21fc2V0X3BlcmlvZCBwZXJpb2RzOworCXJlZ19naW9fcndfcHdtMF92YXIgcndfcHdtX3dpZHRoczsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcGVyaW9kcywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YocGVyaW9kcykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAocGVyaW9kcy5sbyA+IDgxOTEgfHwgcGVyaW9kcy5oaSA+IDgxOTEpCisJCXJldHVybiAtRUlOVkFMOworCXJ3X3B3bV93aWR0aHMubG8gPSBwZXJpb2RzLmxvOworCXJ3X3B3bV93aWR0aHMuaGkgPSBwZXJpb2RzLmhpOworCVJFR19XUklURShyZWdfZ2lvX3J3X3B3bTBfdmFyLCBSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByd19wd20wX3ZhcikgKworCQkxMiAqIHB3bV9wb3J0LCByd19wd21fd2lkdGhzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBncGlvX3B3bV9zZXRfZHV0eSh1bnNpZ25lZCBsb25nIGFyZywgaW50IHB3bV9wb3J0KQoreworCXVuc2lnbmVkIGludCBkdXR5OworCXJlZ19naW9fcndfcHdtMF9kYXRhIHJ3X3B3bV9kdXR5OworCisJaWYgKGdldF91c2VyKGR1dHksICYoKHN0cnVjdCBpb19wd21fc2V0X2R1dHkgKikgYXJnKS0+ZHV0eSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChkdXR5ID4gMjU1KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyd19wd21fZHV0eS5kYXRhID0gZHV0eTsKKwlSRUdfV1JJVEUocmVnX2dpb19yd19wd20wX2RhdGEsIFJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3B3bTBfZGF0YSkgKworCQkxMiAqIHB3bV9wb3J0LCByd19wd21fZHV0eSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb19wd21faW9jdGwoc3RydWN0IGdwaW9fcHJpdmF0ZSAqcHJpdiwgdW5zaWduZWQgaW50IGNtZCwKKwl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcHdtX3BvcnQgPSBwcml2LT5taW5vciAtIEdQSU9fTUlOT1JfUFdNMDsKKworCXN3aXRjaCAoX0lPQ19OUihjbWQpKSB7CisJY2FzZSBJT19QV01fU0VUX01PREU6CisJCXJldHVybiBncGlvX3B3bV9zZXRfbW9kZShhcmcsIHB3bV9wb3J0KTsKKwljYXNlIElPX1BXTV9TRVRfUEVSSU9EOgorCQlyZXR1cm4gZ3Bpb19wd21fc2V0X3BlcmlvZChhcmcsIHB3bV9wb3J0KTsKKwljYXNlIElPX1BXTV9TRVRfRFVUWToKKwkJcmV0dXJuIGdwaW9fcHdtX3NldF9kdXR5KGFyZywgcHdtX3BvcnQpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ3Bpb19mb3BzID0geworCS5vd25lciAgICAgICA9IFRISVNfTU9EVUxFLAorCS5wb2xsICAgICAgICA9IGdwaW9fcG9sbCwKKwkuaW9jdGwgICAgICAgPSBncGlvX2lvY3RsLAorCS53cml0ZSAgICAgICA9IGdwaW9fd3JpdGUsCisJLm9wZW4gICAgICAgID0gZ3Bpb19vcGVuLAorCS5yZWxlYXNlICAgICA9IGdwaW9fcmVsZWFzZSwKK307CisKKyNpZmRlZiBDT05GSUdfRVRSQVhfVklSVFVBTF9HUElPCitzdGF0aWMgdm9pZCBfX2luaXQgdmlydHVhbF9ncGlvX2luaXQodm9pZCkKK3sKKwlyZWdfZ2lvX3J3X2ludHJfY2ZnIGludHJfY2ZnOworCXJlZ19naW9fcndfaW50cl9tYXNrIGludHJfbWFzazsKKwl1bnNpZ25lZCBzaG9ydCBzaGFkb3c7CisKKwlzaGFkb3cgPSB+dmlydHVhbF9yd19wdl9vZTsgLyogSW5wdXQgcG9ydHMgc2hvdWxkIGJlIHNldCB0byBsb2dpYyAxICovCisJc2hhZG93IHw9IENPTkZJR19FVFJBWF9ERUZfR0lPX1BWX09VVDsKKwlpMmNfd3JpdGUoVklSVF9JMkNfQUREUiwgKHZvaWQgKikmc2hhZG93LCBzaXplb2Yoc2hhZG93KSk7CisKKwkvKiBTZXQgaW50ZXJydXB0IG1hc2sgYW5kIG9uIHdoYXQgc3RhdGUgdGhlIGludGVycnVwdCBzaGFsbCB0cmlnZ2VyLgorCSAqIEZvciB2aXJ0dWFsIGdwaW8gdGhlIGludGVycnVwdCBzaGFsbCB0cmlnZ2VyIG9uIGxvZ2ljICcwJy4KKwkgKi8KKwlpbnRyX2NmZyA9IFJFR19SRChnaW8sIHJlZ2lfZ2lvLCByd19pbnRyX2NmZyk7CisJaW50cl9tYXNrID0gUkVHX1JEKGdpbywgcmVnaV9naW8sIHJ3X2ludHJfbWFzayk7CisKKwlzd2l0Y2ggKENPTkZJR19FVFJBWF9WSVJUVUFMX0dQSU9fSU5URVJSVVBUX1BBX1BJTikgeworCWNhc2UgMDoKKwkJaW50cl9jZmcucGEwID0gcmVna19naW9fbG87CisJCWludHJfbWFzay5wYTAgPSByZWdrX2dpb195ZXM7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaW50cl9jZmcucGExID0gcmVna19naW9fbG87CisJCWludHJfbWFzay5wYTEgPSByZWdrX2dpb195ZXM7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaW50cl9jZmcucGEyID0gcmVna19naW9fbG87CisJCWludHJfbWFzay5wYTIgPSByZWdrX2dpb195ZXM7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJaW50cl9jZmcucGEzID0gcmVna19naW9fbG87CisJCWludHJfbWFzay5wYTMgPSByZWdrX2dpb195ZXM7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJaW50cl9jZmcucGE0ID0gcmVna19naW9fbG87CisJCWludHJfbWFzay5wYTQgPSByZWdrX2dpb195ZXM7CisJCWJyZWFrOworCWNhc2UgNToKKwkJaW50cl9jZmcucGE1ID0gcmVna19naW9fbG87CisJCWludHJfbWFzay5wYTUgPSByZWdrX2dpb195ZXM7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJaW50cl9jZmcucGE2ID0gcmVna19naW9fbG87CisJCWludHJfbWFzay5wYTYgPSByZWdrX2dpb195ZXM7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJaW50cl9jZmcucGE3ID0gcmVna19naW9fbG87CisJCWludHJfbWFzay5wYTcgPSByZWdrX2dpb195ZXM7CisJCWJyZWFrOworCX0KKworCVJFR19XUihnaW8sIHJlZ2lfZ2lvLCByd19pbnRyX2NmZywgaW50cl9jZmcpOworCVJFR19XUihnaW8sIHJlZ2lfZ2lvLCByd19pbnRyX21hc2ssIGludHJfbWFzayk7Cit9CisjZW5kaWYKKworLyogbWFpbiBkcml2ZXIgaW5pdGlhbGl6YXRpb24gcm91dGluZSwgY2FsbGVkIGZyb20gbWVtLmMgKi8KKworc3RhdGljIGludCBfX2luaXQgZ3Bpb19pbml0KHZvaWQpCit7CisJaW50IHJlczsKKworCXByaW50ayhLRVJOX0lORk8gIkVUUkFYIEZTIEdQSU8gZHJpdmVyIHYyLjcsIChjKSAyMDAzLTIwMDggIgorCQkiQXhpcyBDb21tdW5pY2F0aW9ucyBBQlxuIik7CisKKwkvKiBkbyB0aGUgZm9ybWFsaXRpZXMgKi8KKworCXJlcyA9IHJlZ2lzdGVyX2NocmRldihHUElPX01BSk9SLCBncGlvX25hbWUsICZncGlvX2ZvcHMpOworCWlmIChyZXMgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZ3BpbzogY291bGRuJ3QgZ2V0IGEgbWFqb3IgbnVtYmVyLlxuIik7CisJCXJldHVybiByZXM7CisJfQorCisJLyogQ2xlYXIgYWxsIGxlZHMgKi8KKwlDUklTX0xFRF9ORVRXT1JLX0dSUDBfU0VUKDApOworCUNSSVNfTEVEX05FVFdPUktfR1JQMV9TRVQoMCk7CisJQ1JJU19MRURfQUNUSVZFX1NFVCgwKTsKKwlDUklTX0xFRF9ESVNLX1JFQUQoMCk7CisJQ1JJU19MRURfRElTS19XUklURSgwKTsKKworCWludCByZXMyID0gcmVxdWVzdF9pcnEoR0lPX0lOVFJfVkVDVCwgZ3Bpb19pbnRlcnJ1cHQsCisJCUlSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCwgImdwaW8iLCAmYWxhcm1saXN0KTsKKwlpZiAocmVzMikgeworCQlwcmludGsoS0VSTl9FUlIgImVycjogaXJxIGZvciBncGlvXG4iKTsKKwkJcmV0dXJuIHJlczI7CisJfQorCisJLyogTm8gSVJRcyBieSBkZWZhdWx0LiAqLworCVJFR19XUl9JTlQoZ2lvLCByZWdpX2dpbywgcndfaW50cl9waW5zLCAwKTsKKworI2lmZGVmIENPTkZJR19FVFJBWF9WSVJUVUFMX0dQSU8KKwl2aXJ0dWFsX2dwaW9faW5pdCgpOworI2VuZGlmCisKKwlyZXR1cm4gcmVzOworfQorCisvKiB0aGlzIG1ha2VzIHN1cmUgdGhhdCBncGlvX2luaXQgaXMgY2FsbGVkIGR1cmluZyBrZXJuZWwgYm9vdCAqLworCittb2R1bGVfaW5pdChncGlvX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvbWFjaC1hMy9uYW5kZmxhc2guYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL21hY2gtYTMvbmFuZGZsYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlZDBiZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL21hY2gtYTMvbmFuZGZsYXNoLmMKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiAgYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvbmFuZGZsYXNoLmMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA3CisgKgorICogIERlcml2ZWQgZnJvbSBkcml2ZXJzL210ZC9uYW5kL3NwaWEuYworICoJICBDb3B5cmlnaHQgKEMpIDIwMDAgU3RldmVuIEouIEhpbGwgKHNqaGlsbEByZWFsaXR5ZGlsdXRlZC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW1tYXAuaD4KKyNpbmNsdWRlIDxod3JlZ3MvcmVnX21hcC5oPgorI2luY2x1ZGUgPGh3cmVncy9yZWdfcmR3ci5oPgorI2luY2x1ZGUgPGh3cmVncy9waW9fZGVmcy5oPgorI2luY2x1ZGUgPHBpbm11eC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVmaW5lIE1BTlVBTF9BTEVfQ0xFX0NPTlRST0wgMQorCisjZGVmaW5lIHJlZ2ZfQUxFCWEwCisjZGVmaW5lIHJlZ2ZfQ0xFCWExCisjZGVmaW5lIHJlZ2ZfTkNFCWNlMF9uCisKKyNkZWZpbmUgQ0xFX0JJVCAxMAorI2RlZmluZSBBTEVfQklUIDExCisjZGVmaW5lIENFX0JJVCAxMgorCitzdHJ1Y3QgbXRkX2luZm9fd3JhcHBlciB7CisJc3RydWN0IG10ZF9pbmZvIGluZm87CisJc3RydWN0IG5hbmRfY2hpcCBjaGlwOworfTsKKworLyogQml0bWFzayBmb3IgY29udHJvbCBwaW5zICovCisjZGVmaW5lIFBJTl9CSVRNQVNLICgoMSA8PCBDRV9CSVQpIHwgKDEgPDwgQ0xFX0JJVCkgfCAoMSA8PCBBTEVfQklUKSkKKworc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqY3Jpc3YzMl9tdGQ7CisvKgorICoJaGFyZHdhcmUgc3BlY2lmaWMgYWNjZXNzIHRvIGNvbnRyb2wtbGluZXMKKyAqLworc3RhdGljIHZvaWQgY3Jpc3YzMl9od2NvbnRyb2woc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBjbWQsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgY3RybCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXJlZ19waW9fcndfZG91dCBkb3V0OworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKiBjb250cm9sIGJpdHMgY2hhbmdlICovCisJaWYgKGN0cmwgJiBOQU5EX0NUUkxfQ0hBTkdFKSB7CisJCWRvdXQgPSBSRUdfUkQocGlvLCByZWdpX3BpbywgcndfZG91dCk7CisJCWRvdXQucmVnZl9OQ0UgPSAoY3RybCAmIE5BTkRfTkNFKSA/IDAgOiAxOworCisjaWYgIU1BTlVBTF9BTEVfQ0xFX0NPTlRST0wKKwkJaWYgKGN0cmwgJiBOQU5EX0FMRSkgeworCQkJLyogQTAgPSBBTEUgaGlnaCAqLworCQkJdGhpcy0+SU9fQUREUl9XID0gKHZvaWQgX19pb21lbSAqKVJFR19BRERSKHBpbywKKwkJCQlyZWdpX3BpbywgcndfaW9fYWNjZXNzMSk7CisJCX0gZWxzZSBpZiAoY3RybCAmIE5BTkRfQ0xFKSB7CisJCQkvKiBBMSA9IENMRSBoaWdoICovCisJCQl0aGlzLT5JT19BRERSX1cgPSAodm9pZCBfX2lvbWVtICopUkVHX0FERFIocGlvLAorCQkJCXJlZ2lfcGlvLCByd19pb19hY2Nlc3MyKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEExID0gQ0xFIGFuZCBBMCA9IEFMRSBsb3cgKi8KKwkJCXRoaXMtPklPX0FERFJfVyA9ICh2b2lkIF9faW9tZW0gKilSRUdfQUREUihwaW8sCisJCQkJcmVnaV9waW8sIHJ3X2lvX2FjY2VzczApOworCQl9CisjZWxzZQorCisJCWRvdXQucmVnZl9DTEUgPSAoY3RybCAmIE5BTkRfQ0xFKSA/IDEgOiAwOworCQlkb3V0LnJlZ2ZfQUxFID0gKGN0cmwgJiBOQU5EX0FMRSkgPyAxIDogMDsKKyNlbmRpZgorCQlSRUdfV1IocGlvLCByZWdpX3BpbywgcndfZG91dCwgZG91dCk7CisJfQorCisJLyogY29tbWFuZCB0byBjaGlwICovCisJaWYgKGNtZCAhPSBOQU5EX0NNRF9OT05FKQorCQl3cml0ZWIoY21kLCB0aGlzLT5JT19BRERSX1cpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKgorKglyZWFkIGRldmljZSByZWFkeSBwaW4KKyovCitzdGF0aWMgaW50IGNyaXN2MzJfZGV2aWNlX3JlYWR5KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXJlZ19waW9fcl9kaW4gZGluID0gUkVHX1JEKHBpbywgcmVnaV9waW8sIHJfZGluKTsKKwlyZXR1cm4gZGluLnJkeTsKK30KKworLyoKKyAqIE1haW4gaW5pdGlhbGl6YXRpb24gcm91dGluZQorICovCitzdHJ1Y3QgbXRkX2luZm8gKl9faW5pdCBjcmlzdjMyX25hbmRfZmxhc2hfcHJvYmUodm9pZCkKK3sKKwl2b2lkIF9faW9tZW0gKnJlYWRfY3M7CisJdm9pZCBfX2lvbWVtICp3cml0ZV9jczsKKworCXN0cnVjdCBtdGRfaW5mb193cmFwcGVyICp3cmFwcGVyOworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXM7CisJaW50IGVyciA9IDA7CisKKwlyZWdfcGlvX3J3X21hbl9jdHJsIG1hbl9jdHJsID0geworCQkucmVnZl9OQ0UgPSByZWdrX3Bpb195ZXMsCisjaWYgTUFOVUFMX0FMRV9DTEVfQ09OVFJPTAorCQkucmVnZl9BTEUgPSByZWdrX3Bpb195ZXMsCisJCS5yZWdmX0NMRSA9IHJlZ2tfcGlvX3llcworI2VuZGlmCisJfTsKKwlyZWdfcGlvX3J3X29lIG9lID0geworCQkucmVnZl9OQ0UgPSByZWdrX3Bpb195ZXMsCisjaWYgTUFOVUFMX0FMRV9DTEVfQ09OVFJPTAorCQkucmVnZl9BTEUgPSByZWdrX3Bpb195ZXMsCisJCS5yZWdmX0NMRSA9IHJlZ2tfcGlvX3llcworI2VuZGlmCisJfTsKKwlyZWdfcGlvX3J3X2RvdXQgZG91dCA9IHsgLnJlZ2ZfTkNFID0gMSB9OworCisJLyogQWxsb2NhdGUgcGlvIHBpbnMgdG8gcGlvICovCisJY3Jpc3YzMl9waW5tdXhfYWxsb2NfZml4ZWQocGlubXV4X3Bpbyk7CisJLyogU2V0IHVwIENFLCBBTEUsIENMRSAoY2UwX24sIGEwLCBhMSkgZm9yIG1hbnVhbCBjb250cm9sIGFuZCBvdXRwdXQgKi8KKwlSRUdfV1IocGlvLCByZWdpX3BpbywgcndfbWFuX2N0cmwsIG1hbl9jdHJsKTsKKwlSRUdfV1IocGlvLCByZWdpX3BpbywgcndfZG91dCwgZG91dCk7CisJUkVHX1dSKHBpbywgcmVnaV9waW8sIHJ3X29lLCBvZSk7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIE1URCBkZXZpY2Ugc3RydWN0dXJlIGFuZCBwcml2YXRlIGRhdGEgKi8KKwl3cmFwcGVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG10ZF9pbmZvX3dyYXBwZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXdyYXBwZXIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgQ1JJU3YzMiBOQU5EIE1URCAiCisJCQkiZGV2aWNlIHN0cnVjdHVyZS5cbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZWFkX2NzID0gd3JpdGVfY3MgPSAodm9pZCBfX2lvbWVtICopUkVHX0FERFIocGlvLCByZWdpX3BpbywKKwkJcndfaW9fYWNjZXNzMCk7CisKKwkvKiBHZXQgcG9pbnRlciB0byBwcml2YXRlIGRhdGEgKi8KKwl0aGlzID0gJndyYXBwZXItPmNoaXA7CisJY3Jpc3YzMl9tdGQgPSAmd3JhcHBlci0+aW5mbzsKKworCS8qIExpbmsgdGhlIHByaXZhdGUgZGF0YSB3aXRoIHRoZSBNVEQgc3RydWN0dXJlICovCisJY3Jpc3YzMl9tdGQtPnByaXYgPSB0aGlzOworCisJLyogU2V0IGFkZHJlc3Mgb2YgTkFORCBJTyBsaW5lcyAqLworCXRoaXMtPklPX0FERFJfUiA9IHJlYWRfY3M7CisJdGhpcy0+SU9fQUREUl9XID0gd3JpdGVfY3M7CisJdGhpcy0+Y21kX2N0cmwgPSBjcmlzdjMyX2h3Y29udHJvbDsKKwl0aGlzLT5kZXZfcmVhZHkgPSBjcmlzdjMyX2RldmljZV9yZWFkeTsKKwkvKiAyMCB1cyBjb21tYW5kIGRlbGF5IHRpbWUgKi8KKwl0aGlzLT5jaGlwX2RlbGF5ID0gMjA7CisJdGhpcy0+ZWNjLm1vZGUgPSBOQU5EX0VDQ19TT0ZUOworCisJLyogRW5hYmxlIHRoZSBmb2xsb3dpbmcgZm9yIGEgZmxhc2ggYmFzZWQgYmFkIGJsb2NrIHRhYmxlICovCisJLyogdGhpcy0+b3B0aW9ucyA9IE5BTkRfVVNFX0ZMQVNIX0JCVDsgKi8KKworCS8qIFNjYW4gdG8gZmluZCBleGlzdGFuY2Ugb2YgdGhlIGRldmljZSAqLworCWlmIChuYW5kX3NjYW4oY3Jpc3YzMl9tdGQsIDEpKSB7CisJCWVyciA9IC1FTlhJTzsKKwkJZ290byBvdXRfbXRkOworCX0KKworCXJldHVybiBjcmlzdjMyX210ZDsKKworb3V0X210ZDoKKwlrZnJlZSh3cmFwcGVyKTsKKwlyZXR1cm4gTlVMTDsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvbWFjaC1mcy9NYWtlZmlsZSBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL21hY2gtZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM2ZDJhMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL21hY2gtZnMvTWFrZWZpbGUKQEAgLTAsMCArMSw2IEBACisjCisjIE1ha2VmaWxlIGZvciBFdHJheC1zcGVjaWZpYyBkcml2ZXJzCisjCisKK29iai0kKENPTkZJR19FVFJBWF9OQU5ERkxBU0gpICAgKz0gbmFuZGZsYXNoLm8KK29iai0kKENPTkZJR19FVFJBWF9HUElPKSAgICAgICAgKz0gZ3Bpby5vCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9tYWNoLWZzL2dwaW8uYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL21hY2gtZnMvZ3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NjNmZDQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9tYWNoLWZzL2dwaW8uYwpAQCAtMCwwICsxLDk3MSBAQAorLyoKKyAqIEVUUkFYIENSSVN2MzIgZ2VuZXJhbCBwb3J0IEkvTyBkZXZpY2UKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNiBBeGlzIENvbW11bmljYXRpb25zIEFCCisgKgorICogQXV0aG9yczogICAgQmpvcm4gV2VzZW4gICAgICAoaW5pdGlhbCB2ZXJzaW9uKQorICogICAgICAgICAgICAgT2xhIEtudXRzc29uICAgICAoTEVEIGhhbmRsaW5nKQorICogICAgICAgICAgICAgSm9oYW4gQWRvbGZzc29uICAocmVhZC9zZXQgZGlyZWN0aW9ucywgd3JpdGUsIHBvcnQgRywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgdG8gRVRSQVggRlMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSA8YXNtL2V0cmF4Z3Bpby5oPgorI2luY2x1ZGUgPGh3cmVncy9yZWdfbWFwLmg+CisjaW5jbHVkZSA8aHdyZWdzL3JlZ19yZHdyLmg+CisjaW5jbHVkZSA8aHdyZWdzL2dpb19kZWZzLmg+CisjaW5jbHVkZSA8aHdyZWdzL2ludHJfdmVjdF9kZWZzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2lmZGVmIENPTkZJR19FVFJBWF9WSVJUVUFMX0dQSU8KKyNpbmNsdWRlICIuLi9pMmMuaCIKKworI2RlZmluZSBWSVJUX0kyQ19BRERSIDB4NDAKKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIGdpbyBwb3J0cyBvbiBFVFJBWCBGUyBpcyBhdmFpbGFibGU6CisgKiBwYSAgOCBiaXRzLCBzdXBwb3J0cyBpbnRlcnJ1cHRzIG9mZiwgaGksIGxvdywgc2V0LCBwb3NlZGdlLCBuZWdlZGdlIGFueWVkZ2UKKyAqIHBiIDE4IGJpdHMKKyAqIHBjIDE4IGJpdHMKKyAqIHBkIDE4IGJpdHMKKyAqIHBlIDE4IGJpdHMKKyAqIGVhY2ggcG9ydCBoYXMgYSByd19weF9kb3V0LCByX3B4X2RpbiBhbmQgcndfcHhfb2UgcmVnaXN0ZXIuCisgKi8KKworI2RlZmluZSBHUElPX01BSk9SIDEyMCAgLyogZXhwZXJpbWVudGFsIE1BSk9SIG51bWJlciAqLworCisjZGVmaW5lIEQoeCkKKworI2lmIDAKK3N0YXRpYyBpbnQgZHBfY250OworI2RlZmluZSBEUCh4KSBcCisJZG8geyBcCisJCWRwX2NudCsrOyBcCisJCWlmIChkcF9jbnQgJSAxMDAwID09IDApIFwKKwkJCXg7IFwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgRFAoeCkKKyNlbmRpZgorCitzdGF0aWMgY2hhciBncGlvX25hbWVbXSA9ICJldHJheCBncGlvIjsKKworI2lmIDAKK3N0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCAqZ3Bpb193cTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0VUUkFYX1ZJUlRVQUxfR1BJTworc3RhdGljIGludCB2aXJ0dWFsX2dwaW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJdW5zaWduZWQgbG9uZyBhcmcpOworI2VuZGlmCitzdGF0aWMgaW50IGdwaW9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHNzaXplX3QgZ3Bpb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCisJbG9mZl90ICpvZmYpOworc3RhdGljIGludCBncGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOworc3RhdGljIGludCBncGlvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOworc3RhdGljIHVuc2lnbmVkIGludCBncGlvX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsCisJc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KTsKKworLyogcHJpdmF0ZSBkYXRhIHBlciBvcGVuKCkgb2YgdGhpcyBkcml2ZXIgKi8KKworc3RydWN0IGdwaW9fcHJpdmF0ZSB7CisJc3RydWN0IGdwaW9fcHJpdmF0ZSAqbmV4dDsKKwkvKiBUaGUgSU9fQ0ZHX1dSSVRFX01PREVfVkFMVUUgb25seSBzdXBwb3J0IDggYml0czogKi8KKwl1bnNpZ25lZCBjaGFyIGNsa19tYXNrOworCXVuc2lnbmVkIGNoYXIgZGF0YV9tYXNrOworCXVuc2lnbmVkIGNoYXIgd3JpdGVfbXNiOworCXVuc2lnbmVkIGNoYXIgcGFkMTsKKwkvKiBUaGVzZSBmaWVsZHMgYXJlIGdlbmVyaWMgKi8KKwl1bnNpZ25lZCBsb25nIGhpZ2hhbGFybSwgbG93YWxhcm07CisJd2FpdF9xdWV1ZV9oZWFkX3QgYWxhcm1fd3E7CisJaW50IG1pbm9yOworfTsKKworLyogbGlua2VkIGxpc3Qgb2YgYWxhcm1zIHRvIGNoZWNrIGZvciAqLworCitzdGF0aWMgc3RydWN0IGdwaW9fcHJpdmF0ZSAqYWxhcm1saXN0OworCitzdGF0aWMgaW50IGdwaW9fc29tZV9hbGFybXM7IC8qIFNldCBpZiBzb21lb25lIHVzZXMgYWxhcm0gKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdwaW9fcGFfaGlnaF9hbGFybXM7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBncGlvX3BhX2xvd19hbGFybXM7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWxhcm1fbG9jayk7CisKKyNkZWZpbmUgTlVNX1BPUlRTIChHUElPX01JTk9SX0xBU1QrMSkKKyNkZWZpbmUgR0lPX1JFR19SRF9BRERSKHJlZykgXAorCSh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKHJlZ2lfZ2lvICsgUkVHX1JEX0FERFJfZ2lvXyMjcmVnKQorI2RlZmluZSBHSU9fUkVHX1dSX0FERFIocmVnKSBcCisJKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikocmVnaV9naW8gKyBSRUdfUkRfQUREUl9naW9fIyNyZWcpCit1bnNpZ25lZCBsb25nIGxlZF9kdW1teTsKKyNpZmRlZiBDT05GSUdfRVRSQVhfVklSVFVBTF9HUElPCitzdGF0aWMgdW5zaWduZWQgbG9uZyB2aXJ0dWFsX2R1bW15Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgdmlydHVhbF9yd19wdl9vZSA9IENPTkZJR19FVFJBWF9ERUZfR0lPX1BWX09FOworc3RhdGljIHVuc2lnbmVkIHNob3J0IGNhY2hlZF92aXJ0dWFsX2dwaW9fcmVhZDsKKyNlbmRpZgorCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqZGF0YV9vdXRbTlVNX1BPUlRTXSA9IHsKKwlHSU9fUkVHX1dSX0FERFIocndfcGFfZG91dCksCisJR0lPX1JFR19XUl9BRERSKHJ3X3BiX2RvdXQpLAorCSZsZWRfZHVtbXksCisJR0lPX1JFR19XUl9BRERSKHJ3X3BjX2RvdXQpLAorCUdJT19SRUdfV1JfQUREUihyd19wZF9kb3V0KSwKKwlHSU9fUkVHX1dSX0FERFIocndfcGVfZG91dCksCisjaWZkZWYgQ09ORklHX0VUUkFYX1ZJUlRVQUxfR1BJTworCSZ2aXJ0dWFsX2R1bW15LAorI2VuZGlmCit9OworCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqZGF0YV9pbltOVU1fUE9SVFNdID0geworCUdJT19SRUdfUkRfQUREUihyX3BhX2RpbiksCisJR0lPX1JFR19SRF9BRERSKHJfcGJfZGluKSwKKwkmbGVkX2R1bW15LAorCUdJT19SRUdfUkRfQUREUihyX3BjX2RpbiksCisJR0lPX1JFR19SRF9BRERSKHJfcGRfZGluKSwKKwlHSU9fUkVHX1JEX0FERFIocl9wZV9kaW4pLAorI2lmZGVmIENPTkZJR19FVFJBWF9WSVJUVUFMX0dQSU8KKwkmdmlydHVhbF9kdW1teSwKKyNlbmRpZgorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2hhbmdlYWJsZV9kaXJbTlVNX1BPUlRTXSA9IHsKKwlDT05GSUdfRVRSQVhfUEFfQ0hBTkdFQUJMRV9ESVIsCisJQ09ORklHX0VUUkFYX1BCX0NIQU5HRUFCTEVfRElSLAorCTAsCisJQ09ORklHX0VUUkFYX1BDX0NIQU5HRUFCTEVfRElSLAorCUNPTkZJR19FVFJBWF9QRF9DSEFOR0VBQkxFX0RJUiwKKwlDT05GSUdfRVRSQVhfUEVfQ0hBTkdFQUJMRV9ESVIsCisjaWZkZWYgQ09ORklHX0VUUkFYX1ZJUlRVQUxfR1BJTworCUNPTkZJR19FVFJBWF9QVl9DSEFOR0VBQkxFX0RJUiwKKyNlbmRpZgorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2hhbmdlYWJsZV9iaXRzW05VTV9QT1JUU10gPSB7CisJQ09ORklHX0VUUkFYX1BBX0NIQU5HRUFCTEVfQklUUywKKwlDT05GSUdfRVRSQVhfUEJfQ0hBTkdFQUJMRV9CSVRTLAorCTAsCisJQ09ORklHX0VUUkFYX1BDX0NIQU5HRUFCTEVfQklUUywKKwlDT05GSUdfRVRSQVhfUERfQ0hBTkdFQUJMRV9CSVRTLAorCUNPTkZJR19FVFJBWF9QRV9DSEFOR0VBQkxFX0JJVFMsCisjaWZkZWYgQ09ORklHX0VUUkFYX1ZJUlRVQUxfR1BJTworCUNPTkZJR19FVFJBWF9QVl9DSEFOR0VBQkxFX0JJVFMsCisjZW5kaWYKK307CisKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpkaXJfb2VbTlVNX1BPUlRTXSA9IHsKKwlHSU9fUkVHX1dSX0FERFIocndfcGFfb2UpLAorCUdJT19SRUdfV1JfQUREUihyd19wYl9vZSksCisJJmxlZF9kdW1teSwKKwlHSU9fUkVHX1dSX0FERFIocndfcGNfb2UpLAorCUdJT19SRUdfV1JfQUREUihyd19wZF9vZSksCisJR0lPX1JFR19XUl9BRERSKHJ3X3BlX29lKSwKKyNpZmRlZiBDT05GSUdfRVRSQVhfVklSVFVBTF9HUElPCisJJnZpcnR1YWxfcndfcHZfb2UsCisjZW5kaWYKK307CisKKworCitzdGF0aWMgdW5zaWduZWQgaW50IGdwaW9fcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKwlzdHJ1Y3QgZ3Bpb19wcml2YXRlICpwcml2ID0gKHN0cnVjdCBncGlvX3ByaXZhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCXBvbGxfd2FpdChmaWxlLCAmcHJpdi0+YWxhcm1fd3EsIHdhaXQpOworCWlmIChwcml2LT5taW5vciA9PSBHUElPX01JTk9SX0EpIHsKKwkJcmVnX2dpb19yd19pbnRyX2NmZyBpbnRyX2NmZzsKKwkJdW5zaWduZWQgbG9uZyB0bXA7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlkYXRhID0gUkVHX1RZUEVfQ09OVih1bnNpZ25lZCBsb25nLCByZWdfZ2lvX3JfcGFfZGluLAorCQkJUkVHX1JEKGdpbywgcmVnaV9naW8sIHJfcGFfZGluKSk7CisJCS8qIFBBIGhhcyBzdXBwb3J0IGZvciBpbnRlcnJ1cHQKKwkJICogbGV0cyBhY3RpdmF0ZSBoaWdoIGZvciB0aG9zZSBsb3cgYW5kIHdpdGggaGlnaGFsYXJtIHNldAorCQkgKi8KKwkJaW50cl9jZmcgPSBSRUdfUkQoZ2lvLCByZWdpX2dpbywgcndfaW50cl9jZmcpOworCisJCXRtcCA9IH5kYXRhICYgcHJpdi0+aGlnaGFsYXJtICYgMHhGRjsKKwkJaWYgKHRtcCAmICgxIDw8IDApKQorCQkJaW50cl9jZmcucGEwID0gcmVna19naW9faGk7CisJCWlmICh0bXAgJiAoMSA8PCAxKSkKKwkJCWludHJfY2ZnLnBhMSA9IHJlZ2tfZ2lvX2hpOworCQlpZiAodG1wICYgKDEgPDwgMikpCisJCQlpbnRyX2NmZy5wYTIgPSByZWdrX2dpb19oaTsKKwkJaWYgKHRtcCAmICgxIDw8IDMpKQorCQkJaW50cl9jZmcucGEzID0gcmVna19naW9faGk7CisJCWlmICh0bXAgJiAoMSA8PCA0KSkKKwkJCWludHJfY2ZnLnBhNCA9IHJlZ2tfZ2lvX2hpOworCQlpZiAodG1wICYgKDEgPDwgNSkpCisJCQlpbnRyX2NmZy5wYTUgPSByZWdrX2dpb19oaTsKKwkJaWYgKHRtcCAmICgxIDw8IDYpKQorCQkJaW50cl9jZmcucGE2ID0gcmVna19naW9faGk7CisJCWlmICh0bXAgJiAoMSA8PCA3KSkKKwkJCWludHJfY2ZnLnBhNyA9IHJlZ2tfZ2lvX2hpOworCQkvKgorCQkgKiBsZXRzIGFjdGl2YXRlIGxvdyBmb3IgdGhvc2UgaGlnaCBhbmQgd2l0aCBsb3dhbGFybSBzZXQKKwkJICovCisJCXRtcCA9IGRhdGEgJiBwcml2LT5sb3dhbGFybSAmIDB4RkY7CisJCWlmICh0bXAgJiAoMSA8PCAwKSkKKwkJCWludHJfY2ZnLnBhMCA9IHJlZ2tfZ2lvX2xvOworCQlpZiAodG1wICYgKDEgPDwgMSkpCisJCQlpbnRyX2NmZy5wYTEgPSByZWdrX2dpb19sbzsKKwkJaWYgKHRtcCAmICgxIDw8IDIpKQorCQkJaW50cl9jZmcucGEyID0gcmVna19naW9fbG87CisJCWlmICh0bXAgJiAoMSA8PCAzKSkKKwkJCWludHJfY2ZnLnBhMyA9IHJlZ2tfZ2lvX2xvOworCQlpZiAodG1wICYgKDEgPDwgNCkpCisJCQlpbnRyX2NmZy5wYTQgPSByZWdrX2dpb19sbzsKKwkJaWYgKHRtcCAmICgxIDw8IDUpKQorCQkJaW50cl9jZmcucGE1ID0gcmVna19naW9fbG87CisJCWlmICh0bXAgJiAoMSA8PCA2KSkKKwkJCWludHJfY2ZnLnBhNiA9IHJlZ2tfZ2lvX2xvOworCQlpZiAodG1wICYgKDEgPDwgNykpCisJCQlpbnRyX2NmZy5wYTcgPSByZWdrX2dpb19sbzsKKworCQlSRUdfV1IoZ2lvLCByZWdpX2dpbywgcndfaW50cl9jZmcsIGludHJfY2ZnKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0gZWxzZSBpZiAocHJpdi0+bWlub3IgPD0gR1BJT19NSU5PUl9FKQorCQlkYXRhID0gKmRhdGFfaW5bcHJpdi0+bWlub3JdOworCWVsc2UKKwkJcmV0dXJuIDA7CisKKwlpZiAoKGRhdGEgJiBwcml2LT5oaWdoYWxhcm0pIHx8ICh+ZGF0YSAmIHByaXYtPmxvd2FsYXJtKSkKKwkJbWFzayA9IFBPTExJTnxQT0xMUkROT1JNOworCisJRFAocHJpbnRrKEtFUk5fREVCVUcgImdwaW9fcG9sbCByZWFkeTogbWFzayAweCUwOFhcbiIsIG1hc2spKTsKKwlyZXR1cm4gbWFzazsKK30KKworaW50IGV0cmF4X2dwaW9fd2FrZV91cF9jaGVjayh2b2lkKQoreworCXN0cnVjdCBncGlvX3ByaXZhdGUgKnByaXY7CisJdW5zaWduZWQgbG9uZyBkYXRhID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCXNwaW5fbG9ja19pcnFzYXZlKCZhbGFybV9sb2NrLCBmbGFncyk7CisJcHJpdiA9IGFsYXJtbGlzdDsKKwl3aGlsZSAocHJpdikgeworI2lmZGVmIENPTkZJR19FVFJBWF9WSVJUVUFMX0dQSU8KKwkJaWYgKHByaXYtPm1pbm9yID09IEdQSU9fTUlOT1JfVikKKwkJCWRhdGEgPSAodW5zaWduZWQgbG9uZyljYWNoZWRfdmlydHVhbF9ncGlvX3JlYWQ7CisJCWVsc2UgeworCQkJZGF0YSA9ICpkYXRhX2luW3ByaXYtPm1pbm9yXTsKKwkJCWlmIChwcml2LT5taW5vciA9PSBHUElPX01JTk9SX0EpCisJCQkJcHJpdi0+bG93YWxhcm0gfD0gKDEgPDwgQ09ORklHX0VUUkFYX1ZJUlRVQUxfR1BJT19JTlRFUlJVUFRfUEFfUElOKTsKKwkJfQorI2Vsc2UKKwkJZGF0YSA9ICpkYXRhX2luW3ByaXYtPm1pbm9yXTsKKyNlbmRpZgorCQlpZiAoKGRhdGEgJiBwcml2LT5oaWdoYWxhcm0pIHx8CisJCSAgICAofmRhdGEgJiBwcml2LT5sb3dhbGFybSkpIHsKKwkJCURQKHByaW50ayhLRVJOX0RFQlVHCisJCQkJImV0cmF4X2dwaW9fd2FrZV91cF9jaGVjayAlaVxuIiwgcHJpdi0+bWlub3IpKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+YWxhcm1fd3EpOworCQkJcmV0ID0gMTsKKwkJfQorCQlwcml2ID0gcHJpdi0+bmV4dDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWxhcm1fbG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAorZ3Bpb19wb2xsX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJaWYgKGdwaW9fc29tZV9hbGFybXMpCisJCXJldHVybiBJUlFfUkVUVkFMKGV0cmF4X2dwaW9fd2FrZV91cF9jaGVjaygpKTsKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAorZ3Bpb19wYV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXJlZ19naW9fcndfaW50cl9tYXNrIGludHJfbWFzazsKKwlyZWdfZ2lvX3JfbWFza2VkX2ludHIgbWFza2VkX2ludHI7CisJcmVnX2dpb19yd19hY2tfaW50ciBhY2tfaW50cjsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwl1bnNpZ25lZCBsb25nIHRtcDI7CisjaWZkZWYgQ09ORklHX0VUUkFYX1ZJUlRVQUxfR1BJTworCXVuc2lnbmVkIGNoYXIgZW5hYmxlX2dwaW92X2FjayA9IDA7CisjZW5kaWYKKworCS8qIEZpbmQgd2hhdCBQQSBpbnRlcnJ1cHRzIGFyZSBhY3RpdmUgKi8KKwltYXNrZWRfaW50ciA9IFJFR19SRChnaW8sIHJlZ2lfZ2lvLCByX21hc2tlZF9pbnRyKTsKKwl0bXAgPSBSRUdfVFlQRV9DT05WKHVuc2lnbmVkIGxvbmcsIHJlZ19naW9fcl9tYXNrZWRfaW50ciwgbWFza2VkX2ludHIpOworCisJLyogRmluZCB0aG9zZSB0aGF0IHdlIGhhdmUgZW5hYmxlZCAqLworCXNwaW5fbG9jaygmYWxhcm1fbG9jayk7CisJdG1wICY9IChncGlvX3BhX2hpZ2hfYWxhcm1zIHwgZ3Bpb19wYV9sb3dfYWxhcm1zKTsKKwlzcGluX3VubG9jaygmYWxhcm1fbG9jayk7CisKKyNpZmRlZiBDT05GSUdfRVRSQVhfVklSVFVBTF9HUElPCisJLyogU29tZXRoaW5nIGNoYW5nZWQgb24gdmlydHVhbCBHUElPLiBJbnRlcnJ1cHQgaXMgYWNrZWQgYnkKKwkgKiByZWFkaW5nIHRoZSBkZXZpY2UuCisJICovCisJaWYgKHRtcCAmICgxIDw8IENPTkZJR19FVFJBWF9WSVJUVUFMX0dQSU9fSU5URVJSVVBUX1BBX1BJTikpIHsKKwkJaTJjX3JlYWQoVklSVF9JMkNfQUREUiwgKHZvaWQgKikmY2FjaGVkX3ZpcnR1YWxfZ3Bpb19yZWFkLAorCQkJc2l6ZW9mKGNhY2hlZF92aXJ0dWFsX2dwaW9fcmVhZCkpOworCQllbmFibGVfZ3Bpb3ZfYWNrID0gMTsKKwl9CisjZW5kaWYKKworCS8qIEFjayB0aGVtICovCisJYWNrX2ludHIgPSBSRUdfVFlQRV9DT05WKHJlZ19naW9fcndfYWNrX2ludHIsIHVuc2lnbmVkIGxvbmcsIHRtcCk7CisJUkVHX1dSKGdpbywgcmVnaV9naW8sIHJ3X2Fja19pbnRyLCBhY2tfaW50cik7CisKKwkvKiBEaXNhYmxlIHRob3NlIGludGVycnVwdHMuLiAqLworCWludHJfbWFzayA9IFJFR19SRChnaW8sIHJlZ2lfZ2lvLCByd19pbnRyX21hc2spOworCXRtcDIgPSBSRUdfVFlQRV9DT05WKHVuc2lnbmVkIGxvbmcsIHJlZ19naW9fcndfaW50cl9tYXNrLCBpbnRyX21hc2spOworCXRtcDIgJj0gfnRtcDsKKyNpZmRlZiBDT05GSUdfRVRSQVhfVklSVFVBTF9HUElPCisJLyogRG8gbm90IGRpc2FibGUgaW50ZXJydXB0IG9uIHZpcnR1YWwgR1BJTy4gQ2hhbmdlcyBvbiB2aXJ0dWFsCisJICogcGlucyBhcmUgb25seSBub3RpY2VkIGJ5IGFuIGludGVycnVwdC4KKwkgKi8KKwlpZiAoZW5hYmxlX2dwaW92X2FjaykKKwkJdG1wMiB8PSAoMSA8PCBDT05GSUdfRVRSQVhfVklSVFVBTF9HUElPX0lOVEVSUlVQVF9QQV9QSU4pOworI2VuZGlmCisJaW50cl9tYXNrID0gUkVHX1RZUEVfQ09OVihyZWdfZ2lvX3J3X2ludHJfbWFzaywgdW5zaWduZWQgbG9uZywgdG1wMik7CisJUkVHX1dSKGdpbywgcmVnaV9naW8sIHJ3X2ludHJfbWFzaywgaW50cl9tYXNrKTsKKworCWlmIChncGlvX3NvbWVfYWxhcm1zKQorCQlyZXR1cm4gSVJRX1JFVFZBTChldHJheF9ncGlvX3dha2VfdXBfY2hlY2soKSk7CisJcmV0dXJuIElSUV9OT05FOworfQorCisKK3N0YXRpYyBzc2l6ZV90IGdwaW9fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCWxvZmZfdCAqb2ZmKQoreworCXN0cnVjdCBncGlvX3ByaXZhdGUgKnByaXYgPSAoc3RydWN0IGdwaW9fcHJpdmF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBjaGFyIGRhdGEsIGNsa19tYXNrLCBkYXRhX21hc2ssIHdyaXRlX21zYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgc2hhZG93OworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnBvcnQ7CisJc3NpemVfdCByZXR2YWwgPSBjb3VudDsKKwkvKiBPbmx5IGJpdHMgMC03IG1heSBiZSB1c2VkIGZvciB3cml0ZSBvcGVyYXRpb25zIGJ1dCBhbGxvdyBhbGwKKwkgICBkZXZpY2VzIGV4Y2VwdCBsZWRzLi4uICovCisjaWZkZWYgQ09ORklHX0VUUkFYX1ZJUlRVQUxfR1BJTworCWlmIChwcml2LT5taW5vciA9PSBHUElPX01JTk9SX1YpCisJCXJldHVybiAtRUZBVUxUOworI2VuZGlmCisJaWYgKHByaXYtPm1pbm9yID09IEdQSU9fTUlOT1JfTEVEUykKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWNsa19tYXNrID0gcHJpdi0+Y2xrX21hc2s7CisJZGF0YV9tYXNrID0gcHJpdi0+ZGF0YV9tYXNrOworCS8qIEl0IG11c3QgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQgdXNpbmcgdGhlIElPX0NGR19XUklURV9NT0RFICovCisJLyogUGVyaGFwcyBhIGJldHRlciBlcnJvciBjb2RlPyAqLworCWlmIChjbGtfbWFzayA9PSAwIHx8IGRhdGFfbWFzayA9PSAwKQorCQlyZXR1cm4gLUVQRVJNOworCXdyaXRlX21zYiA9IHByaXYtPndyaXRlX21zYjsKKwlEKHByaW50ayhLRVJOX0RFQlVHICJncGlvX3dyaXRlOiAlbHUgdG8gZGF0YSAweCUwMlggY2xrIDB4JTAyWCAiCisJCSJtc2I6ICVpXG4iLCBjb3VudCwgZGF0YV9tYXNrLCBjbGtfbWFzaywgd3JpdGVfbXNiKSk7CisJcG9ydCA9IGRhdGFfb3V0W3ByaXYtPm1pbm9yXTsKKworCXdoaWxlIChjb3VudC0tKSB7CisJCWludCBpOworCQlkYXRhID0gKmJ1ZisrOworCQlpZiAocHJpdi0+d3JpdGVfbXNiKSB7CisJCQlmb3IgKGkgPSA3OyBpID49IDA7IGktLSkgeworCQkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCQlzaGFkb3cgPSAqcG9ydDsKKwkJCQkqcG9ydCA9IHNoYWRvdyAmPSB+Y2xrX21hc2s7CisJCQkJaWYgKGRhdGEgJiAxPDxpKQorCQkJCQkqcG9ydCA9IHNoYWRvdyB8PSBkYXRhX21hc2s7CisJCQkJZWxzZQorCQkJCQkqcG9ydCA9IHNoYWRvdyAmPSB+ZGF0YV9tYXNrOworCQkJLyogRm9yIEZQR0E6IG1pbiA1LjBucyAoRENDKSBiZWZvcmUgQ0NMSyBoaWdoICovCisJCQkJKnBvcnQgPSBzaGFkb3cgfD0gY2xrX21hc2s7CisJCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJfQorCQl9IGVsc2UgeworCQkJZm9yIChpID0gMDsgaSA8PSA3OyBpKyspIHsKKwkJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCQkJc2hhZG93ID0gKnBvcnQ7CisJCQkJKnBvcnQgPSBzaGFkb3cgJj0gfmNsa19tYXNrOworCQkJCWlmIChkYXRhICYgMTw8aSkKKwkJCQkJKnBvcnQgPSBzaGFkb3cgfD0gZGF0YV9tYXNrOworCQkJCWVsc2UKKwkJCQkJKnBvcnQgPSBzaGFkb3cgJj0gfmRhdGFfbWFzazsKKwkJCS8qIEZvciBGUEdBOiBtaW4gNS4wbnMgKERDQykgYmVmb3JlIENDTEsgaGlnaCAqLworCQkJCSpwb3J0ID0gc2hhZG93IHw9IGNsa19tYXNrOworCQkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisKKworc3RhdGljIGludAorZ3Bpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBncGlvX3ByaXZhdGUgKnByaXY7CisJaW50IHAgPSBpbWlub3IoaW5vZGUpOworCisJaWYgKHAgPiBHUElPX01JTk9SX0xBU1QpCisJCXJldHVybiAtRUlOVkFMOworCisJcHJpdiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBncGlvX3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKKworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KHByaXYsIDAsIHNpemVvZigqcHJpdikpOworCisJcHJpdi0+bWlub3IgPSBwOworCisJLyogaW5pdGlhbGl6ZSB0aGUgaW8vYWxhcm0gc3RydWN0ICovCisKKwlwcml2LT5jbGtfbWFzayA9IDA7CisJcHJpdi0+ZGF0YV9tYXNrID0gMDsKKwlwcml2LT5oaWdoYWxhcm0gPSAwOworCXByaXYtPmxvd2FsYXJtID0gMDsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcml2LT5hbGFybV93cSk7CisKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKXByaXY7CisKKwkvKiBsaW5rIGl0IGludG8gb3VyIGFsYXJtbGlzdCAqLworCXNwaW5fbG9ja19pcnEoJmFsYXJtX2xvY2spOworCXByaXYtPm5leHQgPSBhbGFybWxpc3Q7CisJYWxhcm1saXN0ID0gcHJpdjsKKwlzcGluX3VubG9ja19pcnEoJmFsYXJtX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2dwaW9fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgZ3Bpb19wcml2YXRlICpwOworCXN0cnVjdCBncGlvX3ByaXZhdGUgKnRvZGVsOworCS8qIGxvY2FsIGNvcGllcyB3aGlsZSB1cGRhdGluZyB0aGVtOiAqLworCXVuc2lnbmVkIGxvbmcgYV9oaWdoLCBhX2xvdzsKKwl1bnNpZ25lZCBsb25nIHNvbWVfYWxhcm1zOworCisJLyogdW5saW5rIGZyb20gYWxhcm1saXN0IGFuZCBmcmVlIHRoZSBwcml2YXRlIHN0cnVjdHVyZSAqLworCisJc3Bpbl9sb2NrX2lycSgmYWxhcm1fbG9jayk7CisJcCA9IGFsYXJtbGlzdDsKKwl0b2RlbCA9IChzdHJ1Y3QgZ3Bpb19wcml2YXRlICopZmlscC0+cHJpdmF0ZV9kYXRhOworCisJaWYgKHAgPT0gdG9kZWwpIHsKKwkJYWxhcm1saXN0ID0gdG9kZWwtPm5leHQ7CisJfSBlbHNlIHsKKwkJd2hpbGUgKHAtPm5leHQgIT0gdG9kZWwpCisJCQlwID0gcC0+bmV4dDsKKwkJcC0+bmV4dCA9IHRvZGVsLT5uZXh0OworCX0KKworCWtmcmVlKHRvZGVsKTsKKwkvKiBDaGVjayBpZiB0aGVyZSBhcmUgc3RpbGwgYW55IGFsYXJtcyBzZXQgKi8KKwlwID0gYWxhcm1saXN0OworCXNvbWVfYWxhcm1zID0gMDsKKwlhX2hpZ2ggPSAwOworCWFfbG93ID0gMDsKKwl3aGlsZSAocCkgeworCQlpZiAocC0+bWlub3IgPT0gR1BJT19NSU5PUl9BKSB7CisjaWZkZWYgQ09ORklHX0VUUkFYX1ZJUlRVQUxfR1BJTworCQkJcC0+bG93YWxhcm0gfD0gKDEgPDwgQ09ORklHX0VUUkFYX1ZJUlRVQUxfR1BJT19JTlRFUlJVUFRfUEFfUElOKTsKKyNlbmRpZgorCQkJYV9oaWdoIHw9IHAtPmhpZ2hhbGFybTsKKwkJCWFfbG93IHw9IHAtPmxvd2FsYXJtOworCQl9CisKKwkJaWYgKHAtPmhpZ2hhbGFybSB8IHAtPmxvd2FsYXJtKQorCQkJc29tZV9hbGFybXMgPSAxOworCQlwID0gcC0+bmV4dDsKKwl9CisKKyNpZmRlZiBDT05GSUdfRVRSQVhfVklSVFVBTF9HUElPCisJLyogVmFyaWFibGVzICdzb21lX2FsYXJtcycgYW5kICdhX2xvdycgbmVlZHMgdG8gYmUgc2V0IGhlcmUgYWdhaW4KKwkgKiB0byBlbnN1cmUgdGhhdCBpbnRlcnJ1cHQgZm9yIHZpcnR1YWwgR1BJTyBpcyBoYW5kbGVkLgorCSAqLworCXNvbWVfYWxhcm1zID0gMTsKKwlhX2xvdyB8PSAoMSA8PCBDT05GSUdfRVRSQVhfVklSVFVBTF9HUElPX0lOVEVSUlVQVF9QQV9QSU4pOworI2VuZGlmCisKKwlncGlvX3NvbWVfYWxhcm1zID0gc29tZV9hbGFybXM7CisJZ3Bpb19wYV9oaWdoX2FsYXJtcyA9IGFfaGlnaDsKKwlncGlvX3BhX2xvd19hbGFybXMgPSBhX2xvdzsKKwlzcGluX3VubG9ja19pcnEoJmFsYXJtX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qIE1haW4gZGV2aWNlIEFQSS4gaW9jdGwncyB0byByZWFkL3NldC9jbGVhciBiaXRzLCBhcyB3ZWxsIGFzIHRvCisgKiBzZXQgYWxhcm1zIHRvIHdhaXQgZm9yIHVzaW5nIGEgc3Vic2VxdWVudCBzZWxlY3QoKS4KKyAqLworCitpbmxpbmUgdW5zaWduZWQgbG9uZyBzZXRnZXRfaW5wdXQoc3RydWN0IGdwaW9fcHJpdmF0ZSAqcHJpdiwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJLyogU2V0IGRpcmVjdGlvbiAwPXVuY2hhbmdlZCAxPWlucHV0LAorCSAqIHJldHVybiBtYXNrIHdpdGggMT1pbnB1dAorCSAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBkaXJfc2hhZG93OworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWRpcl9zaGFkb3cgPSAqZGlyX29lW3ByaXYtPm1pbm9yXTsKKwlkaXJfc2hhZG93ICY9IH4oYXJnICYgY2hhbmdlYWJsZV9kaXJbcHJpdi0+bWlub3JdKTsKKwkqZGlyX29lW3ByaXYtPm1pbm9yXSA9IGRpcl9zaGFkb3c7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJaWYgKHByaXYtPm1pbm9yID09IEdQSU9fTUlOT1JfQSkKKwkJZGlyX3NoYWRvdyBePSAweEZGOyAgICAvKiBPbmx5IDggYml0cyAqLworI2lmZGVmIENPTkZJR19FVFJBWF9WSVJUVUFMX0dQSU8KKwllbHNlIGlmIChwcml2LT5taW5vciA9PSBHUElPX01JTk9SX1YpCisJCWRpcl9zaGFkb3cgXj0gMHhGRkZGOyAgLyogT25seSAxNiBiaXRzICovCisjZW5kaWYKKwllbHNlCisJCWRpcl9zaGFkb3cgXj0gMHgzRkZGRjsgLyogT25seSAxOCBiaXRzICovCisJcmV0dXJuIGRpcl9zaGFkb3c7CisKK30gLyogc2V0Z2V0X2lucHV0ICovCisKK2lubGluZSB1bnNpZ25lZCBsb25nIHNldGdldF9vdXRwdXQoc3RydWN0IGdwaW9fcHJpdmF0ZSAqcHJpdiwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGRpcl9zaGFkb3c7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJZGlyX3NoYWRvdyA9ICpkaXJfb2VbcHJpdi0+bWlub3JdOworCWRpcl9zaGFkb3cgfD0gIChhcmcgJiBjaGFuZ2VhYmxlX2Rpcltwcml2LT5taW5vcl0pOworCSpkaXJfb2VbcHJpdi0+bWlub3JdID0gZGlyX3NoYWRvdzsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIGRpcl9zaGFkb3c7Cit9IC8qIHNldGdldF9vdXRwdXQgKi8KKworc3RhdGljIGludAorZ3Bpb19sZWRzX2lvY3RsKHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworc3RhdGljIGludAorZ3Bpb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdmFsOworCXVuc2lnbmVkIGxvbmcgc2hhZG93OworCXN0cnVjdCBncGlvX3ByaXZhdGUgKnByaXYgPSAoc3RydWN0IGdwaW9fcHJpdmF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoX0lPQ19UWVBFKGNtZCkgIT0gRVRSQVhHUElPX0lPQ1RZUEUpCisJCXJldHVybiAtRUlOVkFMOworCisjaWZkZWYgQ09ORklHX0VUUkFYX1ZJUlRVQUxfR1BJTworCWlmIChwcml2LT5taW5vciA9PSBHUElPX01JTk9SX1YpCisJCXJldHVybiB2aXJ0dWFsX2dwaW9faW9jdGwoZmlsZSwgY21kLCBhcmcpOworI2VuZGlmCisKKwlzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworCWNhc2UgSU9fUkVBREJJVFM6IC8qIFVzZSBJT19SRUFEX0lOQklUUyBhbmQgSU9fUkVBRF9PVVRCSVRTIGluc3RlYWQgKi8KKwkJLyogUmVhZCB0aGUgcG9ydC4gKi8KKwkJcmV0dXJuICpkYXRhX2luW3ByaXYtPm1pbm9yXTsKKwkJYnJlYWs7CisJY2FzZSBJT19TRVRCSVRTOgorCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCS8qIFNldCBjaGFuZ2VhYmxlIGJpdHMgd2l0aCBhIDEgaW4gYXJnLiAqLworCQlzaGFkb3cgPSAqZGF0YV9vdXRbcHJpdi0+bWlub3JdOworCQlzaGFkb3cgfD0gIChhcmcgJiBjaGFuZ2VhYmxlX2JpdHNbcHJpdi0+bWlub3JdKTsKKwkJKmRhdGFfb3V0W3ByaXYtPm1pbm9yXSA9IHNoYWRvdzsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlicmVhazsKKwljYXNlIElPX0NMUkJJVFM6CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJLyogQ2xlYXIgY2hhbmdlYWJsZSBiaXRzIHdpdGggYSAxIGluIGFyZy4gKi8KKwkJc2hhZG93ID0gKmRhdGFfb3V0W3ByaXYtPm1pbm9yXTsKKwkJc2hhZG93ICY9ICB+KGFyZyAmIGNoYW5nZWFibGVfYml0c1twcml2LT5taW5vcl0pOworCQkqZGF0YV9vdXRbcHJpdi0+bWlub3JdID0gc2hhZG93OworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCWJyZWFrOworCWNhc2UgSU9fSElHSEFMQVJNOgorCQkvKiBTZXQgYWxhcm0gd2hlbiBiaXRzIHdpdGggMSBpbiBhcmcgZ28gaGlnaC4gKi8KKwkJcHJpdi0+aGlnaGFsYXJtIHw9IGFyZzsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFsYXJtX2xvY2ssIGZsYWdzKTsKKwkJZ3Bpb19zb21lX2FsYXJtcyA9IDE7CisJCWlmIChwcml2LT5taW5vciA9PSBHUElPX01JTk9SX0EpCisJCQlncGlvX3BhX2hpZ2hfYWxhcm1zIHw9IGFyZzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWxhcm1fbG9jaywgZmxhZ3MpOworCQlicmVhazsKKwljYXNlIElPX0xPV0FMQVJNOgorCQkvKiBTZXQgYWxhcm0gd2hlbiBiaXRzIHdpdGggMSBpbiBhcmcgZ28gbG93LiAqLworCQlwcml2LT5sb3dhbGFybSB8PSBhcmc7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhbGFybV9sb2NrLCBmbGFncyk7CisJCWdwaW9fc29tZV9hbGFybXMgPSAxOworCQlpZiAocHJpdi0+bWlub3IgPT0gR1BJT19NSU5PUl9BKQorCQkJZ3Bpb19wYV9sb3dfYWxhcm1zIHw9IGFyZzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWxhcm1fbG9jaywgZmxhZ3MpOworCQlicmVhazsKKwljYXNlIElPX0NMUkFMQVJNOgorCQkvKiBDbGVhciBhbGFybSBmb3IgYml0cyB3aXRoIDEgaW4gYXJnLiAqLworCQlwcml2LT5oaWdoYWxhcm0gJj0gfmFyZzsKKwkJcHJpdi0+bG93YWxhcm0gICY9IH5hcmc7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhbGFybV9sb2NrLCBmbGFncyk7CisJCWlmIChwcml2LT5taW5vciA9PSBHUElPX01JTk9SX0EpIHsKKwkJCWlmIChncGlvX3BhX2hpZ2hfYWxhcm1zICYgYXJnIHx8CisJCQkgICAgZ3Bpb19wYV9sb3dfYWxhcm1zICYgYXJnKQorCQkJCS8qIE11c3QgdXBkYXRlIHRoZSBncGlvX3BhXyphbGFybXMgbWFza3MgKi8KKwkJCQk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWxhcm1fbG9jaywgZmxhZ3MpOworCQlicmVhazsKKwljYXNlIElPX1JFQURESVI6IC8qIFVzZSBJT19TRVRHRVRfSU5QVVQvT1VUUFVUIGluc3RlYWQhICovCisJCS8qIFJlYWQgZGlyZWN0aW9uIDA9aW5wdXQgMT1vdXRwdXQgKi8KKwkJcmV0dXJuICpkaXJfb2VbcHJpdi0+bWlub3JdOworCWNhc2UgSU9fU0VUSU5QVVQ6IC8qIFVzZSBJT19TRVRHRVRfSU5QVVQgaW5zdGVhZCEgKi8KKwkJLyogU2V0IGRpcmVjdGlvbiAwPXVuY2hhbmdlZCAxPWlucHV0LAorCQkgKiByZXR1cm4gbWFzayB3aXRoIDE9aW5wdXQKKwkJICovCisJCXJldHVybiBzZXRnZXRfaW5wdXQocHJpdiwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBJT19TRVRPVVRQVVQ6IC8qIFVzZSBJT19TRVRHRVRfT1VUUFVUIGluc3RlYWQhICovCisJCS8qIFNldCBkaXJlY3Rpb24gMD11bmNoYW5nZWQgMT1vdXRwdXQsCisJCSAqIHJldHVybiBtYXNrIHdpdGggMT1vdXRwdXQKKwkJICovCisJCXJldHVybiBzZXRnZXRfb3V0cHV0KHByaXYsIGFyZyk7CisKKwljYXNlIElPX0NGR19XUklURV9NT0RFOgorCXsKKwkJdW5zaWduZWQgbG9uZyBkaXJfc2hhZG93OworCQlkaXJfc2hhZG93ID0gKmRpcl9vZVtwcml2LT5taW5vcl07CisKKwkJcHJpdi0+Y2xrX21hc2sgPSBhcmcgJiAweEZGOworCQlwcml2LT5kYXRhX21hc2sgPSAoYXJnID4+IDgpICYgMHhGRjsKKwkJcHJpdi0+d3JpdGVfbXNiID0gKGFyZyA+PiAxNikgJiAweDAxOworCQkvKiBDaGVjayBpZiB3ZSdyZSBhbGxvd2VkIHRvIGNoYW5nZSB0aGUgYml0cyBhbmQKKwkJICogdGhlIGRpcmVjdGlvbiBpcyBjb3JyZWN0CisJCSAqLworCQlpZiAoISgocHJpdi0+Y2xrX21hc2sgJiBjaGFuZ2VhYmxlX2JpdHNbcHJpdi0+bWlub3JdKSAmJgorCQkgICAgICAocHJpdi0+ZGF0YV9tYXNrICYgY2hhbmdlYWJsZV9iaXRzW3ByaXYtPm1pbm9yXSkgJiYKKwkJICAgICAgKHByaXYtPmNsa19tYXNrICYgZGlyX3NoYWRvdykgJiYKKwkJICAgICAgKHByaXYtPmRhdGFfbWFzayAmIGRpcl9zaGFkb3cpKSkgeworCQkJcHJpdi0+Y2xrX21hc2sgPSAwOworCQkJcHJpdi0+ZGF0YV9tYXNrID0gMDsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgSU9fUkVBRF9JTkJJVFM6CisJCS8qICphcmcgaXMgcmVzdWx0IG9mIHJlYWRpbmcgdGhlIGlucHV0IHBpbnMgKi8KKwkJdmFsID0gKmRhdGFfaW5bcHJpdi0+bWlub3JdOworCQlpZiAoY29weV90b191c2VyKCh1bnNpZ25lZCBsb25nICopYXJnLCAmdmFsLCBzaXplb2YodmFsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgSU9fUkVBRF9PVVRCSVRTOgorCQkgLyogKmFyZyBpcyByZXN1bHQgb2YgcmVhZGluZyB0aGUgb3V0cHV0IHNoYWRvdyAqLworCQl2YWwgPSAqZGF0YV9vdXRbcHJpdi0+bWlub3JdOworCQlpZiAoY29weV90b191c2VyKCh1bnNpZ25lZCBsb25nICopYXJnLCAmdmFsLCBzaXplb2YodmFsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBJT19TRVRHRVRfSU5QVVQ6CisJCS8qIGJpdHMgc2V0IGluICphcmcgaXMgc2V0IHRvIGlucHV0LAorCQkgKiAqYXJnIHVwZGF0ZWQgd2l0aCBjdXJyZW50IGlucHV0IHBpbnMuCisJCSAqLworCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgKHVuc2lnbmVkIGxvbmcgKilhcmcsIHNpemVvZih2YWwpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl2YWwgPSBzZXRnZXRfaW5wdXQocHJpdiwgdmFsKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodW5zaWduZWQgbG9uZyAqKWFyZywgJnZhbCwgc2l6ZW9mKHZhbCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgSU9fU0VUR0VUX09VVFBVVDoKKwkJLyogYml0cyBzZXQgaW4gKmFyZyBpcyBzZXQgdG8gb3V0cHV0LAorCQkgKiAqYXJnIHVwZGF0ZWQgd2l0aCBjdXJyZW50IG91dHB1dCBwaW5zLgorCQkgKi8KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWwsICh1bnNpZ25lZCBsb25nICopYXJnLCBzaXplb2YodmFsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJdmFsID0gc2V0Z2V0X291dHB1dChwcml2LCB2YWwpOworCQlpZiAoY29weV90b191c2VyKCh1bnNpZ25lZCBsb25nICopYXJnLCAmdmFsLCBzaXplb2YodmFsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKHByaXYtPm1pbm9yID09IEdQSU9fTUlOT1JfTEVEUykKKwkJCXJldHVybiBncGlvX2xlZHNfaW9jdGwoY21kLCBhcmcpOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9IC8qIHN3aXRjaCAqLworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfRVRSQVhfVklSVFVBTF9HUElPCitzdGF0aWMgaW50Cit2aXJ0dWFsX2dwaW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc2hvcnQgdmFsOworCXVuc2lnbmVkIHNob3J0IHNoYWRvdzsKKwlzdHJ1Y3QgZ3Bpb19wcml2YXRlICpwcml2ID0gKHN0cnVjdCBncGlvX3ByaXZhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworCWNhc2UgSU9fU0VUQklUUzoKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQkvKiBTZXQgY2hhbmdlYWJsZSBiaXRzIHdpdGggYSAxIGluIGFyZy4gKi8KKwkJaTJjX3JlYWQoVklSVF9JMkNfQUREUiwgKHZvaWQgKikmc2hhZG93LCBzaXplb2Yoc2hhZG93KSk7CisJCXNoYWRvdyB8PSB+KmRpcl9vZVtwcml2LT5taW5vcl07CisJCXNoYWRvdyB8PSAoYXJnICYgY2hhbmdlYWJsZV9iaXRzW3ByaXYtPm1pbm9yXSk7CisJCWkyY193cml0ZShWSVJUX0kyQ19BRERSLCAodm9pZCAqKSZzaGFkb3csIHNpemVvZihzaGFkb3cpKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlicmVhazsKKwljYXNlIElPX0NMUkJJVFM6CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJLyogQ2xlYXIgY2hhbmdlYWJsZSBiaXRzIHdpdGggYSAxIGluIGFyZy4gKi8KKwkJaTJjX3JlYWQoVklSVF9JMkNfQUREUiwgKHZvaWQgKikmc2hhZG93LCBzaXplb2Yoc2hhZG93KSk7CisJCXNoYWRvdyB8PSB+KmRpcl9vZVtwcml2LT5taW5vcl07CisJCXNoYWRvdyAmPSB+KGFyZyAmIGNoYW5nZWFibGVfYml0c1twcml2LT5taW5vcl0pOworCQlpMmNfd3JpdGUoVklSVF9JMkNfQUREUiwgKHZvaWQgKikmc2hhZG93LCBzaXplb2Yoc2hhZG93KSk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBJT19ISUdIQUxBUk06CisJCS8qIFNldCBhbGFybSB3aGVuIGJpdHMgd2l0aCAxIGluIGFyZyBnbyBoaWdoLiAqLworCQlwcml2LT5oaWdoYWxhcm0gfD0gYXJnOworCQlzcGluX2xvY2soJmFsYXJtX2xvY2spOworCQlncGlvX3NvbWVfYWxhcm1zID0gMTsKKwkJc3Bpbl91bmxvY2soJmFsYXJtX2xvY2spOworCQlicmVhazsKKwljYXNlIElPX0xPV0FMQVJNOgorCQkvKiBTZXQgYWxhcm0gd2hlbiBiaXRzIHdpdGggMSBpbiBhcmcgZ28gbG93LiAqLworCQlwcml2LT5sb3dhbGFybSB8PSBhcmc7CisJCXNwaW5fbG9jaygmYWxhcm1fbG9jayk7CisJCWdwaW9fc29tZV9hbGFybXMgPSAxOworCQlzcGluX3VubG9jaygmYWxhcm1fbG9jayk7CisJCWJyZWFrOworCWNhc2UgSU9fQ0xSQUxBUk06CisJCS8qIENsZWFyIGFsYXJtIGZvciBiaXRzIHdpdGggMSBpbiBhcmcuICovCisJCXByaXYtPmhpZ2hhbGFybSAmPSB+YXJnOworCQlwcml2LT5sb3dhbGFybSAgJj0gfmFyZzsKKwkJc3Bpbl9sb2NrKCZhbGFybV9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmFsYXJtX2xvY2spOworCQlicmVhazsKKwljYXNlIElPX0NGR19XUklURV9NT0RFOgorCXsKKwkJdW5zaWduZWQgbG9uZyBkaXJfc2hhZG93OworCQlkaXJfc2hhZG93ID0gKmRpcl9vZVtwcml2LT5taW5vcl07CisKKwkJcHJpdi0+Y2xrX21hc2sgPSBhcmcgJiAweEZGOworCQlwcml2LT5kYXRhX21hc2sgPSAoYXJnID4+IDgpICYgMHhGRjsKKwkJcHJpdi0+d3JpdGVfbXNiID0gKGFyZyA+PiAxNikgJiAweDAxOworCQkvKiBDaGVjayBpZiB3ZSdyZSBhbGxvd2VkIHRvIGNoYW5nZSB0aGUgYml0cyBhbmQKKwkJICogdGhlIGRpcmVjdGlvbiBpcyBjb3JyZWN0CisJCSAqLworCQlpZiAoISgocHJpdi0+Y2xrX21hc2sgJiBjaGFuZ2VhYmxlX2JpdHNbcHJpdi0+bWlub3JdKSAmJgorCQkgICAgICAocHJpdi0+ZGF0YV9tYXNrICYgY2hhbmdlYWJsZV9iaXRzW3ByaXYtPm1pbm9yXSkgJiYKKwkJICAgICAgKHByaXYtPmNsa19tYXNrICYgZGlyX3NoYWRvdykgJiYKKwkJICAgICAgKHByaXYtPmRhdGFfbWFzayAmIGRpcl9zaGFkb3cpKSkgeworCQkJcHJpdi0+Y2xrX21hc2sgPSAwOworCQkJcHJpdi0+ZGF0YV9tYXNrID0gMDsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgSU9fUkVBRF9JTkJJVFM6CisJCS8qICphcmcgaXMgcmVzdWx0IG9mIHJlYWRpbmcgdGhlIGlucHV0IHBpbnMgKi8KKwkJdmFsID0gY2FjaGVkX3ZpcnR1YWxfZ3Bpb19yZWFkOworCQl2YWwgJj0gfipkaXJfb2VbcHJpdi0+bWlub3JdOworCQlpZiAoY29weV90b191c2VyKCh1bnNpZ25lZCBsb25nICopYXJnLCAmdmFsLCBzaXplb2YodmFsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgSU9fUkVBRF9PVVRCSVRTOgorCQkgLyogKmFyZyBpcyByZXN1bHQgb2YgcmVhZGluZyB0aGUgb3V0cHV0IHNoYWRvdyAqLworCQlpMmNfcmVhZChWSVJUX0kyQ19BRERSLCAodm9pZCAqKSZ2YWwsIHNpemVvZih2YWwpKTsKKwkJdmFsICY9ICpkaXJfb2VbcHJpdi0+bWlub3JdOworCQlpZiAoY29weV90b191c2VyKCh1bnNpZ25lZCBsb25nICopYXJnLCAmdmFsLCBzaXplb2YodmFsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBJT19TRVRHRVRfSU5QVVQ6CisJeworCQkvKiBiaXRzIHNldCBpbiAqYXJnIGlzIHNldCB0byBpbnB1dCwKKwkJICogKmFyZyB1cGRhdGVkIHdpdGggY3VycmVudCBpbnB1dCBwaW5zLgorCQkgKi8KKwkJdW5zaWduZWQgc2hvcnQgaW5wdXRfbWFzayA9IH4qZGlyX29lW3ByaXYtPm1pbm9yXTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWwsICh1bnNpZ25lZCBsb25nICopYXJnLCBzaXplb2YodmFsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJdmFsID0gc2V0Z2V0X2lucHV0KHByaXYsIHZhbCk7CisJCWlmIChjb3B5X3RvX3VzZXIoKHVuc2lnbmVkIGxvbmcgKilhcmcsICZ2YWwsIHNpemVvZih2YWwpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoKGlucHV0X21hc2sgJiB2YWwpICE9IGlucHV0X21hc2spIHsKKwkJCS8qIElucHV0IHBpbnMgY2hhbmdlZC4gQWxsIHBvcnRzIGRlc2lyZWQgYXMgaW5wdXQKKwkJCSAqIHNob3VsZCBiZSBzZXQgdG8gbG9naWMgMS4KKwkJCSAqLworCQkJdW5zaWduZWQgc2hvcnQgY2hhbmdlID0gaW5wdXRfbWFzayBeIHZhbDsKKwkJCWkyY19yZWFkKFZJUlRfSTJDX0FERFIsICh2b2lkICopJnNoYWRvdywKKwkJCQlzaXplb2Yoc2hhZG93KSk7CisJCQlzaGFkb3cgJj0gfmNoYW5nZTsKKwkJCXNoYWRvdyB8PSB2YWw7CisJCQlpMmNfd3JpdGUoVklSVF9JMkNfQUREUiwgKHZvaWQgKikmc2hhZG93LAorCQkJCXNpemVvZihzaGFkb3cpKTsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBJT19TRVRHRVRfT1VUUFVUOgorCQkvKiBiaXRzIHNldCBpbiAqYXJnIGlzIHNldCB0byBvdXRwdXQsCisJCSAqICphcmcgdXBkYXRlZCB3aXRoIGN1cnJlbnQgb3V0cHV0IHBpbnMuCisJCSAqLworCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgKHVuc2lnbmVkIGxvbmcgKilhcmcsIHNpemVvZih2YWwpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl2YWwgPSBzZXRnZXRfb3V0cHV0KHByaXYsIHZhbCk7CisJCWlmIChjb3B5X3RvX3VzZXIoKHVuc2lnbmVkIGxvbmcgKilhcmcsICZ2YWwsIHNpemVvZih2YWwpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9IC8qIHN3aXRjaCAqLworICByZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfRVRSQVhfVklSVFVBTF9HUElPICovCisKK3N0YXRpYyBpbnQKK2dwaW9fbGVkc19pb2N0bCh1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl1bnNpZ25lZCBjaGFyIGdyZWVuOworCXVuc2lnbmVkIGNoYXIgcmVkOworCisJc3dpdGNoIChfSU9DX05SKGNtZCkpIHsKKwljYXNlIElPX0xFREFDVElWRV9TRVQ6CisJCWdyZWVuID0gKCh1bnNpZ25lZCBjaGFyKSBhcmcpICYgMTsKKwkJcmVkICAgPSAoKCh1bnNpZ25lZCBjaGFyKSBhcmcpID4+IDEpICYgMTsKKwkJQ1JJU19MRURfQUNUSVZFX1NFVF9HKGdyZWVuKTsKKwkJQ1JJU19MRURfQUNUSVZFX1NFVF9SKHJlZCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSAvKiBzd2l0Y2ggKi8KKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGdwaW9fZm9wcyA9IHsKKwkub3duZXIgICAgICAgPSBUSElTX01PRFVMRSwKKwkucG9sbCAgICAgICAgPSBncGlvX3BvbGwsCisJLmlvY3RsICAgICAgID0gZ3Bpb19pb2N0bCwKKwkud3JpdGUgICAgICAgPSBncGlvX3dyaXRlLAorCS5vcGVuICAgICAgICA9IGdwaW9fb3BlbiwKKwkucmVsZWFzZSAgICAgPSBncGlvX3JlbGVhc2UsCit9OworCisjaWZkZWYgQ09ORklHX0VUUkFYX1ZJUlRVQUxfR1BJTworc3RhdGljIHZvaWQKK3ZpcnR1YWxfZ3Bpb19pbml0KHZvaWQpCit7CisJcmVnX2dpb19yd19pbnRyX2NmZyBpbnRyX2NmZzsKKwlyZWdfZ2lvX3J3X2ludHJfbWFzayBpbnRyX21hc2s7CisJdW5zaWduZWQgc2hvcnQgc2hhZG93OworCisJc2hhZG93ID0gfnZpcnR1YWxfcndfcHZfb2U7IC8qIElucHV0IHBvcnRzIHNob3VsZCBiZSBzZXQgdG8gbG9naWMgMSAqLworCXNoYWRvdyB8PSBDT05GSUdfRVRSQVhfREVGX0dJT19QVl9PVVQ7CisJaTJjX3dyaXRlKFZJUlRfSTJDX0FERFIsICh2b2lkICopJnNoYWRvdywgc2l6ZW9mKHNoYWRvdykpOworCisJLyogU2V0IGludGVycnVwdCBtYXNrIGFuZCBvbiB3aGF0IHN0YXRlIHRoZSBpbnRlcnJ1cHQgc2hhbGwgdHJpZ2dlci4KKwkgKiBGb3IgdmlydHVhbCBncGlvIHRoZSBpbnRlcnJ1cHQgc2hhbGwgdHJpZ2dlciBvbiBsb2dpYyAnMCcuCisJICovCisJaW50cl9jZmcgPSBSRUdfUkQoZ2lvLCByZWdpX2dpbywgcndfaW50cl9jZmcpOworCWludHJfbWFzayA9IFJFR19SRChnaW8sIHJlZ2lfZ2lvLCByd19pbnRyX21hc2spOworCisJc3dpdGNoIChDT05GSUdfRVRSQVhfVklSVFVBTF9HUElPX0lOVEVSUlVQVF9QQV9QSU4pIHsKKwljYXNlIDA6CisJCWludHJfY2ZnLnBhMCA9IHJlZ2tfZ2lvX2xvOworCQlpbnRyX21hc2sucGEwID0gcmVna19naW9feWVzOworCQlicmVhazsKKwljYXNlIDE6CisJCWludHJfY2ZnLnBhMSA9IHJlZ2tfZ2lvX2xvOworCQlpbnRyX21hc2sucGExID0gcmVna19naW9feWVzOworCQlicmVhazsKKwljYXNlIDI6CisJCWludHJfY2ZnLnBhMiA9IHJlZ2tfZ2lvX2xvOworCQlpbnRyX21hc2sucGEyID0gcmVna19naW9feWVzOworCQlicmVhazsKKwljYXNlIDM6CisJCWludHJfY2ZnLnBhMyA9IHJlZ2tfZ2lvX2xvOworCQlpbnRyX21hc2sucGEzID0gcmVna19naW9feWVzOworCQlicmVhazsKKwljYXNlIDQ6CisJCWludHJfY2ZnLnBhNCA9IHJlZ2tfZ2lvX2xvOworCQlpbnRyX21hc2sucGE0ID0gcmVna19naW9feWVzOworCQlicmVhazsKKwljYXNlIDU6CisJCWludHJfY2ZnLnBhNSA9IHJlZ2tfZ2lvX2xvOworCQlpbnRyX21hc2sucGE1ID0gcmVna19naW9feWVzOworCQlicmVhazsKKwljYXNlIDY6CisJCWludHJfY2ZnLnBhNiA9IHJlZ2tfZ2lvX2xvOworCQlpbnRyX21hc2sucGE2ID0gcmVna19naW9feWVzOworCQlicmVhazsKKwljYXNlIDc6CisJCWludHJfY2ZnLnBhNyA9IHJlZ2tfZ2lvX2xvOworCQlpbnRyX21hc2sucGE3ID0gcmVna19naW9feWVzOworCWJyZWFrOworCX0KKworCVJFR19XUihnaW8sIHJlZ2lfZ2lvLCByd19pbnRyX2NmZywgaW50cl9jZmcpOworCVJFR19XUihnaW8sIHJlZ2lfZ2lvLCByd19pbnRyX21hc2ssIGludHJfbWFzayk7CisKKwlncGlvX3BhX2xvd19hbGFybXMgfD0gKDEgPDwgQ09ORklHX0VUUkFYX1ZJUlRVQUxfR1BJT19JTlRFUlJVUFRfUEFfUElOKTsKKwlncGlvX3NvbWVfYWxhcm1zID0gMTsKK30KKyNlbmRpZgorCisvKiBtYWluIGRyaXZlciBpbml0aWFsaXphdGlvbiByb3V0aW5lLCBjYWxsZWQgZnJvbSBtZW0uYyAqLworCitzdGF0aWMgX19pbml0IGludAorZ3Bpb19pbml0KHZvaWQpCit7CisJaW50IHJlczsKKworCS8qIGRvIHRoZSBmb3JtYWxpdGllcyAqLworCisJcmVzID0gcmVnaXN0ZXJfY2hyZGV2KEdQSU9fTUFKT1IsIGdwaW9fbmFtZSwgJmdwaW9fZm9wcyk7CisJaWYgKHJlcyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJncGlvOiBjb3VsZG4ndCBnZXQgYSBtYWpvciBudW1iZXIuXG4iKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwkvKiBDbGVhciBhbGwgbGVkcyAqLworCUNSSVNfTEVEX05FVFdPUktfR1JQMF9TRVQoMCk7CisJQ1JJU19MRURfTkVUV09SS19HUlAxX1NFVCgwKTsKKwlDUklTX0xFRF9BQ1RJVkVfU0VUKDApOworCUNSSVNfTEVEX0RJU0tfUkVBRCgwKTsKKwlDUklTX0xFRF9ESVNLX1dSSVRFKDApOworCisJcHJpbnRrKEtFUk5fSU5GTyAiRVRSQVggRlMgR1BJTyBkcml2ZXIgdjIuNSwgKGMpIDIwMDMtMjAwNyAiCisJCSJBeGlzIENvbW11bmljYXRpb25zIEFCXG4iKTsKKwkvKiBXZSBjYWxsIGV0cmF4X2dwaW9fd2FrZV91cF9jaGVjaygpIGZyb20gdGltZXIgaW50ZXJydXB0IGFuZAorCSAqIGZyb20gY3B1X2lkbGUoKSBpbiBrZXJuZWwvcHJvY2Vzcy5jCisJICogVGhlIGNoZWNrIGluIGNwdV9pZGxlKCkgcmVkdWNlcyBsYXRlbmN5IGZyb20gfjE1IG1zIHRvIH42IG1zCisJICogaW4gc29tZSB0ZXN0cy4KKwkgKi8KKwlpZiAocmVxdWVzdF9pcnEoVElNRVIwX0lOVFJfVkVDVCwgZ3Bpb19wb2xsX3RpbWVyX2ludGVycnVwdCwKKwkJCUlSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCwgImdwaW8gcG9sbCIsICZhbGFybWxpc3QpKQorCQlwcmludGsoS0VSTl9FUlIgInRpbWVyMCBpcnEgZm9yIGdwaW9cbiIpOworCisJaWYgKHJlcXVlc3RfaXJxKEdJT19JTlRSX1ZFQ1QsIGdwaW9fcGFfaW50ZXJydXB0LAorCQkJSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVELCAiZ3BpbyBQQSIsICZhbGFybWxpc3QpKQorCQlwcmludGsoS0VSTl9FUlIgIlBBIGlycSBmb3IgZ3Bpb1xuIik7CisKKyNpZmRlZiBDT05GSUdfRVRSQVhfVklSVFVBTF9HUElPCisJdmlydHVhbF9ncGlvX2luaXQoKTsKKyNlbmRpZgorCisJcmV0dXJuIHJlczsKK30KKworLyogdGhpcyBtYWtlcyBzdXJlIHRoYXQgZ3Bpb19pbml0IGlzIGNhbGxlZCBkdXJpbmcga2VybmVsIGJvb3QgKi8KKworbW9kdWxlX2luaXQoZ3Bpb19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL21hY2gtZnMvbmFuZGZsYXNoLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9tYWNoLWZzL25hbmRmbGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMDFiMTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9tYWNoLWZzL25hbmRmbGFzaC5jCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogIGFyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL25hbmRmbGFzaC5jCisgKgorICogIENvcHlyaWdodCAoYykgMjAwNAorICoKKyAqICBEZXJpdmVkIGZyb20gZHJpdmVycy9tdGQvbmFuZC9zcGlhLmMKKyAqCSAgQ29weXJpZ2h0IChDKSAyMDAwIFN0ZXZlbiBKLiBIaWxsIChzamhpbGxAcmVhbGl0eWRpbHV0ZWQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtbWFwLmg+CisjaW5jbHVkZSA8aHdyZWdzL3JlZ19tYXAuaD4KKyNpbmNsdWRlIDxod3JlZ3MvcmVnX3Jkd3IuaD4KKyNpbmNsdWRlIDxod3JlZ3MvZ2lvX2RlZnMuaD4KKyNpbmNsdWRlIDxod3JlZ3MvYmlmX2NvcmVfZGVmcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVmaW5lIENFX0JJVCA0CisjZGVmaW5lIENMRV9CSVQgNQorI2RlZmluZSBBTEVfQklUIDYKKyNkZWZpbmUgQllfQklUIDcKKworc3RydWN0IG10ZF9pbmZvX3dyYXBwZXIgeworCXN0cnVjdCBtdGRfaW5mbyBpbmZvOworCXN0cnVjdCBuYW5kX2NoaXAgY2hpcDsKK307CisKKy8qIEJpdG1hc2sgZm9yIGNvbnRyb2wgcGlucyAqLworI2RlZmluZSBQSU5fQklUTUFTSyAoKDEgPDwgQ0VfQklUKSB8ICgxIDw8IENMRV9CSVQpIHwgKDEgPDwgQUxFX0JJVCkpCisKKy8qIEJpdG1hc2sgZm9yIG10ZCBuYW5kIGNvbnRyb2wgYml0cyAqLworI2RlZmluZSBDVFJMX0JJVE1BU0sgKE5BTkRfTkNFIHwgTkFORF9DTEUgfCBOQU5EX0FMRSkKKworCitzdGF0aWMgc3RydWN0IG10ZF9pbmZvICpjcmlzdjMyX210ZDsKKy8qCisgKgloYXJkd2FyZSBzcGVjaWZpYyBhY2Nlc3MgdG8gY29udHJvbC1saW5lcworICovCitzdGF0aWMgdm9pZCBjcmlzdjMyX2h3Y29udHJvbChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGNtZCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBjdHJsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJcmVnX2dpb19yd19wYV9kb3V0IGRvdXQ7CisJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCS8qIGNvbnRyb2wgYml0cyBjaGFuZ2UgKi8KKwlpZiAoY3RybCAmIE5BTkRfQ1RSTF9DSEFOR0UpIHsKKwkJZG91dCA9IFJFR19SRChnaW8sIHJlZ2lfZ2lvLCByd19wYV9kb3V0KTsKKwkJZG91dC5kYXRhICY9IH5QSU5fQklUTUFTSzsKKworI2lmIChDRV9CSVQgPT0gNCAmJiBOQU5EX05DRSA9PSAxICYmICBcCisgICAgIENMRV9CSVQgPT0gNSAmJiBOQU5EX0NMRSA9PSAyICYmIFwKKyAgICAgQUxFX0JJVCA9PSA2ICYmIE5BTkRfQUxFID09IDQpCisJCS8qIFBpbnMgaW4gc2FtZSBvcmRlciBhcyBjb250cm9sIGJpdHMsIGJ1dCBzaGlmdGVkLgorCQkgKiBPcHRpbWl6ZSBmb3IgdGhpcyBjYXNlOyB3b3JrcyBmb3IgMi42LjE4ICovCisJCWRvdXQuZGF0YSB8PSAoKGN0cmwgJiBDVFJMX0JJVE1BU0spIF4gTkFORF9OQ0UpIDw8IENFX0JJVDsKKyNlbHNlCisJCS8qIHRoZSBzbG93IHdheSAqLworCQlpZiAoIShjdHJsICYgTkFORF9OQ0UpKQorCQkJZG91dC5kYXRhIHw9ICgxIDw8IENFX0JJVCk7CisJCWlmIChjdHJsICYgTkFORF9DTEUpCisJCQlkb3V0LmRhdGEgfD0gKDEgPDwgQ0xFX0JJVCk7CisJCWlmIChjdHJsICYgTkFORF9BTEUpCisJCQlkb3V0LmRhdGEgfD0gKDEgPDwgQUxFX0JJVCk7CisjZW5kaWYKKwkJUkVHX1dSKGdpbywgcmVnaV9naW8sIHJ3X3BhX2RvdXQsIGRvdXQpOworCX0KKworCS8qIGNvbW1hbmQgdG8gY2hpcCAqLworCWlmIChjbWQgIT0gTkFORF9DTURfTk9ORSkKKwkJd3JpdGViKGNtZCwgdGhpcy0+SU9fQUREUl9XKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoKKyoJcmVhZCBkZXZpY2UgcmVhZHkgcGluCisqLworc3RhdGljIGludCBjcmlzdjMyX2RldmljZV9yZWFkeShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlyZWdfZ2lvX3JfcGFfZGluIGRpbiA9IFJFR19SRChnaW8sIHJlZ2lfZ2lvLCByX3BhX2Rpbik7CisJcmV0dXJuICgoZGluLmRhdGEgJiAoMSA8PCBCWV9CSVQpKSA+PiBCWV9CSVQpOworfQorCisvKgorICogTWFpbiBpbml0aWFsaXphdGlvbiByb3V0aW5lCisgKi8KK3N0cnVjdCBtdGRfaW5mbyAqX19pbml0IGNyaXN2MzJfbmFuZF9mbGFzaF9wcm9iZSh2b2lkKQoreworCXZvaWQgX19pb21lbSAqcmVhZF9jczsKKwl2b2lkIF9faW9tZW0gKndyaXRlX2NzOworCisJcmVnX2JpZl9jb3JlX3J3X2dycDNfY2ZnIGJpZl9jZmcgPSBSRUdfUkQoYmlmX2NvcmUsIHJlZ2lfYmlmX2NvcmUsCisJCXJ3X2dycDNfY2ZnKTsKKwlyZWdfZ2lvX3J3X3BhX29lIHBhX29lID0gUkVHX1JEKGdpbywgcmVnaV9naW8sIHJ3X3BhX29lKTsKKwlzdHJ1Y3QgbXRkX2luZm9fd3JhcHBlciAqd3JhcHBlcjsKKwlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzOworCWludCBlcnIgPSAwOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBNVEQgZGV2aWNlIHN0cnVjdHVyZSBhbmQgcHJpdmF0ZSBkYXRhICovCisJd3JhcHBlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtdGRfaW5mb193cmFwcGVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF3cmFwcGVyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIENSSVN2MzIgTkFORCBNVEQgIgorCQkJImRldmljZSBzdHJ1Y3R1cmUuXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmVhZF9jcyA9IGlvcmVtYXAoTUVNX0NTUDBfU1RBUlQgfCBNRU1fTk9OX0NBQ0hFQUJMRSwgODE5Mik7CisJd3JpdGVfY3MgPSBpb3JlbWFwKE1FTV9DU1AxX1NUQVJUIHwgTUVNX05PTl9DQUNIRUFCTEUsIDgxOTIpOworCisJaWYgKCFyZWFkX2NzIHx8ICF3cml0ZV9jcykgeworCQlwcmludGsoS0VSTl9FUlIgIkNSSVN2MzIgTkFORCBpb3JlbWFwIGZhaWxlZFxuIik7CisJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0X210ZDsKKwl9CisKKwkvKiBHZXQgcG9pbnRlciB0byBwcml2YXRlIGRhdGEgKi8KKwl0aGlzID0gJndyYXBwZXItPmNoaXA7CisJY3Jpc3YzMl9tdGQgPSAmd3JhcHBlci0+aW5mbzsKKworCXBhX29lLm9lIHw9IDEgPDwgQ0VfQklUOworCXBhX29lLm9lIHw9IDEgPDwgQUxFX0JJVDsKKwlwYV9vZS5vZSB8PSAxIDw8IENMRV9CSVQ7CisJcGFfb2Uub2UgJj0gfigxIDw8IEJZX0JJVCk7CisJUkVHX1dSKGdpbywgcmVnaV9naW8sIHJ3X3BhX29lLCBwYV9vZSk7CisKKwliaWZfY2ZnLmdhdGVkX2NzcDAgPSByZWdrX2JpZl9jb3JlX3JkOworCWJpZl9jZmcuZ2F0ZWRfY3NwMSA9IHJlZ2tfYmlmX2NvcmVfd3I7CisJUkVHX1dSKGJpZl9jb3JlLCByZWdpX2JpZl9jb3JlLCByd19ncnAzX2NmZywgYmlmX2NmZyk7CisKKwkvKiBMaW5rIHRoZSBwcml2YXRlIGRhdGEgd2l0aCB0aGUgTVREIHN0cnVjdHVyZSAqLworCWNyaXN2MzJfbXRkLT5wcml2ID0gdGhpczsKKworCS8qIFNldCBhZGRyZXNzIG9mIE5BTkQgSU8gbGluZXMgKi8KKwl0aGlzLT5JT19BRERSX1IgPSByZWFkX2NzOworCXRoaXMtPklPX0FERFJfVyA9IHdyaXRlX2NzOworCXRoaXMtPmNtZF9jdHJsID0gY3Jpc3YzMl9od2NvbnRyb2w7CisJdGhpcy0+ZGV2X3JlYWR5ID0gY3Jpc3YzMl9kZXZpY2VfcmVhZHk7CisJLyogMjAgdXMgY29tbWFuZCBkZWxheSB0aW1lICovCisJdGhpcy0+Y2hpcF9kZWxheSA9IDIwOworCXRoaXMtPmVjYy5tb2RlID0gTkFORF9FQ0NfU09GVDsKKworCS8qIEVuYWJsZSB0aGUgZm9sbG93aW5nIGZvciBhIGZsYXNoIGJhc2VkIGJhZCBibG9jayB0YWJsZSAqLworCS8qIHRoaXMtPm9wdGlvbnMgPSBOQU5EX1VTRV9GTEFTSF9CQlQ7ICovCisKKwkvKiBTY2FuIHRvIGZpbmQgZXhpc3RhbmNlIG9mIHRoZSBkZXZpY2UgKi8KKwlpZiAobmFuZF9zY2FuKGNyaXN2MzJfbXRkLCAxKSkgeworCQllcnIgPSAtRU5YSU87CisJCWdvdG8gb3V0X2lvcjsKKwl9CisKKwlyZXR1cm4gY3Jpc3YzMl9tdGQ7CisKK291dF9pb3I6CisJaW91bm1hcCgodm9pZCAqKXJlYWRfY3MpOworCWlvdW5tYXAoKHZvaWQgKil3cml0ZV9jcyk7CitvdXRfbXRkOgorCWtmcmVlKHdyYXBwZXIpOworCXJldHVybiBOVUxMOworfQorCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9uYW5kZmxhc2guYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL25hbmRmbGFzaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2UwMTVjLi4wMDAwMDAwCi0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL25hbmRmbGFzaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qCi0gKiAgYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvbmFuZGZsYXNoLmMKLSAqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA0Ci0gKgotICogIERlcml2ZWQgZnJvbSBkcml2ZXJzL210ZC9uYW5kL3NwaWEuYwotICogCSAgQ29weXJpZ2h0IChDKSAyMDAwIFN0ZXZlbiBKLiBIaWxsIChzamhpbGxAcmVhbGl0eWRpbHV0ZWQuY29tKQotICoKLSAqICRJZDogbmFuZGZsYXNoLmMsdiAxLjMgMjAwNS8wNi8wMSAxMDo1NzoxMiBzdGFydmlrIEV4cCAkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9tZW1tYXAuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvcmVnX21hcC5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9yZWdfcmR3ci5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9naW9fZGVmcy5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9iaWZfY29yZV9kZWZzLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLSNkZWZpbmUgQ0VfQklUIDQKLSNkZWZpbmUgQ0xFX0JJVCA1Ci0jZGVmaW5lIEFMRV9CSVQgNgotI2RlZmluZSBCWV9CSVQgNwotCi1zdGF0aWMgc3RydWN0IG10ZF9pbmZvICpjcmlzdjMyX210ZCA9IE5VTEw7Ci0vKgotICoJaGFyZHdhcmUgc3BlY2lmaWMgYWNjZXNzIHRvIGNvbnRyb2wtbGluZXMKLSovCi1zdGF0aWMgdm9pZCBjcmlzdjMyX2h3Y29udHJvbChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGNtZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXJlZ19naW9fcndfcGFfZG91dCBkb3V0ID0gUkVHX1JEKGdpbywgcmVnaV9naW8sIHJ3X3BhX2RvdXQpOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXN3aXRjaChjbWQpewotCQljYXNlIE5BTkRfQ1RMX1NFVENMRToKLQkJICAgICBkb3V0LmRhdGEgfD0gKDE8PENMRV9CSVQpOwotCQkgICAgIGJyZWFrOwotCQljYXNlIE5BTkRfQ1RMX0NMUkNMRToKLQkJICAgICBkb3V0LmRhdGEgJj0gfigxPDxDTEVfQklUKTsKLQkJICAgICBicmVhazsKLQkJY2FzZSBOQU5EX0NUTF9TRVRBTEU6Ci0JCSAgICAgZG91dC5kYXRhIHw9ICgxPDxBTEVfQklUKTsKLQkJICAgICBicmVhazsKLQkJY2FzZSBOQU5EX0NUTF9DTFJBTEU6Ci0JCSAgICAgZG91dC5kYXRhICY9IH4oMTw8QUxFX0JJVCk7Ci0JCSAgICAgYnJlYWs7Ci0JCWNhc2UgTkFORF9DVExfU0VUTkNFOgotCQkgICAgIGRvdXQuZGF0YSB8PSAoMTw8Q0VfQklUKTsKLQkJICAgICBicmVhazsKLQkJY2FzZSBOQU5EX0NUTF9DTFJOQ0U6Ci0JCSAgICAgZG91dC5kYXRhICY9IH4oMTw8Q0VfQklUKTsKLQkJICAgICBicmVhazsKLQl9Ci0JUkVHX1dSKGdpbywgcmVnaV9naW8sIHJ3X3BhX2RvdXQsIGRvdXQpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotLyoKLSoJcmVhZCBkZXZpY2UgcmVhZHkgcGluCi0qLwotaW50IGNyaXN2MzJfZGV2aWNlX3JlYWR5KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQotewotCXJlZ19naW9fcl9wYV9kaW4gZGluID0gUkVHX1JEKGdpbywgcmVnaV9naW8sIHJfcGFfZGluKTsKLQlyZXR1cm4gKChkaW4uZGF0YSAmICgxIDw8IEJZX0JJVCkpID4+IEJZX0JJVCk7Ci19Ci0KLS8qCi0gKiBNYWluIGluaXRpYWxpemF0aW9uIHJvdXRpbmUKLSAqLwotc3RydWN0IG10ZF9pbmZvKiBfX2luaXQgY3Jpc3YzMl9uYW5kX2ZsYXNoX3Byb2JlICh2b2lkKQotewotCXZvaWQgX19pb21lbSAqcmVhZF9jczsKLQl2b2lkIF9faW9tZW0gKndyaXRlX2NzOwotCi0JcmVnX2JpZl9jb3JlX3J3X2dycDNfY2ZnIGJpZl9jZmcgPSBSRUdfUkQoYmlmX2NvcmUsIHJlZ2lfYmlmX2NvcmUsIHJ3X2dycDNfY2ZnKTsKLQlyZWdfZ2lvX3J3X3BhX29lIHBhX29lID0gUkVHX1JEKGdpbywgcmVnaV9naW8sIHJ3X3BhX29lKTsKLQlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzOwotCWludCBlcnIgPSAwOwotCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciBNVEQgZGV2aWNlIHN0cnVjdHVyZSBhbmQgcHJpdmF0ZSBkYXRhICovCi0JY3Jpc3YzMl9tdGQgPSBrbWFsbG9jIChzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSArIHNpemVvZiAoc3RydWN0IG5hbmRfY2hpcCksCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjcmlzdjMyX210ZCkgewotCQlwcmludGsgKCJVbmFibGUgdG8gYWxsb2NhdGUgQ1JJU3YzMiBOQU5EIE1URCBkZXZpY2Ugc3RydWN0dXJlLlxuIik7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXJlYWRfY3MgPSBpb3JlbWFwKE1FTV9DU1AwX1NUQVJUIHwgTUVNX05PTl9DQUNIRUFCTEUsIDgxOTIpOwotCXdyaXRlX2NzID0gaW9yZW1hcChNRU1fQ1NQMV9TVEFSVCB8IE1FTV9OT05fQ0FDSEVBQkxFLCA4MTkyKTsKLQotCWlmICghcmVhZF9jcyB8fCAhd3JpdGVfY3MpIHsKLQkJcHJpbnRrKCJDUklTdjMyIE5BTkQgaW9yZW1hcCBmYWlsZWRcbiIpOwotCQllcnIgPSAtRUlPOwotCQlnb3RvIG91dF9tdGQ7Ci0JfQotCi0JLyogR2V0IHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhICovCi0JdGhpcyA9IChzdHJ1Y3QgbmFuZF9jaGlwICopICgmY3Jpc3YzMl9tdGRbMV0pOwotCi0JcGFfb2Uub2UgfD0gMSA8PCBDRV9CSVQ7Ci0JcGFfb2Uub2UgfD0gMSA8PCBBTEVfQklUOwotCXBhX29lLm9lIHw9IDEgPDwgQ0xFX0JJVDsKLQlwYV9vZS5vZSAmPSB+ICgxIDw8IEJZX0JJVCk7Ci0JUkVHX1dSKGdpbywgcmVnaV9naW8sIHJ3X3BhX29lLCBwYV9vZSk7Ci0KLQliaWZfY2ZnLmdhdGVkX2NzcDAgPSByZWdrX2JpZl9jb3JlX3JkOwotCWJpZl9jZmcuZ2F0ZWRfY3NwMSA9IHJlZ2tfYmlmX2NvcmVfd3I7Ci0JUkVHX1dSKGJpZl9jb3JlLCByZWdpX2JpZl9jb3JlLCByd19ncnAzX2NmZywgYmlmX2NmZyk7Ci0KLQkvKiBJbml0aWFsaXplIHN0cnVjdHVyZXMgKi8KLQltZW1zZXQoKGNoYXIgKikgY3Jpc3YzMl9tdGQsIDAsIHNpemVvZihzdHJ1Y3QgbXRkX2luZm8pKTsKLQltZW1zZXQoKGNoYXIgKikgdGhpcywgMCwgc2l6ZW9mKHN0cnVjdCBuYW5kX2NoaXApKTsKLQotCS8qIExpbmsgdGhlIHByaXZhdGUgZGF0YSB3aXRoIHRoZSBNVEQgc3RydWN0dXJlICovCi0JY3Jpc3YzMl9tdGQtPnByaXYgPSB0aGlzOwotCi0JLyogU2V0IGFkZHJlc3Mgb2YgTkFORCBJTyBsaW5lcyAqLwotCXRoaXMtPklPX0FERFJfUiA9IHJlYWRfY3M7Ci0JdGhpcy0+SU9fQUREUl9XID0gd3JpdGVfY3M7Ci0JdGhpcy0+aHdjb250cm9sID0gY3Jpc3YzMl9od2NvbnRyb2w7Ci0JdGhpcy0+ZGV2X3JlYWR5ID0gY3Jpc3YzMl9kZXZpY2VfcmVhZHk7Ci0JLyogMjAgdXMgY29tbWFuZCBkZWxheSB0aW1lICovCi0JdGhpcy0+Y2hpcF9kZWxheSA9IDIwOwotCXRoaXMtPmVjY21vZGUgPSBOQU5EX0VDQ19TT0ZUOwotCi0JLyogRW5hYmxlIHRoZSBmb2xsb3dpbmcgZm9yIGEgZmxhc2ggYmFzZWQgYmFkIGJsb2NrIHRhYmxlICovCi0JdGhpcy0+b3B0aW9ucyA9IE5BTkRfVVNFX0ZMQVNIX0JCVDsKLQotCS8qIFNjYW4gdG8gZmluZCBleGlzdGVuY2Ugb2YgdGhlIGRldmljZSAqLwotCWlmIChuYW5kX3NjYW4gKGNyaXN2MzJfbXRkLCAxKSkgewotCQllcnIgPSAtRU5YSU87Ci0JCWdvdG8gb3V0X2lvcjsKLQl9Ci0KLQlyZXR1cm4gY3Jpc3YzMl9tdGQ7Ci0KLW91dF9pb3I6Ci0JaW91bm1hcCgodm9pZCAqKXJlYWRfY3MpOwotCWlvdW5tYXAoKHZvaWQgKil3cml0ZV9jcyk7Ci1vdXRfbXRkOgotCWtmcmVlIChjcmlzdjMyX210ZCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotfQotCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9wY2Y4NTYzLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9wY2Y4NTYzLmMKaW5kZXggNmRiZDcwMC4uNTNkYjM4NyAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvcGNmODU2My5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL3BjZjg1NjMuYwpAQCAtMTAsNyArMTAsNyBAQAogICogNDAwIGtiaXRzL3MuIFRoZSBidWlsdC1pbiB3b3JkIGFkZHJlc3MgcmVnaXN0ZXIgaXMgaW5jcmVtZW50ZWQKICAqIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgZWFjaCB3cml0dGVuIG9yIHJlYWQgYnl0ZS4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDcsIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogQXV0aG9yOiBUb2JpYXMgQW5kZXJiZXJnIDx0b2JpYXNhQGF4aXMuY29tPi4KQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtMzcsMjQgKzM4LDI3IEBACiAjZGVmaW5lIFBDRjg1NjNfTUFKT1IJMTIxCS8qIExvY2FsIG1ham9yIG51bWJlci4gKi8KICNkZWZpbmUgREVWSUNFX05BTUUJInJ0YyIJLyogTmFtZSB3aGljaCBpcyByZWdpc3RlcmVkIGluIC9wcm9jL2RldmljZXMuICovCiAjZGVmaW5lIFBDRjg1NjNfTkFNRQkiUENGODU2MyIKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JIiRSZXZpc2lvbjogMS4xICQiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIkUmV2aXNpb246IDEuMTcgJCIKIAogLyogVHdvIHNpbXBsZSB3cmFwcGVyIG1hY3Jvcywgc2F2ZXMgYSBmZXcga2V5c3Ryb2tlcy4gKi8KICNkZWZpbmUgcnRjX3JlYWQoeCkgaTJjX3JlYWRyZWcoUlRDX0kyQ19SRUFELCB4KQogI2RlZmluZSBydGNfd3JpdGUoeCx5KSBpMmNfd3JpdGVyZWcoUlRDX0kyQ19XUklURSwgeCwgeSkKIAorc3RhdGljIERFRklORV9NVVRFWChydGNfbG9jayk7IC8qIFByb3RlY3Qgc3RhdGUgZXRjICovCisKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRheXNfaW5fbW9udGhbXSA9CiAJeyAwLCAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxIH07CiAKIGludCBwY2Y4NTYzX2lvY3RsKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwotaW50IHBjZjg1NjNfb3BlbihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7Ci1pbnQgcGNmODU2M19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKKworLyogQ2FjaGUgVkwgYml0IHZhbHVlIHJlYWQgYXQgZHJpdmVyIGluaXQgc2luY2Ugd3JpdGluZyB0aGUgUlRDX1NFQ09ORAorICogcmVnaXN0ZXIgY2xlYXJzIHRoZSBWTCBzdGF0dXMuCisgKi8KK3N0YXRpYyBpbnQgdm9sdGFnZV9sb3c7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBjZjg1NjNfZm9wcyA9IHsKIAkub3duZXIgPQlUSElTX01PRFVMRSwKLQkuaW9jdGwgPQlwY2Y4NTYzX2lvY3RsLAotCS5vcGVuID0JCXBjZjg1NjNfb3BlbiwKLQkucmVsZWFzZSA9CXBjZjg1NjNfcmVsZWFzZSwKKwkuaW9jdGwgPQlwY2Y4NTYzX2lvY3RsCiB9OwogCiB1bnNpZ25lZCBjaGFyCkBAIC02Miw3ICs2Niw3IEBACiB7CiAJdW5zaWduZWQgY2hhciByZXMgPSBydGNfcmVhZChyZWcpOwogCi0JLyogVGhlIFBDRjg1NjMgZG9lcyBub3QgcmV0dXJuIDAgZm9yIHVuaW1wbGVtZW50ZWQgYml0cyAqLworCS8qIFRoZSBQQ0Y4NTYzIGRvZXMgbm90IHJldHVybiAwIGZvciB1bmltcGxlbWVudGVkIGJpdHMuICovCiAJc3dpdGNoIChyZWcpIHsKIAkJY2FzZSBSVENfU0VDT05EUzoKIAkJY2FzZSBSVENfTUlOVVRFUzoKQEAgLTk1LDExICs5OSw2IEBACiB2b2lkCiBwY2Y4NTYzX3dyaXRlcmVnKGludCByZWcsIHVuc2lnbmVkIGNoYXIgdmFsKQogewotI2lmZGVmIENPTkZJR19FVFJBWF9SVENfUkVBRE9OTFkKLQlpZiAocmVnID09IFJUQ19DT05UUk9MMSB8fCAocmVnID49IFJUQ19TRUNPTkRTICYmIHJlZyA8PSBSVENfWUVBUikpCi0JCXJldHVybjsKLSNlbmRpZgotCiAJcnRjX3dyaXRlKHJlZywgdmFsKTsKIH0KIApAQCAtMTE0LDExICsxMTMsMTMgQEAKIAl0bS0+dG1fbW9uICA9IHJ0Y19yZWFkKFJUQ19NT05USCk7CiAJdG0tPnRtX3llYXIgPSBydGNfcmVhZChSVENfWUVBUik7CiAKLQlpZiAodG0tPnRtX3NlYyAmIDB4ODApCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSVEMgVm9sdGFnZSBMb3cgLSByZWxpYWJsZSBkYXRlL3RpbWUgIgorCWlmICh0bS0+dG1fc2VjICYgMHg4MCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSVEMgVm9sdGFnZSBMb3cgLSByZWxpYWJsZSBkYXRlL3RpbWUgIgogCQkgICAgICAgImluZm9ybWF0aW9uIGlzIG5vIGxvbmdlciBndWFyYW50ZWVkIVxuIiwgUENGODU2M19OQU1FKTsKKwl9CiAKLQl0bS0+dG1feWVhciAgPSBCQ0RfVE9fQklOKHRtLT50bV95ZWFyKSArICgodG0tPnRtX21vbiAmIDB4ODApID8gMTAwIDogMCk7CisJdG0tPnRtX3llYXIgID0gQkNEX1RPX0JJTih0bS0+dG1feWVhcikgKworCQkgICAgICAgKCh0bS0+dG1fbW9uICYgMHg4MCkgPyAxMDAgOiAwKTsKIAl0bS0+dG1fc2VjICAmPSAweDdGOwogCXRtLT50bV9taW4gICY9IDB4N0Y7CiAJdG0tPnRtX2hvdXIgJj0gMHgzRjsKQEAgLTEzNyw4ICsxMzgsMTkgQEAKIGludCBfX2luaXQKIHBjZjg1NjNfaW5pdCh2b2lkKQogeworCXN0YXRpYyBpbnQgcmVzOworCXN0YXRpYyBpbnQgZmlyc3QgPSAxOworCisJaWYgKCFmaXJzdCkKKwkJcmV0dXJuIHJlczsKKwlmaXJzdCA9IDA7CisKIAkvKiBJbml0aWF0ZSB0aGUgaTJjIHByb3RvY29sLiAqLwotCWkyY19pbml0KCk7CisJcmVzID0gaTJjX2luaXQoKTsKKwlpZiAocmVzIDwgMCkgeworCQlwcmludGsoS0VSTl9DUklUICJwY2Y4NTYzX2luaXQ6IEZhaWxlZCB0byBpbml0IGkyYy5cbiIpOworCQlyZXR1cm4gcmVzOworCX0KIAogCS8qCiAJICogRmlyc3Qgb2YgYWxsIHdlIG5lZWQgdG8gcmVzZXQgdGhlIGNoaXAuIFRoaXMgaXMgZG9uZSBieQpAQCAtMTcwLDI0ICsxODIsMjAgQEAKIAlpZiAocnRjX3dyaXRlKFJUQ19XRUVLREFZX0FMQVJNLCAweDgwKSA8IDApCiAJCWdvdG8gZXJyOwogCi0JaWYgKHJlZ2lzdGVyX2NocmRldihQQ0Y4NTYzX01BSk9SLCBERVZJQ0VfTkFNRSwgJnBjZjg1NjNfZm9wcykgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbmFibGUgdG8gZ2V0IG1ham9yIG51bWJlciAlZCBmb3IgUlRDIGRldmljZS5cbiIsCi0JCSAgICAgICBQQ0Y4NTYzX05BTUUsIFBDRjg1NjNfTUFKT1IpOwotCQlyZXR1cm4gLTE7CisJLyogQ2hlY2sgZm9yIGxvdyB2b2x0YWdlLCBhbmQgd2FybiBhYm91dCBpdC4gKi8KKwlpZiAocnRjX3JlYWQoUlRDX1NFQ09ORFMpICYgMHg4MCkgeworCQl2b2x0YWdlX2xvdyA9IDE7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSVEMgVm9sdGFnZSBMb3cgLSByZWxpYWJsZSAiCisJCSAgICAgICAiZGF0ZS90aW1lIGluZm9ybWF0aW9uIGlzIG5vIGxvbmdlciBndWFyYW50ZWVkIVxuIiwKKwkJICAgICAgIFBDRjg1NjNfTkFNRSk7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXMgUmVhbC1UaW1lIENsb2NrIERyaXZlciwgJXNcbiIsIFBDRjg1NjNfTkFNRSwgRFJJVkVSX1ZFUlNJT04pOwotCi0JLyogQ2hlY2sgZm9yIGxvdyB2b2x0YWdlLCBhbmQgd2FybiBhYm91dCBpdC4uICovCi0JaWYgKHJ0Y19yZWFkKFJUQ19TRUNPTkRTKSAmIDB4ODApCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSVEMgVm9sdGFnZSBMb3cgLSByZWxpYWJsZSBkYXRlL3RpbWUgIgotCQkgICAgICAgImluZm9ybWF0aW9uIGlzIG5vIGxvbmdlciBndWFyYW50ZWVkIVxuIiwgUENGODU2M19OQU1FKTsKLQotCXJldHVybiAwOworCXJldHVybiByZXM7CiAKIGVycjoKIAlwcmludGsoS0VSTl9JTkZPICIlczogRXJyb3IgaW5pdGlhbGl6aW5nIGNoaXAuXG4iLCBQQ0Y4NTYzX05BTUUpOwotCXJldHVybiAtMTsKKwlyZXMgPSAtMTsKKwlyZXR1cm4gcmVzOwogfQogCiB2b2lkIF9fZXhpdApAQCAtMjAwLDggKzIwOCw4IEBACiAgKiBpb2N0bCBjYWxscyBmb3IgdGhpcyBkcml2ZXIuIFdoeSByZXR1cm4gLUVOT1RUWSB1cG9uIGVycm9yPyBCZWNhdXNlCiAgKiBQT1NJWCBzYXlzIHNvIQogICovCi1pbnQKLXBjZjg1NjNfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoraW50IHBjZjg1NjNfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJLyogU29tZSBzYW5pdHkgY2hlY2tzLiAqLwogCWlmIChfSU9DX1RZUEUoY21kKSAhPSBSVENfTUFHSUMpCkBAIC0yMTEsMTI1ICsyMTksMTQ3IEBACiAJCXJldHVybiAtRU5PVFRZOwogCiAJc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBSVENfUkRfVElNRToKLQkJewotCQkJc3RydWN0IHJ0Y190aW1lIHRtOworCWNhc2UgUlRDX1JEX1RJTUU6CisJeworCQlzdHJ1Y3QgcnRjX3RpbWUgdG07CiAKLQkJCW1lbXNldCgmdG0sIDAsIHNpemVvZiAoc3RydWN0IHJ0Y190aW1lKSk7Ci0JCQlnZXRfcnRjX3RpbWUoJnRtKTsKKwkJbXV0ZXhfbG9jaygmcnRjX2xvY2spOworCQltZW1zZXQoJnRtLCAwLCBzaXplb2YgdG0pOworCQlnZXRfcnRjX3RpbWUoJnRtKTsKIAotCQkJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IHJ0Y190aW1lICopIGFyZywgJnRtLCBzaXplb2YgdG0pKSB7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQl9Ci0KLQkJCXJldHVybiAwOworCQlpZiAoY29weV90b191c2VyKChzdHJ1Y3QgcnRjX3RpbWUgKikgYXJnLCAmdG0sCisJCQkJIHNpemVvZiB0bSkpIHsKKwkJCXNwaW5fdW5sb2NrKCZydGNfbG9jayk7CisJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQogCi0JCWNhc2UgUlRDX1NFVF9USU1FOgotCQl7Ci0jaWZkZWYgQ09ORklHX0VUUkFYX1JUQ19SRUFET05MWQorCQltdXRleF91bmxvY2soJnJ0Y19sb2NrKTsKKworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBSVENfU0VUX1RJTUU6CisJeworCQlpbnQgbGVhcDsKKwkJaW50IHllYXI7CisJCWludCBjZW50dXJ5OworCQlzdHJ1Y3QgcnRjX3RpbWUgdG07CisKKwkJbWVtc2V0KCZ0bSwgMCwgc2l6ZW9mIHRtKTsKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCiAJCQlyZXR1cm4gLUVQRVJNOwotI2Vsc2UKLQkJCWludCBsZWFwOwotCQkJaW50IHllYXI7Ci0JCQlpbnQgY2VudHVyeTsKLQkJCXN0cnVjdCBydGNfdGltZSB0bTsKIAotCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfVElNRSkpCi0JCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bSwgKHN0cnVjdCBydGNfdGltZSAqKSBhcmcsCisJCQkJICAgc2l6ZW9mIHRtKSkKKwkJCXJldHVybiAtRUZBVUxUOwogCi0JCQlpZiAoY29weV9mcm9tX3VzZXIoJnRtLCAoc3RydWN0IHJ0Y190aW1lICopIGFyZywgc2l6ZW9mIHRtKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJLyogQ29udmVydCBmcm9tIHN0cnVjdCB0bSB0byBzdHJ1Y3QgcnRjX3RpbWUuICovCisJCXRtLnRtX3llYXIgKz0gMTkwMDsKKwkJdG0udG1fbW9uICs9IDE7CiAKLQkJCS8qIENvbnZlcnQgZnJvbSBzdHJ1Y3QgdG0gdG8gc3RydWN0IHJ0Y190aW1lLiAqLwotCQkJdG0udG1feWVhciArPSAxOTAwOwotCQkJdG0udG1fbW9uICs9IDE7CisJCS8qCisJCSAqIENoZWNrIGlmIHRtLnRtX3llYXIgaXMgYSBsZWFwIHllYXIuIEEgeWVhciBpcyBhIGxlYXAKKwkJICogeWVhciBpZiBpdCBpcyBkaXZpc2libGUgYnkgNCBidXQgbm90IDEwMCwgZXhjZXB0CisJCSAqIHRoYXQgeWVhcnMgZGl2aXNpYmxlIGJ5IDQwMCBfYXJlXyBsZWFwIHllYXJzLgorCQkgKi8KKwkJeWVhciA9IHRtLnRtX3llYXI7CisJCWxlYXAgPSAodG0udG1fbW9uID09IDIpICYmCisJCQkoKHllYXIgJSA0ID09IDAgJiYgeWVhciAlIDEwMCAhPSAwKSB8fCB5ZWFyICUgNDAwID09IDApOwogCi0JCQkvKgotCQkJICogQ2hlY2sgaWYgdG0udG1feWVhciBpcyBhIGxlYXAgeWVhci4gQSB5ZWFyIGlzIGEgbGVhcAotCQkJICogeWVhciBpZiBpdCBpcyBkaXZpc2libGUgYnkgNCBidXQgbm90IDEwMCwgZXhjZXB0Ci0JCQkgKiB0aGF0IHllYXJzIGRpdmlzaWJsZSBieSA0MDAgX2FyZV8gbGVhcCB5ZWFycy4KLQkJCSAqLwotCQkJeWVhciA9IHRtLnRtX3llYXI7Ci0JCQlsZWFwID0gKHRtLnRtX21vbiA9PSAyKSAmJiAoKHllYXIgJSA0ID09IDAgJiYgeWVhciAlIDEwMCAhPSAwKSB8fCB5ZWFyICUgNDAwID09IDApOworCQkvKiBQZXJmb3JtIHNvbWUgc2FuaXR5IGNoZWNrcy4gKi8KKwkJaWYgKCh0bS50bV95ZWFyIDwgMTk3MCkgfHwKKwkJICAgICh0bS50bV9tb24gPiAxMikgfHwKKwkJICAgICh0bS50bV9tZGF5ID09IDApIHx8CisJCSAgICAodG0udG1fbWRheSA+IGRheXNfaW5fbW9udGhbdG0udG1fbW9uXSArIGxlYXApIHx8CisJCSAgICAodG0udG1fd2RheSA+PSA3KSB8fAorCQkgICAgKHRtLnRtX2hvdXIgPj0gMjQpIHx8CisJCSAgICAodG0udG1fbWluID49IDYwKSB8fAorCQkgICAgKHRtLnRtX3NlYyA+PSA2MCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJLyogUGVyZm9ybSBzb21lIHNhbml0eSBjaGVja3MuICovCi0JCQlpZiAoKHRtLnRtX3llYXIgPCAxOTcwKSB8fAotCQkJICAgICh0bS50bV9tb24gPiAxMikgfHwKLQkJCSAgICAodG0udG1fbWRheSA9PSAwKSB8fAotCQkJICAgICh0bS50bV9tZGF5ID4gZGF5c19pbl9tb250aFt0bS50bV9tb25dICsgbGVhcCkgfHwKLQkJCSAgICAodG0udG1fd2RheSA+PSA3KSB8fAotCQkJICAgICh0bS50bV9ob3VyID49IDI0KSB8fAotCQkJICAgICh0bS50bV9taW4gPj0gNjApIHx8Ci0JCQkgICAgKHRtLnRtX3NlYyA+PSA2MCkpCi0JCQkJcmV0dXJuIC1FSU5WQUw7CisJCWNlbnR1cnkgPSAodG0udG1feWVhciA+PSAyMDAwKSA/IDB4ODAgOiAwOworCQl0bS50bV95ZWFyID0gdG0udG1feWVhciAlIDEwMDsKIAotCQkJY2VudHVyeSA9ICh0bS50bV95ZWFyID49IDIwMDApID8gMHg4MCA6IDA7Ci0JCQl0bS50bV95ZWFyID0gdG0udG1feWVhciAlIDEwMDsKKwkJQklOX1RPX0JDRCh0bS50bV95ZWFyKTsKKwkJQklOX1RPX0JDRCh0bS50bV9tb24pOworCQlCSU5fVE9fQkNEKHRtLnRtX21kYXkpOworCQlCSU5fVE9fQkNEKHRtLnRtX2hvdXIpOworCQlCSU5fVE9fQkNEKHRtLnRtX21pbik7CisJCUJJTl9UT19CQ0QodG0udG1fc2VjKTsKKwkJdG0udG1fbW9uIHw9IGNlbnR1cnk7CiAKLQkJCUJJTl9UT19CQ0QodG0udG1feWVhcik7Ci0JCQlCSU5fVE9fQkNEKHRtLnRtX21kYXkpOwotCQkJQklOX1RPX0JDRCh0bS50bV9ob3VyKTsKLQkJCUJJTl9UT19CQ0QodG0udG1fbWluKTsKLQkJCUJJTl9UT19CQ0QodG0udG1fc2VjKTsKLQkJCXRtLnRtX21vbiB8PSBjZW50dXJ5OworCQltdXRleF9sb2NrKCZydGNfbG9jayk7CiAKLQkJCXJ0Y193cml0ZShSVENfWUVBUiwgdG0udG1feWVhcik7Ci0JCQlydGNfd3JpdGUoUlRDX01PTlRILCB0bS50bV9tb24pOwotCQkJcnRjX3dyaXRlKFJUQ19XRUVLREFZLCB0bS50bV93ZGF5KTsgLyogTm90IGNvZGVkIGluIEJDRC4gKi8KLQkJCXJ0Y193cml0ZShSVENfREFZX09GX01PTlRILCB0bS50bV9tZGF5KTsKLQkJCXJ0Y193cml0ZShSVENfSE9VUlMsIHRtLnRtX2hvdXIpOwotCQkJcnRjX3dyaXRlKFJUQ19NSU5VVEVTLCB0bS50bV9taW4pOwotCQkJcnRjX3dyaXRlKFJUQ19TRUNPTkRTLCB0bS50bV9zZWMpOworCQlydGNfd3JpdGUoUlRDX1lFQVIsIHRtLnRtX3llYXIpOworCQlydGNfd3JpdGUoUlRDX01PTlRILCB0bS50bV9tb24pOworCQlydGNfd3JpdGUoUlRDX1dFRUtEQVksIHRtLnRtX3dkYXkpOyAvKiBOb3QgY29kZWQgaW4gQkNELiAqLworCQlydGNfd3JpdGUoUlRDX0RBWV9PRl9NT05USCwgdG0udG1fbWRheSk7CisJCXJ0Y193cml0ZShSVENfSE9VUlMsIHRtLnRtX2hvdXIpOworCQlydGNfd3JpdGUoUlRDX01JTlVURVMsIHRtLnRtX21pbik7CisJCXJ0Y193cml0ZShSVENfU0VDT05EUywgdG0udG1fc2VjKTsKIAotCQkJcmV0dXJuIDA7Ci0jZW5kaWYgLyogIUNPTkZJR19FVFJBWF9SVENfUkVBRE9OTFkgKi8KLQkJfQorCQltdXRleF91bmxvY2soJnJ0Y19sb2NrKTsKIAotCQljYXNlIFJUQ19WTE9XX1JEOgotCQl7Ci0JCQlpbnQgdmxfYml0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgUlRDX1ZMX1JFQUQ6CisJCWlmICh2b2x0YWdlX2xvdykKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJUQyBWb2x0YWdlIExvdyAtICIKKwkJCSAgICAgICAicmVsaWFibGUgZGF0ZS90aW1lIGluZm9ybWF0aW9uIGlzIG5vICIKKwkJCSAgICAgICAibG9uZ2VyIGd1YXJhbnRlZWQhXG4iLCBQQ0Y4NTYzX05BTUUpOwogCi0JCQlpZiAocnRjX3JlYWQoUlRDX1NFQ09ORFMpICYgMHg4MCkgewotCQkJCXZsX2JpdCA9IDE7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJUQyBWb2x0YWdlIExvdyAtIHJlbGlhYmxlICIKLQkJCQkgICAgICAgImRhdGUvdGltZSBpbmZvcm1hdGlvbiBpcyBubyBsb25nZXIgZ3VhcmFudGVlZCFcbiIsCi0JCQkJICAgICAgIFBDRjg1NjNfTkFNRSk7Ci0JCQl9Ci0JCQlpZiAoY29weV90b191c2VyKChpbnQgKikgYXJnLCAmdmxfYml0LCBzaXplb2YoaW50KSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChjb3B5X3RvX3VzZXIoKGludCAqKSBhcmcsICZ2b2x0YWdlX2xvdywgc2l6ZW9mKGludCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOwogCi0JCQlyZXR1cm4gMDsKLQkJfQorCWNhc2UgUlRDX1ZMX0NMUjoKKwl7CisJCS8qIENsZWFyIHRoZSBWTCBiaXQgaW4gdGhlIHNlY29uZHMgcmVnaXN0ZXIgaW4gY2FzZQorCQkgKiB0aGUgdGltZSBoYXMgbm90IGJlZW4gc2V0IGFscmVhZHkgKHdoaWNoIHdvdWxkCisJCSAqIGhhdmUgY2xlYXJlZCBpdCkuIFRoaXMgZG9lcyBub3QgcmVhbGx5IG1hdHRlcgorCQkgKiBiZWNhdXNlIG9mIHRoZSBjYWNoZWQgdm9sdGFnZV9sb3cgdmFsdWUgYnV0IGRvIGl0CisJCSAqIGFueXdheSBmb3IgY29uc2lzdGVuY3kuICovCiAKLQkJY2FzZSBSVENfVkxPV19TRVQ6Ci0JCXsKLQkJCS8qIENsZWFyIHRoZSBWTCBiaXQgaW4gdGhlIHNlY29uZHMgcmVnaXN0ZXIgKi8KLQkJCWludCByZXQgPSBydGNfcmVhZChSVENfU0VDT05EUyk7CisJCWludCByZXQgPSBydGNfcmVhZChSVENfU0VDT05EUyk7CiAKLQkJCXJ0Y193cml0ZShSVENfU0VDT05EUywgKHJldCAmIDB4N0YpKTsKKwkJcnRjX3dyaXRlKFJUQ19TRUNPTkRTLCAocmV0ICYgMHg3RikpOwogCi0JCQlyZXR1cm4gMDsKLQkJfQorCQkvKiBDbGVhciB0aGUgY2FjaGVkIHZhbHVlLiAqLworCQl2b2x0YWdlX2xvdyA9IDA7CiAKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRU5PVFRZOworCQlyZXR1cm4gMDsKKwl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UVFk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLWludAotcGNmODU2M19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIGludCBfX2luaXQgcGNmODU2M19yZWdpc3Rlcih2b2lkKQogeworCWlmIChwY2Y4NTYzX2luaXQoKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVuYWJsZSB0byBpbml0aWFsaXplIFJlYWwtVGltZSBDbG9jayAiCisJCSAgICAgICAiRHJpdmVyLCAlc1xuIiwgUENGODU2M19OQU1FLCBEUklWRVJfVkVSU0lPTik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocmVnaXN0ZXJfY2hyZGV2KFBDRjg1NjNfTUFKT1IsIERFVklDRV9OQU1FLCAmcGNmODU2M19mb3BzKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVuYWJsZSB0byBnZXQgbWFqb3IgbnVtZXIgJWQgZm9yIFJUQyAiCisJCSAgICAgICAiZGV2aWNlLlxuIiwgUENGODU2M19OQU1FLCBQQ0Y4NTYzX01BSk9SKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzIFJlYWwtVGltZSBDbG9jayBEcml2ZXIsICVzXG4iLCBQQ0Y4NTYzX05BTUUsCisJICAgICAgIERSSVZFUl9WRVJTSU9OKTsKKworCS8qIENoZWNrIGZvciBsb3cgdm9sdGFnZSwgYW5kIHdhcm4gYWJvdXQgaXQuICovCisJaWYgKHZvbHRhZ2VfbG93KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSVEMgVm9sdGFnZSBMb3cgLSByZWxpYWJsZSBkYXRlL3RpbWUgIgorCQkgICAgICAgImluZm9ybWF0aW9uIGlzIG5vIGxvbmdlciBndWFyYW50ZWVkIVxuIiwgUENGODU2M19OQU1FKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIAotaW50Ci1wY2Y4NTYzX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLW1vZHVsZV9pbml0KHBjZjg1NjNfaW5pdCk7Cittb2R1bGVfaW5pdChwY2Y4NTYzX3JlZ2lzdGVyKTsKIG1vZHVsZV9leGl0KHBjZjg1NjNfZXhpdCk7CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9zeW5jX3NlcmlhbC5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvc3luY19zZXJpYWwuYwppbmRleCBkNTgxYjBhLi40N2MzNzdkIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9zeW5jX3NlcmlhbC5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL3N5bmNfc2VyaWFsLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogU2ltcGxlIHN5bmNocm9ub3VzIHNlcmlhbCBwb3J0IGRyaXZlciBmb3IgRVRSQVggRlMuCisgKiBTaW1wbGUgc3luY2hyb25vdXMgc2VyaWFsIHBvcnQgZHJpdmVyIGZvciBFVFJBWCBGUyBhbmQgQXJ0cGVjLTMuCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDA1IEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIKICAqCkBAIC0yMSwxNyArMjEsMTggQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvcGlubXV4Lmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL3JlZ19yZHdyLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL3NzZXJfZGVmcy5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9kbWFfZGVmcy5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9kbWEuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvaW50cl92ZWN0X2RlZnMuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvaW50cl92ZWN0Lmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL3JlZ19tYXAuaD4KKyNpbmNsdWRlIDxkbWEuaD4KKyNpbmNsdWRlIDxwaW5tdXguaD4KKyNpbmNsdWRlIDxod3JlZ3MvcmVnX3Jkd3IuaD4KKyNpbmNsdWRlIDxod3JlZ3Mvc3Nlcl9kZWZzLmg+CisjaW5jbHVkZSA8aHdyZWdzL2RtYV9kZWZzLmg+CisjaW5jbHVkZSA8aHdyZWdzL2RtYS5oPgorI2luY2x1ZGUgPGh3cmVncy9pbnRyX3ZlY3RfZGVmcy5oPgorI2luY2x1ZGUgPGh3cmVncy9pbnRyX3ZlY3QuaD4KKyNpbmNsdWRlIDxod3JlZ3MvcmVnX21hcC5oPgogI2luY2x1ZGUgPGFzbS9zeW5jX3NlcmlhbC5oPgogCisKIC8qIFRoZSByZWNlaXZlciBpcyBhIGJpdCB0cmlja3kgYmVhY3VzZSBvZiB0aGUgY29udGludW91cyBzdHJlYW0gb2YgZGF0YS4qLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBUaHJlZSBETUEgZGVzY3JpcHRvcnMgYXJlIGxpbmtlZCB0b2dldGhlci4gRWFjaCBETUEgZGVzY3JpcHRvciBpcyAgICAgKi8KQEAgLTYzLDggKzY0LDEwIEBACiAvKiB3b3JkcyBjYW4gYmUgaGFuZGxlZCAqLwogI2RlZmluZSBJTl9CVUZGRVJfU0laRSAxMjI4OAogI2RlZmluZSBJTl9ERVNDUl9TSVpFIDI1NgotI2RlZmluZSBOVU1fSU5fREVTQ1IgKElOX0JVRkZFUl9TSVpFL0lOX0RFU0NSX1NJWkUpCi0jZGVmaW5lIE9VVF9CVUZGRVJfU0laRSA0MDk2CisjZGVmaW5lIE5CUl9JTl9ERVNDUiAoSU5fQlVGRkVSX1NJWkUvSU5fREVTQ1JfU0laRSkKKworI2RlZmluZSBPVVRfQlVGRkVSX1NJWkUgMTAyNCo4CisjZGVmaW5lIE5CUl9PVVRfREVTQ1IgOAogCiAjZGVmaW5lIERFRkFVTFRfRlJBTUVfUkFURSAwCiAjZGVmaW5lIERFRkFVTFRfV09SRF9SQVRFIDcKQEAgLTc4LDYgKzgxLDggQEAKICNkZWZpbmUgREVCVUdQT0xMKHgpCiAjZGVmaW5lIERFQlVHUlhJTlQoeCkKICNkZWZpbmUgREVCVUdUWElOVCh4KQorI2RlZmluZSBERUJVR1RSRE1BKHgpCisjZGVmaW5lIERFQlVHT1VUQlVGKHgpCiAKIHR5cGVkZWYgc3RydWN0IHN5bmNfcG9ydAogewpAQCAtOTcsMTAgKzEwMiwxMSBAQAogCWludCBvdXRwdXQ7CiAJaW50IGlucHV0OwogCi0Jdm9sYXRpbGUgdW5zaWduZWQgaW50IG91dF9jb3VudDsgLyogUmVtYWluaW5nIGJ5dGVzIGZvciBjdXJyZW50IHRyYW5zZmVyICovCi0JdW5zaWduZWQgY2hhciogb3V0cDsgLyogQ3VycmVudCBwb3NpdGlvbiBpbiBvdXRfYnVmZmVyICovCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciogdm9sYXRpbGUgcmVhZHA7ICAvKiBOZXh0IGJ5dGUgdG8gYmUgcmVhZCBieSBhcHBsaWNhdGlvbiAqLwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqIHZvbGF0aWxlIHdyaXRlcDsgLyogTmV4dCBieXRlIHRvIGJlIHdyaXR0ZW4gYnkgZXRyYXggKi8KKwkvKiBOZXh0IGJ5dGUgdG8gYmUgcmVhZCBieSBhcHBsaWNhdGlvbiAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnZvbGF0aWxlIHJlYWRwOworCS8qIE5leHQgYnl0ZSB0byBiZSB3cml0dGVuIGJ5IGV0cmF4ICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqdm9sYXRpbGUgd3JpdGVwOworCiAJdW5zaWduZWQgaW50IGluX2J1ZmZlcl9zaXplOwogCXVuc2lnbmVkIGludCBpbmJ1ZmNodW5rOwogCXVuc2lnbmVkIGNoYXIgb3V0X2J1ZmZlcltPVVRfQlVGRkVSX1NJWkVdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDMyKSkpOwpAQCAtMTA4LDExICsxMTQsMzAgQEAKIAl1bnNpZ25lZCBjaGFyIGZsaXBbSU5fQlVGRkVSX1NJWkVdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDMyKSkpOwogCXN0cnVjdCBkbWFfZGVzY3JfZGF0YSogbmV4dF9yeF9kZXNjOwogCXN0cnVjdCBkbWFfZGVzY3JfZGF0YSogcHJldl9yeF9kZXNjOworCisJLyogUG9pbnRlciB0byB0aGUgZmlyc3QgYXZhaWxhYmxlIGRlc2NyaXB0b3IgaW4gdGhlIHJpbmcsCisJICogdW5sZXNzIGFjdGl2ZV90cl9kZXNjciA9PSBjYXRjaF90cl9kZXNjciBhbmQgYSBkbWEKKwkgKiB0cmFuc2ZlciBpcyBhY3RpdmUgKi8KKwlzdHJ1Y3QgZG1hX2Rlc2NyX2RhdGEgKmFjdGl2ZV90cl9kZXNjcjsKKworCS8qIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGFsbG9jYXRlZCBkZXNjcmlwdG9yIGluIHRoZSByaW5nICovCisJc3RydWN0IGRtYV9kZXNjcl9kYXRhICpjYXRjaF90cl9kZXNjcjsKKworCS8qIFBvaW50ZXIgdG8gdGhlIGRlc2NyaXB0b3Igd2l0aCB0aGUgY3VycmVudCBlbmQtb2YtbGlzdCAqLworCXN0cnVjdCBkbWFfZGVzY3JfZGF0YSAqcHJldl90cl9kZXNjcjsKIAlpbnQgZnVsbDsKIAotCWRtYV9kZXNjcl9kYXRhIGluX2Rlc2NyW05VTV9JTl9ERVNDUl0gX19hdHRyaWJ1dGVfXyAoKF9fYWxpZ25lZF9fKDE2KSkpOworCS8qIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ5dGUgYmVpbmcgcmVhZCBieSBETUEKKwkgKiBvciBjdXJyZW50IHBvc2l0aW9uIGluIG91dF9idWZmZXIgaWYgbm90IHVzaW5nIERNQS4gKi8KKwl1bnNpZ25lZCBjaGFyICpvdXRfcmRfcHRyOworCisJLyogTnVtYmVyIG9mIGJ5dGVzIGN1cnJlbnRseSBsb2NrZWQgZm9yIGJlaW5nIHJlYWQgYnkgRE1BICovCisJaW50IG91dF9idWZfY291bnQ7CisKKwlkbWFfZGVzY3JfZGF0YSBpbl9kZXNjcltOQlJfSU5fREVTQ1JdIF9fYXR0cmlidXRlX18gKChfX2FsaWduZWRfXygxNikpKTsKIAlkbWFfZGVzY3JfY29udGV4dCBpbl9jb250ZXh0IF9fYXR0cmlidXRlX18gKChfX2FsaWduZWRfXygzMikpKTsKLQlkbWFfZGVzY3JfZGF0YSBvdXRfZGVzY3IgX19hdHRyaWJ1dGVfXyAoKF9fYWxpZ25lZF9fKDE2KSkpOworCWRtYV9kZXNjcl9kYXRhIG91dF9kZXNjcltOQlJfT1VUX0RFU0NSXQorCQlfX2F0dHJpYnV0ZV9fICgoX19hbGlnbmVkX18oMTYpKSk7CiAJZG1hX2Rlc2NyX2NvbnRleHQgb3V0X2NvbnRleHQgX19hdHRyaWJ1dGVfXyAoKF9fYWxpZ25lZF9fKDMyKSkpOwogCXdhaXRfcXVldWVfaGVhZF90IG91dF93YWl0X3E7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgaW5fd2FpdF9xOwpAQCAtMTQzLDExICsxNjgsMTEgQEAKICNlbmRpZgogCiBzdGF0aWMgdm9pZCBzZW5kX3dvcmQoc3luY19wb3J0KiBwb3J0KTsKLXN0YXRpYyB2b2lkIHN0YXJ0X2RtYShzdHJ1Y3Qgc3luY19wb3J0ICpwb3J0LCBjb25zdCBjaGFyKiBkYXRhLCBpbnQgY291bnQpOworc3RhdGljIHZvaWQgc3RhcnRfZG1hX291dChzdHJ1Y3Qgc3luY19wb3J0ICpwb3J0LCBjb25zdCBjaGFyICpkYXRhLCBpbnQgY291bnQpOwogc3RhdGljIHZvaWQgc3RhcnRfZG1hX2luKHN5bmNfcG9ydCogcG9ydCk7CiAjaWZkZWYgU1lOQ19TRVJfRE1BCi1zdGF0aWMgaXJxcmV0dXJuX3QgdHJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKTsKLXN0YXRpYyBpcnFyZXR1cm5fdCByeF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOworc3RhdGljIGlycXJldHVybl90IHRyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworc3RhdGljIGlycXJldHVybl90IHJ4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogI2VuZGlmCiAKICNpZiAoZGVmaW5lZChDT05GSUdfRVRSQVhfU1lOQ0hST05PVVNfU0VSSUFMX1BPUlQwKSAmJiBcCkBAIC0xNTcsMjIgKzE4Miw0OSBAQAogI2RlZmluZSBTWU5DX1NFUl9NQU5VQUwKICNlbmRpZgogI2lmZGVmIFNZTkNfU0VSX01BTlVBTAotc3RhdGljIGlycXJldHVybl90IG1hbnVhbF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOworc3RhdGljIGlycXJldHVybl90IG1hbnVhbF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0VUUkFYRlMJLyogRVRSQVggRlMgKi8KKyNkZWZpbmUgT1VUX0RNQV9OQlIgNAorI2RlZmluZSBJTl9ETUFfTkJSIDUKKyNkZWZpbmUgUElOTVVYX1NTRVIgcGlubXV4X3NzZXIwCisjZGVmaW5lIFNZTkNTRVJfSU5TVCByZWdpX3NzZXIwCisjZGVmaW5lIFNZTkNTRVJfSU5UUl9WRUNUIFNTRVIwX0lOVFJfVkVDVAorI2RlZmluZSBPVVRfRE1BX0lOU1QgcmVnaV9kbWE0CisjZGVmaW5lIElOX0RNQV9JTlNUIHJlZ2lfZG1hNQorI2RlZmluZSBETUFfT1VUX0lOVFJfVkVDVCBETUE0X0lOVFJfVkVDVAorI2RlZmluZSBETUFfSU5fSU5UUl9WRUNUIERNQTVfSU5UUl9WRUNUCisjZGVmaW5lIFJFUV9ETUFfU1lOQ1NFUiBkbWFfc3NlcjAKKyNlbHNlCQkJLyogQXJ0cGVjLTMgKi8KKyNkZWZpbmUgT1VUX0RNQV9OQlIgNgorI2RlZmluZSBJTl9ETUFfTkJSIDcKKyNkZWZpbmUgUElOTVVYX1NTRVIgcGlubXV4X3NzZXIKKyNkZWZpbmUgU1lOQ1NFUl9JTlNUIHJlZ2lfc3NlcgorI2RlZmluZSBTWU5DU0VSX0lOVFJfVkVDVCBTU0VSX0lOVFJfVkVDVAorI2RlZmluZSBPVVRfRE1BX0lOU1QgcmVnaV9kbWE2CisjZGVmaW5lIElOX0RNQV9JTlNUIHJlZ2lfZG1hNworI2RlZmluZSBETUFfT1VUX0lOVFJfVkVDVCBETUE2X0lOVFJfVkVDVAorI2RlZmluZSBETUFfSU5fSU5UUl9WRUNUIERNQTdfSU5UUl9WRUNUCisjZGVmaW5lIFJFUV9ETUFfU1lOQ1NFUiBkbWFfc3NlcgogI2VuZGlmCiAKIC8qIFRoZSBwb3J0cyAqLwogc3RhdGljIHN0cnVjdCBzeW5jX3BvcnQgcG9ydHNbXT0KIHsKIAl7Ci0JCS5yZWdpX3NzZXIgICAgICAgICAgICAgPSByZWdpX3NzZXIwLAotCQkucmVnaV9kbWFvdXQgICAgICAgICAgID0gcmVnaV9kbWE0LAotCQkucmVnaV9kbWFpbiAgICAgICAgICAgID0gcmVnaV9kbWE1LAorCQkucmVnaV9zc2VyICAgICAgICAgICAgID0gU1lOQ1NFUl9JTlNULAorCQkucmVnaV9kbWFvdXQgICAgICAgICAgID0gT1VUX0RNQV9JTlNULAorCQkucmVnaV9kbWFpbiAgICAgICAgICAgID0gSU5fRE1BX0lOU1QsCiAjaWYgZGVmaW5lZChDT05GSUdfRVRSQVhfU1lOQ0hST05PVVNfU0VSSUFMMF9ETUEpCiAgICAgICAgICAgICAgICAgLnVzZV9kbWEgICAgICAgICAgICAgICA9IDEsCiAjZWxzZQogICAgICAgICAgICAgICAgIC51c2VfZG1hICAgICAgICAgICAgICAgPSAwLAogI2VuZGlmCi0JfSwKKwl9CisjaWZkZWYgQ09ORklHX0VUUkFYRlMKKwksCisKIAl7CiAJCS5yZWdpX3NzZXIgICAgICAgICAgICAgPSByZWdpX3NzZXIxLAogCQkucmVnaV9kbWFvdXQgICAgICAgICAgID0gcmVnaV9kbWE2LApAQCAtMTgzLDkgKzIzNSwxMCBAQAogICAgICAgICAgICAgICAgIC51c2VfZG1hICAgICAgICAgICAgICAgPSAwLAogI2VuZGlmCiAJfQorI2VuZGlmCiB9OwogCi0jZGVmaW5lIE5VTUJFUl9PRl9QT1JUUyBBUlJBWV9TSVpFKHBvcnRzKQorI2RlZmluZSBOQlJfUE9SVFMgQVJSQVlfU0laRShwb3J0cykKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3luY19zZXJpYWxfZm9wcyA9IHsKIAkub3duZXIgICA9IFRISVNfTU9EVUxFLApAQCAtMjAwLDE5ICsyNTMsMjEgQEAKIHN0YXRpYyBpbnQgX19pbml0IGV0cmF4X3N5bmNfc2VyaWFsX2luaXQodm9pZCkKIHsKIAlwb3J0c1swXS5lbmFibGVkID0gMDsKKyNpZmRlZiBDT05GSUdfRVRSQVhGUwogCXBvcnRzWzFdLmVuYWJsZWQgPSAwOwotCi0JaWYgKHJlZ2lzdGVyX2NocmRldihTWU5DX1NFUklBTF9NQUpPUiwic3luYyBzZXJpYWwiLCAmc3luY19zZXJpYWxfZm9wcykgPDAgKQotCXsKLQkJcHJpbnRrKCJ1bmFibGUgdG8gZ2V0IG1ham9yIGZvciBzeW5jaHJvbm91cyBzZXJpYWwgcG9ydFxuIik7CisjZW5kaWYKKwlpZiAocmVnaXN0ZXJfY2hyZGV2KFNZTkNfU0VSSUFMX01BSk9SLCAic3luYyBzZXJpYWwiLAorCQkJJnN5bmNfc2VyaWFsX2ZvcHMpIDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiVW5hYmxlIHRvIGdldCBtYWpvciBmb3Igc3luY2hyb25vdXMgc2VyaWFsIHBvcnRcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCS8qIEluaXRpYWxpemUgUG9ydHMgKi8KICNpZiBkZWZpbmVkKENPTkZJR19FVFJBWF9TWU5DSFJPTk9VU19TRVJJQUxfUE9SVDApCi0JaWYgKGNyaXN2MzJfcGlubXV4X2FsbG9jX2ZpeGVkKHBpbm11eF9zc2VyMCkpCi0JewotCQlwcmludGsoIlVuYWJsZSB0byBhbGxvY2F0ZSBwaW5zIGZvciBzeW5jcmhyb25vdXMgc2VyaWFsIHBvcnQgMFxuIik7CisJaWYgKGNyaXN2MzJfcGlubXV4X2FsbG9jX2ZpeGVkKFBJTk1VWF9TU0VSKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiVW5hYmxlIHRvIGFsbG9jIHBpbnMgZm9yIHN5bmNocm9ub3VzIHNlcmlhbCBwb3J0IDBcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJcG9ydHNbMF0uZW5hYmxlZCA9IDE7CkBAIC0yMjAsMzMgKzI3NSw0MCBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19FVFJBWF9TWU5DSFJPTk9VU19TRVJJQUxfUE9SVDEpCi0JaWYgKGNyaXN2MzJfcGlubXV4X2FsbG9jX2ZpeGVkKHBpbm11eF9zc2VyMSkpCi0JewotCQlwcmludGsoIlVuYWJsZSB0byBhbGxvY2F0ZSBwaW5zIGZvciBzeW5jcmhyb25vdXMgc2VyaWFsIHBvcnQgMFxuIik7CisJaWYgKGNyaXN2MzJfcGlubXV4X2FsbG9jX2ZpeGVkKHBpbm11eF9zc2VyMSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIlVuYWJsZSB0byBhbGxvYyBwaW5zIGZvciBzeW5jaHJvbm91cyBzZXJpYWwgcG9ydCAwXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCXBvcnRzWzFdLmVuYWJsZWQgPSAxOwogCWluaXRpYWxpemVfcG9ydCgxKTsKICNlbmRpZgogCi0JcHJpbnRrKCJFVFJBWCBGUyBzeW5jaHJvbm91cyBzZXJpYWwgcG9ydCBkcml2ZXJcbiIpOworI2lmZGVmIENPTkZJR19FVFJBWEZTCisJcHJpbnRrKEtFUk5fSU5GTyAiRVRSQVggRlMgc3luY2hyb25vdXMgc2VyaWFsIHBvcnQgZHJpdmVyXG4iKTsKKyNlbHNlCisJcHJpbnRrKEtFUk5fSU5GTyAiQXJ0cGVjLTMgc3luY2hyb25vdXMgc2VyaWFsIHBvcnQgZHJpdmVyXG4iKTsKKyNlbmRpZgogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgaW5pdGlhbGl6ZV9wb3J0KGludCBwb3J0bmJyKQogewotCXN0cnVjdCBzeW5jX3BvcnQqIHBvcnQgPSAmcG9ydHNbcG9ydG5icl07CisJaW50IF9fYXR0cmlidXRlX18oKHVudXNlZCkpIGk7CisJc3RydWN0IHN5bmNfcG9ydCAqcG9ydCA9ICZwb3J0c1twb3J0bmJyXTsKIAlyZWdfc3Nlcl9yd19jZmcgY2ZnID0gezB9OwogCXJlZ19zc2VyX3J3X2ZybV9jZmcgZnJtX2NmZyA9IHswfTsKIAlyZWdfc3Nlcl9yd190cl9jZmcgdHJfY2ZnID0gezB9OwogCXJlZ19zc2VyX3J3X3JlY19jZmcgcmVjX2NmZyA9IHswfTsKIAotCURFQlVHKHByaW50aygiSW5pdCBzeW5jIHNlcmlhbCBwb3J0ICVkXG4iLCBwb3J0bmJyKSk7CisJREVCVUcocHJpbnRrKEtFUk5fREVCVUcgIkluaXQgc3luYyBzZXJpYWwgcG9ydCAlZFxuIiwgcG9ydG5icikpOwogCiAJcG9ydC0+cG9ydF9uYnIgPSBwb3J0bmJyOwogCXBvcnQtPmluaXRfaXJxcyA9IDE7CiAKLQlwb3J0LT5vdXRwID0gcG9ydC0+b3V0X2J1ZmZlcjsKKwlwb3J0LT5vdXRfcmRfcHRyID0gcG9ydC0+b3V0X2J1ZmZlcjsKKwlwb3J0LT5vdXRfYnVmX2NvdW50ID0gMDsKKwogCXBvcnQtPm91dHB1dCA9IDE7CiAJcG9ydC0+aW5wdXQgPSAwOwogCkBAIC0yNTUsNyArMzE3LDcgQEAKIAlwb3J0LT5pbl9idWZmZXJfc2l6ZSA9IElOX0JVRkZFUl9TSVpFOwogCXBvcnQtPmluYnVmY2h1bmsgPSBJTl9ERVNDUl9TSVpFOwogCXBvcnQtPm5leHRfcnhfZGVzYyA9ICZwb3J0LT5pbl9kZXNjclswXTsKLQlwb3J0LT5wcmV2X3J4X2Rlc2MgPSAmcG9ydC0+aW5fZGVzY3JbTlVNX0lOX0RFU0NSLTFdOworCXBvcnQtPnByZXZfcnhfZGVzYyA9ICZwb3J0LT5pbl9kZXNjcltOQlJfSU5fREVTQ1ItMV07CiAJcG9ydC0+cHJldl9yeF9kZXNjLT5lb2wgPSAxOwogCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydC0+b3V0X3dhaXRfcSk7CkBAIC0yODYsOCArMzQ4LDEzIEBACiAJdHJfY2ZnLnNhbXBsZV9zaXplID0gNzsKIAl0cl9jZmcuc2hfZGlyID0gcmVna19zc2VyX21zYmZpcnN0OwogCXRyX2NmZy51c2VfZG1hID0gcG9ydC0+dXNlX2RtYSA/IHJlZ2tfc3Nlcl95ZXMgOiByZWdrX3NzZXJfbm87CisjaWYgMAogCXRyX2NmZy5yYXRlX2N0cmwgPSByZWdrX3NzZXJfYnVsazsKIAl0cl9jZmcuZGF0YV9waW5fdXNlID0gcmVna19zc2VyX2RvdXQ7CisjZWxzZQorCXRyX2NmZy5yYXRlX2N0cmwgPSByZWdrX3NzZXJfaXNvOworCXRyX2NmZy5kYXRhX3Bpbl91c2UgPSByZWdrX3NzZXJfZG91dDsKKyNlbmRpZgogCXRyX2NmZy5idWxrX3dzcGFjZSA9IDE7CiAJUkVHX1dSKHNzZXIsIHBvcnQtPnJlZ2lfc3NlciwgcndfdHJfY2ZnLCB0cl9jZmcpOwogCkBAIC0yOTYsNiArMzYzLDI3IEBACiAJcmVjX2NmZy51c2VfZG1hID0gcG9ydC0+dXNlX2RtYSA/IHJlZ2tfc3Nlcl95ZXMgOiByZWdrX3NzZXJfbm87CiAJcmVjX2NmZy5maWZvX3RociA9IHJlZ2tfc3Nlcl9pbmY7CiAJUkVHX1dSKHNzZXIsIHBvcnQtPnJlZ2lfc3NlciwgcndfcmVjX2NmZywgcmVjX2NmZyk7CisKKyNpZmRlZiBTWU5DX1NFUl9ETUEKKwkvKiBTZXR1cCB0aGUgZGVzY3JpcHRvciByaW5nIGZvciBkbWEgb3V0L3RyYW5zbWl0LiAqLworCWZvciAoaSA9IDA7IGkgPCBOQlJfT1VUX0RFU0NSOyBpKyspIHsKKwkJcG9ydC0+b3V0X2Rlc2NyW2ldLndhaXQgPSAwOworCQlwb3J0LT5vdXRfZGVzY3JbaV0uaW50ciA9IDE7CisJCXBvcnQtPm91dF9kZXNjcltpXS5lb2wgPSAwOworCQlwb3J0LT5vdXRfZGVzY3JbaV0ub3V0X2VvcCA9IDA7CisJCXBvcnQtPm91dF9kZXNjcltpXS5uZXh0ID0KKwkJCShkbWFfZGVzY3JfZGF0YSAqKXZpcnRfdG9fcGh5cygmcG9ydC0+b3V0X2Rlc2NyW2krMV0pOworCX0KKworCS8qIENyZWF0ZSBhIHJpbmcgZnJvbSB0aGUgbGlzdC4gKi8KKwlwb3J0LT5vdXRfZGVzY3JbTkJSX09VVF9ERVNDUi0xXS5uZXh0ID0KKwkJKGRtYV9kZXNjcl9kYXRhICopdmlydF90b19waHlzKCZwb3J0LT5vdXRfZGVzY3JbMF0pOworCisJLyogU2V0dXAgY29udGV4dCBmb3IgdHJhdmVyc2luZyB0aGUgcmluZy4gKi8KKwlwb3J0LT5hY3RpdmVfdHJfZGVzY3IgPSAmcG9ydC0+b3V0X2Rlc2NyWzBdOworCXBvcnQtPnByZXZfdHJfZGVzY3IgPSAmcG9ydC0+b3V0X2Rlc2NyW05CUl9PVVRfREVTQ1ItMV07CisJcG9ydC0+Y2F0Y2hfdHJfZGVzY3IgPSAmcG9ydC0+b3V0X2Rlc2NyWzBdOworI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHN5bmNfZGF0YV9hdmFpbChzdHJ1Y3Qgc3luY19wb3J0ICpwb3J0KQpAQCAtMzExLDcgKzM5OSw3IEBACiAJICogIF5ycCAgXndwICAgIF53cCBecnAKIAkgKi8KIAotICAJaWYgKGVuZCA+PSBzdGFydCkKKwlpZiAoZW5kID49IHN0YXJ0KQogCQlhdmFpbCA9IGVuZCAtIHN0YXJ0OwogCWVsc2UKIAkJYXZhaWwgPSBwb3J0LT5pbl9idWZmZXJfc2l6ZSAtIChzdGFydCAtIGVuZCk7CkBAIC0zMzEsNyArNDE5LDcgQEAKIAkgKiAgXnJwICBed3AgICAgXndwIF5ycAogCSAqLwogCi0gIAlpZiAoZW5kID49IHN0YXJ0KQorCWlmIChlbmQgPj0gc3RhcnQpCiAJCWF2YWlsID0gZW5kIC0gc3RhcnQ7CiAJZWxzZQogCQlhdmFpbCA9IHBvcnQtPmZsaXAgKyBwb3J0LT5pbl9idWZmZXJfc2l6ZSAtIHN0YXJ0OwpAQCAtMzQxLDY2ICs0MjksNjkgQEAKIHN0YXRpYyBpbnQgc3luY19zZXJpYWxfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlpbnQgZGV2ID0gaW1pbm9yKGlub2RlKTsKLQlzeW5jX3BvcnQqIHBvcnQ7CisJc3luY19wb3J0ICpwb3J0OwogCXJlZ19kbWFfcndfY2ZnIGNmZyA9IHsuZW4gPSByZWdrX2RtYV95ZXN9OwogCXJlZ19kbWFfcndfaW50cl9tYXNrIGludHJfbWFzayA9IHsuZGF0YSA9IHJlZ2tfZG1hX3llc307CiAKLQlERUJVRyhwcmludGsoIk9wZW4gc3luYyBzZXJpYWwgcG9ydCAlZFxuIiwgZGV2KSk7CisJREVCVUcocHJpbnRrKEtFUk5fREVCVUcgIk9wZW4gc3luYyBzZXJpYWwgcG9ydCAlZFxuIiwgZGV2KSk7CiAKLQlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gTlVNQkVSX09GX1BPUlRTIHx8ICFwb3J0c1tkZXZdLmVuYWJsZWQpCisJaWYgKGRldiA8IDAgfHwgZGV2ID49IE5CUl9QT1JUUyB8fCAhcG9ydHNbZGV2XS5lbmFibGVkKQogCXsKLQkJREVCVUcocHJpbnRrKCJJbnZhbGlkIG1pbm9yICVkXG4iLCBkZXYpKTsKKwkJREVCVUcocHJpbnRrKEtFUk5fREVCVUcgIkludmFsaWQgbWlub3IgJWRcbiIsIGRldikpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJcG9ydCA9ICZwb3J0c1tkZXZdOwogCS8qIEFsbG93IG9wZW4gdGhpcyBkZXZpY2UgdHdpY2UgKGFzc3VtaW5nIG9uZSByZWFkZXIgYW5kIG9uZSB3cml0ZXIpICovCiAJaWYgKHBvcnQtPmJ1c3kgPT0gMikKIAl7Ci0JCURFQlVHKHByaW50aygiRGV2aWNlIGlzIGJ1c3kuLiBcbiIpKTsKKwkJREVCVUcocHJpbnRrKEtFUk5fREVCVUcgIkRldmljZSBpcyBidXN5Li4gXG4iKSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQorCisKIAlpZiAocG9ydC0+aW5pdF9pcnFzKSB7CiAJCWlmIChwb3J0LT51c2VfZG1hKSB7Ci0JCQlpZiAocG9ydCA9PSAmcG9ydHNbMF0peworCQkJaWYgKHBvcnQgPT0gJnBvcnRzWzBdKSB7CiAjaWZkZWYgU1lOQ19TRVJfRE1BCi0JCQkJaWYocmVxdWVzdF9pcnEoRE1BNF9JTlRSX1ZFQ1QsCi0JCQkJCSAgICAgICB0cl9pbnRlcnJ1cHQsCi0JCQkJCSAgICAgICAwLAotCQkJCQkgICAgICAgInN5bmNocm9ub3VzIHNlcmlhbCAwIGRtYSB0ciIsCi0JCQkJCSAgICAgICAmcG9ydHNbMF0pKSB7CisJCQkJaWYgKHJlcXVlc3RfaXJxKERNQV9PVVRfSU5UUl9WRUNULAorCQkJCQkJdHJfaW50ZXJydXB0LAorCQkJCQkJMCwKKwkJCQkJCSJzeW5jaHJvbm91cyBzZXJpYWwgMCBkbWEgdHIiLAorCQkJCQkJJnBvcnRzWzBdKSkgewogCQkJCQlwcmludGsoS0VSTl9DUklUICJDYW4ndCBhbGxvY2F0ZSBzeW5jIHNlcmlhbCBwb3J0IDAgSVJRIik7CiAJCQkJCXJldHVybiAtRUJVU1k7Ci0JCQkJfSBlbHNlIGlmKHJlcXVlc3RfaXJxKERNQTVfSU5UUl9WRUNULAotCQkJCQkJICAgICAgcnhfaW50ZXJydXB0LAotCQkJCQkJICAgICAgMCwKLQkJCQkJCSAgICAgICJzeW5jaHJvbm91cyBzZXJpYWwgMSBkbWEgcngiLAotCQkJCQkJICAgICAgJnBvcnRzWzBdKSkgewotCQkJCQlmcmVlX2lycShETUE0X0lOVFJfVkVDVCwgJnBvcnRbMF0pOworCQkJCX0gZWxzZSBpZiAocmVxdWVzdF9pcnEoRE1BX0lOX0lOVFJfVkVDVCwKKwkJCQkJCXJ4X2ludGVycnVwdCwKKwkJCQkJCTAsCisJCQkJCQkic3luY2hyb25vdXMgc2VyaWFsIDEgZG1hIHJ4IiwKKwkJCQkJCSZwb3J0c1swXSkpIHsKKwkJCQkJZnJlZV9pcnEoRE1BX09VVF9JTlRSX1ZFQ1QsICZwb3J0WzBdKTsKIAkJCQkJcHJpbnRrKEtFUk5fQ1JJVCAiQ2FuJ3QgYWxsb2NhdGUgc3luYyBzZXJpYWwgcG9ydCAwIElSUSIpOwogCQkJCQlyZXR1cm4gLUVCVVNZOwotCQkJCX0gZWxzZSBpZiAoY3Jpc3YzMl9yZXF1ZXN0X2RtYShTWU5DX1NFUjBfVFhfRE1BX05CUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzeW5jaHJvbm91cyBzZXJpYWwgMCBkbWEgdHIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE1BX1ZFUkJPU0VfT05fRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG1hX3NzZXIwKSkgewotCQkJCQlmcmVlX2lycShETUE0X0lOVFJfVkVDVCwgJnBvcnRbMF0pOwotCQkJCQlmcmVlX2lycShETUE1X0lOVFJfVkVDVCwgJnBvcnRbMF0pOworCQkJCX0gZWxzZSBpZiAoY3Jpc3YzMl9yZXF1ZXN0X2RtYShPVVRfRE1BX05CUiwKKwkJCQkJCSJzeW5jaHJvbm91cyBzZXJpYWwgMCBkbWEgdHIiLAorCQkJCQkJRE1BX1ZFUkJPU0VfT05fRVJST1IsCisJCQkJCQkwLAorCQkJCQkJUkVRX0RNQV9TWU5DU0VSKSkgeworCQkJCQlmcmVlX2lycShETUFfT1VUX0lOVFJfVkVDVCwgJnBvcnRbMF0pOworCQkJCQlmcmVlX2lycShETUFfSU5fSU5UUl9WRUNULCAmcG9ydFswXSk7CiAJCQkJCXByaW50ayhLRVJOX0NSSVQgIkNhbid0IGFsbG9jYXRlIHN5bmMgc2VyaWFsIHBvcnQgMCBUWCBETUEgY2hhbm5lbCIpOwogCQkJCQlyZXR1cm4gLUVCVVNZOwotCQkJCX0gZWxzZSBpZiAoY3Jpc3YzMl9yZXF1ZXN0X2RtYShTWU5DX1NFUjBfUlhfRE1BX05CUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzeW5jaHJvbm91cyBzZXJpYWwgMCBkbWEgcmVjIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERNQV9WRVJCT1NFX09OX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtYV9zc2VyMCkpIHsKLQkJCQkJY3Jpc3YzMl9mcmVlX2RtYShTWU5DX1NFUjBfVFhfRE1BX05CUik7Ci0JCQkJCWZyZWVfaXJxKERNQTRfSU5UUl9WRUNULCAmcG9ydFswXSk7Ci0JCQkJCWZyZWVfaXJxKERNQTVfSU5UUl9WRUNULCAmcG9ydFswXSk7CisJCQkJfSBlbHNlIGlmIChjcmlzdjMyX3JlcXVlc3RfZG1hKElOX0RNQV9OQlIsCisJCQkJCQkic3luY2hyb25vdXMgc2VyaWFsIDAgZG1hIHJlYyIsCisJCQkJCQlETUFfVkVSQk9TRV9PTl9FUlJPUiwKKwkJCQkJCTAsCisJCQkJCQlSRVFfRE1BX1NZTkNTRVIpKSB7CisJCQkJCWNyaXN2MzJfZnJlZV9kbWEoT1VUX0RNQV9OQlIpOworCQkJCQlmcmVlX2lycShETUFfT1VUX0lOVFJfVkVDVCwgJnBvcnRbMF0pOworCQkJCQlmcmVlX2lycShETUFfSU5fSU5UUl9WRUNULCAmcG9ydFswXSk7CiAJCQkJCXByaW50ayhLRVJOX0NSSVQgIkNhbid0IGFsbG9jYXRlIHN5bmMgc2VyaWFsIHBvcnQgMSBSWCBETUEgY2hhbm5lbCIpOwogCQkJCQlyZXR1cm4gLUVCVVNZOwogCQkJCX0KICNlbmRpZgogCQkJfQotCQkJZWxzZSBpZiAocG9ydCA9PSAmcG9ydHNbMV0peworI2lmZGVmIENPTkZJR19FVFJBWEZTCisJCQllbHNlIGlmIChwb3J0ID09ICZwb3J0c1sxXSkgewogI2lmZGVmIFNZTkNfU0VSX0RNQQogCQkJCWlmIChyZXF1ZXN0X2lycShETUE2X0lOVFJfVkVDVCwKIAkJCQkJCXRyX2ludGVycnVwdCwKQEAgLTQxNywyMCArNTA4LDIyIEBACiAJCQkJCWZyZWVfaXJxKERNQTZfSU5UUl9WRUNULCAmcG9ydHNbMV0pOwogCQkJCQlwcmludGsoS0VSTl9DUklUICJDYW4ndCBhbGxvY2F0ZSBzeW5jIHNlcmlhbCBwb3J0IDMgSVJRIik7CiAJCQkJCXJldHVybiAtRUJVU1k7Ci0JCQkJfSBlbHNlIGlmIChjcmlzdjMyX3JlcXVlc3RfZG1hKFNZTkNfU0VSMV9UWF9ETUFfTkJSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN5bmNocm9ub3VzIHNlcmlhbCAxIGRtYSB0ciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETUFfVkVSQk9TRV9PTl9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbWFfc3NlcjEpKSB7Ci0JCQkJCWZyZWVfaXJxKDIxLCAmcG9ydHNbMV0pOwotCQkJCQlmcmVlX2lycSgyMCwgJnBvcnRzWzFdKTsKKwkJCQl9IGVsc2UgaWYgKGNyaXN2MzJfcmVxdWVzdF9kbWEoCisJCQkJCQlTWU5DX1NFUjFfVFhfRE1BX05CUiwKKwkJCQkJCSJzeW5jaHJvbm91cyBzZXJpYWwgMSBkbWEgdHIiLAorCQkJCQkJRE1BX1ZFUkJPU0VfT05fRVJST1IsCisJCQkJCQkwLAorCQkJCQkJZG1hX3NzZXIxKSkgeworCQkJCQlmcmVlX2lycShETUE2X0lOVFJfVkVDVCwgJnBvcnRzWzFdKTsKKwkJCQkJZnJlZV9pcnEoRE1BN19JTlRSX1ZFQ1QsICZwb3J0c1sxXSk7CiAJCQkJCXByaW50ayhLRVJOX0NSSVQgIkNhbid0IGFsbG9jYXRlIHN5bmMgc2VyaWFsIHBvcnQgMyBUWCBETUEgY2hhbm5lbCIpOwogCQkJCQlyZXR1cm4gLUVCVVNZOwotCQkJCX0gZWxzZSBpZiAoY3Jpc3YzMl9yZXF1ZXN0X2RtYShTWU5DX1NFUjFfUlhfRE1BX05CUiwKLQkJCQkJCQkgICAgInN5bmNocm9ub3VzIHNlcmlhbCAzIGRtYSByZWMiLAotCQkJCQkJCSAgICBETUFfVkVSQk9TRV9PTl9FUlJPUiwKLQkJCQkJCQkgICAgMCwKLQkJCQkJCQkgICAgZG1hX3NzZXIxKSkgeworCQkJCX0gZWxzZSBpZiAoY3Jpc3YzMl9yZXF1ZXN0X2RtYSgKKwkJCQkJCVNZTkNfU0VSMV9SWF9ETUFfTkJSLAorCQkJCQkJInN5bmNocm9ub3VzIHNlcmlhbCAzIGRtYSByZWMiLAorCQkJCQkJRE1BX1ZFUkJPU0VfT05fRVJST1IsCisJCQkJCQkwLAorCQkJCQkJZG1hX3NzZXIxKSkgewogCQkJCQljcmlzdjMyX2ZyZWVfZG1hKFNZTkNfU0VSMV9UWF9ETUFfTkJSKTsKIAkJCQkJZnJlZV9pcnEoRE1BNl9JTlRSX1ZFQ1QsICZwb3J0c1sxXSk7CiAJCQkJCWZyZWVfaXJxKERNQTdfSU5UUl9WRUNULCAmcG9ydHNbMV0pOwpAQCAtNDM5LDE0ICs1MzIsMTQgQEAKIAkJCQl9CiAjZW5kaWYKIAkJCX0KLQorI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgRE1BcyAqLwogCQkJUkVHX1dSKGRtYSwgcG9ydC0+cmVnaV9kbWFpbiwgcndfY2ZnLCBjZmcpOwogCQkJUkVHX1dSKGRtYSwgcG9ydC0+cmVnaV9kbWFvdXQsIHJ3X2NmZywgY2ZnKTsKIAkJCS8qIEVuYWJsZSBETUEgSVJRcyAqLwogCQkJUkVHX1dSKGRtYSwgcG9ydC0+cmVnaV9kbWFpbiwgcndfaW50cl9tYXNrLCBpbnRyX21hc2spOwogCQkJUkVHX1dSKGRtYSwgcG9ydC0+cmVnaV9kbWFvdXQsIHJ3X2ludHJfbWFzaywgaW50cl9tYXNrKTsKLQkJCS8qIFNldCB1cCB3b3Jkc2l6ZSA9IDIgZm9yIERNQXMuICovCisJCQkvKiBTZXQgdXAgd29yZHNpemUgPSAxIGZvciBETUFzLiAqLwogCQkJRE1BX1dSX0NNRCAocG9ydC0+cmVnaV9kbWFpbiwgcmVna19kbWFfc2V0X3dfc2l6ZTEpOwogCQkJRE1BX1dSX0NNRCAocG9ydC0+cmVnaV9kbWFvdXQsIHJlZ2tfZG1hX3NldF93X3NpemUxKTsKIApAQCAtNDU1LDcgKzU0OCw3IEBACiAJCX0gZWxzZSB7IC8qICFwb3J0LT51c2VfZG1hICovCiAjaWZkZWYgU1lOQ19TRVJfTUFOVUFMCiAJCQlpZiAocG9ydCA9PSAmcG9ydHNbMF0pIHsKLQkJCQlpZiAocmVxdWVzdF9pcnEoU1NFUjBfSU5UUl9WRUNULAorCQkJCWlmIChyZXF1ZXN0X2lycShTWU5DU0VSX0lOVFJfVkVDVCwKIAkJCQkJCW1hbnVhbF9pbnRlcnJ1cHQsCiAJCQkJCQkwLAogCQkJCQkJInN5bmNocm9ub3VzIHNlcmlhbCBtYW51YWwgaXJxIiwKQEAgLTQ2Myw3ICs1NTYsOSBAQAogCQkJCQlwcmludGsoIkNhbid0IGFsbG9jYXRlIHN5bmMgc2VyaWFsIG1hbnVhbCBpcnEiKTsKIAkJCQkJcmV0dXJuIC1FQlVTWTsKIAkJCQl9Ci0JCQl9IGVsc2UgaWYgKHBvcnQgPT0gJnBvcnRzWzFdKSB7CisJCQl9CisjaWZkZWYgQ09ORklHX0VUUkFYRlMKKwkJCWVsc2UgaWYgKHBvcnQgPT0gJnBvcnRzWzFdKSB7CiAJCQkJaWYgKHJlcXVlc3RfaXJxKFNTRVIxX0lOVFJfVkVDVCwKIAkJCQkJCW1hbnVhbF9pbnRlcnJ1cHQsCiAJCQkJCQkwLApAQCAtNDczLDExICs1NjgsMTMgQEAKIAkJCQkJcmV0dXJuIC1FQlVTWTsKIAkJCQl9CiAJCQl9CisjZW5kaWYKIAkJCXBvcnQtPmluaXRfaXJxcyA9IDA7CiAjZWxzZQogCQkJcGFuaWMoInN5bmNfc2VyaWFsOiBNYW51YWwgbW9kZSBub3Qgc3VwcG9ydGVkLlxuIik7CiAjZW5kaWYgLyogU1lOQ19TRVJfTUFOVUFMICovCiAJCX0KKwogCX0gLyogcG9ydC0+aW5pdF9pcnFzICovCiAKIAlwb3J0LT5idXN5Kys7CkBAIC00ODcsOSArNTg0LDkgQEAKIHN0YXRpYyBpbnQgc3luY19zZXJpYWxfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlpbnQgZGV2ID0gaW1pbm9yKGlub2RlKTsKLQlzeW5jX3BvcnQqIHBvcnQ7CisJc3luY19wb3J0ICpwb3J0OwogCi0JaWYgKGRldiA8IDAgfHwgZGV2ID49IE5VTUJFUl9PRl9QT1JUUyB8fCAhcG9ydHNbZGV2XS5lbmFibGVkKQorCWlmIChkZXYgPCAwIHx8IGRldiA+PSBOQlJfUE9SVFMgfHwgIXBvcnRzW2Rldl0uZW5hYmxlZCkKIAl7CiAJCURFQlVHKHByaW50aygiSW52YWxpZCBtaW5vciAlZFxuIiwgZGV2KSk7CiAJCXJldHVybiAtRU5PREVWOwpAQCAtNTA2LDE3ICs2MDMsMzcgQEAKIHsKIAlpbnQgZGV2ID0gaW1pbm9yKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCXVuc2lnbmVkIGludCBtYXNrID0gMDsKLQlzeW5jX3BvcnQqIHBvcnQ7CisJc3luY19wb3J0ICpwb3J0OwogCURFQlVHUE9MTCggc3RhdGljIHVuc2lnbmVkIGludCBwcmV2X21hc2sgPSAwOyApOwogCiAJcG9ydCA9ICZwb3J0c1tkZXZdOworCisJaWYgKCFwb3J0LT5zdGFydGVkKSB7CisJCXJlZ19zc2VyX3J3X2NmZyBjZmcgPSBSRUdfUkQoc3NlciwgcG9ydC0+cmVnaV9zc2VyLCByd19jZmcpOworCQlyZWdfc3Nlcl9yd19yZWNfY2ZnIHJlY19jZmcgPQorCQkJUkVHX1JEKHNzZXIsIHBvcnQtPnJlZ2lfc3NlciwgcndfcmVjX2NmZyk7CisJCWNmZy5lbiA9IHJlZ2tfc3Nlcl95ZXM7CisJCXJlY19jZmcucmVjX2VuID0gcG9ydC0+aW5wdXQ7CisJCVJFR19XUihzc2VyLCBwb3J0LT5yZWdpX3NzZXIsIHJ3X2NmZywgY2ZnKTsKKwkJUkVHX1dSKHNzZXIsIHBvcnQtPnJlZ2lfc3NlciwgcndfcmVjX2NmZywgcmVjX2NmZyk7CisJCXBvcnQtPnN0YXJ0ZWQgPSAxOworCX0KKwogCXBvbGxfd2FpdChmaWxlLCAmcG9ydC0+b3V0X3dhaXRfcSwgd2FpdCk7CiAJcG9sbF93YWl0KGZpbGUsICZwb3J0LT5pbl93YWl0X3EsIHdhaXQpOwotCS8qIFNvbWUgcm9vbSB0byB3cml0ZSAqLwotCWlmIChwb3J0LT5vdXRfY291bnQgPCBPVVRfQlVGRkVSX1NJWkUpCisKKwkvKiBObyBhY3RpdmUgdHJhbnNmZXIsIGRlc2NyaXB0b3JzIGFyZSBhdmFpbGFibGUgKi8KKwlpZiAocG9ydC0+b3V0cHV0ICYmICFwb3J0LT50cl9ydW5uaW5nKQorCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCisJLyogRGVzY3JpcHRvciBhbmQgYnVmZmVyIHNwYWNlIGF2YWlsYWJsZS4gKi8KKwlpZiAocG9ydC0+b3V0cHV0ICYmCisJICAgIHBvcnQtPmFjdGl2ZV90cl9kZXNjciAhPSBwb3J0LT5jYXRjaF90cl9kZXNjciAmJgorCSAgICBwb3J0LT5vdXRfYnVmX2NvdW50IDwgT1VUX0JVRkZFUl9TSVpFKQogCQltYXNrIHw9ICBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwogCS8qIEF0IGxlYXN0IGFuIGluYnVmY2h1bmsgb2YgZGF0YSAqLwotCWlmIChzeW5jX2RhdGFfYXZhaWwocG9ydCkgPj0gcG9ydC0+aW5idWZjaHVuaykKKwlpZiAocG9ydC0+aW5wdXQgJiYgc3luY19kYXRhX2F2YWlsKHBvcnQpID49IHBvcnQtPmluYnVmY2h1bmspCiAJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKIAogCURFQlVHUE9MTChpZiAobWFzayAhPSBwcmV2X21hc2spCkBAIC01MzEsMTUgKzY0OCwxNiBAQAogCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCWludCByZXR1cm5fdmFsID0gMDsKKwlpbnQgZG1hX3dfc2l6ZSA9IHJlZ2tfZG1hX3NldF93X3NpemUxOwogCWludCBkZXYgPSBpbWlub3IoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7Ci0Jc3luY19wb3J0KiBwb3J0OworCXN5bmNfcG9ydCAqcG9ydDsKIAlyZWdfc3Nlcl9yd190cl9jZmcgdHJfY2ZnOwogCXJlZ19zc2VyX3J3X3JlY19jZmcgcmVjX2NmZzsKIAlyZWdfc3Nlcl9yd19mcm1fY2ZnIGZybV9jZmc7CiAJcmVnX3NzZXJfcndfY2ZnIGdlbl9jZmc7CiAJcmVnX3NzZXJfcndfaW50cl9tYXNrIGludHJfbWFzazsKIAotCWlmIChkZXYgPCAwIHx8IGRldiA+PSBOVU1CRVJfT0ZfUE9SVFMgfHwgIXBvcnRzW2Rldl0uZW5hYmxlZCkKKwlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gTkJSX1BPUlRTIHx8ICFwb3J0c1tkZXZdLmVuYWJsZWQpCiAJewogCQlERUJVRyhwcmludGsoIkludmFsaWQgbWlub3IgJWRcbiIsIGRldikpOwogCQlyZXR1cm4gLTE7CkBAIC01NTgsNjEgKzY3Niw4MSBAQAogCWNhc2UgU1NQX1NQRUVEOgogCQlpZiAoR0VUX1NQRUVEKGFyZykgPT0gQ09ERUMpCiAJCXsKKwkJCXVuc2lnbmVkIGludCBmcmVxOworCiAJCQlnZW5fY2ZnLmJhc2VfZnJlcSA9IHJlZ2tfc3Nlcl9mMzI7Ci0JCQkvKiBGUkVRID0gMCA9PiA0IE1IeiA9PiBjbGtfZGl2ID0gNyovCi0JCQlnZW5fY2ZnLmNsa19kaXYgPSA2ICsgKDEgPDwgR0VUX0ZSRVEoYXJnKSk7Ci0JCX0KLQkJZWxzZQotCQl7CisKKwkJCS8qIENsb2NrIGRpdmlkZXIgd2lsbCBpbnRlcm5hbGx5IGJlCisJCQkgKiBnZW5fY2ZnLmNsa19kaXYgKyAxLgorCQkJICovCisKKwkJCWZyZXEgPSBHRVRfRlJFUShhcmcpOworCQkJc3dpdGNoIChmcmVxKSB7CisJCQljYXNlIEZSRVFfMzJrSHo6CisJCQljYXNlIEZSRVFfNjRrSHo6CisJCQljYXNlIEZSRVFfMTI4a0h6OgorCQkJY2FzZSBGUkVRXzI1NmtIejoKKwkJCQlnZW5fY2ZnLmNsa19kaXYgPSAxMjUgKgorCQkJCQkoMSA8PCAoZnJlcSAtIEZSRVFfMjU2a0h6KSkgLSAxOworCQkJYnJlYWs7CisJCQljYXNlIEZSRVFfNTEya0h6OgorCQkJCWdlbl9jZmcuY2xrX2RpdiA9IDYyOworCQkJYnJlYWs7CisJCQljYXNlIEZSRVFfMU1IejoKKwkJCWNhc2UgRlJFUV8yTUh6OgorCQkJY2FzZSBGUkVRXzRNSHo6CisJCQkJZ2VuX2NmZy5jbGtfZGl2ID0gOCAqICgxIDw8IGZyZXEpIC0gMTsKKwkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgewogCQkJZ2VuX2NmZy5iYXNlX2ZyZXEgPSByZWdrX3NzZXJfZjI5XzQ5MzsKLQkJCXN3aXRjaCAoR0VUX1NQRUVEKGFyZykpCi0JCQl7Ci0JCQkJY2FzZSBTU1AxNTA6Ci0JCQkJCWdlbl9jZmcuY2xrX2RpdiA9IDI5NDkzMDAwIC8gKDE1MCAqIDgpIC0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTU1AzMDA6Ci0JCQkJCWdlbl9jZmcuY2xrX2RpdiA9IDI5NDkzMDAwIC8gKDMwMCAqIDgpIC0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTU1A2MDA6Ci0JCQkJCWdlbl9jZmcuY2xrX2RpdiA9IDI5NDkzMDAwIC8gKDYwMCAqIDgpIC0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTU1AxMjAwOgotCQkJCQlnZW5fY2ZnLmNsa19kaXYgPSAyOTQ5MzAwMCAvICgxMjAwICogOCkgLSAxOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNTUDI0MDA6Ci0JCQkJCWdlbl9jZmcuY2xrX2RpdiA9IDI5NDkzMDAwIC8gKDI0MDAgKiA4KSAtIDE7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1NQNDgwMDoKLQkJCQkJZ2VuX2NmZy5jbGtfZGl2ID0gMjk0OTMwMDAgLyAoNDgwMCAqIDgpIC0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTU1A5NjAwOgotCQkJCQlnZW5fY2ZnLmNsa19kaXYgPSAyOTQ5MzAwMCAvICg5NjAwICogOCkgLSAxOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNTUDE5MjAwOgotCQkJCQlnZW5fY2ZnLmNsa19kaXYgPSAyOTQ5MzAwMCAvICgxOTIwMCAqIDgpIC0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTU1AyODgwMDoKLQkJCQkJZ2VuX2NmZy5jbGtfZGl2ID0gMjk0OTMwMDAgLyAoMjg4MDAgKiA4KSAtIDE7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1NQNTc2MDA6Ci0JCQkJCWdlbl9jZmcuY2xrX2RpdiA9IDI5NDkzMDAwIC8gKDU3NjAwICogOCkgLSAxOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNTUDExNTIwMDoKLQkJCQkJZ2VuX2NmZy5jbGtfZGl2ID0gMjk0OTMwMDAgLyAoMTE1MjAwICogOCkgLSAxOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNTUDIzMDQwMDoKLQkJCQkJZ2VuX2NmZy5jbGtfZGl2ID0gMjk0OTMwMDAgLyAoMjMwNDAwICogOCkgLSAxOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNTUDQ2MDgwMDoKLQkJCQkJZ2VuX2NmZy5jbGtfZGl2ID0gMjk0OTMwMDAgLyAoNDYwODAwICogOCkgLSAxOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNTUDkyMTYwMDoKLQkJCQkJZ2VuX2NmZy5jbGtfZGl2ID0gMjk0OTMwMDAgLyAoOTIxNjAwICogOCkgLSAxOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFNTUDMxMjUwMDA6Ci0JCQkJCWdlbl9jZmcuYmFzZV9mcmVxID0gcmVna19zc2VyX2YxMDA7Ci0JCQkJCWdlbl9jZmcuY2xrX2RpdiA9IDEwMDAwMDAwMCAvICgzMTI1MDAwICogOCkgLSAxOwotCQkJCQlicmVhazsKKwkJCXN3aXRjaCAoR0VUX1NQRUVEKGFyZykpIHsKKwkJCWNhc2UgU1NQMTUwOgorCQkJCWdlbl9jZmcuY2xrX2RpdiA9IDI5NDkzMDAwIC8gKDE1MCAqIDgpIC0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU1NQMzAwOgorCQkJCWdlbl9jZmcuY2xrX2RpdiA9IDI5NDkzMDAwIC8gKDMwMCAqIDgpIC0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU1NQNjAwOgorCQkJCWdlbl9jZmcuY2xrX2RpdiA9IDI5NDkzMDAwIC8gKDYwMCAqIDgpIC0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU1NQMTIwMDoKKwkJCQlnZW5fY2ZnLmNsa19kaXYgPSAyOTQ5MzAwMCAvICgxMjAwICogOCkgLSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBTU1AyNDAwOgorCQkJCWdlbl9jZmcuY2xrX2RpdiA9IDI5NDkzMDAwIC8gKDI0MDAgKiA4KSAtIDE7CisJCQkJYnJlYWs7CisJCQljYXNlIFNTUDQ4MDA6CisJCQkJZ2VuX2NmZy5jbGtfZGl2ID0gMjk0OTMwMDAgLyAoNDgwMCAqIDgpIC0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU1NQOTYwMDoKKwkJCQlnZW5fY2ZnLmNsa19kaXYgPSAyOTQ5MzAwMCAvICg5NjAwICogOCkgLSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBTU1AxOTIwMDoKKwkJCQlnZW5fY2ZnLmNsa19kaXYgPSAyOTQ5MzAwMCAvICgxOTIwMCAqIDgpIC0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU1NQMjg4MDA6CisJCQkJZ2VuX2NmZy5jbGtfZGl2ID0gMjk0OTMwMDAgLyAoMjg4MDAgKiA4KSAtIDE7CisJCQkJYnJlYWs7CisJCQljYXNlIFNTUDU3NjAwOgorCQkJCWdlbl9jZmcuY2xrX2RpdiA9IDI5NDkzMDAwIC8gKDU3NjAwICogOCkgLSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBTU1AxMTUyMDA6CisJCQkJZ2VuX2NmZy5jbGtfZGl2ID0gMjk0OTMwMDAgLyAoMTE1MjAwICogOCkgLSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBTU1AyMzA0MDA6CisJCQkJZ2VuX2NmZy5jbGtfZGl2ID0gMjk0OTMwMDAgLyAoMjMwNDAwICogOCkgLSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBTU1A0NjA4MDA6CisJCQkJZ2VuX2NmZy5jbGtfZGl2ID0gMjk0OTMwMDAgLyAoNDYwODAwICogOCkgLSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBTU1A5MjE2MDA6CisJCQkJZ2VuX2NmZy5jbGtfZGl2ID0gMjk0OTMwMDAgLyAoOTIxNjAwICogOCkgLSAxOworCQkJCWJyZWFrOworCQkJY2FzZSBTU1AzMTI1MDAwOgorCQkJCWdlbl9jZmcuYmFzZV9mcmVxID0gcmVna19zc2VyX2YxMDA7CisJCQkJZ2VuX2NmZy5jbGtfZGl2ID0gMTAwMDAwMDAwIC8gKDMxMjUwMDAgKiA4KSAtIDE7CisJCQkJYnJlYWs7CiAKIAkJCX0KIAkJfQpAQCAtNjI1LDQ2ICs3NjMsNjAgQEAKIAkJCWNhc2UgTUFTVEVSX09VVFBVVDoKIAkJCQlwb3J0LT5vdXRwdXQgPSAxOwogCQkJCXBvcnQtPmlucHV0ID0gMDsKKwkJCQlmcm1fY2ZnLm91dF9vbiA9IHJlZ2tfc3Nlcl90cjsKKwkJCQlmcm1fY2ZnLmZyYW1lX3Bpbl9kaXIgPSByZWdrX3NzZXJfb3V0OwogCQkJCWdlbl9jZmcuY2xrX2RpciA9IHJlZ2tfc3Nlcl9vdXQ7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFNMQVZFX09VVFBVVDoKIAkJCQlwb3J0LT5vdXRwdXQgPSAxOwogCQkJCXBvcnQtPmlucHV0ID0gMDsKKwkJCQlmcm1fY2ZnLmZyYW1lX3Bpbl9kaXIgPSByZWdrX3NzZXJfaW47CiAJCQkJZ2VuX2NmZy5jbGtfZGlyID0gcmVna19zc2VyX2luOwogCQkJCWJyZWFrOwogCQkJY2FzZSBNQVNURVJfSU5QVVQ6CiAJCQkJcG9ydC0+b3V0cHV0ID0gMDsKIAkJCQlwb3J0LT5pbnB1dCA9IDE7CisJCQkJZnJtX2NmZy5mcmFtZV9waW5fZGlyID0gcmVna19zc2VyX291dDsKKwkJCQlmcm1fY2ZnLm91dF9vbiA9IHJlZ2tfc3Nlcl9pbnRlcm5fdGI7CiAJCQkJZ2VuX2NmZy5jbGtfZGlyID0gcmVna19zc2VyX291dDsKIAkJCQlicmVhazsKIAkJCWNhc2UgU0xBVkVfSU5QVVQ6CiAJCQkJcG9ydC0+b3V0cHV0ID0gMDsKIAkJCQlwb3J0LT5pbnB1dCA9IDE7CisJCQkJZnJtX2NmZy5mcmFtZV9waW5fZGlyID0gcmVna19zc2VyX2luOwogCQkJCWdlbl9jZmcuY2xrX2RpciA9IHJlZ2tfc3Nlcl9pbjsKIAkJCQlicmVhazsKIAkJCWNhc2UgTUFTVEVSX0JJRElSOgogCQkJCXBvcnQtPm91dHB1dCA9IDE7CiAJCQkJcG9ydC0+aW5wdXQgPSAxOworCQkJCWZybV9jZmcuZnJhbWVfcGluX2RpciA9IHJlZ2tfc3Nlcl9vdXQ7CisJCQkJZnJtX2NmZy5vdXRfb24gPSByZWdrX3NzZXJfaW50ZXJuX3RiOwogCQkJCWdlbl9jZmcuY2xrX2RpciA9IHJlZ2tfc3Nlcl9vdXQ7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFNMQVZFX0JJRElSOgogCQkJCXBvcnQtPm91dHB1dCA9IDE7CiAJCQkJcG9ydC0+aW5wdXQgPSAxOworCQkJCWZybV9jZmcuZnJhbWVfcGluX2RpciA9IHJlZ2tfc3Nlcl9pbjsKIAkJCQlnZW5fY2ZnLmNsa19kaXIgPSByZWdrX3NzZXJfaW47CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCXNwaW5fdW5sb2NrX2lycSgmcG9ydC0+bG9jayk7CiAJCQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAkJfQogCQlpZiAoIXBvcnQtPnVzZV9kbWEgfHwgKGFyZyA9PSBNQVNURVJfT1VUUFVUIHx8IGFyZyA9PSBTTEFWRV9PVVRQVVQpKQogCQkJaW50cl9tYXNrLnJkYXYgPSByZWdrX3NzZXJfeWVzOwogCQlicmVhazsKIAljYXNlIFNTUF9GUkFNRV9TWU5DOgotCQlpZiAoYXJnICYgTk9STUFMX1NZTkMpCisJCWlmIChhcmcgJiBOT1JNQUxfU1lOQykgeworCQkJZnJtX2NmZy5yZWNfZGVsYXkgPSAxOwogCQkJZnJtX2NmZy50cl9kZWxheSA9IDE7CisJCX0KIAkJZWxzZSBpZiAoYXJnICYgRUFSTFlfU1lOQykKLQkJCWZybV9jZmcudHJfZGVsYXkgPSAwOworCQkJZnJtX2NmZy5yZWNfZGVsYXkgPSBmcm1fY2ZnLnRyX2RlbGF5ID0gMDsKKwkJZWxzZSBpZiAoYXJnICYgU0VDT05EX1dPUkRfU1lOQykgeworCQkJZnJtX2NmZy5yZWNfZGVsYXkgPSA3OworCQkJZnJtX2NmZy50cl9kZWxheSA9IDE7CisJCX0KIAogCQl0cl9jZmcuYnVsa193c3BhY2UgPSBmcm1fY2ZnLnRyX2RlbGF5OwogCQlmcm1fY2ZnLmVhcmx5X3dlbmQgPSByZWdrX3NzZXJfeWVzOwpAQCAtNjgwLDkgKzgzMiwxMSBAQAogCQllbHNlIGlmIChhcmcgJiBTWU5DX09GRikKIAkJCWZybV9jZmcuZnJhbWVfcGluX3VzZSA9IHJlZ2tfc3Nlcl9naW8wOwogCi0JCWlmIChhcmcgJiBXT1JEX1NJWkVfOCkKKwkJZG1hX3dfc2l6ZSA9IHJlZ2tfZG1hX3NldF93X3NpemUyOworCQlpZiAoYXJnICYgV09SRF9TSVpFXzgpIHsKIAkJCXJlY19jZmcuc2FtcGxlX3NpemUgPSB0cl9jZmcuc2FtcGxlX3NpemUgPSA3OwotCQllbHNlIGlmIChhcmcgJiBXT1JEX1NJWkVfMTIpCisJCQlkbWFfd19zaXplID0gcmVna19kbWFfc2V0X3dfc2l6ZTE7CisJCX0gZWxzZSBpZiAoYXJnICYgV09SRF9TSVpFXzEyKQogCQkJcmVjX2NmZy5zYW1wbGVfc2l6ZSA9IHRyX2NmZy5zYW1wbGVfc2l6ZSA9IDExOwogCQllbHNlIGlmIChhcmcgJiBXT1JEX1NJWkVfMTYpCiAJCQlyZWNfY2ZnLnNhbXBsZV9zaXplID0gdHJfY2ZnLnNhbXBsZV9zaXplID0gMTU7CkBAIC02OTYsMTAgKzg1MCwxMyBAQAogCQllbHNlIGlmIChhcmcgJiBCSVRfT1JERVJfTFNCKQogCQkJcmVjX2NmZy5zaF9kaXIgPSB0cl9jZmcuc2hfZGlyID0gcmVna19zc2VyX2xzYmZpcnN0OwogCi0JCWlmIChhcmcgJiBGTE9XX0NPTlRST0xfRU5BQkxFKQorCQlpZiAoYXJnICYgRkxPV19DT05UUk9MX0VOQUJMRSkgeworCQkJZnJtX2NmZy5zdGF0dXNfcGluX3VzZSA9IHJlZ2tfc3Nlcl9mcm07CiAJCQlyZWNfY2ZnLmZpZm9fdGhyID0gcmVna19zc2VyX3RocjE2OwotCQllbHNlIGlmIChhcmcgJiBGTE9XX0NPTlRST0xfRElTQUJMRSkKKwkJfSBlbHNlIGlmIChhcmcgJiBGTE9XX0NPTlRST0xfRElTQUJMRSkgeworCQkJZnJtX2NmZy5zdGF0dXNfcGluX3VzZSA9IHJlZ2tfc3Nlcl9naW8wOwogCQkJcmVjX2NmZy5maWZvX3RociA9IHJlZ2tfc3Nlcl9pbmY7CisJCX0KIAogCQlpZiAoYXJnICYgQ0xPQ0tfTk9UX0dBVEVEKQogCQkJZ2VuX2NmZy5nYXRlX2NsayA9IHJlZ2tfc3Nlcl9ubzsKQEAgLTcyNiw5ICs4ODMsOSBAQAogCQlicmVhazsKIAljYXNlIFNTUF9PUE9MQVJJVFk6CiAJCWlmIChhcmcgJiBDTE9DS19OT1JNQUwpCi0JCQlnZW5fY2ZnLm91dF9jbGtfcG9sID0gcmVna19zc2VyX25lZzsKLQkJZWxzZSBpZiAoYXJnICYgQ0xPQ0tfSU5WRVJUKQogCQkJZ2VuX2NmZy5vdXRfY2xrX3BvbCA9IHJlZ2tfc3Nlcl9wb3M7CisJCWVsc2UgaWYgKGFyZyAmIENMT0NLX0lOVkVSVCkKKwkJCWdlbl9jZmcub3V0X2Nsa19wb2wgPSByZWdrX3NzZXJfbmVnOwogCiAJCWlmIChhcmcgJiBGUkFNRV9OT1JNQUwpCiAJCQlmcm1fY2ZnLmxldmVsID0gcmVna19zc2VyX3Bvc19oaTsKQEAgLTc3MCwxMCArOTI3LDkgQEAKIAl9CiAKIAotCWlmIChwb3J0LT5zdGFydGVkKQotCXsKLQkJdHJfY2ZnLnRyX2VuID0gcG9ydC0+b3V0cHV0OworCWlmIChwb3J0LT5zdGFydGVkKSB7CiAJCXJlY19jZmcucmVjX2VuID0gcG9ydC0+aW5wdXQ7CisJCWdlbl9jZmcuZW4gPSAocG9ydC0+b3V0cHV0IHwgcG9ydC0+aW5wdXQpOwogCX0KIAogCVJFR19XUihzc2VyLCBwb3J0LT5yZWdpX3NzZXIsIHJ3X3RyX2NmZywgdHJfY2ZnKTsKQEAgLTc4MiwxMzggKzkzOCwxNDUgQEAKIAlSRUdfV1Ioc3NlciwgcG9ydC0+cmVnaV9zc2VyLCByd19pbnRyX21hc2ssIGludHJfbWFzayk7CiAJUkVHX1dSKHNzZXIsIHBvcnQtPnJlZ2lfc3NlciwgcndfY2ZnLCBnZW5fY2ZnKTsKIAorCisJaWYgKGNtZCA9PSBTU1BfRlJBTUVfU1lOQyAmJiAoYXJnICYgKFdPUkRfU0laRV84IHwgV09SRF9TSVpFXzEyIHwKKwkJCVdPUkRfU0laRV8xNiB8IFdPUkRfU0laRV8yNCB8IFdPUkRfU0laRV8zMikpKSB7CisJCWludCBlbiA9IGdlbl9jZmcuZW47CisJCWdlbl9jZmcuZW4gPSAwOworCQlSRUdfV1Ioc3NlciwgcG9ydC0+cmVnaV9zc2VyLCByd19jZmcsIGdlbl9jZmcpOworCQkvKiAjIyMjIyBTaG91bGQgRE1BIGJlIHN0b3BlZCBiZWZvcmUgd2UgY2hhbmdlIGRtYSBzaXplPyAqLworCQlETUFfV1JfQ01EKHBvcnQtPnJlZ2lfZG1haW4sIGRtYV93X3NpemUpOworCQlETUFfV1JfQ01EKHBvcnQtPnJlZ2lfZG1hb3V0LCBkbWFfd19zaXplKTsKKwkJZ2VuX2NmZy5lbiA9IGVuOworCQlSRUdfV1Ioc3NlciwgcG9ydC0+cmVnaV9zc2VyLCByd19jZmcsIGdlbl9jZmcpOworCX0KKwogCXNwaW5fdW5sb2NrX2lycSgmcG9ydC0+bG9jayk7CiAJcmV0dXJuIHJldHVybl92YWw7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHN5bmNfc2VyaWFsX3dyaXRlKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciAqIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQorLyogTk9URTogc3luY19zZXJpYWxfd3JpdGUgZG9lcyBub3Qgc3VwcG9ydCBjb25jdXJyZW5jeSAqLworc3RhdGljIHNzaXplX3Qgc3luY19zZXJpYWxfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJaW50IGRldiA9IGltaW5vcihmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlKTsKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQlzeW5jX3BvcnQgKnBvcnQ7Ci0JdW5zaWduZWQgbG9uZyBjLCBjMTsKLQl1bnNpZ25lZCBsb25nIGZyZWVfb3V0cDsKLQl1bnNpZ25lZCBsb25nIG91dHA7Ci0JdW5zaWduZWQgbG9uZyBvdXRfYnVmZmVyOworCXN0cnVjdCBzeW5jX3BvcnQgKnBvcnQ7CisJaW50IHRydW5jX2NvdW50OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGJ5dGVzX2ZyZWU7CisJaW50IG91dF9idWZfY291bnQ7CiAKLQlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gTlVNQkVSX09GX1BPUlRTIHx8ICFwb3J0c1tkZXZdLmVuYWJsZWQpCi0JeworCXVuc2lnbmVkIGNoYXIgKnJkX3B0cjsgICAgICAgLyogRmlyc3QgYWxsb2NhdGVkIGJ5dGUgaW4gdGhlIGJ1ZmZlciAqLworCXVuc2lnbmVkIGNoYXIgKndyX3B0cjsgICAgICAgLyogRmlyc3QgZnJlZSBieXRlIGluIHRoZSBidWZmZXIgKi8KKwl1bnNpZ25lZCBjaGFyICpidWZfc3RvcF9wdHI7IC8qIExhc3QgYnl0ZSArIDEgKi8KKworCWlmIChkZXYgPCAwIHx8IGRldiA+PSBOQlJfUE9SVFMgfHwgIXBvcnRzW2Rldl0uZW5hYmxlZCkgewogCQlERUJVRyhwcmludGsoIkludmFsaWQgbWlub3IgJWRcbiIsIGRldikpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJcG9ydCA9ICZwb3J0c1tkZXZdOwogCi0JREVCVUdXUklURShwcmludGsoIlcgZCVkIGMgJWx1ICglZC8lZClcbiIsIHBvcnQtPnBvcnRfbmJyLCBjb3VudCwgcG9ydC0+b3V0X2NvdW50LCBPVVRfQlVGRkVSX1NJWkUpKTsKLQkvKiBTcGFjZSB0byBlbmQgb2YgYnVmZmVyICovCi0JLyoKLQkgKiBvdXRfYnVmZmVyIDxjMT4wMTIzNDU8LSAgIGMgICAgLT5PVVRfQlVGRkVSX1NJWkUKLQkgKiAgICAgICAgICAgIG91dHBeICAgICtvdXRfY291bnQKLQkgICAgICAgICAgICAgICAgICAgICAgICBeZnJlZV9vdXRwCi0JICogb3V0X2J1ZmZlciA0NTwtICAgICBjICAgICAgLT4wMTIzT1VUX0JVRkZFUl9TSVpFCi0JICogICAgICAgICAgICAgK291dF9jb3VudCAgIG91dHBeCi0JICogICAgICAgICAgICAgIGZyZWVfb3V0cAotCSAqCisJLyogfDwtICAgICAgICAgT1VUX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAtPnwKKwkgKiAgICAgICAgICAgfDwtIG91dF9idWZfY291bnQgLT58CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfDwtIHRydW5jX2NvdW50IC0+fCAuLi4tPnwKKwkgKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisJICogfCAgZnJlZSAgIHwgICBkYXRhICAgICAgICAgICAgfCBmcmVlICAgICAgICAgICAgICAgICAgIHwKKwkgKiB8X19fX19fX19ffF9fX19fX19fX19fX19fX19fX198X19fX19fX19fX19fX19fX19fX19fX19ffAorCSAqICAgICAgICAgICBeIHJkX3B0ciAgICAgICAgICAgIF4gd3JfcHRyCiAJICovCisJREVCVUdXUklURShwcmludGsoS0VSTl9ERUJVRyAiVyBkJWQgYyAlbHUgYTogJXAgYzogJXBcbiIsCisJCQkgIHBvcnQtPnBvcnRfbmJyLCBjb3VudCwgcG9ydC0+YWN0aXZlX3RyX2Rlc2NyLAorCQkJICBwb3J0LT5jYXRjaF90cl9kZXNjcikpOwogCiAJLyogUmVhZCB2YXJpYWJsZXMgdGhhdCBtYXkgYmUgdXBkYXRlZCBieSBpbnRlcnJ1cHRzICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQljb3VudCA9IGNvdW50ID4gT1VUX0JVRkZFUl9TSVpFIC0gcG9ydC0+b3V0X2NvdW50ID8gT1VUX0JVRkZFUl9TSVpFICAtIHBvcnQtPm91dF9jb3VudCA6IGNvdW50OwotCW91dHAgPSAodW5zaWduZWQgbG9uZylwb3J0LT5vdXRwOwotCWZyZWVfb3V0cCA9IG91dHAgKyBwb3J0LT5vdXRfY291bnQ7CisJcmRfcHRyID0gcG9ydC0+b3V0X3JkX3B0cjsKKwlvdXRfYnVmX2NvdW50ID0gcG9ydC0+b3V0X2J1Zl9jb3VudDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0Jb3V0X2J1ZmZlciA9ICh1bnNpZ25lZCBsb25nKXBvcnQtPm91dF9idWZmZXI7CiAKLQkvKiBGaW5kIG91dCB3aGVyZSBhbmQgaG93IG11Y2ggdG8gd3JpdGUgKi8KLQlpZiAoZnJlZV9vdXRwID49IG91dF9idWZmZXIgKyBPVVRfQlVGRkVSX1NJWkUpCi0JCWZyZWVfb3V0cCAtPSBPVVRfQlVGRkVSX1NJWkU7Ci0JaWYgKGZyZWVfb3V0cCA+PSBvdXRwKQotCQljID0gb3V0X2J1ZmZlciArIE9VVF9CVUZGRVJfU0laRSAtIGZyZWVfb3V0cDsKLQllbHNlCi0JCWMgPSBvdXRwIC0gZnJlZV9vdXRwOwotCWlmIChjID4gY291bnQpCi0JCWMgPSBjb3VudDsKKwkvKiBDaGVjayBpZiByZXNvdXJjZXMgYXJlIGF2YWlsYWJsZSAqLworCWlmIChwb3J0LT50cl9ydW5uaW5nICYmCisJICAgICgocG9ydC0+dXNlX2RtYSAmJiBwb3J0LT5hY3RpdmVfdHJfZGVzY3IgPT0gcG9ydC0+Y2F0Y2hfdHJfZGVzY3IpIHx8CisJICAgICBvdXRfYnVmX2NvdW50ID49IE9VVF9CVUZGRVJfU0laRSkpIHsKKwkJREVCVUdXUklURShwcmludGsoS0VSTl9ERUJVRyAic3NlciVkIGZ1bGxcbiIsIGRldikpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CiAKLS8vCURFQlVHV1JJVEUocHJpbnRrKCJ3IG9wICUwOGxYIGZvcCAlMDhsWCBjICVsdVxuIiwgb3V0cCwgZnJlZV9vdXRwLCBjKSk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkKilmcmVlX291dHAsIGJ1ZiwgYykpCisJYnVmX3N0b3BfcHRyID0gcG9ydC0+b3V0X2J1ZmZlciArIE9VVF9CVUZGRVJfU0laRTsKKworCS8qIERldGVybWluZSBwb2ludGVyIHRvIHRoZSBmaXJzdCBmcmVlIGJ5dGUsIGJlZm9yZSBjb3B5aW5nLiAqLworCXdyX3B0ciA9IHJkX3B0ciArIG91dF9idWZfY291bnQ7CisJaWYgKHdyX3B0ciA+PSBidWZfc3RvcF9wdHIpCisJCXdyX3B0ciAtPSBPVVRfQlVGRkVSX1NJWkU7CisKKwkvKiBJZiB3ZSB3cmFwIHRoZSByaW5nIGJ1ZmZlciwgbGV0IHRoZSB1c2VyIHNwYWNlIHByb2dyYW0gaGFuZGxlIGl0IGJ5CisJICogdHJ1bmNhdGluZyB0aGUgZGF0YS4gVGhpcyBjb3VsZCBiZSBtb3JlIGVsZWdhbnQsIHNtYWxsIGJ1ZmZlcgorCSAqIGZyYWdtZW50cyBtYXkgb2NjdXIuCisJICovCisJYnl0ZXNfZnJlZSA9IE9VVF9CVUZGRVJfU0laRSAtIG91dF9idWZfY291bnQ7CisJaWYgKHdyX3B0ciArIGJ5dGVzX2ZyZWUgPiBidWZfc3RvcF9wdHIpCisJCWJ5dGVzX2ZyZWUgPSBidWZfc3RvcF9wdHIgLSB3cl9wdHI7CisJdHJ1bmNfY291bnQgPSAoY291bnQgPCBieXRlc19mcmVlKSA/IGNvdW50IDogYnl0ZXNfZnJlZTsKKworCWlmIChjb3B5X2Zyb21fdXNlcih3cl9wdHIsIGJ1ZiwgdHJ1bmNfY291bnQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWlmIChjICE9IGNvdW50KSB7Ci0JCWJ1ZiArPSBjOwotCQljMSA9IGNvdW50IC0gYzsKLQkJREVCVUdXUklURShwcmludGsoIncyIGZpICVsdSBjICVsdSBjMSAlbHVcbiIsIGZyZWVfb3V0cC1vdXRfYnVmZmVyLCBjLCBjMSkpOwotCQlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQqKW91dF9idWZmZXIsIGJ1ZiwgYzEpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0JcG9ydC0+b3V0X2NvdW50ICs9IGNvdW50OwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwlERUJVR09VVEJVRihwcmludGsoS0VSTl9ERUJVRyAiJS00ZCArICUtNGQgPSAlLTRkICAgICAlcCAlcCAlcFxuIiwKKwkJCSAgIG91dF9idWZfY291bnQsIHRydW5jX2NvdW50LAorCQkJICAgcG9ydC0+b3V0X2J1Zl9jb3VudCwgcG9ydC0+b3V0X2J1ZmZlciwKKwkJCSAgIHdyX3B0ciwgYnVmX3N0b3BfcHRyKSk7CiAKIAkvKiBNYWtlIHN1cmUgdHJhbnNtaXR0ZXIvcmVjZWl2ZXIgaXMgcnVubmluZyAqLwotCWlmICghcG9ydC0+c3RhcnRlZCkKLQl7CisJaWYgKCFwb3J0LT5zdGFydGVkKSB7CiAJCXJlZ19zc2VyX3J3X2NmZyBjZmcgPSBSRUdfUkQoc3NlciwgcG9ydC0+cmVnaV9zc2VyLCByd19jZmcpOwotCQlyZWdfc3Nlcl9yd190cl9jZmcgdHJfY2ZnID0gUkVHX1JEKHNzZXIsIHBvcnQtPnJlZ2lfc3NlciwgcndfdHJfY2ZnKTsKIAkJcmVnX3NzZXJfcndfcmVjX2NmZyByZWNfY2ZnID0gUkVHX1JEKHNzZXIsIHBvcnQtPnJlZ2lfc3NlciwgcndfcmVjX2NmZyk7CiAJCWNmZy5lbiA9IHJlZ2tfc3Nlcl95ZXM7Ci0JCXRyX2NmZy50cl9lbiA9IHBvcnQtPm91dHB1dDsKIAkJcmVjX2NmZy5yZWNfZW4gPSBwb3J0LT5pbnB1dDsKIAkJUkVHX1dSKHNzZXIsIHBvcnQtPnJlZ2lfc3NlciwgcndfY2ZnLCBjZmcpOwotCQlSRUdfV1Ioc3NlciwgcG9ydC0+cmVnaV9zc2VyLCByd190cl9jZmcsIHRyX2NmZyk7CiAJCVJFR19XUihzc2VyLCBwb3J0LT5yZWdpX3NzZXIsIHJ3X3JlY19jZmcsIHJlY19jZmcpOwogCQlwb3J0LT5zdGFydGVkID0gMTsKIAl9CiAKLQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCXsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKCFwb3J0LT50cl9ydW5uaW5nKSB7Ci0JCQlpZiAoIXBvcnQtPnVzZV9kbWEpIHsKLQkJCQlyZWdfc3Nlcl9yd19pbnRyX21hc2sgaW50cl9tYXNrOwotCQkJCWludHJfbWFzayA9IFJFR19SRChzc2VyLCBwb3J0LT5yZWdpX3NzZXIsIHJ3X2ludHJfbWFzayk7Ci0JCQkJLyogU3RhcnQgc2VuZGVyIGJ5IHdyaXRpbmcgZGF0YSAqLwotCQkJCXNlbmRfd29yZChwb3J0KTsKLQkJCQkvKiBhbmQgZW5hYmxlIHRyYW5zbWl0dGVyIHJlYWR5IElSUSAqLwotCQkJCWludHJfbWFzay50cmR5ID0gMTsKLQkJCQlSRUdfV1Ioc3NlciwgcG9ydC0+cmVnaV9zc2VyLCByd19pbnRyX21hc2ssIGludHJfbWFzayk7Ci0JCQl9IGVsc2UgewotCQkJCXN0YXJ0X2RtYShwb3J0LCAodW5zaWduZWQgY2hhciogdm9sYXRpbGUgKXBvcnQtPm91dHAsIGMpOwotCQkJfQotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJREVCVUdXUklURShwcmludGsoIncgZCVkIGMgJWx1IE5CXG4iLAotCQkJCSAgcG9ydC0+cG9ydF9uYnIsIGNvdW50KSk7Ci0JCXJldHVybiBjb3VudDsKKwkvKiBTZXR1cCB3YWl0IGlmIGJsb2NraW5nICovCisJaWYgKCEoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKSB7CisJCWFkZF93YWl0X3F1ZXVlKCZwb3J0LT5vdXRfd2FpdF9xLCAmd2FpdCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJfQogCi0JLyogU2xlZXAgdW50aWwgYWxsIHNlbnQgKi8KLQotCWFkZF93YWl0X3F1ZXVlKCZwb3J0LT5vdXRfd2FpdF9xLCAmd2FpdCk7Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCWlmICghcG9ydC0+dHJfcnVubmluZykgewotCQlpZiAoIXBvcnQtPnVzZV9kbWEpIHsKLQkJCXJlZ19zc2VyX3J3X2ludHJfbWFzayBpbnRyX21hc2s7Ci0JCQlpbnRyX21hc2sgPSBSRUdfUkQoc3NlciwgcG9ydC0+cmVnaV9zc2VyLCByd19pbnRyX21hc2spOwotCQkJLyogU3RhcnQgc2VuZGVyIGJ5IHdyaXRpbmcgZGF0YSAqLwotCQkJc2VuZF93b3JkKHBvcnQpOwotCQkJLyogYW5kIGVuYWJsZSB0cmFuc21pdHRlciByZWFkeSBJUlEgKi8KLQkJCWludHJfbWFzay50cmR5ID0gMTsKLQkJCVJFR19XUihzc2VyLCBwb3J0LT5yZWdpX3NzZXIsIHJ3X2ludHJfbWFzaywgaW50cl9tYXNrKTsKLQkJfSBlbHNlIHsKLQkJCXN0YXJ0X2RtYShwb3J0LCBwb3J0LT5vdXRwLCBjKTsKLQkJfQorCXBvcnQtPm91dF9idWZfY291bnQgKz0gdHJ1bmNfY291bnQ7CisJaWYgKHBvcnQtPnVzZV9kbWEpIHsKKwkJc3RhcnRfZG1hX291dChwb3J0LCB3cl9wdHIsIHRydW5jX2NvdW50KTsKKwl9IGVsc2UgaWYgKCFwb3J0LT50cl9ydW5uaW5nKSB7CisJCXJlZ19zc2VyX3J3X2ludHJfbWFzayBpbnRyX21hc2s7CisJCWludHJfbWFzayA9IFJFR19SRChzc2VyLCBwb3J0LT5yZWdpX3NzZXIsIHJ3X2ludHJfbWFzayk7CisJCS8qIFN0YXJ0IHNlbmRlciBieSB3cml0aW5nIGRhdGEgKi8KKwkJc2VuZF93b3JkKHBvcnQpOworCQkvKiBhbmQgZW5hYmxlIHRyYW5zbWl0dGVyIHJlYWR5IElSUSAqLworCQlpbnRyX21hc2sudHJkeSA9IDE7CisJCVJFR19XUihzc2VyLCBwb3J0LT5yZWdpX3NzZXIsIHJ3X2ludHJfbWFzaywgaW50cl9tYXNrKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCisJLyogRXhpdCBpZiBub24gYmxvY2tpbmcgKi8KKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJREVCVUdXUklURShwcmludGsoS0VSTl9ERUJVRyAidyBkJWQgYyAlbHUgICUwOHhcbiIsCisJCQkJICBwb3J0LT5wb3J0X25iciwgdHJ1bmNfY291bnQsCisJCQkJICBSRUdfUkRfSU5UKGRtYSwgcG9ydC0+cmVnaV9kbWFvdXQsIHJfaW50cikpKTsKKwkJcmV0dXJuIHRydW5jX2NvdW50OworCX0KKwogCXNjaGVkdWxlKCk7CiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAlyZW1vdmVfd2FpdF9xdWV1ZSgmcG9ydC0+b3V0X3dhaXRfcSwgJndhaXQpOworCiAJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCXsKIAkJcmV0dXJuIC1FSU5UUjsKLQl9Ci0JREVCVUdXUklURShwcmludGsoIncgZCVkIGMgJWx1XG4iLCBwb3J0LT5wb3J0X25iciwgY291bnQpKTsKLQlyZXR1cm4gY291bnQ7CisKKwlERUJVR1dSSVRFKHByaW50ayhLRVJOX0RFQlVHICJ3IGQlZCBjICVsdVxuIiwKKwkJCSAgcG9ydC0+cG9ydF9uYnIsIHRydW5jX2NvdW50KSk7CisJcmV0dXJuIHRydW5jX2NvdW50OwogfQogCiBzdGF0aWMgc3NpemVfdCBzeW5jX3NlcmlhbF9yZWFkKHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciAqIGJ1ZiwKQEAgLTkyNiw3ICsxMDg5LDcgQEAKIAl1bnNpZ25lZCBjaGFyKiBlbmQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmIChkZXYgPCAwIHx8IGRldiA+PSBOVU1CRVJfT0ZfUE9SVFMgfHwgIXBvcnRzW2Rldl0uZW5hYmxlZCkKKwlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gTkJSX1BPUlRTIHx8ICFwb3J0c1tkZXZdLmVuYWJsZWQpCiAJewogCQlERUJVRyhwcmludGsoIkludmFsaWQgbWlub3IgJWRcbiIsIGRldikpOwogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTk0OSw3ICsxMTEyLDYgQEAKIAkJcG9ydC0+c3RhcnRlZCA9IDE7CiAJfQogCi0KIAkvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBieXRlcyAqLwogCS8qIFNhdmUgcG9pbnRlcnMgdG8gYXZvaWQgdGhhdCB0aGV5IGFyZSBtb2RpZmllZCBieSBpbnRlcnJ1cHQgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwpAQCAtOTU4LDE2ICsxMTIwLDE0IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCXdoaWxlICgoc3RhcnQgPT0gZW5kKSAmJiAhcG9ydC0+ZnVsbCkgLyogTm8gZGF0YSAqLwogCXsKKwkJREVCVUdSRUFEKHByaW50ayhLRVJOX0RFQlVHICImIikpOwogCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCi0JCXsKIAkJCXJldHVybiAtRUFHQUlOOwotCQl9CiAKIAkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcG9ydC0+aW5fd2FpdF9xKTsKIAkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQl7CiAJCQlyZXR1cm4gLUVJTlRSOwotCQl9CisKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIAkJc3RhcnQgPSAodW5zaWduZWQgY2hhciopcG9ydC0+cmVhZHA7IC8qIGNhc3QgYXdheSB2b2xhdGlsZSAqLwogCQllbmQgPSAodW5zaWduZWQgY2hhciopcG9ydC0+d3JpdGVwOyAgLyogY2FzdCBhd2F5IHZvbGF0aWxlICovCkBAIC0xMDA0LDgzICsxMTY0LDEwNSBAQAogCXN3aXRjaCh0cl9jZmcuc2FtcGxlX3NpemUpCiAJewogCSBjYXNlIDg6Ci0JCSBwb3J0LT5vdXRfY291bnQtLTsKLQkJIHRyX2RhdGEuZGF0YSA9ICpwb3J0LT5vdXRwKys7CisJCSBwb3J0LT5vdXRfYnVmX2NvdW50LS07CisJCSB0cl9kYXRhLmRhdGEgPSAqcG9ydC0+b3V0X3JkX3B0cisrOwogCQkgUkVHX1dSKHNzZXIsIHBvcnQtPnJlZ2lfc3NlciwgcndfdHJfZGF0YSwgdHJfZGF0YSk7Ci0JCSBpZiAocG9ydC0+b3V0cCA+PSBwb3J0LT5vdXRfYnVmZmVyICsgT1VUX0JVRkZFUl9TSVpFKQotCQkJIHBvcnQtPm91dHAgPSBwb3J0LT5vdXRfYnVmZmVyOworCQkgaWYgKHBvcnQtPm91dF9yZF9wdHIgPj0gcG9ydC0+b3V0X2J1ZmZlciArIE9VVF9CVUZGRVJfU0laRSkKKwkJCSBwb3J0LT5vdXRfcmRfcHRyID0gcG9ydC0+b3V0X2J1ZmZlcjsKIAkJIGJyZWFrOwogCSBjYXNlIDEyOgogCSB7Ci0JCWludCBkYXRhID0gKCpwb3J0LT5vdXRwKyspIDw8IDg7Ci0JCWRhdGEgfD0gKnBvcnQtPm91dHArKzsKLQkJcG9ydC0+b3V0X2NvdW50LT0yOworCQlpbnQgZGF0YSA9ICgqcG9ydC0+b3V0X3JkX3B0cisrKSA8PCA4OworCQlkYXRhIHw9ICpwb3J0LT5vdXRfcmRfcHRyKys7CisJCXBvcnQtPm91dF9idWZfY291bnQgLT0gMjsKIAkJdHJfZGF0YS5kYXRhID0gZGF0YTsKIAkJUkVHX1dSKHNzZXIsIHBvcnQtPnJlZ2lfc3NlciwgcndfdHJfZGF0YSwgdHJfZGF0YSk7Ci0JCWlmIChwb3J0LT5vdXRwID49IHBvcnQtPm91dF9idWZmZXIgKyBPVVRfQlVGRkVSX1NJWkUpCi0JCQlwb3J0LT5vdXRwID0gcG9ydC0+b3V0X2J1ZmZlcjsKKwkJaWYgKHBvcnQtPm91dF9yZF9wdHIgPj0gcG9ydC0+b3V0X2J1ZmZlciArIE9VVF9CVUZGRVJfU0laRSkKKwkJCXBvcnQtPm91dF9yZF9wdHIgPSBwb3J0LT5vdXRfYnVmZmVyOwogCX0KIAlicmVhazsKIAljYXNlIDE2OgotCQlwb3J0LT5vdXRfY291bnQtPTI7Ci0JCXRyX2RhdGEuZGF0YSA9ICoodW5zaWduZWQgc2hvcnQgKilwb3J0LT5vdXRwOworCQlwb3J0LT5vdXRfYnVmX2NvdW50IC09IDI7CisJCXRyX2RhdGEuZGF0YSA9ICoodW5zaWduZWQgc2hvcnQgKilwb3J0LT5vdXRfcmRfcHRyOwogCQlSRUdfV1Ioc3NlciwgcG9ydC0+cmVnaV9zc2VyLCByd190cl9kYXRhLCB0cl9kYXRhKTsKLQkJcG9ydC0+b3V0cCs9MjsKLQkJaWYgKHBvcnQtPm91dHAgPj0gcG9ydC0+b3V0X2J1ZmZlciArIE9VVF9CVUZGRVJfU0laRSkKLQkJCXBvcnQtPm91dHAgPSBwb3J0LT5vdXRfYnVmZmVyOworCQlwb3J0LT5vdXRfcmRfcHRyICs9IDI7CisJCWlmIChwb3J0LT5vdXRfcmRfcHRyID49IHBvcnQtPm91dF9idWZmZXIgKyBPVVRfQlVGRkVSX1NJWkUpCisJCQlwb3J0LT5vdXRfcmRfcHRyID0gcG9ydC0+b3V0X2J1ZmZlcjsKIAkJYnJlYWs7CiAJY2FzZSAyNDoKLQkJcG9ydC0+b3V0X2NvdW50LT0zOwotCQl0cl9kYXRhLmRhdGEgPSAqKHVuc2lnbmVkIHNob3J0ICopcG9ydC0+b3V0cDsKKwkJcG9ydC0+b3V0X2J1Zl9jb3VudCAtPSAzOworCQl0cl9kYXRhLmRhdGEgPSAqKHVuc2lnbmVkIHNob3J0ICopcG9ydC0+b3V0X3JkX3B0cjsKIAkJUkVHX1dSKHNzZXIsIHBvcnQtPnJlZ2lfc3NlciwgcndfdHJfZGF0YSwgdHJfZGF0YSk7Ci0JCXBvcnQtPm91dHArPTI7Ci0JCXRyX2RhdGEuZGF0YSA9ICpwb3J0LT5vdXRwKys7CisJCXBvcnQtPm91dF9yZF9wdHIgKz0gMjsKKwkJdHJfZGF0YS5kYXRhID0gKnBvcnQtPm91dF9yZF9wdHIrKzsKIAkJUkVHX1dSKHNzZXIsIHBvcnQtPnJlZ2lfc3NlciwgcndfdHJfZGF0YSwgdHJfZGF0YSk7Ci0JCWlmIChwb3J0LT5vdXRwID49IHBvcnQtPm91dF9idWZmZXIgKyBPVVRfQlVGRkVSX1NJWkUpCi0JCQlwb3J0LT5vdXRwID0gcG9ydC0+b3V0X2J1ZmZlcjsKKwkJaWYgKHBvcnQtPm91dF9yZF9wdHIgPj0gcG9ydC0+b3V0X2J1ZmZlciArIE9VVF9CVUZGRVJfU0laRSkKKwkJCXBvcnQtPm91dF9yZF9wdHIgPSBwb3J0LT5vdXRfYnVmZmVyOwogCQlicmVhazsKIAljYXNlIDMyOgotCQlwb3J0LT5vdXRfY291bnQtPTQ7Ci0JCXRyX2RhdGEuZGF0YSA9ICoodW5zaWduZWQgc2hvcnQgKilwb3J0LT5vdXRwOworCQlwb3J0LT5vdXRfYnVmX2NvdW50IC09IDQ7CisJCXRyX2RhdGEuZGF0YSA9ICoodW5zaWduZWQgc2hvcnQgKilwb3J0LT5vdXRfcmRfcHRyOwogCQlSRUdfV1Ioc3NlciwgcG9ydC0+cmVnaV9zc2VyLCByd190cl9kYXRhLCB0cl9kYXRhKTsKLQkJcG9ydC0+b3V0cCs9MjsKLQkJdHJfZGF0YS5kYXRhID0gKih1bnNpZ25lZCBzaG9ydCAqKXBvcnQtPm91dHA7CisJCXBvcnQtPm91dF9yZF9wdHIgKz0gMjsKKwkJdHJfZGF0YS5kYXRhID0gKih1bnNpZ25lZCBzaG9ydCAqKXBvcnQtPm91dF9yZF9wdHI7CiAJCVJFR19XUihzc2VyLCBwb3J0LT5yZWdpX3NzZXIsIHJ3X3RyX2RhdGEsIHRyX2RhdGEpOwotCQlwb3J0LT5vdXRwKz0yOwotCQlpZiAocG9ydC0+b3V0cCA+PSBwb3J0LT5vdXRfYnVmZmVyICsgT1VUX0JVRkZFUl9TSVpFKQotCQkJcG9ydC0+b3V0cCA9IHBvcnQtPm91dF9idWZmZXI7CisJCXBvcnQtPm91dF9yZF9wdHIgKz0gMjsKKwkJaWYgKHBvcnQtPm91dF9yZF9wdHIgPj0gcG9ydC0+b3V0X2J1ZmZlciArIE9VVF9CVUZGRVJfU0laRSkKKwkJCXBvcnQtPm91dF9yZF9wdHIgPSBwb3J0LT5vdXRfYnVmZmVyOwogCQlicmVhazsKIAl9CiB9CiAKLQotc3RhdGljIHZvaWQgc3RhcnRfZG1hKHN0cnVjdCBzeW5jX3BvcnQqIHBvcnQsIGNvbnN0IGNoYXIqIGRhdGEsIGludCBjb3VudCkKK3N0YXRpYyB2b2lkIHN0YXJ0X2RtYV9vdXQoc3RydWN0IHN5bmNfcG9ydCAqcG9ydCwKKwkJCSAgY29uc3QgY2hhciAqZGF0YSwgaW50IGNvdW50KQogeworCXBvcnQtPmFjdGl2ZV90cl9kZXNjci0+YnVmID0gKGNoYXIgKikgdmlydF90b19waHlzKChjaGFyICopIGRhdGEpOworCXBvcnQtPmFjdGl2ZV90cl9kZXNjci0+YWZ0ZXIgPSBwb3J0LT5hY3RpdmVfdHJfZGVzY3ItPmJ1ZiArIGNvdW50OworCXBvcnQtPmFjdGl2ZV90cl9kZXNjci0+aW50ciA9IDE7CisKKwlwb3J0LT5hY3RpdmVfdHJfZGVzY3ItPmVvbCA9IDE7CisJcG9ydC0+cHJldl90cl9kZXNjci0+ZW9sID0gMDsKKworCURFQlVHVFJETUEocHJpbnRrKEtFUk5fREVCVUcgIkluc2VydGluZyBlb2xyOiVwIGVvbEA6JXBcbiIsCisJCXBvcnQtPnByZXZfdHJfZGVzY3IsIHBvcnQtPmFjdGl2ZV90cl9kZXNjcikpOworCXBvcnQtPnByZXZfdHJfZGVzY3IgPSBwb3J0LT5hY3RpdmVfdHJfZGVzY3I7CisJcG9ydC0+YWN0aXZlX3RyX2Rlc2NyID0gcGh5c190b192aXJ0KChpbnQpIHBvcnQtPmFjdGl2ZV90cl9kZXNjci0+bmV4dCk7CisKKwlpZiAoIXBvcnQtPnRyX3J1bm5pbmcpIHsKKwkJcmVnX3NzZXJfcndfdHJfY2ZnIHRyX2NmZyA9IFJFR19SRChzc2VyLCBwb3J0LT5yZWdpX3NzZXIsCisJCQlyd190cl9jZmcpOworCisJCXBvcnQtPm91dF9jb250ZXh0Lm5leHQgPSAwOworCQlwb3J0LT5vdXRfY29udGV4dC5zYXZlZF9kYXRhID0KKwkJCShkbWFfZGVzY3JfZGF0YSAqKXZpcnRfdG9fcGh5cyhwb3J0LT5wcmV2X3RyX2Rlc2NyKTsKKwkJcG9ydC0+b3V0X2NvbnRleHQuc2F2ZWRfZGF0YV9idWYgPSBwb3J0LT5wcmV2X3RyX2Rlc2NyLT5idWY7CisKKwkJRE1BX1NUQVJUX0NPTlRFWFQocG9ydC0+cmVnaV9kbWFvdXQsCisJCQl2aXJ0X3RvX3BoeXMoKGNoYXIgKikmcG9ydC0+b3V0X2NvbnRleHQpKTsKKworCQl0cl9jZmcudHJfZW4gPSByZWdrX3NzZXJfeWVzOworCQlSRUdfV1Ioc3NlciwgcG9ydC0+cmVnaV9zc2VyLCByd190cl9jZmcsIHRyX2NmZyk7CisJCURFQlVHVFJETUEocHJpbnRrKEtFUk5fREVCVUcgImRtYSBzXG4iKTspOworCX0gZWxzZSB7CisJCURNQV9DT05USU5VRV9EQVRBKHBvcnQtPnJlZ2lfZG1hb3V0KTsKKwkJREVCVUdUUkRNQShwcmludGsoS0VSTl9ERUJVRyAiZG1hIGNcbiIpOyk7CisJfQorCiAJcG9ydC0+dHJfcnVubmluZyA9IDE7Ci0JcG9ydC0+b3V0X2Rlc2NyLmJ1ZiA9IChjaGFyKil2aXJ0X3RvX3BoeXMoKGNoYXIqKWRhdGEpOwotCXBvcnQtPm91dF9kZXNjci5hZnRlciA9IHBvcnQtPm91dF9kZXNjci5idWYgKyBjb3VudDsKLQlwb3J0LT5vdXRfZGVzY3IuZW9sID0gcG9ydC0+b3V0X2Rlc2NyLmludHIgPSAxOwotCi0JcG9ydC0+b3V0X2NvbnRleHQuc2F2ZWRfZGF0YSA9IChkbWFfZGVzY3JfZGF0YSopdmlydF90b19waHlzKCZwb3J0LT5vdXRfZGVzY3IpOwotCXBvcnQtPm91dF9jb250ZXh0LnNhdmVkX2RhdGFfYnVmID0gcG9ydC0+b3V0X2Rlc2NyLmJ1ZjsKLQotCURNQV9TVEFSVF9DT05URVhUKHBvcnQtPnJlZ2lfZG1hb3V0LCB2aXJ0X3RvX3BoeXMoKGNoYXIqKSZwb3J0LT5vdXRfY29udGV4dCkpOwotCURFQlVHVFhJTlQocHJpbnRrKCJkbWEgJTA4bFggYyAlZFxuIiwgKHVuc2lnbmVkIGxvbmcpZGF0YSwgY291bnQpKTsKIH0KIAotc3RhdGljIHZvaWQgc3RhcnRfZG1hX2luKHN5bmNfcG9ydCogcG9ydCkKK3N0YXRpYyB2b2lkIHN0YXJ0X2RtYV9pbihzeW5jX3BvcnQgKnBvcnQpCiB7CiAJaW50IGk7Ci0JY2hhciogYnVmOworCWNoYXIgKmJ1ZjsKIAlwb3J0LT53cml0ZXAgPSBwb3J0LT5mbGlwOwogCi0JaWYgKHBvcnQtPndyaXRlcCA+IHBvcnQtPmZsaXAgKyBwb3J0LT5pbl9idWZmZXJfc2l6ZSkKLQl7CisJaWYgKHBvcnQtPndyaXRlcCA+IHBvcnQtPmZsaXAgKyBwb3J0LT5pbl9idWZmZXJfc2l6ZSkgewogCQlwYW5pYygiT2Zmc2V0IHRvbyBsYXJnZSBpbiBzeW5jIHNlcmlhbCBkcml2ZXJcbiIpOwogCQlyZXR1cm47CiAJfQogCWJ1ZiA9IChjaGFyKil2aXJ0X3RvX3BoeXMocG9ydC0+aW5fYnVmZmVyKTsKLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0lOX0RFU0NSOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgTkJSX0lOX0RFU0NSOyBpKyspIHsKIAkJcG9ydC0+aW5fZGVzY3JbaV0uYnVmID0gYnVmOwogCQlwb3J0LT5pbl9kZXNjcltpXS5hZnRlciA9IGJ1ZiArIHBvcnQtPmluYnVmY2h1bms7CiAJCXBvcnQtPmluX2Rlc2NyW2ldLmludHIgPSAxOwpAQCAtMTA5Miw1OSArMTI3NCwxMjYgQEAKIAlwb3J0LT5pbl9kZXNjcltpLTFdLm5leHQgPSAoZG1hX2Rlc2NyX2RhdGEqKXZpcnRfdG9fcGh5cygmcG9ydC0+aW5fZGVzY3JbMF0pOwogCXBvcnQtPmluX2Rlc2NyW2ktMV0uZW9sID0gcmVna19zc2VyX3llczsKIAlwb3J0LT5uZXh0X3J4X2Rlc2MgPSAmcG9ydC0+aW5fZGVzY3JbMF07Ci0JcG9ydC0+cHJldl9yeF9kZXNjID0gJnBvcnQtPmluX2Rlc2NyW05VTV9JTl9ERVNDUiAtIDFdOworCXBvcnQtPnByZXZfcnhfZGVzYyA9ICZwb3J0LT5pbl9kZXNjcltOQlJfSU5fREVTQ1IgLSAxXTsKIAlwb3J0LT5pbl9jb250ZXh0LnNhdmVkX2RhdGEgPSAoZG1hX2Rlc2NyX2RhdGEqKXZpcnRfdG9fcGh5cygmcG9ydC0+aW5fZGVzY3JbMF0pOwogCXBvcnQtPmluX2NvbnRleHQuc2F2ZWRfZGF0YV9idWYgPSBwb3J0LT5pbl9kZXNjclswXS5idWY7CiAJRE1BX1NUQVJUX0NPTlRFWFQocG9ydC0+cmVnaV9kbWFpbiwgdmlydF90b19waHlzKCZwb3J0LT5pbl9jb250ZXh0KSk7CiB9CiAKICNpZmRlZiBTWU5DX1NFUl9ETUEKLXN0YXRpYyBpcnFyZXR1cm5fdCB0cl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCitzdGF0aWMgaXJxcmV0dXJuX3QgdHJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlyZWdfZG1hX3JfbWFza2VkX2ludHIgbWFza2VkOwogCXJlZ19kbWFfcndfYWNrX2ludHIgYWNrX2ludHIgPSB7LmRhdGEgPSByZWdrX2RtYV95ZXN9OworCXJlZ19kbWFfcndfc3RhdCBzdGF0OwogCWludCBpOwotCXN0cnVjdCBkbWFfZGVzY3JfZGF0YSAqZGVzY3I7Ci0JdW5zaWduZWQgaW50IHNlbnRsOwogCWludCBmb3VuZCA9IDA7CisJaW50IHN0b3Bfc3NlciA9IDA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTlVNQkVSX09GX1BPUlRTOyBpKyspCi0JeworCWZvciAoaSA9IDA7IGkgPCBOQlJfUE9SVFM7IGkrKykgewogCQlzeW5jX3BvcnQgKnBvcnQgPSAmcG9ydHNbaV07Ci0JCWlmICghcG9ydC0+ZW5hYmxlZCAgfHwgIXBvcnQtPnVzZV9kbWEgKQorCQlpZiAoIXBvcnQtPmVuYWJsZWQgIHx8ICFwb3J0LT51c2VfZG1hKQogCQkJY29udGludWU7CiAKKwkJLyogSVJRIGFjdGl2ZSBmb3IgdGhlIHBvcnQ/ICovCiAJCW1hc2tlZCA9IFJFR19SRChkbWEsIHBvcnQtPnJlZ2lfZG1hb3V0LCByX21hc2tlZF9pbnRyKTsKKwkJaWYgKCFtYXNrZWQuZGF0YSkKKwkJCWNvbnRpbnVlOwogCi0JCWlmIChtYXNrZWQuZGF0YSkgLyogSVJRIGFjdGl2ZSBmb3IgdGhlIHBvcnQ/ICovCi0JCXsKLQkJCWZvdW5kID0gMTsKLQkJCS8qIENsZWFyIElSUSAqLwotCQkJUkVHX1dSKGRtYSwgcG9ydC0+cmVnaV9kbWFvdXQsIHJ3X2Fja19pbnRyLCBhY2tfaW50cik7Ci0JCQlkZXNjciA9ICZwb3J0LT5vdXRfZGVzY3I7Ci0JCQlzZW50bCA9IGRlc2NyLT5hZnRlciAtIGRlc2NyLT5idWY7Ci0JCQlwb3J0LT5vdXRfY291bnQgLT0gc2VudGw7Ci0JCQlwb3J0LT5vdXRwICs9IHNlbnRsOwotCQkJaWYgKHBvcnQtPm91dHAgPj0gcG9ydC0+b3V0X2J1ZmZlciArIE9VVF9CVUZGRVJfU0laRSkKLQkJCQlwb3J0LT5vdXRwID0gcG9ydC0+b3V0X2J1ZmZlcjsKLQkJCWlmIChwb3J0LT5vdXRfY291bnQpICB7Ci0JCQkJaW50IGM7Ci0JCQkJYyA9IHBvcnQtPm91dF9idWZmZXIgKyBPVVRfQlVGRkVSX1NJWkUgLSBwb3J0LT5vdXRwOwotCQkJCWlmIChjID4gcG9ydC0+b3V0X2NvdW50KQotCQkJCQljID0gcG9ydC0+b3V0X2NvdW50OwotCQkJCURFQlVHVFhJTlQocHJpbnRrKCJ0eF9pbnQgRE1BV1JJVEUgJWkgJWlcbiIsIHNlbnRsLCBjKSk7Ci0JCQkJc3RhcnRfZG1hKHBvcnQsIHBvcnQtPm91dHAsIGMpOwotCQkJfSBlbHNlICB7Ci0JCQkJREVCVUdUWElOVChwcmludGsoInR4X2ludCBETUEgc3RvcCAlaVxuIiwgc2VudGwpKTsKLQkJCQlwb3J0LT50cl9ydW5uaW5nID0gMDsKKwkJZm91bmQgPSAxOworCisJCS8qIENoZWNrIGlmIHdlIHNob3VsZCBzdG9wIHRoZSBETUEgdHJhbnNmZXIgKi8KKwkJc3RhdCA9IFJFR19SRChkbWEsIHBvcnQtPnJlZ2lfZG1hb3V0LCByd19zdGF0KTsKKwkJaWYgKHN0YXQubGlzdF9zdGF0ZSA9PSByZWdrX2RtYV9kYXRhX2F0X2VvbCkKKwkJCXN0b3Bfc3NlciA9IDE7CisKKwkJLyogQ2xlYXIgSVJRICovCisJCVJFR19XUihkbWEsIHBvcnQtPnJlZ2lfZG1hb3V0LCByd19hY2tfaW50ciwgYWNrX2ludHIpOworCisJCWlmICghc3RvcF9zc2VyKSB7CisJCQkvKiBUaGUgRE1BIGhhcyBjb21wbGV0ZWQgYSBkZXNjcmlwdG9yLCBFT0wgd2FzIG5vdAorCQkJICogZW5jb3VudGVyZWQsIHNvIHN0ZXAgcmVsZXZhbnQgZGVzY3JpcHRvciBhbmQKKwkJCSAqIGRhdGFwb2ludGVycyBmb3J3YXJkLiAqLworCQkJaW50IHNlbnQ7CisJCQlzZW50ID0gcG9ydC0+Y2F0Y2hfdHJfZGVzY3ItPmFmdGVyIC0KKwkJCQlwb3J0LT5jYXRjaF90cl9kZXNjci0+YnVmOworCQkJREVCVUdUWElOVChwcmludGsoS0VSTl9ERUJVRyAiJS00ZCAtICUtNGQgPSAlLTRkXHQiCisJCQkJCSAgImluIGRlc2NyICVwIChhYzogJXApXG4iLAorCQkJCQkgIHBvcnQtPm91dF9idWZfY291bnQsIHNlbnQsCisJCQkJCSAgcG9ydC0+b3V0X2J1Zl9jb3VudCAtIHNlbnQsCisJCQkJCSAgcG9ydC0+Y2F0Y2hfdHJfZGVzY3IsCisJCQkJCSAgcG9ydC0+YWN0aXZlX3RyX2Rlc2NyKTspOworCQkJcG9ydC0+b3V0X2J1Zl9jb3VudCAtPSBzZW50OworCQkJcG9ydC0+Y2F0Y2hfdHJfZGVzY3IgPQorCQkJCXBoeXNfdG9fdmlydCgoaW50KSBwb3J0LT5jYXRjaF90cl9kZXNjci0+bmV4dCk7CisJCQlwb3J0LT5vdXRfcmRfcHRyID0KKwkJCQlwaHlzX3RvX3ZpcnQoKGludCkgcG9ydC0+Y2F0Y2hfdHJfZGVzY3ItPmJ1Zik7CisJCX0gZWxzZSB7CisJCQlpbnQgaSwgc2VudDsKKwkJCS8qIEVPTCBoYW5kbGVyLgorCQkJICogTm90ZSB0aGF0IGlmIGFuIEVPTCB3YXMgZW5jb3VudGVyZWQgZHVyaW5nIHRoZSBpcnEKKwkJCSAqIGxvY2tlZCBzZWN0aW9uIG9mIHN5bmNfc2VyX3dyaXRlIHRoZSBETUEgd2lsbCBiZQorCQkJICogcmVzdGFydGVkIGFuZCB0aGUgZW9sIGZsYWcgd2lsbCBiZSBjbGVhcmVkLgorCQkJICogVGhlIHJlbWFpbmluZyBkZXNjcmlwdG9ycyB3aWxsIGJlIHRyYXZlcnNlZCBieQorCQkJICogdGhlIGRlc2NyaXB0b3IgaW50ZXJydXB0cyBhcyB1c3VhbC4KKwkJCSAqLworCQkJaSA9IDA7CisJCQl3aGlsZSAoIXBvcnQtPmNhdGNoX3RyX2Rlc2NyLT5lb2wpIHsKKwkJCQlzZW50ID0gcG9ydC0+Y2F0Y2hfdHJfZGVzY3ItPmFmdGVyIC0KKwkJCQkJcG9ydC0+Y2F0Y2hfdHJfZGVzY3ItPmJ1ZjsKKwkJCQlERUJVR09VVEJVRihwcmludGsoS0VSTl9ERUJVRworCQkJCQkidHJhdmVyc2luZyBkZXNjciAlcCAtJWQgKCVkKVxuIiwKKwkJCQkJcG9ydC0+Y2F0Y2hfdHJfZGVzY3IsCisJCQkJCXNlbnQsCisJCQkJCXBvcnQtPm91dF9idWZfY291bnQpKTsKKwkJCQlwb3J0LT5vdXRfYnVmX2NvdW50IC09IHNlbnQ7CisJCQkJcG9ydC0+Y2F0Y2hfdHJfZGVzY3IgPSBwaHlzX3RvX3ZpcnQoCisJCQkJCShpbnQpcG9ydC0+Y2F0Y2hfdHJfZGVzY3ItPm5leHQpOworCQkJCWkrKzsKKwkJCQlpZiAoaSA+PSBOQlJfT1VUX0RFU0NSKSB7CisJCQkJCS8qIFRPRE86IFJlc2V0IGFuZCByZWNvdmVyICovCisJCQkJCXBhbmljKCJzeW5jX3NlcmlhbDogbWlzc2luZyBlb2wiKTsKKwkJCQl9CiAJCQl9Ci0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPm91dF93YWl0X3EpOyAvKiB3YWtlIHVwIHRoZSB3YWl0aW5nIHByb2Nlc3MgKi8KKwkJCXNlbnQgPSBwb3J0LT5jYXRjaF90cl9kZXNjci0+YWZ0ZXIgLQorCQkJCXBvcnQtPmNhdGNoX3RyX2Rlc2NyLT5idWY7CisJCQlERUJVR09VVEJVRihwcmludGsoS0VSTl9ERUJVRworCQkJCSJlb2wgYXQgZGVzY3IgJXAgLSVkICglZClcbiIsCisJCQkJcG9ydC0+Y2F0Y2hfdHJfZGVzY3IsCisJCQkJc2VudCwKKwkJCQlwb3J0LT5vdXRfYnVmX2NvdW50KSk7CisKKwkJCXBvcnQtPm91dF9idWZfY291bnQgLT0gc2VudDsKKworCQkJLyogVXBkYXRlIHJlYWQgcG9pbnRlciB0byBmaXJzdCBmcmVlIGJ5dGUsIHdlCisJCQkgKiBtYXkgYWxyZWFkeSBiZSB3cml0aW5nIGRhdGEgdGhlcmUuICovCisJCQlwb3J0LT5vdXRfcmRfcHRyID0KKwkJCQlwaHlzX3RvX3ZpcnQoKGludCkgcG9ydC0+Y2F0Y2hfdHJfZGVzY3ItPmFmdGVyKTsKKwkJCWlmIChwb3J0LT5vdXRfcmRfcHRyID4gcG9ydC0+b3V0X2J1ZmZlciArCisJCQkJCU9VVF9CVUZGRVJfU0laRSkKKwkJCQlwb3J0LT5vdXRfcmRfcHRyID0gcG9ydC0+b3V0X2J1ZmZlcjsKKworCQkJcmVnX3NzZXJfcndfdHJfY2ZnIHRyX2NmZyA9CisJCQkJUkVHX1JEKHNzZXIsIHBvcnQtPnJlZ2lfc3NlciwgcndfdHJfY2ZnKTsKKwkJCURFQlVHVFhJTlQocHJpbnRrKEtFUk5fREVCVUcKKwkJCQkidHJfaW50IERNQSBzdG9wICVkLCBzZXQgY2F0Y2ggQCAlcFxuIiwKKwkJCQlwb3J0LT5vdXRfYnVmX2NvdW50LAorCQkJCXBvcnQtPmFjdGl2ZV90cl9kZXNjcikpOworCQkJaWYgKHBvcnQtPm91dF9idWZfY291bnQgIT0gMCkKKwkJCQlwcmludGsoS0VSTl9DUklUICJzeW5jX3NlcjogYnVmZmVyIG5vdCAiCisJCQkJCSJlbXB0eSBhZnRlciBlb2wuXG4iKTsKKwkJCXBvcnQtPmNhdGNoX3RyX2Rlc2NyID0gcG9ydC0+YWN0aXZlX3RyX2Rlc2NyOworCQkJcG9ydC0+dHJfcnVubmluZyA9IDA7CisJCQl0cl9jZmcudHJfZW4gPSByZWdrX3NzZXJfbm87CisJCQlSRUdfV1Ioc3NlciwgcG9ydC0+cmVnaV9zc2VyLCByd190cl9jZmcsIHRyX2NmZyk7CiAJCX0KKwkJLyogd2FrZSB1cCB0aGUgd2FpdGluZyBwcm9jZXNzICovCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+b3V0X3dhaXRfcSk7CiAJfQogCXJldHVybiBJUlFfUkVUVkFMKGZvdW5kKTsKIH0gLyogdHJfaW50ZXJydXB0ICovCiAKLXN0YXRpYyBpcnFyZXR1cm5fdCByeF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCitzdGF0aWMgaXJxcmV0dXJuX3QgcnhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlyZWdfZG1hX3JfbWFza2VkX2ludHIgbWFza2VkOwogCXJlZ19kbWFfcndfYWNrX2ludHIgYWNrX2ludHIgPSB7LmRhdGEgPSByZWdrX2RtYV95ZXN9OwpAQCAtMTE1Miw3ICsxNDAxLDcgQEAKIAlpbnQgaTsKIAlpbnQgZm91bmQgPSAwOwogCi0JZm9yIChpID0gMDsgaSA8IE5VTUJFUl9PRl9QT1JUUzsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBOQlJfUE9SVFM7IGkrKykKIAl7CiAJCXN5bmNfcG9ydCAqcG9ydCA9ICZwb3J0c1tpXTsKIApAQCAtMTE2Niw3ICsxNDE1LDcgQEAKIAkJCWZvdW5kID0gMTsKIAkJCXdoaWxlIChSRUdfUkQoZG1hLCBwb3J0LT5yZWdpX2RtYWluLCByd19kYXRhKSAhPQogCQkJICAgICAgIHZpcnRfdG9fcGh5cyhwb3J0LT5uZXh0X3J4X2Rlc2MpKSB7Ci0KKwkJCQlERUJVR1JYSU5UKHByaW50ayhLRVJOX0RFQlVHICIhIikpOwogCQkJCWlmIChwb3J0LT53cml0ZXAgKyBwb3J0LT5pbmJ1ZmNodW5rID4gcG9ydC0+ZmxpcCArIHBvcnQtPmluX2J1ZmZlcl9zaXplKSB7CiAJCQkJCWludCBmaXJzdF9zaXplID0gcG9ydC0+ZmxpcCArIHBvcnQtPmluX2J1ZmZlcl9zaXplIC0gcG9ydC0+d3JpdGVwOwogCQkJCQltZW1jcHkoKGNoYXIqKXBvcnQtPndyaXRlcCwgcGh5c190b192aXJ0KCh1bnNpZ25lZClwb3J0LT5uZXh0X3J4X2Rlc2MtPmJ1ZiksIGZpcnN0X3NpemUpOwpAQCAtMTE4NSwxMSArMTQzNCwxNiBAQAogCQkJCSAgcG9ydC0+ZnVsbCA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotCQkJCXBvcnQtPm5leHRfcnhfZGVzYy0+ZW9sID0gMDsKLQkJCQlwb3J0LT5wcmV2X3J4X2Rlc2MtPmVvbCA9IDE7Ci0JCQkJcG9ydC0+cHJldl9yeF9kZXNjID0gcGh5c190b192aXJ0KCh1bnNpZ25lZClwb3J0LT5uZXh0X3J4X2Rlc2MpOworCQkJCXBvcnQtPm5leHRfcnhfZGVzYy0+ZW9sID0gMTsKKwkJCQlwb3J0LT5wcmV2X3J4X2Rlc2MtPmVvbCA9IDA7CisJCQkJLyogQ2FjaGUgYnVnIHdvcmthcm91bmQgKi8KKwkJCQlmbHVzaF9kbWFfZGVzY3IocG9ydC0+cHJldl9yeF9kZXNjLCAwKTsKKwkJCQlwb3J0LT5wcmV2X3J4X2Rlc2MgPSBwb3J0LT5uZXh0X3J4X2Rlc2M7CiAJCQkJcG9ydC0+bmV4dF9yeF9kZXNjID0gcGh5c190b192aXJ0KCh1bnNpZ25lZClwb3J0LT5uZXh0X3J4X2Rlc2MtPm5leHQpOwotCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+aW5fd2FpdF9xKTsgLyogd2FrZSB1cCB0aGUgd2FpdGluZyBwcm9jZXNzICovCisJCQkJLyogQ2FjaGUgYnVnIHdvcmthcm91bmQgKi8KKwkJCQlmbHVzaF9kbWFfZGVzY3IocG9ydC0+cHJldl9yeF9kZXNjLCAxKTsKKwkJCQkvKiB3YWtlIHVwIHRoZSB3YWl0aW5nIHByb2Nlc3MgKi8KKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPmluX3dhaXRfcSk7CiAJCQkJRE1BX0NPTlRJTlVFKHBvcnQtPnJlZ2lfZG1haW4pOwogCQkJCVJFR19XUihkbWEsIHBvcnQtPnJlZ2lfZG1haW4sIHJ3X2Fja19pbnRyLCBhY2tfaW50cik7CiAKQEAgLTEyMDEsMTUgKzE0NTUsMTUgQEAKICNlbmRpZiAvKiBTWU5DX1NFUl9ETUEgKi8KIAogI2lmZGVmIFNZTkNfU0VSX01BTlVBTAotc3RhdGljIGlycXJldHVybl90IG1hbnVhbF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCitzdGF0aWMgaXJxcmV0dXJuX3QgbWFudWFsX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJaW50IGk7CiAJaW50IGZvdW5kID0gMDsKIAlyZWdfc3Nlcl9yX21hc2tlZF9pbnRyIG1hc2tlZDsKIAotCWZvciAoaSA9IDA7IGkgPCBOVU1CRVJfT0ZfUE9SVFM7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgTkJSX1BPUlRTOyBpKyspCiAJewotCQlzeW5jX3BvcnQqIHBvcnQgPSAmcG9ydHNbaV07CisJCXN5bmNfcG9ydCAqcG9ydCA9ICZwb3J0c1tpXTsKIAogCQlpZiAoIXBvcnQtPmVuYWJsZWQgfHwgcG9ydC0+dXNlX2RtYSkKIAkJewpAQCAtMTI2Myw3ICsxNTE3LDcgQEAKIAkJaWYgKG1hc2tlZC50cmR5KSAvKiBUcmFuc21pdHRlciByZWFkeT8gKi8KIAkJewogCQkJZm91bmQgPSAxOwotCQkJaWYgKHBvcnQtPm91dF9jb3VudCA+IDApIC8qIE1vcmUgZGF0YSB0byBzZW5kICovCisJCQlpZiAocG9ydC0+b3V0X2J1Zl9jb3VudCA+IDApIC8qIE1vcmUgZGF0YSB0byBzZW5kICovCiAJCQkJc2VuZF93b3JkKHBvcnQpOwogCQkJZWxzZSAvKiB0cmFuc21pc3Npb24gZmluaXNoZWQgKi8KIAkJCXsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL01ha2VmaWxlCmluZGV4IDVkNWI2MTMuLjk5M2Q5ODcgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9NYWtlZmlsZQpAQCAtMSw0ICsxLDMgQEAKLSMgJElkOiBNYWtlZmlsZSx2IDEuMTEgMjAwNC8xMi8xNyAxMDoxNjoxMyBzdGFydmlrIEV4cCAkCiAjCiAjIE1ha2VmaWxlIGZvciB0aGUgbGludXgga2VybmVsLgogIwpAQCAtNiw5ICs1LDkgQEAKIGV4dHJhLXkJOj0gaGVhZC5vCiAKIAotb2JqLXkgICA6PSBlbnRyeS5vIHRyYXBzLm8gaXJxLm8gZGVidWdwb3J0Lm8gZG1hLm8gcGlubXV4Lm8gXAorb2JqLXkgICA6PSBlbnRyeS5vIHRyYXBzLm8gaXJxLm8gZGVidWdwb3J0Lm8gXAogCSAgIHByb2Nlc3MubyBwdHJhY2UubyBzZXR1cC5vIHNpZ25hbC5vIHRyYXBzLm8gdGltZS5vIFwKLQkgICBhcmJpdGVyLm8gaW8ubworCSAgIGNhY2hlLm8gY2FjaGVmbHVzaC5vCiAKIG9iai0kKENPTkZJR19FVFJBWEZTX1NJTSkgKz0gdmNzX2hvb2subwogCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL2FyYml0ZXIuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvYXJiaXRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjBhNTMxLi4wMDAwMDAwCi0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvYXJiaXRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qCi0gKiBNZW1vcnkgYXJiaXRlciBmdW5jdGlvbnMuIEFsbG9jYXRlcyBiYW5kd2lkdGggdGhyb3VnaCB0aGUKLSAqIGFyYml0ZXIgYW5kIHNldHMgdXAgYXJiaXRlciBicmVha3BvaW50cy4KLSAqCi0gKiBUaGUgYWxnb3JpdGhtIGZpcnN0IGFzc2lnbnMgc2xvdHMgdG8gdGhlIGNsaWVudHMgdGhhdCBoYXMgc3BlY2lmaWVkCi0gKiBiYW5kd2lkdGggKGUuZy4gZXRoZXJuZXQpIGFuZCB0aGVuIHRoZSByZW1haW5pbmcgc2xvdHMgYXJlIGRpdmlkZWQKLSAqIG9uIGFsbCB0aGUgYWN0aXZlIGNsaWVudHMuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIuCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9yZWdfbWFwLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL3JlZ19yZHdyLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL21hcmJfZGVmcy5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2FyYml0ZXIuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvaW50cl92ZWN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotCi1zdHJ1Y3QgY3Jpc3YzMl93YXRjaF9lbnRyeQotewotICB1bnNpZ25lZCBsb25nIGluc3RhbmNlOwotICB3YXRjaF9jYWxsYmFjayogY2I7Ci0gIHVuc2lnbmVkIGxvbmcgc3RhcnQ7Ci0gIHVuc2lnbmVkIGxvbmcgZW5kOwotICBpbnQgdXNlZDsKLX07Ci0KLSNkZWZpbmUgTlVNQkVSX09GX0JQIDQKLSNkZWZpbmUgTkJSX09GX0NMSUVOVFMgMTQKLSNkZWZpbmUgTkJSX09GX1NMT1RTIDY0Ci0jZGVmaW5lIFNEUkFNX0JBTkRXSURUSCAxMDAwMDAwMDAgLyogU29tZSBraW5kIG9mIGV4cGVjdGVkIHZhbHVlICovCi0jZGVmaW5lIElOVE1FTV9CQU5EV0lEVEggNDAwMDAwMDAwCi0jZGVmaW5lIE5CUl9PRl9SRUdJT05TIDIKLQotc3RhdGljIHN0cnVjdCBjcmlzdjMyX3dhdGNoX2VudHJ5IHdhdGNoZXNbTlVNQkVSX09GX0JQXSA9Ci17Ci0gIHtyZWdpX21hcmJfYnAwfSwKLSAge3JlZ2lfbWFyYl9icDF9LAotICB7cmVnaV9tYXJiX2JwMn0sCi0gIHtyZWdpX21hcmJfYnAzfQotfTsKLQotc3RhdGljIGludCByZXF1ZXN0ZWRfc2xvdHNbTkJSX09GX1JFR0lPTlNdW05CUl9PRl9DTElFTlRTXTsKLXN0YXRpYyBpbnQgYWN0aXZlX2NsaWVudHNbTkJSX09GX1JFR0lPTlNdW05CUl9PRl9DTElFTlRTXTsKLXN0YXRpYyBpbnQgbWF4X2JhbmR3aWR0aFtOQlJfT0ZfUkVHSU9OU10gPSB7U0RSQU1fQkFORFdJRFRILCBJTlRNRU1fQkFORFdJRFRIfTsKLQotREVGSU5FX1NQSU5MT0NLKGFyYml0ZXJfbG9jayk7Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdAotY3Jpc3YzMl9hcmJpdGVyX2lycShpbnQgaXJxLCB2b2lkKiBkZXZfaWQsIHN0cnVjdCBwdF9yZWdzKiByZWdzKTsKLQotc3RhdGljIHZvaWQgY3Jpc3YzMl9hcmJpdGVyX2NvbmZpZyhpbnQgcmVnaW9uKQotewotCWludCBzbG90OwotCWludCBjbGllbnQ7Ci0JaW50IGludGVydmFsID0gMDsKLQlpbnQgdmFsW05CUl9PRl9TTE9UU107Ci0KLQlmb3IgKHNsb3QgPSAwOyBzbG90IDwgTkJSX09GX1NMT1RTOyBzbG90KyspCi0JICAgIHZhbFtzbG90XSA9IE5CUl9PRl9DTElFTlRTICsgMTsKLQotCWZvciAoY2xpZW50ID0gMDsgY2xpZW50IDwgTkJSX09GX0NMSUVOVFM7IGNsaWVudCsrKQotCXsKLQkgICAgaW50IHBvczsKLQkgICAgaWYgKCFyZXF1ZXN0ZWRfc2xvdHNbcmVnaW9uXVtjbGllbnRdKQotCSAgICAgICBjb250aW51ZTsKLQkgICAgaW50ZXJ2YWwgPSBOQlJfT0ZfU0xPVFMgLyByZXF1ZXN0ZWRfc2xvdHNbcmVnaW9uXVtjbGllbnRdOwotCSAgICBwb3MgPSAwOwotCSAgICB3aGlsZSAocG9zIDwgTkJSX09GX1NMT1RTKQotCSAgICB7Ci0JCWlmICh2YWxbcG9zXSAhPSBOQlJfT0ZfQ0xJRU5UUyArIDEpCi0JCSAgIHBvcysrOwotCQllbHNlCi0JCXsKLQkJCXZhbFtwb3NdID0gY2xpZW50OwotCQkJcG9zICs9IGludGVydmFsOwotCQl9Ci0JICAgIH0KLQl9Ci0KLQljbGllbnQgPSAwOwotCWZvciAoc2xvdCA9IDA7IHNsb3QgPCBOQlJfT0ZfU0xPVFM7IHNsb3QrKykKLQl7Ci0JCWlmICh2YWxbc2xvdF0gPT0gTkJSX09GX0NMSUVOVFMgKyAxKQotCQl7Ci0JCQlpbnQgZmlyc3QgPSBjbGllbnQ7Ci0JCQl3aGlsZSghYWN0aXZlX2NsaWVudHNbcmVnaW9uXVtjbGllbnRdKSB7Ci0JCQkJY2xpZW50ID0gKGNsaWVudCArIDEpICUgTkJSX09GX0NMSUVOVFM7Ci0JCQkJaWYgKGNsaWVudCA9PSBmaXJzdCkKLQkJCQkgICBicmVhazsKLQkJCX0KLQkJCXZhbFtzbG90XSA9IGNsaWVudDsKLQkJCWNsaWVudCA9IChjbGllbnQgKyAxKSAlIE5CUl9PRl9DTElFTlRTOwotCQl9Ci0JCWlmIChyZWdpb24gPT0gRVhUX1JFR0lPTikKLQkJICAgUkVHX1dSX0lOVF9WRUNUKG1hcmIsIHJlZ2lfbWFyYiwgcndfZXh0X3Nsb3RzLCBzbG90LCB2YWxbc2xvdF0pOwotCQllbHNlIGlmIChyZWdpb24gPT0gSU5UX1JFR0lPTikKLQkJICAgUkVHX1dSX0lOVF9WRUNUKG1hcmIsIHJlZ2lfbWFyYiwgcndfaW50X3Nsb3RzLCBzbG90LCB2YWxbc2xvdF0pOwotCX0KLX0KLQotZXh0ZXJuIGNoYXIgX3N0ZXh0LCBfZXRleHQ7Ci0KLXN0YXRpYyB2b2lkIGNyaXN2MzJfYXJiaXRlcl9pbml0KHZvaWQpCi17Ci0Jc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7Ci0KLQlpZiAoaW5pdGlhbGl6ZWQpCi0JCXJldHVybjsKLQotCWluaXRpYWxpemVkID0gMTsKLQotCS8qIENQVSBjYWNoZXMgYXJlIGFjdGl2ZS4gKi8KLQlhY3RpdmVfY2xpZW50c1tFWFRfUkVHSU9OXVsxMF0gPSBhY3RpdmVfY2xpZW50c1tFWFRfUkVHSU9OXVsxMV0gPSAxOwotICAgICAgICBjcmlzdjMyX2FyYml0ZXJfY29uZmlnKEVYVF9SRUdJT04pOwotICAgICAgICBjcmlzdjMyX2FyYml0ZXJfY29uZmlnKElOVF9SRUdJT04pOwotCi0JaWYgKHJlcXVlc3RfaXJxKE1FTUFSQl9JTlRSX1ZFQ1QsIGNyaXN2MzJfYXJiaXRlcl9pcnEsIElSUUZfRElTQUJMRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAiYXJiaXRlciIsIE5VTEwpKQotCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IGFsbG9jYXRlIGFyYml0ZXIgSVJRXG4iKTsKLQotI2lmbmRlZiBDT05GSUdfRVRSQVhfS0dEQgotICAgICAgICAvKiBHbG9iYWwgd2F0Y2ggZm9yIHdyaXRlcyB0byBrZXJuZWwgdGV4dCBzZWdtZW50LiAqLwotICAgICAgICBjcmlzdjMyX2FyYml0ZXJfd2F0Y2godmlydF90b19waHlzKCZfc3RleHQpLCAmX2V0ZXh0IC0gJl9zdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyYml0ZXJfYWxsX2NsaWVudHMsIGFyYml0ZXJfYWxsX3dyaXRlLCBOVUxMKTsKLSNlbmRpZgotfQotCi0KLQotaW50IGNyaXN2MzJfYXJiaXRlcl9hbGxvY2F0ZV9iYW5kd2lkdGgoaW50IGNsaWVudCwgaW50IHJlZ2lvbiwKLQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBiYW5kd2lkdGgpCi17Ci0JaW50IGk7Ci0JaW50IHRvdGFsX2Fzc2lnbmVkID0gMDsKLQlpbnQgdG90YWxfY2xpZW50cyA9IDA7Ci0JaW50IHJlcTsKLQotCWNyaXN2MzJfYXJiaXRlcl9pbml0KCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTkJSX09GX0NMSUVOVFM7IGkrKykKLQl7Ci0JCXRvdGFsX2Fzc2lnbmVkICs9IHJlcXVlc3RlZF9zbG90c1tyZWdpb25dW2ldOwotCQl0b3RhbF9jbGllbnRzICs9IGFjdGl2ZV9jbGllbnRzW3JlZ2lvbl1baV07Ci0JfQotCXJlcSA9IE5CUl9PRl9TTE9UUyAvIChtYXhfYmFuZHdpZHRoW3JlZ2lvbl0gLyBiYW5kd2lkdGgpOwotCi0JaWYgKHRvdGFsX2Fzc2lnbmVkICsgdG90YWxfY2xpZW50cyArIHJlcSArIDEgPiBOQlJfT0ZfU0xPVFMpCi0JICAgcmV0dXJuIC1FTk9NRU07Ci0KLQlhY3RpdmVfY2xpZW50c1tyZWdpb25dW2NsaWVudF0gPSAxOwotCXJlcXVlc3RlZF9zbG90c1tyZWdpb25dW2NsaWVudF0gPSByZXE7Ci0JY3Jpc3YzMl9hcmJpdGVyX2NvbmZpZyhyZWdpb24pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBjcmlzdjMyX2FyYml0ZXJfd2F0Y2godW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNsaWVudHMsIHVuc2lnbmVkIGxvbmcgYWNjZXNzZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoX2NhbGxiYWNrKiBjYikKLXsKLQlpbnQgaTsKLQotCWNyaXN2MzJfYXJiaXRlcl9pbml0KCk7Ci0KLQlpZiAoc3RhcnQgPiAweDgwMDAwMDAwKSB7Ci0JCXByaW50aygiQXJiaXRlcjogJWxYIGRvZXNuJ3QgbG9vayBsaWtlIGEgcGh5c2ljYWwgYWRkcmVzcyIsIHN0YXJ0KTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0Jc3Bpbl9sb2NrKCZhcmJpdGVyX2xvY2spOwotCi0JZm9yIChpID0gMDsgaSA8IE5VTUJFUl9PRl9CUDsgaSsrKSB7Ci0JCWlmICghd2F0Y2hlc1tpXS51c2VkKSB7Ci0JCQlyZWdfbWFyYl9yd19pbnRyX21hc2sgaW50cl9tYXNrID0gUkVHX1JEKG1hcmIsIHJlZ2lfbWFyYiwgcndfaW50cl9tYXNrKTsKLQotCQkJd2F0Y2hlc1tpXS51c2VkID0gMTsKLQkJCXdhdGNoZXNbaV0uc3RhcnQgPSBzdGFydDsKLQkJCXdhdGNoZXNbaV0uZW5kID0gc3RhcnQgKyBzaXplOwotCQkJd2F0Y2hlc1tpXS5jYiA9IGNiOwotCi0JCQlSRUdfV1JfSU5UKG1hcmJfYnAsIHdhdGNoZXNbaV0uaW5zdGFuY2UsIHJ3X2ZpcnN0X2FkZHIsIHdhdGNoZXNbaV0uc3RhcnQpOwotCQkJUkVHX1dSX0lOVChtYXJiX2JwLCB3YXRjaGVzW2ldLmluc3RhbmNlLCByd19sYXN0X2FkZHIsIHdhdGNoZXNbaV0uZW5kKTsKLQkJCVJFR19XUl9JTlQobWFyYl9icCwgd2F0Y2hlc1tpXS5pbnN0YW5jZSwgcndfb3AsIGFjY2Vzc2VzKTsKLQkJCVJFR19XUl9JTlQobWFyYl9icCwgd2F0Y2hlc1tpXS5pbnN0YW5jZSwgcndfY2xpZW50cywgY2xpZW50cyk7Ci0KLQkJCWlmIChpID09IDApCi0JCQkJaW50cl9tYXNrLmJwMCA9IHJlZ2tfbWFyYl95ZXM7Ci0JCQllbHNlIGlmIChpID09IDEpCi0JCQkJaW50cl9tYXNrLmJwMSA9IHJlZ2tfbWFyYl95ZXM7Ci0JCQllbHNlIGlmIChpID09IDIpCi0JCQkJaW50cl9tYXNrLmJwMiA9IHJlZ2tfbWFyYl95ZXM7Ci0JCQllbHNlIGlmIChpID09IDMpCi0JCQkJaW50cl9tYXNrLmJwMyA9IHJlZ2tfbWFyYl95ZXM7Ci0KLQkJCVJFR19XUihtYXJiLCByZWdpX21hcmIsIHJ3X2ludHJfbWFzaywgaW50cl9tYXNrKTsKLQkJCXNwaW5fdW5sb2NrKCZhcmJpdGVyX2xvY2spOwotCi0JCQlyZXR1cm4gaTsKLQkJfQotCX0KLQlzcGluX3VubG9jaygmYXJiaXRlcl9sb2NrKTsKLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotaW50IGNyaXN2MzJfYXJiaXRlcl91bndhdGNoKGludCBpZCkKLXsKLQlyZWdfbWFyYl9yd19pbnRyX21hc2sgaW50cl9tYXNrID0gUkVHX1JEKG1hcmIsIHJlZ2lfbWFyYiwgcndfaW50cl9tYXNrKTsKLQotCWNyaXN2MzJfYXJiaXRlcl9pbml0KCk7Ci0KLQlzcGluX2xvY2soJmFyYml0ZXJfbG9jayk7Ci0KLQlpZiAoKGlkIDwgMCkgfHwgKGlkID49IE5VTUJFUl9PRl9CUCkgfHwgKCF3YXRjaGVzW2lkXS51c2VkKSkgewotCQlzcGluX3VubG9jaygmYXJiaXRlcl9sb2NrKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbWVtc2V0KCZ3YXRjaGVzW2lkXSwgMCwgc2l6ZW9mKHN0cnVjdCBjcmlzdjMyX3dhdGNoX2VudHJ5KSk7Ci0KLQlpZiAoaWQgPT0gMCkKLQkJaW50cl9tYXNrLmJwMCA9IHJlZ2tfbWFyYl9ubzsKLQllbHNlIGlmIChpZCA9PSAxKQotCQlpbnRyX21hc2suYnAyID0gcmVna19tYXJiX25vOwotCWVsc2UgaWYgKGlkID09IDIpCi0JCWludHJfbWFzay5icDIgPSByZWdrX21hcmJfbm87Ci0JZWxzZSBpZiAoaWQgPT0gMykKLQkJaW50cl9tYXNrLmJwMyA9IHJlZ2tfbWFyYl9ubzsKLQotCVJFR19XUihtYXJiLCByZWdpX21hcmIsIHJ3X2ludHJfbWFzaywgaW50cl9tYXNrKTsKLQotCXNwaW5fdW5sb2NrKCZhcmJpdGVyX2xvY2spOwotCXJldHVybiAwOwotfQotCi1leHRlcm4gdm9pZCBzaG93X3JlZ2lzdGVycyhzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdAotY3Jpc3YzMl9hcmJpdGVyX2lycShpbnQgaXJxLCB2b2lkKiBkZXZfaWQsIHN0cnVjdCBwdF9yZWdzKiByZWdzKQotewotCXJlZ19tYXJiX3JfbWFza2VkX2ludHIgbWFza2VkX2ludHIgPSBSRUdfUkQobWFyYiwgcmVnaV9tYXJiLCByX21hc2tlZF9pbnRyKTsKLQlyZWdfbWFyYl9icF9yX2Jya19jbGllbnRzIHJfY2xpZW50czsKLQlyZWdfbWFyYl9icF9yX2Jya19hZGRyIHJfYWRkcjsKLQlyZWdfbWFyYl9icF9yX2Jya19vcCByX29wOwotCXJlZ19tYXJiX2JwX3JfYnJrX2ZpcnN0X2NsaWVudCByX2ZpcnN0OwotCXJlZ19tYXJiX2JwX3JfYnJrX3NpemUgcl9zaXplOwotCXJlZ19tYXJiX2JwX3J3X2FjayBhY2sgPSB7MH07Ci0JcmVnX21hcmJfcndfYWNrX2ludHIgYWNrX2ludHIgPSB7LmJwMD0xLC5icDE9MSwuYnAyPTEsLmJwMz0xfTsKLQlzdHJ1Y3QgY3Jpc3YzMl93YXRjaF9lbnRyeSogd2F0Y2g7Ci0KLQlpZiAobWFza2VkX2ludHIuYnAwKSB7Ci0JCXdhdGNoID0gJndhdGNoZXNbMF07Ci0JCWFja19pbnRyLmJwMCA9IHJlZ2tfbWFyYl95ZXM7Ci0JfSBlbHNlIGlmIChtYXNrZWRfaW50ci5icDEpIHsKLQkJd2F0Y2ggPSAmd2F0Y2hlc1sxXTsKLQkJYWNrX2ludHIuYnAxID0gcmVna19tYXJiX3llczsKLQl9IGVsc2UgaWYgKG1hc2tlZF9pbnRyLmJwMikgewotCQl3YXRjaCA9ICZ3YXRjaGVzWzJdOwotCQlhY2tfaW50ci5icDIgPSByZWdrX21hcmJfeWVzOwotCX0gZWxzZSBpZiAobWFza2VkX2ludHIuYnAzKSB7Ci0JCXdhdGNoID0gJndhdGNoZXNbM107Ci0JCWFja19pbnRyLmJwMyA9IHJlZ2tfbWFyYl95ZXM7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIElSUV9OT05FOwotCX0KLQotCS8qIFJldHJpZXZlIGFsbCB1c2VmdWwgaW5mb3JtYXRpb24gYW5kIHByaW50IGl0LiAqLwotCXJfY2xpZW50cyA9IFJFR19SRChtYXJiX2JwLCB3YXRjaC0+aW5zdGFuY2UsIHJfYnJrX2NsaWVudHMpOwotCXJfYWRkciA9IFJFR19SRChtYXJiX2JwLCB3YXRjaC0+aW5zdGFuY2UsIHJfYnJrX2FkZHIpOwotCXJfb3AgPSBSRUdfUkQobWFyYl9icCwgd2F0Y2gtPmluc3RhbmNlLCByX2Jya19vcCk7Ci0Jcl9maXJzdCA9IFJFR19SRChtYXJiX2JwLCB3YXRjaC0+aW5zdGFuY2UsIHJfYnJrX2ZpcnN0X2NsaWVudCk7Ci0Jcl9zaXplID0gUkVHX1JEKG1hcmJfYnAsIHdhdGNoLT5pbnN0YW5jZSwgcl9icmtfc2l6ZSk7Ci0KLQlwcmludGsoIkFyYml0ZXIgSVJRXG4iKTsKLQlwcmludGsoIkNsaWVudHMgJVggYWRkciAlWCBvcCAlWCBmaXJzdCAlWCBzaXplICVYXG4iLAotCSAgICAgICBSRUdfVFlQRV9DT05WKGludCwgcmVnX21hcmJfYnBfcl9icmtfY2xpZW50cywgcl9jbGllbnRzKSwKLQkgICAgICAgUkVHX1RZUEVfQ09OVihpbnQsIHJlZ19tYXJiX2JwX3JfYnJrX2FkZHIsIHJfYWRkciksCi0JICAgICAgIFJFR19UWVBFX0NPTlYoaW50LCByZWdfbWFyYl9icF9yX2Jya19vcCwgcl9vcCksCi0JICAgICAgIFJFR19UWVBFX0NPTlYoaW50LCByZWdfbWFyYl9icF9yX2Jya19maXJzdF9jbGllbnQsIHJfZmlyc3QpLAotCSAgICAgICBSRUdfVFlQRV9DT05WKGludCwgcmVnX21hcmJfYnBfcl9icmtfc2l6ZSwgcl9zaXplKSk7Ci0KLQlSRUdfV1IobWFyYl9icCwgd2F0Y2gtPmluc3RhbmNlLCByd19hY2ssIGFjayk7Ci0JUkVHX1dSKG1hcmIsIHJlZ2lfbWFyYiwgcndfYWNrX2ludHIsIGFja19pbnRyKTsKLQotCXByaW50aygiSVJRIG9jY3VyZWQgYXQgJWxYXG4iLCByZWdzLT5lcnApOwotCi0JaWYgKHdhdGNoLT5jYikKLQkJd2F0Y2gtPmNiKCk7Ci0KLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvY3Jpc2tzeW1zLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL2NyaXNrc3ltcy5jCmluZGV4IGU1MTNkYTcuLjc3ZDAyYzEgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvY3Jpc2tzeW1zLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9jcmlza3N5bXMuYwpAQCAtMiw3ICsyLDggQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9kbWEuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9pbnRtZW0uaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9waW5tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tYWNoL3Bpbm11eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2lvLmg+CiAKIC8qIEZ1bmN0aW9ucyBmb3IgYWxsb2NhdGluZyBETUEgY2hhbm5lbHMgKi8KIEVYUE9SVF9TWU1CT0woY3Jpc3YzMl9yZXF1ZXN0X2RtYSk7CkBAIC0xNiw3ICsxNywxMSBAQAogCiAvKiBGdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHBpbm11eCAqLwogRVhQT1JUX1NZTUJPTChjcmlzdjMyX3Bpbm11eF9hbGxvYyk7CitFWFBPUlRfU1lNQk9MKGNyaXN2MzJfcGlubXV4X2FsbG9jX2ZpeGVkKTsKIEVYUE9SVF9TWU1CT0woY3Jpc3YzMl9waW5tdXhfZGVhbGxvYyk7CitFWFBPUlRfU1lNQk9MKGNyaXN2MzJfcGlubXV4X2RlYWxsb2NfZml4ZWQpOworRVhQT1JUX1NZTUJPTChjcmlzdjMyX2lvX2dldF9uYW1lKTsKK0VYUE9SVF9TWU1CT0woY3Jpc3YzMl9pb19nZXQpOwogCiAvKiBGdW5jdGlvbnMgbWFza2luZy91bm1hc2tpbmcgaW50ZXJydXB0cyAqLwogRVhQT1JUX1NZTUJPTChtYXNrX2lycSk7CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL2RlYnVncG9ydC5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9kZWJ1Z3BvcnQuYwppbmRleCBkMTI3MmFkLi4xNWFmNGMyIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL2RlYnVncG9ydC5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvZGVidWdwb3J0LmMKQEAgLTQsMTcgKzQsMTIgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3Mvc2VyX2RlZnMuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvZG1hX2RlZnMuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9waW5tdXguaD4KLQotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvaW50cl92ZWN0X2RlZnMuaD4KKyNpbmNsdWRlIDxod3JlZ3MvcmVnX3Jkd3IuaD4KKyNpbmNsdWRlIDxod3JlZ3MvcmVnX21hcC5oPgorI2luY2x1ZGUgPGh3cmVncy9zZXJfZGVmcy5oPgorI2luY2x1ZGUgPGh3cmVncy9kbWFfZGVmcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21hY2gvcGlubXV4Lmg+CiAKIHN0cnVjdCBkYmdfcG9ydAogewpAQCAtNTksNDUgKzU0LDUwIEBACiAgICAgMTE1MjAwLAogICAgICdOJywKICAgICA4Ci0gIH0KKyAgfSwKKyNpZiBDT05GSUdfRVRSQVhfU0VSSUFMX1BPUlRTID09IDUKKyAgeworICAgIDQsCisgICAgcmVnaV9zZXI0LAorICAgIDAsCisgICAgMTE1MjAwLAorICAgICdOJywKKyAgICA4CisgIH0sCisjZW5kaWYKIH07CiBzdGF0aWMgc3RydWN0IGRiZ19wb3J0ICpwb3J0ID0KICNpZiBkZWZpbmVkKENPTkZJR19FVFJBWF9ERUJVR19QT1JUMCkKLSZwb3J0c1swXTsKKwkmcG9ydHNbMF07CiAjZWxpZiBkZWZpbmVkKENPTkZJR19FVFJBWF9ERUJVR19QT1JUMSkKLSZwb3J0c1sxXTsKKwkmcG9ydHNbMV07CiAjZWxpZiBkZWZpbmVkKENPTkZJR19FVFJBWF9ERUJVR19QT1JUMikKLSZwb3J0c1syXTsKKwkmcG9ydHNbMl07CiAjZWxpZiBkZWZpbmVkKENPTkZJR19FVFJBWF9ERUJVR19QT1JUMykKLSZwb3J0c1szXTsKKwkmcG9ydHNbM107CisjZWxpZiBkZWZpbmVkKENPTkZJR19FVFJBWF9ERUJVR19QT1JUNCkKKwkmcG9ydHNbNF07CiAjZWxzZQotTlVMTDsKKwlOVUxMOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfRVRSQVhfS0dEQgogc3RhdGljIHN0cnVjdCBkYmdfcG9ydCAqa2dkYl9wb3J0ID0KICNpZiBkZWZpbmVkKENPTkZJR19FVFJBWF9LR0RCX1BPUlQwKQotJnBvcnRzWzBdOworCSZwb3J0c1swXTsKICNlbGlmIGRlZmluZWQoQ09ORklHX0VUUkFYX0tHREJfUE9SVDEpCi0mcG9ydHNbMV07CisJJnBvcnRzWzFdOwogI2VsaWYgZGVmaW5lZChDT05GSUdfRVRSQVhfS0dEQl9QT1JUMikKLSZwb3J0c1syXTsKKwkmcG9ydHNbMl07CiAjZWxpZiBkZWZpbmVkKENPTkZJR19FVFJBWF9LR0RCX1BPUlQzKQotJnBvcnRzWzNdOworCSZwb3J0c1szXTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0VUUkFYX0tHREJfUE9SVDQpCisJJnBvcnRzWzRdOwogI2Vsc2UKLU5VTEw7CisJTlVMTDsKICNlbmRpZgogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfRVRSQVhGU19TSU0KLWV4dGVybiB2b2lkIHByaW50X3N0ciggY29uc3QgY2hhciAqc3RyICk7Ci1zdGF0aWMgY2hhciBidWZmZXJbMTAyNF07Ci1zdGF0aWMgY2hhciBtc2dbXSA9ICJEZWJ1ZzogIjsKLXN0YXRpYyBpbnQgYnVmZmVyX3BvcyA9IHNpemVvZihtc2cpIC0gMTsKLSNlbmRpZgotCi1leHRlcm4gc3RydWN0IHR0eV9kcml2ZXIgKnNlcmlhbF9kcml2ZXI7Ci0KIHN0YXRpYyB2b2lkCiBzdGFydF9wb3J0KHN0cnVjdCBkYmdfcG9ydCogcCkKIHsKQEAgLTExNCw2ICsxMTQsMTAgQEAKIAkJY3Jpc3YzMl9waW5tdXhfYWxsb2NfZml4ZWQocGlubXV4X3NlcjIpOwogCWVsc2UgaWYgKHAtPm5iciA9PSAzKQogCQljcmlzdjMyX3Bpbm11eF9hbGxvY19maXhlZChwaW5tdXhfc2VyMyk7CisjaWYgQ09ORklHX0VUUkFYX1NFUklBTF9QT1JUUyA9PSA1CisJZWxzZSBpZiAocC0+bmJyID09IDQpCisJCWNyaXN2MzJfcGlubXV4X2FsbG9jX2ZpeGVkKHBpbm11eF9zZXI0KTsKKyNlbmRpZgogCiAJLyogU2V0IHVwIHNlcmlhbCBwb3J0IHJlZ2lzdGVycyAqLwogCXJlZ19zZXJfcndfdHJfY3RybCB0cl9jdHJsID0gezB9OwpAQCAtMTU2LDEyNCArMTYwLDIxIEBACiAJUkVHX1dSIChzZXIsIHAtPmluc3RhbmNlLCByd19yZWNfY3RybCwgcmVjX2N0cmwpOwogfQogCi0vKiBObyBkZWJ1ZyAqLwotI2lmZGVmIENPTkZJR19FVFJBWF9ERUJVR19QT1JUX05VTEwKLQotc3RhdGljIHZvaWQKLWNvbnNvbGVfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvLCBjb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBsZW4pCi17Ci0JcmV0dXJuOwotfQotCi0vKiBUYXJnZXQgZGVidWcgKi8KLSNlbGlmICFkZWZpbmVkKENPTkZJR19FVFJBWEZTX1NJTSkKLQotc3RhdGljIHZvaWQKLWNvbnNvbGVfd3JpdGVfZGlyZWN0KHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQotewotCWludCBpOwotCXJlZ19zZXJfcl9zdGF0X2RpbiBzdGF0OwotCXJlZ19zZXJfcndfdHJfZG1hX2VuIHRyX2RtYV9lbiwgb2xkOwotCi0JLyogU3dpdGNoIHRvIG1hbnVhbCBtb2RlICovCi0JdHJfZG1hX2VuID0gb2xkID0gUkVHX1JEIChzZXIsIHBvcnQtPmluc3RhbmNlLCByd190cl9kbWFfZW4pOwotCWlmICh0cl9kbWFfZW4uZW4gPT0gcmVna19zZXJfeWVzKSB7Ci0JCXRyX2RtYV9lbi5lbiA9IHJlZ2tfc2VyX25vOwotCQlSRUdfV1Ioc2VyLCBwb3J0LT5pbnN0YW5jZSwgcndfdHJfZG1hX2VuLCB0cl9kbWFfZW4pOwotCX0KLQotCS8qIFNlbmQgZGF0YSAqLwotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkvKiBMRiAtPiBDUkxGICovCi0JCWlmIChidWZbaV0gPT0gJ1xuJykgewotCQkJZG8gewotCQkJCXN0YXQgPSBSRUdfUkQgKHNlciwgcG9ydC0+aW5zdGFuY2UsIHJfc3RhdF9kaW4pOwotCQkJfSB3aGlsZSAoIXN0YXQudHJfcmR5KTsKLQkJCVJFR19XUl9JTlQgKHNlciwgcG9ydC0+aW5zdGFuY2UsIHJ3X2RvdXQsICdccicpOwotCQl9Ci0JCS8qIFdhaXQgdW50aWwgdHJhbnNtaXR0ZXIgaXMgcmVhZHkgYW5kIHNlbmQuKi8KLQkJZG8gewotCQkJc3RhdCA9IFJFR19SRCAoc2VyLCBwb3J0LT5pbnN0YW5jZSwgcl9zdGF0X2Rpbik7Ci0JCX0gd2hpbGUgKCFzdGF0LnRyX3JkeSk7Ci0JCVJFR19XUl9JTlQgKHNlciwgcG9ydC0+aW5zdGFuY2UsIHJ3X2RvdXQsIGJ1ZltpXSk7Ci0JfQotCi0JLyogUmVzdG9yZSBtb2RlICovCi0JaWYgKHRyX2RtYV9lbi5lbiAhPSBvbGQuZW4pCi0JCVJFR19XUihzZXIsIHBvcnQtPmluc3RhbmNlLCByd190cl9kbWFfZW4sIG9sZCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQotewotCWlmICghcG9ydCkKLQkJcmV0dXJuOwotICAgICAgICBjb25zb2xlX3dyaXRlX2RpcmVjdChjbywgYnVmLCBsZW4pOwotfQotCi0KLQotI2Vsc2UKLQotLyogVkNTIGRlYnVnICovCi0KLXN0YXRpYyB2b2lkCi1jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQotewotCWNoYXIqIHBvczsKLQlwb3MgPSBtZW1jaHIoYnVmLCAnXG4nLCBsZW4pOwotCWlmIChwb3MpIHsKLQkJaW50IGwgPSArK3BvcyAtIGJ1ZjsKLQkJbWVtY3B5KGJ1ZmZlciArIGJ1ZmZlcl9wb3MsIGJ1ZiwgbCk7Ci0JCW1lbWNweShidWZmZXIsIG1zZywgc2l6ZW9mKG1zZykgLSAxKTsKLQkJYnVmZmVyW2J1ZmZlcl9wb3MgKyBsXSA9ICdcMCc7Ci0JCXByaW50X3N0cihidWZmZXIpOwotCQlidWZmZXJfcG9zID0gc2l6ZW9mKG1zZykgLSAxOwotCQlpZiAocG9zIC0gYnVmICE9IGxlbikgewotCQkJbWVtY3B5KGJ1ZmZlciArIGJ1ZmZlcl9wb3MsIHBvcywgbGVuIC0gbCk7Ci0JCQlidWZmZXJfcG9zICs9IGxlbiAtIGw7Ci0JCX0KLQl9IGVsc2UgewotCQltZW1jcHkoYnVmZmVyICsgYnVmZmVyX3BvcywgYnVmLCBsZW4pOwotCQlidWZmZXJfcG9zICs9IGxlbjsKLQl9Ci19Ci0KLSNlbmRpZgotCi1pbnQgcmF3X3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQlzdGF0aWMgY2hhciBidWZbMTAyNF07Ci0JaW50IHByaW50ZWRfbGVuOwotCXZhX2xpc3QgYXJnczsKLQl2YV9zdGFydChhcmdzLCBmbXQpOwotCXByaW50ZWRfbGVuID0gdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXJncyk7Ci0JdmFfZW5kKGFyZ3MpOwotCWNvbnNvbGVfd3JpdGUoTlVMTCwgYnVmLCBzdHJsZW4oYnVmKSk7Ci0JcmV0dXJuIHByaW50ZWRfbGVuOwotfQotCi12b2lkCi1zdHVwaWRfZGVidWcoY2hhciogYnVmKQotewotICBjb25zb2xlX3dyaXRlKE5VTEwsIGJ1Ziwgc3RybGVuKGJ1ZikpOwotfQotCiAjaWZkZWYgQ09ORklHX0VUUkFYX0tHREIKIC8qIFVzZSBwb2xsaW5nIHRvIGdldCBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSB0aGUga2VybmVsIGRlYnVnIHBvcnQgKi8KIGludAogZ2V0RGVidWdDaGFyKHZvaWQpCiB7Ci0JcmVnX3Nlcl9yc19zdGF0dXNfZGF0YSBzdGF0OworCXJlZ19zZXJfcnNfc3RhdF9kaW4gc3RhdDsKIAlyZWdfc2VyX3J3X2Fja19pbnRyIGFja19pbnRyID0geyAwIH07CiAKIAlkbyB7Ci0JCXN0YXQgPSBSRUdfUkQoc2VyLCBrZ2RiX2luc3RhbmNlLCByc19zdGF0dXNfZGF0YSk7Ci0JfSB3aGlsZSAoIXN0YXQuZGF0YV9hdmFpbCk7CisJCXN0YXQgPSBSRUdfUkQoc2VyLCBrZ2RiX3BvcnQtPmluc3RhbmNlLCByc19zdGF0X2Rpbik7CisJfSB3aGlsZSAoIXN0YXQuZGF2KTsKIAogCS8qIEFjayB0aGUgZGF0YV9hdmFpbCBpbnRlcnJ1cHQuICovCi0JYWNrX2ludHIuZGF0YV9hdmFpbCA9IDE7Ci0JUkVHX1dSKHNlciwga2dkYl9pbnN0YW5jZSwgcndfYWNrX2ludHIsIGFja19pbnRyKTsKKwlhY2tfaW50ci5kYXYgPSAxOworCVJFR19XUihzZXIsIGtnZGJfcG9ydC0+aW5zdGFuY2UsIHJ3X2Fja19pbnRyLCBhY2tfaW50cik7CiAKIAlyZXR1cm4gc3RhdC5kYXRhOwogfQpAQCAtMjgyLDE3MyArMTgzLDE4IEBACiB2b2lkCiBwdXREZWJ1Z0NoYXIoaW50IHZhbCkKIHsKLQlyZWdfc2VyX3Jfc3RhdHVzX2RhdGEgc3RhdDsKKwlyZWdfc2VyX3Jfc3RhdF9kaW4gc3RhdDsKIAlkbyB7Ci0JCXN0YXQgPSBSRUdfUkQgKHNlciwga2dkYl9pbnN0YW5jZSwgcl9zdGF0dXNfZGF0YSk7Ci0JfSB3aGlsZSAoIXN0YXQudHJfcmVhZHkpOwotCVJFR19XUiAoc2VyLCBrZ2RiX2luc3RhbmNlLCByd19kYXRhX291dCwgUkVHX1RZUEVfQ09OVihyZWdfc2VyX3J3X2RhdGFfb3V0LCBpbnQsIHZhbCkpOworCQlzdGF0ID0gUkVHX1JEKHNlciwga2dkYl9wb3J0LT5pbnN0YW5jZSwgcl9zdGF0X2Rpbik7CisJfSB3aGlsZSAoIXN0YXQudHJfcmR5KTsKKwlSRUdfV1JfSU5UKHNlciwga2dkYl9wb3J0LT5pbnN0YW5jZSwgcndfZG91dCwgdmFsKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfRVRSQVhfS0dEQiAqLwogCi1zdGF0aWMgaW50IF9faW5pdAotY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCi17Ci0JY2hhciogczsKLQotCWlmIChvcHRpb25zKSB7Ci0JCXBvcnQgPSAmcG9ydHNbY28tPmluZGV4XTsKLQkJcG9ydC0+YmF1ZHJhdGUgPSAxMTUyMDA7Ci0JCXBvcnQtPnBhcml0eSA9ICdOJzsKLQkJcG9ydC0+Yml0cyA9IDg7Ci0JCXBvcnQtPmJhdWRyYXRlID0gc2ltcGxlX3N0cnRvdWwob3B0aW9ucywgTlVMTCwgMTApOwotCQlzID0gb3B0aW9uczsKLQkJd2hpbGUoKnMgPj0gJzAnICYmICpzIDw9ICc5JykKLQkJCXMrKzsKLQkJaWYgKCpzKSBwb3J0LT5wYXJpdHkgPSAqcysrOwotCQlpZiAoKnMpIHBvcnQtPmJpdHMgICA9ICpzKysgLSAnMCc7Ci0JCXBvcnQtPnN0YXJ0ZWQgPSAwOwotCQlzdGFydF9wb3J0KHBvcnQpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogVGhpcyBpcyBhIGR1bW15IHNlcmlhbCBkZXZpY2UgdGhhdCB0aHJvd3MgYXdheSBhbnl0aGluZyB3cml0dGVuIHRvIGl0LgotICogVGhpcyBpcyB1c2VkIHdoZW4gbm8gZGVidWcgb3V0cHV0IGlzIHdhbnRlZC4KLSAqLwotc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyIGR1bW15X2RyaXZlcjsKLQotc3RhdGljIGludCBkdW1teV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZHVtbXlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQotewotfQotCi1zdGF0aWMgaW50IGR1bW15X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKLXsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWR1bW15X3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlyZXR1cm4gODE5MjsKLX0KLQotdm9pZCBfX2luaXQKLWluaXRfZHVtbXlfY29uc29sZSh2b2lkKQotewotCW1lbXNldCgmZHVtbXlfZHJpdmVyLCAwLCBzaXplb2Yoc3RydWN0IHR0eV9kcml2ZXIpKTsKLQlkdW1teV9kcml2ZXIuZHJpdmVyX25hbWUgPSAic2VyaWFsIjsKLQlkdW1teV9kcml2ZXIubmFtZSA9ICJ0dHlTIjsKLQlkdW1teV9kcml2ZXIubWFqb3IgPSBUVFlfTUFKT1I7Ci0JZHVtbXlfZHJpdmVyLm1pbm9yX3N0YXJ0ID0gNjg7Ci0JZHVtbXlfZHJpdmVyLm51bSA9IDE7ICAgICAgIC8qIGV0cmF4MTAwIGhhcyA0IHNlcmlhbCBwb3J0cyAqLwotCWR1bW15X2RyaXZlci50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKLQlkdW1teV9kcml2ZXIuc3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKLQlkdW1teV9kcml2ZXIuaW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOwotCWR1bW15X2RyaXZlci5pbml0X3Rlcm1pb3MuY19jZmxhZyA9Ci0JCUIxMTUyMDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOyAvKiBpcyBub3JtYWxseSBCOTYwMCBkZWZhdWx0Li4uICovCi0JZHVtbXlfZHJpdmVyLmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVyB8IFRUWV9EUklWRVJfRFlOQU1JQ19ERVY7Ci0KLQlkdW1teV9kcml2ZXIub3BlbiA9IGR1bW15X29wZW47Ci0JZHVtbXlfZHJpdmVyLmNsb3NlID0gZHVtbXlfY2xvc2U7Ci0JZHVtbXlfZHJpdmVyLndyaXRlID0gZHVtbXlfd3JpdGU7Ci0JZHVtbXlfZHJpdmVyLndyaXRlX3Jvb20gPSBkdW1teV93cml0ZV9yb29tOwotCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKCZkdW1teV9kcml2ZXIpKQotCQlwYW5pYygiQ291bGRuJ3QgcmVnaXN0ZXIgZHVtbXkgc2VyaWFsIGRyaXZlclxuIik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlcioKLWNyaXN2MzJfY29uc29sZV9kZXZpY2Uoc3RydWN0IGNvbnNvbGUqIGNvLCBpbnQgKmluZGV4KQotewotCWlmIChwb3J0KQotCQkqaW5kZXggPSBwb3J0LT5uYnI7Ci0gICAgICAgIHJldHVybiBwb3J0ID8gc2VyaWFsX2RyaXZlciA6ICZkdW1teV9kcml2ZXI7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY29uc29sZSBzZXJjb25zID0gewotCW5hbWUgOiAidHR5UyIsCi0Jd3JpdGU6IGNvbnNvbGVfd3JpdGUsCi0JcmVhZCA6IE5VTEwsCi0JZGV2aWNlIDogY3Jpc3YzMl9jb25zb2xlX2RldmljZSwKLQl1bmJsYW5rIDogTlVMTCwKLQlzZXR1cCA6IGNvbnNvbGVfc2V0dXAsCi0JZmxhZ3MgOiBDT05fUFJJTlRCVUZGRVIsCi0JaW5kZXggOiAtMSwKLQljZmxhZyA6IDAsCi0JbmV4dCA6IE5VTEwKLX07Ci1zdGF0aWMgc3RydWN0IGNvbnNvbGUgc2VyY29uczAgPSB7Ci0JbmFtZSA6ICJ0dHlTIiwKLQl3cml0ZTogY29uc29sZV93cml0ZSwKLQlyZWFkIDogTlVMTCwKLQlkZXZpY2UgOiBjcmlzdjMyX2NvbnNvbGVfZGV2aWNlLAotCXVuYmxhbmsgOiBOVUxMLAotCXNldHVwIDogY29uc29sZV9zZXR1cCwKLQlmbGFncyA6IENPTl9QUklOVEJVRkZFUiwKLQlpbmRleCA6IDAsCi0JY2ZsYWcgOiAwLAotCW5leHQgOiBOVUxMCi19OwotCi1zdGF0aWMgc3RydWN0IGNvbnNvbGUgc2VyY29uczEgPSB7Ci0JbmFtZSA6ICJ0dHlTIiwKLQl3cml0ZTogY29uc29sZV93cml0ZSwKLQlyZWFkIDogTlVMTCwKLQlkZXZpY2UgOiBjcmlzdjMyX2NvbnNvbGVfZGV2aWNlLAotCXVuYmxhbmsgOiBOVUxMLAotCXNldHVwIDogY29uc29sZV9zZXR1cCwKLQlmbGFncyA6IENPTl9QUklOVEJVRkZFUiwKLQlpbmRleCA6IDEsCi0JY2ZsYWcgOiAwLAotCW5leHQgOiBOVUxMCi19Owotc3RhdGljIHN0cnVjdCBjb25zb2xlIHNlcmNvbnMyID0gewotCW5hbWUgOiAidHR5UyIsCi0Jd3JpdGU6IGNvbnNvbGVfd3JpdGUsCi0JcmVhZCA6IE5VTEwsCi0JZGV2aWNlIDogY3Jpc3YzMl9jb25zb2xlX2RldmljZSwKLQl1bmJsYW5rIDogTlVMTCwKLQlzZXR1cCA6IGNvbnNvbGVfc2V0dXAsCi0JZmxhZ3MgOiBDT05fUFJJTlRCVUZGRVIsCi0JaW5kZXggOiAyLAotCWNmbGFnIDogMCwKLQluZXh0IDogTlVMTAotfTsKLXN0YXRpYyBzdHJ1Y3QgY29uc29sZSBzZXJjb25zMyA9IHsKLQluYW1lIDogInR0eVMiLAotCXdyaXRlOiBjb25zb2xlX3dyaXRlLAotCXJlYWQgOiBOVUxMLAotCWRldmljZSA6IGNyaXN2MzJfY29uc29sZV9kZXZpY2UsCi0JdW5ibGFuayA6IE5VTEwsCi0Jc2V0dXAgOiBjb25zb2xlX3NldHVwLAotCWZsYWdzIDogQ09OX1BSSU5UQlVGRkVSLAotCWluZGV4IDogMywKLQljZmxhZyA6IDAsCi0JbmV4dCA6IE5VTEwKLX07Ci0KIC8qIFJlZ2lzdGVyIGNvbnNvbGUgZm9yIHByaW50aydzLCBldGMuICovCiBpbnQgX19pbml0CiBpbml0X2V0cmF4X2RlYnVnKHZvaWQpCiB7Ci0gIAlzdGF0aWMgaW50IGZpcnN0ID0gMTsKLQotCWlmICghZmlyc3QpIHsKLQkJdW5yZWdpc3Rlcl9jb25zb2xlKCZzZXJjb25zKTsKLQkJcmVnaXN0ZXJfY29uc29sZSgmc2VyY29uczApOwotCQlyZWdpc3Rlcl9jb25zb2xlKCZzZXJjb25zMSk7Ci0JCXJlZ2lzdGVyX2NvbnNvbGUoJnNlcmNvbnMyKTsKLQkJcmVnaXN0ZXJfY29uc29sZSgmc2VyY29uczMpOwotCQlpbml0X2R1bW15X2NvbnNvbGUoKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWZpcnN0ID0gMDsKLSAgICAgICAgcmVnaXN0ZXJfY29uc29sZSgmc2VyY29ucyk7CiAgICAgICAgIHN0YXJ0X3BvcnQocG9ydCk7CiAKICNpZmRlZiBDT05GSUdfRVRSQVhfS0dEQgpAQCAtNDU2LDUgKzIwMiwzIEBACiAjZW5kaWYgLyogQ09ORklHX0VUUkFYX0tHREIgKi8KIAlyZXR1cm4gMDsKIH0KLQotX19pbml0Y2FsbChpbml0X2V0cmF4X2RlYnVnKTsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvZG1hLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL2RtYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzBlMTkxLi4wMDAwMDAwCi0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvZG1hLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyogV3JhcHBlciBmb3IgRE1BIGNoYW5uZWwgYWxsb2NhdG9yIHRoYXQgc3RhcnRzIGNsb2NrcyBldGMgKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9yZWdfbWFwLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL3JlZ19yZHdyLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL21hcmJfZGVmcy5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9jb25maWdfZGVmcy5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9zdHJtdXhfZGVmcy5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2FyYml0ZXIuaD4KLQotc3RhdGljIGNoYXIgdXNlZF9kbWFfY2hhbm5lbHNbTUFYX0RNQV9DSEFOTkVMU107Ci1zdGF0aWMgY29uc3QgY2hhciAqIHVzZWRfZG1hX2NoYW5uZWxzX3VzZXJzW01BWF9ETUFfQ0hBTk5FTFNdOwotCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRtYV9sb2NrKTsKLQotaW50IGNyaXN2MzJfcmVxdWVzdF9kbWEodW5zaWduZWQgaW50IGRtYW5yLCBjb25zdCBjaGFyICogZGV2aWNlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgb3B0aW9ucywgdW5zaWduZWQgaW50IGJhbmR3aWR0aCwKLQkJCWVudW0gZG1hX293bmVyIG93bmVyKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JcmVnX2NvbmZpZ19yd19jbGtfY3RybCBjbGtfY3RybDsKLQlyZWdfc3RybXV4X3J3X2NmZyBzdHJtdXhfY2ZnOwotCi0gICAgICAgIGlmIChjcmlzdjMyX2FyYml0ZXJfYWxsb2NhdGVfYmFuZHdpZHRoKGRtYW5yLAotCQkJCQkgICAgICAgb3B0aW9ucyAmIERNQV9JTlRfTUVNID8gSU5UX1JFR0lPTiA6IEVYVF9SRUdJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZHdpZHRoKSkKLSAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFfbG9jaywgZmxhZ3MpOwotCi0JaWYgKHVzZWRfZG1hX2NoYW5uZWxzW2RtYW5yXSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFfbG9jaywgZmxhZ3MpOwotCQlpZiAob3B0aW9ucyAmIERNQV9WRVJCT1NFX09OX0VSUk9SKSB7Ci0JCQlwcmludGsoIkZhaWxlZCB0byByZXF1ZXN0IERNQSAlaSBmb3IgJXMsIGFscmVhZHkgYWxsb2NhdGVkIGJ5ICVzXG4iLCBkbWFuciwgZGV2aWNlX2lkLCB1c2VkX2RtYV9jaGFubmVsc191c2Vyc1tkbWFucl0pOwotCQl9Ci0JCWlmIChvcHRpb25zICYgRE1BX1BBTklDX09OX0VSUk9SKQotCQkJcGFuaWMoInJlcXVlc3RfZG1hIGVycm9yISIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQljbGtfY3RybCA9IFJFR19SRChjb25maWcsIHJlZ2lfY29uZmlnLCByd19jbGtfY3RybCk7Ci0Jc3RybXV4X2NmZyA9IFJFR19SRChzdHJtdXgsIHJlZ2lfc3RybXV4LCByd19jZmcpOwotCi0Jc3dpdGNoKGRtYW5yKQotCXsKLQljYXNlIDA6Ci0JY2FzZSAxOgotCQljbGtfY3RybC5kbWEwMV9ldGgwID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCWNhc2UgMzoKLQkJY2xrX2N0cmwuZG1hMjMgPSAxOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JY2FzZSA1OgotCQljbGtfY3RybC5kbWE0NSA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgNjoKLQljYXNlIDc6Ci0JCWNsa19jdHJsLmRtYTY3ID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSA4OgotCWNhc2UgOToKLQkJY2xrX2N0cmwuZG1hODlfc3RyY29wID0gMTsKLQkJYnJlYWs7Ci0jaWYgTUFYX0RNQV9DSEFOTkVMUy0xICE9IDkKLSNlcnJvciBDaGVjayBkbWEuYwotI2VuZGlmCi0JZGVmYXVsdDoKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hX2xvY2ssIGZsYWdzKTsKLQkJaWYgKG9wdGlvbnMgJiBETUFfVkVSQk9TRV9PTl9FUlJPUikgewotCQkJcHJpbnRrKCJGYWlsZWQgdG8gcmVxdWVzdCBETUEgJWkgZm9yICVzLCBvbmx5IDAtJWkgdmFsaWQpXG4iLCBkbWFuciwgZGV2aWNlX2lkLCBNQVhfRE1BX0NIQU5ORUxTLTEpOwotCQl9Ci0KLQkJaWYgKG9wdGlvbnMgJiBETUFfUEFOSUNfT05fRVJST1IpCi0JCQlwYW5pYygicmVxdWVzdF9kbWEgZXJyb3IhIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN3aXRjaChvd25lcikKLQl7Ci0JY2FzZSBkbWFfZXRoMDoKLQkJaWYgKGRtYW5yID09IDApCi0JCQlzdHJtdXhfY2ZnLmRtYTAgPSByZWdrX3N0cm11eF9ldGgwOwotCQllbHNlIGlmIChkbWFuciA9PSAxKQotCQkJc3RybXV4X2NmZy5kbWExID0gcmVna19zdHJtdXhfZXRoMDsKLQkJZWxzZQotCQkJcGFuaWMoIkludmFsaWQgRE1BIGNoYW5uZWwgZm9yIGV0aDBcbiIpOwotCQlicmVhazsKLQljYXNlIGRtYV9ldGgxOgotCQlpZiAoZG1hbnIgPT0gNikKLQkJCXN0cm11eF9jZmcuZG1hNiA9IHJlZ2tfc3RybXV4X2V0aDE7Ci0JCWVsc2UgaWYgKGRtYW5yID09IDcpCi0JCQlzdHJtdXhfY2ZnLmRtYTcgPSByZWdrX3N0cm11eF9ldGgxOwotCQllbHNlCi0JCQlwYW5pYygiSW52YWxpZCBETUEgY2hhbm5lbCBmb3IgZXRoMVxuIik7Ci0JCWJyZWFrOwotCWNhc2UgZG1hX2lvcDA6Ci0JCWlmIChkbWFuciA9PSAyKQotCQkJc3RybXV4X2NmZy5kbWEyID0gcmVna19zdHJtdXhfaW9wMDsKLQkJZWxzZSBpZiAoZG1hbnIgPT0gMykKLQkJCXN0cm11eF9jZmcuZG1hMyA9IHJlZ2tfc3RybXV4X2lvcDA7Ci0JCWVsc2UKLQkJCXBhbmljKCJJbnZhbGlkIERNQSBjaGFubmVsIGZvciBpb3AwXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBkbWFfaW9wMToKLQkJaWYgKGRtYW5yID09IDQpCi0JCQlzdHJtdXhfY2ZnLmRtYTQgPSByZWdrX3N0cm11eF9pb3AxOwotCQllbHNlIGlmIChkbWFuciA9PSA1KQotCQkJc3RybXV4X2NmZy5kbWE1ID0gcmVna19zdHJtdXhfaW9wMTsKLQkJZWxzZQotCQkJcGFuaWMoIkludmFsaWQgRE1BIGNoYW5uZWwgZm9yIGlvcDFcbiIpOwotCQlicmVhazsKLQljYXNlIGRtYV9zZXIwOgotCQlpZiAoZG1hbnIgPT0gNikKLQkJCXN0cm11eF9jZmcuZG1hNiA9IHJlZ2tfc3RybXV4X3NlcjA7Ci0JCWVsc2UgaWYgKGRtYW5yID09IDcpCi0JCQlzdHJtdXhfY2ZnLmRtYTcgPSByZWdrX3N0cm11eF9zZXIwOwotCQllbHNlCi0JCQlwYW5pYygiSW52YWxpZCBETUEgY2hhbm5lbCBmb3Igc2VyMFxuIik7Ci0JCWJyZWFrOwotCWNhc2UgZG1hX3NlcjE6Ci0JCWlmIChkbWFuciA9PSA0KQotCQkJc3RybXV4X2NmZy5kbWE0ID0gcmVna19zdHJtdXhfc2VyMTsKLQkJZWxzZSBpZiAoZG1hbnIgPT0gNSkKLQkJCXN0cm11eF9jZmcuZG1hNSA9IHJlZ2tfc3RybXV4X3NlcjE7Ci0JCWVsc2UKLQkJCXBhbmljKCJJbnZhbGlkIERNQSBjaGFubmVsIGZvciBzZXIxXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBkbWFfc2VyMjoKLQkJaWYgKGRtYW5yID09IDIpCi0JCQlzdHJtdXhfY2ZnLmRtYTIgPSByZWdrX3N0cm11eF9zZXIyOwotCQllbHNlIGlmIChkbWFuciA9PSAzKQotCQkJc3RybXV4X2NmZy5kbWEzID0gcmVna19zdHJtdXhfc2VyMjsKLQkJZWxzZQotCQkJcGFuaWMoIkludmFsaWQgRE1BIGNoYW5uZWwgZm9yIHNlcjJcbiIpOwotCQlicmVhazsKLQljYXNlIGRtYV9zZXIzOgotCQlpZiAoZG1hbnIgPT0gOCkKLQkJCXN0cm11eF9jZmcuZG1hOCA9IHJlZ2tfc3RybXV4X3NlcjM7Ci0JCWVsc2UgaWYgKGRtYW5yID09IDkpCi0JCQlzdHJtdXhfY2ZnLmRtYTkgPSByZWdrX3N0cm11eF9zZXIzOwotCQllbHNlCi0JCQlwYW5pYygiSW52YWxpZCBETUEgY2hhbm5lbCBmb3Igc2VyM1xuIik7Ci0JCWJyZWFrOwotCWNhc2UgZG1hX3NzZXIwOgotCQlpZiAoZG1hbnIgPT0gNCkKLQkJCXN0cm11eF9jZmcuZG1hNCA9IHJlZ2tfc3RybXV4X3NzZXIwOwotCQllbHNlIGlmIChkbWFuciA9PSA1KQotCQkJc3RybXV4X2NmZy5kbWE1ID0gcmVna19zdHJtdXhfc3NlcjA7Ci0JCWVsc2UKLQkJCXBhbmljKCJJbnZhbGlkIERNQSBjaGFubmVsIGZvciBzc2VyMFxuIik7Ci0JCWJyZWFrOwotCWNhc2UgZG1hX3NzZXIxOgotCQlpZiAoZG1hbnIgPT0gNikKLQkJCXN0cm11eF9jZmcuZG1hNiA9IHJlZ2tfc3RybXV4X3NzZXIxOwotCQllbHNlIGlmIChkbWFuciA9PSA3KQotCQkJc3RybXV4X2NmZy5kbWE3ID0gcmVna19zdHJtdXhfc3NlcjE7Ci0JCWVsc2UKLQkJCXBhbmljKCJJbnZhbGlkIERNQSBjaGFubmVsIGZvciBzc2VyMVxuIik7Ci0JCWJyZWFrOwotCWNhc2UgZG1hX2F0YToKLQkJaWYgKGRtYW5yID09IDIpCi0JCQlzdHJtdXhfY2ZnLmRtYTIgPSByZWdrX3N0cm11eF9hdGE7Ci0JCWVsc2UgaWYgKGRtYW5yID09IDMpCi0JCQlzdHJtdXhfY2ZnLmRtYTMgPSByZWdrX3N0cm11eF9hdGE7Ci0JCWVsc2UKLQkJCXBhbmljKCJJbnZhbGlkIERNQSBjaGFubmVsIGZvciBhdGFcbiIpOwotCQlicmVhazsKLQljYXNlIGRtYV9zdHJwOgotCQlpZiAoZG1hbnIgPT0gOCkKLQkJCXN0cm11eF9jZmcuZG1hOCA9IHJlZ2tfc3RybXV4X3N0cmNvcDsKLQkJZWxzZSBpZiAoZG1hbnIgPT0gOSkKLQkJCXN0cm11eF9jZmcuZG1hOSA9IHJlZ2tfc3RybXV4X3N0cmNvcDsKLQkJZWxzZQotCQkJcGFuaWMoIkludmFsaWQgRE1BIGNoYW5uZWwgZm9yIHN0cnBcbiIpOwotCQlicmVhazsKLQljYXNlIGRtYV9leHQwOgotCQlpZiAoZG1hbnIgPT0gNikKLQkJCXN0cm11eF9jZmcuZG1hNiA9IHJlZ2tfc3RybXV4X2V4dDA7Ci0JCWVsc2UKLQkJCXBhbmljKCJJbnZhbGlkIERNQSBjaGFubmVsIGZvciBleHQwXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBkbWFfZXh0MToKLQkJaWYgKGRtYW5yID09IDcpCi0JCQlzdHJtdXhfY2ZnLmRtYTcgPSByZWdrX3N0cm11eF9leHQxOwotCQllbHNlCi0JCQlwYW5pYygiSW52YWxpZCBETUEgY2hhbm5lbCBmb3IgZXh0MVxuIik7Ci0JCWJyZWFrOwotCWNhc2UgZG1hX2V4dDI6Ci0JCWlmIChkbWFuciA9PSAyKQotCQkJc3RybXV4X2NmZy5kbWEyID0gcmVna19zdHJtdXhfZXh0MjsKLQkJZWxzZSBpZiAoZG1hbnIgPT0gOCkKLQkJCXN0cm11eF9jZmcuZG1hOCA9IHJlZ2tfc3RybXV4X2V4dDI7Ci0JCWVsc2UKLQkJCXBhbmljKCJJbnZhbGlkIERNQSBjaGFubmVsIGZvciBleHQyXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBkbWFfZXh0MzoKLQkJaWYgKGRtYW5yID09IDMpCi0JCQlzdHJtdXhfY2ZnLmRtYTMgPSByZWdrX3N0cm11eF9leHQzOwotCQllbHNlIGlmIChkbWFuciA9PSA5KQotCQkJc3RybXV4X2NmZy5kbWE5ID0gcmVna19zdHJtdXhfZXh0MjsKLQkJZWxzZQotCQkJcGFuaWMoIkludmFsaWQgRE1BIGNoYW5uZWwgZm9yIGV4dDJcbiIpOwotCQlicmVhazsKLQl9Ci0KLQl1c2VkX2RtYV9jaGFubmVsc1tkbWFucl0gPSAxOwotCXVzZWRfZG1hX2NoYW5uZWxzX3VzZXJzW2RtYW5yXSA9IGRldmljZV9pZDsKLQlSRUdfV1IoY29uZmlnLCByZWdpX2NvbmZpZywgcndfY2xrX2N0cmwsIGNsa19jdHJsKTsKLQlSRUdfV1Ioc3RybXV4LCByZWdpX3N0cm11eCwgcndfY2ZnLCBzdHJtdXhfY2ZnKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFfbG9jayxmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgY3Jpc3YzMl9mcmVlX2RtYSh1bnNpZ25lZCBpbnQgZG1hbnIpCi17Ci0Jc3Bpbl9sb2NrKCZkbWFfbG9jayk7Ci0JdXNlZF9kbWFfY2hhbm5lbHNbZG1hbnJdID0gMDsKLQlzcGluX3VubG9jaygmZG1hX2xvY2spOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9lbnRyeS5TCmluZGV4IGY5ZDI3ODAuLmVlYmJhYmEgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL2VudHJ5LlMKQEAgLTEwLDcgKzEwLDcgQEAKICAqIGFmdGVyIGEgdGltZXItaW50ZXJydXB0IGFuZCBhZnRlciBlYWNoIHN5c3RlbSBjYWxsLgogICoKICAqIFN0YWNrIGxheW91dCBpbiAncmV0X2Zyb21fc3lzdGVtX2NhbGwnOgotICogCXB0cmFjZSBuZWVkcyB0byBoYXZlIGFsbCByZWdzIG9uIHRoZSBzdGFjay4KKyAqCXB0cmFjZSBuZWVkcyB0byBoYXZlIGFsbCByZWdzIG9uIHRoZSBzdGFjay4KICAqCWlmIHRoZSBvcmRlciBoZXJlIGlzIGNoYW5nZWQsIGl0IG5lZWRzIHRvIGJlCiAgKgl1cGRhdGVkIGluIGZvcmsuYzpjb3B5X3Byb2Nlc3MsIHNpZ25hbC5jOmRvX3NpZ25hbCwKICAqCXB0cmFjZS5jIGFuZCBwdHJhY2UuaApAQCAtMjgxLDEyICsyODEsMTAgQEAKIAk7OyBEZWFsIHdpdGggcGVuZGluZyBzaWduYWxzIGFuZCBub3RpZnktcmVzdW1lIHJlcXVlc3RzLgogCiAJYWRkb3EJK1RJX2ZsYWdzLCAkcjAsICRhY3IKLQltb3ZlLmQJWyRhY3JdLCAkcjEzCQk7IFRoZSB0aHJlYWRfaW5mb19mbGFncyBwYXJhbWV0ZXIuCi0JbW92ZS5kCSRyOSwgJHIxMAkJOyBkb19ub3RpZnlfcmVzdW1lIHN5c2NhbGwvaXJxIHBhcmFtLgotCW1vdmVxCTAsICRyMTEJCQk7IG9sZHNldCBwYXJhbSAtIDAgaW4gdGhpcyBjYXNlLgotCW1vdmUuZAkkc3AsICRyMTIJCTsgVGhlIHJlZ3MgcGFyYW0uCisJbW92ZS5kCVskYWNyXSwgJHIxMgkJOyBUaGUgdGhyZWFkX2luZm9fZmxhZ3MgcGFyYW1ldGVyLgorCW1vdmUuZAkkc3AsICRyMTEJCTsgVGhlIHJlZ3MgcGFyYW0uCiAJanNyCWRvX25vdGlmeV9yZXN1bWUKLQlub3AKKwltb3ZlLmQJJHI5LCAkcjEwCQk7IGRvX25vdGlmeV9yZXN1bWUgc3lzY2FsbC9pcnEgcGFyYW0uCiAKIAliYSBfUmV4aXQKIAlub3AKQEAgLTM5Niw3ICszOTQsNyBAQAogCWJ0c3RxCVJFR19CSVQoaW50cl92ZWN0LCByX25taSwgd2F0Y2hkb2cpLCAkcjAKIAlicGwgICAgIDFmCiAJbm9wCi0JanNyIAloYW5kbGVfd2F0Y2hkb2dfYml0ZQk7IEluIHRpbWUuYy4KKwlqc3IJaGFuZGxlX3dhdGNoZG9nX2JpdGUJOyBJbiB0aW1lLmMuCiAgICAgICAgIG1vdmUuZAkkc3AsICRyMTAJCTsgUG9pbnRlciB0byByZWdpc3RlcnMKIDE6CWJ0c3RxCVJFR19CSVQoaW50cl92ZWN0LCByX25taSwgZXh0KSwgJHIwCiAJYnBsICAgICAxZgpAQCAtNTE1LDYgKzUxMywxMyBAQAogCWJhCWRvX3NpZ3RyYXAJCTsgU0lHVFJBUCB0aGUgb2ZmZW5kaW5nIHByb2Nlc3MuCiAJbW92ZS5kCVskc3ArXSwgJHIwCQk7IFJlc3RvcmUgUjAgaW4gZGVsYXkgc2xvdC4KIAorCS5nbG9iYWwga2VybmVsX2V4ZWN2ZQora2VybmVsX2V4ZWN2ZToKKwltb3ZlLmQgX19OUl9leGVjdmUsICRyOQorCWJyZWFrIDEzCisJcmV0CisJbm9wCisKIAkuZGF0YQogCiAJLnNlY3Rpb24gLnJvZGF0YSwiYSIKQEAgLTc3OCwyMSArNzgzLDIxIEBACiAJLmxvbmcgc3lzX2Vwb2xsX2N0bAkvKiAyNTUgKi8KIAkubG9uZyBzeXNfZXBvbGxfd2FpdAogCS5sb25nIHN5c19yZW1hcF9maWxlX3BhZ2VzCi0gCS5sb25nIHN5c19zZXRfdGlkX2FkZHJlc3MKLSAJLmxvbmcgc3lzX3RpbWVyX2NyZWF0ZQotIAkubG9uZyBzeXNfdGltZXJfc2V0dGltZQkJLyogMjYwICovCi0gCS5sb25nIHN5c190aW1lcl9nZXR0aW1lCi0gCS5sb25nIHN5c190aW1lcl9nZXRvdmVycnVuCi0gCS5sb25nIHN5c190aW1lcl9kZWxldGUKLSAJLmxvbmcgc3lzX2Nsb2NrX3NldHRpbWUKLSAJLmxvbmcgc3lzX2Nsb2NrX2dldHRpbWUJCS8qIDI2NSAqLwotIAkubG9uZyBzeXNfY2xvY2tfZ2V0cmVzCi0gCS5sb25nIHN5c19jbG9ja19uYW5vc2xlZXAKKwkubG9uZyBzeXNfc2V0X3RpZF9hZGRyZXNzCisJLmxvbmcgc3lzX3RpbWVyX2NyZWF0ZQorCS5sb25nIHN5c190aW1lcl9zZXR0aW1lCQkvKiAyNjAgKi8KKwkubG9uZyBzeXNfdGltZXJfZ2V0dGltZQorCS5sb25nIHN5c190aW1lcl9nZXRvdmVycnVuCisJLmxvbmcgc3lzX3RpbWVyX2RlbGV0ZQorCS5sb25nIHN5c19jbG9ja19zZXR0aW1lCisJLmxvbmcgc3lzX2Nsb2NrX2dldHRpbWUJCS8qIDI2NSAqLworCS5sb25nIHN5c19jbG9ja19nZXRyZXMKKwkubG9uZyBzeXNfY2xvY2tfbmFub3NsZWVwCiAJLmxvbmcgc3lzX3N0YXRmczY0CiAJLmxvbmcgc3lzX2ZzdGF0ZnM2NAogCS5sb25nIHN5c190Z2tpbGwJLyogMjcwICovCiAJLmxvbmcgc3lzX3V0aW1lcwotIAkubG9uZyBzeXNfZmFkdmlzZTY0XzY0CisJLmxvbmcgc3lzX2ZhZHZpc2U2NF82NAogCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIHN5c192c2VydmVyICovCiAJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogc3lzX21iaW5kICovCiAJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogMjc1IHN5c19nZXRfbWVtcG9saWN5ICovCkBAIC04MDUsNiArODEwLDQ4IEBACiAJLmxvbmcgc3lzX21xX2dldHNldGF0dHIKIAkubG9uZyBzeXNfbmlfc3lzY2FsbAkJLyogcmVzZXJ2ZWQgZm9yIGtleGVjICovCiAJLmxvbmcgc3lzX3dhaXRpZAorCS5sb25nIHN5c19uaV9zeXNjYWxsCQkvKiAyODUgKi8gLyogYXZhaWxhYmxlICovCisJLmxvbmcgc3lzX2FkZF9rZXkKKwkubG9uZyBzeXNfcmVxdWVzdF9rZXkKKwkubG9uZyBzeXNfa2V5Y3RsCisJLmxvbmcgc3lzX2lvcHJpb19zZXQKKwkubG9uZyBzeXNfaW9wcmlvX2dldAkJLyogMjkwICovCisJLmxvbmcgc3lzX2lub3RpZnlfaW5pdAorCS5sb25nIHN5c19pbm90aWZ5X2FkZF93YXRjaAorCS5sb25nIHN5c19pbm90aWZ5X3JtX3dhdGNoCisJLmxvbmcgc3lzX21pZ3JhdGVfcGFnZXMKKwkubG9uZyBzeXNfb3BlbmF0CQkvKiAyOTUgKi8KKwkubG9uZyBzeXNfbWtkaXJhdAorCS5sb25nIHN5c19ta25vZGF0CisJLmxvbmcgc3lzX2ZjaG93bmF0CisJLmxvbmcgc3lzX2Z1dGltZXNhdAorCS5sb25nIHN5c19mc3RhdGF0NjQJCS8qIDMwMCAqLworCS5sb25nIHN5c191bmxpbmthdAorCS5sb25nIHN5c19yZW5hbWVhdAorCS5sb25nIHN5c19saW5rYXQKKwkubG9uZyBzeXNfc3ltbGlua2F0CisJLmxvbmcgc3lzX3JlYWRsaW5rYXQJCS8qIDMwNSAqLworCS5sb25nIHN5c19mY2htb2RhdAorCS5sb25nIHN5c19mYWNjZXNzYXQKKwkubG9uZyBzeXNfcHNlbGVjdDYKKwkubG9uZyBzeXNfcHBvbGwKKwkubG9uZyBzeXNfdW5zaGFyZQkJLyogMzEwICovCisJLmxvbmcgc3lzX3NldF9yb2J1c3RfbGlzdAorCS5sb25nIHN5c19nZXRfcm9idXN0X2xpc3QKKwkubG9uZyBzeXNfc3BsaWNlCisJLmxvbmcgc3lzX3N5bmNfZmlsZV9yYW5nZQorCS5sb25nIHN5c190ZWUJCQkvKiAzMTUgKi8KKwkubG9uZyBzeXNfdm1zcGxpY2UKKwkubG9uZyBzeXNfbW92ZV9wYWdlcworCS5sb25nIHN5c19nZXRjcHUKKwkubG9uZyBzeXNfZXBvbGxfcHdhaXQKKwkubG9uZyBzeXNfdXRpbWVuc2F0CQkvKiAzMjAgKi8KKwkubG9uZyBzeXNfc2lnbmFsZmQKKwkubG9uZyBzeXNfdGltZXJmZF9jcmVhdGUKKwkubG9uZyBzeXNfZXZlbnRmZAorCS5sb25nIHN5c19mYWxsb2NhdGUKKwkubG9uZyBzeXNfdGltZXJmZF9zZXR0aW1lICAgICAgIC8qIDMyNSAqLworCS5sb25nIHN5c190aW1lcmZkX2dldHRpbWUKIAogICAgICAgICAvKgogICAgICAgICAgKiBOT1RFISEgVGhpcyBkb2Vzbid0IGhhdmUgdG8gYmUgZXhhY3QgLSB3ZSBqdXN0IGhhdmUKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvZmFzdHRpbWVyLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL2Zhc3R0aW1lci5jCmluZGV4IGI0MDU1MWYuLjJkZTlkNTggMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvZmFzdHRpbWVyLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9mYXN0dGltZXIuYwpAQCAtMSwxMTAgKzEsOSBAQAotLyogJElkOiBmYXN0dGltZXIuYyx2IDEuMTEgMjAwNS8wMS8wNCAxMToxNTo0NiBzdGFydmlrIEV4cCAkCisvKgogICogbGludXgvYXJjaC9jcmlzL2tlcm5lbC9mYXN0dGltZXIuYwogICoKICAqIEZhc3QgdGltZXJzIGZvciBFVFJBWCBGUwotICogVGhpcyBtYXkgYmUgdXNlZnVsIGluIG90aGVyIE9TIHRoYW4gTGludXggc28gdXNlIDIgc3BhY2UgaW5kZW50YXRpb24uLi4KICAqCi0gKiAkTG9nOiBmYXN0dGltZXIuYyx2ICQKLSAqIFJldmlzaW9uIDEuMTEgIDIwMDUvMDEvMDQgMTE6MTU6NDYgIHN0YXJ2aWsKLSAqIERvbid0IHNoYXJlIHRpbWVyIElSUS4KLSAqCi0gKiBSZXZpc2lvbiAxLjEwICAyMDA0LzEyLzA3IDA5OjE5OjM4ICBzdGFydmlrCi0gKiBDb3JyZWN0ZWQgaW5jbHVkZXMuCi0gKiBVc2UgY29ycmVjdCBpbnRlcnJ1cHQgbWFjcm9zLgotICoKLSAqIFJldmlzaW9uIDEuOSAgMjAwNC8wNS8xNCAxMDoxODo1OCAgc3RhcnZpawotICogRXhwb3J0IGZhc3RfdGltZXJfbGlzdAotICoKLSAqIFJldmlzaW9uIDEuOCAgMjAwNC8wNS8xNCAwNzo1ODowMyAgc3RhcnZpawotICogTWVyZ2Ugb2YgY2hhbmdlcyBmcm9tIDIuNAotICoKLSAqIFJldmlzaW9uIDEuNyAgMjAwMy8wNy8xMCAxMjowNjoxNCAgc3RhcnZpawotICogUmV0dXJuIElSUV9OT05FIGlmIGlycSB3YXNuJ3QgaGFuZGxlZAotICoKLSAqIFJldmlzaW9uIDEuNiAgMjAwMy8wNy8wNCAwODoyNzo0OSAgc3RhcnZpawotICogTWVyZ2Ugb2YgTGludXggMi41Ljc0Ci0gKgotICogUmV2aXNpb24gMS41ICAyMDAzLzA2LzA1IDEwOjE2OjIyICBqb2hhbmEKLSAqIE5ldyBJTlRSX1ZFQ1QgbWFjcm9zLgotICoKLSAqIFJldmlzaW9uIDEuNCAgMjAwMy8wNi8wMyAwODo0OTo0NSAgam9oYW5hCi0gKiBGaXhlZCB0eXBvLgotICoKLSAqIFJldmlzaW9uIDEuMyAgMjAwMy8wNi8wMiAxMjo1MToyNyAgam9oYW5hCi0gKiBOb3cgY29tcGlsZXMuCi0gKiBDb21tZW50ZWQgc29tZSBpbmNsdWRlIGZpbGVzIHRoYXQgcHJvYmFibHkgY2FuIGJlIHJlbW92ZWQuCi0gKgotICogUmV2aXNpb24gMS4yICAyMDAzLzA2LzAyIDEyOjA5OjQxICBqb2hhbmEKLSAqIFBvcnRlZCB0byBFVFJBWCBGUyB1c2luZyB0aGUgdHJpZyBpbnRlcnJ1cHQgaW5zdGVhZCBvZiB0aW1lcjEuCi0gKgotICogUmV2aXNpb24gMS4zICAyMDAyLzEyLzEyIDA4OjI2OjMyICBzdGFydmlrCi0gKiBEb24ndCB1c2UgQy1jb21tZW50cyBpbnNpZGUgQ1ZTIGNvbW1lbnRzCi0gKgotICogUmV2aXNpb24gMS4yICAyMDAyLzEyLzExIDE1OjQyOjAyICBzdGFydmlrCi0gKiBFeHRyYWN0ZWQgdjEwIChFVFJBWCAxMDBMWCkgc3BlY2lmaWMgc3R1ZmYgZnJvbSBhcmNoL2NyaXMva2VybmVsLwotICoKLSAqIFJldmlzaW9uIDEuMSAgMjAwMi8xMS8xOCAwNzo1ODowNiAgc3RhcnZpawotICogRmFzdCB0aW1lcnMgKGZyb20gTGludXggMi40KQotICoKLSAqIFJldmlzaW9uIDEuNSAgMjAwMi8xMC8xNSAwNjoyMTozOSAgc3RhcnZpawotICogQWRkZWQgY2FsbCB0byBpbml0X3dhaXRxdWV1ZV9oZWFkCi0gKgotICogUmV2aXNpb24gMS40ICAyMDAyLzA1LzI4IDE3OjQ3OjU5ICBqb2hhbmEKLSAqIEFkZGVkIGRlbF9mYXN0X3RpbWVyKCkKLSAqCi0gKiBSZXZpc2lvbiAxLjMgIDIwMDIvMDUvMjggMTY6MTY6MDcgIGpvaGFuYQotICogSGFuZGxlIGVtcHR5IGZhc3RfdGltZXJfbGlzdAotICoKLSAqIFJldmlzaW9uIDEuMiAgMjAwMi8wNS8yNyAxNTozODo0MiAgam9oYW5hCi0gKiBNYWRlIGl0IGNvbXBpbGUgd2l0aG91dCB3YXJuaW5ncyBvbiBMaW51eCAyLjQuCi0gKiAoaW5jbHVkZXMsIHdhaXRfcXVldWUsIFBST0NfRlMgYW5kIHNucHJpbnRmKQotICoKLSAqIFJldmlzaW9uIDEuMSAgMjAwMi8wNS8yNyAxNTozMjoyNSAgam9oYW5hCi0gKiBhcmNoL2V0cmF4MTAwL2tlcm5lbC9mYXN0dGltZXIuYyB2MS44IGZyb20gdGhlIGVsaW51eCB0cmVlLgotICoKLSAqIFJldmlzaW9uIDEuOCAgMjAwMS8xMS8yNyAxMzo1MDo0MCAgcGtqCi0gKiBEaXNhYmxlIGludGVycnVwdHMgd2hpbGUgc3RvcHBpbmcgdGhlIHRpbWVyIGFuZCB3aGlsZSBtb2RpZnlpbmcgdGhlCi0gKiBsaXN0IG9mIGFjdGl2ZSB0aW1lcnMgaW4gdGltZXIxX2hhbmRsZXIoKSBhcyBpdCBtYXkgYmUgaW50ZXJydXB0ZWQKLSAqIGJ5IG90aGVyIGludGVycnVwdHMgKGUuZy4sIHRoZSBzZXJpYWwgaW50ZXJydXB0KSB3aGljaCBtYXkgYWRkIGZhc3QKLSAqIHRpbWVycy4KLSAqCi0gKiBSZXZpc2lvbiAxLjcgIDIwMDEvMTEvMjIgMTE6NTA6MzIgIHBragotICogKiBPbmx5IHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IDE2IHRpbWVycy4KLSAqICogcHJvY19mYXN0dGltZXJfcmVhZCgpIG5vdyB1c2VzIGFuIGFsbG9jYXRlZCBidWZmZXIsIHNpbmNlIGl0Ci0gKiAgIHJlcXVpcmVzIG1vcmUgc3BhY2UgdGhhbiBqdXN0IGEgcGFnZSBldmVuIGZvciBvbmx5IHdyaXRpbmcgdGhlCi0gKiAgIGxhc3QgMTYgdGltZXJzLiBUaGUgYnVmZmVyIGlzIG9ubHkgYWxsb2NhdGVkIG9uIHJlcXVlc3QsIHNvCi0gKiAgIHVubGVzcyAvcHJvYy9mYXN0dGltZXIgaXMgcmVhZCwgaXQgaXMgbmV2ZXIgYWxsb2NhdGVkLgotICogKiBSZW5hbWVkIGZhc3RfdGltZXJfc3RhcnRlZCB0byBmYXN0X3RpbWVyc19zdGFydGVkIHRvIG1hdGNoCi0gKiAgIGZhc3RfdGltZXJzX2FkZGVkIGFuZCBmYXN0X3RpbWVyc19leHBpcmVkLgotICogKiBTb21lIGNsZWFuLXVwLgotICoKLSAqIFJldmlzaW9uIDEuNiAgMjAwMC8xMi8xMyAxNDowMjowOCAgam9oYW5hCi0gKiBSZW1vdmVkIHZvbGF0aWxlIGZvciBmYXN0X3RpbWVyX2xpc3QKLSAqCi0gKiBSZXZpc2lvbiAxLjUgIDIwMDAvMTIvMTMgMTM6NTU6MzUgIGpvaGFuYQotICogQWRkZWQgREVCVUdfTE9HLCBhZGRlZCBzb20gY2xpKCkgYW5kIGNsZWFudXAKLSAqCi0gKiBSZXZpc2lvbiAxLjQgIDIwMDAvMTIvMDUgMTM6NDg6NTAgIGpvaGFuYQotICogQWRkZWQgcmFuZ2UgY2hlY2sgd2hlbiB3cml0aW5nIHByb2MgZmlsZSwgbW9kaWZpZWQgdGltZXIgaW50IGhhbmRsaW5nCi0gKgotICogUmV2aXNpb24gMS4zICAyMDAwLzExLzIzIDEwOjEwOjIwICBqb2hhbmEKLSAqIE1vcmUgZGVidWcvbG9nZ2luZyBwb3NzaWJpbGl0aWVzLgotICogTW92ZWQgR0VUX0pJRkZJRVNfVVNFQygpIHRvIHRpbWV4LmggYW5kIHRpbWUuYwotICoKLSAqIFJldmlzaW9uIDEuMiAgMjAwMC8xMS8wMSAxMzo0MTowNCAgam9oYW5hCi0gKiBDbGVhbiB1cCBhbmQgYnVnZml4ZXMuCi0gKiBDcmVhdGVkIG5ldyBkb19nZXR0aW1lb2ZkYXlfZmFzdCgpIHRoYXQgZ2V0cyBhIHRpbWV2YWwgc3RydWN0Ci0gKiB3aXRoIHRpbWUgYmFzZWQgb24gamlmZmllcyBhbmQgKlJfVElNRVIwX0RBVEEsIHVzZXMgYSB0YWJsZQotICogZm9yIGZhc3QgY29udmVyc2lvbiBvZiB0aW1lciB2YWx1ZSB0byBtaWNyb3NlY29uZHMuCi0gKiAoTXVjaCBmYXN0ZXIgdGhlIHN0YW5kYXJkIGRvX2dldHRpbWVvZmRheSgpIGFuZCB3ZSBkb24ndCByZWFsbHkKLSAqIHdhbnQgdG8gdXNlIHRoZSB0cnVlIHRpbWUgLSB3ZSB3YW50IHRoZSAidXB0aW1lIiBzbyB0aW1lcnMgZG9uJ3Qgc2NyZXcgdXAKLSAqIHdoZW4gd2UgY2hhbmdlIHRoZSB0aW1lLgotICogVE9ETzogQWRkIGVmZmljaWVudCBzdXBwb3J0IGZvciBjb250aW51b3VzIHRpbWVycyBhcyB3ZWxsLgotICoKLSAqIFJldmlzaW9uIDEuMSAgMjAwMC8xMC8yNiAxNTo0OToxNiAgam9oYW5hCi0gKiBBZGRlZCBmYXN0dGltZXIsIGhpZ2hyZXNvbHV0aW9uIHRpbWVycy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSAyMDAyLCAyMDAzIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIsIEx1bmQsIFN3ZWRlbgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDYgQXhpcyBDb21tdW5pY2F0aW9ucyBBQiwgTHVuZCwgU3dlZGVuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CkBAIC0xMjIsOSArMjEsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCi0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL3JlZ19tYXAuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvcmVnX3Jkd3IuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvdGltZXJfZGVmcy5oPgorI2luY2x1ZGUgPGh3cmVncy9yZWdfbWFwLmg+CisjaW5jbHVkZSA8aHdyZWdzL3JlZ19yZHdyLmg+CisjaW5jbHVkZSA8aHdyZWdzL3RpbWVyX2RlZnMuaD4KICNpbmNsdWRlIDxhc20vZmFzdHRpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogCkBAIC0xNDAsMzAgKzM5LDI1IEBACiAKICNkZWZpbmUgREVCVUdfTE9HX0lOQ0xVREVECiAjZGVmaW5lIEZBU1RfVElNRVJfTE9HCi0vLyNkZWZpbmUgRkFTVF9USU1FUl9URVNUCisvKiAjZGVmaW5lIEZBU1RfVElNRVJfVEVTVCAqLwogCiAjZGVmaW5lIEZBU1RfVElNRVJfU0FOSVRZX0NIRUNLUwogCiAjaWZkZWYgRkFTVF9USU1FUl9TQU5JVFlfQ0hFQ0tTCi0jZGVmaW5lIFNBTklUWUNIRUNLKHgpIHgKLXN0YXRpYyBpbnQgc2FuaXR5X2ZhaWxlZCA9IDA7Ci0jZWxzZQotI2RlZmluZSBTQU5JVFlDSEVDSyh4KQorc3RhdGljIGludCBzYW5pdHlfZmFpbGVkOwogI2VuZGlmCiAKICNkZWZpbmUgRDEoeCkKICNkZWZpbmUgRDIoeCkKICNkZWZpbmUgRFAoeCkKIAotI2RlZmluZSBfX0lOTElORV9fIGlubGluZQotCi1zdGF0aWMgaW50IGZhc3RfdGltZXJfcnVubmluZyA9IDA7Ci1zdGF0aWMgaW50IGZhc3RfdGltZXJzX2FkZGVkID0gMDsKLXN0YXRpYyBpbnQgZmFzdF90aW1lcnNfc3RhcnRlZCA9IDA7Ci1zdGF0aWMgaW50IGZhc3RfdGltZXJzX2V4cGlyZWQgPSAwOwotc3RhdGljIGludCBmYXN0X3RpbWVyc19kZWxldGVkID0gMDsKLXN0YXRpYyBpbnQgZmFzdF90aW1lcl9pc19pbml0ID0gMDsKLXN0YXRpYyBpbnQgZmFzdF90aW1lcl9pbnRzID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZmFzdF90aW1lcl9ydW5uaW5nOworc3RhdGljIHVuc2lnbmVkIGludCBmYXN0X3RpbWVyc19hZGRlZDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZmFzdF90aW1lcnNfc3RhcnRlZDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZmFzdF90aW1lcnNfZXhwaXJlZDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZmFzdF90aW1lcnNfZGVsZXRlZDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZmFzdF90aW1lcl9pc19pbml0Oworc3RhdGljIHVuc2lnbmVkIGludCBmYXN0X3RpbWVyX2ludHM7CiAKIHN0cnVjdCBmYXN0X3RpbWVyICpmYXN0X3RpbWVyX2xpc3QgPSBOVUxMOwogCkBAIC0xNzEsOCArNjUsOCBAQAogI2RlZmluZSBERUJVR19MT0dfTUFYIDEyOAogc3RhdGljIGNvbnN0IGNoYXIgKiBkZWJ1Z19sb2dfc3RyaW5nW0RFQlVHX0xPR19NQVhdOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgZGVidWdfbG9nX3ZhbHVlW0RFQlVHX0xPR19NQVhdOwotc3RhdGljIGludCBkZWJ1Z19sb2dfY250ID0gMDsKLXN0YXRpYyBpbnQgZGVidWdfbG9nX2NudF93cmFwcGVkID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWdfbG9nX2NudDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWdfbG9nX2NudF93cmFwcGVkOwogCiAjZGVmaW5lIERFQlVHX0xPRyhzdHJpbmcsIHZhbHVlKSBcCiB7IFwKQEAgLTIwMiwxMDMgKzk2LDkyIEBACiBpbnQgdGltZXJfZGl2X3NldHRpbmdzW05VTV9USU1FUl9TVEFUU107CiBpbnQgdGltZXJfZGVsYXlfc2V0dGluZ3NbTlVNX1RJTUVSX1NUQVRTXTsKIAorc3RydWN0IHdvcmtfc3RydWN0IGZhc3Rfd29yazsKIAogc3RhdGljIHZvaWQKLXRpbWVyX3RyaWdfaGFuZGxlcih2b2lkKTsKK3RpbWVyX3RyaWdfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiAKIAogLyogTm90IHRydWUgZ2V0dGltZW9mZGF5LCBvbmx5IGNoZWNrcyB0aGUgamlmZmllcyAodXB0aW1lKSArIHVzZWNvbmRzICovCi12b2lkIF9fSU5MSU5FX18gZG9fZ2V0dGltZW9mZGF5X2Zhc3Qoc3RydWN0IHRpbWV2YWwgKnR2KQoraW5saW5lIHZvaWQgZG9fZ2V0dGltZW9mZGF5X2Zhc3Qoc3RydWN0IGZhc3R0aW1lX3QgKnR2KQogewotICB1bnNpZ25lZCBsb25nIHNlYyA9IGppZmZpZXM7Ci0gIHVuc2lnbmVkIGxvbmcgdXNlYyA9IEdFVF9KSUZGSUVTX1VTRUMoKTsKLQotICB1c2VjICs9IChzZWMgJSBIWikgKiAoMTAwMDAwMCAvIEhaKTsKLSAgc2VjID0gc2VjIC8gSFo7Ci0KLSAgaWYgKHVzZWMgPiAxMDAwMDAwKQotICB7Ci0gICAgdXNlYyAtPSAxMDAwMDAwOwotICAgIHNlYysrOwotICB9Ci0gIHR2LT50dl9zZWMgPSBzZWM7Ci0gIHR2LT50dl91c2VjID0gdXNlYzsKKwl0di0+dHZfamlmZiA9IGppZmZpZXM7CisJdHYtPnR2X3VzZWMgPSBHRVRfSklGRklFU19VU0VDKCk7CiB9CiAKLWludCBfX0lOTElORV9fIHRpbWV2YWxfY21wKHN0cnVjdCB0aW1ldmFsICp0MCwgc3RydWN0IHRpbWV2YWwgKnQxKQoraW5saW5lIGludCBmYXN0dGltZV9jbXAoc3RydWN0IGZhc3R0aW1lX3QgKnQwLCBzdHJ1Y3QgZmFzdHRpbWVfdCAqdDEpCiB7Ci0gIGlmICh0MC0+dHZfc2VjIDwgdDEtPnR2X3NlYykKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICBlbHNlIGlmICh0MC0+dHZfc2VjID4gdDEtPnR2X3NlYykKLSAgewotICAgIHJldHVybiAxOwotICB9Ci0gIGlmICh0MC0+dHZfdXNlYyA8IHQxLT50dl91c2VjKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGVsc2UgaWYgKHQwLT50dl91c2VjID4gdDEtPnR2X3VzZWMpCi0gIHsKLSAgICByZXR1cm4gMTsKLSAgfQotICByZXR1cm4gMDsKKwkvKiBDb21wYXJlIGppZmZpZXMuIFRha2VzIGNhcmUgb2Ygd3JhcHBpbmcgKi8KKwlpZiAodGltZV9iZWZvcmUodDAtPnR2X2ppZmYsIHQxLT50dl9qaWZmKSkKKwkJcmV0dXJuIC0xOworCWVsc2UgaWYgKHRpbWVfYWZ0ZXIodDAtPnR2X2ppZmYsIHQxLT50dl9qaWZmKSkKKwkJcmV0dXJuIDE7CisKKwkvKiBDb21wYXJlIHVzICovCisJaWYgKHQwLT50dl91c2VjIDwgdDEtPnR2X3VzZWMpCisJCXJldHVybiAtMTsKKwllbHNlIGlmICh0MC0+dHZfdXNlYyA+IHQxLT50dl91c2VjKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIAogLyogQ2FsbGVkIHdpdGggaW50cyBvZmYgKi8KLXZvaWQgX19JTkxJTkVfXyBzdGFydF90aW1lcl90cmlnKHVuc2lnbmVkIGxvbmcgZGVsYXlfdXMpCitpbmxpbmUgdm9pZCBzdGFydF90aW1lcl90cmlnKHVuc2lnbmVkIGxvbmcgZGVsYXlfdXMpCiB7CiAgIHJlZ190aW1lcl9yd19hY2tfaW50ciBhY2tfaW50ciA9IHsgMCB9OwogICByZWdfdGltZXJfcndfaW50cl9tYXNrIGludHJfbWFzazsKICAgcmVnX3RpbWVyX3J3X3RyaWcgdHJpZzsKICAgcmVnX3RpbWVyX3J3X3RyaWdfY2ZnIHRyaWdfY2ZnID0geyAwIH07Ci0gIHJlZ190aW1lcl9yX3RpbWUgcl90aW1lOworCXJlZ190aW1lcl9yX3RpbWUgcl90aW1lMDsKKwlyZWdfdGltZXJfcl90aW1lIHJfdGltZTE7CisJdW5zaWduZWQgY2hhciB0cmlnX3dyYXA7CisJdW5zaWduZWQgY2hhciB0aW1lX3dyYXA7CiAKLSAgcl90aW1lID0gUkVHX1JEKHRpbWVyLCByZWdpX3RpbWVyLCByX3RpbWUpOworCXJfdGltZTAgPSBSRUdfUkQodGltZXIsIHJlZ2lfdGltZXIwLCByX3RpbWUpOwogCiAgIEQxKHByaW50aygic3RhcnRfdGltZXJfdHJpZyA6ICVkIHVzIGZyZXE6ICVpIGRpdjogJWlcbiIsCiAgICAgICAgICAgICBkZWxheV91cywgZnJlcV9pbmRleCwgZGl2KSk7CiAgIC8qIENsZWFyIHRyaWcgaXJxICovCi0gIGludHJfbWFzayA9IFJFR19SRCh0aW1lciwgcmVnaV90aW1lciwgcndfaW50cl9tYXNrKTsKKwlpbnRyX21hc2sgPSBSRUdfUkQodGltZXIsIHJlZ2lfdGltZXIwLCByd19pbnRyX21hc2spOwogICBpbnRyX21hc2sudHJpZyA9IDA7Ci0gIFJFR19XUih0aW1lciwgcmVnaV90aW1lciwgcndfaW50cl9tYXNrLCBpbnRyX21hc2spOworCVJFR19XUih0aW1lciwgcmVnaV90aW1lcjAsIHJ3X2ludHJfbWFzaywgaW50cl9tYXNrKTsKIAotICAvKiBTZXQgdGltZXIgdmFsdWVzICovCi0gIC8qIHJfdGltZSBpcyAxMDBNSHogKDEwIG5zIHJlc29sdXRpb24pICovCi0gIHRyaWcgPSByX3RpbWUgKyBkZWxheV91cyooMTAwMC8xMCk7CisJLyogU2V0IHRpbWVyIHZhbHVlcyBhbmQgY2hlY2sgaWYgdHJpZ2dlciB3cmFwcy4gKi8KKwkvKiByX3RpbWUgaXMgMTAwTUh6ICgxMCBucyByZXNvbHV0aW9uKSAqLworCXRyaWdfd3JhcCA9ICh0cmlnID0gcl90aW1lMCArIGRlbGF5X3VzKigxMDAwLzEwKSkgPCByX3RpbWUwOwogCiAgIHRpbWVyX2Rpdl9zZXR0aW5nc1tmYXN0X3RpbWVyc19zdGFydGVkICUgTlVNX1RJTUVSX1NUQVRTXSA9IHRyaWc7CiAgIHRpbWVyX2RlbGF5X3NldHRpbmdzW2Zhc3RfdGltZXJzX3N0YXJ0ZWQgJSBOVU1fVElNRVJfU1RBVFNdID0gZGVsYXlfdXM7CiAKICAgLyogQWNrIGludGVycnVwdCAqLwogICBhY2tfaW50ci50cmlnID0gMTsKLSAgUkVHX1dSKHRpbWVyLCByZWdpX3RpbWVyLCByd19hY2tfaW50ciwgYWNrX2ludHIpOworCVJFR19XUih0aW1lciwgcmVnaV90aW1lcjAsIHJ3X2Fja19pbnRyLCBhY2tfaW50cik7CiAKICAgLyogU3RhcnQgdGltZXIgKi8KLSAgUkVHX1dSKHRpbWVyLCByZWdpX3RpbWVyLCByd190cmlnLCB0cmlnKTsKKwlSRUdfV1IodGltZXIsIHJlZ2lfdGltZXIwLCByd190cmlnLCB0cmlnKTsKICAgdHJpZ19jZmcudG1yID0gcmVna190aW1lcl90aW1lOwotICBSRUdfV1IodGltZXIsIHJlZ2lfdGltZXIsIHJ3X3RyaWdfY2ZnLCB0cmlnX2NmZyk7CisJUkVHX1dSKHRpbWVyLCByZWdpX3RpbWVyMCwgcndfdHJpZ19jZmcsIHRyaWdfY2ZnKTsKIAogICAvKiBDaGVjayBpZiB3ZSBoYXZlIGFscmVhZHkgcGFzc2VkIHRoZSB0cmlnIHRpbWUgKi8KLSAgcl90aW1lID0gUkVHX1JEKHRpbWVyLCByZWdpX3RpbWVyLCByX3RpbWUpOwotICBpZiAocl90aW1lIDwgdHJpZykgeworCXJfdGltZTEgPSBSRUdfUkQodGltZXIsIHJlZ2lfdGltZXIwLCByX3RpbWUpOworCXRpbWVfd3JhcCA9IHJfdGltZTEgPCByX3RpbWUwOworCisJaWYgKCh0cmlnX3dyYXAgJiYgIXRpbWVfd3JhcCkgfHwgKHJfdGltZTEgPCB0cmlnKSkgewogICAgIC8qIE5vLCBFbmFibGUgdHJpZyBpcnEgKi8KLSAgICBpbnRyX21hc2sgPSBSRUdfUkQodGltZXIsIHJlZ2lfdGltZXIsIHJ3X2ludHJfbWFzayk7CisJCWludHJfbWFzayA9IFJFR19SRCh0aW1lciwgcmVnaV90aW1lcjAsIHJ3X2ludHJfbWFzayk7CiAgICAgaW50cl9tYXNrLnRyaWcgPSAxOwotICAgIFJFR19XUih0aW1lciwgcmVnaV90aW1lciwgcndfaW50cl9tYXNrLCBpbnRyX21hc2spOworCQlSRUdfV1IodGltZXIsIHJlZ2lfdGltZXIwLCByd19pbnRyX21hc2ssIGludHJfbWFzayk7CiAgICAgZmFzdF90aW1lcnNfc3RhcnRlZCsrOwogICAgIGZhc3RfdGltZXJfcnVubmluZyA9IDE7Ci0gIH0KLSAgZWxzZQotICB7CisJfSBlbHNlIHsKICAgICAvKiBXZSBoYXZlIHBhc3NlZCB0aGUgdGltZSwgZGlzYWJsZSB0cmlnIHBvaW50LCBhY2sgaW50ciAqLwogICAgIHRyaWdfY2ZnLnRtciA9IHJlZ2tfdGltZXJfb2ZmOwotICAgIFJFR19XUih0aW1lciwgcmVnaV90aW1lciwgcndfdHJpZ19jZmcsIHRyaWdfY2ZnKTsKLSAgICBSRUdfV1IodGltZXIsIHJlZ2lfdGltZXIsIHJ3X2Fja19pbnRyLCBhY2tfaW50cik7Ci0gICAgLyogY2FsbCB0aGUgaW50IHJvdXRpbmUgZGlyZWN0bHkgKi8KLSAgICB0aW1lcl90cmlnX2hhbmRsZXIoKTsKKwkJUkVHX1dSKHRpbWVyLCByZWdpX3RpbWVyMCwgcndfdHJpZ19jZmcsIHRyaWdfY2ZnKTsKKwkJUkVHX1dSKHRpbWVyLCByZWdpX3RpbWVyMCwgcndfYWNrX2ludHIsIGFja19pbnRyKTsKKwkJLyogY2FsbCB0aGUgaW50IHJvdXRpbmUgKi8KKwkJSU5JVF9XT1JLKCZmYXN0X3dvcmssIHRpbWVyX3RyaWdfaGFuZGxlcik7CisJCXNjaGVkdWxlX3dvcmsoJmZhc3Rfd29yayk7CiAgIH0KIAogfQpAQCAtMzIwLDIyICsyMDMsMjAgQEAKICAgZG9fZ2V0dGltZW9mZGF5X2Zhc3QoJnQtPnR2X3NldCk7CiAgIHRtcCA9IGZhc3RfdGltZXJfbGlzdDsKIAotICBTQU5JVFlDSEVDSyh7IC8qIENoZWNrIHNvIHRoaXMgaXMgbm90IGluIHRoZSBsaXN0IGFscmVhZHkuLi4gKi8KLSAgICB3aGlsZSAodG1wICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKHRtcCA9PSB0KQotICAgICAgewotICAgICAgICBwcmludGsoInRpbWVyIG5hbWU6ICVzIGRhdGE6IDB4JTA4bFggYWxyZWFkeSBpbiBsaXN0IVxuIiwgbmFtZSwgZGF0YSk7Ci0gICAgICAgIHNhbml0eV9mYWlsZWQrKzsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0bXAgPSB0bXAtPm5leHQ7Ci0gICAgICB9Ci0gICAgfQotICAgIHRtcCA9IGZhc3RfdGltZXJfbGlzdDsKLSAgfSk7CisjaWZkZWYgRkFTVF9USU1FUl9TQU5JVFlfQ0hFQ0tTCisJLyogQ2hlY2sgc28gdGhpcyBpcyBub3QgaW4gdGhlIGxpc3QgYWxyZWFkeS4uLiAqLworCXdoaWxlICh0bXAgIT0gTlVMTCkgeworCQlpZiAodG1wID09IHQpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJInRpbWVyIG5hbWU6ICVzIGRhdGE6IDB4JTA4bFggYWxyZWFkeSAiCisJCQkJImluIGxpc3QhXG4iLCBuYW1lLCBkYXRhKTsKKwkJCXNhbml0eV9mYWlsZWQrKzsKKwkJCWdvdG8gZG9uZTsKKwkJfSBlbHNlCisJCQl0bXAgPSB0bXAtPm5leHQ7CisJfQorCXRtcCA9IGZhc3RfdGltZXJfbGlzdDsKKyNlbmRpZgogCiAgIHQtPmRlbGF5X3VzID0gZGVsYXlfdXM7CiAgIHQtPmZ1bmN0aW9uID0gZnVuY3Rpb247CkBAIC0zNDMsMTEgKzIyNCwxMCBAQAogICB0LT5uYW1lID0gbmFtZTsKIAogICB0LT50dl9leHBpcmVzLnR2X3VzZWMgPSB0LT50dl9zZXQudHZfdXNlYyArIGRlbGF5X3VzICUgMTAwMDAwMDsKLSAgdC0+dHZfZXhwaXJlcy50dl9zZWMgID0gdC0+dHZfc2V0LnR2X3NlYyAgKyBkZWxheV91cyAvIDEwMDAwMDA7Ci0gIGlmICh0LT50dl9leHBpcmVzLnR2X3VzZWMgPiAxMDAwMDAwKQotICB7CisJdC0+dHZfZXhwaXJlcy50dl9qaWZmID0gdC0+dHZfc2V0LnR2X2ppZmYgKyBkZWxheV91cyAvIDEwMDAwMDAgLyBIWjsKKwlpZiAodC0+dHZfZXhwaXJlcy50dl91c2VjID4gMTAwMDAwMCkgewogICAgIHQtPnR2X2V4cGlyZXMudHZfdXNlYyAtPSAxMDAwMDAwOwotICAgIHQtPnR2X2V4cGlyZXMudHZfc2VjKys7CisJCXQtPnR2X2V4cGlyZXMudHZfamlmZiArPSBIWjsKICAgfQogI2lmZGVmIEZBU1RfVElNRVJfTE9HCiAgIHRpbWVyX2FkZGVkX2xvZ1tmYXN0X3RpbWVyc19hZGRlZCAlIE5VTV9USU1FUl9TVEFUU10gPSAqdDsKQEAgLTM1NSwxNSArMjM1LDEyIEBACiAgIGZhc3RfdGltZXJzX2FkZGVkKys7CiAKICAgLyogQ2hlY2sgaWYgdGhpcyBzaG91bGQgdGltZW91dCBiZWZvcmUgYW55dGhpbmcgZWxzZSAqLwotICBpZiAodG1wID09IE5VTEwgfHwgdGltZXZhbF9jbXAoJnQtPnR2X2V4cGlyZXMsICZ0bXAtPnR2X2V4cGlyZXMpIDwgMCkKLSAgeworICBpZiAodG1wID09IE5VTEwgfHwgZmFzdHRpbWVfY21wKCZ0LT50dl9leHBpcmVzLCAmdG1wLT50dl9leHBpcmVzKSA8IDApIHsKICAgICAvKiBQdXQgZmlyc3QgaW4gbGlzdCBhbmQgbW9kaWZ5IHRoZSB0aW1lciB2YWx1ZSAqLwogICAgIHQtPnByZXYgPSBOVUxMOwogICAgIHQtPm5leHQgPSBmYXN0X3RpbWVyX2xpc3Q7CiAgICAgaWYgKGZhc3RfdGltZXJfbGlzdCkKLSAgICB7CiAgICAgICBmYXN0X3RpbWVyX2xpc3QtPnByZXYgPSB0OwotICAgIH0KICAgICBmYXN0X3RpbWVyX2xpc3QgPSB0OwogI2lmZGVmIEZBU1RfVElNRVJfTE9HCiAgICAgdGltZXJfc3RhcnRlZF9sb2dbZmFzdF90aW1lcnNfc3RhcnRlZCAlIE5VTV9USU1FUl9TVEFUU10gPSAqdDsKQEAgLTM3MiwxMCArMjQ5LDggQEAKICAgfSBlbHNlIHsKICAgICAvKiBQdXQgaW4gY29ycmVjdCBwbGFjZSBpbiBsaXN0ICovCiAgICAgd2hpbGUgKHRtcC0+bmV4dCAmJgotICAgICAgICAgICB0aW1ldmFsX2NtcCgmdC0+dHZfZXhwaXJlcywgJnRtcC0+bmV4dC0+dHZfZXhwaXJlcykgPiAwKQotICAgIHsKKyAgICAgICAgZmFzdHRpbWVfY21wKCZ0LT50dl9leHBpcmVzLCAmdG1wLT5uZXh0LT50dl9leHBpcmVzKSA+IDApCiAgICAgICB0bXAgPSB0bXAtPm5leHQ7Ci0gICAgfQogICAgIC8qIEluc2VydCB0IGFmdGVyIHRtcCAqLwogICAgIHQtPnByZXYgPSB0bXA7CiAgICAgdC0+bmV4dCA9IHRtcC0+bmV4dDsKQEAgLTM4OCw2ICsyNjMsNyBAQAogCiAgIEQyKHByaW50aygic3RhcnRfb25lX3Nob3RfdGltZXI6ICVkIHVzIGRvbmVcbiIsIGRlbGF5X3VzKSk7CiAKK2RvbmU6CiAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0gLyogc3RhcnRfb25lX3Nob3RfdGltZXIgKi8KIApAQCAtNDMxLDE5ICszMDcsMTggQEAKIC8qIFRpbWVyIGludGVycnVwdCBoYW5kbGVyIGZvciB0cmlnIGludGVycnVwdHMgKi8KIAogc3RhdGljIGlycXJldHVybl90Ci10aW1lcl90cmlnX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQordGltZXJfdHJpZ19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogICByZWdfdGltZXJfcl9tYXNrZWRfaW50ciBtYXNrZWRfaW50cjsKLQogICAvKiBDaGVjayBpZiB0aGUgdGltZXIgaW50ZXJydXB0IGlzIGZvciB1cyAoYSB0cmlnIGludCkgKi8KLSAgbWFza2VkX2ludHIgPSBSRUdfUkQodGltZXIsIHJlZ2lfdGltZXIsIHJfbWFza2VkX2ludHIpOworCW1hc2tlZF9pbnRyID0gUkVHX1JEKHRpbWVyLCByZWdpX3RpbWVyMCwgcl9tYXNrZWRfaW50cik7CiAgIGlmICghbWFza2VkX2ludHIudHJpZykKICAgICByZXR1cm4gSVJRX05PTkU7Ci0gIHRpbWVyX3RyaWdfaGFuZGxlcigpOworCXRpbWVyX3RyaWdfaGFuZGxlcihOVUxMKTsKICAgcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgdm9pZCB0aW1lcl90cmlnX2hhbmRsZXIodm9pZCkKK3N0YXRpYyB2b2lkIHRpbWVyX3RyaWdfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAgIHJlZ190aW1lcl9yd19hY2tfaW50ciBhY2tfaW50ciA9IHsgMCB9OwogICByZWdfdGltZXJfcndfaW50cl9tYXNrIGludHJfbWFzazsKQEAgLTQ1MSwzOCArMzI2LDQ1IEBACiAgIHN0cnVjdCBmYXN0X3RpbWVyICp0OwogICB1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJLyogV2Uga2VlcCBpbnRlcnJ1cHRzIGRpc2FibGVkIG5vdCBvbmx5IHdoZW4gd2UgbW9kaWZ5IHRoZQorCSAqIGZhc3QgdGltZXIgbGlzdCwgYnV0IGFueSB0aW1lIHdlIGhvbGQgYSByZWZlcmVuY2UgdG8gYQorCSAqIHRpbWVyIGluIHRoZSBsaXN0LCBzaW5jZSBkZWxfZmFzdF90aW1lciBtYXkgYmUgY2FsbGVkCisJICogZnJvbSAoYW5vdGhlcikgaW50ZXJydXB0IGNvbnRleHQuICBUaHVzLCB0aGUgb25seSB0aW1lCisJICogd2hlbiBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkIGlzIHdoZW4gY2FsbGluZyB0aGUgdGltZXIKKwkgKiBjYWxsYmFjayBmdW5jdGlvbi4KKwkgKi8KICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCiAgIC8qIENsZWFyIHRpbWVyIHRyaWcgaW50ZXJydXB0ICovCi0gIGludHJfbWFzayA9IFJFR19SRCh0aW1lciwgcmVnaV90aW1lciwgcndfaW50cl9tYXNrKTsKKwlpbnRyX21hc2sgPSBSRUdfUkQodGltZXIsIHJlZ2lfdGltZXIwLCByd19pbnRyX21hc2spOwogICBpbnRyX21hc2sudHJpZyA9IDA7Ci0gIFJFR19XUih0aW1lciwgcmVnaV90aW1lciwgcndfaW50cl9tYXNrLCBpbnRyX21hc2spOworICBSRUdfV1IodGltZXIsIHJlZ2lfdGltZXIwLCByd19pbnRyX21hc2ssIGludHJfbWFzayk7CiAKICAgLyogRmlyc3Qgc3RvcCB0aW1lciwgdGhlbiBhY2sgaW50ZXJydXB0ICovCiAgIC8qIFN0b3AgdGltZXIgKi8KICAgdHJpZ19jZmcudG1yID0gcmVna190aW1lcl9vZmY7Ci0gIFJFR19XUih0aW1lciwgcmVnaV90aW1lciwgcndfdHJpZ19jZmcsIHRyaWdfY2ZnKTsKKwlSRUdfV1IodGltZXIsIHJlZ2lfdGltZXIwLCByd190cmlnX2NmZywgdHJpZ19jZmcpOwogCiAgIC8qIEFjayBpbnRlcnJ1cHQgKi8KICAgYWNrX2ludHIudHJpZyA9IDE7Ci0gIFJFR19XUih0aW1lciwgcmVnaV90aW1lciwgcndfYWNrX2ludHIsIGFja19pbnRyKTsKKwlSRUdfV1IodGltZXIsIHJlZ2lfdGltZXIwLCByd19hY2tfaW50ciwgYWNrX2ludHIpOwogCiAgIGZhc3RfdGltZXJfcnVubmluZyA9IDA7CiAgIGZhc3RfdGltZXJfaW50cysrOwogCi0gIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlmYXN0X3RpbWVyX2Z1bmN0aW9uX3R5cGUgKmY7CisJdW5zaWduZWQgbG9uZyBkOwogCiAgIHQgPSBmYXN0X3RpbWVyX2xpc3Q7Ci0gIHdoaWxlICh0KQotICB7Ci0gICAgc3RydWN0IHRpbWV2YWwgdHY7CisJd2hpbGUgKHQpIHsKKwkJc3RydWN0IGZhc3R0aW1lX3QgdHY7CiAKICAgICAvKiBIYXMgaXQgcmVhbGx5IGV4cGlyZWQ/ICovCiAgICAgZG9fZ2V0dGltZW9mZGF5X2Zhc3QoJnR2KTsKLSAgICBEMShwcmludGsoInQ6ICVpcyAlMDZpdXNcbiIsIHR2LnR2X3NlYywgdHYudHZfdXNlYykpOworCQlEMShwcmludGsoS0VSTl9ERUJVRworCQkJInQ6ICVpcyAlMDZpdXNcbiIsIHR2LnR2X2ppZmYsIHR2LnR2X3VzZWMpKTsKIAotICAgIGlmICh0aW1ldmFsX2NtcCgmdC0+dHZfZXhwaXJlcywgJnR2KSA8PSAwKQotICAgIHsKKwkJaWYgKGZhc3R0aW1lX2NtcCgmdC0+dHZfZXhwaXJlcywgJnR2KSA8PSAwKSB7CiAgICAgICAvKiBZZXMgaXQgaGFzIGV4cGlyZWQgKi8KICNpZmRlZiBGQVNUX1RJTUVSX0xPRwogICAgICAgdGltZXJfZXhwaXJlZF9sb2dbZmFzdF90aW1lcnNfZXhwaXJlZCAlIE5VTV9USU1FUl9TVEFUU10gPSAqdDsKQEAgLTQ5MCw4NCArMzcyLDc3IEBACiAgICAgICBmYXN0X3RpbWVyc19leHBpcmVkKys7CiAKICAgICAgIC8qIFJlbW92ZSB0aGlzIHRpbWVyIGJlZm9yZSBjYWxsLCBzaW5jZSBpdCBtYXkgcmV1c2UgdGhlIHRpbWVyICovCi0gICAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAgICAgICBpZiAodC0+cHJldikKLSAgICAgIHsKICAgICAgICAgdC0+cHJldi0+bmV4dCA9IHQtPm5leHQ7Ci0gICAgICB9CiAgICAgICBlbHNlCi0gICAgICB7CiAgICAgICAgIGZhc3RfdGltZXJfbGlzdCA9IHQtPm5leHQ7Ci0gICAgICB9CiAgICAgICBpZiAodC0+bmV4dCkKLSAgICAgIHsKICAgICAgICAgdC0+bmV4dC0+cHJldiA9IHQtPnByZXY7Ci0gICAgICB9CiAgICAgICB0LT5wcmV2ID0gTlVMTDsKICAgICAgIHQtPm5leHQgPSBOVUxMOwotICAgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCi0gICAgICBpZiAodC0+ZnVuY3Rpb24gIT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgdC0+ZnVuY3Rpb24odC0+ZGF0YSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7CisJCQkvKiBTYXZlIGZ1bmN0aW9uIGNhbGxiYWNrIGRhdGEgYmVmb3JlIGVuYWJsaW5nCisJCQkgKiBpbnRlcnJ1cHRzLCBzaW5jZSB0aGUgdGltZXIgbWF5IGJlIHJlbW92ZWQgYW5kIHdlCisJCQkgKiBkb24ndCBrbm93IGhvdyBpdCB3YXMgYWxsb2NhdGVkIChlLmcuIC0+ZnVuY3Rpb24KKwkJCSAqIGFuZCAtPmRhdGEgbWF5IGJlY29tZSBvdmVyd3JpdHRlbiBhZnRlciBkZWxldGlvbgorCQkJICogaWYgdGhlIHRpbWVyIHdhcyBzdGFjay1hbGxvY2F0ZWQpLgorCQkJICovCisJCQlmID0gdC0+ZnVuY3Rpb247CisJCQlkID0gdC0+ZGF0YTsKKworCQkJaWYgKGYgIT0gTlVMTCkgeworCQkJCS8qIFJ1biB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBpbnRlcnJ1cHRzCisJCQkJICogZW5hYmxlZC4gKi8KKwkJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQkJZihkKTsKKwkJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCQl9IGVsc2UKICAgICAgICAgREVCVUdfTE9HKCIhdHJpbWVydHJpZyAlaSBmdW5jdGlvbj09TlVMTCFcbiIsIGZhc3RfdGltZXJfaW50cyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7CisJCX0gZWxzZSB7CiAgICAgICAvKiBUaW1lciBpcyB0byBlYXJseSwgbGV0J3Mgc2V0IGl0IGFnYWluIHVzaW5nIHRoZSBub3JtYWwgcm91dGluZXMgKi8KICAgICAgIEQxKHByaW50aygiLlxuIikpOwogICAgIH0KIAotICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLSAgICBpZiAoKHQgPSBmYXN0X3RpbWVyX2xpc3QpICE9IE5VTEwpCi0gICAgeworCQl0ID0gZmFzdF90aW1lcl9saXN0OworCQlpZiAodCAhPSBOVUxMKSB7CiAgICAgICAvKiBTdGFydCBuZXh0IHRpbWVyLi4gKi8KLSAgICAgIGxvbmcgdXM7Ci0gICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKwkJCWxvbmcgdXMgPSAwOworCQkJc3RydWN0IGZhc3R0aW1lX3QgdHY7CiAKICAgICAgIGRvX2dldHRpbWVvZmRheV9mYXN0KCZ0dik7Ci0gICAgICB1cyA9ICgodC0+dHZfZXhwaXJlcy50dl9zZWMgLSB0di50dl9zZWMpICogMTAwMDAwMCArCi0gICAgICAgICAgICB0LT50dl9leHBpcmVzLnR2X3VzZWMgLSB0di50dl91c2VjKTsKLSAgICAgIGlmICh1cyA+IDApCi0gICAgICB7Ci0gICAgICAgIGlmICghZmFzdF90aW1lcl9ydW5uaW5nKQotICAgICAgICB7CisKKwkJCS8qIHRpbWVfYWZ0ZXJfZXEgdGFrZXMgY2FyZSBvZiB3cmFwcGluZyAqLworCQkJaWYgKHRpbWVfYWZ0ZXJfZXEodC0+dHZfZXhwaXJlcy50dl9qaWZmLCB0di50dl9qaWZmKSkKKwkJCQl1cyA9ICgodC0+dHZfZXhwaXJlcy50dl9qaWZmIC0gdHYudHZfamlmZikgKgorCQkJCQkxMDAwMDAwIC8gSFogKyB0LT50dl9leHBpcmVzLnR2X3VzZWMgLQorCQkJCQl0di50dl91c2VjKTsKKworCQkJaWYgKHVzID4gMCkgeworCQkJCWlmICghZmFzdF90aW1lcl9ydW5uaW5nKSB7CiAjaWZkZWYgRkFTVF9USU1FUl9MT0cKICAgICAgICAgICB0aW1lcl9zdGFydGVkX2xvZ1tmYXN0X3RpbWVyc19zdGFydGVkICUgTlVNX1RJTUVSX1NUQVRTXSA9ICp0OwogI2VuZGlmCiAgICAgICAgICAgc3RhcnRfdGltZXJfdHJpZyh1cyk7CiAgICAgICAgIH0KLSAgICAgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKKwkJCX0gZWxzZSB7CiAgICAgICAgIC8qIFRpbWVyIGFscmVhZHkgZXhwaXJlZCwgbGV0J3MgaGFuZGxlIGl0IGJldHRlciBsYXRlIHRoYW4gbmV2ZXIuCiAgICAgICAgICAqIFRoZSBub3JtYWwgbG9vcCBoYW5kbGVzIGl0CiAgICAgICAgICAqLwogICAgICAgICBEMShwcmludGsoImUhICVkXG4iLCB1cykpOwogICAgICAgfQogICAgIH0KLSAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAgIH0KIAotICBpZiAoIXQpCi0gIHsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlpZiAoIXQpCiAgICAgRDEocHJpbnRrKCJ0dHJpZyBzdG9wIVxuIikpOwotICB9CiB9CiAKIHN0YXRpYyB2b2lkIHdha2VfdXBfZnVuYyh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0jaWZkZWYgREVDTEFSRV9XQUlUUVVFVUUKICAgd2FpdF9xdWV1ZV9oZWFkX3QgICpzbGVlcF93YWl0X3AgPSAod2FpdF9xdWV1ZV9oZWFkX3QqKWRhdGE7Ci0jZWxzZQotICBzdHJ1Y3Qgd2FpdF9xdWV1ZSAqKnNsZWVwX3dhaXRfcCA9IChzdHJ1Y3Qgd2FpdF9xdWV1ZSAqKilkYXRhOwotI2VuZGlmCiAgIHdha2VfdXAoc2xlZXBfd2FpdF9wKTsKIH0KIApAQCAtNTc3LDI4ICs0NTIsMTcgQEAKIHZvaWQgc2NoZWR1bGVfdXNsZWVwKHVuc2lnbmVkIGxvbmcgdXMpCiB7CiAgIHN0cnVjdCBmYXN0X3RpbWVyIHQ7Ci0jaWZkZWYgREVDTEFSRV9XQUlUUVVFVUUKICAgd2FpdF9xdWV1ZV9oZWFkX3Qgc2xlZXBfd2FpdDsKICAgaW5pdF93YWl0cXVldWVfaGVhZCgmc2xlZXBfd2FpdCk7Ci0gIHsKLSAgREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0jZWxzZQotICBzdHJ1Y3Qgd2FpdF9xdWV1ZSAqc2xlZXBfd2FpdCA9IE5VTEw7Ci0gIHN0cnVjdCB3YWl0X3F1ZXVlIHdhaXQgPSB7IGN1cnJlbnQsIE5VTEwgfTsKLSNlbmRpZgogCiAgIEQxKHByaW50aygic2NoZWR1bGVfdXNsZWVwKCVkKVxuIiwgdXMpKTsKLSAgYWRkX3dhaXRfcXVldWUoJnNsZWVwX3dhaXQsICZ3YWl0KTsKLSAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKICAgc3RhcnRfb25lX3Nob3RfdGltZXIoJnQsIHdha2VfdXBfZnVuYywgKHVuc2lnbmVkIGxvbmcpJnNsZWVwX3dhaXQsIHVzLAogICAgICAgICAgICAgICAgICAgICAgICAidXNsZWVwIik7Ci0gIHNjaGVkdWxlKCk7Ci0gIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0gIHJlbW92ZV93YWl0X3F1ZXVlKCZzbGVlcF93YWl0LCAmd2FpdCk7CisJLyogVW5pbnRlcnJ1cHRpYmxlIHNsZWVwIG9uIHRoZSBmYXN0IHRpbWVyLiAoVGhlIGNvbmRpdGlvbiBpcworCSAqIHNvbWV3aGF0IHJlZHVuZGFudCBzaW5jZSB0aGUgdGltZXIgaXMgd2hhdCB3YWtlcyB1cyB1cC4pICovCisJd2FpdF9ldmVudChzbGVlcF93YWl0LCAhZmFzdF90aW1lcl9wZW5kaW5nKCZ0KSk7CisKICAgRDEocHJpbnRrKCJkb25lIHNjaGVkdWxlX3VzbGVlcCglZClcbiIsIHVzKSk7Ci0jaWZkZWYgREVDTEFSRV9XQUlUUVVFVUUKLSAgfQotI2VuZGlmCiB9CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwpAQCAtNjE4LDIwICs0ODIsMjIgQEAKICAgdW5zaWduZWQgbG9uZyBmbGFnczsKICAgaW50IGkgPSAwOwogICBpbnQgbnVtX3RvX3Nob3c7Ci0gIHN0cnVjdCB0aW1ldmFsIHR2OworCXN0cnVjdCBmYXN0dGltZV90IHR2OwogICBzdHJ1Y3QgZmFzdF90aW1lciAqdCwgKm5leHR0OwogICBzdGF0aWMgY2hhciAqYmlnYnVmID0gTlVMTDsKICAgc3RhdGljIHVuc2lnbmVkIGxvbmcgdXNlZDsKIAotICBpZiAoIWJpZ2J1ZiAmJiAhKGJpZ2J1ZiA9IHZtYWxsb2MoQklHX0JVRl9TSVpFKSkpCi0gIHsKLSAgICB1c2VkID0gMDsKLSAgICBiaWdidWZbMF0gPSAnXDAnOwotICAgIHJldHVybiAwOwotICB9CisJaWYgKCFiaWdidWYpIHsKKwkJYmlnYnVmID0gdm1hbGxvYyhCSUdfQlVGX1NJWkUpOworCQlpZiAoIWJpZ2J1ZikgeworCQkJdXNlZCA9IDA7CisJCQlpZiAoYnVmKQorCQkJCWJ1ZlswXSA9ICdcMCc7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KIAotICBpZiAoIW9mZnNldCB8fCAhdXNlZCkKLSAgeworCWlmICghb2Zmc2V0IHx8ICF1c2VkKSB7CiAgICAgZG9fZ2V0dGltZW9mZGF5X2Zhc3QoJnR2KTsKIAogICAgIHVzZWQgPSAwOwpAQCAtNjQ4LDcgKzUxNCw3IEBACiAgICAgdXNlZCArPSBzcHJpbnRmKGJpZ2J1ZiArIHVzZWQsICJGYXN0IHRpbWVyIHJ1bm5pbmc6ICAgICVzXG4iLAogICAgICAgICAgICAgICAgICAgICBmYXN0X3RpbWVyX3J1bm5pbmcgPyAieWVzIiA6ICJubyIpOwogICAgIHVzZWQgKz0gc3ByaW50ZihiaWdidWYgKyB1c2VkLCAiQ3VycmVudCB0aW1lOiAgICAgICAgICAlbHUuJTA2bHVcbiIsCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXR2LnR2X3NlYywKKwkJCSh1bnNpZ25lZCBsb25nKXR2LnR2X2ppZmYsCiAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXR2LnR2X3VzZWMpOwogI2lmZGVmIEZBU1RfVElNRVJfU0FOSVRZX0NIRUNLUwogICAgIHVzZWQgKz0gc3ByaW50ZihiaWdidWYgKyB1c2VkLCAiU2FuaXR5IGZhaWxlZDogICAgICAgICAlaVxuIiwKQEAgLTY2MSwxMCArNTI3LDggQEAKICAgICAgIGludCBlbmRfaSA9IGRlYnVnX2xvZ19jbnQ7CiAgICAgICBpID0gMDsKIAotICAgICAgaWYgKGRlYnVnX2xvZ19jbnRfd3JhcHBlZCkKLSAgICAgIHsKKwkJCWlmIChkZWJ1Z19sb2dfY250X3dyYXBwZWQpCiAgICAgICAgIGkgPSBkZWJ1Z19sb2dfY250OwotICAgICAgfQogCiAgICAgICB3aGlsZSAoKGkgIT0gZW5kX2kgfHwgKGRlYnVnX2xvZ19jbnRfd3JhcHBlZCAmJiAhdXNlZCkpICYmCiAgICAgICAgICAgICAgdXNlZCsxMDAgPCBCSUdfQlVGX1NJWkUpCkBAIC02OTcsOSArNTYxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAiZDogJTZsaSB1cyBkYXRhOiAweCUwOGxYIgogICAgICAgICAgICAgICAgICAgICAgICJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgdC0+bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyl0LT50dl9zZXQudHZfc2VjLAorCQkJCSh1bnNpZ25lZCBsb25nKXQtPnR2X3NldC50dl9qaWZmLAogICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXQtPnR2X3NldC50dl91c2VjLAotICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXQtPnR2X2V4cGlyZXMudHZfc2VjLAorCQkJCSh1bnNpZ25lZCBsb25nKXQtPnR2X2V4cGlyZXMudHZfamlmZiwKICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyl0LT50dl9leHBpcmVzLnR2X3VzZWMsCiAgICAgICAgICAgICAgICAgICAgICAgdC0+ZGVsYXlfdXMsCiAgICAgICAgICAgICAgICAgICAgICAgdC0+ZGF0YQpAQCAtNzE5LDkgKzU4Myw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgImQ6ICU2bGkgdXMgZGF0YTogMHglMDhsWCIKICAgICAgICAgICAgICAgICAgICAgICAiXG4iLAogICAgICAgICAgICAgICAgICAgICAgIHQtPm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfc2V0LnR2X3NlYywKKwkJCQkodW5zaWduZWQgbG9uZyl0LT50dl9zZXQudHZfamlmZiwKICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyl0LT50dl9zZXQudHZfdXNlYywKLSAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyl0LT50dl9leHBpcmVzLnR2X3NlYywKKwkJCQkodW5zaWduZWQgbG9uZyl0LT50dl9leHBpcmVzLnR2X2ppZmYsCiAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfZXhwaXJlcy50dl91c2VjLAogICAgICAgICAgICAgICAgICAgICAgIHQtPmRlbGF5X3VzLAogICAgICAgICAgICAgICAgICAgICAgIHQtPmRhdGEKQEAgLTczOSw5ICs2MDMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICJkOiAlNmxpIHVzIGRhdGE6IDB4JTA4bFgiCiAgICAgICAgICAgICAgICAgICAgICAgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICB0LT5uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXQtPnR2X3NldC50dl9zZWMsCisJCQkJKHVuc2lnbmVkIGxvbmcpdC0+dHZfc2V0LnR2X2ppZmYsCiAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfc2V0LnR2X3VzZWMsCi0gICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfZXhwaXJlcy50dl9zZWMsCisJCQkJKHVuc2lnbmVkIGxvbmcpdC0+dHZfZXhwaXJlcy50dl9qaWZmLAogICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXQtPnR2X2V4cGlyZXMudHZfdXNlYywKICAgICAgICAgICAgICAgICAgICAgICB0LT5kZWxheV91cywKICAgICAgICAgICAgICAgICAgICAgICB0LT5kYXRhCkBAIC03NTIsMjYgKzYxNiwyNSBAQAogCiAgICAgdXNlZCArPSBzcHJpbnRmKGJpZ2J1ZiArIHVzZWQsICJBY3RpdmUgdGltZXJzOlxuIik7CiAgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKICAgICB0ID0gZmFzdF90aW1lcl9saXN0OwogICAgIHdoaWxlICh0ICE9IE5VTEwgJiYgKHVzZWQrMTAwIDwgQklHX0JVRl9TSVpFKSkKICAgICB7CiAgICAgICBuZXh0dCA9IHQtPm5leHQ7CiAgICAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAgICAgICB1c2VkICs9IHNwcmludGYoYmlnYnVmICsgdXNlZCwgIiUtMTRzIHM6ICU2bHUuJTA2bHUgZTogJTZsdS4lMDZsdSAiCi0gICAgICAgICAgICAgICAgICAgICAgImQ6ICU2bGkgdXMgZGF0YTogMHglMDhsWCIKLS8qICAgICAgICAgICAgICAgICAgICAgICIgZnVuYzogMHglMDhsWCIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAiXG4iLAotICAgICAgICAgICAgICAgICAgICAgIHQtPm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfc2V0LnR2X3NlYywKLSAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyl0LT50dl9zZXQudHZfdXNlYywKLSAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyl0LT50dl9leHBpcmVzLnR2X3NlYywKLSAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyl0LT50dl9leHBpcmVzLnR2X3VzZWMsCisJCQkiZDogJTZsaSB1cyBkYXRhOiAweCUwOGxYIgorLyoJCQkiIGZ1bmM6IDB4JTA4bFgiICovCisJCQkiXG4iLAorCQkJdC0+bmFtZSwKKwkJCSh1bnNpZ25lZCBsb25nKXQtPnR2X3NldC50dl9qaWZmLAorCQkJKHVuc2lnbmVkIGxvbmcpdC0+dHZfc2V0LnR2X3VzZWMsCisJCQkodW5zaWduZWQgbG9uZyl0LT50dl9leHBpcmVzLnR2X2ppZmYsCisJCQkodW5zaWduZWQgbG9uZyl0LT50dl9leHBpcmVzLnR2X3VzZWMsCiAgICAgICAgICAgICAgICAgICAgICAgdC0+ZGVsYXlfdXMsCiAgICAgICAgICAgICAgICAgICAgICAgdC0+ZGF0YQogLyogICAgICAgICAgICAgICAgICAgICAgLCB0LT5mdW5jdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICBsb2NhbF9pcnFfZGlzYWJsZSgpOworCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogICAgICAgaWYgKHQtPm5leHQgIT0gbmV4dHQpCiAgICAgICB7CiAgICAgICAgIHByaW50aygidGltZXIgcmVtb3ZlZCFcbiIpOwpAQCAtODAwLDcgKzY2Myw3IEBACiBzdGF0aWMgc3RydWN0IGZhc3RfdGltZXIgdHJbMTBdOwogc3RhdGljIGludCBleHBfbnVtWzEwXTsKIAotc3RhdGljIHN0cnVjdCB0aW1ldmFsIHR2X2V4cFsxMDBdOworc3RhdGljIHN0cnVjdCBmYXN0dGltZV90IHR2X2V4cFsxMDBdOwogCiBzdGF0aWMgdm9pZCB0ZXN0X3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQogewpAQCAtODM4LDcgKzcwMSw3IEBACiAgIGludCBwcmV2X251bTsKICAgaW50IGo7CiAKLSAgc3RydWN0IHRpbWV2YWwgdHYsIHR2MCwgdHYxLCB0djI7CisJc3RydWN0IGZhc3R0aW1lX3QgdHYsIHR2MCwgdHYxLCB0djI7CiAKICAgcHJpbnRrKCJmYXN0X3RpbWVyX3Rlc3QoKSBzdGFydFxuIik7CiAgIGRvX2dldHRpbWVvZmRheV9mYXN0KCZ0dik7CkBAIC04NTEsMjEgKzcxNCwyMiBAQAogICB7CiAgICAgZG9fZ2V0dGltZW9mZGF5X2Zhc3QoJnR2X2V4cFtqXSk7CiAgIH0KLSAgcHJpbnRrKCJmYXN0X3RpbWVyX3Rlc3QoKSAlaXMgJTA2aVxuIiwgdHYudHZfc2VjLCB0di50dl91c2VjKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgImZhc3RfdGltZXJfdGVzdCgpICVpcyAlMDZpXG4iLCB0di50dl9qaWZmLCB0di50dl91c2VjKTsKIAogICBmb3IgKGogPSAwOyBqIDwgMTAwMDsgaisrKQogICB7Ci0gICAgcHJpbnRrKCIlaSAlaSAlaSAlaSAlaVxuIixqX3Vbal0sIGpfdVtqKzFdLCBqX3VbaisyXSwgal91W2orM10sIGpfdVtqKzRdKTsKKyAgICBwcmludGsoS0VSTl9ERUJVRyAiJWkgJWkgJWkgJWkgJWlcbiIsCisgICAgICBqX3Vbal0sIGpfdVtqKzFdLCBqX3VbaisyXSwgal91W2orM10sIGpfdVtqKzRdKTsKICAgICBqICs9IDQ7CiAgIH0KICAgZm9yIChqID0gMDsgaiA8IDEwMDsgaisrKQogICB7Ci0gICAgcHJpbnRrKCIlaS4laSAlaS4laSAlaS4laSAlaS4laSAlaS4laVxuIiwKLSAgICAgICAgICAgdHZfZXhwW2pdLnR2X3NlYyx0dl9leHBbal0udHZfdXNlYywKLSAgICAgICAgICAgdHZfZXhwW2orMV0udHZfc2VjLHR2X2V4cFtqKzFdLnR2X3VzZWMsCi0gICAgICAgICAgIHR2X2V4cFtqKzJdLnR2X3NlYyx0dl9leHBbaisyXS50dl91c2VjLAotICAgICAgICAgICB0dl9leHBbaiszXS50dl9zZWMsdHZfZXhwW2orM10udHZfdXNlYywKLSAgICAgICAgICAgdHZfZXhwW2orNF0udHZfc2VjLHR2X2V4cFtqKzRdLnR2X3VzZWMpOworICAgIHByaW50ayhLRVJOX0RFQlVHICIlaS4laSAlaS4laSAlaS4laSAlaS4laSAlaS4laVxuIiwKKwkJCXR2X2V4cFtqXS50dl9qaWZmLCB0dl9leHBbal0udHZfdXNlYywKKwkJCXR2X2V4cFtqKzFdLnR2X2ppZmYsIHR2X2V4cFtqKzFdLnR2X3VzZWMsCisJCQl0dl9leHBbaisyXS50dl9qaWZmLCB0dl9leHBbaisyXS50dl91c2VjLAorCQkJdHZfZXhwW2orM10udHZfamlmZiwgdHZfZXhwW2orM10udHZfdXNlYywKKwkJCXR2X2V4cFtqKzRdLnR2X2ppZmYsIHR2X2V4cFtqKzRdLnR2X3VzZWMpOwogICAgIGogKz0gNDsKICAgfQogICBkb19nZXR0aW1lb2ZkYXlfZmFzdCgmdHYwKTsKQEAgLTg5MiwxNCArNzU2LDE1IEBACiAgIHdoaWxlIChudW1fdGVzdF90aW1lb3V0IDwgaSkKICAgewogICAgIGlmIChudW1fdGVzdF90aW1lb3V0ICE9IHByZXZfbnVtKQotICAgIHsKICAgICAgIHByZXZfbnVtID0gbnVtX3Rlc3RfdGltZW91dDsKLSAgICB9CiAgIH0KICAgZG9fZ2V0dGltZW9mZGF5X2Zhc3QoJnR2Mik7Ci0gIHByaW50aygiVGltZXJzIHN0YXJ0ZWQgICAgJWlzICUwNmlcbiIsIHR2MC50dl9zZWMsIHR2MC50dl91c2VjKTsKLSAgcHJpbnRrKCJUaW1lcnMgc3RhcnRlZCBhdCAlaXMgJTA2aVxuIiwgdHYxLnR2X3NlYywgdHYxLnR2X3VzZWMpOwotICBwcmludGsoIlRpbWVycyBkb25lICAgICAgICVpcyAlMDZpXG4iLCB0djIudHZfc2VjLCB0djIudHZfdXNlYyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiVGltZXJzIHN0YXJ0ZWQgICAgJWlzICUwNmlcbiIsCisJCXR2MC50dl9qaWZmLCB0djAudHZfdXNlYyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiVGltZXJzIHN0YXJ0ZWQgYXQgJWlzICUwNmlcbiIsCisJCXR2MS50dl9qaWZmLCB0djEudHZfdXNlYyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiVGltZXJzIGRvbmUgICAgICAgJWlzICUwNmlcbiIsCisJCXR2Mi50dl9qaWZmLCB0djIudHZfdXNlYyk7CiAgIERQKHByaW50aygiYnVmMDpcbiIpOwogICAgICBwcmludGsoYnVmMCk7CiAgICAgIHByaW50aygiYnVmMTpcbiIpOwpAQCAtOTIxLDkgKzc4Niw5IEBACiAgICAgcHJpbnRrKCIlLTEwcyBzZXQ6ICU2aXMgJTA2aXVzIGV4cDogJTZpcyAlMDZpdXMgIgogICAgICAgICAgICAiZGF0YTogMHglMDhYIGZ1bmM6IDB4JTA4WFxuIiwKICAgICAgICAgICAgdC0+bmFtZSwKLSAgICAgICAgICAgdC0+dHZfc2V0LnR2X3NlYywKKwkJCXQtPnR2X3NldC50dl9qaWZmLAogICAgICAgICAgICB0LT50dl9zZXQudHZfdXNlYywKLSAgICAgICAgICAgdC0+dHZfZXhwaXJlcy50dl9zZWMsCisJCQl0LT50dl9leHBpcmVzLnR2X2ppZmYsCiAgICAgICAgICAgIHQtPnR2X2V4cGlyZXMudHZfdXNlYywKICAgICAgICAgICAgdC0+ZGF0YSwKICAgICAgICAgICAgdC0+ZnVuY3Rpb24KQEAgLTkzMSwxMCArNzk2LDEyIEBACiAKICAgICBwcmludGsoIiAgICAgICAgICAgZGVsOiAlNml1cyAgICAgZGlkIGV4cDogJTZpcyAlMDZpdXMgYXMgIyVpIGVycm9yOiAlNmxpXG4iLAogICAgICAgICAgICB0LT5kZWxheV91cywKLSAgICAgICAgICAgdHZfZXhwW2pdLnR2X3NlYywKKwkJCXR2X2V4cFtqXS50dl9qaWZmLAogICAgICAgICAgICB0dl9leHBbal0udHZfdXNlYywKICAgICAgICAgICAgZXhwX251bVtqXSwKLSAgICAgICAgICAgKHR2X2V4cFtqXS50dl9zZWMgLSB0LT50dl9leHBpcmVzLnR2X3NlYykqMTAwMDAwMCArIHR2X2V4cFtqXS50dl91c2VjIC0gdC0+dHZfZXhwaXJlcy50dl91c2VjKTsKKwkJCSh0dl9leHBbal0udHZfamlmZiAtIHQtPnR2X2V4cGlyZXMudHZfamlmZikgKgorCQkJCTEwMDAwMDAgKyB0dl9leHBbal0udHZfdXNlYyAtCisJCQkJdC0+dHZfZXhwaXJlcy50dl91c2VjKTsKICAgfQogICBwcm9jX2Zhc3R0aW1lcl9yZWFkKGJ1ZjUsIE5VTEwsIDAsIDAsIDApOwogICBwcmludGsoImJ1ZjUgYWZ0ZXIgYWxsIGRvbmU6XG4iKTsKQEAgLTk0NCw3ICs4MTEsNyBAQAogI2VuZGlmCiAKIAotdm9pZCBmYXN0X3RpbWVyX2luaXQodm9pZCkKK2ludCBmYXN0X3RpbWVyX2luaXQodm9pZCkKIHsKICAgLyogRm9yIHNvbWUgcmVhc29uLCByZXF1ZXN0X2lycSgpIGhhbmdzIHdoZW4gY2FsbGVkIGZyb29tIHRpbWVfaW5pdCgpICovCiAgIGlmICghZmFzdF90aW1lcl9pc19pbml0KQpAQCAtOTUyLDE4ICs4MTksMjAgQEAKICAgICBwcmludGsoImZhc3RfdGltZXJfaW5pdCgpXG4iKTsKIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0gICBpZiAoKGZhc3R0aW1lcl9wcm9jX2VudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoICJmYXN0dGltZXIiLCAwLCAwICkpKQotICAgICBmYXN0dGltZXJfcHJvY19lbnRyeS0+cmVhZF9wcm9jID0gcHJvY19mYXN0dGltZXJfcmVhZDsKKyAgICBmYXN0dGltZXJfcHJvY19lbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJmYXN0dGltZXIiLCAwLCAwKTsKKyAgICBpZiAoZmFzdHRpbWVyX3Byb2NfZW50cnkpCisgICAgICBmYXN0dGltZXJfcHJvY19lbnRyeS0+cmVhZF9wcm9jID0gcHJvY19mYXN0dGltZXJfcmVhZDsKICNlbmRpZiAvKiBQUk9DX0ZTICovCi0gICAgaWYocmVxdWVzdF9pcnEoVElNRVJfSU5UUl9WRUNULCB0aW1lcl90cmlnX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwKLSAgICAgICAgICAgICAgICAgICAiZmFzdCB0aW1lciBpbnQiLCBOVUxMKSkKLSAgICB7Ci0gICAgICBwcmludGsoImVycjogdGltZXIxIGlycVxuIik7Ci0gICAgfQorCQlpZiAocmVxdWVzdF9pcnEoVElNRVIwX0lOVFJfVkVDVCwgdGltZXJfdHJpZ19pbnRlcnJ1cHQsCisJCQkJSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVELAorCQkJCSJmYXN0IHRpbWVyIGludCIsICZmYXN0X3RpbWVyX2xpc3QpKQorCQkJcHJpbnRrKEtFUk5fRVJSICJlcnI6IGZhc3R0aW1lciBpcnFcbiIpOwogICAgIGZhc3RfdGltZXJfaXNfaW5pdCA9IDE7CiAjaWZkZWYgRkFTVF9USU1FUl9URVNUCiAgICAgcHJpbnRrKCJkbyB0ZXN0XG4iKTsKICAgICBmYXN0X3RpbWVyX3Rlc3QoKTsKICNlbmRpZgogICB9CisJcmV0dXJuIDA7CiB9CitfX2luaXRjYWxsKGZhc3RfdGltZXJfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL2hlYWQuUyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvaGVhZC5TCmluZGV4IDIwYmQ4MGEuLjJkNjZhN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvaGVhZC5TCkBAIC00LDIyICs0LDI1IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIKICAqLwogCi0KICNkZWZpbmUgQVNTRU1CTEVSX01BQ1JPU19PTkxZCiAKIC8qCiAgKiBUaGUgbWFjcm9zIGZvdW5kIGluIG1tdV9kZWZzX2FzbS5oIHVzZXMgdGhlICMjIGNvbmNhdGVuYXRpb24gb3BlcmF0b3IsIHNvCiAgKiAtdHJhZGl0aW9uYWwgbXVzdCBub3QgYmUgdXNlZCB3aGVuIGFzc2VtYmxpbmcgdGhpcyBmaWxlLgogICovCi0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL3JlZ19yZHdyLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL2FzbS9tbXVfZGVmc19hc20uaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvYXNtL3JlZ19tYXBfYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL2FzbS9jb25maWdfZGVmc19hc20uaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvYXNtL2JpZl9jb3JlX2RlZnNfYXNtLmg+CisjaW5jbHVkZSA8aHdyZWdzL3JlZ19yZHdyLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtbWFwLmg+CisjaW5jbHVkZSA8aHdyZWdzL2ludHJfdmVjdC5oPgorI2luY2x1ZGUgPGh3cmVncy9hc20vbW11X2RlZnNfYXNtLmg+CisjaW5jbHVkZSA8aHdyZWdzL2FzbS9yZWdfbWFwX2FzbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21hY2gvc3RhcnR1cC5pbmM+CiAKICNkZWZpbmUgQ1JBTUZTX01BR0lDIDB4MjhjZDNkNDUKKyNkZWZpbmUgSkhFQURfTUFHSUMgMHgxRkY1MjhBNgorI2RlZmluZSBKSEVBRF9TSVpFIDgKICNkZWZpbmUgUkFNX0lOSVRfTUFHSUMgMHg1NjkwMjM4NwogI2RlZmluZSBDT01NQU5EX0xJTkVfTUFHSUMgMHg4NzEwOTU2MworI2RlZmluZSBOQU5EX0JPT1RfTUFHSUMgMHg5YTlkYjAwMQogCiAJOzsgTk9URTogUjggYW5kIFI5IGNhcnJ5IGluZm9ybWF0aW9uIGZyb20gdGhlIGRlY29tcHJlc3NvciAoaWYgdGhlCiAJOzsga2VybmVsIHdhcyBjb21wcmVzc2VkKS4gVGhleSBtdXN0IG5vdCBiZSB1c2VkIGluIHRoZSBjb2RlIGJlbG93CkBAIC0zMCwxMiArMzMsMTEgQEAKIAkuZ2xvYmFsIHJvbWZzX3N0YXJ0CiAJLmdsb2JhbCByb21mc19sZW5ndGgKIAkuZ2xvYmFsIHJvbWZzX2luX2ZsYXNoCisJLmdsb2JhbCBuYW5kX2Jvb3QKIAkuZ2xvYmFsIHN3YXBwZXJfcGdfZGlyCi0JLmdsb2JhbCBjcmlzdjMyX25hbmRfYm9vdAotCS5nbG9iYWwgY3Jpc3YzMl9uYW5kX2NyYW1mc19vZmZzZXQKIAogCTs7IER1bW15IHNlY3Rpb24gdG8gbWFrZSBpdCBib290YWJsZSB3aXRoIGN1cnJlbnQgVkNTIHNpbXVsYXRvcgotI2lmZGVmIENPTkZJR19FVFJBWEZTX1NJTQorI2lmZGVmIENPTkZJR19FVFJBWF9WQ1NfU0lNCiAJLnNlY3Rpb24gIi5ib290IiwgImF4IgogCWJhIHRzdGFydAogCW5vcApAQCAtNTEsMzMgKzUzLDE1IEBACiAJOzsKIAlkaQogCi0JOzsgU3RhcnQgY2xvY2tzIGZvciB1c2VkIGJsb2Nrcy4KLQltb3ZlLmQgUkVHX0FERFIoY29uZmlnLCByZWdpX2NvbmZpZywgcndfY2xrX2N0cmwpLCAkcjEKLQltb3ZlLmQgWyRyMV0sICRyMAotCW9yLmQgICBSRUdfU1RBVEUoY29uZmlnLCByd19jbGtfY3RybCwgY3B1LCB5ZXMpIHwgXAotCSAgICAgICBSRUdfU1RBVEUoY29uZmlnLCByd19jbGtfY3RybCwgYmlmLCB5ZXMpIHwgXAotCSAgICAgICBSRUdfU1RBVEUoY29uZmlnLCByd19jbGtfY3RybCwgZml4X2lvLCB5ZXMpLCAkcjAKLQltb3ZlLmQgJHIwLCBbJHIxXQorCVNUQVJUX0NMT0NLUwogCi0JOzsgU2V0IHVwIHdhaXRzdGF0ZXMgZXRjCi0JbW92ZS5kICAgUkVHX0FERFIoYmlmX2NvcmUsIHJlZ2lfYmlmX2NvcmUsIHJ3X2dycDFfY2ZnKSwgJHIwCi0JbW92ZS5kICAgQ09ORklHX0VUUkFYX01FTV9HUlAxX0NPTkZJRywgJHIxCi0JbW92ZS5kICAgJHIxLCBbJHIwXQotCW1vdmUuZCAgIFJFR19BRERSKGJpZl9jb3JlLCByZWdpX2JpZl9jb3JlLCByd19ncnAyX2NmZyksICRyMAotCW1vdmUuZCAgIENPTkZJR19FVFJBWF9NRU1fR1JQMl9DT05GSUcsICRyMQotCW1vdmUuZCAgICRyMSwgWyRyMF0KLQltb3ZlLmQgICBSRUdfQUREUihiaWZfY29yZSwgcmVnaV9iaWZfY29yZSwgcndfZ3JwM19jZmcpLCAkcjAKLQltb3ZlLmQgICBDT05GSUdfRVRSQVhfTUVNX0dSUDNfQ09ORklHLCAkcjEKLQltb3ZlLmQgICAkcjEsIFskcjBdCi0JbW92ZS5kICAgUkVHX0FERFIoYmlmX2NvcmUsIHJlZ2lfYmlmX2NvcmUsIHJ3X2dycDRfY2ZnKSwgJHIwCi0JbW92ZS5kICAgQ09ORklHX0VUUkFYX01FTV9HUlA0X0NPTkZJRywgJHIxCi0JbW92ZS5kICAgJHIxLCBbJHIwXQorCVNFVFVQX1dBSVRfU1RBVEVTCiAKLSNpZmRlZiBDT05GSUdfRVRSQVhGU19TSU0KLQk7OyBTZXQgdXAgbWluaW1hbCBmbGFzaCB3YWl0c3RhdGVzCi0JbW92ZS5kIDAsICRyMTAKLQltb3ZlLmQgUkVHX0FERFIoYmlmX2NvcmUsIHJlZ2lfYmlmX2NvcmUsIHJ3X2dycDFfY2ZnKSwgJHIxMQotCW1vdmUuZCAkcjEwLCBbJHIxMV0KKwlHSU9fSU5JVAorCisjaWZkZWYgQ09ORklHX1NNUAorc2Vjb25kYXJ5X2NwdV9lbnRyeTogLyogRW50cnkgcG9pbnQgZm9yIHNlY29uZGFyeSBDUFVzICovCisJZGkKICNlbmRpZgogCiAJOzsgU2V0dXAgYW5kIGVuYWJsZSB0aGUgTU1VLiBVc2Ugc2FtZSBjb25maWd1cmF0aW9uIGZvciBib3RoIHRoZSBkYXRhCkBAIC04NSw3ICs2OSw3IEBACiAJOzsKIAk7OyBOb3RlOyAzIGN5Y2xlcyBpcyBuZWVkZWQgZm9yIGEgYmFuay1zZWxlY3QgdG8gdGFrZSBlZmZlY3QuIEZ1cnRoZXI7CiAJOzsgYmFuayAxIGlzIHRoZSBpbnN0cnVjdGlvbiBNTVUsIGJhbmsgMiBpcyB0aGUgZGF0YSBNTVUuCi0jaWZuZGVmIENPTkZJR19FVFJBWEZTX1NJTQorI2lmbmRlZiBDT05GSUdfRVRSQVhfVkNTX1NJTQogCW1vdmUuZAlSRUdfRklFTEQobW11LCByd19tbV9rYmFzZV9oaSwgYmFzZV9lLCA4KQlcCiAJCXwgUkVHX0ZJRUxEKG1tdSwgcndfbW1fa2Jhc2VfaGksIGJhc2VfYywgNCkJXAogCQl8IFJFR19GSUVMRChtbXUsIHJ3X21tX2tiYXNlX2hpLCBiYXNlX2IsIDB4YiksICRyMApAQCAtOTMsNyArNzcsNyBAQAogCTs7IE1hcCB0aGUgdmlydHVhbCBEUkFNIHRvIHRoZSBSVyBlcHJvbSBhcmVhIGF0IGFkZHJlc3MgMC4KIAk7OyBBbHNvIG1hcCAweGEgZm9yIHRoZSBob29rIGNhbGxzLAogCW1vdmUuZAlSRUdfRklFTEQobW11LCByd19tbV9rYmFzZV9oaSwgYmFzZV9lLCA4KQlcCi0JCXwgUkVHX0ZJRUxEKG1tdSwgcndfbW1fa2Jhc2VfaGksIGJhc2VfYywgMCkJXAorCQl8IFJFR19GSUVMRChtbXUsIHJ3X21tX2tiYXNlX2hpLCBiYXNlX2MsIDQpCVwKIAkJfCBSRUdfRklFTEQobW11LCByd19tbV9rYmFzZV9oaSwgYmFzZV9iLCAweGIpICAgXAogCQl8IFJFR19GSUVMRChtbXUsIHJ3X21tX2tiYXNlX2hpLCBiYXNlX2EsIDB4YSksICRyMAogI2VuZGlmCkBAIC0xMDQsNyArODgsNyBAQAogCiAJOzsgRW5hYmxlIGNlcnRhaW4gcGFnZSBwcm90ZWN0aW9ucyBhbmQgc2V0dXAgbGluZWFyIG1hcHBpbmcKIAk7OyBmb3IgZixlLGMsYiw0LDAuCi0jaWZuZGVmIENPTkZJR19FVFJBWEZTX1NJTQorI2lmbmRlZiBDT05GSUdfRVRSQVhfVkNTX1NJTQogCW1vdmUuZAlSRUdfU1RBVEUobW11LCByd19tbV9jZmcsIHdlLCBvbikJCVwKIAkJfCBSRUdfU1RBVEUobW11LCByd19tbV9jZmcsIGFjYywgb24pCQlcCiAJCXwgUkVHX1NUQVRFKG1tdSwgcndfbW1fY2ZnLCBleCwgb24pCQlcCkBAIC0xODMsMTcgKzE2NywxMSBAQAogCW5vcAogCW5vcAogCW5vcAotCW1vdmUgICAgJHMxMCwgJHIwCisJbW92ZSAgICAkczEyLCAkcjAKIAljbXBxICAgIDAsICRyMAogCWJlcQltYXN0ZXJfY3B1CiAJbm9wCiBzbGF2ZV9jcHU6Ci0JOyBBIHNsYXZlIHdhaXRzIGZvciBjcHVfbm93X2Jvb3RpbmcgdG8gYmUgZXF1YWwgdG8gQ1BVIElELgotCW1vdmUuZAljcHVfbm93X2Jvb3RpbmcsICRyMQotc2xhdmVfd2FpdDoKLQljbXAuZAlbJHIxXSwgJHIwCi0JYm5lCXNsYXZlX3dhaXQKLQlub3AKIAk7IFRpbWUgdG8gYm9vdC11cC4gR2V0IHN0YWNrIGxvY2F0aW9uIHByb3ZpZGVkIGJ5IG1hc3RlciBDUFUuCiAJbW92ZS5kICBzbXBfaW5pdF9jdXJyZW50X2lkbGVfdGhyZWFkLCAkcjEKIAltb3ZlLmQgIFskcjFdLCAkc3AKQEAgLTIwMyw5ICsxODEsMTYgQEAKIAlqc3IJc21wX2NhbGxpbgogCW5vcAogbWFzdGVyX2NwdToKKwkvKiBTZXQgdXAgZW50cnkgcG9pbnQgZm9yIHNlY29uZGFyeSBDUFVzLiBUaGUgYm9vdCBST00gaGFzIHNldCB1cAorCSAqIEVCUCBhdCBzdGFydCBvZiBpbnRlcm5hbCBtZW1vcnkuIFRoZSBDUFUgd2lsbCBnZXQgdGhlcmUKKwkgKiBsYXRlciB3aGVuIHdlIGlzc3VlIGFuIElQSSB0byB0aGVtLi4uICovCisJbW92ZS5kIE1FTV9JTlRNRU1fU1RBUlQgKyBJUElfSU5UUl9WRUNUICogNCwgJHIwCisJbW92ZS5kIHNlY29uZGFyeV9jcHVfZW50cnksICRyMQorCW1vdmUuZCAkcjEsIFskcjBdCiAjZW5kaWYKLSNpZm5kZWYgQ09ORklHX0VUUkFYRlNfU0lNCi0JOzsgQ2hlY2sgaWYgc3RhcnRpbmcgZnJvbSBEUkFNIG9yIGZsYXNoLgorI2lmbmRlZiBDT05GSUdfRVRSQVhfVkNTX1NJTQorCTsgQ2hlY2sgaWYgc3RhcnRpbmcgZnJvbSBEUkFNIChuZXR3b3JrLT5SQU0gYm9vdCBvciB1bnBhY2tlZAorCTsgY29tcHJlc3NlZCBrZXJuZWwpLCBvciBkaXJlY3RseSBmcm9tIGZsYXNoLgogCWxhcGNxCS4sICRyMAogCWFuZC5kCTB4N2ZmZmZmZmYsICRyMCA7IE1hc2sgb2ZmIHRoZSBub24tY2FjaGUgYml0LgogCWNtcC5kCTB4MTAwMDAsICRyMAk7IEFyYml0cmFyeSwgc29tZXRoaW5nIGFib3ZlIHRoaXMgY29kZS4KQEAgLTIzMiwxMiArMjE3LDEzIEBACiAJYmVxCV9kcmFtX2luaXRpYWxpemVkCiAJbm9wCiAKLSNpbmNsdWRlICIuLi9saWIvZHJhbV9pbml0LlMiCisjaW5jbHVkZSAiLi4vbWFjaC9kcmFtX2luaXQuUyIKIAogX2RyYW1faW5pdGlhbGl6ZWQ6CiAJOzsgQ29weSB0aGUgdGV4dCBhbmQgZGF0YSBzZWN0aW9uIHRvIERSQU0uIFRoaXMgZGVwZW5kcyBvbiB0aGF0IHRoZQogCTs7IHZhcmlhYmxlcyB1c2VkIGJlbG93IGFyZSBjb3JyZWN0bHkgc2V0IHVwIGJ5IHRoZSBsaW5rZXIgc2NyaXB0LgogCTs7IFRoZSBjYWxjdWxhdGVkIHZhbHVlIHN0b3JlZCBpbiBSNCBpcyB1c2VkIGJlbG93LgorCTs7IExlYXZlIHRoZSBjcmFtZnMgZmlsZSBzeXN0ZW0gKHBpZ2d5YmFja2VkIGFmdGVyIHRoZSBrZXJuZWwpIGluIGZsYXNoLgogCW1vdmVxCTAsICRyMAkJOyBTb3VyY2UuCiAJbW92ZS5kCXRleHRfc3RhcnQsICRyMQk7IERlc3RpbmF0aW9uLgogCW1vdmUuZAlfX3ZtbGludXhfZW5kLCAkcjIKQEAgLTI0OSw3ICsyMzUsNyBAQAogCWJsbwkxYgogCW5vcAogCi0JOzsgS2VlcCBDUkFNRlMgaW4gZmxhc2guCisJOzsgQ2hlY2sgZm9yIGNyYW1mcy4KIAltb3ZlcQkwLCAkcjAKIAltb3ZlLmQJcm9tZnNfbGVuZ3RoLCAkcjEKIAltb3ZlLmQJJHIwLCBbJHIxXQpAQCAtMjU4LDYgKzI0NCw3IEBACiAJYm5lIDFmCiAJbm9wCiAKKwk7OyBTZXQgbGVuZ3RoIGFuZCBzdGFydCBvZiBjcmFtZnMsIHNldCByb21mc19pbl9mbGFzaCBmbGFnCiAJYWRkb3EJKzQsICRyNCwgJGFjcgogCW1vdmUuZAlbJGFjcl0sICRyMAogCW1vdmUuZAlyb21mc19sZW5ndGgsICRyMQpAQCAtMjczLDM1ICsyNjAsMzIgQEAKIAlub3AKIAogX2lucmFtOgotCTs7IENoZWNrIGlmIGJvb3RpbmcgZnJvbSBOQU5EIGZsYXNoIChpbiB0aGF0IGNhc2Ugd2UganVzdCByZW1lbWJlciB0aGUgb2Zmc2V0Ci0JOzsgaW50byB0aGUgZmxhc2ggd2hlcmUgY3JhbWZzIHNob3VsZCBiZSkuCi0JbW92ZS5kCVJFR19BRERSKGNvbmZpZywgcmVnaV9jb25maWcsIHJfYm9vdHNlbCksICRyMAotCW1vdmUuZAlbJHIwXSwgJHIwCi0JYW5kLmQJUkVHX01BU0soY29uZmlnLCByX2Jvb3RzZWwsIGJvb3RfbW9kZSksICRyMAotCWNtcC5kCVJFR19TVEFURShjb25maWcsIHJfYm9vdHNlbCwgYm9vdF9tb2RlLCBuYW5kKSwgJHIwCi0JYm5lCW1vdmVfY3JhbWZzCi0JbW92ZXEJMSwkcjAKLQltb3ZlLmQJY3Jpc3YzMl9uYW5kX2Jvb3QsICRyMQotCW1vdmUuZAkkcjAsIFskcjFdCi0JbW92ZS5kCWNyaXN2MzJfbmFuZF9jcmFtZnNfb2Zmc2V0LCAkcjEKLQltb3ZlLmQJJHI5LCBbJHIxXQorCTs7IENoZWNrIGlmIGJvb3RpbmcgZnJvbSBOQU5EIGZsYXNoOyBpZiBzbywgc2V0IGFwcHJvcHJpYXRlIGZsYWdzCisJOzsgYW5kIG1vdmUgb24uCisJY21wLmQJTkFORF9CT09UX01BR0lDLCAkcjEyCisJYm5lCW1vdmVfY3JhbWZzCTsgbm90IG5hbmQsIGp1bXAKIAltb3ZlcQkxLCAkcjAKLQltb3ZlLmQJcm9tZnNfaW5fZmxhc2gsICRyMQorCW1vdmUuZAluYW5kX2Jvb3QsICRyMQk7IHRlbGwgYXhpc2ZsYXNobWFwIHdlJ3JlIGJvb3RpbmcgZnJvbSBOQU5ECiAJbW92ZS5kCSRyMCwgWyRyMV0KLQlqdW1wCV9zdGFydF9pdAorCW1vdmVxCTAsICRyMAkJOyB0ZWxsIGF4aXNmbGFzaG1hcCByb21mcyBpcyBub3QgaW4KKwltb3ZlLmQJcm9tZnNfaW5fZmxhc2gsICRyMSA7IChkaXJlY3RseSBhY2Nlc3NlZCkgZmxhc2gKKwltb3ZlLmQJJHIwLCBbJHIxXQorCWp1bXAJX3N0YXJ0X2l0CTsgY29udGludWUgd2l0aCBib290CiAJbm9wCiAKIG1vdmVfY3JhbWZzOgotCTs7IE1vdmUgdGhlIGNyYW1mcyBhZnRlciBCU1MuCisJOzsga2VybmVsIGlzIGluIERSQU0uCisJOzsgTXVzdCBmaWd1cmUgb3V0IGlmIHRoZXJlIGlzIGEgcGlnZ3liYWNrZWQgcm9vdGZzIGltYWdlIG9yIG5vdC4KKwk7OyBTZXQgcm9tZnNfbGVuZ3RoIHRvIDAgPT4gbm8gcm9vdGZzIGltYWdlIGF2YWlsYWJsZSBieSBkZWZhdWx0LgogCW1vdmVxCTAsICRyMAogCW1vdmUuZAlyb21mc19sZW5ndGgsICRyMQogCW1vdmUuZAkkcjAsIFskcjFdCiAKLSNpZm5kZWYgQ09ORklHX0VUUkFYRlNfU0lNCisjaWZuZGVmIENPTkZJR19FVFJBWF9WQ1NfU0lNCiAJOzsgVGhlIGtlcm5lbCBjb3VsZCBoYXZlIGJlZW4gdW5wYWNrZWQgdG8gRFJBTSBieSB0aGUgbG9hZGVyLCBidXQKLQk7OyB0aGUgY3JhbWZzIGltYWdlIGNvdWxkIHN0aWxsIGJlIGludGUgdGhlIGZsYXNoIGltbWVkaWF0ZWx5Ci0JOzsgZm9sbG93aW5nIHRoZSBjb21wcmVzc2VkIGtlcm5lbCBpbWFnZS4gVGhlIGxvYWRlZCBwYXNzZXMgdGhlIGFkZHJlc3MKLQk7OyBvZiB0aGUgYnV0ZSBzdWNjZWVkaW5nIHRoZSBsYXN0IGNvbXByZXNzZWQgYnl0ZSBpbiB0aGUgZmxhc2ggaW4KKwk7OyB0aGUgY3JhbWZzIGltYWdlIGNvdWxkIHN0aWxsIGJlIGluIHRoZSBmbGFzaCBpbW1lZGlhdGVseQorCTs7IGZvbGxvd2luZyB0aGUgY29tcHJlc3NlZCBrZXJuZWwgaW1hZ2UuIFRoZSBsb2FkZXIgcGFzc2VzIHRoZSBhZGRyZXNzCisJOzsgb2YgdGhlIGJ5dGUgc3VjY2VlZGluZyB0aGUgbGFzdCBjb21wcmVzc2VkIGJ5dGUgaW4gdGhlIGZsYXNoIGluCiAJOzsgcmVnaXN0ZXIgUjkgd2hlbiBzdGFydGluZyB0aGUga2VybmVsLgogCWNtcC5kCTB4MGZmZmZmZjgsICRyOQogCWJocwlfbm9fcm9tZnNfaW5fZmxhc2ggOyBSOSBwb2ludHMgb3V0c2lkZSB0aGUgZmxhc2ggYXJlYS4KQEAgLTMxMCwxMSArMjk0LDEzIEBACiAJYmEgX25vX3JvbWZzX2luX2ZsYXNoCiAJbm9wCiAjZW5kaWYKKwk7OyBjcmFtZnMgcm9vdGZzIG1pZ2h0IHRvIGJlIGluIGZsYXNoLiBDaGVjayBmb3IgaXQuCiAJbW92ZS5kCVskcjldLCAkcjAJOyBjcmFtZnNfc3VwZXIubWFnaWMKIAljbXAuZAlDUkFNRlNfTUFHSUMsICRyMAogCWJuZQlfbm9fcm9tZnNfaW5fZmxhc2gKIAlub3AKIAorCTs7IGZvdW5kIGNyYW1mcyBpbiBmbGFzaC4gc2V0IGFkZHJlc3MgYW5kIHNpemUsIGFuZCByb21mc19pbl9mbGFzaCBmbGFnLgogCWFkZG9xCSs0LCAkcjksICRhY3IKIAltb3ZlLmQJWyRhY3JdLCAkcjAKIAltb3ZlLmQJcm9tZnNfbGVuZ3RoLCAkcjEKQEAgLTMzMCwyNyArMzE2LDQzIEBACiAJbm9wCiAKIF9ub19yb21mc19pbl9mbGFzaDoKLQk7OyBMb29rIGZvciBjcmFtZnMuCisJOzsgTm8gcm9tZnMgaW4gZmxhc2gsIHNvIGxvb2sgZm9yIGNyYW1mcywgb3IgamZmczIgd2l0aCBqaGVhZCwKKwk7OyBhZnRlciBrZXJuZWwgaW4gUkFNLCBhcyBpcyB0aGUgY2FzZSB3aXRoIG5ldHdvcmstPlJBTSBib290LgorCTs7IEZvciBjcmFtZnMsIHBhcnRpdGlvbiBzdGFydHMgd2l0aCBtYWdpYyBhbmQgbGVuZ3RoLgorCTs7IEZvciBqZmZzMiwgYSBqaGVhZCBpcyBwcmVwZW5kZWQgd2hpY2ggY29udGFpbnMgd2l0aCBtYWdpYyBhbmQgbGVuZ3RoLgorCTs7IFRoZSBqaGVhZCBpcyBub3QgcGFydCBvZiB0aGUgamZmczIgcGFydGl0aW9uIGhvd2V2ZXIuCiAjaWZuZGVmIENPTkZJR19FVFJBWEZTX1NJTQogCW1vdmUuZAlfX3ZtbGludXhfZW5kLCAkcjAKICNlbHNlCiAJbW92ZS5kCV9fZW5kLCAkcjAKICNlbmRpZgogCW1vdmUuZAlbJHIwXSwgJHIxCi0JY21wLmQJQ1JBTUZTX01BR0lDLCAkcjEKLQlibmUJMmYKKwljbXAuZAlDUkFNRlNfTUFHSUMsICRyMSA7IGNyYW1mcyBtYWdpYz8KKwliZXEJMmYJCSAgOyB5ZXMsIGp1bXAKIAlub3AKKwljbXAuZAlKSEVBRF9NQUdJQywgJHIxIDsgamZmczIgKGpoZWFkKSBtYWdpYz8KKwlibmUJNGYJCTsgbm8sIHNraXAgY29weQorCW5vcAorCWFkZHEJNCwgJHIwCQk7IGxvY2F0aW9uIG9mIGpmZnMyIHNpemUKKwltb3ZlLmQJWyRyMCtdLCAkcjIJOyBmZXRjaCBqZmZzMiBzaXplIC0+IHIyCisJCQkJOyByMCBub3cgcG9pbnRzIHRvIHN0YXJ0IG9mIGpmZnMyCisJYmEJM2YKKwlub3AKKzI6CisJYWRkb3EJKzQsICRyMCwgJGFjcgk7IGxvY2F0aW9uIG9mIGNyYW1mcyBzaXplCisJbW92ZS5kCVskYWNyXSwgJHIyCTsgZmV0Y2ggY3JhbWZzIHNpemUgLT4gcjIKKwkJCQk7IHIwIHN0aWxsIHBvaW50cyB0byBzdGFydCBvZiBjcmFtZnMKKzM6CisJOzsgTm93LCBtb3ZlIHRoZSByb290IGZzIHRvIGFmdGVyIGtlcm5lbCdzIEJTUwogCi0JYWRkb3EJKzQsICRyMCwgJGFjcgotCW1vdmUuZAlbJGFjcl0sICRyMgotCW1vdmUuZAlfZW5kLCAkcjEKKwltb3ZlLmQJX2VuZCwgJHIxCTsgc3RhcnQgb2YgY3JhbWZzIC0+IHIxCiAJbW92ZS5kCXJvbWZzX3N0YXJ0LCAkcjMKLQltb3ZlLmQJJHIxLCBbJHIzXQorCW1vdmUuZAkkcjEsIFskcjNdCTsgc3RvcmUgYXQgcm9tZnNfc3RhcnQgKGZvciBheGlzZmxhc2htYXApCiAJbW92ZS5kCXJvbWZzX2xlbmd0aCwgJHIzCi0JbW92ZS5kCSRyMiwgWyRyM10KKwltb3ZlLmQJJHIyLCBbJHIzXQk7IHN0b3JlIHNpemUgYXQgcm9tZnNfbGVuZ3RoCiAKLSNpZm5kZWYgQ09ORklHX0VUUkFYRlNfU0lNCi0JYWRkLmQJJHIyLCAkcjAKKyNpZm5kZWYgQ09ORklHX0VUUkFYX1ZDU19TSU0KKwlhZGQuZAkkcjIsICRyMAk7IGNvcHkgZnJvbSBlbmQgYW5kIGRvd253YXJkcwogCWFkZC5kCSRyMiwgJHIxCiAKIAlsc3JxCTEsICRyMgkJOyBTaXplIGlzIGluIGJ5dGVzLCB3ZSBjb3B5IHdvcmRzLgpAQCAtMzY1LDEwICszNjcsMTcgQEAKIAlub3AKICNlbmRpZgogCi0yOgorNDoKKwk7OyBCU1MgbW92ZSBkb25lLgorCTs7IENsZWFyIHJvbWZzX2luX2ZsYXNoIGZsYWcsIGFzIHdlIG5vdyBrbm93IHJvbWZzIGlzIGluIERSQU0KKwk7OyBBbHNvIGNsZWFyIG5hbmRfYm9vdCBmbGFnOyBpZiB3ZSBnb3QgaGVyZSwgd2Uga25vdyB3ZSd2ZSBub3QKKwk7OyBib290ZWQgZnJvbSBOQU5EIGZsYXNoLgogCW1vdmVxCTAsICRyMAogCW1vdmUuZAlyb21mc19pbl9mbGFzaCwgJHIxCiAJbW92ZS5kCSRyMCwgWyRyMV0KKwltb3ZlcQkwLCAkcjAKKwltb3ZlLmQJbmFuZF9ib290LCAkcjEKKwltb3ZlLmQJJHIwLCBbJHIxXQogCiAJanVtcAlfc3RhcnRfaXQJOyBKdW1wIHRvIGNhY2hlZCBjb2RlLgogCW5vcApAQCAtMzg0LDggKzM5Myw4IEBACiAJbW92ZS5kICBjcmlzX2NvbW1hbmRfbGluZSwgJHIxMAogCW9yLmQJMHg4MDAwMDAwMCwgJHIxMSA7IE1ha2UgaXQgdmlydHVhbAogMToKLQltb3ZlLmIgIFskcjExK10sICRyMTIKLQltb3ZlLmIgICRyMTIsIFskcjEwK10KKwltb3ZlLmIgIFskcjExK10sICRyMQorCW1vdmUuYiAgJHIxLCBbJHIxMCtdCiAJc3VicQkxLCAkcjEzCiAJYm5lCTFiCiAJbm9wCkBAIC00MDEsNyArNDEwLDcgQEAKIAltb3ZlLmQJZXRyYXhfaXJ2LCAkcjEJOyBTZXQgdGhlIGV4Y2VwdGlvbiBiYXNlIHJlZ2lzdGVyIGFuZCBwb2ludGVyLgogCW1vdmUuZAkkcjAsIFskcjFdCiAKLSNpZm5kZWYgQ09ORklHX0VUUkFYRlNfU0lNCisjaWZuZGVmIENPTkZJR19FVFJBWF9WQ1NfU0lNCiAJOzsgQ2xlYXIgdGhlIEJTUyByZWdpb24gZnJvbSBfYnNzX3N0YXJ0IHRvIF9lbmQuCiAJbW92ZS5kCV9fYnNzX3N0YXJ0LCAkcjAKIAltb3ZlLmQJX2VuZCwgJHIxCkBAIC00MTEsNyArNDIwLDcgQEAKIAlub3AKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0VUUkFYRlNfU0lNCisjaWZkZWYgQ09ORklHX0VUUkFYX1ZDU19TSU0KIAkvKiBTZXQgdGhlIHdhdGNoZG9nIHRpbWVvdXQgdG8gc29tZXRoaW5nIGJpZy4gV2lsbCBiZSByZW1vdmVkIHdoZW4gKi8KIAkvKiB3YXRjaGRvZyBjYW4gYmUgZGlzYWJsZWQgd2l0aCBjb21tYW5kIGxpbmUgb3B0aW9uICovCiAJbW92ZS5kICAweDdmZmZmZmZmLCAkcjEwCkBAIC00MjMsMjUgKzQzMiw0NCBAQAogCW1vdmUuZCBfX2Jzc19zdGFydCwgJHIwCiAJbW92ZW0gWyRyMF0sICRyMTMKIAorI2lmZGVmIENPTkZJR19FVFJBWF9MMkNBQ0hFCisJanNyCWwyY2FjaGVfaW5pdAorCW5vcAorI2VuZGlmCisKIAlqdW1wCXN0YXJ0X2tlcm5lbAk7IEp1bXAgdG8gc3RhcnRfa2VybmVsKCkgaW4gaW5pdC9tYWluLmMuCiAJbm9wCiAKIAkuZGF0YQogZXRyYXhfaXJ2OgogCS5kd29yZCAwCisKKzsgVmFyaWFibGVzIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIEF4aXMgZmxhc2ggbWFwIGRyaXZlciAoYXhpc2ZsYXNobWFwKSwKKzsgYW5kIGZvciBzZXR0aW5nIHVwIG1lbW9yeSBpbiBhcmNoL2NyaXMva2VybmVsL3NldHVwLmMgLgorCis7IHJvbWZzX3N0YXJ0IGlzIHNldCB0byB0aGUgc3RhcnQgb2YgdGhlIHJvb3QgZmlsZSBzeXN0ZW0sIGlmIGl0IGV4aXN0cworOyBpbiBkaXJlY3RseSBhY2Nlc3NpYmxlIG1lbW9yeSAoaS5lLiBOT1IgRmxhc2ggd2hlbiBib290aW5nIGZyb20gRmxhc2gsCis7IG9yIFJBTSB3aGVuIGJvb3RpbmcgZGlyZWN0bHkgZnJvbSBhIG5ldHdvcmstZG93bmxvYWRlZCBSQU0gaW1hZ2UpCiByb21mc19zdGFydDoKIAkuZHdvcmQgMAorCis7IHJvbWZzX2xlbmd0aCBpcyBzZXQgdG8gdGhlIHNpemUgb2YgdGhlIHJvb3QgZmlsZSBzeXN0ZW0gaW1hZ2UsIGlmIGl0IGV4aXN0cworOyBpbiBkaXJlY3RseSBhY2Nlc3NpYmxlIG1lbW9yeSAoc2VlIHJvbWZzX3N0YXJ0KS4gT3RoZXJ3aXNlIGl0IGlzIHNldCB0byAwLgogcm9tZnNfbGVuZ3RoOgogCS5kd29yZCAwCisKKzsgcm9tZnNfaW5fZmxhc2ggaXMgc2V0IHRvIDEgaWYgdGhlIHJvb3QgZmlsZSBzeXN0ZW0gcmVzaWRlcyBpbiBkaXJlY3RseQorOyBhY2Nlc3NpYmxlIGZsYXNoIG1lbW9yeSAoaS5lLiBOT1IgZmxhc2gpLiBJdCBpcyBzZXQgdG8gMCBmb3IgUkFNIGJvb3QKKzsgb3IgTkFORCBmbGFzaCBib290Lgogcm9tZnNfaW5fZmxhc2g6CiAJLmR3b3JkIDAKLWNyaXN2MzJfbmFuZF9ib290OgotCS5kd29yZCAwCi1jcmlzdjMyX25hbmRfY3JhbWZzX29mZnNldDoKKworOyBuYW5kX2Jvb3QgaXMgc2V0IHRvIDEgd2hlbiB0aGUga2VybmVsIGhhcyBiZWVuIGJvb3RlZCBmcm9tIE5BTkQgZmxhc2gKK25hbmRfYm9vdDoKIAkuZHdvcmQgMAogCiBzd2FwcGVyX3BnX2RpciA9IDB4YzAwMDIwMDAKIAogCS5zZWN0aW9uICIuaW5pdC5kYXRhIiwgImF3IgogCi0jaW5jbHVkZSAiLi4vbGliL2h3X3NldHRpbmdzLlMiCisjaW5jbHVkZSAiLi4vbWFjaC9od19zZXR0aW5ncy5TIgpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9pby5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9pby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjJhOWUwLi4wMDAwMDAwCi0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgSS9PIHBpbnMuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA0IEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9waW5tdXguaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvZ2lvX2RlZnMuaD4KLQotc3RydWN0IGNyaXN2MzJfaW9wb3J0IGNyaXN2MzJfaW9wb3J0c1tdID0KLXsKLQl7Ci0JCSh1bnNpZ25lZCBsb25nKilSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByd19wYV9vZSksCi0JCSh1bnNpZ25lZCBsb25nKilSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByd19wYV9kb3V0KSwKLQkJKHVuc2lnbmVkIGxvbmcqKVJFR19BRERSKGdpbywgcmVnaV9naW8sIHJfcGFfZGluKSwKLQkJOAotCX0sCi0JewotCQkodW5zaWduZWQgbG9uZyopUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcndfcGJfb2UpLAotCQkodW5zaWduZWQgbG9uZyopUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcndfcGJfZG91dCksCi0JCSh1bnNpZ25lZCBsb25nKilSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByX3BiX2RpbiksCi0JCTE4Ci0JfSwKLQl7Ci0JCSh1bnNpZ25lZCBsb25nKilSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByd19wY19vZSksCi0JCSh1bnNpZ25lZCBsb25nKilSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByd19wY19kb3V0KSwKLQkJKHVuc2lnbmVkIGxvbmcqKVJFR19BRERSKGdpbywgcmVnaV9naW8sIHJfcGNfZGluKSwKLQkJMTgKLQl9LAotCXsKLQkJKHVuc2lnbmVkIGxvbmcqKVJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3BkX29lKSwKLQkJKHVuc2lnbmVkIGxvbmcqKVJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3BkX2RvdXQpLAotCQkodW5zaWduZWQgbG9uZyopUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcl9wZF9kaW4pLAotCQkxOAotCX0sCi0JewotCQkodW5zaWduZWQgbG9uZyopUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcndfcGVfb2UpLAotCQkodW5zaWduZWQgbG9uZyopUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcndfcGVfZG91dCksCi0JCSh1bnNpZ25lZCBsb25nKilSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByX3BlX2RpbiksCi0JCTE4Ci0JfQotfTsKLQotI2RlZmluZSBOQlJfT0ZfUE9SVFMgQVJSQVlfU0laRShjcmlzdjMyX2lvcG9ydHMpCi0KLXN0cnVjdCBjcmlzdjMyX2lvcGluIGNyaXN2MzJfbGVkMV9ncmVlbjsKLXN0cnVjdCBjcmlzdjMyX2lvcGluIGNyaXN2MzJfbGVkMV9yZWQ7Ci1zdHJ1Y3QgY3Jpc3YzMl9pb3BpbiBjcmlzdjMyX2xlZDJfZ3JlZW47Ci1zdHJ1Y3QgY3Jpc3YzMl9pb3BpbiBjcmlzdjMyX2xlZDJfcmVkOwotc3RydWN0IGNyaXN2MzJfaW9waW4gY3Jpc3YzMl9sZWQzX2dyZWVuOwotc3RydWN0IGNyaXN2MzJfaW9waW4gY3Jpc3YzMl9sZWQzX3JlZDsKLQotLyogRHVtbXkgcG9ydCB1c2VkIHdoZW4gZ3JlZW4gTEVEIGFuZCByZWQgTEVEIGlzIG9uIHRoZSBzYW1lIGJpdCAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW9fZHVtbXk7Ci1zdGF0aWMgc3RydWN0IGNyaXN2MzJfaW9wb3J0IGR1bW15X3BvcnQgPQotewotCSZpb19kdW1teSwKLQkmaW9fZHVtbXksCi0JJmlvX2R1bW15LAotCTE4Ci19Owotc3RhdGljIHN0cnVjdCBjcmlzdjMyX2lvcGluIGR1bW15X2xlZCA9Ci17Ci0JJmR1bW15X3BvcnQsCi0JMAotfTsKLQotc3RhdGljIGludCBfX2luaXQgY3Jpc3YzMl9pb19pbml0KHZvaWQpCi17Ci0JaW50IHJldCA9IDA7Ci0JLyogSW5pdGlhbGl6ZSBMRURzICovCi0JcmV0ICs9IGNyaXN2MzJfaW9fZ2V0X25hbWUoJmNyaXN2MzJfbGVkMV9ncmVlbiwgQ09ORklHX0VUUkFYX0xFRDFHKTsKLQlyZXQgKz0gY3Jpc3YzMl9pb19nZXRfbmFtZSgmY3Jpc3YzMl9sZWQxX3JlZCwgQ09ORklHX0VUUkFYX0xFRDFSKTsKLQlyZXQgKz0gY3Jpc3YzMl9pb19nZXRfbmFtZSgmY3Jpc3YzMl9sZWQyX2dyZWVuLCBDT05GSUdfRVRSQVhfTEVEMkcpOwotCXJldCArPSBjcmlzdjMyX2lvX2dldF9uYW1lKCZjcmlzdjMyX2xlZDJfcmVkLCBDT05GSUdfRVRSQVhfTEVEMlIpOwotCXJldCArPSBjcmlzdjMyX2lvX2dldF9uYW1lKCZjcmlzdjMyX2xlZDNfZ3JlZW4sIENPTkZJR19FVFJBWF9MRUQzRyk7Ci0JcmV0ICs9IGNyaXN2MzJfaW9fZ2V0X25hbWUoJmNyaXN2MzJfbGVkM19yZWQsIENPTkZJR19FVFJBWF9MRUQzUik7Ci0JY3Jpc3YzMl9pb19zZXRfZGlyKCZjcmlzdjMyX2xlZDFfZ3JlZW4sIGNyaXN2MzJfaW9fZGlyX291dCk7Ci0JY3Jpc3YzMl9pb19zZXRfZGlyKCZjcmlzdjMyX2xlZDFfcmVkLCBjcmlzdjMyX2lvX2Rpcl9vdXQpOwotCWNyaXN2MzJfaW9fc2V0X2RpcigmY3Jpc3YzMl9sZWQyX2dyZWVuLCBjcmlzdjMyX2lvX2Rpcl9vdXQpOwotCWNyaXN2MzJfaW9fc2V0X2RpcigmY3Jpc3YzMl9sZWQyX3JlZCwgY3Jpc3YzMl9pb19kaXJfb3V0KTsKLQljcmlzdjMyX2lvX3NldF9kaXIoJmNyaXN2MzJfbGVkM19ncmVlbiwgY3Jpc3YzMl9pb19kaXJfb3V0KTsKLQljcmlzdjMyX2lvX3NldF9kaXIoJmNyaXN2MzJfbGVkM19yZWQsIGNyaXN2MzJfaW9fZGlyX291dCk7Ci0KLQlpZiAoIXN0cmNtcChDT05GSUdfRVRSQVhfTEVEMUcsIENPTkZJR19FVFJBWF9MRUQxUikpCi0JCWNyaXN2MzJfbGVkMV9yZWQgPSBkdW1teV9sZWQ7Ci0JaWYgKCFzdHJjbXAoQ09ORklHX0VUUkFYX0xFRDJHLCBDT05GSUdfRVRSQVhfTEVEMlIpKQotCQljcmlzdjMyX2xlZDJfcmVkID0gZHVtbXlfbGVkOwotCi0JcmV0dXJuIHJldDsKLX0KLQotX19pbml0Y2FsbChjcmlzdjMyX2lvX2luaXQpOwotCi1pbnQgY3Jpc3YzMl9pb19nZXQoc3RydWN0IGNyaXN2MzJfaW9waW4qIGlvcGluLAotICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwb3J0LCB1bnNpZ25lZCBpbnQgcGluKQotewotCWlmIChwb3J0ID4gTkJSX09GX1BPUlRTKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAocG9ydCA+IGNyaXN2MzJfaW9wb3J0c1twb3J0XS5waW5fY291bnQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaW9waW4tPmJpdCA9IDEgPDwgcGluOwotCWlvcGluLT5wb3J0ID0gJmNyaXN2MzJfaW9wb3J0c1twb3J0XTsKLQotCWlmIChjcmlzdjMyX3Bpbm11eF9hbGxvYyhwb3J0LCBwaW4sIHBpbiwgcGlubXV4X2dwaW8pKQotCQlyZXR1cm4gLUVJTzsKLQotCXJldHVybiAwOwotfQotCi1pbnQgY3Jpc3YzMl9pb19nZXRfbmFtZShzdHJ1Y3QgY3Jpc3YzMl9pb3BpbiogaW9waW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogbmFtZSkKLXsKLQlpbnQgcG9ydDsKLQlpbnQgcGluOwotCi0JaWYgKHRvdXBwZXIoKm5hbWUpID09ICdQJykKLQkJbmFtZSsrOwotCi0JaWYgKHRvdXBwZXIoKm5hbWUpIDwgJ0EnIHx8IHRvdXBwZXIoKm5hbWUpID4gJ0UnKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBvcnQgPSB0b3VwcGVyKCpuYW1lKSAtICdBJzsKLQluYW1lKys7Ci0JcGluID0gc2ltcGxlX3N0cnRvdWwobmFtZSwgTlVMTCwgMTApOwotCi0JaWYgKHBpbiA8IDAgfHwgcGluID4gY3Jpc3YzMl9pb3BvcnRzW3BvcnRdLnBpbl9jb3VudCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpb3Bpbi0+Yml0ID0gMSA8PCBwaW47Ci0JaW9waW4tPnBvcnQgPSAmY3Jpc3YzMl9pb3BvcnRzW3BvcnRdOwotCi0JaWYgKGNyaXN2MzJfcGlubXV4X2FsbG9jKHBvcnQsIHBpbiwgcGluLCBwaW5tdXhfZ3BpbykpCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUENJCi0vKiBQQ0kgSS9PIGFjY2VzcyBzdHVmZiAqLwotc3RydWN0IGNyaXNfaW9fb3BlcmF0aW9ucyogY3Jpc19pb3BzID0gTlVMTDsKLUVYUE9SVF9TWU1CT0woY3Jpc19pb3BzKTsKLSNlbmRpZgotCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL2lycS5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9pcnEuYwppbmRleCBhOWFjYWEyNy4uMTczYzE0MSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL2lycS5jCkBAIC0xNSwxNSArMTUsMjEgQEAKICNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9yZWdfbWFwLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL3JlZ19yZHdyLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL2ludHJfdmVjdC5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9pbnRyX3ZlY3RfZGVmcy5oPgorI2luY2x1ZGUgPGh3cmVncy9yZWdfbWFwLmg+CisjaW5jbHVkZSA8aHdyZWdzL3JlZ19yZHdyLmg+CisjaW5jbHVkZSA8aHdyZWdzL2ludHJfdmVjdC5oPgorI2luY2x1ZGUgPGh3cmVncy9pbnRyX3ZlY3RfZGVmcy5oPgogCiAjZGVmaW5lIENQVV9GSVhFRCAtMQogCiAvKiBJUlEgbWFza3MgKHJlZmVyIHRvIGNvbW1lbnQgZm9yIGNyaXN2MzJfZG9fbXVsdGlwbGUpICovCi0jZGVmaW5lIFRJTUVSX01BU0sgKDEgPDwgKFRJTUVSX0lOVFJfVkVDVCAtIEZJUlNUX0lSUSkpCisjaWYgVElNRVIwX0lOVFJfVkVDVCAtIEZJUlNUX0lSUSA8IDMyCisjZGVmaW5lIFRJTUVSX01BU0sgKDEgPDwgKFRJTUVSMF9JTlRSX1ZFQ1QgLSBGSVJTVF9JUlEpKQorI3VuZGVmIFRJTUVSX1ZFQ1QxCisjZWxzZQorI2RlZmluZSBUSU1FUl9NQVNLICgxIDw8IChUSU1FUjBfSU5UUl9WRUNUIC0gRklSU1RfSVJRIC0gMzIpKQorI2RlZmluZSBUSU1FUl9WRUNUMQorI2VuZGlmCiAjaWZkZWYgQ09ORklHX0VUUkFYX0tHREIKICNpZiBkZWZpbmVkKENPTkZJR19FVFJBWF9LR0RCX1BPUlQwKQogI2RlZmluZSBJR05PUkVNQVNLICgxIDw8IChTRVIwX0lOVFJfVkVDVCAtIEZJUlNUX0lSUSkpCkBAIC00NCw4ICs1MCw4IEBACiAgIGNwdW1hc2tfdCBtYXNrOyAvKiBUaGUgQ1BVcyB0byB3aGljaCB0aGUgSVJRIG1heSBiZSBhbGxvY2F0ZWQuICovCiB9OwogCi1zdHJ1Y3QgY3Jpc19pcnFfYWxsb2NhdGlvbiBpcnFfYWxsb2NhdGlvbnNbTlJfSVJRU10gPQotICB7WzAgLi4uIE5SX0lSUVMgLSAxXSA9IHswLCBDUFVfTUFTS19BTEx9fTsKK3N0cnVjdCBjcmlzX2lycV9hbGxvY2F0aW9uIGlycV9hbGxvY2F0aW9uc1tOUl9SRUFMX0lSUVNdID0KKyAgeyBbMCAuLi4gTlJfUkVBTF9JUlFTIC0gMV0gPSB7MCwgQ1BVX01BU0tfQUxMfSB9OwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpcnFfcmVnc1tOUl9DUFVTXSA9CiB7CkBAIC01NSw2ICs2MSwxMiBAQAogI2VuZGlmCiB9OwogCisjaWYgTlJfUkVBTF9JUlFTID4gMzIKKyNkZWZpbmUgTkJSX1JFR1MgMgorI2Vsc2UKKyNkZWZpbmUgTkJSX1JFR1MgMQorI2VuZGlmCisKIHVuc2lnbmVkIGxvbmcgY3B1X2lycV9jb3VudGVyc1tOUl9DUFVTXTsKIHVuc2lnbmVkIGxvbmcgaXJxX2NvdW50ZXJzW05SX1JFQUxfSVJRU107CiAKQEAgLTc5LDQ1ICs5MSw4MSBAQAogZXh0ZXJuIHZvaWQga2dkYl9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgYnJlYWtwb2ludCh2b2lkKTsKIAorLyogRnJvbSB0cmFwcy5jLiAgKi8KK2V4dGVybiB2b2lkIGJyZWFraF9CVUcodm9pZCk7CisKIC8qCi0gKiBCdWlsZCB0aGUgSVJRIGhhbmRsZXIgc3R1YnMgdXNpbmcgbWFjcm9zIGZyb20gaXJxLmguIEZpcnN0IGFyZ3VtZW50IGlzIHRoZQotICogSVJRIG51bWJlciwgdGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW4KLSAqIGludHJfcndfdmVjdF9tYXNrIGZvdW5kIGluIGFzbS9hcmNoL2h3cmVncy9pbnRyX3ZlY3RfZGVmcy5oLgorICogQnVpbGQgdGhlIElSUSBoYW5kbGVyIHN0dWJzIHVzaW5nIG1hY3JvcyBmcm9tIGlycS5oLgogICovCi1CVUlMRF9JUlEoMHgzMSwgKDEgPDwgMCkpCS8qIG1lbWFyYiAqLwotQlVJTERfSVJRKDB4MzIsICgxIDw8IDEpKQkvKiBnZW5faW8gKi8KLUJVSUxEX0lSUSgweDMzLCAoMSA8PCAyKSkJLyogaW9wMCAqLwotQlVJTERfSVJRKDB4MzQsICgxIDw8IDMpKQkvKiBpb3AxICovCi1CVUlMRF9JUlEoMHgzNSwgKDEgPDwgNCkpCS8qIGlvcDIgKi8KLUJVSUxEX0lSUSgweDM2LCAoMSA8PCA1KSkJLyogaW9wMyAqLwotQlVJTERfSVJRKDB4MzcsICgxIDw8IDYpKQkvKiBkbWEwICovCi1CVUlMRF9JUlEoMHgzOCwgKDEgPDwgNykpCS8qIGRtYTEgKi8KLUJVSUxEX0lSUSgweDM5LCAoMSA8PCA4KSkJLyogZG1hMiAqLwotQlVJTERfSVJRKDB4M2EsICgxIDw8IDkpKQkvKiBkbWEzICovCi1CVUlMRF9JUlEoMHgzYiwgKDEgPDwgMTApKQkvKiBkbWE0ICovCi1CVUlMRF9JUlEoMHgzYywgKDEgPDwgMTEpKQkvKiBkbWE1ICovCi1CVUlMRF9JUlEoMHgzZCwgKDEgPDwgMTIpKQkvKiBkbWE2ICovCi1CVUlMRF9JUlEoMHgzZSwgKDEgPDwgMTMpKQkvKiBkbWE3ICovCi1CVUlMRF9JUlEoMHgzZiwgKDEgPDwgMTQpKQkvKiBkbWE4ICovCi1CVUlMRF9JUlEoMHg0MCwgKDEgPDwgMTUpKQkvKiBkbWE5ICovCi1CVUlMRF9JUlEoMHg0MSwgKDEgPDwgMTYpKQkvKiBhdGEgKi8KLUJVSUxEX0lSUSgweDQyLCAoMSA8PCAxNykpCS8qIHNzZXIwICovCi1CVUlMRF9JUlEoMHg0MywgKDEgPDwgMTgpKQkvKiBzc2VyMSAqLwotQlVJTERfSVJRKDB4NDQsICgxIDw8IDE5KSkJLyogc2VyMCAqLwotQlVJTERfSVJRKDB4NDUsICgxIDw8IDIwKSkJLyogc2VyMSAqLwotQlVJTERfSVJRKDB4NDYsICgxIDw8IDIxKSkJLyogc2VyMiAqLwotQlVJTERfSVJRKDB4NDcsICgxIDw8IDIyKSkJLyogc2VyMyAqLwotQlVJTERfSVJRKDB4NDgsICgxIDw8IDIzKSkKLUJVSUxEX0lSUSgweDQ5LCAoMSA8PCAyNCkpCS8qIGV0aDAgKi8KLUJVSUxEX0lSUSgweDRhLCAoMSA8PCAyNSkpCS8qIGV0aDEgKi8KLUJVSUxEX1RJTUVSX0lSUSgweDRiLCAoMSA8PCAyNikpLyogdGltZXIgKi8KLUJVSUxEX0lSUSgweDRjLCAoMSA8PCAyNykpCS8qIGJpZl9hcmIgKi8KLUJVSUxEX0lSUSgweDRkLCAoMSA8PCAyOCkpCS8qIGJpZl9kbWEgKi8KLUJVSUxEX0lSUSgweDRlLCAoMSA8PCAyOSkpCS8qIGV4dCAqLwotQlVJTERfSVJRKDB4NGYsICgxIDw8IDI5KSkJLyogaXBpICovCitCVUlMRF9JUlEoMHgzMSkKK0JVSUxEX0lSUSgweDMyKQorQlVJTERfSVJRKDB4MzMpCitCVUlMRF9JUlEoMHgzNCkKK0JVSUxEX0lSUSgweDM1KQorQlVJTERfSVJRKDB4MzYpCitCVUlMRF9JUlEoMHgzNykKK0JVSUxEX0lSUSgweDM4KQorQlVJTERfSVJRKDB4MzkpCitCVUlMRF9JUlEoMHgzYSkKK0JVSUxEX0lSUSgweDNiKQorQlVJTERfSVJRKDB4M2MpCitCVUlMRF9JUlEoMHgzZCkKK0JVSUxEX0lSUSgweDNlKQorQlVJTERfSVJRKDB4M2YpCitCVUlMRF9JUlEoMHg0MCkKK0JVSUxEX0lSUSgweDQxKQorQlVJTERfSVJRKDB4NDIpCitCVUlMRF9JUlEoMHg0MykKK0JVSUxEX0lSUSgweDQ0KQorQlVJTERfSVJRKDB4NDUpCitCVUlMRF9JUlEoMHg0NikKK0JVSUxEX0lSUSgweDQ3KQorQlVJTERfSVJRKDB4NDgpCitCVUlMRF9JUlEoMHg0OSkKK0JVSUxEX0lSUSgweDRhKQorQlVJTERfSVJRKDB4NGIpCitCVUlMRF9JUlEoMHg0YykKK0JVSUxEX0lSUSgweDRkKQorQlVJTERfSVJRKDB4NGUpCitCVUlMRF9JUlEoMHg0ZikKK0JVSUxEX0lSUSgweDUwKQorI2lmIE1BQ0hfSVJRUyA+IDMyCitCVUlMRF9JUlEoMHg1MSkKK0JVSUxEX0lSUSgweDUyKQorQlVJTERfSVJRKDB4NTMpCitCVUlMRF9JUlEoMHg1NCkKK0JVSUxEX0lSUSgweDU1KQorQlVJTERfSVJRKDB4NTYpCitCVUlMRF9JUlEoMHg1NykKK0JVSUxEX0lSUSgweDU4KQorQlVJTERfSVJRKDB4NTkpCitCVUlMRF9JUlEoMHg1YSkKK0JVSUxEX0lSUSgweDViKQorQlVJTERfSVJRKDB4NWMpCitCVUlMRF9JUlEoMHg1ZCkKK0JVSUxEX0lSUSgweDVlKQorQlVJTERfSVJRKDB4NWYpCitCVUlMRF9JUlEoMHg2MCkKK0JVSUxEX0lSUSgweDYxKQorQlVJTERfSVJRKDB4NjIpCitCVUlMRF9JUlEoMHg2MykKK0JVSUxEX0lSUSgweDY0KQorQlVJTERfSVJRKDB4NjUpCitCVUlMRF9JUlEoMHg2NikKK0JVSUxEX0lSUSgweDY3KQorQlVJTERfSVJRKDB4NjgpCitCVUlMRF9JUlEoMHg2OSkKK0JVSUxEX0lSUSgweDZhKQorQlVJTERfSVJRKDB4NmIpCitCVUlMRF9JUlEoMHg2YykKK0JVSUxEX0lSUSgweDZkKQorQlVJTERfSVJRKDB4NmUpCitCVUlMRF9JUlEoMHg2ZikKK0JVSUxEX0lSUSgweDcwKQorI2VuZGlmCiAKIC8qIFBvaW50ZXJzIHRvIHRoZSBsb3ctbGV2ZWwgaGFuZGxlcnMuICovCi1zdGF0aWMgdm9pZCAoKmludGVycnVwdFtOUl9JUlFTXSkodm9pZCkgPSB7CitzdGF0aWMgdm9pZCAoKmludGVycnVwdFtNQUNIX0lSUVNdKSh2b2lkKSA9IHsKIAlJUlEweDMxX2ludGVycnVwdCwgSVJRMHgzMl9pbnRlcnJ1cHQsIElSUTB4MzNfaW50ZXJydXB0LAogCUlSUTB4MzRfaW50ZXJydXB0LCBJUlEweDM1X2ludGVycnVwdCwgSVJRMHgzNl9pbnRlcnJ1cHQsCiAJSVJRMHgzN19pbnRlcnJ1cHQsIElSUTB4MzhfaW50ZXJydXB0LCBJUlEweDM5X2ludGVycnVwdCwKQEAgLTEyOCw3ICsxNzYsMjAgQEAKIAlJUlEweDQ2X2ludGVycnVwdCwgSVJRMHg0N19pbnRlcnJ1cHQsIElSUTB4NDhfaW50ZXJydXB0LAogCUlSUTB4NDlfaW50ZXJydXB0LCBJUlEweDRhX2ludGVycnVwdCwgSVJRMHg0Yl9pbnRlcnJ1cHQsCiAJSVJRMHg0Y19pbnRlcnJ1cHQsIElSUTB4NGRfaW50ZXJydXB0LCBJUlEweDRlX2ludGVycnVwdCwKLQlJUlEweDRmX2ludGVycnVwdAorCUlSUTB4NGZfaW50ZXJydXB0LCBJUlEweDUwX2ludGVycnVwdCwKKyNpZiBNQUNIX0lSUVMgPiAzMgorCUlSUTB4NTFfaW50ZXJydXB0LCBJUlEweDUyX2ludGVycnVwdCwgSVJRMHg1M19pbnRlcnJ1cHQsCisJSVJRMHg1NF9pbnRlcnJ1cHQsIElSUTB4NTVfaW50ZXJydXB0LCBJUlEweDU2X2ludGVycnVwdCwKKwlJUlEweDU3X2ludGVycnVwdCwgSVJRMHg1OF9pbnRlcnJ1cHQsIElSUTB4NTlfaW50ZXJydXB0LAorCUlSUTB4NWFfaW50ZXJydXB0LCBJUlEweDViX2ludGVycnVwdCwgSVJRMHg1Y19pbnRlcnJ1cHQsCisJSVJRMHg1ZF9pbnRlcnJ1cHQsIElSUTB4NWVfaW50ZXJydXB0LCBJUlEweDVmX2ludGVycnVwdCwKKwlJUlEweDYwX2ludGVycnVwdCwgSVJRMHg2MV9pbnRlcnJ1cHQsIElSUTB4NjJfaW50ZXJydXB0LAorCUlSUTB4NjNfaW50ZXJydXB0LCBJUlEweDY0X2ludGVycnVwdCwgSVJRMHg2NV9pbnRlcnJ1cHQsCisJSVJRMHg2Nl9pbnRlcnJ1cHQsIElSUTB4NjdfaW50ZXJydXB0LCBJUlEweDY4X2ludGVycnVwdCwKKwlJUlEweDY5X2ludGVycnVwdCwgSVJRMHg2YV9pbnRlcnJ1cHQsIElSUTB4NmJfaW50ZXJydXB0LAorCUlSUTB4NmNfaW50ZXJydXB0LCBJUlEweDZkX2ludGVycnVwdCwgSVJRMHg2ZV9pbnRlcnJ1cHQsCisJSVJRMHg2Zl9pbnRlcnJ1cHQsIElSUTB4NzBfaW50ZXJydXB0LAorI2VuZGlmCiB9OwogCiB2b2lkCkBAIC0xMzcsMTMgKzE5OCwyNiBAQAogCWludCBpbnRyX21hc2s7CiAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLSAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9sb2NrLCBmbGFncyk7Ci0gICAgICAgIGludHJfbWFzayA9IFJFR19SRF9JTlQoaW50cl92ZWN0LCBpcnFfcmVnc1tjcHVdLCByd19tYXNrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2xvY2ssIGZsYWdzKTsKKwlpZiAoaXJxIC0gRklSU1RfSVJRIDwgMzIpCisJCWludHJfbWFzayA9IFJFR19SRF9JTlRfVkVDVChpbnRyX3ZlY3QsIGlycV9yZWdzW2NwdV0sCisJCQlyd19tYXNrLCAwKTsKKwllbHNlCisJCWludHJfbWFzayA9IFJFR19SRF9JTlRfVkVDVChpbnRyX3ZlY3QsIGlycV9yZWdzW2NwdV0sCisJCQlyd19tYXNrLCAxKTsKIAotCS8qIFJlbWVtYmVyOyAxIGxldCB0aHJvdWdoLCAwIGJsb2NrLiAqLwotCWludHJfbWFzayAmPSB+KDEgPDwgKGlycSAtIEZJUlNUX0lSUSkpOworCS8qIFJlbWVtYmVyOyAxIGxldCB0aHJ1LCAwIGJsb2NrLiAqLworCWlmIChpcnEgLSBGSVJTVF9JUlEgPCAzMikKKwkJaW50cl9tYXNrICY9IH4oMSA8PCAoaXJxIC0gRklSU1RfSVJRKSk7CisJZWxzZQorCQlpbnRyX21hc2sgJj0gfigxIDw8IChpcnEgLSBGSVJTVF9JUlEgLSAzMikpOwogCi0JUkVHX1dSX0lOVChpbnRyX3ZlY3QsIGlycV9yZWdzW2NwdV0sIHJ3X21hc2ssIGludHJfbWFzayk7CisJaWYgKGlycSAtIEZJUlNUX0lSUSA8IDMyKQorCQlSRUdfV1JfSU5UX1ZFQ1QoaW50cl92ZWN0LCBpcnFfcmVnc1tjcHVdLCByd19tYXNrLAorCQkJMCwgaW50cl9tYXNrKTsKKwllbHNlCisJCVJFR19XUl9JTlRfVkVDVChpbnRyX3ZlY3QsIGlycV9yZWdzW2NwdV0sIHJ3X21hc2ssCisJCQkxLCBpbnRyX21hc2spOwogICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfbG9jaywgZmxhZ3MpOwogfQogCkBAIC0xNTQsMTIgKzIyOCwyNiBAQAogICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZpcnFfbG9jaywgZmxhZ3MpOwotICAgICAgICBpbnRyX21hc2sgPSBSRUdfUkRfSU5UKGludHJfdmVjdCwgaXJxX3JlZ3NbY3B1XSwgcndfbWFzayk7CisJaWYgKGlycSAtIEZJUlNUX0lSUSA8IDMyKQorCQlpbnRyX21hc2sgPSBSRUdfUkRfSU5UX1ZFQ1QoaW50cl92ZWN0LCBpcnFfcmVnc1tjcHVdLAorCQkJcndfbWFzaywgMCk7CisJZWxzZQorCQlpbnRyX21hc2sgPSBSRUdfUkRfSU5UX1ZFQ1QoaW50cl92ZWN0LCBpcnFfcmVnc1tjcHVdLAorCQkJcndfbWFzaywgMSk7CiAKLQkvKiBSZW1lbWJlcjsgMSBsZXQgdGhyb3VnaCwgMCBibG9jay4gKi8KLQlpbnRyX21hc2sgfD0gKDEgPDwgKGlycSAtIEZJUlNUX0lSUSkpOworCS8qIFJlbWVtYmVyOyAxIGxldCB0aHJ1LCAwIGJsb2NrLiAqLworCWlmIChpcnEgLSBGSVJTVF9JUlEgPCAzMikKKwkJaW50cl9tYXNrIHw9ICgxIDw8IChpcnEgLSBGSVJTVF9JUlEpKTsKKwllbHNlCisJCWludHJfbWFzayB8PSAoMSA8PCAoaXJxIC0gRklSU1RfSVJRIC0gMzIpKTsKIAotCVJFR19XUl9JTlQoaW50cl92ZWN0LCBpcnFfcmVnc1tjcHVdLCByd19tYXNrLCBpbnRyX21hc2spOworCWlmIChpcnEgLSBGSVJTVF9JUlEgPCAzMikKKwkJUkVHX1dSX0lOVF9WRUNUKGludHJfdmVjdCwgaXJxX3JlZ3NbY3B1XSwgcndfbWFzaywKKwkJCTAsIGludHJfbWFzayk7CisJZWxzZQorCQlSRUdfV1JfSU5UX1ZFQ1QoaW50cl92ZWN0LCBpcnFfcmVnc1tjcHVdLCByd19tYXNrLAorCQkJMSwgaW50cl9tYXNrKTsKKwogICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfbG9jaywgZmxhZ3MpOwogfQogCkBAIC0yOTgsOCArMzg2LDkgQEAKIHsKIAlpbnQgY3B1OwogCWludCBtYXNrOwotCWludCBtYXNrZWQ7CisJaW50IG1hc2tlZFtOQlJfUkVHU107CiAJaW50IGJpdDsKKwlpbnQgaTsKIAogCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIApAQCAtMzA4LDQyICszOTcsNTkgQEAKIAkgKi8KIAlpcnFfZW50ZXIoKTsKIAotCS8qIEdldCB3aGljaCBJUlFzIHRoYXQgaGFwcGVuZWQuICovCi0JbWFza2VkID0gUkVHX1JEX0lOVChpbnRyX3ZlY3QsIGlycV9yZWdzW2NwdV0sIHJfbWFza2VkX3ZlY3QpOworCWZvciAoaSA9IDA7IGkgPCBOQlJfUkVHUzsgaSsrKSB7CisJCS8qIEdldCB3aGljaCBJUlFzIHRoYXQgaGFwcGVuZC4gKi8KKwkJbWFza2VkW2ldID0gUkVHX1JEX0lOVF9WRUNUKGludHJfdmVjdCwgaXJxX3JlZ3NbY3B1XSwKKwkJCXJfbWFza2VkX3ZlY3QsIGkpOwogCi0JLyogQ2FsY3VsYXRlIG5ldyBJUlEgbWFzayB3aXRoIHRoZXNlIElSUXMgZGlzYWJsZWQuICovCi0JbWFzayA9IFJFR19SRF9JTlQoaW50cl92ZWN0LCBpcnFfcmVnc1tjcHVdLCByd19tYXNrKTsKLQltYXNrICY9IH5tYXNrZWQ7CisJCS8qIENhbGN1bGF0ZSBuZXcgSVJRIG1hc2sgd2l0aCB0aGVzZSBJUlFzIGRpc2FibGVkLiAqLworCQltYXNrID0gUkVHX1JEX0lOVF9WRUNUKGludHJfdmVjdCwgaXJxX3JlZ3NbY3B1XSwgcndfbWFzaywgaSk7CisJCW1hc2sgJj0gfm1hc2tlZFtpXTsKIAogCS8qIFRpbWVyIElSUSBpcyBuZXZlciBtYXNrZWQgKi8KLQlpZiAobWFza2VkICYgVElNRVJfTUFTSykKLQkJbWFzayB8PSBUSU1FUl9NQVNLOwotCi0JLyogQmxvY2sgYWxsIHRoZSBJUlFzICovCi0JUkVHX1dSX0lOVChpbnRyX3ZlY3QsIGlycV9yZWdzW2NwdV0sIHJ3X21hc2ssIG1hc2spOworI2lmZGVmIFRJTUVSX1ZFQ1QxCisJCWlmICgoaSA9PSAxKSAmJiAobWFza2VkWzBdICYgVElNRVJfTUFTSykpCisJCQltYXNrIHw9IFRJTUVSX01BU0s7CisjZWxzZQorCQlpZiAoKGkgPT0gMCkgJiYgKG1hc2tlZFswXSAmIFRJTUVSX01BU0spKQorCQkJbWFzayB8PSBUSU1FUl9NQVNLOworI2VuZGlmCisJCS8qIEJsb2NrIGFsbCB0aGUgSVJRcyAqLworCQlSRUdfV1JfSU5UX1ZFQ1QoaW50cl92ZWN0LCBpcnFfcmVnc1tjcHVdLCByd19tYXNrLCBpLCBtYXNrKTsKIAogCS8qIENoZWNrIGZvciB0aW1lciBJUlEgYW5kIGhhbmRsZSBpdCBzcGVjaWFsLiAqLwotCWlmIChtYXNrZWQgJiBUSU1FUl9NQVNLKSB7Ci0JICAgICAgICBtYXNrZWQgJj0gflRJTUVSX01BU0s7Ci0JCWRvX0lSUShUSU1FUl9JTlRSX1ZFQ1QsIHJlZ3MpOworI2lmZGVmIFRJTUVSX1ZFQ1QxCisJCWlmICgoaSA9PSAxKSAmJiAobWFza2VkW2ldICYgVElNRVJfTUFTSykpIHsKKwkJCW1hc2tlZFtpXSAmPSB+VElNRVJfTUFTSzsKKwkJCWRvX0lSUShUSU1FUjBfSU5UUl9WRUNULCByZWdzKTsKKwkJfQorI2Vsc2UKKwkJaWYgKChpID09IDApICYmIChtYXNrZWRbaV0gJiBUSU1FUl9NQVNLKSkgeworCQkJIG1hc2tlZFtpXSAmPSB+VElNRVJfTUFTSzsKKwkJCSBkb19JUlEoVElNRVIwX0lOVFJfVkVDVCwgcmVncyk7CisJCX0KIAl9CisjZW5kaWYKIAogI2lmZGVmIElHTk9SRV9NQVNLCiAJLyogUmVtb3ZlIElSUXMgdGhhdCBjYW4ndCBiZSBoYW5kbGVkIGFzIG11bHRpcGxlLiAqLwotCW1hc2tlZCAmPSB+SUdOT1JFX01BU0s7CisJbWFza2VkWzBdICY9IH5JR05PUkVfTUFTSzsKICNlbmRpZgogCiAJLyogSGFuZGxlIHRoZSByZXN0IG9mIHRoZSBJUlFzLiAqLwotCWZvciAoYml0ID0gMDsgYml0IDwgMzI7IGJpdCsrKQotCXsKLQkJaWYgKG1hc2tlZCAmICgxIDw8IGJpdCkpCi0JCQlkb19JUlEoYml0ICsgRklSU1RfSVJRLCByZWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgTkJSX1JFR1M7IGkrKykgeworCQlmb3IgKGJpdCA9IDA7IGJpdCA8IDMyOyBiaXQrKykgeworCQkJaWYgKG1hc2tlZFtpXSAmICgxIDw8IGJpdCkpCisJCQkJZG9fSVJRKGJpdCArIEZJUlNUX0lSUSArIGkqMzIsIHJlZ3MpOworCQl9CiAJfQogCiAJLyogVW5ibG9jayBhbGwgdGhlIElSUXMuICovCi0JbWFzayA9IFJFR19SRF9JTlQoaW50cl92ZWN0LCBpcnFfcmVnc1tjcHVdLCByd19tYXNrKTsKLQltYXNrIHw9IG1hc2tlZDsKLQlSRUdfV1JfSU5UKGludHJfdmVjdCwgaXJxX3JlZ3NbY3B1XSwgcndfbWFzaywgbWFzayk7CisJZm9yIChpID0gMDsgaSA8IE5CUl9SRUdTOyBpKyspIHsKKwkJbWFzayA9IFJFR19SRF9JTlRfVkVDVChpbnRyX3ZlY3QsIGlycV9yZWdzW2NwdV0sIHJ3X21hc2ssIGkpOworCQltYXNrIHw9IG1hc2tlZFtpXTsKKwkJUkVHX1dSX0lOVF9WRUNUKGludHJfdmVjdCwgaXJxX3JlZ3NbY3B1XSwgcndfbWFzaywgaSwgbWFzayk7CisJfQogCiAJLyogVGhpcyBpcnFfZXhpdCgpIHdpbGwgdHJpZ2dlciB0aGUgc29mdCBJUlFzLiAqLwogCWlycV9leGl0KCk7CkBAIC0zNjEsMjAgKzQ2NywyMSBAQAogCXJlZ19pbnRyX3ZlY3RfcndfbWFzayB2ZWN0X21hc2sgPSB7MH07CiAKIAkvKiBDbGVhciBhbGwgaW50ZXJydXB0cyBtYXNrcy4gKi8KLQlSRUdfV1IoaW50cl92ZWN0LCByZWdpX2lycSwgcndfbWFzaywgdmVjdF9tYXNrKTsKKwlmb3IgKGkgPSAwOyBpIDwgTkJSX1JFR1M7IGkrKykKKwkJUkVHX1dSX1ZFQ1QoaW50cl92ZWN0LCByZWdpX2lycSwgcndfbWFzaywgaSwgdmVjdF9tYXNrKTsKIAogCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKIAkJZXRyYXhfaXJ2LT52W2ldID0gd2VpcmRfaXJxOwogCi0JLyogUG9pbnQgYWxsIElSUXMgdG8gYmFkIGhhbmRsZXJzLiAqLworCS8qIFBvaW50IGFsbCBJUlEncyB0byBiYWQgaGFuZGxlcnMuICovCiAJZm9yIChpID0gRklSU1RfSVJRLCBqID0gMDsgaiA8IE5SX0lSUVM7IGkrKywgaisrKSB7CiAJCWlycV9kZXNjW2pdLmNoaXAgPSAmY3Jpc3YzMl9pcnFfdHlwZTsKIAkJc2V0X2V4Y2VwdGlvbl92ZWN0b3IoaSwgaW50ZXJydXB0W2pdKTsKIAl9CiAKICAgICAgICAgLyogTWFyayBUaW1lciBhbmQgSVBJIElSUXMgYXMgQ1BVIGxvY2FsICovCi0JaXJxX2FsbG9jYXRpb25zW1RJTUVSX0lOVFJfVkVDVCAtIEZJUlNUX0lSUV0uY3B1ID0gQ1BVX0ZJWEVEOwotCWlycV9kZXNjW1RJTUVSX0lOVFJfVkVDVF0uc3RhdHVzIHw9IElSUV9QRVJfQ1BVOworCWlycV9hbGxvY2F0aW9uc1tUSU1FUjBfSU5UUl9WRUNUIC0gRklSU1RfSVJRXS5jcHUgPSBDUFVfRklYRUQ7CisJaXJxX2Rlc2NbVElNRVIwX0lOVFJfVkVDVF0uc3RhdHVzIHw9IElSUV9QRVJfQ1BVOwogCWlycV9hbGxvY2F0aW9uc1tJUElfSU5UUl9WRUNUIC0gRklSU1RfSVJRXS5jcHUgPSBDUFVfRklYRUQ7CiAJaXJxX2Rlc2NbSVBJX0lOVFJfVkVDVF0uc3RhdHVzIHw9IElSUV9QRVJfQ1BVOwogCkBAIC0zOTEsNiArNDk4LDExIEBACiAJc2V0X2V4Y2VwdGlvbl92ZWN0b3IoMHgwYSwgZF9tbXVfYWNjZXNzKTsKIAlzZXRfZXhjZXB0aW9uX3ZlY3RvcigweDBiLCBkX21tdV93cml0ZSk7CiAKKyNpZmRlZiBDT05GSUdfQlVHCisJLyogQnJlYWsgMTQgaGFuZGxlciwgdXNlZCB0byBpbXBsZW1lbnQgY2hlYXAgQlVHKCkuICAqLworCXNldF9leGNlcHRpb25fdmVjdG9yKDB4MWUsIGJyZWFraF9CVUcpOworI2VuZGlmCisKIAkvKiBUaGUgc3lzdGVtLWNhbGwgdHJhcCBpcyByZWFjaGVkIGJ5ICJicmVhayAxMyIuICovCiAJc2V0X2V4Y2VwdGlvbl92ZWN0b3IoMHgxZCwgc3lzdGVtX2NhbGwpOwogCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL2tnZGIuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwva2dkYi5jCmluZGV4IDQ4MGU1NjMuLjRlMmUyZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwva2dkYi5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwva2dkYi5jCkBAIC0zODEsNyArMzgxLDcgQEAKIC8qIFNlcmlhbCBwb3J0LCByZWFkcyBvbmUgY2hhcmFjdGVyLiBFVFJBWCAxMDAgc3BlY2lmaWMuIGZyb20gZGVidWdwb3J0LmMgKi8KIGludCBnZXREZWJ1Z0NoYXIodm9pZCk7CiAKLSNpZmRlZiBDT05GSUdfRVRSQVhGU19TSU0KKyNpZmRlZiBDT05GSUdfRVRSQVhfVkNTX1NJTQogaW50IGdldERlYnVnQ2hhcih2b2lkKQogewogICByZXR1cm4gc29ja2V0cmVhZCgpOwpAQCAtMzkxLDcgKzM5MSw3IEBACiAvKiBTZXJpYWwgcG9ydCwgd3JpdGVzIG9uZSBjaGFyYWN0ZXIuIEVUUkFYIDEwMCBzcGVjaWZpYy4gZnJvbSBkZWJ1Z3BvcnQuYyAqLwogdm9pZCBwdXREZWJ1Z0NoYXIoaW50IHZhbCk7CiAKLSNpZmRlZiBDT05GSUdfRVRSQVhGU19TSU0KKyNpZmRlZiBDT05GSUdfRVRSQVhfVkNTX1NJTQogdm9pZCBwdXREZWJ1Z0NoYXIoaW50IHZhbCkKIHsKICAgc29ja2V0d3JpdGUoKGNoYXIgKikmdmFsLCAxKTsKQEAgLTE1OTksNyArMTU5OSw3IEBACiAJUkVHX1dSKGludHJfdmVjdCwgcmVnaV9pcnEsIHJ3X21hc2ssIGludHJfbWFzayk7CiAKIAlzZXJfaW50cl9tYXNrID0gUkVHX1JEKHNlciwgcmVnaV9zZXIwLCByd19pbnRyX21hc2spOwotCXNlcl9pbnRyX21hc2suZGF0YV9hdmFpbCA9IHJlZ2tfc2VyX3llczsKKwlzZXJfaW50cl9tYXNrLmRhdiA9IHJlZ2tfc2VyX3llczsKIAlSRUdfV1Ioc2VyLCByZWdpX3NlcjAsIHJ3X2ludHJfbWFzaywgc2VyX2ludHJfbWFzayk7CiAjZWxpZiBkZWZpbmVkKENPTkZJR19FVFJBWF9LR0RCX1BPUlQxKQogCS8qIE5vdGU6IG5vIHNob3J0Y3V0IHJlZ2lzdGVyZWQgKG5vdCBoYW5kbGVkIGJ5IG11bHRpcGxlX2ludGVycnVwdCkuCkBAIC0xNjExLDcgKzE2MTEsNyBAQAogCVJFR19XUihpbnRyX3ZlY3QsIHJlZ2lfaXJxLCByd19tYXNrLCBpbnRyX21hc2spOwogCiAJc2VyX2ludHJfbWFzayA9IFJFR19SRChzZXIsIHJlZ2lfc2VyMSwgcndfaW50cl9tYXNrKTsKLQlzZXJfaW50cl9tYXNrLmRhdGFfYXZhaWwgPSByZWdrX3Nlcl95ZXM7CisJc2VyX2ludHJfbWFzay5kYXYgPSByZWdrX3Nlcl95ZXM7CiAJUkVHX1dSKHNlciwgcmVnaV9zZXIxLCByd19pbnRyX21hc2ssIHNlcl9pbnRyX21hc2spOwogI2VsaWYgZGVmaW5lZChDT05GSUdfRVRSQVhfS0dEQl9QT1JUMikKIAkvKiBOb3RlOiBubyBzaG9ydGN1dCByZWdpc3RlcmVkIChub3QgaGFuZGxlZCBieSBtdWx0aXBsZV9pbnRlcnJ1cHQpLgpAQCAtMTYyMyw3ICsxNjIzLDcgQEAKIAlSRUdfV1IoaW50cl92ZWN0LCByZWdpX2lycSwgcndfbWFzaywgaW50cl9tYXNrKTsKIAogCXNlcl9pbnRyX21hc2sgPSBSRUdfUkQoc2VyLCByZWdpX3NlcjIsIHJ3X2ludHJfbWFzayk7Ci0Jc2VyX2ludHJfbWFzay5kYXRhX2F2YWlsID0gcmVna19zZXJfeWVzOworCXNlcl9pbnRyX21hc2suZGF2ID0gcmVna19zZXJfeWVzOwogCVJFR19XUihzZXIsIHJlZ2lfc2VyMiwgcndfaW50cl9tYXNrLCBzZXJfaW50cl9tYXNrKTsKICNlbGlmIGRlZmluZWQoQ09ORklHX0VUUkFYX0tHREJfUE9SVDMpCiAJLyogTm90ZTogbm8gc2hvcnRjdXQgcmVnaXN0ZXJlZCAobm90IGhhbmRsZWQgYnkgbXVsdGlwbGVfaW50ZXJydXB0KS4KQEAgLTE2MzUsNyArMTYzNSw3IEBACiAJUkVHX1dSKGludHJfdmVjdCwgcmVnaV9pcnEsIHJ3X21hc2ssIGludHJfbWFzayk7CiAKIAlzZXJfaW50cl9tYXNrID0gUkVHX1JEKHNlciwgcmVnaV9zZXIzLCByd19pbnRyX21hc2spOwotCXNlcl9pbnRyX21hc2suZGF0YV9hdmFpbCA9IHJlZ2tfc2VyX3llczsKKwlzZXJfaW50cl9tYXNrLmRhdiA9IHJlZ2tfc2VyX3llczsKIAlSRUdfV1Ioc2VyLCByZWdpX3NlcjMsIHJ3X2ludHJfbWFzaywgc2VyX2ludHJfbWFzayk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3Byb2Nlc3MuYwppbmRleCBiNzJhMTU1Li5jZWQ1YjcyIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3Byb2Nlc3MuYwpAQCAtMTIsMTcgKzEyLDEzIEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL3JlZ19yZHdyLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL3JlZ19tYXAuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvdGltZXJfZGVmcy5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9pbnRyX3ZlY3RfZGVmcy5oPgorI2luY2x1ZGUgPGh3cmVncy9yZWdfcmR3ci5oPgorI2luY2x1ZGUgPGh3cmVncy9yZWdfbWFwLmg+CisjaW5jbHVkZSA8aHdyZWdzL3RpbWVyX2RlZnMuaD4KKyNpbmNsdWRlIDxod3JlZ3MvaW50cl92ZWN0X2RlZnMuaD4KIAogZXh0ZXJuIHZvaWQgc3RvcF93YXRjaGRvZyh2b2lkKTsKIAotI2lmZGVmIENPTkZJR19FVFJBWF9HUElPCi1leHRlcm4gdm9pZCBldHJheF9ncGlvX3dha2VfdXBfY2hlY2sodm9pZCk7IC8qIERlZmluZWQgaW4gZHJpdmVycy9ncGlvLmMuICovCi0jZW5kaWYKLQogZXh0ZXJuIGludCBjcmlzX2hsdF9jb3VudGVyOwogCiAvKiBXZSB1c2UgdGhpcyBpZiB3ZSBkb24ndCBoYXZlIGFueSBiZXR0ZXIgaWRsZSByb3V0aW5lLiAqLwpAQCAtODIsNyArNzgsNyBAQAogCXdkX2N0cmwuY21kID0gcmVna190aW1lcl9zdGFydDsKIAogICAgICAgICBhcmNoX2VuYWJsZV9ubWkoKTsKLQlSRUdfV1IodGltZXIsIHJlZ2lfdGltZXIsIHJ3X3dkX2N0cmwsIHdkX2N0cmwpOworCVJFR19XUih0aW1lciwgcmVnaV90aW1lcjAsIHJ3X3dkX2N0cmwsIHdkX2N0cmwpOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3B0cmFjZS5jCmluZGV4IDJkZjYwNTIuLmUyN2Y0NjcgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9wdHJhY2UuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMywgQXhpcyBDb21tdW5pY2F0aW9ucyBBQi4KKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA3LCBBeGlzIENvbW11bmljYXRpb25zIEFCLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTE0OSw3ICsxNDksNyBAQAogCQkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcG9rZWRhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwogCQkJYnJlYWs7CiAKLSAJCS8qIFdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHJlc3MgaW4gdGhlIFVTRVIgYXJlYS4gKi8KKwkJLyogV3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkcmVzcyBpbiB0aGUgVVNFUiBhcmVhLiAqLwogCQljYXNlIFBUUkFDRV9QT0tFVVNSOgogCQkJcmV0ID0gLUVJTzsKIAkJCWlmICgoYWRkciAmIDMpIHx8IGFkZHIgPCAwIHx8IGFkZHIgPiBQVF9NQVggPDwgMikKQEAgLTIwMSw3ICsyMDEsNyBAQAogCiAJCQlicmVhazsKIAotIAkJLyogTWFrZSB0aGUgY2hpbGQgZXhpdCBieSBzZW5kaW5nIGl0IGEgc2lna2lsbC4gKi8KKwkJLyogTWFrZSB0aGUgY2hpbGQgZXhpdCBieSBzZW5kaW5nIGl0IGEgc2lna2lsbC4gKi8KIAkJY2FzZSBQVFJBQ0VfS0lMTDoKIAkJCXJldCA9IDA7CiAKQEAgLTI0NSw5ICsyNDUsMTAgQEAKIAkJCWJyZWFrOwogCiAJCX0KKwogCQkvKiBHZXQgYWxsIEdQIHJlZ2lzdGVycyBmcm9tIHRoZSBjaGlsZC4gKi8KIAkJY2FzZSBQVFJBQ0VfR0VUUkVHUzogewotCQkgIAlpbnQgaTsKKwkJCWludCBpOwogCQkJdW5zaWduZWQgbG9uZyB0bXA7CiAKIAkJCWZvciAoaSA9IDA7IGkgPD0gUFRfTUFYOyBpKyspIHsKQEAgLTI5NCw2ICsyOTUsNyBAQAogCQkJYnJlYWs7CiAJfQogCitvdXRfdHNrOgogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3NpZ25hbC5jCmluZGV4IDAyNGNjNjkuLjU4YzE4NjYgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9zaWduYWwuYwpAQCAtNTAsNyArNTAsNyBAQAogCXVuc2lnbmVkIGNoYXIgcmV0Y29kZVs4XTsJLyogVHJhbXBvbGluZSBjb2RlLiAqLwogfTsKIAotaW50IGRvX3NpZ25hbChpbnQgcmVzdGFydCwgc2lnc2V0X3QgKm9sZHNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwordm9pZCBkb19zaWduYWwoaW50IHJlc3RhcnQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIHZvaWQga2VlcF9kZWJ1Z19mbGFncyh1bnNpZ25lZCBsb25nIG9sZGNjcywgdW5zaWduZWQgbG9uZyBvbGRzcGMsCiAJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIC8qCkBAIC02MSw3NCArNjEsMTYgQEAKIHN5c19zaWdzdXNwZW5kKG9sZF9zaWdzZXRfdCBtYXNrLCBsb25nIHIxMSwgbG9uZyByMTIsIGxvbmcgcjEzLCBsb25nIG1vZiwKIAkgICAgICAgbG9uZyBzcnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXNpZ3NldF90IHNhdmVzZXQ7Ci0KIAltYXNrICY9IF9CTE9DS0FCTEU7Ci0KIAlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQotCXNhdmVzZXQgPSBjdXJyZW50LT5ibG9ja2VkOwotCisJY3VycmVudC0+c2F2ZWRfc2lnbWFzayA9IGN1cnJlbnQtPmJsb2NrZWQ7CiAJc2lnaW5pdHNldCgmY3VycmVudC0+YmxvY2tlZCwgbWFzayk7Ci0KIAlyZWNhbGNfc2lncGVuZGluZygpOwogCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0KLQlyZWdzLT5yMTAgPSAtRUlOVFI7Ci0KLQl3aGlsZSAoMSkgewotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJc2NoZWR1bGUoKTsKLQotCQlpZiAoZG9fc2lnbmFsKDAsICZzYXZlc2V0LCByZWdzKSkgewotCQkJLyoKLQkJCSAqIFRoaXMgcG9pbnQgaXMgcmVhY2hlZCB0d2ljZTogb25jZSB0byBjYWxsCi0JCQkgKiB0aGUgc2lnbmFsIGhhbmRsZXIsIHRoZW4gYWdhaW4gdG8gcmV0dXJuCi0JCQkgKiBmcm9tIHRoZSBzaWdzdXNwZW5kIHN5c3RlbSBjYWxsLiBXaGVuCi0JCQkgKiBjYWxsaW5nIHRoZSBzaWduYWwgaGFuZGxlciwgUjEwIGhvbGQgdGhlCi0JCQkgKiBzaWduYWwgbnVtYmVyIGFzIHNldCBieSBkb19zaWduYWwoKS4gVGhlCi0JCQkgKiBzaWdzdXNwZW5kICBjYWxsIHdpbGwgYWx3YXlzIHJldHVybiB3aXRoCi0JCQkgKiB0aGUgcmVzdG9yZWQgdmFsdWUgYWJvdmU7IC1FSU5UUi4KLQkJCSAqLwotCQkJcmV0dXJuIHJlZ3MtPnIxMDsKLQkJfQotCX0KLX0KLQotLyogRGVmaW5lIHNvbWUgZHVtbXkgYXJndW1lbnRzIHRvIGJlIGFibGUgdG8gcmVhY2ggdGhlIHJlZ3MgYXJndW1lbnQuICovCi1pbnQKLXN5c19ydF9zaWdzdXNwZW5kKHNpZ3NldF90ICp1bmV3c2V0LCBzaXplX3Qgc2lnc2V0c2l6ZSwgbG9uZyByMTIsIGxvbmcgcjEzLAotCQkgIGxvbmcgbW9mLCBsb25nIHNycCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc2lnc2V0X3Qgc2F2ZXNldDsKLQlzaWdzZXRfdCBuZXdzZXQ7Ci0KLQlpZiAoc2lnc2V0c2l6ZSAhPSBzaXplb2Yoc2lnc2V0X3QpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3c2V0LCB1bmV3c2V0LCBzaXplb2YobmV3c2V0KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0Jc2lnZGVsc2V0bWFzaygmbmV3c2V0LCB+X0JMT0NLQUJMRSk7Ci0Jc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0KLQlzYXZlc2V0ID0gY3VycmVudC0+YmxvY2tlZDsKLQljdXJyZW50LT5ibG9ja2VkID0gbmV3c2V0OwotCi0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCi0JcmVncy0+cjEwID0gLUVJTlRSOwotCi0Jd2hpbGUgKDEpIHsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCXNjaGVkdWxlKCk7Ci0KLQkJaWYgKGRvX3NpZ25hbCgwLCAmc2F2ZXNldCwgcmVncykpIHsKLQkJCS8qIFNlZSBjb21tZW50IGluIGZ1bmN0aW9uIGFib3ZlLiAqLwotCQkJcmV0dXJuIHJlZ3MtPnIxMDsKLQkJfQotCX0KKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwlzY2hlZHVsZSgpOworCXNldF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKwlyZXR1cm4gLUVSRVNUQVJUTk9IQU5EOwogfQogCiBpbnQKQEAgLTI5MCw3ICsyMzIsNyBAQAogCQlnb3RvIGJhZGZyYW1lOwogCiAJaWYgKGRvX3NpZ2FsdHN0YWNrKCZmcmFtZS0+dWMudWNfc3RhY2ssIE5VTEwsIHJkdXNwKCkpID09IC1FRkFVTFQpCi0gCQlnb3RvIGJhZGZyYW1lOworCQlnb3RvIGJhZGZyYW1lOwogCiAJa2VlcF9kZWJ1Z19mbGFncyhvbGRjY3MsIG9sZHNwYywgcmVncyk7CiAKQEAgLTM0NywxMSArMjg5LDExIEBACiAvKiBHcmFiIGFuZCBzZXR1cCBhIHNpZ25hbCBmcmFtZS4KICAqCiAgKiBCYXNpY2FsbHkgYSBsb3Qgb2Ygc3RhdGUtaW5mbyBpcyBzdGFja2VkLCBhbmQgYXJyYW5nZWQgZm9yIHRoZQotICogdXNlci1tb2RlIHByb2dyYW0gdG8gcmV0dXJuIHRvIHRoZSBrZXJuZWwgdXNpbmcgZWl0aGVyIGEgdHJhbXBvbGluZQorICogdXNlci1tb2RlIHByb2dyYW0gdG8gcmV0dXJuIHRvIHRoZSBrZXJuZWwgdXNpbmcgZWl0aGVyIGEgdHJhbXBpbGluZQogICogd2hpY2ggcGVyZm9ybXMgdGhlIHN5c2NhbGwgc2lncmV0dXJuKCksIG9yIGEgcHJvdmlkZWQgdXNlci1tb2RlCiAgKiB0cmFtcG9saW5lLgogICAqLwotc3RhdGljIHZvaWQKK3N0YXRpYyBpbnQKIHNldHVwX2ZyYW1lKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsICBzaWdzZXRfdCAqc2V0LAogCSAgICBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCiB7CkBAIC00MTcsMTYgKzM1OSwxNyBAQAogCS8qIEFjdHVhbGx5IG1vdmUgdGhlIFVTUCB0byByZWZsZWN0IHRoZSBzdGFja2VkIGZyYW1lLiAqLwogCXdydXNwKCh1bnNpZ25lZCBsb25nKWZyYW1lKTsKIAotCXJldHVybjsKKwlyZXR1cm4gMDsKIAogZ2l2ZV9zaWdzZWd2OgogCWlmIChzaWcgPT0gU0lHU0VHVikKIAkJa2EtPnNhLnNhX2hhbmRsZXIgPSBTSUdfREZMOwogCiAJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOworCXJldHVybiAtRUZBVUxUOwogfQogCi1zdGF0aWMgdm9pZAorc3RhdGljIGludAogc2V0dXBfcnRfZnJhbWUoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc2lnaW5mb190ICppbmZvLAogCSAgICAgICBzaWdzZXRfdCAqc2V0LCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCiB7CkBAIC01MDMsMjEgKzQ0NiwyNCBAQAogCS8qIEFjdHVhbGx5IG1vdmUgdGhlIHVzcCB0byByZWZsZWN0IHRoZSBzdGFja2VkIGZyYW1lLiAqLwogCXdydXNwKCh1bnNpZ25lZCBsb25nKWZyYW1lKTsKIAotCXJldHVybjsKKwlyZXR1cm4gMDsKIAogZ2l2ZV9zaWdzZWd2OgogCWlmIChzaWcgPT0gU0lHU0VHVikKIAkJa2EtPnNhLnNhX2hhbmRsZXIgPSBTSUdfREZMOwogCiAJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOworCXJldHVybiAtRUZBVUxUOwogfQogCiAvKiBJbnZva2UgYSBzaW5nYWwgaGFuZGxlciB0bywgd2VsbCwgaGFuZGxlIHRoZSBzaWduYWwuICovCi1zdGF0aWMgaW5saW5lIHZvaWQKK3N0YXRpYyBpbmxpbmUgaW50CiBoYW5kbGVfc2lnbmFsKGludCBjYW5yZXN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpZywKIAkgICAgICBzaWdpbmZvX3QgKmluZm8sIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCiAgICAgICAgICAgICAgIHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKIHsKKwlpbnQgcmV0OworCiAJLyogQ2hlY2sgaWYgdGhpcyBnb3QgY2FsbGVkIGZyb20gYSBzeXN0ZW0gY2FsbC4gKi8KIAlpZiAoY2FucmVzdGFydCkgewogCQkvKiBJZiBzbywgY2hlY2sgc3lzdGVtIGNhbGwgcmVzdGFydGluZy4gKi8KQEAgLTU2MSwxOSArNTA3LDI0IEBACiAKIAkvKiBTZXQgdXAgdGhlIHN0YWNrIGZyYW1lLiAqLwogCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9TSUdJTkZPKQotCQlzZXR1cF9ydF9mcmFtZShzaWcsIGthLCBpbmZvLCBvbGRzZXQsIHJlZ3MpOworCQlyZXQgPSBzZXR1cF9ydF9mcmFtZShzaWcsIGthLCBpbmZvLCBvbGRzZXQsIHJlZ3MpOwogCWVsc2UKLQkJc2V0dXBfZnJhbWUoc2lnLCBrYSwgb2xkc2V0LCByZWdzKTsKKwkJcmV0ID0gc2V0dXBfZnJhbWUoc2lnLCBrYSwgb2xkc2V0LCByZWdzKTsKIAogCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9PTkVTSE9UKQogCQlrYS0+c2Euc2FfaGFuZGxlciA9IFNJR19ERkw7CiAKLQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQlzaWdvcnNldHMoJmN1cnJlbnQtPmJsb2NrZWQsJmN1cnJlbnQtPmJsb2NrZWQsJmthLT5zYS5zYV9tYXNrKTsKLQlpZiAoIShrYS0+c2Euc2FfZmxhZ3MgJiBTQV9OT0RFRkVSKSkKLQkJc2lnYWRkc2V0KCZjdXJyZW50LT5ibG9ja2VkLHNpZyk7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWlmIChyZXQgPT0gMCkgeworCQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkJc2lnb3JzZXRzKCZjdXJyZW50LT5ibG9ja2VkLCAmY3VycmVudC0+YmxvY2tlZCwKKwkJCSZrYS0+c2Euc2FfbWFzayk7CisJCWlmICghKGthLT5zYS5zYV9mbGFncyAmIFNBX05PREVGRVIpKQorCQkJc2lnYWRkc2V0KCZjdXJyZW50LT5ibG9ja2VkLCBzaWcpOworCQlyZWNhbGNfc2lncGVuZGluZygpOworCQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCX0KKworCXJldHVybiByZXQ7CiB9CiAKIC8qCkBAIC01ODcsMTIgKzUzOCwxMyBAQAogICogd2UgY2FuIHVzZSB1c2VyX21vZGUocmVncykgdG8gc2VlIGlmIHdlIGNhbWUgZGlyZWN0bHkgZnJvbSBrZXJuZWwgb3IgdXNlcgogICogbW9kZSBiZWxvdy4KICAqLwotaW50Ci1kb19zaWduYWwoaW50IGNhbnJlc3RhcnQsIHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQordm9pZAorZG9fc2lnbmFsKGludCBjYW5yZXN0YXJ0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgc2lnbnI7CiAJc2lnaW5mb190IGluZm87CiAgICAgICAgIHN0cnVjdCBrX3NpZ2FjdGlvbiBrYTsKKwlzaWdzZXRfdCAqb2xkc2V0OwogCiAJLyoKIAkgKiBUaGUgY29tbW9uIGNhc2Ugc2hvdWxkIGdvIGZhc3QsIHdoaWNoIGlzIHdoeSB0aGlzIHBvaW50IGlzCkBAIC02MDAsMTcgKzU1MiwyOCBAQAogCSAqIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuCiAJICovCiAJaWYgKCF1c2VyX21vZGUocmVncykpCi0JCXJldHVybiAxOworCQlyZXR1cm47CiAKLQlpZiAoIW9sZHNldCkKKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKKwkJb2xkc2V0ID0gJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2s7CisJZWxzZQogCQlvbGRzZXQgPSAmY3VycmVudC0+YmxvY2tlZDsKIAogCXNpZ25yID0gZ2V0X3NpZ25hbF90b19kZWxpdmVyKCZpbmZvLCAma2EsIHJlZ3MsIE5VTEwpOwogCiAJaWYgKHNpZ25yID4gMCkgewotCQkvKiBEZWxpdmVyIHRoZSBzaWduYWwuICovCi0JCWhhbmRsZV9zaWduYWwoY2FucmVzdGFydCwgc2lnbnIsICZpbmZvLCAma2EsIG9sZHNldCwgcmVncyk7Ci0JCXJldHVybiAxOworCQkvKiBXaGVlISAgQWN0dWFsbHkgZGVsaXZlciB0aGUgc2lnbmFsLiAgKi8KKwkJaWYgKGhhbmRsZV9zaWduYWwoY2FucmVzdGFydCwgc2lnbnIsICZpbmZvLCAma2EsCisJCQkJb2xkc2V0LCByZWdzKSkgeworCQkJLyogYSBzaWduYWwgd2FzIHN1Y2Nlc3NmdWxseSBkZWxpdmVyZWQ7IHRoZSBzYXZlZAorCQkJICogc2lnbWFzayB3aWxsIGhhdmUgYmVlbiBzdG9yZWQgaW4gdGhlIHNpZ25hbCBmcmFtZSwKKwkJCSAqIGFuZCB3aWxsIGJlIHJlc3RvcmVkIGJ5IHNpZ3JldHVybiwgc28gd2UgY2FuIHNpbXBseQorCQkJICogY2xlYXIgdGhlIFRJRl9SRVNUT1JFX1NJR01BU0sgZmxhZyAqLworCQkJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCisJCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CisJCX0KKworCQlyZXR1cm47CiAJfQogCiAJLyogR290IGhlcmUgZnJvbSBhIHN5c3RlbSBjYWxsPyAqLwpAQCAtNjI4LDcgKzU5MSwxMiBAQAogCQl9CiAJfQogCi0JcmV0dXJuIDA7CisJLyogaWYgdGhlcmUncyBubyBzaWduYWwgdG8gZGVsaXZlciwgd2UganVzdCBwdXQgdGhlIHNhdmVkIHNpZ21hc2sKKwkgKiBiYWNrICovCisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpIHsKKwkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CisJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmY3VycmVudC0+c2F2ZWRfc2lnbWFzaywgTlVMTCk7CisJfQogfQogCiBhc21saW5rYWdlIHZvaWQKQEAgLTY0MSw3ICs2MDksNyBAQAogCQl1c2VyX3JlZ3ModGkpLT5zcGMgPSAwOwogCX0KIAkvKiBGSVhNRTogRmlsdGVyIG91dCBmYWxzZSBoL3cgYnJlYWtwb2ludCBoaXRzIChpLmUuIEVEQQotCSAgIG5vdCB3aXRoaW4gYW55IGNvbmZpZ3VyZWQgaC93IGJyZWFrcG9pbnQgcmFuZ2UpLiBTeW5jaHJvbml6ZSB3aXRoCisJICAgbm90IHdpdGhpbmcgYW55IGNvbmZpZ3VyZWQgaC93IGJyZWFrcG9pbnQgcmFuZ2UpLiBTeW5jaHJvbml6ZSB3aXRoCiAJICAgd2hhdCBhbHJlYWR5IGV4aXN0cyBmb3Iga2VybmVsIGRlYnVnZ2luZy4gICovCiAJaWYgKCgodXNlcl9yZWdzKHRpKS0+ZXhzICYgMHhmZjAwKSA+PiA4KSA9PSBCUkVBS184X0lOVFJfVkVDVCkgewogCQkvKiBCcmVhayA4OiBzdWJ0cmFjdCAyIGZyb20gRVJQIHVubGVzcyBpbiBhIGRlbGF5IHNsb3QuICovCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3NtcC5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9zbXAuYwppbmRleCAxNzFjOTZlLi5hOWMzMzM0IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvc21wLmMKQEAgLTEsMTEgKzEsMTIgQEAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9kZWxheS5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2lycS5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9pbnRyX3ZlY3QuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvaW50cl92ZWN0X2RlZnMuaD4KKyNpbmNsdWRlIDxpcnEuaD4KKyNpbmNsdWRlIDxod3JlZ3MvaW50cl92ZWN0Lmg+CisjaW5jbHVkZSA8aHdyZWdzL2ludHJfdmVjdF9kZWZzLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL21tdV9kZWZzX2FzbS5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9zdXBwX3JlZy5oPgorI2luY2x1ZGUgPGh3cmVncy9hc20vbW11X2RlZnNfYXNtLmg+CisjaW5jbHVkZSA8aHdyZWdzL3N1cHBfcmVnLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CkBAIC0yMCw2ICsyMSw3IEBACiAjZGVmaW5lIElQSV9TQ0hFRFVMRSAxCiAjZGVmaW5lIElQSV9DQUxMIDIKICNkZWZpbmUgSVBJX0ZMVVNIX1RMQiA0CisjZGVmaW5lIElQSV9CT09UIDgKIAogI2RlZmluZSBGTFVTSF9BTEwgKHZvaWQqKTB4ZmZmZmZmZmYKIApAQCAtMzAsNiArMzIsOCBAQAogY3B1bWFza190IGNwdV9vbmxpbmVfbWFwID0gQ1BVX01BU0tfTk9ORTsKIEVYUE9SVF9TWU1CT0woY3B1X29ubGluZV9tYXApOwogY3B1bWFza190IHBoeXNfY3B1X3ByZXNlbnRfbWFwID0gQ1BVX01BU0tfTk9ORTsKK2NwdW1hc2tfdCBjcHVfcG9zc2libGVfbWFwOworRVhQT1JUX1NZTUJPTChjcHVfcG9zc2libGVfbWFwKTsKIEVYUE9SVF9TWU1CT0wocGh5c19jcHVfcHJlc2VudF9tYXApOwogCiAvKiBWYXJpYWJsZXMgdXNlZCBkdXJpbmcgU01QIGJvb3QgKi8KQEAgLTU1LDEzICs1OSwxMiBAQAogZXh0ZXJuIGludCBzZXR1cF9pcnEoaW50LCBzdHJ1Y3QgaXJxYWN0aW9uICopOwogCiAvKiBNb2RlIHJlZ2lzdGVycyAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaXJxX3JlZ3NbTlJfQ1BVU10gPQoteworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXJxX3JlZ3NbTlJfQ1BVU10gPSB7CiAgIHJlZ2lfaXJxLAogICByZWdpX2lycTIKIH07CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBjcmlzdjMyX2lwaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaXJxcmV0dXJuX3QgY3Jpc3YzMl9pcGlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiBzdGF0aWMgaW50IHNlbmRfaXBpKGludCB2ZWN0b3IsIGludCB3YWl0LCBjcHVtYXNrX3QgY3B1X21hc2spOwogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXJxX2lwaSAgPSB7CiAJLmhhbmRsZXIgPSBjcmlzdjMyX2lwaV9pbnRlcnJ1cHQsCkBAIC0xMDEsNiArMTA0LDcgQEAKIAogCWNwdV9zZXQoMCwgY3B1X29ubGluZV9tYXApOwogCWNwdV9zZXQoMCwgcGh5c19jcHVfcHJlc2VudF9tYXApOworCWNwdV9zZXQoMCwgY3B1X3Bvc3NpYmxlX21hcCk7CiB9CiAKIHZvaWQgX19pbml0IHNtcF9jcHVzX2RvbmUodW5zaWduZWQgaW50IG1heF9jcHVzKQpAQCAtMTEzLDYgKzExNyw3IEBACiB7CiAJdW5zaWduZWQgdGltZW91dDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGU7CisJY3B1bWFza190IGNwdV9tYXNrID0gQ1BVX01BU0tfTk9ORTsKIAogCWlkbGUgPSBmb3JrX2lkbGUoY3B1aWQpOwogCWlmIChJU19FUlIoaWRsZSkpCkBAIC0xMjQsNiArMTI5LDEyIEBACiAJc21wX2luaXRfY3VycmVudF9pZGxlX3RocmVhZCA9IHRhc2tfdGhyZWFkX2luZm8oaWRsZSk7CiAJY3B1X25vd19ib290aW5nID0gY3B1aWQ7CiAKKwkvKiBLaWNrIGl0ICovCisJY3B1X3NldChjcHVpZCwgY3B1X29ubGluZV9tYXApOworCWNwdV9zZXQoY3B1aWQsIGNwdV9tYXNrKTsKKwlzZW5kX2lwaShJUElfQk9PVCwgMCwgY3B1X21hc2spOworCWNwdV9jbGVhcihjcHVpZCwgY3B1X29ubGluZV9tYXApOworCiAJLyogV2FpdCBmb3IgQ1BVIHRvIGNvbWUgb25saW5lICovCiAJZm9yICh0aW1lb3V0ID0gMDsgdGltZW91dCA8IDEwMDAwOyB0aW1lb3V0KyspIHsKIAkJaWYoY3B1X29ubGluZShjcHVpZCkpIHsKQEAgLTE2NSw3ICsxNzYsNyBAQAogCS8qIEVuYWJsZSBJUlEgYW5kIGlkbGUgKi8KIAlSRUdfV1IoaW50cl92ZWN0LCBpcnFfcmVnc1tjcHVdLCByd19tYXNrLCB2ZWN0X21hc2spOwogCXVubWFza19pcnEoSVBJX0lOVFJfVkVDVCk7Ci0JdW5tYXNrX2lycShUSU1FUl9JTlRSX1ZFQ1QpOworCXVubWFza19pcnEoVElNRVIwX0lOVFJfVkVDVCk7CiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCkBAIC0zMjgsNyArMzM5LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pcnFyZXR1cm5fdCBjcmlzdjMyX2lwaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2lycXJldHVybl90IGNyaXN2MzJfaXBpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJdm9pZCAoKmZ1bmMpICh2b2lkICppbmZvKSA9IGNhbGxfZGF0YS0+ZnVuYzsKIAl2b2lkICppbmZvID0gY2FsbF9kYXRhLT5pbmZvOwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC90aW1lLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3RpbWUuYwppbmRleCAyZjdlOGUyLi4zYTEzZGQ2IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3RpbWUuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3RpbWUuYwpAQCAtMSw4ICsxLDcgQEAKLS8qICRJZDogdGltZS5jLHYgMS4xOSAyMDA1LzA0LzI5IDA1OjQwOjA5IHN0YXJ2aWsgRXhwICQKLSAqCisvKgogICogIGxpbnV4L2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvdGltZS5jCiAgKgotICogIENvcHlyaWdodCAoQykgMjAwMyBBeGlzIENvbW11bmljYXRpb25zIEFCCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDcgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgogICoKICAqLwogCkBAIC0xNCwyOCArMTMsMzQgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vcnRjLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgogCi0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL3JlZ19tYXAuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvcmVnX3Jkd3IuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvdGltZXJfZGVmcy5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9pbnRyX3ZlY3RfZGVmcy5oPgorI2luY2x1ZGUgPGh3cmVncy9yZWdfbWFwLmg+CisjaW5jbHVkZSA8aHdyZWdzL3JlZ19yZHdyLmg+CisjaW5jbHVkZSA8aHdyZWdzL3RpbWVyX2RlZnMuaD4KKyNpbmNsdWRlIDxod3JlZ3MvaW50cl92ZWN0X2RlZnMuaD4KKyNpZmRlZiBDT05GSUdfQ1JJU19NQUNIX0FSVFBFQzMKKyNpbmNsdWRlIDxod3JlZ3MvY2xrZ2VuX2RlZnMuaD4KKyNlbmRpZgogCiAvKiBXYXRjaGRvZyBkZWZpbmVzICovCi0jZGVmaW5lIEVUUkFYX1dEX0tFWV9NQVNLIDB4N0YgLyoga2V5IGlzIDcgYml0ICovCi0jZGVmaW5lIEVUUkFYX1dEX0haICAgICAgIDc2MyAvKiB3YXRjaGRvZyBjb3VudHMgYXQgNzYzIEh6ICovCi0jZGVmaW5lIEVUUkFYX1dEX0NOVCAgICAgICgoMipFVFJBWF9XRF9IWikvSFogKyAxKSAvKiBOdW1iZXIgb2YgNzYzIGNvdW50cyBiZWZvcmUgd2F0Y2hkb2cgYml0ZXMgKi8KKyNkZWZpbmUgRVRSQVhfV0RfS0VZX01BU0sJMHg3RiAvKiBrZXkgaXMgNyBiaXQgKi8KKyNkZWZpbmUgRVRSQVhfV0RfSFoJCTc2MyAvKiB3YXRjaGRvZyBjb3VudHMgYXQgNzYzIEh6ICovCisvKiBOdW1iZXIgb2YgNzYzIGNvdW50cyBiZWZvcmUgd2F0Y2hkb2cgYml0ZXMgKi8KKyNkZWZpbmUgRVRSQVhfV0RfQ05UCQkoKDIqRVRSQVhfV0RfSFopL0haICsgMSkKIAogdW5zaWduZWQgbG9uZyB0aW1lcl9yZWdzW05SX0NQVVNdID0KIHsKLSAgcmVnaV90aW1lciwKKwlyZWdpX3RpbWVyMCwKICNpZmRlZiBDT05GSUdfU01QCi0gIHJlZ2lfdGltZXIyCisJcmVnaV90aW1lcjIKICNlbmRpZgogfTsKIApAQCAtNDQsMTIgKzQ5LDIyIEBACiBleHRlcm4gaW50IHNldHVwX2lycShpbnQsIHN0cnVjdCBpcnFhY3Rpb24gKik7CiBleHRlcm4gaW50IGhhdmVfcnRjOwogCisjaWZkZWYgQ09ORklHX0NQVV9GUkVRCitzdGF0aWMgaW50CitjcmlzX3RpbWVfZnJlcV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIHZhbCwKKwkJCXZvaWQgKmRhdGEpOworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGNyaXNfdGltZV9mcmVxX25vdGlmaWVyX2Jsb2NrID0geworCS5ub3RpZmllcl9jYWxsID0gY3Jpc190aW1lX2ZyZXFfbm90aWZpZXIsCit9OworI2VuZGlmCisKIHVuc2lnbmVkIGxvbmcgZ2V0X25zX2luX2ppZmZpZSh2b2lkKQogewogCXJlZ190aW1lcl9yX3RtcjBfZGF0YSBkYXRhOwogCXVuc2lnbmVkIGxvbmcgbnM7CiAKLQlkYXRhID0gUkVHX1JEKHRpbWVyLCByZWdpX3RpbWVyLCByX3RtcjBfZGF0YSk7CisJZGF0YSA9IFJFR19SRCh0aW1lciwgcmVnaV90aW1lcjAsIHJfdG1yMF9kYXRhKTsKIAlucyA9IChUSU1FUjBfRElWIC0gZGF0YSkgKiAxMDsKIAlyZXR1cm4gbnM7CiB9CkBAIC01OSwzMSArNzQsMjcgQEAKIAl1bnNpZ25lZCBsb25nIGNvdW50OwogCXVuc2lnbmVkIGxvbmcgdXNlY19jb3VudCA9IDA7CiAKLQlzdGF0aWMgdW5zaWduZWQgbG9uZyBjb3VudF9wID0gVElNRVIwX0RJVjsvKiBmb3IgdGhlIGZpcnN0IGNhbGwgYWZ0ZXIgYm9vdCAqLworCS8qIEZvciB0aGUgZmlyc3QgY2FsbCBhZnRlciBib290ICovCisJc3RhdGljIHVuc2lnbmVkIGxvbmcgY291bnRfcCA9IFRJTUVSMF9ESVY7CiAJc3RhdGljIHVuc2lnbmVkIGxvbmcgamlmZmllc19wID0gMDsKIAotCS8qCi0JICogY2FjaGUgdm9sYXRpbGUgamlmZmllcyB0ZW1wb3JhcmlseTsgd2UgaGF2ZSBJUlFzIHR1cm5lZCBvZmYuCi0JICovCisJLyogQ2FjaGUgdm9sYXRpbGUgamlmZmllcyB0ZW1wb3JhcmlseTsgd2UgaGF2ZSBJUlFzIHR1cm5lZCBvZmYuICovCiAJdW5zaWduZWQgbG9uZyBqaWZmaWVzX3Q7CiAKIAkvKiBUaGUgdGltZXIgaW50ZXJydXB0IGNvbWVzIGZyb20gRXRyYXggdGltZXIgMC4gSW4gb3JkZXIgdG8gZ2V0CiAJICogYmV0dGVyIHByZWNpc2lvbiwgd2UgY2hlY2sgdGhlIGN1cnJlbnQgdmFsdWUuIEl0IG1pZ2h0IGhhdmUKLQkgKiB1bmRlcmZsb3dlZCBhbHJlYWR5IHRob3VnaC4KLQkgKi8KKwkgKiB1bmRlcmZsb3dlZCBhbHJlYWR5IHRob3VnaC4gKi8KKwljb3VudCA9IFJFR19SRCh0aW1lciwgcmVnaV90aW1lcjAsIHJfdG1yMF9kYXRhKTsKKwlqaWZmaWVzX3QgPSBqaWZmaWVzOwogCi0JY291bnQgPSBSRUdfUkQodGltZXIsIHJlZ2lfdGltZXIsIHJfdG1yMF9kYXRhKTsKLSAJamlmZmllc190ID0gamlmZmllczsKLQotCS8qCi0JICogYXZvaWRpbmcgdGltZXIgaW5jb25zaXN0ZW5jaWVzICh0aGV5IGFyZSByYXJlLCBidXQgdGhleSBoYXBwZW4pLi4uCi0JICogdGhlcmUgYXJlIG9uZSBwcm9ibGVtIHRoYXQgbXVzdCBiZSBhdm9pZGVkIGhlcmU6Ci0JICogIDEuIHRoZSB0aW1lciBjb3VudGVyIHVuZGVyZmxvd3MKKwkvKiBBdm9pZGluZyB0aW1lciBpbmNvbnNpc3RlbmNpZXMgKHRoZXkgYXJlIHJhcmUsIGJ1dCB0aGV5IGhhcHBlbikKKwkgKiBUaGVyZSBpcyBvbmUgcHJvYmxlbSB0aGF0IG11c3QgYmUgYXZvaWRlZCBoZXJlOgorCSAqCTEuIHRoZSB0aW1lciBjb3VudGVyIHVuZGVyZmxvd3MKIAkgKi8KIAlpZiggamlmZmllc190ID09IGppZmZpZXNfcCApIHsKIAkJaWYoIGNvdW50ID4gY291bnRfcCApIHsKLQkJCS8qIFRpbWVyIHdyYXBwZWQsIHVzZSBuZXcgY291bnQgYW5kIHByZXNjYWxlCi0JCQkgKiBpbmNyZWFzZSB0aGUgdGltZSBjb3JyZXNwb25kaW5nIHRvIG9uZSBqaWZmaWUKKwkJCS8qIFRpbWVyIHdyYXBwZWQsIHVzZSBuZXcgY291bnQgYW5kIHByZXNjYWxlLgorCQkJICogSW5jcmVhc2UgdGhlIHRpbWUgY29ycmVzcG9uZGluZyB0byBvbmUgamlmZnkuCiAJCQkgKi8KIAkJCXVzZWNfY291bnQgPSAxMDAwMDAwL0haOwogCQl9CkBAIC0xMDYsMTcgKzExNywxNSBAQAogICovCiAvKiBUaGlzIGdpdmVzIHVzIDEuMyBtcyB0byBkbyBzb21ldGhpbmcgdXNlZnVsIHdoZW4gdGhlIE5NSSBjb21lcyAqLwogCi0vKiByaWdodCBub3csIHN0YXJ0aW5nIHRoZSB3YXRjaGRvZyBpcyB0aGUgc2FtZSBhcyByZXNldHRpbmcgaXQgKi8KKy8qIFJpZ2h0IG5vdywgc3RhcnRpbmcgdGhlIHdhdGNoZG9nIGlzIHRoZSBzYW1lIGFzIHJlc2V0dGluZyBpdCAqLwogI2RlZmluZSBzdGFydF93YXRjaGRvZyByZXNldF93YXRjaGRvZwogCiAjaWYgZGVmaW5lZChDT05GSUdfRVRSQVhfV0FUQ0hET0cpCiBzdGF0aWMgc2hvcnQgaW50IHdhdGNoZG9nX2tleSA9IDQyOyAgLyogYXJiaXRyYXJ5IDcgYml0IG51bWJlciAqLwogI2VuZGlmCiAKLS8qIG51bWJlciBvZiBwYWdlcyB0byBjb25zaWRlciAib3V0IG9mIG1lbW9yeSIuIGl0IGlzIG5vcm1hbCB0aGF0IHRoZSBtZW1vcnkKLSAqIGlzIHVzZWQgdGhvdWdoLCBzbyBwdXQgdGhpcyByZWFsbHkgbG93LgotICovCi0KKy8qIE51bWJlciBvZiBwYWdlcyB0byBjb25zaWRlciAib3V0IG9mIG1lbW9yeSIuIEl0IGlzIG5vcm1hbCB0aGF0IHRoZSBtZW1vcnkKKyAqIGlzIHVzZWQgdGhvdWdoLCBzbyBzZXQgdGhpcyByZWFsbHkgbG93LiAqLwogI2RlZmluZSBXQVRDSERPR19NSU5fRlJFRV9QQUdFUyA4CiAKIHZvaWQKQEAgLTEyNSwxNCArMTM0LDE1IEBACiAjaWYgZGVmaW5lZChDT05GSUdfRVRSQVhfV0FUQ0hET0cpCiAJcmVnX3RpbWVyX3J3X3dkX2N0cmwgd2RfY3RybCA9IHsgMCB9OwogCi0JLyogb25seSBrZWVwIHdhdGNoZG9nIGhhcHB5IGFzIGxvbmcgYXMgd2UgaGF2ZSBtZW1vcnkgbGVmdCEgKi8KKwkvKiBPbmx5IGtlZXAgd2F0Y2hkb2cgaGFwcHkgYXMgbG9uZyBhcyB3ZSBoYXZlIG1lbW9yeSBsZWZ0ISAqLwogCWlmKG5yX2ZyZWVfcGFnZXMoKSA+IFdBVENIRE9HX01JTl9GUkVFX1BBR0VTKSB7Ci0JCS8qIHJlc2V0IHRoZSB3YXRjaGRvZyB3aXRoIHRoZSBpbnZlcnNlIG9mIHRoZSBvbGQga2V5ICovCi0JCXdhdGNoZG9nX2tleSBePSBFVFJBWF9XRF9LRVlfTUFTSzsgLyogaW52ZXJ0IGtleSwgd2hpY2ggaXMgNyBiaXRzICovCisJCS8qIFJlc2V0IHRoZSB3YXRjaGRvZyB3aXRoIHRoZSBpbnZlcnNlIG9mIHRoZSBvbGQga2V5ICovCisJCS8qIEludmVydCBrZXksIHdoaWNoIGlzIDcgYml0cyAqLworCQl3YXRjaGRvZ19rZXkgXj0gRVRSQVhfV0RfS0VZX01BU0s7CiAJCXdkX2N0cmwuY250ID0gRVRSQVhfV0RfQ05UOwogCQl3ZF9jdHJsLmNtZCA9IHJlZ2tfdGltZXJfc3RhcnQ7CiAJCXdkX2N0cmwua2V5ID0gd2F0Y2hkb2dfa2V5OwotCQlSRUdfV1IodGltZXIsIHJlZ2lfdGltZXIsIHJ3X3dkX2N0cmwsIHdkX2N0cmwpOworCQlSRUdfV1IodGltZXIsIHJlZ2lfdGltZXIwLCByd193ZF9jdHJsLCB3ZF9jdHJsKTsKIAl9CiAjZW5kaWYKIH0KQEAgLTE0OCw3ICsxNTgsNyBAQAogCXdkX2N0cmwuY250ID0gRVRSQVhfV0RfQ05UOwogCXdkX2N0cmwuY21kID0gcmVna190aW1lcl9zdG9wOwogCXdkX2N0cmwua2V5ID0gd2F0Y2hkb2dfa2V5OwotCVJFR19XUih0aW1lciwgcmVnaV90aW1lciwgcndfd2RfY3RybCwgd2RfY3RybCk7CisJUkVHX1dSKHRpbWVyLCByZWdpX3RpbWVyMCwgcndfd2RfY3RybCwgd2RfY3RybCk7CiAjZW5kaWYKIH0KIApAQCAtMTYwLDE3ICsxNzAsMjggQEAKICNpZiBkZWZpbmVkKENPTkZJR19FVFJBWF9XQVRDSERPRykKIAlleHRlcm4gaW50IGNhdXNlX29mX2RlYXRoOwogCi0JcmF3X3ByaW50aygiV2F0Y2hkb2cgYml0ZVxuIik7CisJb29wc19pbl9wcm9ncmVzcyA9IDE7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiV2F0Y2hkb2cgYml0ZVxuIik7CiAKIAkvKiBDaGVjayBpZiBmb3JjZWQgcmVzdGFydCBvciB1bmV4cGVjdGVkIHdhdGNoZG9nICovCiAJaWYgKGNhdXNlX29mX2RlYXRoID09IDB4YmVkZWFkKSB7CisjaWZkZWYgQ09ORklHX0NSSVNfTUFDSF9BUlRQRUMzCisJCS8qIFRoZXJlIGlzIGEgYnVnIGluIEFydHBlYy0zICh2b29kb28gVFIgNzgpIHRoYXQgcmVxdWlyZXMKKwkJICogdXMgdG8gZ28gdG8gbG93ZXIgZnJlcXVlbmN5IGZvciB0aGUgcmVzZXQgdG8gYmUgcmVsaWFibGUKKwkJICovCisJCXJlZ19jbGtnZW5fcndfY2xrX2N0cmwgY3RybCA9CisJCQlSRUdfUkQoY2xrZ2VuLCByZWdpX2Nsa2dlbiwgcndfY2xrX2N0cmwpOworCQljdHJsLnBsbCA9IDA7CisJCVJFR19XUihjbGtnZW4sIHJlZ2lfY2xrZ2VuLCByd19jbGtfY3RybCwgY3RybCk7CisjZW5kaWYKIAkJd2hpbGUoMSk7CiAJfQogCi0JLyogVW5leHBlY3RlZCB3YXRjaGRvZywgc3RvcCB0aGUgd2F0Y2hkb2cgYW5kIGR1bXAgcmVnaXN0ZXJzKi8KKwkvKiBVbmV4cGVjdGVkIHdhdGNoZG9nLCBzdG9wIHRoZSB3YXRjaGRvZyBhbmQgZHVtcCByZWdpc3RlcnMuICovCiAJc3RvcF93YXRjaGRvZygpOwotCXJhd19wcmludGsoIk9vcHM6IGJpdHRlbiBieSB3YXRjaGRvZ1xuIik7Ci0gICAgICAgIHNob3dfcmVnaXN0ZXJzKHJlZ3MpOworCXByaW50ayhLRVJOX1dBUk5JTkcgIk9vcHM6IGJpdHRlbiBieSB3YXRjaGRvZ1xuIik7CisJc2hvd19yZWdpc3RlcnMocmVncyk7CisJb29wc19pbl9wcm9ncmVzcyA9IDA7CiAjaWZuZGVmIENPTkZJR19FVFJBWF9XQVRDSERPR19OSUNFX0RPR0dZCiAJcmVzZXRfd2F0Y2hkb2coKTsKICNlbmRpZgpAQCAtMTc4LDIxICsxOTksMTkgQEAKICNlbmRpZgogfQogCi0vKiBsYXN0IHRpbWUgdGhlIGNtb3MgY2xvY2sgZ290IHVwZGF0ZWQgKi8KKy8qIExhc3QgdGltZSB0aGUgY21vcyBjbG9jayBnb3QgdXBkYXRlZC4gKi8KIHN0YXRpYyBsb25nIGxhc3RfcnRjX3VwZGF0ZSA9IDA7CiAKIC8qCiAgKiB0aW1lcl9pbnRlcnJ1cHQoKSBuZWVkcyB0byBrZWVwIHVwIHRoZSByZWFsLXRpbWUgY2xvY2ssCi0gKiBhcyB3ZWxsIGFzIGNhbGwgdGhlICJkb190aW1lcigpIiByb3V0aW5lIGV2ZXJ5IGNsb2NrdGljaworICogYXMgd2VsbCBhcyBjYWxsIHRoZSAiZG9fdGltZXIoKSIgcm91dGluZSBldmVyeSBjbG9ja3RpY2suCiAgKi8KLQotLy9zdGF0aWMgdW5zaWduZWQgc2hvcnQgbXlqaWZmOyAvKiB1c2VkIGJ5IG91ciBkZWJ1ZyByb3V0aW5lIHByaW50X3RpbWVzdGFtcCAqLwotCiBleHRlcm4gdm9pZCBjcmlzX2RvX3Byb2ZpbGUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCiBzdGF0aWMgaW5saW5lIGlycXJldHVybl90Ci10aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBnZXRfaXJxX3JlZ3MoKTsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXJlZ190aW1lcl9yX21hc2tlZF9pbnRyIG1hc2tlZF9pbnRyOwogCXJlZ190aW1lcl9yd19hY2tfaW50ciBhY2tfaW50ciA9IHsgMCB9OwpAQCAtMjAyLDExICsyMjEsMTEgQEAKIAlpZiAoIW1hc2tlZF9pbnRyLnRtcjApCiAJCXJldHVybiBJUlFfTk9ORTsKIAotCS8qIGFja25vd2xlZGdlIHRoZSB0aW1lciBpcnEgKi8KKwkvKiBBY2tub3dsZWRnZSB0aGUgdGltZXIgaXJxLiAqLwogCWFja19pbnRyLnRtcjAgPSAxOwogCVJFR19XUih0aW1lciwgdGltZXJfcmVnc1tjcHVdLCByd19hY2tfaW50ciwgYWNrX2ludHIpOwogCi0JLyogcmVzZXQgd2F0Y2hkb2cgb3RoZXJ3aXNlIGl0IHJlc2V0cyB1cyEgKi8KKwkvKiBSZXNldCB3YXRjaGRvZyBvdGhlcndpc2UgaXQgcmVzZXRzIHVzISAqLwogCXJlc2V0X3dhdGNoZG9nKCk7CiAKICAgICAgICAgLyogVXBkYXRlIHN0YXRpc3RpY3MuICovCkBAIC0yMTgsNyArMjM3LDcgQEAKIAlpZiAoY3B1ICE9IDApCiAJCXJldHVybiBJUlFfSEFORExFRDsKIAotCS8qIGNhbGwgdGhlIHJlYWwgdGltZXIgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwkvKiBDYWxsIHRoZSByZWFsIHRpbWVyIGludGVycnVwdCBoYW5kbGVyICovCiAJZG9fdGltZXIoMSk7CiAKIAkvKgpAQCAtMjM2LDE3ICsyNTUsMTcgQEAKIAkJaWYgKHNldF9ydGNfbW1zcyh4dGltZS50dl9zZWMpID09IDApCiAJCQlsYXN0X3J0Y191cGRhdGUgPSB4dGltZS50dl9zZWM7CiAJCWVsc2UKLQkJCWxhc3RfcnRjX3VwZGF0ZSA9IHh0aW1lLnR2X3NlYyAtIDYwMDsgLyogZG8gaXQgYWdhaW4gaW4gNjAgcyAqLworCQkJLyogRG8gaXQgYWdhaW4gaW4gNjAgcyAqLworCQkJbGFzdF9ydGNfdXBkYXRlID0geHRpbWUudHZfc2VjIC0gNjAwOwogCX0KICAgICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi0vKiB0aW1lciBpcyBJUlFGX1NIQVJFRCBzbyBkcml2ZXJzIGNhbiBhZGQgc3R1ZmYgdG8gdGhlIHRpbWVyIGlycSBjaGFpbgotICogaXQgbmVlZHMgdG8gYmUgSVJRRl9ESVNBQkxFRCB0byBtYWtlIHRoZSBqaWZmaWVzIHVwZGF0ZSB3b3JrIHByb3Blcmx5CisvKiBUaW1lciBpcyBJUlFGX1NIQVJFRCBzbyBkcml2ZXJzIGNhbiBhZGQgc3R1ZmYgdG8gdGhlIHRpbWVyIGlycSBjaGFpbi4KKyAqIEl0IG5lZWRzIHRvIGJlIElSUUZfRElTQUJMRUQgdG8gbWFrZSB0aGUgamlmZmllcyB1cGRhdGUgd29yayBwcm9wZXJseS4KICAqLwotCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpcnFfdGltZXIgID0gewotCS5tYXNrID0gdGltZXJfaW50ZXJydXB0LAorc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXJxX3RpbWVyID0geworCS5oYW5kbGVyID0gdGltZXJfaW50ZXJydXB0LAogCS5mbGFncyA9IElSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCwKIAkubWFzayA9IENQVV9NQVNLX05PTkUsCiAJLm5hbWUgPSAidGltZXIiCkBAIC0yNTYsMjcgKzI3NSwyNyBAQAogY3Jpc190aW1lcl9pbml0KHZvaWQpCiB7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLSAgCXJlZ190aW1lcl9yd190bXIwX2N0cmwgdG1yMF9jdHJsID0geyAwIH07Ci0gICAgICAgCXJlZ190aW1lcl9yd190bXIwX2RpdiB0bXIwX2RpdiA9IFRJTUVSMF9ESVY7CisJcmVnX3RpbWVyX3J3X3RtcjBfY3RybCB0bXIwX2N0cmwgPSB7IDAgfTsKKwlyZWdfdGltZXJfcndfdG1yMF9kaXYgdG1yMF9kaXYgPSBUSU1FUjBfRElWOwogCXJlZ190aW1lcl9yd19pbnRyX21hc2sgdGltZXJfaW50cl9tYXNrOwogCi0JLyogU2V0dXAgdGhlIGV0cmF4IHRpbWVycworCS8qIFNldHVwIHRoZSBldHJheCB0aW1lcnMuCiAJICogQmFzZSBmcmVxdWVuY3kgaXMgMTAwTUh6LCBkaXZpZGVyIDEwMDAwMDAgLT4gMTAwIEhaCiAJICogV2UgdXNlIHRpbWVyMCwgc28gdGltZXIxIGlzIGZyZWUuCiAJICogVGhlIHRyaWcgdGltZXIgaXMgdXNlZCBieSB0aGUgZmFzdHRpbWVyIEFQSSBpZiBlbmFibGVkLgogCSAqLwogCi0gICAgICAgCXRtcjBfY3RybC5vcCA9IHJlZ2tfdGltZXJfbGQ7CisJdG1yMF9jdHJsLm9wID0gcmVna190aW1lcl9sZDsKIAl0bXIwX2N0cmwuZnJlcSA9IHJlZ2tfdGltZXJfZjEwMDsKLSAgICAgICAJUkVHX1dSKHRpbWVyLCB0aW1lcl9yZWdzW2NwdV0sIHJ3X3RtcjBfZGl2LCB0bXIwX2Rpdik7Ci0gICAgICAgCVJFR19XUih0aW1lciwgdGltZXJfcmVnc1tjcHVdLCByd190bXIwX2N0cmwsIHRtcjBfY3RybCk7IC8qIExvYWQgKi8KLSAgICAgICAJdG1yMF9jdHJsLm9wID0gcmVna190aW1lcl9ydW47Ci0gICAgICAgCVJFR19XUih0aW1lciwgdGltZXJfcmVnc1tjcHVdLCByd190bXIwX2N0cmwsIHRtcjBfY3RybCk7IC8qIFN0YXJ0ICovCisJUkVHX1dSKHRpbWVyLCB0aW1lcl9yZWdzW2NwdV0sIHJ3X3RtcjBfZGl2LCB0bXIwX2Rpdik7CisJUkVHX1dSKHRpbWVyLCB0aW1lcl9yZWdzW2NwdV0sIHJ3X3RtcjBfY3RybCwgdG1yMF9jdHJsKTsgLyogTG9hZCAqLworCXRtcjBfY3RybC5vcCA9IHJlZ2tfdGltZXJfcnVuOworCVJFR19XUih0aW1lciwgdGltZXJfcmVnc1tjcHVdLCByd190bXIwX2N0cmwsIHRtcjBfY3RybCk7IC8qIFN0YXJ0ICovCiAKLSAgICAgICAJLyogZW5hYmxlIHRoZSB0aW1lciBpcnEgKi8KLSAgICAgICAJdGltZXJfaW50cl9tYXNrID0gUkVHX1JEKHRpbWVyLCB0aW1lcl9yZWdzW2NwdV0sIHJ3X2ludHJfbWFzayk7Ci0gICAgICAgCXRpbWVyX2ludHJfbWFzay50bXIwID0gMTsKLSAgICAgICAJUkVHX1dSKHRpbWVyLCB0aW1lcl9yZWdzW2NwdV0sIHJ3X2ludHJfbWFzaywgdGltZXJfaW50cl9tYXNrKTsKKwkvKiBFbmFibGUgdGhlIHRpbWVyIGlycS4gKi8KKwl0aW1lcl9pbnRyX21hc2sgPSBSRUdfUkQodGltZXIsIHRpbWVyX3JlZ3NbY3B1XSwgcndfaW50cl9tYXNrKTsKKwl0aW1lcl9pbnRyX21hc2sudG1yMCA9IDE7CisJUkVHX1dSKHRpbWVyLCB0aW1lcl9yZWdzW2NwdV0sIHJ3X2ludHJfbWFzaywgdGltZXJfaW50cl9tYXNrKTsKIH0KIAogdm9pZCBfX2luaXQKQEAgLTI4NCw3ICszMDMsNyBAQAogewogCXJlZ19pbnRyX3ZlY3RfcndfbWFzayBpbnRyX21hc2s7CiAKLQkvKiBwcm9iZSBmb3IgdGhlIFJUQyBhbmQgcmVhZCBpdCBpZiBpdCBleGlzdHMKKwkvKiBQcm9iZSBmb3IgdGhlIFJUQyBhbmQgcmVhZCBpdCBpZiBpdCBleGlzdHMuCiAJICogQmVmb3JlIHRoZSBSVEMgY2FuIGJlIHByb2JlZCB0aGUgbG9vcHNfcGVyX3VzZWMgdmFyaWFibGUgbmVlZHMKIAkgKiB0byBiZSBpbml0aWFsaXplZCB0byBtYWtlIHVzbGVlcCB3b3JrLiBBIGJldHRlciB2YWx1ZSBmb3IKIAkgKiBsb29wc19wZXJfdXNlYyBpcyBjYWxjdWxhdGVkIGJ5IHRoZSBrZXJuZWwgbGF0ZXIgb25jZSB0aGUKQEAgLTI5Myw1MiArMzEyLDc0IEBACiAJbG9vcHNfcGVyX3VzZWMgPSA1MDsKIAogCWlmKFJUQ19JTklUKCkgPCAwKSB7Ci0JCS8qIG5vIFJUQywgc3RhcnQgYXQgMTk4MCAqLworCQkvKiBObyBSVEMsIHN0YXJ0IGF0IDE5ODAgKi8KIAkJeHRpbWUudHZfc2VjID0gMDsKIAkJeHRpbWUudHZfbnNlYyA9IDA7CiAJCWhhdmVfcnRjID0gMDsKIAl9IGVsc2UgewotCQkvKiBnZXQgdGhlIGN1cnJlbnQgdGltZSAqLworCQkvKiBHZXQgdGhlIGN1cnJlbnQgdGltZSAqLwogCQloYXZlX3J0YyA9IDE7CiAJCXVwZGF0ZV94dGltZV9mcm9tX2Ntb3MoKTsKIAl9CiAKIAkvKgotCSAqIEluaXRpYWxpemUgd2FsbF90b19tb25vdG9uaWMgc3VjaCB0aGF0IGFkZGluZyBpdCB0byB4dGltZSB3aWxsIHlpZWxkIHplcm8sIHRoZQotCSAqIHR2X25zZWMgZmllbGQgbXVzdCBiZSBub3JtYWxpemVkIChpLmUuLCAwIDw9IG5zZWMgPCBOU0VDX1BFUl9TRUMpLgorCSAqIEluaXRpYWxpemUgd2FsbF90b19tb25vdG9uaWMgc3VjaCB0aGF0IGFkZGluZyBpdCB0bworCSAqIHh0aW1lIHdpbGwgeWllbGQgemVybywgdGhlIHR2X25zZWMgZmllbGQgbXVzdCBiZSBub3JtYWxpemVkCisJICogKGkuZS4sIDAgPD0gbnNlYyA8IE5TRUNfUEVSX1NFQykuCiAJICovCiAJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLCAteHRpbWUudHZfc2VjLCAteHRpbWUudHZfbnNlYyk7CiAKLQkvKiBTdGFydCBDUFUgbG9jYWwgdGltZXIgKi8KKwkvKiBTdGFydCBDUFUgbG9jYWwgdGltZXIuICovCiAJY3Jpc190aW1lcl9pbml0KCk7CiAKLQkvKiBlbmFibGUgdGhlIHRpbWVyIGlycSBpbiBnbG9iYWwgY29uZmlnICovCi0JaW50cl9tYXNrID0gUkVHX1JEKGludHJfdmVjdCwgcmVnaV9pcnEsIHJ3X21hc2spOwotCWludHJfbWFzay50aW1lciA9IDE7Ci0JUkVHX1dSKGludHJfdmVjdCwgcmVnaV9pcnEsIHJ3X21hc2ssIGludHJfbWFzayk7CisJLyogRW5hYmxlIHRoZSB0aW1lciBpcnEgaW4gZ2xvYmFsIGNvbmZpZy4gKi8KKwlpbnRyX21hc2sgPSBSRUdfUkRfVkVDVChpbnRyX3ZlY3QsIHJlZ2lfaXJxLCByd19tYXNrLCAxKTsKKwlpbnRyX21hc2sudGltZXIwID0gMTsKKwlSRUdfV1JfVkVDVChpbnRyX3ZlY3QsIHJlZ2lfaXJxLCByd19tYXNrLCAxLCBpbnRyX21hc2spOwogCi0JLyogbm93IGFjdHVhbGx5IHJlZ2lzdGVyIHRoZSB0aW1lciBpcnEgaGFuZGxlciB0aGF0IGNhbGxzIHRpbWVyX2ludGVycnVwdCgpICovCisJLyogTm93IGFjdHVhbGx5IHJlZ2lzdGVyIHRoZSB0aW1lciBpcnEgaGFuZGxlciB0aGF0IGNhbGxzCisJICogdGltZXJfaW50ZXJydXB0KCkuICovCisJc2V0dXBfaXJxKFRJTUVSMF9JTlRSX1ZFQ1QsICZpcnFfdGltZXIpOwogCi0Jc2V0dXBfaXJxKFRJTUVSX0lOVFJfVkVDVCwgJmlycV90aW1lcik7Ci0KLQkvKiBlbmFibGUgd2F0Y2hkb2cgaWYgd2Ugc2hvdWxkIHVzZSBvbmUgKi8KKwkvKiBFbmFibGUgd2F0Y2hkb2cgaWYgd2Ugc2hvdWxkIHVzZSBvbmUuICovCiAKICNpZiBkZWZpbmVkKENPTkZJR19FVFJBWF9XQVRDSERPRykKLQlwcmludGsoIkVuYWJsaW5nIHdhdGNoZG9nLi4uXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJFbmFibGluZyB3YXRjaGRvZy4uLlxuIik7CiAJc3RhcnRfd2F0Y2hkb2coKTsKIAogCS8qIElmIHdlIHVzZSB0aGUgaGFyZHdhcmUgd2F0Y2hkb2csIHdlIHdhbnQgdG8gdHJhcCBpdCBhcyBhbiBOTUkKLQkgICBhbmQgZHVtcCByZWdpc3RlcnMgYmVmb3JlIGl0IHJlc2V0cyB1cy4gIEZvciB0aGlzIHRvIGhhcHBlbiwgd2UKLQkgICBtdXN0IHNldCB0aGUgIm0iIE5NSSBlbmFibGUgZmxhZyAod2hpY2ggb25jZSBzZXQsIGlzIHVuc2V0IG9ubHkKLQkgICB3aGVuIGFuIE5NSSBpcyB0YWtlbikuCisJICogYW5kIGR1bXAgcmVnaXN0ZXJzIGJlZm9yZSBpdCByZXNldHMgdXMuICBGb3IgdGhpcyB0byBoYXBwZW4sIHdlCisJICogbXVzdCBzZXQgdGhlICJtIiBOTUkgZW5hYmxlIGZsYWcgKHdoaWNoIG9uY2Ugc2V0LCBpcyB1bnNldCBvbmx5CisJICogd2hlbiBhbiBOTUkgaXMgdGFrZW4pLiAqLworCXsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7CisJCWZsYWdzIHw9ICgxPDwzMCk7IC8qIE5NSSBNIGZsYWcgaXMgYXQgYml0IDMwICovCisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwl9CisjZW5kaWYKIAotCSAgIFRoZSBzYW1lIGdvZXMgZm9yIHRoZSBleHRlcm5hbCBOTUksIGJ1dCB0aGF0IGRvZXNuJ3QgaGF2ZSBhbnkKLQkgICBkcml2ZXIgb3IgaW5mcmFzdHJ1Y3R1cmUgc3VwcG9ydCB5ZXQuICAqLwotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgICAgICAgICBsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsKLSAgICAgICAgICBmbGFncyB8PSAoMTw8MzApOyAvKiBOTUkgTSBmbGFnIGlzIGF0IGJpdCAzMCAqLwotICAgICAgICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLSAgICAgICAgfQorI2lmZGVmIENPTkZJR19DUFVfRlJFUQorCWNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoJmNyaXNfdGltZV9mcmVxX25vdGlmaWVyX2Jsb2NrLAorCQlDUFVGUkVRX1RSQU5TSVRJT05fTk9USUZJRVIpOwogI2VuZGlmCiB9CisKKyNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKK3N0YXRpYyBpbnQKK2NyaXNfdGltZV9mcmVxX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgdmFsLAorCQkJdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyAqZnJlcXMgPSBkYXRhOworCWlmICh2YWwgPT0gQ1BVRlJFUV9QT1NUQ0hBTkdFKSB7CisJCXJlZ190aW1lcl9yX3RtcjBfZGF0YSBkYXRhOworCQlyZWdfdGltZXJfcndfdG1yMF9kaXYgZGl2ID0gKGZyZXFzLT5uZXcgKiA1MDApIC8gSFo7CisJCWRvIHsKKwkJCWRhdGEgPSBSRUdfUkQodGltZXIsIHRpbWVyX3JlZ3NbZnJlcXMtPmNwdV0sCisJCQkJcl90bXIwX2RhdGEpOworCQl9IHdoaWxlIChkYXRhID4gMjApOworCQlSRUdfV1IodGltZXIsIHRpbWVyX3JlZ3NbZnJlcXMtPmNwdV0sIHJ3X3RtcjBfZGl2LCBkaXYpOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC90cmFwcy5jCmluZGV4IDE3ZmQzZGIuLjkwMDNlMzggMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3RyYXBzLmMKQEAgLTEsNTAgKzEsNDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMsIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNiwgQXhpcyBDb21tdW5pY2F0aW9ucyBBQi4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9zdXBwX3JlZy5oPgotCi1leHRlcm4gdm9pZCByZXNldF93YXRjaGRvZyh2b2lkKTsKLWV4dGVybiB2b2lkIHN0b3Bfd2F0Y2hkb2codm9pZCk7Ci0KLWV4dGVybiBpbnQgcmF3X3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLik7CisjaW5jbHVkZSA8aHdyZWdzL3N1cHBfcmVnLmg+CisjaW5jbHVkZSA8aHdyZWdzL2ludHJfdmVjdF9kZWZzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgogCiB2b2lkCiBzaG93X3JlZ2lzdGVycyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAkvKgogCSAqIEl0J3MgcG9zc2libGUgdG8gdXNlIGVpdGhlciB0aGUgVVNQIHJlZ2lzdGVyIG9yIGN1cnJlbnQtPnRocmVhZC51c3AuCi0JICogVVNQIG1pZ2h0IG5vdCBjb3JyZXNwb25kIHRvIHRoZSBjdXJyZW50IHByb2NjZXNzIGZvciBhbGwgY2FzZXMgdGhpcworCSAqIFVTUCBtaWdodCBub3QgY29ycmVzcG9uZCB0byB0aGUgY3VycmVudCBwcm9jZXNzIGZvciBhbGwgY2FzZXMgdGhpcwogCSAqIGZ1bmN0aW9uIGlzIGNhbGxlZCwgYW5kIGN1cnJlbnQtPnRocmVhZC51c3AgaXNuJ3QgdXAgdG8gZGF0ZSBmb3IgdGhlCi0JICogY3VycmVudCBwcm9jY2Vzcy4gRXhwZXJpZW5jZSBzaG93cyB0aGF0IHVzaW5nIFVTUCBpcyB0aGUgd2F5IHRvIGdvLgorCSAqIGN1cnJlbnQgcHJvY2Vzcy4gRXhwZXJpZW5jZSBzaG93cyB0aGF0IHVzaW5nIFVTUCBpcyB0aGUgd2F5IHRvIGdvLgogCSAqLwotCXVuc2lnbmVkIGxvbmcgdXNwOworCXVuc2lnbmVkIGxvbmcgdXNwID0gcmR1c3AoKTsKIAl1bnNpZ25lZCBsb25nIGRfbW11X2NhdXNlOwogCXVuc2lnbmVkIGxvbmcgaV9tbXVfY2F1c2U7CiAKLQl1c3AgPSByZHVzcCgpOworCXByaW50aygiQ1BVOiAlZFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAotCXJhd19wcmludGsoIkNQVTogJWRcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJcHJpbnRrKCJFUlA6ICUwOGx4IFNSUDogJTA4bHggIENDUzogJTA4bHggVVNQOiAlMDhseCBNT0Y6ICUwOGx4XG4iLAorCSAgICAgICByZWdzLT5lcnAsIHJlZ3MtPnNycCwgcmVncy0+Y2NzLCB1c3AsIHJlZ3MtPm1vZik7CiAKLQlyYXdfcHJpbnRrKCJFUlA6ICUwOGx4IFNSUDogJTA4bHggIENDUzogJTA4bHggVVNQOiAlMDhseCBNT0Y6ICUwOGx4XG4iLAotCQlyZWdzLT5lcnAsIHJlZ3MtPnNycCwgcmVncy0+Y2NzLCB1c3AsIHJlZ3MtPm1vZik7CisJcHJpbnRrKCIgcjA6ICUwOGx4ICByMTogJTA4bHggICByMjogJTA4bHggIHIzOiAlMDhseFxuIiwKKwkgICAgICAgcmVncy0+cjAsIHJlZ3MtPnIxLCByZWdzLT5yMiwgcmVncy0+cjMpOwogCi0JcmF3X3ByaW50aygiIHIwOiAlMDhseCAgcjE6ICUwOGx4ICAgcjI6ICUwOGx4ICByMzogJTA4bHhcbiIsCi0JCXJlZ3MtPnIwLCByZWdzLT5yMSwgcmVncy0+cjIsIHJlZ3MtPnIzKTsKKwlwcmludGsoIiByNDogJTA4bHggIHI1OiAlMDhseCAgIHI2OiAlMDhseCAgcjc6ICUwOGx4XG4iLAorCSAgICAgICByZWdzLT5yNCwgcmVncy0+cjUsIHJlZ3MtPnI2LCByZWdzLT5yNyk7CiAKLQlyYXdfcHJpbnRrKCIgcjQ6ICUwOGx4ICByNTogJTA4bHggICByNjogJTA4bHggIHI3OiAlMDhseFxuIiwKLQkJcmVncy0+cjQsIHJlZ3MtPnI1LCByZWdzLT5yNiwgcmVncy0+cjcpOworCXByaW50aygiIHI4OiAlMDhseCAgcjk6ICUwOGx4ICByMTA6ICUwOGx4IHIxMTogJTA4bHhcbiIsCisJICAgICAgIHJlZ3MtPnI4LCByZWdzLT5yOSwgcmVncy0+cjEwLCByZWdzLT5yMTEpOwogCi0JcmF3X3ByaW50aygiIHI4OiAlMDhseCAgcjk6ICUwOGx4ICByMTA6ICUwOGx4IHIxMTogJTA4bHhcbiIsCi0JCXJlZ3MtPnI4LCByZWdzLT5yOSwgcmVncy0+cjEwLCByZWdzLT5yMTEpOworCXByaW50aygicjEyOiAlMDhseCByMTM6ICUwOGx4IG9SMTA6ICUwOGx4IGFjcjogJTA4bHhcbiIsCisJICAgICAgIHJlZ3MtPnIxMiwgcmVncy0+cjEzLCByZWdzLT5vcmlnX3IxMCwgcmVncy0+YWNyKTsKIAotCXJhd19wcmludGsoInIxMjogJTA4bHggcjEzOiAlMDhseCBvUjEwOiAlMDhseCBhY3I6ICUwOGx4XG4iLAotCQlyZWdzLT5yMTIsIHJlZ3MtPnIxMywgcmVncy0+b3JpZ19yMTAsIHJlZ3MtPmFjcik7Ci0KLQlyYXdfcHJpbnRrKCJzcDogJTA4bHhcbiIsIHJlZ3MpOworCXByaW50aygiIHNwOiAlMDhseFxuIiwgKHVuc2lnbmVkIGxvbmcpcmVncyk7CiAKIAlTVVBQX0JBTktfU0VMKEJBTktfSU0pOwogCVNVUFBfUkVHX1JEKFJXX01NX0NBVVNFLCBpX21tdV9jYXVzZSk7CkBAIC01MiwxOCArNDcsMjAgQEAKIAlTVVBQX0JBTktfU0VMKEJBTktfRE0pOwogCVNVUFBfUkVHX1JEKFJXX01NX0NBVVNFLCBkX21tdV9jYXVzZSk7CiAKLQlyYXdfcHJpbnRrKCIgICAgICAgRGF0YSBNTVUgQ2F1c2U6ICUwOGx4XG4iLCBkX21tdV9jYXVzZSk7Ci0JcmF3X3ByaW50aygiSW5zdHJ1Y3Rpb24gTU1VIENhdXNlOiAlMDhseFxuIiwgaV9tbXVfY2F1c2UpOworCXByaW50aygiICAgICAgIERhdGEgTU1VIENhdXNlOiAlMDhseFxuIiwgZF9tbXVfY2F1c2UpOworCXByaW50aygiSW5zdHJ1Y3Rpb24gTU1VIENhdXNlOiAlMDhseFxuIiwgaV9tbXVfY2F1c2UpOwogCi0JcmF3X3ByaW50aygiUHJvY2VzcyAlcyAocGlkOiAlZCwgc3RhY2twYWdlOiAlMDhseClcbiIsCi0JCWN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgKHVuc2lnbmVkIGxvbmcpIGN1cnJlbnQpOworCXByaW50aygiUHJvY2VzcyAlcyAocGlkOiAlZCwgc3RhY2twYWdlPSUwOGx4KVxuIiwKKwkgICAgICAgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCAodW5zaWduZWQgbG9uZyljdXJyZW50KTsKIAotCS8qIFNob3cgYWRkaXRpb25hbCBpbmZvIGlmIGluIGtlcm5lbC1tb2RlLiAqLworCS8qCisJICogV2hlbiBpbi1rZXJuZWwsIHdlIGFsc28gcHJpbnQgb3V0IHRoZSBzdGFjayBhbmQgY29kZSBhdCB0aGUKKwkgKiB0aW1lIG9mIHRoZSBmYXVsdC4uCisJICovCiAJaWYgKCF1c2VyX21vZGUocmVncykpIHsKIAkJaW50IGk7Ci0JCXVuc2lnbmVkIGNoYXIgYzsKIAotCQlzaG93X3N0YWNrKE5VTEwsICh1bnNpZ25lZCBsb25nICopIHVzcCk7CisJCXNob3dfc3RhY2soTlVMTCwgKHVuc2lnbmVkIGxvbmcgKil1c3ApOwogCiAJCS8qCiAJCSAqIElmIHRoZSBwcmV2aW91cyBzdGFjay1kdW1wIHdhc24ndCBhIGtlcm5lbCBvbmUsIGR1bXAgdGhlCkBAIC03Miw3ICs2OSw3IEBACiAJCWlmICh1c3AgIT0gMCkKIAkJCXNob3dfc3RhY2soTlVMTCwgTlVMTCk7CiAKLQkJcmF3X3ByaW50aygiXG5Db2RlOiAiKTsKKwkJcHJpbnRrKCJcbkNvZGU6ICIpOwogCiAJCWlmIChyZWdzLT5lcnAgPCBQQUdFX09GRlNFVCkKIAkJCWdvdG8gYmFkX3ZhbHVlOwpAQCAtODQsNzYgKzgxLDExNSBAQAogCQkgKiBpbnN0cnVjdGlvbiBkZWNvZGluZyBzaG91bGQgYmUgaW4gc3luYyBhdCB0aGUgaW50ZXJlc3RpbmcKIAkJICogcG9pbnQsIGJ1dCBzbWFsbCBlbm91Z2ggdG8gZml0IG9uIGEgcm93LiBUaGUgcmVncy0+ZXJwCiAJCSAqIGxvY2F0aW9uIGlzIHBvaW50ZWQgb3V0IGluIGEga3N5bW9vcHMtZnJpZW5kbHkgd2F5IGJ5Ci0JCSAqIHdyYXBwaW5nIHRoZSBieXRlIGZvciB0aGF0IGFkZHJlc3MgaW4gcGFyZW50aGVzaXMuCisJCSAqIHdyYXBwaW5nIHRoZSBieXRlIGZvciB0aGF0IGFkZHJlc3MgaW4gcGFyZW50aGVzaXNlcy4KIAkJICovCiAJCWZvciAoaSA9IC0xMjsgaSA8IDEyOyBpKyspIHsKLQkJCWlmIChfX2dldF91c2VyKGMsICYoKHVuc2lnbmVkIGNoYXIgKikgcmVncy0+ZXJwKVtpXSkpIHsKKwkJCXVuc2lnbmVkIGNoYXIgYzsKKworCQkJaWYgKF9fZ2V0X3VzZXIoYywgJigodW5zaWduZWQgY2hhciAqKXJlZ3MtPmVycClbaV0pKSB7CiBiYWRfdmFsdWU6Ci0JCQkJcmF3X3ByaW50aygiIEJhZCBJUCB2YWx1ZS4iKTsKKwkJCQlwcmludGsoIiBCYWQgSVAgdmFsdWUuIik7CiAJCQkJYnJlYWs7CiAJCQl9CiAKIAkJCWlmIChpID09IDApCi0JCQkJcmF3X3ByaW50aygiKCUwMngpICIsIGMpOworCQkJCXByaW50aygiKCUwMngpICIsIGMpOwogCQkJZWxzZQotCQkJCXJhd19wcmludGsoIiUwMnggIiwgYyk7CisJCQkJcHJpbnRrKCIlMDJ4ICIsIGMpOwogCQl9Ci0KLQkJcmF3X3ByaW50aygiXG4iKTsKKwkJcHJpbnRrKCJcbiIpOwogCX0KIH0KIAotLyoKLSAqIFRoaXMgZ2V0cyBjYWxsZWQgZnJvbSBlbnRyeS5TIHdoZW4gdGhlIHdhdGNoZG9nIGhhcyBiaXR0ZW4uIFNob3cgc29tZXRoaW5nCi0gKiBzaW1pbGFyIHRvIGFuIE9vcHMgZHVtcCwgYW5kIGlmIHRoZSBrZXJuZWwgaXMgY29uZmlndXJlZCB0byBiZSBhIG5pY2UgZG9nZ3k7Ci0gKiBoYWx0IGluc3RlYWQgb2YgcmVib290LgotICovCiB2b2lkCi13YXRjaGRvZ19iaXRlX2hvb2soc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0jaWZkZWYgQ09ORklHX0VUUkFYX1dBVENIRE9HX05JQ0VfRE9HR1kKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCXN0b3Bfd2F0Y2hkb2coKTsKLQlzaG93X3JlZ2lzdGVycyhyZWdzKTsKLQotCXdoaWxlICgxKQotCQk7IC8qIERvIG5vdGhpbmcuICovCi0jZWxzZQotCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOwotI2VuZGlmCi19Ci0KLS8qIFRoaXMgaXMgbm9ybWFsbHkgdGhlIE9vcHMgZnVuY3Rpb24uICovCi12b2lkCi1kaWVfaWZfa2VybmVsKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyKQotewotCWlmICh1c2VyX21vZGUocmVncykpCi0JCXJldHVybjsKLQotI2lmZGVmIENPTkZJR19FVFJBWF9XQVRDSERPR19OSUNFX0RPR0dZCi0JLyoKLQkgKiBUaGlzIHByaW50b3V0IG1pZ2h0IHRha2UgdG9vIGxvbmcgYW5kIGNvdWxkIHRyaWdnZXIKLQkgKiB0aGUgd2F0Y2hkb2cgbm9ybWFsbHkuIElmIE5JQ0VfRE9HR1kgaXMgc2V0LCBzaW1wbHkKLQkgKiBzdG9wIHRoZSB3YXRjaGRvZyBkdXJpbmcgdGhlIHByaW50b3V0LgotCSAqLwotCXN0b3Bfd2F0Y2hkb2coKTsKLSNlbmRpZgotCi0JcmF3X3ByaW50aygiJXM6ICUwNGx4XG4iLCBzdHIsIGVyciAmIDB4ZmZmZik7Ci0KLQlzaG93X3JlZ2lzdGVycyhyZWdzKTsKLQotI2lmZGVmIENPTkZJR19FVFJBWF9XQVRDSERPR19OSUNFX0RPR0dZCi0JcmVzZXRfd2F0Y2hkb2coKTsKLSNlbmRpZgotCi0JZG9fZXhpdChTSUdTRUdWKTsKLX0KLQotdm9pZCBhcmNoX2VuYWJsZV9ubWkodm9pZCkKK2FyY2hfZW5hYmxlX25taSh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKIAlsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsKLQlmbGFncyB8PSAoMTw8MzApOyAvKiBOTUkgTSBmbGFnIGlzIGF0IGJpdCAzMCAqLworCWZsYWdzIHw9ICgxIDw8IDMwKTsgLyogTk1JIE0gZmxhZyBpcyBhdCBiaXQgMzAgKi8KIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CisKK2V4dGVybiB2b2lkICgqbm1pX2hhbmRsZXIpKHN0cnVjdCBwdF9yZWdzICopOwordm9pZCBoYW5kbGVfbm1pKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworI2lmZGVmIENPTkZJR19FVFJBWEZTCisJcmVnX2ludHJfdmVjdF9yX25taSByOworI2VuZGlmCisKKwlpZiAobm1pX2hhbmRsZXIpCisJCW5taV9oYW5kbGVyKHJlZ3MpOworCisjaWZkZWYgQ09ORklHX0VUUkFYRlMKKwkvKiBXYWl0IHVudGlsIG5taSBpcyBubyBsb25nZXIgYWN0aXZlLiAqLworCWRvIHsKKwkJciA9IFJFR19SRChpbnRyX3ZlY3QsIHJlZ2lfaXJxLCByX25taSk7CisJfSB3aGlsZSAoci5leHQgPT0gcmVna19pbnRyX3ZlY3Rfb24pOworI2VuZGlmCit9CisKKworI2lmZGVmIENPTkZJR19CVUcKK2V4dGVybiB2b2lkIGRpZV9pZl9rZXJuZWwoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnIpOworCisvKiBDb3B5IG9mIHRoZSByZWdzIGF0IEJVRygpIHRpbWUuICAqLworc3RydWN0IHB0X3JlZ3MgQlVHX3JlZ3M7CisKK3ZvaWQgZG9fQlVHKGNoYXIgKmZpbGUsIHVuc2lnbmVkIGludCBsaW5lKQoreworCXByaW50aygia2VybmVsIEJVRyBhdCAlczolZCFcbiIsIGZpbGUsIGxpbmUpOworCWRpZV9pZl9rZXJuZWwoIk9vcHMiLCAmQlVHX3JlZ3MsIDApOworfQorRVhQT1JUX1NZTUJPTChkb19CVUcpOworCit2b2lkIGZpeHVwX0JVRyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlCVUdfcmVncyA9ICpyZWdzOworCisjaWZkZWYgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UKKwkvKgorCSAqIEZpeHVwIHRoZSBCVUcgYXJndW1lbnRzIHRocm91Z2ggZXhjZXB0aW9uIGhhbmRsZXJzLgorCSAqLworCXsKKwkJY29uc3Qgc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSAqZml4dXA7CisKKwkJLyoKKwkJICogRVJQIHBvaW50cyBhdCB0aGUgImJyZWFrIDE0IiArIDIsIGNvbXBlbnNhdGUgZm9yIHRoZSAyCisJCSAqIGJ5dGVzLgorCQkgKi8KKwkJZml4dXAgPSBzZWFyY2hfZXhjZXB0aW9uX3RhYmxlcyhpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpIC0gMik7CisJCWlmIChmaXh1cCkgeworCQkJLyogQWRqdXN0IHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyIGluIHRoZSBzdGFja2ZyYW1lLiAqLworCQkJaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSA9IGZpeHVwLT5maXh1cDsKKwkJCWFyY2hfZml4dXAocmVncyk7CisJCX0KKwl9CisjZWxzZQorCS8qIERvbnQgdHJ5IHRvIGxvb2t1cCB0aGUgZmlsZW5hbWUgKyBsaW5lLCBqdXN0IGR1bXAgcmVncy4gICovCisJZG9fQlVHKCJ1bmtub3duIiwgMCk7CisjZW5kaWYKK30KKworLyoKKyAqIEJyZWFrIDE0IGhhbmRsZXIuIFNhdmUgcmVncyBhbmQganVtcCBpbnRvIHRoZSBmaXh1cF9CVUcuCisgKi8KK19fYXNtX18gICggIi50ZXh0XG5cdCIKKwkgICAiLmdsb2JhbCBicmVha2hfQlVHXG5cdCIKKwkgICAiYnJlYWtoX0JVRzpcblx0IgorCSAgIFNBVkVfQUxMCisJICAgS0dEQl9GSVhVUAorCSAgICJtb3ZlLmQgJHNwLCAkcjEwXG5cdCIKKwkgICAianNyIGZpeHVwX0JVR1xuXHQiCisJICAgIm5vcFxuXHQiCisJICAgImp1bXAgcmV0X2Zyb21faW50clxuXHQiCisJICAgIm5vcFxuXHQiKTsKKworCisjaWZkZWYgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UKK3ZvaWQKK2hhbmRsZV9CVUcoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7Cit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC92Y3NfaG9vay5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC92Y3NfaG9vay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGQ3MWM1Li4wMDAwMDAwCi0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvdmNzX2hvb2suYworKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8vICRJZDogdmNzX2hvb2suYyx2IDEuMiAyMDAzLzA4LzEyIDEyOjAxOjA2IHN0YXJ2aWsgRXhwICQKLS8vCi0vLyBDYWxsIHNpbXVsYXRvciBob29rLiBUaGlzIGlzIHRoZSBwYXJ0IHJ1bm5pbmcgaW4gdGhlCi0vLyBzaW11bGF0ZWQgcHJvZ3JhbS4KLS8vCi0KLSNpbmNsdWRlICJ2Y3NfaG9vay5oIgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPGFzbS9hcmNoLXYzMi9od3JlZ3MvcmVnX21hcC5oPgotI2luY2x1ZGUgPGFzbS9hcmNoLXYzMi9od3JlZ3MvaW50cl92ZWN0X2RlZnMuaD4KLQotI2RlZmluZSBIT09LX1RSSUdfQUREUiAgICAgMHhiNzAwMDAwMCAgIC8qIGhvb2sgY3Zsb2cgbW9kZWwgcmVnIGFkZHJlc3MgKi8KLSNkZWZpbmUgSE9PS19NRU1fQkFTRV9BRERSIDB4YTAwMDAwMDAgICAvKiBjc3A0IChzaGFyZWQgbWVtKSBiYXNlIGFkZHIgKi8KLQotI2RlZmluZSBIT09LX0RBVEEob2Zmc2V0KSAoKHVuc2lnbmVkKikgSE9PS19NRU1fQkFTRV9BRERSKVtvZmZzZXRdCi0jZGVmaW5lIFZIT09LX0RBVEEob2Zmc2V0KSAoKHZvbGF0aWxlIHVuc2lnbmVkKikgSE9PS19NRU1fQkFTRV9BRERSKVtvZmZzZXRdCi0jZGVmaW5lIEhPT0tfVFJJRyhmdW5jaWQpIGRvIHsgKigodW5zaWduZWQgKikgSE9PS19UUklHX0FERFIpID0gZnVuY2lkOyB9IHdoaWxlKDApCi0jZGVmaW5lIEhPT0tfREFUQV9CWVRFKG9mZnNldCkgKCh1bnNpZ25lZCBjaGFyKikgSE9PS19NRU1fQkFTRV9BRERSKVtvZmZzZXRdCi0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGhvb2tfY2FsbAotaW50IGhvb2tfY2FsbCggdW5zaWduZWQgaWQsIHVuc2lnbmVkIHBjbnQsIC4uLikgewotICB2YV9saXN0IGFwOwotICB1bnNpZ25lZCBpOwotICB1bnNpZ25lZCByZXQ7Ci0jaWZkZWYgVVNJTkdfU09TCi0gIFBSRUVNUFRfT0ZGX1NBVkUoKTsKLSNlbmRpZgotCi0gIC8vIHBhc3MgcGFyYW1ldGVycwotICBIT09LX0RBVEEoMCkgPSBpZDsKLQotICAvKiBIYXZlIHRvIG1ha2UgaG9va19wcmludF9zdHIgYSBzcGVjaWFsIGNhc2Ugc2luY2Ugd2UgY2FsbCB3aXRoIGEKLSAgICAgcGFyYW1ldGVyIG9mIGJ5dGUgdHlwZS4gU2hvdWxkIHBlcmhhcHMgYmUgYSBzZXBhcmF0ZQotICAgICBob29rX2NhbGwuICovCi0KLSAgaWYgKGlkID09IGhvb2tfcHJpbnRfc3RyKSB7Ci0gICAgaW50IGk7Ci0gICAgY2hhciAqc3RyOwotCi0gICAgSE9PS19EQVRBKDEpID0gcGNudDsKLQotICAgIHZhX3N0YXJ0KGFwLCBwY250KTsKLSAgICBzdHIgPSAoY2hhciopdmFfYXJnKGFwLHVuc2lnbmVkKTsKLQotICAgIGZvciAoaT0wOyBpIT1wY250OyBpKyspIHsKLSAgICAgIEhPT0tfREFUQV9CWVRFKDgraSkgPSBzdHJbaV07Ci0gICAgfQotICAgIEhPT0tfREFUQV9CWVRFKDgraSkgPSAwOwkvKiBudWxsIGJ5dGUgKi8KLSAgfQotICBlbHNlIHsKLSAgICB2YV9zdGFydChhcCwgcGNudCk7Ci0gICAgZm9yKCBpID0gMTsgaSA8PSBwY250OyBpKysgKSBIT09LX0RBVEEoaSkgPSB2YV9hcmcoYXAsdW5zaWduZWQpOwotICAgIHZhX2VuZChhcCk7Ci0gIH0KLQotICAvLyByZWFkIGZyb20gbWVtIHRvIG1ha2Ugc3VyZSBkYXRhIGhhcyBwcm9wYWdhdGVkIHRvIG1lbW9yeSBiZWZvcmUgdHJpZ2dpbmcKLSAgKigodm9sYXRpbGUgdW5zaWduZWQqKSBIT09LX01FTV9CQVNFX0FERFIpOwotCi0gIC8vIHRyaWdnZXIgaG9vawotICBIT09LX1RSSUcoaWQpOwotCi0gIC8vIHdhaXQgZm9yIGNhbGwgdG8gZmluaXNoCi0gIHdoaWxlKCBWSE9PS19EQVRBKDApID4gMCApIHt9Ci0KLSAgLy8gZXh0cmFjdCByZXR1cm4gdmFsdWUKLQotICByZXQgPSBWSE9PS19EQVRBKDEpOwotCi0jaWZkZWYgVVNJTkdfU09TCi0gIFBSRUVNUFRfUkVTVE9SRSgpOwotI2VuZGlmCi0gIHJldHVybiByZXQ7Ci19Ci0KLXVuc2lnbmVkCi1ob29rX2J1Zih1bnNpZ25lZCBpKQotewotICByZXR1cm4gKEhPT0tfREFUQShpKSk7Ci19Ci0KLXZvaWQgcHJpbnRfc3RyKCBjb25zdCBjaGFyICpzdHIgKSB7Ci0gIGludCBpOwotICBmb3IgKGk9MTsgc3RyW2ldOyBpKyspOyAgICAgICAgIC8qIGZpbmQgbnVsbCBhdCBlbmQgb2Ygc3RyaW5nICovCi0gIGhvb2tfY2FsbChob29rX3ByaW50X3N0ciwgaSwgc3RyKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQVV9LSUNLX0RPRwotdm9pZCBDUFVfS0lDS19ET0codm9pZCkgewotICAodm9pZCkgaG9va19jYWxsKCBob29rX2tpY2tfZG9nLCAwICk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BVX1dBVENIRE9HX1RJTUVPVVQKLXZvaWQgQ1BVX1dBVENIRE9HX1RJTUVPVVQoIHVuc2lnbmVkIHQgKSB7Ci0gICh2b2lkKSBob29rX2NhbGwoIGhvb2tfZG9nX3RpbWVvdXQsIDEsIHQgKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvdmNzX2hvb2suaCBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvdmNzX2hvb2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q3MzcwOS4uMDAwMDAwMAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3Zjc19ob29rLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLyAkSWQ6IHZjc19ob29rLmgsdiAxLjEgMjAwMy8wOC8xMiAxMjowMTowNiBzdGFydmlrIEV4cCAkCi0vLwotLy8gQ2FsbCBzaW11bGF0b3IgaG9vayBmdW5jdGlvbnMKLQotI2lmbmRlZiBIT09LX0gKLSNkZWZpbmUgSE9PS19ICi0KLWludCBob29rX2NhbGwoIHVuc2lnbmVkIGlkLCB1bnNpZ25lZCBwY250LCAuLi4pOwotCi1lbnVtIGhvb2tfaWRzIHsKLSAgaG9va19kZWJ1Z19vbiA9IDEsCi0gIGhvb2tfZGVidWdfb2ZmLAotICBob29rX3N0b3Bfc2ltX29rLAotICBob29rX3N0b3Bfc2ltX2ZhaWwsCi0gIGhvb2tfYWxsb2Nfc2hhcmVkLAotICBob29rX3B0cl9zaGFyZWQsCi0gIGhvb2tfZnJlZV9zaGFyZWQsCi0gIGhvb2tfZmlsZTJzaGFyZWQsCi0gIGhvb2tfY21wX3NoYXJlZCwKLSAgaG9va19wcmludF9wYXJhbXMsCi0gIGhvb2tfc2ltX3RpbWUsCi0gIGhvb2tfc3RvcF9zaW0sCi0gIGhvb2tfa2lja19kb2csCi0gIGhvb2tfZG9nX3RpbWVvdXQsCi0gIGhvb2tfcmFuZCwKLSAgaG9va19zcmFuZCwKLSAgaG9va19yYW5kX3JhbmdlLAotICBob29rX3ByaW50X3N0ciwKLSAgaG9va19wcmludF9oZXgsCi0gIGhvb2tfY21wX29mZnNldF9zaGFyZWQsCi0gIGhvb2tfZmlsbF9yYW5kb21fc2hhcmVkLAotICBob29rX2FsbG9jX3JhbmRvbV9kYXRhLAotICBob29rX2NhbGxvY19yYW5kb21fZGF0YSwKLSAgaG9va19wcmludF9pbnQsCi0gIGhvb2tfcHJpbnRfdWludCwKLSAgaG9va19mcHV0YywKLSAgaG9va19pbml0X2ZkLAotICBob29rX3NicmsKLQotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvbGliL01ha2VmaWxlIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2xpYi9NYWtlZmlsZQppbmRleCAwNWIzZWM2Li5lYjRhYWQxIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9saWIvTWFrZWZpbGUKQEAgLTIsNSArMiw2IEBACiAjIE1ha2VmaWxlIGZvciBFdHJheC1zcGVjaWZpYyBsaWJyYXJ5IGZpbGVzLi4KICMKIAotbGliLXkgID0gY2hlY2tzdW0ubyBjaGVja3N1bWNvcHkubyBzdHJpbmcubyB1c2VyY29weS5vIG1lbXNldC5vIGNzdW1jcGZydXNlci5vIHNwaW5sb2NrLm8KK2xpYi15ICA9IGNoZWNrc3VtLm8gY2hlY2tzdW1jb3B5Lm8gc3RyaW5nLm8gdXNlcmNvcHkubyBtZW1zZXQubyBcCisJY3N1bWNwZnJ1c2VyLm8gc3BpbmxvY2subyBkZWxheS5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9saWIvY2hlY2tzdW0uUyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9saWIvY2hlY2tzdW0uUwppbmRleCAzMmU2NjE4Li44N2YzZmQ3IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvbGliL2NoZWNrc3VtLlMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2xpYi9jaGVja3N1bS5TCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIEEgZmFzdCBjaGVja3N1bSByb3V0aW5lIHVzaW5nIG1vdmVtCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSwgMjAwMyBBeGlzIENvbW11bmljYXRpb25zIEFCCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNyBBeGlzIENvbW11bmljYXRpb25zIEFCCiAgKgogICogY3N1bV9wYXJ0aWFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBidWZmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3VtKQogICovCkBAIC0xMiwzMCArMTIsMjMgQEAKIAk7OyByMTEgLSBsZW5ndGgKIAk7OyByMTIgLSBjaGVja3N1bQogCi0JOzsgY2hlY2sgZm9yIGJyZWFrZXZlbiBsZW5ndGggYmV0d2VlbiBtb3ZlbSBhbmQgbm9ybWFsIHdvcmQgbG9vcGluZyB2ZXJzaW9ucwotCTs7IHdlIGFsc28gZG8gX05PVF8gd2FudCB0byBjb21wdXRlIGEgY2hlY2tzdW0gb3ZlciBtb3JlIHRoYW4gdGhlCi0JOzsgYWN0dWFsIGxlbmd0aCB3aGVuIGxlbmd0aCA8IDQwCi0KLQljbXB1LncJODAsJHIxMQotCWJsbwlfd29yZF9sb29wCi0Jbm9wCi0KLQk7OyBuZWVkIHRvIHNhdmUgdGhlIHJlZ2lzdGVycyB3ZSB1c2UgYmVsb3cgaW4gdGhlIG1vdmVtIGxvb3AKLQk7OyB0aGlzIG92ZXJoZWFkIGlzIHdoeSB3ZSBoYXZlIGEgY2hlY2sgYWJvdmUgZm9yIGJyZWFrZXZlbiBsZW5ndGgKLQk7OyBvbmx5IHIwIC0gcjggaGF2ZSB0byBiZSBzYXZlZCwgdGhlIG90aGVyIG9uZXMgYXJlIGNsb2JiZXItYWJsZQotCTs7IGFjY29yZGluZyB0byB0aGUgQUJJCisJOzsgT3B0aW1pemVkIGZvciBsYXJnZSBwYWNrZXRzCisJc3VicQkxMCo0LCAkcjExCisJYmx0CV93b3JkX2xvb3AKKwltb3ZlLmQJJHIxMSwgJGFjcgogCiAJc3VicQk5KjQsJHNwCi0Jc3VicQkxMCo0LCRyMTEJOyB1cGRhdGUgbGVuZ3RoIGZvciB0aGUgZmlyc3QgbG9vcAorCWNsZWFyZgljCiAJbW92ZW0JJHI4LFskc3BdCiAKIAk7OyBkbyBhIG1vdmVtIGNoZWNrc3VtCiAKIF9tbG9vcDoJbW92ZW0JWyRyMTArXSwkcjkJOyByZWFkIDEwIGxvbmd3b3JkcwotCisJOzsgTG9vcCBjb3VudCB3aXRob3V0IHRvdWNoaW5nIHRoZSBjIGZsYWcuCisJYWRkb3EJLTEwKjQsICRhY3IsICRhY3IKIAk7OyBwZXJmb3JtIGR3b3JkIGNoZWNrc3VtbWluZyBvbiB0aGUgMTAgbG9uZ3dvcmRzCiAKLQlhZGQuZAkkcjAsJHIxMgorCWFkZGMJJHIwLCRyMTIKIAlhZGRjCSRyMSwkcjEyCiAJYWRkYwkkcjIsJHIxMgogCWFkZGMJJHIzLCRyMTIKQEAgLTQ2LDYwICszOSw0MSBAQAogCWFkZGMJJHI4LCRyMTIKIAlhZGRjCSRyOSwkcjEyCiAKLQk7OyBmb2xkIHRoZSBjYXJyeSBpbnRvIHRoZSBjaGVja3N1bSwgdG8gYXZvaWQgaGF2aW5nIHRvIGxvb3AgdGhlIGNhcnJ5Ci0JOzsgYmFjayBpbnRvIHRoZSB0b3AKKwk7OyB0ZXN0ICRhY3Igd2l0aG91dCB0cmFzaGluZyBjYXJyeS4KKwltb3ZlLmQJJGFjciwgJGFjcgorCWJwbAlfbWxvb3AKKwk7OyByMTEgPD0gYWNyICBpcyBub3QgcmVhbGx5IG5lZWRlZCBpbiB0aGUgbWxvb3AsIGp1c3QgdXNpbmcgdGhlIGRzbG90CisJOzsgdG8gcHJlcGFyZSBmb3Igd2hhdCBpcyBuZWVkZWQgYWZ0ZXIgbWxvb3AuCisJbW92ZS5kCSRhY3IsICRyMTEKIAotCWFkZGMJMCwkcjEyCi0JYWRkYwkwLCRyMTIJCTsgZG8gaXQgYWdhaW4sIHNpbmNlIHdlIG1pZ2h0IGhhdmUgZ2VuZXJhdGVkIGEgY2FycnkKLQotCXN1YnEJMTAqNCwkcjExCi0JYmdlCV9tbG9vcAotCW5vcAotCi0JYWRkcQkxMCo0LCRyMTEJOyBjb21wZW5zYXRlIGZvciBsYXN0IGxvb3AgdW5kZXJmbG93aW5nIGxlbmd0aAotCisJOzsgZm9sZCB0aGUgbGFzdCBjYXJyeSBpbnRvIHIxMworCWFkZGMJMCwgJHIxMgogCW1vdmVtCVskc3ArXSwkcjgJOyByZXN0b3JlIHJlZ3MKIAogX3dvcmRfbG9vcDoKLQk7OyBvbmx5IGZvbGQgaWYgdGhlcmUgaXMgYW55dGhpbmcgdG8gZm9sZC4KLQotCWNtcHEJMCwkcjEyCi0JYmVxCV9ub19mb2xkCi0KLQk7OyBmb2xkIDMyLWJpdCBjaGVja3N1bSBpbnRvIGEgMTYtYml0IGNoZWNrc3VtLCB0byBhdm9pZCBjYXJyaWVzIGJlbG93LgotCTs7IHI5IGFuZCByMTMgY2FuIGJlIHVzZWQgYXMgdGVtcG9yYXJpZXMuCisJYWRkcQkxMCo0LCRyMTEJOyBjb21wZW5zYXRlIGZvciBsYXN0IGxvb3AgdW5kZXJmbG93aW5nIGxlbmd0aAogCiAJbW92ZXEJLTEsJHI5CQk7IHB1dCAweGZmZmYgaW4gcjksIGZhc3RlciB0aGFuIG1vdmUuZCAweGZmZmYscjkKIAlsc3JxCTE2LCRyOQogCiAJbW92ZS5kCSRyMTIsJHIxMwogCWxzcnEJMTYsJHIxMwkJOyByMTMgPSBjaGVja3N1bSA+PiAxNgotCWFuZC5kCSRyOSwkcjEyCQk7IGNoZWNrc3VtID0gY2hlY2tzdW0gJiAweGZmZmYKLQlhZGQuZAkkcjEzLCRyMTIJCTsgY2hlY2tzdW0gKz0gcjEzCi0JbW92ZS5kCSRyMTIsJHIxMwkJOyBkbyB0aGUgc2FtZSBhZ2FpbiwgbWF5YmUgd2UgZ290IGEgY2FycnkgbGFzdCBhZGQKLQlsc3JxCTE2LCRyMTMKLQlhbmQuZAkkcjksJHIxMgotCWFkZC5kCSRyMTMsJHIxMgorCWFuZC5kCSRyOSwkcjEyCTsgY2hlY2tzdW0gPSBjaGVja3N1bSAmIDB4ZmZmZgogCiBfbm9fZm9sZDoKLQljbXBxCTIsJHIxMQorCXN1YnEJMiwkcjExCiAJYmx0CV9ub193b3JkcwotCW5vcAorCWFkZC5kCSRyMTMsJHIxMgk7IGNoZWNrc3VtICs9IHIxMwogCiAJOzsgY2hlY2tzdW0gdGhlIHJlc3Qgb2YgdGhlIHdvcmRzCi0KLQlzdWJxCTIsJHIxMQotCiBfd2xvb3A6CXN1YnEJMiwkcjExCiAJYmdlCV93bG9vcAogCWFkZHUudwlbJHIxMCtdLCRyMTIKIAotCWFkZHEJMiwkcjExCi0KIF9ub193b3JkczoKKwlhZGRxCTIsJHIxMQogCTs7IHNlZSBpZiB3ZSBoYXZlIG9uZSBvZGQgYnl0ZSBtb3JlCi0JY21wcQkxLCRyMTEKLQliZXEJX2RvX2J5dGUKKwlibmUJX2RvX2J5dGUKIAlub3AKIAlyZXQKIAltb3ZlLmQJJHIxMiwkcjEwCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvbGliL2NoZWNrc3VtY29weS5TIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2xpYi9jaGVja3N1bWNvcHkuUwppbmRleCA5MzAzY2NiLi4yMWFhYmU5IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvbGliL2NoZWNrc3VtY29weS5TCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9saWIvY2hlY2tzdW1jb3B5LlMKQEAgLTEsNiArMSw2IEBACiAvKgogICogQSBmYXN0IGNoZWNrc3VtK2NvcHkgcm91dGluZSB1c2luZyBtb3ZlbQotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDAxLCAyMDAzIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIKICAqCiAgKiBBdXRob3JzOglCam9ybiBXZXNlbgogICoKQEAgLTE2LDMyICsxNiwyMyBAQAogCTs7IHIxMiAtIGxlbmd0aAogCTs7IHIxMyAtIGNoZWNrc3VtCiAKLQk7OyBjaGVjayBmb3IgYnJlYWtldmVuIGxlbmd0aCBiZXR3ZWVuIG1vdmVtIGFuZCBub3JtYWwgd29yZCBsb29waW5nIHZlcnNpb25zCi0JOzsgd2UgYWxzbyBkbyBfTk9UXyB3YW50IHRvIGNvbXB1dGUgYSBjaGVja3N1bSBvdmVyIG1vcmUgdGhhbiB0aGUKLQk7OyBhY3R1YWwgbGVuZ3RoIHdoZW4gbGVuZ3RoIDwgNDAKLQotCWNtcHUudwk4MCwkcjEyCi0JYmxvCV93b3JkX2xvb3AKLQlub3AKLQotCTs7IG5lZWQgdG8gc2F2ZSB0aGUgcmVnaXN0ZXJzIHdlIHVzZSBiZWxvdyBpbiB0aGUgbW92ZW0gbG9vcAotCTs7IHRoaXMgb3ZlcmhlYWQgaXMgd2h5IHdlIGhhdmUgYSBjaGVjayBhYm92ZSBmb3IgYnJlYWtldmVuIGxlbmd0aAotCTs7IG9ubHkgcjAgLSByOCBoYXZlIHRvIGJlIHNhdmVkLCB0aGUgb3RoZXIgb25lcyBhcmUgY2xvYmJlci1hYmxlCi0JOzsgYWNjb3JkaW5nIHRvIHRoZSBBQkkKKwk7OyBPcHRpbWl6ZWQgZm9yIGxhcmdlIHBhY2tldHMKKwlzdWJxCTEwKjQsICRyMTIKKwlibHQJX3dvcmRfbG9vcAorCW1vdmUuZAkkcjEyLCAkYWNyCiAKIAlzdWJxCTkqNCwkc3AKLQlzdWJxCTEwKjQsJHIxMgk7IHVwZGF0ZSBsZW5ndGggZm9yIHRoZSBmaXJzdCBsb29wCisJY2xlYXJmCWMKIAltb3ZlbQkkcjgsWyRzcF0KIAogCTs7IGRvIGEgbW92ZW0gY29weSBhbmQgY2hlY2tzdW0KLQogMToJOzsgQSBmYWlsaW5nIHVzZXJzcGFjZSBhY2Nlc3MgKHRoZSByZWFkKSB3aWxsIGhhdmUgdGhpcyBhcyBQQy4KIF9tbG9vcDoJbW92ZW0JWyRyMTArXSwkcjkJOyByZWFkIDEwIGxvbmd3b3JkcworCWFkZG9xCS0xMCo0LCAkYWNyLCAkYWNyIDsgbG9vcCBjb3VudGVyIGluIGxhdGVuY3kgY3ljbGUKIAltb3ZlbQkkcjksWyRyMTErXQk7IHdyaXRlIDEwIGxvbmd3b3JkcwogCiAJOzsgcGVyZm9ybSBkd29yZCBjaGVja3N1bW1pbmcgb24gdGhlIDEwIGxvbmd3b3JkcwotCi0JYWRkLmQJJHIwLCRyMTMKKwlhZGRjCSRyMCwkcjEzCiAJYWRkYwkkcjEsJHIxMwogCWFkZGMJJHIyLCRyMTMKIAlhZGRjCSRyMywkcjEzCkBAIC01Miw0NyArNDMsMzAgQEAKIAlhZGRjCSRyOCwkcjEzCiAJYWRkYwkkcjksJHIxMwogCi0JOzsgZm9sZCB0aGUgY2FycnkgaW50byB0aGUgY2hlY2tzdW0sIHRvIGF2b2lkIGhhdmluZyB0byBsb29wIHRoZSBjYXJyeQotCTs7IGJhY2sgaW50byB0aGUgdG9wCisJOzsgdGVzdCAkYWNyLCB3aXRob3V0IHRyYXNoaW5nIGNhcnJ5LgorCW1vdmUuZAkkYWNyLCAkYWNyCisJYnBsCV9tbG9vcAorCTs7IHIxMiA8PSBhY3IgIGlzIG5lZWRlZCBhZnRlciBtbG9vcCBhbmQgaW4gdGhlIGV4Y2VwdGlvbiBoYW5kbGVycy4KKwltb3ZlLmQJJGFjciwgJHIxMgogCi0JYWRkYwkwLCRyMTMKLQlhZGRjCTAsJHIxMwkJOyBkbyBpdCBhZ2Fpbiwgc2luY2Ugd2UgbWlnaHQgaGF2ZSBnZW5lcmF0ZWQgYSBjYXJyeQotCi0Jc3VicQkxMCo0LCRyMTIKLQliZ2UJX21sb29wCi0Jbm9wCi0KLQlhZGRxCTEwKjQsJHIxMgk7IGNvbXBlbnNhdGUgZm9yIGxhc3QgbG9vcCB1bmRlcmZsb3dpbmcgbGVuZ3RoCi0KKwk7OyBmb2xkIHRoZSBsYXN0IGNhcnJ5IGludG8gcjEzCisJYWRkYwkwLCAkcjEzCiAJbW92ZW0JWyRzcCtdLCRyOAk7IHJlc3RvcmUgcmVncwogCiBfd29yZF9sb29wOgotCTs7IG9ubHkgZm9sZCBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byBmb2xkLgotCi0JY21wcQkwLCRyMTMKLQliZXEJX25vX2ZvbGQKKwlhZGRxCTEwKjQsJHIxMgk7IGNvbXBlbnNhdGUgZm9yIGxhc3QgbG9vcCB1bmRlcmZsb3dpbmcgbGVuZ3RoCiAKIAk7OyBmb2xkIDMyLWJpdCBjaGVja3N1bSBpbnRvIGEgMTYtYml0IGNoZWNrc3VtLCB0byBhdm9pZCBjYXJyaWVzIGJlbG93CiAJOzsgcjkgY2FuIGJlIHVzZWQgYXMgdGVtcG9yYXJ5LgotCiAJbW92ZS5kCSRyMTMsJHI5CiAJbHNycQkxNiwkcjkJCTsgcjAgPSBjaGVja3N1bSA+PiAxNgogCWFuZC5kCTB4ZmZmZiwkcjEzCTsgY2hlY2tzdW0gPSBjaGVja3N1bSAmIDB4ZmZmZgotCWFkZC5kCSRyOSwkcjEzCTsgY2hlY2tzdW0gKz0gcjAKLQltb3ZlLmQJJHIxMywkcjkJOyBkbyB0aGUgc2FtZSBhZ2FpbiwgbWF5YmUgd2UgZ290IGEgY2FycnkgbGFzdCBhZGQKLQlsc3JxCTE2LCRyOQotCWFuZC5kCTB4ZmZmZiwkcjEzCi0JYWRkLmQJJHI5LCRyMTMKIAotX25vX2ZvbGQ6Ci0JY21wcQkyLCRyMTIKKwlzdWJxCTIsICRyMTIKIAlibHQJX25vX3dvcmRzCi0Jbm9wCisJYWRkLmQJJHI5LCRyMTMJOyBjaGVja3N1bSArPSByMAogCiAJOzsgY29weSBhbmQgY2hlY2tzdW0gdGhlIHJlc3Qgb2YgdGhlIHdvcmRzCi0KLQlzdWJxCTIsJHIxMgotCiAyOgk7OyBBIGZhaWxpbmcgdXNlcnNwYWNlIGFjY2VzcyBmb3IgdGhlIHJlYWQgYmVsb3cgd2lsbCBoYXZlIHRoaXMgYXMgUEMuCiBfd2xvb3A6CW1vdmUudwlbJHIxMCtdLCRyOQogCWFkZHUudwkkcjksJHIxMwpAQCAtMTAwLDEyICs3NCw5IEBACiAJYmdlCV93bG9vcAogCW1vdmUudwkkcjksWyRyMTErXQogCi0JYWRkcQkyLCRyMTIKLQogX25vX3dvcmRzOgotCTs7IHNlZSBpZiB3ZSBoYXZlIG9uZSBvZGQgYnl0ZSBtb3JlCi0JY21wcQkxLCRyMTIKLQliZXEJX2RvX2J5dGUKKwlhZGRxCTIsJHIxMgorCWJuZQlfZG9fYnl0ZQogCW5vcAogCXJldAogCW1vdmUuZAkkcjEzLCRyMTAKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9saWIvZGVsYXkuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9saWIvZGVsYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWYxYWM5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2xpYi9kZWxheS5jCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBQcmVjaXNlIERlbGF5IExvb3BzIGZvciBFVFJBWCBGUworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBBeGlzIENvbW11bmljYXRpb25zIEFCLgorICoKKyAqLworCisjaW5jbHVkZSA8aHdyZWdzL3JlZ19tYXAuaD4KKyNpbmNsdWRlIDxod3JlZ3MvcmVnX3Jkd3IuaD4KKyNpbmNsdWRlIDxod3JlZ3MvdGltZXJfZGVmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworLyoKKyAqIE9uIEVUUkFYIEZTLCB3ZSBjYW4gY2hlY2sgdGhlIGZyZWUtcnVubmluZyByZWFkLW9ubHkgMTAwTUh6IHRpbWVyCisgKiBnZXR0aW5nIDMyLWJpdCAxMG5zIHByZWNpc2lvbiwgdGhlb3JldGljYWxseSBnb29kIGZvciA0Mi45NDk2NzI5NQorICogc2Vjb25kcy4gIFVuc2lnbmVkIGFyaXRobWV0aWMgYW5kIGNhcmVmdWwgZXhwcmVzc2lvbiBoYW5kbGVzCisgKiB3cmFwcGluZy4KKyAqLworCit2b2lkIGNyaXNfZGVsYXkxMG5zKHUzMiBuMTBucykKK3sKKwl1MzIgdDAgPSBSRUdfUkQodGltZXIsIHJlZ2lfdGltZXIwLCByX3RpbWUpOworCXdoaWxlIChSRUdfUkQodGltZXIsIHJlZ2lfdGltZXIwLCByX3RpbWUpIC0gdDAgPCBuMTBucykKKwkJOworfQorRVhQT1JUX1NZTUJPTChjcmlzX2RlbGF5MTBucyk7CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvbGliL2RyYW1faW5pdC5TIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2xpYi9kcmFtX2luaXQuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4ZmJlMi4uMDAwMDAwMAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvbGliL2RyYW1faW5pdC5TCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qICRJZDogZHJhbV9pbml0LlMsdiAxLjQgMjAwNS8wNC8yNCAxODo0ODozMiBzdGFydmlrIEV4cCAkCi0gKgotICogRFJBTS9TRFJBTSBpbml0aWFsaXphdGlvbiAtIGFsdGVyIHdpdGggY2FyZQotICogVGhpcyBmaWxlIGlzIGludGVuZGVkIHRvIGJlIGluY2x1ZGVkIGZyb20gb3RoZXIgYXNzZW1ibGVyIGZpbGVzCi0gKgotICogTm90ZTogVGhpcyBmaWxlIG1heSBub3QgbW9kaWZ5IHI4IG9yIHI5IGJlY2F1c2UgdGhleSBhcmUgdXNlZCB0bwotICogY2FycnkgaW5mb3JtYXRpb24gZnJvbSB0aGUgZGVjb21wcmVzc2VyIHRvIHRoZSBrZXJuZWwKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMyBBeGlzIENvbW11bmljYXRpb25zIEFCCi0gKgotICogQXV0aG9yczogIE1pa2FlbCBTdGFydmlrIChzdGFydmlrQGF4aXMuY29tKQotICovCi0KLS8qIEp1c3QgdG8gYmUgY2VydGFpbiB0aGUgY29uZmlnIGZpbGUgaXMgaW5jbHVkZWQsIHdlIGluY2x1ZGUgaXQgaGVyZQotICogZXhwbGljaXRseSBpbnN0ZWFkIG9mIGRlcGVuZGluZyBvbiBpdCBiZWluZyBpbmNsdWRlZCBpbiB0aGUgZmlsZSB0aGF0Ci0gKiB1c2VzIHRoaXMgY29kZS4KLSAqLwotCi0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL2FzbS9yZWdfbWFwX2FzbS5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9hc20vYmlmX2NvcmVfZGVmc19hc20uaD4KLQotCTs7IFdBUk5JTkchIFRoZSByZWdpc3RlcnMgcjggYW5kIHI5IGFyZSB1c2VkIGFzIHBhcmFtZXRlcnMgY2FycnlpbmcKLQk7OyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBkZWNvbXByZXNzb3IgKGlmIHRoZSBrZXJuZWwgd2FzIGNvbXByZXNzZWQpLgotCTs7IFRoZXkgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBjb2RlIGJlbG93LgotCi0JOyBSZWZlciB0byBCSUYgTURTIGZvciBhIGRlc2NyaXB0aW9uIG9mIFNEUkFNIGluaXRpYWxpemF0aW9uCi0KLQk7IEJhbmsgY29uZmlndXJhdGlvbgotCW1vdmUuZCAgIFJFR19BRERSKGJpZl9jb3JlLCByZWdpX2JpZl9jb3JlLCByd19zZHJhbV9jZmdfZ3JwMCksICRyMAotCW1vdmUuZCAgIENPTkZJR19FVFJBWF9TRFJBTV9HUlAwX0NPTkZJRywgJHIxCi0JbW92ZS5kICAgJHIxLCBbJHIwXQotCW1vdmUuZCAgIFJFR19BRERSKGJpZl9jb3JlLCByZWdpX2JpZl9jb3JlLCByd19zZHJhbV9jZmdfZ3JwMSksICRyMAotCW1vdmUuZCAgIENPTkZJR19FVFJBWF9TRFJBTV9HUlAxX0NPTkZJRywgJHIxCi0JbW92ZS5kICAgJHIxLCBbJHIwXQotCi0JOyBDYWxjdWxhdGUgdmFsdWUgb2YgbXJzX2RhdGEKLQk7IENBUyBsYXRlbmN5ID0gMiAmJiBidXNfd2lkdGggPSAzMiA9PiAweDQwCi0JOyBDQVMgbGF0ZW5jeSA9IDMgJiYgYnVzX3dpZHRoID0gMzIgPT4gMHg2MAotCTsgQ0FTIGxhdGVuY3kgPSAyICYmIGJ1c193aWR0aCA9IDE2ID0+IDB4MjAKLQk7IENBUyBsYXRlbmN5ID0gMyAmJiBidXNfd2lkdGggPSAxNiA9PiAweDMwCi0KLQk7IENoZWNrIGlmIHZhbHVlIGlzIGFscmVhZHkgc3VwcGxpZWQgaW4ga2VybmVsIGNvbmZpZwotCW1vdmUuZCAgIENPTkZJR19FVFJBWF9TRFJBTV9DT01NQU5ELCAkcjIKLQlibmUJIF9zZXRfdGltaW5nCi0Jbm9wCi0KLQltb3ZlLmQgICAweDQwLCAkcjQgICAgICAgOyBBc3N1bWUgMzIgYml0cyBhbmQgQ0FTIGxhdGVuY3kgPSAyCi0JbW92ZS5kICAgQ09ORklHX0VUUkFYX1NEUkFNX1RJTUlORywgJHIxCi0gCWFuZC5kICAgIDB4MDcsICRyMSAgICAgICA7IEdldCBDQVMgbGF0ZW5jeQotCWNtcHEJIDIsICRyMQkJIDsgQ0wgPSAyID8KLQliZXEJIF9id19jaGVjawotCW5vcAotCW1vdmUuZCAgIDB4NjAsICRyNAotCi1fYndfY2hlY2s6Ci0JOyBBc3N1bWUgdGhhdCBncm91cCAwIHdpZHRoIGlzIGVxdWFsIHRvIGdyb3VwIDEuIFRoaXMgYXNzdW1wdGlvbgotCTsgaXMgd3JvbmcgZm9yIGEgZ3JvdXAgMSBvbmx5IGhhcmR3YXJlIChzdWNoIGFzIHRoZSBncmFuZCBvbGQKLQk7IFN0b3JQb2ludCspLgotCW1vdmUuZCAgIENPTkZJR19FVFJBWF9TRFJBTV9HUlAwX0NPTkZJRywgJHIxCi0JYW5kLmQgICAgMHgyMDAsICRyMQk7IERSQU0gd2lkdGggaXMgYml0IDkKLQliZXEgICAgICBfc2V0X3RpbWluZwotCWxzbHEJIDIsICRyNAkJOyAgbXJzX2RhdGEgc3RhcnRzIGF0IGJpdCAyCi0JbHNycSAgICAgMSwgJHI0CQk7ICAxNiBiaXRzLiBTaGlmdCBkb3duIHZhbHVlLgotCi0JOyBTZXQgdGltaW5nIHBhcmFtZXRlcnMgKHJlZnJlc2ggb2ZmIHRvIGF2b2lkIEd1aW5uZXNzIFRSIDgzKQotX3NldF90aW1pbmc6Ci0JbW92ZS5kICAgQ09ORklHX0VUUkFYX1NEUkFNX1RJTUlORywgJHIxCi0JYW5kLmQgICAgfigzIDw8IHJlZ19iaWZfY29yZV9yd19zZHJhbV90aW1pbmdfX19yZWZfX19sc2IpLCAkcjEKLQltb3ZlLmQgICBSRUdfQUREUihiaWZfY29yZSwgcmVnaV9iaWZfY29yZSwgcndfc2RyYW1fdGltaW5nKSwgJHIwCi0JbW92ZS5kICAgJHIxLCBbJHIwXQotCi0JOyBJc3N1ZSBOT1AgY29tbWFuZAotCW1vdmUuZCBSRUdfQUREUihiaWZfY29yZSwgcmVnaV9iaWZfY29yZSwgcndfc2RyYW1fY21kKSwgJHI1Ci0JbW92ZXEgcmVna19iaWZfY29yZV9ub3AsICRyMQotCW1vdmUuZCAkcjEsIFskcjVdCi0KLQk7IFdhaXQgMjAwdXMKLQltb3ZlLmQgICAxMDAwMCwgJHIyCi0xOglibmUgICAgICAxYgotCXN1YnEgICAgIDEsICRyMgotCi0JOyBJc3N1ZSBpbml0aWFsaXphdGlvbiBjb21tYW5kIHNlcXVlbmNlCi0JbW92ZS5kICAgX3NkcmFtX2NvbW1hbmRzX3N0YXJ0LCAkcjIKLQlhbmQuZCAgICAweDAwMGZmZmZmLCAkcjIgOyBNYWtlIHN1cmUgY29tbWFuZHMgYXJlIHJlYWQgZnJvbSBmbGFzaAotCW1vdmUuZCAgIF9zZHJhbV9jb21tYW5kc19lbmQsICAkcjMKLQlhbmQuZCAgICAweDAwMGZmZmZmLCAkcjMKLTE6CWNsZWFyLmQgICRyNgotCW1vdmUuYiAgIFskcjIrXSwgJHI2IAk7IExvYWQgY29tbWFuZAotCW9yLmQgICAgICRyNCwgJHI2CTsgQWRkIGNhbGN1bGF0ZWQgbXJzCi0JbW92ZS5kICAgJHI2LCBbJHI1XQk7IFdyaXRlIHJ3X3NkcmFtX2NtZAotCTsgV2FpdCA4MCBucyBiZXR3ZWVuIGVhY2ggY29tbWFuZAotCW1vdmUuZAkgNDAwMCwgJHI3Ci0yOglibmUJIDJiCi0Jc3VicQkgMSwgJHI3Ci0JY21wLmQgICAgJHIyLCAkcjMJOyBMYXN0IGNvbW1hbmQ/Ci0JYm5lICAgICAgMWIKLQlub3AKLQotCTsgU3RhcnQgcmVmcmVzaAotCW1vdmUuZCAgIENPTkZJR19FVFJBWF9TRFJBTV9USU1JTkcsICRyMQotCW1vdmUuZCAgIFJFR19BRERSKGJpZl9jb3JlLCByZWdpX2JpZl9jb3JlLCByd19zZHJhbV90aW1pbmcpLCAkcjAKLQltb3ZlLmQgICAkcjEsIFskcjBdCi0KLQk7IEluaXRpYWxpemF0aW9uIGZpbmlzaGVkCi0JYmEgICAgICAgX3NkcmFtX2NvbW1hbmRzX2VuZAotCW5vcAotCi1fc2RyYW1fY29tbWFuZHNfc3RhcnQ6Ci0JLmJ5dGUgICByZWdrX2JpZl9jb3JlX3ByZSA7IFByZWNoYXJnZQotCS5ieXRlICAgcmVna19iaWZfY29yZV9yZWYgOyByZWZyZXNoCi0JLmJ5dGUgICByZWdrX2JpZl9jb3JlX3JlZiA7IHJlZnJlc2gKLQkuYnl0ZSAgIHJlZ2tfYmlmX2NvcmVfcmVmIDsgcmVmcmVzaAotCS5ieXRlICAgcmVna19iaWZfY29yZV9yZWYgOyByZWZyZXNoCi0JLmJ5dGUgICByZWdrX2JpZl9jb3JlX3JlZiA7IHJlZnJlc2gKLQkuYnl0ZSAgIHJlZ2tfYmlmX2NvcmVfcmVmIDsgcmVmcmVzaAotCS5ieXRlICAgcmVna19iaWZfY29yZV9yZWYgOyByZWZyZXNoCi0JLmJ5dGUgICByZWdrX2JpZl9jb3JlX3JlZiA7IHJlZnJlc2gKLQkuYnl0ZSAgIHJlZ2tfYmlmX2NvcmVfbXJzIDsgbXJzCi1fc2RyYW1fY29tbWFuZHNfZW5kOgpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2xpYi9od19zZXR0aW5ncy5TIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2xpYi9od19zZXR0aW5ncy5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmY5NDQzLi4wMDAwMDAwCi0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9saWIvaHdfc2V0dGluZ3MuUworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiAkSWQ6IGh3X3NldHRpbmdzLlMsdiAxLjMgMjAwNS8wNC8yNCAxODozNjo1NyBzdGFydmlrIEV4cCAkCi0gKgotICogVGhpcyB0YWJsZSBpcyB1c2VkIGJ5IHNvbWUgdG9vbHMgdG8gZXh0cmFjdCBoYXJkd2FyZSBwYXJhbWV0ZXJzLgotICogVGhlIHRhYmxlIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUga2VybmVsIGFuZCB0aGUgZGVjb21wcmVzc29yLgotICogRG9uJ3QgZm9yZ2V0IHRvIHVwZGF0ZSB0aGUgdG9vbHMgaWYgeW91IGNoYW5nZSB0aGlzIHRhYmxlLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMSBBeGlzIENvbW11bmljYXRpb25zIEFCCi0gKgotICogQXV0aG9yczogIE1pa2FlbCBTdGFydmlrIChzdGFydmlrQGF4aXMuY29tKQotICovCi0KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvYXNtL3JlZ19tYXBfYXNtLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL2FzbS9iaWZfY29yZV9kZWZzX2FzbS5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9hc20vZ2lvX2RlZnNfYXNtLmg+Ci0KLQkuYXNjaWkgIkhXX1BBUkFNX01BR0lDIiA7IE1hZ2ljIG51bWJlcgotCS5kd29yZCAweGMwMDA0MDAwCTsgS2VybmVsIHN0YXJ0IGFkZHJlc3MKLQotCTsgRGVidWcgcG9ydAotI2lmZGVmIENPTkZJR19FVFJBWF9ERUJVR19QT1JUMAotCS5kd29yZCAwCi0jZWxpZiBkZWZpbmVkKENPTkZJR19FVFJBWF9ERUJVR19QT1JUMSkKLQkuZHdvcmQgMQotI2VsaWYgZGVmaW5lZChDT05GSUdfRVRSQVhfREVCVUdfUE9SVDIpCi0JLmR3b3JkIDIKLSNlbGlmIGRlZmluZWQoQ09ORklHX0VUUkFYX0RFQlVHX1BPUlQzKQotCS5kd29yZCAzCi0jZWxzZQotCS5kd29yZCA0IDsgTm8gZGVidWcKLSNlbmRpZgotCi0JOyBSZWdpc3RlciB2YWx1ZXMKLQkuZHdvcmQgUkVHX0FERFIoYmlmX2NvcmUsIHJlZ2lfYmlmX2NvcmUsIHJ3X2dycDFfY2ZnKQotCS5kd29yZCBDT05GSUdfRVRSQVhfTUVNX0dSUDFfQ09ORklHCi0JLmR3b3JkIFJFR19BRERSKGJpZl9jb3JlLCByZWdpX2JpZl9jb3JlLCByd19ncnAyX2NmZykKLQkuZHdvcmQgQ09ORklHX0VUUkFYX01FTV9HUlAyX0NPTkZJRwotCS5kd29yZCBSRUdfQUREUihiaWZfY29yZSwgcmVnaV9iaWZfY29yZSwgcndfZ3JwM19jZmcpCi0JLmR3b3JkIENPTkZJR19FVFJBWF9NRU1fR1JQM19DT05GSUcKLQkuZHdvcmQgUkVHX0FERFIoYmlmX2NvcmUsIHJlZ2lfYmlmX2NvcmUsIHJ3X2dycDRfY2ZnKQotCS5kd29yZCBDT05GSUdfRVRSQVhfTUVNX0dSUDRfQ09ORklHCi0JLmR3b3JkIFJFR19BRERSKGJpZl9jb3JlLCByZWdpX2JpZl9jb3JlLCByd19zZHJhbV9jZmdfZ3JwMCkKLQkuZHdvcmQgQ09ORklHX0VUUkFYX1NEUkFNX0dSUDBfQ09ORklHCi0JLmR3b3JkIFJFR19BRERSKGJpZl9jb3JlLCByZWdpX2JpZl9jb3JlLCByd19zZHJhbV9jZmdfZ3JwMSkKLQkuZHdvcmQgQ09ORklHX0VUUkFYX1NEUkFNX0dSUDFfQ09ORklHCi0JLmR3b3JkIFJFR19BRERSKGJpZl9jb3JlLCByZWdpX2JpZl9jb3JlLCByd19zZHJhbV90aW1pbmcpCi0JLmR3b3JkIENPTkZJR19FVFJBWF9TRFJBTV9USU1JTkcKLQkuZHdvcmQgUkVHX0FERFIoYmlmX2NvcmUsIHJlZ2lfYmlmX2NvcmUsIHJ3X3NkcmFtX2NtZCkKLQkuZHdvcmQgQ09ORklHX0VUUkFYX1NEUkFNX0NPTU1BTkQKLQotCS5kd29yZCBSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByd19wYV9kb3V0KQotCS5kd29yZCBDT05GSUdfRVRSQVhfREVGX0dJT19QQV9PVVQKLQkuZHdvcmQgUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcndfcGFfb2UpCi0JLmR3b3JkIENPTkZJR19FVFJBWF9ERUZfR0lPX1BBX09FCi0JLmR3b3JkIFJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3BiX2RvdXQpCi0JLmR3b3JkIENPTkZJR19FVFJBWF9ERUZfR0lPX1BCX09VVAotCS5kd29yZCBSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByd19wYl9vZSkKLQkuZHdvcmQgQ09ORklHX0VUUkFYX0RFRl9HSU9fUEJfT0UKLQkuZHdvcmQgUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcndfcGNfZG91dCkKLQkuZHdvcmQgQ09ORklHX0VUUkFYX0RFRl9HSU9fUENfT1VUCi0JLmR3b3JkIFJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3BjX29lKQotCS5kd29yZCBDT05GSUdfRVRSQVhfREVGX0dJT19QQ19PRQotCS5kd29yZCBSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByd19wZF9kb3V0KQotCS5kd29yZCBDT05GSUdfRVRSQVhfREVGX0dJT19QRF9PVVQKLQkuZHdvcmQgUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcndfcGRfb2UpCi0JLmR3b3JkIENPTkZJR19FVFJBWF9ERUZfR0lPX1BEX09FCi0JLmR3b3JkIFJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3BlX2RvdXQpCi0JLmR3b3JkIENPTkZJR19FVFJBWF9ERUZfR0lPX1BFX09VVAotCS5kd29yZCBSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByd19wZV9vZSkKLQkuZHdvcmQgQ09ORklHX0VUUkFYX0RFRl9HSU9fUEVfT0UKLQotCS5kd29yZCAwIDsgTm8gbW9yZSByZWdpc3RlciB2YWx1ZXMKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9saWIvc3BpbmxvY2suUyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9saWIvc3BpbmxvY2suUwppbmRleCAyNDM3YWU3Li43OTA4N2VmIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvbGliL3NwaW5sb2NrLlMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2xpYi9zcGlubG9jay5TCkBAIC0xMiwxMSArMTIsMTEgQEAKIAogY3Jpc19zcGluX2xvY2s6CiAJY2xlYXJmCXAKLTE6CXRlc3QuZAlbJHIxMF0KKzE6CXRlc3QuYglbJHIxMF0KIAliZXEJMWIKIAljbGVhcmYJcAogCWF4Ci0JY2xlYXIuZCBbJHIxMF0KKwljbGVhci5iIFskcjEwXQogCWJjcyAgICAgMWIKIAljbGVhcmYJcAogCXJldApAQCAtMjQsMTAgKzI0LDEwIEBACiAKIGNyaXNfc3Bpbl90cnlsb2NrOgogCWNsZWFyZglwCi0xOgltb3ZlLmQJWyRyMTBdLCAkcjExCisxOgltb3ZlLmIJWyRyMTBdLCAkcjExCiAJYXgKLQljbGVhci5kIFskcjEwXQorCWNsZWFyLmIgWyRyMTBdCiAgICAgICAgIGJjcwkxYgogICAgICAgICBjbGVhcmYJcAogCXJldAotCW1vdmUuZAkkcjExLCRyMTAKKwltb3Z1LmIJJHIxMSwkcjEwCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1hMy9LY29uZmlnIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21hY2gtYTMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGRmMDZkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21hY2gtYTMvS2NvbmZpZwpAQCAtMCwwICsxLDExMCBAQAoraWYgQ1JJU19NQUNIX0FSVFBFQzMKKworbWVudSAiQXJ0cGVjLTMgb3B0aW9ucyIKKyAgICAgICBkZXBlbmRzIG9uIENSSVNfTUFDSF9BUlRQRUMzCisKK2NvbmZpZyBFVFJBWF9EUkFNX1ZJUlRVQUxfQkFTRQorCWhleAorCWRlZmF1bHQgImMwMDAwMDAwIgorCitjb25maWcgRVRSQVhfTDJDQUNIRQorICAgICAgIGJvb2wKKyAgICAgICBkZWZhdWx0IHkKKworY29uZmlnIEVUUkFYX1NFUklBTF9QT1JUUworICAgICAgIGludAorICAgICAgIGRlZmF1bHQgNQorCitjb25maWcgRVRSQVhfRERSCisgICAgICAgYm9vbAorICAgICAgIGRlZmF1bHQgeQorCitjb25maWcgRVRSQVhfRERSMl9NUlMKKwloZXggIkREUjIgTVJTIgorCWRlZmF1bHQgIjAiCisKK2NvbmZpZyBFVFJBWF9ERFIyX1RJTUlORworCWhleCAiRERSMiBTRFJBTSB0aW1pbmciCisJZGVmYXVsdCAiMCIKKwloZWxwCisJICBTRFJBTSB0aW1pbmcgcGFyYW1ldGVycy4KKworY29uZmlnIEVUUkFYX0REUjJfQ09ORklHCisJaGV4ICJERFIyIGNvbmZpZyIKKwlkZWZhdWx0ICIwIgorCitjb25maWcgRVRSQVhfUElPX0NFMF9DRkcKKyAgICAgICBoZXggIlBJTyBDRTAgY29uZmlndXJhdGlvbiIKKyAgICAgICBkZWZhdWx0ICIwIgorCitjb25maWcgRVRSQVhfUElPX0NFMV9DRkcKKyAgICAgICBoZXggIlBJTyBDRTEgY29uZmlndXJhdGlvbiIKKyAgICAgICBkZWZhdWx0ICIwIgorCitjb25maWcgRVRSQVhfUElPX0NFMl9DRkcKKyAgICAgICBoZXggIlBJTyBDRTIgY29uZmlndXJhdGlvbiIKKyAgICAgICBkZWZhdWx0ICIwIgorCitjb25maWcgRVRSQVhfREVGX0dJT19QQV9PRQorCWhleCAiR0lPX1BBX09FIgorCWRlZmF1bHQgIjAwMDAwMDAwIgorCWhlbHAKKwkgIENvbmZpZ3VyZXMgdGhlIGRpcmVjdGlvbiBvZiBnZW5lcmFsIHBvcnQgQSBiaXRzLiAgMSBpcyBvdXQsIDAgaXMgaW4uCisJICBUaGlzIGlzIG9mdGVuIHRvdGFsbHkgZGlmZmVyZW50IGRlcGVuZGluZyBvbiB0aGUgcHJvZHVjdCB1c2VkLgorCSAgVGhlcmUgYXJlIHNvbWUgZ3VpZGVsaW5lcyB0aG91Z2ggLSBpZiB5b3Uga25vdyB0aGF0IG9ubHkgTEVEJ3MgYXJlCisJICBjb25uZWN0ZWQgdG8gcG9ydCBQQSwgdGhlbiB0aGV5IGFyZSB1c3VhbGx5IGNvbm5lY3RlZCB0byBiaXRzIDItNAorCSAgYW5kIHlvdSBjYW4gdGhlcmVmb3JlIHVzZSAxYy4gIE9uIG90aGVyIGJvYXJkcyB3aGljaCBkb24ndCBoYXZlIHRoZQorCSAgTEVEJ3MgYXQgdGhlIGdlbmVyYWwgcG9ydHMsIHRoZXNlIGJpdHMgYXJlIHVzZWQgZm9yIGFsbCBraW5kcyBvZgorCSAgc3R1ZmYuICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIHVzZSwgaXQgaXMgYWx3YXlzIHNhZmUgdG8gcHV0IGFsbAorCSAgYXMgaW5wdXRzLCBhbHRob3VnaCBmbG9hdGluZyBpbnB1dHMgaXNuJ3QgZ29vZC4KKworY29uZmlnIEVUUkFYX0RFRl9HSU9fUEFfT1VUCisJaGV4ICJHSU9fUEFfT1VUIgorCWRlZmF1bHQgIjAwMDAwMDAwIgorCWhlbHAKKwkgIENvbmZpZ3VyZXMgdGhlIGluaXRpYWwgZGF0YSBmb3IgdGhlIGdlbmVyYWwgcG9ydCBBIGJpdHMuICBNb3N0CisJICBwcm9kdWN0cyBzaG91bGQgdXNlIDAwIGhlcmUuCisKK2NvbmZpZyBFVFJBWF9ERUZfR0lPX1BCX09FCisJaGV4ICJHSU9fUEJfT0UiCisJZGVmYXVsdCAiMDAwMDAwMDAwIgorCWhlbHAKKwkgIENvbmZpZ3VyZXMgdGhlIGRpcmVjdGlvbiBvZiBnZW5lcmFsIHBvcnQgQiBiaXRzLiAgMSBpcyBvdXQsIDAgaXMgaW4uCisJICBUaGlzIGlzIG9mdGVuIHRvdGFsbHkgZGlmZmVyZW50IGRlcGVuZGluZyBvbiB0aGUgcHJvZHVjdCB1c2VkLgorCSAgVGhlcmUgYXJlIHNvbWUgZ3VpZGVsaW5lcyB0aG91Z2ggLSBpZiB5b3Uga25vdyB0aGF0IG9ubHkgTEVEJ3MgYXJlCisJICBjb25uZWN0ZWQgdG8gcG9ydCBQQSwgdGhlbiB0aGV5IGFyZSB1c3VhbGx5IGNvbm5lY3RlZCB0byBiaXRzIDItNAorCSAgYW5kIHlvdSBjYW4gdGhlcmVmb3JlIHVzZSAxYy4gIE9uIG90aGVyIGJvYXJkcyB3aGljaCBkb24ndCBoYXZlIHRoZQorCSAgTEVEJ3MgYXQgdGhlIGdlbmVyYWwgcG9ydHMsIHRoZXNlIGJpdHMgYXJlIHVzZWQgZm9yIGFsbCBraW5kcyBvZgorCSAgc3R1ZmYuICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIHVzZSwgaXQgaXMgYWx3YXlzIHNhZmUgdG8gcHV0IGFsbAorCSAgYXMgaW5wdXRzLCBhbHRob3VnaCBmbG9hdGluZyBpbnB1dHMgaXNuJ3QgZ29vZC4KKworY29uZmlnIEVUUkFYX0RFRl9HSU9fUEJfT1VUCisJaGV4ICJHSU9fUEJfT1VUIgorCWRlZmF1bHQgIjAwMDAwMDAwMCIKKwloZWxwCisJICBDb25maWd1cmVzIHRoZSBpbml0aWFsIGRhdGEgZm9yIHRoZSBnZW5lcmFsIHBvcnQgQiBiaXRzLiAgTW9zdAorCSAgcHJvZHVjdHMgc2hvdWxkIHVzZSAwMDAwMCBoZXJlLgorCitjb25maWcgRVRSQVhfREVGX0dJT19QQ19PRQorCWhleCAiR0lPX1BDX09FIgorCWRlZmF1bHQgIjAwMDAwIgorCWhlbHAKKwkgIENvbmZpZ3VyZXMgdGhlIGRpcmVjdGlvbiBvZiBnZW5lcmFsIHBvcnQgQyBiaXRzLiAgMSBpcyBvdXQsIDAgaXMgaW4uCisJICBUaGlzIGlzIG9mdGVuIHRvdGFsbHkgZGlmZmVyZW50IGRlcGVuZGluZyBvbiB0aGUgcHJvZHVjdCB1c2VkLgorCSAgVGhlcmUgYXJlIHNvbWUgZ3VpZGVsaW5lcyB0aG91Z2ggLSBpZiB5b3Uga25vdyB0aGF0IG9ubHkgTEVEJ3MgYXJlCisJICBjb25uZWN0ZWQgdG8gcG9ydCBQQSwgdGhlbiB0aGV5IGFyZSB1c3VhbGx5IGNvbm5lY3RlZCB0byBiaXRzIDItNAorCSAgYW5kIHlvdSBjYW4gdGhlcmVmb3JlIHVzZSAxYy4gIE9uIG90aGVyIGJvYXJkcyB3aGljaCBkb24ndCBoYXZlIHRoZQorCSAgTEVEJ3MgYXQgdGhlIGdlbmVyYWwgcG9ydHMsIHRoZXNlIGJpdHMgYXJlIHVzZWQgZm9yIGFsbCBraW5kcyBvZgorCSAgc3R1ZmYuICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIHVzZSwgaXQgaXMgYWx3YXlzIHNhZmUgdG8gcHV0IGFsbAorCSAgYXMgaW5wdXRzLCBhbHRob3VnaCBmbG9hdGluZyBpbnB1dHMgaXNuJ3QgZ29vZC4KKworY29uZmlnIEVUUkFYX0RFRl9HSU9fUENfT1VUCisJaGV4ICJHSU9fUENfT1VUIgorCWRlZmF1bHQgIjAwMDAwIgorCWhlbHAKKwkgIENvbmZpZ3VyZXMgdGhlIGluaXRpYWwgZGF0YSBmb3IgdGhlIGdlbmVyYWwgcG9ydCBDIGJpdHMuICBNb3N0CisJICBwcm9kdWN0cyBzaG91bGQgdXNlIDAwMDAwIGhlcmUuCisKK2VuZG1lbnUKKworZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL01ha2VmaWxlIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21hY2gtYTMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFmYTZhNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL01ha2VmaWxlCkBAIC0wLDAgKzEsMTEgQEAKKyMgJElkOiBNYWtlZmlsZSx2IDEuMyAyMDA3LzAzLzEzIDExOjU3OjQ2IHN0YXJ2aWsgRXhwICQKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCisjCisKK29iai15ICAgOj0gZG1hLm8gcGlubXV4Lm8gaW8ubyBhcmJpdGVyLm8KK29iai0kKENPTkZJR19FVFJBWF9WQ1NfU0lNKSArPSB2Y3NfaG9vay5vCitvYmotJChDT05GSUdfQ1BVX0ZSRVEpICAgKz0gY3B1ZnJlcS5vCisKK2NsZWFuOgorCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1hMy9hcmJpdGVyLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1hMy9hcmJpdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5MjRkYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2FyYml0ZXIuYwpAQCAtMCwwICsxLDYzNCBAQAorLyoKKyAqIE1lbW9yeSBhcmJpdGVyIGZ1bmN0aW9ucy4gQWxsb2NhdGVzIGJhbmR3aWR0aCB0aHJvdWdoIHRoZQorICogYXJiaXRlciBhbmQgc2V0cyB1cCBhcmJpdGVyIGJyZWFrcG9pbnRzLgorICoKKyAqIFRoZSBhbGdvcml0aG0gZmlyc3QgYXNzaWducyBzbG90cyB0byB0aGUgY2xpZW50cyB0aGF0IGhhcyBzcGVjaWZpZWQKKyAqIGJhbmR3aWR0aCAoZS5nLiBldGhlcm5ldCkgYW5kIHRoZW4gdGhlIHJlbWFpbmluZyBzbG90cyBhcmUgZGl2aWRlZAorICogb24gYWxsIHRoZSBhY3RpdmUgY2xpZW50cy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNyBBeGlzIENvbW11bmljYXRpb25zIEFCLgorICoKKyAqIFRoZSBhcnRwZWMtMyBoYXMgdHdvIGFyYml0ZXJzLiBUaGUgbWVtb3J5IGhpZXJhcmNoeSBsb29rcyBsaWtlIHRoaXM6CisgKgorICoKKyAqIENQVSBETUFzCisgKiAgfCAgIHwKKyAqICB8ICAgfAorICogLS0tLS0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IGZvbyBhcmJpdGVyfC0tLS18IEludGVybmFsIG1lbW9yeXwKKyAqIC0tLS0tLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgICB8CisgKiAtLS0tLS0tLS0tLS0tLQorICogfCBMMiBjYWNoZSAgIHwKKyAqIC0tLS0tLS0tLS0tLS0tCisgKiAgICAgICAgICAgICB8CisgKiBoMjY0IGV0YyAgICB8CisgKiAgICB8ICAgICAgICB8CisgKiAgICB8ICAgICAgICB8CisgKiAtLS0tLS0tLS0tLS0tLQorICogfCBiYXIgYXJiaXRlcnwKKyAqIC0tLS0tLS0tLS0tLS0tCisgKiAgICAgICB8CisgKiAtLS0tLS0tLS0KKyAqIHwgU0RSQU0gfAorICogLS0tLS0tLS0tCisgKgorICovCisKKyNpbmNsdWRlIDxod3JlZ3MvcmVnX21hcC5oPgorI2luY2x1ZGUgPGh3cmVncy9yZWdfcmR3ci5oPgorI2luY2x1ZGUgPGh3cmVncy9tYXJiX2Zvb19kZWZzLmg+CisjaW5jbHVkZSA8aHdyZWdzL21hcmJfYmFyX2RlZnMuaD4KKyNpbmNsdWRlIDxhcmJpdGVyLmg+CisjaW5jbHVkZSA8aHdyZWdzL2ludHJfdmVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxX3JlZ3MuaD4KKworI2RlZmluZSBEKHgpCisKK3N0cnVjdCBjcmlzdjMyX3dhdGNoX2VudHJ5IHsKKyAgdW5zaWduZWQgbG9uZyBpbnN0YW5jZTsKKyAgd2F0Y2hfY2FsbGJhY2sgKmNiOworICB1bnNpZ25lZCBsb25nIHN0YXJ0OworICB1bnNpZ25lZCBsb25nIGVuZDsKKyAgaW50IHVzZWQ7Cit9OworCisjZGVmaW5lIE5VTUJFUl9PRl9CUCA0CisjZGVmaW5lIFNEUkFNX0JBTkRXSURUSCA0MDAwMDAwMDAKKyNkZWZpbmUgSU5UTUVNX0JBTkRXSURUSCA0MDAwMDAwMDAKKyNkZWZpbmUgTkJSX09GX1NMT1RTIDY0CisjZGVmaW5lIE5CUl9PRl9SRUdJT05TIDIKKyNkZWZpbmUgTkJSX09GX0NMSUVOVFMgMTUKKyNkZWZpbmUgQVJCSVRFUlMgMgorI2RlZmluZSBVTkFTU0lHTkVEIDEwMAorCitzdHJ1Y3QgYXJiaXRlciB7CisgIHVuc2lnbmVkIGxvbmcgaW5zdGFuY2U7CisgIGludCBuYnJfcmVnaW9uczsKKyAgaW50IG5icl9jbGllbnRzOworICBpbnQgcmVxdWVzdGVkX3Nsb3RzW05CUl9PRl9SRUdJT05TXVtOQlJfT0ZfQ0xJRU5UU107CisgIGludCBhY3RpdmVfY2xpZW50c1tOQlJfT0ZfUkVHSU9OU11bTkJSX09GX0NMSUVOVFNdOworfTsKKworc3RhdGljIHN0cnVjdCBjcmlzdjMyX3dhdGNoX2VudHJ5IHdhdGNoZXNbQVJCSVRFUlNdW05VTUJFUl9PRl9CUF0gPQoreworICB7CisgIHtyZWdpX21hcmJfZm9vX2JwMH0sCisgIHtyZWdpX21hcmJfZm9vX2JwMX0sCisgIHtyZWdpX21hcmJfZm9vX2JwMn0sCisgIHtyZWdpX21hcmJfZm9vX2JwM30KKyAgfSwKKyAgeworICB7cmVnaV9tYXJiX2Jhcl9icDB9LAorICB7cmVnaV9tYXJiX2Jhcl9icDF9LAorICB7cmVnaV9tYXJiX2Jhcl9icDJ9LAorICB7cmVnaV9tYXJiX2Jhcl9icDN9CisgIH0KK307CisKK3N0cnVjdCBhcmJpdGVyIGFyYml0ZXJzW0FSQklURVJTXSA9Cit7CisgIHsgLyogTDIgY2FjaGUgYXJiaXRlciAqLworICAgIC5pbnN0YW5jZSA9IHJlZ2lfbWFyYl9mb28sCisgICAgLm5icl9yZWdpb25zID0gMiwKKyAgICAubmJyX2NsaWVudHMgPSAxNQorICB9LAorICB7IC8qIEREUjIgYXJiaXRlciAqLworICAgIC5pbnN0YW5jZSA9IHJlZ2lfbWFyYl9iYXIsCisgICAgLm5icl9yZWdpb25zID0gMSwKKyAgICAubmJyX2NsaWVudHMgPSA5CisgIH0KK307CisKK3N0YXRpYyBpbnQgbWF4X2JhbmR3aWR0aFtOQlJfT0ZfUkVHSU9OU10gPSB7U0RSQU1fQkFORFdJRFRILCBJTlRNRU1fQkFORFdJRFRIfTsKKworREVGSU5FX1NQSU5MT0NLKGFyYml0ZXJfbG9jayk7CisKK3N0YXRpYyBpcnFyZXR1cm5fdAorY3Jpc3YzMl9mb29fYXJiaXRlcl9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKK3N0YXRpYyBpcnFyZXR1cm5fdAorY3Jpc3YzMl9iYXJfYXJiaXRlcl9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKKworLyoKKyAqICJJJ20gdGhlIGFyYml0ZXIsIEkga25vdyB0aGUgc2NvcmUuCisgKiAgRnJvbSBzcXVhcmUgb25lIEknbGwgYmUgd2F0Y2hpbmcgYWxsIDY0LiIKKyAqIChtZW1vcnkgYXJiaXRlciBzbG90cywgdGhhdCBpcykKKyAqCisgKiAgT3IgaW4gb3RoZXIgd29yZHM6CisgKiBQcm9ncmFtIHRoZSBtZW1vcnkgYXJiaXRlciBzbG90cyBmb3IgInJlZ2lvbiIgYWNjb3JkaW5nIHRvIHdoYXQncworICogaW4gcmVxdWVzdGVkX3Nsb3RzW10gYW5kIGFjdGl2ZV9jbGllbnRzW10sIHdoaWxlIG1pbmltaXppbmcKKyAqIGxhdGVuY3kuIEEgY2FsbGVyIG1heSBwYXNzIGEgbm9uLXplcm8gcG9zaXRpdmUgYW1vdW50IGZvcgorICogInVudXNlZF9zbG90cyIsIHdoaWNoIG11c3QgdGhlbiBiZSB0aGUgdW5hbGxvY2F0ZWQsIHJlbWFpbmluZworICogbnVtYmVyIG9mIHNsb3RzLCBmcmVlIHRvIGhhbmQgb3V0IHRvIGFueSBjbGllbnQuCisgKi8KKworc3RhdGljIHZvaWQgY3Jpc3YzMl9hcmJpdGVyX2NvbmZpZyhpbnQgYXJiaXRlciwgaW50IHJlZ2lvbiwgaW50IHVudXNlZF9zbG90cykKK3sKKwlpbnQgc2xvdDsKKwlpbnQgY2xpZW50OworCWludCBpbnRlcnZhbCA9IDA7CisKKwkvKgorCSAqIFRoaXMgdmVjdG9yIGNvcnJlc3BvbmRzIHRvIHRoZSBoYXJkd2FyZSBhcmJpdGVyIHNsb3RzIChzZWUKKwkgKiB0aGUgaGFyZHdhcmUgZG9jdW1lbnRhdGlvbiBmb3Igc2VtYW50aWNzKS4gV2UgaW5pdGlhbGl6ZQorCSAqIGVhY2ggc2xvdCB3aXRoIGEgc3VpdGFibGUgc2VudGluZWwgdmFsdWUgb3V0c2lkZSB0aGUgdmFsaWQKKwkgKiByYW5nZSB7MCAuLiBOQlJfT0ZfQ0xJRU5UUyAtIDF9IGFuZCByZXBsYWNlIHRoZW0gd2l0aAorCSAqIGNsaWVudCBpbmRleGVzLiBUaGVuIGl0J3MgZmVkIHRvIHRoZSBoYXJkd2FyZS4KKwkgKi8KKwlzOCB2YWxbTkJSX09GX1NMT1RTXTsKKworCWZvciAoc2xvdCA9IDA7IHNsb3QgPCBOQlJfT0ZfU0xPVFM7IHNsb3QrKykKKwkgICAgdmFsW3Nsb3RdID0gLTE7CisKKwlmb3IgKGNsaWVudCA9IDA7IGNsaWVudCA8IGFyYml0ZXJzW2FyYml0ZXJdLm5icl9jbGllbnRzOyBjbGllbnQrKykgeworCSAgICBpbnQgcG9zOworCSAgICAvKiBBbGxvY2F0ZSB0aGUgcmVxdWVzdGVkIG5vbi16ZXJvIG51bWJlciBvZiBzbG90cywgYnV0CisJICAgICAqIGFsc28gZ2l2ZSBjbGllbnRzIHdpdGggemVyby1yZXF1ZXN0cyBvbmUgc2xvdCBlYWNoCisJICAgICAqIHdoaWxlIHN0b2NrcyBsYXN0LiBXZSBkbyB0aGUgbGF0dGVyIGhlcmUsIGluIGNsaWVudAorCSAgICAgKiBvcmRlci4gVGhpcyBtYWtlcyBzdXJlIHplcm8tcmVxdWVzdCBjbGllbnRzIGFyZSB0aGUKKwkgICAgICogZmlyc3QgdG8gZ2V0IHRvIGFueSBzcGFyZSBzbG90cywgZWxzZSB0aG9zZSBzbG90cworCSAgICAgKiBjb3VsZCwgd2hlbiBiYW5kd2lkdGggaXMgYWxsb2NhdGVkIGNsb3NlIHRvIHRoZSBsaW1pdCwKKwkgICAgICogYWxsIGJlIGFsbG9jYXRlZCB0byBsb3ctaW5kZXggbm9uLXplcm8tcmVxdWVzdCBjbGllbnRzCisJICAgICAqIGluIHRoZSBkZWZhdWx0LWZpbGwgbG9vcCBiZWxvdy4gQW5vdGhlciBwb3NpdGl2ZSBidXQKKwkgICAgICogc2Vjb25kYXJ5IGVmZmVjdCBpcyBhIHNvbWV3aGF0IGJldHRlciBzcHJlYWQgb2YgdGhlCisJICAgICAqIHplcm8tYmFuZHdpZHRoIGNsaWVudHMgaW4gdGhlIHZlY3RvciwgYXZvaWRpbmcgc29tZSBvZgorCSAgICAgKiB0aGUgbGF0ZW5jeSB0aGF0IGNvdWxkIG90aGVyd2lzZSBiZSBjYXVzZWQgYnkgdGhlCisJICAgICAqIHBhcnRpdGlvbmluZyBvZiBub24temVyby1iYW5kd2lkdGggY2xpZW50cyBhdCBsb3cKKwkgICAgICogaW5kZXhlcyBhbmQgemVyby1iYW5kd2lkdGggY2xpZW50cyBhdCBoaWdoCisJICAgICAqIGluZGV4ZXMuIChOb3RlIHRoYXQgdGhpcyBzcHJlYWRpbmcgY2FuIG9ubHkgYWZmZWN0IHRoZQorCSAgICAgKiB1bmFsbG9jYXRlZCBiYW5kd2lkdGguKSAgQWxsIHRoZSBhYm92ZSBvbmx5IG1hdHRlcnMgZm9yCisJICAgICAqIG1lbW9yeS1pbnRlbnNpdmUgc2l0dWF0aW9ucywgb2YgY291cnNlLgorCSAgICAgKi8KKwkgICAgaWYgKCFhcmJpdGVyc1thcmJpdGVyXS5yZXF1ZXN0ZWRfc2xvdHNbcmVnaW9uXVtjbGllbnRdKSB7CisJCS8qCisJCSAqIFNraXAgaW5hY3RpdmUgY2xpZW50cy4gQWxzbyBza2lwIHplcm8tc2xvdAorCQkgKiBhbGxvY2F0aW9ucyBpbiB0aGlzIHBhc3Mgd2hlbiB0aGVyZSBhcmUgbm8ga25vd24KKwkJICogZnJlZSBzbG90cy4KKwkJICovCisJCWlmICghYXJiaXRlcnNbYXJiaXRlcl0uYWN0aXZlX2NsaWVudHNbcmVnaW9uXVtjbGllbnRdIHx8CisJCQkJdW51c2VkX3Nsb3RzIDw9IDApCisJCQljb250aW51ZTsKKworCQl1bnVzZWRfc2xvdHMtLTsKKworCQkvKiBPbmx5IGFsbG9jYXRlIG9uZSBzbG90IGZvciB0aGlzIGNsaWVudC4gKi8KKwkJaW50ZXJ2YWwgPSBOQlJfT0ZfU0xPVFM7CisJICAgIH0gZWxzZQorCQlpbnRlcnZhbCA9IE5CUl9PRl9TTE9UUyAvCisJCQlhcmJpdGVyc1thcmJpdGVyXS5yZXF1ZXN0ZWRfc2xvdHNbcmVnaW9uXVtjbGllbnRdOworCisJICAgIHBvcyA9IDA7CisJICAgIHdoaWxlIChwb3MgPCBOQlJfT0ZfU0xPVFMpIHsKKwkJaWYgKHZhbFtwb3NdID49IDApCisJCSAgIHBvcysrOworCQllbHNlIHsKKwkJCXZhbFtwb3NdID0gY2xpZW50OworCQkJcG9zICs9IGludGVydmFsOworCQl9CisJICAgIH0KKwl9CisKKwljbGllbnQgPSAwOworCWZvciAoc2xvdCA9IDA7IHNsb3QgPCBOQlJfT0ZfU0xPVFM7IHNsb3QrKykgeworCQkvKgorCQkgKiBBbGxvY2F0ZSByZW1haW5pbmcgc2xvdHMgaW4gcm91bmQtcm9iaW4KKwkJICogY2xpZW50LW51bWJlciBvcmRlciBmb3IgYWN0aXZlIGNsaWVudHMuIEZvciB0aGlzCisJCSAqIHBhc3MsIHdlIGlnbm9yZSByZXF1ZXN0ZWQgYmFuZHdpZHRoIGFuZCBwcmV2aW91cworCQkgKiBhbGxvY2F0aW9ucy4KKwkJICovCisJCWlmICh2YWxbc2xvdF0gPCAwKSB7CisJCQlpbnQgZmlyc3QgPSBjbGllbnQ7CisJCQl3aGlsZSAoIWFyYml0ZXJzW2FyYml0ZXJdLmFjdGl2ZV9jbGllbnRzW3JlZ2lvbl1bY2xpZW50XSkgeworCQkJCWNsaWVudCA9IChjbGllbnQgKyAxKSAlCisJCQkJCWFyYml0ZXJzW2FyYml0ZXJdLm5icl9jbGllbnRzOworCQkJCWlmIChjbGllbnQgPT0gZmlyc3QpCisJCQkJICAgYnJlYWs7CisJCQl9CisJCQl2YWxbc2xvdF0gPSBjbGllbnQ7CisJCQljbGllbnQgPSAoY2xpZW50ICsgMSkgJSBhcmJpdGVyc1thcmJpdGVyXS5uYnJfY2xpZW50czsKKwkJfQorCQlpZiAoYXJiaXRlciA9PSAwKSB7CisJCQlpZiAocmVnaW9uID09IEVYVF9SRUdJT04pCisJCQkJUkVHX1dSX0lOVF9WRUNUKG1hcmJfZm9vLCByZWdpX21hcmJfZm9vLAorCQkJCQlyd19sMl9zbG90cywgc2xvdCwgdmFsW3Nsb3RdKTsKKwkJCWVsc2UgaWYgKHJlZ2lvbiA9PSBJTlRfUkVHSU9OKQorCQkJCVJFR19XUl9JTlRfVkVDVChtYXJiX2ZvbywgcmVnaV9tYXJiX2ZvbywKKwkJCQkJcndfaW50bV9zbG90cywgc2xvdCwgdmFsW3Nsb3RdKTsKKwkJfSBlbHNlIHsKKwkJCVJFR19XUl9JTlRfVkVDVChtYXJiX2JhciwgcmVnaV9tYXJiX2JhciwKKwkJCQlyd19kZHIyX3Nsb3RzLCBzbG90LCB2YWxbc2xvdF0pOworCQl9CisJfQorfQorCitleHRlcm4gY2hhciBfc3RleHQsIF9ldGV4dDsKKworc3RhdGljIHZvaWQgY3Jpc3YzMl9hcmJpdGVyX2luaXQodm9pZCkKK3sKKwlzdGF0aWMgaW50IGluaXRpYWxpemVkOworCisJaWYgKGluaXRpYWxpemVkKQorCQlyZXR1cm47CisKKwlpbml0aWFsaXplZCA9IDE7CisKKwkvKgorCSAqIENQVSBjYWNoZXMgYXJlIGFsd2F5cyBzZXQgdG8gYWN0aXZlLCBidXQgd2l0aCB6ZXJvCisJICogYmFuZHdpZHRoIGFsbG9jYXRlZC4gSXQgc2hvdWxkIGJlIG9rIHRvIGFsbG9jYXRlIHplcm8KKwkgKiBiYW5kd2lkdGggZm9yIHRoZSBjYWNoZXMsIGJlY2F1c2UgRE1BIGZvciBvdGhlciBjaGFubmVscworCSAqIHdpbGwgc3VwcG9zZWRseSBmaW5pc2gsIG9uY2UgdGhlaXIgcHJvZ3JhbW1lZCBhbW91bnQgaXMKKwkgKiBkb25lLCBhbmQgdGhlbiB0aGUgY2FjaGVzIHdpbGwgZ2V0IGFjY2VzcyBhY2NvcmRpbmcgdG8gdGhlCisJICogImZpeGVkIHNjaGVtZSIgZm9yIHVuY2xhaW1lZCBzbG90cy4gVGhvdWdoLCBpZiBmb3Igc29tZQorCSAqIHVzZS1jYXNlIHNvbWV3aGVyZSwgdGhlcmUncyBhIG1heGltdW0gQ1BVIGxhdGVuY3kgZm9yCisJICogZS5nLiBzb21lIGludGVycnVwdCwgd2UgaGF2ZSB0byBzdGFydCBhbGxvY2F0aW5nIHNwZWNpZmljCisJICogYmFuZHdpZHRoIGZvciB0aGUgQ1BVIGNhY2hlcyB0b28uCisJICovCisJYXJiaXRlcnNbMF0uYWN0aXZlX2NsaWVudHNbRVhUX1JFR0lPTl1bMTFdID0gMTsKKwlhcmJpdGVyc1swXS5hY3RpdmVfY2xpZW50c1tFWFRfUkVHSU9OXVsxMl0gPSAxOworCWNyaXN2MzJfYXJiaXRlcl9jb25maWcoMCwgRVhUX1JFR0lPTiwgMCk7CisJY3Jpc3YzMl9hcmJpdGVyX2NvbmZpZygwLCBJTlRfUkVHSU9OLCAwKTsKKwljcmlzdjMyX2FyYml0ZXJfY29uZmlnKDEsIEVYVF9SRUdJT04sIDApOworCisJaWYgKHJlcXVlc3RfaXJxKE1FTUFSQl9GT09fSU5UUl9WRUNULCBjcmlzdjMyX2Zvb19hcmJpdGVyX2lycSwKKwkJCUlSUUZfRElTQUJMRUQsICJhcmJpdGVyIiwgTlVMTCkpCisJCXByaW50ayhLRVJOX0VSUiAiQ291bGRuJ3QgYWxsb2NhdGUgYXJiaXRlciBJUlFcbiIpOworCisJaWYgKHJlcXVlc3RfaXJxKE1FTUFSQl9CQVJfSU5UUl9WRUNULCBjcmlzdjMyX2Jhcl9hcmJpdGVyX2lycSwKKwkJCUlSUUZfRElTQUJMRUQsICJhcmJpdGVyIiwgTlVMTCkpCisJCXByaW50ayhLRVJOX0VSUiAiQ291bGRuJ3QgYWxsb2NhdGUgYXJiaXRlciBJUlFcbiIpOworCisjaWZuZGVmIENPTkZJR19FVFJBWF9LR0RCCisJLyogR2xvYmFsIHdhdGNoIGZvciB3cml0ZXMgdG8ga2VybmVsIHRleHQgc2VnbWVudC4gKi8KKwljcmlzdjMyX2FyYml0ZXJfd2F0Y2godmlydF90b19waHlzKCZfc3RleHQpLCAmX2V0ZXh0IC0gJl9zdGV4dCwKKwkJTUFSQl9DTElFTlRTKGFyYml0ZXJfYWxsX2NsaWVudHMsIGFyYml0ZXJfYmFyX2FsbF9jbGllbnRzKSwKKwkJCSAgICAgIGFyYml0ZXJfYWxsX3dyaXRlLCBOVUxMKTsKKyNlbmRpZgorCisJLyogU2V0IHVwIG1heCBidXJzdCBzaXplcyBieSBkZWZhdWx0ICovCisJUkVHX1dSX0lOVChtYXJiX2JhciwgcmVnaV9tYXJiX2JhciwgcndfaDI2NF9yZF9idXJzdCwgMyk7CisJUkVHX1dSX0lOVChtYXJiX2JhciwgcmVnaV9tYXJiX2JhciwgcndfaDI2NF93cl9idXJzdCwgMyk7CisJUkVHX1dSX0lOVChtYXJiX2JhciwgcmVnaV9tYXJiX2JhciwgcndfY2NkX2J1cnN0LCAzKTsKKwlSRUdfV1JfSU5UKG1hcmJfYmFyLCByZWdpX21hcmJfYmFyLCByd192aW5fd3JfYnVyc3QsIDMpOworCVJFR19XUl9JTlQobWFyYl9iYXIsIHJlZ2lfbWFyYl9iYXIsIHJ3X3Zpbl9yZF9idXJzdCwgMyk7CisJUkVHX1dSX0lOVChtYXJiX2JhciwgcmVnaV9tYXJiX2Jhciwgcndfc2Nscl9yZF9idXJzdCwgMyk7CisJUkVHX1dSX0lOVChtYXJiX2JhciwgcmVnaV9tYXJiX2Jhciwgcndfdm91dF9idXJzdCwgMyk7CisJUkVHX1dSX0lOVChtYXJiX2JhciwgcmVnaV9tYXJiX2Jhciwgcndfc2Nscl9maWZvX2J1cnN0LCAzKTsKKwlSRUdfV1JfSU5UKG1hcmJfYmFyLCByZWdpX21hcmJfYmFyLCByd19sMmNhY2hlX2J1cnN0LCAzKTsKK30KKworaW50IGNyaXN2MzJfYXJiaXRlcl9hbGxvY2F0ZV9iYW5kd2lkdGgoaW50IGNsaWVudCwgaW50IHJlZ2lvbiwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGJhbmR3aWR0aCkKK3sKKwlpbnQgaTsKKwlpbnQgdG90YWxfYXNzaWduZWQgPSAwOworCWludCB0b3RhbF9jbGllbnRzID0gMDsKKwlpbnQgcmVxOworCWludCBhcmJpdGVyID0gMDsKKworCWNyaXN2MzJfYXJiaXRlcl9pbml0KCk7CisKKwlpZiAoY2xpZW50ICYgMHhmZmZmMDAwMCkgeworCQlhcmJpdGVyID0gMTsKKwkJY2xpZW50ID4+PSAxNjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgYXJiaXRlcnNbYXJiaXRlcl0ubmJyX2NsaWVudHM7IGkrKykgeworCQl0b3RhbF9hc3NpZ25lZCArPSBhcmJpdGVyc1thcmJpdGVyXS5yZXF1ZXN0ZWRfc2xvdHNbcmVnaW9uXVtpXTsKKwkJdG90YWxfY2xpZW50cyArPSBhcmJpdGVyc1thcmJpdGVyXS5hY3RpdmVfY2xpZW50c1tyZWdpb25dW2ldOworCX0KKworCS8qIEF2b2lkIGRpdmlzaW9uIGJ5IDAgZm9yIDAtYmFuZHdpZHRoIHJlcXVlc3RzLiAqLworCXJlcSA9IGJhbmR3aWR0aCA9PSAwCisJCT8gMCA6IE5CUl9PRl9TTE9UUyAvIChtYXhfYmFuZHdpZHRoW3JlZ2lvbl0gLyBiYW5kd2lkdGgpOworCisJLyoKKwkgKiBXZSBtYWtlIHN1cmUgdGhhdCB0aGVyZSBhcmUgZW5vdWdoIHNsb3RzIG9ubHkgZm9yIG5vbi16ZXJvCisJICogcmVxdWVzdHMuIFJlcXVlc3RpbmcgMCBiYW5kd2lkdGggKm1heSogYWxsb2NhdGUgc2xvdHMsCisJICogdGhvdWdoIGlmIGFsbCBiYW5kd2lkdGggaXMgYWxsb2NhdGVkLCBzdWNoIGEgY2xpZW50IHdvbid0CisJICogZ2V0IGFueSBhbmQgd2lsbCBoYXZlIHRvIHJlbHkgb24gZ2V0dGluZyBtZW1vcnkgYWNjZXNzCisJICogYWNjb3JkaW5nIHRvIHRoZSBmaXhlZCBzY2hlbWUgdGhhdCdzIHRoZSBkZWZhdWx0IHdoZW4gb25lCisJICogb2YgdGhlIHNsb3QtYWxsb2NhdGVkIGNsaWVudHMgZG9lc24ndCBjbGFpbSB0aGVpciBzbG90LgorCSAqLworCWlmICh0b3RhbF9hc3NpZ25lZCArIHJlcSA+IE5CUl9PRl9TTE9UUykKKwkgICByZXR1cm4gLUVOT01FTTsKKworCWFyYml0ZXJzW2FyYml0ZXJdLmFjdGl2ZV9jbGllbnRzW3JlZ2lvbl1bY2xpZW50XSA9IDE7CisJYXJiaXRlcnNbYXJiaXRlcl0ucmVxdWVzdGVkX3Nsb3RzW3JlZ2lvbl1bY2xpZW50XSA9IHJlcTsKKwljcmlzdjMyX2FyYml0ZXJfY29uZmlnKGFyYml0ZXIsIHJlZ2lvbiwgTkJSX09GX1NMT1RTIC0gdG90YWxfYXNzaWduZWQpOworCisJLyogUHJvcGFnYXRlIGFsbG9jYXRpb24gZnJvbSBmb28gdG8gYmFyICovCisJaWYgKGFyYml0ZXIgPT0gMCkKKwkJY3Jpc3YzMl9hcmJpdGVyX2FsbG9jYXRlX2JhbmR3aWR0aCg4IDw8IDE2LAorCQkJRVhUX1JFR0lPTiwgYmFuZHdpZHRoKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE1haW4gZW50cnkgZm9yIGJhbmR3aWR0aCBkZWFsbG9jYXRpb24uCisgKgorICogU3RyaWN0bHkgc3BlYWtpbmcsIGZvciBhIHNvbWV3aGF0IGNvbnN0YW50IHNldCBvZiBjbGllbnRzIHdoZXJlCisgKiBlYWNoIGNsaWVudCBnZXRzIGEgY29uc3RhbnQgYmFuZHdpZHRoIGFuZCBpcyBqdXN0IGVuYWJsZWQgb3IKKyAqIGRpc2FibGVkIChzb21ld2hhdCBkeW5hbWljYWxseSksIG5vIGFjdGlvbiBpcyBuZWNlc3NhcnkgaGVyZSB0bworICogYXZvaWQgc3RhcnZhdGlvbiBmb3Igbm9uLXplcm8tYWxsb2NhdGlvbiBjbGllbnRzLCBhcyB0aGUgYWxsb2NhdGVkCisgKiBzbG90cyB3aWxsIGp1c3QgYmUgdW51c2VkLiBIb3dldmVyLCBoYW5kaW5nIG91dCB0aG9zZSB1bnVzZWQgc2xvdHMKKyAqIHRvIGFjdGl2ZSBjbGllbnRzIGF2b2lkcyBuZWVkbGVzcyBsYXRlbmN5IGlmIHRoZSAiZml4ZWQgc2NoZW1lIgorICogd291bGQgZ2l2ZSB1bmNsYWltZWQgc2xvdHMgdG8gYW4gZWFnZXIgbG93LWluZGV4IGNsaWVudC4KKyAqLworCit2b2lkIGNyaXN2MzJfYXJiaXRlcl9kZWFsbG9jYXRlX2JhbmR3aWR0aChpbnQgY2xpZW50LCBpbnQgcmVnaW9uKQoreworCWludCBpOworCWludCB0b3RhbF9hc3NpZ25lZCA9IDA7CisJaW50IGFyYml0ZXIgPSAwOworCisJaWYgKGNsaWVudCAmIDB4ZmZmZjAwMDApCisJCWFyYml0ZXIgPSAxOworCisJYXJiaXRlcnNbYXJiaXRlcl0ucmVxdWVzdGVkX3Nsb3RzW3JlZ2lvbl1bY2xpZW50XSA9IDA7CisJYXJiaXRlcnNbYXJiaXRlcl0uYWN0aXZlX2NsaWVudHNbcmVnaW9uXVtjbGllbnRdID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBhcmJpdGVyc1thcmJpdGVyXS5uYnJfY2xpZW50czsgaSsrKQorCQl0b3RhbF9hc3NpZ25lZCArPSBhcmJpdGVyc1thcmJpdGVyXS5yZXF1ZXN0ZWRfc2xvdHNbcmVnaW9uXVtpXTsKKworCWNyaXN2MzJfYXJiaXRlcl9jb25maWcoYXJiaXRlciwgcmVnaW9uLCBOQlJfT0ZfU0xPVFMgLSB0b3RhbF9hc3NpZ25lZCk7Cit9CisKK2ludCBjcmlzdjMyX2FyYml0ZXJfd2F0Y2godW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJICB1bnNpZ25lZCBsb25nIGNsaWVudHMsIHVuc2lnbmVkIGxvbmcgYWNjZXNzZXMsCisJCQkgIHdhdGNoX2NhbGxiYWNrICpjYikKK3sKKwlpbnQgaTsKKwlpbnQgYXJiaXRlcjsKKwlpbnQgdXNlZFsyXTsKKwlpbnQgcmV0ID0gMDsKKworCWNyaXN2MzJfYXJiaXRlcl9pbml0KCk7CisKKwlpZiAoc3RhcnQgPiAweDgwMDAwMDAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQXJiaXRlcjogJWxYIGRvZXNuJ3QgbG9vayBsaWtlIGEgIgorCQkJInBoeXNpY2FsIGFkZHJlc3MiLCBzdGFydCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXNwaW5fbG9jaygmYXJiaXRlcl9sb2NrKTsKKworCWlmIChjbGllbnRzICYgMHhmZmZmKQorCQl1c2VkWzBdID0gMTsKKwlpZiAoY2xpZW50cyAmIDB4ZmZmZjAwMDApCisJCXVzZWRbMV0gPSAxOworCisJZm9yIChhcmJpdGVyID0gMDsgYXJiaXRlciA8IEFSQklURVJTOyBhcmJpdGVyKyspIHsKKwkJaWYgKCF1c2VkW2FyYml0ZXJdKQorCQkJY29udGludWU7CisKKwkJZm9yIChpID0gMDsgaSA8IE5VTUJFUl9PRl9CUDsgaSsrKSB7CisJCQlpZiAoIXdhdGNoZXNbYXJiaXRlcl1baV0udXNlZCkgeworCQkJCXVuc2lnbmVkIGludHJfbWFzazsKKwkJCQlpZiAoYXJiaXRlcikKKwkJCQkJaW50cl9tYXNrID0gUkVHX1JEX0lOVChtYXJiX2JhciwKKwkJCQkJCXJlZ2lfbWFyYl9iYXIsIHJ3X2ludHJfbWFzayk7CisJCQkJZWxzZQorCQkJCQlpbnRyX21hc2sgPSBSRUdfUkRfSU5UKG1hcmJfZm9vLAorCQkJCQkJcmVnaV9tYXJiX2ZvbywgcndfaW50cl9tYXNrKTsKKworCQkJCXdhdGNoZXNbYXJiaXRlcl1baV0udXNlZCA9IDE7CisJCQkJd2F0Y2hlc1thcmJpdGVyXVtpXS5zdGFydCA9IHN0YXJ0OworCQkJCXdhdGNoZXNbYXJiaXRlcl1baV0uZW5kID0gc3RhcnQgKyBzaXplOworCQkJCXdhdGNoZXNbYXJiaXRlcl1baV0uY2IgPSBjYjsKKworCQkJCXJldCB8PSAoaSArIDEpIDw8IChhcmJpdGVyICsgOCk7CisJCQkJaWYgKGFyYml0ZXIpIHsKKwkJCQkJUkVHX1dSX0lOVChtYXJiX2Jhcl9icCwKKwkJCQkJCXdhdGNoZXNbYXJiaXRlcl1baV0uaW5zdGFuY2UsCisJCQkJCQlyd19maXJzdF9hZGRyLAorCQkJCQkJd2F0Y2hlc1thcmJpdGVyXVtpXS5zdGFydCk7CisJCQkJCVJFR19XUl9JTlQobWFyYl9iYXJfYnAsCisJCQkJCQl3YXRjaGVzW2FyYml0ZXJdW2ldLmluc3RhbmNlLAorCQkJCQkJcndfbGFzdF9hZGRyLAorCQkJCQkJd2F0Y2hlc1thcmJpdGVyXVtpXS5lbmQpOworCQkJCQlSRUdfV1JfSU5UKG1hcmJfYmFyX2JwLAorCQkJCQkJd2F0Y2hlc1thcmJpdGVyXVtpXS5pbnN0YW5jZSwKKwkJCQkJCXJ3X29wLCBhY2Nlc3Nlcyk7CisJCQkJCVJFR19XUl9JTlQobWFyYl9iYXJfYnAsCisJCQkJCQl3YXRjaGVzW2FyYml0ZXJdW2ldLmluc3RhbmNlLAorCQkJCQkJcndfY2xpZW50cywKKwkJCQkJCWNsaWVudHMgJiAweGZmZmYpOworCQkJCX0gZWxzZSB7CisJCQkJCVJFR19XUl9JTlQobWFyYl9mb29fYnAsCisJCQkJCQl3YXRjaGVzW2FyYml0ZXJdW2ldLmluc3RhbmNlLAorCQkJCQkJcndfZmlyc3RfYWRkciwKKwkJCQkJCXdhdGNoZXNbYXJiaXRlcl1baV0uc3RhcnQpOworCQkJCQlSRUdfV1JfSU5UKG1hcmJfZm9vX2JwLAorCQkJCQkJd2F0Y2hlc1thcmJpdGVyXVtpXS5pbnN0YW5jZSwKKwkJCQkJCXJ3X2xhc3RfYWRkciwKKwkJCQkJCXdhdGNoZXNbYXJiaXRlcl1baV0uZW5kKTsKKwkJCQkJUkVHX1dSX0lOVChtYXJiX2Zvb19icCwKKwkJCQkJCXdhdGNoZXNbYXJiaXRlcl1baV0uaW5zdGFuY2UsCisJCQkJCQlyd19vcCwgYWNjZXNzZXMpOworCQkJCQlSRUdfV1JfSU5UKG1hcmJfZm9vX2JwLAorCQkJCQkJd2F0Y2hlc1thcmJpdGVyXVtpXS5pbnN0YW5jZSwKKwkJCQkJCXJ3X2NsaWVudHMsIGNsaWVudHMgPj4gMTYpOworCQkJCX0KKworCQkJCWlmIChpID09IDApCisJCQkJCWludHJfbWFzayB8PSAxOworCQkJCWVsc2UgaWYgKGkgPT0gMSkKKwkJCQkJaW50cl9tYXNrIHw9IDI7CisJCQkJZWxzZSBpZiAoaSA9PSAyKQorCQkJCQlpbnRyX21hc2sgfD0gNDsKKwkJCQllbHNlIGlmIChpID09IDMpCisJCQkJCWludHJfbWFzayB8PSA4OworCisJCQkJaWYgKGFyYml0ZXIpCisJCQkJCVJFR19XUl9JTlQobWFyYl9iYXIsIHJlZ2lfbWFyYl9iYXIsCisJCQkJCQlyd19pbnRyX21hc2ssIGludHJfbWFzayk7CisJCQkJZWxzZQorCQkJCQlSRUdfV1JfSU5UKG1hcmJfZm9vLCByZWdpX21hcmJfZm9vLAorCQkJCQkJcndfaW50cl9tYXNrLCBpbnRyX21hc2spOworCisJCQkJc3Bpbl91bmxvY2soJmFyYml0ZXJfbG9jayk7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlzcGluX3VubG9jaygmYXJiaXRlcl9sb2NrKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWVsc2UKKwkJcmV0dXJuIC1FTk9NRU07Cit9CisKK2ludCBjcmlzdjMyX2FyYml0ZXJfdW53YXRjaChpbnQgaWQpCit7CisJaW50IGFyYml0ZXI7CisJaW50IGludHJfbWFzazsKKworCWNyaXN2MzJfYXJiaXRlcl9pbml0KCk7CisKKwlzcGluX2xvY2soJmFyYml0ZXJfbG9jayk7CisKKwlmb3IgKGFyYml0ZXIgPSAwOyBhcmJpdGVyIDwgQVJCSVRFUlM7IGFyYml0ZXIrKykgeworCQlpbnQgaWQyOworCisJCWlmIChhcmJpdGVyKQorCQkJaW50cl9tYXNrID0gUkVHX1JEX0lOVChtYXJiX2JhciwgcmVnaV9tYXJiX2JhciwKKwkJCQlyd19pbnRyX21hc2spOworCQllbHNlCisJCQlpbnRyX21hc2sgPSBSRUdfUkRfSU5UKG1hcmJfZm9vLCByZWdpX21hcmJfZm9vLAorCQkJCXJ3X2ludHJfbWFzayk7CisKKwkJaWQyID0gKGlkICYgKDB4ZmYgPDwgKGFyYml0ZXIgKyA4KSkpID4+IChhcmJpdGVyICsgOCk7CisJCWlmIChpZDIgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZDItLTsKKwkJaWYgKChpZDIgPj0gTlVNQkVSX09GX0JQKSB8fCAoIXdhdGNoZXNbYXJiaXRlcl1baWQyXS51c2VkKSkgeworCQkJc3Bpbl91bmxvY2soJmFyYml0ZXJfbG9jayk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCW1lbXNldCgmd2F0Y2hlc1thcmJpdGVyXVtpZDJdLCAwLAorCQkJc2l6ZW9mKHN0cnVjdCBjcmlzdjMyX3dhdGNoX2VudHJ5KSk7CisKKwkJaWYgKGlkMiA9PSAwKQorCQkJaW50cl9tYXNrICY9IH4xOworCQllbHNlIGlmIChpZDIgPT0gMSkKKwkJCWludHJfbWFzayAmPSB+MjsKKwkJZWxzZSBpZiAoaWQyID09IDIpCisJCQlpbnRyX21hc2sgJj0gfjQ7CisJCWVsc2UgaWYgKGlkMiA9PSAzKQorCQkJaW50cl9tYXNrICY9IH44OworCisJCWlmIChhcmJpdGVyKQorCQkJUkVHX1dSX0lOVChtYXJiX2JhciwgcmVnaV9tYXJiX2JhciwgcndfaW50cl9tYXNrLAorCQkJCWludHJfbWFzayk7CisJCWVsc2UKKwkJCVJFR19XUl9JTlQobWFyYl9mb28sIHJlZ2lfbWFyYl9mb28sIHJ3X2ludHJfbWFzaywKKwkJCQlpbnRyX21hc2spOworCX0KKworCXNwaW5fdW5sb2NrKCZhcmJpdGVyX2xvY2spOworCXJldHVybiAwOworfQorCitleHRlcm4gdm9pZCBzaG93X3JlZ2lzdGVycyhzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKworc3RhdGljIGlycXJldHVybl90CitjcmlzdjMyX2Zvb19hcmJpdGVyX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJcmVnX21hcmJfZm9vX3JfbWFza2VkX2ludHIgbWFza2VkX2ludHIgPQorCQlSRUdfUkQobWFyYl9mb28sIHJlZ2lfbWFyYl9mb28sIHJfbWFza2VkX2ludHIpOworCXJlZ19tYXJiX2Zvb19icF9yX2Jya19jbGllbnRzIHJfY2xpZW50czsKKwlyZWdfbWFyYl9mb29fYnBfcl9icmtfYWRkciByX2FkZHI7CisJcmVnX21hcmJfZm9vX2JwX3JfYnJrX29wIHJfb3A7CisJcmVnX21hcmJfZm9vX2JwX3JfYnJrX2ZpcnN0X2NsaWVudCByX2ZpcnN0OworCXJlZ19tYXJiX2Zvb19icF9yX2Jya19zaXplIHJfc2l6ZTsKKwlyZWdfbWFyYl9mb29fYnBfcndfYWNrIGFjayA9IHswfTsKKwlyZWdfbWFyYl9mb29fcndfYWNrX2ludHIgYWNrX2ludHIgPSB7CisJCS5icDAgPSAxLCAuYnAxID0gMSwgLmJwMiA9IDEsIC5icDMgPSAxCisJfTsKKwlzdHJ1Y3QgY3Jpc3YzMl93YXRjaF9lbnRyeSAqd2F0Y2g7CisJdW5zaWduZWQgYXJiaXRlciA9ICh1bnNpZ25lZClkZXZfaWQ7CisKKwltYXNrZWRfaW50ciA9IFJFR19SRChtYXJiX2ZvbywgcmVnaV9tYXJiX2Zvbywgcl9tYXNrZWRfaW50cik7CisKKwlpZiAobWFza2VkX2ludHIuYnAwKQorCQl3YXRjaCA9ICZ3YXRjaGVzW2FyYml0ZXJdWzBdOworCWVsc2UgaWYgKG1hc2tlZF9pbnRyLmJwMSkKKwkJd2F0Y2ggPSAmd2F0Y2hlc1thcmJpdGVyXVsxXTsKKwllbHNlIGlmIChtYXNrZWRfaW50ci5icDIpCisJCXdhdGNoID0gJndhdGNoZXNbYXJiaXRlcl1bMl07CisJZWxzZSBpZiAobWFza2VkX2ludHIuYnAzKQorCQl3YXRjaCA9ICZ3YXRjaGVzW2FyYml0ZXJdWzNdOworCWVsc2UKKwkJcmV0dXJuIElSUV9OT05FOworCisJLyogUmV0cmlldmUgYWxsIHVzZWZ1bCBpbmZvcm1hdGlvbiBhbmQgcHJpbnQgaXQuICovCisJcl9jbGllbnRzID0gUkVHX1JEKG1hcmJfZm9vX2JwLCB3YXRjaC0+aW5zdGFuY2UsIHJfYnJrX2NsaWVudHMpOworCXJfYWRkciA9IFJFR19SRChtYXJiX2Zvb19icCwgd2F0Y2gtPmluc3RhbmNlLCByX2Jya19hZGRyKTsKKwlyX29wID0gUkVHX1JEKG1hcmJfZm9vX2JwLCB3YXRjaC0+aW5zdGFuY2UsIHJfYnJrX29wKTsKKwlyX2ZpcnN0ID0gUkVHX1JEKG1hcmJfZm9vX2JwLCB3YXRjaC0+aW5zdGFuY2UsIHJfYnJrX2ZpcnN0X2NsaWVudCk7CisJcl9zaXplID0gUkVHX1JEKG1hcmJfZm9vX2JwLCB3YXRjaC0+aW5zdGFuY2UsIHJfYnJrX3NpemUpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIkFyYml0ZXIgSVJRXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiQ2xpZW50cyAlWCBhZGRyICVYIG9wICVYIGZpcnN0ICVYIHNpemUgJVhcbiIsCisJICAgICAgIFJFR19UWVBFX0NPTlYoaW50LCByZWdfbWFyYl9mb29fYnBfcl9icmtfY2xpZW50cywgcl9jbGllbnRzKSwKKwkgICAgICAgUkVHX1RZUEVfQ09OVihpbnQsIHJlZ19tYXJiX2Zvb19icF9yX2Jya19hZGRyLCByX2FkZHIpLAorCSAgICAgICBSRUdfVFlQRV9DT05WKGludCwgcmVnX21hcmJfZm9vX2JwX3JfYnJrX29wLCByX29wKSwKKwkgICAgICAgUkVHX1RZUEVfQ09OVihpbnQsIHJlZ19tYXJiX2Zvb19icF9yX2Jya19maXJzdF9jbGllbnQsIHJfZmlyc3QpLAorCSAgICAgICBSRUdfVFlQRV9DT05WKGludCwgcmVnX21hcmJfZm9vX2JwX3JfYnJrX3NpemUsIHJfc2l6ZSkpOworCisJUkVHX1dSKG1hcmJfZm9vX2JwLCB3YXRjaC0+aW5zdGFuY2UsIHJ3X2FjaywgYWNrKTsKKwlSRUdfV1IobWFyYl9mb28sIHJlZ2lfbWFyYl9mb28sIHJ3X2Fja19pbnRyLCBhY2tfaW50cik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiSVJRIG9jY3VyZWQgYXQgJVhcbiIsICh1bnNpZ25lZClnZXRfaXJxX3JlZ3MoKSk7CisKKwlpZiAod2F0Y2gtPmNiKQorCQl3YXRjaC0+Y2IoKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90CitjcmlzdjMyX2Jhcl9hcmJpdGVyX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJcmVnX21hcmJfYmFyX3JfbWFza2VkX2ludHIgbWFza2VkX2ludHIgPQorCQlSRUdfUkQobWFyYl9iYXIsIHJlZ2lfbWFyYl9iYXIsIHJfbWFza2VkX2ludHIpOworCXJlZ19tYXJiX2Jhcl9icF9yX2Jya19jbGllbnRzIHJfY2xpZW50czsKKwlyZWdfbWFyYl9iYXJfYnBfcl9icmtfYWRkciByX2FkZHI7CisJcmVnX21hcmJfYmFyX2JwX3JfYnJrX29wIHJfb3A7CisJcmVnX21hcmJfYmFyX2JwX3JfYnJrX2ZpcnN0X2NsaWVudCByX2ZpcnN0OworCXJlZ19tYXJiX2Jhcl9icF9yX2Jya19zaXplIHJfc2l6ZTsKKwlyZWdfbWFyYl9iYXJfYnBfcndfYWNrIGFjayA9IHswfTsKKwlyZWdfbWFyYl9iYXJfcndfYWNrX2ludHIgYWNrX2ludHIgPSB7CisJCS5icDAgPSAxLCAuYnAxID0gMSwgLmJwMiA9IDEsIC5icDMgPSAxCisJfTsKKwlzdHJ1Y3QgY3Jpc3YzMl93YXRjaF9lbnRyeSAqd2F0Y2g7CisJdW5zaWduZWQgYXJiaXRlciA9ICh1bnNpZ25lZClkZXZfaWQ7CisKKwltYXNrZWRfaW50ciA9IFJFR19SRChtYXJiX2JhciwgcmVnaV9tYXJiX2Jhciwgcl9tYXNrZWRfaW50cik7CisKKwlpZiAobWFza2VkX2ludHIuYnAwKQorCQl3YXRjaCA9ICZ3YXRjaGVzW2FyYml0ZXJdWzBdOworCWVsc2UgaWYgKG1hc2tlZF9pbnRyLmJwMSkKKwkJd2F0Y2ggPSAmd2F0Y2hlc1thcmJpdGVyXVsxXTsKKwllbHNlIGlmIChtYXNrZWRfaW50ci5icDIpCisJCXdhdGNoID0gJndhdGNoZXNbYXJiaXRlcl1bMl07CisJZWxzZSBpZiAobWFza2VkX2ludHIuYnAzKQorCQl3YXRjaCA9ICZ3YXRjaGVzW2FyYml0ZXJdWzNdOworCWVsc2UKKwkJcmV0dXJuIElSUV9OT05FOworCisJLyogUmV0cmlldmUgYWxsIHVzZWZ1bCBpbmZvcm1hdGlvbiBhbmQgcHJpbnQgaXQuICovCisJcl9jbGllbnRzID0gUkVHX1JEKG1hcmJfYmFyX2JwLCB3YXRjaC0+aW5zdGFuY2UsIHJfYnJrX2NsaWVudHMpOworCXJfYWRkciA9IFJFR19SRChtYXJiX2Jhcl9icCwgd2F0Y2gtPmluc3RhbmNlLCByX2Jya19hZGRyKTsKKwlyX29wID0gUkVHX1JEKG1hcmJfYmFyX2JwLCB3YXRjaC0+aW5zdGFuY2UsIHJfYnJrX29wKTsKKwlyX2ZpcnN0ID0gUkVHX1JEKG1hcmJfYmFyX2JwLCB3YXRjaC0+aW5zdGFuY2UsIHJfYnJrX2ZpcnN0X2NsaWVudCk7CisJcl9zaXplID0gUkVHX1JEKG1hcmJfYmFyX2JwLCB3YXRjaC0+aW5zdGFuY2UsIHJfYnJrX3NpemUpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIkFyYml0ZXIgSVJRXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiQ2xpZW50cyAlWCBhZGRyICVYIG9wICVYIGZpcnN0ICVYIHNpemUgJVhcbiIsCisJICAgICAgIFJFR19UWVBFX0NPTlYoaW50LCByZWdfbWFyYl9iYXJfYnBfcl9icmtfY2xpZW50cywgcl9jbGllbnRzKSwKKwkgICAgICAgUkVHX1RZUEVfQ09OVihpbnQsIHJlZ19tYXJiX2Jhcl9icF9yX2Jya19hZGRyLCByX2FkZHIpLAorCSAgICAgICBSRUdfVFlQRV9DT05WKGludCwgcmVnX21hcmJfYmFyX2JwX3JfYnJrX29wLCByX29wKSwKKwkgICAgICAgUkVHX1RZUEVfQ09OVihpbnQsIHJlZ19tYXJiX2Jhcl9icF9yX2Jya19maXJzdF9jbGllbnQsIHJfZmlyc3QpLAorCSAgICAgICBSRUdfVFlQRV9DT05WKGludCwgcmVnX21hcmJfYmFyX2JwX3JfYnJrX3NpemUsIHJfc2l6ZSkpOworCisJUkVHX1dSKG1hcmJfYmFyX2JwLCB3YXRjaC0+aW5zdGFuY2UsIHJ3X2FjaywgYWNrKTsKKwlSRUdfV1IobWFyYl9iYXIsIHJlZ2lfbWFyYl9iYXIsIHJ3X2Fja19pbnRyLCBhY2tfaW50cik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiSVJRIG9jY3VyZWQgYXQgJVhcbiIsICh1bnNpZ25lZClnZXRfaXJxX3JlZ3MoKS0+ZXJwKTsKKworCWlmICh3YXRjaC0+Y2IpCisJCXdhdGNoLT5jYigpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1hMy9jcHVmcmVxLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1hMy9jcHVmcmVxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU1YTNjYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2NwdWZyZXEuYwpAQCAtMCwwICsxLDE1MyBAQAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8aHdyZWdzL3JlZ19tYXAuaD4KKyNpbmNsdWRlIDxod3JlZ3MvcmVnX3Jkd3IuaD4KKyNpbmNsdWRlIDxod3JlZ3MvY2xrZ2VuX2RlZnMuaD4KKyNpbmNsdWRlIDxod3JlZ3MvZGRyMl9kZWZzLmg+CisKK3N0YXRpYyBpbnQKK2NyaXNfc2RyYW1fZnJlcV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIHZhbCwKKwl2b2lkICpkYXRhKTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBjcmlzX3NkcmFtX2ZyZXFfbm90aWZpZXJfYmxvY2sgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBjcmlzX3NkcmFtX2ZyZXFfbm90aWZpZXIKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgY3Jpc19mcmVxX3RhYmxlW10gPSB7CisJezB4MDEsCTYwMDB9LAorCXsweDAyLAkyMDAwMDB9LAorCXswLAlDUFVGUkVRX1RBQkxFX0VORH0sCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGNyaXNfZnJlcV9nZXRfY3B1X2ZyZXF1ZW5jeSh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJlZ19jbGtnZW5fcndfY2xrX2N0cmwgY2xrX2N0cmw7CisJY2xrX2N0cmwgPSBSRUdfUkQoY2xrZ2VuLCByZWdpX2Nsa2dlbiwgcndfY2xrX2N0cmwpOworCXJldHVybiBjbGtfY3RybC5wbGwgPyAyMDAwMDAgOiA2MDAwOworfQorCitzdGF0aWMgdm9pZCBjcmlzX2ZyZXFfc2V0X2NwdV9zdGF0ZSh1bnNpZ25lZCBpbnQgc3RhdGUpCit7CisJaW50IGkgPSAwOworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOworCXJlZ19jbGtnZW5fcndfY2xrX2N0cmwgY2xrX2N0cmw7CisJY2xrX2N0cmwgPSBSRUdfUkQoY2xrZ2VuLCByZWdpX2Nsa2dlbiwgcndfY2xrX2N0cmwpOworCisjaWZkZWYgQ09ORklHX1NNUAorCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGkpCisjZW5kaWYKKwl7CisJCWZyZXFzLm9sZCA9IGNyaXNfZnJlcV9nZXRfY3B1X2ZyZXF1ZW5jeShpKTsKKwkJZnJlcXMubmV3ID0gY3Jpc19mcmVxX3RhYmxlW3N0YXRlXS5mcmVxdWVuY3k7CisJCWZyZXFzLmNwdSA9IGk7CisJfQorCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwkvKiBFdmVuIHRob3VnaCB3ZSBtYXkgYmUgU01QIHRoZXkgd2lsbCBzaGFyZSB0aGUgc2FtZSBjbG9jaworCSAqIHNvIGFsbCBzZXR0aW5ncyBhcmUgbWFkZSBvbiBDUFUwLiAqLworCWlmIChjcmlzX2ZyZXFfdGFibGVbc3RhdGVdLmZyZXF1ZW5jeSA9PSAyMDAwMDApCisJCWNsa19jdHJsLnBsbCA9IDE7CisJZWxzZQorCQljbGtfY3RybC5wbGwgPSAwOworCVJFR19XUihjbGtnZW4sIHJlZ2lfY2xrZ2VuLCByd19jbGtfY3RybCwgY2xrX2N0cmwpOworCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7Cit9OworCitzdGF0aWMgaW50IGNyaXNfZnJlcV92ZXJpZnkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJcmV0dXJuIGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3ZlcmlmeShwb2xpY3ksICZjcmlzX2ZyZXFfdGFibGVbMF0pOworfQorCitzdGF0aWMgaW50IGNyaXNfZnJlcV90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkgICAgdW5zaWduZWQgaW50IHRhcmdldF9mcmVxLAorCQkJICAgIHVuc2lnbmVkIGludCByZWxhdGlvbikKK3sKKwl1bnNpZ25lZCBpbnQgbmV3c3RhdGUgPSAwOworCisJaWYgKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksIGNyaXNfZnJlcV90YWJsZSwKKwkJCXRhcmdldF9mcmVxLCByZWxhdGlvbiwgJm5ld3N0YXRlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljcmlzX2ZyZXFfc2V0X2NwdV9zdGF0ZShuZXdzdGF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcmlzX2ZyZXFfY3B1X2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJaW50IHJlc3VsdDsKKworCS8qIGNwdWluZm8gYW5kIGRlZmF1bHQgcG9saWN5IHZhbHVlcyAqLworCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IDEwMDAwMDA7IC8qIDFtcyAqLworCXBvbGljeS0+Y3VyID0gY3Jpc19mcmVxX2dldF9jcHVfZnJlcXVlbmN5KDApOworCisJcmVzdWx0ID0gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfY3B1aW5mbyhwb2xpY3ksIGNyaXNfZnJlcV90YWJsZSk7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIChyZXN1bHQpOworCisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIoY3Jpc19mcmVxX3RhYmxlLCBwb2xpY3ktPmNwdSk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGNyaXNfZnJlcV9jcHVfZXhpdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9wdXRfYXR0cihwb2xpY3ktPmNwdSk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIgKmNyaXNfZnJlcV9hdHRyW10gPSB7CisJJmNwdWZyZXFfZnJlcV9hdHRyX3NjYWxpbmdfYXZhaWxhYmxlX2ZyZXFzLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIGNyaXNfZnJlcV9kcml2ZXIgPSB7CisJLmdldAk9IGNyaXNfZnJlcV9nZXRfY3B1X2ZyZXF1ZW5jeSwKKwkudmVyaWZ5CT0gY3Jpc19mcmVxX3ZlcmlmeSwKKwkudGFyZ2V0CT0gY3Jpc19mcmVxX3RhcmdldCwKKwkuaW5pdAk9IGNyaXNfZnJlcV9jcHVfaW5pdCwKKwkuZXhpdAk9IGNyaXNfZnJlcV9jcHVfZXhpdCwKKwkubmFtZQk9ICJjcmlzX2ZyZXEiLAorCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5hdHRyCT0gY3Jpc19mcmVxX2F0dHIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjcmlzX2ZyZXFfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisJcmV0ID0gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJmNyaXNfZnJlcV9kcml2ZXIpOworCWNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoJmNyaXNfc2RyYW1fZnJlcV9ub3RpZmllcl9ibG9jaywKKwkJQ1BVRlJFUV9UUkFOU0lUSU9OX05PVElGSUVSKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitjcmlzX3NkcmFtX2ZyZXFfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyB2YWwsCisJdm9pZCAqZGF0YSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyAqZnJlcXMgPSBkYXRhOworCWlmICh2YWwgPT0gQ1BVRlJFUV9QUkVDSEFOR0UpIHsKKwkJcmVnX2RkcjJfcndfY2ZnIGNmZyA9CisJCSAgUkVHX1JEKGRkcjIsIHJlZ2lfZGRyMl9jdHJsLCByd19jZmcpOworCQljZmcucmVmX2ludGVydmFsID0gKGZyZXFzLT5uZXcgPT0gMjAwMDAwID8gMTU2MCA6IDQ2KTsKKworCQlpZiAoZnJlcXMtPm5ldyA9PSAyMDAwMDApCisJCQlmb3IgKGkgPSAwOyBpIDwgNTAwMDA7IGkrKyk7CisJCVJFR19XUihiaWZfY29yZSwgcmVnaV9iaWZfY29yZSwgcndfc2RyYW1fdGltaW5nLCB0aW1pbmcpOworCX0KKwlyZXR1cm4gMDsKK30KKworCittb2R1bGVfaW5pdChjcmlzX2ZyZXFfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1hMy9kbWEuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2RtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZjIzNmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1hMy9kbWEuYwpAQCAtMCwwICsxLDE4NSBAQAorLyogV3JhcHBlciBmb3IgRE1BIGNoYW5uZWwgYWxsb2NhdG9yIHRoYXQgc3RhcnRzIGNsb2NrcyBldGMgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWFjaC9kbWEuaD4KKyNpbmNsdWRlIDxod3JlZ3MvcmVnX21hcC5oPgorI2luY2x1ZGUgPGh3cmVncy9yZWdfcmR3ci5oPgorI2luY2x1ZGUgPGh3cmVncy9tYXJiX2RlZnMuaD4KKyNpbmNsdWRlIDxod3JlZ3MvY2xrZ2VuX2RlZnMuaD4KKyNpbmNsdWRlIDxod3JlZ3Mvc3RybXV4X2RlZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhcmJpdGVyLmg+CisKK3N0YXRpYyBjaGFyIHVzZWRfZG1hX2NoYW5uZWxzW01BWF9ETUFfQ0hBTk5FTFNdOworc3RhdGljIGNvbnN0IGNoYXIgKnVzZWRfZG1hX2NoYW5uZWxzX3VzZXJzW01BWF9ETUFfQ0hBTk5FTFNdOworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRtYV9sb2NrKTsKKworaW50IGNyaXN2MzJfcmVxdWVzdF9kbWEodW5zaWduZWQgaW50IGRtYW5yLCBjb25zdCBjaGFyICpkZXZpY2VfaWQsCisJdW5zaWduZWQgb3B0aW9ucywgdW5zaWduZWQgaW50IGJhbmR3aWR0aCwgZW51bSBkbWFfb3duZXIgb3duZXIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlyZWdfY2xrZ2VuX3J3X2Nsa19jdHJsIGNsa19jdHJsOworCXJlZ19zdHJtdXhfcndfY2ZnIHN0cm11eF9jZmc7CisKKwlpZiAoY3Jpc3YzMl9hcmJpdGVyX2FsbG9jYXRlX2JhbmR3aWR0aChkbWFuciwKKwkJCW9wdGlvbnMgJiBETUFfSU5UX01FTSA/IElOVF9SRUdJT04gOiBFWFRfUkVHSU9OLAorCQkJYmFuZHdpZHRoKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1hX2xvY2ssIGZsYWdzKTsKKworCWlmICh1c2VkX2RtYV9jaGFubmVsc1tkbWFucl0pIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hX2xvY2ssIGZsYWdzKTsKKwkJaWYgKG9wdGlvbnMgJiBETUFfVkVSQk9TRV9PTl9FUlJPUikKKwkJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlcXVlc3QgRE1BICVpIGZvciAlcywgIgorCQkJCSJhbHJlYWR5IGFsbG9jYXRlZCBieSAlc1xuIiwKKwkJCQlkbWFuciwKKwkJCQlkZXZpY2VfaWQsCisJCQkJdXNlZF9kbWFfY2hhbm5lbHNfdXNlcnNbZG1hbnJdKTsKKworCQlpZiAob3B0aW9ucyAmIERNQV9QQU5JQ19PTl9FUlJPUikKKwkJCXBhbmljKCJyZXF1ZXN0X2RtYSBlcnJvciEiKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJY2xrX2N0cmwgPSBSRUdfUkQoY2xrZ2VuLCByZWdpX2Nsa2dlbiwgcndfY2xrX2N0cmwpOworCXN0cm11eF9jZmcgPSBSRUdfUkQoc3RybXV4LCByZWdpX3N0cm11eCwgcndfY2ZnKTsKKworCXN3aXRjaCAoZG1hbnIpIHsKKwljYXNlIDA6CisJY2FzZSAxOgorCQljbGtfY3RybC5kbWEwXzFfZXRoID0gMTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCWNhc2UgMzoKKwkJY2xrX2N0cmwuZG1hMl8zX3N0cmNvcCA9IDE7CisJCWJyZWFrOworCWNhc2UgNDoKKwljYXNlIDU6CisJCWNsa19jdHJsLmRtYTRfNV9pb3AgPSAxOworCQlicmVhazsKKwljYXNlIDY6CisJY2FzZSA3OgorCQljbGtfY3RybC5zc2VyX3Nlcl9kbWE2XzcgPSAxOworCQlicmVhazsKKwljYXNlIDk6CisJY2FzZSAxMToKKwkJY2xrX2N0cmwuZG1hOV8xMSA9IDE7CisJCWJyZWFrOworI2lmIE1BWF9ETUFfQ0hBTk5FTFMtMSAhPSAxMQorI2Vycm9yIENoZWNrIGRtYS5jCisjZW5kaWYKKwlkZWZhdWx0OgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFfbG9jaywgZmxhZ3MpOworCQlpZiAob3B0aW9ucyAmIERNQV9WRVJCT1NFX09OX0VSUk9SKQorCQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVxdWVzdCBETUEgJWkgZm9yICVzLCAiCisJCQkJIm9ubHkgMC0laSB2YWxpZClcbiIsCisJCQkJZG1hbnIsIGRldmljZV9pZCwgTUFYX0RNQV9DSEFOTkVMUy0xKTsKKworCQlpZiAob3B0aW9ucyAmIERNQV9QQU5JQ19PTl9FUlJPUikKKwkJCXBhbmljKCJyZXF1ZXN0X2RtYSBlcnJvciEiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChvd25lcikgeworCWNhc2UgZG1hX2V0aDoKKwkJaWYgKGRtYW5yID09IDApCisJCQlzdHJtdXhfY2ZnLmRtYTAgPSByZWdrX3N0cm11eF9ldGg7CisJCWVsc2UgaWYgKGRtYW5yID09IDEpCisJCQlzdHJtdXhfY2ZnLmRtYTEgPSByZWdrX3N0cm11eF9ldGg7CisJCWVsc2UKKwkJCXBhbmljKCJJbnZhbGlkIERNQSBjaGFubmVsIGZvciBldGhcbiIpOworCQlicmVhazsKKwljYXNlIGRtYV9zZXIwOgorCQlpZiAoZG1hbnIgPT0gMCkKKwkJCXN0cm11eF9jZmcuZG1hMCA9IHJlZ2tfc3RybXV4X3NlcjA7CisJCWVsc2UgaWYgKGRtYW5yID09IDEpCisJCQlzdHJtdXhfY2ZnLmRtYTEgPSByZWdrX3N0cm11eF9zZXIwOworCQllbHNlCisJCQlwYW5pYygiSW52YWxpZCBETUEgY2hhbm5lbCBmb3Igc2VyMFxuIik7CisJCWJyZWFrOworCWNhc2UgZG1hX3NlcjM6CisJCWlmIChkbWFuciA9PSAyKQorCQkJc3RybXV4X2NmZy5kbWEyID0gcmVna19zdHJtdXhfc2VyMzsKKwkJZWxzZSBpZiAoZG1hbnIgPT0gMykKKwkJCXN0cm11eF9jZmcuZG1hMyA9IHJlZ2tfc3RybXV4X3NlcjM7CisJCWVsc2UKKwkJCXBhbmljKCJJbnZhbGlkIERNQSBjaGFubmVsIGZvciBzZXIzXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBkbWFfc3RycDoKKwkJaWYgKGRtYW5yID09IDIpCisJCQlzdHJtdXhfY2ZnLmRtYTIgPSByZWdrX3N0cm11eF9zdHJjb3A7CisJCWVsc2UgaWYgKGRtYW5yID09IDMpCisJCQlzdHJtdXhfY2ZnLmRtYTMgPSByZWdrX3N0cm11eF9zdHJjb3A7CisJCWVsc2UKKwkJCXBhbmljKCJJbnZhbGlkIERNQSBjaGFubmVsIGZvciBzdHJwXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBkbWFfc2VyMToKKwkJaWYgKGRtYW5yID09IDQpCisJCQlzdHJtdXhfY2ZnLmRtYTQgPSByZWdrX3N0cm11eF9zZXIxOworCQllbHNlIGlmIChkbWFuciA9PSA1KQorCQkJc3RybXV4X2NmZy5kbWE1ID0gcmVna19zdHJtdXhfc2VyMTsKKwkJZWxzZQorCQkJcGFuaWMoIkludmFsaWQgRE1BIGNoYW5uZWwgZm9yIHNlcjFcbiIpOworCQlicmVhazsKKwljYXNlIGRtYV9pb3A6CisJCWlmIChkbWFuciA9PSA0KQorCQkJc3RybXV4X2NmZy5kbWE0ID0gcmVna19zdHJtdXhfaW9wOworCQllbHNlIGlmIChkbWFuciA9PSA1KQorCQkJc3RybXV4X2NmZy5kbWE1ID0gcmVna19zdHJtdXhfaW9wOworCQllbHNlCisJCQlwYW5pYygiSW52YWxpZCBETUEgY2hhbm5lbCBmb3IgaW9wXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBkbWFfc2VyMjoKKwkJaWYgKGRtYW5yID09IDYpCisJCQlzdHJtdXhfY2ZnLmRtYTYgPSByZWdrX3N0cm11eF9zZXIyOworCQllbHNlIGlmIChkbWFuciA9PSA3KQorCQkJc3RybXV4X2NmZy5kbWE3ID0gcmVna19zdHJtdXhfc2VyMjsKKwkJZWxzZQorCQkJcGFuaWMoIkludmFsaWQgRE1BIGNoYW5uZWwgZm9yIHNlcjJcbiIpOworCQlicmVhazsKKwljYXNlIGRtYV9zc2VyOgorCQlpZiAoZG1hbnIgPT0gNikKKwkJCXN0cm11eF9jZmcuZG1hNiA9IHJlZ2tfc3RybXV4X3NzZXI7CisJCWVsc2UgaWYgKGRtYW5yID09IDcpCisJCQlzdHJtdXhfY2ZnLmRtYTcgPSByZWdrX3N0cm11eF9zc2VyOworCQllbHNlCisJCQlwYW5pYygiSW52YWxpZCBETUEgY2hhbm5lbCBmb3Igc3NlclxuIik7CisJCWJyZWFrOworCWNhc2UgZG1hX3NlcjQ6CisJCWlmIChkbWFuciA9PSA5KQorCQkJc3RybXV4X2NmZy5kbWE5ID0gcmVna19zdHJtdXhfc2VyNDsKKwkJZWxzZQorCQkJcGFuaWMoIkludmFsaWQgRE1BIGNoYW5uZWwgZm9yIHNlcjRcbiIpOworCQlicmVhazsKKwljYXNlIGRtYV9qcGVnOgorCQlpZiAoZG1hbnIgPT0gOSkKKwkJCXN0cm11eF9jZmcuZG1hOSA9IHJlZ2tfc3RybXV4X2pwZWc7CisJCWVsc2UKKwkJCXBhbmljKCJJbnZhbGlkIERNQSBjaGFubmVsIGZvciBKUEVHXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBkbWFfaDI2NDoKKwkJaWYgKGRtYW5yID09IDExKQorCQkJc3RybXV4X2NmZy5kbWExMSA9IHJlZ2tfc3RybXV4X2gyNjQ7CisJCWVsc2UKKwkJCXBhbmljKCJJbnZhbGlkIERNQSBjaGFubmVsIGZvciBIMjY0XG4iKTsKKwkJYnJlYWs7CisJfQorCisJdXNlZF9kbWFfY2hhbm5lbHNbZG1hbnJdID0gMTsKKwl1c2VkX2RtYV9jaGFubmVsc191c2Vyc1tkbWFucl0gPSBkZXZpY2VfaWQ7CisJUkVHX1dSKGNsa2dlbiwgcmVnaV9jbGtnZW4sIHJ3X2Nsa19jdHJsLCBjbGtfY3RybCk7CisJUkVHX1dSKHN0cm11eCwgcmVnaV9zdHJtdXgsIHJ3X2NmZywgc3RybXV4X2NmZyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjcmlzdjMyX2ZyZWVfZG1hKHVuc2lnbmVkIGludCBkbWFucikKK3sKKwlzcGluX2xvY2soJmRtYV9sb2NrKTsKKwl1c2VkX2RtYV9jaGFubmVsc1tkbWFucl0gPSAwOworCXNwaW5fdW5sb2NrKCZkbWFfbG9jayk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1hMy9kcmFtX2luaXQuUyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2RyYW1faW5pdC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZDZiNDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1hMy9kcmFtX2luaXQuUwpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIEREUiBTRFJBTSBpbml0aWFsaXphdGlvbiAtIGFsdGVyIHdpdGggY2FyZQorICogVGhpcyBmaWxlIGlzIGludGVuZGVkIHRvIGJlIGluY2x1ZGVkIGZyb20gb3RoZXIgYXNzZW1ibGVyIGZpbGVzCisgKgorICogTm90ZTogVGhpcyBmaWxlIG1heSBub3QgbW9kaWZ5IHI4IG9yIHI5IGJlY2F1c2UgdGhleSBhcmUgdXNlZCB0bworICogY2FycnkgaW5mb3JtYXRpb24gZnJvbSB0aGUgZGVjb21wcmVzc2VyIHRvIHRoZSBrZXJuZWwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBBeGlzIENvbW11bmljYXRpb25zIEFCCisgKgorICogQXV0aG9yczogIE1pa2FlbCBTdGFydmlrIDxzdGFydmlrQGF4aXMuY29tPgorICovCisKKy8qIEp1c3QgdG8gYmUgY2VydGFpbiB0aGUgY29uZmlnIGZpbGUgaXMgaW5jbHVkZWQsIHdlIGluY2x1ZGUgaXQgaGVyZQorICogZXhwbGljaXRlbHkgaW5zdGVhZCBvZiBkZXBlbmRpbmcgb24gaXQgYmVpbmcgaW5jbHVkZWQgaW4gdGhlIGZpbGUgdGhhdAorICogdXNlcyB0aGlzIGNvZGUuCisgKi8KKworI2luY2x1ZGUgPGh3cmVncy9hc20vcmVnX21hcF9hc20uaD4KKyNpbmNsdWRlIDxod3JlZ3MvYXNtL2RkcjJfZGVmc19hc20uaD4KKworCTs7IFdBUk5JTkchIFRoZSByZWdpc3RlcnMgcjggYW5kIHI5IGFyZSB1c2VkIGFzIHBhcmFtZXRlcnMgY2FycnlpbmcKKwk7OyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBkZWNvbXByZXNzb3IgKGlmIHRoZSBrZXJuZWwgd2FzIGNvbXByZXNzZWQpLgorCTs7IFRoZXkgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBjb2RlIGJlbG93LgorCisJOzsgUmVmZXIgdG8gZGRyMiBNRFMgZm9yIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlCisKKwk7IFN0YXJ0IGNsb2NrCisJbW92ZS5kICAgUkVHX0FERFIoZGRyMiwgcmVnaV9kZHIyX2N0cmwsIHJ3X3BoeV9jZmcpLCAkcjAKKwltb3ZlLmQgICBSRUdfU1RBVEUoZGRyMiwgcndfcGh5X2NmZywgZW4sIHllcyksICRyMQorCW1vdmUuZCAgICRyMSwgWyRyMF0KKworCTsgUmVzZXQgcGh5IGFuZCBzdGFydCBjYWxpYnJhdGlvbgorCW1vdmUuZCAgIFJFR19BRERSKGRkcjIsIHJlZ2lfZGRyMl9jdHJsLCByd19waHlfY3RybCksICRyMAorCW1vdmUuZCAgIFJFR19TVEFURShkZHIyLCByd19waHlfY3RybCwgcnN0LCB5ZXMpIHwgXAorCQkgUkVHX1NUQVRFKGRkcjIsIHJ3X3BoeV9jdHJsLCBjYWxfcnN0LCB5ZXMpLCAkcjEKKwltb3ZlLmQgICAkcjEsIFskcjBdCisJbW92ZS5kCSBSRUdfU1RBVEUoZGRyMiwgcndfcGh5X2N0cmwsIGNhbF9zdGFydCwgeWVzKSwgJHIxCisJbW92ZS5kICAgJHIxLCBbJHIwXQorCisJOyAyLiBXYWl0IDIwMHVzCisJbW92ZS5kICAgMTAwMDAsICRyMgorMToJYm5lICAgICAgMWIKKwlzdWJxICAgICAxLCAkcjIKKworCTsgSXNzdWUgY29tbWFuZHMKKwltb3ZlLmQgICBSRUdfQUREUihkZHIyLCByZWdpX2RkcjJfY3RybCwgcndfY3RybCksICRyMAorCW1vdmUuZCAgIHNkcmFtX2NvbW1hbmRzX3N0YXJ0LCAkcjIKK2NvbW1hbmRfbG9vcDoKKwltb3Z1LmIgIFskcjIrXSwgJHIxCisJbW92dS53ICBbJHIyK10sICRyMworZG9fY21kOgorCWxzbHEgICAgIDE2LCAkcjEKKwlvci5kICAgICAkcjMsICRyMQorCW1vdmUuZCAgICRyMSwgWyRyMF0KKwljbXAuZCAgICBzZHJhbV9jb21tYW5kc19lbmQsICRyMgorCWJsbyAgICAgIGNvbW1hbmRfbG9vcAorCW5vcAorCisJOyBTZXQgdGltaW5nCisJbW92ZS5kICAgUkVHX0FERFIoZGRyMiwgcmVnaV9kZHIyX2N0cmwsIHJ3X3RpbWluZyksICRyMAorCW1vdmUuZCAgIENPTkZJR19FVFJBWF9ERFIyX1RJTUlORywgJHIxCisJbW92ZS5kICAgJHIxLCBbJHIwXQorCisJOyBTZXQgbGF0ZW5jeQorCW1vdmUuZCAgIFJFR19BRERSKGRkcjIsIHJlZ2lfZGRyMl9jdHJsLCByd19sYXRlbmN5KSwgJHIwCisJbW92ZS5kICAgMHgxMywgJHIxCisJbW92ZS5kICAgJHIxLCBbJHIwXQorCisJOyBTZXQgY29uZmlndXJhdGlvbgorCW1vdmUuZCAgIFJFR19BRERSKGRkcjIsIHJlZ2lfZGRyMl9jdHJsLCByd19jZmcpLCAkcjAKKwltb3ZlLmQgICBDT05GSUdfRVRSQVhfRERSMl9DT05GSUcsICRyMQorCW1vdmUuZCAgICRyMSwgWyRyMF0KKworCWJhIGFmdGVyX3NkcmFtX2NvbW1hbmRzCisJbm9wCisKK3NkcmFtX2NvbW1hbmRzX3N0YXJ0OgorCS5ieXRlIHJlZ2tfZGRyMl9kZXNlbGVjdAorCS53b3JkIDAKKwkuYnl0ZSByZWdrX2RkcjJfcHJlCisJLndvcmQgcmVna19kZHIyX3ByZV9hbGwKKwkuYnl0ZSByZWdrX2RkcjJfZW1yczIKKwkud29yZCAwCisJLmJ5dGUgcmVna19kZHIyX2VtcnMzCisJLndvcmQgMAorCS5ieXRlIHJlZ2tfZGRyMl9lbXJzCisJLndvcmQgcmVna19kZHIyX2RsbF9lbgorCS5ieXRlIHJlZ2tfZGRyMl9tcnMKKwkud29yZCByZWdrX2RkcjJfZGxsX3JzdAorCS5ieXRlIHJlZ2tfZGRyMl9wcmUKKwkud29yZCByZWdrX2RkcjJfcHJlX2FsbAorCS5ieXRlIHJlZ2tfZGRyMl9yZWYKKwkud29yZCAwCisJLmJ5dGUgcmVna19kZHIyX3JlZgorCS53b3JkIDAKKwkuYnl0ZSByZWdrX2RkcjJfbXJzCisJLndvcmQgQ09ORklHX0VUUkFYX0REUjJfTVJTICYgMHhmZmZmCisJLmJ5dGUgcmVna19kZHIyX2VtcnMKKwkud29yZCByZWdrX2RkcjJfb2NkX2RlZmF1bHQgfCByZWdrX2RkcjJfZGxsX2VuCisJLmJ5dGUgcmVna19kZHIyX2VtcnMKKwkud29yZCByZWdrX2RkcjJfb2NkX2V4aXQgfCByZWdrX2RkcjJfZGxsX2VuIHwgKENPTkZJR19FVFJBWF9ERFIyX01SUyA+PiAxNikKK3NkcmFtX2NvbW1hbmRzX2VuZDoKKwkuYWxpZ24gMQorYWZ0ZXJfc2RyYW1fY29tbWFuZHM6CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1hMy9od19zZXR0aW5ncy5TIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdfc2V0dGluZ3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNThhNjMyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdfc2V0dGluZ3MuUwpAQCAtMCwwICsxLDUxIEBACisvKgorICogVGhpcyB0YWJsZSBpcyB1c2VkIGJ5IHNvbWUgdG9vbHMgdG8gZXh0cmFjdCBoYXJkd2FyZSBwYXJhbWV0ZXJzLgorICogVGhlIHRhYmxlIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUga2VybmVsIGFuZCB0aGUgZGVjb21wcmVzc29yLgorICogRG9uJ3QgZm9yZ2V0IHRvIHVwZGF0ZSB0aGUgdG9vbHMgaWYgeW91IGNoYW5nZSB0aGlzIHRhYmxlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIKKyAqCisgKiBBdXRob3JzOiAgTWlrYWVsIFN0YXJ2aWsgPHN0YXJ2aWtAYXhpcy5jb20+CisgKi8KKworI2luY2x1ZGUgPGh3cmVncy9hc20vcmVnX21hcF9hc20uaD4KKyNpbmNsdWRlIDxod3JlZ3MvYXNtL2RkcjJfZGVmc19hc20uaD4KKyNpbmNsdWRlIDxod3JlZ3MvYXNtL2dpb19kZWZzX2FzbS5oPgorCisJLmFzY2lpICJIV19QQVJBTV9NQUdJQyIgOyBNYWdpYyBudW1iZXIKKwkuZHdvcmQgMHhjMDAwNDAwMAk7IEtlcm5lbCBzdGFydCBhZGRyZXNzCisKKwk7IERlYnVnIHBvcnQKKyNpZmRlZiBDT05GSUdfRVRSQVhfREVCVUdfUE9SVDAKKwkuZHdvcmQgMAorI2VsaWYgZGVmaW5lZChDT05GSUdfRVRSQVhfREVCVUdfUE9SVDEpCisJLmR3b3JkIDEKKyNlbGlmIGRlZmluZWQoQ09ORklHX0VUUkFYX0RFQlVHX1BPUlQyKQorCS5kd29yZCAyCisjZWxpZiBkZWZpbmVkKENPTkZJR19FVFJBWF9ERUJVR19QT1JUMykKKwkuZHdvcmQgMworI2Vsc2UKKwkuZHdvcmQgNCA7IE5vIGRlYnVnCisjZW5kaWYKKworCTsgUmVnaXN0ZXIgdmFsdWVzCisJLmR3b3JkIFJFR19BRERSKGRkcjIsIHJlZ2lfZGRyMl9jdHJsLCByd19jZmcpCisJLmR3b3JkIENPTkZJR19FVFJBWF9ERFIyX0NPTkZJRworCS5kd29yZCBSRUdfQUREUihkZHIyLCByZWdpX2RkcjJfY3RybCwgcndfdGltaW5nKQorCS5kd29yZCBDT05GSUdfRVRSQVhfRERSMl9USU1JTkcKKwkuZHdvcmQgQ09ORklHX0VUUkFYX0REUjJfTVJTCisKKwkuZHdvcmQgUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcndfcGFfZG91dCkKKwkuZHdvcmQgQ09ORklHX0VUUkFYX0RFRl9HSU9fUEFfT1VUCisJLmR3b3JkIFJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3BhX29lKQorCS5kd29yZCBDT05GSUdfRVRSQVhfREVGX0dJT19QQV9PRQorCS5kd29yZCBSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByd19wYl9kb3V0KQorCS5kd29yZCBDT05GSUdfRVRSQVhfREVGX0dJT19QQl9PVVQKKwkuZHdvcmQgUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcndfcGJfb2UpCisJLmR3b3JkIENPTkZJR19FVFJBWF9ERUZfR0lPX1BCX09FCisJLmR3b3JkIFJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3BjX2RvdXQpCisJLmR3b3JkIENPTkZJR19FVFJBWF9ERUZfR0lPX1BDX09VVAorCS5kd29yZCBSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByd19wY19vZSkKKwkuZHdvcmQgQ09ORklHX0VUUkFYX0RFRl9HSU9fUENfT0UKKworCS5kd29yZCAwIDsgTm8gbW9yZSByZWdpc3RlciB2YWx1ZXMKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2lvLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1hMy9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZWFmM2UKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1hMy9pby5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgSS9PIHBpbnMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQXhpcyBDb21tdW5pY2F0aW9ucyBBQi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21hY2gvcGlubXV4Lmg+CisjaW5jbHVkZSA8aHdyZWdzL2dpb19kZWZzLmg+CisKK3N0cnVjdCBjcmlzdjMyX2lvcG9ydCBjcmlzdjMyX2lvcG9ydHNbXSA9IHsKKwl7CisJCSh1bnNpZ25lZCBsb25nICopUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcndfcGFfb2UpLAorCQkodW5zaWduZWQgbG9uZyAqKVJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3BhX2RvdXQpLAorCQkodW5zaWduZWQgbG9uZyAqKVJFR19BRERSKGdpbywgcmVnaV9naW8sIHJfcGFfZGluKSwKKwkJMzIKKwl9LAorCXsKKwkJKHVuc2lnbmVkIGxvbmcgKilSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByd19wYl9vZSksCisJCSh1bnNpZ25lZCBsb25nICopUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcndfcGJfZG91dCksCisJCSh1bnNpZ25lZCBsb25nICopUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcl9wYl9kaW4pLAorCQkzMgorCX0sCisJeworCQkodW5zaWduZWQgbG9uZyAqKVJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3BjX29lKSwKKwkJKHVuc2lnbmVkIGxvbmcgKilSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByd19wY19kb3V0KSwKKwkJKHVuc2lnbmVkIGxvbmcgKilSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByX3BjX2RpbiksCisJCTE2CisJfSwKK307CisKKyNkZWZpbmUgTkJSX09GX1BPUlRTIHNpemVvZihjcmlzdjMyX2lvcG9ydHMpL3NpemVvZihzdHJ1Y3QgY3Jpc3YzMl9pb3BvcnQpCisKK3N0cnVjdCBjcmlzdjMyX2lvcGluIGNyaXN2MzJfbGVkX25ldDBfZ3JlZW47CitzdHJ1Y3QgY3Jpc3YzMl9pb3BpbiBjcmlzdjMyX2xlZF9uZXQwX3JlZDsKK3N0cnVjdCBjcmlzdjMyX2lvcGluIGNyaXN2MzJfbGVkMl9ncmVlbjsKK3N0cnVjdCBjcmlzdjMyX2lvcGluIGNyaXN2MzJfbGVkMl9yZWQ7CitzdHJ1Y3QgY3Jpc3YzMl9pb3BpbiBjcmlzdjMyX2xlZDNfZ3JlZW47CitzdHJ1Y3QgY3Jpc3YzMl9pb3BpbiBjcmlzdjMyX2xlZDNfcmVkOworCisvKiBEdW1teSBwb3J0IHVzZWQgd2hlbiBncmVlbiBMRUQgYW5kIHJlZCBMRUQgaXMgb24gdGhlIHNhbWUgYml0ICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpb19kdW1teTsKK3N0YXRpYyBzdHJ1Y3QgY3Jpc3YzMl9pb3BvcnQgZHVtbXlfcG9ydCA9IHsKKwkmaW9fZHVtbXksCisJJmlvX2R1bW15LAorCSZpb19kdW1teSwKKwkzMgorfTsKK3N0YXRpYyBzdHJ1Y3QgY3Jpc3YzMl9pb3BpbiBkdW1teV9sZWQgPSB7CisJJmR1bW15X3BvcnQsCisJMAorfTsKKworc3RhdGljIGludCBfX2luaXQgY3Jpc3YzMl9pb19pbml0KHZvaWQpCit7CisJaW50IHJldCA9IDA7CisKKwl1MzIgaTsKKworCS8qIExvY2tzICpzaG91bGQqIGJlIGR5bmFtaWNhbGx5IGluaXRpYWxpemVkLiAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNyaXN2MzJfaW9wb3J0cyk7IGkrKykKKwkJc3Bpbl9sb2NrX2luaXQoJmNyaXN2MzJfaW9wb3J0c1tpXS5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZHVtbXlfcG9ydC5sb2NrKTsKKworCS8qIEluaXRpYWxpemUgTEVEcyAqLworI2lmIChkZWZpbmVkKENPTkZJR19FVFJBWF9OQlJfTEVEX0dSUF9PTkUpIHx8IGRlZmluZWQoQ09ORklHX0VUUkFYX05CUl9MRURfR1JQX1RXTykpCisJcmV0ICs9IGNyaXN2MzJfaW9fZ2V0X25hbWUoJmNyaXN2MzJfbGVkX25ldDBfZ3JlZW4sCisJCUNPTkZJR19FVFJBWF9MRURfR19ORVQwKTsKKwljcmlzdjMyX2lvX3NldF9kaXIoJmNyaXN2MzJfbGVkX25ldDBfZ3JlZW4sIGNyaXN2MzJfaW9fZGlyX291dCk7CisJaWYgKHN0cmNtcChDT05GSUdfRVRSQVhfTEVEX0dfTkVUMCwgQ09ORklHX0VUUkFYX0xFRF9SX05FVDApKSB7CisJCXJldCArPSBjcmlzdjMyX2lvX2dldF9uYW1lKCZjcmlzdjMyX2xlZF9uZXQwX3JlZCwKKwkJCUNPTkZJR19FVFJBWF9MRURfUl9ORVQwKTsKKwkJY3Jpc3YzMl9pb19zZXRfZGlyKCZjcmlzdjMyX2xlZF9uZXQwX3JlZCwgY3Jpc3YzMl9pb19kaXJfb3V0KTsKKwl9IGVsc2UKKwkJY3Jpc3YzMl9sZWRfbmV0MF9yZWQgPSBkdW1teV9sZWQ7CisjZW5kaWYKKworCXJldCArPSBjcmlzdjMyX2lvX2dldF9uYW1lKCZjcmlzdjMyX2xlZDJfZ3JlZW4sIENPTkZJR19FVFJBWF9WMzJfTEVEMkcpOworCXJldCArPSBjcmlzdjMyX2lvX2dldF9uYW1lKCZjcmlzdjMyX2xlZDJfcmVkLCBDT05GSUdfRVRSQVhfVjMyX0xFRDJSKTsKKwlyZXQgKz0gY3Jpc3YzMl9pb19nZXRfbmFtZSgmY3Jpc3YzMl9sZWQzX2dyZWVuLCBDT05GSUdfRVRSQVhfVjMyX0xFRDNHKTsKKwlyZXQgKz0gY3Jpc3YzMl9pb19nZXRfbmFtZSgmY3Jpc3YzMl9sZWQzX3JlZCwgQ09ORklHX0VUUkFYX1YzMl9MRUQzUik7CisKKwljcmlzdjMyX2lvX3NldF9kaXIoJmNyaXN2MzJfbGVkMl9ncmVlbiwgY3Jpc3YzMl9pb19kaXJfb3V0KTsKKwljcmlzdjMyX2lvX3NldF9kaXIoJmNyaXN2MzJfbGVkMl9yZWQsIGNyaXN2MzJfaW9fZGlyX291dCk7CisJY3Jpc3YzMl9pb19zZXRfZGlyKCZjcmlzdjMyX2xlZDNfZ3JlZW4sIGNyaXN2MzJfaW9fZGlyX291dCk7CisJY3Jpc3YzMl9pb19zZXRfZGlyKCZjcmlzdjMyX2xlZDNfcmVkLCBjcmlzdjMyX2lvX2Rpcl9vdXQpOworCisJcmV0dXJuIHJldDsKK30KKworX19pbml0Y2FsbChjcmlzdjMyX2lvX2luaXQpOworCitpbnQgY3Jpc3YzMl9pb19nZXQoc3RydWN0IGNyaXN2MzJfaW9waW4gKmlvcGluLAorCXVuc2lnbmVkIGludCBwb3J0LCB1bnNpZ25lZCBpbnQgcGluKQoreworCWlmIChwb3J0ID4gTkJSX09GX1BPUlRTKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocG9ydCA+IGNyaXN2MzJfaW9wb3J0c1twb3J0XS5waW5fY291bnQpCisJCXJldHVybiAtRUlOVkFMOworCisJaW9waW4tPmJpdCA9IDEgPDwgcGluOworCWlvcGluLT5wb3J0ID0gJmNyaXN2MzJfaW9wb3J0c1twb3J0XTsKKworCWlmIChjcmlzdjMyX3Bpbm11eF9hbGxvYyhwb3J0LCBwaW4sIHBpbiwgcGlubXV4X2dwaW8pKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCitpbnQgY3Jpc3YzMl9pb19nZXRfbmFtZShzdHJ1Y3QgY3Jpc3YzMl9pb3BpbiAqaW9waW4sIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IHBvcnQ7CisJaW50IHBpbjsKKworCWlmICh0b3VwcGVyKCpuYW1lKSA9PSAnUCcpCisJCW5hbWUrKzsKKworCWlmICh0b3VwcGVyKCpuYW1lKSA8ICdBJyB8fCB0b3VwcGVyKCpuYW1lKSA+ICdFJykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwb3J0ID0gdG91cHBlcigqbmFtZSkgLSAnQSc7CisJbmFtZSsrOworCXBpbiA9IHNpbXBsZV9zdHJ0b3VsKG5hbWUsIE5VTEwsIDEwKTsKKworCWlmIChwaW4gPCAwIHx8IHBpbiA+IGNyaXN2MzJfaW9wb3J0c1twb3J0XS5waW5fY291bnQpCisJCXJldHVybiAtRUlOVkFMOworCisJaW9waW4tPmJpdCA9IDEgPDwgcGluOworCWlvcGluLT5wb3J0ID0gJmNyaXN2MzJfaW9wb3J0c1twb3J0XTsKKworCWlmIChjcmlzdjMyX3Bpbm11eF9hbGxvYyhwb3J0LCBwaW4sIHBpbiwgcGlubXV4X2dwaW8pKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BDSQorLyogUENJIEkvTyBhY2Nlc3Mgc3R1ZmYgKi8KK3N0cnVjdCBjcmlzX2lvX29wZXJhdGlvbnMgKmNyaXNfaW9wcyA9IE5VTEw7CitFWFBPUlRfU1lNQk9MKGNyaXNfaW9wcyk7CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL21hY2gtYTMvcGlubXV4LmMgYi9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1hMy9waW5tdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTI4YzliCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21hY2gtYTMvcGlubXV4LmMKQEAgLTAsMCArMSwzODYgQEAKKy8qCisgKiBBbGxvY2F0b3IgZm9yIEkvTyBwaW5zLiBBbGwgcGlucyBhcmUgYWxsb2NhdGVkIHRvIEdQSU8gYXQgYm9vdHVwLgorICogVW5hc3NpZ25lZCBwaW5zIGFuZCBHUElPIHBpbnMgY2FuIGJlIGFsbG9jYXRlZCB0byBhIGZpeGVkIGludGVyZmFjZQorICogb3IgdGhlIEkvTyBwcm9jZXNzb3IgaW5zdGVhZC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBBeGlzIENvbW11bmljYXRpb25zIEFCLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGh3cmVncy9yZWdfbWFwLmg+CisjaW5jbHVkZSA8aHdyZWdzL3JlZ19yZHdyLmg+CisjaW5jbHVkZSA8cGlubXV4Lmg+CisjaW5jbHVkZSA8aHdyZWdzL3Bpbm11eF9kZWZzLmg+CisjaW5jbHVkZSA8aHdyZWdzL2Nsa2dlbl9kZWZzLmg+CisKKyN1bmRlZiBERUJVRworCisjZGVmaW5lIFBJTlMgODAKKyNkZWZpbmUgUE9SVF9QSU5TIDMyCisjZGVmaW5lIFBPUlRTIDMKKworc3RhdGljIGNoYXIgcGluc1tQSU5TXTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socGlubXV4X2xvY2spOworCitzdGF0aWMgdm9pZCBjcmlzdjMyX3Bpbm11eF9zZXQoaW50IHBvcnQpOworCitpbnQKK2NyaXN2MzJfcGlubXV4X2luaXQodm9pZCkKK3sKKwlzdGF0aWMgaW50IGluaXRpYWxpemVkOworCisJaWYgKCFpbml0aWFsaXplZCkgeworCQlpbml0aWFsaXplZCA9IDE7CisJCVJFR19XUl9JTlQocGlubXV4LCByZWdpX3Bpbm11eCwgcndfaHdwcm90LCAwKTsKKwkJY3Jpc3YzMl9waW5tdXhfYWxsb2MoUE9SVF9BLCAwLCAzMSwgcGlubXV4X2dwaW8pOworCQljcmlzdjMyX3Bpbm11eF9hbGxvYyhQT1JUX0IsIDAsIDMxLCBwaW5tdXhfZ3Bpbyk7CisJCWNyaXN2MzJfcGlubXV4X2FsbG9jKFBPUlRfQywgMCwgMTUsIHBpbm11eF9ncGlvKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50CitjcmlzdjMyX3Bpbm11eF9hbGxvYyhpbnQgcG9ydCwgaW50IGZpcnN0X3BpbiwgaW50IGxhc3RfcGluLCBlbnVtIHBpbl9tb2RlIG1vZGUpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWNyaXN2MzJfcGlubXV4X2luaXQoKTsKKworCWlmIChwb3J0ID49IFBPUlRTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwaW5tdXhfbG9jaywgZmxhZ3MpOworCisJZm9yIChpID0gZmlyc3RfcGluOyBpIDw9IGxhc3RfcGluOyBpKyspIHsKKwkJaWYgKChwaW5zW3BvcnQgKiBQT1JUX1BJTlMgKyBpXSAhPSBwaW5tdXhfbm9uZSkgJiYKKwkJICAgIChwaW5zW3BvcnQgKiBQT1JUX1BJTlMgKyBpXSAhPSBwaW5tdXhfZ3BpbykgJiYKKwkJICAgIChwaW5zW3BvcnQgKiBQT1JUX1BJTlMgKyBpXSAhPSBtb2RlKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGlubXV4X2xvY2ssIGZsYWdzKTsKKyNpZmRlZiBERUJVRworCQkJcGFuaWMoIlBpbm11eCBhbGxvYyBmYWlsZWQhXG4iKTsKKyNlbmRpZgorCQkJcmV0dXJuIC1FUEVSTTsKKwkJfQorCX0KKworCWZvciAoaSA9IGZpcnN0X3BpbjsgaSA8PSBsYXN0X3BpbjsgaSsrKQorCQlwaW5zW3BvcnQgKiBQT1JUX1BJTlMgKyBpXSA9IG1vZGU7CisKKwljcmlzdjMyX3Bpbm11eF9zZXQocG9ydCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaW5tdXhfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAorY3Jpc3YzMl9waW5tdXhfYWxsb2NfZml4ZWQoZW51bSBmaXhlZF9mdW5jdGlvbiBmdW5jdGlvbikKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwljaGFyIHNhdmVkW3NpemVvZiBwaW5zXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBpbm11eF9sb2NrLCBmbGFncyk7CisKKwkvKiBTYXZlIGludGVybmFsIGRhdGEgZm9yIHJlY292ZXJ5ICovCisJbWVtY3B5KHNhdmVkLCBwaW5zLCBzaXplb2YgcGlucyk7CisKKwljcmlzdjMyX3Bpbm11eF9pbml0KCk7IC8qIG11c3QgYmUgZG9uZSBiZWZvcmUgd2UgcmVhZCByd19od3Byb3QgKi8KKworCXJlZ19waW5tdXhfcndfaHdwcm90IGh3cHJvdCA9IFJFR19SRChwaW5tdXgsIHJlZ2lfcGlubXV4LCByd19od3Byb3QpOworCXJlZ19jbGtnZW5fcndfY2xrX2N0cmwgY2xrX2N0cmwgPSBSRUdfUkQoY2xrZ2VuLCByZWdpX2Nsa2dlbiwKKwkJcndfY2xrX2N0cmwpOworCisJc3dpdGNoIChmdW5jdGlvbikgeworCWNhc2UgcGlubXV4X2V0aDoKKwkJY2xrX2N0cmwuZXRoID0gcmVna19jbGtnZW5feWVzOworCQljbGtfY3RybC5kbWEwXzFfZXRoID0gcmVna19jbGtnZW5feWVzOworCQlyZXQgPSBjcmlzdjMyX3Bpbm11eF9hbGxvYyhQT1JUX0IsIDgsIDIzLCBwaW5tdXhfZml4ZWQpOworCQlyZXQgfD0gY3Jpc3YzMl9waW5tdXhfYWxsb2MoUE9SVF9CLCAyNCwgMjUsIHBpbm11eF9maXhlZCk7CisJCWh3cHJvdC5ldGggPSBod3Byb3QuZXRoX21kaW8gPSByZWdrX3Bpbm11eF95ZXM7CisJCWJyZWFrOworCWNhc2UgcGlubXV4X2dldGg6CisJCXJldCA9IGNyaXN2MzJfcGlubXV4X2FsbG9jKFBPUlRfQiwgMCwgNywgcGlubXV4X2ZpeGVkKTsKKwkJaHdwcm90LmdldGggPSByZWdrX3Bpbm11eF95ZXM7CisJCWJyZWFrOworCWNhc2UgcGlubXV4X3RnX2Ntb3M6CisJCWNsa19jdHJsLmNjZF90Z18xMDAgPSBjbGtfY3RybC5jY2RfdGdfMjAwID0gcmVna19jbGtnZW5feWVzOworCQlyZXQgPSBjcmlzdjMyX3Bpbm11eF9hbGxvYyhQT1JUX0IsIDI3LCAyOSwgcGlubXV4X2ZpeGVkKTsKKwkJaHdwcm90LnRnX2NsayA9IHJlZ2tfcGlubXV4X3llczsKKwkJYnJlYWs7CisJY2FzZSBwaW5tdXhfdGdfY2NkOgorCQljbGtfY3RybC5jY2RfdGdfMTAwID0gY2xrX2N0cmwuY2NkX3RnXzIwMCA9IHJlZ2tfY2xrZ2VuX3llczsKKwkJcmV0ID0gY3Jpc3YzMl9waW5tdXhfYWxsb2MoUE9SVF9CLCAyNywgMzEsIHBpbm11eF9maXhlZCk7CisJCXJldCB8PSBjcmlzdjMyX3Bpbm11eF9hbGxvYyhQT1JUX0MsIDAsIDE1LCBwaW5tdXhfZml4ZWQpOworCQlod3Byb3QudGcgPSBod3Byb3QudGdfY2xrID0gcmVna19waW5tdXhfeWVzOworCQlicmVhazsKKwljYXNlIHBpbm11eF92b3V0OgorCQljbGtfY3RybC5zdHJkbWEwXzJfdmlkZW8gPSByZWdrX2Nsa2dlbl95ZXM7CisJCXJldCA9IGNyaXN2MzJfcGlubXV4X2FsbG9jKFBPUlRfQSwgOCwgMTgsIHBpbm11eF9maXhlZCk7CisJCWh3cHJvdC52b3V0ID0gaHdwcm90LnZvdXRfc3luYyA9IHJlZ2tfcGlubXV4X3llczsKKwkJYnJlYWs7CisJY2FzZSBwaW5tdXhfc2VyMToKKwkJY2xrX2N0cmwuc3Nlcl9zZXJfZG1hNl83ID0gcmVna19jbGtnZW5feWVzOworCQlyZXQgPSBjcmlzdjMyX3Bpbm11eF9hbGxvYyhQT1JUX0EsIDI0LCAyNSwgcGlubXV4X2ZpeGVkKTsKKwkJaHdwcm90LnNlcjEgPSByZWdrX3Bpbm11eF95ZXM7CisJCWJyZWFrOworCWNhc2UgcGlubXV4X3NlcjI6CisJCWNsa19jdHJsLnNzZXJfc2VyX2RtYTZfNyA9IHJlZ2tfY2xrZ2VuX3llczsKKwkJcmV0ID0gY3Jpc3YzMl9waW5tdXhfYWxsb2MoUE9SVF9BLCAyNiwgMjcsIHBpbm11eF9maXhlZCk7CisJCWh3cHJvdC5zZXIyID0gcmVna19waW5tdXhfeWVzOworCQlicmVhazsKKwljYXNlIHBpbm11eF9zZXIzOgorCQljbGtfY3RybC5zc2VyX3Nlcl9kbWE2XzcgPSByZWdrX2Nsa2dlbl95ZXM7CisJCXJldCA9IGNyaXN2MzJfcGlubXV4X2FsbG9jKFBPUlRfQSwgMjgsIDI5LCBwaW5tdXhfZml4ZWQpOworCQlod3Byb3Quc2VyMyA9IHJlZ2tfcGlubXV4X3llczsKKwkJYnJlYWs7CisJY2FzZSBwaW5tdXhfc2VyNDoKKwkJY2xrX2N0cmwuc3Nlcl9zZXJfZG1hNl83ID0gcmVna19jbGtnZW5feWVzOworCQlyZXQgPSBjcmlzdjMyX3Bpbm11eF9hbGxvYyhQT1JUX0EsIDMwLCAzMSwgcGlubXV4X2ZpeGVkKTsKKwkJaHdwcm90LnNlcjQgPSByZWdrX3Bpbm11eF95ZXM7CisJCWJyZWFrOworCWNhc2UgcGlubXV4X3NzZXI6CisJCWNsa19jdHJsLnNzZXJfc2VyX2RtYTZfNyA9IHJlZ2tfY2xrZ2VuX3llczsKKwkJcmV0ID0gY3Jpc3YzMl9waW5tdXhfYWxsb2MoUE9SVF9BLCAxOSwgMjMsIHBpbm11eF9maXhlZCk7CisJCWh3cHJvdC5zc2VyID0gcmVna19waW5tdXhfeWVzOworCQlicmVhazsKKwljYXNlIHBpbm11eF9waW86CisJCWh3cHJvdC5waW8gPSByZWdrX3Bpbm11eF95ZXM7CisJCXJldCA9IDA7CisJCWJyZWFrOworCWNhc2UgcGlubXV4X3B3bTA6CisJCXJldCA9IGNyaXN2MzJfcGlubXV4X2FsbG9jKFBPUlRfQSwgMzAsIDMwLCBwaW5tdXhfZml4ZWQpOworCQlod3Byb3QucHdtMCA9IHJlZ2tfcGlubXV4X3llczsKKwkJYnJlYWs7CisJY2FzZSBwaW5tdXhfcHdtMToKKwkJcmV0ID0gY3Jpc3YzMl9waW5tdXhfYWxsb2MoUE9SVF9BLCAzMSwgMzEsIHBpbm11eF9maXhlZCk7CisJCWh3cHJvdC5wd20xID0gcmVna19waW5tdXhfeWVzOworCQlicmVhazsKKwljYXNlIHBpbm11eF9wd20yOgorCQlyZXQgPSBjcmlzdjMyX3Bpbm11eF9hbGxvYyhQT1JUX0IsIDI2LCAyNiwgcGlubXV4X2ZpeGVkKTsKKwkJaHdwcm90LnB3bTIgPSByZWdrX3Bpbm11eF95ZXM7CisJCWJyZWFrOworCWNhc2UgcGlubXV4X2kyYzA6CisJCXJldCA9IGNyaXN2MzJfcGlubXV4X2FsbG9jKFBPUlRfQSwgMCwgMSwgcGlubXV4X2ZpeGVkKTsKKwkJaHdwcm90LmkyYzAgPSByZWdrX3Bpbm11eF95ZXM7CisJCWJyZWFrOworCWNhc2UgcGlubXV4X2kyYzE6CisJCXJldCA9IGNyaXN2MzJfcGlubXV4X2FsbG9jKFBPUlRfQSwgMiwgMywgcGlubXV4X2ZpeGVkKTsKKwkJaHdwcm90LmkyYzEgPSByZWdrX3Bpbm11eF95ZXM7CisJCWJyZWFrOworCWNhc2UgcGlubXV4X2kyYzFfM3dpcmU6CisJCXJldCA9IGNyaXN2MzJfcGlubXV4X2FsbG9jKFBPUlRfQSwgMiwgMywgcGlubXV4X2ZpeGVkKTsKKwkJcmV0IHw9IGNyaXN2MzJfcGlubXV4X2FsbG9jKFBPUlRfQSwgNywgNywgcGlubXV4X2ZpeGVkKTsKKwkJaHdwcm90LmkyYzEgPSBod3Byb3QuaTJjMV9zZW4gPSByZWdrX3Bpbm11eF95ZXM7CisJCWJyZWFrOworCWNhc2UgcGlubXV4X2kyYzFfc2RhMToKKwkJcmV0ID0gY3Jpc3YzMl9waW5tdXhfYWxsb2MoUE9SVF9BLCAyLCA0LCBwaW5tdXhfZml4ZWQpOworCQlod3Byb3QuaTJjMSA9IGh3cHJvdC5pMmMxX3NkYTEgPSByZWdrX3Bpbm11eF95ZXM7CisJCWJyZWFrOworCWNhc2UgcGlubXV4X2kyYzFfc2RhMjoKKwkJcmV0ID0gY3Jpc3YzMl9waW5tdXhfYWxsb2MoUE9SVF9BLCAyLCAzLCBwaW5tdXhfZml4ZWQpOworCQlyZXQgfD0gY3Jpc3YzMl9waW5tdXhfYWxsb2MoUE9SVF9BLCA1LCA1LCBwaW5tdXhfZml4ZWQpOworCQlod3Byb3QuaTJjMSA9IGh3cHJvdC5pMmMxX3NkYTIgPSByZWdrX3Bpbm11eF95ZXM7CisJCWJyZWFrOworCWNhc2UgcGlubXV4X2kyYzFfc2RhMzoKKwkJcmV0ID0gY3Jpc3YzMl9waW5tdXhfYWxsb2MoUE9SVF9BLCAyLCAzLCBwaW5tdXhfZml4ZWQpOworCQlyZXQgfD0gY3Jpc3YzMl9waW5tdXhfYWxsb2MoUE9SVF9BLCA2LCA2LCBwaW5tdXhfZml4ZWQpOworCQlod3Byb3QuaTJjMSA9IGh3cHJvdC5pMmMxX3NkYTMgPSByZWdrX3Bpbm11eF95ZXM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCWlmICghcmV0KSB7CisJCVJFR19XUihwaW5tdXgsIHJlZ2lfcGlubXV4LCByd19od3Byb3QsIGh3cHJvdCk7CisJCVJFR19XUihjbGtnZW4sIHJlZ2lfY2xrZ2VuLCByd19jbGtfY3RybCwgY2xrX2N0cmwpOworCX0gZWxzZQorCQltZW1jcHkocGlucywgc2F2ZWQsIHNpemVvZiBwaW5zKTsKKworICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaW5tdXhfbG9jaywgZmxhZ3MpOworCisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQKK2NyaXN2MzJfcGlubXV4X3NldChpbnQgcG9ydCkKK3sKKwlpbnQgaTsKKwlpbnQgZ3Bpb192YWwgPSAwOworCWludCBpb3BfdmFsID0gMDsKKwlpbnQgcGluID0gcG9ydCAqIFBPUlRfUElOUzsKKworCWZvciAoaSA9IDA7IChpIDwgUE9SVF9QSU5TKSAmJiAocGluIDwgUElOUyk7IGkrKywgcGluKyspIHsKKwkJaWYgKHBpbnNbcGluXSA9PSBwaW5tdXhfZ3BpbykKKwkJCWdwaW9fdmFsIHw9ICgxIDw8IGkpOworCQllbHNlIGlmIChwaW5zW3Bpbl0gPT0gcGlubXV4X2lvcCkKKwkJCWlvcF92YWwgfD0gKDEgPDwgaSk7CisJfQorCisJUkVHX1dSSVRFKGludCwgcmVnaV9waW5tdXggKyBSRUdfUkRfQUREUl9waW5tdXhfcndfZ2lvX3BhICsgNCAqIHBvcnQsCisJCWdwaW9fdmFsKTsKKwlSRUdfV1JJVEUoaW50LCByZWdpX3Bpbm11eCArIFJFR19SRF9BRERSX3Bpbm11eF9yd19pb3BfcGEgKyA0ICogcG9ydCwKKwkJaW9wX3ZhbCk7CisKKyNpZmRlZiBERUJVRworICAgICAgIGNyaXN2MzJfcGlubXV4X2R1bXAoKTsKKyNlbmRpZgorfQorCitpbnQKK2NyaXN2MzJfcGlubXV4X2RlYWxsb2MoaW50IHBvcnQsIGludCBmaXJzdF9waW4sIGludCBsYXN0X3BpbikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY3Jpc3YzMl9waW5tdXhfaW5pdCgpOworCisJaWYgKHBvcnQgPiBQT1JUUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGlubXV4X2xvY2ssIGZsYWdzKTsKKworCWZvciAoaSA9IGZpcnN0X3BpbjsgaSA8PSBsYXN0X3BpbjsgaSsrKQorCQlwaW5zW3BvcnQgKiBQT1JUX1BJTlMgKyBpXSA9IHBpbm11eF9ub25lOworCisJY3Jpc3YzMl9waW5tdXhfc2V0KHBvcnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBpbm11eF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50CitjcmlzdjMyX3Bpbm11eF9kZWFsbG9jX2ZpeGVkKGVudW0gZml4ZWRfZnVuY3Rpb24gZnVuY3Rpb24pCit7CisJaW50IHJldCA9IC1FSU5WQUw7CisJY2hhciBzYXZlZFtzaXplb2YgcGluc107CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwaW5tdXhfbG9jaywgZmxhZ3MpOworCisJLyogU2F2ZSBpbnRlcm5hbCBkYXRhIGZvciByZWNvdmVyeSAqLworCW1lbWNweShzYXZlZCwgcGlucywgc2l6ZW9mIHBpbnMpOworCisJY3Jpc3YzMl9waW5tdXhfaW5pdCgpOyAvKiBtdXN0IGJlIGRvbmUgYmVmb3JlIHdlIHJlYWQgcndfaHdwcm90ICovCisKKwlyZWdfcGlubXV4X3J3X2h3cHJvdCBod3Byb3QgPSBSRUdfUkQocGlubXV4LCByZWdpX3Bpbm11eCwgcndfaHdwcm90KTsKKworCXN3aXRjaCAoZnVuY3Rpb24pIHsKKwljYXNlIHBpbm11eF9ldGg6CisJCXJldCA9IGNyaXN2MzJfcGlubXV4X2RlYWxsb2MoUE9SVF9CLCA4LCAyMyk7CisJCXJldCB8PSBjcmlzdjMyX3Bpbm11eF9kZWFsbG9jKFBPUlRfQiwgMjQsIDI1KTsKKwkJcmV0IHw9IGNyaXN2MzJfcGlubXV4X2RlYWxsb2MoUE9SVF9CLCAwLCA3KTsKKwkJaHdwcm90LmV0aCA9IGh3cHJvdC5ldGhfbWRpbyA9IGh3cHJvdC5nZXRoID0gcmVna19waW5tdXhfbm87CisJCWJyZWFrOworCWNhc2UgcGlubXV4X3RnX2Ntb3M6CisJCXJldCA9IGNyaXN2MzJfcGlubXV4X2RlYWxsb2MoUE9SVF9CLCAyNywgMjkpOworCQlod3Byb3QudGdfY2xrID0gcmVna19waW5tdXhfbm87CisJCWJyZWFrOworCWNhc2UgcGlubXV4X3RnX2NjZDoKKwkJcmV0ID0gY3Jpc3YzMl9waW5tdXhfZGVhbGxvYyhQT1JUX0IsIDI3LCAzMSk7CisJCXJldCB8PSBjcmlzdjMyX3Bpbm11eF9kZWFsbG9jKFBPUlRfQywgMCwgMTUpOworCQlod3Byb3QudGcgPSBod3Byb3QudGdfY2xrID0gcmVna19waW5tdXhfbm87CisJCWJyZWFrOworCWNhc2UgcGlubXV4X3ZvdXQ6CisJCXJldCA9IGNyaXN2MzJfcGlubXV4X2RlYWxsb2MoUE9SVF9BLCA4LCAxOCk7CisJCWh3cHJvdC52b3V0ID0gaHdwcm90LnZvdXRfc3luYyA9IHJlZ2tfcGlubXV4X25vOworCQlicmVhazsKKwljYXNlIHBpbm11eF9zZXIxOgorCQlyZXQgPSBjcmlzdjMyX3Bpbm11eF9kZWFsbG9jKFBPUlRfQSwgMjQsIDI1KTsKKwkJaHdwcm90LnNlcjEgPSByZWdrX3Bpbm11eF9ubzsKKwkJYnJlYWs7CisJY2FzZSBwaW5tdXhfc2VyMjoKKwkJcmV0ID0gY3Jpc3YzMl9waW5tdXhfZGVhbGxvYyhQT1JUX0EsIDI2LCAyNyk7CisJCWh3cHJvdC5zZXIyID0gcmVna19waW5tdXhfbm87CisJCWJyZWFrOworCWNhc2UgcGlubXV4X3NlcjM6CisJCXJldCA9IGNyaXN2MzJfcGlubXV4X2RlYWxsb2MoUE9SVF9BLCAyOCwgMjkpOworCQlod3Byb3Quc2VyMyA9IHJlZ2tfcGlubXV4X25vOworCQlicmVhazsKKwljYXNlIHBpbm11eF9zZXI0OgorCQlyZXQgPSBjcmlzdjMyX3Bpbm11eF9kZWFsbG9jKFBPUlRfQSwgMzAsIDMxKTsKKwkJaHdwcm90LnNlcjQgPSByZWdrX3Bpbm11eF9ubzsKKwkJYnJlYWs7CisJY2FzZSBwaW5tdXhfc3NlcjoKKwkJcmV0ID0gY3Jpc3YzMl9waW5tdXhfZGVhbGxvYyhQT1JUX0EsIDE5LCAyMyk7CisJCWh3cHJvdC5zc2VyID0gcmVna19waW5tdXhfbm87CisJCWJyZWFrOworCWNhc2UgcGlubXV4X3B3bTA6CisJCXJldCA9IGNyaXN2MzJfcGlubXV4X2RlYWxsb2MoUE9SVF9BLCAzMCwgMzApOworCQlod3Byb3QucHdtMCA9IHJlZ2tfcGlubXV4X25vOworCQlicmVhazsKKwljYXNlIHBpbm11eF9wd20xOgorCQlyZXQgPSBjcmlzdjMyX3Bpbm11eF9kZWFsbG9jKFBPUlRfQSwgMzEsIDMxKTsKKwkJaHdwcm90LnB3bTEgPSByZWdrX3Bpbm11eF9ubzsKKwkJYnJlYWs7CisJY2FzZSBwaW5tdXhfcHdtMjoKKwkJcmV0ID0gY3Jpc3YzMl9waW5tdXhfZGVhbGxvYyhQT1JUX0IsIDI2LCAyNik7CisJCWh3cHJvdC5wd20yID0gcmVna19waW5tdXhfbm87CisJCWJyZWFrOworCWNhc2UgcGlubXV4X2kyYzA6CisJCXJldCA9IGNyaXN2MzJfcGlubXV4X2RlYWxsb2MoUE9SVF9BLCAwLCAxKTsKKwkJaHdwcm90LmkyYzAgPSByZWdrX3Bpbm11eF9ubzsKKwkJYnJlYWs7CisJY2FzZSBwaW5tdXhfaTJjMToKKwkJcmV0ID0gY3Jpc3YzMl9waW5tdXhfZGVhbGxvYyhQT1JUX0EsIDIsIDMpOworCQlod3Byb3QuaTJjMSA9IHJlZ2tfcGlubXV4X25vOworCQlicmVhazsKKwljYXNlIHBpbm11eF9pMmMxXzN3aXJlOgorCQlyZXQgPSBjcmlzdjMyX3Bpbm11eF9kZWFsbG9jKFBPUlRfQSwgMiwgMyk7CisJCXJldCB8PSBjcmlzdjMyX3Bpbm11eF9kZWFsbG9jKFBPUlRfQSwgNywgNyk7CisJCWh3cHJvdC5pMmMxID0gaHdwcm90LmkyYzFfc2VuID0gcmVna19waW5tdXhfbm87CisJCWJyZWFrOworCWNhc2UgcGlubXV4X2kyYzFfc2RhMToKKwkJcmV0ID0gY3Jpc3YzMl9waW5tdXhfZGVhbGxvYyhQT1JUX0EsIDIsIDQpOworCQlod3Byb3QuaTJjMV9zZGExID0gcmVna19waW5tdXhfbm87CisJCWJyZWFrOworCWNhc2UgcGlubXV4X2kyYzFfc2RhMjoKKwkJcmV0ID0gY3Jpc3YzMl9waW5tdXhfZGVhbGxvYyhQT1JUX0EsIDIsIDMpOworCQlyZXQgfD0gY3Jpc3YzMl9waW5tdXhfZGVhbGxvYyhQT1JUX0EsIDUsIDUpOworCQlod3Byb3QuaTJjMV9zZGEyID0gcmVna19waW5tdXhfbm87CisJCWJyZWFrOworCWNhc2UgcGlubXV4X2kyYzFfc2RhMzoKKwkJcmV0ID0gY3Jpc3YzMl9waW5tdXhfZGVhbGxvYyhQT1JUX0EsIDIsIDMpOworCQlyZXQgfD0gY3Jpc3YzMl9waW5tdXhfZGVhbGxvYyhQT1JUX0EsIDYsIDYpOworCQlod3Byb3QuaTJjMV9zZGEzID0gcmVna19waW5tdXhfbm87CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCWlmICghcmV0KQorCQlSRUdfV1IocGlubXV4LCByZWdpX3Bpbm11eCwgcndfaHdwcm90LCBod3Byb3QpOworCWVsc2UKKwkJbWVtY3B5KHBpbnMsIHNhdmVkLCBzaXplb2YgcGlucyk7CisKKyAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGlubXV4X2xvY2ssIGZsYWdzKTsKKworICByZXR1cm4gcmV0OworfQorCit2b2lkCitjcmlzdjMyX3Bpbm11eF9kdW1wKHZvaWQpCit7CisJaW50IGksIGo7CisJaW50IHBpbiA9IDA7CisKKwljcmlzdjMyX3Bpbm11eF9pbml0KCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUE9SVFM7IGkrKykgeworCQlwaW4rKzsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlBvcnQgJWNcbiIsICdBJytpKTsKKwkJZm9yIChqID0gMDsgKGogPCBQT1JUX1BJTlMpICYmIChwaW4gPCBQSU5TKTsgaisrLCBwaW4rKykKKwkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJIiAgUGluICVkID0gJWRcbiIsIGosIHBpbnNbaSAqIFBPUlRfUElOUyArIGpdKTsKKwl9Cit9CisKK19faW5pdGNhbGwoY3Jpc3YzMl9waW5tdXhfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1hMy92Y3NfaG9vay5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21hY2gtYTMvdmNzX2hvb2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGIxYTU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21hY2gtYTMvdmNzX2hvb2suYwpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIFNpbXVsYXRvciBob29rIG1lY2hhbmlzbQorICovCisKKyNpbmNsdWRlICJ2Y3NfaG9vay5oIgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjZGVmaW5lIEhPT0tfVFJJR19BRERSICAgICAgMHhiNzAwMDAwMAorI2RlZmluZSBIT09LX01FTV9CQVNFX0FERFIgIDB4Y2UwMDAwMDAKKworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkICpob29rX2Jhc2U7CisKKyNkZWZpbmUgSE9PS19EQVRBKG9mZnNldCkgaG9va19iYXNlW29mZnNldF0KKyNkZWZpbmUgVkhPT0tfREFUQShvZmZzZXQpIGhvb2tfYmFzZVtvZmZzZXRdCisjZGVmaW5lIEhPT0tfVFJJRyhmdW5jaWQpIFwKKwlkbyB7IFwKKwkJKigodW5zaWduZWQgKikgSE9PS19UUklHX0FERFIpID0gZnVuY2lkOyBcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSE9PS19EQVRBX0JZVEUob2Zmc2V0KSAoKHVuc2lnbmVkIGNoYXIgKilob29rX2Jhc2UpW29mZnNldF0KKworc3RhdGljIHZvaWQgaG9va19pbml0KHZvaWQpCit7CisJc3RhdGljIGludCBmaXJzdCA9IDE7CisJaWYgKGZpcnN0KSB7CisJCWZpcnN0ID0gMDsKKwkJaG9va19iYXNlID0gaW9yZW1hcChIT09LX01FTV9CQVNFX0FERFIsIDgxOTIpOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGhvb2tfdHJpZyh1bnNpZ25lZCBpZCkKK3sKKwl1bnNpZ25lZCByZXQ7CisKKwkvKiBwcmVlbXB0X2Rpc2FibGUoKTsgKi8KKworCS8qIER1bW15IHJlYWQgZnJvbSBtZW0gdG8gbWFrZSBzdXJlIGRhdGEgaGFzIHByb3BhZ2F0ZWQgdG8gbWVtb3J5CisJICogYmVmb3JlIHRyaWdnaW5nICovCisJcmV0ID0gKmhvb2tfYmFzZTsKKworCS8qIHRyaWdnZXIgaG9vayAqLworCUhPT0tfVFJJRyhpZCk7CisKKwkvKiB3YWl0IGZvciBjYWxsIHRvIGZpbmlzaCAqLworCXdoaWxlIChWSE9PS19EQVRBKDApID4gMCkgOworCisJLyogZXh0cmFjdCByZXR1cm4gdmFsdWUgKi8KKworCXJldCA9IFZIT09LX0RBVEEoMSk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaG9va19jYWxsKHVuc2lnbmVkIGlkLCB1bnNpZ25lZCBwY250LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwlpbnQgaTsKKwl1bnNpZ25lZCByZXQ7CisKKwlob29rX2luaXQoKTsKKworCUhPT0tfREFUQSgwKSA9IGlkOworCisJdmFfc3RhcnQoYXAsIHBjbnQpOworCWZvciAoaSA9IDE7IGkgPD0gcGNudDsgaSsrKQorCQlIT09LX0RBVEEoaSkgPSB2YV9hcmcoYXAsIHVuc2lnbmVkKTsKKwl2YV9lbmQoYXApOworCisJcmV0ID0gaG9va190cmlnKGlkKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBob29rX2NhbGxfc3RyKHVuc2lnbmVkIGlkLCB1bnNpZ25lZCBzaXplLCBjb25zdCBjaGFyICpzdHIpCit7CisJaW50IGk7CisJdW5zaWduZWQgcmV0OworCisJaG9va19pbml0KCk7CisKKwlIT09LX0RBVEEoMCkgPSBpZDsKKwlIT09LX0RBVEEoMSkgPSBzaXplOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJSE9PS19EQVRBX0JZVEUoOCArIGkpID0gc3RyW2ldOworCUhPT0tfREFUQV9CWVRFKDggKyBpKSA9IDA7CisKKwlyZXQgPSBob29rX3RyaWcoaWQpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBwcmludF9zdHIoY29uc3QgY2hhciAqc3RyKQoreworCWludCBpOworCS8qIGZpbmQgbnVsbCBhdCBlbmQgb2Ygc3RyaW5nICovCisJZm9yIChpID0gMTsgc3RyW2ldOyBpKyspIDsKKwlob29rX2NhbGwoaG9va19wcmludF9zdHIsIGksIHN0cik7Cit9CisKK3ZvaWQgQ1BVX1dBVENIRE9HX1RJTUVPVVQodW5zaWduZWQgdCkKK3sKK30KZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL3Zjc19ob29rLmggYi9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1hMy92Y3NfaG9vay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNzNkMGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1hMy92Y3NfaG9vay5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBTaW11bGF0b3IgaG9vayBjYWxsIG1lY2hhbmlzbQorICovCisKKyNpZm5kZWYgX19ob29rX2hfXworI2RlZmluZSBfX2hvb2tfaF9fCisKK2ludCBob29rX2NhbGwodW5zaWduZWQgaWQsIHVuc2lnbmVkIHBjbnQsIC4uLik7CitpbnQgaG9va19jYWxsX3N0cih1bnNpZ25lZCBpZCwgdW5zaWduZWQgc2l6ZSwgY29uc3QgY2hhciAqc3RyKTsKKworZW51bSBob29rX2lkcyB7CisgIGhvb2tfZGVidWdfb24gPSAxLAorICBob29rX2RlYnVnX29mZiwKKyAgaG9va19zdG9wX3NpbV9vaywKKyAgaG9va19zdG9wX3NpbV9mYWlsLAorICBob29rX2FsbG9jX3NoYXJlZCwKKyAgaG9va19wdHJfc2hhcmVkLAorICBob29rX2ZyZWVfc2hhcmVkLAorICBob29rX2ZpbGUyc2hhcmVkLAorICBob29rX2NtcF9zaGFyZWQsCisgIGhvb2tfcHJpbnRfcGFyYW1zLAorICBob29rX3NpbV90aW1lLAorICBob29rX3N0b3Bfc2ltLAorICBob29rX2tpY2tfZG9nLAorICBob29rX2RvZ190aW1lb3V0LAorICBob29rX3JhbmQsCisgIGhvb2tfc3JhbmQsCisgIGhvb2tfcmFuZF9yYW5nZSwKKyAgaG9va19wcmludF9zdHIsCisgIGhvb2tfcHJpbnRfaGV4LAorICBob29rX2NtcF9vZmZzZXRfc2hhcmVkLAorICBob29rX2ZpbGxfcmFuZG9tX3NoYXJlZCwKKyAgaG9va19hbGxvY19yYW5kb21fZGF0YSwKKyAgaG9va19jYWxsb2NfcmFuZG9tX2RhdGEsCisgIGhvb2tfcHJpbnRfaW50LAorICBob29rX3ByaW50X3VpbnQsCisgIGhvb2tfZnB1dGMsCisgIGhvb2tfaW5pdF9mZCwKKyAgaG9va19zYnJrLAorICBob29rX3ByaW50X2NvbnRleHRfZGVzY3IsCisgIGhvb2tfcHJpbnRfZGF0YV9kZXNjciwKKyAgaG9va19wcmludF9ncm91cF9kZXNjciwKKyAgaG9va19maWxsX3NoYXJlZCwKKyAgaG9va19zbF9zcmFuZCwKKyAgaG9va19zbF9yYW5kX2lyYW5nZSwKKyAgaG9va19zbF9yYW5kX3VyYW5nZSwKKyAgaG9va19zbF9zaF9tYWxsb2NfYWxpZ25lZCwKKyAgaG9va19zbF9zaF9jYWxsb2NfYWxpZ25lZCwKKyAgaG9va19zbF9zaF9hbGxvY19yYW5kb21fZGF0YSwKKyAgaG9va19zbF9zaF9maWxlMm1lbSwKKyAgaG9va19zbF92ZXJhX21ib3hfaGFuZGxlLAorICBob29rX3NsX3ZlcmFfbWJveF9wdXQsCisgIGhvb2tfc2xfdmVyYV9tYm94X2dldCwKKyAgaG9va19zbF9zeXN0ZW0sCisgIGhvb2tfc2xfc2hfaGV4ZHVtcAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1mcy9LY29uZmlnIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21hY2gtZnMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQ3NDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21hY2gtZnMvS2NvbmZpZwpAQCAtMCwwICsxLDIxNiBAQAoraWYgRVRSQVhGUworCittZW51ICJFVFJBWCBGUyBvcHRpb25zIgorICAgICAgIGRlcGVuZHMgb24gRVRSQVhGUworCitjb25maWcgRVRSQVhfRFJBTV9WSVJUVUFMX0JBU0UKKwloZXgKKwlkZXBlbmRzIG9uIEVUUkFYX0FSQ0hfVjMyCisJZGVmYXVsdCAiYzAwMDAwMDAiCisKK2NvbmZpZyBFVFJBWF9TRVJJQUxfUE9SVFMKKyAgICAgICBpbnQKKyAgICAgICBkZWZhdWx0IDQKKworY29uZmlnIEVUUkFYX01FTV9HUlAxX0NPTkZJRworCWhleCAiTUVNX0dSUDFfQ09ORklHIgorCWRlcGVuZHMgb24gRVRSQVhfQVJDSF9WMzIKKwlkZWZhdWx0ICI0MDQ0YSIKKwloZWxwCisJICBXYWl0c3RhdGVzIGZvciBmbGFzaC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgc3VpdGFibGUgZm9yIHRoZQorCSAgc3RhbmRhcmQgZmxhc2hlcyB1c2VkIGluIGF4aXMgcHJvZHVjdHMgKDEyMCBucykuCisKK2NvbmZpZyBFVFJBWF9NRU1fR1JQMl9DT05GSUcKKwloZXggIk1FTV9HUlAyX0NPTkZJRyIKKwlkZXBlbmRzIG9uIEVUUkFYX0FSQ0hfVjMyCisJZGVmYXVsdCAiMCIKKwloZWxwCisJICBXYWl0c3RhdGVzIGZvciBTUkFNLiAwIGlzIGEgZ29vZCBjaG9pY2UgZm9yIG1vc3QgQXhpcyBwcm9kdWN0cy4KKworY29uZmlnIEVUUkFYX01FTV9HUlAzX0NPTkZJRworCWhleCAiTUVNX0dSUDNfQ09ORklHIgorCWRlcGVuZHMgb24gRVRSQVhfQVJDSF9WMzIKKwlkZWZhdWx0ICIwIgorCWhlbHAKKwkgIFdhaXRzdGF0ZXMgZm9yIENTUDAtMy4gMCBpcyBhIGdvb2QgY2hvaWNlIGZvciBtb3N0IEF4aXMgcHJvZHVjdHMuCisJICBJdCBtYXkgbmVlZCB0byBiZSBjaGFuZ2VkIGlmIGV4dGVybmFsIGRldmljZXMgc3VjaCBhcyBleHRyYQorCSAgcmVnaXN0ZXItbWFwcGVkIExFRHMgYXJlIHVzZWQuCisKK2NvbmZpZyBFVFJBWF9NRU1fR1JQNF9DT05GSUcKKwloZXggIk1FTV9HUlA0X0NPTkZJRyIKKwlkZXBlbmRzIG9uIEVUUkFYX0FSQ0hfVjMyCisJZGVmYXVsdCAiMCIKKwloZWxwCisJICBXYWl0c3RhdGVzIGZvciBDU1A0LTYuIDAgaXMgYSBnb29kIGNob2ljZSBmb3IgbW9zdCBBeGlzIHByb2R1Y3RzLgorCitjb25maWcgRVRSQVhfU0RSQU1fR1JQMF9DT05GSUcKKwloZXggIlNEUkFNX0dSUDBfQ09ORklHIgorCWRlcGVuZHMgb24gRVRSQVhfQVJDSF9WMzIKKwlkZWZhdWx0ICIzMzYiCisJaGVscAorCSAgU0RSQU0gY29uZmlndXJhdGlvbiBmb3IgZ3JvdXAgMC4gVGhlIHZhbHVlIGRlcGVuZHMgb24gdGhlCisJICBoYXJkd2FyZSBjb25maWd1cmF0aW9uLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBzdWl0YWJsZQorCSAgZm9yIDMyIE1CIG9yZ2FuaXplZCBhcyB0d28gMTYgYml0cyBjaGlwcyAoZS5nLiBBeGlzCisJICBwYXJ0IG51bWJlciAxODU1MCkgY29ubmVjdGVkIGFzIG9uZSAzMiBiaXQgZGV2aWNlIChpLmUuIGluCisJICB0aGUgc2FtZSBncm91cCkuCisKK2NvbmZpZyBFVFJBWF9TRFJBTV9HUlAxX0NPTkZJRworCWhleCAiU0RSQU1fR1JQMV9DT05GSUciCisJZGVwZW5kcyBvbiBFVFJBWF9BUkNIX1YzMgorCWRlZmF1bHQgIjAiCisJaGVscAorCSAgU0RSQU0gY29uZmlndXJhdGlvbiBmb3IgZ3JvdXAgMS4gVGhlIGRlZnVsdCB2YWx1ZSBpcyAwCisJICBiZWNhdXNlIGdyb3VwIDEgaXMgbm90IHVzZWQgaW4gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiwKKwkgIGRlc2NyaWJlZCBpbiB0aGUgaGVscCBmb3IgU0RSQU1fR1JQMF9DT05GSUcuCisKK2NvbmZpZyBFVFJBWF9TRFJBTV9USU1JTkcKKwloZXggIlNEUkFNX1RJTUlORyIKKwlkZXBlbmRzIG9uIEVUUkFYX0FSQ0hfVjMyCisJZGVmYXVsdCAiMTA0YSIKKwloZWxwCisJICBTRFJBTSB0aW1pbmcgcGFyYW1ldGVycy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgb2sgZm9yCisJICBtb3N0IGhhcmR3YXJlcyBidXQgbGFyZ2UgU0RSQU1zIG1heSByZXF1aXJlIGEgZmFzdGVyCisJICByZWZyZXNoIChhLmsuYSA4SyByZWZyZXNoKS4gVGhlIGRlZmF1bHQgdmFsdWUgaW1wbGllcworCSAgMTAwTUh6IGNsb2NrIGFuZCBTRFIgbW9kZS4KKworY29uZmlnIEVUUkFYX1NEUkFNX0NPTU1BTkQKKwloZXggIlNEUkFNX0NPTU1BTkQiCisJZGVwZW5kcyBvbiBFVFJBWF9BUkNIX1YzMgorCWRlZmF1bHQgIjAiCisJaGVscAorCSAgU0RSQU0gY29tbWFuZC4gU2hvdWxkIGJlIDAgdW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0CisJICB5b3UgYXJlIGRvaW5nIChtYXkgYmUgIT0gMCBmb3IgdW51c3VhbCBhZGRyZXNzIGxpbmUKKwkgIG1hcHBpbmdzIHN1Y2ggYXMgaW4gYSBNQ00pLi4KKworY29uZmlnIEVUUkFYX0RFRl9HSU9fUEFfT0UKKwloZXggIkdJT19QQV9PRSIKKwlkZXBlbmRzIG9uIEVUUkFYX0FSQ0hfVjMyCisJZGVmYXVsdCAiMWMiCisJaGVscAorCSAgQ29uZmlndXJlcyB0aGUgZGlyZWN0aW9uIG9mIGdlbmVyYWwgcG9ydCBBIGJpdHMuICAxIGlzIG91dCwgMCBpcyBpbi4KKwkgIFRoaXMgaXMgb2Z0ZW4gdG90YWxseSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHRoZSBwcm9kdWN0IHVzZWQuCisJICBUaGVyZSBhcmUgc29tZSBndWlkZWxpbmVzIHRob3VnaCAtIGlmIHlvdSBrbm93IHRoYXQgb25seSBMRUQncyBhcmUKKwkgIGNvbm5lY3RlZCB0byBwb3J0IFBBLCB0aGVuIHRoZXkgYXJlIHVzdWFsbHkgY29ubmVjdGVkIHRvIGJpdHMgMi00CisJICBhbmQgeW91IGNhbiB0aGVyZWZvcmUgdXNlIDFjLiAgT24gb3RoZXIgYm9hcmRzIHdoaWNoIGRvbid0IGhhdmUgdGhlCisJICBMRUQncyBhdCB0aGUgZ2VuZXJhbCBwb3J0cywgdGhlc2UgYml0cyBhcmUgdXNlZCBmb3IgYWxsIGtpbmRzIG9mCisJICBzdHVmZi4gIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdG8gdXNlLCBpdCBpcyBhbHdheXMgc2FmZSB0byBwdXQgYWxsCisJICBhcyBpbnB1dHMsIGFsdGhvdWdoIGZsb2F0aW5nIGlucHV0cyBpc24ndCBnb29kLgorCitjb25maWcgRVRSQVhfREVGX0dJT19QQV9PVVQKKwloZXggIkdJT19QQV9PVVQiCisJZGVwZW5kcyBvbiBFVFJBWF9BUkNIX1YzMgorCWRlZmF1bHQgIjAwIgorCWhlbHAKKwkgIENvbmZpZ3VyZXMgdGhlIGluaXRpYWwgZGF0YSBmb3IgdGhlIGdlbmVyYWwgcG9ydCBBIGJpdHMuICBNb3N0CisJICBwcm9kdWN0cyBzaG91bGQgdXNlIDAwIGhlcmUuCisKK2NvbmZpZyBFVFJBWF9ERUZfR0lPX1BCX09FCisJaGV4ICJHSU9fUEJfT0UiCisJZGVwZW5kcyBvbiBFVFJBWF9BUkNIX1YzMgorCWRlZmF1bHQgIjAwMDAwIgorCWhlbHAKKwkgIENvbmZpZ3VyZXMgdGhlIGRpcmVjdGlvbiBvZiBnZW5lcmFsIHBvcnQgQiBiaXRzLiAgMSBpcyBvdXQsIDAgaXMgaW4uCisJICBUaGlzIGlzIG9mdGVuIHRvdGFsbHkgZGlmZmVyZW50IGRlcGVuZGluZyBvbiB0aGUgcHJvZHVjdCB1c2VkLgorCSAgVGhlcmUgYXJlIHNvbWUgZ3VpZGVsaW5lcyB0aG91Z2ggLSBpZiB5b3Uga25vdyB0aGF0IG9ubHkgTEVEJ3MgYXJlCisJICBjb25uZWN0ZWQgdG8gcG9ydCBQQSwgdGhlbiB0aGV5IGFyZSB1c3VhbGx5IGNvbm5lY3RlZCB0byBiaXRzIDItNAorCSAgYW5kIHlvdSBjYW4gdGhlcmVmb3JlIHVzZSAxYy4gIE9uIG90aGVyIGJvYXJkcyB3aGljaCBkb24ndCBoYXZlIHRoZQorCSAgTEVEJ3MgYXQgdGhlIGdlbmVyYWwgcG9ydHMsIHRoZXNlIGJpdHMgYXJlIHVzZWQgZm9yIGFsbCBraW5kcyBvZgorCSAgc3R1ZmYuICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIHVzZSwgaXQgaXMgYWx3YXlzIHNhZmUgdG8gcHV0IGFsbAorCSAgYXMgaW5wdXRzLCBhbHRob3VnaCBmbG9hdGluZyBpbnB1dHMgaXNuJ3QgZ29vZC4KKworY29uZmlnIEVUUkFYX0RFRl9HSU9fUEJfT1VUCisJaGV4ICJHSU9fUEJfT1VUIgorCWRlcGVuZHMgb24gRVRSQVhfQVJDSF9WMzIKKwlkZWZhdWx0ICIwMDAwMCIKKwloZWxwCisJICBDb25maWd1cmVzIHRoZSBpbml0aWFsIGRhdGEgZm9yIHRoZSBnZW5lcmFsIHBvcnQgQiBiaXRzLiAgTW9zdAorCSAgcHJvZHVjdHMgc2hvdWxkIHVzZSAwMDAwMCBoZXJlLgorCitjb25maWcgRVRSQVhfREVGX0dJT19QQ19PRQorCWhleCAiR0lPX1BDX09FIgorCWRlcGVuZHMgb24gRVRSQVhfQVJDSF9WMzIKKwlkZWZhdWx0ICIwMDAwMCIKKwloZWxwCisJICBDb25maWd1cmVzIHRoZSBkaXJlY3Rpb24gb2YgZ2VuZXJhbCBwb3J0IEMgYml0cy4gIDEgaXMgb3V0LCAwIGlzIGluLgorCSAgVGhpcyBpcyBvZnRlbiB0b3RhbGx5IGRpZmZlcmVudCBkZXBlbmRpbmcgb24gdGhlIHByb2R1Y3QgdXNlZC4KKwkgIFRoZXJlIGFyZSBzb21lIGd1aWRlbGluZXMgdGhvdWdoIC0gaWYgeW91IGtub3cgdGhhdCBvbmx5IExFRCdzIGFyZQorCSAgY29ubmVjdGVkIHRvIHBvcnQgUEEsIHRoZW4gdGhleSBhcmUgdXN1YWxseSBjb25uZWN0ZWQgdG8gYml0cyAyLTQKKwkgIGFuZCB5b3UgY2FuIHRoZXJlZm9yZSB1c2UgMWMuICBPbiBvdGhlciBib2FyZHMgd2hpY2ggZG9uJ3QgaGF2ZSB0aGUKKwkgIExFRCdzIGF0IHRoZSBnZW5lcmFsIHBvcnRzLCB0aGVzZSBiaXRzIGFyZSB1c2VkIGZvciBhbGwga2luZHMgb2YKKwkgIHN0dWZmLiAgSWYgeW91IGRvbid0IGtub3cgd2hhdCB0byB1c2UsIGl0IGlzIGFsd2F5cyBzYWZlIHRvIHB1dCBhbGwKKwkgIGFzIGlucHV0cywgYWx0aG91Z2ggZmxvYXRpbmcgaW5wdXRzIGlzbid0IGdvb2QuCisKK2NvbmZpZyBFVFJBWF9ERUZfR0lPX1BDX09VVAorCWhleCAiR0lPX1BDX09VVCIKKwlkZXBlbmRzIG9uIEVUUkFYX0FSQ0hfVjMyCisJZGVmYXVsdCAiMDAwMDAiCisJaGVscAorCSAgQ29uZmlndXJlcyB0aGUgaW5pdGlhbCBkYXRhIGZvciB0aGUgZ2VuZXJhbCBwb3J0IEMgYml0cy4gIE1vc3QKKwkgIHByb2R1Y3RzIHNob3VsZCB1c2UgMDAwMDAgaGVyZS4KKworY29uZmlnIEVUUkFYX0RFRl9HSU9fUERfT0UKKwloZXggIkdJT19QRF9PRSIKKwlkZXBlbmRzIG9uIEVUUkFYX0FSQ0hfVjMyCisJZGVmYXVsdCAiMDAwMDAiCisJaGVscAorCSAgQ29uZmlndXJlcyB0aGUgZGlyZWN0aW9uIG9mIGdlbmVyYWwgcG9ydCBEIGJpdHMuICAxIGlzIG91dCwgMCBpcyBpbi4KKwkgIFRoaXMgaXMgb2Z0ZW4gdG90YWxseSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHRoZSBwcm9kdWN0IHVzZWQuCisJICBUaGVyZSBhcmUgc29tZSBndWlkZWxpbmVzIHRob3VnaCAtIGlmIHlvdSBrbm93IHRoYXQgb25seSBMRUQncyBhcmUKKwkgIGNvbm5lY3RlZCB0byBwb3J0IFBBLCB0aGVuIHRoZXkgYXJlIHVzdWFsbHkgY29ubmVjdGVkIHRvIGJpdHMgMi00CisJICBhbmQgeW91IGNhbiB0aGVyZWZvcmUgdXNlIDFjLiAgT24gb3RoZXIgYm9hcmRzIHdoaWNoIGRvbid0IGhhdmUgdGhlCisJICBMRUQncyBhdCB0aGUgZ2VuZXJhbCBwb3J0cywgdGhlc2UgYml0cyBhcmUgdXNlZCBmb3IgYWxsIGtpbmRzIG9mCisJICBzdHVmZi4gIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdG8gdXNlLCBpdCBpcyBhbHdheXMgc2FmZSB0byBwdXQgYWxsCisJICBhcyBpbnB1dHMsIGFsdGhvdWdoIGZsb2F0aW5nIGlucHV0cyBpc24ndCBnb29kLgorCitjb25maWcgRVRSQVhfREVGX0dJT19QRF9PVVQKKwloZXggIkdJT19QRF9PVVQiCisJZGVwZW5kcyBvbiBFVFJBWF9BUkNIX1YzMgorCWRlZmF1bHQgIjAwMDAwIgorCWhlbHAKKwkgIENvbmZpZ3VyZXMgdGhlIGluaXRpYWwgZGF0YSBmb3IgdGhlIGdlbmVyYWwgcG9ydCBEIGJpdHMuICBNb3N0CisJICBwcm9kdWN0cyBzaG91bGQgdXNlIDAwMDAwIGhlcmUuCisKK2NvbmZpZyBFVFJBWF9ERUZfR0lPX1BFX09FCisJaGV4ICJHSU9fUEVfT0UiCisJZGVwZW5kcyBvbiBFVFJBWF9BUkNIX1YzMgorCWRlZmF1bHQgIjAwMDAwIgorCWhlbHAKKwkgIENvbmZpZ3VyZXMgdGhlIGRpcmVjdGlvbiBvZiBnZW5lcmFsIHBvcnQgRSBiaXRzLiAgMSBpcyBvdXQsIDAgaXMgaW4uCisJICBUaGlzIGlzIG9mdGVuIHRvdGFsbHkgZGlmZmVyZW50IGRlcGVuZGluZyBvbiB0aGUgcHJvZHVjdCB1c2VkLgorCSAgVGhlcmUgYXJlIHNvbWUgZ3VpZGVsaW5lcyB0aG91Z2ggLSBpZiB5b3Uga25vdyB0aGF0IG9ubHkgTEVEJ3MgYXJlCisJICBjb25uZWN0ZWQgdG8gcG9ydCBQQSwgdGhlbiB0aGV5IGFyZSB1c3VhbGx5IGNvbm5lY3RlZCB0byBiaXRzIDItNAorCSAgYW5kIHlvdSBjYW4gdGhlcmVmb3JlIHVzZSAxYy4gIE9uIG90aGVyIGJvYXJkcyB3aGljaCBkb24ndCBoYXZlIHRoZQorCSAgTEVEJ3MgYXQgdGhlIGdlbmVyYWwgcG9ydHMsIHRoZXNlIGJpdHMgYXJlIHVzZWQgZm9yIGFsbCBraW5kcyBvZgorCSAgc3R1ZmYuICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIHVzZSwgaXQgaXMgYWx3YXlzIHNhZmUgdG8gcHV0IGFsbAorCSAgYXMgaW5wdXRzLCBhbHRob3VnaCBmbG9hdGluZyBpbnB1dHMgaXNuJ3QgZ29vZC4KKworY29uZmlnIEVUUkFYX0RFRl9HSU9fUEVfT1VUCisJaGV4ICJHSU9fUEVfT1VUIgorCWRlcGVuZHMgb24gRVRSQVhfQVJDSF9WMzIKKwlkZWZhdWx0ICIwMDAwMCIKKwloZWxwCisJICBDb25maWd1cmVzIHRoZSBpbml0aWFsIGRhdGEgZm9yIHRoZSBnZW5lcmFsIHBvcnQgRSBiaXRzLiAgTW9zdAorCSAgcHJvZHVjdHMgc2hvdWxkIHVzZSAwMDAwMCBoZXJlLgorCitjb25maWcgRVRSQVhfREVGX0dJT19QVl9PRQorCWhleCAiR0lPX1BWX09FIgorCWRlcGVuZHMgb24gRVRSQVhfVklSVFVBTF9HUElPCisJZGVmYXVsdCAiMDAwMCIKKwloZWxwCisJICBDb25maWd1cmVzIHRoZSBkaXJlY3Rpb24gb2YgdmlydHVhbCBnZW5lcmFsIHBvcnQgViBiaXRzLiAxIGlzIG91dCwKKwkgIDAgaXMgaW4uIFRoaXMgaXMgb2Z0ZW4gdG90YWxseSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHRoZSBwcm9kdWN0CisJICB1c2VkLiBUaGVzZSBiaXRzIGFyZSB1c2VkIGZvciBhbGwga2luZHMgb2Ygc3R1ZmYuIElmIHlvdSBkb24ndCBrbm93CisJICB3aGF0IHRvIHVzZSwgaXQgaXMgYWx3YXlzIHNhZmUgdG8gcHV0IGFsbCBhcyBpbnB1dHMsIGFsdGhvdWdoCisJICBmbG9hdGluZyBpbnB1dHMgaXNuJ3QgZ29vZC4KKworY29uZmlnIEVUUkFYX0RFRl9HSU9fUFZfT1VUCisJaGV4ICJHSU9fUFZfT1VUIgorCWRlcGVuZHMgb24gRVRSQVhfVklSVFVBTF9HUElPCisJZGVmYXVsdCAiMDAwMCIKKwloZWxwCisJICBDb25maWd1cmVzIHRoZSBpbml0aWFsIGRhdGEgZm9yIHRoZSB2aXJ0dWFsIGdlbmVyYWwgcG9ydCBWIGJpdHMuCisJICBNb3N0IHByb2R1Y3RzIHNob3VsZCB1c2UgMDAwMCBoZXJlLgorCitlbmRtZW51CisKK2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1mcy9NYWtlZmlsZSBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZjQwN2EKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1mcy9NYWtlZmlsZQpAQCAtMCwwICsxLDExIEBACisjICRJZDogTWFrZWZpbGUsdiAxLjMgMjAwNy8wMy8xMyAxMTo1Nzo0NiBzdGFydmlrIEV4cCAkCisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXgga2VybmVsLgorIworCitvYmoteSAgIDo9IGRtYS5vIHBpbm11eC5vIGlvLm8gYXJiaXRlci5vCitiai0kKENPTkZJR19FVFJBWF9WQ1NfU0lNKSArPSB2Y3NfaG9vay5vCitvYmotJChDT05GSUdfQ1BVX0ZSRVEpICAgKz0gY3B1ZnJlcS5vCisKK2NsZWFuOgorCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1mcy9hcmJpdGVyLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1mcy9hcmJpdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRkMzFiZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2FyYml0ZXIuYwpAQCAtMCwwICsxLDQwNCBAQAorLyoKKyAqIE1lbW9yeSBhcmJpdGVyIGZ1bmN0aW9ucy4gQWxsb2NhdGVzIGJhbmR3aWR0aCB0aHJvdWdoIHRoZQorICogYXJiaXRlciBhbmQgc2V0cyB1cCBhcmJpdGVyIGJyZWFrcG9pbnRzLgorICoKKyAqIFRoZSBhbGdvcml0aG0gZmlyc3QgYXNzaWducyBzbG90cyB0byB0aGUgY2xpZW50cyB0aGF0IGhhcyBzcGVjaWZpZWQKKyAqIGJhbmR3aWR0aCAoZS5nLiBldGhlcm5ldCkgYW5kIHRoZW4gdGhlIHJlbWFpbmluZyBzbG90cyBhcmUgZGl2aWRlZAorICogb24gYWxsIHRoZSBhY3RpdmUgY2xpZW50cy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNyBBeGlzIENvbW11bmljYXRpb25zIEFCLgorICovCisKKyNpbmNsdWRlIDxod3JlZ3MvcmVnX21hcC5oPgorI2luY2x1ZGUgPGh3cmVncy9yZWdfcmR3ci5oPgorI2luY2x1ZGUgPGh3cmVncy9tYXJiX2RlZnMuaD4KKyNpbmNsdWRlIDxhcmJpdGVyLmg+CisjaW5jbHVkZSA8aHdyZWdzL2ludHJfdmVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxX3JlZ3MuaD4KKworc3RydWN0IGNyaXN2MzJfd2F0Y2hfZW50cnkgeworCXVuc2lnbmVkIGxvbmcgaW5zdGFuY2U7CisJd2F0Y2hfY2FsbGJhY2sgKmNiOworCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBlbmQ7CisJaW50IHVzZWQ7Cit9OworCisjZGVmaW5lIE5VTUJFUl9PRl9CUCA0CisjZGVmaW5lIE5CUl9PRl9DTElFTlRTIDE0CisjZGVmaW5lIE5CUl9PRl9TTE9UUyA2NAorI2RlZmluZSBTRFJBTV9CQU5EV0lEVEggMTAwMDAwMDAwCS8qIFNvbWUga2luZCBvZiBleHBlY3RlZCB2YWx1ZSAqLworI2RlZmluZSBJTlRNRU1fQkFORFdJRFRIIDQwMDAwMDAwMAorI2RlZmluZSBOQlJfT0ZfUkVHSU9OUyAyCisKK3N0YXRpYyBzdHJ1Y3QgY3Jpc3YzMl93YXRjaF9lbnRyeSB3YXRjaGVzW05VTUJFUl9PRl9CUF0gPSB7CisJe3JlZ2lfbWFyYl9icDB9LAorCXtyZWdpX21hcmJfYnAxfSwKKwl7cmVnaV9tYXJiX2JwMn0sCisJe3JlZ2lfbWFyYl9icDN9Cit9OworCitzdGF0aWMgdTggcmVxdWVzdGVkX3Nsb3RzW05CUl9PRl9SRUdJT05TXVtOQlJfT0ZfQ0xJRU5UU107CitzdGF0aWMgdTggYWN0aXZlX2NsaWVudHNbTkJSX09GX1JFR0lPTlNdW05CUl9PRl9DTElFTlRTXTsKK3N0YXRpYyBpbnQgbWF4X2JhbmR3aWR0aFtOQlJfT0ZfUkVHSU9OU10gPQorICAgIHsgU0RSQU1fQkFORFdJRFRILCBJTlRNRU1fQkFORFdJRFRIIH07CisKK0RFRklORV9TUElOTE9DSyhhcmJpdGVyX2xvY2spOworCitzdGF0aWMgaXJxcmV0dXJuX3QgY3Jpc3YzMl9hcmJpdGVyX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworCisvKgorICogIkknbSB0aGUgYXJiaXRlciwgSSBrbm93IHRoZSBzY29yZS4KKyAqICBGcm9tIHNxdWFyZSBvbmUgSSdsbCBiZSB3YXRjaGluZyBhbGwgNjQuIgorICogKG1lbW9yeSBhcmJpdGVyIHNsb3RzLCB0aGF0IGlzKQorICoKKyAqICBPciBpbiBvdGhlciB3b3JkczoKKyAqIFByb2dyYW0gdGhlIG1lbW9yeSBhcmJpdGVyIHNsb3RzIGZvciAicmVnaW9uIiBhY2NvcmRpbmcgdG8gd2hhdCdzCisgKiBpbiByZXF1ZXN0ZWRfc2xvdHNbXSBhbmQgYWN0aXZlX2NsaWVudHNbXSwgd2hpbGUgbWluaW1pemluZworICogbGF0ZW5jeS4gQSBjYWxsZXIgbWF5IHBhc3MgYSBub24temVybyBwb3NpdGl2ZSBhbW91bnQgZm9yCisgKiAidW51c2VkX3Nsb3RzIiwgd2hpY2ggbXVzdCB0aGVuIGJlIHRoZSB1bmFsbG9jYXRlZCwgcmVtYWluaW5nCisgKiBudW1iZXIgb2Ygc2xvdHMsIGZyZWUgdG8gaGFuZCBvdXQgdG8gYW55IGNsaWVudC4KKyAqLworCitzdGF0aWMgdm9pZCBjcmlzdjMyX2FyYml0ZXJfY29uZmlnKGludCByZWdpb24sIGludCB1bnVzZWRfc2xvdHMpCit7CisJaW50IHNsb3Q7CisJaW50IGNsaWVudDsKKwlpbnQgaW50ZXJ2YWwgPSAwOworCisJLyoKKwkgKiBUaGlzIHZlY3RvciBjb3JyZXNwb25kcyB0byB0aGUgaGFyZHdhcmUgYXJiaXRlciBzbG90cyAoc2VlCisJICogdGhlIGhhcmR3YXJlIGRvY3VtZW50YXRpb24gZm9yIHNlbWFudGljcykuIFdlIGluaXRpYWxpemUKKwkgKiBlYWNoIHNsb3Qgd2l0aCBhIHN1aXRhYmxlIHNlbnRpbmVsIHZhbHVlIG91dHNpZGUgdGhlIHZhbGlkCisJICogcmFuZ2UgezAgLi4gTkJSX09GX0NMSUVOVFMgLSAxfSBhbmQgcmVwbGFjZSB0aGVtIHdpdGgKKwkgKiBjbGllbnQgaW5kZXhlcy4gVGhlbiBpdCdzIGZlZCB0byB0aGUgaGFyZHdhcmUuCisJICovCisJczggdmFsW05CUl9PRl9TTE9UU107CisKKwlmb3IgKHNsb3QgPSAwOyBzbG90IDwgTkJSX09GX1NMT1RTOyBzbG90KyspCisJCXZhbFtzbG90XSA9IC0xOworCisJZm9yIChjbGllbnQgPSAwOyBjbGllbnQgPCBOQlJfT0ZfQ0xJRU5UUzsgY2xpZW50KyspIHsKKwkJaW50IHBvczsKKwkJLyogQWxsb2NhdGUgdGhlIHJlcXVlc3RlZCBub24temVybyBudW1iZXIgb2Ygc2xvdHMsIGJ1dAorCQkgKiBhbHNvIGdpdmUgY2xpZW50cyB3aXRoIHplcm8tcmVxdWVzdHMgb25lIHNsb3QgZWFjaAorCQkgKiB3aGlsZSBzdG9ja3MgbGFzdC4gV2UgZG8gdGhlIGxhdHRlciBoZXJlLCBpbiBjbGllbnQKKwkJICogb3JkZXIuIFRoaXMgbWFrZXMgc3VyZSB6ZXJvLXJlcXVlc3QgY2xpZW50cyBhcmUgdGhlCisJCSAqIGZpcnN0IHRvIGdldCB0byBhbnkgc3BhcmUgc2xvdHMsIGVsc2UgdGhvc2Ugc2xvdHMKKwkJICogY291bGQsIHdoZW4gYmFuZHdpZHRoIGlzIGFsbG9jYXRlZCBjbG9zZSB0byB0aGUgbGltaXQsCisJCSAqIGFsbCBiZSBhbGxvY2F0ZWQgdG8gbG93LWluZGV4IG5vbi16ZXJvLXJlcXVlc3QgY2xpZW50cworCQkgKiBpbiB0aGUgZGVmYXVsdC1maWxsIGxvb3AgYmVsb3cuIEFub3RoZXIgcG9zaXRpdmUgYnV0CisJCSAqIHNlY29uZGFyeSBlZmZlY3QgaXMgYSBzb21ld2hhdCBiZXR0ZXIgc3ByZWFkIG9mIHRoZQorCQkgKiB6ZXJvLWJhbmR3aWR0aCBjbGllbnRzIGluIHRoZSB2ZWN0b3IsIGF2b2lkaW5nIHNvbWUgb2YKKwkJICogdGhlIGxhdGVuY3kgdGhhdCBjb3VsZCBvdGhlcndpc2UgYmUgY2F1c2VkIGJ5IHRoZQorCQkgKiBwYXJ0aXRpb25pbmcgb2Ygbm9uLXplcm8tYmFuZHdpZHRoIGNsaWVudHMgYXQgbG93CisJCSAqIGluZGV4ZXMgYW5kIHplcm8tYmFuZHdpZHRoIGNsaWVudHMgYXQgaGlnaAorCQkgKiBpbmRleGVzLiAoTm90ZSB0aGF0IHRoaXMgc3ByZWFkaW5nIGNhbiBvbmx5IGFmZmVjdCB0aGUKKwkJICogdW5hbGxvY2F0ZWQgYmFuZHdpZHRoLikgIEFsbCB0aGUgYWJvdmUgb25seSBtYXR0ZXJzIGZvcgorCQkgKiBtZW1vcnktaW50ZW5zaXZlIHNpdHVhdGlvbnMsIG9mIGNvdXJzZS4KKwkJICovCisJCWlmICghcmVxdWVzdGVkX3Nsb3RzW3JlZ2lvbl1bY2xpZW50XSkgeworCQkJLyoKKwkJCSAqIFNraXAgaW5hY3RpdmUgY2xpZW50cy4gQWxzbyBza2lwIHplcm8tc2xvdAorCQkJICogYWxsb2NhdGlvbnMgaW4gdGhpcyBwYXNzIHdoZW4gdGhlcmUgYXJlIG5vIGtub3duCisJCQkgKiBmcmVlIHNsb3RzLgorCQkJICovCisJCQlpZiAoIWFjdGl2ZV9jbGllbnRzW3JlZ2lvbl1bY2xpZW50XQorCQkJICAgIHx8IHVudXNlZF9zbG90cyA8PSAwKQorCQkJCWNvbnRpbnVlOworCisJCQl1bnVzZWRfc2xvdHMtLTsKKworCQkJLyogT25seSBhbGxvY2F0ZSBvbmUgc2xvdCBmb3IgdGhpcyBjbGllbnQuICovCisJCQlpbnRlcnZhbCA9IE5CUl9PRl9TTE9UUzsKKwkJfSBlbHNlCisJCQlpbnRlcnZhbCA9CisJCQkgICAgTkJSX09GX1NMT1RTIC8gcmVxdWVzdGVkX3Nsb3RzW3JlZ2lvbl1bY2xpZW50XTsKKworCQlwb3MgPSAwOworCQl3aGlsZSAocG9zIDwgTkJSX09GX1NMT1RTKSB7CisJCQlpZiAodmFsW3Bvc10gPj0gMCkKKwkJCQlwb3MrKzsKKwkJCWVsc2UgeworCQkJCXZhbFtwb3NdID0gY2xpZW50OworCQkJCXBvcyArPSBpbnRlcnZhbDsKKwkJCX0KKwkJfQorCX0KKworCWNsaWVudCA9IDA7CisJZm9yIChzbG90ID0gMDsgc2xvdCA8IE5CUl9PRl9TTE9UUzsgc2xvdCsrKSB7CisJCS8qCisJCSAqIEFsbG9jYXRlIHJlbWFpbmluZyBzbG90cyBpbiByb3VuZC1yb2JpbgorCQkgKiBjbGllbnQtbnVtYmVyIG9yZGVyIGZvciBhY3RpdmUgY2xpZW50cy4gRm9yIHRoaXMKKwkJICogcGFzcywgd2UgaWdub3JlIHJlcXVlc3RlZCBiYW5kd2lkdGggYW5kIHByZXZpb3VzCisJCSAqIGFsbG9jYXRpb25zLgorCQkgKi8KKwkJaWYgKHZhbFtzbG90XSA8IDApIHsKKwkJCWludCBmaXJzdCA9IGNsaWVudDsKKwkJCXdoaWxlICghYWN0aXZlX2NsaWVudHNbcmVnaW9uXVtjbGllbnRdKSB7CisJCQkJY2xpZW50ID0gKGNsaWVudCArIDEpICUgTkJSX09GX0NMSUVOVFM7CisJCQkJaWYgKGNsaWVudCA9PSBmaXJzdCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQl2YWxbc2xvdF0gPSBjbGllbnQ7CisJCQljbGllbnQgPSAoY2xpZW50ICsgMSkgJSBOQlJfT0ZfQ0xJRU5UUzsKKwkJfQorCQlpZiAocmVnaW9uID09IEVYVF9SRUdJT04pCisJCQlSRUdfV1JfSU5UX1ZFQ1QobWFyYiwgcmVnaV9tYXJiLCByd19leHRfc2xvdHMsIHNsb3QsCisJCQkJCXZhbFtzbG90XSk7CisJCWVsc2UgaWYgKHJlZ2lvbiA9PSBJTlRfUkVHSU9OKQorCQkJUkVHX1dSX0lOVF9WRUNUKG1hcmIsIHJlZ2lfbWFyYiwgcndfaW50X3Nsb3RzLCBzbG90LAorCQkJCQl2YWxbc2xvdF0pOworCX0KK30KKworZXh0ZXJuIGNoYXIgX3N0ZXh0LCBfZXRleHQ7CisKK3N0YXRpYyB2b2lkIGNyaXN2MzJfYXJiaXRlcl9pbml0KHZvaWQpCit7CisJc3RhdGljIGludCBpbml0aWFsaXplZDsKKworCWlmIChpbml0aWFsaXplZCkKKwkJcmV0dXJuOworCisJaW5pdGlhbGl6ZWQgPSAxOworCisJLyoKKwkgKiBDUFUgY2FjaGVzIGFyZSBhbHdheXMgc2V0IHRvIGFjdGl2ZSwgYnV0IHdpdGggemVybworCSAqIGJhbmR3aWR0aCBhbGxvY2F0ZWQuIEl0IHNob3VsZCBiZSBvayB0byBhbGxvY2F0ZSB6ZXJvCisJICogYmFuZHdpZHRoIGZvciB0aGUgY2FjaGVzLCBiZWNhdXNlIERNQSBmb3Igb3RoZXIgY2hhbm5lbHMKKwkgKiB3aWxsIHN1cHBvc2VkbHkgZmluaXNoLCBvbmNlIHRoZWlyIHByb2dyYW1tZWQgYW1vdW50IGlzCisJICogZG9uZSwgYW5kIHRoZW4gdGhlIGNhY2hlcyB3aWxsIGdldCBhY2Nlc3MgYWNjb3JkaW5nIHRvIHRoZQorCSAqICJmaXhlZCBzY2hlbWUiIGZvciB1bmNsYWltZWQgc2xvdHMuIFRob3VnaCwgaWYgZm9yIHNvbWUKKwkgKiB1c2UtY2FzZSBzb21ld2hlcmUsIHRoZXJlJ3MgYSBtYXhpbXVtIENQVSBsYXRlbmN5IGZvcgorCSAqIGUuZy4gc29tZSBpbnRlcnJ1cHQsIHdlIGhhdmUgdG8gc3RhcnQgYWxsb2NhdGluZyBzcGVjaWZpYworCSAqIGJhbmR3aWR0aCBmb3IgdGhlIENQVSBjYWNoZXMgdG9vLgorCSAqLworCWFjdGl2ZV9jbGllbnRzW0VYVF9SRUdJT05dWzEwXSA9IGFjdGl2ZV9jbGllbnRzW0VYVF9SRUdJT05dWzExXSA9IDE7CisJY3Jpc3YzMl9hcmJpdGVyX2NvbmZpZyhFWFRfUkVHSU9OLCAwKTsKKwljcmlzdjMyX2FyYml0ZXJfY29uZmlnKElOVF9SRUdJT04sIDApOworCisJaWYgKHJlcXVlc3RfaXJxKE1FTUFSQl9JTlRSX1ZFQ1QsIGNyaXN2MzJfYXJiaXRlcl9pcnEsIElSUUZfRElTQUJMRUQsCisJCQkiYXJiaXRlciIsIE5VTEwpKQorCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IGFsbG9jYXRlIGFyYml0ZXIgSVJRXG4iKTsKKworI2lmbmRlZiBDT05GSUdfRVRSQVhfS0dEQgorCS8qIEdsb2JhbCB3YXRjaCBmb3Igd3JpdGVzIHRvIGtlcm5lbCB0ZXh0IHNlZ21lbnQuICovCisJY3Jpc3YzMl9hcmJpdGVyX3dhdGNoKHZpcnRfdG9fcGh5cygmX3N0ZXh0KSwgJl9ldGV4dCAtICZfc3RleHQsCisJCQkgICAgICBhcmJpdGVyX2FsbF9jbGllbnRzLCBhcmJpdGVyX2FsbF93cml0ZSwgTlVMTCk7CisjZW5kaWYKK30KKworLyogTWFpbiBlbnRyeSBmb3IgYmFuZHdpZHRoIGFsbG9jYXRpb24uICovCisKK2ludCBjcmlzdjMyX2FyYml0ZXJfYWxsb2NhdGVfYmFuZHdpZHRoKGludCBjbGllbnQsIGludCByZWdpb24sCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYmFuZHdpZHRoKQoreworCWludCBpOworCWludCB0b3RhbF9hc3NpZ25lZCA9IDA7CisJaW50IHRvdGFsX2NsaWVudHMgPSAwOworCWludCByZXE7CisKKwljcmlzdjMyX2FyYml0ZXJfaW5pdCgpOworCisJZm9yIChpID0gMDsgaSA8IE5CUl9PRl9DTElFTlRTOyBpKyspIHsKKwkJdG90YWxfYXNzaWduZWQgKz0gcmVxdWVzdGVkX3Nsb3RzW3JlZ2lvbl1baV07CisJCXRvdGFsX2NsaWVudHMgKz0gYWN0aXZlX2NsaWVudHNbcmVnaW9uXVtpXTsKKwl9CisKKwkvKiBBdm9pZCBkaXZpc2lvbiBieSAwIGZvciAwLWJhbmR3aWR0aCByZXF1ZXN0cy4gKi8KKwlyZXEgPSBiYW5kd2lkdGggPT0gMAorCSAgICA/IDAgOiBOQlJfT0ZfU0xPVFMgLyAobWF4X2JhbmR3aWR0aFtyZWdpb25dIC8gYmFuZHdpZHRoKTsKKworCS8qCisJICogV2UgbWFrZSBzdXJlIHRoYXQgdGhlcmUgYXJlIGVub3VnaCBzbG90cyBvbmx5IGZvciBub24temVybworCSAqIHJlcXVlc3RzLiBSZXF1ZXN0aW5nIDAgYmFuZHdpZHRoICptYXkqIGFsbG9jYXRlIHNsb3RzLAorCSAqIHRob3VnaCBpZiBhbGwgYmFuZHdpZHRoIGlzIGFsbG9jYXRlZCwgc3VjaCBhIGNsaWVudCB3b24ndAorCSAqIGdldCBhbnkgYW5kIHdpbGwgaGF2ZSB0byByZWx5IG9uIGdldHRpbmcgbWVtb3J5IGFjY2VzcworCSAqIGFjY29yZGluZyB0byB0aGUgZml4ZWQgc2NoZW1lIHRoYXQncyB0aGUgZGVmYXVsdCB3aGVuIG9uZQorCSAqIG9mIHRoZSBzbG90LWFsbG9jYXRlZCBjbGllbnRzIGRvZXNuJ3QgY2xhaW0gdGhlaXIgc2xvdC4KKwkgKi8KKwlpZiAodG90YWxfYXNzaWduZWQgKyByZXEgPiBOQlJfT0ZfU0xPVFMpCisJCXJldHVybiAtRU5PTUVNOworCisJYWN0aXZlX2NsaWVudHNbcmVnaW9uXVtjbGllbnRdID0gMTsKKwlyZXF1ZXN0ZWRfc2xvdHNbcmVnaW9uXVtjbGllbnRdID0gcmVxOworCWNyaXN2MzJfYXJiaXRlcl9jb25maWcocmVnaW9uLCBOQlJfT0ZfU0xPVFMgLSB0b3RhbF9hc3NpZ25lZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE1haW4gZW50cnkgZm9yIGJhbmR3aWR0aCBkZWFsbG9jYXRpb24uCisgKgorICogU3RyaWN0bHkgc3BlYWtpbmcsIGZvciBhIHNvbWV3aGF0IGNvbnN0YW50IHNldCBvZiBjbGllbnRzIHdoZXJlCisgKiBlYWNoIGNsaWVudCBnZXRzIGEgY29uc3RhbnQgYmFuZHdpZHRoIGFuZCBpcyBqdXN0IGVuYWJsZWQgb3IKKyAqIGRpc2FibGVkIChzb21ld2hhdCBkeW5hbWljYWxseSksIG5vIGFjdGlvbiBpcyBuZWNlc3NhcnkgaGVyZSB0bworICogYXZvaWQgc3RhcnZhdGlvbiBmb3Igbm9uLXplcm8tYWxsb2NhdGlvbiBjbGllbnRzLCBhcyB0aGUgYWxsb2NhdGVkCisgKiBzbG90cyB3aWxsIGp1c3QgYmUgdW51c2VkLiBIb3dldmVyLCBoYW5kaW5nIG91dCB0aG9zZSB1bnVzZWQgc2xvdHMKKyAqIHRvIGFjdGl2ZSBjbGllbnRzIGF2b2lkcyBuZWVkbGVzcyBsYXRlbmN5IGlmIHRoZSAiZml4ZWQgc2NoZW1lIgorICogd291bGQgZ2l2ZSB1bmNsYWltZWQgc2xvdHMgdG8gYW4gZWFnZXIgbG93LWluZGV4IGNsaWVudC4KKyAqLworCit2b2lkIGNyaXN2MzJfYXJiaXRlcl9kZWFsbG9jYXRlX2JhbmR3aWR0aChpbnQgY2xpZW50LCBpbnQgcmVnaW9uKQoreworCWludCBpOworCWludCB0b3RhbF9hc3NpZ25lZCA9IDA7CisKKwlyZXF1ZXN0ZWRfc2xvdHNbcmVnaW9uXVtjbGllbnRdID0gMDsKKwlhY3RpdmVfY2xpZW50c1tyZWdpb25dW2NsaWVudF0gPSAwOworCisJZm9yIChpID0gMDsgaSA8IE5CUl9PRl9DTElFTlRTOyBpKyspCisJCXRvdGFsX2Fzc2lnbmVkICs9IHJlcXVlc3RlZF9zbG90c1tyZWdpb25dW2ldOworCisJY3Jpc3YzMl9hcmJpdGVyX2NvbmZpZyhyZWdpb24sIE5CUl9PRl9TTE9UUyAtIHRvdGFsX2Fzc2lnbmVkKTsKK30KKworaW50IGNyaXN2MzJfYXJiaXRlcl93YXRjaCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkgIHVuc2lnbmVkIGxvbmcgY2xpZW50cywgdW5zaWduZWQgbG9uZyBhY2Nlc3NlcywKKwkJCSAgd2F0Y2hfY2FsbGJhY2sgKmNiKQoreworCWludCBpOworCisJY3Jpc3YzMl9hcmJpdGVyX2luaXQoKTsKKworCWlmIChzdGFydCA+IDB4ODAwMDAwMDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJBcmJpdGVyOiAlbFggZG9lc24ndCBsb29rIGxpa2UgYSAiCisJCQkicGh5c2ljYWwgYWRkcmVzcyIsIHN0YXJ0KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJc3Bpbl9sb2NrKCZhcmJpdGVyX2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IE5VTUJFUl9PRl9CUDsgaSsrKSB7CisJCWlmICghd2F0Y2hlc1tpXS51c2VkKSB7CisJCQlyZWdfbWFyYl9yd19pbnRyX21hc2sgaW50cl9tYXNrID0KKwkJCSAgICBSRUdfUkQobWFyYiwgcmVnaV9tYXJiLCByd19pbnRyX21hc2spOworCisJCQl3YXRjaGVzW2ldLnVzZWQgPSAxOworCQkJd2F0Y2hlc1tpXS5zdGFydCA9IHN0YXJ0OworCQkJd2F0Y2hlc1tpXS5lbmQgPSBzdGFydCArIHNpemU7CisJCQl3YXRjaGVzW2ldLmNiID0gY2I7CisKKwkJCVJFR19XUl9JTlQobWFyYl9icCwgd2F0Y2hlc1tpXS5pbnN0YW5jZSwgcndfZmlyc3RfYWRkciwKKwkJCQkgICB3YXRjaGVzW2ldLnN0YXJ0KTsKKwkJCVJFR19XUl9JTlQobWFyYl9icCwgd2F0Y2hlc1tpXS5pbnN0YW5jZSwgcndfbGFzdF9hZGRyLAorCQkJCSAgIHdhdGNoZXNbaV0uZW5kKTsKKwkJCVJFR19XUl9JTlQobWFyYl9icCwgd2F0Y2hlc1tpXS5pbnN0YW5jZSwgcndfb3AsCisJCQkJICAgYWNjZXNzZXMpOworCQkJUkVHX1dSX0lOVChtYXJiX2JwLCB3YXRjaGVzW2ldLmluc3RhbmNlLCByd19jbGllbnRzLAorCQkJCSAgIGNsaWVudHMpOworCisJCQlpZiAoaSA9PSAwKQorCQkJCWludHJfbWFzay5icDAgPSByZWdrX21hcmJfeWVzOworCQkJZWxzZSBpZiAoaSA9PSAxKQorCQkJCWludHJfbWFzay5icDEgPSByZWdrX21hcmJfeWVzOworCQkJZWxzZSBpZiAoaSA9PSAyKQorCQkJCWludHJfbWFzay5icDIgPSByZWdrX21hcmJfeWVzOworCQkJZWxzZSBpZiAoaSA9PSAzKQorCQkJCWludHJfbWFzay5icDMgPSByZWdrX21hcmJfeWVzOworCisJCQlSRUdfV1IobWFyYiwgcmVnaV9tYXJiLCByd19pbnRyX21hc2ssIGludHJfbWFzayk7CisJCQlzcGluX3VubG9jaygmYXJiaXRlcl9sb2NrKTsKKworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmFyYml0ZXJfbG9jayk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK2ludCBjcmlzdjMyX2FyYml0ZXJfdW53YXRjaChpbnQgaWQpCit7CisJcmVnX21hcmJfcndfaW50cl9tYXNrIGludHJfbWFzayA9IFJFR19SRChtYXJiLCByZWdpX21hcmIsIHJ3X2ludHJfbWFzayk7CisKKwljcmlzdjMyX2FyYml0ZXJfaW5pdCgpOworCisJc3Bpbl9sb2NrKCZhcmJpdGVyX2xvY2spOworCisJaWYgKChpZCA8IDApIHx8IChpZCA+PSBOVU1CRVJfT0ZfQlApIHx8ICghd2F0Y2hlc1tpZF0udXNlZCkpIHsKKwkJc3Bpbl91bmxvY2soJmFyYml0ZXJfbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1lbXNldCgmd2F0Y2hlc1tpZF0sIDAsIHNpemVvZihzdHJ1Y3QgY3Jpc3YzMl93YXRjaF9lbnRyeSkpOworCisJaWYgKGlkID09IDApCisJCWludHJfbWFzay5icDAgPSByZWdrX21hcmJfbm87CisJZWxzZSBpZiAoaWQgPT0gMSkKKwkJaW50cl9tYXNrLmJwMiA9IHJlZ2tfbWFyYl9ubzsKKwllbHNlIGlmIChpZCA9PSAyKQorCQlpbnRyX21hc2suYnAyID0gcmVna19tYXJiX25vOworCWVsc2UgaWYgKGlkID09IDMpCisJCWludHJfbWFzay5icDMgPSByZWdrX21hcmJfbm87CisKKwlSRUdfV1IobWFyYiwgcmVnaV9tYXJiLCByd19pbnRyX21hc2ssIGludHJfbWFzayk7CisKKwlzcGluX3VubG9jaygmYXJiaXRlcl9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIHZvaWQgc2hvd19yZWdpc3RlcnMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCitzdGF0aWMgaXJxcmV0dXJuX3QgY3Jpc3YzMl9hcmJpdGVyX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJcmVnX21hcmJfcl9tYXNrZWRfaW50ciBtYXNrZWRfaW50ciA9CisJICAgIFJFR19SRChtYXJiLCByZWdpX21hcmIsIHJfbWFza2VkX2ludHIpOworCXJlZ19tYXJiX2JwX3JfYnJrX2NsaWVudHMgcl9jbGllbnRzOworCXJlZ19tYXJiX2JwX3JfYnJrX2FkZHIgcl9hZGRyOworCXJlZ19tYXJiX2JwX3JfYnJrX29wIHJfb3A7CisJcmVnX21hcmJfYnBfcl9icmtfZmlyc3RfY2xpZW50IHJfZmlyc3Q7CisJcmVnX21hcmJfYnBfcl9icmtfc2l6ZSByX3NpemU7CisJcmVnX21hcmJfYnBfcndfYWNrIGFjayA9IHsgMCB9OworCXJlZ19tYXJiX3J3X2Fja19pbnRyIGFja19pbnRyID0geworCQkuYnAwID0gMSwgLmJwMSA9IDEsIC5icDIgPSAxLCAuYnAzID0gMQorCX07CisJc3RydWN0IGNyaXN2MzJfd2F0Y2hfZW50cnkgKndhdGNoOworCisJaWYgKG1hc2tlZF9pbnRyLmJwMCkgeworCQl3YXRjaCA9ICZ3YXRjaGVzWzBdOworCQlhY2tfaW50ci5icDAgPSByZWdrX21hcmJfeWVzOworCX0gZWxzZSBpZiAobWFza2VkX2ludHIuYnAxKSB7CisJCXdhdGNoID0gJndhdGNoZXNbMV07CisJCWFja19pbnRyLmJwMSA9IHJlZ2tfbWFyYl95ZXM7CisJfSBlbHNlIGlmIChtYXNrZWRfaW50ci5icDIpIHsKKwkJd2F0Y2ggPSAmd2F0Y2hlc1syXTsKKwkJYWNrX2ludHIuYnAyID0gcmVna19tYXJiX3llczsKKwl9IGVsc2UgaWYgKG1hc2tlZF9pbnRyLmJwMykgeworCQl3YXRjaCA9ICZ3YXRjaGVzWzNdOworCQlhY2tfaW50ci5icDMgPSByZWdrX21hcmJfeWVzOworCX0gZWxzZSB7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwkvKiBSZXRyaWV2ZSBhbGwgdXNlZnVsIGluZm9ybWF0aW9uIGFuZCBwcmludCBpdC4gKi8KKwlyX2NsaWVudHMgPSBSRUdfUkQobWFyYl9icCwgd2F0Y2gtPmluc3RhbmNlLCByX2Jya19jbGllbnRzKTsKKwlyX2FkZHIgPSBSRUdfUkQobWFyYl9icCwgd2F0Y2gtPmluc3RhbmNlLCByX2Jya19hZGRyKTsKKwlyX29wID0gUkVHX1JEKG1hcmJfYnAsIHdhdGNoLT5pbnN0YW5jZSwgcl9icmtfb3ApOworCXJfZmlyc3QgPSBSRUdfUkQobWFyYl9icCwgd2F0Y2gtPmluc3RhbmNlLCByX2Jya19maXJzdF9jbGllbnQpOworCXJfc2l6ZSA9IFJFR19SRChtYXJiX2JwLCB3YXRjaC0+aW5zdGFuY2UsIHJfYnJrX3NpemUpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiQXJiaXRlciBJUlFcbiIpOworCXByaW50ayhLRVJOX0lORk8gIkNsaWVudHMgJVggYWRkciAlWCBvcCAlWCBmaXJzdCAlWCBzaXplICVYXG4iLAorCSAgICAgICBSRUdfVFlQRV9DT05WKGludCwgcmVnX21hcmJfYnBfcl9icmtfY2xpZW50cywgcl9jbGllbnRzKSwKKwkgICAgICAgUkVHX1RZUEVfQ09OVihpbnQsIHJlZ19tYXJiX2JwX3JfYnJrX2FkZHIsIHJfYWRkciksCisJICAgICAgIFJFR19UWVBFX0NPTlYoaW50LCByZWdfbWFyYl9icF9yX2Jya19vcCwgcl9vcCksCisJICAgICAgIFJFR19UWVBFX0NPTlYoaW50LCByZWdfbWFyYl9icF9yX2Jya19maXJzdF9jbGllbnQsIHJfZmlyc3QpLAorCSAgICAgICBSRUdfVFlQRV9DT05WKGludCwgcmVnX21hcmJfYnBfcl9icmtfc2l6ZSwgcl9zaXplKSk7CisKKwlSRUdfV1IobWFyYl9icCwgd2F0Y2gtPmluc3RhbmNlLCByd19hY2ssIGFjayk7CisJUkVHX1dSKG1hcmIsIHJlZ2lfbWFyYiwgcndfYWNrX2ludHIsIGFja19pbnRyKTsKKworCXByaW50ayhLRVJOX0lORk8gIklSUSBvY2N1cmVkIGF0ICVsWFxuIiwgZ2V0X2lycV9yZWdzKCktPmVycCk7CisKKwlpZiAod2F0Y2gtPmNiKQorCQl3YXRjaC0+Y2IoKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2NwdWZyZXEuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2NwdWZyZXEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTc2MzFjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21hY2gtZnMvY3B1ZnJlcS5jCkBAIC0wLDAgKzEsMTQ2IEBACisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxod3JlZ3MvcmVnX21hcC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9yZWdfcmR3ci5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9jb25maWdfZGVmcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9iaWZfY29yZV9kZWZzLmg+CisKK3N0YXRpYyBpbnQKK2NyaXNfc2RyYW1fZnJlcV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIHZhbCwKKwkJCSB2b2lkICpkYXRhKTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBjcmlzX3NkcmFtX2ZyZXFfbm90aWZpZXJfYmxvY2sgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBjcmlzX3NkcmFtX2ZyZXFfbm90aWZpZXIKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgY3Jpc19mcmVxX3RhYmxlW10gPSB7CisJezB4MDEsIDYwMDB9LAorCXsweDAyLCAyMDAwMDB9LAorCXswLCBDUFVGUkVRX1RBQkxFX0VORH0sCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGNyaXNfZnJlcV9nZXRfY3B1X2ZyZXF1ZW5jeSh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJlZ19jb25maWdfcndfY2xrX2N0cmwgY2xrX2N0cmw7CisJY2xrX2N0cmwgPSBSRUdfUkQoY29uZmlnLCByZWdpX2NvbmZpZywgcndfY2xrX2N0cmwpOworCXJldHVybiBjbGtfY3RybC5wbGwgPyAyMDAwMDAgOiA2MDAwOworfQorCitzdGF0aWMgdm9pZCBjcmlzX2ZyZXFfc2V0X2NwdV9zdGF0ZSh1bnNpZ25lZCBpbnQgc3RhdGUpCit7CisJaW50IGk7CisJc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7CisJcmVnX2NvbmZpZ19yd19jbGtfY3RybCBjbGtfY3RybDsKKwljbGtfY3RybCA9IFJFR19SRChjb25maWcsIHJlZ2lfY29uZmlnLCByd19jbGtfY3RybCk7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQlmcmVxcy5vbGQgPSBjcmlzX2ZyZXFfZ2V0X2NwdV9mcmVxdWVuY3koaSk7CisJCWZyZXFzLm5ldyA9IGNyaXNfZnJlcV90YWJsZVtzdGF0ZV0uZnJlcXVlbmN5OworCQlmcmVxcy5jcHUgPSBpOworCX0KKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJLyogRXZlbiB0aG91Z2ggd2UgbWF5IGJlIFNNUCB0aGV5IHdpbGwgc2hhcmUgdGhlIHNhbWUgY2xvY2sKKwkgKiBzbyBhbGwgc2V0dGluZ3MgYXJlIG1hZGUgb24gQ1BVMC4gKi8KKwlpZiAoY3Jpc19mcmVxX3RhYmxlW3N0YXRlXS5mcmVxdWVuY3kgPT0gMjAwMDAwKQorCQljbGtfY3RybC5wbGwgPSAxOworCWVsc2UKKwkJY2xrX2N0cmwucGxsID0gMDsKKwlSRUdfV1IoY29uZmlnLCByZWdpX2NvbmZpZywgcndfY2xrX2N0cmwsIGNsa19jdHJsKTsKKworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworfTsKKworc3RhdGljIGludCBjcmlzX2ZyZXFfdmVyaWZ5KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXJldHVybiBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnkocG9saWN5LCAmY3Jpc19mcmVxX3RhYmxlWzBdKTsKK30KKworc3RhdGljIGludCBjcmlzX2ZyZXFfdGFyZ2V0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkJICAgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwgdW5zaWduZWQgaW50IHJlbGF0aW9uKQoreworCXVuc2lnbmVkIGludCBuZXdzdGF0ZSA9IDA7CisKKwlpZiAoY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0CisJICAgIChwb2xpY3ksIGNyaXNfZnJlcV90YWJsZSwgdGFyZ2V0X2ZyZXEsIHJlbGF0aW9uLCAmbmV3c3RhdGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNyaXNfZnJlcV9zZXRfY3B1X3N0YXRlKG5ld3N0YXRlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNyaXNfZnJlcV9jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlpbnQgcmVzdWx0OworCisJLyogY3B1aW5mbyBhbmQgZGVmYXVsdCBwb2xpY3kgdmFsdWVzICovCisJcG9saWN5LT5nb3Zlcm5vciA9IENQVUZSRVFfREVGQVVMVF9HT1ZFUk5PUjsKKwlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gMTAwMDAwMDsJLyogMW1zICovCisJcG9saWN5LT5jdXIgPSBjcmlzX2ZyZXFfZ2V0X2NwdV9mcmVxdWVuY3koMCk7CisKKwlyZXN1bHQgPSBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9jcHVpbmZvKHBvbGljeSwgY3Jpc19mcmVxX3RhYmxlKTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gKHJlc3VsdCk7CisKKwljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cihjcmlzX2ZyZXFfdGFibGUsIHBvbGljeS0+Y3B1KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNyaXNfZnJlcV9jcHVfZXhpdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9wdXRfYXR0cihwb2xpY3ktPmNwdSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyICpjcmlzX2ZyZXFfYXR0cltdID0geworCSZjcHVmcmVxX2ZyZXFfYXR0cl9zY2FsaW5nX2F2YWlsYWJsZV9mcmVxcywKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBjcmlzX2ZyZXFfZHJpdmVyID0geworCS5nZXQgPSBjcmlzX2ZyZXFfZ2V0X2NwdV9mcmVxdWVuY3ksCisJLnZlcmlmeSA9IGNyaXNfZnJlcV92ZXJpZnksCisJLnRhcmdldCA9IGNyaXNfZnJlcV90YXJnZXQsCisJLmluaXQgPSBjcmlzX2ZyZXFfY3B1X2luaXQsCisJLmV4aXQgPSBjcmlzX2ZyZXFfY3B1X2V4aXQsCisJLm5hbWUgPSAiY3Jpc19mcmVxIiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuYXR0ciA9IGNyaXNfZnJlcV9hdHRyLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY3Jpc19mcmVxX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCXJldCA9IGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZjcmlzX2ZyZXFfZHJpdmVyKTsKKwljcHVmcmVxX3JlZ2lzdGVyX25vdGlmaWVyKCZjcmlzX3NkcmFtX2ZyZXFfbm90aWZpZXJfYmxvY2ssCisJCQkJICBDUFVGUkVRX1RSQU5TSVRJT05fTk9USUZJRVIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2NyaXNfc2RyYW1fZnJlcV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIHZhbCwKKwkJCSB2b2lkICpkYXRhKQoreworCWludCBpOworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzICpmcmVxcyA9IGRhdGE7CisJaWYgKHZhbCA9PSBDUFVGUkVRX1BSRUNIQU5HRSkgeworCQlyZWdfYmlmX2NvcmVfcndfc2RyYW1fdGltaW5nIHRpbWluZyA9CisJCSAgICBSRUdfUkQoYmlmX2NvcmUsIHJlZ2lfYmlmX2NvcmUsIHJ3X3NkcmFtX3RpbWluZyk7CisJCXRpbWluZy5jcGQgPSAoZnJlcXMtPm5ldyA9PSAyMDAwMDAgPyAwIDogMSk7CisKKwkJaWYgKGZyZXFzLT5uZXcgPT0gMjAwMDAwKQorCQkJZm9yIChpID0gMDsgaSA8IDUwMDAwOyBpKyspIDsKKwkJUkVHX1dSKGJpZl9jb3JlLCByZWdpX2JpZl9jb3JlLCByd19zZHJhbV90aW1pbmcsIHRpbWluZyk7CisJfQorCXJldHVybiAwOworfQorCittb2R1bGVfaW5pdChjcmlzX2ZyZXFfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1mcy9kbWEuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2RtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YWNmNGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1mcy9kbWEuYwpAQCAtMCwwICsxLDIzMCBAQAorLyogV3JhcHBlciBmb3IgRE1BIGNoYW5uZWwgYWxsb2NhdG9yIHRoYXQgc3RhcnRzIGNsb2NrcyBldGMgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGh3cmVncy9yZWdfbWFwLmg+CisjaW5jbHVkZSA8aHdyZWdzL3JlZ19yZHdyLmg+CisjaW5jbHVkZSA8aHdyZWdzL21hcmJfZGVmcy5oPgorI2luY2x1ZGUgPGh3cmVncy9jb25maWdfZGVmcy5oPgorI2luY2x1ZGUgPGh3cmVncy9zdHJtdXhfZGVmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21hY2gvYXJiaXRlci5oPgorCitzdGF0aWMgY2hhciB1c2VkX2RtYV9jaGFubmVsc1tNQVhfRE1BX0NIQU5ORUxTXTsKK3N0YXRpYyBjb25zdCBjaGFyICp1c2VkX2RtYV9jaGFubmVsc191c2Vyc1tNQVhfRE1BX0NIQU5ORUxTXTsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhkbWFfbG9jayk7CisKK2ludCBjcmlzdjMyX3JlcXVlc3RfZG1hKHVuc2lnbmVkIGludCBkbWFuciwgY29uc3QgY2hhciAqZGV2aWNlX2lkLAorCQkJdW5zaWduZWQgb3B0aW9ucywgdW5zaWduZWQgaW50IGJhbmR3aWR0aCwKKwkJCWVudW0gZG1hX293bmVyIG93bmVyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJcmVnX2NvbmZpZ19yd19jbGtfY3RybCBjbGtfY3RybDsKKwlyZWdfc3RybXV4X3J3X2NmZyBzdHJtdXhfY2ZnOworCisJaWYgKGNyaXN2MzJfYXJiaXRlcl9hbGxvY2F0ZV9iYW5kd2lkdGgoZG1hbnIsCisJCQkJCSAgICAgICBvcHRpb25zICYgRE1BX0lOVF9NRU0gPworCQkJCQkgICAgICAgSU5UX1JFR0lPTiA6IEVYVF9SRUdJT04sCisJCQkJCSAgICAgICBiYW5kd2lkdGgpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFfbG9jaywgZmxhZ3MpOworCisJaWYgKHVzZWRfZG1hX2NoYW5uZWxzW2RtYW5yXSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFfbG9jaywgZmxhZ3MpOworCQlpZiAob3B0aW9ucyAmIERNQV9WRVJCT1NFX09OX0VSUk9SKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZXF1ZXN0IERNQSAlaSBmb3IgJXMsICIKKwkJCQkiYWxyZWFkeSBhbGxvY2F0ZWQgYnkgJXNcbiIsCisJCQkJZG1hbnIsCisJCQkJZGV2aWNlX2lkLAorCQkJCXVzZWRfZG1hX2NoYW5uZWxzX3VzZXJzW2RtYW5yXSk7CisJCX0KKwkJaWYgKG9wdGlvbnMgJiBETUFfUEFOSUNfT05fRVJST1IpCisJCQlwYW5pYygicmVxdWVzdF9kbWEgZXJyb3IhIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYV9sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWNsa19jdHJsID0gUkVHX1JEKGNvbmZpZywgcmVnaV9jb25maWcsIHJ3X2Nsa19jdHJsKTsKKwlzdHJtdXhfY2ZnID0gUkVHX1JEKHN0cm11eCwgcmVnaV9zdHJtdXgsIHJ3X2NmZyk7CisKKwlzd2l0Y2ggKGRtYW5yKSB7CisJY2FzZSAwOgorCWNhc2UgMToKKwkJY2xrX2N0cmwuZG1hMDFfZXRoMCA9IDE7CisJCWJyZWFrOworCWNhc2UgMjoKKwljYXNlIDM6CisJCWNsa19jdHJsLmRtYTIzID0gMTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCWNhc2UgNToKKwkJY2xrX2N0cmwuZG1hNDUgPSAxOworCQlicmVhazsKKwljYXNlIDY6CisJY2FzZSA3OgorCQljbGtfY3RybC5kbWE2NyA9IDE7CisJCWJyZWFrOworCWNhc2UgODoKKwljYXNlIDk6CisJCWNsa19jdHJsLmRtYTg5X3N0cmNvcCA9IDE7CisJCWJyZWFrOworI2lmIE1BWF9ETUFfQ0hBTk5FTFMtMSAhPSA5CisjZXJyb3IgQ2hlY2sgZG1hLmMKKyNlbmRpZgorCWRlZmF1bHQ6CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYV9sb2NrLCBmbGFncyk7CisJCWlmIChvcHRpb25zICYgRE1BX1ZFUkJPU0VfT05fRVJST1IpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlcXVlc3QgRE1BICVpIGZvciAlcywgIgorCQkJCSJvbmx5IDAtJWkgdmFsaWQpXG4iLAorCQkJCWRtYW5yLCBkZXZpY2VfaWQsIE1BWF9ETUFfQ0hBTk5FTFMgLSAxKTsKKwkJfQorCisJCWlmIChvcHRpb25zICYgRE1BX1BBTklDX09OX0VSUk9SKQorCQkJcGFuaWMoInJlcXVlc3RfZG1hIGVycm9yISIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKG93bmVyKSB7CisJY2FzZSBkbWFfZXRoMDoKKwkJaWYgKGRtYW5yID09IDApCisJCQlzdHJtdXhfY2ZnLmRtYTAgPSByZWdrX3N0cm11eF9ldGgwOworCQllbHNlIGlmIChkbWFuciA9PSAxKQorCQkJc3RybXV4X2NmZy5kbWExID0gcmVna19zdHJtdXhfZXRoMDsKKwkJZWxzZQorCQkJcGFuaWMoIkludmFsaWQgRE1BIGNoYW5uZWwgZm9yIGV0aDBcbiIpOworCQlicmVhazsKKwljYXNlIGRtYV9ldGgxOgorCQlpZiAoZG1hbnIgPT0gNikKKwkJCXN0cm11eF9jZmcuZG1hNiA9IHJlZ2tfc3RybXV4X2V0aDE7CisJCWVsc2UgaWYgKGRtYW5yID09IDcpCisJCQlzdHJtdXhfY2ZnLmRtYTcgPSByZWdrX3N0cm11eF9ldGgxOworCQllbHNlCisJCQlwYW5pYygiSW52YWxpZCBETUEgY2hhbm5lbCBmb3IgZXRoMVxuIik7CisJCWJyZWFrOworCWNhc2UgZG1hX2lvcDA6CisJCWlmIChkbWFuciA9PSAyKQorCQkJc3RybXV4X2NmZy5kbWEyID0gcmVna19zdHJtdXhfaW9wMDsKKwkJZWxzZSBpZiAoZG1hbnIgPT0gMykKKwkJCXN0cm11eF9jZmcuZG1hMyA9IHJlZ2tfc3RybXV4X2lvcDA7CisJCWVsc2UKKwkJCXBhbmljKCJJbnZhbGlkIERNQSBjaGFubmVsIGZvciBpb3AwXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBkbWFfaW9wMToKKwkJaWYgKGRtYW5yID09IDQpCisJCQlzdHJtdXhfY2ZnLmRtYTQgPSByZWdrX3N0cm11eF9pb3AxOworCQllbHNlIGlmIChkbWFuciA9PSA1KQorCQkJc3RybXV4X2NmZy5kbWE1ID0gcmVna19zdHJtdXhfaW9wMTsKKwkJZWxzZQorCQkJcGFuaWMoIkludmFsaWQgRE1BIGNoYW5uZWwgZm9yIGlvcDFcbiIpOworCQlicmVhazsKKwljYXNlIGRtYV9zZXIwOgorCQlpZiAoZG1hbnIgPT0gNikKKwkJCXN0cm11eF9jZmcuZG1hNiA9IHJlZ2tfc3RybXV4X3NlcjA7CisJCWVsc2UgaWYgKGRtYW5yID09IDcpCisJCQlzdHJtdXhfY2ZnLmRtYTcgPSByZWdrX3N0cm11eF9zZXIwOworCQllbHNlCisJCQlwYW5pYygiSW52YWxpZCBETUEgY2hhbm5lbCBmb3Igc2VyMFxuIik7CisJCWJyZWFrOworCWNhc2UgZG1hX3NlcjE6CisJCWlmIChkbWFuciA9PSA0KQorCQkJc3RybXV4X2NmZy5kbWE0ID0gcmVna19zdHJtdXhfc2VyMTsKKwkJZWxzZSBpZiAoZG1hbnIgPT0gNSkKKwkJCXN0cm11eF9jZmcuZG1hNSA9IHJlZ2tfc3RybXV4X3NlcjE7CisJCWVsc2UKKwkJCXBhbmljKCJJbnZhbGlkIERNQSBjaGFubmVsIGZvciBzZXIxXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBkbWFfc2VyMjoKKwkJaWYgKGRtYW5yID09IDIpCisJCQlzdHJtdXhfY2ZnLmRtYTIgPSByZWdrX3N0cm11eF9zZXIyOworCQllbHNlIGlmIChkbWFuciA9PSAzKQorCQkJc3RybXV4X2NmZy5kbWEzID0gcmVna19zdHJtdXhfc2VyMjsKKwkJZWxzZQorCQkJcGFuaWMoIkludmFsaWQgRE1BIGNoYW5uZWwgZm9yIHNlcjJcbiIpOworCQlicmVhazsKKwljYXNlIGRtYV9zZXIzOgorCQlpZiAoZG1hbnIgPT0gOCkKKwkJCXN0cm11eF9jZmcuZG1hOCA9IHJlZ2tfc3RybXV4X3NlcjM7CisJCWVsc2UgaWYgKGRtYW5yID09IDkpCisJCQlzdHJtdXhfY2ZnLmRtYTkgPSByZWdrX3N0cm11eF9zZXIzOworCQllbHNlCisJCQlwYW5pYygiSW52YWxpZCBETUEgY2hhbm5lbCBmb3Igc2VyM1xuIik7CisJCWJyZWFrOworCWNhc2UgZG1hX3NzZXIwOgorCQlpZiAoZG1hbnIgPT0gNCkKKwkJCXN0cm11eF9jZmcuZG1hNCA9IHJlZ2tfc3RybXV4X3NzZXIwOworCQllbHNlIGlmIChkbWFuciA9PSA1KQorCQkJc3RybXV4X2NmZy5kbWE1ID0gcmVna19zdHJtdXhfc3NlcjA7CisJCWVsc2UKKwkJCXBhbmljKCJJbnZhbGlkIERNQSBjaGFubmVsIGZvciBzc2VyMFxuIik7CisJCWJyZWFrOworCWNhc2UgZG1hX3NzZXIxOgorCQlpZiAoZG1hbnIgPT0gNikKKwkJCXN0cm11eF9jZmcuZG1hNiA9IHJlZ2tfc3RybXV4X3NzZXIxOworCQllbHNlIGlmIChkbWFuciA9PSA3KQorCQkJc3RybXV4X2NmZy5kbWE3ID0gcmVna19zdHJtdXhfc3NlcjE7CisJCWVsc2UKKwkJCXBhbmljKCJJbnZhbGlkIERNQSBjaGFubmVsIGZvciBzc2VyMVxuIik7CisJCWJyZWFrOworCWNhc2UgZG1hX2F0YToKKwkJaWYgKGRtYW5yID09IDIpCisJCQlzdHJtdXhfY2ZnLmRtYTIgPSByZWdrX3N0cm11eF9hdGE7CisJCWVsc2UgaWYgKGRtYW5yID09IDMpCisJCQlzdHJtdXhfY2ZnLmRtYTMgPSByZWdrX3N0cm11eF9hdGE7CisJCWVsc2UKKwkJCXBhbmljKCJJbnZhbGlkIERNQSBjaGFubmVsIGZvciBhdGFcbiIpOworCQlicmVhazsKKwljYXNlIGRtYV9zdHJwOgorCQlpZiAoZG1hbnIgPT0gOCkKKwkJCXN0cm11eF9jZmcuZG1hOCA9IHJlZ2tfc3RybXV4X3N0cmNvcDsKKwkJZWxzZSBpZiAoZG1hbnIgPT0gOSkKKwkJCXN0cm11eF9jZmcuZG1hOSA9IHJlZ2tfc3RybXV4X3N0cmNvcDsKKwkJZWxzZQorCQkJcGFuaWMoIkludmFsaWQgRE1BIGNoYW5uZWwgZm9yIHN0cnBcbiIpOworCQlicmVhazsKKwljYXNlIGRtYV9leHQwOgorCQlpZiAoZG1hbnIgPT0gNikKKwkJCXN0cm11eF9jZmcuZG1hNiA9IHJlZ2tfc3RybXV4X2V4dDA7CisJCWVsc2UKKwkJCXBhbmljKCJJbnZhbGlkIERNQSBjaGFubmVsIGZvciBleHQwXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBkbWFfZXh0MToKKwkJaWYgKGRtYW5yID09IDcpCisJCQlzdHJtdXhfY2ZnLmRtYTcgPSByZWdrX3N0cm11eF9leHQxOworCQllbHNlCisJCQlwYW5pYygiSW52YWxpZCBETUEgY2hhbm5lbCBmb3IgZXh0MVxuIik7CisJCWJyZWFrOworCWNhc2UgZG1hX2V4dDI6CisJCWlmIChkbWFuciA9PSAyKQorCQkJc3RybXV4X2NmZy5kbWEyID0gcmVna19zdHJtdXhfZXh0MjsKKwkJZWxzZSBpZiAoZG1hbnIgPT0gOCkKKwkJCXN0cm11eF9jZmcuZG1hOCA9IHJlZ2tfc3RybXV4X2V4dDI7CisJCWVsc2UKKwkJCXBhbmljKCJJbnZhbGlkIERNQSBjaGFubmVsIGZvciBleHQyXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBkbWFfZXh0MzoKKwkJaWYgKGRtYW5yID09IDMpCisJCQlzdHJtdXhfY2ZnLmRtYTMgPSByZWdrX3N0cm11eF9leHQzOworCQllbHNlIGlmIChkbWFuciA9PSA5KQorCQkJc3RybXV4X2NmZy5kbWE5ID0gcmVna19zdHJtdXhfZXh0MjsKKwkJZWxzZQorCQkJcGFuaWMoIkludmFsaWQgRE1BIGNoYW5uZWwgZm9yIGV4dDJcbiIpOworCQlicmVhazsKKwl9CisKKwl1c2VkX2RtYV9jaGFubmVsc1tkbWFucl0gPSAxOworCXVzZWRfZG1hX2NoYW5uZWxzX3VzZXJzW2RtYW5yXSA9IGRldmljZV9pZDsKKwlSRUdfV1IoY29uZmlnLCByZWdpX2NvbmZpZywgcndfY2xrX2N0cmwsIGNsa19jdHJsKTsKKwlSRUdfV1Ioc3RybXV4LCByZWdpX3N0cm11eCwgcndfY2ZnLCBzdHJtdXhfY2ZnKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCit2b2lkIGNyaXN2MzJfZnJlZV9kbWEodW5zaWduZWQgaW50IGRtYW5yKQoreworCXNwaW5fbG9jaygmZG1hX2xvY2spOworCXVzZWRfZG1hX2NoYW5uZWxzW2RtYW5yXSA9IDA7CisJc3Bpbl91bmxvY2soJmRtYV9sb2NrKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2RyYW1faW5pdC5TIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21hY2gtZnMvZHJhbV9pbml0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZiYWQzMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2RyYW1faW5pdC5TCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogRFJBTS9TRFJBTSBpbml0aWFsaXphdGlvbiAtIGFsdGVyIHdpdGggY2FyZQorICogVGhpcyBmaWxlIGlzIGludGVuZGVkIHRvIGJlIGluY2x1ZGVkIGZyb20gb3RoZXIgYXNzZW1ibGVyIGZpbGVzCisgKgorICogTm90ZTogVGhpcyBmaWxlIG1heSBub3QgbW9kaWZ5IHI4IG9yIHI5IGJlY2F1c2UgdGhleSBhcmUgdXNlZCB0bworICogY2FycnkgaW5mb3JtYXRpb24gZnJvbSB0aGUgZGVjb21wcmVzc2VyIHRvIHRoZSBrZXJuZWwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNyBBeGlzIENvbW11bmljYXRpb25zIEFCCisgKgorICogQXV0aG9yczogIE1pa2FlbCBTdGFydmlrIDxzdGFydmlrQGF4aXMuY29tPgorICovCisKKy8qIEp1c3QgdG8gYmUgY2VydGFpbiB0aGUgY29uZmlnIGZpbGUgaXMgaW5jbHVkZWQsIHdlIGluY2x1ZGUgaXQgaGVyZQorICogZXhwbGljaXRlbHkgaW5zdGVhZCBvZiBkZXBlbmRpbmcgb24gaXQgYmVpbmcgaW5jbHVkZWQgaW4gdGhlIGZpbGUgdGhhdAorICogdXNlcyB0aGlzIGNvZGUuCisgKi8KKworI2luY2x1ZGUgPGh3cmVncy9hc20vcmVnX21hcF9hc20uaD4KKyNpbmNsdWRlIDxod3JlZ3MvYXNtL2JpZl9jb3JlX2RlZnNfYXNtLmg+CisKKwk7OyBXQVJOSU5HISBUaGUgcmVnaXN0ZXJzIHI4IGFuZCByOSBhcmUgdXNlZCBhcyBwYXJhbWV0ZXJzIGNhcnJ5aW5nCisJOzsgaW5mb3JtYXRpb24gZnJvbSB0aGUgZGVjb21wcmVzc29yIChpZiB0aGUga2VybmVsIHdhcyBjb21wcmVzc2VkKS4KKwk7OyBUaGV5IHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgY29kZSBiZWxvdy4KKworCTsgUmVmZXIgdG8gQklGIE1EUyBmb3IgYSBkZXNjcmlwdGlvbiBvZiBTRFJBTSBpbml0aWFsaXphdGlvbgorCisJOyBCYW5rIGNvbmZpZ3VyYXRpb24KKwltb3ZlLmQgICBSRUdfQUREUihiaWZfY29yZSwgcmVnaV9iaWZfY29yZSwgcndfc2RyYW1fY2ZnX2dycDApLCAkcjAKKwltb3ZlLmQgICBDT05GSUdfRVRSQVhfU0RSQU1fR1JQMF9DT05GSUcsICRyMQorCW1vdmUuZCAgICRyMSwgWyRyMF0KKwltb3ZlLmQgICBSRUdfQUREUihiaWZfY29yZSwgcmVnaV9iaWZfY29yZSwgcndfc2RyYW1fY2ZnX2dycDEpLCAkcjAKKwltb3ZlLmQgICBDT05GSUdfRVRSQVhfU0RSQU1fR1JQMV9DT05GSUcsICRyMQorCW1vdmUuZCAgICRyMSwgWyRyMF0KKworCTsgQ2FsY3VsYXRlIHZhbHVlIG9mIG1yc19kYXRhCisJOyBDQVMgbGF0ZW5jeSA9IDIgJiYgYnVzX3dpZHRoID0gMzIgPT4gMHg0MAorCTsgQ0FTIGxhdGVuY3kgPSAzICYmIGJ1c193aWR0aCA9IDMyID0+IDB4NjAKKwk7IENBUyBsYXRlbmN5ID0gMiAmJiBidXNfd2lkdGggPSAxNiA9PiAweDIwCisJOyBDQVMgbGF0ZW5jeSA9IDMgJiYgYnVzX3dpZHRoID0gMTYgPT4gMHgzMAorCisJOyBDaGVjayBpZiB2YWx1ZSBpcyBhbHJlYWR5IHN1cHBsaWVkIGluIGtlcm5lbCBjb25maWcKKwltb3ZlLmQgICBDT05GSUdfRVRSQVhfU0RSQU1fQ09NTUFORCwgJHIyCisJYm5lCSBfc2V0X3RpbWluZworCW5vcAorCisJbW92ZS5kICAgMHg0MCwgJHI0ICAgICAgIDsgQXNzdW1lIDMyIGJpdHMgYW5kIENBUyBsYXRlbmN5ID0gMgorCW1vdmUuZCAgIENPTkZJR19FVFJBWF9TRFJBTV9USU1JTkcsICRyMQorCWFuZC5kICAgIDB4MDcsICRyMSAgICAgICA7IEdldCBDQVMgbGF0ZW5jeQorCWNtcHEJIDIsICRyMQkJIDsgQ0wgPSAyID8KKwliZXEJIF9id19jaGVjaworCW5vcAorCW1vdmUuZCAgIDB4NjAsICRyNAorCitfYndfY2hlY2s6CisJOyBBc3N1bWUgdGhhdCBncm91cCAwIHdpZHRoIGlzIGVxdWFsIHRvIGdyb3VwIDEuIFRoaXMgYXNzdW1wdGlvbgorCTsgaXMgd3JvbmcgZm9yIGEgZ3JvdXAgMSBvbmx5IGhhcmR3YXJlIChzdWNoIGFzIHRoZSBncmFuZCBvbGQKKwk7IFN0b3JQb2ludCspLgorCW1vdmUuZCAgIENPTkZJR19FVFJBWF9TRFJBTV9HUlAwX0NPTkZJRywgJHIxCisJYW5kLmQgICAgMHgyMDAsICRyMQk7IERSQU0gd2lkdGggaXMgYml0IDkKKwliZXEgICAgICBfc2V0X3RpbWluZworCWxzbHEJIDIsICRyNAkJOyAgbXJzX2RhdGEgc3RhcnRzIGF0IGJpdCAyCisJbHNycSAgICAgMSwgJHI0CQk7ICAxNiBiaXRzLiBTaGlmdCBkb3duIHZhbHVlLgorCisJOyBTZXQgdGltaW5nIHBhcmFtZXRlcnMgKHJlZnJlc2ggb2ZmIHRvIGF2b2lkIEd1aW5uZXNzIFRSIDgzKQorX3NldF90aW1pbmc6CisJbW92ZS5kICAgQ09ORklHX0VUUkFYX1NEUkFNX1RJTUlORywgJHIxCisJYW5kLmQgICAgfigzIDw8IHJlZ19iaWZfY29yZV9yd19zZHJhbV90aW1pbmdfX19yZWZfX19sc2IpLCAkcjEKKwltb3ZlLmQgICBSRUdfQUREUihiaWZfY29yZSwgcmVnaV9iaWZfY29yZSwgcndfc2RyYW1fdGltaW5nKSwgJHIwCisJbW92ZS5kICAgJHIxLCBbJHIwXQorCisJOyBJc3N1ZSBOT1AgY29tbWFuZAorCW1vdmUuZCBSRUdfQUREUihiaWZfY29yZSwgcmVnaV9iaWZfY29yZSwgcndfc2RyYW1fY21kKSwgJHI1CisJbW92ZXEgcmVna19iaWZfY29yZV9ub3AsICRyMQorCW1vdmUuZCAkcjEsIFskcjVdCisKKwk7IFdhaXQgMjAwdXMKKwltb3ZlLmQgICAxMDAwMCwgJHIyCisxOglibmUgICAgICAxYgorCXN1YnEgICAgIDEsICRyMgorCisJOyBJc3N1ZSBpbml0aWFsaXphdGlvbiBjb21tYW5kIHNlcXVlbmNlCisJbGFwYyAgICAgX3NkcmFtX2NvbW1hbmRzX3N0YXJ0LCAkcjIKKwlsYXBjICAgICBfc2RyYW1fY29tbWFuZHNfZW5kLCAgJHIzCisxOgljbGVhci5kICAkcjYKKwltb3ZlLmIgICBbJHIyK10sICRyNgk7IExvYWQgY29tbWFuZAorCW9yLmQgICAgICRyNCwgJHI2CTsgQWRkIGNhbGN1bGF0ZWQgbXJzCisJbW92ZS5kICAgJHI2LCBbJHI1XQk7IFdyaXRlIHJ3X3NkcmFtX2NtZAorCTsgV2FpdCA4MCBucyBiZXR3ZWVuIGVhY2ggY29tbWFuZAorCW1vdmUuZAkgNDAwMCwgJHI3CisyOglibmUJIDJiCisJc3VicQkgMSwgJHI3CisJY21wLmQgICAgJHIyLCAkcjMJOyBMYXN0IGNvbW1hbmQ/CisJYm5lICAgICAgMWIKKwlub3AKKworCTsgU3RhcnQgcmVmcmVzaAorCW1vdmUuZCAgIENPTkZJR19FVFJBWF9TRFJBTV9USU1JTkcsICRyMQorCW1vdmUuZCAgIFJFR19BRERSKGJpZl9jb3JlLCByZWdpX2JpZl9jb3JlLCByd19zZHJhbV90aW1pbmcpLCAkcjAKKwltb3ZlLmQgICAkcjEsIFskcjBdCisKKwk7IEluaXRpYWxpemF0aW9uIGZpbmlzaGVkCisJYmEgICAgICAgX3NkcmFtX2NvbW1hbmRzX2VuZAorCW5vcAorCitfc2RyYW1fY29tbWFuZHNfc3RhcnQ6CisJLmJ5dGUgICByZWdrX2JpZl9jb3JlX3ByZSA7IFByZWNoYXJnZQorCS5ieXRlICAgcmVna19iaWZfY29yZV9yZWYgOyByZWZyZXNoCisJLmJ5dGUgICByZWdrX2JpZl9jb3JlX3JlZiA7IHJlZnJlc2gKKwkuYnl0ZSAgIHJlZ2tfYmlmX2NvcmVfcmVmIDsgcmVmcmVzaAorCS5ieXRlICAgcmVna19iaWZfY29yZV9yZWYgOyByZWZyZXNoCisJLmJ5dGUgICByZWdrX2JpZl9jb3JlX3JlZiA7IHJlZnJlc2gKKwkuYnl0ZSAgIHJlZ2tfYmlmX2NvcmVfcmVmIDsgcmVmcmVzaAorCS5ieXRlICAgcmVna19iaWZfY29yZV9yZWYgOyByZWZyZXNoCisJLmJ5dGUgICByZWdrX2JpZl9jb3JlX3JlZiA7IHJlZnJlc2gKKwkuYnl0ZSAgIHJlZ2tfYmlmX2NvcmVfbXJzIDsgbXJzCitfc2RyYW1fY29tbWFuZHNfZW5kOgpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdfc2V0dGluZ3MuUyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2h3X3NldHRpbmdzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkZTkzYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2h3X3NldHRpbmdzLlMKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIFRoaXMgdGFibGUgaXMgdXNlZCBieSBzb21lIHRvb2xzIHRvIGV4dHJhY3QgaGFyZHdhcmUgcGFyYW1ldGVycy4KKyAqIFRoZSB0YWJsZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGtlcm5lbCBhbmQgdGhlIGRlY29tcHJlc3Nvci4KKyAqIERvbid0IGZvcmdldCB0byB1cGRhdGUgdGhlIHRvb2xzIGlmIHlvdSBjaGFuZ2UgdGhpcyB0YWJsZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBBeGlzIENvbW11bmljYXRpb25zIEFCCisgKgorICogQXV0aG9yczogIE1pa2FlbCBTdGFydmlrIDxzdGFydmlrQGF4aXMuY29tPgorICovCisKKyNpbmNsdWRlIDxod3JlZ3MvYXNtL3JlZ19tYXBfYXNtLmg+CisjaW5jbHVkZSA8aHdyZWdzL2FzbS9iaWZfY29yZV9kZWZzX2FzbS5oPgorI2luY2x1ZGUgPGh3cmVncy9hc20vZ2lvX2RlZnNfYXNtLmg+CisKKwkuYXNjaWkgIkhXX1BBUkFNX01BR0lDIiA7IE1hZ2ljIG51bWJlcgorCS5kd29yZCAweGMwMDA0MDAwCTsgS2VybmVsIHN0YXJ0IGFkZHJlc3MKKworCTsgRGVidWcgcG9ydAorI2lmZGVmIENPTkZJR19FVFJBWF9ERUJVR19QT1JUMAorCS5kd29yZCAwCisjZWxpZiBkZWZpbmVkKENPTkZJR19FVFJBWF9ERUJVR19QT1JUMSkKKwkuZHdvcmQgMQorI2VsaWYgZGVmaW5lZChDT05GSUdfRVRSQVhfREVCVUdfUE9SVDIpCisJLmR3b3JkIDIKKyNlbGlmIGRlZmluZWQoQ09ORklHX0VUUkFYX0RFQlVHX1BPUlQzKQorCS5kd29yZCAzCisjZWxzZQorCS5kd29yZCA0IDsgTm8gZGVidWcKKyNlbmRpZgorCisJOyBSZWdpc3RlciB2YWx1ZXMKKwkuZHdvcmQgUkVHX0FERFIoYmlmX2NvcmUsIHJlZ2lfYmlmX2NvcmUsIHJ3X2dycDFfY2ZnKQorCS5kd29yZCBDT05GSUdfRVRSQVhfTUVNX0dSUDFfQ09ORklHCisJLmR3b3JkIFJFR19BRERSKGJpZl9jb3JlLCByZWdpX2JpZl9jb3JlLCByd19ncnAyX2NmZykKKwkuZHdvcmQgQ09ORklHX0VUUkFYX01FTV9HUlAyX0NPTkZJRworCS5kd29yZCBSRUdfQUREUihiaWZfY29yZSwgcmVnaV9iaWZfY29yZSwgcndfZ3JwM19jZmcpCisJLmR3b3JkIENPTkZJR19FVFJBWF9NRU1fR1JQM19DT05GSUcKKwkuZHdvcmQgUkVHX0FERFIoYmlmX2NvcmUsIHJlZ2lfYmlmX2NvcmUsIHJ3X2dycDRfY2ZnKQorCS5kd29yZCBDT05GSUdfRVRSQVhfTUVNX0dSUDRfQ09ORklHCisJLmR3b3JkIFJFR19BRERSKGJpZl9jb3JlLCByZWdpX2JpZl9jb3JlLCByd19zZHJhbV9jZmdfZ3JwMCkKKwkuZHdvcmQgQ09ORklHX0VUUkFYX1NEUkFNX0dSUDBfQ09ORklHCisJLmR3b3JkIFJFR19BRERSKGJpZl9jb3JlLCByZWdpX2JpZl9jb3JlLCByd19zZHJhbV9jZmdfZ3JwMSkKKwkuZHdvcmQgQ09ORklHX0VUUkFYX1NEUkFNX0dSUDFfQ09ORklHCisJLmR3b3JkIFJFR19BRERSKGJpZl9jb3JlLCByZWdpX2JpZl9jb3JlLCByd19zZHJhbV90aW1pbmcpCisJLmR3b3JkIENPTkZJR19FVFJBWF9TRFJBTV9USU1JTkcKKwkuZHdvcmQgUkVHX0FERFIoYmlmX2NvcmUsIHJlZ2lfYmlmX2NvcmUsIHJ3X3NkcmFtX2NtZCkKKwkuZHdvcmQgQ09ORklHX0VUUkFYX1NEUkFNX0NPTU1BTkQKKworCS5kd29yZCBSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByd19wYV9kb3V0KQorCS5kd29yZCBDT05GSUdfRVRSQVhfREVGX0dJT19QQV9PVVQKKwkuZHdvcmQgUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcndfcGFfb2UpCisJLmR3b3JkIENPTkZJR19FVFJBWF9ERUZfR0lPX1BBX09FCisJLmR3b3JkIFJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3BiX2RvdXQpCisJLmR3b3JkIENPTkZJR19FVFJBWF9ERUZfR0lPX1BCX09VVAorCS5kd29yZCBSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByd19wYl9vZSkKKwkuZHdvcmQgQ09ORklHX0VUUkFYX0RFRl9HSU9fUEJfT0UKKwkuZHdvcmQgUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcndfcGNfZG91dCkKKwkuZHdvcmQgQ09ORklHX0VUUkFYX0RFRl9HSU9fUENfT1VUCisJLmR3b3JkIFJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3BjX29lKQorCS5kd29yZCBDT05GSUdfRVRSQVhfREVGX0dJT19QQ19PRQorCS5kd29yZCBSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByd19wZF9kb3V0KQorCS5kd29yZCBDT05GSUdfRVRSQVhfREVGX0dJT19QRF9PVVQKKwkuZHdvcmQgUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcndfcGRfb2UpCisJLmR3b3JkIENPTkZJR19FVFJBWF9ERUZfR0lPX1BEX09FCisJLmR3b3JkIFJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3BlX2RvdXQpCisJLmR3b3JkIENPTkZJR19FVFJBWF9ERUZfR0lPX1BFX09VVAorCS5kd29yZCBSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByd19wZV9vZSkKKwkuZHdvcmQgQ09ORklHX0VUUkFYX0RFRl9HSU9fUEVfT0UKKworCS5kd29yZCAwIDsgTm8gbW9yZSByZWdpc3RlciB2YWx1ZXMKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2lvLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1mcy9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwM2EzYWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1mcy9pby5jCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgSS9PIHBpbnMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDcgQXhpcyBDb21tdW5pY2F0aW9ucyBBQi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3Bpbm11eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9naW9fZGVmcy5oPgorCisjaWZuZGVmIERFQlVHCisjZGVmaW5lIERFQlVHKHgpCisjZW5kaWYKKworc3RydWN0IGNyaXN2MzJfaW9wb3J0IGNyaXN2MzJfaW9wb3J0c1tdID0geworCXsKKwkJKHVuc2lnbmVkIGxvbmcgKilSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByd19wYV9vZSksCisJCSh1bnNpZ25lZCBsb25nICopUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcndfcGFfZG91dCksCisJCSh1bnNpZ25lZCBsb25nICopUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcl9wYV9kaW4pLAorCQk4CisJfSwKKwl7CisJCSh1bnNpZ25lZCBsb25nICopUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcndfcGJfb2UpLAorCQkodW5zaWduZWQgbG9uZyAqKVJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3BiX2RvdXQpLAorCQkodW5zaWduZWQgbG9uZyAqKVJFR19BRERSKGdpbywgcmVnaV9naW8sIHJfcGJfZGluKSwKKwkJMTgKKwl9LAorCXsKKwkJKHVuc2lnbmVkIGxvbmcgKilSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByd19wY19vZSksCisJCSh1bnNpZ25lZCBsb25nICopUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcndfcGNfZG91dCksCisJCSh1bnNpZ25lZCBsb25nICopUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcl9wY19kaW4pLAorCQkxOAorCX0sCisJeworCQkodW5zaWduZWQgbG9uZyAqKVJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3BkX29lKSwKKwkJKHVuc2lnbmVkIGxvbmcgKilSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByd19wZF9kb3V0KSwKKwkJKHVuc2lnbmVkIGxvbmcgKilSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByX3BkX2RpbiksCisJCTE4CisJfSwKKwl7CisJCSh1bnNpZ25lZCBsb25nICopUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcndfcGVfb2UpLAorCQkodW5zaWduZWQgbG9uZyAqKVJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3BlX2RvdXQpLAorCQkodW5zaWduZWQgbG9uZyAqKVJFR19BRERSKGdpbywgcmVnaV9naW8sIHJfcGVfZGluKSwKKwkJMTgKKwl9Cit9OworCisjZGVmaW5lIE5CUl9PRl9QT1JUUyBzaXplb2YoY3Jpc3YzMl9pb3BvcnRzKS9zaXplb2Yoc3RydWN0IGNyaXN2MzJfaW9wb3J0KQorCitzdHJ1Y3QgY3Jpc3YzMl9pb3BpbiBjcmlzdjMyX2xlZF9uZXQwX2dyZWVuOworc3RydWN0IGNyaXN2MzJfaW9waW4gY3Jpc3YzMl9sZWRfbmV0MF9yZWQ7CitzdHJ1Y3QgY3Jpc3YzMl9pb3BpbiBjcmlzdjMyX2xlZF9uZXQxX2dyZWVuOworc3RydWN0IGNyaXN2MzJfaW9waW4gY3Jpc3YzMl9sZWRfbmV0MV9yZWQ7CitzdHJ1Y3QgY3Jpc3YzMl9pb3BpbiBjcmlzdjMyX2xlZDJfZ3JlZW47CitzdHJ1Y3QgY3Jpc3YzMl9pb3BpbiBjcmlzdjMyX2xlZDJfcmVkOworc3RydWN0IGNyaXN2MzJfaW9waW4gY3Jpc3YzMl9sZWQzX2dyZWVuOworc3RydWN0IGNyaXN2MzJfaW9waW4gY3Jpc3YzMl9sZWQzX3JlZDsKKworLyogRHVtbXkgcG9ydCB1c2VkIHdoZW4gZ3JlZW4gTEVEIGFuZCByZWQgTEVEIGlzIG9uIHRoZSBzYW1lIGJpdCAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW9fZHVtbXk7CitzdGF0aWMgc3RydWN0IGNyaXN2MzJfaW9wb3J0IGR1bW15X3BvcnQgPSB7CisJJmlvX2R1bW15LAorCSZpb19kdW1teSwKKwkmaW9fZHVtbXksCisJMTgKK307CitzdGF0aWMgc3RydWN0IGNyaXN2MzJfaW9waW4gZHVtbXlfbGVkID0geworCSZkdW1teV9wb3J0LAorCTAKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNyaXN2MzJfaW9faW5pdCh2b2lkKQoreworCWludCByZXQgPSAwOworCisJdTMyIGk7CisKKwkvKiBMb2NrcyAqc2hvdWxkKiBiZSBkeW5hbWljYWxseSBpbml0aWFsaXplZC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjcmlzdjMyX2lvcG9ydHMpOyBpKyspCisJCXNwaW5fbG9ja19pbml0KCZjcmlzdjMyX2lvcG9ydHNbaV0ubG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmR1bW15X3BvcnQubG9jayk7CisKKwkvKiBJbml0aWFsaXplIExFRHMgKi8KKyNpZiAoZGVmaW5lZChDT05GSUdfRVRSQVhfTkJSX0xFRF9HUlBfT05FKSB8fCBkZWZpbmVkKENPTkZJR19FVFJBWF9OQlJfTEVEX0dSUF9UV08pKQorCXJldCArPQorCSAgICBjcmlzdjMyX2lvX2dldF9uYW1lKCZjcmlzdjMyX2xlZF9uZXQwX2dyZWVuLAorCQkJCUNPTkZJR19FVFJBWF9MRURfR19ORVQwKTsKKwljcmlzdjMyX2lvX3NldF9kaXIoJmNyaXN2MzJfbGVkX25ldDBfZ3JlZW4sIGNyaXN2MzJfaW9fZGlyX291dCk7CisJaWYgKHN0cmNtcChDT05GSUdfRVRSQVhfTEVEX0dfTkVUMCwgQ09ORklHX0VUUkFYX0xFRF9SX05FVDApKSB7CisJCXJldCArPQorCQkgICAgY3Jpc3YzMl9pb19nZXRfbmFtZSgmY3Jpc3YzMl9sZWRfbmV0MF9yZWQsCisJCQkJCUNPTkZJR19FVFJBWF9MRURfUl9ORVQwKTsKKwkJY3Jpc3YzMl9pb19zZXRfZGlyKCZjcmlzdjMyX2xlZF9uZXQwX3JlZCwgY3Jpc3YzMl9pb19kaXJfb3V0KTsKKwl9IGVsc2UKKwkJY3Jpc3YzMl9sZWRfbmV0MF9yZWQgPSBkdW1teV9sZWQ7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19FVFJBWF9OQlJfTEVEX0dSUF9UV08KKwlyZXQgKz0KKwkgICAgY3Jpc3YzMl9pb19nZXRfbmFtZSgmY3Jpc3YzMl9sZWRfbmV0MV9ncmVlbiwKKwkJCQlDT05GSUdfRVRSQVhfTEVEX0dfTkVUMSk7CisJY3Jpc3YzMl9pb19zZXRfZGlyKCZjcmlzdjMyX2xlZF9uZXQxX2dyZWVuLCBjcmlzdjMyX2lvX2Rpcl9vdXQpOworCWlmIChzdHJjbXAoQ09ORklHX0VUUkFYX0xFRF9HX05FVDEsIENPTkZJR19FVFJBWF9MRURfUl9ORVQxKSkgeworCQljcmlzdjMyX2lvX2dldF9uYW1lKCZjcmlzdjMyX2xlZF9uZXQxX3JlZCwKKwkJCQkgICAgQ09ORklHX0VUUkFYX0xFRF9SX05FVDEpOworCQljcmlzdjMyX2lvX3NldF9kaXIoJmNyaXN2MzJfbGVkX25ldDFfcmVkLCBjcmlzdjMyX2lvX2Rpcl9vdXQpOworCX0gZWxzZQorCQljcmlzdjMyX2xlZF9uZXQxX3JlZCA9IGR1bW15X2xlZDsKKyNlbmRpZgorCisJcmV0ICs9IGNyaXN2MzJfaW9fZ2V0X25hbWUoJmNyaXN2MzJfbGVkMl9ncmVlbiwgQ09ORklHX0VUUkFYX1YzMl9MRUQyRyk7CisJcmV0ICs9IGNyaXN2MzJfaW9fZ2V0X25hbWUoJmNyaXN2MzJfbGVkMl9yZWQsIENPTkZJR19FVFJBWF9WMzJfTEVEMlIpOworCXJldCArPSBjcmlzdjMyX2lvX2dldF9uYW1lKCZjcmlzdjMyX2xlZDNfZ3JlZW4sIENPTkZJR19FVFJBWF9WMzJfTEVEM0cpOworCXJldCArPSBjcmlzdjMyX2lvX2dldF9uYW1lKCZjcmlzdjMyX2xlZDNfcmVkLCBDT05GSUdfRVRSQVhfVjMyX0xFRDNSKTsKKworCWNyaXN2MzJfaW9fc2V0X2RpcigmY3Jpc3YzMl9sZWQyX2dyZWVuLCBjcmlzdjMyX2lvX2Rpcl9vdXQpOworCWNyaXN2MzJfaW9fc2V0X2RpcigmY3Jpc3YzMl9sZWQyX3JlZCwgY3Jpc3YzMl9pb19kaXJfb3V0KTsKKwljcmlzdjMyX2lvX3NldF9kaXIoJmNyaXN2MzJfbGVkM19ncmVlbiwgY3Jpc3YzMl9pb19kaXJfb3V0KTsKKwljcmlzdjMyX2lvX3NldF9kaXIoJmNyaXN2MzJfbGVkM19yZWQsIGNyaXN2MzJfaW9fZGlyX291dCk7CisKKwlyZXR1cm4gcmV0OworfQorCitfX2luaXRjYWxsKGNyaXN2MzJfaW9faW5pdCk7CisKK2ludCBjcmlzdjMyX2lvX2dldChzdHJ1Y3QgY3Jpc3YzMl9pb3BpbiAqaW9waW4sCisJCSAgIHVuc2lnbmVkIGludCBwb3J0LCB1bnNpZ25lZCBpbnQgcGluKQoreworCWlmIChwb3J0ID4gTkJSX09GX1BPUlRTKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocG9ydCA+IGNyaXN2MzJfaW9wb3J0c1twb3J0XS5waW5fY291bnQpCisJCXJldHVybiAtRUlOVkFMOworCisJaW9waW4tPmJpdCA9IDEgPDwgcGluOworCWlvcGluLT5wb3J0ID0gJmNyaXN2MzJfaW9wb3J0c1twb3J0XTsKKworCS8qIE9ubHkgYWxsb2NhdGUgcGlubXV4IGdwaW9waW5zIGlmIHBvcnQgIT0gUE9SVF9BIChwb3J0IDApICovCisJLyogTk9URSEgY3Jpc3YzMl9waW5tdXhfYWxsb2MgdGhpbmtzIFBPUlRfQiBpcyBwb3J0IDAgKi8KKwlpZiAocG9ydCAhPSAwICYmIGNyaXN2MzJfcGlubXV4X2FsbG9jKHBvcnQgLSAxLCBwaW4sIHBpbiwgcGlubXV4X2dwaW8pKQorCQlyZXR1cm4gLUVJTzsKKwlERUJVRyhwcmludGsoS0VSTl9ERUJVRyAiY3Jpc3YzMl9pb19nZXQ6IEFsbG9jYXRlZCBwaW4gJWQgb24gcG9ydCAlZFxuIiwKKwkJcGluLCBwb3J0KSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGNyaXN2MzJfaW9fZ2V0X25hbWUoc3RydWN0IGNyaXN2MzJfaW9waW4gKmlvcGluLCBjb25zdCBjaGFyICpuYW1lKQoreworCWludCBwb3J0OworCWludCBwaW47CisKKwlpZiAodG91cHBlcigqbmFtZSkgPT0gJ1AnKQorCQluYW1lKys7CisKKwlpZiAodG91cHBlcigqbmFtZSkgPCAnQScgfHwgdG91cHBlcigqbmFtZSkgPiAnRScpCisJCXJldHVybiAtRUlOVkFMOworCisJcG9ydCA9IHRvdXBwZXIoKm5hbWUpIC0gJ0EnOworCW5hbWUrKzsKKwlwaW4gPSBzaW1wbGVfc3RydG91bChuYW1lLCBOVUxMLCAxMCk7CisKKwlpZiAocGluIDwgMCB8fCBwaW4gPiBjcmlzdjMyX2lvcG9ydHNbcG9ydF0ucGluX2NvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlvcGluLT5iaXQgPSAxIDw8IHBpbjsKKwlpb3Bpbi0+cG9ydCA9ICZjcmlzdjMyX2lvcG9ydHNbcG9ydF07CisKKwkvKiBPbmx5IGFsbG9jYXRlIHBpbm11eCBncGlvcGlucyBpZiBwb3J0ICE9IFBPUlRfQSAocG9ydCAwKSAqLworCS8qIE5PVEUhIGNyaXN2MzJfcGlubXV4X2FsbG9jIHRoaW5rcyBQT1JUX0IgaXMgcG9ydCAwICovCisJaWYgKHBvcnQgIT0gMCAmJiBjcmlzdjMyX3Bpbm11eF9hbGxvYyhwb3J0IC0gMSwgcGluLCBwaW4sIHBpbm11eF9ncGlvKSkKKwkJcmV0dXJuIC1FSU87CisKKwlERUJVRyhwcmludGsoS0VSTl9ERUJVRworCQkiY3Jpc3YzMl9pb19nZXRfbmFtZTogQWxsb2NhdGVkIHBpbiAlZCBvbiBwb3J0ICVkXG4iLAorCQlwaW4sIHBvcnQpKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BDSQorLyogUENJIEkvTyBhY2Nlc3Mgc3R1ZmYgKi8KK3N0cnVjdCBjcmlzX2lvX29wZXJhdGlvbnMgKmNyaXNfaW9wcyA9IE5VTEw7CitFWFBPUlRfU1lNQk9MKGNyaXNfaW9wcyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL3Bpbm11eC5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21hY2gtZnMvcGlubXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcyMmFkOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL3Bpbm11eC5jCkBAIC0wLDAgKzEsMzA5IEBACisvKgorICogQWxsb2NhdG9yIGZvciBJL08gcGlucy4gQWxsIHBpbnMgYXJlIGFsbG9jYXRlZCB0byBHUElPIGF0IGJvb3R1cC4KKyAqIFVuYXNzaWduZWQgcGlucyBhbmQgR1BJTyBwaW5zIGNhbiBiZSBhbGxvY2F0ZWQgdG8gYSBmaXhlZCBpbnRlcmZhY2UKKyAqIG9yIHRoZSBJL08gcHJvY2Vzc29yIGluc3RlYWQuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDcgQXhpcyBDb21tdW5pY2F0aW9ucyBBQi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxod3JlZ3MvcmVnX21hcC5oPgorI2luY2x1ZGUgPGh3cmVncy9yZWdfcmR3ci5oPgorI2luY2x1ZGUgPHBpbm11eC5oPgorI2luY2x1ZGUgPGh3cmVncy9waW5tdXhfZGVmcy5oPgorCisjdW5kZWYgREVCVUcKKworI2RlZmluZSBQT1JUX1BJTlMgMTgKKyNkZWZpbmUgUE9SVFMgNAorCitzdGF0aWMgY2hhciBwaW5zW1BPUlRTXVtQT1JUX1BJTlNdOworc3RhdGljIERFRklORV9TUElOTE9DSyhwaW5tdXhfbG9jayk7CisKK3N0YXRpYyB2b2lkIGNyaXN2MzJfcGlubXV4X3NldChpbnQgcG9ydCk7CisKK2ludCBjcmlzdjMyX3Bpbm11eF9pbml0KHZvaWQpCit7CisJc3RhdGljIGludCBpbml0aWFsaXplZDsKKworCWlmICghaW5pdGlhbGl6ZWQpIHsKKwkJcmVnX3Bpbm11eF9yd19wYSBwYSA9IFJFR19SRChwaW5tdXgsIHJlZ2lfcGlubXV4LCByd19wYSk7CisJCWluaXRpYWxpemVkID0gMTsKKwkJUkVHX1dSX0lOVChwaW5tdXgsIHJlZ2lfcGlubXV4LCByd19od3Byb3QsIDApOworCQlwYS5wYTAgPSBwYS5wYTEgPSBwYS5wYTIgPSBwYS5wYTMgPQorCQkgICAgcGEucGE0ID0gcGEucGE1ID0gcGEucGE2ID0gcGEucGE3ID0gcmVna19waW5tdXhfeWVzOworCQlSRUdfV1IocGlubXV4LCByZWdpX3Bpbm11eCwgcndfcGEsIHBhKTsKKwkJY3Jpc3YzMl9waW5tdXhfYWxsb2MoUE9SVF9CLCAwLCBQT1JUX1BJTlMgLSAxLCBwaW5tdXhfZ3Bpbyk7CisJCWNyaXN2MzJfcGlubXV4X2FsbG9jKFBPUlRfQywgMCwgUE9SVF9QSU5TIC0gMSwgcGlubXV4X2dwaW8pOworCQljcmlzdjMyX3Bpbm11eF9hbGxvYyhQT1JUX0QsIDAsIFBPUlRfUElOUyAtIDEsIHBpbm11eF9ncGlvKTsKKwkJY3Jpc3YzMl9waW5tdXhfYWxsb2MoUE9SVF9FLCAwLCBQT1JUX1BJTlMgLSAxLCBwaW5tdXhfZ3Bpbyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludAorY3Jpc3YzMl9waW5tdXhfYWxsb2MoaW50IHBvcnQsIGludCBmaXJzdF9waW4sIGludCBsYXN0X3BpbiwgZW51bSBwaW5fbW9kZSBtb2RlKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwljcmlzdjMyX3Bpbm11eF9pbml0KCk7CisKKwlpZiAocG9ydCA+IFBPUlRTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwaW5tdXhfbG9jaywgZmxhZ3MpOworCisJZm9yIChpID0gZmlyc3RfcGluOyBpIDw9IGxhc3RfcGluOyBpKyspIHsKKwkJaWYgKChwaW5zW3BvcnRdW2ldICE9IHBpbm11eF9ub25lKQorCQkgICAgJiYgKHBpbnNbcG9ydF1baV0gIT0gcGlubXV4X2dwaW8pCisJCSAgICAmJiAocGluc1twb3J0XVtpXSAhPSBtb2RlKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGlubXV4X2xvY2ssIGZsYWdzKTsKKyNpZmRlZiBERUJVRworCQkJcGFuaWMoIlBpbm11eCBhbGxvYyBmYWlsZWQhXG4iKTsKKyNlbmRpZgorCQkJcmV0dXJuIC1FUEVSTTsKKwkJfQorCX0KKworCWZvciAoaSA9IGZpcnN0X3BpbjsgaSA8PSBsYXN0X3BpbjsgaSsrKQorCQlwaW5zW3BvcnRdW2ldID0gbW9kZTsKKworCWNyaXN2MzJfcGlubXV4X3NldChwb3J0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBpbm11eF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGNyaXN2MzJfcGlubXV4X2FsbG9jX2ZpeGVkKGVudW0gZml4ZWRfZnVuY3Rpb24gZnVuY3Rpb24pCit7CisJaW50IHJldCA9IC1FSU5WQUw7CisJY2hhciBzYXZlZFtzaXplb2YgcGluc107CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwaW5tdXhfbG9jaywgZmxhZ3MpOworCisJLyogU2F2ZSBpbnRlcm5hbCBkYXRhIGZvciByZWNvdmVyeSAqLworCW1lbWNweShzYXZlZCwgcGlucywgc2l6ZW9mIHBpbnMpOworCisJY3Jpc3YzMl9waW5tdXhfaW5pdCgpOwkvKiBNdXN0IGJlIGRvbmUgYmVmb3JlIHdlIHJlYWQgcndfaHdwcm90ICovCisKKwlyZWdfcGlubXV4X3J3X2h3cHJvdCBod3Byb3QgPSBSRUdfUkQocGlubXV4LCByZWdpX3Bpbm11eCwgcndfaHdwcm90KTsKKworCXN3aXRjaCAoZnVuY3Rpb24pIHsKKwljYXNlIHBpbm11eF9zZXIxOgorCQlyZXQgPSBjcmlzdjMyX3Bpbm11eF9hbGxvYyhQT1JUX0MsIDQsIDcsIHBpbm11eF9maXhlZCk7CisJCWh3cHJvdC5zZXIxID0gcmVna19waW5tdXhfeWVzOworCQlicmVhazsKKwljYXNlIHBpbm11eF9zZXIyOgorCQlyZXQgPSBjcmlzdjMyX3Bpbm11eF9hbGxvYyhQT1JUX0MsIDgsIDExLCBwaW5tdXhfZml4ZWQpOworCQlod3Byb3Quc2VyMiA9IHJlZ2tfcGlubXV4X3llczsKKwkJYnJlYWs7CisJY2FzZSBwaW5tdXhfc2VyMzoKKwkJcmV0ID0gY3Jpc3YzMl9waW5tdXhfYWxsb2MoUE9SVF9DLCAxMiwgMTUsIHBpbm11eF9maXhlZCk7CisJCWh3cHJvdC5zZXIzID0gcmVna19waW5tdXhfeWVzOworCQlicmVhazsKKwljYXNlIHBpbm11eF9zc2VyMDoKKwkJcmV0ID0gY3Jpc3YzMl9waW5tdXhfYWxsb2MoUE9SVF9DLCAwLCAzLCBwaW5tdXhfZml4ZWQpOworCQlyZXQgfD0gY3Jpc3YzMl9waW5tdXhfYWxsb2MoUE9SVF9DLCAxNiwgMTYsIHBpbm11eF9maXhlZCk7CisJCWh3cHJvdC5zc2VyMCA9IHJlZ2tfcGlubXV4X3llczsKKwkJYnJlYWs7CisJY2FzZSBwaW5tdXhfc3NlcjE6CisJCXJldCA9IGNyaXN2MzJfcGlubXV4X2FsbG9jKFBPUlRfRCwgMCwgNCwgcGlubXV4X2ZpeGVkKTsKKwkJaHdwcm90LnNzZXIxID0gcmVna19waW5tdXhfeWVzOworCQlicmVhazsKKwljYXNlIHBpbm11eF9hdGEwOgorCQlyZXQgPSBjcmlzdjMyX3Bpbm11eF9hbGxvYyhQT1JUX0QsIDUsIDcsIHBpbm11eF9maXhlZCk7CisJCXJldCB8PSBjcmlzdjMyX3Bpbm11eF9hbGxvYyhQT1JUX0QsIDE1LCAxNywgcGlubXV4X2ZpeGVkKTsKKwkJaHdwcm90LmF0YTAgPSByZWdrX3Bpbm11eF95ZXM7CisJCWJyZWFrOworCWNhc2UgcGlubXV4X2F0YTE6CisJCXJldCA9IGNyaXN2MzJfcGlubXV4X2FsbG9jKFBPUlRfRCwgMCwgNCwgcGlubXV4X2ZpeGVkKTsKKwkJcmV0IHw9IGNyaXN2MzJfcGlubXV4X2FsbG9jKFBPUlRfRSwgMTcsIDE3LCBwaW5tdXhfZml4ZWQpOworCQlod3Byb3QuYXRhMSA9IHJlZ2tfcGlubXV4X3llczsKKwkJYnJlYWs7CisJY2FzZSBwaW5tdXhfYXRhMjoKKwkJcmV0ID0gY3Jpc3YzMl9waW5tdXhfYWxsb2MoUE9SVF9DLCAxMSwgMTUsIHBpbm11eF9maXhlZCk7CisJCXJldCB8PSBjcmlzdjMyX3Bpbm11eF9hbGxvYyhQT1JUX0UsIDMsIDMsIHBpbm11eF9maXhlZCk7CisJCWh3cHJvdC5hdGEyID0gcmVna19waW5tdXhfeWVzOworCQlicmVhazsKKwljYXNlIHBpbm11eF9hdGEzOgorCQlyZXQgPSBjcmlzdjMyX3Bpbm11eF9hbGxvYyhQT1JUX0MsIDgsIDEwLCBwaW5tdXhfZml4ZWQpOworCQlyZXQgfD0gY3Jpc3YzMl9waW5tdXhfYWxsb2MoUE9SVF9DLCAwLCAyLCBwaW5tdXhfZml4ZWQpOworCQlod3Byb3QuYXRhMiA9IHJlZ2tfcGlubXV4X3llczsKKwkJYnJlYWs7CisJY2FzZSBwaW5tdXhfYXRhOgorCQlyZXQgPSBjcmlzdjMyX3Bpbm11eF9hbGxvYyhQT1JUX0IsIDAsIDE1LCBwaW5tdXhfZml4ZWQpOworCQlyZXQgfD0gY3Jpc3YzMl9waW5tdXhfYWxsb2MoUE9SVF9ELCA4LCAxNSwgcGlubXV4X2ZpeGVkKTsKKwkJaHdwcm90LmF0YSA9IHJlZ2tfcGlubXV4X3llczsKKwkJYnJlYWs7CisJY2FzZSBwaW5tdXhfZXRoMToKKwkJcmV0ID0gY3Jpc3YzMl9waW5tdXhfYWxsb2MoUE9SVF9FLCAwLCAxNywgcGlubXV4X2ZpeGVkKTsKKwkJaHdwcm90LmV0aDEgPSByZWdrX3Bpbm11eF95ZXM7CisJCWh3cHJvdC5ldGgxX21nbSA9IHJlZ2tfcGlubXV4X3llczsKKwkJYnJlYWs7CisJY2FzZSBwaW5tdXhfdGltZXI6CisJCXJldCA9IGNyaXN2MzJfcGlubXV4X2FsbG9jKFBPUlRfQywgMTYsIDE2LCBwaW5tdXhfZml4ZWQpOworCQlod3Byb3QudGltZXIgPSByZWdrX3Bpbm11eF95ZXM7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBpbm11eF9sb2NrLCBmbGFncyk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCFyZXQpCisJCVJFR19XUihwaW5tdXgsIHJlZ2lfcGlubXV4LCByd19od3Byb3QsIGh3cHJvdCk7CisJZWxzZQorCQltZW1jcHkocGlucywgc2F2ZWQsIHNpemVvZiBwaW5zKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBpbm11eF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGNyaXN2MzJfcGlubXV4X3NldChpbnQgcG9ydCkKK3sKKwlpbnQgaTsKKwlpbnQgZ3Bpb192YWwgPSAwOworCWludCBpb3BfdmFsID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBQT1JUX1BJTlM7IGkrKykgeworCQlpZiAocGluc1twb3J0XVtpXSA9PSBwaW5tdXhfZ3BpbykKKwkJCWdwaW9fdmFsIHw9ICgxIDw8IGkpOworCQllbHNlIGlmIChwaW5zW3BvcnRdW2ldID09IHBpbm11eF9pb3ApCisJCQlpb3BfdmFsIHw9ICgxIDw8IGkpOworCX0KKworCVJFR19XUklURShpbnQsIHJlZ2lfcGlubXV4ICsgUkVHX1JEX0FERFJfcGlubXV4X3J3X3BiX2dpbyArIDggKiBwb3J0LAorCQkgIGdwaW9fdmFsKTsKKwlSRUdfV1JJVEUoaW50LCByZWdpX3Bpbm11eCArIFJFR19SRF9BRERSX3Bpbm11eF9yd19wYl9pb3AgKyA4ICogcG9ydCwKKwkJICBpb3BfdmFsKTsKKworI2lmZGVmIERFQlVHCisJY3Jpc3YzMl9waW5tdXhfZHVtcCgpOworI2VuZGlmCit9CisKK2ludCBjcmlzdjMyX3Bpbm11eF9kZWFsbG9jKGludCBwb3J0LCBpbnQgZmlyc3RfcGluLCBpbnQgbGFzdF9waW4pCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWNyaXN2MzJfcGlubXV4X2luaXQoKTsKKworCWlmIChwb3J0ID4gUE9SVFMpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBpbm11eF9sb2NrLCBmbGFncyk7CisKKwlmb3IgKGkgPSBmaXJzdF9waW47IGkgPD0gbGFzdF9waW47IGkrKykKKwkJcGluc1twb3J0XVtpXSA9IHBpbm11eF9ub25lOworCisJY3Jpc3YzMl9waW5tdXhfc2V0KHBvcnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBpbm11eF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGNyaXN2MzJfcGlubXV4X2RlYWxsb2NfZml4ZWQoZW51bSBmaXhlZF9mdW5jdGlvbiBmdW5jdGlvbikKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwljaGFyIHNhdmVkW3NpemVvZiBwaW5zXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBpbm11eF9sb2NrLCBmbGFncyk7CisKKwkvKiBTYXZlIGludGVybmFsIGRhdGEgZm9yIHJlY292ZXJ5ICovCisJbWVtY3B5KHNhdmVkLCBwaW5zLCBzaXplb2YgcGlucyk7CisKKwljcmlzdjMyX3Bpbm11eF9pbml0KCk7CS8qIE11c3QgYmUgZG9uZSBiZWZvcmUgd2UgcmVhZCByd19od3Byb3QgKi8KKworCXJlZ19waW5tdXhfcndfaHdwcm90IGh3cHJvdCA9IFJFR19SRChwaW5tdXgsIHJlZ2lfcGlubXV4LCByd19od3Byb3QpOworCisJc3dpdGNoIChmdW5jdGlvbikgeworCWNhc2UgcGlubXV4X3NlcjE6CisJCXJldCA9IGNyaXN2MzJfcGlubXV4X2RlYWxsb2MoUE9SVF9DLCA0LCA3KTsKKwkJaHdwcm90LnNlcjEgPSByZWdrX3Bpbm11eF9ubzsKKwkJYnJlYWs7CisJY2FzZSBwaW5tdXhfc2VyMjoKKwkJcmV0ID0gY3Jpc3YzMl9waW5tdXhfZGVhbGxvYyhQT1JUX0MsIDgsIDExKTsKKwkJaHdwcm90LnNlcjIgPSByZWdrX3Bpbm11eF9ubzsKKwkJYnJlYWs7CisJY2FzZSBwaW5tdXhfc2VyMzoKKwkJcmV0ID0gY3Jpc3YzMl9waW5tdXhfZGVhbGxvYyhQT1JUX0MsIDEyLCAxNSk7CisJCWh3cHJvdC5zZXIzID0gcmVna19waW5tdXhfbm87CisJCWJyZWFrOworCWNhc2UgcGlubXV4X3NzZXIwOgorCQlyZXQgPSBjcmlzdjMyX3Bpbm11eF9kZWFsbG9jKFBPUlRfQywgMCwgMyk7CisJCXJldCB8PSBjcmlzdjMyX3Bpbm11eF9kZWFsbG9jKFBPUlRfQywgMTYsIDE2KTsKKwkJaHdwcm90LnNzZXIwID0gcmVna19waW5tdXhfbm87CisJCWJyZWFrOworCWNhc2UgcGlubXV4X3NzZXIxOgorCQlyZXQgPSBjcmlzdjMyX3Bpbm11eF9kZWFsbG9jKFBPUlRfRCwgMCwgNCk7CisJCWh3cHJvdC5zc2VyMSA9IHJlZ2tfcGlubXV4X25vOworCQlicmVhazsKKwljYXNlIHBpbm11eF9hdGEwOgorCQlyZXQgPSBjcmlzdjMyX3Bpbm11eF9kZWFsbG9jKFBPUlRfRCwgNSwgNyk7CisJCXJldCB8PSBjcmlzdjMyX3Bpbm11eF9kZWFsbG9jKFBPUlRfRCwgMTUsIDE3KTsKKwkJaHdwcm90LmF0YTAgPSByZWdrX3Bpbm11eF9ubzsKKwkJYnJlYWs7CisJY2FzZSBwaW5tdXhfYXRhMToKKwkJcmV0ID0gY3Jpc3YzMl9waW5tdXhfZGVhbGxvYyhQT1JUX0QsIDAsIDQpOworCQlyZXQgfD0gY3Jpc3YzMl9waW5tdXhfZGVhbGxvYyhQT1JUX0UsIDE3LCAxNyk7CisJCWh3cHJvdC5hdGExID0gcmVna19waW5tdXhfbm87CisJCWJyZWFrOworCWNhc2UgcGlubXV4X2F0YTI6CisJCXJldCA9IGNyaXN2MzJfcGlubXV4X2RlYWxsb2MoUE9SVF9DLCAxMSwgMTUpOworCQlyZXQgfD0gY3Jpc3YzMl9waW5tdXhfZGVhbGxvYyhQT1JUX0UsIDMsIDMpOworCQlod3Byb3QuYXRhMiA9IHJlZ2tfcGlubXV4X25vOworCQlicmVhazsKKwljYXNlIHBpbm11eF9hdGEzOgorCQlyZXQgPSBjcmlzdjMyX3Bpbm11eF9kZWFsbG9jKFBPUlRfQywgOCwgMTApOworCQlyZXQgfD0gY3Jpc3YzMl9waW5tdXhfZGVhbGxvYyhQT1JUX0MsIDAsIDIpOworCQlod3Byb3QuYXRhMiA9IHJlZ2tfcGlubXV4X25vOworCQlicmVhazsKKwljYXNlIHBpbm11eF9hdGE6CisJCXJldCA9IGNyaXN2MzJfcGlubXV4X2RlYWxsb2MoUE9SVF9CLCAwLCAxNSk7CisJCXJldCB8PSBjcmlzdjMyX3Bpbm11eF9kZWFsbG9jKFBPUlRfRCwgOCwgMTUpOworCQlod3Byb3QuYXRhID0gcmVna19waW5tdXhfbm87CisJCWJyZWFrOworCWNhc2UgcGlubXV4X2V0aDE6CisJCXJldCA9IGNyaXN2MzJfcGlubXV4X2RlYWxsb2MoUE9SVF9FLCAwLCAxNyk7CisJCWh3cHJvdC5ldGgxID0gcmVna19waW5tdXhfbm87CisJCWh3cHJvdC5ldGgxX21nbSA9IHJlZ2tfcGlubXV4X25vOworCQlicmVhazsKKwljYXNlIHBpbm11eF90aW1lcjoKKwkJcmV0ID0gY3Jpc3YzMl9waW5tdXhfZGVhbGxvYyhQT1JUX0MsIDE2LCAxNik7CisJCWh3cHJvdC50aW1lciA9IHJlZ2tfcGlubXV4X25vOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaW5tdXhfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICghcmV0KQorCQlSRUdfV1IocGlubXV4LCByZWdpX3Bpbm11eCwgcndfaHdwcm90LCBod3Byb3QpOworCWVsc2UKKwkJbWVtY3B5KHBpbnMsIHNhdmVkLCBzaXplb2YgcGlucyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaW5tdXhfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBjcmlzdjMyX3Bpbm11eF9kdW1wKHZvaWQpCit7CisJaW50IGksIGo7CisKKwljcmlzdjMyX3Bpbm11eF9pbml0KCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUE9SVFM7IGkrKykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiUG9ydCAlY1xuIiwgJ0InICsgaSk7CisJCWZvciAoaiA9IDA7IGogPCBQT1JUX1BJTlM7IGorKykKKwkJCXByaW50ayhLRVJOX0RFQlVHICIgIFBpbiAlZCA9ICVkXG4iLCBqLCBwaW5zW2ldW2pdKTsKKwl9Cit9CisKK19faW5pdGNhbGwoY3Jpc3YzMl9waW5tdXhfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1mcy92Y3NfaG9vay5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21hY2gtZnMvdmNzX2hvb2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTNiMTBmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21hY2gtZnMvdmNzX2hvb2suYwpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENhbGwgc2ltdWxhdG9yIGhvb2suIFRoaXMgaXMgdGhlIHBhcnQgcnVubmluZyBpbiB0aGUKKyAqIHNpbXVsYXRlZCBwcm9ncmFtLgorICovCisKKyNpbmNsdWRlICJ2Y3NfaG9vay5oIgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoLXYzMi9od3JlZ3MvcmVnX21hcC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoLXYzMi9od3JlZ3MvaW50cl92ZWN0X2RlZnMuaD4KKworI2RlZmluZSBIT09LX1RSSUdfQUREUiAgICAgMHhiNzAwMDAwMAkvKiBob29rIGN2bG9nIG1vZGVsIHJlZyBhZGRyZXNzICovCisjZGVmaW5lIEhPT0tfTUVNX0JBU0VfQUREUiAweGEwMDAwMDAwCS8qIGNzcDQgKHNoYXJlZCBtZW0pIGJhc2UgYWRkciAqLworCisjZGVmaW5lIEhPT0tfREFUQShvZmZzZXQpICgodW5zaWduZWQgKilIT09LX01FTV9CQVNFX0FERFIpW29mZnNldF0KKyNkZWZpbmUgVkhPT0tfREFUQShvZmZzZXQpICgodm9sYXRpbGUgdW5zaWduZWQgKilIT09LX01FTV9CQVNFX0FERFIpW29mZnNldF0KKyNkZWZpbmUgSE9PS19UUklHKGZ1bmNpZCkgXAorCWRvIHsgXAorCQkqKCh1bnNpZ25lZCAqKSBIT09LX1RSSUdfQUREUikgPSBmdW5jaWQ7IFwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBIT09LX0RBVEFfQllURShvZmZzZXQpICgodW5zaWduZWQgY2hhciAqKUhPT0tfTUVNX0JBU0VfQUREUilbb2Zmc2V0XQorCitpbnQgaG9va19jYWxsKHVuc2lnbmVkIGlkLCB1bnNpZ25lZCBwY250LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwl1bnNpZ25lZCBpOworCXVuc2lnbmVkIHJldDsKKyNpZmRlZiBVU0lOR19TT1MKKwlQUkVFTVBUX09GRl9TQVZFKCk7CisjZW5kaWYKKworCS8qIHBhc3MgcGFyYW1ldGVycyAqLworCUhPT0tfREFUQSgwKSA9IGlkOworCisJLyogSGF2ZSB0byBtYWtlIGhvb2tfcHJpbnRfc3RyIGEgc3BlY2lhbCBjYXNlIHNpbmNlIHdlIGNhbGwgd2l0aCBhCisJICogcGFyYW1ldGVyIG9mIGJ5dGUgdHlwZS4gU2hvdWxkIHBlcmhhcHMgYmUgYSBzZXBhcmF0ZQorCSAqIGhvb2tfY2FsbC4gKi8KKworCWlmIChpZCA9PSBob29rX3ByaW50X3N0cikgeworCQlpbnQgaTsKKwkJY2hhciAqc3RyOworCisJCUhPT0tfREFUQSgxKSA9IHBjbnQ7CisKKwkJdmFfc3RhcnQoYXAsIHBjbnQpOworCQlzdHIgPSAoY2hhciAqKXZhX2FyZyhhcCwgdW5zaWduZWQpOworCisJCWZvciAoaSA9IDA7IGkgIT0gcGNudDsgaSsrKQorCQkJSE9PS19EQVRBX0JZVEUoOCArIGkpID0gc3RyW2ldOworCisJCUhPT0tfREFUQV9CWVRFKDggKyBpKSA9IDA7CS8qIG51bGwgYnl0ZSAqLworCX0gZWxzZSB7CisJCXZhX3N0YXJ0KGFwLCBwY250KTsKKwkJZm9yIChpID0gMTsgaSA8PSBwY250OyBpKyspCisJCQlIT09LX0RBVEEoaSkgPSB2YV9hcmcoYXAsIHVuc2lnbmVkKTsKKwkJdmFfZW5kKGFwKTsKKwl9CisKKwkvKiByZWFkIGZyb20gbWVtIHRvIG1ha2Ugc3VyZSBkYXRhIGhhcyBwcm9wYWdhdGVkIHRvIG1lbW9yeSBiZWZvcmUKKwkgKiB0cmlnZ2luZyAqLworCXJldCA9ICooKHZvbGF0aWxlIHVuc2lnbmVkICopSE9PS19NRU1fQkFTRV9BRERSKTsKKworCS8qIHRyaWdnZXIgaG9vayAqLworCUhPT0tfVFJJRyhpZCk7CisKKwkvKiB3YWl0IGZvciBjYWxsIHRvIGZpbmlzaCAqLworCXdoaWxlIChWSE9PS19EQVRBKDApID4gMCkgOworCisJLyogZXh0cmFjdCByZXR1cm4gdmFsdWUgKi8KKworCXJldCA9IFZIT09LX0RBVEEoMSk7CisKKyNpZmRlZiBVU0lOR19TT1MKKwlQUkVFTVBUX1JFU1RPUkUoKTsKKyNlbmRpZgorCXJldHVybiByZXQ7Cit9CisKK3Vuc2lnbmVkIGhvb2tfYnVmKHVuc2lnbmVkIGkpCit7CisJcmV0dXJuIChIT09LX0RBVEEoaSkpOworfQorCit2b2lkIHByaW50X3N0cihjb25zdCBjaGFyICpzdHIpCit7CisJaW50IGk7CisJLyogZmluZCBudWxsIGF0IGVuZCBvZiBzdHJpbmcgKi8KKwlmb3IgKGkgPSAxOyBzdHJbaV07IGkrKykgOworCWhvb2tfY2FsbChob29rX3ByaW50X3N0ciwgaSwgc3RyKTsKK30KKwordm9pZCBDUFVfS0lDS19ET0codm9pZCkKK3sKKwkodm9pZClob29rX2NhbGwoaG9va19raWNrX2RvZywgMCk7Cit9CisKK3ZvaWQgQ1BVX1dBVENIRE9HX1RJTUVPVVQodW5zaWduZWQgdCkKK3sKKwkodm9pZClob29rX2NhbGwoaG9va19kb2dfdGltZW91dCwgMSwgdCk7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL3Zjc19ob29rLmggYi9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1mcy92Y3NfaG9vay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMDBiOWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvbWFjaC1mcy92Y3NfaG9vay5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDYWxsIHNpbXVsYXRvciBob29rIGZ1bmN0aW9ucworICovCisKKyNpZm5kZWYgSE9PS19ICisjZGVmaW5lIEhPT0tfSAorCitpbnQgaG9va19jYWxsKHVuc2lnbmVkIGlkLCB1bnNpZ25lZCBwY250LCAuLi4pOworCitlbnVtIGhvb2tfaWRzIHsKKyAgaG9va19kZWJ1Z19vbiA9IDEsCisgIGhvb2tfZGVidWdfb2ZmLAorICBob29rX3N0b3Bfc2ltX29rLAorICBob29rX3N0b3Bfc2ltX2ZhaWwsCisgIGhvb2tfYWxsb2Nfc2hhcmVkLAorICBob29rX3B0cl9zaGFyZWQsCisgIGhvb2tfZnJlZV9zaGFyZWQsCisgIGhvb2tfZmlsZTJzaGFyZWQsCisgIGhvb2tfY21wX3NoYXJlZCwKKyAgaG9va19wcmludF9wYXJhbXMsCisgIGhvb2tfc2ltX3RpbWUsCisgIGhvb2tfc3RvcF9zaW0sCisgIGhvb2tfa2lja19kb2csCisgIGhvb2tfZG9nX3RpbWVvdXQsCisgIGhvb2tfcmFuZCwKKyAgaG9va19zcmFuZCwKKyAgaG9va19yYW5kX3JhbmdlLAorICBob29rX3ByaW50X3N0ciwKKyAgaG9va19wcmludF9oZXgsCisgIGhvb2tfY21wX29mZnNldF9zaGFyZWQsCisgIGhvb2tfZmlsbF9yYW5kb21fc2hhcmVkLAorICBob29rX2FsbG9jX3JhbmRvbV9kYXRhLAorICBob29rX2NhbGxvY19yYW5kb21fZGF0YSwKKyAgaG9va19wcmludF9pbnQsCisgIGhvb2tfcHJpbnRfdWludCwKKyAgaG9va19mcHV0YywKKyAgaG9va19pbml0X2ZkLAorICBob29rX3NicmsKKworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvbW0vTWFrZWZpbGUgYi9hcmNoL2NyaXMvYXJjaC12MzIvbW0vTWFrZWZpbGUKaW5kZXggOTE0NmY4OC4uMGI4MDFmMiAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL21tL01ha2VmaWxlCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tbS9NYWtlZmlsZQpAQCAtMSwzICsxLDQgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eC9jcmlzIHBhcnRzIG9mIHRoZSBtZW1vcnkgbWFuYWdlci4KIAotb2JqLXkJIDo9IG1tdS5vIGluaXQubyB0bGIubyBpbnRtZW0ubworb2JqLXkJICs9IG1tdS5vIGluaXQubyB0bGIubyBpbnRtZW0ubworb2JqLSQoQ09ORklHX0VUUkFYX0wyQ0FDSEUpICAgICs9IGwyY2FjaGUubwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL21tL2luaXQuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tbS9pbml0LmMKaW5kZXggYTg0YmE3Zi4uNWE5YWM1OCAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL21tL2luaXQuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvbW0vaW5pdC5jCkBAIC02NSw3ICs2NSw3IEBACiAJCSAgICAgICBSRUdfU1RBVEUobW11LCByd19tbV9jZmcsIHNlZ19kLCBwYWdlKSAgIHwKIAkJICAgICAgIFJFR19TVEFURShtbXUsIHJ3X21tX2NmZywgc2VnX2MsIGxpbmVhcikgfAogCQkgICAgICAgUkVHX1NUQVRFKG1tdSwgcndfbW1fY2ZnLCBzZWdfYiwgbGluZWFyKSB8Ci0jaWZuZGVmIENPTkZJR19FVFJBWEZTX1NJTQorI2lmbmRlZiBDT05GSUdfRVRSQVhfVkNTX1NJTQogICAgICAgICAgICAgICAgICAgICAgICBSRUdfU1RBVEUobW11LCByd19tbV9jZmcsIHNlZ19hLCBwYWdlKSAgIHwKICNlbHNlCiAJCSAgICAgICBSRUdfU1RBVEUobW11LCByd19tbV9jZmcsIHNlZ19hLCBsaW5lYXIpIHwKQEAgLTg0LDEzICs4NCw5IEBACiAJbW11X2tiYXNlX2hpID0gKCBSRUdfRklFTEQobW11LCByd19tbV9rYmFzZV9oaSwgYmFzZV9mLCAweDApIHwKIAkJCSBSRUdfRklFTEQobW11LCByd19tbV9rYmFzZV9oaSwgYmFzZV9lLCAweDgpIHwKIAkJCSBSRUdfRklFTEQobW11LCByd19tbV9rYmFzZV9oaSwgYmFzZV9kLCAweDApIHwKLSNpZm5kZWYgQ09ORklHX0VUUkFYRlNfU0lNCiAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX0ZJRUxEKG1tdSwgcndfbW1fa2Jhc2VfaGksIGJhc2VfYywgMHg0KSB8Ci0jZWxzZQotCQkJIFJFR19GSUVMRChtbXUsIHJ3X21tX2tiYXNlX2hpLCBiYXNlX2MsIDB4MCkgfAotI2VuZGlmCiAJCQkgUkVHX0ZJRUxEKG1tdSwgcndfbW1fa2Jhc2VfaGksIGJhc2VfYiwgMHhiKSB8Ci0jaWZuZGVmIENPTkZJR19FVFJBWEZTX1NJTQorI2lmbmRlZiBDT05GSUdfRVRSQVhfVkNTX1NJTQogCQkJIFJFR19GSUVMRChtbXUsIHJ3X21tX2tiYXNlX2hpLCBiYXNlX2EsIDB4MCkgfAogI2Vsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfRklFTEQobW11LCByd19tbV9rYmFzZV9oaSwgYmFzZV9hLCAweGEpIHwKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9tbS9pbnRtZW0uYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tbS9pbnRtZW0uYwppbmRleCA0MWVlN2Y3Li45ZThiNjljIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvbW0vaW50bWVtLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21tL2ludG1lbS5jCkBAIC03LDExICs3LDE3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9tZW1tYXAuaD4KKyNpbmNsdWRlIDxtZW1tYXAuaD4KIAogI2RlZmluZSBTVEFUVVNfRlJFRSAwCiAjZGVmaW5lIFNUQVRVU19BTExPQ0FURUQgMQogCisjaWZkZWYgQ09ORklHX0VUUkFYX0wyQ0FDSEUKKyNkZWZpbmUgUkVTRVJWRURfU0laRSA2NioxMDI0CisjZWxzZQorI2RlZmluZSBSRVNFUlZFRF9TSVpFIDAKKyNlbmRpZgorCiBzdHJ1Y3QgaW50bWVtX2FsbG9jYXRpb24gewogCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CiAJdW5zaWduZWQgaW50IHNpemU7CkBAIC0zMCw5ICszNiwxMCBAQAogCQlzdHJ1Y3QgaW50bWVtX2FsbG9jYXRpb24qIGFsbG9jID0KIAkJICAoc3RydWN0IGludG1lbV9hbGxvY2F0aW9uKilrbWFsbG9jKHNpemVvZiAqYWxsb2MsIEdGUF9LRVJORUwpOwogCQlJTklUX0xJU1RfSEVBRCgmaW50bWVtX2FsbG9jYXRpb25zKTsKLQkJaW50bWVtX3ZpcnR1YWwgPSBpb3JlbWFwKE1FTV9JTlRNRU1fU1RBUlQsIE1FTV9JTlRNRU1fU0laRSk7CisJCWludG1lbV92aXJ0dWFsID0gaW9yZW1hcChNRU1fSU5UTUVNX1NUQVJUICsgUkVTRVJWRURfU0laRSwKKwkJCQkJIE1FTV9JTlRNRU1fU0laRSAtIFJFU0VSVkVEX1NJWkUpOwogCQlpbml0aWF0ZWQgPSAxOwotCQlhbGxvYy0+c2l6ZSA9IE1FTV9JTlRNRU1fU0laRTsKKwkJYWxsb2MtPnNpemUgPSBNRU1fSU5UTUVNX1NJWkUgLSBSRVNFUlZFRF9TSVpFOwogCQlhbGxvYy0+b2Zmc2V0ID0gMDsKIAkJYWxsb2MtPnN0YXR1cyA9IFNUQVRVU19GUkVFOwogCQlsaXN0X2FkZF90YWlsKCZhbGxvYy0+ZW50cnksICZpbnRtZW1fYWxsb2NhdGlvbnMpOwpAQCAtNTksMTkgKzY2LDIzIEBACiAJCQkJCShzdHJ1Y3QgaW50bWVtX2FsbG9jYXRpb24qKQogCQkJCQlrbWFsbG9jKHNpemVvZiAqYWxsb2MsIEdGUF9BVE9NSUMpOwogCQkJCWFsbG9jLT5zdGF0dXMgPSBTVEFUVVNfRlJFRTsKLQkJCQlhbGxvYy0+c2l6ZSA9IGFsbG9jYXRpb24tPnNpemUgLSBzaXplIC0gYWxpZ25tZW50OwotCQkJCWFsbG9jLT5vZmZzZXQgPSBhbGxvY2F0aW9uLT5vZmZzZXQgKyBzaXplOworCQkJCWFsbG9jLT5zaXplID0gYWxsb2NhdGlvbi0+c2l6ZSAtIHNpemUgLQorCQkJCQlhbGlnbm1lbnQ7CisJCQkJYWxsb2MtPm9mZnNldCA9IGFsbG9jYXRpb24tPm9mZnNldCArIHNpemUgKworCQkJCQlhbGlnbm1lbnQ7CiAJCQkJbGlzdF9hZGQoJmFsbG9jLT5lbnRyeSwgJmFsbG9jYXRpb24tPmVudHJ5KTsKIAogCQkJCWlmIChhbGlnbm1lbnQpIHsKLQkJCQkJc3RydWN0IGludG1lbV9hbGxvY2F0aW9uKiB0bXA7Ci0JCQkJCXRtcCA9IChzdHJ1Y3QgaW50bWVtX2FsbG9jYXRpb24qKQotCQkJCQkJa21hbGxvYyhzaXplb2YgKnRtcCwgR0ZQX0FUT01JQyk7CisJCQkJCXN0cnVjdCBpbnRtZW1fYWxsb2NhdGlvbiAqdG1wOworCQkJCQl0bXAgPSAoc3RydWN0IGludG1lbV9hbGxvY2F0aW9uICopCisJCQkJCQlrbWFsbG9jKHNpemVvZiAqdG1wLAorCQkJCQkJCUdGUF9BVE9NSUMpOwogCQkJCQl0bXAtPm9mZnNldCA9IGFsbG9jYXRpb24tPm9mZnNldDsKIAkJCQkJdG1wLT5zaXplID0gYWxpZ25tZW50OwogCQkJCQl0bXAtPnN0YXR1cyA9IFNUQVRVU19GUkVFOwogCQkJCQlhbGxvY2F0aW9uLT5vZmZzZXQgKz0gYWxpZ25tZW50OwotCQkJCQlsaXN0X2FkZF90YWlsKCZ0bXAtPmVudHJ5LCAmYWxsb2NhdGlvbi0+ZW50cnkpOworCQkJCQlsaXN0X2FkZF90YWlsKCZ0bXAtPmVudHJ5LAorCQkJCQkJJmFsbG9jYXRpb24tPmVudHJ5KTsKIAkJCQl9CiAJCQl9CiAJCQlhbGxvY2F0aW9uLT5zdGF0dXMgPSBTVEFUVVNfQUxMT0NBVEVEOwpAQCAtOTYsMjIgKzEwNywyNCBAQAogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGFsbG9jYXRpb24sIHRtcCwgJmludG1lbV9hbGxvY2F0aW9ucywgZW50cnkpIHsKIAkJaWYgKGFsbG9jYXRpb24tPm9mZnNldCA9PSAoaW50KShhZGRyIC0gaW50bWVtX3ZpcnR1YWwpKSB7Ci0JCQlzdHJ1Y3QgaW50bWVtX2FsbG9jYXRpb24qIHByZXYgPQorCQkJc3RydWN0IGludG1lbV9hbGxvY2F0aW9uICpwcmV2ID0KIAkJCSAgbGlzdF9lbnRyeShhbGxvY2F0aW9uLT5lbnRyeS5wcmV2LAogCQkJICAgICAgICAgICAgIHN0cnVjdCBpbnRtZW1fYWxsb2NhdGlvbiwgZW50cnkpOwotCQkJc3RydWN0IGludG1lbV9hbGxvY2F0aW9uKiBuZXh0ID0KKwkJCXN0cnVjdCBpbnRtZW1fYWxsb2NhdGlvbiAqbmV4dCA9CiAJCQkgIGxpc3RfZW50cnkoYWxsb2NhdGlvbi0+ZW50cnkubmV4dCwKIAkJCQkgICAgIHN0cnVjdCBpbnRtZW1fYWxsb2NhdGlvbiwgZW50cnkpOwogCiAJCQlhbGxvY2F0aW9uLT5zdGF0dXMgPSBTVEFUVVNfRlJFRTsKIAkJCS8qIEpvaW4gd2l0aCBwcmV2IGFuZC9vciBuZXh0IGlmIGFsc28gZnJlZSAqLwotCQkJaWYgKHByZXYtPnN0YXR1cyA9PSBTVEFUVVNfRlJFRSkgeworCQkJaWYgKChwcmV2ICE9ICZpbnRtZW1fYWxsb2NhdGlvbnMpICYmCisJCQkJCShwcmV2LT5zdGF0dXMgPT0gU1RBVFVTX0ZSRUUpKSB7CiAJCQkJcHJldi0+c2l6ZSArPSBhbGxvY2F0aW9uLT5zaXplOwogCQkJCWxpc3RfZGVsKCZhbGxvY2F0aW9uLT5lbnRyeSk7CiAJCQkJa2ZyZWUoYWxsb2NhdGlvbik7CiAJCQkJYWxsb2NhdGlvbiA9IHByZXY7CiAJCQl9Ci0JCQlpZiAobmV4dC0+c3RhdHVzID09IFNUQVRVU19GUkVFKSB7CisJCQlpZiAoKG5leHQgIT0gJmludG1lbV9hbGxvY2F0aW9ucykgJiYKKwkJCQkJKG5leHQtPnN0YXR1cyA9PSBTVEFUVVNfRlJFRSkpIHsKIAkJCQlhbGxvY2F0aW9uLT5zaXplICs9IG5leHQtPnNpemU7CiAJCQkJbGlzdF9kZWwoJm5leHQtPmVudHJ5KTsKIAkJCQlrZnJlZShuZXh0KTsKQEAgLTEyNSwxNSArMTM4LDE2IEBACiAKIHZvaWQqIGNyaXN2MzJfaW50bWVtX3BoeXNfdG9fdmlydCh1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0JcmV0dXJuICh2b2lkKikoYWRkciAtIE1FTV9JTlRNRU1fU1RBUlQrCi0JICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaW50bWVtX3ZpcnR1YWwpOworCXJldHVybiAodm9pZCAqKShhZGRyIC0gKE1FTV9JTlRNRU1fU1RBUlQgKyBSRVNFUlZFRF9TSVpFKSArCisJCSh1bnNpZ25lZCBsb25nKWludG1lbV92aXJ0dWFsKTsKIH0KIAogdW5zaWduZWQgbG9uZyBjcmlzdjMyX2ludG1lbV92aXJ0X3RvX3BoeXModm9pZCogYWRkcikKIHsKIAlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpKCh1bnNpZ25lZCBsb25nIClhZGRyIC0KLQkgICh1bnNpZ25lZCBsb25nKWludG1lbV92aXJ0dWFsICsgTUVNX0lOVE1FTV9TVEFSVCk7CisJCSh1bnNpZ25lZCBsb25nKWludG1lbV92aXJ0dWFsICsgTUVNX0lOVE1FTV9TVEFSVCArCisJCVJFU0VSVkVEX1NJWkUpOwogfQogCi0KK21vZHVsZV9pbml0KGNyaXN2MzJfaW50bWVtX2luaXQpOwogCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIvbW0vbDJjYWNoZS5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21tL2wyY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzJmZjEwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21tL2wyY2FjaGUuYwpAQCAtMCwwICsxLDI5IEBACisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPG1lbW1hcC5oPgorI2luY2x1ZGUgPGh3cmVncy9yZWdfbWFwLmg+CisjaW5jbHVkZSA8aHdyZWdzL3JlZ19yZHdyLmg+CisjaW5jbHVkZSA8aHdyZWdzL2wyY2FjaGVfZGVmcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVmaW5lIEwyQ0FDSEVfU0laRSA2NAorCitpbnQgX19pbml0IGwyY2FjaGVfaW5pdCh2b2lkKQoreworCXJlZ19sMmNhY2hlX3J3X2N0cmwgY3RybCA9IHswfTsKKwlyZWdfbDJjYWNoZV9yd19jZmcgY2ZnID0gey5lbiA9IHJlZ2tfbDJjYWNoZV95ZXN9OworCisJY3RybC5jc2l6ZSA9IEwyQ0FDSEVfU0laRTsKKwljdHJsLmNiYXNlID0gTDJDQUNIRV9TSVpFIC8gNCArIChMMkNBQ0hFX1NJWkUgJSA0ID8gMSA6IDApOworCVJFR19XUihsMmNhY2hlLCByZWdpX2wyY2FjaGUsIHJ3X2N0cmwsIGN0cmwpOworCisJLyogRmx1c2ggdGhlIHRhZyBtZW1vcnkgKi8KKwltZW1zZXQoKHZvaWQgKikoTUVNX0lOVE1FTV9TVEFSVCB8IE1FTV9OT05fQ0FDSEVBQkxFKSwgMCwgMioxMDI0KTsKKworCS8qIEVuYWJsZSB0aGUgY2FjaGUgKi8KKwlSRUdfV1IobDJjYWNoZSwgcmVnaV9sMmNhY2hlLCByd19jZmcsIGNmZyk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL21tL21tdS5TIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21tL21tdS5TCmluZGV4IDI3YjcwZTUuLjIyMzhkMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9tbS9tbXUuUworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvbW0vbW11LlMKQEAgLTEsMyArMSw1IEBACis7IFdBUk5JTkcgOiBUaGUgcmVmaWxsIGhhbmRsZXIgaGFzIGJlZW4gbW9kaWZpZWQsIHNlZSBiZWxvdyAhISEKKwogLyoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDMgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgogICoKQEAgLTYxLDYgKzYzLDE0IEBACiA7IE5vdGUgdGhhdCB0aGUgY29kZSBpcyBvcHRpbWl6ZWQgdG8gbWluaW1pemUgc3RhbGxzIChtYWtlcyB0aGUgY29kZSBoYXJkZXIKIDsgdG8gcmVhZCkuCiA7Cis7IFdBUk5JTkcgISEhCis7IE1vZGlmaWVkIGJ5IE1pa2FlbCBBc2tlciAwNjA3MjU6IGFkZGVkIGEgd29ya2Fyb3VuZCBmb3Igc3RyYW5nZSBUTEIKKzsgYmVoYXZpb3IuIElmIHRoZSBzYW1lIFBURSBpcyBwcmVzZW50IGluIG1vcmUgdGhhbiBvbmUgc2V0LCB0aGUgVExCCis7IGRvZXNuJ3QgcmVjb2duaXplIGl0IGFuZCB3ZSBnZXQgc3R1Y2sgaW4gYSBsb29wIG9mIHJlZmlsbCBleGNlcHRpb25zLgorOyBUaGUgd29ya2Fyb3VuZCBkZXRlY3RzIHN1Y2ggbG9vcHMgYW5kIGV4aXRzIHRoZW0gYnkgZmx1c2hpbmcKKzsgdGhlIFRMQiBjb250ZW50cy4gVGhlIHByb2JsZW0gYW5kIHdvcmthcm91bmQgd2VyZSB2ZXJpZmllZAorOyBpbiBWQ1MgYnkgTWlrYWVsIFN0YXJ2aWsuCis7CiA7IEVhY2ggcGFnZSBpcyA4IEtCLiBFYWNoIFBNRCBob2xkcyA4MTkyLzQgUFRFcyAoZWFjaCBQVEUgaXMgNCBieXRlcykgc28gZWFjaAogOyBQTUQgaG9sZHMgMTYgTUIgb2YgdmlydHVhbCBtZW1vcnkuCiA7ICAgQml0cyAgMC0xMiA6IE9mZnNldCB3aXRoaW4gYSBwYWdlCkBAIC02OCw2ICs3OCwxMSBAQAogOyAgIEJpdHMgMjQtMzEgOiBQTUQgb2Zmc2V0IHdpdGhpbiB0aGUgUEdECiAKIC5tYWNybyBNTVVfUkVGSUxMX0hBTkRMRVIgaGFuZGxlciwgbW11CisJLmRhdGEKKzE6CS5kd29yZAkwCQk7IHJlZmlsbF9jb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICAgPT0gMCA8PT4gbGFzdF9yZWZpbGxfY2F1c2UgaXMgaW52YWxpZAorMjoJLmR3b3JkCTAJCTsgbGFzdF9yZWZpbGxfY2F1c2UKKwkudGV4dAogCS5nbG9ibCBcaGFuZGxlcgogXGhhbmRsZXI6CiAJc3VicQk0LCAkc3AKQEAgLTc2LDQyICs5MSw5NiBAQAogCXN1YnEJNCwgJHNwCiAJbW92ZQlcbW11LCAkc3JzCTsgU2VsZWN0IE1NVSBzdXBwb3J0IHJlZ2lzdGVyIGJhbmsKIAltb3ZlLmQJJGFjciwgWyRzcF0KLQlzdWJxCTQsICRzcAotCW1vdmUuZAkkcjAsIFskc3BdCisJc3VicQkxMiwgJHNwCisJbW92ZS5kCTFiLCAkYWNyICAgICAgICA7IFBvaW50IHRvIHJlZmlsbF9jb3VudAorCW1vdmVtCSRyMiwgWyRzcF0KKworCXRlc3QuZAlbJGFjcl0JICAgICAgICA7IHJlZmlsbF9jb3VudCA9PSAwID8KKwliZXEJNWYJCTsgICB5ZXMsIGxhc3RfcmVmaWxsX2NhdXNlIGlzIGludmFsaWQKKyAgICAgICAgbW92ZS5kCSRhY3IsICRyMQorCisJOyBsYXN0X3JlZmlsbF9jYXVzZSBpcyB2YWxpZCwgaW52ZXN0aWdhdGUgY2F1c2UKKyAgICAgICAgYWRkcSAgICA0LCAkcjEgICAgICAgICAgOyBQb2ludCB0byBsYXN0X3JlZmlsbF9jYXVzZQorCW1vdmUJJHMzLCAkcjAJOyBHZXQgcndfbW1fY2F1c2UKKwltb3ZlLmQJWyRyMV0sICRyMgk7IEdldCBsYXN0X3JlZmlsbF9jYXVzZQorCWNtcC5kCSRyMCwgJHIyCTsgcndfbW1fY2F1c2UgPT0gbGFzdF9yZWZpbGxfY2F1c2UgPworCWJlcQk2ZgkJOyAgIHllcywgaW5jcmVtZW50IGNvdW50CisJbW92ZXEJMSwgJHIyCisKKyAgICAgICAgOyByd19tbV9jYXVzZSAhPSBsYXN0X3JlZmlsbF9jYXVzZQorCW1vdmUuZAkkcjIsIFskYWNyXQk7IHJlZmlsbF9jb3VudCA9IDEKKwltb3ZlLmQJJHIwLCBbJHIxXQk7IGxhc3RfcmVmaWxsX2NhdXNlID0gcndfbW1fY2F1c2UKKworMzoJOyBQcm9iYWJseSBub3QgaW4gYSBsb29wLCBjb250aW51ZSBub3JtYWwgcHJvY2Vzc2luZwogI2lmZGVmIENPTkZJR19TTVAKIAltb3ZlICAgICRzNywgJGFjcgk7IFBHRAogI2Vsc2UKIAltb3ZlLmQgIHBlcl9jcHVfX2N1cnJlbnRfcGdkLCAkYWNyIDsgUEdECiAjZW5kaWYKIAk7IExvb2sgdXAgUE1EIGluIFBHRAotCW1vdmUJJHMzLCAkcjAJOyByd19tbV9jYXVzZQogCWxzcnEJMjQsICRyMAk7IEdldCBQTUQgaW5kZXggaW50byBQR0QgKGJpdCAyNC0zMSkKIAltb3ZlLmQgIFskYWNyXSwgJGFjcgk7IFBHRCBmb3IgdGhlIGN1cnJlbnQgcHJvY2VzcwogCWFkZGkJJHIwLmQsICRhY3IsICRhY3IKIAltb3ZlCSRzMywgJHIwCTsgcndfbW1fY2F1c2UKIAltb3ZlLmQgIFskYWNyXSwgJGFjcgk7IEdldCBQTUQKLQliZXEJMWYKKwliZXEJOGYKIAk7IExvb2sgdXAgUFRFIGluIFBNRAogCWxzcnEJUEFHRV9TSElGVCwgJHIwCiAJYW5kLncJUEFHRV9NQVNLLCAkYWNyCTsgUmVtb3ZlIFBNRCBmbGFncwogCWFuZC5kCTB4N2ZmLCAkcjAJOyBHZXQgUFRFIGluZGV4IGludG8gUE1EIChiaXQgMTMtMjMpCiAJYWRkaSAgICAkcjAuZCwgJGFjciwgJGFjcgogCW1vdmUuZCAgWyRhY3JdLCAkYWNyCTsgR2V0IFBURQotCWJlcQkyZgotCW1vdmUuZCAgWyRzcCtdLCAkcjAJOyBQb3AgcjAgaW4gZGVsYXlzbG90CisJYmVxCTlmCisJbW92ZW0JWyRzcF0sICRyMgk7IFJlc3RvcmUgcjAtcjIgaW4gZGVsYXkgc2xvdAorCWFkZHEJMTIsICRzcAogCTsgU3RvcmUgaW4gVExCCiAJbW92ZQkkYWNyLCAkczUKLQk7IFJldHVybgorNDoJOyBSZXR1cm4KIAltb3ZlLmQJWyRzcCtdLCAkYWNyCi0JbW92ZSAgCVskc3BdLCAkc3JzCisJbW92ZQlbJHNwXSwgJHNycwogCWFkZHEJNCwgJHNwCiAJcmV0ZQogCXJmZQotMToJOyBQTUQgbWlzc2luZywgbGV0IHRoZSBtbSBzdWJzeXN0ZW0gZml4IGl0IHVwLgotCW1vdmUuZCAgWyRzcCtdLCAkcjAJOyBQb3AgcjAKLTI6ICAgICAgOyBQVEUgbWlzc2luZywgbGV0IHRoZSBtbSBzdWJzeXN0ZW0gZml4IGl0IHVwLgorCis1OiAgICAgIDsgbGFzdF9yZWZpbGxfY2F1c2UgaXMgaW52YWxpZAorCW1vdmVxCTEsICRyMgorICAgICAgICBhZGRxICAgIDQsICRyMSAgICAgICAgICA7IFBvaW50IHRvIGxhc3RfcmVmaWxsX2NhdXNlCisJbW92ZS5kCSRyMiwgWyRhY3JdCTsgcmVmaWxsX2NvdW50ID0gMQorCW1vdmUJJHMzLCAkcjAJOyBHZXQgcndfbW1fY2F1c2UKKyAgICAgICAgYmEgICAgICAzYgkJOyBDb250aW51ZSBub3JtYWwgcHJvY2Vzc2luZworCW1vdmUuZAkkcjAsWyRyMV0JOyBsYXN0X3JlZmlsbF9jYXVzZSA9IHJ3X21tX2NhdXNlCisKKzY6ICAgICAgOyByd19tbV9jYXVzZSA9PSBsYXN0X3JlZmlsbF9jYXVzZQorICAgICAgICBtb3ZlLmQgIFskYWNyXSwgJHIyICAgICA7IEdldCByZWZpbGxfY291bnQKKwljbXBxCTQsICRyMgkJOyByZWZpbGxfY291bnQgPiA0ID8KKwliaGkJN2YJCTsgICB5ZXMKKwlhZGRxCTEsICRyMgkgICAgICAgIDsgcmVmaWxsX2NvdW50KysKKwliYQkzYgkJOyBDb250aW51ZSBub3JtYWwgcHJvY2Vzc2luZworCW1vdmUuZAkkcjIsIFskYWNyXQorCis3Ogk7IHJlZmlsbF9jb3VudCA+IDQsIGVycm9yCisJbW92ZS5kCSRhY3IsICRyMCAgICAgICA7IFNhdmUgcG9pbnRlciB0byByZWZpbGxfY291bnQKKwljbGVhci5kCVskcjBdCQk7IHJlZmlsbF9jb3VudCA9IDAKKworCTs7IHJld2luZCB0aGUgc2hvcnQgc3RhY2sKKwltb3ZlbQlbJHNwXSwgJHIyCTsgUmVzdG9yZSByMC1yMgorCWFkZHEJMTIsICRzcAogCW1vdmUuZAlbJHNwK10sICRhY3IKLQltb3ZlICAJWyRzcF0sICRzcnMKKwltb3ZlCVskc3BdLCAkc3JzCisJYWRkcQk0LCAkc3AKKwk7OyBLZWVwIGl0IHNpbXBsZSAoc2xvdyksIHNhdmUgYWxsIHRoZSByZWdzLgorCVNBVkVfQUxMCisJanNyCV9fZmx1c2hfdGxiX2FsbAorCW5vcAorCWJhCXJldF9mcm9tX2ludHIJOyBSZXR1cm4KKwlub3AKKworODoJOyBQTUQgbWlzc2luZywgbGV0IHRoZSBtbSBzdWJzeXN0ZW0gZml4IGl0IHVwLgorCW1vdmVtCVskc3BdLCAkcjIJOyBSZXN0b3JlIHIwLXIyCis5OiAgICAgIDsgUFRFIG1pc3NpbmcsIGxldCB0aGUgbW0gc3Vic3lzdGVtIGZpeCBpdCB1cC4KKwlhZGRxCTEyLCAkc3AKKwltb3ZlLmQJWyRzcCtdLCAkYWNyCisJbW92ZQlbJHNwXSwgJHNycwogCWFkZHEJNCwgJHNwCiAJU0FWRV9BTEwKIAltb3ZlICAgIFxtbXUsICRzcnMKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9tbS90bGIuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9tbS90bGIuYwppbmRleCBhMDc2ZWY2Li5lZGE1ZWJjIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvbW0vdGxiLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL21tL3RsYi5jCkBAIC0xMyw4ICsxMyw4IEBACiAjaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL3N1cHBfcmVnLmg+CiAKICNkZWZpbmUgVVBEQVRFX1RMQl9TRUxfSURYKHZhbCkJCQkJCVwKLWRvIHsgCQkJCQkJCQlcCi0JdW5zaWduZWQgbG9uZyB0bGJfc2VsOyAJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIHRsYl9zZWw7CQkJCQlcCiAJCQkJCQkJCVwKIAl0bGJfc2VsID0gUkVHX0ZJRUxEKG1tdSwgcndfbW1fdGxiX3NlbCwgaWR4LCB2YWwpOwlcCiAJU1VQUF9SRUdfV1IoUldfTU1fVExCX1NFTCwgdGxiX3NlbCk7CQkJXApAQCAtMzAsOCArMzAsOCBAQAogICogVGhlIFRMQiBjYW4gaG9zdCB1cCB0byAyNTYgZGlmZmVyZW50IG1tIGNvbnRleHRzIGF0IHRoZSBzYW1lIHRpbWUuIFRoZSBydW5uaW5nCiAgKiBjb250ZXh0IGlzIGZvdW5kIGluIHRoZSBQSUQgcmVnaXN0ZXIuIEVhY2ggVExCIGVudHJ5IGNvbnRhaW5zIGEgcGFnZV9pZCB0aGF0CiAgKiBoYXMgdG8gbWF0Y2ggdGhlIFBJRCByZWdpc3RlciB0byBnaXZlIGEgaGl0LiBwYWdlX2lkX21hcCBrZWVwcyB0cmFjayBvZiB3aGljaAotICogbW0gaXMgYXNzaWduZWQgdG8gd2hpY2ggcGFnZV9pZCwgbWFraW5nIHN1cmUgaXQncyBrbm93biB3aGVuIHRvIGludmFsaWRhdGUgVExCCi0gKiBlbnRyaWVzLgorICogbW0ncyBpcyBhc3NpZ25lZCB0byB3aGljaCBwYWdlX2lkJ3MsIG1ha2luZyBzdXJlIGl0J3Mga25vd24gd2hlbiB0bworICogaW52YWxpZGF0ZSBUTEIgZW50cmllcy4KICAqCiAgKiBUaGUgbGFzdCBwYWdlX2lkIGlzIG5ldmVyIHJ1bm5pbmcsIGl0IGlzIHVzZWQgYXMgYW4gaW52YWxpZCBwYWdlX2lkIHNvIHRoYXQKICAqIGl0J3MgcG9zc2libGUgdG8gbWFrZSBUTEIgZW50cmllcyB0aGF0IHdpbGwgbmVydmVyIG1hdGNoLgpAQCAtMTc5LDI5ICsxNzksMjkgQEAKIHN3aXRjaF9tbShzdHJ1Y3QgbW1fc3RydWN0ICpwcmV2LCBzdHJ1Y3QgbW1fc3RydWN0ICpuZXh0LAogCSAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpZiAocHJldiAhPSBuZXh0KSB7CisJCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKLQkvKiBNYWtlIHN1cmUgdGhlcmUgaXMgYSBNTVUgY29udGV4dC4gKi8KLQlzcGluX2xvY2soJm1tdV9jb250ZXh0X2xvY2spOwotCWdldF9tbXVfY29udGV4dChuZXh0KTsKLQljcHVfc2V0KGNwdSwgbmV4dC0+Y3B1X3ZtX21hc2spOwotCXNwaW5fdW5sb2NrKCZtbXVfY29udGV4dF9sb2NrKTsKKwkJLyogTWFrZSBzdXJlIHRoZXJlIGlzIGEgTU1VIGNvbnRleHQuICovCisJCXNwaW5fbG9jaygmbW11X2NvbnRleHRfbG9jayk7CisJCWdldF9tbXVfY29udGV4dChuZXh0KTsKKwkJY3B1X3NldChjcHUsIG5leHQtPmNwdV92bV9tYXNrKTsKKwkJc3Bpbl91bmxvY2soJm1tdV9jb250ZXh0X2xvY2spOwogCi0JLyoKLQkgKiBSZW1lbWJlciB0aGUgcGdkIGZvciB0aGUgZmF1bHQgaGFuZGxlcnMuIEtlZXAgYSBzZXBhcmF0ZSBjb3B5IG9mIGl0Ci0JICogYmVjYXVzZSBjdXJyZW50IGFuZCBhY3RpdmVfbW0gbWlnaHQgYmUgaW52YWxpZCBhdCBwb2ludHMgd2hlcmUKLQkgKiB0aGVyZSdzIHN0aWxsIGEgbmVlZCB0byBkZXJlZmVyIHRoZSBwZ2QuCi0JICovCi0JcGVyX2NwdShjdXJyZW50X3BnZCwgY3B1KSA9IG5leHQtPnBnZDsKKwkJLyoKKwkJICogUmVtZW1iZXIgdGhlIHBnZCBmb3IgdGhlIGZhdWx0IGhhbmRsZXJzLiBLZWVwIGEgc2VwZXJhdGUKKwkJICogY29weSBvZiBpdCBiZWNhdXNlIGN1cnJlbnQgYW5kIGFjdGl2ZV9tbSBtaWdodCBiZSBpbnZhbGlkCisJCSAqIGF0IHBvaW50cyB3aGVyZSAqIHRoZXJlJ3Mgc3RpbGwgYSBuZWVkIHRvIGRlcmVmZXIgdGhlIHBnZC4KKwkJICovCisJCXBlcl9jcHUoY3VycmVudF9wZ2QsIGNwdSkgPSBuZXh0LT5wZ2Q7CiAKLQkvKiBTd2l0Y2ggY29udGV4dCBpbiB0aGUgTU1VLiAqLwotICAgICAgICBpZiAodHNrICYmIHRhc2tfdGhyZWFkX2luZm8odHNrKSkKLSAgICAgICAgewotICAgICAgICAgIFNQRUNfUkVHX1dSKFNQRUNfUkVHX1BJRCwgbmV4dC0+Y29udGV4dC5wYWdlX2lkIHwgdGFza190aHJlYWRfaW5mbyh0c2spLT50bHMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFNQRUNfUkVHX1dSKFNQRUNfUkVHX1BJRCwgbmV4dC0+Y29udGV4dC5wYWdlX2lkKTsKLSAgICAgICAgfQorCQkvKiBTd2l0Y2ggY29udGV4dCBpbiB0aGUgTU1VLiAqLworCQlpZiAodHNrICYmIHRhc2tfdGhyZWFkX2luZm8odHNrKSkgeworCQkJU1BFQ19SRUdfV1IoU1BFQ19SRUdfUElELCBuZXh0LT5jb250ZXh0LnBhZ2VfaWQgfAorCQkJCXRhc2tfdGhyZWFkX2luZm8odHNrKS0+dGxzKTsKKwkJfSBlbHNlIHsKKwkJCVNQRUNfUkVHX1dSKFNQRUNfUkVHX1BJRCwgbmV4dC0+Y29udGV4dC5wYWdlX2lkKTsKKwkJfQorCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL3ZtbGludXgubGRzLlMgYi9hcmNoL2NyaXMvYXJjaC12MzIvdm1saW51eC5sZHMuUwppbmRleCBmZWFkOGM1Li5kNWYyOGU0IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIvdm1saW51eC5sZHMuUworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvdm1saW51eC5sZHMuUwpAQCAtOSw2ICs5LDEzIEBACiAgKi8KIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3ZtbGludXgubGRzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworI2lmZGVmIENPTkZJR19FVFJBWF9WTUVNX1NJWkUKKyNkZWZpbmUgX19DT05GSUdfRVRSQVhfVk1FTV9TSVpFIENPTkZJR19FVFJBWF9WTUVNX1NJWkUKKyNlbHNlCisjZGVmaW5lIF9fQ09ORklHX0VUUkFYX1ZNRU1fU0laRSAwCisjZW5kaWYKIAogamlmZmllcyA9IGppZmZpZXNfNjQ7CiBTRUNUSU9OUwpAQCAtMTcsMTggKzI0LDE5IEBACiAJZHJhbV9zdGFydCA9IC47CiAJZWJwX3N0YXJ0ID0gLjsKIAotCS8qIFRoZSBib290IHNlY3Rpb24gaXMgb25seSBuZWNlc3NhcnkgdW50aWwgdGhlIFZDUyB0b3AgbGV2ZWwgdGVzdGJlbmNoICovCi0JLyogaW5jbHVkZXMgYm90aCBmbGFzaCBhbmQgRFJBTS4gKi8KKwkvKiBUaGUgYm9vdCBzZWN0aW9uIGlzIG9ubHkgbmVjZXNzYXJ5IHVudGlsIHRoZSBWQ1MgdG9wICovCisJLyogbGV2ZWwgdGVzdGJlbmNoIGluY2x1ZGVzIGJvdGggZmxhc2ggYW5kIERSQU0uICovCiAJLmJvb3QgOiB7ICooLmJvb3QpIH0KIAotCS4gPSBEUkFNX1ZJUlRVQUxfQkFTRSArIDB4NDAwMDsJCS8qIFNlZSBoZWFkLlMgYW5kIHBhZ2VzIHJlc2VydmVkIGF0IHRoZSBzdGFydC4gKi8KKwkvKiBTZWUgaGVhZC5TIGFuZCBwYWdlcyByZXNlcnZlZCBhdCB0aGUgc3RhcnQuICovCisJLiA9IERSQU1fVklSVFVBTF9CQVNFICsgMHg0MDAwOwogCiAJX3RleHQgPSAuOwkJLyogVGV4dCBhbmQgcmVhZC1vbmx5IGRhdGEuICovCiAJdGV4dF9zdGFydCA9IC47CQkvKiBMb3RzIG9mIGFsaWFzZXMuICovCiAJX3N0ZXh0ID0gLjsKIAlfX3N0ZXh0ID0gLjsKIAkudGV4dCA6IHsKLQkJKigudGV4dCkKKwkJVEVYVF9URVhUCiAJCVNDSEVEX1RFWFQKIAkJTE9DS19URVhUCiAJCSooLmZpeHVwKQpAQCAtMzksOSArNDcsOSBAQAogCV9fZXRleHQgPSAuOwogCiAJLiA9IEFMSUdOKDQpOwkJLyogRXhjZXB0aW9uIHRhYmxlLiAqLwotICAJX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgCV9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQotICAJX19zdG9wX19fZXhfdGFibGUgPSAuOworCV9fc3RhcnRfX19leF90YWJsZSA9IC47CisJX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisJX19zdG9wX19fZXhfdGFibGUgPSAuOwogCiAJUk9EQVRBCiAKQEAgLTU0LDMzICs2MiwyNyBAQAogCV9fZWRhdGEgPSAuIDsJCS8qIEVuZCBvZiBkYXRhIHNlY3Rpb24uICovCiAJX2VkYXRhID0gLiA7CiAKLQkuID0gQUxJR04oODE5Mik7CS8qIGluaXRfdGFzayBhbmQgc3RhY2ssIG11c3QgYmUgYWxpZ25lZC4gKi8KLSAgCS5kYXRhLmluaXRfdGFzayA6IHsgKiguZGF0YS5pbml0X3Rhc2spIH0KKwkuID0gQUxJR04oUEFHRV9TSVpFKTsJLyogaW5pdF90YXNrIGFuZCBzdGFjaywgbXVzdCBiZSBhbGlnbmVkLiAqLworCS5kYXRhLmluaXRfdGFzayA6IHsgKiguZGF0YS5pbml0X3Rhc2spIH0KIAotICAJLiA9IEFMSUdOKDgxOTIpOwkvKiBJbml0IGNvZGUgYW5kIGRhdGEuICovCi0gIAlfX2luaXRfYmVnaW4gPSAuOworCS4gPSBBTElHTihQQUdFX1NJWkUpOwkvKiBJbml0IGNvZGUgYW5kIGRhdGEuICovCisJX19pbml0X2JlZ2luID0gLjsKIAkuaW5pdC50ZXh0IDogewogCQkgICBfc2luaXR0ZXh0ID0gLjsKIAkJICAgSU5JVF9URVhUCiAJCSAgIF9laW5pdHRleHQgPSAuOwogCX0KIAkuaW5pdC5kYXRhIDogeyBJTklUX0RBVEEgfQotICAJLiA9IEFMSUdOKDE2KTsKLSAgCV9fc2V0dXBfc3RhcnQgPSAuOwotICAJLmluaXQuc2V0dXAgOiB7ICooLmluaXQuc2V0dXApIH0KLSAgCV9fc2V0dXBfZW5kID0gLjsKKwkuID0gQUxJR04oMTYpOworCV9fc2V0dXBfc3RhcnQgPSAuOworCS5pbml0LnNldHVwIDogeyAqKC5pbml0LnNldHVwKSB9CisJX19zZXR1cF9lbmQgPSAuOwogCV9fc3RhcnRfX19wYXJhbSA9IC47CiAJX19wYXJhbSA6IHsgKihfX3BhcmFtKSB9CiAJX19zdG9wX19fcGFyYW0gPSAuOwotICAJLmluaXRjYWxsLmluaXQgOiB7CisJLmluaXRjYWxsLmluaXQgOiB7CiAJCV9faW5pdGNhbGxfc3RhcnQgPSAuOwotCQkqKC5pbml0Y2FsbDEuaW5pdCk7Ci0JCSooLmluaXRjYWxsMi5pbml0KTsKLQkJKiguaW5pdGNhbGwzLmluaXQpOwotCQkqKC5pbml0Y2FsbDQuaW5pdCk7Ci0JCSooLmluaXRjYWxsNS5pbml0KTsKLQkJKiguaW5pdGNhbGw2LmluaXQpOwotCQkqKC5pbml0Y2FsbDcuaW5pdCk7CisJCUlOSVRDQUxMUwogCQlfX2luaXRjYWxsX2VuZCA9IC47CiAJfQogCkBAIC05MSwyNSArOTMsMjMgQEAKIAl9CiAJU0VDVVJJVFlfSU5JVAogCi0JUEVSQ1BVKDgxOTIpCisJX192bWxpbnV4X2VuZCA9IC47CS8qIExhc3QgYWRkcmVzcyBvZiB0aGUgcGh5c2ljYWwgZmlsZS4gKi8KKwlQRVJDUFUoUEFHRV9TSVpFKQogCi0jaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECiAJLmluaXQucmFtZnMgOiB7CiAJCV9faW5pdHJhbWZzX3N0YXJ0ID0gLjsKIAkJKiguaW5pdC5yYW1mcykKIAkJX19pbml0cmFtZnNfZW5kID0gLjsKLQkJLyoKLQkJICogV2UgZmlsbCB0byB0aGUgbmV4dCBwYWdlLCBzbyB3ZSBjYW4gZGlzY2FyZCBhbGwgaW5pdAotCQkgKiBwYWdlcyB3aXRob3V0IG5lZWRpbmcgdG8gY29uc2lkZXIgd2hhdCBwYXlsb2FkIG1pZ2h0IGJlCi0JCSAqIGFwcGVuZGVkIHRvIHRoZSBrZXJuZWwgaW1hZ2UuCi0JCSAqLwotCQlGSUxMICgwKTsKLQkJLiA9IEFMSUdOICg4MTkyKTsKIAl9Ci0jZW5kaWYKIAotCV9fdm1saW51eF9lbmQgPSAuOwkvKiBMYXN0IGFkZHJlc3Mgb2YgdGhlIHBoeXNpY2FsIGZpbGUuICovCi0gIAlfX2luaXRfZW5kID0gLjsKKwkvKgorCSAqIFdlIGZpbGwgdG8gdGhlIG5leHQgcGFnZSwgc28gd2UgY2FuIGRpc2NhcmQgYWxsIGluaXQKKwkgKiBwYWdlcyB3aXRob3V0IG5lZWRpbmcgdG8gY29uc2lkZXIgd2hhdCBwYXlsb2FkIG1pZ2h0IGJlCisJICogYXBwZW5kZWQgdG8gdGhlIGtlcm5lbCBpbWFnZS4KKwkgKi8KKwkuID0gQUxJR04gKFBBR0VfU0laRSk7CisKKwlfX2luaXRfZW5kID0gLjsKIAogCV9fZGF0YV9lbmQgPSAuIDsJLyogTW92ZSB0byBfZWRhdGE/ICovCiAJX19ic3Nfc3RhcnQgPSAuOwkvKiBCU1MuICovCkBAIC0xMjMsMTEgKzEyMywxMSBAQAogCV9fZW5kID0gLjsKIAogCS8qIFNlY3Rpb25zIHRvIGJlIGRpc2NhcmRlZCAqLwotICAJL0RJU0NBUkQvIDogeworCS9ESVNDQVJELyA6IHsKIAkJRVhJVF9URVhUCiAJCUVYSVRfREFUQQogCQkqKC5leGl0Y2FsbC5leGl0KQogICAgICAgICB9CiAKLQlkcmFtX2VuZCA9IGRyYW1fc3RhcnQgKyBDT05GSUdfRVRSQVhfRFJBTV9TSVpFKjEwMjQqMTAyNDsKKwlkcmFtX2VuZCA9IGRyYW1fc3RhcnQgKyAoQ09ORklHX0VUUkFYX0RSQU1fU0laRSAtIF9fQ09ORklHX0VUUkFYX1ZNRU1fU0laRSkqMTAyNCoxMDI0OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FydHBlY18zX2RlZmNvbmZpZyBiL2FyY2gvY3Jpcy9hcnRwZWNfM19kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFmZTY3NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvY3Jpcy9hcnRwZWNfM19kZWZjb25maWcKQEAgLTAsMCArMSw1ODIgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yNC1yYzMKKyMgTW9uIERlYyAgMyAxMToxODo1NCAyMDA3CisjCitDT05GSUdfTU1VPXkKK0NPTkZJR19aT05FX0RNQT15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19JT01BUD15CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX05PX0lPUE9SVD15CitDT05GSUdfRk9SQ0VfTUFYX1pPTkVPUkRFUj02CitDT05GSUdfQ1JJUz15CitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKKyMgQ09ORklHX1NXQVAgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVklQQyBpcyBub3Qgc2V0CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVVNFUl9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19QSURfTlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAorQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQorQ09ORklHX0ZBSVJfVVNFUl9TQ0hFRD15CisjIENPTkZJR19GQUlSX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CisjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKKyMgQ09ORklHX0tBTExTWU1TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfRVZFTlRGRD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTFVCX0RFQlVHPXkKKyMgQ09ORklHX1NMQUIgaXMgbm90IHNldAorQ09ORklHX1NMVUI9eQorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CitDT05GSUdfUlRfTVVURVhFUz15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKyMgQ09ORklHX01PRFVMRVMgaXMgbm90IHNldAorQ09ORklHX0JMT0NLPXkKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CisjIENPTkZJR19JT1NDSEVEX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0RFRkFVTFRfQVMgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9DRlE9eQorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImNmcSIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfRVRSQVhfQ01ETElORT0icm9vdD0vZGV2L210ZGJsb2NrMyBpbml0PS9saW51eHJjIgorIyBDT05GSUdfRVRSQVhfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX0VUUkFYX0ZBU1RfVElNRVI9eQorIyBDT05GSUdfRVRSQVhfS01BTExPQ0VEX01PRFVMRVMgaXMgbm90IHNldAorIyBDT05GSUdfT09NX1JFQk9PVCBpcyBub3Qgc2V0CitDT05GSUdfUFJFRU1QVF9OT05FPXkKKyMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUF9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKKyMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0xCitDT05GSUdfQk9VTkNFPXkKK0NPTkZJR19WSVJUX1RPX0JVUz15CisKKyMKKyMgSGFyZHdhcmUgc2V0dXAKKyMKKyMgQ09ORklHX0VUUkFYMTAwTFggaXMgbm90IHNldAorIyBDT05GSUdfRVRSQVgxMDBMWF9WMiBpcyBub3Qgc2V0CisjIENPTkZJR19TVklOVE9fU0lNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VUUkFYRlMgaXMgbm90IHNldAorQ09ORklHX0NSSVNfTUFDSF9BUlRQRUMzPXkKKyMgQ09ORklHX0VUUkFYX1ZDU19TSU0gaXMgbm90IHNldAorIyBDT05GSUdfRVRSQVhfQVJDSF9WMTAgaXMgbm90IHNldAorQ09ORklHX0VUUkFYX0FSQ0hfVjMyPXkKK0NPTkZJR19FVFJBWF9EUkFNX1NJWkU9MzIKK0NPTkZJR19FVFJBWF9WTUVNX1NJWkU9OAorQ09ORklHX0VUUkFYX0ZMQVNIX0JVU1dJRFRIPTIKK0NPTkZJR19FVFJBWF9OQU5ERkxBU0hfQlVTV0lEVEg9MQorQ09ORklHX0VUUkFYX0ZMQVNIMV9TSVpFPTQKK0NPTkZJR19FVFJBWF9ERUJVR19QT1JUMD15CisjIENPTkZJR19FVFJBWF9ERUJVR19QT1JUMSBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWF9ERUJVR19QT1JUMiBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWF9ERUJVR19QT1JUMyBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWF9ERUJVR19QT1JUX05VTEwgaXMgbm90IHNldAorQ09ORklHX0VUUkFYX0RSQU1fVklSVFVBTF9CQVNFPWMwMDAwMDAwCitDT05GSUdfRVRSQVhfU0VSSUFMX1BPUlRTPTUKK0NPTkZJR19FVFJBWF9ERUZfR0lPX1BBX09FPTFjCitDT05GSUdfRVRSQVhfREVGX0dJT19QQV9PVVQ9MDAKK0NPTkZJR19FVFJBWF9ERUZfR0lPX1BCX09FPTAwMDAwCitDT05GSUdfRVRSQVhfREVGX0dJT19QQl9PVVQ9MDAwMDAKK0NPTkZJR19FVFJBWF9ERUZfR0lPX1BDX09FPTAwMDAwCitDT05GSUdfRVRSQVhfREVGX0dJT19QQ19PVVQ9MDAwMDAKKworIworIyBBcnRwZWMtMyBvcHRpb25zCisjCitDT05GSUdfRVRSQVhfTDJDQUNIRT15CitDT05GSUdfRVRSQVhfRERSPXkKK0NPTkZJR19FVFJBWF9ERFIyX01SUz0wCitDT05GSUdfRVRSQVhfRERSMl9USU1JTkc9MAorQ09ORklHX0VUUkFYX0REUjJfQ09ORklHPTAKK0NPTkZJR19FVFJBWF9QSU9fQ0UwX0NGRz0wCitDT05GSUdfRVRSQVhfUElPX0NFMV9DRkc9MAorQ09ORklHX0VUUkFYX1BJT19DRTJfQ0ZHPTAKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VUUkFYX05CUl9MRURfR1JQX1pFUk8gaXMgbm90IHNldAorQ09ORklHX0VUUkFYX05CUl9MRURfR1JQX09ORT15CisjIENPTkZJR19FVFJBWF9OQlJfTEVEX0dSUF9UV08gaXMgbm90IHNldAorQ09ORklHX0VUUkFYX0xFRF9HX05FVDA9IlBBMyIKK0NPTkZJR19FVFJBWF9MRURfUl9ORVQwPSJQQTQiCitDT05GSUdfRVRSQVhfVjMyX0xFRDJHPSJQQTUiCitDT05GSUdfRVRSQVhfVjMyX0xFRDJSPSJQQTYiCitDT05GSUdfRVRSQVhfVjMyX0xFRDNHPSJQQTciCitDT05GSUdfRVRSQVhfVjMyX0xFRDNSPSJQQTciCisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKKyMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorIyBDT05GSUdfSVBfUE5QIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQorIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9WUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUj15CisjIENPTkZJR19ORVRGSUxURVJfREVCVUcgaXMgbm90IHNldAorCisjCisjIENvcmUgTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GX0NPTk5UUkFDS19FTkFCTEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GX0NPTk5UUkFDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfWFRBQkxFUyBpcyBub3Qgc2V0CisKKyMKKyMgSVA6IE5ldGZpbHRlciBDb25maWd1cmF0aW9uCisjCisjIENPTkZJR19JUF9ORl9RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9JUFRBQkxFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9BUlBUQUJMRVMgaXMgbm90IHNldAorIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcworIworIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKKworIworIyBEcml2ZXJzIGZvciBidWlsdC1pbiBpbnRlcmZhY2VzCisjCitDT05GSUdfRVRSQVhfRVRIRVJORVQ9eQorIyBDT05GSUdfRVRSQVhfSURFIGlzIG5vdCBzZXQKK0NPTkZJR19FVFJBWF9BWElTRkxBU0hNQVA9eQorQ09ORklHX0VUUkFYX1BUQUJMRV9TRUNUT1I9NjU1MzYKKyMgQ09ORklHX0VUUkFYX0kyQyBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWF9HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VUUkFYX05PX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWF9FVEhFUk5FVF9JRkFDRTAgaXMgbm90IHNldAorIyBDT05GSUdfRVRSQVhfRVRIRVJORVRfR0JJVCBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWEZTX1NFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWF9TWU5DSFJPTk9VU19TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfRVRSQVhfQVhJU0ZMQVNITUFQX01URDBXSE9MRSBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWF9OQU5ERkxBU0ggaXMgbm90IHNldAorIyBDT05GSUdfRVRSQVhfQ0FSREJVUyBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWF9JT1BfRldfTE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWF9TVFJFQU1DT1BST0MgaXMgbm90IHNldAorIyBDT05GSUdfRVRSQVhfU1BJX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWF9TUElfTU1DX0JPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VUUkFYX05FVFdPUktfTEVEX09OX1dIRU5fTElOSyBpcyBub3Qgc2V0CitDT05GSUdfRVRSQVhfTkVUV09SS19MRURfT05fV0hFTl9BQ1RJVklUWT15CisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorQ09ORklHX01URF9DT05DQVQ9eQorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxLREVWUz15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorIyBDT05GSUdfU1NGREMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09PUFMgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CitDT05GSUdfTVREX0pFREVDUFJPQkU9eQorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0lOVEVMRVhUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0FNRFNURD15CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CitDT05GSUdfTVREX1JBTT15CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKK0NPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUz15CisjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTVREUkFNPXkKK0NPTkZJR19NVERSQU1fVE9UQUxfU0laRT0wCitDT05GSUdfTVREUkFNX0VSQVNFX1NJWkU9NjQKK0NPTkZJR19NVERSQU1fQUJTX1BPUz0weDAKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKKyMKKyMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVY9eQorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CitDT05GSUdfQkxLX0RFVl9SQU1fQkxPQ0tTSVpFPTEwMjQKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX05FVERFVklDRVNfTVVMVElRVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisjIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZfMTAwMD15CitDT05GSUdfTkVUREVWXzEwMDAwPXkKKworIworIyBXaXJlbGVzcyBMQU4KKyMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKK0NPTkZJR19TRVJJTz15CisjIENPTkZJR19TRVJJT19JODA0MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19TRVJQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX0xJQlBTMiBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorQ09ORklHX0hXX1JBTkRPTT15CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKKyMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9GU19ERUJVRz0wCitDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVI9eQorIyBDT05GSUdfSkZGUzJfRlNfV0JVRl9WRVJJRlkgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfU1VNTUFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9aTElCPXkKKyMgQ09ORklHX0pGRlMyX0xaTyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfUlRJTUU9eQorIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAorQ09ORklHX0NSQU1GUz15CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfU1VOUlBDX0JJTkQzNCBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNURU1fUFJPRklMRVIgaXMgbm90IHNldAorIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKKyMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMVUJfREVCVUdfT04gaXMgbm90IHNldAorIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1pMSUJfREVGTEFURT15CitDT05GSUdfUExJU1Q9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2RlZmNvbmZpZyBiL2FyY2gvY3Jpcy9kZWZjb25maWcKaW5kZXggOWMzM2FlNi4uNTlmMzZhNSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2RlZmNvbmZpZworKysgYi9hcmNoL2NyaXMvZGVmY29uZmlnCkBAIC0xLDUyICsxLDkxIEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTEKLSMgTW9uIEp1biAyMCAxMzo0MjowMiAyMDA1CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjQtcmMzCisjIE1vbiBEZWMgIDMgMTE6MzQ6MjcgMjAwNwogIwogQ09ORklHX01NVT15Ci1DT05GSUdfVUlEMTY9eQorQ09ORklHX1pPTkVfRE1BPXkKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKIENPTkZJR19HRU5FUklDX0lPTUFQPXkKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfTk9fSU9QT1JUPXkKK0NPTkZJR19GT1JDRV9NQVhfWk9ORU9SREVSPTYKIENPTkZJR19DUklTPXkKLQotIwotIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKLSMKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotQ09ORklHX0NMRUFOX0NPTVBJTEU9eQotQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKIAogIwogIyBHZW5lcmFsIHNldHVwCiAjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKIENPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CiAjIENPTkZJR19TV0FQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZJUEMgaXMgbm90IHNldAogIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAotQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVVNFUl9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19QSURfTlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAotQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLSMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAotQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKLUNPTkZJR19FTUJFRERFRD15Ci0jIENPTkZJR19LQUxMU1lNUyBpcyBub3Qgc2V0Ci1DT05GSUdfRlVURVg9eQotQ09ORklHX0VQT0xMPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKK0NPTkZJR19GQUlSX0dST1VQX1NDSEVEPXkKK0NPTkZJR19GQUlSX1VTRVJfU0NIRUQ9eQorIyBDT05GSUdfRkFJUl9DR1JPVVBfU0NIRUQgaXMgbm90IHNldAorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAogIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CisjIENPTkZJR19LQUxMU1lNUyBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0FOT05fSU5PREVTPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKLUNPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAotQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCi1DT05GSUdfQ0NfQUxJR05fTE9PUFM9MAotQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfU0xVQl9ERUJVRz15CisjIENPTkZJR19TTEFCIGlzIG5vdCBzZXQKK0NPTkZJR19TTFVCPXkKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorQ09ORklHX1JUX01VVEVYRVM9eQogIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCisjIENPTkZJR19NT0RVTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19MU0YgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogCiAjCi0jIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjIElPIFNjaGVkdWxlcnMKICMKLSMgQ09ORklHX01PRFVMRVMgaXMgbm90IHNldAorQ09ORklHX0lPU0NIRURfTk9PUD15CisjIENPTkZJR19JT1NDSEVEX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0RFRkFVTFRfQVMgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9DRlE9eQorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImNmcSIKIAogIwogIyBHZW5lcmFsIHNldHVwCkBAIC01NCwxMiArOTMsMjcgQEAKIENPTkZJR19CSU5GTVRfRUxGPXkKICMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKLSMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CiBDT05GSUdfRVRSQVhfQ01ETElORT0icm9vdD0vZGV2L210ZGJsb2NrMyBpbml0PS9saW51eHJjIgogIyBDT05GSUdfRVRSQVhfV0FUQ0hET0cgaXMgbm90IHNldAogQ09ORklHX0VUUkFYX0ZBU1RfVElNRVI9eQotIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWF9LTUFMTE9DRURfTU9EVUxFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PT01fUkVCT09UIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVFTVBUX05PTkU9eQorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTEKK0NPTkZJR19CT1VOQ0U9eQorQ09ORklHX1ZJUlRfVE9fQlVTPXkKIAogIwogIyBIYXJkd2FyZSBzZXR1cApAQCAtNjgsMTI3ICsxMjIsMTgwIEBACiBDT05GSUdfRVRSQVgxMDBMWF9WMj15CiAjIENPTkZJR19TVklOVE9fU0lNIGlzIG5vdCBzZXQKICMgQ09ORklHX0VUUkFYRlMgaXMgbm90IHNldAotIyBDT05GSUdfRVRSQVhGU19TSU0gaXMgbm90IHNldAorIyBDT05GSUdfQ1JJU19NQUNIX0FSVFBFQzMgaXMgbm90IHNldAorIyBDT05GSUdfRVRSQVhfVkNTX1NJTSBpcyBub3Qgc2V0CiBDT05GSUdfRVRSQVhfQVJDSF9WMTA9eQogIyBDT05GSUdfRVRSQVhfQVJDSF9WMzIgaXMgbm90IHNldAogQ09ORklHX0VUUkFYX0RSQU1fU0laRT0zMgogQ09ORklHX0VUUkFYX0ZMQVNIX0JVU1dJRFRIPTIKK0NPTkZJR19FVFJBWF9OQU5ERkxBU0hfQlVTV0lEVEg9MQogQ09ORklHX0VUUkFYX0ZMQVNIMV9TSVpFPTQKKyMgQ09ORklHX0VUUkFYX0RFQlVHX1BPUlQwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VUUkFYX0RFQlVHX1BPUlQxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VUUkFYX0RFQlVHX1BPUlQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VUUkFYX0RFQlVHX1BPUlQzIGlzIG5vdCBzZXQKK0NPTkZJR19FVFJBWF9ERUJVR19QT1JUX05VTEw9eQorCisjCisjIENSSVMgdjEwIG9wdGlvbnMKKyMKIENPTkZJR19FVFJBWF9EUkFNX1ZJUlRVQUxfQkFTRT1jMDAwMDAwMAogQ09ORklHX0VUUkFYX1BBX0xFRFM9eQogIyBDT05GSUdfRVRSQVhfUEJfTEVEUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FVFJBWF9DU1AwX0xFRFMgaXMgbm90IHNldAogIyBDT05GSUdfRVRSQVhfTk9fTEVEUyBpcyBub3Qgc2V0CiBDT05GSUdfRVRSQVhfTEVEMUc9MgotQ09ORklHX0VUUkFYX0xFRDFSPTIKLUNPTkZJR19FVFJBWF9MRUQyRz0zCi1DT05GSUdfRVRSQVhfTEVEMlI9MworQ09ORklHX0VUUkFYX0xFRDFSPTMKK0NPTkZJR19FVFJBWF9MRUQyRz00CitDT05GSUdfRVRSQVhfTEVEMlI9NQogQ09ORklHX0VUUkFYX0xFRDNHPTIKIENPTkZJR19FVFJBWF9MRUQzUj0yCi1DT05GSUdfRVRSQVhfREVCVUdfUE9SVDA9eQotIyBDT05GSUdfRVRSQVhfREVCVUdfUE9SVDEgaXMgbm90IHNldAotIyBDT05GSUdfRVRSQVhfREVCVUdfUE9SVDIgaXMgbm90IHNldAotIyBDT05GSUdfRVRSQVhfREVCVUdfUE9SVDMgaXMgbm90IHNldAotIyBDT05GSUdfRVRSQVhfREVCVUdfUE9SVF9OVUxMIGlzIG5vdCBzZXQKIENPTkZJR19FVFJBWF9SRVNDVUVfU0VSMD15CiAjIENPTkZJR19FVFJBWF9SRVNDVUVfU0VSMSBpcyBub3Qgc2V0CiAjIENPTkZJR19FVFJBWF9SRVNDVUVfU0VSMiBpcyBub3Qgc2V0CiAjIENPTkZJR19FVFJBWF9SRVNDVUVfU0VSMyBpcyBub3Qgc2V0Ci1DT05GSUdfRVRSQVhfREVGX1JfV0FJVFNUQVRFUz0weDk1YTYKLUNPTkZJR19FVFJBWF9ERUZfUl9CVVNfQ09ORklHPTB4NAotQ09ORklHX0VUUkFYX1NEUkFNPXkKLUNPTkZJR19FVFJBWF9ERUZfUl9TRFJBTV9DT05GSUc9MHgwOWUwNTc1NwotQ09ORklHX0VUUkFYX0RFRl9SX1NEUkFNX1RJTUlORz0weDgwMDA4MDAyCi1DT05GSUdfRVRSQVhfREVGX1JfUE9SVF9QQV9ESVI9MHgxZAotQ09ORklHX0VUUkFYX0RFRl9SX1BPUlRfUEFfREFUQT0weDAwCi1DT05GSUdfRVRSQVhfREVGX1JfUE9SVF9QQl9DT05GSUc9MHgwMAotQ09ORklHX0VUUkFYX0RFRl9SX1BPUlRfUEJfRElSPTB4MWUKLUNPTkZJR19FVFJBWF9ERUZfUl9QT1JUX1BCX0RBVEE9MHhmMworQ09ORklHX0VUUkFYX0RFRl9SX1dBSVRTVEFURVM9OTVhNgorQ09ORklHX0VUUkFYX0RFRl9SX0JVU19DT05GSUc9MTA0CisjIENPTkZJR19FVFJBWF9TRFJBTSBpcyBub3Qgc2V0CitDT05GSUdfRVRSQVhfREVGX1JfRFJBTV9DT05GSUc9MWEyMDAwNDAKK0NPTkZJR19FVFJBWF9ERUZfUl9EUkFNX1RJTUlORz01NjExCitDT05GSUdfRVRSQVhfREVGX1JfUE9SVF9QQV9ESVI9MWMKK0NPTkZJR19FVFJBWF9ERUZfUl9QT1JUX1BBX0RBVEE9MDAKK0NPTkZJR19FVFJBWF9ERUZfUl9QT1JUX1BCX0NPTkZJRz0wMAorQ09ORklHX0VUUkFYX0RFRl9SX1BPUlRfUEJfRElSPTAwCitDT05GSUdfRVRSQVhfREVGX1JfUE9SVF9QQl9EQVRBPWZmCiAjIENPTkZJR19FVFJBWF9TT0ZUX1NIVVRET1dOIGlzIG5vdCBzZXQKIAogIworIyBOZXR3b3JraW5nCisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorQ09ORklHX1hGUk09eQorIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CisjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CisjIENPTkZJR19JUF9QTlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CisjIENPTkZJR19JTkVUX0xSTyBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CitDT05GSUdfTkVURklMVEVSPXkKKyMgQ09ORklHX05FVEZJTFRFUl9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgQ29yZSBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgorIworIyBDT05GSUdfTkVURklMVEVSX05FVExJTksgaXMgbm90IHNldAorIyBDT05GSUdfTkZfQ09OTlRSQUNLX0VOQUJMRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkZfQ09OTlRSQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUl9YVEFCTEVTIGlzIG5vdCBzZXQKKworIworIyBJUDogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0lQX05GX1FVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX0lQVEFCTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX0FSUFRBQkxFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfVElQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzCisjCisjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAorIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfOVAgaXMgbm90IHNldAorCisjCiAjIERyaXZlcnMgZm9yIGJ1aWx0LWluIGludGVyZmFjZXMKICMKIENPTkZJR19FVFJBWF9FVEhFUk5FVD15Ci0jIENPTkZJR19FVFJBWF9ORVRXT1JLX0xFRF9PTl9XSEVOX0xJTksgaXMgbm90IHNldAotQ09ORklHX0VUUkFYX05FVFdPUktfTEVEX09OX1dIRU5fQUNUSVZJVFk9eQogQ09ORklHX0VUUkFYX1NFUklBTD15CiAjIENPTkZJR19FVFJBWF9TRVJJQUxfRkFTVF9USU1FUiBpcyBub3Qgc2V0CiAjIENPTkZJR19FVFJBWF9TRVJJQUxfRkxVU0hfRE1BX0ZBU1QgaXMgbm90IHNldAogQ09ORklHX0VUUkFYX1NFUklBTF9SWF9USU1FT1VUX1RJQ0tTPTUKLUNPTkZJR19FVFJBWF9TRVJJQUxfUE9SVDA9eQotIyBDT05GSUdfRVRSQVhfU0VSSUFMX1BPUlQwX05PX0RNQV9PVVQgaXMgbm90IHNldAotQ09ORklHX0VUUkFYX1NFUklBTF9QT1JUMF9ETUE2X09VVD15Ci0jIENPTkZJR19FVFJBWF9TRVJJQUxfUE9SVDBfTk9fRE1BX0lOIGlzIG5vdCBzZXQKLUNPTkZJR19FVFJBWF9TRVJJQUxfUE9SVDBfRE1BN19JTj15Ci1DT05GSUdfRVRSQVhfU0VSMF9EVFJfUklfRFNSX0NEX09OX05PTkU9eQotIyBDT05GSUdfRVRSQVhfU0VSMF9EVFJfUklfRFNSX0NEX09OX1BBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VUUkFYX1NFUjBfRFRSX1JJX0RTUl9DRF9PTl9QQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FVFJBWF9TRVIwX0RUUl9SSV9EU1JfQ0RfTUlYRUQgaXMgbm90IHNldAotQ09ORklHX0VUUkFYX1NFUjBfRFRSX09OX1BBX0JJVD0tMQotQ09ORklHX0VUUkFYX1NFUjBfUklfT05fUEFfQklUPS0xCi1DT05GSUdfRVRSQVhfU0VSMF9EU1JfT05fUEFfQklUPS0xCi1DT05GSUdfRVRSQVhfU0VSMF9DRF9PTl9QQV9CSVQ9LTEKLUNPTkZJR19FVFJBWF9TRVIwX0RUUl9PTl9QQl9CSVQ9LTEKLUNPTkZJR19FVFJBWF9TRVIwX1JJX09OX1BCX0JJVD0tMQotQ09ORklHX0VUUkFYX1NFUjBfRFNSX09OX1BCX0JJVD0tMQotQ09ORklHX0VUUkFYX1NFUjBfQ0RfT05fUEJfQklUPS0xCisjIENPTkZJR19FVFJBWF9TRVJJQUxfUE9SVDAgaXMgbm90IHNldAogIyBDT05GSUdfRVRSQVhfU0VSSUFMX1BPUlQxIGlzIG5vdCBzZXQKLUNPTkZJR19FVFJBWF9TRVJJQUxfUE9SVDI9eQotIyBDT05GSUdfRVRSQVhfU0VSSUFMX1BPUlQyX05PX0RNQV9PVVQgaXMgbm90IHNldAotQ09ORklHX0VUUkFYX1NFUklBTF9QT1JUMl9ETUEyX09VVD15Ci0jIENPTkZJR19FVFJBWF9TRVJJQUxfUE9SVDJfTk9fRE1BX0lOIGlzIG5vdCBzZXQKLUNPTkZJR19FVFJBWF9TRVJJQUxfUE9SVDJfRE1BM19JTj15Ci1DT05GSUdfRVRSQVhfU0VSMl9EVFJfUklfRFNSX0NEX09OX05PTkU9eQotIyBDT05GSUdfRVRSQVhfU0VSMl9EVFJfUklfRFNSX0NEX09OX1BBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VUUkFYX1NFUjJfRFRSX1JJX0RTUl9DRF9PTl9QQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FVFJBWF9TRVIyX0RUUl9SSV9EU1JfQ0RfTUlYRUQgaXMgbm90IHNldAotQ09ORklHX0VUUkFYX1NFUjJfRFRSX09OX1BBX0JJVD0tMQotQ09ORklHX0VUUkFYX1NFUjJfUklfT05fUEFfQklUPS0xCi1DT05GSUdfRVRSQVhfU0VSMl9EU1JfT05fUEFfQklUPS0xCi1DT05GSUdfRVRSQVhfU0VSMl9DRF9PTl9QQV9CSVQ9LTEKLUNPTkZJR19FVFJBWF9TRVIyX0RUUl9PTl9QQl9CSVQ9LTEKLUNPTkZJR19FVFJBWF9TRVIyX1JJX09OX1BCX0JJVD0tMQotQ09ORklHX0VUUkFYX1NFUjJfRFNSX09OX1BCX0JJVD0tMQotQ09ORklHX0VUUkFYX1NFUjJfQ0RfT05fUEJfQklUPS0xCisjIENPTkZJR19FVFJBWF9TRVJJQUxfUE9SVDIgaXMgbm90IHNldAogIyBDT05GSUdfRVRSQVhfU0VSSUFMX1BPUlQzIGlzIG5vdCBzZXQKLUNPTkZJR19FVFJBWF9SUzQ4NT15Ci0jIENPTkZJR19FVFJBWF9SUzQ4NV9PTl9QQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19FVFJBWF9SUzQ4NV9ESVNBQkxFX1JFQ0VJVkVSIGlzIG5vdCBzZXQKLUNPTkZJR19FVFJBWF9JREU9eQotQ09ORklHX0VUUkFYX0lERV9ERUxBWT0xNQotQ09ORklHX0VUUkFYX0lERV9QQjdfUkVTRVQ9eQotIyBDT05GSUdfRVRSQVhfSURFX0cyN19SRVNFVCBpcyBub3Qgc2V0Ci1DT05GSUdfRVRSQVhfVVNCX0hPU1Q9eQotQ09ORklHX0VUUkFYX1VTQl9IT1NUX1BPUlQxPXkKLUNPTkZJR19FVFJBWF9VU0JfSE9TVF9QT1JUMj15CisjIENPTkZJR19FVFJBWF9SUzQ4NSBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWF9JREUgaXMgbm90IHNldAorIyBDT05GSUdfRVRSQVhfVVNCX0hPU1QgaXMgbm90IHNldAogQ09ORklHX0VUUkFYX0FYSVNGTEFTSE1BUD15CiBDT05GSUdfRVRSQVhfUFRBQkxFX1NFQ1RPUj02NTUzNgogIyBDT05GSUdfRVRSQVhfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX0VUUkFYX0dQSU8gaXMgbm90IHNldAotQ09ORklHX0VUUkFYX1JUQz15Ci1DT05GSUdfRVRSQVhfRFMxMzAyPXkKLSMgQ09ORklHX0VUUkFYX1BDRjg1NjMgaXMgbm90IHNldAotQ09ORklHX0VUUkFYX0RTMTMwMl9SU1RfT05fR0VORVJJQ19QT1JUPXkKLUNPTkZJR19FVFJBWF9EUzEzMDJfUlNUQklUPTAKLUNPTkZJR19FVFJBWF9EUzEzMDJfU0NMQklUPTEKLUNPTkZJR19FVFJBWF9EUzEzMDJfU0RBQklUPTAKLUNPTkZJR19FVFJBWF9EUzEzMDJfVFJJQ0tMRV9DSEFSR0U9MAorIyBDT05GSUdfRVRSQVhfUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VUUkFYX05FVFdPUktfTEVEX09OX1dIRU5fTElOSyBpcyBub3Qgc2V0CitDT05GSUdfRVRSQVhfTkVUV09SS19MRURfT05fV0hFTl9BQ1RJVklUWT15CiAKICMKICMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwogIwogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKLQotIwotIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCi0jCisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CiBDT05GSUdfTVREPXkKICMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX1BBUlRJVElPTlM9eQogQ09ORklHX01URF9DT05DQVQ9eQorQ09ORklHX01URF9QQVJUSVRJT05TPXkKICMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKIApAQCAtMTk2LDE2ICszMDMsMjAgQEAKICMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKICMKIENPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMS0RFVlM9eQogQ09ORklHX01URF9CTE9DSz15CiAjIENPTkZJR19GVEwgaXMgbm90IHNldAogIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PT1BTIGlzIG5vdCBzZXQKIAogIwogIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycwogIwogQ09ORklHX01URF9DRkk9eQotIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9KRURFQ1BST0JFPXkKIENPTkZJR19NVERfR0VOX1BST0JFPXkKICMgQ09ORklHX01URF9DRklfQURWX09QVElPTlMgaXMgbm90IHNldAogQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKQEAgLTIyMCwyMCArMzMxLDE4IEBACiAjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9DRklfSU5URUxFWFQgaXMgbm90IHNldAogQ09ORklHX01URF9DRklfQU1EU1REPXkKLUNPTkZJR19NVERfQ0ZJX0FNRFNURF9SRVRSWT0wCiAjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAogQ09ORklHX01URF9DRklfVVRJTD15CiBDT05GSUdfTVREX1JBTT15CiAjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKICMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAotIyBDT05GSUdfTVREX1NIQVJQIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9KRURFQyBpcyBub3Qgc2V0CiAKICMKICMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcwogIwogQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTPXkKICMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKIAogIwogIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKQEAgLTI0NCw3ICszNTMsNiBAQAogQ09ORklHX01URFJBTV9UT1RBTF9TSVpFPTAKIENPTkZJR19NVERSQU1fRVJBU0VfU0laRT02NAogQ09ORklHX01URFJBTV9BQlNfUE9TPTB4MAotIyBDT05GSUdfTVREX0JMS01URCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKIAogIwpAQCAtMjUzLDIxNiArMzYxLDU0IEBACiAjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAotCi0jCi0jIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKLSMKICMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKIAogIwotIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMgVUJJIC0gVW5zb3J0ZWQgYmxvY2sgaW1hZ2VzCiAjCi0jIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKLSMKLQotIwotIyBCbG9jayBkZXZpY2VzCi0jCi0jIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVY9eQogIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9VQiBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9SQU09eQogQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CiBDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2Ci0jIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0Ci1DT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKLQotIwotIyBJTyBTY2hlZHVsZXJzCi0jCi1DT05GSUdfSU9TQ0hFRF9OT09QPXkKLSMgQ09ORklHX0lPU0NIRURfQVMgaXMgbm90IHNldAotIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0Ci1DT05GSUdfSU9TQ0hFRF9DRlE9eQogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQotIwotIyBDT05GSUdfTUQgaXMgbm90IHNldAotCi0jCi0jIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lERSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVJJREUgaXMgbm90IHNldAotCi0jCi0jIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcwotIwotIyBDT05GSUdfQkxLX0RFVl9JREVfU0FUQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVUQVBFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSURFRkxPUFBZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKLQotIwotIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCi0jCi0jIENPTkZJR19JREVfR0VORVJJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lERURNQV9BVVRPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX1NDU0kgaXMgbm90IHNldAotIyBDT05GSUdfSVNDU0lfVENQIGlzIG5vdCBzZXQKLQotIwotIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKLSMgTmV0d29ya2luZyBzdXBwb3J0Ci0jCi1DT05GSUdfTkVUPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLUNPTkZJR19QQUNLRVQ9eQotIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAotQ09ORklHX1VOSVg9eQotIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVD15Ci0jIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAotIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX1BOUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAotIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9UQ1BESUFHPXkKLSMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0Ci0KLSMKLSMgSVA6IFZpcnR1YWwgU2VydmVyIENvbmZpZ3VyYXRpb24KLSMKLSMgQ09ORklHX0lQX1ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotQ09ORklHX05FVEZJTFRFUj15Ci0jIENPTkZJR19ORVRGSUxURVJfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgotIwotIyBDT05GSUdfSVBfTkZfQ09OTlRSQUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX0NPTk5UUkFDS19NQVJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX1FVRVVFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX0lQVEFCTEVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX0FSUFRBQkxFUyBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CUklER0UgaXMgbm90IHNldAotIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUNORVQgaXMgbm90IHNldAotIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFggaXMgbm90IHNldAotIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAotIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAotIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCi0jCi0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayB0ZXN0aW5nCi0jCi0jIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGX1JYUlBDX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQyBpcyBub3Qgc2V0Ci0KIENPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX05FVERFVklDRVNfTVVMVElRVUVVRSBpcyBub3Qgc2V0CiAjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldAogIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1RVTiBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCi0jCisjIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CiBDT05GSUdfTkVUX0VUSEVSTkVUPXkKLSMgQ09ORklHX01JSSBpcyBub3Qgc2V0CitDT05GSUdfTUlJPXkKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19aTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfVEFIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19FTUFDNCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWXzEwMDA9eQorQ09ORklHX05FVERFVl8xMDAwMD15CiAKICMKLSMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMgV2lyZWxlc3MgTEFOCiAjCi0KLSMKLSMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCi0jCi0KLSMKLSMgVG9rZW4gUmluZyBkZXZpY2VzCi0jCi0KLSMKLSMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCi0jCi0jIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAotCi0jCi0jIFdhbiBpbnRlcmZhY2VzCi0jCisjIENPTkZJR19XTEFOX1BSRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAogIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKLQotIwotIyBJU0ROIHN1YnN5c3RlbQotIwotIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0Ci0KLSMKLSMgVGVsZXBob255IFN1cHBvcnQKLSMKLSMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAogCiAjCiAjIElucHV0IGRldmljZSBzdXBwb3J0CkBAIC00NzAsNyArNDE2LDcgQEAKICMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKIAogIwotIyBJbnB1dCBJL08gZHJpdmVycworIyBIYXJkd2FyZSBJL08gcG9ydHMKICMKIENPTkZJR19TRVJJTz15CiAjIENPTkZJR19TRVJJT19JODA0MiBpcyBub3Qgc2V0CkBAIC00ODAsOTQgKzQyNiwzOSBAQAogIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAogCiAjCi0jIElucHV0IERldmljZSBEcml2ZXJzCi0jCi1DT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQotQ09ORklHX0tFWUJPQVJEX0FUS0JEPXkKLSMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAotQ09ORklHX0lOUFVUX01PVVNFPXkKLUNPTkZJR19NT1VTRV9QUzI9eQotIyBDT05GSUdfTU9VU0VfU0VSSUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAotCi0jCiAjIENoYXJhY3RlciBkZXZpY2VzCiAjCiAjIENPTkZJR19WVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBkcml2ZXJzCi0jCi0jIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0Ci0KLSMKLSMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAotIwotQ09ORklHX1NFUklBTF9DT1JFPXkKLUNPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKIENPTkZJR19VTklYOThfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2Ci0KLSMKLSMgSVBNSQotIwotIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwotIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX0hXX1JBTkRPTT15CiAjIENPTkZJR19SVEMgaXMgbm90IHNldAogIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19EVExLIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19MSUIgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKLQotIwotIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKLSMKLSMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKIAogIwotIyBNdWx0aW1lZGlhIGRldmljZXMKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKLQotIwogIyBGaWxlIHN5c3RlbXMKICMKICMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KQkQgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFhGUyBzdXBwb3J0Ci0jCisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CiAjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CiBDT05GSUdfRE5PVElGWT15CiAjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKIAogIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCkBAIC01ODcsMTMgKzQ3OCwxMiBAQAogIwogQ09ORklHX1BST0NfRlM9eQogQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1BST0NfU1lTQ1RMPXkKIENPTkZJR19TWVNGUz15Ci0jIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAogQ09ORklHX1RNUEZTPXkKLSMgQ09ORklHX1RNUEZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAotQ09ORklHX1JBTUZTPXkKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKIAogIwogIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCkBAIC02MDUsMTUgKzQ5NSwxNSBAQAogIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19KRkZTX0ZTPXkKLUNPTkZJR19KRkZTX0ZTX1ZFUkJPU0U9MAotIyBDT05GSUdfSkZGU19QUk9DX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19KRkZTMl9GUz15CiBDT05GSUdfSkZGUzJfRlNfREVCVUc9MAotIyBDT05GSUdfSkZGUzJfRlNfTkFORCBpcyBub3Qgc2V0Ci0jIENPTkZJR19KRkZTMl9GU19OT1JfRUNDIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUj15CisjIENPTkZJR19KRkZTMl9GU19XQlVGX1ZFUklGWSBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9TVU1NQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAogQ09ORklHX0pGRlMyX1pMSUI9eQorIyBDT05GSUdfSkZGUzJfTFpPIGlzIG5vdCBzZXQKIENPTkZJR19KRkZTMl9SVElNRT15CiAjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CiBDT05GSUdfQ1JBTUZTPXkKQEAgLTYyMiwxMiArNTEyLDEwIEBACiAjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCi0jCitDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPXkKIENPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAogIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU0QgaXMgbm90IHNldApAQCAtNjQ5LDE4MSArNTM3LDQ0IEBACiAjCiAjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAogQ09ORklHX01TRE9TX1BBUlRJVElPTj15Ci0KLSMKLSMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKLSMKICMgQ09ORklHX05MUyBpcyBub3Qgc2V0Ci0KLSMKLSMgU291bmQKLSMKLSMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKLQotIwotIyBHZW5lcmljIGRldmljZXMKLSMKLSMgQ09ORklHX1NORF9NUFU0MDFfVUFSVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfRFVNTVkgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1ZJUk1JREkgaXMgbm90IHNldAotIyBDT05GSUdfU05EX01UUEFWIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TRVJJQUxfVTE2NTUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9NUFU0MDEgaXMgbm90IHNldAotCi0jCi0jIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKLSMKLSMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVJQT1JUX1BDX1BDTUNJQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfUENNQ0lBIGlzIG5vdCBzZXQKLQotIwotIyBQQy1jYXJkIGJyaWRnZXMKLSMKLQotIwotIyBVU0Igc3VwcG9ydAotIwotQ09ORklHX1VTQj15Ci0jIENPTkZJR19VU0JfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKLSMKLUNPTkZJR19VU0JfREVWSUNFRlM9eQotIyBDT05GSUdfVVNCX0JBTkRXSURUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVJDSF9IQVNfSENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKLSMKLSMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAotCi0jCi0jIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycwotIwotCi0jCi0jIFVTQiBCbHVldG9vdGggVFRZIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBkaXNhYmxlZCBCbHVldG9vdGggc3Vic3lzdGVtCi0jCi0jIENPTkZJR19VU0JfQUNNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9QUklOVEVSIGlzIG5vdCBzZXQKLQotIwotIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KLSMKLSMgQ09ORklHX1VTQl9TVE9SQUdFIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgSW5wdXQgRGV2aWNlcwotIwotIyBDT05GSUdfVVNCX0hJRCBpcyBub3Qgc2V0Ci0jIEhJRF9TVVBQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgSElEIEJvb3QgUHJvdG9jb2wgZHJpdmVycwotIwotIyBDT05GSUdfVVNCX0tCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTU9VU0UgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FJUFRFSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfV0FDT00gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0tCVEFCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9QT1dFUk1BVEUgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX01UT1VDSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfRUdBTEFYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9YUEFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BVElfUkVNT1RFIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgSW1hZ2luZyBkZXZpY2VzCi0jCi0jIENPTkZJR19VU0JfTURDODAwIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgTXVsdGltZWRpYSBkZXZpY2VzCi0jCi0jIENPTkZJR19VU0JfREFCVVNCIGlzIG5vdCBzZXQKLQotIwotIyBWaWRlbzRMaW51eCBzdXBwb3J0IGlzIG5lZWRlZCBmb3IgVVNCIE11bHRpbWVkaWEgZGV2aWNlIHN1cHBvcnQKLSMKLQotIwotIyBVU0IgTmV0d29yayBBZGFwdGVycwotIwotIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0tBV0VUSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUEVHQVNVUyBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX1JUTDgxNTA9eQotIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIHBvcnQgZHJpdmVycwotIwotCi0jCi0jIFVTQiBTZXJpYWwgQ29udmVydGVyIHN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9TRVJJQUwgaXMgbm90IHNldAotCi0jCi0jIFVTQiBNaXNjZWxsYW5lb3VzIGRyaXZlcnMKLSMKLSMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FVRVJTV0FMRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTEVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9QSElER0VUS0lUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9QSElER0VUU0VSVk8gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAotCi0jCi0jIFVTQiBBVE0vRFNMIGRyaXZlcnMKLSMKLQotIwotIyBVU0IgR2FkZ2V0IFN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKIAogIwogIyBLZXJuZWwgaGFja2luZwogIwogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1RFTV9QUk9GSUxFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FVFJBWF9LR0RCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAotIyBDT05GSUdfRlJBTUVfUE9JTlRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19OTUlfT09QUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRD15CitDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQorIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorIyBDT05GSUdfU0xVQl9ERUJVR19PTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCiAjCiAjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLQotIwotIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKLSMKKyMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CiAKICMKLSMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKLSMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0Ci0KLSMKICMgTGlicmFyeSByb3V0aW5lcwogIworQ09ORklHX0JJVFJFVkVSU0U9eQogIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAogQ09ORklHX1pMSUJfSU5GTEFURT15CiBDT05GSUdfWkxJQl9ERUZMQVRFPXkKK0NPTkZJR19QTElTVD15CitDT05GSUdfSEFTX0RNQT15CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvZXRyYXhmc19kZWZjb25maWcgYi9hcmNoL2NyaXMvZXRyYXhmc19kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNjNjQ2YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvY3Jpcy9ldHJheGZzX2RlZmNvbmZpZwpAQCAtMCwwICsxLDU4NSBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI0LXJjMworIyBGcmkgTm92IDMwIDE0OjI0OjI2IDIwMDcKKyMKK0NPTkZJR19NTVU9eQorQ09ORklHX1pPTkVfRE1BPXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0lPTUFQPXkKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfTk9fSU9QT1JUPXkKK0NPTkZJR19GT1JDRV9NQVhfWk9ORU9SREVSPTYKK0NPTkZJR19DUklTPXkKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWSVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VSX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BJRF9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0CitDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRD15CitDT05GSUdfRkFJUl9VU0VSX1NDSEVEPXkKKyMgQ09ORklHX0ZBSVJfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQorIyBDT05GSUdfS0FMTFNZTVMgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0VMRl9DT1JFPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19BTk9OX0lOT0RFUz15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1NMVUJfREVCVUc9eQorIyBDT05GSUdfU0xBQiBpcyBub3Qgc2V0CitDT05GSUdfU0xVQj15CisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKK0NPTkZJR19SVF9NVVRFWEVTPXkKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorIyBDT05GSUdfTU9EVUxFUyBpcyBub3Qgc2V0CitDT05GSUdfQkxPQ0s9eQorIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKKyMgQ09ORklHX0lPU0NIRURfQVMgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0NGUT15CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iY2ZxIgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19FVFJBWF9DTURMSU5FPSJyb290PS9kZXYvbXRkYmxvY2szIGluaXQ9L2xpbnV4cmMiCisjIENPTkZJR19FVFJBWF9XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfRVRSQVhfRkFTVF9USU1FUj15CisjIENPTkZJR19FVFJBWF9LTUFMTE9DRURfTU9EVUxFUyBpcyBub3Qgc2V0CisjIENPTkZJR19PT01fUkVCT09UIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVFTVBUX05PTkU9eQorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTEKK0NPTkZJR19CT1VOQ0U9eQorQ09ORklHX1ZJUlRfVE9fQlVTPXkKKworIworIyBIYXJkd2FyZSBzZXR1cAorIworIyBDT05GSUdfRVRSQVgxMDBMWCBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWDEwMExYX1YyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NWSU5UT19TSU0gaXMgbm90IHNldAorQ09ORklHX0VUUkFYRlM9eQorIyBDT05GSUdfQ1JJU19NQUNIX0FSVFBFQzMgaXMgbm90IHNldAorIyBDT05GSUdfRVRSQVhfVkNTX1NJTSBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWF9BUkNIX1YxMCBpcyBub3Qgc2V0CitDT05GSUdfRVRSQVhfQVJDSF9WMzI9eQorQ09ORklHX0VUUkFYX0RSQU1fU0laRT0zMgorQ09ORklHX0VUUkFYX0ZMQVNIX0JVU1dJRFRIPTIKK0NPTkZJR19FVFJBWF9OQU5ERkxBU0hfQlVTV0lEVEg9MQorQ09ORklHX0VUUkFYX0ZMQVNIMV9TSVpFPTQKK0NPTkZJR19FVFJBWF9ERUJVR19QT1JUMD15CisjIENPTkZJR19FVFJBWF9ERUJVR19QT1JUMSBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWF9ERUJVR19QT1JUMiBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWF9ERUJVR19QT1JUMyBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWF9ERUJVR19QT1JUX05VTEwgaXMgbm90IHNldAorQ09ORklHX0VUUkFYX0RSQU1fVklSVFVBTF9CQVNFPWMwMDAwMDAwCisKKyMKKyMgRVRSQVggRlMgb3B0aW9ucworIworQ09ORklHX0VUUkFYX1NFUklBTF9QT1JUUz00CitDT05GSUdfRVRSQVhfTUVNX0dSUDFfQ09ORklHPTQwNDRhCitDT05GSUdfRVRSQVhfTUVNX0dSUDJfQ09ORklHPTAKK0NPTkZJR19FVFJBWF9NRU1fR1JQM19DT05GSUc9MAorQ09ORklHX0VUUkFYX01FTV9HUlA0X0NPTkZJRz0wCitDT05GSUdfRVRSQVhfU0RSQU1fR1JQMF9DT05GSUc9MzM2CitDT05GSUdfRVRSQVhfU0RSQU1fR1JQMV9DT05GSUc9MAorQ09ORklHX0VUUkFYX1NEUkFNX1RJTUlORz0xMDRhCitDT05GSUdfRVRSQVhfU0RSQU1fQ09NTUFORD0wCitDT05GSUdfRVRSQVhfREVGX0dJT19QQV9PRT0xYworQ09ORklHX0VUUkFYX0RFRl9HSU9fUEFfT1VUPTAwCitDT05GSUdfRVRSQVhfREVGX0dJT19QQl9PRT0wMDAwMAorQ09ORklHX0VUUkFYX0RFRl9HSU9fUEJfT1VUPTAwMDAwCitDT05GSUdfRVRSQVhfREVGX0dJT19QQ19PRT0wMDAwMAorQ09ORklHX0VUUkFYX0RFRl9HSU9fUENfT1VUPTAwMDAwCitDT05GSUdfRVRSQVhfREVGX0dJT19QRF9PRT0wMDAwMAorQ09ORklHX0VUUkFYX0RFRl9HSU9fUERfT1VUPTAwMDAwCitDT05GSUdfRVRSQVhfREVGX0dJT19QRV9PRT0wMDAwMAorQ09ORklHX0VUUkFYX0RFRl9HSU9fUEVfT1VUPTAwMDAwCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWF9OQlJfTEVEX0dSUF9aRVJPIGlzIG5vdCBzZXQKK0NPTkZJR19FVFJBWF9OQlJfTEVEX0dSUF9PTkU9eQorIyBDT05GSUdfRVRSQVhfTkJSX0xFRF9HUlBfVFdPIGlzIG5vdCBzZXQKK0NPTkZJR19FVFJBWF9MRURfR19ORVQwPSJQQTMiCitDT05GSUdfRVRSQVhfTEVEX1JfTkVUMD0iUEE0IgorQ09ORklHX0VUUkFYX1YzMl9MRUQyRz0iUEE1IgorQ09ORklHX0VUUkFYX1YzMl9MRUQyUj0iUEE2IgorQ09ORklHX0VUUkFYX1YzMl9MRUQzRz0iUEE3IgorQ09ORklHX0VUUkFYX1YzMl9MRUQzUj0iUEE3IgorCisjCisjIE5ldHdvcmtpbmcKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTT15CisjIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAorIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGUk1fTUlHUkFURSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKKyMgQ09ORklHX0lQX1BOUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKKyMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKKyMgQ09ORklHX1RDUF9NRDVTSUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBfVlMgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRGSUxURVI9eQorIyBDT05GSUdfTkVURklMVEVSX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBDb3JlIE5ldGZpbHRlciBDb25maWd1cmF0aW9uCisjCisjIENPTkZJR19ORVRGSUxURVJfTkVUTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORl9DT05OVFJBQ0tfRU5BQkxFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORl9DT05OVFJBQ0sgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUQUJMRVMgaXMgbm90IHNldAorCisjCisjIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgorIworIyBDT05GSUdfSVBfTkZfUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfSVBUQUJMRVMgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfQVJQVEFCTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MKKyMKKyMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CisKKyMKKyMgRHJpdmVycyBmb3IgYnVpbHQtaW4gaW50ZXJmYWNlcworIworQ09ORklHX0VUUkFYX0VUSEVSTkVUPXkKKyMgQ09ORklHX0VUUkFYX0lERSBpcyBub3Qgc2V0CitDT05GSUdfRVRSQVhfQVhJU0ZMQVNITUFQPXkKK0NPTkZJR19FVFJBWF9QVEFCTEVfU0VDVE9SPTY1NTM2CisjIENPTkZJR19FVFJBWF9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfRVRSQVhfR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWF9OT19QSFkgaXMgbm90IHNldAorIyBDT05GSUdfRVRSQVhfRVRIRVJORVRfSUZBQ0UwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VUUkFYX0VUSEVSTkVUX0lGQUNFMSBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWEZTX1NFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWF9TWU5DSFJPTk9VU19TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfRVRSQVhfQVhJU0ZMQVNITUFQX01URDBXSE9MRSBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWF9OQU5ERkxBU0ggaXMgbm90IHNldAorIyBDT05GSUdfRVRSQVhfQ0FSREJVUyBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWF9JT1BfRldfTE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWF9TVFJFQU1DT1BST0MgaXMgbm90IHNldAorIyBDT05GSUdfRVRSQVhfU1BJX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19FVFJBWF9TUElfTU1DX0JPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VUUkFYX05FVFdPUktfTEVEX09OX1dIRU5fTElOSyBpcyBub3Qgc2V0CitDT05GSUdfRVRSQVhfTkVUV09SS19MRURfT05fV0hFTl9BQ1RJVklUWT15CisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorQ09ORklHX01URF9DT05DQVQ9eQorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DTURMSU5FX1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxLREVWUz15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorIyBDT05GSUdfU1NGREMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09PUFMgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CitDT05GSUdfTVREX0pFREVDUFJPQkU9eQorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0lOVEVMRVhUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0FNRFNURD15CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CitDT05GSUdfTVREX1JBTT15CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKK0NPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUz15CisjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTVREUkFNPXkKK0NPTkZJR19NVERSQU1fVE9UQUxfU0laRT0wCitDT05GSUdfTVREUkFNX0VSQVNFX1NJWkU9NjQKK0NPTkZJR19NVERSQU1fQUJTX1BPUz0weDAKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKKyMKKyMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVY9eQorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CitDT05GSUdfQkxLX0RFVl9SQU1fQkxPQ0tTSVpFPTEwMjQKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX05FVERFVklDRVNfTVVMVElRVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisjIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZfMTAwMD15CitDT05GSUdfTkVUREVWXzEwMDAwPXkKKworIworIyBXaXJlbGVzcyBMQU4KKyMKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKK0NPTkZJR19TRVJJTz15CisjIENPTkZJR19TRVJJT19JODA0MiBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19TRVJQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX0xJQlBTMiBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorQ09ORklHX0hXX1JBTkRPTT15CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKKyMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9GU19ERUJVRz0wCitDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVI9eQorIyBDT05GSUdfSkZGUzJfRlNfV0JVRl9WRVJJRlkgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfU1VNTUFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9aTElCPXkKKyMgQ09ORklHX0pGRlMyX0xaTyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfUlRJTUU9eQorIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAorQ09ORklHX0NSQU1GUz15CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfU1VOUlBDX0JJTkQzNCBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMTSBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNURU1fUFJPRklMRVIgaXMgbm90IHNldAorIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKKyMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMVUJfREVCVUdfT04gaXMgbm90IHNldAorIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1pMSUJfREVGTEFURT15CitDT05GSUdfUExJU1Q9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gvY3Jpcy9rZXJuZWwvbW9kdWxlLmMKaW5kZXggMTFiODY3ZC4uYTE4NzgzMyAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2tlcm5lbC9tb2R1bGUuYworKysgYi9hcmNoL2NyaXMva2VybmVsL21vZHVsZS5jCkBAIC0yOCwyMCArMjgsMjggQEAKICNkZWZpbmUgREVCVUdQKGZtdCAsIC4uLikKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0VUUkFYX0tNQUxMT0NFRF9NT0RVTEVTCisjZGVmaW5lIE1BTExPQ19NT0RVTEUoc2l6ZSkga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKQorI2RlZmluZSBGUkVFX01PRFVMRShyZWdpb24pIGtmcmVlKHJlZ2lvbikKKyNlbHNlCisjZGVmaW5lIE1BTExPQ19NT0RVTEUoc2l6ZSkgdm1hbGxvY19leGVjKHNpemUpCisjZGVmaW5lIEZSRUVfTU9EVUxFKHJlZ2lvbikgdmZyZWUocmVnaW9uKQorI2VuZGlmCisKIHZvaWQgKm1vZHVsZV9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJaWYgKHNpemUgPT0gMCkKIAkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHZtYWxsb2NfZXhlYyhzaXplKTsKKwlyZXR1cm4gTUFMTE9DX01PRFVMRShzaXplKTsKIH0KIAogCiAvKiBGcmVlIG1lbW9yeSByZXR1cm5lZCBmcm9tIG1vZHVsZV9hbGxvYyAqLwogdm9pZCBtb2R1bGVfZnJlZShzdHJ1Y3QgbW9kdWxlICptb2QsIHZvaWQgKm1vZHVsZV9yZWdpb24pCiB7Ci0JdmZyZWUobW9kdWxlX3JlZ2lvbik7CisJRlJFRV9NT0RVTEUobW9kdWxlX3JlZ2lvbik7CiAJLyogRklYTUU6IElmIG1vZHVsZV9yZWdpb24gPT0gbW9kLT5pbml0X3JlZ2lvbiwgdHJpbSBleGNlcHRpb24KLSAgICAgICAgICAgdGFibGUgZW50cmllcy4gKi8KKwkgICB0YWJsZSBlbnRyaWVzLiAqLwogfQogCiAvKiBXZSBkb24ndCBuZWVkIGFueXRoaW5nIHNwZWNpYWwuICovCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvY3Jpcy9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDljYTU1OGYuLmVmMmRiOGYgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvY3Jpcy9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xLDUgKzEsNCBAQAotLyogJElkOiBwcm9jZXNzLmMsdiAxLjIxIDIwMDUvMDMvMDQgMDg6MTY6MTcgc3RhcnZpayBFeHAgJAotICogCisvKgogICogIGxpbnV4L2FyY2gvY3Jpcy9rZXJuZWwvcHJvY2Vzcy5jCiAgKgogICogIENvcHlyaWdodCAoQykgMTk5NSAgTGludXMgVG9ydmFsZHMKQEAgLTcsMTA1ICs2LDYgQEAKICAqCiAgKiAgQXV0aG9yczogICBCam9ybiBXZXNlbiAoYmpvcm53QGF4aXMuY29tKQogICoKLSAqICAkTG9nOiBwcm9jZXNzLmMsdiAkCi0gKiAgUmV2aXNpb24gMS4yMSAgMjAwNS8wMy8wNCAwODoxNjoxNyAgc3RhcnZpawotICogIE1lcmdlIG9mIExpbnV4IDIuNi4xMS4KLSAqCi0gKiAgUmV2aXNpb24gMS4yMCAgMjAwNS8wMS8xOCAwNTo1NzoyMiAgc3RhcnZpawotICogIFJlbmFtZWQgaGx0X2NvdW50ZXIgdG8gY3Jpc19obHRfY291bnRlciBhbmQgbWFkZSBpdCBnbG9iYWwuCi0gKgotICogIFJldmlzaW9uIDEuMTkgIDIwMDQvMTAvMTkgMTM6MDc6NDMgIHN0YXJ2aWsKLSAqICBNZXJnZSBvZiBMaW51eCAyLjYuOQotICoKLSAqICBSZXZpc2lvbiAxLjE4ICAyMDA0LzA4LzE2IDEyOjM3OjIzICBzdGFydmlrCi0gKiAgTWVyZ2Ugb2YgTGludXggMi42LjgKLSAqCi0gKiAgUmV2aXNpb24gMS4xNyAgMjAwNC8wNC8wNSAxMzo1Mzo0OCAgc3RhcnZpawotICogIE1lcmdlIG9mIExpbnV4IDIuNi41Ci0gKgotICogIFJldmlzaW9uIDEuMTYgIDIwMDMvMTAvMjcgMDg6MDQ6MzMgIHN0YXJ2aWsKLSAqICBNZXJnZSBvZiBMaW51eCAyLjYuMC10ZXN0OQotICoKLSAqICBSZXZpc2lvbiAxLjE1ICAyMDAzLzA5LzExIDA3OjI5OjUyICBzdGFydmlrCi0gKiAgTWVyZ2Ugb2YgTGludXggMi42LjAtdGVzdDUKLSAqCi0gKiAgUmV2aXNpb24gMS4xNCAgMjAwMy8wNi8xMCAxMDoyMToxMiAgam9oYW5hCi0gKiAgTW92ZWQgdGhyZWFkX3NhdmVkX3BjKCkgZnJvbSBhcmNoL2NyaXMva2VybmVsL3Byb2Nlc3MuYyB0bwotICogIHN1YmFyY2ggc3BlY2lmaWMgcHJvY2Vzcy5jLiBhcmNoLXYzMiBoYXMgYW4gZXJwLCBubyBpcnAuCi0gKgotICogIFJldmlzaW9uIDEuMTMgIDIwMDMvMDQvMDkgMDU6MjA6NDcgIHN0YXJ2aWsKLSAqICBNZXJnZSBvZiBMaW51eCAyLjUuNjcKLSAqCi0gKiAgUmV2aXNpb24gMS4xMiAgMjAwMi8xMi8xMSAxNTo0MToxMSAgc3RhcnZpawotICogIEV4dHJhY3RlZCB2MTAgKEVUUkFYIDEwMExYKSBzcGVjaWZpYyBzdHVmZiB0byBhcmNoL2NyaXMvYXJjaC12MTAva2VybmVsCi0gKgotICogIFJldmlzaW9uIDEuMTEgIDIwMDIvMTIvMTAgMDk6MDA6MTAgIHN0YXJ2aWsKLSAqICBNZXJnZSBvZiBMaW51eCAyLjUuNTEKLSAqCi0gKiAgUmV2aXNpb24gMS4xMCAgMjAwMi8xMS8yNyAwODo0MjozNCAgc3RhcnZpawotICogIEFyZ3VtZW50IHRvIHVzZXJfcmVncygpIGlzIHRocmVhZF9pbmZvKgotICoKLSAqICBSZXZpc2lvbiAxLjkgIDIwMDIvMTEvMjYgMDk6NDQ6MjEgIHN0YXJ2aWsKLSAqICBOZXcgdGhyZWFkcyBleGl0cyB0aHJvdWdoIHJldF9mcm9tX2ZvcmsgKG5lY2Vzc2FyeSBmb3IgcHJlZW1wdGl2ZSBzY2hlZHVsaW5nKQotICoKLSAqICBSZXZpc2lvbiAxLjggIDIwMDIvMTEvMTkgMTQ6MzU6MjQgIHN0YXJ2aWsKLSAqICBDaGFuZ2VzIGZyb20gbGludXggMi40Ci0gKiAgQ2hhbmdlZCBzdHJ1Y3QgaW5pdGlhbGl6ZXIgc3ludGF4IHRvIHRoZSBjdXJyZW50bHkgcHJlZmVyZWQgbm90YXRpb24KLSAqCi0gKiAgUmV2aXNpb24gMS43ICAyMDAyLzExLzE4IDA3OjM5OjQyICBzdGFydmlrCi0gKiAgdGhyZWFkX3NhdmVkX3BjIG1vdmVkIGhlcmUgZnJvbSBwcm9jZXNzb3IuaAotICoKLSAqICBSZXZpc2lvbiAxLjYgIDIwMDIvMTEvMTQgMDY6NTE6MjcgIHN0YXJ2aWsKLSAqICBNYWRlIGNwdV9pZGxlIG1vcmUgc2ltaWxhciB3aXRoIG90aGVyIGFyY2hzCi0gKiAgaW5pdF90YXNrX3VuaW9uIC0+IGluaXRfdGhyZWFkX3VuaW9uCi0gKiAgVXBkYXRlZCBmb3IgbmV3IGludGVycnVwdCBtYWNyb3MKLSAqICBzeXNfY2xvbmUgYW5kIGRvX2ZvcmsgaGF2ZSBhIG5ldyBhcmd1bWVudCwgdXNlcl90aWQKLSAqCi0gKiAgUmV2aXNpb24gMS41ICAyMDAyLzExLzA1IDA2OjQ1OjExICBzdGFydmlrCi0gKiAgTWVyZ2Ugb2YgTGludXggMi41LjQ1Ci0gKgotICogIFJldmlzaW9uIDEuNCAgMjAwMi8wMi8wNSAxNTozNzo0NCAgYmpvcm53Ci0gKiAgTmVlZCBpbml0X3Rhc2suaAotICoKLSAqICBSZXZpc2lvbiAxLjMgIDIwMDIvMDEvMjEgMTU6MjI6NDkgIGJqb3JudwotICogIGN1cnJlbnQtPmNvdW50ZXIgaXMgZ29uZQotICoKLSAqICBSZXZpc2lvbiAxLjIyICAyMDAxLzExLzEzIDA5OjQwOjQzICBvcmphbmYKLSAqICBBZGRlZCBkdW1wX2ZwdSAobmVlZGVkIGZvciBjb3JlIGR1bXBzKS4KLSAqCi0gKiAgUmV2aXNpb24gMS4yMSAgMjAwMS8xMS8xMiAxODoyNjoyMSAgcGtqCi0gKiAgRml4ZWQgY29tcGlsZXIgd2FybmluZ3MuCi0gKgotICogIFJldmlzaW9uIDEuMjAgIDIwMDEvMTAvMDMgMDg6MjE6MzkgIGpvbmFzaGcKLSAqICBjYXVzZV9vZl9kZWF0aCBkb2VzIG5vdCBleGlzdCBpZiBDT05GSUdfU1ZJTlRPX1NJTSBpcyBkZWZpbmVkLgotICoKLSAqICBSZXZpc2lvbiAxLjE5ICAyMDAxLzA5LzI2IDExOjUyOjU0ICBiam9ybncKLSAqICBJTklUX01NQVAgaXMgZ29uZSBpbiAyLjQuMTAKLSAqCi0gKiAgUmV2aXNpb24gMS4xOCAgMjAwMS8wOC8yMSAyMTo0Mzo1MSAgaHAKLSAqICBNb3ZlIGxhc3Qgd2F0Y2hkb2cgZml4IGluc2lkZSAjaWZkZWYgQ09ORklHX0VUUkFYX1dBVENIRE9HCi0gKgotICogIFJldmlzaW9uIDEuMTcgIDIwMDEvMDgvMjEgMTM6NDg6MDEgIGpvbmFzaGcKLSAqICBBZGRlZCBmaXggYnkgSFAgdG8gYXZvaWQgb29wcyB3aGVuIGRvaW5nIGEgaGFyZF9yZXNldF9ub3cuCi0gKgotICogIFJldmlzaW9uIDEuMTYgIDIwMDEvMDYvMjEgMDI6MDA6NDAgIGhwCi0gKiAgCSogZW50cnkuUzogSW5jbHVkZSBhc20vdW5pc3RkLmguCi0gKiAgCShfc3lzX2NhbGxfdGFibGUpOiBVc2Ugc2VjdGlvbiAucm9kYXRhLCBub3QgLmRhdGEuCi0gKiAgCShfa2VybmVsX3RocmVhZCk6IE1vdmUgZnJvbS4uLgotICogIAkqIHByb2Nlc3MuYzogLi4uIGhlcmUuCi0gKiAgCSogZW50cnlvZmZzZXRzLmMgKFZBTCk6IEJyZWFrIG91dCBmcm9tLi4uCi0gKiAgCShPRik6IFVzZSBWQUwuCi0gKiAgCShMQ0xPTkVfVk0pOiBOZXcgYXNtaWZpZWQgdmFsdWUgZnJvbSBDTE9ORV9WTS4KLSAqCi0gKiAgUmV2aXNpb24gMS4xNSAgMjAwMS8wNi8yMCAxNjozMTo1NyAgaHAKLSAqICBBZGQgY29tbWVudHMgdG8gZGVzY3JpYmUgZW1wdHkgZnVuY3Rpb25zIGFjY29yZGluZyB0byByZXZpZXcuCi0gKgotICogIFJldmlzaW9uIDEuMTQgIDIwMDEvMDUvMjkgMTE6Mjc6NTkgIG1hcmt1c2wKLSAqICBGaXhlZCBzbyB0aGF0IGhhcmRfcmVzZXRfbm93IHdpbGwgZG8gcmVzZXQgZXZlbiBpZiB3YXRjaGRvZyB3YXNuJ3QgZW5hYmxlZAotICoKLSAqICBSZXZpc2lvbiAxLjEzICAyMDAxLzAzLzIwIDE5OjQ0OjA2ICBiam9ybncKLSAqICBVc2UgdGhlIDd0aCBzeXNjYWxsIGFyZ3VtZW50IGZvciByZWdzIGluc3RlYWQgb2YgY3VycmVudF9yZWdzCi0gKgogICovCiAKIC8qCkBAIC0yMDYsNiArMTA2LDcgQEAKICAqIGxvdyBleGl0IGxhdGVuY3kgKGllIHNpdCBpbiBhIGxvb3Agd2FpdGluZyBmb3IKICAqIHNvbWVib2R5IHRvIHNheSB0aGF0IHRoZXknZCBsaWtlIHRvIHJlc2NoZWR1bGUpCiAgKi8KKwogdm9pZCBjcHVfaWRsZSAodm9pZCkKIHsKIAkvKiBlbmRsZXNzIGlkbGUgbG9vcCB3aXRoIG5vIHByaW9yaXR5IGF0IGFsbCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvY3Jpcy9rZXJuZWwvcHRyYWNlLmMKaW5kZXggM2NjZDIwZS4uYjMyNjAyMyAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2NyaXMva2VybmVsL3B0cmFjZS5jCkBAIC0yLDY1ICsyLDExIEBACiAgKiAgbGludXgvYXJjaC9jcmlzL2tlcm5lbC9wdHJhY2UuYwogICoKICAqIFBhcnRzIHRha2VuIGZyb20gdGhlIG02OGsgcG9ydC4KLSAqIAorICoKICAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBBeGlzIENvbW11bmljYXRpb25zIEFCCiAgKgogICogQXV0aG9yczogICBCam9ybiBXZXNlbgogICoKLSAqICRMb2c6IHB0cmFjZS5jLHYgJAotICogUmV2aXNpb24gMS4xMCAgMjAwNC8wOS8yMiAxMTo1MDowMSAgb3JqYW5mCi0gKiAqIE1vdmVkIGdldF9yZWcvcHV0X3JlZyB0byBhcmNoLXNwZWNpZmljIGZpbGVzLgotICogKiBBZGRlZCBmdW5jdGlvbnMgdG8gYWNjZXNzIGRlYnVnIHJlZ2lzdGVycyAoQ1JJU3YzMikuCi0gKiAqIEFkZGVkIHN1cHBvcnQgZm9yIFBUUkFDRV9TSU5HTEVTVEVQIChDUklTdjMyKS4KLSAqICogQWRkZWQgUyBmbGFnIHRvIENDU19NQVNLIChDUklTdjMyKS4KLSAqCi0gKiBSZXZpc2lvbiAxLjkgIDIwMDMvMDcvMDQgMTI6NTY6MTEgIHRvYmlhc2EKLSAqIE1vdmVkIGFyY2gtc3BlY2lmaWMgY29kZSB0byBhcmNoLXNwZWNpZmljIGZpbGVzLgotICoKLSAqIFJldmlzaW9uIDEuOCAgMjAwMy8wNC8wOSAwNToyMDo0NyAgc3RhcnZpawotICogTWVyZ2Ugb2YgTGludXggMi41LjY3Ci0gKgotICogUmV2aXNpb24gMS43ICAyMDAyLzExLzI3IDA4OjQyOjM0ICBzdGFydmlrCi0gKiBBcmd1bWVudCB0byB1c2VyX3JlZ3MoKSBpcyB0aHJlYWRfaW5mbyoKLSAqCi0gKiBSZXZpc2lvbiAxLjYgIDIwMDIvMTEvMjAgMTE6NTY6MTEgIHN0YXJ2aWsKLSAqIE1lcmdlIG9mIExpbnV4IDIuNS40OAotICoKLSAqIFJldmlzaW9uIDEuNSAgMjAwMi8xMS8xOCAwNzo0MToxOSAgc3RhcnZpawotICogUmVtb3ZlZCB3YXJuaW5nCi0gKgotICogUmV2aXNpb24gMS40ICAyMDAyLzExLzExIDEyOjQ3OjI4ICBzdGFydmlrCi0gKiBTWVNDQUxMX1RSQUNFIGhhcyBiZWVuIG1vdmVkIHRvIHRocmVhZCBmbGFncwotICoKLSAqIFJldmlzaW9uIDEuMyAgMjAwMi8wMi8wNSAxNTozNzoxOCAgYmpvcm53Ci0gKiAqIEFkZCBkb19ub3RpZnlfcmVzdW1lIChyZXBsYWNlcyBkb19zaWduYWwgaW4gdGhlIGNhbGxjaGFpbikKLSAqICogc3lzY2FsbF90cmFjZSBpcyBub3cgZG9fc3lzY2FsbF90cmFjZQotICogKiBjdXJyZW50LT5wdHJhY2UgZmxhZyBQVF9UUkFDRVNZUyAtPiBQVF9TWVNDQUxMVFJBQ0UKLSAqICogS2VlcCB0cmFjayBvZiB0aGUgY3VycmVudC0+d29yay5zeXNjYWxsX3RyYWNlIGNvdW50ZXIKLSAqCi0gKiBSZXZpc2lvbiAxLjIgIDIwMDEvMTIvMTggMTM6MzU6MjAgIGJqb3JudwotICogQXBwbGllZCB0aGUgMi40LjEzLT4yLjQuMTYgQ1JJUyBwYXRjaCB0byAyLjUuMSAoaXMgYSBjb3B5IG9mIDIuNC4xNSkuCi0gKgotICogUmV2aXNpb24gMS44ICAyMDAxLzExLzEyIDE4OjI2OjIxICBwa2oKLSAqIEZpeGVkIGNvbXBpbGVyIHdhcm5pbmdzLgotICoKLSAqIFJldmlzaW9uIDEuNyAgMjAwMS8wOS8yNiAxMTo1Mzo0OSAgYmpvcm53Ci0gKiBQVFJBQ0VfREVUQUNIIHdvcmtzIG1vcmUgc2ltcGxlIGluIDIuNC4xMAotICoKLSAqIFJldmlzaW9uIDEuNiAgMjAwMS8wNy8yNSAxNjowODo0NyAgYmpvcm53Ci0gKiBQVFJBQ0VfQVRUQUNIIGJ1bGsgbW92ZWQgaW50byBhcmNoLWluZGVwZW5kZW50IGNvZGUgaW4gMi40LjcKLSAqCi0gKiBSZXZpc2lvbiAxLjUgIDIwMDEvMDMvMjYgMTQ6MjQ6MjggIG9yamFuZgotICogKiBDaGFuZ2VkIGxvb3AgY29uZGl0aW9uLgotICogKiBBZGRlZCBjb21tZW50IGRvY3VtZW50aW5nIG5vbi1zdGFuZGFyZCBwdHJhY2UgYmVoYXZpb3VyLgotICoKLSAqIFJldmlzaW9uIDEuNCAgMjAwMS8wMy8yMCAxOTo0NDo0MSAgYmpvcm53Ci0gKiBVc2UgdGhlIHVzZXJfcmVncyBtYWNybyBpbnN0ZWFkIG9mIHRocmVhZC5lc3AwCi0gKgotICogUmV2aXNpb24gMS4zICAyMDAwLzEyLzE4IDIzOjQ1OjI1ICBiam9ybncKLSAqIExpbnV4L0NSSVMgZmlyc3QgdmVyc2lvbgotICoKLSAqCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtODUsNyArMzEsNyBAQAogCiAKIHZvaWQgZG9fbm90aWZ5X3Jlc3VtZShpbnQgY2FucmVzdGFydCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCSAgICAgIF9fdTMyIHRocmVhZF9pbmZvX2ZsYWdzICApCisJCSAgICAgIF9fdTMyIHRocmVhZF9pbmZvX2ZsYWdzKQogewogCS8qIGRlYWwgd2l0aCBwZW5kaW5nIHNpZ25hbCBkZWxpdmVyeSAqLwogCWlmICh0aHJlYWRfaW5mb19mbGFncyAmIF9USUZfU0lHUEVORElORykKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9rZXJuZWwvc2VtYXBob3JlLmMgYi9hcmNoL2NyaXMva2VybmVsL3NlbWFwaG9yZS5jCmluZGV4IGI4ODQyNjMuLmYxMzdhNDM5IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMva2VybmVsL3NlbWFwaG9yZS5jCisrKyBiL2FyY2gvY3Jpcy9rZXJuZWwvc2VtYXBob3JlLmMKQEAgLTQsNyArNCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUtaGVscGVyLmg+CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMva2VybmVsL3NldHVwLmMgYi9hcmNoL2NyaXMva2VybmVsL3NldHVwLmMKaW5kZXggNjU0NjZjNC4uMDRkNDhkZCAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvY3Jpcy9rZXJuZWwvc2V0dXAuYwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjcmVlbl9pbmZvLmg+CiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgotCisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAKIC8qCkBAIC0zNiw2ICszNiw4IEBACiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHJvbWZzX3N0YXJ0LCByb21mc19sZW5ndGgsIHJvbWZzX2luX2ZsYXNoOyAvKiBmcm9tIGhlYWQuUyAqLwogCitzdGF0aWMgc3RydWN0IGNwdSBjcHVfZGV2aWNlc1tOUl9DUFVTXTsKKwogZXh0ZXJuIHZvaWQgc2hvd19ldHJheF9jb3B5cmlnaHQodm9pZCk7CQkvKiBhcmNoLXZYL2tlcm5lbC9zZXR1cC5jICovCiAKIC8qIFRoaXMgbWFpbmx5IHNldHMgdXAgdGhlIG1lbW9yeSBhcmVhLCBhbmQgY2FuIGJlIHJlYWxseSBjb25mdXNpbmcuCkBAIC00NSwyNCArNDcsMjMgQEAKICAqIGdpdmVuIGJ5IHRoZSBtYWNybyBfX3BhKCkuCiAgKgogICogSW4gdGhpcyBEUkFNLCB0aGUga2VybmVsIGNvZGUgYW5kIGRhdGEgaXMgbG9hZGVkLCBpbiB0aGUgYmVnaW5uaW5nLgotICogSXQgcmVhbGx5IHN0YXJ0cyBhdCBjMDAwNDAwMCB0byBtYWtlIHJvb20gZm9yIHNvbWUgc3BlY2lhbCBwYWdlcyAtIAorICogSXQgcmVhbGx5IHN0YXJ0cyBhdCBjMDAwNDAwMCB0byBtYWtlIHJvb20gZm9yIHNvbWUgc3BlY2lhbCBwYWdlcyAtCiAgKiB0aGUgc3RhcnQgYWRkcmVzcyBpcyB0ZXh0X3N0YXJ0LiBUaGUga2VybmVsIGRhdGEgZW5kcyBhdCBfZW5kLiBBZnRlcgogICogdGhpcyB0aGUgUk9NIGZpbGVzeXN0ZW0gaXMgYXBwZW5kZWQgKGlmIHRoZXJlIGlzIGFueSkuCi0gKiAKKyAqCiAgKiBCZXR3ZWVuIHRoaXMgYWRkcmVzcyBhbmQgZHJhbV9lbmQsIHdlIGhhdmUgUkFNIHBhZ2VzIHVzYWJsZSB0byB0aGUKICAqIGJvb3QgY29kZSBhbmQgdGhlIHN5c3RlbS4KICAqCiAgKi8KIAotdm9pZCBfX2luaXQgCi1zZXR1cF9hcmNoKGNoYXIgKipjbWRsaW5lX3ApCit2b2lkIF9faW5pdCBzZXR1cF9hcmNoKGNoYXIgKipjbWRsaW5lX3ApCiB7CiAJZXh0ZXJuIHZvaWQgaW5pdF9ldHJheF9kZWJ1Zyh2b2lkKTsKIAl1bnNpZ25lZCBsb25nIGJvb3RtYXBfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgbWF4X3BmbjsKIAl1bnNpZ25lZCBsb25nIG1lbW9yeV9zdGFydDsKIAotIAkvKiByZWdpc3RlciBhbiBpbml0aWFsIGNvbnNvbGUgcHJpbnRpbmcgcm91dGluZSBmb3IgcHJpbnRrJ3MgKi8KKwkvKiByZWdpc3RlciBhbiBpbml0aWFsIGNvbnNvbGUgcHJpbnRpbmcgcm91dGluZSBmb3IgcHJpbnRrJ3MgKi8KIAogCWluaXRfZXRyYXhfZGVidWcoKTsKIApAQCAtMTIxLDcgKzEyMiw3IEBACiAJbWluX2xvd19wZm4gPSBQQUdFX09GRlNFVCA+PiBQQUdFX1NISUZUOwogCiAJYm9vdG1hcF9zaXplID0gaW5pdF9ib290bWVtX25vZGUoTk9ERV9EQVRBKDApLCBzdGFydF9wZm4sCi0JCQkJCSBtaW5fbG93X3BmbiwgCisJCQkJCSBtaW5fbG93X3BmbiwKIAkJCQkJIG1heF9sb3dfcGZuKTsKIAogCS8qIEFuZCBmcmVlIGFsbCBtZW1vcnkgbm90IGJlbG9uZ2luZyB0byB0aGUga2VybmVsIChhZGRyLCBzaXplKSAqLwpAQCAtMTM3LDcgKzEzOCw3IEBACiAJICogQXJndW1lbnRzIGFyZSBzdGFydCwgc2l6ZQogICAgICAgICAgKi8KIAotICAgICAgICByZXNlcnZlX2Jvb3RtZW0oUEZOX1BIWVMoc3RhcnRfcGZuKSwgYm9vdG1hcF9zaXplKTsKKwlyZXNlcnZlX2Jvb3RtZW0oUEZOX1BIWVMoc3RhcnRfcGZuKSwgYm9vdG1hcF9zaXplLCBCT09UTUVNX0RFRkFVTFQpOwogCiAJLyogcGFnaW5nX2luaXQoKSBzZXRzIHVwIHRoZSBNTVUgYW5kIG1hcmtzIGFsbCBwYWdlcyBhcyByZXNlcnZlZCAqLwogCkBAIC0xODAsMTEgKzE4MSwyMyBAQAogCiBleHRlcm4gaW50IHNob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpOwogCi1zdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgY3B1aW5mb19vcCA9IHsKK2NvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBjcHVpbmZvX29wID0gewogCS5zdGFydCA9IGNfc3RhcnQsCiAJLm5leHQgID0gY19uZXh0LAogCS5zdG9wICA9IGNfc3RvcCwKIAkuc2hvdyAgPSBzaG93X2NwdWluZm8sCiB9OwogCitzdGF0aWMgaW50IF9faW5pdCB0b3BvbG9neV9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQkgcmV0dXJuIHJlZ2lzdGVyX2NwdSgmY3B1X2RldmljZXNbaV0sIGkpOworCX0KKworCXJldHVybiAwOworfQorCitzdWJzeXNfaW5pdGNhbGwodG9wb2xvZ3lfaW5pdCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9rZXJuZWwvdGltZS5jIGIvYXJjaC9jcmlzL2tlcm5lbC90aW1lLmMKaW5kZXggN2EyY2M3ZS4uZmY0YzZhYSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9jcmlzL2tlcm5lbC90aW1lLmMKQEAgLTEsNSArMSw0IEBACi0vKiAkSWQ6IHRpbWUuYyx2IDEuMTggMjAwNS8wMy8wNCAwODoxNjoxNyBzdGFydmlrIEV4cCAkCi0gKgorLyoKICAqICBsaW51eC9hcmNoL2NyaXMva2VybmVsL3RpbWUuYwogICoKICAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTUgIExpbnVzIFRvcnZhbGRzCkBAIC0xOCw3ICsxNyw3IEBACiAgKiBMaW51eC9DUklTIHNwZWNpZmljIGNvZGU6CiAgKgogICogQXV0aG9yczogICAgQmpvcm4gV2VzZW4KLSAqICAgICAgICAgICAgIEpvaGFuIEFkb2xmc3NvbiAgCisgKiAgICAgICAgICAgICBKb2hhbiBBZG9sZnNzb24KICAqCiAgKi8KIApAQCAtMjA4LDEwICsyMDcsMTYgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BST0ZJTElORwotICAgICAgICBwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORyk7CisJcHJvZmlsZV90aWNrKENQVV9QUk9GSUxJTkcpOwogI2VuZGlmCiB9CiAKK3Vuc2lnbmVkIGxvbmcgbG9uZyBzY2hlZF9jbG9jayh2b2lkKQoreworCXJldHVybiAodW5zaWduZWQgbG9uZyBsb25nKWppZmZpZXMgKiAoMTAwMDAwMDAwMCAvIEhaKSArCisJCWdldF9uc19pbl9qaWZmaWUoKTsKK30KKwogc3RhdGljIGludAogX19pbml0IGluaXRfdWRlbGF5KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMva2VybmVsL3RyYXBzLmMgYi9hcmNoL2NyaXMva2VybmVsL3RyYXBzLmMKaW5kZXggNTIwZDkyMi4uNTQxZWZiZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2NyaXMva2VybmVsL3RyYXBzLmMKQEAgLTEsNjYgKzEsNzggQEAKLS8qICRJZDogdHJhcHMuYyx2IDEuMTEgMjAwNS8wMS8yNCAxNjowMzoxOSBvcmphbmYgRXhwICQKLSAqCisvKgogICogIGxpbnV4L2FyY2gvY3Jpcy90cmFwcy5jCiAgKgotICogIEhlcmUgd2UgaGFuZGxlIHRoZSBicmVhayB2ZWN0b3JzIG5vdCB1c2VkIGJ5IHRoZSBzeXN0ZW0gY2FsbCAKLSAqICBtZWNoYW5pc20sIGFzIHdlbGwgYXMgc29tZSBnZW5lcmFsIHN0YWNrL3JlZ2lzdGVyIGR1bXBpbmcgCisgKiAgSGVyZSB3ZSBoYW5kbGUgdGhlIGJyZWFrIHZlY3RvcnMgbm90IHVzZWQgYnkgdGhlIHN5c3RlbSBjYWxsCisgKiAgbWVjaGFuaXNtLCBhcyB3ZWxsIGFzIHNvbWUgZ2VuZXJhbCBzdGFjay9yZWdpc3RlciBkdW1waW5nCiAgKiAgdGhpbmdzLgotICogCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNyBBeGlzIENvbW11bmljYXRpb25zIEFCCiAgKgogICogIEF1dGhvcnM6ICAgQmpvcm4gV2VzZW4KLSAqICAJICAgICAgIEhhbnMtUGV0ZXIgTmlsc3NvbgorICogICAgICAgICAgICAgSGFucy1QZXRlciBOaWxzc29uCiAgKgogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKK2V4dGVybiB2b2lkIGFyY2hfZW5hYmxlX25taSh2b2lkKTsKK2V4dGVybiB2b2lkIHN0b3Bfd2F0Y2hkb2codm9pZCk7CitleHRlcm4gdm9pZCByZXNldF93YXRjaGRvZyh2b2lkKTsKK2V4dGVybiB2b2lkIHNob3dfcmVnaXN0ZXJzKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworI2lmZGVmIENPTkZJR19ERUJVR19CVUdWRVJCT1NFCitleHRlcm4gdm9pZCBoYW5kbGVfQlVHKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKyNlbHNlCisjZGVmaW5lIGhhbmRsZV9CVUcocmVncykKKyNlbmRpZgorCiBzdGF0aWMgaW50IGtzdGFja19kZXB0aF90b19wcmludCA9IDI0OwogCi1leHRlcm4gaW50IHJhd19wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pOwordm9pZCAoKm5taV9oYW5kbGVyKShzdHJ1Y3QgcHRfcmVncyAqKTsKIAotdm9pZCBzaG93X3RyYWNlKHVuc2lnbmVkIGxvbmcgKiBzdGFjaykKK3ZvaWQKK3Nob3dfdHJhY2UodW5zaWduZWQgbG9uZyAqc3RhY2spCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyLCBtb2R1bGVfc3RhcnQsIG1vZHVsZV9lbmQ7CiAJZXh0ZXJuIGNoYXIgX3N0ZXh0LCBfZXRleHQ7CiAJaW50IGk7CiAKLSAgICAgICAgcmF3X3ByaW50aygiXG5DYWxsIFRyYWNlOiAiKTsKKwlwcmludGsoIlxuQ2FsbCBUcmFjZTogIik7CiAKLSAgICAgICAgaSA9IDE7Ci0gICAgICAgIG1vZHVsZV9zdGFydCA9IFZNQUxMT0NfU1RBUlQ7Ci0gICAgICAgIG1vZHVsZV9lbmQgPSBWTUFMTE9DX0VORDsKKwlpID0gMTsKKwltb2R1bGVfc3RhcnQgPSBWTUFMTE9DX1NUQVJUOworCW1vZHVsZV9lbmQgPSBWTUFMTE9DX0VORDsKIAotICAgICAgICB3aGlsZSAoKChsb25nKSBzdGFjayAmIChUSFJFQURfU0laRS0xKSkgIT0gMCkgewotCQlpZiAoX19nZXRfdXNlciAoYWRkciwgc3RhY2spKSB7CisJd2hpbGUgKCgobG9uZylzdGFjayAmIChUSFJFQURfU0laRS0xKSkgIT0gMCkgeworCQlpZiAoX19nZXRfdXNlcihhZGRyLCBzdGFjaykpIHsKIAkJCS8qIFRoaXMgbWVzc2FnZSBtYXRjaGVzICJmYWlsaW5nIGFkZHJlc3MiIG1hcmtlZAogCQkJICAgczM5MCBpbiBrc3ltb29wcywgc28gbGluZXMgY29udGFpbmluZyBpdCB3aWxsCiAJCQkgICBub3QgYmUgZmlsdGVyZWQgb3V0IGJ5IGtzeW1vb3BzLiAgKi8KLQkJCXJhd19wcmludGsgKCJGYWlsaW5nIGFkZHJlc3MgMHglbHhcbiIsICh1bnNpZ25lZCBsb25nKXN0YWNrKTsKKwkJCXByaW50aygiRmFpbGluZyBhZGRyZXNzIDB4JWx4XG4iLCAodW5zaWduZWQgbG9uZylzdGFjayk7CiAJCQlicmVhazsKIAkJfQogCQlzdGFjaysrOwogCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBJZiB0aGUgYWRkcmVzcyBpcyBlaXRoZXIgaW4gdGhlIHRleHQgc2VnbWVudCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgKiBrZXJuZWwsIG9yIGluIHRoZSByZWdpb24gd2hpY2ggY29udGFpbnMgdm1hbGxvYydlZAotICAgICAgICAgICAgICAgICAqIG1lbW9yeSwgaXQgKm1heSogYmUgdGhlIGFkZHJlc3Mgb2YgYSBjYWxsaW5nCi0gICAgICAgICAgICAgICAgICogcm91dGluZTsgaWYgc28sIHByaW50IGl0IHNvIHRoYXQgc29tZW9uZSB0cmFjaW5nCi0gICAgICAgICAgICAgICAgICogZG93biB0aGUgY2F1c2Ugb2YgdGhlIGNyYXNoIHdpbGwgYmUgYWJsZSB0byBmaWd1cmUKLSAgICAgICAgICAgICAgICAgKiBvdXQgdGhlIGNhbGwgcGF0aCB0aGF0IHdhcyB0YWtlbi4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoKChhZGRyID49ICh1bnNpZ25lZCBsb25nKSAmX3N0ZXh0KSAmJgotICAgICAgICAgICAgICAgICAgICAgKGFkZHIgPD0gKHVuc2lnbmVkIGxvbmcpICZfZXRleHQpKSB8fAotICAgICAgICAgICAgICAgICAgICAoKGFkZHIgPj0gbW9kdWxlX3N0YXJ0KSAmJiAoYWRkciA8PSBtb2R1bGVfZW5kKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICYmICgoaSAlIDgpID09IDApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfcHJpbnRrKCJcbiAgICAgICAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhd19wcmludGsoIls8JTA4bHg+XSAiLCBhZGRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJLyoKKwkJICogSWYgdGhlIGFkZHJlc3MgaXMgZWl0aGVyIGluIHRoZSB0ZXh0IHNlZ21lbnQgb2YgdGhlCisJCSAqIGtlcm5lbCwgb3IgaW4gdGhlIHJlZ2lvbiB3aGljaCBjb250YWlucyB2bWFsbG9jJ2VkCisJCSAqIG1lbW9yeSwgaXQgKm1heSogYmUgdGhlIGFkZHJlc3Mgb2YgYSBjYWxsaW5nCisJCSAqIHJvdXRpbmU7IGlmIHNvLCBwcmludCBpdCBzbyB0aGF0IHNvbWVvbmUgdHJhY2luZworCQkgKiBkb3duIHRoZSBjYXVzZSBvZiB0aGUgY3Jhc2ggd2lsbCBiZSBhYmxlIHRvIGZpZ3VyZQorCQkgKiBvdXQgdGhlIGNhbGwgcGF0aCB0aGF0IHdhcyB0YWtlbi4KKwkJICovCisJCWlmICgoKGFkZHIgPj0gKHVuc2lnbmVkIGxvbmcpJl9zdGV4dCkgJiYKKwkJICAgICAoYWRkciA8PSAodW5zaWduZWQgbG9uZykmX2V0ZXh0KSkgfHwKKwkJICAgICgoYWRkciA+PSBtb2R1bGVfc3RhcnQpICYmIChhZGRyIDw9IG1vZHVsZV9lbmQpKSkgeworCQkJaWYgKGkgJiYgKChpICUgOCkgPT0gMCkpCisJCQkJcHJpbnRrKCJcbiAgICAgICAiKTsKKwkJCXByaW50aygiWzwlMDhseD5dICIsIGFkZHIpOworCQkJaSsrOworCQl9CisJfQogfQogCiAvKgpAQCAtNzgsMTA5ICs5MCwxNDkgQEAKICAqIHdpdGggdGhlIGtzeW1vb3BzIG1haW50YWluZXIuCiAgKi8KIAotdm9pZCAKK3ZvaWQKIHNob3dfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICpzcCkKIHsKLSAgICAgICAgdW5zaWduZWQgbG9uZyAqc3RhY2ssIGFkZHI7Ci0gICAgICAgIGludCBpOworCXVuc2lnbmVkIGxvbmcgKnN0YWNrLCBhZGRyOworCWludCBpOwogCiAJLyoKIAkgKiBkZWJ1Z2dpbmcgYWlkOiAic2hvd19zdGFjayhOVUxMKTsiIHByaW50cyBhCiAJICogYmFjayB0cmFjZS4KIAkgKi8KIAotICAgICAgICBpZihzcCA9PSBOVUxMKSB7CisJaWYgKHNwID09IE5VTEwpIHsKIAkJaWYgKHRhc2spCiAJCQlzcCA9ICh1bnNpZ25lZCBsb25nKil0YXNrLT50aHJlYWQua3NwOwogCQllbHNlCiAJCQlzcCA9ICh1bnNpZ25lZCBsb25nKilyZHNwKCk7CiAJfQogCi0gICAgICAgIHN0YWNrID0gc3A7CisJc3RhY2sgPSBzcDsKIAotCXJhd19wcmludGsoIlxuU3RhY2sgZnJvbSAlMDhseDpcbiAgICAgICAiLCAodW5zaWduZWQgbG9uZylzdGFjayk7Ci0gICAgICAgIGZvcihpID0gMDsgaSA8IGtzdGFja19kZXB0aF90b19wcmludDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCgobG9uZykgc3RhY2sgJiAoVEhSRUFEX1NJWkUtMSkpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBpZiAoaSAmJiAoKGkgJSA4KSA9PSAwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhd19wcmludGsoIlxuICAgICAgICIpOwotCQlpZiAoX19nZXRfdXNlciAoYWRkciwgc3RhY2spKSB7CisJcHJpbnRrKCJcblN0YWNrIGZyb20gJTA4bHg6XG4gICAgICAgIiwgKHVuc2lnbmVkIGxvbmcpc3RhY2spOworCWZvciAoaSA9IDA7IGkgPCBrc3RhY2tfZGVwdGhfdG9fcHJpbnQ7IGkrKykgeworCQlpZiAoKChsb25nKXN0YWNrICYgKFRIUkVBRF9TSVpFLTEpKSA9PSAwKQorCQkJYnJlYWs7CisJCWlmIChpICYmICgoaSAlIDgpID09IDApKQorCQkJcHJpbnRrKCJcbiAgICAgICAiKTsKKwkJaWYgKF9fZ2V0X3VzZXIoYWRkciwgc3RhY2spKSB7CiAJCQkvKiBUaGlzIG1lc3NhZ2UgbWF0Y2hlcyAiZmFpbGluZyBhZGRyZXNzIiBtYXJrZWQKIAkJCSAgIHMzOTAgaW4ga3N5bW9vcHMsIHNvIGxpbmVzIGNvbnRhaW5pbmcgaXQgd2lsbAogCQkJICAgbm90IGJlIGZpbHRlcmVkIG91dCBieSBrc3ltb29wcy4gICovCi0JCQlyYXdfcHJpbnRrICgiRmFpbGluZyBhZGRyZXNzIDB4JWx4XG4iLCAodW5zaWduZWQgbG9uZylzdGFjayk7CisJCQlwcmludGsoIkZhaWxpbmcgYWRkcmVzcyAweCVseFxuIiwgKHVuc2lnbmVkIGxvbmcpc3RhY2spOwogCQkJYnJlYWs7CiAJCX0KIAkJc3RhY2srKzsKLQkJcmF3X3ByaW50aygiJTA4bHggIiwgYWRkcik7Ci0gICAgICAgIH0KKwkJcHJpbnRrKCIlMDhseCAiLCBhZGRyKTsKKwl9CiAJc2hvd190cmFjZShzcCk7CiB9CiAKLXN0YXRpYyB2b2lkICgqbm1pX2hhbmRsZXIpKHN0cnVjdCBwdF9yZWdzKik7Ci1leHRlcm4gdm9pZCBhcmNoX2VuYWJsZV9ubWkodm9pZCk7CisjaWYgMAorLyogZGlzcGxheXMgYSBzaG9ydCBzdGFjayB0cmFjZSAqLwogCi12b2lkIHNldF9ubWlfaGFuZGxlcih2b2lkICgqaGFuZGxlcikoc3RydWN0IHB0X3JlZ3MqKSkKK2ludAorc2hvd19zdGFjayh2b2lkKQogewotICBubWlfaGFuZGxlciA9IGhhbmRsZXI7Ci0gIGFyY2hfZW5hYmxlX25taSgpOworCXVuc2lnbmVkIGxvbmcgKnNwID0gKHVuc2lnbmVkIGxvbmcgKilyZHVzcCgpOworCWludCBpOworCisJcHJpbnRrKCJTdGFjayBkdW1wIFsweCUwOGx4XTpcbiIsICh1bnNpZ25lZCBsb25nKXNwKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJcHJpbnRrKCJzcCArICVkOiAweCUwOGx4XG4iLCBpKjQsIHNwW2ldKTsKKwlyZXR1cm4gMDsKIH0KKyNlbmRpZgogCi12b2lkIGhhbmRsZV9ubWkoc3RydWN0IHB0X3JlZ3MqIHJlZ3MpCit2b2lkCitkdW1wX3N0YWNrKHZvaWQpCiB7Ci0gIGlmIChubWlfaGFuZGxlcikKLSAgICBubWlfaGFuZGxlcihyZWdzKTsKKwlzaG93X3N0YWNrKE5VTEwsIE5VTEwpOworfQorRVhQT1JUX1NZTUJPTChkdW1wX3N0YWNrKTsKKwordm9pZAorc2V0X25taV9oYW5kbGVyKHZvaWQgKCpoYW5kbGVyKShzdHJ1Y3QgcHRfcmVncyAqKSkKK3sKKwlubWlfaGFuZGxlciA9IGhhbmRsZXI7CisJYXJjaF9lbmFibGVfbm1pKCk7CiB9CiAKICNpZmRlZiBDT05GSUdfREVCVUdfTk1JX09PUFMKLXZvaWQgb29wc19ubWlfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyogcmVncykKK3ZvaWQKK29vcHNfbm1pX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0gIHN0b3Bfd2F0Y2hkb2coKTsKLSAgcmF3X3ByaW50aygiTk1JIVxuIik7Ci0gIHNob3dfcmVnaXN0ZXJzKHJlZ3MpOworCXN0b3Bfd2F0Y2hkb2coKTsKKwlvb3BzX2luX3Byb2dyZXNzID0gMTsKKwlwcmludGsoIk5NSSFcbiIpOworCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOworCW9vcHNfaW5fcHJvZ3Jlc3MgPSAwOwogfQogCi1zdGF0aWMgaW50Ci1fX2luaXQgb29wc19ubWlfcmVnaXN0ZXIodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0Citvb3BzX25taV9yZWdpc3Rlcih2b2lkKQogewotICBzZXRfbm1pX2hhbmRsZXIob29wc19ubWlfaGFuZGxlcik7Ci0gIHJldHVybiAwOworCXNldF9ubWlfaGFuZGxlcihvb3BzX25taV9oYW5kbGVyKTsKKwlyZXR1cm4gMDsKIH0KIAogX19pbml0Y2FsbChvb3BzX25taV9yZWdpc3Rlcik7CiAKICNlbmRpZgogCi0jaWYgMAotLyogZGlzcGxheXMgYSBzaG9ydCBzdGFjayB0cmFjZSAqLwotCi1pbnQgCi1zaG93X3N0YWNrKCkKKy8qCisgKiBUaGlzIGdldHMgY2FsbGVkIGZyb20gZW50cnkuUyB3aGVuIHRoZSB3YXRjaGRvZyBoYXMgYml0dGVuLiBTaG93IHNvbWV0aGluZworICogc2ltaWxpYXIgdG8gYW4gT29wcyBkdW1wLCBhbmQgaWYgdGhlIGtlcm5lbCBpcyBjb25maWd1cmVkIHRvIGJlIGEgbmljZQorICogZG9nZ3ksIHRoZW4gaGFsdCBpbnN0ZWFkIG9mIHJlYm9vdC4KKyAqLwordm9pZAord2F0Y2hkb2dfYml0ZV9ob29rKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXVuc2lnbmVkIGxvbmcgKnNwID0gKHVuc2lnbmVkIGxvbmcgKilyZHVzcCgpOwotCWludCBpOwotCXJhd19wcmludGsoIlN0YWNrIGR1bXAgWzB4JTA4bHhdOlxuIiwgKHVuc2lnbmVkIGxvbmcpc3ApOwotCWZvcihpID0gMDsgaSA8IDE2OyBpKyspCi0JCXJhd19wcmludGsoInNwICsgJWQ6IDB4JTA4bHhcbiIsIGkqNCwgc3BbaV0pOwotCXJldHVybiAwOworI2lmZGVmIENPTkZJR19FVFJBWF9XQVRDSERPR19OSUNFX0RPR0dZCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlzdG9wX3dhdGNoZG9nKCk7CisJc2hvd19yZWdpc3RlcnMocmVncyk7CisKKwl3aGlsZSAoMSkKKwkJOyAvKiBEbyBub3RoaW5nLiAqLworI2Vsc2UKKwlzaG93X3JlZ2lzdGVycyhyZWdzKTsKKyNlbmRpZgogfQorCisvKiBUaGlzIGlzIG5vcm1hbGx5IHRoZSBPb3BzIGZ1bmN0aW9uLiAqLwordm9pZAorZGllX2lmX2tlcm5lbChjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycikKK3sKKwlpZiAodXNlcl9tb2RlKHJlZ3MpKQorCQlyZXR1cm47CisKKyNpZmRlZiBDT05GSUdfRVRSQVhfV0FUQ0hET0dfTklDRV9ET0dHWQorCS8qCisJICogVGhpcyBwcmludG91dCBtaWdodCB0YWtlIHRvbyBsb25nIGFuZCBjb3VsZCB0cmlnZ2VyCisJICogdGhlIHdhdGNoZG9nIG5vcm1hbGx5LiBJZiBOSUNFX0RPR0dZIGlzIHNldCwgc2ltcGx5CisJICogc3RvcCB0aGUgd2F0Y2hkb2cgZHVyaW5nIHRoZSBwcmludG91dC4KKwkgKi8KKwlzdG9wX3dhdGNoZG9nKCk7CiAjZW5kaWYKIAotdm9pZCBkdW1wX3N0YWNrKHZvaWQpCi17Ci0Jc2hvd19zdGFjayhOVUxMLCBOVUxMKTsKKwloYW5kbGVfQlVHKHJlZ3MpOworCisJcHJpbnRrKCIlczogJTA0bHhcbiIsIHN0ciwgZXJyICYgMHhmZmZmKTsKKworCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOworCisJb29wc19pbl9wcm9ncmVzcyA9IDA7CisKKyNpZmRlZiBDT05GSUdfRVRSQVhfV0FUQ0hET0dfTklDRV9ET0dHWQorCXJlc2V0X3dhdGNoZG9nKCk7CisjZW5kaWYKKwlkb19leGl0KFNJR1NFR1YpOwogfQogCi1FWFBPUlRfU1lNQk9MKGR1bXBfc3RhY2spOwotCi12b2lkIF9faW5pdCAKK3ZvaWQgX19pbml0CiB0cmFwX2luaXQodm9pZCkKIHsKIAkvKiBOb3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUgKi8KIH0KLQotdm9pZCBzcGlubmluZ19jcHUodm9pZCogYWRkcikKLXsKLSAgcmF3X3ByaW50aygiQ1BVICVkIHNwaW5uaW5nIG9uICVYXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCksIGFkZHIpOwotICBkdW1wX3N0YWNrKCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvbW0vZmF1bHQuYyBiL2FyY2gvY3Jpcy9tbS9mYXVsdC5jCmluZGV4IDMwMzRmM2YuLmM0Yzc2ZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9tbS9mYXVsdC5jCisrKyBiL2FyY2gvY3Jpcy9tbS9mYXVsdC5jCkBAIC0xLDEzMCArMSw5IEBACiAvKgogICogIGxpbnV4L2FyY2gvY3Jpcy9tbS9mYXVsdC5jCiAgKgotICogIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSAgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgorICogIENvcHlyaWdodCAoQykgMjAwMC0yMDA2ICBBeGlzIENvbW11bmljYXRpb25zIEFCCiAgKgotICogIEF1dGhvcnM6ICBCam9ybiBXZXNlbiAKLSAqIAotICogICRMb2c6IGZhdWx0LmMsdiAkCi0gKiAgUmV2aXNpb24gMS4yMCAgMjAwNS8wMy8wNCAwODoxNjoxOCAgc3RhcnZpawotICogIE1lcmdlIG9mIExpbnV4IDIuNi4xMS4KLSAqCi0gKiAgUmV2aXNpb24gMS4xOSAgMjAwNS8wMS8xNCAxMDowNzo1OSAgc3RhcnZpawotICogIEZpeGVkIHdhcm5pbmcuCi0gKgotICogIFJldmlzaW9uIDEuMTggIDIwMDUvMDEvMTIgMDg6MTA6MTQgIHN0YXJ2aWsKLSAqICBSZS1hZGRlZCB0aGUgY2hhbmdlIG9mIGZyYW1ldHlwZSB3aGVuIGhhbmRsaW5nIGtlcm5lbCBwYWdlIGZhdWx0IGZpeHVwCi0gKiAgZm9yIHYxMC4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gYXZvaWQgdGhhdCB0aGUgQ1BVIHJlbWFrZXMgdGhlIGZhdWx0aW5nCi0gKiAgYWNjZXNzLgotICoKLSAqICBSZXZpc2lvbiAxLjE3ICAyMDA1LzAxLzExIDEzOjUzOjA1ICBzdGFydmlrCi0gKiAgVXNlIHJhd19wcmludGsuCi0gKgotICogIFJldmlzaW9uIDEuMTYgIDIwMDQvMTIvMTcgMTE6Mzk6NDEgIHN0YXJ2aWsKLSAqICBTTVAgc3VwcG9ydC4KLSAqCi0gKiAgUmV2aXNpb24gMS4xNSAgMjAwNC8xMS8yMyAxODozNjoxOCAgc3RhcnZpawotICogIFN0YWNrIGlzIG5vdyBub24tZXhlY3V0YWJsZS4KLSAqICBTaWduYWwgaGFuZGxlciB0cmFtcG9saW5lcyBhcmUgcGxhY2VkIGluIGEgcmVzZXJ2ZWQgcGFnZSBtYXBwZWQgaW50byBhbGwKLSAqICBwcm9jZXNzZXMuCi0gKgotICogIFJldmlzaW9uIDEuMTQgIDIwMDQvMTEvMjMgMDc6MTA6MjEgIHN0YXJ2aWsKLSAqICBNb3ZlZCBmaW5kX2ZpeHVwX2NvZGUgdG8gZ2VuZXJpYyBjb2RlLgotICoKLSAqICBSZXZpc2lvbiAxLjEzICAyMDA0LzExLzIzIDA3OjAwOjU0ICBzdGFydmlrCi0gKiAgQWN0dWFsbHkgdXNlIHRoZSBleGVjdXRlIHBlcm1pc3Npb24gYml0IGluIHRoZSBNTVUuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUKLSAqICB0byBwcmV2ZW50IGUuZy4gYXR0YWNrcyB3aGVyZSBleGVjdXRhYmxlIGNvZGUgaXMgcHV0IG9uIHRoZSBzdGFjay4KLSAqCi0gKiAgUmV2aXNpb24gMS4xMiAgMjAwNC8wOS8yOSAwNjoxNjowNCAgc3RhcnZpawotICogIFVzZSBpbnN0cnVjdGlvbl9wb2ludGVyCi0gKgotICogIFJldmlzaW9uIDEuMTEgIDIwMDQvMDUvMTQgMDc6NTg6MDUgIHN0YXJ2aWsKLSAqICBNZXJnZSBvZiBjaGFuZ2VzIGZyb20gMi40Ci0gKgotICogIFJldmlzaW9uIDEuMTAgIDIwMDMvMTAvMjcgMTQ6NTE6MjQgIHN0YXJ2aWsKLSAqICBSZW1vdmVkIGRlYnVnY29kZQotICoKLSAqICBSZXZpc2lvbiAxLjkgIDIwMDMvMTAvMjcgMTQ6NTA6NDIgIHN0YXJ2aWsKLSAqICBDaGFuZ2VkIGRvX3BhZ2VfZmF1bHQgc2lnbmF0dXJlCi0gKgotICogIFJldmlzaW9uIDEuOCAgMjAwMy8wNy8wNCAxMzowMjo0OCAgdG9iaWFzYQotICogIE1vdmVkIGNvZGUgc25pcHBldCBmcm9tIGFyY2gvY3Jpcy9tbS9mYXVsdC5jIHRoYXQgc2VhcmNoZXMgZm9yIGZpeHVwIGNvZGUKLSAqICB0byBzZXBhcmF0ZSBmdW5jdGlvbiBpbiBhcmNoLXNwZWNpZmljIGZpbGVzLgotICoKLSAqICBSZXZpc2lvbiAxLjcgIDIwMDMvMDEvMjIgMDY6NDg6MzggIHN0YXJ2aWsKLSAqICBGaXhlZCB3YXJuaW5ncyBpc3N1ZWQgYnkgR0NDIDMuMi4xCi0gKgotICogIFJldmlzaW9uIDEuNiAgMjAwMy8wMS8wOSAxNDo0Mjo1MiAgc3RhcnZpawotICogIE1lcmdlIG9mIExpbnV4IDIuNS41NQotICoKLSAqICBSZXZpc2lvbiAxLjUgIDIwMDIvMTIvMTEgMTQ6NDQ6NDggIHN0YXJ2aWsKLSAqICBFeHRyYWN0ZWQgdjEwIChFVFJBWCAxMDBMWCkgc3BlY2lmaWMgc3R1ZmYgdG8gYXJjaC9jcmlzL2FyY2gtdjEwL21tCi0gKgotICogIFJldmlzaW9uIDEuNCAgMjAwMi8xMS8xMyAxNToxMDoyOCAgc3RhcnZpawotICogIHB0ZV9vZmZzZXQgaGFzIGJlZW4gcmVuYW1lZCB0byBwdGVfb2Zmc2V0X2tlcm5lbAotICoKLSAqICBSZXZpc2lvbiAxLjMgIDIwMDIvMTEvMDUgMDY6NDU6MTMgIHN0YXJ2aWsKLSAqICBNZXJnZSBvZiBMaW51eCAyLjUuNDUKLSAqCi0gKiAgUmV2aXNpb24gMS4yICAyMDAxLzEyLzE4IDEzOjM1OjIyICBiam9ybncKLSAqICBBcHBsaWVkIHRoZSAyLjQuMTMtPjIuNC4xNiBDUklTIHBhdGNoIHRvIDIuNS4xIChpcyBhIGNvcHkgb2YgMi40LjE1KS4KLSAqCi0gKiAgUmV2aXNpb24gMS4yMCAgMjAwMS8xMS8yMiAxMzozNDowNiAgYmpvcm53Ci0gKiAgKiBCdWcgd29ya2Fyb3VuZCAoTFggVFI4OSk6IGZvcmNlIGEgcmVydW4gb2YgdGhlIHdob2xlIG9mIGFuIGludGVycnVwdGVkCi0gKiAgICB1bmFsaWduZWQgd3JpdGUsIGJlY2F1c2UgdGhlIHNlY29uZCBoYWxmIG9mIHRoZSB3cml0ZSB3aWxsIGJlIGNvcnJ1cHRlZAotICogICAgb3RoZXJ3aXNlLiBBZmZlY3RlZCB1bmFsaWduZWQgd3JpdGVzIHNwYW5uaW5nIG5vdC15ZXQgbWFwcGVkIHBhZ2VzLgotICogICogT3B0aW1pemF0aW9uOiB1c2UgdGhlIHdyX3JkIGJpdCBpbiBSX01NVV9DQVVTRSB0byBrbm93IHdoZXRoZXIgYSBtaXNzCi0gKiAgICB3YXMgZHVlIHRvIGEgcmVhZCBvciBhIHdyaXRlIChiZWZvcmUgd2UgZGlkbid0IGtub3cgdGhpcyB1bnRpbCB0aGUgbmV4dAotICogICAgcmVzdGFydCBvZiB0aGUgaW50ZXJydXB0ZWQgaW5zdHJ1Y3Rpb24sIHRodXMgd2FzdGluZyBvbmUgZmF1bHQtaXJxKQotICoKLSAqICBSZXZpc2lvbiAxLjE5ICAyMDAxLzExLzEyIDE5OjAyOjEwICBwa2oKLSAqICBGaXhlZCBjb21waWxlciB3YXJuaW5ncy4KLSAqCi0gKiAgUmV2aXNpb24gMS4xOCAgMjAwMS8wNy8xOCAyMjoxNDozMiAgYmpvcm53Ci0gKiAgRW5hYmxlIGludGVycnVwdHMgaW4gdGhlIGJ1bGsgb2YgZG9fcGFnZV9mYXVsdAotICoKLSAqICBSZXZpc2lvbiAxLjE3ICAyMDAxLzA3LzE4IDEzOjA3OjIzICBiam9ybncKLSAqICAqIERldGVjdCBub24tZXhpc3RhbnQgUFRFJ3MgaW4gdm1hbGxvYyBwbWQgc3luY2hyb25pemF0aW9uCi0gKiAgKiBSZW1vdmUgY29tbWVudCBhYm91dCBmYXN0LXBhdGhzIGZvciBWTUFMTE9DX1NUQVJUIGV0YywgYmVjYXVzZSBhbGwgdGhhdAotICogICAgd2FzIHRvdGFsbHkgYm9ndXMgYW55d2F5IGl0IHR1cm5lZCBvdXQgOikKLSAqICAqIEZpeCBkZXRlY3Rpb24gb2Ygdm1hbGxvYy1hcmVhIHN5bmNocm9uaXphdGlvbgotICogICogQWRkIHNvbWUgY29tbWVudHMKLSAqCi0gKiAgUmV2aXNpb24gMS4xNiAgMjAwMS8wNi8xMyAwMDowNjowOCAgYmpvcm53Ci0gKiAgY3VycmVudF9wZ2Qgc2hvdWxkIGJlIHZvbGF0aWxlCi0gKgotICogIFJldmlzaW9uIDEuMTUgIDIwMDEvMDYvMTMgMDA6MDI6MjMgIGJqb3JudwotICogIFVzZSBhIHNlcGFyYXRlIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBjdXJyZW50IHBnZCB0byBhdm9pZCByYWNlcyBpbiBzY2hlZHVsZQotICoKLSAqICBSZXZpc2lvbiAxLjE0ICAyMDAxLzA1LzE2IDE3OjQxOjA3ICBocAotICogIExhc3QgY29tbWVudCB0d2VhayBmdXJ0aGVyIHR3ZWFrZWQuCi0gKgotICogIFJldmlzaW9uIDEuMTMgIDIwMDEvMDUvMTUgMDA6NTg6NDQgIGhwCi0gKiAgRXhwYW5kIGEgYml0IG9uIHRoZSBjb21tZW50IHdoeSB3ZSBjb21wYXJlIGFkZHJlc3MgPj0gVEFTS19TSVpFIHJhdGhlcgotICogIHRoYW4gPj0gVk1BTExPQ19TVEFSVC4KLSAqCi0gKiAgUmV2aXNpb24gMS4xMiAgMjAwMS8wNC8wNCAxMDo1MToxNCAgYmpvcm53Ci0gKiAgbW1hcF9zZW0gaXMgZ3JhYmJlZCBmb3IgcmVhZGluZwotICoKLSAqICBSZXZpc2lvbiAxLjExICAyMDAxLzAzLzIzIDA3OjM2OjA3ICBzdGFydmlrCi0gKiAgQ29ycmVjdGVkIGFjY29yZGluZyB0byByZXZpZXcgcmVtYXJrcwotICoKLSAqICBSZXZpc2lvbiAxLjEwICAyMDAxLzAzLzIxIDE2OjEwOjExICBiam9ybncKLSAqICBDUklTX0ZSQU1FX0ZJWFVQIG5vdCBuZWVkZWQgYW55bW9yZSwgdXNlIEZSQU1FX05PUk1BTAotICoKLSAqICBSZXZpc2lvbiAxLjkgIDIwMDEvMDMvMDUgMTM6MjI6MjAgIGJqb3JudwotICogIFNwZWxsLWZpeCBhbmQgZml4IGluIHZtYWxsb2NfZmF1bHQgaGFuZGxpbmcKLSAqCi0gKiAgUmV2aXNpb24gMS44ICAyMDAwLzExLzIyIDE0OjQ1OjMxICBiam9ybncKLSAqICAqIDIuNC4wLXRlc3QxMCByZW1vdmVkIHRoZSBzZXRfcGdkaXIgaW5zdGFudGFuZW91cyBrZXJuZWwgZ2xvYmFsIG1hcHBpbmcKLSAqICAgIGludG8gYWxsIHByb2Nlc3Nlcy4gSW5zdGVhZCB3ZSBmaWxsIGluIHRoZSBtaXNzaW5nIFBURSBlbnRyaWVzIG9uIGRlbWFuZC4KLSAqCi0gKiAgUmV2aXNpb24gMS43ICAyMDAwLzExLzIxIDE2OjM5OjA5ICBiam9ybncKLSAqICBmaXh1cCBzd2l0Y2hlcyBmcmFtZXR5cGUKLSAqCi0gKiAgUmV2aXNpb24gMS42ICAyMDAwLzExLzE3IDE2OjU0OjA4ICBiam9ybncKLSAqICBNb3JlIGRldGFpbGVkIHNpZ2luZm8gcmVwb3J0aW5nCi0gKgorICogIEF1dGhvcnM6ICBCam9ybiBXZXNlbgogICoKICAqLwogCkBAIC0xMzUsNyArMTQsNiBAQAogCiBleHRlcm4gaW50IGZpbmRfZml4dXBfY29kZShzdHJ1Y3QgcHRfcmVncyAqKTsKIGV4dGVybiB2b2lkIGRpZV9pZl9rZXJuZWwoY29uc3QgY2hhciAqLCBzdHJ1Y3QgcHRfcmVncyAqLCBsb25nKTsKLWV4dGVybiBpbnQgcmF3X3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKIC8qIGRlYnVnIG9mIGxvdy1sZXZlbCBUTEIgcmVsb2FkICovCiAjdW5kZWYgREVCVUcKQEAgLTE2NCw4ICs0Miw4IEBACiAgKiBhZGRyZXNzLgogICoKICAqIGVycm9yX2NvZGU6Ci0gKgliaXQgMCA9PSAwIG1lYW5zIG5vIHBhZ2UgZm91bmQsIDEgbWVhbnMgcHJvdGVjdGlvbiBmYXVsdAotICoJYml0IDEgPT0gMCBtZWFucyByZWFkLCAxIG1lYW5zIHdyaXRlCisgKiAgICAgIGJpdCAwID09IDAgbWVhbnMgbm8gcGFnZSBmb3VuZCwgMSBtZWFucyBwcm90ZWN0aW9uIGZhdWx0CisgKiAgICAgIGJpdCAxID09IDAgbWVhbnMgcmVhZCwgMSBtZWFucyB3cml0ZQogICoKICAqIElmIHRoaXMgcm91dGluZSBkZXRlY3RzIGEgYmFkIGFjY2VzcywgaXQgcmV0dXJucyAxLCBvdGhlcndpc2UgaXQKICAqIHJldHVybnMgMC4KQEAgLTE4MSw5ICs1OSwxMCBAQAogCXNpZ2luZm9fdCBpbmZvOwogCWludCBmYXVsdDsKIAotICAgICAgICBEKHByaW50aygiUGFnZSBmYXVsdCBmb3IgJWxYIG9uICVYIGF0ICVsWCwgcHJvdCAlZCB3cml0ZSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgYWRkcmVzcywgc21wX3Byb2Nlc3Nvcl9pZCgpLCBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpLAotICAgICAgICAgICAgICAgICBwcm90ZWN0aW9uLCB3cml0ZWFjY2VzcykpOworCUQocHJpbnRrKEtFUk5fREVCVUcKKwkJICJQYWdlIGZhdWx0IGZvciAlbFggb24gJVggYXQgJWxYLCBwcm90ICVkIHdyaXRlICVkXG4iLAorCQkgYWRkcmVzcywgc21wX3Byb2Nlc3Nvcl9pZCgpLCBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpLAorCQkgcHJvdGVjdGlvbiwgd3JpdGVhY2Nlc3MpKTsKIAogCXRzayA9IGN1cnJlbnQ7CiAKQEAgLTIzMyw3ICsxMTIsNyBAQAogCSAqIGNvbnRleHQsIHdlIG11c3Qgbm90IHRha2UgdGhlIGZhdWx0Li4KIAkgKi8KIAotCWlmIChpbl9hdG9taWMoKSB8fCAhbW0pCisJaWYgKGluX2ludGVycnVwdCgpIHx8ICFtbSkKIAkJZ290byBub19jb250ZXh0OwogCiAJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOwpAQCAtMzE5LDYgKzE5OCw5IEBACiAJCS8qIGluZm8uc2lfY29kZSBoYXMgYmVlbiBzZXQgYWJvdmUgKi8KIAkJaW5mby5zaV9hZGRyID0gKHZvaWQgKilhZGRyZXNzOwogCQlmb3JjZV9zaWdfaW5mbyhTSUdTRUdWLCAmaW5mbywgdHNrKTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlcyAocGlkICVkKSBzZWdmYXVsdHMgZm9yIHBhZ2UgIgorCQkgICAgICAgImFkZHJlc3MgJTA4bHggYXQgcGMgJTA4bHhcbiIsCisJCSAgICAgICB0c2stPmNvbW0sIHRzay0+cGlkLCBhZGRyZXNzLCBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzI2LDcgKzIwOCw3IEBACiAKIAkvKiBBcmUgd2UgcHJlcGFyZWQgdG8gaGFuZGxlIHRoaXMga2VybmVsIGZhdWx0PwogCSAqCi0JICogKFRoZSBrZXJuZWwgaGFzIHZhbGlkIGV4Y2VwdGlvbi1wb2ludHMgaW4gdGhlIHNvdXJjZSAKKwkgKiAoVGhlIGtlcm5lbCBoYXMgdmFsaWQgZXhjZXB0aW9uLXBvaW50cyBpbiB0aGUgc291cmNlCiAJICogIHdoZW4gaXQgYWNlc3NlcyB1c2VyLW1lbW9yeS4gV2hlbiBpdCBmYWlscyBpbiBvbmUKIAkgKiAgb2YgdGhvc2UgcG9pbnRzLCB3ZSBmaW5kIGl0IGluIGEgdGFibGUgYW5kIGRvIGEganVtcAogCSAqICB0byBzb21lIGZpeHVwIGNvZGUgdGhhdCBsb2FkcyBhbiBhcHByb3ByaWF0ZSBlcnJvcgpAQCAtMzQxLDEzICsyMjMsMTggQEAKIAkgKiB0ZXJtaW5hdGUgdGhpbmdzIHdpdGggZXh0cmVtZSBwcmVqdWRpY2UuCiAJICovCiAKLQlpZiAoKHVuc2lnbmVkIGxvbmcpIChhZGRyZXNzKSA8IFBBR0VfU0laRSkKLQkJcmF3X3ByaW50ayhLRVJOX0FMRVJUICJVbmFibGUgdG8gaGFuZGxlIGtlcm5lbCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UiKTsKLQllbHNlCi0JCXJhd19wcmludGsoS0VSTl9BTEVSVCAiVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgYWNjZXNzIik7Ci0JcmF3X3ByaW50aygiIGF0IHZpcnR1YWwgYWRkcmVzcyAlMDhseFxuIixhZGRyZXNzKTsKKwlpZiAoIW9vcHNfaW5fcHJvZ3Jlc3MpIHsKKwkJb29wc19pbl9wcm9ncmVzcyA9IDE7CisJCWlmICgodW5zaWduZWQgbG9uZykgKGFkZHJlc3MpIDwgUEFHRV9TSVpFKQorCQkJcHJpbnRrKEtFUk5fQUxFUlQgIlVuYWJsZSB0byBoYW5kbGUga2VybmVsIE5VTEwgIgorCQkJCSJwb2ludGVyIGRlcmVmZXJlbmNlIik7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0FMRVJUICJVbmFibGUgdG8gaGFuZGxlIGtlcm5lbCBhY2Nlc3MiCisJCQkJIiBhdCB2aXJ0dWFsIGFkZHJlc3MgJTA4bHhcbiIsIGFkZHJlc3MpOwogCi0JZGllX2lmX2tlcm5lbCgiT29wcyIsIHJlZ3MsICh3cml0ZWFjY2VzcyA8PCAxKSB8IHByb3RlY3Rpb24pOworCQlkaWVfaWZfa2VybmVsKCJPb3BzIiwgcmVncywgKHdyaXRlYWNjZXNzIDw8IDEpIHwgcHJvdGVjdGlvbik7CisJCW9vcHNfaW5fcHJvZ3Jlc3MgPSAwOworCX0KIAogCWRvX2V4aXQoU0lHS0lMTCk7CiAKQEAgLTM2MCw3ICsyNDcsNyBAQAogCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CiAJcHJpbnRrKCJWTToga2lsbGluZyBwcm9jZXNzICVzXG4iLCB0c2stPmNvbW0pOwogCWlmICh1c2VyX21vZGUocmVncykpCi0JCWRvX2dyb3VwX2V4aXQoU0lHS0lMTCk7CisJCWRvX2V4aXQoU0lHS0lMTCk7CiAJZ290byBub19jb250ZXh0OwogCiAgZG9fc2lnYnVzOgpAQCAtNDA2LDggKzI5Myw4IEBACiAJCS8qIFNpbmNlIHdlJ3JlIHR3by1sZXZlbCwgd2UgZG9uJ3QgbmVlZCB0byBkbyBib3RoCiAJCSAqIHNldF9wZ2QgYW5kIHNldF9wbWQgKHRoZXkgZG8gdGhlIHNhbWUgdGhpbmcpLiBJZgogCQkgKiB3ZSBnbyB0aHJlZS1sZXZlbCBhdCBzb21lIHBvaW50LCBkbyB0aGUgcmlnaHQgdGhpbmcKLQkJICogd2l0aCBwZ2RfcHJlc2VudCBhbmQgc2V0X3BnZCBoZXJlLiAKLQkJICogCisJCSAqIHdpdGggcGdkX3ByZXNlbnQgYW5kIHNldF9wZ2QgaGVyZS4KKwkJICoKIAkJICogQWxzbywgc2luY2UgdGhlIHZtYWxsb2MgYXJlYSBpcyBnbG9iYWwsIHdlIGRvbid0CiAJCSAqIG5lZWQgdG8gY29weSBpbmRpdmlkdWFsIFBURSdzLCBpdCBpcyBlbm91Z2ggdG8KIAkJICogY29weSB0aGUgcGdkIHBvaW50ZXIgaW50byB0aGUgcHRlIHBhZ2Ugb2YgdGhlCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvbW0vaW5pdC5jIGIvYXJjaC9jcmlzL21tL2luaXQuYwppbmRleCAwYzgzM2QxLi40MjA3YTJiIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvbW0vaW5pdC5jCisrKyBiL2FyY2gvY3Jpcy9tbS9pbml0LmMKQEAgLTYsMTE3ICs2LDYgQEAKICAqCiAgKiAgQXV0aG9yczogIEJqb3JuIFdlc2VuIChiam9ybndAYXhpcy5jb20pCiAgKgotICogICRMb2c6IGluaXQuYyx2ICQKLSAqICBSZXZpc2lvbiAxLjExICAyMDA0LzA1LzI4IDA5OjI4OjU2ICBzdGFydmlrCi0gKiAgQ2FsY3VsYXRpb24gb2YgbG9vcHNfcGVyX3VzZWMgbW92ZWQgYmVjYXVzZSBpbml0aWFsaXphdGlvbiBvcmRlciBoYXMgY2hhbmdlZAotICogIGluIExpbnV4IDIuNi4KLSAqCi0gKiAgUmV2aXNpb24gMS4xMCAgMjAwNC8wNS8xNCAwNzo1ODowNSAgc3RhcnZpawotICogIE1lcmdlIG9mIGNoYW5nZXMgZnJvbSAyLjQKLSAqCi0gKiAgUmV2aXNpb24gMS45ICAyMDAzLzA3LzA0IDA4OjI3OjU0ICBzdGFydmlrCi0gKiAgTWVyZ2Ugb2YgTGludXggMi41Ljc0Ci0gKgotICogIFJldmlzaW9uIDEuOCAgMjAwMy8wNC8wOSAwNToyMDo0OCAgc3RhcnZpawotICogIE1lcmdlIG9mIExpbnV4IDIuNS42NwotICoKLSAqICBSZXZpc2lvbiAxLjcgIDIwMDMvMDEvMjIgMDY6NDg6MzggIHN0YXJ2aWsKLSAqICBGaXhlZCB3YXJuaW5ncyBpc3N1ZWQgYnkgR0NDIDMuMi4xCi0gKgotICogIFJldmlzaW9uIDEuNiAgMjAwMi8xMi8xMSAxNDo0NDo0OCAgc3RhcnZpawotICogIEV4dHJhY3RlZCB2MTAgKEVUUkFYIDEwMExYKSBzcGVjaWZpYyBzdHVmZiB0byBhcmNoL2NyaXMvYXJjaC12MTAvbW0KLSAqCi0gKiAgUmV2aXNpb24gMS41ICAyMDAyLzExLzE4IDA3OjM3OjM3ICBzdGFydmlrCi0gKiAgQWRkZWQgY2FjaGUgYnVnIHdvcmthcm91bmQgKGZyb20gTGludXggMi40KQotICoKLSAqICBSZXZpc2lvbiAxLjQgIDIwMDIvMTEvMTMgMTU6NDA6MjQgIHN0YXJ2aWsKLSAqICBSZW1vdmVkIHRoZSBwYWdlIHRhYmxlIGNhY2hlIHN0dWZmIChhcyBkb25lIGluIG90aGVyIGFyY2hzKQotICoKLSAqICBSZXZpc2lvbiAxLjMgIDIwMDIvMTEvMDUgMDY6NDU6MTMgIHN0YXJ2aWsKLSAqICBNZXJnZSBvZiBMaW51eCAyLjUuNDUKLSAqCi0gKiAgUmV2aXNpb24gMS4yICAyMDAxLzEyLzE4IDEzOjM1OjIyICBiam9ybncKLSAqICBBcHBsaWVkIHRoZSAyLjQuMTMtPjIuNC4xNiBDUklTIHBhdGNoIHRvIDIuNS4xIChpcyBhIGNvcHkgb2YgMi40LjE1KS4KLSAqCi0gKiAgUmV2aXNpb24gMS4zMSAgMjAwMS8xMS8xMyAxNjoyMjowMCAgYmpvcm53Ci0gKiAgU2tpcCBjYWxjdWxhdGluZyB0b3RhbHJhbSBhbmQgc2hhcmVkcmFtIGluIHNpX21lbWluZm8KLSAqCi0gKiAgUmV2aXNpb24gMS4zMCAgMjAwMS8xMS8xMiAxOTowMjoxMCAgcGtqCi0gKiAgRml4ZWQgY29tcGlsZXIgd2FybmluZ3MuCi0gKgotICogIFJldmlzaW9uIDEuMjkgIDIwMDEvMDcvMjUgMTY6MDk6NTAgIGJqb3JudwotICogIHZhbC0+c2hhcmVkcmFtIHdpbGwgc3RheSAwCi0gKgotICogIFJldmlzaW9uIDEuMjggIDIwMDEvMDYvMjggMTY6MzA6MTcgIGJqb3JudwotICogIE9vcHMuIFRoaXMgbmVlZHMgdG8gd2FpdCB1bnRpbCAyLjQuNiBpcyBtZXJnZWQKLSAqCi0gKiAgUmV2aXNpb24gMS4yNyAgMjAwMS8wNi8yOCAxNDowNDowNyAgYmpvcm53Ci0gKiAgRmlsbCBpbiBzaGFyZWRyYW0KLSAqCi0gKiAgUmV2aXNpb24gMS4yNiAgMjAwMS8wNi8xOCAwNjozNjowMiAgaHAKLSAqICBFbmFibGUgZnJlZV9pbml0bWVtIG9mIF9faW5pdC10eXBlIHBhZ2VzCi0gKgotICogIFJldmlzaW9uIDEuMjUgIDIwMDEvMDYvMTMgMDA6MDI6MjMgIGJqb3JudwotICogIFVzZSBhIHNlcGFyYXRlIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSBjdXJyZW50IHBnZCB0byBhdm9pZCByYWNlcyBpbiBzY2hlZHVsZQotICoKLSAqICBSZXZpc2lvbiAxLjI0ICAyMDAxLzA1LzE1IDAwOjUyOjIwICBocAotICogIE9ubHkgbWFwIHNlZ21lbnQgMHhhIGFzIHNlZyBpZiBDT05GSUdfSlVMSUVUVEUKLSAqCi0gKiAgUmV2aXNpb24gMS4yMyAgMjAwMS8wNC8wNCAxNDozNTo0MCAgYmpvcm53Ci0gKiAgKiBSZW1vdmVkIGdldF9wdGVfc2xvdyBhbmQgZnJpZW5kcyAoMi40LjMgY2hhbmdlKQotICogICogUmVtb3ZlZCBiYWRfcG1kIGhhbmRsaW5nICgyLjQuMyBjaGFuZ2UpCi0gKgotICogIFJldmlzaW9uIDEuMjIgIDIwMDEvMDQvMDQgMTM6Mzg6MDQgIG1hdHNmZwotICogIE1vdmVkIGlvcmVtYXAgdG8gYSBzZXBhcmF0ZSBmdW5jdGlvbiBpbnN0ZWFkCi0gKgotICogIFJldmlzaW9uIDEuMjEgIDIwMDEvMDMvMjcgMDk6Mjg6MzMgIGJqb3JudwotICogIGlvcmVtYXAgdXNlZCB0b28gZWFybHkgLSBsZXRzIHRyeSBpdCBpbiBtZW1faW5pdCBpbnN0ZWFkCi0gKgotICogIFJldmlzaW9uIDEuMjAgIDIwMDEvMDMvMjMgMDc6Mzk6MjEgIHN0YXJ2aWsKLSAqICBDb3JyZWN0ZWQgYWNjb3JkaW5nIHRvIHJldmlldyByZW1hcmtzCi0gKgotICogIFJldmlzaW9uIDEuMTkgIDIwMDEvMDMvMTUgMTQ6MjU6MTcgIGJqb3JudwotICogIE1vcmUgZ2VuZXJhbCBzaGFkb3cgcmVnaXN0ZXJzIGFuZCBpb3JlbWFwZWQgYWRkcmVzc2VzIGZvciBleHRlcm5hbCBJL08KLSAqCi0gKiAgUmV2aXNpb24gMS4xOCAgMjAwMS8wMi8yMyAxMjo0Njo0NCAgYmpvcm53Ci0gKiAgKiAweGMgd2FzIG5vdCBDU0UxOyAweDggaXMsIHNhbWUgYXMgdW5jYWNoZWQgZmxhc2gsIHNvIHdlIG1vdmUgdGhlIHVuY2FjaGVkCi0gKiAgICBmbGFzaCBkdXJpbmcgQ1JJU19MT1dfTUFQIGZyb20gMHhlIHRvIDB4OCBzbyBib3RoIHRoZSBmbGFzaCBhbmQgdGhlIEkvTwotICogICAgaXMgbWFwcGVkIHN0cmFpZ2h0IG92ZXIgKGZvciAhQ1JJU19MT1dfTUFQIHRoZSB1bmNhY2hlZCBmbGFzaCBpcyBzdGlsbCAweGUpCi0gKgotICogIFJldmlzaW9uIDEuMTcgIDIwMDEvMDIvMjIgMTU6MDU6MjEgIGJqb3JudwotICogIE1hcCAweDkgc3RyYWlnaHQgb3ZlciBkdXJpbmcgTE9XX01BUCB0byBhbGxvdyBmb3IgbWVtb3J5IG1hcHBlZCBMRURzCi0gKgotICogIFJldmlzaW9uIDEuMTYgIDIwMDEvMDIvMjIgMTU6MDI6MzUgIGJqb3JudwotICogIE1hcCAweGMgc3RyYWlnaHQgb3ZlciBkdXJpbmcgTE9XX01BUCB0byBhbGxvdyBmb3IgbWVtb3J5IG1hcHBlZCBJL08KLSAqCi0gKiAgUmV2aXNpb24gMS4xNSAgMjAwMS8wMS8xMCAyMToxMjoxMCAgYmpvcm53Ci0gKiAgbG9vcHNfcGVyX3NlYyAtPiBsb29wc19wZXJfamlmZnkKLSAqCi0gKiAgUmV2aXNpb24gMS4xNCAgMjAwMC8xMS8yMiAxNjoyMzoyMCAgYmpvcm53Ci0gKiAgSW5pdGlhbGl6ZSB0b3RhbGhpZ2ggY291bnRlcnMgdG8gMCB0byBtYWtlIC9wcm9jL21lbWluZm8gbG9vayBuaWNlLgotICoKLSAqICBSZXZpc2lvbiAxLjEzICAyMDAwLzExLzIxIDE2OjM3OjUxICBiam9ybncKLSAqICBUZW1wb3JhcmlseSBkaXNhYmxlIGluaXRtZW0gZnJlZWluZwotICoKLSAqICBSZXZpc2lvbiAxLjEyICAyMDAwLzExLzIxIDEzOjU1OjA3ICBiam9ybncKLSAqICBVc2UgQ09ORklHX0NSSVNfTE9XX01BUCBmb3IgdGhlIGxvdyBWTSBtYXAgaW5zdGVhZCBvZiBleHBsaWNpdCBDUFUgdHlwZQotICoKLSAqICBSZXZpc2lvbiAxLjExICAyMDAwLzEwLzA2IDEyOjM4OjIyICBiam9ybncKLSAqICBDYXN0IGVtcHR5X2JhZF9wYWdlIGNvcnJlY3RseSAoc2hvdWxkIHJlYWxseSBiZSBvZiAqIHR5cGUgZnJvbSB0aGUgc3RhcnQuLgotICoKLSAqICBSZXZpc2lvbiAxLjEwICAyMDAwLzEwLzA0IDE2OjUzOjU3ICBiam9ybncKLSAqICBGaXggbWVtb3J5LW1hcCBkdWUgdG8gTFggZmVhdHVyZXMKLSAqCi0gKiAgUmV2aXNpb24gMS45ICAyMDAwLzA5LzEzIDE1OjQ3OjQ5ICBiam9ybncKLSAqICBXcm9uZyBjb3VudCBpbiByZXNlcnZlZC1wYWdlcyBsb29wCi0gKgotICogIFJldmlzaW9uIDEuOCAgMjAwMC8wOS8xMyAxNDozNToxMCAgYmpvcm53Ci0gKiAgMi40LjAtdGVzdDggYWRkZWQgYSBuZXcgYXJnIHRvIGZyZWVfYXJlYV9pbml0X25vZGUKLSAqCi0gKiAgUmV2aXNpb24gMS43ICAyMDAwLzA4LzE3IDE1OjM1OjU1ICBiam9ybncKLSAqICAyLjQuMC10ZXN0NiByZW1vdmVkIE1BUF9OUiBhbmQgaW5zZXJ0ZWQgdmlydF90b19wYWdlCi0gKgotICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvS2NvbmZpZyBiL2FyY2gvZnJ2L0tjb25maWcKaW5kZXggOTZmN2Q3MC4uOWU1NjFlZCAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvS2NvbmZpZworKysgYi9hcmNoL2Zydi9LY29uZmlnCkBAIC01Nyw2ICs1NywxMCBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIEhaCisJaW50CisJZGVmYXVsdCAxMDAwCisKIG1haW5tZW51ICJGdWppdHN1IEZSLVYgS2VybmVsIENvbmZpZ3VyYXRpb24iCiAKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL3NldHVwLmMgYi9hcmNoL2Zydi9rZXJuZWwvc2V0dXAuYwppbmRleCBiMzhhZTFmLi4wNjY5ZTEzIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2Zydi9rZXJuZWwvc2V0dXAuYwpAQCAtOTI1LDEzICs5MjUsMTUgQEAKICNlbmRpZgogCiAJLyogdGFrZSBiYWNrIHRoZSBtZW1vcnkgb2NjdXBpZWQgYnkgdGhlIGtlcm5lbCBpbWFnZSBhbmQgdGhlIGJvb3RtZW0gYWxsb2MgbWFwICovCi0JcmVzZXJ2ZV9ib290bWVtKGtzdGFydCwga2VuZCAtIGtzdGFydCArIGJvb3RtYXBfc2l6ZSk7CisJcmVzZXJ2ZV9ib290bWVtKGtzdGFydCwga2VuZCAtIGtzdGFydCArIGJvb3RtYXBfc2l6ZSwKKwkJCUJPT1RNRU1fREVGQVVMVCk7CiAKIAkvKiByZXNlcnZlIHRoZSBtZW1vcnkgb2NjdXBpZWQgYnkgdGhlIGluaXRpYWwgcmFtZGlzayAqLwogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAogCWlmIChMT0FERVJfVFlQRSAmJiBJTklUUkRfU1RBUlQpIHsKIAkJaWYgKElOSVRSRF9TVEFSVCArIElOSVRSRF9TSVpFIDw9IChsb3dfdG9wX3BmbiA8PCBQQUdFX1NISUZUKSkgewotCQkJcmVzZXJ2ZV9ib290bWVtKElOSVRSRF9TVEFSVCwgSU5JVFJEX1NJWkUpOworCQkJcmVzZXJ2ZV9ib290bWVtKElOSVRSRF9TVEFSVCwgSU5JVFJEX1NJWkUsCisJCQkJCUJPT1RNRU1fREVGQVVMVCk7CiAJCQlpbml0cmRfc3RhcnQgPSBJTklUUkRfU1RBUlQgKyBQQUdFX09GRlNFVDsKIAkJCWluaXRyZF9lbmQgPSBpbml0cmRfc3RhcnQgKyBJTklUUkRfU0laRTsKIAkJfQpAQCAtOTg2LDkgKzk4OCwxMCBAQAogCiAJLyogbm93IHRha2UgYmFjayB0aGUgYml0cyB0aGUgY29yZSBrZXJuZWwgaXMgb2NjdXB5aW5nICovCiAjaWZuZGVmIENPTkZJR19QUk9URUNUX0tFUk5FTAotCXJlc2VydmVfYm9vdG1lbShrZW5kLCBib290bWFwX3NpemUpOworCXJlc2VydmVfYm9vdG1lbShrZW5kLCBib290bWFwX3NpemUsIEJPT1RNRU1fREVGQVVMVCk7CiAJcmVzZXJ2ZV9ib290bWVtKCh1bnNpZ25lZCBsb25nKSAmX19rZXJuZWxfaW1hZ2Vfc3RhcnQsCi0JCQlrZW5kIC0gKHVuc2lnbmVkIGxvbmcpICZfX2tlcm5lbF9pbWFnZV9zdGFydCk7CisJCQlrZW5kIC0gKHVuc2lnbmVkIGxvbmcpICZfX2tlcm5lbF9pbWFnZV9zdGFydCwKKwkJCUJPT1RNRU1fREVGQVVMVCk7CiAKICNlbHNlCiAJZGFtcHIgPSBfX2dldF9EQU1QUigwKTsKQEAgLTk5NiwxNCArOTk5LDE1IEBACiAJZGFtcHIgPSAoZGFtcHIgPj4gNCkgKyAxNzsKIAlkYW1wciA9IDEgPDwgZGFtcHI7CiAKLQlyZXNlcnZlX2Jvb3RtZW0oX19nZXRfREFNUFIoMCkgJiB4QU1QUnhfUFBGTiwgZGFtcHIpOworCXJlc2VydmVfYm9vdG1lbShfX2dldF9EQU1QUigwKSAmIHhBTVBSeF9QUEZOLCBkYW1wciwgQk9PVE1FTV9ERUZBVUxUKTsKICNlbmRpZgogCiAJLyogcmVzZXJ2ZSBzb21lIG1lbW9yeSB0byBkbyB1bmNhY2hlZCBETUEgdGhyb3VnaCBpZiByZXF1ZXN0ZWQgKi8KICNpZmRlZiBDT05GSUdfUkVTRVJWRV9ETUFfQ09IRVJFTlQKIAlpZiAoZG1hX2NvaGVyZW50X21lbV9zdGFydCkKIAkJcmVzZXJ2ZV9ib290bWVtKGRtYV9jb2hlcmVudF9tZW1fc3RhcnQsCi0JCQkJZG1hX2NvaGVyZW50X21lbV9lbmQgLSBkbWFfY29oZXJlbnRfbWVtX3N0YXJ0KTsKKwkJCQlkbWFfY29oZXJlbnRfbWVtX2VuZCAtIGRtYV9jb2hlcmVudF9tZW1fc3RhcnQsCisJCQkJQk9PVE1FTV9ERUZBVUxUKTsKICNlbmRpZgogCiB9IC8qIGVuZCBzZXR1cF91Y2xpbnV4X21lbW9yeSgpICovCkBAIC0xMTA5LDcgKzExMTMsNyBAQAogewogfQogCi1zdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgY3B1aW5mb19vcCA9IHsKK2NvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBjcHVpbmZvX29wID0gewogCS5zdGFydAk9IGNfc3RhcnQsCiAJLm5leHQJPSBjX25leHQsCiAJLnN0b3AJPSBjX3N0b3AsCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9tbS9wZ2FsbG9jLmMgYi9hcmNoL2Zydi9tbS9wZ2FsbG9jLmMKaW5kZXggMWEyZTVjOC4uNjZmNjE2ZiAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvbW0vcGdhbGxvYy5jCisrKyBiL2FyY2gvZnJ2L21tL3BnYWxsb2MuYwpAQCAtMjgsNyArMjgsNyBAQAogCXJldHVybiBwdGU7CiB9CiAKLXN0cnVjdCBwYWdlICpwdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCitwZ3RhYmxlX3QgcHRlX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewogCXN0cnVjdCBwYWdlICpwYWdlOwogCkBAIC0zNyw5ICszNywxMSBAQAogI2Vsc2UKIAlwYWdlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTHxfX0dGUF9SRVBFQVQsIDApOwogI2VuZGlmCi0JaWYgKHBhZ2UpCisJaWYgKHBhZ2UpIHsKIAkJY2xlYXJfaGlnaHBhZ2UocGFnZSk7Ci0JZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCXBndGFibGVfcGFnZV9jdG9yKHBhZ2UpOworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwl9CiAJcmV0dXJuIHBhZ2U7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvS2NvbmZpZyBiL2FyY2gvaDgzMDAvS2NvbmZpZwppbmRleCBkYzYxMjIyLi5mNjllNWVhIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL0tjb25maWcKKysrIGIvYXJjaC9oODMwMC9LY29uZmlnCkBAIC02NSw2ICs2NSw5IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgQVJDSF9TVVBQT1JUU19BT1VUCisJZGVmX2Jvb2wgeQorCiBjb25maWcgTk9fSU9QT1JUCiAJZGVmX2Jvb2wgeQogCkBAIC03OSw2ICs4MiwxMCBAQAogCWJvb2wKIAlkZWZhdWx0IG4KIAorY29uZmlnIEhaCisJaW50CisJZGVmYXVsdCAxMDAKKwogc291cmNlICJpbml0L0tjb25maWciCiAKIHNvdXJjZSAiYXJjaC9oODMwMC9LY29uZmlnLmNwdSIKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAva2VybmVsL3NldHVwLmMgYi9hcmNoL2g4MzAwL2tlcm5lbC9zZXR1cC5jCmluZGV4IGIyZTg2ZDAyLi5iMWYyNWMyIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvaDgzMDAva2VybmVsL3NldHVwLmMKQEAgLTE3Myw3ICsxNzMsNyBAQAogCSAqIHRoZSBib290bWVtIGJpdG1hcCBzbyB3ZSB0aGVuIHJlc2VydmUgaXQgYWZ0ZXIgZnJlZWluZyBpdCA6LSkKIAkgKi8KIAlmcmVlX2Jvb3RtZW0obWVtb3J5X3N0YXJ0LCBtZW1vcnlfZW5kIC0gbWVtb3J5X3N0YXJ0KTsKLQlyZXNlcnZlX2Jvb3RtZW0obWVtb3J5X3N0YXJ0LCBib290bWFwX3NpemUpOworCXJlc2VydmVfYm9vdG1lbShtZW1vcnlfc3RhcnQsIGJvb3RtYXBfc2l6ZSwgQk9PVE1FTV9ERUZBVUxUKTsKIAkvKgogCSAqIGdldCBrbWFsbG9jIGludG8gZ2VhcgogCSAqLwpAQCAtMjM2LDcgKzIzNiw3IEBACiB7CiB9CiAKLXN0cnVjdCBzZXFfb3BlcmF0aW9ucyBjcHVpbmZvX29wID0geworY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGNwdWluZm9fb3AgPSB7CiAJLnN0YXJ0CT0gY19zdGFydCwKIAkubmV4dAk9IGNfbmV4dCwKIAkuc3RvcAk9IGNfc3RvcCwKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS1wcm9jZXNzb3IuYyBiL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS1wcm9jZXNzb3IuYwppbmRleCA1YTIxNmMwLi5jYmU2Y2VlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2FjcGktcHJvY2Vzc29yLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLXByb2Nlc3Nvci5jCkBAIC00NSw2ICs0NSwxMiBAQAogCWJ1ZlswXSA9IEFDUElfUERDX1JFVklTSU9OX0lEOwogCWJ1ZlsxXSA9IDE7CiAJYnVmWzJdID0gQUNQSV9QRENfRVNUX0NBUEFCSUxJVFlfU01QOworCS8qCisJICogVGhlIGRlZmF1bHQgb2YgUERDX1NNUF9UX1NXQ09PUkQgYml0IGlzIHNldCBmb3IgSUE2NCBjcHUgc28KKwkgKiB0aGF0IE9TUE0gaXMgY2FwYWJsZSBvZiBuYXRpdmUgQUNQSSB0aHJvdHRsaW5nIHNvZnR3YXJlCisJICogY29vcmRpbmF0aW9uIHVzaW5nIEJJT1Mgc3VwcGxpZWQgX1RTRCBpbmZvLgorCSAqLworCWJ1ZlsyXSB8PSBBQ1BJX1BEQ19TTVBfVF9TV0NPT1JEOwogCiAJb2JqLT50eXBlID0gQUNQSV9UWVBFX0JVRkZFUjsKIAlvYmotPmJ1ZmZlci5sZW5ndGggPSAxMjsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMKaW5kZXggMDBiNWQwOC4uNzhmMjhkOCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMKQEAgLTY5LDYgKzY5LDIwIEBACiAKIHVuc2lnbmVkIGxvbmcgYWNwaV93YWtldXBfYWRkcmVzcyA9IDA7CiAKKyNpZmRlZiBDT05GSUdfSUE2NF9HRU5FUklDCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgYWNwaV9maW5kX3JzZHAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHJzZHBfcGh5cyA9IDA7CisKKwlpZiAoZWZpLmFjcGkyMCAhPSBFRklfSU5WQUxJRF9UQUJMRV9BRERSKQorCQlyc2RwX3BoeXMgPSBlZmkuYWNwaTIwOworCWVsc2UgaWYgKGVmaS5hY3BpICE9IEVGSV9JTlZBTElEX1RBQkxFX0FERFIpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYCisJCSAgICAgICAidjEuMC9yMC43MSB0YWJsZXMgbm8gbG9uZ2VyIHN1cHBvcnRlZFxuIik7CisJcmV0dXJuIHJzZHBfcGh5czsKK30KKyNlbmRpZgorCiBjb25zdCBjaGFyIF9faW5pdCAqCiBhY3BpX2dldF9zeXNuYW1lKHZvaWQpCiB7CkBAIC0xNTIsNyArMTY2LDcgQEAKIAlyZXR1cm4gdmVjdG9yOwogfQogCi1jaGFyICpfX2FjcGlfbWFwX3RhYmxlKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCitjaGFyICpfX2luaXQgX19hY3BpX21hcF90YWJsZSh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXJldHVybiBfX3ZhKHBoeXNfYWRkcik7CiB9CkBAIC02MDEsOCArNjE1LDYgQEAKIAkJCQkgICAgIElPU0FQSUNfTEVWRUwpOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfcmVnaXN0ZXJfZ3NpKTsKLQogdm9pZCBhY3BpX3VucmVnaXN0ZXJfZ3NpKHUzMiBnc2kpCiB7CiAJaWYgKGFjcGlfaXJxX21vZGVsID09IEFDUElfSVJRX01PREVMX1BMQVRGT1JNKQpAQCAtNjExLDggKzYyMyw2IEBACiAJaW9zYXBpY191bnJlZ2lzdGVyX2ludHIoZ3NpKTsKIH0KIAotRVhQT1JUX1NZTUJPTChhY3BpX3VucmVnaXN0ZXJfZ3NpKTsKLQogc3RhdGljIGludCBfX2luaXQgYWNwaV9wYXJzZV9mYWR0KHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpCiB7CiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpmYWR0X2hlYWRlcjsKQEAgLTYzMSwxOCArNjQxLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotdW5zaWduZWQgbG9uZyBfX2luaXQgYWNwaV9maW5kX3JzZHAodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHJzZHBfcGh5cyA9IDA7Ci0KLQlpZiAoZWZpLmFjcGkyMCAhPSBFRklfSU5WQUxJRF9UQUJMRV9BRERSKQotCQlyc2RwX3BoeXMgPSBlZmkuYWNwaTIwOwotCWVsc2UgaWYgKGVmaS5hY3BpICE9IEVGSV9JTlZBTElEX1RBQkxFX0FERFIpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYCi0JCSAgICAgICAidjEuMC9yMC43MSB0YWJsZXMgbm8gbG9uZ2VyIHN1cHBvcnRlZFxuIik7Ci0JcmV0dXJuIHJzZHBfcGh5czsKLX0KLQogaW50IF9faW5pdCBhY3BpX2Jvb3RfaW5pdCh2b2lkKQogewogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2VudHJ5LlMgYi9hcmNoL2lhNjQva2VybmVsL2VudHJ5LlMKaW5kZXggZjVkM2VmYi4uM2MzMzFjNCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUwpAQCAtMTU3Myw3ICsxNTczLDcgQEAKIAlkYXRhOCBzeXNfZmNobW9kYXQKIAlkYXRhOCBzeXNfZmFjY2Vzc2F0CiAJZGF0YTggc3lzX3BzZWxlY3Q2Ci0JZGF0YTggc3lzX3Bwb2xsCisJZGF0YTggc3lzX3Bwb2xsCQkJCS8vIDEyOTUKIAlkYXRhOCBzeXNfdW5zaGFyZQogCWRhdGE4IHN5c19zcGxpY2UKIAlkYXRhOCBzeXNfc2V0X3JvYnVzdF9saXN0CkBAIC0xNTg4LDUgKzE1ODgsOCBAQAogCWRhdGE4IHN5c19zaWduYWxmZAogCWRhdGE4IHN5c19uaV9zeXNjYWxsCiAJZGF0YTggc3lzX2V2ZW50ZmQKKwlkYXRhOCBzeXNfdGltZXJmZF9jcmVhdGUJCS8vIDEzMTAKKwlkYXRhOCBzeXNfdGltZXJmZF9zZXR0aW1lCisJZGF0YTggc3lzX3RpbWVyZmRfZ2V0dGltZQogCiAJLm9yZyBzeXNfY2FsbF90YWJsZSArIDgqTlJfc3lzY2FsbHMJLy8gZ3VhcmQgYWdhaW5zdCBmYWlsdXJlcyB0byBpbmNyZWFzZSBOUl9zeXNjYWxscwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9tYWNoaW5lX2tleGVjLmMgYi9hcmNoL2lhNjQva2VybmVsL21hY2hpbmVfa2V4ZWMuYwppbmRleCBkNmNkNDVmLi4wODIzZGUxIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL21hY2hpbmVfa2V4ZWMuYworKysgYi9hcmNoL2lhNjQva2VybmVsL21hY2hpbmVfa2V4ZWMuYwpAQCAtMTI5LDEzICsxMjksMTQgQEAKIAogdm9pZCBhcmNoX2NyYXNoX3NhdmVfdm1jb3JlaW5mbyh2b2lkKQogewotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRSkgJiYgZGVmaW5lZChDT05GSUdfTlVNQSkKKyNpZiBkZWZpbmVkKENPTkZJR19ESVNDT05USUdNRU0pIHx8IGRlZmluZWQoQ09ORklHX1NQQVJTRU1FTSkKIAlWTUNPUkVJTkZPX1NZTUJPTChwZ2RhdF9saXN0KTsKIAlWTUNPUkVJTkZPX0xFTkdUSChwZ2RhdF9saXN0LCBNQVhfTlVNTk9ERVMpOwotCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTlVNQQogCVZNQ09SRUlORk9fU1lNQk9MKG5vZGVfbWVtYmxrKTsKIAlWTUNPUkVJTkZPX0xFTkdUSChub2RlX21lbWJsaywgTlJfTk9ERV9NRU1CTEtTKTsKLQlWTUNPUkVJTkZPX1NJWkUobm9kZV9tZW1ibGtfcyk7CisJVk1DT1JFSU5GT19TVFJVQ1RfU0laRShub2RlX21lbWJsa19zKTsKIAlWTUNPUkVJTkZPX09GRlNFVChub2RlX21lbWJsa19zLCBzdGFydF9wYWRkcik7CiAJVk1DT1JFSU5GT19PRkZTRVQobm9kZV9tZW1ibGtfcywgc2l6ZSk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMgYi9hcmNoL2lhNjQva2VybmVsL21jYS5jCmluZGV4IDg0NmU3ZTAuLjZlMTdhZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9tY2EuYwpAQCAtMTcsNyArMTcsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDAwIEludGVsCiAgKiBDb3B5cmlnaHQgKEMpIENodWNrIEZsZWNrZW5zdGVpbiA8Y2ZsZWNrQGNvLmludGVsLmNvbT4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDA0LTIwMDggU2lsaWNvbiBHcmFwaGljcywgSW5jLgogICogQ29weXJpZ2h0IChDKSBWaWpheSBDaGFuZGVyIDx2aWpheUBlbmdyLnNnaS5jb20+CiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA2IEZVSklUU1UgTElNSVRFRApAQCAtMTc2MiwxMSArMTc2Miw4IEBACiAvKiBDYWxsZXIgcHJldmVudHMgdGhpcyBmcm9tIGJlaW5nIGNhbGxlZCBhZnRlciBpbml0ICovCiBzdGF0aWMgdm9pZCAqIF9faW5pdF9yZWZvayBtY2FfYm9vdG1lbSh2b2lkKQogewotCXZvaWQgKnA7Ci0KLQlwID0gYWxsb2NfYm9vdG1lbShzaXplb2Yoc3RydWN0IGlhNjRfbWNhX2NwdSkgKiBOUl9DUFVTICsKLQkgICAgICAgICAgICAgICAgICBLRVJORUxfU1RBQ0tfU0laRSk7Ci0JcmV0dXJuICh2b2lkICopQUxJR04oKHVuc2lnbmVkIGxvbmcpcCwgS0VSTkVMX1NUQUNLX1NJWkUpOworCXJldHVybiBfX2FsbG9jX2Jvb3RtZW0oc2l6ZW9mKHN0cnVjdCBpYTY0X21jYV9jcHUpLAorCSAgICAgICAgICAgICAgICAgICAgS0VSTkVMX1NUQUNLX1NJWkUsIDApOwogfQogCiAvKiBEbyBwZXItQ1BVIE1DQS1yZWxhdGVkIGluaXRpYWxpemF0aW9uLiAgKi8KQEAgLTE3NzQsMzMgKzE3NzEsMzMgQEAKIGlhNjRfbWNhX2NwdV9pbml0KHZvaWQgKmNwdV9kYXRhKQogewogCXZvaWQgKnBhbF92YWRkcjsKKwl2b2lkICpkYXRhOworCWxvbmcgc3ogPSBzaXplb2Yoc3RydWN0IGlhNjRfbWNhX2NwdSk7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlzdGF0aWMgaW50IGZpcnN0X3RpbWUgPSAxOwogCi0JaWYgKGZpcnN0X3RpbWUpIHsKLQkJdm9pZCAqbWNhX2RhdGE7Ci0JCWludCBjcHU7Ci0KLQkJZmlyc3RfdGltZSA9IDA7Ci0JCW1jYV9kYXRhID0gbWNhX2Jvb3RtZW0oKTsKLQkJZm9yIChjcHUgPSAwOyBjcHUgPCBOUl9DUFVTOyBjcHUrKykgewotCQkJZm9ybWF0X21jYV9pbml0X3N0YWNrKG1jYV9kYXRhLAotCQkJCQlvZmZzZXRvZihzdHJ1Y3QgaWE2NF9tY2FfY3B1LCBtY2Ffc3RhY2spLAotCQkJCQkiTUNBIiwgY3B1KTsKLQkJCWZvcm1hdF9tY2FfaW5pdF9zdGFjayhtY2FfZGF0YSwKLQkJCQkJb2Zmc2V0b2Yoc3RydWN0IGlhNjRfbWNhX2NwdSwgaW5pdF9zdGFjayksCi0JCQkJCSJJTklUIiwgY3B1KTsKLQkJCV9fcGVyX2NwdV9tY2FbY3B1XSA9IF9fcGEobWNhX2RhdGEpOwotCQkJbWNhX2RhdGEgKz0gc2l6ZW9mKHN0cnVjdCBpYTY0X21jYV9jcHUpOwotCQl9Ci0JfQotCiAJLyoKLQkgKiBUaGUgTUNBIGluZm8gc3RydWN0dXJlIHdhcyBhbGxvY2F0ZWQgZWFybGllciBhbmQgaXRzCi0JICogcGh5c2ljYWwgYWRkcmVzcyBzYXZlZCBpbiBfX3Blcl9jcHVfbWNhW2NwdV0uICBDb3B5IHRoYXQKLQkgKiBhZGRyZXNzICogdG8gaWE2NF9tY2FfZGF0YSBzbyB3ZSBjYW4gYWNjZXNzIGl0IGFzIGEgcGVyLUNQVQotCSAqIHZhcmlhYmxlLgorCSAqIFN0cnVjdHVyZSB3aWxsIGFscmVhZHkgYmUgYWxsb2NhdGVkIGlmIGNwdSBoYXMgYmVlbiBvbmxpbmUsCisJICogdGhlbiBvZmZsaW5lZC4KIAkgKi8KLQlfX2dldF9jcHVfdmFyKGlhNjRfbWNhX2RhdGEpID0gX19wZXJfY3B1X21jYVtzbXBfcHJvY2Vzc29yX2lkKCldOworCWlmIChfX3Blcl9jcHVfbWNhW2NwdV0pIHsKKwkJZGF0YSA9IF9fdmEoX19wZXJfY3B1X21jYVtjcHVdKTsKKwl9IGVsc2UgeworCQlpZiAoZmlyc3RfdGltZSkgeworCQkJZGF0YSA9IG1jYV9ib290bWVtKCk7CisJCQlmaXJzdF90aW1lID0gMDsKKwkJfSBlbHNlCisJCQlkYXRhID0gcGFnZV9hZGRyZXNzKGFsbG9jX3BhZ2VzX25vZGUobnVtYV9ub2RlX2lkKCksCisJCQkJCUdGUF9LRVJORUwsIGdldF9vcmRlcihzeikpKTsKKwkJaWYgKCFkYXRhKQorCQkJcGFuaWMoIkNvdWxkIG5vdCBhbGxvY2F0ZSBNQ0EgbWVtb3J5IGZvciBjcHUgJWRcbiIsCisJCQkJCWNwdSk7CisJfQorCWZvcm1hdF9tY2FfaW5pdF9zdGFjayhkYXRhLCBvZmZzZXRvZihzdHJ1Y3QgaWE2NF9tY2FfY3B1LCBtY2Ffc3RhY2spLAorCQkiTUNBIiwgY3B1KTsKKwlmb3JtYXRfbWNhX2luaXRfc3RhY2soZGF0YSwgb2Zmc2V0b2Yoc3RydWN0IGlhNjRfbWNhX2NwdSwgaW5pdF9zdGFjayksCisJCSJJTklUIiwgY3B1KTsKKwlfX2dldF9jcHVfdmFyKGlhNjRfbWNhX2RhdGEpID0gX19wZXJfY3B1X21jYVtjcHVdID0gX19wYShkYXRhKTsKIAogCS8qCiAJICogU3Rhc2ggYXdheSBhIGNvcHkgb2YgdGhlIFBURSBuZWVkZWQgdG8gbWFwIHRoZSBwZXItQ1BVIHBhZ2UuCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYyBiL2FyY2gvaWE2NC9rZXJuZWwvcGVyZm1vbi5jCmluZGV4IDc4YWNkOWYuLmY2Yjk5NzEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvcGVyZm1vbi5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvcGVyZm1vbi5jCkBAIC01ODYsMjEgKzU4Niw2IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotcGZtX3NldF90YXNrX25vdGlmeShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCi17Ci0Jc3RydWN0IHRocmVhZF9pbmZvICppbmZvOwotCi0JaW5mbyA9IChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgKChjaGFyICopIHRhc2sgKyBJQTY0X1RBU0tfU0laRSk7Ci0Jc2V0X2JpdChUSUZfUEVSRk1PTl9XT1JLLCAmaW5mby0+ZmxhZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXBmbV9jbGVhcl90YXNrX25vdGlmeSh2b2lkKQotewotCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9QRVJGTU9OX1dPUkspOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKIHBmbV9yZXNlcnZlX3BhZ2UodW5zaWduZWQgbG9uZyBhKQogewogCVNldFBhZ2VSZXNlcnZlZCh2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilhKSk7CkBAIC0zNzI0LDcgKzM3MDksNyBAQAogCiAJCVBGTV9TRVRfV09SS19QRU5ESU5HKHRhc2ssIDEpOwogCi0JCXBmbV9zZXRfdGFza19ub3RpZnkodGFzayk7CisJCXRza19zZXRfbm90aWZ5X3Jlc3VtZSh0YXNrKTsKIAogCQkvKgogCQkgKiBYWFg6IHNlbmQgcmVzY2hlZHVsZSBpZiB0YXNrIHJ1bnMgb24gYW5vdGhlciBDUFUKQEAgLTUwODIsNyArNTA2Nyw3IEBACiAKIAlQRk1fU0VUX1dPUktfUEVORElORyhjdXJyZW50LCAwKTsKIAotCXBmbV9jbGVhcl90YXNrX25vdGlmeSgpOworCXRza19jbGVhcl9ub3RpZnlfcmVzdW1lKGN1cnJlbnQpOwogCiAJcmVncyA9IHRhc2tfcHRfcmVncyhjdXJyZW50KTsKIApAQCAtNTQ1MCw3ICs1NDM1LDcgQEAKIAkJCSAqIHdoZW4gY29taW5nIGZyb20gY3R4c3csIGN1cnJlbnQgc3RpbGwgcG9pbnRzIHRvIHRoZQogCQkJICogcHJldmlvdXMgdGFzaywgdGhlcmVmb3JlIHdlIG11c3Qgd29yayB3aXRoIHRhc2sgYW5kIG5vdCBjdXJyZW50LgogCQkJICovCi0JCQlwZm1fc2V0X3Rhc2tfbm90aWZ5KHRhc2spOworCQkJdHNrX3NldF9ub3RpZnlfcmVzdW1lKHRhc2spOwogCQl9CiAJCS8qCiAJCSAqIGRlZmVyIHVudGlsIHN0YXRlIGlzIGNoYW5nZWQgKHNob3J0ZW4gc3BpbiB3aW5kb3cpLiB0aGUgY29udGV4dCBpcyBsb2NrZWQKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9pYTY0L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggNzM3N2QzMi4uNDk5MzdhMyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTUyLDcgKzUyLDYgQEAKICNpbmNsdWRlICJzaWdmcmFtZS5oIgogCiB2b2lkICgqaWE2NF9tYXJrX2lkbGUpKGludCk7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgaW50LCBjcHVfaWRsZV9zdGF0ZSk7CiAKIHVuc2lnbmVkIGxvbmcgYm9vdF9vcHRpb25faWRsZV9vdmVycmlkZSA9IDA7CiBFWFBPUlRfU1lNQk9MKGJvb3Rfb3B0aW9uX2lkbGVfb3ZlcnJpZGUpOwpAQCAtMTU3LDYgKzE1NiwxNyBAQAogCQlzaG93X3N0YWNrKE5VTEwsIE5VTEwpOwogfQogCit2b2lkIHRza19jbGVhcl9ub3RpZnlfcmVzdW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworI2lmZGVmIENPTkZJR19QRVJGTU9OCisJaWYgKHRzay0+dGhyZWFkLnBmbV9uZWVkc19jaGVja2luZykKKwkJcmV0dXJuOworI2VuZGlmCisJaWYgKHRlc3RfdGlfdGhyZWFkX2ZsYWcodGFza190aHJlYWRfaW5mbyh0c2spLCBUSUZfUkVTVE9SRV9SU0UpKQorCQlyZXR1cm47CisJY2xlYXJfdGlfdGhyZWFkX2ZsYWcodGFza190aHJlYWRfaW5mbyh0c2spLCBUSUZfTk9USUZZX1JFU1VNRSk7Cit9CisKIHZvaWQKIGRvX25vdGlmeV9yZXN1bWVfdXNlciAoc2lnc2V0X3QgKnVudXNlZCwgc3RydWN0IHNpZ3NjcmF0Y2ggKnNjciwgbG9uZyBpbl9zeXNjYWxsKQogewpAQCAtMTc1LDYgKzE4NSwxMCBAQAogCS8qIGRlYWwgd2l0aCBwZW5kaW5nIHNpZ25hbCBkZWxpdmVyeSAqLwogCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSUdQRU5ESU5HKXx8dGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKIAkJaWE2NF9kb19zaWduYWwoc2NyLCBpbl9zeXNjYWxsKTsKKworCS8qIGNvcHkgdXNlciByYnMgdG8ga2VybmVsIHJicyAqLworCWlmICh1bmxpa2VseSh0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1JTRSkpKQorCQlpYTY0X3N5bmNfa3JicygpOwogfQogCiBzdGF0aWMgaW50IHBhbF9oYWx0ICAgICAgICA9IDE7CkBAIC0yMzksMzMgKzI1MywyMyBAQAogfQogI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLwogCitzdGF0aWMgdm9pZCBkb19ub3RoaW5nKHZvaWQgKnVudXNlZCkKK3sKK30KKworLyoKKyAqIGNwdV9pZGxlX3dhaXQgLSBVc2VkIHRvIGVuc3VyZSB0aGF0IGFsbCB0aGUgQ1BVcyBkaXNjYXJkIG9sZCB2YWx1ZSBvZgorICogcG1faWRsZSBhbmQgdXBkYXRlIHRvIG5ldyBwbV9pZGxlIHZhbHVlLiBSZXF1aXJlZCB3aGlsZSBjaGFuZ2luZyBwbV9pZGxlCisgKiBoYW5kbGVyIG9uIFNNUCBzeXN0ZW1zLgorICoKKyAqIENhbGxlciBtdXN0IGhhdmUgY2hhbmdlZCBwbV9pZGxlIHRvIHRoZSBuZXcgdmFsdWUgYmVmb3JlIHRoZSBjYWxsLiBPbGQKKyAqIHBtX2lkbGUgdmFsdWUgd2lsbCBub3QgYmUgdXNlZCBieSBhbnkgQ1BVIGFmdGVyIHRoZSByZXR1cm4gb2YgdGhpcyBmdW5jdGlvbi4KKyAqLwogdm9pZCBjcHVfaWRsZV93YWl0KHZvaWQpCiB7Ci0JdW5zaWduZWQgaW50IGNwdSwgdGhpc19jcHUgPSBnZXRfY3B1KCk7Ci0JY3B1bWFza190IG1hcDsKLQljcHVtYXNrX3QgdG1wID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOwotCi0Jc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdSh0aGlzX2NwdSkpOwotCXB1dF9jcHUoKTsKLQotCWNwdXNfY2xlYXIobWFwKTsKLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewotCQlwZXJfY3B1KGNwdV9pZGxlX3N0YXRlLCBjcHUpID0gMTsKLQkJY3B1X3NldChjcHUsIG1hcCk7Ci0JfQotCi0JX19nZXRfY3B1X3ZhcihjcHVfaWRsZV9zdGF0ZSkgPSAwOwotCi0Jd21iKCk7Ci0JZG8gewotCQlzc2xlZXAoMSk7Ci0JCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7Ci0JCQlpZiAoY3B1X2lzc2V0KGNwdSwgbWFwKSAmJiAhcGVyX2NwdShjcHVfaWRsZV9zdGF0ZSwgY3B1KSkKLQkJCQljcHVfY2xlYXIoY3B1LCBtYXApOwotCQl9Ci0JCWNwdXNfYW5kKG1hcCwgbWFwLCBjcHVfb25saW5lX21hcCk7Ci0JfSB3aGlsZSAoIWNwdXNfZW1wdHkobWFwKSk7Ci0Jc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCB0bXApOworCXNtcF9tYigpOworCS8qIGtpY2sgYWxsIHRoZSBDUFVzIHNvIHRoYXQgdGhleSBleGl0IG91dCBvZiBwbV9pZGxlICovCisJc21wX2NhbGxfZnVuY3Rpb24oZG9fbm90aGluZywgTlVMTCwgMCwgMSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjcHVfaWRsZV93YWl0KTsKIApAQCAtMjkzLDkgKzI5Nyw2IEBACiAjaWZkZWYgQ09ORklHX1NNUAogCQkJbWluX3h0cCgpOwogI2VuZGlmCi0JCQlpZiAoX19nZXRfY3B1X3ZhcihjcHVfaWRsZV9zdGF0ZSkpCi0JCQkJX19nZXRfY3B1X3ZhcihjcHVfaWRsZV9zdGF0ZSkgPSAwOwotCiAJCQlybWIoKTsKIAkJCWlmIChtYXJrX2lkbGUpCiAJCQkJKCptYXJrX2lkbGUpKDEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvaWE2NC9rZXJuZWwvcHRyYWNlLmMKaW5kZXggMmU5NmYxNy4uMzMxZDY3NiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3B0cmFjZS5jCkBAIC01NDcsNiArNTQ3LDEyOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgbG9uZworaWE2NF9zeW5jX2tlcm5lbF9yYnMgKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIHN0cnVjdCBzd2l0Y2hfc3RhY2sgKnN3LAorCQl1bnNpZ25lZCBsb25nIHVzZXJfcmJzX3N0YXJ0LCB1bnNpZ25lZCBsb25nIHVzZXJfcmJzX2VuZCkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIsIHZhbDsKKwlsb25nIHJldDsKKworCS8qIG5vdyBjb3B5IHdvcmQgZm9yIHdvcmQgZnJvbSB1c2VyIHJicyB0byBrZXJuZWwgcmJzOiAqLworCWZvciAoYWRkciA9IHVzZXJfcmJzX3N0YXJ0OyBhZGRyIDwgdXNlcl9yYnNfZW5kOyBhZGRyICs9IDgpIHsKKwkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCAmdmFsLCBzaXplb2YodmFsKSwgMCkKKwkJCQkhPSBzaXplb2YodmFsKSkKKwkJCXJldHVybiAtRUlPOworCisJCXJldCA9IGlhNjRfcG9rZShjaGlsZCwgc3csIHVzZXJfcmJzX2VuZCwgYWRkciwgdmFsKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKwordHlwZWRlZiBsb25nICgqc3luY2Z1bmNfdCkoc3RydWN0IHRhc2tfc3RydWN0ICosIHN0cnVjdCBzd2l0Y2hfc3RhY2sgKiwKKwkJCSAgICB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKKworc3RhdGljIHZvaWQgZG9fc3luY19yYnMoc3RydWN0IHVud19mcmFtZV9pbmZvICppbmZvLCB2b2lkICphcmcpCit7CisJc3RydWN0IHB0X3JlZ3MgKnB0OworCXVuc2lnbmVkIGxvbmcgdXJic19lbmQ7CisJc3luY2Z1bmNfdCBmbiA9IGFyZzsKKworCWlmICh1bndfdW53aW5kX3RvX3VzZXIoaW5mbykgPCAwKQorCQlyZXR1cm47CisJcHQgPSB0YXNrX3B0X3JlZ3MoaW5mby0+dGFzayk7CisJdXJic19lbmQgPSBpYTY0X2dldF91c2VyX3Jic19lbmQoaW5mby0+dGFzaywgcHQsIE5VTEwpOworCisJZm4oaW5mby0+dGFzaywgaW5mby0+c3csIHB0LT5hcl9ic3BzdG9yZSwgdXJic19lbmQpOworfQorCisvKgorICogd2hlbiBhIHRocmVhZCBpcyBzdG9wcGVkIChwdHJhY2VkKSwgZGVidWdnZXIgbWlnaHQgY2hhbmdlIHRocmVhZCdzIHVzZXIKKyAqIHN0YWNrIChjaGFuZ2UgbWVtb3J5IGRpcmVjdGx5KSwgYW5kIHdlIG11c3QgYXZvaWQgdGhlIFJTRSBzdG9yZWQgaW4ga2VybmVsCisgKiB0byBvdmVycmlkZSB1c2VyIHN0YWNrICh1c2VyIHNwYWNlJ3MgUlNFIGlzIG5ld2VyIHRoYW4ga2VybmVsJ3MgaW4gdGhlCisgKiBjYXNlKS4gVG8gd29ya2Fyb3VuZCB0aGUgaXNzdWUsIHdlIGNvcHkga2VybmVsIFJTRSB0byB1c2VyIFJTRSBiZWZvcmUgdGhlCisgKiB0YXNrIGlzIHN0b3BwZWQsIHNvIHVzZXIgUlNFIGhhcyB1cGRhdGVkIGRhdGEuICB3ZSB0aGVuIGNvcHkgdXNlciBSU0UgdG8KKyAqIGtlcm5lbCBhZnRlciB0aGUgdGFzayBpcyByZXN1bW1lZCBmcm9tIHRyYWNlZCBzdG9wIGFuZCBrZXJuZWwgd2lsbCB1c2UgdGhlCisgKiBuZXdlciBSU0UgdG8gcmV0dXJuIHRvIHVzZXIuIFRJRl9SRVNUT1JFX1JTRSBpcyB0aGUgZmxhZyB0byBpbmRpY2F0ZSB3ZSBuZWVkCisgKiBzeW5jaHJvbml6ZSB1c2VyIFJTRSB0byBrZXJuZWwuCisgKi8KK3ZvaWQgaWE2NF9wdHJhY2Vfc3RvcCh2b2lkKQoreworCWlmICh0ZXN0X2FuZF9zZXRfdHNrX3RocmVhZF9mbGFnKGN1cnJlbnQsIFRJRl9SRVNUT1JFX1JTRSkpCisJCXJldHVybjsKKwl0c2tfc2V0X25vdGlmeV9yZXN1bWUoY3VycmVudCk7CisJdW53X2luaXRfcnVubmluZyhkb19zeW5jX3JicywgaWE2NF9zeW5jX3VzZXJfcmJzKTsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIHJlYWQgYmFjayB0aGUgcmVnaXN0ZXIgYmFja2luZyBzdG9yZS4KKyAqLwordm9pZCBpYTY0X3N5bmNfa3Jicyh2b2lkKQoreworCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjdXJyZW50LCBUSUZfUkVTVE9SRV9SU0UpOworCXRza19jbGVhcl9ub3RpZnlfcmVzdW1lKGN1cnJlbnQpOworCisJdW53X2luaXRfcnVubmluZyhkb19zeW5jX3JicywgaWE2NF9zeW5jX2tlcm5lbF9yYnMpOworfQorCisvKgorICogQWZ0ZXIgUFRSQUNFX0FUVEFDSCwgYSB0aHJlYWQncyByZWdpc3RlciBiYWNraW5nIHN0b3JlIGFyZWEgaW4gdXNlcgorICogc3BhY2UgaXMgYXNzdW1lZCB0byBjb250YWluIGNvcnJlY3QgZGF0YSB3aGVuZXZlciB0aGUgdGhyZWFkIGlzCisgKiBzdG9wcGVkLiAgYXJjaF9wdHJhY2Vfc3RvcCB0YWtlcyBjYXJlIG9mIHRoaXMgb24gdHJhY2luZyBzdG9wcy4KKyAqIEJ1dCBpZiB0aGUgY2hpbGQgd2FzIGFscmVhZHkgc3RvcHBlZCBmb3Igam9iIGNvbnRyb2wgd2hlbiB3ZSBhdHRhY2gKKyAqIHRvIGl0LCB0aGVuIGl0IG1pZ2h0IG5vdCBldmVyIGdldCBpbnRvIHB0cmFjZV9zdG9wIGJ5IHRoZSB0aW1lIHdlCisgKiB3YW50IHRvIGV4YW1pbmUgdGhlIHVzZXIgbWVtb3J5IGNvbnRhaW5pbmcgdGhlIFJCUy4KKyAqLwordm9pZAorcHRyYWNlX2F0dGFjaF9zeW5jX3VzZXJfcmJzIChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQoreworCWludCBzdG9wcGVkID0gMDsKKwlzdHJ1Y3QgdW53X2ZyYW1lX2luZm8gaW5mbzsKKworCS8qCisJICogSWYgdGhlIGNoaWxkIGlzIGluIFRBU0tfU1RPUFBFRCwgd2UgbmVlZCB0byBjaGFuZ2UgdGhhdCB0bworCSAqIFRBU0tfVFJBQ0VEIG1vbWVudGFyaWx5IHdoaWxlIHdlIG9wZXJhdGUgb24gaXQuICBUaGlzIGVuc3VyZXMKKwkgKiB0aGF0IHRoZSBjaGlsZCB3b24ndCBiZSB3b2tlbiB1cCBhbmQgcmV0dXJuIHRvIHVzZXIgbW9kZSB3aGlsZQorCSAqIHdlIGFyZSBkb2luZyB0aGUgc3luYy4gIChJdCBjYW4gb25seSBiZSB3b2tlbiB1cCBmb3IgU0lHS0lMTC4pCisJICovCisKKwlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCWlmIChjaGlsZC0+c2lnbmFsKSB7CisJCXNwaW5fbG9ja19pcnEoJmNoaWxkLT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkJaWYgKGNoaWxkLT5zdGF0ZSA9PSBUQVNLX1NUT1BQRUQgJiYKKwkJICAgICF0ZXN0X2FuZF9zZXRfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfUkVTVE9SRV9SU0UpKSB7CisJCQl0c2tfc2V0X25vdGlmeV9yZXN1bWUoY2hpbGQpOworCisJCQljaGlsZC0+c3RhdGUgPSBUQVNLX1RSQUNFRDsKKwkJCXN0b3BwZWQgPSAxOworCQl9CisJCXNwaW5fdW5sb2NrX2lycSgmY2hpbGQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCX0KKwlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisKKwlpZiAoIXN0b3BwZWQpCisJCXJldHVybjsKKworCXVud19pbml0X2Zyb21fYmxvY2tlZF90YXNrKCZpbmZvLCBjaGlsZCk7CisJZG9fc3luY19yYnMoJmluZm8sIGlhNjRfc3luY191c2VyX3Jicyk7CisKKwkvKgorCSAqIE5vdyBtb3ZlIHRoZSBjaGlsZCBiYWNrIGludG8gVEFTS19TVE9QUEVEIGlmIGl0IHNob3VsZCBiZSBpbiBhCisJICogam9iIGNvbnRyb2wgc3RvcCwgc28gdGhhdCBTSUdDT05UIGNhbiBiZSB1c2VkIHRvIHdha2UgaXQgdXAuCisJICovCisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlpZiAoY2hpbGQtPnNpZ25hbCkgeworCQlzcGluX2xvY2tfaXJxKCZjaGlsZC0+c2lnaGFuZC0+c2lnbG9jayk7CisJCWlmIChjaGlsZC0+c3RhdGUgPT0gVEFTS19UUkFDRUQgJiYKKwkJICAgIChjaGlsZC0+c2lnbmFsLT5mbGFncyAmIFNJR05BTF9TVE9QX1NUT1BQRUQpKSB7CisJCQljaGlsZC0+c3RhdGUgPSBUQVNLX1NUT1BQRUQ7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxKCZjaGlsZC0+c2lnaGFuZC0+c2lnbG9jayk7CisJfQorCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQKIHRocmVhZF9tYXRjaGVzIChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRocmVhZCwgdW5zaWduZWQgbG9uZyBhZGRyKQogewpAQCAtMTQyMiw2ICsxNTQ1LDcgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkOwogCXN0cnVjdCBzd2l0Y2hfc3RhY2sgKnN3OwogCWxvbmcgcmV0OworCXN0cnVjdCB1bndfZnJhbWVfaW5mbyBpbmZvOwogCiAJbG9ja19rZXJuZWwoKTsKIAlyZXQgPSAtRVBFUk07CkBAIC0xNDUzLDYgKzE1NzcsOCBAQAogCiAJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX0FUVEFDSCkgewogCQlyZXQgPSBwdHJhY2VfYXR0YWNoKGNoaWxkKTsKKwkJaWYgKCFyZXQpCisJCQlhcmNoX3B0cmFjZV9hdHRhY2goY2hpbGQpOwogCQlnb3RvIG91dF90c2s7CiAJfQogCkBAIC0xNDgxLDYgKzE2MDcsMTEgQEAKIAkJLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciAqLwogCQl1cmJzX2VuZCA9IGlhNjRfZ2V0X3VzZXJfcmJzX2VuZChjaGlsZCwgcHQsIE5VTEwpOwogCQlyZXQgPSBpYTY0X3Bva2UoY2hpbGQsIHN3LCB1cmJzX2VuZCwgYWRkciwgZGF0YSk7CisKKwkJLyogTWFrZSBzdXJlIHVzZXIgUkJTIGhhcyB0aGUgbGF0ZXN0IGRhdGEgKi8KKwkJdW53X2luaXRfZnJvbV9ibG9ja2VkX3Rhc2soJmluZm8sIGNoaWxkKTsKKwkJZG9fc3luY19yYnMoJmluZm8sIGlhNjRfc3luY191c2VyX3Jicyk7CisKIAkJZ290byBvdXRfdHNrOwogCiAJICAgICAgY2FzZSBQVFJBQ0VfUEVFS1VTUjoKQEAgLTE2MzQsNiArMTc2NSwxMCBAQAogCSAgICAmJiAoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpCiAJCXN5c2NhbGxfdHJhY2UoKTsKIAorCS8qIGNvcHkgdXNlciByYnMgdG8ga2VybmVsIHJicyAqLworCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1JTRSkpCisJCWlhNjRfc3luY19rcmJzKCk7CisKIAlpZiAodW5saWtlbHkoY3VycmVudC0+YXVkaXRfY29udGV4dCkpIHsKIAkJbG9uZyBzeXNjYWxsOwogCQlpbnQgYXJjaDsKQEAgLTE2NzEsNCArMTgwNiw4IEBACiAJICAgIHx8IHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRVNURVApKQogCSAgICAmJiAoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpCiAJCXN5c2NhbGxfdHJhY2UoKTsKKworCS8qIGNvcHkgdXNlciByYnMgdG8ga2VybmVsIHJicyAqLworCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1JTRSkpCisJCWlhNjRfc3luY19rcmJzKCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3RpbWUuYyBiL2FyY2gvaWE2NC9rZXJuZWwvdGltZS5jCmluZGV4IDNhYjA0MjcuLjE3ZmRhNTIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvdGltZS5jCkBAIC00OSwxMyArNDksMTMgQEAKICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlIGNsb2Nrc291cmNlX2l0YyA9IHsKLSAgICAgICAgLm5hbWUgICAgICAgICAgID0gIml0YyIsCi0gICAgICAgIC5yYXRpbmcgICAgICAgICA9IDM1MCwKLSAgICAgICAgLnJlYWQgICAgICAgICAgID0gaXRjX2dldF9jeWNsZXMsCi0gICAgICAgIC5tYXNrICAgICAgICAgICA9IENMT0NLU09VUkNFX01BU0soNjQpLAotICAgICAgICAubXVsdCAgICAgICAgICAgPSAwLCAvKnRvIGJlIGNhbHVjbGF0ZWQqLwotICAgICAgICAuc2hpZnQgICAgICAgICAgPSAxNiwKLSAgICAgICAgLmZsYWdzICAgICAgICAgID0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCisJLm5hbWUgICAgICAgICAgID0gIml0YyIsCisJLnJhdGluZyAgICAgICAgID0gMzUwLAorCS5yZWFkICAgICAgICAgICA9IGl0Y19nZXRfY3ljbGVzLAorCS5tYXNrICAgICAgICAgICA9IENMT0NLU09VUkNFX01BU0soNjQpLAorCS5tdWx0ICAgICAgICAgICA9IDAsIC8qdG8gYmUgY2FsY3VsYXRlZCovCisJLnNoaWZ0ICAgICAgICAgID0gMTYsCisJLmZsYWdzICAgICAgICAgID0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9Owogc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSAqaXRjX2Nsb2Nrc291cmNlOwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvbW0vY29udGlnLmMgYi9hcmNoL2lhNjQvbW0vY29udGlnLmMKaW5kZXggN2U5YzI3NS4uMzQ0ZjY0ZSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L21tL2NvbnRpZy5jCisrKyBiL2FyY2gvaWE2NC9tbS9jb250aWcuYwpAQCAtMjE4LDcgKzIxOCw3IEBACiAKIAkvKiBGcmVlIGFsbCBhdmFpbGFibGUgbWVtb3J5LCB0aGVuIG1hcmsgYm9vdG1lbS1tYXAgYXMgYmVpbmcgaW4gdXNlLiAqLwogCWVmaV9tZW1tYXBfd2FsayhmaWx0ZXJfcnN2ZF9tZW1vcnksIGZyZWVfYm9vdG1lbSk7Ci0JcmVzZXJ2ZV9ib290bWVtKGJvb3RtYXBfc3RhcnQsIGJvb3RtYXBfc2l6ZSk7CisJcmVzZXJ2ZV9ib290bWVtKGJvb3RtYXBfc3RhcnQsIGJvb3RtYXBfc2l6ZSwgQk9PVE1FTV9ERUZBVUxUKTsKIAogCWZpbmRfaW5pdHJkKCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9tbS9kaXNjb250aWcuYyBiL2FyY2gvaWE2NC9tbS9kaXNjb250aWcuYwppbmRleCAwYjU2NzM5Li5lZTVlNjhiIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbW0vZGlzY29udGlnLmMKKysrIGIvYXJjaC9pYTY0L21tL2Rpc2NvbnRpZy5jCkBAIC0yOTksMTIgKzI5OSwxMiBAQAogCQlwYWdlcyA9IGJkcC0+bm9kZV9sb3dfcGZuIC0gKGJkcC0+bm9kZV9ib290X3N0YXJ0Pj5QQUdFX1NISUZUKTsKIAkJc2l6ZSA9IGJvb3RtZW1fYm9vdG1hcF9wYWdlcyhwYWdlcykgPDwgUEFHRV9TSElGVDsKIAkJYmFzZSA9IF9fcGEoYmRwLT5ub2RlX2Jvb3RtZW1fbWFwKTsKLQkJcmVzZXJ2ZV9ib290bWVtX25vZGUocGRwLCBiYXNlLCBzaXplKTsKKwkJcmVzZXJ2ZV9ib290bWVtX25vZGUocGRwLCBiYXNlLCBzaXplLCBCT09UTUVNX0RFRkFVTFQpOwogCiAJCS8qIE5vdyB0aGUgcGVyLW5vZGUgc3BhY2UgKi8KIAkJc2l6ZSA9IG1lbV9kYXRhW25vZGVdLnBlcm5vZGVfc2l6ZTsKIAkJYmFzZSA9IF9fcGEobWVtX2RhdGFbbm9kZV0ucGVybm9kZV9hZGRyKTsKLQkJcmVzZXJ2ZV9ib290bWVtX25vZGUocGRwLCBiYXNlLCBzaXplKTsKKwkJcmVzZXJ2ZV9ib290bWVtX25vZGUocGRwLCBiYXNlLCBzaXplLCBCT09UTUVNX0RFRkFVTFQpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL0tjb25maWcgYi9hcmNoL20zMnIvS2NvbmZpZwppbmRleCA3OTUxODBiLi5kNDY3OWFiIDEwMDY0NAotLS0gYS9hcmNoL20zMnIvS2NvbmZpZworKysgYi9hcmNoL20zMnIvS2NvbmZpZwpAQCAtMzUsNiArMzUsMTMgQEAKIGNvbmZpZyBOT19ETUEKIAlkZWZfYm9vbCB5CiAKK2NvbmZpZyBBUkNIX1NVUFBPUlRTX0FPVVQKKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBIWgorCWludAorCWRlZmF1bHQgMTAwCisKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvbTMyci9rZXJuZWwvc2V0dXAuYwppbmRleCBkNjQ4MTQzLi4wMzkyMTEyIDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cC5jCkBAIC0xNzcsMjUgKzE3NywyOCBAQAogCSAqLwogCXJlc2VydmVfYm9vdG1lbShDT05GSUdfTUVNT1JZX1NUQVJUICsgUEFHRV9TSVpFLAogCQkoUEZOX1BIWVMoc3RhcnRfcGZuKSArIGJvb3RtYXBfc2l6ZSArIFBBR0VfU0laRSAtIDEpCi0JCS0gQ09ORklHX01FTU9SWV9TVEFSVCk7CisJCS0gQ09ORklHX01FTU9SWV9TVEFSVCwKKwkJQk9PVE1FTV9ERUZBVUxUKTsKIAogCS8qCiAJICogcmVzZXJ2ZSBwaHlzaWNhbCBwYWdlIDAgLSBpdCdzIGEgc3BlY2lhbCBCSU9TIHBhZ2Ugb24gbWFueSBib3hlcywKIAkgKiBlbmFibGluZyBjbGVhbiByZWJvb3RzLCBTTVAgb3BlcmF0aW9uLCBsYXB0b3AgZnVuY3Rpb25zLgogCSAqLwotCXJlc2VydmVfYm9vdG1lbShDT05GSUdfTUVNT1JZX1NUQVJULCBQQUdFX1NJWkUpOworCXJlc2VydmVfYm9vdG1lbShDT05GSUdfTUVNT1JZX1NUQVJULCBQQUdFX1NJWkUsIEJPT1RNRU1fREVGQVVMVCk7CiAKIAkvKgogCSAqIHJlc2VydmUgbWVtb3J5IGhvbGUKIAkgKi8KICNpZmRlZiBDT05GSUdfTUVNSE9MRQotCXJlc2VydmVfYm9vdG1lbShDT05GSUdfTUVNSE9MRV9TVEFSVCwgQ09ORklHX01FTUhPTEVfU0laRSk7CisJcmVzZXJ2ZV9ib290bWVtKENPTkZJR19NRU1IT0xFX1NUQVJULCBDT05GSUdfTUVNSE9MRV9TSVpFLAorCQkJQk9PVE1FTV9ERUZBVUxUKTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECiAJaWYgKExPQURFUl9UWVBFICYmIElOSVRSRF9TVEFSVCkgewogCQlpZiAoSU5JVFJEX1NUQVJUICsgSU5JVFJEX1NJWkUgPD0gKG1heF9sb3dfcGZuIDw8IFBBR0VfU0hJRlQpKSB7Ci0JCQlyZXNlcnZlX2Jvb3RtZW0oSU5JVFJEX1NUQVJULCBJTklUUkRfU0laRSk7CisJCQlyZXNlcnZlX2Jvb3RtZW0oSU5JVFJEX1NUQVJULCBJTklUUkRfU0laRSwKKwkJCQkJQk9PVE1FTV9ERUZBVUxUKTsKIAkJCWluaXRyZF9zdGFydCA9IElOSVRSRF9TVEFSVCArIFBBR0VfT0ZGU0VUOwogCQkJaW5pdHJkX2VuZCA9IGluaXRyZF9zdGFydCArIElOSVRSRF9TSVpFOwogCQkJcHJpbnRrKCJpbml0cmQ6c3RhcnRbJTA4bHhdLHNpemVbJTA4bHhdXG4iLApAQCAtMzY2LDcgKzM2OSw3IEBACiB7CiB9CiAKLXN0cnVjdCBzZXFfb3BlcmF0aW9ucyBjcHVpbmZvX29wID0geworY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGNwdWluZm9fb3AgPSB7CiAJLnN0YXJ0ID0gY19zdGFydCwKIAkubmV4dCA9IGNfbmV4dCwKIAkuc3RvcCA9IGNfc3RvcCwKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC9tMzJyL2tlcm5lbC9zbXBib290LmMKaW5kZXggMGUzODNkYS4uMmMwM2FjMSAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9zbXBib290LmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9tbS9kaXNjb250aWcuYyBiL2FyY2gvbTMyci9tbS9kaXNjb250aWcuYwppbmRleCBjN2VmZGIwLi4wN2MxYWY3IDEwMDY0NAotLS0gYS9hcmNoL20zMnIvbW0vZGlzY29udGlnLmMKKysrIGIvYXJjaC9tMzJyL21tL2Rpc2NvbnRpZy5jCkBAIC05MSw3ICs5MSw4IEBACiAJCQlQRk5fUEhZUyhtcC0+cGFnZXMpKTsKIAogCQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobmlkKSwgUEZOX1BIWVMobXAtPnN0YXJ0X3BmbiksCi0JCQlQRk5fUEhZUyhtcC0+ZnJlZV9wZm4gLSBtcC0+c3RhcnRfcGZuKSArIGJvb3RtYXBfc2l6ZSk7CisJCQlQRk5fUEhZUyhtcC0+ZnJlZV9wZm4gLSBtcC0+c3RhcnRfcGZuKSArIGJvb3RtYXBfc2l6ZSwKKwkJCUJPT1RNRU1fREVGQVVMVCk7CiAKIAkJaWYgKG1heF9sb3dfcGZuIDwgbWF4X3BmbikKIAkJCW1heF9sb3dfcGZuID0gbWF4X3BmbjsKQEAgLTEwNCw3ICsxMDUsNyBAQAogCWlmIChMT0FERVJfVFlQRSAmJiBJTklUUkRfU1RBUlQpIHsKIAkJaWYgKElOSVRSRF9TVEFSVCArIElOSVRSRF9TSVpFIDw9IFBGTl9QSFlTKG1heF9sb3dfcGZuKSkgewogCQkJcmVzZXJ2ZV9ib290bWVtX25vZGUoTk9ERV9EQVRBKDApLCBJTklUUkRfU1RBUlQsCi0JCQkJSU5JVFJEX1NJWkUpOworCQkJCUlOSVRSRF9TSVpFLCBCT09UTUVNX0RFRkFVTFQpOwogCQkJaW5pdHJkX3N0YXJ0ID0gSU5JVFJEX1NUQVJUICsgUEFHRV9PRkZTRVQ7CiAJCQlpbml0cmRfZW5kID0gaW5pdHJkX3N0YXJ0ICsgSU5JVFJEX1NJWkU7CiAJCQlwcmludGsoImluaXRyZDpzdGFydFslMDhseF0sc2l6ZVslMDhseF1cbiIsCmRpZmYgLS1naXQgYS9hcmNoL202OGsvS2NvbmZpZyBiL2FyY2gvbTY4ay9LY29uZmlnCmluZGV4IGZmYWJkMDEuLjJiMGVkODkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9LY29uZmlnCisrKyBiL2FyY2gvbTY4ay9LY29uZmlnCkBAIC01Miw2ICs1MiwxMyBAQAogY29uZmlnIE5PX0RNQQogCWRlZl9ib29sIFNVTjMKIAorY29uZmlnIEFSQ0hfU1VQUE9SVFNfQU9VVAorCWRlZl9ib29sIHkKKworY29uZmlnIEhaCisJaW50CisJZGVmYXVsdCAxMDAKKwogbWFpbm1lbnUgIkxpbnV4LzY4ayBLZXJuZWwgQ29uZmlndXJhdGlvbiIKIAogc291cmNlICJpbml0L0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL202OGsvYXRhcmkvc3RyYW0uYyBiL2FyY2gvbTY4ay9hdGFyaS9zdHJhbS5jCmluZGV4IDhkZGE2NTEuLjAwNTVhNmMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hdGFyaS9zdHJhbS5jCisrKyBiL2FyY2gvbTY4ay9hdGFyaS9zdHJhbS5jCkBAIC0xNTQsNyArMTU0LDcgQEAKIAkvKiBhbHdheXMgcmVzZXJ2ZSBmaXJzdCBwYWdlIG9mIFNULVJBTSwgdGhlIGZpcnN0IDIga0IgYXJlCiAJICogc3VwZXJ2aXNvci1vbmx5ISAqLwogCWlmICgha2VybmVsX2luX3N0cmFtKQotCQlyZXNlcnZlX2Jvb3RtZW0gKDAsIFBBR0VfU0laRSk7CisJCXJlc2VydmVfYm9vdG1lbSgwLCBQQUdFX1NJWkUsIEJPT1RNRU1fREVGQVVMVCk7CiAKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL202OGsva2VybmVsL3Byb2Nlc3MuYwppbmRleCAzZWU5MTg2Li41ZGU0ZTRlIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL202OGsva2VybmVsL3Byb2Nlc3MuYwpAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC91c2VyLmg+Ci0jaW5jbHVkZSA8bGludXgvYS5vdXQuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0X3Rhc2suaD4KICNpbmNsdWRlIDxsaW51eC9tcXVldWUuaD4KQEAgLTMxNiw1MyArMzE1LDYgQEAKIEVYUE9SVF9TWU1CT0woZHVtcF9mcHUpOwogCiAvKgotICogZmlsbCBpbiB0aGUgdXNlciBzdHJ1Y3R1cmUgZm9yIGEgY29yZSBkdW1wLi4KLSAqLwotdm9pZCBkdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIHN0cnVjdCB1c2VyICogZHVtcCkKLXsKLQlzdHJ1Y3Qgc3dpdGNoX3N0YWNrICpzdzsKLQotLyogY2hhbmdlZCB0aGUgc2l6ZSBjYWxjdWxhdGlvbnMgLSBzaG91bGQgaG9wZWZ1bGx5IHdvcmsgYmV0dGVyLiBsYnQgKi8KLQlkdW1wLT5tYWdpYyA9IENNQUdJQzsKLQlkdW1wLT5zdGFydF9jb2RlID0gMDsKLQlkdW1wLT5zdGFydF9zdGFjayA9IHJkdXNwKCkgJiB+KFBBR0VfU0laRSAtIDEpOwotCWR1bXAtPnVfdHNpemUgPSAoKHVuc2lnbmVkIGxvbmcpIGN1cnJlbnQtPm1tLT5lbmRfY29kZSkgPj4gUEFHRV9TSElGVDsKLQlkdW1wLT51X2RzaXplID0gKCh1bnNpZ25lZCBsb25nKSAoY3VycmVudC0+bW0tPmJyayArCi0JCQkJCSAgKFBBR0VfU0laRS0xKSkpID4+IFBBR0VfU0hJRlQ7Ci0JZHVtcC0+dV9kc2l6ZSAtPSBkdW1wLT51X3RzaXplOwotCWR1bXAtPnVfc3NpemUgPSAwOwotCi0JaWYgKGR1bXAtPnN0YXJ0X3N0YWNrIDwgVEFTS19TSVpFKQotCQlkdW1wLT51X3NzaXplID0gKCh1bnNpZ25lZCBsb25nKSAoVEFTS19TSVpFIC0gZHVtcC0+c3RhcnRfc3RhY2spKSA+PiBQQUdFX1NISUZUOwotCi0JZHVtcC0+dV9hcjAgPSAoc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QgKikoKGludCkmZHVtcC0+cmVncyAtIChpbnQpZHVtcCk7Ci0Jc3cgPSAoKHN0cnVjdCBzd2l0Y2hfc3RhY2sgKilyZWdzKSAtIDE7Ci0JZHVtcC0+cmVncy5kMSA9IHJlZ3MtPmQxOwotCWR1bXAtPnJlZ3MuZDIgPSByZWdzLT5kMjsKLQlkdW1wLT5yZWdzLmQzID0gcmVncy0+ZDM7Ci0JZHVtcC0+cmVncy5kNCA9IHJlZ3MtPmQ0OwotCWR1bXAtPnJlZ3MuZDUgPSByZWdzLT5kNTsKLQlkdW1wLT5yZWdzLmQ2ID0gc3ctPmQ2OwotCWR1bXAtPnJlZ3MuZDcgPSBzdy0+ZDc7Ci0JZHVtcC0+cmVncy5hMCA9IHJlZ3MtPmEwOwotCWR1bXAtPnJlZ3MuYTEgPSByZWdzLT5hMTsKLQlkdW1wLT5yZWdzLmEyID0gcmVncy0+YTI7Ci0JZHVtcC0+cmVncy5hMyA9IHN3LT5hMzsKLQlkdW1wLT5yZWdzLmE0ID0gc3ctPmE0OwotCWR1bXAtPnJlZ3MuYTUgPSBzdy0+YTU7Ci0JZHVtcC0+cmVncy5hNiA9IHN3LT5hNjsKLQlkdW1wLT5yZWdzLmQwID0gcmVncy0+ZDA7Ci0JZHVtcC0+cmVncy5vcmlnX2QwID0gcmVncy0+b3JpZ19kMDsKLQlkdW1wLT5yZWdzLnN0a2FkaiA9IHJlZ3MtPnN0a2FkajsKLQlkdW1wLT5yZWdzLnNyID0gcmVncy0+c3I7Ci0JZHVtcC0+cmVncy5wYyA9IHJlZ3MtPnBjOwotCWR1bXAtPnJlZ3MuZm10dmVjID0gKHJlZ3MtPmZvcm1hdCA8PCAxMikgfCByZWdzLT52ZWN0b3I7Ci0JLyogZHVtcCBmbG9hdGluZyBwb2ludCBzdHVmZiAqLwotCWR1bXAtPnVfZnB2YWxpZCA9IGR1bXBfZnB1IChyZWdzLCAmZHVtcC0+bTY4a2ZwKTsKLX0KLUVYUE9SVF9TWU1CT0woZHVtcF90aHJlYWQpOwotCi0vKgogICogc3lzX2V4ZWN2ZSgpIGV4ZWN1dGVzIGEgbmV3IHByb2dyYW0uCiAgKi8KIGFzbWxpbmthZ2UgaW50IHN5c19leGVjdmUoY2hhciBfX3VzZXIgKm5hbWUsIGNoYXIgX191c2VyICogX191c2VyICphcmd2LCBjaGFyIF9fdXNlciAqIF9fdXNlciAqZW52cCkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXAuYwppbmRleCBlZDNhNGNhLi5iYmE2NTAzIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9zZXR1cC5jCkBAIC0zMjMsNyArMzIzLDggQEAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKIAlpZiAobTY4a19yYW1kaXNrLnNpemUpIHsKIAkJcmVzZXJ2ZV9ib290bWVtX25vZGUoX192aXJ0X3RvX25vZGUocGh5c190b192aXJ0KG02OGtfcmFtZGlzay5hZGRyKSksCi0JCQkJICAgICBtNjhrX3JhbWRpc2suYWRkciwgbTY4a19yYW1kaXNrLnNpemUpOworCQkJCSAgICAgbTY4a19yYW1kaXNrLmFkZHIsIG02OGtfcmFtZGlzay5zaXplLAorCQkJCSAgICAgQk9PVE1FTV9ERUZBVUxUKTsKIAkJaW5pdHJkX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpcGh5c190b192aXJ0KG02OGtfcmFtZGlzay5hZGRyKTsKIAkJaW5pdHJkX2VuZCA9IGluaXRyZF9zdGFydCArIG02OGtfcmFtZGlzay5zaXplOwogCQlwcmludGsoImluaXRyZDogJTA4bHggLSAlMDhseFxuIiwgaW5pdHJkX3N0YXJ0LCBpbml0cmRfZW5kKTsKQEAgLTQ0OSw3ICs0NTAsNyBAQAogc3RhdGljIHZvaWQgY19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKIH0KLXN0cnVjdCBzZXFfb3BlcmF0aW9ucyBjcHVpbmZvX29wID0geworY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGNwdWluZm9fb3AgPSB7CiAJLnN0YXJ0CT0gY19zdGFydCwKIAkubmV4dAk9IGNfbmV4dCwKIAkuc3RvcAk9IGNfc3RvcCwKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYwppbmRleCA5N2Y1NTZmLi5mZDQ4NThlIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC90cmFwcy5jCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9LY29uZmlnIGIvYXJjaC9tNjhrbm9tbXUvS2NvbmZpZwppbmRleCA2YWJiYmI4Li41NDhhN2IzIDEwMDY0NAotLS0gYS9hcmNoL202OGtub21tdS9LY29uZmlnCisrKyBiL2FyY2gvbTY4a25vbW11L0tjb25maWcKQEAgLTY0LDYgKzY0LDkgQEAKIGNvbmZpZyBOT19JT1BPUlQKIAlkZWZfYm9vbCB5CiAKK2NvbmZpZyBBUkNIX1NVUFBPUlRTX0FPVVQKKwlkZWZfYm9vbCB5CisKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCiBtZW51ICJQcm9jZXNzb3IgdHlwZSBhbmQgZmVhdHVyZXMiCkBAIC01MjIsNiArNTI1LDExIEBACiAJICBydW5uaW5nIG1vcmUgdGhyZWFkcyBvbiBhIHN5c3RlbSBhbmQgYWxzbyByZWR1Y2VzIHRoZSBwcmVzc3VyZQogCSAgb24gdGhlIFZNIHN1YnN5c3RlbSBmb3IgaGlnaGVyIG9yZGVyIGFsbG9jYXRpb25zLgogCitjb25maWcgSFoKKwlpbnQKKwlkZWZhdWx0IDEwMDAgaWYgQ0xFT1BBVFJBCisJZGVmYXVsdCAxMDAKKwogY29tbWVudCAiUkFNIGNvbmZpZ3VyYXRpb24iCiAKIGNvbmZpZyBSQU1CQVNFCmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zZXR1cC5jCmluZGV4IDgxNTA3YzUuLmQ2ZjAyMDAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zZXR1cC5jCkBAIC0yMDMsNyArMjAzLDcgQEAKIAkgKiB0aGUgYm9vdG1lbSBiaXRtYXAgc28gd2UgdGhlbiByZXNlcnZlIGl0IGFmdGVyIGZyZWVpbmcgaXQgOi0pCiAJICovCiAJZnJlZV9ib290bWVtKG1lbW9yeV9zdGFydCwgbWVtb3J5X2VuZCAtIG1lbW9yeV9zdGFydCk7Ci0JcmVzZXJ2ZV9ib290bWVtKG1lbW9yeV9zdGFydCwgYm9vdG1hcF9zaXplKTsKKwlyZXNlcnZlX2Jvb3RtZW0obWVtb3J5X3N0YXJ0LCBib290bWFwX3NpemUsIEJPT1RNRU1fREVGQVVMVCk7CiAKIAkvKgogCSAqIEdldCBrbWFsbG9jIGludG8gZ2Vhci4KQEAgLTI2MCw3ICsyNjAsNyBAQAogewogfQogCi1zdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgY3B1aW5mb19vcCA9IHsKK2NvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBjcHVpbmZvX29wID0gewogCS5zdGFydAk9IGNfc3RhcnQsCiAJLm5leHQJPSBjX25leHQsCiAJLnN0b3AJPSBjX3N0b3AsCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2k4MjU5LmMgYi9hcmNoL21pcHMva2VybmVsL2k4MjU5LmMKaW5kZXggMTk3ZDc5Ny4uNDEzYmQxZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9pODI1OS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvaTgyNTkuYwpAQCAtMzM4LDggKzMzOCwxMCBAQAogCiAJaW5pdF84MjU5QSgwKTsKIAotCWZvciAoaSA9IEk4MjU5QV9JUlFfQkFTRTsgaSA8IEk4MjU5QV9JUlFfQkFTRSArIDE2OyBpKyspCisJZm9yIChpID0gSTgyNTlBX0lSUV9CQVNFOyBpIDwgSTgyNTlBX0lSUV9CQVNFICsgMTY7IGkrKykgewogCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaSwgJmk4MjU5QV9jaGlwLCBoYW5kbGVfbGV2ZWxfaXJxKTsKKwkJc2V0X2lycV9wcm9iZShpKTsKKwl9CiAKIAlzZXR1cF9pcnEoSTgyNTlBX0lSUV9CQVNFICsgUElDX0NBU0NBREVfSVIsICZpcnEyKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaXJpeGVsZi5jIGIvYXJjaC9taXBzL2tlcm5lbC9pcml4ZWxmLmMKaW5kZXggNzg1MmM3Yy4uMjkwZDhlMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9pcml4ZWxmLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9pcml4ZWxmLmMKQEAgLTU5MSw5ICs1OTEsOSBAQAogCQlyZXR1cm47CiAKIAlwcCA9IChzdHJ1Y3QgcHJkYSAqKSB2OwotCXBwLT5wcmRhX3N5cy50X3BpZCAgPSBjdXJyZW50LT5waWQ7CisJcHAtPnByZGFfc3lzLnRfcGlkICA9IHRhc2tfcGlkX3ZucihjdXJyZW50KTsKIAlwcC0+cHJkYV9zeXMudF9wcmlkID0gcmVhZF9jMF9wcmlkKCk7Ci0JcHAtPnByZGFfc3lzLnRfcnBpZCA9IGN1cnJlbnQtPnBpZDsKKwlwcC0+cHJkYV9zeXMudF9ycGlkID0gdGFza19waWRfdm5yKGN1cnJlbnQpOwogCiAJLyogV2UgbGVhdmUgdGhlIHJlc3Qgc2V0IHRvIHplcm8gKi8KIH0KQEAgLTExNzAsMTEgKzExNzAsMTEgQEAKIAlwcnN0YXR1cy5wcl9pbmZvLnNpX3NpZ25vID0gcHJzdGF0dXMucHJfY3Vyc2lnID0gc2lnbnI7CiAJcHJzdGF0dXMucHJfc2lncGVuZCA9IGN1cnJlbnQtPnBlbmRpbmcuc2lnbmFsLnNpZ1swXTsKIAlwcnN0YXR1cy5wcl9zaWdob2xkID0gY3VycmVudC0+YmxvY2tlZC5zaWdbMF07Ci0JcHNpbmZvLnByX3BpZCA9IHByc3RhdHVzLnByX3BpZCA9IGN1cnJlbnQtPnBpZDsKLQlwc2luZm8ucHJfcHBpZCA9IHByc3RhdHVzLnByX3BwaWQgPSBjdXJyZW50LT5wYXJlbnQtPnBpZDsKLQlwc2luZm8ucHJfcGdycCA9IHByc3RhdHVzLnByX3BncnAgPSB0YXNrX3BncnBfbnIoY3VycmVudCk7Ci0JcHNpbmZvLnByX3NpZCA9IHByc3RhdHVzLnByX3NpZCA9IHRhc2tfc2Vzc2lvbl9ucihjdXJyZW50KTsKLQlpZiAoY3VycmVudC0+cGlkID09IGN1cnJlbnQtPnRnaWQpIHsKKwlwc2luZm8ucHJfcGlkID0gcHJzdGF0dXMucHJfcGlkID0gdGFza19waWRfdm5yKGN1cnJlbnQpOworCXBzaW5mby5wcl9wcGlkID0gcHJzdGF0dXMucHJfcHBpZCA9IHRhc2tfcGlkX3ZucihjdXJyZW50LT5wYXJlbnQpOworCXBzaW5mby5wcl9wZ3JwID0gcHJzdGF0dXMucHJfcGdycCA9IHRhc2tfcGdycF92bnIoY3VycmVudCk7CisJcHNpbmZvLnByX3NpZCA9IHByc3RhdHVzLnByX3NpZCA9IHRhc2tfc2Vzc2lvbl92bnIoY3VycmVudCk7CisJaWYgKHRocmVhZF9ncm91cF9sZWFkZXIoY3VycmVudCkpIHsKIAkJLyoKIAkJICogVGhpcyBpcyB0aGUgcmVjb3JkIGZvciB0aGUgZ3JvdXAgbGVhZGVyLiAgQWRkIGluIHRoZQogCQkgKiBjdW11bGF0aXZlIHRpbWVzIG9mIHByZXZpb3VzIGRlYWQgdGhyZWFkcy4gIFRoaXMgdG90YWwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaXJpeHNpZy5jIGIvYXJjaC9taXBzL2tlcm5lbC9pcml4c2lnLmMKaW5kZXggNWIxMGFjMS4uMDIxNWM4MCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9pcml4c2lnLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9pcml4c2lnLmMKQEAgLTU3OCwxMCArNTc4LDExIEBACiAKICNkZWZpbmUgV19NQVNLICAgICAgKFdfRVhJVEVEIHwgV19UUkFQUEVEIHwgV19TVE9QUEVEIHwgV19DT05UIHwgV19OT0hBTkcpCiAKLWFzbWxpbmthZ2UgaW50IGlyaXhfd2FpdHN5cyhpbnQgdHlwZSwgaW50IHBpZCwKK2FzbWxpbmthZ2UgaW50IGlyaXhfd2FpdHN5cyhpbnQgdHlwZSwgaW50IHVwaWQsCiAJc3RydWN0IGlyaXg1X3NpZ2luZm8gX191c2VyICppbmZvLCBpbnQgb3B0aW9ucywKIAlzdHJ1Y3QgcnVzYWdlIF9fdXNlciAqcnUpCiB7CisJc3RydWN0IHBpZCAqcGlkID0gTlVMTDsKIAlpbnQgZmxhZywgcmV0dmFsOwogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwpAQCAtNjA0LDYgKzYwNSw4IEBACiAJaWYgKHR5cGUgIT0gSVJJWF9QX1BJRCAmJiB0eXBlICE9IElSSVhfUF9QR0lEICYmIHR5cGUgIT0gSVJJWF9QX0FMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAodHlwZSAhPSBJUklYX1BfQUxMKQorCQlwaWQgPSBmaW5kX2dldF9waWQodXBpZCk7CiAJYWRkX3dhaXRfcXVldWUoJmN1cnJlbnQtPnNpZ25hbC0+d2FpdF9jaGxkZXhpdCwgJndhaXQpOwogcmVwZWF0OgogCWZsYWcgPSAwOwpAQCAtNjEyLDkgKzYxNSw5IEBACiAJdHNrID0gY3VycmVudDsKIAlsaXN0X2Zvcl9lYWNoKF9wLCAmdHNrLT5jaGlsZHJlbikgewogCQlwID0gbGlzdF9lbnRyeShfcCwgc3RydWN0IHRhc2tfc3RydWN0LCBzaWJsaW5nKTsKLQkJaWYgKCh0eXBlID09IElSSVhfUF9QSUQpICYmIHAtPnBpZCAhPSBwaWQpCisJCWlmICgodHlwZSA9PSBJUklYX1BfUElEKSAmJiB0YXNrX3BpZChwKSAhPSBwaWQpCiAJCQljb250aW51ZTsKLQkJaWYgKCh0eXBlID09IElSSVhfUF9QR0lEKSAmJiB0YXNrX3BncnBfbnIocCkgIT0gcGlkKQorCQlpZiAoKHR5cGUgPT0gSVJJWF9QX1BHSUQpICYmIHRhc2tfcGdycChwKSAhPSBwaWQpCiAJCQljb250aW51ZTsKIAkJaWYgKChwLT5leGl0X3NpZ25hbCAhPSBTSUdDSExEKSkKIAkJCWNvbnRpbnVlOwpAQCAtNjM5LDcgKzY0Miw3IEBACiAKIAkJCXJldHZhbCA9IF9fcHV0X3VzZXIoU0lHQ0hMRCwgJmluZm8tPnNpZyk7CiAJCQlyZXR2YWwgfD0gX19wdXRfdXNlcigwLCAmaW5mby0+Y29kZSk7Ci0JCQlyZXR2YWwgfD0gX19wdXRfdXNlcihwLT5waWQsICZpbmZvLT5zdHVmZi5wcm9jaW5mby5waWQpOworCQkJcmV0dmFsIHw9IF9fcHV0X3VzZXIodGFza19waWRfdm5yKHApLCAmaW5mby0+c3R1ZmYucHJvY2luZm8ucGlkKTsKIAkJCXJldHZhbCB8PSBfX3B1dF91c2VyKChwLT5leGl0X2NvZGUgPj4gOCkgJiAweGZmLAogCQkJICAgICAgICAgICAmaW5mby0+c3R1ZmYucHJvY2luZm8ucHJvY2RhdGEuY2hpbGQuc3RhdHVzKTsKIAkJCXJldHZhbCB8PSBfX3B1dF91c2VyKHAtPnV0aW1lLCAmaW5mby0+c3R1ZmYucHJvY2luZm8ucHJvY2RhdGEuY2hpbGQudXRpbWUpOwpAQCAtNjU3LDcgKzY2MCw3IEBACiAJCQkJZ2V0cnVzYWdlKHAsIFJVU0FHRV9CT1RILCBydSk7CiAJCQlyZXR2YWwgPSBfX3B1dF91c2VyKFNJR0NITEQsICZpbmZvLT5zaWcpOwogCQkJcmV0dmFsIHw9IF9fcHV0X3VzZXIoMSwgJmluZm8tPmNvZGUpOyAgICAgIC8qIENMRF9FWElURUQgKi8KLQkJCXJldHZhbCB8PSBfX3B1dF91c2VyKHAtPnBpZCwgJmluZm8tPnN0dWZmLnByb2NpbmZvLnBpZCk7CisJCQlyZXR2YWwgfD0gX19wdXRfdXNlcih0YXNrX3BpZF92bnIocCksICZpbmZvLT5zdHVmZi5wcm9jaW5mby5waWQpOwogCQkJcmV0dmFsIHw9IF9fcHV0X3VzZXIoKHAtPmV4aXRfY29kZSA+PiA4KSAmIDB4ZmYsCiAJCQkgICAgICAgICAgICZpbmZvLT5zdHVmZi5wcm9jaW5mby5wcm9jZGF0YS5jaGlsZC5zdGF0dXMpOwogCQkJcmV0dmFsIHw9IF9fcHV0X3VzZXIocC0+dXRpbWUsCkBAIC02NjUsNyArNjY4LDcgQEAKIAkJCXJldHZhbCB8PSBfX3B1dF91c2VyKHAtPnN0aW1lLAogCQkJICAgICAgICAgICAmaW5mby0+c3R1ZmYucHJvY2luZm8ucHJvY2RhdGEuY2hpbGQuc3RpbWUpOwogCQkJaWYgKHJldHZhbCkKLQkJCQlyZXR1cm4gcmV0dmFsOworCQkJCWdvdG8gZW5kX3dhaXRzeXM7CiAKIAkJCWlmIChwLT5yZWFsX3BhcmVudCAhPSBwLT5wYXJlbnQpIHsKIAkJCQl3cml0ZV9sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CkBAIC02OTgsNiArNzAxLDcgQEAKIGVuZF93YWl0c3lzOgogCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwogCXJlbW92ZV93YWl0X3F1ZXVlKCZjdXJyZW50LT5zaWduYWwtPndhaXRfY2hsZGV4aXQsICZ3YWl0KTsKKwlwdXRfcGlkKHBpZCk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9pcnEuYyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJxLmMKaW5kZXggZDA2ZTljOS4uZTMzMDlmZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL21pcHMva2VybmVsL2lycS5jCkBAIC0xNDUsNiArMTQ1LDExIEBACiAKIHZvaWQgX19pbml0IGluaXRfSVJRKHZvaWQpCiB7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfSVJRUzsgaSsrKQorCQlzZXRfaXJxX25vcHJvYmUoaSk7CisKIAlhcmNoX2luaXRfaXJxKCk7CiAKICNpZmRlZiBDT05GSUdfS0dEQgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9taXBzL2tlcm5lbC9zZXR1cC5jCmluZGV4IGMwMzI0MDkuLjM5ZjNkZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL21pcHMva2VybmVsL3NldHVwLmMKQEAgLTIzMiw3ICsyMzIsNyBAQAogCQlnb3RvIGRpc2FibGU7CiAJfQogCi0JcmVzZXJ2ZV9ib290bWVtKF9fcGEoaW5pdHJkX3N0YXJ0KSwgc2l6ZSk7CisJcmVzZXJ2ZV9ib290bWVtKF9fcGEoaW5pdHJkX3N0YXJ0KSwgc2l6ZSwgQk9PVE1FTV9ERUZBVUxUKTsKIAlpbml0cmRfYmVsb3dfc3RhcnRfb2sgPSAxOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiSW5pdGlhbCByYW1kaXNrIGF0OiAweCVseCAoJWx1IGJ5dGVzKVxuIiwKQEAgLTQxMyw3ICs0MTMsNyBAQAogCS8qCiAJICogUmVzZXJ2ZSB0aGUgYm9vdG1hcCBtZW1vcnkuCiAJICovCi0JcmVzZXJ2ZV9ib290bWVtKFBGTl9QSFlTKG1hcHN0YXJ0KSwgYm9vdG1hcF9zaXplKTsKKwlyZXNlcnZlX2Jvb3RtZW0oUEZOX1BIWVMobWFwc3RhcnQpLCBib290bWFwX3NpemUsIEJPT1RNRU1fREVGQVVMVCk7CiAKIAkvKgogCSAqIFJlc2VydmUgaW5pdHJkIG1lbW9yeSBpZiBuZWVkZWQuCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3N5c2lyaXguYyBiL2FyY2gvbWlwcy9rZXJuZWwvc3lzaXJpeC5jCmluZGV4IDIyZmQ0MWUuLmQ3MGM0ZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc3lzaXJpeC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc3lzaXJpeC5jCkBAIC01ODIsOCArNTgyLDggQEAKIAogYXNtbGlua2FnZSBpbnQgaXJpeF9nZXRwaWQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JcmVncy0+cmVnc1szXSA9IGN1cnJlbnQtPnJlYWxfcGFyZW50LT5waWQ7Ci0JcmV0dXJuIGN1cnJlbnQtPnBpZDsKKwlyZWdzLT5yZWdzWzNdID0gdGFza19waWRfdm5yKGN1cnJlbnQtPnJlYWxfcGFyZW50KTsKKwlyZXR1cm4gdGFza19waWRfdm5yKGN1cnJlbnQpOwogfQogCiBhc21saW5rYWdlIGludCBpcml4X2dldHVpZChzdHJ1Y3QgcHRfcmVncyAqcmVncykKQEAgLTc2MywxMSArNzYzLDExIEBACiAJcHJpbnRrKCJbJXM6JWRdIHNldHBncnAoJWQpICIsIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgZmxhZ3MpOwogI2VuZGlmCiAJaWYoIWZsYWdzKQotCQllcnJvciA9IHRhc2tfcGdycF9ucihjdXJyZW50KTsKKwkJZXJyb3IgPSB0YXNrX3BncnBfdm5yKGN1cnJlbnQpOwogCWVsc2UKIAkJZXJyb3IgPSBzeXNfc2V0c2lkKCk7CiAjaWZkZWYgREVCVUdfUFJPQ0dSUFMKLQlwcmludGsoInJldHVybmluZyAlZFxuIiwgdGFza19wZ3JwX25yKGN1cnJlbnQpKTsKKwlwcmludGsoInJldHVybmluZyAlZFxuIiwgZXJyb3IpOwogI2VuZGlmCiAKIAlyZXR1cm4gZXJyb3I7CkBAIC0xMDkzLDEwICsxMDkzLDEwIEBACiAJICAgICAgIHBpZCwgcGdycCk7CiAjZW5kaWYKIAlpZighcGlkKQotCQlwaWQgPSBjdXJyZW50LT5waWQ7CisJCXBpZCA9IHRhc2tfcGlkX3ZucihjdXJyZW50KTsKIAogCS8qIFdoZWVlLCB3ZWlyZCBzeXN2IHRoaW5nLi4uICovCi0JaWYgKChwZ3JwID09IDApICYmIChwaWQgPT0gY3VycmVudC0+cGlkKSkKKwlpZiAoKHBncnAgPT0gMCkgJiYgKHBpZCA9PSB0YXNrX3BpZF92bnIoY3VycmVudCkpKQogCQllcnJvciA9IHN5c19zZXRzaWQoKTsKIAllbHNlCiAJCWVycm9yID0gc3lzX3NldHBnaWQocGlkLCBwZ3JwKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LW1lbW9yeS5jIGIvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctbWVtb3J5LmMKaW5kZXggZTVlMDIzZi4uYmY0MzhkMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctbWVtb3J5LmMKKysrIGIvYXJjaC9taXBzL3NnaS1pcDI3L2lwMjctbWVtb3J5LmMKQEAgLTQ2NSw3ICs0NjUsOCBAQAogCWZyZWVfYm9vdG1lbV9ub2RlKE5PREVfREFUQShub2RlKSwgc2xvdF9maXJzdHBmbiA8PCBQQUdFX1NISUZULAogCQkJKHNsb3RfbGFzdHBmbiAtIHNsb3RfZmlyc3RwZm4pIDw8IFBBR0VfU0hJRlQpOwogCXJlc2VydmVfYm9vdG1lbV9ub2RlKE5PREVfREFUQShub2RlKSwgc2xvdF9maXJzdHBmbiA8PCBQQUdFX1NISUZULAotCQkoKHNsb3RfZnJlZXBmbiAtIHNsb3RfZmlyc3RwZm4pIDw8IFBBR0VfU0hJRlQpICsgYm9vdG1hcF9zaXplKTsKKwkJKChzbG90X2ZyZWVwZm4gLSBzbG90X2ZpcnN0cGZuKSA8PCBQQUdFX1NISUZUKSArIGJvb3RtYXBfc2l6ZSwKKwkJQk9PVE1FTV9ERUZBVUxUKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9LY29uZmlnIGIvYXJjaC9tbjEwMzAwL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVkYzNhNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9LY29uZmlnCkBAIC0wLDAgKzEsMzgxIEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBEb2N1bWVudGF0aW9uL2tidWlsZC9rY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWFpbm1lbnUgIkxpbnV4IEtlcm5lbCBDb25maWd1cmF0aW9uIgorCitjb25maWcgTU4xMDMwMAorCWRlZl9ib29sIHkKKworY29uZmlnIEFNMzMKKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBNTVUKKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBISUdITUVNCisJZGVmX2Jvb2wgbgorCitjb25maWcgTlVNQQorCWRlZl9ib29sIG4KKworY29uZmlnIFVJRDE2CisJZGVmX2Jvb2wgeQorCitjb25maWcgUldTRU1fR0VORVJJQ19TUElOTE9DSworCWRlZl9ib29sIHkKKworY29uZmlnIFJXU0VNX1hDSEdBRERfQUxHT1JJVEhNCisJYm9vbAorCitjb25maWcgR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRCisJZGVmX2Jvb2wgeQorCitjb25maWcgR0VORVJJQ19DQUxJQlJBVEVfREVMQVkKKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBHRU5FUklDX0ZJTkRfTkVYVF9CSVQKKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBHRU5FUklDX0hXRUlHSFQKKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBHRU5FUklDX1RJTUUKKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBHRU5FUklDX0JVRworCWRlZl9ib29sIHkKKworY29uZmlnIFFVSUNLTElTVAorCWRlZl9ib29sIHkKKworY29uZmlnIEFSQ0hfSEFTX0lMT0cyX1UzMgorCWRlZl9ib29sIHkKKworY29uZmlnIEFSQ0hfU1VQUE9SVFNfQU9VVAorCWRlZl9ib29sIG4KKworIyBVc2UgdGhlIGdlbmVyaWMgaW50ZXJydXB0IGhhbmRsaW5nIGNvZGUgaW4ga2VybmVsL2lycS8KK2NvbmZpZyBHRU5FUklDX0hBUkRJUlFTCisJZGVmX2Jvb2wgeQorCitjb25maWcgSE9UUExVR19DUFUKKwlkZWZfYm9vbCBuCisKK21haW5tZW51ICJNYXRzdXNoaXRhIE1OMTAzMDAvQU0zMyBLZXJuZWwgQ29uZmlndXJhdGlvbiIKKworc291cmNlICJpbml0L0tjb25maWciCisKKworbWVudSAiTWF0c3VzaGl0YSBNTjEwMzAwIHN5c3RlbSBzZXR1cCIKKworY2hvaWNlCisJcHJvbXB0ICJVbml0IHR5cGUiCisJZGVmYXVsdCBNTjEwMzAwX1VOSVRfQVNCMjMwMworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHNwZWNpZmllcyBib2FyZCBmb3Igd2hpY2ggdGhlIGtlcm5lbCB3aWxsIGJlCisJICBjb21waWxlZC4gSXQgYWZmZWN0cyB0aGUgZXh0ZXJuYWwgcGVyaXBoZXJhbHMgY2F0ZXJlZCBmb3IuCisKK2NvbmZpZyBNTjEwMzAwX1VOSVRfQVNCMjMwMworCWJvb2wgIkFTQjIzMDMiCisKK2NvbmZpZyBNTjEwMzAwX1VOSVRfQVNCMjMwNQorCWJvb2wgIkFTQjIzMDUiCisKK2VuZGNob2ljZQorCitjaG9pY2UKKwlwcm9tcHQgIlByb2Nlc3NvciBzdXBwb3J0IgorCWRlZmF1bHQgTU4xMDMwMF9QUk9DX01OMTAzRTAxMAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHNwZWNpZmllcyB0aGUgcHJvY2Vzc29yIGZvciB3aGljaCB0aGUga2VybmVsIHdpbGwgYmUKKwkgIGNvbXBpbGVkLiBJdCBhZmZlY3RzIHRoZSBvbi1jaGlwIHBlcmlwaGVyYWxzIGNhdGVyZWQgZm9yLgorCitjb25maWcgTU4xMDMwMF9QUk9DX01OMTAzRTAxMAorCWJvb2wgIk1OMTAzRTAxMCIKKwlkZXBlbmRzIG9uIE1OMTAzMDBfVU5JVF9BU0IyMzAzIHx8IE1OMTAzMDBfVU5JVF9BU0IyMzA1CisJc2VsZWN0IE1OMTAzMDBfUFJPQ19IQVNfVFRZU00wCisJc2VsZWN0IE1OMTAzMDBfUFJPQ19IQVNfVFRZU00xCisJc2VsZWN0IE1OMTAzMDBfUFJPQ19IQVNfVFRZU00yCisKK2VuZGNob2ljZQorCitjaG9pY2UKKwlwcm9tcHQgIlByb2Nlc3NvciBjb3JlIHN1cHBvcnQiCisJZGVmYXVsdCBNTjEwMzAwX0NQVV9BTTMzVjIKKwloZWxwCisJICBUaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhlIHByb2Nlc3NvciBjb3JlIGZvciB3aGljaCB0aGUga2VybmVsIHdpbGwgYmUKKwkgIGNvbXBpbGVkLiBJdCBhZmZlY3RzIHRoZSBpbnN0cnVjdGlvbiBzZXQgdXNlZC4KKworY29uZmlnIE1OMTAzMDBfQ1BVX0FNMzNWMgorCWJvb2wgIkFNMzN2MiIKKworZW5kY2hvaWNlCisKK2NvbmZpZyBGUFUKKwlib29sICJGUFUgcHJlc2VudCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE1OMTAzMDBfUFJPQ19NTjEwM0UwMTAKKworY2hvaWNlCisJcHJvbXB0ICJDUFUgQ2FjaGluZyBtb2RlIgorCWRlZmF1bHQgTU4xMDMwMF9DQUNIRV9XQkFDSworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGRldGVybWluZXMgdGhlIGNhY2hpbmcgbW9kZSBmb3IgdGhlIGtlcm5lbC4KKworCSAgV3JpdGUtQmFjayBjYWNoaW5nIG1vZGUgaW52b2x2ZXMgdGhlIGFsbCByZWFkcyBhbmQgd3JpdGVzIGNhdXNpbmcKKwkgIHRoZSBhZmZlY3RlZCBjYWNoZWxpbmUgdG8gYmUgcmVhZCBpbnRvIHRoZSBjYWNoZSBmaXJzdCBiZWZvcmUgYmVpbmcKKwkgIG9wZXJhdGVkIHVwb24uIE1lbW9yeSBpcyBub3QgdGhlbiB1cGRhdGVkIGJ5IGEgd3JpdGUgdW50aWwgdGhlIGNhY2hlCisJICBpcyBmaWxsZWQgYW5kIGEgY2FjaGVsaW5lIG5lZWRzIHRvIGJlIGRpc3BsYWNlZCBmcm9tIHRoZSBjYWNoZSB0bworCSAgbWFrZSByb29tLiBPbmx5IGF0IHRoYXQgcG9pbnQgaXMgaXQgd3JpdHRlbiBiYWNrLgorCisJICBXcml0ZS1UaHJvdWdoIGNhY2hpbmcgb25seSBmZXRjaGVzIGNhY2hlbGluZXMgZnJvbSBtZW1vcnkgb24gYQorCSAgcmVhZC4gV3JpdGVzIGFsd2F5cyBnZXQgd3JpdHRlbiBkaXJlY3RseSB0byBtZW1vcnkuIElmIHRoZSBhZmZlY3RlZAorCSAgY2FjaGVsaW5lIGlzIGFsc28gaW4gY2FjaGUsIGl0IHdpbGwgYmUgdXBkYXRlZCB0b28uCisKKwkgIFRoZSBmaW5hbCBvcHRpb24gaXMgdG8gdHVybiBvZiBjYWNoaW5nIGVudGlyZWx5LgorCitjb25maWcgTU4xMDMwMF9DQUNIRV9XQkFDSworCWJvb2wgIldyaXRlLUJhY2siCisKK2NvbmZpZyBNTjEwMzAwX0NBQ0hFX1dUSFJVCisJYm9vbCAiV3JpdGUtVGhyb3VnaCIKKworY29uZmlnIE1OMTAzMDBfQ0FDSEVfRElTQUJMRUQKKwlib29sICJEaXNhYmxlZCIKKworZW5kY2hvaWNlCisKK21lbnUgIk1lbW9yeSBsYXlvdXQgb3B0aW9ucyIKKworY29uZmlnIEtFUk5FTF9SQU1fQkFTRV9BRERSRVNTCisJaGV4ICJCYXNlIGFkZHJlc3Mgb2Yga2VybmVsIFJBTSIKKwlkZWZhdWx0ICIweDkwMDAwMDAwIgorCitjb25maWcgSU5URVJSVVBUX1ZFQ1RPUl9CQVNFCisJaGV4ICJCYXNlIGFkZHJlc3Mgb2YgdmVjdG9yIHRhYmxlIgorCWRlZmF1bHQgIjB4OTAwMDAwMDAiCisJaGVscAorCSAgVGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgdmVjdG9yIHRhYmxlIHdpbGwgYmUgcHJvZ3JhbW1lZCBpbnRvCisgICAgICAgICAgdGhlIFRCUiByZWdpc3Rlci4gSXQgbXVzdCBiZSBvbiAxNk1pQiBhZGRyZXNzIGJvdW5kYXJ5LgorCitjb25maWcgS0VSTkVMX1RFWFRfQUREUkVTUworCWhleCAiQmFzZSBhZGRyZXNzIG9mIGtlcm5lbCIKKwlkZWZhdWx0ICIweDkwMDAxMDAwIgorCitjb25maWcgS0VSTkVMX1pJTUFHRV9CQVNFX0FERFJFU1MKKwloZXggIkJhc2UgYWRkcmVzcyBvZiBjb21wcmVzc2VkIHZtbGludXggaW1hZ2UiCisJZGVmYXVsdCAiMHg5MDcwMDAwMCIKKworZW5kbWVudQorCitjb25maWcgUFJFRU1QVAorCWJvb2wgIlByZWVtcHRpYmxlIEtlcm5lbCIKKwloZWxwCisJICBUaGlzIG9wdGlvbiByZWR1Y2VzIHRoZSBsYXRlbmN5IG9mIHRoZSBrZXJuZWwgd2hlbiByZWFjdGluZyB0bworCSAgcmVhbC10aW1lIG9yIGludGVyYWN0aXZlIGV2ZW50cyBieSBhbGxvd2luZyBhIGxvdyBwcmlvcml0eSBwcm9jZXNzIHRvCisJICBiZSBwcmVlbXB0ZWQgZXZlbiBpZiBpdCBpcyBpbiBrZXJuZWwgbW9kZSBleGVjdXRpbmcgYSBzeXN0ZW0gY2FsbC4KKwkgIFRoaXMgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBydW4gbW9yZSByZWxpYWJseSBldmVuIHdoZW4gdGhlIHN5c3RlbSBpcworCSAgdW5kZXIgbG9hZC4KKworCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEga2VybmVsIGZvciBhIGRlc2t0b3AsIGVtYmVkZGVkCisJICBvciByZWFsLXRpbWUgc3lzdGVtLiAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCisKK2NvbmZpZyBQUkVFTVBUX0JLTAorCWJvb2wgIlByZWVtcHQgVGhlIEJpZyBLZXJuZWwgTG9jayIKKwlkZXBlbmRzIG9uIFBSRUVNUFQKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIG9wdGlvbiByZWR1Y2VzIHRoZSBsYXRlbmN5IG9mIHRoZSBrZXJuZWwgYnkgbWFraW5nIHRoZQorCSAgYmlnIGtlcm5lbCBsb2NrIHByZWVtcHRpYmxlLgorCisJICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgYnVpbGRpbmcgYSBrZXJuZWwgZm9yIGEgZGVza3RvcCBzeXN0ZW0uCisJICBTYXkgTiBpZiB5b3UgYXJlIHVuc3VyZS4KKworY29uZmlnIE1OMTAzMDBfQ1VSUkVOVF9JTl9FMgorCWJvb2wgIkhvbGQgY3VycmVudCB0YXNrIGFkZHJlc3MgaW4gRTIgcmVnaXN0ZXIiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBvcHRpb24gcmVtb3ZlcyB0aGUgRTIvUjIgcmVnaXN0ZXIgZnJvbSB0aGUgc2V0IGF2YWlsYWJsZSB0byBnY2MKKwkgIGZvciBub3JtYWwgdXNlIGFuZCBpbnN0ZWFkIHVzZXMgaXQgdG8gc3RvcmUgdGhlIGFkZHJlc3Mgb2YgdGhlCisJICBjdXJyZW50IHByb2Nlc3MncyB0YXNrX3N0cnVjdCB3aGlsc3QgaW4gdGhlIGtlcm5lbC4KKworCSAgVGhpcyBtZWFucyB0aGUga2VybmVsIGRvZXNuJ3QgbmVlZCB0byBjYWxjdWxhdGUgdGhlIGFkZHJlc3MgZWFjaCB0aW1lCisJICAiY3VycmVudCIgaXMgdXNlZCAodGFrZSBTUCwgQU5EIHdpdGggbWFzayBhbmQgZGVyZWZlcmVuY2UgcG9pbnRlcgorCSAganVzdCB0byBnZXQgdGhlIGFkZHJlc3MpLCBhbmQgaW5zdGVhZCBjYW4ganVzdCB1c2UgRTIrb2Zmc2V0CisJICBhZGRyZXNzaW5nIGVhY2ggdGltZS4KKworCSAgVGhpcyBoYXMgbm8gZWZmZWN0IG9uIHVzZXJzcGFjZS4KKworY29uZmlnIE1OMTAzMDBfVVNJTkdfSlRBRworCWJvb2wgIlVzaW5nIEpUQUcgdG8gZGVidWcga2VybmVsIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgb3B0aW9ucyBpbmRpY2F0ZXMgdGhhdCBKVEFHIHdpbGwgYmUgdXNlZCB0byBkZWJ1ZyB0aGUga2VybmVsLiBJdAorCSAgc3VwcHJlc3NlcyB0aGUgdXNlIG9mIGNlcnRhaW4gaGFyZHdhcmUgZGVidWdnaW5nIGZlYXR1cmVzLCBzdWNoIGFzCisJICBzaW5nbGUtc3RlcHBpbmcsIHdoaWNoIGFyZSB0YWtlbiBvdmVyIGNvbXBsZXRlbHkgYnkgdGhlIEpUQUcgdW5pdC4KKworY29uZmlnIE1OMTAzMDBfUlRDCisJYm9vbCAiVXNpbmcgTU4xMDMwMCBSVEMiCisJZGVwZW5kcyBvbiBNTjEwMzAwX1BST0NfTU4xMDNFMDEwCisJZGVmYXVsdCBuCisJaGVscAorCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBSVEMsIHRodXMgZW5hYmxpbmcgdGltZSB0byBiZQorCSAgdHJhY2tlZCwgZXZlbiB3aGVuIHN5c3RlbSBpcyBwb3dlcmVkIGRvd24uIFRoaXMgaXMgYXZhaWxhYmxlIG9uLWNoaXAKKwkgIG9uIHRoZSBNTjEwM0UwMTAuCisKK2NvbmZpZyBNTjEwMzAwX1dEX1RJTUVSCisJYm9vbCAiVXNpbmcgTU4xMDMwMCB3YXRjaGRvZyB0aW1lciIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIG9wdGlvbnMgaW5kaWNhdGVzIHRoYXQgdGhlIHdhdGNoZG9nIHRpbWVyIHdpbGwgYmUgdXNlZC4KKworY29uZmlnIFBDSQorCWJvb2wgIlVzZSBQQ0kiCisJZGVwZW5kcyBvbiBNTjEwMzAwX1VOSVRfQVNCMjMwNQorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNvbWUgc3lzdGVtcyAoc3VjaCBhcyB0aGUgQVNCMjMwNSkgaGF2ZSBQQ0kgb25ib2FyZC4gSWYgeW91IGhhdmUgb25lCisJICBvZiB0aGVzZSBib2FyZHMgYW5kIHlvdSB3aXNoIHRvIHVzZSB0aGUgUENJIGZhY2lsaXRpZXMsIHNheSBZIGhlcmUuCisKKwkgIFRoZSBQQ0ktSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LCBjb250YWlucyB2YWx1YWJsZQorCSAgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggUENJIGhhcmR3YXJlIGRvZXMgd29yayB1bmRlciBMaW51eCBhbmQgd2hpY2gKKwkgIGRvZXNuJ3QuCisKK3NvdXJjZSAiZHJpdmVycy9wY2kvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL3BjbWNpYS9LY29uZmlnIgorCittZW51ICJNTjEwMzAwIGludGVybmFsIHNlcmlhbCBvcHRpb25zIgorCitjb25maWcgTU4xMDMwMF9QUk9DX0hBU19UVFlTTTAKKwlib29sCisJZGVmYXVsdCBuCisKK2NvbmZpZyBNTjEwMzAwX1BST0NfSEFTX1RUWVNNMQorCWJvb2wKKwlkZWZhdWx0IG4KKworY29uZmlnIE1OMTAzMDBfUFJPQ19IQVNfVFRZU00yCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgTU4xMDMwMF9UVFlTTQorCWJvb2wgIlN1cHBvcnQgZm9yIHR0eVNNIHNlcmlhbCBwb3J0cyIKKwlkZXBlbmRzIG9uIE1OMTAzMDAKKwlkZWZhdWx0IHkKKwlzZWxlY3QgU0VSSUFMX0NPUkUKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBvbi1jaGlwIHNlcmlhbCBwb3J0cyB0aGF0IHRoZQorCSAgTU4xMDMwMCBoYXMgYXZhaWxhYmxlLgorCitjb25maWcgTU4xMDMwMF9UVFlTTV9DT05TT0xFCisJYm9vbCAiU3VwcG9ydCBmb3IgY29uc29sZSBvbiB0dHlTTSBzZXJpYWwgcG9ydHMiCisJZGVwZW5kcyBvbiBNTjEwMzAwX1RUWVNNCisJc2VsZWN0IFNFUklBTF9DT1JFX0NPTlNPTEUKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIGEgY29uc29sZSBvbiB0aGUgb24tY2hpcCBzZXJpYWwgcG9ydHMKKwkgIHRoYXQgdGhlIE1OMTAzMDAgaGFzIGF2YWlsYWJsZS4KKworIworIyAvZGV2L3R0eVNNMAorIworY29uZmlnIE1OMTAzMDBfVFRZU00wCisJYm9vbCAiRW5hYmxlIFNJRjAgKC9kZXYvdHR5U00wKSIKKwlkZXBlbmRzIG9uIE1OMTAzMDBfVFRZU00gJiYgTU4xMDMwMF9QUk9DX0hBU19UVFlTTTAKKwloZWxwCisJICBFbmFibGUgYWNjZXNzIHRvIFNJRjAgdGhyb3VnaCAvZGV2L3R0eVNNMCBvciBnZGItc3R1YgorCitjaG9pY2UKKwlwcm9tcHQgIlNlbGVjdCB0aGUgdGltZXIgdG8gc3VwcGx5IHRoZSBjbG9jayBmb3IgU0lGMCIKKwlkZWZhdWx0IE1OMTAzMDBfVFRZU00wX1RJTUVSOAorCWRlcGVuZHMgb24gTU4xMDMwMF9UVFlTTTAKKworY29uZmlnIE1OMTAzMDBfVFRZU00wX1RJTUVSOAorCWJvb2wgIlVzZSB0aW1lciA4ICgxNi1iaXQpIgorCitjb25maWcgTU4xMDMwMF9UVFlTTTBfVElNRVIyCisJYm9vbCAiVXNlIHRpbWVyIDIgKDgtYml0KSIKKworZW5kY2hvaWNlCisKKyMKKyMgL2Rldi90dHlTTTEKKyMKK2NvbmZpZyBNTjEwMzAwX1RUWVNNMQorCWJvb2wgIkVuYWJsZSBTSUYxICgvZGV2L3R0eVNNMSkiCisJZGVwZW5kcyBvbiBNTjEwMzAwX1RUWVNNICYmIE1OMTAzMDBfUFJPQ19IQVNfVFRZU00xCisJaGVscAorCSAgRW5hYmxlIGFjY2VzcyB0byBTSUYxIHRocm91Z2ggL2Rldi90dHlTTTEgb3IgZ2RiLXN0dWIKKworY2hvaWNlCisJcHJvbXB0ICJTZWxlY3QgdGhlIHRpbWVyIHRvIHN1cHBseSB0aGUgY2xvY2sgZm9yIFNJRjEiCisJZGVmYXVsdCBNTjEwMzAwX1RUWVNNMF9USU1FUjkKKwlkZXBlbmRzIG9uIE1OMTAzMDBfVFRZU00xCisKK2NvbmZpZyBNTjEwMzAwX1RUWVNNMV9USU1FUjkKKwlib29sICJVc2UgdGltZXIgOSAoMTYtYml0KSIKKworY29uZmlnIE1OMTAzMDBfVFRZU00xX1RJTUVSMworCWJvb2wgIlVzZSB0aW1lciAzICg4LWJpdCkiCisKK2VuZGNob2ljZQorCisjCisjIC9kZXYvdHR5U00yCisjCitjb25maWcgTU4xMDMwMF9UVFlTTTIKKwlib29sICJFbmFibGUgU0lGMiAoL2Rldi90dHlTTTIpIgorCWRlcGVuZHMgb24gTU4xMDMwMF9UVFlTTSAmJiBNTjEwMzAwX1BST0NfSEFTX1RUWVNNMgorCWhlbHAKKwkgIEVuYWJsZSBhY2Nlc3MgdG8gU0lGMiB0aHJvdWdoIC9kZXYvdHR5U00yIG9yIGdkYi1zdHViCisKK2Nob2ljZQorCXByb21wdCAiU2VsZWN0IHRoZSB0aW1lciB0byBzdXBwbHkgdGhlIGNsb2NrIGZvciBTSUYyIgorCWRlZmF1bHQgTU4xMDMwMF9UVFlTTTBfVElNRVIxMAorCWRlcGVuZHMgb24gTU4xMDMwMF9UVFlTTTIKKworY29uZmlnIE1OMTAzMDBfVFRZU00yX1RJTUVSMTAKKwlib29sICJVc2UgdGltZXIgMTAgKDE2LWJpdCkiCisKK2VuZGNob2ljZQorCitjb25maWcgTU4xMDMwMF9UVFlTTTJfQ1RTCisJYm9vbCAiRW5hYmxlIHRoZSB1c2Ugb2YgdGhlIENUUyBsaW5lIC9kZXYvdHR5U00yIgorCWRlcGVuZHMgb24gTU4xMDMwMF9UVFlTTTIKKworZW5kbWVudQorCitzb3VyY2UgIm1tL0tjb25maWciCisKK21lbnUgIlBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyIKK3NvdXJjZSBrZXJuZWwvcG93ZXIvS2NvbmZpZworZW5kbWVudQorCitlbmRtZW51CisKKworbWVudSAiRXhlY3V0YWJsZSBmb3JtYXRzIgorCitzb3VyY2UgImZzL0tjb25maWcuYmluZm10IgorCitlbmRtZW51CisKK3NvdXJjZSAibmV0L0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9LY29uZmlnIgorCitzb3VyY2UgImZzL0tjb25maWciCisKK3NvdXJjZSAiYXJjaC9tbjEwMzAwL0tjb25maWcuZGVidWciCisKK3NvdXJjZSAic2VjdXJpdHkvS2NvbmZpZyIKKworc291cmNlICJjcnlwdG8vS2NvbmZpZyIKKworc291cmNlICJsaWIvS2NvbmZpZyIKKworc291cmNlICJhcmNoL21uMTAzMDAvb3Byb2ZpbGUvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9LY29uZmlnLmRlYnVnIGIvYXJjaC9tbjEwMzAwL0tjb25maWcuZGVidWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI0ZTMzOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9LY29uZmlnLmRlYnVnCkBAIC0wLDAgKzEsMTM1IEBACittZW51ICJLZXJuZWwgaGFja2luZyIKKworc291cmNlICJsaWIvS2NvbmZpZy5kZWJ1ZyIKKworY29uZmlnIERFQlVHX1NUQUNLT1ZFUkZMT1cKKwlib29sICJDaGVjayBmb3Igc3RhY2sgb3ZlcmZsb3dzIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisKK2NvbmZpZyBERUJVR19ERUNPTVBSRVNTX0tFUk5FTAorCWJvb2wgIlVzaW5nIHNlcmlhbCBwb3J0IGR1cmluZyBkZWNvbXByZXNzaW5nIGtlcm5lbCIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlIHlvdSB3aWxsIGNvbmZpcm0gdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIG9mCisJICBkZWNvbXByZXNzaW5nIExpbnV4IHNlZWluZyAiVW5jb21wcmVzc2luZyBMaW51eC4uLiAiIGFuZAorCSAgIk9rLCBib290aW5nIHRoZSBrZXJuZWwuXG4iIG9uIGNvbnNvbGUuCisKK2NvbmZpZyBLUFJPQkVTCisJYm9vbCAiS3Byb2JlcyIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWhlbHAKKwkgIEtwcm9iZXMgYWxsb3dzIHlvdSB0byB0cmFwIGF0IGFsbW9zdCBhbnkga2VybmVsIGFkZHJlc3MgYW5kCisJICBleGVjdXRlIGEgY2FsbGJhY2sgZnVuY3Rpb24uICByZWdpc3Rlcl9rcHJvYmUoKSBlc3RhYmxpc2hlcworCSAgYSBwcm9iZXBvaW50IGFuZCBzcGVjaWZpZXMgdGhlIGNhbGxiYWNrLiAgS3Byb2JlcyBpcyB1c2VmdWwKKwkgIGZvciBrZXJuZWwgZGVidWdnaW5nLCBub24taW50cnVzaXZlIGluc3RydW1lbnRhdGlvbiBhbmQgdGVzdGluZy4KKwkgIElmIGluIGRvdWJ0LCBzYXkgIk4iLgorCitjb25maWcgR0RCU1RVQgorCWJvb2wgIlJlbW90ZSBHREIga2VybmVsIGRlYnVnZ2luZyIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCXNlbGVjdCBERUJVR19JTkZPCisJc2VsZWN0IEZSQU1FX1BPSU5URVIKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byByZW1vdGVseSBkZWJ1ZyB0aGUga2VybmVsCisJICB1c2luZyBnZGIuIFRoaXMgZW5sYXJnZXMgeW91ciBrZXJuZWwgRUxGIGltYWdlIGRpc2sgc2l6ZSBieSBzZXZlcmFsCisJICBtZWdhYnl0ZXMgYW5kIHJlcXVpcmVzIGEgbWFjaGluZSB3aXRoIG1vcmUgdGhhbiAxNiBNQiwgYmV0dGVyIDMyIE1CCisJICBSQU0gdG8gYXZvaWQgZXhjZXNzaXZlIGxpbmtpbmcgdGltZS4gVGhpcyBpcyBvbmx5IHVzZWZ1bCBmb3Iga2VybmVsCisJICBoYWNrZXJzLiBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgR0RCU1RVQl9JTU1FRElBVEUKKwlib29sICJCcmVhayBpbnRvIEdEQiBzdHViIGltbWVkaWF0ZWx5IgorCWRlcGVuZHMgb24gR0RCU1RVQgorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCBHREIgc3R1YiB3aWxsIGJyZWFrIGludG8gdGhlIHByb2dyYW0gYXMgc29vbiBhcworCSAgcG9zc2libGUsIGxlYXZpbmcgdGhlIHByb2dyYW0gY291bnRlciBhdCB0aGUgYmVnaW5uaW5nIG9mCisJICBzdGFydF9rZXJuZWwoKSBpbiBpbml0L21haW4uYy4KKworY29uZmlnIEdEQl9DT05TT0xFCisJYm9vbCAiQ29uc29sZSBvdXRwdXQgdG8gR0RCIgorCWRlcGVuZHMgb24gR0RCU1RVQgorCWhlbHAKKwkgIElmIHlvdSBhcmUgdXNpbmcgR0RCIGZvciByZW1vdGUgZGVidWdnaW5nIG92ZXIgYSBzZXJpYWwgcG9ydCBhbmQKKwkgIHdvdWxkIGxpa2Uga2VybmVsIG1lc3NhZ2VzIHRvIGJlIGZvcm1hdHRlZCBpbnRvIEdEQiAkTyBwYWNrZXRzIHNvCisJICB0aGF0IEdEQiBwcmludHMgdGhlbSBhcyBwcm9ncmFtIG91dHB1dCwgc2F5ICdZJy4KKworY29uZmlnIEdEQlNUVUJfREVCVUdHSU5HCisJYm9vbCAiRGVidWcgR0RCIHN0dWIgYnkgbWVzc2FnZXMgdG8gc2VyaWFsIHBvcnQiCisJZGVwZW5kcyBvbiBHREJTVFVCCisJaGVscAorCSAgVGhpcyBjYXVzZXMgZGVidWdnaW5nIG1lc3NhZ2VzIHRvIGJlIGRpc3BsYXllZCBhdCB2YXJpb3VzIHBvaW50cworCSAgZHVyaW5nIGV4ZWN1dGlvbiBvZiB0aGUgR0RCIHN0dWIgcm91dGluZXMuIFN1Y2ggbWVzc2FnZXMgd2lsbCBiZQorCSAgZGlzcGxheWVkIG9uIHR0eVMwIGlmIHRoYXQgaXNuJ3QgdGhlIEdEQiBzdHViJ3MgcG9ydCwgb3IgdHR5U00wCisJICBvdGhlcndpc2UuCisKK2NvbmZpZyBHREJTVFVCX0RFQlVHX0VOVFJZCisJYm9vbCAiRGVidWcgR0RCIHN0dWIgZW50cnkiCisJZGVwZW5kcyBvbiBHREJTVFVCX0RFQlVHR0lORworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGNhdXNlcyBpbmZvcm1hdGlvbiB0byBiZSBkaXNwbGF5ZWQgYWJvdXQgZW50cnkgdG8gb3IgZXhpdAorCSAgZnJvbSB0aGUgbWFpbiBHREIgc3R1YiByb3V0aW5lLgorCitjb25maWcgR0RCU1RVQl9ERUJVR19QUk9UT0NPTAorCWJvb2wgIkRlYnVnIEdEQiBzdHViIHByb3RvY29sIgorCWRlcGVuZHMgb24gR0RCU1RVQl9ERUJVR0dJTkcKKwloZWxwCisJICBUaGlzIG9wdGlvbiBjYXVzZXMgaW5mb3JtYXRpb24gdG8gYmUgZGlzcGxheWVkIGFib3V0IHRoZSBHREIgcmVtb3RlCisJICBwcm90b2NvbCBtZXNzYWdlcyBnZW5lcmF0ZWQgZXhjaGFuZ2VkIHdpdGggR0RCLgorCitjb25maWcgR0RCU1RVQl9ERUJVR19JTworCWJvb2wgIkRlYnVnIEdEQiBzdHViIEkvTyIKKwlkZXBlbmRzIG9uIEdEQlNUVUJfREVCVUdHSU5HCisJaGVscAorCSAgVGhpcyBvcHRpb24gY2F1c2VzIGluZm9ybWF0aW9uIHRvIGJlIGRpc3BsYXllZCBhYm91dCBHREIgc3R1YidzCisJICBsb3ctbGV2ZWwgSS9PLgorCitjb25maWcgR0RCU1RVQl9ERUJVR19CUkVBS1BPSU5UCisJYm9vbCAiRGVidWcgR0RCIHN0dWIgYnJlYWtwb2ludCBtYW5hZ2VtZW50IgorCWRlcGVuZHMgb24gR0RCU1RVQl9ERUJVR0dJTkcKKwloZWxwCisJICBUaGlzIG9wdGlvbiBjYXVzZXMgaW5mb3JtYXRpb24gdG8gYmUgZGlzcGxheWVkIGFib3V0IEdEQiBzdHViJ3MKKwkgIGJyZWFrcG9pbnQgbWFuYWdlbWVudC4KKworY2hvaWNlCisJcHJvbXB0ICJHREIgc3R1YiBwb3J0IgorCWRlZmF1bHQgR0RCU1RVQl9UVFlTTTAKKwlkZXBlbmRzIG9uIEdEQlNUVUIKKwloZWxwCisJICBTZWxlY3QgdGhlIHNlcmlhbCBwb3J0IHVzZWQgZm9yIEdEQi1zdHViLgorCitjb25maWcgR0RCU1RVQl9PTl9UVFlTTTAKKwlib29sICIvZGV2L3R0eVNNMCBbU0lGMF0iCisJZGVwZW5kcyBvbiBNTjEwMzAwX1RUWVNNMAorCXNlbGVjdCBHREJTVFVCX09OX1RUWVNNeAorCitjb25maWcgR0RCU1RVQl9PTl9UVFlTTTEKKwlib29sICIvZGV2L3R0eVNNMSBbU0lGMV0iCisJZGVwZW5kcyBvbiBNTjEwMzAwX1RUWVNNMQorCXNlbGVjdCBHREJTVFVCX09OX1RUWVNNeAorCitjb25maWcgR0RCU1RVQl9PTl9UVFlTTTIKKwlib29sICIvZGV2L3R0eVNNMiBbU0lGMl0iCisJZGVwZW5kcyBvbiBNTjEwMzAwX1RUWVNNMgorCXNlbGVjdCBHREJTVFVCX09OX1RUWVNNeAorCitjb25maWcgR0RCU1RVQl9PTl9UVFlTMAorCWJvb2wgIi9kZXYvdHR5UzAiCisJc2VsZWN0IEdEQlNUVUJfT05fVFRZU3gKKworY29uZmlnIEdEQlNUVUJfT05fVFRZUzEKKwlib29sICIvZGV2L3R0eVMxIgorCXNlbGVjdCBHREJTVFVCX09OX1RUWVN4CisKK2VuZGNob2ljZQorCitjb25maWcgR0RCU1RVQl9PTl9UVFlTTXgKKwlib29sCisJZGVwZW5kcyBvbiBHREJTVFVCX09OX1RUWVNNMCB8fCBHREJTVFVCX09OX1RUWVNNMSB8fCBHREJTVFVCX09OX1RUWVNNMgorCWRlZmF1bHQgeQorCitjb25maWcgR0RCU1RVQl9PTl9UVFlTeAorCWJvb2wKKwlkZXBlbmRzIG9uIEdEQlNUVUJfT05fVFRZUzAgfHwgR0RCU1RVQl9PTl9UVFlTMQorCWRlZmF1bHQgeQorCitlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvTWFrZWZpbGUgYi9hcmNoL21uMTAzMDAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY3M2EyOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9NYWtlZmlsZQpAQCAtMCwwICsxLDEzNSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBNTjEwMzAwIEtlcm5lbCBtYWtlZmlsZSBzeXN0ZW0gc3BlY2lmaWNhdGlvbnMKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgTW9kaWZpZWQgYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyMgMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworS0JVSUxEX0RFRkNPTkZJRyA6PSBhc2IyMzAzX2RlZmNvbmZpZworCitDQ1NQRUNTCTo9ICQoc2hlbGwgJChDQykgLXYgMj4mMSB8IGdyZXAgIl5SZWFkaW5nIHNwZWNzIGZyb20gIiB8IGhlYWQgLTEgfCBjdXQgLWMyMC0pCitDQ0RJUgk6PSAkKHN0cmlwICQocGF0c3Vic3QgJS9zcGVjcywlLCQoQ0NTUEVDUykpKQorS0JVSUxEX0NQUEZMQUdTICs9IC1ub3N0ZGluYyAtSSQoQ0NESVIpL2luY2x1ZGUKKworTERGTEFHUwkJOj0KK09CSkNPUFlGTEFHUwk6PSAtTyBiaW5hcnkgLVIgLm5vdGUgLVIgLmNvbW1lbnQgLVMKKyNMREZMQUdTX3ZtbGludXggOj0gLU1hcCBsaW5rbWFwLnR4dAorQ0hFQ0tGTEFHUwkrPQorCitQUk9DRVNTT1IJOj0gdW5zZXQKK1VOSVQJCTo9IHVuc2V0CisKK0tCVUlMRF9DRkxBR1MJKz0gLW1hbTMzIC1tbWVtLWZ1bmNzIC1EQ1BVPUFNMzMKK0tCVUlMRF9BRkxBR1MJKz0gLW1hbTMzIC1EQ1BVPUFNMzMKKworaWZlcSAoJChDT05GSUdfTU4xMDMwMF9DVVJSRU5UX0lOX0UyKSx5KQorS0JVSUxEX0NGTEFHUwkrPSAtZmZpeGVkLWUyIC1mY2FsbC1zYXZlZC1lNQorZW5kaWYKKworaWZlcSAoJChDT05GSUdfTU4xMDMwMF9QUk9DX01OMTAzRTAxMCkseSkKK1BST0NFU1NPUgk6PSBtbjEwM2UwMTAKK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX01OMTAzMDBfVU5JVF9BU0IyMzAzKSx5KQorVU5JVAkJOj0gYXNiMjMwMworZW5kaWYKK2lmZXEgKCQoQ09ORklHX01OMTAzMDBfVU5JVF9BU0IyMzA1KSx5KQorVU5JVAkJOj0gYXNiMjMwNQorZW5kaWYKKworCitoZWFkLXkJCTo9IGFyY2gvbW4xMDMwMC9rZXJuZWwvaGVhZC5vIGFyY2gvbW4xMDMwMC9rZXJuZWwvaW5pdF90YXNrLm8KKworY29yZS15CQkrPSBhcmNoL21uMTAzMDAva2VybmVsLyBhcmNoL21uMTAzMDAvbW0vCisKK2lmbmVxICgkKFBST0NFU1NPUiksdW5zZXQpCitjb3JlLXkJCSs9IGFyY2gvbW4xMDMwMC9wcm9jLSQoUFJPQ0VTU09SKS8KK2VuZGlmCitpZm5lcSAoJChVTklUKSx1bnNldCkKK2NvcmUteQkJKz0gYXJjaC9tbjEwMzAwL3VuaXQtJChVTklUKS8KK2VuZGlmCitsaWJzLXkJCSs9IGFyY2gvbW4xMDMwMC9saWIvCisKK2RyaXZlcnMtJChDT05GSUdfT1BST0ZJTEUpCSs9IGFyY2gvbW4xMDMwMC9vcHJvZmlsZS8KKworYm9vdCA6PSBhcmNoL21uMTAzMDAvYm9vdAorCisuUEhPTlk6IHpJbWFnZQorCitLQlVJTERfSU1BR0UgOj0gJChib290KS96SW1hZ2UKK0NMRUFOX0ZJTEVTICs9ICQoYm9vdCkvekltYWdlCitDTEVBTl9GSUxFUyArPSAkKGJvb3QpL2NvbXByZXNzZWQvdm1saW51eAorQ0xFQU5fRklMRVMgKz0gJChib290KS9jb21wcmVzc2VkL3ZtbGludXguYmluCitDTEVBTl9GSUxFUyArPSAkKGJvb3QpL2NvbXByZXNzZWQvdm1saW51eC5iaW4uZ3oKKworekltYWdlOiB2bWxpbnV4CisJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSAkKGJvb3QpLyRACisKK2FsbDogekltYWdlCisKK2Jvb3RzdHJhcDoKKwkkKFEpJChNQUtFQk9PVCkgYm9vdHN0cmFwCisKK2FyY2hjbGVhbjoKKwkkKFEpJChNQUtFKSAkKGNsZWFuKT1hcmNoL21uMTAzMDAvcHJvYy1tbjEwM2UwMTAKKwkkKFEpJChNQUtFKSAkKGNsZWFuKT1hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzAzCisJJChRKSQoTUFLRSkgJChjbGVhbik9YXJjaC9tbjEwMzAwL3VuaXQtYXNiMjMwNQorCitkZWZpbmUgYXJjaGhlbHAKKyAgZWNobyAgJyogekltYWdlICAgICAgICAtIENvbXByZXNzZWQga2VybmVsIGltYWdlIChhcmNoLyQoQVJDSCkvYm9vdC96SW1hZ2UpJworZW5kZWYKKworIyBJZiB5b3UgbWFrZSBzdXJlIHRoZSAuUyBmaWxlcyBnZXQgY29tcGlsZWQgd2l0aCBkZWJ1ZyBpbmZvLAorIyB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyB0byBkaXNhYmxlIG9wdGltaXNhdGlvbnMKKyMgdGhhdCBhcmUgdW5oZWxwZnVsIHdoaWxzdCBkZWJ1Z2dpbmcuCitpZmRlZiBDT05GSUdfREVCVUdfSU5GTworI0tCVUlMRF9DRkxBR1MJKz0gLU8xCitLQlVJTERfQUZMQUdTCSs9IC1XYSwtLWdkd2FyZjIKK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBqdWdnbGUgc29tZSBzeW1saW5rcyBpbiB0aGUgTU4xMDMwMCBhc20gaW5jbHVkZSBkaXIKKyMKKyMJVXBkYXRlIG1hY2hpbmUgcHJvYyBhbmQgdW5pdCBzeW1saW5rcyBpZiBzb21ldGhpbmcgd2hpY2ggYWZmZWN0cworIwl0aGVtIGNoYW5nZWQuICBXZSB1c2UgLnByb2MgLyAudW5pdCB0byBpbmRpY2F0ZSB3aGVuIHRoZXkgd2VyZQorIwl1cGRhdGVkIGxhc3QsIG90aGVyd2lzZSBtYWtlIHVzZXMgdGhlIHRhcmdldCBkaXJlY3RvcnkgbXRpbWUuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBwcm9jZXNzb3Igc3BlY2lmaWMgZGVmaW5pdGlvbnMKK2luY2x1ZGUvYXNtLW1uMTAzMDAvLnByb2M6ICQod2lsZGNhcmQgaW5jbHVkZS9jb25maWcvcHJvYy8qLmgpIGluY2x1ZGUvY29uZmlnL2F1dG8uY29uZgorCUBlY2hvICcgIFNZTUxJTksgaW5jbHVkZS9hc20tbW4xMDMwMC9wcm9jIC0+IGluY2x1ZGUvYXNtLW1uMTAzMDAvcHJvYy0kKFBST0NFU1NPUiknCitpZm5lcSAoJChLQlVJTERfU1JDKSwpCisJJChRKW1rZGlyIC1wIGluY2x1ZGUvYXNtLW1uMTAzMDAKKwkkKFEpbG4gLWZzbiAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLW1uMTAzMDAvcHJvYy0kKFBST0NFU1NPUikgaW5jbHVkZS9hc20tbW4xMDMwMC9wcm9jCitlbHNlCisJJChRKWxuIC1mc24gcHJvYy0kKFBST0NFU1NPUikgaW5jbHVkZS9hc20tbW4xMDMwMC9wcm9jCitlbmRpZgorCUB0b3VjaCAkQAorCitDTEVBTl9GSUxFUyArPSBpbmNsdWRlL2FzbS1tbjEwMzAwL3Byb2MgaW5jbHVkZS9hc20tbW4xMDMwMC8ucHJvYworCitwcmVwYXJlOiBpbmNsdWRlL2FzbS1tbjEwMzAwLy5wcm9jCisKKyMgdW5pdCBzcGVjaWZpYyBkZWZpbml0aW9ucworaW5jbHVkZS9hc20tbW4xMDMwMC8udW5pdDogJCh3aWxkY2FyZCBpbmNsdWRlL2NvbmZpZy91bml0LyouaCkgaW5jbHVkZS9jb25maWcvYXV0by5jb25mCisJQGVjaG8gJyAgU1lNTElOSyBpbmNsdWRlL2FzbS1tbjEwMzAwL3VuaXQgLT4gaW5jbHVkZS9hc20tbW4xMDMwMC91bml0LSQoVU5JVCknCitpZm5lcSAoJChLQlVJTERfU1JDKSwpCisJJChRKW1rZGlyIC1wIGluY2x1ZGUvYXNtLW1uMTAzMDAKKwkkKFEpbG4gLWZzbiAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLW1uMTAzMDAvdW5pdC0kKFVOSVQpIGluY2x1ZGUvYXNtLW1uMTAzMDAvdW5pdAorZWxzZQorCSQoUSlsbiAtZnNuIHVuaXQtJChVTklUKSBpbmNsdWRlL2FzbS1tbjEwMzAwL3VuaXQKK2VuZGlmCisJQHRvdWNoICRACisKK0NMRUFOX0ZJTEVTICs9IGluY2x1ZGUvYXNtLW1uMTAzMDAvdW5pdCBpbmNsdWRlL2FzbS1tbjEwMzAwLy51bml0CisKK3ByZXBhcmU6IGluY2x1ZGUvYXNtLW1uMTAzMDAvLnVuaXQKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9ib290Ly5naXRpZ25vcmUgYi9hcmNoL21uMTAzMDAvYm9vdC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NzE4ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAvYm9vdC8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKK3pJbWFnZQpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2Jvb3QvTWFrZWZpbGUgYi9hcmNoL21uMTAzMDAvYm9vdC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmM5Y2FmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL2Jvb3QvTWFrZWZpbGUKQEAgLTAsMCArMSwyOCBAQAorIyBNTjEwMzAwIGtlcm5lbCBjb21wcmVzc29yIGFuZCB3cmFwcGVyCisjCisjIENvcHlyaWdodCAoQykgMjAwNyBNYXRzdXNoaXRhIEVsZWN0cmljIEluZHVzdHJpYWwgQ28uLCBMdGQuCisjIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyMgMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKwordGFyZ2V0cwkJOj0gdm1saW51eC5iaW4gekltYWdlCisKK3N1YmRpci0gCTo9IGNvbXByZXNzZWQKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCiskKG9iaikvekltYWdlOiAkKG9iaikvY29tcHJlc3NlZC92bWxpbnV4IEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsb2JqY29weSkKKwlAZWNobyAnS2VybmVsOiAkQCBpcyByZWFkeScKKworJChvYmopL3ZtbGludXguYmluOiAkKG9iaikvY29tcHJlc3NlZC92bWxpbnV4IEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsb2JqY29weSkKKworJChvYmopL2NvbXByZXNzZWQvdm1saW51eDogRk9SQ0UKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKG9iaikvY29tcHJlc3NlZCBJTUFHRV9PRkZTRVQ9JChJTUFHRV9PRkZTRVQpICRACmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlIGIvYXJjaC9tbjEwMzAwL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGE5NWUxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQpAQCAtMCwwICsxLDIyIEBACisjCisjIENyZWF0ZSBhIGNvbXByZXNzZWQgdm1saW51eCBpbWFnZSBmcm9tIHRoZSBvcmlnaW5hbCB2bWxpbnV4CisjCisKK3RhcmdldHMJCTo9IHZtbGludXggdm1saW51eC5iaW4gdm1saW51eC5iaW4uZ3ogaGVhZC5vIG1pc2MubyBwaWdneS5vCisKK0xERkxBR1Nfdm1saW51eCA6PSAtVHRleHQgJChDT05GSUdfS0VSTkVMX1pJTUFHRV9CQVNFX0FERFJFU1MpIC1lIHN0YXJ0dXBfMzIKKworJChvYmopL3ZtbGludXg6ICQob2JqKS9oZWFkLm8gJChvYmopL21pc2MubyAkKG9iaikvcGlnZ3kubyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGxkKQorCUA6CisKKyQob2JqKS92bWxpbnV4LmJpbjogdm1saW51eCBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLG9iamNvcHkpCisKKyQob2JqKS92bWxpbnV4LmJpbi5nejogJChvYmopL3ZtbGludXguYmluIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsZ3ppcCkKKworTERGTEFHU19waWdneS5vIDo9IC1yIC0tZm9ybWF0IGJpbmFyeSAtLW9mb3JtYXQgZWxmMzItYW0zM2xpbiAtVAorCiskKG9iaikvcGlnZ3kubzogJChvYmopL3ZtbGludXgubGRzICQob2JqKS92bWxpbnV4LmJpbi5neiBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGxkKQpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMgYi9hcmNoL21uMTAzMDAvYm9vdC9jb21wcmVzc2VkL2hlYWQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDJlMWViCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKQEAgLTAsMCArMSw4NiBAQAorLyogQm9vdCBlbnRyeSBwb2ludCBmb3IgYSBjb21wcmVzc2VkIE1OMTAzMDAga2VybmVsCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisJLnNlY3Rpb24JLnRleHQKKworI2RlZmluZSBERUJVRworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9jcHUtcmVncy5oPgorCisJLmdsb2JsIHN0YXJ0dXBfMzIKK3N0YXJ0dXBfMzI6CisJIyBmaXJzdCBzYXZlIG9mZiBwYXJhbWV0ZXJzIGZyb20gYm9vdGxvYWRlcgorCW1vdglwYXJhbV9zYXZlX2FyZWEsYTAKKwltb3YJZDAsKGEwKQorCW1vdglkMSwoNCxhMCkKKwltb3YJZDIsKDgsYTApCisKKwltb3YJc3AsYTMKKwltb3YJZGVjb21wX3N0YWNrKzB4MjAwMC00LGEwCisJbW92CWEwLHNwCisKKwkjIGludmFsaWRhdGUgYW5kIGVuYWJsZSBib3RoIG9mIHRoZSBjYWNoZXMKKwltb3YJQ0hDVFIsYTAKKwljbHIJZDAKKwltb3ZodQlkMCwoYTApCQkJCQkjIHR1cm4gb2ZmIGZpcnN0CisJbW92CUNIQ1RSX0lDSU5WfENIQ1RSX0RDSU5WLGQwCisJbW92aHUJZDAsKGEwKQorCXNldGxiCisJbW92CShhMCksZDAKKwlidHN0CUNIQ1RSX0lDQlVTWXxDSENUUl9EQ0JVU1ksZDAJCSMgd2FpdCB0aWxsIG5vdCBidXN5CisJbG5lCisJbW92CUNIQ1RSX0lDRU58Q0hDVFJfRENFTnxDSENUUl9EQ1dUTUQsZDAJIyB3cml0ZXRocnUgZGNhY2hlCisJbW92aHUJZDAsKGEwKQkJCQkJIyBlbmFibGUKKworCSMgY2xlYXIgdGhlIEJTUyBhcmVhCisJbW92CV9fYnNzX3N0YXJ0LGEwCisJbW92CV9lbmQsYTEKKwljbHIJZDAKK2Jzc2NsZWFyOgorCWNtcAlhMSxhMAorCWJnZQlic3NjbGVhcl9lbmQKKwltb3ZidQlkMCwoYTApCisJaW5jCWEwCisJYnJhCWJzc2NsZWFyCitic3NjbGVhcl9lbmQ6CisKKwkjIGRlY29tcHJlc3MgdGhlIGtlcm5lbAorCWNhbGwJZGVjb21wcmVzc19rZXJuZWxbXSwwCisKKwkjIGRpc2FibGUgY2FjaGVzIGFnYWluCisJbW92CUNIQ1RSLGEwCisJY2xyCWQwCisJbW92aHUJZDAsKGEwKQorCXNldGxiCisJbW92CShhMCksZDAKKwlidHN0CUNIQ1RSX0lDQlVTWXxDSENUUl9EQ0JVU1ksZDAJCSMgd2FpdCB0aWxsIG5vdCBidXN5CisJbG5lCisKKwltb3YJcGFyYW1fc2F2ZV9hcmVhLGEwCisJbW92CShhMCksZDAKKwltb3YJKDQsYTApLGQxCisJbW92CSg4LGEwKSxkMgorCisJbW92CWEzLHNwCisJbW92CUNPTkZJR19LRVJORUxfVEVYVF9BRERSRVNTLGEwCisJam1wCShhMCkKKworCS5kYXRhCisJLmFsaWduCQk0CitwYXJhbV9zYXZlX2FyZWE6CisJLnJlcHQgMworCS53b3JkCQkwCisJLmVuZHIKKworCS5zZWN0aW9uCS5ic3MKKwkuYWxpZ24JCTQKK2RlY29tcF9zdGFjazoKKwkuc3BhY2UJCTB4MjAwMApkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2Jvb3QvY29tcHJlc3NlZC9taXNjLmMgYi9hcmNoL21uMTAzMDAvYm9vdC9jb21wcmVzc2VkL21pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWQyMDdlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL2Jvb3QvY29tcHJlc3NlZC9taXNjLmMKQEAgLTAsMCArMSw0MjkgQEAKKy8qIE1OMTAzMDAgTWlzY2VsbGFuZW91cyBoZWxwZXIgcm91dGluZXMgZm9yIGtlcm5lbCBkZWNvbXByZXNzb3IKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWF0c3VzaGl0YSBFbGVjdHJpYyBJbmR1c3RyaWFsIENvLiwgTHRkLgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIE1vZGlmaWVkIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKiAtIERlcml2ZWQgZnJvbSBhcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvbWlzY18zMi5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8YXNtL3NlcmlhbC1yZWdzLmg+CisjaW5jbHVkZSAibWlzYy5oIgorCisjaWZuZGVmIENPTkZJR19HREJTVFVCX09OX1RUWVN4CisvKiBkaXNwbGF5ICdVbmNvbXByZXNzaW5nIExpbnV4Li4uICcgbWVzc2FnZXMgb24gdHR5UzAgb3IgdHR5UzEgKi8KKyNpZiAxCS8qIHR0eVMwICovCisjZGVmaW5lIENZR19ERVZfQkFTRQkweEE2RkIwMDAwCisjZWxzZSAgIC8qIHR0eVMxICovCisjZGVmaW5lIENZR19ERVZfQkFTRQkweEE2RkMwMDAwCisjZW5kaWYKKworI2RlZmluZSBDWUdfREVWX1RIUgkoKigodm9sYXRpbGUgX191OCopKENZR19ERVZfQkFTRSArIDB4MDApKSkKKyNkZWZpbmUgQ1lHX0RFVl9NQ1IJKCooKHZvbGF0aWxlIF9fdTgqKShDWUdfREVWX0JBU0UgKyAweDEwKSkpCisjZGVmaW5lIFNJT19NQ1JfRFRSCTB4MDEKKyNkZWZpbmUgU0lPX01DUl9SVFMJMHgwMgorI2RlZmluZSBDWUdfREVWX0xTUgkoKigodm9sYXRpbGUgX191OCopKENZR19ERVZfQkFTRSArIDB4MTQpKSkKKyNkZWZpbmUgU0lPX0xTUl9USFJFCTB4MjAJCS8qIHRyYW5zbWl0dGVyIGhvbGRpbmcgcmVnaXN0ZXIgZW1wdHkgKi8KKyNkZWZpbmUgU0lPX0xTUl9URU1UCTB4NDAJCS8qIHRyYW5zbWl0dGVyIHJlZ2lzdGVyIGVtcHR5ICovCisjZGVmaW5lIENZR19ERVZfTVNSCSgqKCh2b2xhdGlsZSBfX3U4KikoQ1lHX0RFVl9CQVNFICsgMHgxOCkpKQorI2RlZmluZSBTSU9fTVNSX0NUUwkweDEwCQkvKiBjbGVhciB0byBzZW5kICovCisjZGVmaW5lIFNJT19NU1JfRFNSCTB4MjAJCS8qIGRhdGEgc2V0IHJlYWR5ICovCisKKyNkZWZpbmUgTFNSX1dBSVRfRk9SKFNUQVRFKSBcCisJZG8geyB3aGlsZSAoIShDWUdfREVWX0xTUiAmIFNJT19MU1JfIyNTVEFURSkpIHt9IH0gd2hpbGUgKDApCisjZGVmaW5lIEZMT1dDVExfUVVFUlkoTElORSkgXAorCSh7IENZR19ERVZfTVNSICYgU0lPX01TUl8jI0xJTkU7IH0pCisjZGVmaW5lIEZMT1dDVExfV0FJVF9GT1IoTElORSkgXAorCWRvIHsgd2hpbGUgKCEoQ1lHX0RFVl9NU1IgJiBTSU9fTVNSXyMjTElORSkpIHt9IH0gd2hpbGUgKDApCisjZGVmaW5lIEZMT1dDVExfQ0xFQVIoTElORSkgXAorCWRvIHsgQ1lHX0RFVl9NQ1IgJj0gflNJT19NQ1JfIyNMSU5FOyB9IHdoaWxlICgwKQorI2RlZmluZSBGTE9XQ1RMX1NFVChMSU5FKSBcCisJZG8geyBDWUdfREVWX01DUiB8PSBTSU9fTUNSXyMjTElORTsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKgorICogZ3ppcCBkZWNsYXJhdGlvbnMKKyAqLworCisjZGVmaW5lIE9GKGFyZ3MpICBhcmdzCisjZGVmaW5lIFNUQVRJQyBzdGF0aWMKKworI3VuZGVmIG1lbXNldAorI3VuZGVmIG1lbWNweQorCitzdGF0aWMgaW5saW5lIHZvaWQgKm1lbXNldChjb25zdCB2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pCit7CisJaW50IGk7CisJY2hhciAqc3MgPSAoY2hhciAqKSBzOworCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJc3NbaV0gPSBjOworCXJldHVybiAodm9pZCAqKXM7Cit9CisKKyNkZWZpbmUgbWVtemVybyhzLCBuKSBtZW1zZXQoKHMpLCAwLCAobikpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqbWVtY3B5KHZvaWQgKl9fZGVzdCwgY29uc3Qgdm9pZCAqX19zcmMsIHNpemVfdCBfX24pCit7CisJaW50IGk7CisJY29uc3QgY2hhciAqcyA9IF9fc3JjOworCWNoYXIgKmQgPSBfX2Rlc3Q7CisKKwlmb3IgKGkgPSAwOyBpIDwgX19uOyBpKyspCisJCWRbaV0gPSBzW2ldOworCXJldHVybiBfX2Rlc3Q7Cit9CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgdWNoOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1c2g7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIHVsZzsKKworI2RlZmluZSBXU0laRSAweDgwMDAJLyogV2luZG93IHNpemUgbXVzdCBiZSBhdCBsZWFzdCAzMmssIGFuZCBhIHBvd2VyIG9mCisJCQkgKiB0d28gKi8KKworc3RhdGljIHVjaCAqaW5idWY7CS8qIGlucHV0IGJ1ZmZlciAqLworc3RhdGljIHVjaCB3aW5kb3dbV1NJWkVdOyAvKiBzbGlkaW5nIHdpbmRvdyBidWZmZXIgKi8KKworc3RhdGljIHVuc2lnbmVkIGluc2l6ZTsJLyogdmFsaWQgYnl0ZXMgaW4gaW5idWYgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnB0cjsJLyogaW5kZXggb2YgbmV4dCBieXRlIHRvIGJlIHByb2Nlc3NlZCBpbiBpbmJ1ZiAqLworc3RhdGljIHVuc2lnbmVkIG91dGNudDsJLyogYnl0ZXMgaW4gb3V0cHV0IGJ1ZmZlciAqLworCisvKiBnemlwIGZsYWcgYnl0ZSAqLworI2RlZmluZSBBU0NJSV9GTEFHICAgMHgwMSAvKiBiaXQgMCBzZXQ6IGZpbGUgcHJvYmFibHkgQVNDSUkgdGV4dCAqLworI2RlZmluZSBDT05USU5VQVRJT04gMHgwMiAvKiBiaXQgMSBzZXQ6IGNvbnRpbnVhdGlvbiBvZiBtdWx0aS1wYXJ0IGd6aXAgZmlsZSAqLworI2RlZmluZSBFWFRSQV9GSUVMRCAgMHgwNCAvKiBiaXQgMiBzZXQ6IGV4dHJhIGZpZWxkIHByZXNlbnQgKi8KKyNkZWZpbmUgT1JJR19OQU1FICAgIDB4MDggLyogYml0IDMgc2V0OiBvcmlnaW5hbCBmaWxlIG5hbWUgcHJlc2VudCAqLworI2RlZmluZSBDT01NRU5UICAgICAgMHgxMCAvKiBiaXQgNCBzZXQ6IGZpbGUgY29tbWVudCBwcmVzZW50ICovCisjZGVmaW5lIEVOQ1JZUFRFRCAgICAweDIwIC8qIGJpdCA1IHNldDogZmlsZSBpcyBlbmNyeXB0ZWQgKi8KKyNkZWZpbmUgUkVTRVJWRUQgICAgIDB4QzAgLyogYml0IDYsNzogICByZXNlcnZlZCAqLworCisvKiBEaWFnbm9zdGljIGZ1bmN0aW9ucyAqLworI2lmZGVmIERFQlVHCisjICBkZWZpbmUgQXNzZXJ0KGNvbmQsIG1zZykgeyBpZiAoIShjb25kKSkgZXJyb3IobXNnKTsgfQorIyAgZGVmaW5lIFRyYWNlKHgpCWZwcmludGYgeAorIyAgZGVmaW5lIFRyYWNldih4KQl7IGlmICh2ZXJib3NlKSBmcHJpbnRmIHggOyB9CisjICBkZWZpbmUgVHJhY2V2dih4KQl7IGlmICh2ZXJib3NlID4gMSkgZnByaW50ZiB4IDsgfQorIyAgZGVmaW5lIFRyYWNlYyhjLCB4KQl7IGlmICh2ZXJib3NlICYmIChjKSkgZnByaW50ZiB4IDsgfQorIyAgZGVmaW5lIFRyYWNlY3YoYywgeCkJeyBpZiAodmVyYm9zZSA+IDEgJiYgKGMpKSBmcHJpbnRmIHggOyB9CisjZWxzZQorIyAgZGVmaW5lIEFzc2VydChjb25kLCBtc2cpCisjICBkZWZpbmUgVHJhY2UoeCkKKyMgIGRlZmluZSBUcmFjZXYoeCkKKyMgIGRlZmluZSBUcmFjZXZ2KHgpCisjICBkZWZpbmUgVHJhY2VjKGMsIHgpCisjICBkZWZpbmUgVHJhY2VjdihjLCB4KQorI2VuZGlmCisKK3N0YXRpYyBpbnQgIGZpbGxfaW5idWYodm9pZCk7CitzdGF0aWMgdm9pZCBmbHVzaF93aW5kb3codm9pZCk7CitzdGF0aWMgdm9pZCBlcnJvcihjb25zdCBjaGFyICopIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CitzdGF0aWMgdm9pZCBrcHV0cyhjb25zdCBjaGFyICopOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgZ2V0X2J5dGUodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGNoID0gaW5wdHIgPCBpbnNpemUgPyBpbmJ1ZltpbnB0cisrXSA6IGZpbGxfaW5idWYoKTsKKworI2lmIDAKKwljaGFyIGhleFszXTsKKwloZXhbMF0gPSAoKGNoICYgMHgwZikgPiA5KSA/CisJCSgoY2ggJiAweDBmKSArICdBJyAtIDB4YSkgOiAoKGNoICYgMHgwZikgKyAnMCcpOworCWhleFsxXSA9ICgoY2ggPj4gNCkgPiA5KSA/CisJCSgoY2ggPj4gNCkgKyAnQScgLSAweGEpIDogKChjaCA+PiA0KSArICcwJyk7CisJaGV4WzJdID0gMDsKKwlrcHV0cyhoZXgpOworI2VuZGlmCisJcmV0dXJuIGNoOworfQorCisvKgorICogVGhpcyBpcyBzZXQgdXAgYnkgdGhlIHNldHVwLXJvdXRpbmUgYXQgYm9vdC10aW1lCisgKi8KKyNkZWZpbmUgRVhUX01FTV9LICgqKHVuc2lnbmVkIHNob3J0ICopMHg5MDAwMikKKyNpZm5kZWYgU1RBTkRBUkRfTUVNT1JZX0JJT1NfQ0FMTAorI2RlZmluZSBBTFRfTUVNX0sgKCoodW5zaWduZWQgbG9uZyAqKSAweDkwMWUwKQorI2VuZGlmCisjZGVmaW5lIFNDUkVFTl9JTkZPICgqKHN0cnVjdCBzY3JlZW5faW5mbyAqKTB4OTAwMDApCisKK3N0YXRpYyBsb25nIGJ5dGVzX291dDsKK3N0YXRpYyB1Y2ggKm91dHB1dF9kYXRhOworc3RhdGljIHVuc2lnbmVkIGxvbmcgb3V0cHV0X3B0cjsKKworCitzdGF0aWMgdm9pZCAqbWFsbG9jKGludCBzaXplKTsKKworc3RhdGljIGlubGluZSB2b2lkIGZyZWUodm9pZCAqd2hlcmUpCit7CS8qIERvbid0IGNhcmUgKi8KK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZnJlZV9tZW1fcHRyID0gKHVuc2lnbmVkIGxvbmcpICZlbmQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBmcmVlX21lbV9lbmRfcHRyID0gKHVuc2lnbmVkIGxvbmcpICZlbmQgKyAweDkwMDAwOworCitzdGF0aWMgaW5saW5lIHZvaWQgZ3ppcF9tYXJrKHZvaWQgKipwdHIpCit7CisJa3B1dHMoIi4iKTsKKwkqcHRyID0gKHZvaWQgKikgZnJlZV9tZW1fcHRyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ3ppcF9yZWxlYXNlKHZvaWQgKipwdHIpCit7CisJZnJlZV9tZW1fcHRyID0gKHVuc2lnbmVkIGxvbmcpICpwdHI7Cit9CisKKyNkZWZpbmUgSU5QTEFDRV9NT1ZFX1JPVVRJTkUJMHgxMDAwCisjZGVmaW5lIExPV19CVUZGRVJfU1RBUlQJMHgyMDAwCisjZGVmaW5lIExPV19CVUZGRVJfRU5ECQkweDkwMDAwCisjZGVmaW5lIExPV19CVUZGRVJfU0laRQkJKExPV19CVUZGRVJfRU5EIC0gTE9XX0JVRkZFUl9TVEFSVCkKKyNkZWZpbmUgSEVBUF9TSVpFCQkweDMwMDAKK3N0YXRpYyBpbnQgaGlnaF9sb2FkZWQ7CitzdGF0aWMgdWNoICpoaWdoX2J1ZmZlcl9zdGFydCAvKiA9ICh1Y2ggKikoKCh1bGcpJmVuZCkgKyBIRUFQX1NJWkUpKi87CisKK3N0YXRpYyBjaGFyICp2aWRtZW0gPSAoY2hhciAqKTB4YjgwMDA7CitzdGF0aWMgaW50IGxpbmVzLCBjb2xzOworCisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vbGliL2luZmxhdGUuYyIKKworc3RhdGljIHZvaWQgKm1hbGxvYyhpbnQgc2l6ZSkKK3sKKwl2b2lkICpwOworCisJaWYgKHNpemUgPCAwKQorCQllcnJvcigiTWFsbG9jIGVycm9yXG4iKTsKKwlpZiAoIWZyZWVfbWVtX3B0cikKKwkJZXJyb3IoIk1lbW9yeSBlcnJvclxuIik7CisKKwlmcmVlX21lbV9wdHIgPSAoZnJlZV9tZW1fcHRyICsgMykgJiB+MzsJLyogQWxpZ24gKi8KKworCXAgPSAodm9pZCAqKSBmcmVlX21lbV9wdHI7CisJZnJlZV9tZW1fcHRyICs9IHNpemU7CisKKwlpZiAoZnJlZV9tZW1fcHRyID49IGZyZWVfbWVtX2VuZF9wdHIpCisJCWVycm9yKCJcbk91dCBvZiBtZW1vcnlcbiIpOworCisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzY3JvbGwodm9pZCkKK3sKKwlpbnQgaTsKKworCW1lbWNweSh2aWRtZW0sIHZpZG1lbSArIGNvbHMgKiAyLCAobGluZXMgLSAxKSAqIGNvbHMgKiAyKTsKKwlmb3IgKGkgPSAobGluZXMgLSAxKSAqIGNvbHMgKiAyOyBpIDwgbGluZXMgKiBjb2xzICogMjsgaSArPSAyKQorCQl2aWRtZW1baV0gPSAnICc7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBrcHV0Y2hhcih1bnNpZ25lZCBjaGFyIGNoKQoreworI2lmZGVmIENPTkZJR19NTjEwMzAwX1VOSVRfQVNCMjMwNQorCXdoaWxlIChTQzBTVFIgJiBTQzAxU1RSX1RCRikKKwkJY29udGludWU7CisKKwlpZiAoY2ggPT0gMHgwYSkgeworCQlTQzBUWEIgPSAweDBkOworCQl3aGlsZSAoU0MwU1RSICYgU0MwMVNUUl9UQkYpCisJCQljb250aW51ZTsKKwl9CisKKwlTQzBUWEIgPSBjaDsKKworI2Vsc2UKKwl3aGlsZSAoU0MxU1RSICYgU0MwMVNUUl9UQkYpCisJCWNvbnRpbnVlOworCisJaWYgKGNoID09IDB4MGEpIHsKKwkJU0MxVFhCID0gMHgwZDsKKwkJd2hpbGUgKFNDMVNUUiAmIFNDMDFTVFJfVEJGKQorCQkJY29udGludWU7CisJfQorCisJU0MxVFhCID0gY2g7CisKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBrcHV0cyhjb25zdCBjaGFyICpzKQoreworI2lmZGVmIENPTkZJR19ERUJVR19ERUNPTVBSRVNTX0tFUk5FTAorI2lmbmRlZiBDT05GSUdfR0RCU1RVQl9PTl9UVFlTeAorCWNoYXIgY2g7CisKKwlGTE9XQ1RMX1NFVChEVFIpOworCisJd2hpbGUgKCpzKSB7CisJCUxTUl9XQUlUX0ZPUihUSFJFKTsKKworCQljaCA9ICpzKys7CisJCWlmIChjaCA9PSAweDBhKSB7CisJCQlDWUdfREVWX1RIUiA9IDB4MGQ7CisJCQlMU1JfV0FJVF9GT1IoVEhSRSk7CisJCX0KKwkJQ1lHX0RFVl9USFIgPSBjaDsKKwl9CisKKwlGTE9XQ1RMX0NMRUFSKERUUik7CisjZWxzZQorCisJZm9yICg7ICpzOyBzKyspCisJCWtwdXRjaGFyKCpzKTsKKworI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX0RFQlVHX0RFQ09NUFJFU1NfS0VSTkVMICovCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRmlsbCB0aGUgaW5wdXQgYnVmZmVyLiBUaGlzIGlzIGNhbGxlZCBvbmx5IHdoZW4gdGhlIGJ1ZmZlciBpcyBlbXB0eQorICogYW5kIGF0IGxlYXN0IG9uZSBieXRlIGlzIHJlYWxseSBuZWVkZWQuCisgKi8KK3N0YXRpYyBpbnQgZmlsbF9pbmJ1ZigpCit7CisJaWYgKGluc2l6ZSAhPSAwKQorCQllcnJvcigicmFuIG91dCBvZiBpbnB1dCBkYXRhXG4iKTsKKworCWluYnVmID0gaW5wdXRfZGF0YTsKKwlpbnNpemUgPSBpbnB1dF9sZW47CisJaW5wdHIgPSAxOworCXJldHVybiBpbmJ1ZlswXTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBXcml0ZSB0aGUgb3V0cHV0IHdpbmRvdyB3aW5kb3dbMC4ub3V0Y250LTFdIGFuZCB1cGRhdGUgY3JjIGFuZCBieXRlc19vdXQuCisgKiAoVXNlZCBmb3IgdGhlIGRlY29tcHJlc3NlZCBkYXRhIG9ubHkuKQorICovCitzdGF0aWMgdm9pZCBmbHVzaF93aW5kb3dfbG93KHZvaWQpCit7CisgICAgdWxnIGMgPSBjcmM7ICAgICAgICAgLyogdGVtcG9yYXJ5IHZhcmlhYmxlICovCisgICAgdW5zaWduZWQgbjsKKyAgICB1Y2ggKmluLCAqb3V0LCBjaDsKKworICAgIGluID0gd2luZG93OworICAgIG91dCA9ICZvdXRwdXRfZGF0YVtvdXRwdXRfcHRyXTsKKyAgICBmb3IgKG4gPSAwOyBuIDwgb3V0Y250OyBuKyspIHsKKwkgICAgY2ggPSAqb3V0KysgPSAqaW4rKzsKKwkgICAgYyA9IGNyY18zMl90YWJbKChpbnQpYyBeIGNoKSAmIDB4ZmZdIF4gKGMgPj4gOCk7CisgICAgfQorICAgIGNyYyA9IGM7CisgICAgYnl0ZXNfb3V0ICs9ICh1bGcpb3V0Y250OworICAgIG91dHB1dF9wdHIgKz0gKHVsZylvdXRjbnQ7CisgICAgb3V0Y250ID0gMDsKK30KKworc3RhdGljIHZvaWQgZmx1c2hfd2luZG93X2hpZ2godm9pZCkKK3sKKyAgICB1bGcgYyA9IGNyYzsgICAgICAgICAvKiB0ZW1wb3JhcnkgdmFyaWFibGUgKi8KKyAgICB1bnNpZ25lZCBuOworICAgIHVjaCAqaW4sICBjaDsKKyAgICBpbiA9IHdpbmRvdzsKKyAgICBmb3IgKG4gPSAwOyBuIDwgb3V0Y250OyBuKyspIHsKKwljaCA9ICpvdXRwdXRfZGF0YSsrID0gKmluKys7CisJaWYgKCh1bGcpIG91dHB1dF9kYXRhID09IExPV19CVUZGRVJfRU5EKQorCQlvdXRwdXRfZGF0YSA9IGhpZ2hfYnVmZmVyX3N0YXJ0OworCWMgPSBjcmNfMzJfdGFiWygoaW50KWMgXiBjaCkgJiAweGZmXSBeIChjID4+IDgpOworICAgIH0KKyAgICBjcmMgPSBjOworICAgIGJ5dGVzX291dCArPSAodWxnKW91dGNudDsKKyAgICBvdXRjbnQgPSAwOworfQorCitzdGF0aWMgdm9pZCBmbHVzaF93aW5kb3codm9pZCkKK3sKKwlpZiAoaGlnaF9sb2FkZWQpCisJCWZsdXNoX3dpbmRvd19oaWdoKCk7CisJZWxzZQorCQlmbHVzaF93aW5kb3dfbG93KCk7Cit9CisKK3N0YXRpYyB2b2lkIGVycm9yKGNvbnN0IGNoYXIgKngpCit7CisJa3B1dHMoIlxuXG4iKTsKKwlrcHV0cyh4KTsKKwlrcHV0cygiXG5cbiAtLSBTeXN0ZW0gaGFsdGVkIik7CisKKwl3aGlsZSAoMSkKKwkJLyogSGFsdCAqLzsKK30KKworI2RlZmluZSBTVEFDS19TSVpFICg0MDk2KQorCitsb25nIHVzZXJfc3RhY2tbU1RBQ0tfU0laRV07CisKK3N0cnVjdCB7CisJbG9uZyAqYTsKKwlzaG9ydCBiOworfSBzdGFja19zdGFydCA9IHsgJnVzZXJfc3RhY2tbU1RBQ0tfU0laRV0sIDAgfTsKKwordm9pZCBzZXR1cF9ub3JtYWxfb3V0cHV0X2J1ZmZlcih2b2lkKQoreworI2lmZGVmIFNUQU5EQVJEX01FTU9SWV9CSU9TX0NBTEwKKwlpZiAoRVhUX01FTV9LIDwgMTAyNCkKKwkJZXJyb3IoIkxlc3MgdGhhbiAyTUIgb2YgbWVtb3J5LlxuIik7CisjZWxzZQorCWlmICgoQUxUX01FTV9LID4gRVhUX01FTV9LID8gQUxUX01FTV9LIDogRVhUX01FTV9LKSA8IDEwMjQpCisJCWVycm9yKCJMZXNzIHRoYW4gMk1CIG9mIG1lbW9yeS5cbiIpOworI2VuZGlmCisJb3V0cHV0X2RhdGEgPSAoY2hhciAqKSAweDEwMDAwMDsgLyogUG9pbnRzIHRvIDFNICovCit9CisKK3N0cnVjdCBtb3ZlcGFyYW1zIHsKKwl1Y2ggKmxvd19idWZmZXJfc3RhcnQ7CisJaW50IGxjb3VudDsKKwl1Y2ggKmhpZ2hfYnVmZmVyX3N0YXJ0OworCWludCBoY291bnQ7Cit9OworCit2b2lkIHNldHVwX291dHB1dF9idWZmZXJfaWZfd2VfcnVuX2hpZ2goc3RydWN0IG1vdmVwYXJhbXMgKm12KQoreworCWhpZ2hfYnVmZmVyX3N0YXJ0ID0gKHVjaCAqKSgoKHVsZykgJmVuZCkgKyBIRUFQX1NJWkUpOworI2lmZGVmIFNUQU5EQVJEX01FTU9SWV9CSU9TX0NBTEwKKwlpZiAoRVhUX01FTV9LIDwgKDMgKiAxMDI0KSkKKwkJZXJyb3IoIkxlc3MgdGhhbiA0TUIgb2YgbWVtb3J5LlxuIik7CisjZWxzZQorCWlmICgoQUxUX01FTV9LID4gRVhUX01FTV9LID8gQUxUX01FTV9LIDogRVhUX01FTV9LKSA8ICgzICogMTAyNCkpCisJCWVycm9yKCJMZXNzIHRoYW4gNE1CIG9mIG1lbW9yeS5cbiIpOworI2VuZGlmCisJbXYtPmxvd19idWZmZXJfc3RhcnQgPSBvdXRwdXRfZGF0YSA9IChjaGFyICopIExPV19CVUZGRVJfU1RBUlQ7CisJaGlnaF9sb2FkZWQgPSAxOworCWZyZWVfbWVtX2VuZF9wdHIgPSAobG9uZykgaGlnaF9idWZmZXJfc3RhcnQ7CisJaWYgKDB4MTAwMDAwICsgTE9XX0JVRkZFUl9TSVpFID4gKHVsZykgaGlnaF9idWZmZXJfc3RhcnQpIHsKKwkJaGlnaF9idWZmZXJfc3RhcnQgPSAodWNoICopKDB4MTAwMDAwICsgTE9XX0JVRkZFUl9TSVpFKTsKKwkJbXYtPmhjb3VudCA9IDA7IC8qIHNheTogd2UgbmVlZCBub3QgdG8gbW92ZSBoaWdoX2J1ZmZlciAqLworCX0gZWxzZSB7CisJCW12LT5oY291bnQgPSAtMTsKKwl9CisJbXYtPmhpZ2hfYnVmZmVyX3N0YXJ0ID0gaGlnaF9idWZmZXJfc3RhcnQ7Cit9CisKK3ZvaWQgY2xvc2Vfb3V0cHV0X2J1ZmZlcl9pZl93ZV9ydW5faGlnaChzdHJ1Y3QgbW92ZXBhcmFtcyAqbXYpCit7CisJbXYtPmxjb3VudCA9IGJ5dGVzX291dDsKKwlpZiAoYnl0ZXNfb3V0ID4gTE9XX0JVRkZFUl9TSVpFKSB7CisJCW12LT5sY291bnQgPSBMT1dfQlVGRkVSX1NJWkU7CisJCWlmIChtdi0+aGNvdW50KQorCQkJbXYtPmhjb3VudCA9IGJ5dGVzX291dCAtIExPV19CVUZGRVJfU0laRTsKKwl9IGVsc2UgeworCQltdi0+aGNvdW50ID0gMDsKKwl9Cit9CisKKyN1bmRlZiBERUJVR0ZMQUcKKyNpZmRlZiBERUJVR0ZMQUcKK2ludCBkZWJ1Z2ZsYWc7CisjZW5kaWYKKworaW50IGRlY29tcHJlc3Nfa2VybmVsKHN0cnVjdCBtb3ZlcGFyYW1zICptdikKK3sKKyNpZmRlZiBERUJVR0ZMQUcKKwl3aGlsZSAoIWRlYnVnZmxhZykKKwkJYmFycmllcigpOworI2VuZGlmCisKKwlvdXRwdXRfZGF0YSA9IChjaGFyICopIENPTkZJR19LRVJORUxfVEVYVF9BRERSRVNTOworCisJbWFrZWNyYygpOworCWtwdXRzKCJVbmNvbXByZXNzaW5nIExpbnV4Li4uICIpOworCWd1bnppcCgpOworCWtwdXRzKCJPaywgYm9vdGluZyB0aGUga2VybmVsLlxuIik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvYm9vdC9jb21wcmVzc2VkL21pc2MuaCBiL2FyY2gvbW4xMDMwMC9ib290L2NvbXByZXNzZWQvbWlzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOTIxY2QKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAvYm9vdC9jb21wcmVzc2VkL21pc2MuaApAQCAtMCwwICsxLDE4IEBACisvKiBJbnRlcm5hbCBkZWZpbml0aW9ucyBmb3IgdGhlIE1OMTAzMDAga2VybmVsIGRlY29tcHJlc3NvcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCitleHRlcm4gaW50IGVuZDsKKworLyoKKyAqIHZtbGludXgubGRzCisgKi8KK2V4dGVybiBjaGFyIGlucHV0X2RhdGFbXTsKK2V4dGVybiBpbnQgaW5wdXRfbGVuOwpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4LmxkcyBiL2FyY2gvbW4xMDMwMC9ib290L2NvbXByZXNzZWQvdm1saW51eC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA4NDkwMzYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAvYm9vdC9jb21wcmVzc2VkL3ZtbGludXgubGRzCkBAIC0wLDAgKzEsOSBAQAorU0VDVElPTlMKK3sKKyAgLmRhdGEgOiB7CisJaW5wdXRfbGVuID0gLjsKKwlMT05HKGlucHV0X2RhdGFfZW5kIC0gaW5wdXRfZGF0YSkgaW5wdXRfZGF0YSA9IC47CisJKiguZGF0YSkKKwlpbnB1dF9kYXRhX2VuZCA9IC47CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2Jvb3QvaW5zdGFsbC5zaCBiL2FyY2gvbW4xMDMwMC9ib290L2luc3RhbGwuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcyOTUxYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9ib290L2luc3RhbGwuc2gKQEAgLTAsMCArMSw2NyBAQAorIyEvYmluL3NoCisjCisjIGFyY2gvbW4xMDMwMC9ib290L2luc3RhbGwgLWMuc2gKKyMKKyMgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5jZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorIyBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBDb3B5cmlnaHQgKEMpIDE5OTUgYnkgTGludXMgVG9ydmFsZHMKKyMKKyMgQWRhcHRlZCBmcm9tIGNvZGUgaW4gYXJjaC9pMzg2L2Jvb3QvTWFrZWZpbGUgYnkgSC4gUGV0ZXIgQW52aW4KKyMKKyMgIm1ha2UgaW5zdGFsbCAtYyIgc2NyaXB0IGZvciBpMzg2IGFyY2hpdGVjdHVyZQorIworIyBBcmd1bWVudHM6CisjICAgJDEgLSBrZXJuZWwgdmVyc2lvbgorIyAgICQyIC0ga2VybmVsIGltYWdlIGZpbGUKKyMgICAkMyAtIGtlcm5lbCBtYXAgZmlsZQorIyAgICQ0IC0gZGVmYXVsdCBpbnN0YWxsIC1jIHBhdGggKGJsYW5rIGlmIHJvb3QgZGlyZWN0b3J5KQorIyAgICQ1IC0gYm9vdCByb20gZmlsZQorIworCisjIFVzZXIgbWF5IGhhdmUgYSBjdXN0b20gaW5zdGFsbCAtYyBzY3JpcHQKKworcm0gLWZyICQ0Ly4uL3Vzci9pbmNsdWRlL2xpbnV4ICQ0Ly4uL3Vzci9pbmNsdWRlL2FzbQoraW5zdGFsbCAtYyAtbSAwNzU1ICQyICQ0L3ZtbGludXoKK2luc3RhbGwgLWMgLW0gMDc1NSAkNSAkNC9ib290LnJvbQoraW5zdGFsbCAtYyAtbSAwNzU1IC1kICQ0Ly4uL3Vzci9pbmNsdWRlL2xpbnV4CitjZCAkVE9QRElSL2luY2x1ZGUvbGludXgKK2ZvciBpIGluIGBmaW5kIC4gLW1heGRlcHRoIDEgLW5hbWUgJyouaCcgLXByaW50YDsgZG8KKyAgaW5zdGFsbCAtYyAtbSAwNjQ0ICRpICQ0Ly4uL3Vzci9pbmNsdWRlL2xpbnV4Citkb25lCitpbnN0YWxsIC1jIC1tIDA3NTUgLWQgJDQvLi4vdXNyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyCitjZCAkVE9QRElSL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyCitmb3IgaSBpbiBgZmluZCAuIC1uYW1lICcqLmgnIC1wcmludGA7IGRvCisgIGluc3RhbGwgLWMgLW0gMDY0NCAkaSAkNC8uLi91c3IvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIKK2RvbmUKK2luc3RhbGwgLWMgLW0gMDc1NSAtZCAkNC8uLi91c3IvaW5jbHVkZS9saW51eC9sb2NrZAorY2QgJFRPUERJUi9pbmNsdWRlL2xpbnV4L2xvY2tkCitmb3IgaSBpbiBgZmluZCAuIC1uYW1lICcqLmgnIC1wcmludGA7IGRvCisgIGluc3RhbGwgLWMgLW0gMDY0NCAkaSAkNC8uLi91c3IvaW5jbHVkZS9saW51eC9sb2NrZAorZG9uZQoraW5zdGFsbCAtYyAtbSAwNzU1IC1kICQ0Ly4uL3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0CitjZCAkVE9QRElSL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQKK2ZvciBpIGluIGBmaW5kIC4gLW5hbWUgJyouaCcgLXByaW50YDsgZG8KKyAgaW5zdGFsbCAtYyAtbSAwNjQ0ICRpICQ0Ly4uL3Vzci9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0Citkb25lCitpbnN0YWxsIC1jIC1tIDA3NTUgLWQgJDQvLi4vdXNyL2luY2x1ZGUvbGludXgvbmZzZAorY2QgJFRPUERJUi9pbmNsdWRlL2xpbnV4L25mc2QKK2ZvciBpIGluIGBmaW5kIC4gLW5hbWUgJyouaCcgLXByaW50YDsgZG8KKyAgaW5zdGFsbCAtYyAtbSAwNjQ0ICRpICQ0Ly4uL3Vzci9pbmNsdWRlL2xpbnV4L25mc2QvJGkKK2RvbmUKK2luc3RhbGwgLWMgLW0gMDc1NSAtZCAkNC8uLi91c3IvaW5jbHVkZS9saW51eC9yYWlkCitjZCAkVE9QRElSL2luY2x1ZGUvbGludXgvcmFpZAorZm9yIGkgaW4gYGZpbmQgLiAtbmFtZSAnKi5oJyAtcHJpbnRgOyBkbworICBpbnN0YWxsIC1jIC1tIDA2NDQgJGkgJDQvLi4vdXNyL2luY2x1ZGUvbGludXgvcmFpZAorZG9uZQoraW5zdGFsbCAtYyAtbSAwNzU1IC1kICQ0Ly4uL3Vzci9pbmNsdWRlL2xpbnV4L3N1bnJwYworY2QgJFRPUERJUi9pbmNsdWRlL2xpbnV4L3N1bnJwYworZm9yIGkgaW4gYGZpbmQgLiAtbmFtZSAnKi5oJyAtcHJpbnRgOyBkbworICBpbnN0YWxsIC1jIC1tIDA2NDQgJGkgJDQvLi4vdXNyL2luY2x1ZGUvbGludXgvc3VucnBjCitkb25lCitpbnN0YWxsIC1jIC1tIDA3NTUgLWQgJDQvLi4vdXNyL2luY2x1ZGUvYXNtCitjZCAkVE9QRElSL2luY2x1ZGUvYXNtCitmb3IgaSBpbiBgZmluZCAuIC1uYW1lICcqLmgnIC1wcmludGA7IGRvCisgIGluc3RhbGwgLWMgLW0gMDY0NCAkaSAkNC8uLi91c3IvaW5jbHVkZS9hc20KK2RvbmUKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9ib290L3Rvb2xzL2J1aWxkLmMgYi9hcmNoL21uMTAzMDAvYm9vdC90b29scy9idWlsZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNTUyZWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAvYm9vdC90b29scy9idWlsZC5jCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTcgTWFydGluIE1hcmVzCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBidWlsZHMgYSBkaXNrLWltYWdlIGZyb20gdGhyZWUgZGlmZmVyZW50IGZpbGVzOgorICoKKyAqIC0gYm9vdHNlY3Q6IGV4YWN0bHkgNTEyIGJ5dGVzIG9mIDgwODYgbWFjaGluZSBjb2RlLCBsb2FkcyB0aGUgcmVzdAorICogLSBzZXR1cDogODA4NiBtYWNoaW5lIGNvZGUsIHNldHMgdXAgc3lzdGVtIHBhcm0KKyAqIC0gc3lzdGVtOiA4MDM4NiBjb2RlIGZvciBhY3R1YWwgc3lzdGVtCisgKgorICogSXQgZG9lcyBzb21lIGNoZWNraW5nIHRoYXQgYWxsIGZpbGVzIGFyZSBvZiB0aGUgY29ycmVjdCB0eXBlLCBhbmQKKyAqIGp1c3Qgd3JpdGVzIHRoZSByZXN1bHQgdG8gc3Rkb3V0LCByZW1vdmluZyBoZWFkZXJzIGFuZCBwYWRkaW5nIHRvCisgKiB0aGUgcmlnaHQgYW1vdW50LiBJdCBhbHNvIHdyaXRlcyBzb21lIHN5c3RlbSBkYXRhIHRvIHN0ZGVyci4KKyAqLworCisvKgorICogQ2hhbmdlcyBieSB0eXRzbyB0byBhbGxvdyByb290IGRldmljZSBzcGVjaWZpY2F0aW9uCisgKiBIaWdoIGxvYWRlZCBzdHVmZiBieSBIYW5zIExlcm1lbiAmIFdlcm5lciBBbG1lc2JlcmdlciwgRmViLiAxOTk2CisgKiBDcm9zcyBjb21waWxpbmcgZml4ZXMgYnkgR2VydGphbiB2YW4gV2luZ2VyZGUsIEp1bHkgMTk5NgorICogUmV3cml0dGVuIGJ5IE1hcnRpbiBNYXJlcywgQXByaWwgMTk5NworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8YXNtL2Jvb3QuaD4KKworI2RlZmluZSBERUZBVUxUX01BSk9SX1JPT1QgMAorI2RlZmluZSBERUZBVUxUX01JTk9SX1JPT1QgMAorCisvKiBNaW5pbWFsIG51bWJlciBvZiBzZXR1cCBzZWN0b3JzIChzZWUgYWxzbyBib290c2VjdC5TKSAqLworI2RlZmluZSBTRVRVUF9TRUNUUyA0CisKK3VpbnQ4X3QgYnVmWzEwMjRdOworaW50IGZkOworaW50IGlzX2JpZ19rZXJuZWw7CisKK19fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkKK3ZvaWQgZGllKGNvbnN0IGNoYXIgKnN0ciwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwl2YV9zdGFydChhcmdzLCBzdHIpOworCXZmcHJpbnRmKHN0ZGVyciwgc3RyLCBhcmdzKTsKKwlmcHV0YygnXG4nLCBzdGRlcnIpOworCWV4aXQoMSk7Cit9CisKK3ZvaWQgZmlsZV9vcGVuKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJZmQgPSBvcGVuKG5hbWUsIE9fUkRPTkxZLCAwKTsKKwlpZiAoZmQgPCAwKQorCQlkaWUoIlVuYWJsZSB0byBvcGVuIGAlcyc6ICVtIiwgbmFtZSk7Cit9CisKK19fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkKK3ZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlkaWUoIlVzYWdlOiBidWlsZCBbLWJdIGJvb3RzZWN0IHNldHVwIHN5c3RlbSBbcm9vdGRldl0gWz4gaW1hZ2VdIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBpbnQgaSwgYywgc3osIHNldHVwX3NlY3RvcnM7CisJdWludDMyX3Qgc3lzX3NpemU7CisJdWludDhfdCBtYWpvcl9yb290LCBtaW5vcl9yb290OworCXN0cnVjdCBzdGF0IHNiOworCisJaWYgKGFyZ2MgPiAyICYmICFzdHJjbXAoYXJndlsxXSwgIi1iIikpIHsKKwkJaXNfYmlnX2tlcm5lbCA9IDE7CisJCWFyZ2MtLSwgYXJndisrOworCX0KKwlpZiAoKGFyZ2MgPCA0KSB8fCAoYXJnYyA+IDUpKQorCQl1c2FnZSgpOworCWlmIChhcmdjID4gNCkgeworCQlpZiAoIXN0cmNtcChhcmd2WzRdLCAiQ1VSUkVOVCIpKSB7CisJCQlpZiAoc3RhdCgiLyIsICZzYikpIHsKKwkJCQlwZXJyb3IoIi8iKTsKKwkJCQlkaWUoIkNvdWxkbid0IHN0YXQgLyIpOworCQkJfQorCQkJbWFqb3Jfcm9vdCA9IG1ham9yKHNiLnN0X2Rldik7CisJCQltaW5vcl9yb290ID0gbWlub3Ioc2Iuc3RfZGV2KTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYXJndls0XSwgIkZMT1BQWSIpKSB7CisJCQlpZiAoc3RhdChhcmd2WzRdLCAmc2IpKSB7CisJCQkJcGVycm9yKGFyZ3ZbNF0pOworCQkJCWRpZSgiQ291bGRuJ3Qgc3RhdCByb290IGRldmljZS4iKTsKKwkJCX0KKwkJCW1ham9yX3Jvb3QgPSBtYWpvcihzYi5zdF9yZGV2KTsKKwkJCW1pbm9yX3Jvb3QgPSBtaW5vcihzYi5zdF9yZGV2KTsKKwkJfSBlbHNlIHsKKwkJCW1ham9yX3Jvb3QgPSAwOworCQkJbWlub3Jfcm9vdCA9IDA7CisJCX0KKwl9IGVsc2UgeworCQltYWpvcl9yb290ID0gREVGQVVMVF9NQUpPUl9ST09UOworCQltaW5vcl9yb290ID0gREVGQVVMVF9NSU5PUl9ST09UOworCX0KKwlmcHJpbnRmKHN0ZGVyciwgIlJvb3QgZGV2aWNlIGlzICglZCwgJWQpXG4iLCBtYWpvcl9yb290LCBtaW5vcl9yb290KTsKKworCWZpbGVfb3Blbihhcmd2WzFdKTsKKwlpID0gcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSk7CisJZnByaW50ZihzdGRlcnIsICJCb290IHNlY3RvciAlZCBieXRlcy5cbiIsIGkpOworCWlmIChpICE9IDUxMikKKwkJZGllKCJCb290IGJsb2NrIG11c3QgYmUgZXhhY3RseSA1MTIgYnl0ZXMiKTsKKwlpZiAoYnVmWzUxMF0gIT0gMHg1NSB8fCBidWZbNTExXSAhPSAweGFhKQorCQlkaWUoIkJvb3QgYmxvY2sgaGFzbid0IGdvdCBib290IGZsYWcgKDB4QUE1NSkiKTsKKwlidWZbNTA4XSA9IG1pbm9yX3Jvb3Q7CisJYnVmWzUwOV0gPSBtYWpvcl9yb290OworCWlmICh3cml0ZSgxLCBidWYsIDUxMikgIT0gNTEyKQorCQlkaWUoIldyaXRlIGNhbGwgZmFpbGVkIik7CisJY2xvc2UoZmQpOworCisJLyogQ29weSB0aGUgc2V0dXAgY29kZSAqLworCWZpbGVfb3Blbihhcmd2WzJdKTsKKwlmb3IgKGkgPSAwOyAoYyA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSA+IDA7IGkgKz0gYykKKwkJaWYgKHdyaXRlKDEsIGJ1ZiwgYykgIT0gYykKKwkJCWRpZSgiV3JpdGUgY2FsbCBmYWlsZWQiKTsKKwlpZiAoYyAhPSAwKQorCQlkaWUoInJlYWQtZXJyb3Igb24gYHNldHVwJyIpOworCWNsb3NlKGZkKTsKKworCS8qIFBhZCB1bnVzZWQgc3BhY2Ugd2l0aCB6ZXJvcyAqLworCXNldHVwX3NlY3RvcnMgPSAoaSArIDUxMSkgLyA1MTI7CisJLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBhbmNpZW50IHZlcnNpb25zIG9mIExJTE8uICovCisJaWYgKHNldHVwX3NlY3RvcnMgPCBTRVRVUF9TRUNUUykKKwkJc2V0dXBfc2VjdG9ycyA9IFNFVFVQX1NFQ1RTOworCWZwcmludGYoc3RkZXJyLCAiU2V0dXAgaXMgJWQgYnl0ZXMuXG4iLCBpKTsKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJd2hpbGUgKGkgPCBzZXR1cF9zZWN0b3JzICogNTEyKSB7CisJCWMgPSBzZXR1cF9zZWN0b3JzICogNTEyIC0gaTsKKwkJaWYgKGMgPiBzaXplb2YoYnVmKSkKKwkJCWMgPSBzaXplb2YoYnVmKTsKKwkJaWYgKHdyaXRlKDEsIGJ1ZiwgYykgIT0gYykKKwkJCWRpZSgiV3JpdGUgY2FsbCBmYWlsZWQiKTsKKwkJaSArPSBjOworCX0KKworCWZpbGVfb3Blbihhcmd2WzNdKTsKKwlpZiAoZnN0YXQoZmQsICZzYikpCisJCWRpZSgiVW5hYmxlIHRvIHN0YXQgYCVzJzogJW0iLCBhcmd2WzNdKTsKKwlzeiA9IHNiLnN0X3NpemU7CisJZnByaW50ZihzdGRlcnIsICJTeXN0ZW0gaXMgJWQga0JcbiIsIHN6IC8gMTAyNCk7CisJc3lzX3NpemUgPSAoc3ogKyAxNSkgLyAxNjsKKwkvKiAweDI4MDAwKjE2ID0gMi41IE1CLCBjb25zZXJ2YXRpdmUgZXN0aW1hdGUgZm9yIHRoZSBjdXJyZW50IG1heGltdW0gKi8KKwlpZiAoc3lzX3NpemUgPiAoaXNfYmlnX2tlcm5lbCA/IDB4MjgwMDAgOiBERUZfU1lTU0laRSkpCisJCWRpZSgiU3lzdGVtIGlzIHRvbyBiaWcuIFRyeSB1c2luZyAlc21vZHVsZXMuIiwKKwkJCWlzX2JpZ19rZXJuZWwgPyAiIiA6ICJiekltYWdlIG9yICIpOworCWlmIChzeXNfc2l6ZSA+IDB4ZmZmZikKKwkJZnByaW50ZihzdGRlcnIsCisJCQkid2FybmluZzoga2VybmVsIGlzIHRvbyBiaWcgZm9yIHN0YW5kYWxvbmUgYm9vdCAiCisJCQkiZnJvbSBmbG9wcHlcbiIpOworCXdoaWxlIChzeiA+IDApIHsKKwkJaW50IGwsIG47CisKKwkJbCA9IChzeiA+IHNpemVvZihidWYpKSA/IHNpemVvZihidWYpIDogc3o7CisJCW4gPSByZWFkKGZkLCBidWYsIGwpOworCQlpZiAobiAhPSBsKSB7CisJCQlpZiAobiA8IDApCisJCQkJZGllKCJFcnJvciByZWFkaW5nICVzOiAlbSIsIGFyZ3ZbM10pOworCQkJZWxzZQorCQkJCWRpZSgiJXM6IFVuZXhwZWN0ZWQgRU9GIiwgYXJndlszXSk7CisJCX0KKwkJaWYgKHdyaXRlKDEsIGJ1ZiwgbCkgIT0gbCkKKwkJCWRpZSgiV3JpdGUgZmFpbGVkIik7CisJCXN6IC09IGw7CisJfQorCWNsb3NlKGZkKTsKKworCS8qIFdyaXRlIHNpemVzIHRvIHRoZSBib290c2VjdG9yICovCisJaWYgKGxzZWVrKDEsIDQ5NywgU0VFS19TRVQpICE9IDQ5NykKKwkJZGllKCJPdXRwdXQ6IHNlZWsgZmFpbGVkIik7CisJYnVmWzBdID0gc2V0dXBfc2VjdG9yczsKKwlpZiAod3JpdGUoMSwgYnVmLCAxKSAhPSAxKQorCQlkaWUoIldyaXRlIG9mIHNldHVwIHNlY3RvciBjb3VudCBmYWlsZWQiKTsKKwlpZiAobHNlZWsoMSwgNTAwLCBTRUVLX1NFVCkgIT0gNTAwKQorCQlkaWUoIk91dHB1dDogc2VlayBmYWlsZWQiKTsKKwlidWZbMF0gPSAoc3lzX3NpemUgJiAweGZmKTsKKwlidWZbMV0gPSAoKHN5c19zaXplID4+IDgpICYgMHhmZik7CisJaWYgKHdyaXRlKDEsIGJ1ZiwgMikgIT0gMikKKwkJZGllKCJXcml0ZSBvZiBpbWFnZSBsZW5ndGggZmFpbGVkIik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9jb25maWdzL2FzYjIzMDNfZGVmY29uZmlnIGIvYXJjaC9tbjEwMzAwL2NvbmZpZ3MvYXNiMjMwM19kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5ODc2YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9jb25maWdzL2FzYjIzMDNfZGVmY29uZmlnCkBAIC0wLDAgKzEsNTU4IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjQtcmMyCisjIEZyaSBOb3YgMTYgMTM6MzY6MzggMjAwNworIworQ09ORklHX01OMTAzMDA9eQorQ09ORklHX0FNMzM9eQorQ09ORklHX01NVT15CisjIENPTkZJR19ISUdITUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX05VTUEgaXMgbm90IHNldAorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CitDT05GSUdfR0VORVJJQ19USU1FPXkKK0NPTkZJR19HRU5FUklDX0JVRz15CitDT05GSUdfUVVJQ0tMSVNUPXkKK0NPTkZJR19BUkNIX0hBU19JTE9HMl9VMzI9eQorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19BT1VUIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKKyMgQ09ORklHX0hPVFBMVUdfQ1BVIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfTE9DS19LRVJORUw9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19TWVNWSVBDX1NZU0NUTD15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMyBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfVVNFUl9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19QSURfTlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX0NHUk9VUFMgaXMgbm90IHNldAorIyBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CisjIENPTkZJR19LQUxMU1lNUyBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0FOT05fSU5PREVTPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX0VWRU5URkQ9eQorQ09ORklHX1NITUVNPXkKKyMgQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTIGlzIG5vdCBzZXQKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1NMVUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CitDT05GSUdfUlRfTVVURVhFUz15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKyMgQ09ORklHX01PRFVMRVMgaXMgbm90IHNldAorIyBDT05GSUdfQkxPQ0sgaXMgbm90IHNldAorCisjCisjIE1hdHN1c2hpdGEgTU4xMDMwMCBzeXN0ZW0gc2V0dXAKKyMKK0NPTkZJR19NTjEwMzAwX1VOSVRfQVNCMjMwMz15CisjIENPTkZJR19NTjEwMzAwX1VOSVRfQVNCMjMwNSBpcyBub3Qgc2V0CitDT05GSUdfTU4xMDMwMF9QUk9DX01OMTAzRTAxMD15CitDT05GSUdfTU4xMDMwMF9DUFVfQU0zM1YyPXkKK0NPTkZJR19GUFU9eQorQ09ORklHX01OMTAzMDBfQ0FDSEVfV0JBQ0s9eQorIyBDT05GSUdfTU4xMDMwMF9DQUNIRV9XVEhSVSBpcyBub3Qgc2V0CisjIENPTkZJR19NTjEwMzAwX0NBQ0hFX0RJU0FCTEVEIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgbGF5b3V0IG9wdGlvbnMKKyMKK0NPTkZJR19LRVJORUxfUkFNX0JBU0VfQUREUkVTUz0weDkwMDAwMDAwCitDT05GSUdfSU5URVJSVVBUX1ZFQ1RPUl9CQVNFPTB4OTAwMDAwMDAKK0NPTkZJR19LRVJORUxfVEVYVF9BRERSRVNTPTB4OTAwMDEwMDAKK0NPTkZJR19LRVJORUxfWklNQUdFX0JBU0VfQUREUkVTUz0weDkwNzAwMDAwCitDT05GSUdfUFJFRU1QVD15CitDT05GSUdfUFJFRU1QVF9CS0w9eQorQ09ORklHX01OMTAzMDBfQ1VSUkVOVF9JTl9FMj15CitDT05GSUdfTU4xMDMwMF9VU0lOR19KVEFHPXkKK0NPTkZJR19NTjEwMzAwX1JUQz15CitDT05GSUdfTU4xMDMwMF9XRF9USU1FUj15CisjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CisKKyMKKyMgTU4xMDMwMCBpbnRlcm5hbCBzZXJpYWwgb3B0aW9ucworIworQ09ORklHX01OMTAzMDBfUFJPQ19IQVNfVFRZU00wPXkKK0NPTkZJR19NTjEwMzAwX1BST0NfSEFTX1RUWVNNMT15CitDT05GSUdfTU4xMDMwMF9QUk9DX0hBU19UVFlTTTI9eQorQ09ORklHX01OMTAzMDBfVFRZU009eQorQ09ORklHX01OMTAzMDBfVFRZU01fQ09OU09MRT15CitDT05GSUdfTU4xMDMwMF9UVFlTTTA9eQorQ09ORklHX01OMTAzMDBfVFRZU00wX1RJTUVSOD15CisjIENPTkZJR19NTjEwMzAwX1RUWVNNMF9USU1FUjIgaXMgbm90IHNldAorQ09ORklHX01OMTAzMDBfVFRZU00xPXkKK0NPTkZJR19NTjEwMzAwX1RUWVNNMV9USU1FUjk9eQorIyBDT05GSUdfTU4xMDMwMF9UVFlTTTFfVElNRVIzIGlzIG5vdCBzZXQKKyMgQ09ORklHX01OMTAzMDBfVFRZU00yIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKKyMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVBfRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CisjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MAorQ09ORklHX05SX1FVSUNLPTEKK0NPTkZJR19WSVJUX1RPX0JVUz15CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgRXhlY3V0YWJsZSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19QQUNLRVRfTU1BUD15CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9NVUxUSUNBU1Q9eQorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CitDT05GSUdfSVBfUE5QPXkKKyMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX01ST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9ESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcworIworIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CitDT05GSUdfTVREPXkKK0NPTkZJR19NVERfREVCVUc9eQorQ09ORklHX01URF9ERUJVR19WRVJCT1NFPTAKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKK0NPTkZJR19NVERfUkVEQk9PVF9QQVJUUz15CitDT05GSUdfTVREX1JFREJPT1RfRElSRUNUT1JZX0JMT0NLPS0xCitDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfVU5BTExPQ0FURUQ9eQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFNfUkVBRE9OTFkgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorIyBDT05GSUdfTVREX09PUFMgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CitDT05GSUdfTVREX0pFREVDUFJPQkU9eQorQ09ORklHX01URF9HRU5fUFJPQkU9eQorQ09ORklHX01URF9DRklfQURWX09QVElPTlM9eQorQ09ORklHX01URF9DRklfTk9TV0FQPXkKKyMgQ09ORklHX01URF9DRklfQkVfQllURV9TV0FQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfTEVfQllURV9TV0FQIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0dFT01FVFJZPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorQ09ORklHX01URF9DRklfSTQ9eQorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSU5URUxFWFQgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfQU1EU1REPXkKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BIWVNNQVA9eQorQ09ORklHX01URF9QSFlTTUFQX1NUQVJUPTB4ODAwMDAwMAorQ09ORklHX01URF9QSFlTTUFQX0xFTj0weDAKK0NPTkZJR19NVERfUEhZU01BUF9CQU5LV0lEVEg9MgorIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgVUJJIC0gVW5zb3J0ZWQgYmxvY2sgaW1hZ2VzCisjCisjIENPTkZJR19NVERfVUJJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorQ09ORklHX01JU0NfREVWSUNFUz15CisjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NDU0lfRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19ORVRERVZJQ0VTX01VTFRJUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNWTEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorIyBDT05GSUdfVkVUSCBpcyBub3Qgc2V0CisjIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAorQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKK0NPTkZJR19TTUM5MVg9eQorIyBDT05GSUdfSUJNX05FV19FTUFDX1pNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1JHTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX0VNQUM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTgorIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz00CitDT05GSUdfU0VSSUFMXzgyNTBfUlVOVElNRV9VQVJUUz00CitDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQ9eQorIyBDT05GSUdfU0VSSUFMXzgyNTBfTUFOWV9QT1JUUyBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMXzgyNTBfU0hBUkVfSVJRPXkKKyMgQ09ORklHX1NFUklBTF84MjUwX0RFVEVDVF9JUlEgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMXzgyNTBfUlNBIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorQ09ORklHX1JUQz15CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfTUFTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisKKyMKKyMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCisjCitDT05GSUdfU1NCX1BPU1NJQkxFPXkKKyMgQ09ORklHX1NTQiBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19EQUIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcnNwYWNlIEkvTworIworIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19JTk9USUZZPXkKK0NPTkZJR19JTk9USUZZX1VTRVI9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfSkZGUzJfRlM9eQorQ09ORklHX0pGRlMyX0ZTX0RFQlVHPTAKK0NPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUj15CisjIENPTkZJR19KRkZTMl9GU19XQlVGX1ZFUklGWSBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9TVU1NQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1pMSUI9eQorIyBDT05GSUdfSkZGUzJfTFpPIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9SVElNRT15CisjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CitDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19TVU5SUENfQklORDM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFMgaXMgbm90IHNldAorIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQklUUkVWRVJTRT15CisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQorQ09ORklHX1BMSVNUPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCitDT05GSUdfUFJPRklMSU5HPXkKK0NPTkZJR19PUFJPRklMRT15CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL01ha2VmaWxlIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjA3Yzk1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9NYWtlZmlsZQpAQCAtMCwwICsxLDI3IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTU4xMDMwMC1zcGVjaWZpYyBjb3JlIGtlcm5lbCBjb2RlCisjCitleHRyYS15IDo9IGhlYWQubyBpbml0X3Rhc2subyB2bWxpbnV4LmxkcworCitvYmoteSAgIDo9IHByb2Nlc3MubyBzZW1hcGhvcmUubyBzaWduYWwubyBlbnRyeS5vIGZwdS5vIHRyYXBzLm8gaXJxLm8gXAorCSAgIHB0cmFjZS5vIHNldHVwLm8gdGltZS5vIHN5c19tbjEwMzAwLm8gaW8ubyBrdGhyZWFkLm8gXAorCSAgIHN3aXRjaF90by5vIG1uMTAzMDBfa3N5bXMubyBrZXJuZWxfZXhlY3ZlLm8KKworb2JqLSQoQ09ORklHX01OMTAzMDBfV0RfVElNRVIpICs9IG1uMTAzMDAtd2F0Y2hkb2cubyBtbjEwMzAwLXdhdGNoZG9nLWxvdy5vCisKK29iai0kKENPTkZJR19GUFUpICs9IGZwdS1sb3cubworCitvYmotJChDT05GSUdfTU4xMDMwMF9UVFlTTSkgKz0gbW4xMDMwMC1zZXJpYWwubyBtbjEwMzAwLXNlcmlhbC1sb3cubyBcCisJCQkgICAgICAgbW4xMDMwMC1kZWJ1Zy5vCitvYmotJChDT05GSUdfR0RCU1RVQikgKz0gZ2RiLXN0dWIubyBnZGItbG93Lm8KK29iai0kKENPTkZJR19HREJTVFVCX09OX1RUWVN4KSArPSBnZGItaW8tc2VyaWFsLm8gZ2RiLWlvLXNlcmlhbC1sb3cubworb2JqLSQoQ09ORklHX0dEQlNUVUJfT05fVFRZU014KSArPSBnZGItaW8tdHR5c20ubyBnZGItaW8tdHR5c20tbG93Lm8KKworaWZuZXEgKCQoQ09ORklHX01OMTAzMDBfQ0FDSEVfRElTQUJMRUQpLHkpCitvYmotJChDT05GSUdfR0RCU1RVQikgKz0gZ2RiLWNhY2hlLm8KK2VuZGlmCisKK29iai0kKENPTkZJR19NTjEwMzAwX1JUQykgKz0gcnRjLm8KK29iai0kKENPTkZJR19QUk9GSUxFKSArPSBwcm9maWxlLm8gcHJvZmlsZS1sb3cubworb2JqLSQoQ09ORklHX01PRFVMRVMpICs9IG1vZHVsZS5vCitvYmotJChDT05GSUdfS1BST0JFUykgKz0ga3Byb2Jlcy5vCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL21uMTAzMDAva2VybmVsL2FzbS1vZmZzZXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyZDlmOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIEdlbmVyYXRlIGRlZmluaXRpb25zIG5lZWRlZCBieSBhc3NlbWJseSBsYW5ndWFnZSBtb2R1bGVzLgorICogVGhpcyBjb2RlIGdlbmVyYXRlcyByYXcgYXNtIG91dHB1dCB3aGljaCBpcyBwb3N0LXByb2Nlc3NlZAorICogdG8gZXh0cmFjdCBhbmQgZm9ybWF0IHRoZSByZXF1aXJlZCBkYXRhLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CisjaW5jbHVkZSA8YXNtL3Vjb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlICJzaWdmcmFtZS5oIgorI2luY2x1ZGUgIm1uMTAzMDAtc2VyaWFsLmgiCisKKyNkZWZpbmUgREVGSU5FKHN5bSwgdmFsKSBcCisJYXNtIHZvbGF0aWxlKCJcbi0+IiAjc3ltICIgJTAgIiAjdmFsIDogOiAiaSIgKHZhbCkpCisKKyNkZWZpbmUgQkxBTksoKSBhc20gdm9sYXRpbGUoIlxuLT4iKQorCisjZGVmaW5lIE9GRlNFVChzeW0sIHN0ciwgbWVtKSBcCisJREVGSU5FKHN5bSwgb2Zmc2V0b2Yoc3RydWN0IHN0ciwgbWVtKSk7CisKK3ZvaWQgZm9vKHZvaWQpCit7CisJT0ZGU0VUKFNJR0NPTlRFWFRfZDAsIHNpZ2NvbnRleHQsIGQwKTsKKwlPRkZTRVQoU0lHQ09OVEVYVF9kMSwgc2lnY29udGV4dCwgZDEpOworCUJMQU5LKCk7CisKKwlPRkZTRVQoVElfdGFzaywJCQl0aHJlYWRfaW5mbywgdGFzayk7CisJT0ZGU0VUKFRJX2V4ZWNfZG9tYWluLAkJdGhyZWFkX2luZm8sIGV4ZWNfZG9tYWluKTsKKwlPRkZTRVQoVElfZmxhZ3MsCQl0aHJlYWRfaW5mbywgZmxhZ3MpOworCU9GRlNFVChUSV9jcHUsCQkJdGhyZWFkX2luZm8sIGNwdSk7CisJT0ZGU0VUKFRJX3ByZWVtcHRfY291bnQsCXRocmVhZF9pbmZvLCBwcmVlbXB0X2NvdW50KTsKKwlPRkZTRVQoVElfYWRkcl9saW1pdCwJCXRocmVhZF9pbmZvLCBhZGRyX2xpbWl0KTsKKwlPRkZTRVQoVElfcmVzdGFydF9ibG9jaywJdGhyZWFkX2luZm8sIHJlc3RhcnRfYmxvY2spOworCUJMQU5LKCk7CisKKwlPRkZTRVQoUkVHX0QwLAkJCXB0X3JlZ3MsIGQwKTsKKwlPRkZTRVQoUkVHX0QxLAkJCXB0X3JlZ3MsIGQxKTsKKwlPRkZTRVQoUkVHX0QyLAkJCXB0X3JlZ3MsIGQyKTsKKwlPRkZTRVQoUkVHX0QzLAkJCXB0X3JlZ3MsIGQzKTsKKwlPRkZTRVQoUkVHX0EwLAkJCXB0X3JlZ3MsIGEwKTsKKwlPRkZTRVQoUkVHX0ExLAkJCXB0X3JlZ3MsIGExKTsKKwlPRkZTRVQoUkVHX0EyLAkJCXB0X3JlZ3MsIGEyKTsKKwlPRkZTRVQoUkVHX0EzLAkJCXB0X3JlZ3MsIGEzKTsKKwlPRkZTRVQoUkVHX0UwLAkJCXB0X3JlZ3MsIGUwKTsKKwlPRkZTRVQoUkVHX0UxLAkJCXB0X3JlZ3MsIGUxKTsKKwlPRkZTRVQoUkVHX0UyLAkJCXB0X3JlZ3MsIGUyKTsKKwlPRkZTRVQoUkVHX0UzLAkJCXB0X3JlZ3MsIGUzKTsKKwlPRkZTRVQoUkVHX0U0LAkJCXB0X3JlZ3MsIGU0KTsKKwlPRkZTRVQoUkVHX0U1LAkJCXB0X3JlZ3MsIGU1KTsKKwlPRkZTRVQoUkVHX0U2LAkJCXB0X3JlZ3MsIGU2KTsKKwlPRkZTRVQoUkVHX0U3LAkJCXB0X3JlZ3MsIGU3KTsKKwlPRkZTRVQoUkVHX1NQLAkJCXB0X3JlZ3MsIHNwKTsKKwlPRkZTRVQoUkVHX0VQU1csCQlwdF9yZWdzLCBlcHN3KTsKKwlPRkZTRVQoUkVHX1BDLAkJCXB0X3JlZ3MsIHBjKTsKKwlPRkZTRVQoUkVHX0xBUiwJCQlwdF9yZWdzLCBsYXIpOworCU9GRlNFVChSRUdfTElSLAkJCXB0X3JlZ3MsIGxpcik7CisJT0ZGU0VUKFJFR19NRFIsCQkJcHRfcmVncywgbWRyKTsKKwlPRkZTRVQoUkVHX01DVkYsCQlwdF9yZWdzLCBtY3ZmKTsKKwlPRkZTRVQoUkVHX01DUkwsCQlwdF9yZWdzLCBtY3JsKTsKKwlPRkZTRVQoUkVHX01DUkgsCQlwdF9yZWdzLCBtY3JoKTsKKwlPRkZTRVQoUkVHX01EUlEsCQlwdF9yZWdzLCBtZHJxKTsKKwlPRkZTRVQoUkVHX09SSUdfRDAsCQlwdF9yZWdzLCBvcmlnX2QwKTsKKwlPRkZTRVQoUkVHX05FWFQsCQlwdF9yZWdzLCBuZXh0KTsKKwlERUZJTkUoUkVHX19FTkQsCQlzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKTsKKwlCTEFOSygpOworCisJT0ZGU0VUKFRIUkVBRF9VUkVHUywJCXRocmVhZF9zdHJ1Y3QsIHVyZWdzKTsKKwlPRkZTRVQoVEhSRUFEX1BDLAkJdGhyZWFkX3N0cnVjdCwgcGMpOworCU9GRlNFVChUSFJFQURfU1AsCQl0aHJlYWRfc3RydWN0LCBzcCk7CisJT0ZGU0VUKFRIUkVBRF9BMywJCXRocmVhZF9zdHJ1Y3QsIGEzKTsKKwlPRkZTRVQoVEhSRUFEX1VTUCwJCXRocmVhZF9zdHJ1Y3QsIHVzcCk7CisJT0ZGU0VUKFRIUkVBRF9GUkFNRSwJCXRocmVhZF9zdHJ1Y3QsIF9fZnJhbWUpOworCUJMQU5LKCk7CisKKwlERUZJTkUoQ0xPTkVfVk1fYXNtLAkJQ0xPTkVfVk0pOworCURFRklORShDTE9ORV9GU19hc20sCQlDTE9ORV9GUyk7CisJREVGSU5FKENMT05FX0ZJTEVTX2FzbSwJCUNMT05FX0ZJTEVTKTsKKwlERUZJTkUoQ0xPTkVfU0lHSEFORF9hc20sCUNMT05FX1NJR0hBTkQpOworCURFRklORShDTE9ORV9VTlRSQUNFRF9hc20sCUNMT05FX1VOVFJBQ0VEKTsKKwlERUZJTkUoU0lHQ0hMRF9hc20sCQlTSUdDSExEKTsKKwlCTEFOSygpOworCisJT0ZGU0VUKEVYRUNfRE9NQUlOX2hhbmRsZXIsCWV4ZWNfZG9tYWluLCBoYW5kbGVyKTsKKwlPRkZTRVQoUlRfU0lHRlJBTUVfc2lnY29udGV4dCwJcnRfc2lnZnJhbWUsIHVjLnVjX21jb250ZXh0KTsKKworCURFRklORShQQUdFX1NJWkVfYXNtLAkJUEFHRV9TSVpFKTsKKworCU9GRlNFVChfX3J4X2J1ZmZlciwJCW1uMTAzMDBfc2VyaWFsX3BvcnQsIHJ4X2J1ZmZlcik7CisJT0ZGU0VUKF9fcnhfaW5wLAkJbW4xMDMwMF9zZXJpYWxfcG9ydCwgcnhfaW5wKTsKKwlPRkZTRVQoX19yeF9vdXRwLAkJbW4xMDMwMF9zZXJpYWxfcG9ydCwgcnhfb3V0cCk7CisJT0ZGU0VUKF9fdHhfaW5mb19idWZmZXIsCW1uMTAzMDBfc2VyaWFsX3BvcnQsIHVhcnQuaW5mbyk7CisJT0ZGU0VUKF9fdHhfeGNoYXIsCQltbjEwMzAwX3NlcmlhbF9wb3J0LCB0eF94Y2hhcik7CisJT0ZGU0VUKF9fdHhfYnJlYWssCQltbjEwMzAwX3NlcmlhbF9wb3J0LCB0eF9icmVhayk7CisJT0ZGU0VUKF9faW50cl9mbGFncywJCW1uMTAzMDBfc2VyaWFsX3BvcnQsIGludHJfZmxhZ3MpOworCU9GRlNFVChfX3J4X2ljciwJCW1uMTAzMDBfc2VyaWFsX3BvcnQsIHJ4X2ljcik7CisJT0ZGU0VUKF9fdHhfaWNyLAkJbW4xMDMwMF9zZXJpYWxfcG9ydCwgdHhfaWNyKTsKKwlPRkZTRVQoX190bV9pY3IsCQltbjEwMzAwX3NlcmlhbF9wb3J0LCBfdG1pY3IpOworCU9GRlNFVChfX2lvYmFzZSwJCW1uMTAzMDBfc2VyaWFsX3BvcnQsIF9pb2Jhc2UpOworCisJREVGSU5FKF9fVUFSVF9YTUlUX1NJWkUsCVVBUlRfWE1JVF9TSVpFKTsKKwlPRkZTRVQoX194bWl0X2J1ZmZlciwJCXVhcnRfaW5mbywgeG1pdC5idWYpOworCU9GRlNFVChfX3htaXRfaGVhZCwJCXVhcnRfaW5mbywgeG1pdC5oZWFkKTsKKwlPRkZTRVQoX194bWl0X3RhaWwsCQl1YXJ0X2luZm8sIHhtaXQudGFpbCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL2VudHJ5LlMgYi9hcmNoL21uMTAzMDAva2VybmVsL2VudHJ5LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFkZTM2MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvZW50cnkuUwpAQCAtMCwwICsxLDcyMSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBNTjEwMzAwIEV4Y2VwdGlvbiBhbmQgaW50ZXJydXB0IGVudHJ5IHBvaW50cworIworIyBDb3B5cmlnaHQgKEMpIDIwMDcgTWF0c3VzaGl0YSBFbGVjdHJpYyBJbmR1c3RyaWFsIENvLiwgTHRkLgorIyBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBNb2RpZmllZCBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisjIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorIyAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworI2luY2x1ZGUgPGxpbnV4L3N5cy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9pbnRjdGwtcmVncy5oPgorI2luY2x1ZGUgPGFzbS9idXNjdGwtcmVncy5oPgorI2luY2x1ZGUgPGFzbS90aW1lci1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL3VuaXQvbGVkcy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vZnJhbWUuaW5jPgorCisjaWZkZWYgQ09ORklHX1BSRUVNUFQKKyNkZWZpbmUgcHJlZW1wdF9zdG9wCQlfX2NsaQorI2Vsc2UKKyNkZWZpbmUgcHJlZW1wdF9zdG9wCisjZGVmaW5lIHJlc3VtZV9rZXJuZWwJCXJlc3RvcmVfYWxsCisjZW5kaWYKKworCS5tYWNybyBfX2NsaQorCWFuZAl+RVBTV19JTSxlcHN3CisJb3IJRVBTV19JRXxNTjEwMzAwX0NMSV9MRVZFTCxlcHN3CisJbm9wCisJbm9wCisJbm9wCisJLmVuZG0KKwkubWFjcm8gX19zdGkKKwlvcglFUFNXX0lFfEVQU1dfSU1fNyxlcHN3CisJLmVuZG0KKworCisJLmFtMzNfMgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHRoZSByZXR1cm4gcGF0aCBmb3IgYSBmb3JrZWQgY2hpbGQKKyMgLSBvbiBlbnRyeSwgRDAgaG9sZHMgdGhlIGFkZHJlc3Mgb2YgdGhlIHByZXZpb3VzIHRhc2sgdG8gcnVuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitFTlRSWShyZXRfZnJvbV9mb3JrKQorCWNhbGwJc2NoZWR1bGVfdGFpbFtdLDAKKwlHRVRfVEhSRUFEX0lORk8gYTIKKworCSMgcmV0dXJuIDAgdG8gaW5kaWNhdGUgY2hpbGQgcHJvY2VzcworCWNscglkMAorCW1vdglkMCwoUkVHX0QwLGZwKQorCWptcAlzeXNjYWxsX2V4aXQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzeXN0ZW0gY2FsbCBoYW5kbGVyCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitFTlRSWShzeXN0ZW1fY2FsbCkKKwlhZGQJLTQsc3AKKwlTQVZFX0FMTAorCW1vdglkMCwoUkVHX09SSUdfRDAsZnApCisJR0VUX1RIUkVBRF9JTkZPIGEyCisJY21wCW5yX3N5c2NhbGxzLGQwCisJYmNjCXN5c2NhbGxfYmFkc3lzCisJYnRzdAlfVElGX1NZU0NBTExfVFJBQ0UsKFRJX2ZsYWdzLGEyKQorCWJuZQlzeXNjYWxsX3RyYWNlX2VudHJ5CitzeXNjYWxsX2NhbGw6CisJYWRkCWQwLGQwLGExCisJYWRkCWExLGExCisJbW92CShSRUdfQTAsZnApLGQwCisJbW92CShzeXNfY2FsbF90YWJsZSxhMSksYTAKKwljYWxscwkoYTApCisJbW92CWQwLChSRUdfRDAsZnApCitzeXNjYWxsX2V4aXQ6CisJIyBtYWtlIHN1cmUgd2UgZG9uJ3QgbWlzcyBhbiBpbnRlcnJ1cHQgc2V0dGluZyBuZWVkX3Jlc2NoZWQgb3IKKwkjIHNpZ3BlbmRpbmcgYmV0d2VlbiBzYW1wbGluZyBhbmQgdGhlIHJ0aQorCV9fY2xpCisJbW92CShUSV9mbGFncyxhMiksZDIKKwlidHN0CV9USUZfQUxMV09SS19NQVNLLGQyCisJYm5lCXN5c2NhbGxfZXhpdF93b3JrCityZXN0b3JlX2FsbDoKKwlSRVNUT1JFX0FMTAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHBlcmZvcm0gd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgaW1tZWRpYXRlbHkgYmVmb3JlIHJlc3VtcHRpb24gYW5kIHN5c2NhbGwKKyMgdHJhY2luZworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCUFMSUdOCitzeXNjYWxsX2V4aXRfd29yazoKKwlidHN0CV9USUZfU1lTQ0FMTF9UUkFDRSxkMgorCWJlcQl3b3JrX3BlbmRpbmcKKwlfX3N0aQkJCQkjIGNvdWxkIGxldCBkb19zeXNjYWxsX3RyYWNlKCkgY2FsbAorCQkJCQkjIHNjaGVkdWxlKCkgaW5zdGVhZAorCW1vdglmcCxkMAorCW1vdgkxLGQxCisJY2FsbAlkb19zeXNjYWxsX3RyYWNlW10sMAkjIGRvX3N5c2NhbGxfdHJhY2UocmVncyxlbnRyeWV4aXQpCisJam1wCXJlc3VtZV91c2Vyc3BhY2UKKworCUFMSUdOCit3b3JrX3BlbmRpbmc6CisJYnRzdAlfVElGX05FRURfUkVTQ0hFRCxkMgorCWJlcQl3b3JrX25vdGlmeXNpZworCit3b3JrX3Jlc2NoZWQ6CisJY2FsbAlzY2hlZHVsZVtdLDAKKworCSMgbWFrZSBzdXJlIHdlIGRvbid0IG1pc3MgYW4gaW50ZXJydXB0IHNldHRpbmcgbmVlZF9yZXNjaGVkIG9yCisJIyBzaWdwZW5kaW5nIGJldHdlZW4gc2FtcGxpbmcgYW5kIHRoZSBydGkKKwlfX2NsaQorCisJIyBpcyB0aGVyZSBhbnkgd29yayB0byBiZSBkb25lIG90aGVyIHRoYW4gc3lzY2FsbCB0cmFjaW5nPworCW1vdgkoVElfZmxhZ3MsYTIpLGQyCisJYnRzdAlfVElGX1dPUktfTUFTSyxkMgorCWJlcQlyZXN0b3JlX2FsbAorCWJ0c3QJX1RJRl9ORUVEX1JFU0NIRUQsZDIKKwlibmUJd29ya19yZXNjaGVkCisKKwkjIGRlYWwgd2l0aCBwZW5kaW5nIHNpZ25hbHMgYW5kIG5vdGlmeS1yZXN1bWUgcmVxdWVzdHMKK3dvcmtfbm90aWZ5c2lnOgorCW1vdglmcCxkMAorCW1vdglkMixkMQorCWNhbGwJZG9fbm90aWZ5X3Jlc3VtZVtdLDAKKwlqbXAJcmVzdW1lX3VzZXJzcGFjZQorCisJIyBwZXJmb3JtIHN5c2NhbGwgZW50cnkgdHJhY2luZworc3lzY2FsbF90cmFjZV9lbnRyeToKKwltb3YJLUVOT1NZUyxkMAorCW1vdglkMCwoUkVHX0QwLGZwKQorCW1vdglmcCxkMAorCWNscglkMQorCWNhbGwJZG9fc3lzY2FsbF90cmFjZVtdLDAKKwltb3YJKFJFR19PUklHX0QwLGZwKSxkMAorCW1vdgkoUkVHX0QxLGZwKSxkMQorCWNtcAlucl9zeXNjYWxscyxkMAorCWJjcwlzeXNjYWxsX2NhbGwKKwlqbXAJc3lzY2FsbF9leGl0CisKK3N5c2NhbGxfYmFkc3lzOgorCW1vdgktRU5PU1lTLGQwCisJbW92CWQwLChSRUdfRDAsZnApCisJam1wCXJlc3VtZV91c2Vyc3BhY2UKKworCSMgdXNlcnNwYWNlIHJlc3VtcHRpb24gc3R1YiBieXBhc3Npbmcgc3lzY2FsbCBleGl0IHRyYWNpbmcKKwkuZ2xvYmwJcmV0X2Zyb21fZXhjZXB0aW9uLCByZXRfZnJvbV9pbnRyCisJQUxJR04KK3JldF9mcm9tX2V4Y2VwdGlvbjoKKwlwcmVlbXB0X3N0b3AKK3JldF9mcm9tX2ludHI6CisJR0VUX1RIUkVBRF9JTkZPIGEyCisJbW92CShSRUdfRVBTVyxmcCksZDAJIyBuZWVkIHRvIGRlbGl2ZXIgc2lnbmFscyBiZWZvcmUKKwkJCQkJIyByZXR1cm5pbmcgdG8gdXNlcnNwYWNlCisJYW5kCUVQU1dfblNMLGQwCisJYmVxCXJlc3VtZV9rZXJuZWwJCSMgcmV0dXJuaW5nIHRvIHN1cGVydmlzb3IgbW9kZQorCitFTlRSWShyZXN1bWVfdXNlcnNwYWNlKQorCSMgbWFrZSBzdXJlIHdlIGRvbid0IG1pc3MgYW4gaW50ZXJydXB0IHNldHRpbmcgbmVlZF9yZXNjaGVkIG9yCisJIyBzaWdwZW5kaW5nIGJldHdlZW4gc2FtcGxpbmcgYW5kIHRoZSBydGkKKwlfX2NsaQorCisJIyBpcyB0aGVyZSBhbnkgd29yayB0byBiZSBkb25lIG9uIGludC9leGNlcHRpb24gcmV0dXJuPworCW1vdgkoVElfZmxhZ3MsYTIpLGQyCisJYnRzdAlfVElGX1dPUktfTUFTSyxkMgorCWJuZQl3b3JrX3BlbmRpbmcKKwlqbXAJcmVzdG9yZV9hbGwKKworI2lmZGVmIENPTkZJR19QUkVFTVBUCitFTlRSWShyZXN1bWVfa2VybmVsKQorCW1vdgkoVElfcHJlZW1wdF9jb3VudCxhMiksZDAJIyBub24temVybyBwcmVlbXB0X2NvdW50ID8KKwljbXAJMCxkMAorCWJuZQlyZXN0b3JlX2FsbAorCituZWVkX3Jlc2NoZWQ6CisJYnRzdAlfVElGX05FRURfUkVTQ0hFRCwoVElfZmxhZ3MsYTIpCisJYmVxCXJlc3RvcmVfYWxsCisJbW92CShSRUdfRVBTVyxmcCksZDAKKwlhbmQJRVBTV19JTSxkMAorCWNtcAlFUFNXX0lNXzcsZDAJCSMgaW50ZXJydXB0cyBvZmYgKGV4Y2VwdGlvbiBwYXRoKSA/CisJYmVxCXJlc3RvcmVfYWxsCisJY2FsbAlwcmVlbXB0X3NjaGVkdWxlX2lycVtdLDAKKwlqbXAJbmVlZF9yZXNjaGVkCisjZW5kaWYKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIElSUSBoYW5kbGVyIGVudHJ5IHBvaW50CisjIC0gaW50ZW5kZWQgdG8gYmUgZW50ZXJlZCBhdCBtdWx0aXBsZSBwcmlvcml0aWVzCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitFTlRSWShpcnFfaGFuZGxlcikKKwlhZGQJLTQsc3AKKwlTQVZFX0FMTAorCisJIyBpdCdzIG5vdCBhIHN5c2NhbGwKKwltb3YJMHhmZmZmZmZmZixkMAorCW1vdglkMCwoUkVHX09SSUdfRDAsZnApCisKKwltb3YJZnAsZDAKKwljYWxsCWRvX0lSUVtdLDAJCQkjIGRvX0lSUShyZWdzKQorCisJam1wCXJldF9mcm9tX2ludHIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBNb25pdG9yIFNpZ25hbCBoYW5kbGVyIGVudHJ5IHBvaW50CisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitFTlRSWShtb25pdG9yX3NpZ25hbCkKKwltb3ZidQkoMHhhZTAwMDAwMSksZDEKKwljbXAJMSxkMQorCWJlcQltb25zaWduYWwKKwlyZXQJW10sMAorCittb25zaWduYWw6CisJb3IJRVBTV19OTUlELGVwc3cKKwltb3YJZDAsYTAKKwltb3YJYTAsc3AKKwltb3YJKFJFR19FUFNXLGZwKSxkMQorCWFuZAl+RVBTV19uU0wsZDEKKwltb3YJZDEsKFJFR19FUFNXLGZwKQorCW1vdm0JKHNwKSxbZDIsZDMsYTIsYTMsZXhyZWcwLGV4cmVnMSxleG90aGVyXQorCW1vdgkoc3ApLGExCisJbW92CWExLHVzcAorCW1vdm0JKHNwKSxbb3RoZXJdCisJYWRkCTQsc3AKK2hlcmU6CWptcAkweDhlMDAwMDA4LWhlcmUrMHg4ZTAwMDAwOAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIERvdWJsZSBGYXVsdCBoYW5kbGVyIGVudHJ5IHBvaW50CisjIC0gbm90ZSB0aGF0IHRoZXJlIHdpbGwgbm90IGJlIGEgc3RhY2ssIEQwL0EwIHdpbGwgaG9sZCBFUFNXL1BDIGFzIHdlcmUKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkuc2VjdGlvbiAuYnNzCisJLmJhbGlnbglUSFJFQURfU0laRQorCS5zcGFjZQlUSFJFQURfU0laRQorX19kZl9zdGFjazoKKwkucHJldmlvdXMKKworRU5UUlkoZG91YmxlX2ZhdWx0KQorCW1vdglhMCwoX19kZl9zdGFjay00KQkjIFBDIGFzIHdhcworCW1vdglkMCwoX19kZl9zdGFjay04KQkjIEVQU1cgYXMgd2FzCisJbW4xMDMwMF9zZXRfZGJmbGVkcwkJIyBkaXNwbGF5ICdkYi1mJyBvbiB0aGUgTEVEcworCW1vdgkweGFhNTVhYTU1LGQwCisJbW92CWQwLChfX2RmX3N0YWNrLTEyKQkjIG5vIE9SSUdfRDAKKwltb3YJc3AsYTAJCQkjIHNhdmUgY29ycnVwdGVkIFNQCisJbW92CV9fZGZfc3RhY2stMTIsc3AJIyBlbWVyZ2VuY3kgc3VwZXJ2aXNvciBzdGFjaworCVNBVkVfQUxMCisJbW92CWEwLChSRUdfQTAsZnApCQkjIHNhdmUgY29ycnVwdGVkIFNQIGFzIEEwICh3aGljaCBnb3QKKwkJCQkJIyBjbG9iYmVyZWQgYnkgdGhlIENQVSkKKwltb3YJZnAsZDAKKwljYWxscwlkb19kb3VibGVfZmF1bHQKK2RvdWJsZV9mYXVsdF9sb29wOgorCWJyYQlkb3VibGVfZmF1bHRfbG9vcAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEJ1cyBFcnJvciBoYW5kbGVyIGVudHJ5IHBvaW50CisjIC0gaGFuZGxlIGV4dGVybmFsIChhc3luYykgYnVzIGVycm9ycyBzZXBhcmF0ZWx5CisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitFTlRSWShyYXdfYnVzX2Vycm9yKQorCWFkZAktNCxzcAorCW1vdglkMCwoc3ApCisJbW92CShCQ0JFUlIpLGQwCQkjIHdoYXQKKwlidHN0CUJDQkVSUl9CRU1SX0RNQSxkMAkjIHNlZSBpZiBpdCB3YXMgYW4gZXh0ZXJuYWwgYnVzIGVycm9yCisJYmVxCV9fY29tbW9uX2V4Y2VwdGlvbl9hdXgJIyBpdCB3YXNuJ3QKKworCVNBVkVfQUxMCisJbW92CShCQ0JFQVIpLGQxCQkjIGRlc3RpbmF0aW9uIG9mIGVycm9uZW91cyBhY2Nlc3MKKworCW1vdgkoUkVHX09SSUdfRDAsZnApLGQyCisJbW92CWQyLChSRUdfRDAsZnApCisJbW92CS0xLGQyCisJbW92CWQyLChSRUdfT1JJR19EMCxmcCkKKworCWFkZAktNCxzcAorCW1vdglmcCwoMTIsc3ApCQkjIGZyYW1lIHBvaW50ZXIKKwljYWxsCWlvX2J1c19lcnJvcltdLDAKKwlqbXAJcmVzdG9yZV9hbGwKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBNaXNjZWxsYW5lb3VzIGV4Y2VwdGlvbiBlbnRyeSBwb2ludHMKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK0VOVFJZKG5taV9oYW5kbGVyKQorCWFkZAktNCxzcAorCW1vdglkMCwoc3ApCisJbW92CShUQlIpLGQwCisJYnJhCV9fY29tbW9uX2V4Y2VwdGlvbl9ub25taQorCitFTlRSWShfX2NvbW1vbl9leGNlcHRpb24pCisJYWRkCS00LHNwCisJbW92CWQwLChzcCkKKworX19jb21tb25fZXhjZXB0aW9uX2F1eDoKKwltb3YJKFRCUiksZDAKKwlhbmQJfkVQU1dfTk1JRCxlcHN3CQkjIHR1cm4gTk1JcyBiYWNrIG9uIGlmIG5vdCBOTUkKKwlvcglFUFNXX0lFLGVwc3cKKworX19jb21tb25fZXhjZXB0aW9uX25vbm1pOgorCWFuZAkweDAwMDBGRkZGLGQwCQkjIHR1cm4gdGhlIGV4Y2VwdGlvbiBjb2RlIGludG8gYSB2ZWN0b3IKKwkJCQkJIyB0YWJsZSBpbmRleAorCisJYnRzdAkweDAwMDAwMDA3LGQwCisJYm5lCTFmCisJY21wCTB4MDAwMDA0MDAsZDAKKwliZ2UJMWYKKworCVNBVkVfQUxMCQkJIyBidWlsZCB0aGUgc3RhY2sgZnJhbWUKKworCW1vdgkoUkVHX0QwLGZwKSxhMgkJIyBnZXQgdGhlIGV4Y2VwdGlvbiBudW1iZXIKKwltb3YJKFJFR19PUklHX0QwLGZwKSxkMAorCW1vdglkMCwoUkVHX0QwLGZwKQorCW1vdgktMSxkMAorCW1vdglkMCwoUkVHX09SSUdfRDAsZnApCisKKyNpZmRlZiBDT05GSUdfR0RCU1RVQgorCWJ0c3QJMHgwMSwoZ2Ric3R1Yl9idXN5KQorCWJlcQkyZgorCWFuZAl+RVBTV19JRSxlcHN3CisJbW92CWZwLGQwCisJbW92CWEyLGQxCisJY2FsbAlnZGJzdHViX2V4Y2VwdGlvbltdLDAJIyBnZGJzdHViIGl0c2VsZiBjYXVzZWQgYW4gZXhjZXB0aW9uCisJYnJhCXJlc3RvcmVfYWxsCisyOgorI2VuZGlmCisKKwltb3YJZnAsZDAJCQkjIGFyZyAwOiBzdGFja2VkIHJlZ2lzdGVyIGZpbGUKKwltb3YJYTIsZDEJCQkjIGFyZyAxOiBleGNlcHRpb24gbnVtYmVyCisJbHNyCTEsYTIKKworCW1vdgkoZXhjZXB0aW9uX3RhYmxlLGEyKSxhMgorCWNhbGxzCShhMikKKwlqbXAJcmV0X2Zyb21fZXhjZXB0aW9uCisKKzE6CXBpCQkJCSMgQlVHKCkgZXF1aXZhbGVudAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEV4Y2VwdGlvbiBoYW5kbGVyIGZ1bmN0aW9ucyB0YWJsZQorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCS5kYXRhCitFTlRSWShleGNlcHRpb25fdGFibGUpCisJLnJlcHQJMHg0MDA+PjEKKwkgLmxvbmcJdW5pbml0aWFsaXNlZF9leGNlcHRpb24KKwkuZW5kcgorCS5wcmV2aW91cworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIENoYW5nZSBhbiBlbnRyeSBpbiB0aGUgZXhjZXB0aW9uIHRhYmxlCisjIC0gRDAgZXhjZXB0aW9uIGNvZGUsIEQxIGhhbmRsZXIKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK0VOVFJZKHNldF9leGNwX3ZlY3RvcikKKwlsc3IJMSxkMAorCWFkZAlleGNlcHRpb25fdGFibGUsZDAKKwltb3YJZDEsKGQwKQorCW1vdgk0LGQxCisjaWYgZGVmaW5lZChDT05GSUdfTU4xMDMwMF9DQUNIRV9XQkFDSykKKwlqbXAJbW4xMDMwMF9kY2FjaGVfZmx1c2hfaW52X3JhbmdlMgorI2Vsc2UKKwlyZXQJW10sMAorI2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU3lzdGVtIGNhbGwgdGFibGUKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkuZGF0YQorRU5UUlkoc3lzX2NhbGxfdGFibGUpCisJLmxvbmcgc3lzX3Jlc3RhcnRfc3lzY2FsbAkvKiAwICovCisJLmxvbmcgc3lzX2V4aXQKKwkubG9uZyBzeXNfZm9yaworCS5sb25nIHN5c19yZWFkCisJLmxvbmcgc3lzX3dyaXRlCisJLmxvbmcgc3lzX29wZW4JCS8qIDUgKi8KKwkubG9uZyBzeXNfY2xvc2UKKwkubG9uZyBzeXNfd2FpdHBpZAorCS5sb25nIHN5c19jcmVhdAorCS5sb25nIHN5c19saW5rCisJLmxvbmcgc3lzX3VubGluawkvKiAxMCAqLworCS5sb25nIHN5c19leGVjdmUKKwkubG9uZyBzeXNfY2hkaXIKKwkubG9uZyBzeXNfdGltZQorCS5sb25nIHN5c19ta25vZAorCS5sb25nIHN5c19jaG1vZAkJLyogMTUgKi8KKwkubG9uZyBzeXNfbGNob3duMTYKKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBvbGQgYnJlYWsgc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBzeXNfc3RhdAorCS5sb25nIHN5c19sc2VlaworCS5sb25nIHN5c19nZXRwaWQJLyogMjAgKi8KKwkubG9uZyBzeXNfbW91bnQKKwkubG9uZyBzeXNfb2xkdW1vdW50CisJLmxvbmcgc3lzX3NldHVpZDE2CisJLmxvbmcgc3lzX2dldHVpZDE2CisJLmxvbmcgc3lzX3N0aW1lCQkvKiAyNSAqLworCS5sb25nIHN5c19wdHJhY2UKKwkubG9uZyBzeXNfYWxhcm0KKwkubG9uZyBzeXNfZnN0YXQKKwkubG9uZyBzeXNfcGF1c2UKKwkubG9uZyBzeXNfdXRpbWUJCS8qIDMwICovCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogb2xkIHN0dHkgc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBvbGQgZ3R0eSBzeXNjYWxsIGhvbGRlciAqLworCS5sb25nIHN5c19hY2Nlc3MKKwkubG9uZyBzeXNfbmljZQorCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIDM1IC0gb2xkIGZ0aW1lIHN5c2NhbGwgaG9sZGVyICovCisJLmxvbmcgc3lzX3N5bmMKKwkubG9uZyBzeXNfa2lsbAorCS5sb25nIHN5c19yZW5hbWUKKwkubG9uZyBzeXNfbWtkaXIKKwkubG9uZyBzeXNfcm1kaXIJCS8qIDQwICovCisJLmxvbmcgc3lzX2R1cAorCS5sb25nIHN5c19waXBlCisJLmxvbmcgc3lzX3RpbWVzCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogb2xkIHByb2Ygc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBzeXNfYnJrCQkvKiA0NSAqLworCS5sb25nIHN5c19zZXRnaWQxNgorCS5sb25nIHN5c19nZXRnaWQxNgorCS5sb25nIHN5c19zaWduYWwKKwkubG9uZyBzeXNfZ2V0ZXVpZDE2CisJLmxvbmcgc3lzX2dldGVnaWQxNgkvKiA1MCAqLworCS5sb25nIHN5c19hY2N0CisJLmxvbmcgc3lzX3Vtb3VudAkvKiByZWN5Y2xlZCBuZXZlciB1c2VkIHBoeXMoKSAqLworCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCBsb2NrIHN5c2NhbGwgaG9sZGVyICovCisJLmxvbmcgc3lzX2lvY3RsCisJLmxvbmcgc3lzX2ZjbnRsCQkvKiA1NSAqLworCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCBtcHggc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBzeXNfc2V0cGdpZAorCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCB1bGltaXQgc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBvbGQgc3lzX29sZHVuYW1lICovCisJLmxvbmcgc3lzX3VtYXNrCQkvKiA2MCAqLworCS5sb25nIHN5c19jaHJvb3QKKwkubG9uZyBzeXNfdXN0YXQKKwkubG9uZyBzeXNfZHVwMgorCS5sb25nIHN5c19nZXRwcGlkCisJLmxvbmcgc3lzX2dldHBncnAJLyogNjUgKi8KKwkubG9uZyBzeXNfc2V0c2lkCisJLmxvbmcgc3lzX3NpZ2FjdGlvbgorCS5sb25nIHN5c19zZ2V0bWFzaworCS5sb25nIHN5c19zc2V0bWFzaworCS5sb25nIHN5c19zZXRyZXVpZDE2CS8qIDcwICovCisJLmxvbmcgc3lzX3NldHJlZ2lkMTYKKwkubG9uZyBzeXNfc2lnc3VzcGVuZAorCS5sb25nIHN5c19zaWdwZW5kaW5nCisJLmxvbmcgc3lzX3NldGhvc3RuYW1lCisJLmxvbmcgc3lzX3NldHJsaW1pdAkvKiA3NSAqLworCS5sb25nIHN5c19vbGRfZ2V0cmxpbWl0CisJLmxvbmcgc3lzX2dldHJ1c2FnZQorCS5sb25nIHN5c19nZXR0aW1lb2ZkYXkKKwkubG9uZyBzeXNfc2V0dGltZW9mZGF5CisJLmxvbmcgc3lzX2dldGdyb3VwczE2CS8qIDgwICovCisJLmxvbmcgc3lzX3NldGdyb3VwczE2CisJLmxvbmcgb2xkX3NlbGVjdAorCS5sb25nIHN5c19zeW1saW5rCisJLmxvbmcgc3lzX2xzdGF0CisJLmxvbmcgc3lzX3JlYWRsaW5rCS8qIDg1ICovCisJLmxvbmcgc3lzX3VzZWxpYgorCS5sb25nIHN5c19zd2Fwb24KKwkubG9uZyBzeXNfcmVib290CisJLmxvbmcgb2xkX3JlYWRkaXIKKwkubG9uZyBvbGRfbW1hcAkJLyogOTAgKi8KKwkubG9uZyBzeXNfbXVubWFwCisJLmxvbmcgc3lzX3RydW5jYXRlCisJLmxvbmcgc3lzX2Z0cnVuY2F0ZQorCS5sb25nIHN5c19mY2htb2QKKwkubG9uZyBzeXNfZmNob3duMTYJLyogOTUgKi8KKwkubG9uZyBzeXNfZ2V0cHJpb3JpdHkKKwkubG9uZyBzeXNfc2V0cHJpb3JpdHkKKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBvbGQgcHJvZmlsIHN5c2NhbGwgaG9sZGVyICovCisJLmxvbmcgc3lzX3N0YXRmcworCS5sb25nIHN5c19mc3RhdGZzCS8qIDEwMCAqLworCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIGlvcGVybSAqLworCS5sb25nIHN5c19zb2NrZXRjYWxsCisJLmxvbmcgc3lzX3N5c2xvZworCS5sb25nIHN5c19zZXRpdGltZXIKKwkubG9uZyBzeXNfZ2V0aXRpbWVyCS8qIDEwNSAqLworCS5sb25nIHN5c19uZXdzdGF0CisJLmxvbmcgc3lzX25ld2xzdGF0CisJLmxvbmcgc3lzX25ld2ZzdGF0CisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogb2xkIHN5c191bmFtZSAqLworCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIDExMCAtIGlvcGwgKi8KKwkubG9uZyBzeXNfdmhhbmd1cAorCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCAiaWRsZSIgc3lzdGVtIGNhbGwgKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiB2bTg2b2xkICovCisJLmxvbmcgc3lzX3dhaXQ0CisJLmxvbmcgc3lzX3N3YXBvZmYJLyogMTE1ICovCisJLmxvbmcgc3lzX3N5c2luZm8KKwkubG9uZyBzeXNfaXBjCisJLmxvbmcgc3lzX2ZzeW5jCisJLmxvbmcgc3lzX3NpZ3JldHVybgorCS5sb25nIHN5c19jbG9uZQkJLyogMTIwICovCisJLmxvbmcgc3lzX3NldGRvbWFpbm5hbWUKKwkubG9uZyBzeXNfbmV3dW5hbWUKKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBtb2RpZnlfbGR0ICovCisJLmxvbmcgc3lzX2FkanRpbWV4CisJLmxvbmcgc3lzX21wcm90ZWN0CS8qIDEyNSAqLworCS5sb25nIHN5c19zaWdwcm9jbWFzaworCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCAiY3JlYXRlX21vZHVsZSIgKi8KKwkubG9uZyBzeXNfaW5pdF9tb2R1bGUKKwkubG9uZyBzeXNfZGVsZXRlX21vZHVsZQorCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIDEzMDoJb2xkICJnZXRfa2VybmVsX3N5bXMiICovCisJLmxvbmcgc3lzX3F1b3RhY3RsCisJLmxvbmcgc3lzX2dldHBnaWQKKwkubG9uZyBzeXNfZmNoZGlyCisJLmxvbmcgc3lzX2JkZmx1c2gKKwkubG9uZyBzeXNfc3lzZnMJCS8qIDEzNSAqLworCS5sb25nIHN5c19wZXJzb25hbGl0eQorCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIHJlc2VydmVkIGZvciBhZnNfc3lzY2FsbCAqLworCS5sb25nIHN5c19zZXRmc3VpZDE2CisJLmxvbmcgc3lzX3NldGZzZ2lkMTYKKwkubG9uZyBzeXNfbGxzZWVrCS8qIDE0MCAqLworCS5sb25nIHN5c19nZXRkZW50cworCS5sb25nIHN5c19zZWxlY3QKKwkubG9uZyBzeXNfZmxvY2sKKwkubG9uZyBzeXNfbXN5bmMKKwkubG9uZyBzeXNfcmVhZHYJCS8qIDE0NSAqLworCS5sb25nIHN5c193cml0ZXYKKwkubG9uZyBzeXNfZ2V0c2lkCisJLmxvbmcgc3lzX2ZkYXRhc3luYworCS5sb25nIHN5c19zeXNjdGwKKwkubG9uZyBzeXNfbWxvY2sJCS8qIDE1MCAqLworCS5sb25nIHN5c19tdW5sb2NrCisJLmxvbmcgc3lzX21sb2NrYWxsCisJLmxvbmcgc3lzX211bmxvY2thbGwKKwkubG9uZyBzeXNfc2NoZWRfc2V0cGFyYW0KKwkubG9uZyBzeXNfc2NoZWRfZ2V0cGFyYW0gICAvKiAxNTUgKi8KKwkubG9uZyBzeXNfc2NoZWRfc2V0c2NoZWR1bGVyCisJLmxvbmcgc3lzX3NjaGVkX2dldHNjaGVkdWxlcgorCS5sb25nIHN5c19zY2hlZF95aWVsZAorCS5sb25nIHN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWF4CisJLmxvbmcgc3lzX3NjaGVkX2dldF9wcmlvcml0eV9taW4gIC8qIDE2MCAqLworCS5sb25nIHN5c19zY2hlZF9ycl9nZXRfaW50ZXJ2YWwKKwkubG9uZyBzeXNfbmFub3NsZWVwCisJLmxvbmcgc3lzX21yZW1hcAorCS5sb25nIHN5c19zZXRyZXN1aWQxNgorCS5sb25nIHN5c19nZXRyZXN1aWQxNgkvKiAxNjUgKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiB2bTg2ICovCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogT2xkIHN5c19xdWVyeV9tb2R1bGUgKi8KKwkubG9uZyBzeXNfcG9sbAorCS5sb25nIHN5c19uZnNzZXJ2Y3RsCisJLmxvbmcgc3lzX3NldHJlc2dpZDE2CS8qIDE3MCAqLworCS5sb25nIHN5c19nZXRyZXNnaWQxNgorCS5sb25nIHN5c19wcmN0bAorCS5sb25nIHN5c19ydF9zaWdyZXR1cm4KKwkubG9uZyBzeXNfcnRfc2lnYWN0aW9uCisJLmxvbmcgc3lzX3J0X3NpZ3Byb2NtYXNrCS8qIDE3NSAqLworCS5sb25nIHN5c19ydF9zaWdwZW5kaW5nCisJLmxvbmcgc3lzX3J0X3NpZ3RpbWVkd2FpdAorCS5sb25nIHN5c19ydF9zaWdxdWV1ZWluZm8KKwkubG9uZyBzeXNfcnRfc2lnc3VzcGVuZAorCS5sb25nIHN5c19wcmVhZDY0CS8qIDE4MCAqLworCS5sb25nIHN5c19wd3JpdGU2NAorCS5sb25nIHN5c19jaG93bjE2CisJLmxvbmcgc3lzX2dldGN3ZAorCS5sb25nIHN5c19jYXBnZXQKKwkubG9uZyBzeXNfY2Fwc2V0CS8qIDE4NSAqLworCS5sb25nIHN5c19zaWdhbHRzdGFjaworCS5sb25nIHN5c19zZW5kZmlsZQorCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIHJlc2VydmVkIGZvciBzdHJlYW1zMSAqLworCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIHJlc2VydmVkIGZvciBzdHJlYW1zMiAqLworCS5sb25nIHN5c192Zm9yawkJLyogMTkwICovCisJLmxvbmcgc3lzX2dldHJsaW1pdAorCS5sb25nIHN5c19tbWFwMgorCS5sb25nIHN5c190cnVuY2F0ZTY0CisJLmxvbmcgc3lzX2Z0cnVuY2F0ZTY0CisJLmxvbmcgc3lzX3N0YXQ2NAkvKiAxOTUgKi8KKwkubG9uZyBzeXNfbHN0YXQ2NAorCS5sb25nIHN5c19mc3RhdDY0CisJLmxvbmcgc3lzX2xjaG93bgorCS5sb25nIHN5c19nZXR1aWQKKwkubG9uZyBzeXNfZ2V0Z2lkCS8qIDIwMCAqLworCS5sb25nIHN5c19nZXRldWlkCisJLmxvbmcgc3lzX2dldGVnaWQKKwkubG9uZyBzeXNfc2V0cmV1aWQKKwkubG9uZyBzeXNfc2V0cmVnaWQKKwkubG9uZyBzeXNfZ2V0Z3JvdXBzCS8qIDIwNSAqLworCS5sb25nIHN5c19zZXRncm91cHMKKwkubG9uZyBzeXNfZmNob3duCisJLmxvbmcgc3lzX3NldHJlc3VpZAorCS5sb25nIHN5c19nZXRyZXN1aWQKKwkubG9uZyBzeXNfc2V0cmVzZ2lkCS8qIDIxMCAqLworCS5sb25nIHN5c19nZXRyZXNnaWQKKwkubG9uZyBzeXNfY2hvd24KKwkubG9uZyBzeXNfc2V0dWlkCisJLmxvbmcgc3lzX3NldGdpZAorCS5sb25nIHN5c19zZXRmc3VpZAkvKiAyMTUgKi8KKwkubG9uZyBzeXNfc2V0ZnNnaWQKKwkubG9uZyBzeXNfcGl2b3Rfcm9vdAorCS5sb25nIHN5c19taW5jb3JlCisJLmxvbmcgc3lzX21hZHZpc2UKKwkubG9uZyBzeXNfZ2V0ZGVudHM2NAkvKiAyMjAgKi8KKwkubG9uZyBzeXNfZmNudGw2NAorCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIHJlc2VydmVkIGZvciBUVVggKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAorCS5sb25nIHN5c19nZXR0aWQKKwkubG9uZyBzeXNfcmVhZGFoZWFkCS8qIDIyNSAqLworCS5sb25nIHN5c19zZXR4YXR0cgorCS5sb25nIHN5c19sc2V0eGF0dHIKKwkubG9uZyBzeXNfZnNldHhhdHRyCisJLmxvbmcgc3lzX2dldHhhdHRyCisJLmxvbmcgc3lzX2xnZXR4YXR0cgkvKiAyMzAgKi8KKwkubG9uZyBzeXNfZmdldHhhdHRyCisJLmxvbmcgc3lzX2xpc3R4YXR0cgorCS5sb25nIHN5c19sbGlzdHhhdHRyCisJLmxvbmcgc3lzX2ZsaXN0eGF0dHIKKwkubG9uZyBzeXNfcmVtb3ZleGF0dHIJLyogMjM1ICovCisJLmxvbmcgc3lzX2xyZW1vdmV4YXR0cgorCS5sb25nIHN5c19mcmVtb3ZleGF0dHIKKwkubG9uZyBzeXNfdGtpbGwKKwkubG9uZyBzeXNfc2VuZGZpbGU2NAorCS5sb25nIHN5c19mdXRleAkJLyogMjQwICovCisJLmxvbmcgc3lzX3NjaGVkX3NldGFmZmluaXR5CisJLmxvbmcgc3lzX3NjaGVkX2dldGFmZmluaXR5CisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogc3lzX3NldF90aHJlYWRfYXJlYSAqLworCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIHN5c19nZXRfdGhyZWFkX2FyZWEgKi8KKwkubG9uZyBzeXNfaW9fc2V0dXAJLyogMjQ1ICovCisJLmxvbmcgc3lzX2lvX2Rlc3Ryb3kKKwkubG9uZyBzeXNfaW9fZ2V0ZXZlbnRzCisJLmxvbmcgc3lzX2lvX3N1Ym1pdAorCS5sb25nIHN5c19pb19jYW5jZWwKKwkubG9uZyBzeXNfZmFkdmlzZTY0CS8qIDI1MCAqLworCS5sb25nIHN5c19uaV9zeXNjYWxsCisJLmxvbmcgc3lzX2V4aXRfZ3JvdXAKKwkubG9uZyBzeXNfbG9va3VwX2Rjb29raWUKKwkubG9uZyBzeXNfZXBvbGxfY3JlYXRlCisJLmxvbmcgc3lzX2Vwb2xsX2N0bAkvKiAyNTUgKi8KKwkubG9uZyBzeXNfZXBvbGxfd2FpdAorIAkubG9uZyBzeXNfcmVtYXBfZmlsZV9wYWdlcworIAkubG9uZyBzeXNfc2V0X3RpZF9hZGRyZXNzCisgCS5sb25nIHN5c190aW1lcl9jcmVhdGUKKyAJLmxvbmcgc3lzX3RpbWVyX3NldHRpbWUJCS8qIDI2MCAqLworIAkubG9uZyBzeXNfdGltZXJfZ2V0dGltZQorIAkubG9uZyBzeXNfdGltZXJfZ2V0b3ZlcnJ1bgorIAkubG9uZyBzeXNfdGltZXJfZGVsZXRlCisgCS5sb25nIHN5c19jbG9ja19zZXR0aW1lCisgCS5sb25nIHN5c19jbG9ja19nZXR0aW1lCQkvKiAyNjUgKi8KKyAJLmxvbmcgc3lzX2Nsb2NrX2dldHJlcworIAkubG9uZyBzeXNfY2xvY2tfbmFub3NsZWVwCisJLmxvbmcgc3lzX3N0YXRmczY0CisJLmxvbmcgc3lzX2ZzdGF0ZnM2NAorCS5sb25nIHN5c190Z2tpbGwJCS8qIDI3MCAqLworCS5sb25nIHN5c191dGltZXMKKyAJLmxvbmcgc3lzX2ZhZHZpc2U2NF82NAorCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIHN5c192c2VydmVyICovCisJLmxvbmcgc3lzX21iaW5kCisJLmxvbmcgc3lzX2dldF9tZW1wb2xpY3kJCS8qIDI3NSAqLworCS5sb25nIHN5c19zZXRfbWVtcG9saWN5CisJLmxvbmcgc3lzX21xX29wZW4KKwkubG9uZyBzeXNfbXFfdW5saW5rCisJLmxvbmcgc3lzX21xX3RpbWVkc2VuZAorCS5sb25nIHN5c19tcV90aW1lZHJlY2VpdmUJLyogMjgwICovCisJLmxvbmcgc3lzX21xX25vdGlmeQorCS5sb25nIHN5c19tcV9nZXRzZXRhdHRyCisJLmxvbmcgc3lzX2tleGVjX2xvYWQKKwkubG9uZyBzeXNfd2FpdGlkCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJCS8qIDI4NSAqLyAvKiBhdmFpbGFibGUgKi8KKwkubG9uZyBzeXNfYWRkX2tleQorCS5sb25nIHN5c19yZXF1ZXN0X2tleQorCS5sb25nIHN5c19rZXljdGwKKwkubG9uZyBzeXNfY2FjaGVmbHVzaAorCS5sb25nIHN5c19pb3ByaW9fc2V0CQkvKiAyOTAgKi8KKwkubG9uZyBzeXNfaW9wcmlvX2dldAorCS5sb25nIHN5c19pbm90aWZ5X2luaXQKKwkubG9uZyBzeXNfaW5vdGlmeV9hZGRfd2F0Y2gKKwkubG9uZyBzeXNfaW5vdGlmeV9ybV93YXRjaAorCS5sb25nIHN5c19taWdyYXRlX3BhZ2VzCQkvKiAyOTUgKi8KKwkubG9uZyBzeXNfb3BlbmF0CisJLmxvbmcgc3lzX21rZGlyYXQKKwkubG9uZyBzeXNfbWtub2RhdAorCS5sb25nIHN5c19mY2hvd25hdAorCS5sb25nIHN5c19mdXRpbWVzYXQJCS8qIDMwMCAqLworCS5sb25nIHN5c19mc3RhdGF0NjQKKwkubG9uZyBzeXNfdW5saW5rYXQKKwkubG9uZyBzeXNfcmVuYW1lYXQKKwkubG9uZyBzeXNfbGlua2F0CisJLmxvbmcgc3lzX3N5bWxpbmthdAkJLyogMzA1ICovCisJLmxvbmcgc3lzX3JlYWRsaW5rYXQKKwkubG9uZyBzeXNfZmNobW9kYXQKKwkubG9uZyBzeXNfZmFjY2Vzc2F0CisJLmxvbmcgc3lzX3BzZWxlY3Q2CisJLmxvbmcgc3lzX3Bwb2xsCQkJLyogMzEwICovCisJLmxvbmcgc3lzX3Vuc2hhcmUKKwkubG9uZyBzeXNfc2V0X3JvYnVzdF9saXN0CisJLmxvbmcgc3lzX2dldF9yb2J1c3RfbGlzdAorCS5sb25nIHN5c19zcGxpY2UKKwkubG9uZyBzeXNfc3luY19maWxlX3JhbmdlCS8qIDMxNSAqLworCS5sb25nIHN5c190ZWUKKwkubG9uZyBzeXNfdm1zcGxpY2UKKwkubG9uZyBzeXNfbW92ZV9wYWdlcworCS5sb25nIHN5c19nZXRjcHUKKwkubG9uZyBzeXNfZXBvbGxfcHdhaXQJCS8qIDMyMCAqLworCS5sb25nIHN5c191dGltZW5zYXQKKwkubG9uZyBzeXNfc2lnbmFsZmQKKwkubG9uZyBzeXNfdGltZXJmZF9jcmVhdGUKKwkubG9uZyBzeXNfZXZlbnRmZAorCS5sb25nIHN5c19mYWxsb2NhdGUJCS8qIDMyNSAqLworCS5sb25nIHN5c190aW1lcmZkX3NldHRpbWUKKwkubG9uZyBzeXNfdGltZXJmZF9nZXR0aW1lCisKKworbnJfc3lzY2FsbHM9KC4tc3lzX2NhbGxfdGFibGUpLzQKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvZnB1LWxvdy5TIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9mcHUtbG93LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZjZmQ0NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvZnB1LWxvdy5TCkBAIC0wLDAgKzEsMTk3IEBACisvKiBNTjEwMzAwIExvdyBsZXZlbCBGUFUgbWFuYWdlbWVudCBvcGVyYXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8YXNtL2NwdS1yZWdzLmg+CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgdm9pZCBmcHVfaW5pdF9zdGF0ZSh2b2lkKQorIyAtIGluaXRpYWxpc2UgdGhlIEZQVQorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCS5nbG9ibAlmcHVfaW5pdF9zdGF0ZQorCS50eXBlCWZwdV9pbml0X3N0YXRlLEBmdW5jdGlvbgorZnB1X2luaXRfc3RhdGU6CisJbW92CWVwc3csZDAKKwlvcglFUFNXX0ZFLGVwc3cKKworI2lmZGVmIENPTkZJR19NTjEwMzAwX1BST0NfTU4xMDNFMDEwCisJbm9wCisJbm9wCisJbm9wCisjZW5kaWYKKwlmbW92CTAsZnMwCisJZm1vdglmczAsZnMxCisJZm1vdglmczAsZnMyCisJZm1vdglmczAsZnMzCisJZm1vdglmczAsZnM0CisJZm1vdglmczAsZnM1CisJZm1vdglmczAsZnM2CisJZm1vdglmczAsZnM3CisJZm1vdglmczAsZnM4CisJZm1vdglmczAsZnM5CisJZm1vdglmczAsZnMxMAorCWZtb3YJZnMwLGZzMTEKKwlmbW92CWZzMCxmczEyCisJZm1vdglmczAsZnMxMworCWZtb3YJZnMwLGZzMTQKKwlmbW92CWZzMCxmczE1CisJZm1vdglmczAsZnMxNgorCWZtb3YJZnMwLGZzMTcKKwlmbW92CWZzMCxmczE4CisJZm1vdglmczAsZnMxOQorCWZtb3YJZnMwLGZzMjAKKwlmbW92CWZzMCxmczIxCisJZm1vdglmczAsZnMyMgorCWZtb3YJZnMwLGZzMjMKKwlmbW92CWZzMCxmczI0CisJZm1vdglmczAsZnMyNQorCWZtb3YJZnMwLGZzMjYKKwlmbW92CWZzMCxmczI3CisJZm1vdglmczAsZnMyOAorCWZtb3YJZnMwLGZzMjkKKwlmbW92CWZzMCxmczMwCisJZm1vdglmczAsZnMzMQorCWZtb3YJRlBDUl9JTklULGZwY3IKKworI2lmZGVmIENPTkZJR19NTjEwMzAwX1BST0NfTU4xMDNFMDEwCisJbm9wCisJbm9wCisJbm9wCisjZW5kaWYKKwltb3YJZDAsZXBzdworCXJldAlbXSwwCisKKwkuc2l6ZQlmcHVfaW5pdF9zdGF0ZSwuLWZwdV9pbml0X3N0YXRlCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgdm9pZCBmcHVfc2F2ZShzdHJ1Y3QgZnB1X3N0YXRlX3N0cnVjdCAqKQorIyAtIHNhdmUgdGhlIGZwdSBzdGF0ZQorIyAtIG5vdGUgdGhhdCBhbiBGUFUgT3BlcmF0aW9uYWwgZXhjZXB0aW9uIG1pZ2h0IG9jY3VyIGR1cmluZyB0aGlzIHByb2Nlc3MKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkuZ2xvYmwJZnB1X3NhdmUKKwkudHlwZQlmcHVfc2F2ZSxAZnVuY3Rpb24KK2ZwdV9zYXZlOgorCW1vdgllcHN3LGQxCisJb3IJRVBTV19GRSxlcHN3CQkvKiBlbmFibGUgdGhlIEZQVSBzbyB3ZSBjYW4gYWNjZXNzIGl0ICovCisKKyNpZmRlZiBDT05GSUdfTU4xMDMwMF9QUk9DX01OMTAzRTAxMAorCW5vcAorCW5vcAorI2VuZGlmCisJbW92CWQwLGEwCisJZm1vdglmczAsKGEwKykKKwlmbW92CWZzMSwoYTArKQorCWZtb3YJZnMyLChhMCspCisJZm1vdglmczMsKGEwKykKKwlmbW92CWZzNCwoYTArKQorCWZtb3YJZnM1LChhMCspCisJZm1vdglmczYsKGEwKykKKwlmbW92CWZzNywoYTArKQorCWZtb3YJZnM4LChhMCspCisJZm1vdglmczksKGEwKykKKwlmbW92CWZzMTAsKGEwKykKKwlmbW92CWZzMTEsKGEwKykKKwlmbW92CWZzMTIsKGEwKykKKwlmbW92CWZzMTMsKGEwKykKKwlmbW92CWZzMTQsKGEwKykKKwlmbW92CWZzMTUsKGEwKykKKwlmbW92CWZzMTYsKGEwKykKKwlmbW92CWZzMTcsKGEwKykKKwlmbW92CWZzMTgsKGEwKykKKwlmbW92CWZzMTksKGEwKykKKwlmbW92CWZzMjAsKGEwKykKKwlmbW92CWZzMjEsKGEwKykKKwlmbW92CWZzMjIsKGEwKykKKwlmbW92CWZzMjMsKGEwKykKKwlmbW92CWZzMjQsKGEwKykKKwlmbW92CWZzMjUsKGEwKykKKwlmbW92CWZzMjYsKGEwKykKKwlmbW92CWZzMjcsKGEwKykKKwlmbW92CWZzMjgsKGEwKykKKwlmbW92CWZzMjksKGEwKykKKwlmbW92CWZzMzAsKGEwKykKKwlmbW92CWZzMzEsKGEwKykKKwlmbW92CWZwY3IsZDAKKwltb3YJZDAsKGEwKQorI2lmZGVmIENPTkZJR19NTjEwMzAwX1BST0NfTU4xMDNFMDEwCisJbm9wCisJbm9wCisjZW5kaWYKKworCW1vdglkMSxlcHN3CisJcmV0CVtdLDAKKworCS5zaXplCWZwdV9zYXZlLC4tZnB1X3NhdmUKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB2b2lkIGZwdV9yZXN0b3JlKHN0cnVjdCBmcHVfc3RhdGVfc3RydWN0ICopCisjIC0gcmVzdG9yZSB0aGUgZnB1IHN0YXRlCisjIC0gbm90ZSB0aGF0IGFuIEZQVSBPcGVyYXRpb25hbCBleGNlcHRpb24gbWlnaHQgb2NjdXIgZHVyaW5nIHRoaXMgcHJvY2VzcworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCS5nbG9ibAlmcHVfcmVzdG9yZQorCS50eXBlCWZwdV9yZXN0b3JlLEBmdW5jdGlvbgorZnB1X3Jlc3RvcmU6CisJbW92CWVwc3csZDEKKwlvcglFUFNXX0ZFLGVwc3cJCS8qIGVuYWJsZSB0aGUgRlBVIHNvIHdlIGNhbiBhY2Nlc3MgaXQgKi8KKworI2lmZGVmIENPTkZJR19NTjEwMzAwX1BST0NfTU4xMDNFMDEwCisJbm9wCisJbm9wCisjZW5kaWYKKwltb3YJZDAsYTAKKwlmbW92CShhMCspLGZzMAorCWZtb3YJKGEwKyksZnMxCisJZm1vdgkoYTArKSxmczIKKwlmbW92CShhMCspLGZzMworCWZtb3YJKGEwKyksZnM0CisJZm1vdgkoYTArKSxmczUKKwlmbW92CShhMCspLGZzNgorCWZtb3YJKGEwKyksZnM3CisJZm1vdgkoYTArKSxmczgKKwlmbW92CShhMCspLGZzOQorCWZtb3YJKGEwKyksZnMxMAorCWZtb3YJKGEwKyksZnMxMQorCWZtb3YJKGEwKyksZnMxMgorCWZtb3YJKGEwKyksZnMxMworCWZtb3YJKGEwKyksZnMxNAorCWZtb3YJKGEwKyksZnMxNQorCWZtb3YJKGEwKyksZnMxNgorCWZtb3YJKGEwKyksZnMxNworCWZtb3YJKGEwKyksZnMxOAorCWZtb3YJKGEwKyksZnMxOQorCWZtb3YJKGEwKyksZnMyMAorCWZtb3YJKGEwKyksZnMyMQorCWZtb3YJKGEwKyksZnMyMgorCWZtb3YJKGEwKyksZnMyMworCWZtb3YJKGEwKyksZnMyNAorCWZtb3YJKGEwKyksZnMyNQorCWZtb3YJKGEwKyksZnMyNgorCWZtb3YJKGEwKyksZnMyNworCWZtb3YJKGEwKyksZnMyOAorCWZtb3YJKGEwKyksZnMyOQorCWZtb3YJKGEwKyksZnMzMAorCWZtb3YJKGEwKyksZnMzMQorCW1vdgkoYTApLGQwCisJZm1vdglkMCxmcGNyCisjaWZkZWYgQ09ORklHX01OMTAzMDBfUFJPQ19NTjEwM0UwMTAKKwlub3AKKwlub3AKKwlub3AKKyNlbmRpZgorCisJbW92CWQxLGVwc3cKKwlyZXQJW10sMAorCisJLnNpemUJZnB1X3Jlc3RvcmUsLi1mcHVfcmVzdG9yZQpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9mcHUuYyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvZnB1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcwNWYyNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvZnB1LmMKQEAgLTAsMCArMSwyMjMgQEAKKy8qIE1OMTAzMDAgRlBVIG1hbmFnZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9mcHUuaD4KKyNpbmNsdWRlIDxhc20vZWxmLmg+CisjaW5jbHVkZSA8YXNtL2V4Y2VwdGlvbnMuaD4KKworc3RydWN0IHRhc2tfc3RydWN0ICpmcHVfc3RhdGVfb3duZXI7CisKKy8qCisgKiBoYW5kbGUgYW4gZXhjZXB0aW9uIGR1ZSB0byB0aGUgRlBVIGJlaW5nIGRpc2FibGVkCisgKi8KK2FzbWxpbmthZ2Ugdm9pZCBmcHVfZGlzYWJsZWQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGVudW0gZXhjZXB0aW9uX2NvZGUgY29kZSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisKKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkKKwkJZGllX2lmX25vX2ZpeHVwKCJBbiBGUFUgRGlzYWJsZWQgZXhjZXB0aW9uIGhhcHBlbmVkIGluIgorCQkJCSIga2VybmVsIHNwYWNlXG4iLAorCQkJCXJlZ3MsIGNvZGUpOworCisjaWZkZWYgQ09ORklHX0ZQVQorCXByZWVtcHRfZGlzYWJsZSgpOworCisJLyogdHJhbnNmZXIgdGhlIGxhc3QgcHJvY2VzcydzIEZQVSBzdGF0ZSB0byBtZW1vcnkgKi8KKwlpZiAoZnB1X3N0YXRlX293bmVyKSB7CisJCWZwdV9zYXZlKCZmcHVfc3RhdGVfb3duZXItPnRocmVhZC5mcHVfc3RhdGUpOworCQlmcHVfc3RhdGVfb3duZXItPnRocmVhZC51cmVncy0+ZXBzdyAmPSB+RVBTV19GRTsKKwl9CisKKwkvKiB0aGUgY3VycmVudCBwcm9jZXNzIG5vdyBvd25zIHRoZSBGUFUgc3RhdGUgKi8KKwlmcHVfc3RhdGVfb3duZXIgPSB0c2s7CisJcmVncy0+ZXBzdyB8PSBFUFNXX0ZFOworCisJLyogbG9hZCB0aGUgRlBVIHdpdGggdGhlIGN1cnJlbnQgcHJvY2VzcydzIEZQVSBzdGF0ZSBvciBpbnZlbnQgYSBuZXcKKwkgKiBjbGVhbiBvbmUgaWYgdGhlIHByb2Nlc3MgZG9lc24ndCBoYXZlIG9uZSAqLworCWlmIChpc191c2luZ19mcHUodHNrKSkgeworCQlmcHVfcmVzdG9yZSgmdHNrLT50aHJlYWQuZnB1X3N0YXRlKTsKKwl9IGVsc2UgeworCQlmcHVfaW5pdF9zdGF0ZSgpOworCQlzZXRfdXNpbmdfZnB1KHRzayk7CisJfQorCisJcHJlZW1wdF9lbmFibGUoKTsKKyNlbHNlCisJeworCQlzaWdpbmZvX3QgaW5mbzsKKworCQlpbmZvLnNpX3NpZ25vID0gU0lHRlBFOworCQlpbmZvLnNpX2Vycm5vID0gMDsKKwkJaW5mby5zaV9hZGRyID0gKHZvaWQgKikgdHNrLT50aHJlYWQudXJlZ3MtPnBjOworCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUSU5WOworCisJCWZvcmNlX3NpZ19pbmZvKFNJR0ZQRSwgJmluZm8sIHRzayk7CisJfQorI2VuZGlmICAvKiBDT05GSUdfRlBVICovCit9CisKKy8qCisgKiBoYW5kbGUgYW4gRlBVIG9wZXJhdGlvbmFsIGV4Y2VwdGlvbgorICogLSB0aGVyZSdzIGEgcG9zc2liaWxpdHkgdGhhdCBpZiB0aGUgRlBVIGlzIGFzeW5jaHJvbm91cywgdGhlIHNpZ25hbCBtaWdodAorICogICBiZSBtZWFudCBmb3IgYSBwcm9jZXNzIG90aGVyIHRoYW4gdGhlIGN1cnJlbnQgb25lCisgKi8KK2FzbWxpbmthZ2Ugdm9pZCBmcHVfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBlbnVtIGV4Y2VwdGlvbl9jb2RlIGNvZGUpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBmcHVfc3RhdGVfb3duZXI7CisJc2lnaW5mb190IGluZm87CisKKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkKKwkJZGllX2lmX25vX2ZpeHVwKCJBbiBGUFUgT3BlcmF0aW9uIGV4Y2VwdGlvbiBoYXBwZW5lZCBpbiIKKwkJCQkiIGtlcm5lbCBzcGFjZVxuIiwKKwkJCQlyZWdzLCBjb2RlKTsKKworCWlmICghdHNrKQorCQlkaWVfaWZfbm9fZml4dXAoIkFuIEZQVSBPcGVyYXRpb24gZXhjZXB0aW9uIGhhcHBlbmVkLCIKKwkJCQkiIGJ1dCB0aGUgRlBVIGlzIG5vdCBpbiB1c2UiLAorCQkJCXJlZ3MsIGNvZGUpOworCisJaW5mby5zaV9zaWdubyA9IFNJR0ZQRTsKKwlpbmZvLnNpX2Vycm5vID0gMDsKKwlpbmZvLnNpX2FkZHIgPSAodm9pZCAqKSB0c2stPnRocmVhZC51cmVncy0+cGM7CisJaW5mby5zaV9jb2RlID0gRlBFX0ZMVElOVjsKKworI2lmZGVmIENPTkZJR19GUFUKKwl7CisJCXUzMiBmcGNyOworCisJCS8qIGdldCBGUENSICh3ZSBuZWVkIHRvIGVuYWJsZSB0aGUgRlBVIHdoaWxzdCB3ZSBkbyB0aGlzKSAqLworCQlhc20gdm9sYXRpbGUoIglvcgklMSxlcHN3CQlcbiIKKyNpZmRlZiBDT05GSUdfTU4xMDMwMF9QUk9DX01OMTAzRTAxMAorCQkJICAgICAiCW5vcAkJCVxuIgorCQkJICAgICAiCW5vcAkJCVxuIgorCQkJICAgICAiCW5vcAkJCVxuIgorI2VuZGlmCisJCQkgICAgICIJZm1vdglmcGNyLCUwCQlcbiIKKyNpZmRlZiBDT05GSUdfTU4xMDMwMF9QUk9DX01OMTAzRTAxMAorCQkJICAgICAiCW5vcAkJCVxuIgorCQkJICAgICAiCW5vcAkJCVxuIgorCQkJICAgICAiCW5vcAkJCVxuIgorI2VuZGlmCisJCQkgICAgICIJYW5kCSUyLGVwc3cJCVxuIgorCQkJICAgICA6ICI9JmQiKGZwY3IpCisJCQkgICAgIDogImkiKEVQU1dfRkUpLCAiaSIofkVQU1dfRkUpCisJCQkgICAgICk7CisKKwkJaWYgKGZwY3IgJiBGUENSX0VDX1opCisJCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxURElWOworCQllbHNlIGlmCShmcGNyICYgRlBDUl9FQ19PKQorCQkJaW5mby5zaV9jb2RlID0gRlBFX0ZMVE9WRjsKKwkJZWxzZSBpZgkoZnBjciAmIEZQQ1JfRUNfVSkKKwkJCWluZm8uc2lfY29kZSA9IEZQRV9GTFRVTkQ7CisJCWVsc2UgaWYJKGZwY3IgJiBGUENSX0VDX0kpCisJCQlpbmZvLnNpX2NvZGUgPSBGUEVfRkxUUkVTOworCX0KKyNlbmRpZgorCisJZm9yY2Vfc2lnX2luZm8oU0lHRlBFLCAmaW5mbywgdHNrKTsKK30KKworLyoKKyAqIHNhdmUgdGhlIEZQVSBzdGF0ZSB0byBhIHNpZ25hbCBjb250ZXh0CisgKi8KK2ludCBmcHVfc2V0dXBfc2lnY29udGV4dChzdHJ1Y3QgZnB1Y29udGV4dCAqZnB1Y29udGV4dCkKK3sKKyNpZmRlZiBDT05GSUdfRlBVCisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCisJaWYgKCFpc191c2luZ19mcHUodHNrKSkKKwkJcmV0dXJuIDA7CisKKwkvKiB0cmFuc2ZlciB0aGUgY3VycmVudCBGUFUgc3RhdGUgdG8gbWVtb3J5IGFuZCBjYXVzZSBmcHVfaW5pdCgpIHRvIGJlCisJICogdHJpZ2dlcmVkIGJ5IHRoZSBuZXh0IGF0dGVtcHRlZCBGUFUgb3BlcmF0aW9uIGJ5IHRoZSBjdXJyZW50CisJICogcHJvY2Vzcy4KKwkgKi8KKwlwcmVlbXB0X2Rpc2FibGUoKTsKKworCWlmIChmcHVfc3RhdGVfb3duZXIgPT0gdHNrKSB7CisJCWZwdV9zYXZlKCZ0c2stPnRocmVhZC5mcHVfc3RhdGUpOworCQlmcHVfc3RhdGVfb3duZXItPnRocmVhZC51cmVncy0+ZXBzdyAmPSB+RVBTV19GRTsKKwkJZnB1X3N0YXRlX293bmVyID0gTlVMTDsKKwl9CisKKwlwcmVlbXB0X2VuYWJsZSgpOworCisJLyogd2Ugbm8gbG9uZ2VyIGhhdmUgYSB2YWxpZCBjdXJyZW50IEZQVSBzdGF0ZSAqLworCWNsZWFyX3VzaW5nX2ZwdSh0c2spOworCisJLyogdHJhbnNmZXIgdGhlIHNhdmVkIEZQVSBzdGF0ZSBvbnRvIHRoZSB1c2Vyc3BhY2Ugc3RhY2sgKi8KKwlpZiAoY29weV90b191c2VyKGZwdWNvbnRleHQsCisJCQkgJnRzay0+dGhyZWFkLmZwdV9zdGF0ZSwKKwkJCSBtaW4oc2l6ZW9mKHN0cnVjdCBmcHVfc3RhdGVfc3RydWN0KSwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBmcHVjb250ZXh0KSkpKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMTsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworLyoKKyAqIGtpbGwgYSBwcm9jZXNzJ3MgRlBVIHN0YXRlIGR1cmluZyByZXN0b3JhdGlvbiBhZnRlciBzaWduYWwgaGFuZGxpbmcKKyAqLwordm9pZCBmcHVfa2lsbF9zdGF0ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKyNpZmRlZiBDT05GSUdfRlBVCisJLyogZGlzb3duIGFueXRoaW5nIGxlZnQgaW4gdGhlIEZQVSAqLworCXByZWVtcHRfZGlzYWJsZSgpOworCisJaWYgKGZwdV9zdGF0ZV9vd25lciA9PSB0c2spIHsKKwkJZnB1X3N0YXRlX293bmVyLT50aHJlYWQudXJlZ3MtPmVwc3cgJj0gfkVQU1dfRkU7CisJCWZwdV9zdGF0ZV9vd25lciA9IE5VTEw7CisJfQorCisJcHJlZW1wdF9lbmFibGUoKTsKKyNlbmRpZgorCS8qIHdlIG5vIGxvbmdlciBoYXZlIGEgdmFsaWQgY3VycmVudCBGUFUgc3RhdGUgKi8KKwljbGVhcl91c2luZ19mcHUodHNrKTsKK30KKworLyoKKyAqIHJlc3RvcmUgdGhlIEZQVSBzdGF0ZSBmcm9tIGEgc2lnbmFsIGNvbnRleHQKKyAqLworaW50IGZwdV9yZXN0b3JlX3NpZ2NvbnRleHQoc3RydWN0IGZwdWNvbnRleHQgKmZwdWNvbnRleHQpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCWludCByZXQ7CisKKwkvKiBsb2FkIHVwIHRoZSBvbGQgRlBVIHN0YXRlICovCisJcmV0ID0gY29weV9mcm9tX3VzZXIoJnRzay0+dGhyZWFkLmZwdV9zdGF0ZSwKKwkJCSAgICAgZnB1Y29udGV4dCwKKwkJCSAgICAgbWluKHNpemVvZihzdHJ1Y3QgZnB1X3N0YXRlX3N0cnVjdCksCisJCQkJIHNpemVvZihzdHJ1Y3QgZnB1Y29udGV4dCkpKTsKKwlpZiAoIXJldCkKKwkJc2V0X3VzaW5nX2ZwdSh0c2spOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGZpbGwgaW4gdGhlIEZQVSBzdHJ1Y3R1cmUgZm9yIGEgY29yZSBkdW1wCisgKi8KK2ludCBkdW1wX2ZwdShzdHJ1Y3QgcHRfcmVncyAqcmVncywgZWxmX2ZwcmVnc2V0X3QgKmZwcmVnKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKwlpbnQgZnB2YWxpZDsKKworCWZwdmFsaWQgPSBpc191c2luZ19mcHUodHNrKTsKKwlpZiAoZnB2YWxpZCkgeworCQl1bmxhenlfZnB1KHRzayk7CisJCW1lbWNweShmcHJlZywgJnRzay0+dGhyZWFkLmZwdV9zdGF0ZSwgc2l6ZW9mKCpmcHJlZykpOworCX0KKworCXJldHVybiBmcHZhbGlkOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9nZGItY2FjaGUuUyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvZ2RiLWNhY2hlLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwOGJhZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvZ2RiLWNhY2hlLlMKQEAgLTAsMCArMSwxMDUgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgTU4xMDMwMCBMb3ctbGV2ZWwgY2FjaGUgcHVyZ2luZyByb3V0aW5lcyBmb3IgZ2Ric3R1YgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyMgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisjIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjaW5jbHVkZSA8bGludXgvc3lzLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vY3B1LXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vZXhjZXB0aW9ucy5oPgorI2luY2x1ZGUgPGFzbS9mcmFtZS5pbmM+CisjaW5jbHVkZSA8YXNtL3NlcmlhbC1yZWdzLmg+CisKKwkudGV4dAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEdEQiBzdHViIGNhY2hlIHB1cmdlCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJLnR5cGUJZ2Ric3R1Yl9wdXJnZV9jYWNoZSxAZnVuY3Rpb24KK0VOVFJZKGdkYnN0dWJfcHVyZ2VfY2FjaGUpCisJIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkjIHJlYWQgdGhlIGFkZHJlc3NlcyB0YWdnZWQgaW4gdGhlIGNhY2hlJ3MgdGFnIFJBTSBhbmQgYXR0ZW1wdCB0byBmbHVzaAorCSMgdGhvc2UgYWRkcmVzc2VzIHNwZWNpZmljYWxseQorCSMgLSB3ZSByZWx5IG9uIHRoZSBoYXJkd2FyZSB0byBmaWx0ZXIgb3V0IGludmFsaWQgdGFnIGVudHJ5IGFkZHJlc3NlcworCW1vdglEQ0FDSEVfVEFHKDAsMCksYTAJCSMgZGNhY2hlIHRhZyBSQU0gYWNjZXNzIGFkZHJlc3MKKwltb3YJRENBQ0hFX1BVUkdFKDAsMCksYTEJCSMgZGNhY2hlIHB1cmdlIHJlcXVlc3QgYWRkcmVzcworCW1vdglMMV9DQUNIRV9OV0FZUypMMV9DQUNIRV9ORU5UUklFUyxkMSAgIyB0b3RhbCBudW1iZXIgb2YgZW50cmllcworCittbjEwMzAwX2RjYWNoZV9mbHVzaF9sb29wOgorCW1vdgkoYTApLGQwCisJYW5kCUwxX0NBQ0hFX1RBR19BRERSRVNTfEwxX0NBQ0hFX1RBR19FTlRSWSxkMAorCW9yCUwxX0NBQ0hFX1RBR19WQUxJRCxkMAkJIyByZXRhaW4gdmFsaWQgZW50cmllcyBpbiB0aGUKKwkJCQkJCSMgY2FjaGUKKwltb3YJZDAsKGExKQkJCQkjIGNvbmRpdGlvbmFsIHB1cmdlCisKK21uMTAzMDBfZGNhY2hlX2ZsdXNoX3NraXA6CisJYWRkCUwxX0NBQ0hFX0JZVEVTLGEwCisJYWRkCUwxX0NBQ0hFX0JZVEVTLGExCisJYWRkCS0xLGQxCisJYm5lCW1uMTAzMDBfZGNhY2hlX2ZsdXNoX2xvb3AKKworOzsgCSMgdW5jb25kaXRpb25hbGx5IGZsdXNoIGFuZCBpbnZhbGlkYXRlIHRoZSBkY2FjaGUKKzs7IAltb3YJRENBQ0hFX1BVUkdFKDAsMCksYTEJCSMgZGNhY2hlIHB1cmdlIHJlcXVlc3QgYWRkcmVzcworOzsgCW1vdglMMV9DQUNIRV9OV0FZUypMMV9DQUNIRV9ORU5UUklFUyxkMQkjIHRvdGFsIG51bWJlciBvZgorOzsJCQkJCQkJIyBlbnRyaWVzCis7OworOzsgZ2Ric3R1Yl9wdXJnZV9jYWNoZV9fZGNhY2hlX2xvb3A6Cis7OyAJbW92CShhMSksZDAJCQkJIyB1bmNvbmRpdGlvbmFsIHB1cmdlCis7OworOzsgCWFkZAlMMV9DQUNIRV9CWVRFUyxhMQorOzsgCWFkZAktMSxkMQorOzsgCWJuZQlnZGJzdHViX3B1cmdlX2NhY2hlX19kY2FjaGVfbG9vcAorCisJIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkjIG5vdyBpbnZhbGlkYXRlIHRoZSBpY2FjaGUKKwltb3YJQ0hDVFIsYTAKKwltb3ZodQkoYTApLGExCisKKwltb3YJZXBzdyxkMQorCWFuZAl+RVBTV19JRSxlcHN3CisJbm9wCisJbm9wCisKKwkjIGRpc2FibGUgdGhlIGljYWNoZQorCWFuZAl+Q0hDVFJfSUNFTixkMAorCW1vdmh1CWQwLChhMCkKKworCSMgYW5kIHdhaXQgZm9yIGl0IHRvIGNhbG0gZG93bgorCXNldGxiCisJbW92aHUJKGEwKSxkMAorCWJ0c3QJQ0hDVFJfSUNCVVNZLGQwCisJbG5lCisKKwkjIGludmFsaWRhdGUKKwlvcglDSENUUl9JQ0lOVixkMAorCW1vdmh1CWQwLChhMCkKKworCSMgd2FpdCBmb3IgdGhlIGNhY2hlIHRvIGZpbmlzaAorCW1vdglDSENUUixhMAorCXNldGxiCisJbW92aHUJKGEwKSxkMAorCWJ0c3QJQ0hDVFJfSUNCVVNZLGQwCisJbG5lCisKKwkjIGFuZCByZWVuYWJsZSBpdAorCW1vdmh1CWExLChhMCkKKwltb3ZodQkoYTApLGQwCQkJIyByZWFkIGJhY2sgdG8gZmx1c2gKKwkJCQkJIyAoU0lHSUxMcyBhbGwgb3ZlciB3aXRob3V0IHRoaXMpCisKKwltb3YJZDEsZXBzdworCisJcmV0CVtdLDAKKworCS5zaXplCWdkYnN0dWJfcHVyZ2VfY2FjaGUsLi1nZGJzdHViX3B1cmdlX2NhY2hlCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL2dkYi1pby1zZXJpYWwtbG93LlMgYi9hcmNoL21uMTAzMDAva2VybmVsL2dkYi1pby1zZXJpYWwtbG93LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY4ZGNkMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvZ2RiLWlvLXNlcmlhbC1sb3cuUwpAQCAtMCwwICsxLDkwIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIDE2NTUwIHNlcmlhbCBSeCBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgZ2Ric3R1YiBJL08KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisjIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorIyAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworI2luY2x1ZGUgPGxpbnV4L3N5cy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL2NwdS1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2ZyYW1lLmluYz4KKyNpbmNsdWRlIDxhc20vaW50Y3RsLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vdW5pdC9zZXJpYWwuaD4KKworCS50ZXh0CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgR0RCIHN0dWIgc2VyaWFsIHJlY2VpdmUgaW50ZXJydXB0IGVudHJ5IHBvaW50CisjIC0gaW50ZW5kZWQgdG8gcnVuIGF0IGludGVycnVwdCBwcmlvcml0eSAwCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJLmdsb2JsCWdkYnN0dWJfaW9fcnhfaGFuZGxlcgorCS50eXBlCWdkYnN0dWJfaW9fcnhfaGFuZGxlcixAZnVuY3Rpb24KK2dkYnN0dWJfaW9fcnhfaGFuZGxlcjoKKwltb3ZtCVtkMixkMyxhMixhM10sKHNwKQorCisjaWYgMQorCW1vdmJ1CShHREJQT1JUX1NFUklBTF9JSVIpLGQyCisjZW5kaWYKKworCW1vdgkoZ2Ric3R1Yl9yeF9pbnApLGEzCitnZGJzdHViX2lvX3J4X21vcmU6CisJbW92CWEzLGEyCisJYWRkCTIsYTMKKwlhbmQJMHgwMDAwMGZmZixhMworCW1vdgkoZ2Ric3R1Yl9yeF9vdXRwKSxkMworCWNtcAlhMyxkMworCWJlcQlnZGJzdHViX2lvX3J4X292ZXJmbG93CisKKwltb3ZidQkoR0RCUE9SVF9TRVJJQUxfTFNSKSxkMworCWJ0c3QJVUFSVF9MU1JfRFIsZDMKKwliZXEJZ2Ric3R1Yl9pb19yeF9kb25lCisJbW92YnUJKEdEQlBPUlRfU0VSSUFMX1JYKSxkMgorCW1vdmJ1CWQzLChnZGJzdHViX3J4X2J1ZmZlcisxLGEyKQorCW1vdmJ1CWQyLChnZGJzdHViX3J4X2J1ZmZlcixhMikKKwltb3YJYTMsKGdkYnN0dWJfcnhfaW5wKQorCWJyYQlnZGJzdHViX2lvX3J4X21vcmUKKworZ2Ric3R1Yl9pb19yeF9kb25lOgorCW1vdglHeElDUl9ERVRFQ1QsZDIKKwltb3ZidQlkMiwoWElSUXhJQ1IoR0RCUE9SVF9TRVJJQUxfSVJRKSkJIyBBQ0sgdGhlIGludGVycnVwdAorCW1vdmh1CShYSVJReElDUihHREJQT1JUX1NFUklBTF9JUlEpKSxkMgkjIGZsdXNoCisJbW92bQkoc3ApLFtkMixkMyxhMixhM10KKwlic2V0CTB4MDEsKGdkYnN0dWJfYnVzeSkKKwliZXEJZ2Ric3R1Yl9pb19yeF9lbnRlcgorCXJ0aQorCitnZGJzdHViX2lvX3J4X292ZXJmbG93OgorCWJzZXQJMHgwMSwoZ2Ric3R1Yl9yeF9vdmVyZmxvdykKKwlicmEJZ2Ric3R1Yl9pb19yeF9kb25lCisKK2dkYnN0dWJfaW9fcnhfZW50ZXI6CisJb3IJRVBTV19JRXxFUFNXX0lNXzEsZXBzdworCWFkZAktNCxzcAorCVNBVkVfQUxMCisKKwltb3YJMHhmZmZmZmZmZixkMAorCW1vdglkMCwoUkVHX09SSUdfRDAsZnApCisJbW92CTB4MjgwLGQxCisKKwltb3YJZnAsZDAKKwljYWxsCWdkYnN0dWJfcnhfaXJxW10sMAkjIGdkYnN0dWJfcnhfaXJxKHJlZ3MsZXhjZXApCisKKwlhbmQJfkVQU1dfSUUsZXBzdworCWJjbHIJMHgwMSwoZ2Ric3R1Yl9idXN5KQorCisJLmdsb2JsIGdkYnN0dWJfcmV0dXJuCitnZGJzdHViX3JldHVybjoKKwlSRVNUT1JFX0FMTAorCisJLnNpemUJZ2Ric3R1Yl9pb19yeF9oYW5kbGVyLC4tZ2Ric3R1Yl9pb19yeF9oYW5kbGVyCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL2dkYi1pby1zZXJpYWwuYyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvZ2RiLWlvLXNlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNmQ0ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAva2VybmVsL2dkYi1pby1zZXJpYWwuYwpAQCAtMCwwICsxLDE1NSBAQAorLyogMTY1NTAgc2VyaWFsIGRyaXZlciBmb3IgZ2Ric3R1YiBJL08KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ubWkuaD4KKworI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9nZGItc3R1Yi5oPgorI2luY2x1ZGUgPGFzbS9leGNlcHRpb25zLmg+CisjaW5jbHVkZSA8YXNtL3NlcmlhbC1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL3VuaXQvc2VyaWFsLmg+CisKKy8qCisgKiBpbml0aWFsaXNlIHRoZSBHREIgc3R1YgorICovCit2b2lkIGdkYnN0dWJfaW9faW5pdCh2b2lkKQoreworCXUxNiB0bXA7CisKKwkvKiBzZXQgdXAgdGhlIHNlcmlhbCBwb3J0ICovCisJR0RCUE9SVF9TRVJJQUxfTENSID0gVUFSVF9MQ1JfV0xFTjg7IC8qIDFOOCAqLworCUdEQlBPUlRfU0VSSUFMX0ZDUiA9IChVQVJUX0ZDUl9FTkFCTEVfRklGTyB8IFVBUlRfRkNSX0NMRUFSX1JDVlIgfAorCQkJICAgICAgVUFSVF9GQ1JfQ0xFQVJfWE1JVCk7CisKKwlGTE9XQ1RMX0NMRUFSKERUUik7CisJRkxPV0NUTF9TRVQoUlRTKTsKKworCWdkYnN0dWJfaW9fc2V0X2JhdWQoMTE1MjAwKTsKKworCS8qIHdlIHdhbnQgdG8gZ2V0IHNlcmlhbCByZWNlaXZlIGludGVycnVwdHMgKi8KKwlYSVJReElDUihHREJQT1JUX1NFUklBTF9JUlEpID0gMDsKKwl0bXAgPSBYSVJReElDUihHREJQT1JUX1NFUklBTF9JUlEpOworCisJSVZBUjAgPSBFWENFUF9JUlFfTEVWRUwwOworCXNldF9pbnRyX3N0dWIoRVhDRVBfSVJRX0xFVkVMMCwgZ2Ric3R1Yl9pb19yeF9oYW5kbGVyKTsKKworCVhJUlF4SUNSKEdEQlBPUlRfU0VSSUFMX0lSUSkgJj0gfkd4SUNSX1JFUVVFU1Q7CisJWElSUXhJQ1IoR0RCUE9SVF9TRVJJQUxfSVJRKSA9IEd4SUNSX0VOQUJMRSB8IEd4SUNSX0xFVkVMXzA7CisJdG1wID0gWElSUXhJQ1IoR0RCUE9SVF9TRVJJQUxfSVJRKTsKKworCUdEQlBPUlRfU0VSSUFMX0lFUiA9IFVBUlRfSUVSX1JESSB8IFVBUlRfSUVSX1JMU0k7CisKKwkvKiBwZXJtaXQgbGV2ZWwgMCBJUlFzIHRvIHRha2UgcGxhY2UgKi8KKwlhc20gdm9sYXRpbGUoCisJCSIJYW5kICUwLGVwc3cJXG4iCisJCSIJb3IgJTEsZXBzdwlcbiIKKwkJOgorCQk6ICJpIih+RVBTV19JTSksICJpIihFUFNXX0lFIHwgRVBTV19JTV8xKQorCQkpOworfQorCisvKgorICogc2V0IHVwIHRoZSBHREIgc3R1YiBzZXJpYWwgcG9ydCBiYXVkIHJhdGUgdGltZXJzCisgKi8KK3ZvaWQgZ2Ric3R1Yl9pb19zZXRfYmF1ZCh1bnNpZ25lZCBiYXVkKQoreworCXVuc2lnbmVkIHZhbHVlOworCXU4IGxjcjsKKworCXZhbHVlID0gMTg0MzIwMDAgLyAxNiAvIGJhdWQ7CisKKwlsY3IgPSBHREJQT1JUX1NFUklBTF9MQ1I7CisJR0RCUE9SVF9TRVJJQUxfTENSIHw9IFVBUlRfTENSX0RMQUI7CisJR0RCUE9SVF9TRVJJQUxfRExMID0gdmFsdWUgJiAweGZmOworCUdEQlBPUlRfU0VSSUFMX0RMTSA9ICh2YWx1ZSA+PiA4KSAmIDB4ZmY7CisJR0RCUE9SVF9TRVJJQUxfTENSID0gbGNyOworfQorCisvKgorICogd2FpdCBmb3IgYSBjaGFyYWN0ZXIgdG8gY29tZSBmcm9tIHRoZSBkZWJ1Z2dlcgorICovCitpbnQgZ2Ric3R1Yl9pb19yeF9jaGFyKHVuc2lnbmVkIGNoYXIgKl9jaCwgaW50IG5vbmJsb2NrKQoreworCXVuc2lnbmVkIGl4OworCXU4IGNoLCBzdDsKKworCSpfY2ggPSAweGZmOworCisJaWYgKGdkYnN0dWJfcnhfdW5nZXQpIHsKKwkJKl9jaCA9IGdkYnN0dWJfcnhfdW5nZXQ7CisJCWdkYnN0dWJfcnhfdW5nZXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKyB0cnlfYWdhaW46CisJLyogcHVsbCBjaGFycyBvdXQgb2YgdGhlIGJ1ZmZlciAqLworCWl4ID0gZ2Ric3R1Yl9yeF9vdXRwOworCWlmIChpeCA9PSBnZGJzdHViX3J4X2lucCkgeworCQlpZiAobm9uYmxvY2spCisJCQlyZXR1cm4gLUVBR0FJTjsKKyNpZmRlZiBDT05GSUdfTU4xMDMwMF9XRF9USU1FUgorCQl3YXRjaGRvZ19hbGVydF9jb3VudGVyID0gMDsKKyNlbmRpZiAvKiBDT05GSUdfTU4xMDMwMF9XRF9USU1FUiAqLworCQlnb3RvIHRyeV9hZ2FpbjsKKwl9CisKKwljaCA9IGdkYnN0dWJfcnhfYnVmZmVyW2l4KytdOworCXN0ID0gZ2Ric3R1Yl9yeF9idWZmZXJbaXgrK107CisJZ2Ric3R1Yl9yeF9vdXRwID0gaXggJiAweDAwMDAwZmZmOworCisJaWYgKHN0ICYgVUFSVF9MU1JfQkkpIHsKKwkJZ2Ric3R1Yl9wcm90bygiIyMjIEdEQiBSeCBCcmVhayBEZXRlY3RlZCAjIyNcbiIpOworCQlyZXR1cm4gLUVJTlRSOworCX0gZWxzZSBpZiAoc3QgJiAoVUFSVF9MU1JfRkUgfCBVQVJUX0xTUl9PRSB8IFVBUlRfTFNSX1BFKSkgeworCQlnZGJzdHViX3Byb3RvKCIjIyMgR0RCIFJ4IEVycm9yIChzdD0lMDJ4KSAjIyNcbiIsIHN0KTsKKwkJcmV0dXJuIC1FSU87CisJfSBlbHNlIHsKKwkJZ2Ric3R1Yl9wcm90bygiIyMjIEdEQiBSeCAlMDJ4IChzdD0lMDJ4KSAjIyNcbiIsIGNoLCBzdCk7CisJCSpfY2ggPSBjaCAmIDB4N2Y7CisJCXJldHVybiAwOworCX0KK30KKworLyoKKyAqIHNlbmQgYSBjaGFyYWN0ZXIgdG8gdGhlIGRlYnVnZ2VyCisgKi8KK3ZvaWQgZ2Ric3R1Yl9pb190eF9jaGFyKHVuc2lnbmVkIGNoYXIgY2gpCit7CisJRkxPV0NUTF9TRVQoRFRSKTsKKwlMU1JfV0FJVF9GT1IoVEhSRSk7CisJLyogRkxPV0NUTF9XQUlUX0ZPUihDVFMpOyAqLworCisJaWYgKGNoID09IDB4MGEpIHsKKwkJR0RCUE9SVF9TRVJJQUxfVFggPSAweDBkOworCQlMU1JfV0FJVF9GT1IoVEhSRSk7CisJCS8qIEZMT1dDVExfV0FJVF9GT1IoQ1RTKTsgKi8KKwl9CisJR0RCUE9SVF9TRVJJQUxfVFggPSBjaDsKKworCUZMT1dDVExfQ0xFQVIoRFRSKTsKK30KKworLyoKKyAqIHNlbmQgYSBjaGFyYWN0ZXIgdG8gdGhlIGRlYnVnZ2VyCisgKi8KK3ZvaWQgZ2Ric3R1Yl9pb190eF9mbHVzaCh2b2lkKQoreworCUxTUl9XQUlUX0ZPUihURU1UKTsKKwlMU1JfV0FJVF9GT1IoVEhSRSk7CisJRkxPV0NUTF9DTEVBUihEVFIpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9nZGItaW8tdHR5c20tbG93LlMgYi9hcmNoL21uMTAzMDAva2VybmVsL2dkYi1pby10dHlzbS1sb3cuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzdjNzg3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9nZGItaW8tdHR5c20tbG93LlMKQEAgLTAsMCArMSw5MyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBNTjEwMzAwIE9uLWNoaXAgc2VyaWFsIFJ4IGludGVycnVwdCBoYW5kbGVyIGZvciBHREIgc3R1YiBJL08KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisjIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorIyAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworI2luY2x1ZGUgPGxpbnV4L3N5cy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2NwdS1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL2ZyYW1lLmluYz4KKyNpbmNsdWRlIDxhc20vaW50Y3RsLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vdW5pdC9zZXJpYWwuaD4KKyNpbmNsdWRlICJtbjEwMzAwLXNlcmlhbC5oIgorCisJLnRleHQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBHREIgc3R1YiBzZXJpYWwgcmVjZWl2ZSBpbnRlcnJ1cHQgZW50cnkgcG9pbnQKKyMgLSBpbnRlbmRlZCB0byBydW4gYXQgaW50ZXJydXB0IHByaW9yaXR5IDAKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkuZ2xvYmwJZ2Ric3R1Yl9pb19yeF9oYW5kbGVyCisJLnR5cGUJZ2Ric3R1Yl9pb19yeF9oYW5kbGVyLEBmdW5jdGlvbgorZ2Ric3R1Yl9pb19yeF9oYW5kbGVyOgorCW1vdm0JW2QyLGQzLGEyLGEzXSwoc3ApCisKKwltb3YJKGdkYnN0dWJfcnhfaW5wKSxhMworZ2Ric3R1Yl9pb19yeF9tb3JlOgorCW1vdglhMyxhMgorCWFkZAkyLGEzCisJYW5kCVBBR0VfU0laRV9hc20tMSxhMworCW1vdgkoZ2Ric3R1Yl9yeF9vdXRwKSxkMworCWNtcAlhMyxkMworCWJlcQlnZGJzdHViX2lvX3J4X292ZXJmbG93CisKKwltb3ZidQkoU0NnU1RSKSxkMworCWJ0c3QJU0MwMVNUUl9SQkYsZDMKKwliZXEJZ2Ric3R1Yl9pb19yeF9kb25lCisJbW92YnUJKFNDZ1JYQiksZDIKKwltb3ZidQlkMywoZ2Ric3R1Yl9yeF9idWZmZXIrMSxhMikKKwltb3ZidQlkMiwoZ2Ric3R1Yl9yeF9idWZmZXIsYTIpCisJbW92CWEzLChnZGJzdHViX3J4X2lucCkKKwlicmEJZ2Ric3R1Yl9pb19yeF9tb3JlCisKK2dkYnN0dWJfaW9fcnhfZG9uZToKKwltb3YJR3hJQ1JfREVURUNULGQyCisJbW92YnUJZDIsKEd4SUNSKFNDZ1JYSVJRKSkJIyBBQ0sgdGhlIGludGVycnVwdAorCW1vdmh1CShHeElDUihTQ2dSWElSUSkpLGQyCSMgZmx1c2gKKworCW1vdm0JKHNwKSxbZDIsZDMsYTIsYTNdCisJYnNldAkweDAxLChnZGJzdHViX2J1c3kpCisJYmVxCWdkYnN0dWJfaW9fcnhfZW50ZXIKKwlydGkKKworZ2Ric3R1Yl9pb19yeF9vdmVyZmxvdzoKKwlic2V0CTB4MDEsKGdkYnN0dWJfcnhfb3ZlcmZsb3cpCisJYnJhCWdkYnN0dWJfaW9fcnhfZG9uZQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGRlYnVnZ2luZyBpbnRlcnJ1cHQgLSBlbnRlciB0aGUgR0RCIHN0dWIgcHJvcGVyCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitnZGJzdHViX2lvX3J4X2VudGVyOgorCW9yCUVQU1dfSUV8RVBTV19JTV8xLGVwc3cKKwlhZGQJLTQsc3AKKwlTQVZFX0FMTAorCisJbW92CTB4ZmZmZmZmZmYsZDAKKwltb3YJZDAsKFJFR19PUklHX0QwLGZwKQorCW1vdgkweDI4MCxkMQorCisJbW92CWZwLGQwCisJY2FsbAlnZGJzdHViX3J4X2lycVtdLDAJIyBnZGJzdHViX2lvX3J4X2lycShyZWdzLGV4Y2VwKQorCisJYW5kCX5FUFNXX0lFLGVwc3cKKwliY2xyCTB4MDEsKGdkYnN0dWJfYnVzeSkKKworCS5nbG9ibCBnZGJzdHViX3JldHVybgorZ2Ric3R1Yl9yZXR1cm46CisJUkVTVE9SRV9BTEwKKworCS5zaXplCWdkYnN0dWJfaW9fcnhfaGFuZGxlciwuLWdkYnN0dWJfaW9fcnhfaGFuZGxlcgpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9nZGItaW8tdHR5c20uYyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvZ2RiLWlvLXR0eXNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU0NTE1OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvZ2RiLWlvLXR0eXNtLmMKQEAgLTAsMCArMSwyOTkgQEAKKy8qIE1OMTAzMDAgT24tY2hpcCBzZXJpYWwgZHJpdmVyIGZvciBnZGJzdHViIEkvTworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9nZGItc3R1Yi5oPgorI2luY2x1ZGUgPGFzbS9leGNlcHRpb25zLmg+CisjaW5jbHVkZSA8YXNtL3VuaXQvY2xvY2suaD4KKyNpbmNsdWRlICJtbjEwMzAwLXNlcmlhbC5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfR0RCU1RVQl9PTl9UVFlTTTApCitzdHJ1Y3QgbW4xMDMwMF9zZXJpYWxfcG9ydCAqY29uc3QgZ2Ric3R1Yl9wb3J0ID0gJm1uMTAzMDBfc2VyaWFsX3BvcnRfc2lmMDsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0dEQlNUVUJfT05fVFRZU00xKQorc3RydWN0IG1uMTAzMDBfc2VyaWFsX3BvcnQgKmNvbnN0IGdkYnN0dWJfcG9ydCA9ICZtbjEwMzAwX3NlcmlhbF9wb3J0X3NpZjE7CisjZWxzZQorc3RydWN0IG1uMTAzMDBfc2VyaWFsX3BvcnQgKmNvbnN0IGdkYnN0dWJfcG9ydCA9ICZtbjEwMzAwX3NlcmlhbF9wb3J0X3NpZjI7CisjZW5kaWYKKworCisvKgorICogaW5pdGlhbGlzZSB0aGUgR0RCIHN0dWIgSS9PIHJvdXRpbmVzCisgKi8KK3ZvaWQgX19pbml0IGdkYnN0dWJfaW9faW5pdCh2b2lkKQoreworCXVpbnQxNl90IHNjeGN0cjsKKwlpbnQgdG1wOworCisJc3dpdGNoIChnZGJzdHViX3BvcnQtPmNsb2NrX3NyYykgeworCWNhc2UgTU5TQ3hfQ0xPQ0tfU1JDX0lPQ0xLOgorCQlnZGJzdHViX3BvcnQtPmlvY2xrID0gTU4xMDMwMF9JT0NMSzsKKwkJYnJlYWs7CisKKyNpZmRlZiBNTjEwMzAwX0lPQkNMSworCWNhc2UgTU5TQ3hfQ0xPQ0tfU1JDX0lPQkNMSzoKKwkJZ2Ric3R1Yl9wb3J0LT5pb2NsayA9IE1OMTAzMDBfSU9CQ0xLOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCS8qIHNldCB1cCB0aGUgc2VyaWFsIHBvcnQgKi8KKwlnZGJzdHViX2lvX3NldF9iYXVkKDExNTIwMCk7CisKKwkvKiB3ZSB3YW50IHRvIGdldCBzZXJpYWwgcmVjZWl2ZSBpbnRlcnJ1cHRzICovCisJc2V0X2ludHJfbGV2ZWwoZ2Ric3R1Yl9wb3J0LT5yeF9pcnEsIEd4SUNSX0xFVkVMXzApOworCXNldF9pbnRyX2xldmVsKGdkYnN0dWJfcG9ydC0+dHhfaXJxLCBHeElDUl9MRVZFTF8wKTsKKwlzZXRfaW50cl9zdHViKEVYQ0VQX0lSUV9MRVZFTDAsIGdkYnN0dWJfaW9fcnhfaGFuZGxlcik7CisKKwkqZ2Ric3R1Yl9wb3J0LT5yeF9pY3IgfD0gR3hJQ1JfRU5BQkxFOworCXRtcCA9ICpnZGJzdHViX3BvcnQtPnJ4X2ljcjsKKworCS8qIGVuYWJsZSB0aGUgZGV2aWNlICovCisJc2N4Y3RyID0gU0MwMUNUUl9DTE5fOEJJVDsJLyogMU44ICovCisJc3dpdGNoIChnZGJzdHViX3BvcnQtPmRpdl90aW1lcikgeworCWNhc2UgTU5TQ3hfRElWX1RJTUVSXzE2QklUOgorCQlzY3hjdHIgfD0gU0MwQ1RSX0NLX1RNOFVGTE9XXzg7IC8qID09IFNDMUNUUl9DS19UTTlVRkxPV184CisJCQkJCQkgICA9PSBTQzJDVFJfQ0tfVE0xMFVGTE9XXzggKi8KKwkJYnJlYWs7CisKKwljYXNlIE1OU0N4X0RJVl9USU1FUl84QklUOgorCQlzY3hjdHIgfD0gU0MwQ1RSX0NLX1RNMlVGTE9XXzg7CisJCWJyZWFrOworCX0KKworCXNjeGN0ciB8PSBTQzAxQ1RSX1RYRSB8IFNDMDFDVFJfUlhFOworCisJKmdkYnN0dWJfcG9ydC0+X2NvbnRyb2wgPSBzY3hjdHI7CisJdG1wID0gKmdkYnN0dWJfcG9ydC0+X2NvbnRyb2w7CisKKwkvKiBwZXJtaXQgbGV2ZWwgMCBJUlFzIG9ubHkgKi8KKwlhc20gdm9sYXRpbGUoCisJCSIJYW5kICUwLGVwc3cJXG4iCisJCSIJb3IgJTEsZXBzdwlcbiIKKwkJOgorCQk6ICJpIih+RVBTV19JTSksICJpIihFUFNXX0lFfEVQU1dfSU1fMSkKKwkJKTsKK30KKworLyoKKyAqIHNldCB1cCB0aGUgR0RCIHN0dWIgc2VyaWFsIHBvcnQgYmF1ZCByYXRlIHRpbWVycworICovCit2b2lkIGdkYnN0dWJfaW9fc2V0X2JhdWQodW5zaWduZWQgYmF1ZCkKK3sKKwljb25zdCB1bnNpZ25lZCBiaXRzID0gMTA7IC8qIDEgW3N0YXJ0XSArIDggW2RhdGFdICsgMCBbcGFyaXR5XSArCisJCQkJICAgKiAxIFtzdG9wXSAqLworCXVuc2lnbmVkIGxvbmcgaW9jbGsgPSBnZGJzdHViX3BvcnQtPmlvY2xrOworCXVuc2lnbmVkIHhkaXYsIHRtcDsKKwl1aW50MTZfdCB0bXhicjsKKwl1aW50OF90IHRteG1kOworCisJaWYgKCFiYXVkKSB7CisJCWJhdWQgPSA5NjAwOworCX0gZWxzZSBpZiAoYmF1ZCA9PSAxMzQpIHsKKwkJYmF1ZCA9IDI2OTsJLyogMTM0IGlzIHJlYWxseSAxMzQuNSAqLworCQl4ZGl2ID0gMjsKKwl9CisKK3RyeV9hbHRlcm5hdGl2ZToKKwl4ZGl2ID0gMTsKKworCXN3aXRjaCAoZ2Ric3R1Yl9wb3J0LT5kaXZfdGltZXIpIHsKKwljYXNlIE1OU0N4X0RJVl9USU1FUl8xNkJJVDoKKwkJdG14bWQgPSBUTThNRF9TUkNfSU9DTEs7CisJCXRteGJyID0gdG1wID0gKGlvY2xrIC8gKGJhdWQgKiB4ZGl2KSArIDQpIC8gOCAtIDE7CisJCWlmICh0bXAgPiAwICYmIHRtcCA8PSA2NTUzNSkKKwkJCWdvdG8gdGltZXJfb2theTsKKworCQl0bXhtZCA9IFRNOE1EX1NSQ19JT0NMS184OworCQl0bXhiciA9IHRtcCA9IChpb2NsayAvIChiYXVkICogOCAqIHhkaXYpICsgNCkgLyA4IC0gMTsKKwkJaWYgKHRtcCA+IDAgJiYgdG1wIDw9IDY1NTM1KQorCQkJZ290byB0aW1lcl9va2F5OworCisJCXRteG1kID0gVE04TURfU1JDX0lPQ0xLXzMyOworCQl0bXhiciA9IHRtcCA9IChpb2NsayAvIChiYXVkICogMzIgKiB4ZGl2KSArIDQpIC8gOCAtIDE7CisJCWlmICh0bXAgPiAwICYmIHRtcCA8PSA2NTUzNSkKKwkJCWdvdG8gdGltZXJfb2theTsKKworCQlicmVhazsKKworCWNhc2UgTU5TQ3hfRElWX1RJTUVSXzhCSVQ6CisJCXRteG1kID0gVE0yTURfU1JDX0lPQ0xLOworCQl0bXhiciA9IHRtcCA9IChpb2NsayAvIChiYXVkICogeGRpdikgKyA0KSAvIDggLSAxOworCQlpZiAodG1wID4gMCAmJiB0bXAgPD0gMjU1KQorCQkJZ290byB0aW1lcl9va2F5OworCisJCXRteG1kID0gVE0yTURfU1JDX0lPQ0xLXzg7CisJCXRteGJyID0gdG1wID0gKGlvY2xrIC8gKGJhdWQgKiA4ICogeGRpdikgKyA0KSAvIDggLSAxOworCQlpZiAodG1wID4gMCAmJiB0bXAgPD0gMjU1KQorCQkJZ290byB0aW1lcl9va2F5OworCisJCXRteG1kID0gVE0yTURfU1JDX0lPQ0xLXzMyOworCQl0bXhiciA9IHRtcCA9IChpb2NsayAvIChiYXVkICogMzIgKiB4ZGl2KSArIDQpIC8gOCAtIDE7CisJCWlmICh0bXAgPiAwICYmIHRtcCA8PSAyNTUpCisJCQlnb3RvIHRpbWVyX29rYXk7CisJCWJyZWFrOworCX0KKworCS8qIGFzIGEgbGFzdCByZXNvcnQsIGlmIHRoZSBxdW90aWVudCBpcyB6ZXJvLCBkZWZhdWx0IHRvIDk2MDAgYnBzICovCisJYmF1ZCA9IDk2MDA7CisJZ290byB0cnlfYWx0ZXJuYXRpdmU7CisKK3RpbWVyX29rYXk6CisJZ2Ric3R1Yl9wb3J0LT51YXJ0LnRpbWVvdXQgPSAoMiAqIGJpdHMgKiBIWikgLyBiYXVkOworCWdkYnN0dWJfcG9ydC0+dWFydC50aW1lb3V0ICs9IEhaIC8gNTA7CisKKwkvKiBzZXQgdGhlIHRpbWVyIHRvIHByb2R1Y2UgdGhlIHJlcXVpcmVkIGJhdWQgcmF0ZSAqLworCXN3aXRjaCAoZ2Ric3R1Yl9wb3J0LT5kaXZfdGltZXIpIHsKKwljYXNlIE1OU0N4X0RJVl9USU1FUl8xNkJJVDoKKwkJKmdkYnN0dWJfcG9ydC0+X3RteG1kID0gMDsKKwkJKmdkYnN0dWJfcG9ydC0+X3RteGJyID0gdG14YnI7CisJCSpnZGJzdHViX3BvcnQtPl90bXhtZCA9IFRNOE1EX0lOSVRfQ09VTlRFUjsKKwkJKmdkYnN0dWJfcG9ydC0+X3RteG1kID0gdG14bWQgfCBUTThNRF9DT1VOVF9FTkFCTEU7CisJCWJyZWFrOworCisJY2FzZSBNTlNDeF9ESVZfVElNRVJfOEJJVDoKKwkJKmdkYnN0dWJfcG9ydC0+X3RteG1kID0gMDsKKwkJKih2b2xhdGlsZSB1OCAqKSBnZGJzdHViX3BvcnQtPl90bXhiciA9ICh1OCl0bXhicjsKKwkJKmdkYnN0dWJfcG9ydC0+X3RteG1kID0gVE0yTURfSU5JVF9DT1VOVEVSOworCQkqZ2Ric3R1Yl9wb3J0LT5fdG14bWQgPSB0bXhtZCB8IFRNMk1EX0NPVU5UX0VOQUJMRTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogd2FpdCBmb3IgYSBjaGFyYWN0ZXIgdG8gY29tZSBmcm9tIHRoZSBkZWJ1Z2dlcgorICovCitpbnQgZ2Ric3R1Yl9pb19yeF9jaGFyKHVuc2lnbmVkIGNoYXIgKl9jaCwgaW50IG5vbmJsb2NrKQoreworCXVuc2lnbmVkIGl4OworCXU4IGNoLCBzdDsKKworCSpfY2ggPSAweGZmOworCisJaWYgKGdkYnN0dWJfcnhfdW5nZXQpIHsKKwkJKl9jaCA9IGdkYnN0dWJfcnhfdW5nZXQ7CisJCWdkYnN0dWJfcnhfdW5nZXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKK3RyeV9hZ2FpbjoKKwkvKiBwdWxsIGNoYXJzIG91dCBvZiB0aGUgYnVmZmVyICovCisJaXggPSBnZGJzdHViX3J4X291dHA7CisJaWYgKGl4ID09IGdkYnN0dWJfcnhfaW5wKSB7CisJCWlmIChub25ibG9jaykKKwkJCXJldHVybiAtRUFHQUlOOworI2lmZGVmIENPTkZJR19NTjEwMzAwX1dEX1RJTUVSCisJCXdhdGNoZG9nX2FsZXJ0X2NvdW50ZXIgPSAwOworI2VuZGlmIC8qIENPTkZJR19NTjEwMzAwX1dEX1RJTUVSICovCisJCWdvdG8gdHJ5X2FnYWluOworCX0KKworCWNoID0gZ2Ric3R1Yl9yeF9idWZmZXJbaXgrK107CisJc3QgPSBnZGJzdHViX3J4X2J1ZmZlcltpeCsrXTsKKwlnZGJzdHViX3J4X291dHAgPSBpeCAmIChQQUdFX1NJWkUgLSAxKTsKKworCXN0ICY9IFNDMDFTVFJfUlhGIHwgU0MwMVNUUl9SQkYgfCBTQzAxU1RSX0ZFRiB8IFNDMDFTVFJfUEVGIHwKKwkJU0MwMVNUUl9PRUY7CisKKwkvKiBkZWFsIHdpdGggd2hhdCB3ZSd2ZSBnb3QKKwkgKiAtIG5vdGUgdGhhdCB0aGUgVUFSVCBkb2Vzbid0IGRvIEJSRUFLLWRldGVjdGlvbiBmb3IgdXMKKwkgKi8KKwlpZiAoc3QgJiBTQzAxU1RSX0ZFRiAmJiBjaCA9PSAwKSB7CisJCXN3aXRjaCAoZ2Ric3R1Yl9wb3J0LT5yeF9icmspIHsKKwkJY2FzZSAwOglnZGJzdHViX3BvcnQtPnJ4X2JyayA9IDE7CWdvdG8gdHJ5X2FnYWluOworCQljYXNlIDE6CWdkYnN0dWJfcG9ydC0+cnhfYnJrID0gMjsJZ290byB0cnlfYWdhaW47CisJCWNhc2UgMjoKKwkJCWdkYnN0dWJfcG9ydC0+cnhfYnJrID0gMzsKKwkJCWdkYnN0dWJfcHJvdG8oIiMjIyBHREIgTU5TRVJJQUwgUnggQnJlYWsgRGV0ZWN0ZWQiCisJCQkJICAgICAgIiAjIyNcbiIpOworCQkJcmV0dXJuIC1FSU5UUjsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gdHJ5X2FnYWluOworCQl9CisJfSBlbHNlIGlmIChzdCAmIFNDMDFTVFJfRkVGKSB7CisJCWlmIChnZGJzdHViX3BvcnQtPnJ4X2JyaykKKwkJCWdvdG8gdHJ5X2FnYWluOworCisJCWdkYnN0dWJfcHJvdG8oIiMjIyBHREIgTU5TRVJJQUwgRnJhbWluZyBFcnJvciAjIyNcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9IGVsc2UgaWYgKHN0ICYgU0MwMVNUUl9PRUYpIHsKKwkJaWYgKGdkYnN0dWJfcG9ydC0+cnhfYnJrKQorCQkJZ290byB0cnlfYWdhaW47CisKKwkJZ2Ric3R1Yl9wcm90bygiIyMjIEdEQiBNTlNFUklBTCBPdmVycnVuIEVycm9yICMjI1xuIik7CisJCXJldHVybiAtRUlPOworCX0gZWxzZSBpZiAoc3QgJiBTQzAxU1RSX1BFRikgeworCQlpZiAoZ2Ric3R1Yl9wb3J0LT5yeF9icmspCisJCQlnb3RvIHRyeV9hZ2FpbjsKKworCQlnZGJzdHViX3Byb3RvKCIjIyMgR0RCIE1OU0VSSUFMIFBhcml0eSBFcnJvciAjIyNcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9IGVsc2UgeworCQkvKiBsb29rIGZvciB0aGUgdGFpbC1lbmQgY2hhciBvbiBhIGJyZWFrIHJ1biAqLworCQlpZiAoZ2Ric3R1Yl9wb3J0LT5yeF9icmsgPT0gMykgeworCQkJc3dpdGNoIChjaCkgeworCQkJY2FzZSAweEZGOgorCQkJY2FzZSAweEZFOgorCQkJY2FzZSAweEZDOgorCQkJY2FzZSAweEY4OgorCQkJY2FzZSAweEYwOgorCQkJY2FzZSAweEUwOgorCQkJY2FzZSAweEMwOgorCQkJY2FzZSAweDgwOgorCQkJY2FzZSAweDAwOgorCQkJCWdkYnN0dWJfcG9ydC0+cnhfYnJrID0gMDsKKwkJCQlnb3RvIHRyeV9hZ2FpbjsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlnZGJzdHViX3BvcnQtPnJ4X2JyayA9IDA7CisJCWdkYnN0dWJfaW8oIiMjIyBHREIgUnggJTAyeCAoc3Q9JTAyeCkgIyMjXG4iLCBjaCwgc3QpOworCQkqX2NoID0gY2ggJiAweDdmOworCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qCisgKiBzZW5kIGEgY2hhcmFjdGVyIHRvIHRoZSBkZWJ1Z2dlcgorICovCit2b2lkIGdkYnN0dWJfaW9fdHhfY2hhcih1bnNpZ25lZCBjaGFyIGNoKQoreworCXdoaWxlICgqZ2Ric3R1Yl9wb3J0LT5fc3RhdHVzICYgU0MwMVNUUl9UQkYpCisJCWNvbnRpbnVlOworCisJaWYgKGNoID09IDB4MGEpIHsKKwkJKih1OCAqKSBnZGJzdHViX3BvcnQtPl90eGIgPSAweDBkOworCQl3aGlsZSAoKmdkYnN0dWJfcG9ydC0+X3N0YXR1cyAmIFNDMDFTVFJfVEJGKQorCQkJY29udGludWU7CisJfQorCisJKih1OCAqKSBnZGJzdHViX3BvcnQtPl90eGIgPSBjaDsKK30KKworLyoKKyAqIGZsdXNoIHRoZSB0cmFuc21pc3Npb24gYnVmZmVycworICovCit2b2lkIGdkYnN0dWJfaW9fdHhfZmx1c2godm9pZCkKK3sKKwl3aGlsZSAoKmdkYnN0dWJfcG9ydC0+X3N0YXR1cyAmIChTQzAxU1RSX1RCRiB8IFNDMDFTVFJfVFhGKSkKKwkJY29udGludWU7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL2dkYi1sb3cuUyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvZ2RiLWxvdy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNzI1NTUyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9nZGItbG93LlMKQEAgLTAsMCArMSwxMTUgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgTU4xMDMwMCBMb3ctbGV2ZWwgZ2Ric3R1YiByb3V0aW5lcworIworIyBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyMgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisjIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjaW5jbHVkZSA8bGludXgvc3lzLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vY3B1LXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vZXhjZXB0aW9ucy5oPgorI2luY2x1ZGUgPGFzbS9mcmFtZS5pbmM+CisjaW5jbHVkZSA8YXNtL3NlcmlhbC1yZWdzLmg+CisKKwkudGV4dAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEdEQiBzdHViIHJlYWQgbWVtb3J5IHdpdGggZ3VhcmQKKyMgLSBEMCBob2xkcyB0aGUgbWVtb3J5IGFkZHJlc3MgdG8gcmVhZAorIyAtIEQxIGhvbGRzIHRoZSBhZGRyZXNzIHRvIHN0b3JlIHRoZSBieXRlIGludG8KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkuZ2xvYmwgZ2Ric3R1Yl9yZWFkX2J5dGVfZ3VhcmQKKwkuZ2xvYmwgZ2Ric3R1Yl9yZWFkX2J5dGVfY29udAorRU5UUlkoZ2Ric3R1Yl9yZWFkX2J5dGUpCisJbW92CWQwLGEwCisJbW92CWQxLGExCisJY2xyCWQwCitnZGJzdHViX3JlYWRfYnl0ZV9ndWFyZDoKKwltb3ZidQkoYTApLGQxCitnZGJzdHViX3JlYWRfYnl0ZV9jb250OgorCW1vdmJ1CWQxLChhMSkKKwlyZXQJW10sMAorCisJLmdsb2JsIGdkYnN0dWJfcmVhZF93b3JkX2d1YXJkCisJLmdsb2JsIGdkYnN0dWJfcmVhZF93b3JkX2NvbnQKK0VOVFJZKGdkYnN0dWJfcmVhZF93b3JkKQorCW1vdglkMCxhMAorCW1vdglkMSxhMQorCWNscglkMAorZ2Ric3R1Yl9yZWFkX3dvcmRfZ3VhcmQ6CisJbW92aHUJKGEwKSxkMQorZ2Ric3R1Yl9yZWFkX3dvcmRfY29udDoKKwltb3ZodQlkMSwoYTEpCisJcmV0CVtdLDAKKworCS5nbG9ibCBnZGJzdHViX3JlYWRfZHdvcmRfZ3VhcmQKKwkuZ2xvYmwgZ2Ric3R1Yl9yZWFkX2R3b3JkX2NvbnQKK0VOVFJZKGdkYnN0dWJfcmVhZF9kd29yZCkKKwltb3YJZDAsYTAKKwltb3YJZDEsYTEKKwljbHIJZDAKK2dkYnN0dWJfcmVhZF9kd29yZF9ndWFyZDoKKwltb3YJKGEwKSxkMQorZ2Ric3R1Yl9yZWFkX2R3b3JkX2NvbnQ6CisJbW92CWQxLChhMSkKKwlyZXQJW10sMAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEdEQiBzdHViIHdyaXRlIG1lbW9yeSB3aXRoIGd1YXJkCisjIC0gRDAgaG9sZHMgdGhlIGJ5dGUgdG8gc3RvcmUKKyMgLSBEMSBob2xkcyB0aGUgbWVtb3J5IGFkZHJlc3MgdG8gd3JpdGUKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkuZ2xvYmwgZ2Ric3R1Yl93cml0ZV9ieXRlX2d1YXJkCisJLmdsb2JsIGdkYnN0dWJfd3JpdGVfYnl0ZV9jb250CitFTlRSWShnZGJzdHViX3dyaXRlX2J5dGUpCisJbW92CWQwLGEwCisJbW92CWQxLGExCisJY2xyCWQwCitnZGJzdHViX3dyaXRlX2J5dGVfZ3VhcmQ6CisJbW92YnUJYTAsKGExKQorZ2Ric3R1Yl93cml0ZV9ieXRlX2NvbnQ6CisJcmV0CVtdLDAKKworCS5nbG9ibCBnZGJzdHViX3dyaXRlX3dvcmRfZ3VhcmQKKwkuZ2xvYmwgZ2Ric3R1Yl93cml0ZV93b3JkX2NvbnQKK0VOVFJZKGdkYnN0dWJfd3JpdGVfd29yZCkKKwltb3YJZDAsYTAKKwltb3YJZDEsYTEKKwljbHIJZDAKK2dkYnN0dWJfd3JpdGVfd29yZF9ndWFyZDoKKwltb3ZodQlhMCwoYTEpCitnZGJzdHViX3dyaXRlX3dvcmRfY29udDoKKwlyZXQJW10sMAorCisJLmdsb2JsIGdkYnN0dWJfd3JpdGVfZHdvcmRfZ3VhcmQKKwkuZ2xvYmwgZ2Ric3R1Yl93cml0ZV9kd29yZF9jb250CitFTlRSWShnZGJzdHViX3dyaXRlX2R3b3JkKQorCW1vdglkMCxhMAorCW1vdglkMSxhMQorCWNscglkMAorZ2Ric3R1Yl93cml0ZV9kd29yZF9ndWFyZDoKKwltb3YJYTAsKGExKQorZ2Ric3R1Yl93cml0ZV9kd29yZF9jb250OgorCXJldAlbXSwwCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgR0RCIHN0dWIgQlVHKCkgdHJhcAorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworRU5UUlkoX19nZGJzdHViX2J1Z190cmFwKQorCS5ieXRlCTB4RjcsMHhGNwkjIGRvbid0IHVzZSAweEZGIGFzIHRoZSBKVEFHIHVuaXQgcHJlZW1wdHMgdGhhdAorCXJldAlbXSwwCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL2dkYi1zdHViLmMgYi9hcmNoL21uMTAzMDAva2VybmVsL2dkYi1zdHViLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE4OTFjNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvZ2RiLXN0dWIuYwpAQCAtMCwwICsxLDE5NDcgQEAKKy8qIE1OMTAzMDAgR0RCIHN0dWIKKyAqCisgKiBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgR2xlbm4gRW5nZWwsIExha2UgU3RldmVucyBJbnN0cnVtZW50IERpdmlzaW9uCisgKgorICogQ29udHJpYnV0ZWQgYnkgSFAgU3lzdGVtcworICoKKyAqIE1vZGlmaWVkIGZvciBTUEFSQyBieSBTdHUgR3Jvc3NtYW4sIEN5Z251cyBTdXBwb3J0LgorICoKKyAqIE1vZGlmaWVkIGZvciBMaW51eC9NSVBTIChhbmQgTUlQUyBpbiBnZW5lcmFsKSBieSBBbmRyZWFzIEJ1c3NlCisgKiBTZW5kIGNvbXBsYWludHMsIHN1Z2dlc3Rpb25zIGV0Yy4gdG8gPGFuZHlAd2FsZG9yZi1nbWJoLmRlPgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSBBbmRyZWFzIEJ1c3NlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIE1vZGlmaWVkIGZvciBMaW51eC9tbjEwMzAwIGJ5IERhdmlkIEhvd2VsbHMgPGRob3dlbGxzQHJlZGhhdC5jb20+CisgKi8KKworLyoKKyAqICBUbyBlbmFibGUgZGVidWdnZXIgc3VwcG9ydCwgdHdvIHRoaW5ncyBuZWVkIHRvIGhhcHBlbi4gIE9uZSwgYQorICogIGNhbGwgdG8gc2V0X2RlYnVnX3RyYXBzKCkgaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGFsbG93IGFueSBicmVha3BvaW50cworICogIG9yIGVycm9yIGNvbmRpdGlvbnMgdG8gYmUgcHJvcGVybHkgaW50ZXJjZXB0ZWQgYW5kIHJlcG9ydGVkIHRvIGdkYi4KKyAqICBUd28sIGEgYnJlYWtwb2ludCBuZWVkcyB0byBiZSBnZW5lcmF0ZWQgdG8gYmVnaW4gY29tbXVuaWNhdGlvbi4gIFRoaXMKKyAqICBpcyBtb3N0IGVhc2lseSBhY2NvbXBsaXNoZWQgYnkgYSBjYWxsIHRvIGJyZWFrcG9pbnQoKS4gIEJyZWFrcG9pbnQoKQorICogIHNpbXVsYXRlcyBhIGJyZWFrcG9pbnQgYnkgZXhlY3V0aW5nIGEgQlJFQUsgaW5zdHJ1Y3Rpb24uCisgKgorICoKKyAqICAgIFRoZSBmb2xsb3dpbmcgZ2RiIGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQ6CisgKgorICogY29tbWFuZCAgICAgICAgICBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm4gdmFsdWUKKyAqCisgKiAgICBnICAgICAgICAgICAgIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIENQVSByZWdpc3RlcnMgIGhleCBkYXRhIG9yIEVOTgorICogICAgRyAgICAgICAgICAgICBzZXQgdGhlIHZhbHVlIG9mIHRoZSBDUFUgcmVnaXN0ZXJzICAgICBPSyBvciBFTk4KKyAqCisgKiAgICBtQUEuLkFBLExMTEwgIFJlYWQgTExMTCBieXRlcyBhdCBhZGRyZXNzIEFBLi5BQSAgICAgIGhleCBkYXRhIG9yIEVOTgorICogICAgTUFBLi5BQSxMTExMOiBXcml0ZSBMTExMIGJ5dGVzIGF0IGFkZHJlc3MgQUEuQUEgICAgICBPSyBvciBFTk4KKyAqCisgKiAgICBjICAgICAgICAgICAgIFJlc3VtZSBhdCBjdXJyZW50IGFkZHJlc3MgICAgICAgICAgICAgIFNOTiAgICggc2lnbmFsIE5OKQorICogICAgY0FBLi5BQSAgICAgICBDb250aW51ZSBhdCBhZGRyZXNzIEFBLi5BQSAgICAgICAgICAgICBTTk4KKyAqCisgKiAgICBzICAgICAgICAgICAgIFN0ZXAgb25lIGluc3RydWN0aW9uICAgICAgICAgICAgICAgICAgIFNOTgorICogICAgc0FBLi5BQSAgICAgICBTdGVwIG9uZSBpbnN0cnVjdGlvbiBmcm9tIEFBLi5BQSAgICAgICBTTk4KKyAqCisgKiAgICBrICAgICAgICAgICAgIGtpbGwKKyAqCisgKiAgICA/ICAgICAgICAgICAgIFdoYXQgd2FzIHRoZSBsYXN0IHNpZ3ZhbCA/ICAgICAgICAgICAgIFNOTiAgIChzaWduYWwgTk4pCisgKgorICogICAgYkJCLi5CQgkgICAgU2V0IGJhdWQgcmF0ZSB0byBCQi4uQkIJCSAgIE9LIG9yIEJOTiwgdGhlbiBzZXRzCisgKgkJCQkJCQkgICBiYXVkIHJhdGUKKyAqCisgKiBBbGwgY29tbWFuZHMgYW5kIHJlc3BvbnNlcyBhcmUgc2VudCB3aXRoIGEgcGFja2V0IHdoaWNoIGluY2x1ZGVzIGEKKyAqIGNoZWNrc3VtLiAgQSBwYWNrZXQgY29uc2lzdHMgb2YKKyAqCisgKiAkPHBhY2tldCBpbmZvPiM8Y2hlY2tzdW0+LgorICoKKyAqIHdoZXJlCisgKiA8cGFja2V0IGluZm8+IDo6IDxjaGFyYWN0ZXJzIHJlcHJlc2VudGluZyB0aGUgY29tbWFuZCBvciByZXNwb25zZT4KKyAqIDxjaGVja3N1bT4gICAgOjogPCB0d28gaGV4IGRpZ2l0cyBjb21wdXRlZCBhcyBtb2R1bG8gMjU2IHN1bSBvZiA8cGFja2V0aW5mbz4+CisgKgorICogV2hlbiBhIHBhY2tldCBpcyByZWNlaXZlZCwgaXQgaXMgZmlyc3QgYWNrbm93bGVkZ2VkIHdpdGggZWl0aGVyICcrJyBvciAnLScuCisgKiAnKycgaW5kaWNhdGVzIGEgc3VjY2Vzc2Z1bCB0cmFuc2Zlci4gICctJyBpbmRpY2F0ZXMgYSBmYWlsZWQgdHJhbnNmZXIuCisgKgorICogRXhhbXBsZToKKyAqCisgKiBIb3N0OiAgICAgICAgICAgICAgICAgIFJlcGx5OgorICogJG0wLDEwIzJhICAgICAgICAgICAgICAgKyQwMDAxMDIwMzA0MDUwNjA3MDgwOTEwMTExMjEzMTQxNSM0MgorICoKKyAqCisgKiAgPT09PT09PT09PT09PT0KKyAqICBNT1JFIEVYQU1QTEVTOgorICogID09PT09PT09PT09PT09CisgKgorICogIEZvciByZWZlcmVuY2UgLS0gdGhlIGZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgb25lCisgKiAgY29tcGFueSB0b29rIChSaWRnZVJ1biBJbmMpIHRvIGdldCByZW1vdGUgZ2RiIGRlYnVnZ2luZworICogIGdvaW5nLiBJbiB0aGlzIHNjZW5hcmlvIHRoZSBob3N0IG1hY2hpbmUgd2FzIGEgUEMgYW5kIHRoZQorICogIHRhcmdldCBwbGF0Zm9ybSB3YXMgYSBHYWxpbGVvIEVWQjY0MTIwQSBNSVBTIGV2YWx1YXRpb24KKyAqICBib2FyZC4KKyAqCisgKiAgU3RlcCAxOgorICogIEZpcnN0IGRvd25sb2FkIGdkYi01LjAudGFyLmd6IGZyb20gdGhlIGludGVybmV0LgorICogIGFuZCB0aGVuIGJ1aWxkL2luc3RhbGwgdGhlIHBhY2thZ2UuCisgKgorICogIEV4YW1wbGU6CisgKiAgICAkIHRhciB6eGYgZ2RiLTUuMC50YXIuZ3oKKyAqICAgICQgY2QgZ2RiLTUuMAorICogICAgJCAuL2NvbmZpZ3VyZSAtLXRhcmdldD1hbTMzXzIuMC1saW51eC1nbnUKKyAqICAgICQgbWFrZQorICogICAgJCBpbnN0YWxsCisgKiAgICBhbTMzXzIuMC1saW51eC1nbnUtZ2RiCisgKgorICogIFN0ZXAgMjoKKyAqICBDb25maWd1cmUgbGludXggZm9yIHJlbW90ZSBkZWJ1Z2dpbmcgYW5kIGJ1aWxkIGl0LgorICoKKyAqICBFeGFtcGxlOgorICogICAgJCBjZCB+L2xpbnV4CisgKiAgICAkIG1ha2UgbWVudWNvbmZpZyA8Z28gdG8gIktlcm5lbCBIYWNraW5nIiBhbmQgdHVybiBvbiByZW1vdGUgZGVidWdnaW5nPgorICogICAgJCBtYWtlIGRlcDsgbWFrZSB2bWxpbnV4CisgKgorICogIFN0ZXAgMzoKKyAqICBEb3dubG9hZCB0aGUga2VybmVsIHRvIHRoZSByZW1vdGUgdGFyZ2V0IGFuZCBzdGFydAorICogIHRoZSBrZXJuZWwgcnVubmluZy4gSXQgd2lsbCBwcm9tcHRseSBoYWx0IGFuZCB3YWl0CisgKiAgZm9yIHRoZSBob3N0IGdkYiBzZXNzaW9uIHRvIGNvbm5lY3QuIEl0IGRvZXMgdGhpcworICogIHNpbmNlIHRoZSAiS2VybmVsIEhhY2tpbmciIG9wdGlvbiBoYXMgZGVmaW5lZAorICogIENPTkZJR19SRU1PVEVfREVCVUcgd2hpY2ggaW4gdHVybiBlbmFibGVzIHlvdXIgY2FsbHMKKyAqICB0bzoKKyAqICAgICBzZXRfZGVidWdfdHJhcHMoKTsKKyAqICAgICBicmVha3BvaW50KCk7CisgKgorICogIFN0ZXAgNDoKKyAqICBTdGFydCB0aGUgZ2RiIHNlc3Npb24gb24gdGhlIGhvc3QuCisgKgorICogIEV4YW1wbGU6CisgKiAgICAkIGFtMzNfMi4wLWxpbnV4LWdudS1nZGIgdm1saW51eAorICogICAgKGdkYikgc2V0IHJlbW90ZWJhdWQgMTE1MjAwCisgKiAgICAoZ2RiKSB0YXJnZXQgcmVtb3RlIC9kZXYvdHR5UzEKKyAqICAgIC4uLmF0IHRoaXMgcG9pbnQgeW91IGFyZSBjb25uZWN0ZWQgdG8KKyAqICAgICAgIHRoZSByZW1vdGUgdGFyZ2V0IGFuZCBjYW4gdXNlIGdkYgorICogICAgICAgaW4gdGhlIG5vcm1hbCBmYXNpb24uIFNldHRpbmcKKyAqICAgICAgIGJyZWFrcG9pbnRzLCBzaW5nbGUgc3RlcHBpbmcsCisgKiAgICAgICBwcmludGluZyB2YXJpYWJsZXMsIGV0Yy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorCisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2dkYi1zdHViLmg+CisjaW5jbHVkZSA8YXNtL2V4Y2VwdGlvbnMuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9zZXJpYWwtcmVncy5oPgorI2luY2x1ZGUgPGFzbS9idXNjdGwtcmVncy5oPgorI2luY2x1ZGUgPGFzbS91bml0L2xlZHMuaD4KKyNpbmNsdWRlIDxhc20vdW5pdC9zZXJpYWwuaD4KKworLyogZGVmaW5lIHRvIHVzZSBGN0Y3IHJhdGhlciB0aGFuIEZGIHdoaWNoIGlzIHN1YnZlcnRlZCBieSBKVEFHIGRlYnVnZ2VyICovCisjdW5kZWYgR0RCU1RVQl9VU0VfRjdGN19BU19CUkVBS1BPSU5UCisKKy8qCisgKiBCVUZNQVggZGVmaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBpbmJvdW5kL291dGJvdW5kIGJ1ZmZlcnMKKyAqIGF0IGxlYXN0IE5VTVJFR0JZVEVTKjIgYXJlIG5lZWRlZCBmb3IgcmVnaXN0ZXIgcGFja2V0cworICovCisjZGVmaW5lIEJVRk1BWCAyMDQ4CisKK3N0YXRpYyBjb25zdCBjaGFyIGdkYnN0dWJfYmFubmVyW10gPQorCSJMaW51eC9NTjEwMzAwIEdEQiBTdHViIChjKSBSZWRIYXQgMjAwN1xuIjsKKwordTgJZ2Ric3R1Yl9yeF9idWZmZXJbUEFHRV9TSVpFXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKFBBR0VfU0laRSkpKTsKK3UzMglnZGJzdHViX3J4X2lucDsKK3UzMglnZGJzdHViX3J4X291dHA7Cit1OAlnZGJzdHViX2J1c3k7Cit1OAlnZGJzdHViX3J4X292ZXJmbG93OwordTgJZ2Ric3R1Yl9yeF91bmdldDsKKworc3RhdGljIHU4CWdkYnN0dWJfZmx1c2hfY2FjaGVzOworc3RhdGljIGNoYXIJaW5wdXRfYnVmZmVyW0JVRk1BWF07CitzdGF0aWMgY2hhcglvdXRwdXRfYnVmZmVyW0JVRk1BWF07CitzdGF0aWMgY2hhcgl0cmFuc19idWZmZXJbQlVGTUFYXTsKKworc3RhdGljIGNvbnN0IGNoYXIgaGV4Y2hhcnNbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKworc3RydWN0IGdkYnN0dWJfYmtwdCB7CisJdTgJKmFkZHI7CQkvKiBhZGRyZXNzIG9mIGJyZWFrcG9pbnQgKi8KKwl1OAlsZW47CQkvKiBzaXplIG9mIGJyZWFrcG9pbnQgKi8KKwl1OAlvcmlnYnl0ZXNbN107CS8qIG9yaWdpbmFsIGJ5dGVzICovCit9OworCitzdGF0aWMgc3RydWN0IGdkYnN0dWJfYmtwdCBnZGJzdHViX2JrcHRzWzI1Nl07CisKKy8qCisgKiBsb2NhbCBwcm90b3R5cGVzCisgKi8KK3N0YXRpYyB2b2lkIGdldHBhY2tldChjaGFyICpidWZmZXIpOworc3RhdGljIGludCBwdXRwYWNrZXQoY2hhciAqYnVmZmVyKTsKK3N0YXRpYyBpbnQgY29tcHV0ZVNpZ25hbChlbnVtIGV4Y2VwdGlvbl9jb2RlIGV4Y2VwKTsKK3N0YXRpYyBpbnQgaGV4KHVuc2lnbmVkIGNoYXIgY2gpOworc3RhdGljIGludCBoZXhUb0ludChjaGFyICoqcHRyLCBpbnQgKmludFZhbHVlKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICptZW0yaGV4KGNvbnN0IHZvaWQgKm1lbSwgY2hhciAqYnVmLCBpbnQgY291bnQsCisJCQkgICAgICBpbnQgbWF5X2ZhdWx0KTsKK3N0YXRpYyBjb25zdCBjaGFyICpoZXgybWVtKGNvbnN0IGNoYXIgKmJ1Ziwgdm9pZCAqX21lbSwgaW50IGNvdW50LAorCQkJICAgaW50IG1heV9mYXVsdCk7CisKKy8qCisgKiBDb252ZXJ0IGNoIGZyb20gYSBoZXggZGlnaXQgdG8gYW4gaW50CisgKi8KK3N0YXRpYyBpbnQgaGV4KHVuc2lnbmVkIGNoYXIgY2gpCit7CisJaWYgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpCisJCXJldHVybiBjaCAtICdhJyArIDEwOworCWlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQorCQlyZXR1cm4gY2ggLSAnMCc7CisJaWYgKGNoID49ICdBJyAmJiBjaCA8PSAnRicpCisJCXJldHVybiBjaCAtICdBJyArIDEwOworCXJldHVybiAtMTsKK30KKworI2lmZGVmIENPTkZJR19HREJTVFVCX0RFQlVHR0lORworCit2b2lkIGRlYnVnX3RvX3NlcmlhbChjb25zdCBjaGFyICpwLCBpbnQgbikKK3sKKwlfX2RlYnVnX3RvX3NlcmlhbChwLCBuKTsKKwkvKiBnZGJzdHViX2NvbnNvbGVfd3JpdGUoTlVMTCwgcCwgbik7ICovCit9CisKK3ZvaWQgZ2Ric3R1Yl9wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWludCBsZW47CisKKwkvKiBFbWl0IHRoZSBvdXRwdXQgaW50byB0aGUgdGVtcG9yYXJ5IGJ1ZmZlciAqLworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJbGVuID0gdnNucHJpbnRmKHRyYW5zX2J1ZmZlciwgc2l6ZW9mKHRyYW5zX2J1ZmZlciksIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCWRlYnVnX3RvX3NlcmlhbCh0cmFuc19idWZmZXIsIGxlbik7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGNoYXIgKmdkYnN0dWJfc3RyY3B5KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjKQoreworCWludCBsb29wID0gMDsKKwl3aGlsZSAoKGRzdFtsb29wXSA9IHNyY1tsb29wXSkpCisJICAgICAgIGxvb3ArKzsKKwlyZXR1cm4gZHN0OworfQorCisvKgorICogc2NhbiBmb3IgdGhlIHNlcXVlbmNlICQ8ZGF0YT4jPGNoZWNrc3VtPgorICovCitzdGF0aWMgdm9pZCBnZXRwYWNrZXQoY2hhciAqYnVmZmVyKQoreworCXVuc2lnbmVkIGNoYXIgY2hlY2tzdW07CisJdW5zaWduZWQgY2hhciB4bWl0Y3N1bTsKKwl1bnNpZ25lZCBjaGFyIGNoOworCWludCBjb3VudCwgaSwgcmV0LCBlcnJvcjsKKworCWZvciAoOzspIHsKKwkJLyoKKwkJICogd2FpdCBhcm91bmQgZm9yIHRoZSBzdGFydCBjaGFyYWN0ZXIsCisJCSAqIGlnbm9yZSBhbGwgb3RoZXIgY2hhcmFjdGVycworCQkgKi8KKwkJZG8geworCQkJZ2Ric3R1Yl9pb19yeF9jaGFyKCZjaCwgMCk7CisJCX0gd2hpbGUgKGNoICE9ICckJyk7CisKKwkJY2hlY2tzdW0gPSAwOworCQl4bWl0Y3N1bSA9IC0xOworCQljb3VudCA9IDA7CisJCWVycm9yID0gMDsKKworCQkvKgorCQkgKiBub3csIHJlYWQgdW50aWwgYSAjIG9yIGVuZCBvZiBidWZmZXIgaXMgZm91bmQKKwkJICovCisJCXdoaWxlIChjb3VudCA8IEJVRk1BWCkgeworCQkJcmV0ID0gZ2Ric3R1Yl9pb19yeF9jaGFyKCZjaCwgMCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQllcnJvciA9IHJldDsKKworCQkJaWYgKGNoID09ICcjJykKKwkJCQlicmVhazsKKwkJCWNoZWNrc3VtICs9IGNoOworCQkJYnVmZmVyW2NvdW50XSA9IGNoOworCQkJY291bnQrKzsKKwkJfQorCisJCWlmIChlcnJvciA9PSAtRUlPKSB7CisJCQlnZGJzdHViX3Byb3RvKCIjIyMgR0RCIFJ4IEVycm9yIC0gU2tpcHBpbmcgcGFja2V0IgorCQkJCSAgICAgICIgIyMjXG4iKTsKKwkJCWdkYnN0dWJfcHJvdG8oIiMjIyBHREIgVHggTkFLXG4iKTsKKwkJCWdkYnN0dWJfaW9fdHhfY2hhcignLScpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoY291bnQgPj0gQlVGTUFYIHx8IGVycm9yKQorCQkJY29udGludWU7CisKKwkJYnVmZmVyW2NvdW50XSA9IDA7CisKKwkJLyogcmVhZCB0aGUgY2hlY2tzdW0gKi8KKwkJcmV0ID0gZ2Ric3R1Yl9pb19yeF9jaGFyKCZjaCwgMCk7CisJCWlmIChyZXQgPCAwKQorCQkJZXJyb3IgPSByZXQ7CisJCXhtaXRjc3VtID0gaGV4KGNoKSA8PCA0OworCisJCXJldCA9IGdkYnN0dWJfaW9fcnhfY2hhcigmY2gsIDApOworCQlpZiAocmV0IDwgMCkKKwkJCWVycm9yID0gcmV0OworCQl4bWl0Y3N1bSB8PSBoZXgoY2gpOworCisJCWlmIChlcnJvcikgeworCQkJaWYgKGVycm9yID09IC1FSU8pCisJCQkJZ2Ric3R1Yl9pbygiIyMjIEdEQiBSeCBFcnJvciAtIgorCQkJCQkgICAiIFNraXBwaW5nIHBhY2tldFxuIik7CisJCQlnZGJzdHViX2lvKCIjIyMgR0RCIFR4IE5BS1xuIik7CisJCQlnZGJzdHViX2lvX3R4X2NoYXIoJy0nKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogY2hlY2sgdGhlIGNoZWNrc3VtICovCisJCWlmIChjaGVja3N1bSAhPSB4bWl0Y3N1bSkgeworCQkJZ2Ric3R1Yl9pbygiIyMjIEdEQiBUeCBOQUtcbiIpOworCQkJZ2Ric3R1Yl9pb190eF9jaGFyKCctJyk7CS8qIGZhaWxlZCBjaGVja3N1bSAqLworCQkJY29udGludWU7CisJCX0KKworCQlnZGJzdHViX3Byb3RvKCIjIyMgR0RCIFJ4ICckJXMjJTAyeCcgIyMjXG4iLCBidWZmZXIsIGNoZWNrc3VtKTsKKwkJZ2Ric3R1Yl9pbygiIyMjIEdEQiBUeCBBQ0tcbiIpOworCQlnZGJzdHViX2lvX3R4X2NoYXIoJysnKTsgLyogc3VjY2Vzc2Z1bCB0cmFuc2ZlciAqLworCisJCS8qCisJCSAqIGlmIGEgc2VxdWVuY2UgY2hhciBpcyBwcmVzZW50LAorCQkgKiByZXBseSB0aGUgc2VxdWVuY2UgSUQKKwkJICovCisJCWlmIChidWZmZXJbMl0gPT0gJzonKSB7CisJCQlnZGJzdHViX2lvX3R4X2NoYXIoYnVmZmVyWzBdKTsKKwkJCWdkYnN0dWJfaW9fdHhfY2hhcihidWZmZXJbMV0pOworCisJCQkvKgorCQkJICogcmVtb3ZlIHNlcXVlbmNlIGNoYXJzIGZyb20gYnVmZmVyCisJCQkgKi8KKwkJCWNvdW50ID0gMDsKKwkJCXdoaWxlIChidWZmZXJbY291bnRdKQorCQkJCWNvdW50Kys7CisJCQlmb3IgKGkgPSAzOyBpIDw9IGNvdW50OyBpKyspCisJCQkJYnVmZmVyW2kgLSAzXSA9IGJ1ZmZlcltpXTsKKwkJfQorCisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIHNlbmQgdGhlIHBhY2tldCBpbiBidWZmZXIuCisgKiAtIHJldHVybiAwIGlmIHN1Y2Nlc3NmdWxseSBBQ0snZAorICogLSByZXR1cm4gMSBpZiBhYmFuZG9uZWQgZHVlIHRvIG5ldyBpbmNvbWluZyBwYWNrZXQKKyAqLworc3RhdGljIGludCBwdXRwYWNrZXQoY2hhciAqYnVmZmVyKQoreworCXVuc2lnbmVkIGNoYXIgY2hlY2tzdW07CisJdW5zaWduZWQgY2hhciBjaDsKKwlpbnQgY291bnQ7CisKKwkvKgorCSAqICQ8cGFja2V0IGluZm8+IzxjaGVja3N1bT4uCisJICovCisJZ2Ric3R1Yl9wcm90bygiIyMjIEdEQiBUeCAkJyVzJyM/PyAjIyNcbiIsIGJ1ZmZlcik7CisKKwlkbyB7CisJCWdkYnN0dWJfaW9fdHhfY2hhcignJCcpOworCQljaGVja3N1bSA9IDA7CisJCWNvdW50ID0gMDsKKworCQl3aGlsZSAoKGNoID0gYnVmZmVyW2NvdW50XSkgIT0gMCkgeworCQkJZ2Ric3R1Yl9pb190eF9jaGFyKGNoKTsKKwkJCWNoZWNrc3VtICs9IGNoOworCQkJY291bnQgKz0gMTsKKwkJfQorCisJCWdkYnN0dWJfaW9fdHhfY2hhcignIycpOworCQlnZGJzdHViX2lvX3R4X2NoYXIoaGV4Y2hhcnNbY2hlY2tzdW0gPj4gNF0pOworCQlnZGJzdHViX2lvX3R4X2NoYXIoaGV4Y2hhcnNbY2hlY2tzdW0gJiAweGZdKTsKKworCX0gd2hpbGUgKGdkYnN0dWJfaW9fcnhfY2hhcigmY2gsIDApLAorCQkgY2ggPT0gJy0nICYmIChnZGJzdHViX2lvKCIjIyMgR0RCIFJ4IE5BS1xuIiksIDApLAorCQkgY2ggIT0gJy0nICYmIGNoICE9ICcrJyAmJgorCQkgKGdkYnN0dWJfaW8oIiMjIyBHREIgUnggPz8/ICUwMnhcbiIsIGNoKSwgMCksCisJCSBjaCAhPSAnKycgJiYgY2ggIT0gJyQnKTsKKworCWlmIChjaCA9PSAnKycpIHsKKwkJZ2Ric3R1Yl9pbygiIyMjIEdEQiBSeCBBQ0tcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlnZGJzdHViX2lvKCIjIyMgR0RCIFR4IEFiYW5kb25lZFxuIik7CisJZ2Ric3R1Yl9yeF91bmdldCA9IGNoOworCXJldHVybiAxOworfQorCisvKgorICogV2hpbGUgd2UgZmluZCBuaWNlIGhleCBjaGFycywgYnVpbGQgYW4gaW50LgorICogUmV0dXJuIG51bWJlciBvZiBjaGFycyBwcm9jZXNzZWQuCisgKi8KK3N0YXRpYyBpbnQgaGV4VG9JbnQoY2hhciAqKnB0ciwgaW50ICppbnRWYWx1ZSkKK3sKKwlpbnQgbnVtQ2hhcnMgPSAwOworCWludCBoZXhWYWx1ZTsKKworCSppbnRWYWx1ZSA9IDA7CisKKwl3aGlsZSAoKipwdHIpIHsKKwkJaGV4VmFsdWUgPSBoZXgoKipwdHIpOworCQlpZiAoaGV4VmFsdWUgPCAwKQorCQkJYnJlYWs7CisKKwkJKmludFZhbHVlID0gKCppbnRWYWx1ZSA8PCA0KSB8IGhleFZhbHVlOworCQludW1DaGFycysrOworCisJCSgqcHRyKSsrOworCX0KKworCXJldHVybiAobnVtQ2hhcnMpOworfQorCisvKgorICogV2Ugc2luZ2xlLXN0ZXAgYnkgc2V0dGluZyBicmVha3BvaW50cy4gV2hlbiBhbiBleGNlcHRpb24KKyAqIGlzIGhhbmRsZWQsIHdlIG5lZWQgdG8gcmVzdG9yZSB0aGUgaW5zdHJ1Y3Rpb25zIGhvaXN0ZWQKKyAqIHdoZW4gdGhlIGJyZWFrcG9pbnRzIHdlcmUgc2V0LgorICoKKyAqIFRoaXMgaXMgd2hlcmUgd2Ugc2F2ZSB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb25zLgorICovCitzdGF0aWMgc3RydWN0IGdkYl9icF9zYXZlIHsKKwl1OAkqYWRkcjsKKwl1OAlvcGNvZGVbMl07Cit9IHN0ZXBfYnBbMl07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGdkYnN0dWJfaW5zbl9zaXplc1syNTZdID0KK3sKKwkvKiAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5ICBhICBiICBjICBkICBlICBmICovCisJMSwgMywgMywgMywgMSwgMywgMywgMywgMSwgMywgMywgMywgMSwgMywgMywgMywJLyogMCAqLworCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8qIDEgKi8KKwkyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCAvKiAyICovCisJMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMSwgMSwgMSwgMSwgLyogMyAqLworCTEsIDEsIDIsIDIsIDEsIDEsIDIsIDIsIDEsIDEsIDIsIDIsIDEsIDEsIDIsIDIsIC8qIDQgKi8KKwkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAvKiA1ICovCisJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLyogNiAqLworCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8qIDcgKi8KKwkyLCAxLCAxLCAxLCAxLCAyLCAxLCAxLCAxLCAxLCAyLCAxLCAxLCAxLCAxLCAyLCAvKiA4ICovCisJMiwgMSwgMSwgMSwgMSwgMiwgMSwgMSwgMSwgMSwgMiwgMSwgMSwgMSwgMSwgMiwgLyogOSAqLworCTIsIDEsIDEsIDEsIDEsIDIsIDEsIDEsIDEsIDEsIDIsIDEsIDEsIDEsIDEsIDIsIC8qIGEgKi8KKwkyLCAxLCAxLCAxLCAxLCAyLCAxLCAxLCAxLCAxLCAyLCAxLCAxLCAxLCAxLCAyLCAvKiBiICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMiwgMiwgLyogYyAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8qIGQgKi8KKwkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvKiBlICovCisJMCwgMiwgMiwgMiwgMiwgMiwgMiwgNCwgMCwgMywgMCwgNCwgMCwgNiwgNywgMSAgLyogZiAqLworfTsKKworc3RhdGljIGludCBfX2dkYnN0dWJfbWFya19icCh1OCAqYWRkciwgaW50IGl4KQoreworCWlmIChhZGRyIDwgKHU4ICopIDB4NzAwMDAwMDBVTCkKKwkJcmV0dXJuIDA7CisJLyogNzAwMDAwMDAtN2ZmZmZmZmY6IHZtYWxsb2MgYXJlYSAqLworCWlmIChhZGRyIDwgKHU4ICopIDB4ODAwMDAwMDBVTCkKKwkJZ290byBva2F5OworCWlmIChhZGRyIDwgKHU4ICopIDB4OGMwMDAwMDBVTCkKKwkJcmV0dXJuIDA7CisJLyogOGMwMDAwMDAtOTNmZmZmZmY6IFNSQU0sIFNEUkFNICovCisJaWYgKGFkZHIgPCAodTggKikgMHg5NDAwMDAwMFVMKQorCQlnb3RvIG9rYXk7CisJcmV0dXJuIDA7CisKK29rYXk6CisJaWYgKGdkYnN0dWJfcmVhZF9ieXRlKGFkZHIgKyAwLCAmc3RlcF9icFtpeF0ub3Bjb2RlWzBdKSA8IDAgfHwKKwkgICAgZ2Ric3R1Yl9yZWFkX2J5dGUoYWRkciArIDEsICZzdGVwX2JwW2l4XS5vcGNvZGVbMV0pIDwgMCkKKwkJcmV0dXJuIDA7CisKKwlzdGVwX2JwW2l4XS5hZGRyID0gYWRkcjsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fZ2Ric3R1Yl9yZXN0b3JlX2JwKHZvaWQpCit7CisjaWZkZWYgR0RCU1RVQl9VU0VfRjdGN19BU19CUkVBS1BPSU5UCisJaWYgKHN0ZXBfYnBbMF0uYWRkcikgeworCQlnZGJzdHViX3dyaXRlX2J5dGUoc3RlcF9icFswXS5vcGNvZGVbMF0sIHN0ZXBfYnBbMF0uYWRkciArIDApOworCQlnZGJzdHViX3dyaXRlX2J5dGUoc3RlcF9icFswXS5vcGNvZGVbMV0sIHN0ZXBfYnBbMF0uYWRkciArIDEpOworCX0KKwlpZiAoc3RlcF9icFsxXS5hZGRyKSB7CisJCWdkYnN0dWJfd3JpdGVfYnl0ZShzdGVwX2JwWzFdLm9wY29kZVswXSwgc3RlcF9icFsxXS5hZGRyICsgMCk7CisJCWdkYnN0dWJfd3JpdGVfYnl0ZShzdGVwX2JwWzFdLm9wY29kZVsxXSwgc3RlcF9icFsxXS5hZGRyICsgMSk7CisJfQorI2Vsc2UKKwlpZiAoc3RlcF9icFswXS5hZGRyKQorCQlnZGJzdHViX3dyaXRlX2J5dGUoc3RlcF9icFswXS5vcGNvZGVbMF0sIHN0ZXBfYnBbMF0uYWRkciArIDApOworCWlmIChzdGVwX2JwWzFdLmFkZHIpCisJCWdkYnN0dWJfd3JpdGVfYnl0ZShzdGVwX2JwWzFdLm9wY29kZVswXSwgc3RlcF9icFsxXS5hZGRyICsgMCk7CisjZW5kaWYKKworCWdkYnN0dWJfZmx1c2hfY2FjaGVzID0gMTsKKworCXN0ZXBfYnBbMF0uYWRkcgkJPSBOVUxMOworCXN0ZXBfYnBbMF0ub3Bjb2RlWzBdCT0gMDsKKwlzdGVwX2JwWzBdLm9wY29kZVsxXQk9IDA7CisJc3RlcF9icFsxXS5hZGRyCQk9IE5VTEw7CisJc3RlcF9icFsxXS5vcGNvZGVbMF0JPSAwOworCXN0ZXBfYnBbMV0ub3Bjb2RlWzFdCT0gMDsKK30KKworLyoKKyAqIGVtdWxhdGUgc2luZ2xlIHN0ZXBwaW5nIGJ5IG1lYW5zIG9mIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb25zCisgKi8KK3N0YXRpYyBpbnQgZ2Ric3R1Yl9zaW5nbGVfc3RlcChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBzaXplOworCXVpbnQzMl90IHg7CisJdWludDhfdCBjdXIsICpwYywgKnNwOworCisJc3RlcF9icFswXS5hZGRyCQk9IE5VTEw7CisJc3RlcF9icFswXS5vcGNvZGVbMF0JPSAwOworCXN0ZXBfYnBbMF0ub3Bjb2RlWzFdCT0gMDsKKwlzdGVwX2JwWzFdLmFkZHIJCT0gTlVMTDsKKwlzdGVwX2JwWzFdLm9wY29kZVswXQk9IDA7CisJc3RlcF9icFsxXS5vcGNvZGVbMV0JPSAwOworCXggPSAwOworCisJcGMgPSAodTggKikgcmVncy0+cGM7CisJc3AgPSAodTggKikgKHJlZ3MgKyAxKTsKKwlpZiAoZ2Ric3R1Yl9yZWFkX2J5dGUocGMsICZjdXIpIDwgMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlnZGJzdHViX2JrcHQoIlNpbmdsZSBTdGVwIGZyb20gJXAgeyAlMDJ4IH1cbiIsIHBjLCBjdXIpOworCisJZ2Ric3R1Yl9mbHVzaF9jYWNoZXMgPSAxOworCisJc2l6ZSA9IGdkYnN0dWJfaW5zbl9zaXplc1tjdXJdOworCWlmIChzaXplID4gMCkgeworCQlpZiAoIV9fZ2Ric3R1Yl9tYXJrX2JwKHBjICsgc2l6ZSwgMCkpCisJCQlnb3RvIGZhdWx0OworCX0gZWxzZSB7CisJCXN3aXRjaCAoY3VyKSB7CisJCQkvKiBCeHggKGQ4LFBDKSAqLworCQljYXNlIDB4YzA6CisJCWNhc2UgMHhjMToKKwkJY2FzZSAweGMyOgorCQljYXNlIDB4YzM6CisJCWNhc2UgMHhjNDoKKwkJY2FzZSAweGM1OgorCQljYXNlIDB4YzY6CisJCWNhc2UgMHhjNzoKKwkJY2FzZSAweGM4OgorCQljYXNlIDB4Yzk6CisJCWNhc2UgMHhjYToKKwkJCWlmIChnZGJzdHViX3JlYWRfYnl0ZShwYyArIDEsICh1OCAqKSAmeCkgPCAwKQorCQkJCWdvdG8gZmF1bHQ7CisJCQlpZiAoIV9fZ2Ric3R1Yl9tYXJrX2JwKHBjICsgMiwgMCkpCisJCQkJZ290byBmYXVsdDsKKwkJCWlmICgoeCA8IDAgfHwgeCA+IDIpICYmCisJCQkgICAgIV9fZ2Ric3R1Yl9tYXJrX2JwKHBjICsgKHM4KSB4LCAxKSkKKwkJCQlnb3RvIGZhdWx0OworCQkJYnJlYWs7CisKKwkJCS8qIExYWCAoZDgsUEMpICovCisJCWNhc2UgMHhkMDoKKwkJY2FzZSAweGQxOgorCQljYXNlIDB4ZDI6CisJCWNhc2UgMHhkMzoKKwkJY2FzZSAweGQ0OgorCQljYXNlIDB4ZDU6CisJCWNhc2UgMHhkNjoKKwkJY2FzZSAweGQ3OgorCQljYXNlIDB4ZDg6CisJCWNhc2UgMHhkOToKKwkJY2FzZSAweGRhOgorCQkJaWYgKCFfX2dkYnN0dWJfbWFya19icChwYyArIDEsIDApKQorCQkJCWdvdG8gZmF1bHQ7CisJCQlpZiAocmVncy0+cGMgIT0gcmVncy0+bGFyICYmCisJCQkgICAgIV9fZ2Ric3R1Yl9tYXJrX2JwKCh1OCAqKSByZWdzLT5sYXIsIDEpKQorCQkJCWdvdG8gZmF1bHQ7CisJCQlicmVhazsKKworCQkJLyogU0VUTEIgLSBsb2FkcyB0aGUgbmV4dCBmb3IgYnl0ZXMgaW50byB0aGUgTElSCisJCQkgKiByZWdpc3RlciAqLworCQljYXNlIDB4ZGI6CisJCQlpZiAoIV9fZ2Ric3R1Yl9tYXJrX2JwKHBjICsgMSwgMCkpCisJCQkJZ290byBmYXVsdDsKKwkJCWJyZWFrOworCisJCQkvKiBKTVAgKGQxNixQQykgb3IgQ0FMTCAoZDE2LFBDKSAqLworCQljYXNlIDB4Y2M6CisJCWNhc2UgMHhjZDoKKwkJCWlmIChnZGJzdHViX3JlYWRfYnl0ZShwYyArIDEsICgodTggKikgJngpICsgMCkgPCAwIHx8CisJCQkgICAgZ2Ric3R1Yl9yZWFkX2J5dGUocGMgKyAyLCAoKHU4ICopICZ4KSArIDEpIDwgMCkKKwkJCQlnb3RvIGZhdWx0OworCQkJaWYgKCFfX2dkYnN0dWJfbWFya19icChwYyArIChzMTYpIHgsIDApKQorCQkJCWdvdG8gZmF1bHQ7CisJCQlicmVhazsKKworCQkJLyogSk1QIChkMzIsUEMpIG9yIENBTEwgKGQzMixQQykgKi8KKwkJY2FzZSAweGRjOgorCQljYXNlIDB4ZGQ6CisJCQlpZiAoZ2Ric3R1Yl9yZWFkX2J5dGUocGMgKyAxLCAoKHU4ICopICZ4KSArIDApIDwgMCB8fAorCQkJICAgIGdkYnN0dWJfcmVhZF9ieXRlKHBjICsgMiwgKCh1OCAqKSAmeCkgKyAxKSA8IDAgfHwKKwkJCSAgICBnZGJzdHViX3JlYWRfYnl0ZShwYyArIDMsICgodTggKikgJngpICsgMikgPCAwIHx8CisJCQkgICAgZ2Ric3R1Yl9yZWFkX2J5dGUocGMgKyA0LCAoKHU4ICopICZ4KSArIDMpIDwgMCkKKwkJCQlnb3RvIGZhdWx0OworCQkJaWYgKCFfX2dkYnN0dWJfbWFya19icChwYyArIChzMzIpIHgsIDApKQorCQkJCWdvdG8gZmF1bHQ7CisJCQlicmVhazsKKworCQkJLyogUkVURiAqLworCQljYXNlIDB4ZGU6CisJCQlpZiAoIV9fZ2Ric3R1Yl9tYXJrX2JwKCh1OCAqKSByZWdzLT5tZHIsIDApKQorCQkJCWdvdG8gZmF1bHQ7CisJCQlicmVhazsKKworCQkJLyogUkVUICovCisJCWNhc2UgMHhkZjoKKwkJCWlmIChnZGJzdHViX3JlYWRfYnl0ZShwYyArIDIsICh1OCAqKSAmeCkgPCAwKQorCQkJCWdvdG8gZmF1bHQ7CisJCQlzcCArPSAoczgpeDsKKwkJCWlmIChnZGJzdHViX3JlYWRfYnl0ZShzcCArIDAsICgodTggKikgJngpICsgMCkgPCAwIHx8CisJCQkgICAgZ2Ric3R1Yl9yZWFkX2J5dGUoc3AgKyAxLCAoKHU4ICopICZ4KSArIDEpIDwgMCB8fAorCQkJICAgIGdkYnN0dWJfcmVhZF9ieXRlKHNwICsgMiwgKCh1OCAqKSAmeCkgKyAyKSA8IDAgfHwKKwkJCSAgICBnZGJzdHViX3JlYWRfYnl0ZShzcCArIDMsICgodTggKikgJngpICsgMykgPCAwKQorCQkJCWdvdG8gZmF1bHQ7CisJCQlpZiAoIV9fZ2Ric3R1Yl9tYXJrX2JwKCh1OCAqKSB4LCAwKSkKKwkJCQlnb3RvIGZhdWx0OworCQkJYnJlYWs7CisKKwkJY2FzZSAweGYwOgorCQkJaWYgKGdkYnN0dWJfcmVhZF9ieXRlKHBjICsgMSwgJmN1cikgPCAwKQorCQkJCWdvdG8gZmF1bHQ7CisKKwkJCWlmIChjdXIgPj0gMHhmMCAmJiBjdXIgPD0gMHhmNykgeworCQkJCS8qIEpNUCAoQW4pIC8gQ0FMTFMgKEFuKSAqLworCQkJCXN3aXRjaCAoY3VyICYgMykgeworCQkJCWNhc2UgMDogeCA9IHJlZ3MtPmEwOyBicmVhazsKKwkJCQljYXNlIDE6IHggPSByZWdzLT5hMTsgYnJlYWs7CisJCQkJY2FzZSAyOiB4ID0gcmVncy0+YTI7IGJyZWFrOworCQkJCWNhc2UgMzogeCA9IHJlZ3MtPmEzOyBicmVhazsKKwkJCQl9CisJCQkJaWYgKCFfX2dkYnN0dWJfbWFya19icCgodTggKikgeCwgMCkpCisJCQkJCWdvdG8gZmF1bHQ7CisJCQl9IGVsc2UgaWYgKGN1ciA9PSAweGZjKSB7CisJCQkJLyogUkVUUyAqLworCQkJCWlmIChnZGJzdHViX3JlYWRfYnl0ZSgKKwkJCQkJICAgIHNwICsgMCwgKCh1OCAqKSAmeCkgKyAwKSA8IDAgfHwKKwkJCQkgICAgZ2Ric3R1Yl9yZWFkX2J5dGUoCisJCQkJCSAgICBzcCArIDEsICgodTggKikgJngpICsgMSkgPCAwIHx8CisJCQkJICAgIGdkYnN0dWJfcmVhZF9ieXRlKAorCQkJCQkgICAgc3AgKyAyLCAoKHU4ICopICZ4KSArIDIpIDwgMCB8fAorCQkJCSAgICBnZGJzdHViX3JlYWRfYnl0ZSgKKwkJCQkJICAgIHNwICsgMywgKCh1OCAqKSAmeCkgKyAzKSA8IDApCisJCQkJCWdvdG8gZmF1bHQ7CisJCQkJaWYgKCFfX2dkYnN0dWJfbWFya19icCgodTggKikgeCwgMCkpCisJCQkJCWdvdG8gZmF1bHQ7CisJCQl9IGVsc2UgaWYgKGN1ciA9PSAweGZkKSB7CisJCQkJLyogUlRJICovCisJCQkJaWYgKGdkYnN0dWJfcmVhZF9ieXRlKAorCQkJCQkgICAgc3AgKyA0LCAoKHU4ICopICZ4KSArIDApIDwgMCB8fAorCQkJCSAgICBnZGJzdHViX3JlYWRfYnl0ZSgKKwkJCQkJICAgIHNwICsgNSwgKCh1OCAqKSAmeCkgKyAxKSA8IDAgfHwKKwkJCQkgICAgZ2Ric3R1Yl9yZWFkX2J5dGUoCisJCQkJCSAgICBzcCArIDYsICgodTggKikgJngpICsgMikgPCAwIHx8CisJCQkJICAgIGdkYnN0dWJfcmVhZF9ieXRlKAorCQkJCQkgICAgc3AgKyA3LCAoKHU4ICopICZ4KSArIDMpIDwgMCkKKwkJCQkJZ290byBmYXVsdDsKKwkJCQlpZiAoIV9fZ2Ric3R1Yl9tYXJrX2JwKCh1OCAqKSB4LCAwKSkKKwkJCQkJZ290byBmYXVsdDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFfX2dkYnN0dWJfbWFya19icChwYyArIDIsIDApKQorCQkJCQlnb3RvIGZhdWx0OworCQkJfQorCisJCQlicmVhazsKKworCQkJLyogcG90ZW50aWFsIDMtYnl0ZSBjb25kaXRpb25hbCBicmFuY2hlcyAqLworCQljYXNlIDB4Zjg6CisJCQlpZiAoZ2Ric3R1Yl9yZWFkX2J5dGUocGMgKyAxLCAmY3VyKSA8IDApCisJCQkJZ290byBmYXVsdDsKKwkJCWlmICghX19nZGJzdHViX21hcmtfYnAocGMgKyAzLCAwKSkKKwkJCQlnb3RvIGZhdWx0OworCisJCQlpZiAoY3VyID49IDB4ZTggJiYgY3VyIDw9IDB4ZWIpIHsKKwkJCQlpZiAoZ2Ric3R1Yl9yZWFkX2J5dGUoCisJCQkJCSAgICBwYyArIDIsICgodTggKikgJngpICsgMCkgPCAwKQorCQkJCQlnb3RvIGZhdWx0OworCQkJCWlmICgoeCA8IDAgfHwgeCA+IDMpICYmCisJCQkJICAgICFfX2dkYnN0dWJfbWFya19icChwYyArIChzOCkgeCwgMSkpCisJCQkJCWdvdG8gZmF1bHQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDB4ZmE6CisJCQlpZiAoZ2Ric3R1Yl9yZWFkX2J5dGUocGMgKyAxLCAmY3VyKSA8IDApCisJCQkJZ290byBmYXVsdDsKKworCQkJaWYgKGN1ciA9PSAweGZmKSB7CisJCQkJLyogQ0FMTFMgKGQxNixQQykgKi8KKwkJCQlpZiAoZ2Ric3R1Yl9yZWFkX2J5dGUoCisJCQkJCSAgICBwYyArIDIsICgodTggKikgJngpICsgMCkgPCAwIHx8CisJCQkJICAgIGdkYnN0dWJfcmVhZF9ieXRlKAorCQkJCQkgICAgcGMgKyAzLCAoKHU4ICopICZ4KSArIDEpIDwgMCkKKwkJCQkJZ290byBmYXVsdDsKKwkJCQlpZiAoIV9fZ2Ric3R1Yl9tYXJrX2JwKHBjICsgKHMxNikgeCwgMCkpCisJCQkJCWdvdG8gZmF1bHQ7CisJCQl9IGVsc2UgeworCQkJCWlmICghX19nZGJzdHViX21hcmtfYnAocGMgKyA0LCAwKSkKKwkJCQkJZ290byBmYXVsdDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgMHhmYzoKKwkJCWlmIChnZGJzdHViX3JlYWRfYnl0ZShwYyArIDEsICZjdXIpIDwgMCkKKwkJCQlnb3RvIGZhdWx0OworCQkJaWYgKGN1ciA9PSAweGZmKSB7CisJCQkJLyogQ0FMTFMgKGQzMixQQykgKi8KKwkJCQlpZiAoZ2Ric3R1Yl9yZWFkX2J5dGUoCisJCQkJCSAgICBwYyArIDIsICgodTggKikgJngpICsgMCkgPCAwIHx8CisJCQkJICAgIGdkYnN0dWJfcmVhZF9ieXRlKAorCQkJCQkgICAgcGMgKyAzLCAoKHU4ICopICZ4KSArIDEpIDwgMCB8fAorCQkJCSAgICBnZGJzdHViX3JlYWRfYnl0ZSgKKwkJCQkJICAgIHBjICsgNCwgKCh1OCAqKSAmeCkgKyAyKSA8IDAgfHwKKwkJCQkgICAgZ2Ric3R1Yl9yZWFkX2J5dGUoCisJCQkJCSAgICBwYyArIDUsICgodTggKikgJngpICsgMykgPCAwKQorCQkJCQlnb3RvIGZhdWx0OworCQkJCWlmICghX19nZGJzdHViX21hcmtfYnAoCisJCQkJCSAgICBwYyArIChzMzIpIHgsIDApKQorCQkJCQlnb3RvIGZhdWx0OworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIV9fZ2Ric3R1Yl9tYXJrX2JwKAorCQkJCQkgICAgcGMgKyA2LCAwKSkKKwkJCQkJZ290byBmYXVsdDsKKwkJCX0KKwkJCWJyZWFrOworCisJCX0KKwl9CisKKwlnZGJzdHViX2JrcHQoIlN0ZXA6ICUwMnggYXQgJXA7ICUwMnggYXQgJXBcbiIsCisJCSAgICAgc3RlcF9icFswXS5vcGNvZGVbMF0sIHN0ZXBfYnBbMF0uYWRkciwKKwkJICAgICBzdGVwX2JwWzFdLm9wY29kZVswXSwgc3RlcF9icFsxXS5hZGRyKTsKKworCWlmIChzdGVwX2JwWzBdLmFkZHIpIHsKKyNpZmRlZiBHREJTVFVCX1VTRV9GN0Y3X0FTX0JSRUFLUE9JTlQKKwkJaWYgKGdkYnN0dWJfd3JpdGVfYnl0ZSgweEY3LCBzdGVwX2JwWzBdLmFkZHIgKyAwKSA8IDAgfHwKKwkJICAgIGdkYnN0dWJfd3JpdGVfYnl0ZSgweEY3LCBzdGVwX2JwWzBdLmFkZHIgKyAxKSA8IDApCisJCQlnb3RvIGZhdWx0OworI2Vsc2UKKwkJaWYgKGdkYnN0dWJfd3JpdGVfYnl0ZSgweEZGLCBzdGVwX2JwWzBdLmFkZHIgKyAwKSA8IDApCisJCQlnb3RvIGZhdWx0OworI2VuZGlmCisJfQorCisJaWYgKHN0ZXBfYnBbMV0uYWRkcikgeworI2lmZGVmIEdEQlNUVUJfVVNFX0Y3RjdfQVNfQlJFQUtQT0lOVAorCQlpZiAoZ2Ric3R1Yl93cml0ZV9ieXRlKDB4RjcsIHN0ZXBfYnBbMV0uYWRkciArIDApIDwgMCB8fAorCQkgICAgZ2Ric3R1Yl93cml0ZV9ieXRlKDB4RjcsIHN0ZXBfYnBbMV0uYWRkciArIDEpIDwgMCkKKwkJCWdvdG8gZmF1bHQ7CisjZWxzZQorCQlpZiAoZ2Ric3R1Yl93cml0ZV9ieXRlKDB4RkYsIHN0ZXBfYnBbMV0uYWRkciArIDApIDwgMCkKKwkJCWdvdG8gZmF1bHQ7CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gMDsKKworIGZhdWx0OgorCS8qIHVoLW9oIC0gc2lsbHkgYWRkcmVzcyBhbGVydCwgdHJ5IGFuZCByZXN0b3JlIHRoaW5ncyAqLworCV9fZ2Ric3R1Yl9yZXN0b3JlX2JwKCk7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKKyNpZmRlZiBDT05GSUdfR0RCU1RVQl9DT05TT0xFCisKK3ZvaWQgZ2Ric3R1Yl9jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjb24sIGNvbnN0IGNoYXIgKnAsIHVuc2lnbmVkIG4pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgZ2Ric3R1Yl9jcltdID0geyAweDBkIH07CisJY2hhciBvdXRidWZbMjZdOworCWludCBxdHk7CisJdTggYnVzeTsKKworCWJ1c3kgPSBnZGJzdHViX2J1c3k7CisJZ2Ric3R1Yl9idXN5ID0gMTsKKworCW91dGJ1ZlswXSA9ICdPJzsKKworCXdoaWxlIChuID4gMCkgeworCQlxdHkgPSAxOworCisJCXdoaWxlIChuID4gMCAmJiBxdHkgPCAyMCkgeworCQkJbWVtMmhleChwLCBvdXRidWYgKyBxdHksIDIsIDApOworCQkJcXR5ICs9IDI7CisJCQlpZiAoKnAgPT0gMHgwYSkgeworCQkJCW1lbTJoZXgoZ2Ric3R1Yl9jciwgb3V0YnVmICsgcXR5LCAyLCAwKTsKKwkJCQlxdHkgKz0gMjsKKwkJCX0KKwkJCXArKzsKKwkJCW4tLTsKKwkJfQorCisJCW91dGJ1ZltxdHldID0gMDsKKwkJcHV0cGFja2V0KG91dGJ1Zik7CisJfQorCisJZ2Ric3R1Yl9idXN5ID0gYnVzeTsKK30KKworc3RhdGljIGtkZXZfdCBnZGJzdHViX2NvbnNvbGVfZGV2KHN0cnVjdCBjb25zb2xlICpjb24pCit7CisJcmV0dXJuIE1LREVWKDEsIDMpOyAvKiAvZGV2L251bGwgKi8KK30KKworc3RhdGljIHN0cnVjdCBjb25zb2xlIGdkYnN0dWJfY29uc29sZSA9IHsKKwkubmFtZQk9ICJnZGIiLAorCS53cml0ZQk9IGdkYnN0dWJfY29uc29sZV93cml0ZSwKKwkuZGV2aWNlCT0gZ2Ric3R1Yl9jb25zb2xlX2RldiwKKwkuZmxhZ3MJPSBDT05fUFJJTlRCVUZGRVIsCisJLmluZGV4CT0gLTEsCit9OworCisjZW5kaWYKKworLyoKKyAqIENvbnZlcnQgdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IG1lbSBpbnRvIGhleCwgcGxhY2luZyByZXN1bHQgaW4gYnVmLgorICogLSBpZiBzdWNjZXNzZnVsLCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBsYXN0IGNoYXIgcHV0IGluIGJ1ZiAoTlVMKQorICogLSBpbiBjYXNlIG9mIG1lbSBmYXVsdCwgcmV0dXJuIE5VTEwKKyAqIG1heV9mYXVsdCBpcyBub24temVybyBpZiB3ZSBhcmUgcmVhZGluZyBmcm9tIGFyYml0cmFyeSBtZW1vcnksIGJ1dCBpcworICogY3VycmVudGx5IG5vdCB1c2VkLgorICovCitzdGF0aWMKK3Vuc2lnbmVkIGNoYXIgKm1lbTJoZXgoY29uc3Qgdm9pZCAqX21lbSwgY2hhciAqYnVmLCBpbnQgY291bnQsIGludCBtYXlfZmF1bHQpCit7CisJY29uc3QgdTggKm1lbSA9IF9tZW07CisJdTggY2hbNF07CisKKwlpZiAoKHUzMikgbWVtICYgMSAmJiBjb3VudCA+PSAxKSB7CisJCWlmIChnZGJzdHViX3JlYWRfYnl0ZShtZW0sIGNoKSAhPSAwKQorCQkJcmV0dXJuIDA7CisJCSpidWYrKyA9IGhleGNoYXJzW2NoWzBdID4+IDRdOworCQkqYnVmKysgPSBoZXhjaGFyc1tjaFswXSAmIDB4Zl07CisJCW1lbSsrOworCQljb3VudC0tOworCX0KKworCWlmICgodTMyKSBtZW0gJiAzICYmIGNvdW50ID49IDIpIHsKKwkJaWYgKGdkYnN0dWJfcmVhZF93b3JkKG1lbSwgY2gpICE9IDApCisJCQlyZXR1cm4gMDsKKwkJKmJ1ZisrID0gaGV4Y2hhcnNbY2hbMF0gPj4gNF07CisJCSpidWYrKyA9IGhleGNoYXJzW2NoWzBdICYgMHhmXTsKKwkJKmJ1ZisrID0gaGV4Y2hhcnNbY2hbMV0gPj4gNF07CisJCSpidWYrKyA9IGhleGNoYXJzW2NoWzFdICYgMHhmXTsKKwkJbWVtICs9IDI7CisJCWNvdW50IC09IDI7CisJfQorCisJd2hpbGUgKGNvdW50ID49IDQpIHsKKwkJaWYgKGdkYnN0dWJfcmVhZF9kd29yZChtZW0sIGNoKSAhPSAwKQorCQkJcmV0dXJuIDA7CisJCSpidWYrKyA9IGhleGNoYXJzW2NoWzBdID4+IDRdOworCQkqYnVmKysgPSBoZXhjaGFyc1tjaFswXSAmIDB4Zl07CisJCSpidWYrKyA9IGhleGNoYXJzW2NoWzFdID4+IDRdOworCQkqYnVmKysgPSBoZXhjaGFyc1tjaFsxXSAmIDB4Zl07CisJCSpidWYrKyA9IGhleGNoYXJzW2NoWzJdID4+IDRdOworCQkqYnVmKysgPSBoZXhjaGFyc1tjaFsyXSAmIDB4Zl07CisJCSpidWYrKyA9IGhleGNoYXJzW2NoWzNdID4+IDRdOworCQkqYnVmKysgPSBoZXhjaGFyc1tjaFszXSAmIDB4Zl07CisJCW1lbSArPSA0OworCQljb3VudCAtPSA0OworCX0KKworCWlmIChjb3VudCA+PSAyKSB7CisJCWlmIChnZGJzdHViX3JlYWRfd29yZChtZW0sIGNoKSAhPSAwKQorCQkJcmV0dXJuIDA7CisJCSpidWYrKyA9IGhleGNoYXJzW2NoWzBdID4+IDRdOworCQkqYnVmKysgPSBoZXhjaGFyc1tjaFswXSAmIDB4Zl07CisJCSpidWYrKyA9IGhleGNoYXJzW2NoWzFdID4+IDRdOworCQkqYnVmKysgPSBoZXhjaGFyc1tjaFsxXSAmIDB4Zl07CisJCW1lbSArPSAyOworCQljb3VudCAtPSAyOworCX0KKworCWlmIChjb3VudCA+PSAxKSB7CisJCWlmIChnZGJzdHViX3JlYWRfYnl0ZShtZW0sIGNoKSAhPSAwKQorCQkJcmV0dXJuIDA7CisJCSpidWYrKyA9IGhleGNoYXJzW2NoWzBdID4+IDRdOworCQkqYnVmKysgPSBoZXhjaGFyc1tjaFswXSAmIDB4Zl07CisJfQorCisJKmJ1ZiA9IDA7CisJcmV0dXJuIGJ1ZjsKK30KKworLyoKKyAqIGNvbnZlcnQgdGhlIGhleCBhcnJheSBwb2ludGVkIHRvIGJ5IGJ1ZiBpbnRvIGJpbmFyeSB0byBiZSBwbGFjZWQgaW4gbWVtCisgKiByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjaGFyYWN0ZXIgQUZURVIgdGhlIGxhc3QgYnl0ZSB3cml0dGVuCisgKiBtYXlfZmF1bHQgaXMgbm9uLXplcm8gaWYgd2UgYXJlIHJlYWRpbmcgZnJvbSBhcmJpdHJhcnkgbWVtb3J5LCBidXQgaXMKKyAqIGN1cnJlbnRseSBub3QgdXNlZC4KKyAqLworc3RhdGljCitjb25zdCBjaGFyICpoZXgybWVtKGNvbnN0IGNoYXIgKmJ1Ziwgdm9pZCAqX21lbSwgaW50IGNvdW50LCBpbnQgbWF5X2ZhdWx0KQoreworCXU4ICptZW0gPSBfbWVtOworCXVuaW9uIHsKKwkJdTMyIHZhbDsKKwkJdTggYls0XTsKKwl9IGNoOworCisJaWYgKCh1MzIpIG1lbSAmIDEgJiYgY291bnQgPj0gMSkgeworCQljaC5iWzBdICA9IGhleCgqYnVmKyspIDw8IDQ7CisJCWNoLmJbMF0gfD0gaGV4KCpidWYrKyk7CisJCWlmIChnZGJzdHViX3dyaXRlX2J5dGUoY2gudmFsLCBtZW0pICE9IDApCisJCQlyZXR1cm4gMDsKKwkJbWVtKys7CisJCWNvdW50LS07CisJfQorCisJaWYgKCh1MzIpIG1lbSAmIDMgJiYgY291bnQgPj0gMikgeworCQljaC5iWzBdICA9IGhleCgqYnVmKyspIDw8IDQ7CisJCWNoLmJbMF0gfD0gaGV4KCpidWYrKyk7CisJCWNoLmJbMV0gID0gaGV4KCpidWYrKykgPDwgNDsKKwkJY2guYlsxXSB8PSBoZXgoKmJ1ZisrKTsKKwkJaWYgKGdkYnN0dWJfd3JpdGVfd29yZChjaC52YWwsIG1lbSkgIT0gMCkKKwkJCXJldHVybiAwOworCQltZW0gKz0gMjsKKwkJY291bnQgLT0gMjsKKwl9CisKKwl3aGlsZSAoY291bnQgPj0gNCkgeworCQljaC5iWzBdICA9IGhleCgqYnVmKyspIDw8IDQ7CisJCWNoLmJbMF0gfD0gaGV4KCpidWYrKyk7CisJCWNoLmJbMV0gID0gaGV4KCpidWYrKykgPDwgNDsKKwkJY2guYlsxXSB8PSBoZXgoKmJ1ZisrKTsKKwkJY2guYlsyXSAgPSBoZXgoKmJ1ZisrKSA8PCA0OworCQljaC5iWzJdIHw9IGhleCgqYnVmKyspOworCQljaC5iWzNdICA9IGhleCgqYnVmKyspIDw8IDQ7CisJCWNoLmJbM10gfD0gaGV4KCpidWYrKyk7CisJCWlmIChnZGJzdHViX3dyaXRlX2R3b3JkKGNoLnZhbCwgbWVtKSAhPSAwKQorCQkJcmV0dXJuIDA7CisJCW1lbSArPSA0OworCQljb3VudCAtPSA0OworCX0KKworCWlmIChjb3VudCA+PSAyKSB7CisJCWNoLmJbMF0gID0gaGV4KCpidWYrKykgPDwgNDsKKwkJY2guYlswXSB8PSBoZXgoKmJ1ZisrKTsKKwkJY2guYlsxXSAgPSBoZXgoKmJ1ZisrKSA8PCA0OworCQljaC5iWzFdIHw9IGhleCgqYnVmKyspOworCQlpZiAoZ2Ric3R1Yl93cml0ZV93b3JkKGNoLnZhbCwgbWVtKSAhPSAwKQorCQkJcmV0dXJuIDA7CisJCW1lbSArPSAyOworCQljb3VudCAtPSAyOworCX0KKworCWlmIChjb3VudCA+PSAxKSB7CisJCWNoLmJbMF0gID0gaGV4KCpidWYrKykgPDwgNDsKKwkJY2guYlswXSB8PSBoZXgoKmJ1ZisrKTsKKwkJaWYgKGdkYnN0dWJfd3JpdGVfYnl0ZShjaC52YWwsIG1lbSkgIT0gMCkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiBidWY7Cit9CisKKy8qCisgKiBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBtYXBwaW5nIGJldHdlZW4gTU4xMDMwMCBleGNlcHRpb24gY29kZXMsIGFuZAorICogc2lnbmFscywgd2hpY2ggYXJlIHByaW1hcmlseSB3aGF0IEdEQiB1bmRlcnN0YW5kcy4gIEl0IGFsc28gaW5kaWNhdGVzCisgKiB3aGljaCBoYXJkd2FyZSB0cmFwcyB3ZSBuZWVkIHRvIGNvbW1hbmRlZXIgd2hlbiBpbml0aWFsaXppbmcgdGhlIHN0dWIuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXhjZXBfdG9fc2lnX21hcCB7CisJZW51bSBleGNlcHRpb25fY29kZQlleGNlcDsJLyogTU4xMDMwMCBleGNlcHRpb24gY29kZSAqLworCXVuc2lnbmVkIGNoYXIJCXNpZ25vOwkvKiBTaWduYWwgdGhhdCB3ZSBtYXAgdGhpcyBpbnRvICovCit9IGV4Y2VwX3RvX3NpZ19tYXBbXSA9IHsKKwl7IEVYQ0VQX0lUTEJNSVNTLAlTSUdTRUdWCQl9LAorCXsgRVhDRVBfRFRMQk1JU1MsCVNJR1NFR1YJCX0sCisJeyBFWENFUF9UUkFQLAkJU0lHVFJBUAkJfSwKKwl7IEVYQ0VQX0lTVEVQLAkJU0lHVFJBUAkJfSwKKwl7IEVYQ0VQX0lCUkVBSywJCVNJR1RSQVAJCX0sCisJeyBFWENFUF9PQlJFQUssCQlTSUdUUkFQCQl9LAorCXsgRVhDRVBfVU5JTVBJTlMsCVNJR0lMTAkJfSwKKwl7IEVYQ0VQX1VOSU1QRVhJTlMsCVNJR0lMTAkJfSwKKwl7IEVYQ0VQX01FTUVSUiwJCVNJR1NFR1YJCX0sCisJeyBFWENFUF9NSVNBTElHTiwJU0lHU0VHVgkJfSwKKwl7IEVYQ0VQX0JVU0VSUk9SLAlTSUdCVVMJCX0sCisJeyBFWENFUF9JTExJTlNBQ0MsCVNJR1NFR1YJCX0sCisJeyBFWENFUF9JTExEQVRBQ0MsCVNJR1NFR1YJCX0sCisJeyBFWENFUF9JT0lOU0FDQywJU0lHU0VHVgkJfSwKKwl7IEVYQ0VQX1BSSVZJTlNBQ0MsCVNJR1NFR1YJCX0sCisJeyBFWENFUF9QUklWREFUQUNDLAlTSUdTRUdWCQl9LAorCXsgRVhDRVBfRlBVX0RJU0FCTEVELAlTSUdGUEUJCX0sCisJeyBFWENFUF9GUFVfVU5JTVBJTlMsCVNJR0ZQRQkJfSwKKwl7IEVYQ0VQX0ZQVV9PUEVSQVRJT04sCVNJR0ZQRQkJfSwKKwl7IEVYQ0VQX1dEVCwJCVNJR0FMUk0JCX0sCisJeyBFWENFUF9OTUksCQlTSUdRVUlUCQl9LAorCXsgRVhDRVBfSVJRX0xFVkVMMCwJU0lHSU5UCQl9LAorCXsgRVhDRVBfSVJRX0xFVkVMMSwJU0lHSU5UCQl9LAorCXsgRVhDRVBfSVJRX0xFVkVMMiwJU0lHSU5UCQl9LAorCXsgRVhDRVBfSVJRX0xFVkVMMywJU0lHSU5UCQl9LAorCXsgRVhDRVBfSVJRX0xFVkVMNCwJU0lHSU5UCQl9LAorCXsgRVhDRVBfSVJRX0xFVkVMNSwJU0lHSU5UCQl9LAorCXsgRVhDRVBfSVJRX0xFVkVMNiwJU0lHSU5UCQl9LAorCXsgMCwgMH0KK307CisKKy8qCisgKiBjb252ZXJ0IHRoZSBNTjEwMzAwIGV4Y2VwdGlvbiBjb2RlIGludG8gYSBVTklYIHNpZ25hbCBudW1iZXIKKyAqLworc3RhdGljIGludCBjb21wdXRlU2lnbmFsKGVudW0gZXhjZXB0aW9uX2NvZGUgZXhjZXApCit7CisJY29uc3Qgc3RydWN0IGV4Y2VwX3RvX3NpZ19tYXAgKm1hcDsKKworCWZvciAobWFwID0gZXhjZXBfdG9fc2lnX21hcDsgbWFwLT5zaWdubzsgbWFwKyspCisJCWlmIChtYXAtPmV4Y2VwID09IGV4Y2VwKQorCQkJcmV0dXJuIG1hcC0+c2lnbm87CisKKwlyZXR1cm4gU0lHSFVQOyAvKiBkZWZhdWx0IGZvciB0aGluZ3Mgd2UgZG9uJ3Qga25vdyBhYm91dCAqLworfQorCitzdGF0aWMgdTMyIGdkYnN0dWJfZnBjciwgZ2Ric3R1Yl9mcHVmc19hcnJheVszMl07CisKKy8qCisgKgorICovCitzdGF0aWMgdm9pZCBnZGJzdHViX3N0b3JlX2ZwdSh2b2lkKQoreworI2lmZGVmIENPTkZJR19GUFUKKworCWFzbSB2b2xhdGlsZSgKKwkJIm9yICUyLGVwc3dcbiIKKyNpZmRlZiBDT05GSUdfTU4xMDMwMF9QUk9DX01OMTAzRTAxMAorCQkibm9wXG4iCisJCSJub3BcbiIKKyNlbmRpZgorCQkibW92ICUxLCBhMVxuIgorCQkiZm1vdiBmczAsICAoYTErKVxuIgorCQkiZm1vdiBmczEsICAoYTErKVxuIgorCQkiZm1vdiBmczIsICAoYTErKVxuIgorCQkiZm1vdiBmczMsICAoYTErKVxuIgorCQkiZm1vdiBmczQsICAoYTErKVxuIgorCQkiZm1vdiBmczUsICAoYTErKVxuIgorCQkiZm1vdiBmczYsICAoYTErKVxuIgorCQkiZm1vdiBmczcsICAoYTErKVxuIgorCQkiZm1vdiBmczgsICAoYTErKVxuIgorCQkiZm1vdiBmczksICAoYTErKVxuIgorCQkiZm1vdiBmczEwLCAoYTErKVxuIgorCQkiZm1vdiBmczExLCAoYTErKVxuIgorCQkiZm1vdiBmczEyLCAoYTErKVxuIgorCQkiZm1vdiBmczEzLCAoYTErKVxuIgorCQkiZm1vdiBmczE0LCAoYTErKVxuIgorCQkiZm1vdiBmczE1LCAoYTErKVxuIgorCQkiZm1vdiBmczE2LCAoYTErKVxuIgorCQkiZm1vdiBmczE3LCAoYTErKVxuIgorCQkiZm1vdiBmczE4LCAoYTErKVxuIgorCQkiZm1vdiBmczE5LCAoYTErKVxuIgorCQkiZm1vdiBmczIwLCAoYTErKVxuIgorCQkiZm1vdiBmczIxLCAoYTErKVxuIgorCQkiZm1vdiBmczIyLCAoYTErKVxuIgorCQkiZm1vdiBmczIzLCAoYTErKVxuIgorCQkiZm1vdiBmczI0LCAoYTErKVxuIgorCQkiZm1vdiBmczI1LCAoYTErKVxuIgorCQkiZm1vdiBmczI2LCAoYTErKVxuIgorCQkiZm1vdiBmczI3LCAoYTErKVxuIgorCQkiZm1vdiBmczI4LCAoYTErKVxuIgorCQkiZm1vdiBmczI5LCAoYTErKVxuIgorCQkiZm1vdiBmczMwLCAoYTErKVxuIgorCQkiZm1vdiBmczMxLCAoYTErKVxuIgorCQkiZm1vdiBmcGNyLCAlMFxuIgorCQk6ICI9ZCIoZ2Ric3R1Yl9mcGNyKQorCQk6ICJnIiAoJmdkYnN0dWJfZnB1ZnNfYXJyYXkpLCAiaSIoRVBTV19GRSkKKwkJOiAiYTEiCisJCSk7CisjZW5kaWYKK30KKworLyoKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGdkYnN0dWJfbG9hZF9mcHUodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfRlBVCisKKwlhc20gdm9sYXRpbGUoCisJCSJvciAlMSxlcHN3XG4iCisjaWZkZWYgQ09ORklHX01OMTAzMDBfUFJPQ19NTjEwM0UwMTAKKwkJIm5vcFxuIgorCQkibm9wXG4iCisjZW5kaWYKKwkJIm1vdiAlMCwgYTFcbiIKKwkJImZtb3YgKGExKyksIGZzMFxuIgorCQkiZm1vdiAoYTErKSwgZnMxXG4iCisJCSJmbW92IChhMSspLCBmczJcbiIKKwkJImZtb3YgKGExKyksIGZzM1xuIgorCQkiZm1vdiAoYTErKSwgZnM0XG4iCisJCSJmbW92IChhMSspLCBmczVcbiIKKwkJImZtb3YgKGExKyksIGZzNlxuIgorCQkiZm1vdiAoYTErKSwgZnM3XG4iCisJCSJmbW92IChhMSspLCBmczhcbiIKKwkJImZtb3YgKGExKyksIGZzOVxuIgorCQkiZm1vdiAoYTErKSwgZnMxMFxuIgorCQkiZm1vdiAoYTErKSwgZnMxMVxuIgorCQkiZm1vdiAoYTErKSwgZnMxMlxuIgorCQkiZm1vdiAoYTErKSwgZnMxM1xuIgorCQkiZm1vdiAoYTErKSwgZnMxNFxuIgorCQkiZm1vdiAoYTErKSwgZnMxNVxuIgorCQkiZm1vdiAoYTErKSwgZnMxNlxuIgorCQkiZm1vdiAoYTErKSwgZnMxN1xuIgorCQkiZm1vdiAoYTErKSwgZnMxOFxuIgorCQkiZm1vdiAoYTErKSwgZnMxOVxuIgorCQkiZm1vdiAoYTErKSwgZnMyMFxuIgorCQkiZm1vdiAoYTErKSwgZnMyMVxuIgorCQkiZm1vdiAoYTErKSwgZnMyMlxuIgorCQkiZm1vdiAoYTErKSwgZnMyM1xuIgorCQkiZm1vdiAoYTErKSwgZnMyNFxuIgorCQkiZm1vdiAoYTErKSwgZnMyNVxuIgorCQkiZm1vdiAoYTErKSwgZnMyNlxuIgorCQkiZm1vdiAoYTErKSwgZnMyN1xuIgorCQkiZm1vdiAoYTErKSwgZnMyOFxuIgorCQkiZm1vdiAoYTErKSwgZnMyOVxuIgorCQkiZm1vdiAoYTErKSwgZnMzMFxuIgorCQkiZm1vdiAoYTErKSwgZnMzMVxuIgorCQkiZm1vdiAlMiwgZnBjclxuIgorCQk6CisJCTogImciICgmZ2Ric3R1Yl9mcHVmc19hcnJheSksICJpIihFUFNXX0ZFKSwgImQiKGdkYnN0dWJfZnBjcikKKwkJOiAiYTEiCisJKTsKKyNlbmRpZgorfQorCisvKgorICogc2V0IGEgc29mdHdhcmUgYnJlYWtwb2ludAorICovCitpbnQgZ2Ric3R1Yl9zZXRfYnJlYWtwb2ludCh1OCAqYWRkciwgaW50IGxlbikKK3sKKwlpbnQgYmtwdCwgbG9vcCwgeGxvb3A7CisKKyNpZmRlZiBHREJTVFVCX1VTRV9GN0Y3X0FTX0JSRUFLUE9JTlQKKwlsZW4gPSAobGVuICsgMSkgJiB+MTsKKyNlbmRpZgorCisJZ2Ric3R1Yl9ia3B0KCJzZXRia3B0KCVwLCVkKVxuIiwgYWRkciwgbGVuKTsKKworCWZvciAoYmtwdCA9IDI1NTsgYmtwdCA+PSAwOyBia3B0LS0pCisJCWlmICghZ2Ric3R1Yl9ia3B0c1tia3B0XS5hZGRyKQorCQkJYnJlYWs7CisJaWYgKGJrcHQgPCAwKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWZvciAobG9vcCA9IDA7IGxvb3AgPCBsZW47IGxvb3ArKykKKwkJaWYgKGdkYnN0dWJfcmVhZF9ieXRlKCZhZGRyW2xvb3BdLAorCQkJCSAgICAgICZnZGJzdHViX2JrcHRzW2JrcHRdLm9yaWdieXRlc1tsb29wXQorCQkJCSAgICAgICkgPCAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwlnZGJzdHViX2ZsdXNoX2NhY2hlcyA9IDE7CisKKyNpZmRlZiBHREJTVFVCX1VTRV9GN0Y3X0FTX0JSRUFLUE9JTlQKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgbGVuOyBsb29wKyspCisJCWlmIChnZGJzdHViX3dyaXRlX2J5dGUoMHhGNywgJmFkZHJbbG9vcF0pIDwgMCkKKwkJCWdvdG8gcmVzdG9yZTsKKyNlbHNlCisJZm9yIChsb29wID0gMDsgbG9vcCA8IGxlbjsgbG9vcCsrKQorCQlpZiAoZ2Ric3R1Yl93cml0ZV9ieXRlKDB4RkYsICZhZGRyW2xvb3BdKSA8IDApCisJCQlnb3RvIHJlc3RvcmU7CisjZW5kaWYKKworCWdkYnN0dWJfYmtwdHNbYmtwdF0uYWRkciA9IGFkZHI7CisJZ2Ric3R1Yl9ia3B0c1tia3B0XS5sZW4gPSBsZW47CisKKwlnZGJzdHViX2JrcHQoIlNldCBCS1BUWyUwMnhdOiAlcC0lcCB7JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeH1cbiIsCisJCSAgICAgYmtwdCwKKwkJICAgICBnZGJzdHViX2JrcHRzW2JrcHRdLmFkZHIsCisJCSAgICAgZ2Ric3R1Yl9ia3B0c1tia3B0XS5hZGRyICsgZ2Ric3R1Yl9ia3B0c1tia3B0XS5sZW4gLSAxLAorCQkgICAgIGdkYnN0dWJfYmtwdHNbYmtwdF0ub3JpZ2J5dGVzWzBdLAorCQkgICAgIGdkYnN0dWJfYmtwdHNbYmtwdF0ub3JpZ2J5dGVzWzFdLAorCQkgICAgIGdkYnN0dWJfYmtwdHNbYmtwdF0ub3JpZ2J5dGVzWzJdLAorCQkgICAgIGdkYnN0dWJfYmtwdHNbYmtwdF0ub3JpZ2J5dGVzWzNdLAorCQkgICAgIGdkYnN0dWJfYmtwdHNbYmtwdF0ub3JpZ2J5dGVzWzRdLAorCQkgICAgIGdkYnN0dWJfYmtwdHNbYmtwdF0ub3JpZ2J5dGVzWzVdLAorCQkgICAgIGdkYnN0dWJfYmtwdHNbYmtwdF0ub3JpZ2J5dGVzWzZdCisJCSAgICAgKTsKKworCXJldHVybiAwOworCityZXN0b3JlOgorCWZvciAoeGxvb3AgPSAwOyB4bG9vcCA8IGxvb3A7IHhsb29wKyspCisJCWdkYnN0dWJfd3JpdGVfYnl0ZShnZGJzdHViX2JrcHRzW2JrcHRdLm9yaWdieXRlc1t4bG9vcF0sCisJCQkJICAgYWRkciArIHhsb29wKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworLyoKKyAqIGNsZWFyIGEgc29mdHdhcmUgYnJlYWtwb2ludAorICovCitpbnQgZ2Ric3R1Yl9jbGVhcl9icmVha3BvaW50KHU4ICphZGRyLCBpbnQgbGVuKQoreworCWludCBia3B0LCBsb29wOworCisjaWZkZWYgR0RCU1RVQl9VU0VfRjdGN19BU19CUkVBS1BPSU5UCisJbGVuID0gKGxlbiArIDEpICYgfjE7CisjZW5kaWYKKworCWdkYnN0dWJfYmtwdCgiY2xlYXJia3B0KCVwLCVkKVxuIiwgYWRkciwgbGVuKTsKKworCWZvciAoYmtwdCA9IDI1NTsgYmtwdCA+PSAwOyBia3B0LS0pCisJCWlmIChnZGJzdHViX2JrcHRzW2JrcHRdLmFkZHIgPT0gYWRkciAmJgorCQkgICAgZ2Ric3R1Yl9ia3B0c1tia3B0XS5sZW4gPT0gbGVuKQorCQkJYnJlYWs7CisJaWYgKGJrcHQgPCAwKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWdkYnN0dWJfYmtwdHNbYmtwdF0uYWRkciA9IE5VTEw7CisKKwlnZGJzdHViX2ZsdXNoX2NhY2hlcyA9IDE7CisKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgbGVuOyBsb29wKyspCisJCWlmIChnZGJzdHViX3dyaXRlX2J5dGUoZ2Ric3R1Yl9ia3B0c1tia3B0XS5vcmlnYnl0ZXNbbG9vcF0sCisJCQkJICAgICAgIGFkZHIgKyBsb29wKSA8IDApCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIGFsbCBjb21tYW5kIHByb2Nlc3NpbmcgZm9yIGludGVyZmFjaW5nIHRvIGdkYgorICogLSByZXR1cm5zIDEgaWYgdGhlIGV4Y2VwdGlvbiBzaG91bGQgYmUgc2tpcHBlZCwgMCBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgZ2Ric3R1YihzdHJ1Y3QgcHRfcmVncyAqcmVncywgZW51bSBleGNlcHRpb25fY29kZSBleGNlcCkKK3sKKwl1bnNpZ25lZCBsb25nICpzdGFjazsKKwl1bnNpZ25lZCBsb25nIGVwc3csIG1kcjsKKwl1aW50MzJfdCB6ZXJvLCBzc3A7CisJdWludDhfdCBicm9rZTsKKwljaGFyICpwdHI7CisJaW50IHNpZ3ZhbDsKKwlpbnQgYWRkcjsKKwlpbnQgbGVuZ3RoOworCWludCBsb29wOworCisJaWYgKGV4Y2VwID09IEVYQ0VQX0ZQVV9ESVNBQkxFRCkKKwkJcmV0dXJuIDA7CisKKwlnZGJzdHViX2ZsdXNoX2NhY2hlcyA9IDA7CisKKwltbjEwMzAwX3NldF9nZGJsZWRzKDEpOworCisJYXNtIHZvbGF0aWxlKCJtb3YgbWRyLCUwIiA6ICI9ZCIobWRyKSk7CisJYXNtIHZvbGF0aWxlKCJtb3YgZXBzdywlMCIgOiAiPWQiKGVwc3cpKTsKKwlhc20gdm9sYXRpbGUoIm1vdiAlMCxlcHN3IgorCQkgICAgIDo6ICJkIigoZXBzdyAmIH5FUFNXX0lNKSB8IEVQU1dfSUUgfCBFUFNXX0lNXzEpKTsKKworCWdkYnN0dWJfc3RvcmVfZnB1KCk7CisKKyNpZmRlZiBDT05GSUdfR0RCU1RVQl9JTU1FRElBVEUKKwkvKiBza2lwIHRoZSBpbml0aWFsIHBhdXNlIGxvb3AgKi8KKwlpZiAocmVncy0+cGMgPT0gKHVuc2lnbmVkIGxvbmcpIF9fZ2Ric3R1Yl9wYXVzZSkKKwkJcmVncy0+cGMgPSAodW5zaWduZWQgbG9uZykgc3RhcnRfa2VybmVsOworI2VuZGlmCisKKwkvKiBpZiB3ZSB3ZXJlIHNpbmdsZSBzdGVwcGluZywgcmVzdG9yZSB0aGUgb3Bjb2RlcyBob2lzdGVkIGZvciB0aGUKKwkgKiBicmVha3BvaW50W3NdICovCisJYnJva2UgPSAwOworCWlmICgoc3RlcF9icFswXS5hZGRyICYmIHN0ZXBfYnBbMF0uYWRkciA9PSAodTggKikgcmVncy0+cGMpIHx8CisJICAgIChzdGVwX2JwWzFdLmFkZHIgJiYgc3RlcF9icFsxXS5hZGRyID09ICh1OCAqKSByZWdzLT5wYykpCisJCWJyb2tlID0gMTsKKworCV9fZ2Ric3R1Yl9yZXN0b3JlX2JwKCk7CisKKwlpZiAoZ2Ric3R1Yl9yeF91bmdldCkgeworCQlzaWd2YWwgPSBTSUdJTlQ7CisJCWlmIChnZGJzdHViX3J4X3VuZ2V0ICE9IDMpCisJCQlnb3RvIHBhY2tldF93YWl0aW5nOworCQlnZGJzdHViX3J4X3VuZ2V0ID0gMDsKKwl9CisKKwlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopIHJlZ3MtPnNwOworCXNpZ3ZhbCA9IGJyb2tlID8gU0lHVFJBUCA6IGNvbXB1dGVTaWduYWwoZXhjZXApOworCisJLyogc2VuZCBpbmZvcm1hdGlvbiBhYm91dCBhIEJVRygpICovCisJaWYgKCF1c2VyX21vZGUocmVncykgJiYgZXhjZXAgPT0gRVhDRVBfU1lTQ0FMTDE1KSB7CisJCWNvbnN0IHN0cnVjdCBidWdfZW50cnkgKmJ1ZzsKKworCQlidWcgPSBmaW5kX2J1ZyhyZWdzLT5wYyk7CisJCWlmIChidWcpCisJCQlnb3RvIGZvdW5kX2J1ZzsKKwkJbGVuZ3RoID0gc25wcmludGYodHJhbnNfYnVmZmVyLCBzaXplb2YodHJhbnNfYnVmZmVyKSwKKwkJCQkgICJCVUcoKSBhdCBhZGRyZXNzICVseFxuIiwgcmVncy0+cGMpOworCQlnb3RvIHNlbmRfYnVnX3BrdDsKKworCWZvdW5kX2J1ZzoKKwkJbGVuZ3RoID0gc25wcmludGYodHJhbnNfYnVmZmVyLCBzaXplb2YodHJhbnNfYnVmZmVyKSwKKwkJCQkgICJCVUcoKSBhdCBhZGRyZXNzICVseCAoJXM6JWQpXG4iLAorCQkJCSAgcmVncy0+cGMsIGJ1Zy0+ZmlsZSwgYnVnLT5saW5lKTsKKworCXNlbmRfYnVnX3BrdDoKKwkJcHRyID0gb3V0cHV0X2J1ZmZlcjsKKwkJKnB0cisrID0gJ08nOworCQlwdHIgPSBtZW0yaGV4KHRyYW5zX2J1ZmZlciwgcHRyLCBsZW5ndGgsIDApOworCQkqcHRyID0gMDsKKwkJcHV0cGFja2V0KG91dHB1dF9idWZmZXIpOworCisJCXJlZ3MtPnBjIC09IDI7CisJCXNpZ3ZhbCA9IFNJR0FCUlQ7CisJfSBlbHNlIGlmIChyZWdzLT5wYyA9PSAodW5zaWduZWQgbG9uZykgX19nZGJzdHViX2J1Z190cmFwKSB7CisJCXJlZ3MtPnBjID0gcmVncy0+bWRyOworCQlzaWd2YWwgPSBTSUdBQlJUOworCX0KKworCS8qCisJICogc2VuZCBhIG1lc3NhZ2UgdG8gdGhlIGRlYnVnZ2VyJ3MgdXNlciBzYXlpbmcgd2hhdCBoYXBwZW5lZCBpZiBpdCBtYXkKKwkgKiBub3QgYmUgY2xlYXIgY3V0ICh3ZSBjYW4ndCBtYXAgZXhjZXB0aW9ucyBvbnRvIHNpZ25hbHMgcHJvcGVybHkpCisJICovCisJaWYgKHNpZ3ZhbCAhPSBTSUdJTlQgJiYgc2lndmFsICE9IFNJR1RSQVAgJiYgc2lndmFsICE9IFNJR0lMTCkgeworCQlzdGF0aWMgY29uc3QgY2hhciB0aXRsZVtdID0gIkV4Y2VwICIsIHRiY2JlcnJbXSA9ICJCQ0JFUlIgIjsKKwkJc3RhdGljIGNvbnN0IGNoYXIgY3JsZltdID0gIlxyXG4iOworCQljaGFyIGh4OworCQl1MzIgYmNiZXJyID0gQkNCRVJSOworCisJCXB0ciA9IG91dHB1dF9idWZmZXI7CisJCSpwdHIrKyA9ICdPJzsKKwkJcHRyID0gbWVtMmhleCh0aXRsZSwgcHRyLCBzaXplb2YodGl0bGUpIC0gMSwgMCk7CisKKwkJaHggPSBoZXhjaGFyc1soZXhjZXAgJiAweGYwMDApID4+IDEyXTsKKwkJKnB0cisrID0gaGV4Y2hhcnNbaHggPj4gNF07CSpwdHIrKyA9IGhleGNoYXJzW2h4ICYgMHhmXTsKKwkJaHggPSBoZXhjaGFyc1soZXhjZXAgJiAweDBmMDApID4+IDhdOworCQkqcHRyKysgPSBoZXhjaGFyc1toeCA+PiA0XTsJKnB0cisrID0gaGV4Y2hhcnNbaHggJiAweGZdOworCQloeCA9IGhleGNoYXJzWyhleGNlcCAmIDB4MDBmMCkgPj4gNF07CisJCSpwdHIrKyA9IGhleGNoYXJzW2h4ID4+IDRdOwkqcHRyKysgPSBoZXhjaGFyc1toeCAmIDB4Zl07CisJCWh4ID0gaGV4Y2hhcnNbKGV4Y2VwICYgMHgwMDBmKV07CisJCSpwdHIrKyA9IGhleGNoYXJzW2h4ID4+IDRdOwkqcHRyKysgPSBoZXhjaGFyc1toeCAmIDB4Zl07CisKKwkJcHRyID0gbWVtMmhleChjcmxmLCBwdHIsIHNpemVvZihjcmxmKSAtIDEsIDApOworCQkqcHRyID0gMDsKKwkJcHV0cGFja2V0KG91dHB1dF9idWZmZXIpOwkvKiBzZW5kIGl0IG9mZi4uLiAqLworCisJCS8qIEJDQkVSUiAqLworCQlwdHIgPSBvdXRwdXRfYnVmZmVyOworCQkqcHRyKysgPSAnTyc7CisJCXB0ciA9IG1lbTJoZXgodGJjYmVyciwgcHRyLCBzaXplb2YodGJjYmVycikgLSAxLCAwKTsKKworCQloeCA9IGhleGNoYXJzWyhiY2JlcnIgJiAweGYwMDAwMDAwKSA+PiAyOF07CisJCSpwdHIrKyA9IGhleGNoYXJzW2h4ID4+IDRdOwkqcHRyKysgPSBoZXhjaGFyc1toeCAmIDB4Zl07CisJCWh4ID0gaGV4Y2hhcnNbKGJjYmVyciAmIDB4MGYwMDAwMDApID4+IDI0XTsKKwkJKnB0cisrID0gaGV4Y2hhcnNbaHggPj4gNF07CSpwdHIrKyA9IGhleGNoYXJzW2h4ICYgMHhmXTsKKwkJaHggPSBoZXhjaGFyc1soYmNiZXJyICYgMHgwMGYwMDAwMCkgPj4gMjBdOworCQkqcHRyKysgPSBoZXhjaGFyc1toeCA+PiA0XTsJKnB0cisrID0gaGV4Y2hhcnNbaHggJiAweGZdOworCQloeCA9IGhleGNoYXJzWyhiY2JlcnIgJiAweDAwMGYwMDAwKSA+PiAxNl07CisJCSpwdHIrKyA9IGhleGNoYXJzW2h4ID4+IDRdOwkqcHRyKysgPSBoZXhjaGFyc1toeCAmIDB4Zl07CisJCWh4ID0gaGV4Y2hhcnNbKGJjYmVyciAmIDB4MDAwMGYwMDApID4+IDEyXTsKKwkJKnB0cisrID0gaGV4Y2hhcnNbaHggPj4gNF07CSpwdHIrKyA9IGhleGNoYXJzW2h4ICYgMHhmXTsKKwkJaHggPSBoZXhjaGFyc1soYmNiZXJyICYgMHgwMDAwMGYwMCkgPj4gOF07CisJCSpwdHIrKyA9IGhleGNoYXJzW2h4ID4+IDRdOwkqcHRyKysgPSBoZXhjaGFyc1toeCAmIDB4Zl07CisJCWh4ID0gaGV4Y2hhcnNbKGJjYmVyciAmIDB4MDAwMDAwZjApID4+IDRdOworCQkqcHRyKysgPSBoZXhjaGFyc1toeCA+PiA0XTsJKnB0cisrID0gaGV4Y2hhcnNbaHggJiAweGZdOworCQloeCA9IGhleGNoYXJzWyhiY2JlcnIgJiAweDAwMDAwMDBmKV07CisJCSpwdHIrKyA9IGhleGNoYXJzW2h4ID4+IDRdOwkqcHRyKysgPSBoZXhjaGFyc1toeCAmIDB4Zl07CisKKwkJcHRyID0gbWVtMmhleChjcmxmLCBwdHIsIHNpemVvZihjcmxmKSAtIDEsIDApOworCQkqcHRyID0gMDsKKwkJcHV0cGFja2V0KG91dHB1dF9idWZmZXIpOwkvKiBzZW5kIGl0IG9mZi4uLiAqLworCX0KKworCS8qCisJICogdGVsbCB0aGUgZGVidWdnZXIgdGhhdCBhbiBleGNlcHRpb24gaGFzIG9jY3VycmVkCisJICovCisJcHRyID0gb3V0cHV0X2J1ZmZlcjsKKworCS8qCisJICogU2VuZCB0cmFwIHR5cGUgKGNvbnZlcnRlZCB0byBzaWduYWwpCisJICovCisJKnB0cisrID0gJ1QnOworCSpwdHIrKyA9IGhleGNoYXJzW3NpZ3ZhbCA+PiA0XTsKKwkqcHRyKysgPSBoZXhjaGFyc1tzaWd2YWwgJiAweGZdOworCisJLyoKKwkgKiBTZW5kIEVycm9yIFBDCisJICovCisJKnB0cisrID0gaGV4Y2hhcnNbR0RCX1JFR0lEX1BDID4+IDRdOworCSpwdHIrKyA9IGhleGNoYXJzW0dEQl9SRUdJRF9QQyAmIDB4Zl07CisJKnB0cisrID0gJzonOworCXB0ciA9IG1lbTJoZXgoJnJlZ3MtPnBjLCBwdHIsIDQsIDApOworCSpwdHIrKyA9ICc7JzsKKworCS8qCisJICogU2VuZCBmcmFtZSBwb2ludGVyCisJICovCisJKnB0cisrID0gaGV4Y2hhcnNbR0RCX1JFR0lEX0ZQID4+IDRdOworCSpwdHIrKyA9IGhleGNoYXJzW0dEQl9SRUdJRF9GUCAmIDB4Zl07CisJKnB0cisrID0gJzonOworCXB0ciA9IG1lbTJoZXgoJnJlZ3MtPmEzLCBwdHIsIDQsIDApOworCSpwdHIrKyA9ICc7JzsKKworCS8qCisJICogU2VuZCBzdGFjayBwb2ludGVyCisJICovCisJc3NwID0gKHVuc2lnbmVkIGxvbmcpIChyZWdzICsgMSk7CisJKnB0cisrID0gaGV4Y2hhcnNbR0RCX1JFR0lEX1NQID4+IDRdOworCSpwdHIrKyA9IGhleGNoYXJzW0dEQl9SRUdJRF9TUCAmIDB4Zl07CisJKnB0cisrID0gJzonOworCXB0ciA9IG1lbTJoZXgoJnNzcCwgcHRyLCA0LCAwKTsKKwkqcHRyKysgPSAnOyc7CisKKwkqcHRyKysgPSAwOworCXB1dHBhY2tldChvdXRwdXRfYnVmZmVyKTsJLyogc2VuZCBpdCBvZmYuLi4gKi8KKworcGFja2V0X3dhaXRpbmc6CisJLyoKKwkgKiBXYWl0IGZvciBpbnB1dCBmcm9tIHJlbW90ZSBHREIKKwkgKi8KKwl3aGlsZSAoMSkgeworCQlvdXRwdXRfYnVmZmVyWzBdID0gMDsKKwkJZ2V0cGFja2V0KGlucHV0X2J1ZmZlcik7CisKKwkJc3dpdGNoIChpbnB1dF9idWZmZXJbMF0pIHsKKwkJCS8qIHJlcXVlc3QgcmVwZWF0IG9mIGxhc3Qgc2lnbmFsIG51bWJlciAqLworCQljYXNlICc/JzoKKwkJCW91dHB1dF9idWZmZXJbMF0gPSAnUyc7CisJCQlvdXRwdXRfYnVmZmVyWzFdID0gaGV4Y2hhcnNbc2lndmFsID4+IDRdOworCQkJb3V0cHV0X2J1ZmZlclsyXSA9IGhleGNoYXJzW3NpZ3ZhbCAmIDB4Zl07CisJCQlvdXRwdXRfYnVmZmVyWzNdID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgJ2QnOgorCQkJLyogdG9nZ2xlIGRlYnVnIGZsYWcgKi8KKwkJCWJyZWFrOworCisJCQkvKgorCQkJICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgQ1BVIHJlZ2lzdGVycworCQkJICovCisJCWNhc2UgJ2cnOgorCQkJemVybyA9IDA7CisJCQlzc3AgPSAodTMyKSAocmVncyArIDEpOworCQkJcHRyID0gb3V0cHV0X2J1ZmZlcjsKKwkJCXB0ciA9IG1lbTJoZXgoJnJlZ3MtPmQwLCBwdHIsIDQsIDApOworCQkJcHRyID0gbWVtMmhleCgmcmVncy0+ZDEsIHB0ciwgNCwgMCk7CisJCQlwdHIgPSBtZW0yaGV4KCZyZWdzLT5kMiwgcHRyLCA0LCAwKTsKKwkJCXB0ciA9IG1lbTJoZXgoJnJlZ3MtPmQzLCBwdHIsIDQsIDApOworCQkJcHRyID0gbWVtMmhleCgmcmVncy0+YTAsIHB0ciwgNCwgMCk7CisJCQlwdHIgPSBtZW0yaGV4KCZyZWdzLT5hMSwgcHRyLCA0LCAwKTsKKwkJCXB0ciA9IG1lbTJoZXgoJnJlZ3MtPmEyLCBwdHIsIDQsIDApOworCQkJcHRyID0gbWVtMmhleCgmcmVncy0+YTMsIHB0ciwgNCwgMCk7CisKKwkJCXB0ciA9IG1lbTJoZXgoJnNzcCwgcHRyLCA0LCAwKTsJCS8qIDggKi8KKwkJCXB0ciA9IG1lbTJoZXgoJnJlZ3MtPnBjLCBwdHIsIDQsIDApOworCQkJcHRyID0gbWVtMmhleCgmcmVncy0+bWRyLCBwdHIsIDQsIDApOworCQkJcHRyID0gbWVtMmhleCgmcmVncy0+ZXBzdywgcHRyLCA0LCAwKTsKKwkJCXB0ciA9IG1lbTJoZXgoJnJlZ3MtPmxpciwgcHRyLCA0LCAwKTsKKwkJCXB0ciA9IG1lbTJoZXgoJnJlZ3MtPmxhciwgcHRyLCA0LCAwKTsKKwkJCXB0ciA9IG1lbTJoZXgoJnJlZ3MtPm1kcnEsIHB0ciwgNCwgMCk7CisKKwkJCXB0ciA9IG1lbTJoZXgoJnJlZ3MtPmUwLCBwdHIsIDQsIDApOwkvKiAxNSAqLworCQkJcHRyID0gbWVtMmhleCgmcmVncy0+ZTEsIHB0ciwgNCwgMCk7CisJCQlwdHIgPSBtZW0yaGV4KCZyZWdzLT5lMiwgcHRyLCA0LCAwKTsKKwkJCXB0ciA9IG1lbTJoZXgoJnJlZ3MtPmUzLCBwdHIsIDQsIDApOworCQkJcHRyID0gbWVtMmhleCgmcmVncy0+ZTQsIHB0ciwgNCwgMCk7CisJCQlwdHIgPSBtZW0yaGV4KCZyZWdzLT5lNSwgcHRyLCA0LCAwKTsKKwkJCXB0ciA9IG1lbTJoZXgoJnJlZ3MtPmU2LCBwdHIsIDQsIDApOworCQkJcHRyID0gbWVtMmhleCgmcmVncy0+ZTcsIHB0ciwgNCwgMCk7CisKKwkJCXB0ciA9IG1lbTJoZXgoJnNzcCwgcHRyLCA0LCAwKTsKKwkJCXB0ciA9IG1lbTJoZXgoJnJlZ3MsIHB0ciwgNCwgMCk7CisJCQlwdHIgPSBtZW0yaGV4KCZyZWdzLT5zcCwgcHRyLCA0LCAwKTsKKwkJCXB0ciA9IG1lbTJoZXgoJnJlZ3MtPm1jcmgsIHB0ciwgNCwgMCk7CS8qIDI2ICovCisJCQlwdHIgPSBtZW0yaGV4KCZyZWdzLT5tY3JsLCBwdHIsIDQsIDApOworCQkJcHRyID0gbWVtMmhleCgmcmVncy0+bWN2ZiwgcHRyLCA0LCAwKTsKKworCQkJcHRyID0gbWVtMmhleCgmZ2Ric3R1Yl9mcGNyLCBwdHIsIDQsIDApOyAvKiAyOSAtIEZQQ1IgKi8KKwkJCXB0ciA9IG1lbTJoZXgoJnplcm8sIHB0ciwgNCwgMCk7CisJCQlwdHIgPSBtZW0yaGV4KCZ6ZXJvLCBwdHIsIDQsIDApOworCQkJZm9yIChsb29wID0gMDsgbG9vcCA8IDMyOyBsb29wKyspCisJCQkJcHRyID0gbWVtMmhleCgmZ2Ric3R1Yl9mcHVmc19hcnJheVtsb29wXSwKKwkJCQkJICAgICAgcHRyLCA0LCAwKTsgLyogMzIgLSBGUzAtMzEgKi8KKworCQkJYnJlYWs7CisKKwkJCS8qCisJCQkgKiBzZXQgdGhlIHZhbHVlIG9mIHRoZSBDUFUgcmVnaXN0ZXJzIC0gcmV0dXJuIE9LCisJCQkgKi8KKwkJY2FzZSAnRyc6CisJCXsKKwkJCWNvbnN0IGNoYXIgKnB0cjsKKworCQkJcHRyID0gJmlucHV0X2J1ZmZlclsxXTsKKwkJCXB0ciA9IGhleDJtZW0ocHRyLCAmcmVncy0+ZDAsIDQsIDApOworCQkJcHRyID0gaGV4Mm1lbShwdHIsICZyZWdzLT5kMSwgNCwgMCk7CisJCQlwdHIgPSBoZXgybWVtKHB0ciwgJnJlZ3MtPmQyLCA0LCAwKTsKKwkJCXB0ciA9IGhleDJtZW0ocHRyLCAmcmVncy0+ZDMsIDQsIDApOworCQkJcHRyID0gaGV4Mm1lbShwdHIsICZyZWdzLT5hMCwgNCwgMCk7CisJCQlwdHIgPSBoZXgybWVtKHB0ciwgJnJlZ3MtPmExLCA0LCAwKTsKKwkJCXB0ciA9IGhleDJtZW0ocHRyLCAmcmVncy0+YTIsIDQsIDApOworCQkJcHRyID0gaGV4Mm1lbShwdHIsICZyZWdzLT5hMywgNCwgMCk7CisKKwkJCXB0ciA9IGhleDJtZW0ocHRyLCAmc3NwLCA0LCAwKTsJCS8qIDggKi8KKwkJCXB0ciA9IGhleDJtZW0ocHRyLCAmcmVncy0+cGMsIDQsIDApOworCQkJcHRyID0gaGV4Mm1lbShwdHIsICZyZWdzLT5tZHIsIDQsIDApOworCQkJcHRyID0gaGV4Mm1lbShwdHIsICZyZWdzLT5lcHN3LCA0LCAwKTsKKwkJCXB0ciA9IGhleDJtZW0ocHRyLCAmcmVncy0+bGlyLCA0LCAwKTsKKwkJCXB0ciA9IGhleDJtZW0ocHRyLCAmcmVncy0+bGFyLCA0LCAwKTsKKwkJCXB0ciA9IGhleDJtZW0ocHRyLCAmcmVncy0+bWRycSwgNCwgMCk7CisKKwkJCXB0ciA9IGhleDJtZW0ocHRyLCAmcmVncy0+ZTAsIDQsIDApOwkvKiAxNSAqLworCQkJcHRyID0gaGV4Mm1lbShwdHIsICZyZWdzLT5lMSwgNCwgMCk7CisJCQlwdHIgPSBoZXgybWVtKHB0ciwgJnJlZ3MtPmUyLCA0LCAwKTsKKwkJCXB0ciA9IGhleDJtZW0ocHRyLCAmcmVncy0+ZTMsIDQsIDApOworCQkJcHRyID0gaGV4Mm1lbShwdHIsICZyZWdzLT5lNCwgNCwgMCk7CisJCQlwdHIgPSBoZXgybWVtKHB0ciwgJnJlZ3MtPmU1LCA0LCAwKTsKKwkJCXB0ciA9IGhleDJtZW0ocHRyLCAmcmVncy0+ZTYsIDQsIDApOworCQkJcHRyID0gaGV4Mm1lbShwdHIsICZyZWdzLT5lNywgNCwgMCk7CisKKwkJCXB0ciA9IGhleDJtZW0ocHRyLCAmc3NwLCA0LCAwKTsKKwkJCXB0ciA9IGhleDJtZW0ocHRyLCAmemVybywgNCwgMCk7CisJCQlwdHIgPSBoZXgybWVtKHB0ciwgJnJlZ3MtPnNwLCA0LCAwKTsKKwkJCXB0ciA9IGhleDJtZW0ocHRyLCAmcmVncy0+bWNyaCwgNCwgMCk7CS8qIDI2ICovCisJCQlwdHIgPSBoZXgybWVtKHB0ciwgJnJlZ3MtPm1jcmwsIDQsIDApOworCQkJcHRyID0gaGV4Mm1lbShwdHIsICZyZWdzLT5tY3ZmLCA0LCAwKTsKKworCQkJcHRyID0gaGV4Mm1lbShwdHIsICZ6ZXJvLCA0LCAwKTsJLyogMjkgLSBGUENSICovCisJCQlwdHIgPSBoZXgybWVtKHB0ciwgJnplcm8sIDQsIDApOworCQkJcHRyID0gaGV4Mm1lbShwdHIsICZ6ZXJvLCA0LCAwKTsKKwkJCWZvciAobG9vcCA9IDA7IGxvb3AgPCAzMjsgbG9vcCsrKSAgICAgLyogMzIgLSBGUzAtMzEgKi8KKwkJCQlwdHIgPSBoZXgybWVtKHB0ciwgJnplcm8sIDQsIDApOworCisjaWYgMAorCQkJLyoKKwkJCSAqIFNlZSBpZiB0aGUgc3RhY2sgcG9pbnRlciBoYXMgbW92ZWQuIElmIHNvLCB0aGVuIGNvcHkKKwkJCSAqIHRoZSBzYXZlZCBsb2NhbHMgYW5kIGlucyB0byB0aGUgbmV3IGxvY2F0aW9uLgorCQkJICovCisJCQl1bnNpZ25lZCBsb25nICpuZXdzcCA9ICh1bnNpZ25lZCBsb25nICopIHJlZ2lzdGVyc1tTUF07CisJCQlpZiAoc3AgIT0gbmV3c3ApCisJCQkJc3AgPSBtZW1jcHkobmV3c3AsIHNwLCAxNiAqIDQpOworI2VuZGlmCisKKwkJCWdkYnN0dWJfc3RyY3B5KG91dHB1dF9idWZmZXIsICJPSyIpOworCQl9CisJCWJyZWFrOworCisJCS8qCisJCSAqIG1BQS4uQUEsTExMTCAgUmVhZCBMTExMIGJ5dGVzIGF0IGFkZHJlc3MgQUEuLkFBCisJCSAqLworCQljYXNlICdtJzoKKwkJCXB0ciA9ICZpbnB1dF9idWZmZXJbMV07CisKKwkJCWlmIChoZXhUb0ludCgmcHRyLCAmYWRkcikgJiYKKwkJCSAgICAqcHRyKysgPT0gJywnICYmCisJCQkgICAgaGV4VG9JbnQoJnB0ciwgJmxlbmd0aCkKKwkJCSAgICApIHsKKwkJCQlpZiAobWVtMmhleCgoY2hhciAqKSBhZGRyLCBvdXRwdXRfYnVmZmVyLAorCQkJCQkgICAgbGVuZ3RoLCAxKSkKKwkJCQkJYnJlYWs7CisJCQkJZ2Ric3R1Yl9zdHJjcHkob3V0cHV0X2J1ZmZlciwgIkUwMyIpOworCQkJfSBlbHNlIHsKKwkJCQlnZGJzdHViX3N0cmNweShvdXRwdXRfYnVmZmVyLCAiRTAxIik7CisJCQl9CisJCQlicmVhazsKKworCQkJLyoKKwkJCSAqIE1BQS4uQUEsTExMTDogV3JpdGUgTExMTCBieXRlcyBhdCBhZGRyZXNzIEFBLkFBCisJCQkgKiByZXR1cm4gT0sKKwkJCSAqLworCQljYXNlICdNJzoKKwkJCXB0ciA9ICZpbnB1dF9idWZmZXJbMV07CisKKwkJCWlmIChoZXhUb0ludCgmcHRyLCAmYWRkcikgJiYKKwkJCSAgICAqcHRyKysgPT0gJywnICYmCisJCQkgICAgaGV4VG9JbnQoJnB0ciwgJmxlbmd0aCkgJiYKKwkJCSAgICAqcHRyKysgPT0gJzonCisJCQkgICAgKSB7CisJCQkJaWYgKGhleDJtZW0ocHRyLCAoY2hhciAqKSBhZGRyLCBsZW5ndGgsIDEpKQorCQkJCQlnZGJzdHViX3N0cmNweShvdXRwdXRfYnVmZmVyLCAiT0siKTsKKwkJCQllbHNlCisJCQkJCWdkYnN0dWJfc3RyY3B5KG91dHB1dF9idWZmZXIsICJFMDMiKTsKKworCQkJCWdkYnN0dWJfZmx1c2hfY2FjaGVzID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJZ2Ric3R1Yl9zdHJjcHkob3V0cHV0X2J1ZmZlciwgIkUwMiIpOworCQkJfQorCQkJYnJlYWs7CisKKwkJCS8qCisJCQkgKiBjQUEuLkFBICAgIENvbnRpbnVlIGF0IGFkZHJlc3MgQUEuLkFBKG9wdGlvbmFsKQorCQkJICovCisJCWNhc2UgJ2MnOgorCQkJLyogdHJ5IHRvIHJlYWQgb3B0aW9uYWwgcGFyYW1ldGVyLCBwYyB1bmNoYW5nZWQgaWYgbm8KKwkJCSAqIHBhcm0gKi8KKworCQkJcHRyID0gJmlucHV0X2J1ZmZlclsxXTsKKwkJCWlmIChoZXhUb0ludCgmcHRyLCAmYWRkcikpCisJCQkJcmVncy0+cGMgPSBhZGRyOworCQkJZ290byBkb25lOworCisJCQkvKgorCQkJICoga2lsbCB0aGUgcHJvZ3JhbQorCQkJICovCisJCWNhc2UgJ2snIDoKKwkJCWdvdG8gZG9uZTsJLyoganVzdCBjb250aW51ZSAqLworCisJCQkvKgorCQkJICogUmVzZXQgdGhlIHdob2xlIG1hY2hpbmUgKEZJWE1FOiBzeXN0ZW0gZGVwZW5kZW50KQorCQkJICovCisJCWNhc2UgJ3InOgorCQkJYnJlYWs7CisKKwkJCS8qCisJCQkgKiBTdGVwIHRvIG5leHQgaW5zdHJ1Y3Rpb24KKwkJCSAqLworCQljYXNlICdzJzoKKwkJCS8qCisJCQkgKiB1c2luZyB0aGUgVCBmbGFnIGRvZXNuJ3Qgc2VlbSB0byBwZXJmb3JtIHNpbmdsZQorCQkJICogc3RlcHBpbmcgKGl0IHNlZW1zIHRvIHdpbmQgdXAgYmVpbmcgY2F1Z2h0IGJ5IHRoZQorCQkJICogSlRBRyB1bml0KSwgc28gd2UgaGF2ZSB0byB1c2UgYnJlYWtwb2ludHMgYW5kCisJCQkgKiBjb250aW51ZSBpbnN0ZWFkLgorCQkJICovCisJCQlpZiAoZ2Ric3R1Yl9zaW5nbGVfc3RlcChyZWdzKSA8IDApCisJCQkJLyogaWdub3JlIGFueSBmYXVsdCBlcnJvciBmb3Igbm93ICovCisJCQkJZ2Ric3R1Yl9wcmludGsoInVuYWJsZSB0byBzZXQgc2luZ2xlLXN0ZXAiCisJCQkJCSAgICAgICAiIGJwXG4iKTsKKwkJCWdvdG8gZG9uZTsKKworCQkJLyoKKwkJCSAqIFNldCBiYXVkIHJhdGUgKGJCQikKKwkJCSAqLworCQljYXNlICdiJzoKKwkJCWRvIHsKKwkJCQlpbnQgYmF1ZHJhdGU7CisKKwkJCQlwdHIgPSAmaW5wdXRfYnVmZmVyWzFdOworCQkJCWlmICghaGV4VG9JbnQoJnB0ciwgJmJhdWRyYXRlKSkgeworCQkJCQlnZGJzdHViX3N0cmNweShvdXRwdXRfYnVmZmVyLCAiQjAxIik7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmIChiYXVkcmF0ZSkgeworCQkJCQkvKiBBQ0sgYmVmb3JlIGNoYW5naW5nIHNwZWVkICovCisJCQkJCXB1dHBhY2tldCgiT0siKTsKKwkJCQkJZ2Ric3R1Yl9pb19zZXRfYmF1ZChiYXVkcmF0ZSk7CisJCQkJfQorCQkJfSB3aGlsZSAoMCk7CisJCQlicmVhazsKKworCQkJLyoKKwkJCSAqIFNldCBicmVha3BvaW50CisJCQkgKi8KKwkJY2FzZSAnWic6CisJCQlwdHIgPSAmaW5wdXRfYnVmZmVyWzFdOworCisJCQlpZiAoIWhleFRvSW50KCZwdHIsICZsb29wKSB8fCAqcHRyKysgIT0gJywnIHx8CisJCQkgICAgIWhleFRvSW50KCZwdHIsICZhZGRyKSB8fCAqcHRyKysgIT0gJywnIHx8CisJCQkgICAgIWhleFRvSW50KCZwdHIsICZsZW5ndGgpCisJCQkgICAgKSB7CisJCQkJZ2Ric3R1Yl9zdHJjcHkob3V0cHV0X2J1ZmZlciwgIkUwMSIpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBvbmx5IHN1cHBvcnQgc29mdHdhcmUgYnJlYWtwb2ludHMgKi8KKwkJCWdkYnN0dWJfc3RyY3B5KG91dHB1dF9idWZmZXIsICJFMDMiKTsKKwkJCWlmIChsb29wICE9IDAgfHwKKwkJCSAgICBsZW5ndGggPCAxIHx8CisJCQkgICAgbGVuZ3RoID4gNyB8fAorCQkJICAgICh1bnNpZ25lZCBsb25nKSBhZGRyIDwgNDA5NikKKwkJCQlicmVhazsKKworCQkJaWYgKGdkYnN0dWJfc2V0X2JyZWFrcG9pbnQoKHU4ICopIGFkZHIsIGxlbmd0aCkgPCAwKQorCQkJCWJyZWFrOworCisJCQlnZGJzdHViX3N0cmNweShvdXRwdXRfYnVmZmVyLCAiT0siKTsKKwkJCWJyZWFrOworCisJCQkvKgorCQkJICogQ2xlYXIgYnJlYWtwb2ludAorCQkJICovCisJCWNhc2UgJ3onOgorCQkJcHRyID0gJmlucHV0X2J1ZmZlclsxXTsKKworCQkJaWYgKCFoZXhUb0ludCgmcHRyLCAmbG9vcCkgfHwgKnB0cisrICE9ICcsJyB8fAorCQkJICAgICFoZXhUb0ludCgmcHRyLCAmYWRkcikgfHwgKnB0cisrICE9ICcsJyB8fAorCQkJICAgICFoZXhUb0ludCgmcHRyLCAmbGVuZ3RoKQorCQkJICAgICkgeworCQkJCWdkYnN0dWJfc3RyY3B5KG91dHB1dF9idWZmZXIsICJFMDEiKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogb25seSBzdXBwb3J0IHNvZnR3YXJlIGJyZWFrcG9pbnRzICovCisJCQlnZGJzdHViX3N0cmNweShvdXRwdXRfYnVmZmVyLCAiRTAzIik7CisJCQlpZiAobG9vcCAhPSAwIHx8CisJCQkgICAgbGVuZ3RoIDwgMSB8fAorCQkJICAgIGxlbmd0aCA+IDcgfHwKKwkJCSAgICAodW5zaWduZWQgbG9uZykgYWRkciA8IDQwOTYpCisJCQkJYnJlYWs7CisKKwkJCWlmIChnZGJzdHViX2NsZWFyX2JyZWFrcG9pbnQoKHU4ICopIGFkZHIsIGxlbmd0aCkgPCAwKQorCQkJCWJyZWFrOworCisJCQlnZGJzdHViX3N0cmNweShvdXRwdXRfYnVmZmVyLCAiT0siKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlnZGJzdHViX3Byb3RvKCIjIyMgR0RCIFVuc3VwcG9ydGVkIENtZCAnJXMnXG4iLAorCQkJCSAgICAgIGlucHV0X2J1ZmZlcik7CisJCQlicmVhazsKKwkJfQorCisJCS8qIHJlcGx5IHRvIHRoZSByZXF1ZXN0ICovCisJCXB1dHBhY2tldChvdXRwdXRfYnVmZmVyKTsKKwl9CisKK2RvbmU6CisJLyoKKwkgKiBOZWVkIHRvIGZsdXNoIHRoZSBpbnN0cnVjdGlvbiBjYWNoZSBoZXJlLCBhcyB3ZSBtYXkKKwkgKiBoYXZlIGRlcG9zaXRlZCBhIGJyZWFrcG9pbnQsIGFuZCB0aGUgaWNhY2hlIHByb2JhYmx5CisJICogaGFzIG5vIHdheSBvZiBrbm93aW5nIHRoYXQgYSBkYXRhIHJlZiB0byBzb21lIGxvY2F0aW9uCisJICogbWF5IGhhdmUgY2hhbmdlZCBzb21ldGhpbmcgdGhhdCBpcyBpbiB0aGUgaW5zdHJ1Y3Rpb24KKwkgKiBjYWNoZS4KKwkgKiBOQjogV2UgZmx1c2ggYm90aCBjYWNoZXMsIGp1c3QgdG8gYmUgc3VyZS4uLgorCSAqLworCWlmIChnZGJzdHViX2ZsdXNoX2NhY2hlcykKKwkJZ2Ric3R1Yl9wdXJnZV9jYWNoZSgpOworCisJZ2Ric3R1Yl9sb2FkX2ZwdSgpOworCW1uMTAzMDBfc2V0X2dkYmxlZHMoMCk7CisJaWYgKGV4Y2VwID09IEVYQ0VQX05NSSkKKwkJTk1JQ1IgPSBOTUlDUl9OTUlGOworCisJdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZygpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZXBzdyk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBoYW5kbGUgZXZlbnQgaW50ZXJjZXB0aW9uCisgKi8KK2FzbWxpbmthZ2UgaW50IGdkYnN0dWJfaW50ZXJjZXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCSBlbnVtIGV4Y2VwdGlvbl9jb2RlIGV4Y2VwKQoreworCXN0YXRpYyB1OCBub3RmaXJzdCA9IDE7CisJaW50IHJldDsKKworCWlmIChnZGJzdHViX2J1c3kpCisJCWdkYnN0dWJfcHJpbnRrKCItLT4gZ2Ric3R1YiByZWVudGVyZWQgaXRzZWxmXG4iKTsKKwlnZGJzdHViX2J1c3kgPSAxOworCisJaWYgKG5vdGZpcnN0KSB7CisJCXVuc2lnbmVkIGxvbmcgbWRyOworCQlhc20oIm1vdiBtZHIsJTAiIDogIj1kIihtZHIpKTsKKworCQlnZGJzdHViX2VudHJ5KAorCQkJIi0tPiBnZGJzdHViX2ludGVyY2VwdCglcCwlMDR4KSBbTURSPSVseCBQQz0lbHhdXG4iLAorCQkJcmVncywgZXhjZXAsIG1kciwgcmVncy0+cGMpOworCisJCWdkYnN0dWJfZW50cnkoCisJCQkiUEM6ICAlMDhseCBFUFNXOiAgJTA4bHggIFNTUDogJTA4bHggbW9kZTogJXNcbiIsCisJCQlyZWdzLT5wYywgcmVncy0+ZXBzdywgKHVuc2lnbmVkIGxvbmcpICZyZXQsCisJCQl1c2VyX21vZGUocmVncykgPyAiVXNlciIgOiAiU3VwZXIiKTsKKwkJZ2Ric3R1Yl9lbnRyeSgKKwkJCSJkMDogICUwOGx4ICAgZDE6ICAlMDhseCAgIGQyOiAlMDhseCAgIGQzOiAlMDhseFxuIiwKKwkJCXJlZ3MtPmQwLCByZWdzLT5kMSwgcmVncy0+ZDIsIHJlZ3MtPmQzKTsKKwkJZ2Ric3R1Yl9lbnRyeSgKKwkJCSJhMDogICUwOGx4ICAgYTE6ICAlMDhseCAgIGEyOiAlMDhseCAgIGEzOiAlMDhseFxuIiwKKwkJCXJlZ3MtPmEwLCByZWdzLT5hMSwgcmVncy0+YTIsIHJlZ3MtPmEzKTsKKwkJZ2Ric3R1Yl9lbnRyeSgKKwkJCSJlMDogICUwOGx4ICAgZTE6ICAlMDhseCAgIGUyOiAlMDhseCAgIGUzOiAlMDhseFxuIiwKKwkJCXJlZ3MtPmUwLCByZWdzLT5lMSwgcmVncy0+ZTIsIHJlZ3MtPmUzKTsKKwkJZ2Ric3R1Yl9lbnRyeSgKKwkJCSJlNDogICUwOGx4ICAgZTU6ICAlMDhseCAgIGU2OiAlMDhseCAgIGU3OiAlMDhseFxuIiwKKwkJCXJlZ3MtPmU0LCByZWdzLT5lNSwgcmVncy0+ZTYsIHJlZ3MtPmU3KTsKKwkJZ2Ric3R1Yl9lbnRyeSgKKwkJCSJsYXI6ICUwOGx4ICAgbGlyOiAlMDhseCAgbWRyOiAlMDhseCAgdXNwOiAlMDhseFxuIiwKKwkJCXJlZ3MtPmxhciwgcmVncy0+bGlyLCByZWdzLT5tZHIsIHJlZ3MtPnNwKTsKKwkJZ2Ric3R1Yl9lbnRyeSgKKwkJCSJjdmY6ICUwOGx4ICAgY3JsOiAlMDhseCAgY3JoOiAlMDhseCAgZHJxOiAlMDhseFxuIiwKKwkJCXJlZ3MtPm1jdmYsIHJlZ3MtPm1jcmwsIHJlZ3MtPm1jcmgsIHJlZ3MtPm1kcnEpOworCQlnZGJzdHViX2VudHJ5KAorCQkJInRocmVhZGluZm89JXAgdGFzaz0lcClcbiIsCisJCQljdXJyZW50X3RocmVhZF9pbmZvKCksIGN1cnJlbnQpOworCX0gZWxzZSB7CisJCW5vdGZpcnN0ID0gMTsKKwl9CisKKwlyZXQgPSBnZGJzdHViKHJlZ3MsIGV4Y2VwKTsKKworCWdkYnN0dWJfZW50cnkoIjwtLSBnZGJzdHViX2ludGVyY2VwdCgpXG4iKTsKKwlnZGJzdHViX2J1c3kgPSAwOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBoYW5kbGUgdGhlIEdEQiBzdHViIGl0c2VsZiBjYXVzaW5nIGFuIGV4Y2VwdGlvbgorICovCithc21saW5rYWdlIHZvaWQgZ2Ric3R1Yl9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkJICBlbnVtIGV4Y2VwdGlvbl9jb2RlIGV4Y2VwKQoreworCXVuc2lnbmVkIGxvbmcgbWRyOworCisJYXNtKCJtb3YgbWRyLCUwIiA6ICI9ZCIobWRyKSk7CisJZ2Ric3R1Yl9lbnRyeSgiLS0+IGdkYnN0dWIgZXhjZXB0aW9uKHslcH0sJTA0eCkgW01EUj0lbHhdXG4iLAorCQkgICAgICByZWdzLCBleGNlcCwgbWRyKTsKKworCXdoaWxlICgodW5zaWduZWQgbG9uZykgcmVncyA9PSAweGZmZmZmZmZmKSB7fQorCisJLyogaGFuZGxlIGd1YXJkZWQgbWVtb3J5IGFjY2Vzc2VzIHdoZXJlIHdlIGtub3cgaXQgbWlnaHQgZmF1bHQgKi8KKwlpZiAocmVncy0+cGMgPT0gKHVuc2lnbmVkKSBnZGJzdHViX3JlYWRfYnl0ZV9ndWFyZCkgeworCQlyZWdzLT5wYyA9ICh1bnNpZ25lZCkgZ2Ric3R1Yl9yZWFkX2J5dGVfY29udDsKKwkJZ290byBmYXVsdDsKKwl9CisKKwlpZiAocmVncy0+cGMgPT0gKHVuc2lnbmVkKSBnZGJzdHViX3JlYWRfd29yZF9ndWFyZCkgeworCQlyZWdzLT5wYyA9ICh1bnNpZ25lZCkgZ2Ric3R1Yl9yZWFkX3dvcmRfY29udDsKKwkJZ290byBmYXVsdDsKKwl9CisKKwlpZiAocmVncy0+cGMgPT0gKHVuc2lnbmVkKSBnZGJzdHViX3JlYWRfZHdvcmRfZ3VhcmQpIHsKKwkJcmVncy0+cGMgPSAodW5zaWduZWQpIGdkYnN0dWJfcmVhZF9kd29yZF9jb250OworCQlnb3RvIGZhdWx0OworCX0KKworCWlmIChyZWdzLT5wYyA9PSAodW5zaWduZWQpIGdkYnN0dWJfd3JpdGVfYnl0ZV9ndWFyZCkgeworCQlyZWdzLT5wYyA9ICh1bnNpZ25lZCkgZ2Ric3R1Yl93cml0ZV9ieXRlX2NvbnQ7CisJCWdvdG8gZmF1bHQ7CisJfQorCisJaWYgKHJlZ3MtPnBjID09ICh1bnNpZ25lZCkgZ2Ric3R1Yl93cml0ZV93b3JkX2d1YXJkKSB7CisJCXJlZ3MtPnBjID0gKHVuc2lnbmVkKSBnZGJzdHViX3dyaXRlX3dvcmRfY29udDsKKwkJZ290byBmYXVsdDsKKwl9CisKKwlpZiAocmVncy0+cGMgPT0gKHVuc2lnbmVkKSBnZGJzdHViX3dyaXRlX2R3b3JkX2d1YXJkKSB7CisJCXJlZ3MtPnBjID0gKHVuc2lnbmVkKSBnZGJzdHViX3dyaXRlX2R3b3JkX2NvbnQ7CisJCWdvdG8gZmF1bHQ7CisJfQorCisJZ2Ric3R1Yl9wcmludGsoIlxuIyMjIEdEQiBzdHViIGNhdXNlZCBhbiBleGNlcHRpb24gIyMjXG4iKTsKKworCS8qIHNvbWV0aGluZyB3ZW50IGhvcnJpYmx5IHdyb25nICovCisJY29uc29sZV92ZXJib3NlKCk7CisJc2hvd19yZWdpc3RlcnMocmVncyk7CisKKwlwYW5pYygiR0RCIFN0dWIgY2F1c2VkIGFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIC0gY2FuJ3QgY29udGludWVcbiIpOworCisJLyogd2UgY2F1Z2h0IGFuIGF0dGVtcHQgYnkgdGhlIHN0dWIgdG8gYWNjZXNzIHNpbGx5IG1lbW9yeSAqLworZmF1bHQ6CisJZ2Ric3R1Yl9lbnRyeSgiPC0tIGdkYnN0dWIgZXhjZXB0aW9uKCkgPSBFRkFVTFRcbiIpOworCXJlZ3MtPmQwID0gLUVGQVVMVDsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBzZW5kIGFuIGV4aXQgbWVzc2FnZSB0byBHREIKKyAqLwordm9pZCBnZGJzdHViX2V4aXQoaW50IHN0YXR1cykKK3sKKwl1bnNpZ25lZCBjaGFyIGNoZWNrc3VtOworCXVuc2lnbmVkIGNoYXIgY2g7CisJaW50IGNvdW50OworCisJZ2Ric3R1Yl9idXN5ID0gMTsKKwlvdXRwdXRfYnVmZmVyWzBdID0gJ1cnOworCW91dHB1dF9idWZmZXJbMV0gPSBoZXhjaGFyc1soc3RhdHVzID4+IDQpICYgMHgwRl07CisJb3V0cHV0X2J1ZmZlclsyXSA9IGhleGNoYXJzW3N0YXR1cyAmIDB4MEZdOworCW91dHB1dF9idWZmZXJbM10gPSAwOworCisJZ2Ric3R1Yl9pb190eF9jaGFyKCckJyk7CisJY2hlY2tzdW0gPSAwOworCWNvdW50ID0gMDsKKworCXdoaWxlICgoY2ggPSBvdXRwdXRfYnVmZmVyW2NvdW50XSkgIT0gMCkgeworCQlnZGJzdHViX2lvX3R4X2NoYXIoY2gpOworCQljaGVja3N1bSArPSBjaDsKKwkJY291bnQgKz0gMTsKKwl9CisKKwlnZGJzdHViX2lvX3R4X2NoYXIoJyMnKTsKKwlnZGJzdHViX2lvX3R4X2NoYXIoaGV4Y2hhcnNbY2hlY2tzdW0gPj4gNF0pOworCWdkYnN0dWJfaW9fdHhfY2hhcihoZXhjaGFyc1tjaGVja3N1bSAmIDB4Zl0pOworCisJLyogbWFrZSBzdXJlIHRoZSBvdXRwdXQgaXMgZmx1c2hlZCwgb3IgZWxzZSBSZWRCb290IG1pZ2h0IGNsb2JiZXIgaXQgKi8KKwlnZGJzdHViX2lvX3R4X2ZsdXNoKCk7CisKKwlnZGJzdHViX2J1c3kgPSAwOworfQorCisvKgorICogaW5pdGlhbGlzZSB0aGUgR0RCIHN0dWIKKyAqLworYXNtbGlua2FnZSB2b2lkIF9faW5pdCBnZGJzdHViX2luaXQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfR0RCU1RVQl9JTU1FRElBVEUKKwl1bnNpZ25lZCBjaGFyIGNoOworCWludCByZXQ7CisjZW5kaWYKKworCWdkYnN0dWJfYnVzeSA9IDE7CisKKwlwcmludGsoS0VSTl9JTkZPICIlcyIsIGdkYnN0dWJfYmFubmVyKTsKKworCWdkYnN0dWJfaW9faW5pdCgpOworCisJZ2Ric3R1Yl9lbnRyeSgiLS0+IGdkYnN0dWJfaW5pdFxuIik7CisKKwkvKiB0cnkgdG8gdGFsayB0byBHREIgKG9yIGFueW9uZSBpbnNhbmUgZW5vdWdoIHRvIHdhbnQgdG8gdHlwZSBHREIKKwkgKiBwcm90b2NvbCBieSBoYW5kKSAqLworCWdkYnN0dWJfaW8oIiMjIyBHREIgVHggQUNLXG4iKTsKKwlnZGJzdHViX2lvX3R4X2NoYXIoJysnKTsgLyogJ2hlbGxvIHdvcmxkJyAqLworCisjaWZkZWYgQ09ORklHX0dEQlNUVUJfSU1NRURJQVRFCisJZ2Ric3R1Yl9wcmludGsoIkdEQiBTdHViIHdhaXRpbmcgZm9yIHBhY2tldFxuIik7CisKKwkvKiBpbiBjYXNlIEdEQiBpcyBzdGFydGVkIGJlZm9yZSB1cywgQUNLIGFueSBwYWNrZXRzIHRoYXQgYXJlIGFscmVhZHkKKwkgKiBzaXR0aW5nIHRoZXJlIChwcmVzdW1hYmx5ICIkPyN4eCIpCisJICovCisJZG8geyBnZGJzdHViX2lvX3J4X2NoYXIoJmNoLCAwKTsgfSB3aGlsZSAoY2ggIT0gJyQnKTsKKwlkbyB7IGdkYnN0dWJfaW9fcnhfY2hhcigmY2gsIDApOyB9IHdoaWxlIChjaCAhPSAnIycpOworCS8qIGVhdCBmaXJzdCBjc3VtIGJ5dGUgKi8KKwlkbyB7IHJldCA9IGdkYnN0dWJfaW9fcnhfY2hhcigmY2gsIDApOyB9IHdoaWxlIChyZXQgIT0gMCk7CisJLyogZWF0IHNlY29uZCBjc3VtIGJ5dGUgKi8KKwlkbyB7IHJldCA9IGdkYnN0dWJfaW9fcnhfY2hhcigmY2gsIDApOyB9IHdoaWxlIChyZXQgIT0gMCk7CisKKwlnZGJzdHViX2lvKCIjIyMgR0RCIFR4IE5BS1xuIik7CisJZ2Ric3R1Yl9pb190eF9jaGFyKCctJyk7IC8qIE5BSyBpdCAqLworCisjZWxzZQorCXByaW50aygiR0RCIFN0dWIgcmVhZHlcbiIpOworI2VuZGlmCisKKwlnZGJzdHViX2J1c3kgPSAwOworCWdkYnN0dWJfZW50cnkoIjwtLSBnZGJzdHViX2luaXRcbiIpOworfQorCisvKgorICogcmVnaXN0ZXIgdGhlIGNvbnNvbGUgYXQgYSBtb3JlIGFwcHJvcHJpYXRlIHRpbWUKKyAqLworI2lmZGVmIENPTkZJR19HREJTVFVCX0NPTlNPTEUKK3N0YXRpYyBpbnQgX19pbml0IGdkYnN0dWJfcG9zdGluaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9OT1RJQ0UgInJlZ2lzdGVyaW5nIGNvbnNvbGVcbiIpOworCXJlZ2lzdGVyX2NvbnNvbGUoJmdkYnN0dWJfY29uc29sZSk7CisJcmV0dXJuIDA7Cit9CisKK19faW5pdGNhbGwoZ2Ric3R1Yl9wb3N0aW5pdCk7CisjZW5kaWYKKworLyoKKyAqIGhhbmRsZSBjaGFyYWN0ZXIgcmVjZXB0aW9uIG9uIEdEQiBzZXJpYWwgcG9ydAorICogLSBqdW1wIGludG8gdGhlIEdEQiBzdHViIGlmIEJSRUFLIGlzIGRldGVjdGVkIG9uIHRoZSBzZXJpYWwgbGluZQorICovCithc21saW5rYWdlIHZvaWQgZ2Ric3R1Yl9yeF9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGVudW0gZXhjZXB0aW9uX2NvZGUgZXhjZXApCit7CisJY2hhciBjaDsKKwlpbnQgcmV0OworCisJZ2Ric3R1Yl9lbnRyeSgiLS0+IGdkYnN0dWJfcnhfaXJxXG4iKTsKKworCWRvIHsKKwkJcmV0ID0gZ2Ric3R1Yl9pb19yeF9jaGFyKCZjaCwgMSk7CisJCWlmIChyZXQgIT0gLUVJTyAmJiByZXQgIT0gLUVBR0FJTikgeworCQkJaWYgKHJldCAhPSAtRUlOVFIpCisJCQkJZ2Ric3R1Yl9yeF91bmdldCA9IGNoOworCQkJZ2Ric3R1YihyZWdzLCBleGNlcCk7CisJCX0KKwl9IHdoaWxlIChyZXQgIT0gLUVBR0FJTik7CisKKwlnZGJzdHViX2VudHJ5KCI8LS0gZ2Ric3R1Yl9yeF9pcnFcbiIpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9oZWFkLlMgYi9hcmNoL21uMTAzMDAva2VybmVsL2hlYWQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDZiZDhjNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvaGVhZC5TCkBAIC0wLDAgKzEsMjU1IEBACisvKiBCb290IGVudHJ5IHBvaW50IGZvciBNTjEwMzAwIGtlcm5lbAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9mcmFtZS5pbmM+CisjaW5jbHVkZSA8YXNtL3BhcmFtLmg+CisjaW5jbHVkZSA8YXNtL3VuaXQvc2VyaWFsLmg+CisKKwkuc2VjdGlvbiAudGV4dC5oZWFkLCJheCIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBib290bG9hZGVyIGVudHJ5IHBvaW50CisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJLmdsb2JsCV9zdGFydAorCS50eXBlCV9zdGFydCxAZnVuY3Rpb24KK19zdGFydDoKKwkjIHNhdmUgY29tbWFuZGxpbmUgcG9pbnRlcgorCW1vdglkMCxhMworCisJIyBwcmVsb2FkIHRoZSBQR0QgcG9pbnRlciByZWdpc3RlcgorCW1vdglzd2FwcGVyX3BnX2RpcixkMAorCW1vdglkMCwoUFRCUikKKworCSMgdHVybiBvbiB0aGUgVExCcworCW1vdglNTVVDVFJfSUlWfE1NVUNUUl9ESVYsZDAKKwltb3YJZDAsKE1NVUNUUikKKwltb3YJTU1VQ1RSX0lURXxNTVVDVFJfRFRFfE1NVUNUUl9DRSxkMAorCW1vdglkMCwoTU1VQ1RSKQorCisJIyB0dXJuIG9uIEFNMzN2MiBleGNlcHRpb24gaGFuZGxpbmcgbW9kZSBhbmQgc2V0IHRoZSB0cmFwIHRhYmxlIGJhc2UKKwltb3ZodQkoQ1BVUCksZDAKKwlvcglDUFVQX0VYTV9BTTMzVjIsZDAKKwltb3ZodQlkMCwoQ1BVUCkKKwltb3YJQ09ORklHX0lOVEVSUlVQVF9WRUNUT1JfQkFTRSxkMAorCW1vdglkMCwoVEJSKQorCisJIyBpbnZhbGlkYXRlIGFuZCBlbmFibGUgYm90aCBvZiB0aGUgY2FjaGVzCisJbW92CUNIQ1RSLGEwCisJY2xyCWQwCisJbW92aHUJZDAsKGEwKQkJCQkJIyB0dXJuIG9mZiBmaXJzdAorCW1vdglDSENUUl9JQ0lOVnxDSENUUl9EQ0lOVixkMAorCW1vdmh1CWQwLChhMCkKKwlzZXRsYgorCW1vdgkoYTApLGQwCisJYnRzdAlDSENUUl9JQ0JVU1l8Q0hDVFJfRENCVVNZLGQwCQkjIHdhaXQgdGlsbCBub3QgYnVzeQorCWxuZQorCisjaWZuZGVmIENPTkZJR19NTjEwMzAwX0NBQ0hFX0RJU0FCTEVECisjaWZkZWYgQ09ORklHX01OMTAzMDBfQ0FDSEVfV0JBQ0sKKyNpZm5kZWYgQ09ORklHX01OMTAzMDBfQ0FDSEVfV0JBQ0tfTk9XUkFMTE9DCisJbW92CUNIQ1RSX0lDRU58Q0hDVFJfRENFTnxDSENUUl9EQ1dUTURfV1JCQUNLLGQwCisjZWxzZQorCW1vdglDSENUUl9JQ0VOfENIQ1RSX0RDRU58Q0hDVFJfRENXVE1EX1dSQkFDS3xDSENUUl9EQ0FMTUQsZDAKKyNlbmRpZiAvKiBDQUNIRV9ESVNBQkxFRCAqLworI2Vsc2UKKwltb3YJQ0hDVFJfSUNFTnxDSENUUl9EQ0VOfENIQ1RSX0RDV1RNRF9XUlRIUk9VR0gsZDAKKyNlbmRpZiAvKiBXQkFDSyAqLworCW1vdmh1CWQwLChhMCkJCQkJCSMgZW5hYmxlCisjZW5kaWYgLyogTk9XUkFMTE9DICovCisKKwkjIHR1cm4gb24gUlRTIG9uIHRoZSBkZWJ1ZyBzZXJpYWwgcG9ydCBpZiBhcHBsaWNhYmxlCisjaWZkZWYgQ09ORklHX01OMTAzMDBfVU5JVF9BU0IyMzA1CisJYnNldAlVQVJUX01DUl9SVFMsKEFTQjIzMDVfREVCVUdfTUNSKQorI2VuZGlmCisKKwkjIGNsZWFyIHRoZSBCU1MgYXJlYQorCW1vdglfX2Jzc19zdGFydCxhMAorCW1vdglfX2Jzc19zdG9wLGExCisJY2xyCWQwCitic3NjbGVhcjoKKwljbXAJYTEsYTAKKwliZ2UJYnNzY2xlYXJfZW5kCisJbW92CWQwLChhMCkKKwlpbmM0CWEwCisJYnJhCWJzc2NsZWFyCitic3NjbGVhcl9lbmQ6CisKKwkjIHJldHJpZXZlIHRoZSBwYXJhbWV0ZXJzIChpbmNsdWRpbmcgY29tbWFuZCBsaW5lKSBiZWZvcmUgd2Ugb3ZlcndyaXRlCisJIyB0aGVtCisJY21wCTB4YWJhZGNhZmUsZDEKKwlibmUJX19ub19wYXJhbWV0ZXJzCisKK19fY29weV9wYXJhbWV0ZXJzOgorCW1vdglyZWRib290X2NvbW1hbmRfbGluZSxhMAorCW1vdglhMCxhMQorCWFkZAlDT01NQU5EX0xJTkVfU0laRSxhMQorMToKKwltb3ZidQkoYTMpLGQwCisJaW5jCWEzCisJbW92YnUJZDAsKGEwKQorCWluYwlhMAorCWNtcAlhMSxhMAorCWJsdAkxYgorCisJbW92CXJlZGJvb3RfcGxhdGZvcm1fbmFtZSxhMAorCW1vdglhMCxhMQorCWFkZAlDT01NQU5EX0xJTkVfU0laRSxhMQorCW1vdglkMixhMworMToKKwltb3ZidQkoYTMpLGQwCisJaW5jCWEzCisJbW92YnUJZDAsKGEwKQorCWluYwlhMAorCWNtcAlhMSxhMAorCWJsdAkxYgorCitfX25vX3BhcmFtZXRlcnM6CisKKwkjIHNldCB1cCB0aGUgcmVnaXN0ZXJzIHdpdGggcmVjb2duaXNhYmxlIHJ1YmJpc2ggaW4gdGhlbQorCW1vdglpbml0X3RocmVhZF91bmlvbitUSFJFQURfU0laRS0xMixzcAorCisJbW92CTB4ZWEwMWVhZWEsZDAKKwltb3YJZDAsKDQsc3ApCQkjIEVQU1cgc2F2ZSBhcmVhCisJbW92CTB4ZWEwMmVhZWEsZDAKKwltb3YJZDAsKDgsc3ApCQkjIFBDIHNhdmUgYXJlYQorCisJbW92CTB4ZWIwMDYwZWQsZDAKKwltb3YJZDAsbWRyCisJbW92CTB4ZWIwMDYxZWQsZDAKKwltb3YJZDAsbWRycQorCW1vdgkweGViMDA2MmVkLGQwCisJbW92CWQwLG1jcmgKKwltb3YJMHhlYjAwNjNlZCxkMAorCW1vdglkMCxtY3JsCisJbW92CTB4ZWIwMDY0ZWQsZDAKKwltb3YJZDAsbWN2ZgorCW1vdgkweGVkMDA2NWVkLGEzCisJbW92CWEzLHVzcAorCisJbW92CTB4ZWQwMGUwZWQsZTAKKwltb3YJMHhlZDAwZTFlZCxlMQorCW1vdgkweGVkMDBlMmVkLGUyCisJbW92CTB4ZWQwMGUzZWQsZTMKKwltb3YJMHhlZDAwZTRlZCxlNAorCW1vdgkweGVkMDBlNWVkLGU1CisJbW92CTB4ZWQwMGU2ZWQsZTYKKwltb3YJMHhlZDAwZTdlZCxlNworCisJbW92CTB4ZWQwMGQwZWQsZDAKKwltb3YJMHhlZDAwZDFlZCxkMQorCW1vdgkweGVkMDBkMmVkLGQyCisJbW92CTB4ZWQwMGQzZWQsZDMKKwltb3YJMHhlZDAwYTBlZCxhMAorCW1vdgkweGVkMDBhMWVkLGExCisJbW92CTB4ZWQwMGEyZWQsYTIKKwltb3YJMCxhMworCisJIyBzZXQgdXAgdGhlIGluaXRpYWwga2VybmVsIHN0YWNrCisJU0FWRV9BTEwKKwltb3YJMHhmZmZmZmZmZixkMAorCW1vdglkMCwoUkVHX09SSUdfRDAsZnApCisKKwkjIHB1dCBkaWZmZXJlbnQgcmVjb2duaXNhYmxlIHJ1YmJpc2ggaW4gdGhlIHJlZ3MKKwltb3YJMHhmYjAwNjBlZCxkMAorCW1vdglkMCxtZHIKKwltb3YJMHhmYjAwNjFlZCxkMAorCW1vdglkMCxtZHJxCisJbW92CTB4ZmIwMDYyZWQsZDAKKwltb3YJZDAsbWNyaAorCW1vdgkweGZiMDA2M2VkLGQwCisJbW92CWQwLG1jcmwKKwltb3YJMHhmYjAwNjRlZCxkMAorCW1vdglkMCxtY3ZmCisJbW92CTB4ZmQwMDY1ZWQsYTAKKwltb3YJYTAsdXNwCisKKwltb3YJMHhmZDAwZTBlZCxlMAorCW1vdgkweGZkMDBlMWVkLGUxCisJbW92CTB4ZmQwMGUyZWQsZTIKKwltb3YJMHhmZDAwZTNlZCxlMworCW1vdgkweGZkMDBlNGVkLGU0CisJbW92CTB4ZmQwMGU1ZWQsZTUKKwltb3YJMHhmZDAwZTZlZCxlNgorCW1vdgkweGZkMDBlN2VkLGU3CisKKwltb3YJMHhmZDAwZDBlZCxkMAorCW1vdgkweGZkMDBkMWVkLGQxCisJbW92CTB4ZmQwMGQyZWQsZDIKKwltb3YJMHhmZDAwZDNlZCxkMworCW1vdgkweGZkMDBhMGVkLGEwCisJbW92CTB4ZmQwMGExZWQsYTEKKwltb3YJMHhmZDAwYTJlZCxhMgorCisJIyB3ZSBtYXkgYmUgaG9sZGluZyBjdXJyZW50IGluIEUyCisjaWZkZWYgQ09ORklHX01OMTAzMDBfQ1VSUkVOVF9JTl9FMgorCW1vdglpbml0X3Rhc2ssZTIKKyNlbmRpZgorCisJIyBpbml0aWFsaXNlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZSB1bml0CisJY2FsbAlwcm9jZXNzb3JfaW5pdFtdLDAKKwljYWxsCXVuaXRfaW5pdFtdLDAKKworI2lmZGVmIENPTkZJR19HREJTVFVCCisJY2FsbAlnZGJzdHViX2luaXRbXSwwCisKKyNpZmRlZiBDT05GSUdfR0RCU1RVQl9JTU1FRElBVEUKKwkuZ2xvYmwJX19nZGJzdHViX3BhdXNlCitfX2dkYnN0dWJfcGF1c2U6CisJYnJhCV9fZ2Ric3R1Yl9wYXVzZQorI2VuZGlmCisjZW5kaWYKKworCWptcAlzdGFydF9rZXJuZWwKKwkuc2l6ZQlfc3RhcnQsIF9zdGFydC0uCitFTlRSWShfX2hlYWRfZW5kKQorCisvKgorICogVGhpcyBpcyBpbml0aWFsaXplZCB0byBkaXNhbGxvdyBhbGwgYWNjZXNzIHRvIHRoZSBsb3cgMkcgcmVnaW9uCisgKiAtIHRoZSBoaWdoIDJHIHJlZ2lvbiBpcyBtYW5hZ2VkIGRpcmVjdGx5IGJ5IHRoZSBNTVUKKyAqIC0gcmFuZ2UgMHg3MDAwMDAwMC0weDdDMDAwMDAwIGFyZSBpbml0aWFsaXNlZCBmb3IgdXNlIGJ5IFZNQUxMT0MKKyAqLworCS5zZWN0aW9uIC5ic3MKKwkuYmFsaWduIFBBR0VfU0laRQorRU5UUlkoc3dhcHBlcl9wZ19kaXIpCisgICAgICAgIC5zcGFjZSBQVFJTX1BFUl9QR0QqNAorCisvKgorICogVGhlIHBhZ2UgdGFibGVzIGFyZSBpbml0aWFsaXplZCB0byBvbmx5IDhNQiBoZXJlIC0gdGhlIGZpbmFsIHBhZ2UKKyAqIHRhYmxlcyBhcmUgc2V0IHVwIGxhdGVyIGRlcGVuZGluZyBvbiBtZW1vcnkgc2l6ZS4KKyAqLworCisJLmJhbGlnbiBQQUdFX1NJWkUKK0VOVFJZKGVtcHR5X3plcm9fcGFnZSkKKwkuc3BhY2UgUEFHRV9TSVpFCisKKwkuYmFsaWduIFBBR0VfU0laRQorRU5UUlkoZW1wdHlfYmFkX3BhZ2UpCisJLnNwYWNlIFBBR0VfU0laRQorCisJLmJhbGlnbiBQQUdFX1NJWkUKK0VOVFJZKGVtcHR5X2JhZF9wdGVfdGFibGUpCisJLnNwYWNlIFBBR0VfU0laRQorCisJLmJhbGlnbiBQQUdFX1NJWkUKK0VOVFJZKGxhcmdlX3BhZ2VfdGFibGUpCisJLnNwYWNlIFBBR0VfU0laRQorCisJLmJhbGlnbiBQQUdFX1NJWkUKK0VOVFJZKGtlcm5lbF92bWFsbG9jX3B0ZXMpCisJLnNwYWNlICgoVk1BTExPQ19FTkQtVk1BTExPQ19TVEFSVCkvUEFHRV9TSVpFKSo0CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL2luaXRfdGFzay5jIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9pbml0X3Rhc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWZlNjg4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9pbml0X3Rhc2suYwpAQCAtMCwwICsxLDQ1IEBACisvKiBNTjEwMzAwIEluaXRpYWwgdGFzayBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNYXRzdXNoaXRhIEVsZWN0cmljIEluZHVzdHJpYWwgQ28uLCBMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbXF1ZXVlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCitzdGF0aWMgc3RydWN0IGZzX3N0cnVjdCBpbml0X2ZzID0gSU5JVF9GUzsKK3N0YXRpYyBzdHJ1Y3QgZmlsZXNfc3RydWN0IGluaXRfZmlsZXMgPSBJTklUX0ZJTEVTOworc3RhdGljIHN0cnVjdCBzaWduYWxfc3RydWN0IGluaXRfc2lnbmFscyA9IElOSVRfU0lHTkFMUyhpbml0X3NpZ25hbHMpOworc3RhdGljIHN0cnVjdCBzaWdoYW5kX3N0cnVjdCBpbml0X3NpZ2hhbmQgPSBJTklUX1NJR0hBTkQoaW5pdF9zaWdoYW5kKTsKK3N0cnVjdCBtbV9zdHJ1Y3QgaW5pdF9tbSA9IElOSVRfTU0oaW5pdF9tbSk7CitFWFBPUlRfU1lNQk9MKGluaXRfbW0pOworCisvKgorICogSW5pdGlhbCB0aHJlYWQgc3RydWN0dXJlLgorICoKKyAqIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhpcyBpcyBUSFJFQURfU0laRSBhbGlnbmVkIGR1ZSB0byB0aGUKKyAqIHdheSBwcm9jZXNzIHN0YWNrcyBhcmUgaGFuZGxlZC4gVGhpcyBpcyBkb25lIGJ5IGhhdmluZyBhIHNwZWNpYWwKKyAqICJpbml0X3Rhc2siIGxpbmtlciBtYXAgZW50cnkuLgorICovCit1bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90aHJlYWRfdW5pb24KKwlfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmRhdGEuaW5pdF90YXNrIikpKSA9CisJCXsgSU5JVF9USFJFQURfSU5GTyhpbml0X3Rhc2spIH07CisKKy8qCisgKiBJbml0aWFsIHRhc2sgc3RydWN0dXJlLgorICoKKyAqIEFsbCBvdGhlciB0YXNrIHN0cnVjdHMgd2lsbCBiZSBhbGxvY2F0ZWQgb24gc2xhYnMgaW4gZm9yay5jCisgKi8KK3N0cnVjdCB0YXNrX3N0cnVjdCBpbml0X3Rhc2sgPSBJTklUX1RBU0soaW5pdF90YXNrKTsKK0VYUE9SVF9TWU1CT0woaW5pdF90YXNrKTsKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvaW50ZXJuYWwuaCBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWUyZWVlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qIEludGVybmFsIGRlZmluaXRpb25zIGZvciB0aGUgYXJjaCBwYXJ0IG9mIHRoZSBjb3JlIGtlcm5lbAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisvKgorICoga3RocmVhZC5TCisgKi8KK2V4dGVybiBpbnQga2VybmVsX3RocmVhZF9oZWxwZXIoaW50KTsKKworLyoKKyAqIGVudHJ5LlMKKyAqLworZXh0ZXJuIHZvaWQgcmV0X2Zyb21fZm9yayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKikgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvaW8uYyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTZmZGY2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9pby5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIE1OMTAzMDAgTWlzYWxpZ25lZCBtdWx0aWJ5dGUtd29yZCBJL08KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyoKKyAqIG91dHB1dCBkYXRhIGZyb20gYSBwb3RlbnRpYWxseSBtaXNhbGlnbmVkIGJ1ZmZlcgorICovCit2b2lkIF9fb3V0c2wodW5zaWduZWQgbG9uZyBhZGRyLCBjb25zdCB2b2lkICpidWZmZXIsIGludCBjb3VudCkKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpidWYgPSBidWZmZXI7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwl3aGlsZSAoY291bnQtLSkgeworCQltZW1jcHkoJnZhbCwgYnVmLCA0KTsKKwkJb3V0bCh2YWwsIGFkZHIpOworCQlidWYgKz0gNDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKF9fb3V0c2wpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9pcnEuYyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYxYzQzNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvaXJxLmMKQEAgLTAsMCArMSwyMzUgQEAKKy8qIE1OMTAzMDAgQXJjaC1zcGVjaWZpYyBpbnRlcnJ1cHQgaGFuZGxpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisKK3Vuc2lnbmVkIGxvbmcgX19tbjEwMzAwX2lycV9lbmFibGVkX2Vwc3cgPSBFUFNXX0lFIHwgRVBTV19JTV83OworRVhQT1JUX1NZTUJPTChfX21uMTAzMDBfaXJxX2VuYWJsZWRfZXBzdyk7CisKK2F0b21pY190IGlycV9lcnJfY291bnQ7CisKKy8qCisgKiBNTjEwMzAwIElOVEMgY29udHJvbGxlciBvcGVyYXRpb25zCisgKi8KK3N0YXRpYyB2b2lkIG1uMTAzMDBfY3B1cGljX2Rpc2FibGUodW5zaWduZWQgaW50IGlycSkKK3sKKwl1MTYgdG1wID0gR3hJQ1IoaXJxKTsKKwlHeElDUihpcnEpID0gKHRtcCAmIEd4SUNSX0xFVkVMKSB8IEd4SUNSX0RFVEVDVDsKKwl0bXAgPSBHeElDUihpcnEpOworfQorCitzdGF0aWMgdm9pZCBtbjEwMzAwX2NwdXBpY19lbmFibGUodW5zaWduZWQgaW50IGlycSkKK3sKKwl1MTYgdG1wID0gR3hJQ1IoaXJxKTsKKwlHeElDUihpcnEpID0gKHRtcCAmIEd4SUNSX0xFVkVMKSB8IEd4SUNSX0VOQUJMRTsKKwl0bXAgPSBHeElDUihpcnEpOworfQorCitzdGF0aWMgdm9pZCBtbjEwMzAwX2NwdXBpY19hY2sodW5zaWduZWQgaW50IGlycSkKK3sKKwl1MTYgdG1wOworCSoodm9sYXRpbGUgdTggKikgJkd4SUNSKGlycSkgPSBHeElDUl9ERVRFQ1Q7CisJdG1wID0gR3hJQ1IoaXJxKTsKK30KKworc3RhdGljIHZvaWQgbW4xMDMwMF9jcHVwaWNfbWFzayh1bnNpZ25lZCBpbnQgaXJxKQoreworCXUxNiB0bXAgPSBHeElDUihpcnEpOworCUd4SUNSKGlycSkgPSAodG1wICYgR3hJQ1JfTEVWRUwpOworCXRtcCA9IEd4SUNSKGlycSk7Cit9CisKK3N0YXRpYyB2b2lkIG1uMTAzMDBfY3B1cGljX21hc2tfYWNrKHVuc2lnbmVkIGludCBpcnEpCit7CisJdTE2IHRtcCA9IEd4SUNSKGlycSk7CisJR3hJQ1IoaXJxKSA9ICh0bXAgJiBHeElDUl9MRVZFTCkgfCBHeElDUl9ERVRFQ1Q7CisJdG1wID0gR3hJQ1IoaXJxKTsKK30KKworc3RhdGljIHZvaWQgbW4xMDMwMF9jcHVwaWNfdW5tYXNrKHVuc2lnbmVkIGludCBpcnEpCit7CisJdTE2IHRtcCA9IEd4SUNSKGlycSk7CisJR3hJQ1IoaXJxKSA9ICh0bXAgJiBHeElDUl9MRVZFTCkgfCBHeElDUl9FTkFCTEUgfCBHeElDUl9ERVRFQ1Q7CisJdG1wID0gR3hJQ1IoaXJxKTsKK30KKworc3RhdGljIHZvaWQgbW4xMDMwMF9jcHVwaWNfZW5kKHVuc2lnbmVkIGludCBpcnEpCit7CisJdTE2IHRtcCA9IEd4SUNSKGlycSk7CisJR3hJQ1IoaXJxKSA9ICh0bXAgJiBHeElDUl9MRVZFTCkgfCBHeElDUl9FTkFCTEU7CisJdG1wID0gR3hJQ1IoaXJxKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBtbjEwMzAwX2NwdV9waWMgPSB7CisJLm5hbWUJCT0gImNwdSIsCisJLmRpc2FibGUJPSBtbjEwMzAwX2NwdXBpY19kaXNhYmxlLAorCS5lbmFibGUJCT0gbW4xMDMwMF9jcHVwaWNfZW5hYmxlLAorCS5hY2sJCT0gbW4xMDMwMF9jcHVwaWNfYWNrLAorCS5tYXNrCQk9IG1uMTAzMDBfY3B1cGljX21hc2ssCisJLm1hc2tfYWNrCT0gbW4xMDMwMF9jcHVwaWNfbWFza19hY2ssCisJLnVubWFzawkJPSBtbjEwMzAwX2NwdXBpY191bm1hc2ssCisJLmVuZAkJPSBtbjEwMzAwX2NwdXBpY19lbmQsCit9OworCisvKgorICogJ3doYXQgc2hvdWxkIHdlIGRvIGlmIHdlIGdldCBhIGh3IGlycSBldmVudCBvbiBhbiBpbGxlZ2FsIHZlY3RvcicuCisgKiBlYWNoIGFyY2hpdGVjdHVyZSBoYXMgdG8gYW5zd2VyIHRoaXMgdGhlbXNlbHZlcy4KKyAqLwordm9pZCBhY2tfYmFkX2lycShpbnQgaXJxKQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgInVuZXhwZWN0ZWQgSVJRIHRyYXAgYXQgdmVjdG9yICUwMnhcbiIsIGlycSk7Cit9CisKKy8qCisgKiBjaGFuZ2UgdGhlIGxldmVsIGF0IHdoaWNoIGFuIElSUSBleGVjdXRlcworICogLSBtdXN0IG5vdCBiZSBjYWxsZWQgd2hpbHN0IGludGVycnVwdHMgYXJlIGJlaW5nIHByb2Nlc3NlZCEKKyAqLwordm9pZCBzZXRfaW50cl9sZXZlbChpbnQgaXJxLCB1MTYgbGV2ZWwpCit7CisJdTE2IHRtcDsKKworCWlmIChpbl9pbnRlcnJ1cHQoKSkKKwkJQlVHKCk7CisKKwl0bXAgPSBHeElDUihpcnEpOworCUd4SUNSKGlycSkgPSAodG1wICYgR3hJQ1JfRU5BQkxFKSB8IGxldmVsOworCXRtcCA9IEd4SUNSKGlycSk7Cit9CisKKy8qCisgKiBtYXJrIGFuIGludGVycnVwdCB0byBiZSBBQ0snZCBhZnRlciBpbnRlcnJ1cHQgaGFuZGxlcnMgaGF2ZSBiZWVuIHJ1biByYXRoZXIKKyAqIHRoYW4gYmVmb3JlCisgKiAtIHNlZSBEb2N1bWVudGF0aW9uL21uMTAzMDAvZmVhdHVyZXMudHh0CisgKi8KK3ZvaWQgc2V0X2ludHJfcG9zdGFja2FibGUoaW50IGlycSkKK3sKKwlzZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKK30KKworLyoKKyAqIGluaXRpYWxpc2UgdGhlIGludGVycnVwdCBzeXN0ZW0KKyAqLwordm9pZCBfX2luaXQgaW5pdF9JUlEodm9pZCkKK3sKKwlpbnQgaXJxOworCisJZm9yIChpcnEgPSAwOyBpcnEgPCBOUl9JUlFTOyBpcnErKykKKwkJaWYgKGlycV9kZXNjW2lycV0uY2hpcCA9PSAmbm9faXJxX3R5cGUpCisJCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmbW4xMDMwMF9jcHVfcGljLAorCQkJCQkJIGhhbmRsZV9lZGdlX2lycSk7CisJdW5pdF9pbml0X0lSUSgpOworfQorCisvKgorICogaGFuZGxlIG5vcm1hbCBkZXZpY2UgSVJRcworICovCithc21saW5rYWdlIHZvaWQgZG9fSVJRKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBzcCwgZXBzdywgaXJxX2Rpc2FibGVkX2Vwc3csIG9sZF9pcnFfZW5hYmxlZF9lcHN3OworCWludCBpcnE7CisKKwlzcCA9IGN1cnJlbnRfc3RhY2tfcG9pbnRlcigpOworCWlmIChzcCAtIChzcCAmIH4oVEhSRUFEX1NJWkUgLSAxKSkgPCBTVEFDS19XQVJOKQorCQlCVUcoKTsKKworCS8qIG1ha2Ugc3VyZSBsb2NhbF9pcnFfZW5hYmxlKCkgZG9lc24ndCBtdWNrIHVwIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdHkKKwkgKiBzZXR0aW5nIGluIEVQU1cgKi8KKwlvbGRfaXJxX2VuYWJsZWRfZXBzdyA9IF9fbW4xMDMwMF9pcnFfZW5hYmxlZF9lcHN3OworCWxvY2FsX3NhdmVfZmxhZ3MoZXBzdyk7CisJX19tbjEwMzAwX2lycV9lbmFibGVkX2Vwc3cgPSBFUFNXX0lFIHwgKEVQU1dfSU0gJiBlcHN3KTsKKwlpcnFfZGlzYWJsZWRfZXBzdyA9IEVQU1dfSUUgfCBNTjEwMzAwX0NMSV9MRVZFTDsKKworCV9fSVJRX1NUQVQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBfX2lycV9jb3VudCkrKzsKKworCWlycV9lbnRlcigpOworCisJZm9yICg7OykgeworCQkvKiBhc2sgdGhlIGludGVycnVwdCBjb250cm9sbGVyIGZvciB0aGUgbmV4dCBJUlEgdG8gcHJvY2VzcworCQkgKiAtIHRoZSByZXN1bHQgd2UgZ2V0IGRlcGVuZHMgb24gRVBTVy5JTQorCQkgKi8KKwkJaXJxID0gSUFHUiAmIElBR1JfR047CisJCWlmICghaXJxKQorCQkJYnJlYWs7CisKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoaXJxX2Rpc2FibGVkX2Vwc3cpOworCisJCWdlbmVyaWNfaGFuZGxlX2lycShpcnEgPj4gMik7CisKKwkJLyogcmVzdG9yZSBJUlEgY29udHJvbHMgZm9yIElBR1IgYWNjZXNzICovCisJCWxvY2FsX2lycV9yZXN0b3JlKGVwc3cpOworCX0KKworCV9fbW4xMDMwMF9pcnFfZW5hYmxlZF9lcHN3ID0gb2xkX2lycV9lbmFibGVkX2Vwc3c7CisKKwlpcnFfZXhpdCgpOworfQorCisvKgorICogRGlzcGxheSBpbnRlcnJ1cHQgbWFuYWdlbWVudCBpbmZvcm1hdGlvbiB0aHJvdWdoIC9wcm9jL2ludGVycnVwdHMKKyAqLworaW50IHNob3dfaW50ZXJydXB0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCit7CisJaW50IGkgPSAqKGxvZmZfdCAqKSB2LCBqLCBjcHU7CisJc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzd2l0Y2ggKGkpIHsKKwkJLyogZGlzcGxheSBjb2x1bW4gdGl0bGUgYmFyIG5hbWluZyBDUFVzICovCisJY2FzZSAwOgorCQlzZXFfcHJpbnRmKHAsICIgICAgICAgICAgICIpOworCQlmb3IgKGogPSAwOyBqIDwgTlJfQ1BVUzsgaisrKQorCQkJaWYgKGNwdV9vbmxpbmUoaikpCisJCQkJc2VxX3ByaW50ZihwLCAiQ1BVJWQgICAgICAgIiwgaik7CisJCXNlcV9wdXRjKHAsICdcbicpOworCQlicmVhazsKKworCQkvKiBkaXNwbGF5IGluZm9ybWF0aW9uIHJvd3MsIG9uZSBwZXIgYWN0aXZlIENQVSAqLworCWNhc2UgMSAuLi4gTlJfSVJRUyAtIDE6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpcnFfZGVzY1tpXS5sb2NrLCBmbGFncyk7CisKKwkJYWN0aW9uID0gaXJxX2Rlc2NbaV0uYWN0aW9uOworCQlpZiAoYWN0aW9uKSB7CisJCQlzZXFfcHJpbnRmKHAsICIlM2Q6ICIsIGkpOworCQkJZm9yX2VhY2hfcHJlc2VudF9jcHUoY3B1KQorCQkJCXNlcV9wcmludGYocCwgIiUxMHUgIiwga3N0YXRfY3B1KGNwdSkuaXJxc1tpXSk7CisJCQlzZXFfcHJpbnRmKHAsICIgJTE0cy4ldSIsIGlycV9kZXNjW2ldLmNoaXAtPm5hbWUsCisJCQkJICAgKEd4SUNSKGkpICYgR3hJQ1JfTEVWRUwpID4+CisJCQkJICAgR3hJQ1JfTEVWRUxfU0hJRlQpOworCQkJc2VxX3ByaW50ZihwLCAiICAlcyIsIGFjdGlvbi0+bmFtZSk7CisKKwkJCWZvciAoYWN0aW9uID0gYWN0aW9uLT5uZXh0OworCQkJICAgICBhY3Rpb247CisJCQkgICAgIGFjdGlvbiA9IGFjdGlvbi0+bmV4dCkKKwkJCQlzZXFfcHJpbnRmKHAsICIsICVzIiwgYWN0aW9uLT5uYW1lKTsKKworCQkJc2VxX3B1dGMocCwgJ1xuJyk7CisJCX0KKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfZGVzY1tpXS5sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCisJCS8qIHBvbGlzaCBvZmYgd2l0aCBOTUkgYW5kIGVycm9yIGNvdW50ZXJzICovCisJY2FzZSBOUl9JUlFTOgorCQlzZXFfcHJpbnRmKHAsICJOTUk6ICIpOworCQlmb3IgKGogPSAwOyBqIDwgTlJfQ1BVUzsgaisrKQorCQkJaWYgKGNwdV9vbmxpbmUoaikpCisJCQkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBubWlfY291bnQoaikpOworCQlzZXFfcHV0YyhwLCAnXG4nKTsKKworCQlzZXFfcHJpbnRmKHAsICJFUlI6ICUxMHVcbiIsIGF0b21pY19yZWFkKCZpcnFfZXJyX2NvdW50KSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9rZXJuZWxfZXhlY3ZlLlMgYi9hcmNoL21uMTAzMDAva2VybmVsL2tlcm5lbF9leGVjdmUuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjAzOWYxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9rZXJuZWxfZXhlY3ZlLlMKQEAgLTAsMCArMSwzNyBAQAorLyogTU4xMDMwMCBJbi1rZXJuZWwgcHJvZ3JhbSBleGVjdXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIERvIGEgc3lzdGVtIGNhbGwgZnJvbSBrZXJuZWwgaW5zdGVhZCBvZiBjYWxsaW5nIHN5c19leGVjdmUgc28gd2UgZW5kIHVwIHdpdGgKKyMgcHJvcGVyIHB0X3JlZ3MuCisjCisjIGludCBrZXJuZWxfZXhlY3ZlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjaGFyICpjb25zdCBhcmd2W10sCisjCQkgICAgY2hhciAqY29uc3QgZW52cFtdKQorIworIyBPbiBlbnRyeTogRDAvRDEvOChTUCk6IGFyZ3VtZW50cyB0byBmdW5jdGlvbgorIyBPbiByZXR1cm46IEQwOiBzeXNjYWxsIHJldHVybi4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkuZ2xvYmwJCWtlcm5lbF9leGVjdmUKKwkudHlwZQkJa2VybmVsX2V4ZWN2ZSxAZnVuY3Rpb24KK2tlcm5lbF9leGVjdmU6CisJbW92CQlhMyxhMQorCW1vdgkJZDAsYTAKKwltb3YJCSgxMixzcCksYTMKKwltb3YJCStfX05SX2V4ZWN2ZSxkMAorCXN5c2NhbGwJCTAKKwltb3YJCWExLGEzCisJcmV0cworCisJLnNpemUJCWtlcm5lbF9leGVjdmUsLi1rZXJuZWxfZXhlY3ZlCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwva3Byb2Jlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhY2FmYWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAva2VybmVsL2twcm9iZXMuYwpAQCAtMCwwICsxLDY1MyBAQAorLyogTU4xMDMwMCBLZXJuZWwgcHJvYmVzIGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgTWFyayBTYWx0ZXIgKG1zYWx0ZXJAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2VuY2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcHJlZW1wdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisKK3N0cnVjdCBrcmV0cHJvYmVfYmxhY2twb2ludCBrcmV0cHJvYmVfYmxhY2tsaXN0W10gPSB7IHsgTlVMTCwgTlVMTCB9IH07Citjb25zdCBpbnQga3JldHByb2JlX2JsYWNrbGlzdF9zaXplID0gQVJSQVlfU0laRShrcmV0cHJvYmVfYmxhY2tsaXN0KTsKKworLyoga3Byb2JlX3N0YXR1cyBzZXR0aW5ncyAqLworI2RlZmluZSBLUFJPQkVfSElUX0FDVElWRQkweDAwMDAwMDAxCisjZGVmaW5lIEtQUk9CRV9ISVRfU1MJCTB4MDAwMDAwMDIKKworc3RhdGljIHN0cnVjdCBrcHJvYmUgKmN1cnJlbnRfa3Byb2JlOworc3RhdGljIHVuc2lnbmVkIGxvbmcgY3VycmVudF9rcHJvYmVfb3JpZ19wYzsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGN1cnJlbnRfa3Byb2JlX25leHRfcGM7CitzdGF0aWMgaW50IGN1cnJlbnRfa3Byb2JlX3NzX2ZsYWdzOworc3RhdGljIHVuc2lnbmVkIGxvbmcga3Byb2JlX3N0YXR1czsKK3N0YXRpYyBrcHJvYmVfb3Bjb2RlX3QgY3VycmVudF9rcHJvYmVfc3NfYnVmW01BWF9JTlNOX1NJWkUgKyAyXTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGN1cnJlbnRfa3Byb2JlX2JwX2FkZHI7CisKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCBrcHJvYmUgKiwgY3VycmVudF9rcHJvYmUpID0gTlVMTDsKKworCisvKiBzaW5nbGVzdGVwIGZsYWcgYml0cyAqLworI2RlZmluZSBTSU5HTEVTVEVQX0JSQU5DSCAxCisjZGVmaW5lIFNJTkdMRVNURVBfUENSRUwgIDIKKworI2RlZmluZSBSRUFEX0JZVEUocCwgdmFscCkgXAorCWRvIHsgKih1OCAqKSh2YWxwKSA9ICoodTggKikocCk7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgUkVBRF9XT1JEMTYocCwgdmFscCkJCQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJUkVBRF9CWVRFKChwKSwgKHZhbHApKTsJCQkJXAorCQlSRUFEX0JZVEUoKHU4ICopKHApICsgMSwgKHU4ICopKHZhbHApICsgMSk7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFJFQURfV09SRDMyKHAsIHZhbHApCQkJCQlcCisJZG8gewkJCQkJCQlcCisJCVJFQURfQllURSgocCksICh2YWxwKSk7CQkJCVwKKwkJUkVBRF9CWVRFKCh1OCAqKShwKSArIDEsICh1OCAqKSh2YWxwKSArIDEpOwlcCisJCVJFQURfQllURSgodTggKikocCkgKyAyLCAodTggKikodmFscCkgKyAyKTsJXAorCQlSRUFEX0JZVEUoKHU4ICopKHApICsgMywgKHU4ICopKHZhbHApICsgMyk7CVwKKwl9IHdoaWxlICgwKQorCisKK3N0YXRpYyBjb25zdCB1OCBtbjEwMzAwX2luc25fc2l6ZXNbMjU2XSA9Cit7CisJLyogMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAgYSAgYiAgYyAgZCAgZSAgZiAqLworCTEsIDMsIDMsIDMsIDEsIDMsIDMsIDMsIDEsIDMsIDMsIDMsIDEsIDMsIDMsIDMsCS8qIDAgKi8KKwkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvKiAxICovCisJMiwgMiwgMiwgMiwgMywgMywgMywgMywgMiwgMiwgMiwgMiwgMywgMywgMywgMywgLyogMiAqLworCTMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDEsIDEsIDEsIDEsIC8qIDMgKi8KKwkxLCAxLCAyLCAyLCAxLCAxLCAyLCAyLCAxLCAxLCAyLCAyLCAxLCAxLCAyLCAyLCAvKiA0ICovCisJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgLyogNSAqLworCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8qIDYgKi8KKwkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvKiA3ICovCisJMiwgMSwgMSwgMSwgMSwgMiwgMSwgMSwgMSwgMSwgMiwgMSwgMSwgMSwgMSwgMiwgLyogOCAqLworCTIsIDEsIDEsIDEsIDEsIDIsIDEsIDEsIDEsIDEsIDIsIDEsIDEsIDEsIDEsIDIsIC8qIDkgKi8KKwkyLCAxLCAxLCAxLCAxLCAyLCAxLCAxLCAxLCAxLCAyLCAxLCAxLCAxLCAxLCAyLCAvKiBhICovCisJMiwgMSwgMSwgMSwgMSwgMiwgMSwgMSwgMSwgMSwgMiwgMSwgMSwgMSwgMSwgMiwgLyogYiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDIsIDIsIC8qIGMgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvKiBkICovCisJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLyogZSAqLworCTAsIDIsIDIsIDIsIDIsIDIsIDIsIDQsIDAsIDMsIDAsIDQsIDAsIDYsIDcsIDEgIC8qIGYgKi8KK307CisKKyNkZWZpbmUgTFQgKDEgPDwgMCkKKyNkZWZpbmUgR1QgKDEgPDwgMSkKKyNkZWZpbmUgR0UgKDEgPDwgMikKKyNkZWZpbmUgTEUgKDEgPDwgMykKKyNkZWZpbmUgQ1MgKDEgPDwgNCkKKyNkZWZpbmUgSEkgKDEgPDwgNSkKKyNkZWZpbmUgQ0MgKDEgPDwgNikKKyNkZWZpbmUgTFMgKDEgPDwgNykKKyNkZWZpbmUgRVEgKDEgPDwgOCkKKyNkZWZpbmUgTkUgKDEgPDwgOSkKKyNkZWZpbmUgUkEgKDEgPDwgMTApCisjZGVmaW5lIFZDICgxIDw8IDExKQorI2RlZmluZSBWUyAoMSA8PCAxMikKKyNkZWZpbmUgTkMgKDEgPDwgMTMpCisjZGVmaW5lIE5TICgxIDw8IDE0KQorCitzdGF0aWMgY29uc3QgdTE2IGNvbmRfdGFibGVbXSA9IHsKKwkvKiAgViAgQyAgTiAgWiAgKi8KKwkvKiAgMCAgMCAgMCAgMCAgKi8gKE5FIHwgTkMgfCBDQyB8IFZDIHwgR0UgfCBHVCB8IEhJKSwKKwkvKiAgMCAgMCAgMCAgMSAgKi8gKEVRIHwgTkMgfCBDQyB8IFZDIHwgR0UgfCBMRSB8IExTKSwKKwkvKiAgMCAgMCAgMSAgMCAgKi8gKE5FIHwgTlMgfCBDQyB8IFZDIHwgTFQgfCBMRSB8IEhJKSwKKwkvKiAgMCAgMCAgMSAgMSAgKi8gKEVRIHwgTlMgfCBDQyB8IFZDIHwgTFQgfCBMRSB8IExTKSwKKwkvKiAgMCAgMSAgMCAgMCAgKi8gKE5FIHwgTkMgfCBDUyB8IFZDIHwgR0UgfCBHVCB8IExTKSwKKwkvKiAgMCAgMSAgMCAgMSAgKi8gKEVRIHwgTkMgfCBDUyB8IFZDIHwgR0UgfCBMRSB8IExTKSwKKwkvKiAgMCAgMSAgMSAgMCAgKi8gKE5FIHwgTlMgfCBDUyB8IFZDIHwgTFQgfCBMRSB8IExTKSwKKwkvKiAgMCAgMSAgMSAgMSAgKi8gKEVRIHwgTlMgfCBDUyB8IFZDIHwgTFQgfCBMRSB8IExTKSwKKwkvKiAgMSAgMCAgMCAgMCAgKi8gKE5FIHwgTkMgfCBDQyB8IFZTIHwgTFQgfCBMRSB8IEhJKSwKKwkvKiAgMSAgMCAgMCAgMSAgKi8gKEVRIHwgTkMgfCBDQyB8IFZTIHwgTFQgfCBMRSB8IExTKSwKKwkvKiAgMSAgMCAgMSAgMCAgKi8gKE5FIHwgTlMgfCBDQyB8IFZTIHwgR0UgfCBHVCB8IEhJKSwKKwkvKiAgMSAgMCAgMSAgMSAgKi8gKEVRIHwgTlMgfCBDQyB8IFZTIHwgR0UgfCBMRSB8IExTKSwKKwkvKiAgMSAgMSAgMCAgMCAgKi8gKE5FIHwgTkMgfCBDUyB8IFZTIHwgTFQgfCBMRSB8IExTKSwKKwkvKiAgMSAgMSAgMCAgMSAgKi8gKEVRIHwgTkMgfCBDUyB8IFZTIHwgTFQgfCBMRSB8IExTKSwKKwkvKiAgMSAgMSAgMSAgMCAgKi8gKE5FIHwgTlMgfCBDUyB8IFZTIHwgR0UgfCBHVCB8IExTKSwKKwkvKiAgMSAgMSAgMSAgMSAgKi8gKEVRIHwgTlMgfCBDUyB8IFZTIHwgR0UgfCBMRSB8IExTKSwKK307CisKKy8qCisgKiBDYWxjdWxhdGUgd2hhdCB0aGUgUEMgd2lsbCBiZSBhZnRlciBleGVjdXRpbmcgbmV4dCBpbnN0cnVjdGlvbgorICovCitzdGF0aWMgdW5zaWduZWQgZmluZF9uZXh0cGMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCAqZmxhZ3MpCit7CisJdW5zaWduZWQgc2l6ZTsKKwlzOCAgeDg7CisJczE2IHgxNjsKKwlzMzIgeDMyOworCXU4IG9wYywgKnBjLCAqc3AsICpuZXh0OworCisJbmV4dCA9IDA7CisJKmZsYWdzID0gU0lOR0xFU1RFUF9QQ1JFTDsKKworCXBjID0gKHU4ICopIHJlZ3MtPnBjOworCXNwID0gKHU4ICopIChyZWdzICsgMSk7CisJb3BjID0gKnBjOworCisJc2l6ZSA9IG1uMTAzMDBfaW5zbl9zaXplc1tvcGNdOworCWlmIChzaXplID4gMCkgeworCQluZXh0ID0gcGMgKyBzaXplOworCX0gZWxzZSB7CisJCXN3aXRjaCAob3BjKSB7CisJCQkvKiBCeHggKGQ4LFBDKSAqLworCQljYXNlIDB4YzAgLi4uIDB4Y2E6CisJCQl4OCA9IDI7CisJCQlpZiAoY29uZF90YWJsZVtyZWdzLT5lcHN3ICYgMHhmXSAmICgxIDw8IChvcGMgJiAweGYpKSkKKwkJCQl4OCA9IChzOClwY1sxXTsKKwkJCW5leHQgPSBwYyArIHg4OworCQkJKmZsYWdzIHw9IFNJTkdMRVNURVBfQlJBTkNIOworCQkJYnJlYWs7CisKKwkJCS8qIEpNUCAoZDE2LFBDKSBvciBDQUxMIChkMTYsUEMpICovCisJCWNhc2UgMHhjYzoKKwkJY2FzZSAweGNkOgorCQkJUkVBRF9XT1JEMTYocGMgKyAxLCAmeDE2KTsKKwkJCW5leHQgPSBwYyArIHgxNjsKKwkJCSpmbGFncyB8PSBTSU5HTEVTVEVQX0JSQU5DSDsKKwkJCWJyZWFrOworCisJCQkvKiBKTVAgKGQzMixQQykgb3IgQ0FMTCAoZDMyLFBDKSAqLworCQljYXNlIDB4ZGM6CisJCWNhc2UgMHhkZDoKKwkJCVJFQURfV09SRDMyKHBjICsgMSwgJngzMik7CisJCQluZXh0ID0gcGMgKyB4MzI7CisJCQkqZmxhZ3MgfD0gU0lOR0xFU1RFUF9CUkFOQ0g7CisJCQlicmVhazsKKworCQkJLyogUkVURiAqLworCQljYXNlIDB4ZGU6CisJCQluZXh0ID0gKHU4ICopcmVncy0+bWRyOworCQkJKmZsYWdzICY9IH5TSU5HTEVTVEVQX1BDUkVMOworCQkJKmZsYWdzIHw9IFNJTkdMRVNURVBfQlJBTkNIOworCQkJYnJlYWs7CisKKwkJCS8qIFJFVCAqLworCQljYXNlIDB4ZGY6CisJCQlzcCArPSBwY1syXTsKKwkJCVJFQURfV09SRDMyKHNwLCAmeDMyKTsKKwkJCW5leHQgPSAodTggKil4MzI7CisJCQkqZmxhZ3MgJj0gflNJTkdMRVNURVBfUENSRUw7CisJCQkqZmxhZ3MgfD0gU0lOR0xFU1RFUF9CUkFOQ0g7CisJCQlicmVhazsKKworCQljYXNlIDB4ZjA6CisJCQluZXh0ID0gcGMgKyAyOworCQkJb3BjID0gcGNbMV07CisJCQlpZiAob3BjID49IDB4ZjAgJiYgb3BjIDw9IDB4ZjcpIHsKKwkJCQkvKiBKTVAgKEFuKSAvIENBTExTIChBbikgKi8KKwkJCQlzd2l0Y2ggKG9wYyAmIDMpIHsKKwkJCQljYXNlIDA6CisJCQkJCW5leHQgPSAodTggKilyZWdzLT5hMDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAxOgorCQkJCQluZXh0ID0gKHU4ICopcmVncy0+YTE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMjoKKwkJCQkJbmV4dCA9ICh1OCAqKXJlZ3MtPmEyOworCQkJCQlicmVhazsKKwkJCQljYXNlIDM6CisJCQkJCW5leHQgPSAodTggKilyZWdzLT5hMzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCSpmbGFncyAmPSB+U0lOR0xFU1RFUF9QQ1JFTDsKKwkJCQkqZmxhZ3MgfD0gU0lOR0xFU1RFUF9CUkFOQ0g7CisJCQl9IGVsc2UgaWYgKG9wYyA9PSAweGZjKSB7CisJCQkJLyogUkVUUyAqLworCQkJCVJFQURfV09SRDMyKHNwLCAmeDMyKTsKKwkJCQluZXh0ID0gKHU4ICopeDMyOworCQkJCSpmbGFncyAmPSB+U0lOR0xFU1RFUF9QQ1JFTDsKKwkJCQkqZmxhZ3MgfD0gU0lOR0xFU1RFUF9CUkFOQ0g7CisJCQl9IGVsc2UgaWYgKG9wYyA9PSAweGZkKSB7CisJCQkJLyogUlRJICovCisJCQkJUkVBRF9XT1JEMzIoc3AgKyA0LCAmeDMyKTsKKwkJCQluZXh0ID0gKHU4ICopeDMyOworCQkJCSpmbGFncyAmPSB+U0lOR0xFU1RFUF9QQ1JFTDsKKwkJCQkqZmxhZ3MgfD0gU0lOR0xFU1RFUF9CUkFOQ0g7CisJCQl9CisJCQlicmVhazsKKworCQkJLyogcG90ZW50aWFsIDMtYnl0ZSBjb25kaXRpb25hbCBicmFuY2hlcyAqLworCQljYXNlIDB4Zjg6CisJCQluZXh0ID0gcGMgKyAzOworCQkJb3BjID0gcGNbMV07CisJCQlpZiAob3BjID49IDB4ZTggJiYgb3BjIDw9IDB4ZWIgJiYKKwkJCSAgICAoY29uZF90YWJsZVtyZWdzLT5lcHN3ICYgMHhmXSAmCisJCQkgICAgICgxIDw8ICgob3BjICYgMHhmKSArIDMpKSkKKwkJCSAgICApIHsKKwkJCQlSRUFEX0JZVEUocGMrMiwgJng4KTsKKwkJCQluZXh0ID0gcGMgKyB4ODsKKwkJCQkqZmxhZ3MgfD0gU0lOR0xFU1RFUF9CUkFOQ0g7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDB4ZmE6CisJCQlpZiAocGNbMV0gPT0gMHhmZikgeworCQkJCS8qIENBTExTIChkMTYsUEMpICovCisJCQkJUkVBRF9XT1JEMTYocGMgKyAyLCAmeDE2KTsKKwkJCQluZXh0ID0gcGMgKyB4MTY7CisJCQl9IGVsc2UKKwkJCQluZXh0ID0gcGMgKyA0OworCQkJKmZsYWdzIHw9IFNJTkdMRVNURVBfQlJBTkNIOworCQkJYnJlYWs7CisKKwkJY2FzZSAweGZjOgorCQkJeDMyID0gNjsKKwkJCWlmIChwY1sxXSA9PSAweGZmKSB7CisJCQkJLyogQ0FMTFMgKGQzMixQQykgKi8KKwkJCQlSRUFEX1dPUkQzMihwYyArIDIsICZ4MzIpOworCQkJfQorCQkJbmV4dCA9IHBjICsgeDMyOworCQkJKmZsYWdzIHw9IFNJTkdMRVNURVBfQlJBTkNIOworCQkJYnJlYWs7CisJCQkvKiBMWFggKGQ4LFBDKSAqLworCQkJLyogU0VUTEIgLSBsb2FkcyB0aGUgbmV4dCBmb3VyIGJ5dGVzIGludG8gdGhlIExJUiByZWcgKi8KKwkJY2FzZSAweGQwIC4uLiAweGRhOgorCQljYXNlIDB4ZGI6CisJCQlwYW5pYygiQ2FuJ3Qgc2luZ2xlc3RlcCBMeHgvU0VUTEJcbiIpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuICh1bnNpZ25lZCluZXh0OworCit9CisKKy8qCisgKiBzZXQgdXAgb3V0IG9mIHBsYWNlIHNpbmdsZXN0ZXAgb2Ygc29tZSBicmFuY2hpbmcgaW5zdHJ1Y3Rpb25zCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBfX2twcm9iZXMgc2luZ2xlc3RlcF9icmFuY2hfc2V0dXAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdTggb3BjLCAqcGMsICpzcCwgKm5leHQ7CisKKwluZXh0ID0gTlVMTDsKKwlwYyA9ICh1OCAqKSByZWdzLT5wYzsKKwlzcCA9ICh1OCAqKSAocmVncyArIDEpOworCisJc3dpdGNoIChwY1swXSkgeworCWNhc2UgMHhjMCAuLi4gMHhjYToJLyogQnh4IChkOCxQQykgKi8KKwljYXNlIDB4Y2M6CQkvKiBKTVAgKGQxNixQQykgKi8KKwljYXNlIDB4ZGM6CQkvKiBKTVAgKGQzMixQQykgKi8KKwljYXNlIDB4Zjg6ICAgICAgICAgICAgICAvKiBCeHggKGQ4LFBDKSAgMy1ieXRlIHZlcnNpb24gKi8KKwkJLyogZG9uJ3QgcmVhbGx5IG5lZWQgdG8gZG8gYW55dGhpbmcgZXhjZXB0IGNhdXNlIHRyYXAgICovCisJCW5leHQgPSBwYzsKKwkJYnJlYWs7CisKKwljYXNlIDB4Y2Q6CQkvKiBDQUxMIChkMTYsUEMpICovCisJCXBjWzFdID0gNTsKKwkJcGNbMl0gPSAwOworCQluZXh0ID0gcGMgKyA1OworCQlicmVhazsKKworCWNhc2UgMHhkZDoJCS8qIENBTEwgKGQzMixQQykgKi8KKwkJcGNbMV0gPSA3OworCQlwY1syXSA9IDA7CisJCXBjWzNdID0gMDsKKwkJcGNbNF0gPSAwOworCQluZXh0ID0gcGMgKyA3OworCQlicmVhazsKKworCWNhc2UgMHhkZToJCS8qIFJFVEYgKi8KKwkJbmV4dCA9IHBjICsgMzsKKwkJcmVncy0+bWRyID0gKHVuc2lnbmVkKSBuZXh0OworCQlicmVhazsKKworCWNhc2UgMHhkZjoJCS8qIFJFVCAqLworCQlzcCArPSBwY1syXTsKKwkJbmV4dCA9IHBjICsgMzsKKwkJKih1bnNpZ25lZCAqKXNwID0gKHVuc2lnbmVkKSBuZXh0OworCQlicmVhazsKKworCWNhc2UgMHhmMDoKKwkJbmV4dCA9IHBjICsgMjsKKwkJb3BjID0gcGNbMV07CisJCWlmIChvcGMgPj0gMHhmMCAmJiBvcGMgPD0gMHhmMykgeworCQkJLyogQ0FMTFMgKEFuKSAqLworCQkJLyogdXNlIENBTExTIChkMTYsUEMpIHRvIGF2b2lkIG11Y2tpbmcgd2l0aCBBbiAqLworCQkJcGNbMF0gPSAweGZhOworCQkJcGNbMV0gPSAweGZmOworCQkJcGNbMl0gPSA0OworCQkJcGNbM10gPSAwOworCQkJbmV4dCA9IHBjICsgNDsKKwkJfSBlbHNlIGlmIChvcGMgPj0gMHhmNCAmJiBvcGMgPD0gMHhmNykgeworCQkJLyogSk1QIChBbikgKi8KKwkJCW5leHQgPSBwYzsKKwkJfSBlbHNlIGlmIChvcGMgPT0gMHhmYykgeworCQkJLyogUkVUUyAqLworCQkJbmV4dCA9IHBjICsgMjsKKwkJCSoodW5zaWduZWQgKikgc3AgPSAodW5zaWduZWQpIG5leHQ7CisJCX0gZWxzZSBpZiAob3BjID09IDB4ZmQpIHsKKwkJCS8qIFJUSSAqLworCQkJbmV4dCA9IHBjICsgMjsKKwkJCSoodW5zaWduZWQgKikoc3AgKyA0KSA9ICh1bnNpZ25lZCkgbmV4dDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgMHhmYToJLyogQ0FMTFMgKGQxNixQQykgKi8KKwkJcGNbMl0gPSA0OworCQlwY1szXSA9IDA7CisJCW5leHQgPSBwYyArIDQ7CisJCWJyZWFrOworCisJY2FzZSAweGZjOgkvKiBDQUxMUyAoZDMyLFBDKSAqLworCQlwY1syXSA9IDY7CisJCXBjWzNdID0gMDsKKwkJcGNbNF0gPSAwOworCQlwY1s1XSA9IDA7CisJCW5leHQgPSBwYyArIDY7CisJCWJyZWFrOworCisJY2FzZSAweGQwIC4uLiAweGRhOgkvKiBMWFggKGQ4LFBDKSAqLworCWNhc2UgMHhkYjoJCS8qIFNFVExCICovCisJCXBhbmljKCJDYW4ndCBzaW5nbGVzdGVwIEx4eC9TRVRMQlxuIik7CisJfQorCisJcmV0dXJuICh1bnNpZ25lZCkgbmV4dDsKK30KKworaW50IF9fa3Byb2JlcyBhcmNoX3ByZXBhcmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19rcHJvYmVzIGFyY2hfY29weV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3sKKwltZW1jcHkocC0+YWluc24uaW5zbiwgcC0+YWRkciwgTUFYX0lOU05fU0laRSk7Cit9CisKK3ZvaWQgX19rcHJvYmVzIGFyY2hfYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQoreworCSpwLT5hZGRyID0gQlJFQUtQT0lOVF9JTlNUUlVDVElPTjsKKwlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpIHAtPmFkZHIsCisJCQkgICAodW5zaWduZWQgbG9uZykgcC0+YWRkciArIHNpemVvZihrcHJvYmVfb3Bjb2RlX3QpKTsKK30KKwordm9pZCBfX2twcm9iZXMgYXJjaF9kaXNhcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCit7CisJbW4xMDMwMF9kY2FjaGVfZmx1c2goKTsKKwltbjEwMzAwX2ljYWNoZV9pbnYoKTsKK30KKwordm9pZCBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKK3sKK30KKworc3RhdGljIGlubGluZQordm9pZCBfX2twcm9iZXMgZGlzYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwkqcC0+YWRkciA9IHAtPm9wY29kZTsKKwlyZWdzLT5wYyA9ICh1bnNpZ25lZCBsb25nKSBwLT5hZGRyOworCW1uMTAzMDBfZGNhY2hlX2ZsdXNoKCk7CisJbW4xMDMwMF9pY2FjaGVfaW52KCk7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgX19rcHJvYmVzIHByZXBhcmVfc2luZ2xlc3RlcChzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIG5leHRwYzsKKworCWN1cnJlbnRfa3Byb2JlX29yaWdfcGMgPSByZWdzLT5wYzsKKwltZW1jcHkoY3VycmVudF9rcHJvYmVfc3NfYnVmLCAmcC0+YWluc24uaW5zblswXSwgTUFYX0lOU05fU0laRSk7CisJcmVncy0+cGMgPSAodW5zaWduZWQgbG9uZykgY3VycmVudF9rcHJvYmVfc3NfYnVmOworCisJbmV4dHBjID0gZmluZF9uZXh0cGMocmVncywgJmN1cnJlbnRfa3Byb2JlX3NzX2ZsYWdzKTsKKwlpZiAoY3VycmVudF9rcHJvYmVfc3NfZmxhZ3MgJiBTSU5HTEVTVEVQX1BDUkVMKQorCQljdXJyZW50X2twcm9iZV9uZXh0X3BjID0KKwkJCWN1cnJlbnRfa3Byb2JlX29yaWdfcGMgKyAobmV4dHBjIC0gcmVncy0+cGMpOworCWVsc2UKKwkJY3VycmVudF9rcHJvYmVfbmV4dF9wYyA9IG5leHRwYzsKKworCS8qIGJyYW5jaGluZyBpbnN0cnVjdGlvbnMgbmVlZCBzcGVjaWFsIGhhbmRsaW5nICovCisJaWYgKGN1cnJlbnRfa3Byb2JlX3NzX2ZsYWdzICYgU0lOR0xFU1RFUF9CUkFOQ0gpCisJCW5leHRwYyA9IHNpbmdsZXN0ZXBfYnJhbmNoX3NldHVwKHJlZ3MpOworCisJY3VycmVudF9rcHJvYmVfYnBfYWRkciA9IG5leHRwYzsKKworCSoodTggKikgbmV4dHBjID0gQlJFQUtQT0lOVF9JTlNUUlVDVElPTjsKKwltbjEwMzAwX2RjYWNoZV9mbHVzaF9yYW5nZTIoKHVuc2lnbmVkKSBjdXJyZW50X2twcm9iZV9zc19idWYsCisJCQkJICAgIHNpemVvZihjdXJyZW50X2twcm9iZV9zc19idWYpKTsKKwltbjEwMzAwX2ljYWNoZV9pbnYoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19rcHJvYmVzIGtwcm9iZV9oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBrcHJvYmUgKnA7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50ICphZGRyID0gKHVuc2lnbmVkIGludCAqKSByZWdzLT5wYzsKKworCS8qIFdlJ3JlIGluIGFuIGludGVycnVwdCwgYnV0IHRoaXMgaXMgY2xlYXIgYW5kIEJVRygpLXNhZmUuICovCisJcHJlZW1wdF9kaXNhYmxlKCk7CisKKwkvKiBDaGVjayB3ZSdyZSBub3QgYWN0dWFsbHkgcmVjdXJzaW5nICovCisJaWYgKGtwcm9iZV9ydW5uaW5nKCkpIHsKKwkJLyogV2UgKmFyZSogaG9sZGluZyBsb2NrIGhlcmUsIHNvIHRoaXMgaXMgc2FmZS4KKwkJICAgRGlzYXJtIHRoZSBwcm9iZSB3ZSBqdXN0IGhpdCwgYW5kIGlnbm9yZSBpdC4gKi8KKwkJcCA9IGdldF9rcHJvYmUoYWRkcik7CisJCWlmIChwKSB7CisJCQlkaXNhcm1fa3Byb2JlKHAsIHJlZ3MpOworCQkJcmV0ID0gMTsKKwkJfSBlbHNlIHsKKwkJCXAgPSBjdXJyZW50X2twcm9iZTsKKwkJCWlmIChwLT5icmVha19oYW5kbGVyICYmIHAtPmJyZWFrX2hhbmRsZXIocCwgcmVncykpCisJCQkJZ290byBzc19wcm9iZTsKKwkJfQorCQkvKiBJZiBpdCdzIG5vdCBvdXJzLCBjYW4ndCBiZSBkZWxldGUgcmFjZSwgKHdlIGhvbGQgbG9jaykuICovCisJCWdvdG8gbm9fa3Byb2JlOworCX0KKworCXAgPSBnZXRfa3Byb2JlKGFkZHIpOworCWlmICghcCkgeworCQlpZiAoKmFkZHIgIT0gQlJFQUtQT0lOVF9JTlNUUlVDVElPTikgeworCQkJLyogVGhlIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gd2FzIHJlbW92ZWQgcmlnaHQgYWZ0ZXIKKwkJCSAqIHdlIGhpdCBpdC4gIEFub3RoZXIgY3B1IGhhcyByZW1vdmVkIGVpdGhlciBhCisJCQkgKiBwcm9iZXBvaW50IG9yIGEgZGVidWdnZXIgYnJlYWtwb2ludCBhdCB0aGlzIGFkZHJlc3MuCisJCQkgKiBJbiBlaXRoZXIgY2FzZSwgbm8gZnVydGhlciBoYW5kbGluZyBvZiB0aGlzCisJCQkgKiBpbnRlcnJ1cHQgaXMgYXBwcm9wcmlhdGUuCisJCQkgKi8KKwkJCXJldCA9IDE7CisJCX0KKwkJLyogTm90IG9uZSBvZiBvdXJzOiBsZXQga2VybmVsIGhhbmRsZSBpdCAqLworCQlnb3RvIG5vX2twcm9iZTsKKwl9CisKKwlrcHJvYmVfc3RhdHVzID0gS1BST0JFX0hJVF9BQ1RJVkU7CisJY3VycmVudF9rcHJvYmUgPSBwOworCWlmIChwLT5wcmVfaGFuZGxlcihwLCByZWdzKSkgeworCQkvKiBoYW5kbGVyIGhhcyBhbHJlYWR5IHNldCB0aGluZ3MgdXAsIHNvIHNraXAgc3Mgc2V0dXAgKi8KKwkJcmV0dXJuIDE7CisJfQorCitzc19wcm9iZToKKwlwcmVwYXJlX3NpbmdsZXN0ZXAocCwgcmVncyk7CisJa3Byb2JlX3N0YXR1cyA9IEtQUk9CRV9ISVRfU1M7CisJcmV0dXJuIDE7CisKK25vX2twcm9iZToKKwlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIENhbGxlZCBhZnRlciBzaW5nbGUtc3RlcHBpbmcuICBwLT5hZGRyIGlzIHRoZSBhZGRyZXNzIG9mIHRoZQorICogaW5zdHJ1Y3Rpb24gd2hvc2UgZmlyc3QgYnl0ZSBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgImJyZWFrcG9pbnQiCisgKiBpbnN0cnVjdGlvbi4gIFRvIGF2b2lkIHRoZSBTTVAgcHJvYmxlbXMgdGhhdCBjYW4gb2NjdXIgd2hlbiB3ZQorICogdGVtcG9yYXJpbHkgcHV0IGJhY2sgdGhlIG9yaWdpbmFsIG9wY29kZSB0byBzaW5nbGUtc3RlcCwgd2UKKyAqIHNpbmdsZS1zdGVwcGVkIGEgY29weSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgYWRkcmVzcyBvZiB0aGlzCisgKiBjb3B5IGlzIHAtPmFpbnNuLmluc24uCisgKi8KK3N0YXRpYyB2b2lkIF9fa3Byb2JlcyByZXN1bWVfZXhlY3V0aW9uKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qIHdlIG1heSBuZWVkIHRvIGZpeHVwIHJlZ3Mvc3RhY2sgYWZ0ZXIgc2luZ2xlc3RlcHBpbmcgYSBjYWxsIGluc24gKi8KKwlpZiAoY3VycmVudF9rcHJvYmVfc3NfZmxhZ3MgJiBTSU5HTEVTVEVQX0JSQU5DSCkgeworCQlyZWdzLT5wYyA9IGN1cnJlbnRfa3Byb2JlX29yaWdfcGM7CisJCXN3aXRjaCAocC0+YWluc24uaW5zblswXSkgeworCQljYXNlIDB4Y2Q6CS8qIENBTEwgKGQxNixQQykgKi8KKwkJCSoodW5zaWduZWQgKikgcmVncy0+c3AgPSByZWdzLT5tZHIgPSByZWdzLT5wYyArIDU7CisJCQlicmVhazsKKwkJY2FzZSAweGRkOgkvKiBDQUxMIChkMzIsUEMpICovCisJCQkvKiBmaXh1cCBtZHIgYW5kIHJldHVybiBhZGRyZXNzIG9uIHN0YWNrICovCisJCQkqKHVuc2lnbmVkICopIHJlZ3MtPnNwID0gcmVncy0+bWRyID0gcmVncy0+cGMgKyA3OworCQkJYnJlYWs7CisJCWNhc2UgMHhmMDoKKwkJCWlmIChwLT5haW5zbi5pbnNuWzFdID49IDB4ZjAgJiYKKwkJCSAgICBwLT5haW5zbi5pbnNuWzFdIDw9IDB4ZjMpIHsKKwkJCQkvKiBDQUxMUyAoQW4pICovCisJCQkJLyogZml4dXAgTURSIGFuZCByZXR1cm4gYWRkcmVzcyBvbiBzdGFjayAqLworCQkJCXJlZ3MtPm1kciA9IHJlZ3MtPnBjICsgMjsKKwkJCQkqKHVuc2lnbmVkICopIHJlZ3MtPnNwID0gcmVncy0+bWRyOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAweGZhOgkvKiBDQUxMUyAoZDE2LFBDKSAqLworCQkJLyogZml4dXAgTURSIGFuZCByZXR1cm4gYWRkcmVzcyBvbiBzdGFjayAqLworCQkJKih1bnNpZ25lZCAqKSByZWdzLT5zcCA9IHJlZ3MtPm1kciA9IHJlZ3MtPnBjICsgNDsKKwkJCWJyZWFrOworCisJCWNhc2UgMHhmYzoJLyogQ0FMTFMgKGQzMixQQykgKi8KKwkJCS8qIGZpeHVwIE1EUiBhbmQgcmV0dXJuIGFkZHJlc3Mgb24gc3RhY2sgKi8KKwkJCSoodW5zaWduZWQgKikgcmVncy0+c3AgPSByZWdzLT5tZHIgPSByZWdzLT5wYyArIDY7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJlZ3MtPnBjID0gY3VycmVudF9rcHJvYmVfbmV4dF9wYzsKKwljdXJyZW50X2twcm9iZV9icF9hZGRyID0gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19rcHJvYmVzIHBvc3Rfa3Byb2JlX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKCFrcHJvYmVfcnVubmluZygpKQorCQlyZXR1cm4gMDsKKworCWlmIChjdXJyZW50X2twcm9iZS0+cG9zdF9oYW5kbGVyKQorCQljdXJyZW50X2twcm9iZS0+cG9zdF9oYW5kbGVyKGN1cnJlbnRfa3Byb2JlLCByZWdzLCAwKTsKKworCXJlc3VtZV9leGVjdXRpb24oY3VycmVudF9rcHJvYmUsIHJlZ3MpOworCXJlc2V0X2N1cnJlbnRfa3Byb2JlKCk7CisJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOworCXJldHVybiAxOworfQorCisvKiBJbnRlcnJ1cHRzIGRpc2FibGVkLCBrcHJvYmVfbG9jayBoZWxkLiAqLworc3RhdGljIGlubGluZQoraW50IF9fa3Byb2JlcyBrcHJvYmVfZmF1bHRfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHRyYXBucikKK3sKKwlpZiAoY3VycmVudF9rcHJvYmUtPmZhdWx0X2hhbmRsZXIgJiYKKwkgICAgY3VycmVudF9rcHJvYmUtPmZhdWx0X2hhbmRsZXIoY3VycmVudF9rcHJvYmUsIHJlZ3MsIHRyYXBucikpCisJCXJldHVybiAxOworCisJaWYgKGtwcm9iZV9zdGF0dXMgJiBLUFJPQkVfSElUX1NTKSB7CisJCXJlc3VtZV9leGVjdXRpb24oY3VycmVudF9rcHJvYmUsIHJlZ3MpOworCQlyZXNldF9jdXJyZW50X2twcm9iZSgpOworCQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogV3JhcHBlciByb3V0aW5lIHRvIGZvciBoYW5kbGluZyBleGNlcHRpb25zLgorICovCitpbnQgX19rcHJvYmVzIGtwcm9iZV9leGNlcHRpb25zX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBkaWVfYXJncyAqYXJncyA9IGRhdGE7CisKKwlzd2l0Y2ggKHZhbCkgeworCWNhc2UgRElFX0JSRUFLUE9JTlQ6CisJCWlmIChjdXJyZW50X2twcm9iZV9icF9hZGRyICE9IGFyZ3MtPnJlZ3MtPnBjKSB7CisJCQlpZiAoa3Byb2JlX2hhbmRsZXIoYXJncy0+cmVncykpCisJCQkJcmV0dXJuIE5PVElGWV9TVE9QOworCQl9IGVsc2UgeworCQkJaWYgKHBvc3Rfa3Byb2JlX2hhbmRsZXIoYXJncy0+cmVncykpCisJCQkJcmV0dXJuIE5PVElGWV9TVE9QOworCQl9CisJCWJyZWFrOworCWNhc2UgRElFX0dQRjoKKwkJaWYgKGtwcm9iZV9ydW5uaW5nKCkgJiYKKwkJICAgIGtwcm9iZV9mYXVsdF9oYW5kbGVyKGFyZ3MtPnJlZ3MsIGFyZ3MtPnRyYXBucikpCisJCQlyZXR1cm4gTk9USUZZX1NUT1A7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKy8qIEpwcm9iZXMgc3VwcG9ydC4gICovCitzdGF0aWMgc3RydWN0IHB0X3JlZ3MganByb2JlX3NhdmVkX3JlZ3M7CitzdGF0aWMgc3RydWN0IHB0X3JlZ3MgKmpwcm9iZV9zYXZlZF9yZWdzX2xvY2F0aW9uOworc3RhdGljIGtwcm9iZV9vcGNvZGVfdCBqcHJvYmVfc2F2ZWRfc3RhY2tbTUFYX1NUQUNLX1NJWkVdOworCitpbnQgX19rcHJvYmVzIHNldGptcF9wcmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QganByb2JlICpqcCA9IGNvbnRhaW5lcl9vZihwLCBzdHJ1Y3QganByb2JlLCBrcCk7CisKKwlqcHJvYmVfc2F2ZWRfcmVnc19sb2NhdGlvbiA9IHJlZ3M7CisJbWVtY3B5KCZqcHJvYmVfc2F2ZWRfcmVncywgcmVncywgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7CisKKwkvKiBTYXZlIGEgd2hvbGUgc3RhY2sgZnJhbWUsIHRoaXMgZ2V0cyBhcmd1bWVudHMKKwkgKiBwdXNoZWQgb250byB0aGUgc3RhY2sgYWZ0ZXIgdXNpbmcgdXAgYWxsIHRoZQorCSAqIGFyZyByZWdpc3RlcnMuCisJICovCisJbWVtY3B5KCZqcHJvYmVfc2F2ZWRfc3RhY2ssIHJlZ3MgKyAxLCBzaXplb2YoanByb2JlX3NhdmVkX3N0YWNrKSk7CisKKwkvKiBzZXR1cCByZXR1cm4gYWRkciB0byB0aGUganByb2JlIGhhbmRsZXIgcm91dGluZSAqLworCXJlZ3MtPnBjID0gKHVuc2lnbmVkIGxvbmcpIGpwLT5lbnRyeTsKKwlyZXR1cm4gMTsKK30KKwordm9pZCBfX2twcm9iZXMganByb2JlX3JldHVybih2b2lkKQoreworCXZvaWQgKm9yaWdfc3AgPSBqcHJvYmVfc2F2ZWRfcmVnc19sb2NhdGlvbiArIDE7CisKKwlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CisJYXNtIHZvbGF0aWxlKCIJCW1vdgklMCxzcFxuIgorCQkgICAgICIuZ2xvYmwJanByb2JlX3JldHVybl9icF9hZGRyXG4iCisJCSAgICAgImpwcm9iZV9yZXR1cm5fYnBfYWRkcjpcblx0IgorCQkgICAgICIJCS5ieXRlCTB4ZmZcbiIKKwkJICAgICA6IDogImQiIChvcmlnX3NwKSk7Cit9CisKK2V4dGVybiB2b2lkIGpwcm9iZV9yZXR1cm5fYnBfYWRkcih2b2lkKTsKKworaW50IF9fa3Byb2JlcyBsb25nam1wX2JyZWFrX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdTggKmFkZHIgPSAodTggKikgcmVncy0+cGM7CisKKwlpZiAoYWRkciA9PSAodTggKikganByb2JlX3JldHVybl9icF9hZGRyKSB7CisJCWlmIChqcHJvYmVfc2F2ZWRfcmVnc19sb2NhdGlvbiAhPSByZWdzKSB7CisJCQlwcmludGsoS0VSTl9FUlIiSlBST0JFOiIKKwkJCSAgICAgICAiIEN1cnJlbnQgcmVncyAoJXApIGRvZXMgbm90IG1hdGNoIHNhdmVkIHJlZ3MiCisJCQkgICAgICAgIiAoJXApLlxuIiwKKwkJCSAgICAgICByZWdzLCBqcHJvYmVfc2F2ZWRfcmVnc19sb2NhdGlvbik7CisJCQlCVUcoKTsKKwkJfQorCisJCS8qIFJlc3RvcmUgb2xkIHJlZ2lzdGVyIHN0YXRlLgorCQkgKi8KKwkJbWVtY3B5KHJlZ3MsICZqcHJvYmVfc2F2ZWRfcmVncywgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7CisKKwkJbWVtY3B5KHJlZ3MgKyAxLCAmanByb2JlX3NhdmVkX3N0YWNrLAorCQkgICAgICAgc2l6ZW9mKGpwcm9iZV9zYXZlZF9zdGFjaykpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBfX2luaXQgYXJjaF9pbml0X2twcm9iZXModm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9rZXJuZWwva3RocmVhZC5TIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9rdGhyZWFkLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhZTQ2NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwva3RocmVhZC5TCkBAIC0wLDAgKzEsMzEgQEAKKy8qIE1OMTAzMDAgS2VybmVsIHRocmVhZCB0cmFtcG9saW5lIGZ1bmN0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgTWFyayBTYWx0ZXIgKG1zYWx0ZXJAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisJLnRleHQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBrZXJuZWxfdGhyZWFkX2hlbHBlciAtIHRyYW1wb2xpbmUgZm9yIGtlcm5lbF90aHJlYWQoKQorIworIyBPbiBlbnRyeToKKyMgICBBMiA9IGFkZHJlc3Mgb2YgZnVuY3Rpb24gdG8gY2FsbAorIyAgIEQyID0gZnVuY3Rpb24gYXJndW1lbnQKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkuZ2xvYmwJa2VybmVsX3RocmVhZF9oZWxwZXIKKwkudHlwZQlrZXJuZWxfdGhyZWFkX2hlbHBlcixAZnVuY3Rpb24KK2tlcm5lbF90aHJlYWRfaGVscGVyOgorCW1vdglkb19leGl0LGQxCisJbW92CWQxLChzcCkKKwltb3YJZDEsbWRyCisJbW92CWQyLGQwCisJam1wCShhMikKKworCS5zaXplCWtlcm5lbF90aHJlYWRfaGVscGVyLC4ta2VybmVsX3RocmVhZF9oZWxwZXIKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvbW4xMDMwMC1kZWJ1Zy5jIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9tbjEwMzAwLWRlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ4MTk2NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvbW4xMDMwMC1kZWJ1Zy5jCkBAIC0wLDAgKzEsNTggQEAKKy8qIERlYnVnZ2luZyBzdHVmZiBmb3IgdGhlIE1OMTAzMDAtYmFzZWQgcHJvY2Vzc29ycworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8YXNtL3NlcmlhbC1yZWdzLmg+CisKKyN1bmRlZiBNTjEwMzAwX0NPTlNPTEVfT05fU0VSSU8KKworLyoKKyAqIHdyaXRlIGEgc3RyaW5nIGRpcmVjdGx5IHRocm91Z2ggb25lIG9mIHRoZSBzZXJpYWwgcG9ydHMgb24tYm9hcmQgdGhlIE1OMTAzMDAKKyAqLworI2lmZGVmIE1OMTAzMDBfQ09OU09MRV9PTl9TRVJJTwordm9pZCBkZWJ1Z190b19zZXJpYWxfbW5zZXIoY29uc3QgY2hhciAqcCwgaW50IG4pCit7CisJY2hhciBjaDsKKworCWZvciAoOyBuID4gMDsgbi0tKSB7CisJCWNoID0gKnArKzsKKworI2lmIE1OMTAzMDBfQ09OU09MRV9PTl9TRVJJTyA9PSAwCisJCXdoaWxlIChTQzBTVFIgJiAoU0MwMVNUUl9UQkYpKSBjb250aW51ZTsKKwkJU0MwVFhCID0gY2g7CisJCXdoaWxlIChTQzBTVFIgJiAoU0MwMVNUUl9UQkYpKSBjb250aW51ZTsKKwkJaWYgKGNoID09IDB4MGEpIHsKKwkJCVNDMFRYQiA9IDB4MGQ7CisJCQl3aGlsZSAoU0MwU1RSICYgKFNDMDFTVFJfVEJGKSkgY29udGludWU7CisJCX0KKworI2VsaWYgTU4xMDMwMF9DT05TT0xFX09OX1NFUklPID09IDEKKwkJd2hpbGUgKFNDMVNUUiAmIChTQzAxU1RSX1RCRikpIGNvbnRpbnVlOworCQlTQzFUWEIgPSBjaDsKKwkJd2hpbGUgKFNDMVNUUiAmIChTQzAxU1RSX1RCRikpIGNvbnRpbnVlOworCQlpZiAoY2ggPT0gMHgwYSkgeworCQkJU0MxVFhCID0gMHgwZDsKKwkJCXdoaWxlIChTQzFTVFIgJiAoU0MwMVNUUl9UQkYpKSBjb250aW51ZTsKKwkJfQorCisjZWxpZiBNTjEwMzAwX0NPTlNPTEVfT05fU0VSSU8gPT0gMgorCQl3aGlsZSAoU0MyU1RSICYgKFNDMlNUUl9UQkYpKSBjb250aW51ZTsKKwkJU0MyVFhCID0gY2g7CisJCXdoaWxlIChTQzJTVFIgJiAoU0MyU1RSX1RCRikpIGNvbnRpbnVlOworCQlpZiAoY2ggPT0gMHgwYSkgeworCQkJU0MyVFhCID0gMHgwZDsKKwkJCXdoaWxlIChTQzJTVFIgJiAoU0MyU1RSX1RCRikpIGNvbnRpbnVlOworCQl9CisKKyNlbmRpZgorCX0KK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL21uMTAzMDAtc2VyaWFsLWxvdy5TIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9tbjEwMzAwLXNlcmlhbC1sb3cuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjNmNGMxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9tbjEwMzAwLXNlcmlhbC1sb3cuUwpAQCAtMCwwICsxLDE5MSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBWaXJ0dWFsIERNQSBkcml2ZXIgZm9yIE1OMTAzMDAgc2VyaWFsIHBvcnRzCisjCisjIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyMgMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyNpbmNsdWRlIDxsaW51eC9zeXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL2NwdS1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL2ZyYW1lLmluYz4KKyNpbmNsdWRlIDxhc20vdGltZXItcmVncy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL3VuaXQvdGltZXguaD4KKyNpbmNsdWRlICJtbjEwMzAwLXNlcmlhbC5oIgorCisjZGVmaW5lCVNDeENUUgkweDAwCisjZGVmaW5lCVNDeElDUgkweDA0CisjZGVmaW5lCVNDeFRYQgkweDA4CisjZGVmaW5lCVNDeFJYQgkweDA5CisjZGVmaW5lCVNDeFNUUgkweDBjCisjZGVmaW5lCVNDeFRJTQkweDBkCisKKwkudGV4dAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNlcmlhbCBwb3J0IGludGVycnVwdCB2aXJ0dWFsIERNQSBlbnRyeSBwb2ludAorIyAtIGludGVuZGVkIHRvIHJ1biBhdCBpbnRlcnJ1cHQgcHJpb3JpdHkgMSAobm90IGFmZmVjdGVkIGJ5IGxvY2FsX2lycV9kaXNhYmxlKQorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCS5iYWxpZ24JTDFfQ0FDSEVfQllURVMKK0VOVFJZKG1uMTAzMDBfc2VyaWFsX3ZkbWFfaW50ZXJydXB0KQorCW9yCUVQU1dfSUUscHN3CQkJIyBwZXJtaXQgb3ZlcnJpZGluZyBieQorCQkJCQkJIyBkZWJ1Z2dpbmcgaW50ZXJydXB0cworCW1vdm0JW2QyLGQzLGEyLGEzLGV4cmVnMF0sKHNwKQorCisJbW92aHUJKElBR1IpLGEyCQkJIyBzZWUgaWYgd2hpY2ggaW50ZXJydXB0IGlzCisJCQkJCQkjIHBlbmRpbmcKKwlhbmQJSUFHUl9HTixhMgorCWFkZAlhMixhMgorCWFkZAltbjEwMzAwX3NlcmlhbF9pbnRfdGJsLGEyCisKKwltb3YJKGEyKyksYTMKKwltb3YJKF9faW9iYXNlLGEzKSxlMgorCW1vdgkoYTIpLGEyCisJam1wCShhMikKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXJpYWwgcG9ydCByZWNlaXZlIGludGVycnVwdCB2aXJ0dWFsIERNQSBlbnRyeSBwb2ludAorIyAtIGludGVuZGVkIHRvIHJ1biBhdCBpbnRlcnJ1cHQgcHJpb3JpdHkgMSAobm90IGFmZmVjdGVkIGJ5IGxvY2FsX2lycV9kaXNhYmxlKQorIyAtIHN0b3JlcyBkYXRhL3N0YXR1cyBieXRlIHBhaXJzIGluIHRoZSByaW5nIGJ1ZmZlcgorIyAtIGluZHVjZXMgYSBzY2hlZHVsZXIgdGljayB0aW1lciBpbnRlcnJ1cHQgd2hlbiBkb25lLCB3aGljaCB3ZSB0aGVuIHN1YnZlcnQKKyMgb24gZW50cnk6CisjCUEzCXN0cnVjdCBtbjEwMzAwX3NlcmlhbF9wb3J0ICoKKyMJRTIJSS9PIHBvcnQgYmFzZQorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworRU5UUlkobW4xMDMwMF9zZXJpYWxfdmRtYV9yeF9oYW5kbGVyKQorCW1vdgkoX19yeF9pY3IsYTMpLGUzCisJbW92CUd4SUNSX0RFVEVDVCxkMgorCW1vdmJ1CWQyLChlMykJCQkJIyBBQ0sgdGhlIGludGVycnVwdAorCW1vdmh1CShlMyksZDIJCQkJIyBmbHVzaAorCisJbW92CShfX3J4X2lucCxhMyksZDMKKwltb3YJZDMsYTIKKwlhZGQJMixkMworCWFuZAlNTlNDX0JVRkZFUl9TSVpFLTEsZDMKKwltb3YJKF9fcnhfb3V0cCxhMyksZDIKKwljbXAJZDMsZDIKKwliZXEJbW5zY192ZG1hX3J4X292ZXJmbG93CisKKwltb3YJKF9fcnhfYnVmZmVyLGEzKSxkMgorCWFkZAlkMixhMgorCW1vdmh1CShTQ3hTVFIsZTIpLGQyCisJbW92YnUJZDIsKDEsYTIpCisJbW92YnUJKFNDeFJYQixlMiksZDIKKwltb3ZidQlkMiwoYTIpCisJbW92CWQzLChfX3J4X2lucCxhMykKKwlic2V0CU1OU0N4X1JYX0FWQUlMLChfX2ludHJfZmxhZ3MsYTMpCisKK21uc2NfdmRtYV9yeF9kb25lOgorCW1vdgkoX190bV9pY3IsYTMpLGEyCisJbW92CUd4SUNSX0xFVkVMXzZ8R3hJQ1JfRU5BQkxFfEd4SUNSX1JFUVVFU1R8R3hJQ1JfREVURUNULGQyCisJbW92aHUJZDIsKGEyKQkJCQkjIHJlcXVlc3QgYSBzbG93IGludGVycnVwdAorCW1vdmh1CShhMiksZDIJCQkJIyBmbHVzaAorCisJbW92bQkoc3ApLFtkMixkMyxhMixhMyxleHJlZzBdCisJcnRpCisKK21uc2NfdmRtYV9yeF9vdmVyZmxvdzoKKwlic2V0CU1OU0N4X1JYX09WRVJGLChfX2ludHJfZmxhZ3MsYTMpCisJYnJhCW1uc2NfdmRtYV9yeF9kb25lCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2VyaWFsIHBvcnQgdHJhbnNtaXQgaW50ZXJydXB0IHZpcnR1YWwgRE1BIGVudHJ5IHBvaW50CisjIC0gaW50ZW5kZWQgdG8gcnVuIGF0IGludGVycnVwdCBwcmlvcml0eSAxIChub3QgYWZmZWN0ZWQgYnkgbG9jYWxfaXJxX2Rpc2FibGUpCisjIC0gcmV0cmlldmVzIGRhdGEgYnl0ZXMgZnJvbSB0aGUgcmluZyBidWZmZXIgYW5kIHBhc3NlcyB0aGVtIHRvIHRoZSBzZXJpYWwgcG9ydAorIyAtIGluZHVjZXMgYSBzY2hlZHVsZXIgdGljayB0aW1lciBpbnRlcnJ1cHQgd2hlbiBkb25lLCB3aGljaCB3ZSB0aGVuIHN1YnZlcnQKKyMJQTMJc3RydWN0IG1uMTAzMDBfc2VyaWFsX3BvcnQgKgorIwlFMglJL08gcG9ydCBiYXNlCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJLmJhbGlnbglMMV9DQUNIRV9CWVRFUworRU5UUlkobW4xMDMwMF9zZXJpYWxfdmRtYV90eF9oYW5kbGVyKQorCW1vdgkoX190eF9pY3IsYTMpLGUzCisJbW92CUd4SUNSX0RFVEVDVCxkMgorCW1vdmJ1CWQyLChlMykJCQkjIEFDSyB0aGUgaW50ZXJydXB0CisJbW92aHUJKGUzKSxkMgkJCSMgZmx1c2gKKworCWJ0c3QJMHgwMSwoX190eF9icmVhayxhMykJIyBoYW5kbGUgdHJhbnNtaXQgYnJlYWsgcmVxdWVzdAorCWJuZQltbnNjX3ZkbWFfdHhfYnJlYWsKKworCW1vdmJ1CShTQ3hTVFIsZTIpLGQyCQkjIGRvbid0IHRyeSBhbmQgdHJhbnNtaXQgYSBjaGFyIGlmIHRoZQorCQkJCQkjIGJ1ZmZlciBpcyBub3QgZW1wdHkKKwlidHN0CVNDMDFTVFJfVEJGLGQyCQkjIChtYXkgaGF2ZSB0cmllZCB0byBqdW1wc3RhcnQpCisJYm5lCW1uc2NfdmRtYV90eF9ub2ludAorCisJbW92YnUJKF9fdHhfeGNoYXIsYTMpLGQyCSMgaGFuZGxlIGhpLXByaSBYT04vWE9GRgorCW9yCWQyLGQyCisJYm5lCW1uc2NfdmRtYV90eF94Y2hhcgorCisJbW92CShfX3R4X2luZm9fYnVmZmVyLGEzKSxhMiAjIGdldCB0aGUgdWFydF9pbmZvIHN0cnVjdCBmb3IgVHgKKwltb3YJKF9feG1pdF90YWlsLGEyKSxkMworCW1vdgkoX194bWl0X2hlYWQsYTIpLGQyCisJY21wCWQzLGQyCisJYmVxCW1uc2NfdmRtYV90eF9lbXB0eQorCisJbW92CShfX3htaXRfYnVmZmVyLGEyKSxkMgkjIGdldCBhIGNoYXIgZnJvbSB0aGUgYnVmZmVyIGFuZAorCQkJCQkjIHRyYW5zbWl0IGl0CisJbW92YnUJKGQzLGQyKSxkMgorCW1vdmJ1CWQyLChTQ3hUWEIsZTIpCQkjIFR4CisKKwlpbmMJZDMJCQkjIGFkdmFuY2UgdGhlIGJ1ZmZlciBwb2ludGVyCisJYW5kCV9fVUFSVF9YTUlUX1NJWkUtMSxkMworCW1vdgkoX194bWl0X2hlYWQsYTIpLGQyCisJbW92CWQzLChfX3htaXRfdGFpbCxhMikKKworCXN1YglkMyxkMgkJCSMgc2VlIGlmIHdlJ3ZlIHdyaXR0ZW4gZXZlcnl0aGluZworCWJlcQltbnNjX3ZkbWFfdHhfZW1wdHkKKworCWFuZAlfX1VBUlRfWE1JVF9TSVpFLTEsZDIJIyBzZWUgaWYgd2UganVzdCBtYWRlIGEgaG9sZQorCWNtcAlfX1VBUlRfWE1JVF9TSVpFLTIsZDIKKwliZXEJbW5zY192ZG1hX3R4X21hZGVfaG9sZQorCittbnNjX3ZkbWFfdHhfZG9uZToKKwltb3YJKF9fdG1faWNyLGEzKSxhMgorCW1vdglHeElDUl9MRVZFTF82fEd4SUNSX0VOQUJMRXxHeElDUl9SRVFVRVNUfEd4SUNSX0RFVEVDVCxkMgorCW1vdmh1CWQyLChhMikJCQkjIHJlcXVlc3QgYSBzbG93IGludGVycnVwdAorCW1vdmh1CShhMiksZDIJCQkjIGZsdXNoCisKK21uc2NfdmRtYV90eF9ub2ludDoKKwltb3ZtCShzcCksW2QyLGQzLGEyLGEzLGV4cmVnMF0KKwlydGkKKworbW5zY192ZG1hX3R4X2VtcHR5OgorCW1vdgkrKEd4SUNSX0xFVkVMXzF8R3hJQ1JfREVURUNUKSxkMgorCW1vdmh1CWQyLChlMykJCQkjIGRpc2FibGUgdGhlIGludGVycnVwdAorCW1vdmh1CShlMyksZDIJCQkjIGZsdXNoCisKKwlic2V0CU1OU0N4X1RYX0VNUFRZLChfX2ludHJfZmxhZ3MsYTMpCisJYnJhCW1uc2NfdmRtYV90eF9kb25lCisKK21uc2NfdmRtYV90eF9icmVhazoKKwltb3ZodQkoU0N4Q1RSLGUyKSxkMgkJIyB0dXJuIG9uIGJyZWFrIG1vZGUKKwlvcglTQzAxQ1RSX0JLRSxkMgorCW1vdmh1CWQyLChTQ3hDVFIsZTIpCisJbW92CSsoR3hJQ1JfTEVWRUxfMXxHeElDUl9ERVRFQ1QpLGQyCisJbW92aHUJZDIsKGUzKQkJCSMgZGlzYWJsZSB0cmFuc21pdCBpbnRlcnJ1cHRzIG9uIHRoaXMKKwkJCQkJIyBjaGFubmVsCisJbW92aHUJKGUzKSxkMgkJCSMgZmx1c2gKKwlicmEJbW5zY192ZG1hX3R4X25vaW50CisKK21uc2NfdmRtYV90eF94Y2hhcjoKKwliY2xyCTB4ZmYsKF9fdHhfeGNoYXIsYTMpCisJbW92YnUJZDIsKFNDeFRYQixlMikKKwlicmEJbW5zY192ZG1hX3R4X2RvbmUKKworbW5zY192ZG1hX3R4X21hZGVfaG9sZToKKwlic2V0CU1OU0N4X1RYX1NQQUNFLChfX2ludHJfZmxhZ3MsYTMpCisJYnJhCW1uc2NfdmRtYV90eF9kb25lCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL21uMTAzMDAtc2VyaWFsLmMgYi9hcmNoL21uMTAzMDAva2VybmVsL21uMTAzMDAtc2VyaWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjljMjY4YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvbW4xMDMwMC1zZXJpYWwuYwpAQCAtMCwwICsxLDE0ODAgQEAKKy8qIE1OMTAzMDAgT24tY2hpcCBzZXJpYWwgcG9ydCBVQVJUIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCitzdGF0aWMgY29uc3QgY2hhciBzZXJpYWxfbmFtZVtdID0gIk1OMTAzMDAgU2VyaWFsIGRyaXZlciI7CitzdGF0aWMgY29uc3QgY2hhciBzZXJpYWxfdmVyc2lvbltdID0gIm1uMTAzMDBfc2VyaWFsLTEuMCI7CitzdGF0aWMgY29uc3QgY2hhciBzZXJpYWxfcmV2ZGF0ZVtdID0gIjIwMDctMTEtMDYiOworCisjaWYgZGVmaW5lZChDT05GSUdfTU4xMDMwMF9UVFlTTV9DT05TT0xFKSAmJiBkZWZpbmVkKENPTkZJR19NQUdJQ19TWVNSUSkKKyNkZWZpbmUgU1VQUE9SVF9TWVNSUQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvY2lyY19idWYuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNycS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3NlcmlhbC1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL3VuaXQvdGltZXguaD4KKyNpbmNsdWRlICJtbjEwMzAwLXNlcmlhbC5oIgorCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDEsIDIpKSkKK3ZvaWQgbm9fcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworfQorCisjZGVmaW5lIGtlbnRlcihGTVQsIC4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHICItLT4lcygiIEZNVCAiKVxuIiwgX19mdW5jX18sICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9lbnRlcihGTVQsIC4uLikgXAorCW5vX3ByaW50ayhLRVJOX0RFQlVHICItLT4lcygiIEZNVCAiKVxuIiwgX19mdW5jX18sICMjX19WQV9BUkdTX18pCisjZGVmaW5lIGtkZWJ1ZyhGTVQsIC4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHICItLS0gIiBGTVQgIlxuIiwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX2RlYnVnKEZNVCwgLi4uKSBcCisJbm9fcHJpbnRrKEtFUk5fREVCVUcgIi0tLSAiIEZNVCAiXG4iLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBrcHJvdG8oRk1ULCAuLi4pIFwKKwlwcmludGsoS0VSTl9ERUJVRyAiIyMjIE1OU0VSSUFMICIgRk1UICIgIyMjXG4iLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfcHJvdG8oRk1ULCAuLi4pIFwKKwlub19wcmludGsoS0VSTl9ERUJVRyAiIyMjIE1OU0VSSUFMICIgRk1UICIgIyMjXG4iLCAjI19fVkFfQVJHU19fKQorCisjZGVmaW5lIE5SX1VBUlRTIDMKKworI2lmZGVmIENPTkZJR19NTjEwMzAwX1RUWVNNX0NPTlNPTEUKK3N0YXRpYyB2b2lkIG1uMTAzMDBfc2VyaWFsX2NvbnNvbGVfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvLAorCQkJCQkgICBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBjb3VudCk7CitzdGF0aWMgaW50IF9faW5pdCBtbjEwMzAwX3NlcmlhbF9jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjbywKKwkJCQkJCSBjaGFyICpvcHRpb25zKTsKKworc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBtbjEwMzAwX3NlcmlhbF9kcml2ZXI7CitzdGF0aWMgc3RydWN0IGNvbnNvbGUgbW4xMDMwMF9zZXJpYWxfY29uc29sZSA9IHsKKwkubmFtZQkJPSAidHR5U00iLAorCS53cml0ZQkJPSBtbjEwMzAwX3NlcmlhbF9jb25zb2xlX3dyaXRlLAorCS5kZXZpY2UJCT0gdWFydF9jb25zb2xlX2RldmljZSwKKwkuc2V0dXAJCT0gbW4xMDMwMF9zZXJpYWxfY29uc29sZV9zZXR1cCwKKwkuZmxhZ3MJCT0gQ09OX1BSSU5UQlVGRkVSLAorCS5pbmRleAkJPSAtMSwKKwkuZGF0YQkJPSAmbW4xMDMwMF9zZXJpYWxfZHJpdmVyLAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHVhcnRfZHJpdmVyIG1uMTAzMDBfc2VyaWFsX2RyaXZlciA9IHsKKwkub3duZXIJCT0gTlVMTCwKKwkuZHJpdmVyX25hbWUJPSAibW4xMDMwMC1zZXJpYWwiLAorCS5kZXZfbmFtZQk9ICJ0dHlTTSIsCisJLm1ham9yCQk9IFRUWV9NQUpPUiwKKwkubWlub3IJCT0gMTI4LAorCS5ucgkJPSBOUl9VQVJUUywKKyNpZmRlZiBDT05GSUdfTU4xMDMwMF9UVFlTTV9DT05TT0xFCisJLmNvbnMJCT0gJm1uMTAzMDBfc2VyaWFsX2NvbnNvbGUsCisjZW5kaWYKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbW4xMDMwMF9zZXJpYWxfdHhfZW1wdHkoc3RydWN0IHVhcnRfcG9ydCAqKTsKK3N0YXRpYyB2b2lkIG1uMTAzMDBfc2VyaWFsX3NldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICosIHVuc2lnbmVkIGludCBtY3RybCk7CitzdGF0aWMgdW5zaWduZWQgaW50IG1uMTAzMDBfc2VyaWFsX2dldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICopOworc3RhdGljIHZvaWQgbW4xMDMwMF9zZXJpYWxfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICopOworc3RhdGljIHZvaWQgbW4xMDMwMF9zZXJpYWxfc3RhcnRfdHgoc3RydWN0IHVhcnRfcG9ydCAqKTsKK3N0YXRpYyB2b2lkIG1uMTAzMDBfc2VyaWFsX3NlbmRfeGNoYXIoc3RydWN0IHVhcnRfcG9ydCAqLCBjaGFyIGNoKTsKK3N0YXRpYyB2b2lkIG1uMTAzMDBfc2VyaWFsX3N0b3Bfcngoc3RydWN0IHVhcnRfcG9ydCAqKTsKK3N0YXRpYyB2b2lkIG1uMTAzMDBfc2VyaWFsX2VuYWJsZV9tcyhzdHJ1Y3QgdWFydF9wb3J0ICopOworc3RhdGljIHZvaWQgbW4xMDMwMF9zZXJpYWxfYnJlYWtfY3RsKHN0cnVjdCB1YXJ0X3BvcnQgKiwgaW50IGN0bCk7CitzdGF0aWMgaW50IG1uMTAzMDBfc2VyaWFsX3N0YXJ0dXAoc3RydWN0IHVhcnRfcG9ydCAqKTsKK3N0YXRpYyB2b2lkIG1uMTAzMDBfc2VyaWFsX3NodXRkb3duKHN0cnVjdCB1YXJ0X3BvcnQgKik7CitzdGF0aWMgdm9pZCBtbjEwMzAwX3NlcmlhbF9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICosCisJCQkJCSBzdHJ1Y3Qga3Rlcm1pb3MgKm5ldywKKwkJCQkJIHN0cnVjdCBrdGVybWlvcyAqb2xkKTsKK3N0YXRpYyBjb25zdCBjaGFyICptbjEwMzAwX3NlcmlhbF90eXBlKHN0cnVjdCB1YXJ0X3BvcnQgKik7CitzdGF0aWMgdm9pZCBtbjEwMzAwX3NlcmlhbF9yZWxlYXNlX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqKTsKK3N0YXRpYyBpbnQgbW4xMDMwMF9zZXJpYWxfcmVxdWVzdF9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKik7CitzdGF0aWMgdm9pZCBtbjEwMzAwX3NlcmlhbF9jb25maWdfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICosIGludCk7CitzdGF0aWMgaW50IG1uMTAzMDBfc2VyaWFsX3ZlcmlmeV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKiwKKwkJCQkJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKik7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9vcHMgbW4xMDMwMF9zZXJpYWxfb3BzID0geworCS50eF9lbXB0eQk9IG1uMTAzMDBfc2VyaWFsX3R4X2VtcHR5LAorCS5zZXRfbWN0cmwJPSBtbjEwMzAwX3NlcmlhbF9zZXRfbWN0cmwsCisJLmdldF9tY3RybAk9IG1uMTAzMDBfc2VyaWFsX2dldF9tY3RybCwKKwkuc3RvcF90eAk9IG1uMTAzMDBfc2VyaWFsX3N0b3BfdHgsCisJLnN0YXJ0X3R4CT0gbW4xMDMwMF9zZXJpYWxfc3RhcnRfdHgsCisJLnNlbmRfeGNoYXIJPSBtbjEwMzAwX3NlcmlhbF9zZW5kX3hjaGFyLAorCS5zdG9wX3J4CT0gbW4xMDMwMF9zZXJpYWxfc3RvcF9yeCwKKwkuZW5hYmxlX21zCT0gbW4xMDMwMF9zZXJpYWxfZW5hYmxlX21zLAorCS5icmVha19jdGwJPSBtbjEwMzAwX3NlcmlhbF9icmVha19jdGwsCisJLnN0YXJ0dXAJPSBtbjEwMzAwX3NlcmlhbF9zdGFydHVwLAorCS5zaHV0ZG93bgk9IG1uMTAzMDBfc2VyaWFsX3NodXRkb3duLAorCS5zZXRfdGVybWlvcwk9IG1uMTAzMDBfc2VyaWFsX3NldF90ZXJtaW9zLAorCS50eXBlCQk9IG1uMTAzMDBfc2VyaWFsX3R5cGUsCisJLnJlbGVhc2VfcG9ydAk9IG1uMTAzMDBfc2VyaWFsX3JlbGVhc2VfcG9ydCwKKwkucmVxdWVzdF9wb3J0CT0gbW4xMDMwMF9zZXJpYWxfcmVxdWVzdF9wb3J0LAorCS5jb25maWdfcG9ydAk9IG1uMTAzMDBfc2VyaWFsX2NvbmZpZ19wb3J0LAorCS52ZXJpZnlfcG9ydAk9IG1uMTAzMDBfc2VyaWFsX3ZlcmlmeV9wb3J0LAorfTsKKworc3RhdGljIGlycXJldHVybl90IG1uMTAzMDBfc2VyaWFsX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworCisvKgorICogdGhlIGZpcnN0IG9uLWNoaXAgc2VyaWFsIHBvcnQ6IHR0eVNNMCAoYWthIFNJRjApCisgKi8KKyNpZmRlZiBDT05GSUdfTU4xMDMwMF9UVFlTTTAKK3N0cnVjdCBtbjEwMzAwX3NlcmlhbF9wb3J0IG1uMTAzMDBfc2VyaWFsX3BvcnRfc2lmMCA9IHsKKwkudWFydC5vcHMJPSAmbW4xMDMwMF9zZXJpYWxfb3BzLAorCS51YXJ0Lm1lbWJhc2UJPSAodm9pZCBfX2lvbWVtICopICZTQzBDVFIsCisJLnVhcnQubWFwYmFzZQk9ICh1bnNpZ25lZCBsb25nKSAmU0MwQ1RSLAorCS51YXJ0LmlvdHlwZQk9IFVQSU9fTUVNLAorCS51YXJ0LmlycQk9IDAsCisJLnVhcnQudWFydGNsawk9IDAsIC8qIE1OMTAzMDBfSU9DTEssICovCisJLnVhcnQuZmlmb3NpemUJPSAxLAorCS51YXJ0LmZsYWdzCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnVhcnQubGluZQk9IDAsCisJLnVhcnQudHlwZQk9IFBPUlRfTU4xMDMwMCwKKwkudWFydC5sb2NrCT0KKwlfX1NQSU5fTE9DS19VTkxPQ0tFRChtbjEwMzAwX3NlcmlhbF9wb3J0X3NpZjAudWFydC5sb2NrKSwKKwkubmFtZQkJPSAidHR5U00wIiwKKwkuX2lvYmFzZQk9ICZTQzBDVFIsCisJLl9jb250cm9sCT0gJlNDMENUUiwKKwkuX3N0YXR1cwk9ICh2b2xhdGlsZSB1OCAqKSAmU0MwU1RSLAorCS5faW50cgkJPSAmU0MwSUNSLAorCS5fcnhiCQk9ICZTQzBSWEIsCisJLl90eGIJCT0gJlNDMFRYQiwKKwkucnhfbmFtZQk9ICJ0dHlTTTAvUngiLAorCS50eF9uYW1lCT0gInR0eVNNMC9UeCIsCisjaWZkZWYgQ09ORklHX01OMTAzMDBfVFRZU00wX1RJTUVSOAorCS50bV9uYW1lCT0gInR0eVNNMC9UaW1lcjgiLAorCS5fdG14bWQJCT0gJlRNOE1ELAorCS5fdG14YnIJCT0gJlRNOEJSLAorCS5fdG1pY3IJCT0gJlRNOElDUiwKKwkudG1faXJxCQk9IFRNOElSUSwKKwkuZGl2X3RpbWVyCT0gTU5TQ3hfRElWX1RJTUVSXzE2QklULAorI2Vsc2UgLyogQ09ORklHX01OMTAzMDBfVFRZU00wX1RJTUVSMiAqLworCS50bV9uYW1lCT0gInR0eVNNMC9UaW1lcjIiLAorCS5fdG14bWQJCT0gJlRNMk1ELAorCS5fdG14YnIJCT0gKHZvbGF0aWxlIHUxNiAqKSAmVE0yQlIsCisJLl90bWljcgkJPSAmVE0ySUNSLAorCS50bV9pcnEJCT0gVE0ySVJRLAorCS5kaXZfdGltZXIJPSBNTlNDeF9ESVZfVElNRVJfOEJJVCwKKyNlbmRpZgorCS5yeF9pcnEJCT0gU0MwUlhJUlEsCisJLnR4X2lycQkJPSBTQzBUWElSUSwKKwkucnhfaWNyCQk9ICZHeElDUihTQzBSWElSUSksCisJLnR4X2ljcgkJPSAmR3hJQ1IoU0MwVFhJUlEpLAorCS5jbG9ja19zcmMJPSBNTlNDeF9DTE9DS19TUkNfSU9DTEssCisJLm9wdGlvbnMJPSAwLAorI2lmZGVmIENPTkZJR19HREJTVFVCX09OX1RUWVNNMAorCS5nZGJzdHViCT0gMSwKKyNlbmRpZgorfTsKKyNlbmRpZiAvKiBDT05GSUdfTU4xMDMwMF9UVFlTTTAgKi8KKworLyoKKyAqIHRoZSBzZWNvbmQgb24tY2hpcCBzZXJpYWwgcG9ydDogdHR5U00xIChha2EgU0lGMSkKKyAqLworI2lmZGVmIENPTkZJR19NTjEwMzAwX1RUWVNNMQorc3RydWN0IG1uMTAzMDBfc2VyaWFsX3BvcnQgbW4xMDMwMF9zZXJpYWxfcG9ydF9zaWYxID0geworCS51YXJ0Lm9wcwk9ICZtbjEwMzAwX3NlcmlhbF9vcHMsCisJLnVhcnQubWVtYmFzZQk9ICh2b2lkIF9faW9tZW0gKikgJlNDMUNUUiwKKwkudWFydC5tYXBiYXNlCT0gKHVuc2lnbmVkIGxvbmcpICZTQzFDVFIsCisJLnVhcnQuaW90eXBlCT0gVVBJT19NRU0sCisJLnVhcnQuaXJxCT0gMCwKKwkudWFydC51YXJ0Y2xrCT0gMCwgLyogTU4xMDMwMF9JT0NMSywgKi8KKwkudWFydC5maWZvc2l6ZQk9IDEsCisJLnVhcnQuZmxhZ3MJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkudWFydC5saW5lCT0gMSwKKwkudWFydC50eXBlCT0gUE9SVF9NTjEwMzAwLAorCS51YXJ0LmxvY2sJPQorCV9fU1BJTl9MT0NLX1VOTE9DS0VEKG1uMTAzMDBfc2VyaWFsX3BvcnRfc2lmMS51YXJ0LmxvY2spLAorCS5uYW1lCQk9ICJ0dHlTTTEiLAorCS5faW9iYXNlCT0gJlNDMUNUUiwKKwkuX2NvbnRyb2wJPSAmU0MxQ1RSLAorCS5fc3RhdHVzCT0gKHZvbGF0aWxlIHU4ICopICZTQzFTVFIsCisJLl9pbnRyCQk9ICZTQzFJQ1IsCisJLl9yeGIJCT0gJlNDMVJYQiwKKwkuX3R4YgkJPSAmU0MxVFhCLAorCS5yeF9uYW1lCT0gInR0eVNNMS9SeCIsCisJLnR4X25hbWUJPSAidHR5U00xL1R4IiwKKyNpZmRlZiBDT05GSUdfTU4xMDMwMF9UVFlTTTFfVElNRVI5CisJLnRtX25hbWUJPSAidHR5U00xL1RpbWVyOSIsCisJLl90bXhtZAkJPSAmVE05TUQsCisJLl90bXhicgkJPSAmVE05QlIsCisJLl90bWljcgkJPSAmVE05SUNSLAorCS50bV9pcnEJCT0gVE05SVJRLAorCS5kaXZfdGltZXIJPSBNTlNDeF9ESVZfVElNRVJfMTZCSVQsCisjZWxzZSAvKiBDT05GSUdfTU4xMDMwMF9UVFlTTTFfVElNRVIzICovCisJLnRtX25hbWUJPSAidHR5U00xL1RpbWVyMyIsCisJLl90bXhtZAkJPSAmVE0zTUQsCisJLl90bXhicgkJPSAodm9sYXRpbGUgdTE2ICopICZUTTNCUiwKKwkuX3RtaWNyCQk9ICZUTTNJQ1IsCisJLnRtX2lycQkJPSBUTTNJUlEsCisJLmRpdl90aW1lcgk9IE1OU0N4X0RJVl9USU1FUl84QklULAorI2VuZGlmCisJLnJ4X2lycQkJPSBTQzFSWElSUSwKKwkudHhfaXJxCQk9IFNDMVRYSVJRLAorCS5yeF9pY3IJCT0gJkd4SUNSKFNDMVJYSVJRKSwKKwkudHhfaWNyCQk9ICZHeElDUihTQzFUWElSUSksCisJLmNsb2NrX3NyYwk9IE1OU0N4X0NMT0NLX1NSQ19JT0NMSywKKwkub3B0aW9ucwk9IDAsCisjaWZkZWYgQ09ORklHX0dEQlNUVUJfT05fVFRZU00xCisJLmdkYnN0dWIJPSAxLAorI2VuZGlmCit9OworI2VuZGlmIC8qIENPTkZJR19NTjEwMzAwX1RUWVNNMSAqLworCisvKgorICogdGhlIHRoaXJkIG9uLWNoaXAgc2VyaWFsIHBvcnQ6IHR0eVNNMiAoYWthIFNJRjIpCisgKi8KKyNpZmRlZiBDT05GSUdfTU4xMDMwMF9UVFlTTTIKK3N0cnVjdCBtbjEwMzAwX3NlcmlhbF9wb3J0IG1uMTAzMDBfc2VyaWFsX3BvcnRfc2lmMiA9IHsKKwkudWFydC5vcHMJPSAmbW4xMDMwMF9zZXJpYWxfb3BzLAorCS51YXJ0Lm1lbWJhc2UJPSAodm9pZCBfX2lvbWVtICopICZTQzJDVFIsCisJLnVhcnQubWFwYmFzZQk9ICh1bnNpZ25lZCBsb25nKSAmU0MyQ1RSLAorCS51YXJ0LmlvdHlwZQk9IFVQSU9fTUVNLAorCS51YXJ0LmlycQk9IDAsCisJLnVhcnQudWFydGNsawk9IDAsIC8qIE1OMTAzMDBfSU9DTEssICovCisJLnVhcnQuZmlmb3NpemUJPSAxLAorCS51YXJ0LmZsYWdzCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJLnVhcnQubGluZQk9IDIsCisjaWZkZWYgQ09ORklHX01OMTAzMDBfVFRZU00yX0NUUworCS51YXJ0LnR5cGUJPSBQT1JUX01OMTAzMDBfQ1RTLAorI2Vsc2UKKwkudWFydC50eXBlCT0gUE9SVF9NTjEwMzAwLAorI2VuZGlmCisJLnVhcnQubG9jawk9CisJX19TUElOX0xPQ0tfVU5MT0NLRUQobW4xMDMwMF9zZXJpYWxfcG9ydF9zaWYyLnVhcnQubG9jayksCisJLm5hbWUJCT0gInR0eVNNMiIsCisJLnJ4X25hbWUJPSAidHR5U00yL1J4IiwKKwkudHhfbmFtZQk9ICJ0dHlTTTIvVHgiLAorCS50bV9uYW1lCT0gInR0eVNNMi9UaW1lcjEwIiwKKwkuX2lvYmFzZQk9ICZTQzJDVFIsCisJLl9jb250cm9sCT0gJlNDMkNUUiwKKwkuX3N0YXR1cwk9ICZTQzJTVFIsCisJLl9pbnRyCQk9ICZTQzJJQ1IsCisJLl9yeGIJCT0gJlNDMlJYQiwKKwkuX3R4YgkJPSAmU0MyVFhCLAorCS5fdG14bWQJCT0gJlRNMTBNRCwKKwkuX3RteGJyCQk9ICZUTTEwQlIsCisJLl90bWljcgkJPSAmVE0xMElDUiwKKwkudG1faXJxCQk9IFRNMTBJUlEsCisJLmRpdl90aW1lcgk9IE1OU0N4X0RJVl9USU1FUl8xNkJJVCwKKwkucnhfaXJxCQk9IFNDMlJYSVJRLAorCS50eF9pcnEJCT0gU0MyVFhJUlEsCisJLnJ4X2ljcgkJPSAmR3hJQ1IoU0MyUlhJUlEpLAorCS50eF9pY3IJCT0gJkd4SUNSKFNDMlRYSVJRKSwKKwkuY2xvY2tfc3JjCT0gTU5TQ3hfQ0xPQ0tfU1JDX0lPQ0xLLAorI2lmZGVmIENPTkZJR19NTjEwMzAwX1RUWVNNMl9DVFMKKwkub3B0aW9ucwk9IE1OU0N4X09QVF9DVFMsCisjZWxzZQorCS5vcHRpb25zCT0gMCwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19HREJTVFVCX09OX1RUWVNNMgorCS5nZGJzdHViCT0gMSwKKyNlbmRpZgorfTsKKyNlbmRpZiAvKiBDT05GSUdfTU4xMDMwMF9UVFlTTTIgKi8KKworCisvKgorICogbGlzdCBvZiBhdmFpbGFibGUgc2VyaWFsIHBvcnRzCisgKi8KK3N0cnVjdCBtbjEwMzAwX3NlcmlhbF9wb3J0ICptbjEwMzAwX3NlcmlhbF9wb3J0c1tOUl9VQVJUUyArIDFdID0geworI2lmZGVmIENPTkZJR19NTjEwMzAwX1RUWVNNMAorCVswXQk9ICZtbjEwMzAwX3NlcmlhbF9wb3J0X3NpZjAsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTU4xMDMwMF9UVFlTTTEKKwlbMV0JPSAmbW4xMDMwMF9zZXJpYWxfcG9ydF9zaWYxLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX01OMTAzMDBfVFRZU00yCisJWzJdCT0gJm1uMTAzMDBfc2VyaWFsX3BvcnRfc2lmMiwKKyNlbmRpZgorCVtOUl9VQVJUU10gPSBOVUxMLAorfTsKKworCisvKgorICogd2UgYWJ1c2UgdGhlIHNlcmlhbCBwb3J0cycgYmF1ZCB0aW1lcnMnIGludGVycnVwdCBsaW5lcyB0byBnZXQgdGhlIGFiaWxpdHkKKyAqIHRvIGRlbGl2ZXIgaW50ZXJydXB0cyB0byB1c2Vyc3BhY2UgYXMgd2UgdXNlIHRoZSBwb3J0cycgaW50ZXJydXB0IGxpbmVzIHRvCisgKiBkbyB2aXJ0dWFsIERNQSBvbiBhY2NvdW50IG9mIHRoZSBwb3J0cyBoYXZpbmcgbm8gaGFyZHdhcmUgRklGT3MKKyAqCisgKiB3ZSBjYW4gZ2VuZXJhdGUgYW4gaW50ZXJydXB0IG1hbnVhbGx5IGluIHRoZSBhc3NlbWJseSBzdHVicyBieSB3cml0aW5nIHRvCisgKiB0aGUgZW5hYmxlIGFuZCBkZXRlY3QgYml0cyBpbiB0aGUgaW50ZXJydXB0IGNvbnRyb2wgcmVnaXN0ZXIsIHNvIGFsbCB3ZSBuZWVkCisgKiB0byBkbyBoZXJlIGlzIGRpc2FibGUgdGhlIGludGVycnVwdCBsaW5lCisgKgorICogbm90ZSB0aGF0IHdlIGNhbid0IGp1c3QgbGVhdmUgdGhlIGxpbmUgZW5hYmxlZCBhcyB0aGUgYmF1ZCByYXRlIHRpbWVyICphbHNvKgorICogZ2VuZXJhdGVzIGludGVycnVwdHMKKyAqLworc3RhdGljIHZvaWQgbW4xMDMwMF9zZXJpYWxfbWFza19hY2sodW5zaWduZWQgaW50IGlycSkKK3sKKwl1MTYgdG1wOworCUd4SUNSKGlycSkgPSBHeElDUl9MRVZFTF82OworCXRtcCA9IEd4SUNSKGlycSk7IC8qIGZsdXNoIHdyaXRlIGJ1ZmZlciAqLworfQorCitzdGF0aWMgdm9pZCBtbjEwMzAwX3NlcmlhbF9ub3AodW5zaWduZWQgaW50IGlycSkKK3sKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBtbjEwMzAwX3NlcmlhbF9waWMgPSB7CisJLm5hbWUJCT0gIm1uc2VyaWFsIiwKKwkuYWNrCQk9IG1uMTAzMDBfc2VyaWFsX21hc2tfYWNrLAorCS5tYXNrCQk9IG1uMTAzMDBfc2VyaWFsX21hc2tfYWNrLAorCS5tYXNrX2Fjawk9IG1uMTAzMDBfc2VyaWFsX21hc2tfYWNrLAorCS51bm1hc2sJCT0gbW4xMDMwMF9zZXJpYWxfbm9wLAorCS5lbmQJCT0gbW4xMDMwMF9zZXJpYWxfbm9wLAorfTsKKworCisvKgorICogc2VyaWFsIHZpcnR1YWwgRE1BIGludGVycnVwdCBqdW1wIHRhYmxlCisgKi8KK3N0cnVjdCBtbjEwMzAwX3NlcmlhbF9pbnQgbW4xMDMwMF9zZXJpYWxfaW50X3RibFtOUl9JUlFTXTsKKworc3RhdGljIHZvaWQgbW4xMDMwMF9zZXJpYWxfZGlzX3R4X2ludHIoc3RydWN0IG1uMTAzMDBfc2VyaWFsX3BvcnQgKnBvcnQpCit7CisJdTE2IHg7CisJKnBvcnQtPnR4X2ljciA9IEd4SUNSX0xFVkVMXzEgfCBHeElDUl9ERVRFQ1Q7CisJeCA9ICpwb3J0LT50eF9pY3I7Cit9CisKK3N0YXRpYyB2b2lkIG1uMTAzMDBfc2VyaWFsX2VuX3R4X2ludHIoc3RydWN0IG1uMTAzMDBfc2VyaWFsX3BvcnQgKnBvcnQpCit7CisJdTE2IHg7CisJKnBvcnQtPnR4X2ljciA9IEd4SUNSX0xFVkVMXzEgfCBHeElDUl9FTkFCTEU7CisJeCA9ICpwb3J0LT50eF9pY3I7Cit9CisKK3N0YXRpYyB2b2lkIG1uMTAzMDBfc2VyaWFsX2Rpc19yeF9pbnRyKHN0cnVjdCBtbjEwMzAwX3NlcmlhbF9wb3J0ICpwb3J0KQoreworCXUxNiB4OworCSpwb3J0LT5yeF9pY3IgPSBHeElDUl9MRVZFTF8xIHwgR3hJQ1JfREVURUNUOworCXggPSAqcG9ydC0+cnhfaWNyOworfQorCisvKgorICogbXVsdGktYml0IGVxdWl2YWxlbnQgb2YgdGVzdF9hbmRfY2xlYXJfYml0KCkKKyAqLworc3RhdGljIGludCBtYXNrX3Rlc3RfYW5kX2NsZWFyKHZvbGF0aWxlIHU4ICpwdHIsIHU4IG1hc2spCit7CisJdTMyIGVwc3c7CisJYXNtIHZvbGF0aWxlKCIJYmNscgklMSwoJTIpCQlcbiIKKwkJICAgICAiCW1vdgllcHN3LCUwCQlcbiIKKwkJICAgICA6ICI9ZCIoZXBzdykgOiAiZCIobWFzayksICJhIihwdHIpKTsKKwlyZXR1cm4gIShlcHN3ICYgRVBTV19GTEFHX1opOworfQorCisvKgorICogcmVjZWl2ZSBjaGFycyBmcm9tIHRoZSByaW5nIGJ1ZmZlciBmb3IgdGhpcyBzZXJpYWwgcG9ydAorICogLSBtdXN0IGRvIGJyZWFrIGRldGVjdGlvbiBoZXJlIChub3QgZG9uZSBpbiB0aGUgVUFSVCkKKyAqLworc3RhdGljIHZvaWQgbW4xMDMwMF9zZXJpYWxfcmVjZWl2ZV9pbnRlcnJ1cHQoc3RydWN0IG1uMTAzMDBfc2VyaWFsX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHVhcnRfaWNvdW50ICppY291bnQgPSAmcG9ydC0+dWFydC5pY291bnQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPnVhcnQuaW5mby0+dHR5OworCXVuc2lnbmVkIGl4OworCWludCBjb3VudDsKKwl1OCBzdCwgY2gsIHB1c2gsIHN0YXR1cywgb3ZlcnJ1bjsKKworCV9lbnRlcigiJXMiLCBwb3J0LT5uYW1lKTsKKworCXB1c2ggPSAwOworCisJY291bnQgPSBDSVJDX0NOVChwb3J0LT5yeF9pbnAsIHBvcnQtPnJ4X291dHAsIE1OU0NfQlVGRkVSX1NJWkUpOworCWNvdW50ID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBjb3VudCk7CisJaWYgKGNvdW50ID09IDApIHsKKwkJaWYgKCF0dHktPmxvd19sYXRlbmN5KQorCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKKwkJcmV0dXJuOworCX0KKwordHJ5X2FnYWluOgorCS8qIHB1bGwgY2hhcnMgb3V0IG9mIHRoZSBoYXQgKi8KKwlpeCA9IHBvcnQtPnJ4X291dHA7CisJaWYgKGl4ID09IHBvcnQtPnJ4X2lucCkgeworCQlpZiAocHVzaCAmJiAhdHR5LT5sb3dfbGF0ZW5jeSkKKwkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CisJCXJldHVybjsKKwl9CisKKwljaCA9IHBvcnQtPnJ4X2J1ZmZlcltpeCsrXTsKKwlzdCA9IHBvcnQtPnJ4X2J1ZmZlcltpeCsrXTsKKwlzbXBfcm1iKCk7CisJcG9ydC0+cnhfb3V0cCA9IGl4ICYgKE1OU0NfQlVGRkVSX1NJWkUgLSAxKTsKKwlwb3J0LT51YXJ0Lmljb3VudC5yeCsrOworCisJc3QgJj0gU0MwMVNUUl9GRUYgfCBTQzAxU1RSX1BFRiB8IFNDMDFTVFJfT0VGOworCXN0YXR1cyA9IDA7CisJb3ZlcnJ1biA9IDA7CisKKwkvKiB0aGUgVUFSVCBkb2Vzbid0IGRldGVjdCBCUkVBSywgc28gd2UgaGF2ZSB0byBkbyB0aGF0IG91cnNlbHZlcworCSAqIC0gaXQgc3RhcnRzIGFzIGEgZnJhbWluZyBlcnJvciBvbiBhIE5VTCBjaGFyYWN0ZXIKKwkgKiAtIHRoZW4gd2UgY291bnQgYW5vdGhlciB0d28gTlVMIGNoYXJhY3RlcnMgYmVmb3JlIGlzc3VpbmcgVFRZX0JSRUFLCisJICogLSB0aGVuIHdlIGVuZCBvbiBhIG5vcm1hbCBjaGFyIG9yIG9uZSB0aGF0IGhhcyBhbGwgdGhlIGJvdHRvbSBiaXRzCisJICogICB6ZXJvIGFuZCB0aGUgdG9wIGJpdHMgc2V0CisJICovCisJc3dpdGNoIChwb3J0LT5yeF9icmspIHsKKwljYXNlIDA6CisJCS8qIG5vdCBicmVha2luZyBhdCB0aGUgbW9tZW50ICovCisJCWJyZWFrOworCisJY2FzZSAxOgorCQlpZiAoc3QgJiBTQzAxU1RSX0ZFRiAmJiBjaCA9PSAwKSB7CisJCQlwb3J0LT5yeF9icmsgPSAyOworCQkJZ290byB0cnlfYWdhaW47CisJCX0KKwkJZ290byBub3RfYnJlYWs7CisKKwljYXNlIDI6CisJCWlmIChzdCAmIFNDMDFTVFJfRkVGICYmIGNoID09IDApIHsKKwkJCXBvcnQtPnJ4X2JyayA9IDM7CisJCQlfcHJvdG8oIlJ4IEJyZWFrIERldGVjdGVkIik7CisJCQlpY291bnQtPmJyaysrOworCQkJaWYgKHVhcnRfaGFuZGxlX2JyZWFrKCZwb3J0LT51YXJ0KSkKKwkJCQlnb3RvIGlnbm9yZV9jaGFyOworCQkJc3RhdHVzIHw9IDEgPDwgVFRZX0JSRUFLOworCQkJZ290byBpbnNlcnQ7CisJCX0KKwkJZ290byBub3RfYnJlYWs7CisKKwlkZWZhdWx0OgorCQlpZiAoc3QgJiAoU0MwMVNUUl9GRUYgfCBTQzAxU1RSX1BFRiB8IFNDMDFTVFJfT0VGKSkKKwkJCWdvdG8gdHJ5X2FnYWluOyAvKiBzdGlsbCBicmVha2luZyAqLworCisJCXBvcnQtPnJ4X2JyayA9IDA7IC8qIGVuZCBvZiB0aGUgYnJlYWsgKi8KKworCQlzd2l0Y2ggKGNoKSB7CisJCWNhc2UgMHhGRjoKKwkJY2FzZSAweEZFOgorCQljYXNlIDB4RkM6CisJCWNhc2UgMHhGODoKKwkJY2FzZSAweEYwOgorCQljYXNlIDB4RTA6CisJCWNhc2UgMHhDMDoKKwkJY2FzZSAweDgwOgorCQljYXNlIDB4MDA6CisJCQkvKiBkaXNjYXJkIGNoYXIgYXQgcHJvYmFibGUgYnJlYWsgZW5kICovCisJCQlnb3RvIHRyeV9hZ2FpbjsKKwkJfQorCQlicmVhazsKKwl9CisKK3Byb2Nlc3NfZXJyb3JzOgorCS8qIGhhbmRsZSBmcmFtaW5nIGVycm9yICovCisJaWYgKHN0ICYgU0MwMVNUUl9GRUYpIHsKKwkJaWYgKGNoID09IDApIHsKKwkJCS8qIGZyYW1pbmcgZXJyb3Igd2l0aCBOVUwgY2hhciBpcyBwcm9iYWJseSBhIEJSRUFLICovCisJCQlwb3J0LT5yeF9icmsgPSAxOworCQkJZ290byB0cnlfYWdhaW47CisJCX0KKworCQlfcHJvdG8oIlJ4IEZyYW1pbmcgRXJyb3IiKTsKKwkJaWNvdW50LT5mcmFtZSsrOworCQlzdGF0dXMgfD0gMSA8PCBUVFlfRlJBTUU7CisJfQorCisJLyogaGFuZGxlIHBhcml0eSBlcnJvciAqLworCWlmIChzdCAmIFNDMDFTVFJfUEVGKSB7CisJCV9wcm90bygiUnggUGFyaXR5IEVycm9yIik7CisJCWljb3VudC0+cGFyaXR5Kys7CisJCXN0YXR1cyA9IFRUWV9QQVJJVFk7CisJfQorCisJLyogaGFuZGxlIG5vcm1hbCBjaGFyICovCisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCWlmICh1YXJ0X2hhbmRsZV9zeXNycV9jaGFyKCZwb3J0LT51YXJ0LCBjaCkpCisJCQlnb3RvIGlnbm9yZV9jaGFyOworCQlzdGF0dXMgPSAoMSA8PCBUVFlfTk9STUFMKTsKKwl9CisKKwkvKiBoYW5kbGUgb3ZlcnJ1biBlcnJvciAqLworCWlmIChzdCAmIFNDMDFTVFJfT0VGKSB7CisJCWlmIChwb3J0LT5yeF9icmspCisJCQlnb3RvIHRyeV9hZ2FpbjsKKworCQlfcHJvdG8oIlJ4IE92ZXJydW4gRXJyb3IiKTsKKwkJaWNvdW50LT5vdmVycnVuKys7CisJCW92ZXJydW4gPSAxOworCX0KKworaW5zZXJ0OgorCXN0YXR1cyAmPSBwb3J0LT51YXJ0LnJlYWRfc3RhdHVzX21hc2s7CisKKwlpZiAoIW92ZXJydW4gJiYgIShzdGF0dXMgJiBwb3J0LT51YXJ0Lmlnbm9yZV9zdGF0dXNfbWFzaykpIHsKKwkJaW50IGZsYWc7CisKKwkJaWYgKHN0YXR1cyAmICgxIDw8IFRUWV9CUkVBSykpCisJCQlmbGFnID0gVFRZX0JSRUFLOworCQllbHNlIGlmIChzdGF0dXMgJiAoMSA8PCBUVFlfUEFSSVRZKSkKKwkJCWZsYWcgPSBUVFlfUEFSSVRZOworCQllbHNlIGlmIChzdGF0dXMgJiAoMSA8PCBUVFlfRlJBTUUpKQorCQkJZmxhZyA9IFRUWV9GUkFNRTsKKwkJZWxzZQorCQkJZmxhZyA9IFRUWV9OT1JNQUw7CisKKwkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgZmxhZyk7CisJfQorCisJLyogb3ZlcnJ1biBpcyBzcGVjaWFsLCBzaW5jZSBpdCdzIHJlcG9ydGVkIGltbWVkaWF0ZWx5LCBhbmQgZG9lc24ndAorCSAqIGFmZmVjdCB0aGUgY3VycmVudCBjaGFyYWN0ZXIKKwkgKi8KKwlpZiAob3ZlcnJ1bikKKwkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfT1ZFUlJVTik7CisKKwljb3VudC0tOworCWlmIChjb3VudCA8PSAwKSB7CisJCWlmICghdHR5LT5sb3dfbGF0ZW5jeSkKKwkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CisJCXJldHVybjsKKwl9CisKK2lnbm9yZV9jaGFyOgorCXB1c2ggPSAxOworCWdvdG8gdHJ5X2FnYWluOworCitub3RfYnJlYWs6CisJcG9ydC0+cnhfYnJrID0gMDsKKwlnb3RvIHByb2Nlc3NfZXJyb3JzOworfQorCisvKgorICogaGFuZGxlIGFuIGludGVycnVwdCBmcm9tIHRoZSBzZXJpYWwgdHJhbnNtaXNzaW9uICJ2aXJ0dWFsIERNQSIgZHJpdmVyCisgKiAtIG5vdGU6IHRoZSBpbnRlcnJ1cHQgcm91dGluZSB3aWxsIGRpc2FibGUgaXRzIG93biBpbnRlcnJ1cHRzIHdoZW4gdGhlIFR4CisgKiAgIGJ1ZmZlciBpcyBlbXB0eQorICovCitzdGF0aWMgdm9pZCBtbjEwMzAwX3NlcmlhbF90cmFuc21pdF9pbnRlcnJ1cHQoc3RydWN0IG1uMTAzMDBfc2VyaWFsX3BvcnQgKnBvcnQpCit7CisJX2VudGVyKCIlcyIsIHBvcnQtPm5hbWUpOworCisJaWYgKHVhcnRfdHhfc3RvcHBlZCgmcG9ydC0+dWFydCkgfHwKKwkgICAgdWFydF9jaXJjX2VtcHR5KCZwb3J0LT51YXJ0LmluZm8tPnhtaXQpKQorCQltbjEwMzAwX3NlcmlhbF9kaXNfdHhfaW50cihwb3J0KTsKKworCWlmICh1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZygmcG9ydC0+dWFydC5pbmZvLT54bWl0KSA8IFdBS0VVUF9DSEFSUykKKwkJdWFydF93cml0ZV93YWtldXAoJnBvcnQtPnVhcnQpOworfQorCisvKgorICogZGVhbCB3aXRoIGEgY2hhbmdlIGluIHRoZSBzdGF0dXMgb2YgdGhlIENUUyBsaW5lCisgKi8KK3N0YXRpYyB2b2lkIG1uMTAzMDBfc2VyaWFsX2N0c19jaGFuZ2VkKHN0cnVjdCBtbjEwMzAwX3NlcmlhbF9wb3J0ICpwb3J0LCB1OCBzdCkKK3sKKwl1MTYgY3RyOworCisJcG9ydC0+dHhfY3RzID0gc3Q7CisJcG9ydC0+dWFydC5pY291bnQuY3RzKys7CisKKwkvKiBmbGlwIHRoZSBDVFMgc3RhdGUgc2VsZWN0b3IgZmxhZyB0byBpbnRlcnJ1cHQgd2hlbiBpdCBjaGFuZ2VzCisJICogYmFjayAqLworCWN0ciA9ICpwb3J0LT5fY29udHJvbDsKKwljdHIgXj0gU0MyQ1RSX1RXUzsKKwkqcG9ydC0+X2NvbnRyb2wgPSBjdHI7CisKKwl1YXJ0X2hhbmRsZV9jdHNfY2hhbmdlKCZwb3J0LT51YXJ0LCBzdCAmIFNDMlNUUl9DVFMpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+dWFydC5pbmZvLT5kZWx0YV9tc3Jfd2FpdCk7Cit9CisKKy8qCisgKiBoYW5kbGUgYSB2aXJ0dWFsIGludGVycnVwdCBnZW5lcmF0ZWQgYnkgdGhlIGxvd2VyIGxldmVsICJ2aXJ0dWFsIERNQSIKKyAqIHJvdXRpbmVzIChpcnEgaXMgdGhlIGJhdWQgdGltZXIgaW50ZXJydXB0KQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgbW4xMDMwMF9zZXJpYWxfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbW4xMDMwMF9zZXJpYWxfcG9ydCAqcG9ydCA9IGRldl9pZDsKKwl1OCBzdDsKKworCXNwaW5fbG9jaygmcG9ydC0+dWFydC5sb2NrKTsKKworCWlmIChwb3J0LT5pbnRyX2ZsYWdzKSB7CisJCV9kZWJ1ZygiSU5UICVzOiAleCIsIHBvcnQtPm5hbWUsIHBvcnQtPmludHJfZmxhZ3MpOworCisJCWlmIChtYXNrX3Rlc3RfYW5kX2NsZWFyKCZwb3J0LT5pbnRyX2ZsYWdzLCBNTlNDeF9SWF9BVkFJTCkpCisJCQltbjEwMzAwX3NlcmlhbF9yZWNlaXZlX2ludGVycnVwdChwb3J0KTsKKworCQlpZiAobWFza190ZXN0X2FuZF9jbGVhcigmcG9ydC0+aW50cl9mbGFncywKKwkJCQkJTU5TQ3hfVFhfU1BBQ0UgfCBNTlNDeF9UWF9FTVBUWSkpCisJCQltbjEwMzAwX3NlcmlhbF90cmFuc21pdF9pbnRlcnJ1cHQocG9ydCk7CisJfQorCisJLyogdGhlIG9ubHkgbW9kZW0gY29udHJvbCBsaW5lIGFtb25nc3QgdGhlIHdob2xlIGxvdCBpcyBDVFMgb24KKwkgKiBzZXJpYWwgcG9ydCAyICovCisJaWYgKHBvcnQtPnR5cGUgPT0gUE9SVF9NTjEwMzAwX0NUUykgeworCQlzdCA9ICpwb3J0LT5fc3RhdHVzOworCQlpZiAoKHBvcnQtPnR4X2N0cyBeIHN0KSAmIFNDMlNUUl9DVFMpCisJCQltbjEwMzAwX3NlcmlhbF9jdHNfY2hhbmdlZChwb3J0LCBzdCk7CisJfQorCisJc3Bpbl91bmxvY2soJnBvcnQtPnVhcnQubG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiByZXR1cm4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRoZSBoYXJkd2FyZSB0cmFuc21pdCBidWZmZXIgaXMgZW1wdHkKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBtbjEwMzAwX3NlcmlhbF90eF9lbXB0eShzdHJ1Y3QgdWFydF9wb3J0ICpfcG9ydCkKK3sKKwlzdHJ1Y3QgbW4xMDMwMF9zZXJpYWxfcG9ydCAqcG9ydCA9CisJCWNvbnRhaW5lcl9vZihfcG9ydCwgc3RydWN0IG1uMTAzMDBfc2VyaWFsX3BvcnQsIHVhcnQpOworCisJX2VudGVyKCIlcyIsIHBvcnQtPm5hbWUpOworCisJcmV0dXJuICgqcG9ydC0+X3N0YXR1cyAmIChTQzAxU1RSX1RYRiB8IFNDMDFTVFJfVEJGKSkgPworCQkwIDogVElPQ1NFUl9URU1UOworfQorCisvKgorICogc2V0IHRoZSBtb2RlbSBjb250cm9sIGxpbmVzICh3ZSBkb24ndCBoYXZlIGFueSkKKyAqLworc3RhdGljIHZvaWQgbW4xMDMwMF9zZXJpYWxfc2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKl9wb3J0LAorCQkJCSAgICAgdW5zaWduZWQgaW50IG1jdHJsKQoreworCXN0cnVjdCBtbjEwMzAwX3NlcmlhbF9wb3J0ICpwb3J0ID0KKwkJY29udGFpbmVyX29mKF9wb3J0LCBzdHJ1Y3QgbW4xMDMwMF9zZXJpYWxfcG9ydCwgdWFydCk7CisKKwlfZW50ZXIoIiVzLCV4IiwgcG9ydC0+bmFtZSwgbWN0cmwpOworfQorCisvKgorICogZ2V0IHRoZSBtb2RlbSBjb250cm9sIGxpbmUgc3RhdHVzZXMKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBtbjEwMzAwX3NlcmlhbF9nZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqX3BvcnQpCit7CisJc3RydWN0IG1uMTAzMDBfc2VyaWFsX3BvcnQgKnBvcnQgPQorCQljb250YWluZXJfb2YoX3BvcnQsIHN0cnVjdCBtbjEwMzAwX3NlcmlhbF9wb3J0LCB1YXJ0KTsKKworCV9lbnRlcigiJXMiLCBwb3J0LT5uYW1lKTsKKworCWlmIChwb3J0LT50eXBlID09IFBPUlRfTU4xMDMwMF9DVFMgJiYgISgqcG9ydC0+X3N0YXR1cyAmIFNDMlNUUl9DVFMpKQorCQlyZXR1cm4gVElPQ01fQ0FSIHwgVElPQ01fRFNSOworCisJcmV0dXJuIFRJT0NNX0NBUiB8IFRJT0NNX0NUUyB8IFRJT0NNX0RTUjsKK30KKworLyoKKyAqIHN0b3AgdHJhbnNtaXR0aW5nIGNoYXJhY3RlcnMKKyAqLworc3RhdGljIHZvaWQgbW4xMDMwMF9zZXJpYWxfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpfcG9ydCkKK3sKKwlzdHJ1Y3QgbW4xMDMwMF9zZXJpYWxfcG9ydCAqcG9ydCA9CisJCWNvbnRhaW5lcl9vZihfcG9ydCwgc3RydWN0IG1uMTAzMDBfc2VyaWFsX3BvcnQsIHVhcnQpOworCisJX2VudGVyKCIlcyIsIHBvcnQtPm5hbWUpOworCisJLyogZGlzYWJsZSB0aGUgdmlydHVhbCBETUEgKi8KKwltbjEwMzAwX3NlcmlhbF9kaXNfdHhfaW50cihwb3J0KTsKK30KKworLyoKKyAqIHN0YXJ0IHRyYW5zbWl0dGluZyBjaGFyYWN0ZXJzCisgKiAtIGp1bXAtc3RhcnQgdHJhbnNtaXNzaW9uIGlmIGl0IGhhcyBzdGFsbGVkCisgKiAgIC0gZW5hYmxlIHRoZSBzZXJpYWwgVHggaW50ZXJydXB0ICh1c2VkIGJ5IHRoZSB2aXJ0dWFsIERNQSBjb250cm9sbGVyKQorICogICAtIGZvcmNlIGFuIGludGVycnVwdCB0byBoYXBwZW4gaWYgbmVjZXNzYXJ5CisgKi8KK3N0YXRpYyB2b2lkIG1uMTAzMDBfc2VyaWFsX3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKl9wb3J0KQoreworCXN0cnVjdCBtbjEwMzAwX3NlcmlhbF9wb3J0ICpwb3J0ID0KKwkJY29udGFpbmVyX29mKF9wb3J0LCBzdHJ1Y3QgbW4xMDMwMF9zZXJpYWxfcG9ydCwgdWFydCk7CisKKwl1MTYgeDsKKworCV9lbnRlcigiJXN7JWx1fSIsCisJICAgICAgIHBvcnQtPm5hbWUsCisJICAgICAgIENJUkNfQ05UKCZwb3J0LT51YXJ0LmluZm8tPnhtaXQuaGVhZCwKKwkJCSZwb3J0LT51YXJ0LmluZm8tPnhtaXQudGFpbCwKKwkJCVVBUlRfWE1JVF9TSVpFKSk7CisKKwkvKiBraWNrIHRoZSB2aXJ0dWFsIERNQSBjb250cm9sbGVyICovCisJeCA9ICpwb3J0LT50eF9pY3I7CisJeCB8PSBHeElDUl9FTkFCTEU7CisKKwlpZiAoKnBvcnQtPl9zdGF0dXMgJiBTQzAxU1RSX1RCRikKKwkJeCAmPSB+KEd4SUNSX1JFUVVFU1QgfCBHeElDUl9ERVRFQ1QpOworCWVsc2UKKwkJeCB8PSBHeElDUl9SRVFVRVNUIHwgR3hJQ1JfREVURUNUOworCisJX2RlYnVnKCJDVFI9JTA0aHggSUNSPSUwMmh4IFNUUj0lMDR4IFRNRD0lMDJoeCBUQlI9JTA0aHggSUNSPSUwNGh4IiwKKwkgICAgICAgKnBvcnQtPl9jb250cm9sLCAqcG9ydC0+X2ludHIsICpwb3J0LT5fc3RhdHVzLAorCSAgICAgICAqcG9ydC0+X3RteG1kLCAqcG9ydC0+X3RteGJyLCAqcG9ydC0+dHhfaWNyKTsKKworCSpwb3J0LT50eF9pY3IgPSB4OworCXggPSAqcG9ydC0+dHhfaWNyOworfQorCisvKgorICogdHJhbnNtaXQgYSBoaWdoLXByaW9yaXR5IFhPTi9YT0ZGIGNoYXJhY3RlcgorICovCitzdGF0aWMgdm9pZCBtbjEwMzAwX3NlcmlhbF9zZW5kX3hjaGFyKHN0cnVjdCB1YXJ0X3BvcnQgKl9wb3J0LCBjaGFyIGNoKQoreworCXN0cnVjdCBtbjEwMzAwX3NlcmlhbF9wb3J0ICpwb3J0ID0KKwkJY29udGFpbmVyX29mKF9wb3J0LCBzdHJ1Y3QgbW4xMDMwMF9zZXJpYWxfcG9ydCwgdWFydCk7CisKKwlfZW50ZXIoIiVzLCUwMngiLCBwb3J0LT5uYW1lLCBjaCk7CisKKwlpZiAobGlrZWx5KHBvcnQtPmdkYnN0dWIpKSB7CisJCXBvcnQtPnR4X3hjaGFyID0gY2g7CisJCWlmIChjaCkKKwkJCW1uMTAzMDBfc2VyaWFsX2VuX3R4X2ludHIocG9ydCk7CisJfQorfQorCisvKgorICogc3RvcCByZWNlaXZpbmcgY2hhcmFjdGVycworICogLSBjYWxsZWQgd2hpbHN0IHRoZSBwb3J0IGlzIGJlaW5nIGNsb3NlZAorICovCitzdGF0aWMgdm9pZCBtbjEwMzAwX3NlcmlhbF9zdG9wX3J4KHN0cnVjdCB1YXJ0X3BvcnQgKl9wb3J0KQoreworCXN0cnVjdCBtbjEwMzAwX3NlcmlhbF9wb3J0ICpwb3J0ID0KKwkJY29udGFpbmVyX29mKF9wb3J0LCBzdHJ1Y3QgbW4xMDMwMF9zZXJpYWxfcG9ydCwgdWFydCk7CisKKwl1MTYgY3RyOworCisJX2VudGVyKCIlcyIsIHBvcnQtPm5hbWUpOworCisJY3RyID0gKnBvcnQtPl9jb250cm9sOworCWN0ciAmPSB+U0MwMUNUUl9SWEU7CisJKnBvcnQtPl9jb250cm9sID0gY3RyOworCisJbW4xMDMwMF9zZXJpYWxfZGlzX3J4X2ludHIocG9ydCk7Cit9CisKKy8qCisgKiBlbmFibGUgbW9kZW0gc3RhdHVzIGludGVycnVwdHMKKyAqLworc3RhdGljIHZvaWQgbW4xMDMwMF9zZXJpYWxfZW5hYmxlX21zKHN0cnVjdCB1YXJ0X3BvcnQgKl9wb3J0KQoreworCXN0cnVjdCBtbjEwMzAwX3NlcmlhbF9wb3J0ICpwb3J0ID0KKwkJY29udGFpbmVyX29mKF9wb3J0LCBzdHJ1Y3QgbW4xMDMwMF9zZXJpYWxfcG9ydCwgdWFydCk7CisKKwl1MTYgY3RyLCBjdHM7CisKKwlfZW50ZXIoIiVzIiwgcG9ydC0+bmFtZSk7CisKKwlpZiAocG9ydC0+dHlwZSA9PSBQT1JUX01OMTAzMDBfQ1RTKSB7CisJCS8qIHdhbnQgdG8gaW50ZXJydXB0IHdoZW4gQ1RTIGdvZXMgbG93IGlmIENUUyBpcyBub3cgaGlnaCBhbmQKKwkJICogdmljZSB2ZXJzYQorCQkgKi8KKwkJcG9ydC0+dHhfY3RzID0gKnBvcnQtPl9zdGF0dXM7CisKKwkJY3RzID0gKHBvcnQtPnR4X2N0cyAmIFNDMlNUUl9DVFMpID8KKwkJCVNDMkNUUl9UV0UgOiBTQzJDVFJfVFdFIHwgU0MyQ1RSX1RXUzsKKworCQljdHIgPSAqcG9ydC0+X2NvbnRyb2w7CisJCWN0ciAmPSB+U0MyQ1RSX1RXUzsKKwkJY3RyIHw9IGN0czsKKwkJKnBvcnQtPl9jb250cm9sID0gY3RyOworCisJCW1uMTAzMDBfc2VyaWFsX2VuX3R4X2ludHIocG9ydCk7CisJfQorfQorCisvKgorICogdHJhbnNtaXQgb3IgY2Vhc2UgdHJhbnNtaXR0aW5nIGEgYnJlYWsgc2lnbmFsCisgKi8KK3N0YXRpYyB2b2lkIG1uMTAzMDBfc2VyaWFsX2JyZWFrX2N0bChzdHJ1Y3QgdWFydF9wb3J0ICpfcG9ydCwgaW50IGN0bCkKK3sKKwlzdHJ1Y3QgbW4xMDMwMF9zZXJpYWxfcG9ydCAqcG9ydCA9CisJCWNvbnRhaW5lcl9vZihfcG9ydCwgc3RydWN0IG1uMTAzMDBfc2VyaWFsX3BvcnQsIHVhcnQpOworCisJX2VudGVyKCIlcywlZCIsIHBvcnQtPm5hbWUsIGN0bCk7CisKKwlpZiAoY3RsKSB7CisJCS8qIHRlbGwgdGhlIHZpcnR1YWwgRE1BIGhhbmRsZXIgdG8gYXNzZXJ0IEJSRUFLICovCisJCXBvcnQtPnR4X2JyZWFrID0gMTsKKwkJbW4xMDMwMF9zZXJpYWxfZW5fdHhfaW50cihwb3J0KTsKKwl9IGVsc2UgeworCQlwb3J0LT50eF9icmVhayA9IDA7CisJCSpwb3J0LT5fY29udHJvbCAmPSB+U0MwMUNUUl9CS0U7CisJCW1uMTAzMDBfc2VyaWFsX2VuX3R4X2ludHIocG9ydCk7CisJfQorfQorCisvKgorICogZ3JhYiB0aGUgaW50ZXJydXB0cyBhbmQgZW5hYmxlIHRoZSBwb3J0IGZvciByZWNlcHRpb24KKyAqLworc3RhdGljIGludCBtbjEwMzAwX3NlcmlhbF9zdGFydHVwKHN0cnVjdCB1YXJ0X3BvcnQgKl9wb3J0KQoreworCXN0cnVjdCBtbjEwMzAwX3NlcmlhbF9wb3J0ICpwb3J0ID0KKwkJY29udGFpbmVyX29mKF9wb3J0LCBzdHJ1Y3QgbW4xMDMwMF9zZXJpYWxfcG9ydCwgdWFydCk7CisJc3RydWN0IG1uMTAzMDBfc2VyaWFsX2ludCAqcGludDsKKworCV9lbnRlcigiJXN7JWR9IiwgcG9ydC0+bmFtZSwgcG9ydC0+Z2Ric3R1Yik7CisKKwlpZiAodW5saWtlbHkocG9ydC0+Z2Ric3R1YikpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBhbGxvY2F0ZSBhbiBSeCBidWZmZXIgZm9yIHRoZSB2aXJ0dWFsIERNQSBoYW5kbGVyICovCisJcG9ydC0+cnhfYnVmZmVyID0ga21hbGxvYyhNTlNDX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBvcnQtPnJ4X2J1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwb3J0LT5yeF9pbnAgPSBwb3J0LT5yeF9vdXRwID0gMDsKKworCS8qIGZpbmFsbHksIGVuYWJsZSB0aGUgZGV2aWNlICovCisJKnBvcnQtPl9pbnRyID0gU0MwMUlDUl9USTsKKwkqcG9ydC0+X2NvbnRyb2wgfD0gU0MwMUNUUl9UWEUgfCBTQzAxQ1RSX1JYRTsKKworCXBpbnQgPSAmbW4xMDMwMF9zZXJpYWxfaW50X3RibFtwb3J0LT5yeF9pcnFdOworCXBpbnQtPnBvcnQgPSBwb3J0OworCXBpbnQtPnZkbWEgPSBtbjEwMzAwX3NlcmlhbF92ZG1hX3J4X2hhbmRsZXI7CisJcGludCA9ICZtbjEwMzAwX3NlcmlhbF9pbnRfdGJsW3BvcnQtPnR4X2lycV07CisJcGludC0+cG9ydCA9IHBvcnQ7CisJcGludC0+dmRtYSA9IG1uMTAzMDBfc2VyaWFsX3ZkbWFfdHhfaGFuZGxlcjsKKworCXNldF9pbnRyX2xldmVsKHBvcnQtPnJ4X2lycSwgR3hJQ1JfTEVWRUxfMSk7CisJc2V0X2ludHJfbGV2ZWwocG9ydC0+dHhfaXJxLCBHeElDUl9MRVZFTF8xKTsKKwlzZXRfaXJxX2NoaXAocG9ydC0+dG1faXJxLCAmbW4xMDMwMF9zZXJpYWxfcGljKTsKKworCWlmIChyZXF1ZXN0X2lycShwb3J0LT5yeF9pcnEsIG1uMTAzMDBfc2VyaWFsX2ludGVycnVwdCwKKwkJCUlSUUZfRElTQUJMRUQsIHBvcnQtPnJ4X25hbWUsIHBvcnQpIDwgMCkKKwkJZ290byBlcnJvcjsKKworCWlmIChyZXF1ZXN0X2lycShwb3J0LT50eF9pcnEsIG1uMTAzMDBfc2VyaWFsX2ludGVycnVwdCwKKwkJCUlSUUZfRElTQUJMRUQsIHBvcnQtPnR4X25hbWUsIHBvcnQpIDwgMCkKKwkJZ290byBlcnJvcjI7CisKKwlpZiAocmVxdWVzdF9pcnEocG9ydC0+dG1faXJxLCBtbjEwMzAwX3NlcmlhbF9pbnRlcnJ1cHQsCisJCQlJUlFGX0RJU0FCTEVELCBwb3J0LT50bV9uYW1lLCBwb3J0KSA8IDApCisJCWdvdG8gZXJyb3IzOworCW1uMTAzMDBfc2VyaWFsX21hc2tfYWNrKHBvcnQtPnRtX2lycSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3IzOgorCWZyZWVfaXJxKHBvcnQtPnR4X2lycSwgcG9ydCk7CitlcnJvcjI6CisJZnJlZV9pcnEocG9ydC0+cnhfaXJxLCBwb3J0KTsKK2Vycm9yOgorCWtmcmVlKHBvcnQtPnJ4X2J1ZmZlcik7CisJcG9ydC0+cnhfYnVmZmVyID0gTlVMTDsKKwlyZXR1cm4gLUVCVVNZOworfQorCisvKgorICogc2h1dGRvd24gdGhlIHBvcnQgYW5kIHJlbGVhc2UgaW50ZXJydXB0cworICovCitzdGF0aWMgdm9pZCBtbjEwMzAwX3NlcmlhbF9zaHV0ZG93bihzdHJ1Y3QgdWFydF9wb3J0ICpfcG9ydCkKK3sKKwlzdHJ1Y3QgbW4xMDMwMF9zZXJpYWxfcG9ydCAqcG9ydCA9CisJCWNvbnRhaW5lcl9vZihfcG9ydCwgc3RydWN0IG1uMTAzMDBfc2VyaWFsX3BvcnQsIHVhcnQpOworCisJX2VudGVyKCIlcyIsIHBvcnQtPm5hbWUpOworCisJLyogZGlzYWJsZSB0aGUgc2VyaWFsIHBvcnQgYW5kIGl0cyBiYXVkIHJhdGUgdGltZXIgKi8KKwlwb3J0LT50eF9icmVhayA9IDA7CisJKnBvcnQtPl9jb250cm9sICY9IH4oU0MwMUNUUl9UWEUgfCBTQzAxQ1RSX1JYRSB8IFNDMDFDVFJfQktFKTsKKwkqcG9ydC0+X3RteG1kID0gMDsKKworCWlmIChwb3J0LT5yeF9idWZmZXIpIHsKKwkJdm9pZCAqYnVmID0gcG9ydC0+cnhfYnVmZmVyOworCQlwb3J0LT5yeF9idWZmZXIgPSBOVUxMOworCQlrZnJlZShidWYpOworCX0KKworCS8qIGRpc2FibGUgYWxsIGludHJzICovCisJZnJlZV9pcnEocG9ydC0+dG1faXJxLCBwb3J0KTsKKwlmcmVlX2lycShwb3J0LT5yeF9pcnEsIHBvcnQpOworCWZyZWVfaXJxKHBvcnQtPnR4X2lycSwgcG9ydCk7CisKKwkqcG9ydC0+cnhfaWNyID0gR3hJQ1JfTEVWRUxfMTsKKwkqcG9ydC0+dHhfaWNyID0gR3hJQ1JfTEVWRUxfMTsKK30KKworLyoKKyAqIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gc2V0IHRoZSBVQVJUIGRpdmlzb3IgcmVnaXN0ZXJzIHRvIG1hdGNoIHRoZQorICogc3BlY2lmaWVkIGJhdWQgcmF0ZSBmb3IgYSBzZXJpYWwgcG9ydC4KKyAqLworc3RhdGljIHZvaWQgbW4xMDMwMF9zZXJpYWxfY2hhbmdlX3NwZWVkKHN0cnVjdCBtbjEwMzAwX3NlcmlhbF9wb3J0ICpwb3J0LAorCQkJCQkgIHN0cnVjdCBrdGVybWlvcyAqbmV3LAorCQkJCQkgIHN0cnVjdCBrdGVybWlvcyAqb2xkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBpb2NsayA9IHBvcnQtPmlvY2xrOworCXVuc2lnbmVkIGNmbGFnOworCWludCBiYXVkLCBiaXRzLCB4ZGl2LCB0bXA7CisJdTE2IHRteGJyLCBzY3hjdHI7CisJdTggdG14bWQsIGJhdHRlbXB0OworCXU4IGRpdl90aW1lciA9IHBvcnQtPmRpdl90aW1lcjsKKworCV9lbnRlcigiJXN7JWx1fSIsIHBvcnQtPm5hbWUsIGlvY2xrKTsKKworCS8qIGJ5dGUgc2l6ZSBhbmQgcGFyaXR5ICovCisJY2ZsYWcgPSBuZXctPmNfY2ZsYWc7CisJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7CisJY2FzZSBDUzc6IHNjeGN0ciA9IFNDMDFDVFJfQ0xOXzdCSVQ7IGJpdHMgPSA5OyAgYnJlYWs7CisJY2FzZSBDUzg6IHNjeGN0ciA9IFNDMDFDVFJfQ0xOXzhCSVQ7IGJpdHMgPSAxMDsgYnJlYWs7CisJZGVmYXVsdDogIHNjeGN0ciA9IFNDMDFDVFJfQ0xOXzhCSVQ7IGJpdHMgPSAxMDsgYnJlYWs7CisJfQorCisJaWYgKGNmbGFnICYgQ1NUT1BCKSB7CisJCXNjeGN0ciB8PSBTQzAxQ1RSX1NUQl8yQklUOworCQliaXRzKys7CisJfQorCisJaWYgKGNmbGFnICYgUEFSRU5CKSB7CisJCWJpdHMrKzsKKwkJaWYgKGNmbGFnICYgUEFST0REKQorCQkJc2N4Y3RyIHw9IFNDMDFDVFJfUEJfT0REOworI2lmZGVmIENNU1BBUgorCQllbHNlIGlmIChjZmxhZyAmIENNU1BBUikKKwkJCXNjeGN0ciB8PSBTQzAxQ1RSX1BCX0ZJWEVEMDsKKyNlbmRpZgorCQllbHNlCisJCQlzY3hjdHIgfD0gU0MwMUNUUl9QQl9FVkVOOworCX0KKworCS8qIERldGVybWluZSBkaXZpc29yIGJhc2VkIG9uIGJhdWQgcmF0ZSAqLworCWJhdHRlbXB0ID0gMDsKKworCWlmIChkaXZfdGltZXIgPT0gTU5TQ3hfRElWX1RJTUVSXzE2QklUKQorCQlzY3hjdHIgfD0gU0MwQ1RSX0NLX1RNOFVGTE9XXzg7IC8qICggPT0gU0MxQ1RSX0NLX1RNOVVGTE9XXzgKKwkJCQkJCSAqICAgPT0gU0MyQ1RSX0NLX1RNMTBVRkxPVykgKi8KKwllbHNlIGlmIChkaXZfdGltZXIgPT0gTU5TQ3hfRElWX1RJTUVSXzhCSVQpCisJCXNjeGN0ciB8PSBTQzBDVFJfQ0tfVE0yVUZMT1dfODsKKwordHJ5X2FsdGVybmF0aXZlOgorCWJhdWQgPSB1YXJ0X2dldF9iYXVkX3JhdGUoJnBvcnQtPnVhcnQsIG5ldywgb2xkLCAwLAorCQkJCSAgcG9ydC0+aW9jbGsgLyA4KTsKKworCV9kZWJ1ZygiQUxUICVkIFtiYXVkICVkXSIsIGJhdHRlbXB0LCBiYXVkKTsKKworCWlmICghYmF1ZCkKKwkJYmF1ZCA9IDk2MDA7CS8qIEIwIHRyYW5zaXRpb24gaGFuZGxlZCBpbiByc19zZXRfdGVybWlvcyAqLworCXhkaXYgPSAxOworCWlmIChiYXVkID09IDEzNCkgeworCQliYXVkID0gMjY5OwkvKiAxMzQgaXMgcmVhbGx5IDEzNC41ICovCisJCXhkaXYgPSAyOworCX0KKworCWlmIChiYXVkID09IDM4NDAwICYmCisJICAgIChwb3J0LT51YXJ0LmZsYWdzICYgVVBGX1NQRF9NQVNLKSA9PSBVUEZfU1BEX0NVU1QKKwkgICAgKSB7CisJCV9kZWJ1ZygiQ1VTVE9NICV1IiwgcG9ydC0+dWFydC5jdXN0b21fZGl2aXNvcik7CisKKwkJaWYgKGRpdl90aW1lciA9PSBNTlNDeF9ESVZfVElNRVJfMTZCSVQpIHsKKwkJCWlmIChwb3J0LT51YXJ0LmN1c3RvbV9kaXZpc29yIDw9IDY1NTM1KSB7CisJCQkJdG14bWQgPSBUTThNRF9TUkNfSU9DTEs7CisJCQkJdG14YnIgPSBwb3J0LT51YXJ0LmN1c3RvbV9kaXZpc29yOworCQkJCXBvcnQtPnVhcnQudWFydGNsayA9IGlvY2xrOworCQkJCWdvdG8gdGltZXJfb2theTsKKwkJCX0KKwkJCWlmIChwb3J0LT51YXJ0LmN1c3RvbV9kaXZpc29yIC8gOCA8PSA2NTUzNSkgeworCQkJCXRteG1kID0gVE04TURfU1JDX0lPQ0xLXzg7CisJCQkJdG14YnIgPSBwb3J0LT51YXJ0LmN1c3RvbV9kaXZpc29yIC8gODsKKwkJCQlwb3J0LT51YXJ0LmN1c3RvbV9kaXZpc29yID0gdG14YnIgKiA4OworCQkJCXBvcnQtPnVhcnQudWFydGNsayA9IGlvY2xrIC8gODsKKwkJCQlnb3RvIHRpbWVyX29rYXk7CisJCQl9CisJCQlpZiAocG9ydC0+dWFydC5jdXN0b21fZGl2aXNvciAvIDMyIDw9IDY1NTM1KSB7CisJCQkJdG14bWQgPSBUTThNRF9TUkNfSU9DTEtfMzI7CisJCQkJdG14YnIgPSBwb3J0LT51YXJ0LmN1c3RvbV9kaXZpc29yIC8gMzI7CisJCQkJcG9ydC0+dWFydC5jdXN0b21fZGl2aXNvciA9IHRteGJyICogMzI7CisJCQkJcG9ydC0+dWFydC51YXJ0Y2xrID0gaW9jbGsgLyAzMjsKKwkJCQlnb3RvIHRpbWVyX29rYXk7CisJCQl9CisKKwkJfSBlbHNlIGlmIChkaXZfdGltZXIgPT0gTU5TQ3hfRElWX1RJTUVSXzhCSVQpIHsKKwkJCWlmIChwb3J0LT51YXJ0LmN1c3RvbV9kaXZpc29yIDw9IDI1NSkgeworCQkJCXRteG1kID0gVE0yTURfU1JDX0lPQ0xLOworCQkJCXRteGJyID0gcG9ydC0+dWFydC5jdXN0b21fZGl2aXNvcjsKKwkJCQlwb3J0LT51YXJ0LnVhcnRjbGsgPSBpb2NsazsKKwkJCQlnb3RvIHRpbWVyX29rYXk7CisJCQl9CisJCQlpZiAocG9ydC0+dWFydC5jdXN0b21fZGl2aXNvciAvIDggPD0gMjU1KSB7CisJCQkJdG14bWQgPSBUTTJNRF9TUkNfSU9DTEtfODsKKwkJCQl0bXhiciA9IHBvcnQtPnVhcnQuY3VzdG9tX2Rpdmlzb3IgLyA4OworCQkJCXBvcnQtPnVhcnQuY3VzdG9tX2Rpdmlzb3IgPSB0bXhiciAqIDg7CisJCQkJcG9ydC0+dWFydC51YXJ0Y2xrID0gaW9jbGsgLyA4OworCQkJCWdvdG8gdGltZXJfb2theTsKKwkJCX0KKwkJCWlmIChwb3J0LT51YXJ0LmN1c3RvbV9kaXZpc29yIC8gMzIgPD0gMjU1KSB7CisJCQkJdG14bWQgPSBUTTJNRF9TUkNfSU9DTEtfMzI7CisJCQkJdG14YnIgPSBwb3J0LT51YXJ0LmN1c3RvbV9kaXZpc29yIC8gMzI7CisJCQkJcG9ydC0+dWFydC5jdXN0b21fZGl2aXNvciA9IHRteGJyICogMzI7CisJCQkJcG9ydC0+dWFydC51YXJ0Y2xrID0gaW9jbGsgLyAzMjsKKwkJCQlnb3RvIHRpbWVyX29rYXk7CisJCQl9CisJCX0KKwl9CisKKwlzd2l0Y2ggKGRpdl90aW1lcikgeworCWNhc2UgTU5TQ3hfRElWX1RJTUVSXzE2QklUOgorCQlwb3J0LT51YXJ0LnVhcnRjbGsgPSBpb2NsazsKKwkJdG14bWQgPSBUTThNRF9TUkNfSU9DTEs7CisJCXRteGJyID0gdG1wID0gKGlvY2xrIC8gKGJhdWQgKiB4ZGl2KSArIDQpIC8gOCAtIDE7CisJCWlmICh0bXAgPiAwICYmIHRtcCA8PSA2NTUzNSkKKwkJCWdvdG8gdGltZXJfb2theTsKKworCQlwb3J0LT51YXJ0LnVhcnRjbGsgPSBpb2NsayAvIDg7CisJCXRteG1kID0gVE04TURfU1JDX0lPQ0xLXzg7CisJCXRteGJyID0gdG1wID0gKGlvY2xrIC8gKGJhdWQgKiA4ICogeGRpdikgKyA0KSAvIDggLSAxOworCQlpZiAodG1wID4gMCAmJiB0bXAgPD0gNjU1MzUpCisJCQlnb3RvIHRpbWVyX29rYXk7CisKKwkJcG9ydC0+dWFydC51YXJ0Y2xrID0gaW9jbGsgLyAzMjsKKwkJdG14bWQgPSBUTThNRF9TUkNfSU9DTEtfMzI7CisJCXRteGJyID0gdG1wID0gKGlvY2xrIC8gKGJhdWQgKiAzMiAqIHhkaXYpICsgNCkgLyA4IC0gMTsKKwkJaWYgKHRtcCA+IDAgJiYgdG1wIDw9IDY1NTM1KQorCQkJZ290byB0aW1lcl9va2F5OworCQlicmVhazsKKworCWNhc2UgTU5TQ3hfRElWX1RJTUVSXzhCSVQ6CisJCXBvcnQtPnVhcnQudWFydGNsayA9IGlvY2xrOworCQl0bXhtZCA9IFRNMk1EX1NSQ19JT0NMSzsKKwkJdG14YnIgPSB0bXAgPSAoaW9jbGsgLyAoYmF1ZCAqIHhkaXYpICsgNCkgLyA4IC0gMTsKKwkJaWYgKHRtcCA+IDAgJiYgdG1wIDw9IDI1NSkKKwkJCWdvdG8gdGltZXJfb2theTsKKworCQlwb3J0LT51YXJ0LnVhcnRjbGsgPSBpb2NsayAvIDg7CisJCXRteG1kID0gVE0yTURfU1JDX0lPQ0xLXzg7CisJCXRteGJyID0gdG1wID0gKGlvY2xrIC8gKGJhdWQgKiA4ICogeGRpdikgKyA0KSAvIDggLSAxOworCQlpZiAodG1wID4gMCAmJiB0bXAgPD0gMjU1KQorCQkJZ290byB0aW1lcl9va2F5OworCisJCXBvcnQtPnVhcnQudWFydGNsayA9IGlvY2xrIC8gMzI7CisJCXRteG1kID0gVE0yTURfU1JDX0lPQ0xLXzMyOworCQl0bXhiciA9IHRtcCA9IChpb2NsayAvIChiYXVkICogMzIgKiB4ZGl2KSArIDQpIC8gOCAtIDE7CisJCWlmICh0bXAgPiAwICYmIHRtcCA8PSAyNTUpCisJCQlnb3RvIHRpbWVyX29rYXk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybjsKKwl9CisKKwkvKiByZWZ1c2UgdG8gY2hhbmdlIHRvIGEgYmF1ZCByYXRlIHdlIGNhbid0IHN1cHBvcnQgKi8KKwlfZGVidWcoIkNBTidUIFNVUFBPUlQiKTsKKworCXN3aXRjaCAoYmF0dGVtcHQpIHsKKwljYXNlIDA6CisJCWlmIChvbGQpIHsKKwkJCW5ldy0+Y19jZmxhZyAmPSB+Q0JBVUQ7CisJCQluZXctPmNfY2ZsYWcgfD0gKG9sZC0+Y19jZmxhZyAmIENCQVVEKTsKKwkJCWJhdHRlbXB0ID0gMTsKKwkJCWdvdG8gdHJ5X2FsdGVybmF0aXZlOworCQl9CisKKwljYXNlIDE6CisJCS8qIGFzIGEgbGFzdCByZXNvcnQsIGlmIHRoZSBxdW90aWVudCBpcyB6ZXJvLCBkZWZhdWx0IHRvIDk2MDAKKwkJICogYnBzICovCisJCW5ldy0+Y19jZmxhZyAmPSB+Q0JBVUQ7CisJCW5ldy0+Y19jZmxhZyB8PSBCOTYwMDsKKwkJYmF0dGVtcHQgPSAyOworCQlnb3RvIHRyeV9hbHRlcm5hdGl2ZTsKKworCWRlZmF1bHQ6CisJCS8qIGhtbW0uLi4gY2FuJ3Qgc2VlbSB0byBzdXBwb3J0IDk2MDAgZWl0aGVyCisJCSAqIC0gd2UgY291bGQgdHJ5IGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBzcGVlZHMgd2Uga25vdyBhYm91dCB0bworCQkgKiAgIGZpbmQgdGhlIGxvd2VzdAorCQkgKi8KKwkJbmV3LT5jX2NmbGFnICY9IH5DQkFVRDsKKwkJbmV3LT5jX2NmbGFnIHw9IEIwOworCisJCWlmIChkaXZfdGltZXIgPT0gTU5TQ3hfRElWX1RJTUVSXzE2QklUKQorCQkJdG14bWQgPSBUTThNRF9TUkNfSU9DTEtfMzI7CisJCWVsc2UgaWYgKGRpdl90aW1lciA9PSBNTlNDeF9ESVZfVElNRVJfOEJJVCkKKwkJCXRteG1kID0gVE0yTURfU1JDX0lPQ0xLXzMyOworCQl0bXhiciA9IDE7CisKKwkJcG9ydC0+dWFydC51YXJ0Y2xrID0gaW9jbGsgLyAzMjsKKwkJYnJlYWs7CisJfQordGltZXJfb2theToKKworCV9kZWJ1ZygiVUFSVENMSzogJXUgLyAlaHUiLCBwb3J0LT51YXJ0LnVhcnRjbGssIHRteGJyKTsKKworCS8qIG1ha2UgdGhlIGNoYW5nZXMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+dWFydC5sb2NrLCBmbGFncyk7CisKKwl1YXJ0X3VwZGF0ZV90aW1lb3V0KCZwb3J0LT51YXJ0LCBuZXctPmNfY2ZsYWcsIGJhdWQpOworCisJLyogc2V0IHRoZSB0aW1lciB0byBwcm9kdWNlIHRoZSByZXF1aXJlZCBiYXVkIHJhdGUgKi8KKwlzd2l0Y2ggKGRpdl90aW1lcikgeworCWNhc2UgTU5TQ3hfRElWX1RJTUVSXzE2QklUOgorCQkqcG9ydC0+X3RteG1kID0gMDsKKwkJKnBvcnQtPl90bXhiciA9IHRteGJyOworCQkqcG9ydC0+X3RteG1kID0gVE04TURfSU5JVF9DT1VOVEVSOworCQkqcG9ydC0+X3RteG1kID0gdG14bWQgfCBUTThNRF9DT1VOVF9FTkFCTEU7CisJCWJyZWFrOworCisJY2FzZSBNTlNDeF9ESVZfVElNRVJfOEJJVDoKKwkJKnBvcnQtPl90bXhtZCA9IDA7CisJCSoodm9sYXRpbGUgdTggKikgcG9ydC0+X3RteGJyID0gKHU4KSB0bXhicjsKKwkJKnBvcnQtPl90bXhtZCA9IFRNMk1EX0lOSVRfQ09VTlRFUjsKKwkJKnBvcnQtPl90bXhtZCA9IHRteG1kIHwgVE0yTURfQ09VTlRfRU5BQkxFOworCQlicmVhazsKKwl9CisKKwkvKiBDVFMgZmxvdyBjb250cm9sIGZsYWcgYW5kIG1vZGVtIHN0YXR1cyBpbnRlcnJ1cHRzICovCisJc2N4Y3RyICY9IH4oU0MyQ1RSX1RXRSB8IFNDMkNUUl9UV1MpOworCisJaWYgKHBvcnQtPnR5cGUgPT0gUE9SVF9NTjEwMzAwX0NUUyAmJiBjZmxhZyAmIENSVFNDVFMpIHsKKwkJLyogd2FudCB0byBpbnRlcnJ1cHQgd2hlbiBDVFMgZ29lcyBsb3cgaWYgQ1RTIGlzIG5vdworCQkgKiBoaWdoIGFuZCB2aWNlIHZlcnNhCisJCSAqLworCQlwb3J0LT50eF9jdHMgPSAqcG9ydC0+X3N0YXR1czsKKworCQlpZiAocG9ydC0+dHhfY3RzICYgU0MyU1RSX0NUUykKKwkJCXNjeGN0ciB8PSBTQzJDVFJfVFdFOworCQllbHNlCisJCQlzY3hjdHIgfD0gU0MyQ1RSX1RXRSB8IFNDMkNUUl9UV1M7CisJfQorCisJLyogc2V0IHVwIHBhcml0eSBjaGVjayBmbGFnICovCisJcG9ydC0+dWFydC5yZWFkX3N0YXR1c19tYXNrID0gKDEgPDwgVFRZX05PUk1BTCkgfCAoMSA8PCBUVFlfT1ZFUlJVTik7CisJaWYgKG5ldy0+Y19pZmxhZyAmIElOUENLKQorCQlwb3J0LT51YXJ0LnJlYWRfc3RhdHVzX21hc2sgfD0KKwkJCSgxIDw8IFRUWV9QQVJJVFkpIHwgKDEgPDwgVFRZX0ZSQU1FKTsKKwlpZiAobmV3LT5jX2lmbGFnICYgKEJSS0lOVCB8IFBBUk1SSykpCisJCXBvcnQtPnVhcnQucmVhZF9zdGF0dXNfbWFzayB8PSAoMSA8PCBUVFlfQlJFQUspOworCisJLyogY2hhcmFjdGVycyB0byBpZ25vcmUgKi8KKwlwb3J0LT51YXJ0Lmlnbm9yZV9zdGF0dXNfbWFzayA9IDA7CisJaWYgKG5ldy0+Y19pZmxhZyAmIElHTlBBUikKKwkJcG9ydC0+dWFydC5pZ25vcmVfc3RhdHVzX21hc2sgfD0KKwkJCSgxIDw8IFRUWV9QQVJJVFkpIHwgKDEgPDwgVFRZX0ZSQU1FKTsKKwlpZiAobmV3LT5jX2lmbGFnICYgSUdOQlJLKSB7CisJCXBvcnQtPnVhcnQuaWdub3JlX3N0YXR1c19tYXNrIHw9ICgxIDw8IFRUWV9CUkVBSyk7CisJCS8qCisJCSAqIElmIHdlJ3JlIGlnbm9yaW5nIHBhcml0eSBhbmQgYnJlYWsgaW5kaWNhdG9ycywKKwkJICogaWdub3JlIG92ZXJydW5zIHRvIChmb3IgcmVhbCByYXcgc3VwcG9ydCkuCisJCSAqLworCQlpZiAobmV3LT5jX2lmbGFnICYgSUdOUEFSKQorCQkJcG9ydC0+dWFydC5pZ25vcmVfc3RhdHVzX21hc2sgfD0gKDEgPDwgVFRZX09WRVJSVU4pOworCX0KKworCS8qIElnbm9yZSBhbGwgY2hhcmFjdGVycyBpZiBDUkVBRCBpcyBub3Qgc2V0ICovCisJaWYgKChuZXctPmNfY2ZsYWcgJiBDUkVBRCkgPT0gMCkKKwkJcG9ydC0+dWFydC5pZ25vcmVfc3RhdHVzX21hc2sgfD0gKDEgPDwgVFRZX05PUk1BTCk7CisKKwlzY3hjdHIgfD0gKnBvcnQtPl9jb250cm9sICYgKFNDMDFDVFJfVFhFIHwgU0MwMUNUUl9SWEUgfCBTQzAxQ1RSX0JLRSk7CisJKnBvcnQtPl9jb250cm9sID0gc2N4Y3RyOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+dWFydC5sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBzZXQgdGhlIHRlcm1pbmFsIEkvTyBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyB2b2lkIG1uMTAzMDBfc2VyaWFsX3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKl9wb3J0LAorCQkJCQkgc3RydWN0IGt0ZXJtaW9zICpuZXcsCisJCQkJCSBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCkKK3sKKwlzdHJ1Y3QgbW4xMDMwMF9zZXJpYWxfcG9ydCAqcG9ydCA9CisJCWNvbnRhaW5lcl9vZihfcG9ydCwgc3RydWN0IG1uMTAzMDBfc2VyaWFsX3BvcnQsIHVhcnQpOworCisJX2VudGVyKCIlcywlcCwlcCIsIHBvcnQtPm5hbWUsIG5ldywgb2xkKTsKKworCW1uMTAzMDBfc2VyaWFsX2NoYW5nZV9zcGVlZChwb3J0LCBuZXcsIG9sZCk7CisKKwkvKiBoYW5kbGUgdHVybmluZyBvZmYgQ1JUU0NUUyAqLworCWlmICghKG5ldy0+Y19jZmxhZyAmIENSVFNDVFMpKSB7CisJCXUxNiBjdHIgPSAqcG9ydC0+X2NvbnRyb2w7CisJCWN0ciAmPSB+U0MyQ1RSX1RXRTsKKwkJKnBvcnQtPl9jb250cm9sID0gY3RyOworCX0KK30KKworLyoKKyAqIHJldHVybiBkZXNjcmlwdGlvbiBvZiBwb3J0IHR5cGUKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKm1uMTAzMDBfc2VyaWFsX3R5cGUoc3RydWN0IHVhcnRfcG9ydCAqX3BvcnQpCit7CisJc3RydWN0IG1uMTAzMDBfc2VyaWFsX3BvcnQgKnBvcnQgPQorCQljb250YWluZXJfb2YoX3BvcnQsIHN0cnVjdCBtbjEwMzAwX3NlcmlhbF9wb3J0LCB1YXJ0KTsKKworCWlmIChwb3J0LT51YXJ0LnR5cGUgPT0gUE9SVF9NTjEwMzAwX0NUUykKKwkJcmV0dXJuICJNTjEwMzAwIFNJRl9DVFMiOworCisJcmV0dXJuICJNTjEwMzAwIFNJRiI7Cit9CisKKy8qCisgKiByZWxlYXNlIEkvTyBhbmQgbWVtb3J5IHJlZ2lvbnMgaW4gdXNlIGJ5IHBvcnQKKyAqLworc3RhdGljIHZvaWQgbW4xMDMwMF9zZXJpYWxfcmVsZWFzZV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKl9wb3J0KQoreworCXN0cnVjdCBtbjEwMzAwX3NlcmlhbF9wb3J0ICpwb3J0ID0KKwkJY29udGFpbmVyX29mKF9wb3J0LCBzdHJ1Y3QgbW4xMDMwMF9zZXJpYWxfcG9ydCwgdWFydCk7CisKKwlfZW50ZXIoIiVzIiwgcG9ydC0+bmFtZSk7CisKKwlyZWxlYXNlX21lbV9yZWdpb24oKHVuc2lnbmVkIGxvbmcpIHBvcnQtPl9pb2Jhc2UsIDE2KTsKK30KKworLyoKKyAqIHJlcXVlc3QgSS9PIGFuZCBtZW1vcnkgcmVnaW9ucyBmb3IgcG9ydAorICovCitzdGF0aWMgaW50IG1uMTAzMDBfc2VyaWFsX3JlcXVlc3RfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpfcG9ydCkKK3sKKwlzdHJ1Y3QgbW4xMDMwMF9zZXJpYWxfcG9ydCAqcG9ydCA9CisJCWNvbnRhaW5lcl9vZihfcG9ydCwgc3RydWN0IG1uMTAzMDBfc2VyaWFsX3BvcnQsIHVhcnQpOworCisJX2VudGVyKCIlcyIsIHBvcnQtPm5hbWUpOworCisJcmVxdWVzdF9tZW1fcmVnaW9uKCh1bnNpZ25lZCBsb25nKSBwb3J0LT5faW9iYXNlLCAxNiwgcG9ydC0+bmFtZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBjb25maWd1cmUgdGhlIHR5cGUgYW5kIHJlc2VydmUgdGhlIHBvcnRzCisgKi8KK3N0YXRpYyB2b2lkIG1uMTAzMDBfc2VyaWFsX2NvbmZpZ19wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKl9wb3J0LCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgbW4xMDMwMF9zZXJpYWxfcG9ydCAqcG9ydCA9CisJCWNvbnRhaW5lcl9vZihfcG9ydCwgc3RydWN0IG1uMTAzMDBfc2VyaWFsX3BvcnQsIHVhcnQpOworCisJX2VudGVyKCIlcyIsIHBvcnQtPm5hbWUpOworCisJcG9ydC0+dWFydC50eXBlID0gUE9SVF9NTjEwMzAwOworCisJaWYgKHBvcnQtPm9wdGlvbnMgJiBNTlNDeF9PUFRfQ1RTKQorCQlwb3J0LT51YXJ0LnR5cGUgPSBQT1JUX01OMTAzMDBfQ1RTOworCisJbW4xMDMwMF9zZXJpYWxfcmVxdWVzdF9wb3J0KF9wb3J0KTsKK30KKworLyoKKyAqIHZlcmlmeSBzZXJpYWwgcGFyYW1ldGVycyBhcmUgc3VpdGFibGUgZm9yIHRoaXMgcG9ydCB0eXBlCisgKi8KK3N0YXRpYyBpbnQgbW4xMDMwMF9zZXJpYWxfdmVyaWZ5X3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqX3BvcnQsCisJCQkJCXN0cnVjdCBzZXJpYWxfc3RydWN0ICpzcykKK3sKKwlzdHJ1Y3QgbW4xMDMwMF9zZXJpYWxfcG9ydCAqcG9ydCA9CisJCWNvbnRhaW5lcl9vZihfcG9ydCwgc3RydWN0IG1uMTAzMDBfc2VyaWFsX3BvcnQsIHVhcnQpOworCXZvaWQgKm1hcGJhc2UgPSAodm9pZCAqKSAodW5zaWduZWQgbG9uZykgcG9ydC0+dWFydC5tYXBiYXNlOworCisJX2VudGVyKCIlcyIsIHBvcnQtPm5hbWUpOworCisJLyogdGhlc2UgdGhpbmdzIG1heSBub3QgYmUgY2hhbmdlZCAqLworCWlmIChzcy0+aXJxCQkhPSBwb3J0LT51YXJ0LmlycQl8fAorCSAgICBzcy0+cG9ydAkJIT0gcG9ydC0+dWFydC5pb2Jhc2UJfHwKKwkgICAgc3MtPmlvX3R5cGUJCSE9IHBvcnQtPnVhcnQuaW90eXBlCXx8CisJICAgIHNzLT5pb21lbV9iYXNlCSE9IG1hcGJhc2UgfHwKKwkgICAgc3MtPmlvbWVtX3JlZ19zaGlmdAkhPSBwb3J0LT51YXJ0LnJlZ3NoaWZ0CXx8CisJICAgIHNzLT5odWI2CQkhPSBwb3J0LT51YXJ0Lmh1YjYJfHwKKwkgICAgc3MtPnhtaXRfZmlmb19zaXplCSE9IHBvcnQtPnVhcnQuZmlmb3NpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogdHlwZSBtYXkgYmUgY2hhbmdlZCBvbiBhIHBvcnQgdGhhdCBzdXBwb3J0cyBDVFMgKi8KKwlpZiAoc3MtPnR5cGUgIT0gcG9ydC0+dWFydC50eXBlKSB7CisJCWlmICghKHBvcnQtPm9wdGlvbnMgJiBNTlNDeF9PUFRfQ1RTKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChzcy0+dHlwZSAhPSBQT1JUX01OMTAzMDAgJiYKKwkJICAgIHNzLT50eXBlICE9IFBPUlRfTU4xMDMwMF9DVFMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGluaXRpYWxpc2UgdGhlIE1OMTAzMDAgb24tY2hpcCBVQVJUcworICovCitzdGF0aWMgaW50IF9faW5pdCBtbjEwMzAwX3NlcmlhbF9pbml0KHZvaWQpCit7CisJc3RydWN0IG1uMTAzMDBfc2VyaWFsX3BvcnQgKnBvcnQ7CisJaW50IHJldCwgaTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzIHZlcnNpb24gJXMgKCVzKVxuIiwKKwkgICAgICAgc2VyaWFsX25hbWUsIHNlcmlhbF92ZXJzaW9uLCBzZXJpYWxfcmV2ZGF0ZSk7CisKKyNpZmRlZiBDT05GSUdfTU4xMDMwMF9UVFlTTTIKKwlTQzJUSU0gPSA4OyAvKiBtYWtlIHRoZSBiYXVkIGJhc2Ugb2YgdGltZXIgMiBJT0NMSy84ICovCisjZW5kaWYKKworCXNldF9pbnRyX3N0dWIoRVhDRVBfSVJRX0xFVkVMMSwgbW4xMDMwMF9zZXJpYWxfdmRtYV9pbnRlcnJ1cHQpOworCisJcmV0ID0gdWFydF9yZWdpc3Rlcl9kcml2ZXIoJm1uMTAzMDBfc2VyaWFsX2RyaXZlcik7CisJaWYgKCFyZXQpIHsKKwkJZm9yIChpID0gMCA7IGkgPCBOUl9QT1JUUyA7IGkrKykgeworCQkJcG9ydCA9IG1uMTAzMDBfc2VyaWFsX3BvcnRzW2ldOworCQkJaWYgKCFwb3J0IHx8IHBvcnQtPmdkYnN0dWIpCisJCQkJY29udGludWU7CisKKwkJCXN3aXRjaCAocG9ydC0+Y2xvY2tfc3JjKSB7CisJCQljYXNlIE1OU0N4X0NMT0NLX1NSQ19JT0NMSzoKKwkJCQlwb3J0LT5pb2NsayA9IE1OMTAzMDBfSU9DTEs7CisJCQkJYnJlYWs7CisKKyNpZmRlZiBNTjEwMzAwX0lPQkNMSworCQkJY2FzZSBNTlNDeF9DTE9DS19TUkNfSU9CQ0xLOgorCQkJCXBvcnQtPmlvY2xrID0gTU4xMDMwMF9JT0JDTEs7CisJCQkJYnJlYWs7CisjZW5kaWYKKwkJCWRlZmF1bHQ6CisJCQkJQlVHKCk7CisJCQl9CisKKwkJCXJldCA9IHVhcnRfYWRkX29uZV9wb3J0KCZtbjEwMzAwX3NlcmlhbF9kcml2ZXIsCisJCQkJCQkmcG9ydC0+dWFydCk7CisKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJX2RlYnVnKCJFUlJPUiAlZCIsIC1yZXQpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKHJldCkKKwkJCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJm1uMTAzMDBfc2VyaWFsX2RyaXZlcik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworX19pbml0Y2FsbChtbjEwMzAwX3NlcmlhbF9pbml0KTsKKworCisjaWZkZWYgQ09ORklHX01OMTAzMDBfVFRZU01fQ09OU09MRQorCisvKgorICogcHJpbnQgYSBzdHJpbmcgdG8gdGhlIHNlcmlhbCBwb3J0IHdpdGhvdXQgZGlzdHVyYmluZyB0aGUgcmVhbCB1c2VyIG9mIHRoZQorICogcG9ydCB0b28gbXVjaAorICogLSB0aGUgY29uc29sZSBtdXN0IGJlIGxvY2tlZCBieSB0aGUgY2FsbGVyCisgKi8KK3N0YXRpYyB2b2lkIG1uMTAzMDBfc2VyaWFsX2NvbnNvbGVfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvLAorCQkJCQkgICBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBjb3VudCkKK3sKKwlzdHJ1Y3QgbW4xMDMwMF9zZXJpYWxfcG9ydCAqcG9ydDsKKwl1bnNpZ25lZCBpOworCXUxNiBzY3hjdHIsIHR4aWNyLCB0bXA7CisJdTggdG14bWQ7CisKKwlwb3J0ID0gbW4xMDMwMF9zZXJpYWxfcG9ydHNbY28tPmluZGV4XTsKKworCS8qIGZpcnN0bHkgaGlqYWNrIHRoZSBzZXJpYWwgcG9ydCBmcm9tIHRoZSAidmlydHVhbCBETUEiIGNvbnRyb2xsZXIgKi8KKwl0eGljciA9ICpwb3J0LT50eF9pY3I7CisJKnBvcnQtPnR4X2ljciA9IEd4SUNSX0xFVkVMXzE7CisJdG1wID0gKnBvcnQtPnR4X2ljcjsKKworCS8qIHRoZSB0cmFuc21pdHRlciBtYXkgYmUgZGlzYWJsZWQgKi8KKwlzY3hjdHIgPSAqcG9ydC0+X2NvbnRyb2w7CisJaWYgKCEoc2N4Y3RyICYgU0MwMUNUUl9UWEUpKSB7CisJCS8qIHJlc3RhcnQgdGhlIFVBUlQgY2xvY2sgKi8KKwkJdG14bWQgPSAqcG9ydC0+X3RteG1kOworCisJCXN3aXRjaCAocG9ydC0+ZGl2X3RpbWVyKSB7CisJCWNhc2UgTU5TQ3hfRElWX1RJTUVSXzE2QklUOgorCQkJKnBvcnQtPl90bXhtZCA9IDA7CisJCQkqcG9ydC0+X3RteG1kID0gVE04TURfSU5JVF9DT1VOVEVSOworCQkJKnBvcnQtPl90bXhtZCA9IHRteG1kIHwgVE04TURfQ09VTlRfRU5BQkxFOworCQkJYnJlYWs7CisKKwkJY2FzZSBNTlNDeF9ESVZfVElNRVJfOEJJVDoKKwkJCSpwb3J0LT5fdG14bWQgPSAwOworCQkJKnBvcnQtPl90bXhtZCA9IFRNMk1EX0lOSVRfQ09VTlRFUjsKKwkJCSpwb3J0LT5fdG14bWQgPSB0bXhtZCB8IFRNMk1EX0NPVU5UX0VOQUJMRTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogZW5hYmxlIHRoZSB0cmFuc21pdHRlciAqLworCQkqcG9ydC0+X2NvbnRyb2wgPSAoc2N4Y3RyICYgflNDMDFDVFJfQktFKSB8IFNDMDFDVFJfVFhFOworCisJfSBlbHNlIGlmIChzY3hjdHIgJiBTQzAxQ1RSX0JLRSkgeworCQkvKiBzdG9wIHRyYW5zbWl0dGluZyBCUkVBSyAqLworCQkqcG9ydC0+X2NvbnRyb2wgPSAoc2N4Y3RyICYgflNDMDFDVFJfQktFKTsKKwl9CisKKwkvKiBzZW5kIHRoZSBjaGFycyBpbnRvIHRoZSBzZXJpYWwgcG9ydCAod2l0aCBMRiAtPiBMRkNSIGNvbnZlcnNpb24pICovCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJY2hhciBjaCA9ICpzKys7CisKKwkJd2hpbGUgKCpwb3J0LT5fc3RhdHVzICYgU0MwMVNUUl9UQkYpCisJCQljb250aW51ZTsKKwkJKih1OCAqKSBwb3J0LT5fdHhiID0gY2g7CisKKwkJaWYgKGNoID09IDB4MGEpIHsKKwkJCXdoaWxlICgqcG9ydC0+X3N0YXR1cyAmIFNDMDFTVFJfVEJGKQorCQkJCWNvbnRpbnVlOworCQkJKih1OCAqKSBwb3J0LT5fdHhiID0gMHhkOworCQl9CisJfQorCisJLyogY2FuJ3QgbGV0IHRoZSB0cmFuc21pdHRlciBiZSB0dXJuZWQgb2ZmIGlmIGl0J3MgYWN0dWFsbHkKKwkgKiB0cmFuc21pdHRpbmcgKi8KKwl3aGlsZSAoKnBvcnQtPl9zdGF0dXMgJiAoU0MwMVNUUl9UWEYgfCBTQzAxU1RSX1RCRikpCisJCWNvbnRpbnVlOworCisJLyogZGlzYWJsZSB0aGUgdHJhbnNtaXR0ZXIgaWYgd2UgcmUtZW5hYmxlZCBpdCAqLworCWlmICghKHNjeGN0ciAmIFNDMDFDVFJfVFhFKSkKKwkJKnBvcnQtPl9jb250cm9sID0gc2N4Y3RyOworCisJKnBvcnQtPnR4X2ljciA9IHR4aWNyOworCXRtcCA9ICpwb3J0LT50eF9pY3I7Cit9CisKKy8qCisgKiBzZXQgdXAgYSBzZXJpYWwgcG9ydCBhcyBhIGNvbnNvbGUKKyAqIC0gY29uc3RydWN0IGEgY2ZsYWcgc2V0dGluZyBmb3IgdGhlIGZpcnN0IHJzX29wZW4oKQorICogLSBpbml0aWFsaXplIHRoZSBzZXJpYWwgcG9ydAorICogLSByZXR1cm4gbm9uLXplcm8gaWYgd2UgZGlkbid0IGZpbmQgYSBzZXJpYWwgcG9ydC4KKyAqLworc3RhdGljIGludCBfX2luaXQgbW4xMDMwMF9zZXJpYWxfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sCisJCQkJCQkgY2hhciAqb3B0aW9ucykKK3sKKwlzdHJ1Y3QgbW4xMDMwMF9zZXJpYWxfcG9ydCAqcG9ydDsKKwlpbnQgaSwgcGFyaXR5ID0gJ24nLCBiYXVkID0gOTYwMCwgYml0cyA9IDgsIGZsb3cgPSAwOworCisJZm9yIChpID0gMCA7IGkgPCBOUl9QT1JUUyA7IGkrKykgeworCQlwb3J0ID0gbW4xMDMwMF9zZXJpYWxfcG9ydHNbaV07CisJCWlmIChwb3J0ICYmICFwb3J0LT5nZGJzdHViICYmIHBvcnQtPnVhcnQubGluZSA9PSBjby0+aW5kZXgpCisJCQlnb3RvIGZvdW5kX2RldmljZTsKKwl9CisKKwlyZXR1cm4gLUVOT0RFVjsKKworZm91bmRfZGV2aWNlOgorCXN3aXRjaCAocG9ydC0+Y2xvY2tfc3JjKSB7CisJY2FzZSBNTlNDeF9DTE9DS19TUkNfSU9DTEs6CisJCXBvcnQtPmlvY2xrID0gTU4xMDMwMF9JT0NMSzsKKwkJYnJlYWs7CisKKyNpZmRlZiBNTjEwMzAwX0lPQkNMSworCWNhc2UgTU5TQ3hfQ0xPQ0tfU1JDX0lPQkNMSzoKKwkJcG9ydC0+aW9jbGsgPSBNTjEwMzAwX0lPQkNMSzsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlpZiAob3B0aW9ucykKKwkJdWFydF9wYXJzZV9vcHRpb25zKG9wdGlvbnMsICZiYXVkLCAmcGFyaXR5LCAmYml0cywgJmZsb3cpOworCisJcmV0dXJuIHVhcnRfc2V0X29wdGlvbnMoJnBvcnQtPnVhcnQsIGNvLCBiYXVkLCBwYXJpdHksIGJpdHMsIGZsb3cpOworfQorCisvKgorICogcmVnaXN0ZXIgY29uc29sZQorICovCitzdGF0aWMgaW50IF9faW5pdCBtbjEwMzAwX3NlcmlhbF9jb25zb2xlX2luaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl9jb25zb2xlKCZtbjEwMzAwX3NlcmlhbF9jb25zb2xlKTsKKwlyZXR1cm4gMDsKK30KKworY29uc29sZV9pbml0Y2FsbChtbjEwMzAwX3NlcmlhbF9jb25zb2xlX2luaXQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL21uMTAzMDAtc2VyaWFsLmggYi9hcmNoL21uMTAzMDAva2VybmVsL21uMTAzMDAtc2VyaWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc5NjQ5OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvbW4xMDMwMC1zZXJpYWwuaApAQCAtMCwwICsxLDEyNiBAQAorLyogTU4xMDMwMCBPbi1jaGlwIHNlcmlhbCBwb3J0IGRyaXZlciBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfTU4xMDMwMF9TRVJJQUxfSAorI2RlZmluZSBfTU4xMDMwMF9TRVJJQUxfSAorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvdGVybWlvcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9zZXJpYWwtcmVncy5oPgorCisjZGVmaW5lIE5SX1BPUlRTCQkzCQkvKiBzaG91bGQgYmUgc2V0IDMgb3IgOSBvciAxNiAqLworCisjZGVmaW5lIE1OU0NfQlVGRkVSX1NJWkUJKyhQQUdFX1NJWkUgLyAyKQorCisvKiBpbnRyX2ZsYWdzIGJpdHMgKi8KKyNkZWZpbmUgTU5TQ3hfUlhfQVZBSUwJCTB4MDEKKyNkZWZpbmUgTU5TQ3hfUlhfT1ZFUkYJCTB4MDIKKyNkZWZpbmUgTU5TQ3hfVFhfU1BBQ0UJCTB4MDQKKyNkZWZpbmUgTU5TQ3hfVFhfRU1QVFkJCTB4MDgKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworc3RydWN0IG1uMTAzMDBfc2VyaWFsX3BvcnQgeworCWNoYXIJCQkqcnhfYnVmZmVyOwkvKiByZWNlcHRpb24gYnVmZmVyIGJhc2UgKi8KKwl1bnNpZ25lZAkJcnhfaW5wOwkJLyogcG9pbnRlciB0byByeCBpbnB1dCBvZmZzZXQgKi8KKwl1bnNpZ25lZAkJcnhfb3V0cDsJLyogcG9pbnRlciB0byByeCBvdXRwdXQgb2Zmc2V0ICovCisJdTgJCQl0eF94Y2hhcjsJLyogaGlnaC1wcmlvcml0eSBYT04vWE9GRiBidWZmZXIgKi8KKwl1OAkJCXR4X2JyZWFrOwkvKiB0cmFuc21pdCBicmVhayByZXF1ZXN0ICovCisJdTgJCQlpbnRyX2ZsYWdzOwkvKiBpbnRlcnJ1cHQgZmxhZ3MgKi8KKwl2b2xhdGlsZSB1MTYJCSpyeF9pY3I7CS8qIFJ4IGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyICovCisJdm9sYXRpbGUgdTE2CQkqdHhfaWNyOwkvKiBUeCBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlciAqLworCWludAkJCXJ4X2lycTsJCS8qIHJlY2VwdGlvbiBJUlEgKi8KKwlpbnQJCQl0eF9pcnE7CQkvKiB0cmFuc21pc3Npb24gSVJRICovCisJaW50CQkJdG1faXJxOwkJLyogdGltZXIgSVJRICovCisKKwljb25zdCBjaGFyCQkqbmFtZTsJCS8qIG5hbWUgb2Ygc2VyaWFsIHBvcnQgKi8KKwljb25zdCBjaGFyCQkqcnhfbmFtZTsJLyogUnggaW50ZXJydXB0IGhhbmRsZXIgbmFtZSBvZiBzZXJpYWwgcG9ydCAqLworCWNvbnN0IGNoYXIJCSp0eF9uYW1lOwkvKiBUeCBpbnRlcnJ1cHQgaGFuZGxlciBuYW1lIG9mIHNlcmlhbCBwb3J0ICovCisJY29uc3QgY2hhcgkJKnRtX25hbWU7CS8qIFRpbWVyIGludGVycnVwdCBoYW5kbGVyIG5hbWUgKi8KKwl1bnNpZ25lZCBzaG9ydAkJdHlwZTsJCS8qIHR5cGUgb2Ygc2VyaWFsIHBvcnQgKi8KKwl1bnNpZ25lZCBjaGFyCQlpc2NvbnNvbGU7CS8qIFQgaWYgaXQncyBhIGNvbnNvbGUgKi8KKwl2b2xhdGlsZSB2b2lkCQkqX2lvYmFzZTsJLyogcG9pbnRlciB0byBiYXNlIG9mIEkvTyBjb250cm9sIHJlZ3MgKi8KKwl2b2xhdGlsZSB1MTYJCSpfY29udHJvbDsJLyogY29udHJvbCByZWdpc3RlciBwb2ludGVyICovCisJdm9sYXRpbGUgdTgJCSpfc3RhdHVzOwkvKiBzdGF0dXMgcmVnaXN0ZXIgcG9pbnRlciAqLworCXZvbGF0aWxlIHU4CQkqX2ludHI7CQkvKiBpbnRlcnJ1cHQgcmVnaXN0ZXIgcG9pbnRlciAqLworCXZvbGF0aWxlIHZvaWQJCSpfcnhiOwkJLyogcmVjZWl2ZSBidWZmZXIgcmVnaXN0ZXIgcG9pbnRlciAqLworCXZvbGF0aWxlIHZvaWQJCSpfdHhiOwkJLyogdHJhbnNtaXQgYnVmZmVyIHJlZ2lzdGVyIHBvaW50ZXIgKi8KKwl2b2xhdGlsZSB1MTYJCSpfdG1pY3I7CS8qIHRpbWVyIGludGVycnVwdCBjb250cm9sIHJlZ2lzdGVyICovCisJdm9sYXRpbGUgdTgJCSpfdG14bWQ7CS8qIGJhdWQgcmF0ZSB0aW1lciBtb2RlIHJlZ2lzdGVyICovCisJdm9sYXRpbGUgdTE2CQkqX3RteGJyOwkvKiBiYXVkIHJhdGUgdGltZXIgYmFzZSByZWdpc3RlciAqLworCisJLyogdGhpcyBtdXN0IGNvbWUgZG93biBoZXJlIHNvIHRoYXQgYXNzZW1ibHkgY2FuIHVzZSBCU0VUIHRvIGFjY2VzcyB0aGUKKwkgKiBhYm92ZSBmaWVsZHMgKi8KKwlzdHJ1Y3QgdWFydF9wb3J0CXVhcnQ7CisKKwl1bnNpZ25lZCBzaG9ydAkJcnhfYnJrOwkJLyogY3VycmVudCBicmVhayByZWNlcHRpb24gc3RhdHVzICovCisJdTE2CQkJdHhfY3RzOwkJLyogY3VycmVudCBDVFMgc3RhdHVzICovCisJaW50CQkJZ2Ric3R1YjsJLyogcHJlZW1wdGl2ZWx5IHN0b2xlbiBieSBHREIgc3R1YiAqLworCisJdTgJCQljbG9ja19zcmM7CS8qIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBNTlNDeF9DTE9DS19TUkNfSU9DTEsJMAorI2RlZmluZSBNTlNDeF9DTE9DS19TUkNfSU9CQ0xLCTEKKworCXU4CQkJZGl2X3RpbWVyOwkvKiB0aW1lciB1c2VkIGFzIGRpdmlzb3IgKi8KKyNkZWZpbmUgTU5TQ3hfRElWX1RJTUVSXzE2QklUCTAKKyNkZWZpbmUgTU5TQ3hfRElWX1RJTUVSXzhCSVQJMQorCisJdTE2CQkJb3B0aW9uczsJLyogb3B0aW9ucyAqLworI2RlZmluZSBNTlNDeF9PUFRfQ1RTCQkweDAwMDEKKworCXVuc2lnbmVkIGxvbmcJCWlvY2xrOwkJLyogYmFzZSBjbG9jayByYXRlICovCit9OworCisjaWZkZWYgQ09ORklHX01OMTAzMDBfVFRZU00wCitleHRlcm4gc3RydWN0IG1uMTAzMDBfc2VyaWFsX3BvcnQgbW4xMDMwMF9zZXJpYWxfcG9ydF9zaWYwOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTU4xMDMwMF9UVFlTTTEKK2V4dGVybiBzdHJ1Y3QgbW4xMDMwMF9zZXJpYWxfcG9ydCBtbjEwMzAwX3NlcmlhbF9wb3J0X3NpZjE7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NTjEwMzAwX1RUWVNNMgorZXh0ZXJuIHN0cnVjdCBtbjEwMzAwX3NlcmlhbF9wb3J0IG1uMTAzMDBfc2VyaWFsX3BvcnRfc2lmMjsKKyNlbmRpZgorCitleHRlcm4gc3RydWN0IG1uMTAzMDBfc2VyaWFsX3BvcnQgKm1uMTAzMDBfc2VyaWFsX3BvcnRzW107CisKK3N0cnVjdCBtbjEwMzAwX3NlcmlhbF9pbnQgeworCXN0cnVjdCBtbjEwMzAwX3NlcmlhbF9wb3J0ICpwb3J0OworCWFzbWxpbmthZ2Ugdm9pZCAoKnZkbWEpKHZvaWQpOworfTsKKworZXh0ZXJuIHN0cnVjdCBtbjEwMzAwX3NlcmlhbF9pbnQgbW4xMDMwMF9zZXJpYWxfaW50X3RibFtdOworCitleHRlcm4gYXNtbGlua2FnZSB2b2lkIG1uMTAzMDBfc2VyaWFsX3ZkbWFfaW50ZXJydXB0KHZvaWQpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBtbjEwMzAwX3NlcmlhbF92ZG1hX3J4X2hhbmRsZXIodm9pZCk7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIG1uMTAzMDBfc2VyaWFsX3ZkbWFfdHhfaGFuZGxlcih2b2lkKTsKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfR0RCU1RVQl9PTl9UVFlTTTApCisjZGVmaW5lIFNDZ1NUUiBTQzBTVFIKKyNkZWZpbmUgU0NnUlhCIFNDMFJYQgorI2RlZmluZSBTQ2dSWElSUSBTQzBSWElSUQorI2VsaWYgZGVmaW5lZChDT05GSUdfR0RCU1RVQl9PTl9UVFlTTTEpCisjZGVmaW5lIFNDZ1NUUiBTQzFTVFIKKyNkZWZpbmUgU0NnUlhCIFNDMVJYQgorI2RlZmluZSBTQ2dSWElSUSBTQzFSWElSUQorI2VsaWYgZGVmaW5lZChDT05GSUdfR0RCU1RVQl9PTl9UVFlTTTIpCisjZGVmaW5lIFNDZ1NUUiBTQzJTVFIKKyNkZWZpbmUgU0NnUlhCIFNDMlJYQgorI2RlZmluZSBTQ2dSWElSUSBTQzJSWElSUQorI2VuZGlmCisKKyNlbmRpZiAvKiBfTU4xMDMwMF9TRVJJQUxfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9tbjEwMzAwLXdhdGNoZG9nLWxvdy5TIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9tbjEwMzAwLXdhdGNoZG9nLWxvdy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NjI0NDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAva2VybmVsL21uMTAzMDAtd2F0Y2hkb2ctbG93LlMKQEAgLTAsMCArMSw1OSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBNTjEwMzAwIFdhdGNoZG9nIGludGVycnVwdCBoYW5kbGVyCisjCisjIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyMgMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyNpbmNsdWRlIDxsaW51eC9zeXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2ludGN0bC1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL3RpbWVyLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vZnJhbWUuaW5jPgorCisJLnRleHQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBXYXRjaGRvZyBoYW5kbGVyIGVudHJ5IHBvaW50CisjIC0gc3BlY2lhbCBub24tbWFza2FibGUgaW50ZXJydXB0CisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJLmdsb2JsCXdhdGNoZG9nX2hhbmRsZXIKKwkudHlwZQl3YXRjaGRvZ19oYW5kbGVyLEBmdW5jdGlvbgord2F0Y2hkb2dfaGFuZGxlcjoKKwlhZGQJLTQsc3AKKwlTQVZFX0FMTAorCisJbW92CTB4ZmZmZmZmZmYsZDAKKwltb3YJZDAsKFJFR19PUklHX0QwLGZwKQorCisJbW92CWZwLGQwCisJbHNyCTIsZDEKKwljYWxsCXdhdGNoZG9nX2ludGVycnVwdFtdLDAJCSMgd2F0Y2hkb2dfaW50ZXJydXB0KHJlZ3MsaXJxKQorCisJam1wCXJldF9mcm9tX2ludHIKKworCS5zaXplCXdhdGNoZG9nX2hhbmRsZXIsLi13YXRjaGRvZ19oYW5kbGVyCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgV2F0Y2hkb2cgdG91Y2ggZW50cnkgcG9pbnQKKyMgLSBrZXB0IHRvIGFic29sdXRlIG1pbmltdW0gKHVuZm9ydHVuYXRlbHksIGl0J3MgcHJvdG90eXBlZCBpbiBsaW51eC9ubWkuaCBzbworIyAgIHdlIGNhbid0IGlubGluZSBpdCkKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkuZ2xvYmwJdG91Y2hfbm1pX3dhdGNoZG9nCisJLnR5cGUJdG91Y2hfbm1pX3dhdGNoZG9nLEBmdW5jdGlvbgordG91Y2hfbm1pX3dhdGNoZG9nOgorCWNscglkMAorCW1vdglkMCwod2F0Y2hkb2dfYWxlcnRfY291bnRlcikKKwlyZXQJW10sMAorCisJLnNpemUJdG91Y2hfbm1pX3dhdGNoZG9nLC4tdG91Y2hfbm1pX3dhdGNoZG9nCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL21uMTAzMDAtd2F0Y2hkb2cuYyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvbW4xMDMwMC13YXRjaGRvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwODExZTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAva2VybmVsL21uMTAzMDAtd2F0Y2hkb2cuYwpAQCAtMCwwICsxLDE4MyBAQAorLyogTU4xMDMwMCBXYXRjaGRvZyB0aW1lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKiAtIERlcml2ZWQgZnJvbSBhcmNoL2kzODYva2VybmVsL25taS5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ubWkuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vaW50Y3RsLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vcnRjLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL2dkYi1zdHViLmg+CisjaW5jbHVkZSA8YXNtL3Byb2MvY2xvY2suaD4KKworc3RhdGljIERFRklORV9TUElOTE9DSyh3YXRjaGRvZ19wcmludF9sb2NrKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgd2F0Y2hkb2c7CitzdGF0aWMgdW5zaWduZWQgaW50IHdhdGNoZG9nX2h6ID0gMTsKK3Vuc2lnbmVkIGludCB3YXRjaGRvZ19hbGVydF9jb3VudGVyOworCitFWFBPUlRfU1lNQk9MKHRvdWNoX25taV93YXRjaGRvZyk7CisKKy8qCisgKiB0aGUgYmVzdCB3YXkgdG8gZGV0ZWN0IHdoZXRoZXIgYSBDUFUgaGFzIGEgJ2hhcmQgbG9ja3VwJyBwcm9ibGVtCisgKiBpcyB0byBjaGVjayBpdHMgdGltZXIgbWFrZXMgSVJRIGNvdW50cy4gSWYgdGhleSBhcmUgbm90CisgKiBjaGFuZ2luZyB0aGVuIHRoYXQgQ1BVIGhhcyBzb21lIHByb2JsZW0uCisgKgorICogYXMgdGhlc2Ugd2F0Y2hkb2cgTk1JIElSUXMgYXJlIGdlbmVyYXRlZCBvbiBldmVyeSBDUFUsIHdlIG9ubHkKKyAqIGhhdmUgdG8gY2hlY2sgdGhlIGN1cnJlbnQgcHJvY2Vzc29yLgorICoKKyAqIHNpbmNlIE5NSXMgZG9udCBsaXN0ZW4gdG8gX2FueV8gbG9ja3MsIHdlIGhhdmUgdG8gYmUgZXh0cmVtZWx5CisgKiBjYXJlZnVsIG5vdCB0byByZWx5IG9uIHVuc2FmZSB2YXJpYWJsZXMuIFRoZSBwcmludGsgbWlnaHQgbG9jaworICogdXAgdGhvdWdoLCBzbyB3ZSBoYXZlIHRvIGJyZWFrIHVwIGFueSBjb25zb2xlIGxvY2tzIGZpcnN0IC4uLgorICogW3doZW4gdGhlcmUgd2lsbCBiZSBtb3JlIHR0eS1yZWxhdGVkIGxvY2tzLCBicmVhayB0aGVtIHVwCisgKiAgaGVyZSB0b28hXQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGxhc3RfaXJxX3N1bXNbTlJfQ1BVU107CisKK2ludCBfX2luaXQgY2hlY2tfd2F0Y2hkb2codm9pZCkKK3sKKwlpcnFfY3B1c3RhdF90IHRtcFsxXTsKKworCXByaW50ayhLRVJOX0lORk8gIlRlc3RpbmcgV2F0Y2hkb2cuLi4gIik7CisKKwltZW1jcHkodG1wLCBpcnFfc3RhdCwgc2l6ZW9mKHRtcCkpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKwltZGVsYXkoKDEwICogMTAwMCkgLyB3YXRjaGRvZ19oeik7IC8qIHdhaXQgMTAgdGlja3MgKi8KKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJaWYgKG5taV9jb3VudCgwKSAtIHRtcFswXS5fX25taV9jb3VudCA8PSA1KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNQVSMlZDogV2F0Y2hkb2cgYXBwZWFycyB0byBiZSBzdHVjayFcbiIsCisJCSAgICAgICAwKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIk9LLlxuIik7CisKKwkvKiBub3cgdGhhdCB3ZSBrbm93IGl0IHdvcmtzIHdlIGNhbiByZWR1Y2UgTk1JIGZyZXF1ZW5jeSB0bworCSAqIHNvbWV0aGluZyBtb3JlIHJlYXNvbmFibGU7IG1ha2VzIGEgZGlmZmVyZW5jZSBpbiBzb21lIGNvbmZpZ3MKKwkgKi8KKwl3YXRjaGRvZ19oeiA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgc2V0dXBfd2F0Y2hkb2coY2hhciAqc3RyKQoreworCXVuc2lnbmVkIHRtcDsKKwlpbnQgb3B0OworCXU4IGN0cjsKKworCWdldF9vcHRpb24oJnN0ciwgJm9wdCk7CisJaWYgKG9wdCAhPSAxKQorCQlyZXR1cm4gMDsKKworCXdhdGNoZG9nID0gb3B0OworCWlmICh3YXRjaGRvZykgeworCQlzZXRfaW50cl9zdHViKEVYQ0VQX1dEVCwgd2F0Y2hkb2dfaGFuZGxlcik7CisJCWN0ciA9IFdEQ1RSX1dEQ0tfNjU1MzZ0aDsKKwkJV0RDVFIgPSBXRENUUl9XRFJTVCB8IGN0cjsKKwkJV0RDVFIgPSBjdHI7CisJCXRtcCA9IFdEQ1RSOworCisJCXRtcCA9IF9fbXVsZGl2NjR1KDEgPDwgKDE2ICsgY3RyICogMiksIDEwMDAwMDAsIE1OMTAzMDBfV0RDTEspOworCQl0bXAgPSAxMDAwMDAwMDAwIC8gdG1wOworCQl3YXRjaGRvZ19oeiA9ICh0bXAgKyA1MDApIC8gMTAwMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgid2F0Y2hkb2c9Iiwgc2V0dXBfd2F0Y2hkb2cpOworCit2b2lkIF9faW5pdCB3YXRjaGRvZ19nbyh2b2lkKQoreworCXU4IHdkdDsKKworCWlmICh3YXRjaGRvZykgeworCQlwcmludGsoS0VSTl9JTkZPICJXYXRjaGRvZzogcnVubmluZyBhdCAldUh6XG4iLCB3YXRjaGRvZ19oeik7CisJCXdkdCA9IFdEQ1RSICYgfldEQ1RSX1dEQ05FOworCQlXRENUUiA9IHdkdCB8IFdEQ1RSX1dEUlNUOworCQl3ZHQgPSBXRENUUjsKKwkJV0RDVFIgPSB3ZHQgfCBXRENUUl9XRENORTsKKwkJd2R0ID0gV0RDVFI7CisKKwkJY2hlY2tfd2F0Y2hkb2coKTsKKwl9Cit9CisKK2FzbWxpbmthZ2UKK3ZvaWQgd2F0Y2hkb2dfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBlbnVtIGV4Y2VwdGlvbl9jb2RlIGV4Y2VwKQoreworCisJLyoKKwkgKiBTaW5jZSBjdXJyZW50LT4gaXMgYWx3YXlzIG9uIHRoZSBzdGFjaywgYW5kIHdlIGFsd2F5cyBzd2l0Y2gKKwkgKiB0aGUgc3RhY2sgTk1JLWF0b21pY2FsbHksIGl0J3Mgc2FmZSB0byB1c2Ugc21wX3Byb2Nlc3Nvcl9pZCgpLgorCSAqLworCWludCBzdW0sIGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwl1OCB3ZHQsIHRtcDsKKworCXdkdCA9IFdEQ1RSICYgfldEQ1RSX1dEQ05FOworCVdEQ1RSID0gd2R0OworCXRtcCA9IFdEQ1RSOworCU5NSUNSID0gTk1JQ1JfV0RJRjsKKworCW5taV9jb3VudChjcHUpKys7CisJa3N0YXRfdGhpc19jcHUuaXJxc1tOTUlJUlFdKys7CisJc3VtID0gaXJxX3N0YXRbY3B1XS5fX2lycV9jb3VudDsKKworCWlmIChsYXN0X2lycV9zdW1zW2NwdV0gPT0gc3VtKSB7CisJCS8qCisJCSAqIEF5aWVlLCBsb29rcyBsaWtlIHRoaXMgQ1BVIGlzIHN0dWNrIC4uLgorCQkgKiB3YWl0IGEgZmV3IElSUXMgKDUgc2Vjb25kcykgYmVmb3JlIGRvaW5nIHRoZSBvb3BzIC4uLgorCQkgKi8KKwkJd2F0Y2hkb2dfYWxlcnRfY291bnRlcisrOworCQlpZiAod2F0Y2hkb2dfYWxlcnRfY291bnRlciA9PSA1ICogd2F0Y2hkb2dfaHopIHsKKwkJCXNwaW5fbG9jaygmd2F0Y2hkb2dfcHJpbnRfbG9jayk7CisJCQkvKgorCQkJICogV2UgYXJlIGluIHRyb3VibGUgYW55d2F5LCBsZXRzIGF0IGxlYXN0IHRyeQorCQkJICogdG8gZ2V0IGEgbWVzc2FnZSBvdXQuCisJCQkgKi8KKwkJCWJ1c3Rfc3BpbmxvY2tzKDEpOworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIk5NSSBXYXRjaGRvZyBkZXRlY3RlZCBMT0NLVVAgb24gQ1BVJWQsIgorCQkJICAgICAgICIgcGMgJTA4bHgsIHJlZ2lzdGVyczpcbiIsCisJCQkgICAgICAgY3B1LCByZWdzLT5wYyk7CisJCQlzaG93X3JlZ2lzdGVycyhyZWdzKTsKKwkJCXByaW50aygiY29uc29sZSBzaHV0cyB1cCAuLi5cbiIpOworCQkJY29uc29sZV9zaWxlbnQoKTsKKwkJCXNwaW5fdW5sb2NrKCZ3YXRjaGRvZ19wcmludF9sb2NrKTsKKwkJCWJ1c3Rfc3BpbmxvY2tzKDApOworI2lmZGVmIENPTkZJR19HREJTVFVCCisJCQlpZiAoZ2Ric3R1Yl9idXN5KQorCQkJCWdkYnN0dWJfZXhjZXB0aW9uKHJlZ3MsIGV4Y2VwKTsKKwkJCWVsc2UKKwkJCQlnZGJzdHViX2ludGVyY2VwdChyZWdzLCBleGNlcCk7CisjZW5kaWYKKwkJCWRvX2V4aXQoU0lHU0VHVik7CisJCX0KKwl9IGVsc2UgeworCQlsYXN0X2lycV9zdW1zW2NwdV0gPSBzdW07CisJCXdhdGNoZG9nX2FsZXJ0X2NvdW50ZXIgPSAwOworCX0KKworCVdEQ1RSID0gd2R0IHwgV0RDVFJfV0RSU1Q7CisJdG1wID0gV0RDVFI7CisJV0RDVFIgPSB3ZHQgfCBXRENUUl9XRENORTsKKwl0bXAgPSBXRENUUjsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvbW4xMDMwMF9rc3ltcy5jIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9tbjEwMzAwX2tzeW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQxOTYyOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvbW4xMDMwMF9rc3ltcy5jCkBAIC0wLDAgKzEsMzcgQEAKKy8qIE1OMTAzMDAgTWlzY2VsbGFuZW91cyBhbmQgbGlicmFyeSBrZXJuZWwgZXhwb3J0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNYXRzdXNoaXRhIEVsZWN0cmljIEluZHVzdHJpYWwgQ28uLCBMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisKK0VYUE9SVF9TWU1CT0woY2hhbmdlX2JpdCk7CitFWFBPUlRfU1lNQk9MKHRlc3RfYW5kX2NoYW5nZV9iaXQpOworCitFWFBPUlRfU1lNQk9MKG1lbWNweSk7CitFWFBPUlRfU1lNQk9MKG1lbW1vdmUpOworRVhQT1JUX1NZTUJPTChtZW1zZXQpOworCitFWFBPUlRfU1lNQk9MKHN0cm5jcHlfZnJvbV91c2VyKTsKK0VYUE9SVF9TWU1CT0woX19zdHJuY3B5X2Zyb21fdXNlcik7CitFWFBPUlRfU1lNQk9MKGNsZWFyX3VzZXIpOworRVhQT1JUX1NZTUJPTChfX2NsZWFyX3VzZXIpOworRVhQT1JUX1NZTUJPTChfX2dlbmVyaWNfY29weV9mcm9tX3VzZXIpOworRVhQT1JUX1NZTUJPTChfX2dlbmVyaWNfY29weV90b191c2VyKTsKK0VYUE9SVF9TWU1CT0woc3Rybmxlbl91c2VyKTsKKworZXh0ZXJuIHU2NCBfX2FzaHJkaTModTY0LCB1bnNpZ25lZCk7CitleHRlcm4gdTY0IF9fYXNobGRpMyh1NjQsIHVuc2lnbmVkKTsKK2V4dGVybiB1NjQgX19sc2hyZGkzKHU2NCwgdW5zaWduZWQpOworZXh0ZXJuIHM2NCBfX25lZ2RpMihzNjQpOworRVhQT1JUX1NZTUJPTChfX2FzaHJkaTMpOworRVhQT1JUX1NZTUJPTChfX2FzaGxkaTMpOworRVhQT1JUX1NZTUJPTChfX2xzaHJkaTMpOworRVhQT1JUX1NZTUJPTChfX25lZ2RpMik7CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL21vZHVsZS5jIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9tb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTRkMmY2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9tb2R1bGUuYwpAQCAtMCwwICsxLDIwNiBAQAorLyogTU4xMDMwMCBLZXJuZWwgbW9kdWxlIGhlbHBlciByb3V0aW5lcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IE1hcmsgU2FsdGVyIChtc2FsdGVyQHJlZGhhdC5jb20pCisgKiAtIERlcml2ZWQgZnJvbSBhcmNoL2kzODYva2VybmVsL21vZHVsZS5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbmNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlbG9hZGVyLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpZiAwCisjZGVmaW5lIERFQlVHUCBwcmludGsKKyNlbHNlCisjZGVmaW5lIERFQlVHUChmbXQsIC4uLikKKyNlbmRpZgorCisvKgorICogYWxsb2NhdGUgc3RvcmFnZSBmb3IgYSBtb2R1bGUKKyAqLwordm9pZCAqbW9kdWxlX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpZiAoc2l6ZSA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gdm1hbGxvY19leGVjKHNpemUpOworfQorCisvKgorICogZnJlZSBtZW1vcnkgcmV0dXJuZWQgZnJvbSBtb2R1bGVfYWxsb2MoKQorICovCit2b2lkIG1vZHVsZV9mcmVlKHN0cnVjdCBtb2R1bGUgKm1vZCwgdm9pZCAqbW9kdWxlX3JlZ2lvbikKK3sKKwl2ZnJlZShtb2R1bGVfcmVnaW9uKTsKKwkvKiBGSVhNRTogSWYgbW9kdWxlX3JlZ2lvbiA9PSBtb2QtPmluaXRfcmVnaW9uLCB0cmltIGV4Y2VwdGlvbgorCSAqIHRhYmxlIGVudHJpZXMuICovCit9CisKKy8qCisgKiBhbGxvdyB0aGUgYXJjaCB0byBmaXggdXAgdGhlIHNlY3Rpb24gdGFibGUKKyAqIC0gd2UgZG9uJ3QgbmVlZCBhbnl0aGluZyBzcGVjaWFsCisgKi8KK2ludCBtb2R1bGVfZnJvYl9hcmNoX3NlY3Rpb25zKEVsZl9FaGRyICpoZHIsCisJCQkgICAgICBFbGZfU2hkciAqc2VjaGRycywKKwkJCSAgICAgIGNoYXIgKnNlY3N0cmluZ3MsCisJCQkgICAgICBzdHJ1Y3QgbW9kdWxlICptb2QpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50MzJfdCByZWxvY19nZXQxNih1aW50OF90ICpwKQoreworCXJldHVybiBwWzBdIHwgKHBbMV0gPDwgOCk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCByZWxvY19nZXQyNCh1aW50OF90ICpwKQoreworCXJldHVybiByZWxvY19nZXQxNihwKSB8IChwWzJdIDw8IDE2KTsKK30KKworc3RhdGljIHVpbnQzMl90IHJlbG9jX2dldDMyKHVpbnQ4X3QgKnApCit7CisJcmV0dXJuIHJlbG9jX2dldDE2KHApIHwgKHJlbG9jX2dldDE2KHArMikgPDwgMTYpOworfQorCitzdGF0aWMgdm9pZCByZWxvY19wdXQxNih1aW50OF90ICpwLCB1aW50MzJfdCB2YWwpCit7CisJcFswXSA9IHZhbCAmIDB4ZmY7CisJcFsxXSA9ICh2YWwgPj4gOCkgJiAweGZmOworfQorCitzdGF0aWMgdm9pZCByZWxvY19wdXQyNCh1aW50OF90ICpwLCB1aW50MzJfdCB2YWwpCit7CisJcmVsb2NfcHV0MTYocCwgdmFsKTsKKwlwWzJdID0gKHZhbCA+PiAxNikgJiAweGZmOworfQorCitzdGF0aWMgdm9pZCByZWxvY19wdXQzMih1aW50OF90ICpwLCB1aW50MzJfdCB2YWwpCit7CisJcmVsb2NfcHV0MTYocCwgdmFsKTsKKwlyZWxvY19wdXQxNihwKzIsIHZhbCA+PiAxNik7Cit9CisKKy8qCisgKiBhcHBseSBhIFJFTCByZWxvY2F0aW9uCisgKi8KK2ludCBhcHBseV9yZWxvY2F0ZShFbGYzMl9TaGRyICpzZWNoZHJzLAorCQkgICBjb25zdCBjaGFyICpzdHJ0YWIsCisJCSAgIHVuc2lnbmVkIGludCBzeW1pbmRleCwKKwkJICAgdW5zaWduZWQgaW50IHJlbHNlYywKKwkJICAgc3RydWN0IG1vZHVsZSAqbWUpCit7CisJcHJpbnRrKEtFUk5fRVJSICJtb2R1bGUgJXM6IFJFTE9DQVRJT04gdW5zdXBwb3J0ZWRcbiIsCisJICAgICAgIG1lLT5uYW1lKTsKKwlyZXR1cm4gLUVOT0VYRUM7Cit9CisKKy8qCisgKiBhcHBseSBhIFJFTEEgcmVsb2NhdGlvbgorICovCitpbnQgYXBwbHlfcmVsb2NhdGVfYWRkKEVsZjMyX1NoZHIgKnNlY2hkcnMsCisJCSAgICAgICBjb25zdCBjaGFyICpzdHJ0YWIsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVsc2VjLAorCQkgICAgICAgc3RydWN0IG1vZHVsZSAqbWUpCit7CisJdW5zaWduZWQgaW50IGk7CisJRWxmMzJfUmVsYSAqcmVsID0gKHZvaWQgKilzZWNoZHJzW3JlbHNlY10uc2hfYWRkcjsKKwlFbGYzMl9TeW0gKnN5bTsKKwlFbGYzMl9BZGRyIHJlbG9jYXRpb247CisJdWludDhfdCAqbG9jYXRpb247CisJdWludDMyX3QgdmFsdWU7CisKKwlERUJVR1AoIkFwcGx5aW5nIHJlbG9jYXRlIHNlY3Rpb24gJXUgdG8gJXVcbiIsCisJICAgICAgIHJlbHNlYywgc2VjaGRyc1tyZWxzZWNdLnNoX2luZm8pOworCisJZm9yIChpID0gMDsgaSA8IHNlY2hkcnNbcmVsc2VjXS5zaF9zaXplIC8gc2l6ZW9mKCpyZWwpOyBpKyspIHsKKwkJLyogdGhpcyBpcyB3aGVyZSB0byBtYWtlIHRoZSBjaGFuZ2UgKi8KKwkJbG9jYXRpb24gPSAodm9pZCAqKXNlY2hkcnNbc2VjaGRyc1tyZWxzZWNdLnNoX2luZm9dLnNoX2FkZHIKKwkJCSsgcmVsW2ldLnJfb2Zmc2V0OworCisJCS8qIHRoaXMgaXMgdGhlIHN5bWJvbCB0aGUgcmVsb2NhdGlvbiBpcyByZWZlcnJpbmcgdG8gKG5vdGUgdGhhdAorCQkgKiBhbGwgdW5kZWZpbmVkIHN5bWJvbHMgaGF2ZSBiZWVuIHJlc29sdmVkIGJ5IHRoZSBjYWxsZXIpICovCisJCXN5bSA9IChFbGYzMl9TeW0gKilzZWNoZHJzW3N5bWluZGV4XS5zaF9hZGRyCisJCQkrIEVMRjMyX1JfU1lNKHJlbFtpXS5yX2luZm8pOworCisJCS8qIHRoaXMgaXMgdGhlIGFkanVzdG1lbnQgdG8gYmUgbWFkZSAqLworCQlyZWxvY2F0aW9uID0gc3ltLT5zdF92YWx1ZSArIHJlbFtpXS5yX2FkZGVuZDsKKworCQlzd2l0Y2ggKEVMRjMyX1JfVFlQRShyZWxbaV0ucl9pbmZvKSkgeworCQkJLyogZm9yIHRoZSBmaXJzdCBmb3VyIHJlbG9jYXRpb24gdHlwZXMsIHdlIGFkZCB0aGUKKwkJCSAqIGFkanVzdG1lbnQgaW50byB0aGUgdmFsdWUgYXQgdGhlIGxvY2F0aW9uIGdpdmVuICovCisJCWNhc2UgUl9NTjEwMzAwXzMyOgorCQkJdmFsdWUgPSByZWxvY19nZXQzMihsb2NhdGlvbik7CisJCQl2YWx1ZSArPSByZWxvY2F0aW9uOworCQkJcmVsb2NfcHV0MzIobG9jYXRpb24sIHZhbHVlKTsKKwkJCWJyZWFrOworCQljYXNlIFJfTU4xMDMwMF8yNDoKKwkJCXZhbHVlID0gcmVsb2NfZ2V0MjQobG9jYXRpb24pOworCQkJdmFsdWUgKz0gcmVsb2NhdGlvbjsKKwkJCXJlbG9jX3B1dDI0KGxvY2F0aW9uLCB2YWx1ZSk7CisJCQlicmVhazsKKwkJY2FzZSBSX01OMTAzMDBfMTY6CisJCQl2YWx1ZSA9IHJlbG9jX2dldDE2KGxvY2F0aW9uKTsKKwkJCXZhbHVlICs9IHJlbG9jYXRpb247CisJCQlyZWxvY19wdXQxNihsb2NhdGlvbiwgdmFsdWUpOworCQkJYnJlYWs7CisJCWNhc2UgUl9NTjEwMzAwXzg6CisJCQkqbG9jYXRpb24gKz0gcmVsb2NhdGlvbjsKKwkJCWJyZWFrOworCisJCQkvKiBmb3IgdGhlIG5leHQgdGhyZWUgcmVsb2NhdGlvbiB0eXBlcywgd2Ugd3JpdGUgdGhlCisJCQkgKiBhZGp1c3RtZW50IHdpdGggdGhlIGFkZHJlc3Mgc3VidHJhY3RlZCBvdmVyIHRoZQorCQkJICogdmFsdWUgYXQgdGhlIGxvY2F0aW9uIGdpdmVuICovCisJCWNhc2UgUl9NTjEwMzAwX1BDUkVMMzI6CisJCQl2YWx1ZSA9IHJlbG9jYXRpb24gLSAodWludDMyX3QpIGxvY2F0aW9uOworCQkJcmVsb2NfcHV0MzIobG9jYXRpb24sIHZhbHVlKTsKKwkJCWJyZWFrOworCQljYXNlIFJfTU4xMDMwMF9QQ1JFTDE2OgorCQkJdmFsdWUgPSByZWxvY2F0aW9uIC0gKHVpbnQzMl90KSBsb2NhdGlvbjsKKwkJCXJlbG9jX3B1dDE2KGxvY2F0aW9uLCB2YWx1ZSk7CisJCQlicmVhazsKKwkJY2FzZSBSX01OMTAzMDBfUENSRUw4OgorCQkJKmxvY2F0aW9uID0gcmVsb2NhdGlvbiAtICh1aW50MzJfdCkgbG9jYXRpb247CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJtb2R1bGUgJXM6IFVua25vd24gcmVsb2NhdGlvbjogJXVcbiIsCisJCQkgICAgICAgbWUtPm5hbWUsIEVMRjMyX1JfVFlQRShyZWxbaV0ucl9pbmZvKSk7CisJCQlyZXR1cm4gLUVOT0VYRUM7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBmaW5pc2ggbG9hZGluZyB0aGUgbW9kdWxlCisgKi8KK2ludCBtb2R1bGVfZmluYWxpemUoY29uc3QgRWxmX0VoZHIgKmhkciwKKwkJICAgIGNvbnN0IEVsZl9TaGRyICpzZWNoZHJzLAorCQkgICAgc3RydWN0IG1vZHVsZSAqbWUpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBmaW5pc2ggY2xlYXJpbmcgdGhlIG1vZHVsZQorICovCit2b2lkIG1vZHVsZV9hcmNoX2NsZWFudXAoc3RydWN0IG1vZHVsZSAqbW9kKQoreworfQpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL21uMTAzMDAva2VybmVsL3Byb2Nlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjBkNTc5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTAsMCArMSwyOTcgQEAKKy8qIE1OMTAzMDAgIFByb2Nlc3MgaGFuZGxpbmcgY29kZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vZnB1Lmg+CisjaW5jbHVkZSA8YXNtL3Jlc2V0LXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vZ2RiLXN0dWIuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisvKgorICogcG93ZXIgbWFuYWdlbWVudCBpZGxlIGZ1bmN0aW9uLCBpZiBhbnkuLgorICovCit2b2lkICgqcG1faWRsZSkodm9pZCk7CitFWFBPUlRfU1lNQk9MKHBtX2lkbGUpOworCisvKgorICogcmV0dXJuIHNhdmVkIFBDIG9mIGEgYmxvY2tlZCB0aHJlYWQuCisgKi8KK3Vuc2lnbmVkIGxvbmcgdGhyZWFkX3NhdmVkX3BjKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCXJldHVybiAoKHVuc2lnbmVkIGxvbmcgKikgdHNrLT50aHJlYWQuc3ApWzNdOworfQorCisvKgorICogcG93ZXIgb2ZmIGZ1bmN0aW9uLCBpZiBhbnkKKyAqLwordm9pZCAoKnBtX3Bvd2VyX29mZikodm9pZCk7CitFWFBPUlRfU1lNQk9MKHBtX3Bvd2VyX29mZik7CisKKy8qCisgKiB3ZSB1c2UgdGhpcyBpZiB3ZSBkb24ndCBoYXZlIGFueSBiZXR0ZXIgaWRsZSByb3V0aW5lCisgKi8KK3N0YXRpYyB2b2lkIGRlZmF1bHRfaWRsZSh2b2lkKQoreworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJaWYgKCFuZWVkX3Jlc2NoZWQoKSkKKwkJc2FmZV9oYWx0KCk7CisJZWxzZQorCQlsb2NhbF9pcnFfZW5hYmxlKCk7Cit9CisKKy8qCisgKiB0aGUgaWRsZSB0aHJlYWQKKyAqIC0gdGhlcmUncyBubyB1c2VmdWwgd29yayB0byBiZSBkb25lLCBzbyBqdXN0IHRyeSB0byBjb25zZXJ2ZSBwb3dlciBhbmQgaGF2ZQorICogICBhIGxvdyBleGl0IGxhdGVuY3kgKGllIHNpdCBpbiBhIGxvb3Agd2FpdGluZyBmb3Igc29tZWJvZHkgdG8gc2F5IHRoYXQKKyAqICAgdGhleSdkIGxpa2UgdG8gcmVzY2hlZHVsZSkKKyAqLwordm9pZCBjcHVfaWRsZSh2b2lkKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwkvKiBlbmRsZXNzIGlkbGUgbG9vcCB3aXRoIG5vIHByaW9yaXR5IGF0IGFsbCAqLworCWZvciAoOzspIHsKKwkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkgeworCQkJdm9pZCAoKmlkbGUpKHZvaWQpOworCisJCQlzbXBfcm1iKCk7CisJCQlpZGxlID0gcG1faWRsZTsKKwkJCWlmICghaWRsZSkKKwkJCQlpZGxlID0gZGVmYXVsdF9pZGxlOworCisJCQlpcnFfc3RhdFtjcHVdLmlkbGVfdGltZXN0YW1wID0gamlmZmllczsKKwkJCWlkbGUoKTsKKwkJfQorCisJCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKKwkJc2NoZWR1bGUoKTsKKwkJcHJlZW1wdF9kaXNhYmxlKCk7CisJfQorfQorCit2b2lkIHJlbGVhc2Vfc2VnbWVudHMoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7Cit9CisKK3ZvaWQgbWFjaGluZV9yZXN0YXJ0KGNoYXIgKmNtZCkKK3sKKyNpZmRlZiBDT05GSUdfR0RCU1RVQgorCWdkYnN0dWJfZXhpdCgwKTsKKyNlbmRpZgorCisjaWZkZWYgbW4xMDMwMF91bml0X2hhcmRfcmVzZXQKKwltbjEwMzAwX3VuaXRfaGFyZF9yZXNldCgpOworI2Vsc2UKKwltbjEwMzAwX3Byb2NfaGFyZF9yZXNldCgpOworI2VuZGlmCit9CisKK3ZvaWQgbWFjaGluZV9oYWx0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0dEQlNUVUIKKwlnZGJzdHViX2V4aXQoMCk7CisjZW5kaWYKK30KKwordm9pZCBtYWNoaW5lX3Bvd2VyX29mZih2b2lkKQoreworI2lmZGVmIENPTkZJR19HREJTVFVCCisJZ2Ric3R1Yl9leGl0KDApOworI2VuZGlmCit9CisKK3ZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworfQorCisvKgorICogY3JlYXRlIGEga2VybmVsIHRocmVhZAorICovCitpbnQga2VybmVsX3RocmVhZChpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqYXJnLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBwdF9yZWdzIHJlZ3M7CisKKwltZW1zZXQoJnJlZ3MsIDAsIHNpemVvZihyZWdzKSk7CisKKwlyZWdzLmEyID0gKHVuc2lnbmVkIGxvbmcpIGZuOworCXJlZ3MuZDIgPSAodW5zaWduZWQgbG9uZykgYXJnOworCXJlZ3MucGMgPSAodW5zaWduZWQgbG9uZykga2VybmVsX3RocmVhZF9oZWxwZXI7CisJbG9jYWxfc2F2ZV9mbGFncyhyZWdzLmVwc3cpOworCXJlZ3MuZXBzdyB8PSBFUFNXX0lFIHwgRVBTV19JTV83OworCisJLyogT2ssIGNyZWF0ZSB0aGUgbmV3IHByb2Nlc3MuLiAqLworCXJldHVybiBkb19mb3JrKGZsYWdzIHwgQ0xPTkVfVk0gfCBDTE9ORV9VTlRSQUNFRCwgMCwgJnJlZ3MsIDAsCisJCSAgICAgICBOVUxMLCBOVUxMKTsKK30KKworLyoKKyAqIGZyZWUgY3VycmVudCB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmVzIGV0Yy4uCisgKi8KK3ZvaWQgZXhpdF90aHJlYWQodm9pZCkKK3sKKwlleGl0X2ZwdSgpOworfQorCit2b2lkIGZsdXNoX3RocmVhZCh2b2lkKQoreworCWZsdXNoX2ZwdSgpOworfQorCit2b2lkIHJlbGVhc2VfdGhyZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqZGVhZF90YXNrKQoreworfQorCisvKgorICogd2UgZG8gbm90IGhhdmUgdG8gbXVjayB3aXRoIGRlc2NyaXB0b3JzIGhlcmUsIHRoYXQgaXMKKyAqIGRvbmUgaW4gc3dpdGNoX21tKCkgYXMgbmVlZGVkLgorICovCit2b2lkIGNvcHlfc2VnbWVudHMoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3QgbW1fc3RydWN0ICpuZXdfbW0pCit7Cit9CisKKy8qCisgKiB0aGlzIGdldHMgY2FsbGVkIGJlZm9yZSB3ZSBhbGxvY2F0ZSBhIG5ldyB0aHJlYWQgYW5kIGNvcHkgdGhlIGN1cnJlbnQgdGFzaworICogaW50byBpdCBzbyB0aGF0IHdlIGNhbiBzdG9yZSBsYXp5IHN0YXRlIGludG8gbWVtb3J5CisgKi8KK3ZvaWQgcHJlcGFyZV90b19jb3B5KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCXVubGF6eV9mcHUodHNrKTsKK30KKworLyoKKyAqIHNldCB1cCB0aGUga2VybmVsIHN0YWNrIGZvciBhIG5ldyB0aHJlYWQgYW5kIGNvcHkgYXJjaC1zcGVjaWZpYyB0aHJlYWQKKyAqIGNvbnRyb2wgaW5mb3JtYXRpb24KKyAqLworaW50IGNvcHlfdGhyZWFkKGludCBuciwgdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncywKKwkJdW5zaWduZWQgbG9uZyBjX3VzcCwgdW5zaWduZWQgbG9uZyB1c3RrX3NpemUsCisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IHB0X3JlZ3MgKmtyZWdzKQoreworCXN0cnVjdCBwdF9yZWdzICpjX3VyZWdzLCAqY19rcmVncywgKnVyZWdzOworCXVuc2lnbmVkIGxvbmcgY19rc3A7CisKKwl1cmVncyA9IGN1cnJlbnQtPnRocmVhZC51cmVnczsKKworCWNfa3NwID0gKHVuc2lnbmVkIGxvbmcpIHRhc2tfc3RhY2tfcGFnZShwKSArIFRIUkVBRF9TSVpFOworCisJLyogYWxsb2NhdGUgdGhlIHVzZXJzcGFjZSBleGNlcHRpb24gZnJhbWUgYW5kIHNldCBpdCB1cCAqLworCWNfa3NwIC09IHNpemVvZihzdHJ1Y3QgcHRfcmVncyk7CisJY191cmVncyA9IChzdHJ1Y3QgcHRfcmVncyAqKSBjX2tzcDsKKworCXAtPnRocmVhZC51cmVncyA9IGNfdXJlZ3M7CisJKmNfdXJlZ3MgPSAqdXJlZ3M7CisJY191cmVncy0+c3AgPSBjX3VzcDsKKwljX3VyZWdzLT5lcHN3ICY9IH5FUFNXX0ZFOyAvKiBteSBGUFUgKi8KKworCWNfa3NwIC09IDEyOyAvKiBhbGxvY2F0ZSBmdW5jdGlvbiBjYWxsIEFCSSBzbGFjayAqLworCisJLyogdGhlIG5ldyBUTFMgcG9pbnRlciBpcyBwYXNzZWQgaW4gYXMgYXJnICM1IHRvIHN5c19jbG9uZSgpICovCisJaWYgKGNsb25lX2ZsYWdzICYgQ0xPTkVfU0VUVExTKQorCQljX3VyZWdzLT5lMiA9IF9fZnJhbWUtPmQzOworCisJLyogc2V0IHVwIHRoZSByZXR1cm4ga2VybmVsIGZyYW1lIGlmIGNhbGxlZCBmcm9tIGtlcm5lbF90aHJlYWQoKSAqLworCWNfa3JlZ3MgPSBjX3VyZWdzOworCWlmIChrcmVncyAhPSB1cmVncykgeworCQljX2tzcCAtPSBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpOworCQljX2tyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopIGNfa3NwOworCQkqY19rcmVncyA9ICprcmVnczsKKwkJY19rcmVncy0+c3AgPSBjX3VzcDsKKwkJY19rcmVncy0+bmV4dCA9IGNfdXJlZ3M7CisjaWZkZWYgQ09ORklHX01OMTAzMDBfQ1VSUkVOVF9JTl9FMgorCQljX2tyZWdzLT5lMiA9ICh1bnNpZ25lZCBsb25nKSBwOyAvKiBjdXJyZW50ICovCisjZW5kaWYKKworCQljX2tzcCAtPSAxMjsgLyogYWxsb2NhdGUgZnVuY3Rpb24gY2FsbCBBQkkgc2xhY2sgKi8KKwl9CisKKwkvKiBzZXQgdXAgdGhpbmdzIHVwIHNvIHRoZSBzY2hlZHVsZXIgY2FuIHN0YXJ0IHRoZSBuZXcgdGFzayAqLworCXAtPnRocmVhZC5fX2ZyYW1lID0gY19rcmVnczsKKwlwLT50aHJlYWQuYTMJPSAodW5zaWduZWQgbG9uZykgY19rcmVnczsKKwlwLT50aHJlYWQuc3AJPSBjX2tzcDsKKwlwLT50aHJlYWQucGMJPSAodW5zaWduZWQgbG9uZykgcmV0X2Zyb21fZm9yazsKKwlwLT50aHJlYWQud2NoYW4JPSAodW5zaWduZWQgbG9uZykgcmV0X2Zyb21fZm9yazsKKwlwLT50aHJlYWQudXNwCT0gY191c3A7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGNsb25lIGEgcHJvY2VzcworICogLSB0bHNwdHIgaXMgcmV0cmlldmVkIGJ5IGNvcHlfdGhyZWFkKCkgZnJvbSBfX2ZyYW1lLT5kMworICovCithc21saW5rYWdlIGxvbmcgc3lzX2Nsb25lKHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3MsIHVuc2lnbmVkIGxvbmcgbmV3c3AsCisJCQkgIGludCBfX3VzZXIgKnBhcmVudF90aWRwdHIsIGludCBfX3VzZXIgKmNoaWxkX3RpZHB0ciwKKwkJCSAgaW50IF9fdXNlciAqdGxzcHRyKQoreworCXJldHVybiBkb19mb3JrKGNsb25lX2ZsYWdzLCBuZXdzcCA/OiBfX2ZyYW1lLT5zcCwgX19mcmFtZSwgMCwKKwkJICAgICAgIHBhcmVudF90aWRwdHIsIGNoaWxkX3RpZHB0cik7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfZm9yayh2b2lkKQoreworCXJldHVybiBkb19mb3JrKFNJR0NITEQsIF9fZnJhbWUtPnNwLCBfX2ZyYW1lLCAwLCBOVUxMLCBOVUxMKTsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c192Zm9yayh2b2lkKQoreworCXJldHVybiBkb19mb3JrKENMT05FX1ZGT1JLIHwgQ0xPTkVfVk0gfCBTSUdDSExELCBfX2ZyYW1lLT5zcCwgX19mcmFtZSwKKwkJICAgICAgIDAsIE5VTEwsIE5VTEwpOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX2V4ZWN2ZShjaGFyIF9fdXNlciAqbmFtZSwKKwkJCSAgIGNoYXIgX191c2VyICogX191c2VyICphcmd2LAorCQkJICAgY2hhciBfX3VzZXIgKiBfX3VzZXIgKmVudnApCit7CisJY2hhciAqZmlsZW5hbWU7CisJaW50IGVycm9yOworCisJbG9ja19rZXJuZWwoKTsKKworCWZpbGVuYW1lID0gZ2V0bmFtZShuYW1lKTsKKwllcnJvciA9IFBUUl9FUlIoZmlsZW5hbWUpOworCWlmICghSVNfRVJSKGZpbGVuYW1lKSkgeworCQllcnJvciA9IGRvX2V4ZWN2ZShmaWxlbmFtZSwgYXJndiwgZW52cCwgX19mcmFtZSk7CisJCWlmIChlcnJvciA9PSAwKQorCQkJY3VycmVudC0+cHRyYWNlICY9IH5QVF9EVFJBQ0U7CisKKwkJcHV0bmFtZShmaWxlbmFtZSk7CisJfQorCisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnJvcjsKK30KKwordW5zaWduZWQgbG9uZyBnZXRfd2NoYW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXJldHVybiBwLT50aHJlYWQud2NoYW47Cit9CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL3Byb2ZpbGUtbG93LlMgYi9hcmNoL21uMTAzMDAva2VybmVsL3Byb2ZpbGUtbG93LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRmZmFjMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvcHJvZmlsZS1sb3cuUwpAQCAtMCwwICsxLDcyIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEZhc3QgcHJvZmlsaW5nIGludGVycnVwdCBoYW5kbGVyCisjCisjIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyMgMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyNpbmNsdWRlIDxsaW51eC9zeXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL2ludGN0bC1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL3RpbWVyLXJlZ3MuaD4KKworI2RlZmluZSBwaSBicmVhaworCisJLmJhbGlnbgk0Citjb3VudGVyOgorCS5sb25nCS0xCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgUHJvZmlsaW5nIGludGVycnVwdCBlbnRyeSBwb2ludAorIyAtIGludGVuZGVkIHRvIHJ1biBhdCBpbnRlcnJ1cHQgcHJpb3JpdHkgMQorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworRU5UUlkocHJvZmlsZV9oYW5kbGVyKQorCW1vdm0JW2QyLGQzLGEyXSwoc3ApCisKKwkjIGlnbm9yZSB1c2Vyc3BhY2UKKwltb3YJKDEyLHNwKSxkMgorCWFuZAlFUFNXX25TTCxkMgorCWJuZQlvdXQKKworCSMgZG8gbm90aGluZyBpZiB0aGVyZSdzIG5vIGJ1ZmZlcgorCW1vdgkocHJvZl9idWZmZXIpLGEyCisJYW5kCWEyLGEyCisJYmVxCW91dAorCW9yCTB4MjAwMDAwMDAsYTIKKworCSMgY2FsY3VsYXRlIHJlbGF0aXZlIHBvc2l0aW9uIGluIHRleHQgc2VnbWVudAorCW1vdgkoMTYsc3ApLGQyCisJc3ViCV9zdGV4dCxkMgorCW1vdgkocHJvZl9zaGlmdCksZDMKKwlsc3IJZDMsZDIKKwltb3YJKHByb2ZfbGVuKSxkMworCWNtcAlkMyxkMgorCWJjYwlvdXRzaWRlX3RleHQKKworCSMgaW5jcmVtZW50IHRoZSBhcHByb3ByaWF0ZSBwcm9maWxlIGJ1Y2tldAorZG9faW5jOgorCWFzbDIJZDIKKwltb3YJKGEyLGQyKSxkMworCWluYwlkMworCW1vdglkMywoYTIsZDIpCitvdXQ6CisJbW92CUd4SUNSX0RFVEVDVCxkMgorCW1vdmJ1CWQyLChUTTExSUNSKQkJIyBBQ0sgdGhlIGludGVycnVwdAorCW1vdmJ1CShUTTExSUNSKSxkMgorCW1vdm0JKHNwKSxbZDIsZDMsYTJdCisJcnRpCisKK291dHNpZGVfdGV4dDoKKwlzdWIJMSxkMworCW1vdglkMyxkMgorCWJyYQlkb19pbmMKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvcHJvZmlsZS5jIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9wcm9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBkN2QwMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvcHJvZmlsZS5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qIE1OMTAzMDAgUHJvZmlsaW5nIHNldHVwCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKy8qCisgKiBpbml0aWFsaXNlIHRoZSBwcm9maWxpbmcgaWYgZW5hYmxlZAorICogLSB1c2luZyB3aXRoIGdkYnN0dWIgd2lsbCBnaXZlIGFub21hbG91cyByZXN1bHRzCisgKiAtIGNhbid0IGJlIHVzZWQgd2l0aCBnZGJzdHViIGlmIHJ1bm5pbmcgYXQgSVJRIHByaW9yaXR5IDAKKyAqLworc3RhdGljIF9faW5pdCBpbnQgcHJvZmlsZV9pbml0KHZvaWQpCit7CisJdTE2IHRtcDsKKworCWlmICghcHJvZl9idWZmZXIpCisJCXJldHVybiAwOworCisJLyogdXNlIHRpbWVyIDExIHRvIGRyaXZlIHRoZSBwcm9maWxpbmcgaW50ZXJydXB0cyAqLworCXNldF9pbnRyX3N0dWIoRVhDRVBfSVJRX0xFVkVMMCwgcHJvZmlsZV9oYW5kbGVyKTsKKworCS8qIHNldCBJUlEgcHJpb3JpdHkgYXQgd2hpY2ggdG8gcnVuICovCisJc2V0X2ludHJfbGV2ZWwoVE0xMUlSUSwgR3hJQ1JfTEVWRUxfMCk7CisKKwkvKiBzZXQgdXAgdGltZXIgMTEKKwkgKiAtIHNvdXJjZTogKElPQ0xLIDMzTUh6KSoyID0gNjZNSHoKKwkgKiAtIGZyZXF1ZW5jeTogKDMzMzMwMDAwKjIpIC8gOCAvIDIwNjI1ID0gMjAySHoKKwkgKi8KKwlUTTExQlIgPSAyMDYyNSAtIDE7CisJVE0xMU1EID0gVE04TURfU1JDX0lPQ0xLXzg7CisJVE0xMU1EIHw9IFRNOE1EX0lOSVRfQ09VTlRFUjsKKwlUTTExTUQgJj0gflRNOE1EX0lOSVRfQ09VTlRFUjsKKwlUTTExTUQgfD0gVE04TURfQ09VTlRfRU5BQkxFOworCisJVE0xMUlDUiB8PSBHeElDUl9FTkFCTEU7CisJdG1wID0gVE0xMUlDUjsKKworCXByaW50ayhLRVJOX0lORk8gIlByb2ZpbGluZyBpbml0aWF0ZWQgb24gdGltZXIgMTEsIHByaW9yaXR5IDAsICV1SHpcbiIsCisJICAgICAgIG1uMTAzMDBfaW9jbGsgLyA4IC8gKFRNMTFCUiArIDEpKTsKKwlwcmludGsoS0VSTl9JTkZPICJQcm9maWxlIGhpc3RvZ3JhbSBzdG9yZWQgJXAtJXBcbiIsCisJICAgICAgIHByb2ZfYnVmZmVyLCAodTggKikocHJvZl9idWZmZXIgKyBwcm9mX2xlbikgLSAxKTsKKworCXJldHVybiAwOworfQorCitfX2luaXRjYWxsKHByb2ZpbGVfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9wdHJhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmQ2Y2RjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9wdHJhY2UuYwpAQCAtMCwwICsxLDM3OSBAQAorLyogTU4xMDMwMCBQcm9jZXNzIHRyYWNpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWF0c3VzaGl0YSBFbGVjdHJpYyBJbmR1c3RyaWFsIENvLiwgTHRkLgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIE1vZGlmaWVkIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvdXNlci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2ZwdS5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorCisvKgorICogdHJhbnNsYXRlIHB0cmFjZSByZWdpc3RlciBJRHMgaW50byBzdHJ1Y3QgcHRfcmVncyBvZmZzZXRzCisgKi8KK3N0YXRpYyBjb25zdCB1OCBwdHJhY2VfcmVnaWRfdG9fZnJhbWVbXSA9IHsKKwlbUFRfQTMgPDwgMl0JCT0gUkVHX0EzLAorCVtQVF9BMiA8PCAyXQkJPSBSRUdfQTIsCisJW1BUX0QzIDw8IDJdCQk9IFJFR19EMywKKwlbUFRfRDIgPDwgMl0JCT0gUkVHX0QyLAorCVtQVF9NQ1ZGIDw8IDJdCQk9IFJFR19NQ1ZGLAorCVtQVF9NQ1JMIDw8IDJdCQk9IFJFR19NQ1JMLAorCVtQVF9NQ1JIIDw8IDJdCQk9IFJFR19NQ1JILAorCVtQVF9NRFJRIDw8IDJdCQk9IFJFR19NRFJRLAorCVtQVF9FMSA8PCAyXQkJPSBSRUdfRTEsCisJW1BUX0UwIDw8IDJdCQk9IFJFR19FMCwKKwlbUFRfRTcgPDwgMl0JCT0gUkVHX0U3LAorCVtQVF9FNiA8PCAyXQkJPSBSRUdfRTYsCisJW1BUX0U1IDw8IDJdCQk9IFJFR19FNSwKKwlbUFRfRTQgPDwgMl0JCT0gUkVHX0U0LAorCVtQVF9FMyA8PCAyXQkJPSBSRUdfRTMsCisJW1BUX0UyIDw8IDJdCQk9IFJFR19FMiwKKwlbUFRfU1AgPDwgMl0JCT0gUkVHX1NQLAorCVtQVF9MQVIgPDwgMl0JCT0gUkVHX0xBUiwKKwlbUFRfTElSIDw8IDJdCQk9IFJFR19MSVIsCisJW1BUX01EUiA8PCAyXQkJPSBSRUdfTURSLAorCVtQVF9BMSA8PCAyXQkJPSBSRUdfQTEsCisJW1BUX0EwIDw8IDJdCQk9IFJFR19BMCwKKwlbUFRfRDEgPDwgMl0JCT0gUkVHX0QxLAorCVtQVF9EMCA8PCAyXQkJPSBSRUdfRDAsCisJW1BUX09SSUdfRDAgPDwgMl0JPSBSRUdfT1JJR19EMCwKKwlbUFRfRVBTVyA8PCAyXQkJPSBSRUdfRVBTVywKKwlbUFRfUEMgPDwgMl0JCT0gUkVHX1BDLAorfTsKKworc3RhdGljIGlubGluZSBpbnQgZ2V0X3N0YWNrX2xvbmcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgb2Zmc2V0KQoreworCXJldHVybiAqKHVuc2lnbmVkIGxvbmcgKikKKwkJKCh1bnNpZ25lZCBsb25nKSB0YXNrLT50aHJlYWQudXJlZ3MgKyBvZmZzZXQpOworfQorCisvKgorICogdGhpcyByb3V0aW5lIHdpbGwgcHV0IGEgd29yZCBvbiB0aGUgcHJvY2Vzc2VzIHByaXZpbGVnZWQgc3RhY2suCisgKiB0aGUgb2Zmc2V0IGlzIGhvdyBmYXIgZnJvbSB0aGUgYmFzZSBhZGRyIGFzIHN0b3JlZCBpbiB0aGUgVFNTLgorICogdGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCBhbGwgdGhlIHByaXZpbGVnZWQgc3RhY2tzIGFyZSBpbiBvdXIKKyAqIGRhdGEgc3BhY2UuCisgKi8KK3N0YXRpYyBpbmxpbmUKK2ludCBwdXRfc3RhY2tfbG9uZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YWNrOworCisJc3RhY2sgPSAodW5zaWduZWQgbG9uZykgdGFzay0+dGhyZWFkLnVyZWdzICsgb2Zmc2V0OworCSoodW5zaWduZWQgbG9uZyAqKSBzdGFjayA9IGRhdGE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfZnByZWdzKHN0cnVjdCBmcHVfc3RhdGVfc3RydWN0ICpidWYsCisJCQkJICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCXJldHVybiBfX2NvcHlfdG9fdXNlcihidWYsICZ0c2stPnRocmVhZC5mcHVfc3RhdGUsCisJCQkgICAgICBzaXplb2Yoc3RydWN0IGZwdV9zdGF0ZV9zdHJ1Y3QpKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHNldF9mcHJlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCisJCQkJICAgICAgIHN0cnVjdCBmcHVfc3RhdGVfc3RydWN0ICpidWYpCit7CisJcmV0dXJuIF9fY29weV9mcm9tX3VzZXIoJnRzay0+dGhyZWFkLmZwdV9zdGF0ZSwgYnVmLAorCQkJCXNpemVvZihzdHJ1Y3QgZnB1X3N0YXRlX3N0cnVjdCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnBzYXZlX2luaXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCW1lbXNldCgmdGFzay0+dGhyZWFkLmZwdV9zdGF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBmcHVfc3RhdGVfc3RydWN0KSk7Cit9CisKKy8qCisgKiBtYWtlIHN1cmUgdGhlIHNpbmdsZSBzdGVwIGJpdCBpcyBub3Qgc2V0CisgKi8KK3ZvaWQgcHRyYWNlX2Rpc2FibGUoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKK3sKKyNpZm5kZWYgQ09ORklHX01OMTAzMDBfVVNJTkdfSlRBRworCXN0cnVjdCB1c2VyICpkdW1teSA9IE5VTEw7CisJbG9uZyB0bXA7CisKKwl0bXAgPSBnZXRfc3RhY2tfbG9uZyhjaGlsZCwgKHVuc2lnbmVkIGxvbmcpICZkdW1teS0+cmVncy5lcHN3KTsKKwl0bXAgJj0gfkVQU1dfVDsKKwlwdXRfc3RhY2tfbG9uZyhjaGlsZCwgKHVuc2lnbmVkIGxvbmcpICZkdW1teS0+cmVncy5lcHN3LCB0bXApOworI2VuZGlmCit9CisKKy8qCisgKiBzZXQgdGhlIHNpbmdsZSBzdGVwIGJpdAorICovCit2b2lkIHB0cmFjZV9lbmFibGUoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKK3sKKyNpZm5kZWYgQ09ORklHX01OMTAzMDBfVVNJTkdfSlRBRworCXN0cnVjdCB1c2VyICpkdW1teSA9IE5VTEw7CisJbG9uZyB0bXA7CisKKwl0bXAgPSBnZXRfc3RhY2tfbG9uZyhjaGlsZCwgKHVuc2lnbmVkIGxvbmcpICZkdW1teS0+cmVncy5lcHN3KTsKKwl0bXAgfD0gRVBTV19UOworCXB1dF9zdGFja19sb25nKGNoaWxkLCAodW5zaWduZWQgbG9uZykgJmR1bW15LT5yZWdzLmVwc3csIHRtcCk7CisjZW5kaWYKK30KKworLyoKKyAqIGhhbmRsZSB0aGUgYXJjaC1zcGVjaWZpYyBzaWRlIG9mIHByb2Nlc3MgdHJhY2luZworICovCitsb25nIGFyY2hfcHRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgcmVxdWVzdCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpCit7CisJc3RydWN0IGZwdV9zdGF0ZV9zdHJ1Y3QgZnB1X3N0YXRlOworCWludCBpLCByZXQ7CisKKwlzd2l0Y2ggKHJlcXVlc3QpIHsKKwkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCisJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IHsKKwkJdW5zaWduZWQgbG9uZyB0bXA7CisJCWludCBjb3BpZWQ7CisKKwkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKKwkJcmV0ID0gLUVJTzsKKwkJaWYgKGNvcGllZCAhPSBzaXplb2YodG1wKSkKKwkJCWJyZWFrOworCQlyZXQgPSBwdXRfdXNlcih0bXAsICh1bnNpZ25lZCBsb25nICopIGRhdGEpOworCQlicmVhazsKKwl9CisKKwkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCisJY2FzZSBQVFJBQ0VfUEVFS0RBVEE6IHsKKwkJdW5zaWduZWQgbG9uZyB0bXA7CisJCWludCBjb3BpZWQ7CisKKwkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKKwkJcmV0ID0gLUVJTzsKKwkJaWYgKGNvcGllZCAhPSBzaXplb2YodG1wKSkKKwkJCWJyZWFrOworCQlyZXQgPSBwdXRfdXNlcih0bXAsICh1bnNpZ25lZCBsb25nICopIGRhdGEpOworCQlicmVhazsKKwl9CisKKwkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KKwljYXNlIFBUUkFDRV9QRUVLVVNSOiB7CisJCXVuc2lnbmVkIGxvbmcgdG1wOworCisJCXJldCA9IC1FSU87CisJCWlmICgoYWRkciAmIDMpIHx8IGFkZHIgPCAwIHx8CisJCSAgICBhZGRyID4gc2l6ZW9mKHN0cnVjdCB1c2VyKSAtIDMpCisJCQlicmVhazsKKworCQl0bXAgPSAwOyAgLyogRGVmYXVsdCByZXR1cm4gY29uZGl0aW9uICovCisJCWlmIChhZGRyIDwgTlJfUFRSRUdTIDw8IDIpCisJCQl0bXAgPSBnZXRfc3RhY2tfbG9uZyhjaGlsZCwKKwkJCQkJICAgICBwdHJhY2VfcmVnaWRfdG9fZnJhbWVbYWRkcl0pOworCQlyZXQgPSBwdXRfdXNlcih0bXAsICh1bnNpZ25lZCBsb25nICopIGRhdGEpOworCQlicmVhazsKKwl9CisKKwkvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLworCWNhc2UgUFRSQUNFX1BPS0VURVhUOgorCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgorCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZkYXRhLCBzaXplb2YoZGF0YSksIDEpID09CisJCSAgICBzaXplb2YoZGF0YSkpCisJCQlyZXQgPSAwOworCQllbHNlCisJCQlyZXQgPSAtRUlPOworCQlicmVhazsKKworCQkvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEgKi8KKwljYXNlIFBUUkFDRV9QT0tFVVNSOgorCQlyZXQgPSAtRUlPOworCQlpZiAoKGFkZHIgJiAzKSB8fCBhZGRyIDwgMCB8fAorCQkgICAgYWRkciA+IHNpemVvZihzdHJ1Y3QgdXNlcikgLSAzKQorCQkJYnJlYWs7CisKKwkJcmV0ID0gMDsKKwkJaWYgKGFkZHIgPCBOUl9QVFJFR1MgPDwgMikKKwkJCXJldCA9IHB1dF9zdGFja19sb25nKGNoaWxkLCBwdHJhY2VfcmVnaWRfdG9fZnJhbWVbYWRkcl0sCisJCQkJCSAgICAgZGF0YSk7CisJCWJyZWFrOworCisJCS8qIGNvbnRpbnVlIGFuZCBzdG9wIGF0IG5leHQgKHJldHVybiBmcm9tKSBzeXNjYWxsICovCisJY2FzZSBQVFJBQ0VfU1lTQ0FMTDoKKwkJLyogcmVzdGFydCBhZnRlciBzaWduYWwuICovCisJY2FzZSBQVFJBQ0VfQ09OVDoKKwkJcmV0ID0gLUVJTzsKKwkJaWYgKCh1bnNpZ25lZCBsb25nKSBkYXRhID4gX05TSUcpCisJCQlicmVhazsKKwkJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1NZU0NBTEwpCisJCQlzZXRfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU1lTQ0FMTF9UUkFDRSk7CisJCWVsc2UKKwkJCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOworCQljaGlsZC0+ZXhpdF9jb2RlID0gZGF0YTsKKwkJcHRyYWNlX2Rpc2FibGUoY2hpbGQpOworCQl3YWtlX3VwX3Byb2Nlc3MoY2hpbGQpOworCQlyZXQgPSAwOworCQlicmVhazsKKworCQkvKgorCQkgKiBtYWtlIHRoZSBjaGlsZCBleGl0CisJCSAqIC0gdGhlIGJlc3QgSSBjYW4gZG8gaXMgc2VuZCBpdCBhIHNpZ2tpbGwKKwkJICogLSBwZXJoYXBzIGl0IHNob3VsZCBiZSBwdXQgaW4gdGhlIHN0YXR1cyB0aGF0IGl0IHdhbnRzIHRvCisJCSAqICAgZXhpdAorCQkgKi8KKwljYXNlIFBUUkFDRV9LSUxMOgorCQlyZXQgPSAwOworCQlpZiAoY2hpbGQtPmV4aXRfc3RhdGUgPT0gRVhJVF9aT01CSUUpCS8qIGFscmVhZHkgZGVhZCAqLworCQkJYnJlYWs7CisJCWNoaWxkLT5leGl0X2NvZGUgPSBTSUdLSUxMOworCQljbGVhcl90c2tfdGhyZWFkX2ZsYWcoY2hpbGQsIFRJRl9TSU5HTEVTVEVQKTsKKwkJcHRyYWNlX2Rpc2FibGUoY2hpbGQpOworCQl3YWtlX3VwX3Byb2Nlc3MoY2hpbGQpOworCQlicmVhazsKKworCWNhc2UgUFRSQUNFX1NJTkdMRVNURVA6IC8qIHNldCB0aGUgdHJhcCBmbGFnLiAqLworI2lmbmRlZiBDT05GSUdfTU4xMDMwMF9VU0lOR19KVEFHCisJCXJldCA9IC1FSU87CisJCWlmICgodW5zaWduZWQgbG9uZykgZGF0YSA+IF9OU0lHKQorCQkJYnJlYWs7CisJCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOworCQlwdHJhY2VfZW5hYmxlKGNoaWxkKTsKKwkJY2hpbGQtPmV4aXRfY29kZSA9IGRhdGE7CisJCXdha2VfdXBfcHJvY2VzcyhjaGlsZCk7CisJCXJldCA9IDA7CisjZWxzZQorCQlyZXQgPSAtRUlOVkFMOworI2VuZGlmCisJCWJyZWFrOworCisJY2FzZSBQVFJBQ0VfREVUQUNIOgkvKiBkZXRhY2ggYSBwcm9jZXNzIHRoYXQgd2FzIGF0dGFjaGVkLiAqLworCQlyZXQgPSBwdHJhY2VfZGV0YWNoKGNoaWxkLCBkYXRhKTsKKwkJYnJlYWs7CisKKwkJLyogR2V0IGFsbCBncCByZWdzIGZyb20gdGhlIGNoaWxkLiAqLworCWNhc2UgUFRSQUNFX0dFVFJFR1M6IHsKKwkJdW5zaWduZWQgbG9uZyB0bXA7CisKKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCAodW5zaWduZWQgKikgZGF0YSwgTlJfUFRSRUdTIDw8IDIpKSB7CisJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgTlJfUFRSRUdTIDw8IDI7IGkgKz0gNCkgeworCQkJdG1wID0gZ2V0X3N0YWNrX2xvbmcoY2hpbGQsIHB0cmFjZV9yZWdpZF90b19mcmFtZVtpXSk7CisJCQlfX3B1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGxvbmcgKikgZGF0YSk7CisJCQlkYXRhICs9IHNpemVvZih0bXApOworCQl9CisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKworCWNhc2UgUFRSQUNFX1NFVFJFR1M6IHsgLyogU2V0IGFsbCBncCByZWdzIGluIHRoZSBjaGlsZC4gKi8KKwkJdW5zaWduZWQgbG9uZyB0bXA7CisKKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsICh1bnNpZ25lZCBsb25nICopZGF0YSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IE5SX1BUUkVHUyA8PCAyOyBpICs9IDQpIHsKKwkJCV9fZ2V0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyAqKSBkYXRhKTsKKwkJCXB1dF9zdGFja19sb25nKGNoaWxkLCBwdHJhY2VfcmVnaWRfdG9fZnJhbWVbaV0sIHRtcCk7CisJCQlkYXRhICs9IHNpemVvZih0bXApOworCQl9CisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKworCWNhc2UgUFRSQUNFX0dFVEZQUkVHUzogeyAvKiBHZXQgdGhlIGNoaWxkIEZQVSBzdGF0ZS4gKi8KKwkJaWYgKGlzX3VzaW5nX2ZwdShjaGlsZCkpIHsKKwkJCXVubGF6eV9mcHUoY2hpbGQpOworCQkJZnB1X3N0YXRlID0gY2hpbGQtPnRocmVhZC5mcHVfc3RhdGU7CisJCX0gZWxzZSB7CisJCQltZW1zZXQoJmZwdV9zdGF0ZSwgMCwgc2l6ZW9mKGZwdV9zdGF0ZSkpOworCQl9CisKKwkJcmV0ID0gLUVJTzsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBkYXRhLCAmZnB1X3N0YXRlLAorCQkJCSBzaXplb2YoZnB1X3N0YXRlKSkgPT0gMCkKKwkJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKworCWNhc2UgUFRSQUNFX1NFVEZQUkVHUzogeyAvKiBTZXQgdGhlIGNoaWxkIEZQVSBzdGF0ZS4gKi8KKwkJcmV0ID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZmcHVfc3RhdGUsIChjb25zdCB2b2lkICopIGRhdGEsCisJCQkJICAgc2l6ZW9mKGZwdV9zdGF0ZSkpID09IDApIHsKKwkJCWZwdV9raWxsX3N0YXRlKGNoaWxkKTsKKwkJCWNoaWxkLT50aHJlYWQuZnB1X3N0YXRlID0gZnB1X3N0YXRlOworCQkJc2V0X3VzaW5nX2ZwdShjaGlsZCk7CisJCQlyZXQgPSAwOworCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgUFRSQUNFX1NFVE9QVElPTlM6IHsKKwkJaWYgKGRhdGEgJiBQVFJBQ0VfT19UUkFDRVNZU0dPT0QpCisJCQljaGlsZC0+cHRyYWNlIHw9IFBUX1RSQUNFU1lTR09PRDsKKwkJZWxzZQorCQkJY2hpbGQtPnB0cmFjZSAmPSB+UFRfVFJBQ0VTWVNHT09EOworCQlyZXQgPSAwOworCQlicmVhazsKKwl9CisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlPOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogbm90aWZpY2F0aW9uIG9mIHN5c3RlbSBjYWxsIGVudHJ5L2V4aXQKKyAqIC0gdHJpZ2dlcmVkIGJ5IGN1cnJlbnQtPndvcmsuc3lzY2FsbF90cmFjZQorICovCithc21saW5rYWdlIHZvaWQgZG9fc3lzY2FsbF90cmFjZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGVudHJ5ZXhpdCkKK3sKKyNpZiAwCisJLyoganVzdCBpbiBjYXNlLi4uICovCisJcHJpbnRrKEtFUk5fREVCVUcgIlslZF0gc3lzY2FsbF8lbHUoJWx4LCVseCwlbHgsJWx4KSA9ICVseFxuIiwKKwkgICAgICAgY3VycmVudC0+cGlkLAorCSAgICAgICByZWdzLT5vcmlnX2QwLAorCSAgICAgICByZWdzLT5hMCwKKwkgICAgICAgcmVncy0+ZDEsCisJICAgICAgIHJlZ3MtPmEzLAorCSAgICAgICByZWdzLT5hMiwKKwkgICAgICAgcmVncy0+ZDApOworCXJldHVybjsKKyNlbmRpZgorCisJaWYgKCF0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1RSQUNFKSAmJgorCSAgICAhdGVzdF90aHJlYWRfZmxhZyhUSUZfU0lOR0xFU1RFUCkpCisJCXJldHVybjsKKwlpZiAoIShjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKSkKKwkJcmV0dXJuOworCisJLyogdGhlIDB4ODAgcHJvdmlkZXMgYSB3YXkgZm9yIHRoZSB0cmFjaW5nIHBhcmVudCB0byBkaXN0aW5ndWlzaAorCSAgIGJldHdlZW4gYSBzeXNjYWxsIHN0b3AgYW5kIFNJR1RSQVAgZGVsaXZlcnkgKi8KKwlwdHJhY2Vfbm90aWZ5KFNJR1RSQVAgfAorCQkgICAgICAoKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1RSQUNFU1lTR09PRCkgJiYKKwkJICAgICAgICF0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKSA/IDB4ODAgOiAwKSk7CisKKwkvKgorCSAqIHRoaXMgaXNuJ3QgdGhlIHNhbWUgYXMgY29udGludWluZyB3aXRoIGEgc2lnbmFsLCBidXQgaXQgd2lsbCBkbworCSAqIGZvciBub3JtYWwgdXNlLiAgc3RyYWNlIG9ubHkgY29udGludWVzIHdpdGggYSBzaWduYWwgaWYgdGhlCisJICogc3RvcHBpbmcgc2lnbmFsIGlzIG5vdCBTSUdUUkFQLiAgLWJybAorCSAqLworCWlmIChjdXJyZW50LT5leGl0X2NvZGUpIHsKKwkJc2VuZF9zaWcoY3VycmVudC0+ZXhpdF9jb2RlLCBjdXJyZW50LCAxKTsKKwkJY3VycmVudC0+ZXhpdF9jb2RlID0gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL3J0Yy5jIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9ydGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDJmNzkyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9ydGMuYwpAQCAtMCwwICsxLDE3MyBAQAorLyogTU4xMDMwMCBSVEMgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisjaW5jbHVkZSA8YXNtL3J0Yy1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL3J0Yy5oPgorCitERUZJTkVfU1BJTkxPQ0socnRjX2xvY2spOworRVhQT1JUX1NZTUJPTChydGNfbG9jayk7CisKKy8qIGxhc3QgdGltZSB0aGUgUlRDIGdvdCB1cGRhdGVkICovCitzdGF0aWMgbG9uZyBsYXN0X3J0Y191cGRhdGU7CisKKy8qIHRpbWUgZm9yIFJUQyB0byB1cGRhdGUgaXRzZWxmIGluIGlvY2xrcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbW4xMDMwMF9ydGNfdXBkYXRlX3BlcmlvZDsKKworLyoKKyAqIHJlYWQgdGhlIGN1cnJlbnQgUlRDIHRpbWUKKyAqLwordW5zaWduZWQgbG9uZyBfX2luaXQgZ2V0X2luaXRpYWxfcnRjX3RpbWUodm9pZCkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisKKwlnZXRfcnRjX3RpbWUoJnRtKTsKKworCXJldHVybiBta3RpbWUodG0udG1feWVhciwgdG0udG1fbW9uLCB0bS50bV9tZGF5LAorCQkgICAgICB0bS50bV9ob3VyLCB0bS50bV9taW4sIHRtLnRtX3NlYyk7Cit9CisKKy8qCisgKiBJbiBvcmRlciB0byBzZXQgdGhlIENNT1MgY2xvY2sgcHJlY2lzZWx5LCBzZXRfcnRjX21tc3MgaGFzIHRvIGJlIGNhbGxlZCA1MDAKKyAqIG1zIGFmdGVyIHRoZSBzZWNvbmQgbm93dGltZSBoYXMgc3RhcnRlZCwgYmVjYXVzZSB3aGVuIG5vd3RpbWUgaXMgd3JpdHRlbgorICogaW50byB0aGUgcmVnaXN0ZXJzIG9mIHRoZSBDTU9TIGNsb2NrLCBpdCB3aWxsIGp1bXAgdG8gdGhlIG5leHQgc2Vjb25kCisgKiBwcmVjaXNlbHkgNTAwIG1zIGxhdGVyLiAgQ2hlY2sgdGhlIE1vdG9yb2xhIE1DMTQ2ODE4QSBvciBEYWxsYXMgRFMxMjg4NyBkYXRhCisgKiBzaGVldCBmb3IgZGV0YWlscy4KKyAqCisgKiBCVUc6IFRoaXMgcm91dGluZSBkb2VzIG5vdCBoYW5kbGUgaG91ciBvdmVyZmxvdyBwcm9wZXJseTsgaXQganVzdAorICogICAgICBzZXRzIHRoZSBtaW51dGVzLiBVc3VhbGx5IHlvdSdsbCBvbmx5IG5vdGljZSB0aGF0IGFmdGVyIHJlYm9vdCEKKyAqLworc3RhdGljIGludCBzZXRfcnRjX21tc3ModW5zaWduZWQgbG9uZyBub3d0aW1lKQoreworCXVuc2lnbmVkIGNoYXIgc2F2ZV9jb250cm9sLCBzYXZlX2ZyZXFfc2VsZWN0OworCWludCByZXR2YWwgPSAwOworCWludCByZWFsX3NlY29uZHMsIHJlYWxfbWludXRlcywgY21vc19taW51dGVzOworCisJLyogZ2V0cyByZWNhbGxlZCB3aXRoIGlycSBsb2NhbGx5IGRpc2FibGVkICovCisJc3Bpbl9sb2NrKCZydGNfbG9jayk7CisJc2F2ZV9jb250cm9sID0gQ01PU19SRUFEKFJUQ19DT05UUk9MKTsgLyogdGVsbCB0aGUgY2xvY2sgaXQncyBiZWluZworCQkJCQkJKiBzZXQgKi8KKwlDTU9TX1dSSVRFKHNhdmVfY29udHJvbCB8IFJUQ19TRVQsIFJUQ19DT05UUk9MKTsKKworCXNhdmVfZnJlcV9zZWxlY3QgPSBDTU9TX1JFQUQoUlRDX0ZSRVFfU0VMRUNUKTsgLyogc3RvcCBhbmQgcmVzZXQKKwkJCQkJCQkqIHByZXNjYWxlciAqLworCUNNT1NfV1JJVEUoc2F2ZV9mcmVxX3NlbGVjdCB8IFJUQ19ESVZfUkVTRVQyLCBSVENfRlJFUV9TRUxFQ1QpOworCisJY21vc19taW51dGVzID0gQ01PU19SRUFEKFJUQ19NSU5VVEVTKTsKKwlpZiAoIShzYXZlX2NvbnRyb2wgJiBSVENfRE1fQklOQVJZKSB8fCBSVENfQUxXQVlTX0JDRCkKKwkJQkNEX1RPX0JJTihjbW9zX21pbnV0ZXMpOworCisJLyoKKwkgKiBzaW5jZSB3ZSdyZSBvbmx5IGFkanVzdGluZyBtaW51dGVzIGFuZCBzZWNvbmRzLAorCSAqIGRvbid0IGludGVyZmVyZSB3aXRoIGhvdXIgb3ZlcmZsb3cuIFRoaXMgYXZvaWRzCisJICogbWVzc2luZyB3aXRoIHVua25vd24gdGltZSB6b25lcyBidXQgcmVxdWlyZXMgeW91cgorCSAqIFJUQyBub3QgdG8gYmUgb2ZmIGJ5IG1vcmUgdGhhbiAxNSBtaW51dGVzCisJICovCisJcmVhbF9zZWNvbmRzID0gbm93dGltZSAlIDYwOworCXJlYWxfbWludXRlcyA9IG5vd3RpbWUgLyA2MDsKKwlpZiAoKChhYnMocmVhbF9taW51dGVzIC0gY21vc19taW51dGVzKSArIDE1KSAvIDMwKSAmIDEpCisJCS8qIGNvcnJlY3QgZm9yIGhhbGYgaG91ciB0aW1lIHpvbmUgKi8KKwkJcmVhbF9taW51dGVzICs9IDMwOworCXJlYWxfbWludXRlcyAlPSA2MDsKKworCWlmIChhYnMocmVhbF9taW51dGVzIC0gY21vc19taW51dGVzKSA8IDMwKSB7CisJCWlmICghKHNhdmVfY29udHJvbCAmIFJUQ19ETV9CSU5BUlkpIHx8IFJUQ19BTFdBWVNfQkNEKSB7CisJCQlCSU5fVE9fQkNEKHJlYWxfc2Vjb25kcyk7CisJCQlCSU5fVE9fQkNEKHJlYWxfbWludXRlcyk7CisJCX0KKwkJQ01PU19XUklURShyZWFsX3NlY29uZHMsIFJUQ19TRUNPTkRTKTsKKwkJQ01PU19XUklURShyZWFsX21pbnV0ZXMsIFJUQ19NSU5VVEVTKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAic2V0X3J0Y19tbXNzOiBjYW4ndCB1cGRhdGUgZnJvbSAlZCB0byAlZFxuIiwKKwkJICAgICAgIGNtb3NfbWludXRlcywgcmVhbF9taW51dGVzKTsKKwkJcmV0dmFsID0gLTE7CisJfQorCisJLyogVGhlIGZvbGxvd2luZyBmbGFncyBoYXZlIHRvIGJlIHJlbGVhc2VkIGV4YWN0bHkgaW4gdGhpcyBvcmRlciwKKwkgKiBvdGhlcndpc2UgdGhlIERTMTI4ODcgKHBvcHVsYXIgTUMxNDY4MThBIGNsb25lIHdpdGggaW50ZWdyYXRlZAorCSAqIGJhdHRlcnkgYW5kIHF1YXJ0eikgd2lsbCBub3QgcmVzZXQgdGhlIG9zY2lsbGF0b3IgYW5kIHdpbGwgbm90CisJICogdXBkYXRlIHByZWNpc2VseSA1MDAgbXMgbGF0ZXIuIFlvdSB3b24ndCBmaW5kIHRoaXMgbWVudGlvbmVkIGluCisJICogdGhlIERhbGxhcyBTZW1pY29uZHVjdG9yIGRhdGEgc2hlZXRzLCBidXQgd2hvIGJlbGlldmVzIGRhdGEKKwkgKiBzaGVldHMgYW55d2F5IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIE1hcmt1cyBLdWhuCisJICovCisJQ01PU19XUklURShzYXZlX2NvbnRyb2wsIFJUQ19DT05UUk9MKTsKKwlDTU9TX1dSSVRFKHNhdmVfZnJlcV9zZWxlY3QsIFJUQ19GUkVRX1NFTEVDVCk7CisJc3Bpbl91bmxvY2soJnJ0Y19sb2NrKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3ZvaWQgY2hlY2tfcnRjX3RpbWUodm9pZCkKK3sKKwkvKiB0aGUgUlRDIGNsb2NrIGp1c3QgZmluaXNoZWQgdGlja2luZyBvdmVyIGFnYWluIHRoaXMgc2Vjb25kCisJICogLSBpZiB3ZSBoYXZlIGFuIGV4dGVybmFsbHkgc3luY2hyb25pemVkIExpbnV4IGNsb2NrLCB0aGVuIHVwZGF0ZQorCSAqICAgUlRDIGNsb2NrIGFjY29yZGluZ2x5IGV2ZXJ5IH4xMSBtaW51dGVzLiBzZXRfcnRjX21tc3MoKSBoYXMgdG8gYmUKKwkgKiAgIGNhbGxlZCBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byA1MDAgbXMgYmVmb3JlIHRoZSBuZXcgc2Vjb25kIHN0YXJ0cy4KKwkgKi8KKwlpZiAoKHRpbWVfc3RhdHVzICYgU1RBX1VOU1lOQykgPT0gMCAmJgorCSAgICB4dGltZS50dl9zZWMgPiBsYXN0X3J0Y191cGRhdGUgKyA2NjAgJiYKKwkgICAgeHRpbWUudHZfbnNlYyAvIDEwMDAgPj0gNTAwMDAwIC0gKCh1bnNpZ25lZCkgVElDS19TSVpFKSAvIDIgJiYKKwkgICAgeHRpbWUudHZfbnNlYyAvIDEwMDAgPD0gNTAwMDAwICsgKCh1bnNpZ25lZCkgVElDS19TSVpFKSAvIDIKKwkgICAgKSB7CisJCWlmIChzZXRfcnRjX21tc3MoeHRpbWUudHZfc2VjKSA9PSAwKQorCQkJbGFzdF9ydGNfdXBkYXRlID0geHRpbWUudHZfc2VjOworCQllbHNlCisJCQkvKiBkbyBpdCBhZ2FpbiBpbiA2MHMgKi8KKwkJCWxhc3RfcnRjX3VwZGF0ZSA9IHh0aW1lLnR2X3NlYyAtIDYwMDsKKwl9Cit9CisKKy8qCisgKiBjYWxpYnJhdGUgdGhlIFRTQyBjbG9jayBhZ2FpbnN0IHRoZSBSVEMKKyAqLwordm9pZCBfX2luaXQgY2FsaWJyYXRlX2Nsb2NrKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjb3VudDAsIGNvdW50aCwgY291bnQxOworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCisJLyogbWFrZSBzdXJlIHRoZSBSVEMgaXMgcnVubmluZyBhbmQgaXMgc2V0IHRvIG9wZXJhdGUgaW4gMjRociBtb2RlICovCisJc3RhdHVzID0gUlRTUkM7CisJUlRDUkIgfD0gUlRDUkJfU0VUOworCVJUQ1JCIHw9IFJUQ1JCX1RNXzI0SFI7CisJUlRDUkEgfD0gUlRDUkFfRFZSOworCVJUQ1JBICY9IH5SVENSQV9EVlI7CisJUlRDUkIgJj0gflJUQ1JCX1NFVDsKKworCS8qIHdvcmsgb3V0IHRoZSBjbG9jayBzcGVlZCBieSBjb3VudGluZyBjbG9jayBjeWNsZXMgYmV0d2VlbiBlbmRzIG9mCisJICogdGhlIFJUQyB1cGRhdGUgY3ljbGUgLSB0cmFjayB0aGUgUlRDIHRocm91Z2ggb25lIGNvbXBsZXRlIHVwZGF0ZQorCSAqIGN5Y2xlICgxIHNlY29uZCkKKwkgKi8KKwlzdGFydHVwX3RpbWVzdGFtcF9jb3VudGVyKCk7CisKKwl3aGlsZSAoIShSVENSQSAmIFJUQ1JBX1VJUCkpIHt9CisJd2hpbGUgKChSVENSQSAmIFJUQ1JBX1VJUCkpIHt9CisKKwljb3VudDAgPSBUTVRTQ0JDOworCisJd2hpbGUgKCEoUlRDUkEgJiBSVENSQV9VSVApKSB7fQorCisJY291bnRoID0gVE1UU0NCQzsKKworCXdoaWxlICgoUlRDUkEgJiBSVENSQV9VSVApKSB7fQorCisJY291bnQxID0gVE1UU0NCQzsKKworCXNodXRkb3duX3RpbWVzdGFtcF9jb3VudGVyKCk7CisKKwlNTjEwMzAwX1RTQ0NMSyA9IGNvdW50MCAtIGNvdW50MTsgLyogdGhlIHRpbWVycyBjb3VudCBkb3duICovCisJbW4xMDMwMF9ydGNfdXBkYXRlX3BlcmlvZCA9IGNvdW50aCAtIGNvdW50MTsKKwlNTjEwMzAwX1RTQ19QRVJfSFogPSBNTjEwMzAwX1RTQ0NMSyAvIEhaOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9zZW1hcGhvcmUuYyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvc2VtYXBob3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE1M2M0MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvc2VtYXBob3JlLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qIE1OMTAzMDAgU2VtYXBob3JlIGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKK3N0cnVjdCBzZW1fd2FpdGVyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOworfTsKKworI2lmIFNFTUFQSE9SRV9ERUJVRwordm9pZCBzZW10cmFjZShzdHJ1Y3Qgc2VtYXBob3JlICpzZW0sIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpZiAoc2VtLT5kZWJ1ZykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlslZF0gJXMoeyVkLCVkfSlcbiIsCisJCSAgICAgICBjdXJyZW50LT5waWQsCisJCSAgICAgICBzdHIsCisJCSAgICAgICBhdG9taWNfcmVhZCgmc2VtLT5jb3VudCksCisJCSAgICAgICBsaXN0X2VtcHR5KCZzZW0tPndhaXRfbGlzdCkgPyAwIDogMSk7Cit9CisjZWxzZQorI2RlZmluZSBzZW10cmFjZShTRU0sIFNUUikgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qCisgKiB3YWl0IGZvciBhIHRva2VuIHRvIGJlIGdyYW50ZWQgZnJvbSBhIHNlbWFwaG9yZQorICogLSBlbnRlcmVkIHdpdGggbG9jayBoZWxkIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkCisgKi8KK3ZvaWQgX19kb3duKHN0cnVjdCBzZW1hcGhvcmUgKnNlbSwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJc3RydWN0IHNlbV93YWl0ZXIgd2FpdGVyOworCisJc2VtdHJhY2Uoc2VtLCAiRW50ZXJpbmcgX19kb3duIik7CisKKwkvKiBzZXQgdXAgbXkgb3duIHN0eWxlIG9mIHdhaXRxdWV1ZSAqLworCXdhaXRlci50YXNrID0gdHNrOworCWdldF90YXNrX3N0cnVjdCh0c2spOworCisJbGlzdF9hZGRfdGFpbCgmd2FpdGVyLmxpc3QsICZzZW0tPndhaXRfbGlzdCk7CisKKwkvKiB3ZSBkb24ndCBuZWVkIHRvIHRvdWNoIHRoZSBzZW1hcGhvcmUgc3RydWN0IGFueW1vcmUgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZW0tPndhaXRfbG9jaywgZmxhZ3MpOworCisJLyogd2FpdCB0byBiZSBnaXZlbiB0aGUgc2VtYXBob3JlICovCisJc2V0X3Rhc2tfc3RhdGUodHNrLCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisKKwlmb3IgKDs7KSB7CisJCWlmICghd2FpdGVyLnRhc2spCisJCQlicmVhazsKKwkJc2NoZWR1bGUoKTsKKwkJc2V0X3Rhc2tfc3RhdGUodHNrLCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJfQorCisJdHNrLT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwlzZW10cmFjZShzZW0sICJMZWF2aW5nIF9fZG93biIpOworfQorRVhQT1JUX1NZTUJPTChfX2Rvd24pOworCisvKgorICogaW50ZXJydXB0aWJseSB3YWl0IGZvciBhIHRva2VuIHRvIGJlIGdyYW50ZWQgZnJvbSBhIHNlbWFwaG9yZQorICogLSBlbnRlcmVkIHdpdGggbG9jayBoZWxkIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkCisgKi8KK2ludCBfX2Rvd25faW50ZXJydXB0aWJsZShzdHJ1Y3Qgc2VtYXBob3JlICpzZW0sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCXN0cnVjdCBzZW1fd2FpdGVyIHdhaXRlcjsKKwlpbnQgcmV0OworCisJc2VtdHJhY2Uoc2VtLCAiRW50ZXJpbmcgX19kb3duX2ludGVycnVwdGlibGUiKTsKKworCS8qIHNldCB1cCBteSBvd24gc3R5bGUgb2Ygd2FpdHF1ZXVlICovCisJd2FpdGVyLnRhc2sgPSB0c2s7CisJZ2V0X3Rhc2tfc3RydWN0KHRzayk7CisKKwlsaXN0X2FkZF90YWlsKCZ3YWl0ZXIubGlzdCwgJnNlbS0+d2FpdF9saXN0KTsKKworCS8qIHdlIGRvbid0IG5lZWQgdG8gdG91Y2ggdGhlIHNlbWFwaG9yZSBzdHJ1Y3QgYW55bW9yZSAqLworCXNldF90YXNrX3N0YXRlKHRzaywgVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbS0+d2FpdF9sb2NrLCBmbGFncyk7CisKKwkvKiB3YWl0IHRvIGJlIGdpdmVuIHRoZSBzZW1hcGhvcmUgKi8KKwlyZXQgPSAwOworCWZvciAoOzspIHsKKwkJaWYgKCF3YWl0ZXIudGFzaykKKwkJCWJyZWFrOworCQlpZiAodW5saWtlbHkoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpKQorCQkJZ290byBpbnRlcnJ1cHRlZDsKKwkJc2NoZWR1bGUoKTsKKwkJc2V0X3Rhc2tfc3RhdGUodHNrLCBUQVNLX0lOVEVSUlVQVElCTEUpOworCX0KKworIG91dDoKKwl0c2stPnN0YXRlID0gVEFTS19SVU5OSU5HOworCXNlbXRyYWNlKHNlbSwgIkxlYXZpbmcgX19kb3duX2ludGVycnVwdGlibGUiKTsKKwlyZXR1cm4gcmV0OworCisgaW50ZXJydXB0ZWQ6CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbS0+d2FpdF9sb2NrLCBmbGFncyk7CisJbGlzdF9kZWwoJndhaXRlci5saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZW0tPndhaXRfbG9jaywgZmxhZ3MpOworCisJcmV0ID0gMDsKKwlpZiAoIXdhaXRlci50YXNrKSB7CisJCXB1dF90YXNrX3N0cnVjdChjdXJyZW50KTsKKwkJcmV0ID0gLUVJTlRSOworCX0KKwlnb3RvIG91dDsKK30KK0VYUE9SVF9TWU1CT0woX19kb3duX2ludGVycnVwdGlibGUpOworCisvKgorICogcmVsZWFzZSBhIHNpbmdsZSB0b2tlbiBiYWNrIHRvIGEgc2VtYXBob3JlCisgKiAtIGVudGVyZWQgd2l0aCBsb2NrIGhlbGQgYW5kIGludGVycnVwdHMgZGlzYWJsZWQKKyAqLwordm9pZCBfX3VwKHN0cnVjdCBzZW1hcGhvcmUgKnNlbSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKKwlzdHJ1Y3Qgc2VtX3dhaXRlciAqd2FpdGVyOworCisJc2VtdHJhY2Uoc2VtLCAiRW50ZXJpbmcgX191cCIpOworCisJLyogZ3JhbnQgdGhlIHRva2VuIHRvIHRoZSBwcm9jZXNzIGF0IHRoZSBmcm9udCBvZiB0aGUgcXVldWUgKi8KKwl3YWl0ZXIgPSBsaXN0X2VudHJ5KHNlbS0+d2FpdF9saXN0Lm5leHQsIHN0cnVjdCBzZW1fd2FpdGVyLCBsaXN0KTsKKworCS8qIFdlIG11c3QgYmUgY2FyZWZ1bCBub3QgdG8gdG91Y2ggJ3dhaXRlcicgYWZ0ZXIgd2Ugc2V0IC0+dGFzayA9IE5VTEwuCisJICogSXQgaXMgYW4gYWxsb2NhdGVkIG9uIHRoZSB3YWl0ZXIncyBzdGFjayBhbmQgbWF5IGJlY29tZSBpbnZhbGlkIGF0CisJICogYW55IHRpbWUgYWZ0ZXIgdGhhdCBwb2ludCAoZHVlIHRvIGEgd2FrZXVwIGZyb20gYW5vdGhlciBzb3VyY2UpLgorCSAqLworCWxpc3RfZGVsX2luaXQoJndhaXRlci0+bGlzdCk7CisJdHNrID0gd2FpdGVyLT50YXNrOworCXNtcF9tYigpOworCXdhaXRlci0+dGFzayA9IE5VTEw7CisJd2FrZV91cF9wcm9jZXNzKHRzayk7CisJcHV0X3Rhc2tfc3RydWN0KHRzayk7CisKKwlzZW10cmFjZShzZW0sICJMZWF2aW5nIF9fdXAiKTsKK30KK0VYUE9SVF9TWU1CT0woX191cCk7CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL3NldHVwLmMgYi9hcmNoL21uMTAzMDAva2VybmVsL3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI3Y2UyNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvc2V0dXAuYwpAQCAtMCwwICsxLDI5OCBAQAorLyogTU4xMDMwMCBBcmNoLXNwZWNpZmljIGluaXRpYWxpc2F0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jL3Byb2MuaD4KKyNpbmNsdWRlIDxhc20vYnVzY3RsLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vZnB1Lmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisKK3N0cnVjdCBtbjEwMzAwX2NwdWluZm8gYm9vdF9jcHVfZGF0YTsKKworLyogRm9yIFBDSSBvciBvdGhlciBtZW1vcnktbWFwcGVkIHJlc291cmNlcyAqLwordW5zaWduZWQgbG9uZyBwY2lfbWVtX3N0YXJ0ID0gMHgxODAwMDAwMDsKKworY2hhciByZWRib290X2NvbW1hbmRfbGluZVtDT01NQU5EX0xJTkVfU0laRV0gPQorCSJjb25zb2xlPXR0eVMwLDExNTIwMCByb290PS9kZXYvbXRkYmxvY2szIHJ3IjsKKworY2hhciBfX2luaXRkYXRhIHJlZGJvb3RfcGxhdGZvcm1fbmFtZVtDT01NQU5EX0xJTkVfU0laRV07CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY29kZV9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJPSAweDEwMDAwMCwKKwkuZW5kCT0gMCwKKwkubmFtZQk9ICJLZXJuZWwgY29kZSIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGRhdGFfcmVzb3VyY2UgPSB7CisJLnN0YXJ0CT0gMCwKKwkuZW5kCT0gMCwKKwkubmFtZQk9ICJLZXJuZWwgZGF0YSIsCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIHBoeXNfbWVtb3J5X2Jhc2U7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIHBoeXNfbWVtb3J5X2VuZDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgbWVtb3J5X2VuZDsKK3Vuc2lnbmVkIGxvbmcgbWVtb3J5X3NpemU7CisKK3N0cnVjdCB0aHJlYWRfaW5mbyAqX19jdXJyZW50X3RpID0gJmluaXRfdGhyZWFkX3VuaW9uLnRocmVhZF9pbmZvOworc3RydWN0IHRhc2tfc3RydWN0ICpfX2N1cnJlbnQgPSAmaW5pdF90YXNrOworCisjZGVmaW5lIG1uMTAzMDBfa25vd25fY3B1cyAzCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbW4xMDMwMF9jcHV0eXBlc1tdID0geworCSJhbTMzdjEiLAorCSJhbTMzdjIiLAorCSJhbTM0djEiLAorCSJ1bmtub3duIgorfTsKKworLyoKKyAqCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBwYXJzZV9tZW1fY21kbGluZShjaGFyICoqY21kbGluZV9wKQoreworCWNoYXIgKmZyb20sICp0bywgYzsKKworCS8qIHNhdmUgdW5wYXJzZWQgY29tbWFuZCBsaW5lIGNvcHkgZm9yIC9wcm9jL2NtZGxpbmUgKi8KKwlzdHJjcHkoYm9vdF9jb21tYW5kX2xpbmUsIHJlZGJvb3RfY29tbWFuZF9saW5lKTsKKworCS8qIHNlZSBpZiB0aGVyZSdzIGFuIGV4cGxpY2l0IG1lbW9yeSBzaXplIG9wdGlvbiAqLworCWZyb20gPSByZWRib290X2NvbW1hbmRfbGluZTsKKwl0byA9IHJlZGJvb3RfY29tbWFuZF9saW5lOworCWMgPSAnICc7CisKKwlmb3IgKDs7KSB7CisJCWlmIChjID09ICcgJyAmJiAhbWVtY21wKGZyb20sICJtZW09IiwgNCkpIHsKKwkJCWlmICh0byAhPSByZWRib290X2NvbW1hbmRfbGluZSkKKwkJCQl0by0tOworCQkJbWVtb3J5X3NpemUgPSBtZW1wYXJzZShmcm9tICsgNCwgJmZyb20pOworCQl9CisKKwkJYyA9ICooZnJvbSsrKTsKKwkJaWYgKCFjKQorCQkJYnJlYWs7CisKKwkJKih0bysrKSA9IGM7CisJfQorCisJKnRvID0gJ1wwJzsKKwkqY21kbGluZV9wID0gcmVkYm9vdF9jb21tYW5kX2xpbmU7CisKKwlpZiAobWVtb3J5X3NpemUgPT0gMCkKKwkJcGFuaWMoIk1lbW9yeSBzaXplIG5vdCBrbm93blxuIik7CisKKwltZW1vcnlfZW5kID0gKHVuc2lnbmVkIGxvbmcpIENPTkZJR19LRVJORUxfUkFNX0JBU0VfQUREUkVTUyArCisJCW1lbW9yeV9zaXplOworCWlmIChtZW1vcnlfZW5kID4gcGh5c19tZW1vcnlfZW5kKQorCQltZW1vcnlfZW5kID0gcGh5c19tZW1vcnlfZW5kOworfQorCisvKgorICogYXJjaGl0ZWN0dXJlIHNwZWNpZmljIHNldHVwCisgKi8KK3ZvaWQgX19pbml0IHNldHVwX2FyY2goY2hhciAqKmNtZGxpbmVfcCkKK3sKKwl1bnNpZ25lZCBsb25nIGJvb3RtYXBfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGtzdGFydF9wZm4sIHN0YXJ0X3BmbiwgZnJlZV9wZm4sIGVuZF9wZm47CisKKwljcHVfaW5pdCgpOworCXVuaXRfc2V0dXAoKTsKKwlwYXJzZV9tZW1fY21kbGluZShjbWRsaW5lX3ApOworCisJaW5pdF9tbS5zdGFydF9jb2RlID0gKHVuc2lnbmVkIGxvbmcpJl90ZXh0OworCWluaXRfbW0uZW5kX2NvZGUgPSAodW5zaWduZWQgbG9uZykgJl9ldGV4dDsKKwlpbml0X21tLmVuZF9kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZfZWRhdGE7CisJaW5pdF9tbS5icmsgPSAodW5zaWduZWQgbG9uZykgJl9lbmQ7CisKKwljb2RlX3Jlc291cmNlLnN0YXJ0ID0gdmlydF90b19idXMoJl90ZXh0KTsKKwljb2RlX3Jlc291cmNlLmVuZCA9IHZpcnRfdG9fYnVzKCZfZXRleHQpLTE7CisJZGF0YV9yZXNvdXJjZS5zdGFydCA9IHZpcnRfdG9fYnVzKCZfZXRleHQpOworCWRhdGFfcmVzb3VyY2UuZW5kID0gdmlydF90b19idXMoJl9lZGF0YSktMTsKKworI2RlZmluZSBQRk5fVVAoeCkJKCgoeCkgKyBQQUdFX1NJWkUtMSkgPj4gUEFHRV9TSElGVCkKKyNkZWZpbmUgUEZOX0RPV04oeCkJKCh4KSA+PiBQQUdFX1NISUZUKQorI2RlZmluZSBQRk5fUEhZUyh4KQkoKHgpIDw8IFBBR0VfU0hJRlQpCisKKwlzdGFydF9wZm4gPSAoQ09ORklHX0tFUk5FTF9SQU1fQkFTRV9BRERSRVNTID4+IFBBR0VfU0hJRlQpOworCWtzdGFydF9wZm4gPSBQRk5fVVAoX19wYSgmX3RleHQpKTsKKwlmcmVlX3BmbiA9IFBGTl9VUChfX3BhKCZfZW5kKSk7CisJZW5kX3BmbiA9IFBGTl9ET1dOKF9fcGEobWVtb3J5X2VuZCkpOworCisJYm9vdG1hcF9zaXplID0gaW5pdF9ib290bWVtX25vZGUoJmNvbnRpZ19wYWdlX2RhdGEsCisJCQkJCSBmcmVlX3BmbiwKKwkJCQkJIHN0YXJ0X3BmbiwKKwkJCQkJIGVuZF9wZm4pOworCisJaWYgKGtzdGFydF9wZm4gPiBzdGFydF9wZm4pCisJCWZyZWVfYm9vdG1lbShQRk5fUEhZUyhzdGFydF9wZm4pLAorCQkJICAgICBQRk5fUEhZUyhrc3RhcnRfcGZuIC0gc3RhcnRfcGZuKSk7CisKKwlmcmVlX2Jvb3RtZW0oUEZOX1BIWVMoZnJlZV9wZm4pLAorCQkgICAgIFBGTl9QSFlTKGVuZF9wZm4gLSBmcmVlX3BmbikpOworCisJLyogSWYgaW50ZXJydXB0IHZlY3RvciB0YWJsZSBpcyBpbiBtYWluIHJhbSwgdGhlbiB3ZSBuZWVkIHRvCisJICAgcmVzZXJ2ZSB0aGUgcGFnZSBpdCBpcyBvY2N1cHlpbmcuICovCisJaWYgKENPTkZJR19JTlRFUlJVUFRfVkVDVE9SX0JBU0UgPj0gQ09ORklHX0tFUk5FTF9SQU1fQkFTRV9BRERSRVNTICYmCisJICAgIENPTkZJR19JTlRFUlJVUFRfVkVDVE9SX0JBU0UgPCBtZW1vcnlfZW5kKQorCQlyZXNlcnZlX2Jvb3RtZW0oQ09ORklHX0lOVEVSUlVQVF9WRUNUT1JfQkFTRSwgMSwKKwkJCQlCT09UTUVNX0RFRkFVTFQpOworCisJcmVzZXJ2ZV9ib290bWVtKFBBR0VfQUxJR04oUEZOX1BIWVMoZnJlZV9wZm4pKSwgYm9vdG1hcF9zaXplLAorCQkJQk9PVE1FTV9ERUZBVUxUKTsKKworI2lmZGVmIENPTkZJR19WVAorI2lmIGRlZmluZWQoQ09ORklHX1ZHQV9DT05TT0xFKQorCWNvbnN3aXRjaHAgPSAmdmdhX2NvbjsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0RVTU1ZX0NPTlNPTEUpCisJY29uc3dpdGNocCA9ICZkdW1teV9jb247CisjZW5kaWYKKyNlbmRpZgorCisJcGFnaW5nX2luaXQoKTsKK30KKworLyoKKyAqIHBlcmZvcm0gQ1BVIGluaXRpYWxpc2F0aW9uCisgKi8KK3ZvaWQgX19pbml0IGNwdV9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjcHVyZXYgPSBDUFVSRVYsIHR5cGU7CisJdW5zaWduZWQgbG9uZyBiYXNlLCBzaXplOworCisJdHlwZSA9IChDUFVSRVYgJiBDUFVSRVZfVFlQRSkgPj4gQ1BVUkVWX1RZUEVfUzsKKwlpZiAodHlwZSA+IG1uMTAzMDBfa25vd25fY3B1cykKKwkJdHlwZSA9IG1uMTAzMDBfa25vd25fY3B1czsKKworCXByaW50ayhLRVJOX0lORk8gIk1hdHN1c2hpdGEgJXMsIHJldiAlbGRcbiIsCisJICAgICAgIG1uMTAzMDBfY3B1dHlwZXNbdHlwZV0sCisJICAgICAgIChjcHVyZXYgJiBDUFVSRVZfUkVWSVNJT04pID4+IENQVVJFVl9SRVZJU0lPTl9TKTsKKworCS8qIGRldGVybWluZSB0aGUgbWVtb3J5IHNpemUgYW5kIGJhc2UgZnJvbSB0aGUgbWVtb3J5IGNvbnRyb2xsZXIgcmVncyAqLworCW1lbW9yeV9zaXplID0gMDsKKworCWJhc2UgPSBTREJBU0UoMCk7CisJaWYgKGJhc2UgJiBTREJBU0VfQ0UpIHsKKwkJc2l6ZSA9IChiYXNlICYgU0RCQVNFX0NCQU0pIDw8IFNEQkFTRV9DQkFNX1NISUZUOworCQlzaXplID0gfnNpemUgKyAxOworCQliYXNlICY9IFNEQkFTRV9DQkE7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiU0RSQU1bMF06ICVsdU1iIEAlMDhseFxuIiwgc2l6ZSA+PiAyMCwgYmFzZSk7CisJCW1lbW9yeV9zaXplICs9IHNpemU7CisJCXBoeXNfbWVtb3J5X2Jhc2UgPSBiYXNlOworCX0KKworCWJhc2UgPSBTREJBU0UoMSk7CisJaWYgKGJhc2UgJiBTREJBU0VfQ0UpIHsKKwkJc2l6ZSA9IChiYXNlICYgU0RCQVNFX0NCQU0pIDw8IFNEQkFTRV9DQkFNX1NISUZUOworCQlzaXplID0gfnNpemUgKyAxOworCQliYXNlICY9IFNEQkFTRV9DQkE7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiU0RSQU1bMV06ICVsdU1iIEAlMDhseFxuIiwgc2l6ZSA+PiAyMCwgYmFzZSk7CisJCW1lbW9yeV9zaXplICs9IHNpemU7CisJCWlmIChwaHlzX21lbW9yeV9iYXNlID09IDApCisJCQlwaHlzX21lbW9yeV9iYXNlID0gYmFzZTsKKwl9CisKKwlwaHlzX21lbW9yeV9lbmQgPSBwaHlzX21lbW9yeV9iYXNlICsgbWVtb3J5X3NpemU7CisKKyNpZmRlZiBDT05GSUdfRlBVCisJZnB1X2luaXRfc3RhdGUoKTsKKyNlbmRpZgorfQorCisvKgorICogR2V0IENQVSBpbmZvcm1hdGlvbiBmb3IgdXNlIGJ5IHRoZSBwcm9jZnMuCisgKi8KK3N0YXRpYyBpbnQgc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIGNwdXJldiA9IENQVVJFViwgdHlwZSwgaWNhY2hlc3osIGRjYWNoZXN6OworCisJdHlwZSA9IChDUFVSRVYgJiBDUFVSRVZfVFlQRSkgPj4gQ1BVUkVWX1RZUEVfUzsKKwlpZiAodHlwZSA+IG1uMTAzMDBfa25vd25fY3B1cykKKwkJdHlwZSA9IG1uMTAzMDBfa25vd25fY3B1czsKKworCWljYWNoZXN6ID0KKwkJKChjcHVyZXYgJiBDUFVSRVZfSUNXQVkgKSA+PiBDUFVSRVZfSUNXQVlfUykgICoKKwkJKChjcHVyZXYgJiBDUFVSRVZfSUNTSVpFKSA+PiBDUFVSRVZfSUNTSVpFX1MpICoKKwkJMTAyNDsKKworCWRjYWNoZXN6ID0KKwkJKChjcHVyZXYgJiBDUFVSRVZfRENXQVkgKSA+PiBDUFVSRVZfRENXQVlfUykgICoKKwkJKChjcHVyZXYgJiBDUFVSRVZfRENTSVpFKSA+PiBDUFVSRVZfRENTSVpFX1MpICoKKwkJMTAyNDsKKworCXNlcV9wcmludGYobSwKKwkJICAgInByb2Nlc3NvciAgOiAwXG4iCisJCSAgICJ2ZW5kb3JfaWQgIDogTWF0c3VzaGl0YVxuIgorCQkgICAiY3B1IGNvcmUgICA6ICVzXG4iCisJCSAgICJjcHUgcmV2ICAgIDogJWx1XG4iCisJCSAgICJtb2RlbCBuYW1lIDogIiBQUk9DRVNTT1JfTU9ERUxfTkFNRQkJIlxuIgorCQkgICAiaWNhY2hlIHNpemU6ICVsdVxuIgorCQkgICAiZGNhY2hlIHNpemU6ICVsdVxuIiwKKwkJICAgbW4xMDMwMF9jcHV0eXBlc1t0eXBlXSwKKwkJICAgKGNwdXJldiAmIENQVVJFVl9SRVZJU0lPTikgPj4gQ1BVUkVWX1JFVklTSU9OX1MsCisJCSAgIGljYWNoZXN6LAorCQkgICBkY2FjaGVzegorCQkgICApOworCisJc2VxX3ByaW50ZihtLAorCQkgICAiaW9jbGsgc3BlZWQ6ICVsdS4lMDJsdU1IelxuIgorCQkgICAiYm9nb21pcHMgICA6ICVsdS4lMDJsdVxuXG4iLAorCQkgICBNTjEwMzAwX0lPQ0xLIC8gMTAwMDAwMCwKKwkJICAgKE1OMTAzMDBfSU9DTEsgLyAxMDAwMCkgJSAxMDAsCisJCSAgIGxvb3BzX3Blcl9qaWZmeSAvICg1MDAwMDAgLyBIWiksCisJCSAgIChsb29wc19wZXJfamlmZnkgLyAoNTAwMCAvIEhaKSkgJSAxMDAKKwkJICAgKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCAqY19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQoreworCXJldHVybiAqcG9zIDwgTlJfQ1BVUyA/IGNwdV9kYXRhICsgKnBvcyA6IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICpjX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwkrKypwb3M7CisJcmV0dXJuIGNfc3RhcnQobSwgcG9zKTsKK30KKworc3RhdGljIHZvaWQgY19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKK30KKworc3RydWN0IHNlcV9vcGVyYXRpb25zIGNwdWluZm9fb3AgPSB7CisJLnN0YXJ0CT0gY19zdGFydCwKKwkubmV4dAk9IGNfbmV4dCwKKwkuc3RvcAk9IGNfc3RvcCwKKwkuc2hvdwk9IHNob3dfY3B1aW5mbywKK307CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL3NpZ2ZyYW1lLmggYi9hcmNoL21uMTAzMDAva2VybmVsL3NpZ2ZyYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRlY2JhMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvc2lnZnJhbWUuaApAQCAtMCwwICsxLDMzIEBACisvKiBNTjEwMzAwIFNpZ25hbCBmcmFtZSBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNYXRzdXNoaXRhIEVsZWN0cmljIEluZHVzdHJpYWwgQ28uLCBMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworc3RydWN0IHNpZ2ZyYW1lCit7CisJdm9pZCAoKnByZXRjb2RlKSh2b2lkKTsKKwlpbnQgc2lnOworCXN0cnVjdCBzaWdjb250ZXh0ICpwc2M7CisJc3RydWN0IHNpZ2NvbnRleHQgc2M7CisJc3RydWN0IGZwdWNvbnRleHQgZnB1Y3R4OworCXVuc2lnbmVkIGxvbmcgZXh0cmFtYXNrW19OU0lHX1dPUkRTLTFdOworCWNoYXIgcmV0Y29kZVs4XTsKK307CisKK3N0cnVjdCBydF9zaWdmcmFtZQoreworCXZvaWQgKCpwcmV0Y29kZSkodm9pZCk7CisJaW50IHNpZzsKKwlzdHJ1Y3Qgc2lnaW5mbyAqcGluZm87CisJdm9pZCAqcHVjOworCXN0cnVjdCBzaWdpbmZvIGluZm87CisJc3RydWN0IHVjb250ZXh0IHVjOworCXN0cnVjdCBmcHVjb250ZXh0IGZwdWN0eDsKKwljaGFyIHJldGNvZGVbOF07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvc2lnbmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQxY2E5OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvc2lnbmFsLmMKQEAgLTAsMCArMSw1NjQgQEAKKy8qIE1OMTAzMDAgU2lnbmFsIGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS91Y29udGV4dC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2ZwdS5oPgorI2luY2x1ZGUgInNpZ2ZyYW1lLmgiCisKKyNkZWZpbmUgREVCVUdfU0lHIDAKKworI2RlZmluZSBfQkxPQ0tBQkxFICh+KHNpZ21hc2soU0lHS0lMTCkgfCBzaWdtYXNrKFNJR1NUT1ApKSkKKworLyoKKyAqIGF0b21pY2FsbHkgc3dhcCBpbiB0aGUgbmV3IHNpZ25hbCBtYXNrLCBhbmQgd2FpdCBmb3IgYSBzaWduYWwuCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfc2lnc3VzcGVuZChpbnQgaGlzdG9yeTAsIGludCBoaXN0b3J5MSwgb2xkX3NpZ3NldF90IG1hc2spCit7CisJbWFzayAmPSBfQkxPQ0tBQkxFOworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWN1cnJlbnQtPnNhdmVkX3NpZ21hc2sgPSBjdXJyZW50LT5ibG9ja2VkOworCXNpZ2luaXRzZXQoJmN1cnJlbnQtPmJsb2NrZWQsIG1hc2spOworCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCXNjaGVkdWxlKCk7CisJc2V0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOworCXJldHVybiAtRVJFU1RBUlROT0hBTkQ7Cit9CisKKy8qCisgKiBzZXQgc2lnbmFsIGFjdGlvbiBzeXNjYWxsCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfc2lnYWN0aW9uKGludCBzaWcsCisJCQkgICAgICBjb25zdCBzdHJ1Y3Qgb2xkX3NpZ2FjdGlvbiBfX3VzZXIgKmFjdCwKKwkJCSAgICAgIHN0cnVjdCBvbGRfc2lnYWN0aW9uIF9fdXNlciAqb2FjdCkKK3sKKwlzdHJ1Y3Qga19zaWdhY3Rpb24gbmV3X2thLCBvbGRfa2E7CisJaW50IHJldDsKKworCWlmIChhY3QpIHsKKwkJb2xkX3NpZ3NldF90IG1hc2s7CisJCWlmICh2ZXJpZnlfYXJlYShWRVJJRllfUkVBRCwgYWN0LCBzaXplb2YoKmFjdCkpIHx8CisJCSAgICBfX2dldF91c2VyKG5ld19rYS5zYS5zYV9oYW5kbGVyLCAmYWN0LT5zYV9oYW5kbGVyKSB8fAorCQkgICAgX19nZXRfdXNlcihuZXdfa2Euc2Euc2FfcmVzdG9yZXIsICZhY3QtPnNhX3Jlc3RvcmVyKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlfX2dldF91c2VyKG5ld19rYS5zYS5zYV9mbGFncywgJmFjdC0+c2FfZmxhZ3MpOworCQlfX2dldF91c2VyKG1hc2ssICZhY3QtPnNhX21hc2spOworCQlzaWdpbml0c2V0KCZuZXdfa2Euc2Euc2FfbWFzaywgbWFzayk7CisJfQorCisJcmV0ID0gZG9fc2lnYWN0aW9uKHNpZywgYWN0ID8gJm5ld19rYSA6IE5VTEwsIG9hY3QgPyAmb2xkX2thIDogTlVMTCk7CisKKwlpZiAoIXJldCAmJiBvYWN0KSB7CisJCWlmICh2ZXJpZnlfYXJlYShWRVJJRllfV1JJVEUsIG9hY3QsIHNpemVvZigqb2FjdCkpIHx8CisJCSAgICBfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9oYW5kbGVyLCAmb2FjdC0+c2FfaGFuZGxlcikgfHwKKwkJICAgIF9fcHV0X3VzZXIob2xkX2thLnNhLnNhX3Jlc3RvcmVyLCAmb2FjdC0+c2FfcmVzdG9yZXIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCV9fcHV0X3VzZXIob2xkX2thLnNhLnNhX2ZsYWdzLCAmb2FjdC0+c2FfZmxhZ3MpOworCQlfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9tYXNrLnNpZ1swXSwgJm9hY3QtPnNhX21hc2spOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBzZXQgYWx0ZXJuYXRlIHNpZ25hbCBzdGFjayBzeXNjYWxsCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdCBfX3VzZXIgKnVzcywgc3RhY2tfdCAqdW9zcykKK3sKKwlyZXR1cm4gZG9fc2lnYWx0c3RhY2sodXNzLCB1b3NzLCBfX2ZyYW1lLT5zcCk7Cit9CisKKy8qCisgKiBkbyBhIHNpZ25hbCByZXR1cm47IHVuZG8gdGhlIHNpZ25hbCBzdGFjay4KKyAqLworc3RhdGljIGludCByZXN0b3JlX3NpZ2NvbnRleHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkgICAgICBzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjLCBsb25nICpfZDApCit7CisJdW5zaWduZWQgaW50IGVyciA9IDA7CisKKwlpZiAoaXNfdXNpbmdfZnB1KGN1cnJlbnQpKQorCQlmcHVfa2lsbF9zdGF0ZShjdXJyZW50KTsKKworI2RlZmluZSBDT1BZKHgpIGVyciB8PSBfX2dldF91c2VyKHJlZ3MtPngsICZzYy0+eCkKKwlDT1BZKGQxKTsgQ09QWShkMik7IENPUFkoZDMpOworCUNPUFkoYTApOyBDT1BZKGExKTsgQ09QWShhMik7IENPUFkoYTMpOworCUNPUFkoZTApOyBDT1BZKGUxKTsgQ09QWShlMik7IENPUFkoZTMpOworCUNPUFkoZTQpOyBDT1BZKGU1KTsgQ09QWShlNik7IENPUFkoZTcpOworCUNPUFkobGFyKTsgQ09QWShsaXIpOworCUNPUFkobWRyKTsgQ09QWShtZHJxKTsKKwlDT1BZKG1jdmYpOyBDT1BZKG1jcmwpOyBDT1BZKG1jcmgpOworCUNPUFkoc3ApOyBDT1BZKHBjKTsKKyN1bmRlZiBDT1BZCisKKwl7CisJCXVuc2lnbmVkIGludCB0bXBmbGFnczsKKyNpZm5kZWYgQ09ORklHX01OMTAzMDBfVVNJTkdfSlRBRworI2RlZmluZSBVU0VSX0VQU1cgKEVQU1dfRkxBR19aIHwgRVBTV19GTEFHX04gfCBFUFNXX0ZMQUdfQyB8IEVQU1dfRkxBR19WIHwgXAorCQkgICBFUFNXX1QgfCBFUFNXX25BUikKKyNlbHNlCisjZGVmaW5lIFVTRVJfRVBTVyAoRVBTV19GTEFHX1ogfCBFUFNXX0ZMQUdfTiB8IEVQU1dfRkxBR19DIHwgRVBTV19GTEFHX1YgfCBcCisJCSAgIEVQU1dfbkFSKQorI2VuZGlmCisJCWVyciB8PSBfX2dldF91c2VyKHRtcGZsYWdzLCAmc2MtPmVwc3cpOworCQlyZWdzLT5lcHN3ID0gKHJlZ3MtPmVwc3cgJiB+VVNFUl9FUFNXKSB8CisJCSAgKHRtcGZsYWdzICYgVVNFUl9FUFNXKTsKKwkJcmVncy0+b3JpZ19kMCA9IC0xOwkJLyogZGlzYWJsZSBzeXNjYWxsIGNoZWNrcyAqLworCX0KKworCXsKKwkJc3RydWN0IGZwdWNvbnRleHQgKmJ1ZjsKKwkJZXJyIHw9IF9fZ2V0X3VzZXIoYnVmLCAmc2MtPmZwdWNvbnRleHQpOworCQlpZiAoYnVmKSB7CisJCQlpZiAodmVyaWZ5X2FyZWEoVkVSSUZZX1JFQUQsIGJ1Ziwgc2l6ZW9mKCpidWYpKSkKKwkJCQlnb3RvIGJhZGZyYW1lOworCQkJZXJyIHw9IGZwdV9yZXN0b3JlX3NpZ2NvbnRleHQoYnVmKTsKKwkJfQorCX0KKworCWVyciB8PSBfX2dldF91c2VyKCpfZDAsICZzYy0+ZDApOworCXJldHVybiBlcnI7CisKK2JhZGZyYW1lOgorCXJldHVybiAxOworfQorCisvKgorICogc3RhbmRhcmQgc2lnbmFsIHJldHVybiBzeXNjYWxsCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfc2lncmV0dXJuKHZvaWQpCit7CisJc3RydWN0IHNpZ2ZyYW1lIF9fdXNlciAqZnJhbWUgPSAoc3RydWN0IHNpZ2ZyYW1lIF9fdXNlciAqKSBfX2ZyYW1lLT5zcDsKKwlzaWdzZXRfdCBzZXQ7CisJbG9uZyBkMDsKKworCWlmICh2ZXJpZnlfYXJlYShWRVJJRllfUkVBRCwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKKwkJZ290byBiYWRmcmFtZTsKKwlpZiAoX19nZXRfdXNlcihzZXQuc2lnWzBdLCAmZnJhbWUtPnNjLm9sZG1hc2spKQorCQlnb3RvIGJhZGZyYW1lOworCisJaWYgKF9OU0lHX1dPUkRTID4gMSAmJgorCSAgICBfX2NvcHlfZnJvbV91c2VyKCZzZXQuc2lnWzFdLCAmZnJhbWUtPmV4dHJhbWFzaywKKwkJCSAgICAgc2l6ZW9mKGZyYW1lLT5leHRyYW1hc2spKSkKKwkJZ290byBiYWRmcmFtZTsKKworCXNpZ2RlbHNldG1hc2soJnNldCwgfl9CTE9DS0FCTEUpOworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWN1cnJlbnQtPmJsb2NrZWQgPSBzZXQ7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCisJaWYgKHJlc3RvcmVfc2lnY29udGV4dChfX2ZyYW1lLCAmZnJhbWUtPnNjLCAmZDApKQorCQlnb3RvIGJhZGZyYW1lOworCisJcmV0dXJuIGQwOworCitiYWRmcmFtZToKKwlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiByZWFsdGltZSBzaWduYWwgcmV0dXJuIHN5c2NhbGwKKyAqLworYXNtbGlua2FnZSBsb25nIHN5c19ydF9zaWdyZXR1cm4odm9pZCkKK3sKKwlzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZSA9CisJCShzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICopIF9fZnJhbWUtPnNwOworCXNpZ3NldF90IHNldDsKKwl1bnNpZ25lZCBsb25nIGQwOworCisJaWYgKHZlcmlmeV9hcmVhKFZFUklGWV9SRUFELCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQorCQlnb3RvIGJhZGZyYW1lOworCWlmIChfX2NvcHlfZnJvbV91c2VyKCZzZXQsICZmcmFtZS0+dWMudWNfc2lnbWFzaywgc2l6ZW9mKHNldCkpKQorCQlnb3RvIGJhZGZyYW1lOworCisJc2lnZGVsc2V0bWFzaygmc2V0LCB+X0JMT0NLQUJMRSk7CisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJY3VycmVudC0+YmxvY2tlZCA9IHNldDsKKwlyZWNhbGNfc2lncGVuZGluZygpOworCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisKKwlpZiAocmVzdG9yZV9zaWdjb250ZXh0KF9fZnJhbWUsICZmcmFtZS0+dWMudWNfbWNvbnRleHQsICZkMCkpCisJCWdvdG8gYmFkZnJhbWU7CisKKwlpZiAoZG9fc2lnYWx0c3RhY2soJmZyYW1lLT51Yy51Y19zdGFjaywgTlVMTCwgX19mcmFtZS0+c3ApID09IC1FRkFVTFQpCisJCWdvdG8gYmFkZnJhbWU7CisKKwlyZXR1cm4gZDA7CisKK2JhZGZyYW1lOgorCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHN0b3JlIHRoZSB1c2Vyc3BhY2UgY29udGV4dCBpbnRvIGEgc2lnbmFsIGZyYW1lCisgKi8KK3N0YXRpYyBpbnQgc2V0dXBfc2lnY29udGV4dChzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjLAorCQkJICAgIHN0cnVjdCBmcHVjb250ZXh0ICpmcHVjdHgsCisJCQkgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkgICAgdW5zaWduZWQgbG9uZyBtYXNrKQoreworCWludCB0bXAsIGVyciA9IDA7CisKKyNkZWZpbmUgQ09QWSh4KSBlcnIgfD0gX19wdXRfdXNlcihyZWdzLT54LCAmc2MtPngpCisJQ09QWShkMCk7IENPUFkoZDEpOyBDT1BZKGQyKTsgQ09QWShkMyk7CisJQ09QWShhMCk7IENPUFkoYTEpOyBDT1BZKGEyKTsgQ09QWShhMyk7CisJQ09QWShlMCk7IENPUFkoZTEpOyBDT1BZKGUyKTsgQ09QWShlMyk7CisJQ09QWShlNCk7IENPUFkoZTUpOyBDT1BZKGU2KTsgQ09QWShlNyk7CisJQ09QWShsYXIpOyBDT1BZKGxpcik7CisJQ09QWShtZHIpOyBDT1BZKG1kcnEpOworCUNPUFkobWN2Zik7IENPUFkobWNybCk7IENPUFkobWNyaCk7CisJQ09QWShzcCk7IENPUFkoZXBzdyk7IENPUFkocGMpOworI3VuZGVmIENPUFkKKworCXRtcCA9IGZwdV9zZXR1cF9zaWdjb250ZXh0KGZwdWN0eCk7CisJaWYgKHRtcCA8IDApCisJCWVyciA9IDE7CisJZWxzZQorCQllcnIgfD0gX19wdXRfdXNlcih0bXAgPyBmcHVjdHggOiBOVUxMLCAmc2MtPmZwdWNvbnRleHQpOworCisJLyogbm9uLWlCQ1MyIGV4dGVuc2lvbnMuLiAqLworCWVyciB8PSBfX3B1dF91c2VyKG1hc2ssICZzYy0+b2xkbWFzayk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogZGV0ZXJtaW5lIHdoaWNoIHN0YWNrIHRvIHVzZS4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3VzZXIgKmdldF9zaWdmcmFtZShzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAorCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkJc2l6ZV90IGZyYW1lX3NpemUpCit7CisJdW5zaWduZWQgbG9uZyBzcDsKKworCS8qIGRlZmF1bHQgdG8gdXNpbmcgbm9ybWFsIHN0YWNrICovCisJc3AgPSByZWdzLT5zcDsKKworCS8qIHRoaXMgaXMgdGhlIFgvT3BlbiBzYW5jdGlvbmVkIHNpZ25hbCBzdGFjayBzd2l0Y2hpbmcuICAqLworCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9PTlNUQUNLKSB7CisJCWlmICghb25fc2lnX3N0YWNrKHNwKSkKKwkJCXNwID0gY3VycmVudC0+c2FzX3NzX3NwICsgY3VycmVudC0+c2FzX3NzX3NpemU7CisJfQorCisJcmV0dXJuICh2b2lkIF9fdXNlciAqKSAoKHNwIC0gZnJhbWVfc2l6ZSkgJiB+N1VMKTsKK30KKworLyoKKyAqIHNldCB1cCBhIG5vcm1hbCBzaWduYWwgZnJhbWUKKyAqLworc3RhdGljIGludCBzZXR1cF9mcmFtZShpbnQgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzaWdzZXRfdCAqc2V0LAorCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHNpZ2ZyYW1lIF9fdXNlciAqZnJhbWU7CisJaW50IHJzaWc7CisKKwlmcmFtZSA9IGdldF9zaWdmcmFtZShrYSwgcmVncywgc2l6ZW9mKCpmcmFtZSkpOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQorCQlnb3RvIGdpdmVfc2lnc2VndjsKKworCXJzaWcgPSBzaWc7CisJaWYgKHNpZyA8IDMyICYmCisJICAgIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4gJiYKKwkgICAgY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcCkKKwkJcnNpZyA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXBbc2lnXTsKKworCWlmIChfX3B1dF91c2VyKHJzaWcsICZmcmFtZS0+c2lnKSA8IDAgfHwKKwkgICAgX19wdXRfdXNlcigmZnJhbWUtPnNjLCAmZnJhbWUtPnBzYykgPCAwKQorCQlnb3RvIGdpdmVfc2lnc2VndjsKKworCWlmIChzZXR1cF9zaWdjb250ZXh0KCZmcmFtZS0+c2MsICZmcmFtZS0+ZnB1Y3R4LCByZWdzLCBzZXQtPnNpZ1swXSkpCisJCWdvdG8gZ2l2ZV9zaWdzZWd2OworCisJaWYgKF9OU0lHX1dPUkRTID4gMSkgeworCQlpZiAoX19jb3B5X3RvX3VzZXIoZnJhbWUtPmV4dHJhbWFzaywgJnNldC0+c2lnWzFdLAorCQkJCSAgIHNpemVvZihmcmFtZS0+ZXh0cmFtYXNrKSkpCisJCQlnb3RvIGdpdmVfc2lnc2VndjsKKwl9CisKKwkvKiBzZXQgdXAgdG8gcmV0dXJuIGZyb20gdXNlcnNwYWNlLiAgSWYgcHJvdmlkZWQsIHVzZSBhIHN0dWIgYWxyZWFkeSBpbgorCSAqIHVzZXJzcGFjZSAqLworCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9SRVNUT1JFUikgeworCQlpZiAoX19wdXRfdXNlcihrYS0+c2Euc2FfcmVzdG9yZXIsICZmcmFtZS0+cHJldGNvZGUpKQorCQkJZ290byBnaXZlX3NpZ3NlZ3Y7CisJfSBlbHNlIHsKKwkJaWYgKF9fcHV0X3VzZXIoKHZvaWQgKCopKHZvaWQpKWZyYW1lLT5yZXRjb2RlLAorCQkJICAgICAgICZmcmFtZS0+cHJldGNvZGUpKQorCQkJZ290byBnaXZlX3NpZ3NlZ3Y7CisJCS8qIHRoaXMgaXMgbW92ICQsZDA7IHN5c2NhbGwgMCAqLworCQlpZiAoX19wdXRfdXNlcigweDJjLCAoY2hhciAqKShmcmFtZS0+cmV0Y29kZSArIDApKSB8fAorCQkgICAgX19wdXRfdXNlcihfX05SX3NpZ3JldHVybiwgKGNoYXIgKikoZnJhbWUtPnJldGNvZGUgKyAxKSkgfHwKKwkJICAgIF9fcHV0X3VzZXIoMHgwMCwgKGNoYXIgKikoZnJhbWUtPnJldGNvZGUgKyAyKSkgfHwKKwkJICAgIF9fcHV0X3VzZXIoMHhmMCwgKGNoYXIgKikoZnJhbWUtPnJldGNvZGUgKyAzKSkgfHwKKwkJICAgIF9fcHV0X3VzZXIoMHhlMCwgKGNoYXIgKikoZnJhbWUtPnJldGNvZGUgKyA0KSkpCisJCQlnb3RvIGdpdmVfc2lnc2VndjsKKwkJZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKSBmcmFtZS0+cmV0Y29kZSwKKwkJCQkgICAodW5zaWduZWQgbG9uZykgZnJhbWUtPnJldGNvZGUgKyA1KTsKKwl9CisKKwkvKiBzZXQgdXAgcmVnaXN0ZXJzIGZvciBzaWduYWwgaGFuZGxlciAqLworCXJlZ3MtPnNwID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lOworCXJlZ3MtPnBjID0gKHVuc2lnbmVkIGxvbmcpIGthLT5zYS5zYV9oYW5kbGVyOworCXJlZ3MtPmQwID0gc2lnOworCXJlZ3MtPmQxID0gKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+c2M7CisKKwlzZXRfZnMoVVNFUl9EUyk7CisKKwkvKiB0aGUgdHJhY2VyIG1heSB3YW50IHRvIHNpbmdsZS1zdGVwIGluc2lkZSB0aGUgaGFuZGxlciAqLworCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKSkKKwkJcHRyYWNlX25vdGlmeShTSUdUUkFQKTsKKworI2lmIERFQlVHX1NJRworCXByaW50ayhLRVJOX0RFQlVHICJTSUcgZGVsaXZlciAlZCAoJXM6JWQpOiBzcD0lcCBwYz0lbHggcmE9JXBcbiIsCisJICAgICAgIHNpZywgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBmcmFtZSwgcmVncy0+cGMsCisJICAgICAgIGZyYW1lLT5wcmV0Y29kZSk7CisjZW5kaWYKKworCXJldHVybiAwOworCitnaXZlX3NpZ3NlZ3Y6CisJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOworCXJldHVybiAtRUZBVUxUOworfQorCisvKgorICogc2V0IHVwIGEgcmVhbHRpbWUgc2lnbmFsIGZyYW1lCisgKi8KK3N0YXRpYyBpbnQgc2V0dXBfcnRfZnJhbWUoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc2lnaW5mb190ICppbmZvLAorCQkJICBzaWdzZXRfdCAqc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZTsKKwlpbnQgcnNpZzsKKworCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKGthLCByZWdzLCBzaXplb2YoKmZyYW1lKSk7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCisJCWdvdG8gZ2l2ZV9zaWdzZWd2OworCisJcnNpZyA9IHNpZzsKKwlpZiAoc2lnIDwgMzIgJiYKKwkgICAgY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbiAmJgorCSAgICBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwKQorCQlyc2lnID0gY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcFtzaWddOworCisJaWYgKF9fcHV0X3VzZXIocnNpZywgJmZyYW1lLT5zaWcpIHx8CisJICAgIF9fcHV0X3VzZXIoJmZyYW1lLT5pbmZvLCAmZnJhbWUtPnBpbmZvKSB8fAorCSAgICBfX3B1dF91c2VyKCZmcmFtZS0+dWMsICZmcmFtZS0+cHVjKSB8fAorCSAgICBjb3B5X3NpZ2luZm9fdG9fdXNlcigmZnJhbWUtPmluZm8sIGluZm8pKQorCQlnb3RvIGdpdmVfc2lnc2VndjsKKworCS8qIGNyZWF0ZSB0aGUgdWNvbnRleHQuICAqLworCWlmIChfX3B1dF91c2VyKDAsICZmcmFtZS0+dWMudWNfZmxhZ3MpIHx8CisJICAgIF9fcHV0X3VzZXIoMCwgJmZyYW1lLT51Yy51Y19saW5rKSB8fAorCSAgICBfX3B1dF91c2VyKCh2b2lkICopY3VycmVudC0+c2FzX3NzX3NwLCAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX3NwKSB8fAorCSAgICBfX3B1dF91c2VyKHNhc19zc19mbGFncyhyZWdzLT5zcCksICZmcmFtZS0+dWMudWNfc3RhY2suc3NfZmxhZ3MpIHx8CisJICAgIF9fcHV0X3VzZXIoY3VycmVudC0+c2FzX3NzX3NpemUsICZmcmFtZS0+dWMudWNfc3RhY2suc3Nfc2l6ZSkgfHwKKwkgICAgc2V0dXBfc2lnY29udGV4dCgmZnJhbWUtPnVjLnVjX21jb250ZXh0LAorCQkJICAgICAmZnJhbWUtPmZwdWN0eCwgcmVncywgc2V0LT5zaWdbMF0pIHx8CisJICAgIF9fY29weV90b191c2VyKCZmcmFtZS0+dWMudWNfc2lnbWFzaywgc2V0LCBzaXplb2YoKnNldCkpKQorCQlnb3RvIGdpdmVfc2lnc2VndjsKKworCS8qIHNldCB1cCB0byByZXR1cm4gZnJvbSB1c2Vyc3BhY2UuICBJZiBwcm92aWRlZCwgdXNlIGEgc3R1YiBhbHJlYWR5IGluCisJICogdXNlcnNwYWNlICovCisJaWYgKGthLT5zYS5zYV9mbGFncyAmIFNBX1JFU1RPUkVSKSB7CisJCWlmIChfX3B1dF91c2VyKGthLT5zYS5zYV9yZXN0b3JlciwgJmZyYW1lLT5wcmV0Y29kZSkpCisJCQlnb3RvIGdpdmVfc2lnc2VndjsKKwl9IGVsc2UgeworCQlpZiAoX19wdXRfdXNlcigodm9pZCgqKSh2b2lkKSlmcmFtZS0+cmV0Y29kZSwKKwkJCSAgICAgICAmZnJhbWUtPnByZXRjb2RlKSB8fAorCQkgICAgLyogVGhpcyBpcyBtb3YgJCxkMDsgc3lzY2FsbCAwICovCisJCSAgICBfX3B1dF91c2VyKDB4MmMsIChjaGFyICopKGZyYW1lLT5yZXRjb2RlICsgMCkpIHx8CisJCSAgICBfX3B1dF91c2VyKF9fTlJfcnRfc2lncmV0dXJuLAorCQkJICAgICAgIChjaGFyICopKGZyYW1lLT5yZXRjb2RlICsgMSkpIHx8CisJCSAgICBfX3B1dF91c2VyKDB4MDAsIChjaGFyICopKGZyYW1lLT5yZXRjb2RlICsgMikpIHx8CisJCSAgICBfX3B1dF91c2VyKDB4ZjAsIChjaGFyICopKGZyYW1lLT5yZXRjb2RlICsgMykpIHx8CisJCSAgICBfX3B1dF91c2VyKDB4ZTAsIChjaGFyICopKGZyYW1lLT5yZXRjb2RlICsgNCkpKQorCQkJZ290byBnaXZlX3NpZ3NlZ3Y7CisKKwkJZmx1c2hfaWNhY2hlX3JhbmdlKCh1X2xvbmcpIGZyYW1lLT5yZXRjb2RlLAorCQkJCSAgICh1X2xvbmcpIGZyYW1lLT5yZXRjb2RlICsgNSk7CisJfQorCisJLyogU2V0IHVwIHJlZ2lzdGVycyBmb3Igc2lnbmFsIGhhbmRsZXIgKi8KKwlyZWdzLT5zcCA9ICh1bnNpZ25lZCBsb25nKSBmcmFtZTsKKwlyZWdzLT5wYyA9ICh1bnNpZ25lZCBsb25nKSBrYS0+c2Euc2FfaGFuZGxlcjsKKwlyZWdzLT5kMCA9IHNpZzsKKwlyZWdzLT5kMSA9IChsb25nKSAmZnJhbWUtPmluZm87CisKKwlzZXRfZnMoVVNFUl9EUyk7CisKKwkvKiB0aGUgdHJhY2VyIG1heSB3YW50IHRvIHNpbmdsZS1zdGVwIGluc2lkZSB0aGUgaGFuZGxlciAqLworCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKSkKKwkJcHRyYWNlX25vdGlmeShTSUdUUkFQKTsKKworI2lmIERFQlVHX1NJRworCXByaW50ayhLRVJOX0RFQlVHICJTSUcgZGVsaXZlciAlZCAoJXM6JWQpOiBzcD0lcCBwYz0lbHggcmE9JXBcbiIsCisJICAgICAgIHNpZywgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBmcmFtZSwgcmVncy0+cGMsCisJICAgICAgIGZyYW1lLT5wcmV0Y29kZSk7CisjZW5kaWYKKworCXJldHVybiAwOworCitnaXZlX3NpZ3NlZ3Y6CisJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOworCXJldHVybiAtRUZBVUxUOworfQorCisvKgorICogaGFuZGxlIHRoZSBhY3R1YWwgZGVsaXZlcnkgb2YgYSBzaWduYWwgdG8gdXNlcnNwYWNlCisgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3NpZ25hbChpbnQgc2lnLAorCQkJIHNpZ2luZm9fdCAqaW5mbywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKKwkJCSBzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgcmV0OworCisJLyogQXJlIHdlIGZyb20gYSBzeXN0ZW0gY2FsbD8gKi8KKwlpZiAocmVncy0+b3JpZ19kMCA+PSAwKSB7CisJCS8qIElmIHNvLCBjaGVjayBzeXN0ZW0gY2FsbCByZXN0YXJ0aW5nLi4gKi8KKwkJc3dpdGNoIChyZWdzLT5kMCkgeworCQljYXNlIC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0s6CisJCWNhc2UgLUVSRVNUQVJUTk9IQU5EOgorCQkJcmVncy0+ZDAgPSAtRUlOVFI7CisJCQlicmVhazsKKworCQljYXNlIC1FUkVTVEFSVFNZUzoKKwkJCWlmICghKGthLT5zYS5zYV9mbGFncyAmIFNBX1JFU1RBUlQpKSB7CisJCQkJcmVncy0+ZDAgPSAtRUlOVFI7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIGZhbGx0aHJvdWdoICovCisJCWNhc2UgLUVSRVNUQVJUTk9JTlRSOgorCQkJcmVncy0+ZDAgPSByZWdzLT5vcmlnX2QwOworCQkJcmVncy0+cGMgLT0gMjsKKwkJfQorCX0KKworCS8qIFNldCB1cCB0aGUgc3RhY2sgZnJhbWUgKi8KKwlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfU0lHSU5GTykKKwkJcmV0ID0gc2V0dXBfcnRfZnJhbWUoc2lnLCBrYSwgaW5mbywgb2xkc2V0LCByZWdzKTsKKwllbHNlCisJCXJldCA9IHNldHVwX2ZyYW1lKHNpZywga2EsIG9sZHNldCwgcmVncyk7CisKKwlpZiAocmV0ID09IDApIHsKKwkJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJCXNpZ29yc2V0cygmY3VycmVudC0+YmxvY2tlZCwgJmN1cnJlbnQtPmJsb2NrZWQsCisJCQkgICZrYS0+c2Euc2FfbWFzayk7CisJCWlmICghKGthLT5zYS5zYV9mbGFncyAmIFNBX05PREVGRVIpKQorCQkJc2lnYWRkc2V0KCZjdXJyZW50LT5ibG9ja2VkLCBzaWcpOworCQlyZWNhbGNfc2lncGVuZGluZygpOworCQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBoYW5kbGUgYSBwb3RlbnRpYWwgc2lnbmFsCisgKi8KK3N0YXRpYyB2b2lkIGRvX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3Qga19zaWdhY3Rpb24ga2E7CisJc2lnaW5mb190IGluZm87CisJc2lnc2V0X3QgKm9sZHNldDsKKwlpbnQgc2lnbnI7CisKKwkvKiB3ZSB3YW50IHRoZSBjb21tb24gY2FzZSB0byBnbyBmYXN0LCB3aGljaCBpcyB3aHkgd2UgbWF5IGluIGNlcnRhaW4KKwkgKiBjYXNlcyBnZXQgaGVyZSBmcm9tIGtlcm5lbCBtb2RlICovCisJaWYgKCF1c2VyX21vZGUocmVncykpCisJCXJldHVybjsKKworCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spKQorCQlvbGRzZXQgPSAmY3VycmVudC0+c2F2ZWRfc2lnbWFzazsKKwllbHNlCisJCW9sZHNldCA9ICZjdXJyZW50LT5ibG9ja2VkOworCisJc2lnbnIgPSBnZXRfc2lnbmFsX3RvX2RlbGl2ZXIoJmluZm8sICZrYSwgcmVncywgTlVMTCk7CisJaWYgKHNpZ25yID4gMCkgeworCQlpZiAoaGFuZGxlX3NpZ25hbChzaWduciwgJmluZm8sICZrYSwgb2xkc2V0LCByZWdzKSA9PSAwKSB7CisJCQkvKiBhIHNpZ25hbCB3YXMgc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZDsgdGhlIHNhdmVkCisJCQkgKiBzaWdtYXNrIHdpbGwgaGF2ZSBiZWVuIHN0b3JlZCBpbiB0aGUgc2lnbmFsIGZyYW1lLAorCQkJICogYW5kIHdpbGwgYmUgcmVzdG9yZWQgYnkgc2lncmV0dXJuLCBzbyB3ZSBjYW4gc2ltcGx5CisJCQkgKiBjbGVhciB0aGUgVElGX1JFU1RPUkVfU0lHTUFTSyBmbGFnICovCisJCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKKwkJCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKwkJfQorCisJCXJldHVybjsKKwl9CisKKwkvKiBkaWQgd2UgY29tZSBmcm9tIGEgc3lzdGVtIGNhbGw/ICovCisJaWYgKHJlZ3MtPm9yaWdfZDAgPj0gMCkgeworCQkvKiByZXN0YXJ0IHRoZSBzeXN0ZW0gY2FsbCAtIG5vIGhhbmRsZXJzIHByZXNlbnQgKi8KKwkJc3dpdGNoIChyZWdzLT5kMCkgeworCQljYXNlIC1FUkVTVEFSVE5PSEFORDoKKwkJY2FzZSAtRVJFU1RBUlRTWVM6CisJCWNhc2UgLUVSRVNUQVJUTk9JTlRSOgorCQkJcmVncy0+ZDAgPSByZWdzLT5vcmlnX2QwOworCQkJcmVncy0+cGMgLT0gMjsKKwkJCWJyZWFrOworCisJCWNhc2UgLUVSRVNUQVJUX1JFU1RBUlRCTE9DSzoKKwkJCXJlZ3MtPmQwID0gX19OUl9yZXN0YXJ0X3N5c2NhbGw7CisJCQlyZWdzLT5wYyAtPSAyOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBpZiB0aGVyZSdzIG5vIHNpZ25hbCB0byBkZWxpdmVyLCB3ZSBqdXN0IHB1dCB0aGUgc2F2ZWQgc2lnbWFzaworCSAqIGJhY2sgKi8KKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkgeworCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrLCBOVUxMKTsKKwl9Cit9CisKKy8qCisgKiBub3RpZmljYXRpb24gb2YgdXNlcnNwYWNlIGV4ZWN1dGlvbiByZXN1bXB0aW9uCisgKiAtIHRyaWdnZXJlZCBieSBjdXJyZW50LT53b3JrLm5vdGlmeV9yZXN1bWUKKyAqLworYXNtbGlua2FnZSB2b2lkIGRvX25vdGlmeV9yZXN1bWUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHUzMiB0aHJlYWRfaW5mb19mbGFncykKK3sKKwkvKiBQZW5kaW5nIHNpbmdsZS1zdGVwPyAqLworCWlmICh0aHJlYWRfaW5mb19mbGFncyAmIF9USUZfU0lOR0xFU1RFUCkgeworI2lmbmRlZiBDT05GSUdfTU4xMDMwMF9VU0lOR19KVEFHCisJCXJlZ3MtPmVwc3cgfD0gRVBTV19UOworCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfU0lOR0xFU1RFUCk7CisjZWxzZQorCQlCVUcoKTsgLyogbm8gaC93IHNpbmdsZS1zdGVwIGlmIHVzaW5nIEpUQUcgdW5pdCAqLworI2VuZGlmCisJfQorCisJLyogZGVhbCB3aXRoIHBlbmRpbmcgc2lnbmFsIGRlbGl2ZXJ5ICovCisJaWYgKHRocmVhZF9pbmZvX2ZsYWdzICYgKF9USUZfU0lHUEVORElORyB8IF9USUZfUkVTVE9SRV9TSUdNQVNLKSkKKwkJZG9fc2lnbmFsKHJlZ3MpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9zd2l0Y2hfdG8uUyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvc3dpdGNoX3RvLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMwYWFkNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvc3dpdGNoX3RvLlMKQEAgLTAsMCArMSw3MSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBNTjEwMzAwIENvbnRleHQgc3dpdGNoIG9wZXJhdGlvbgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyMgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisjIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjaW5jbHVkZSA8bGludXgvc3lzLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9jcHUtcmVncy5oPgorCisJLnRleHQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKl9fc3dpdGNoX3RvKHN0cnVjdCB0aHJlYWRfc3RydWN0ICpwcmV2LAorIwkJCQkgIHN0cnVjdCB0aHJlYWRfc3RydWN0ICpuZXh0LAorIwkJCQkgIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldl90YXNrKQorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworRU5UUlkoX19zd2l0Y2hfdG8pCisJbW92bQlbZDIsZDMsYTIsYTMsZXhyZWcxXSwoc3ApCisJb3IJRVBTV19OTUlELGVwc3cKKworCW1vdgkoNDQsc3ApLGQyCisKKwltb3YJZDAsYTAKKwltb3YJZDEsYTEKKworCSMgc2F2ZSBwcmV2IGNvbnRleHQKKwltb3YJKF9fZnJhbWUpLGQwCisJbW92CWQwLChUSFJFQURfRlJBTUUsYTApCisJbW92CV9fc3dpdGNoX2JhY2ssZDAKKwltb3YJZDAsKFRIUkVBRF9QQyxhMCkKKwltb3YJc3AsYTIKKwltb3YJYTIsKFRIUkVBRF9TUCxhMCkKKwltb3YJYTMsKFRIUkVBRF9BMyxhMCkKKworCW1vdgkoVEhSRUFEX0EzLGExKSxhMworCW1vdgkoVEhSRUFEX1NQLGExKSxhMgorCisJIyBzd2l0Y2gKKwltb3YJYTIsc3AKKworCSMgbG9hZCBuZXh0IGNvbnRleHQKKwlHRVRfVEhSRUFEX0lORk8gYTIKKwltb3YJYTIsKF9fY3VycmVudF90aSkKKwltb3YJKFRJX3Rhc2ssYTIpLGEyCisJbW92CWEyLChfX2N1cnJlbnQpCisjaWZkZWYgQ09ORklHX01OMTAzMDBfQ1VSUkVOVF9JTl9FMgorCW1vdglhMixlMgorI2VuZGlmCisKKwltb3YJKFRIUkVBRF9GUkFNRSxhMSksYTIKKwltb3YJYTIsKF9fZnJhbWUpCisJbW92CShUSFJFQURfUEMsYTEpLGEyCisJbW92CWQyLGQwCQkJIyBmb3IgcmV0X2Zyb21fZm9yaworCW1vdglkMCxhMAkJCSMgZm9yIF9fc3dpdGNoX3RvCisKKwlqbXAJKGEyKQorCitfX3N3aXRjaF9iYWNrOgorCWFuZAl+RVBTV19OTUlELGVwc3cKKwlyZXQJW2QyLGQzLGEyLGEzLGV4cmVnMV0sMzIKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvc3lzX21uMTAzMDAuYyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvc3lzX21uMTAzMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjE3YTFlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9zeXNfbW4xMDMwMC5jCkBAIC0wLDAgKzEsMTkzIEBACisvKiBNTjEwMzAwIFdlaXJkIHN5c3RlbSBjYWxscworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNYXRzdXNoaXRhIEVsZWN0cmljIEluZHVzdHJpYWwgQ28uLCBMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2VtLmg+CisjaW5jbHVkZSA8bGludXgvbXNnLmg+CisjaW5jbHVkZSA8bGludXgvc2htLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lIE1JTl9NQVBfQUREUglQQUdFX1NJWkUJLyogbWluaW11bSBmaXhlZCBtbWFwIGFkZHJlc3MgKi8KKworLyoKKyAqIHN5c19waXBlKCkgaXMgdGhlIG5vcm1hbCBDIGNhbGxpbmcgc3RhbmRhcmQgZm9yIGNyZWF0aW5nCisgKiBhIHBpcGUuIEl0J3Mgbm90IHRoZSB3YXkgVW5peCB0cmFkaXRpb25hbGx5IGRvZXMgdGhpcywgdGhvdWdoLgorICovCithc21saW5rYWdlIGxvbmcgc3lzX3BpcGUodW5zaWduZWQgbG9uZyBfX3VzZXIgKmZpbGRlcykKK3sKKwlpbnQgZmRbMl07CisJaW50IGVycm9yOworCisJZXJyb3IgPSBkb19waXBlKGZkKTsKKwlpZiAoIWVycm9yKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoZmlsZGVzLCBmZCwgMiAqIHNpemVvZihpbnQpKSkKKwkJCWVycm9yID0gLUVGQVVMVDsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogbWVtb3J5IG1hcHBpbmcgc3lzY2FsbAorICovCithc21saW5rYWdlIGxvbmcgc3lzX21tYXAyKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sCisJCQkgIHVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywKKwkJCSAgdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IE5VTEw7CisJbG9uZyBlcnJvciA9IC1FSU5WQUw7CisKKwlmbGFncyAmPSB+KE1BUF9FWEVDVVRBQkxFIHwgTUFQX0RFTllXUklURSk7CisKKwlpZiAoZmxhZ3MgJiBNQVBfRklYRUQgJiYgYWRkciA8IE1JTl9NQVBfQUREUikKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IC1FQkFERjsKKwlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7CisJCWZpbGUgPSBmZ2V0KGZkKTsKKwkJaWYgKCFmaWxlKQorCQkJZ290byBvdXQ7CisJfQorCisJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOworCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCisJaWYgKGZpbGUpCisJCWZwdXQoZmlsZSk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCithc21saW5rYWdlIGxvbmcgb2xkX21tYXAodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJCSB1bnNpZ25lZCBsb25nIHByb3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCQkgdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJaWYgKG9mZnNldCAmIH5QQUdFX01BU0spCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBzeXNfbW1hcDIoYWRkciwgbGVuLCBwcm90LCBmbGFncywgZmQsIG9mZnNldCA+PiBQQUdFX1NISUZUKTsKK30KKworc3RydWN0IHNlbF9hcmdfc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIG47CisJZmRfc2V0ICppbnA7CisJZmRfc2V0ICpvdXRwOworCWZkX3NldCAqZXhwOworCXN0cnVjdCB0aW1ldmFsICp0dnA7Cit9OworCithc21saW5rYWdlIGludCBvbGRfc2VsZWN0KHN0cnVjdCBzZWxfYXJnX3N0cnVjdCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3Qgc2VsX2FyZ19zdHJ1Y3QgYTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmYSwgYXJnLCBzaXplb2YoYSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkvKiBzeXNfc2VsZWN0KCkgZG9lcyB0aGUgYXBwcm9wcmlhdGUga2VybmVsIGxvY2tpbmcgKi8KKwlyZXR1cm4gc3lzX3NlbGVjdChhLm4sIGEuaW5wLCBhLm91dHAsIGEuZXhwLCBhLnR2cCk7Cit9CisKKy8qCisgKiBzeXNfaXBjKCkgaXMgdGhlIGRlLW11bHRpcGxleGVyIGZvciB0aGUgU3lzViBJUEMgY2FsbHMuLgorICoKKyAqIFRoaXMgaXMgcmVhbGx5IGhvcnJpYmx5IHVnbHkuCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfaXBjKHVpbnQgY2FsbCwgaW50IGZpcnN0LCBpbnQgc2Vjb25kLAorCQkJaW50IHRoaXJkLCB2b2lkIF9fdXNlciAqcHRyLCBsb25nIGZpZnRoKQoreworCWludCB2ZXJzaW9uLCByZXQ7CisKKwl2ZXJzaW9uID0gY2FsbCA+PiAxNjsgLyogaGFjayBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworCWNhbGwgJj0gMHhmZmZmOworCisJc3dpdGNoIChjYWxsKSB7CisJY2FzZSBTRU1PUDoKKwkJcmV0dXJuIHN5c19zZW10aW1lZG9wKGZpcnN0LCAoc3RydWN0IHNlbWJ1ZiBfX3VzZXIgKilwdHIsCisJCQkJICAgICAgc2Vjb25kLCBOVUxMKTsKKwljYXNlIFNFTVRJTUVET1A6CisJCXJldHVybiBzeXNfc2VtdGltZWRvcChmaXJzdCwgKHN0cnVjdCBzZW1idWYgX191c2VyICopcHRyLAorCQkJCSAgICAgIHNlY29uZCwKKwkJCQkgICAgICAoY29uc3Qgc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqKWZpZnRoKTsKKwljYXNlIFNFTUdFVDoKKwkJcmV0dXJuIHN5c19zZW1nZXQoZmlyc3QsIHNlY29uZCwgdGhpcmQpOworCWNhc2UgU0VNQ1RMOiB7CisJCXVuaW9uIHNlbXVuIGZvdXJ0aDsKKwkJaWYgKCFwdHIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGdldF91c2VyKGZvdXJ0aC5fX3BhZCwgKHZvaWQgX191c2VyICogX191c2VyICopIHB0cikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIHN5c19zZW1jdGwoZmlyc3QsIHNlY29uZCwgdGhpcmQsIGZvdXJ0aCk7CisJfQorCisJY2FzZSBNU0dTTkQ6CisJCXJldHVybiBzeXNfbXNnc25kKGZpcnN0LCAoc3RydWN0IG1zZ2J1ZiBfX3VzZXIgKikgcHRyLAorCQkJCSAgc2Vjb25kLCB0aGlyZCk7CisJY2FzZSBNU0dSQ1Y6CisJCXN3aXRjaCAodmVyc2lvbikgeworCQljYXNlIDA6IHsKKwkJCXN0cnVjdCBpcGNfa2x1ZGdlIHRtcDsKKwkJCWlmICghcHRyKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnRtcCwKKwkJCQkJICAgKHN0cnVjdCBpcGNfa2x1ZGdlIF9fdXNlciAqKSBwdHIsCisJCQkJCSAgIHNpemVvZih0bXApKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiBzeXNfbXNncmN2KGZpcnN0LCB0bXAubXNncCwgc2Vjb25kLAorCQkJCQkgIHRtcC5tc2d0eXAsIHRoaXJkKTsKKwkJfQorCQlkZWZhdWx0OgorCQkJcmV0dXJuIHN5c19tc2dyY3YoZmlyc3QsCisJCQkJCSAgKHN0cnVjdCBtc2didWYgX191c2VyICopIHB0ciwKKwkJCQkJICAgc2Vjb25kLCBmaWZ0aCwgdGhpcmQpOworCQl9CisJY2FzZSBNU0dHRVQ6CisJCXJldHVybiBzeXNfbXNnZ2V0KChrZXlfdCkgZmlyc3QsIHNlY29uZCk7CisJY2FzZSBNU0dDVEw6CisJCXJldHVybiBzeXNfbXNnY3RsKGZpcnN0LCBzZWNvbmQsCisJCQkJICAgKHN0cnVjdCBtc3FpZF9kcyBfX3VzZXIgKikgcHRyKTsKKworCWNhc2UgU0hNQVQ6CisJCXN3aXRjaCAodmVyc2lvbikgeworCQlkZWZhdWx0OiB7CisJCQl1bG9uZyByYWRkcjsKKwkJCXJldCA9IGRvX3NobWF0KGZpcnN0LCAoY2hhciBfX3VzZXIgKikgcHRyLCBzZWNvbmQsCisJCQkJICAgICAgICZyYWRkcik7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCQlyZXR1cm4gcHV0X3VzZXIocmFkZHIsICh1bG9uZyAqKSB0aGlyZCk7CisJCX0KKwkJY2FzZSAxOgkvKiBpQkNTMiBlbXVsYXRvciBlbnRyeSBwb2ludCAqLworCQkJaWYgKCFzZWdtZW50X2VxKGdldF9mcygpLCBnZXRfZHMoKSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXR1cm4gZG9fc2htYXQoZmlyc3QsIChjaGFyIF9fdXNlciAqKSBwdHIsIHNlY29uZCwKKwkJCQkJKHVsb25nICopIHRoaXJkKTsKKwkJfQorCWNhc2UgU0hNRFQ6CisJCXJldHVybiBzeXNfc2htZHQoKGNoYXIgX191c2VyICopcHRyKTsKKwljYXNlIFNITUdFVDoKKwkJcmV0dXJuIHN5c19zaG1nZXQoZmlyc3QsIHNlY29uZCwgdGhpcmQpOworCWNhc2UgU0hNQ1RMOgorCQlyZXR1cm4gc3lzX3NobWN0bChmaXJzdCwgc2Vjb25kLAorCQkJCSAgKHN0cnVjdCBzaG1pZF9kcyBfX3VzZXIgKikgcHRyKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL3RpbWUuYyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvdGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNDkyZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAva2VybmVsL3RpbWUuYwpAQCAtMCwwICsxLDEyOSBAQAorLyogTU4xMDMwMCBMb3cgbGV2ZWwgdGltZSBtYW5hZ2VtZW50CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqIC0gRGVyaXZlZCBmcm9tIGFyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW50Y3RsLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vcnRjLmg+CisKKyNpZmRlZiBDT05GSUdfTU4xMDMwMF9SVEMKK3Vuc2lnbmVkIGxvbmcgbW4xMDMwMF9pb2NsazsJCS8qIHN5c3RlbSBJL08gY2xvY2sgZnJlcXVlbmN5ICovCit1bnNpZ25lZCBsb25nIG1uMTAzMDBfaW9iY2xrOwkJLyogc3lzdGVtIEkvTyBjbG9jayBmcmVxdWVuY3kgKi8KK3Vuc2lnbmVkIGxvbmcgbW4xMDMwMF90c2NfcGVyX0haOwkvKiBudW1iZXIgb2YgaW9jbGtzIHBlciBqaWZmeSAqLworI2VuZGlmIC8qIENPTkZJR19NTjEwMzAwX1JUQyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtbjEwMzAwX2xhc3RfdHNjOwkvKiB0aW1lLXN0YW1wIGNvdW50ZXIgYXQgbGFzdCB0aW1lCisJCQkJCSAqIGludGVycnVwdCBvY2N1cnJlZCAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHRpbWVyX2lycSA9IHsKKwkuaGFuZGxlcgk9IHRpbWVyX2ludGVycnVwdCwKKwkuZmxhZ3MJCT0gSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVEIHwgSVJRRl9USU1FUiwKKwkubWFzawkJPSBDUFVfTUFTS19OT05FLAorCS5uYW1lCQk9ICJ0aW1lciIsCit9OworCisvKgorICogc2NoZWR1bGVyIGNsb2NrIC0gcmV0dXJucyBjdXJyZW50IHRpbWUgaW4gbmFub3NlYyB1bml0cy4KKyAqLwordW5zaWduZWQgbG9uZyBsb25nIHNjaGVkX2Nsb2NrKHZvaWQpCit7CisJdW5pb24geworCQl1bnNpZ25lZCBsb25nIGxvbmcgbDsKKwkJdTMyIHdbMl07CisJfSBxdW90OworCisJcXVvdC53WzBdID0gbW4xMDMwMF9sYXN0X3RzYyAtIGdldF9jeWNsZXMoKTsKKwlxdW90LndbMV0gPSAxMDAwMDAwMDAwOworCisJYXNtKCJtdWx1ICUyLCUzLCUwLCUxIgorCSAgICA6ICI9ciIocXVvdC53WzFdKSwgIj1yIihxdW90LndbMF0pCisJICAgIDogIjAiKHF1b3Qud1sxXSksICIxIihxdW90LndbMF0pCisJICAgIDogImNjIik7CisKKwlkb19kaXYocXVvdC5sLCBNTjEwMzAwX1RTQ0NMSyk7CisKKwlyZXR1cm4gcXVvdC5sOworfQorCisvKgorICogYWR2YW5jZSB0aGUga2VybmVsJ3MgdGltZSBrZWVwaW5nIGNsb2NrcyAoeHRpbWUgYW5kIGppZmZpZXMpCisgKiAtIHdlIHVzZSBUaW1lciAwICYgMSBjYXNjYWRlZCBhcyBhIGNsb2NrIHRvIG51ZGdlIHVzIHRoZSBuZXh0IHRpbWUKKyAqICAgdGhlcmUncyBhIG5lZWQgdG8gdXBkYXRlCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB0aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXVuc2lnbmVkIHRzYywgZWxhcHNlOworCisJd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7CisKKwl3aGlsZSAodHNjID0gZ2V0X2N5Y2xlcygpLAorCSAgICAgICBlbGFwc2UgPSBtbjEwMzAwX2xhc3RfdHNjIC0gdHNjLCAvKiB0aW1lIGVsYXBzZWQgc2luY2UgbGFzdAorCQkJCQkJICogdGljayAqLworCSAgICAgICBlbGFwc2UgPiBNTjEwMzAwX1RTQ19QRVJfSFoKKwkgICAgICAgKSB7CisJCW1uMTAzMDBfbGFzdF90c2MgLT0gTU4xMDMwMF9UU0NfUEVSX0haOworCisJCS8qIGFkdmFuY2UgdGhlIGtlcm5lbCdzIHRpbWUgdHJhY2tpbmcgc3lzdGVtICovCisJCXByb2ZpbGVfdGljayhDUFVfUFJPRklMSU5HKTsKKwkJZG9fdGltZXIoMSk7CisJCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZShnZXRfaXJxX3JlZ3MoKSkpOworCQljaGVja19ydGNfdGltZSgpOworCX0KKworCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogaW5pdGlhbGlzZSB0aGUgdmFyaW91cyB0aW1lcnMgdXNlZCBieSB0aGUgbWFpbiBwYXJ0IG9mIHRoZSBrZXJuZWwKKyAqLwordm9pZCBfX2luaXQgdGltZV9pbml0KHZvaWQpCit7CisJLyogd2UgbmVlZCB0aGUgcHJlc2NhbGFyIHJ1bm5pbmcgdG8gYmUgYWJsZSB0byB1c2UgSU9DTEsvOAorCSAqIC0gSU9DTEsgcnVucyBhdCAxLzQgKFNUNSBvcGVuKSBvciAxLzggKFNUNSBjbG9zZWQpIGludGVybmFsIENQVSBjbG9jaworCSAqIC0gSU9DTEsgcnVucyBhdCBGb3NjIHJhdGUgKGNyeXN0YWwgc3BlZWQpCisJICovCisJVE1QU0NOVCB8PSBUTVBTQ05UX0VOQUJMRTsKKworCXN0YXJ0dXBfdGltZXN0YW1wX2NvdW50ZXIoKTsKKworCXByaW50ayhLRVJOX0lORk8KKwkgICAgICAgInRpbWVzdGFtcCBjb3VudGVyIEkvTyBjbG9jayBydW5uaW5nIGF0ICVsdS4lMDJsdSIKKwkgICAgICAgIiAoY2FsaWJyYXRlZCBhZ2FpbnN0IFJUQylcbiIsCisJICAgICAgIE1OMTAzMDBfVFNDQ0xLIC8gMTAwMDAwMCwgKE1OMTAzMDBfVFNDQ0xLIC8gMTAwMDApICUgMTAwKTsKKworCXh0aW1lLnR2X3NlYyA9IGdldF9pbml0aWFsX3J0Y190aW1lKCk7CisJeHRpbWUudHZfbnNlYyA9IDA7CisKKwltbjEwMzAwX2xhc3RfdHNjID0gVE1UU0NCQzsKKworCS8qIHVzZSB0aW1lciAwICYgMSBjYXNjYWRlZCB0byB0aWNrIGF0IGFzIGNsb3NlIHRvIEhaIGFzIHBvc3NpYmxlICovCisJc2V0dXBfaXJxKFRNSkNJUlEsICZ0aW1lcl9pcnEpOworCisJc2V0X2ludHJfbGV2ZWwoVE1KQ0lSUSwgVE1KQ0lDUl9MRVZFTCk7CisKKwlzdGFydHVwX2ppZmZpZXNfY291bnRlcigpOworCisjaWZkZWYgQ09ORklHX01OMTAzMDBfV0RfVElNRVIKKwkvKiBzdGFydCB0aGUgd2F0Y2hkb2cgdGltZXIgKi8KKwl3YXRjaGRvZ19nbygpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL3RyYXBzLmMgYi9hcmNoL21uMTAzMDAva2VybmVsL3RyYXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5ZGM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvdHJhcHMuYwpAQCAtMCwwICsxLDYxOSBAQAorLyogTU4xMDMwMCBFeGNlcHRpb24gaGFuZGxpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWF0c3VzaGl0YSBFbGVjdHJpYyBJbmR1c3RyaWFsIENvLiwgTHRkLgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIE1vZGlmaWVkIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CisjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9jcHUtcmVncy5oPgorI2luY2x1ZGUgPGFzbS9idXNjdGwtcmVncy5oPgorI2luY2x1ZGUgPGFzbS91bml0L2xlZHMuaD4KKyNpbmNsdWRlIDxhc20vZnB1Lmg+CisjaW5jbHVkZSA8YXNtL2dkYi1zdHViLmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisKKyNpZiAoQ09ORklHX0lOVEVSUlVQVF9WRUNUT1JfQkFTRSAmIDB4ZmZmZmZmKQorI2Vycm9yICJJTlRFUlJVUFRfVkVDVE9SX0JBU0Ugbm90IGFsaWduZWQgdG8gMTZNaUIgYm91bmRhcnkhIgorI2VuZGlmCisKK3N0cnVjdCBwdF9yZWdzICpfX2ZyYW1lOyAvKiBjdXJyZW50IGZyYW1lIHBvaW50ZXIgKi8KK0VYUE9SVF9TWU1CT0woX19mcmFtZSk7CisKK2ludCBrc3RhY2tfZGVwdGhfdG9fcHJpbnQgPSAyNDsKKworc3BpbmxvY2tfdCBkaWVfbG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGRpZV9sb2NrKTsKKworQVRPTUlDX05PVElGSUVSX0hFQUQobW4xMDMwMF9kaWVfY2hhaW4pOworCisvKgorICogVGhlc2UgY29uc3RhbnRzIGFyZSBmb3Igc2VhcmNoaW5nIGZvciBwb3NzaWJsZSBtb2R1bGUgdGV4dAorICogc2VnbWVudHMuIE1PRFVMRV9SQU5HRSBpcyBhIGd1ZXNzIG9mIGhvdyBtdWNoIHNwYWNlIGlzIGxpa2VseQorICogdG8gYmUgdm1hbGxvY2VkLgorICovCisjZGVmaW5lIE1PRFVMRV9SQU5HRSAoOCAqIDEwMjQgKiAxMDI0KQorCisjZGVmaW5lIERPX0VSUk9SKHNpZ25yLCBwcm9sb2d1ZSwgc3RyLCBuYW1lKQkJCVwKK2FzbWxpbmthZ2Ugdm9pZCBuYW1lKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1MzIgaW50Y29kZSkJCVwKK3sJCQkJCQkJCVwKKwlwcm9sb2d1ZTsJCQkJCQlcCisJaWYgKGRpZV9pZl9ub19maXh1cChzdHIsIHJlZ3MsIGludGNvZGUpKQkJXAorCQlyZXR1cm47CQkJCQkJXAorCWZvcmNlX3NpZyhzaWduciwgY3VycmVudCk7CQkJCVwKK30KKworI2RlZmluZSBET19FSU5GTyhzaWduciwgcHJvbG9ndWUsIHN0ciwgbmFtZSwgc2ljb2RlKQkJCVwKK2FzbWxpbmthZ2Ugdm9pZCBuYW1lKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1MzIgaW50Y29kZSkJCQlcCit7CQkJCQkJCQkJXAorCXNpZ2luZm9fdCBpbmZvOwkJCQkJCQlcCisJcHJvbG9ndWU7CQkJCQkJCVwKKwlpZiAoZGllX2lmX25vX2ZpeHVwKHN0ciwgcmVncywgaW50Y29kZSkpCQkJXAorCQlyZXR1cm47CQkJCQkJCVwKKwlpbmZvLnNpX3NpZ25vID0gc2lnbnI7CQkJCQkJXAorCWlmIChzaWduciA9PSBTSUdJTEwgJiYgc2ljb2RlID09IElMTF9JTExPUEMpIHsJCQlcCisJCXVpbnQ4X3Qgb3Bjb2RlOwkJCQkJCVwKKwkJaWYgKGdldF91c2VyKG9wY29kZSwgKHVpbnQ4X3QgX191c2VyICopcmVncy0+cGMpID09IDApCVwKKwkJCWlmIChvcGNvZGUgPT0gMHhmZikJCQkJXAorCQkJCWluZm8uc2lfc2lnbm8gPSBTSUdUUkFQOwkJXAorCX0JCQkJCQkJCVwKKwlpbmZvLnNpX2Vycm5vID0gMDsJCQkJCQlcCisJaW5mby5zaV9jb2RlID0gc2ljb2RlOwkJCQkJCVwKKwlpbmZvLnNpX2FkZHIgPSAodm9pZCAqKSByZWdzLT5wYzsJCQkJXAorCWZvcmNlX3NpZ19pbmZvKGluZm8uc2lfc2lnbm8sICZpbmZvLCBjdXJyZW50KTsJCQlcCit9CisKK0RPX0VSUk9SKFNJR1RSQVAsIHt9LCAidHJhcCIsCQkJdHJhcCk7CitET19FUlJPUihTSUdTRUdWLCB7fSwgImlicmVhayIsCQkJaWJyZWFrKTsKK0RPX0VSUk9SKFNJR1NFR1YsIHt9LCAib2JyZWFrIiwJCQlvYnJlYWspOworRE9fRUlORk8oU0lHU0VHViwge30sICJhY2Nlc3MgZXJyb3IiLAkJYWNjZXNzX2Vycm9yLAlTRUdWX0FDQ0VSUik7CitET19FSU5GTyhTSUdTRUdWLCB7fSwgImluc24gYWNjZXNzIGVycm9yIiwJaW5zbl9hY2NfZXJyb3IsCVNFR1ZfQUNDRVJSKTsKK0RPX0VJTkZPKFNJR1NFR1YsIHt9LCAiZGF0YSBhY2Nlc3MgZXJyb3IiLAlkYXRhX2FjY19lcnJvciwJU0VHVl9BQ0NFUlIpOworRE9fRUlORk8oU0lHSUxMLCAge30sICJwcml2aWxlZ2VkIG9wY29kZSIsCXByaXZfb3AsCUlMTF9QUlZPUEMpOworRE9fRUlORk8oU0lHSUxMLCAge30sICJpbnZhbGlkIG9wY29kZSIsCQlpbnZhbGlkX29wLAlJTExfSUxMT1BDKTsKK0RPX0VJTkZPKFNJR0lMTCwgIHt9LCAiaW52YWxpZCBleCBvcGNvZGUiLAlpbnZhbGlkX2V4b3AsCUlMTF9JTExPUEMpOworRE9fRUlORk8oU0lHQlVTLCAge30sICJpbnZhbGlkIGFkZHJlc3MiLAltZW1fZXJyb3IsCUJVU19BRFJFUlIpOworRE9fRUlORk8oU0lHQlVTLCAge30sICJidXMgZXJyb3IiLAkJYnVzX2Vycm9yLAlCVVNfQURSRVJSKTsKK0RPX0VJTkZPKFNJR0lMTCwgIHt9LCAiRlBVIGludmFsaWQgb3Bjb2RlIiwgCWZwdV9pbnZhbGlkX29wLAlJTExfQ09QUk9DKTsKKworRE9fRVJST1IoU0lHVFJBUCwKKyNpZm5kZWYgQ09ORklHX01OMTAzMDBfVVNJTkdfSlRBRworCSBEQ1IgJj0gfjB4MDAwMSwKKyNlbHNlCisJIHt9LAorI2VuZGlmCisJICJzaW5nbGUgc3RlcCIsIGlzdGVwKTsKKworLyoKKyAqIGhhbmRsZSBOTUkKKyAqLworYXNtbGlua2FnZSB2b2lkIG5taShzdHJ1Y3QgcHRfcmVncyAqcmVncywgZW51bSBleGNlcHRpb25fY29kZSBjb2RlKQoreworCS8qIHNlZSBpZiBnZGJzdHViIHdhbnRzIHRvIGRlYWwgd2l0aCBpdCAqLworI2lmZGVmIENPTkZJR19HREJTVFVCCisJaWYgKGdkYnN0dWJfaW50ZXJjZXB0KHJlZ3MsIGNvZGUpKQorCQlyZXR1cm47CisjZW5kaWYKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIi0tLSBSZWdpc3RlciBEdW1wIC0tLVxuIik7CisJc2hvd19yZWdpc3RlcnMocmVncyk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKK30KKworLyoKKyAqIHNob3cgYSBzdGFjayB0cmFjZSBmcm9tIHRoZSBzcGVjaWZpZWQgc3RhY2sgcG9pbnRlcgorICovCit2b2lkIHNob3dfdHJhY2UodW5zaWduZWQgbG9uZyAqc3ApCit7CisJdW5zaWduZWQgbG9uZyAqc3RhY2ssIGFkZHIsIG1vZHVsZV9zdGFydCwgbW9kdWxlX2VuZDsKKwlpbnQgaTsKKworCXByaW50ayhLRVJOX0VNRVJHICJcbiIKKwkgICAgICAgS0VSTl9FTUVSRyAiQ2FsbCBUcmFjZToiKTsKKworCXN0YWNrID0gc3A7CisJaSA9IDA7CisJbW9kdWxlX3N0YXJ0ID0gVk1BTExPQ19TVEFSVDsKKwltb2R1bGVfZW5kID0gVk1BTExPQ19FTkQ7CisKKwl3aGlsZSAoKChsb25nKSBzdGFjayAmIChUSFJFQURfU0laRSAtIDEpKSAhPSAwKSB7CisJCWFkZHIgPSAqc3RhY2srKzsKKwkJaWYgKF9fa2VybmVsX3RleHRfYWRkcmVzcyhhZGRyKSkgeworI2lmIDEKKwkJCXByaW50aygiIFs8JTA4bHg+XSIsIGFkZHIpOworCQkJcHJpbnRfc3ltYm9sKCIgJXMiLCBhZGRyKTsKKwkJCXByaW50aygiXG4iKTsKKyNlbHNlCisJCQlpZiAoKGkgJSA2KSA9PSAwKQorCQkJCXByaW50aygiXG4iIEtFUk5fRU1FUkcgIiAgIik7CisJCQlwcmludGsoIls8JTA4bHg+XSAiLCBhZGRyKTsKKwkJCWkrKzsKKyNlbmRpZgorCQl9CisJfQorCisJcHJpbnRrKCJcbiIpOworfQorCisvKgorICogc2hvdyB0aGUgcmF3IHN0YWNrIGZyb20gdGhlIHNwZWNpZmllZCBzdGFjayBwb2ludGVyCisgKi8KK3ZvaWQgc2hvd19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKnNwKQoreworCXVuc2lnbmVkIGxvbmcgKnN0YWNrOworCWludCBpOworCisJaWYgKCFzcCkKKwkJc3AgPSAodW5zaWduZWQgbG9uZyAqKSAmc3A7CisKKwlzdGFjayA9IHNwOworCXByaW50ayhLRVJOX0VNRVJHICJTdGFjazoiKTsKKwlmb3IgKGkgPSAwOyBpIDwga3N0YWNrX2RlcHRoX3RvX3ByaW50OyBpKyspIHsKKwkJaWYgKCgobG9uZykgc3RhY2sgJiAoVEhSRUFEX1NJWkUgLSAxKSkgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoKGkgJSA4KSA9PSAwKQorCQkJcHJpbnRrKCJcbiIgS0VSTl9FTUVSRyAiICAiKTsKKwkJcHJpbnRrKCIlMDhseCAiLCAqc3RhY2srKyk7CisJfQorCisJc2hvd190cmFjZShzcCk7Cit9CisKKy8qCisgKiB0aGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGR1bXBfc3RhY2sgZ2VuZXJhdG9yCisgKi8KK3ZvaWQgZHVtcF9zdGFjayh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc3RhY2s7CisKKwlzaG93X3N0YWNrKGN1cnJlbnQsICZzdGFjayk7Cit9CitFWFBPUlRfU1lNQk9MKGR1bXBfc3RhY2spOworCisvKgorICogZHVtcCB0aGUgcmVnaXN0ZXIgZmlsZSBpbiB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiBmcmFtZQorICovCit2b2lkIHNob3dfcmVnaXN0ZXJzX29ubHkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBzc3A7CisKKwlzc3AgPSAodW5zaWduZWQgbG9uZykgcmVncyArIHNpemVvZigqcmVncyk7CisKKwlwcmludGsoS0VSTl9FTUVSRyAiUEM6ICAlMDhseCBFUFNXOiAgJTA4bHggIFNTUDogJTA4bHggbW9kZTogJXNcbiIsCisJICAgICAgIHJlZ3MtPnBjLCByZWdzLT5lcHN3LCBzc3AsIHVzZXJfbW9kZShyZWdzKSA/ICJVc2VyIiA6ICJTdXBlciIpOworCXByaW50ayhLRVJOX0VNRVJHICJkMDogICUwOGx4ICAgZDE6ICAlMDhseCAgIGQyOiAlMDhseCAgIGQzOiAlMDhseFxuIiwKKwkgICAgICAgcmVncy0+ZDAsIHJlZ3MtPmQxLCByZWdzLT5kMiwgcmVncy0+ZDMpOworCXByaW50ayhLRVJOX0VNRVJHICJhMDogICUwOGx4ICAgYTE6ICAlMDhseCAgIGEyOiAlMDhseCAgIGEzOiAlMDhseFxuIiwKKwkgICAgICAgcmVncy0+YTAsIHJlZ3MtPmExLCByZWdzLT5hMiwgcmVncy0+YTMpOworCXByaW50ayhLRVJOX0VNRVJHICJlMDogICUwOGx4ICAgZTE6ICAlMDhseCAgIGUyOiAlMDhseCAgIGUzOiAlMDhseFxuIiwKKwkgICAgICAgcmVncy0+ZTAsIHJlZ3MtPmUxLCByZWdzLT5lMiwgcmVncy0+ZTMpOworCXByaW50ayhLRVJOX0VNRVJHICJlNDogICUwOGx4ICAgZTU6ICAlMDhseCAgIGU2OiAlMDhseCAgIGU3OiAlMDhseFxuIiwKKwkgICAgICAgcmVncy0+ZTQsIHJlZ3MtPmU1LCByZWdzLT5lNiwgcmVncy0+ZTcpOworCXByaW50ayhLRVJOX0VNRVJHICJsYXI6ICUwOGx4ICAgbGlyOiAlMDhseCAgbWRyOiAlMDhseCAgdXNwOiAlMDhseFxuIiwKKwkgICAgICAgcmVncy0+bGFyLCByZWdzLT5saXIsIHJlZ3MtPm1kciwgcmVncy0+c3ApOworCXByaW50ayhLRVJOX0VNRVJHICJjdmY6ICUwOGx4ICAgY3JsOiAlMDhseCAgY3JoOiAlMDhseCAgZHJxOiAlMDhseFxuIiwKKwkgICAgICAgcmVncy0+bWN2ZiwgcmVncy0+bWNybCwgcmVncy0+bWNyaCwgcmVncy0+bWRycSk7CisJcHJpbnRrKEtFUk5fRU1FUkcgInRocmVhZGluZm89JXAgdGFzaz0lcClcbiIsCisJICAgICAgIGN1cnJlbnRfdGhyZWFkX2luZm8oKSwgY3VycmVudCk7CisKKwlpZiAoKHVuc2lnbmVkIGxvbmcpIGN1cnJlbnQgPj0gMHg5MDAwMDAwMFVMICYmCisJICAgICh1bnNpZ25lZCBsb25nKSBjdXJyZW50IDwgMHg5NDAwMDAwMFVMKQorCQlwcmludGsoS0VSTl9FTUVSRyAiUHJvY2VzcyAlcyAocGlkOiAlZClcbiIsCisJCSAgICAgICBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQpOworCisJcHJpbnRrKEtFUk5fRU1FUkcgIkNQVVA6ICAgJTA0aHhcbiIsIENQVVApOworCXByaW50ayhLRVJOX0VNRVJHICJUQlI6ICAgICUwOHhcbiIsIFRCUik7CisJcHJpbnRrKEtFUk5fRU1FUkcgIkRFQVI6ICAgJTA4eFxuIiwgREVBUik7CisJcHJpbnRrKEtFUk5fRU1FUkcgInNJU1I6ICAgJTA4eFxuIiwgc0lTUik7CisJcHJpbnRrKEtFUk5fRU1FUkcgIk5NSUNSOiAgJTA0aHhcbiIsIE5NSUNSKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiQkNCRVJSOiAlMDh4XG4iLCBCQ0JFUlIpOworCXByaW50ayhLRVJOX0VNRVJHICJCQ0JFQVI6ICUwOHhcbiIsIEJDQkVBUik7CisJcHJpbnRrKEtFUk5fRU1FUkcgIk1NVUZDUjogJTA4eFxuIiwgTU1VRkNSKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiSVBURVUgOiAlMDh4ICBJUFRFTDI6ICUwOHhcbiIsIElQVEVVLCBJUFRFTDIpOworCXByaW50ayhLRVJOX0VNRVJHICJEUFRFVTogICUwOHggIERQVEVMMjogJTA4eFxuIiwgRFBURVUsIERQVEVMMik7Cit9CisKKy8qCisgKiBkdW1wIHRoZSByZWdpc3RlcnMgYW5kIHRoZSBzdGFjaworICovCit2b2lkIHNob3dfcmVnaXN0ZXJzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgc3A7CisJaW50IGk7CisKKwlzaG93X3JlZ2lzdGVyc19vbmx5KHJlZ3MpOworCisJaWYgKCF1c2VyX21vZGUocmVncykpCisJCXNwID0gKHVuc2lnbmVkIGxvbmcpIHJlZ3MgKyBzaXplb2YoKnJlZ3MpOworCWVsc2UKKwkJc3AgPSByZWdzLT5zcDsKKworCS8qIHdoZW4gaW4ta2VybmVsLCB3ZSBhbHNvIHByaW50IG91dCB0aGUgc3RhY2sgYW5kIGNvZGUgYXQgdGhlCisJICogdGltZSBvZiB0aGUgZmF1bHQuLgorCSAqLworCWlmICghdXNlcl9tb2RlKHJlZ3MpKSB7CisJCXByaW50ayhLRVJOX0VNRVJHICJcbiIpOworCQlzaG93X3N0YWNrKGN1cnJlbnQsICh1bnNpZ25lZCBsb25nICopIHNwKTsKKworI2lmIDAKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIlxuIgorCQkgICAgICAgS0VSTl9FTUVSRyAiQ29kZTogIik7CisJCWlmIChyZWdzLT5wYyA8IFBBR0VfT0ZGU0VUKQorCQkJZ290byBiYWQ7CisKKwkJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKKwkJCXVuc2lnbmVkIGNoYXIgYzsKKwkJCWlmIChfX2dldF91c2VyKGMsICYoKHVuc2lnbmVkIGNoYXIgKikgcmVncy0+cGMpW2ldKSkKKwkJCQlnb3RvIGJhZDsKKwkJCXByaW50aygiJTAyeCAiLCBjKTsKKwkJfQorI2Vsc2UKKwkJaSA9IDA7CisjZW5kaWYKKwl9CisKKwlwcmludGsoIlxuIik7CisJcmV0dXJuOworCisjaWYgMAorYmFkOgorCXByaW50ayhLRVJOX0VNRVJHICIgQmFkIFBDIHZhbHVlLiIpOworCWJyZWFrOworI2VuZGlmCit9CisKKy8qCisgKgorICovCit2b2lkIHNob3dfdHJhY2VfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwl1bnNpZ25lZCBsb25nIHNwID0gdHNrLT50aHJlYWQuc3A7CisKKwkvKiBVc2VyIHNwYWNlIG9uIGFub3RoZXIgQ1BVPyAqLworCWlmICgoc3AgXiAodW5zaWduZWQgbG9uZykgdHNrKSAmIChQQUdFX01BU0sgPDwgMSkpCisJCXJldHVybjsKKworCXNob3dfdHJhY2UoKHVuc2lnbmVkIGxvbmcgKikgc3ApOworfQorCisvKgorICogbm90ZSB0aGUgdW50aW1lbHkgZGVhdGggb2YgcGFydCBvZiB0aGUga2VybmVsCisgKi8KK3ZvaWQgZGllKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGVudW0gZXhjZXB0aW9uX2NvZGUgY29kZSkKK3sKKwljb25zb2xlX3ZlcmJvc2UoKTsKKwlzcGluX2xvY2tfaXJxKCZkaWVfbG9jayk7CisJcHJpbnRrKEtFUk5fRU1FUkcgIlxuIgorCSAgICAgICBLRVJOX0VNRVJHICIlczogJTA0eFxuIiwKKwkgICAgICAgc3RyLCBjb2RlICYgMHhmZmZmKTsKKwlzaG93X3JlZ2lzdGVycyhyZWdzKTsKKworCWlmIChyZWdzLT5wYyA+PSAweDAyMDAwMDAwICYmIHJlZ3MtPnBjIDwgMHgwNDAwMDAwMCAmJgorCSAgICAocmVncy0+ZXBzdyAmIChFUFNXX0lNIHwgRVBTV19JRSkpICE9IChFUFNXX0lNIHwgRVBTV19JRSkpIHsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIkV4Y2VwdGlvbiBpbiB1c2VybW9kZSBpbnRlcnJ1cHQgaGFuZGxlclxuIik7CisJCXByaW50ayhLRVJOX0VNRVJHICJcbiIKKwkJICAgICAgIEtFUk5fRU1FUkcgIiAgUGxlYXNlIGNvbm5lY3QgdG8ga2VybmVsIGRlYnVnZ2VyICEhXG4iKTsKKwkJYXNtIHZvbGF0aWxlICgiMDogYnJhIDBiIik7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxKCZkaWVfbG9jayk7CisJZG9fZXhpdChTSUdTRUdWKTsKK30KKworLyoKKyAqIHNlZSBpZiB0aGVyZSdzIGEgZml4dXAgaGFuZGxlciB3ZSBjYW4gZm9yY2UgYSBqdW1wIHRvIHdoZW4gYW4gZXhjZXB0aW9uCisgKiBoYXBwZW5zIGR1ZSB0byBzb21ldGhpbmcga2VybmVsIGNvZGUgZGlkCisgKi8KK2ludCBkaWVfaWZfbm9fZml4dXAoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJICAgIGVudW0gZXhjZXB0aW9uX2NvZGUgY29kZSkKK3sKKwlpZiAodXNlcl9tb2RlKHJlZ3MpKQorCQlyZXR1cm4gMDsKKworCXBlcmlwaGVyYWxfbGVkc19kaXNwbGF5X2V4Y2VwdGlvbihjb2RlKTsKKworCXN3aXRjaCAoY29kZSkgeworCQkvKiBzZWUgaWYgd2UgY2FuIGZpeHVwIHRoZSBrZXJuZWwgYWNjZXNzaW5nIG1lbW9yeSAqLworCWNhc2UgRVhDRVBfSVRMQk1JU1M6CisJY2FzZSBFWENFUF9EVExCTUlTUzoKKwljYXNlIEVYQ0VQX0lBRVJST1I6CisJY2FzZSBFWENFUF9EQUVSUk9SOgorCWNhc2UgRVhDRVBfTUVNRVJSOgorCWNhc2UgRVhDRVBfTUlTQUxJR046CisJY2FzZSBFWENFUF9CVVNFUlJPUjoKKwljYXNlIEVYQ0VQX0lMTERBVEFDQzoKKwljYXNlIEVYQ0VQX0lPSU5TQUNDOgorCWNhc2UgRVhDRVBfUFJJVklOU0FDQzoKKwljYXNlIEVYQ0VQX1BSSVZEQVRBQ0M6CisJY2FzZSBFWENFUF9EQVRJTlNBQ0M6CisJCWlmIChmaXh1cF9leGNlcHRpb24ocmVncykpCisJCQlyZXR1cm4gMTsKKwljYXNlIEVYQ0VQX1VOSU1QSU5TOgorCQlpZiAocmVncy0+cGMgJiYgKih1aW50OF90ICopcmVncy0+cGMgPT0gMHhmZikKKwkJCWlmIChub3RpZnlfZGllKERJRV9CUkVBS1BPSU5ULCBzdHIsIHJlZ3MsIGNvZGUsIDAsIDApKQorCQkJCXJldHVybiAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKiBzZWUgaWYgZ2Ric3R1YiB3YW50cyB0byBkZWFsIHdpdGggaXQgKi8KKyNpZmRlZiBDT05GSUdfR0RCU1RVQgorCWlmIChnZGJzdHViX2ludGVyY2VwdChyZWdzLCBjb2RlKSkKKwkJcmV0dXJuIDE7CisjZW5kaWYKKworCWlmIChub3RpZnlfZGllKERJRV9HUEYsIHN0ciwgcmVncywgY29kZSwgMCwgMCkpCisJCXJldHVybiAxOworCisJLyogbWFrZSB0aGUgcHJvY2VzcyBkaWUgYXMgdGhlIGxhc3QgcmVzb3J0ICovCisJZGllKHN0ciwgcmVncywgY29kZSk7Cit9CisKKy8qCisgKiBoYW5kbGUgdW5zdXBwb3J0ZWQgc3lzY2FsbCBpbnN0cnVjdGlvbnMgKHN5c2NhbGwgMS0xNSkKKyAqLworc3RhdGljIGFzbWxpbmthZ2Ugdm9pZCB1bnN1cHBvcnRlZF9zeXNjYWxsKHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCQkgICBlbnVtIGV4Y2VwdGlvbl9jb2RlIGNvZGUpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCXNpZ2luZm9fdCBpbmZvOworCisJLyogY2F0Y2ggYSBrZXJuZWwgQlVHKCkgKi8KKwlpZiAoY29kZSA9PSBFWENFUF9TWVNDQUxMMTUgJiYgIXVzZXJfbW9kZShyZWdzKSkgeworCQlpZiAocmVwb3J0X2J1ZyhyZWdzLT5wYywgcmVncykgPT0gQlVHX1RSQVBfVFlQRV9CVUcpIHsKKyNpZmRlZiBDT05GSUdfR0RCU1RVQgorCQkJX19nZGJzdHViX2J1Z190cmFwKCk7CisjZW5kaWYKKwkJfQorCX0KKworCXJlZ3MtPnBjIC09IDI7IC8qIHN5c2NhbGwgcmV0dXJuIGFkZHIgaXMgX2FmdGVyXyB0aGUgaW5zdHJ1Y3Rpb24gKi8KKworCWRpZV9pZl9ub19maXh1cCgiQW4gdW5zdXBwb3J0ZWQgc3lzY2FsbCBpbnNuIHdhcyB1c2VkIGJ5IHRoZSBrZXJuZWxcbiIsCisJCQlyZWdzLCBjb2RlKTsKKworCWluZm8uc2lfc2lnbm8JPSBTSUdJTEw7CisJaW5mby5zaV9lcnJubwk9IEVOT1NZUzsKKwlpbmZvLnNpX2NvZGUJPSBJTExfSUxMVFJQOworCWluZm8uc2lfYWRkcgk9ICh2b2lkICopIHJlZ3MtPnBjOworCWZvcmNlX3NpZ19pbmZvKFNJR0lMTCwgJmluZm8sIHRzayk7Cit9CisKKy8qCisgKiBkaXNwbGF5IHRoZSByZWdpc3RlciBmaWxlIHdoZW4gdGhlIHN0YWNrIHBvaW50ZXIgZ2V0cyBjbG9iYmVyZWQKKyAqLworYXNtbGlua2FnZSB2b2lkIGRvX2RvdWJsZV9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisKKwlzdHJjcHkodHNrLT5jb21tLCAiZW1lcmdlbmN5IHRzayIpOworCXRzay0+cGlkID0gMDsKKwljb25zb2xlX3ZlcmJvc2UoKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiLS0tIGRvdWJsZSBmYXVsdCAtLS1cbiIpOworCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOworfQorCisvKgorICogYXN5bmNocm9ub3VzIGJ1cyBlcnJvciAoZXh0ZXJuYWwsIHVzdWFsbHkgSS9PIERNQSkKKyAqLworYXNtbGlua2FnZSB2b2lkIGlvX2J1c19lcnJvcih1MzIgYmNiZXJyLCB1MzIgYmNiZWFyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwljb25zb2xlX3ZlcmJvc2UoKTsKKworCXByaW50ayhLRVJOX0VNRVJHICJcbiIKKwkgICAgICAgS0VSTl9FTUVSRyAiQXN5bmNocm9ub3VzIEkvTyBCdXMgRXJyb3JcbiIKKwkgICAgICAgS0VSTl9FTUVSRyAiPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCisJaWYgKGJjYmVyciAmIEJDQkVSUl9CRU1FKQorCQlwcmludGsoS0VSTl9FTUVSRyAiLSBNdWx0aXBsZSByZWNvcmRlZCBlcnJvcnNcbiIpOworCisJcHJpbnRrKEtFUk5fRU1FUkcgIi0gRmF1bHRpbmcgQnVzZXM6JXMlcyVzXG4iLAorCSAgICAgICBiY2JlcnIgJiBCQ0JFUlJfQkVNUl9DSSAgPyAiIENQVS1JbnMtRmV0Y2giIDogIiIsCisJICAgICAgIGJjYmVyciAmIEJDQkVSUl9CRU1SX0NEICA/ICIgQ1BVLURhdGEiIDogIiIsCisJICAgICAgIGJjYmVyciAmIEJDQkVSUl9CRU1SX0RNQSA/ICIgRE1BIiA6ICIiKTsKKworCXByaW50ayhLRVJOX0VNRVJHICItICVzICVzIGFjY2VzcyBtYWRlIHRvICVzIGF0IGFkZHJlc3MgJTA4eFxuIiwKKwkgICAgICAgYmNiZXJyICYJQkNCRVJSX0JFQlNUID8gIkJ1cnN0IiA6ICJTaW5nbGUiLAorCSAgICAgICBiY2JlcnIgJglCQ0JFUlJfQkVSVyA/ICJSZWFkIiA6ICJXcml0ZSIsCisJICAgICAgIGJjYmVyciAmCUJDQkVSUl9CRVNCX01PTiAgPyAiTW9uaXRvciBTcGFjZSIgOgorCSAgICAgICBiY2JlcnIgJglCQ0JFUlJfQkVTQl9JTyAgID8gIkludGVybmFsIENQVSBJL08gU3BhY2UiIDoKKwkgICAgICAgYmNiZXJyICYJQkNCRVJSX0JFU0JfRVggICA/ICJFeHRlcm5hbCBJL08gQnVzIiA6CisJICAgICAgIGJjYmVyciAmCUJDQkVSUl9CRVNCX09QRVggPyAiRXh0ZXJuYWwgTWVtb3J5IEJ1cyIgOgorCSAgICAgICAiT24gQ2hpcCBNZW1vcnkiLAorCSAgICAgICBiY2JlYXIKKwkgICAgICAgKTsKKworCXByaW50ayhLRVJOX0VNRVJHICItIERldGVjdGVkIGJ5IHRoZSAlc1xuIiwKKwkgICAgICAgYmNiZXJyJkJDQkVSUl9CRVNEID8gIkJ1cyBDb250cm9sIFVuaXQiIDogIlNsYXZlIEJ1cyIpOworCisjaWZkZWYgQ09ORklHX1BDSQorI2RlZmluZSBCUklER0VSRUdCKFgpICgqKHZvbGF0aWxlIF9fdTggICopKDB4QkUwNDAwMDAgKyAoWCkpKQorI2RlZmluZSBCUklER0VSRUdXKFgpICgqKHZvbGF0aWxlIF9fdTE2ICopKDB4QkUwNDAwMDAgKyAoWCkpKQorI2RlZmluZSBCUklER0VSRUdMKFgpICgqKHZvbGF0aWxlIF9fdTMyICopKDB4QkUwNDAwMDAgKyAoWCkpKQorCisJcHJpbnRrKEtFUk5fRU1FUkcgIi0gUENJIE1lbW9yeSBQYWdpbmcgUmVnOiAgICAgICAgICUwOHhcbiIsCisJICAgICAgICoodm9sYXRpbGUgX191MzIgKikgKDB4QkZGRkZGRjQpKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiLSBQQ0kgQnJpZGdlIEJhc2UgQWRkcmVzcyAwOiAgICAgJTA4eFxuIiwKKwkgICAgICAgQlJJREdFUkVHTChQQ0lfQkFTRV9BRERSRVNTXzApKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiLSBQQ0kgQnJpZGdlIEFNUENJIEJhc2UgQWRkcmVzczogJTA4eFxuIiwKKwkgICAgICAgQlJJREdFUkVHTCgweDQ4KSk7CisJcHJpbnRrKEtFUk5fRU1FUkcgIi0gUENJIEJyaWRnZSBDb21tYW5kOiAgICAgICAgICAgICAgICAlMDRoeFxuIiwKKwkgICAgICAgQlJJREdFUkVHVyhQQ0lfQ09NTUFORCkpOworCXByaW50ayhLRVJOX0VNRVJHICItIFBDSSBCcmlkZ2UgU3RhdHVzOiAgICAgICAgICAgICAgICAgJTA0aHhcbiIsCisJICAgICAgIEJSSURHRVJFR1coUENJX1NUQVRVUykpOworCXByaW50ayhLRVJOX0VNRVJHICItIFBDSSBCcmlkZ2UgSW50IFN0YXR1czogICAgICAgICAlMDhoeFxuIiwKKwkgICAgICAgQlJJREdFUkVHTCgweDRjKSk7CisjZW5kaWYKKworCXByaW50ayhLRVJOX0VNRVJHICJcbiIpOworCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOworCisJcGFuaWMoIkhhbHRlZCBkdWUgdG8gYXN5bmNocm9ub3VzIEkvTyBCdXMgRXJyb3JcbiIpOworfQorCisvKgorICogaGFuZGxlIGFuIGV4Y2VwdGlvbiBmb3Igd2hpY2ggYSBoYW5kbGVyIGhhcyBub3QgeWV0IGJlZW4gaW5zdGFsbGVkCisgKi8KK2FzbWxpbmthZ2Ugdm9pZCB1bmluaXRpYWxpc2VkX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkJZW51bSBleGNlcHRpb25fY29kZSBjb2RlKQoreworCisJLyogc2VlIGlmIGdkYnN0dWIgd2FudHMgdG8gZGVhbCB3aXRoIGl0ICovCisjaWZkZWYgQ09ORklHX0dEQlNUVUIKKwlpZiAoZ2Ric3R1Yl9pbnRlcmNlcHQocmVncywgY29kZSkpCisJCXJldHVybjsKKyNlbmRpZgorCisJcGVyaXBoZXJhbF9sZWRzX2Rpc3BsYXlfZXhjZXB0aW9uKGNvZGUpOworCXByaW50ayhLRVJOX0VNRVJHICJVbmluaXRpYWxpc2VkIEV4Y2VwdGlvbiAweCUwNHhcbiIsIGNvZGUgJiAweEZGRkYpOworCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOworCisJZm9yICg7OykKKwkJY29udGludWU7Cit9CisKKy8qCisgKiBzZXQgYW4gaW50ZXJydXB0IHN0dWIgdG8ganVtcCB0byBhIGhhbmRsZXIKKyAqICEgTk9URTogdGhpcyBkb2VzICpub3QqIGZsdXNoIHRoZSBjYWNoZXMKKyAqLwordm9pZCBfX2luaXQgX19zZXRfaW50cl9zdHViKGVudW0gZXhjZXB0aW9uX2NvZGUgY29kZSwgdm9pZCAqaGFuZGxlcikKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdTggKnZlY3RvciA9ICh1OCAqKShDT05GSUdfSU5URVJSVVBUX1ZFQ1RPUl9CQVNFICsgY29kZSk7CisKKwlhZGRyID0gKHVuc2lnbmVkIGxvbmcpIGhhbmRsZXIgLSAodW5zaWduZWQgbG9uZykgdmVjdG9yOworCXZlY3RvclswXSA9IDB4ZGM7CQkvKiBKTVAgaGFuZGxlciAqLworCXZlY3RvclsxXSA9IGFkZHI7CisJdmVjdG9yWzJdID0gYWRkciA+PiA4OworCXZlY3RvclszXSA9IGFkZHIgPj4gMTY7CisJdmVjdG9yWzRdID0gYWRkciA+PiAyNDsKKwl2ZWN0b3JbNV0gPSAweGNiOworCXZlY3Rvcls2XSA9IDB4Y2I7CisJdmVjdG9yWzddID0gMHhjYjsKK30KKworLyoKKyAqIHNldCBhbiBpbnRlcnJ1cHQgc3R1YiB0byBqdW1wIHRvIGEgaGFuZGxlcgorICovCit2b2lkIF9faW5pdCBzZXRfaW50cl9zdHViKGVudW0gZXhjZXB0aW9uX2NvZGUgY29kZSwgdm9pZCAqaGFuZGxlcikKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdTggKnZlY3RvciA9ICh1OCAqKShDT05GSUdfSU5URVJSVVBUX1ZFQ1RPUl9CQVNFICsgY29kZSk7CisKKwlhZGRyID0gKHVuc2lnbmVkIGxvbmcpIGhhbmRsZXIgLSAodW5zaWduZWQgbG9uZykgdmVjdG9yOworCXZlY3RvclswXSA9IDB4ZGM7CQkvKiBKTVAgaGFuZGxlciAqLworCXZlY3RvclsxXSA9IGFkZHI7CisJdmVjdG9yWzJdID0gYWRkciA+PiA4OworCXZlY3RvclszXSA9IGFkZHIgPj4gMTY7CisJdmVjdG9yWzRdID0gYWRkciA+PiAyNDsKKwl2ZWN0b3JbNV0gPSAweGNiOworCXZlY3Rvcls2XSA9IDB4Y2I7CisJdmVjdG9yWzddID0gMHhjYjsKKworCW1uMTAzMDBfZGNhY2hlX2ZsdXNoX2ludigpOworCW1uMTAzMDBfaWNhY2hlX2ludigpOworfQorCisvKgorICogc2V0IGFuIGludGVycnVwdCBzdHViIHRvIGludm9rZSB0aGUgSlRBRyB1bml0IGFuZCB0aGVuIGp1bXAgdG8gYSBoYW5kbGVyCisgKi8KK3ZvaWQgX19pbml0IHNldF9qdGFnX3N0dWIoZW51bSBleGNlcHRpb25fY29kZSBjb2RlLCB2b2lkICpoYW5kbGVyKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwl1OCAqdmVjdG9yID0gKHU4ICopKENPTkZJR19JTlRFUlJVUFRfVkVDVE9SX0JBU0UgKyBjb2RlKTsKKworCWFkZHIgPSAodW5zaWduZWQgbG9uZykgaGFuZGxlciAtICgodW5zaWduZWQgbG9uZykgdmVjdG9yICsgMSk7CisJdmVjdG9yWzBdID0gMHhmZjsJCS8qIFBJIHRvIGp1bXAgaW50byBKVEFHIGRlYnVnZ2VyICovCisJdmVjdG9yWzFdID0gMHhkYzsJCS8qIGptcCBoYW5kbGVyICovCisJdmVjdG9yWzJdID0gYWRkcjsKKwl2ZWN0b3JbM10gPSBhZGRyID4+IDg7CisJdmVjdG9yWzRdID0gYWRkciA+PiAxNjsKKwl2ZWN0b3JbNV0gPSBhZGRyID4+IDI0OworCXZlY3Rvcls2XSA9IDB4Y2I7CisJdmVjdG9yWzddID0gMHhjYjsKKworCW1uMTAzMDBfZGNhY2hlX2ZsdXNoX2ludigpOworCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZykgdmVjdG9yLCAodW5zaWduZWQgbG9uZykgdmVjdG9yICsgOCk7Cit9CisKKy8qCisgKiBpbml0aWFsaXNlIHRoZSBleGNlcHRpb24gdGFibGUKKyAqLwordm9pZCBfX2luaXQgdHJhcF9pbml0KHZvaWQpCit7CisJc2V0X2V4Y3BfdmVjdG9yKEVYQ0VQX1RSQVAsCQl0cmFwKTsKKwlzZXRfZXhjcF92ZWN0b3IoRVhDRVBfSVNURVAsCQlpc3RlcCk7CisJc2V0X2V4Y3BfdmVjdG9yKEVYQ0VQX0lCUkVBSywJCWlicmVhayk7CisJc2V0X2V4Y3BfdmVjdG9yKEVYQ0VQX09CUkVBSywJCW9icmVhayk7CisKKwlzZXRfZXhjcF92ZWN0b3IoRVhDRVBfUFJJVklOUywJCXByaXZfb3ApOworCXNldF9leGNwX3ZlY3RvcihFWENFUF9VTklNUElOUywJCWludmFsaWRfb3ApOworCXNldF9leGNwX3ZlY3RvcihFWENFUF9VTklNUEVYSU5TLAlpbnZhbGlkX2V4b3ApOworCXNldF9leGNwX3ZlY3RvcihFWENFUF9NRU1FUlIsCQltZW1fZXJyb3IpOworCXNldF9leGNwX3ZlY3RvcihFWENFUF9NSVNBTElHTiwJCW1pc2FsaWdubWVudCk7CisJc2V0X2V4Y3BfdmVjdG9yKEVYQ0VQX0JVU0VSUk9SLAkJYnVzX2Vycm9yKTsKKwlzZXRfZXhjcF92ZWN0b3IoRVhDRVBfSUxMSU5TQUNDLAlpbnNuX2FjY19lcnJvcik7CisJc2V0X2V4Y3BfdmVjdG9yKEVYQ0VQX0lMTERBVEFDQywJZGF0YV9hY2NfZXJyb3IpOworCXNldF9leGNwX3ZlY3RvcihFWENFUF9JT0lOU0FDQywJCWluc25fYWNjX2Vycm9yKTsKKwlzZXRfZXhjcF92ZWN0b3IoRVhDRVBfUFJJVklOU0FDQywJaW5zbl9hY2NfZXJyb3IpOworCXNldF9leGNwX3ZlY3RvcihFWENFUF9QUklWREFUQUNDLAlkYXRhX2FjY19lcnJvcik7CisJc2V0X2V4Y3BfdmVjdG9yKEVYQ0VQX0RBVElOU0FDQywJaW5zbl9hY2NfZXJyb3IpOworCXNldF9leGNwX3ZlY3RvcihFWENFUF9GUFVfRElTQUJMRUQsCWZwdV9kaXNhYmxlZCk7CisJc2V0X2V4Y3BfdmVjdG9yKEVYQ0VQX0ZQVV9VTklNUElOUywJZnB1X2ludmFsaWRfb3ApOworCXNldF9leGNwX3ZlY3RvcihFWENFUF9GUFVfT1BFUkFUSU9OLAlmcHVfZXhjZXB0aW9uKTsKKworCXNldF9leGNwX3ZlY3RvcihFWENFUF9OTUksCQlubWkpOworCisJc2V0X2V4Y3BfdmVjdG9yKEVYQ0VQX1NZU0NBTEwxLAkJdW5zdXBwb3J0ZWRfc3lzY2FsbCk7CisJc2V0X2V4Y3BfdmVjdG9yKEVYQ0VQX1NZU0NBTEwyLAkJdW5zdXBwb3J0ZWRfc3lzY2FsbCk7CisJc2V0X2V4Y3BfdmVjdG9yKEVYQ0VQX1NZU0NBTEwzLAkJdW5zdXBwb3J0ZWRfc3lzY2FsbCk7CisJc2V0X2V4Y3BfdmVjdG9yKEVYQ0VQX1NZU0NBTEw0LAkJdW5zdXBwb3J0ZWRfc3lzY2FsbCk7CisJc2V0X2V4Y3BfdmVjdG9yKEVYQ0VQX1NZU0NBTEw1LAkJdW5zdXBwb3J0ZWRfc3lzY2FsbCk7CisJc2V0X2V4Y3BfdmVjdG9yKEVYQ0VQX1NZU0NBTEw2LAkJdW5zdXBwb3J0ZWRfc3lzY2FsbCk7CisJc2V0X2V4Y3BfdmVjdG9yKEVYQ0VQX1NZU0NBTEw3LAkJdW5zdXBwb3J0ZWRfc3lzY2FsbCk7CisJc2V0X2V4Y3BfdmVjdG9yKEVYQ0VQX1NZU0NBTEw4LAkJdW5zdXBwb3J0ZWRfc3lzY2FsbCk7CisJc2V0X2V4Y3BfdmVjdG9yKEVYQ0VQX1NZU0NBTEw5LAkJdW5zdXBwb3J0ZWRfc3lzY2FsbCk7CisJc2V0X2V4Y3BfdmVjdG9yKEVYQ0VQX1NZU0NBTEwxMCwJdW5zdXBwb3J0ZWRfc3lzY2FsbCk7CisJc2V0X2V4Y3BfdmVjdG9yKEVYQ0VQX1NZU0NBTEwxMSwJdW5zdXBwb3J0ZWRfc3lzY2FsbCk7CisJc2V0X2V4Y3BfdmVjdG9yKEVYQ0VQX1NZU0NBTEwxMiwJdW5zdXBwb3J0ZWRfc3lzY2FsbCk7CisJc2V0X2V4Y3BfdmVjdG9yKEVYQ0VQX1NZU0NBTEwxMywJdW5zdXBwb3J0ZWRfc3lzY2FsbCk7CisJc2V0X2V4Y3BfdmVjdG9yKEVYQ0VQX1NZU0NBTEwxNCwJdW5zdXBwb3J0ZWRfc3lzY2FsbCk7CisJc2V0X2V4Y3BfdmVjdG9yKEVYQ0VQX1NZU0NBTEwxNSwJdW5zdXBwb3J0ZWRfc3lzY2FsbCk7Cit9CisKKy8qCisgKiBkZXRlcm1pbmUgaWYgYSBwcm9ncmFtIGNvdW50ZXIgdmFsdWUgaXMgYSB2YWxpZCBidWcgYWRkcmVzcworICovCitpbnQgaXNfdmFsaWRfYnVnYWRkcih1bnNpZ25lZCBsb25nIHBjKQoreworCXJldHVybiBwYyA+PSBQQUdFX09GRlNFVDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvdm1saW51eC5sZHMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2U4MGY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0wLDAgKzEsMTU5IEBACisvKiBNTjEwMzAwIE1haW4ga2VybmVsIGxpbmtlciBzY3JpcHQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNkZWZpbmUgX19WTUxJTlVYX0xEU19fCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaD4KKyNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItYW0zM2xpbiIsICJlbGYzMi1hbTMzbGluIiwgImVsZjMyLWFtMzNsaW4iKQorT1VUUFVUX0FSQ0gobW4xMDMwMCkKK0VOVFJZKF9zdGFydCkKK2ppZmZpZXMgPSBqaWZmaWVzXzY0OworI2lmbmRlZiBDT05GSUdfTU4xMDMwMF9DVVJSRU5UX0lOX0UyCitjdXJyZW50ID0gX19jdXJyZW50OworI2VuZGlmCitTRUNUSU9OUworeworICAuID0gQ09ORklHX0tFUk5FTF9URVhUX0FERFJFU1M7CisgIC8qIHJlYWQtb25seSAqLworICBfc3RleHQgPSAuOworICBfdGV4dCA9IC47CQkJLyogVGV4dCBhbmQgcmVhZC1vbmx5IGRhdGEgKi8KKyAgLnRleHQgOiB7CisJKigKKwkudGV4dC5oZWFkCisJLnRleHQKKwkpCisJVEVYVF9URVhUCisJU0NIRURfVEVYVAorCUxPQ0tfVEVYVAorCUtQUk9CRVNfVEVYVAorCSooLmZpeHVwKQorCSooLmdudS53YXJuaW5nKQorCX0gPSAweGNiCisKKyAgX2V0ZXh0ID0gLjsJCQkvKiBFbmQgb2YgdGV4dCBzZWN0aW9uICovCisKKyAgLiA9IEFMSUdOKDE2KTsJCS8qIEV4Y2VwdGlvbiB0YWJsZSAqLworICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOworICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KKyAgX19zdG9wX19fZXhfdGFibGUgPSAuOworCisgIEJVR19UQUJMRQorCisgIFJPREFUQQorCisgIC8qIHdyaXRlYWJsZSAqLworICAuZGF0YSA6IHsJCQkvKiBEYXRhICovCisJREFUQV9EQVRBCisJQ09OU1RSVUNUT1JTCisJfQorCisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19ub3NhdmVfYmVnaW4gPSAuOworICAuZGF0YV9ub3NhdmUgOiB7ICooLmRhdGEubm9zYXZlKSB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19ub3NhdmVfZW5kID0gLjsKKworICAuID0gQUxJR04oNDA5Nik7CisgIC5kYXRhLnBhZ2VfYWxpZ25lZCA6IHsgKiguZGF0YS5pZHQpIH0KKworICAuID0gQUxJR04oMzIpOworICAuZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCA6IHsgKiguZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCkgfQorCisgIC8qIHJhcmVseSBjaGFuZ2VkIGRhdGEgbGlrZSBjcHUgbWFwcyAqLworICAuID0gQUxJR04oMzIpOworICAuZGF0YS5yZWFkX21vc3RseSA6IEFUKEFERFIoLmRhdGEucmVhZF9tb3N0bHkpKSB7CisJKiguZGF0YS5yZWFkX21vc3RseSkKKwlfZWRhdGEgPSAuOwkJLyogRW5kIG9mIGRhdGEgc2VjdGlvbiAqLworICB9CisKKyAgLiA9IEFMSUdOKFRIUkVBRF9TSVpFKTsJLyogaW5pdF90YXNrICovCisgIC5kYXRhLmluaXRfdGFzayA6IHsgKiguZGF0YS5pbml0X3Rhc2spIH0KKworICAvKiBtaWdodCBnZXQgZnJlZWQgYWZ0ZXIgaW5pdCAqLworICAuID0gQUxJR04oNDA5Nik7CisgIC5zbXBfbG9ja3MgOiBBVChBRERSKC5zbXBfbG9ja3MpIC0gTE9BRF9PRkZTRVQpIHsKKyAgCV9fc21wX2xvY2tzID0gLjsKKwkqKC5zbXBfbG9ja3MpCisJX19zbXBfbG9ja3NfZW5kID0gLjsKKyAgfQorCisgIC8qIHdpbGwgYmUgZnJlZWQgYWZ0ZXIgaW5pdCAqLworICAuID0gQUxJR04oNDA5Nik7CQkvKiBJbml0IGNvZGUgYW5kIGRhdGEgKi8KKyAgX19pbml0X2JlZ2luID0gLjsKKyAgLmluaXQudGV4dCA6IHsKKwlfc2luaXR0ZXh0ID0gLjsKKwkqKC5pbml0LnRleHQpCisJX2Vpbml0dGV4dCA9IC47CisgIH0KKyAgLmluaXQuZGF0YSA6IHsgKiguaW5pdC5kYXRhKSB9CisgIC4gPSBBTElHTigxNik7CisgIF9fc2V0dXBfc3RhcnQgPSAuOworICAuc2V0dXAuaW5pdCA6IHsgS0VFUCgqKC5pbml0LnNldHVwKSkgfQorICBfX3NldHVwX2VuZCA9IC47CisKKyAgX19pbml0Y2FsbF9zdGFydCA9IC47CisgIC5pbml0Y2FsbC5pbml0IDogeworCUlOSVRDQUxMUworICB9CisgIF9faW5pdGNhbGxfZW5kID0gLjsKKyAgX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOworICAuY29uX2luaXRjYWxsLmluaXQgOiB7ICooLmNvbl9pbml0Y2FsbC5pbml0KSB9CisgIF9fY29uX2luaXRjYWxsX2VuZCA9IC47CisKKyAgU0VDVVJJVFlfSU5JVAorICAuID0gQUxJR04oNCk7CisgIF9fYWx0X2luc3RydWN0aW9ucyA9IC47CisgIC5hbHRpbnN0cnVjdGlvbnMgOiB7ICooLmFsdGluc3RydWN0aW9ucykgfQorICBfX2FsdF9pbnN0cnVjdGlvbnNfZW5kID0gLjsKKyAuYWx0aW5zdHJfcmVwbGFjZW1lbnQgOiB7ICooLmFsdGluc3RyX3JlcGxhY2VtZW50KSB9CisgIC8qIC5leGl0LnRleHQgaXMgZGlzY2FyZCBhdCBydW50aW1lLCBub3QgbGluayB0aW1lLCB0byBkZWFsIHdpdGggcmVmZXJlbmNlcworICAgICBmcm9tIC5hbHRpbnN0cnVjdGlvbnMgYW5kIC5laF9mcmFtZSAqLworICAuZXhpdC50ZXh0IDogeyAqKC5leGl0LnRleHQpIH0KKyAgLmV4aXQuZGF0YSA6IHsgKiguZXhpdC5kYXRhKSB9CisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRyYW1mc19zdGFydCA9IC47CisgIC5pbml0LnJhbWZzIDogeyAqKC5pbml0LnJhbWZzKSB9CisgIF9faW5pdHJhbWZzX2VuZCA9IC47CisjZW5kaWYKKworICAuID0gQUxJR04oMzIpOworICBfX3Blcl9jcHVfc3RhcnQgPSAuOworICAuZGF0YS5wZXJjcHUgIDogeyAqKC5kYXRhLnBlcmNwdSkgfQorICBfX3Blcl9jcHVfZW5kID0gLjsKKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfZW5kID0gLjsKKyAgLyogZnJlZWQgYWZ0ZXIgaW5pdCBlbmRzIGhlcmUgKi8KKworICBfX2Jzc19zdGFydCA9IC47CQkvKiBCU1MgKi8KKyAgLmJzcyA6IHsKKwkqKC5ic3MucGFnZV9hbGlnbmVkKQorCSooLmJzcykKKyAgfQorICAuID0gQUxJR04oNCk7CisgIF9fYnNzX3N0b3AgPSAuOworCisgIF9lbmQgPSAuIDsKKworICAvKiBUaGlzIGlzIHdoZXJlIHRoZSBrZXJuZWwgY3JlYXRlcyB0aGUgZWFybHkgYm9vdCBwYWdlIHRhYmxlcyAqLworICAuID0gQUxJR04oNDA5Nik7CisgIHBnMCA9IC47CisKKyAgLyogU2VjdGlvbnMgdG8gYmUgZGlzY2FyZGVkICovCisgIC9ESVNDQVJELyA6IHsKKwkqKC5leGl0Y2FsbC5leGl0KQorCX0KKworICBTVEFCU19ERUJVRworCisgIERXQVJGX0RFQlVHCit9CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvbGliL01ha2VmaWxlIGIvYXJjaC9tbjEwMzAwL2xpYi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGZhOWVjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL2xpYi9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBNTjEwMzAwLXNwZWNpZmljIGxpYnJhcnkgZmlsZXMuLgorIworCitsaWIteSA9IGRlbGF5Lm8gdXNlcmNvcHkubyBjaGVja3N1bS5vIGJpdG9wcy5vIG1lbWNweS5vIG1lbW1vdmUubyBtZW1zZXQubworbGliLXkgKz0gZG9fY3N1bS5vCitsaWIteSArPSBfX2FzaGxkaTMubyBfX2FzaHJkaTMubyBfX2xzaHJkaTMubyBuZWdkaTIubwpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2xpYi9fX2FzaGxkaTMuUyBiL2FyY2gvbW4xMDMwMC9saWIvX19hc2hsZGkzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUxYTk1MDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAvbGliL19fYXNobGRpMy5TCkBAIC0wLDAgKzEsNTEgQEAKKy8qIE1OMTAzMDAgNjQtYml0IGFyaXRobWV0aWMgbGVmdCBzaGlmdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorCisgICAgICAgIC50ZXh0CisgICAgICAgIC5iYWxpZ24JTDFfQ0FDSEVfQllURVMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB1bnNpZ25lZCBsb25nIGxvbmcgX19hc2hsZGkzKHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSBbRDE6RDBdLAorIwkJCSAgICAgICB1bnNpZ25lZCBieSBbKDEyLFNQKV0pCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgICAgIC5nbG9ibAlfX2FzaGxkaTMKKyAgICAgICAgLnR5cGUJX19hc2hsZGkzLEBmdW5jdGlvbgorX19hc2hsZGkzOgorCW1vdgkoMTIsc3ApLGEwCisJYW5kCSs2MyxhMAorCWJlcQlfX2FzaGxkaTNfemVybworCisJY21wCSszMSxhMAorCWJoaQlfX2FzaGxkaTNfMzJwbHVzCisKKwkjIHRoZSBjb3VudCBpcyBpbiB0aGUgcmFuZ2UgMS0zMQorCWFzbAlhMCxkMQorCisJbW92CSszMixhMQorCXN1YglhMCxhMSxhMQkJCSMgYTEgPSAzMiAtIGNvdW50CisJbHNyCWExLGQwLGExCQkJIyBnZXQgb3ZlcmZsb3cgZnJvbSBMU1cgLT4gTVNXCisKKwlvcl9hc2wJYTEsZDEsYTAsZDAJCQkjIGluc2VydCBvdmVyZmxvdyBpbnRvIE1TVyBhbmQKKwkJCQkJCSMgc2hpZnQgdGhlIExTVworCXJldHMKKworCS5iYWxpZ24JTDFfQ0FDSEVfQllURVMKKwkjIHRoZSBjb3VudCBpcyBpbiB0aGUgcmFuZ2UgMzItNjMKK19fYXNobGRpM18zMnBsdXM6CisJYXNsCWEwLGQwLGQxCisJY2xyCWQwCitfX2FzaGxkaTNfemVybzoKKwlyZXRzCisKKwkuc2l6ZQlfX2FzaGxkaTMsIC4tX19hc2hsZGkzCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvbGliL19fYXNocmRpMy5TIGIvYXJjaC9tbjEwMzAwL2xpYi9fX2FzaHJkaTMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjQyMzgyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL2xpYi9fX2FzaHJkaTMuUwpAQCAtMCwwICsxLDUyIEBACisvKiBNTjEwMzAwIDY0LWJpdCBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgLmJhbGlnbglMMV9DQUNIRV9CWVRFUworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2FzaHJkaTModW5zaWduZWQgbG9uZyBsb25nIHZhbHVlIFtEMTpEMF0sCisjCQkJICAgICAgIHVuc2lnbmVkIGJ5IFsoMTIsU1ApXSkKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgLmdsb2JsCV9fYXNocmRpMworICAgICAgICAudHlwZQlfX2FzaHJkaTMsQGZ1bmN0aW9uCitfX2FzaHJkaTM6CisJbW92CSgxMixzcCksYTAKKwlhbmQJKzYzLGEwCisJYmVxCV9fYXNocmRpM196ZXJvCisKKwljbXAJKzMxLGEwCisJYmhpCV9fYXNocmRpM18zMnBsdXMKKworCSMgdGhlIGNvdW50IGlzIGluIHRoZSByYW5nZSAxLTMxCisJbHNyCWEwLGQwCisKKwltb3YJKzMyLGExCisJc3ViCWEwLGExLGExCQkJIyBhMSA9IDMyIC0gY291bnQKKwlhc2wJYTEsZDEsYTEJCQkjIGdldCB1bmRlcmZsb3cgZnJvbSBNU1cgLT4gTFNXCisKKwlvcl9hc3IJYTEsZDAsYTAsZDEJCQkjIGluc2VydCB1bmRlcmZsb3cgaW50byBMU1cgYW5kCisJCQkJCQkjIHNoaWZ0IHRoZSBNU1cKKwlyZXRzCisKKwkuYmFsaWduCUwxX0NBQ0hFX0JZVEVTCisJIyB0aGUgY291bnQgaXMgaW4gdGhlIHJhbmdlIDMyLTYzCitfX2FzaHJkaTNfMzJwbHVzOgorCWFzcglhMCxkMSxkMAorCWV4dAlkMAkJCQkjIHNpZ24tZXh0ZW5kIHJlc3VsdCB0aHJvdWdoIE1EUgorCW1vdgltZHIsZDEKK19fYXNocmRpM196ZXJvOgorCXJldHMKKworCS5zaXplCV9fYXNocmRpMywgLi1fX2FzaHJkaTMKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9saWIvX19sc2hyZGkzLlMgYi9hcmNoL21uMTAzMDAvbGliL19fbHNocmRpMy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ODZhZWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAvbGliL19fbHNocmRpMy5TCkBAIC0wLDAgKzEsNTIgQEAKKy8qIE1OMTAzMDAgNjQtYml0IGxvZ2ljYWwgcmlnaHQgc2hpZnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorCisgICAgICAgIC50ZXh0CisgICAgICAgIC5iYWxpZ24JTDFfQ0FDSEVfQllURVMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB1bnNpZ25lZCBsb25nIGxvbmcgX19sc2hyZGkzKHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSBbRDE6RDBdLAorIwkJCSAgICAgICB1bnNpZ25lZCBieSBbKDEyLFNQKV0pCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgICAgIC5nbG9ibAlfX2xzaHJkaTMKKyAgICAgICAgLnR5cGUJX19sc2hyZGkzLEBmdW5jdGlvbgorX19sc2hyZGkzOgorCW1vdgkoMTIsc3ApLGEwCisJYW5kCSs2MyxhMAorCWJlcQlfX2xzaHJkaTNfemVybworCisJY21wCSszMSxhMAorCWJoaQlfX2xzaHJkaTNfMzJwbHVzCisKKwkjIHRoZSBjb3VudCBpcyBpbiB0aGUgcmFuZ2UgMS0zMQorCWxzcglhMCxkMAorCisJbW92CSszMixhMQorCXN1YglhMCxhMSxhMQkJCSMgYTEgPSAzMiAtIGNvdW50CisJYXNsCWExLGQxLGExCQkJIyBnZXQgdW5kZXJmbG93IGZyb20gTVNXIC0+IExTVworCisJb3JfbHNyCWExLGQwLGEwLGQxCQkJIyBpbnNlcnQgdW5kZXJmbG93IGludG8gTFNXIGFuZAorCQkJCQkJIyBzaGlmdCB0aGUgTVNXCisJcmV0cworCisJLmJhbGlnbglMMV9DQUNIRV9CWVRFUworCSMgdGhlIGNvdW50IGlzIGluIHRoZSByYW5nZSAzMi02MworX19sc2hyZGkzXzMycGx1czoKKwlsc3IJYTAsZDEsZDAKKwljbHIJZDEKK19fbHNocmRpM196ZXJvOgorCXJldHMKKworCS5zaXplCV9fbHNocmRpMywgLi1fX2xzaHJkaTMKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9saWIvYXNocmRpMy5jIGIvYXJjaC9tbjEwMzAwL2xpYi9hc2hyZGkzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU0ZjYxZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9saWIvYXNocmRpMy5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qIGFzaHJkaTMuYyBleHRyYWN0ZWQgZnJvbSBnY2MtMi43LjIvbGliZ2NjMi5jIHdoaWNoIGlzOiAqLworLyogQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ0MuCisKK0dOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorYW55IGxhdGVyIHZlcnNpb24uCisKK0dOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCithbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCitCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNkZWZpbmUgQklUU19QRVJfVU5JVCA4CisKK3R5cGVkZWYgCSBpbnQgU0l0eXBlCV9fYXR0cmlidXRlX18oKG1vZGUoU0kpKSk7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBVU0l0eXBlCV9fYXR0cmlidXRlX18oKG1vZGUoU0kpKSk7Cit0eXBlZGVmCQkgaW50IERJdHlwZQlfX2F0dHJpYnV0ZV9fKChtb2RlKERJKSkpOwordHlwZWRlZgkJIGludCB3b3JkX3R5cGUJX19hdHRyaWJ1dGVfXygobW9kZShfX3dvcmRfXykpKTsKKworc3RydWN0IERJc3RydWN0IHsKKwlTSXR5cGUgbG93OworCVNJdHlwZSBoaWdoOworfTsKKwordW5pb24gREl1bmlvbiB7CisJc3RydWN0IERJc3RydWN0CXM7CisJREl0eXBlCQlsbDsKK307CisKK0RJdHlwZSBfX2FzaHJkaTMoREl0eXBlIHUsIHdvcmRfdHlwZSBiKQoreworCXVuaW9uIERJdW5pb24gdzsKKwl1bmlvbiBESXVuaW9uIHV1OworCXdvcmRfdHlwZSBibTsKKworCWlmIChiID09IDApCisJCXJldHVybiB1OworCisJdXUubGwgPSB1OworCisJYm0gPSAoc2l6ZW9mKFNJdHlwZSkgKiBCSVRTX1BFUl9VTklUKSAtIGI7CisJaWYgKGJtIDw9IDApIHsKKwkJLyogdy5zLmhpZ2ggPSAxLi4xIG9yIDAuLjAgKi8KKwkJdy5zLmhpZ2ggPSB1dS5zLmhpZ2ggPj4gKHNpemVvZihTSXR5cGUpICogQklUU19QRVJfVU5JVCAtIDEpOworCQl3LnMubG93ID0gdXUucy5oaWdoID4+IC1ibTsKKwl9IGVsc2UgeworCQlVU0l0eXBlIGNhcnJpZXMgPSAoVVNJdHlwZSl1dS5zLmhpZ2ggPDwgYm07CisJCXcucy5oaWdoID0gdXUucy5oaWdoID4+IGI7CisJCXcucy5sb3cgPSAoKFVTSXR5cGUpdXUucy5sb3cgPj4gYikgfCBjYXJyaWVzOworCX0KKworCXJldHVybiB3LmxsOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2xpYi9iaXRvcHMuYyBiL2FyY2gvbW4xMDMwMC9saWIvYml0b3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQwYTdkYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9saWIvYml0b3BzLmMKQEAgLTAsMCArMSw1MSBAQAorLyogTU4xMDMwMCBOb24tdHJpdmlhbCBiaXQgb3BlcmF0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKy8qCisgKiB0cnkgZmxpcHBpbmcgYSBiaXQgdXNpbmcgQlNFVCBhbmQgQkNMUgorICovCit2b2lkIGNoYW5nZV9iaXQoaW50IG5yLCB2b2xhdGlsZSB2b2lkICphZGRyKQoreworCWlmICh0ZXN0X2JpdChuciwgYWRkcikpCisJCWdvdG8gdHJ5X2NsZWFyX2JpdDsKKwordHJ5X3NldF9iaXQ6CisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KG5yLCBhZGRyKSkKKwkJcmV0dXJuOworCit0cnlfY2xlYXJfYml0OgorCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQobnIsIGFkZHIpKQorCQlyZXR1cm47CisKKwlnb3RvIHRyeV9zZXRfYml0OworfQorCisvKgorICogdHJ5IGZsaXBwaW5nIGEgYml0IHVzaW5nIEJTRVQgYW5kIEJDTFIgYW5kIHJldHVybmluZyB0aGUgb2xkIHZhbHVlCisgKi8KK2ludCB0ZXN0X2FuZF9jaGFuZ2VfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqYWRkcikKK3sKKwlpZiAodGVzdF9iaXQobnIsIGFkZHIpKQorCQlnb3RvIHRyeV9jbGVhcl9iaXQ7CisKK3RyeV9zZXRfYml0OgorCWlmICghdGVzdF9hbmRfc2V0X2JpdChuciwgYWRkcikpCisJCXJldHVybiAwOworCit0cnlfY2xlYXJfYml0OgorCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQobnIsIGFkZHIpKQorCQlyZXR1cm4gMTsKKworCWdvdG8gdHJ5X3NldF9iaXQ7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvbGliL2NoZWNrc3VtLmMgYi9hcmNoL21uMTAzMDAvbGliL2NoZWNrc3VtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc0ZjI5ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9saWIvY2hlY2tzdW0uYwpAQCAtMCwwICsxLDk5IEBACisvKiBNTjEwMzAwIE9wdGltaXNlZCBjaGVja3N1bW1pbmcgd3JhcHBlcnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWF0c3VzaGl0YSBFbGVjdHJpYyBJbmR1c3RyaWFsIENvLiwgTHRkLgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGZyb20zMnRvMTYoX193c3VtIHN1bSkKK3sKKwlhc20oIglhZGQJJTEsJTAJCVxuIgorCSAgICAiCWFkZGMJMHhmZmZmLCUwCVxuIgorCSAgICA6ICI9ciIgKHN1bSkKKwkgICAgOiAiciIgKHN1bSA8PCAxNiksICIwIiAoc3VtICYgMHhmZmZmMDAwMCkKKwkgICAgKTsKKwlyZXR1cm4gc3VtID4+IDE2OworfQorCitfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCit7CisJcmV0dXJuIH5kb19jc3VtKGlwaCwgaWhsICogNCk7Cit9CitFWFBPUlRfU1lNQk9MKGlwX2Zhc3RfY3N1bSk7CisKK19fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSkKK3sKKwlfX3dzdW0gcmVzdWx0OworCisJcmVzdWx0ID0gZG9fY3N1bShidWZmLCBsZW4pOworCXJlc3VsdCArPSBzdW07CisJaWYgKHN1bSA+IHJlc3VsdCkKKwkJcmVzdWx0Kys7CisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsKTsKKworX19zdW0xNiBpcF9jb21wdXRlX2NzdW0oY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbikKK3sKKwlyZXR1cm4gfmZyb20zMnRvMTYoZG9fY3N1bShidWZmLCBsZW4pKTsKK30KK0VYUE9SVF9TWU1CT0woaXBfY29tcHV0ZV9jc3VtKTsKKworX193c3VtIGNzdW1fcGFydGlhbF9jb3B5KGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLCBfX3dzdW0gc3VtKQoreworCWNvcHlfZnJvbV91c2VyKGRzdCwgc3JjLCBsZW4pOworCXJldHVybiBjc3VtX3BhcnRpYWwoZHN0LCBsZW4sIHN1bSk7Cit9CitFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbF9jb3B5KTsKKworX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsCisJCQkJIGludCBsZW4sIF9fd3N1bSBzdW0pCit7CisJc3VtID0gY3N1bV9wYXJ0aWFsKHNyYywgbGVuLCBzdW0pOworCW1lbWNweShkc3QsIHNyYywgbGVuKTsKKwlyZXR1cm4gc3VtOworfQorRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKTsKKworX193c3VtIGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwKKwkJCQkgICBpbnQgbGVuLCBfX3dzdW0gc3VtLAorCQkJCSAgIGludCAqZXJyX3B0cikKK3sKKwlpbnQgbWlzc2luZzsKKworCW1pc3NpbmcgPSBjb3B5X2Zyb21fdXNlcihkc3QsIHNyYywgbGVuKTsKKwlpZiAobWlzc2luZykgeworCQltZW1zZXQoZHN0ICsgbGVuIC0gbWlzc2luZywgMCwgbWlzc2luZyk7CisJCSplcnJfcHRyID0gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gY3N1bV9wYXJ0aWFsKGRzdCwgbGVuLCBzdW0pOworfQorRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIpOworCitfX3dzdW0gY3N1bV9hbmRfY29weV90b191c2VyKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorCQkJICAgICBpbnQgbGVuLCBfX3dzdW0gc3VtLAorCQkJICAgICBpbnQgKmVycl9wdHIpCit7CisJaW50IG1pc3Npbmc7CisKKwltaXNzaW5nID0gY29weV90b191c2VyKGRzdCwgc3JjLCBsZW4pOworCWlmIChtaXNzaW5nKSB7CisJCW1lbXNldChkc3QgKyBsZW4gLSBtaXNzaW5nLCAwLCBtaXNzaW5nKTsKKwkJKmVycl9wdHIgPSAtRUZBVUxUOworCX0KKworCXJldHVybiBjc3VtX3BhcnRpYWwoc3JjLCBsZW4sIHN1bSk7Cit9CitFWFBPUlRfU1lNQk9MKGNzdW1fYW5kX2NvcHlfdG9fdXNlcik7CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvbGliL2RlbGF5LmMgYi9hcmNoL21uMTAzMDAvbGliL2RlbGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NlNjZiYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9saWIvZGVsYXkuYwpAQCAtMCwwICsxLDUwIEBACisvKiBNTjEwMzAwIFNob3J0IGRlbGF5IGludGVycG9sYXRpb24gcm91dGluZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisKKy8qCisgKiBiYXNpYyBkZWxheSBsb29wCisgKi8KK3ZvaWQgX19kZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKQoreworCWludCBkMDsKKworCWFzbSB2b2xhdGlsZSgKKwkJIglicmEJMWYJXG4iCisJCSIJLmFsaWduCTQJXG4iCisJCSIxOglicmEJMmYJXG4iCisJCSIJLmFsaWduCTQJXG4iCisJCSIyOglhZGQJLTEsJTAJXG4iCisJCSIJYm5lCTJiCVxuIgorCQk6ICI9JmQiIChkMCkKKwkJOiAiMCIgKGxvb3BzKSk7Cit9CitFWFBPUlRfU1lNQk9MKF9fZGVsYXkpOworCisvKgorICogaGFuZGxlIGEgZGVsYXkgc3BlY2lmaWVkIGluIHRlcm1zIG9mIG1pY3Jvc2Vjb25kcworICovCit2b2lkIF9fdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpCit7CisJc2lnbmVkIGxvbmcgaW9jbGssIHN0b3A7CisKKwkvKiB1c2VjcyAqIENMSyAvIDFFNiAqLworCXN0b3AgPSBfX211bGRpdjY0dSh1c2VjcywgTU4xMDMwMF9UU0NDTEssIDEwMDAwMDApOworCXN0b3AgPSBUTVRTQ0JDIC0gc3RvcDsKKworCWRvIHsKKwkJaW9jbGsgPSBUTVRTQ0JDOworCX0gd2hpbGUgKHN0b3AgPCBpb2Nsayk7Cit9CitFWFBPUlRfU1lNQk9MKF9fdWRlbGF5KTsKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9saWIvZG9fY3N1bS5TIGIvYXJjaC9tbjEwMzAwL2xpYi9kb19jc3VtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzODk5NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9saWIvZG9fY3N1bS5TCkBAIC0wLDAgKzEsMTYyIEBACisvKiBPcHRpbWlzZWQgc2ltcGxlIG1lbW9yeSBjaGVja3N1bQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorCisgICAgICAgIC5zZWN0aW9uIC50ZXh0CisgICAgICAgIC5iYWxpZ24JTDFfQ0FDSEVfQllURVMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB1bnNpZ25lZCBpbnQgZG9fY3N1bShjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmLCBzaXplX3QgbGVuKQorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCS5nbG9ibAlkb19jc3VtCisgICAgICAgIC50eXBlCWRvX2NzdW0sQGZ1bmN0aW9uCitkb19jc3VtOgorCW1vdm0JW2QyLGQzXSwoc3ApCisJbW92CWQwLCgxMixzcCkKKwltb3YJZDEsKDE2LHNwKQorCW1vdglkMSxkMgkJCQkjIGNvdW50CisJbW92CWQwLGEwCQkJCSMgYnVmZgorCWNscglkMQkJCQkjIGFjY3VtdWxhdG9yCisKKwljbXAJKzAsZDIKKwliZXEJZG9fY3N1bV9kb25lCQkJIyByZXR1cm4gaWYgemVyby1sZW5ndGggYnVmZmVyCisKKwkjIDQtYnl0ZSBhbGlnbiB0aGUgYnVmZmVyIHBvaW50ZXIKKwlidHN0CSszLGEwCisJYmVxCWRvX2NzdW1fbm93XzRiX2FsaWduZWQKKworCWJ0c3QJKzEsYTAKKwliZXEJZG9fY3N1bV9hZGRyX25vdF9vZGQKKwltb3ZidQkoYTApLGQwCisJaW5jCWEwCisJYXNsCSs4LGQwCisJYWRkCWQwLGQxCisJYWRkYwkrMCxkMQorCWFkZAktMSxkMgorZG9fY3N1bV9hZGRyX25vdF9vZGQ6CisKKwljbXAJKzIsZDIKKwliY3MJZG9fY3N1bV9mZXdlcl90aGFuXzQKKwlidHN0CSsyLGEwCisJYmVxCWRvX2NzdW1fbm93XzRiX2FsaWduZWQKKwltb3ZodQkoYTArKSxkMAorCWFkZAlkMCxkMQorCWFkZGMJKzAsZDEKKwlhZGQJLTIsZDIKKwljbXAJKzQsZDIKKwliY3MJZG9fY3N1bV9mZXdlcl90aGFuXzQKKworZG9fY3N1bV9ub3dfNGJfYWxpZ25lZDoKKwkjIHdlIHdhbnQgdG8gY2hlY2tzdW0gYXMgbXVjaCBhcyB3ZSBjYW4gaW4gY2h1bmtzIG9mIDMyIGJ5dGVzCisJY21wCSszMSxkMgorCWJscwlkb19jc3VtX3JlbWFpbmRlcgkJIyA0LWJ5dGUgYWxpZ25lZCByZW1haW5kZXIKKworCWFkZAktMzIsZDIKKwltb3YJKzMyLGQzCisKK2RvX2NzdW1fbG9vcDoKKwltb3YJKGEwKyksZDAKKwlhZGQJZDAsZDEKKwltb3YJKGEwKyksZTAKKwlhZGRjCWUwLGQxCisJbW92CShhMCspLGUxCisJYWRkYwllMSxkMQorCW1vdgkoYTArKSxlMworCWFkZGMJZTMsZDEKKwltb3YJKGEwKyksZDAKKwlhZGRjCWQwLGQxCisJbW92CShhMCspLGUwCisJYWRkYwllMCxkMQorCW1vdgkoYTArKSxlMQorCWFkZGMJZTEsZDEKKwltb3YJKGEwKyksZTMKKwlhZGRjCWUzLGQxCisJYWRkYwkrMCxkMQorCisJc3ViCWQzLGQyCisJYmNjCWRvX2NzdW1fbG9vcAorCisJYWRkCWQzLGQyCisJYmVxCWRvX2NzdW1fZG9uZQorCitkb19jc3VtX3JlbWFpbmRlcjoKKwkjIGN1dCAxNi0zMSBieXRlcyBkb3duIHRvIDAtMTUKKwljbXAJKzE2LGQyCisJYmNzCWRvX2NzdW1fZmV3ZXJfdGhhbl8xNgorCW1vdgkoYTArKSxkMAorCWFkZAlkMCxkMQorCW1vdgkoYTArKSxlMAorCWFkZGMJZTAsZDEKKwltb3YJKGEwKyksZTEKKwlhZGRjCWUxLGQxCisJbW92CShhMCspLGUzCisJYWRkYwllMyxkMQorCWFkZGMJKzAsZDEKKwlhZGQJLTE2LGQyCisJYmVxCWRvX2NzdW1fZG9uZQorCitkb19jc3VtX2Zld2VyX3RoYW5fMTY6CisJIyBjb3B5IHRoZSByZW1haW5pbmcgd2hvbGUgd29yZHMKKwljbXAJKzQsZDIKKwliY3MJZG9fY3N1bV9mZXdlcl90aGFuXzQKKwljbXAJKzgsZDIKKwliY3MJZG9fY3N1bV9vbmVfd29yZAorCWNtcAkrMTIsZDIKKwliY3MJZG9fY3N1bV90d29fd29yZHMKKwltb3YJKGEwKyksZDAKKwlhZGQJZDAsZDEKKwlhZGRjCSswLGQxCitkb19jc3VtX3R3b193b3JkczoKKwltb3YJKGEwKyksZDAKKwlhZGQJZDAsZDEKKwlhZGRjCSswLGQxCitkb19jc3VtX29uZV93b3JkOgorCW1vdgkoYTArKSxkMAorCWFkZAlkMCxkMQorCWFkZGMJKzAsZDEKKworZG9fY3N1bV9mZXdlcl90aGFuXzQ6CisJYW5kCSszLGQyCisJYmVxCWRvX2NzdW1fZG9uZQorCXhvcl9jbXAJZDAsZDAsKzIsZDIKKwliY3MJZG9fY3N1bV9mZXdlcl90aGFuXzIKKwltb3ZodQkoYTArKSxkMAorZG9fY3N1bV9mZXdlcl90aGFuXzI6CisJYW5kCSsxLGQyCisJYmVxCWRvX2NzdW1fYWRkX2xhc3RfYml0CisJbW92YnUJKGEwKSxkMworCWFkZAlkMyxkMAorZG9fY3N1bV9hZGRfbGFzdF9iaXQ6CisJYWRkCWQwLGQxCisJYWRkYwkrMCxkMQorCitkb19jc3VtX2RvbmU6CisJIyBjb21wcmVzcyB0aGUgY2hlY2tzdW0gZG93biB0byAxNiBiaXRzCisJbW92CSsweGZmZmYwMDAwLGQyCisJYW5kCWQxLGQyCisJYXNsCSsxNixkMQorCWFkZAlkMixkMSxkMAorCWFkZGMJKzB4ZmZmZixkMAorCWxzcgkrMTYsZDAKKworCSMgZmxpcCB0aGUgaGFsdmVzIG9mIHRoZSB3b3JkIHJlc3VsdCBpZiB0aGUgYnVmZmVyIHdhcyBvZGRseSBhbGlnbmVkCisJbW92CSgxMixzcCksZDEKKwlhbmQJKzEsZDEKKwliZXEJZG9fY3N1bV9ub3Rfb2RkbHlfYWxpZ25lZAorCXN3YXBoCWQwLGQwCQkJCSMgZXhjaGFuZ2UgYml0cyAxNTo4IHdpdGggNzowCisKK2RvX2NzdW1fbm90X29kZGx5X2FsaWduZWQ6CisJcmV0CVtkMixkM10sOAorCitkb19jc3VtX2VuZDoKKwkuc2l6ZQlkb19jc3VtLCBkb19jc3VtX2VuZC1kb19jc3VtCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvbGliL2ludGVybmFsLmggYi9hcmNoL21uMTAzMDAvbGliL2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAxNGVlZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9saWIvaW50ZXJuYWwuaApAQCAtMCwwICsxLDE1IEBACisvKiBJbnRlcm5hbCBkZWZpbml0aW9ucyBmb3IgdGhlIGFyY2ggcGFydCBvZiB0aGUga2VybmVsIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworLyoKKyAqIGRvX2NzdW0uUworICovCitleHRlcm4gdW5zaWduZWQgaW50IGRvX2NzdW0oY29uc3QgdW5zaWduZWQgY2hhciAqLCBzaXplX3QpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2xpYi9sc2hyZGkzLmMgYi9hcmNoL21uMTAzMDAvbGliL2xzaHJkaTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDVlNjRlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL2xpYi9sc2hyZGkzLmMKQEAgLTAsMCArMSw2MCBAQAorLyogbHNocmRpMy5jIGV4dHJhY3RlZCBmcm9tIGdjYy0yLjcuMi9saWJnY2MyLmMgd2hpY2ggaXM6ICovCisvKiBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KKworR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKK2Fsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKK0Jvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworI2RlZmluZSBCSVRTX1BFUl9VTklUIDgKKwordHlwZWRlZiAJIGludCBTSXR5cGUJX19hdHRyaWJ1dGVfXygobW9kZShTSSkpKTsKK3R5cGVkZWYgdW5zaWduZWQgaW50IFVTSXR5cGUJX19hdHRyaWJ1dGVfXygobW9kZShTSSkpKTsKK3R5cGVkZWYJCSBpbnQgREl0eXBlCV9fYXR0cmlidXRlX18oKG1vZGUoREkpKSk7Cit0eXBlZGVmCQkgaW50IHdvcmRfdHlwZQlfX2F0dHJpYnV0ZV9fKChtb2RlKF9fd29yZF9fKSkpOworCitzdHJ1Y3QgRElzdHJ1Y3QgeworCVNJdHlwZQlsb3c7CisJU0l0eXBlCWhpZ2g7Cit9OworCit1bmlvbiBESXVuaW9uIHsKKwlzdHJ1Y3QgRElzdHJ1Y3QJczsKKwlESXR5cGUJCWxsOworfTsKKworREl0eXBlIF9fbHNocmRpMyhESXR5cGUgdSwgd29yZF90eXBlIGIpCit7CisJdW5pb24gREl1bmlvbiB3OworCXdvcmRfdHlwZSBibTsKKwl1bmlvbiBESXVuaW9uIHV1OworCisJaWYgKGIgPT0gMCkKKwkJcmV0dXJuIHU7CisKKwl1dS5sbCA9IHU7CisKKwlibSA9IChzaXplb2YoU0l0eXBlKSAqIEJJVFNfUEVSX1VOSVQpIC0gYjsKKwlpZiAoYm0gPD0gMCkgeworCQl3LnMuaGlnaCA9IDA7CisJCXcucy5sb3cgPSAoVVNJdHlwZSkgdXUucy5oaWdoID4+IC1ibTsKKwl9IGVsc2UgeworCQlVU0l0eXBlIGNhcnJpZXMgPSAoVVNJdHlwZSkgdXUucy5oaWdoIDw8IGJtOworCQl3LnMuaGlnaCA9IChVU0l0eXBlKSB1dS5zLmhpZ2ggPj4gYjsKKwkJdy5zLmxvdyA9ICgoVVNJdHlwZSkgdXUucy5sb3cgPj4gYikgfCBjYXJyaWVzOworCX0KKworCXJldHVybiB3LmxsOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2xpYi9tZW1jcHkuUyBiL2FyY2gvbW4xMDMwMC9saWIvbWVtY3B5LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVmYjliYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9saWIvbWVtY3B5LlMKQEAgLTAsMCArMSwxMzUgQEAKKy8qIE1OMTAzMDAgT3B0aW1pc2VkIHNpbXBsZSBtZW1vcnkgdG8gbWVtb3J5IGNvcHkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKworICAgICAgICAuc2VjdGlvbiAudGV4dAorICAgICAgICAuYmFsaWduCUwxX0NBQ0hFX0JZVEVTCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgdm9pZCAqbWVtY3B5KHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbikKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkuZ2xvYmwJbWVtY3B5CisgICAgICAgIC50eXBlCW1lbWNweSxAZnVuY3Rpb24KK21lbWNweToKKwltb3ZtCVtkMixkM10sKHNwKQorCW1vdglkMCwoMTIsc3ApCisJbW92CWQxLCgxNixzcCkKKwltb3YJKDIwLHNwKSxkMgkJCSMgY291bnQKKwltb3YJZDAsYTAJCQkJIyBkc3QKKwltb3YJZDEsYTEJCQkJIyBzcmMKKwltb3YJZDAsZTMJCQkJIyB0aGUgcmV0dXJuIHZhbHVlCisKKwljbXAJKzAsZDIKKwliZXEJbWVtY3B5X2RvbmUJCQkjIHJldHVybiBpZiB6ZXJvLWxlbmd0aCBjb3B5CisKKwkjIHNlZSBpZiB0aGUgdGhyZWUgcGFyYW1ldGVycyBhcmUgYWxsIGZvdXItYnl0ZSBhbGlnbmVkCisJb3IJZDAsZDEsZDMKKwlvcglkMixkMworCWFuZAkrMyxkMworCWJuZQltZW1jcHlfMQkJCSMganVtcCBpZiBub3QKKworCSMgd2Ugd2FudCB0byB0cmFuc2ZlciBhcyBtdWNoIGFzIHdlIGNhbiBpbiBjaHVua3Mgb2YgMzIgYnl0ZXMKKwljbXAJKzMxLGQyCisJYmxzCW1lbWNweV80X3JlbWFpbmRlcgkJIyA0LWJ5dGUgYWxpZ25lZCByZW1haW5kZXIKKworCW1vdm0JW2V4cmVnMV0sKHNwKQorCWFkZAktMzIsZDIKKwltb3YJKzMyLGQzCisKK21lbWNweV80X2xvb3A6CisJbW92CShhMSspLGQwCisJbW92CShhMSspLGQxCisJbW92CShhMSspLGUwCisJbW92CShhMSspLGUxCisJbW92CShhMSspLGU0CisJbW92CShhMSspLGU1CisJbW92CShhMSspLGU2CisJbW92CShhMSspLGU3CisJbW92CWQwLChhMCspCisJbW92CWQxLChhMCspCisJbW92CWUwLChhMCspCisJbW92CWUxLChhMCspCisJbW92CWU0LChhMCspCisJbW92CWU1LChhMCspCisJbW92CWU2LChhMCspCisJbW92CWU3LChhMCspCisKKwlzdWIJZDMsZDIKKwliY2MJbWVtY3B5XzRfbG9vcAorCisJbW92bQkoc3ApLFtleHJlZzFdCisJYWRkCWQzLGQyCisJYmVxCW1lbWNweV80X25vX3JlbWFpbmRlcgorCittZW1jcHlfNF9yZW1haW5kZXI6CisJIyBjdXQgNC03IHdvcmRzIGRvd24gdG8gMC0zCisJY21wCSsxNixkMgorCWJjcwltZW1jcHlfNF90aHJlZV9vcl9mZXdlcl93b3JkcworCW1vdgkoYTErKSxkMAorCW1vdgkoYTErKSxkMQorCW1vdgkoYTErKSxlMAorCW1vdgkoYTErKSxlMQorCW1vdglkMCwoYTArKQorCW1vdglkMSwoYTArKQorCW1vdgllMCwoYTArKQorCW1vdgllMSwoYTArKQorCWFkZAktMTYsZDIKKwliZXEJbWVtY3B5XzRfbm9fcmVtYWluZGVyCisKKwkjIGNvcHkgdGhlIHJlbWFpbmluZyAxLCAyIG9yIDMgd29yZHMKK21lbWNweV80X3RocmVlX29yX2Zld2VyX3dvcmRzOgorCWNtcAkrOCxkMgorCWJjcwltZW1jcHlfNF9vbmVfd29yZAorCWJlcQltZW1jcHlfNF90d29fd29yZHMKKwltb3YJKGExKyksZDAKKwltb3YJZDAsKGEwKykKK21lbWNweV80X3R3b193b3JkczoKKwltb3YJKGExKyksZDAKKwltb3YJZDAsKGEwKykKK21lbWNweV80X29uZV93b3JkOgorCW1vdgkoYTErKSxkMAorCW1vdglkMCwoYTArKQorCittZW1jcHlfNF9ub19yZW1haW5kZXI6CisJIyBjaGVjayB3ZSBjb3BpZWQgdGhlIGNvcnJlY3QgYW1vdW50CisJIyBUT0RPOiBSRU1PVkUgQ0hFQ0sKKwlzdWIJZTMsYTAsZDIKKwltb3YJKDIwLHNwKSxkMQorCWNtcAlkMixkMQorCWJlcQltZW1jcHlfZG9uZQorCWJyZWFrCisJYnJlYWsKKwlicmVhaworCittZW1jcHlfZG9uZToKKwltb3YJZTMsYTAKKwlyZXQJW2QyLGQzXSw4CisKKwkjIGhhbmRsZSBtaXNhbGlnbmVkIGNvcHlpbmcKK21lbWNweV8xOgorCWFkZAktMSxkMgorCW1vdgkrMSxkMworCXNldGxiCQkJCQkjIHNldGxiIHJlcXVpcmVzIHRoZSBuZXh0IGluc25zCisJCQkJCQkjIHRvIG9jY3VweSBleGFjdGx5IDQgYnl0ZXMKKworCXN1YglkMyxkMgorCW1vdmJ1CShhMSksZDAKKwltb3ZidQlkMCwoYTApCisJYWRkX2FkZAlkMyxhMSxkMyxhMAorCWxjYworCisJbW92CWUzLGEwCisJcmV0CVtkMixkM10sOAorCittZW1jcHlfZW5kOgorCS5zaXplCW1lbWNweSwgbWVtY3B5X2VuZC1tZW1jcHkKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9saWIvbWVtbW92ZS5TIGIvYXJjaC9tbjEwMzAwL2xpYi9tZW1tb3ZlLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBiMDdiNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9saWIvbWVtbW92ZS5TCkBAIC0wLDAgKzEsMTYwIEBACisvKiBNTjEwMzAwIE9wdGltaXNlZCBzaW1wbGUgbWVtb3J5IHRvIG1lbW9yeSBjb3B5LCB3aXRoIHN1cHBvcnQgZm9yIG92ZXJsYXBwaW5nCisgKiByZWdpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisKKyAgICAgICAgLnNlY3Rpb24gLnRleHQKKyAgICAgICAgLmJhbGlnbglMMV9DQUNIRV9CWVRFUworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHZvaWQgKm1lbW1vdmUodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKQorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCS5nbG9ibAltZW1tb3ZlCisgICAgICAgIC50eXBlCW1lbW1vdmUsQGZ1bmN0aW9uCittZW1tb3ZlOgorCSMgZmFsbCBiYWNrIHRvIG1lbWNweSBpZiBkc3QgPCBzcmMgdG8gd29yayBib3R0b20gdXAKKwljbXAJZDEsZDAKKwliY3MJbWVtbW92ZV9tZW1jcHkKKworCSMgd29yayB0b3AgZG93bgorCW1vdm0JW2QyLGQzXSwoc3ApCisJbW92CWQwLCgxMixzcCkKKwltb3YJZDEsKDE2LHNwKQorCW1vdgkoMjAsc3ApLGQyCQkJIyBjb3VudAorCWFkZAlkMCxkMixhMAkJCSMgZHN0IGVuZAorCWFkZAlkMSxkMixhMQkJCSMgc3JjIGVuZAorCW1vdglkMCxlMwkJCQkjIHRoZSByZXR1cm4gdmFsdWUKKworCWNtcAkrMCxkMgorCWJlcQltZW1tb3ZlX2RvbmUJCQkjIHJldHVybiBpZiB6ZXJvLWxlbmd0aCBjb3B5CisKKwkjIHNlZSBpZiB0aGUgdGhyZWUgcGFyYW1ldGVycyBhcmUgYWxsIGZvdXItYnl0ZSBhbGlnbmVkCisJb3IJZDAsZDEsZDMKKwlvcglkMixkMworCWFuZAkrMyxkMworCWJuZQltZW1tb3ZlXzEJCQkjIGp1bXAgaWYgbm90CisKKwkjIHdlIHdhbnQgdG8gdHJhbnNmZXIgYXMgbXVjaCBhcyB3ZSBjYW4gaW4gY2h1bmtzIG9mIDMyIGJ5dGVzCisJYWRkCS00LGExCisJY21wCSszMSxkMgorCWJscwltZW1tb3ZlXzRfcmVtYWluZGVyCQkjIDQtYnl0ZSBhbGlnbmVkIHJlbWFpbmRlcgorCisJYWRkCS0zMixkMgorCW1vdgkrMzIsZDMKKworbWVtbW92ZV80X2xvb3A6CisJbW92CShhMSksZDAKKwlzdWJfc3ViCSs0LGExLCs0LGEwCisJbW92CWQwLChhMCkKKwltb3YJKGExKSxkMQorCXN1Yl9zdWIJKzQsYTEsKzQsYTAKKwltb3YJZDEsKGEwKQorCisJbW92CShhMSksZDAKKwlzdWJfc3ViCSs0LGExLCs0LGEwCisJbW92CWQwLChhMCkKKwltb3YJKGExKSxkMQorCXN1Yl9zdWIJKzQsYTEsKzQsYTAKKwltb3YJZDEsKGEwKQorCisJbW92CShhMSksZDAKKwlzdWJfc3ViCSs0LGExLCs0LGEwCisJbW92CWQwLChhMCkKKwltb3YJKGExKSxkMQorCXN1Yl9zdWIJKzQsYTEsKzQsYTAKKwltb3YJZDEsKGEwKQorCisJbW92CShhMSksZDAKKwlzdWJfc3ViCSs0LGExLCs0LGEwCisJbW92CWQwLChhMCkKKwltb3YJKGExKSxkMQorCXN1Yl9zdWIJKzQsYTEsKzQsYTAKKwltb3YJZDEsKGEwKQorCisJc3ViCWQzLGQyCisJYmNjCW1lbW1vdmVfNF9sb29wCisKKwlhZGQJZDMsZDIKKwliZXEJbWVtbW92ZV80X25vX3JlbWFpbmRlcgorCittZW1tb3ZlXzRfcmVtYWluZGVyOgorCSMgY3V0IDQtNyB3b3JkcyBkb3duIHRvIDAtMworCWNtcAkrMTYsZDIKKwliY3MJbWVtbW92ZV80X3RocmVlX29yX2Zld2VyX3dvcmRzCisJbW92CShhMSksZDAKKwlzdWJfc3ViCSs0LGExLCs0LGEwCisJbW92CWQwLChhMCkKKwltb3YJKGExKSxkMQorCXN1Yl9zdWIJKzQsYTEsKzQsYTAKKwltb3YJZDEsKGEwKQorCW1vdgkoYTEpLGUwCisJc3ViX3N1YgkrNCxhMSwrNCxhMAorCW1vdgllMCwoYTApCisJbW92CShhMSksZTEKKwlzdWJfc3ViCSs0LGExLCs0LGEwCisJbW92CWUxLChhMCkKKwlhZGQJLTE2LGQyCisJYmVxCW1lbW1vdmVfNF9ub19yZW1haW5kZXIKKworCSMgY29weSB0aGUgcmVtYWluaW5nIDEsIDIgb3IgMyB3b3JkcworbWVtbW92ZV80X3RocmVlX29yX2Zld2VyX3dvcmRzOgorCWNtcAkrOCxkMgorCWJjcwltZW1tb3ZlXzRfb25lX3dvcmQKKwliZXEJbWVtbW92ZV80X3R3b193b3JkcworCW1vdgkoYTEpLGQwCisJc3ViX3N1YgkrNCxhMSwrNCxhMAorCW1vdglkMCwoYTApCittZW1tb3ZlXzRfdHdvX3dvcmRzOgorCW1vdgkoYTEpLGQwCisJc3ViX3N1YgkrNCxhMSwrNCxhMAorCW1vdglkMCwoYTApCittZW1tb3ZlXzRfb25lX3dvcmQ6CisJbW92CShhMSksZDAKKwlzdWJfc3ViCSs0LGExLCs0LGEwCisJbW92CWQwLChhMCkKKworbWVtbW92ZV80X25vX3JlbWFpbmRlcjoKKwkjIGNoZWNrIHdlIGNvcGllZCB0aGUgY29ycmVjdCBhbW91bnQKKwkjIFRPRE86IFJFTU9WRSBDSEVDSworCXN1YgllMyxhMCxkMgorCWJlcQltZW1tb3ZlX2RvbmUKKwlicmVhaworCWJyZWFrCisJYnJlYWsKKworbWVtbW92ZV9kb25lOgorCW1vdgllMyxhMAorCXJldAlbZDIsZDNdLDgKKworCSMgaGFuZGxlIG1pc2FsaWduZWQgY29weWluZworbWVtbW92ZV8xOgorCWFkZAktMSxhMQorCWFkZAktMSxkMgorCW1vdgkrMSxkMworCXNldGxiCQkJCQkjIHNldGxiIHJlcXVpcmVzIHRoZSBuZXh0IGluc25zCisJCQkJCQkjIHRvIG9jY3VweSBleGFjdGx5IDQgYnl0ZXMKKworCXN1YglkMyxkMgorCW1vdmJ1CShhMSksZDAKKwlzdWJfc3ViCWQzLGExLGQzLGEwCisJbW92YnUJZDAsKGEwKQorCWxjYworCisJbW92CWUzLGEwCisJcmV0CVtkMixkM10sOAorCittZW1tb3ZlX21lbWNweToKKwlqbXAJbWVtY3B5CisKK21lbW1vdmVfZW5kOgorCS5zaXplCW1lbW1vdmUsIG1lbW1vdmVfZW5kLW1lbW1vdmUKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9saWIvbWVtc2V0LlMgYi9hcmNoL21uMTAzMDAvbGliL21lbXNldC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMDJlMzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAvbGliL21lbXNldC5TCkBAIC0wLDAgKzEsMTIxIEBACisvKiBPcHRpbWlzZWQgc2ltcGxlIG1lbW9yeSBmaWxsCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisKKyAgICAgICAgLnNlY3Rpb24gLnRleHQKKyAgICAgICAgLmJhbGlnbglMMV9DQUNIRV9CWVRFUworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHZvaWQgKm1lbXNldCh2b2lkICpkc3QsIGludCBjLCBzaXplX3QgbikKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkuZ2xvYmwJbWVtc2V0CisgICAgICAgIC50eXBlCW1lbXNldCxAZnVuY3Rpb24KK21lbXNldDoKKwltb3ZtCVtkMixkM10sKHNwKQorCW1vdglkMCwoMTIsc3ApCisJbW92CWQxLCgxNixzcCkKKwltb3YJKDIwLHNwKSxkMgkJCSMgY291bnQKKwltb3YJZDAsYTAJCQkJIyBkc3QKKwltb3YJZDAsZTMJCQkJIyB0aGUgcmV0dXJuIHZhbHVlCisKKwljbXAJKzAsZDIKKwliZXEJbWVtc2V0X2RvbmUJCQkjIHJldHVybiBpZiB6ZXJvLWxlbmd0aCBmaWxsCisKKwkjIHNlZSBpZiB0aGUgcmVnaW9uIHBhcmFtZXRlcnMgYXJlIGZvdXItYnl0ZSBhbGlnbmVkCisJb3IJZDAsZDIsZDMKKwlhbmQJKzMsZDMKKwlibmUJbWVtc2V0XzEJCQkjIGp1bXAgaWYgbm90CisKKwlleHRidQlkMQorCW1vdl9hc2wJZDEsZDMsOCxkMQorCW9yX2FzbAlkMSxkMyw4LGQxCisJb3JfYXNsCWQxLGQzLDgsZDEKKwlvcglkMyxkMQorCisJIyB3ZSB3YW50IHRvIHRyYW5zZmVyIGFzIG11Y2ggYXMgd2UgY2FuIGluIGNodW5rcyBvZiAzMiBieXRlcworCWNtcAkrMzEsZDIKKwlibHMJbWVtc2V0XzRfcmVtYWluZGVyCQkjIDQtYnl0ZSBhbGlnbmVkIHJlbWFpbmRlcgorCisJYWRkCS0zMixkMgorCW1vdgkrMzIsZDMKKworbWVtc2V0XzRfbG9vcDoKKwltb3YJZDEsKGEwKykKKwltb3YJZDEsKGEwKykKKwltb3YJZDEsKGEwKykKKwltb3YJZDEsKGEwKykKKwltb3YJZDEsKGEwKykKKwltb3YJZDEsKGEwKykKKwltb3YJZDEsKGEwKykKKwltb3YJZDEsKGEwKykKKworCXN1YglkMyxkMgorCWJjYwltZW1zZXRfNF9sb29wCisKKwlhZGQJZDMsZDIKKwliZXEJbWVtc2V0XzRfbm9fcmVtYWluZGVyCisKK21lbXNldF80X3JlbWFpbmRlcjoKKwkjIGN1dCA0LTcgd29yZHMgZG93biB0byAwLTMKKwljbXAJKzE2LGQyCisJYmNzCW1lbXNldF80X3RocmVlX29yX2Zld2VyX3dvcmRzCisJbW92CWQxLChhMCspCisJbW92CWQxLChhMCspCisJbW92CWQxLChhMCspCisJbW92CWQxLChhMCspCisJYWRkCS0xNixkMgorCWJlcQltZW1zZXRfNF9ub19yZW1haW5kZXIKKworCSMgY29weSB0aGUgcmVtYWluaW5nIDEsIDIgb3IgMyB3b3JkcworbWVtc2V0XzRfdGhyZWVfb3JfZmV3ZXJfd29yZHM6CisJY21wCSs4LGQyCisJYmNzCW1lbXNldF80X29uZV93b3JkCisJYmVxCW1lbXNldF80X3R3b193b3JkcworCW1vdglkMSwoYTArKQorbWVtc2V0XzRfdHdvX3dvcmRzOgorCW1vdglkMSwoYTArKQorbWVtc2V0XzRfb25lX3dvcmQ6CisJbW92CWQxLChhMCspCisKK21lbXNldF80X25vX3JlbWFpbmRlcjoKKwkjIGNoZWNrIHdlIHNldCB0aGUgY29ycmVjdCBhbW91bnQKKwkjIFRPRE86IFJFTU9WRSBDSEVDSworCXN1YgllMyxhMCxkMgorCW1vdgkoMjAsc3ApLGQxCisJY21wCWQyLGQxCisJYmVxCW1lbXNldF9kb25lCisJYnJlYWsKKwlicmVhaworCWJyZWFrCisKK21lbXNldF9kb25lOgorCW1vdgllMyxhMAorCXJldAlbZDIsZDNdLDgKKworCSMgaGFuZGxlIG1pc2FsaWduZWQgY29weWluZworbWVtc2V0XzE6CisJYWRkCS0xLGQyCisJbW92CSsxLGQzCisJc2V0bGIJCQkJCSMgc2V0bGIgcmVxdWlyZXMgdGhlIG5leHQgaW5zbnMKKwkJCQkJCSMgdG8gb2NjdXB5IGV4YWN0bHkgNCBieXRlcworCisJc3ViCWQzLGQyCisJbW92YnUJZDEsKGEwKQorCWluYwlhMAorCWxjYworCisJbW92CWUzLGEwCisJcmV0CVtkMixkM10sOAorCittZW1zZXRfZW5kOgorCS5zaXplCW1lbXNldCwgbWVtc2V0X2VuZC1tZW1zZXQKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9saWIvbmVnZGkyLmMgYi9hcmNoL21uMTAzMDAvbGliL25lZ2RpMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZTRlY2QKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAvbGliL25lZ2RpMi5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qIE1vcmUgc3Vicm91dGluZXMgbmVlZGVkIGJ5IEdDQyBvdXRwdXQgY29kZSBvbiBzb21lIG1hY2hpbmVzLiAgKi8KKy8qIENvbXBpbGUgdGhpcyBvbmUgd2l0aCBnY2MuICAqLworLyogQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LAorICAgMjAwMCwgMjAwMSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KKworR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworSW4gYWRkaXRpb24gdG8gdGhlIHBlcm1pc3Npb25zIGluIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZSwgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMgeW91IHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlCitjb21waWxlZCB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBpbnRvIGNvbWJpbmF0aW9ucyB3aXRoIG90aGVyIHByb2dyYW1zLAorYW5kIHRvIGRpc3RyaWJ1dGUgdGhvc2UgY29tYmluYXRpb25zIHdpdGhvdXQgYW55IHJlc3RyaWN0aW9uIGNvbWluZworZnJvbSB0aGUgdXNlIG9mIHRoaXMgZmlsZS4gIChUaGUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZSByZXN0cmljdGlvbnMKK2RvIGFwcGx5IGluIG90aGVyIHJlc3BlY3RzOyBmb3IgZXhhbXBsZSwgdGhleSBjb3ZlciBtb2RpZmljYXRpb24gb2YKK3RoZSBmaWxlLCBhbmQgZGlzdHJpYnV0aW9uIHdoZW4gbm90IGxpbmtlZCBpbnRvIGEgY29tYmluZQorZXhlY3V0YWJsZS4pCisKK0dOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCithbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCitCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEl0IGlzIGluY29ycmVjdCB0byBpbmNsdWRlIGNvbmZpZy5oIGhlcmUsIGJlY2F1c2UgdGhpcyBmaWxlIGlzIGJlaW5nCisgICBjb21waWxlZCBmb3IgdGhlIHRhcmdldCwgYW5kIGhlbmNlIGRlZmluaXRpb25zIGNvbmNlcm5pbmcgb25seSB0aGUgaG9zdAorICAgZG8gbm90IGFwcGx5LiAgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3VuaW9uIERXdW5pb24geworCXM2NCBsbDsKKwlzdHJ1Y3QgeworCQlzMzIgbG93OworCQlzMzIgaGlnaDsKKwl9IHM7Cit9OworCitzNjQgX19uZWdkaTIoczY0IHUpCit7CisJdW5pb24gRFd1bmlvbiB3OworCXVuaW9uIERXdW5pb24gdXU7CisKKwl1dS5sbCA9IHU7CisKKwl3LnMubG93ID0gLXV1LnMubG93OworCXcucy5oaWdoID0gLXV1LnMuaGlnaCAtICgodTMyKSB3LnMubG93ID4gMCk7CisKKwlyZXR1cm4gdy5sbDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9saWIvdXNlcmNvcHkuYyBiL2FyY2gvbW4xMDMwMC9saWIvdXNlcmNvcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzViMjAzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL2xpYi91c2VyY29weS5jCkBAIC0wLDAgKzEsMTY2IEBACisvKiBNTjEwMzAwIFVzZXJzcGFjZSBhY2Nlc3NvciBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWF0c3VzaGl0YSBFbGVjdHJpYyBJbmR1c3RyaWFsIENvLiwgTHRkLgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKwordW5zaWduZWQgbG9uZworX19nZW5lcmljX2NvcHlfdG9fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQoreworCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0bywgbikpCisJCV9fY29weV91c2VyKHRvLCBmcm9tLCBuKTsKKwlyZXR1cm4gbjsKK30KKwordW5zaWduZWQgbG9uZworX19nZW5lcmljX2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCit7CisJaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJvbSwgbikpCisJCV9fY29weV91c2VyX3plcm9pbmcodG8sIGZyb20sIG4pOworCXJldHVybiBuOworfQorCisvKgorICogQ29weSBhIG51bGwgdGVybWluYXRlZCBzdHJpbmcgZnJvbSB1c2Vyc3BhY2UuCisgKi8KKyNkZWZpbmUgX19kb19zdHJuY3B5X2Zyb21fdXNlcihkc3QsIHNyYywgY291bnQsIHJlcykJCVwKK2RvIHsJCQkJCQkJCVwKKwlpbnQgdzsJCQkJCQkJXAorCWFzbSB2b2xhdGlsZSgJCQkJCQlcCisJCSIJbW92CSUxLCUwXG4iCQkJXAorCQkiCWNtcAkwLCUxXG4iCQkJCVwKKwkJIgliZXEJMmZcbiIJCQkJXAorCQkiMDpcbiIJCQkJCQlcCisJCSIJbW92YnUJKCU1KSwlMlxuIgkJCVwKKwkJIjE6XG4iCQkJCQkJXAorCQkiCW1vdmJ1CSUyLCglNilcbiIJCQlcCisJCSIJaW5jCSU1XG4iCQkJCVwKKwkJIglpbmMJJTZcbiIJCQkJXAorCQkiCWNtcAkwLCUyXG4iCQkJCVwKKwkJIgliZXEJMmZcbiIJCQkJXAorCQkiCWFkZAktMSwlMVxuIgkJCVwKKwkJIglibmUJMGJcbiIJCQkJXAorCQkiMjpcbiIJCQkJCQlcCisJCSIJc3ViCSUxLCUwXG4iCQkJXAorCQkiMzpcbiIJCQkJCQlcCisJCSIJLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgkJXAorCQkiNDpcbiIJCQkJCQlcCisJCSIJbW92CSUzLCUwXG4iCQkJXAorCQkiCWptcAkzYlxuIgkJCQlcCisJCSIJLnByZXZpb3VzXG4iCQkJCVwKKwkJIgkuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCQlcCisJCSIJLmJhbGlnbiA0XG4iCQkJCVwKKwkJIgkubG9uZyAwYiw0YlxuIgkJCQlcCisJCSIJLmxvbmcgMWIsNGJcbiIJCQkJXAorCQkiCS5wcmV2aW91cyIJCQkJXAorCQk6Ij0mciIocmVzKSwgIj1yIihjb3VudCksICI9JnIiKHcpCQlcCisJCToiaSIoLUVGQVVMVCksICIxIihjb3VudCksICJhIihzcmMpLCAiYSIoZHN0KQlcCisJCToibWVtb3J5Iik7CQkJCQlcCit9IHdoaWxlICgwKQorCitsb25nCitfX3N0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBsb25nIGNvdW50KQoreworCWxvbmcgcmVzOworCV9fZG9fc3RybmNweV9mcm9tX3VzZXIoZHN0LCBzcmMsIGNvdW50LCByZXMpOworCXJldHVybiByZXM7Cit9CisKK2xvbmcKK3N0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBsb25nIGNvdW50KQoreworCWxvbmcgcmVzID0gLUVGQVVMVDsKKwlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBzcmMsIDEpKQorCQlfX2RvX3N0cm5jcHlfZnJvbV91c2VyKGRzdCwgc3JjLCBjb3VudCwgcmVzKTsKKwlyZXR1cm4gcmVzOworfQorCisKKy8qCisgKiBDbGVhciBhIHVzZXJzcGFjZSBtZW1vcnkKKyAqLworI2RlZmluZSBfX2RvX2NsZWFyX3VzZXIoYWRkciwgc2l6ZSkJCVwKK2RvIHsJCQkJCQlcCisJaW50IHc7CQkJCQlcCisJYXNtIHZvbGF0aWxlKAkJCQlcCisJCSIJY21wIDAsJTBcbiIJCVwKKwkJIgliZXEgMWZcbiIJCVwKKwkJIgljbHIgJTFcbiIJCVwKKwkJIjA6CW1vdmJ1ICUxLCglMywlMilcbiIJXAorCQkiCWluYyAlM1xuIgkJXAorCQkiCWNtcCAlMCwlM1xuIgkJXAorCQkiCWJuZSAwYlxuIgkJXAorCQkiMTpcbiIJCQkJXAorCQkiCXN1YiAlMywlMFxuIgkJXAorCQkiMjpcbiIJCQkJXAorCQkiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIglcCisJCSIzOglqbXAgMmJcbiIJCVwKKwkJIi5wcmV2aW91c1xuIgkJCVwKKwkJIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIJXAorCQkiICAgICAgIC5iYWxpZ24gNFxuIgkJXAorCQkiICAgICAgIC5sb25nIDBiLDNiXG4iCQlcCisJCSIucHJldmlvdXNcbiIJCQlcCisJCTogIityIihzaXplKSwgIj0mciIodykJCVwKKwkJOiAiYSIoYWRkciksICJkIigwKQkJXAorCQk6ICJtZW1vcnkiKTsJCQlcCit9IHdoaWxlICgwKQorCit1bnNpZ25lZCBsb25nCitfX2NsZWFyX3VzZXIodm9pZCAqdG8sIHVuc2lnbmVkIGxvbmcgbikKK3sKKwlfX2RvX2NsZWFyX3VzZXIodG8sIG4pOworCXJldHVybiBuOworfQorCit1bnNpZ25lZCBsb25nCitjbGVhcl91c2VyKHZvaWQgKnRvLCB1bnNpZ25lZCBsb25nIG4pCit7CisJaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHRvLCBuKSkKKwkJX19kb19jbGVhcl91c2VyKHRvLCBuKTsKKwlyZXR1cm4gbjsKK30KKworLyoKKyAqIFJldHVybiB0aGUgc2l6ZSBvZiBhIHN0cmluZyAoaW5jbHVkaW5nIHRoZSBlbmRpbmcgMCkKKyAqCisgKiBSZXR1cm4gMCBvbiBleGNlcHRpb24sIGEgdmFsdWUgZ3JlYXRlciB0aGFuIE4gaWYgdG9vIGxvbmcKKyAqLworbG9uZyBzdHJubGVuX3VzZXIoY29uc3QgY2hhciAqcywgbG9uZyBuKQoreworCXVuc2lnbmVkIGxvbmcgcmVzLCB3OworCisJaWYgKCFfX2FkZHJfb2socykpCisJCXJldHVybiAwOworCisJaWYgKG4gPCAwIHx8IG4gKyAodV9sb25nKSBzID4gY3VycmVudF90aHJlYWRfaW5mbygpLT5hZGRyX2xpbWl0LnNlZykKKwkJbiA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+YWRkcl9saW1pdC5zZWcgLSAodV9sb25nKXM7CisKKwlhc20gdm9sYXRpbGUoCisJCSIwOgljbXAgJTQsJTBcbiIKKwkJIgliZXEgMmZcbiIKKwkJIjE6CW1vdmJ1ICglMCwlMyksJTFcbiIKKwkJIglpbmMgJTBcbiIKKwkJIgljbXAgMCwlMVxuIgorCQkiCWJlcSAzZlxuIgorCQkiCWJyYSAwYlxuIgorCQkiMjoJY2xyICUwXG4iCisJCSIzOlxuIgorCQkiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgorCQkiNDoJam1wIDJiXG4iCisJCSIucHJldmlvdXNcbiIKKwkJIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKKwkJIgkuYmFsaWduIDRcbiIKKwkJIgkubG9uZyAxYiw0YlxuIgorCQkiLnByZXZpb3VzXG4iCisJCToiPWQiKHJlcyksICI9JnIiKHcpCisJCToiMCIoMCksICJhIihzKSwgInIiKG4pCisJCToibWVtb3J5Iik7CisJcmV0dXJuIHJlczsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9tbS9NYWtlZmlsZSBiL2FyY2gvbW4xMDMwMC9tbS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGI5ZDk4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL21tL01ha2VmaWxlCkBAIC0wLDAgKzEsMTQgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBNTjEwMzAwLXNwZWNpZmljIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUKKyMKKworb2JqLXkgOj0gXAorCWluaXQubyBmYXVsdC5vIHBndGFibGUubyBleHRhYmxlLm8gdGxiLW1uMTAzMDAubyBtbXUtY29udGV4dC5vIFwKKwltaXNhbGlnbm1lbnQubyBkbWEtYWxsb2MubworCitpZm5lcSAoJChDT05GSUdfTU4xMDMwMF9DQUNIRV9ESVNBQkxFRCkseSkKK29iai15CSs9IGNhY2hlLm8gY2FjaGUtbW4xMDMwMC5vCitpZmVxICgkKENPTkZJR19NTjEwMzAwX0NBQ0hFX1dCQUNLKSx5KQorb2JqLXkJKz0gY2FjaGUtZmx1c2gtbW4xMDMwMC5vCitlbmRpZgorZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9tbS9jYWNoZS1mbHVzaC1tbjEwMzAwLlMgYi9hcmNoL21uMTAzMDAvbW0vY2FjaGUtZmx1c2gtbW4xMDMwMC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZWQxY2IKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAvbW0vY2FjaGUtZmx1c2gtbW4xMDMwMC5TCkBAIC0wLDAgKzEsMTkyIEBACisvKiBNTjEwMzAwIENQVSBjb3JlIGNhY2hpbmcgcm91dGluZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N5cy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKworCS5hbTMzXzIKKwkuZ2xvYmwgbW4xMDMwMF9kY2FjaGVfZmx1c2gKKwkuZ2xvYmwgbW4xMDMwMF9kY2FjaGVfZmx1c2hfcGFnZQorCS5nbG9ibCBtbjEwMzAwX2RjYWNoZV9mbHVzaF9yYW5nZQorCS5nbG9ibCBtbjEwMzAwX2RjYWNoZV9mbHVzaF9yYW5nZTIKKwkuZ2xvYmwgbW4xMDMwMF9kY2FjaGVfZmx1c2hfaW52CisJLmdsb2JsIG1uMTAzMDBfZGNhY2hlX2ZsdXNoX2ludl9wYWdlCisJLmdsb2JsIG1uMTAzMDBfZGNhY2hlX2ZsdXNoX2ludl9yYW5nZQorCS5nbG9ibCBtbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnZfcmFuZ2UyCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgdm9pZCBtbjEwMzAwX2RjYWNoZV9mbHVzaCh2b2lkKQorIyBGbHVzaCB0aGUgZW50aXJlIGRhdGEgY2FjaGUgYmFjayB0byBSQU0KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwlBTElHTgorbW4xMDMwMF9kY2FjaGVfZmx1c2g6CisJbW92aHUJKENIQ1RSKSxkMAorCWJ0c3QJQ0hDVFJfRENFTixkMAorCWJlcQltbjEwMzAwX2RjYWNoZV9mbHVzaF9lbmQKKworCSMgcmVhZCB0aGUgYWRkcmVzc2VzIHRhZ2dlZCBpbiB0aGUgY2FjaGUncyB0YWcgUkFNIGFuZCBhdHRlbXB0IHRvIGZsdXNoCisJIyB0aG9zZSBhZGRyZXNzZXMgc3BlY2lmaWNhbGx5CisJIyAtIHdlIHJlbHkgb24gdGhlIGhhcmR3YXJlIHRvIGZpbHRlciBvdXQgaW52YWxpZCB0YWcgZW50cnkgYWRkcmVzc2VzCisJbW92CURDQUNIRV9UQUcoMCwwKSxhMAkJIyBkY2FjaGUgdGFnIFJBTSBhY2Nlc3MgYWRkcmVzcworCW1vdglEQ0FDSEVfUFVSR0UoMCwwKSxhMQkJIyBkY2FjaGUgcHVyZ2UgcmVxdWVzdCBhZGRyZXNzCisJbW92CUwxX0NBQ0hFX05XQVlTKkwxX0NBQ0hFX05FTlRSSUVTLGQxICAjIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzCisKK21uMTAzMDBfZGNhY2hlX2ZsdXNoX2xvb3A6CisJbW92CShhMCksZDAKKwlhbmQJTDFfQ0FDSEVfVEFHX0FERFJFU1N8TDFfQ0FDSEVfVEFHX0VOVFJZLGQwCisJb3IJTDFfQ0FDSEVfVEFHX1ZBTElELGQwCQkjIHJldGFpbiB2YWxpZCBlbnRyaWVzIGluIHRoZQorCQkJCQkJIyBjYWNoZQorCW1vdglkMCwoYTEpCQkJCSMgY29uZGl0aW9uYWwgcHVyZ2UKKworbW4xMDMwMF9kY2FjaGVfZmx1c2hfc2tpcDoKKwlhZGQJTDFfQ0FDSEVfQllURVMsYTAKKwlhZGQJTDFfQ0FDSEVfQllURVMsYTEKKwlhZGQJLTEsZDEKKwlibmUJbW4xMDMwMF9kY2FjaGVfZmx1c2hfbG9vcAorCittbjEwMzAwX2RjYWNoZV9mbHVzaF9lbmQ6CisJcmV0CVtdLDAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB2b2lkIG1uMTAzMDBfZGNhY2hlX2ZsdXNoX3BhZ2UodW5zaWduZWQgc3RhcnQpCisjIHZvaWQgbW4xMDMwMF9kY2FjaGVfZmx1c2hfcmFuZ2UodW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGVuZCkKKyMgdm9pZCBtbjEwMzAwX2RjYWNoZV9mbHVzaF9yYW5nZTIodW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIHNpemUpCisjIEZsdXNoIGEgcmFuZ2Ugb2YgYWRkcmVzc2VzIG9uIGEgcGFnZSBpbiB0aGUgZGNhY2hlCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJQUxJR04KK21uMTAzMDBfZGNhY2hlX2ZsdXNoX3BhZ2U6CisJbW92CVBBR0VfU0laRSxkMQorbW4xMDMwMF9kY2FjaGVfZmx1c2hfcmFuZ2UyOgorCWFkZAlkMCxkMQorbW4xMDMwMF9kY2FjaGVfZmx1c2hfcmFuZ2U6CisJbW92bQlbZDIsZDNdLChzcCkKKworCW1vdmh1CShDSENUUiksZDIKKwlidHN0CUNIQ1RSX0RDRU4sZDIKKwliZXEJbW4xMDMwMF9kY2FjaGVfZmx1c2hfcmFuZ2VfZW5kCisKKwkjIHJvdW5kIHN0YXJ0IGFkZHIgZG93bgorCWFuZAlMMV9DQUNIRV9UQUdfQUREUkVTU3xMMV9DQUNIRV9UQUdfRU5UUlksZDAKKwltb3YJZDAsYTEKKworCWFkZAlMMV9DQUNIRV9CWVRFUyxkMQkJCSMgcm91bmQgZW5kIGFkZHIgdXAKKwlhbmQJTDFfQ0FDSEVfVEFHX0FERFJFU1N8TDFfQ0FDSEVfVEFHX0VOVFJZLGQxCisKKwkjIHdyaXRlIGEgcmVxdWVzdCB0byBmbHVzaCBhbGwgaW5zdGFuY2VzIG9mIGFuIGFkZHJlc3MgZnJvbSB0aGUgY2FjaGUKKwltb3YJRENBQ0hFX1BVUkdFKDAsMCksYTAKKwltb3YJYTEsZDAKKwlhbmQJTDFfQ0FDSEVfVEFHX0VOVFJZLGQwCisJYWRkCWQwLGEwCQkJCSMgc3RhcnRpbmcgZGNhY2hlIHB1cmdlIGNvbnRyb2wKKwkJCQkJCSMgcmVnIGFkZHJlc3MKKworCXN1YglhMSxkMQorCWxzcglMMV9DQUNIRV9TSElGVCxkMQkJIyB0b3RhbCBudW1iZXIgb2YgZW50cmllcyB0bworCQkJCQkJIyBleGFtaW5lCisKKwlvcglMMV9DQUNIRV9UQUdfVkFMSUQsYTEJCSMgcmV0YWluIHZhbGlkIGVudHJpZXMgaW4gdGhlCisJCQkJCQkjIGNhY2hlCisKK21uMTAzMDBfZGNhY2hlX2ZsdXNoX3JhbmdlX2xvb3A6CisJbW92CWExLChMMV9DQUNIRV9XQVlESVNQKjAsYTApCSMgY29uZGl0aW9uYWxseSBwdXJnZSB0aGlzIGxpbmUKKwkJCQkJCSMgYWxsIHdheXMKKworCWFkZAlMMV9DQUNIRV9CWVRFUyxhMAorCWFkZAlMMV9DQUNIRV9CWVRFUyxhMQorCWFuZAl+TDFfQ0FDSEVfV0FZRElTUCxhMAkJIyBtYWtlIHN1cmUgd2F5IHN0YXkgb24gd2F5IDAKKwlhZGQJLTEsZDEKKwlibmUJbW4xMDMwMF9kY2FjaGVfZmx1c2hfcmFuZ2VfbG9vcAorCittbjEwMzAwX2RjYWNoZV9mbHVzaF9yYW5nZV9lbmQ6CisJcmV0CVtkMixkM10sOAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHZvaWQgbW4xMDMwMF9kY2FjaGVfZmx1c2hfaW52KHZvaWQpCisjIEZsdXNoIHRoZSBlbnRpcmUgZGF0YSBjYWNoZSBhbmQgaW52YWxpZGF0ZSBhbGwgZW50cmllcworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCUFMSUdOCittbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnY6CisJbW92aHUJKENIQ1RSKSxkMAorCWJ0c3QJQ0hDVFJfRENFTixkMAorCWJlcQltbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnZfZW5kCisKKwkjIGhpdCBlYWNoIGxpbmUgaW4gdGhlIGRjYWNoZSB3aXRoIGFuIHVuY29uZGl0aW9uYWwgcHVyZ2UKKwltb3YJRENBQ0hFX1BVUkdFKDAsMCksYTEJCSMgZGNhY2hlIHB1cmdlIHJlcXVlc3QgYWRkcmVzcworCW1vdglMMV9DQUNIRV9OV0FZUypMMV9DQUNIRV9ORU5UUklFUyxkMSAgIyB0b3RhbCBudW1iZXIgb2YgZW50cmllcworCittbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnZfbG9vcDoKKwltb3YJKGExKSxkMAkJCQkjIHVuY29uZGl0aW9uYWwgcHVyZ2UKKworCWFkZAlMMV9DQUNIRV9CWVRFUyxhMQorCWFkZAktMSxkMQorCWJuZQltbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnZfbG9vcAorCittbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnZfZW5kOgorCXJldAlbXSwwCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgdm9pZCBtbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnZfcGFnZSh1bnNpZ25lZCBzdGFydCkKKyMgdm9pZCBtbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnZfcmFuZ2UodW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGVuZCkKKyMgdm9pZCBtbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnZfcmFuZ2UyKHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBzaXplKQorIyBGbHVzaCBhbmQgaW52YWxpZGF0ZSBhIHJhbmdlIG9mIGFkZHJlc3NlcyBvbiBhIHBhZ2UgaW4gdGhlIGRjYWNoZQorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCUFMSUdOCittbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnZfcGFnZToKKwltb3YJUEFHRV9TSVpFLGQxCittbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnZfcmFuZ2UyOgorCWFkZAlkMCxkMQorbW4xMDMwMF9kY2FjaGVfZmx1c2hfaW52X3JhbmdlOgorCW1vdm0JW2QyLGQzXSwoc3ApCisJbW92aHUJKENIQ1RSKSxkMgorCWJ0c3QJQ0hDVFJfRENFTixkMgorCWJlcQltbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnZfcmFuZ2VfZW5kCisKKwlhbmQJTDFfQ0FDSEVfVEFHX0FERFJFU1N8TDFfQ0FDSEVfVEFHX0VOVFJZLGQwCSMgcm91bmQgc3RhcnQKKwkJCQkJCQkJIyBhZGRyIGRvd24KKwltb3YJZDAsYTEKKworCWFkZAlMMV9DQUNIRV9CWVRFUyxkMQkJCSMgcm91bmQgZW5kIGFkZHIgdXAKKwlhbmQJTDFfQ0FDSEVfVEFHX0FERFJFU1N8TDFfQ0FDSEVfVEFHX0VOVFJZLGQxCisKKwkjIHdyaXRlIGEgcmVxdWVzdCB0byBmbHVzaCBhbmQgaW52YWxpZGF0ZSBhbGwgaW5zdGFuY2VzIG9mIGFuIGFkZHJlc3MKKwkjIGZyb20gdGhlIGNhY2hlCisJbW92CURDQUNIRV9QVVJHRSgwLDApLGEwCisJbW92CWExLGQwCisJYW5kCUwxX0NBQ0hFX1RBR19FTlRSWSxkMAorCWFkZAlkMCxhMAkJCQkjIHN0YXJ0aW5nIGRjYWNoZSBwdXJnZSBjb250cm9sCisJCQkJCQkjIHJlZyBhZGRyZXNzCisKKwlzdWIJYTEsZDEKKwlsc3IJTDFfQ0FDSEVfU0hJRlQsZDEJCSMgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgdG8KKwkJCQkJCSMgZXhhbWluZQorCittbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnZfcmFuZ2VfbG9vcDoKKwltb3YJYTEsKEwxX0NBQ0hFX1dBWURJU1AqMCxhMCkJIyBjb25kaXRpb25hbGx5IHB1cmdlIHRoaXMgbGluZQorCQkJCQkJIyBpbiBhbGwgd2F5cworCisJYWRkCUwxX0NBQ0hFX0JZVEVTLGEwCisJYWRkCUwxX0NBQ0hFX0JZVEVTLGExCisJYW5kCX5MMV9DQUNIRV9XQVlESVNQLGEwCQkjIG1ha2Ugc3VyZSB3YXkgc3RheSBvbiB3YXkgMAorCWFkZAktMSxkMQorCWJuZQltbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnZfcmFuZ2VfbG9vcAorCittbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnZfcmFuZ2VfZW5kOgorCXJldAlbZDIsZDNdLDgKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9tbS9jYWNoZS1tbjEwMzAwLlMgYi9hcmNoL21uMTAzMDAvbW0vY2FjaGUtbW4xMDMwMC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MzlkMGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAvbW0vY2FjaGUtbW4xMDMwMC5TCkBAIC0wLDAgKzEsMjg5IEBACisvKiBNTjEwMzAwIENQVSBjb3JlIGNhY2hpbmcgcm91dGluZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zeXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisKKyNkZWZpbmUgbW4xMDMwMF9kY2FjaGVfaW52X3JhbmdlX2ludHJfaW50ZXJ2YWwgXAorCSsoKDEgPDwgTU4xMDMwMF9EQ0FDSEVfSU5WX1JBTkdFX0lOVFJfTE9HMl9JTlRFUlZBTCkgLSAxKQorCisjaWYgbW4xMDMwMF9kY2FjaGVfaW52X3JhbmdlX2ludHJfaW50ZXJ2YWwgPiAweGZmCisjZXJyb3IgTU4xMDMwMF9EQ0FDSEVfSU5WX1JBTkdFX0lOVFJfTE9HMl9JTlRFUlZBTCBtdXN0IGJlIDggb3IgbGVzcworI2VuZGlmCisKKwkuYW0zM18yCisKKwkuZ2xvYmwgbW4xMDMwMF9pY2FjaGVfaW52CisJLmdsb2JsIG1uMTAzMDBfZGNhY2hlX2ludgorCS5nbG9ibCBtbjEwMzAwX2RjYWNoZV9pbnZfcmFuZ2UKKwkuZ2xvYmwgbW4xMDMwMF9kY2FjaGVfaW52X3JhbmdlMgorCS5nbG9ibCBtbjEwMzAwX2RjYWNoZV9pbnZfcGFnZQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHZvaWQgbW4xMDMwMF9pY2FjaGVfaW52KHZvaWQpCisjIEludmFsaWRhdGUgdGhlIGVudGlyZSBpY2FjaGUKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwlBTElHTgorbW4xMDMwMF9pY2FjaGVfaW52OgorCW1vdglDSENUUixhMAorCisJbW92aHUJKGEwKSxkMAorCWJ0c3QJQ0hDVFJfSUNFTixkMAorCWJlcQltbjEwMzAwX2ljYWNoZV9pbnZfZW5kCisKKwltb3YJZXBzdyxkMQorCWFuZAl+RVBTV19JRSxlcHN3CisJbm9wCisJbm9wCisKKwkjIGRpc2FibGUgdGhlIGljYWNoZQorCWFuZAl+Q0hDVFJfSUNFTixkMAorCW1vdmh1CWQwLChhMCkKKworCSMgYW5kIHdhaXQgZm9yIGl0IHRvIGNhbG0gZG93bgorCXNldGxiCisJbW92aHUJKGEwKSxkMAorCWJ0c3QJQ0hDVFJfSUNCVVNZLGQwCisJbG5lCisKKwkjIGludmFsaWRhdGUKKwlvcglDSENUUl9JQ0lOVixkMAorCW1vdmh1CWQwLChhMCkKKworCSMgd2FpdCBmb3IgdGhlIGNhY2hlIHRvIGZpbmlzaAorCW1vdglDSENUUixhMAorCXNldGxiCisJbW92aHUJKGEwKSxkMAorCWJ0c3QJQ0hDVFJfSUNCVVNZLGQwCisJbG5lCisKKwkjIGFuZCByZWVuYWJsZSBpdAorCWFuZAl+Q0hDVFJfSUNJTlYsZDAKKwlvcglDSENUUl9JQ0VOLGQwCisJbW92aHUJZDAsKGEwKQorCW1vdmh1CShhMCksZDAKKworCW1vdglkMSxlcHN3CisKK21uMTAzMDBfaWNhY2hlX2ludl9lbmQ6CisJcmV0CVtdLDAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB2b2lkIG1uMTAzMDBfZGNhY2hlX2ludih2b2lkKQorIyBJbnZhbGlkYXRlIHRoZSBlbnRpcmUgZGNhY2hlCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJQUxJR04KK21uMTAzMDBfZGNhY2hlX2ludjoKKwltb3YJQ0hDVFIsYTAKKworCW1vdmh1CShhMCksZDAKKwlidHN0CUNIQ1RSX0RDRU4sZDAKKwliZXEJbW4xMDMwMF9kY2FjaGVfaW52X2VuZAorCisJbW92CWVwc3csZDEKKwlhbmQJfkVQU1dfSUUsZXBzdworCW5vcAorCW5vcAorCisJIyBkaXNhYmxlIHRoZSBkY2FjaGUKKwlhbmQJfkNIQ1RSX0RDRU4sZDAKKwltb3ZodQlkMCwoYTApCisKKwkjIGFuZCB3YWl0IGZvciBpdCB0byBjYWxtIGRvd24KKwlzZXRsYgorCW1vdmh1CShhMCksZDAKKwlidHN0CUNIQ1RSX0RDQlVTWSxkMAorCWxuZQorCisJIyBpbnZhbGlkYXRlCisJb3IJQ0hDVFJfRENJTlYsZDAKKwltb3ZodQlkMCwoYTApCisKKwkjIHdhaXQgZm9yIHRoZSBjYWNoZSB0byBmaW5pc2gKKwltb3YJQ0hDVFIsYTAKKwlzZXRsYgorCW1vdmh1CShhMCksZDAKKwlidHN0CUNIQ1RSX0RDQlVTWSxkMAorCWxuZQorCisJIyBhbmQgcmVlbmFibGUgaXQKKwlhbmQJfkNIQ1RSX0RDSU5WLGQwCisJb3IJQ0hDVFJfRENFTixkMAorCW1vdmh1CWQwLChhMCkKKwltb3ZodQkoYTApLGQwCisKKwltb3YJZDEsZXBzdworCittbjEwMzAwX2RjYWNoZV9pbnZfZW5kOgorCXJldAlbXSwwCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgdm9pZCBtbjEwMzAwX2RjYWNoZV9pbnZfcmFuZ2UodW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGVuZCkKKyMgdm9pZCBtbjEwMzAwX2RjYWNoZV9pbnZfcmFuZ2UyKHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBzaXplKQorIyB2b2lkIG1uMTAzMDBfZGNhY2hlX2ludl9wYWdlKHVuc2lnbmVkIHN0YXJ0KQorIyBJbnZhbGlkYXRlIGEgcmFuZ2Ugb2YgYWRkcmVzc2VzIG9uIGEgcGFnZSBpbiB0aGUgZGNhY2hlCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJQUxJR04KK21uMTAzMDBfZGNhY2hlX2ludl9wYWdlOgorCW1vdglQQUdFX1NJWkUsZDEKK21uMTAzMDBfZGNhY2hlX2ludl9yYW5nZTI6CisJYWRkCWQwLGQxCittbjEwMzAwX2RjYWNoZV9pbnZfcmFuZ2U6CisJbW92bQlbZDIsZDMsYTJdLChzcCkKKwltb3YJQ0hDVFIsYTIKKworCW1vdmh1CShhMiksZDIKKwlidHN0CUNIQ1RSX0RDRU4sZDIKKwliZXEJbW4xMDMwMF9kY2FjaGVfaW52X3JhbmdlX2VuZAorCisJYW5kCUwxX0NBQ0hFX1RBR19BRERSRVNTfEwxX0NBQ0hFX1RBR19FTlRSWSxkMAkjIHJvdW5kIHN0YXJ0CisJCQkJCQkJCSMgYWRkciBkb3duCisJbW92CWQwLGExCisKKwlhZGQJTDFfQ0FDSEVfQllURVMsZDEJCQkjIHJvdW5kIGVuZCBhZGRyIHVwCisJYW5kCUwxX0NBQ0hFX1RBR19BRERSRVNTfEwxX0NBQ0hFX1RBR19FTlRSWSxkMQorCisJY2xyCWQyCQkJCSMgd2UncmUgZ29pbmcgdG8gY2xlYXIgdGFnIHJhbQorCQkJCQkJIyBlbnRyaWVzCisKKwkjIHJlYWQgdGhlIHRhZ3MgZnJvbSB0aGUgdGFnIFJBTSwgYW5kIGlmIHRoZXkgaW5kaWNhdGUgYSB2YWxpZCBkaXJ0eQorCSMgY2FjaGUgbGluZSB0aGVuIGludmFsaWRhdGUgdGhhdCBsaW5lCisJbW92CURDQUNIRV9UQUcoMCwwKSxhMAorCW1vdglhMSxkMAorCWFuZAlMMV9DQUNIRV9UQUdfRU5UUlksZDAKKwlhZGQJZDAsYTAJCQkJIyBzdGFydGluZyBkY2FjaGUgdGFnIFJBTQorCQkJCQkJIyBhY2Nlc3MgYWRkcmVzcworCisJc3ViCWExLGQxCisJbHNyCUwxX0NBQ0hFX1NISUZULGQxCQkjIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIHRvCisJCQkJCQkjIGV4YW1pbmUKKworCWFuZAl+KEwxX0NBQ0hFX0RJU1BBUklUWS0xKSxhMQkjIGRldGVybWluZSBjb21wYXJhdG9yIGJhc2UKKworbW4xMDMwMF9kY2FjaGVfaW52X3JhbmdlX291dGVyX2xvb3A6CisJIyBkaXNhYmxlIGludGVycnVwdHMKKwltb3YJZXBzdyxkMworCWFuZAl+RVBTV19JRSxlcHN3CisJbm9wCQkJCQkjIG5vdGUgdGhhdCByZWFkaW5nIENIQ1RSIGFuZAorCQkJCQkJIyBBTkQnaW5nIEQwIG9jY3VweSB0d28gZGVsYXkKKwkJCQkJCSMgc2xvdHMgYWZ0ZXIgZGlzYWJsaW5nCisJCQkJCQkjIGludGVycnVwdHMKKworCSMgZGlzYWJsZSB0aGUgZGNhY2hlCisJbW92aHUJKGEyKSxkMAorCWFuZAl+Q0hDVFJfRENFTixkMAorCW1vdmh1CWQwLChhMikKKworCSMgYW5kIHdhaXQgZm9yIGl0IHRvIGNhbG0gZG93bgorCXNldGxiCisJbW92aHUJKGEyKSxkMAorCWJ0c3QJQ0hDVFJfRENCVVNZLGQwCisJbG5lCisKK21uMTAzMDBfZGNhY2hlX2ludl9yYW5nZV9sb29wOgorCisJIyBwcm9jZXNzIHRoZSB3YXkgMCBzbG90CisJbW92CShMMV9DQUNIRV9XQVlESVNQKjAsYTApLGQwCSMgcmVhZCB0aGUgdGFnIGluIHRoZSB3YXkgMCBzbG90CisJYnRzdAlMMV9DQUNIRV9UQUdfVkFMSUQsZDAKKwliZXEJbW4xMDMwMF9kY2FjaGVfaW52X3JhbmdlX3NraXBfMAkjIGp1bXAgaWYgdGhpcyBjYWNoZWxpbmUgaXMgbm90CisJCQkJCQkjIHZhbGlkCisKKwl4b3IJYTEsZDAKKwlsc3IJMTIsZDAKKwlibmUJbW4xMDMwMF9kY2FjaGVfaW52X3JhbmdlX3NraXBfMAkjIGp1bXAgaWYgbm90IHRoaXMgY2FjaGVsaW5lCisKKwltb3YJZDIsKGEwKQkJCQkjIGtpbGwgdGhlIHRhZworCittbjEwMzAwX2RjYWNoZV9pbnZfcmFuZ2Vfc2tpcF8wOgorCisJIyBwcm9jZXNzIHRoZSB3YXkgMSBzbG90CisJbW92CShMMV9DQUNIRV9XQVlESVNQKjEsYTApLGQwCSMgcmVhZCB0aGUgdGFnIGluIHRoZSB3YXkgMSBzbG90CisJYnRzdAlMMV9DQUNIRV9UQUdfVkFMSUQsZDAKKwliZXEJbW4xMDMwMF9kY2FjaGVfaW52X3JhbmdlX3NraXBfMQkjIGp1bXAgaWYgdGhpcyBjYWNoZWxpbmUgaXMgbm90CisJCQkJCQkjIHZhbGlkCisKKwl4b3IJYTEsZDAKKwlsc3IJMTIsZDAKKwlibmUJbW4xMDMwMF9kY2FjaGVfaW52X3JhbmdlX3NraXBfMQkjIGp1bXAgaWYgbm90IHRoaXMgY2FjaGVsaW5lCisKKwltb3YJZDIsKGEwKQkJCQkjIGtpbGwgdGhlIHRhZworCittbjEwMzAwX2RjYWNoZV9pbnZfcmFuZ2Vfc2tpcF8xOgorCisJIyBwcm9jZXNzIHRoZSB3YXkgMiBzbG90CisJbW92CShMMV9DQUNIRV9XQVlESVNQKjIsYTApLGQwCSMgcmVhZCB0aGUgdGFnIGluIHRoZSB3YXkgMiBzbG90CisJYnRzdAlMMV9DQUNIRV9UQUdfVkFMSUQsZDAKKwliZXEJbW4xMDMwMF9kY2FjaGVfaW52X3JhbmdlX3NraXBfMgkjIGp1bXAgaWYgdGhpcyBjYWNoZWxpbmUgaXMgbm90CisJCQkJCQkjIHZhbGlkCisKKwl4b3IJYTEsZDAKKwlsc3IJMTIsZDAKKwlibmUJbW4xMDMwMF9kY2FjaGVfaW52X3JhbmdlX3NraXBfMgkjIGp1bXAgaWYgbm90IHRoaXMgY2FjaGVsaW5lCisKKwltb3YJZDIsKGEwKQkJCQkjIGtpbGwgdGhlIHRhZworCittbjEwMzAwX2RjYWNoZV9pbnZfcmFuZ2Vfc2tpcF8yOgorCisJIyBwcm9jZXNzIHRoZSB3YXkgMyBzbG90CisJbW92CShMMV9DQUNIRV9XQVlESVNQKjMsYTApLGQwCSMgcmVhZCB0aGUgdGFnIGluIHRoZSB3YXkgMyBzbG90CisJYnRzdAlMMV9DQUNIRV9UQUdfVkFMSUQsZDAKKwliZXEJbW4xMDMwMF9kY2FjaGVfaW52X3JhbmdlX3NraXBfMwkjIGp1bXAgaWYgdGhpcyBjYWNoZWxpbmUgaXMgbm90CisJCQkJCQkjIHZhbGlkCisKKwl4b3IJYTEsZDAKKwlsc3IJMTIsZDAKKwlibmUJbW4xMDMwMF9kY2FjaGVfaW52X3JhbmdlX3NraXBfMwkjIGp1bXAgaWYgbm90IHRoaXMgY2FjaGVsaW5lCisKKwltb3YJZDIsKGEwKQkJCQkjIGtpbGwgdGhlIHRhZworCittbjEwMzAwX2RjYWNoZV9pbnZfcmFuZ2Vfc2tpcF8zOgorCisJIyBhcHByb3ggZXZlcnkgTiBzdGVwcyB3ZSByZS1lbmFibGUgdGhlIGNhY2hlIGFuZCBzZWUgaWYgdGhlcmUgYXJlIGFueQorCSMgaW50ZXJydXB0cyB0byBiZSBwcm9jZXNzZWQKKwkjIHdlIGFsc28gYnJlYWsgb3V0IGlmIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbG9vcAorCSMgKHRoZSBib3R0b20gbmliYmxlIG9mIHRoZSBjb3VudCBpcyB6ZXJvIGluIGJvdGggY2FzZXMpCisJYWRkCUwxX0NBQ0hFX0JZVEVTLGEwCisJYWRkCUwxX0NBQ0hFX0JZVEVTLGExCisJYWRkCS0xLGQxCisJYnRzdAltbjEwMzAwX2RjYWNoZV9pbnZfcmFuZ2VfaW50cl9pbnRlcnZhbCxkMQorCWJuZQltbjEwMzAwX2RjYWNoZV9pbnZfcmFuZ2VfbG9vcAorCisJIyB3YWl0IGZvciB0aGUgY2FjaGUgdG8gZmluaXNoIHdoYXQgaXQncyBkb2luZworCXNldGxiCisJbW92aHUJKGEyKSxkMAorCWJ0c3QJQ0hDVFJfRENCVVNZLGQwCisJbG5lCisKKwkjIGFuZCByZWVuYWJsZSBpdAorCW9yCUNIQ1RSX0RDRU4sZDAKKwltb3ZodQlkMCwoYTIpCisJbW92aHUJKGEyKSxkMAorCisJIyByZS1lbmFibGUgaW50ZXJydXB0cworCSMgLSB3ZSBkb24ndCBib3RoZXIgd2l0aCBkZWxheSBOT1BzIGFzIHdlJ2xsIGhhdmUgZW5vdWdoIGluc3RydWN0aW9ucworCSMgICBiZWZvcmUgd2UgZGlzYWJsZSBpbnRlcnJ1cHRzIGFnYWluIHRvIGdpdmUgdGhlIGludGVycnVwdHMgYSBjaGFuY2UKKwkjICAgdG8gaGFwcGVuCisJbW92CWQzLGVwc3cKKworCSMgZ28gYXJvdW5kIGFnYWluIGlmIHRoZSBjb3VudGVyIGhhc24ndCB5ZXQgcmVhY2hlZCB6ZXJvCisJYWRkCTAsZDEKKwlibmUJbW4xMDMwMF9kY2FjaGVfaW52X3JhbmdlX291dGVyX2xvb3AKKworbW4xMDMwMF9kY2FjaGVfaW52X3JhbmdlX2VuZDoKKwlyZXQJW2QyLGQzLGEyXSwxMgpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL21tL2NhY2hlLmMgYi9hcmNoL21uMTAzMDAvbW0vY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjc2NzE5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL21tL2NhY2hlLmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qIE1OMTAzMDAgQ2FjaGUgZmx1c2hpbmcgcm91dGluZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK0VYUE9SVF9TWU1CT0wobW4xMDMwMF9pY2FjaGVfaW52KTsKK0VYUE9SVF9TWU1CT0wobW4xMDMwMF9kY2FjaGVfaW52KTsKK0VYUE9SVF9TWU1CT0wobW4xMDMwMF9kY2FjaGVfaW52X3JhbmdlKTsKK0VYUE9SVF9TWU1CT0wobW4xMDMwMF9kY2FjaGVfaW52X3JhbmdlMik7CitFWFBPUlRfU1lNQk9MKG1uMTAzMDBfZGNhY2hlX2ludl9wYWdlKTsKKworI2lmZGVmIENPTkZJR19NTjEwMzAwX0NBQ0hFX1dCQUNLCitFWFBPUlRfU1lNQk9MKG1uMTAzMDBfZGNhY2hlX2ZsdXNoKTsKK0VYUE9SVF9TWU1CT0wobW4xMDMwMF9kY2FjaGVfZmx1c2hfaW52KTsKK0VYUE9SVF9TWU1CT0wobW4xMDMwMF9kY2FjaGVfZmx1c2hfaW52X3JhbmdlKTsKK0VYUE9SVF9TWU1CT0wobW4xMDMwMF9kY2FjaGVfZmx1c2hfaW52X3JhbmdlMik7CitFWFBPUlRfU1lNQk9MKG1uMTAzMDBfZGNhY2hlX2ZsdXNoX2ludl9wYWdlKTsKK0VYUE9SVF9TWU1CT0wobW4xMDMwMF9kY2FjaGVfZmx1c2hfcmFuZ2UpOworRVhQT1JUX1NZTUJPTChtbjEwMzAwX2RjYWNoZV9mbHVzaF9yYW5nZTIpOworRVhQT1JUX1NZTUJPTChtbjEwMzAwX2RjYWNoZV9mbHVzaF9wYWdlKTsKKyNlbmRpZgorCisvKgorICogd3JpdGUgYSBwYWdlIGJhY2sgZnJvbSB0aGUgZGNhY2hlIGFuZCBpbnZhbGlkYXRlIHRoZSBpY2FjaGUgc28gdGhhdCB3ZSBjYW4KKyAqIHJ1biBjb2RlIGZyb20gaXQgdGhhdCB3ZSd2ZSBqdXN0IHdyaXR0ZW4gaW50byBpdAorICovCit2b2lkIGZsdXNoX2ljYWNoZV9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwltbjEwMzAwX2RjYWNoZV9mbHVzaF9wYWdlKHBhZ2VfdG9fcGh5cyhwYWdlKSk7CisJbW4xMDMwMF9pY2FjaGVfaW52KCk7Cit9CitFWFBPUlRfU1lNQk9MKGZsdXNoX2ljYWNoZV9wYWdlKTsKKworLyoKKyAqIHdyaXRlIHNvbWUgY29kZSB3ZSd2ZSBqdXN0IHdyaXR0ZW4gYmFjayBmcm9tIHRoZSBkY2FjaGUgYW5kIGludmFsaWRhdGUgdGhlCisgKiBpY2FjaGUgc28gdGhhdCB3ZSBjYW4gcnVuIHRoYXQgY29kZQorICovCit2b2lkIGZsdXNoX2ljYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKyNpZmRlZiBDT05GSUdfTU4xMDMwMF9DQUNIRV9XQkFDSworCXVuc2lnbmVkIGxvbmcgYWRkciwgc2l6ZSwgb2ZmOworCXN0cnVjdCBwYWdlICpwYWdlOworCXBnZF90ICpwZ2Q7CisJcHVkX3QgKnB1ZDsKKwlwbWRfdCAqcG1kOworCXB0ZV90ICpwcHRlLCBwdGU7CisKKwlmb3IgKDsgc3RhcnQgPCBlbmQ7IHN0YXJ0ICs9IHNpemUpIHsKKwkJLyogd29yayBvdXQgaG93IG11Y2ggb2YgdGhlIHBhZ2UgdG8gZmx1c2ggKi8KKwkJb2ZmID0gc3RhcnQgJiAoUEFHRV9TSVpFIC0gMSk7CisKKwkJc2l6ZSA9IGVuZCAtIHN0YXJ0OworCQlpZiAoc2l6ZSA+IFBBR0VfU0laRSAtIG9mZikKKwkJCXNpemUgPSBQQUdFX1NJWkUgLSBvZmY7CisKKwkJLyogZ2V0IHRoZSBwaHlzaWNhbCBhZGRyZXNzIHRoZSBwYWdlIGlzIG1hcHBlZCB0byBmcm9tIHRoZSBwYWdlCisJCSAqIHRhYmxlcyAqLworCQlwZ2QgPSBwZ2Rfb2Zmc2V0KGN1cnJlbnQtPm1tLCBzdGFydCk7CisJCWlmICghcGdkIHx8ICFwZ2RfdmFsKCpwZ2QpKQorCQkJY29udGludWU7CisKKwkJcHVkID0gcHVkX29mZnNldChwZ2QsIHN0YXJ0KTsKKwkJaWYgKCFwdWQgfHwgIXB1ZF92YWwoKnB1ZCkpCisJCQljb250aW51ZTsKKworCQlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgc3RhcnQpOworCQlpZiAoIXBtZCB8fCAhcG1kX3ZhbCgqcG1kKSkKKwkJCWNvbnRpbnVlOworCisJCXBwdGUgPSBwdGVfb2Zmc2V0X21hcChwbWQsIHN0YXJ0KTsKKwkJaWYgKCFwcHRlKQorCQkJY29udGludWU7CisJCXB0ZSA9ICpwcHRlOworCQlwdGVfdW5tYXAocHB0ZSk7CisKKwkJaWYgKHB0ZV9ub25lKHB0ZSkpCisJCQljb250aW51ZTsKKworCQlwYWdlID0gcHRlX3BhZ2UocHRlKTsKKwkJaWYgKCFwYWdlKQorCQkJY29udGludWU7CisKKwkJYWRkciA9IHBhZ2VfdG9fcGh5cyhwYWdlKTsKKworCQkvKiBmbHVzaCB0aGUgZGNhY2hlIGFuZCBpbnZhbGlkYXRlIHRoZSBpY2FjaGUgY292ZXJhZ2Ugb24gdGhhdAorCQkgKiByZWdpb24gKi8KKwkJbW4xMDMwMF9kY2FjaGVfZmx1c2hfcmFuZ2UyKGFkZHIgKyBvZmYsIHNpemUpOworCX0KKyNlbmRpZgorCisJbW4xMDMwMF9pY2FjaGVfaW52KCk7Cit9CitFWFBPUlRfU1lNQk9MKGZsdXNoX2ljYWNoZV9yYW5nZSk7CisKKy8qCisgKiBhbGxvdyB1c2Vyc3BhY2UgdG8gZmx1c2ggdGhlIGluc3RydWN0aW9uIGNhY2hlCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfY2FjaGVmbHVzaCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwlpZiAoZW5kIDwgc3RhcnQpCisJCXJldHVybiAtRUlOVkFMOworCisJZmx1c2hfaWNhY2hlX3JhbmdlKHN0YXJ0LCBlbmQpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL21tL2RtYS1hbGxvYy5jIGIvYXJjaC9tbjEwMzAwL21tL2RtYS1hbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNjQ5ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAvbW0vZG1hLWFsbG9jLmMKQEAgLTAsMCArMSw1NiBAQAorLyogTU4xMDMwMCBEeW5hbWljIERNQSBtYXBwaW5nIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICogRGVyaXZlZCBmcm9tOiBhcmNoL2kzODYva2VybmVsL3BjaS1kbWEuYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKwordm9pZCAqZG1hX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgaW50IGdmcCkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdm9pZCAqcmV0OworCisJLyogaWdub3JlIHJlZ2lvbiBzcGVjaWZpZXJzICovCisJZ2ZwICY9IH4oX19HRlBfRE1BIHwgX19HRlBfSElHSE1FTSk7CisKKwlpZiAoZGV2ID09IE5VTEwgfHwgZGV2LT5jb2hlcmVudF9kbWFfbWFzayA8IDB4ZmZmZmZmZmYpCisJCWdmcCB8PSBHRlBfRE1BOworCisJYWRkciA9IF9fZ2V0X2ZyZWVfcGFnZXMoZ2ZwLCBnZXRfb3JkZXIoc2l6ZSkpOworCWlmICghYWRkcikKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBtYXAgdGhlIGNvaGVyZW50IG1lbW9yeSB0aHJvdWdoIHRoZSB1bmNhY2hlZCBtZW1vcnkgd2luZG93ICovCisJcmV0ID0gKHZvaWQgKikgKGFkZHIgfCAweDIwMDAwMDAwKTsKKworCS8qIGZpbGwgdGhlIG1lbW9yeSB3aXRoIG9idmlvdXMgcnViYmlzaCAqLworCW1lbXNldCgodm9pZCAqKSBhZGRyLCAweGZiLCBzaXplKTsKKworCS8qIHdyaXRlIGJhY2sgYW5kIGV2aWN0IGFsbCBjYWNoZSBsaW5lcyBjb3ZlcmluZyB0aGlzIHJlZ2lvbiAqLworCW1uMTAzMDBfZGNhY2hlX2ZsdXNoX2ludl9yYW5nZTIodmlydF90b19waHlzKCh2b2lkICopIGFkZHIpLCBQQUdFX1NJWkUpOworCisJKmRtYV9oYW5kbGUgPSB2aXJ0X3RvX2J1cygodm9pZCAqKSBhZGRyKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChkbWFfYWxsb2NfY29oZXJlbnQpOworCit2b2lkIGRtYV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIHZvaWQgKnZhZGRyLAorCQkgICAgICAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlKQoreworCXVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKSB2YWRkciAmIH4weDIwMDAwMDAwOworCisJZnJlZV9wYWdlcyhhZGRyLCBnZXRfb3JkZXIoc2l6ZSkpOworfQorRVhQT1JUX1NZTUJPTChkbWFfZnJlZV9jb2hlcmVudCk7CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvbW0vZXh0YWJsZS5jIGIvYXJjaC9tbjEwMzAwL21tL2V4dGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWU1NDg1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL21tL2V4dGFibGUuYwpAQCAtMCwwICsxLDI2IEBACisvKiBNTjEwMzAwIEluLWtlcm5lbCBleGNlcHRpb24gaGFuZGxpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWF0c3VzaGl0YSBFbGVjdHJpYyBJbmR1c3RyaWFsIENvLiwgTHRkLgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitpbnQgZml4dXBfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKmZpeHVwOworCisJZml4dXAgPSBzZWFyY2hfZXhjZXB0aW9uX3RhYmxlcyhyZWdzLT5wYyk7CisJaWYgKGZpeHVwKSB7CisJCXJlZ3MtPnBjID0gZml4dXAtPmZpeHVwOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9tbS9mYXVsdC5jIGIvYXJjaC9tbjEwMzAwL21tL2ZhdWx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmMDkyYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9tbS9mYXVsdC5jCkBAIC0wLDAgKzEsNDA1IEBACisvKiBNTjEwMzAwIE1NVSBGYXVsdCBoYW5kbGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1hdHN1c2hpdGEgRWxlY3RyaWMgSW5kdXN0cmlhbCBDby4sIEx0ZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBNb2RpZmllZCBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Z0X2tlcm4uaD4JCS8qIEZvciB1bmJsYW5rX3NjcmVlbigpICovCisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9oYXJkaXJxLmg+CisjaW5jbHVkZSA8YXNtL2dkYi1zdHViLmg+CisjaW5jbHVkZSA8YXNtL2NwdS1yZWdzLmg+CisKKy8qCisgKiBVbmxvY2sgYW55IHNwaW5sb2NrcyB3aGljaCB3aWxsIHByZXZlbnQgdXMgZnJvbSBnZXR0aW5nIHRoZQorICogbWVzc2FnZSBvdXQKKyAqLwordm9pZCBidXN0X3NwaW5sb2NrcyhpbnQgeWVzKQoreworCWlmICh5ZXMpIHsKKwkJb29wc19pbl9wcm9ncmVzcyA9IDE7CisjaWZkZWYgQ09ORklHX1NNUAorCQkvKiBNYW55IHNlcmlhbCBkcml2ZXJzIGRvIF9fZ2xvYmFsX2NsaSgpICovCisJCWdsb2JhbF9pcnFfbG9jayA9IDA7CisjZW5kaWYKKwl9IGVsc2UgeworCQlpbnQgbG9nbGV2ZWxfc2F2ZSA9IGNvbnNvbGVfbG9nbGV2ZWw7CisjaWZkZWYgQ09ORklHX1ZUCisJCXVuYmxhbmtfc2NyZWVuKCk7CisjZW5kaWYKKwkJb29wc19pbl9wcm9ncmVzcyA9IDA7CisJCS8qCisJCSAqIE9LLCB0aGUgbWVzc2FnZSBpcyBvbiB0aGUgY29uc29sZS4gIE5vdyB3ZSBjYWxsIHByaW50aygpCisJCSAqIHdpdGhvdXQgb29wc19pbl9wcm9ncmVzcyBzZXQgc28gdGhhdCBwcmludGsgd2lsbCBnaXZlIGtsb2dkCisJCSAqIGEgcG9rZS4gIEhvbGQgb250byB5b3VyIGhhdHMuLi4KKwkJICovCisJCWNvbnNvbGVfbG9nbGV2ZWwgPSAxNTsJLyogTk1JIG9vcHNlciBtYXkgaGF2ZSBzaHV0IHRoZSBjb25zb2xlCisJCQkJCSAqIHVwICovCisJCXByaW50aygiICIpOworCQljb25zb2xlX2xvZ2xldmVsID0gbG9nbGV2ZWxfc2F2ZTsKKwl9Cit9CisKK3ZvaWQgZG9fQlVHKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQoreworCWJ1c3Rfc3BpbmxvY2tzKDEpOworCXByaW50ayhLRVJOX0VNRVJHICItLS0tLS0tLS0tLS1bIGN1dCBoZXJlIF0tLS0tLS0tLS0tLS1cbiIpOworCXByaW50ayhLRVJOX0VNRVJHICJrZXJuZWwgQlVHIGF0ICVzOiVkIVxuIiwgZmlsZSwgbGluZSk7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBwcmludF9wYWdldGFibGVfZW50cmllcyhwZ2RfdCAqcGdkaXIsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlwZ2RfdCAqcGdkOworCXBtZF90ICpwbWQ7CisJcHRlX3QgKnB0ZTsKKworCXBnZCA9IHBnZGlyICsgX19wZ2Rfb2Zmc2V0KGFkZHJlc3MpOworCXByaW50ayhLRVJOX0RFQlVHICJwZ2QgZW50cnkgJXA6ICUwMTZMeFxuIiwKKwkgICAgICAgcGdkLCAobG9uZyBsb25nKSBwZ2RfdmFsKCpwZ2QpKTsKKworCWlmICghcGdkX3ByZXNlbnQoKnBnZCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBwZ2Qgbm90IHByZXNlbnQhXG4iKTsKKwkJcmV0dXJuOworCX0KKwlwbWQgPSBwbWRfb2Zmc2V0KHBnZCwgYWRkcmVzcyk7CisJcHJpbnRrKEtFUk5fREVCVUcgInBtZCBlbnRyeSAlcDogJTAxNkx4XG4iLAorCSAgICAgICBwbWQsIChsb25nIGxvbmcpcG1kX3ZhbCgqcG1kKSk7CisKKwlpZiAoIXBtZF9wcmVzZW50KCpwbWQpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIuLi4gcG1kIG5vdCBwcmVzZW50IVxuIik7CisJCXJldHVybjsKKwl9CisJcHRlID0gcHRlX29mZnNldChwbWQsIGFkZHJlc3MpOworCXByaW50ayhLRVJOX0RFQlVHICJwdGUgZW50cnkgJXA6ICUwMTZMeFxuIiwKKwkgICAgICAgcHRlLCAobG9uZyBsb25nKSBwdGVfdmFsKCpwdGUpKTsKKworCWlmICghcHRlX3ByZXNlbnQoKnB0ZSkpCisJCXByaW50ayhLRVJOX0RFQlVHICIuLi4gcHRlIG5vdCBwcmVzZW50IVxuIik7Cit9CisjZW5kaWYKKworYXNtbGlua2FnZSB2b2lkIG1vbml0b3Jfc2lnbmFsKHN0cnVjdCBwdF9yZWdzICopOworCisvKgorICogVGhpcyByb3V0aW5lIGhhbmRsZXMgcGFnZSBmYXVsdHMuICBJdCBkZXRlcm1pbmVzIHRoZSBhZGRyZXNzLAorICogYW5kIHRoZSBwcm9ibGVtLCBhbmQgdGhlbiBwYXNzZXMgaXQgb2ZmIHRvIG9uZSBvZiB0aGUgYXBwcm9wcmlhdGUKKyAqIHJvdXRpbmVzLgorICoKKyAqIGZhdWx0X2NvZGU6CisgKiAtIExTVzogZWl0aGVyIE1NVUZDUl9JRkMgb3IgTU1VRkNSX0RGQyBhcyBhcHByb3ByaWF0ZQorICogLSBNU1c6IDAgaWYgZGF0YSBhY2Nlc3MsIDEgaWYgaW5zdHJ1Y3Rpb24gYWNjZXNzCisgKiAtIGJpdCAwOiBUTEIgbWlzcyBmbGFnCisgKiAtIGJpdCAxOiBpbml0aWFsIHdyaXRlCisgKiAtIGJpdCAyOiBwYWdlIGludmFsaWQKKyAqIC0gYml0IDM6IHByb3RlY3Rpb24gdmlvbGF0aW9uCisgKiAtIGJpdCA0OiBhY2Nlc3NvciAoMD11c2VyIDE9a2VybmVsKQorICogLSBiaXQgNTogMD1yZWFkIDE9d3JpdGUKKyAqIC0gYml0IDYtODogcGFnZSBwcm90ZWN0aW9uIHNwZWMKKyAqIC0gYml0IDk6IGlsbGVnYWwgYWRkcmVzcworICogLSBiaXQgMTY6IDA9ZGF0YSAxPWlucworICoKKyAqLworYXNtbGlua2FnZSB2b2lkIGRvX3BhZ2VfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgZmF1bHRfY29kZSwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKwl1bnNpZ25lZCBsb25nIHBhZ2U7CisJc2lnaW5mb190IGluZm87CisJaW50IHdyaXRlLCBmYXVsdDsKKworI2lmZGVmIENPTkZJR19HREJTVFVCCisJLyogaGFuZGxlIEdEQiBzdHViIGNhdXNpbmcgYSBmYXVsdCAqLworCWlmIChnZGJzdHViX2J1c3kpIHsKKwkJZ2Ric3R1Yl9leGNlcHRpb24ocmVncywgVEJSICYgVEJSX0lOVF9DT0RFKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisjaWYgMAorCXByaW50ayhLRVJOX0RFQlVHICItLS0gZG9fcGFnZV9mYXVsdCglcCwlczolMDRseCwlMDhseClcbiIsCisJICAgICAgIHJlZ3MsCisJICAgICAgIGZhdWx0X2NvZGUgJiAweDEwMDAwID8gImlucyIgOiAiZGF0YSIsCisJICAgICAgIGZhdWx0X2NvZGUgJiAweGZmZmYsIGFkZHJlc3MpOworI2VuZGlmCisKKwl0c2sgPSBjdXJyZW50OworCisJLyoKKwkgKiBXZSBmYXVsdC1pbiBrZXJuZWwtc3BhY2UgdmlydHVhbCBtZW1vcnkgb24tZGVtYW5kLiBUaGUKKwkgKiAncmVmZXJlbmNlJyBwYWdlIHRhYmxlIGlzIGluaXRfbW0ucGdkLgorCSAqCisJICogTk9URSEgV2UgTVVTVCBOT1QgdGFrZSBhbnkgbG9ja3MgZm9yIHRoaXMgY2FzZS4gV2UgbWF5CisJICogYmUgaW4gYW4gaW50ZXJydXB0IG9yIGEgY3JpdGljYWwgcmVnaW9uLCBhbmQgc2hvdWxkCisJICogb25seSBjb3B5IHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBtYXN0ZXIgcGFnZSB0YWJsZSwKKwkgKiBub3RoaW5nIG1vcmUuCisJICoKKwkgKiBUaGlzIHZlcmlmaWVzIHRoYXQgdGhlIGZhdWx0IGhhcHBlbnMgaW4ga2VybmVsIHNwYWNlCisJICogYW5kIHRoYXQgdGhlIGZhdWx0IHdhcyBhIHBhZ2Ugbm90IHByZXNlbnQgKGludmFsaWQpIGVycm9yCisJICovCisJaWYgKGFkZHJlc3MgPj0gVk1BTExPQ19TVEFSVCAmJiBhZGRyZXNzIDwgVk1BTExPQ19FTkQgJiYKKwkgICAgKGZhdWx0X2NvZGUgJiBNTVVGQ1JfeEZDX0FDQ0VTUykgPT0gTU1VRkNSX3hGQ19BQ0NFU1NfU1IgJiYKKwkgICAgKGZhdWx0X2NvZGUgJiBNTVVGQ1JfeEZDX1BHSU5WQUwpID09IE1NVUZDUl94RkNfUEdJTlZBTAorCSAgICApCisJCWdvdG8gdm1hbGxvY19mYXVsdDsKKworCW1tID0gdHNrLT5tbTsKKwlpbmZvLnNpX2NvZGUgPSBTRUdWX01BUEVSUjsKKworCS8qCisJICogSWYgd2UncmUgaW4gYW4gaW50ZXJydXB0IG9yIGhhdmUgbm8gdXNlcgorCSAqIGNvbnRleHQsIHdlIG11c3Qgbm90IHRha2UgdGhlIGZhdWx0Li4KKwkgKi8KKwlpZiAoaW5faW50ZXJydXB0KCkgfHwgIW1tKQorCQlnb3RvIG5vX2NvbnRleHQ7CisKKwlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisKKwl2bWEgPSBmaW5kX3ZtYShtbSwgYWRkcmVzcyk7CisJaWYgKCF2bWEpCisJCWdvdG8gYmFkX2FyZWE7CisJaWYgKHZtYS0+dm1fc3RhcnQgPD0gYWRkcmVzcykKKwkJZ290byBnb29kX2FyZWE7CisJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX0dST1dTRE9XTikpCisJCWdvdG8gYmFkX2FyZWE7CisKKwlpZiAoKGZhdWx0X2NvZGUgJiBNTVVGQ1JfeEZDX0FDQ0VTUykgPT0gTU1VRkNSX3hGQ19BQ0NFU1NfVVNSKSB7CisJCS8qIGFjY2Vzc2luZyB0aGUgc3RhY2sgYmVsb3cgdGhlIHN0YWNrIHBvaW50ZXIgaXMgYWx3YXlzIGEKKwkJICogYnVnICovCisJCWlmICgoYWRkcmVzcyAmIFBBR0VfTUFTSykgKyAyICogUEFHRV9TSVpFIDwgcmVncy0+c3ApIHsKKyNpZiAwCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIlslZF0gIyMjIEFjY2VzcyBiZWxvdyBzdGFjayBAJWx4IChzcD0lbHgpXG4iLAorCQkJICAgICAgIGN1cnJlbnQtPnBpZCwgYWRkcmVzcywgcmVncy0+c3ApOworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJ2bWEgWyUwOHggLSAlMDh4XVxuIiwKKwkJCSAgICAgICB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCk7CisJCQlzaG93X3JlZ2lzdGVycyhyZWdzKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiWyVkXSAjIyMgQ29kZTogWyUwOGx4XSIKKwkJCSAgICAgICAiICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCSAgICAgICBjdXJyZW50LT5waWQsCisJCQkgICAgICAgcmVncy0+cGMsCisJCQkgICAgICAgKCh1OCAqKSByZWdzLT5wYylbMF0sCisJCQkgICAgICAgKCh1OCAqKSByZWdzLT5wYylbMV0sCisJCQkgICAgICAgKCh1OCAqKSByZWdzLT5wYylbMl0sCisJCQkgICAgICAgKCh1OCAqKSByZWdzLT5wYylbM10sCisJCQkgICAgICAgKCh1OCAqKSByZWdzLT5wYylbNF0sCisJCQkgICAgICAgKCh1OCAqKSByZWdzLT5wYylbNV0sCisJCQkgICAgICAgKCh1OCAqKSByZWdzLT5wYylbNl0sCisJCQkgICAgICAgKCh1OCAqKSByZWdzLT5wYylbN10KKwkJCSAgICAgICApOworI2VuZGlmCisJCQlnb3RvIGJhZF9hcmVhOworCQl9CisJfQorCisJaWYgKGV4cGFuZF9zdGFjayh2bWEsIGFkZHJlc3MpKQorCQlnb3RvIGJhZF9hcmVhOworCisvKgorICogT2ssIHdlIGhhdmUgYSBnb29kIHZtX2FyZWEgZm9yIHRoaXMgbWVtb3J5IGFjY2Vzcywgc28KKyAqIHdlIGNhbiBoYW5kbGUgaXQuLgorICovCitnb29kX2FyZWE6CisJaW5mby5zaV9jb2RlID0gU0VHVl9BQ0NFUlI7CisJd3JpdGUgPSAwOworCXN3aXRjaCAoZmF1bHRfY29kZSAmIChNTVVGQ1JfeEZDX1BHSU5WQUx8TU1VRkNSX3hGQ19UWVBFKSkgeworCWRlZmF1bHQ6CS8qIDM6IHdyaXRlLCBwcmVzZW50ICovCisJY2FzZSBNTVVGQ1JfeEZDX1RZUEVfV1JJVEU6CisjaWZkZWYgVEVTVF9WRVJJRllfQVJFQQorCQlpZiAoKGZhdWx0X2NvZGUgJiBNTVVGQ1JfeEZDX0FDQ0VTUykgPT0gTU1VRkNSX3hGQ19BQ0NFU1NfU1IpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiV1AgZmF1bHQgYXQgJTA4bHhcbiIsIHJlZ3MtPnBjKTsKKyNlbmRpZgorCQkvKiB3cml0ZSB0byBhYnNlbnQgcGFnZSAqLworCWNhc2UgTU1VRkNSX3hGQ19QR0lOVkFMIHwgTU1VRkNSX3hGQ19UWVBFX1dSSVRFOgorCQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpKQorCQkJZ290byBiYWRfYXJlYTsKKwkJd3JpdGUrKzsKKwkJYnJlYWs7CisKKwkJLyogcmVhZCBmcm9tIHByb3RlY3RlZCBwYWdlICovCisJY2FzZSBNTVVGQ1JfeEZDX1RZUEVfUkVBRDoKKwkJZ290byBiYWRfYXJlYTsKKworCQkvKiByZWFkIGZyb20gYWJzZW50IHBhZ2UgcHJlc2VudCAqLworCWNhc2UgTU1VRkNSX3hGQ19QR0lOVkFMIHwgTU1VRkNSX3hGQ19UWVBFX1JFQUQ6CisJCWlmICghKHZtYS0+dm1fZmxhZ3MgJiAoVk1fUkVBRCB8IFZNX0VYRUMpKSkKKwkJCWdvdG8gYmFkX2FyZWE7CisJCWJyZWFrOworCX0KKworCS8qCisJICogSWYgZm9yIGFueSByZWFzb24gYXQgYWxsIHdlIGNvdWxkbid0IGhhbmRsZSB0aGUgZmF1bHQsCisJICogbWFrZSBzdXJlIHdlIGV4aXQgZ3JhY2VmdWxseSByYXRoZXIgdGhhbiBlbmRsZXNzbHkgcmVkbworCSAqIHRoZSBmYXVsdC4KKwkgKi8KKwlmYXVsdCA9IGhhbmRsZV9tbV9mYXVsdChtbSwgdm1hLCBhZGRyZXNzLCB3cml0ZSk7CisJaWYgKHVubGlrZWx5KGZhdWx0ICYgVk1fRkFVTFRfRVJST1IpKSB7CisJCWlmIChmYXVsdCAmIFZNX0ZBVUxUX09PTSkKKwkJCWdvdG8gb3V0X29mX21lbW9yeTsKKwkJZWxzZSBpZiAoZmF1bHQgJiBWTV9GQVVMVF9TSUdCVVMpCisJCQlnb3RvIGRvX3NpZ2J1czsKKwkJQlVHKCk7CisJfQorCWlmIChmYXVsdCAmIFZNX0ZBVUxUX01BSk9SKQorCQljdXJyZW50LT5tYWpfZmx0Kys7CisJZWxzZQorCQljdXJyZW50LT5taW5fZmx0Kys7CisKKwl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCXJldHVybjsKKworLyoKKyAqIFNvbWV0aGluZyB0cmllZCB0byBhY2Nlc3MgbWVtb3J5IHRoYXQgaXNuJ3QgaW4gb3VyIG1lbW9yeSBtYXAuLgorICogRml4IGl0LCBidXQgY2hlY2sgaWYgaXQncyBrZXJuZWwgb3IgdXNlciBmaXJzdC4uCisgKi8KK2JhZF9hcmVhOgorCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJbW9uaXRvcl9zaWduYWwocmVncyk7CisKKwkvKiBVc2VyIG1vZGUgYWNjZXNzZXMganVzdCBjYXVzZSBhIFNJR1NFR1YgKi8KKwlpZiAoKGZhdWx0X2NvZGUgJiBNTVVGQ1JfeEZDX0FDQ0VTUykgPT0gTU1VRkNSX3hGQ19BQ0NFU1NfVVNSKSB7CisJCWluZm8uc2lfc2lnbm8gPSBTSUdTRUdWOworCQlpbmZvLnNpX2Vycm5vID0gMDsKKwkJLyogaW5mby5zaV9jb2RlIGhhcyBiZWVuIHNldCBhYm92ZSAqLworCQlpbmZvLnNpX2FkZHIgPSAodm9pZCAqKWFkZHJlc3M7CisJCWZvcmNlX3NpZ19pbmZvKFNJR1NFR1YsICZpbmZvLCB0c2spOworCQlyZXR1cm47CisJfQorCitub19jb250ZXh0OgorCW1vbml0b3Jfc2lnbmFsKHJlZ3MpOworCS8qIEFyZSB3ZSBwcmVwYXJlZCB0byBoYW5kbGUgdGhpcyBrZXJuZWwgZmF1bHQ/ICAqLworCWlmIChmaXh1cF9leGNlcHRpb24ocmVncykpCisJCXJldHVybjsKKworLyoKKyAqIE9vcHMuIFRoZSBrZXJuZWwgdHJpZWQgdG8gYWNjZXNzIHNvbWUgYmFkIHBhZ2UuIFdlJ2xsIGhhdmUgdG8KKyAqIHRlcm1pbmF0ZSB0aGluZ3Mgd2l0aCBleHRyZW1lIHByZWp1ZGljZS4KKyAqLworCisJYnVzdF9zcGlubG9ja3MoMSk7CisKKwlpZiAoYWRkcmVzcyA8IFBBR0VfU0laRSkKKwkJcHJpbnRrKEtFUk5fQUxFUlQKKwkJICAgICAgICJVbmFibGUgdG8gaGFuZGxlIGtlcm5lbCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UiKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0FMRVJUCisJCSAgICAgICAiVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgcGFnaW5nIHJlcXVlc3QiKTsKKwlwcmludGsoIiBhdCB2aXJ0dWFsIGFkZHJlc3MgJTA4bHhcbiIsIGFkZHJlc3MpOworCXByaW50aygiIHByaW50aW5nIHBjOlxuIik7CisJcHJpbnRrKEtFUk5fQUxFUlQgIiUwOGx4XG4iLCByZWdzLT5wYyk7CisKKyNpZmRlZiBDT05GSUdfR0RCU1RVQgorCWdkYnN0dWJfaW50ZXJjZXB0KAorCQlyZWdzLCBmYXVsdF9jb2RlICYgMHgwMDAxMDAwMCA/IEVYQ0VQX0lBRVJST1IgOiBFWENFUF9EQUVSUk9SKTsKKyNlbmRpZgorCisJcGFnZSA9IFBUQlI7CisJcGFnZSA9ICgodW5zaWduZWQgbG9uZyAqKSBfX3ZhKHBhZ2UpKVthZGRyZXNzID4+IDIyXTsKKwlwcmludGsoS0VSTl9BTEVSVCAiKnBkZSA9ICUwOGx4XG4iLCBwYWdlKTsKKwlpZiAocGFnZSAmIDEpIHsKKwkJcGFnZSAmPSBQQUdFX01BU0s7CisJCWFkZHJlc3MgJj0gMHgwMDNmZjAwMDsKKwkJcGFnZSA9ICgodW5zaWduZWQgbG9uZyAqKSBfX3ZhKHBhZ2UpKVthZGRyZXNzID4+IFBBR0VfU0hJRlRdOworCQlwcmludGsoS0VSTl9BTEVSVCAiKnB0ZSA9ICUwOGx4XG4iLCBwYWdlKTsKKwl9CisKKwlkaWUoIk9vcHMiLCByZWdzLCBmYXVsdF9jb2RlKTsKKwlkb19leGl0KFNJR0tJTEwpOworCisvKgorICogV2UgcmFuIG91dCBvZiBtZW1vcnksIG9yIHNvbWUgb3RoZXIgdGhpbmcgaGFwcGVuZWQgdG8gdXMgdGhhdCBtYWRlCisgKiB1cyB1bmFibGUgdG8gaGFuZGxlIHRoZSBwYWdlIGZhdWx0IGdyYWNlZnVsbHkuCisgKi8KK291dF9vZl9tZW1vcnk6CisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwltb25pdG9yX3NpZ25hbChyZWdzKTsKKwlwcmludGsoS0VSTl9BTEVSVCAiVk06IGtpbGxpbmcgcHJvY2VzcyAlc1xuIiwgdHNrLT5jb21tKTsKKwlpZiAoKGZhdWx0X2NvZGUgJiBNTVVGQ1JfeEZDX0FDQ0VTUykgPT0gTU1VRkNSX3hGQ19BQ0NFU1NfVVNSKQorCQlkb19leGl0KFNJR0tJTEwpOworCWdvdG8gbm9fY29udGV4dDsKKworZG9fc2lnYnVzOgorCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJbW9uaXRvcl9zaWduYWwocmVncyk7CisKKwkvKgorCSAqIFNlbmQgYSBzaWdidXMsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSB3ZXJlIGluIGtlcm5lbAorCSAqIG9yIHVzZXIgbW9kZS4KKwkgKi8KKwlpbmZvLnNpX3NpZ25vID0gU0lHQlVTOworCWluZm8uc2lfZXJybm8gPSAwOworCWluZm8uc2lfY29kZSA9IEJVU19BRFJFUlI7CisJaW5mby5zaV9hZGRyID0gKHZvaWQgKilhZGRyZXNzOworCWZvcmNlX3NpZ19pbmZvKFNJR0JVUywgJmluZm8sIHRzayk7CisKKwkvKiBLZXJuZWwgbW9kZT8gSGFuZGxlIGV4Y2VwdGlvbnMgb3IgZGllICovCisJaWYgKChmYXVsdF9jb2RlICYgTU1VRkNSX3hGQ19BQ0NFU1MpID09IE1NVUZDUl94RkNfQUNDRVNTX1NSKQorCQlnb3RvIG5vX2NvbnRleHQ7CisJcmV0dXJuOworCit2bWFsbG9jX2ZhdWx0OgorCXsKKwkJLyoKKwkJICogU3luY2hyb25pemUgdGhpcyB0YXNrJ3MgdG9wIGxldmVsIHBhZ2UtdGFibGUKKwkJICogd2l0aCB0aGUgJ3JlZmVyZW5jZScgcGFnZSB0YWJsZS4KKwkJICoKKwkJICogRG8gX25vdF8gdXNlICJ0c2siIGhlcmUuIFdlIG1pZ2h0IGJlIGluc2lkZQorCQkgKiBhbiBpbnRlcnJ1cHQgaW4gdGhlIG1pZGRsZSBvZiBhIHRhc2sgc3dpdGNoLi4KKwkJICovCisJCWludCBpbmRleCA9IHBnZF9pbmRleChhZGRyZXNzKTsKKwkJcGdkX3QgKnBnZCwgKnBnZF9rOworCQlwdWRfdCAqcHVkLCAqcHVkX2s7CisJCXBtZF90ICpwbWQsICpwbWRfazsKKwkJcHRlX3QgKnB0ZV9rOworCisJCXBnZF9rID0gaW5pdF9tbS5wZ2QgKyBpbmRleDsKKworCQlpZiAoIXBnZF9wcmVzZW50KCpwZ2RfaykpCisJCQlnb3RvIG5vX2NvbnRleHQ7CisKKwkJcHVkX2sgPSBwdWRfb2Zmc2V0KHBnZF9rLCBhZGRyZXNzKTsKKwkJaWYgKCFwdWRfcHJlc2VudCgqcHVkX2spKQorCQkJZ290byBub19jb250ZXh0OworCisJCXBtZF9rID0gcG1kX29mZnNldChwdWRfaywgYWRkcmVzcyk7CisJCWlmICghcG1kX3ByZXNlbnQoKnBtZF9rKSkKKwkJCWdvdG8gbm9fY29udGV4dDsKKworCQlwZ2QgPSAocGdkX3QgKikgUFRCUiArIGluZGV4OworCQlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgYWRkcmVzcyk7CisJCXBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyZXNzKTsKKwkJc2V0X3BtZChwbWQsICpwbWRfayk7CisKKwkJcHRlX2sgPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWRfaywgYWRkcmVzcyk7CisJCWlmICghcHRlX3ByZXNlbnQoKnB0ZV9rKSkKKwkJCWdvdG8gbm9fY29udGV4dDsKKwkJcmV0dXJuOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9tbS9pbml0LmMgYi9hcmNoL21uMTAzMDAvbW0vaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNWQ4OGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAvbW0vaW5pdC5jCkBAIC0wLDAgKzEsMTYwIEBACisvKiBNTjEwMzAwIE1lbW9yeSBtYW5hZ2VtZW50IGluaXRpYWxpc2F0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1hdHN1c2hpdGEgRWxlY3RyaWMgSW5kdXN0cmlhbCBDby4sIEx0ZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBNb2RpZmllZCBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3RsYi5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgorCitERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbW11X2dhdGhlciwgbW11X2dhdGhlcnMpOworCit1bnNpZ25lZCBsb25nIGhpZ2hzdGFydF9wZm4sIGhpZ2hlbmRfcGZuOworCisvKgorICogc2V0IHVwIHBhZ2luZworICovCit2b2lkIF9faW5pdCBwYWdpbmdfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgem9uZXNfc2l6ZVtNQVhfTlJfWk9ORVNdID0gezAsfTsKKwlwdGVfdCAqcHB0ZTsKKwlpbnQgbG9vcDsKKworCS8qIG1haW4ga2VybmVsIHNwYWNlIC0+IFJBTSBtYXBwaW5nIGlzIGhhbmRsZWQgYXMgMToxIHRyYW5zcGFyZW50IGJ5CisJICogdGhlIE1NVSAqLworCW1lbXNldChzd2FwcGVyX3BnX2RpciwgMCwgc2l6ZW9mKHN3YXBwZXJfcGdfZGlyKSk7CisJbWVtc2V0KGtlcm5lbF92bWFsbG9jX3B0ZXMsIDAsIHNpemVvZihrZXJuZWxfdm1hbGxvY19wdGVzKSk7CisKKwkvKiBsb2FkIHRoZSBWTUFMTE9DIGFyZWEgUFRFIHRhYmxlIGFkZHJlc3NlcyBpbnRvIHRoZSBrZXJuZWwgUEdEICovCisJcHB0ZSA9IGtlcm5lbF92bWFsbG9jX3B0ZXM7CisJZm9yIChsb29wID0gVk1BTExPQ19TVEFSVCAvIChQQUdFX1NJWkUgKiBQVFJTX1BFUl9QVEUpOworCSAgICAgbG9vcCA8IFZNQUxMT0NfRU5EIC8gKFBBR0VfU0laRSAqIFBUUlNfUEVSX1BURSk7CisJICAgICBsb29wKysKKwkgICAgICkgeworCQlzZXRfcGdkKHN3YXBwZXJfcGdfZGlyICsgbG9vcCwgX19wZ2QoX19wYShwcHRlKSB8IF9QQUdFX1RBQkxFKSk7CisJCXBwdGUgKz0gUEFHRV9TSVpFIC8gc2l6ZW9mKHB0ZV90KTsKKwl9CisKKwkvKiBkZWNsYXJlIHRoZSBzaXplcyBvZiB0aGUgUkFNIHpvbmVzIChvbmx5IHVzZSB0aGUgbm9ybWFsIHpvbmUpICovCisJem9uZXNfc2l6ZVtaT05FX05PUk1BTF0gPQorCQkoY29udGlnX3BhZ2VfZGF0YS5iZGF0YS0+bm9kZV9sb3dfcGZuKSAtCisJCShjb250aWdfcGFnZV9kYXRhLmJkYXRhLT5ub2RlX2Jvb3Rfc3RhcnQgPj4gUEFHRV9TSElGVCk7CisKKwkvKiBwYXNzIHRoZSBtZW1vcnkgZnJvbSB0aGUgYm9vdG1lbSBhbGxvY2F0b3IgdG8gdGhlIG1haW4gYWxsb2NhdG9yICovCisJZnJlZV9hcmVhX2luaXQoem9uZXNfc2l6ZSk7CisKKwlfX2ZsdXNoX3RsYl9hbGwoKTsKK30KKworLyoKKyAqIHRyYW5zZmVyIGFsbCB0aGUgbWVtb3J5IGZyb20gdGhlIGJvb3RtZW0gYWxsb2NhdG9yIHRvIHRoZSBydW50aW1lIGFsbG9jYXRvcgorICovCit2b2lkIF9faW5pdCBtZW1faW5pdCh2b2lkKQoreworCWludCBjb2Rlc2l6ZSwgcmVzZXJ2ZWRwYWdlcywgZGF0YXNpemUsIGluaXRzaXplOworCWludCB0bXA7CisKKwlpZiAoIW1lbV9tYXApCisJCUJVRygpOworCisjZGVmaW5lIFNUQVJUX1BGTgkoY29udGlnX3BhZ2VfZGF0YS5iZGF0YS0+bm9kZV9ib290X3N0YXJ0ID4+IFBBR0VfU0hJRlQpCisjZGVmaW5lIE1BWF9MT1dfUEZOCShjb250aWdfcGFnZV9kYXRhLmJkYXRhLT5ub2RlX2xvd19wZm4pCisKKwltYXhfbWFwbnIgPSBudW1fcGh5c3BhZ2VzID0gTUFYX0xPV19QRk4gLSBTVEFSVF9QRk47CisJaGlnaF9tZW1vcnkgPSAodm9pZCAqKSBfX3ZhKE1BWF9MT1dfUEZOICogUEFHRV9TSVpFKTsKKworCS8qIGNsZWFyIHRoZSB6ZXJvLXBhZ2UgKi8KKwltZW1zZXQoZW1wdHlfemVyb19wYWdlLCAwLCBQQUdFX1NJWkUpOworCisJLyogdGhpcyB3aWxsIHB1dCBhbGwgbG93IG1lbW9yeSBvbnRvIHRoZSBmcmVlbGlzdHMgKi8KKwl0b3RhbHJhbV9wYWdlcyArPSBmcmVlX2FsbF9ib290bWVtKCk7CisKKwlyZXNlcnZlZHBhZ2VzID0gMDsKKwlmb3IgKHRtcCA9IDA7IHRtcCA8IG51bV9waHlzcGFnZXM7IHRtcCsrKQorCQlpZiAoUGFnZVJlc2VydmVkKCZtZW1fbWFwW3RtcF0pKQorCQkJcmVzZXJ2ZWRwYWdlcysrOworCisJY29kZXNpemUgPSAgKHVuc2lnbmVkIGxvbmcpICZfZXRleHQgLSAodW5zaWduZWQgbG9uZykgJl9zdGV4dDsKKwlkYXRhc2l6ZSA9ICAodW5zaWduZWQgbG9uZykgJl9lZGF0YSAtICh1bnNpZ25lZCBsb25nKSAmX2V0ZXh0OworCWluaXRzaXplID0gICh1bnNpZ25lZCBsb25nKSAmX19pbml0X2VuZCAtICh1bnNpZ25lZCBsb25nKSAmX19pbml0X2JlZ2luOworCisJcHJpbnRrKEtFUk5fSU5GTworCSAgICAgICAiTWVtb3J5OiAlbHVrLyVsdWsgYXZhaWxhYmxlIgorCSAgICAgICAiICglZGsga2VybmVsIGNvZGUsICVkayByZXNlcnZlZCwgJWRrIGRhdGEsICVkayBpbml0LCIKKwkgICAgICAgIiAlbGRrIGhpZ2htZW0pXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZykgbnJfZnJlZV9wYWdlcygpIDw8IChQQUdFX1NISUZUIC0gMTApLAorCSAgICAgICBtYXhfbWFwbnIgPDwgKFBBR0VfU0hJRlQgLSAxMCksCisJICAgICAgIGNvZGVzaXplID4+IDEwLAorCSAgICAgICByZXNlcnZlZHBhZ2VzIDw8IChQQUdFX1NISUZUIC0gMTApLAorCSAgICAgICBkYXRhc2l6ZSA+PiAxMCwKKwkgICAgICAgaW5pdHNpemUgPj4gMTAsCisJICAgICAgICh1bnNpZ25lZCBsb25nKSAodG90YWxoaWdoX3BhZ2VzIDw8IChQQUdFX1NISUZUIC0gMTApKQorCSAgICAgICApOworfQorCisvKgorICoKKyAqLwordm9pZCBmcmVlX2luaXRfcGFnZXMoY2hhciAqd2hhdCwgdW5zaWduZWQgbG9uZyBiZWdpbiwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJZm9yIChhZGRyID0gYmVnaW47IGFkZHIgPCBlbmQ7IGFkZHIgKz0gUEFHRV9TSVpFKSB7CisJCUNsZWFyUGFnZVJlc2VydmVkKHZpcnRfdG9fcGFnZShhZGRyKSk7CisJCWluaXRfcGFnZV9jb3VudCh2aXJ0X3RvX3BhZ2UoYWRkcikpOworCQltZW1zZXQoKHZvaWQgKikgYWRkciwgMHhjYywgUEFHRV9TSVpFKTsKKwkJZnJlZV9wYWdlKGFkZHIpOworCQl0b3RhbHJhbV9wYWdlcysrOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJGcmVlaW5nICVzOiAlbGRrIGZyZWVkXG4iLCB3aGF0LCAoZW5kIC0gYmVnaW4pID4+IDEwKTsKK30KKworLyoKKyAqIHJlY3ljbGUgbWVtb3J5IGNvbnRhaW5pbmcgc3R1ZmYgb25seSByZXF1aXJlZCBmb3IgaW5pdGlhbGlzYXRpb24KKyAqLwordm9pZCBmcmVlX2luaXRtZW0odm9pZCkKK3sKKwlmcmVlX2luaXRfcGFnZXMoInVudXNlZCBrZXJuZWwgbWVtb3J5IiwKKwkJCSh1bnNpZ25lZCBsb25nKSAmX19pbml0X2JlZ2luLAorCQkJKHVuc2lnbmVkIGxvbmcpICZfX2luaXRfZW5kKTsKK30KKworLyoKKyAqIGRpc3Bvc2Ugb2YgdGhlIG1lbW9yeSBvbiB3aGljaCB0aGUgaW5pdGlhbCByYW1kaXNrIHJlc2lkZWQKKyAqLworI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAordm9pZCBmcmVlX2luaXRyZF9tZW0odW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJZnJlZV9pbml0X3BhZ2VzKCJpbml0cmQgbWVtb3J5Iiwgc3RhcnQsIGVuZCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9tbS9taXNhbGlnbm1lbnQuYyBiL2FyY2gvbW4xMDMwMC9tbS9taXNhbGlnbm1lbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmFhODlkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL21tL21pc2FsaWdubWVudC5jCkBAIC0wLDAgKzEsNjYxIEBACisvKiBNTjEwMzAwIE1pc2FsaWdubWVudCBmaXh1cCBoYW5kbGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KKyNpbmNsdWRlIDxhc20vY3B1LXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vYnVzY3RsLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vZnB1Lmg+CisjaW5jbHVkZSA8YXNtL2dkYi1zdHViLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisKKyNpZiAwCisjZGVmaW5lIGtkZWJ1ZyhGTVQsIC4uLikgcHJpbnRrKEtFUk5fREVCVUcgRk1ULCAjI19fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUga2RlYnVnKEZNVCwgLi4uKSBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorCitzdGF0aWMgaW50IG1pc2FsaWdubWVudF9hZGRyKHVuc2lnbmVkIGxvbmcgKnJlZ2lzdGVycywgdW5zaWduZWQgcGFyYW1zLAorCQkJICAgICB1bnNpZ25lZCBvcGNvZGUsIHVuc2lnbmVkIGRpc3AsCisJCQkgICAgIHZvaWQgKipfYWRkcmVzcywgdW5zaWduZWQgbG9uZyAqKl9wb3N0aW5jKTsKKworc3RhdGljIGludCBtaXNhbGlnbm1lbnRfcmVnKHVuc2lnbmVkIGxvbmcgKnJlZ2lzdGVycywgdW5zaWduZWQgcGFyYW1zLAorCQkJICAgIHVuc2lnbmVkIG9wY29kZSwgdW5zaWduZWQgZGlzcCwKKwkJCSAgICB1bnNpZ25lZCBsb25nICoqX3JlZ2lzdGVyKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnRfbG9nMih1bnNpZ25lZCB4KQoreworCXVuc2lnbmVkIHk7CisJYXNtKCJic2NoICUxLCUwIiA6ICI9ciIoeSkgOiAiciIoeCksICIwIigwKSk7CisJcmV0dXJuIHk7Cit9CisjZGVmaW5lIGxvZzIoeCkgaW50X2xvZzIoeCkKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIERyZWdfaW5kZXhbXSA9IHsKKwlSRUdfRDAgPj4gMiwgUkVHX0QxID4+IDIsIFJFR19EMiA+PiAyLCBSRUdfRDMgPj4gMgorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIEFyZWdfaW5kZXhbXSA9IHsKKwlSRUdfQTAgPj4gMiwgUkVHX0ExID4+IDIsIFJFR19BMiA+PiAyLCBSRUdfQTMgPj4gMgorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIFJyZWdfaW5kZXhbXSA9IHsKKwlSRUdfRTAgPj4gMiwgUkVHX0UxID4+IDIsIFJFR19FMiA+PiAyLCBSRUdfRTMgPj4gMiwKKwlSRUdfRTQgPj4gMiwgUkVHX0U1ID4+IDIsIFJFR19FNiA+PiAyLCBSRUdfRTcgPj4gMiwKKwlSRUdfQTAgPj4gMiwgUkVHX0ExID4+IDIsIFJFR19BMiA+PiAyLCBSRUdfQTMgPj4gMiwKKwlSRUdfRDAgPj4gMiwgUkVHX0QxID4+IDIsIFJFR19EMiA+PiAyLCBSRUdfRDMgPj4gMgorfTsKKworZW51bSBmb3JtYXRfaWQgeworCUZNVF9TMCwKKwlGTVRfUzEsCisJRk1UX1MyLAorCUZNVF9TNCwKKwlGTVRfRDAsCisJRk1UX0QxLAorCUZNVF9EMiwKKwlGTVRfRDQsCisJRk1UX0Q2LAorCUZNVF9ENywKKwlGTVRfRDgsCisJRk1UX0Q5LAorfTsKKworc3RydWN0IHsKKwl1X2ludDhfdCBvcHN6LCBkaXNwc3o7Cit9IGZvcm1hdF90YmxbMTZdID0geworCVtGTVRfUzBdCT0geyA4LAkwCX0sCisJW0ZNVF9TMV0JPSB7IDgsCTgJfSwKKwlbRk1UX1MyXQk9IHsgOCwJMTYJfSwKKwlbRk1UX1M0XQk9IHsgOCwJMzIJfSwKKwlbRk1UX0QwXQk9IHsgMTYsCTAJfSwKKwlbRk1UX0QxXQk9IHsgMTYsCTgJfSwKKwlbRk1UX0QyXQk9IHsgMTYsCTE2CX0sCisJW0ZNVF9ENF0JPSB7IDE2LAkzMgl9LAorCVtGTVRfRDZdCT0geyAyNCwJMAl9LAorCVtGTVRfRDddCT0geyAyNCwJOAl9LAorCVtGTVRfRDhdCT0geyAyNCwJMjQJfSwKKwlbRk1UX0Q5XQk9IHsgMjQsCTMyCX0sCit9OworCitlbnVtIHZhbHVlX2lkIHsKKwlETTAsCQkvKiBkYXRhIHJlZyBpbiBvcGNvZGUgaW4gYml0cyAwLTEgKi8KKwlETTEsCQkvKiBkYXRhIHJlZyBpbiBvcGNvZGUgaW4gYml0cyAyLTMgKi8KKwlETTIsCQkvKiBkYXRhIHJlZyBpbiBvcGNvZGUgaW4gYml0cyA0LTUgKi8KKwlBTTAsCQkvKiBhZGRyIHJlZyBpbiBvcGNvZGUgaW4gYml0cyAwLTEgKi8KKwlBTTEsCQkvKiBhZGRyIHJlZyBpbiBvcGNvZGUgaW4gYml0cyAyLTMgKi8KKwlBTTIsCQkvKiBhZGRyIHJlZyBpbiBvcGNvZGUgaW4gYml0cyA0LTUgKi8KKwlSTTAsCQkvKiByZWcgaW4gb3Bjb2RlIGluIGJpdHMgMC0zICovCisJUk0xLAkJLyogcmVnIGluIG9wY29kZSBpbiBiaXRzIDItNSAqLworCVJNMiwJCS8qIHJlZyBpbiBvcGNvZGUgaW4gYml0cyA0LTcgKi8KKwlSTTQsCQkvKiByZWcgaW4gb3Bjb2RlIGluIGJpdHMgOC0xMSAqLworCVJNNiwJCS8qIHJlZyBpbiBvcGNvZGUgaW4gYml0cyAxMi0xNSAqLworCisJUkQwLAkJLyogcmVnIGluIGRpc3BsYWNlbWVudCBpbiBiaXRzIDAtMyAqLworCVJEMiwJCS8qIHJlZyBpbiBkaXNwbGFjZW1lbnQgaW4gYml0cyA0LTcgKi8KKworCVNQLAkJLyogc3RhY2sgcG9pbnRlciAqLworCisJU0Q4LAkJLyogOC1iaXQgc2lnbmVkIGRpc3BsYWNlbWVudCAqLworCVNEMTYsCQkvKiAxNi1iaXQgc2lnbmVkIGRpc3BsYWNlbWVudCAqLworCVNEMjQsCQkvKiAyNC1iaXQgc2lnbmVkIGRpc3BsYWNlbWVudCAqLworCVNJTU00XzIsCS8qIDQtYml0IHNpZ25lZCBkaXNwbGFjZW1lbnQgaW4gb3Bjb2RlIGJpdHMgNC03ICovCisJU0lNTTgsCQkvKiA4LWJpdCBzaWduZWQgaW1tZWRpYXRlICovCisJSU1NMjQsCQkvKiAyNC1iaXQgdW5zaWduZWQgaW1tZWRpYXRlICovCisJSU1NMzIsCQkvKiAzMi1iaXQgdW5zaWduZWQgaW1tZWRpYXRlICovCisJSU1NMzJfSElHSDgsCS8qIDMyLWJpdCB1bnNpZ25lZCBpbW1lZGlhdGUsIGhpZ2ggOC1iaXRzIGluIG9wY29kZSAqLworCisJRE4wCT0gRE0wLAorCUROMQk9IERNMSwKKwlETjIJPSBETTIsCisJQU4wCT0gQU0wLAorCUFOMQk9IEFNMSwKKwlBTjIJPSBBTTIsCisJUk4wCT0gUk0wLAorCVJOMQk9IFJNMSwKKwlSTjIJPSBSTTIsCisJUk40CT0gUk00LAorCVJONgk9IFJNNiwKKwlESQk9IERNMSwKKwlSSQk9IFJNMiwKKworfTsKKworc3RydWN0IG1uMTAzMDBfb3Bjb2RlIHsKKwljb25zdCBjaGFyCSpuYW1lOworCXVfaW50MzJfdAlvcGNvZGU7CisJdV9pbnQzMl90CW9wbWFzazsKKwl1bnNpZ25lZAlleGNsdXNpb247CisKKwllbnVtIGZvcm1hdF9pZAlmb3JtYXQ7CisKKwl1bnNpZ25lZAljcHVfbWFzazsKKyNkZWZpbmUgQU0zMwkzMzAKKworCXVuc2lnbmVkCXBhcmFtc1syXTsKKyNkZWZpbmUgTUVNKEFERFIpCQkoMHg4MDAwMDAwMCB8IChBRERSKSkKKyNkZWZpbmUgTUVNMihBRERSMSwgQUREUjIpCSgweDgwMDAwMDAwIHwgKEFERFIxKSA8PCA4IHwgKEFERFIyKSkKKyNkZWZpbmUgTUVNSU5DKEFERFIpCQkoMHg4MTAwMDAwMCB8IChBRERSKSkKKyNkZWZpbmUgTUVNSU5DMihBRERSLCBJTkMpCSgweDgxMDAwMDAwIHwgKEFERFIpIDw8IDggfCAoSU5DKSkKK307CisKKy8qIExJQk9QQ09ERVMgRVhDRVJQVAorICAgQXNzZW1ibGUgTWF0c3VzaGl0YSBNTjEwMzAwIGluc3RydWN0aW9ucy4KKyAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2VuY2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqLworc3RhdGljIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wY29kZSBtbjEwMzAwX29wY29kZXNbXSA9IHsKK3sgIm1vdiIsCTB4NjAsCSAgICAgMHhmMCwJICAwLCAgICBGTVRfUzAsIDAsCXtETTEsIE1FTShBTjApfX0sCit7ICJtb3YiLAkweDcwLAkgICAgIDB4ZjAsCSAgMCwgICAgRk1UX1MwLCAwLAl7TUVNKEFNMCksIEROMX19LAoreyAibW92IiwJMHhmMDAwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtNRU0oQU0wKSwgQU4xfX0sCit7ICJtb3YiLAkweGYwMTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMSwgTUVNKEFOMCl9fSwKK3sgIm1vdiIsCTB4ZjMwMCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCAwLAl7TUVNMihESSwgQU0wKSwgRE4yfX0sCit7ICJtb3YiLAkweGYzNDAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMiwgTUVNMihESSwgQU4wKX19LAoreyAibW92IiwJMHhmMzgwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIDAsCXtNRU0yKERJLCBBTTApLCBBTjJ9fSwKK3sgIm1vdiIsCTB4ZjNjMCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0yLCBNRU0yKERJLCBBTjApfX0sCit7ICJtb3YiLAkweGY4MDAwMCwgICAgMHhmZmYwMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTTIoU0Q4LCBBTTApLCBETjF9fSwKK3sgIm1vdiIsCTB4ZjgxMDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0yKFNEOCwgQU4wKX19LAoreyAibW92IiwJMHhmODIwMDAsICAgIDB4ZmZmMDAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtNRU0yKFNEOCxBTTApLCBBTjF9fSwKK3sgIm1vdiIsCTB4ZjgzMDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7QU0xLCBNRU0yKFNEOCwgQU4wKX19LAoreyAibW92IiwJMHhmOGYwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIEFNMzMsCXtNRU0yKFNEOCwgQU0wKSwgU1B9fSwKK3sgIm1vdiIsCTB4ZjhmNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCBBTTMzLAl7U1AsIE1FTTIoU0Q4LCBBTjApfX0sCit7ICJtb3YiLAkweGY5MGEwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe01FTShSTTApLCBSTjJ9fSwKK3sgIm1vdiIsCTB4ZjkxYTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7Uk0yLCBNRU0oUk4wKX19LAoreyAibW92IiwJMHhmOTZhMDAsICAgIDB4ZmZmZjAwLCAgICAweDEyLCBGTVRfRDYsIEFNMzMsCXtNRU1JTkMoUk0wKSwgUk4yfX0sCit7ICJtb3YiLAkweGY5N2EwMCwgICAgMHhmZmZmMDAsICAgIDAsCUZNVF9ENiwgQU0zMywJe1JNMiwgTUVNSU5DKFJOMCl9fSwKK3sgIm1vdiIsCTB4ZmEwMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7TUVNMihTRDE2LCBBTTApLCBETjF9fSwKK3sgIm1vdiIsCTB4ZmExMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7RE0xLCBNRU0yKFNEMTYsIEFOMCl9fSwKK3sgIm1vdiIsCTB4ZmEyMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7TUVNMihTRDE2LCBBTTApLCBBTjF9fSwKK3sgIm1vdiIsCTB4ZmEzMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7QU0xLCBNRU0yKFNEMTYsIEFOMCl9fSwKK3sgIm1vdiIsCTB4ZmIwYTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7TUVNMihTRDgsIFJNMCksIFJOMn19LAoreyAibW92IiwJMHhmYjFhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtSTTIsIE1FTTIoU0Q4LCBSTjApfX0sCit7ICJtb3YiLAkweGZiNmEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MjIsIEZNVF9ENywgQU0zMywJe01FTUlOQzIgKFJNMCwgU0lNTTgpLCBSTjJ9fSwKK3sgIm1vdiIsCTB4ZmI3YTAwMDAsICAweGZmZmYwMDAwLCAgMCwJRk1UX0Q3LCBBTTMzLAl7Uk0yLCBNRU1JTkMyIChSTjAsIFNJTU04KX19LAoreyAibW92IiwJMHhmYjhlMDAwMCwgIDB4ZmZmZjAwMGYsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtNRU0yKFJJLCBSTTApLCBSRDJ9fSwKK3sgIm1vdiIsCTB4ZmI5ZTAwMDAsICAweGZmZmYwMDBmLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7UkQyLCBNRU0yKFJJLCBSTjApfX0sCit7ICJtb3YiLAkweGZjMDAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTTIoSU1NMzIsQU0wKSwgRE4xfX0sCit7ICJtb3YiLAkweGZjMTAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0RNMSwgTUVNMihJTU0zMixBTjApfX0sCit7ICJtb3YiLAkweGZjMjAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTTIoSU1NMzIsQU0wKSwgQU4xfX0sCit7ICJtb3YiLAkweGZjMzAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0FNMSwgTUVNMihJTU0zMixBTjApfX0sCit7ICJtb3YiLAkweGZkMGEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe01FTTIoU0QyNCwgUk0wKSwgUk4yfX0sCit7ICJtb3YiLAkweGZkMWEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe1JNMiwgTUVNMihTRDI0LCBSTjApfX0sCit7ICJtb3YiLAkweGZkNmEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MjIsIEZNVF9EOCwgQU0zMywJe01FTUlOQzIgKFJNMCwgSU1NMjQpLCBSTjJ9fSwKK3sgIm1vdiIsCTB4ZmQ3YTAwMDAsICAweGZmZmYwMDAwLCAgMCwJRk1UX0Q4LCBBTTMzLAl7Uk0yLCBNRU1JTkMyIChSTjAsIElNTTI0KX19LAoreyAibW92IiwJMHhmZTBhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtNRU0yKElNTTMyX0hJR0g4LFJNMCksIFJOMn19LAoreyAibW92IiwJMHhmZTFhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDksIEFNMzMsCXtSTTIsIE1FTTIoSU1NMzJfSElHSDgsIFJOMCl9fSwKK3sgIm1vdiIsCTB4ZmU2YTAwMDAsICAweGZmZmYwMDAwLCAgMHgyMiwgRk1UX0Q5LCBBTTMzLAl7TUVNSU5DMiAoUk0wLCBJTU0zMl9ISUdIOCksIFJOMn19LAoreyAibW92IiwJMHhmZTdhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLAlGTVRfRDksIEFNMzMsCXtSTjIsIE1FTUlOQzIgKFJNMCwgSU1NMzJfSElHSDgpfX0sCisKK3sgIm1vdmh1IiwJMHhmMDYwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtNRU0oQU0wKSwgRE4xfX0sCit7ICJtb3ZodSIsCTB4ZjA3MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBNRU0oQU4wKX19LAoreyAibW92aHUiLAkweGY0ODAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe01FTTIoREksIEFNMCksIEROMn19LAoreyAibW92aHUiLAkweGY0YzAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMiwgTUVNMihESSwgQU4wKX19LAoreyAibW92aHUiLAkweGY4NjAwMCwgICAgMHhmZmYwMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTTIoU0Q4LCBBTTApLCBETjF9fSwKK3sgIm1vdmh1IiwJMHhmODcwMDAsICAgIDB4ZmZmMDAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETTEsIE1FTTIoU0Q4LCBBTjApfX0sCit7ICJtb3ZodSIsCTB4Zjk0YTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0Q2LCBBTTMzLAl7TUVNKFJNMCksIFJOMn19LAoreyAibW92aHUiLAkweGY5NWEwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9ENiwgQU0zMywJe1JNMiwgTUVNKFJOMCl9fSwKK3sgIm1vdmh1IiwJMHhmOWVhMDAsICAgIDB4ZmZmZjAwLCAgICAweDEyLCBGTVRfRDYsIEFNMzMsCXtNRU1JTkMoUk0wKSwgUk4yfX0sCit7ICJtb3ZodSIsCTB4ZjlmYTAwLCAgICAweGZmZmYwMCwgICAgMCwJRk1UX0Q2LCBBTTMzLAl7Uk0yLCBNRU1JTkMoUk4wKX19LAoreyAibW92aHUiLAkweGZhNjAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe01FTTIoU0QxNiwgQU0wKSwgRE4xfX0sCit7ICJtb3ZodSIsCTB4ZmE3MDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7RE0xLCBNRU0yKFNEMTYsIEFOMCl9fSwKK3sgIm1vdmh1IiwJMHhmYjRhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDcsIEFNMzMsCXtNRU0yKFNEOCwgUk0wKSwgUk4yfX0sCit7ICJtb3ZodSIsCTB4ZmI1YTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q3LCBBTTMzLAl7Uk0yLCBNRU0yKFNEOCwgUk4wKX19LAoreyAibW92aHUiLAkweGZiY2UwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe01FTTIoUkksIFJNMCksIFJEMn19LAoreyAibW92aHUiLAkweGZiZGUwMDAwLCAgMHhmZmZmMDAwZiwgIDAsICAgIEZNVF9ENywgQU0zMywJe1JEMiwgTUVNMihSSSwgUk4wKX19LAoreyAibW92aHUiLAkweGZiZWEwMDAwLCAgMHhmZmZmMDAwMCwgIDB4MjIsIEZNVF9ENywgQU0zMywJe01FTUlOQzIgKFJNMCwgU0lNTTgpLCBSTjJ9fSwKK3sgIm1vdmh1IiwJMHhmYmZhMDAwMCwgIDB4ZmZmZjAwMDAsICAwLAlGTVRfRDcsIEFNMzMsCXtSTTIsIE1FTUlOQzIgKFJOMCwgU0lNTTgpfX0sCit7ICJtb3ZodSIsCTB4ZmM2MDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNMihJTU0zMixBTTApLCBETjF9fSwKK3sgIm1vdmh1IiwJMHhmYzcwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTTIoSU1NMzIsQU4wKX19LAoreyAibW92aHUiLAkweGZkNGEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOCwgQU0zMywJe01FTTIoU0QyNCwgUk0wKSwgUk4yfX0sCit7ICJtb3ZodSIsCTB4ZmQ1YTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q4LCBBTTMzLAl7Uk0yLCBNRU0yKFNEMjQsIFJOMCl9fSwKK3sgIm1vdmh1IiwJMHhmZGVhMDAwMCwgIDB4ZmZmZjAwMDAsICAweDIyLCBGTVRfRDgsIEFNMzMsCXtNRU1JTkMyIChSTTAsIElNTTI0KSwgUk4yfX0sCit7ICJtb3ZodSIsCTB4ZmRmYTAwMDAsICAweGZmZmYwMDAwLCAgMCwJRk1UX0Q4LCBBTTMzLAl7Uk0yLCBNRU1JTkMyIChSTjAsIElNTTI0KX19LAoreyAibW92aHUiLAkweGZlNGEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EOSwgQU0zMywJe01FTTIoSU1NMzJfSElHSDgsUk0wKSwgUk4yfX0sCit7ICJtb3ZodSIsCTB4ZmU1YTAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q5LCBBTTMzLAl7Uk0yLCBNRU0yKElNTTMyX0hJR0g4LCBSTjApfX0sCit7ICJtb3ZodSIsCTB4ZmVlYTAwMDAsICAweGZmZmYwMDAwLCAgMHgyMiwgRk1UX0Q5LCBBTTMzLAl7TUVNSU5DMiAoUk0wLCBJTU0zMl9ISUdIOCksIFJOMn19LAoreyAibW92aHUiLAkweGZlZmEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsCUZNVF9EOSwgQU0zMywJe1JOMiwgTUVNSU5DMiAoUk0wLCBJTU0zMl9ISUdIOCl9fSwKK3sgMCwgMCwgMCwgMCwgMCwgMCwgezB9fSwKK307CisKKy8qCisgKiBmaXggdXAgbWlzYWxpZ25tZW50IHByb2JsZW1zIHdoZXJlIHBvc3NpYmxlCisgKi8KK2FzbWxpbmthZ2Ugdm9pZCBtaXNhbGlnbm1lbnQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGVudW0gZXhjZXB0aW9uX2NvZGUgY29kZSkKK3sKKwljb25zdCBzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlX2VudHJ5ICpmaXh1cDsKKwljb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgKnBvcDsKKwl1bnNpZ25lZCBsb25nICpyZWdpc3RlcnMgPSAodW5zaWduZWQgbG9uZyAqKSByZWdzOworCXVuc2lnbmVkIGxvbmcgZGF0YSwgKnN0b3JlLCAqcG9zdGluYzsKKwltbV9zZWdtZW50X3Qgc2VnOworCXNpZ2luZm9fdCBpbmZvOworCXVpbnQzMl90IG9wY29kZSwgZGlzcCwgbm9jLCB4bywgeG07CisJdWludDhfdCAqcGMsIGJ5dGU7CisJdm9pZCAqYWRkcmVzczsKKwl1bnNpZ25lZCB0bXAsIG5wb3A7CisKKwlrZGVidWcoIk1JU0FMSUdOIGF0ICVseFxuIiwgcmVncy0+cGMpOworCisJaWYgKGluX2ludGVycnVwdCgpKQorCQlkaWUoIk1pc2FsaWdubWVudCB0cmFwIGluIGludGVycnVwdCBjb250ZXh0IiwgcmVncywgY29kZSk7CisKKwlpZiAocmVncy0+ZXBzdyAmIEVQU1dfSUUpCisJCWFzbSB2b2xhdGlsZSgib3IgJTAsZXBzdyIgOiA6ICJpIihFUFNXX0lFKSk7CisKKwlzZWcgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKworCWZpeHVwID0gc2VhcmNoX2V4Y2VwdGlvbl90YWJsZXMocmVncy0+cGMpOworCisJLyogZmlyc3QgdGhpbmcgdG8gZG8gaXMgdG8gbWF0Y2ggdGhlIG9wY29kZSAqLworCXBjID0gKHVfaW50OF90ICopIHJlZ3MtPnBjOworCisJaWYgKF9fZ2V0X3VzZXIoYnl0ZSwgcGMpICE9IDApCisJCWdvdG8gZmV0Y2hfZXJyb3I7CisJb3Bjb2RlID0gYnl0ZTsKKwlub2MgPSA4OworCisJZm9yIChwb3AgPSBtbjEwMzAwX29wY29kZXM7IHBvcC0+bmFtZTsgcG9wKyspIHsKKwkJbnBvcCA9IGxvZzIocG9wLT5vcGNvZGUgfCBwb3AtPm9wbWFzayk7CisJCWlmIChucG9wIDw9IDAgfHwgbnBvcCA+IDMxKQorCQkJY29udGludWU7CisJCW5wb3AgPSAobnBvcCArIDgpICYgfjc7CisKKwlnb3RfbW9yZV9iaXRzOgorCQlpZiAobnBvcCA9PSBub2MpIHsKKwkJCWlmICgob3Bjb2RlICYgcG9wLT5vcG1hc2spID09IHBvcC0+b3Bjb2RlKQorCQkJCWdvdG8gZm91bmRfb3Bjb2RlOworCQl9IGVsc2UgaWYgKG5wb3AgPiBub2MpIHsKKwkJCXhvID0gcG9wLT5vcGNvZGUgPj4gKG5wb3AgLSBub2MpOworCQkJeG0gPSBwb3AtPm9wbWFzayA+PiAobnBvcCAtIG5vYyk7CisKKwkJCWlmICgob3Bjb2RlICYgeG0pICE9IHhvKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiB3ZSd2ZSBnb3QgYSBwYXJ0aWFsIG1hdGNoIChhbiBleGFjdCBtYXRjaCBvbiB0aGUKKwkJCSAqIGZpcnN0IE4gYnl0ZXMpLCBzbyB3ZSBuZWVkIHRvIGdldCBzb21lIG1vcmUgZGF0YSAqLworCQkJcGMrKzsKKwkJCWlmIChfX2dldF91c2VyKGJ5dGUsIHBjKSAhPSAwKQorCQkJCWdvdG8gZmV0Y2hfZXJyb3I7CisJCQlvcGNvZGUgPSBvcGNvZGUgPDwgOCB8IGJ5dGU7CisJCQlub2MgKz0gODsKKwkJCWdvdG8gZ290X21vcmVfYml0czsKKwkJfSBlbHNlIHsKKwkJCS8qIHRoZXJlJ3MgYWxyZWFkeSBiZWVuIGEgcGFydGlhbCBtYXRjaCBhcyBsb25nIGFzIHRoZQorCQkJICogY29tcGxldGUgbWF0Y2ggd2UncmUgbm93IGNvbnNpZGVyaW5nLCBzbyB0aGlzIG9uZQorCQkJICogc2hvdWxkJ3QgbWF0Y2ggKi8KKwkJCWNvbnRpbnVlOworCQl9CisJfQorCisJLyogZGlkbid0IG1hbmFnZSB0byBmaW5kIGEgZml4dXAgKi8KKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiTUlTQUxJR046ICVseDogdW5zdXBwb3J0ZWQgaW5zdHJ1Y3Rpb24gJXhcbiIsCisJCSAgICAgICByZWdzLT5wYywgb3Bjb2RlKTsKKworZmFpbGVkOgorCXNldF9mcyhzZWcpOworCWlmIChkaWVfaWZfbm9fZml4dXAoIm1pc2FsaWdubWVudCBlcnJvciIsIHJlZ3MsIGNvZGUpKQorCQlyZXR1cm47CisKKwlpbmZvLnNpX3NpZ25vCT0gU0lHQlVTOworCWluZm8uc2lfZXJybm8JPSAwOworCWluZm8uc2lfY29kZQk9IEJVU19BRFJBTE47CisJaW5mby5zaV9hZGRyCT0gKHZvaWQgKikgcmVncy0+cGM7CisJZm9yY2Vfc2lnX2luZm8oU0lHQlVTLCAmaW5mbywgY3VycmVudCk7CisJcmV0dXJuOworCisJLyogZXJyb3IgcmVhZGluZyBvcGNvZGVzICovCitmZXRjaF9lcnJvcjoKKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkKKwkJcHJpbnRrKEtFUk5fQ1JJVAorCQkgICAgICAgIk1JU0FMSUdOOiAlcDogZmF1bHQgd2hpbHN0IHJlYWRpbmcgaW5zdHJ1Y3Rpb24gZGF0YVxuIiwKKwkJICAgICAgIHBjKTsKKwlnb3RvIGZhaWxlZDsKKworYmFkX2FkZHJfbW9kZToKKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkKKwkJcHJpbnRrKEtFUk5fQ1JJVAorCQkgICAgICAgIk1JU0FMSUdOOiAlbHg6IHVuc3VwcG9ydGVkIGFkZHJlc3NpbmcgbW9kZSAleFxuIiwKKwkJICAgICAgIHJlZ3MtPnBjLCBvcGNvZGUpOworCWdvdG8gZmFpbGVkOworCitiYWRfcmVnX21vZGU6CisJaWYgKCF1c2VyX21vZGUocmVncykpCisJCXByaW50ayhLRVJOX0NSSVQKKwkJICAgICAgICJNSVNBTElHTjogJWx4OiB1bnN1cHBvcnRlZCByZWdpc3RlciBtb2RlICV4XG4iLAorCQkgICAgICAgcmVncy0+cGMsIG9wY29kZSk7CisJZ290byBmYWlsZWQ7CisKK3Vuc3VwcG9ydGVkX2luc3RydWN0aW9uOgorCWlmICghdXNlcl9tb2RlKHJlZ3MpKQorCQlwcmludGsoS0VSTl9DUklUCisJCSAgICAgICAiTUlTQUxJR046ICVseDogdW5zdXBwb3J0ZWQgaW5zdHJ1Y3Rpb24gJXggKCVzKVxuIiwKKwkJICAgICAgIHJlZ3MtPnBjLCBvcGNvZGUsIHBvcC0+bmFtZSk7CisJZ290byBmYWlsZWQ7CisKK3RyYW5zZmVyX2ZhaWxlZDoKKwlzZXRfZnMoc2VnKTsKKwlpZiAoZml4dXApIHsKKwkJcmVncy0+cGMgPSBmaXh1cC0+Zml4dXA7CisJCXJldHVybjsKKwl9CisJaWYgKGRpZV9pZl9ub19maXh1cCgibWlzYWxpZ25tZW50IGZpeHVwIiwgcmVncywgY29kZSkpCisJCXJldHVybjsKKworCWluZm8uc2lfc2lnbm8JPSBTSUdTRUdWOworCWluZm8uc2lfZXJybm8JPSAwOworCWluZm8uc2lfY29kZQk9IDA7CisJaW5mby5zaV9hZGRyCT0gKHZvaWQgKikgcmVncy0+cGM7CisJZm9yY2Vfc2lnX2luZm8oU0lHU0VHViwgJmluZm8sIGN1cnJlbnQpOworCXJldHVybjsKKworCS8qIHdlIG1hdGNoZWQgdGhlIG9wY29kZSAqLworZm91bmRfb3Bjb2RlOgorCWtkZWJ1ZygiTUlTQUxJR046ICVseDogJXg9PSV4IHsgJXgsICV4IH1cbiIsCisJICAgICAgIHJlZ3MtPnBjLCBvcGNvZGUsIHBvcC0+b3Bjb2RlLCBwb3AtPnBhcmFtc1swXSwgcG9wLT5wYXJhbXNbMV0pOworCisJdG1wID0gZm9ybWF0X3RibFtwb3AtPmZvcm1hdF0ub3BzejsKKwlpZiAodG1wID4gbm9jKQorCQlCVUcoKTsgLyogbWF0Y2ggd2FzIGxlc3MgY29tcGxldGUgdGhhbiBpdCBvdWdodCB0byBoYXZlIGJlZW4gKi8KKworCWlmICh0bXAgPCBub2MpIHsKKwkJdG1wID0gbm9jIC0gdG1wOworCQlvcGNvZGUgPj49IHRtcDsKKwkJcGMgLT0gdG1wID4+IDM7CisJfQorCisJLyogZ3JhYiB0aGUgZXh0cmEgZGlzcGxhY2VtZW50IChub3RlIGl0J3MgTFNCIGZpcnN0KSAqLworCWRpc3AgPSAwOworCXRtcCA9IGZvcm1hdF90YmxbcG9wLT5mb3JtYXRdLmRpc3BzeiA+PiAzOworCXdoaWxlICh0bXAgPiAwKSB7CisJCXRtcC0tOworCQlkaXNwIDw8PSA4OworCisJCXBjKys7CisJCWlmIChfX2dldF91c2VyKGJ5dGUsIHBjKSAhPSAwKQorCQkJZ290byBmZXRjaF9lcnJvcjsKKwkJZGlzcCB8PSBieXRlOworCX0KKworCXNldF9mcyhLRVJORUxfWERTKTsKKwlpZiAoZml4dXAgfHwgcmVncy0+ZXBzdyAmIEVQU1dfblNMKQorCQlzZXRfZnMoc2VnKTsKKworCXRtcCA9IChwb3AtPnBhcmFtc1swXSBeIHBvcC0+cGFyYW1zWzFdKSAmIDB4ODAwMDAwMDA7CisJaWYgKCF0bXApIHsKKwkJaWYgKCF1c2VyX21vZGUocmVncykpCisJCQlwcmludGsoS0VSTl9DUklUCisJCQkgICAgICAgIk1JU0FMSUdOOiAlbHg6IgorCQkJICAgICAgICIgaW5zbiBub3QgbW92ZSB0by9mcm9tIG1lbW9yeSAleFxuIiwKKwkJCSAgICAgICByZWdzLT5wYywgb3Bjb2RlKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJaWYgKHBvcC0+cGFyYW1zWzBdICYgMHg4MDAwMDAwMCkgeworCQkvKiBtb3ZlIG1lbW9yeSB0byByZWdpc3RlciAqLworCQlpZiAoIW1pc2FsaWdubWVudF9hZGRyKHJlZ2lzdGVycywgcG9wLT5wYXJhbXNbMF0sIG9wY29kZSwgZGlzcCwKKwkJCQkgICAgICAgJmFkZHJlc3MsICZwb3N0aW5jKSkKKwkJCWdvdG8gYmFkX2FkZHJfbW9kZTsKKworCQlpZiAoIW1pc2FsaWdubWVudF9yZWcocmVnaXN0ZXJzLCBwb3AtPnBhcmFtc1sxXSwgb3Bjb2RlLCBkaXNwLAorCQkJCSAgICAgICZzdG9yZSkpCisJCQlnb3RvIGJhZF9yZWdfbW9kZTsKKworCQlpZiAoc3RyY21wKHBvcC0+bmFtZSwgIm1vdiIpID09IDApIHsKKwkJCWtkZWJ1ZygiRklYVVA6IG1vdiAoJXApLERBUm5cbiIsIGFkZHJlc3MpOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZkYXRhLCAodm9pZCAqKSBhZGRyZXNzLCA0KSAhPSAwKQorCQkJCWdvdG8gdHJhbnNmZXJfZmFpbGVkOworCQkJaWYgKHBvcC0+cGFyYW1zWzBdICYgMHgxMDAwMDAwKQorCQkJCSpwb3N0aW5jICs9IDQ7CisJCX0gZWxzZSBpZiAoc3RyY21wKHBvcC0+bmFtZSwgIm1vdmh1IikgPT0gMCkgeworCQkJa2RlYnVnKCJGSVhVUDogbW92aHUgKCVwKSxEQVJuXG4iLCBhZGRyZXNzKTsKKwkJCWRhdGEgPSAwOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZkYXRhLCAodm9pZCAqKSBhZGRyZXNzLCAyKSAhPSAwKQorCQkJCWdvdG8gdHJhbnNmZXJfZmFpbGVkOworCQkJaWYgKHBvcC0+cGFyYW1zWzBdICYgMHgxMDAwMDAwKQorCQkJCSpwb3N0aW5jICs9IDI7CisJCX0gZWxzZSB7CisJCQlnb3RvIHVuc3VwcG9ydGVkX2luc3RydWN0aW9uOworCQl9CisKKwkJKnN0b3JlID0gZGF0YTsKKwl9IGVsc2UgeworCQkvKiBtb3ZlIHJlZ2lzdGVyIHRvIG1lbW9yeSAqLworCQlpZiAoIW1pc2FsaWdubWVudF9yZWcocmVnaXN0ZXJzLCBwb3AtPnBhcmFtc1swXSwgb3Bjb2RlLCBkaXNwLAorCQkJCSAgICAgICZzdG9yZSkpCisJCQlnb3RvIGJhZF9yZWdfbW9kZTsKKworCQlpZiAoIW1pc2FsaWdubWVudF9hZGRyKHJlZ2lzdGVycywgcG9wLT5wYXJhbXNbMV0sIG9wY29kZSwgZGlzcCwKKwkJCQkgICAgICAgJmFkZHJlc3MsICZwb3N0aW5jKSkKKwkJCWdvdG8gYmFkX2FkZHJfbW9kZTsKKworCQlkYXRhID0gKnN0b3JlOworCisJCWlmIChzdHJjbXAocG9wLT5uYW1lLCAibW92IikgPT0gMCkgeworCQkJa2RlYnVnKCJGSVhVUDogbW92ICVseCwoJXApXG4iLCBkYXRhLCBhZGRyZXNzKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgYWRkcmVzcywgJmRhdGEsIDQpICE9IDApCisJCQkJZ290byB0cmFuc2Zlcl9mYWlsZWQ7CisJCQlpZiAocG9wLT5wYXJhbXNbMV0gJiAweDEwMDAwMDApCisJCQkJKnBvc3RpbmMgKz0gNDsKKwkJfSBlbHNlIGlmIChzdHJjbXAocG9wLT5uYW1lLCAibW92aHUiKSA9PSAwKSB7CisJCQlrZGVidWcoIkZJWFVQOiBtb3ZodSAlaHgsKCVwKVxuIiwKKwkJCSAgICAgICAodWludDE2X3QpIGRhdGEsIGFkZHJlc3MpOworCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhZGRyZXNzLCAmZGF0YSwgMikgIT0gMCkKKwkJCQlnb3RvIHRyYW5zZmVyX2ZhaWxlZDsKKwkJCWlmIChwb3AtPnBhcmFtc1sxXSAmIDB4MTAwMDAwMCkKKwkJCQkqcG9zdGluYyArPSAyOworCQl9IGVsc2UgeworCQkJZ290byB1bnN1cHBvcnRlZF9pbnN0cnVjdGlvbjsKKwkJfQorCX0KKworCXRtcCA9IGZvcm1hdF90YmxbcG9wLT5mb3JtYXRdLm9wc3ogKyBmb3JtYXRfdGJsW3BvcC0+Zm9ybWF0XS5kaXNwc3o7CisJcmVncy0+cGMgKz0gdG1wID4+IDM7CisKKwlzZXRfZnMoc2VnKTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBkZXRlcm1pbmUgdGhlIGFkZHJlc3MgdGhhdCB3YXMgYmVpbmcgYWNjZXNzZWQKKyAqLworc3RhdGljIGludCBtaXNhbGlnbm1lbnRfYWRkcih1bnNpZ25lZCBsb25nICpyZWdpc3RlcnMsIHVuc2lnbmVkIHBhcmFtcywKKwkJCSAgICAgdW5zaWduZWQgb3Bjb2RlLCB1bnNpZ25lZCBkaXNwLAorCQkJICAgICB2b2lkICoqX2FkZHJlc3MsIHVuc2lnbmVkIGxvbmcgKipfcG9zdGluYykKK3sKKwl1bnNpZ25lZCBsb25nICpwb3N0aW5jID0gTlVMTCwgYWRkcmVzcyA9IDAsIHRtcDsKKworCXBhcmFtcyAmPSAweDdmZmZmZmZmOworCisJZG8geworCQlzd2l0Y2ggKHBhcmFtcyAmIDB4ZmYpIHsKKwkJY2FzZSBETTA6CisJCQlwb3N0aW5jID0gJnJlZ2lzdGVyc1tEcmVnX2luZGV4W29wY29kZSAmIDB4MDNdXTsKKwkJCWFkZHJlc3MgKz0gKnBvc3RpbmM7CisJCQlicmVhazsKKwkJY2FzZSBETTE6CisJCQlwb3N0aW5jID0gJnJlZ2lzdGVyc1tEcmVnX2luZGV4W29wY29kZSA+PiAyICYgMHgwY11dOworCQkJYWRkcmVzcyArPSAqcG9zdGluYzsKKwkJCWJyZWFrOworCQljYXNlIERNMjoKKwkJCXBvc3RpbmMgPSAmcmVnaXN0ZXJzW0RyZWdfaW5kZXhbb3Bjb2RlID4+IDQgJiAweDMwXV07CisJCQlhZGRyZXNzICs9ICpwb3N0aW5jOworCQkJYnJlYWs7CisJCWNhc2UgQU0wOgorCQkJcG9zdGluYyA9ICZyZWdpc3RlcnNbQXJlZ19pbmRleFtvcGNvZGUgJiAweDAzXV07CisJCQlhZGRyZXNzICs9ICpwb3N0aW5jOworCQkJYnJlYWs7CisJCWNhc2UgQU0xOgorCQkJcG9zdGluYyA9ICZyZWdpc3RlcnNbQXJlZ19pbmRleFtvcGNvZGUgPj4gMiAmIDB4MGNdXTsKKwkJCWFkZHJlc3MgKz0gKnBvc3RpbmM7CisJCQlicmVhazsKKwkJY2FzZSBBTTI6CisJCQlwb3N0aW5jID0gJnJlZ2lzdGVyc1tBcmVnX2luZGV4W29wY29kZSA+PiA0ICYgMHgzMF1dOworCQkJYWRkcmVzcyArPSAqcG9zdGluYzsKKwkJCWJyZWFrOworCQljYXNlIFJNMDoKKwkJCXBvc3RpbmMgPSAmcmVnaXN0ZXJzW1JyZWdfaW5kZXhbb3Bjb2RlICYgMHgwZl1dOworCQkJYWRkcmVzcyArPSAqcG9zdGluYzsKKwkJCWJyZWFrOworCQljYXNlIFJNMToKKwkJCXBvc3RpbmMgPSAmcmVnaXN0ZXJzW1JyZWdfaW5kZXhbb3Bjb2RlID4+IDIgJiAweDBmXV07CisJCQlhZGRyZXNzICs9ICpwb3N0aW5jOworCQkJYnJlYWs7CisJCWNhc2UgUk0yOgorCQkJcG9zdGluYyA9ICZyZWdpc3RlcnNbUnJlZ19pbmRleFtvcGNvZGUgPj4gNCAmIDB4MGZdXTsKKwkJCWFkZHJlc3MgKz0gKnBvc3RpbmM7CisJCQlicmVhazsKKwkJY2FzZSBSTTQ6CisJCQlwb3N0aW5jID0gJnJlZ2lzdGVyc1tScmVnX2luZGV4W29wY29kZSA+PiA4ICYgMHgwZl1dOworCQkJYWRkcmVzcyArPSAqcG9zdGluYzsKKwkJCWJyZWFrOworCQljYXNlIFJNNjoKKwkJCXBvc3RpbmMgPSAmcmVnaXN0ZXJzW1JyZWdfaW5kZXhbb3Bjb2RlID4+IDEyICYgMHgwZl1dOworCQkJYWRkcmVzcyArPSAqcG9zdGluYzsKKwkJCWJyZWFrOworCQljYXNlIFJEMDoKKwkJCXBvc3RpbmMgPSAmcmVnaXN0ZXJzW1JyZWdfaW5kZXhbZGlzcCAmIDB4MGZdXTsKKwkJCWFkZHJlc3MgKz0gKnBvc3RpbmM7CisJCQlicmVhazsKKwkJY2FzZSBSRDI6CisJCQlwb3N0aW5jID0gJnJlZ2lzdGVyc1tScmVnX2luZGV4W2Rpc3AgPj4gNCAmIDB4MGZdXTsKKwkJCWFkZHJlc3MgKz0gKnBvc3RpbmM7CisJCQlicmVhazsKKworCQljYXNlIFNEODoKKwkJY2FzZSBTSU1NODoKKwkJCWFkZHJlc3MgKz0gKGludDMyX3QpIChpbnQ4X3QpIChkaXNwICYgMHhmZik7CisJCQlicmVhazsKKwkJY2FzZSBTRDE2OgorCQkJYWRkcmVzcyArPSAoaW50MzJfdCkgKGludDE2X3QpIChkaXNwICYgMHhmZmZmKTsKKwkJCWJyZWFrOworCQljYXNlIFNEMjQ6CisJCQl0bXAgPSBkaXNwIDw8IDg7CisJCQlhc20oImFzciA4LCUwIiA6ICI9ciIodG1wKSA6ICIwIih0bXApKTsKKwkJCWFkZHJlc3MgKz0gdG1wOworCQkJYnJlYWs7CisJCWNhc2UgU0lNTTRfMjoKKwkJCXRtcCA9IG9wY29kZSA+PiA0ICYgMHgwZjsKKwkJCXRtcCA8PD0gMjg7CisJCQlhc20oImFzciAyOCwlMCIgOiAiPXIiKHRtcCkgOiAiMCIodG1wKSk7CisJCQlhZGRyZXNzICs9IHRtcDsKKwkJCWJyZWFrOworCQljYXNlIElNTTI0OgorCQkJYWRkcmVzcyArPSBkaXNwICYgMHgwMGZmZmZmZjsKKwkJCWJyZWFrOworCQljYXNlIElNTTMyOgorCQljYXNlIElNTTMyX0hJR0g4OgorCQkJYWRkcmVzcyArPSBkaXNwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gd2hpbGUgKChwYXJhbXMgPj49IDgpKTsKKworCSpfYWRkcmVzcyA9ICh2b2lkICopIGFkZHJlc3M7CisJKl9wb3N0aW5jID0gcG9zdGluYzsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIGRldGVybWluZSB0aGUgcmVnaXN0ZXIgdGhhdCBpcyBhY3RpbmcgYXMgc291cmNlL2Rlc3QKKyAqLworc3RhdGljIGludCBtaXNhbGlnbm1lbnRfcmVnKHVuc2lnbmVkIGxvbmcgKnJlZ2lzdGVycywgdW5zaWduZWQgcGFyYW1zLAorCQkJICAgIHVuc2lnbmVkIG9wY29kZSwgdW5zaWduZWQgZGlzcCwKKwkJCSAgICB1bnNpZ25lZCBsb25nICoqX3JlZ2lzdGVyKQoreworCXBhcmFtcyAmPSAweDdmZmZmZmZmOworCisJaWYgKHBhcmFtcyAmIDB4ZmZmZmZmMDApCisJCXJldHVybiAwOworCisJc3dpdGNoIChwYXJhbXMgJiAweGZmKSB7CisJY2FzZSBETTA6CisJCSpfcmVnaXN0ZXIgPSAmcmVnaXN0ZXJzW0RyZWdfaW5kZXhbb3Bjb2RlICYgMHgwM11dOworCQlicmVhazsKKwljYXNlIERNMToKKwkJKl9yZWdpc3RlciA9ICZyZWdpc3RlcnNbRHJlZ19pbmRleFtvcGNvZGUgPj4gMiAmIDB4MDNdXTsKKwkJYnJlYWs7CisJY2FzZSBETTI6CisJCSpfcmVnaXN0ZXIgPSAmcmVnaXN0ZXJzW0RyZWdfaW5kZXhbb3Bjb2RlID4+IDQgJiAweDAzXV07CisJCWJyZWFrOworCWNhc2UgQU0wOgorCQkqX3JlZ2lzdGVyID0gJnJlZ2lzdGVyc1tBcmVnX2luZGV4W29wY29kZSAmIDB4MDNdXTsKKwkJYnJlYWs7CisJY2FzZSBBTTE6CisJCSpfcmVnaXN0ZXIgPSAmcmVnaXN0ZXJzW0FyZWdfaW5kZXhbb3Bjb2RlID4+IDIgJiAweDAzXV07CisJCWJyZWFrOworCWNhc2UgQU0yOgorCQkqX3JlZ2lzdGVyID0gJnJlZ2lzdGVyc1tBcmVnX2luZGV4W29wY29kZSA+PiA0ICYgMHgwM11dOworCQlicmVhazsKKwljYXNlIFJNMDoKKwkJKl9yZWdpc3RlciA9ICZyZWdpc3RlcnNbUnJlZ19pbmRleFtvcGNvZGUgJiAweDBmXV07CisJCWJyZWFrOworCWNhc2UgUk0xOgorCQkqX3JlZ2lzdGVyID0gJnJlZ2lzdGVyc1tScmVnX2luZGV4W29wY29kZSA+PiAyICYgMHgwZl1dOworCQlicmVhazsKKwljYXNlIFJNMjoKKwkJKl9yZWdpc3RlciA9ICZyZWdpc3RlcnNbUnJlZ19pbmRleFtvcGNvZGUgPj4gNCAmIDB4MGZdXTsKKwkJYnJlYWs7CisJY2FzZSBSTTQ6CisJCSpfcmVnaXN0ZXIgPSAmcmVnaXN0ZXJzW1JyZWdfaW5kZXhbb3Bjb2RlID4+IDggJiAweDBmXV07CisJCWJyZWFrOworCWNhc2UgUk02OgorCQkqX3JlZ2lzdGVyID0gJnJlZ2lzdGVyc1tScmVnX2luZGV4W29wY29kZSA+PiAxMiAmIDB4MGZdXTsKKwkJYnJlYWs7CisJY2FzZSBSRDA6CisJCSpfcmVnaXN0ZXIgPSAmcmVnaXN0ZXJzW1JyZWdfaW5kZXhbZGlzcCAmIDB4MGZdXTsKKwkJYnJlYWs7CisJY2FzZSBSRDI6CisJCSpfcmVnaXN0ZXIgPSAmcmVnaXN0ZXJzW1JyZWdfaW5kZXhbZGlzcCA+PiA0ICYgMHgwZl1dOworCQlicmVhazsKKwljYXNlIFNQOgorCQkqX3JlZ2lzdGVyID0gJnJlZ2lzdGVyc1tSRUdfU1AgPj4gMl07CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvbW0vbW11LWNvbnRleHQuYyBiL2FyY2gvbW4xMDMwMC9tbS9tbXUtY29udGV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYzlkMjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAvbW0vbW11LWNvbnRleHQuYwpAQCAtMCwwICsxLDgwIEBACisvKiBNTjEwMzAwIE1NVSBjb250ZXh0IGFsbG9jYXRpb24gYW5kIG1hbmFnZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisKKy8qCisgKiBsaXN0IG9mIHRoZSBNTVUgY29udGV4dHMgbGFzdCBhbGxvY2F0ZWQgb24gZWFjaCBDUFUKKyAqLwordW5zaWduZWQgbG9uZyBtbXVfY29udGV4dF9jYWNoZVtOUl9DUFVTXSA9IHsKKwlbMCAuLi4gTlJfQ1BVUyAtIDFdID0gTU1VX0NPTlRFWFRfRklSU1RfVkVSU0lPTiAqIDIgLSAxLAorfTsKKworLyoKKyAqIGZsdXNoIHRoZSBzcGVjaWZpZWQgVExCIGVudHJ5CisgKi8KK3ZvaWQgZmx1c2hfdGxiX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIHB0ZXUsIGNueCwgZmxhZ3M7CisKKwlhZGRyICY9IFBBR0VfTUFTSzsKKworCS8qIG1ha2Ugc3VyZSB0aGUgY29udGV4dCBkb2Vzbid0IG1pZ3JhdGUgYW5kIGRlZmVuZCBhZ2FpbnN0CisJICogaW50ZXJmZXJlbmNlIGZyb20gdm1hbGxvYydkIHJlZ2lvbnMgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwljbnggPSBtbV9jb250ZXh0KHZtYS0+dm1fbW0pOworCisJaWYgKGNueCAhPSBNTVVfTk9fQ09OVEVYVCkgeworCQlwdGV1ID0gYWRkciB8IChjbnggJiAweDAwMDAwMGZmVUwpOworCQlJUFRFVSA9IHB0ZXU7CisJCURQVEVVID0gcHRldTsKKwkJaWYgKElQVEVMICYgeFBURUxfVikKKwkJCUlQVEVMID0gMDsKKwkJaWYgKERQVEVMICYgeFBURUxfVikKKwkJCURQVEVMID0gMDsKKwl9CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qCisgKiBwcmVlbXB0aXZlbHkgc2V0IGEgVExCIGVudHJ5CisgKi8KK3ZvaWQgdXBkYXRlX21tdV9jYWNoZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCBwdGUpCit7CisJdW5zaWduZWQgbG9uZyBwdGV1LCBwdGVsLCBjbngsIGZsYWdzOworCisJYWRkciAmPSBQQUdFX01BU0s7CisJcHRlbCA9IHB0ZV92YWwocHRlKSAmIH4oeFBURUxfVU5VU0VEMSB8IHhQVEVMX1VOVVNFRDIpOworCisJLyogbWFrZSBzdXJlIHRoZSBjb250ZXh0IGRvZXNuJ3QgbWlncmF0ZSBhbmQgZGVmZW5kIGFnYWluc3QKKwkgKiBpbnRlcmZlcmVuY2UgZnJvbSB2bWFsbG9jJ2QgcmVnaW9ucyAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWNueCA9IG1tX2NvbnRleHQodm1hLT52bV9tbSk7CisKKwlpZiAoY254ICE9IE1NVV9OT19DT05URVhUKSB7CisJCXB0ZXUgPSBhZGRyIHwgKGNueCAmIDB4MDAwMDAwZmZVTCk7CisJCWlmICghKHB0ZV92YWwocHRlKSAmIF9QQUdFX05YKSkgeworCQkJSVBURVUgPSBwdGV1OworCQkJaWYgKElQVEVMICYgeFBURUxfVikKKwkJCQlJUFRFTCA9IHB0ZWw7CisJCX0KKwkJRFBURVUgPSBwdGV1OworCQlpZiAoRFBURUwgJiB4UFRFTF9WKQorCQkJRFBURUwgPSBwdGVsOworCX0KKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9tbS9wZ3RhYmxlLmMgYi9hcmNoL21uMTAzMDAvbW0vcGd0YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NzcwMzgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAvbW0vcGd0YWJsZS5jCkBAIC0wLDAgKzEsMTk3IEBACisvKiBNTjEwMzAwIFBhZ2UgdGFibGUgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNYXRzdXNoaXRhIEVsZWN0cmljIEluZHVzdHJpYWwgQ28uLCBMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogTW9kaWZpZWQgYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcXVpY2tsaXN0Lmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorI2luY2x1ZGUgPGFzbS90bGIuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKwordm9pZCBzaG93X21lbSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgaTsKKwlpbnQgZnJlZSA9IDAsIHRvdGFsID0gMCwgcmVzZXJ2ZWQgPSAwLCBzaGFyZWQgPSAwOworCisJaW50IGNhY2hlZCA9IDA7CisJcHJpbnRrKEtFUk5fSU5GTyAiTWVtLWluZm86XG4iKTsKKwlzaG93X2ZyZWVfYXJlYXMoKTsKKwlpID0gbWF4X21hcG5yOworCXdoaWxlIChpLS0gPiAwKSB7CisJCXRvdGFsKys7CisJCWlmIChQYWdlUmVzZXJ2ZWQobWVtX21hcCArIGkpKQorCQkJcmVzZXJ2ZWQrKzsKKwkJZWxzZSBpZiAoUGFnZVN3YXBDYWNoZShtZW1fbWFwICsgaSkpCisJCQljYWNoZWQrKzsKKwkJZWxzZSBpZiAoIXBhZ2VfY291bnQobWVtX21hcCArIGkpKQorCQkJZnJlZSsrOworCQllbHNlCisJCQlzaGFyZWQgKz0gcGFnZV9jb3VudChtZW1fbWFwICsgaSkgLSAxOworCX0KKwlwcmludGsoS0VSTl9JTkZPICIlZCBwYWdlcyBvZiBSQU1cbiIsIHRvdGFsKTsKKwlwcmludGsoS0VSTl9JTkZPICIlZCBmcmVlIHBhZ2VzXG4iLCBmcmVlKTsKKwlwcmludGsoS0VSTl9JTkZPICIlZCByZXNlcnZlZCBwYWdlc1xuIiwgcmVzZXJ2ZWQpOworCXByaW50ayhLRVJOX0lORk8gIiVkIHBhZ2VzIHNoYXJlZFxuIiwgc2hhcmVkKTsKKwlwcmludGsoS0VSTl9JTkZPICIlZCBwYWdlcyBzd2FwIGNhY2hlZFxuIiwgY2FjaGVkKTsKK30KKworLyoKKyAqIEFzc29jaWF0ZSBhIGxhcmdlIHZpcnR1YWwgcGFnZSBmcmFtZSB3aXRoIGEgZ2l2ZW4gcGh5c2ljYWwgcGFnZSBmcmFtZQorICogYW5kIHByb3RlY3Rpb24gZmxhZ3MgZm9yIHRoYXQgZnJhbWUuIHBmbiBpcyBmb3IgdGhlIGJhc2Ugb2YgdGhlIHBhZ2UsCisgKiB2YWRkciBpcyB3aGF0IHRoZSBwYWdlIGdldHMgbWFwcGVkIHRvIC0gYm90aCBtdXN0IGJlIHByb3Blcmx5IGFsaWduZWQuCisgKiBUaGUgcG1kIG11c3QgYWxyZWFkeSBiZSBpbnN0YW50aWF0ZWQuIEFzc3VtZXMgUEFFIG1vZGUuCisgKi8KK3ZvaWQgc2V0X3BtZF9wZm4odW5zaWduZWQgbG9uZyB2YWRkciwgdW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IGZsYWdzKQoreworCXBnZF90ICpwZ2Q7CisJcHVkX3QgKnB1ZDsKKwlwbWRfdCAqcG1kOworCisJaWYgKHZhZGRyICYgKFBNRF9TSVpFLTEpKSB7CQkvKiB2YWRkciBpcyBtaXNhbGlnbmVkICovCisJCXByaW50ayhLRVJOX0VSUiAic2V0X3BtZF9wZm46IHZhZGRyIG1pc2FsaWduZWRcbiIpOworCQlyZXR1cm47IC8qIEJVRygpOyAqLworCX0KKwlpZiAocGZuICYgKFBUUlNfUEVSX1BURS0xKSkgewkJLyogcGZuIGlzIG1pc2FsaWduZWQgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJzZXRfcG1kX3BmbjogcGZuIG1pc2FsaWduZWRcbiIpOworCQlyZXR1cm47IC8qIEJVRygpOyAqLworCX0KKwlwZ2QgPSBzd2FwcGVyX3BnX2RpciArIHBnZF9pbmRleCh2YWRkcik7CisJaWYgKHBnZF9ub25lKCpwZ2QpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2V0X3BtZF9wZm46IHBnZF9ub25lXG4iKTsKKwkJcmV0dXJuOyAvKiBCVUcoKTsgKi8KKwl9CisJcHVkID0gcHVkX29mZnNldChwZ2QsIHZhZGRyKTsKKwlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgdmFkZHIpOworCXNldF9wbWQocG1kLCBwZm5fcG1kKHBmbiwgZmxhZ3MpKTsKKwkvKgorCSAqIEl0J3MgZW5vdWdoIHRvIGZsdXNoIHRoaXMgb25lIG1hcHBpbmcuCisJICogKFBHRSBtYXBwaW5ncyBnZXQgZmx1c2hlZCBhcyB3ZWxsKQorCSAqLworCV9fZmx1c2hfdGxiX29uZSh2YWRkcik7Cit9CisKK3B0ZV90ICpwdGVfYWxsb2Nfb25lX2tlcm5lbChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXB0ZV90ICpwdGUgPSAocHRlX3QgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTHxfX0dGUF9SRVBFQVQpOworCWlmIChwdGUpCisJCWNsZWFyX3BhZ2UocHRlKTsKKwlyZXR1cm4gcHRlOworfQorCitzdHJ1Y3QgcGFnZSAqcHRlX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXN0cnVjdCBwYWdlICpwdGU7CisKKyNpZmRlZiBDT05GSUdfSElHSFBURQorCXB0ZSA9IGFsbG9jX3BhZ2VzKEdGUF9LRVJORUx8X19HRlBfSElHSE1FTXxfX0dGUF9SRVBFQVQsIDApOworI2Vsc2UKKwlwdGUgPSBhbGxvY19wYWdlcyhHRlBfS0VSTkVMfF9fR0ZQX1JFUEVBVCwgMCk7CisjZW5kaWYKKwlpZiAocHRlKQorCQljbGVhcl9oaWdocGFnZShwdGUpOworCXJldHVybiBwdGU7Cit9CisKKy8qCisgKiBMaXN0IG9mIGFsbCBwZ2QncyBuZWVkZWQgZm9yIG5vbi1QQUUgc28gaXQgY2FuIGludmFsaWRhdGUgZW50cmllcworICogaW4gYm90aCBjYWNoZWQgYW5kIHVuY2FjaGVkIHBnZCdzOyBub3QgbmVlZGVkIGZvciBQQUUgc2luY2UgdGhlCisgKiBrZXJuZWwgcG1kIGlzIHNoYXJlZC4gSWYgUEFFIHdlcmUgbm90IHRvIHNoYXJlIHRoZSBwbWQgYSBzaW1pbGFyCisgKiB0YWN0aWMgd291bGQgYmUgbmVlZGVkLiBUaGlzIGlzIGVzc2VudGlhbGx5IGNvZGVwYXRoLWJhc2VkIGxvY2tpbmcKKyAqIGFnYWluc3QgcGFnZWF0dHIuYzsgaXQgaXMgdGhlIHVuaXF1ZSBjYXNlIGluIHdoaWNoIGEgdmFsaWQgY2hhbmdlCisgKiBvZiBrZXJuZWwgcGFnZXRhYmxlcyBjYW4ndCBiZSBsYXppbHkgc3luY2hyb25pemVkIGJ5IHZtYWxsb2MgZmF1bHRzLgorICogdm1hbGxvYyBmYXVsdHMgd29yayBiZWNhdXNlIGF0dGFjaGVkIHBhZ2V0YWJsZXMgYXJlIG5ldmVyIGZyZWVkLgorICogSWYgdGhlIGxvY2tpbmcgcHJvdmVzIHRvIGJlIG5vbi1wZXJmb3JtYW50LCBhIHRpY2tldGluZyBzY2hlbWUgd2l0aAorICogY2hlY2tzIGF0IGR1cF9tbWFwKCksIGV4ZWMoKSwgYW5kIG90aGVyIG1tbGlzdCBhZGRpdGlvbiBwb2ludHMKKyAqIGNvdWxkIGJlIHVzZWQuIFRoZSBsb2NraW5nIHNjaGVtZSB3YXMgY2hvc2VuIG9uIHRoZSBiYXNpcyBvZgorICogbWFuZnJlZCdzIHJlY29tbWVuZGF0aW9ucyBhbmQgaGF2aW5nIG5vIGNvcmUgaW1wYWN0IHdoYXRzb2V2ZXIuCisgKiAtLSB3bGkKKyAqLworREVGSU5FX1NQSU5MT0NLKHBnZF9sb2NrKTsKK3N0cnVjdCBwYWdlICpwZ2RfbGlzdDsKKworc3RhdGljIGlubGluZSB2b2lkIHBnZF9saXN0X2FkZChwZ2RfdCAqcGdkKQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gdmlydF90b19wYWdlKHBnZCk7CisJcGFnZS0+aW5kZXggPSAodW5zaWduZWQgbG9uZykgcGdkX2xpc3Q7CisJaWYgKHBnZF9saXN0KQorCQlzZXRfcGFnZV9wcml2YXRlKHBnZF9saXN0LCAodW5zaWduZWQgbG9uZykgJnBhZ2UtPmluZGV4KTsKKwlwZ2RfbGlzdCA9IHBhZ2U7CisJc2V0X3BhZ2VfcHJpdmF0ZShwYWdlLCAodW5zaWduZWQgbG9uZykgJnBnZF9saXN0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBnZF9saXN0X2RlbChwZ2RfdCAqcGdkKQoreworCXN0cnVjdCBwYWdlICpuZXh0LCAqKnBwcmV2LCAqcGFnZSA9IHZpcnRfdG9fcGFnZShwZ2QpOworCW5leHQgPSAoc3RydWN0IHBhZ2UgKikgcGFnZS0+aW5kZXg7CisJcHByZXYgPSAoc3RydWN0IHBhZ2UgKiopIHBhZ2VfcHJpdmF0ZShwYWdlKTsKKwkqcHByZXYgPSBuZXh0OworCWlmIChuZXh0KQorCQlzZXRfcGFnZV9wcml2YXRlKG5leHQsICh1bnNpZ25lZCBsb25nKSBwcHJldik7Cit9CisKK3ZvaWQgcGdkX2N0b3Iodm9pZCAqcGdkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoUFRSU19QRVJfUE1EID09IDEpCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwZ2RfbG9jaywgZmxhZ3MpOworCisJbWVtY3B5KChwZ2RfdCAqKXBnZCArIFVTRVJfUFRSU19QRVJfUEdELAorCQkJc3dhcHBlcl9wZ19kaXIgKyBVU0VSX1BUUlNfUEVSX1BHRCwKKwkJCShQVFJTX1BFUl9QR0QgLSBVU0VSX1BUUlNfUEVSX1BHRCkgKiBzaXplb2YocGdkX3QpKTsKKworCWlmIChQVFJTX1BFUl9QTUQgPiAxKQorCQlyZXR1cm47CisKKwlwZ2RfbGlzdF9hZGQocGdkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZ2RfbG9jaywgZmxhZ3MpOworCW1lbXNldChwZ2QsIDAsIFVTRVJfUFRSU19QRVJfUEdEICogc2l6ZW9mKHBnZF90KSk7Cit9CisKKy8qIG5ldmVyIGNhbGxlZCB3aGVuIFBUUlNfUEVSX1BNRCA+IDEgKi8KK3ZvaWQgcGdkX2R0b3Iodm9pZCAqcGdkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7IC8qIGNhbiBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBnZF9sb2NrLCBmbGFncyk7CisJcGdkX2xpc3RfZGVsKHBnZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGdkX2xvY2ssIGZsYWdzKTsKK30KKworcGdkX3QgKnBnZF9hbGxvYyhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlyZXR1cm4gcXVpY2tsaXN0X2FsbG9jKDAsIEdGUF9LRVJORUwsIHBnZF9jdG9yKTsKK30KKwordm9pZCBwZ2RfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcGdkX3QgKnBnZCkKK3sKKwlxdWlja2xpc3RfZnJlZSgwLCBwZ2RfZHRvciwgcGdkKTsKK30KKwordm9pZCBfX2luaXQgcGd0YWJsZV9jYWNoZV9pbml0KHZvaWQpCit7Cit9CisKK3ZvaWQgY2hlY2tfcGd0X2NhY2hlKHZvaWQpCit7CisJcXVpY2tsaXN0X3RyaW0oMCwgcGdkX2R0b3IsIDI1LCAxNik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvbW0vdGxiLW1uMTAzMDAuUyBiL2FyY2gvbW4xMDMwMC9tbS90bGItbW4xMDMwMC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OTIwODAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAvbW0vdGxiLW1uMTAzMDAuUwpAQCAtMCwwICsxLDIwNyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBUTEIgbG9hZGluZyBmdW5jdGlvbnMKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA3IE1hdHN1c2hpdGEgRWxlY3RyaWMgSW5kdXN0cmlhbCBDby4sIEx0ZC4KKyMgQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgTW9kaWZpZWQgYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyMgMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyNpbmNsdWRlIDxsaW51eC9zeXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgorI2luY2x1ZGUgPGFzbS9pbnRjdGwtcmVncy5oPgorI2luY2x1ZGUgPGFzbS9mcmFtZS5pbmM+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEluc3RydWN0aW9uIFRMQiBNaXNzIGhhbmRsZXIgZW50cnkgcG9pbnQKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkudHlwZQlpdGxiX21pc3MsQGZ1bmN0aW9uCitFTlRSWShpdGxiX21pc3MpCisJYW5kCX5FUFNXX05NSUQsZXBzdworI2lmZGVmIENPTkZJR19HREJTVFVCCisJbW92bQlbZDIsZDMsYTJdLChzcCkKKyNlbHNlCisJb3IJRVBTV19uQVIsZXBzdwkJIyBzd2l0Y2ggRDAtRDMgJiBBMC1BMyB0byB0aGUgYWx0ZXJuYXRlCisJCQkJCSMgcmVnaXN0ZXIgYmFuaworCW5vcAorCW5vcAorCW5vcAorI2VuZGlmCisKKwltb3YJKElQVEVVKSxkMworCW1vdgkoUFRCUiksYTIKKwltb3YJZDMsZDIKKwlhbmQJMHhmZmMwMDAwMCxkMgorCWxzcgkyMCxkMgorCW1vdgkoYTIsZDIpLGEyCQkjIFBURCAqcHRkID0gUEdEW2FkZHIgMzEuLjIyXQorCWJ0c3QJX1BBR0VfVkFMSUQsYTIKKwliZXEJaXRsYl9taXNzX2ZhdWx0CQkjIGp1bXAgaWYgZG9lc24ndCBwb2ludCBhbnl3aGVyZQorCisJYW5kCX4oUEFHRV9TSVpFLTEpLGEyCisJbW92CWQzLGQyCisJYW5kCTB4MDAzZmYwMDAsZDIKKwlsc3IJMTAsZDIKKwlhZGQJZDIsYTIKKwltb3YJKGEyKSxkMgkJCSMgZ2V0IHB0ZSBmcm9tIFBURFthZGRyIDIxLi4xMl0KKwlidHN0CV9QQUdFX1ZBTElELGQyCisJYmVxCWl0bGJfbWlzc19mYXVsdAkJIyBqdW1wIGlmIGRvZXNuJ3QgcG9pbnQgdG8gYSBwYWdlCisJCQkJCSMgKG1pZ2h0IGJlIGEgc3dhcCBpZCkKKwlic2V0CV9QQUdFX0FDQ0VTU0VELCgwLGEyKQorCWFuZAl+KHhQVEVMX1VOVVNFRDF8eFBURUxfVU5VU0VEMiksZDIKK2l0bGJfbWlzc19zZXQ6CisJbW92CWQyLChJUFRFTCkJCSMgY2hhbmdlIHRoZSBUTEIKKyNpZmRlZiBDT05GSUdfR0RCU1RVQgorCW1vdm0JKHNwKSxbZDIsZDMsYTJdCisjZW5kaWYKKwlydGkKKworaXRsYl9taXNzX2ZhdWx0OgorCW1vdglfUEFHRV9WQUxJRCxkMgkJIyBmb3JjZSBhZGRyZXNzIGVycm9yIGhhbmRsZXIgdG8gYmUKKwkJCQkJIyBpbnZva2VkCisJYnJhCWl0bGJfbWlzc19zZXQKKworCS5zaXplCWl0bGJfbWlzcywgLiAtIGl0bGJfbWlzcworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIERhdGEgVExCIE1pc3MgaGFuZGxlciBlbnRyeSBwb2ludAorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCS50eXBlCWR0bGJfbWlzcyxAZnVuY3Rpb24KK0VOVFJZKGR0bGJfbWlzcykKKwlhbmQJfkVQU1dfTk1JRCxlcHN3CisjaWZkZWYgQ09ORklHX0dEQlNUVUIKKwltb3ZtCVtkMixkMyxhMl0sKHNwKQorI2Vsc2UKKwlvcglFUFNXX25BUixlcHN3CQkjIHN3aXRjaCBEMC1EMyAmIEEwLUEzIHRvIHRoZSBhbHRlcm5hdGUKKwkJCQkJIyByZWdpc3RlciBiYW5rCisJbm9wCisJbm9wCisJbm9wCisjZW5kaWYKKworCW1vdgkoRFBURVUpLGQzCisJbW92CShQVEJSKSxhMgorCW1vdglkMyxkMgorCWFuZAkweGZmYzAwMDAwLGQyCisJbHNyCTIwLGQyCisJbW92CShhMixkMiksYTIJCSMgUFREICpwdGQgPSBQR0RbYWRkciAzMS4uMjJdCisJYnRzdAlfUEFHRV9WQUxJRCxhMgorCWJlcQlkdGxiX21pc3NfZmF1bHQJCSMganVtcCBpZiBkb2Vzbid0IHBvaW50IGFueXdoZXJlCisKKwlhbmQJfihQQUdFX1NJWkUtMSksYTIKKwltb3YJZDMsZDIKKwlhbmQJMHgwMDNmZjAwMCxkMgorCWxzcgkxMCxkMgorCWFkZAlkMixhMgorCW1vdgkoYTIpLGQyCQkJIyBnZXQgcHRlIGZyb20gUFREW2FkZHIgMjEuLjEyXQorCWJ0c3QJX1BBR0VfVkFMSUQsZDIKKwliZXEJZHRsYl9taXNzX2ZhdWx0CQkjIGp1bXAgaWYgZG9lc24ndCBwb2ludCB0byBhIHBhZ2UKKwkJCQkJIyAobWlnaHQgYmUgYSBzd2FwIGlkKQorCWJzZXQJX1BBR0VfQUNDRVNTRUQsKDAsYTIpCisJYW5kCX4oeFBURUxfVU5VU0VEMXx4UFRFTF9VTlVTRUQyKSxkMgorZHRsYl9taXNzX3NldDoKKwltb3YJZDIsKERQVEVMKQkJIyBjaGFuZ2UgdGhlIFRMQgorI2lmZGVmIENPTkZJR19HREJTVFVCCisJbW92bQkoc3ApLFtkMixkMyxhMl0KKyNlbmRpZgorCXJ0aQorCitkdGxiX21pc3NfZmF1bHQ6CisJbW92CV9QQUdFX1ZBTElELGQyCQkjIGZvcmNlIGFkZHJlc3MgZXJyb3IgaGFuZGxlciB0byBiZQorCQkJCQkjIGludm9rZWQKKwlicmEJZHRsYl9taXNzX3NldAorCS5zaXplCWR0bGJfbWlzcywgLiAtIGR0bGJfbWlzcworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEluc3RydWN0aW9uIFRMQiBBZGRyZXNzIEVycm9yIGhhbmRsZXIgZW50cnkgcG9pbnQKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkudHlwZQlpdGxiX2FlcnJvcixAZnVuY3Rpb24KK0VOVFJZKGl0bGJfYWVycm9yKQorCWFuZAl+RVBTV19OTUlELGVwc3cKKwlhZGQJLTQsc3AKKwlTQVZFX0FMTAorCWFkZAktNCxzcAkJCQkjIG5lZWQgdG8gcGFzcyB0aHJlZSBwYXJhbXMKKworCSMgY2FsY3VsYXRlIHRoZSBmYXVsdCBjb2RlCisJbW92aHUJKE1NVUZDUl9JRkMpLGQxCisJb3IJMHgwMDAxMDAwMCxkMQkJCSMgaXQncyBhbiBpbnN0cnVjdGlvbiBmZXRjaAorCisJIyBkZXRlcm1pbmUgdGhlIHBhZ2UgYWRkcmVzcworCW1vdgkoSVBURVUpLGEyCisJbW92CWEyLGQwCisJYW5kCVBBR0VfTUFTSyxkMAorCW1vdglkMCwoMTIsc3ApCisKKwljbHIJZDAKKwltb3YJZDAsKElQVEVMKQorCisJYW5kCX5FUFNXX05NSUQsZXBzdworCW9yCUVQU1dfSUUsZXBzdworCW1vdglmcCxkMAorCWNhbGwJZG9fcGFnZV9mYXVsdFtdLDAJCSMgZG9fcGFnZV9mYXVsdChyZWdzLGNvZGUsYWRkcgorCisJam1wCXJldF9mcm9tX2V4Y2VwdGlvbgorCS5zaXplCWl0bGJfYWVycm9yLCAuIC0gaXRsYl9hZXJyb3IKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBEYXRhIFRMQiBBZGRyZXNzIEVycm9yIGhhbmRsZXIgZW50cnkgcG9pbnQKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkudHlwZQlkdGxiX2FlcnJvcixAZnVuY3Rpb24KK0VOVFJZKGR0bGJfYWVycm9yKQorCWFuZAl+RVBTV19OTUlELGVwc3cKKwlhZGQJLTQsc3AKKwltb3YJZDEsKHNwKQorCisJbW92aHUJKE1NVUZDUl9ERkMpLGQxCQkJIyBpcyBpdCB0aGUgaW5pdGlhbCB2YWxpZCB3cml0ZQorCQkJCQkJIyB0byB0aGlzIHBhZ2U/CisJYW5kCU1NVUZDUl94RkNfSU5JVFdSLGQxCisgCWJlcQlkdGxiX3BhZ2VmYXVsdAkJCSMganVtcCBpZiBub3QKKworCW1vdgkoRFBURUwpLGQxCQkJIyBzZXQgdGhlIGRpcnR5IGJpdAorCQkJCQkJIyAoZG9uJ3QgcmVwbGFjZSB3aXRoIEJTRVQhKQorCW9yCV9QQUdFX0RJUlRZLGQxCisJbW92CWQxLChEUFRFTCkKKwltb3YJKHNwKSxkMQorCWFkZAk0LHNwCisgCXJ0aQorCisJQUxJR04KK2R0bGJfcGFnZWZhdWx0OgorCW1vdgkoc3ApLGQxCisJU0FWRV9BTEwKKwlhZGQJLTQsc3AJCQkJIyBuZWVkIHRvIHBhc3MgdGhyZWUgcGFyYW1zCisKKwkjIGNhbGN1bGF0ZSB0aGUgZmF1bHQgY29kZQorCW1vdmh1CShNTVVGQ1JfREZDKSxkMQorCisJIyBkZXRlcm1pbmUgdGhlIHBhZ2UgYWRkcmVzcworCW1vdgkoRFBURVUpLGEyCisJbW92CWEyLGQwCisJYW5kCVBBR0VfTUFTSyxkMAorCW1vdglkMCwoMTIsc3ApCisKKwljbHIJZDAKKwltb3YJZDAsKERQVEVMKQorCisJYW5kCX5FUFNXX05NSUQsZXBzdworCW9yCUVQU1dfSUUsZXBzdworCW1vdglmcCxkMAorCWNhbGwJZG9fcGFnZV9mYXVsdFtdLDAJCSMgZG9fcGFnZV9mYXVsdChyZWdzLGNvZGUsYWRkcgorCisJam1wCXJldF9mcm9tX2V4Y2VwdGlvbgorCS5zaXplCWR0bGJfYWVycm9yLCAuIC0gZHRsYl9hZXJyb3IKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9vcHJvZmlsZS9LY29uZmlnIGIvYXJjaC9tbjEwMzAwL29wcm9maWxlL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlkMzc3MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC9vcHJvZmlsZS9LY29uZmlnCkBAIC0wLDAgKzEsMjMgQEAKKworbWVudSAiUHJvZmlsaW5nIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKworY29uZmlnIFBST0ZJTElORworCWJvb2wgIlByb2ZpbGluZyBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHRoZSBleHRlbmRlZCBwcm9maWxpbmcgc3VwcG9ydCBtZWNoYW5pc21zIHVzZWQKKwkgIGJ5IHByb2ZpbGVycyBzdWNoIGFzIE9Qcm9maWxlLgorCisKK2NvbmZpZyBPUFJPRklMRQorCXRyaXN0YXRlICJPUHJvZmlsZSBzeXN0ZW0gcHJvZmlsaW5nIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gUFJPRklMSU5HCisJaGVscAorCSAgT1Byb2ZpbGUgaXMgYSBwcm9maWxpbmcgc3lzdGVtIGNhcGFibGUgb2YgcHJvZmlsaW5nIHRoZQorCSAgd2hvbGUgc3lzdGVtLCBpbmNsdWRlIHRoZSBrZXJuZWwsIGtlcm5lbCBtb2R1bGVzLCBsaWJyYXJpZXMsCisJICBhbmQgYXBwbGljYXRpb25zLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitlbmRtZW51CisKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9vcHJvZmlsZS9NYWtlZmlsZSBiL2FyY2gvbW4xMDMwMC9vcHJvZmlsZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MThkYmU2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL29wcm9maWxlL01ha2VmaWxlCkBAIC0wLDAgKzEsMTMgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBNTjEwMzAwLXNwZWNpZmljIHByb2ZpbGluZyBjb2RlCisjCitvYmotJChDT05GSUdfT1BST0ZJTEUpICs9IG9wcm9maWxlLm8KKworRFJJVkVSX09CSlMgPSAkKGFkZHByZWZpeCAuLi8uLi8uLi9kcml2ZXJzL29wcm9maWxlLywgXAorCQlvcHJvZi5vIGNwdV9idWZmZXIubyBidWZmZXJfc3luYy5vIFwKKwkJZXZlbnRfYnVmZmVyLm8gb3Byb2ZpbGVfZmlsZXMubyBcCisJCW9wcm9maWxlZnMubyBvcHJvZmlsZV9zdGF0cy5vIFwKKwkJdGltZXJfaW50Lm8gKQorCitvcHJvZmlsZS15CQkJCTo9ICQoRFJJVkVSX09CSlMpIG9wX21vZGVsX251bGwubworCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvb3Byb2ZpbGUvb3BfbW9kZWxfbnVsbC5jIGIvYXJjaC9tbjEwMzAwL29wcm9maWxlL29wX21vZGVsX251bGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDRhYjM3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL29wcm9maWxlL29wX21vZGVsX251bGwuYwpAQCAtMCwwICsxLDIyIEBACisvKiBOdWxsIHByb2ZpbGluZyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5jZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L29wcm9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK2ludCBfX2luaXQgb3Byb2ZpbGVfYXJjaF9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICpvcHMpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3ZvaWQgb3Byb2ZpbGVfYXJjaF9leGl0KHZvaWQpCit7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9wcm9jLW1uMTAzZTAxMC9NYWtlZmlsZSBiL2FyY2gvbW4xMDMwMC9wcm9jLW1uMTAzZTAxMC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzJjOTc4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL3Byb2MtbW4xMDNlMDEwL01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIE1OMTAzRTAxMCBwcm9jZXNzb3IgY2hpcCBzcGVjaWZpYyBjb2RlCisjCitvYmoteSAgIDo9IHByb2MtaW5pdC5vCisKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9wcm9jLW1uMTAzZTAxMC9wcm9jLWluaXQuYyBiL2FyY2gvbW4xMDMwMC9wcm9jLW1uMTAzZTAxMC9wcm9jLWluaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTQ4MmVmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL3Byb2MtbW4xMDNlMDEwL3Byb2MtaW5pdC5jCkBAIC0wLDAgKzEsNzUgQEAKKy8qIE1OMTAzRTAxMCBQcm9jZXNzb3IgaW5pdGlhbGlzYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vcnRjLmg+CisKKy8qCisgKiBpbml0aWFsaXNlIHRoZSBvbi1zaWxpY29uIHByb2Nlc3NvciBwZXJpcGhlcmFscworICovCithc21saW5rYWdlIHZvaWQgX19pbml0IHByb2Nlc3Nvcl9pbml0KHZvaWQpCit7CisJaW50IGxvb3A7CisKKwkvKiBzZXQgdXAgdGhlIGV4Y2VwdGlvbiB0YWJsZSBmaXJzdCAqLworCWZvciAobG9vcCA9IDB4MDAwOyBsb29wIDwgMHg0MDA7IGxvb3AgKz0gOCkKKwkJX19zZXRfaW50cl9zdHViKGxvb3AsIF9fY29tbW9uX2V4Y2VwdGlvbik7CisKKwlfX3NldF9pbnRyX3N0dWIoRVhDRVBfSVRMQk1JU1MsCQlpdGxiX21pc3MpOworCV9fc2V0X2ludHJfc3R1YihFWENFUF9EVExCTUlTUywJCWR0bGJfbWlzcyk7CisJX19zZXRfaW50cl9zdHViKEVYQ0VQX0lBRVJST1IsCQlpdGxiX2FlcnJvcik7CisJX19zZXRfaW50cl9zdHViKEVYQ0VQX0RBRVJST1IsCQlkdGxiX2FlcnJvcik7CisJX19zZXRfaW50cl9zdHViKEVYQ0VQX0JVU0VSUk9SLAkJcmF3X2J1c19lcnJvcik7CisJX19zZXRfaW50cl9zdHViKEVYQ0VQX0RPVUJMRV9GQVVMVCwJZG91YmxlX2ZhdWx0KTsKKwlfX3NldF9pbnRyX3N0dWIoRVhDRVBfU1lTQ0FMTDAsCQlzeXN0ZW1fY2FsbCk7CisKKwlfX3NldF9pbnRyX3N0dWIoRVhDRVBfTk1JLAkJbm1pX2hhbmRsZXIpOworCV9fc2V0X2ludHJfc3R1YihFWENFUF9XRFQsCQlubWlfaGFuZGxlcik7CisJX19zZXRfaW50cl9zdHViKEVYQ0VQX0lSUV9MRVZFTDAsCWlycV9oYW5kbGVyKTsKKwlfX3NldF9pbnRyX3N0dWIoRVhDRVBfSVJRX0xFVkVMMSwJaXJxX2hhbmRsZXIpOworCV9fc2V0X2ludHJfc3R1YihFWENFUF9JUlFfTEVWRUwyLAlpcnFfaGFuZGxlcik7CisJX19zZXRfaW50cl9zdHViKEVYQ0VQX0lSUV9MRVZFTDMsCWlycV9oYW5kbGVyKTsKKwlfX3NldF9pbnRyX3N0dWIoRVhDRVBfSVJRX0xFVkVMNCwJaXJxX2hhbmRsZXIpOworCV9fc2V0X2ludHJfc3R1YihFWENFUF9JUlFfTEVWRUw1LAlpcnFfaGFuZGxlcik7CisJX19zZXRfaW50cl9zdHViKEVYQ0VQX0lSUV9MRVZFTDYsCWlycV9oYW5kbGVyKTsKKworCUlWQVIwID0gRVhDRVBfSVJRX0xFVkVMMDsKKwlJVkFSMSA9IEVYQ0VQX0lSUV9MRVZFTDE7CisJSVZBUjIgPSBFWENFUF9JUlFfTEVWRUwyOworCUlWQVIzID0gRVhDRVBfSVJRX0xFVkVMMzsKKwlJVkFSNCA9IEVYQ0VQX0lSUV9MRVZFTDQ7CisJSVZBUjUgPSBFWENFUF9JUlFfTEVWRUw1OworCUlWQVI2ID0gRVhDRVBfSVJRX0xFVkVMNjsKKworCW1uMTAzMDBfZGNhY2hlX2ZsdXNoX2ludigpOworCW1uMTAzMDBfaWNhY2hlX2ludigpOworCisJLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyBhbmQgc2V0IHRvIHByaW9yaXR5IDYgKGxvd2VzdCkgKi8KKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgTlJfSVJRUzsgbG9vcCsrKQorCQlHeElDUihsb29wKSA9IEd4SUNSX0xFVkVMXzYgfCBHeElDUl9ERVRFQ1Q7CisKKwkvKiBjbGVhciB0aGUgdGltZXJzICovCisJVE0wTUQJPSAwOworCVRNMU1ECT0gMDsKKwlUTTJNRAk9IDA7CisJVE0zTUQJPSAwOworCVRNNE1ECT0gMDsKKwlUTTVNRAk9IDA7CisJVE02TUQJPSAwOworCVRNNk1EQQk9IDA7CisJVE02TURCCT0gMDsKKwlUTTdNRAk9IDA7CisJVE04TUQJPSAwOworCVRNOU1ECT0gMDsKKwlUTTEwTUQJPSAwOworCVRNMTFNRAk9IDA7CisKKwljYWxpYnJhdGVfY2xvY2soKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzMDMvTWFrZWZpbGUgYi9hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzAzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YTViYjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzAzL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBNYWtlZmlsZSBmb3IgdGhlIEFTQjIzMDMgYm9hcmQKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK29iai15ICAgOj0gdW5pdC1pbml0Lm8gc21jOTExMTEubyBmbGFzaC5vIGxlZHMubwpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL3VuaXQtYXNiMjMwMy9mbGFzaC5jIGIvYXJjaC9tbjEwMzAwL3VuaXQtYXNiMjMwMy9mbGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZmUwODMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzAzL2ZsYXNoLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qIEhhbmRsZSBtYXBwaW5nIG9mIHRoZSBmbGFzaCBvbiB0aGUgQVNCMjMwMyBib2FyZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisKKyNkZWZpbmUgQVNCMjMwM19QUk9NX0FERFIJMHhBMDAwMDAwMAkvKiBCb290IFBST00gKi8KKyNkZWZpbmUgQVNCMjMwM19QUk9NX1NJWkUJKDIgKiAxMDI0ICogMTAyNCkKKyNkZWZpbmUgQVNCMjMwM19GTEFTSF9BRERSCTB4QTQwMDAwMDAJLyogU3lzdGVtIEZsYXNoICovCisjZGVmaW5lIEFTQjIzMDNfRkxBU0hfU0laRQkoMzIgKiAxMDI0ICogMTAyNCkKKyNkZWZpbmUgQVNCMjMwM19DT05GSUdfQUREUgkweEE2MDAwMDAwCS8qIFN5c3RlbSBDb25maWcgRUVQUk9NICovCisjZGVmaW5lIEFTQjIzMDNfQ09ORklHX1NJWkUJKDggKiAxMDI0KQorCisvKgorICogZGVmYXVsdCBNVEQgcGFydGl0aW9uIHRhYmxlIGZvciBib3RoIG1haW4gZmxhc2ggZGV2aWNlcywgZXhwZWN0ZWQgdG8gYmUKKyAqIG92ZXJyaWRkZW4gYnkgUmVkQm9vdAorICovCitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gYXNiMjMwM19wYXJ0aXRpb25zW10gPSB7CisJeworCQkubmFtZQkJPSAiQm9vdGxvYWRlciIsCisJCS5zaXplCQk9IDB4MDAwNDAwMDAsCisJCS5vZmZzZXQJCT0gMCwKKwkJLm1hc2tfZmxhZ3MJPSBNVERfQ0FQX1JPTSAvKiBmb3JjZSByZWFkLW9ubHkgKi8KKwl9LCB7CisJCS5uYW1lCQk9ICJLZXJuZWwiLAorCQkuc2l6ZQkJPSAweDAwNDAwMDAwLAorCQkub2Zmc2V0CQk9IDB4MDAwNDAwMDAsCisJfSwgeworCQkubmFtZQkJPSAiRmlsZXN5c3RlbSIsCisJCS5zaXplCQk9IE1URFBBUlRfU0laX0ZVTEwsCisJCS5vZmZzZXQJCT0gMHgwMDQ0MDAwMAorCX0KK307CisKKy8qCisgKiB0aGUgQVNCMjMwMyBCb290IFBST00gZGVmaW5pdGlvbgorICovCitzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBhc2IyMzAzX2Jvb3Rwcm9tX2RhdGEgPSB7CisJLndpZHRoCQk9IDIsCisJLm5yX3BhcnRzCT0gMSwKKwkucGFydHMJCT0gYXNiMjMwM19wYXJ0aXRpb25zLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhc2IyMzAzX2Jvb3Rwcm9tX3Jlc291cmNlID0geworCS5zdGFydAkJPSBBU0IyMzAzX1BST01fQUREUiwKKwkuZW5kCQk9IEFTQjIzMDNfUFJPTV9BRERSICsgQVNCMjMwM19QUk9NX1NJWkUsCisJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXNiMjMwM19ib290cHJvbSA9IHsKKwkubmFtZQkJPSAicGh5c21hcC1mbGFzaCIsCisJLmlkCQk9IDAsCisJLmRldi5wbGF0Zm9ybV9kYXRhID0gJmFzYjIzMDNfYm9vdHByb21fZGF0YSwKKwkubnVtX3Jlc291cmNlcwk9IDEsCisJLnJlc291cmNlCT0gJmFzYjIzMDNfYm9vdHByb21fcmVzb3VyY2UsCit9OworCisvKgorICogdGhlIEFTQjIzMDMgU3lzdGVtIEZsYXNoIGRlZmluaXRpb24KKyAqLworc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgYXNiMjMwM19zeXNmbGFzaF9kYXRhID0geworCS53aWR0aAkJPSA0LAorCS5ucl9wYXJ0cwk9IDEsCisJLnBhcnRzCQk9IGFzYjIzMDNfcGFydGl0aW9ucywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXNiMjMwM19zeXNmbGFzaF9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJCT0gQVNCMjMwM19GTEFTSF9BRERSLAorCS5lbmQJCT0gQVNCMjMwM19GTEFTSF9BRERSICsgQVNCMjMwM19GTEFTSF9TSVpFLAorCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGFzYjIzMDNfc3lzZmxhc2ggPSB7CisJLm5hbWUJCT0gInBoeXNtYXAtZmxhc2giLAorCS5pZAkJPSAxLAorCS5kZXYucGxhdGZvcm1fZGF0YSA9ICZhc2IyMzAzX3N5c2ZsYXNoX2RhdGEsCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5yZXNvdXJjZQk9ICZhc2IyMzAzX3N5c2ZsYXNoX3Jlc291cmNlLAorfTsKKworLyoKKyAqIHJlZ2lzdGVyIHRoZSBBU0IyMzAzIGZsYXNoZXMKKyAqLworc3RhdGljIGludCBfX2luaXQgYXNiMjMwM19tdGRfaW5pdCh2b2lkKQoreworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXNiMjMwM19ib290cHJvbSk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhc2IyMzAzX3N5c2ZsYXNoKTsKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQoYXNiMjMwM19tdGRfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzAzL2xlZHMuYyBiL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzMDMvbGVkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNGJjNzgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzAzL2xlZHMuYwpAQCAtMCwwICsxLDUyIEBACisvKiBBU0IyMzAzIHBlcmlwaGVyYWwgNy1zZWdtZW50IExFRHMgeDEgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pbnRjdGwtcmVncy5oPgorI2luY2x1ZGUgPGFzbS9ydGMtcmVncy5oPgorI2luY2x1ZGUgPGFzbS91bml0L2xlZHMuaD4KKworI2lmIDAKK3N0YXRpYyBjb25zdCB1OCBhc2IyMzAzX2xlZF9oZXhfdGJsWzE2XSA9IHsKKwkweDgwLCAweGYyLCAweDQ4LCAweDYwLCAweDMyLCAweDI0LCAweDA0LCAweGYwLAorCTB4MDAsIDB4MjAsIDB4MTAsIDB4MDYsIDB4OGMsIDB4NDIsIDB4MGMsIDB4MWMKK307CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHU4IGFzYjIzMDNfbGVkX2NoYXNlX3RibFs2XSA9IHsKKwl+MHgwMiwJLyogdG9wCQktIHNlZ0EgKi8KKwl+MHgwNCwJLyogcmlnaHQgdG9wCS0gc2VnQiAqLworCX4weDA4LAkvKiByaWdodCBib3R0b20JLSBzZWdDICovCisJfjB4MTAsCS8qIGJvdHRvbQktIHNlZ0QgKi8KKwl+MHgyMCwJLyogbGVmdCBib3R0b20JLSBzZWdFICovCisJfjB4NDAsCS8qIGxlZnQgdG9wCS0gc2VnRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGFzYjIzMDNfbGVkX2NoYXNlOworCit2b2lkIHBlcmlwaGVyYWxfbGVkc19kaXNwbGF5X2V4Y2VwdGlvbihlbnVtIGV4Y2VwdGlvbl9jb2RlIGNvZGUpCit7CisJQVNCMjMwM19HUElPMERFRiA9IDB4NTU1NTsJLyogY29uZmlndXJlIGFzIGFuIG91dHB1dCBwb3J0ICovCisJQVNCMjMwM183U0VHTEVEUyA9IDB4NmQ7CS8qIHRyaXBsZSBob3Jpem9udGFsIGJhciAqLworfQorCit2b2lkIHBlcmlwaGVyYWxfbGVkc19sZWRfY2hhc2Uodm9pZCkKK3sKKwlBU0IyMzAzX0dQSU8wREVGID0gMHg1NTU1OwkvKiBjb25maWd1cmUgYXMgYW4gb3V0cHV0IHBvcnQgKi8KKwlBU0IyMzAzXzdTRUdMRURTID0gYXNiMjMwM19sZWRfY2hhc2VfdGJsW2FzYjIzMDNfbGVkX2NoYXNlXTsKKwlhc2IyMzAzX2xlZF9jaGFzZSsrOworCWlmIChhc2IyMzAzX2xlZF9jaGFzZSA+PSA2KQorCQlhc2IyMzAzX2xlZF9jaGFzZSA9IDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzAzL3NtYzkxMTExLmMgYi9hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzAzL3NtYzkxMTExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA4NzVkZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzMDMvc21jOTExMTEuYwpAQCAtMCwwICsxLDUyIEBACisvKiBBU0IyMzAzIGluaXRpYWxpc2F0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS90aW1leC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW50Y3RsLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vdW5pdC9zbWM5MTExMS5oPgorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtYzkxYzExMV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAkJPSBTTUM5MTExMV9CQVNFLAorCQkuZW5kCQk9IFNNQzkxMTExX0JBU0VfRU5ELAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAkJPSBTTUM5MTExMV9JUlEsCisJCS5lbmQJCT0gU01DOTExMTFfSVJRLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNtYzkxYzExMV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNtYzkxeCIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNtYzkxYzExMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHNtYzkxYzExMV9yZXNvdXJjZXMsCit9OworCisvKgorICogYWRkIHBsYXRmb3JtIGRldmljZXMKKyAqLworc3RhdGljIGludCBfX2luaXQgdW5pdF9kZXZpY2VfaW5pdCh2b2lkKQoreworCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmc21jOTFjMTExX2RldmljZSk7CisJcmV0dXJuIDA7Cit9CisKK2RldmljZV9pbml0Y2FsbCh1bml0X2RldmljZV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzMDMvdW5pdC1pbml0LmMgYi9hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzAzL3VuaXQtaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YjJjODEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzAzL3VuaXQtaW5pdC5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qIEFTQjIzMDMgaW5pdGlhbGlzYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW50Y3RsLXJlZ3MuaD4KKworLyoKKyAqIGluaXRpYWxpc2Ugc29tZSBvZiB0aGUgdW5pdCBoYXJkd2FyZSBiZWZvcmUgZ2Ric3R1YiBpcyBzZXQgdXAKKyAqLworYXNtbGlua2FnZSB2b2lkIF9faW5pdCB1bml0X2luaXQodm9pZCkKK3sKKwkvKiBzZXQgdXAgdGhlIGV4dGVybmFsIGludGVycnVwdHMgKi8KKwlTRVRfWElSUV9UUklHR0VSKDAsIFhJUlFfVFJJR0dFUl9ISUxFVkVMKTsKKwlTRVRfWElSUV9UUklHR0VSKDIsIFhJUlFfVFJJR0dFUl9MT1dMRVZFTCk7CisJU0VUX1hJUlFfVFJJR0dFUigzLCBYSVJRX1RSSUdHRVJfSElMRVZFTCk7CisJU0VUX1hJUlFfVFJJR0dFUig0LCBYSVJRX1RSSUdHRVJfTE9XTEVWRUwpOworCVNFVF9YSVJRX1RSSUdHRVIoNSwgWElSUV9UUklHR0VSX0xPV0xFVkVMKTsKK30KKworLyoKKyAqIGluaXRpYWxpc2UgdGhlIHJlc3Qgb2YgdGhlIHVuaXQgaGFyZHdhcmUgYWZ0ZXIgZ2Ric3R1YiBpcyByZWFkeQorICovCit2b2lkIF9faW5pdCB1bml0X3NldHVwKHZvaWQpCit7Cit9CisKKy8qCisgKiBpbml0aWFsaXNlIHRoZSBleHRlcm5hbCBpbnRlcnJ1cHRzIHVzZWQgYnkgYSB1bml0IG9mIHRoaXMgdHlwZQorICovCit2b2lkIF9faW5pdCB1bml0X2luaXRfSVJRKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGV4dG51bTsKKworCWZvciAoZXh0bnVtID0gMDsgZXh0bnVtIDwgTlJfWElSUVM7IGV4dG51bSsrKSB7CisJCXN3aXRjaCAoR0VUX1hJUlFfVFJJR0dFUihleHRudW0pKSB7CisJCWNhc2UgWElSUV9UUklHR0VSX0hJTEVWRUw6CisJCWNhc2UgWElSUV9UUklHR0VSX0xPV0xFVkVMOgorCQkJc2V0X2lycV9oYW5kbGVyKFhJUlEySVJRKGV4dG51bSksIGhhbmRsZV9sZXZlbF9pcnEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzMDUvTWFrZWZpbGUgYi9hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzA1L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NTEwMjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzA1L01ha2VmaWxlCkBAIC0wLDAgKzEsOCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBNYWtlZmlsZSBmb3IgdGhlIEFTQjIzMDUgYm9hcmQKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK29iai15ICAgOj0gdW5pdC1pbml0Lm8gbGVkcy5vCisKK29iai0kKENPTkZJR19QQ0kpICs9IHBjaS5vIHBjaS1hc2IyMzA1Lm8gcGNpLWlycS5vIHBjaS1pb21hcC5vCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzA1L2xlZHMuYyBiL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzMDUvbGVkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OWRjYzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzA1L2xlZHMuYwpAQCAtMCwwICsxLDEyNCBAQAorLyogQVNCMjMwNSBQZXJpcGhlcmFsIDctc2VnbWVudCBMRURzIHg0IHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2NwdS9pbnRjdGwtcmVncy5oPgorI2luY2x1ZGUgPGFzbS9jcHUvcnRjLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vdW5pdC9sZWRzLmg+CisKK3N0YXRpYyBjb25zdCB1OCBhc2IyMzA1X2xlZF9oZXhfdGJsWzE2XSA9IHsKKwkweDgwLCAweGYyLCAweDQ4LCAweDYwLCAweDMyLCAweDI0LCAweDA0LCAweGYwLAorCTB4MDAsIDB4MjAsIDB4MTAsIDB4MDYsIDB4OGMsIDB4NDIsIDB4MGMsIDB4MWMKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXNiMjMwNV9sZWRfY2hhc2VfdGJsWzZdID0geworCX4weDAyMDIwMjAyLAkvKiB0b3AJCS0gc2VnQSAqLworCX4weDA0MDQwNDA0LAkvKiByaWdodCB0b3AJLSBzZWdCICovCisJfjB4MDgwODA4MDgsCS8qIHJpZ2h0IGJvdHRvbQktIHNlZ0MgKi8KKwl+MHgxMDEwMTAxMCwJLyogYm90dG9tCS0gc2VnRCAqLworCX4weDIwMjAyMDIwLAkvKiBsZWZ0IGJvdHRvbQktIHNlZ0UgKi8KKwl+MHg0MDQwNDA0MCwJLyogbGVmdCB0b3AJLSBzZWdGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgYXNiMjMwNV9sZWRfY2hhc2U7CisKK3ZvaWQgcGVyaXBoZXJhbF9sZWRzN3g0X2Rpc3BsYXlfZGVjKHVuc2lnbmVkIGludCB2YWwsIHVuc2lnbmVkIGludCBwb2ludHMpCit7CisJdTMyIGxlZHM7CisKKwlsZWRzID0gYXNiMjMwNV9sZWRfaGV4X3RibFsodmFsLzEwMDApICUgMTBdOworCWxlZHMgPDw9IDg7CisJbGVkcyB8PSBhc2IyMzA1X2xlZF9oZXhfdGJsWyh2YWwvMTAwKSAlIDEwXTsKKwlsZWRzIDw8PSA4OworCWxlZHMgfD0gYXNiMjMwNV9sZWRfaGV4X3RibFsodmFsLzEwKSAlIDEwXTsKKwlsZWRzIDw8PSA4OworCWxlZHMgfD0gYXNiMjMwNV9sZWRfaGV4X3RibFt2YWwgJSAxMF07CisJbGVkcyB8PSBwb2ludHNeMHgwMTAxMDEwMTsKKworCUFTQjIzMDVfN1NFR0xFRFMgPSBsZWRzOworfQorCit2b2lkIHBlcmlwaGVyYWxfbGVkczd4NF9kaXNwbGF5X2hleCh1bnNpZ25lZCBpbnQgdmFsLCB1bnNpZ25lZCBpbnQgcG9pbnRzKQoreworCXUzMiBsZWRzOworCisJbGVkcyA9IGFzYjIzMDVfbGVkX2hleF90YmxbKHZhbC8xMDAwKSAlIDEwXTsKKwlsZWRzIDw8PSA4OworCWxlZHMgfD0gYXNiMjMwNV9sZWRfaGV4X3RibFsodmFsLzEwMCkgJSAxMF07CisJbGVkcyA8PD0gODsKKwlsZWRzIHw9IGFzYjIzMDVfbGVkX2hleF90YmxbKHZhbC8xMCkgJSAxMF07CisJbGVkcyA8PD0gODsKKwlsZWRzIHw9IGFzYjIzMDVfbGVkX2hleF90YmxbdmFsICUgMTBdOworCWxlZHMgfD0gcG9pbnRzXjB4MDEwMTAxMDE7CisKKwlBU0IyMzA1XzdTRUdMRURTID0gbGVkczsKK30KKwordm9pZCBwZXJpcGhlcmFsX2xlZHNfZGlzcGxheV9leGNlcHRpb24oZW51bSBleGNlcHRpb25fY29kZSBjb2RlKQoreworCXUzMiBsZWRzOworCisJbGVkcyA9IGFzYjIzMDVfbGVkX2hleF90YmxbKGNvZGUvMHgxMDApICUgMHgxMF07CisJbGVkcyA8PD0gODsKKwlsZWRzIHw9IGFzYjIzMDVfbGVkX2hleF90YmxbKGNvZGUvMHgxMCkgJSAweDEwXTsKKwlsZWRzIDw8PSA4OworCWxlZHMgfD0gYXNiMjMwNV9sZWRfaGV4X3RibFtjb2RlICUgMHgxMF07CisJbGVkcyB8PSAweDZkMDEwMTAxOworCisJQVNCMjMwNV83U0VHTEVEUyA9IGxlZHM7Cit9CisKK3ZvaWQgcGVyaXBoZXJhbF9sZWRzN3g0X2Rpc3BsYXlfbWluc3NlY3ModW5zaWduZWQgaW50IHRpbWUsIHVuc2lnbmVkIGludCBwb2ludHMpCit7CisJdTMyIGxlZHM7CisKKwlsZWRzID0gYXNiMjMwNV9sZWRfaGV4X3RibFsodGltZS82MDApICUgNl07CisJbGVkcyA8PD0gODsKKwlsZWRzIHw9IGFzYjIzMDVfbGVkX2hleF90YmxbKHRpbWUvNjApICUgMTBdOworCWxlZHMgPDw9IDg7CisJbGVkcyB8PSBhc2IyMzA1X2xlZF9oZXhfdGJsWyh0aW1lLzEwKSAlIDZdOworCWxlZHMgPDw9IDg7CisJbGVkcyB8PSBhc2IyMzA1X2xlZF9oZXhfdGJsW3RpbWUgJSAxMF07CisJbGVkcyB8PSBwb2ludHNeMHgwMTAxMDEwMTsKKworCUFTQjIzMDVfN1NFR0xFRFMgPSBsZWRzOworfQorCit2b2lkIHBlcmlwaGVyYWxfbGVkczd4NF9kaXNwbGF5X3J0Yyh2b2lkKQoreworCXVuc2lnbmVkIGludCBjbG9jazsKKwl1OCBtaW5zLCBzZWNzOworCisJbWlucyA9IFJUTUNSOworCXNlY3MgPSBSVFNDUjsKKworCWNsb2NrID0gKChtaW5zICYgMHhmMCkgPj4gNCk7CisJY2xvY2sgKj0gMTA7CisJY2xvY2sgKz0gKG1pbnMgJiAweDBmKTsKKwljbG9jayAqPSA2OworCisJY2xvY2sgKz0gKChzZWNzICYgMHhmMCkgPj4gNCk7CisJY2xvY2sgKj0gMTA7CisJY2xvY2sgKz0gKHNlY3MgJiAweDBmKTsKKworCXBlcmlwaGVyYWxfbGVkczd4NF9kaXNwbGF5X21pbnNzZWNzKGNsb2NrLCAwKTsKK30KKwordm9pZCBwZXJpcGhlcmFsX2xlZHNfbGVkX2NoYXNlKHZvaWQpCit7CisJQVNCMjMwNV83U0VHTEVEUyA9IGFzYjIzMDVfbGVkX2NoYXNlX3RibFthc2IyMzA1X2xlZF9jaGFzZV07CisJYXNiMjMwNV9sZWRfY2hhc2UrKzsKKwlpZiAoYXNiMjMwNV9sZWRfY2hhc2UgPj0gNikKKwkJYXNiMjMwNV9sZWRfY2hhc2UgPSAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL3VuaXQtYXNiMjMwNS9wY2ktYXNiMjMwNS5jIGIvYXJjaC9tbjEwMzAwL3VuaXQtYXNiMjMwNS9wY2ktYXNiMjMwNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMDBjYTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzA1L3BjaS1hc2IyMzA1LmMKQEAgLTAsMCArMSwzMDMgQEAKKy8qIEFTQjIzMDUgUENJIHJlc291cmNlIHN0dWZmCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqIC0gRGVyaXZlZCBmcm9tIGFyY2gvaTM4Ni9wY2ktaTM4Ni5jCisgKiAgIC0gQ29weXJpZ2h0IDE5OTctLTIwMDAgTWFydGluIE1hcmVzIDxtakBzdXNlLmN6PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgInBjaS1hc2IyMzA1LmgiCisKKy8qCisgKiBXZSBuZWVkIHRvIGF2b2lkIGNvbGxpc2lvbnMgd2l0aCBgbWlycm9yZWQnIFZHQSBwb3J0cworICogYW5kIG90aGVyIHN0cmFuZ2UgSVNBIGhhcmR3YXJlLCBzbyB3ZSBhbHdheXMgd2FudCB0aGUKKyAqIGFkZHJlc3NlcyB0byBiZSBhbGxvY2F0ZWQgaW4gdGhlIDB4MDAwLTB4MGZmIHJlZ2lvbgorICogbW9kdWxvIDB4NDAwLgorICoKKyAqIFdoeT8gQmVjYXVzZSBzb21lIHNpbGx5IGV4dGVybmFsIElPIGNhcmRzIG9ubHkgZGVjb2RlCisgKiB0aGUgbG93IDEwIGJpdHMgb2YgdGhlIElPIGFkZHJlc3MuIFRoZSAweDAwLTB4ZmYgcmVnaW9uCisgKiBpcyByZXNlcnZlZCBmb3IgbW90aGVyYm9hcmQgZGV2aWNlcyB0aGF0IGRlY29kZSBhbGwgMTYKKyAqIGJpdHMsIHNvIGl0J3Mgb2sgdG8gYWxsb2NhdGUgYXQsIHNheSwgMHgyODAwLTB4MjhmZiwKKyAqIGJ1dCB3ZSB3YW50IHRvIHRyeSB0byBhdm9pZCBhbGxvY2F0aW5nIGF0IDB4MjkwMC0weDJiZmYKKyAqIHdoaWNoIG1pZ2h0IGhhdmUgYmUgbWlycm9yZWQgYXQgMHgwMTAwLTB4MDNmZi4uCisgKi8KK3ZvaWQgcGNpYmlvc19hbGlnbl9yZXNvdXJjZSh2b2lkICpkYXRhLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKKwkJCSAgICByZXNvdXJjZV9zaXplX3Qgc2l6ZSwgcmVzb3VyY2Vfc2l6ZV90IGFsaWduKQoreworI2lmIDAKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gZGF0YTsKKworCXByaW50ayhLRVJOX0RFQlVHCisJICAgICAgICIjIyMgUENJQklPU19BTElHTl9SRVNPVVJDRSglcywseyUwOGx4LSUwOGx4LCUwOGx4fSwlbHgpXG4iLAorCSAgICAgICBwY2lfbmFtZShkZXYpLAorCSAgICAgICByZXMtPnN0YXJ0LAorCSAgICAgICByZXMtPmVuZCwKKwkgICAgICAgcmVzLT5mbGFncywKKwkgICAgICAgc2l6ZQorCSAgICAgICApOworI2VuZGlmCisKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKKwkJdW5zaWduZWQgbG9uZyBzdGFydCA9IHJlcy0+c3RhcnQ7CisKKwkJaWYgKHN0YXJ0ICYgMHgzMDApIHsKKwkJCXN0YXJ0ID0gKHN0YXJ0ICsgMHgzZmYpICYgfjB4M2ZmOworCQkJcmVzLT5zdGFydCA9IHN0YXJ0OworCQl9CisJfQorfQorCisKKy8qCisgKiAgSGFuZGxlIHJlc291cmNlcyBvZiBQQ0kgZGV2aWNlcy4gIElmIHRoZSB3b3JsZCB3ZXJlIHBlcmZlY3QsIHdlIGNvdWxkCisgKiAganVzdCBhbGxvY2F0ZSBhbGwgdGhlIHJlc291cmNlIHJlZ2lvbnMgYW5kIGRvIG5vdGhpbmcgbW9yZS4gIEl0IGlzbid0LgorICogIE9uIHRoZSBvdGhlciBoYW5kLCB3ZSBjYW5ub3QganVzdCByZS1hbGxvY2F0ZSBhbGwgZGV2aWNlcywgYXMgaXQgd291bGQKKyAqICByZXF1aXJlIHVzIHRvIGtub3cgbG90cyBvZiBob3N0IGJyaWRnZSBpbnRlcm5hbHMuICBTbyB3ZSBhdHRlbXB0IHRvCisgKiAga2VlcCBhcyBtdWNoIG9mIHRoZSBvcmlnaW5hbCBjb25maWd1cmF0aW9uIGFzIHBvc3NpYmxlLCBidXQgdHdlYWsgaXQKKyAqICB3aGVuIGl0J3MgZm91bmQgdG8gYmUgd3JvbmcuCisgKgorICogIEtub3duIEJJT1MgcHJvYmxlbXMgd2UgaGF2ZSB0byB3b3JrIGFyb3VuZDoKKyAqCS0gSS9PIG9yIG1lbW9yeSByZWdpb25zIG5vdCBjb25maWd1cmVkCisgKgktIHJlZ2lvbnMgY29uZmlndXJlZCwgYnV0IG5vdCBlbmFibGVkIGluIHRoZSBjb21tYW5kIHJlZ2lzdGVyCisgKgktIGJvZ3VzIEkvTyBhZGRyZXNzZXMgYWJvdmUgNjRLIHVzZWQKKyAqCS0gZXhwYW5zaW9uIFJPTXMgbGVmdCBlbmFibGVkICh0aGlzIG1heSBzb3VuZCBoYXJtbGVzcywgYnV0IGdpdmVuCisgKgkgIHRoZSBmYWN0IHRoZSBQQ0kgc3BlY3MgZXhwbGljaXRseSBhbGxvdyBhZGRyZXNzIGRlY29kZXJzIHRvIGJlCisgKgkgIHNoYXJlZCBiZXR3ZWVuIGV4cGFuc2lvbiBST01zIGFuZCBvdGhlciByZXNvdXJjZSByZWdpb25zLCBpdCdzCisgKgkgIGF0IGxlYXN0IGRhbmdlcm91cykKKyAqCisgKiAgT3VyIHNvbHV0aW9uOgorICoJKDEpIEFsbG9jYXRlIHJlc291cmNlcyBmb3IgYWxsIGJ1c2VzIGJlaGluZCBQQ0ktdG8tUENJIGJyaWRnZXMuCisgKgkgICAgVGhpcyBnaXZlcyB1cyBmaXhlZCBiYXJyaWVycyBvbiB3aGVyZSB3ZSBjYW4gYWxsb2NhdGUuCisgKgkoMikgQWxsb2NhdGUgcmVzb3VyY2VzIGZvciBhbGwgZW5hYmxlZCBkZXZpY2VzLiAgSWYgdGhlcmUgaXMKKyAqCSAgICBhIGNvbGxpc2lvbiwganVzdCBtYXJrIHRoZSByZXNvdXJjZSBhcyB1bmFsbG9jYXRlZC4gQWxzbworICoJICAgIGRpc2FibGUgZXhwYW5zaW9uIFJPTXMgZHVyaW5nIHRoaXMgc3RlcC4KKyAqCSgzKSBUcnkgdG8gYWxsb2NhdGUgcmVzb3VyY2VzIGZvciBkaXNhYmxlZCBkZXZpY2VzLiAgSWYgdGhlCisgKgkgICAgcmVzb3VyY2VzIHdlcmUgYXNzaWduZWQgY29ycmVjdGx5LCBldmVyeXRoaW5nIGdvZXMgd2VsbCwKKyAqCSAgICBpZiB0aGV5IHdlcmVuJ3QsIHRoZXkgd29uJ3QgZGlzdHVyYiBhbGxvY2F0aW9uIG9mIG90aGVyCisgKgkgICAgcmVzb3VyY2VzLgorICoJKDQpIEFzc2lnbiBuZXcgYWRkcmVzc2VzIHRvIHJlc291cmNlcyB3aGljaCB3ZXJlIGVpdGhlcgorICoJICAgIG5vdCBjb25maWd1cmVkIGF0IGFsbCBvciBtaXNjb25maWd1cmVkLiAgSWYgZXhwbGljaXRseQorICoJICAgIHJlcXVlc3RlZCBieSB0aGUgdXNlciwgY29uZmlndXJlIGV4cGFuc2lvbiBST00gYWRkcmVzcworICoJICAgIGFzIHdlbGwuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBwY2liaW9zX2FsbG9jYXRlX2J1c19yZXNvdXJjZXMoc3RydWN0IGxpc3RfaGVhZCAqYnVzX2xpc3QpCit7CisJc3RydWN0IHBjaV9idXMgKmJ1czsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCWludCBpZHg7CisJc3RydWN0IHJlc291cmNlICpyLCAqcHI7CisKKwkvKiBEZXB0aC1GaXJzdCBTZWFyY2ggb24gYnVzIHRyZWUgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ1cywgYnVzX2xpc3QsIG5vZGUpIHsKKwkJZGV2ID0gYnVzLT5zZWxmOworCQlpZiAoZGV2KSB7CisJCQlmb3IgKGlkeCA9IFBDSV9CUklER0VfUkVTT1VSQ0VTOworCQkJICAgICBpZHggPCBQQ0lfTlVNX1JFU09VUkNFUzsKKwkJCSAgICAgaWR4KyspIHsKKwkJCQlyID0gJmRldi0+cmVzb3VyY2VbaWR4XTsKKwkJCQlpZiAoIXItPmZsYWdzKQorCQkJCQljb250aW51ZTsKKwkJCQlwciA9IHBjaV9maW5kX3BhcmVudF9yZXNvdXJjZShkZXYsIHIpOworCQkJCWlmICghci0+c3RhcnQgfHwKKwkJCQkgICAgIXByIHx8CisJCQkJICAgIHJlcXVlc3RfcmVzb3VyY2UocHIsIHIpIDwgMCkgeworCQkJCQlwcmludGsoS0VSTl9FUlIgIlBDSToiCisJCQkJCSAgICAgICAiIENhbm5vdCBhbGxvY2F0ZSByZXNvdXJjZSIKKwkJCQkJICAgICAgICIgcmVnaW9uICVkIG9mIGJyaWRnZSAlc1xuIiwKKwkJCQkJICAgICAgIGlkeCwgcGNpX25hbWUoZGV2KSk7CisJCQkJCS8qIFNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSByZWdpb24uCisJCQkJCSAqIEludmFsaWRhdGUgdGhlIHJlc291cmNlIHRvIHByZXZlbnQKKwkJCQkJICogY2hpbGQgcmVzb3VyY2UgYWxsb2NhdGlvbnMgaW4gdGhpcworCQkJCQkgKiByYW5nZS4gKi8KKwkJCQkJci0+ZmxhZ3MgPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCQlwY2liaW9zX2FsbG9jYXRlX2J1c19yZXNvdXJjZXMoJmJ1cy0+Y2hpbGRyZW4pOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IHBjaWJpb3NfYWxsb2NhdGVfcmVzb3VyY2VzKGludCBwYXNzKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCWludCBpZHgsIGRpc2FibGVkOworCXUxNiBjb21tYW5kOworCXN0cnVjdCByZXNvdXJjZSAqciwgKnByOworCisJZm9yX2VhY2hfcGNpX2RldihkZXYpIHsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNvbW1hbmQpOworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IDY7IGlkeCsrKSB7CisJCQlyID0gJmRldi0+cmVzb3VyY2VbaWR4XTsKKwkJCWlmIChyLT5wYXJlbnQpCQkvKiBBbHJlYWR5IGFsbG9jYXRlZCAqLworCQkJCWNvbnRpbnVlOworCQkJaWYgKCFyLT5zdGFydCkJCS8qIEFkZHJlc3Mgbm90IGFzc2lnbmVkICovCisJCQkJY29udGludWU7CisJCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQorCQkJCWRpc2FibGVkID0gIShjb21tYW5kICYgUENJX0NPTU1BTkRfSU8pOworCQkJZWxzZQorCQkJCWRpc2FibGVkID0gIShjb21tYW5kICYgUENJX0NPTU1BTkRfTUVNT1JZKTsKKwkJCWlmIChwYXNzID09IGRpc2FibGVkKSB7CisJCQkJREJHKCJQQ0lbJXNdOiBSZXNvdXJjZSAlMDhseC0lMDhseCIKKwkJCQkgICAgIiAoZj0lbHgsIGQ9JWQsIHA9JWQpXG4iLAorCQkJCSAgICBwY2lfbmFtZShkZXYpLCByLT5zdGFydCwgci0+ZW5kLCByLT5mbGFncywKKwkJCQkgICAgZGlzYWJsZWQsIHBhc3MpOworCQkJCXByID0gcGNpX2ZpbmRfcGFyZW50X3Jlc291cmNlKGRldiwgcik7CisJCQkJaWYgKCFwciB8fCByZXF1ZXN0X3Jlc291cmNlKHByLCByKSA8IDApIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IgorCQkJCQkgICAgICAgIiBDYW5ub3QgYWxsb2NhdGUgcmVzb3VyY2UiCisJCQkJCSAgICAgICAiIHJlZ2lvbiAlZCBvZiBkZXZpY2UgJXNcbiIsCisJCQkJCSAgICAgICBpZHgsIHBjaV9uYW1lKGRldikpOworCQkJCQkvKiBXZSdsbCBhc3NpZ24gYSBuZXcgYWRkcmVzcyBsYXRlciAqLworCQkJCQlyLT5lbmQgLT0gci0+c3RhcnQ7CisJCQkJCXItPnN0YXJ0ID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKCFwYXNzKSB7CisJCQlyID0gJmRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV07CisJCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX1JPTV9FTkFCTEUpIHsKKwkJCQkvKiBUdXJuIHRoZSBST00gb2ZmLCBsZWF2ZSB0aGUgcmVzb3VyY2UgcmVnaW9uLAorCQkJCSAqIGJ1dCBrZWVwIGl0IHVucmVnaXN0ZXJlZC4gKi8KKwkJCQl1MzIgcmVnOworCQkJCURCRygiUENJOiBTd2l0Y2hpbmcgb2ZmIFJPTSBvZiAlc1xuIiwKKwkJCQkgICAgcGNpX25hbWUoZGV2KSk7CisJCQkJci0+ZmxhZ3MgJj0gfklPUkVTT1VSQ0VfUk9NX0VOQUJMRTsKKwkJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoCisJCQkJCWRldiwgZGV2LT5yb21fYmFzZV9yZWcsICZyZWcpOworCQkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoCisJCQkJCWRldiwgZGV2LT5yb21fYmFzZV9yZWcsCisJCQkJCXJlZyAmIH5QQ0lfUk9NX0FERFJFU1NfRU5BQkxFKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGludCBfX2luaXQgcGNpYmlvc19hc3NpZ25fcmVzb3VyY2VzKHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CisJc3RydWN0IHJlc291cmNlICpyLCAqcHI7CisKKwlpZiAoIShwY2lfcHJvYmUgJiBQQ0lfQVNTSUdOX1JPTVMpKSB7CisJCS8qIFRyeSB0byB1c2UgQklPUyBzZXR0aW5ncyBmb3IgUk9Ncywgb3RoZXJ3aXNlIGxldAorCQkgICBwY2lfYXNzaWduX3VuYXNzaWduZWRfcmVzb3VyY2VzKCkgYWxsb2NhdGUgdGhlIG5ldworCQkgICBhZGRyZXNzZXMuICovCisJCWZvcl9lYWNoX3BjaV9kZXYoZGV2KSB7CisJCQlyID0gJmRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV07CisJCQlpZiAoIXItPmZsYWdzIHx8ICFyLT5zdGFydCkKKwkJCQljb250aW51ZTsKKwkJCXByID0gcGNpX2ZpbmRfcGFyZW50X3Jlc291cmNlKGRldiwgcik7CisJCQlpZiAoIXByIHx8IHJlcXVlc3RfcmVzb3VyY2UocHIsIHIpIDwgMCkgeworCQkJCXItPmVuZCAtPSByLT5zdGFydDsKKwkJCQlyLT5zdGFydCA9IDA7CisJCQl9CisJCX0KKwl9CisKKwlwY2lfYXNzaWduX3VuYXNzaWduZWRfcmVzb3VyY2VzKCk7CisKKwlyZXR1cm4gMDsKK30KKworZnNfaW5pdGNhbGwocGNpYmlvc19hc3NpZ25fcmVzb3VyY2VzKTsKKwordm9pZCBfX2luaXQgcGNpYmlvc19yZXNvdXJjZV9zdXJ2ZXkodm9pZCkKK3sKKwlEQkcoIlBDSTogQWxsb2NhdGluZyByZXNvdXJjZXNcbiIpOworCXBjaWJpb3NfYWxsb2NhdGVfYnVzX3Jlc291cmNlcygmcGNpX3Jvb3RfYnVzZXMpOworCXBjaWJpb3NfYWxsb2NhdGVfcmVzb3VyY2VzKDApOworCXBjaWJpb3NfYWxsb2NhdGVfcmVzb3VyY2VzKDEpOworfQorCitpbnQgcGNpYmlvc19lbmFibGVfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBtYXNrKQoreworCXUxNiBjbWQsIG9sZF9jbWQ7CisJaW50IGlkeDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmY21kKTsKKwlvbGRfY21kID0gY21kOworCisJZm9yIChpZHggPSAwOyBpZHggPCA2OyBpZHgrKykgeworCQkvKiBPbmx5IHNldCB1cCB0aGUgcmVxdWVzdGVkIHN0dWZmICovCisJCWlmICghKG1hc2sgJiAoMSA8PCBpZHgpKSkKKwkJCWNvbnRpbnVlOworCisJCXIgPSAmZGV2LT5yZXNvdXJjZVtpZHhdOworCisJCWlmICghci0+c3RhcnQgJiYgci0+ZW5kKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiUENJOiBEZXZpY2UgJXMgbm90IGF2YWlsYWJsZSBiZWNhdXNlIG9mIgorCQkJICAgICAgICIgcmVzb3VyY2UgY29sbGlzaW9uc1xuIiwKKwkJCSAgICAgICBwY2lfbmFtZShkZXYpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKwkJCWNtZCB8PSBQQ0lfQ09NTUFORF9JTzsKKwkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCisJCQljbWQgfD0gUENJX0NPTU1BTkRfTUVNT1JZOworCX0KKworCWlmIChkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLnN0YXJ0KQorCQljbWQgfD0gUENJX0NPTU1BTkRfTUVNT1JZOworCisJaWYgKGNtZCAhPSBvbGRfY21kKQorCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgY21kKTsKKworCXJldHVybiAwOworfQorCisvKgorICogIElmIHdlIHNldCB1cCBhIGRldmljZSBmb3IgYnVzIG1hc3RlcmluZywgd2UgbmVlZCB0byBjaGVjayB0aGUgbGF0ZW5jeQorICogIHRpbWVyIGFzIGNlcnRhaW4gY3JhcHB5IEJJT1NlcyBmb3JnZXQgdG8gc2V0IGl0IHByb3Blcmx5LgorICovCit1bnNpZ25lZCBpbnQgcGNpYmlvc19tYXhfbGF0ZW5jeSA9IDI1NTsKKwordm9pZCBwY2liaW9zX3NldF9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1OCBsYXQ7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAmbGF0KTsKKworCWlmIChsYXQgPCAxNikKKwkJbGF0ID0gKDY0IDw9IHBjaWJpb3NfbWF4X2xhdGVuY3kpID8gNjQgOiBwY2liaW9zX21heF9sYXRlbmN5OworCWVsc2UgaWYgKGxhdCA+IHBjaWJpb3NfbWF4X2xhdGVuY3kpCisJCWxhdCA9IHBjaWJpb3NfbWF4X2xhdGVuY3k7CisJZWxzZQorCQlyZXR1cm47CisKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgbGF0KTsKK30KKworaW50IHBjaV9tbWFwX3BhZ2VfcmFuZ2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQllbnVtIHBjaV9tbWFwX3N0YXRlIG1tYXBfc3RhdGUsIGludCB3cml0ZV9jb21iaW5lKQoreworCXVuc2lnbmVkIGxvbmcgcHJvdDsKKworCS8qIExlYXZlIHZtX3Bnb2ZmIGFzLWlzLCB0aGUgUENJIHNwYWNlIGFkZHJlc3MgaXMgdGhlIHBoeXNpY2FsCisJICogYWRkcmVzcyBvbiB0aGlzIHBsYXRmb3JtLgorCSAqLworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fTE9DS0VEIHwgVk1fSU87CisKKwlwcm90ID0gcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCk7CisJcHJvdCAmPSB+X1BBR0VfQ0FDSEU7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBfX3BncHJvdChwcm90KTsKKworCS8qIFdyaXRlLWNvbWJpbmUgc2V0dGluZyBpcyBpZ25vcmVkICovCisJaWYgKGlvX3JlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGdvZmYsCisJCQkgICAgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAorCQkJICAgICAgIHZtYS0+dm1fcGFnZV9wcm90KSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzMDUvcGNpLWFzYjIzMDUuaCBiL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzMDUvcGNpLWFzYjIzMDUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDYzNGZhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL3VuaXQtYXNiMjMwNS9wY2ktYXNiMjMwNS5oCkBAIC0wLDAgKzEsODIgQEAKKy8qIEFTQjIzMDUgQXJjaC1zcGVjaWZpYyBQQ0kgZGVjbGFyYXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqIERlcml2ZWQgZnJvbTogYXJjaC9pMzg2L2tlcm5lbC9wY2ktaTM4Ni5oOiAoYykgMTk5OSBNYXJ0aW4gTWFyZXMgPG1qQHVjdy5jej4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9QQ0lfQVNCMjMwNV9ICisjZGVmaW5lIF9QQ0lfQVNCMjMwNV9ICisKKyN1bmRlZiBERUJVRworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgREJHKHguLi4pIHByaW50ayh4KQorI2Vsc2UKKyNkZWZpbmUgREJHKHguLi4pCisjZW5kaWYKKworI2RlZmluZSBQQ0lfUFJPQkVfQklPUyAxCisjZGVmaW5lIFBDSV9QUk9CRV9DT05GMSAyCisjZGVmaW5lIFBDSV9QUk9CRV9DT05GMiA0CisjZGVmaW5lIFBDSV9OT19TT1JUIDB4MTAwCisjZGVmaW5lIFBDSV9CSU9TX1NPUlQgMHgyMDAKKyNkZWZpbmUgUENJX05PX0NIRUNLUyAweDQwMAorI2RlZmluZSBQQ0lfQVNTSUdOX1JPTVMgMHgxMDAwCisjZGVmaW5lIFBDSV9CSU9TX0lSUV9TQ0FOIDB4MjAwMAorCitleHRlcm4gdW5zaWduZWQgaW50IHBjaV9wcm9iZTsKKworLyogcGNpLWFzYjIzMDUuYyAqLworCitleHRlcm4gdW5zaWduZWQgaW50IHBjaWJpb3NfbWF4X2xhdGVuY3k7CisKK2V4dGVybiB2b2lkIHBjaWJpb3NfcmVzb3VyY2Vfc3VydmV5KHZvaWQpOworZXh0ZXJuIGludCBwY2liaW9zX2VuYWJsZV9yZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG1hc2spOworCisvKiBwY2kuYyAqLworCitleHRlcm4gaW50IHBjaWJpb3NfbGFzdF9idXM7CitleHRlcm4gc3RydWN0IHBjaV9idXMgKnBjaV9yb290X2J1czsKK2V4dGVybiBzdHJ1Y3QgcGNpX29wcyAqcGNpX3Jvb3Rfb3BzOworCitleHRlcm4gc3RydWN0IGlycV9yb3V0aW5nX3RhYmxlICpwY2liaW9zX2dldF9pcnFfcm91dGluZ190YWJsZSh2b2lkKTsKK2V4dGVybiBpbnQgcGNpYmlvc19zZXRfaXJxX3JvdXRpbmcoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpbiwgaW50IGlycSk7CisKKy8qIHBjaS1pcnEuYyAqLworCitzdHJ1Y3QgaXJxX2luZm8geworCXU4IGJ1cywgZGV2Zm47CQkJLyogQnVzLCBkZXZpY2UgYW5kIGZ1bmN0aW9uICovCisJc3RydWN0IHsKKwkJdTggbGluazsJCS8qIElSUSBsaW5lIElELCBjaGlwc2V0IGRlcGVuZGVudCwKKwkJCQkJICogMD1ub3Qgcm91dGVkICovCisJCXUxNiBiaXRtYXA7CQkvKiBBdmFpbGFibGUgSVJRcyAqLworCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgaXJxWzRdOworCXU4IHNsb3Q7CQkJLyogU2xvdCBudW1iZXIsIDA9b25ib2FyZCAqLworCXU4IHJmdTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBpcnFfcm91dGluZ190YWJsZSB7CisJdTMyIHNpZ25hdHVyZTsJCQkvKiBQSVJRX1NJR05BVFVSRSBzaG91bGQgYmUgaGVyZSAqLworCXUxNiB2ZXJzaW9uOwkJCS8qIFBJUlFfVkVSU0lPTiAqLworCXUxNiBzaXplOwkJCS8qIFRhYmxlIHNpemUgaW4gYnl0ZXMgKi8KKwl1OCBydHJfYnVzLCBydHJfZGV2Zm47CQkvKiBXaGVyZSB0aGUgaW50ZXJydXB0IHJvdXRlciBsaWVzICovCisJdTE2IGV4Y2x1c2l2ZV9pcnFzOwkJLyogSVJRcyBkZXZvdGVkIGV4Y2x1c2l2ZWx5IHRvIFBDSSB1c2FnZSAqLworCXUxNiBydHJfdmVuZG9yLCBydHJfZGV2aWNlOwkvKiBWZW5kb3IgYW5kIGRldmljZSBJRCBvZiBpbnRlcnJ1cHQgcm91dGVyICovCisJdTMyIG1pbmlwb3J0X2RhdGE7CQkvKiBDcmFwICovCisJdTggcmZ1WzExXTsKKwl1OCBjaGVja3N1bTsJCQkvKiBNb2R1bG8gMjU2IGNoZWNrc3VtIG11c3QgZ2l2ZSB6ZXJvICovCisJc3RydWN0IGlycV9pbmZvIHNsb3RzWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCBwY2liaW9zX2lycV9tYXNrOworCitleHRlcm4gdm9pZCBwY2liaW9zX2lycV9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgcGNpYmlvc19maXh1cF9pcnFzKHZvaWQpOworZXh0ZXJuIHZvaWQgcGNpYmlvc19lbmFibGVfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworCisjZW5kaWYgLyogUENJX0FTQjIzMDVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL3VuaXQtYXNiMjMwNS9wY2ktaW9tYXAuYyBiL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzMDUvcGNpLWlvbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJjZWFlNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzMDUvcGNpLWlvbWFwLmMKQEAgLTAsMCArMSwzMSBAQAorLyogQVNCMjMwNSBQQ0kgSS9PIG1hcHBpbmcgaGFuZGxlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisvKgorICogQ3JlYXRlIGEgdmlydHVhbCBtYXBwaW5nIGNvb2tpZSBmb3IgYSBQQ0kgQkFSIChtZW1vcnkgb3IgSU8pCisgKi8KK3ZvaWQgX19pb21lbSAqcGNpX2lvbWFwKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBiYXIsIHVuc2lnbmVkIGxvbmcgbWF4bGVuKQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCBiYXIpOworCXVuc2lnbmVkIGxvbmcgbGVuID0gcGNpX3Jlc291cmNlX2xlbihkZXYsIGJhcik7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IHBjaV9yZXNvdXJjZV9mbGFncyhkZXYsIGJhcik7CisKKwlpZiAoIWxlbiB8fCAhc3RhcnQpCisJCXJldHVybiBOVUxMOworCisJaWYgKChmbGFncyAmIElPUkVTT1VSQ0VfSU8pIHx8IChmbGFncyAmIElPUkVTT1VSQ0VfTUVNKSkKKwkJcmV0dXJuICh2b2lkIF9faW9tZW0gKikgc3RhcnQ7CisKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0wocGNpX2lvbWFwKTsKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzMDUvcGNpLWlycS5jIGIvYXJjaC9tbjEwMzAwL3VuaXQtYXNiMjMwNS9wY2ktaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThjZmI0NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzMDUvcGNpLWlycS5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qIFBDSSBJUlEgcm91dGluZyBvbiB0aGUgTU4xMDNFMDEwIGJhc2VkIEFTQjIzMDUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBpcyBzaW1wbGU6IEFsbCBQQ0kgaW50ZXJydXB0cyByb3V0ZSB0aHJvdWdoIHRoZSBDUFUncyBYSVJRMSBwaW4gW0lSUSAzNV0KKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSAicGNpLWFzYjIzMDUuaCIKKwordm9pZCBfX2luaXQgcGNpYmlvc19pcnFfaW5pdCh2b2lkKQoreworfQorCit2b2lkIF9faW5pdCBwY2liaW9zX2ZpeHVwX2lycXModm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKwl1OCBsaW5lLCBwaW47CisKKwl3aGlsZSAoKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldikpICE9IE5VTEwpIHsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbik7CisJCWlmIChwaW4pIHsKKwkJCWRldi0+aXJxID0gWElSUTE7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsCisJCQkJCSAgICAgIGRldi0+aXJxKTsKKwkJfQorCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgJmxpbmUpOworCX0KK30KKwordm9pZCBfX2luaXQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEpCit7Cit9CisKK3ZvaWQgcGNpYmlvc19lbmFibGVfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBkZXYtPmlycSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzA1L3BjaS5jIGIvYXJjaC9tbjEwMzAwL3VuaXQtYXNiMjMwNS9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTg2NDI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tbjEwMzAwL3VuaXQtYXNiMjMwNS9wY2kuYwpAQCAtMCwwICsxLDU0NSBAQAorLyogQVNCMjMwNSBQQ0kgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKiBEZXJpdmVkIGZyb20gYXJjaC9pMzg2L2tlcm5lbC9wY2ktcGMuYworICoJKGMpIDE5OTktLTIwMDAgTWFydGluIE1hcmVzIDxtakBzdXNlLmN6PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSAicGNpLWFzYjIzMDUuaCIKKwordW5zaWduZWQgaW50IHBjaV9wcm9iZSA9IDE7CisKK2ludCBwY2liaW9zX2xhc3RfYnVzID0gLTE7CitzdHJ1Y3QgcGNpX2J1cyAqcGNpX3Jvb3RfYnVzOworc3RydWN0IHBjaV9vcHMgKnBjaV9yb290X29wczsKKworLyoKKyAqIEZ1bmN0aW9ucyBmb3IgYWNjZXNzaW5nIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlCisgKi8KKworI2RlZmluZSBDT05GSUdfQ01EKGJ1cywgZGV2Zm4sIHdoZXJlKSBcCisJKDB4ODAwMDAwMDAgfCAoYnVzLT5udW1iZXIgPDwgMTYpIHwgKGRldmZuIDw8IDgpIHwgKHdoZXJlICYgfjMpKQorCisjZGVmaW5lIE1FTV9QQUdJTkdfUkVHCSgqKHZvbGF0aWxlIF9fdTMyICopIDB4QkZGRkZGRjQpCisjZGVmaW5lIENPTkZJR19BRERSRVNTCSgqKHZvbGF0aWxlIF9fdTMyICopIDB4QkZGRkZGRjgpCisjZGVmaW5lIENPTkZJR19EQVRBTChYKQkoKih2b2xhdGlsZSBfX3UzMiAqKSAweEJGRkZGRkZDKQorI2RlZmluZSBDT05GSUdfREFUQVcoWCkJKCoodm9sYXRpbGUgX191MTYgKikgKDB4QkZGRkZGRkMgKyAoKFgpICYgMikpKQorI2RlZmluZSBDT05GSUdfREFUQUIoWCkJKCoodm9sYXRpbGUgX191OCAgKikgKDB4QkZGRkZGRkMgKyAoKFgpICYgMykpKQorCisjZGVmaW5lIEJSSURHRVJFR0IoWCkJKCoodm9sYXRpbGUgX191OCAgKikgKDB4QkUwNDAwMDAgKyAoWCkpKQorI2RlZmluZSBCUklER0VSRUdXKFgpCSgqKHZvbGF0aWxlIF9fdTE2ICopICgweEJFMDQwMDAwICsgKFgpKSkKKyNkZWZpbmUgQlJJREdFUkVHTChYKQkoKih2b2xhdGlsZSBfX3UzMiAqKSAoMHhCRTA0MDAwMCArIChYKSkpCisKK3N0YXRpYyBpbmxpbmUgaW50IF9fcXVlcnkoY29uc3Qgc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuKQoreworI2lmIDAKKwlyZXR1cm4gYnVzLT5udW1iZXIgPT0gMCAmJiAoZGV2Zm4gPT0gUENJX0RFVkZOKDAsIDApKTsKKwlyZXR1cm4gYnVzLT5udW1iZXIgPT0gMTsKKwlyZXR1cm4gYnVzLT5udW1iZXIgPT0gMCAmJgorCQkoZGV2Zm4gPT0gUENJX0RFVkZOKDIsIDApIHx8IGRldmZuID09IFBDSV9ERVZGTigzLCAwKSk7CisjZW5kaWYKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIHRyYW5zbGF0ZSBMaW51eGNlbnRyaWMgYWRkcmVzc2VzIHRvIFBDSSBidXMgYWRkcmVzc2VzCisgKi8KK3ZvaWQgcGNpYmlvc19yZXNvdXJjZV90b19idXMoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaV9idXNfcmVnaW9uICpyZWdpb24sCisJCQkgICAgIHN0cnVjdCByZXNvdXJjZSAqcmVzKQoreworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykgeworCQlyZWdpb24tPnN0YXJ0ID0gKHJlcy0+c3RhcnQgJiAweDAwZmZmZmZmKTsKKwkJcmVnaW9uLT5lbmQgICA9IChyZXMtPmVuZCAgICYgMHgwMGZmZmZmZik7CisJfQorCisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgeworCQlyZWdpb24tPnN0YXJ0ID0gKHJlcy0+c3RhcnQgJiAweDAzZmZmZmZmKSB8IE1FTV9QQUdJTkdfUkVHOworCQlyZWdpb24tPmVuZCAgID0gKHJlcy0+ZW5kICAgJiAweDAzZmZmZmZmKSB8IE1FTV9QQUdJTkdfUkVHOworCX0KKworI2lmIDAKKwlwcmludGsoS0VSTl9ERUJVRyAiUkVTLT5CVVM6ICVseC0lbHggPT4gJWx4LSVseFxuIiwKKwkgICAgICAgcmVzLT5zdGFydCwgcmVzLT5lbmQsIHJlZ2lvbi0+c3RhcnQsIHJlZ2lvbi0+ZW5kKTsKKyNlbmRpZgorfQorRVhQT1JUX1NZTUJPTChwY2liaW9zX3Jlc291cmNlX3RvX2J1cyk7CisKKy8qCisgKiB0cmFuc2xhdGUgUENJIGJ1cyBhZGRyZXNzZXMgdG8gTGludXhjZW50cmljIGFkZHJlc3NlcworICovCit2b2lkIHBjaWJpb3NfYnVzX3RvX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzLAorCQkJICAgICBzdHJ1Y3QgcGNpX2J1c19yZWdpb24gKnJlZ2lvbikKK3sKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKKwkJcmVzLT5zdGFydCA9IChyZWdpb24tPnN0YXJ0ICYgMHgwMGZmZmZmZikgfCAweGJlMDAwMDAwOworCQlyZXMtPmVuZCAgID0gKHJlZ2lvbi0+ZW5kICAgJiAweDAwZmZmZmZmKSB8IDB4YmUwMDAwMDA7CisJfQorCisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgeworCQlyZXMtPnN0YXJ0ID0gKHJlZ2lvbi0+c3RhcnQgJiAweDAzZmZmZmZmKSB8IDB4YjgwMDAwMDA7CisJCXJlcy0+ZW5kICAgPSAocmVnaW9uLT5lbmQgICAmIDB4MDNmZmZmZmYpIHwgMHhiODAwMDAwMDsKKwl9CisKKyNpZiAwCisJcHJpbnRrKEtFUk5fSU5GTyAiQlVTLT5SRVM6ICVseC0lbHggPT4gJWx4LSVseFxuIiwKKwkgICAgICAgcmVnaW9uLT5zdGFydCwgcmVnaW9uLT5lbmQsIHJlcy0+c3RhcnQsIHJlcy0+ZW5kKTsKKyNlbmRpZgorfQorRVhQT1JUX1NZTUJPTChwY2liaW9zX2J1c190b19yZXNvdXJjZSk7CisKKy8qCisgKgorICovCitzdGF0aWMgaW50IHBjaV9hbXBjaV9yZWFkX2NvbmZpZ19ieXRlKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJCQkgICAgICBpbnQgd2hlcmUsIHUzMiAqX3ZhbHVlKQoreworCXUzMiByYXd2YWwsIHZhbHVlOworCisJaWYgKGJ1cy0+bnVtYmVyID09IDAgJiYgZGV2Zm4gPT0gUENJX0RFVkZOKDAsIDApKSB7CisJCXZhbHVlID0gQlJJREdFUkVHQih3aGVyZSk7CisJCV9fcGNiZGVidWcoIj0+ICUwMmh4IiwgJkJSSURHRVJFR0wod2hlcmUpLCB2YWx1ZSk7CisJfSBlbHNlIHsKKwkJQ09ORklHX0FERFJFU1MgPSBDT05GSUdfQ01EKGJ1cywgZGV2Zm4sIHdoZXJlKTsKKwkJcmF3dmFsID0gQ09ORklHX0FERFJFU1M7CisJCXZhbHVlID0gQ09ORklHX0RBVEFCKHdoZXJlKTsKKwkJaWYgKF9fcXVlcnkoYnVzLCBkZXZmbikpCisJCQlfX3BjaWRlYnVnKCI9PiAlMDJoeCIsIGJ1cywgZGV2Zm4sIHdoZXJlLCB2YWx1ZSk7CisJfQorCisJKl92YWx1ZSA9IHZhbHVlOworCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKK3N0YXRpYyBpbnQgcGNpX2FtcGNpX3JlYWRfY29uZmlnX3dvcmQoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAorCQkJCSAgICAgIGludCB3aGVyZSwgdTMyICpfdmFsdWUpCit7CisJdTMyIHJhd3ZhbCwgdmFsdWU7CisKKwlpZiAoYnVzLT5udW1iZXIgPT0gMCAmJiBkZXZmbiA9PSBQQ0lfREVWRk4oMCwgMCkpIHsKKwkJdmFsdWUgPSBCUklER0VSRUdXKHdoZXJlKTsKKwkJX19wY2JkZWJ1ZygiPT4gJTA0aHgiLCAmQlJJREdFUkVHTCh3aGVyZSksIHZhbHVlKTsKKwl9IGVsc2UgeworCQlDT05GSUdfQUREUkVTUyA9IENPTkZJR19DTUQoYnVzLCBkZXZmbiwgd2hlcmUpOworCQlyYXd2YWwgPSBDT05GSUdfQUREUkVTUzsKKwkJdmFsdWUgPSBDT05GSUdfREFUQVcod2hlcmUpOworCQlpZiAoX19xdWVyeShidXMsIGRldmZuKSkKKwkJCV9fcGNpZGVidWcoIj0+ICUwNGh4IiwgYnVzLCBkZXZmbiwgd2hlcmUsIHZhbHVlKTsKKwl9CisKKwkqX3ZhbHVlID0gdmFsdWU7CisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIGludCBwY2lfYW1wY2lfcmVhZF9jb25maWdfZHdvcmQoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAorCQkJCSAgICAgICBpbnQgd2hlcmUsIHUzMiAqX3ZhbHVlKQoreworCXUzMiByYXd2YWwsIHZhbHVlOworCisJaWYgKGJ1cy0+bnVtYmVyID09IDAgJiYgZGV2Zm4gPT0gUENJX0RFVkZOKDAsIDApKSB7CisJCXZhbHVlID0gQlJJREdFUkVHTCh3aGVyZSk7CisJCV9fcGNiZGVidWcoIj0+ICUwOHgiLCAmQlJJREdFUkVHTCh3aGVyZSksIHZhbHVlKTsKKwl9IGVsc2UgeworCQlDT05GSUdfQUREUkVTUyA9IENPTkZJR19DTUQoYnVzLCBkZXZmbiwgd2hlcmUpOworCQlyYXd2YWwgPSBDT05GSUdfQUREUkVTUzsKKwkJdmFsdWUgPSBDT05GSUdfREFUQUwod2hlcmUpOworCQlpZiAoX19xdWVyeShidXMsIGRldmZuKSkKKwkJCV9fcGNpZGVidWcoIj0+ICUwOHgiLCBidXMsIGRldmZuLCB3aGVyZSwgdmFsdWUpOworCX0KKworCSpfdmFsdWUgPSB2YWx1ZTsKKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitzdGF0aWMgaW50IHBjaV9hbXBjaV93cml0ZV9jb25maWdfYnl0ZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCisJCQkJICAgICAgIGludCB3aGVyZSwgdTggdmFsdWUpCit7CisJdTMyIHJhd3ZhbDsKKworCWlmIChidXMtPm51bWJlciA9PSAwICYmIGRldmZuID09IFBDSV9ERVZGTigwLCAwKSkgeworCQlfX3BjYmRlYnVnKCI8PSAlMDJ4IiwgJkJSSURHRVJFR0Iod2hlcmUpLCB2YWx1ZSk7CisJCUJSSURHRVJFR0Iod2hlcmUpID0gdmFsdWU7CisJfSBlbHNlIHsKKwkJaWYgKGJ1cy0+bnVtYmVyID09IDAgJiYKKwkJICAgIChkZXZmbiA9PSBQQ0lfREVWRk4oMiwgMCkgJiYgZGV2Zm4gPT0gUENJX0RFVkZOKDMsIDApKQorCQkgICAgKQorCQkJX19wY2lkZWJ1ZygiPD0gJTAyeCIsIGJ1cywgZGV2Zm4sIHdoZXJlLCB2YWx1ZSk7CisJCUNPTkZJR19BRERSRVNTID0gQ09ORklHX0NNRChidXMsIGRldmZuLCB3aGVyZSk7CisJCXJhd3ZhbCA9IENPTkZJR19BRERSRVNTOworCQlDT05GSUdfREFUQUIod2hlcmUpID0gdmFsdWU7CisJfQorCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKK3N0YXRpYyBpbnQgcGNpX2FtcGNpX3dyaXRlX2NvbmZpZ193b3JkKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJCQkgICAgICAgaW50IHdoZXJlLCB1MTYgdmFsdWUpCit7CisJdTMyIHJhd3ZhbDsKKworCWlmIChidXMtPm51bWJlciA9PSAwICYmIGRldmZuID09IFBDSV9ERVZGTigwLCAwKSkgeworCQlfX3BjYmRlYnVnKCI8PSAlMDRoeCIsICZCUklER0VSRUdXKHdoZXJlKSwgdmFsdWUpOworCQlCUklER0VSRUdXKHdoZXJlKSA9IHZhbHVlOworCX0gZWxzZSB7CisJCWlmIChfX3F1ZXJ5KGJ1cywgZGV2Zm4pKQorCQkJX19wY2lkZWJ1ZygiPD0gJTA0aHgiLCBidXMsIGRldmZuLCB3aGVyZSwgdmFsdWUpOworCQlDT05GSUdfQUREUkVTUyA9IENPTkZJR19DTUQoYnVzLCBkZXZmbiwgd2hlcmUpOworCQlyYXd2YWwgPSBDT05GSUdfQUREUkVTUzsKKwkJQ09ORklHX0RBVEFXKHdoZXJlKSA9IHZhbHVlOworCX0KKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitzdGF0aWMgaW50IHBjaV9hbXBjaV93cml0ZV9jb25maWdfZHdvcmQoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAorCQkJCQlpbnQgd2hlcmUsIHUzMiB2YWx1ZSkKK3sKKwl1MzIgcmF3dmFsOworCisJaWYgKGJ1cy0+bnVtYmVyID09IDAgJiYgZGV2Zm4gPT0gUENJX0RFVkZOKDAsIDApKSB7CisJCV9fcGNiZGVidWcoIjw9ICUwOHgiLCAmQlJJREdFUkVHTCh3aGVyZSksIHZhbHVlKTsKKwkJQlJJREdFUkVHTCh3aGVyZSkgPSB2YWx1ZTsKKwl9IGVsc2UgeworCQlpZiAoX19xdWVyeShidXMsIGRldmZuKSkKKwkJCV9fcGNpZGVidWcoIjw9ICUwOHgiLCBidXMsIGRldmZuLCB3aGVyZSwgdmFsdWUpOworCQlDT05GSUdfQUREUkVTUyA9IENPTkZJR19DTUQoYnVzLCBkZXZmbiwgd2hlcmUpOworCQlyYXd2YWwgPSBDT05GSUdfQUREUkVTUzsKKwkJQ09ORklHX0RBVEFMKHdoZXJlKSA9IHZhbHVlOworCX0KKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitzdGF0aWMgaW50IHBjaV9hbXBjaV9yZWFkX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCisJCQkJIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiAqdmFsKQoreworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgMToKKwkJcmV0dXJuIHBjaV9hbXBjaV9yZWFkX2NvbmZpZ19ieXRlKGJ1cywgZGV2Zm4sIHdoZXJlLCB2YWwpOworCWNhc2UgMjoKKwkJcmV0dXJuIHBjaV9hbXBjaV9yZWFkX2NvbmZpZ193b3JkKGJ1cywgZGV2Zm4sIHdoZXJlLCB2YWwpOworCWNhc2UgNDoKKwkJcmV0dXJuIHBjaV9hbXBjaV9yZWFkX2NvbmZpZ19kd29yZChidXMsIGRldmZuLCB3aGVyZSwgdmFsKTsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKworc3RhdGljIGludCBwY2lfYW1wY2lfd3JpdGVfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJCQkgIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiB2YWwpCit7CisJc3dpdGNoIChzaXplKSB7CisJY2FzZSAxOgorCQlyZXR1cm4gcGNpX2FtcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJ1cywgZGV2Zm4sIHdoZXJlLCB2YWwpOworCWNhc2UgMjoKKwkJcmV0dXJuIHBjaV9hbXBjaV93cml0ZV9jb25maWdfd29yZChidXMsIGRldmZuLCB3aGVyZSwgdmFsKTsKKwljYXNlIDQ6CisJCXJldHVybiBwY2lfYW1wY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJ1cywgZGV2Zm4sIHdoZXJlLCB2YWwpOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBjaV9vcHMgcGNpX2RpcmVjdF9hbXBjaSA9IHsKKwlwY2lfYW1wY2lfcmVhZF9jb25maWcsCisJcGNpX2FtcGNpX3dyaXRlX2NvbmZpZywKK307CisKKy8qCisgKiBCZWZvcmUgd2UgZGVjaWRlIHRvIHVzZSBkaXJlY3QgaGFyZHdhcmUgYWNjZXNzIG1lY2hhbmlzbXMsIHdlIHRyeSB0byBkbyBzb21lCisgKiB0cml2aWFsIGNoZWNrcyB0byBlbnN1cmUgaXQgYXQgbGVhc3QgX3NlZW1zXyB0byBiZSB3b3JraW5nIC0tIHdlIGp1c3QgdGVzdAorICogd2hldGhlciBidXMgMDAgY29udGFpbnMgYSBob3N0IGJyaWRnZSAodGhpcyBpcyBzaW1pbGFyIHRvIGNoZWNraW5nCisgKiB0ZWNobmlxdWVzIHVzZWQgaW4gWEZyZWU4NiwgYnV0IG91cnMgc2hvdWxkIGJlIG1vcmUgcmVsaWFibGUgc2luY2Ugd2UKKyAqIGF0dGVtcHQgdG8gbWFrZSB1c2Ugb2YgZGlyZWN0IGFjY2VzcyBoaW50cyBwcm92aWRlZCBieSB0aGUgUENJIEJJT1MpLgorICoKKyAqIFRoaXMgc2hvdWxkIGJlIGNsb3NlIHRvIHRyaXZpYWwsIGJ1dCBpdCBpc24ndCwgYmVjYXVzZSB0aGVyZSBhcmUgYnVnZ3kKKyAqIGNoaXBzZXRzICh5ZXMsIHlvdSBndWVzc2VkIGl0LCBieSBJbnRlbCBhbmQgQ29tcGFxKSB0aGF0IGhhdmUgbm8gY2xhc3MgSUQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHBjaV9zYW5pdHlfY2hlY2soc3RydWN0IHBjaV9vcHMgKm8pCit7CisJc3RydWN0IHBjaV9idXMgYnVzOwkJLyogRmFrZSBidXMgYW5kIGRldmljZSAqLworCXUzMiB4OworCisJYnVzLm51bWJlciA9IDA7CisKKwlpZiAoKCFvLT5yZWFkKCZidXMsIDAsIFBDSV9DTEFTU19ERVZJQ0UsIDIsICZ4KSAmJgorCSAgICAgKHggPT0gUENJX0NMQVNTX0JSSURHRV9IT1NUIHx8IHggPT0gUENJX0NMQVNTX0RJU1BMQVlfVkdBKSkgfHwKKwkgICAgKCFvLT5yZWFkKCZidXMsIDAsIFBDSV9WRU5ET1JfSUQsIDIsICZ4KSAmJgorCSAgICAgKHggPT0gUENJX1ZFTkRPUl9JRF9JTlRFTCB8fCB4ID09IFBDSV9WRU5ET1JfSURfQ09NUEFRKSkpCisJCXJldHVybiAxOworCisJcHJpbnRrKEtFUk5fRVJST1IgIlBDSTogU2FuaXR5IGNoZWNrIGZhaWxlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBjaV9jaGVja19kaXJlY3Qodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJLyoKKwkgKiBDaGVjayBpZiBhY2Nlc3Mgd29ya3MuCisJICovCisJaWYgKHBjaV9zYW5pdHlfY2hlY2soJnBjaV9kaXJlY3RfYW1wY2kpKSB7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBVc2luZyBjb25maWd1cmF0aW9uIGFtcGNpXG4iKTsKKwkJcmVxdWVzdF9tZW1fcmVnaW9uKDB4QkUwNDAwMDAsIDI1NiwgIkFNUENJIGJyaWRnZSIpOworCQlyZXF1ZXN0X21lbV9yZWdpb24oMHhCRkZGRkZGNCwgMTIsICJQQ0kgYW1wY2kiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpc192YWxpZF9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgaWR4KQoreworCXVuc2lnbmVkIGludCBpLCB0eXBlX21hc2sgPSBJT1JFU09VUkNFX0lPIHwgSU9SRVNPVVJDRV9NRU07CisJc3RydWN0IHJlc291cmNlICpkZXZyID0gJmRldi0+cmVzb3VyY2VbaWR4XTsKKworCWlmIChkZXYtPmJ1cykgeworCQlmb3IgKGkgPSAwOyBpIDwgUENJX0JVU19OVU1fUkVTT1VSQ0VTOyBpKyspIHsKKwkJCXN0cnVjdCByZXNvdXJjZSAqYnVzciA9IGRldi0+YnVzLT5yZXNvdXJjZVtpXTsKKworCQkJaWYgKCFidXNyIHx8IChidXNyLT5mbGFncyBeIGRldnItPmZsYWdzKSAmIHR5cGVfbWFzaykKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGRldnItPnN0YXJ0ICYmCisJCQkgICAgZGV2ci0+c3RhcnQgPj0gYnVzci0+c3RhcnQgJiYKKwkJCSAgICBkZXZyLT5lbmQgPD0gYnVzci0+ZW5kKQorCQkJCXJldHVybiAxOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2liaW9zX2ZpeHVwX2RldmljZV9yZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2J1c19yZWdpb24gcmVnaW9uOworCWludCBpOworCWludCBsaW1pdDsKKworCWlmIChkZXYtPmJ1cy0+bnVtYmVyICE9IDApCisJCXJldHVybjsKKworCWxpbWl0ID0gKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX05PUk1BTCkgPworCQlQQ0lfQlJJREdFX1JFU09VUkNFUyA6IFBDSV9OVU1fUkVTT1VSQ0VTOworCisJZm9yIChpID0gMDsgaSA8IGxpbWl0OyBpKyspIHsKKwkJaWYgKCFkZXYtPnJlc291cmNlW2ldLmZsYWdzKQorCQkJY29udGludWU7CisKKwkJcmVnaW9uLnN0YXJ0ID0gZGV2LT5yZXNvdXJjZVtpXS5zdGFydDsKKwkJcmVnaW9uLmVuZCA9IGRldi0+cmVzb3VyY2VbaV0uZW5kOworCQlwY2liaW9zX2J1c190b19yZXNvdXJjZShkZXYsICZkZXYtPnJlc291cmNlW2ldLCAmcmVnaW9uKTsKKwkJaWYgKGlzX3ZhbGlkX3Jlc291cmNlKGRldiwgaSkpCisJCQlwY2lfY2xhaW1fcmVzb3VyY2UoZGV2LCBpKTsKKwl9Cit9CisKKy8qCisgKiAgQ2FsbGVkIGFmdGVyIGVhY2ggYnVzIGlzIHByb2JlZCwgYnV0IGJlZm9yZSBpdHMgY2hpbGRyZW4KKyAqICBhcmUgZXhhbWluZWQuCisgKi8KK3ZvaWQgX19kZXZpbml0IHBjaWJpb3NfZml4dXBfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKworCWlmIChidXMtPnNlbGYpIHsKKwkJcGNpX3JlYWRfYnJpZGdlX2Jhc2VzKGJ1cyk7CisJCXBjaWJpb3NfZml4dXBfZGV2aWNlX3Jlc291cmNlcyhidXMtPnNlbGYpOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkKKwkJcGNpYmlvc19maXh1cF9kZXZpY2VfcmVzb3VyY2VzKGRldik7Cit9CisKKy8qCisgKiBJbml0aWFsaXphdGlvbi4gVHJ5IGFsbCBrbm93biBQQ0kgYWNjZXNzIG1ldGhvZHMuIE5vdGUgdGhhdCB3ZSBzdXBwb3J0CisgKiB1c2luZyBib3RoIFBDSSBCSU9TIGFuZCBkaXJlY3QgYWNjZXNzOiBpbiBzdWNoIGNhc2VzLCB3ZSB1c2UgSS9PIHBvcnRzCisgKiB0byBhY2Nlc3MgY29uZmlnIHNwYWNlLCBidXQgd2Ugc3RpbGwga2VlcCBCSU9TIG9yZGVyIG9mIGNhcmRzIHRvIGJlCisgKiBjb21wYXRpYmxlIHdpdGggMi4wLlguIFRoaXMgc2hvdWxkIGdvIGF3YXkgc29tZSBkYXkuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHBjaWJpb3NfaW5pdCh2b2lkKQoreworCWlvcG9ydF9yZXNvdXJjZS5zdGFydAk9IDB4QTAwMDAwMDA7CisJaW9wb3J0X3Jlc291cmNlLmVuZAk9IDB4REZGRkZGRkY7CisJaW9tZW1fcmVzb3VyY2Uuc3RhcnQJPSAweEEwMDAwMDAwOworCWlvbWVtX3Jlc291cmNlLmVuZAk9IDB4REZGRkZGRkY7CisKKwlpZiAoIXBjaV9wcm9iZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAocGNpX2NoZWNrX2RpcmVjdCgpIDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IE5vIFBDSSBidXMgZGV0ZWN0ZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJQQ0k6IFByb2JpbmcgUENJIGhhcmR3YXJlIFttZW1wYWdlICUwOHhdXG4iLAorCSAgICAgICBNRU1fUEFHSU5HX1JFRyk7CisKKwl7CisjaWYgMAorCQlzdGF0aWMgc3RydWN0IHBjaV9idXMgYW0zM19yb290X2J1cyA9IHsKKwkJCS5jaGlsZHJlbiAgPSBMSVNUX0hFQURfSU5JVChhbTMzX3Jvb3RfYnVzLmNoaWxkcmVuKSwKKwkJCS5kZXZpY2VzICAgPSBMSVNUX0hFQURfSU5JVChhbTMzX3Jvb3RfYnVzLmRldmljZXMpLAorCQkJLm51bWJlciAgICA9IDAsCisJCQkuc2Vjb25kYXJ5ID0gMCwKKwkJCS5yZXNvdXJjZSA9IHsgJmlvcG9ydF9yZXNvdXJjZSwgJmlvbWVtX3Jlc291cmNlIH0sCisJCX07CisKKwkJYW0zM19yb290X2J1cy5vcHMgPSBwY2lfcm9vdF9vcHM7CisJCWxpc3RfYWRkX3RhaWwoJmFtMzNfcm9vdF9idXMubm9kZSwgJnBjaV9yb290X2J1c2VzKTsKKworCQlhbTMzX3Jvb3RfYnVzLnN1Ym9yZGluYXRlID0gcGNpX2RvX3NjYW5fYnVzKDApOworCisJCXBjaV9yb290X2J1cyA9ICZhbTMzX3Jvb3RfYnVzOworI2Vsc2UKKwkJcGNpX3Jvb3RfYnVzID0gcGNpX3NjYW5fYnVzKDAsICZwY2lfZGlyZWN0X2FtcGNpLCBOVUxMKTsKKyNlbmRpZgorCX0KKworCXBjaWJpb3NfaXJxX2luaXQoKTsKKwlwY2liaW9zX2ZpeHVwX2lycXMoKTsKKyNpZiAwCisJcGNpYmlvc19yZXNvdXJjZV9zdXJ2ZXkoKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCithcmNoX2luaXRjYWxsKHBjaWJpb3NfaW5pdCk7CisKK2NoYXIgKl9faW5pdCBwY2liaW9zX3NldHVwKGNoYXIgKnN0cikKK3sKKwlpZiAoIXN0cmNtcChzdHIsICJvZmYiKSkgeworCQlwY2lfcHJvYmUgPSAwOworCQlyZXR1cm4gTlVMTDsKKworCX0gZWxzZSBpZiAoIXN0cm5jbXAoc3RyLCAibGFzdGJ1cz0iLCA4KSkgeworCQlwY2liaW9zX2xhc3RfYnVzID0gc2ltcGxlX3N0cnRvbChzdHIrOCwgTlVMTCwgMCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBzdHI7Cit9CisKK2ludCBwY2liaW9zX2VuYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG1hc2spCit7CisJaW50IGVycjsKKworCWVyciA9IHBjaWJpb3NfZW5hYmxlX3Jlc291cmNlcyhkZXYsIG1hc2spOworCWlmIChlcnIgPT0gMCkKKwkJcGNpYmlvc19lbmFibGVfaXJxKGRldik7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIGRpc2FibGUgdGhlIGV0aGVybmV0IGNoaXBzZXQKKyAqLworc3RhdGljIHZvaWQgX19pbml0IHVuaXRfZGlzYWJsZV9wY25ldChzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBzdHJ1Y3QgcGNpX29wcyAqbykKK3sKKwl1MzIgeDsKKworCWJ1cy0+bnVtYmVyID0gMDsKKworCW8tPnJlYWQgKGJ1cywgUENJX0RFVkZOKDIsIDApLCBQQ0lfQ09NTUFORCwJCTIsICZ4KTsKKwl4IHw9IFBDSV9DT01NQU5EX01BU1RFUiB8CisJCVBDSV9DT01NQU5EX0lPIHwgUENJX0NPTU1BTkRfTUVNT1JZIHwKKwkJUENJX0NPTU1BTkRfU0VSUiB8IFBDSV9DT01NQU5EX1BBUklUWTsKKwlvLT53cml0ZShidXMsIFBDSV9ERVZGTigyLCAwKSwgUENJX0NPTU1BTkQsCQkyLCB4KTsKKwlvLT5yZWFkIChidXMsIFBDSV9ERVZGTigyLCAwKSwgUENJX0NPTU1BTkQsCQkyLCAmeCk7CisJby0+d3JpdGUoYnVzLCBQQ0lfREVWRk4oMiwgMCksIFBDSV9CQVNFX0FERFJFU1NfMCwJNCwgMHgwMDAzMDAwMSk7CisJby0+cmVhZCAoYnVzLCBQQ0lfREVWRk4oMiwgMCksIFBDSV9CQVNFX0FERFJFU1NfMCwJNCwgJngpOworCisjZGVmaW5lIFJEUCAoKih2b2xhdGlsZSB1MzIgKikgMHhCRTAzMDAxMCkKKyNkZWZpbmUgUkFQICgqKHZvbGF0aWxlIHUzMiAqKSAweEJFMDMwMDE0KQorI2RlZmluZSBfX3NldF9SQVAoWCkgZG8geyBSQVAgPSAoWCk7IHggPSBSQVA7IH0gd2hpbGUgKDApCisjZGVmaW5lIF9fc2V0X1JEUChYKSBkbyB7IFJEUCA9IChYKTsgeCA9IFJEUDsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgX19nZXRfUkRQKCkgKHsgUkRQICYgMHhmZmZmOyB9KQorCisJX19zZXRfUkFQKDApOworCV9fc2V0X1JEUCgweDAwMDQpOwkvKiBDU1IwID0gU1RPUCAqLworCisJX19zZXRfUkFQKDg4KTsJCS8qIGNoZWNrIENTUjg4IGluZGljYXRlcyBhbiBBbTc5Qzk3MyAqLworCUJVR19PTihfX2dldF9SRFAoKSAhPSAweDUwMDMpOworCisJZm9yICh4ID0gMDsgeCA8IDEwMDsgeCsrKQorCQlhc20gdm9sYXRpbGUoIm5vcCIpOworCisJX19zZXRfUkRQKDB4MDAwNCk7CS8qIENTUjAgPSBTVE9QICovCit9CisKKy8qCisgKiBpbml0aWFsaXNlIHRoZSB1bml0IGhhcmR3YXJlCisgKi8KK2FzbWxpbmthZ2Ugdm9pZCBfX2luaXQgdW5pdF9wY2lfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwY2lfYnVzIGJ1czsJCS8qIEZha2UgYnVzIGFuZCBkZXZpY2UgKi8KKwlzdHJ1Y3QgcGNpX29wcyAqbyA9ICZwY2lfZGlyZWN0X2FtcGNpOworCXUzMiB4OworCisJc2V0X2ludHJfbGV2ZWwoWElSUTEsIEd4SUNSX0xFVkVMXzMpOworCisJbWVtc2V0KCZidXMsIDAsIHNpemVvZihidXMpKTsKKworCU1FTV9QQUdJTkdfUkVHID0gMHhFODAwMDAwMDsKKworCS8qIHdlIG5lZWQgdG8gc2V0IHVwIHRoZSBicmlkZ2UgX25vd18gb3Igd2Ugd29uJ3QgYmUgYWJsZSB0byBhY2Nlc3MgdGhlCisJICogUENJIGNvbmZpZyByZWdpc3RlcnMKKwkgKi8KKwlCUklER0VSRUdXKFBDSV9DT01NQU5EKSB8PQorCQlQQ0lfQ09NTUFORF9TRVJSIHwgUENJX0NPTU1BTkRfUEFSSVRZIHwKKwkJUENJX0NPTU1BTkRfTUVNT1JZIHwgUENJX0NPTU1BTkRfSU8gfCBQQ0lfQ09NTUFORF9NQVNURVI7CisJQlJJREdFUkVHVyhQQ0lfU1RBVFVTKQkJPSAweEY4MDA7CisJQlJJREdFUkVHQihQQ0lfTEFURU5DWV9USU1FUikJPSAweDEwOworCUJSSURHRVJFR0woUENJX0JBU0VfQUREUkVTU18wKQk9IDB4ODAwMDAwMDA7CisJQlJJREdFUkVHQihQQ0lfSU5URVJSVVBUX0xJTkUpCT0gMTsKKwlCUklER0VSRUdMKDB4NDgpCQk9IDB4OTgwMDAwMDA7CS8qIEFNUENJIGJhc2UgYWRkciAqLworCUJSSURHRVJFR0IoMHg0MSkJCT0gMHgwMDsJCS8qIHNlY29uZGFyeSBidXMKKwkJCQkJCQkgKiBudW1iZXIgKi8KKwlCUklER0VSRUdCKDB4NDIpCQk9IDB4MDE7CQkvKiBzdWJvcmRpbmF0ZSBidXMKKwkJCQkJCQkgKiBudW1iZXIgKi8KKwlCUklER0VSRUdCKDB4NDQpCQk9IDB4MDE7CisJQlJJREdFUkVHTCgweDUwKQkJPSAweDAwMDAwMDAxOworCUJSSURHRVJFR0woMHg1OCkJCT0gMHgwMDAwMTAwMjsKKwlCUklER0VSRUdMKDB4NUMpCQk9IDB4MDAwMDAwMTE7CisKKwkvKiB3ZSBhbHNvIG5lZWQgdG8gc2V0IHVwIHRoZSBQQ0ktUENJIGJyaWRnZSAqLworCWJ1cy5udW1iZXIgPSAwOworCisJLyogSU86IDB4MDAwMDAwMDAtMHgwMDAyMDAwMCAqLworCW8tPnJlYWQgKCZidXMsIFBDSV9ERVZGTigzLCAwKSwgUENJX0NPTU1BTkQsCQkyLCAmeCk7CisJeCB8PSBQQ0lfQ09NTUFORF9NQVNURVIgfAorCQlQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01FTU9SWSB8CisJCVBDSV9DT01NQU5EX1NFUlIgfCBQQ0lfQ09NTUFORF9QQVJJVFk7CisJby0+d3JpdGUoJmJ1cywgUENJX0RFVkZOKDMsIDApLCBQQ0lfQ09NTUFORCwJCTIsIHgpOworCisJby0+cmVhZCAoJmJ1cywgUENJX0RFVkZOKDMsIDApLCBQQ0lfSU9fQkFTRSwJCTEsICZ4KTsKKwlvLT5yZWFkICgmYnVzLCBQQ0lfREVWRk4oMywgMCksIFBDSV9JT19CQVNFX1VQUEVSMTYsCTQsICZ4KTsKKwlvLT5yZWFkICgmYnVzLCBQQ0lfREVWRk4oMywgMCksIFBDSV9NRU1PUllfQkFTRSwJNCwgJngpOworCW8tPnJlYWQgKCZidXMsIFBDSV9ERVZGTigzLCAwKSwgUENJX1BSRUZfTUVNT1JZX0JBU0UsCTQsICZ4KTsKKworCW8tPndyaXRlKCZidXMsIFBDSV9ERVZGTigzLCAwKSwgUENJX0lPX0JBU0UsCQkxLCAweDAxKTsKKwlvLT5yZWFkICgmYnVzLCBQQ0lfREVWRk4oMywgMCksIFBDSV9JT19CQVNFLAkJMSwgJngpOworCW8tPndyaXRlKCZidXMsIFBDSV9ERVZGTigzLCAwKSwgUENJX0lPX0JBU0VfVVBQRVIxNiwJNCwgMHgwMDAyMDAwMCk7CisJby0+cmVhZCAoJmJ1cywgUENJX0RFVkZOKDMsIDApLCBQQ0lfSU9fQkFTRV9VUFBFUjE2LAk0LCAmeCk7CisJby0+d3JpdGUoJmJ1cywgUENJX0RFVkZOKDMsIDApLCBQQ0lfTUVNT1JZX0JBU0UsCTQsIDB4RUJCMEVBMDApOworCW8tPnJlYWQgKCZidXMsIFBDSV9ERVZGTigzLCAwKSwgUENJX01FTU9SWV9CQVNFLAk0LCAmeCk7CisJby0+d3JpdGUoJmJ1cywgUENJX0RFVkZOKDMsIDApLCBQQ0lfUFJFRl9NRU1PUllfQkFTRSwJNCwgMHhFOUYwRTgwMCk7CisJby0+cmVhZCAoJmJ1cywgUENJX0RFVkZOKDMsIDApLCBQQ0lfUFJFRl9NRU1PUllfQkFTRSwJNCwgJngpOworCisJdW5pdF9kaXNhYmxlX3BjbmV0KCZidXMsIG8pOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL3VuaXQtYXNiMjMwNS91bml0LWluaXQuYyBiL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzMDUvdW5pdC1pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEzNTI0MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzMDUvdW5pdC1pbml0LmMKQEAgLTAsMCArMSw2MSBAQAorLyogQVNCMjMwNSBJbml0aWFsaXNhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vY3B1L2ludGN0bC1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL2NwdS9ydGMtcmVncy5oPgorI2luY2x1ZGUgPGFzbS9jcHUvc2VyaWFsLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vdW5pdC9zZXJpYWwuaD4KKworLyoKKyAqIGluaXRpYWxpc2Ugc29tZSBvZiB0aGUgdW5pdCBoYXJkd2FyZSBiZWZvcmUgZ2Ric3R1YiBpcyBzZXQgdXAKKyAqLworYXNtbGlua2FnZSB2b2lkIF9faW5pdCB1bml0X2luaXQodm9pZCkKK3sKKyNpZm5kZWYgQ09ORklHX0dEQlNUVUJfT05fVFRZU3gKKwkvKiBzZXQgdGhlIDE2NTUwIGludGVycnVwdCBsaW5lIHRvIGxldmVsIDMgaWYgbm90IGJlaW5nIHVzZWQgZm9yIEdEQiAqLworCXNldF9pbnRyX2xldmVsKFhJUlEwLCBHeElDUl9MRVZFTF8zKTsKKyNlbmRpZgorfQorCisvKgorICogaW5pdGlhbGlzZSB0aGUgcmVzdCBvZiB0aGUgdW5pdCBoYXJkd2FyZSBhZnRlciBnZGJzdHViIGlzIHJlYWR5CisgKi8KK3ZvaWQgX19pbml0IHVuaXRfc2V0dXAodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfUENJCisJdW5pdF9wY2lfaW5pdCgpOworI2VuZGlmCit9CisKKy8qCisgKiBpbml0aWFsaXNlIHRoZSBleHRlcm5hbCBpbnRlcnJ1cHRzIHVzZWQgYnkgYSB1bml0IG9mIHRoaXMgdHlwZQorICovCit2b2lkIF9faW5pdCB1bml0X2luaXRfSVJRKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGV4dG51bTsKKworCWZvciAoZXh0bnVtID0gMDsgZXh0bnVtIDwgTlJfWElSUVM7IGV4dG51bSsrKSB7CisJCXN3aXRjaCAoR0VUX1hJUlFfVFJJR0dFUihleHRudW0pKSB7CisJCWNhc2UgWElSUV9UUklHR0VSX0hJTEVWRUw6CisJCWNhc2UgWElSUV9UUklHR0VSX0xPV0xFVkVMOgorCQkJc2V0X2lycV9oYW5kbGVyKFhJUlEySVJRKGV4dG51bSksIGhhbmRsZV9sZXZlbF9pcnEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL0tjb25maWcgYi9hcmNoL3BhcmlzYy9LY29uZmlnCmluZGV4IDAyOGQ4YTAuLmQ5MjlhYzggMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL0tjb25maWcKKysrIGIvYXJjaC9wYXJpc2MvS2NvbmZpZwpAQCAtNzUsNiArNzUsOSBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIEFSQ0hfU1VQUE9SVFNfQU9VVAorCWRlZl9ib29sIHkKKwogIyB1bmxlc3MgeW91IHdhbnQgdG8gaW1wbGVtZW50IEFDUEkgb24gUEEtUklTQyAuLi4gOy0pCiBjb25maWcgUE0KIAlib29sCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zZXR1cC5jCmluZGV4IGM0NGI4YzUuLjM5ZTdjNWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zZXR1cC5jCkBAIC0xOTAsNyArMTkwLDcgQEAKIHsKIH0KIAotc3RydWN0IHNlcV9vcGVyYXRpb25zIGNwdWluZm9fb3AgPSB7Citjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgY3B1aW5mb19vcCA9IHsKIAkuc3RhcnQJPSBjX3N0YXJ0LAogCS5uZXh0CT0gY19uZXh0LAogCS5zdG9wCT0gY19zdG9wLApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvbW0vaW5pdC5jIGIvYXJjaC9wYXJpc2MvbW0vaW5pdC5jCmluZGV4IGFhODc1ZmEuLmViODBmNWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL21tL2luaXQuYworKysgYi9hcmNoL3BhcmlzYy9tbS9pbml0LmMKQEAgLTMxNSwxMSArMzE1LDEzIEBACiAjZGVmaW5lIFBEQ19DT05TT0xFX0lPX0lPRENfU0laRSAzMjc2OAogCiAJcmVzZXJ2ZV9ib290bWVtX25vZGUoTk9ERV9EQVRBKDApLCAwVUwsCi0JCQkodW5zaWduZWQgbG9uZykoUEFHRTAtPm1lbV9mcmVlICsgUERDX0NPTlNPTEVfSU9fSU9EQ19TSVpFKSk7CisJCQkodW5zaWduZWQgbG9uZykoUEFHRTAtPm1lbV9mcmVlICsKKwkJCQlQRENfQ09OU09MRV9JT19JT0RDX1NJWkUpLCBCT09UTUVNX0RFRkFVTFQpOwogCXJlc2VydmVfYm9vdG1lbV9ub2RlKE5PREVfREFUQSgwKSwgX19wYSgodW5zaWduZWQgbG9uZylfdGV4dCksCi0JCQkodW5zaWduZWQgbG9uZykoX2VuZCAtIF90ZXh0KSk7CisJCQkodW5zaWduZWQgbG9uZykoX2VuZCAtIF90ZXh0KSwgQk9PVE1FTV9ERUZBVUxUKTsKIAlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoMCksIChib290bWFwX3N0YXJ0X3BmbiA8PCBQQUdFX1NISUZUKSwKLQkJCSgoYm9vdG1hcF9wZm4gLSBib290bWFwX3N0YXJ0X3BmbikgPDwgUEFHRV9TSElGVCkpOworCQkJKChib290bWFwX3BmbiAtIGJvb3RtYXBfc3RhcnRfcGZuKSA8PCBQQUdFX1NISUZUKSwKKwkJCUJPT1RNRU1fREVGQVVMVCk7CiAKICNpZm5kZWYgQ09ORklHX0RJU0NPTlRJR01FTQogCkBAIC0zMjgsNyArMzMwLDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgbnBtZW1faG9sZXM7IGkrKykgewogCQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoMCksCiAJCQkJKHBtZW1faG9sZXNbaV0uc3RhcnRfcGZuIDw8IFBBR0VfU0hJRlQpLAotCQkJCShwbWVtX2hvbGVzW2ldLnBhZ2VzIDw8IFBBR0VfU0hJRlQpKTsKKwkJCQkocG1lbV9ob2xlc1tpXS5wYWdlcyA8PCBQQUdFX1NISUZUKSwKKwkJCQlCT09UTUVNX0RFRkFVTFQpOwogCX0KICNlbmRpZgogCkBAIC0zNDYsNyArMzQ5LDggQEAKIAkJCWluaXRyZF9iZWxvd19zdGFydF9vayA9IDE7CiAJCQlwcmludGsoS0VSTl9JTkZPICJpbml0cmQ6IHJlc2VydmluZyAlMDhseC0lMDhseCAobWVtX21heCAlMDhseClcbiIsIF9fcGEoaW5pdHJkX3N0YXJ0KSwgX19wYShpbml0cmRfc3RhcnQpICsgaW5pdHJkX3Jlc2VydmUsIG1lbV9tYXgpOwogCi0JCQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoMCksX19wYShpbml0cmRfc3RhcnQpLCBpbml0cmRfcmVzZXJ2ZSk7CisJCQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoMCksIF9fcGEoaW5pdHJkX3N0YXJ0KSwKKwkJCQkJaW5pdHJkX3Jlc2VydmUsIEJPT1RNRU1fREVGQVVMVCk7CiAJCX0KIAl9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKaW5kZXggY2YwMzBiMC4uMjZiOTYzYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKQEAgLTk3LDYgKzk3LDcgQEAKIGNvbmZpZyBDT01QQVQKIAlib29sCiAJZGVmYXVsdCB5IGlmIFBQQzY0CisJc2VsZWN0IENPTVBBVF9CSU5GTVRfRUxGCiAKIGNvbmZpZyBTWVNWSVBDX0NPTVBBVAogCWJvb2wKQEAgLTI3MSw2ICsyNzIsMTIgQEAKIGNvbmZpZyBBUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRwogCWRlZl9ib29sIHkKIAorY29uZmlnIEFSQ0hfSEFTX1dBTEtfTUVNT1JZCisJZGVmX2Jvb2wgeQorCitjb25maWcgQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFJFTU9WRQorCWRlZl9ib29sIHkKKwogY29uZmlnIEtFWEVDCiAJYm9vbCAia2V4ZWMgc3lzdGVtIGNhbGwgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiAoUFBDX1BSUE1DMjgwMCB8fCBQUENfTVVMVElQTEFURk9STSkgJiYgRVhQRVJJTUVOVEFMCkBAIC00MzgsMjUgKzQ0NSw2IEBACiAJYm9vbAogCWRlZmF1bHQgbgogCi1jb25maWcgREVWSUNFX1RSRUUKLQlzdHJpbmcgIlN0YXRpYyBkZXZpY2UgdHJlZSBzb3VyY2UgZmlsZSIKLQlkZXBlbmRzIG9uIFdBTlRfREVWSUNFX1RSRUUKLQloZWxwCi0JICBUaGlzIHNwZWNpZmllcyB0aGUgZGV2aWNlIHRyZWUgc291cmNlICguZHRzKSBmaWxlIHRvIGJlCi0JICBjb21waWxlZCBhbmQgaW5jbHVkZWQgd2hlbiBidWlsZGluZyB0aGUgYm9vdHdyYXBwZXIuICBJZiBhCi0JICByZWxhdGl2ZSBmaWxlbmFtZSBpcyBnaXZlbiwgdGhlbiBpdCB3aWxsIGJlIHJlbGF0aXZlIHRvCi0JICBhcmNoL3Bvd2VycGMvYm9vdC9kdHMuICBJZiB5b3UgYXJlIG5vdCB1c2luZyB0aGUgYm9vdHdyYXBwZXIsCi0JICBvciBkbyBub3QgbmVlZCB0byBidWlsZCBhIGR0cyBpbnRvIHRoZSBib290d3JhcHBlciwgdGhpcwotCSAgZmllbGQgaXMgaWdub3JlZC4KLQotCSAgRm9yIGV4YW1wbGUsIHRoaXMgaXMgcmVxdWlyZWQgd2hlbiBidWlsZGluZyBhIGN1SW1hZ2UgdGFyZ2V0Ci0JICBmb3IgYW4gb2xkZXIgVS1Cb290LCB3aGljaCBjYW5ub3QgcGFzcyBhIGRldmljZSB0cmVlIGl0c2VsZi4KLQkgIFN1Y2ggYSBrZXJuZWwgd2lsbCBub3Qgd29yayB3aXRoIGEgbmV3ZXIgVS1Cb290IHRoYXQgdHJpZXMgdG8KLQkgIHBhc3MgYSBkZXZpY2UgdHJlZSAodW5sZXNzIHlvdSB0ZWxsIGl0IG5vdCB0bykuICBJZiB5b3VyIFUtQm9vdAotCSAgZG9lcyBub3QgbWVudGlvbiBhIGRldmljZSB0cmVlIGluICJoZWxwIGJvb3RtIiwgdGhlbiB1c2UgdGhlCi0JICBjdUltYWdlIHRhcmdldCBhbmQgc3BlY2lmeSBhIGRldmljZSB0cmVlIGhlcmUuICBPdGhlcndpc2UsIHVzZQotCSAgdGhlIHVJbWFnZSB0YXJnZXQgYW5kIGxlYXZlIHRoaXMgZmllbGQgYmxhbmsuCi0KIGVuZG1lbnUKIAogY29uZmlnIElTQV9ETUFfQVBJCkBAIC01MTIsNyArNTAwLDcgQEAKIAlib29sICJQQ0kgc3VwcG9ydCIgaWYgNDB4IHx8IENQTTIgfHwgUFBDXzgzeHggfHwgUFBDXzg1eHggfHwgUFBDXzg2eHggXAogCQl8fCBQUENfTVBDNTJ4eCB8fCAoRU1CRURERUQgJiYgKFBQQ19QU0VSSUVTIHx8IFBQQ19JU0VSSUVTKSkgXAogCQl8fCBQUENfUFMzIHx8IDQ0eAotCWRlZmF1bHQgeSBpZiAhNDB4ICYmICFDUE0yICYmICE4eHggJiYgIVBQQ184M3h4IFwKKwlkZWZhdWx0IHkgaWYgITQweCAmJiAhQ1BNMiAmJiAhOHh4ICYmICFQUENfTVBDNTEyeCAmJiAhUFBDXzgzeHggXAogCQkmJiAhUFBDXzg1eHggJiYgIVBQQ184Nnh4CiAJZGVmYXVsdCBQQ0lfUEVSTUVESUEgaWYgITR4eCAmJiAhQ1BNMiAmJiAhOHh4CiAJZGVmYXVsdCBQQ0lfUVNQQU4gaWYgITR4eCAmJiAhQ1BNMiAmJiA4eHgKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9NYWtlZmlsZQppbmRleCBmNzBkZjliLi42ODQ1NDgyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL01ha2VmaWxlCkBAIC0xNTEsMTQgKzE1MSwxMSBAQAogZHJpdmVycy0kKENPTkZJR19PUFJPRklMRSkJKz0gYXJjaC9wb3dlcnBjL29wcm9maWxlLwogCiAjIERlZmF1bHQgdG8gekltYWdlLCBvdmVycmlkZSB3aGVuIG5lZWRlZAotZGVmYXVsdGltYWdlLXkJCQk6PSB6SW1hZ2UKLWRlZmF1bHRpbWFnZS0kKENPTkZJR19ERUZBVUxUX1VJTUFHRSkgOj0gdUltYWdlCi1LQlVJTERfSU1BR0UgOj0gJChkZWZhdWx0aW1hZ2UteSkKLWFsbDogJChLQlVJTERfSU1BR0UpCithbGw6IHpJbWFnZQogCiBDUFBGTEFHU192bWxpbnV4Lmxkcwk6PSAtVXBvd2VycGMKIAotQk9PVF9UQVJHRVRTID0gekltYWdlIHpJbWFnZS5pbml0cmQgdUltYWdlCitCT09UX1RBUkdFVFMgPSB6SW1hZ2UgekltYWdlLmluaXRyZCB1SW1hZ2UgdHJlZUltYWdlLiUgY3VJbWFnZS4lCiAKIFBIT05ZICs9ICQoQk9PVF9UQVJHRVRTKQogCkBAIC0xODAsNyArMTc3LDcgQEAKIGVuZGVmCiAKIGluc3RhbGw6IHZkc29faW5zdGFsbAotCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgQk9PVElNQUdFPSQoS0JVSUxEX0lNQUdFKSBpbnN0YWxsCisJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSBpbnN0YWxsCiAKIHZkc29faW5zdGFsbDoKIGlmZXEgKCQoQ09ORklHX1BQQzY0KSx5KQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZQppbmRleCAxMjJhMjcwLi40OTc5N2E0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZQpAQCAtNjAsOCArNjAsOSBAQAogc3JjLXBsYXQgOj0gb2YuYyBjdWJvb3QtNTJ4eC5jIGN1Ym9vdC04MjR4LmMgY3Vib290LTgzeHguYyBjdWJvb3QtODV4eC5jIGhvbGx5LmMgXAogCQljdWJvb3QtZWJvbnkuYyB0cmVlYm9vdC1lYm9ueS5jIHBycG1jMjgwMC5jIFwKIAkJcHMzLWhlYWQuUyBwczMtaHZjYWxsLlMgcHMzLmMgdHJlZWJvb3QtYmFtYm9vLmMgY3Vib290LTh4eC5jIFwKLQkJY3Vib290LXBxMi5jIGN1Ym9vdC1zZXF1b2lhLmMgdHJlZWJvb3Qtd2FsbnV0LmMgY3Vib290LWJhbWJvby5jIFwKLQkJZml4ZWQtaGVhZC5TIGVwODh4Yy5jIGN1Ym9vdC1ocGMyLmMgZXA0MDUuYyBjdWJvb3QtdGFpc2hhbi5jIFwKKwkJY3Vib290LXBxMi5jIGN1Ym9vdC1zZXF1b2lhLmMgdHJlZWJvb3Qtd2FsbnV0LmMgXAorCQljdWJvb3QtYmFtYm9vLmMgY3Vib290LW1wYzc0NDhocGMyLmMgY3Vib290LXRhaXNoYW4uYyBcCisJCWZpeGVkLWhlYWQuUyBlcDg4eGMuYyBlcDQwNS5jIFwKIAkJY3Vib290LWthdG1haS5jIGN1Ym9vdC1yYWluaWVyLmMgcmVkYm9vdC04eHguYyBlcDgyNDhlLmMgXAogCQljdWJvb3Qtd2FycC5jIGN1Ym9vdC04NXh4LWNwbTIuYwogc3JjLWJvb3QgOj0gJChzcmMtd2xpYikgJChzcmMtcGxhdCkgZW1wdHkuYwpAQCAtMTIzLDYgKzEyNCw4IEBACiBleHRyYS15CQk6PSAkKG9iaikvd3JhcHBlci5hICQob2JqLXBsYXQpICQob2JqKS9lbXB0eS5vIFwKIAkJICAgJChvYmopL3pJbWFnZS5sZHMgJChvYmopL3pJbWFnZS5jb2ZmLmxkcyAkKG9iaikvekltYWdlLnBzMy5sZHMKIAorZHRzdHJlZQkJOj0gJChzcmN0cmVlKS8kKHNyYykvZHRzCisKIHdyYXBwZXIJCTo9JChzcmN0cmVlKS8kKHNyYykvd3JhcHBlcgogd3JhcHBlcmJpdHMJOj0gJChleHRyYS15KSAkKGFkZHByZWZpeCAkKG9iaikvLGFkZG5vdGUgaGFjay1jb2ZmIG1rdHJlZSBkdGMpIFwKIAkJCSQod3JhcHBlcikgRk9SQ0UKQEAgLTE4MSw3ICsxODQsNyBAQAogaW1hZ2UtJChDT05GSUdfUFBDX1BTRVJJRVMpCQkrPSB6SW1hZ2UucHNlcmllcwogaW1hZ2UtJChDT05GSUdfUFBDX01BUExFKQkJKz0gekltYWdlLnBzZXJpZXMKIGltYWdlLSQoQ09ORklHX1BQQ19JQk1fQ0VMTF9CTEFERSkJKz0gekltYWdlLnBzZXJpZXMKLWltYWdlLSQoQ09ORklHX1BQQ19QUzMpCQkJKz0gekltYWdlLnBzMworaW1hZ2UtJChDT05GSUdfUFBDX1BTMykJCQkrPSB6SW1hZ2UtZHRiLnBzMwogaW1hZ2UtJChDT05GSUdfUFBDX0NFTExFQikJCSs9IHpJbWFnZS5wc2VyaWVzCiBpbWFnZS0kKENPTkZJR19QUENfQ0hSUCkJCSs9IHpJbWFnZS5jaHJwCiBpbWFnZS0kKENPTkZJR19QUENfRUZJS0EpCQkrPSB6SW1hZ2UuY2hycApAQCAtMTkxLDMzICsxOTQsNjkgQEAKIGltYWdlLSQoQ09ORklHX1BQQ19JU0VSSUVTKQkJKz0gekltYWdlLmlzZXJpZXMKIGltYWdlLSQoQ09ORklHX0RFRkFVTFRfVUlNQUdFKQkJKz0gdUltYWdlCiAKLWlmbmVxICgkKENPTkZJR19ERVZJQ0VfVFJFRSksIiIpCi1pbWFnZS0kKENPTkZJR19QUENfOHh4KQkJCSs9IGN1SW1hZ2UuOHh4Ci1pbWFnZS0kKENPTkZJR19QUENfRVA4OFhDKQkJKz0gekltYWdlLmVwODh4YwotaW1hZ2UtJChDT05GSUdfRVA0MDUpCQkJKz0gekltYWdlLmVwNDA1Ci1pbWFnZS0kKENPTkZJR184MjYwKQkJCSs9IGN1SW1hZ2UucHEyCi1pbWFnZS0kKENPTkZJR19FUDgyNDhFKQkJCSs9IHpJbWFnZS5lcDgyNDhlCi1pbWFnZS0kKENPTkZJR19QUENfTVBDNTJ4eCkJCSs9IGN1SW1hZ2UuNTJ4eAotaW1hZ2UtJChDT05GSUdfU1RPUkNFTlRFUikJCSs9IGN1SW1hZ2UuODI0eAotaW1hZ2UtJChDT05GSUdfUFBDXzgzeHgpCQkrPSBjdUltYWdlLjgzeHgKLWltYWdlLSQoQ09ORklHX1BQQ184NXh4KQkJKz0gY3VJbWFnZS44NXh4Ci1pZmVxICgkKENPTkZJR19DUE0yKSx5KQotaW1hZ2UtJChDT05GSUdfUFBDXzg1eHgpCQkrPSBjdUltYWdlLjg1eHgtY3BtMgotZW5kaWYKLWltYWdlLSQoQ09ORklHX01QQzc0NDhIUEMyKQkJKz0gY3VJbWFnZS5ocGMyCisjCisjIFRhcmdldHMgd2hpY2ggZW1iZWQgYSBkZXZpY2UgdHJlZSBibG9iCisjCisjIFRoZXNlcyBhcmUgZGVmYXVsdCB0YXJnZXRzIHRvIGJ1aWxkIGltYWdlcyB3aGljaCBlbWJlZCBkZXZpY2UgdHJlZSBibG9icy4KKyMgVGhleSBhcmUgb25seSByZXF1aXJlZCBvbiBib2FyZHMgd2hpY2ggZG8gbm90IGhhdmUgRkRUIHN1cHBvcnQgaW4gZmlybXdhcmUuCisjIEJvYXJkcyB3aXRoIG5ld2lzaCB1LWJvb3QgZmlybWFyZSBjYW4gdXNlIHRoZSB1SW1hZ2UgdGFyZ2V0IGFib3ZlCisjCisKKyMgQm9hcmQgcG9ydHMgaW4gYXJjaC9wb3dlcnBjL3BsYXRmb3JtLzQweC9LY29uZmlnCitpbWFnZS0kKENPTkZJR19FUDQwNSkJCQkrPSB6SW1hZ2UtZHRiLmVwNDA1CitpbWFnZS0kKENPTkZJR19XQUxOVVQpCQkJKz0gdHJlZUltYWdlLndhbG51dAorCisjIEJvYXJkIHBvcnRzIGluIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybS80NHgvS2NvbmZpZwogaW1hZ2UtJChDT05GSUdfRUJPTlkpCQkJKz0gdHJlZUltYWdlLmVib255IGN1SW1hZ2UuZWJvbnkKIGltYWdlLSQoQ09ORklHX0JBTUJPTykJCQkrPSB0cmVlSW1hZ2UuYmFtYm9vIGN1SW1hZ2UuYmFtYm9vCiBpbWFnZS0kKENPTkZJR19TRVFVT0lBKQkJCSs9IGN1SW1hZ2Uuc2VxdW9pYQogaW1hZ2UtJChDT05GSUdfUkFJTklFUikJCQkrPSBjdUltYWdlLnJhaW5pZXIKLWltYWdlLSQoQ09ORklHX1dBTE5VVCkJCQkrPSB0cmVlSW1hZ2Uud2FsbnV0CiBpbWFnZS0kKENPTkZJR19UQUlTSEFOKQkJCSs9IGN1SW1hZ2UudGFpc2hhbgogaW1hZ2UtJChDT05GSUdfS0FUTUFJKQkJCSs9IGN1SW1hZ2Uua2F0bWFpCiBpbWFnZS0kKENPTkZJR19XQVJQKQkJCSs9IGN1SW1hZ2Uud2FycAotZW5kaWYKIAotaWZuZXEgKCQoQ09ORklHX1JFREJPT1QpLCIiKQotaW1hZ2UtJChDT05GSUdfUFBDXzh4eCkJCQkrPSB6SW1hZ2UucmVkYm9vdC04eHgKLWVuZGlmCisjIEJvYXJkIHBvcnRzIGluIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybS84eHgvS2NvbmZpZworaW1hZ2UtJChDT05GSUdfUFBDX01QQzg2WEFEUykJCSs9IGN1SW1hZ2UubXBjODY2YWRzCitpbWFnZS0kKENPTkZJR19QUENfTVBDODg1QURTKQkJKz0gY3VJbWFnZS5tcGM4ODVhZHMKK2ltYWdlLSQoQ09ORklHX1BQQ19FUDg4WEMpCQkrPSB6SW1hZ2UtZHRiLmVwODh4YworaW1hZ2UtJChDT05GSUdfUFBDX0FEREVSODc1KQkJKz0gY3VJbWFnZS5hZGRlcjg3NS11Ym9vdCBcCisJCQkJCSAgIHpJbWFnZS1kdGIuYWRkZXI4NzUtcmVkYm9vdAorCisjIEJvYXJkIHBvcnRzIGluIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybS81Mnh4L0tjb25maWcKK2ltYWdlLSQoQ09ORklHX1BQQ19MSVRFNTIwMCkJCSs9IGN1SW1hZ2UubGl0ZTUyMDAgY3VJbWFnZS5saXRlNTIwMGIKKworIyBCb2FyZCBwb3J0cyBpbiBhcmNoL3Bvd2VycGMvcGxhdGZvcm0vODJ4eC9LY29uZmlnCitpbWFnZS0kKENPTkZJR19NUEM4MjcyX0FEUykJCSs9IGN1SW1hZ2UubXBjODI3MmFkcworaW1hZ2UtJChDT05GSUdfUFEyRkFEUykJCQkrPSBjdUltYWdlLnBxMmZhZHMKK2ltYWdlLSQoQ09ORklHX0VQODI0OEUpCQkJKz0gekltYWdlLWR0Yi5lcDgyNDhlCisKKyMgQm9hcmQgcG9ydHMgaW4gYXJjaC9wb3dlcnBjL3BsYXRmb3JtLzgzeHgvS2NvbmZpZworaW1hZ2UtJChDT05GSUdfTVBDODMyeF9NRFMpCQkrPSBjdUltYWdlLm1wYzgzMnhfbWRzCitpbWFnZS0kKENPTkZJR19NUEM4MzJ4X1JEQikJCSs9IGN1SW1hZ2UubXBjODMyeF9yZGIKK2ltYWdlLSQoQ09ORklHX01QQzgzNHhfSVRYKQkJKz0gY3VJbWFnZS5tcGM4MzQ5ZW1pdHggXAorCQkJCQkgICBjdUltYWdlLm1wYzgzNDllbWl0eGdwCitpbWFnZS0kKENPTkZJR19NUEM4MzR4X01EUykJCSs9IGN1SW1hZ2UubXBjODM0eF9tZHMKK2ltYWdlLSQoQ09ORklHX01QQzgzNnhfTURTKQkJKz0gY3VJbWFnZS5tcGM4MzZ4X21kcworCisjIEJvYXJkIHBvcnRzIGluIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybS84NXh4L0tjb25maWcKK2ltYWdlLSQoQ09ORklHX01QQzg1NDBfQURTKQkJKz0gY3VJbWFnZS5tcGM4NTQwYWRzCitpbWFnZS0kKENPTkZJR19NUEM4NTYwX0FEUykJCSs9IGN1SW1hZ2UubXBjODU2MGFkcworaW1hZ2UtJChDT05GSUdfTVBDODV4eF9DRFMpCQkrPSBjdUltYWdlLm1wYzg1NDFjZHMgXAorCQkJCQkgICBjdUltYWdlLm1wYzg1NDhjZHMgXAorCQkJCQkgICBjdUltYWdlLm1wYzg1NTVjZHMKK2ltYWdlLSQoQ09ORklHX01QQzg1eHhfTURTKQkJKz0gY3VJbWFnZS5tcGM4NTY4bWRzCitpbWFnZS0kKENPTkZJR19NUEM4NXh4X0RTKQkJKz0gY3VJbWFnZS5tcGM4NTQ0ZHMgXAorCQkJCQkgICBjdUltYWdlLm1wYzg1NzJkcworaW1hZ2UtJChDT05GSUdfVFFNODU0MCkJCQkrPSBjdUltYWdlLnRxbTg1NDAKK2ltYWdlLSQoQ09ORklHX1RRTTg1NDEpCQkJKz0gY3VJbWFnZS50cW04NTQxCitpbWFnZS0kKENPTkZJR19UUU04NTU1KQkJCSs9IGN1SW1hZ2UudHFtODU1NQoraW1hZ2UtJChDT05GSUdfVFFNODU2MCkJCQkrPSBjdUltYWdlLnRxbTg1NjAKK2ltYWdlLSQoQ09ORklHX1NCQzg1NDgpCQkJKz0gY3VJbWFnZS50cW04NTQ4CitpbWFnZS0kKENPTkZJR19TQkM4NTYwKQkJCSs9IGN1SW1hZ2UudHFtODU2MAorCisjIEJvYXJkIHBvcnRzIGluIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybS9lbWJlZGRlZDZ4eC9LY29uZmlnCitpbWFnZS0kKENPTkZJR19TVE9SQ0VOVEVSKQkJKz0gY3VJbWFnZS5zdG9yY2VudGVyCitpbWFnZS0kKENPTkZJR19NUEM3NDQ4SFBDMikJCSs9IGN1SW1hZ2UubXBjNzQ0OGhwYzIKIAogIyBGb3IgMzItYml0IHBvd2VybWFjcywgYnVpbGQgdGhlIENPRkYgYW5kIG1pYm9vdCBpbWFnZXMKICMgYXMgd2VsbCBhcyB0aGUgRUxGIGltYWdlcy4KQEAgLTIzMywyNCArMjcyLDIwIEBACiAKICQoYWRkcHJlZml4ICQob2JqKS8sICQoaW5pdHJkLXkpKTogJChvYmopL3JhbWRpc2suaW1hZ2UuZ3oKIAotIyBJZiBDT05GSUdfV0FOVF9ERVZJQ0VfVFJFRSBpcyBzZXQgYW5kIENPTkZJR19ERVZJQ0VfVFJFRSBpc24ndCBhbgotIyBlbXB0eSBzdHJpbmcsIGRlZmluZSAnZHRzJyB0byBiZSBwYXRoIHRvIHRoZSBkdHMKLSMgQ09ORklHX0RFVklDRV9UUkVFIHdpbGwgaGF2ZSAiIiBhcm91bmQgaXQsIG1ha2Ugc3VyZSB0byBzdHJpcCB0aGVtCi1pZmVxICgkKENPTkZJR19XQU5UX0RFVklDRV9UUkVFKSx5KQotaWZuZXEgKCQoQ09ORklHX0RFVklDRV9UUkVFKSwiIikKLWR0cyA9ICQoaWYgJChzaGVsbCBlY2hvICQoQ09ORklHX0RFVklDRV9UUkVFKSB8IGdyZXAgJ14vJyksXAotCSwkKHNyY3RyZWUpLyQoc3JjKS9kdHMvKSQoQ09ORklHX0RFVklDRV9UUkVFOiIlIj0lKQotZW5kaWYKLWVuZGlmCi0KICMgRG9uJ3QgcHV0IHRoZSByYW1kaXNrIG9uIHRoZSBwYXR0ZXJuIHJ1bGU7IHdoZW4gaXRzIG1pc3NpbmcgbWFrZSB3aWxsIHRyeQogIyB0aGUgcGF0dGVybiBydWxlIHdpdGggbGVzcyBkZXBlbmRlbmNpZXMgdGhhdCBhbHNvIG1hdGNoZXMgKGV2ZW4gd2l0aCB0aGUKICMgaGFyZCBkZXBlbmRlbmN5IGxpc3RlZCkuCi0kKG9iaikvekltYWdlLmluaXRyZC4lOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpICQoZHRzKQotCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsJCosJChkdHMpLCwkKG9iaikvcmFtZGlzay5pbWFnZS5neikKKyQob2JqKS96SW1hZ2UuaW5pdHJkLiU6IHZtbGludXggJCh3cmFwcGVyYml0cykKKwkkKGNhbGwgaWZfY2hhbmdlZCx3cmFwLCQqLCwsJChvYmopL3JhbWRpc2suaW1hZ2UuZ3opCiAKLSQob2JqKS96SW1hZ2UuJTogdm1saW51eCAkKHdyYXBwZXJiaXRzKSAkKGR0cykKLQkkKGNhbGwgaWZfY2hhbmdlZCx3cmFwLCQqLCQoZHRzKSkKKyQob2JqKS96SW1hZ2UuJTogdm1saW51eCAkKHdyYXBwZXJiaXRzKQorCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsJCopCisKKyQob2JqKS96SW1hZ2UtZHRiLmluaXRyZC4lOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpICQoZHRzdHJlZSkvJS5kdHMKKwkkKGNhbGwgaWZfY2hhbmdlZCx3cmFwLCQqLCQoZHRzdHJlZSkvJCouZHRzLCwkKG9iaikvcmFtZGlzay5pbWFnZS5neikKKworJChvYmopL3pJbWFnZS1kdGIuJTogdm1saW51eCAkKHdyYXBwZXJiaXRzKSAkKGR0c3RyZWUpLyUuZHRzCisJJChjYWxsIGlmX2NoYW5nZWQsd3JhcCwkKiwkKGR0c3RyZWUpLyQqLmR0cykKIAogIyBUaGlzIGNhbm5vdCBiZSBpbiB0aGUgcm9vdCBvZiAkKHNyYykgYXMgdGhlIHpJbWFnZSBydWxlIGFsd2F5cyBhZGRzIGEgJChvYmopCiAjIHByZWZpeApAQCAtMjYwLDI0ICsyOTUsMTcgQEAKICQob2JqKS96SW1hZ2UuaXNlcmllczogdm1saW51eAogCSQoU1RSSVApIC1zIC1SIC5jb21tZW50ICQ8IC1vICRACiAKLSQob2JqKS96SW1hZ2UucHMzOiB2bWxpbnV4ICAkKHdyYXBwZXIpICQod3JhcHBlcmJpdHMpICQoc3JjdHJlZSkvJChzcmMpL2R0cy9wczMuZHRzCi0JJChTVFJJUCkgLXMgLVIgLmNvbW1lbnQgJDwgLW8gdm1saW51eC5zdHJpcAotCSQoY2FsbCBjbWQsd3JhcCxwczMsJChzcmN0cmVlKS8kKHNyYykvZHRzL3BzMy5kdHMsLCkKLQotJChvYmopL3pJbWFnZS5pbml0cmQucHMzOiB2bWxpbnV4ICAkKHdyYXBwZXIpICQod3JhcHBlcmJpdHMpICQoc3JjdHJlZSkvJChzcmMpL2R0cy9wczMuZHRzICQob2JqKS9yYW1kaXNrLmltYWdlLmd6Ci0JJChjYWxsIGNtZCx3cmFwLHBzMywkKHNyY3RyZWUpLyQoc3JjKS9kdHMvcHMzLmR0cywsJChvYmopL3JhbWRpc2suaW1hZ2UuZ3opCi0KICQob2JqKS91SW1hZ2U6IHZtbGludXggJCh3cmFwcGVyYml0cykKIAkkKGNhbGwgaWZfY2hhbmdlZCx3cmFwLHVib290KQogCi0kKG9iaikvY3VJbWFnZS4lOiB2bWxpbnV4ICQoZHRzKSAkKHdyYXBwZXJiaXRzKQotCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsY3Vib290LSQqLCQoZHRzKSkKKyQob2JqKS9jdUltYWdlLiU6IHZtbGludXggJChkdHN0cmVlKS8lLmR0cyAkKHdyYXBwZXJiaXRzKQorCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsY3Vib290LSQqLCQoZHRzdHJlZSkvJCouZHRzKQogCi0kKG9iaikvdHJlZUltYWdlLmluaXRyZC4lOiB2bWxpbnV4ICQoZHRzKSAkKHdyYXBwZXJiaXRzKQotCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsdHJlZWJvb3QtJCosJChkdHMpLCwkKG9iaikvcmFtZGlzay5pbWFnZS5neikKKyQob2JqKS90cmVlSW1hZ2UuaW5pdHJkLiU6IHZtbGludXggJChkdHN0cmVlKS8lLmR0cyAkKHdyYXBwZXJiaXRzKQorCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsdHJlZWJvb3QtJCosJChkdHN0cmVlKS8kKi5kdHMsLCQob2JqKS9yYW1kaXNrLmltYWdlLmd6KQogCi0kKG9iaikvdHJlZUltYWdlLiU6IHZtbGludXggJChkdHMpICQod3JhcHBlcmJpdHMpCi0JJChjYWxsIGlmX2NoYW5nZWQsd3JhcCx0cmVlYm9vdC0kKiwkKGR0cykpCiskKG9iaikvdHJlZUltYWdlLiU6IHZtbGludXggJChkdHN0cmVlKS8lLmR0cyAkKHdyYXBwZXJiaXRzKQorCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsdHJlZWJvb3QtJCosJChkdHN0cmVlKS8kKi5kdHMpCiAKICMgSWYgdGhlcmUgaXNuJ3QgYSBwbGF0Zm9ybSBzZWxlY3RlZCB0aGVuIGp1c3Qgc3RyaXAgdGhlIHZtbGludXguCiBpZmVxICgsJChpbWFnZS15KSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC1ocGMyLmMgYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtbXBjNzQ0OGhwYzIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LWhwYzIuYwpyZW5hbWUgdG8gYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LW1wYzc0NDhocGMyLmMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9hZGRlcjg3NS1yZWRib290LmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9hZGRlcjg3NS1yZWRib290LmR0cwppbmRleCA5MzBiZmIzLi4yOGU5Y2QzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvYWRkZXI4NzUtcmVkYm9vdC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2FkZGVyODc1LXJlZGJvb3QuZHRzCkBAIC0xNTEsNiArMTUxLDcgQEAKIAkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NzUtYnJnIiwKIAkJCQkgICAgICAgICAgICAgImZzbCxjcG0xLWJyZyIsCiAJCQkJICAgICAgICAgICAgICJmc2wsY3BtLWJyZyI7CisJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDUwMDAwMDAwPjsKIAkJCQlyZWcgPSA8MHg5ZjAgMHgxMD47CiAJCQl9OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvYWRkZXI4NzUtdWJvb3QuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2FkZGVyODc1LXVib290LmR0cwppbmRleCAwMTk3MjQyLi41NGZiNjBlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvYWRkZXI4NzUtdWJvb3QuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9hZGRlcjg3NS11Ym9vdC5kdHMKQEAgLTE1MCw2ICsxNTAsNyBAQAogCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg3NS1icmciLAogCQkJCSAgICAgICAgICAgICAiZnNsLGNwbTEtYnJnIiwKIAkJCQkgICAgICAgICAgICAgImZzbCxjcG0tYnJnIjsKKwkJCQljbG9jay1mcmVxdWVuY3kgPSA8NTAwMDAwMDA+OwogCQkJCXJlZyA9IDwweDlmMCAweDEwPjsKIAkJCX07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM1MTIxYWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM1MTIxYWRzLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGFkN2IyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzUxMjFhZHMuZHRzCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogTVBDNTEyMUUgTURTIERldmljZSBUcmVlIFNvdXJjZQorICoKKyAqIENvcHlyaWdodCAyMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKy9kdHMtdjEvOworCisvIHsKKwltb2RlbCA9ICJtcGM1MTIxYWRzIjsKKwljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxYWRzIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJUG93ZXJQQyw1MTIxQDAgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwwPjsKKwkJCWQtY2FjaGUtbGluZS1zaXplID0gPDB4MjA+OwkvLyAzMiBieXRlcworCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MHgyMD47CS8vIDMyIGJ5dGVzCisJCQlkLWNhY2hlLXNpemUgPSA8MHg4MDAwPjsJLy8gTDEsIDMySworCQkJaS1jYWNoZS1zaXplID0gPDB4ODAwMD47CS8vIEwxLCAzMksKKwkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDw0OTUwMDAwMD47Ly8gNDkuNSBNSHogKGNzYi80KQorCQkJYnVzLWZyZXF1ZW5jeSA9IDwxOTgwMDAwMDA+OwkvLyAxOTggTUh6IGNzYiBidXMKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwzOTYwMDAwMDA+OwkvLyAzOTYgTUh6IHBwYyBjb3JlCisJCX07CisJfTsKKworCW1lbW9yeSB7CisJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CisJCXJlZyA9IDwweDAwMDAwMDAwIDB4MTAwMDAwMDA+OwkvLyAyNTZNQiBhdCAwCisJfTsKKworCWxvY2FsYnVzQDgwMDAwMDIwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMWFkcy1sb2NhbGJ1cyI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJcmVnID0gPDB4ODAwMDAwMjAgMHg0MD47CisKKwkJcmFuZ2VzID0gPDB4MCAweDAgMHhmYzAwMDAwMCAweDA0MDAwMDAwCisJCQkgIDB4MiAweDAgMHg4MjAwMDAwMCAweDAwMDA4MDAwPjsKKworCQlmbGFzaEAwLDAgeworCQkJY29tcGF0aWJsZSA9ICJjZmktZmxhc2giOworCQkJcmVnID0gPDAgMHgwIDB4NDAwMDAwMD47CisJCQliYW5rLXdpZHRoID0gPDQ+OworCQkJZGV2aWNlLXdpZHRoID0gPDE+OworCQl9OworCisJCWJvYXJkLWNvbnRyb2xAMiwwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjFhZHMtY3BsZCI7CisJCQlyZWcgPSA8MHgyIDB4MCAweDgwMDA+OworCQl9OworCX07CisKKwlzb2NAODAwMDAwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLWltbXIiOworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCXJhbmdlcyA9IDwweDAgMHg4MDAwMDAwMCAweDQwMDAwMD47CisJCXJlZyA9IDwweDgwMDAwMDAwIDB4NDAwMDAwPjsKKwkJYnVzLWZyZXF1ZW5jeSA9IDw2NjAwMDAwMD47CS8vIDY2IE1IeiBpcHMgYnVzCisKKworCQkvLyBJUElDCisJCS8vIGludGVycnVwdHMgY2VsbCA9IDxpbnRyICMsIHNlbnNlPgorCQkvLyBzZW5zZSB2YWx1ZXMgbWF0Y2ggbGludXggSU9SRVNPVVJDRV9JUlFfKiBkZWZpbmVzOgorCQkvLyBzZW5zZSA9PSA4OiBMZXZlbCwgbG93IGFzc2VydGlvbgorCQkvLyBzZW5zZSA9PSAyOiBFZGdlLCBoaWdoLXRvLWxvdyBjaGFuZ2UKKwkJLy8KKwkJaXBpYzogaW50ZXJydXB0LWNvbnRyb2xsZXJAYzAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzUxMjEtaXBpYyIsICJmc2wsaXBpYyI7CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwkJCXJlZyA9IDwweGMwMCAweDEwMD47CisJCX07CisKKwkJLy8gNTEyeCBQU0NzIGFyZSBub3QgNTJ4eCBQU0NzIGNvbXBhdGlibGUKKwkJLy8gUFNDMyBzZXJpYWwgcG9ydCBBIGFrYSB0dHlQU0MwCisJCXNlcmlhbEAxMTMwMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMS1wc2MtdWFydCI7CisJCQkvLyBMb2dpY2FsIHBvcnQgYXNzaWdubWVudCBuZWVkZWQgdW50aWwgZHJpdmVyCisJCQkvLyBsZWFybnMgdG8gdXNlIGFsaWFzZXMKKwkJCXBvcnQtbnVtYmVyID0gPDA+OworCQkJY2VsbC1pbmRleCA9IDwzPjsKKwkJCXJlZyA9IDwweDExMzAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MHgyOCAweDg+OyAvLyBhY3R1YWxseSB0aGUgZmlmbyBpcnEKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8ICZpcGljID47CisJCX07CisKKwkJLy8gUFNDNCBzZXJpYWwgcG9ydCBCIGFrYSB0dHlQU0MxCisJCXNlcmlhbEAxMTQwMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMS1wc2MtdWFydCI7CisJCQkvLyBMb2dpY2FsIHBvcnQgYXNzaWdubWVudCBuZWVkZWQgdW50aWwgZHJpdmVyCisJCQkvLyBsZWFybnMgdG8gdXNlIGFsaWFzZXMKKwkJCXBvcnQtbnVtYmVyID0gPDE+OworCQkJY2VsbC1pbmRleCA9IDw0PjsKKwkJCXJlZyA9IDwweDExNDAwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8MHgyOCAweDg+OyAvLyBhY3R1YWxseSB0aGUgZmlmbyBpcnEKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8ICZpcGljID47CisJCX07CisKKwkJcHNjc2ZpZm9AMTFmMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMS1wc2MtZmlmbyI7CisJCQlyZWcgPSA8MHgxMWYwMCAweDEwMD47CisJCQlpbnRlcnJ1cHRzID0gPDB4MjggMHg4PjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8ICZpcGljID47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMxM2VyZGIuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMTNlcmRiLmR0cwppbmRleCAyZDY2NTNmLi5lMWYwZGNhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMxM2VyZGIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzEzZXJkYi5kdHMKQEAgLTExOCw2ICsxMTgsMTAgQEAKIAkJCWludGVycnVwdHMgPSA8MTQgMHg4PjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwogCQkJZGZzcnI7CisJCQlydGNANjggeworCQkJCWNvbXBhdGlibGUgPSAiZGFsbGFzLGRzMTMzOSI7CisJCQkJcmVnID0gPDB4Njg+OworCQkJfTsKIAkJfTsKIAogCQlpMmNAMzEwMCB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMxNWVyZGIuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMTVlcmRiLmR0cwppbmRleCBiNTgyMDMyLi5kN2ExZWNlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMxNWVyZGIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzE1ZXJkYi5kdHMKQEAgLTk2LDcgKzk2LDcgQEAKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDE+OwogCQlkZXZpY2VfdHlwZSA9ICJzb2MiOwotCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCQljb21wYXRpYmxlID0gImZzbCxtcGM4MzE1LWltbXIiLCAic2ltcGxlLWJ1cyI7CiAJCXJhbmdlcyA9IDwwIDB4ZTAwMDAwMDAgMHgwMDEwMDAwMD47CiAJCXJlZyA9IDwweGUwMDAwMDAwIDB4MDAwMDAyMDA+OwogCQlidXMtZnJlcXVlbmN5ID0gPDA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNHhfbWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzR4X21kcy5kdHMKaW5kZXggNzQ4MGVkYS4uMDE5OWM1YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNHhfbWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM0eF9tZHMuZHRzCkBAIC0zMzIsNyArMzMyLDcgQEAKIAkJCQkgMHhjMDAwIDB4MCAweDAgMHgzICZpcGljIDIzIDB4OAogCQkJCSAweGMwMDAgMHgwIDB4MCAweDQgJmlwaWMgMjAgMHg4PjsKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47Ci0JCWludGVycnVwdHMgPSA8NjYgMHg4PjsKKwkJaW50ZXJydXB0cyA9IDw2NyAweDg+OwogCQlidXMtcmFuZ2UgPSA8MCAwPjsKIAkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMHgwIDB4YjAwMDAwMDAgMHhiMDAwMDAwMCAweDAgMHgxMDAwMDAwMAogCQkJICAweDQyMDAwMDAwIDB4MCAweGEwMDAwMDAwIDB4YTAwMDAwMDAgMHgwIDB4MTAwMDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTcyZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NzJkcy5kdHMKaW5kZXggODEzYzI1OS4uZGIzNzIxNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NzJkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NzJkcy5kdHMKQEAgLTQyLDYgKzQyLDE4IEBACiAJCQlidXMtZnJlcXVlbmN5ID0gPDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogCQl9OworCisJCVBvd2VyUEMsODU3MkAxIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MT47CisJCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CS8vIDMyIGJ5dGVzCisJCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwyMD47CS8vIDMyIGJ5dGVzCisJCQlkLWNhY2hlLXNpemUgPSA8ODAwMD47CQkvLyBMMSwgMzJLCisJCQlpLWNhY2hlLXNpemUgPSA8ODAwMD47CQkvLyBMMSwgMzJLCisJCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MD47CisJCQlidXMtZnJlcXVlbmN5ID0gPDA+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCQl9OwogCX07CiAKIAltZW1vcnkgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg4NWFkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODg1YWRzLmR0cwppbmRleCA4ODQ4ZTYzLi5kODRhMDEyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODg1YWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODg1YWRzLmR0cwpAQCAtMTY2LDYgKzE2Niw3IEBACiAJCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODg1LWJyZyIsCiAJCQkJICAgICAgICAgICAgICJmc2wsY3BtMS1icmciLAogCQkJCSAgICAgICAgICAgICAiZnNsLGNwbS1icmciOworCQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKIAkJCQlyZWcgPSA8OWYwIDEwPjsKIAkJCX07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9zZXF1b2lhLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9zZXF1b2lhLmR0cwppbmRleCBkOTA0NmMxLi41YzEzZDQ2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc2VxdW9pYS5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3NlcXVvaWEuZHRzCkBAIC0xMzgsNiArMTM4LDE0IEBACiAJCQlpbnRlcnJ1cHRzID0gPDE1IDg+OwogCQl9OwogCisJCVVTQjA6IGVoY2lAZTAwMDAzMDAgeworCQkJY29tcGF0aWJsZSA9ICJpYm0sdXNiLWVoY2ktNDQwZXB4IiwgInVzYi1laGNpIjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JlVJQzA+OworCQkJaW50ZXJydXB0cyA9IDwxYSA0PjsKKwkJCXJlZyA9IDwwIGUwMDAwMzAwIDkwIDAgZTAwMDAzOTAgNzA+OworCQkJYmlnLWVuZGlhbjsKKwkJfTsKKwogCQlQT0IwOiBvcGIgewogCQkgIAljb21wYXRpYmxlID0gImlibSxvcGItNDQwZXB4IiwgImlibSxvcGIiOwogCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc3RvcmNlbnRlci5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc3RvcmNlbnRlci5kdHMKaW5kZXggMjIwNDg3NC4uNTg5MzgxNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3N0b3JjZW50ZXIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9zdG9yY2VudGVyLmR0cwpAQCAtMTUsNyArMTUsNyBAQAogCiAvIHsKIAltb2RlbCA9ICJTdG9yQ2VudGVyIjsKLQljb21wYXRpYmxlID0gInN0b3JjZW50ZXIiOworCWNvbXBhdGlibGUgPSAiaW9tZWdhLHN0b3JjZW50ZXIiOwogCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCSNzaXplLWNlbGxzID0gPDE+OwogCkBAIC02MiwxMiArNjIsMTIgQEAKIAkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKIAkJCXJlZyA9IDwweDMwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDw1IDI+OworCQkJaW50ZXJydXB0cyA9IDwxNyAyPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCiAJCQlydGNANjggewogCQkJCWNvbXBhdGlibGUgPSAiZGFsbGFzLGRzMTMzNyI7Ci0JCQkJcmVnID0gPDY4PjsKKwkJCQlyZWcgPSA8MHg2OD47CiAJCQl9OwogCQl9OwogCkBAIC03OCw3ICs3OCw3IEBACiAJCQlyZWcgPSA8MHg0NTAwIDB4MjA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDk3NTUzODAwPjsgLyogSHogKi8KIAkJCWN1cnJlbnQtc3BlZWQgPSA8MTE1MjAwPjsKLQkJCWludGVycnVwdHMgPSA8OSAyPjsKKwkJCWludGVycnVwdHMgPSA8MjUgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIApAQCAtODksNyArODksNyBAQAogCQkJcmVnID0gPDB4NDYwMCAweDIwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDw5NzU1MzgwMD47IC8qIEh6ICovCiAJCQljdXJyZW50LXNwZWVkID0gPDk2MDA+OwotCQkJaW50ZXJydXB0cyA9IDwxMCAyPjsKKwkJCWludGVycnVwdHMgPSA8MjYgMj47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJfTsKIApAQCAtMTM2LDYgKzEzNiw2IEBACiAJfTsKIAogCWNob3NlbiB7Ci0JCWxpbnV4LHN0ZG91dC1wYXRoID0gIi9zb2Mvc2VyaWFsQDQ1MDAiOworCQlsaW51eCxzdGRvdXQtcGF0aCA9ICZzZXJpYWwwOwogCX07CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvd3JhcHBlciBiL2FyY2gvcG93ZXJwYy9ib290L3dyYXBwZXIKaW5kZXggNzYzYTBjNC4uYzMxNzgxNSAxMDA3NTUKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3Qvd3JhcHBlcgorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC93cmFwcGVyCkBAIC0xNTgsNiArMTU4LDI5IEBACiBjdWJvb3QqKQogICAgIGJpbmFyeT15CiAgICAgZ3ppcD0KKyAgICBjYXNlICIkcGxhdGZvcm0iIGluCisgICAgKi1tcGM4ODVhZHN8Ki1hZGRlcjg3NSp8Ki1lcDg4eGMpCisgICAgICAgIHBsYXRmb3Jtbz0kb2JqZWN0L2N1Ym9vdC04eHgubworICAgICAgICA7OworICAgICo1MjAwKnwqLW1vdGlvbnBybykKKyAgICAgICAgcGxhdGZvcm1vPSRvYmplY3QvY3Vib290LTUyeHgubworICAgICAgICA7OworICAgICotcHEyZmFkc3wqLWVwODI0OGV8Ki1tcGM4MjcyKnwqLXN0b3JjZW50ZXIpCisgICAgICAgIHBsYXRmb3Jtbz0kb2JqZWN0L2N1Ym9vdC1wcTIubworICAgICAgICA7OworICAgICotbXBjODI0KikKKyAgICAgICAgcGxhdGZvcm1vPSRvYmplY3QvY3Vib290LTgyNHgubworICAgICAgICA7OworICAgICotbXBjODMqKQorICAgICAgICBwbGF0Zm9ybW89JG9iamVjdC9jdWJvb3QtODN4eC5vCisgICAgICAgIDs7CisgICAgKi10cW04NTQxfCotbXBjODU2MCp8Ki10cW04NTYwfCotdHFtODU1NSopCisgICAgICAgIHBsYXRmb3Jtbz0kb2JqZWN0L2N1Ym9vdC04NXh4LWNwbTIubworICAgICAgICA7OworICAgICotbXBjODUqKQorICAgICAgICBwbGF0Zm9ybW89JG9iamVjdC9jdWJvb3QtODV4eC5vCisgICAgICAgIDs7CisgICAgZXNhYwogICAgIDs7CiBwczMpCiAgICAgcGxhdGZvcm1vPSIkb2JqZWN0L3BzMy1oZWFkLm8gJG9iamVjdC9wczMtaHZjYWxsLm8gJG9iamVjdC9wczMubyIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzgzeHhfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODN4eF9kZWZjb25maWcKaW5kZXggMzFiZGJmMy4uYTk4MDdmMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODN4eF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODN4eF9kZWZjb25maWcKQEAgLTE4Niw3ICsxODYsNyBAQAogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CiBDT05GSUdfQklORk1UX0VMRj15CiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVRIX0VNVUxBVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTUFUSF9FTVVMQVRJT049eQogQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHPXkKIENPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKIENPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CkBAIC00MTYsMTQgKzQxNiwxNCBAQAogIyBNSUkgUEhZIGRldmljZSBkcml2ZXJzCiAjCiBDT05GSUdfTUFSVkVMTF9QSFk9eQotIyBDT05GSUdfREFWSUNPTV9QSFkgaXMgbm90IHNldAorQ09ORklHX0RBVklDT01fUEhZPXkKICMgQ09ORklHX1FTRU1JX1BIWSBpcyBub3Qgc2V0CiAjIENPTkZJR19MWFRfUEhZIGlzIG5vdCBzZXQKICMgQ09ORklHX0NJQ0FEQV9QSFkgaXMgbm90IHNldAotIyBDT05GSUdfVklURVNTRV9QSFkgaXMgbm90IHNldAorQ09ORklHX1ZJVEVTU0VfUEhZPXkKICMgQ09ORklHX1NNU0NfUEhZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JST0FEQ09NX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQ1BMVVNfUEhZIGlzIG5vdCBzZXQKK0NPTkZJR19JQ1BMVVNfUEhZPXkKICMgQ09ORklHX0ZJWEVEX1BIWSBpcyBub3Qgc2V0CiAjIENPTkZJR19NRElPX0JJVEJBTkcgaXMgbm90IHNldAogQ09ORklHX05FVF9FVEhFUk5FVD15CkBAIC00MzYsNyArNDM2LDcgQEAKIENPTkZJR19ORVRERVZfMTAwMD15CiBDT05GSUdfR0lBTkZBUj15CiAjIENPTkZJR19HRkFSX05BUEkgaXMgbm90IHNldAotIyBDT05GSUdfVUNDX0dFVEggaXMgbm90IHNldAorQ09ORklHX1VDQ19HRVRIPXkKIENPTkZJR19ORVRERVZfMTAwMDA9eQogCiAjCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQppbmRleCA1OGRiZmVmLi4wNjYyYWU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKQEAgLTIsNiArMiw4IEBACiAjIE1ha2VmaWxlIGZvciB0aGUgbGludXgga2VybmVsLgogIwogCitDRkxBR1NfcHRyYWNlLm8JCSs9IC1EVVRTX01BQ0hJTkU9JyIkKFVUU19NQUNISU5FKSInCisKIGlmZXEgKCQoQ09ORklHX1BQQzY0KSx5KQogQ0ZMQUdTX3Byb21faW5pdC5vCSs9IC1tbm8tbWluaW1hbC10b2MKIGVuZGlmCkBAIC0xNSw3ICsxNyw3IEBACiAJCQkJICAgaW5pdF90YXNrLm8gcHJvY2Vzcy5vIHN5c3RibC5vIGlkbGUubyBcCiAJCQkJICAgc2lnbmFsLm8KIG9iai15CQkJCSs9IHZkc28zMi8KLW9iai0kKENPTkZJR19QUEM2NCkJCSs9IHNldHVwXzY0Lm8gYmluZm10X2VsZjMyLm8gc3lzX3BwYzMyLm8gXAorb2JqLSQoQ09ORklHX1BQQzY0KQkJKz0gc2V0dXBfNjQubyBzeXNfcHBjMzIubyBcCiAJCQkJICAgc2lnbmFsXzY0Lm8gcHRyYWNlMzIubyBcCiAJCQkJICAgcGFjYS5vIGNwdV9zZXR1cF9wcGM5NzAubyBcCiAJCQkJICAgY3B1X3NldHVwX3BhNnQubyBcCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggZWQwODNmZS4uNGI3NDljNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CiAjaWZkZWYgQ09ORklHX1BQQzY0CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KQEAgLTMxMiw3ICszMTMsNyBAQAogCURFRklORShDTE9DS19SRUFMVElNRSwgQ0xPQ0tfUkVBTFRJTUUpOwogCURFRklORShDTE9DS19NT05PVE9OSUMsIENMT0NLX01PTk9UT05JQyk7CiAJREVGSU5FKE5TRUNfUEVSX1NFQywgTlNFQ19QRVJfU0VDKTsKLQlERUZJTkUoQ0xPQ0tfUkVBTFRJTUVfUkVTLCBUSUNLX05TRUMpOworCURFRklORShDTE9DS19SRUFMVElNRV9SRVMsIE1PTk9UT05JQ19SRVNfTlNFQyk7CiAKICNpZmRlZiBDT05GSUdfQlVHCiAJREVGSU5FKEJVR19FTlRSWV9TSVpFLCBzaXplb2Yoc3RydWN0IGJ1Z19lbnRyeSkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9iaW5mbXRfZWxmMzIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYmluZm10X2VsZjMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNDVkNzcuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9iaW5mbXRfZWxmMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBiaW5mbXRfZWxmMzIuYzogU3VwcG9ydCAzMi1iaXQgUFBDIEVMRiBiaW5hcmllcyBvbiBQb3dlcjMgYW5kIGZvbGxvd29ucy4KLSAqIGJhc2VkIG9uIHRoZSBTUEFSQzY0IHZlcnNpb24uCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRGF2aWQgUy4gTWlsbGVyCShkYXZlbUByZWRoYXQuY29tKQotICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEpha3ViIEplbGluZWsJKGpqQHVsdHJhLmxpbnV4LmN6KQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMCwyMDAxIEtlbiBBYWtlciAoa2RhYWtlckByY2hsYW5kLnZuZXQuaWJtLmNvbSksIElCTSBDb3JwCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgQW50b24gQmxhbmNoYXJkIChhbnRvbkBhdS5pYm0uY29tKSwgSUJNCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgotI2luY2x1ZGUgPGxpbnV4L2VsZmNvcmUtY29tcGF0Lmg+Ci0KLSN1bmRlZglFTEZfQVJDSAotI3VuZGVmCUVMRl9DTEFTUwotI2RlZmluZSBFTEZfQ0xBU1MJRUxGQ0xBU1MzMgotI2RlZmluZSBFTEZfQVJDSAlFTV9QUEMKLQotI3VuZGVmCWVsZmhkcgotI3VuZGVmCWVsZl9waGRyCi0jdW5kZWYJZWxmX25vdGUKLSN1bmRlZgllbGZfYWRkcl90Ci0jZGVmaW5lIGVsZmhkcgkJZWxmMzJfaGRyCi0jZGVmaW5lIGVsZl9waGRyCWVsZjMyX3BoZHIKLSNkZWZpbmUgZWxmX25vdGUJZWxmMzJfbm90ZQotI2RlZmluZSBlbGZfYWRkcl90CUVsZjMyX09mZgotCi0jZGVmaW5lIGVsZl9wcnN0YXR1cwljb21wYXRfZWxmX3Byc3RhdHVzCi0jZGVmaW5lIGVsZl9wcnBzaW5mbwljb21wYXRfZWxmX3BycHNpbmZvCi0KLSNkZWZpbmUgZWxmX2NvcmVfY29weV9yZWdzIGNvbXBhdF9lbGZfY29yZV9jb3B5X3JlZ3MKLXN0YXRpYyBpbmxpbmUgdm9pZCBjb21wYXRfZWxmX2NvcmVfY29weV9yZWdzKGNvbXBhdF9lbGZfZ3JlZ3NldF90ICplbGZfcmVncywKLQkJCQkJICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlQUENfRUxGX0NPUkVfQ09QWV9SRUdTKCgqZWxmX3JlZ3MpLCByZWdzKTsKLX0KLQotI2RlZmluZSBlbGZfY29yZV9jb3B5X3Rhc2tfcmVncyBjb21wYXRfZWxmX2NvcmVfY29weV90YXNrX3JlZ3MKLXN0YXRpYyBpbnQgY29tcGF0X2VsZl9jb3JlX2NvcHlfdGFza19yZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAotCQkJCQkgIGNvbXBhdF9lbGZfZ3JlZ3NldF90ICplbGZfcmVncykKLXsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRzay0+dGhyZWFkLnJlZ3M7Ci0JaWYgKHJlZ3MpCi0JCWNvbXBhdF9lbGZfY29yZV9jb3B5X3JlZ3MoZWxmX3JlZ3MsIHJlZ3MpOwotCXJldHVybiAxOwotfQotCi0jaW5jbHVkZSA8bGludXgvdGltZS5oPgotCi0jdW5kZWYgY3B1dGltZV90b190aW1ldmFsCi0jZGVmaW5lIGNwdXRpbWVfdG9fdGltZXZhbCBjcHV0aW1lX3RvX2NvbXBhdF90aW1ldmFsCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi1jcHV0aW1lX3RvX2NvbXBhdF90aW1ldmFsKGNvbnN0IGNwdXRpbWVfdCBjcHV0aW1lLCBzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgKnZhbHVlKQotewotCXVuc2lnbmVkIGxvbmcgamlmZmllcyA9IGNwdXRpbWVfdG9famlmZmllcyhjcHV0aW1lKTsKLQl2YWx1ZS0+dHZfdXNlYyA9IChqaWZmaWVzICUgSFopICogKDEwMDAwMDBMIC8gSFopOwotCXZhbHVlLT50dl9zZWMgPSBqaWZmaWVzIC8gSFo7Ci19Ci0KLSNkZWZpbmUgaW5pdF9lbGZfYmluZm10IGluaXRfZWxmMzJfYmluZm10Ci0KLSNpbmNsdWRlICIuLi8uLi8uLi9mcy9iaW5mbXRfZWxmLmMiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKaW5kZXggYTRjMjc3MS4uMmE4ZjVjYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYwpAQCAtOTU5LDYgKzk1OSw5IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjAzLAorCQkubnVtX3BtY3MJCT0gNCwKKwkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYy9lMzAwIiwKKwkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0ZTTF9FTUIsCiAJCS5wbGF0Zm9ybQkJPSAicHBjNjAzIiwKIAl9LAogCXsJLyogZTMwMGM0IChlMzAwYzEsIHBsdXMgb25lIElVKSAqLwpAQCAtOTcxLDYgKzk3NCw5IEBACiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjAzLAogCQkubWFjaGluZV9jaGVjawkJPSBtYWNoaW5lX2NoZWNrX2dlbmVyaWMsCisJCS5udW1fcG1jcwkJPSA0LAorCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjL2UzMDAiLAorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfRlNMX0VNQiwKIAkJLnBsYXRmb3JtCQk9ICJwcGM2MDMiLAogCX0sCiAJewkvKiBkZWZhdWx0IG1hdGNoLCB3ZSBhc3N1bWUgc3BsaXQgSS9EIGNhY2hlICYgVEIgKG5vbi02MDEpLi4uICovCkBAIC0xNDM1LDcgKzE0NDEsNyBAQAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYy9lNTAwIiwKLQkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0JPT0tFLAorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfRlNMX0VNQiwKIAkJLm1hY2hpbmVfY2hlY2sJCT0gbWFjaGluZV9jaGVja19lNTAwLAogCQkucGxhdGZvcm0JCT0gInBwYzg1NDAiLAogCX0sCkBAIC0xNDUzLDcgKzE0NTksNyBAQAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYy9lNTAwIiwKLQkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX0JPT0tFLAorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfRlNMX0VNQiwKIAkJLm1hY2hpbmVfY2hlY2sJCT0gbWFjaGluZV9jaGVja19lNTAwLAogCQkucGxhdGZvcm0JCT0gInBwYzg1NDgiLAogCX0sCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2xlZ2FjeV9zZXJpYWwuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbGVnYWN5X3NlcmlhbC5jCmluZGV4IDc2Yjg2MmIuLjYxZGQxNzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbGVnYWN5X3NlcmlhbC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbGVnYWN5X3NlcmlhbC5jCkBAIC0zNiw3ICszNiw4IEBACiBzdGF0aWMgc3RydWN0IF9faW5pdGRhdGEgb2ZfZGV2aWNlX2lkIHBhcmVudHNbXSA9IHsKIAl7LnR5cGUgPSAic29jIix9LAogCXsudHlwZSA9ICJ0c2ktYnJpZGdlIix9LAotCXsudHlwZSA9ICJvcGIiLCAuY29tcGF0aWJsZSA9ICJpYm0sb3BiIix9LAorCXsudHlwZSA9ICJvcGIiLCB9LAorCXsuY29tcGF0aWJsZSA9ICJpYm0sb3BiIix9LAogCXsuY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIix9LAogCXsuY29tcGF0aWJsZSA9ICJ3cnMsZXBsZC1sb2NhbGJ1cyIsfSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BtYy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wbWMuYwppbmRleCBlYTA0ZTBhLi4wNTE2ZTJkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BtYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcG1jLmMKQEAgLTI2LDcgKzI2LDcgQEAKIAogc3RhdGljIHZvaWQgZHVtbXlfcGVyZihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiBkZWZpbmVkKENPTkZJR19GU0xfQk9PS0UpICYmICFkZWZpbmVkKENPTkZJR19FMjAwKQorI2lmIGRlZmluZWQoQ09ORklHX0ZTTF9FTUJfUEVSRk1PTikKIAltdHBtcihQTVJOX1BNR0MwLCBtZnBtcihQTVJOX1BNR0MwKSAmIH5QTUdDMF9QTUlFKTsKICNlbGlmIGRlZmluZWQoQ09ORklHX1BQQzY0KSB8fCBkZWZpbmVkKENPTkZJR182eHgpCiAJaWYgKGN1cl9jcHVfc3BlYy0+cG1jX3R5cGUgPT0gUFBDX1BNQ19JQk0pCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UuYwppbmRleCA4YjA1NmQyLi43NjczZTk4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLmMKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3NldC5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgpAQCAtNTgsMjAgKzYwLDM4IEBACiAjZGVmaW5lIFBUX01BWF9QVVRfUkVHCVBUX0NDUgogI2VuZGlmCiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF91c2VyX21zcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJcmV0dXJuIHRhc2stPnRocmVhZC5yZWdzLT5tc3IgfCB0YXNrLT50aHJlYWQuZnBleGNfbW9kZTsKK30KKworc3RhdGljIGludCBzZXRfdXNlcl9tc3Ioc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nIG1zcikKK3sKKwl0YXNrLT50aHJlYWQucmVncy0+bXNyICY9IH5NU1JfREVCVUdDSEFOR0U7CisJdGFzay0+dGhyZWFkLnJlZ3MtPm1zciB8PSBtc3IgJiBNU1JfREVCVUdDSEFOR0U7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXZSBwcmV2ZW50IG11Y2tpbmcgYXJvdW5kIHdpdGggdGhlIHJlc2VydmVkIGFyZWEgb2YgdHJhcAorICogd2hpY2ggYXJlIHVzZWQgaW50ZXJuYWxseSBieSB0aGUga2VybmVsLgorICovCitzdGF0aWMgaW50IHNldF91c2VyX3RyYXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nIHRyYXApCit7CisJdGFzay0+dGhyZWFkLnJlZ3MtPnRyYXAgPSB0cmFwICYgMHhmZmYwOworCXJldHVybiAwOworfQorCiAvKgogICogR2V0IGNvbnRlbnRzIG9mIHJlZ2lzdGVyIFJFR05PIGluIHRhc2sgVEFTSy4KICAqLwogdW5zaWduZWQgbG9uZyBwdHJhY2VfZ2V0X3JlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCByZWdubykKIHsKLQl1bnNpZ25lZCBsb25nIHRtcCA9IDA7Ci0KIAlpZiAodGFzay0+dGhyZWFkLnJlZ3MgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU87CiAKLQlpZiAocmVnbm8gPT0gUFRfTVNSKSB7Ci0JCXRtcCA9ICgodW5zaWduZWQgbG9uZyAqKXRhc2stPnRocmVhZC5yZWdzKVtQVF9NU1JdOwotCQlyZXR1cm4gdG1wIHwgdGFzay0+dGhyZWFkLmZwZXhjX21vZGU7Ci0JfQorCWlmIChyZWdubyA9PSBQVF9NU1IpCisJCXJldHVybiBnZXRfdXNlcl9tc3IodGFzayk7CiAKIAlpZiAocmVnbm8gPCAoc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSkpCiAJCXJldHVybiAoKHVuc2lnbmVkIGxvbmcgKil0YXNrLT50aHJlYWQucmVncylbcmVnbm9dOwpAQCAtODcsNDAgKzEwNywxMzQgQEAKIAlpZiAodGFzay0+dGhyZWFkLnJlZ3MgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU87CiAKLQlpZiAocmVnbm8gPD0gUFRfTUFYX1BVVF9SRUcgfHwgcmVnbm8gPT0gUFRfVFJBUCkgewotCQlpZiAocmVnbm8gPT0gUFRfTVNSKQotCQkJZGF0YSA9IChkYXRhICYgTVNSX0RFQlVHQ0hBTkdFKQotCQkJCXwgKHRhc2stPnRocmVhZC5yZWdzLT5tc3IgJiB+TVNSX0RFQlVHQ0hBTkdFKTsKLQkJLyogV2UgcHJldmVudCBtdWNraW5nIGFyb3VuZCB3aXRoIHRoZSByZXNlcnZlZCBhcmVhIG9mIHRyYXAKLQkJICogd2hpY2ggYXJlIHVzZWQgaW50ZXJuYWxseSBieSB0aGUga2VybmVsCi0JCSAqLwotCQlpZiAocmVnbm8gPT0gUFRfVFJBUCkKLQkJCWRhdGEgJj0gMHhmZmYwOworCWlmIChyZWdubyA9PSBQVF9NU1IpCisJCXJldHVybiBzZXRfdXNlcl9tc3IodGFzaywgZGF0YSk7CisJaWYgKHJlZ25vID09IFBUX1RSQVApCisJCXJldHVybiBzZXRfdXNlcl90cmFwKHRhc2ssIGRhdGEpOworCisJaWYgKHJlZ25vIDw9IFBUX01BWF9QVVRfUkVHKSB7CiAJCSgodW5zaWduZWQgbG9uZyAqKXRhc2stPnRocmVhZC5yZWdzKVtyZWdub10gPSBkYXRhOwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIC1FSU87CiB9CiAKLQotc3RhdGljIGludCBnZXRfZnByZWdzKHZvaWQgX191c2VyICpkYXRhLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCi0JCSAgICAgIGludCBoYXNfZnBzY3IpCitzdGF0aWMgaW50IGdwcl9nZXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXJnZXQsIGNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldCAqcmVnc2V0LAorCQkgICB1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCisJCSAgIHZvaWQgKmtidWYsIHZvaWQgX191c2VyICp1YnVmKQogewotCXVuc2lnbmVkIGludCBjb3VudCA9IGhhc19mcHNjciA/IDMzIDogMzI7CisJaW50IHJldDsKIAotCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgdGFzay0+dGhyZWFkLmZwciwgY291bnQgKiBzaXplb2YoZG91YmxlKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCXJldHVybiAwOworCWlmICh0YXJnZXQtPnRocmVhZC5yZWdzID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCisJQ0hFQ0tfRlVMTF9SRUdTKHRhcmdldC0+dGhyZWFkLnJlZ3MpOworCisJcmV0ID0gdXNlcl9yZWdzZXRfY29weW91dCgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkgIHRhcmdldC0+dGhyZWFkLnJlZ3MsCisJCQkJICAwLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgbXNyKSk7CisJaWYgKCFyZXQpIHsKKwkJdW5zaWduZWQgbG9uZyBtc3IgPSBnZXRfdXNlcl9tc3IodGFyZ2V0KTsKKwkJcmV0ID0gdXNlcl9yZWdzZXRfY29weW91dCgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwgJm1zciwKKwkJCQkJICBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgbXNyKSwKKwkJCQkJICBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgbXNyKSArCisJCQkJCSAgc2l6ZW9mKG1zcikpOworCX0KKworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgb3JpZ19ncHIzKSAhPQorCQkgICAgIG9mZnNldG9mKHN0cnVjdCBwdF9yZWdzLCBtc3IpICsgc2l6ZW9mKGxvbmcpKTsKKworCWlmICghcmV0KQorCQlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5b3V0KCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCQkgICZ0YXJnZXQtPnRocmVhZC5yZWdzLT5vcmlnX2dwcjMsCisJCQkJCSAgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIG9yaWdfZ3ByMyksCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7CisJaWYgKCFyZXQpCisJCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlvdXRfemVybygmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcHRfcmVncyksIC0xKTsKKworCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgc2V0X2ZwcmVncyh2b2lkIF9fdXNlciAqZGF0YSwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAotCQkgICAgICBpbnQgaGFzX2Zwc2NyKQorc3RhdGljIGludCBncHJfc2V0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0LCBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXQgKnJlZ3NldCwKKwkJICAgdW5zaWduZWQgaW50IHBvcywgdW5zaWduZWQgaW50IGNvdW50LAorCQkgICBjb25zdCB2b2lkICprYnVmLCBjb25zdCB2b2lkIF9fdXNlciAqdWJ1ZikKIHsKLQl1bnNpZ25lZCBpbnQgY291bnQgPSBoYXNfZnBzY3IgPyAzMyA6IDMyOworCXVuc2lnbmVkIGxvbmcgcmVnOworCWludCByZXQ7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIodGFzay0+dGhyZWFkLmZwciwgZGF0YSwgY291bnQgKiBzaXplb2YoZG91YmxlKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCXJldHVybiAwOworCWlmICh0YXJnZXQtPnRocmVhZC5yZWdzID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCisJQ0hFQ0tfRlVMTF9SRUdTKHRhcmdldC0+dGhyZWFkLnJlZ3MpOworCisJcmV0ID0gdXNlcl9yZWdzZXRfY29weWluKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCSB0YXJnZXQtPnRocmVhZC5yZWdzLAorCQkJCSAwLCBQVF9NU1IgKiBzaXplb2YocmVnKSk7CisKKwlpZiAoIXJldCAmJiBjb3VudCA+IDApIHsKKwkJcmV0ID0gdXNlcl9yZWdzZXRfY29weWluKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLCAmcmVnLAorCQkJCQkgUFRfTVNSICogc2l6ZW9mKHJlZyksCisJCQkJCSAoUFRfTVNSICsgMSkgKiBzaXplb2YocmVnKSk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gc2V0X3VzZXJfbXNyKHRhcmdldCwgcmVnKTsKKwl9CisKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIG9yaWdfZ3ByMykgIT0KKwkJICAgICBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgbXNyKSArIHNpemVvZihsb25nKSk7CisKKwlpZiAoIXJldCkKKwkJcmV0ID0gdXNlcl9yZWdzZXRfY29weWluKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCQkgJnRhcmdldC0+dGhyZWFkLnJlZ3MtPm9yaWdfZ3ByMywKKwkJCQkJIFBUX09SSUdfUjMgKiBzaXplb2YocmVnKSwKKwkJCQkJIChQVF9NQVhfUFVUX1JFRyArIDEpICogc2l6ZW9mKHJlZykpOworCisJaWYgKFBUX01BWF9QVVRfUkVHICsgMSA8IFBUX1RSQVAgJiYgIXJldCkKKwkJcmV0ID0gdXNlcl9yZWdzZXRfY29weWluX2lnbm9yZSgKKwkJCSZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJKFBUX01BWF9QVVRfUkVHICsgMSkgKiBzaXplb2YocmVnKSwKKwkJCVBUX1RSQVAgKiBzaXplb2YocmVnKSk7CisKKwlpZiAoIXJldCAmJiBjb3VudCA+IDApIHsKKwkJcmV0ID0gdXNlcl9yZWdzZXRfY29weWluKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLCAmcmVnLAorCQkJCQkgUFRfVFJBUCAqIHNpemVvZihyZWcpLAorCQkJCQkgKFBUX1RSQVAgKyAxKSAqIHNpemVvZihyZWcpKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBzZXRfdXNlcl90cmFwKHRhcmdldCwgcmVnKTsKKwl9CisKKwlpZiAoIXJldCkKKwkJcmV0ID0gdXNlcl9yZWdzZXRfY29weWluX2lnbm9yZSgKKwkJCSZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJKFBUX1RSQVAgKyAxKSAqIHNpemVvZihyZWcpLCAtMSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZwcl9nZXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXJnZXQsIGNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldCAqcmVnc2V0LAorCQkgICB1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCisJCSAgIHZvaWQgKmtidWYsIHZvaWQgX191c2VyICp1YnVmKQoreworCWZsdXNoX2ZwX3RvX3RocmVhZCh0YXJnZXQpOworCisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfc3RydWN0LCBmcHNjcikgIT0KKwkJICAgICBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCwgZnByWzMyXSkpOworCisJcmV0dXJuIHVzZXJfcmVnc2V0X2NvcHlvdXQoJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJICAgJnRhcmdldC0+dGhyZWFkLmZwciwgMCwgLTEpOworfQorCitzdGF0aWMgaW50IGZwcl9zZXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXJnZXQsIGNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldCAqcmVnc2V0LAorCQkgICB1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCisJCSAgIGNvbnN0IHZvaWQgKmtidWYsIGNvbnN0IHZvaWQgX191c2VyICp1YnVmKQoreworCWZsdXNoX2ZwX3RvX3RocmVhZCh0YXJnZXQpOworCisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfc3RydWN0LCBmcHNjcikgIT0KKwkJICAgICBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCwgZnByWzMyXSkpOworCisJcmV0dXJuIHVzZXJfcmVnc2V0X2NvcHlpbigmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkgICZ0YXJnZXQtPnRocmVhZC5mcHIsIDAsIC0xKTsKIH0KIAogCkBAIC0xMzgsNTYgKzI1Miw3NCBAQAogICogKGNvbWJpbmVkICgzMi0gYW5kIDY0LWJpdCkgZ2RiLgogICovCiAKLS8qCi0gKiBHZXQgY29udGVudHMgb2YgQWx0aVZlYyByZWdpc3RlciBzdGF0ZSBpbiB0YXNrIFRBU0sKLSAqLwotc3RhdGljIGludCBnZXRfdnJyZWdzKHVuc2lnbmVkIGxvbmcgX191c2VyICpkYXRhLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCitzdGF0aWMgaW50IHZyX2FjdGl2ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhcmdldCwKKwkJICAgICBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXQgKnJlZ3NldCkKIHsKLQl1bnNpZ25lZCBsb25nIHJlZ3NpemU7Ci0KLQkvKiBjb3B5IEFsdGlWZWMgcmVnaXN0ZXJzIFZSWzBdIC4uIFZSWzMxXSAqLwotCXJlZ3NpemUgPSAzMiAqIHNpemVvZih2ZWN0b3IxMjgpOwotCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgdGFzay0+dGhyZWFkLnZyLCByZWdzaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JZGF0YSArPSAocmVnc2l6ZSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0KLQkvKiBjb3B5IFZTQ1IgKi8KLQlyZWdzaXplID0gMSAqIHNpemVvZih2ZWN0b3IxMjgpOwotCWlmIChjb3B5X3RvX3VzZXIoZGF0YSwgJnRhc2stPnRocmVhZC52c2NyLCByZWdzaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JZGF0YSArPSAocmVnc2l6ZSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0KLQkvKiBjb3B5IFZSU0FWRSAqLwotCWlmIChwdXRfdXNlcih0YXNrLT50aHJlYWQudnJzYXZlLCAodTMyIF9fdXNlciAqKWRhdGEpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAwOworCWZsdXNoX2FsdGl2ZWNfdG9fdGhyZWFkKHRhcmdldCk7CisJcmV0dXJuIHRhcmdldC0+dGhyZWFkLnVzZWRfdnIgPyByZWdzZXQtPm4gOiAwOwogfQogCi0vKgotICogV3JpdGUgY29udGVudHMgb2YgQWx0aVZlYyByZWdpc3RlciBzdGF0ZSBpbnRvIHRhc2sgVEFTSy4KLSAqLwotc3RhdGljIGludCBzZXRfdnJyZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyBfX3VzZXIgKmRhdGEpCitzdGF0aWMgaW50IHZyX2dldChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhcmdldCwgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0ICpyZWdzZXQsCisJCSAgdW5zaWduZWQgaW50IHBvcywgdW5zaWduZWQgaW50IGNvdW50LAorCQkgIHZvaWQgKmtidWYsIHZvaWQgX191c2VyICp1YnVmKQogewotCXVuc2lnbmVkIGxvbmcgcmVnc2l6ZTsKKwlpbnQgcmV0OwogCi0JLyogY29weSBBbHRpVmVjIHJlZ2lzdGVycyBWUlswXSAuLiBWUlszMV0gKi8KLQlyZWdzaXplID0gMzIgKiBzaXplb2YodmVjdG9yMTI4KTsKLQlpZiAoY29weV9mcm9tX3VzZXIodGFzay0+dGhyZWFkLnZyLCBkYXRhLCByZWdzaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JZGF0YSArPSAocmVnc2l6ZSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJZmx1c2hfYWx0aXZlY190b190aHJlYWQodGFyZ2V0KTsKIAotCS8qIGNvcHkgVlNDUiAqLwotCXJlZ3NpemUgPSAxICogc2l6ZW9mKHZlY3RvcjEyOCk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKCZ0YXNrLT50aHJlYWQudnNjciwgZGF0YSwgcmVnc2l6ZSkpCi0JCXJldHVybiAtRUZBVUxUOwotCWRhdGEgKz0gKHJlZ3NpemUgLyBzaXplb2YodW5zaWduZWQgbG9uZykpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCwgdnNjcikgIT0KKwkJICAgICBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCwgdnJbMzJdKSk7CiAKLQkvKiBjb3B5IFZSU0FWRSAqLwotCWlmIChnZXRfdXNlcih0YXNrLT50aHJlYWQudnJzYXZlLCAodTMyIF9fdXNlciAqKWRhdGEpKQotCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5b3V0KCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCSAgJnRhcmdldC0+dGhyZWFkLnZyLCAwLAorCQkJCSAgMzMgKiBzaXplb2YodmVjdG9yMTI4KSk7CisJaWYgKCFyZXQpIHsKKwkJLyoKKwkJICogQ29weSBvdXQgb25seSB0aGUgbG93LW9yZGVyIHdvcmQgb2YgdnJzYXZlLgorCQkgKi8KKwkJdW5pb24geworCQkJZWxmX3ZycmVnX3QgcmVnOworCQkJdTMyIHdvcmQ7CisJCX0gdnJzYXZlOworCQltZW1zZXQoJnZyc2F2ZSwgMCwgc2l6ZW9mKHZyc2F2ZSkpOworCQl2cnNhdmUud29yZCA9IHRhcmdldC0+dGhyZWFkLnZyc2F2ZTsKKwkJcmV0ID0gdXNlcl9yZWdzZXRfY29weW91dCgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwgJnZyc2F2ZSwKKwkJCQkJICAzMyAqIHNpemVvZih2ZWN0b3IxMjgpLCAtMSk7CisJfQogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2cl9zZXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXJnZXQsIGNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldCAqcmVnc2V0LAorCQkgIHVuc2lnbmVkIGludCBwb3MsIHVuc2lnbmVkIGludCBjb3VudCwKKwkJICBjb25zdCB2b2lkICprYnVmLCBjb25zdCB2b2lkIF9fdXNlciAqdWJ1ZikKK3sKKwlpbnQgcmV0OworCisJZmx1c2hfYWx0aXZlY190b190aHJlYWQodGFyZ2V0KTsKKworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCwgdnNjcikgIT0KKwkJICAgICBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCwgdnJbMzJdKSk7CisKKwlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5aW4oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJICZ0YXJnZXQtPnRocmVhZC52ciwgMCwgMzMgKiBzaXplb2YodmVjdG9yMTI4KSk7CisJaWYgKCFyZXQgJiYgY291bnQgPiAwKSB7CisJCS8qCisJCSAqIFdlIHVzZSBvbmx5IHRoZSBmaXJzdCB3b3JkIG9mIHZyc2F2ZS4KKwkJICovCisJCXVuaW9uIHsKKwkJCWVsZl92cnJlZ190IHJlZzsKKwkJCXUzMiB3b3JkOworCQl9IHZyc2F2ZTsKKwkJbWVtc2V0KCZ2cnNhdmUsIDAsIHNpemVvZih2cnNhdmUpKTsKKwkJdnJzYXZlLndvcmQgPSB0YXJnZXQtPnRocmVhZC52cnNhdmU7CisJCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlpbigmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwgJnZyc2F2ZSwKKwkJCQkJIDMzICogc2l6ZW9mKHZlY3RvcjEyOCksIC0xKTsKKwkJaWYgKCFyZXQpCisJCQl0YXJnZXQtPnRocmVhZC52cnNhdmUgPSB2cnNhdmUud29yZDsKKwl9CisKKwlyZXR1cm4gcmV0OwogfQogI2VuZGlmIC8qIENPTkZJR19BTFRJVkVDICovCiAKQEAgLTIwMyw1OSArMzM1LDI3NSBAQAogICogfQogICovCiAKLS8qCi0gKiBHZXQgY29udGVudHMgb2YgU1BFIHJlZ2lzdGVyIHN0YXRlIGluIHRhc2sgVEFTSy4KLSAqLwotc3RhdGljIGludCBnZXRfZXZycmVncyh1bnNpZ25lZCBsb25nICpkYXRhLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCitzdGF0aWMgaW50IGV2cl9hY3RpdmUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXJnZXQsCisJCSAgICAgIGNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldCAqcmVnc2V0KQogewotCWludCBpOwotCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkYXRhLCAzNSAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JLyogY29weSBTUEVGU0NSICovCi0JaWYgKF9fcHV0X3VzZXIodGFzay0+dGhyZWFkLnNwZWZzY3IsICZkYXRhWzM0XSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JLyogY29weSBTUEUgcmVnaXN0ZXJzIEVWUlswXSAuLiBFVlJbMzFdICovCi0JZm9yIChpID0gMDsgaSA8IDMyOyBpKyssIGRhdGErKykKLQkJaWYgKF9fcHV0X3VzZXIodGFzay0+dGhyZWFkLmV2cltpXSwgZGF0YSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCS8qIGNvcHkgQUNDICovCi0JaWYgKF9fcHV0X3VzZXI2NCh0YXNrLT50aHJlYWQuYWNjLCAodW5zaWduZWQgbG9uZyBsb25nICopZGF0YSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIDA7CisJZmx1c2hfc3BlX3RvX3RocmVhZCh0YXJnZXQpOworCXJldHVybiB0YXJnZXQtPnRocmVhZC51c2VkX3NwZSA/IHJlZ3NldC0+biA6IDA7CiB9CiAKLS8qCi0gKiBXcml0ZSBjb250ZW50cyBvZiBTUEUgcmVnaXN0ZXIgc3RhdGUgaW50byB0YXNrIFRBU0suCi0gKi8KLXN0YXRpYyBpbnQgc2V0X2V2cnJlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICpkYXRhKQorc3RhdGljIGludCBldnJfZ2V0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0LCBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXQgKnJlZ3NldCwKKwkJICAgdW5zaWduZWQgaW50IHBvcywgdW5zaWduZWQgaW50IGNvdW50LAorCQkgICB2b2lkICprYnVmLCB2b2lkIF9fdXNlciAqdWJ1ZikKIHsKLQlpbnQgaTsKKwlpbnQgcmV0OwogCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGRhdGEsIDM1ICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJZmx1c2hfc3BlX3RvX3RocmVhZCh0YXJnZXQpOwogCi0JLyogY29weSBTUEVGU0NSICovCi0JaWYgKF9fZ2V0X3VzZXIodGFzay0+dGhyZWFkLnNwZWZzY3IsICZkYXRhWzM0XSkpCi0JCXJldHVybiAtRUZBVUxUOworCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlvdXQoJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJICAmdGFyZ2V0LT50aHJlYWQuZXZyLAorCQkJCSAgMCwgc2l6ZW9mKHRhcmdldC0+dGhyZWFkLmV2cikpOwogCi0JLyogY29weSBTUEUgcmVnaXN0ZXJzIEVWUlswXSAuLiBFVlJbMzFdICovCi0JZm9yIChpID0gMDsgaSA8IDMyOyBpKyssIGRhdGErKykKLQkJaWYgKF9fZ2V0X3VzZXIodGFzay0+dGhyZWFkLmV2cltpXSwgZGF0YSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkvKiBjb3B5IEFDQyAqLwotCWlmIChfX2dldF91c2VyNjQodGFzay0+dGhyZWFkLmFjYywgKHVuc2lnbmVkIGxvbmcgbG9uZyopZGF0YSkpCi0JCXJldHVybiAtRUZBVUxUOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCwgYWNjKSArIHNpemVvZih1NjQpICE9CisJCSAgICAgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9zdHJ1Y3QsIHNwZWZzY3IpKTsKIAotCXJldHVybiAwOworCWlmICghcmV0KQorCQlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5b3V0KCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCQkgICZ0YXJnZXQtPnRocmVhZC5hY2MsCisJCQkJCSAgc2l6ZW9mKHRhcmdldC0+dGhyZWFkLmV2ciksIC0xKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZXZyX3NldChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhcmdldCwgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0ICpyZWdzZXQsCisJCSAgIHVuc2lnbmVkIGludCBwb3MsIHVuc2lnbmVkIGludCBjb3VudCwKKwkJICAgY29uc3Qgdm9pZCAqa2J1ZiwgY29uc3Qgdm9pZCBfX3VzZXIgKnVidWYpCit7CisJaW50IHJldDsKKworCWZsdXNoX3NwZV90b190aHJlYWQodGFyZ2V0KTsKKworCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlpbigmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkgJnRhcmdldC0+dGhyZWFkLmV2ciwKKwkJCQkgMCwgc2l6ZW9mKHRhcmdldC0+dGhyZWFkLmV2cikpOworCisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfc3RydWN0LCBhY2MpICsgc2l6ZW9mKHU2NCkgIT0KKwkJICAgICBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCwgc3BlZnNjcikpOworCisJaWYgKCFyZXQpCisJCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlpbigmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJICZ0YXJnZXQtPnRocmVhZC5hY2MsCisJCQkJCSBzaXplb2YodGFyZ2V0LT50aHJlYWQuZXZyKSwgLTEpOworCisJcmV0dXJuIHJldDsKIH0KICNlbmRpZiAvKiBDT05GSUdfU1BFICovCiAKIAorLyoKKyAqIFRoZXNlIGFyZSBvdXIgbmF0aXZlIHJlZ3NldCBmbGF2b3JzLgorICovCitlbnVtIHBvd2VycGNfcmVnc2V0IHsKKwlSRUdTRVRfR1BSLAorCVJFR1NFVF9GUFIsCisjaWZkZWYgQ09ORklHX0FMVElWRUMKKwlSRUdTRVRfVk1YLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NQRQorCVJFR1NFVF9TUEUsCisjZW5kaWYKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXQgbmF0aXZlX3JlZ3NldHNbXSA9IHsKKwlbUkVHU0VUX0dQUl0gPSB7CisJCS5jb3JlX25vdGVfdHlwZSA9IE5UX1BSU1RBVFVTLCAubiA9IEVMRl9OR1JFRywKKwkJLnNpemUgPSBzaXplb2YobG9uZyksIC5hbGlnbiA9IHNpemVvZihsb25nKSwKKwkJLmdldCA9IGdwcl9nZXQsIC5zZXQgPSBncHJfc2V0CisJfSwKKwlbUkVHU0VUX0ZQUl0gPSB7CisJCS5jb3JlX25vdGVfdHlwZSA9IE5UX1BSRlBSRUcsIC5uID0gRUxGX05GUFJFRywKKwkJLnNpemUgPSBzaXplb2YoZG91YmxlKSwgLmFsaWduID0gc2l6ZW9mKGRvdWJsZSksCisJCS5nZXQgPSBmcHJfZ2V0LCAuc2V0ID0gZnByX3NldAorCX0sCisjaWZkZWYgQ09ORklHX0FMVElWRUMKKwlbUkVHU0VUX1ZNWF0gPSB7CisJCS5jb3JlX25vdGVfdHlwZSA9IE5UX1BQQ19WTVgsIC5uID0gMzQsCisJCS5zaXplID0gc2l6ZW9mKHZlY3RvcjEyOCksIC5hbGlnbiA9IHNpemVvZih2ZWN0b3IxMjgpLAorCQkuYWN0aXZlID0gdnJfYWN0aXZlLCAuZ2V0ID0gdnJfZ2V0LCAuc2V0ID0gdnJfc2V0CisJfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TUEUKKwlbUkVHU0VUX1NQRV0gPSB7CisJCS5uID0gMzUsCisJCS5zaXplID0gc2l6ZW9mKHUzMiksIC5hbGlnbiA9IHNpemVvZih1MzIpLAorCQkuYWN0aXZlID0gZXZyX2FjdGl2ZSwgLmdldCA9IGV2cl9nZXQsIC5zZXQgPSBldnJfc2V0CisJfSwKKyNlbmRpZgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldF92aWV3IHVzZXJfcHBjX25hdGl2ZV92aWV3ID0geworCS5uYW1lID0gVVRTX01BQ0hJTkUsIC5lX21hY2hpbmUgPSBFTEZfQVJDSCwgLmVpX29zYWJpID0gRUxGX09TQUJJLAorCS5yZWdzZXRzID0gbmF0aXZlX3JlZ3NldHMsIC5uID0gQVJSQVlfU0laRShuYXRpdmVfcmVnc2V0cykKK307CisKKyNpZmRlZiBDT05GSUdfUFBDNjQKKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKworc3RhdGljIGludCBncHIzMl9nZXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXJnZXQsCisJCSAgICAgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0ICpyZWdzZXQsCisJCSAgICAgdW5zaWduZWQgaW50IHBvcywgdW5zaWduZWQgaW50IGNvdW50LAorCQkgICAgIHZvaWQgKmtidWYsIHZvaWQgX191c2VyICp1YnVmKQoreworCWNvbnN0IHVuc2lnbmVkIGxvbmcgKnJlZ3MgPSAmdGFyZ2V0LT50aHJlYWQucmVncy0+Z3ByWzBdOworCWNvbXBhdF91bG9uZ190ICprID0ga2J1ZjsKKwljb21wYXRfdWxvbmdfdCBfX3VzZXIgKnUgPSB1YnVmOworCWNvbXBhdF91bG9uZ190IHJlZzsKKworCWlmICh0YXJnZXQtPnRocmVhZC5yZWdzID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCisJQ0hFQ0tfRlVMTF9SRUdTKHRhcmdldC0+dGhyZWFkLnJlZ3MpOworCisJcG9zIC89IHNpemVvZihyZWcpOworCWNvdW50IC89IHNpemVvZihyZWcpOworCisJaWYgKGtidWYpCisJCWZvciAoOyBjb3VudCA+IDAgJiYgcG9zIDwgUFRfTVNSOyAtLWNvdW50KQorCQkJKmsrKyA9IHJlZ3NbcG9zKytdOworCWVsc2UKKwkJZm9yICg7IGNvdW50ID4gMCAmJiBwb3MgPCBQVF9NU1I7IC0tY291bnQpCisJCQlpZiAoX19wdXRfdXNlcigoY29tcGF0X3Vsb25nX3QpIHJlZ3NbcG9zKytdLCB1KyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGNvdW50ID4gMCAmJiBwb3MgPT0gUFRfTVNSKSB7CisJCXJlZyA9IGdldF91c2VyX21zcih0YXJnZXQpOworCQlpZiAoa2J1ZikKKwkJCSprKysgPSByZWc7CisJCWVsc2UgaWYgKF9fcHV0X3VzZXIocmVnLCB1KyspKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCSsrcG9zOworCQktLWNvdW50OworCX0KKworCWlmIChrYnVmKQorCQlmb3IgKDsgY291bnQgPiAwICYmIHBvcyA8IFBUX1JFR1NfQ09VTlQ7IC0tY291bnQpCisJCQkqaysrID0gcmVnc1twb3MrK107CisJZWxzZQorCQlmb3IgKDsgY291bnQgPiAwICYmIHBvcyA8IFBUX1JFR1NfQ09VTlQ7IC0tY291bnQpCisJCQlpZiAoX19wdXRfdXNlcigoY29tcGF0X3Vsb25nX3QpIHJlZ3NbcG9zKytdLCB1KyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJa2J1ZiA9IGs7CisJdWJ1ZiA9IHU7CisJcG9zICo9IHNpemVvZihyZWcpOworCWNvdW50ICo9IHNpemVvZihyZWcpOworCXJldHVybiB1c2VyX3JlZ3NldF9jb3B5b3V0X3plcm8oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJCVBUX1JFR1NfQ09VTlQgKiBzaXplb2YocmVnKSwgLTEpOworfQorCitzdGF0aWMgaW50IGdwcjMyX3NldChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhcmdldCwKKwkJICAgICBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXQgKnJlZ3NldCwKKwkJICAgICB1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCisJCSAgICAgY29uc3Qgdm9pZCAqa2J1ZiwgY29uc3Qgdm9pZCBfX3VzZXIgKnVidWYpCit7CisJdW5zaWduZWQgbG9uZyAqcmVncyA9ICZ0YXJnZXQtPnRocmVhZC5yZWdzLT5ncHJbMF07CisJY29uc3QgY29tcGF0X3Vsb25nX3QgKmsgPSBrYnVmOworCWNvbnN0IGNvbXBhdF91bG9uZ190IF9fdXNlciAqdSA9IHVidWY7CisJY29tcGF0X3Vsb25nX3QgcmVnOworCisJaWYgKHRhcmdldC0+dGhyZWFkLnJlZ3MgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisKKwlDSEVDS19GVUxMX1JFR1ModGFyZ2V0LT50aHJlYWQucmVncyk7CisKKwlwb3MgLz0gc2l6ZW9mKHJlZyk7CisJY291bnQgLz0gc2l6ZW9mKHJlZyk7CisKKwlpZiAoa2J1ZikKKwkJZm9yICg7IGNvdW50ID4gMCAmJiBwb3MgPCBQVF9NU1I7IC0tY291bnQpCisJCQlyZWdzW3BvcysrXSA9ICprKys7CisJZWxzZQorCQlmb3IgKDsgY291bnQgPiAwICYmIHBvcyA8IFBUX01TUjsgLS1jb3VudCkgeworCQkJaWYgKF9fZ2V0X3VzZXIocmVnLCB1KyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmVnc1twb3MrK10gPSByZWc7CisJCX0KKworCisJaWYgKGNvdW50ID4gMCAmJiBwb3MgPT0gUFRfTVNSKSB7CisJCWlmIChrYnVmKQorCQkJcmVnID0gKmsrKzsKKwkJZWxzZSBpZiAoX19nZXRfdXNlcihyZWcsIHUrKykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc2V0X3VzZXJfbXNyKHRhcmdldCwgcmVnKTsKKwkJKytwb3M7CisJCS0tY291bnQ7CisJfQorCisJaWYgKGtidWYpCisJCWZvciAoOyBjb3VudCA+IDAgJiYgcG9zIDw9IFBUX01BWF9QVVRfUkVHOyAtLWNvdW50KQorCQkJcmVnc1twb3MrK10gPSAqaysrOworCWVsc2UKKwkJZm9yICg7IGNvdW50ID4gMCAmJiBwb3MgPD0gUFRfTUFYX1BVVF9SRUc7IC0tY291bnQpIHsKKwkJCWlmIChfX2dldF91c2VyKHJlZywgdSsrKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJlZ3NbcG9zKytdID0gcmVnOworCQl9CisKKwlpZiAoY291bnQgPiAwICYmIHBvcyA9PSBQVF9UUkFQKSB7CisJCWlmIChrYnVmKQorCQkJcmVnID0gKmsrKzsKKwkJZWxzZSBpZiAoX19nZXRfdXNlcihyZWcsIHUrKykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc2V0X3VzZXJfdHJhcCh0YXJnZXQsIHJlZyk7CisJCSsrcG9zOworCQktLWNvdW50OworCX0KKworCWtidWYgPSBrOworCXVidWYgPSB1OworCXBvcyAqPSBzaXplb2YocmVnKTsKKwljb3VudCAqPSBzaXplb2YocmVnKTsKKwlyZXR1cm4gdXNlcl9yZWdzZXRfY29weWluX2lnbm9yZSgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJIChQVF9UUkFQICsgMSkgKiBzaXplb2YocmVnKSwgLTEpOworfQorCisvKgorICogVGhlc2UgYXJlIHRoZSByZWdzZXQgZmxhdm9ycyBtYXRjaGluZyB0aGUgQ09ORklHX1BQQzMyIG5hdGl2ZSBzZXQuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXQgY29tcGF0X3JlZ3NldHNbXSA9IHsKKwlbUkVHU0VUX0dQUl0gPSB7CisJCS5jb3JlX25vdGVfdHlwZSA9IE5UX1BSU1RBVFVTLCAubiA9IEVMRl9OR1JFRywKKwkJLnNpemUgPSBzaXplb2YoY29tcGF0X2xvbmdfdCksIC5hbGlnbiA9IHNpemVvZihjb21wYXRfbG9uZ190KSwKKwkJLmdldCA9IGdwcjMyX2dldCwgLnNldCA9IGdwcjMyX3NldAorCX0sCisJW1JFR1NFVF9GUFJdID0geworCQkuY29yZV9ub3RlX3R5cGUgPSBOVF9QUkZQUkVHLCAubiA9IEVMRl9ORlBSRUcsCisJCS5zaXplID0gc2l6ZW9mKGRvdWJsZSksIC5hbGlnbiA9IHNpemVvZihkb3VibGUpLAorCQkuZ2V0ID0gZnByX2dldCwgLnNldCA9IGZwcl9zZXQKKwl9LAorI2lmZGVmIENPTkZJR19BTFRJVkVDCisJW1JFR1NFVF9WTVhdID0geworCQkuY29yZV9ub3RlX3R5cGUgPSBOVF9QUENfVk1YLCAubiA9IDM0LAorCQkuc2l6ZSA9IHNpemVvZih2ZWN0b3IxMjgpLCAuYWxpZ24gPSBzaXplb2YodmVjdG9yMTI4KSwKKwkJLmFjdGl2ZSA9IHZyX2FjdGl2ZSwgLmdldCA9IHZyX2dldCwgLnNldCA9IHZyX3NldAorCX0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1BFCisJW1JFR1NFVF9TUEVdID0geworCQkuY29yZV9ub3RlX3R5cGUgPSBOVF9QUENfU1BFLCAubiA9IDM1LAorCQkuc2l6ZSA9IHNpemVvZih1MzIpLCAuYWxpZ24gPSBzaXplb2YodTMyKSwKKwkJLmFjdGl2ZSA9IGV2cl9hY3RpdmUsIC5nZXQgPSBldnJfZ2V0LCAuc2V0ID0gZXZyX3NldAorCX0sCisjZW5kaWYKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXRfdmlldyB1c2VyX3BwY19jb21wYXRfdmlldyA9IHsKKwkubmFtZSA9ICJwcGMiLCAuZV9tYWNoaW5lID0gRU1fUFBDLCAuZWlfb3NhYmkgPSBFTEZfT1NBQkksCisJLnJlZ3NldHMgPSBjb21wYXRfcmVnc2V0cywgLm4gPSBBUlJBWV9TSVpFKGNvbXBhdF9yZWdzZXRzKQorfTsKKyNlbmRpZgkvKiBDT05GSUdfUFBDNjQgKi8KKworY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0X3ZpZXcgKnRhc2tfdXNlcl9yZWdzZXRfdmlldyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisjaWZkZWYgQ09ORklHX1BQQzY0CisJaWYgKHRlc3RfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl8zMkJJVCkpCisJCXJldHVybiAmdXNlcl9wcGNfY29tcGF0X3ZpZXc7CisjZW5kaWYKKwlyZXR1cm4gJnVzZXJfcHBjX25hdGl2ZV92aWV3OworfQorCisKIHZvaWQgdXNlcl9lbmFibGVfc2luZ2xlX3N0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewogCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFzay0+dGhyZWFkLnJlZ3M7CkBAIC0zMjMsNTUgKzY3MSwyOSBAQAogc3RhdGljIGxvbmcgYXJjaF9wdHJhY2Vfb2xkKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgcmVxdWVzdCwgbG9uZyBhZGRyLAogCQkJICAgIGxvbmcgZGF0YSkKIHsKLQlpbnQgcmV0ID0gLUVQRVJNOworCXN3aXRjaCAocmVxdWVzdCkgeworCWNhc2UgUFBDX1BUUkFDRV9HRVRSRUdTOgkvKiBHZXQgR1BScyAwIC0gMzEuICovCisJCXJldHVybiBjb3B5X3JlZ3NldF90b191c2VyKGNoaWxkLCAmdXNlcl9wcGNfbmF0aXZlX3ZpZXcsCisJCQkJCSAgIFJFR1NFVF9HUFIsIDAsIDMyICogc2l6ZW9mKGxvbmcpLAorCQkJCQkgICAodm9pZCBfX3VzZXIgKikgZGF0YSk7CiAKLQlzd2l0Y2gocmVxdWVzdCkgewotCWNhc2UgUFBDX1BUUkFDRV9HRVRSRUdTOiB7IC8qIEdldCBHUFJzIDAgLSAzMS4gKi8KLQkJaW50IGk7Ci0JCXVuc2lnbmVkIGxvbmcgKnJlZyA9ICYoKHVuc2lnbmVkIGxvbmcgKiljaGlsZC0+dGhyZWFkLnJlZ3MpWzBdOwotCQl1bnNpZ25lZCBsb25nIF9fdXNlciAqdG1wID0gKHVuc2lnbmVkIGxvbmcgX191c2VyICopYWRkcjsKKwljYXNlIFBQQ19QVFJBQ0VfU0VUUkVHUzoJLyogU2V0IEdQUnMgMCAtIDMxLiAqLworCQlyZXR1cm4gY29weV9yZWdzZXRfZnJvbV91c2VyKGNoaWxkLCAmdXNlcl9wcGNfbmF0aXZlX3ZpZXcsCisJCQkJCSAgICAgUkVHU0VUX0dQUiwgMCwgMzIgKiBzaXplb2YobG9uZyksCisJCQkJCSAgICAgKGNvbnN0IHZvaWQgX191c2VyICopIGRhdGEpOwogCi0JCUNIRUNLX0ZVTExfUkVHUyhjaGlsZC0+dGhyZWFkLnJlZ3MpOwotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQkJcmV0ID0gcHV0X3VzZXIoKnJlZywgdG1wKTsKLQkJCWlmIChyZXQpCi0JCQkJYnJlYWs7Ci0JCQlyZWcrKzsKLQkJCXRtcCsrOwotCQl9Ci0JCWJyZWFrOworCWNhc2UgUFBDX1BUUkFDRV9HRVRGUFJFR1M6CS8qIEdldCBGUFJzIDAgLSAzMS4gKi8KKwkJcmV0dXJuIGNvcHlfcmVnc2V0X3RvX3VzZXIoY2hpbGQsICZ1c2VyX3BwY19uYXRpdmVfdmlldywKKwkJCQkJICAgUkVHU0VUX0ZQUiwgMCwgMzIgKiBzaXplb2YoZG91YmxlKSwKKwkJCQkJICAgKHZvaWQgX191c2VyICopIGRhdGEpOworCisJY2FzZSBQUENfUFRSQUNFX1NFVEZQUkVHUzoJLyogU2V0IEZQUnMgMCAtIDMxLiAqLworCQlyZXR1cm4gY29weV9yZWdzZXRfZnJvbV91c2VyKGNoaWxkLCAmdXNlcl9wcGNfbmF0aXZlX3ZpZXcsCisJCQkJCSAgICAgUkVHU0VUX0ZQUiwgMCwgMzIgKiBzaXplb2YoZG91YmxlKSwKKwkJCQkJICAgICAoY29uc3Qgdm9pZCBfX3VzZXIgKikgZGF0YSk7CiAJfQogCi0JY2FzZSBQUENfUFRSQUNFX1NFVFJFR1M6IHsgLyogU2V0IEdQUnMgMCAtIDMxLiAqLwotCQlpbnQgaTsKLQkJdW5zaWduZWQgbG9uZyAqcmVnID0gJigodW5zaWduZWQgbG9uZyAqKWNoaWxkLT50aHJlYWQucmVncylbMF07Ci0JCXVuc2lnbmVkIGxvbmcgX191c2VyICp0bXAgPSAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhZGRyOwotCi0JCUNIRUNLX0ZVTExfUkVHUyhjaGlsZC0+dGhyZWFkLnJlZ3MpOwotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQkJcmV0ID0gZ2V0X3VzZXIoKnJlZywgdG1wKTsKLQkJCWlmIChyZXQpCi0JCQkJYnJlYWs7Ci0JCQlyZWcrKzsKLQkJCXRtcCsrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgUFBDX1BUUkFDRV9HRVRGUFJFR1M6IHsgLyogR2V0IEZQUnMgMCAtIDMxLiAqLwotCQlmbHVzaF9mcF90b190aHJlYWQoY2hpbGQpOwotCQlyZXQgPSBnZXRfZnByZWdzKCh2b2lkIF9fdXNlciAqKWFkZHIsIGNoaWxkLCAwKTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBQUENfUFRSQUNFX1NFVEZQUkVHUzogeyAvKiBHZXQgRlBScyAwIC0gMzEuICovCi0JCWZsdXNoX2ZwX3RvX3RocmVhZChjaGlsZCk7Ci0JCXJldCA9IHNldF9mcHJlZ3MoKHZvaWQgX191c2VyICopYWRkciwgY2hpbGQsIDApOwotCQlicmVhazsKLQl9Ci0KLQl9Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gLUVQRVJNOwogfQogCiBsb25nIGFyY2hfcHRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgcmVxdWVzdCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpCkBAIC0zNzksMTIgKzcwMSw2IEBACiAJaW50IHJldCA9IC1FUEVSTTsKIAogCXN3aXRjaCAocmVxdWVzdCkgewotCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoZXNlIHdpbGwgbmVlZCB0byBiZSBmaXhlZC4gKi8KLQljYXNlIFBUUkFDRV9QRUVLVEVYVDogLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCi0JY2FzZSBQVFJBQ0VfUEVFS0RBVEE6Ci0JCXJldCA9IGdlbmVyaWNfcHRyYWNlX3BlZWtkYXRhKGNoaWxkLCBhZGRyLCBkYXRhKTsKLQkJYnJlYWs7Ci0KIAkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVVNSOiB7CiAJCXVuc2lnbmVkIGxvbmcgaW5kZXgsIHRtcDsKQEAgLTQxMiwxMiArNzI4LDYgQEAKIAkJYnJlYWs7CiAJfQogCi0JLyogSWYgSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoaXMgd2lsbCBoYXZlIHRvIGJlIGZpeGVkLiAqLwotCWNhc2UgUFRSQUNFX1BPS0VURVhUOiAvKiB3cml0ZSB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLwotCWNhc2UgUFRSQUNFX1BPS0VEQVRBOgotCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7Ci0JCWJyZWFrOwotCiAJLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhICovCiAJY2FzZSBQVFJBQ0VfUE9LRVVTUjogewogCQl1bnNpZ25lZCBsb25nIGluZGV4OwpAQCAtNDYyLDg1ICs3NzIsNjAgQEAKICNpZmRlZiBDT05GSUdfUFBDNjQKIAljYXNlIFBUUkFDRV9HRVRSRUdTNjQ6CiAjZW5kaWYKLQljYXNlIFBUUkFDRV9HRVRSRUdTOiB7IC8qIEdldCBhbGwgcHRfcmVncyBmcm9tIHRoZSBjaGlsZC4gKi8KLQkJaW50IHVpOwotCSAgCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgKHZvaWQgX191c2VyICopZGF0YSwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKSkgewotCQkJcmV0ID0gLUVJTzsKLQkJCWJyZWFrOwotCQl9Ci0JCUNIRUNLX0ZVTExfUkVHUyhjaGlsZC0+dGhyZWFkLnJlZ3MpOwotCQlyZXQgPSAwOwotCQlmb3IgKHVpID0gMDsgdWkgPCBQVF9SRUdTX0NPVU5UOyB1aSArKykgewotCQkJcmV0IHw9IF9fcHV0X3VzZXIocHRyYWNlX2dldF9yZWcoY2hpbGQsIHVpKSwKLQkJCQkJICAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZGF0YSk7Ci0JCQlkYXRhICs9IHNpemVvZihsb25nKTsKLQkJfQotCQlicmVhazsKLQl9CisJY2FzZSBQVFJBQ0VfR0VUUkVHUzoJLyogR2V0IGFsbCBwdF9yZWdzIGZyb20gdGhlIGNoaWxkLiAqLworCQlyZXR1cm4gY29weV9yZWdzZXRfdG9fdXNlcihjaGlsZCwgJnVzZXJfcHBjX25hdGl2ZV92aWV3LAorCQkJCQkgICBSRUdTRVRfR1BSLAorCQkJCQkgICAwLCBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpLAorCQkJCQkgICAodm9pZCBfX3VzZXIgKikgZGF0YSk7CiAKICNpZmRlZiBDT05GSUdfUFBDNjQKIAljYXNlIFBUUkFDRV9TRVRSRUdTNjQ6CiAjZW5kaWYKLQljYXNlIFBUUkFDRV9TRVRSRUdTOiB7IC8qIFNldCBhbGwgZ3AgcmVncyBpbiB0aGUgY2hpbGQuICovCi0JCXVuc2lnbmVkIGxvbmcgdG1wOwotCQlpbnQgdWk7Ci0JICAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsICh2b2lkIF9fdXNlciAqKWRhdGEsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSkpIHsKLQkJCXJldCA9IC1FSU87Ci0JCQlicmVhazsKLQkJfQotCQlDSEVDS19GVUxMX1JFR1MoY2hpbGQtPnRocmVhZC5yZWdzKTsKLQkJcmV0ID0gMDsKLQkJZm9yICh1aSA9IDA7IHVpIDwgUFRfUkVHU19DT1VOVDsgdWkgKyspIHsKLQkJCXJldCA9IF9fZ2V0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgZGF0YSk7Ci0JCQlpZiAocmV0KQotCQkJCWJyZWFrOwotCQkJcHRyYWNlX3B1dF9yZWcoY2hpbGQsIHVpLCB0bXApOwotCQkJZGF0YSArPSBzaXplb2YobG9uZyk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQorCWNhc2UgUFRSQUNFX1NFVFJFR1M6CS8qIFNldCBhbGwgZ3AgcmVncyBpbiB0aGUgY2hpbGQuICovCisJCXJldHVybiBjb3B5X3JlZ3NldF9mcm9tX3VzZXIoY2hpbGQsICZ1c2VyX3BwY19uYXRpdmVfdmlldywKKwkJCQkJICAgICBSRUdTRVRfR1BSLAorCQkJCQkgICAgIDAsIHNpemVvZihzdHJ1Y3QgcHRfcmVncyksCisJCQkJCSAgICAgKGNvbnN0IHZvaWQgX191c2VyICopIGRhdGEpOwogCi0JY2FzZSBQVFJBQ0VfR0VURlBSRUdTOiB7IC8qIEdldCB0aGUgY2hpbGQgRlBVIHN0YXRlIChGUFIwLi4uMzEgKyBGUFNDUikgKi8KLQkJZmx1c2hfZnBfdG9fdGhyZWFkKGNoaWxkKTsKLQkJcmV0ID0gZ2V0X2ZwcmVncygodm9pZCBfX3VzZXIgKilkYXRhLCBjaGlsZCwgMSk7Ci0JCWJyZWFrOwotCX0KKwljYXNlIFBUUkFDRV9HRVRGUFJFR1M6IC8qIEdldCB0aGUgY2hpbGQgRlBVIHN0YXRlIChGUFIwLi4uMzEgKyBGUFNDUikgKi8KKwkJcmV0dXJuIGNvcHlfcmVnc2V0X3RvX3VzZXIoY2hpbGQsICZ1c2VyX3BwY19uYXRpdmVfdmlldywKKwkJCQkJICAgUkVHU0VUX0ZQUiwKKwkJCQkJICAgMCwgc2l6ZW9mKGVsZl9mcHJlZ3NldF90KSwKKwkJCQkJICAgKHZvaWQgX191c2VyICopIGRhdGEpOwogCi0JY2FzZSBQVFJBQ0VfU0VURlBSRUdTOiB7IC8qIFNldCB0aGUgY2hpbGQgRlBVIHN0YXRlIChGUFIwLi4uMzEgKyBGUFNDUikgKi8KLQkJZmx1c2hfZnBfdG9fdGhyZWFkKGNoaWxkKTsKLQkJcmV0ID0gc2V0X2ZwcmVncygodm9pZCBfX3VzZXIgKilkYXRhLCBjaGlsZCwgMSk7Ci0JCWJyZWFrOwotCX0KKwljYXNlIFBUUkFDRV9TRVRGUFJFR1M6IC8qIFNldCB0aGUgY2hpbGQgRlBVIHN0YXRlIChGUFIwLi4uMzEgKyBGUFNDUikgKi8KKwkJcmV0dXJuIGNvcHlfcmVnc2V0X2Zyb21fdXNlcihjaGlsZCwgJnVzZXJfcHBjX25hdGl2ZV92aWV3LAorCQkJCQkgICAgIFJFR1NFVF9GUFIsCisJCQkJCSAgICAgMCwgc2l6ZW9mKGVsZl9mcHJlZ3NldF90KSwKKwkJCQkJICAgICAoY29uc3Qgdm9pZCBfX3VzZXIgKikgZGF0YSk7CiAKICNpZmRlZiBDT05GSUdfQUxUSVZFQwogCWNhc2UgUFRSQUNFX0dFVFZSUkVHUzoKLQkJLyogR2V0IHRoZSBjaGlsZCBhbHRpdmVjIHJlZ2lzdGVyIHN0YXRlLiAqLwotCQlmbHVzaF9hbHRpdmVjX3RvX3RocmVhZChjaGlsZCk7Ci0JCXJldCA9IGdldF92cnJlZ3MoKHVuc2lnbmVkIGxvbmcgX191c2VyICopZGF0YSwgY2hpbGQpOwotCQlicmVhazsKKwkJcmV0dXJuIGNvcHlfcmVnc2V0X3RvX3VzZXIoY2hpbGQsICZ1c2VyX3BwY19uYXRpdmVfdmlldywKKwkJCQkJICAgUkVHU0VUX1ZNWCwKKwkJCQkJICAgMCwgKDMzICogc2l6ZW9mKHZlY3RvcjEyOCkgKworCQkJCQkgICAgICAgc2l6ZW9mKHUzMikpLAorCQkJCQkgICAodm9pZCBfX3VzZXIgKikgZGF0YSk7CiAKIAljYXNlIFBUUkFDRV9TRVRWUlJFR1M6Ci0JCS8qIFNldCB0aGUgY2hpbGQgYWx0aXZlYyByZWdpc3RlciBzdGF0ZS4gKi8KLQkJZmx1c2hfYWx0aXZlY190b190aHJlYWQoY2hpbGQpOwotCQlyZXQgPSBzZXRfdnJyZWdzKGNoaWxkLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilkYXRhKTsKLQkJYnJlYWs7CisJCXJldHVybiBjb3B5X3JlZ3NldF9mcm9tX3VzZXIoY2hpbGQsICZ1c2VyX3BwY19uYXRpdmVfdmlldywKKwkJCQkJICAgICBSRUdTRVRfVk1YLAorCQkJCQkgICAgIDAsICgzMyAqIHNpemVvZih2ZWN0b3IxMjgpICsKKwkJCQkJCSBzaXplb2YodTMyKSksCisJCQkJCSAgICAgKGNvbnN0IHZvaWQgX191c2VyICopIGRhdGEpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NQRQogCWNhc2UgUFRSQUNFX0dFVEVWUlJFR1M6CiAJCS8qIEdldCB0aGUgY2hpbGQgc3BlIHJlZ2lzdGVyIHN0YXRlLiAqLwotCQlmbHVzaF9zcGVfdG9fdGhyZWFkKGNoaWxkKTsKLQkJcmV0ID0gZ2V0X2V2cnJlZ3MoKHVuc2lnbmVkIGxvbmcgX191c2VyICopZGF0YSwgY2hpbGQpOwotCQlicmVhazsKKwkJcmV0dXJuIGNvcHlfcmVnc2V0X3RvX3VzZXIoY2hpbGQsICZ1c2VyX3BwY19uYXRpdmVfdmlldywKKwkJCQkJICAgUkVHU0VUX1NQRSwgMCwgMzUgKiBzaXplb2YodTMyKSwKKwkJCQkJICAgKHZvaWQgX191c2VyICopIGRhdGEpOwogCiAJY2FzZSBQVFJBQ0VfU0VURVZSUkVHUzoKIAkJLyogU2V0IHRoZSBjaGlsZCBzcGUgcmVnaXN0ZXIgc3RhdGUuICovCi0JCS8qIHRoaXMgaXMgdG8gY2xlYXIgdGhlIE1TUl9TUEUgYml0IHRvIGZvcmNlIGEgcmVsb2FkCi0JCSAqIG9mIHJlZ2lzdGVyIHN0YXRlIGZyb20gbWVtb3J5ICovCi0JCWZsdXNoX3NwZV90b190aHJlYWQoY2hpbGQpOwotCQlyZXQgPSBzZXRfZXZycmVncyhjaGlsZCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopZGF0YSk7Ci0JCWJyZWFrOworCQlyZXR1cm4gY29weV9yZWdzZXRfZnJvbV91c2VyKGNoaWxkLCAmdXNlcl9wcGNfbmF0aXZlX3ZpZXcsCisJCQkJCSAgICAgUkVHU0VUX1NQRSwgMCwgMzUgKiBzaXplb2YodTMyKSwKKwkJCQkJICAgICAoY29uc3Qgdm9pZCBfX3VzZXIgKikgZGF0YSk7CiAjZW5kaWYKIAogCS8qIE9sZCByZXZlcnNlIGFyZ3MgcHRyYWNlIGNhbGxzcyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UzMi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UzMi5jCmluZGV4IGZlYTYyMDYuLjRjMWRlNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZTMyLmMKQEAgLTI0LDkgKzI0LDExIEBACiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3NldC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpAQCAtNDUsODcgKzQ3LDMxIEBACiBzdGF0aWMgbG9uZyBjb21wYXRfcHRyYWNlX29sZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIHJlcXVlc3QsCiAJCQkgICAgICBsb25nIGFkZHIsIGxvbmcgZGF0YSkKIHsKLQlpbnQgcmV0ID0gLUVQRVJNOworCXN3aXRjaCAocmVxdWVzdCkgeworCWNhc2UgUFBDX1BUUkFDRV9HRVRSRUdTOgkvKiBHZXQgR1BScyAwIC0gMzEuICovCisJCXJldHVybiBjb3B5X3JlZ3NldF90b191c2VyKGNoaWxkLAorCQkJCQkgICB0YXNrX3VzZXJfcmVnc2V0X3ZpZXcoY3VycmVudCksIDAsCisJCQkJCSAgIDAsIDMyICogc2l6ZW9mKGNvbXBhdF9sb25nX3QpLAorCQkJCQkgICBjb21wYXRfcHRyKGRhdGEpKTsKIAotCXN3aXRjaChyZXF1ZXN0KSB7Ci0JY2FzZSBQUENfUFRSQUNFX0dFVFJFR1M6IHsgLyogR2V0IEdQUnMgMCAtIDMxLiAqLwotCQlpbnQgaTsKLQkJdW5zaWduZWQgbG9uZyAqcmVnID0gJigodW5zaWduZWQgbG9uZyAqKWNoaWxkLT50aHJlYWQucmVncylbMF07Ci0JCXVuc2lnbmVkIGludCBfX3VzZXIgKnRtcCA9ICh1bnNpZ25lZCBpbnQgX191c2VyICopYWRkcjsKLQotCQlDSEVDS19GVUxMX1JFR1MoY2hpbGQtPnRocmVhZC5yZWdzKTsKLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkJCXJldCA9IHB1dF91c2VyKCpyZWcsIHRtcCk7Ci0JCQlpZiAocmV0KQotCQkJCWJyZWFrOwotCQkJcmVnKys7Ci0JCQl0bXArKzsKLQkJfQotCQlicmVhazsKKwljYXNlIFBQQ19QVFJBQ0VfU0VUUkVHUzoJLyogU2V0IEdQUnMgMCAtIDMxLiAqLworCQlyZXR1cm4gY29weV9yZWdzZXRfZnJvbV91c2VyKGNoaWxkLAorCQkJCQkgICAgIHRhc2tfdXNlcl9yZWdzZXRfdmlldyhjdXJyZW50KSwgMCwKKwkJCQkJICAgICAwLCAzMiAqIHNpemVvZihjb21wYXRfbG9uZ190KSwKKwkJCQkJICAgICBjb21wYXRfcHRyKGRhdGEpKTsKIAl9CiAKLQljYXNlIFBQQ19QVFJBQ0VfU0VUUkVHUzogeyAvKiBTZXQgR1BScyAwIC0gMzEuICovCi0JCWludCBpOwotCQl1bnNpZ25lZCBsb25nICpyZWcgPSAmKCh1bnNpZ25lZCBsb25nICopY2hpbGQtPnRocmVhZC5yZWdzKVswXTsKLQkJdW5zaWduZWQgaW50IF9fdXNlciAqdG1wID0gKHVuc2lnbmVkIGludCBfX3VzZXIgKilhZGRyOwotCi0JCUNIRUNLX0ZVTExfUkVHUyhjaGlsZC0+dGhyZWFkLnJlZ3MpOwotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQkJcmV0ID0gZ2V0X3VzZXIoKnJlZywgdG1wKTsKLQkJCWlmIChyZXQpCi0JCQkJYnJlYWs7Ci0JCQlyZWcrKzsKLQkJCXRtcCsrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCX0KLQlyZXR1cm4gcmV0OworCXJldHVybiAtRVBFUk07CiB9CiAKLWxvbmcgY29tcGF0X3N5c19wdHJhY2UoaW50IHJlcXVlc3QsIGludCBwaWQsIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZGF0YSkKK2xvbmcgY29tcGF0X2FyY2hfcHRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGNvbXBhdF9sb25nX3QgcmVxdWVzdCwKKwkJCWNvbXBhdF91bG9uZ190IGNhZGRyLCBjb21wYXRfdWxvbmdfdCBjZGF0YSkKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGNhZGRyOworCXVuc2lnbmVkIGxvbmcgZGF0YSA9IGNkYXRhOwogCWludCByZXQ7CiAKLQlsb2NrX2tlcm5lbCgpOwotCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9UUkFDRU1FKSB7Ci0JCXJldCA9IHB0cmFjZV90cmFjZW1lKCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWNoaWxkID0gcHRyYWNlX2dldF90YXNrX3N0cnVjdChwaWQpOwotCWlmIChJU19FUlIoY2hpbGQpKSB7Ci0JCXJldCA9IFBUUl9FUlIoY2hpbGQpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfQVRUQUNIKSB7Ci0JCXJldCA9IHB0cmFjZV9hdHRhY2goY2hpbGQpOwotCQlnb3RvIG91dF90c2s7Ci0JfQotCi0JcmV0ID0gcHRyYWNlX2NoZWNrX2F0dGFjaChjaGlsZCwgcmVxdWVzdCA9PSBQVFJBQ0VfS0lMTCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0X3RzazsKLQogCXN3aXRjaCAocmVxdWVzdCkgewotCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoZXNlIHdpbGwgbmVlZCB0byBiZSBmaXhlZC4gKi8KLQljYXNlIFBUUkFDRV9QRUVLVEVYVDogLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovIAotCWNhc2UgUFRSQUNFX1BFRUtEQVRBOiB7Ci0JCXVuc2lnbmVkIGludCB0bXA7Ci0JCWludCBjb3BpZWQ7Ci0KLQkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKLQkJcmV0ID0gLUVJTzsKLQkJaWYgKGNvcGllZCAhPSBzaXplb2YodG1wKSkKLQkJCWJyZWFrOwotCQlyZXQgPSBwdXRfdXNlcih0bXAsICh1MzIgX191c2VyICopZGF0YSk7Ci0JCWJyZWFrOwotCX0KLQogCS8qCiAJICogUmVhZCA0IGJ5dGVzIG9mIHRoZSBvdGhlciBwcm9jZXNzJyBzdG9yYWdlCiAJICogIGRhdGEgaXMgYSBwb2ludGVyIHNwZWNpZnlpbmcgd2hlcmUgdGhlIHVzZXIgd2FudHMgdGhlCkBAIC0yMjUsMTkgKzE3MSw2IEBACiAJCWJyZWFrOwogCX0KIAotCS8qIElmIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gKi8KLQljYXNlIFBUUkFDRV9QT0tFVEVYVDogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KLQljYXNlIFBUUkFDRV9QT0tFREFUQTogewotCQl1bnNpZ25lZCBpbnQgdG1wOwotCQl0bXAgPSBkYXRhOwotCQlyZXQgPSAwOwotCQlpZiAoYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAxKQotCQkJCT09IHNpemVvZih0bXApKQotCQkJYnJlYWs7Ci0JCXJldCA9IC1FSU87Ci0JCWJyZWFrOwotCX0KLQogCS8qCiAJICogV3JpdGUgNCBieXRlcyBpbnRvIHRoZSBvdGhlciBwcm9jZXNzJyBzdG9yYWdlCiAJICogIGRhdGEgaXMgdGhlIDQgYnl0ZXMgdGhhdCB0aGUgdXNlciB3YW50cyB3cml0dGVuCkBAIC0zMzcsNDYgKzI3MCwxNyBAQAogCQlicmVhazsKIAl9CiAKLQljYXNlIFBUUkFDRV9HRVRFVkVOVE1TRzoKLQkJcmV0ID0gcHV0X3VzZXIoY2hpbGQtPnB0cmFjZV9tZXNzYWdlLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSBkYXRhKTsKLQkJYnJlYWs7CisJY2FzZSBQVFJBQ0VfR0VUUkVHUzoJLyogR2V0IGFsbCBwdF9yZWdzIGZyb20gdGhlIGNoaWxkLiAqLworCQlyZXR1cm4gY29weV9yZWdzZXRfdG9fdXNlcigKKwkJCWNoaWxkLCB0YXNrX3VzZXJfcmVnc2V0X3ZpZXcoY3VycmVudCksIDAsCisJCQkwLCBQVF9SRUdTX0NPVU5UICogc2l6ZW9mKGNvbXBhdF9sb25nX3QpLAorCQkJY29tcGF0X3B0cihkYXRhKSk7CiAKLQljYXNlIFBUUkFDRV9HRVRSRUdTOiB7IC8qIEdldCBhbGwgcHRfcmVncyBmcm9tIHRoZSBjaGlsZC4gKi8KLQkJaW50IHVpOwotCSAgCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgKHZvaWQgX191c2VyICopZGF0YSwKLQkJCSAgICAgICBQVF9SRUdTX0NPVU5UICogc2l6ZW9mKGludCkpKSB7Ci0JCQlyZXQgPSAtRUlPOwotCQkJYnJlYWs7Ci0JCX0KLQkJQ0hFQ0tfRlVMTF9SRUdTKGNoaWxkLT50aHJlYWQucmVncyk7Ci0JCXJldCA9IDA7Ci0JCWZvciAodWkgPSAwOyB1aSA8IFBUX1JFR1NfQ09VTlQ7IHVpICsrKSB7Ci0JCQlyZXQgfD0gX19wdXRfdXNlcihwdHJhY2VfZ2V0X3JlZyhjaGlsZCwgdWkpLAotCQkJCQkgICh1bnNpZ25lZCBpbnQgX191c2VyICopIGRhdGEpOwotCQkJZGF0YSArPSBzaXplb2YoaW50KTsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQljYXNlIFBUUkFDRV9TRVRSRUdTOiB7IC8qIFNldCBhbGwgZ3AgcmVncyBpbiB0aGUgY2hpbGQuICovCi0JCXVuc2lnbmVkIGxvbmcgdG1wOwotCQlpbnQgdWk7Ci0JICAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsICh2b2lkIF9fdXNlciAqKWRhdGEsCi0JCQkgICAgICAgUFRfUkVHU19DT1VOVCAqIHNpemVvZihpbnQpKSkgewotCQkJcmV0ID0gLUVJTzsKLQkJCWJyZWFrOwotCQl9Ci0JCUNIRUNLX0ZVTExfUkVHUyhjaGlsZC0+dGhyZWFkLnJlZ3MpOwotCQlyZXQgPSAwOwotCQlmb3IgKHVpID0gMDsgdWkgPCBQVF9SRUdTX0NPVU5UOyB1aSArKykgewotCQkJcmV0ID0gX19nZXRfdXNlcih0bXAsICh1bnNpZ25lZCBpbnQgX191c2VyICopIGRhdGEpOwotCQkJaWYgKHJldCkKLQkJCQlicmVhazsKLQkJCXB0cmFjZV9wdXRfcmVnKGNoaWxkLCB1aSwgdG1wKTsKLQkJCWRhdGEgKz0gc2l6ZW9mKGludCk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQorCWNhc2UgUFRSQUNFX1NFVFJFR1M6CS8qIFNldCBhbGwgZ3AgcmVncyBpbiB0aGUgY2hpbGQuICovCisJCXJldHVybiBjb3B5X3JlZ3NldF9mcm9tX3VzZXIoCisJCQljaGlsZCwgdGFza191c2VyX3JlZ3NldF92aWV3KGN1cnJlbnQpLCAwLAorCQkJMCwgUFRfUkVHU19DT1VOVCAqIHNpemVvZihjb21wYXRfbG9uZ190KSwKKwkJCWNvbXBhdF9wdHIoZGF0YSkpOwogCiAJY2FzZSBQVFJBQ0VfR0VURlBSRUdTOgogCWNhc2UgUFRSQUNFX1NFVEZQUkVHUzoKQEAgLTQwMiwxMiArMzA2LDkgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlyZXQgPSBwdHJhY2VfcmVxdWVzdChjaGlsZCwgcmVxdWVzdCwgYWRkciwgZGF0YSk7CisJCXJldCA9IGNvbXBhdF9wdHJhY2VfcmVxdWVzdChjaGlsZCwgcmVxdWVzdCwgYWRkciwgZGF0YSk7CiAJCWJyZWFrOwogCX0KLW91dF90c2s6Ci0JcHV0X3Rhc2tfc3RydWN0KGNoaWxkKTsKLW91dDoKLQl1bmxvY2tfa2VybmVsKCk7CisKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCmluZGV4IDg0OGEyMDQuLjRiNWI3ZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKQEAgLTU0LDcgKzU0LDcgQEAKICNlbmRpZgogI2luY2x1ZGUgPGFzbS9rZXhlYy5oPgogCi0jaWZkZWYgQ09ORklHX0RFQlVHR0VSCisjaWYgZGVmaW5lZChDT05GSUdfREVCVUdHRVIpIHx8IGRlZmluZWQoQ09ORklHX0tFWEVDKQogaW50ICgqX19kZWJ1Z2dlcikoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogaW50ICgqX19kZWJ1Z2dlcl9pcGkpKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIGludCAoKl9fZGVidWdnZXJfYnB0KShzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zpby5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92aW8uYwppbmRleCBmMGJhZDcwLi5mOTg4NjcyNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92aW8uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zpby5jCkBAIC0xNzYsNyArMTc2LDcgQEAKICAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIHZpb19kZXYgb3IgTlVMTCBpZiBub2RlIGhhcwogICogTlVMTCBkZXZpY2VfdHlwZSBvciBjb21wYXRpYmxlIGZpZWxkcy4KICAqLwotc3RydWN0IHZpb19kZXYgKiBfX2RldmluaXQgdmlvX3JlZ2lzdGVyX2RldmljZV9ub2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZSkKK3N0cnVjdCB2aW9fZGV2ICp2aW9fcmVnaXN0ZXJfZGV2aWNlX25vZGUoc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlKQogewogCXN0cnVjdCB2aW9fZGV2ICp2aW9kZXY7CiAJY29uc3QgdW5zaWduZWQgaW50ICp1bml0X2FkZHJlc3M7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbWVtLmMgYi9hcmNoL3Bvd2VycGMvbW0vbWVtLmMKaW5kZXggZTgxMjI0NC4uYmU1YzUwNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL21lbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9tZW0uYwpAQCAtMTI5LDYgKzEyOSwzOSBAQAogCXJldHVybiBfX2FkZF9wYWdlcyh6b25lLCBzdGFydF9wZm4sIG5yX3BhZ2VzKTsKIH0KIAorI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUkVNT1ZFCitpbnQgcmVtb3ZlX21lbW9yeSh1NjQgc3RhcnQsIHU2NCBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBlbmRfcGZuOworCWludCByZXQ7CisKKwlzdGFydF9wZm4gPSBzdGFydCA+PiBQQUdFX1NISUZUOworCWVuZF9wZm4gPSBzdGFydF9wZm4gKyAoc2l6ZSA+PiBQQUdFX1NISUZUKTsKKwlyZXQgPSBvZmZsaW5lX3BhZ2VzKHN0YXJ0X3BmbiwgZW5kX3BmbiwgMTIwICogSFopOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCS8qIEFyY2gtc3BlY2lmaWMgY2FsbHMgZ28gaGVyZSAtIG5leHQgcGF0Y2ggKi8KK291dDoKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmIC8qIENPTkZJR19NRU1PUllfSE9UUkVNT1ZFICovCisKKy8qCisgKiB3YWxrX21lbW9yeV9yZXNvdXJjZSgpIG5lZWRzIHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBob2xlcyBpbiBhIGdpdmVuCisgKiBtZW1vcnkgcmFuZ2UuIE9uIFBQQzY0LCBzaW5jZSB0aGlzIHJhbmdlIGNvbWVzIGZyb20gL3N5c2ZzLCB0aGUgcmFuZ2UKKyAqIGlzIGd1YXJhbnRlZWQgdG8gYmUgdmFsaWQsIG5vbi1vdmVybGFwcGluZyBhbmQgY2FuIG5vdCBjb250YWluIGFueQorICogaG9sZXMuIEJ5IHRoZSB0aW1lIHdlIGdldCBoZXJlIChtZW1vcnkgYWRkIG9yIHJlbW92ZSksIC9wcm9jL2RldmljZS10cmVlCisgKiBpcyB1cGRhdGVkIGFuZCBjb3JyZWN0LiBPbmx5IHJlYXNvbiB3ZSBuZWVkIHRvIGNoZWNrIGFnYWluc3QgZGV2aWNlLXRyZWUKKyAqIHdvdWxkIGJlIGlmIHdlIGFsbG93IHVzZXItbGFuZCB0byBzcGVjaWZ5IGEgbWVtb3J5IHJhbmdlIHRocm91Z2ggYQorICogc3lzdGVtIGNhbGwvaW9jdGwgZXRjLiBpbnN0ZWFkIG9mIGRvaW5nIG9mZmxpbmUvb25saW5lIHRocm91Z2ggL3N5c2ZzLgorICovCitpbnQKK3dhbGtfbWVtb3J5X3Jlc291cmNlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLCB2b2lkICphcmcsCisJCQlpbnQgKCpmdW5jKSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB2b2lkICopKQoreworCXJldHVybiAgKCpmdW5jKShzdGFydF9wZm4sIG5yX3BhZ2VzLCBhcmcpOworfQorCiAjZW5kaWYgLyogQ09ORklHX01FTU9SWV9IT1RQTFVHICovCiAKIHZvaWQgc2hvd19tZW0odm9pZCkKQEAgLTIyMCwxMiArMjUzLDEzIEBACiAJCQkJICAgICBsbWJfc2l6ZV9ieXRlcygmbG1iLnJlc2VydmVkLCBpKSAtIDE7CiAJCWlmIChhZGRyIDwgdG90YWxfbG93bWVtKQogCQkJcmVzZXJ2ZV9ib290bWVtKGxtYi5yZXNlcnZlZC5yZWdpb25baV0uYmFzZSwKLQkJCQkJbG1iX3NpemVfYnl0ZXMoJmxtYi5yZXNlcnZlZCwgaSkpOworCQkJCQlsbWJfc2l6ZV9ieXRlcygmbG1iLnJlc2VydmVkLCBpKSwKKwkJCQkJQk9PVE1FTV9ERUZBVUxUKTsKIAkJZWxzZSBpZiAobG1iLnJlc2VydmVkLnJlZ2lvbltpXS5iYXNlIDwgdG90YWxfbG93bWVtKSB7CiAJCQl1bnNpZ25lZCBsb25nIGFkanVzdGVkX3NpemUgPSB0b3RhbF9sb3dtZW0gLQogCQkJCSAgICAgIGxtYi5yZXNlcnZlZC5yZWdpb25baV0uYmFzZTsKIAkJCXJlc2VydmVfYm9vdG1lbShsbWIucmVzZXJ2ZWQucmVnaW9uW2ldLmJhc2UsCi0JCQkJCWFkanVzdGVkX3NpemUpOworCQkJCQlhZGp1c3RlZF9zaXplLCBCT09UTUVNX0RFRkFVTFQpOwogCQl9CiAJfQogI2Vsc2UKQEAgLTIzNCw3ICsyNjgsOCBAQAogCS8qIHJlc2VydmUgdGhlIHNlY3Rpb25zIHdlJ3JlIGFscmVhZHkgdXNpbmcgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbG1iLnJlc2VydmVkLmNudDsgaSsrKQogCQlyZXNlcnZlX2Jvb3RtZW0obG1iLnJlc2VydmVkLnJlZ2lvbltpXS5iYXNlLAotCQkJCWxtYl9zaXplX2J5dGVzKCZsbWIucmVzZXJ2ZWQsIGkpKTsKKwkJCQlsbWJfc2l6ZV9ieXRlcygmbG1iLnJlc2VydmVkLCBpKSwKKwkJCQlCT09UTUVNX0RFRkFVTFQpOwogCiAjZW5kaWYKIAkvKiBYWFggbmVlZCB0byBjbGlwIHRoaXMgaWYgdXNpbmcgaGlnaG1lbT8gKi8KQEAgLTQ4Myw3ICs1MTgsMTIgQEAKIAkJICovCiAJCV90bGJpZShhZGRyZXNzLCAwIC8qIDh4eCBkb2Vzbid0IGNhcmUgYWJvdXQgUElEICovKTsKICNlbmRpZgotCQlpZiAoIVBhZ2VSZXNlcnZlZChwYWdlKQorCQkvKiBUaGUgX1BBR0VfVVNFUiB0ZXN0IHNob3VsZCByZWFsbHkgYmUgX1BBR0VfRVhFQywgYnV0CisJCSAqIG9sZGVyIGdsaWJjIHZlcnNpb25zIGV4ZWN1dGUgc29tZSBjb2RlIGZyb20gbm8tZXhlYworCQkgKiBwYWdlcywgd2hpY2ggZm9yIG5vdyB3ZSBhcmUgc3VwcG9ydGluZy4gIElmIGV4ZWMtb25seQorCQkgKiBwYWdlcyBhcmUgZXZlciBpbXBsZW1lbnRlZCwgdGhpcyB3aWxsIGhhdmUgdG8gY2hhbmdlLgorCQkgKi8KKwkJaWYgKCFQYWdlUmVzZXJ2ZWQocGFnZSkgJiYgKHB0ZV92YWwocHRlKSAmIF9QQUdFX1VTRVIpCiAJCSAgICAmJiAhdGVzdF9iaXQoUEdfYXJjaF8xLCAmcGFnZS0+ZmxhZ3MpKSB7CiAJCQlpZiAodm1hLT52bV9tbSA9PSBjdXJyZW50LT5hY3RpdmVfbW0pIHsKIAkJCQlfX2ZsdXNoX2RjYWNoZV9pY2FjaGUoKHZvaWQgKikgYWRkcmVzcyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbnVtYS5jIGIvYXJjaC9wb3dlcnBjL21tL251bWEuYwppbmRleCBjMTJhZGMzZGQuLmEzMDBkMjUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL251bWEuYwpAQCAtMjQsNiArMjQsOCBAQAogCiBzdGF0aWMgaW50IG51bWFfZW5hYmxlZCA9IDE7CiAKK3N0YXRpYyBjaGFyICpjbWRsaW5lIF9faW5pdGRhdGE7CisKIHN0YXRpYyBpbnQgbnVtYV9kZWJ1ZzsKICNkZWZpbmUgZGJnKGFyZ3MuLi4pIGlmIChudW1hX2RlYnVnKSB7IHByaW50ayhLRVJOX0lORk8gYXJncyk7IH0KIApAQCAtMzksNiArNDEsNTMgQEAKIHN0YXRpYyBpbnQgbWluX2NvbW1vbl9kZXB0aDsKIHN0YXRpYyBpbnQgbl9tZW1fYWRkcl9jZWxscywgbl9tZW1fc2l6ZV9jZWxsczsKIAorc3RhdGljIGludCBfX2NwdWluaXQgZmFrZV9udW1hX2NyZWF0ZV9uZXdfbm9kZSh1bnNpZ25lZCBsb25nIGVuZF9wZm4sCisJCQkJCQl1bnNpZ25lZCBpbnQgKm5pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgbWVtOworCWNoYXIgKnAgPSBjbWRsaW5lOworCXN0YXRpYyB1bnNpZ25lZCBpbnQgZmFrZV9uaWQ7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBjdXJyX2JvdW5kYXJ5OworCisJLyoKKwkgKiBNb2RpZnkgbm9kZSBpZCwgaWZmIHdlIHN0YXJ0ZWQgY3JlYXRpbmcgTlVNQSBub2RlcworCSAqIFdlIHdhbnQgdG8gY29udGludWUgZnJvbSB3aGVyZSB3ZSBsZWZ0IG9mIHRoZSBsYXN0IHRpbWUKKwkgKi8KKwlpZiAoZmFrZV9uaWQpCisJCSpuaWQgPSBmYWtlX25pZDsKKwkvKgorCSAqIEluIGNhc2UgdGhlcmUgYXJlIG5vIG1vcmUgYXJndW1lbnRzIHRvIHBhcnNlLCB0aGUKKwkgKiBub2RlX2lkIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgbGFzdCBmYWtlIG5vZGUgaWQKKwkgKiAod2UndmUgaGFuZGxlZCB0aGlzIGFib3ZlKS4KKwkgKi8KKwlpZiAoIXApCisJCXJldHVybiAwOworCisJbWVtID0gbWVtcGFyc2UocCwgJnApOworCWlmICghbWVtKQorCQlyZXR1cm4gMDsKKworCWlmIChtZW0gPCBjdXJyX2JvdW5kYXJ5KQorCQlyZXR1cm4gMDsKKworCWN1cnJfYm91bmRhcnkgPSBtZW07CisKKwlpZiAoKGVuZF9wZm4gPDwgUEFHRV9TSElGVCkgPiBtZW0pIHsKKwkJLyoKKwkJICogU2tpcCBjb21tYXMgYW5kIHNwYWNlcworCQkgKi8KKwkJd2hpbGUgKCpwID09ICcsJyB8fCAqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JykKKwkJCXArKzsKKworCQljbWRsaW5lID0gcDsKKwkJZmFrZV9uaWQrKzsKKwkJKm5pZCA9IGZha2VfbmlkOworCQlkYmcoImNyZWF0ZWQgbmV3IGZha2Vfbm9kZSB3aXRoIGlkICVkXG4iLCBmYWtlX25pZCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgX19jcHVpbml0IG1hcF9jcHVfdG9fbm9kZShpbnQgY3B1LCBpbnQgbm9kZSkKIHsKIAludW1hX2NwdV9sb29rdXBfdGFibGVbY3B1XSA9IG5vZGU7CkBAIC0zNDQsNiArMzkzLDkgQEAKIAkJCWlmIChuaWQgPT0gMHhmZmZmIHx8IG5pZCA+PSBNQVhfTlVNTk9ERVMpCiAJCQkJbmlkID0gZGVmYXVsdF9uaWQ7CiAJCX0KKworCQlmYWtlX251bWFfY3JlYXRlX25ld19ub2RlKCgoc3RhcnQgKyBsbWJfc2l6ZSkgPj4gUEFHRV9TSElGVCksCisJCQkJCQkmbmlkKTsKIAkJbm9kZV9zZXRfb25saW5lKG5pZCk7CiAKIAkJc2l6ZSA9IG51bWFfZW5mb3JjZV9tZW1vcnlfbGltaXQoc3RhcnQsIGxtYl9zaXplKTsKQEAgLTQyOSw2ICs0ODEsOCBAQAogCQluaWQgPSBvZl9ub2RlX3RvX25pZF9zaW5nbGUobWVtb3J5KTsKIAkJaWYgKG5pZCA8IDApCiAJCQluaWQgPSBkZWZhdWx0X25pZDsKKworCQlmYWtlX251bWFfY3JlYXRlX25ld19ub2RlKCgoc3RhcnQgKyBzaXplKSA+PiBQQUdFX1NISUZUKSwgJm5pZCk7CiAJCW5vZGVfc2V0X29ubGluZShuaWQpOwogCiAJCWlmICghKHNpemUgPSBudW1hX2VuZm9yY2VfbWVtb3J5X2xpbWl0KHN0YXJ0LCBzaXplKSkpIHsKQEAgLTQ2MSw3ICs1MTUsNyBAQAogCXVuc2lnbmVkIGxvbmcgdG9wX29mX3JhbSA9IGxtYl9lbmRfb2ZfRFJBTSgpOwogCXVuc2lnbmVkIGxvbmcgdG90YWxfcmFtID0gbG1iX3BoeXNfbWVtX3NpemUoKTsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgZW5kX3BmbjsKLQl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaSwgbmlkID0gMDsKIAogCXByaW50ayhLRVJOX0RFQlVHICJUb3Agb2YgUkFNOiAweCVseCwgVG90YWwgUkFNOiAweCVseFxuIiwKIAkgICAgICAgdG9wX29mX3JhbSwgdG90YWxfcmFtKTsKQEAgLTQ3MSw5ICs1MjUsMTEgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbG1iLm1lbW9yeS5jbnQ7ICsraSkgewogCQlzdGFydF9wZm4gPSBsbWIubWVtb3J5LnJlZ2lvbltpXS5iYXNlID4+IFBBR0VfU0hJRlQ7CiAJCWVuZF9wZm4gPSBzdGFydF9wZm4gKyBsbWJfc2l6ZV9wYWdlcygmbG1iLm1lbW9yeSwgaSk7Ci0JCWFkZF9hY3RpdmVfcmFuZ2UoMCwgc3RhcnRfcGZuLCBlbmRfcGZuKTsKKworCQlmYWtlX251bWFfY3JlYXRlX25ld19ub2RlKGVuZF9wZm4sICZuaWQpOworCQlhZGRfYWN0aXZlX3JhbmdlKG5pZCwgc3RhcnRfcGZuLCBlbmRfcGZuKTsKKwkJbm9kZV9zZXRfb25saW5lKG5pZCk7CiAJfQotCW5vZGVfc2V0X29ubGluZSgwKTsKIH0KIAogdm9pZCBfX2luaXQgZHVtcF9udW1hX2NwdV90b3BvbG9neSh2b2lkKQpAQCAtNjc1LDcgKzczMSw3IEBACiAJCQkJZGJnKCJyZXNlcnZlX2Jvb3RtZW0gJWx4ICVseFxuIiwgcGh5c2Jhc2UsCiAJCQkJICAgIHNpemUpOwogCQkJCXJlc2VydmVfYm9vdG1lbV9ub2RlKE5PREVfREFUQShuaWQpLCBwaHlzYmFzZSwKLQkJCQkJCSAgICAgc2l6ZSk7CisJCQkJCQkgICAgIHNpemUsIEJPT1RNRU1fREVGQVVMVCk7CiAJCQl9CiAJCX0KIApAQCAtNzAyLDYgKzc1OCwxMCBAQAogCWlmIChzdHJzdHIocCwgImRlYnVnIikpCiAJCW51bWFfZGVidWcgPSAxOwogCisJcCA9IHN0cnN0cihwLCAiZmFrZT0iKTsKKwlpZiAocCkKKwkJY21kbGluZSA9IHAgKyBzdHJsZW4oImZha2U9Iik7CisKIAlyZXR1cm4gMDsKIH0KIGVhcmx5X3BhcmFtKCJudW1hIiwgZWFybHlfbnVtYSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV8zMi5jIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGVfMzIuYwppbmRleCBmODBmOTBjLi5hYzMzOTBmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZV8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlXzMyLmMKQEAgLTEwNywxOSArMTA3LDIwIEBACiAJcmV0dXJuIHB0ZTsKIH0KIAotc3RydWN0IHBhZ2UgKnB0ZV9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3BndGFibGVfdCBwdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7CiAJc3RydWN0IHBhZ2UgKnB0ZXBhZ2U7CiAKICNpZmRlZiBDT05GSUdfSElHSFBURQotCWdmcF90IGZsYWdzID0gR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0gfCBfX0dGUF9SRVBFQVQ7CisJZ2ZwX3QgZmxhZ3MgPSBHRlBfS0VSTkVMIHwgX19HRlBfSElHSE1FTSB8IF9fR0ZQX1JFUEVBVCB8IF9fR0ZQX1pFUk87CiAjZWxzZQotCWdmcF90IGZsYWdzID0gR0ZQX0tFUk5FTCB8IF9fR0ZQX1JFUEVBVDsKKwlnZnBfdCBmbGFncyA9IEdGUF9LRVJORUwgfCBfX0dGUF9SRVBFQVQgfCBfX0dGUF9aRVJPOwogI2VuZGlmCiAKIAlwdGVwYWdlID0gYWxsb2NfcGFnZXMoZmxhZ3MsIDApOwotCWlmIChwdGVwYWdlKQotCQljbGVhcl9oaWdocGFnZShwdGVwYWdlKTsKKwlpZiAoIXB0ZXBhZ2UpCisJCXJldHVybiBOVUxMOworCXBndGFibGVfcGFnZV9jdG9yKHB0ZXBhZ2UpOwogCXJldHVybiBwdGVwYWdlOwogfQogCkBAIC0xMzEsMTEgKzEzMiwxMiBAQAogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwdGUpOwogfQogCi12b2lkIHB0ZV9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgcGFnZSAqcHRlcGFnZSkKK3ZvaWQgcHRlX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBndGFibGVfdCBwdGVwYWdlKQogewogI2lmZGVmIENPTkZJR19TTVAKIAloYXNoX3BhZ2Vfc3luYygpOwogI2VuZGlmCisJcGd0YWJsZV9wYWdlX2R0b3IocHRlcGFnZSk7CiAJX19mcmVlX3BhZ2UocHRlcGFnZSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9NYWtlZmlsZQppbmRleCBjNWY2NGMzLi4yZWY2YjBkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL01ha2VmaWxlCkBAIC0xNSw1ICsxNSw1IEBACiAJCWNlbGwvc3B1X3Byb2ZpbGVyLm8gY2VsbC92bWFfbWFwLm8gXAogCQljZWxsL3NwdV90YXNrX3N5bmMubwogb3Byb2ZpbGUtJChDT05GSUdfUFBDNjQpICs9IG9wX21vZGVsX3JzNjQubyBvcF9tb2RlbF9wb3dlcjQubyBvcF9tb2RlbF9wYTZ0Lm8KLW9wcm9maWxlLSQoQ09ORklHX0ZTTF9CT09LRSkgKz0gb3BfbW9kZWxfZnNsX2Jvb2tlLm8KK29wcm9maWxlLSQoQ09ORklHX0ZTTF9FTUJfUEVSRk1PTikgKz0gb3BfbW9kZWxfZnNsX2VtYi5vCiBvcHJvZmlsZS0kKENPTkZJR182eHgpICs9IG9wX21vZGVsXzc0NTAubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NvbW1vbi5jIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NvbW1vbi5jCmluZGV4IGEyOGNjZTEuLjQ5MDhkYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jb21tb24uYworKysgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY29tbW9uLmMKQEAgLTIwMiw5ICsyMDIsOSBAQAogCQkJbW9kZWwgPSAmb3BfbW9kZWxfNzQ1MDsKIAkJCWJyZWFrOwogI2VuZGlmCi0jaWZkZWYgQ09ORklHX0ZTTF9CT09LRQotCQljYXNlIFBQQ19PUFJPRklMRV9CT09LRToKLQkJCW1vZGVsID0gJm9wX21vZGVsX2ZzbF9ib29rZTsKKyNpZiBkZWZpbmVkKENPTkZJR19GU0xfRU1CX1BFUkZNT04pCisJCWNhc2UgUFBDX09QUk9GSUxFX0ZTTF9FTUI6CisJCQltb2RlbCA9ICZvcF9tb2RlbF9mc2xfZW1iOwogCQkJYnJlYWs7CiAjZW5kaWYKIAkJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9mc2xfYm9va2UuYyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9mc2xfYm9va2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgzYTI4Yi4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfZnNsX2Jvb2tlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotLyoKLSAqIGFyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9mc2xfYm9va2UuYwotICoKLSAqIEZyZWVzY2FsZSBCb29rLUUgb3Byb2ZpbGUgc3VwcG9ydCwgYmFzZWQgb24gcHBjNjQgb3Byb2ZpbGUgc3VwcG9ydAotICogQ29weXJpZ2h0IChDKSAyMDA0IEFudG9uIEJsYW5jaGFyZCA8YW50b25AYXUuaWJtLmNvbT4sIElCTQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jCi0gKgotICogQXV0aG9yOiBBbmR5IEZsZW1pbmcKLSAqIE1haW50YWluZXI6IEt1bWFyIEdhbGEgPGdhbGFrQGtlcm5lbC5jcmFzaGluZy5vcmc+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvb3Byb2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3JlZ19ib29rZS5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL3BtYy5oPgotI2luY2x1ZGUgPGFzbS9vcHJvZmlsZV9pbXBsLmg+Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlc2V0X3ZhbHVlW09QX01BWF9DT1VOVEVSXTsKLQotc3RhdGljIGludCBudW1fY291bnRlcnM7Ci1zdGF0aWMgaW50IG9wcm9maWxlX3J1bm5pbmc7Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIGdldF9wbWxjYShpbnQgY3RyKQotewotCXUzMiBwbWxjYTsKLQotCXN3aXRjaCAoY3RyKSB7Ci0JCWNhc2UgMDoKLQkJCXBtbGNhID0gbWZwbXIoUE1STl9QTUxDQTApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCXBtbGNhID0gbWZwbXIoUE1STl9QTUxDQTEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCXBtbGNhID0gbWZwbXIoUE1STl9QTUxDQTIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCXBtbGNhID0gbWZwbXIoUE1STl9QTUxDQTMpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwYW5pYygiQmFkIGN0ciBudW1iZXJcbiIpOwotCX0KLQotCXJldHVybiBwbWxjYTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNldF9wbWxjYShpbnQgY3RyLCB1MzIgcG1sY2EpCi17Ci0Jc3dpdGNoIChjdHIpIHsKLQkJY2FzZSAwOgotCQkJbXRwbXIoUE1STl9QTUxDQTAsIHBtbGNhKTsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQltdHBtcihQTVJOX1BNTENBMSwgcG1sY2EpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCW10cG1yKFBNUk5fUE1MQ0EyLCBwbWxjYSk7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJbXRwbXIoUE1STl9QTUxDQTMsIHBtbGNhKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcGFuaWMoIkJhZCBjdHIgbnVtYmVyXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGN0cl9yZWFkKHVuc2lnbmVkIGludCBpKQotewotCXN3aXRjaChpKSB7Ci0JCWNhc2UgMDoKLQkJCXJldHVybiBtZnBtcihQTVJOX1BNQzApOwotCQljYXNlIDE6Ci0JCQlyZXR1cm4gbWZwbXIoUE1STl9QTUMxKTsKLQkJY2FzZSAyOgotCQkJcmV0dXJuIG1mcG1yKFBNUk5fUE1DMik7Ci0JCWNhc2UgMzoKLQkJCXJldHVybiBtZnBtcihQTVJOX1BNQzMpOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIDA7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY3RyX3dyaXRlKHVuc2lnbmVkIGludCBpLCB1bnNpZ25lZCBpbnQgdmFsKQotewotCXN3aXRjaChpKSB7Ci0JCWNhc2UgMDoKLQkJCW10cG1yKFBNUk5fUE1DMCwgdmFsKTsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQltdHBtcihQTVJOX1BNQzEsIHZhbCk7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJbXRwbXIoUE1STl9QTUMyLCB2YWwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCW10cG1yKFBNUk5fUE1DMywgdmFsKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JfQotfQotCi0KLXN0YXRpYyB2b2lkIGluaXRfcG1jX3N0b3AoaW50IGN0cikKLXsKLQl1MzIgcG1sY2EgPSAoUE1MQ0FfRkMgfCBQTUxDQV9GQ1MgfCBQTUxDQV9GQ1UgfAotCQkJUE1MQ0FfRkNNMSB8IFBNTENBX0ZDTTApOwotCXUzMiBwbWxjYiA9IDA7Ci0KLQlzd2l0Y2ggKGN0cikgewotCQljYXNlIDA6Ci0JCQltdHBtcihQTVJOX1BNTENBMCwgcG1sY2EpOwotCQkJbXRwbXIoUE1STl9QTUxDQjAsIHBtbGNiKTsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQltdHBtcihQTVJOX1BNTENBMSwgcG1sY2EpOwotCQkJbXRwbXIoUE1STl9QTUxDQjEsIHBtbGNiKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQltdHBtcihQTVJOX1BNTENBMiwgcG1sY2EpOwotCQkJbXRwbXIoUE1STl9QTUxDQjIsIHBtbGNiKTsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQltdHBtcihQTVJOX1BNTENBMywgcG1sY2EpOwotCQkJbXRwbXIoUE1STl9QTUxDQjMsIHBtbGNiKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcGFuaWMoIkJhZCBjdHIgbnVtYmVyIVxuIik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBzZXRfcG1jX2V2ZW50KGludCBjdHIsIGludCBldmVudCkKLXsKLQl1MzIgcG1sY2E7Ci0KLQlwbWxjYSA9IGdldF9wbWxjYShjdHIpOwotCi0JcG1sY2EgPSAocG1sY2EgJiB+UE1MQ0FfRVZFTlRfTUFTSykgfAotCQkoKGV2ZW50IDw8IFBNTENBX0VWRU5UX1NISUZUKSAmCi0JCSBQTUxDQV9FVkVOVF9NQVNLKTsKLQotCXNldF9wbWxjYShjdHIsIHBtbGNhKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0X3BtY191c2VyX2tlcm5lbChpbnQgY3RyLCBpbnQgdXNlciwgaW50IGtlcm5lbCkKLXsKLQl1MzIgcG1sY2E7Ci0KLQlwbWxjYSA9IGdldF9wbWxjYShjdHIpOwotCi0JaWYodXNlcikKLQkJcG1sY2EgJj0gflBNTENBX0ZDVTsKLQllbHNlCi0JCXBtbGNhIHw9IFBNTENBX0ZDVTsKLQotCWlmKGtlcm5lbCkKLQkJcG1sY2EgJj0gflBNTENBX0ZDUzsKLQllbHNlCi0JCXBtbGNhIHw9IFBNTENBX0ZDUzsKLQotCXNldF9wbWxjYShjdHIsIHBtbGNhKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0X3BtY19tYXJrZWQoaW50IGN0ciwgaW50IG1hcmswLCBpbnQgbWFyazEpCi17Ci0JdTMyIHBtbGNhID0gZ2V0X3BtbGNhKGN0cik7Ci0KLQlpZihtYXJrMCkKLQkJcG1sY2EgJj0gflBNTENBX0ZDTTA7Ci0JZWxzZQotCQlwbWxjYSB8PSBQTUxDQV9GQ00wOwotCi0JaWYobWFyazEpCi0JCXBtbGNhICY9IH5QTUxDQV9GQ00xOwotCWVsc2UKLQkJcG1sY2EgfD0gUE1MQ0FfRkNNMTsKLQotCXNldF9wbWxjYShjdHIsIHBtbGNhKTsKLX0KLQotc3RhdGljIHZvaWQgcG1jX3N0YXJ0X2N0cihpbnQgY3RyLCBpbnQgZW5hYmxlKQotewotCXUzMiBwbWxjYSA9IGdldF9wbWxjYShjdHIpOwotCi0JcG1sY2EgJj0gflBNTENBX0ZDOwotCi0JaWYgKGVuYWJsZSkKLQkJcG1sY2EgfD0gUE1MQ0FfQ0U7Ci0JZWxzZQotCQlwbWxjYSAmPSB+UE1MQ0FfQ0U7Ci0KLQlzZXRfcG1sY2EoY3RyLCBwbWxjYSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBtY19zdGFydF9jdHJzKGludCBlbmFibGUpCi17Ci0JdTMyIHBtZ2MwID0gbWZwbXIoUE1STl9QTUdDMCk7Ci0KLQlwbWdjMCAmPSB+UE1HQzBfRkFDOwotCXBtZ2MwIHw9IFBNR0MwX0ZDRUNFOwotCi0JaWYgKGVuYWJsZSkKLQkJcG1nYzAgfD0gUE1HQzBfUE1JRTsKLQllbHNlCi0JCXBtZ2MwICY9IH5QTUdDMF9QTUlFOwotCi0JbXRwbXIoUE1STl9QTUdDMCwgcG1nYzApOwotfQotCi1zdGF0aWMgdm9pZCBwbWNfc3RvcF9jdHJzKHZvaWQpCi17Ci0JdTMyIHBtZ2MwID0gbWZwbXIoUE1STl9QTUdDMCk7Ci0KLQlwbWdjMCB8PSBQTUdDMF9GQUM7Ci0KLQlwbWdjMCAmPSB+KFBNR0MwX1BNSUUgfCBQTUdDMF9GQ0VDRSk7Ci0KLQltdHBtcihQTVJOX1BNR0MwLCBwbWdjMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGR1bXBfcG1jcyh2b2lkKQotewotCXByaW50aygicG1nYzA6ICV4XG4iLCBtZnBtcihQTVJOX1BNR0MwKSk7Ci0JcHJpbnRrKCJwbWNcdFx0cG1sY2FcdFx0cG1sY2JcbiIpOwotCXByaW50aygiJTh4XHQlOHhcdCU4eFxuIiwgbWZwbXIoUE1STl9QTUMwKSwKLQkJCW1mcG1yKFBNUk5fUE1MQ0EwKSwgbWZwbXIoUE1STl9QTUxDQjApKTsKLQlwcmludGsoIiU4eFx0JTh4XHQlOHhcbiIsIG1mcG1yKFBNUk5fUE1DMSksCi0JCQltZnBtcihQTVJOX1BNTENBMSksIG1mcG1yKFBNUk5fUE1MQ0IxKSk7Ci0JcHJpbnRrKCIlOHhcdCU4eFx0JTh4XG4iLCBtZnBtcihQTVJOX1BNQzIpLAotCQkJbWZwbXIoUE1STl9QTUxDQTIpLCBtZnBtcihQTVJOX1BNTENCMikpOwotCXByaW50aygiJTh4XHQlOHhcdCU4eFxuIiwgbWZwbXIoUE1STl9QTUMzKSwKLQkJCW1mcG1yKFBNUk5fUE1MQ0EzKSwgbWZwbXIoUE1STl9QTUxDQjMpKTsKLX0KLQotc3RhdGljIGludCBmc2xfYm9va2VfY3B1X3NldHVwKHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqY3RyKQotewotCWludCBpOwotCi0JLyogZnJlZXplIGFsbCBjb3VudGVycyAqLwotCXBtY19zdG9wX2N0cnMoKTsKLQotCWZvciAoaSA9IDA7aSA8IG51bV9jb3VudGVycztpKyspIHsKLQkJaW5pdF9wbWNfc3RvcChpKTsKLQotCQlzZXRfcG1jX2V2ZW50KGksIGN0cltpXS5ldmVudCk7Ci0KLQkJc2V0X3BtY191c2VyX2tlcm5lbChpLCBjdHJbaV0udXNlciwgY3RyW2ldLmtlcm5lbCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZnNsX2Jvb2tlX3JlZ19zZXR1cChzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKmN0ciwKLQkJCSAgICAgc3RydWN0IG9wX3N5c3RlbV9jb25maWcgKnN5cywKLQkJCSAgICAgaW50IG51bV9jdHJzKQotewotCWludCBpOwotCi0JbnVtX2NvdW50ZXJzID0gbnVtX2N0cnM7Ci0KLQkvKiBPdXIgY291bnRlcnMgY291bnQgdXAsIGFuZCAiY291bnQiIHJlZmVycyB0bwotCSAqIGhvdyBtdWNoIGJlZm9yZSB0aGUgbmV4dCBpbnRlcnJ1cHQsIGFuZCB3ZSBpbnRlcnJ1cHQKLQkgKiBvbiBvdmVyZmxvdy4gIFNvIHdlIGNhbGN1bGF0ZSB0aGUgc3RhcnRpbmcgdmFsdWUKLQkgKiB3aGljaCB3aWxsIGdpdmUgdXMgImNvdW50IiB1bnRpbCBvdmVyZmxvdy4KLQkgKiBUaGVuIHdlIHNldCB0aGUgZXZlbnRzIG9uIHRoZSBlbmFibGVkIGNvdW50ZXJzICovCi0JZm9yIChpID0gMDsgaSA8IG51bV9jb3VudGVyczsgKytpKQotCQlyZXNldF92YWx1ZVtpXSA9IDB4ODAwMDAwMDBVTCAtIGN0cltpXS5jb3VudDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGZzbF9ib29rZV9zdGFydChzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKmN0cikKLXsKLQlpbnQgaTsKLQotCW10bXNyKG1mbXNyKCkgfCBNU1JfUE1NKTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fY291bnRlcnM7ICsraSkgewotCQlpZiAoY3RyW2ldLmVuYWJsZWQpIHsKLQkJCWN0cl93cml0ZShpLCByZXNldF92YWx1ZVtpXSk7Ci0JCQkvKiBTZXQgZWFjaCBlbmFibGVkIGNvdW50ZXIgdG8gb25seQotCQkJICogY291bnQgd2hlbiB0aGUgTWFyayBiaXQgaXMgKm5vdCogc2V0ICovCi0JCQlzZXRfcG1jX21hcmtlZChpLCAxLCAwKTsKLQkJCXBtY19zdGFydF9jdHIoaSwgMSk7Ci0JCX0gZWxzZSB7Ci0JCQljdHJfd3JpdGUoaSwgMCk7Ci0KLQkJCS8qIFNldCB0aGUgY3RyIHRvIGJlIHN0b3BwZWQgKi8KLQkJCXBtY19zdGFydF9jdHIoaSwgMCk7Ci0JCX0KLQl9Ci0KLQkvKiBDbGVhciB0aGUgZnJlZXplIGJpdCwgYW5kIGVuYWJsZSB0aGUgaW50ZXJydXB0LgotCSAqIFRoZSBjb3VudGVycyB3b24ndCBhY3R1YWxseSBzdGFydCB1bnRpbCB0aGUgcmZpIGNsZWFycwotCSAqIHRoZSBQTU0gYml0ICovCi0JcG1jX3N0YXJ0X2N0cnMoMSk7Ci0KLQlvcHJvZmlsZV9ydW5uaW5nID0gMTsKLQotCXByX2RlYnVnKCJzdGFydCBvbiBjcHUgJWQsIHBtZ2MwICV4XG4iLCBzbXBfcHJvY2Vzc29yX2lkKCksCi0JCQltZnBtcihQTVJOX1BNR0MwKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZnNsX2Jvb2tlX3N0b3Aodm9pZCkKLXsKLQkvKiBmcmVlemUgY291bnRlcnMgKi8KLQlwbWNfc3RvcF9jdHJzKCk7Ci0KLQlvcHJvZmlsZV9ydW5uaW5nID0gMDsKLQotCXByX2RlYnVnKCJzdG9wIG9uIGNwdSAlZCwgcG1nYzAgJXhcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwKLQkJCW1mcG1yKFBNUk5fUE1HQzApKTsKLQotCW1iKCk7Ci19Ci0KLQotc3RhdGljIHZvaWQgZnNsX2Jvb2tlX2hhbmRsZV9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkJICAgIHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqY3RyKQotewotCXVuc2lnbmVkIGxvbmcgcGM7Ci0JaW50IGlzX2tlcm5lbDsKLQlpbnQgdmFsOwotCWludCBpOwotCi0JLyogc2V0IHRoZSBQTU0gYml0IChzZWUgY29tbWVudCBiZWxvdykgKi8KLQltdG1zcihtZm1zcigpIHwgTVNSX1BNTSk7Ci0KLQlwYyA9IHJlZ3MtPm5pcDsKLQlpc19rZXJuZWwgPSBpc19rZXJuZWxfYWRkcihwYyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvdW50ZXJzOyArK2kpIHsKLQkJdmFsID0gY3RyX3JlYWQoaSk7Ci0JCWlmICh2YWwgPCAwKSB7Ci0JCQlpZiAob3Byb2ZpbGVfcnVubmluZyAmJiBjdHJbaV0uZW5hYmxlZCkgewotCQkJCW9wcm9maWxlX2FkZF9leHRfc2FtcGxlKHBjLCByZWdzLCBpLCBpc19rZXJuZWwpOwotCQkJCWN0cl93cml0ZShpLCByZXNldF92YWx1ZVtpXSk7Ci0JCQl9IGVsc2UgewotCQkJCWN0cl93cml0ZShpLCAwKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIFRoZSBmcmVlemUgYml0IHdhcyBzZXQgYnkgdGhlIGludGVycnVwdC4gKi8KLQkvKiBDbGVhciB0aGUgZnJlZXplIGJpdCwgYW5kIHJlZW5hYmxlIHRoZSBpbnRlcnJ1cHQuCi0JICogVGhlIGNvdW50ZXJzIHdvbid0IGFjdHVhbGx5IHN0YXJ0IHVudGlsIHRoZSByZmkgY2xlYXJzCi0JICogdGhlIFBNTSBiaXQgKi8KLQlwbWNfc3RhcnRfY3RycygxKTsKLX0KLQotc3RydWN0IG9wX3Bvd2VycGNfbW9kZWwgb3BfbW9kZWxfZnNsX2Jvb2tlID0gewotCS5yZWdfc2V0dXAJCT0gZnNsX2Jvb2tlX3JlZ19zZXR1cCwKLQkuY3B1X3NldHVwCQk9IGZzbF9ib29rZV9jcHVfc2V0dXAsCi0JLnN0YXJ0CQkJPSBmc2xfYm9va2Vfc3RhcnQsCi0JLnN0b3AJCQk9IGZzbF9ib29rZV9zdG9wLAotCS5oYW5kbGVfaW50ZXJydXB0CT0gZnNsX2Jvb2tlX2hhbmRsZV9pbnRlcnJ1cHQsCi19OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX2ZzbF9lbWIuYyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9mc2xfZW1iLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE1OTZmNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9mc2xfZW1iLmMKQEAgLTAsMCArMSwzNjkgQEAKKy8qCisgKiBGcmVlc2NhbGUgRW1iZWRkZWQgb3Byb2ZpbGUgc3VwcG9ydCwgYmFzZWQgb24gcHBjNjQgb3Byb2ZpbGUgc3VwcG9ydAorICogQ29weXJpZ2h0IChDKSAyMDA0IEFudG9uIEJsYW5jaGFyZCA8YW50b25AYXUuaWJtLmNvbT4sIElCTQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jCisgKgorICogQXV0aG9yOiBBbmR5IEZsZW1pbmcKKyAqIE1haW50YWluZXI6IEt1bWFyIEdhbGEgPGdhbGFrQGtlcm5lbC5jcmFzaGluZy5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvb3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3JlZ19mc2xfZW1iLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcG1jLmg+CisjaW5jbHVkZSA8YXNtL29wcm9maWxlX2ltcGwuaD4KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVzZXRfdmFsdWVbT1BfTUFYX0NPVU5URVJdOworCitzdGF0aWMgaW50IG51bV9jb3VudGVyczsKK3N0YXRpYyBpbnQgb3Byb2ZpbGVfcnVubmluZzsKKworc3RhdGljIGlubGluZSB1MzIgZ2V0X3BtbGNhKGludCBjdHIpCit7CisJdTMyIHBtbGNhOworCisJc3dpdGNoIChjdHIpIHsKKwkJY2FzZSAwOgorCQkJcG1sY2EgPSBtZnBtcihQTVJOX1BNTENBMCk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJcG1sY2EgPSBtZnBtcihQTVJOX1BNTENBMSk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcG1sY2EgPSBtZnBtcihQTVJOX1BNTENBMik7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJcG1sY2EgPSBtZnBtcihQTVJOX1BNTENBMyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXBhbmljKCJCYWQgY3RyIG51bWJlclxuIik7CisJfQorCisJcmV0dXJuIHBtbGNhOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3BtbGNhKGludCBjdHIsIHUzMiBwbWxjYSkKK3sKKwlzd2l0Y2ggKGN0cikgeworCQljYXNlIDA6CisJCQltdHBtcihQTVJOX1BNTENBMCwgcG1sY2EpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCW10cG1yKFBNUk5fUE1MQ0ExLCBwbWxjYSk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJbXRwbXIoUE1STl9QTUxDQTIsIHBtbGNhKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQltdHBtcihQTVJOX1BNTENBMywgcG1sY2EpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwYW5pYygiQmFkIGN0ciBudW1iZXJcbiIpOworCX0KK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3RyX3JlYWQodW5zaWduZWQgaW50IGkpCit7CisJc3dpdGNoKGkpIHsKKwkJY2FzZSAwOgorCQkJcmV0dXJuIG1mcG1yKFBNUk5fUE1DMCk7CisJCWNhc2UgMToKKwkJCXJldHVybiBtZnBtcihQTVJOX1BNQzEpOworCQljYXNlIDI6CisJCQlyZXR1cm4gbWZwbXIoUE1STl9QTUMyKTsKKwkJY2FzZSAzOgorCQkJcmV0dXJuIG1mcG1yKFBNUk5fUE1DMyk7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjdHJfd3JpdGUodW5zaWduZWQgaW50IGksIHVuc2lnbmVkIGludCB2YWwpCit7CisJc3dpdGNoKGkpIHsKKwkJY2FzZSAwOgorCQkJbXRwbXIoUE1STl9QTUMwLCB2YWwpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCW10cG1yKFBNUk5fUE1DMSwgdmFsKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQltdHBtcihQTVJOX1BNQzIsIHZhbCk7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJbXRwbXIoUE1STl9QTUMzLCB2YWwpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgaW5pdF9wbWNfc3RvcChpbnQgY3RyKQoreworCXUzMiBwbWxjYSA9IChQTUxDQV9GQyB8IFBNTENBX0ZDUyB8IFBNTENBX0ZDVSB8CisJCQlQTUxDQV9GQ00xIHwgUE1MQ0FfRkNNMCk7CisJdTMyIHBtbGNiID0gMDsKKworCXN3aXRjaCAoY3RyKSB7CisJCWNhc2UgMDoKKwkJCW10cG1yKFBNUk5fUE1MQ0EwLCBwbWxjYSk7CisJCQltdHBtcihQTVJOX1BNTENCMCwgcG1sY2IpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCW10cG1yKFBNUk5fUE1MQ0ExLCBwbWxjYSk7CisJCQltdHBtcihQTVJOX1BNTENCMSwgcG1sY2IpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCW10cG1yKFBNUk5fUE1MQ0EyLCBwbWxjYSk7CisJCQltdHBtcihQTVJOX1BNTENCMiwgcG1sY2IpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCW10cG1yKFBNUk5fUE1MQ0EzLCBwbWxjYSk7CisJCQltdHBtcihQTVJOX1BNTENCMywgcG1sY2IpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwYW5pYygiQmFkIGN0ciBudW1iZXIhXG4iKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNldF9wbWNfZXZlbnQoaW50IGN0ciwgaW50IGV2ZW50KQoreworCXUzMiBwbWxjYTsKKworCXBtbGNhID0gZ2V0X3BtbGNhKGN0cik7CisKKwlwbWxjYSA9IChwbWxjYSAmIH5QTUxDQV9FVkVOVF9NQVNLKSB8CisJCSgoZXZlbnQgPDwgUE1MQ0FfRVZFTlRfU0hJRlQpICYKKwkJIFBNTENBX0VWRU5UX01BU0spOworCisJc2V0X3BtbGNhKGN0ciwgcG1sY2EpOworfQorCitzdGF0aWMgdm9pZCBzZXRfcG1jX3VzZXJfa2VybmVsKGludCBjdHIsIGludCB1c2VyLCBpbnQga2VybmVsKQoreworCXUzMiBwbWxjYTsKKworCXBtbGNhID0gZ2V0X3BtbGNhKGN0cik7CisKKwlpZih1c2VyKQorCQlwbWxjYSAmPSB+UE1MQ0FfRkNVOworCWVsc2UKKwkJcG1sY2EgfD0gUE1MQ0FfRkNVOworCisJaWYoa2VybmVsKQorCQlwbWxjYSAmPSB+UE1MQ0FfRkNTOworCWVsc2UKKwkJcG1sY2EgfD0gUE1MQ0FfRkNTOworCisJc2V0X3BtbGNhKGN0ciwgcG1sY2EpOworfQorCitzdGF0aWMgdm9pZCBzZXRfcG1jX21hcmtlZChpbnQgY3RyLCBpbnQgbWFyazAsIGludCBtYXJrMSkKK3sKKwl1MzIgcG1sY2EgPSBnZXRfcG1sY2EoY3RyKTsKKworCWlmKG1hcmswKQorCQlwbWxjYSAmPSB+UE1MQ0FfRkNNMDsKKwllbHNlCisJCXBtbGNhIHw9IFBNTENBX0ZDTTA7CisKKwlpZihtYXJrMSkKKwkJcG1sY2EgJj0gflBNTENBX0ZDTTE7CisJZWxzZQorCQlwbWxjYSB8PSBQTUxDQV9GQ00xOworCisJc2V0X3BtbGNhKGN0ciwgcG1sY2EpOworfQorCitzdGF0aWMgdm9pZCBwbWNfc3RhcnRfY3RyKGludCBjdHIsIGludCBlbmFibGUpCit7CisJdTMyIHBtbGNhID0gZ2V0X3BtbGNhKGN0cik7CisKKwlwbWxjYSAmPSB+UE1MQ0FfRkM7CisKKwlpZiAoZW5hYmxlKQorCQlwbWxjYSB8PSBQTUxDQV9DRTsKKwllbHNlCisJCXBtbGNhICY9IH5QTUxDQV9DRTsKKworCXNldF9wbWxjYShjdHIsIHBtbGNhKTsKK30KKworc3RhdGljIHZvaWQgcG1jX3N0YXJ0X2N0cnMoaW50IGVuYWJsZSkKK3sKKwl1MzIgcG1nYzAgPSBtZnBtcihQTVJOX1BNR0MwKTsKKworCXBtZ2MwICY9IH5QTUdDMF9GQUM7CisJcG1nYzAgfD0gUE1HQzBfRkNFQ0U7CisKKwlpZiAoZW5hYmxlKQorCQlwbWdjMCB8PSBQTUdDMF9QTUlFOworCWVsc2UKKwkJcG1nYzAgJj0gflBNR0MwX1BNSUU7CisKKwltdHBtcihQTVJOX1BNR0MwLCBwbWdjMCk7Cit9CisKK3N0YXRpYyB2b2lkIHBtY19zdG9wX2N0cnModm9pZCkKK3sKKwl1MzIgcG1nYzAgPSBtZnBtcihQTVJOX1BNR0MwKTsKKworCXBtZ2MwIHw9IFBNR0MwX0ZBQzsKKworCXBtZ2MwICY9IH4oUE1HQzBfUE1JRSB8IFBNR0MwX0ZDRUNFKTsKKworCW10cG1yKFBNUk5fUE1HQzAsIHBtZ2MwKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9wbWNzKHZvaWQpCit7CisJcHJpbnRrKCJwbWdjMDogJXhcbiIsIG1mcG1yKFBNUk5fUE1HQzApKTsKKwlwcmludGsoInBtY1x0XHRwbWxjYVx0XHRwbWxjYlxuIik7CisJcHJpbnRrKCIlOHhcdCU4eFx0JTh4XG4iLCBtZnBtcihQTVJOX1BNQzApLAorCQkJbWZwbXIoUE1STl9QTUxDQTApLCBtZnBtcihQTVJOX1BNTENCMCkpOworCXByaW50aygiJTh4XHQlOHhcdCU4eFxuIiwgbWZwbXIoUE1STl9QTUMxKSwKKwkJCW1mcG1yKFBNUk5fUE1MQ0ExKSwgbWZwbXIoUE1STl9QTUxDQjEpKTsKKwlwcmludGsoIiU4eFx0JTh4XHQlOHhcbiIsIG1mcG1yKFBNUk5fUE1DMiksCisJCQltZnBtcihQTVJOX1BNTENBMiksIG1mcG1yKFBNUk5fUE1MQ0IyKSk7CisJcHJpbnRrKCIlOHhcdCU4eFx0JTh4XG4iLCBtZnBtcihQTVJOX1BNQzMpLAorCQkJbWZwbXIoUE1STl9QTUxDQTMpLCBtZnBtcihQTVJOX1BNTENCMykpOworfQorCitzdGF0aWMgaW50IGZzbF9lbWJfY3B1X3NldHVwKHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqY3RyKQoreworCWludCBpOworCisJLyogZnJlZXplIGFsbCBjb3VudGVycyAqLworCXBtY19zdG9wX2N0cnMoKTsKKworCWZvciAoaSA9IDA7aSA8IG51bV9jb3VudGVycztpKyspIHsKKwkJaW5pdF9wbWNfc3RvcChpKTsKKworCQlzZXRfcG1jX2V2ZW50KGksIGN0cltpXS5ldmVudCk7CisKKwkJc2V0X3BtY191c2VyX2tlcm5lbChpLCBjdHJbaV0udXNlciwgY3RyW2ldLmtlcm5lbCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnNsX2VtYl9yZWdfc2V0dXAoc3RydWN0IG9wX2NvdW50ZXJfY29uZmlnICpjdHIsCisJCQkgICAgIHN0cnVjdCBvcF9zeXN0ZW1fY29uZmlnICpzeXMsCisJCQkgICAgIGludCBudW1fY3RycykKK3sKKwlpbnQgaTsKKworCW51bV9jb3VudGVycyA9IG51bV9jdHJzOworCisJLyogT3VyIGNvdW50ZXJzIGNvdW50IHVwLCBhbmQgImNvdW50IiByZWZlcnMgdG8KKwkgKiBob3cgbXVjaCBiZWZvcmUgdGhlIG5leHQgaW50ZXJydXB0LCBhbmQgd2UgaW50ZXJydXB0CisJICogb24gb3ZlcmZsb3cuICBTbyB3ZSBjYWxjdWxhdGUgdGhlIHN0YXJ0aW5nIHZhbHVlCisJICogd2hpY2ggd2lsbCBnaXZlIHVzICJjb3VudCIgdW50aWwgb3ZlcmZsb3cuCisJICogVGhlbiB3ZSBzZXQgdGhlIGV2ZW50cyBvbiB0aGUgZW5hYmxlZCBjb3VudGVycyAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fY291bnRlcnM7ICsraSkKKwkJcmVzZXRfdmFsdWVbaV0gPSAweDgwMDAwMDAwVUwgLSBjdHJbaV0uY291bnQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmc2xfZW1iX3N0YXJ0KHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqY3RyKQoreworCWludCBpOworCisJbXRtc3IobWZtc3IoKSB8IE1TUl9QTU0pOworCisJZm9yIChpID0gMDsgaSA8IG51bV9jb3VudGVyczsgKytpKSB7CisJCWlmIChjdHJbaV0uZW5hYmxlZCkgeworCQkJY3RyX3dyaXRlKGksIHJlc2V0X3ZhbHVlW2ldKTsKKwkJCS8qIFNldCBlYWNoIGVuYWJsZWQgY291bnRlciB0byBvbmx5CisJCQkgKiBjb3VudCB3aGVuIHRoZSBNYXJrIGJpdCBpcyAqbm90KiBzZXQgKi8KKwkJCXNldF9wbWNfbWFya2VkKGksIDEsIDApOworCQkJcG1jX3N0YXJ0X2N0cihpLCAxKTsKKwkJfSBlbHNlIHsKKwkJCWN0cl93cml0ZShpLCAwKTsKKworCQkJLyogU2V0IHRoZSBjdHIgdG8gYmUgc3RvcHBlZCAqLworCQkJcG1jX3N0YXJ0X2N0cihpLCAwKTsKKwkJfQorCX0KKworCS8qIENsZWFyIHRoZSBmcmVlemUgYml0LCBhbmQgZW5hYmxlIHRoZSBpbnRlcnJ1cHQuCisJICogVGhlIGNvdW50ZXJzIHdvbid0IGFjdHVhbGx5IHN0YXJ0IHVudGlsIHRoZSByZmkgY2xlYXJzCisJICogdGhlIFBNTSBiaXQgKi8KKwlwbWNfc3RhcnRfY3RycygxKTsKKworCW9wcm9maWxlX3J1bm5pbmcgPSAxOworCisJcHJfZGVidWcoInN0YXJ0IG9uIGNwdSAlZCwgcG1nYzAgJXhcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwKKwkJCW1mcG1yKFBNUk5fUE1HQzApKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmc2xfZW1iX3N0b3Aodm9pZCkKK3sKKwkvKiBmcmVlemUgY291bnRlcnMgKi8KKwlwbWNfc3RvcF9jdHJzKCk7CisKKwlvcHJvZmlsZV9ydW5uaW5nID0gMDsKKworCXByX2RlYnVnKCJzdG9wIG9uIGNwdSAlZCwgcG1nYzAgJXhcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwKKwkJCW1mcG1yKFBNUk5fUE1HQzApKTsKKworCW1iKCk7Cit9CisKKworc3RhdGljIHZvaWQgZnNsX2VtYl9oYW5kbGVfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCSAgICBzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgKmN0cikKK3sKKwl1bnNpZ25lZCBsb25nIHBjOworCWludCBpc19rZXJuZWw7CisJaW50IHZhbDsKKwlpbnQgaTsKKworCS8qIHNldCB0aGUgUE1NIGJpdCAoc2VlIGNvbW1lbnQgYmVsb3cpICovCisJbXRtc3IobWZtc3IoKSB8IE1TUl9QTU0pOworCisJcGMgPSByZWdzLT5uaXA7CisJaXNfa2VybmVsID0gaXNfa2VybmVsX2FkZHIocGMpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9jb3VudGVyczsgKytpKSB7CisJCXZhbCA9IGN0cl9yZWFkKGkpOworCQlpZiAodmFsIDwgMCkgeworCQkJaWYgKG9wcm9maWxlX3J1bm5pbmcgJiYgY3RyW2ldLmVuYWJsZWQpIHsKKwkJCQlvcHJvZmlsZV9hZGRfZXh0X3NhbXBsZShwYywgcmVncywgaSwgaXNfa2VybmVsKTsKKwkJCQljdHJfd3JpdGUoaSwgcmVzZXRfdmFsdWVbaV0pOworCQkJfSBlbHNlIHsKKwkJCQljdHJfd3JpdGUoaSwgMCk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBUaGUgZnJlZXplIGJpdCB3YXMgc2V0IGJ5IHRoZSBpbnRlcnJ1cHQuICovCisJLyogQ2xlYXIgdGhlIGZyZWV6ZSBiaXQsIGFuZCByZWVuYWJsZSB0aGUgaW50ZXJydXB0LgorCSAqIFRoZSBjb3VudGVycyB3b24ndCBhY3R1YWxseSBzdGFydCB1bnRpbCB0aGUgcmZpIGNsZWFycworCSAqIHRoZSBQTU0gYml0ICovCisJcG1jX3N0YXJ0X2N0cnMoMSk7Cit9CisKK3N0cnVjdCBvcF9wb3dlcnBjX21vZGVsIG9wX21vZGVsX2ZzbF9lbWIgPSB7CisJLnJlZ19zZXR1cAkJPSBmc2xfZW1iX3JlZ19zZXR1cCwKKwkuY3B1X3NldHVwCQk9IGZzbF9lbWJfY3B1X3NldHVwLAorCS5zdGFydAkJCT0gZnNsX2VtYl9zdGFydCwKKwkuc3RvcAkJCT0gZnNsX2VtYl9zdG9wLAorCS5oYW5kbGVfaW50ZXJydXB0CT0gZnNsX2VtYl9oYW5kbGVfaW50ZXJydXB0LAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDB4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQweC9LY29uZmlnCmluZGV4IDc0ZjMxMTcuLmE5MjYwZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDB4L0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80MHgvS2NvbmZpZwpAQCAtNzIsNiArNzIsNyBAQAogCWRlZmF1bHQgeQogCXNlbGVjdCA0MDVHUAogCXNlbGVjdCBQQ0kKKwlzZWxlY3QgT0ZfUlRDCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgSUJNIFBQQzQwNUdQIGV2YWx1YXRpb24gYm9hcmQuCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDB4L3ZpcnRleC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80MHgvdmlydGV4LmMKaW5kZXggODhiNjY0NC4uMDQyMjU5MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80MHgvdmlydGV4LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80MHgvdmlydGV4LmMKQEAgLTM3LDcgKzM3LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHJvb3QgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7CiAKLQlpZiAoIW9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAieGlsaW54LHZpcnRleCIpKQorCWlmICghb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJ4bG54LHZpcnRleCIpKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80MHgvd2FsbnV0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQweC93YWxudXQuYwppbmRleCA1ZDllZGQ5Li5iOGIyNTdlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQweC93YWxudXQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQweC93YWxudXQuYwpAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC93YXJwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC93YXJwLmMKaW5kZXggOGYwMTU2My4uZGE1YjdiNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvd2FycC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L3dhcnAuYwpAQCAtMTM3LDcgKzEzNyw3IEBACiAJfQogCW9mX25vZGVfcHV0KG5wKTsKIAotCWZwZ2EgPSBpb3JlbWFwKHJlcy5zdGFydCArIDB4MjAsIDQpOworCWZwZ2EgPSBpb3JlbWFwKHJlcy5zdGFydCwgMHgyNCk7CiAJaWYgKGZwZ2EgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZmYTQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9LY29uZmlnCkBAIC0wLDAgKzEsMjAgQEAKK2NvbmZpZyBQUENfTVBDNTEyeAorCWJvb2wKKwlzZWxlY3QgRlNMX1NPQworCXNlbGVjdCBJUElDCisJZGVmYXVsdCBuCisKK2NvbmZpZyBQUENfTVBDNTEyMQorCWJvb2wKKwlzZWxlY3QgUFBDX01QQzUxMngKKwlkZWZhdWx0IG4KKworY29uZmlnIE1QQzUxMjFfQURTCisJYm9vbCAiRnJlZXNjYWxlIE1QQzUxMjFFIEFEUyIKKwlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNICYmIFBQQzMyCisJc2VsZWN0IERFRkFVTFRfVUlNQUdFCisJc2VsZWN0IFdBTlRfREVWSUNFX1RSRUUKKwlzZWxlY3QgUFBDX01QQzUxMjEKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNUEM1MTIxRSBBRFMgYm9hcmQuCisJZGVmYXVsdCBuCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMyYzg5ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9NYWtlZmlsZQpAQCAtMCwwICsxLDQgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBGcmVlc2NhbGUgUG93ZXJQQyA1MTJ4IGxpbnV4IGtlcm5lbC4KKyMKK29iai0kKENPTkZJR19NUEM1MTIxX0FEUykJKz0gbXBjNTEyMV9hZHMubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L21wYzUxMjFfYWRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyMV9hZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGJkM2EzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L21wYzUxMjFfYWRzLmMKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBBdXRob3I6IEpvaG4gUmlnYnksIDxqcmlnYnlAZnJlZXNjYWxlLmNvbT4sIFRodXIgTWFyIDI5IDIwMDcKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIE1QQzUxMjEgQURTIGJvYXJkIHNldHVwCisgKgorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9pcGljLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vdGltZS5oPgorCisvKioKKyAqIAltcGM1MTJ4X2ZpbmRfaXBzX2ZyZXEgLSBGaW5kIHRoZSBJUFMgYnVzIGZyZXF1ZW5jeSBmb3IgYSBkZXZpY2UKKyAqIAlAbm9kZToJZGV2aWNlIG5vZGUKKyAqCisgKiAJUmV0dXJucyBJUFMgYnVzIGZyZXF1ZW5jeSwgb3IgMCBpZiB0aGUgYnVzIGZyZXF1ZW5jeSBjYW5ub3QgYmUgZm91bmQuCisgKi8KK3Vuc2lnbmVkIGxvbmcKK21wYzUxMnhfZmluZF9pcHNfZnJlcShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwljb25zdCB1bnNpZ25lZCBpbnQgKnBfaXBzX2ZyZXEgPSBOVUxMOworCisJb2Zfbm9kZV9nZXQobm9kZSk7CisJd2hpbGUgKG5vZGUpIHsKKwkJcF9pcHNfZnJlcSA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAiYnVzLWZyZXF1ZW5jeSIsIE5VTEwpOworCQlpZiAocF9pcHNfZnJlcSkKKwkJCWJyZWFrOworCisJCW5wID0gb2ZfZ2V0X3BhcmVudChub2RlKTsKKwkJb2Zfbm9kZV9wdXQobm9kZSk7CisJCW5vZGUgPSBucDsKKwl9CisJaWYgKG5vZGUpCisJCW9mX25vZGVfcHV0KG5vZGUpOworCisJcmV0dXJuIHBfaXBzX2ZyZXEgPyAqcF9pcHNfZnJlcSA6IDA7Cit9CitFWFBPUlRfU1lNQk9MKG1wYzUxMnhfZmluZF9pcHNfZnJlcSk7CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9faW5pdGRhdGEgb2ZfYnVzX2lkc1tdID0geworCXsgLm5hbWUgPSAic29jIiwgfSwKKwl7IC5uYW1lID0gImxvY2FsYnVzIiwgfSwKKwl7fSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBtcGM1MTIxX2Fkc19kZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXModm9pZCkKK3sKKwkvKiBGaW5kIGV2ZXJ5IGNoaWxkIG9mIHRoZSBTT0Mgbm9kZSBhbmQgYWRkIGl0IHRvIG9mX3BsYXRmb3JtICovCisJaWYgKG9mX3BsYXRmb3JtX2J1c19wcm9iZShOVUxMLCBvZl9idXNfaWRzLCBOVUxMKSkKKwkJcHJpbnRrKEtFUk5fRVJSIF9fRklMRV9fICI6ICIKKwkJCSJFcnJvciB3aGlsZSBwcm9iaW5nIG9mX3BsYXRmb3JtIGJ1c1xuIik7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBtcGM1MTIxX2Fkc19pbml0X0lSUSh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wsaXBpYyIpOworCWlmICghbnApCisJCXJldHVybjsKKworCWlwaWNfaW5pdChucCwgMCk7CisJb2Zfbm9kZV9wdXQobnApOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBkZWZhdWx0IGludGVycnVwdCBtYXBwaW5nIHByaW9yaXRpZXMsCisJICogaW4gY2FzZSB0aGUgYm9vdCByb20gY2hhbmdlZCBzb21ldGhpbmcgb24gdXMuCisJICovCisJaXBpY19zZXRfZGVmYXVsdF9wcmlvcml0eSgpOworfQorCisvKgorICogQ2FsbGVkIHZlcnkgZWFybHksIE1NVSBpcyBvZmYsIGRldmljZS10cmVlIGlzbid0IHVuZmxhdHRlbmVkCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IG1wYzUxMjFfYWRzX3Byb2JlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyByb290ID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOworCisJcmV0dXJuIG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiZnNsLG1wYzUxMjFhZHMiKTsKK30KKworZGVmaW5lX21hY2hpbmUobXBjNTEyMV9hZHMpIHsKKwkubmFtZQkJCT0gIk1QQzUxMjEgQURTIiwKKwkucHJvYmUJCQk9IG1wYzUxMjFfYWRzX3Byb2JlLAorCS5pbml0CQkJPSBtcGM1MTIxX2Fkc19kZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXMsCisJLmluaXRfSVJRCQk9IG1wYzUxMjFfYWRzX2luaXRfSVJRLAorCS5nZXRfaXJxCQk9IGlwaWNfZ2V0X2lycSwKKwkuY2FsaWJyYXRlX2RlY3IJCT0gZ2VuZXJpY19jYWxpYnJhdGVfZGVjciwKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvbXBjODI3Ml9hZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9tcGM4MjcyX2Fkcy5jCmluZGV4IDNmY2U2YjMuLjdkMzAxODcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9tcGM4MjcyX2Fkcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9tcGM4MjcyX2Fkcy5jCkBAIC0xMzQsMTMgKzEzNCwxMiBAQAogCX0KIAogCWJjc3IgPSBvZl9pb21hcChucCwgMCk7CisJb2Zfbm9kZV9wdXQobnApOwogCWlmICghYmNzcikgewogCQlwcmludGsoS0VSTl9FUlIgIkNhbm5vdCBtYXAgQkNTUiByZWdpc3RlcnNcbiIpOwogCQlyZXR1cm47CiAJfQogCi0Jb2Zfbm9kZV9wdXQobnApOwotCiAJY2xyYml0czMyKCZiY3NyWzFdLCBCQ1NSMV9SUzIzMl9FTjEgfCBCQ1NSMV9SUzIzMl9FTjIgfCBCQ1NSMV9GRVRISUVOKTsKIAlzZXRiaXRzMzIoJmJjc3JbMV0sIEJDU1IxX0ZFVEhfUlNUKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L3BxMmZhZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9wcTJmYWRzLmMKaW5kZXggNjgxOTZlMy4uZTFkY2VlZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Mnh4L3BxMmZhZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvcHEyZmFkcy5jCkBAIC0xMzAsMTMgKzEzMCwxMiBAQAogCX0KIAogCWJjc3IgPSBvZl9pb21hcChucCwgMCk7CisJb2Zfbm9kZV9wdXQobnApOwogCWlmICghYmNzcikgewogCQlwcmludGsoS0VSTl9FUlIgIkNhbm5vdCBtYXAgQkNTUiByZWdpc3RlcnNcbiIpOwogCQlyZXR1cm47CiAJfQogCi0Jb2Zfbm9kZV9wdXQobnApOwotCiAJLyogRW5hYmxlIHRoZSBzZXJpYWwgYW5kIGV0aGVybmV0IHBvcnRzICovCiAKIAljbHJiaXRzMzIoJmJjc3JbMV0sIEJDU1IxX1JTMjMyX0VOMSB8IEJDU1IxX1JTMjMyX0VOMiB8IEJDU1IxX0ZFVEhJRU4pOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfcmRiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9yZGIuYwppbmRleCA5ZjBmZDg4Li5lN2Y3MDZiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9yZGIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9yZGIuYwpAQCAtMTAxLDcgKzEwMSw3IEBACiAjaWZkZWYgQ09ORklHX1FVSUNDX0VOR0lORQogCXFlX3Jlc2V0KCk7CiAKLQlpZiAoKG5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUobnAsICJwYXJfaW8iKSkgIT0gTlVMTCkgeworCWlmICgobnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAicGFyX2lvIikpICE9IE5VTEwpIHsKIAkJcGFyX2lvX2luaXQobnApOwogCQlvZl9ub2RlX3B1dChucCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4M3h4LmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODN4eC5oCmluZGV4IDg4YmI3NDguLjY4MDY1ZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4M3h4LmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzeHguaApAQCAtMTQsNiArMTQsOCBAQAogI2RlZmluZSBNUEM4M1hYX1NDQ1JfVVNCX0RSQ01fMTEgICAweDAwMzAwMDAwCiAjZGVmaW5lIE1QQzgzWFhfU0NDUl9VU0JfRFJDTV8wMSAgIDB4MDAxMDAwMDAKICNkZWZpbmUgTVBDODNYWF9TQ0NSX1VTQl9EUkNNXzEwICAgMHgwMDIwMDAwMAorI2RlZmluZSBNUEM4MzE1X1NDQ1JfVVNCX01BU0sgICAgICAweDAwYzAwMDAwCisjZGVmaW5lIE1QQzgzMTVfU0NDUl9VU0JfRFJDTV8xMSAgIDB4MDBjMDAwMDAKICNkZWZpbmUgTVBDODM3WF9TQ0NSX1VTQl9EUkNNXzExICAgMHgwMGMwMDAwMAogCiAvKiBzeXN0ZW0gaS9vIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgbG93ICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvdXNiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvdXNiLmMKaW5kZXggNjgxMjMwYS4uNDcxZmRkOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3VzYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC91c2IuYwpAQCAtMTA0LDYgKzEwNCw3IEBACiAJdTMyIHRlbXA7CiAJdm9pZCBfX2lvbWVtICppbW1hcCwgKnVzYl9yZWdzOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBOVUxMOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaW1tcl9ub2RlID0gTlVMTDsKIAljb25zdCB2b2lkICpwcm9wOwogCXN0cnVjdCByZXNvdXJjZSByZXM7CiAJaW50IHJldCA9IDA7CkBAIC0xMjQsMTAgKzEyNSwxNSBAQAogCX0KIAogCS8qIENvbmZpZ3VyZSBjbG9jayAqLwotCXRlbXAgPSBpbl9iZTMyKGltbWFwICsgTVBDODNYWF9TQ0NSX09GRlMpOwotCXRlbXAgJj0gfk1QQzgzWFhfU0NDUl9VU0JfTUFTSzsKLQl0ZW1wIHw9IE1QQzgzWFhfU0NDUl9VU0JfRFJDTV8xMTsgIC8qIDE6MyAqLwotCW91dF9iZTMyKGltbWFwICsgTVBDODNYWF9TQ0NSX09GRlMsIHRlbXApOworCWltbXJfbm9kZSA9IG9mX2dldF9wYXJlbnQobnApOworCWlmIChpbW1yX25vZGUgJiYgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoaW1tcl9ub2RlLCAiZnNsLG1wYzgzMTUtaW1tciIpKQorCQljbHJzZXRiaXRzX2JlMzIoaW1tYXAgKyBNUEM4M1hYX1NDQ1JfT0ZGUywKKwkJICAgICAgICAgICAgICAgIE1QQzgzMTVfU0NDUl9VU0JfTUFTSywKKwkJICAgICAgICAgICAgICAgIE1QQzgzMTVfU0NDUl9VU0JfRFJDTV8xMSk7CisJZWxzZQorCQljbHJzZXRiaXRzX2JlMzIoaW1tYXAgKyBNUEM4M1hYX1NDQ1JfT0ZGUywKKwkJICAgICAgICAgICAgICAgIE1QQzgzWFhfU0NDUl9VU0JfTUFTSywKKwkJICAgICAgICAgICAgICAgIE1QQzgzWFhfU0NDUl9VU0JfRFJDTV8xMSk7CiAKIAkvKiBDb25maWd1cmUgcGluIG11eCBmb3IgVUxQSS4gIFRoZXJlIGlzIG5vIHBpbiBtdXggZm9yIFVUTUkgKi8KIAlpZiAocHJvcCAmJiAhc3RyY21wKHByb3AsICJ1bHBpIikpIHsKQEAgLTE0NCw2ICsxNTAsOSBAQAogCiAJaW91bm1hcChpbW1hcCk7CiAKKwlpZiAoaW1tcl9ub2RlKQorCQlvZl9ub2RlX3B1dChpbW1yX25vZGUpOworCiAJLyogTWFwIFVTQiBTT0Mgc3BhY2UgKi8KIAlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcmVzKTsKIAlpZiAocmV0KSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9hZGRlcjg3NS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvYWRkZXI4NzUuYwppbmRleCBjNmJjMDc4Li44MjM2M2U5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9hZGRlcjg3NS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L2FkZGVyODc1LmMKQEAgLTE1LDEyICsxNSwxMiBAQAogCiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS9jb21tcHJvYy5oPgorI2luY2x1ZGUgPGFzbS9jcG0xLmg+CiAjaW5jbHVkZSA8YXNtL2ZzX3BkLmg+CiAjaW5jbHVkZSA8YXNtL3VkYmcuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgogCi0jaW5jbHVkZSA8c3lzZGV2L2NvbW1wcm9jLmg+CisjaW5jbHVkZSAibXBjOHh4LmgiCiAKIHN0cnVjdCBjcG1fcGluIHsKIAlpbnQgcG9ydCwgcGluLCBmbGFnczsKQEAgLTEwOCw3ICsxMDgsNyBAQAogCS5uYW1lID0gIkFkZGVyIE1QQzg3NSIsCiAJLnByb2JlID0gYWRkZXI4NzVfcHJvYmUsCiAJLnNldHVwX2FyY2ggPSBhZGRlcjg3NV9zZXR1cCwKLQkuaW5pdF9JUlEgPSBtOHh4X3BpY19pbml0LAorCS5pbml0X0lSUSA9IG1wYzh4eF9waWNzX2luaXQsCiAJLmdldF9pcnEgPSBtcGM4eHhfZ2V0X2lycSwKIAkucmVzdGFydCA9IG1wYzh4eF9yZXN0YXJ0LAogCS5jYWxpYnJhdGVfZGVjciA9IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3IsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9lcDg4eGMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L2VwODh4Yy5jCmluZGV4IGE4ZGZmYTAuLjdkOWFjNjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L2VwODh4Yy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L2VwODh4Yy5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vdWRiZy5oPgotI2luY2x1ZGUgPGFzbS9jb21tcHJvYy5oPgogI2luY2x1ZGUgPGFzbS9jcG0xLmg+CiAKICNpbmNsdWRlICJtcGM4eHguaCIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZwppbmRleCBmZGNlMTBjLi5mY2VkYmVjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnCkBAIC0yNCw2ICsyNCw3IEBACiAJc2VsZWN0IE1QQzgzeHgKIAlzZWxlY3QgSVBJQwogCXNlbGVjdCBXQU5UX0RFVklDRV9UUkVFCisJc2VsZWN0IEZTTF9FTUJfUEVSRk1PTgogCiBjb25maWcgUFBDXzg2eHgKIAlib29sICJGcmVlc2NhbGUgODZ4eCIKQEAgLTQxLDYgKzQyLDcgQEAKIHNvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL0tjb25maWciCiBzb3VyY2UgImFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9LY29uZmlnIgogc291cmNlICJhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvS2NvbmZpZyIKK3NvdXJjZSAiYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L0tjb25maWciCiBzb3VyY2UgImFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC9LY29uZmlnIgogc291cmNlICJhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL0tjb25maWciCiBzb3VyY2UgImFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHJlcC9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQppbmRleCA3ZmM0MTEwLi42OTk0MWJhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQpAQCAtMTQsNyArMTQsNyBAQAogCSAgVGhlcmUgYXJlIGZpdmUgZmFtaWxpZXMgb2YgMzIgYml0IFBvd2VyUEMgY2hpcHMgc3VwcG9ydGVkLgogCSAgVGhlIG1vc3QgY29tbW9uIG9uZXMgYXJlIHRoZSBkZXNrdG9wIGFuZCBzZXJ2ZXIgQ1BVcyAoNjAxLCA2MDMsCiAJICA2MDQsIDc0MCwgNzUwLCA3NHh4KSBDUFVzIGZyb20gRnJlZXNjYWxlIGFuZCBJQk0sIHdpdGggdGhlaXIKLQkgIGVtYmVkZGVkIDUyeHgvODJ4eC84M3h4Lzg2eHggY291bnRlcnBhcnRzLgorCSAgZW1iZWRkZWQgNTEyeC81Mnh4LzgyeHgvODN4eC84Nnh4IGNvdW50ZXJwYXJ0cy4KIAkgIFRoZSBvdGhlciBlbWJlZWRlZCBwYXJ0cywgbmFtZWx5IDR4eCwgOHh4LCBlMjAwICg1NXh4KSBhbmQgZTUwMAogCSAgKDg1eHgpIGVhY2ggZm9ybSBhIGZhbWlseSBvZiB0aGVpciBvd24gdGhhdCBpcyBub3QgY29tcGF0aWJsZQogCSAgd2l0aCB0aGUgb3RoZXJzLgpAQCAtMjIsNyArMjIsNyBAQAogCSAgSWYgdW5zdXJlLCBzZWxlY3QgNTJ4eC82eHgvN3h4Lzc0eHgvODJ4eC84M3h4Lzg2eHguCiAKIGNvbmZpZyA2eHgKLQlib29sICI1Mnh4LzZ4eC83eHgvNzR4eC84Mnh4LzgzeHgvODZ4eCIKKwlib29sICI1MTJ4LzUyeHgvNnh4Lzd4eC83NHh4LzgyeHgvODN4eC84Nnh4IgogCXNlbGVjdCBQUENfRlBVCiAKIGNvbmZpZyBQUENfODV4eApAQCAtOTQsNiArOTQsNyBAQAogCWJvb2wKIAogY29uZmlnIEU1MDAKKwlzZWxlY3QgRlNMX0VNQl9QRVJGTU9OCiAJYm9vbAogCiBjb25maWcgUFBDX0ZQVQpAQCAtMTE1LDYgKzExNiw5IEBACiAJZGVwZW5kcyBvbiBFMjAwIHx8IEU1MDAKIAlkZWZhdWx0IHkKIAorY29uZmlnIEZTTF9FTUJfUEVSRk1PTgorCWJvb2wKKwogY29uZmlnIFBURV82NEJJVAogCWJvb2wKIAlkZXBlbmRzIG9uIDQ0eCB8fCBFNTAwCkBAIC0yMjEsNyArMjI1LDcgQEAKIAogY29uZmlnIE5PVF9DT0hFUkVOVF9DQUNIRQogCWJvb2wKLQlkZXBlbmRzIG9uIDR4eCB8fCA4eHggfHwgRTIwMAorCWRlcGVuZHMgb24gNHh4IHx8IDh4eCB8fCBFMjAwIHx8IFBQQ19NUEM1MTJ4CiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBDSEVDS19DQUNIRV9DT0hFUkVOQ1kKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL01ha2VmaWxlCmluZGV4IDZkOTA3OWQuLmE5ODQ4OTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9NYWtlZmlsZQpAQCAtMTEsNiArMTEsNyBAQAogb2JqLSQoQ09ORklHX1BQQ19DSFJQKQkJKz0gY2hycC8KIG9iai0kKENPTkZJR180MHgpCQkrPSA0MHgvCiBvYmotJChDT05GSUdfNDR4KQkJKz0gNDR4Lworb2JqLSQoQ09ORklHX1BQQ19NUEM1MTJ4KQkrPSA1MTJ4Lwogb2JqLSQoQ09ORklHX1BQQ19NUEM1Mnh4KQkrPSA1Mnh4Lwogb2JqLSQoQ09ORklHX1BQQ184eHgpCQkrPSA4eHgvCiBvYmotJChDT05GSUdfUFBDXzgyeHgpCQkrPSA4Mnh4LwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvS2NvbmZpZwppbmRleCAzYTk2M2I0Li4yZjE2OTk5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvS2NvbmZpZwpAQCAtNTQsNiArNTQsMTMgQEAKIAkgIHVzZXMgNEsgcGFnZXMuIFRoaXMgY2FuIGltcHJvdmUgcGVyZm9ybWFuY2VzIG9mIGFwcGxpY2F0aW9ucwogCSAgdXNpbmcgbXVsdGlwbGUgU1BFcyBieSBsb3dlcmluZyB0aGUgVExCIHByZXNzdXJlIG9uIHRoZW0uCiAKK2NvbmZpZyBTUFVfVFJBQ0UKKwl0cmlzdGF0ZSAiU1BVIGV2ZW50IHRyYWNpbmcgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNQVV9GUyAmJiBNQVJLRVJTCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHJlYWRpbmcgYSB0cmFjZSBvZiBzcHUtcmVsYXRlZCBldmVudHMgdGhyb3VnaAorCSAgdGhlIHNwdXRyYWNlIGZpbGUgaW4gcHJvY2ZzLgorCiBjb25maWcgU1BVX0JBU0UKIAlib29sCiAJZGVmYXVsdCBuCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvYXhvbl9tc2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9heG9uX21zaS5jCmluZGV4IDA5NTk4OGYuLmQ5NWU3MWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9heG9uX21zaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9heG9uX21zaS5jCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbXNpLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KIAogI2luY2x1ZGUgPGFzbS9kY3IuaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgpAQCAtNjUsMTQgKzY1LDEyIEBACiAKIHN0cnVjdCBheG9uX21zaWMgewogCXN0cnVjdCBpcnFfaG9zdCAqaXJxX2hvc3Q7Ci0JX19sZTMyICpmaWZvOworCV9fbGUzMiAqZmlmb192aXJ0OworCWRtYV9hZGRyX3QgZmlmb19waHlzOwogCWRjcl9ob3N0X3QgZGNyX2hvc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXUzMiByZWFkX29mZnNldDsKIH07CiAKLXN0YXRpYyBMSVNUX0hFQUQoYXhvbl9tc2ljX2xpc3QpOwotCiBzdGF0aWMgdm9pZCBtc2ljX2Rjcl93cml0ZShzdHJ1Y3QgYXhvbl9tc2ljICptc2ljLCB1bnNpZ25lZCBpbnQgZGNyX24sIHUzMiB2YWwpCiB7CiAJcHJfZGVidWcoImF4b25fbXNpOiBkY3Jfd3JpdGUoMHgleCwgMHgleClcbiIsIHZhbCwgZGNyX24pOwpAQCAtOTQsNyArOTIsNyBAQAogCiAJd2hpbGUgKG1zaWMtPnJlYWRfb2Zmc2V0ICE9IHdyaXRlX29mZnNldCkgewogCQlpZHggID0gbXNpYy0+cmVhZF9vZmZzZXQgLyBzaXplb2YoX19sZTMyKTsKLQkJbXNpICA9IGxlMzJfdG9fY3B1KG1zaWMtPmZpZm9baWR4XSk7CisJCW1zaSAgPSBsZTMyX3RvX2NwdShtc2ljLT5maWZvX3ZpcnRbaWR4XSk7CiAJCW1zaSAmPSAweEZGRkY7CiAKIAkJcHJfZGVidWcoImF4b25fbXNpOiB3b2ZmICV4IHJvZmYgJXggbXNpICV4XG4iLApAQCAtMTM5LDYgKzEzNyw3IEBACiAKIAl0bXAgPSBkbjsKIAlkbiA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKCpwaCk7CisJb2Zfbm9kZV9wdXQodG1wKTsKIAlpZiAoIWRuKSB7CiAJCWRldl9kYmcoJmRldi0+ZGV2LAogCQkJImF4b25fbXNpOiBtc2ktdHJhbnNsYXRvciBkb2Vzbid0IHBvaW50IHRvIGEgbm9kZVxuIik7CkBAIC0xNTYsNyArMTU1LDYgQEAKIAogb3V0X2Vycm9yOgogCW9mX25vZGVfcHV0KGRuKTsKLQlvZl9ub2RlX3B1dCh0bXApOwogCiAJcmV0dXJuIG1zaWM7CiB9CkBAIC0yOTIsMzAgKzI5MCwyNCBAQAogCS5tYXAJPSBtc2ljX2hvc3RfbWFwLAogfTsKIAotc3RhdGljIGludCBheG9uX21zaV9ub3RpZnlfcmVib290KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCi0JCQkJICB1bnNpZ25lZCBsb25nIGNvZGUsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGF4b25fbXNpX3NodXRkb3duKHN0cnVjdCBvZl9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgYXhvbl9tc2ljICptc2ljOworCXN0cnVjdCBheG9uX21zaWMgKm1zaWMgPSBkZXZpY2UtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXUzMiB0bXA7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1zaWMsICZheG9uX21zaWNfbGlzdCwgbGlzdCkgewotCQlwcl9kZWJ1ZygiYXhvbl9tc2k6IGRpc2FibGluZyAlc1xuIiwKLQkJCSAgbXNpYy0+aXJxX2hvc3QtPm9mX25vZGUtPmZ1bGxfbmFtZSk7Ci0JCXRtcCAgPSBkY3JfcmVhZChtc2ljLT5kY3JfaG9zdCwgTVNJQ19DVFJMX1JFRyk7Ci0JCXRtcCAmPSB+TVNJQ19DVFJMX0VOQUJMRSAmIH5NU0lDX0NUUkxfSVJRX0VOQUJMRTsKLQkJbXNpY19kY3Jfd3JpdGUobXNpYywgTVNJQ19DVFJMX1JFRywgdG1wKTsKLQl9CisJcHJfZGVidWcoImF4b25fbXNpOiBkaXNhYmxpbmcgJXNcbiIsCisJCSAgbXNpYy0+aXJxX2hvc3QtPm9mX25vZGUtPmZ1bGxfbmFtZSk7CisJdG1wICA9IGRjcl9yZWFkKG1zaWMtPmRjcl9ob3N0LCBNU0lDX0NUUkxfUkVHKTsKKwl0bXAgJj0gfk1TSUNfQ1RSTF9FTkFCTEUgJiB+TVNJQ19DVFJMX0lSUV9FTkFCTEU7CisJbXNpY19kY3Jfd3JpdGUobXNpYywgTVNJQ19DVFJMX1JFRywgdG1wKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGF4b25fbXNpX3JlYm9vdF9ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbCA9IGF4b25fbXNpX25vdGlmeV9yZWJvb3QKLX07Ci0KLXN0YXRpYyBpbnQgYXhvbl9tc2lfc2V0dXBfb25lKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pCitzdGF0aWMgaW50IGF4b25fbXNpX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKmRldmljZSwKKwkJCSAgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqZGV2aWNlX2lkKQogewotCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4gPSBkZXZpY2UtPm5vZGU7CiAJc3RydWN0IGF4b25fbXNpYyAqbXNpYzsKIAl1bnNpZ25lZCBpbnQgdmlycTsKIAlpbnQgZGNyX2Jhc2UsIGRjcl9sZW47CkBAIC0zNDYsMTYgKzMzOCwxNCBAQAogCQlnb3RvIG91dF9mcmVlX21zaWM7CiAJfQogCi0JcGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUob2Zfbm9kZV90b19uaWQoZG4pLCBHRlBfS0VSTkVMLAotCQkJCWdldF9vcmRlcihNU0lDX0ZJRk9fU0laRV9CWVRFUykpOwotCWlmICghcGFnZSkgeworCW1zaWMtPmZpZm9fdmlydCA9IGRtYV9hbGxvY19jb2hlcmVudCgmZGV2aWNlLT5kZXYsIE1TSUNfRklGT19TSVpFX0JZVEVTLAorCQkJCQkgICAgICZtc2ljLT5maWZvX3BoeXMsIEdGUF9LRVJORUwpOworCWlmICghbXNpYy0+Zmlmb192aXJ0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiYXhvbl9tc2k6IGNvdWxkbid0IGFsbG9jYXRlIGZpZm8gZm9yICVzXG4iLAogCQkgICAgICAgZG4tPmZ1bGxfbmFtZSk7CiAJCWdvdG8gb3V0X2ZyZWVfbXNpYzsKIAl9CiAKLQltc2ljLT5maWZvID0gcGFnZV9hZGRyZXNzKHBhZ2UpOwotCiAJbXNpYy0+aXJxX2hvc3QgPSBpcnFfYWxsb2NfaG9zdChvZl9ub2RlX2dldChkbiksIElSUV9IT1NUX01BUF9OT01BUCwKIAkJCQkJTlJfSVJRUywgJm1zaWNfaG9zdF9vcHMsIDApOwogCWlmICghbXNpYy0+aXJxX2hvc3QpIHsKQEAgLTM3OCwxNCArMzY4LDE4IEBACiAJcHJfZGVidWcoImF4b25fbXNpOiBpcnEgMHgleCBzZXR1cCBmb3IgYXhvbl9tc2lcbiIsIHZpcnEpOwogCiAJLyogRW5hYmxlIHRoZSBNU0lDIGhhcmR3YXJlICovCi0JbXNpY19kY3Jfd3JpdGUobXNpYywgTVNJQ19CQVNFX0FERFJfSElfUkVHLCAodTY0KW1zaWMtPmZpZm8gPj4gMzIpOworCW1zaWNfZGNyX3dyaXRlKG1zaWMsIE1TSUNfQkFTRV9BRERSX0hJX1JFRywgbXNpYy0+Zmlmb19waHlzID4+IDMyKTsKIAltc2ljX2Rjcl93cml0ZShtc2ljLCBNU0lDX0JBU0VfQUREUl9MT19SRUcsCi0JCQkJICAodTY0KW1zaWMtPmZpZm8gJiAweEZGRkZGRkZGKTsKKwkJCQkgIG1zaWMtPmZpZm9fcGh5cyAmIDB4RkZGRkZGRkYpOwogCW1zaWNfZGNyX3dyaXRlKG1zaWMsIE1TSUNfQ1RSTF9SRUcsCiAJCQlNU0lDX0NUUkxfSVJRX0VOQUJMRSB8IE1TSUNfQ1RSTF9FTkFCTEUgfAogCQkJTVNJQ19DVFJMX0ZJRk9fU0laRSk7CiAKLQlsaXN0X2FkZCgmbXNpYy0+bGlzdCwgJmF4b25fbXNpY19saXN0KTsKKwlkZXZpY2UtPmRldi5wbGF0Zm9ybV9kYXRhID0gbXNpYzsKKworCXBwY19tZC5zZXR1cF9tc2lfaXJxcyA9IGF4b25fbXNpX3NldHVwX21zaV9pcnFzOworCXBwY19tZC50ZWFyZG93bl9tc2lfaXJxcyA9IGF4b25fbXNpX3RlYXJkb3duX21zaV9pcnFzOworCXBwY19tZC5tc2lfY2hlY2tfZGV2aWNlID0gYXhvbl9tc2lfY2hlY2tfZGV2aWNlOwogCiAJcHJpbnRrKEtFUk5fREVCVUcgImF4b25fbXNpOiBzZXR1cCBNU0lDIG9uICVzXG4iLCBkbi0+ZnVsbF9uYW1lKTsKIApAQCAtMzk0LDcgKzM4OCw4IEBACiBvdXRfZnJlZV9ob3N0OgogCWtmcmVlKG1zaWMtPmlycV9ob3N0KTsKIG91dF9mcmVlX2ZpZm86Ci0JX19mcmVlX3BhZ2VzKHZpcnRfdG9fcGFnZShtc2ljLT5maWZvKSwgZ2V0X29yZGVyKE1TSUNfRklGT19TSVpFX0JZVEVTKSk7CisJZG1hX2ZyZWVfY29oZXJlbnQoJmRldmljZS0+ZGV2LCBNU0lDX0ZJRk9fU0laRV9CWVRFUywgbXNpYy0+Zmlmb192aXJ0LAorCQkJICBtc2ljLT5maWZvX3BoeXMpOwogb3V0X2ZyZWVfbXNpYzoKIAlrZnJlZShtc2ljKTsKIG91dDoKQEAgLTQwMiwyOCArMzk3LDI0IEBACiAJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgaW50IGF4b25fbXNpX2luaXQodm9pZCkKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGF4b25fbXNpX2RldmljZV9pZFtdID0geworCXsKKwkJLmNvbXBhdGlibGUJPSAiaWJtLGF4b24tbXNpYyIKKwl9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBheG9uX21zaV9kcml2ZXIgPSB7CisJLm1hdGNoX3RhYmxlCT0gYXhvbl9tc2lfZGV2aWNlX2lkLAorCS5wcm9iZQkJPSBheG9uX21zaV9wcm9iZSwKKwkuc2h1dGRvd24JPSBheG9uX21zaV9zaHV0ZG93biwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiYXhvbi1tc2kiCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGF4b25fbXNpX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOwotCWludCBmb3VuZCA9IDA7Ci0KLQlwcl9kZWJ1ZygiYXhvbl9tc2k6IGluaXRpYWxpc2luZyAuLi5cbiIpOwotCi0JZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKGRuLCBOVUxMLCAiaWJtLGF4b24tbXNpYyIpIHsKLQkJaWYgKGF4b25fbXNpX3NldHVwX29uZShkbikgPT0gMCkKLQkJCWZvdW5kKys7Ci0JfQotCi0JaWYgKGZvdW5kKSB7Ci0JCXBwY19tZC5zZXR1cF9tc2lfaXJxcyA9IGF4b25fbXNpX3NldHVwX21zaV9pcnFzOwotCQlwcGNfbWQudGVhcmRvd25fbXNpX2lycXMgPSBheG9uX21zaV90ZWFyZG93bl9tc2lfaXJxczsKLQkJcHBjX21kLm1zaV9jaGVja19kZXZpY2UgPSBheG9uX21zaV9jaGVja19kZXZpY2U7Ci0KLQkJcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZheG9uX21zaV9yZWJvb3Rfbm90aWZpZXIpOwotCi0JCXByX2RlYnVnKCJheG9uX21zaTogcmVnaXN0ZXJlZCBjYWxsYmFja3MhXG4iKTsKLQl9Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZheG9uX21zaV9kcml2ZXIpOwogfQotYXJjaF9pbml0Y2FsbChheG9uX21zaV9pbml0KTsKK3N1YnN5c19pbml0Y2FsbChheG9uX21zaV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvbW11LmMKaW5kZXggZGYzMzA2Ni4uZWRhYjYzMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvbW11LmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAKICNpbmNsdWRlIDxhc20vcHJvbS5oPgpAQCAtNzg5LDE4ICs3OTAsMTYgQEAKIHN0YXRpYyB1NjQgY2VsbF9pb21tdV9nZXRfZml4ZWRfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJdTY0IGNwdV9hZGRyLCBzaXplLCBiZXN0X3NpemUsIHBjaV9hZGRyID0gT0ZfQkFEX0FERFI7Ci0Jc3RydWN0IGRldmljZV9ub2RlICp0bXAsICpucDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCWNvbnN0IHUzMiAqcmFuZ2VzID0gTlVMTDsKIAlpbnQgaSwgbGVuLCBiZXN0OwogCi0JbnAgPSBkZXYtPmFyY2hkYXRhLm9mX25vZGU7Ci0Jb2Zfbm9kZV9nZXQobnApOwotCXJhbmdlcyA9IG9mX2dldF9wcm9wZXJ0eShucCwgImRtYS1yYW5nZXMiLCAmbGVuKTsKLQl3aGlsZSAoIXJhbmdlcyAmJiBucCkgewotCQl0bXAgPSBvZl9nZXRfcGFyZW50KG5wKTsKLQkJb2Zfbm9kZV9wdXQobnApOwotCQlucCA9IHRtcDsKKwlucCA9IG9mX25vZGVfZ2V0KGRldi0+YXJjaGRhdGEub2Zfbm9kZSk7CisJd2hpbGUgKG5wKSB7CiAJCXJhbmdlcyA9IG9mX2dldF9wcm9wZXJ0eShucCwgImRtYS1yYW5nZXMiLCAmbGVuKTsKKwkJaWYgKHJhbmdlcykKKwkJCWJyZWFrOworCQlucCA9IG9mX2dldF9uZXh0X3BhcmVudChucCk7CiAJfQogCiAJaWYgKCFyYW5nZXMpIHsKQEAgLTg0MiwxOSArODQxLDE4IEBACiAJaWYgKCFkZXYtPmRtYV9tYXNrIHx8ICFkbWFfc3VwcG9ydGVkKGRldiwgZG1hX21hc2spKQogCQlyZXR1cm4gLUVJTzsKIAotCWlmIChkbWFfbWFzayA9PSBETUFfQklUX01BU0soNjQpKSB7Ci0JCWlmIChjZWxsX2lvbW11X2dldF9maXhlZF9hZGRyZXNzKGRldikgPT0gT0ZfQkFEX0FERFIpCi0JCQlkZXZfZGJnKGRldiwgImlvbW11OiA2NC1iaXQgT0ssIGJ1dCBiYWQgYWRkclxuIik7Ci0JCWVsc2UgewotCQkJZGV2X2RiZyhkZXYsICJpb21tdTogNjQtYml0IE9LLCB1c2luZyBmaXhlZCBvcHNcbiIpOwotCQkJc2V0X2RtYV9vcHMoZGV2LCAmZG1hX2lvbW11X2ZpeGVkX29wcyk7Ci0JCQljZWxsX2RtYV9kZXZfc2V0dXAoZGV2KTsKLQkJfQorCWlmIChkbWFfbWFzayA9PSBETUFfQklUX01BU0soNjQpICYmCisJCWNlbGxfaW9tbXVfZ2V0X2ZpeGVkX2FkZHJlc3MoZGV2KSAhPSBPRl9CQURfQUREUikKKwl7CisJCWRldl9kYmcoZGV2LCAiaW9tbXU6IDY0LWJpdCBPSywgdXNpbmcgZml4ZWQgb3BzXG4iKTsKKwkJc2V0X2RtYV9vcHMoZGV2LCAmZG1hX2lvbW11X2ZpeGVkX29wcyk7CiAJfSBlbHNlIHsKIAkJZGV2X2RiZyhkZXYsICJpb21tdTogbm90IDY0LWJpdCwgdXNpbmcgZGVmYXVsdCBvcHNcbiIpOwogCQlzZXRfZG1hX29wcyhkZXYsIGdldF9wY2lfZG1hX29wcygpKTsKIAl9CiAKKwljZWxsX2RtYV9kZXZfc2V0dXAoZGV2KTsKKwogCSpkZXYtPmRtYV9tYXNrID0gZG1hX21hc2s7CiAKIAlyZXR1cm4gMDsKQEAgLTkxOCw2ICs5MTYsMTggQEAKIAkJcmV0dXJuIC0xOwogCX0KIAorCS8qIFdlIG11c3QgaGF2ZSBkbWEtcmFuZ2VzIHByb3BlcnRpZXMgZm9yIGZpeGVkIG1hcHBpbmcgdG8gd29yayAqLworCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX2FsbF9ub2RlcyhucCkpOykgeworCQlpZiAob2ZfZmluZF9wcm9wZXJ0eShucCwgImRtYS1yYW5nZXMiLCBOVUxMKSkKKwkJCWJyZWFrOworCX0KKwlvZl9ub2RlX3B1dChucCk7CisKKwlpZiAoIW5wKSB7CisJCXByX2RlYnVnKCJpb21tdTogbm8gZG1hLXJhbmdlcyBmb3VuZCwgbm8gZml4ZWQgbWFwcGluZ1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKIAkvKiBUaGUgZGVmYXVsdCBzZXR1cCBpcyB0byBoYXZlIHRoZSBmaXhlZCBtYXBwaW5nIHNpdCBhZnRlciB0aGUKIAkgKiBkeW5hbWljIHJlZ2lvbiwgc28gZmluZCB0aGUgdG9wIG9mIHRoZSBsYXJnZXN0IElPTU1VIHdpbmRvdwogCSAqIG9uIGFueSBheG9uLCB0aGVuIGFkZCB0aGUgc2l6ZSBvZiBSQU0gYW5kIHRoYXQncyBvdXIgbWF4IHZhbHVlLgpAQCAtOTgxLDggKzk5MSw4IEBACiAJCQlkc2l6ZSA9IGh0YWJfc2l6ZV9ieXRlczsKIAkJfQogCi0JCXByX2RlYnVnKCJpb21tdTogc2V0dGluZyB1cCAlZCwgZHluYW1pYyB3aW5kb3cgJWx4LSVseCAiIFwKLQkJCSAiZml4ZWQgd2luZG93ICVseC0lbHhcbiIsIGlvbW11LT5uaWQsIGRiYXNlLAorCQlwcmludGsoS0VSTl9ERUJVRyAiaW9tbXU6IG5vZGUgJWQsIGR5bmFtaWMgd2luZG93IDB4JWx4LTB4JWx4ICIKKwkJCSJmaXhlZCB3aW5kb3cgMHglbHgtMHglbHhcbiIsIGlvbW11LT5uaWQsIGRiYXNlLAogCQkJIGRiYXNlICsgZHNpemUsIGZiYXNlLCBmYmFzZSArIGZzaXplKTsKIAogCQljZWxsX2lvbW11X3NldHVwX3BhZ2VfdGFibGVzKGlvbW11LCBkYmFzZSwgZHNpemUsIGZiYXNlLCBmc2l6ZSk7CkBAIC05OTgsOCArMTAwOCw2IEBACiAJZG1hX2lvbW11X29wcy5zZXRfZG1hX21hc2sgPSBkbWFfc2V0X21hc2tfYW5kX3N3aXRjaDsKIAlzZXRfcGNpX2RtYV9vcHMoJmRtYV9pb21tdV9vcHMpOwogCi0JcHJpbnRrKEtFUk5fREVCVUcgIklPTU1VIGZpeGVkIG1hcHBpbmcgZXN0YWJsaXNoZWQuXG4iKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zZXR1cC5jCmluZGV4IGU2NTM0YjUuLmE3ZjYwOWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zZXR1cC5jCkBAIC05OCw3ICs5OCw3IEBACiAJfQogCXJldHVybiAwOwogfQotbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwoY2VsbCwgY2VsbF9wdWJsaXNoX2RldmljZXMpOworbWFjaGluZV9zdWJzeXNfaW5pdGNhbGwoY2VsbCwgY2VsbF9wdWJsaXNoX2RldmljZXMpOwogCiBzdGF0aWMgdm9pZCBjZWxsX21waWNfY2FzY2FkZSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvTWFrZWZpbGUKaW5kZXggZDNhMzQ5Zi4uOTk2MTBhNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9NYWtlZmlsZQpAQCAtNCw2ICs0LDggQEAKIHNwdWZzLXkgKz0gc2NoZWQubyBiYWNraW5nX29wcy5vIGh3X29wcy5vIHJ1bi5vIGdhbmcubwogc3B1ZnMteSArPSBzd2l0Y2gubyBmYXVsdC5vIGxzY3NhX2FsbG9jLm8KIAorb2JqLSQoQ09ORklHX1NQVV9UUkFDRSkJKz0gc3B1dHJhY2UubworCiAjIFJ1bGVzIHRvIGJ1aWxkIHN3aXRjaC5vIHdpdGggdGhlIGhlbHAgb2YgU1BVIHRvb2wgY2hhaW4KIFNQVV9DUk9TUwk6PSBzcHUtCiBTUFVfQ0MJCTo9ICQoU1BVX0NST1NTKWdjYwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2JhY2tpbmdfb3BzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvYmFja2luZ19vcHMuYwppbmRleCA1MGQ5OGExLi42NGViMTViIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvYmFja2luZ19vcHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvYmFja2luZ19vcHMuYwpAQCAtMjg4LDYgKzI4OCwxMiBAQAogCXNwaW5fbG9jaygmY3R4LT5jc2EucmVnaXN0ZXJfbG9jayk7CiAJY3R4LT5jc2EucHJvYi5zcHVfcnVuY250bF9SVyA9IHZhbDsKIAlpZiAodmFsICYgU1BVX1JVTkNOVExfUlVOTkFCTEUpIHsKKwkJY3R4LT5jc2EucHJvYi5zcHVfc3RhdHVzX1IgJj0KKwkJCX5TUFVfU1RBVFVTX1NUT1BQRURfQllfU1RPUCAmCisJCQl+U1BVX1NUQVRVU19TVE9QUEVEX0JZX0hBTFQgJgorCQkJflNQVV9TVEFUVVNfU0lOR0xFX1NURVAgJgorCQkJflNQVV9TVEFUVVNfSU5WQUxJRF9JTlNUUiAmCisJCQl+U1BVX1NUQVRVU19JTlZBTElEX0NIOwogCQljdHgtPmNzYS5wcm9iLnNwdV9zdGF0dXNfUiB8PSBTUFVfU1RBVFVTX1JVTk5JTkc7CiAJfSBlbHNlIHsKIAkJY3R4LT5jc2EucHJvYi5zcHVfc3RhdHVzX1IgJj0gflNQVV9TVEFUVVNfUlVOTklORzsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9mYXVsdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZhdWx0LmMKaW5kZXggZWZmNGQyOS4uZTQ2ZDMwMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZhdWx0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZhdWx0LmMKQEAgLTEwOCw3ICsxMDgsNyBAQAogCXU2NCBlYSwgZHNpc3IsIGFjY2VzczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGZsdCA9IDA7Ci0JaW50IHJldCwgcmV0MjsKKwlpbnQgcmV0OwogCiAJLyoKIAkgKiBkYXIgYW5kIGRzaXNyIGdldCBwYXNzZWQgZnJvbSB0aGUgcmVnaXN0ZXJzCkBAIC0xNDgsMTMgKzE0OCwxMCBAQAogCQlyZXQgPSBzcHVfaGFuZGxlX21tX2ZhdWx0KGN1cnJlbnQtPm1tLCBlYSwgZHNpc3IsICZmbHQpOwogCiAJLyoKLQkgKiBJZiBzcHVfYWNxdWlyZSBmYWlscyBkdWUgdG8gYSBwZW5kaW5nIHNpZ25hbCB3ZSBqdXN0IHdhbnQgdG8gcmV0dXJuCi0JICogRUlOVFIgdG8gdXNlcnNwYWNlIGV2ZW4gaWYgdGhhdCBtZWFucyBtaXNzaW5nIHRoZSBkbWEgcmVzdGFydCBvcgotCSAqIHVwZGF0aW5nIHRoZSBwYWdlIGZhdWx0IHN0YXRpc3RpY3MuCisJICogVGhpcyBpcyBuYXN0eTogd2UgbmVlZCB0aGUgc3RhdGVfbXV0ZXggZm9yIGFsbCB0aGUgYm9va2tlZXBpbmcgZXZlbgorCSAqIGlmIHRoZSBzeXNjYWxsIHdhcyBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbC4gZXd3dy4KIAkgKi8KLQlyZXQyID0gc3B1X2FjcXVpcmUoY3R4KTsKLQlpZiAocmV0MikKLQkJZ290byBvdXQ7CisJbXV0ZXhfbG9jaygmY3R4LT5zdGF0ZV9tdXRleCk7CiAKIAkvKgogCSAqIENsZWFyIGRzaXNyIHVuZGVyIGN0eHQgbG9jayBhZnRlciBoYW5kbGluZyB0aGUgZmF1bHQsIHNvIHRoYXQKQEAgLTE4NSw3ICsxODIsNiBAQAogCX0gZWxzZQogCQlzcHVmc19oYW5kbGVfZXZlbnQoY3R4LCBlYSwgU1BFX0VWRU5UX1NQRV9EQVRBX1NUT1JBR0UpOwogCi0gb3V0OgogCXNwdWN0eF9zd2l0Y2hfc3RhdGUoY3R4LCBTUFVfVVRJTF9TWVNURU0pOwogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYwppbmRleCAzZmNkMDY0Li5jNjZjMzc1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tYXJrZXIuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KQEAgLTM1Nyw2ICszNTgsOSBAQAogewogCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4ID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBhcmVhLCBvZmZzZXQgPSBhZGRyZXNzIC0gdm1hLT52bV9zdGFydDsKKwlpbnQgcmV0ID0gMDsKKworCXNwdV9jb250ZXh0X25vc3B1X3RyYWNlKHNwdWZzX3BzX25vcGZuX19lbnRlciwgY3R4KTsKIAogCW9mZnNldCArPSB2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQ7CiAJaWYgKG9mZnNldCA+PSBwc19zaXplKQpAQCAtMzc1LDE0ICszNzksMTggQEAKIAogCWlmIChjdHgtPnN0YXRlID09IFNQVV9TVEFURV9TQVZFRCkgewogCQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCQlzcHVmc193YWl0KGN0eC0+cnVuX3dxLCBjdHgtPnN0YXRlID09IFNQVV9TVEFURV9SVU5OQUJMRSk7CisJCXNwdV9jb250ZXh0X25vc3B1X3RyYWNlKHNwdWZzX3BzX25vcGZuX19zbGVlcCwgY3R4KTsKKwkJcmV0ID0gc3B1ZnNfd2FpdChjdHgtPnJ1bl93cSwgY3R4LT5zdGF0ZSA9PSBTUFVfU1RBVEVfUlVOTkFCTEUpOworCQlzcHVfY29udGV4dF90cmFjZShzcHVmc19wc19ub3Bmbl9fd2FrZSwgY3R4LCBjdHgtPnNwdSk7CiAJCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKIAl9IGVsc2UgewogCQlhcmVhID0gY3R4LT5zcHUtPnByb2JsZW1fcGh5cyArIHBzX29mZnM7CiAJCXZtX2luc2VydF9wZm4odm1hLCBhZGRyZXNzLCAoYXJlYSArIG9mZnNldCkgPj4gUEFHRV9TSElGVCk7CisJCXNwdV9jb250ZXh0X3RyYWNlKHNwdWZzX3BzX25vcGZuX19pbnNlcnQsIGN0eCwgY3R4LT5zcHUpOwogCX0KIAotCXNwdV9yZWxlYXNlKGN0eCk7CisJaWYgKCFyZXQpCisJCXNwdV9yZWxlYXNlKGN0eCk7CiAJcmV0dXJuIE5PUEZOX1JFRkFVTFQ7CiB9CiAKQEAgLTQ1NCw3ICs0NjIsNyBAQAogCWlmICghaS0+aV9vcGVuZXJzKyspCiAJCWN0eC0+Y250bCA9IGlub2RlLT5pX21hcHBpbmc7CiAJbXV0ZXhfdW5sb2NrKCZjdHgtPm1hcHBpbmdfbG9jayk7Ci0JcmV0dXJuIHNwdWZzX2F0dHJfb3Blbihpbm9kZSwgZmlsZSwgc3B1ZnNfY250bF9nZXQsCisJcmV0dXJuIHNpbXBsZV9hdHRyX29wZW4oaW5vZGUsIGZpbGUsIHNwdWZzX2NudGxfZ2V0LAogCQkJCQlzcHVmc19jbnRsX3NldCwgIjB4JTA4bHgiKTsKIH0KIApAQCAtNDY0LDcgKzQ3Miw3IEBACiAJc3RydWN0IHNwdWZzX2lub2RlX2luZm8gKmkgPSBTUFVGU19JKGlub2RlKTsKIAlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCA9IGktPmlfY3R4OwogCi0Jc3B1ZnNfYXR0cl9yZWxlYXNlKGlub2RlLCBmaWxlKTsKKwlzaW1wbGVfYXR0cl9yZWxlYXNlKGlub2RlLCBmaWxlKTsKIAogCW11dGV4X2xvY2soJmN0eC0+bWFwcGluZ19sb2NrKTsKIAlpZiAoIS0taS0+aV9vcGVuZXJzKQpAQCAtNDc2LDggKzQ4NCw4IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcHVmc19jbnRsX2ZvcHMgPSB7CiAJLm9wZW4gPSBzcHVmc19jbnRsX29wZW4sCiAJLnJlbGVhc2UgPSBzcHVmc19jbnRsX3JlbGVhc2UsCi0JLnJlYWQgPSBzcHVmc19hdHRyX3JlYWQsCi0JLndyaXRlID0gc3B1ZnNfYXR0cl93cml0ZSwKKwkucmVhZCA9IHNpbXBsZV9hdHRyX3JlYWQsCisJLndyaXRlID0gc2ltcGxlX2F0dHJfd3JpdGUsCiAJLm1tYXAgPSBzcHVmc19jbnRsX21tYXAsCiB9OwogCkBAIC03NDksMjMgKzc1NywyNSBAQAogCiAJY291bnQgPSBzcHVfYWNxdWlyZShjdHgpOwogCWlmIChjb3VudCkKLQkJcmV0dXJuIGNvdW50OworCQlnb3RvIG91dDsKIAogCS8qIHdhaXQgb25seSBmb3IgdGhlIGZpcnN0IGVsZW1lbnQgKi8KIAljb3VudCA9IDA7CiAJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0JCWlmICghc3B1X2lib3hfcmVhZChjdHgsICZpYm94X2RhdGEpKQorCQlpZiAoIXNwdV9pYm94X3JlYWQoY3R4LCAmaWJveF9kYXRhKSkgewogCQkJY291bnQgPSAtRUFHQUlOOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CiAJfSBlbHNlIHsKIAkJY291bnQgPSBzcHVmc193YWl0KGN0eC0+aWJveF93cSwgc3B1X2lib3hfcmVhZChjdHgsICZpYm94X2RhdGEpKTsKKwkJaWYgKGNvdW50KQorCQkJZ290byBvdXQ7CiAJfQotCWlmIChjb3VudCkKLQkJZ290byBvdXQ7CiAKIAkvKiBpZiB3ZSBjYW4ndCB3cml0ZSBhdCBhbGwsIHJldHVybiAtRUZBVUxUICovCiAJY291bnQgPSBfX3B1dF91c2VyKGlib3hfZGF0YSwgdWRhdGEpOwogCWlmIChjb3VudCkKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3VubG9jazsKIAogCWZvciAoY291bnQgPSA0LCB1ZGF0YSsrOyAoY291bnQgKyA0KSA8PSBsZW47IGNvdW50ICs9IDQsIHVkYXRhKyspIHsKIAkJaW50IHJldDsKQEAgLTc4Miw5ICs3OTIsOSBAQAogCQkJYnJlYWs7CiAJfQogCi1vdXQ6CitvdXRfdW5sb2NrOgogCXNwdV9yZWxlYXNlKGN0eCk7Ci0KK291dDoKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTg5OSw3ICs5MDksNyBAQAogCiAJY291bnQgPSBzcHVfYWNxdWlyZShjdHgpOwogCWlmIChjb3VudCkKLQkJcmV0dXJuIGNvdW50OworCQlnb3RvIG91dDsKIAogCS8qCiAJICogbWFrZSBzdXJlIHdlIGNhbiBhdCBsZWFzdCB3cml0ZSBvbmUgZWxlbWVudCwgYnkgd2FpdGluZwpAQCAtOTA3LDE0ICs5MTcsMTYgQEAKIAkgKi8KIAljb3VudCA9IDA7CiAJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0JCWlmICghc3B1X3dib3hfd3JpdGUoY3R4LCB3Ym94X2RhdGEpKQorCQlpZiAoIXNwdV93Ym94X3dyaXRlKGN0eCwgd2JveF9kYXRhKSkgewogCQkJY291bnQgPSAtRUFHQUlOOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CiAJfSBlbHNlIHsKIAkJY291bnQgPSBzcHVmc193YWl0KGN0eC0+d2JveF93cSwgc3B1X3dib3hfd3JpdGUoY3R4LCB3Ym94X2RhdGEpKTsKKwkJaWYgKGNvdW50KQorCQkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGNvdW50KQotCQlnb3RvIG91dDsKIAogCS8qIHdyaXRlIGFzIG11Y2ggYXMgcG9zc2libGUgKi8KIAlmb3IgKGNvdW50ID0gNCwgdWRhdGErKzsgKGNvdW50ICsgNCkgPD0gbGVuOyBjb3VudCArPSA0LCB1ZGF0YSsrKSB7CkBAIC05MjgsOCArOTQwLDkgQEAKIAkJCWJyZWFrOwogCX0KIAotb3V0Ogorb3V0X3VubG9jazoKIAlzcHVfcmVsZWFzZShjdHgpOworb3V0OgogCXJldHVybiBjb3VudDsKIH0KIApAQCAtMTU5MiwxMiArMTYwNSwxMSBAQAogCX0gZWxzZSB7CiAJCXJldCA9IHNwdWZzX3dhaXQoY3R4LT5tZmNfd3EsCiAJCQkgICBzcHVmc19yZWFkX21mY190YWdzdGF0dXMoY3R4LCAmc3RhdHVzKSk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKIAl9CiAJc3B1X3JlbGVhc2UoY3R4KTsKIAotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCiAJcmV0ID0gNDsKIAlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgJnN0YXR1cywgNCkpCiAJCXJldCA9IC1FRkFVTFQ7CkBAIC0xNzI2LDYgKzE3MzgsOCBAQAogCQlpbnQgc3RhdHVzOwogCQlyZXQgPSBzcHVmc193YWl0KGN0eC0+bWZjX3dxLAogCQkJCSBzcHVfc2VuZF9tZmNfY29tbWFuZChjdHgsIGNtZCwgJnN0YXR1cykpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CiAJCWlmIChzdGF0dXMpCiAJCQlyZXQgPSBzdGF0dXM7CiAJfQpAQCAtMTc3OSw3ICsxNzkzLDcgQEAKIAogCXJldCA9IHNwdV9hY3F1aXJlKGN0eCk7CiAJaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBvdXQ7CiAjaWYgMAogLyogdGhpcyBjdXJyZW50bHkgaGFuZ3MgKi8KIAlyZXQgPSBzcHVmc193YWl0KGN0eC0+bWZjX3dxLApAQCAtMTc4OCwxMiArMTgwMiwxMyBAQAogCQlnb3RvIG91dDsKIAlyZXQgPSBzcHVmc193YWl0KGN0eC0+bWZjX3dxLAogCQkJIGN0eC0+b3BzLT5yZWFkX21mY190YWdzdGF0dXMoY3R4KSA9PSBjdHgtPnRhZ3dhaXQpOwotb3V0OgorCWlmIChyZXQpCisJCWdvdG8gb3V0OwogI2Vsc2UKIAlyZXQgPSAwOwogI2VuZGlmCiAJc3B1X3JlbGVhc2UoY3R4KTsKLQorb3V0OgogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9pbm9kZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2lub2RlLmMKaW5kZXggYzBlOTY4YS4uZTZlNjU1OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2lub2RlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2lub2RlLmMKQEAgLTMyMiw3ICszMjIsNyBAQAogc3B1ZnNfYXNzZXJ0X2FmZmluaXR5KHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IHNwdV9nYW5nICpnYW5nLAogCQkJCQkJc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0Jc3RydWN0IHNwdV9jb250ZXh0ICp0bXAsICpuZWlnaGJvcjsKKwlzdHJ1Y3Qgc3B1X2NvbnRleHQgKnRtcCwgKm5laWdoYm9yLCAqZXJyOwogCWludCBjb3VudCwgbm9kZTsKIAlpbnQgYWZmX3N1cHA7CiAKQEAgLTM1NCwxMSArMzU0LDE1IEBACiAJCWlmICghbGlzdF9lbXB0eSgmbmVpZ2hib3ItPmFmZl9saXN0KSAmJiAhKG5laWdoYm9yLT5hZmZfaGVhZCkgJiYKIAkJICAgICFsaXN0X2lzX2xhc3QoJm5laWdoYm9yLT5hZmZfbGlzdCwgJmdhbmctPmFmZl9saXN0X2hlYWQpICYmCiAJCSAgICAhbGlzdF9lbnRyeShuZWlnaGJvci0+YWZmX2xpc3QubmV4dCwgc3RydWN0IHNwdV9jb250ZXh0LAotCQkgICAgYWZmX2xpc3QpLT5hZmZfaGVhZCkKLQkJCXJldHVybiBFUlJfUFRSKC1FRVhJU1QpOworCQkgICAgYWZmX2xpc3QpLT5hZmZfaGVhZCkgeworCQkJZXJyID0gRVJSX1BUUigtRUVYSVNUKTsKKwkJCWdvdG8gb3V0X3B1dF9uZWlnaGJvcjsKKwkJfQogCi0JCWlmIChnYW5nICE9IG5laWdoYm9yLT5nYW5nKQotCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJCWlmIChnYW5nICE9IG5laWdoYm9yLT5nYW5nKSB7CisJCQllcnIgPSBFUlJfUFRSKC1FSU5WQUwpOworCQkJZ290byBvdXRfcHV0X25laWdoYm9yOworCQl9CiAKIAkJY291bnQgPSAxOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJmdhbmctPmFmZl9saXN0X2hlYWQsIGFmZl9saXN0KQpAQCAtMzcyLDExICszNzYsMTcgQEAKIAkJCQlicmVhazsKIAkJfQogCi0JCWlmIChub2RlID09IE1BWF9OVU1OT0RFUykKLQkJCXJldHVybiBFUlJfUFRSKC1FRVhJU1QpOworCQlpZiAobm9kZSA9PSBNQVhfTlVNTk9ERVMpIHsKKwkJCWVyciA9IEVSUl9QVFIoLUVFWElTVCk7CisJCQlnb3RvIG91dF9wdXRfbmVpZ2hib3I7CisJCX0KIAl9CiAKIAlyZXR1cm4gbmVpZ2hib3I7CisKK291dF9wdXRfbmVpZ2hib3I6CisJcHV0X3NwdV9jb250ZXh0KG5laWdoYm9yKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNDU0LDkgKzQ2NCwxMiBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0X2FmZl91bmxvY2s7CiAKLQlpZiAoYWZmaW5pdHkpCisJaWYgKGFmZmluaXR5KSB7CiAJCXNwdWZzX3NldF9hZmZpbml0eShmbGFncywgU1BVRlNfSShkZW50cnktPmRfaW5vZGUpLT5pX2N0eCwKIAkJCQkJCQkJbmVpZ2hib3IpOworCQlpZiAobmVpZ2hib3IpCisJCQlwdXRfc3B1X2NvbnRleHQobmVpZ2hib3IpOworCX0KIAogCS8qCiAJICogZ2V0IHJlZmVyZW5jZXMgZm9yIGRnZXQgYW5kIG1udGdldCwgd2lsbCBiZSByZWxlYXNlZApAQCAtNzQyLDggKzc1NSwxMSBAQAogCQkuc3RhdGZzID0gc2ltcGxlX3N0YXRmcywKIAkJLmRlbGV0ZV9pbm9kZSA9IHNwdWZzX2RlbGV0ZV9pbm9kZSwKIAkJLmRyb3BfaW5vZGUgPSBnZW5lcmljX2RlbGV0ZV9pbm9kZSwKKwkJLnNob3dfb3B0aW9ucyA9IGdlbmVyaWNfc2hvd19vcHRpb25zLAogCX07CiAKKwlzYXZlX21vdW50X29wdGlvbnMoc2IsIGRhdGEpOworCiAJc2ItPnNfbWF4Ynl0ZXMgPSBNQVhfTEZTX0ZJTEVTSVpFOwogCXNiLT5zX2Jsb2Nrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKIAlzYi0+c19ibG9ja3NpemVfYml0cyA9IFBBR0VfQ0FDSEVfU0hJRlQ7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvcnVuLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvcnVuLmMKaW5kZXggYzAxYTA5ZC4uZmNhMjJlMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3J1bi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9ydW4uYwpAQCAtNTMsNyArNTMsNyBAQAogCiAJc3RvcHBlZCA9IFNQVV9TVEFUVVNfSU5WQUxJRF9JTlNUUiB8IFNQVV9TVEFUVVNfU0lOR0xFX1NURVAgfAogCQlTUFVfU1RBVFVTX1NUT1BQRURfQllfSEFMVCB8IFNQVV9TVEFUVVNfU1RPUFBFRF9CWV9TVE9QOwotCWlmICgqc3RhdCAmIHN0b3BwZWQpCisJaWYgKCEoKnN0YXQgJiBTUFVfU1RBVFVTX1JVTk5JTkcpICYmICgqc3RhdCAmIHN0b3BwZWQpKQogCQlyZXR1cm4gMTsKIAogCWRzaXNyID0gY3R4LT5jc2EuZHNpc3I7CkBAIC0zNTQsOCArMzU0LDE1IEBACiAKIAlkbyB7CiAJCXJldCA9IHNwdWZzX3dhaXQoY3R4LT5zdG9wX3dxLCBzcHVfc3RvcHBlZChjdHgsICZzdGF0dXMpKTsKLQkJaWYgKHVubGlrZWx5KHJldCkpCisJCWlmICh1bmxpa2VseShyZXQpKSB7CisJCQkvKgorCQkJICogVGhpcyBpcyBuYXN0eTogd2UgbmVlZCB0aGUgc3RhdGVfbXV0ZXggZm9yIGFsbCB0aGUKKwkJCSAqIGJvb2trZWVwaW5nIGV2ZW4gaWYgdGhlIHN5c2NhbGwgd2FzIGludGVycnVwdGVkIGJ5CisJCQkgKiBhIHNpZ25hbC4gZXd3dy4KKwkJCSAqLworCQkJbXV0ZXhfbG9jaygmY3R4LT5zdGF0ZV9tdXRleCk7CiAJCQlicmVhazsKKwkJfQogCQlzcHUgPSBjdHgtPnNwdTsKIAkJaWYgKHVubGlrZWx5KHRlc3RfYW5kX2NsZWFyX2JpdChTUFVfU0NIRURfTk9USUZZX0FDVElWRSwKIAkJCQkJCSZjdHgtPnNjaGVkX2ZsYWdzKSkpIHsKQEAgLTM4OCwxNiArMzk1LDE0IEBACiAJCQkJICAgICAgU1BVX1NUQVRVU19TVE9QUEVEX0JZX0hBTFQgfAogCQkJCSAgICAgICBTUFVfU1RBVFVTX1NJTkdMRV9TVEVQKSkpOwogCi0JaWYgKChzdGF0dXMgJiBTUFVfU1RBVFVTX1NUT1BQRURfQllfU1RPUCkgJiYKLQkgICAgKCgoc3RhdHVzID4+IFNQVV9TVE9QX1NUQVRVU19TSElGVCkgJiAweDNmMDApID09IDB4MjEwMCkgJiYKLQkgICAgKGN0eC0+c3RhdGUgPT0gU1BVX1NUQVRFX1JVTk5BQkxFKSkKLQkJY3R4LT5zdGF0cy5saWJhc3Npc3QrKzsKLQotCiAJc3B1X2Rpc2FibGVfc3B1KGN0eCk7CiAJcmV0ID0gc3B1X3J1bl9maW5pKGN0eCwgbnBjLCAmc3RhdHVzKTsKIAlzcHVfeWllbGQoY3R4KTsKIAorCWlmICgoc3RhdHVzICYgU1BVX1NUQVRVU19TVE9QUEVEX0JZX1NUT1ApICYmCisJICAgICgoKHN0YXR1cyA+PiBTUFVfU1RPUF9TVEFUVVNfU0hJRlQpICYgMHgzZjAwKSA9PSAweDIxMDApKQorCQljdHgtPnN0YXRzLmxpYmFzc2lzdCsrOworCiAJaWYgKChyZXQgPT0gMCkgfHwKIAkgICAgKChyZXQgPT0gLUVSRVNUQVJUU1lTKSAmJgogCSAgICAgKChzdGF0dXMgJiBTUFVfU1RBVFVTX1NUT1BQRURfQllfSEFMVCkgfHwKQEAgLTQxMCw4ICs0MTUsMTEgQEAKIAkgKiBzaW5jZSB3ZSBoYXZlIFRJRl9TSU5HTEVTVEVQIHNldCwgdGh1cyB0aGUga2VybmVsIHdpbGwgZG8KIAkgKiBpdCB1cG9uIHJldHVybiBmcm9tIHRoZSBzeXNjYWxsIGFueWF3eQogCSAqLwotCWlmICgoc3RhdHVzICYgU1BVX1NUQVRVU19TVE9QUEVEX0JZX1NUT1ApCi0JICAgICYmIChzdGF0dXMgPj4gU1BVX1NUT1BfU1RBVFVTX1NISUZUKSA9PSAweDNmZmYpIHsKKwlpZiAodW5saWtlbHkoc3RhdHVzICYgU1BVX1NUQVRVU19TSU5HTEVfU1RFUCkpCisJCXJldCA9IC1FUkVTVEFSVFNZUzsKKworCWVsc2UgaWYgKHVubGlrZWx5KChzdGF0dXMgJiBTUFVfU1RBVFVTX1NUT1BQRURfQllfU1RPUCkKKwkgICAgJiYgKHN0YXR1cyA+PiBTUFVfU1RPUF9TVEFUVVNfU0hJRlQpID09IDB4M2ZmZikpIHsKIAkJZm9yY2Vfc2lnKFNJR1RSQVAsIGN1cnJlbnQpOwogCQlyZXQgPSAtRVJFU1RBUlRTWVM7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NjaGVkLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYwppbmRleCAwMGQ5MTQyLi41OTE1MzQzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BpZF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tYXJrZXIuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgpAQCAtMjE2LDggKzIxNyw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIHNwdV9iaW5kX2NvbnRleHQoc3RydWN0IHNwdSAqc3B1LCBzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKIHsKLQlwcl9kZWJ1ZygiJXM6IHBpZD0lZCBTUFU9JWQgTk9ERT0lZFxuIiwgX19GVU5DVElPTl9fLCBjdXJyZW50LT5waWQsCi0JCSBzcHUtPm51bWJlciwgc3B1LT5ub2RlKTsKKwlzcHVfY29udGV4dF90cmFjZShzcHVfYmluZF9jb250ZXh0X19lbnRlciwgY3R4LCBzcHUpOworCiAJc3B1Y3R4X3N3aXRjaF9zdGF0ZShjdHgsIFNQVV9VVElMX1NZU1RFTSk7CiAKIAlpZiAoY3R4LT5mbGFncyAmIFNQVV9DUkVBVEVfTk9TQ0hFRCkKQEAgLTM5OSw4ICs0MDAsOCBAQAogICovCiBzdGF0aWMgdm9pZCBzcHVfdW5iaW5kX2NvbnRleHQoc3RydWN0IHNwdSAqc3B1LCBzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKIHsKLQlwcl9kZWJ1ZygiJXM6IHVuYmluZCBwaWQ9JWQgU1BVPSVkIE5PREU9JWRcbiIsIF9fRlVOQ1RJT05fXywKLQkJIHNwdS0+cGlkLCBzcHUtPm51bWJlciwgc3B1LT5ub2RlKTsKKwlzcHVfY29udGV4dF90cmFjZShzcHVfdW5iaW5kX2NvbnRleHRfX2VudGVyLCBjdHgsIHNwdSk7CisKIAlzcHVjdHhfc3dpdGNoX3N0YXRlKGN0eCwgU1BVX1VUSUxfU1lTVEVNKTsKIAogIAlpZiAoc3B1LT5jdHgtPmZsYWdzICYgU1BVX0NSRUFURV9OT1NDSEVEKQpAQCAtNTI4LDYgKzUyOSw4IEBACiAJc3RydWN0IHNwdSAqc3B1LCAqYWZmX3JlZl9zcHU7CiAJaW50IG5vZGUsIG47CiAKKwlzcHVfY29udGV4dF9ub3NwdV90cmFjZShzcHVfZ2V0X2lkbGVfX2VudGVyLCBjdHgpOworCiAJaWYgKGN0eC0+Z2FuZykgewogCQltdXRleF9sb2NrKCZjdHgtPmdhbmctPmFmZl9tdXRleCk7CiAJCWlmIChoYXNfYWZmaW5pdHkoY3R4KSkgewpAQCAtNTQ2LDggKzU0OSw3IEBACiAJCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmY3R4LT5nYW5nLT5hZmZfc2NoZWRfY291bnQpKQogCQkJCWN0eC0+Z2FuZy0+YWZmX3JlZl9zcHUgPSBOVUxMOwogCQkJbXV0ZXhfdW5sb2NrKCZjdHgtPmdhbmctPmFmZl9tdXRleCk7Ci0KLQkJCXJldHVybiBOVUxMOworCQkJZ290byBub3RfZm91bmQ7CiAJCX0KIAkJbXV0ZXhfdW5sb2NrKCZjdHgtPmdhbmctPmFmZl9tdXRleCk7CiAJfQpAQCAtNTY1LDEyICs1NjcsMTQgQEAKIAkJbXV0ZXhfdW5sb2NrKCZjYmVfc3B1X2luZm9bbm9kZV0ubGlzdF9tdXRleCk7CiAJfQogCisgbm90X2ZvdW5kOgorCXNwdV9jb250ZXh0X25vc3B1X3RyYWNlKHNwdV9nZXRfaWRsZV9fbm90X2ZvdW5kLCBjdHgpOwogCXJldHVybiBOVUxMOwogCiAgZm91bmQ6CiAJc3B1LT5hbGxvY19zdGF0ZSA9IFNQVV9VU0VEOwogCW11dGV4X3VubG9jaygmY2JlX3NwdV9pbmZvW25vZGVdLmxpc3RfbXV0ZXgpOwotCXByX2RlYnVnKCJHb3QgU1BVICVkICVkXG4iLCBzcHUtPm51bWJlciwgc3B1LT5ub2RlKTsKKwlzcHVfY29udGV4dF90cmFjZShzcHVfZ2V0X2lkbGVfX2ZvdW5kLCBjdHgsIHNwdSk7CiAJc3B1X2luaXRfY2hhbm5lbHMoc3B1KTsKIAlyZXR1cm4gc3B1OwogfQpAQCAtNTg3LDYgKzU5MSw4IEBACiAJc3RydWN0IHNwdSAqc3B1OwogCWludCBub2RlLCBuOwogCisJc3B1X2NvbnRleHRfbm9zcHVfdHJhY2Uoc3B1X2ZpbmRfdml0aW1fX2VudGVyLCBjdHgpOworCiAJLyoKIAkgKiBMb29rIGZvciBhIHBvc3NpYmxlIHByZWVtcHRpb24gY2FuZGlkYXRlIG9uIHRoZSBsb2NhbCBub2RlIGZpcnN0LgogCSAqIElmIHRoZXJlIGlzIG5vIGNhbmRpZGF0ZSBsb29rIGF0IHRoZSBvdGhlciBub2Rlcy4gIFRoaXMgaXNuJ3QKQEAgLTY0MCw2ICs2NDYsOCBAQAogCQkJCWdvdG8gcmVzdGFydDsKIAkJCX0KIAorCQkJc3B1X2NvbnRleHRfdHJhY2UoX19zcHVfZGVhY3RpdmF0ZV9fdW5sb2FkLCBjdHgsIHNwdSk7CisKIAkJCW11dGV4X2xvY2soJmNiZV9zcHVfaW5mb1tub2RlXS5saXN0X211dGV4KTsKIAkJCWNiZV9zcHVfaW5mb1tub2RlXS5ucl9hY3RpdmUtLTsKIAkJCXNwdV91bmJpbmRfY29udGV4dChzcHUsIHZpY3RpbSk7CkBAIC04MjIsNiArODMwLDcgQEAKICAqLwogdm9pZCBzcHVfZGVhY3RpdmF0ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCkKIHsKKwlzcHVfY29udGV4dF9ub3NwdV90cmFjZShzcHVfZGVhY3RpdmF0ZV9fZW50ZXIsIGN0eCk7CiAJX19zcHVfZGVhY3RpdmF0ZShjdHgsIDEsIE1BWF9QUklPKTsKIH0KIApAQCAtODM1LDYgKzg0NCw3IEBACiAgKi8KIHZvaWQgc3B1X3lpZWxkKHN0cnVjdCBzcHVfY29udGV4dCAqY3R4KQogeworCXNwdV9jb250ZXh0X25vc3B1X3RyYWNlKHNwdV95aWVsZF9fZW50ZXIsIGN0eCk7CiAJaWYgKCEoY3R4LT5mbGFncyAmIFNQVV9DUkVBVEVfTk9TQ0hFRCkpIHsKIAkJbXV0ZXhfbG9jaygmY3R4LT5zdGF0ZV9tdXRleCk7CiAJCV9fc3B1X2RlYWN0aXZhdGUoY3R4LCAwLCBNQVhfUFJJTyk7CkBAIC04NjQsMTEgKzg3NCwxNSBAQAogCQlnb3RvIG91dDsKIAogCXNwdSA9IGN0eC0+c3B1OworCisJc3B1X2NvbnRleHRfdHJhY2Uoc3B1c2NoZWRfdGlja19fcHJlZW1wdCwgY3R4LCBzcHUpOworCiAJbmV3ID0gZ3JhYl9ydW5uYWJsZV9jb250ZXh0KGN0eC0+cHJpbyArIDEsIHNwdS0+bm9kZSk7CiAJaWYgKG5ldykgewogCQlzcHVfdW5zY2hlZHVsZShzcHUsIGN0eCk7CiAJCXNwdV9hZGRfdG9fcnEoY3R4KTsKIAl9IGVsc2UgeworCQlzcHVfY29udGV4dF9ub3NwdV90cmFjZShzcHVzY2hlZF90aWNrX19uZXdzbGljZSwgY3R4KTsKIAkJY3R4LT50aW1lX3NsaWNlKys7CiAJfQogb3V0OgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdWZzLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1ZnMuaAppbmRleCAwZTExNDAzLi4yYzJmZTNjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1ZnMuaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1ZnMuaApAQCAtMjY4LDYgKzI2OCw5IEBACiAgKglTYW1lIGFzIHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgpLCBleGNlcHQgdGhhdCBoZXJlCiAgKgl3ZSBuZWVkIHRvIGNhbGwgc3B1X3JlbGVhc2UoY3R4KSBiZWZvcmUgc2xlZXBpbmcsIGFuZAogICoJdGhlbiBzcHVfYWNxdWlyZShjdHgpIHdoZW4gYXdva2VuLgorICoKKyAqIAlSZXR1cm5zIHdpdGggc3RhdGVfbXV0ZXggcmUtYWNxdWlyZWQgd2hlbiBzdWNjZXNzZnVsbCBvcgorICogCXdpdGggLUVSRVNUQVJUU1lTIGFuZCB0aGUgc3RhdGVfbXV0ZXggZHJvcHBlZCB3aGVuIGludGVycnVwdGVkLgogICovCiAKICNkZWZpbmUgc3B1ZnNfd2FpdCh3cSwgY29uZGl0aW9uKQkJCQkJXApAQCAtMjc4LDExICsyODEsMTEgQEAKIAkJcHJlcGFyZV90b193YWl0KCYod3EpLCAmX193YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwlcCiAJCWlmIChjb25kaXRpb24pCQkJCQkJXAogCQkJYnJlYWs7CQkJCQkJXAorCQlzcHVfcmVsZWFzZShjdHgpOwkJCQkJXAogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsJCQkJXAogCQkJX19yZXQgPSAtRVJFU1RBUlRTWVM7CQkJCVwKIAkJCWJyZWFrOwkJCQkJCVwKIAkJfQkJCQkJCQlcCi0JCXNwdV9yZWxlYXNlKGN0eCk7CQkJCQlcCiAJCXNjaGVkdWxlKCk7CQkJCQkJXAogCQlfX3JldCA9IHNwdV9hY3F1aXJlKGN0eCk7CQkJCVwKIAkJaWYgKF9fcmV0KQkJCQkJCVwKQEAgLTMyNSw0ICszMjgsOSBAQAogZXh0ZXJuIHZvaWQgc3B1Y3R4X3N3aXRjaF9zdGF0ZShzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwKIAkJZW51bSBzcHVfdXRpbGl6YXRpb25fc3RhdGUgbmV3X3N0YXRlKTsKIAorI2RlZmluZSBzcHVfY29udGV4dF90cmFjZShuYW1lLCBjdHgsIHNwdSkgXAorCXRyYWNlX21hcmsobmFtZSwgIiVwICVwIiwgY3R4LCBzcHUpOworI2RlZmluZSBzcHVfY29udGV4dF9ub3NwdV90cmFjZShuYW1lLCBjdHgpIFwKKwl0cmFjZV9tYXJrKG5hbWUsICIlcCIsIGN0eCk7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdXRyYWNlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1dHJhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjE5NTNmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdXRyYWNlLmMKQEAgLTAsMCArMSwyNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgKKyAqCVJlbGVhc2VkIHVuZGVyIEdQTCB2Mi4KKyAqCisgKiBQYXJ0aWFsbHkgYmFzZWQgb24gbmV0L2lwdjQvdGNwX3Byb2JlLmMuCisgKgorICogU2ltcGxlIHRyYWNpbmcgZmFjaWxpdHkgZm9yIHNwdSBjb250ZXh0cy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWFya2VyLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlICJzcHVmcy5oIgorCitzdHJ1Y3Qgc3B1X3Byb2JlIHsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKmZvcm1hdDsKKwltYXJrZXJfcHJvYmVfZnVuYyAqcHJvYmVfZnVuYzsKK307CisKK3N0cnVjdCBzcHV0cmFjZSB7CisJa3RpbWVfdCB0c3RhbXA7CisJaW50IG93bmVyX3RpZDsgLyogb3duZXIgKi8KKwlpbnQgY3Vycl90aWQ7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgbnVtYmVyOworfTsKKworc3RhdGljIGludCBidWZzaXplIF9fcmVhZF9tb3N0bHkgPSAxNjM4NDsKK01PRFVMRV9QQVJNX0RFU0MoYnVmc2l6ZSwgIkxvZyBidWZmZXIgc2l6ZSAobnVtYmVyIG9mIHJlY29yZHMpIik7Cittb2R1bGVfcGFyYW0oYnVmc2l6ZSwgaW50LCAwKTsKKworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNwdXRyYWNlX2xvY2spOworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHNwdXRyYWNlX3dhaXQpOworc3RhdGljIGt0aW1lX3Qgc3B1dHJhY2Vfc3RhcnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBzcHV0cmFjZV9oZWFkLCBzcHV0cmFjZV90YWlsOworc3RhdGljIHN0cnVjdCBzcHV0cmFjZSAqc3B1dHJhY2VfbG9nOworCitzdGF0aWMgaW50IHNwdXRyYWNlX3VzZWQodm9pZCkKK3sKKwlyZXR1cm4gKHNwdXRyYWNlX2hlYWQgLSBzcHV0cmFjZV90YWlsKSAlIGJ1ZnNpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNwdXRyYWNlX2F2YWlsKHZvaWQpCit7CisJcmV0dXJuIGJ1ZnNpemUgLSBzcHV0cmFjZV91c2VkKCk7Cit9CisKK3N0YXRpYyBpbnQgc3B1dHJhY2Vfc3ByaW50KGNoYXIgKnRidWYsIGludCBuKQoreworCWNvbnN0IHN0cnVjdCBzcHV0cmFjZSAqdCA9IHNwdXRyYWNlX2xvZyArIHNwdXRyYWNlX3RhaWwgJSBidWZzaXplOworCXN0cnVjdCB0aW1lc3BlYyB0diA9CisJCWt0aW1lX3RvX3RpbWVzcGVjKGt0aW1lX3N1Yih0LT50c3RhbXAsIHNwdXRyYWNlX3N0YXJ0KSk7CisKKwlyZXR1cm4gc25wcmludGYodGJ1ZiwgbiwKKwkJIlslbHUuJTA5bHVdICVkOiAlcyAodGhyZWFkID0gJWQsIHNwdSA9ICVkKVxuIiwKKwkJKHVuc2lnbmVkIGxvbmcpIHR2LnR2X3NlYywKKwkJKHVuc2lnbmVkIGxvbmcpIHR2LnR2X25zZWMsCisJCXQtPm93bmVyX3RpZCwKKwkJdC0+bmFtZSwKKwkJdC0+Y3Vycl90aWQsCisJCXQtPm51bWJlcik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNwdXRyYWNlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCXNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgZXJyb3IgPSAwLCBjbnQgPSAwOworCisJaWYgKCFidWYgfHwgbGVuIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3aGlsZSAoY250IDwgbGVuKSB7CisJCWNoYXIgdGJ1ZlsxMjhdOworCQlpbnQgd2lkdGg7CisKKwkJZXJyb3IgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc3B1dHJhY2Vfd2FpdCwKKwkJCQkJCSBzcHV0cmFjZV91c2VkKCkgPiAwKTsKKwkJaWYgKGVycm9yKQorCQkJYnJlYWs7CisKKwkJc3Bpbl9sb2NrKCZzcHV0cmFjZV9sb2NrKTsKKwkJaWYgKHNwdXRyYWNlX2hlYWQgPT0gc3B1dHJhY2VfdGFpbCkgeworCQkJc3Bpbl91bmxvY2soJnNwdXRyYWNlX2xvY2spOworCQkJY29udGludWU7CisJCX0KKworCQl3aWR0aCA9IHNwdXRyYWNlX3NwcmludCh0YnVmLCBzaXplb2YodGJ1ZikpOworCQlpZiAod2lkdGggPCBsZW4pCisJCQlzcHV0cmFjZV90YWlsID0gKHNwdXRyYWNlX3RhaWwgKyAxKSAlIGJ1ZnNpemU7CisJCXNwaW5fdW5sb2NrKCZzcHV0cmFjZV9sb2NrKTsKKworCQlpZiAod2lkdGggPj0gbGVuKQorCQkJYnJlYWs7CisKKwkJZXJyb3IgPSBjb3B5X3RvX3VzZXIoYnVmICsgY250LCB0YnVmLCB3aWR0aCk7CisJCWlmIChlcnJvcikKKwkJCWJyZWFrOworCQljbnQgKz0gd2lkdGg7CisJfQorCisJcmV0dXJuIGNudCA9PSAwID8gZXJyb3IgOiBjbnQ7Cit9CisKK3N0YXRpYyBpbnQgc3B1dHJhY2Vfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzcGluX2xvY2soJnNwdXRyYWNlX2xvY2spOworCXNwdXRyYWNlX2hlYWQgPSBzcHV0cmFjZV90YWlsID0gMDsKKwlzcHV0cmFjZV9zdGFydCA9IGt0aW1lX2dldCgpOworCXNwaW5fdW5sb2NrKCZzcHV0cmFjZV9sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcHV0cmFjZV9mb3BzID0geworCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5vcGVuCT0gc3B1dHJhY2Vfb3BlbiwKKwkucmVhZAk9IHNwdXRyYWNlX3JlYWQsCit9OworCitzdGF0aWMgdm9pZCBzcHV0cmFjZV9sb2dfaXRlbShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eCwKKwkJc3RydWN0IHNwdSAqc3B1KQoreworCXNwaW5fbG9jaygmc3B1dHJhY2VfbG9jayk7CisJaWYgKHNwdXRyYWNlX2F2YWlsKCkgPiAxKSB7CisJCXN0cnVjdCBzcHV0cmFjZSAqdCA9IHNwdXRyYWNlX2xvZyArIHNwdXRyYWNlX2hlYWQ7CisKKwkJdC0+dHN0YW1wID0ga3RpbWVfZ2V0KCk7CisJCXQtPm93bmVyX3RpZCA9IGN0eC0+dGlkOworCQl0LT5uYW1lID0gbmFtZTsKKwkJdC0+Y3Vycl90aWQgPSBjdXJyZW50LT5waWQ7CisJCXQtPm51bWJlciA9IHNwdSA/IHNwdS0+bnVtYmVyIDogLTE7CisKKwkJc3B1dHJhY2VfaGVhZCA9IChzcHV0cmFjZV9oZWFkICsgMSkgJSBidWZzaXplOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJzcHV0cmFjZTogbG9zdCBzYW1wbGVzIGR1ZSB0byBmdWxsIGJ1ZmZlci5cbiIpOworCX0KKwlzcGluX3VubG9jaygmc3B1dHJhY2VfbG9jayk7CisKKwl3YWtlX3VwKCZzcHV0cmFjZV93YWl0KTsKK30KKworc3RhdGljIHZvaWQgc3B1X2NvbnRleHRfZXZlbnQoY29uc3Qgc3RydWN0IG1hcmtlciAqbWRhdGEsCisJCXZvaWQgKnByaXZhdGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXN0cnVjdCBzcHVfcHJvYmUgKnAgPSBtZGF0YS0+cHJpdmF0ZTsKKwl2YV9saXN0IGFwOworCXN0cnVjdCBzcHVfY29udGV4dCAqY3R4OworCXN0cnVjdCBzcHUgKnNwdTsKKworCXZhX3N0YXJ0KGFwLCBmb3JtYXQpOworCWN0eCA9IHZhX2FyZyhhcCwgc3RydWN0IHNwdV9jb250ZXh0ICopOworCXNwdSA9IHZhX2FyZyhhcCwgc3RydWN0IHNwdSAqKTsKKworCXNwdXRyYWNlX2xvZ19pdGVtKHAtPm5hbWUsIGN0eCwgc3B1KTsKKwl2YV9lbmQoYXApOworfQorCitzdGF0aWMgdm9pZCBzcHVfY29udGV4dF9ub3NwdV9ldmVudChjb25zdCBzdHJ1Y3QgbWFya2VyICptZGF0YSwKKwkJdm9pZCAqcHJpdmF0ZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJc3RydWN0IHNwdV9wcm9iZSAqcCA9IG1kYXRhLT5wcml2YXRlOworCXZhX2xpc3QgYXA7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHg7CisKKwl2YV9zdGFydChhcCwgZm9ybWF0KTsKKwljdHggPSB2YV9hcmcoYXAsIHN0cnVjdCBzcHVfY29udGV4dCAqKTsKKworCXNwdXRyYWNlX2xvZ19pdGVtKHAtPm5hbWUsIGN0eCwgTlVMTCk7CisJdmFfZW5kKGFwKTsKK30KKworc3RydWN0IHNwdV9wcm9iZSBzcHVfcHJvYmVzW10gPSB7CisJeyAic3B1X2JpbmRfY29udGV4dF9fZW50ZXIiLCAiJXAgJXAiLCBzcHVfY29udGV4dF9ldmVudCB9LAorCXsgInNwdV91bmJpbmRfY29udGV4dF9fZW50ZXIiLCAiJXAgJXAiLCBzcHVfY29udGV4dF9ldmVudCB9LAorCXsgInNwdV9nZXRfaWRsZV9fZW50ZXIiLCAiJXAiLCBzcHVfY29udGV4dF9ub3NwdV9ldmVudCB9LAorCXsgInNwdV9nZXRfaWRsZV9fZm91bmQiLCAiJXAgJXAiLCBzcHVfY29udGV4dF9ldmVudCB9LAorCXsgInNwdV9nZXRfaWRsZV9fbm90X2ZvdW5kIiwgIiVwIiwgc3B1X2NvbnRleHRfbm9zcHVfZXZlbnQgfSwKKwl7ICJzcHVfZmluZF92aWN0aW1fX2VudGVyIiwgIiVwIiwgc3B1X2NvbnRleHRfbm9zcHVfZXZlbnQgfSwKKwl7ICJzcHVzY2hlZF90aWNrX19wcmVlbXB0IiwgIiVwICVwIiwgc3B1X2NvbnRleHRfZXZlbnQgfSwKKwl7ICJzcHVzY2hlZF90aWNrX19uZXdzbGljZSIsICIlcCIsIHNwdV9jb250ZXh0X25vc3B1X2V2ZW50IH0sCisJeyAic3B1X3lpZWxkX19lbnRlciIsICIlcCIsIHNwdV9jb250ZXh0X25vc3B1X2V2ZW50IH0sCisJeyAic3B1X2RlYWN0aXZhdGVfX2VudGVyIiwgIiVwIiwgc3B1X2NvbnRleHRfbm9zcHVfZXZlbnQgfSwKKwl7ICJfX3NwdV9kZWFjdGl2YXRlX191bmxvYWQiLCAiJXAgJXAiLCBzcHVfY29udGV4dF9ldmVudCB9LAorCXsgInNwdWZzX3BzX25vcGZuX19lbnRlciIsICIlcCIsIHNwdV9jb250ZXh0X25vc3B1X2V2ZW50IH0sCisJeyAic3B1ZnNfcHNfbm9wZm5fX3NsZWVwIiwgIiVwIiwgc3B1X2NvbnRleHRfbm9zcHVfZXZlbnQgfSwKKwl7ICJzcHVmc19wc19ub3Bmbl9fd2FrZSIsICIlcCAlcCIsIHNwdV9jb250ZXh0X2V2ZW50IH0sCisJeyAic3B1ZnNfcHNfbm9wZm5fX2luc2VydCIsICIlcCAlcCIsIHNwdV9jb250ZXh0X2V2ZW50IH0sCisJeyAic3B1X2FjcXVpcmVfc2F2ZWRfX2VudGVyIiwgIiVwIiwgc3B1X2NvbnRleHRfbm9zcHVfZXZlbnQgfSwKKwl7ICJkZXN0cm95X3NwdV9jb250ZXh0X19lbnRlciIsICIlcCIsIHNwdV9jb250ZXh0X25vc3B1X2V2ZW50IH0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzcHV0cmFjZV9pbml0KHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKKwlpbnQgaSwgZXJyb3IgPSAtRU5PTUVNOworCisJc3B1dHJhY2VfbG9nID0ga2NhbGxvYyhzaXplb2Yoc3RydWN0IHNwdXRyYWNlKSwKKwkJCQlidWZzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNwdXRyYWNlX2xvZykKKwkJZ290byBvdXQ7CisKKwllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJzcHV0cmFjZSIsIFNfSVJVU1IsIE5VTEwpOworCWlmICghZW50cnkpCisJCWdvdG8gb3V0X2ZyZWVfbG9nOworCWVudHJ5LT5wcm9jX2ZvcHMgPSAmc3B1dHJhY2VfZm9wczsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNwdV9wcm9iZXMpOyBpKyspIHsKKwkJc3RydWN0IHNwdV9wcm9iZSAqcCA9ICZzcHVfcHJvYmVzW2ldOworCisJCWVycm9yID0gbWFya2VyX3Byb2JlX3JlZ2lzdGVyKHAtPm5hbWUsIHAtPmZvcm1hdCwKKwkJCQkJICAgICAgcC0+cHJvYmVfZnVuYywgcCk7CisJCWlmIChlcnJvcikKKwkJCXByaW50ayhLRVJOX0lORk8gIlVuYWJsZSB0byByZWdpc3RlciBwcm9iZSAlc1xuIiwKKwkJCQkJcC0+bmFtZSk7CisKKwkJZXJyb3IgPSBtYXJrZXJfYXJtKHAtPm5hbWUpOworCQlpZiAoZXJyb3IpCisJCQlwcmludGsoS0VSTl9JTkZPICJVbmFibGUgdG8gYXJtIHByb2JlICVzXG4iLCBwLT5uYW1lKTsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWVfbG9nOgorCWtmcmVlKHNwdXRyYWNlX2xvZyk7CitvdXQ6CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzcHV0cmFjZV9leGl0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzcHVfcHJvYmVzKTsgaSsrKQorCQltYXJrZXJfcHJvYmVfdW5yZWdpc3RlcihzcHVfcHJvYmVzW2ldLm5hbWUpOworCisJcmVtb3ZlX3Byb2NfZW50cnkoInNwdXRyYWNlIiwgTlVMTCk7CisJa2ZyZWUoc3B1dHJhY2VfbG9nKTsKK30KKworbW9kdWxlX2luaXQoc3B1dHJhY2VfaW5pdCk7Cittb2R1bGVfZXhpdChzcHV0cmFjZV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9zdG9yY2VudGVyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L3N0b3JjZW50ZXIuYwppbmRleCBlMTJlOWQyLi44ODY0ZTQ4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L3N0b3JjZW50ZXIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L3N0b3JjZW50ZXIuYwpAQCAtMTMyLDMzICsxMzIsMTggQEAKIAogCXBhZGRyID0gKHBoeXNfYWRkcl90KW9mX3RyYW5zbGF0ZV9hZGRyZXNzKGRucCwgcHJvcCk7CiAJbXBpYyA9IG1waWNfYWxsb2MoZG5wLCBwYWRkciwgTVBJQ19QUklNQVJZIHwgTVBJQ19XQU5UU19SRVNFVCwKLQkJCTQsIDMyLCAiIEVQSUMgICAgICIpOworCQkJMTYsIDMyLCAiIE9wZW5QSUMgICIpOwogCiAJb2Zfbm9kZV9wdXQoZG5wKTsKIAogCUJVR19PTihtcGljID09IE5VTEwpOwogCi0JLyogUENJIElSUXMgKi8KIAkvKgotCSAqIDIuNi4xMiBwYXRjaDoKLQkgKiAgICAgICAgIG9wZW5waWNfc2V0X3NvdXJjZXMoMCwgNSwgT3BlblBJQ19BZGRyICsgMHgxMDIwMCk7Ci0JICogICAgICAgICBvcGVucGljX3NldF9zb3VyY2VzKDUsIDIsIE9wZW5QSUNfQWRkciArIDB4MTExMjApOwotCSAqICAgICAgICAgZmlyc3RfaXJxLCBudW1faXJxcywgX19pb21lbSBmaXJzdF9JU1IKLQkgKiAgICAgICAgIG9fc3M6IGksIHNyYzogMCwgZmRmNTAyMDAKLQkgKiAgICAgICAgIG9fc3M6IGksIHNyYzogMSwgZmRmNTAyMjAKLQkgKiAgICAgICAgIG9fc3M6IGksIHNyYzogMiwgZmRmNTAyNDAKLQkgKiAgICAgICAgIG9fc3M6IGksIHNyYzogMywgZmRmNTAyNjAKLQkgKiAgICAgICAgIG9fc3M6IGksIHNyYzogNCwgZmRmNTAyODAKLQkgKiAgICAgICAgIG9fc3M6IGksIHNyYzogNSwgZmRmNTExMjAKLQkgKiAgICAgICAgIG9fc3M6IGksIHNyYzogNiwgZmRmNTExNDAKKwkgKiAxNiBTZXJpYWwgSW50ZXJydXB0cyBmb2xsb3dlZCBieSAxNiBJbnRlcm5hbCBJbnRlcnJ1cHRzLgorCSAqIEkyQyBpcyB0aGUgc2Vjb25kIGludGVybmFsLCBzbyBpdCBpcyBhdCAxNywgMHgxMTAyMC4KIAkgKi8KIAltcGljX2Fzc2lnbl9pc3UobXBpYywgMCwgcGFkZHIgKyAweDEwMjAwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMSwgcGFkZHIgKyAweDEwMjIwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMiwgcGFkZHIgKyAweDEwMjQwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMywgcGFkZHIgKyAweDEwMjYwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNCwgcGFkZHIgKyAweDEwMjgwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNSwgcGFkZHIgKyAweDExMTIwKTsKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgNiwgcGFkZHIgKyAweDExMTQwKTsKKwltcGljX2Fzc2lnbl9pc3UobXBpYywgMSwgcGFkZHIgKyAweDExMDAwKTsKIAogCW1waWNfaW5pdChtcGljKTsKIH0KQEAgLTE3OCw3ICsxNjMsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKIAotCXJldHVybiBvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgInN0b3JjZW50ZXIiKTsKKwlyZXR1cm4gb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJpb21lZ2Esc3RvcmNlbnRlciIpOwogfQogCiBkZWZpbmVfbWFjaGluZShzdG9yY2VudGVyKXsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvZmVhdHVyZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9mZWF0dXJlLmMKaW5kZXggYmE5MzFiZS4uNTE2OWVjYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9mZWF0dXJlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9mZWF0dXJlLmMKQEAgLTI1NjUsNiArMjU2NSw4IEBACiAKIAkvKiBMb2NhdGUgY29yZTk5IFVuaS1OICovCiAJdW5pbm9ydGhfbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJ1bmktbiIpOworCXVuaW5vcnRoX21haiA9IDE7CisKIAkvKiBMb2NhdGUgRzUgdTMgKi8KIAlpZiAodW5pbm9ydGhfbm9kZSA9PSBOVUxMKSB7CiAJCXVuaW5vcnRoX25vZGUgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAidTMiKTsKQEAgLTI1NzUsOCArMjU3NywxMCBAQAogCQl1bmlub3J0aF9ub2RlID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInU0Iik7CiAJCXVuaW5vcnRoX21haiA9IDQ7CiAJfQotCWlmICh1bmlub3J0aF9ub2RlID09IE5VTEwpCisJaWYgKHVuaW5vcnRoX25vZGUgPT0gTlVMTCkgeworCQl1bmlub3J0aF9tYWogPSAwOwogCQlyZXR1cm47CisJfQogCiAJYWRkcnAgPSBvZl9nZXRfcHJvcGVydHkodW5pbm9ydGhfbm9kZSwgInJlZyIsIE5VTEwpOwogCWlmIChhZGRycCA9PSBOVUxMKQpAQCAtMzAyOSwzICszMDMzLDggQEAKIAlwbWFjX2FncF9yZXN1bWUocG1hY19hZ3BfYnJpZGdlKTsKIH0KIEVYUE9SVF9TWU1CT0wocG1hY19yZXN1bWVfYWdwX2Zvcl9jYXJkKTsKKworaW50IHBtYWNfZ2V0X3VuaW5vcnRoX3ZhcmlhbnQodm9pZCkKK3sKKwlyZXR1cm4gdW5pbm9ydGhfbWFqOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2hvdHBsdWctY3B1LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaG90cGx1Zy1jcHUuYwppbmRleCBjNGFkNTRlLi4xZjAzMjQ4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaG90cGx1Zy1jcHUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaG90cGx1Zy1jcHUuYwpAQCAtNTgsNyArNTgsNyBAQAogewogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJaWRsZV90YXNrX2V4aXQoKTsKLQl4aWNzX3RlYXJkb3duX2NwdSgwKTsKKwl4aWNzX3RlYXJkb3duX2NwdSgpOwogCXVucmVnaXN0ZXJfc2xiX3NoYWRvdyhoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKSwgX19wYShnZXRfc2xiX3NoYWRvdygpKSk7CiAJcnRhc19zdG9wX3NlbGYoKTsKIAkvKiBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUuLi4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9rZXhlYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2tleGVjLmMKaW5kZXggNDEyYTVlNy4uZTlkZDVmZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2tleGVjLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2tleGVjLmMKQEAgLTU0LDcgKzU0LDcgQEAKIHN0YXRpYyB2b2lkIHBzZXJpZXNfa2V4ZWNfY3B1X2Rvd25feGljcyhpbnQgY3Jhc2hfc2h1dGRvd24sIGludCBzZWNvbmRhcnkpCiB7CiAJcHNlcmllc19rZXhlY19jcHVfZG93bihjcmFzaF9zaHV0ZG93biwgc2Vjb25kYXJ5KTsKLQl4aWNzX3RlYXJkb3duX2NwdShzZWNvbmRhcnkpOworCXhpY3Nfa2V4ZWNfdGVhcmRvd25fY3B1KHNlY29uZGFyeSk7CiB9CiAKIHZvaWQgX19pbml0IHNldHVwX2tleGVjX2NwdV9kb3duX3hpY3Modm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9yZWNvbmZpZy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3JlY29uZmlnLmMKaW5kZXggYzAyZjg3NC4uMjgwMGZjZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3JlY29uZmlnLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3JlY29uZmlnLmMKQEAgLTE2Nyw2ICsxNjcsNyBAQAogCiAJaWYgKChjaGlsZCA9IG9mX2dldF9uZXh0X2NoaWxkKG5wLCBOVUxMKSkpIHsKIAkJb2Zfbm9kZV9wdXQoY2hpbGQpOworCQlvZl9ub2RlX3B1dChwYXJlbnQpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmMKaW5kZXggOGY4ZGQ5Yy4uY2E1MmI1OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5jCkBAIC0xNjAsNiArMTYwLDQ2IEBACiAKIC8qIEhpZ2ggbGV2ZWwgaGFuZGxlcnMgYW5kIGluaXQgY29kZSAqLwogCitzdGF0aWMgdm9pZCB4aWNzX3VwZGF0ZV9pcnFfc2VydmVycyh2b2lkKQoreworCWludCBpLCBqOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJdTMyIGlsZW47CisJY29uc3QgdTMyICppcmVnLCAqaXNpemU7CisJdTMyIGhjcHVpZDsKKworCS8qIEZpbmQgdGhlIHNlcnZlciBudW1iZXJzIGZvciB0aGUgYm9vdCBjcHUuICovCisJbnAgPSBvZl9nZXRfY3B1X25vZGUoYm9vdF9jcHVpZCwgTlVMTCk7CisJQlVHX09OKCFucCk7CisKKwlpcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiaWJtLHBwYy1pbnRlcnJ1cHQtZ3NlcnZlciNzIiwgJmlsZW4pOworCWlmICghaXJlZykgeworCQlvZl9ub2RlX3B1dChucCk7CisJCXJldHVybjsKKwl9CisKKwlpID0gaWxlbiAvIHNpemVvZihpbnQpOworCWhjcHVpZCA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoYm9vdF9jcHVpZCk7CisKKwkvKiBHbG9iYWwgaW50ZXJydXB0IGRpc3RyaWJ1dGlvbiBzZXJ2ZXIgaXMgc3BlY2lmaWVkIGluIHRoZSBsYXN0CisJICogZW50cnkgb2YgImlibSxwcGMtaW50ZXJydXB0LWdzZXJ2ZXIjcyIgcHJvcGVydHkuIEdldCB0aGUgbGFzdAorCSAqIGVudHJ5IGZvbSB0aGlzIHByb3BlcnR5IGZvciBjdXJyZW50IGJvb3QgY3B1IGlkIGFuZCB1c2UgaXQgYXMKKwkgKiBkZWZhdWx0IGRpc3RyaWJ1dGlvbiBzZXJ2ZXIKKwkgKi8KKwlmb3IgKGogPSAwOyBqIDwgaTsgaiArPSAyKSB7CisJCWlmIChpcmVnW2pdID09IGhjcHVpZCkgeworCQkJZGVmYXVsdF9zZXJ2ZXIgPSBoY3B1aWQ7CisJCQlkZWZhdWx0X2Rpc3RyaWJfc2VydmVyID0gaXJlZ1tqKzFdOworCisJCQlpc2l6ZSA9IG9mX2dldF9wcm9wZXJ0eShucCwKKwkJCQkJImlibSxpbnRlcnJ1cHQtc2VydmVyIy1zaXplIiwgTlVMTCk7CisJCQlpZiAoaXNpemUpCisJCQkJaW50ZXJydXB0X3NlcnZlcl9zaXplID0gKmlzaXplOworCQl9CisJfQorCisJb2Zfbm9kZV9wdXQobnApOworfQogCiAjaWZkZWYgQ09ORklHX1NNUAogc3RhdGljIGludCBnZXRfaXJxX3NlcnZlcih1bnNpZ25lZCBpbnQgdmlycSwgdW5zaWduZWQgaW50IHN0cmljdF9jaGVjaykKQEAgLTE2OSw2ICsyMDksOSBAQAogCWNwdW1hc2tfdCBjcHVtYXNrID0gaXJxX2Rlc2NbdmlycV0uYWZmaW5pdHk7CiAJY3B1bWFza190IHRtcCA9IENQVV9NQVNLX05PTkU7CiAKKwlpZiAoISBjcHVfaXNzZXQoZGVmYXVsdF9zZXJ2ZXIsIGNwdV9vbmxpbmVfbWFwKSkKKwkJeGljc191cGRhdGVfaXJxX3NlcnZlcnMoKTsKKwogCWlmICghZGlzdHJpYnV0ZV9pcnFzKQogCQlyZXR1cm4gZGVmYXVsdF9zZXJ2ZXI7CiAKQEAgLTY1OCwzOSArNzAxLDExIEBACiAJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoY2FzY2FkZSwgcHNlcmllc184MjU5X2Nhc2NhZGUpOwogfQogCi1zdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpjcHVpZF90b19vZl9ub2RlKGludCBjcHUpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQl1MzIgaGNwdWlkID0gZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChjcHUpOwotCi0JZm9yX2VhY2hfbm9kZV9ieV90eXBlKG5wLCAiY3B1IikgewotCQlpbnQgaSwgbGVuOwotCQljb25zdCB1MzIgKmludHNlcnY7Ci0KLQkJaW50c2VydiA9IG9mX2dldF9wcm9wZXJ0eShucCwgImlibSxwcGMtaW50ZXJydXB0LXNlcnZlciNzIiwKLQkJCQkJJmxlbik7Ci0KLQkJaWYgKCFpbnRzZXJ2KQotCQkJaW50c2VydiA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsICZsZW4pOwotCi0JCWkgPSBsZW4gLyBzaXplb2YodTMyKTsKLQotCQl3aGlsZSAoaS0tKQotCQkJaWYgKGludHNlcnZbaV0gPT0gaGNwdWlkKQotCQkJCXJldHVybiBucDsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQogdm9pZCBfX2luaXQgeGljc19pbml0X0lSUSh2b2lkKQogewotCWludCBpLCBqOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0JdTMyIGlsZW4sIGluZHggPSAwOwotCWNvbnN0IHUzMiAqaXJlZywgKmlzaXplOworCXUzMiBpbmR4ID0gMDsKIAlpbnQgZm91bmQgPSAwOwotCXUzMiBoY3B1aWQ7CiAKIAlwcGM2NF9ib290X21zZygweDIwLCAiWElDUyBJbml0Iik7CiAKQEAgLTcwOSwzNCArNzI0LDcgQEAKIAkJcmV0dXJuOwogCiAJeGljc19pbml0X2hvc3QoKTsKLQotCS8qIEZpbmQgdGhlIHNlcnZlciBudW1iZXJzIGZvciB0aGUgYm9vdCBjcHUuICovCi0JbnAgPSBjcHVpZF90b19vZl9ub2RlKGJvb3RfY3B1aWQpOwotCUJVR19PTighbnApOwotCWlyZWcgPSBvZl9nZXRfcHJvcGVydHkobnAsICJpYm0scHBjLWludGVycnVwdC1nc2VydmVyI3MiLCAmaWxlbik7Ci0JaWYgKCFpcmVnKQotCQlnb3RvIHNraXBfZ3NlcnZlcl9jaGVjazsKLQlpID0gaWxlbiAvIHNpemVvZihpbnQpOwotCWhjcHVpZCA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoYm9vdF9jcHVpZCk7Ci0KLQkvKiBHbG9iYWwgaW50ZXJydXB0IGRpc3RyaWJ1dGlvbiBzZXJ2ZXIgaXMgc3BlY2lmaWVkIGluIHRoZSBsYXN0Ci0JICogZW50cnkgb2YgImlibSxwcGMtaW50ZXJydXB0LWdzZXJ2ZXIjcyIgcHJvcGVydHkuIEdldCB0aGUgbGFzdAotCSAqIGVudHJ5IGZvbSB0aGlzIHByb3BlcnR5IGZvciBjdXJyZW50IGJvb3QgY3B1IGlkIGFuZCB1c2UgaXQgYXMKLQkgKiBkZWZhdWx0IGRpc3RyaWJ1dGlvbiBzZXJ2ZXIKLQkgKi8KLQlmb3IgKGogPSAwOyBqIDwgaTsgaiArPSAyKSB7Ci0JCWlmIChpcmVnW2pdID09IGhjcHVpZCkgewotCQkJZGVmYXVsdF9zZXJ2ZXIgPSBoY3B1aWQ7Ci0JCQlkZWZhdWx0X2Rpc3RyaWJfc2VydmVyID0gaXJlZ1tqKzFdOwotCi0JCQlpc2l6ZSA9IG9mX2dldF9wcm9wZXJ0eShucCwKLQkJCQkJImlibSxpbnRlcnJ1cHQtc2VydmVyIy1zaXplIiwgTlVMTCk7Ci0JCQlpZiAoaXNpemUpCi0JCQkJaW50ZXJydXB0X3NlcnZlcl9zaXplID0gKmlzaXplOwotCQl9Ci0JfQotc2tpcF9nc2VydmVyX2NoZWNrOgotCW9mX25vZGVfcHV0KG5wKTsKKwl4aWNzX3VwZGF0ZV9pcnFfc2VydmVycygpOwogCiAJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfTFBBUikpCiAJCXBwY19tZC5nZXRfaXJxID0geGljc19nZXRfaXJxX2xwYXI7CkBAIC03NzUsMTEgKzc2Myw5IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCi12b2lkIHhpY3NfdGVhcmRvd25fY3B1KGludCBzZWNvbmRhcnkpCit2b2lkIHhpY3NfdGVhcmRvd25fY3B1KCkKIHsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXVuc2lnbmVkIGludCBpcGk7Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjOwogCiAJeGljc19zZXRfY3B1X3ByaW9yaXR5KDApOwogCkBAIC03OTAsOSArNzc2LDE3IEBACiAJCWxwYXJfcWlycl9pbmZvKGNwdSwgMHhmZik7CiAJZWxzZQogCQlkaXJlY3RfcWlycl9pbmZvKGNwdSwgMHhmZik7Cit9CisKK3ZvaWQgeGljc19rZXhlY190ZWFyZG93bl9jcHUoaW50IHNlY29uZGFyeSkKK3sKKwl1bnNpZ25lZCBpbnQgaXBpOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKworCXhpY3NfdGVhcmRvd25fY3B1KCk7CiAKIAkvKgotCSAqIHdlIG5lZWQgdG8gRU9JIHRoZSBJUEkgaWYgd2UgZ290IGhlcmUgZnJvbSBrZXhlYyBkb3duIElQSQorCSAqIHdlIG5lZWQgdG8gRU9JIHRoZSBJUEkKIAkgKgogCSAqIHByb2JhYmx5IG5lZWQgdG8gY2hlY2sgYWxsIHRoZSBvdGhlciBpbnRlcnJ1cHRzIHRvbwogCSAqIHNob3VsZCB3ZSBiZSBmbGFnZ2luZyBpZGxlIGxvb3AgaW5zdGVhZD8KQEAgLTg4MCw4ICs4NzQsOCBAQAogCQkgICAgICAgdmlycSwgY3B1KTsKIAogCQkvKiBSZXNldCBhZmZpbml0eSB0byBhbGwgY3B1cyAqLworCQlpcnFfZGVzY1t2aXJxXS5hZmZpbml0eSA9IENQVV9NQVNLX0FMTDsKIAkJZGVzYy0+Y2hpcC0+c2V0X2FmZmluaXR5KHZpcnEsIENQVV9NQVNLX0FMTCk7Ci0JCWlycV9kZXNjW2lycV0uYWZmaW5pdHkgPSBDUFVfTUFTS19BTEw7CiB1bmxvY2s6CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuaAppbmRleCA5ZmZkODA5Li5jMjZiY2ZmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmgKQEAgLTE2LDcgKzE2LDggQEAKIAogZXh0ZXJuIHZvaWQgeGljc19pbml0X0lSUSh2b2lkKTsKIGV4dGVybiB2b2lkIHhpY3Nfc2V0dXBfY3B1KHZvaWQpOwotZXh0ZXJuIHZvaWQgeGljc190ZWFyZG93bl9jcHUoaW50IHNlY29uZGFyeSk7CitleHRlcm4gdm9pZCB4aWNzX3RlYXJkb3duX2NwdSh2b2lkKTsKK2V4dGVybiB2b2lkIHhpY3Nfa2V4ZWNfdGVhcmRvd25fY3B1KGludCBzZWNvbmRhcnkpOwogZXh0ZXJuIHZvaWQgeGljc19jYXVzZV9JUEkoaW50IGNwdSk7CiBleHRlcm4gIHZvaWQgeGljc19yZXF1ZXN0X0lQSXModm9pZCk7CiBleHRlcm4gdm9pZCB4aWNzX21pZ3JhdGVfaXJxc19hd2F5KHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9kY3IuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGNyLmMKaW5kZXggNDI3MDI3Yy4uNDM3ZTQ4ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9kY3IuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2Rjci5jCkBAIC0xMzcsNSArMTM3LDYgQEAKIAloLnRva2VuID0gTlVMTDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRjcl91bm1hcCk7Ci0KLSNlbmRpZiAvKiAhZGVmaW5lZChDT05GSUdfUFBDX0RDUl9OQVRJVkUpICovCisjZWxzZQkvKiBkZWZpbmVkKENPTkZJR19QUENfRENSX05BVElWRSkgKi8KK0RFRklORV9TUElOTE9DSyhkY3JfaW5kX2xvY2spOworI2VuZGlmCS8qICFkZWZpbmVkKENPTkZJR19QUENfRENSX05BVElWRSkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3NvYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmMKaW5kZXggZTQ4YjIwZS4uMmM1Mzg4YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfc29jLmMKQEAgLTEzNDIsNyArMTM0Miw3IEBACiAJCWlmIChyZXQpCiAJCQlnb3RvIHVucmVnOwogCi0JCXJldCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcihwZGV2KTsKKwkJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gdW5yZWc7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjOHh4X3BpYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHhfcGljLmMKaW5kZXggMGU3NGE0Yi4uNWQyZDU1MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHhfcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGM4eHhfcGljLmMKQEAgLTE3NCwxNSArMTc0LDE5IEBACiAJCWdvdG8gb3V0OwogCiAJc2l1X3JlZyA9IGlvcmVtYXAocmVzLnN0YXJ0LCByZXMuZW5kIC0gcmVzLnN0YXJ0ICsgMSk7Ci0JaWYgKHNpdV9yZWcgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHNpdV9yZWcgPT0gTlVMTCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CiAKLQltcGM4eHhfcGljX2hvc3QgPSBpcnFfYWxsb2NfaG9zdChvZl9ub2RlX2dldChucCksIElSUV9IT1NUX01BUF9MSU5FQVIsCisJbXBjOHh4X3BpY19ob3N0ID0gaXJxX2FsbG9jX2hvc3QobnAsIElSUV9IT1NUX01BUF9MSU5FQVIsCiAJCQkJCSA2NCwgJm1wYzh4eF9waWNfaG9zdF9vcHMsIDY0KTsKIAlpZiAobXBjOHh4X3BpY19ob3N0ID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJNUEM4eHggUElDOiBmYWlsZWQgdG8gYWxsb2NhdGUgaXJxIGhvc3QhXG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CiAJfQorCXJldHVybiAwOwogCiBvdXQ6CiAJb2Zfbm9kZV9wdXQobnApOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvcWUuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3FlLmMKaW5kZXggNWVmODQ0ZC4uNmVmYmQ1ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvcWUuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3FlX2xpYi9xZS5jCkBAIC02Niw3ICs2Niw3IEBACiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpxZTsKIAl1bnNpZ25lZCBpbnQgc2l6ZTsKLQljb25zdCB2b2lkICpwcm9wOworCWNvbnN0IHUzMiAqcHJvcDsKIAogCWlmIChxZWJhc2UgIT0gLTEpCiAJCXJldHVybiBxZWJhc2U7CkBAIC03OSw3ICs3OSw4IEBACiAJfQogCiAJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShxZSwgInJlZyIsICZzaXplKTsKLQlxZWJhc2UgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyhxZSwgcHJvcCk7CisJaWYgKHByb3AgJiYgc2l6ZSA+PSBzaXplb2YoKnByb3ApKQorCQlxZWJhc2UgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyhxZSwgcHJvcCk7CiAJb2Zfbm9kZV9wdXQocWUpOwogCiAJcmV0dXJuIHFlYmFzZTsKQEAgLTE3MiwxMCArMTczLDkgQEAKIAl9CiAKIAlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KHFlLCAiYnJnLWZyZXF1ZW5jeSIsICZzaXplKTsKLQlpZiAoIXByb3AgfHwgc2l6ZSAhPSBzaXplb2YoKnByb3ApKQotCQlyZXR1cm4gYnJnX2NsazsKKwlpZiAocHJvcCAmJiBzaXplID09IHNpemVvZigqcHJvcCkpCisJCWJyZ19jbGsgPSAqcHJvcDsKIAotCWJyZ19jbGsgPSAqcHJvcDsKIAlvZl9ub2RlX3B1dChxZSk7CiAKIAlyZXR1cm4gYnJnX2NsazsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9wcGMva2VybmVsL3NldHVwLmMKaW5kZXggZDUxMzY4ZC4uMjk0MDU1OSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9wcGMva2VybmVsL3NldHVwLmMKQEAgLTI3NSw3ICsyNzUsNyBAQAogewogfQogCi1zdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgY3B1aW5mb19vcCA9IHsKK2NvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBjcHVpbmZvX29wID0gewogCS5zdGFydCA9Y19zdGFydCwKIAkubmV4dCA9CWNfbmV4dCwKIAkuc3RvcCA9CWNfc3RvcCwKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL21tL3BndGFibGUuYyBiL2FyY2gvcHBjL21tL3BndGFibGUuYwppbmRleCA0MDlmY2FhLi4wM2E3OWJmIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9tbS9wZ3RhYmxlLmMKKysrIGIvYXJjaC9wcGMvbW0vcGd0YWJsZS5jCkBAIC05NSw3ICs5NSw3IEBACiAJcmV0dXJuIHB0ZTsKIH0KIAotc3RydWN0IHBhZ2UgKnB0ZV9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3BndGFibGVfdCBwdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7CiAJc3RydWN0IHBhZ2UgKnB0ZXBhZ2U7CiAKQEAgLTEwNiw4ICsxMDYsMTAgQEAKICNlbmRpZgogCiAJcHRlcGFnZSA9IGFsbG9jX3BhZ2VzKGZsYWdzLCAwKTsKLQlpZiAocHRlcGFnZSkKKwlpZiAocHRlcGFnZSkgewogCQljbGVhcl9oaWdocGFnZShwdGVwYWdlKTsKKwkJcGd0YWJsZV9wYWdlX2N0b3IocHRlcGFnZSk7CisJfQogCXJldHVybiBwdGVwYWdlOwogfQogCkBAIC0xMTksMTEgKzEyMSwxMiBAQAogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwdGUpOwogfQogCi12b2lkIHB0ZV9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgcGFnZSAqcHRlcGFnZSkKK3ZvaWQgcHRlX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBndGFibGVfdCBwdGVwYWdlKQogewogI2lmZGVmIENPTkZJR19TTVAKIAloYXNoX3BhZ2Vfc3luYygpOwogI2VuZGlmCisJcGd0YWJsZV9wYWdlX2R0b3IocHRlcGFnZSk7CiAJX19mcmVlX3BhZ2UocHRlcGFnZSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYwppbmRleCAyOWFlMTY1Li5mOWY4Nzc5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCkBAIC02NDksMjEgKzY0OSwyNCBAQAogCS8qCiAJICogUmVzZXJ2ZSBtZW1vcnkgdXNlZCBmb3IgbG93Y29yZS9jb21tYW5kIGxpbmUva2VybmVsIGltYWdlLgogCSAqLwotCXJlc2VydmVfYm9vdG1lbSgwLCAodW5zaWduZWQgbG9uZylfZWhlYWQpOworCXJlc2VydmVfYm9vdG1lbSgwLCAodW5zaWduZWQgbG9uZylfZWhlYWQsIEJPT1RNRU1fREVGQVVMVCk7CiAJcmVzZXJ2ZV9ib290bWVtKCh1bnNpZ25lZCBsb25nKV9zdGV4dCwKLQkJCVBGTl9QSFlTKHN0YXJ0X3BmbikgLSAodW5zaWduZWQgbG9uZylfc3RleHQpOworCQkJUEZOX1BIWVMoc3RhcnRfcGZuKSAtICh1bnNpZ25lZCBsb25nKV9zdGV4dCwKKwkJCUJPT1RNRU1fREVGQVVMVCk7CiAJLyoKIAkgKiBSZXNlcnZlIHRoZSBib290bWVtIGJpdG1hcCBpdHNlbGYgYXMgd2VsbC4gV2UgZG8gdGhpcyBpbiB0d28KIAkgKiBzdGVwcyAoZmlyc3Qgc3RlcCB3YXMgaW5pdF9ib290bWVtKCkpIGJlY2F1c2UgdGhpcyBjYXRjaGVzCiAJICogdGhlICh2ZXJ5IHVubGlrZWx5KSBjYXNlIG9mIHVzIGFjY2lkZW50YWxseSBpbml0aWFsaXppbmcgdGhlCiAJICogYm9vdG1lbSBhbGxvY2F0b3Igd2l0aCBhbiBpbnZhbGlkIFJBTSBhcmVhLgogCSAqLwotCXJlc2VydmVfYm9vdG1lbShzdGFydF9wZm4gPDwgUEFHRV9TSElGVCwgYm9vdG1hcF9zaXplKTsKKwlyZXNlcnZlX2Jvb3RtZW0oc3RhcnRfcGZuIDw8IFBBR0VfU0hJRlQsIGJvb3RtYXBfc2l6ZSwKKwkJCUJPT1RNRU1fREVGQVVMVCk7CiAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKIAlpZiAoSU5JVFJEX1NUQVJUICYmIElOSVRSRF9TSVpFKSB7CiAJCWlmIChJTklUUkRfU1RBUlQgKyBJTklUUkRfU0laRSA8PSBtZW1vcnlfZW5kKSB7Ci0JCQlyZXNlcnZlX2Jvb3RtZW0oSU5JVFJEX1NUQVJULCBJTklUUkRfU0laRSk7CisJCQlyZXNlcnZlX2Jvb3RtZW0oSU5JVFJEX1NUQVJULCBJTklUUkRfU0laRSwKKwkJCQkJQk9PVE1FTV9ERUZBVUxUKTsKIAkJCWluaXRyZF9zdGFydCA9IElOSVRSRF9TVEFSVDsKIAkJCWluaXRyZF9lbmQgPSBpbml0cmRfc3RhcnQgKyBJTklUUkRfU0laRTsKIAkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYwppbmRleCAxYTJmZGI2OS4uYTRkMjkwMiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CkBAIC0yMTgsNDEgKzIxOSw0MCBAQAogfQkKIAogLyogVGhpcyBpcyBjYWxsZWQgZnJvbSBmcy9wcm9jL2FycmF5LmMgKi8KLWNoYXIgKnRhc2tfc2hvd19yZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqYnVmZmVyKQordm9pZCB0YXNrX3Nob3dfcmVncyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKIAogCXJlZ3MgPSB0YXNrX3B0X3JlZ3ModGFzayk7Ci0JYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAidGFzazogJXAsIGtzcDogJXBcbiIsCisJc2VxX3ByaW50ZihtLCAidGFzazogJXAsIGtzcDogJXBcbiIsCiAJCSAgICAgICB0YXNrLCAodm9pZCAqKXRhc2stPnRocmVhZC5rc3ApOwotCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwgIlVzZXIgUFNXIDogJXAgJXBcbiIsCisJc2VxX3ByaW50ZihtLCAiVXNlciBQU1cgOiAlcCAlcFxuIiwKIAkJICAgICAgICh2b2lkICopIHJlZ3MtPnBzdy5tYXNrLCAodm9pZCAqKXJlZ3MtPnBzdy5hZGRyKTsKIAotCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwgIlVzZXIgR1BSUzogIiBGT1VSTE9ORywKKwlzZXFfcHJpbnRmKG0sICJVc2VyIEdQUlM6ICIgRk9VUkxPTkcsCiAJCQkgIHJlZ3MtPmdwcnNbMF0sIHJlZ3MtPmdwcnNbMV0sCiAJCQkgIHJlZ3MtPmdwcnNbMl0sIHJlZ3MtPmdwcnNbM10pOwotCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwgIiAgICAgICAgICAgIiBGT1VSTE9ORywKKwlzZXFfcHJpbnRmKG0sICIgICAgICAgICAgICIgRk9VUkxPTkcsCiAJCQkgIHJlZ3MtPmdwcnNbNF0sIHJlZ3MtPmdwcnNbNV0sCiAJCQkgIHJlZ3MtPmdwcnNbNl0sIHJlZ3MtPmdwcnNbN10pOwotCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwgIiAgICAgICAgICAgIiBGT1VSTE9ORywKKwlzZXFfcHJpbnRmKG0sICIgICAgICAgICAgICIgRk9VUkxPTkcsCiAJCQkgIHJlZ3MtPmdwcnNbOF0sIHJlZ3MtPmdwcnNbOV0sCiAJCQkgIHJlZ3MtPmdwcnNbMTBdLCByZWdzLT5ncHJzWzExXSk7Ci0JYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAiICAgICAgICAgICAiIEZPVVJMT05HLAorCXNlcV9wcmludGYobSwgIiAgICAgICAgICAgIiBGT1VSTE9ORywKIAkJCSAgcmVncy0+Z3Byc1sxMl0sIHJlZ3MtPmdwcnNbMTNdLAogCQkJICByZWdzLT5ncHJzWzE0XSwgcmVncy0+Z3Byc1sxNV0pOwotCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwgIlVzZXIgQUNSUzogJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKKwlzZXFfcHJpbnRmKG0sICJVc2VyIEFDUlM6ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCiAJCQkgIHRhc2stPnRocmVhZC5hY3JzWzBdLCB0YXNrLT50aHJlYWQuYWNyc1sxXSwKIAkJCSAgdGFzay0+dGhyZWFkLmFjcnNbMl0sIHRhc2stPnRocmVhZC5hY3JzWzNdKTsKLQlidWZmZXIgKz0gc3ByaW50ZihidWZmZXIsICIgICAgICAgICAgICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCisJc2VxX3ByaW50ZihtLCAiICAgICAgICAgICAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLAogCQkJICB0YXNrLT50aHJlYWQuYWNyc1s0XSwgdGFzay0+dGhyZWFkLmFjcnNbNV0sCiAJCQkgIHRhc2stPnRocmVhZC5hY3JzWzZdLCB0YXNrLT50aHJlYWQuYWNyc1s3XSk7Ci0JYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAiICAgICAgICAgICAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLAorCXNlcV9wcmludGYobSwgIiAgICAgICAgICAgJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKIAkJCSAgdGFzay0+dGhyZWFkLmFjcnNbOF0sIHRhc2stPnRocmVhZC5hY3JzWzldLAogCQkJICB0YXNrLT50aHJlYWQuYWNyc1sxMF0sIHRhc2stPnRocmVhZC5hY3JzWzExXSk7Ci0JYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAiICAgICAgICAgICAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLAorCXNlcV9wcmludGYobSwgIiAgICAgICAgICAgJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKIAkJCSAgdGFzay0+dGhyZWFkLmFjcnNbMTJdLCB0YXNrLT50aHJlYWQuYWNyc1sxM10sCiAJCQkgIHRhc2stPnRocmVhZC5hY3JzWzE0XSwgdGFzay0+dGhyZWFkLmFjcnNbMTVdKTsKLQlyZXR1cm4gYnVmZmVyOwogfQogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRpZV9sb2NrKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMgYi9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jCmluZGV4IGU2MGUwYWUuLjAxOWY1MTggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMKKysrIGIvYXJjaC9zMzkwL21tL3BndGFibGUuYwpAQCAtNzgsNiArNzgsNyBAQAogCQljbGVhcl90YWJsZSh0YWJsZSwgX1BBR0VfVFlQRV9FTVBUWSwgUEFHRV9TSVpFKTsKIAkJcGFnZS0+aW5kZXggPSAoYWRkcl90KSB0YWJsZTsKIAl9CisJcGd0YWJsZV9wYWdlX2N0b3IocGFnZSk7CiAJdGFibGUgPSAodW5zaWduZWQgbG9uZyAqKSBwYWdlX3RvX3BoeXMocGFnZSk7CiAJY2xlYXJfdGFibGUodGFibGUsIF9QQUdFX1RZUEVfRU1QVFksIFBBR0VfU0laRSk7CiAJcmV0dXJuIHRhYmxlOwpAQCAtODcsNiArODgsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgKnNoYWRvdyA9IGdldF9zaGFkb3dfcHRlKHRhYmxlKTsKIAorCXBndGFibGVfcGFnZV9kdG9yKHZpcnRfdG9fcGFnZSh0YWJsZSkpOwogCWlmIChzaGFkb3cpCiAJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgc2hhZG93KTsKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHRhYmxlKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvS2NvbmZpZyBiL2FyY2gvc2gvS2NvbmZpZwppbmRleCAxYzNhOTA4Li42ZTAzNWQxIDEwMDY0NAotLS0gYS9hcmNoL3NoL0tjb25maWcKKysrIGIvYXJjaC9zaC9LY29uZmlnCkBAIC04OSw2ICs4OSw5IEBACiBjb25maWcgQVJDSF9OT19WSVJUX1RPX0JVUwogCWRlZl9ib29sIHkKIAorY29uZmlnIEFSQ0hfU1VQUE9SVFNfQU9VVAorCWRlZl9ib29sIHkKKwogc291cmNlICJpbml0L0tjb25maWciCiAKIG1lbnUgIlN5c3RlbSB0eXBlIgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zcS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zcS5jCmluZGV4IDMwMDhjMDAuLjgyNTBlMDEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc3EuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NxLmMKQEAgLTI2Myw3ICsyNjMsNyBAQAogCXNzaXplX3QgKCpzdG9yZSkoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOwogfTsKIAotI2RlZmluZSB0b19zcV9zeXNmc19hdHRyKGF0dHIpCWNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3Qgc3Ffc3lzZnNfYXR0ciwgYXR0cikKKyNkZWZpbmUgdG9fc3Ffc3lzZnNfYXR0cihhKQljb250YWluZXJfb2YoYSwgc3RydWN0IHNxX3N5c2ZzX2F0dHIsIGF0dHIpCiAKIHN0YXRpYyBzc2l6ZV90IHNxX3N5c2ZzX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCiAJCQkgICAgIGNoYXIgKmJ1ZikKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3NldHVwLmMgYi9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jCmluZGV4IDg1NWNkZjkuLjE4YTViYWYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvc2V0dXAuYwpAQCAtMTQwLDE4ICsxNDAsMjYgQEAKIAlyZXQgPSBwYXJzZV9jcmFzaGtlcm5lbChib290X2NvbW1hbmRfbGluZSwgZnJlZV9tZW0sCiAJCQkmY3Jhc2hfc2l6ZSwgJmNyYXNoX2Jhc2UpOwogCWlmIChyZXQgPT0gMCAmJiBjcmFzaF9zaXplKSB7Ci0JCWlmIChjcmFzaF9iYXNlID4gMCkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiUmVzZXJ2aW5nICVsZE1CIG9mIG1lbW9yeSBhdCAlbGRNQiAiCi0JCQkJCSJmb3IgY3Jhc2hrZXJuZWwgKFN5c3RlbSBSQU06ICVsZE1CKVxuIiwKLQkJCQkJKHVuc2lnbmVkIGxvbmcpKGNyYXNoX3NpemUgPj4gMjApLAotCQkJCQkodW5zaWduZWQgbG9uZykoY3Jhc2hfYmFzZSA+PiAyMCksCi0JCQkJCSh1bnNpZ25lZCBsb25nKShmcmVlX21lbSA+PiAyMCkpOwotCQkJY3Jhc2hrX3Jlcy5zdGFydCA9IGNyYXNoX2Jhc2U7Ci0JCQljcmFzaGtfcmVzLmVuZCAgID0gY3Jhc2hfYmFzZSArIGNyYXNoX3NpemUgLSAxOwotCQkJcmVzZXJ2ZV9ib290bWVtKGNyYXNoX2Jhc2UsIGNyYXNoX3NpemUpOwotCQl9IGVsc2UKKwkJaWYgKGNyYXNoX2Jhc2UgPD0gMCkgewogCQkJcHJpbnRrKEtFUk5fSU5GTyAiY3Jhc2hrZXJuZWwgcmVzZXJ2YXRpb24gZmFpbGVkIC0gIgogCQkJCQkieW91IGhhdmUgdG8gc3BlY2lmeSBhIGJhc2UgYWRkcmVzc1xuIik7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAocmVzZXJ2ZV9ib290bWVtKGNyYXNoX2Jhc2UsIGNyYXNoX3NpemUsCisJCQkJCUJPT1RNRU1fRVhDTFVTSVZFKSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImNyYXNoa2VybmVsIHJlc2VydmF0aW9uIGZhaWxlZCAtICIKKwkJCQkJIm1lbW9yeSBpcyBpbiB1c2VcbiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUmVzZXJ2aW5nICVsZE1CIG9mIG1lbW9yeSBhdCAlbGRNQiAiCisJCQkJImZvciBjcmFzaGtlcm5lbCAoU3lzdGVtIFJBTTogJWxkTUIpXG4iLAorCQkJCSh1bnNpZ25lZCBsb25nKShjcmFzaF9zaXplID4+IDIwKSwKKwkJCQkodW5zaWduZWQgbG9uZykoY3Jhc2hfYmFzZSA+PiAyMCksCisJCQkJKHVuc2lnbmVkIGxvbmcpKGZyZWVfbWVtID4+IDIwKSk7CisJCWNyYXNoa19yZXMuc3RhcnQgPSBjcmFzaF9iYXNlOworCQljcmFzaGtfcmVzLmVuZCAgID0gY3Jhc2hfYmFzZSArIGNyYXNoX3NpemUgLSAxOwogCX0KIH0KICNlbHNlCkBAIC0xODQsMTMgKzE5MiwxNCBAQAogCSAqIGFuIGludmFsaWQgUkFNIGFyZWEuCiAJICovCiAJcmVzZXJ2ZV9ib290bWVtKF9fTUVNT1JZX1NUQVJUK1BBR0VfU0laRSwKLQkJKFBGTl9QSFlTKGZyZWVfcGZuKStib290bWFwX3NpemUrUEFHRV9TSVpFLTEpLV9fTUVNT1JZX1NUQVJUKTsKKwkJKFBGTl9QSFlTKGZyZWVfcGZuKStib290bWFwX3NpemUrUEFHRV9TSVpFLTEpLV9fTUVNT1JZX1NUQVJULAorCQlCT09UTUVNX0RFRkFVTFQpOwogCiAJLyoKIAkgKiByZXNlcnZlIHBoeXNpY2FsIHBhZ2UgMCAtIGl0J3MgYSBzcGVjaWFsIEJJT1MgcGFnZSBvbiBtYW55IGJveGVzLAogCSAqIGVuYWJsaW5nIGNsZWFuIHJlYm9vdHMsIFNNUCBvcGVyYXRpb24sIGxhcHRvcCBmdW5jdGlvbnMuCiAJICovCi0JcmVzZXJ2ZV9ib290bWVtKF9fTUVNT1JZX1NUQVJULCBQQUdFX1NJWkUpOworCXJlc2VydmVfYm9vdG1lbShfX01FTU9SWV9TVEFSVCwgUEFHRV9TSVpFLCBCT09UTUVNX0RFRkFVTFQpOwogCiAJc3BhcnNlX21lbW9yeV9wcmVzZW50X3dpdGhfYWN0aXZlX3JlZ2lvbnMoMCk7CiAKQEAgLTIwMCw3ICsyMDksNyBAQAogCWlmIChMT0FERVJfVFlQRSAmJiBJTklUUkRfU1RBUlQpIHsKIAkJaWYgKElOSVRSRF9TVEFSVCArIElOSVRSRF9TSVpFIDw9IChtYXhfbG93X3BmbiA8PCBQQUdFX1NISUZUKSkgewogCQkJcmVzZXJ2ZV9ib290bWVtKElOSVRSRF9TVEFSVCArIF9fTUVNT1JZX1NUQVJULAotCQkJCQlJTklUUkRfU0laRSk7CisJCQkJCUlOSVRSRF9TSVpFLCBCT09UTUVNX0RFRkFVTFQpOwogCQkJaW5pdHJkX3N0YXJ0ID0gSU5JVFJEX1NUQVJUICsgUEFHRV9PRkZTRVQgKwogCQkJCQlfX01FTU9SWV9TVEFSVDsKIAkJCWluaXRyZF9lbmQgPSBpbml0cmRfc3RhcnQgKyBJTklUUkRfU0laRTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vbnVtYS5jIGIvYXJjaC9zaC9tbS9udW1hLmMKaW5kZXggOGFmZjA2NS4uMmRlNzMwMiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9udW1hLmMKKysrIGIvYXJjaC9zaC9tbS9udW1hLmMKQEAgLTgwLDkgKzgwLDkgQEAKIAogCS8qIFJlc2VydmUgdGhlIHBnZGF0IGFuZCBib290bWFwIHNwYWNlIHdpdGggdGhlIGJvb3RtZW0gYWxsb2NhdG9yICovCiAJcmVzZXJ2ZV9ib290bWVtX25vZGUoTk9ERV9EQVRBKG5pZCksIHN0YXJ0X3BmbiA8PCBQQUdFX1NISUZULAotCQkJICAgICBzaXplb2Yoc3RydWN0IHBnbGlzdF9kYXRhKSk7CisJCQkgICAgIHNpemVvZihzdHJ1Y3QgcGdsaXN0X2RhdGEpLCBCT09UTUVNX0RFRkFVTFQpOwogCXJlc2VydmVfYm9vdG1lbV9ub2RlKE5PREVfREFUQShuaWQpLCBmcmVlX3BmbiA8PCBQQUdFX1NISUZULAotCQkJICAgICBib290bWFwX3BhZ2VzIDw8IFBBR0VfU0hJRlQpOworCQkJICAgICBib290bWFwX3BhZ2VzIDw8IFBBR0VfU0hJRlQsIEJPT1RNRU1fREVGQVVMVCk7CiAKIAkvKiBJdCdzIHVwICovCiAJbm9kZV9zZXRfb25saW5lKG5pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL0tjb25maWcgYi9hcmNoL3NwYXJjL0tjb25maWcKaW5kZXggOTlmODk3MS4uN2M2NzRhMyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9LY29uZmlnCisrKyBiL2FyY2gvc3BhcmMvS2NvbmZpZwpAQCAtMjcsNiArMjcsMTMgQEAKIGNvbmZpZyBPRgogCWRlZl9ib29sIHkKIAorY29uZmlnIEFSQ0hfU1VQUE9SVFNfQU9VVAorCWRlZl9ib29sIHkKKworY29uZmlnIEhaCisJaW50CisJZGVmYXVsdCAxMDAKKwogc291cmNlICJpbml0L0tjb25maWciCiAKIG1lbnUgIkdlbmVyYWwgbWFjaGluZSBzZXR1cCIKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2VudHJ5LlMgYi9hcmNoL3NwYXJjL2tlcm5lbC9lbnRyeS5TCmluZGV4IDg4ZDJjZWYuLmMyZWVkOGYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvZW50cnkuUwpAQCAtMTIyNCwyMyArMTIyNCw2IEBACiAJY2FsbAljX3N5c19uaXNfc3lzY2FsbAogCSBtb3YJJWw1LCAlbzcKIAotCS5hbGlnbiA0Ci0JLmdsb2JsCXN5c19wdHJhY2UKLXN5c19wdHJhY2U6Ci0JY2FsbAlkb19wdHJhY2UKLQkgYWRkCSVzcCwgU1RBQ0tGUkFNRV9TWiwgJW8wCi0KLQlsZAlbJWN1cnB0ciArIFRJX0ZMQUdTXSwgJWw1Ci0JYW5kY2MJJWw1LCBfVElGX1NZU0NBTExfVFJBQ0UsICVnMAotCWJlCTFmCi0JIG5vcAotCi0JY2FsbAlzeXNjYWxsX3RyYWNlCi0JIG5vcAotCi0xOgotCVJFU1RPUkVfQUxMCi0KIAkuYWxpZ24JNAogCS5nbG9ibAlzeXNfZXhlY3ZlCiBzeXNfZXhlY3ZlOgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDc3NDYwZTMuLjE5MTg2Y2UgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNlci5oPgotI2luY2x1ZGUgPGxpbnV4L2Eub3V0Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTU2NywzOCArNTY2LDYgQEAKIH0KIAogLyoKLSAqIGZpbGwgaW4gdGhlIHVzZXIgc3RydWN0dXJlIGZvciBhIGNvcmUgZHVtcC4uCi0gKi8KLXZvaWQgZHVtcF90aHJlYWQoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBzdHJ1Y3QgdXNlciAqIGR1bXApCi17Ci0JdW5zaWduZWQgbG9uZyBmaXJzdF9zdGFja19wYWdlOwotCi0JZHVtcC0+bWFnaWMgPSBTVU5PU19DT1JFX01BR0lDOwotCWR1bXAtPmxlbiA9IHNpemVvZihzdHJ1Y3QgdXNlcik7Ci0JZHVtcC0+cmVncy5wc3IgPSByZWdzLT5wc3I7Ci0JZHVtcC0+cmVncy5wYyA9IHJlZ3MtPnBjOwotCWR1bXAtPnJlZ3MubnBjID0gcmVncy0+bnBjOwotCWR1bXAtPnJlZ3MueSA9IHJlZ3MtPnk7Ci0JLyogZnVjayBtZSBwbGVudHkgKi8KLQltZW1jcHkoJmR1bXAtPnJlZ3MucmVnc1swXSwgJnJlZ3MtPnVfcmVnc1sxXSwgKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDE1KSk7Ci0JZHVtcC0+dWV4ZWMgPSBjdXJyZW50LT50aHJlYWQuY29yZV9leGVjOwotCWR1bXAtPnVfdHNpemUgPSAoKCh1bnNpZ25lZCBsb25nKSBjdXJyZW50LT5tbS0+ZW5kX2NvZGUpIC0KLQkJKCh1bnNpZ25lZCBsb25nKSBjdXJyZW50LT5tbS0+c3RhcnRfY29kZSkpICYgfihQQUdFX1NJWkUgLSAxKTsKLQlkdW1wLT51X2RzaXplID0gKCh1bnNpZ25lZCBsb25nKSAoY3VycmVudC0+bW0tPmJyayArIChQQUdFX1NJWkUtMSkpKTsKLQlkdW1wLT51X2RzaXplIC09IGR1bXAtPnVfdHNpemU7Ci0JZHVtcC0+dV9kc2l6ZSAmPSB+KFBBR0VfU0laRSAtIDEpOwotCWZpcnN0X3N0YWNrX3BhZ2UgPSAocmVncy0+dV9yZWdzW1VSRUdfRlBdICYgfihQQUdFX1NJWkUgLSAxKSk7Ci0JZHVtcC0+dV9zc2l6ZSA9IChUQVNLX1NJWkUgLSBmaXJzdF9zdGFja19wYWdlKSAmIH4oUEFHRV9TSVpFIC0gMSk7Ci0JbWVtY3B5KCZkdW1wLT5mcHUuZnBzdGF0dXMuZnJlZ3MucmVnc1swXSwgJmN1cnJlbnQtPnRocmVhZC5mbG9hdF9yZWdzWzBdLCAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogMzIpKTsKLQlkdW1wLT5mcHUuZnBzdGF0dXMuZnNyID0gY3VycmVudC0+dGhyZWFkLmZzcjsKLQlkdW1wLT5mcHUuZnBzdGF0dXMuZmxhZ3MgPSBkdW1wLT5mcHUuZnBzdGF0dXMuZXh0cmEgPSAwOwotCWR1bXAtPmZwdS5mcHN0YXR1cy5mcHFfY291bnQgPSBjdXJyZW50LT50aHJlYWQuZnBxZGVwdGg7Ci0JbWVtY3B5KCZkdW1wLT5mcHUuZnBzdGF0dXMuZnBxWzBdLCAmY3VycmVudC0+dGhyZWFkLmZwcXVldWVbMF0sCi0JICAgICAgICgoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogMikgKiAxNikpOwotCWR1bXAtPnNpZ2NvZGUgPSAwOwotfQotCi0vKgogICogZmlsbCBpbiB0aGUgZnB1IHN0cnVjdHVyZSBmb3IgYSBjb3JlIGR1bXAuCiAgKi8KIGludCBkdW1wX2ZwdSAoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBlbGZfZnByZWdzZXRfdCAqIGZwcmVncykKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHRyYWNlLmMKaW5kZXggNzQ1MjI2OS4uNWI1NGYxMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHRyYWNlLmMKQEAgLTEsNiArMSw2IEBACiAvKiBwdHJhY2UuYzogU3BhcmMgcHJvY2VzcyB0cmFjaW5nIHN1cHBvcnQuCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk2IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcGZzLnJ1dGdlcnMuZWR1KQorICogQ29weXJpZ2h0IChDKSAxOTk2LCAyMDA4IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKICAqCiAgKiBCYXNlZCB1cG9uIGNvZGUgd3JpdHRlbiBieSBSb3NzIEJpcm8sIExpbnVzIFRvcnZhbGRzLCBCb2IgTWFuc29uLAogICogYW5kIERhdmlkIE1vc2Jlcmdlci4KQEAgLTE5LDIzNCArMTksMTQgQEAKICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvcmVnc2V0Lmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CiAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0jZGVmaW5lIE1BR0lDX0NPTlNUQU5UIDB4ODAwMDAwMDAKLQotCi0vKiBSZXR1cm5pbmcgZnJvbSBwdHJhY2UgaXMgYSBiaXQgdHJpY2t5IGJlY2F1c2UgdGhlIHN5c2NhbGwgcmV0dXJuCi0gKiBsb3cgbGV2ZWwgY29kZSBhc3N1bWVzIGFueSB2YWx1ZSByZXR1cm5lZCB3aGljaCBpcyBuZWdhdGl2ZSBhbmQKLSAqIGlzIGEgdmFsaWQgZXJybm8gd2lsbCBtZWFuIHNldHRpbmcgdGhlIGNvbmRpdGlvbiBjb2RlcyB0byBpbmRpY2F0ZQotICogYW4gZXJyb3IgcmV0dXJuLiAgVGhpcyBkb2Vzbid0IHdvcmssIHNvIHdlIGhhdmUgdGhpcyBob29rLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcHRfZXJyb3JfcmV0dXJuKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGVycm9yKQotewotCXJlZ3MtPnVfcmVnc1tVUkVHX0kwXSA9IGVycm9yOwotCXJlZ3MtPnBzciB8PSBQU1JfQzsKLQlyZWdzLT5wYyA9IHJlZ3MtPm5wYzsKLQlyZWdzLT5ucGMgKz0gNDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHB0X3N1Y2NfcmV0dXJuKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIHZhbHVlKQotewotCXJlZ3MtPnVfcmVnc1tVUkVHX0kwXSA9IHZhbHVlOwotCXJlZ3MtPnBzciAmPSB+UFNSX0M7Ci0JcmVncy0+cGMgPSByZWdzLT5ucGM7Ci0JcmVncy0+bnBjICs9IDQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wdF9zdWNjX3JldHVybl9saW51eChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyB2YWx1ZSwgbG9uZyBfX3VzZXIgKmFkZHIpCi17Ci0JaWYgKHB1dF91c2VyKHZhbHVlLCBhZGRyKSkgewotCQlwdF9lcnJvcl9yZXR1cm4ocmVncywgRUZBVUxUKTsKLQkJcmV0dXJuOwotCX0KLQlyZWdzLT51X3JlZ3NbVVJFR19JMF0gPSAwOwotCXJlZ3MtPnBzciAmPSB+UFNSX0M7Ci0JcmVncy0+cGMgPSByZWdzLT5ucGM7Ci0JcmVncy0+bnBjICs9IDQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wdF9vc19zdWNjX3JldHVybiAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgdmFsLCBsb25nIF9fdXNlciAqYWRkcikKLXsKLQlpZiAoY3VycmVudC0+cGVyc29uYWxpdHkgPT0gUEVSX1NVTk9TKQotCQlwdF9zdWNjX3JldHVybiAocmVncywgdmFsKTsKLQllbHNlCi0JCXB0X3N1Y2NfcmV0dXJuX2xpbnV4IChyZWdzLCB2YWwsIGFkZHIpOwotfQotCi0vKiBGdWNrIG1lIGdlbnRseSB3aXRoIGEgY2hhaW5zYXcuLi4gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCByZWFkX3N1bm9zX3VzZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotCQkJCSAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBsb25nIF9fdXNlciAqYWRkcikKLXsKLQlzdHJ1Y3QgcHRfcmVncyAqY3JlZ3MgPSB0c2stPnRocmVhZC5rcmVnczsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKnQgPSB0YXNrX3RocmVhZF9pbmZvKHRzayk7Ci0JaW50IHY7Ci0JCi0JaWYob2Zmc2V0ID49IDEwMjQpCi0JCW9mZnNldCAtPSAxMDI0OyAvKiB3aGVlLi4uICovCi0JaWYob2Zmc2V0ICYgKChzaXplb2YodW5zaWduZWQgbG9uZykgLSAxKSkpIHsKLQkJcHRfZXJyb3JfcmV0dXJuKHJlZ3MsIEVJTyk7Ci0JCXJldHVybjsKLQl9Ci0JaWYob2Zmc2V0ID49IDE2ICYmIG9mZnNldCA8IDc4NCkgewotCQlvZmZzZXQgLT0gMTY7IG9mZnNldCA+Pj0gMjsKLQkJcHRfb3Nfc3VjY19yZXR1cm4ocmVncywgKigoKHVuc2lnbmVkIGxvbmcgKikoJnQtPnJlZ193aW5kb3dbMF0pKStvZmZzZXQpLCBhZGRyKTsKLQkJcmV0dXJuOwotCX0KLQlpZihvZmZzZXQgPj0gNzg0ICYmIG9mZnNldCA8IDgzMikgewotCQlvZmZzZXQgLT0gNzg0OyBvZmZzZXQgPj49IDI7Ci0JCXB0X29zX3N1Y2NfcmV0dXJuKHJlZ3MsICooKCh1bnNpZ25lZCBsb25nICopKCZ0LT5yd2J1Zl9zdGtwdHJzWzBdKSkrb2Zmc2V0KSwgYWRkcik7Ci0JCXJldHVybjsKLQl9Ci0Jc3dpdGNoKG9mZnNldCkgewotCWNhc2UgMDoKLQkJdiA9IHQtPmtzcDsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQl2ID0gdC0+a3BjOwotCQlicmVhazsKLQljYXNlIDg6Ci0JCXYgPSB0LT5rcHNyOwotCQlicmVhazsKLQljYXNlIDEyOgotCQl2ID0gdC0+dXdpbm1hc2s7Ci0JCWJyZWFrOwotCWNhc2UgODMyOgotCQl2ID0gdC0+d19zYXZlZDsKLQkJYnJlYWs7Ci0JY2FzZSA4OTY6Ci0JCXYgPSBjcmVncy0+dV9yZWdzW1VSRUdfSTBdOwotCQlicmVhazsKLQljYXNlIDkwMDoKLQkJdiA9IGNyZWdzLT51X3JlZ3NbVVJFR19JMV07Ci0JCWJyZWFrOwotCWNhc2UgOTA0OgotCQl2ID0gY3JlZ3MtPnVfcmVnc1tVUkVHX0kyXTsKLQkJYnJlYWs7Ci0JY2FzZSA5MDg6Ci0JCXYgPSBjcmVncy0+dV9yZWdzW1VSRUdfSTNdOwotCQlicmVhazsKLQljYXNlIDkxMjoKLQkJdiA9IGNyZWdzLT51X3JlZ3NbVVJFR19JNF07Ci0JCWJyZWFrOwotCWNhc2UgOTE2OgotCQl2ID0gY3JlZ3MtPnVfcmVnc1tVUkVHX0k1XTsKLQkJYnJlYWs7Ci0JY2FzZSA5MjA6Ci0JCXYgPSBjcmVncy0+dV9yZWdzW1VSRUdfSTZdOwotCQlicmVhazsKLQljYXNlIDkyNDoKLQkJaWYodHNrLT50aHJlYWQuZmxhZ3MgJiBNQUdJQ19DT05TVEFOVCkKLQkJCXYgPSBjcmVncy0+dV9yZWdzW1VSRUdfRzFdOwotCQllbHNlCi0JCQl2ID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSA5NDA6Ci0JCXYgPSBjcmVncy0+dV9yZWdzW1VSRUdfSTBdOwotCQlicmVhazsKLQljYXNlIDk0NDoKLQkJdiA9IGNyZWdzLT51X3JlZ3NbVVJFR19JMV07Ci0JCWJyZWFrOwotCi0JY2FzZSA5NDg6Ci0JCS8qIElzbid0IGJpbmFyeSBjb21wYXRpYmlsaXR5IF9mdW5fPz8/ICovCi0JCWlmKGNyZWdzLT5wc3IgJiBQU1JfQykKLQkJCXYgPSBjcmVncy0+dV9yZWdzW1VSRUdfSTBdIDw8IDI0OwotCQllbHNlCi0JCQl2ID0gMDsKLQkJYnJlYWs7Ci0KLQkJLyogUmVzdCBvZiB0aGVtIGFyZSBjb21wbGV0ZWx5IHVuc3VwcG9ydGVkLiAqLwotCWRlZmF1bHQ6Ci0JCXByaW50aygiJXMgWyVkXTogV2FudHMgdG8gcmVhZCB1c2VyIG9mZnNldCAlbGRcbiIsCi0JCSAgICAgICBjdXJyZW50LT5jb21tLCB0YXNrX3BpZF9ucihjdXJyZW50KSwgb2Zmc2V0KTsKLQkJcHRfZXJyb3JfcmV0dXJuKHJlZ3MsIEVJTyk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGN1cnJlbnQtPnBlcnNvbmFsaXR5ID09IFBFUl9TVU5PUykKLQkJcHRfc3VjY19yZXR1cm4gKHJlZ3MsIHYpOwotCWVsc2UKLQkJcHRfc3VjY19yZXR1cm5fbGludXggKHJlZ3MsIHYsIGFkZHIpOwotCXJldHVybjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3N1bm9zX3VzZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotCQkJCSAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKLXsKLQlzdHJ1Y3QgcHRfcmVncyAqY3JlZ3MgPSB0c2stPnRocmVhZC5rcmVnczsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKnQgPSB0YXNrX3RocmVhZF9pbmZvKHRzayk7Ci0JdW5zaWduZWQgbG9uZyB2YWx1ZSA9IHJlZ3MtPnVfcmVnc1tVUkVHX0kzXTsKLQotCWlmKG9mZnNldCA+PSAxMDI0KQotCQlvZmZzZXQgLT0gMTAyNDsgLyogd2hlZS4uLiAqLwotCWlmKG9mZnNldCAmICgoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpIC0gMSkpKQotCQlnb3RvIGZhaWx1cmU7Ci0JaWYob2Zmc2V0ID49IDE2ICYmIG9mZnNldCA8IDc4NCkgewotCQlvZmZzZXQgLT0gMTY7IG9mZnNldCA+Pj0gMjsKLQkJKigoKHVuc2lnbmVkIGxvbmcgKikoJnQtPnJlZ193aW5kb3dbMF0pKStvZmZzZXQpID0gdmFsdWU7Ci0JCWdvdG8gc3VjY2VzczsKLQl9Ci0JaWYob2Zmc2V0ID49IDc4NCAmJiBvZmZzZXQgPCA4MzIpIHsKLQkJb2Zmc2V0IC09IDc4NDsgb2Zmc2V0ID4+PSAyOwotCQkqKCgodW5zaWduZWQgbG9uZyAqKSgmdC0+cndidWZfc3RrcHRyc1swXSkpK29mZnNldCkgPSB2YWx1ZTsKLQkJZ290byBzdWNjZXNzOwotCX0KLQlzd2l0Y2gob2Zmc2V0KSB7Ci0JY2FzZSA4OTY6Ci0JCWNyZWdzLT51X3JlZ3NbVVJFR19JMF0gPSB2YWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZSA5MDA6Ci0JCWNyZWdzLT51X3JlZ3NbVVJFR19JMV0gPSB2YWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZSA5MDQ6Ci0JCWNyZWdzLT51X3JlZ3NbVVJFR19JMl0gPSB2YWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZSA5MDg6Ci0JCWNyZWdzLT51X3JlZ3NbVVJFR19JM10gPSB2YWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZSA5MTI6Ci0JCWNyZWdzLT51X3JlZ3NbVVJFR19JNF0gPSB2YWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZSA5MTY6Ci0JCWNyZWdzLT51X3JlZ3NbVVJFR19JNV0gPSB2YWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZSA5MjA6Ci0JCWNyZWdzLT51X3JlZ3NbVVJFR19JNl0gPSB2YWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZSA5MjQ6Ci0JCWNyZWdzLT51X3JlZ3NbVVJFR19JN10gPSB2YWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZSA5NDA6Ci0JCWNyZWdzLT51X3JlZ3NbVVJFR19JMF0gPSB2YWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZSA5NDQ6Ci0JCWNyZWdzLT51X3JlZ3NbVVJFR19JMV0gPSB2YWx1ZTsKLQkJYnJlYWs7Ci0KLQkJLyogUmVzdCBvZiB0aGVtIGFyZSBjb21wbGV0ZWx5IHVuc3VwcG9ydGVkIG9yICJuby10b3VjaCIuICovCi0JZGVmYXVsdDoKLQkJcHJpbnRrKCIlcyBbJWRdOiBXYW50cyB0byB3cml0ZSB1c2VyIG9mZnNldCAlbGRcbiIsCi0JCSAgICAgICBjdXJyZW50LT5jb21tLCB0YXNrX3BpZF9ucihjdXJyZW50KSwgb2Zmc2V0KTsKLQkJZ290byBmYWlsdXJlOwotCX0KLXN1Y2Nlc3M6Ci0JcHRfc3VjY19yZXR1cm4ocmVncywgMCk7Ci0JcmV0dXJuOwotZmFpbHVyZToKLQlwdF9lcnJvcl9yZXR1cm4ocmVncywgRUlPKTsKLQlyZXR1cm47Ci19Ci0KIC8qICNkZWZpbmUgQUxMT1dfSU5JVF9UUkFDSU5HICovCi0vKiAjZGVmaW5lIERFQlVHX1BUUkFDRSAqLwotCi0jaWZkZWYgREVCVUdfUFRSQUNFCi1jaGFyICpwdF9ycSBbXSA9IHsKLQkvKiAwICAqLyAiVFJBQ0VNRSIsICJQRUVLVEVYVCIsICJQRUVLREFUQSIsICJQRUVLVVNSIiwKLQkvKiA0ICAqLyAiUE9LRVRFWFQiLCAiUE9LRURBVEEiLCAiUE9LRVVTUiIsICJDT05UIiwKLQkvKiA4ICAqLyAiS0lMTCIsICJTSU5HTEVTVEVQIiwgIlNVTkFUVEFDSCIsICJTVU5ERVRBQ0giLAotCS8qIDEyICovICJHRVRSRUdTIiwgIlNFVFJFR1MiLCAiR0VURlBSRUdTIiwgIlNFVEZQUkVHUyIsCi0JLyogMTYgKi8gIlJFQUREQVRBIiwgIldSSVRFREFUQSIsICJSRUFEVEVYVCIsICJXUklURVRFWFQiLAotCS8qIDIwICovICJHRVRGUEFSRUdTIiwgIlNFVEZQQVJFR1MiLCAidW5rbm93biIsICJ1bmtub3duIiwKLQkvKiAyNCAqLyAiU1lTQ0FMTCIsICIiCi19OwotI2VuZGlmCiAKIC8qCiAgKiBDYWxsZWQgYnkga2VybmVsL3B0cmFjZS5jIHdoZW4gZGV0YWNoaW5nLi4KQEAgLTI1OCwxNTAgKzM4LDMyNCBAQAogCS8qIG5vdGhpbmcgdG8gZG8gKi8KIH0KIAotYXNtbGlua2FnZSB2b2lkIGRvX3B0cmFjZShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2VudW0gc3BhcmNfcmVnc2V0IHsKKwlSRUdTRVRfR0VORVJBTCwKKwlSRUdTRVRfRlAsCit9OworCitzdGF0aWMgaW50IGdlbnJlZ3MzMl9nZXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXJnZXQsCisJCQkgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0ICpyZWdzZXQsCisJCQkgdW5zaWduZWQgaW50IHBvcywgdW5zaWduZWQgaW50IGNvdW50LAorCQkJIHZvaWQgKmtidWYsIHZvaWQgX191c2VyICp1YnVmKQogewotCXVuc2lnbmVkIGxvbmcgcmVxdWVzdCA9IHJlZ3MtPnVfcmVnc1tVUkVHX0kwXTsKLQl1bnNpZ25lZCBsb25nIHBpZCA9IHJlZ3MtPnVfcmVnc1tVUkVHX0kxXTsKLQl1bnNpZ25lZCBsb25nIGFkZHIgPSByZWdzLT51X3JlZ3NbVVJFR19JMl07Ci0JdW5zaWduZWQgbG9uZyBkYXRhID0gcmVncy0+dV9yZWdzW1VSRUdfSTNdOwotCXVuc2lnbmVkIGxvbmcgYWRkcjIgPSByZWdzLT51X3JlZ3NbVVJFR19JNF07Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZDsKKwljb25zdCBzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhcmdldC0+dGhyZWFkLmtyZWdzOworCXVuc2lnbmVkIGxvbmcgX191c2VyICpyZWdfd2luZG93OworCXVuc2lnbmVkIGxvbmcgKmsgPSBrYnVmOworCXVuc2lnbmVkIGxvbmcgX191c2VyICp1ID0gdWJ1ZjsKKwl1bnNpZ25lZCBsb25nIHJlZzsKKworCWlmICh0YXJnZXQgPT0gY3VycmVudCkKKwkJZmx1c2hfdXNlcl93aW5kb3dzKCk7CisKKwlwb3MgLz0gc2l6ZW9mKHJlZyk7CisJY291bnQgLz0gc2l6ZW9mKHJlZyk7CisKKwlpZiAoa2J1ZikgeworCQlmb3IgKDsgY291bnQgPiAwICYmIHBvcyA8IDE2OyBjb3VudC0tKQorCQkJKmsrKyA9IHJlZ3MtPnVfcmVnc1twb3MrK107CisKKwkJcmVnX3dpbmRvdyA9ICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSByZWdzLT51X3JlZ3NbVVJFR19JNl07CisJCWZvciAoOyBjb3VudCA+IDAgJiYgcG9zIDwgMzI7IGNvdW50LS0pIHsKKwkJCWlmIChnZXRfdXNlcigqaysrLCAmcmVnX3dpbmRvd1twb3MrK10pKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfSBlbHNlIHsKKwkJZm9yICg7IGNvdW50ID4gMCAmJiBwb3MgPCAxNjsgY291bnQtLSkgeworCQkJaWYgKHB1dF91c2VyKHJlZ3MtPnVfcmVnc1twb3MrK10sIHUrKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlyZWdfd2luZG93ID0gKHVuc2lnbmVkIGxvbmcgX191c2VyICopIHJlZ3MtPnVfcmVnc1tVUkVHX0k2XTsKKwkJZm9yICg7IGNvdW50ID4gMCAmJiBwb3MgPCAzMjsgY291bnQtLSkgeworCQkJaWYgKGdldF91c2VyKHJlZywgJnJlZ193aW5kb3dbcG9zKytdKSB8fAorCQkJICAgIHB1dF91c2VyKHJlZywgdSsrKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXN3aXRjaCAocG9zKSB7CisJCWNhc2UgMzI6IC8qIFBTUiAqLworCQkJcmVnID0gcmVncy0+cHNyOworCQkJYnJlYWs7CisJCWNhc2UgMzM6IC8qIFBDICovCisJCQlyZWcgPSByZWdzLT5wYzsKKwkJCWJyZWFrOworCQljYXNlIDM0OiAvKiBOUEMgKi8KKwkJCXJlZyA9IHJlZ3MtPm5wYzsKKwkJCWJyZWFrOworCQljYXNlIDM1OiAvKiBZICovCisJCQlyZWcgPSByZWdzLT55OworCQkJYnJlYWs7CisJCWNhc2UgMzY6IC8qIFdJTSAqLworCQljYXNlIDM3OiAvKiBUQlIgKi8KKwkJCXJlZyA9IDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZmluaXNoOworCQl9CisKKwkJaWYgKGtidWYpCisJCQkqaysrID0gcmVnOworCQllbHNlIGlmIChwdXRfdXNlcihyZWcsIHUrKykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcG9zKys7CisJCWNvdW50LS07CisJfQorZmluaXNoOgorCXBvcyAqPSBzaXplb2YocmVnKTsKKwljb3VudCAqPSBzaXplb2YocmVnKTsKKworCXJldHVybiB1c2VyX3JlZ3NldF9jb3B5b3V0X3plcm8oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJCTM4ICogc2l6ZW9mKHJlZyksIC0xKTsKK30KKworc3RhdGljIGludCBnZW5yZWdzMzJfc2V0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0LAorCQkJIGNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldCAqcmVnc2V0LAorCQkJIHVuc2lnbmVkIGludCBwb3MsIHVuc2lnbmVkIGludCBjb3VudCwKKwkJCSBjb25zdCB2b2lkICprYnVmLCBjb25zdCB2b2lkIF9fdXNlciAqdWJ1ZikKK3sKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhcmdldC0+dGhyZWFkLmtyZWdzOworCXVuc2lnbmVkIGxvbmcgX191c2VyICpyZWdfd2luZG93OworCWNvbnN0IHVuc2lnbmVkIGxvbmcgKmsgPSBrYnVmOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgX191c2VyICp1ID0gdWJ1ZjsKKwl1bnNpZ25lZCBsb25nIHJlZzsKKworCWlmICh0YXJnZXQgPT0gY3VycmVudCkKKwkJZmx1c2hfdXNlcl93aW5kb3dzKCk7CisKKwlwb3MgLz0gc2l6ZW9mKHJlZyk7CisJY291bnQgLz0gc2l6ZW9mKHJlZyk7CisKKwlpZiAoa2J1ZikgeworCQlmb3IgKDsgY291bnQgPiAwICYmIHBvcyA8IDE2OyBjb3VudC0tKQorCQkJcmVncy0+dV9yZWdzW3BvcysrXSA9ICprKys7CisKKwkJcmVnX3dpbmRvdyA9ICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSByZWdzLT51X3JlZ3NbVVJFR19JNl07CisJCWZvciAoOyBjb3VudCA+IDAgJiYgcG9zIDwgMzI7IGNvdW50LS0pIHsKKwkJCWlmIChwdXRfdXNlcigqaysrLCAmcmVnX3dpbmRvd1twb3MrK10pKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfSBlbHNlIHsKKwkJZm9yICg7IGNvdW50ID4gMCAmJiBwb3MgPCAxNjsgY291bnQtLSkgeworCQkJaWYgKGdldF91c2VyKHJlZywgdSsrKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJlZ3MtPnVfcmVnc1twb3MrK10gPSByZWc7CisJCX0KKworCQlyZWdfd2luZG93ID0gKHVuc2lnbmVkIGxvbmcgX191c2VyICopIHJlZ3MtPnVfcmVnc1tVUkVHX0k2XTsKKwkJZm9yICg7IGNvdW50ID4gMCAmJiBwb3MgPCAzMjsgY291bnQtLSkgeworCQkJaWYgKGdldF91c2VyKHJlZywgdSsrKSB8fAorCQkJICAgIHB1dF91c2VyKHJlZywgJnJlZ193aW5kb3dbcG9zKytdKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXVuc2lnbmVkIGxvbmcgcHNyOworCisJCWlmIChrYnVmKQorCQkJcmVnID0gKmsrKzsKKwkJZWxzZSBpZiAoZ2V0X3VzZXIocmVnLCB1KyspKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJc3dpdGNoIChwb3MpIHsKKwkJY2FzZSAzMjogLyogUFNSICovCisJCQlwc3IgPSByZWdzLT5wc3I7CisJCQlwc3IgJj0gflBTUl9JQ0M7CisJCQlwc3IgfD0gKHJlZyAmIFBTUl9JQ0MpOworCQkJcmVncy0+cHNyID0gcHNyOworCQkJYnJlYWs7CisJCWNhc2UgMzM6IC8qIFBDICovCisJCQlyZWdzLT5wYyA9IHJlZzsKKwkJCWJyZWFrOworCQljYXNlIDM0OiAvKiBOUEMgKi8KKwkJCXJlZ3MtPm5wYyA9IHJlZzsKKwkJCWJyZWFrOworCQljYXNlIDM1OiAvKiBZICovCisJCQlyZWdzLT55ID0gcmVnOworCQkJYnJlYWs7CisJCWNhc2UgMzY6IC8qIFdJTSAqLworCQljYXNlIDM3OiAvKiBUQlIgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBmaW5pc2g7CisJCX0KKworCQlwb3MrKzsKKwkJY291bnQtLTsKKwl9CitmaW5pc2g6CisJcG9zICo9IHNpemVvZihyZWcpOworCWNvdW50ICo9IHNpemVvZihyZWcpOworCisJcmV0dXJuIHVzZXJfcmVnc2V0X2NvcHlpbl9pZ25vcmUoJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJCSAzOCAqIHNpemVvZihyZWcpLCAtMSk7Cit9CisKK3N0YXRpYyBpbnQgZnByZWdzMzJfZ2V0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0LAorCQkJY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0ICpyZWdzZXQsCisJCQl1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCisJCQl2b2lkICprYnVmLCB2b2lkIF9fdXNlciAqdWJ1ZikKK3sKKwljb25zdCB1bnNpZ25lZCBsb25nICpmcHJlZ3MgPSB0YXJnZXQtPnRocmVhZC5mbG9hdF9yZWdzOworCWludCByZXQgPSAwOworCisjaWYgMAorCWlmICh0YXJnZXQgPT0gY3VycmVudCkKKwkJc2F2ZV9hbmRfY2xlYXJfZnB1KCk7CisjZW5kaWYKKworCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlvdXQoJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJICBmcHJlZ3MsCisJCQkJICAwLCAzMiAqIHNpemVvZih1MzIpKTsKKworCWlmICghcmV0KQorCQlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5b3V0X3plcm8oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJCSAgICAgICAzMiAqIHNpemVvZih1MzIpLAorCQkJCQkgICAgICAgMzMgKiBzaXplb2YodTMyKSk7CisJaWYgKCFyZXQpCisJCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlvdXQoJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJCSAgJnRhcmdldC0+dGhyZWFkLmZzciwKKwkJCQkJICAzMyAqIHNpemVvZih1MzIpLAorCQkJCQkgIDM0ICogc2l6ZW9mKHUzMikpOworCisJaWYgKCFyZXQpIHsKKwkJdW5zaWduZWQgbG9uZyB2YWw7CisKKwkJdmFsID0gKDEgPDwgOCkgfCAoOCA8PCAxNik7CisJCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlvdXQoJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJCSAgJnZhbCwKKwkJCQkJICAzNCAqIHNpemVvZih1MzIpLAorCQkJCQkgIDM1ICogc2l6ZW9mKHUzMikpOworCX0KKworCWlmICghcmV0KQorCQlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5b3V0X3plcm8oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJCSAgICAgICAzNSAqIHNpemVvZih1MzIpLCAtMSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZwcmVnczMyX3NldChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhcmdldCwKKwkJCWNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldCAqcmVnc2V0LAorCQkJdW5zaWduZWQgaW50IHBvcywgdW5zaWduZWQgaW50IGNvdW50LAorCQkJY29uc3Qgdm9pZCAqa2J1ZiwgY29uc3Qgdm9pZCBfX3VzZXIgKnVidWYpCit7CisJdW5zaWduZWQgbG9uZyAqZnByZWdzID0gdGFyZ2V0LT50aHJlYWQuZmxvYXRfcmVnczsKIAlpbnQgcmV0OwogCi0JbG9ja19rZXJuZWwoKTsKLSNpZmRlZiBERUJVR19QVFJBQ0UKLQl7Ci0JCWNoYXIgKnM7Ci0KLQkJaWYgKChyZXF1ZXN0ID49IDApICYmIChyZXF1ZXN0IDw9IDI0KSkKLQkJCXMgPSBwdF9ycSBbcmVxdWVzdF07Ci0JCWVsc2UKLQkJCXMgPSAidW5rbm93biI7Ci0KLQkJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1BPS0VEQVRBICYmIGRhdGEgPT0gMHg5MWQwMjAwMSl7Ci0JCQlwcmludGsgKCJkb19wdHJhY2U6IGJyZWFrcG9pbnQgcGlkPSVkLCBhZGRyPSUwOGx4IGFkZHIyPSUwOGx4XG4iLAotCQkJCXBpZCwgYWRkciwgYWRkcjIpOwotCQl9IGVsc2UgCi0JCQlwcmludGsoImRvX3B0cmFjZTogcnE9JXMoJWQpIHBpZD0lZCBhZGRyPSUwOGx4IGRhdGE9JTA4bHggYWRkcjI9JTA4bHhcbiIsCi0JCQkgICAgICAgcywgKGludCkgcmVxdWVzdCwgKGludCkgcGlkLCBhZGRyLCBkYXRhLCBhZGRyMik7Ci0JfQorI2lmIDAKKwlpZiAodGFyZ2V0ID09IGN1cnJlbnQpCisJCXNhdmVfYW5kX2NsZWFyX2ZwdSgpOwogI2VuZGlmCi0KLQlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfVFJBQ0VNRSkgewotCQlyZXQgPSBwdHJhY2VfdHJhY2VtZSgpOwotCQlpZiAocmV0IDwgMCkKLQkJCXB0X2Vycm9yX3JldHVybihyZWdzLCAtcmV0KTsKLQkJZWxzZQotCQkJcHRfc3VjY19yZXR1cm4ocmVncywgMCk7Ci0JCWdvdG8gb3V0OworCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlpbigmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkgZnByZWdzLAorCQkJCSAwLCAzMiAqIHNpemVvZih1MzIpKTsKKwlpZiAoIXJldCkKKwkJdXNlcl9yZWdzZXRfY29weWluX2lnbm9yZSgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJICAzMiAqIHNpemVvZih1MzIpLAorCQkJCQkgIDMzICogc2l6ZW9mKHUzMikpOworCWlmICghcmV0ICYmIGNvdW50ID4gMCkgeworCQlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5aW4oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJCSAmdGFyZ2V0LT50aHJlYWQuZnNyLAorCQkJCQkgMzMgKiBzaXplb2YodTMyKSwKKwkJCQkJIDM0ICogc2l6ZW9mKHUzMikpOwogCX0KIAotCWNoaWxkID0gcHRyYWNlX2dldF90YXNrX3N0cnVjdChwaWQpOwotCWlmIChJU19FUlIoY2hpbGQpKSB7Ci0JCXJldCA9IFBUUl9FUlIoY2hpbGQpOwotCQlwdF9lcnJvcl9yZXR1cm4ocmVncywgLXJldCk7Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAoIXJldCkKKwkJcmV0ID0gdXNlcl9yZWdzZXRfY29weWluX2lnbm9yZSgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJCTM0ICogc2l6ZW9mKHUzMiksIC0xKTsKKwlyZXR1cm4gcmV0OworfQogCi0JaWYgKChjdXJyZW50LT5wZXJzb25hbGl0eSA9PSBQRVJfU1VOT1MgJiYgcmVxdWVzdCA9PSBQVFJBQ0VfU1VOQVRUQUNIKQotCSAgICB8fCAoY3VycmVudC0+cGVyc29uYWxpdHkgIT0gUEVSX1NVTk9TICYmIHJlcXVlc3QgPT0gUFRSQUNFX0FUVEFDSCkpIHsKLQkJaWYgKHB0cmFjZV9hdHRhY2goY2hpbGQpKSB7Ci0JCQlwdF9lcnJvcl9yZXR1cm4ocmVncywgRVBFUk0pOwotCQkJZ290byBvdXRfdHNrOwotCQl9Ci0JCXB0X3N1Y2NfcmV0dXJuKHJlZ3MsIDApOwotCQlnb3RvIG91dF90c2s7Ci0JfQorc3RhdGljIGNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldCBzcGFyYzMyX3JlZ3NldHNbXSA9IHsKKwkvKiBGb3JtYXQgaXM6CisJICogCUcwIC0tPiBHNworCSAqCU8wIC0tPiBPNworCSAqCUwwIC0tPiBMNworCSAqCUkwIC0tPiBJNworCSAqCVBTUiwgUEMsIG5QQywgWSwgV0lNLCBUQlIKKwkgKi8KKwlbUkVHU0VUX0dFTkVSQUxdID0geworCQkuY29yZV9ub3RlX3R5cGUgPSBOVF9QUlNUQVRVUywKKwkJLm4gPSAzOCAqIHNpemVvZih1MzIpLAorCQkuc2l6ZSA9IHNpemVvZih1MzIpLCAuYWxpZ24gPSBzaXplb2YodTMyKSwKKwkJLmdldCA9IGdlbnJlZ3MzMl9nZXQsIC5zZXQgPSBnZW5yZWdzMzJfc2V0CisJfSwKKwkvKiBGb3JtYXQgaXM6CisJICoJRjAgLS0+IEYzMQorCSAqCWVtcHR5IDMyLWJpdCB3b3JkCisJICoJRlNSICgzMi0tYml0IHdvcmQpCisJICoJRlBVIFFVRVVFIENPVU5UICg4LWJpdCBjaGFyKQorCSAqCUZQVSBRVUVVRSBFTlRSWVNJWkUgKDgtYml0IGNoYXIpCisJICoJRlBVIEVOQUJMRUQgKDgtYml0IGNoYXIpCisJICoJZW1wdHkgOC1iaXQgY2hhcgorCSAqCUZQVSBRVUVVRSAoNjQgMzItYml0IGludHMpCisJICovCisJW1JFR1NFVF9GUF0gPSB7CisJCS5jb3JlX25vdGVfdHlwZSA9IE5UX1BSRlBSRUcsCisJCS5uID0gOTkgKiBzaXplb2YodTMyKSwKKwkJLnNpemUgPSBzaXplb2YodTMyKSwgLmFsaWduID0gc2l6ZW9mKHUzMiksCisJCS5nZXQgPSBmcHJlZ3MzMl9nZXQsIC5zZXQgPSBmcHJlZ3MzMl9zZXQKKwl9LAorfTsKIAotCXJldCA9IHB0cmFjZV9jaGVja19hdHRhY2goY2hpbGQsIHJlcXVlc3QgPT0gUFRSQUNFX0tJTEwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXB0X2Vycm9yX3JldHVybihyZWdzLCAtcmV0KTsKLQkJZ290byBvdXRfdHNrOwotCX0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXRfdmlldyB1c2VyX3NwYXJjMzJfdmlldyA9IHsKKwkubmFtZSA9ICJzcGFyYyIsIC5lX21hY2hpbmUgPSBFTV9TUEFSQywKKwkucmVnc2V0cyA9IHNwYXJjMzJfcmVnc2V0cywgLm4gPSBBUlJBWV9TSVpFKHNwYXJjMzJfcmVnc2V0cykKK307CisKK2NvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldF92aWV3ICp0YXNrX3VzZXJfcmVnc2V0X3ZpZXcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCXJldHVybiAmdXNlcl9zcGFyYzMyX3ZpZXc7Cit9CisKK2xvbmcgYXJjaF9wdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyByZXF1ZXN0LCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIyID0gY3VycmVudC0+dGhyZWFkLmtyZWdzLT51X3JlZ3NbVVJFR19JNF07CisJY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0X3ZpZXcgKnZpZXc7CisJaW50IHJldDsKKworCXZpZXcgPSB0YXNrX3VzZXJfcmVnc2V0X3ZpZXcoY2hpbGQpOwogCiAJc3dpdGNoKHJlcXVlc3QpIHsKLQljYXNlIFBUUkFDRV9QRUVLVEVYVDogLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovIAotCWNhc2UgUFRSQUNFX1BFRUtEQVRBOiB7Ci0JCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JCWlmIChhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwKLQkJCQkgICAgICAmdG1wLCBzaXplb2YodG1wKSwgMCkgPT0gc2l6ZW9mKHRtcCkpCi0JCQlwdF9vc19zdWNjX3JldHVybihyZWdzLCB0bXAsIChsb25nIF9fdXNlciAqKWRhdGEpOwotCQllbHNlCi0JCQlwdF9lcnJvcl9yZXR1cm4ocmVncywgRUlPKTsKLQkJZ290byBvdXRfdHNrOwotCX0KLQotCWNhc2UgUFRSQUNFX1BFRUtVU1I6Ci0JCXJlYWRfc3Vub3NfdXNlcihyZWdzLCBhZGRyLCBjaGlsZCwgKGxvbmcgX191c2VyICopIGRhdGEpOwotCQlnb3RvIG91dF90c2s7Ci0KLQljYXNlIFBUUkFDRV9QT0tFVVNSOgotCQl3cml0ZV9zdW5vc191c2VyKHJlZ3MsIGFkZHIsIGNoaWxkKTsKLQkJZ290byBvdXRfdHNrOwotCi0JY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCi0JY2FzZSBQVFJBQ0VfUE9LRURBVEE6IHsKLQkJaWYgKGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLAotCQkJCSAgICAgICZkYXRhLCBzaXplb2YoZGF0YSksIDEpID09IHNpemVvZihkYXRhKSkKLQkJCXB0X3N1Y2NfcmV0dXJuKHJlZ3MsIDApOwotCQllbHNlCi0JCQlwdF9lcnJvcl9yZXR1cm4ocmVncywgRUlPKTsKLQkJZ290byBvdXRfdHNrOwotCX0KLQogCWNhc2UgUFRSQUNFX0dFVFJFR1M6IHsKIAkJc3RydWN0IHB0X3JlZ3MgX191c2VyICpwcmVncyA9IChzdHJ1Y3QgcHRfcmVncyBfX3VzZXIgKikgYWRkcjsKLQkJc3RydWN0IHB0X3JlZ3MgKmNyZWdzID0gY2hpbGQtPnRocmVhZC5rcmVnczsKLQkJaW50IHJ2YWw7CiAKLQkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBwcmVncywgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSkpIHsKLQkJCXJ2YWwgPSAtRUZBVUxUOwotCQkJcHRfZXJyb3JfcmV0dXJuKHJlZ3MsIC1ydmFsKTsKLQkJCWdvdG8gb3V0X3RzazsKLQkJfQotCQlfX3B1dF91c2VyKGNyZWdzLT5wc3IsICgmcHJlZ3MtPnBzcikpOwotCQlfX3B1dF91c2VyKGNyZWdzLT5wYywgKCZwcmVncy0+cGMpKTsKLQkJX19wdXRfdXNlcihjcmVncy0+bnBjLCAoJnByZWdzLT5ucGMpKTsKLQkJX19wdXRfdXNlcihjcmVncy0+eSwgKCZwcmVncy0+eSkpOwotCQlmb3IocnZhbCA9IDE7IHJ2YWwgPCAxNjsgcnZhbCsrKQotCQkJX19wdXRfdXNlcihjcmVncy0+dV9yZWdzW3J2YWxdLCAoJnByZWdzLT51X3JlZ3NbcnZhbCAtIDFdKSk7Ci0JCXB0X3N1Y2NfcmV0dXJuKHJlZ3MsIDApOwotI2lmZGVmIERFQlVHX1BUUkFDRQotCQlwcmludGsgKCJQQz0leCBuUEM9JXggbzc9JXhcbiIsIGNyZWdzLT5wYywgY3JlZ3MtPm5wYywgY3JlZ3MtPnVfcmVncyBbMTVdKTsKLSNlbmRpZgotCQlnb3RvIG91dF90c2s7CisJCXJldCA9IGNvcHlfcmVnc2V0X3RvX3VzZXIoY2hpbGQsIHZpZXcsIFJFR1NFVF9HRU5FUkFMLAorCQkJCQkgIDMyICogc2l6ZW9mKHUzMiksCisJCQkJCSAgNCAqIHNpemVvZih1MzIpLAorCQkJCQkgICZwcmVncy0+cHNyKTsKKwkJaWYgKCFyZXQpCisJCQljb3B5X3JlZ3NldF90b191c2VyKGNoaWxkLCB2aWV3LCBSRUdTRVRfR0VORVJBTCwKKwkJCQkJICAgIDEgKiBzaXplb2YodTMyKSwKKwkJCQkJICAgIDE1ICogc2l6ZW9mKHUzMiksCisJCQkJCSAgICAmcHJlZ3MtPnVfcmVnc1swXSk7CisJCWJyZWFrOwogCX0KIAogCWNhc2UgUFRSQUNFX1NFVFJFR1M6IHsKIAkJc3RydWN0IHB0X3JlZ3MgX191c2VyICpwcmVncyA9IChzdHJ1Y3QgcHRfcmVncyBfX3VzZXIgKikgYWRkcjsKLQkJc3RydWN0IHB0X3JlZ3MgKmNyZWdzID0gY2hpbGQtPnRocmVhZC5rcmVnczsKLQkJdW5zaWduZWQgbG9uZyBwc3IsIHBjLCBucGMsIHk7Ci0JCWludCBpOwogCi0JCS8qIE11c3QgYmUgY2FyZWZ1bCwgdHJhY2luZyBwcm9jZXNzIGNhbiBvbmx5IHNldCBjZXJ0YWluCi0JCSAqIGJpdHMgaW4gdGhlIHBzci4KLQkJICovCi0JCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBwcmVncywgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSkpIHsKLQkJCXB0X2Vycm9yX3JldHVybihyZWdzLCBFRkFVTFQpOwotCQkJZ290byBvdXRfdHNrOwotCQl9Ci0JCV9fZ2V0X3VzZXIocHNyLCAoJnByZWdzLT5wc3IpKTsKLQkJX19nZXRfdXNlcihwYywgKCZwcmVncy0+cGMpKTsKLQkJX19nZXRfdXNlcihucGMsICgmcHJlZ3MtPm5wYykpOwotCQlfX2dldF91c2VyKHksICgmcHJlZ3MtPnkpKTsKLQkJcHNyICY9IFBTUl9JQ0M7Ci0JCWNyZWdzLT5wc3IgJj0gflBTUl9JQ0M7Ci0JCWNyZWdzLT5wc3IgfD0gcHNyOwotCQlpZiAoISgocGMgfCBucGMpICYgMykpIHsKLQkJCWNyZWdzLT5wYyA9IHBjOwotCQkJY3JlZ3MtPm5wYyA9bnBjOwotCQl9Ci0JCWNyZWdzLT55ID0geTsKLQkJZm9yKGkgPSAxOyBpIDwgMTY7IGkrKykKLQkJCV9fZ2V0X3VzZXIoY3JlZ3MtPnVfcmVnc1tpXSwgKCZwcmVncy0+dV9yZWdzW2ktMV0pKTsKLQkJcHRfc3VjY19yZXR1cm4ocmVncywgMCk7Ci0JCWdvdG8gb3V0X3RzazsKKwkJcmV0ID0gY29weV9yZWdzZXRfZnJvbV91c2VyKGNoaWxkLCB2aWV3LCBSRUdTRVRfR0VORVJBTCwKKwkJCQkJICAgIDMyICogc2l6ZW9mKHUzMiksCisJCQkJCSAgICA0ICogc2l6ZW9mKHUzMiksCisJCQkJCSAgICAmcHJlZ3MtPnBzcik7CisJCWlmICghcmV0KQorCQkJY29weV9yZWdzZXRfZnJvbV91c2VyKGNoaWxkLCB2aWV3LCBSRUdTRVRfR0VORVJBTCwKKwkJCQkJICAgICAgMSAqIHNpemVvZih1MzIpLAorCQkJCQkgICAgICAxNSAqIHNpemVvZih1MzIpLAorCQkJCQkgICAgICAmcHJlZ3MtPnVfcmVnc1swXSk7CisJCWJyZWFrOwogCX0KIAogCWNhc2UgUFRSQUNFX0dFVEZQUkVHUzogewpAQCAtNDE3LDI2ICszNzEsMjUgQEAKIAkJCX0gZnBxWzE2XTsKIAkJfTsKIAkJc3RydWN0IGZwcyBfX3VzZXIgKmZwcyA9IChzdHJ1Y3QgZnBzIF9fdXNlciAqKSBhZGRyOwotCQlpbnQgaTsKIAotCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGZwcywgc2l6ZW9mKHN0cnVjdCBmcHMpKSkgewotCQkJaSA9IC1FRkFVTFQ7Ci0JCQlwdF9lcnJvcl9yZXR1cm4ocmVncywgLWkpOwotCQkJZ290byBvdXRfdHNrOworCQlyZXQgPSBjb3B5X3JlZ3NldF90b191c2VyKGNoaWxkLCB2aWV3LCBSRUdTRVRfRlAsCisJCQkJCSAgMCAqIHNpemVvZih1MzIpLAorCQkJCQkgIDMyICogc2l6ZW9mKHUzMiksCisJCQkJCSAgJmZwcy0+cmVnc1swXSk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gY29weV9yZWdzZXRfdG9fdXNlcihjaGlsZCwgdmlldywgUkVHU0VUX0ZQLAorCQkJCQkJICAzMyAqIHNpemVvZih1MzIpLAorCQkJCQkJICAxICogc2l6ZW9mKHUzMiksCisJCQkJCQkgICZmcHMtPmZzcik7CisKKwkJaWYgKCFyZXQpIHsKKwkJCWlmIChfX3B1dF91c2VyKDAsICZmcHMtPmZwcWQpIHx8CisJCQkgICAgX19wdXRfdXNlcigwLCAmZnBzLT5mbGFncykgfHwKKwkJCSAgICBfX3B1dF91c2VyKDAsICZmcHMtPmV4dHJhKSB8fAorCQkJICAgIGNsZWFyX3VzZXIoZnBzLT5mcHEsIHNpemVvZihmcHMtPmZwcSkpKQorCQkJCXJldCA9IC1FRkFVTFQ7CiAJCX0KLQkJZm9yKGkgPSAwOyBpIDwgMzI7IGkrKykKLQkJCV9fcHV0X3VzZXIoY2hpbGQtPnRocmVhZC5mbG9hdF9yZWdzW2ldLCAoJmZwcy0+cmVnc1tpXSkpOwotCQlfX3B1dF91c2VyKGNoaWxkLT50aHJlYWQuZnNyLCAoJmZwcy0+ZnNyKSk7Ci0JCV9fcHV0X3VzZXIoY2hpbGQtPnRocmVhZC5mcHFkZXB0aCwgKCZmcHMtPmZwcWQpKTsKLQkJX19wdXRfdXNlcigwLCAoJmZwcy0+ZmxhZ3MpKTsKLQkJX19wdXRfdXNlcigwLCAoJmZwcy0+ZXh0cmEpKTsKLQkJZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQkJX19wdXRfdXNlcihjaGlsZC0+dGhyZWFkLmZwcXVldWVbaV0uaW5zbl9hZGRyLAotCQkJCSAgICgmZnBzLT5mcHFbaV0uaW5zbmFkZHIpKTsKLQkJCV9fcHV0X3VzZXIoY2hpbGQtPnRocmVhZC5mcHF1ZXVlW2ldLmluc24sICgmZnBzLT5mcHFbaV0uaW5zbikpOwotCQl9Ci0JCXB0X3N1Y2NfcmV0dXJuKHJlZ3MsIDApOwotCQlnb3RvIG91dF90c2s7CisJCWJyZWFrOwogCX0KIAogCWNhc2UgUFRSQUNFX1NFVEZQUkVHUzogewpAQCAtNDUyLDEzNyArNDA1LDU1IEBACiAJCQl9IGZwcVsxNl07CiAJCX07CiAJCXN0cnVjdCBmcHMgX191c2VyICpmcHMgPSAoc3RydWN0IGZwcyBfX3VzZXIgKikgYWRkcjsKLQkJaW50IGk7CiAKLQkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZwcywgc2l6ZW9mKHN0cnVjdCBmcHMpKSkgewotCQkJaSA9IC1FRkFVTFQ7Ci0JCQlwdF9lcnJvcl9yZXR1cm4ocmVncywgLWkpOwotCQkJZ290byBvdXRfdHNrOwotCQl9Ci0JCWNvcHlfZnJvbV91c2VyKCZjaGlsZC0+dGhyZWFkLmZsb2F0X3JlZ3NbMF0sICZmcHMtPnJlZ3NbMF0sICgzMiAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkpOwotCQlfX2dldF91c2VyKGNoaWxkLT50aHJlYWQuZnNyLCAoJmZwcy0+ZnNyKSk7Ci0JCV9fZ2V0X3VzZXIoY2hpbGQtPnRocmVhZC5mcHFkZXB0aCwgKCZmcHMtPmZwcWQpKTsKLQkJZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQkJX19nZXRfdXNlcihjaGlsZC0+dGhyZWFkLmZwcXVldWVbaV0uaW5zbl9hZGRyLAotCQkJCSAgICgmZnBzLT5mcHFbaV0uaW5zbmFkZHIpKTsKLQkJCV9fZ2V0X3VzZXIoY2hpbGQtPnRocmVhZC5mcHF1ZXVlW2ldLmluc24sICgmZnBzLT5mcHFbaV0uaW5zbikpOwotCQl9Ci0JCXB0X3N1Y2NfcmV0dXJuKHJlZ3MsIDApOwotCQlnb3RvIG91dF90c2s7CisJCXJldCA9IGNvcHlfcmVnc2V0X2Zyb21fdXNlcihjaGlsZCwgdmlldywgUkVHU0VUX0ZQLAorCQkJCQkgICAgMCAqIHNpemVvZih1MzIpLAorCQkJCQkgICAgMzIgKiBzaXplb2YodTMyKSwKKwkJCQkJICAgICZmcHMtPnJlZ3NbMF0pOworCQlpZiAoIXJldCkKKwkJCXJldCA9IGNvcHlfcmVnc2V0X2Zyb21fdXNlcihjaGlsZCwgdmlldywgUkVHU0VUX0ZQLAorCQkJCQkJICAgIDMzICogc2l6ZW9mKHUzMiksCisJCQkJCQkgICAgMSAqIHNpemVvZih1MzIpLAorCQkJCQkJICAgICZmcHMtPmZzcik7CisJCWJyZWFrOwogCX0KIAogCWNhc2UgUFRSQUNFX1JFQURURVhUOgotCWNhc2UgUFRSQUNFX1JFQUREQVRBOiB7Ci0JCWludCByZXMgPSBwdHJhY2VfcmVhZGRhdGEoY2hpbGQsIGFkZHIsCi0JCQkJCSAgKHZvaWQgX191c2VyICopIGFkZHIyLCBkYXRhKTsKKwljYXNlIFBUUkFDRV9SRUFEREFUQToKKwkJcmV0ID0gcHRyYWNlX3JlYWRkYXRhKGNoaWxkLCBhZGRyLAorCQkJCSAgICAgICh2b2lkIF9fdXNlciAqKSBhZGRyMiwgZGF0YSk7CiAKLQkJaWYgKHJlcyA9PSBkYXRhKSB7Ci0JCQlwdF9zdWNjX3JldHVybihyZWdzLCAwKTsKLQkJCWdvdG8gb3V0X3RzazsKLQkJfQotCQkvKiBQYXJ0aWFsIHJlYWQgaXMgYW4gSU8gZmFpbHVyZSAqLwotCQlpZiAocmVzID49IDApCi0JCQlyZXMgPSAtRUlPOwotCQlwdF9lcnJvcl9yZXR1cm4ocmVncywgLXJlcyk7Ci0JCWdvdG8gb3V0X3RzazsKLQl9CisJCWlmIChyZXQgPT0gZGF0YSkKKwkJCXJldCA9IDA7CisJCWVsc2UgaWYgKHJldCA+PSAwKQorCQkJcmV0ID0gLUVJTzsKKwkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9XUklURVRFWFQ6Ci0JY2FzZSBQVFJBQ0VfV1JJVEVEQVRBOiB7Ci0JCWludCByZXMgPSBwdHJhY2Vfd3JpdGVkYXRhKGNoaWxkLCAodm9pZCBfX3VzZXIgKikgYWRkcjIsCi0JCQkJCSAgIGFkZHIsIGRhdGEpOworCWNhc2UgUFRSQUNFX1dSSVRFREFUQToKKwkJcmV0ID0gcHRyYWNlX3dyaXRlZGF0YShjaGlsZCwgKHZvaWQgX191c2VyICopIGFkZHIyLAorCQkJCSAgICAgICBhZGRyLCBkYXRhKTsKIAotCQlpZiAocmVzID09IGRhdGEpIHsKLQkJCXB0X3N1Y2NfcmV0dXJuKHJlZ3MsIDApOwotCQkJZ290byBvdXRfdHNrOwotCQl9Ci0JCS8qIFBhcnRpYWwgd3JpdGUgaXMgYW4gSU8gZmFpbHVyZSAqLwotCQlpZiAocmVzID49IDApCi0JCQlyZXMgPSAtRUlPOwotCQlwdF9lcnJvcl9yZXR1cm4ocmVncywgLXJlcyk7Ci0JCWdvdG8gb3V0X3RzazsKKwkJaWYgKHJldCA9PSBkYXRhKQorCQkJcmV0ID0gMDsKKwkJZWxzZSBpZiAocmV0ID49IDApCisJCQlyZXQgPSAtRUlPOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldCA9IHB0cmFjZV9yZXF1ZXN0KGNoaWxkLCByZXF1ZXN0LCBhZGRyLCBkYXRhKTsKKwkJYnJlYWs7CiAJfQogCi0JY2FzZSBQVFJBQ0VfU1lTQ0FMTDogLyogY29udGludWUgYW5kIHN0b3AgYXQgKHJldHVybiBmcm9tKSBzeXNjYWxsICovCi0JCWFkZHIgPSAxOwotCi0JY2FzZSBQVFJBQ0VfQ09OVDogeyAvKiByZXN0YXJ0IGFmdGVyIHNpZ25hbC4gKi8KLQkJaWYgKCF2YWxpZF9zaWduYWwoZGF0YSkpIHsKLQkJCXB0X2Vycm9yX3JldHVybihyZWdzLCBFSU8pOwotCQkJZ290byBvdXRfdHNrOwotCQl9Ci0KLQkJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1NZU0NBTEwpCi0JCQlzZXRfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU1lTQ0FMTF9UUkFDRSk7Ci0JCWVsc2UKLQkJCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOwotCi0JCWNoaWxkLT5leGl0X2NvZGUgPSBkYXRhOwotI2lmZGVmIERFQlVHX1BUUkFDRQotCQlwcmludGsoIkNPTlQ6ICVzIFslZF06IHNldCBleGl0X2NvZGUgPSAleCAlbHggJWx4XG4iLAotCQkJY2hpbGQtPmNvbW0sIGNoaWxkLT5waWQsIGNoaWxkLT5leGl0X2NvZGUsCi0JCQljaGlsZC0+dGhyZWFkLmtyZWdzLT5wYywKLQkJCWNoaWxkLT50aHJlYWQua3JlZ3MtPm5wYyk7Ci0jZW5kaWYKLQkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKLQkJcHRfc3VjY19yZXR1cm4ocmVncywgMCk7Ci0JCWdvdG8gb3V0X3RzazsKLQl9Ci0KLS8qCi0gKiBtYWtlIHRoZSBjaGlsZCBleGl0LiAgQmVzdCBJIGNhbiBkbyBpcyBzZW5kIGl0IGEgc2lna2lsbC4gCi0gKiBwZXJoYXBzIGl0IHNob3VsZCBiZSBwdXQgaW4gdGhlIHN0YXR1cyB0aGF0IGl0IHdhbnRzIHRvIAotICogZXhpdC4KLSAqLwotCWNhc2UgUFRSQUNFX0tJTEw6IHsKLQkJaWYgKGNoaWxkLT5leGl0X3N0YXRlID09IEVYSVRfWk9NQklFKSB7CS8qIGFscmVhZHkgZGVhZCAqLwotCQkJcHRfc3VjY19yZXR1cm4ocmVncywgMCk7Ci0JCQlnb3RvIG91dF90c2s7Ci0JCX0KLQkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKLQkJY2hpbGQtPmV4aXRfY29kZSA9IFNJR0tJTEw7Ci0JCXB0X3N1Y2NfcmV0dXJuKHJlZ3MsIDApOwotCQlnb3RvIG91dF90c2s7Ci0JfQotCi0JY2FzZSBQVFJBQ0VfU1VOREVUQUNIOiB7IC8qIGRldGFjaCBhIHByb2Nlc3MgdGhhdCB3YXMgYXR0YWNoZWQuICovCi0JCWludCBlcnIgPSBwdHJhY2VfZGV0YWNoKGNoaWxkLCBkYXRhKTsKLQkJaWYgKGVycikgewotCQkJcHRfZXJyb3JfcmV0dXJuKHJlZ3MsIEVJTyk7Ci0JCQlnb3RvIG91dF90c2s7Ci0JCX0KLQkJcHRfc3VjY19yZXR1cm4ocmVncywgMCk7Ci0JCWdvdG8gb3V0X3RzazsKLQl9Ci0KLQkvKiBQVFJBQ0VfRFVNUENPUkUgdW5zdXBwb3J0ZWQuLi4gKi8KLQotCWRlZmF1bHQ6IHsKLQkJaW50IGVyciA9IHB0cmFjZV9yZXF1ZXN0KGNoaWxkLCByZXF1ZXN0LCBhZGRyLCBkYXRhKTsKLQkJaWYgKGVycikKLQkJCXB0X2Vycm9yX3JldHVybihyZWdzLCAtZXJyKTsKLQkJZWxzZQotCQkJcHRfc3VjY19yZXR1cm4ocmVncywgMCk7Ci0JCWdvdG8gb3V0X3RzazsKLQl9Ci0JfQotb3V0X3RzazoKLQlpZiAoY2hpbGQpCi0JCXB1dF90YXNrX3N0cnVjdChjaGlsZCk7Ci1vdXQ6Ci0JdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7CiB9CiAKIGFzbWxpbmthZ2Ugdm9pZCBzeXNjYWxsX3RyYWNlKHZvaWQpCiB7Ci0jaWZkZWYgREVCVUdfUFRSQUNFCi0JcHJpbnRrKCIlcyBbJWRdOiBzeXNjYWxsX3RyYWNlXG4iLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQpOwotI2VuZGlmCiAJaWYgKCF0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1RSQUNFKSkKIAkJcmV0dXJuOwogCWlmICghKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpKQogCQlyZXR1cm47Ci0JY3VycmVudC0+dGhyZWFkLmZsYWdzIF49IE1BR0lDX0NPTlNUQU5UOwogCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCB8ICgoY3VycmVudC0+cHRyYWNlICYgUFRfVFJBQ0VTWVNHT09EKQogCQkJCSA/IDB4ODAgOiAwKSk7CiAJLyoKQEAgLTU5MCwxMCArNDYxLDYgQEAKIAkgKiBmb3Igbm9ybWFsIHVzZS4gIHN0cmFjZSBvbmx5IGNvbnRpbnVlcyB3aXRoIGEgc2lnbmFsIGlmIHRoZQogCSAqIHN0b3BwaW5nIHNpZ25hbCBpcyBub3QgU0lHVFJBUC4gIC1icmwKIAkgKi8KLSNpZmRlZiBERUJVR19QVFJBQ0UKLQlwcmludGsoIiVzIFslZF06IHN5c2NhbGxfdHJhY2UgZXhpdD0gJXhcbiIsIGN1cnJlbnQtPmNvbW0sCi0JCWN1cnJlbnQtPnBpZCwgY3VycmVudC0+ZXhpdF9jb2RlKTsKLSNlbmRpZgogCWlmIChjdXJyZW50LT5leGl0X2NvZGUpIHsKIAkJc2VuZF9zaWcgKGN1cnJlbnQtPmV4aXRfY29kZSwgY3VycmVudCwgMSk7CiAJCWN1cnJlbnQtPmV4aXRfY29kZSA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXAuYwppbmRleCBkMDdiYzc0Li4zY2Y3OGYxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3NldHVwLmMKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KICNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8bGludXgvdXNlci5oPgotI2luY2x1ZGUgPGxpbnV4L2Eub3V0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NyZWVuX2luZm8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zcGFyY19rc3ltcy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3BhcmNfa3N5bXMuYwppbmRleCBlZjY0N2FjLi5jMTAyNWU1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zcGFyY19rc3ltcy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3NwYXJjX2tzeW1zLmMKQEAgLTUxLDcgKzUxLDYgQEAKICNpZmRlZiBDT05GSUdfUENJCiAjaW5jbHVkZSA8YXNtL2VidXMuaD4KICNlbmRpZgotI2luY2x1ZGUgPGFzbS9hLm91dC5oPgogI2luY2x1ZGUgPGFzbS9pby11bml0Lmg+CiAjaW5jbHVkZSA8YXNtL2J1Zy5oPgogCkBAIC0yMTQsOCArMjEzLDYgQEAKIEVYUE9SVF9TWU1CT0woc3ZyNF9zZXRjb250ZXh0KTsKIEVYUE9SVF9TWU1CT0woc3ZyNF9nZXRjb250ZXh0KTsKIAotRVhQT1JUX1NZTUJPTChkdW1wX3RocmVhZCk7Ci0KIC8qIHByb20gc3ltYm9scyAqLwogRVhQT1JUX1NZTUJPTChpZHByb20pOwogRVhQT1JUX1NZTUJPTChwcm9tX3Jvb3Rfbm9kZSk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2luaXQuYyBiL2FyY2gvc3BhcmMvbW0vaW5pdC5jCmluZGV4IGExYmVmMDcuLmI4OTgzN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vaW5pdC5jCisrKyBiL2FyY2gvc3BhcmMvbW0vaW5pdC5jCkBAIC0yNTksNyArMjU5LDcgQEAKIAlpZiAoaW5pdHJkX3N0YXJ0KSB7CiAJCS8qIFJlc2VydmUgdGhlIGluaXRyZCBpbWFnZSBhcmVhLiAqLwogCQlzaXplID0gaW5pdHJkX2VuZCAtIGluaXRyZF9zdGFydDsKLQkJcmVzZXJ2ZV9ib290bWVtKGluaXRyZF9zdGFydCwgc2l6ZSk7CisJCXJlc2VydmVfYm9vdG1lbShpbml0cmRfc3RhcnQsIHNpemUsIEJPT1RNRU1fREVGQVVMVCk7CiAJCSpwYWdlc19hdmFpbCAtPSBQQUdFX0FMSUdOKHNpemUpID4+IFBBR0VfU0hJRlQ7CiAKIAkJaW5pdHJkX3N0YXJ0ID0gKGluaXRyZF9zdGFydCAtIHBoeXNfYmFzZSkgKyBQQUdFX09GRlNFVDsKQEAgLTI2OCw3ICsyNjgsNyBAQAogI2VuZGlmCiAJLyogUmVzZXJ2ZSB0aGUga2VybmVsIHRleHQvZGF0YS9ic3MuICovCiAJc2l6ZSA9IChzdGFydF9wZm4gPDwgUEFHRV9TSElGVCkgLSBwaHlzX2Jhc2U7Ci0JcmVzZXJ2ZV9ib290bWVtKHBoeXNfYmFzZSwgc2l6ZSk7CisJcmVzZXJ2ZV9ib290bWVtKHBoeXNfYmFzZSwgc2l6ZSwgQk9PVE1FTV9ERUZBVUxUKTsKIAkqcGFnZXNfYXZhaWwgLT0gUEFHRV9BTElHTihzaXplKSA+PiBQQUdFX1NISUZUOwogCiAJLyogUmVzZXJ2ZSB0aGUgYm9vdG1lbSBtYXAuICAgV2UgZG8gbm90IGFjY291bnQgZm9yIGl0CkBAIC0yNzYsNyArMjc2LDcgQEAKIAkgKiBpbiBmcmVlX2FsbF9ib290bWVtLgogCSAqLwogCXNpemUgPSBib290bWFwX3NpemU7Ci0JcmVzZXJ2ZV9ib290bWVtKChib290bWFwX3BmbiA8PCBQQUdFX1NISUZUKSwgc2l6ZSk7CisJcmVzZXJ2ZV9ib290bWVtKChib290bWFwX3BmbiA8PCBQQUdFX1NISUZUKSwgc2l6ZSwgQk9PVE1FTV9ERUZBVUxUKTsKIAkqcGFnZXNfYXZhaWwgLT0gUEFHRV9BTElHTihzaXplKSA+PiBQQUdFX1NISUZUOwogCiAJcmV0dXJuIG1heF9wZm47CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2xvYWRtbXUuYyBiL2FyY2gvc3BhcmMvbW0vbG9hZG1tdS5jCmluZGV4IDM2YjRkMjQuLjJkOWNkNjUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vbG9hZG1tdS5jCisrKyBiL2FyY2gvc3BhcmMvbW0vbG9hZG1tdS5jCkBAIC0xNCw3ICsxNCw2IEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vYS5vdXQuaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9zcm1tdS5jIGIvYXJjaC9zcGFyYy9tbS9zcm1tdS5jCmluZGV4IDE3YjQ4NWYuLjIzZDMyOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vc3JtbXUuYworKysgYi9hcmNoL3NwYXJjL21tL3NybW11LmMKQEAgLTM0LDcgKzM0LDYgQEAKICNpbmNsdWRlIDxhc20vc2J1cy5oPgogI2luY2x1ZGUgPGFzbS9hc2kuaD4KICNpbmNsdWRlIDxhc20vbXNpLmg+Ci0jaW5jbHVkZSA8YXNtL2Eub3V0Lmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLXVuaXQuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgpAQCAtNDkwLDE0ICs0ODksMTcgQEAKIAlyZXR1cm4gKHB0ZV90ICopc3JtbXVfZ2V0X25vY2FjaGUoUFRFX1NJWkUsIFBURV9TSVpFKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwYWdlICoKK3N0YXRpYyBwZ3RhYmxlX3QKIHNybW11X3B0ZV9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKIAl1bnNpZ25lZCBsb25nIHB0ZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAogCWlmICgocHRlID0gKHVuc2lnbmVkIGxvbmcpc3JtbXVfcHRlX2FsbG9jX29uZV9rZXJuZWwobW0sIGFkZHJlc3MpKSA9PSAwKQogCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gcGZuX3RvX3BhZ2UoIF9fbm9jYWNoZV9wYShwdGUpID4+IFBBR0VfU0hJRlQgKTsKKwlwYWdlID0gcGZuX3RvX3BhZ2UoIF9fbm9jYWNoZV9wYShwdGUpID4+IFBBR0VfU0hJRlQgKTsKKwlwZ3RhYmxlX3BhZ2VfY3RvcihwYWdlKTsKKwlyZXR1cm4gcGFnZTsKIH0KIAogc3RhdGljIHZvaWQgc3JtbXVfZnJlZV9wdGVfZmFzdChwdGVfdCAqcHRlKQpAQCAtNTA1LDEwICs1MDcsMTEgQEAKIAlzcm1tdV9mcmVlX25vY2FjaGUoKHVuc2lnbmVkIGxvbmcpcHRlLCBQVEVfU0laRSk7CiB9CiAKLXN0YXRpYyB2b2lkIHNybW11X3B0ZV9mcmVlKHN0cnVjdCBwYWdlICpwdGUpCitzdGF0aWMgdm9pZCBzcm1tdV9wdGVfZnJlZShwZ3RhYmxlX3QgcHRlKQogewogCXVuc2lnbmVkIGxvbmcgcDsKIAorCXBndGFibGVfcGFnZV9kdG9yKHB0ZSk7CiAJcCA9ICh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwdGUpOwkvKiBDYWNoZWQgYWRkcmVzcyAoZm9yIHRlc3QpICovCiAJaWYgKHAgPT0gMCkKIAkJQlVHKCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL3N1bjRjLmMgYi9hcmNoL3NwYXJjL21tL3N1bjRjLmMKaW5kZXggMDcyOTMwNS4uYzA0NDJlOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9zdW40Yy5jCisrKyBiL2FyY2gvc3BhcmMvbW0vc3VuNGMuYwpAQCAtMTk0NywxMiArMTk0NywxNyBAQAogCXJldHVybiBwdGU7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqc3VuNGNfcHRlX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQorc3RhdGljIHBndGFibGVfdCBzdW40Y19wdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7Ci0JcHRlX3QgKnB0ZSA9IHN1bjRjX3B0ZV9hbGxvY19vbmVfa2VybmVsKG1tLCBhZGRyZXNzKTsKKwlwdGVfdCAqcHRlOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJcHRlID0gc3VuNGNfcHRlX2FsbG9jX29uZV9rZXJuZWwobW0sIGFkZHJlc3MpOwogCWlmIChwdGUgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHZpcnRfdG9fcGFnZShwdGUpOworCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UocHRlKTsKKwlwZ3RhYmxlX3BhZ2VfY3RvcihwYWdlKTsKKwlyZXR1cm4gcGFnZTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHN1bjRjX2ZyZWVfcHRlX2Zhc3QocHRlX3QgKnB0ZSkKQEAgLTE5NjIsOCArMTk2Nyw5IEBACiAJcGd0YWJsZV9jYWNoZV9zaXplKys7CiB9CiAKLXN0YXRpYyB2b2lkIHN1bjRjX3B0ZV9mcmVlKHN0cnVjdCBwYWdlICpwdGUpCitzdGF0aWMgdm9pZCBzdW40Y19wdGVfZnJlZShwZ3RhYmxlX3QgcHRlKQogeworCXBndGFibGVfcGFnZV9kdG9yKHB0ZSk7CiAJc3VuNGNfZnJlZV9wdGVfZmFzdChwYWdlX2FkZHJlc3MocHRlKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9LY29uZmlnIGIvYXJjaC9zcGFyYzY0L0tjb25maWcKaW5kZXggYThjNjM2Ni4uYjgxMGYyYiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L0tjb25maWcKKysrIGIvYXJjaC9zcGFyYzY0L0tjb25maWcKQEAgLTgxLDYgKzgxLDkgQEAKIAlib29sCiAJZGVmX2Jvb2wgeQogCitjb25maWcgQVJDSF9TVVBQT1JUU19BT1VUCisJZGVmX2Jvb2wgeQorCiBjaG9pY2UKIAlwcm9tcHQgIktlcm5lbCBwYWdlIHNpemUiCiAJZGVmYXVsdCBTUEFSQzY0X1BBR0VfU0laRV84S0IKQEAgLTM4MCwxNyArMzgzLDExIEBACiAJYm9vbAogCWRlcGVuZHMgb24gU1BBUkMzMl9DT01QQVQKIAlkZWZhdWx0IHkKLQotY29uZmlnIEJJTkZNVF9FTEYzMgotCWJvb2wgIktlcm5lbCBzdXBwb3J0IGZvciAzMi1iaXQgRUxGIGJpbmFyaWVzIgotCWRlcGVuZHMgb24gU1BBUkMzMl9DT01QQVQKLQloZWxwCi0JICBUaGlzIGFsbG93cyB5b3UgdG8gcnVuIDMyLWJpdCBMaW51eC9FTEYgYmluYXJpZXMgb24geW91ciBVbHRyYS4KLQkgIEV2ZXJ5Ym9keSB3YW50cyB0aGlzOyBzYXkgWS4KKwlzZWxlY3QgQ09NUEFUX0JJTkZNVF9FTEYKIAogY29uZmlnIEJJTkZNVF9BT1VUMzIKIAlib29sICJLZXJuZWwgc3VwcG9ydCBmb3IgMzItYml0IChpZS4gU3VuT1MpIGEub3V0IGJpbmFyaWVzIgotCWRlcGVuZHMgb24gU1BBUkMzMl9DT01QQVQKKwlkZXBlbmRzIG9uIFNQQVJDMzJfQ09NUEFUICYmIEFSQ0hfU1VQUE9SVFNfQU9VVAogCWhlbHAKIAkgIFRoaXMgYWxsb3dzIHlvdSB0byBydW4gMzItYml0IGEub3V0IGZvcm1hdCBiaW5hcmllcyBvbiB5b3VyIFVsdHJhLgogCSAgSWYgeW91IHdhbnQgdG8gcnVuIFN1bk9TIGJpbmFyaWVzIChzZWUgU3VuT1MgYmluYXJ5IGVtdWxhdGlvbiBiZWxvdykKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3NwYXJjNjQva2VybmVsL01ha2VmaWxlCmluZGV4IDRiNzhiMjQuLjFiZjViMTggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9NYWtlZmlsZQpAQCAtMjEsNyArMjEsNiBAQAogb2JqLSQoQ09ORklHX1BDSV9NU0kpCSs9IHBjaV9tc2kubwogb2JqLSQoQ09ORklHX1NNUCkJICs9IHNtcC5vIHRyYW1wb2xpbmUubyBodnRyYW1wLm8KIG9iai0kKENPTkZJR19TUEFSQzMyX0NPTVBBVCkgKz0gc3lzMzIubyBzeXNfc3BhcmMzMi5vIHNpZ25hbDMyLm8KLW9iai0kKENPTkZJR19CSU5GTVRfRUxGMzIpICs9IGJpbmZtdF9lbGYzMi5vCiBvYmotJChDT05GSUdfQklORk1UX0FPVVQzMikgKz0gYmluZm10X2FvdXQzMi5vCiBvYmotJChDT05GSUdfTU9EVUxFUykgKz0gbW9kdWxlLm8KIG9iai0kKENPTkZJR19VUzNfRlJFUSkgKz0gdXMzX2NwdWZyZXEubwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9iaW5mbXRfYW91dDMyLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2JpbmZtdF9hb3V0MzIuYwppbmRleCA5MmMxYjM2Li45ODc3ZjJkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2JpbmZtdF9hb3V0MzIuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2JpbmZtdF9hb3V0MzIuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vYS5vdXQtY29yZS5oPgogCiBzdGF0aWMgaW50IGxvYWRfYW91dDMyX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICosIHN0cnVjdCBwdF9yZWdzICogcmVncyk7CiBzdGF0aWMgaW50IGxvYWRfYW91dDMyX2xpYnJhcnkoc3RydWN0IGZpbGUqKTsKQEAgLTEwMSw3ICsxMDIsNyBAQAogCWN1cnJlbnQtPmZsYWdzIHw9IFBGX0RVTVBDT1JFOwogICAgICAgIAlzdHJuY3B5KGR1bXAudV9jb21tLCBjdXJyZW50LT5jb21tLCBzaXplb2YoZHVtcC51X2NvbW0pKTsKIAlkdW1wLnNpZ25hbCA9IHNpZ25yOwotCWR1bXBfdGhyZWFkKHJlZ3MsICZkdW1wKTsKKwlhb3V0X2R1bXBfdGhyZWFkKHJlZ3MsICZkdW1wKTsKIAogLyogSWYgdGhlIHNpemUgb2YgdGhlIGR1bXAgZmlsZSBleGNlZWRzIHRoZSBybGltaXQsIHRoZW4gc2VlIHdoYXQgd291bGQgaGFwcGVuCiAgICBpZiB3ZSB3cm90ZSB0aGUgc3RhY2ssIGJ1dCBub3QgdGhlIGRhdGEgYXJlYS4gICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2JpbmZtdF9lbGYzMi5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9iaW5mbXRfZWxmMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU4N2EyOS4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2JpbmZtdF9lbGYzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qCi0gKiBiaW5mbXRfZWxmMzIuYzogU3VwcG9ydCAzMi1iaXQgU3BhcmMgRUxGIGJpbmFyaWVzIG9uIFVsdHJhLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBEYXZpZCBTLiBNaWxsZXIJKGRhdmVtQGRhdmVtbG9mdC5uZXQpCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggSmFrdWIgSmVsaW5lawkoampAdWx0cmEubGludXguY3opCi0gKi8KLQotI2RlZmluZSBFTEZfQVJDSAkJRU1fU1BBUkMKLSNkZWZpbmUgRUxGX0NMQVNTCQlFTEZDTEFTUzMyCi0jZGVmaW5lIEVMRl9EQVRBCQlFTEZEQVRBMk1TQjsKLQotLyogRm9yIHRoZSBtb3N0IHBhcnQgd2UgcHJlc2VudCBjb2RlIGR1bXBzIGluIHRoZSBmb3JtYXQKLSAqIFNvbGFyaXMgZG9lcy4KLSAqLwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgZWxmX2dyZWdfdDsKLSNkZWZpbmUgRUxGX05HUkVHIDM4Ci10eXBlZGVmIGVsZl9ncmVnX3QgZWxmX2dyZWdzZXRfdFtFTEZfTkdSRUddOwotCi0vKiBGb3JtYXQgaXM6Ci0gKiAJRzAgLS0+IEc3Ci0gKglPMCAtLT4gTzcKLSAqCUwwIC0tPiBMNwotICoJSTAgLS0+IEk3Ci0gKglQU1IsIFBDLCBuUEMsIFksIFdJTSwgVEJSCi0gKi8KLSNpbmNsdWRlIDxhc20vcHNyY29tcGF0Lmg+Ci0jZGVmaW5lIEVMRl9DT1JFX0NPUFlfUkVHUyhfX2VsZl9yZWdzLCBfX3B0X3JlZ3MpCVwKLWRvIHsJdW5zaWduZWQgaW50ICpkZXN0ID0gJihfX2VsZl9yZWdzWzBdKTsJCVwKLQlzdHJ1Y3QgcHRfcmVncyAqc3JjID0gKF9fcHRfcmVncyk7CQlcCi0JdW5zaWduZWQgaW50IF9fdXNlciAqc3A7CQkJXAotCWludCBpOwkJCQkJCVwKLQlmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKQkJCQlcCi0JCWRlc3RbaV0gPSAodW5zaWduZWQgaW50KSBzcmMtPnVfcmVnc1tpXTtcCi0JLyogRG9uJ3QgdHJ5IHRoaXMgYXQgaG9tZSBraWRzLi4uICovCQlcCi0Jc3AgPSAodW5zaWduZWQgaW50IF9fdXNlciAqKSAoc3JjLT51X3JlZ3NbMTRdICYJXAotCQkweDAwMDAwMDAwZmZmZmZmZmMpOwkJCVwKLQlmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKQkJCQlcCi0JCV9fZ2V0X3VzZXIoZGVzdFtpKzE2XSwgJnNwW2ldKTsJCVwKLQlkZXN0WzMyXSA9IHRzdGF0ZV90b19wc3Ioc3JjLT50c3RhdGUpOwkJXAotCWRlc3RbMzNdID0gKHVuc2lnbmVkIGludCkgc3JjLT50cGM7CQlcCi0JZGVzdFszNF0gPSAodW5zaWduZWQgaW50KSBzcmMtPnRucGM7CQlcCi0JZGVzdFszNV0gPSBzcmMtPnk7CQkJCVwKLQlkZXN0WzM2XSA9IGRlc3RbMzddID0gMDsgLyogWFhYICovCQlcCi19IHdoaWxlKDApOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5pb24gewotCQl1bnNpZ25lZCBpbnQJcHJfcmVnc1szMl07Ci0JCXVuc2lnbmVkIGxvbmcJcHJfZHJlZ3NbMTZdOwotCX0gcHJfZnI7Ci0JdW5zaWduZWQgaW50IF9fdW51c2VkOwotCXVuc2lnbmVkIGludAlwcl9mc3I7Ci0JdW5zaWduZWQgY2hhcglwcl9xY250OwotCXVuc2lnbmVkIGNoYXIJcHJfcV9lbnRyeXNpemU7Ci0JdW5zaWduZWQgY2hhcglwcl9lbjsKLQl1bnNpZ25lZCBpbnQJcHJfcVs2NF07Ci19IGVsZl9mcHJlZ3NldF90OwotCi0vKiBVbHRyYVNwYXJjIGV4dGVuc2lvbnMuICBTdGlsbCB1bnVzZWQsIGJ1dCB3aWxsIGJlIGV2ZW50dWFsbHkuICAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGludCBwcl90eXBlOwotCXVuc2lnbmVkIGludCBwcl9hbGlnbjsKLQl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQl1bmlvbiB7Ci0JCQkJdW5zaWduZWQgaW50CXByX3JlZ3NbMzJdOwotCQkJCXVuc2lnbmVkIGxvbmcJcHJfZHJlZ3NbMTZdOwotCQkJCWxvbmcgZG91YmxlCXByX3FyZWdzWzhdOwotCQkJfSBwcl94ZnI7Ci0JCX0gcHJfdjhwOwotCQl1bnNpZ25lZCBpbnQJcHJfeGZzcjsKLQkJdW5zaWduZWQgaW50CXByX2ZwcnM7Ci0JCXVuc2lnbmVkIGludAlwcl94Z1s4XTsKLQkJdW5zaWduZWQgaW50CXByX3hvWzhdOwotCQl1bnNpZ25lZCBsb25nCXByX3RzdGF0ZTsKLQkJdW5zaWduZWQgaW50CXByX2ZpbGxlcls4XTsKLQl9IHByX3VuOwotfSBlbGZfeHJlZ3NldF90OwotCi0jZGVmaW5lIGVsZl9jaGVja19hcmNoKHgpCSgoKHgpLT5lX21hY2hpbmUgPT0gRU1fU1BBUkMpIHx8ICgoeCktPmVfbWFjaGluZSA9PSBFTV9TUEFSQzMyUExVUykpCi0KLSNkZWZpbmUgRUxGX0VUX0RZTl9CQVNFICAgICAgICAgMHg3MDAwMDAwMAotCi0KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZWxmY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgotCi0jZGVmaW5lIGVsZl9wcnN0YXR1cyBlbGZfcHJzdGF0dXMzMgotc3RydWN0IGVsZl9wcnN0YXR1czMyCi17Ci0Jc3RydWN0IGVsZl9zaWdpbmZvIHByX2luZm87CS8qIEluZm8gYXNzb2NpYXRlZCB3aXRoIHNpZ25hbCAqLwotCXNob3J0CXByX2N1cnNpZzsJCS8qIEN1cnJlbnQgc2lnbmFsICovCi0JdW5zaWduZWQgaW50IHByX3NpZ3BlbmQ7CS8qIFNldCBvZiBwZW5kaW5nIHNpZ25hbHMgKi8KLQl1bnNpZ25lZCBpbnQgcHJfc2lnaG9sZDsJLyogU2V0IG9mIGhlbGQgc2lnbmFscyAqLwotCXBpZF90CXByX3BpZDsKLQlwaWRfdAlwcl9wcGlkOwotCXBpZF90CXByX3BncnA7Ci0JcGlkX3QJcHJfc2lkOwotCXN0cnVjdCBjb21wYXRfdGltZXZhbCBwcl91dGltZTsJLyogVXNlciB0aW1lICovCi0Jc3RydWN0IGNvbXBhdF90aW1ldmFsIHByX3N0aW1lOwkvKiBTeXN0ZW0gdGltZSAqLwotCXN0cnVjdCBjb21wYXRfdGltZXZhbCBwcl9jdXRpbWU7CS8qIEN1bXVsYXRpdmUgdXNlciB0aW1lICovCi0Jc3RydWN0IGNvbXBhdF90aW1ldmFsIHByX2NzdGltZTsJLyogQ3VtdWxhdGl2ZSBzeXN0ZW0gdGltZSAqLwotCWVsZl9ncmVnc2V0X3QgcHJfcmVnOwkvKiBHUCByZWdpc3RlcnMgKi8KLQlpbnQgcHJfZnB2YWxpZDsJCS8qIFRydWUgaWYgbWF0aCBjby1wcm9jZXNzb3IgYmVpbmcgdXNlZC4gICovCi19OwotCi0jZGVmaW5lIGVsZl9wcnBzaW5mbyBlbGZfcHJwc2luZm8zMgotc3RydWN0IGVsZl9wcnBzaW5mbzMyCi17Ci0JY2hhcglwcl9zdGF0ZTsJLyogbnVtZXJpYyBwcm9jZXNzIHN0YXRlICovCi0JY2hhcglwcl9zbmFtZTsJLyogY2hhciBmb3IgcHJfc3RhdGUgKi8KLQljaGFyCXByX3pvbWI7CS8qIHpvbWJpZSAqLwotCWNoYXIJcHJfbmljZTsJLyogbmljZSB2YWwgKi8KLQl1bnNpZ25lZCBpbnQgcHJfZmxhZzsJLyogZmxhZ3MgKi8KLQl1MTYJcHJfdWlkOwotCXUxNglwcl9naWQ7Ci0JcGlkX3QJcHJfcGlkLCBwcl9wcGlkLCBwcl9wZ3JwLCBwcl9zaWQ7Ci0JLyogTG90cyBtaXNzaW5nICovCi0JY2hhcglwcl9mbmFtZVsxNl07CS8qIGZpbGVuYW1lIG9mIGV4ZWN1dGFibGUgKi8KLQljaGFyCXByX3BzYXJnc1tFTEZfUFJBUkdTWl07CS8qIGluaXRpYWwgcGFydCBvZiBhcmcgbGlzdCAqLwotfTsKLQotI2luY2x1ZGUgPGxpbnV4L2hpZ2h1aWQuaD4KLQotI3VuZGVmIE5FV19UT19PTERfVUlECi0jdW5kZWYgTkVXX1RPX09MRF9HSUQKLSNkZWZpbmUgTkVXX1RPX09MRF9VSUQodWlkKSAoKHVpZCkgPiA2NTUzNSkgPyAodTE2KW92ZXJmbG93dWlkIDogKHUxNikodWlkKQotI2RlZmluZSBORVdfVE9fT0xEX0dJRChnaWQpICgoZ2lkKSA+IDY1NTM1KSA/ICh1MTYpb3ZlcmZsb3dnaWQgOiAodTE2KShnaWQpCi0KLSNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0KLSN1bmRlZiBjcHV0aW1lX3RvX3RpbWV2YWwKLSNkZWZpbmUgY3B1dGltZV90b190aW1ldmFsIGNwdXRpbWVfdG9fY29tcGF0X3RpbWV2YWwKLXN0YXRpYyBpbmxpbmUgdm9pZAotY3B1dGltZV90b19jb21wYXRfdGltZXZhbChjb25zdCBjcHV0aW1lX3QgY3B1dGltZSwgc3RydWN0IGNvbXBhdF90aW1ldmFsICp2YWx1ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGppZmZpZXMgPSBjcHV0aW1lX3RvX2ppZmZpZXMoY3B1dGltZSk7Ci0JdmFsdWUtPnR2X3VzZWMgPSAoamlmZmllcyAlIEhaKSAqICgxMDAwMDAwTCAvIEhaKTsKLQl2YWx1ZS0+dHZfc2VjID0gamlmZmllcyAvIEhaOwotfQotCi0jdW5kZWYgc3RhcnRfdGhyZWFkCi0jZGVmaW5lIHN0YXJ0X3RocmVhZCBzdGFydF90aHJlYWQzMgotI2RlZmluZSBpbml0X2VsZl9iaW5mbXQgaW5pdF9lbGYzMl9iaW5mbXQKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJCaW5hcnkgZm9ybWF0IGxvYWRlciBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIDMyYml0IFNwYXJjTGludXggYmluYXJpZXMgb24gdGhlIFVsdHJhIik7Ci1NT0RVTEVfQVVUSE9SKCJFcmljIFlvdW5nZGFsZSwgRGF2aWQgUy4gTWlsbGVyLCBKYWt1YiBKZWxpbmVrIik7Ci0KLSN1bmRlZiBNT0RVTEVfREVTQ1JJUFRJT04KLSN1bmRlZiBNT0RVTEVfQVVUSE9SCi0KLSNpbmNsdWRlIDxhc20vYS5vdXQuaD4KLQotI3VuZGVmIFRBU0tfU0laRQotI2RlZmluZSBUQVNLX1NJWkUgU1RBQ0tfVE9QMzIKLQotI2luY2x1ZGUgIi4uLy4uLy4uL2ZzL2JpbmZtdF9lbGYuYyIKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvZW50cnkuUwppbmRleCBlYTI1N2U4Li42YmU0ZDJkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9lbnRyeS5TCkBAIC0xNDc3LDEwICsxNDc3LDYgQEAKIAkJIGFkZAkJJW83LCAxZi0uLTQsICVvNwogCQlub3AKICNlbmRpZgotc3lzX3B0cmFjZToJYWRkCQklc3AsIFBUUkVHU19PRkYsICVvMAotCQljYWxsCQlkb19wdHJhY2UKLQkJIGFkZAkJJW83LCAxZi0uLTQsICVvNwotCQlub3AKIAkJLmFsaWduCQkzMgogMToJCWxkeAkJWyVjdXJwdHIgKyBUSV9GTEFHU10sICVsNQogCQlhbmRjYwkJJWw1LCAoX1RJRl9TWVNDQUxMX1RSQUNFfF9USUZfU0VDQ09NUHxfVElGX1NZU0NBTExfQVVESVQpLCAlZzAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaGVhZC5TIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9oZWFkLlMKaW5kZXggYzQxNDdhZC4uNDRiMTA1YyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9oZWFkLlMKQEAgLTYzMiwxMSArNjMyLDM2IEBACiAJLyogTm90IHJlYWNoZWQuLi4gKi8KIAogMToKKwkvKiBJZiB3ZSBib290IG9uIGEgbm9uLXplcm8gY3B1LCBhbGwgb2YgdGhlIHBlci1jcHUKKwkgKiB2YXJpYWJsZSByZWZlcmVuY2VzIHdlIG1ha2UgYmVmb3JlIHNldHRpbmcgdXAgdGhlCisJICogcGVyLWNwdSBhcmVhcyB3aWxsIHVzZSBhIGJvZ3VzIG9mZnNldC4gIFB1dCBhCisJICogY29tcGVuc2F0aW5nIGZhY3RvciBpbnRvIF9fcGVyX2NwdV9iYXNlIHRvIGhhbmRsZQorCSAqIHRoaXMgY2xlYW5seS4KKwkgKgorCSAqIFdoYXQgdGhlIHBlci1jcHUgY29kZSBjYWxjdWxhdGVzIGlzOgorCSAqCisJICoJX19wZXJfY3B1X2Jhc2UgKyAoY3B1IDw8IF9fcGVyX2NwdV9zaGlmdCkKKwkgKgorCSAqIFRoZXNlIHR3byB2YXJpYWJsZXMgYXJlIHplcm8gaW5pdGlhbGx5LCBzbyB0bworCSAqIG1ha2UgaXQgYWxsIGNhbmNlbCBvdXQgdG8gemVybyB3ZSBuZWVkIHRvIHB1dAorCSAqICIwIC0gKGNwdSA8PCAwKSIgaW50byBfX3Blcl9jcHVfYmFzZSBzbyB0aGF0IHRoZQorCSAqIGFib3ZlIGZvcm11bGEgZXZhbHVhdGVzIHRvIHplcm8uCisJICoKKwkgKiBXZSBjYW5ub3QgZXZlbiBwZXJmb3JtIGEgcHJpbnRrKCkgdW50aWwgdGhpcyBzdHVmZgorCSAqIGlzIHNldHVwIGFzIHRoYXQgY2FsbHMgY3B1X2Nsb2NrKCkgd2hpY2ggdXNlcworCSAqIHBlci1jcHUgdmFyaWFibGVzLgorCSAqLworCXN1YgklZzAsICVvMCwgJW8xCisJc2V0aGkJJWhpKF9fcGVyX2NwdV9iYXNlKSwgJW8yCisJc3R4CSVvMSwgWyVvMiArICVsbyhfX3Blcl9jcHVfYmFzZSldCiAjZWxzZQogCW1vdgkwLCAlbzAKICNlbmRpZgogCXN0aAklbzAsIFslZzYgKyBUSV9DUFVdCiAKKwljYWxsCXByb21faW5pdF9yZXBvcnQKKwkgbm9wCisKIAkvKiBPZmYgd2UgZ28uLi4uICovCiAJY2FsbAlzdGFydF9rZXJuZWwKIAkgbm9wCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2lycS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9pcnEuYwppbmRleCAzMDQzMWJkLi41ZWMwNmM4IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2lycS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXJxLmMKQEAgLTUyMiw3ICs1MjIsNyBAQAogCS5zZXRfYWZmaW5pdHkJPSBzdW40dl92aXJ0X3NldF9hZmZpbml0eSwKIH07CiAKLXN0YXRpYyB2b2lkIGZhc3RjYWxsIHByZV9mbG93X2hhbmRsZXIodW5zaWduZWQgaW50IHZpcnRfaXJxLAorc3RhdGljIHZvaWQgcHJlX2Zsb3dfaGFuZGxlcih1bnNpZ25lZCBpbnQgdmlydF9pcnEsCiAJCQkJICAgICAgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCXN0cnVjdCBpcnFfaGFuZGxlcl9kYXRhICpkYXRhID0gZ2V0X2lycV9jaGlwX2RhdGEodmlydF9pcnEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYwppbmRleCBjYTdjZGZkLi4xYjIzNzkxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Byb2Nlc3MuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC91c2VyLmg+Ci0jaW5jbHVkZSA8bGludXgvYS5vdXQuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgpAQCAtNzI1LDE3ICs3MjQsNiBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLS8qCi0gKiBmaWxsIGluIHRoZSB1c2VyIHN0cnVjdHVyZSBmb3IgYSBjb3JlIGR1bXAuLgotICovCi12b2lkIGR1bXBfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICogcmVncywgc3RydWN0IHVzZXIgKiBkdW1wKQotewotCS8qIE9ubHkgc2hvdWxkIGJlIHVzZWQgZm9yIFN1bk9TIGFuZCBhbmNpZW50IGEub3V0Ci0JICogU3BhcmNMaW51eCBiaW5hcmllcy4uLiAgTm90IHdvcnRoIGltcGxlbWVudGluZy4KLQkgKi8KLQltZW1zZXQoZHVtcCwgMCwgc2l6ZW9mKHN0cnVjdCB1c2VyKSk7Ci19Ci0KIHR5cGVkZWYgc3RydWN0IHsKIAl1bmlvbiB7CiAJCXVuc2lnbmVkIGludAlwcl9yZWdzWzMyXTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3B0cmFjZS5jCmluZGV4IDgxMTExYTEuLjlhMWJhMWYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wdHJhY2UuYwpAQCAtMSw2ICsxLDYgQEAKIC8qIHB0cmFjZS5jOiBTcGFyYyBwcm9jZXNzIHRyYWNpbmcgc3VwcG9ydC4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwZnMucnV0Z2Vycy5lZHUpCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDIwMDggRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQogICogQ29weXJpZ2h0IChDKSAxOTk3IEpha3ViIEplbGluZWsgKGpqQHN1bnNpdGUubWZmLmN1bmkuY3opCiAgKgogICogQmFzZWQgdXBvbiBjb2RlIHdyaXR0ZW4gYnkgUm9zcyBCaXJvLCBMaW51cyBUb3J2YWxkcywgQm9iIE1hbnNvbiwKQEAgLTIyLDYgKzIyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9zZWNjb21wLmg+CiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdzZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KIAogI2luY2x1ZGUgPGFzbS9hc2kuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpAQCAtMzMsNzAgKzM2LDcgQEAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9jcHVkYXRhLmg+CiAKLS8qIFJldHVybmluZyBmcm9tIHB0cmFjZSBpcyBhIGJpdCB0cmlja3kgYmVjYXVzZSB0aGUgc3lzY2FsbCByZXR1cm4KLSAqIGxvdyBsZXZlbCBjb2RlIGFzc3VtZXMgYW55IHZhbHVlIHJldHVybmVkIHdoaWNoIGlzIG5lZ2F0aXZlIGFuZAotICogaXMgYSB2YWxpZCBlcnJubyB3aWxsIG1lYW4gc2V0dGluZyB0aGUgY29uZGl0aW9uIGNvZGVzIHRvIGluZGljYXRlCi0gKiBhbiBlcnJvciByZXR1cm4uICBUaGlzIGRvZXNuJ3Qgd29yaywgc28gd2UgaGF2ZSB0aGlzIGhvb2suCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBwdF9lcnJvcl9yZXR1cm4oc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgZXJyb3IpCi17Ci0JcmVncy0+dV9yZWdzW1VSRUdfSTBdID0gZXJyb3I7Ci0JcmVncy0+dHN0YXRlIHw9IChUU1RBVEVfSUNBUlJZIHwgVFNUQVRFX1hDQVJSWSk7Ci0JcmVncy0+dHBjID0gcmVncy0+dG5wYzsKLQlyZWdzLT50bnBjICs9IDQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwdF9zdWNjX3JldHVybihzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyB2YWx1ZSkKLXsKLQlyZWdzLT51X3JlZ3NbVVJFR19JMF0gPSB2YWx1ZTsKLQlyZWdzLT50c3RhdGUgJj0gfihUU1RBVEVfSUNBUlJZIHwgVFNUQVRFX1hDQVJSWSk7Ci0JcmVncy0+dHBjID0gcmVncy0+dG5wYzsKLQlyZWdzLT50bnBjICs9IDQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotcHRfc3VjY19yZXR1cm5fbGludXgoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgdmFsdWUsIHZvaWQgX191c2VyICphZGRyKQotewotCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVCkpIHsKLQkJaWYgKHB1dF91c2VyKHZhbHVlLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSBhZGRyKSkgewotCQkJcHRfZXJyb3JfcmV0dXJuKHJlZ3MsIEVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAocHV0X3VzZXIodmFsdWUsIChsb25nIF9fdXNlciAqKSBhZGRyKSkgewotCQkJcHRfZXJyb3JfcmV0dXJuKHJlZ3MsIEVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JcmVncy0+dV9yZWdzW1VSRUdfSTBdID0gMDsKLQlyZWdzLT50c3RhdGUgJj0gfihUU1RBVEVfSUNBUlJZIHwgVFNUQVRFX1hDQVJSWSk7Ci0JcmVncy0+dHBjID0gcmVncy0+dG5wYzsKLQlyZWdzLT50bnBjICs9IDQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wdF9vc19zdWNjX3JldHVybiAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkIF9fdXNlciAqYWRkcikKLXsKLQlpZiAoY3VycmVudC0+cGVyc29uYWxpdHkgPT0gUEVSX1NVTk9TKQotCQlwdF9zdWNjX3JldHVybiAocmVncywgdmFsKTsKLQllbHNlCi0JCXB0X3N1Y2NfcmV0dXJuX2xpbnV4IChyZWdzLCB2YWwsIGFkZHIpOwotfQotCiAvKiAjZGVmaW5lIEFMTE9XX0lOSVRfVFJBQ0lORyAqLwotLyogI2RlZmluZSBERUJVR19QVFJBQ0UgKi8KLQotI2lmZGVmIERFQlVHX1BUUkFDRQotY2hhciAqcHRfcnEgW10gPSB7Ci0JLyogMCAgKi8gIlRSQUNFTUUiLCAiUEVFS1RFWFQiLCAiUEVFS0RBVEEiLCAiUEVFS1VTUiIsCi0JLyogNCAgKi8gIlBPS0VURVhUIiwgIlBPS0VEQVRBIiwgIlBPS0VVU1IiLCAiQ09OVCIsCi0JLyogOCAgKi8gIktJTEwiLCAiU0lOR0xFU1RFUCIsICJTVU5BVFRBQ0giLCAiU1VOREVUQUNIIiwKLQkvKiAxMiAqLyAiR0VUUkVHUyIsICJTRVRSRUdTIiwgIkdFVEZQUkVHUyIsICJTRVRGUFJFR1MiLAotCS8qIDE2ICovICJSRUFEREFUQSIsICJXUklURURBVEEiLCAiUkVBRFRFWFQiLCAiV1JJVEVURVhUIiwKLQkvKiAyMCAqLyAiR0VURlBBUkVHUyIsICJTRVRGUEFSRUdTIiwgInVua25vd24iLCAidW5rbm93biIsCi0JLyogMjQgKi8gIlNZU0NBTEwiLCAiIgotfTsKLSNlbmRpZgogCiAvKgogICogQ2FsbGVkIGJ5IGtlcm5lbC9wdHJhY2UuYyB3aGVuIGRldGFjaGluZy4uCkBAIC0xNjcsNDgxICsxMDcsNzg0IEBACiAJfQogfQogCi1hc21saW5rYWdlIHZvaWQgZG9fcHRyYWNlKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorZW51bSBzcGFyY19yZWdzZXQgeworCVJFR1NFVF9HRU5FUkFMLAorCVJFR1NFVF9GUCwKK307CisKK3N0YXRpYyBpbnQgZ2VucmVnczY0X2dldChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhcmdldCwKKwkJCSBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXQgKnJlZ3NldCwKKwkJCSB1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCisJCQkgdm9pZCAqa2J1Ziwgdm9pZCBfX3VzZXIgKnVidWYpCiB7Ci0JaW50IHJlcXVlc3QgPSByZWdzLT51X3JlZ3NbVVJFR19JMF07Ci0JcGlkX3QgcGlkID0gcmVncy0+dV9yZWdzW1VSRUdfSTFdOwotCXVuc2lnbmVkIGxvbmcgYWRkciA9IHJlZ3MtPnVfcmVnc1tVUkVHX0kyXTsKLQl1bnNpZ25lZCBsb25nIGRhdGEgPSByZWdzLT51X3JlZ3NbVVJFR19JM107Ci0JdW5zaWduZWQgbG9uZyBhZGRyMiA9IHJlZ3MtPnVfcmVnc1tVUkVHX0k0XTsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkOworCWNvbnN0IHN0cnVjdCBwdF9yZWdzICpyZWdzID0gdGFza19wdF9yZWdzKHRhcmdldCk7CiAJaW50IHJldDsKIAotCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVCkpIHsKLQkJYWRkciAmPSAweGZmZmZmZmZmVUw7Ci0JCWRhdGEgJj0gMHhmZmZmZmZmZlVMOwotCQlhZGRyMiAmPSAweGZmZmZmZmZmVUw7Ci0JfQotCWxvY2tfa2VybmVsKCk7Ci0jaWZkZWYgREVCVUdfUFRSQUNFCi0JewotCQljaGFyICpzOworCWlmICh0YXJnZXQgPT0gY3VycmVudCkKKwkJZmx1c2h3X3VzZXIoKTsKIAotCQlpZiAoKHJlcXVlc3QgPj0gMCkgJiYgKHJlcXVlc3QgPD0gMjQpKQotCQkJcyA9IHB0X3JxIFtyZXF1ZXN0XTsKLQkJZWxzZQotCQkJcyA9ICJ1bmtub3duIjsKKwlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5b3V0KCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCSAgcmVncy0+dV9yZWdzLAorCQkJCSAgMCwgMTYgKiBzaXplb2YodTY0KSk7CisJaWYgKCFyZXQpIHsKKwkJdW5zaWduZWQgbG9uZyBfX3VzZXIgKnJlZ193aW5kb3cgPSAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikKKwkJCShyZWdzLT51X3JlZ3NbVVJFR19JNl0gKyBTVEFDS19CSUFTKTsKKwkJdW5zaWduZWQgbG9uZyB3aW5kb3dbMTZdOwogCi0JCWlmIChyZXF1ZXN0ID09IFBUUkFDRV9QT0tFREFUQSAmJiBkYXRhID09IDB4OTFkMDIwMDEpewotCQkJcHJpbnRrICgiZG9fcHRyYWNlOiBicmVha3BvaW50IHBpZD0lZCwgYWRkcj0lMDE2bHggYWRkcjI9JTAxNmx4XG4iLAotCQkJCXBpZCwgYWRkciwgYWRkcjIpOwotCQl9IGVsc2UgCi0JCQlwcmludGsoImRvX3B0cmFjZTogcnE9JXMoJWQpIHBpZD0lZCBhZGRyPSUwMTZseCBkYXRhPSUwMTZseCBhZGRyMj0lMDE2bHhcbiIsCi0JCQkgICAgICAgcywgcmVxdWVzdCwgcGlkLCBhZGRyLCBkYXRhLCBhZGRyMik7Ci0JfQotI2VuZGlmCi0JaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1RSQUNFTUUpIHsKLQkJcmV0ID0gcHRyYWNlX3RyYWNlbWUoKTsKLQkJaWYgKHJldCA8IDApCi0JCQlwdF9lcnJvcl9yZXR1cm4ocmVncywgLXJldCk7Ci0JCWVsc2UKLQkJCXB0X3N1Y2NfcmV0dXJuKHJlZ3MsIDApOwotCQlnb3RvIG91dDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHdpbmRvdywgcmVnX3dpbmRvdywgc2l6ZW9mKHdpbmRvdykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0ID0gdXNlcl9yZWdzZXRfY29weW91dCgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJICB3aW5kb3csCisJCQkJCSAgMTYgKiBzaXplb2YodTY0KSwKKwkJCQkJICAzMiAqIHNpemVvZih1NjQpKTsKIAl9CiAKLQljaGlsZCA9IHB0cmFjZV9nZXRfdGFza19zdHJ1Y3QocGlkKTsKLQlpZiAoSVNfRVJSKGNoaWxkKSkgewotCQlyZXQgPSBQVFJfRVJSKGNoaWxkKTsKLQkJcHRfZXJyb3JfcmV0dXJuKHJlZ3MsIC1yZXQpOwotCQlnb3RvIG91dDsKKwlpZiAoIXJldCkgeworCQkvKiBUU1RBVEUsIFRQQywgVE5QQyAqLworCQlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5b3V0KCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCQkgICZyZWdzLT50c3RhdGUsCisJCQkJCSAgMzIgKiBzaXplb2YodTY0KSwKKwkJCQkJICAzNSAqIHNpemVvZih1NjQpKTsKIAl9CiAKLQlpZiAoKGN1cnJlbnQtPnBlcnNvbmFsaXR5ID09IFBFUl9TVU5PUyAmJiByZXF1ZXN0ID09IFBUUkFDRV9TVU5BVFRBQ0gpCi0JICAgIHx8IChjdXJyZW50LT5wZXJzb25hbGl0eSAhPSBQRVJfU1VOT1MgJiYgcmVxdWVzdCA9PSBQVFJBQ0VfQVRUQUNIKSkgewotCQlpZiAocHRyYWNlX2F0dGFjaChjaGlsZCkpIHsKLQkJCXB0X2Vycm9yX3JldHVybihyZWdzLCBFUEVSTSk7Ci0JCQlnb3RvIG91dF90c2s7CisJaWYgKCFyZXQpIHsKKwkJdW5zaWduZWQgbG9uZyB5ID0gcmVncy0+eTsKKworCQlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5b3V0KCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCQkgICZ5LAorCQkJCQkgIDM1ICogc2l6ZW9mKHU2NCksCisJCQkJCSAgMzYgKiBzaXplb2YodTY0KSk7CisJfQorCisJaWYgKCFyZXQpCisJCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlvdXRfemVybygmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJICAgICAgIDM2ICogc2l6ZW9mKHU2NCksIC0xKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2VucmVnczY0X3NldChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhcmdldCwKKwkJCSBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXQgKnJlZ3NldCwKKwkJCSB1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCisJCQkgY29uc3Qgdm9pZCAqa2J1ZiwgY29uc3Qgdm9pZCBfX3VzZXIgKnVidWYpCit7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3ModGFyZ2V0KTsKKwlpbnQgcmV0OworCisJaWYgKHRhcmdldCA9PSBjdXJyZW50KQorCQlmbHVzaHdfdXNlcigpOworCisJcmV0ID0gdXNlcl9yZWdzZXRfY29weWluKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCSByZWdzLT51X3JlZ3MsCisJCQkJIDAsIDE2ICogc2l6ZW9mKHU2NCkpOworCWlmICghcmV0ICYmIGNvdW50ID4gMCkgeworCQl1bnNpZ25lZCBsb25nIF9fdXNlciAqcmVnX3dpbmRvdyA9ICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKQorCQkJKHJlZ3MtPnVfcmVnc1tVUkVHX0k2XSArIFNUQUNLX0JJQVMpOworCQl1bnNpZ25lZCBsb25nIHdpbmRvd1sxNl07CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHdpbmRvdywgcmVnX3dpbmRvdywgc2l6ZW9mKHdpbmRvdykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0ID0gdXNlcl9yZWdzZXRfY29weWluKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCQkgd2luZG93LAorCQkJCQkgMTYgKiBzaXplb2YodTY0KSwKKwkJCQkJIDMyICogc2l6ZW9mKHU2NCkpOworCQlpZiAoIXJldCAmJgorCQkgICAgY29weV90b191c2VyKHJlZ193aW5kb3csIHdpbmRvdywgc2l6ZW9mKHdpbmRvdykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKCFyZXQgJiYgY291bnQgPiAwKSB7CisJCXVuc2lnbmVkIGxvbmcgdHN0YXRlOworCisJCS8qIFRTVEFURSAqLworCQlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5aW4oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJCSAmdHN0YXRlLAorCQkJCQkgMzIgKiBzaXplb2YodTY0KSwKKwkJCQkJIDMzICogc2l6ZW9mKHU2NCkpOworCQlpZiAoIXJldCkgeworCQkJLyogT25seSB0aGUgY29uZGl0aW9uIGNvZGVzIGNhbiBiZSBtb2RpZmllZAorCQkJICogaW4gdGhlICV0c3RhdGUgcmVnaXN0ZXIuCisJCQkgKi8KKwkJCXRzdGF0ZSAmPSAoVFNUQVRFX0lDQyB8IFRTVEFURV9YQ0MpOworCQkJcmVncy0+dHN0YXRlICY9IH4oVFNUQVRFX0lDQyB8IFRTVEFURV9YQ0MpOworCQkJcmVncy0+dHN0YXRlIHw9IHRzdGF0ZTsKIAkJfQotCQlwdF9zdWNjX3JldHVybihyZWdzLCAwKTsKLQkJZ290byBvdXRfdHNrOwogCX0KIAotCXJldCA9IHB0cmFjZV9jaGVja19hdHRhY2goY2hpbGQsIHJlcXVlc3QgPT0gUFRSQUNFX0tJTEwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXB0X2Vycm9yX3JldHVybihyZWdzLCAtcmV0KTsKLQkJZ290byBvdXRfdHNrOworCWlmICghcmV0KSB7CisJCS8qIFRQQywgVE5QQyAqLworCQlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5aW4oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJCSAmcmVncy0+dHBjLAorCQkJCQkgMzMgKiBzaXplb2YodTY0KSwKKwkJCQkJIDM1ICogc2l6ZW9mKHU2NCkpOwogCX0KIAotCWlmICghKHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUKSkJJiYKLQkgICAgKChyZXF1ZXN0ID09IFBUUkFDRV9SRUFEREFUQTY0KQkJfHwKLQkgICAgIChyZXF1ZXN0ID09IFBUUkFDRV9XUklURURBVEE2NCkJCXx8Ci0JICAgICAocmVxdWVzdCA9PSBQVFJBQ0VfUkVBRFRFWFQ2NCkJCXx8Ci0JICAgICAocmVxdWVzdCA9PSBQVFJBQ0VfV1JJVEVURVhUNjQpCQl8fAotCSAgICAgKHJlcXVlc3QgPT0gUFRSQUNFX1BFRUtURVhUNjQpCQl8fAotCSAgICAgKHJlcXVlc3QgPT0gUFRSQUNFX1BPS0VURVhUNjQpCQl8fAotCSAgICAgKHJlcXVlc3QgPT0gUFRSQUNFX1BFRUtEQVRBNjQpCQl8fAotCSAgICAgKHJlcXVlc3QgPT0gUFRSQUNFX1BPS0VEQVRBNjQpKSkgewotCQlhZGRyID0gcmVncy0+dV9yZWdzW1VSRUdfRzJdOwotCQlhZGRyMiA9IHJlZ3MtPnVfcmVnc1tVUkVHX0czXTsKLQkJcmVxdWVzdCAtPSAzMDsgLyogd2hlZWUuLi4gKi8KKwlpZiAoIXJldCkgeworCQl1bnNpZ25lZCBsb25nIHk7CisKKwkJcmV0ID0gdXNlcl9yZWdzZXRfY29weWluKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCQkgJnksCisJCQkJCSAzNSAqIHNpemVvZih1NjQpLAorCQkJCQkgMzYgKiBzaXplb2YodTY0KSk7CisJCWlmICghcmV0KQorCQkJcmVncy0+eSA9IHk7CiAJfQogCi0Jc3dpdGNoKHJlcXVlc3QpIHsKKwlpZiAoIXJldCkKKwkJcmV0ID0gdXNlcl9yZWdzZXRfY29weWluX2lnbm9yZSgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJCTM2ICogc2l6ZW9mKHU2NCksIC0xKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZnByZWdzNjRfZ2V0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0LAorCQkJY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0ICpyZWdzZXQsCisJCQl1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCisJCQl2b2lkICprYnVmLCB2b2lkIF9fdXNlciAqdWJ1ZikKK3sKKwljb25zdCB1bnNpZ25lZCBsb25nICpmcHJlZ3MgPSB0YXNrX3RocmVhZF9pbmZvKHRhcmdldCktPmZwcmVnczsKKwl1bnNpZ25lZCBsb25nIGZwcnMsIGZzciwgZ3NyOworCWludCByZXQ7CisKKwlpZiAodGFyZ2V0ID09IGN1cnJlbnQpCisJCXNhdmVfYW5kX2NsZWFyX2ZwdSgpOworCisJZnBycyA9IHRhc2tfdGhyZWFkX2luZm8odGFyZ2V0KS0+ZnBzYXZlZFswXTsKKworCWlmIChmcHJzICYgRlBSU19ETCkKKwkJcmV0ID0gdXNlcl9yZWdzZXRfY29weW91dCgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJICBmcHJlZ3MsCisJCQkJCSAgMCwgMTYgKiBzaXplb2YodTY0KSk7CisJZWxzZQorCQlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5b3V0X3plcm8oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJCSAgICAgICAwLAorCQkJCQkgICAgICAgMTYgKiBzaXplb2YodTY0KSk7CisKKwlpZiAoIXJldCkgeworCQlpZiAoZnBycyAmIEZQUlNfRFUpCisJCQlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5b3V0KCZwb3MsICZjb3VudCwKKwkJCQkJCSAgJmtidWYsICZ1YnVmLAorCQkJCQkJICBmcHJlZ3MgKyAxNiwKKwkJCQkJCSAgMTYgKiBzaXplb2YodTY0KSwKKwkJCQkJCSAgMzIgKiBzaXplb2YodTY0KSk7CisJCWVsc2UKKwkJCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlvdXRfemVybygmcG9zLCAmY291bnQsCisJCQkJCQkgICAgICAgJmtidWYsICZ1YnVmLAorCQkJCQkJICAgICAgIDE2ICogc2l6ZW9mKHU2NCksCisJCQkJCQkgICAgICAgMzIgKiBzaXplb2YodTY0KSk7CisJfQorCisJaWYgKGZwcnMgJiBGUFJTX0ZFRikgeworCQlmc3IgPSB0YXNrX3RocmVhZF9pbmZvKHRhcmdldCktPnhmc3JbMF07CisJCWdzciA9IHRhc2tfdGhyZWFkX2luZm8odGFyZ2V0KS0+Z3NyWzBdOworCX0gZWxzZSB7CisJCWZzciA9IGdzciA9IDA7CisJfQorCisJaWYgKCFyZXQpCisJCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlvdXQoJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJCSAgJmZzciwKKwkJCQkJICAzMiAqIHNpemVvZih1NjQpLAorCQkJCQkgIDMzICogc2l6ZW9mKHU2NCkpOworCWlmICghcmV0KQorCQlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5b3V0KCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCQkgICZnc3IsCisJCQkJCSAgMzMgKiBzaXplb2YodTY0KSwKKwkJCQkJICAzNCAqIHNpemVvZih1NjQpKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gdXNlcl9yZWdzZXRfY29weW91dCgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJICAmZnBycywKKwkJCQkJICAzNCAqIHNpemVvZih1NjQpLAorCQkJCQkgIDM1ICogc2l6ZW9mKHU2NCkpOworCisJaWYgKCFyZXQpCisJCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlvdXRfemVybygmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJICAgICAgIDM1ICogc2l6ZW9mKHU2NCksIC0xKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZnByZWdzNjRfc2V0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0LAorCQkJY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0ICpyZWdzZXQsCisJCQl1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCisJCQljb25zdCB2b2lkICprYnVmLCBjb25zdCB2b2lkIF9fdXNlciAqdWJ1ZikKK3sKKwl1bnNpZ25lZCBsb25nICpmcHJlZ3MgPSB0YXNrX3RocmVhZF9pbmZvKHRhcmdldCktPmZwcmVnczsKKwl1bnNpZ25lZCBsb25nIGZwcnM7CisJaW50IHJldDsKKworCWlmICh0YXJnZXQgPT0gY3VycmVudCkKKwkJc2F2ZV9hbmRfY2xlYXJfZnB1KCk7CisKKwlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5aW4oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJIGZwcmVncywKKwkJCQkgMCwgMzIgKiBzaXplb2YodTY0KSk7CisJaWYgKCFyZXQpCisJCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlpbigmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJIHRhc2tfdGhyZWFkX2luZm8odGFyZ2V0KS0+eGZzciwKKwkJCQkJIDMyICogc2l6ZW9mKHU2NCksCisJCQkJCSAzMyAqIHNpemVvZih1NjQpKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gdXNlcl9yZWdzZXRfY29weWluKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCQkgdGFza190aHJlYWRfaW5mbyh0YXJnZXQpLT5nc3IsCisJCQkJCSAzMyAqIHNpemVvZih1NjQpLAorCQkJCQkgMzQgKiBzaXplb2YodTY0KSk7CisKKwlmcHJzID0gdGFza190aHJlYWRfaW5mbyh0YXJnZXQpLT5mcHNhdmVkWzBdOworCWlmICghcmV0ICYmIGNvdW50ID4gMCkgeworCQlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5aW4oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJCSAmZnBycywKKwkJCQkJIDM0ICogc2l6ZW9mKHU2NCksCisJCQkJCSAzNSAqIHNpemVvZih1NjQpKTsKKwl9CisKKwlmcHJzIHw9IChGUFJTX0ZFRiB8IEZQUlNfREwgfCBGUFJTX0RVKTsKKwl0YXNrX3RocmVhZF9pbmZvKHRhcmdldCktPmZwc2F2ZWRbMF0gPSBmcHJzOworCisJaWYgKCFyZXQpCisJCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlpbl9pZ25vcmUoJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJCQkzNSAqIHNpemVvZih1NjQpLCAtMSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldCBzcGFyYzY0X3JlZ3NldHNbXSA9IHsKKwkvKiBGb3JtYXQgaXM6CisJICogCUcwIC0tPiBHNworCSAqCU8wIC0tPiBPNworCSAqCUwwIC0tPiBMNworCSAqCUkwIC0tPiBJNworCSAqCVRTVEFURSwgVFBDLCBUTlBDLCBZCisJICovCisJW1JFR1NFVF9HRU5FUkFMXSA9IHsKKwkJLmNvcmVfbm90ZV90eXBlID0gTlRfUFJTVEFUVVMsCisJCS5uID0gMzYgKiBzaXplb2YodTY0KSwKKwkJLnNpemUgPSBzaXplb2YodTY0KSwgLmFsaWduID0gc2l6ZW9mKHU2NCksCisJCS5nZXQgPSBnZW5yZWdzNjRfZ2V0LCAuc2V0ID0gZ2VucmVnczY0X3NldAorCX0sCisJLyogRm9ybWF0IGlzOgorCSAqCUYwIC0tPiBGNjMKKwkgKglGU1IKKwkgKglHU1IKKwkgKglGUFJTCisJICovCisJW1JFR1NFVF9GUF0gPSB7CisJCS5jb3JlX25vdGVfdHlwZSA9IE5UX1BSRlBSRUcsCisJCS5uID0gMzUgKiBzaXplb2YodTY0KSwKKwkJLnNpemUgPSBzaXplb2YodTY0KSwgLmFsaWduID0gc2l6ZW9mKHU2NCksCisJCS5nZXQgPSBmcHJlZ3M2NF9nZXQsIC5zZXQgPSBmcHJlZ3M2NF9zZXQKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldF92aWV3IHVzZXJfc3BhcmM2NF92aWV3ID0geworCS5uYW1lID0gInNwYXJjNjQiLCAuZV9tYWNoaW5lID0gRU1fU1BBUkNWOSwKKwkucmVnc2V0cyA9IHNwYXJjNjRfcmVnc2V0cywgLm4gPSBBUlJBWV9TSVpFKHNwYXJjNjRfcmVnc2V0cykKK307CisKK3N0YXRpYyBpbnQgZ2VucmVnczMyX2dldChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhcmdldCwKKwkJCSBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXQgKnJlZ3NldCwKKwkJCSB1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCisJCQkgdm9pZCAqa2J1Ziwgdm9pZCBfX3VzZXIgKnVidWYpCit7CisJY29uc3Qgc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3ModGFyZ2V0KTsKKwljb21wYXRfdWxvbmdfdCBfX3VzZXIgKnJlZ193aW5kb3c7CisJY29tcGF0X3Vsb25nX3QgKmsgPSBrYnVmOworCWNvbXBhdF91bG9uZ190IF9fdXNlciAqdSA9IHVidWY7CisJY29tcGF0X3Vsb25nX3QgcmVnOworCisJaWYgKHRhcmdldCA9PSBjdXJyZW50KQorCQlmbHVzaHdfdXNlcigpOworCisJcG9zIC89IHNpemVvZihyZWcpOworCWNvdW50IC89IHNpemVvZihyZWcpOworCisJaWYgKGtidWYpIHsKKwkJZm9yICg7IGNvdW50ID4gMCAmJiBwb3MgPCAxNjsgY291bnQtLSkKKwkJCSprKysgPSByZWdzLT51X3JlZ3NbcG9zKytdOworCisJCXJlZ193aW5kb3cgPSAoY29tcGF0X3Vsb25nX3QgX191c2VyICopIHJlZ3MtPnVfcmVnc1tVUkVHX0k2XTsKKwkJZm9yICg7IGNvdW50ID4gMCAmJiBwb3MgPCAzMjsgY291bnQtLSkgeworCQkJaWYgKGdldF91c2VyKCprKyssICZyZWdfd2luZG93W3BvcysrXSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKDsgY291bnQgPiAwICYmIHBvcyA8IDE2OyBjb3VudC0tKSB7CisJCQlpZiAocHV0X3VzZXIoKGNvbXBhdF91bG9uZ190KSByZWdzLT51X3JlZ3NbcG9zKytdLCB1KyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJcmVnX3dpbmRvdyA9IChjb21wYXRfdWxvbmdfdCBfX3VzZXIgKikgcmVncy0+dV9yZWdzW1VSRUdfSTZdOworCQlmb3IgKDsgY291bnQgPiAwICYmIHBvcyA8IDMyOyBjb3VudC0tKSB7CisJCQlpZiAoZ2V0X3VzZXIocmVnLCAmcmVnX3dpbmRvd1twb3MrK10pIHx8CisJCQkgICAgcHV0X3VzZXIocmVnLCB1KyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc3dpdGNoIChwb3MpIHsKKwkJY2FzZSAzMjogLyogUFNSICovCisJCQlyZWcgPSB0c3RhdGVfdG9fcHNyKHJlZ3MtPnRzdGF0ZSk7CisJCQlicmVhazsKKwkJY2FzZSAzMzogLyogUEMgKi8KKwkJCXJlZyA9IHJlZ3MtPnRwYzsKKwkJCWJyZWFrOworCQljYXNlIDM0OiAvKiBOUEMgKi8KKwkJCXJlZyA9IHJlZ3MtPnRucGM7CisJCQlicmVhazsKKwkJY2FzZSAzNTogLyogWSAqLworCQkJcmVnID0gcmVncy0+eTsKKwkJCWJyZWFrOworCQljYXNlIDM2OiAvKiBXSU0gKi8KKwkJY2FzZSAzNzogLyogVEJSICovCisJCQlyZWcgPSAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGZpbmlzaDsKKwkJfQorCisJCWlmIChrYnVmKQorCQkJKmsrKyA9IHJlZzsKKwkJZWxzZSBpZiAocHV0X3VzZXIocmVnLCB1KyspKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXBvcysrOworCQljb3VudC0tOworCX0KK2ZpbmlzaDoKKwlwb3MgKj0gc2l6ZW9mKHJlZyk7CisJY291bnQgKj0gc2l6ZW9mKHJlZyk7CisKKwlyZXR1cm4gdXNlcl9yZWdzZXRfY29weW91dF96ZXJvKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCQkzOCAqIHNpemVvZihyZWcpLCAtMSk7Cit9CisKK3N0YXRpYyBpbnQgZ2VucmVnczMyX3NldChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhcmdldCwKKwkJCSBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXQgKnJlZ3NldCwKKwkJCSB1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCisJCQkgY29uc3Qgdm9pZCAqa2J1ZiwgY29uc3Qgdm9pZCBfX3VzZXIgKnVidWYpCit7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3ModGFyZ2V0KTsKKwljb21wYXRfdWxvbmdfdCBfX3VzZXIgKnJlZ193aW5kb3c7CisJY29uc3QgY29tcGF0X3Vsb25nX3QgKmsgPSBrYnVmOworCWNvbnN0IGNvbXBhdF91bG9uZ190IF9fdXNlciAqdSA9IHVidWY7CisJY29tcGF0X3Vsb25nX3QgcmVnOworCisJaWYgKHRhcmdldCA9PSBjdXJyZW50KQorCQlmbHVzaHdfdXNlcigpOworCisJcG9zIC89IHNpemVvZihyZWcpOworCWNvdW50IC89IHNpemVvZihyZWcpOworCisJaWYgKGtidWYpIHsKKwkJZm9yICg7IGNvdW50ID4gMCAmJiBwb3MgPCAxNjsgY291bnQtLSkKKwkJCXJlZ3MtPnVfcmVnc1twb3MrK10gPSAqaysrOworCisJCXJlZ193aW5kb3cgPSAoY29tcGF0X3Vsb25nX3QgX191c2VyICopIHJlZ3MtPnVfcmVnc1tVUkVHX0k2XTsKKwkJZm9yICg7IGNvdW50ID4gMCAmJiBwb3MgPCAzMjsgY291bnQtLSkgeworCQkJaWYgKHB1dF91c2VyKCprKyssICZyZWdfd2luZG93W3BvcysrXSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKDsgY291bnQgPiAwICYmIHBvcyA8IDE2OyBjb3VudC0tKSB7CisJCQlpZiAoZ2V0X3VzZXIocmVnLCB1KyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmVncy0+dV9yZWdzW3BvcysrXSA9IHJlZzsKKwkJfQorCisJCXJlZ193aW5kb3cgPSAoY29tcGF0X3Vsb25nX3QgX191c2VyICopIHJlZ3MtPnVfcmVnc1tVUkVHX0k2XTsKKwkJZm9yICg7IGNvdW50ID4gMCAmJiBwb3MgPCAzMjsgY291bnQtLSkgeworCQkJaWYgKGdldF91c2VyKHJlZywgdSsrKSB8fAorCQkJICAgIHB1dF91c2VyKHJlZywgJnJlZ193aW5kb3dbcG9zKytdKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXVuc2lnbmVkIGxvbmcgdHN0YXRlOworCisJCWlmIChrYnVmKQorCQkJcmVnID0gKmsrKzsKKwkJZWxzZSBpZiAoZ2V0X3VzZXIocmVnLCB1KyspKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJc3dpdGNoIChwb3MpIHsKKwkJY2FzZSAzMjogLyogUFNSICovCisJCQl0c3RhdGUgPSByZWdzLT50c3RhdGU7CisJCQl0c3RhdGUgJj0gfihUU1RBVEVfSUNDIHwgVFNUQVRFX1hDQyk7CisJCQl0c3RhdGUgfD0gcHNyX3RvX3RzdGF0ZV9pY2MocmVnKTsKKwkJCXJlZ3MtPnRzdGF0ZSA9IHRzdGF0ZTsKKwkJCWJyZWFrOworCQljYXNlIDMzOiAvKiBQQyAqLworCQkJcmVncy0+dHBjID0gcmVnOworCQkJYnJlYWs7CisJCWNhc2UgMzQ6IC8qIE5QQyAqLworCQkJcmVncy0+dG5wYyA9IHJlZzsKKwkJCWJyZWFrOworCQljYXNlIDM1OiAvKiBZICovCisJCQlyZWdzLT55ID0gcmVnOworCQkJYnJlYWs7CisJCWNhc2UgMzY6IC8qIFdJTSAqLworCQljYXNlIDM3OiAvKiBUQlIgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBmaW5pc2g7CisJCX0KKworCQlwb3MrKzsKKwkJY291bnQtLTsKKwl9CitmaW5pc2g6CisJcG9zICo9IHNpemVvZihyZWcpOworCWNvdW50ICo9IHNpemVvZihyZWcpOworCisJcmV0dXJuIHVzZXJfcmVnc2V0X2NvcHlpbl9pZ25vcmUoJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJCSAzOCAqIHNpemVvZihyZWcpLCAtMSk7Cit9CisKK3N0YXRpYyBpbnQgZnByZWdzMzJfZ2V0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0LAorCQkJY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0ICpyZWdzZXQsCisJCQl1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCisJCQl2b2lkICprYnVmLCB2b2lkIF9fdXNlciAqdWJ1ZikKK3sKKwljb25zdCB1bnNpZ25lZCBsb25nICpmcHJlZ3MgPSB0YXNrX3RocmVhZF9pbmZvKHRhcmdldCktPmZwcmVnczsKKwljb21wYXRfdWxvbmdfdCBlbmFibGVkOworCXVuc2lnbmVkIGxvbmcgZnByczsKKwljb21wYXRfdWxvbmdfdCBmc3I7CisJaW50IHJldCA9IDA7CisKKwlpZiAodGFyZ2V0ID09IGN1cnJlbnQpCisJCXNhdmVfYW5kX2NsZWFyX2ZwdSgpOworCisJZnBycyA9IHRhc2tfdGhyZWFkX2luZm8odGFyZ2V0KS0+ZnBzYXZlZFswXTsKKwlpZiAoZnBycyAmIEZQUlNfRkVGKSB7CisJCWZzciA9IHRhc2tfdGhyZWFkX2luZm8odGFyZ2V0KS0+eGZzclswXTsKKwkJZW5hYmxlZCA9IDE7CisJfSBlbHNlIHsKKwkJZnNyID0gMDsKKwkJZW5hYmxlZCA9IDA7CisJfQorCisJcmV0ID0gdXNlcl9yZWdzZXRfY29weW91dCgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkgIGZwcmVncywKKwkJCQkgIDAsIDMyICogc2l6ZW9mKHUzMikpOworCisJaWYgKCFyZXQpCisJCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlvdXRfemVybygmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJICAgICAgIDMyICogc2l6ZW9mKHUzMiksCisJCQkJCSAgICAgICAzMyAqIHNpemVvZih1MzIpKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gdXNlcl9yZWdzZXRfY29weW91dCgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJICAmZnNyLAorCQkJCQkgIDMzICogc2l6ZW9mKHUzMiksCisJCQkJCSAgMzQgKiBzaXplb2YodTMyKSk7CisKKwlpZiAoIXJldCkgeworCQljb21wYXRfdWxvbmdfdCB2YWw7CisKKwkJdmFsID0gKGVuYWJsZWQgPDwgOCkgfCAoOCA8PCAxNik7CisJCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlvdXQoJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJCSAgJnZhbCwKKwkJCQkJICAzNCAqIHNpemVvZih1MzIpLAorCQkJCQkgIDM1ICogc2l6ZW9mKHUzMikpOworCX0KKworCWlmICghcmV0KQorCQlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5b3V0X3plcm8oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJCSAgICAgICAzNSAqIHNpemVvZih1MzIpLCAtMSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZwcmVnczMyX3NldChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhcmdldCwKKwkJCWNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldCAqcmVnc2V0LAorCQkJdW5zaWduZWQgaW50IHBvcywgdW5zaWduZWQgaW50IGNvdW50LAorCQkJY29uc3Qgdm9pZCAqa2J1ZiwgY29uc3Qgdm9pZCBfX3VzZXIgKnVidWYpCit7CisJdW5zaWduZWQgbG9uZyAqZnByZWdzID0gdGFza190aHJlYWRfaW5mbyh0YXJnZXQpLT5mcHJlZ3M7CisJdW5zaWduZWQgbG9uZyBmcHJzOworCWludCByZXQ7CisKKwlpZiAodGFyZ2V0ID09IGN1cnJlbnQpCisJCXNhdmVfYW5kX2NsZWFyX2ZwdSgpOworCisJZnBycyA9IHRhc2tfdGhyZWFkX2luZm8odGFyZ2V0KS0+ZnBzYXZlZFswXTsKKworCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlpbigmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkgZnByZWdzLAorCQkJCSAwLCAzMiAqIHNpemVvZih1MzIpKTsKKwlpZiAoIXJldCkKKwkJdXNlcl9yZWdzZXRfY29weWluX2lnbm9yZSgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJICAzMiAqIHNpemVvZih1MzIpLAorCQkJCQkgIDMzICogc2l6ZW9mKHUzMikpOworCWlmICghcmV0ICYmIGNvdW50ID4gMCkgeworCQljb21wYXRfdWxvbmdfdCBmc3I7CisJCXVuc2lnbmVkIGxvbmcgdmFsOworCisJCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlpbigmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJICZmc3IsCisJCQkJCSAzMyAqIHNpemVvZih1MzIpLAorCQkJCQkgMzQgKiBzaXplb2YodTMyKSk7CisJCWlmICghcmV0KSB7CisJCQl2YWwgPSB0YXNrX3RocmVhZF9pbmZvKHRhcmdldCktPnhmc3JbMF07CisJCQl2YWwgJj0gMHhmZmZmZmZmZjAwMDAwMDAwVUw7CisJCQl2YWwgfD0gZnNyOworCQkJdGFza190aHJlYWRfaW5mbyh0YXJnZXQpLT54ZnNyWzBdID0gdmFsOworCQl9CisJfQorCisJZnBycyB8PSAoRlBSU19GRUYgfCBGUFJTX0RMKTsKKwl0YXNrX3RocmVhZF9pbmZvKHRhcmdldCktPmZwc2F2ZWRbMF0gPSBmcHJzOworCisJaWYgKCFyZXQpCisJCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlpbl9pZ25vcmUoJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJCQkzNCAqIHNpemVvZih1MzIpLCAtMSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldCBzcGFyYzMyX3JlZ3NldHNbXSA9IHsKKwkvKiBGb3JtYXQgaXM6CisJICogCUcwIC0tPiBHNworCSAqCU8wIC0tPiBPNworCSAqCUwwIC0tPiBMNworCSAqCUkwIC0tPiBJNworCSAqCVBTUiwgUEMsIG5QQywgWSwgV0lNLCBUQlIKKwkgKi8KKwlbUkVHU0VUX0dFTkVSQUxdID0geworCQkuY29yZV9ub3RlX3R5cGUgPSBOVF9QUlNUQVRVUywKKwkJLm4gPSAzOCAqIHNpemVvZih1MzIpLAorCQkuc2l6ZSA9IHNpemVvZih1MzIpLCAuYWxpZ24gPSBzaXplb2YodTMyKSwKKwkJLmdldCA9IGdlbnJlZ3MzMl9nZXQsIC5zZXQgPSBnZW5yZWdzMzJfc2V0CisJfSwKKwkvKiBGb3JtYXQgaXM6CisJICoJRjAgLS0+IEYzMQorCSAqCWVtcHR5IDMyLWJpdCB3b3JkCisJICoJRlNSICgzMi0tYml0IHdvcmQpCisJICoJRlBVIFFVRVVFIENPVU5UICg4LWJpdCBjaGFyKQorCSAqCUZQVSBRVUVVRSBFTlRSWVNJWkUgKDgtYml0IGNoYXIpCisJICoJRlBVIEVOQUJMRUQgKDgtYml0IGNoYXIpCisJICoJZW1wdHkgOC1iaXQgY2hhcgorCSAqCUZQVSBRVUVVRSAoNjQgMzItYml0IGludHMpCisJICovCisJW1JFR1NFVF9GUF0gPSB7CisJCS5jb3JlX25vdGVfdHlwZSA9IE5UX1BSRlBSRUcsCisJCS5uID0gOTkgKiBzaXplb2YodTMyKSwKKwkJLnNpemUgPSBzaXplb2YodTMyKSwgLmFsaWduID0gc2l6ZW9mKHUzMiksCisJCS5nZXQgPSBmcHJlZ3MzMl9nZXQsIC5zZXQgPSBmcHJlZ3MzMl9zZXQKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldF92aWV3IHVzZXJfc3BhcmMzMl92aWV3ID0geworCS5uYW1lID0gInNwYXJjIiwgLmVfbWFjaGluZSA9IEVNX1NQQVJDLAorCS5yZWdzZXRzID0gc3BhcmMzMl9yZWdzZXRzLCAubiA9IEFSUkFZX1NJWkUoc3BhcmMzMl9yZWdzZXRzKQorfTsKKworY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0X3ZpZXcgKnRhc2tfdXNlcl9yZWdzZXRfdmlldyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJaWYgKHRlc3RfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl8zMkJJVCkpCisJCXJldHVybiAmdXNlcl9zcGFyYzMyX3ZpZXc7CisJcmV0dXJuICZ1c2VyX3NwYXJjNjRfdmlldzsKK30KKworc3RydWN0IGNvbXBhdF9mcHMgeworCXVuc2lnbmVkIGludCByZWdzWzMyXTsKKwl1bnNpZ25lZCBpbnQgZnNyOworCXVuc2lnbmVkIGludCBmbGFnczsKKwl1bnNpZ25lZCBpbnQgZXh0cmE7CisJdW5zaWduZWQgaW50IGZwcWQ7CisJc3RydWN0IGNvbXBhdF9mcSB7CisJCXVuc2lnbmVkIGludCBpbnNuYWRkcjsKKwkJdW5zaWduZWQgaW50IGluc247CisJfSBmcHFbMTZdOworfTsKKworbG9uZyBjb21wYXRfYXJjaF9wdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgY29tcGF0X2xvbmdfdCByZXF1ZXN0LAorCQkJY29tcGF0X3Vsb25nX3QgY2FkZHIsIGNvbXBhdF91bG9uZ190IGNkYXRhKQoreworCWNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldF92aWV3ICp2aWV3ID0gdGFza191c2VyX3JlZ3NldF92aWV3KGNoaWxkKTsKKwljb21wYXRfdWxvbmdfdCBjYWRkcjIgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCktPnVfcmVnc1tVUkVHX0k0XTsKKwlzdHJ1Y3QgcHRfcmVnczMyIF9fdXNlciAqcHJlZ3M7CisJc3RydWN0IGNvbXBhdF9mcHMgX191c2VyICpmcHM7CisJdW5zaWduZWQgbG9uZyBhZGRyMiA9IGNhZGRyMjsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBjYWRkcjsKKwl1bnNpZ25lZCBsb25nIGRhdGEgPSBjZGF0YTsKKwlpbnQgcmV0OworCisJcHJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MzMiBfX3VzZXIgKikgYWRkcjsKKwlmcHMgPSAoc3RydWN0IGNvbXBhdF9mcHMgX191c2VyICopIGFkZHI7CisKKwlzd2l0Y2ggKHJlcXVlc3QpIHsKIAljYXNlIFBUUkFDRV9QRUVLVVNSOgotCQlpZiAoYWRkciAhPSAwKQotCQkJcHRfZXJyb3JfcmV0dXJuKHJlZ3MsIEVJTyk7Ci0JCWVsc2UKLQkJCXB0X3N1Y2NfcmV0dXJuKHJlZ3MsIDApOwotCQlnb3RvIG91dF90c2s7CisJCXJldCA9IChhZGRyICE9IDApID8gLUVJTyA6IDA7CisJCWJyZWFrOwogCi0JY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLyAKLQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQl1bnNpZ25lZCBsb25nIHRtcDY0OwotCQl1bnNpZ25lZCBpbnQgdG1wMzI7Ci0JCWludCByZXMsIGNvcGllZDsKKwljYXNlIFBUUkFDRV9HRVRSRUdTOgorCQlyZXQgPSBjb3B5X3JlZ3NldF90b191c2VyKGNoaWxkLCB2aWV3LCBSRUdTRVRfR0VORVJBTCwKKwkJCQkJICAzMiAqIHNpemVvZih1MzIpLAorCQkJCQkgIDQgKiBzaXplb2YodTMyKSwKKwkJCQkJICAmcHJlZ3MtPnBzcik7CisJCWlmICghcmV0KQorCQkJcmV0ID0gY29weV9yZWdzZXRfdG9fdXNlcihjaGlsZCwgdmlldywgUkVHU0VUX0dFTkVSQUwsCisJCQkJCQkgIDEgKiBzaXplb2YodTMyKSwKKwkJCQkJCSAgMTUgKiBzaXplb2YodTMyKSwKKwkJCQkJCSAgJnByZWdzLT51X3JlZ3NbMF0pOworCQlicmVhazsKIAotCQlyZXMgPSAtRUlPOwotCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfMzJCSVQpKSB7Ci0JCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwKLQkJCQkJCSAgICZ0bXAzMiwgc2l6ZW9mKHRtcDMyKSwgMCk7Ci0JCQl0bXA2NCA9ICh1bnNpZ25lZCBsb25nKSB0bXAzMjsKLQkJCWlmIChjb3BpZWQgPT0gc2l6ZW9mKHRtcDMyKSkKLQkJCQlyZXMgPSAwOwotCQl9IGVsc2UgewotCQkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsCi0JCQkJCQkgICAmdG1wNjQsIHNpemVvZih0bXA2NCksIDApOwotCQkJaWYgKGNvcGllZCA9PSBzaXplb2YodG1wNjQpKQotCQkJCXJlcyA9IDA7CisJY2FzZSBQVFJBQ0VfU0VUUkVHUzoKKwkJcmV0ID0gY29weV9yZWdzZXRfZnJvbV91c2VyKGNoaWxkLCB2aWV3LCBSRUdTRVRfR0VORVJBTCwKKwkJCQkJICAgIDMyICogc2l6ZW9mKHUzMiksCisJCQkJCSAgICA0ICogc2l6ZW9mKHUzMiksCisJCQkJCSAgICAmcHJlZ3MtPnBzcik7CisJCWlmICghcmV0KQorCQkJcmV0ID0gY29weV9yZWdzZXRfZnJvbV91c2VyKGNoaWxkLCB2aWV3LCBSRUdTRVRfR0VORVJBTCwKKwkJCQkJCSAgICAxICogc2l6ZW9mKHUzMiksCisJCQkJCQkgICAgMTUgKiBzaXplb2YodTMyKSwKKwkJCQkJCSAgICAmcHJlZ3MtPnVfcmVnc1swXSk7CisJCWJyZWFrOworCisJY2FzZSBQVFJBQ0VfR0VURlBSRUdTOgorCQlyZXQgPSBjb3B5X3JlZ3NldF90b191c2VyKGNoaWxkLCB2aWV3LCBSRUdTRVRfRlAsCisJCQkJCSAgMCAqIHNpemVvZih1MzIpLAorCQkJCQkgIDMyICogc2l6ZW9mKHUzMiksCisJCQkJCSAgJmZwcy0+cmVnc1swXSk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gY29weV9yZWdzZXRfdG9fdXNlcihjaGlsZCwgdmlldywgUkVHU0VUX0ZQLAorCQkJCQkJICAzMyAqIHNpemVvZih1MzIpLAorCQkJCQkJICAxICogc2l6ZW9mKHUzMiksCisJCQkJCQkgICZmcHMtPmZzcik7CisJCWlmICghcmV0KSB7CisJCQlpZiAoX19wdXRfdXNlcigwLCAmZnBzLT5mbGFncykgfHwKKwkJCSAgICBfX3B1dF91c2VyKDAsICZmcHMtPmV4dHJhKSB8fAorCQkJICAgIF9fcHV0X3VzZXIoMCwgJmZwcy0+ZnBxZCkgfHwKKwkJCSAgICBjbGVhcl91c2VyKCZmcHMtPmZwcVswXSwgMzIgKiBzaXplb2YodW5zaWduZWQgaW50KSkpCisJCQkJcmV0ID0gLUVGQVVMVDsKIAkJfQotCQlpZiAocmVzIDwgMCkKLQkJCXB0X2Vycm9yX3JldHVybihyZWdzLCAtcmVzKTsKLQkJZWxzZQotCQkJcHRfb3Nfc3VjY19yZXR1cm4ocmVncywgdG1wNjQsICh2b2lkIF9fdXNlciAqKSBkYXRhKTsKLQkJZ290byBvdXRfdHNrOwotCX0KKwkJYnJlYWs7CiAKLQljYXNlIFBUUkFDRV9QT0tFVEVYVDogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KLQljYXNlIFBUUkFDRV9QT0tFREFUQTogewotCQl1bnNpZ25lZCBsb25nIHRtcDY0OwotCQl1bnNpZ25lZCBpbnQgdG1wMzI7Ci0JCWludCBjb3BpZWQsIHJlcyA9IC1FSU87Ci0KLQkJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUKSkgewotCQkJdG1wMzIgPSBkYXRhOwotCQkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsCi0JCQkJCQkgICAmdG1wMzIsIHNpemVvZih0bXAzMiksIDEpOwotCQkJaWYgKGNvcGllZCA9PSBzaXplb2YodG1wMzIpKQotCQkJCXJlcyA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQl0bXA2NCA9IGRhdGE7Ci0JCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwKLQkJCQkJCSAgICZ0bXA2NCwgc2l6ZW9mKHRtcDY0KSwgMSk7Ci0JCQlpZiAoY29waWVkID09IHNpemVvZih0bXA2NCkpCi0JCQkJcmVzID0gMDsKLQkJfQotCQlpZiAocmVzIDwgMCkKLQkJCXB0X2Vycm9yX3JldHVybihyZWdzLCAtcmVzKTsKLQkJZWxzZQotCQkJcHRfc3VjY19yZXR1cm4ocmVncywgcmVzKTsKLQkJZ290byBvdXRfdHNrOwotCX0KLQotCWNhc2UgUFRSQUNFX0dFVFJFR1M6IHsKLQkJc3RydWN0IHB0X3JlZ3MzMiBfX3VzZXIgKnByZWdzID0KLQkJCShzdHJ1Y3QgcHRfcmVnczMyIF9fdXNlciAqKSBhZGRyOwotCQlzdHJ1Y3QgcHRfcmVncyAqY3JlZ3MgPSB0YXNrX3B0X3JlZ3MoY2hpbGQpOwotCQlpbnQgcnZhbDsKLQotCQlpZiAoX19wdXRfdXNlcih0c3RhdGVfdG9fcHNyKGNyZWdzLT50c3RhdGUpLCAoJnByZWdzLT5wc3IpKSB8fAotCQkgICAgX19wdXRfdXNlcihjcmVncy0+dHBjLCAoJnByZWdzLT5wYykpIHx8Ci0JCSAgICBfX3B1dF91c2VyKGNyZWdzLT50bnBjLCAoJnByZWdzLT5ucGMpKSB8fAotCQkgICAgX19wdXRfdXNlcihjcmVncy0+eSwgKCZwcmVncy0+eSkpKSB7Ci0JCQlwdF9lcnJvcl9yZXR1cm4ocmVncywgRUZBVUxUKTsKLQkJCWdvdG8gb3V0X3RzazsKLQkJfQotCQlmb3IgKHJ2YWwgPSAxOyBydmFsIDwgMTY7IHJ2YWwrKykKLQkJCWlmIChfX3B1dF91c2VyKGNyZWdzLT51X3JlZ3NbcnZhbF0sICgmcHJlZ3MtPnVfcmVnc1tydmFsIC0gMV0pKSkgewotCQkJCXB0X2Vycm9yX3JldHVybihyZWdzLCBFRkFVTFQpOwotCQkJCWdvdG8gb3V0X3RzazsKLQkJCX0KLQkJcHRfc3VjY19yZXR1cm4ocmVncywgMCk7Ci0jaWZkZWYgREVCVUdfUFRSQUNFCi0JCXByaW50ayAoIlBDPSVseCBuUEM9JWx4IG83PSVseFxuIiwgY3JlZ3MtPnRwYywgY3JlZ3MtPnRucGMsIGNyZWdzLT51X3JlZ3MgWzE1XSk7Ci0jZW5kaWYKLQkJZ290byBvdXRfdHNrOwotCX0KLQotCWNhc2UgUFRSQUNFX0dFVFJFR1M2NDogewotCQlzdHJ1Y3QgcHRfcmVncyBfX3VzZXIgKnByZWdzID0gKHN0cnVjdCBwdF9yZWdzIF9fdXNlciAqKSBhZGRyOwotCQlzdHJ1Y3QgcHRfcmVncyAqY3JlZ3MgPSB0YXNrX3B0X3JlZ3MoY2hpbGQpOwotCQl1bnNpZ25lZCBsb25nIHRwYyA9IGNyZWdzLT50cGM7Ci0JCWludCBydmFsOwotCi0JCWlmICgodGFza190aHJlYWRfaW5mbyhjaGlsZCktPmZsYWdzICYgX1RJRl8zMkJJVCkgIT0gMCkKLQkJCXRwYyAmPSAweGZmZmZmZmZmOwotCQlpZiAoX19wdXRfdXNlcihjcmVncy0+dHN0YXRlLCAoJnByZWdzLT50c3RhdGUpKSB8fAotCQkgICAgX19wdXRfdXNlcih0cGMsICgmcHJlZ3MtPnRwYykpIHx8Ci0JCSAgICBfX3B1dF91c2VyKGNyZWdzLT50bnBjLCAoJnByZWdzLT50bnBjKSkgfHwKLQkJICAgIF9fcHV0X3VzZXIoY3JlZ3MtPnksICgmcHJlZ3MtPnkpKSkgewotCQkJcHRfZXJyb3JfcmV0dXJuKHJlZ3MsIEVGQVVMVCk7Ci0JCQlnb3RvIG91dF90c2s7Ci0JCX0KLQkJZm9yIChydmFsID0gMTsgcnZhbCA8IDE2OyBydmFsKyspCi0JCQlpZiAoX19wdXRfdXNlcihjcmVncy0+dV9yZWdzW3J2YWxdLCAoJnByZWdzLT51X3JlZ3NbcnZhbCAtIDFdKSkpIHsKLQkJCQlwdF9lcnJvcl9yZXR1cm4ocmVncywgRUZBVUxUKTsKLQkJCQlnb3RvIG91dF90c2s7Ci0JCQl9Ci0JCXB0X3N1Y2NfcmV0dXJuKHJlZ3MsIDApOwotI2lmZGVmIERFQlVHX1BUUkFDRQotCQlwcmludGsgKCJQQz0lbHggblBDPSVseCBvNz0lbHhcbiIsIGNyZWdzLT50cGMsIGNyZWdzLT50bnBjLCBjcmVncy0+dV9yZWdzIFsxNV0pOwotI2VuZGlmCi0JCWdvdG8gb3V0X3RzazsKLQl9Ci0KLQljYXNlIFBUUkFDRV9TRVRSRUdTOiB7Ci0JCXN0cnVjdCBwdF9yZWdzMzIgX191c2VyICpwcmVncyA9Ci0JCQkoc3RydWN0IHB0X3JlZ3MzMiBfX3VzZXIgKikgYWRkcjsKLQkJc3RydWN0IHB0X3JlZ3MgKmNyZWdzID0gdGFza19wdF9yZWdzKGNoaWxkKTsKLQkJdW5zaWduZWQgaW50IHBzciwgcGMsIG5wYywgeTsKLQkJaW50IGk7Ci0KLQkJLyogTXVzdCBiZSBjYXJlZnVsLCB0cmFjaW5nIHByb2Nlc3MgY2FuIG9ubHkgc2V0IGNlcnRhaW4KLQkJICogYml0cyBpbiB0aGUgcHNyLgotCQkgKi8KLQkJaWYgKF9fZ2V0X3VzZXIocHNyLCAoJnByZWdzLT5wc3IpKSB8fAotCQkgICAgX19nZXRfdXNlcihwYywgKCZwcmVncy0+cGMpKSB8fAotCQkgICAgX19nZXRfdXNlcihucGMsICgmcHJlZ3MtPm5wYykpIHx8Ci0JCSAgICBfX2dldF91c2VyKHksICgmcHJlZ3MtPnkpKSkgewotCQkJcHRfZXJyb3JfcmV0dXJuKHJlZ3MsIEVGQVVMVCk7Ci0JCQlnb3RvIG91dF90c2s7Ci0JCX0KLQkJY3JlZ3MtPnRzdGF0ZSAmPSB+KFRTVEFURV9JQ0MpOwotCQljcmVncy0+dHN0YXRlIHw9IHBzcl90b190c3RhdGVfaWNjKHBzcik7Ci0gICAgICAgICAgICAgICAJaWYgKCEoKHBjIHwgbnBjKSAmIDMpKSB7Ci0JCQljcmVncy0+dHBjID0gcGM7Ci0JCQljcmVncy0+dG5wYyA9IG5wYzsKLQkJfQotCQljcmVncy0+eSA9IHk7Ci0JCWZvciAoaSA9IDE7IGkgPCAxNjsgaSsrKSB7Ci0JCQlpZiAoX19nZXRfdXNlcihjcmVncy0+dV9yZWdzW2ldLCAoJnByZWdzLT51X3JlZ3NbaS0xXSkpKSB7Ci0JCQkJcHRfZXJyb3JfcmV0dXJuKHJlZ3MsIEVGQVVMVCk7Ci0JCQkJZ290byBvdXRfdHNrOwotCQkJfQotCQl9Ci0JCXB0X3N1Y2NfcmV0dXJuKHJlZ3MsIDApOwotCQlnb3RvIG91dF90c2s7Ci0JfQotCi0JY2FzZSBQVFJBQ0VfU0VUUkVHUzY0OiB7Ci0JCXN0cnVjdCBwdF9yZWdzIF9fdXNlciAqcHJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgX191c2VyICopIGFkZHI7Ci0JCXN0cnVjdCBwdF9yZWdzICpjcmVncyA9IHRhc2tfcHRfcmVncyhjaGlsZCk7Ci0JCXVuc2lnbmVkIGxvbmcgdHN0YXRlLCB0cGMsIHRucGMsIHk7Ci0JCWludCBpOwotCi0JCS8qIE11c3QgYmUgY2FyZWZ1bCwgdHJhY2luZyBwcm9jZXNzIGNhbiBvbmx5IHNldCBjZXJ0YWluCi0JCSAqIGJpdHMgaW4gdGhlIHBzci4KLQkJICovCi0JCWlmIChfX2dldF91c2VyKHRzdGF0ZSwgKCZwcmVncy0+dHN0YXRlKSkgfHwKLQkJICAgIF9fZ2V0X3VzZXIodHBjLCAoJnByZWdzLT50cGMpKSB8fAotCQkgICAgX19nZXRfdXNlcih0bnBjLCAoJnByZWdzLT50bnBjKSkgfHwKLQkJICAgIF9fZ2V0X3VzZXIoeSwgKCZwcmVncy0+eSkpKSB7Ci0JCQlwdF9lcnJvcl9yZXR1cm4ocmVncywgRUZBVUxUKTsKLQkJCWdvdG8gb3V0X3RzazsKLQkJfQotCQlpZiAoKHRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5mbGFncyAmIF9USUZfMzJCSVQpICE9IDApIHsKLQkJCXRwYyAmPSAweGZmZmZmZmZmOwotCQkJdG5wYyAmPSAweGZmZmZmZmZmOwotCQl9Ci0JCXRzdGF0ZSAmPSAoVFNUQVRFX0lDQyB8IFRTVEFURV9YQ0MpOwotCQljcmVncy0+dHN0YXRlICY9IH4oVFNUQVRFX0lDQyB8IFRTVEFURV9YQ0MpOwotCQljcmVncy0+dHN0YXRlIHw9IHRzdGF0ZTsKLQkJaWYgKCEoKHRwYyB8IHRucGMpICYgMykpIHsKLQkJCWNyZWdzLT50cGMgPSB0cGM7Ci0JCQljcmVncy0+dG5wYyA9IHRucGM7Ci0JCX0KLQkJY3JlZ3MtPnkgPSB5OwotCQlmb3IgKGkgPSAxOyBpIDwgMTY7IGkrKykgewotCQkJaWYgKF9fZ2V0X3VzZXIoY3JlZ3MtPnVfcmVnc1tpXSwgKCZwcmVncy0+dV9yZWdzW2ktMV0pKSkgewotCQkJCXB0X2Vycm9yX3JldHVybihyZWdzLCBFRkFVTFQpOwotCQkJCWdvdG8gb3V0X3RzazsKLQkJCX0KLQkJfQotCQlwdF9zdWNjX3JldHVybihyZWdzLCAwKTsKLQkJZ290byBvdXRfdHNrOwotCX0KLQotCWNhc2UgUFRSQUNFX0dFVEZQUkVHUzogewotCQlzdHJ1Y3QgZnBzIHsKLQkJCXVuc2lnbmVkIGludCByZWdzWzMyXTsKLQkJCXVuc2lnbmVkIGludCBmc3I7Ci0JCQl1bnNpZ25lZCBpbnQgZmxhZ3M7Ci0JCQl1bnNpZ25lZCBpbnQgZXh0cmE7Ci0JCQl1bnNpZ25lZCBpbnQgZnBxZDsKLQkJCXN0cnVjdCBmcSB7Ci0JCQkJdW5zaWduZWQgaW50IGluc25hZGRyOwotCQkJCXVuc2lnbmVkIGludCBpbnNuOwotCQkJfSBmcHFbMTZdOwotCQl9OwotCQlzdHJ1Y3QgZnBzIF9fdXNlciAqZnBzID0gKHN0cnVjdCBmcHMgX191c2VyICopIGFkZHI7Ci0JCXVuc2lnbmVkIGxvbmcgKmZwcmVncyA9IHRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5mcHJlZ3M7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigmZnBzLT5yZWdzWzBdLCBmcHJlZ3MsCi0JCQkJICgzMiAqIHNpemVvZih1bnNpZ25lZCBpbnQpKSkgfHwKLQkJICAgIF9fcHV0X3VzZXIodGFza190aHJlYWRfaW5mbyhjaGlsZCktPnhmc3JbMF0sICgmZnBzLT5mc3IpKSB8fAotCQkgICAgX19wdXRfdXNlcigwLCAoJmZwcy0+ZnBxZCkpIHx8Ci0JCSAgICBfX3B1dF91c2VyKDAsICgmZnBzLT5mbGFncykpIHx8Ci0JCSAgICBfX3B1dF91c2VyKDAsICgmZnBzLT5leHRyYSkpIHx8Ci0JCSAgICBjbGVhcl91c2VyKCZmcHMtPmZwcVswXSwgMzIgKiBzaXplb2YodW5zaWduZWQgaW50KSkpIHsKLQkJCXB0X2Vycm9yX3JldHVybihyZWdzLCBFRkFVTFQpOwotCQkJZ290byBvdXRfdHNrOwotCQl9Ci0JCXB0X3N1Y2NfcmV0dXJuKHJlZ3MsIDApOwotCQlnb3RvIG91dF90c2s7Ci0JfQotCi0JY2FzZSBQVFJBQ0VfR0VURlBSRUdTNjQ6IHsKLQkJc3RydWN0IGZwcyB7Ci0JCQl1bnNpZ25lZCBpbnQgcmVnc1s2NF07Ci0JCQl1bnNpZ25lZCBsb25nIGZzcjsKLQkJfTsKLQkJc3RydWN0IGZwcyBfX3VzZXIgKmZwcyA9IChzdHJ1Y3QgZnBzIF9fdXNlciAqKSBhZGRyOwotCQl1bnNpZ25lZCBsb25nICpmcHJlZ3MgPSB0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+ZnByZWdzOwotCi0JCWlmIChjb3B5X3RvX3VzZXIoJmZwcy0+cmVnc1swXSwgZnByZWdzLAotCQkJCSAoNjQgKiBzaXplb2YodW5zaWduZWQgaW50KSkpIHx8Ci0JCSAgICBfX3B1dF91c2VyKHRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT54ZnNyWzBdLCAoJmZwcy0+ZnNyKSkpIHsKLQkJCXB0X2Vycm9yX3JldHVybihyZWdzLCBFRkFVTFQpOwotCQkJZ290byBvdXRfdHNrOwotCQl9Ci0JCXB0X3N1Y2NfcmV0dXJuKHJlZ3MsIDApOwotCQlnb3RvIG91dF90c2s7Ci0JfQotCi0JY2FzZSBQVFJBQ0VfU0VURlBSRUdTOiB7Ci0JCXN0cnVjdCBmcHMgewotCQkJdW5zaWduZWQgaW50IHJlZ3NbMzJdOwotCQkJdW5zaWduZWQgaW50IGZzcjsKLQkJCXVuc2lnbmVkIGludCBmbGFnczsKLQkJCXVuc2lnbmVkIGludCBleHRyYTsKLQkJCXVuc2lnbmVkIGludCBmcHFkOwotCQkJc3RydWN0IGZxIHsKLQkJCQl1bnNpZ25lZCBpbnQgaW5zbmFkZHI7Ci0JCQkJdW5zaWduZWQgaW50IGluc247Ci0JCQl9IGZwcVsxNl07Ci0JCX07Ci0JCXN0cnVjdCBmcHMgX191c2VyICpmcHMgPSAoc3RydWN0IGZwcyBfX3VzZXIgKikgYWRkcjsKLQkJdW5zaWduZWQgbG9uZyAqZnByZWdzID0gdGFza190aHJlYWRfaW5mbyhjaGlsZCktPmZwcmVnczsKLQkJdW5zaWduZWQgZnNyOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihmcHJlZ3MsICZmcHMtPnJlZ3NbMF0sCi0JCQkJICAgKDMyICogc2l6ZW9mKHVuc2lnbmVkIGludCkpKSB8fAotCQkgICAgX19nZXRfdXNlcihmc3IsICgmZnBzLT5mc3IpKSkgewotCQkJcHRfZXJyb3JfcmV0dXJuKHJlZ3MsIEVGQVVMVCk7Ci0JCQlnb3RvIG91dF90c2s7Ci0JCX0KLQkJdGFza190aHJlYWRfaW5mbyhjaGlsZCktPnhmc3JbMF0gJj0gMHhmZmZmZmZmZjAwMDAwMDAwVUw7Ci0JCXRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT54ZnNyWzBdIHw9IGZzcjsKLQkJaWYgKCEodGFza190aHJlYWRfaW5mbyhjaGlsZCktPmZwc2F2ZWRbMF0gJiBGUFJTX0ZFRikpCi0JCQl0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+Z3NyWzBdID0gMDsKLQkJdGFza190aHJlYWRfaW5mbyhjaGlsZCktPmZwc2F2ZWRbMF0gfD0gKEZQUlNfRkVGIHwgRlBSU19ETCk7Ci0JCXB0X3N1Y2NfcmV0dXJuKHJlZ3MsIDApOwotCQlnb3RvIG91dF90c2s7Ci0JfQotCi0JY2FzZSBQVFJBQ0VfU0VURlBSRUdTNjQ6IHsKLQkJc3RydWN0IGZwcyB7Ci0JCQl1bnNpZ25lZCBpbnQgcmVnc1s2NF07Ci0JCQl1bnNpZ25lZCBsb25nIGZzcjsKLQkJfTsKLQkJc3RydWN0IGZwcyBfX3VzZXIgKmZwcyA9IChzdHJ1Y3QgZnBzIF9fdXNlciAqKSBhZGRyOwotCQl1bnNpZ25lZCBsb25nICpmcHJlZ3MgPSB0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+ZnByZWdzOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcihmcHJlZ3MsICZmcHMtPnJlZ3NbMF0sCi0JCQkJICAgKDY0ICogc2l6ZW9mKHVuc2lnbmVkIGludCkpKSB8fAotCQkgICAgX19nZXRfdXNlcih0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+eGZzclswXSwgKCZmcHMtPmZzcikpKSB7Ci0JCQlwdF9lcnJvcl9yZXR1cm4ocmVncywgRUZBVUxUKTsKLQkJCWdvdG8gb3V0X3RzazsKLQkJfQotCQlpZiAoISh0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+ZnBzYXZlZFswXSAmIEZQUlNfRkVGKSkKLQkJCXRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5nc3JbMF0gPSAwOwotCQl0YXNrX3RocmVhZF9pbmZvKGNoaWxkKS0+ZnBzYXZlZFswXSB8PSAoRlBSU19GRUYgfCBGUFJTX0RMIHwgRlBSU19EVSk7Ci0JCXB0X3N1Y2NfcmV0dXJuKHJlZ3MsIDApOwotCQlnb3RvIG91dF90c2s7Ci0JfQorCWNhc2UgUFRSQUNFX1NFVEZQUkVHUzoKKwkJcmV0ID0gY29weV9yZWdzZXRfZnJvbV91c2VyKGNoaWxkLCB2aWV3LCBSRUdTRVRfRlAsCisJCQkJCSAgICAwICogc2l6ZW9mKHUzMiksCisJCQkJCSAgICAzMiAqIHNpemVvZih1MzIpLAorCQkJCQkgICAgJmZwcy0+cmVnc1swXSk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gY29weV9yZWdzZXRfZnJvbV91c2VyKGNoaWxkLCB2aWV3LCBSRUdTRVRfRlAsCisJCQkJCQkgICAgMzMgKiBzaXplb2YodTMyKSwKKwkJCQkJCSAgICAxICogc2l6ZW9mKHUzMiksCisJCQkJCQkgICAgJmZwcy0+ZnNyKTsKKwkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9SRUFEVEVYVDoKLQljYXNlIFBUUkFDRV9SRUFEREFUQTogewotCQlpbnQgcmVzID0gcHRyYWNlX3JlYWRkYXRhKGNoaWxkLCBhZGRyLAotCQkJCQkgIChjaGFyIF9fdXNlciAqKWFkZHIyLCBkYXRhKTsKLQkJaWYgKHJlcyA9PSBkYXRhKSB7Ci0JCQlwdF9zdWNjX3JldHVybihyZWdzLCAwKTsKLQkJCWdvdG8gb3V0X3RzazsKLQkJfQotCQlpZiAocmVzID49IDApCi0JCQlyZXMgPSAtRUlPOwotCQlwdF9lcnJvcl9yZXR1cm4ocmVncywgLXJlcyk7Ci0JCWdvdG8gb3V0X3RzazsKLQl9CisJY2FzZSBQVFJBQ0VfUkVBRERBVEE6CisJCXJldCA9IHB0cmFjZV9yZWFkZGF0YShjaGlsZCwgYWRkciwKKwkJCQkgICAgICAoY2hhciBfX3VzZXIgKilhZGRyMiwgZGF0YSk7CisJCWlmIChyZXQgPT0gZGF0YSkKKwkJCXJldCA9IDA7CisJCWVsc2UgaWYgKHJldCA+PSAwKQorCQkJcmV0ID0gLUVJTzsKKwkJYnJlYWs7CiAKIAljYXNlIFBUUkFDRV9XUklURVRFWFQ6Ci0JY2FzZSBQVFJBQ0VfV1JJVEVEQVRBOiB7Ci0JCWludCByZXMgPSBwdHJhY2Vfd3JpdGVkYXRhKGNoaWxkLCAoY2hhciBfX3VzZXIgKikgYWRkcjIsCi0JCQkJCSAgIGFkZHIsIGRhdGEpOwotCQlpZiAocmVzID09IGRhdGEpIHsKLQkJCXB0X3N1Y2NfcmV0dXJuKHJlZ3MsIDApOwotCQkJZ290byBvdXRfdHNrOwotCQl9Ci0JCWlmIChyZXMgPj0gMCkKLQkJCXJlcyA9IC1FSU87Ci0JCXB0X2Vycm9yX3JldHVybihyZWdzLCAtcmVzKTsKLQkJZ290byBvdXRfdHNrOwotCX0KLQljYXNlIFBUUkFDRV9TWVNDQUxMOiAvKiBjb250aW51ZSBhbmQgc3RvcCBhdCAocmV0dXJuIGZyb20pIHN5c2NhbGwgKi8KLQkJYWRkciA9IDE7CisJY2FzZSBQVFJBQ0VfV1JJVEVEQVRBOgorCQlyZXQgPSBwdHJhY2Vfd3JpdGVkYXRhKGNoaWxkLCAoY2hhciBfX3VzZXIgKikgYWRkcjIsCisJCQkJICAgICAgIGFkZHIsIGRhdGEpOworCQlpZiAocmV0ID09IGRhdGEpCisJCQlyZXQgPSAwOworCQllbHNlIGlmIChyZXQgPj0gMCkKKwkJCXJldCA9IC1FSU87CisJCWJyZWFrOwogCi0JY2FzZSBQVFJBQ0VfQ09OVDogeyAvKiByZXN0YXJ0IGFmdGVyIHNpZ25hbC4gKi8KLQkJaWYgKCF2YWxpZF9zaWduYWwoZGF0YSkpIHsKLQkJCXB0X2Vycm9yX3JldHVybihyZWdzLCBFSU8pOwotCQkJZ290byBvdXRfdHNrOwotCQl9Ci0KLQkJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX1NZU0NBTEwpIHsKLQkJCXNldF90c2tfdGhyZWFkX2ZsYWcoY2hpbGQsIFRJRl9TWVNDQUxMX1RSQUNFKTsKLQkJfSBlbHNlIHsKLQkJCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOwotCQl9Ci0KLQkJY2hpbGQtPmV4aXRfY29kZSA9IGRhdGE7Ci0jaWZkZWYgREVCVUdfUFRSQUNFCi0JCXByaW50aygiQ09OVDogJXMgWyVkXTogc2V0IGV4aXRfY29kZSA9ICV4ICVseCAlbHhcbiIsIGNoaWxkLT5jb21tLAotCQkJY2hpbGQtPnBpZCwgY2hpbGQtPmV4aXRfY29kZSwKLQkJCXRhc2tfcHRfcmVncyhjaGlsZCktPnRwYywKLQkJCXRhc2tfcHRfcmVncyhjaGlsZCktPnRucGMpOwotCQkgICAgICAgCi0jZW5kaWYKLQkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKLQkJcHRfc3VjY19yZXR1cm4ocmVncywgMCk7Ci0JCWdvdG8gb3V0X3RzazsKLQl9Ci0KLS8qCi0gKiBtYWtlIHRoZSBjaGlsZCBleGl0LiAgQmVzdCBJIGNhbiBkbyBpcyBzZW5kIGl0IGEgc2lna2lsbC4gCi0gKiBwZXJoYXBzIGl0IHNob3VsZCBiZSBwdXQgaW4gdGhlIHN0YXR1cyB0aGF0IGl0IHdhbnRzIHRvIAotICogZXhpdC4KLSAqLwotCWNhc2UgUFRSQUNFX0tJTEw6IHsKLQkJaWYgKGNoaWxkLT5leGl0X3N0YXRlID09IEVYSVRfWk9NQklFKSB7CS8qIGFscmVhZHkgZGVhZCAqLwotCQkJcHRfc3VjY19yZXR1cm4ocmVncywgMCk7Ci0JCQlnb3RvIG91dF90c2s7Ci0JCX0KLQkJY2hpbGQtPmV4aXRfY29kZSA9IFNJR0tJTEw7Ci0JCXdha2VfdXBfcHJvY2VzcyhjaGlsZCk7Ci0JCXB0X3N1Y2NfcmV0dXJuKHJlZ3MsIDApOwotCQlnb3RvIG91dF90c2s7Ci0JfQotCi0JY2FzZSBQVFJBQ0VfU1VOREVUQUNIOiB7IC8qIGRldGFjaCBhIHByb2Nlc3MgdGhhdCB3YXMgYXR0YWNoZWQuICovCi0JCWludCBlcnJvciA9IHB0cmFjZV9kZXRhY2goY2hpbGQsIGRhdGEpOwotCQlpZiAoZXJyb3IpIHsKLQkJCXB0X2Vycm9yX3JldHVybihyZWdzLCBFSU8pOwotCQkJZ290byBvdXRfdHNrOwotCQl9Ci0JCXB0X3N1Y2NfcmV0dXJuKHJlZ3MsIDApOwotCQlnb3RvIG91dF90c2s7Ci0JfQotCi0JLyogUFRSQUNFX0RVTVBDT1JFIHVuc3VwcG9ydGVkLi4uICovCi0KLQljYXNlIFBUUkFDRV9HRVRFVkVOVE1TRzogewotCQlpbnQgZXJyOwotCi0JCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVCkpCi0JCQllcnIgPSBwdXRfdXNlcihjaGlsZC0+cHRyYWNlX21lc3NhZ2UsCi0JCQkJICAgICAgICh1bnNpZ25lZCBpbnQgX191c2VyICopIGRhdGEpOwotCQllbHNlCi0JCQllcnIgPSBwdXRfdXNlcihjaGlsZC0+cHRyYWNlX21lc3NhZ2UsCi0JCQkJICAgICAgICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBkYXRhKTsKLQkJaWYgKGVycikKLQkJCXB0X2Vycm9yX3JldHVybihyZWdzLCAtZXJyKTsKLQkJZWxzZQotCQkJcHRfc3VjY19yZXR1cm4ocmVncywgMCk7CisJZGVmYXVsdDoKKwkJcmV0ID0gY29tcGF0X3B0cmFjZV9yZXF1ZXN0KGNoaWxkLCByZXF1ZXN0LCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAJfQogCi0JZGVmYXVsdDogewotCQlpbnQgZXJyID0gcHRyYWNlX3JlcXVlc3QoY2hpbGQsIHJlcXVlc3QsIGFkZHIsIGRhdGEpOwotCQlpZiAoZXJyKQotCQkJcHRfZXJyb3JfcmV0dXJuKHJlZ3MsIC1lcnIpOwotCQllbHNlCi0JCQlwdF9zdWNjX3JldHVybihyZWdzLCAwKTsKLQkJZ290byBvdXRfdHNrOworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBmcHMgeworCXVuc2lnbmVkIGludCByZWdzWzY0XTsKKwl1bnNpZ25lZCBsb25nIGZzcjsKK307CisKK2xvbmcgYXJjaF9wdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyByZXF1ZXN0LCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKK3sKKwljb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXRfdmlldyAqdmlldyA9IHRhc2tfdXNlcl9yZWdzZXRfdmlldyhjaGlsZCk7CisJc3RydWN0IHB0X3JlZ3MgX191c2VyICpwcmVncyA9IChzdHJ1Y3QgcHRfcmVncyBfX3VzZXIgKikgYWRkcjsKKwl1bnNpZ25lZCBsb25nIGFkZHIyID0gdGFza19wdF9yZWdzKGN1cnJlbnQpLT51X3JlZ3NbVVJFR19JNF07CisJc3RydWN0IGZwcyBfX3VzZXIgKmZwcyA9IChzdHJ1Y3QgZnBzIF9fdXNlciAqKSBhZGRyOworCWludCByZXQ7CisKKwlzd2l0Y2ggKHJlcXVlc3QpIHsKKwljYXNlIFBUUkFDRV9QRUVLVVNSOgorCQlyZXQgPSAoYWRkciAhPSAwKSA/IC1FSU8gOiAwOworCQlicmVhazsKKworCWNhc2UgUFRSQUNFX0dFVFJFR1M2NDoKKwkJcmV0ID0gY29weV9yZWdzZXRfdG9fdXNlcihjaGlsZCwgdmlldywgUkVHU0VUX0dFTkVSQUwsCisJCQkJCSAgMSAqIHNpemVvZih1NjQpLAorCQkJCQkgIDE1ICogc2l6ZW9mKHU2NCksCisJCQkJCSAgJnByZWdzLT51X3JlZ3NbMF0pOworCQlpZiAoIXJldCkgeworCQkJLyogWFhYIGRvZXNuJ3QgaGFuZGxlICd5JyByZWdpc3RlciBjb3JyZWN0bHkgWFhYICovCisJCQlyZXQgPSBjb3B5X3JlZ3NldF90b191c2VyKGNoaWxkLCB2aWV3LCBSRUdTRVRfR0VORVJBTCwKKwkJCQkJCSAgMzIgKiBzaXplb2YodTY0KSwKKwkJCQkJCSAgNCAqIHNpemVvZih1NjQpLAorCQkJCQkJICAmcHJlZ3MtPnRzdGF0ZSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFBUUkFDRV9TRVRSRUdTNjQ6CisJCXJldCA9IGNvcHlfcmVnc2V0X2Zyb21fdXNlcihjaGlsZCwgdmlldywgUkVHU0VUX0dFTkVSQUwsCisJCQkJCSAgICAxICogc2l6ZW9mKHU2NCksCisJCQkJCSAgICAxNSAqIHNpemVvZih1NjQpLAorCQkJCQkgICAgJnByZWdzLT51X3JlZ3NbMF0pOworCQlpZiAoIXJldCkgeworCQkJLyogWFhYIGRvZXNuJ3QgaGFuZGxlICd5JyByZWdpc3RlciBjb3JyZWN0bHkgWFhYICovCisJCQlyZXQgPSBjb3B5X3JlZ3NldF9mcm9tX3VzZXIoY2hpbGQsIHZpZXcsIFJFR1NFVF9HRU5FUkFMLAorCQkJCQkJICAgIDMyICogc2l6ZW9mKHU2NCksCisJCQkJCQkgICAgNCAqIHNpemVvZih1NjQpLAorCQkJCQkJICAgICZwcmVncy0+dHN0YXRlKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUFRSQUNFX0dFVEZQUkVHUzY0OgorCQlyZXQgPSBjb3B5X3JlZ3NldF90b191c2VyKGNoaWxkLCB2aWV3LCBSRUdTRVRfRlAsCisJCQkJCSAgMCAqIHNpemVvZih1NjQpLAorCQkJCQkgIDMzICogc2l6ZW9mKHU2NCksCisJCQkJCSAgZnBzKTsKKwkJYnJlYWs7CisKKwljYXNlIFBUUkFDRV9TRVRGUFJFR1M2NDoKKwkJcmV0ID0gY29weV9yZWdzZXRfdG9fdXNlcihjaGlsZCwgdmlldywgUkVHU0VUX0ZQLAorCQkJCQkgIDAgKiBzaXplb2YodTY0KSwKKwkJCQkJICAzMyAqIHNpemVvZih1NjQpLAorCQkJCQkgIGZwcyk7CisJCWJyZWFrOworCisJY2FzZSBQVFJBQ0VfUkVBRFRFWFQ6CisJY2FzZSBQVFJBQ0VfUkVBRERBVEE6CisJCXJldCA9IHB0cmFjZV9yZWFkZGF0YShjaGlsZCwgYWRkciwKKwkJCQkgICAgICAoY2hhciBfX3VzZXIgKilhZGRyMiwgZGF0YSk7CisJCWlmIChyZXQgPT0gZGF0YSkKKwkJCXJldCA9IDA7CisJCWVsc2UgaWYgKHJldCA+PSAwKQorCQkJcmV0ID0gLUVJTzsKKwkJYnJlYWs7CisKKwljYXNlIFBUUkFDRV9XUklURVRFWFQ6CisJY2FzZSBQVFJBQ0VfV1JJVEVEQVRBOgorCQlyZXQgPSBwdHJhY2Vfd3JpdGVkYXRhKGNoaWxkLCAoY2hhciBfX3VzZXIgKikgYWRkcjIsCisJCQkJICAgICAgIGFkZHIsIGRhdGEpOworCQlpZiAocmV0ID09IGRhdGEpCisJCQlyZXQgPSAwOworCQllbHNlIGlmIChyZXQgPj0gMCkKKwkJCXJldCA9IC1FSU87CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0ID0gcHRyYWNlX3JlcXVlc3QoY2hpbGQsIHJlcXVlc3QsIGFkZHIsIGRhdGEpOworCQlicmVhazsKIAl9Ci0JfQotb3V0X3RzazoKLQlpZiAoY2hpbGQpCi0JCXB1dF90YXNrX3N0cnVjdChjaGlsZCk7Ci1vdXQ6Ci0JdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIHJldDsKIH0KIAogYXNtbGlua2FnZSB2b2lkIHN5c2NhbGxfdHJhY2Uoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBzeXNjYWxsX2V4aXRfcCkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2V0dXAuYwppbmRleCBhODEzNDQxLi41OTY0ZDg2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zZXR1cC5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC91c2VyLmg+Ci0jaW5jbHVkZSA8bGludXgvYS5vdXQuaD4KICNpbmNsdWRlIDxsaW51eC9zY3JlZW5faW5mby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zcGFyYzY0X2tzeW1zLmMKaW5kZXggODY0OTYzNS4uNjhkYjA4OSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zcGFyYzY0X2tzeW1zLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zcGFyYzY0X2tzeW1zLmMKQEAgLTUzLDcgKzUzLDYgQEAKICNpbmNsdWRlIDxhc20vZWJ1cy5oPgogI2luY2x1ZGUgPGFzbS9pc2EuaD4KICNlbmRpZgotI2luY2x1ZGUgPGFzbS9hLm91dC5oPgogI2luY2x1ZGUgPGFzbS9uczg3MzAzLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CiAjaW5jbHVkZSA8YXNtL2NwdWRhdGEuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzX3NwYXJjLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3N5c19zcGFyYy5jCmluZGV4IGM1NjU3M2EuLjEzNGQ4MDEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzX3NwYXJjLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXNfc3BhcmMuYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3V0cmFwLmg+CiAjaW5jbHVkZSA8YXNtL3BlcmZjdHIuaD4KLSNpbmNsdWRlIDxhc20vYS5vdXQuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAKIC8qICNkZWZpbmUgREVCVUdfVU5JTVBfU1lTQ0FMTCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXNfc3BhcmMzMi5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXNfc3BhcmMzMi5jCmluZGV4IDk4YzQ2ODguLmRlYWJhMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzX3NwYXJjMzIuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3N5c19zcGFyYzMyLmMKQEAgLTU3LDcgKzU3LDYgQEAKICNpbmNsdWRlIDxhc20vZnB1bWFjcm8uaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+Ci0jaW5jbHVkZSA8YXNtL2Eub3V0Lmg+CiAjaW5jbHVkZSA8YXNtL2NvbXBhdF9zaWduYWwuaD4KIAogYXNtbGlua2FnZSBsb25nIHN5czMyX2Nob3duMTYoY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwgdTE2IHVzZXIsIHUxNiBncm91cCkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzdGJscy5TIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXN0YmxzLlMKaW5kZXggYWRjNjJmNC4uNmI5YjcxOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXN0YmxzLlMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXN0YmxzLlMKQEAgLTIzLDcgKzIzLDcgQEAKIC8qMTAqLyAgLndvcmQgc3lzX3VubGluaywgc3Vub3NfZXhlY3YsIHN5c19jaGRpciwgc3lzMzJfY2hvd24xNiwgc3lzMzJfbWtub2QKIC8qMTUqLwkud29yZCBzeXNfY2htb2QsIHN5czMyX2xjaG93bjE2LCBzcGFyY19icmssIHN5czMyX3BlcmZjdHIsIHN5czMyX2xzZWVrCiAvKjIwKi8JLndvcmQgc3lzX2dldHBpZCwgc3lzX2NhcGdldCwgc3lzX2NhcHNldCwgc3lzMzJfc2V0dWlkMTYsIHN5czMyX2dldHVpZDE2Ci0vKjI1Ki8JLndvcmQgc3lzMzJfdm1zcGxpY2UsIHN5c19wdHJhY2UsIHN5c19hbGFybSwgc3lzMzJfc2lnYWx0c3RhY2ssIHN5czMyX3BhdXNlCisvKjI1Ki8JLndvcmQgc3lzMzJfdm1zcGxpY2UsIGNvbXBhdF9zeXNfcHRyYWNlLCBzeXNfYWxhcm0sIHN5czMyX3NpZ2FsdHN0YWNrLCBzeXMzMl9wYXVzZQogLyozMCovCS53b3JkIGNvbXBhdF9zeXNfdXRpbWUsIHN5c19sY2hvd24sIHN5c19mY2hvd24sIHN5czMyX2FjY2Vzcywgc3lzMzJfbmljZQogCS53b3JkIHN5c19jaG93biwgc3lzX3N5bmMsIHN5czMyX2tpbGwsIGNvbXBhdF9zeXNfbmV3c3RhdCwgc3lzMzJfc2VuZGZpbGUKIC8qNDAqLwkud29yZCBjb21wYXRfc3lzX25ld2xzdGF0LCBzeXNfZHVwLCBzeXNfcGlwZSwgY29tcGF0X3N5c190aW1lcywgc3lzX2dldHVpZApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L21tL2luaXQuYyBiL2FyY2gvc3BhcmM2NC9tbS9pbml0LmMKaW5kZXggNTIzZTk5My4uZTcyNmM0NSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L21tL2luaXQuYworKysgYi9hcmNoL3NwYXJjNjQvbW0vaW5pdC5jCkBAIC05OTcsNyArOTk3LDcgQEAKIAkJcHJvbV9wcmludGYoInJlc2VydmVfYm9vdG1lbShpbml0cmQpOiBiYXNlWyVsbHhdIHNpemVbJWx4XVxuIiwKIAkJCWluaXRyZF9zdGFydCwgaW5pdHJkX2VuZCk7CiAjZW5kaWYKLQkJcmVzZXJ2ZV9ib290bWVtKGluaXRyZF9zdGFydCwgc2l6ZSk7CisJCXJlc2VydmVfYm9vdG1lbShpbml0cmRfc3RhcnQsIHNpemUsIEJPT1RNRU1fREVGQVVMVCk7CiAKIAkJaW5pdHJkX3N0YXJ0ICs9IFBBR0VfT0ZGU0VUOwogCQlpbml0cmRfZW5kICs9IFBBR0VfT0ZGU0VUOwpAQCAtMTAwNyw3ICsxMDA3LDcgQEAKICNpZmRlZiBDT05GSUdfREVCVUdfQk9PVE1FTQogCXByb21fcHJpbnRmKCJyZXNlcnZlX2Jvb3RtZW0oa2VybmVsKTogYmFzZVslbHhdIHNpemVbJWx4XVxuIiwga2Vybl9iYXNlLCBrZXJuX3NpemUpOwogI2VuZGlmCi0JcmVzZXJ2ZV9ib290bWVtKGtlcm5fYmFzZSwga2Vybl9zaXplKTsKKwlyZXNlcnZlX2Jvb3RtZW0oa2Vybl9iYXNlLCBrZXJuX3NpemUsIEJPT1RNRU1fREVGQVVMVCk7CiAJKnBhZ2VzX2F2YWlsIC09IFBBR0VfQUxJR04oa2Vybl9zaXplKSA+PiBQQUdFX1NISUZUOwogCiAJLyogQWRkIGJhY2sgaW4gdGhlIGluaXRtZW0gcGFnZXMuICovCkBAIC0xMDI0LDcgKzEwMjQsNyBAQAogCXByb21fcHJpbnRmKCJyZXNlcnZlX2Jvb3RtZW0oYm9vdG1hcCk6IGJhc2VbJWx4XSBzaXplWyVseF1cbiIsCiAJCSAgICAoYm9vdG1hcF9wZm4gPDwgUEFHRV9TSElGVCksIHNpemUpOwogI2VuZGlmCi0JcmVzZXJ2ZV9ib290bWVtKChib290bWFwX3BmbiA8PCBQQUdFX1NISUZUKSwgc2l6ZSk7CisJcmVzZXJ2ZV9ib290bWVtKChib290bWFwX3BmbiA8PCBQQUdFX1NISUZUKSwgc2l6ZSwgQk9PVE1FTV9ERUZBVUxUKTsKIAogCWZvciAoaSA9IDA7IGkgPCBwYXZhaWxfZW50czsgaSsrKSB7CiAJCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBlbmRfcGZuOwpAQCAtMTQ4OSw3ICsxNDg5LDcgQEAKIAkJCQkJZ290byBkb19uZXh0X3BhZ2U7CiAJCQkJfQogCQkJfQotCQkJcmVzZXJ2ZV9ib290bWVtKG9sZF9zdGFydCwgUEFHRV9TSVpFKTsKKwkJCXJlc2VydmVfYm9vdG1lbShvbGRfc3RhcnQsIFBBR0VfU0laRSwgQk9PVE1FTV9ERUZBVUxUKTsKIAogCQlkb19uZXh0X3BhZ2U6CiAJCQlvbGRfc3RhcnQgKz0gUEFHRV9TSVpFOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L3Byb20vaW5pdC5jIGIvYXJjaC9zcGFyYzY0L3Byb20vaW5pdC5jCmluZGV4IDFjMGRiODQuLjg3ZTdjN2UgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9wcm9tL2luaXQuYworKysgYi9hcmNoL3NwYXJjNjQvcHJvbS9pbml0LmMKQEAgLTQ4LDcgKzQ4LDEwIEBACiAJcHJvbV9nZXRzdHJpbmcobm9kZSwgInZlcnNpb24iLCBwcm9tX3ZlcnNpb24sIHNpemVvZihwcm9tX3ZlcnNpb24pKTsKIAogCXByb21fcHJpbnRmKCJcbiIpOworfQogCit2b2lkIF9faW5pdCBwcm9tX2luaXRfcmVwb3J0KHZvaWQpCit7CiAJcHJpbnRrKCJQUk9NTElCOiBTdW4gSUVFRSBCb290IFByb20gJyVzJ1xuIiwgcHJvbV92ZXJzaW9uKTsKIAlwcmludGsoIlBST01MSUI6IFJvb3Qgbm9kZSBjb21wYXRpYmxlOiAlc1xuIiwgcHJvbV9yb290X2NvbXBhdGlibGUpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L3NvbGFyaXMvbWlzYy5jIGIvYXJjaC9zcGFyYzY0L3NvbGFyaXMvbWlzYy5jCmluZGV4IGM4NmNiMzAuLmQzZTQ4ZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9zb2xhcmlzL21pc2MuYworKysgYi9hcmNoL3NwYXJjNjQvc29sYXJpcy9taXNjLmMKQEAgLTQxNSw3ICs0MTUsNyBAQAogCQogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSAwOiAvKiBnZXRwZ3JwICovCi0JCXJldHVybiB0YXNrX3BncnBfbnIoY3VycmVudCk7CisJCXJldHVybiB0YXNrX3BncnBfdm5yKGN1cnJlbnQpOwogCWNhc2UgMTogLyogc2V0cGdycCAqLwogCQl7CiAJCQlpbnQgKCpzeXNfc2V0cGdpZCkocGlkX3QscGlkX3QpID0KQEAgLTQyNiw3ICs0MjYsNyBAQAogCQkJcmV0ID0gc3lzX3NldHBnaWQoMCwgMCk7CiAJCQlpZiAocmV0KSByZXR1cm4gcmV0OwogCQkJcHJvY19jbGVhcl90dHkoY3VycmVudCk7Ci0JCQlyZXR1cm4gdGFza19wZ3JwX25yKGN1cnJlbnQpOworCQkJcmV0dXJuIHRhc2tfcGdycF92bnIoY3VycmVudCk7CiAJCX0KIAljYXNlIDI6IC8qIGdldHNpZCAqLwogCQl7CmRpZmYgLS1naXQgYS9hcmNoL3VtL0tjb25maWcgYi9hcmNoL3VtL0tjb25maWcKaW5kZXggOTllNTFkMC4uZGJhOGUwNSAxMDA2NDQKLS0tIGEvYXJjaC91bS9LY29uZmlnCisrKyBiL2FyY2gvdW0vS2NvbmZpZwpAQCAtMjAzLDE3ICsyMDMsNiBAQAogCWRlcGVuZHMgb24gU01QCiAJZGVmYXVsdCAiMzIiCiAKLWNvbmZpZyBORVNUX0xFVkVMCi0JaW50ICJOZXN0aW5nIGxldmVsIgotCWRlZmF1bHQgIjAiCi0JaGVscAotICAgICAgICAgIFRoaXMgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgbGF5ZXJzIG9mIFVNTHMgdGhhdCB0aGlzIFVNTCB3aWxsIGJlIHJ1bgotICAgICAgICAgIGluLiAgTm9ybWFsbHksIHRoaXMgaXMgemVybywgbWVhbmluZyB0aGF0IGl0IHdpbGwgcnVuIGRpcmVjdGx5IG9uIHRoZQotICAgICAgICAgIGhvc3QuICBTZXR0aW5nIGl0IHRvIG9uZSB3aWxsIGJ1aWxkIGEgVU1MIHRoYXQgY2FuIHJ1biBpbnNpZGUgYSBVTUwKLSAgICAgICAgICB0aGF0IGlzIHJ1bm5pbmcgb24gdGhlIGhvc3QuICBHZW5lcmFsbHksIGlmIHlvdSBpbnRlbmQgdGhpcyBVTUwgdG8gcnVuCi0gICAgICAgICAgaW5zaWRlIGFub3RoZXIgVU1MLCBzZXQgQ09ORklHX05FU1RfTEVWRUwgdG8gb25lIG1vcmUgdGhhbiB0aGUgaG9zdAotICAgICAgICAgIFVNTC4KLQogY29uZmlnIEhJR0hNRU0KIAlib29sICJIaWdobWVtIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiAhNjRCSVQgJiYgRVhQRVJJTUVOVEFMCmRpZmYgLS1naXQgYS9hcmNoL3VtL0tjb25maWcuaTM4NiBiL2FyY2gvdW0vS2NvbmZpZy5pMzg2CmluZGV4IDcxN2Y1ZDMuLjNjZDhhMDQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vS2NvbmZpZy5pMzg2CisrKyBiL2FyY2gvdW0vS2NvbmZpZy5pMzg2CkBAIC0yMyw0MyArMjMsNiBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAotY2hvaWNlCi0JcHJvbXB0ICJIb3N0IG1lbW9yeSBzcGxpdCIKLQlkZWZhdWx0IEhPU1RfVk1TUExJVF8zRwotCWhlbHAKLSAgICAgICAgVGhpcyBpcyBuZWVkZWQgd2hlbiB0aGUgaG9zdCBrZXJuZWwgb24gd2hpY2ggeW91IHJ1biBoYXMgYSBub24tZGVmYXVsdAotCShsaWtlIDJHLzJHKSBtZW1vcnkgc3BsaXQsIGluc3RlYWQgb2YgdGhlIGN1c3RvbWFyeSAzRy8xRy4gSWYgeW91IGRpZAotCW5vdCByZWNvbXBpbGUgeW91ciBvd24ga2VybmVsIGJ1dCB1c2UgdGhlIGRlZmF1bHQgZGlzdHJvJ3Mgb25lLCB5b3UgY2FuCi0Jc2FmZWx5IGFjY2VwdCB0aGUgIkRlZmF1bHQgc3BsaXQiIG9wdGlvbi4KLQotCUl0IGNhbiBiZSBlbmFibGVkIG9uIHJlY2VudCAoPj0yLjYuMTYtcmMyKSB2YW5pbGxhIGtlcm5lbHMgdmlhCi0JQ09ORklHX1ZNX1NQTElUXyosIG9yIG9uIHByZXZpb3VzIGtlcm5lbHMgd2l0aCBzcGVjaWFsIHBhdGNoZXMgKC1jawotCXBhdGNoc2V0IGJ5IENvbiBLb2xpdmFzLCBvciBvdGhlciBvbmVzKSAtIG9wdGlvbiBuYW1lcyBtYXRjaCBjbG9zZWx5IHRoZQotCWhvc3QgQ09ORklHX1ZNX1NQTElUXyogb25lcy4KLQotCUEgbG93ZXIgc2V0dGluZyAod2hlcmUgMUcvM0cgaXMgbG93ZXN0IGFuZCAzRy8xRyBpcyBoaWdoZXIpIHdpbGwKLQl0b2xlcmF0ZSBldmVuIG1vcmUgIm5vcm1hbCIgaG9zdCBrZXJuZWxzLCBidXQgYW4gaGlnaGVyIHNldHRpbmcgd2lsbCBiZQotCXN0cmljdGVyLgotCi0JU28sIGlmIHlvdSBkbyBub3Qga25vdyB3aGF0IHRvIGRvIGhlcmUsIHNheSAnRGVmYXVsdCBzcGxpdCcuCi0KLWNvbmZpZyBIT1NUX1ZNU1BMSVRfM0cKLQlib29sICJEZWZhdWx0IHNwbGl0ICgzRy8xRyB1c2VyL2tlcm5lbCBob3N0IHNwbGl0KSIKLWNvbmZpZyBIT1NUX1ZNU1BMSVRfM0dfT1BUCi0JYm9vbCAiM0cvMUcgdXNlci9rZXJuZWwgaG9zdCBzcGxpdCAoZm9yIGZ1bGwgMUcgbG93IG1lbW9yeSkiCi1jb25maWcgSE9TVF9WTVNQTElUXzJHCi0JYm9vbCAiMkcvMkcgdXNlci9rZXJuZWwgaG9zdCBzcGxpdCIKLWNvbmZpZyBIT1NUX1ZNU1BMSVRfMUcKLQlib29sICIxRy8zRyB1c2VyL2tlcm5lbCBob3N0IHNwbGl0IgotZW5kY2hvaWNlCi0KLWNvbmZpZyBUT1BfQUREUgotCWhleAotCWRlZmF1bHQgMHhCMDAwMDAwMCBpZiBIT1NUX1ZNU1BMSVRfM0dfT1BUCi0JZGVmYXVsdCAweDc4MDAwMDAwIGlmIEhPU1RfVk1TUExJVF8yRwotCWRlZmF1bHQgMHg0MDAwMDAwMCBpZiBIT1NUX1ZNU1BMSVRfMUcKLQlkZWZhdWx0IDB4QzAwMDAwMDAKLQogY29uZmlnIDNfTEVWRUxfUEdUQUJMRVMKIAlib29sICJUaHJlZS1sZXZlbCBwYWdldGFibGVzIChFWFBFUklNRU5UQUwpIgogCWRlZmF1bHQgbgpAQCAtODQsMyArNDcsNSBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIEFSQ0hfU1VQUE9SVFNfQU9VVAorCWRlZl9ib29sIHkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vS2NvbmZpZy54ODZfNjQgYi9hcmNoL3VtL0tjb25maWcueDg2XzY0CmluZGV4IGQ2MzJlOWEuLjY1MzNiMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vS2NvbmZpZy54ODZfNjQKKysrIGIvYXJjaC91bS9LY29uZmlnLng4Nl82NApAQCAtMTUsMTAgKzE1LDYgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKLWNvbmZpZyBUT1BfQUREUgotIAloZXgKLQlkZWZhdWx0IDB4N2ZjMDAwMDAwMAotCiBjb25maWcgM19MRVZFTF9QR1RBQkxFUwogICAgICAgIGJvb2wKICAgICAgICBkZWZhdWx0IHkKQEAgLTM5LDMgKzM1LDUgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBBUkNIX1NVUFBPUlRTX0FPVVQKKwlkZWZfYm9vbCB5CmRpZmYgLS1naXQgYS9hcmNoL3VtL01ha2VmaWxlIGIvYXJjaC91bS9NYWtlZmlsZQppbmRleCBjYjRhZjliLi5kYmVhYjE1IDEwMDY0NAotLS0gYS9hcmNoL3VtL01ha2VmaWxlCisrKyBiL2FyY2gvdW0vTWFrZWZpbGUKQEAgLTc5LDEzICs3OSw2IEBACiBLQlVJTERfQ0ZMQUdTICs9ICQoS0VSTkVMX0RFRklORVMpCiBLQlVJTERfQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLWZuby11bml0LWF0LWEtdGltZSwpCiAKLSMgVGhlc2UgYXJlIG5lZWRlZCBmb3IgY2xlYW4gYW5kIG1ycHJvcGVyLCBzaW5jZSBpbiB0aGF0IGNhc2UgLmNvbmZpZyBpcyBub3QKLSMgaW5jbHVkZWQ7IHRoZSB2YWx1ZXMgaGVyZSBhcmUgbWVhbmluZ2xlc3MKLQotQ09ORklHX05FU1RfTEVWRUwgPz0gMAotCi1TSVpFID0gKCQoQ09ORklHX05FU1RfTEVWRUwpICogMHgyMDAwMDAwMCkKLQogUEhPTlkgKz0gbGludXgKIAogYWxsOiBsaW51eApAQCAtMTIwLDEwICsxMTMsNiBAQAogQ09ORklHX0tFUk5FTF9TVEFDS19PUkRFUiA/PSAyCiBTVEFDS19TSVpFIDo9ICQoc2hlbGwgZWNobyAkJFsgNDA5NiAqICgxIDw8ICQoQ09ORklHX0tFUk5FTF9TVEFDS19PUkRFUikpIF0gKQogCi1pZm5kZWYgU1RBUlQKLSAgU1RBUlQgPSAkKHNoZWxsIGVjaG8gJCRbICQoVE9QX0FERFIpIC0gJChTSVpFKSBdICkKLWVuZGlmCi0KIENQUEZMQUdTX3ZtbGludXgubGRzID0gLVUkKFNVQkFSQ0gpIC1EU1RBUlQ9JChTVEFSVCkgLURFTEZfQVJDSD0kKEVMRl9BUkNIKSBcCiAJLURFTEZfRk9STUFUPSIkKEVMRl9GT1JNQVQpIiAtREtFUk5FTF9TVEFDS19TSVpFPSQoU1RBQ0tfU0laRSkKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kZWZjb25maWcgYi9hcmNoL3VtL2RlZmNvbmZpZwppbmRleCA4NmRiMjg2Li41OTIxNWJjIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RlZmNvbmZpZworKysgYi9hcmNoL3VtL2RlZmNvbmZpZwpAQCAtNTYsOCArNTYsNiBAQAogQ09ORklHX1VNTF9YODY9eQogIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1NFTUFQSE9SRV9TTEVFUEVSUz15Ci0jIENPTkZJR19IT1NUXzJHXzJHIGlzIG5vdCBzZXQKLUNPTkZJR19UT1BfQUREUj0weGMwMDAwMDAwCiAjIENPTkZJR18zX0xFVkVMX1BHVEFCTEVTIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0hBU19TQ19TSUdOQUxTPXkKIENPTkZJR19BUkNIX1JFVVNFX0hPU1RfVlNZU0NBTExfQVJFQT15CkBAIC04MSw3ICs3OSw2IEBACiAjIENPTkZJR19IUFBGUyBpcyBub3Qgc2V0CiBDT05GSUdfTUNPTlNPTEU9eQogQ09ORklHX01BR0lDX1NZU1JRPXkKLUNPTkZJR19ORVNUX0xFVkVMPTAKICMgQ09ORklHX0hJR0hNRU0gaXMgbm90IHNldAogQ09ORklHX0tFUk5FTF9TVEFDS19PUkRFUj0wCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hcy1sYXlvdXQuaCBiL2FyY2gvdW0vaW5jbHVkZS9hcy1sYXlvdXQuaAppbmRleCA2MDZiYjVjLi5jYWM1NDJkIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvYXMtbGF5b3V0LmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL2FzLWxheW91dC5oCkBAIC01Nyw2ICs1Nyw4IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBfdW5wcm90ZWN0ZWRfZW5kOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYnJrX3N0YXJ0OwogCitleHRlcm4gdW5zaWduZWQgbG9uZyBob3N0X3Rhc2tfc2l6ZTsKKwogZXh0ZXJuIGludCBsaW51eF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndik7CiAKIGV4dGVybiB2b2lkICgqc2lnX2luZm9bXSkoaW50LCBzdHJ1Y3QgdW1sX3B0X3JlZ3MgKik7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvb3MuaCBiL2FyY2gvdW0vaW5jbHVkZS9vcy5oCmluZGV4IDBiNmI2MjcuLjMyYzc5OWUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9vcy5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9vcy5oCkBAIC0yOTUsNiArMjk1LDkgQEAKIGV4dGVybiBpbnQgb3NfYXJjaF9wcmN0bChpbnQgcGlkLCBpbnQgY29kZSwgdW5zaWduZWQgbG9uZyAqYWRkcik7CiAKIC8qIHR0eS5jICovCi1pbnQgZ2V0X3B0eSh2b2lkKTsKK2V4dGVybiBpbnQgZ2V0X3B0eSh2b2lkKTsKKworLyogc3lzLSRBUkNIL3Rhc2tfc2l6ZS5jICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBvc19nZXRfdGFza19zaXplKHZvaWQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS90ZW1wZmlsZS5oIGIvYXJjaC91bS9pbmNsdWRlL3RlbXBmaWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NDFlYWMuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3RlbXBmaWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0vKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1RFTVBGSUxFX0hfXwotI2RlZmluZSBfX1RFTVBGSUxFX0hfXwotCi1leHRlcm4gaW50IG1ha2VfdGVtcGZpbGUoY29uc3QgY2hhciAqdGVtcGxhdGUsIGNoYXIgKip0ZW1wbmFtZSwgaW50IGRvX3VubGluayk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3VtX21tdS5oIGIvYXJjaC91bS9pbmNsdWRlL3VtX21tdS5oCmluZGV4IDgyODY1ZmMuLmY1NzVmZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS91bV9tbXUuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvdW1fbW11LmgKQEAgLTEzLDYgKzEzLDcgQEAKIHR5cGVkZWYgc3RydWN0IG1tX2NvbnRleHQgewogCXN0cnVjdCBtbV9pZCBpZDsKIAlzdHJ1Y3QgdW1sX2xkdCBsZHQ7CisJc3RydWN0IHBhZ2UgKipzdHViX3BhZ2VzOwogfSBtbV9jb250ZXh0X3Q7CiAKIGV4dGVybiB2b2lkIF9fc3dpdGNoX21tKHN0cnVjdCBtbV9pZCAqIG1tX2lkcCk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9leGVjLmMgYi9hcmNoL3VtL2tlcm5lbC9leGVjLmMKaW5kZXggNzZhNjJjMC4uZjVkN2Y0NSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvZXhlYy5jCisrKyBiL2FyY2gvdW0va2VybmVsL2V4ZWMuYwpAQCAtMjUsNyArMjUsNyBAQAogCiAJcmV0ID0gdW5tYXAoJmN1cnJlbnQtPm1tLT5jb250ZXh0LmlkLCAwLCBTVFVCX1NUQVJULCAwLCAmZGF0YSk7CiAJcmV0ID0gcmV0IHx8IHVubWFwKCZjdXJyZW50LT5tbS0+Y29udGV4dC5pZCwgU1RVQl9FTkQsCi0JCQkgICBUQVNLX1NJWkUgLSBTVFVCX0VORCwgMSwgJmRhdGEpOworCQkJICAgaG9zdF90YXNrX3NpemUgLSBTVFVCX0VORCwgMSwgJmRhdGEpOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJmbHVzaF90aHJlYWQgLSBjbGVhcmluZyBhZGRyZXNzIHNwYWNlIGZhaWxlZCwgIgogCQkgICAgICAgImVyciA9ICVkXG4iLCByZXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwva3N5bXMuYyBiL2FyY2gvdW0va2VybmVsL2tzeW1zLmMKaW5kZXggNTMxMWVlOS4uNjZlMmEzMCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwva3N5bXMuYworKysgYi9hcmNoL3VtL2tlcm5lbC9rc3ltcy5jCkBAIC01LDcgKzUsNiBAQAogCiAjaW5jbHVkZSAibGludXgvbW9kdWxlLmgiCiAjaW5jbHVkZSAibGludXgvc3lzY2FsbHMuaCIKLSNpbmNsdWRlICJhc20vYS5vdXQuaCIKICNpbmNsdWRlICJhc20vdGxiZmx1c2guaCIKICNpbmNsdWRlICJhc20vdWFjY2Vzcy5oIgogI2luY2x1ZGUgImFzLWxheW91dC5oIgpAQCAtNjAsNyArNTksNiBAQAogRVhQT1JUX1NZTUJPTChvc19yY3ZfZmQpOwogRVhQT1JUX1NZTUJPTChydW5faGVscGVyKTsKIEVYUE9SVF9TWU1CT0woc3RhcnRfdGhyZWFkKTsKLUVYUE9SVF9TWU1CT0woZHVtcF90aHJlYWQpOwogCiAjaWZkZWYgQ09ORklHX1NNUAogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9tZW0uYyBiL2FyY2gvdW0va2VybmVsL21lbS5jCmluZGV4IGQ4NzJmZGMuLjI2MjdjZTggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL21lbS5jCisrKyBiL2FyY2gvdW0va2VybmVsL21lbS5jCkBAIC0zNTQsMTEgKzM1NCwxMyBAQAogCXJldHVybiBwdGU7CiB9CiAKLXN0cnVjdCBwYWdlICpwdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCitwZ3RhYmxlX3QgcHRlX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewogCXN0cnVjdCBwYWdlICpwdGU7CiAKIAlwdGUgPSBhbGxvY19wYWdlKEdGUF9LRVJORUx8X19HRlBfUkVQRUFUfF9fR0ZQX1pFUk8pOworCWlmIChwdGUpCisJCXBndGFibGVfcGFnZV9jdG9yKHB0ZSk7CiAJcmV0dXJuIHB0ZTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC91bS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGMwNzk2MWIuLmZjNTBkMmYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3VtL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTI1OCwxMCArMjU4LDYgQEAKIAlkZWZhdWx0X2lkbGUoKTsKIH0KIAotdm9pZCBkdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHVzZXIgKnUpCi17Ci19Ci0KIGludCBfX2NhbnRfc2xlZXAodm9pZCkgewogCXJldHVybiBpbl9hdG9taWMoKSB8fCBpcnFzX2Rpc2FibGVkKCkgfHwgaW5faW50ZXJydXB0KCk7CiAJLyogSXMgaW5faW50ZXJydXB0KCkgcmVhbGx5IG5lZWRlZD8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvbW11LmMgYi9hcmNoL3VtL2tlcm5lbC9za2FzL21tdS5jCmluZGV4IDc4YjNlOWYuLjBjZDlhN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3NrYXMvbW11LmMKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy9tbXUuYwpAQCAtOTEsNiArOTEsOCBAQAogCQlnb3RvIG91dF9mcmVlOwogCX0KIAorCXRvX21tLT5zdHViX3BhZ2VzID0gTlVMTDsKKwogCXJldHVybiAwOwogCiAgb3V0X2ZyZWU6CkBAIC0xMjYsNiArMTI4LDcgQEAKIAogCXBhZ2VzWzBdID0gdmlydF90b19wYWdlKCZfX3N5c2NhbGxfc3R1Yl9zdGFydCk7CiAJcGFnZXNbMV0gPSB2aXJ0X3RvX3BhZ2UobW0tPmNvbnRleHQuaWQuc3RhY2spOworCW1tLT5jb250ZXh0LnN0dWJfcGFnZXMgPSBwYWdlczsKIAogCS8qIGR1cF9tbWFwIGFscmVhZHkgaG9sZHMgbW1hcF9zZW0gKi8KIAllcnIgPSBpbnN0YWxsX3NwZWNpYWxfbWFwcGluZyhtbSwgU1RVQl9TVEFSVCwgU1RVQl9FTkQgLSBTVFVCX1NUQVJULApAQCAtMTQ3LDYgKzE1MCw4IEBACiB7CiAJcHRlX3QgKnB0ZTsKIAorCWlmIChtbS0+Y29udGV4dC5zdHViX3BhZ2VzICE9IE5VTEwpCisJCWtmcmVlKG1tLT5jb250ZXh0LnN0dWJfcGFnZXMpOwogCXB0ZSA9IHZpcnRfdG9fcHRlKG1tLCBTVFVCX0NPREUpOwogCWlmIChwdGUgIT0gTlVMTCkKIAkJcHRlX2NsZWFyKG1tLCBTVFVCX0NPREUsIHB0ZSk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC91bV9hcmNoLmMgYi9hcmNoL3VtL2tlcm5lbC91bV9hcmNoLmMKaW5kZXggNDY4YWJhOS4uYTZjMWRkMSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvdW1fYXJjaC5jCisrKyBiL2FyY2gvdW0va2VybmVsL3VtX2FyY2guYwpAQCAtMjQxLDYgKzI0MSwxMSBAQAogfTsKIAogLyogU2V0IGR1cmluZyBlYXJseSBib290ICovCit1bnNpZ25lZCBsb25nIHRhc2tfc2l6ZTsKK0VYUE9SVF9TWU1CT0wodGFza19zaXplKTsKKwordW5zaWduZWQgbG9uZyBob3N0X3Rhc2tfc2l6ZTsKKwogdW5zaWduZWQgbG9uZyBicmtfc3RhcnQ7CiB1bnNpZ25lZCBsb25nIGVuZF9pb21lbTsKIEVYUE9SVF9TWU1CT0woZW5kX2lvbWVtKTsKQEAgLTI2Nyw2ICsyNzIsMTMgQEAKIAlpZiAoaGF2ZV9yb290ID09IDApCiAJCWFkZF9hcmcoREVGQVVMVF9DT01NQU5EX0xJTkUpOwogCisJaG9zdF90YXNrX3NpemUgPSBvc19nZXRfdGFza19zaXplKCk7CisJLyoKKwkgKiBUQVNLX1NJWkUgbmVlZHMgdG8gYmUgUEdESVJfU0laRSBhbGlnbmVkIG9yIGVsc2UgZXhpdF9tbWFwIGNyYXBzCisJICogb3V0CisJICovCisJdGFza19zaXplID0gaG9zdF90YXNrX3NpemUgJiBQR0RJUl9NQVNLOworCiAJLyogT1Mgc2FuaXR5IGNoZWNrcyB0aGF0IG5lZWQgdG8gaGFwcGVuIGJlZm9yZSB0aGUga2VybmVsIHJ1bnMgKi8KIAlvc19lYXJseV9jaGVja3MoKTsKIApAQCAtMzAzLDcgKzMxNSw3IEBACiAKIAloaWdobWVtID0gMDsKIAlpb21lbV9zaXplID0gKGlvbWVtX3NpemUgKyBQQUdFX1NJWkUgLSAxKSAmIFBBR0VfTUFTSzsKLQltYXhfcGh5c21lbSA9IENPTkZJR19UT1BfQUREUiAtIHVtbF9waHlzbWVtIC0gaW9tZW1fc2l6ZSAtIE1JTl9WTUFMTE9DOworCW1heF9waHlzbWVtID0gVEFTS19TSVpFIC0gdW1sX3BoeXNtZW0gLSBpb21lbV9zaXplIC0gTUlOX1ZNQUxMT0M7CiAKIAkvKgogCSAqIFpvbmVzIGhhdmUgdG8gYmVnaW4gb24gYSAxIDw8IE1BWF9PUkRFUiBwYWdlIGJvdW5kYXJ5LApAQCAtMzM1LDcgKzM0Nyw3IEBACiAJfQogCiAJdmlydG1lbV9zaXplID0gcGh5c21lbV9zaXplOwotCWF2YWlsID0gQ09ORklHX1RPUF9BRERSIC0gc3RhcnRfdm07CisJYXZhaWwgPSBUQVNLX1NJWkUgLSBzdGFydF92bTsKIAlpZiAocGh5c21lbV9zaXplID4gYXZhaWwpCiAJCXZpcnRtZW1fc2l6ZSA9IGF2YWlsOwogCWVuZF92bSA9IHN0YXJ0X3ZtICsgdmlydG1lbV9zaXplOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9haW8uYyBiL2FyY2gvdW0vb3MtTGludXgvYWlvLmMKaW5kZXggYjhkOGM5Yy4uNTdlM2Q0NiAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9haW8uYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2Fpby5jCkBAIC0xNDIsNyArMTQyLDcgQEAKIAlpZiAoYWN0dWFsICE9IHJlcS0+b2Zmc2V0KQogCQlyZXR1cm4gLWVycm5vOwogCi0Jc3dpdGNoKHJlcS0+dHlwZSkgeworCXN3aXRjaCAocmVxLT50eXBlKSB7CiAJY2FzZSBBSU9fUkVBRDoKIAkJbiA9IHJlYWQocmVxLT5pb19mZCwgcmVxLT5idWYsIHJlcS0+bGVuKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvZXRoZXJ0YXBfa2Vybi5jIGIvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL2V0aGVydGFwX2tlcm4uYwppbmRleCAwNGYxMWI5Li4wNDZhMTMxIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvZXRoZXJ0YXBfa2Vybi5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy9ldGhlcnRhcF9rZXJuLmMKQEAgLTYsNyArNiw3IEBACiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLgogICovCiAKLSNpbmNsdWRlICJsaW51eC9pbml0LmgiCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgImV0YXAuaCIKICNpbmNsdWRlICJuZXRfa2Vybi5oIgpAQCAtMzAsMTAgKzMwLDEwIEBACiAJZXByaS0+Y29udHJvbF9mZCA9IC0xOwogCWVwcmktPmRldiA9IGRldjsKIAotCXByaW50aygiZXRoZXJ0YXAgYmFja2VuZCAtICVzIiwgZXByaS0+ZGV2X25hbWUpOworCXByaW50ayhLRVJOX0lORk8gImV0aGVydGFwIGJhY2tlbmQgLSAlcyIsIGVwcmktPmRldl9uYW1lKTsKIAlpZiAoZXByaS0+Z2F0ZV9hZGRyICE9IE5VTEwpCi0JCXByaW50aygiLCBJUCA9ICVzIiwgZXByaS0+Z2F0ZV9hZGRyKTsKLQlwcmludGsoIlxuIik7CisJCXByaW50ayhLRVJOX0NPTlQgIiwgSVAgPSAlcyIsIGVwcmktPmdhdGVfYWRkcik7CisJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKIH0KIAogc3RhdGljIGludCBldGFwX3JlYWQoaW50IGZkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdW1sX25ldF9wcml2YXRlICpscCkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy90dW50YXBfa2Vybi5jIGIvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL3R1bnRhcF9rZXJuLmMKaW5kZXggOWQzODQ4MC4uNmI5ZTMzZCAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL3R1bnRhcF9rZXJuLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL3R1bnRhcF9rZXJuLmMKQEAgLTI5LDEwICsyOSwxMCBAQAogCXRwcmktPmZkID0gLTE7CiAJdHByaS0+ZGV2ID0gZGV2OwogCi0JcHJpbnRrKCJUVU4vVEFQIGJhY2tlbmQgLSAiKTsKKwlwcmludGsoS0VSTl9JTkZPICJUVU4vVEFQIGJhY2tlbmQgLSAiKTsKIAlpZiAodHByaS0+Z2F0ZV9hZGRyICE9IE5VTEwpCi0JCXByaW50aygiSVAgPSAlcyIsIHRwcmktPmdhdGVfYWRkcik7Ci0JcHJpbnRrKCJcbiIpOworCQlwcmludGsoS0VSTl9DT05UICJJUCA9ICVzIiwgdHByaS0+Z2F0ZV9hZGRyKTsKKwlwcmludGsoS0VSTl9DT05UICJcbiIpOwogfQogCiBzdGF0aWMgaW50IHR1bnRhcF9yZWFkKGludCBmZCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHVtbF9uZXRfcHJpdmF0ZSAqbHApCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L2luY2x1ZGUvZmlsZS5oIGIvYXJjaC91bS9vcy1MaW51eC9pbmNsdWRlL2ZpbGUuaAppbmRleCBkODI3MTFlLi5mZTcxYmUyIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L2luY2x1ZGUvZmlsZS5oCisrKyBiL2FyY2gvdW0vb3MtTGludXgvaW5jbHVkZS9maWxlLmgKQEAgLTEsNSArMSw1IEBACiAvKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKICAqLwogCkBAIC05LDE0ICs5LDMgQEAKICNkZWZpbmUgREVWX05VTEwgIi9kZXYvbnVsbCIKIAogI2VuZGlmCi0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L21lbS5jIGIvYXJjaC91bS9vcy1MaW51eC9tZW0uYwppbmRleCBlZWRjMmQ4Li45M2ExMWQ3IDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L21lbS5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvbWVtLmMKQEAgLTEsMjIgKzEsMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKICNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KLSNpbmNsdWRlICJ1c2VyLmgiCi0jaW5jbHVkZSAibWVtX3VzZXIuaCIKLSNpbmNsdWRlICJpbml0LmgiCi0jaW5jbHVkZSAib3MuaCIKLSNpbmNsdWRlICJ0ZW1wZmlsZS5oIgotI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCi0KICNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlICJpbml0LmgiCisjaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJvcy5oIgorI2luY2x1ZGUgInVzZXIuaCIKIAogLyogTW9kaWZpZWQgYnkgd2hpY2hfdG1wZGlyLCB3aGljaCBpcyBjYWxsZWQgZHVyaW5nIGVhcmx5IGJvb3QgKi8KIHN0YXRpYyBjaGFyICpkZWZhdWx0X3RtcGRpciA9ICIvdG1wIjsKQEAgLTMzLDE4ICszMiwxOSBAQAogCWludCBpOwogCWNoYXIgKmRpciA9IE5VTEw7CiAKLQlpZih0ZW1wZGlyICE9IE5VTEwpIC8qIFdlJ3ZlIGFscmVhZHkgYmVlbiBjYWxsZWQgKi8KKwlpZiAodGVtcGRpciAhPSBOVUxMKQorCQkvKiBXZSd2ZSBhbHJlYWR5IGJlZW4gY2FsbGVkICovCiAJCXJldHVybjsKLQlmb3IoaSA9IDA7IGRpcnNbaV07IGkrKyl7CisJZm9yIChpID0gMDsgZGlyc1tpXTsgaSsrKSB7CiAJCWRpciA9IGdldGVudihkaXJzW2ldKTsKLQkJaWYoKGRpciAhPSBOVUxMKSAmJiAoKmRpciAhPSAnXDAnKSkKKwkJaWYgKChkaXIgIT0gTlVMTCkgJiYgKCpkaXIgIT0gJ1wwJykpCiAJCQlicmVhazsKIAl9Ci0JaWYoKGRpciA9PSBOVUxMKSB8fCAoKmRpciA9PSAnXDAnKSkKKwlpZiAoKGRpciA9PSBOVUxMKSB8fCAoKmRpciA9PSAnXDAnKSkKIAkJZGlyID0gZGVmYXVsdF90bXBkaXI7CiAKIAl0ZW1wZGlyID0gbWFsbG9jKHN0cmxlbihkaXIpICsgMik7Ci0JaWYodGVtcGRpciA9PSBOVUxMKXsKKwlpZiAodGVtcGRpciA9PSBOVUxMKSB7CiAJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIG1hbGxvYyB0ZW1wZGlyLCAiCiAJCQkiZXJybm8gPSAlZFxuIiwgZXJybm8pOwogCQlyZXR1cm47CkBAIC01Myw3ICs1Myw4IEBACiAJc3RyY2F0KHRlbXBkaXIsICIvIik7CiB9CiAKLS8qIFRoaXMgd2lsbCByZXR1cm4gMSwgd2l0aCB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIGJ1ZiBiZWluZyB0aGUKKy8qCisgKiBUaGlzIHdpbGwgcmV0dXJuIDEsIHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlciBpbiBidWYgYmVpbmcgdGhlCiAgKiBjaGFyYWN0ZXIgZm9sbG93aW5nIHRoZSBuZXh0IGluc3RhbmNlIG9mIGMgaW4gdGhlIGZpbGUuICBUaGlzIHdpbGwKICAqIHJlYWQgdGhlIGZpbGUgYXMgbmVlZGVkLiAgSWYgdGhlcmUncyBhbiBlcnJvciwgLWVycm5vIGlzIHJldHVybmVkOwogICogaWYgdGhlIGVuZCBvZiB0aGUgZmlsZSBpcyByZWFjaGVkLCAwIGlzIHJldHVybmVkLgpAQCAtNjQsMTEgKzY1LDExIEBACiAJc2l6ZV90IGxlbjsKIAljaGFyICpwdHI7CiAKLQl3aGlsZSgocHRyID0gc3RyY2hyKGJ1ZiwgYykpID09IE5VTEwpeworCXdoaWxlICgocHRyID0gc3RyY2hyKGJ1ZiwgYykpID09IE5VTEwpIHsKIAkJbiA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZSAtIDEpOwotCQlpZihuID09IDApCisJCWlmIChuID09IDApCiAJCQlyZXR1cm4gMDsKLQkJZWxzZSBpZihuIDwgMCkKKwkJZWxzZSBpZiAobiA8IDApCiAJCQlyZXR1cm4gLWVycm5vOwogCiAJCWJ1ZltuXSA9ICdcMCc7CkBAIC03OCwxMSArNzksMTIgQEAKIAlsZW4gPSBzdHJsZW4ocHRyKTsKIAltZW1tb3ZlKGJ1ZiwgcHRyLCBsZW4gKyAxKTsKIAotCS8qIFJlZmlsbCB0aGUgYnVmZmVyIHNvIHRoYXQgaWYgdGhlcmUncyBhIHBhcnRpYWwgc3RyaW5nIHRoYXQgd2UgY2FyZQorCS8qCisJICogUmVmaWxsIHRoZSBidWZmZXIgc28gdGhhdCBpZiB0aGVyZSdzIGEgcGFydGlhbCBzdHJpbmcgdGhhdCB3ZSBjYXJlCiAJICogYWJvdXQsIGl0IHdpbGwgYmUgY29tcGxldGVkLCBhbmQgd2UgY2FuIHJlY29nbml6ZSBpdC4KIAkgKi8KIAluID0gcmVhZChmZCwgJmJ1ZltsZW5dLCBzaXplIC0gbGVuIC0gMSk7Ci0JaWYobiA8IDApCisJaWYgKG4gPCAwKQogCQlyZXR1cm4gLWVycm5vOwogCiAJYnVmW2xlbiArIG5dID0gJ1wwJzsKQEAgLTkyLDcgKzk0LDggQEAKIC8qIHdoaWNoX3RtcGRpciBpcyBjYWxsZWQgb25seSBkdXJpbmcgZWFybHkgYm9vdCAqLwogc3RhdGljIGludCBjaGVja2VkX3RtcGRpciA9IDA7CiAKLS8qIExvb2sgZm9yIGEgdG1wZnMgbW91bnRlZCBhdCAvZGV2L3NobS4gIEkgY291bGRuJ3QgZmluZCBhIGNsZWFuZXIKKy8qCisgKiBMb29rIGZvciBhIHRtcGZzIG1vdW50ZWQgYXQgL2Rldi9zaG0uICBJIGNvdWxkbid0IGZpbmQgYSBjbGVhbmVyCiAgKiB3YXkgdG8gZG8gdGhpcyB0aGFuIHRvIHBhcnNlIC9wcm9jL21vdW50cy4gIHN0YXRmcyB3aWxsIHJldHVybiB0aGUKICAqIHNhbWUgZmlsZXN5c3RlbSBtYWdpYyBudW1iZXIgYW5kIGZzIGlkIGZvciBib3RoIC9kZXYgYW5kIC9kZXYvc2htCiAgKiB3aGVuIHRoZXkgYXJlIGJvdGggdG1wZnMsIHNvIHlvdSBjYW4ndCB0ZWxsIGlmIHRoZXkgYXJlIGRpZmZlcmVudApAQCAtMTA3LDcgKzExMCw3IEBACiAJaW50IGZkLCBmb3VuZDsKIAljaGFyIGJ1ZlsxMjhdID0geyAnXDAnIH07CiAKLQlpZihjaGVja2VkX3RtcGRpcikKKwlpZiAoY2hlY2tlZF90bXBkaXIpCiAJCXJldHVybjsKIAogCWNoZWNrZWRfdG1wZGlyID0gMTsKQEAgLTExNSwyOCArMTE4LDI4IEBACiAJcHJpbnRmKCJDaGVja2luZyBmb3IgdG1wZnMgbW91bnQgb24gL2Rldi9zaG0uLi4iKTsKIAogCWZkID0gb3BlbigiL3Byb2MvbW91bnRzIiwgT19SRE9OTFkpOwotCWlmKGZkIDwgMCl7CisJaWYgKGZkIDwgMCkgewogCQlwcmludGYoImZhaWxlZCB0byBvcGVuIC9wcm9jL21vdW50cywgZXJybm8gPSAlZFxuIiwgZXJybm8pOwogCQlyZXR1cm47CiAJfQogCi0Jd2hpbGUoMSl7CisJd2hpbGUgKDEpIHsKIAkJZm91bmQgPSBuZXh0KGZkLCBidWYsIEFSUkFZX1NJWkUoYnVmKSwgJyAnKTsKLQkJaWYoZm91bmQgIT0gMSkKKwkJaWYgKGZvdW5kICE9IDEpCiAJCQlicmVhazsKIAotCQlpZighc3RybmNtcChidWYsICIvZGV2L3NobSIsIHN0cmxlbigiL2Rldi9zaG0iKSkpCisJCWlmICghc3RybmNtcChidWYsICIvZGV2L3NobSIsIHN0cmxlbigiL2Rldi9zaG0iKSkpCiAJCQlnb3RvIGZvdW5kOwogCiAJCWZvdW5kID0gbmV4dChmZCwgYnVmLCBBUlJBWV9TSVpFKGJ1ZiksICdcbicpOwotCQlpZihmb3VuZCAhPSAxKQorCQlpZiAoZm91bmQgIT0gMSkKIAkJCWJyZWFrOwogCX0KIAogZXJyOgotCWlmKGZvdW5kID09IDApCisJaWYgKGZvdW5kID09IDApCiAJCXByaW50Zigibm90aGluZyBtb3VudGVkIG9uIC9kZXYvc2htXG4iKTsKLQllbHNlIGlmKGZvdW5kIDwgMCkKKwllbHNlIGlmIChmb3VuZCA8IDApCiAJCXByaW50ZigicmVhZCByZXR1cm5lZCBlcnJubyAlZFxuIiwgLWZvdW5kKTsKIAogb3V0OgpAQCAtMTQ2LDEwICsxNDksMTAgQEAKIAogZm91bmQ6CiAJZm91bmQgPSBuZXh0KGZkLCBidWYsIEFSUkFZX1NJWkUoYnVmKSwgJyAnKTsKLQlpZihmb3VuZCAhPSAxKQorCWlmIChmb3VuZCAhPSAxKQogCQlnb3RvIGVycjsKIAotCWlmKHN0cm5jbXAoYnVmLCAidG1wZnMiLCBzdHJsZW4oInRtcGZzIikpKXsKKwlpZiAoc3RybmNtcChidWYsICJ0bXBmcyIsIHN0cmxlbigidG1wZnMiKSkpIHsKIAkJcHJpbnRmKCJub3QgdG1wZnNcbiIpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xNTksNDMgKzE2Miw0MCBAQAogCWdvdG8gb3V0OwogfQogCi0vKgotICogVGhpcyBwcm9jIHN0aWxsIHVzZWQgaW4gdHQtbW9kZQotICogKGZpbGU6IGtlcm5lbC90dC9wdHByb3h5L3Byb3h5LmMsIHByb2M6IHN0YXJ0X2RlYnVnZ2VyKS4KLSAqIFNvIGl0IGlzbid0ICdzdGF0aWMnIHlldC4KLSAqLwotaW50IF9faW5pdCBtYWtlX3RlbXBmaWxlKGNvbnN0IGNoYXIgKnRlbXBsYXRlLCBjaGFyICoqb3V0X3RlbXBuYW1lLAotCQkJIGludCBkb191bmxpbmspCitzdGF0aWMgaW50IF9faW5pdCBtYWtlX3RlbXBmaWxlKGNvbnN0IGNoYXIgKnRlbXBsYXRlLCBjaGFyICoqb3V0X3RlbXBuYW1lLAorCQkJCWludCBkb191bmxpbmspCiB7CiAJY2hhciAqdGVtcG5hbWU7CiAJaW50IGZkOwogCiAJd2hpY2hfdG1wZGlyKCk7CiAJdGVtcG5hbWUgPSBtYWxsb2MoTUFYUEFUSExFTik7Ci0JaWYgKCF0ZW1wbmFtZSkKLQkJZ290byBvdXQ7CisJaWYgKHRlbXBuYW1lID09IE5VTEwpCisJCXJldHVybiAtMTsKIAogCWZpbmRfdGVtcGRpcigpOworCWlmICgodGVtcGRpciA9PSBOVUxMKSB8fCAoc3RybGVuKHRlbXBkaXIpID49IE1BWFBBVEhMRU4pKQorCQlyZXR1cm4gLTE7CisKIAlpZiAodGVtcGxhdGVbMF0gIT0gJy8nKQogCQlzdHJjcHkodGVtcG5hbWUsIHRlbXBkaXIpOwogCWVsc2UKIAkJdGVtcG5hbWVbMF0gPSAnXDAnOwogCXN0cm5jYXQodGVtcG5hbWUsIHRlbXBsYXRlLCBNQVhQQVRITEVOLTEtc3RybGVuKHRlbXBuYW1lKSk7CiAJZmQgPSBta3N0ZW1wKHRlbXBuYW1lKTsKLQlpZihmZCA8IDApeworCWlmIChmZCA8IDApIHsKIAkJZnByaW50ZihzdGRlcnIsICJvcGVuIC0gY2Fubm90IGNyZWF0ZSAlczogJXNcbiIsIHRlbXBuYW1lLAogCQkJc3RyZXJyb3IoZXJybm8pKTsKIAkJZ290byBvdXQ7CiAJfQotCWlmKGRvX3VubGluayAmJiAodW5saW5rKHRlbXBuYW1lKSA8IDApKXsKKwlpZiAoZG9fdW5saW5rICYmICh1bmxpbmsodGVtcG5hbWUpIDwgMCkpIHsKIAkJcGVycm9yKCJ1bmxpbmsiKTsKIAkJZ290byBvdXQ7CiAJfQotCWlmKG91dF90ZW1wbmFtZSl7CisJaWYgKG91dF90ZW1wbmFtZSkgewogCQkqb3V0X3RlbXBuYW1lID0gdGVtcG5hbWU7Ci0JfSBlbHNlIHsKKwl9IGVsc2UKIAkJZnJlZSh0ZW1wbmFtZSk7Ci0JfQogCXJldHVybiBmZDsKIG91dDoKIAlmcmVlKHRlbXBuYW1lKTsKQEAgLTIwNCwyNyArMjA0LDIzIEBACiAKICNkZWZpbmUgVEVNUE5BTUVfVEVNUExBVEUgInZtX2ZpbGUtWFhYWFhYIgogCi0vKgotICogVGhpcyBwcm9jIGlzIHVzZWQgaW4gc3RhcnRfdXAuYwotICogU28gaXQgaXNuJ3QgJ3N0YXRpYycuCi0gKi8KLWludCBfX2luaXQgY3JlYXRlX3RtcF9maWxlKHVuc2lnbmVkIGxvbmcgbG9uZyBsZW4pCitzdGF0aWMgaW50IF9faW5pdCBjcmVhdGVfdG1wX2ZpbGUodW5zaWduZWQgbG9uZyBsb25nIGxlbikKIHsKIAlpbnQgZmQsIGVycjsKIAljaGFyIHplcm87CiAKIAlmZCA9IG1ha2VfdGVtcGZpbGUoVEVNUE5BTUVfVEVNUExBVEUsIE5VTEwsIDEpOwotCWlmKGZkIDwgMCkgeworCWlmIChmZCA8IDApCiAJCWV4aXQoMSk7Ci0JfQogCiAJZXJyID0gZmNobW9kKGZkLCAwNzc3KTsKLQlpZihlcnIgPCAwKXsKKwlpZiAoZXJyIDwgMCkgewogCQlwZXJyb3IoImZjaG1vZCIpOwogCQlleGl0KDEpOwogCX0KIAotCS8qIFNlZWsgdG8gbGVuIC0gMSBiZWNhdXNlIHdyaXRpbmcgYSBjaGFyYWN0ZXIgdGhlcmUgd2lsbAorCS8qCisJICogU2VlayB0byBsZW4gLSAxIGJlY2F1c2Ugd3JpdGluZyBhIGNoYXJhY3RlciB0aGVyZSB3aWxsCiAJICogaW5jcmVhc2UgdGhlIGZpbGUgc2l6ZSBieSBvbmUgYnl0ZSwgdG8gdGhlIGRlc2lyZWQgbGVuZ3RoLgogCSAqLwogCWlmIChsc2VlazY0KGZkLCBsZW4gLSAxLCBTRUVLX1NFVCkgPCAwKSB7CkBAIC0yMzUsNyArMjMxLDcgQEAKIAl6ZXJvID0gMDsKIAogCWVyciA9IHdyaXRlKGZkLCAmemVybywgMSk7Ci0JaWYoZXJyICE9IDEpeworCWlmIChlcnIgIT0gMSkgewogCQlwZXJyb3IoIndyaXRlIik7CiAJCWV4aXQoMSk7CiAJfQpAQCAtMjUwLDcgKzI0Niw3IEBACiAJZmQgPSBjcmVhdGVfdG1wX2ZpbGUobGVuKTsKIAogCWVyciA9IG9zX3NldF9leGVjX2Nsb3NlKGZkKTsKLQlpZihlcnIgPCAwKXsKKwlpZiAoZXJyIDwgMCkgewogCQllcnJubyA9IC1lcnI7CiAJCXBlcnJvcigiZXhlY19jbG9zZSIpOwogCX0KQEAgLTI2NywxMSArMjYzLDExIEBACiAJCSAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFIHwgUFJPVF9FWEVDLCBNQVBfUFJJVkFURSwgZmQsIDApOwogCXByaW50ZigiQ2hlY2tpbmcgUFJPVF9FWEVDIG1tYXAgaW4gJXMuLi4iLHRlbXBkaXIpOwogCWZmbHVzaChzdGRvdXQpOwotCWlmKGFkZHIgPT0gTUFQX0ZBSUxFRCl7CisJaWYgKGFkZHIgPT0gTUFQX0ZBSUxFRCkgewogCQllcnIgPSBlcnJubzsKIAkJcGVycm9yKCJmYWlsZWQiKTsKIAkJY2xvc2UoZmQpOwotCQlpZihlcnIgPT0gRVBFUk0pCisJCWlmIChlcnIgPT0gRVBFUk0pCiAJCQlwcmludGYoIiVzIG11c3QgYmUgbm90IG1vdW50ZWQgbm9leGVjXG4iLHRlbXBkaXIpOwogCQlleGl0KDEpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvcHJvY2Vzcy5jIGIvYXJjaC91bS9vcy1MaW51eC9wcm9jZXNzLmMKaW5kZXggYWJmNmJlYS4uZTA0NzdjMyAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9wcm9jZXNzLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9wcm9jZXNzLmMKQEAgLTIyNCw3ICsyMjQsNyBAQAogCQlnb3RvIG91dF91bm1hcDsKIAl9CiAKLQlwcmludGsoIk9LXG4iKTsKKwlwcmludGsoVU1fS0VSTl9DT05UICJPS1xuIik7CiAJb2sgPSAxOwogCiBvdXRfdW5tYXA6CmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3NpZ25hbC5jIGIvYXJjaC91bS9vcy1MaW51eC9zaWduYWwuYwppbmRleCAwZmIwY2M4Li4zZjE2OTRiIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3NpZ25hbC5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvc2lnbmFsLmMKQEAgLTIzNyw3ICsyMzcsNyBAQAogCSAqIGludGVycnVwdHMgbWF5IGhhdmUgYXJyaXZlZCBhbmQgd2UgbmVlZCB0byByZS1lbmFibGUgdGhlbSBhbmQKIAkgKiByZWNoZWNrIHNpZ25hbHNfcGVuZGluZy4KIAkgKi8KLQl3aGlsZSgxKSB7CisJd2hpbGUgKDEpIHsKIAkJLyoKIAkJICogU2F2ZSBhbmQgcmVzZXQgc2F2ZV9wZW5kaW5nIGFmdGVyIGVuYWJsaW5nIHNpZ25hbHMuICBUaGlzCiAJCSAqIHdheSwgc2lnbmFsc19wZW5kaW5nIHdvbid0IGJlIGNoYW5nZWQgd2hpbGUgd2UncmUgcmVhZGluZyBpdC4KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc2thcy9wcm9jZXNzLmMgYi9hcmNoL3VtL29zLUxpbnV4L3NrYXMvcHJvY2Vzcy5jCmluZGV4IGQzNmM4OWMuLmIxNDgyOTQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvc2thcy9wcm9jZXNzLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9za2FzL3Byb2Nlc3MuYwpAQCAtMzQxLDcgKzM0MSw3IEBACiAJaW50IGxvY2FsX3VzaW5nX3N5c2VtdTsKIAogCWlmIChnZXRpdGltZXIoSVRJTUVSX1ZJUlRVQUwsICZ0aW1lcikpCi0JCXByaW50aygiRmFpbGVkIHRvIGdldCBpdGltZXIsIGVycm5vID0gJWRcbiIsIGVycm5vKTsKKwkJcHJpbnRrKFVNX0tFUk5fRVJSICJGYWlsZWQgdG8gZ2V0IGl0aW1lciwgZXJybm8gPSAlZFxuIiwgZXJybm8pOwogCW5zZWNzID0gdGltZXIuaXRfdmFsdWUudHZfc2VjICogVU1fTlNFQ19QRVJfU0VDICsKIAkJdGltZXIuaXRfdmFsdWUudHZfdXNlYyAqIFVNX05TRUNfUEVSX1VTRUM7CiAJbnNlY3MgKz0gb3NfbnNlY3MoKTsKQEAgLTM4OCw3ICszODgsNyBAQAogCiAJCWlmIChXSUZTVE9QUEVEKHN0YXR1cykpIHsKIAkJCWludCBzaWcgPSBXU1RPUFNJRyhzdGF0dXMpOwotCQkgIAlzd2l0Y2goc2lnKSB7CisJCQlzd2l0Y2ggKHNpZykgewogCQkJY2FzZSBTSUdTRUdWOgogCQkJCWlmIChQVFJBQ0VfRlVMTF9GQVVMVElORk8gfHwKIAkJCQkgICAgIXB0cmFjZV9mYXVsdGluZm8pIHsKQEAgLTY0MSw3ICs2NDEsNyBAQAogCSAqIGFmdGVyIHJldHVybmluZyB0byB0aGUganVtcGVyLgogCSAqLwogCW4gPSBzZXRqbXAoaW5pdGlhbF9qbXBidWYpOwotCXN3aXRjaChuKSB7CisJc3dpdGNoIChuKSB7CiAJY2FzZSBJTklUX0pNUF9ORVdfVEhSRUFEOgogCQkoKnN3aXRjaF9idWYpWzBdLkpCX0lQID0gKHVuc2lnbmVkIGxvbmcpIG5ld190aHJlYWRfaGFuZGxlcjsKIAkJKCpzd2l0Y2hfYnVmKVswXS5KQl9TUCA9ICh1bnNpZ25lZCBsb25nKSBzdGFjayArCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3N5cy1pMzg2L01ha2VmaWxlIGIvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni9NYWtlZmlsZQppbmRleCBhODQxMjYyLi5iNGJjNmFjIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3N5cy1pMzg2L01ha2VmaWxlCisrKyBiL2FyY2gvdW0vb3MtTGludXgvc3lzLWkzODYvTWFrZWZpbGUKQEAgLTMsNyArMyw3IEBACiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKICMKIAotb2JqLXkgPSByZWdpc3RlcnMubyBzaWduYWwubyB0bHMubworb2JqLXkgPSByZWdpc3RlcnMubyBzaWduYWwubyB0YXNrX3NpemUubyB0bHMubwogCiBVU0VSX09CSlMgOj0gJChvYmoteSkKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni9yZWdpc3RlcnMuYyBiL2FyY2gvdW0vb3MtTGludXgvc3lzLWkzODYvcmVnaXN0ZXJzLmMKaW5kZXggZDE5OTdjYS4uZjc0ZDg1MyAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni9yZWdpc3RlcnMuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3N5cy1pMzg2L3JlZ2lzdGVycy5jCkBAIC02MiwxMCArNjIsMTAgQEAKIAlpbnQgZXJyOwogCiAJZXJyID0gcHRyYWNlKFBUUkFDRV9HRVRGUFhSRUdTLCBwaWQsIDAsIGZweF9yZWdzKTsKLQlpZighZXJyKQorCWlmICghZXJyKQogCQlyZXR1cm47CiAKLQlpZihlcnJubyAhPSBFSU8pCisJaWYgKGVycm5vICE9IEVJTykKIAkJcGFuaWMoImNoZWNrX3B0cmFjZSA6IFBUUkFDRV9HRVRGUFhSRUdTIGZhaWxlZCwgZXJybm8gPSAlZCIsCiAJCSAgICAgIGVycm5vKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni90YXNrX3NpemUuYyBiL2FyY2gvdW0vb3MtTGludXgvc3lzLWkzODYvdGFza19zaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhkMjExYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdW0vb3MtTGludXgvc3lzLWkzODYvdGFza19zaXplLmMKQEAgLTAsMCArMSwxMjAgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSAibG9uZ2ptcC5oIgorI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCisKK3N0YXRpYyBqbXBfYnVmIGJ1ZjsKKworc3RhdGljIHZvaWQgc2VnZmF1bHQoaW50IHNpZykKK3sKKwlsb25nam1wKGJ1ZiwgMSk7Cit9CisKK3N0YXRpYyBpbnQgcGFnZV9vayh1bnNpZ25lZCBsb25nIHBhZ2UpCit7CisJdW5zaWduZWQgbG9uZyAqYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nICopIChwYWdlIDw8IFVNX0tFUk5fUEFHRV9TSElGVCk7CisJdW5zaWduZWQgbG9uZyBuID0gfjBVTDsKKwl2b2lkICptYXBwZWQgPSBOVUxMOworCWludCBvayA9IDA7CisKKwkvKgorCSAqIEZpcnN0IHNlZSBpZiB0aGUgcGFnZSBpcyByZWFkYWJsZS4gIElmIGl0IGlzLCBpdCBtYXkgc3RpbGwKKwkgKiBiZSBhIFZEU08sIHNvIHdlIGdvIG9uIHRvIHNlZSBpZiBpdCdzIHdyaXRhYmxlLiAgSWYgbm90CisJICogdGhlbiB0cnkgbWFwcGluZyBtZW1vcnkgdGhlcmUuICBJZiB0aGF0IGZhaWxzLCB0aGVuIHdlJ3JlCisJICogc3RpbGwgaW4gdGhlIGtlcm5lbCBhcmVhLiAgQXMgYSBzYW5pdHkgY2hlY2ssIHdlJ2xsIGZhaWwgaWYKKwkgKiB0aGUgbW1hcCBzdWNjZWVkcywgYnV0IGdpdmVzIHVzIGFuIGFkZHJlc3MgZGlmZmVyZW50IGZyb20KKwkgKiB3aGF0IHdlIHdhbnRlZC4KKwkgKi8KKwlpZiAoc2V0am1wKGJ1ZikgPT0gMCkKKwkJbiA9ICphZGRyZXNzOworCWVsc2UgeworCQltYXBwZWQgPSBtbWFwKGFkZHJlc3MsIFVNX0tFUk5fUEFHRV9TSVpFLAorCQkJICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkJCSAgICAgIE1BUF9GSVhFRCB8IE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUywgLTEsIDApOworCQlpZiAobWFwcGVkID09IE1BUF9GQUlMRUQpCisJCQlyZXR1cm4gMDsKKwkJaWYgKG1hcHBlZCAhPSBhZGRyZXNzKQorCQkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBOb3csIGlzIGl0IHdyaXRlYWJsZT8gIElmIHNvLCB0aGVuIHdlJ3JlIGluIHVzZXIgYWRkcmVzcworCSAqIHNwYWNlLiAgSWYgbm90LCB0aGVuIHRyeSBtcHJvdGVjdGluZyBpdCBhbmQgdHJ5IHRoZSB3cml0ZQorCSAqIGFnYWluLgorCSAqLworCWlmIChzZXRqbXAoYnVmKSA9PSAwKSB7CisJCSphZGRyZXNzID0gbjsKKwkJb2sgPSAxOworCQlnb3RvIG91dDsKKwl9IGVsc2UgaWYgKG1wcm90ZWN0KGFkZHJlc3MsIFVNX0tFUk5fUEFHRV9TSVpFLAorCQkJICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUpICE9IDApCisJCWdvdG8gb3V0OworCisJaWYgKHNldGptcChidWYpID09IDApIHsKKwkJKmFkZHJlc3MgPSBuOworCQlvayA9IDE7CisJfQorCisgb3V0OgorCWlmIChtYXBwZWQgIT0gTlVMTCkKKwkJbXVubWFwKG1hcHBlZCwgVU1fS0VSTl9QQUdFX1NJWkUpOworCXJldHVybiBvazsKK30KKwordW5zaWduZWQgbG9uZyBvc19nZXRfdGFza19zaXplKHZvaWQpCit7CisJc3RydWN0IHNpZ2FjdGlvbiBzYSwgb2xkOworCXVuc2lnbmVkIGxvbmcgYm90dG9tID0gMDsKKwkvKgorCSAqIEEgMzItYml0IFVNTCBvbiBhIDY0LWJpdCBob3N0IGdldHMgY29uZnVzZWQgYWJvdXQgdGhlIFZEU08gYXQKKwkgKiAweGZmZmZlMDAwLiAgSXQgaXMgbWFwcGVkLCBpcyByZWFkYWJsZSwgY2FuIGJlIHJlcHJvdGVjdGVkIHdyaXRlYWJsZQorCSAqIGFuZCB3cml0dGVuLiAgSG93ZXZlciwgZXhlYyBkaXNjb3ZlcnMgbGF0ZXIgdGhhdCBpdCBjYW4ndCBiZQorCSAqIHVubWFwcGVkLiAgU28sIGp1c3Qgc2V0IHRoZSBoaWdoZXN0IGFkZHJlc3MgdG8gYmUgY2hlY2tlZCB0byBqdXN0CisJICogYmVsb3cgaXQuICBUaGlzIG1pZ2h0IHdhc3RlIHNvbWUgYWRkcmVzcyBzcGFjZSBvbiA0Ry80RyAzMi1iaXQKKwkgKiBob3N0cywgYnV0IHNob3VsZG4ndCBodXJ0IG90aGVyd2lzZS4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIHRvcCA9IDB4ZmZmZmQwMDAgPj4gVU1fS0VSTl9QQUdFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgdGVzdDsKKworCXByaW50ZigiTG9jYXRpbmcgdGhlIHRvcCBvZiB0aGUgYWRkcmVzcyBzcGFjZSAuLi4gIik7CisJZmZsdXNoKHN0ZG91dCk7CisKKwkvKgorCSAqIFdlJ3JlIGdvaW5nIHRvIGJlIGxvbmdqbXBpbmcgb3V0IG9mIHRoZSBzaWduYWwgaGFuZGxlciwgc28KKwkgKiBTQV9ERUZFUiBuZWVkcyB0byBiZSBzZXQuCisJICovCisJc2Euc2FfaGFuZGxlciA9IHNlZ2ZhdWx0OworCXNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsKKwlzYS5zYV9mbGFncyA9IFNBX05PREVGRVI7CisJc2lnYWN0aW9uKFNJR1NFR1YsICZzYSwgJm9sZCk7CisKKwlpZiAoIXBhZ2Vfb2soYm90dG9tKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkFkZHJlc3MgMHgleCBubyBnb29kP1xuIiwKKwkJCWJvdHRvbSA8PCBVTV9LRVJOX1BBR0VfU0hJRlQpOworCQlleGl0KDEpOworCX0KKworCS8qIFRoaXMgY291bGQgaGFwcGVuIHdpdGggYSA0Ry80RyBzcGxpdCAqLworCWlmIChwYWdlX29rKHRvcCkpCisJCWdvdG8gb3V0OworCisJZG8geworCQl0ZXN0ID0gYm90dG9tICsgKHRvcCAtIGJvdHRvbSkgLyAyOworCQlpZiAocGFnZV9vayh0ZXN0KSkKKwkJCWJvdHRvbSA9IHRlc3Q7CisJCWVsc2UKKwkJCXRvcCA9IHRlc3Q7CisJfSB3aGlsZSAodG9wIC0gYm90dG9tID4gMSk7CisKK291dDoKKwkvKiBSZXN0b3JlIHRoZSBvbGQgU0lHU0VHViBoYW5kbGluZyAqLworCXNpZ2FjdGlvbihTSUdTRUdWLCAmb2xkLCBOVUxMKTsKKworCXRvcCA8PD0gVU1fS0VSTl9QQUdFX1NISUZUOworCXByaW50ZigiMHgleFxuIiwgdG9wKTsKKwlmZmx1c2goc3Rkb3V0KTsKKworCXJldHVybiB0b3A7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3N5cy14ODZfNjQvTWFrZWZpbGUgYi9hcmNoL3VtL29zLUxpbnV4L3N5cy14ODZfNjQvTWFrZWZpbGUKaW5kZXggYTQyYTRlZi4uYTQ0YTQ3ZiAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9zeXMteDg2XzY0L01ha2VmaWxlCisrKyBiL2FyY2gvdW0vb3MtTGludXgvc3lzLXg4Nl82NC9NYWtlZmlsZQpAQCAtMyw3ICszLDcgQEAKICMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogIwogCi1vYmoteSA9IHJlZ2lzdGVycy5vIHByY3RsLm8gc2lnbmFsLm8KK29iai15ID0gcmVnaXN0ZXJzLm8gcHJjdGwubyBzaWduYWwubyB0YXNrX3NpemUubwogCiBVU0VSX09CSlMgOj0gJChvYmoteSkKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9zeXMteDg2XzY0L3JlZ2lzdGVycy5jIGIvYXJjaC91bS9vcy1MaW51eC9zeXMteDg2XzY0L3JlZ2lzdGVycy5jCmluZGV4IDliZmE3ODkuLmEzNzU4NTMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvc3lzLXg4Nl82NC9yZWdpc3RlcnMuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3N5cy14ODZfNjQvcmVnaXN0ZXJzLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQorICogQ29weXJpZ2h0IChDKSAyMDA2IC0gMjAwNyBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCiAgKi8KIApAQCAtNywzMSArNywzNiBAQAogI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KICNkZWZpbmUgX19GUkFNRV9PRkZTRVRTCiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgImtlcm5fY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAibG9uZ2ptcC5oIgogI2luY2x1ZGUgInVzZXIuaCIKIAogaW50IHNhdmVfZnBfcmVnaXN0ZXJzKGludCBwaWQsIHVuc2lnbmVkIGxvbmcgKmZwX3JlZ3MpCiB7Ci0JaWYocHRyYWNlKFBUUkFDRV9HRVRGUFJFR1MsIHBpZCwgMCwgZnBfcmVncykgPCAwKQorCWlmIChwdHJhY2UoUFRSQUNFX0dFVEZQUkVHUywgcGlkLCAwLCBmcF9yZWdzKSA8IDApCiAJCXJldHVybiAtZXJybm87CiAJcmV0dXJuIDA7CiB9CiAKIGludCByZXN0b3JlX2ZwX3JlZ2lzdGVycyhpbnQgcGlkLCB1bnNpZ25lZCBsb25nICpmcF9yZWdzKQogewotCWlmKHB0cmFjZShQVFJBQ0VfU0VURlBSRUdTLCBwaWQsIDAsIGZwX3JlZ3MpIDwgMCkKKwlpZiAocHRyYWNlKFBUUkFDRV9TRVRGUFJFR1MsIHBpZCwgMCwgZnBfcmVncykgPCAwKQogCQlyZXR1cm4gLWVycm5vOwogCXJldHVybiAwOwogfQogCiB1bnNpZ25lZCBsb25nIGdldF90aHJlYWRfcmVnKGludCByZWcsIGptcF9idWYgKmJ1ZikKIHsKLQlzd2l0Y2gocmVnKXsKLQljYXNlIFJJUDogcmV0dXJuIGJ1ZlswXS0+X19yaXA7Ci0JY2FzZSBSU1A6IHJldHVybiBidWZbMF0tPl9fcnNwOwotCWNhc2UgUkJQOiByZXR1cm4gYnVmWzBdLT5fX3JicDsKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgUklQOgorCQlyZXR1cm4gYnVmWzBdLT5fX3JpcDsKKwljYXNlIFJTUDoKKwkJcmV0dXJuIGJ1ZlswXS0+X19yc3A7CisJY2FzZSBSQlA6CisJCXJldHVybiBidWZbMF0tPl9fcmJwOwogCWRlZmF1bHQ6Ci0JCXByaW50aygiZ2V0X3RocmVhZF9yZWdzIC0gdW5rbm93biByZWdpc3RlciAlZFxuIiwgcmVnKTsKKwkJcHJpbnRrKFVNX0tFUk5fRVJSICJnZXRfdGhyZWFkX3JlZ3MgLSB1bmtub3duIHJlZ2lzdGVyICVkXG4iLAorCQkgICAgICAgcmVnKTsKIAkJcmV0dXJuIDA7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9zeXMteDg2XzY0L3Rhc2tfc2l6ZS5jIGIvYXJjaC91bS9vcy1MaW51eC9zeXMteDg2XzY0L3Rhc2tfc2l6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZDZmNTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL29zLUxpbnV4L3N5cy14ODZfNjQvdGFza19zaXplLmMKQEAgLTAsMCArMSw1IEBACit1bnNpZ25lZCBsb25nIG9zX2dldF90YXNrX3NpemUodW5zaWduZWQgbG9uZyBzaGlmdCkKK3sKKwkvKiBUaGUgb2xkIHZhbHVlIG9mIENPTkZJR19UT1BfQUREUiAqLworCXJldHVybiAweDdmYzAwMDAwMDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3VhY2Nlc3MuYyBiL2FyY2gvdW0vb3MtTGludXgvdWFjY2Vzcy5jCmluZGV4IDhkMjdiNmQuLjA4N2VkNzQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvdWFjY2Vzcy5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvdWFjY2Vzcy5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwMSBDaHJpcyBFbWVyc29uIChjZW1lcnNvbkBjaGlhcmsuZ3JlZW5lbmQub3JnLnVrKQotICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCiAKQEAgLTE2LDcgKzE2LDcgQEAKIAogCWptcF9idWYgamJ1ZjsKIAkqZmF1bHRfY2F0Y2hlciA9ICZqYnVmOwotCWlmKFVNTF9TRVRKTVAoJmpidWYpID09IDApeworCWlmIChVTUxfU0VUSk1QKCZqYnVmKSA9PSAwKSB7CiAJCSgqb3ApKHRvLCBmcm9tLCBuKTsKIAkJcmV0ID0gMDsKIAkJKmZhdWx0ZWRfb3V0ID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvdXNlcl9zeW1zLmMgYi9hcmNoL3VtL29zLUxpbnV4L3VzZXJfc3ltcy5jCmluZGV4IDRjMzdiMWIuLjc0ZjQ5YmIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvdXNlcl9zeW1zLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC91c2VyX3N5bXMuYwpAQCAtMzQsOCArMzQsOCBAQAogICogZ29vZDsgc28gdGhlIHZlcnNpb25zIG9mIHRoZXNlIHN5bWJvbHMgd2lsbCBhbHdheXMgbWF0Y2gKICAqLwogI2RlZmluZSBFWFBPUlRfU1lNQk9MX1BST1RPKHN5bSkgICAgICAgXAotICAgICAgIGludCBzeW0odm9pZCk7ICAgICAgICAgICAgICAgICAgXAotICAgICAgIEVYUE9SVF9TWU1CT0woc3ltKTsKKwlpbnQgc3ltKHZvaWQpOyAgICAgICAgICAgICAgICAgIFwKKwlFWFBPUlRfU1lNQk9MKHN5bSk7CiAKIGV4dGVybiB2b2lkIHJlYWRkaXI2NCh2b2lkKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7CiBFWFBPUlRfU1lNQk9MKHJlYWRkaXI2NCk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3V0aWwuYyBiL2FyY2gvdW0vb3MtTGludXgvdXRpbC5jCmluZGV4IGE2ZjMxZDQuLjZlYTc3OTcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvdXRpbC5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvdXRpbC5jCkBAIC0xLDM5ICsxLDI0IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSAiYXNtL3R5cGVzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDx3YWl0Lmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzY2hlZC5oPgotI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJrZXJuX3V0aWwuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCi0jaW5jbHVkZSAibWVtX3VzZXIuaCIKLSNpbmNsdWRlICJpbml0LmgiCi0jaW5jbHVkZSAicHRyYWNlX3VzZXIuaCIKLSNpbmNsdWRlICJ1bWwtY29uZmlnLmgiCi0jaW5jbHVkZSAib3MuaCIKLSNpbmNsdWRlICJsb25nam1wLmgiCisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2luY2x1ZGUgPHdhaXQuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CiAjaW5jbHVkZSAia2Vybl9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJvcy5oIgorI2luY2x1ZGUgInVzZXIuaCIKIAogdm9pZCBzdGFja19wcm90ZWN0aW9ucyh1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7Ci0JaWYobXByb3RlY3QoKHZvaWQgKikgYWRkcmVzcywgVU1fVEhSRUFEX1NJWkUsCisJaWYgKG1wcm90ZWN0KCh2b2lkICopIGFkZHJlc3MsIFVNX1RIUkVBRF9TSVpFLAogCQkgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSB8IFBST1RfRVhFQykgPCAwKQogCQlwYW5pYygicHJvdGVjdGluZyBzdGFjayBmYWlsZWQsIGVycm5vID0gJWQiLCBlcnJubyk7CiB9CkBAIC00NCwxNyArMjksMTkgQEAKIAlpbnQgZXJyOwogCiAJQ0FUQ0hfRUlOVFIoZXJyID0gdGNnZXRhdHRyKGZkLCAmdHQpKTsKLQlpZihlcnIgPCAwKQorCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gLWVycm5vOwogCiAJY2ZtYWtlcmF3KCZ0dCk7CiAKIAlDQVRDSF9FSU5UUihlcnIgPSB0Y3NldGF0dHIoZmQsIFRDU0FEUkFJTiwgJnR0KSk7Ci0JaWYoZXJyIDwgMCkKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIC1lcnJubzsKIAotCS8qIFhYWCB0Y3NldGF0dHIgY291bGQgaGF2ZSBhcHBsaWVkIG9ubHkgc29tZSBjaGFuZ2VzCi0JICogKGFuZCBjZm1ha2VyYXcoKSBpcyBhIHNldCBvZiBjaGFuZ2VzKSAqLworCS8qCisJICogWFhYIHRjc2V0YXR0ciBjb3VsZCBoYXZlIGFwcGxpZWQgb25seSBzb21lIGNoYW5nZXMKKwkgKiAoYW5kIGNmbWFrZXJhdygpIGlzIGEgc2V0IG9mIGNoYW5nZXMpCisJICovCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvdjg1MC9LY29uZmlnIGIvYXJjaC92ODUwL0tjb25maWcKaW5kZXggYWNlNDc5YS4uN2I2ZDM3MSAxMDA2NDQKLS0tIGEvYXJjaC92ODUwL0tjb25maWcKKysrIGIvYXJjaC92ODUwL0tjb25maWcKQEAgLTUzLDYgKzUzLDkgQEAKIAlib29sCiAJZGVmYXVsdCBuCiAKK2NvbmZpZyBBUkNIX1NVUFBPUlRTX0FPVVQKKwlkZWZfYm9vbCB5CisKICMgVHVybiBvZmYgc29tZSByYW5kb20gMzg2IGNyYXAgdGhhdCBjYW4gYWZmZWN0IGRldmljZSBjb25maWcKIGNvbmZpZyBJU0EKIAlib29sCkBAIC0yMTIsNiArMjE1LDEzIEBACiAgICAJICBib29sCiAJICBkZWZhdWx0ICFWODUwRV9DQUNIRSAmJiAhVjg1MEUyX0NBQ0hFCiAKKyAgICMgSFogZGVwZW5kcyBvbiB0aGUgcGxhdGZvcm0KKyAgIGNvbmZpZyBIWgorCSAgaW50CisJICBkZWZhdWx0IDI0ICBpZiBWODUwRV9TSU0gfHwgVjg1MEUyX1NJTTg1RTIKKwkgIGRlZmF1bHQgMTIyIGlmIFY4NTBFMl9GUEdBODVFMkMKKwkgIGRlZmF1bHQgMTAwCisKICAgICMjIyMgTWlzYyBjb25maWcKIAogICAgY29uZmlnIFJPTV9LRVJORUwKZGlmZiAtLWdpdCBhL2FyY2gvdjg1MC9rZXJuZWwvYW5uYS5jIGIvYXJjaC92ODUwL2tlcm5lbC9hbm5hLmMKaW5kZXggMGU0MjkwNC4uNTk3OGEyNSAxMDA2NDQKLS0tIGEvYXJjaC92ODUwL2tlcm5lbC9hbm5hLmMKKysrIGIvYXJjaC92ODUwL2tlcm5lbC9hbm5hLmMKQEAgLTg1LDcgKzg1LDggQEAKIAkvKiBUaGUgc3BhY2UgYmV0d2VlbiBTUkFNIGFuZCBTRFJBTSBpcyBmaWxsZWQgd2l0aCBkdXBsaWNhdGUKIAkgICBpbWFnZXMgb2YgU1JBTS4gIFByZXZlbnQgdGhlIGtlcm5lbCBmcm9tIHVzaW5nIHRoZW0uICAqLwogCXJlc2VydmVfYm9vdG1lbSAoU1JBTV9BRERSICsgU1JBTV9TSVpFLAotCQkJIFNEUkFNX0FERFIgLSAoU1JBTV9BRERSICsgU1JBTV9TSVpFKSk7CisJCQkgU0RSQU1fQUREUiAtIChTUkFNX0FERFIgKyBTUkFNX1NJWkUpLAorCQkJIEJPT1RNRU1fREVGQVVMVCk7CiB9CiAKIHZvaWQgbWFjaF9nZXR0aW1lb2ZkYXkgKHN0cnVjdCB0aW1lc3BlYyAqdHYpCmRpZmYgLS1naXQgYS9hcmNoL3Y4NTAva2VybmVsL2FzODVlcDEuYyBiL2FyY2gvdjg1MC9rZXJuZWwvYXM4NWVwMS5jCmluZGV4IDE4NDM3YmMuLmI1MjVlY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvdjg1MC9rZXJuZWwvYXM4NWVwMS5jCisrKyBiL2FyY2gvdjg1MC9rZXJuZWwvYXM4NWVwMS5jCkBAIC0xMTYsNyArMTE2LDggQEAKIAlpZiAoU0RSQU1fQUREUiA8IFJBTV9FTkQgJiYgU0RSQU1fQUREUiA+IFJBTV9TVEFSVCkKIAkJLyogV2UgY2FuJ3QgdXNlIHRoZSBzcGFjZSBiZXR3ZWVuIFNSQU0gYW5kIFNEUkFNLCBzbwogCQkgICBwcmV2ZW50IHRoZSBrZXJuZWwgZnJvbSB0cnlpbmcuICAqLwotCQlyZXNlcnZlX2Jvb3RtZW0gKFNSQU1fRU5ELCBTRFJBTV9BRERSIC0gU1JBTV9FTkQpOworCQlyZXNlcnZlX2Jvb3RtZW0oU1JBTV9FTkQsIFNEUkFNX0FERFIgLSBTUkFNX0VORCwKKwkJCQlCT09UTUVNX0RFRkFVTFQpOwogfQogCiB2b2lkIG1hY2hfZ2V0dGltZW9mZGF5IChzdHJ1Y3QgdGltZXNwZWMgKnR2KQpkaWZmIC0tZ2l0IGEvYXJjaC92ODUwL2tlcm5lbC9wcm9jZnMuYyBiL2FyY2gvdjg1MC9rZXJuZWwvcHJvY2ZzLmMKaW5kZXggZTZmOWQwNi4uZTQzM2NkZSAxMDA2NDQKLS0tIGEvYXJjaC92ODUwL2tlcm5lbC9wcm9jZnMuYworKysgYi9hcmNoL3Y4NTAva2VybmVsL3Byb2Nmcy5jCkBAIC01OSw3ICs1OSw3IEBACiB7CiB9CiAKLXN0cnVjdCBzZXFfb3BlcmF0aW9ucyBjcHVpbmZvX29wID0geworY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGNwdWluZm9fb3AgPSB7CiAJLnN0YXJ0CT0gY3B1aW5mb19zdGFydCwKIAkubmV4dAk9IGNwdWluZm9fbmV4dCwKIAkuc3RvcAk9IGNwdWluZm9fc3RvcCwKZGlmZiAtLWdpdCBhL2FyY2gvdjg1MC9rZXJuZWwvcnRlX21hMV9jYi5jIGIvYXJjaC92ODUwL2tlcm5lbC9ydGVfbWExX2NiLmMKaW5kZXggOWE3MTZmOS4uMDhhYmYzZCAxMDA2NDQKLS0tIGEvYXJjaC92ODUwL2tlcm5lbC9ydGVfbWExX2NiLmMKKysrIGIvYXJjaC92ODUwL2tlcm5lbC9ydGVfbWExX2NiLmMKQEAgLTQ2LDEzICs0NiwxNSBAQAogewogI2lmZGVmIENPTkZJR19SVEVfQ0JfTVVMVEkKIAkvKiBQcmV2ZW50IHRoZSBrZXJuZWwgZnJvbSB0b3VjaGluZyB0aGUgbW9uaXRvcidzIHNjcmF0Y2ggUkFNLiAgKi8KLQlyZXNlcnZlX2Jvb3RtZW0gKE1PTl9TQ1JBVENIX0FERFIsIE1PTl9TQ1JBVENIX1NJWkUpOworCXJlc2VydmVfYm9vdG1lbShNT05fU0NSQVRDSF9BRERSLCBNT05fU0NSQVRDSF9TSVpFLAorCQkJQk9PVE1FTV9ERUZBVUxUKTsKICNlbmRpZgogCiAJLyogVGhlIHNwYWNlIGJldHdlZW4gU1JBTSBhbmQgU0RSQU0gaXMgZmlsbGVkIHdpdGggZHVwbGljYXRlCiAJICAgaW1hZ2VzIG9mIFNSQU0uICBQcmV2ZW50IHRoZSBrZXJuZWwgZnJvbSB1c2luZyB0aGVtLiAgKi8KIAlyZXNlcnZlX2Jvb3RtZW0gKFNSQU1fQUREUiArIFNSQU1fU0laRSwKLQkJCSBTRFJBTV9BRERSIC0gKFNSQU1fQUREUiArIFNSQU1fU0laRSkpOworCQkJIFNEUkFNX0FERFIgLSAoU1JBTV9BRERSICsgU1JBTV9TSVpFKSwKKwkJCSBCT09UTUVNX0RFRkFVTFQpOwogfQogCiB2b2lkIG1hY2hfZ2V0dGltZW9mZGF5IChzdHJ1Y3QgdGltZXNwZWMgKnR2KQpkaWZmIC0tZ2l0IGEvYXJjaC92ODUwL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC92ODUwL2tlcm5lbC9zZXR1cC5jCmluZGV4IGE5MTRmMjQuLmEwYTg0NTYgMTAwNjQ0Ci0tLSBhL2FyY2gvdjg1MC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3Y4NTAva2VybmVsL3NldHVwLmMKQEAgLTI0MSwxNSArMjQxLDE4IEBACiAJaWYgKGtyYW1fZW5kID4ga3JhbV9zdGFydCkKIAkJLyogUmVzZXJ2ZSB0aGUgUkFNIHBhcnQgb2YgdGhlIGtlcm5lbCdzIGFkZHJlc3Mgc3BhY2UsIHNvIGl0CiAJCSAgIGRvZXNuJ3QgZ2V0IGFsbG9jYXRlZC4gICovCi0JCXJlc2VydmVfYm9vdG1lbSAoa3JhbV9zdGFydCwga3JhbV9lbmQgLSBrcmFtX3N0YXJ0KTsKKwkJcmVzZXJ2ZV9ib290bWVtKGtyYW1fc3RhcnQsIGtyYW1fZW5kIC0ga3JhbV9zdGFydCwKKwkJCQlCT09UTUVNX0RFRkFVTFQpOwogCQogCWlmIChpbnR2X2luX3JhbSAmJiAhaW50dl9pbl9rcmFtKQogCQkvKiBSZXNlcnZlIHRoZSBpbnRlcnJ1cHQgdmVjdG9yIHNwYWNlLiAgKi8KLQkJcmVzZXJ2ZV9ib290bWVtIChpbnR2X3N0YXJ0LCBpbnR2X2VuZCAtIGludHZfc3RhcnQpOworCQlyZXNlcnZlX2Jvb3RtZW0oaW50dl9zdGFydCwgaW50dl9lbmQgLSBpbnR2X3N0YXJ0LAorCQkJCUJPT1RNRU1fREVGQVVMVCk7CiAKIAlpZiAoYm9vdG1hcCA+PSByYW1fc3RhcnQgJiYgYm9vdG1hcCA8IHJhbV9lbmQpCiAJCS8qIFJlc2VydmUgdGhlIGJvb3RtYXAgc3BhY2UuICAqLwotCQlyZXNlcnZlX2Jvb3RtZW0gKGJvb3RtYXAsIGJvb3RtYXBfbGVuKTsKKwkJcmVzZXJ2ZV9ib290bWVtKGJvb3RtYXAsIGJvb3RtYXBfbGVuLAorCQkJCUJPT1RNRU1fREVGQVVMVCk7CiAKIAkvKiBSZXNlcnZlIHRoZSBtZW1vcnkgdXNlZCBieSB0aGUgcm9vdCBmaWxlc3lzdGVtIGltYWdlIGlmIGl0J3MKIAkgICBpbiBSQU0uICAqLwpAQCAtMjU3LDcgKzI2MCw4IEBACiAJICAgICYmICh1bnNpZ25lZCBsb25nKSZfcm9vdF9mc19pbWFnZV9zdGFydCA+PSByYW1fc3RhcnQKIAkgICAgJiYgKHVuc2lnbmVkIGxvbmcpJl9yb290X2ZzX2ltYWdlX3N0YXJ0IDwgcmFtX2VuZCkKIAkJcmVzZXJ2ZV9ib290bWVtICgodW5zaWduZWQgbG9uZykmX3Jvb3RfZnNfaW1hZ2Vfc3RhcnQsCi0JCQkJICZfcm9vdF9mc19pbWFnZV9lbmQgLSAmX3Jvb3RfZnNfaW1hZ2Vfc3RhcnQpOworCQkJCSAmX3Jvb3RfZnNfaW1hZ2VfZW5kIC0gJl9yb290X2ZzX2ltYWdlX3N0YXJ0LAorCQkJCSBCT09UTUVNX0RFRkFVTFQpOwogCiAJLyogTGV0IHRoZSBwbGF0Zm9ybS1kZXBlbmRlbnQgY29kZSByZXNlcnZlIHNvbWUgdG9vLiAgKi8KIAlpZiAobXJiKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvS2NvbmZpZyBiL2FyY2gveDg2L0tjb25maWcKaW5kZXggZTY3MjhiZC4uNjVhNzBiNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvS2NvbmZpZworKysgYi9hcmNoL3g4Ni9LY29uZmlnCkBAIC01Miw2ICs1MiwxMCBAQAogY29uZmlnIFNFTUFQSE9SRV9TTEVFUEVSUwogCWRlZl9ib29sIHkKIAorY29uZmlnIEZBU1RfQ01QWENIR19MT0NBTAorCWJvb2wKKwlkZWZhdWx0IHkKKwogY29uZmlnIE1NVQogCWRlZl9ib29sIHkKIApAQCAtMTA1LDYgKzEwOSw5IEBACiAJYm9vbAogCWRlZmF1bHQgWDg2XzY0CiAKK2NvbmZpZyBBUkNIX0hBU19DUFVfUkVMQVgKKwlkZWZfYm9vbCB5CisKIGNvbmZpZyBIQVZFX1NFVFVQX1BFUl9DUFVfQVJFQQogCWRlZl9ib29sIFg4Nl82NAogCkBAIC0xMjksNiArMTM2LDkgQEAKIAlib29sCiAJZGVmYXVsdCBYODZfNjQKIAorY29uZmlnIEFSQ0hfU1VQUE9SVFNfQU9VVAorCWRlZl9ib29sIHkKKwogIyBVc2UgdGhlIGdlbmVyaWMgaW50ZXJydXB0IGhhbmRsaW5nIGNvZGUgaW4ga2VybmVsL2lycS86CiBjb25maWcgR0VORVJJQ19IQVJESVJRUwogCWJvb2wKQEAgLTYzMSw3ICs2NDEsNiBAQAogCiBjb25maWcgSThLCiAJdHJpc3RhdGUgIkRlbGwgbGFwdG9wIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBYODZfMzIKIAktLS1oZWxwLS0tCiAJICBUaGlzIGFkZHMgYSBkcml2ZXIgdG8gc2FmZWx5IGFjY2VzcyB0aGUgU3lzdGVtIE1hbmFnZW1lbnQgTW9kZQogCSAgb2YgdGhlIENQVSBvbiB0aGUgRGVsbCBJbnNwaXJvbiA4MDAwLiBUaGUgU3lzdGVtIE1hbmFnZW1lbnQgTW9kZQpAQCAtMTU3MSw3ICsxNTgwLDcgQEAKIAogY29uZmlnIElBMzJfQU9VVAogICAgICAgIHRyaXN0YXRlICJJQTMyIGEub3V0IHN1cHBvcnQiCi0gICAgICAgZGVwZW5kcyBvbiBJQTMyX0VNVUxBVElPTgorICAgICAgIGRlcGVuZHMgb24gSUEzMl9FTVVMQVRJT04gJiYgQVJDSF9TVVBQT1JUU19BT1VUCiAgICAgICAgaGVscAogICAgICAgICAgU3VwcG9ydCBvbGQgYS5vdXQgYmluYXJpZXMgaW4gdGhlIDMyYml0IGVtdWxhdGlvbi4KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaWEzMi9pYTMyX2FvdXQuYyBiL2FyY2gveDg2L2lhMzIvaWEzMl9hb3V0LmMKaW5kZXggZTRjMTIwNy4uNThjY2NiNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaWEzMi9pYTMyX2FvdXQuYworKysgYi9hcmNoL3g4Ni9pYTMyL2lhMzJfYW91dC5jCkBAIC0xNzIsOCArMTcyLDcgQEAKIAloYXNfZHVtcGVkID0gMTsKIAljdXJyZW50LT5mbGFncyB8PSBQRl9EVU1QQ09SRTsKIAlzdHJuY3B5KGR1bXAudV9jb21tLCBjdXJyZW50LT5jb21tLCBzaXplb2YoY3VycmVudC0+Y29tbSkpOwotCWR1bXAudV9hcjAgPSAodTMyKSgoKHVuc2lnbmVkIGxvbmcpKCZkdW1wLnJlZ3MpKSAtCi0JCQkgICAoKHVuc2lnbmVkIGxvbmcpKCZkdW1wKSkpOworCWR1bXAudV9hcjAgPSBvZmZzZXRvZihzdHJ1Y3QgdXNlcjMyLCByZWdzKTsKIAlkdW1wLnNpZ25hbCA9IHNpZ25yOwogCWR1bXBfdGhyZWFkMzIocmVncywgJmR1bXApOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9ib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9ib290LmMKaW5kZXggZDJhNTg0My4uNjgwYjczMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FjcGkvYm9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL2Jvb3QuYwpAQCAtNzgsNyArNzgsNiBAQAogaW50IGFjcGlfbGFwaWM7CiBpbnQgYWNwaV9pb2FwaWM7CiBpbnQgYWNwaV9zdHJpY3Q7Ci1FWFBPUlRfU1lNQk9MKGFjcGlfc3RyaWN0KTsKIAogdTggYWNwaV9zY2lfZmxhZ3MgX19pbml0ZGF0YTsKIGludCBhY3BpX3NjaV9vdmVycmlkZV9nc2kgX19pbml0ZGF0YTsKQEAgLTEwNiw3ICsxMDUsNyBAQAogI2lmZGVmCUNPTkZJR19YODZfNjQKIAogLyogcmVseSBvbiBhbGwgQUNQSSB0YWJsZXMgYmVpbmcgaW4gdGhlIGRpcmVjdCBtYXBwaW5nICovCi1jaGFyICpfX2FjcGlfbWFwX3RhYmxlKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCitjaGFyICpfX2luaXQgX19hY3BpX21hcF90YWJsZSh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCWlmICghcGh5c19hZGRyIHx8ICFzaXplKQogCQlyZXR1cm4gTlVMTDsKQEAgLTEzMSw3ICsxMzAsNyBAQAogICogZnJvbSB0aGUgZml4ZWQgYmFzZS4gIFRoYXQncyB3aHkgd2Ugc3RhcnQgYXQgRklYX0lPX0FQSUNfQkFTRV9FTkQgYW5kCiAgKiBjb3VudCBpZHggZG93biB3aGlsZSBpbmNyZW1lbnRpbmcgdGhlIHBoeXMgYWRkcmVzcy4KICAqLwotY2hhciAqX19hY3BpX21hcF90YWJsZSh1bnNpZ25lZCBsb25nIHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK2NoYXIgKl9faW5pdCBfX2FjcGlfbWFwX3RhYmxlKHVuc2lnbmVkIGxvbmcgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXVuc2lnbmVkIGxvbmcgYmFzZSwgb2Zmc2V0LCBtYXBwZWRfc2l6ZTsKIAlpbnQgaWR4OwpAQCAtNDkwLDggKzQ4OSw2IEBACiAJcmV0dXJuIGlycTsKIH0KIAotRVhQT1JUX1NZTUJPTChhY3BpX3JlZ2lzdGVyX2dzaSk7Ci0KIC8qCiAgKiAgQUNQSSBiYXNlZCBob3RwbHVnIHN1cHBvcnQgZm9yIENQVQogICovCkBAIC01ODcsMjUgKzU4NCw2IEBACiAKIEVYUE9SVF9TWU1CT0woYWNwaV91bnJlZ2lzdGVyX2lvYXBpYyk7CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdAotYWNwaV9zY2FuX3JzZHAodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBsZW5ndGgpCi17Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAwOwotCXVuc2lnbmVkIGxvbmcgc2lnX2xlbiA9IHNpemVvZigiUlNEIFBUUiAiKSAtIDE7Ci0KLQkvKgotCSAqIFNjYW4gYWxsIDE2LWJ5dGUgYm91bmRhcmllcyBvZiB0aGUgcGh5c2ljYWwgbWVtb3J5IHJlZ2lvbiBmb3IgdGhlCi0JICogUlNEUCBzaWduYXR1cmUuCi0JICovCi0JZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBsZW5ndGg7IG9mZnNldCArPSAxNikgewotCQlpZiAoc3RybmNtcCgoY2hhciAqKShwaHlzX3RvX3ZpcnQoc3RhcnQpICsgb2Zmc2V0KSwgIlJTRCBQVFIgIiwgc2lnX2xlbikpCi0JCQljb250aW51ZTsKLQkJcmV0dXJuIChzdGFydCArIG9mZnNldCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgX19pbml0IGFjcGlfcGFyc2Vfc2JmKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpCiB7CiAJc3RydWN0IGFjcGlfdGFibGVfYm9vdCAqc2I7CkBAIC03NDgsMjcgKzcyNiw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXVuc2lnbmVkIGxvbmcgX19pbml0IGFjcGlfZmluZF9yc2RwKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyByc2RwX3BoeXMgPSAwOwotCi0JaWYgKGVmaV9lbmFibGVkKSB7Ci0JCWlmIChlZmkuYWNwaTIwICE9IEVGSV9JTlZBTElEX1RBQkxFX0FERFIpCi0JCQlyZXR1cm4gZWZpLmFjcGkyMDsKLQkJZWxzZSBpZiAoZWZpLmFjcGkgIT0gRUZJX0lOVkFMSURfVEFCTEVfQUREUikKLQkJCXJldHVybiBlZmkuYWNwaTsKLQl9Ci0JLyoKLQkgKiBTY2FuIG1lbW9yeSBsb29raW5nIGZvciB0aGUgUlNEUCBzaWduYXR1cmUuIEZpcnN0IHNlYXJjaCBFQkRBIChsb3cKLQkgKiBtZW1vcnkpIHBhcmFncmFwaHMgYW5kIHRoZW4gc2VhcmNoIHVwcGVyIG1lbW9yeSAoRTAwMDAtRkZGRkYpLgotCSAqLwotCXJzZHBfcGh5cyA9IGFjcGlfc2Nhbl9yc2RwKDAsIDB4NDAwKTsKLQlpZiAoIXJzZHBfcGh5cykKLQkJcnNkcF9waHlzID0gYWNwaV9zY2FuX3JzZHAoMHhFMDAwMCwgMHgyMDAwMCk7Ci0KLQlyZXR1cm4gcnNkcF9waHlzOwotfQotCiAjaWZkZWYJQ09ORklHX1g4Nl9MT0NBTF9BUElDCiAvKgogICogUGFyc2UgTEFQSUMgZW50cmllcyBpbiBNQURUCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9wcm9jZXNzb3IuYyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL3Byb2Nlc3Nvci5jCmluZGV4IGEyNWRiNTEuLjMyNGViMGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL3Byb2Nlc3Nvci5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL3Byb2Nlc3Nvci5jCkBAIC00Niw2ICs0NiwxMiBAQAogCWJ1ZlsxXSA9IDE7CiAJYnVmWzJdID0gQUNQSV9QRENfQ19DQVBBQklMSVRZX1NNUDsKIAorCS8qCisJICogVGhlIGRlZmF1bHQgb2YgUERDX1NNUF9UX1NXQ09PUkQgYml0IGlzIHNldCBmb3IgaW50ZWwgeDg2IGNwdSBzbworCSAqIHRoYXQgT1NQTSBpcyBjYXBhYmxlIG9mIG5hdGl2ZSBBQ1BJIHRocm90dGxpbmcgc29mdHdhcmUKKwkgKiBjb29yZGluYXRpb24gdXNpbmcgQklPUyBzdXBwbGllZCBfVFNEIGluZm8uCisJICovCisJYnVmWzJdIHw9IEFDUElfUERDX1NNUF9UX1NXQ09PUkQ7CiAJaWYgKGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfRVNUKSkKIAkJYnVmWzJdIHw9IEFDUElfUERDX0VTVF9DQVBBQklMSVRZX1NXU01QOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvS2NvbmZpZyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9LY29uZmlnCmluZGV4IDE1MWVkYTAuLmNiN2E1NzEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9LY29uZmlnCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9LY29uZmlnCkBAIC0yOSw3ICsyOSw3IEBACiBjb25maWcgRUxBTl9DUFVGUkVRCiAJdHJpc3RhdGUgIkFNRCBFbGFuIFNDNDAwIGFuZCBTQzQxMCIKIAlzZWxlY3QgQ1BVX0ZSRVFfVEFCTEUKLQlkZXBlbmRzIG9uIFg4Nl8zMiAmJiBYODZfRUxBTgorCWRlcGVuZHMgb24gWDg2X0VMQU4KIAktLS1oZWxwLS0tCiAJICBUaGlzIGFkZHMgdGhlIENQVUZyZXEgZHJpdmVyIGZvciBBTUQgRWxhbiBTQzQwMCBhbmQgU0M0MTAKIAkgIHByb2Nlc3NvcnMuCkBAIC00NSw3ICs0NSw3IEBACiBjb25maWcgU0M1MjBfQ1BVRlJFUQogCXRyaXN0YXRlICJBTUQgRWxhbiBTQzUyMCIKIAlzZWxlY3QgQ1BVX0ZSRVFfVEFCTEUKLQlkZXBlbmRzIG9uIFg4Nl8zMiAmJiBYODZfRUxBTgorCWRlcGVuZHMgb24gWDg2X0VMQU4KIAktLS1oZWxwLS0tCiAJICBUaGlzIGFkZHMgdGhlIENQVUZyZXEgZHJpdmVyIGZvciBBTUQgRWxhbiBTQzUyMCBwcm9jZXNzb3IuCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9lX3Bvd2Vyc2F2ZXIuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9lX3Bvd2Vyc2F2ZXIuYwppbmRleCAzMjZhNGM4Li4zOWY4Y2IxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvZV9wb3dlcnNhdmVyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2VfcG93ZXJzYXZlci5jCkBAIC0yMyw2ICsyMyw3IEBACiAjZGVmaW5lIEVQU19CUkFORF9DNwkxCiAjZGVmaW5lIEVQU19CUkFORF9FREVOCTIKICNkZWZpbmUgRVBTX0JSQU5EX0MzCTMKKyNkZWZpbmUgRVBTX0JSQU5EX0M3RAk0CiAKIHN0cnVjdCBlcHNfY3B1X2RhdGEgewogCXUzMiBmc2I7CkBAIC01NCw2ICs1NSw3IEBACiB7CiAJc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7CiAJdTMyIGxvLCBoaTsKKwl1OCBjdXJyZW50X211bHRpcGxpZXIsIGN1cnJlbnRfdm9sdGFnZTsKIAlpbnQgZXJyID0gMDsKIAlpbnQgaTsKIApAQCAtOTMsNiArOTUsMTUgQEAKIAlyZG1zcihNU1JfSUEzMl9QRVJGX1NUQVRVUywgbG8sIGhpKTsKIAlmcmVxcy5uZXcgPSBjZW50YXVyLT5mc2IgKiAoKGxvID4+IDgpICYgMHhmZik7CiAKKwkvKiBQcmludCB2b2x0YWdlIGFuZCBtdWx0aXBsaWVyICovCisJcmRtc3IoTVNSX0lBMzJfUEVSRl9TVEFUVVMsIGxvLCBoaSk7CisJY3VycmVudF92b2x0YWdlID0gbG8gJiAweGZmOworCXByaW50ayhLRVJOX0lORk8gImVwczogQ3VycmVudCB2b2x0YWdlID0gJWRtVlxuIiwKKwkJY3VycmVudF92b2x0YWdlICogMTYgKyA3MDApOworCWN1cnJlbnRfbXVsdGlwbGllciA9IChsbyA+PiA4KSAmIDB4ZmY7CisJcHJpbnRrKEtFUk5fSU5GTyAiZXBzOiBDdXJyZW50IG11bHRpcGxpZXIgPSAlZFxuIiwKKwkJY3VycmVudF9tdWx0aXBsaWVyKTsKKwogCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOwogCXJldHVybiBlcnI7CiB9CkBAIC0xNDEsOSArMTUyLDEwIEBACiAJdTggY3VycmVudF9tdWx0aXBsaWVyLCBjdXJyZW50X3ZvbHRhZ2U7CiAJdTggbWF4X211bHRpcGxpZXIsIG1heF92b2x0YWdlOwogCXU4IG1pbl9tdWx0aXBsaWVyLCBtaW5fdm9sdGFnZTsKLQl1OCBicmFuZDsKKwl1OCBicmFuZCA9IDA7CiAJdTMyIGZzYjsKIAlzdHJ1Y3QgZXBzX2NwdV9kYXRhICpjZW50YXVyOworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZjcHVfZGF0YSgwKTsKIAlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKmZfdGFibGU7CiAJaW50IGssIHN0ZXAsIHZvbHRhZ2U7CiAJaW50IHJldDsKQEAgLTE1MywyMSArMTY1LDM2IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJLyogQ2hlY2sgYnJhbmQgKi8KLQlwcmludGsoImVwczogRGV0ZWN0ZWQgVklBICIpOwotCXJkbXNyKDB4MTE1MywgbG8sIGhpKTsKLQlicmFuZCA9ICgoKGxvID4+IDIpIF4gbG8pID4+IDE4KSAmIDM7CisJcHJpbnRrKEtFUk5fSU5GTyAiZXBzOiBEZXRlY3RlZCBWSUEgIik7CisKKwlzd2l0Y2ggKGMtPng4Nl9tb2RlbCkgeworCWNhc2UgMTA6CisJCXJkbXNyKDB4MTE1MywgbG8sIGhpKTsKKwkJYnJhbmQgPSAoKChsbyA+PiAyKSBeIGxvKSA+PiAxOCkgJiAzOworCQlwcmludGsoS0VSTl9DT05UICJNb2RlbCBBICIpOworCQlicmVhazsKKwljYXNlIDEzOgorCQlyZG1zcigweDExNTQsIGxvLCBoaSk7CisJCWJyYW5kID0gKCgobG8gPj4gNCkgXiAobG8gPj4gMikpKSAmIDB4MDAwMDAwZmY7CisJCXByaW50ayhLRVJOX0NPTlQgIk1vZGVsIEQgIik7CisJCWJyZWFrOworCX0KKwogCXN3aXRjaChicmFuZCkgewogCWNhc2UgRVBTX0JSQU5EX0M3TToKLQkJcHJpbnRrKCJDNy1NXG4iKTsKKwkJcHJpbnRrKEtFUk5fQ09OVCAiQzctTVxuIik7CiAJCWJyZWFrOwogCWNhc2UgRVBTX0JSQU5EX0M3OgotCQlwcmludGsoIkM3XG4iKTsKKwkJcHJpbnRrKEtFUk5fQ09OVCAiQzdcbiIpOwogCQlicmVhazsKIAljYXNlIEVQU19CUkFORF9FREVOOgotCQlwcmludGsoIkVkZW5cbiIpOworCQlwcmludGsoS0VSTl9DT05UICJFZGVuXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBFUFNfQlJBTkRfQzdEOgorCQlwcmludGsoS0VSTl9DT05UICJDNy1EXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBFUFNfQlJBTkRfQzM6Ci0JCXByaW50aygiQzNcbiIpOworCQlwcmludGsoS0VSTl9DT05UICJDM1xuIik7CiAJCXJldHVybiAtRU5PREVWOwogCQlicmVhazsKIAl9CkBAIC0xNzksNyArMjA2LDcgQEAKIAkJLyogQ2FuIGJlIGxvY2tlZCBhdCAwICovCiAJCXJkbXNybChNU1JfSUEzMl9NSVNDX0VOQUJMRSwgdmFsKTsKIAkJaWYgKCEodmFsICYgMSA8PCAxNikpIHsKLQkJCXByaW50aygiZXBzOiBDYW4ndCBlbmFibGUgRW5oYW5jZWQgUG93ZXJTYXZlclxuIik7CisJCQlwcmludGsoS0VSTl9JTkZPICJlcHM6IENhbid0IGVuYWJsZSBFbmhhbmNlZCBQb3dlclNhdmVyXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJfQpAQCAtMTg3LDE5ICsyMTQsMTkgQEAKIAkvKiBQcmludCB2b2x0YWdlIGFuZCBtdWx0aXBsaWVyICovCiAJcmRtc3IoTVNSX0lBMzJfUEVSRl9TVEFUVVMsIGxvLCBoaSk7CiAJY3VycmVudF92b2x0YWdlID0gbG8gJiAweGZmOwotCXByaW50aygiZXBzOiBDdXJyZW50IHZvbHRhZ2UgPSAlZG1WXG4iLCBjdXJyZW50X3ZvbHRhZ2UgKiAxNiArIDcwMCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiZXBzOiBDdXJyZW50IHZvbHRhZ2UgPSAlZG1WXG4iLCBjdXJyZW50X3ZvbHRhZ2UgKiAxNiArIDcwMCk7CiAJY3VycmVudF9tdWx0aXBsaWVyID0gKGxvID4+IDgpICYgMHhmZjsKLQlwcmludGsoImVwczogQ3VycmVudCBtdWx0aXBsaWVyID0gJWRcbiIsIGN1cnJlbnRfbXVsdGlwbGllcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiZXBzOiBDdXJyZW50IG11bHRpcGxpZXIgPSAlZFxuIiwgY3VycmVudF9tdWx0aXBsaWVyKTsKIAogCS8qIFByaW50IGxpbWl0cyAqLwogCW1heF92b2x0YWdlID0gaGkgJiAweGZmOwotCXByaW50aygiZXBzOiBIaWdoZXN0IHZvbHRhZ2UgPSAlZG1WXG4iLCBtYXhfdm9sdGFnZSAqIDE2ICsgNzAwKTsKKwlwcmludGsoS0VSTl9JTkZPICJlcHM6IEhpZ2hlc3Qgdm9sdGFnZSA9ICVkbVZcbiIsIG1heF92b2x0YWdlICogMTYgKyA3MDApOwogCW1heF9tdWx0aXBsaWVyID0gKGhpID4+IDgpICYgMHhmZjsKLQlwcmludGsoImVwczogSGlnaGVzdCBtdWx0aXBsaWVyID0gJWRcbiIsIG1heF9tdWx0aXBsaWVyKTsKKwlwcmludGsoS0VSTl9JTkZPICJlcHM6IEhpZ2hlc3QgbXVsdGlwbGllciA9ICVkXG4iLCBtYXhfbXVsdGlwbGllcik7CiAJbWluX3ZvbHRhZ2UgPSAoaGkgPj4gMTYpICYgMHhmZjsKLQlwcmludGsoImVwczogTG93ZXN0IHZvbHRhZ2UgPSAlZG1WXG4iLCBtaW5fdm9sdGFnZSAqIDE2ICsgNzAwKTsKKwlwcmludGsoS0VSTl9JTkZPICJlcHM6IExvd2VzdCB2b2x0YWdlID0gJWRtVlxuIiwgbWluX3ZvbHRhZ2UgKiAxNiArIDcwMCk7CiAJbWluX211bHRpcGxpZXIgPSAoaGkgPj4gMjQpICYgMHhmZjsKLQlwcmludGsoImVwczogTG93ZXN0IG11bHRpcGxpZXIgPSAlZFxuIiwgbWluX211bHRpcGxpZXIpOworCXByaW50ayhLRVJOX0lORk8gImVwczogTG93ZXN0IG11bHRpcGxpZXIgPSAlZFxuIiwgbWluX211bHRpcGxpZXIpOwogCiAJLyogU2FuaXR5IGNoZWNrcyAqLwogCWlmIChjdXJyZW50X211bHRpcGxpZXIgPT0gMCB8fCBtYXhfbXVsdGlwbGllciA9PSAwCkBAIC0yMDgsNyArMjM1LDcgQEAKIAlpZiAoY3VycmVudF9tdWx0aXBsaWVyID4gbWF4X211bHRpcGxpZXIKIAkgICAgfHwgbWF4X211bHRpcGxpZXIgPD0gbWluX211bHRpcGxpZXIpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmIChjdXJyZW50X3ZvbHRhZ2UgPiAweDFjIHx8IG1heF92b2x0YWdlID4gMHgxYykKKwlpZiAoY3VycmVudF92b2x0YWdlID4gMHgxZiB8fCBtYXhfdm9sdGFnZSA+IDB4MWYpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmIChtYXhfdm9sdGFnZSA8IG1pbl92b2x0YWdlKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTMxMCw3ICszMzcsNyBAQAogCS8qIFRoaXMgZHJpdmVyIHdpbGwgd29yayBvbmx5IG9uIENlbnRhdXIgQzcgcHJvY2Vzc29ycyB3aXRoCiAJICogRW5oYW5jZWQgU3BlZWRTdGVwL1Bvd2VyU2F2ZXIgcmVnaXN0ZXJzICovCiAJaWYgKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9DRU5UQVVSCi0JICAgIHx8IGMtPng4NiAhPSA2IHx8IGMtPng4Nl9tb2RlbCAhPSAxMCkKKwkgICAgfHwgYy0+eDg2ICE9IDYgfHwgYy0+eDg2X21vZGVsIDwgMTApCiAJCXJldHVybiAtRU5PREVWOwogCWlmICghY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9FU1QpKQogCQlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9neC1zdXNwbW9kLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvZ3gtc3VzcG1vZC5jCmluZGV4IDJlZDdkYjIuLjlkOWVhZTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9neC1zdXNwbW9kLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2d4LXN1c3Btb2QuYwpAQCAtMTgxLDggKzE4MSw4IEBACiAJc3RydWN0IHBjaV9kZXYgKmd4X3BjaSA9IE5VTEw7CiAKIAkvKiBjaGVjayBpZiBDUFUgaXMgYSBNZWRpYUdYIG9yIGEgR2VvZGUuICovCi0JaWYgKChjdXJyZW50X2NwdV9kYXRhLng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9OU0MpICYmCi0JICAgIChjdXJyZW50X2NwdV9kYXRhLng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9DWVJJWCkpIHsKKwlpZiAoKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX05TQykgJiYKKwkgICAgKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0NZUklYKSkgewogCQlkcHJpbnRrKCJlcnJvcjogbm8gTWVkaWFHWC9HZW9kZSBwcm9jZXNzb3IgZm91bmQhXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs3LmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazcuYwppbmRleCBiNWE5ODYzLi4wYTYxMTU5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazcuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazcuYwpAQCAtNDYwLDcgKzQ2MCw3IEBACiAKIAkJCWxhdGVuY3kgPSBwc2ItPnNldHRsaW5ndGltZTsKIAkJCWlmIChsYXRlbmN5IDwgMTAwKSB7Ci0JCQkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJCSU9TIHNldCBzZXR0bGluZyB0aW1lIHRvICVkIG1pY3Jvc2Vjb25kcy4iCisJCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkJJT1Mgc2V0IHNldHRsaW5nIHRpbWUgdG8gJWQgbWljcm9zZWNvbmRzLiAiCiAJCQkJCQkiU2hvdWxkIGJlIGF0IGxlYXN0IDEwMC4gQ29ycmVjdGluZy5cbiIsIGxhdGVuY3kpOwogCQkJCWxhdGVuY3kgPSAxMDA7CiAJCQl9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5jCmluZGV4IDVhZmZlOTEuLmM5OWQ1OWQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5jCkBAIC01NzgsMTAgKzU3OCw5IEBACiAJZm9yIChqID0gMDsgaiA8IGRhdGEtPm51bXBzOyBqKyspIHsKIAkJaWYgKGRhdGEtPnBvd2Vybm93X3RhYmxlW2pdLmZyZXF1ZW5jeSAhPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQpIHsKIAkJCWlmIChjcHVfZmFtaWx5ID09IENQVV9IV19QU1RBVEUpIHsKLQkJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiICAgJWQgOiBmaWQgMHgleCBkaWQgMHgleCAoJWQgTUh6KVxuIiwKKwkJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiICAgJWQgOiBwc3RhdGUgJWQgKCVkIE1IeilcbiIsCiAJCQkJCWosCi0JCQkJCShkYXRhLT5wb3dlcm5vd190YWJsZVtqXS5pbmRleCAmIDB4ZmYwMCkgPj4gOCwKLQkJCQkJKGRhdGEtPnBvd2Vybm93X3RhYmxlW2pdLmluZGV4ICYgMHhmZjAwMDApID4+IDE2LAorCQkJCQlkYXRhLT5wb3dlcm5vd190YWJsZVtqXS5pbmRleCwKIAkJCQkJZGF0YS0+cG93ZXJub3dfdGFibGVbal0uZnJlcXVlbmN5LzEwMDApOwogCQkJfSBlbHNlIHsKIAkJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiICAgJWQgOiBmaWQgMHgleCAoJWQgTUh6KSwgdmlkIDB4JXhcbiIsCkBAIC0xMjM1LDggKzEyMzQsMTAgQEAKIAlzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YTsKIAljcHVtYXNrX3Qgb2xkbWFzayA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKIAl1bnNpZ25lZCBpbnQga2h6ID0gMDsKKwl1bnNpZ25lZCBpbnQgZmlyc3Q7CiAKLQlkYXRhID0gcGVyX2NwdShwb3dlcm5vd19kYXRhLCBmaXJzdF9jcHUocGVyX2NwdShjcHVfY29yZV9tYXAsIGNwdSkpKTsKKwlmaXJzdCA9IGZpcnN0X2NwdShwZXJfY3B1KGNwdV9jb3JlX21hcCwgY3B1KSk7CisJZGF0YSA9IHBlcl9jcHUocG93ZXJub3dfZGF0YSwgZmlyc3QpOwogCiAJaWYgKCFkYXRhKQogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5oIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmgKaW5kZXggYWZkMmI1Mi4uYWI0OGNmZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmgKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmgKQEAgLTQ3LDcgKzQ3LDcgQEAKICNkZWZpbmUgQ1BVSURfWEZBTQkJCTB4MGZmMDAwMDAJLyogZXh0ZW5kZWQgZmFtaWx5ICovCiAjZGVmaW5lIENQVUlEX1hGQU1fSzgJCQkwCiAjZGVmaW5lIENQVUlEX1hNT0QJCQkweDAwMGYwMDAwCS8qIGV4dGVuZGVkIG1vZGVsICovCi0jZGVmaW5lIENQVUlEX1hNT0RfUkVWX01BU0sJCTB4MDAwODAwMDAKKyNkZWZpbmUgQ1BVSURfWE1PRF9SRVZfTUFTSwkJMHgwMDBjMDAwMAogI2RlZmluZSBDUFVJRF9YRkFNXzEwSAkJCTB4MDAxMDAwMDAJLyogZmFtaWx5IDB4MTAgKi8KICNkZWZpbmUgQ1BVSURfVVNFX1hGQU1fWE1PRAkJMHgwMDAwMGYwMAogI2RlZmluZSBDUFVJRF9HRVRfTUFYX0NBUEFCSUxJVElFUwkweDgwMDAwMDAwCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1saWIuYwppbmRleCA3NmMzYWIwLi45OGQ0ZmRiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWxpYi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtbGliLmMKQEAgLTE4OSwxMCArMTg5LDcgQEAKIAkJcHJpbnRrKEtFUk5fREVCVUcgInNwZWVkc3RlcC1saWI6IGNvdWxkbid0IGRldGVjdCBGU0Igc3BlZWQuIFBsZWFzZSBzZW5kIGFuIGUtbWFpbCB0byA8bGludXhAYnJvZG8uZGU+XG4iKTsKIAogCS8qIE11bHRpcGxpZXIuICovCi0JaWYgKGMtPng4Nl9tb2RlbCA8IDIpCi0JCW11bHQgPSBtc3JfbG8gPj4gMjc7Ci0JZWxzZQotCQltdWx0ID0gbXNyX2xvID4+IDI0OworCW11bHQgPSBtc3JfbG8gPj4gMjQ7CiAKIAlkcHJpbnRrKCJQNCAtIEZTQiAldSBrSHo7IE11bHRpcGxpZXIgJXU7IFNwZWVkICV1IGtIelxuIiwgZnNiLCBtdWx0LCAoZnNiICogbXVsdCkpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvbWFjaGluZV9rZXhlY18zMi5jIGIvYXJjaC94ODYva2VybmVsL21hY2hpbmVfa2V4ZWNfMzIuYwppbmRleCBjMWNmZDYwLi5kMGIyMzRjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvbWFjaGluZV9rZXhlY18zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9tYWNoaW5lX2tleGVjXzMyLmMKQEAgLTE1MSw3ICsxNTEsNyBAQAogCiB2b2lkIGFyY2hfY3Jhc2hfc2F2ZV92bWNvcmVpbmZvKHZvaWQpCiB7Ci0jaWZkZWYgQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRQorI2lmZGVmIENPTkZJR19OVU1BCiAJVk1DT1JFSU5GT19TWU1CT0wobm9kZV9kYXRhKTsKIAlWTUNPUkVJTkZPX0xFTkdUSChub2RlX2RhdGEsIE1BWF9OVU1OT0RFUyk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9tYWNoaW5lX2tleGVjXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvbWFjaGluZV9rZXhlY182NC5jCmluZGV4IGExZmVmNDIuLjIzNmQyZjggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9tYWNoaW5lX2tleGVjXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL21hY2hpbmVfa2V4ZWNfNjQuYwpAQCAtMjM0LDUgKzIzNCwxMCBAQAogdm9pZCBhcmNoX2NyYXNoX3NhdmVfdm1jb3JlaW5mbyh2b2lkKQogewogCVZNQ09SRUlORk9fU1lNQk9MKGluaXRfbGV2ZWw0X3BndCk7CisKKyNpZmRlZiBDT05GSUdfTlVNQQorCVZNQ09SRUlORk9fU1lNQk9MKG5vZGVfZGF0YSk7CisJVk1DT1JFSU5GT19MRU5HVEgobm9kZV9kYXRhLCBNQVhfTlVNTk9ERVMpOworI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9tcHBhcnNlXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbXBwYXJzZV8zMi5jCmluZGV4IDY3MDA5Y2QuLmYzNDllNjggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9tcHBhcnNlXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL21wcGFyc2VfMzIuYwpAQCAtNzM2LDcgKzczNiw4IEBACiAJCQlzbXBfZm91bmRfY29uZmlnID0gMTsKIAkJCXByaW50ayhLRVJOX0lORk8gImZvdW5kIFNNUCBNUC10YWJsZSBhdCBbJXBdICUwOGx4XG4iLAogCQkJCW1wZiwgdmlydF90b19waHlzKG1wZikpOwotCQkJcmVzZXJ2ZV9ib290bWVtKHZpcnRfdG9fcGh5cyhtcGYpLCBQQUdFX1NJWkUpOworCQkJcmVzZXJ2ZV9ib290bWVtKHZpcnRfdG9fcGh5cyhtcGYpLCBQQUdFX1NJWkUsCisJCQkJCUJPT1RNRU1fREVGQVVMVCk7CiAJCQlpZiAobXBmLT5tcGZfcGh5c3B0cikgewogCQkJCS8qCiAJCQkJICogV2UgY2Fubm90IGFjY2VzcyB0byBNUEMgdGFibGUgdG8gY29tcHV0ZQpAQCAtNzUxLDcgKzc1Miw4IEBACiAJCQkJdW5zaWduZWQgbG9uZyBlbmQgPSBtYXhfbG93X3BmbiAqIFBBR0VfU0laRTsKIAkJCQlpZiAobXBmLT5tcGZfcGh5c3B0ciArIHNpemUgPiBlbmQpCiAJCQkJCXNpemUgPSBlbmQgLSBtcGYtPm1wZl9waHlzcHRyOwotCQkJCXJlc2VydmVfYm9vdG1lbShtcGYtPm1wZl9waHlzcHRyLCBzaXplKTsKKwkJCQlyZXNlcnZlX2Jvb3RtZW0obXBmLT5tcGZfcGh5c3B0ciwgc2l6ZSwKKwkJCQkJCUJPT1RNRU1fREVGQVVMVCk7CiAJCQl9CiAKIAkJCW1wZl9mb3VuZCA9IG1wZjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jCmluZGV4IGRhYmRiZWYuLmE3ZDUwYTUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYwpAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvdXNlci5oPgotI2luY2x1ZGUgPGxpbnV4L2Eub3V0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC01MzksNTUgKzUzOCw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotLyoKLSAqIGZpbGwgaW4gdGhlIHVzZXIgc3RydWN0dXJlIGZvciBhIGNvcmUgZHVtcC4uCi0gKi8KLXZvaWQgZHVtcF90aHJlYWQoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBzdHJ1Y3QgdXNlciAqIGR1bXApCi17Ci0JdTE2IGdzOwotCi0vKiBjaGFuZ2VkIHRoZSBzaXplIGNhbGN1bGF0aW9ucyAtIHNob3VsZCBob3BlZnVsbHkgd29yayBiZXR0ZXIuIGxidCAqLwotCWR1bXAtPm1hZ2ljID0gQ01BR0lDOwotCWR1bXAtPnN0YXJ0X2NvZGUgPSAwOwotCWR1bXAtPnN0YXJ0X3N0YWNrID0gcmVncy0+c3AgJiB+KFBBR0VfU0laRSAtIDEpOwotCWR1bXAtPnVfdHNpemUgPSAoKHVuc2lnbmVkIGxvbmcpIGN1cnJlbnQtPm1tLT5lbmRfY29kZSkgPj4gUEFHRV9TSElGVDsKLQlkdW1wLT51X2RzaXplID0gKCh1bnNpZ25lZCBsb25nKSAoY3VycmVudC0+bW0tPmJyayArIChQQUdFX1NJWkUtMSkpKSA+PiBQQUdFX1NISUZUOwotCWR1bXAtPnVfZHNpemUgLT0gZHVtcC0+dV90c2l6ZTsKLQlkdW1wLT51X3NzaXplID0gMDsKLQlkdW1wLT51X2RlYnVncmVnWzBdID0gY3VycmVudC0+dGhyZWFkLmRlYnVncmVnMDsKLQlkdW1wLT51X2RlYnVncmVnWzFdID0gY3VycmVudC0+dGhyZWFkLmRlYnVncmVnMTsKLQlkdW1wLT51X2RlYnVncmVnWzJdID0gY3VycmVudC0+dGhyZWFkLmRlYnVncmVnMjsKLQlkdW1wLT51X2RlYnVncmVnWzNdID0gY3VycmVudC0+dGhyZWFkLmRlYnVncmVnMzsKLQlkdW1wLT51X2RlYnVncmVnWzRdID0gMDsKLQlkdW1wLT51X2RlYnVncmVnWzVdID0gMDsKLQlkdW1wLT51X2RlYnVncmVnWzZdID0gY3VycmVudC0+dGhyZWFkLmRlYnVncmVnNjsKLQlkdW1wLT51X2RlYnVncmVnWzddID0gY3VycmVudC0+dGhyZWFkLmRlYnVncmVnNzsKLQotCWlmIChkdW1wLT5zdGFydF9zdGFjayA8IFRBU0tfU0laRSkKLQkJZHVtcC0+dV9zc2l6ZSA9ICgodW5zaWduZWQgbG9uZykgKFRBU0tfU0laRSAtIGR1bXAtPnN0YXJ0X3N0YWNrKSkgPj4gUEFHRV9TSElGVDsKLQotCWR1bXAtPnJlZ3MuYnggPSByZWdzLT5ieDsKLQlkdW1wLT5yZWdzLmN4ID0gcmVncy0+Y3g7Ci0JZHVtcC0+cmVncy5keCA9IHJlZ3MtPmR4OwotCWR1bXAtPnJlZ3Muc2kgPSByZWdzLT5zaTsKLQlkdW1wLT5yZWdzLmRpID0gcmVncy0+ZGk7Ci0JZHVtcC0+cmVncy5icCA9IHJlZ3MtPmJwOwotCWR1bXAtPnJlZ3MuYXggPSByZWdzLT5heDsKLQlkdW1wLT5yZWdzLmRzID0gKHUxNilyZWdzLT5kczsKLQlkdW1wLT5yZWdzLmVzID0gKHUxNilyZWdzLT5lczsKLQlkdW1wLT5yZWdzLmZzID0gKHUxNilyZWdzLT5mczsKLQlzYXZlc2VnbWVudChncyxncyk7Ci0JZHVtcC0+cmVncy5vcmlnX2F4ID0gcmVncy0+b3JpZ19heDsKLQlkdW1wLT5yZWdzLmlwID0gcmVncy0+aXA7Ci0JZHVtcC0+cmVncy5jcyA9ICh1MTYpcmVncy0+Y3M7Ci0JZHVtcC0+cmVncy5mbGFncyA9IHJlZ3MtPmZsYWdzOwotCWR1bXAtPnJlZ3Muc3AgPSByZWdzLT5zcDsKLQlkdW1wLT5yZWdzLnNzID0gKHUxNilyZWdzLT5zczsKLQotCWR1bXAtPnVfZnB2YWxpZCA9IGR1bXBfZnB1IChyZWdzLCAmZHVtcC0+aTM4Nyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGR1bXBfdGhyZWFkKTsKLQogI2lmZGVmIENPTkZJR19TRUNDT01QCiBzdGF0aWMgdm9pZCBoYXJkX2Rpc2FibGVfVFNDKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYwppbmRleCAxMzdhODYxLi5iMGNjOGYwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNlci5oPgotI2luY2x1ZGUgPGxpbnV4L2Eub3V0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc2V0dXBfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9zZXR1cF8zMi5jCmluZGV4IDYyYWRjNWYuLmQxZDhjMzQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zZXR1cF8zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zZXR1cF8zMi5jCkBAIC0zOTAsNyArMzkwLDcgQEAKIAl1bnNpZ25lZCBpbnQgYWRkcjsKIAlhZGRyID0gZ2V0X2Jpb3NfZWJkYSgpOwogCWlmIChhZGRyKQotCQlyZXNlcnZlX2Jvb3RtZW0oYWRkciwgUEFHRV9TSVpFKTsKKwkJcmVzZXJ2ZV9ib290bWVtKGFkZHIsIFBBR0VfU0laRSwgQk9PVE1FTV9ERUZBVUxUKTsKIH0KIAogI2lmbmRlZiBDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUwpAQCAtNDg0LDcgKzQ4NCw4IEBACiAJCQkJCSh1bnNpZ25lZCBsb25nKSh0b3RhbF9tZW0gPj4gMjApKTsKIAkJCWNyYXNoa19yZXMuc3RhcnQgPSBjcmFzaF9iYXNlOwogCQkJY3Jhc2hrX3Jlcy5lbmQgICA9IGNyYXNoX2Jhc2UgKyBjcmFzaF9zaXplIC0gMTsKLQkJCXJlc2VydmVfYm9vdG1lbShjcmFzaF9iYXNlLCBjcmFzaF9zaXplKTsKKwkJCXJlc2VydmVfYm9vdG1lbShjcmFzaF9iYXNlLCBjcmFzaF9zaXplLAorCQkJCQlCT09UTUVNX0RFRkFVTFQpOwogCQl9IGVsc2UKIAkJCXByaW50ayhLRVJOX0lORk8gImNyYXNoa2VybmVsIHJlc2VydmF0aW9uIGZhaWxlZCAtICIKIAkJCQkJInlvdSBoYXZlIHRvIHNwZWNpZnkgYSBiYXNlIGFkZHJlc3NcbiIpOwpAQCAtNTI1LDcgKzUyNiw3IEBACiAJfQogCWlmIChyYW1kaXNrX2VuZCA8PSBlbmRfb2ZfbG93bWVtKSB7CiAJCS8qIEFsbCBpbiBsb3dtZW0sIGVhc3kgY2FzZSAqLwotCQlyZXNlcnZlX2Jvb3RtZW0ocmFtZGlza19pbWFnZSwgcmFtZGlza19zaXplKTsKKwkJcmVzZXJ2ZV9ib290bWVtKHJhbWRpc2tfaW1hZ2UsIHJhbWRpc2tfc2l6ZSwgQk9PVE1FTV9ERUZBVUxUKTsKIAkJaW5pdHJkX3N0YXJ0ID0gcmFtZGlza19pbWFnZSArIFBBR0VfT0ZGU0VUOwogCQlpbml0cmRfZW5kID0gaW5pdHJkX3N0YXJ0K3JhbWRpc2tfc2l6ZTsKIAkJcmV0dXJuOwpAQCAtNTM2LDcgKzUzNyw3IEBACiAKIAkvKiBOb3RlOiB0aGlzIGluY2x1ZGVzIGFsbCB0aGUgbG93bWVtIGN1cnJlbnRseSBvY2N1cGllZCBieQogCSAgIHRoZSBpbml0cmQsIHdlIHJlbHkgb24gdGhhdCBmYWN0IHRvIGtlZXAgdGhlIGRhdGEgaW50YWN0LiAqLwotCXJlc2VydmVfYm9vdG1lbShyYW1kaXNrX2hlcmUsIHJhbWRpc2tfc2l6ZSk7CisJcmVzZXJ2ZV9ib290bWVtKHJhbWRpc2tfaGVyZSwgcmFtZGlza19zaXplLCBCT09UTUVNX0RFRkFVTFQpOwogCWluaXRyZF9zdGFydCA9IHJhbWRpc2tfaGVyZSArIFBBR0VfT0ZGU0VUOwogCWluaXRyZF9lbmQgICA9IGluaXRyZF9zdGFydCArIHJhbWRpc2tfc2l6ZTsKIApAQCAtNjA2LDEzICs2MDcsMTQgQEAKIAkgKiBib290bWVtIGFsbG9jYXRvciB3aXRoIGFuIGludmFsaWQgUkFNIGFyZWEuCiAJICovCiAJcmVzZXJ2ZV9ib290bWVtKF9fcGFfc3ltYm9sKF90ZXh0KSwgKFBGTl9QSFlTKG1pbl9sb3dfcGZuKSArCi0JCQkgYm9vdG1hcF9zaXplICsgUEFHRV9TSVpFLTEpIC0gX19wYV9zeW1ib2woX3RleHQpKTsKKwkJCSBib290bWFwX3NpemUgKyBQQUdFX1NJWkUtMSkgLSBfX3BhX3N5bWJvbChfdGV4dCksCisJCQkgQk9PVE1FTV9ERUZBVUxUKTsKIAogCS8qCiAJICogcmVzZXJ2ZSBwaHlzaWNhbCBwYWdlIDAgLSBpdCdzIGEgc3BlY2lhbCBCSU9TIHBhZ2Ugb24gbWFueSBib3hlcywKIAkgKiBlbmFibGluZyBjbGVhbiByZWJvb3RzLCBTTVAgb3BlcmF0aW9uLCBsYXB0b3AgZnVuY3Rpb25zLgogCSAqLwotCXJlc2VydmVfYm9vdG1lbSgwLCBQQUdFX1NJWkUpOworCXJlc2VydmVfYm9vdG1lbSgwLCBQQUdFX1NJWkUsIEJPT1RNRU1fREVGQVVMVCk7CiAKIAkvKiByZXNlcnZlIEVCREEgcmVnaW9uLCBpdCdzIGEgNEsgcmVnaW9uICovCiAJcmVzZXJ2ZV9lYmRhX3JlZ2lvbigpOwpAQCAtNjIyLDcgKzYyNCw3IEBACiAgICAgICAgdW5sZXNzIHlvdSBoYXZlIG5vIFBTLzIgbW91c2UgcGx1Z2dlZCBpbi4gKi8KIAlpZiAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfQU1EICYmCiAJICAgIGJvb3RfY3B1X2RhdGEueDg2ID09IDYpCi0JICAgICByZXNlcnZlX2Jvb3RtZW0oMHhhMDAwMCAtIDQwOTYsIDQwOTYpOworCSAgICAgcmVzZXJ2ZV9ib290bWVtKDB4YTAwMDAgLSA0MDk2LCA0MDk2LCBCT09UTUVNX0RFRkFVTFQpOwogCiAjaWZkZWYgQ09ORklHX1NNUAogCS8qCkBAIC02MzAsNyArNjMyLDcgQEAKIAkgKiBGSVhNRTogRG9uJ3QgbmVlZCB0aGUgZXh0cmEgcGFnZSBhdCA0SywgYnV0IG5lZWQgdG8gZml4CiAJICogdHJhbXBvbGluZSBiZWZvcmUgcmVtb3ZpbmcgaXQuIChzZWUgdGhlIEdEVCBzdHVmZikKIAkgKi8KLQlyZXNlcnZlX2Jvb3RtZW0oUEFHRV9TSVpFLCBQQUdFX1NJWkUpOworCXJlc2VydmVfYm9vdG1lbShQQUdFX1NJWkUsIFBBR0VfU0laRSwgQk9PVE1FTV9ERUZBVUxUKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19BQ1BJX1NMRUVQCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9zZXR1cF82NC5jIGIvYXJjaC94ODYva2VybmVsL3NldHVwXzY0LmMKaW5kZXggYzg5MzlkZi4uYzBkODIwOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3NldHVwXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3NldHVwXzY0LmMKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNlci5oPgotI2luY2x1ZGUgPGxpbnV4L2Eub3V0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NyZWVuX2luZm8uaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtMTg5LDcgKzE4OCw3IEBACiAJYm9vdG1hcF9zaXplID0gaW5pdF9ib290bWVtKGJvb3RtYXAgPj4gUEFHRV9TSElGVCwgZW5kX3Bmbik7CiAJZTgyMF9yZWdpc3Rlcl9hY3RpdmVfcmVnaW9ucygwLCBzdGFydF9wZm4sIGVuZF9wZm4pOwogCWZyZWVfYm9vdG1lbV93aXRoX2FjdGl2ZV9yZWdpb25zKDAsIGVuZF9wZm4pOwotCXJlc2VydmVfYm9vdG1lbShib290bWFwLCBib290bWFwX3NpemUpOworCXJlc2VydmVfYm9vdG1lbShib290bWFwLCBib290bWFwX3NpemUsIEJPT1RNRU1fREVGQVVMVCk7CiB9CiAjZW5kaWYKIApAQCAtMjIwLDI4ICsyMTksMzUgQEAKICNpZmRlZiBDT05GSUdfS0VYRUMKIHN0YXRpYyB2b2lkIF9faW5pdCByZXNlcnZlX2NyYXNoa2VybmVsKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBsb25nIGZyZWVfbWVtOworCXVuc2lnbmVkIGxvbmcgbG9uZyB0b3RhbF9tZW07CiAJdW5zaWduZWQgbG9uZyBsb25nIGNyYXNoX3NpemUsIGNyYXNoX2Jhc2U7CiAJaW50IHJldDsKIAotCWZyZWVfbWVtID0KLQkJKCh1bnNpZ25lZCBsb25nIGxvbmcpbWF4X2xvd19wZm4gLSBtaW5fbG93X3BmbikgPDwgUEFHRV9TSElGVDsKKwl0b3RhbF9tZW0gPSAoKHVuc2lnbmVkIGxvbmcgbG9uZyltYXhfbG93X3BmbiAtIG1pbl9sb3dfcGZuKSA8PCBQQUdFX1NISUZUOwogCi0JcmV0ID0gcGFyc2VfY3Jhc2hrZXJuZWwoYm9vdF9jb21tYW5kX2xpbmUsIGZyZWVfbWVtLAorCXJldCA9IHBhcnNlX2NyYXNoa2VybmVsKGJvb3RfY29tbWFuZF9saW5lLCB0b3RhbF9tZW0sCiAJCQkmY3Jhc2hfc2l6ZSwgJmNyYXNoX2Jhc2UpOwogCWlmIChyZXQgPT0gMCAmJiBjcmFzaF9zaXplKSB7Ci0JCWlmIChjcmFzaF9iYXNlID4gMCkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiUmVzZXJ2aW5nICVsZE1CIG9mIG1lbW9yeSBhdCAlbGRNQiAiCi0JCQkJCSJmb3IgY3Jhc2hrZXJuZWwgKFN5c3RlbSBSQU06ICVsZE1CKVxuIiwKLQkJCQkJKHVuc2lnbmVkIGxvbmcpKGNyYXNoX3NpemUgPj4gMjApLAotCQkJCQkodW5zaWduZWQgbG9uZykoY3Jhc2hfYmFzZSA+PiAyMCksCi0JCQkJCSh1bnNpZ25lZCBsb25nKShmcmVlX21lbSA+PiAyMCkpOwotCQkJY3Jhc2hrX3Jlcy5zdGFydCA9IGNyYXNoX2Jhc2U7Ci0JCQljcmFzaGtfcmVzLmVuZCAgID0gY3Jhc2hfYmFzZSArIGNyYXNoX3NpemUgLSAxOwotCQkJcmVzZXJ2ZV9ib290bWVtKGNyYXNoX2Jhc2UsIGNyYXNoX3NpemUpOwotCQl9IGVsc2UKKwkJaWYgKGNyYXNoX2Jhc2UgPD0gMCkgewogCQkJcHJpbnRrKEtFUk5fSU5GTyAiY3Jhc2hrZXJuZWwgcmVzZXJ2YXRpb24gZmFpbGVkIC0gIgogCQkJCQkieW91IGhhdmUgdG8gc3BlY2lmeSBhIGJhc2UgYWRkcmVzc1xuIik7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAocmVzZXJ2ZV9ib290bWVtKGNyYXNoX2Jhc2UsIGNyYXNoX3NpemUsCisJCQkJCUJPT1RNRU1fRVhDTFVTSVZFKSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImNyYXNoa2VybmVsIHJlc2VydmF0aW9uIGZhaWxlZCAtICIKKwkJCQkJIm1lbW9yeSBpcyBpbiB1c2VcbiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUmVzZXJ2aW5nICVsZE1CIG9mIG1lbW9yeSBhdCAlbGRNQiAiCisJCQkJImZvciBjcmFzaGtlcm5lbCAoU3lzdGVtIFJBTTogJWxkTUIpXG4iLAorCQkJCSh1bnNpZ25lZCBsb25nKShjcmFzaF9zaXplID4+IDIwKSwKKwkJCQkodW5zaWduZWQgbG9uZykoY3Jhc2hfYmFzZSA+PiAyMCksCisJCQkJKHVuc2lnbmVkIGxvbmcpKHRvdGFsX21lbSA+PiAyMCkpOworCQljcmFzaGtfcmVzLnN0YXJ0ID0gY3Jhc2hfYmFzZTsKKwkJY3Jhc2hrX3Jlcy5lbmQgICA9IGNyYXNoX2Jhc2UgKyBjcmFzaF9zaXplIC0gMTsKIAl9CiB9CiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3NyYXRfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9zcmF0XzMyLmMKaW5kZXggMmJmNjkwMy4uYjcyZTYxMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3NyYXRfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc3JhdF8zMi5jCkBAIC0yNzQsNyArMjc0LDcgQEAKIAlpbnQgdGFibGVzID0gMDsKIAlpbnQgaSA9IDA7CiAKLQlyc2RwX2FkZHJlc3MgPSBhY3BpX2ZpbmRfcnNkcCgpOworCXJzZHBfYWRkcmVzcyA9IGFjcGlfb3NfZ2V0X3Jvb3RfcG9pbnRlcigpOwogCWlmICghcnNkcF9hZGRyZXNzKSB7CiAJCXByaW50aygiJXM6IFN5c3RlbSBkZXNjcmlwdGlvbiB0YWJsZXMgbm90IGZvdW5kXG4iLAogCQkgICAgICAgX19GVU5DVElPTl9fKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90aW1lXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvdGltZV82NC5jCmluZGV4IDAzODA3OTUuLmM3Mzc4NDkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC90aW1lXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RpbWVfNjQuYwpAQCAtNzcsNyArNzcsNyBAQAogCQlyZXNlcnZlX2V2bnRzZWxfbm1pKE1TUl9LN19FVk5UU0VMMCArIGkpOwogCX0KIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JLyogc3RhcnQgbWVhdXJpbmcgY3ljbGVzLCBpbmNyZW1lbnRpbmcgZnJvbSAwICovCisJLyogc3RhcnQgbWVhc3VyaW5nIGN5Y2xlcywgaW5jcmVtZW50aW5nIGZyb20gMCAqLwogCXdybXNybChNU1JfSzdfUEVSRkNUUjAgKyBpLCAwKTsKIAl3cm1zcmwoTVNSX0s3X0VWTlRTRUwwICsgaSwgMSA8PCAyMiB8IDMgPDwgMTYgfCAweDc2KTsKIAlyZHRzY2wodHNjX3N0YXJ0KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2Rpc2NvbnRpZ18zMi5jIGIvYXJjaC94ODYvbW0vZGlzY29udGlnXzMyLmMKaW5kZXggMDRiMWQyMC4uYzM5NGNhMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vZGlzY29udGlnXzMyLmMKKysrIGIvYXJjaC94ODYvbW0vZGlzY29udGlnXzMyLmMKQEAgLTM5MSw3ICszOTEsOCBAQAogdm9pZCBfX2luaXQgbnVtYV9rdmFfcmVzZXJ2ZSh2b2lkKQogewogCWlmIChrdmFfcGFnZXMpCi0JCXJlc2VydmVfYm9vdG1lbShQRk5fUEhZUyhrdmFfc3RhcnRfcGZuKSwgUEZOX1BIWVMoa3ZhX3BhZ2VzKSk7CisJCXJlc2VydmVfYm9vdG1lbShQRk5fUEhZUyhrdmFfc3RhcnRfcGZuKSwgUEZOX1BIWVMoa3ZhX3BhZ2VzKSwKKwkJCQlCT09UTUVNX0RFRkFVTFQpOwogfQogCiB2b2lkIF9faW5pdCB6b25lX3NpemVzX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2luaXRfNjQuYyBiL2FyY2gveDg2L21tL2luaXRfNjQuYwppbmRleCA5YjYxYzc1Li41ZmU4ODBmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9pbml0XzY0LmMKKysrIGIvYXJjaC94ODYvbW0vaW5pdF82NC5jCkBAIC02NDQsOSArNjQ0LDkgQEAKIAogCS8qIFNob3VsZCBjaGVjayBoZXJlIGFnYWluc3QgdGhlIGU4MjAgbWFwIHRvIGF2b2lkIGRvdWJsZSBmcmVlICovCiAjaWZkZWYgQ09ORklHX05VTUEKLQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobmlkKSwgcGh5cywgbGVuKTsKKwlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobmlkKSwgcGh5cywgbGVuLCBCT09UTUVNX0RFRkFVTFQpOwogI2Vsc2UKLQlyZXNlcnZlX2Jvb3RtZW0ocGh5cywgbGVuKTsKKwlyZXNlcnZlX2Jvb3RtZW0ocGh5cywgbGVuLCBCT09UTUVNX0RFRkFVTFQpOwogI2VuZGlmCiAJaWYgKHBoeXMrbGVuIDw9IE1BWF9ETUFfUEZOKlBBR0VfU0laRSkgewogCQlkbWFfcmVzZXJ2ZSArPSBsZW4gLyBQQUdFX1NJWkU7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9udW1hXzY0LmMgYi9hcmNoL3g4Ni9tbS9udW1hXzY0LmMKaW5kZXggNWEwMmJmNC4uMWFlY2M2NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vbnVtYV82NC5jCisrKyBiL2FyY2gveDg2L21tL251bWFfNjQuYwpAQCAtMjM4LDkgKzIzOCwxMCBAQAogCiAJZnJlZV9ib290bWVtX3dpdGhfYWN0aXZlX3JlZ2lvbnMobm9kZWlkLCBlbmQpOwogCi0JcmVzZXJ2ZV9ib290bWVtX25vZGUoTk9ERV9EQVRBKG5vZGVpZCksIG5vZGVkYXRhX3BoeXMsIHBnZGF0X3NpemUpOworCXJlc2VydmVfYm9vdG1lbV9ub2RlKE5PREVfREFUQShub2RlaWQpLCBub2RlZGF0YV9waHlzLCBwZ2RhdF9zaXplLAorCQkJQk9PVE1FTV9ERUZBVUxUKTsKIAlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobm9kZWlkKSwgYm9vdG1hcF9zdGFydCwKLQkJCSAgICAgYm9vdG1hcF9wYWdlczw8UEFHRV9TSElGVCk7CisJCQlib290bWFwX3BhZ2VzPDxQQUdFX1NISUZULCBCT09UTUVNX0RFRkFVTFQpOwogI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKIAlzcmF0X3Jlc2VydmVfYWRkX2FyZWEobm9kZWlkKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vcGd0YWJsZV8zMi5jIGIvYXJjaC94ODYvbW0vcGd0YWJsZV8zMi5jCmluZGV4IDZjMTkxNDYuLjczYWJhNzEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL3BndGFibGVfMzIuYworKysgYi9hcmNoL3g4Ni9tbS9wZ3RhYmxlXzMyLmMKQEAgLTE4Myw3ICsxODMsNyBAQAogCXJldHVybiAocHRlX3QgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTHxfX0dGUF9SRVBFQVR8X19HRlBfWkVSTyk7CiB9CiAKLXN0cnVjdCBwYWdlICpwdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCitwZ3RhYmxlX3QgcHRlX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewogCXN0cnVjdCBwYWdlICpwdGU7CiAKQEAgLTE5Miw2ICsxOTIsOCBAQAogI2Vsc2UKIAlwdGUgPSBhbGxvY19wYWdlcyhHRlBfS0VSTkVMfF9fR0ZQX1JFUEVBVHxfX0dGUF9aRVJPLCAwKTsKICNlbmRpZgorCWlmIChwdGUpCisJCXBndGFibGVfcGFnZV9jdG9yKHB0ZSk7CiAJcmV0dXJuIHB0ZTsKIH0KIApAQCAtMzY1LDYgKzM2Nyw3IEBACiAKIHZvaWQgX19wdGVfZnJlZV90bGIoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgc3RydWN0IHBhZ2UgKnB0ZSkKIHsKKwlwZ3RhYmxlX3BhZ2VfZHRvcihwdGUpOwogCXBhcmF2aXJ0X3JlbGVhc2VfcHQocGFnZV90b19wZm4ocHRlKSk7CiAJdGxiX3JlbW92ZV9wYWdlKHRsYiwgcHRlKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL3NyYXRfNjQuYyBiL2FyY2gveDg2L21tL3NyYXRfNjQuYwppbmRleCA2NTQxNmY4Li5lY2Q5MWVhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9zcmF0XzY0LmMKKysrIGIvYXJjaC94ODYvbW0vc3JhdF82NC5jCkBAIC00ODgsNyArNDg4LDggQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiU1JBVDogVGhpcyB3aWxsIGNvc3QgeW91ICVMdSBNQiBvZiAiCiAJCQkJInByZS1hbGxvY2F0ZWQgbWVtb3J5LlxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyl0b3RhbF9tYik7CiAJCXJlc2VydmVfYm9vdG1lbV9ub2RlKE5PREVfREFUQShub2RlaWQpLCBub2Rlc19hZGRbbm9kZWlkXS5zdGFydCwKLQkJCSAgICAgICBub2Rlc19hZGRbbm9kZWlkXS5lbmQgLSBub2Rlc19hZGRbbm9kZWlkXS5zdGFydCk7CisJCQkgICAgICAgbm9kZXNfYWRkW25vZGVpZF0uZW5kIC0gbm9kZXNfYWRkW25vZGVpZF0uc3RhcnQsCisJCQkgICAgICAgQk9PVE1FTV9ERUZBVUxUKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL0tjb25maWcgYi9hcmNoL3h0ZW5zYS9LY29uZmlnCmluZGV4IDVkNTU0NmMuLmZkMzY3NjQgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL0tjb25maWcKKysrIGIvYXJjaC94dGVuc2EvS2NvbmZpZwpAQCAtNDksNiArNDksMTAgQEAKIGNvbmZpZyBOT19JT1BPUlQKIAlkZWZfYm9vbCB5CiAKK2NvbmZpZyBIWgorCWludAorCWRlZmF1bHQgMTAwCisKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCiBtZW51ICJQcm9jZXNzb3IgdHlwZSBhbmQgZmVhdHVyZXMiCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvc2V0dXAuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9zZXR1cC5jCmluZGV4IDJlOGQzOTguLmI4MGYyY2IgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9zZXR1cC5jCkBAIC00NjksNyArNDY5LDcgQEAKIHsKIH0KIAotc3RydWN0IHNlcV9vcGVyYXRpb25zIGNwdWluZm9fb3AgPQorY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGNwdWluZm9fb3AgPQogewogCXN0YXJ0OiAgY19zdGFydCwKIAluZXh0OiAgIGNfbmV4dCwKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1jb3JlLmMgYi9ibG9jay9ibGstY29yZS5jCmluZGV4IDRhZmIzOWMuLmU5NzU0ZGMgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jb3JlLmMKKysrIGIvYmxvY2svYmxrLWNvcmUuYwpAQCAtNjAsMTAgKzYwLDE1IEBACiAJCXJldHVybjsKIAogCWlmICghbmV3X2lvKSB7Ci0JCV9fZGlza19zdGF0X2luYyhycS0+cnFfZGlzaywgbWVyZ2VzW3J3XSk7CisJCV9fYWxsX3N0YXRfaW5jKHJxLT5ycV9kaXNrLCBtZXJnZXNbcnddLCBycS0+c2VjdG9yKTsKIAl9IGVsc2UgeworCQlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0ID0gZ2V0X3BhcnQocnEtPnJxX2Rpc2ssIHJxLT5zZWN0b3IpOwogCQlkaXNrX3JvdW5kX3N0YXRzKHJxLT5ycV9kaXNrKTsKIAkJcnEtPnJxX2Rpc2stPmluX2ZsaWdodCsrOworCQlpZiAocGFydCkgeworCQkJcGFydF9yb3VuZF9zdGF0cyhwYXJ0KTsKKwkJCXBhcnQtPmluX2ZsaWdodCsrOworCQl9CiAJfQogfQogCkBAIC0xMDIsMjcgKzEwNywzOCBAQAogfQogRVhQT1JUX1NZTUJPTChibGtfZ2V0X2JhY2tpbmdfZGV2X2luZm8pOwogCisvKgorICogV2UgY2FuJ3QganVzdCBtZW1zZXQoKSB0aGUgc3RydWN0dXJlLCBzaW5jZSB0aGUgYWxsb2NhdGlvbiBwYXRoCisgKiBhbHJlYWR5IHN0b3JlZCBzb21lIGluZm9ybWF0aW9uIGluIHRoZSByZXF1ZXN0LgorICovCiB2b2lkIHJxX2luaXQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKIAlJTklUX0xJU1RfSEVBRCgmcnEtPnF1ZXVlbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJnJxLT5kb25lbGlzdCk7Ci0KLQlycS0+ZXJyb3JzID0gMDsKKwlycS0+cSA9IHE7CisJcnEtPnNlY3RvciA9IHJxLT5oYXJkX3NlY3RvciA9IChzZWN0b3JfdCkgLTE7CisJcnEtPm5yX3NlY3RvcnMgPSBycS0+aGFyZF9ucl9zZWN0b3JzID0gMDsKKwlycS0+Y3VycmVudF9ucl9zZWN0b3JzID0gcnEtPmhhcmRfY3VyX3NlY3RvcnMgPSAwOwogCXJxLT5iaW8gPSBycS0+YmlvdGFpbCA9IE5VTEw7CiAJSU5JVF9ITElTVF9OT0RFKCZycS0+aGFzaCk7CiAJUkJfQ0xFQVJfTk9ERSgmcnEtPnJiX25vZGUpOwotCXJxLT5pb3ByaW8gPSAwOwotCXJxLT5idWZmZXIgPSBOVUxMOwotCXJxLT5yZWZfY291bnQgPSAxOwotCXJxLT5xID0gcTsKLQlycS0+c3BlY2lhbCA9IE5VTEw7Ci0JcnEtPmRhdGFfbGVuID0gMDsKLQlycS0+ZGF0YSA9IE5VTEw7CisJcnEtPnJxX2Rpc2sgPSBOVUxMOwogCXJxLT5ucl9waHlzX3NlZ21lbnRzID0gMDsKKwlycS0+bnJfaHdfc2VnbWVudHMgPSAwOworCXJxLT5pb3ByaW8gPSAwOworCXJxLT5zcGVjaWFsID0gTlVMTDsKKwlycS0+YnVmZmVyID0gTlVMTDsKKwlycS0+dGFnID0gLTE7CisJcnEtPmVycm9ycyA9IDA7CisJcnEtPnJlZl9jb3VudCA9IDE7CisJcnEtPmNtZF9sZW4gPSAwOworCW1lbXNldChycS0+Y21kLCAwLCBzaXplb2YocnEtPmNtZCkpOworCXJxLT5kYXRhX2xlbiA9IDA7CisJcnEtPnNlbnNlX2xlbiA9IDA7CisJcnEtPmRhdGEgPSBOVUxMOwogCXJxLT5zZW5zZSA9IE5VTEw7CiAJcnEtPmVuZF9pbyA9IE5VTEw7CiAJcnEtPmVuZF9pb19kYXRhID0gTlVMTDsKLQlycS0+Y29tcGxldGlvbl9kYXRhID0gTlVMTDsKIAlycS0+bmV4dF9ycSA9IE5VTEw7CiB9CiAKQEAgLTk4Niw2ICsxMDAyLDIxIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkaXNrX3JvdW5kX3N0YXRzKTsKIAordm9pZCBwYXJ0X3JvdW5kX3N0YXRzKHN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQpCit7CisJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOworCisJaWYgKG5vdyA9PSBwYXJ0LT5zdGFtcCkKKwkJcmV0dXJuOworCisJaWYgKHBhcnQtPmluX2ZsaWdodCkgeworCQlfX3BhcnRfc3RhdF9hZGQocGFydCwgdGltZV9pbl9xdWV1ZSwKKwkJCQlwYXJ0LT5pbl9mbGlnaHQgKiAobm93IC0gcGFydC0+c3RhbXApKTsKKwkJX19wYXJ0X3N0YXRfYWRkKHBhcnQsIGlvX3RpY2tzLCAobm93IC0gcGFydC0+c3RhbXApKTsKKwl9CisJcGFydC0+c3RhbXAgPSBub3c7Cit9CisKIC8qCiAgKiBxdWV1ZSBsb2NrIG11c3QgYmUgaGVsZAogICovCkBAIC0xMTg4LDEwICsxMjE5LDYgQEAKIAogCWlmIChiaW9fc2VjdG9ycyhiaW8pICYmIGJkZXYgIT0gYmRldi0+YmRfY29udGFpbnMpIHsKIAkJc3RydWN0IGhkX3N0cnVjdCAqcCA9IGJkZXYtPmJkX3BhcnQ7Ci0JCWNvbnN0IGludCBydyA9IGJpb19kYXRhX2RpcihiaW8pOwotCi0JCXAtPnNlY3RvcnNbcnddICs9IGJpb19zZWN0b3JzKGJpbyk7Ci0JCXAtPmlvc1tyd10rKzsKIAogCQliaW8tPmJpX3NlY3RvciArPSBwLT5zdGFydF9zZWN0OwogCQliaW8tPmJpX2JkZXYgPSBiZGV2LT5iZF9jb250YWluczsKQEAgLTE1MTksNyArMTU0Niw4IEBACiAJaWYgKGJsa19mc19yZXF1ZXN0KHJlcSkgJiYgcmVxLT5ycV9kaXNrKSB7CiAJCWNvbnN0IGludCBydyA9IHJxX2RhdGFfZGlyKHJlcSk7CiAKLQkJZGlza19zdGF0X2FkZChyZXEtPnJxX2Rpc2ssIHNlY3RvcnNbcnddLCBucl9ieXRlcyA+PiA5KTsKKwkJYWxsX3N0YXRfYWRkKHJlcS0+cnFfZGlzaywgc2VjdG9yc1tyd10sCisJCQkgICAgIG5yX2J5dGVzID4+IDksIHJlcS0+c2VjdG9yKTsKIAl9CiAKIAl0b3RhbF9ieXRlcyA9IGJpb19uYnl0ZXMgPSAwOwpAQCAtMTcwNCwxMSArMTczMiwxNiBAQAogCWlmIChkaXNrICYmIGJsa19mc19yZXF1ZXN0KHJlcSkgJiYgcmVxICE9ICZyZXEtPnEtPmJhcl9ycSkgewogCQl1bnNpZ25lZCBsb25nIGR1cmF0aW9uID0gamlmZmllcyAtIHJlcS0+c3RhcnRfdGltZTsKIAkJY29uc3QgaW50IHJ3ID0gcnFfZGF0YV9kaXIocmVxKTsKKwkJc3RydWN0IGhkX3N0cnVjdCAqcGFydCA9IGdldF9wYXJ0KGRpc2ssIHJlcS0+c2VjdG9yKTsKIAotCQlfX2Rpc2tfc3RhdF9pbmMoZGlzaywgaW9zW3J3XSk7Ci0JCV9fZGlza19zdGF0X2FkZChkaXNrLCB0aWNrc1tyd10sIGR1cmF0aW9uKTsKKwkJX19hbGxfc3RhdF9pbmMoZGlzaywgaW9zW3J3XSwgcmVxLT5zZWN0b3IpOworCQlfX2FsbF9zdGF0X2FkZChkaXNrLCB0aWNrc1tyd10sIGR1cmF0aW9uLCByZXEtPnNlY3Rvcik7CiAJCWRpc2tfcm91bmRfc3RhdHMoZGlzayk7CiAJCWRpc2stPmluX2ZsaWdodC0tOworCQlpZiAocGFydCkgeworCQkJcGFydF9yb3VuZF9zdGF0cyhwYXJ0KTsKKwkJCXBhcnQtPmluX2ZsaWdodC0tOworCQl9CiAJfQogCiAJaWYgKHJlcS0+ZW5kX2lvKQpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLW1lcmdlLmMgYi9ibG9jay9ibGstbWVyZ2UuYwppbmRleCA4NDVlZjgxLi5kM2I4NGJiIDEwMDY0NAotLS0gYS9ibG9jay9ibGstbWVyZ2UuYworKysgYi9ibG9jay9ibGstbWVyZ2UuYwpAQCAtNDU0LDggKzQ1NCwxNCBAQAogCWVsdl9tZXJnZV9yZXF1ZXN0cyhxLCByZXEsIG5leHQpOwogCiAJaWYgKHJlcS0+cnFfZGlzaykgeworCQlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0CisJCQk9IGdldF9wYXJ0KHJlcS0+cnFfZGlzaywgcmVxLT5zZWN0b3IpOwogCQlkaXNrX3JvdW5kX3N0YXRzKHJlcS0+cnFfZGlzayk7CiAJCXJlcS0+cnFfZGlzay0+aW5fZmxpZ2h0LS07CisJCWlmIChwYXJ0KSB7CisJCQlwYXJ0X3JvdW5kX3N0YXRzKHBhcnQpOworCQkJcGFydC0+aW5fZmxpZ2h0LS07CisJCX0KIAl9CiAKIAlyZXEtPmlvcHJpbyA9IGlvcHJpb19iZXN0KHJlcS0+aW9wcmlvLCBuZXh0LT5pb3ByaW8pOwpkaWZmIC0tZ2l0IGEvYmxvY2svZ2VuaGQuYyBiL2Jsb2NrL2dlbmhkLmMKaW5kZXggZGUyZWJiMi4uNTNmMjIzOCAxMDA2NDQKLS0tIGEvYmxvY2svZ2VuaGQuYworKysgYi9ibG9jay9nZW5oZC5jCkBAIC01ODQsMTIgKzU4NCwyOCBAQAogCWZvciAobiA9IDA7IG4gPCBncC0+bWlub3JzIC0gMTsgbisrKSB7CiAJCXN0cnVjdCBoZF9zdHJ1Y3QgKmhkID0gZ3AtPnBhcnRbbl07CiAKLQkJaWYgKGhkICYmIGhkLT5ucl9zZWN0cykKLQkJCXNlcV9wcmludGYocywgIiU0ZCAlNGQgJXMgJXUgJXUgJXUgJXVcbiIsCi0JCQkJZ3AtPm1ham9yLCBuICsgZ3AtPmZpcnN0X21pbm9yICsgMSwKLQkJCQlkaXNrX25hbWUoZ3AsIG4gKyAxLCBidWYpLAotCQkJCWhkLT5pb3NbMF0sIGhkLT5zZWN0b3JzWzBdLAotCQkJCWhkLT5pb3NbMV0sIGhkLT5zZWN0b3JzWzFdKTsKKwkJaWYgKCFoZCB8fCAhaGQtPm5yX3NlY3RzKQorCQkJY29udGludWU7CisKKwkJcHJlZW1wdF9kaXNhYmxlKCk7CisJCXBhcnRfcm91bmRfc3RhdHMoaGQpOworCQlwcmVlbXB0X2VuYWJsZSgpOworCQlzZXFfcHJpbnRmKHMsICIlNGQgJTRkICVzICVsdSAlbHUgJWxsdSAiCisJCQkgICAiJXUgJWx1ICVsdSAlbGx1ICV1ICV1ICV1ICV1XG4iLAorCQkJICAgZ3AtPm1ham9yLCBuICsgZ3AtPmZpcnN0X21pbm9yICsgMSwKKwkJCSAgIGRpc2tfbmFtZShncCwgbiArIDEsIGJ1ZiksCisJCQkgICBwYXJ0X3N0YXRfcmVhZChoZCwgaW9zWzBdKSwKKwkJCSAgIHBhcnRfc3RhdF9yZWFkKGhkLCBtZXJnZXNbMF0pLAorCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwYXJ0X3N0YXRfcmVhZChoZCwgc2VjdG9yc1swXSksCisJCQkgICBqaWZmaWVzX3RvX21zZWNzKHBhcnRfc3RhdF9yZWFkKGhkLCB0aWNrc1swXSkpLAorCQkJICAgcGFydF9zdGF0X3JlYWQoaGQsIGlvc1sxXSksCisJCQkgICBwYXJ0X3N0YXRfcmVhZChoZCwgbWVyZ2VzWzFdKSwKKwkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpcGFydF9zdGF0X3JlYWQoaGQsIHNlY3RvcnNbMV0pLAorCQkJICAgamlmZmllc190b19tc2VjcyhwYXJ0X3N0YXRfcmVhZChoZCwgdGlja3NbMV0pKSwKKwkJCSAgIGhkLT5pbl9mbGlnaHQsCisJCQkgICBqaWZmaWVzX3RvX21zZWNzKHBhcnRfc3RhdF9yZWFkKGhkLCBpb190aWNrcykpLAorCQkJICAgamlmZmllc190b19tc2VjcyhwYXJ0X3N0YXRfcmVhZChoZCwgdGltZV9pbl9xdWV1ZSkpCisJCQkpOwogCX0KICAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2NyeXB0by9jYmMuYyBiL2NyeXB0by9jYmMuYwppbmRleCA2YWZmZmY4Li42MWFjNDJlIDEwMDY0NAotLS0gYS9jcnlwdG8vY2JjLmMKKysrIGIvY3J5cHRvL2NiYy5jCkBAIC0yMjQsNyArMjI0LDcgQEAKIAlhbGcgPSBjcnlwdG9fZ2V0X2F0dHJfYWxnKHRiLCBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSLAogCQkJCSAgQ1JZUFRPX0FMR19UWVBFX01BU0spOwogCWlmIChJU19FUlIoYWxnKSkKLQkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihhbGcpKTsKKwkJcmV0dXJuIEVSUl9DQVNUKGFsZyk7CiAKIAlpbnN0ID0gRVJSX1BUUigtRUlOVkFMKTsKIAlpZiAoIWlzX3Bvd2VyX29mXzIoYWxnLT5jcmFfYmxvY2tzaXplKSkKZGlmZiAtLWdpdCBhL2NyeXB0by9jcnlwdGQuYyBiL2NyeXB0by9jcnlwdGQuYwppbmRleCAwNzQyOThmLi4yNTA0MjUyIDEwMDY0NAotLS0gYS9jcnlwdG8vY3J5cHRkLmMKKysrIGIvY3J5cHRvL2NyeXB0ZC5jCkBAIC0yMzAsNyArMjMwLDcgQEAKIAlhbGcgPSBjcnlwdG9fZ2V0X2F0dHJfYWxnKHRiLCBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAogCQkJCSAgQ1JZUFRPX0FMR19UWVBFX01BU0spOwogCWlmIChJU19FUlIoYWxnKSkKLQkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihhbGcpKTsKKwkJcmV0dXJuIEVSUl9DQVNUKGFsZyk7CiAKIAlpbnN0ID0gY3J5cHRkX2FsbG9jX2luc3RhbmNlKGFsZywgc3RhdGUpOwogCWlmIChJU19FUlIoaW5zdCkpCkBAIC0yNjcsNyArMjY3LDcgQEAKIAogCWFsZ3QgPSBjcnlwdG9fZ2V0X2F0dHJfdHlwZSh0Yik7CiAJaWYgKElTX0VSUihhbGd0KSkKLQkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihhbGd0KSk7CisJCXJldHVybiBFUlJfQ0FTVChhbGd0KTsKIAogCXN3aXRjaCAoYWxndC0+dHlwZSAmIGFsZ3QtPm1hc2sgJiBDUllQVE9fQUxHX1RZUEVfTUFTSykgewogCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUjoKZGlmZiAtLWdpdCBhL2NyeXB0by9lY2IuYyBiL2NyeXB0by9lY2IuYwppbmRleCA2MzEwMzg3Li5hNDY4MzhlIDEwMDY0NAotLS0gYS9jcnlwdG8vZWNiLmMKKysrIGIvY3J5cHRvL2VjYi5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIAlhbGcgPSBjcnlwdG9fZ2V0X2F0dHJfYWxnKHRiLCBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSLAogCQkJCSAgQ1JZUFRPX0FMR19UWVBFX01BU0spOwogCWlmIChJU19FUlIoYWxnKSkKLQkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihhbGcpKTsKKwkJcmV0dXJuIEVSUl9DQVNUKGFsZyk7CiAKIAlpbnN0ID0gY3J5cHRvX2FsbG9jX2luc3RhbmNlKCJlY2IiLCBhbGcpOwogCWlmIChJU19FUlIoaW5zdCkpCmRpZmYgLS1naXQgYS9jcnlwdG8vaG1hYy5jIGIvY3J5cHRvL2htYWMuYwppbmRleCBhMWQwMTZhLi5iNjBjM2M3IDEwMDY0NAotLS0gYS9jcnlwdG8vaG1hYy5jCisrKyBiL2NyeXB0by9obWFjLmMKQEAgLTIxMyw3ICsyMTMsNyBAQAogCWFsZyA9IGNyeXB0b19nZXRfYXR0cl9hbGcodGIsIENSWVBUT19BTEdfVFlQRV9IQVNILAogCQkJCSAgQ1JZUFRPX0FMR19UWVBFX0hBU0hfTUFTSyk7CiAJaWYgKElTX0VSUihhbGcpKQotCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKGFsZykpOworCQlyZXR1cm4gRVJSX0NBU1QoYWxnKTsKIAogCWluc3QgPSBjcnlwdG9fYWxsb2NfaW5zdGFuY2UoImhtYWMiLCBhbGcpOwogCWlmIChJU19FUlIoaW5zdCkpCmRpZmYgLS1naXQgYS9jcnlwdG8vbHJ3LmMgYi9jcnlwdG8vbHJ3LmMKaW5kZXggNjIxMDk1ZC4uOWQ1MmU1OCAxMDA2NDQKLS0tIGEvY3J5cHRvL2xydy5jCisrKyBiL2NyeXB0by9scncuYwpAQCAtMjQxLDcgKzI0MSw3IEBACiAJYWxnID0gY3J5cHRvX2dldF9hdHRyX2FsZyh0YiwgQ1JZUFRPX0FMR19UWVBFX0NJUEhFUiwKIAkJCQkgIENSWVBUT19BTEdfVFlQRV9NQVNLKTsKIAlpZiAoSVNfRVJSKGFsZykpCi0JCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoYWxnKSk7CisJCXJldHVybiBFUlJfQ0FTVChhbGcpOwogCiAJaW5zdCA9IGNyeXB0b19hbGxvY19pbnN0YW5jZSgibHJ3IiwgYWxnKTsKIAlpZiAoSVNfRVJSKGluc3QpKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3BjYmMuYyBiL2NyeXB0by9wY2JjLmMKaW5kZXggZmU3MDQ3Ny4uZDFiOGJkZiAxMDA2NDQKLS0tIGEvY3J5cHRvL3BjYmMuYworKysgYi9jcnlwdG8vcGNiYy5jCkBAIC0yMzQsNyArMjM0LDcgQEAKIAlhbGcgPSBjcnlwdG9fZ2V0X2F0dHJfYWxnKHRiLCBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSLAogCQkJCSAgQ1JZUFRPX0FMR19UWVBFX01BU0spOwogCWlmIChJU19FUlIoYWxnKSkKLQkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihhbGcpKTsKKwkJcmV0dXJuIEVSUl9DQVNUKGFsZyk7CiAKIAlpbnN0ID0gY3J5cHRvX2FsbG9jX2luc3RhbmNlKCJwY2JjIiwgYWxnKTsKIAlpZiAoSVNfRVJSKGluc3QpKQpkaWZmIC0tZ2l0IGEvY3J5cHRvL3hjYmMuYyBiL2NyeXB0by94Y2JjLmMKaW5kZXggYTgyOTU5ZC4uODY3Mjc0MCAxMDA2NDQKLS0tIGEvY3J5cHRvL3hjYmMuYworKysgYi9jcnlwdG8veGNiYy5jCkBAIC0zMDEsNyArMzAxLDcgQEAKIAlhbGcgPSBjcnlwdG9fZ2V0X2F0dHJfYWxnKHRiLCBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSLAogCQkJCSAgQ1JZUFRPX0FMR19UWVBFX01BU0spOwogCWlmIChJU19FUlIoYWxnKSkKLQkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihhbGcpKTsKKwkJcmV0dXJuIEVSUl9DQVNUKGFsZyk7CiAKIAlzd2l0Y2goYWxnLT5jcmFfYmxvY2tzaXplKSB7CiAJY2FzZSAxNjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvS2NvbmZpZyBiL2RyaXZlcnMvS2NvbmZpZwppbmRleCBkNzRkOWZiLi4zYTBlMzU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL0tjb25maWcKKysrIGIvZHJpdmVycy9LY29uZmlnCkBAIC02MCw2ICs2MCw4IEBACiAKIHNvdXJjZSAiZHJpdmVycy9od21vbi9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvdGhlcm1hbC9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL3NzYi9LY29uZmlnIgpAQCAtNzgsNiArODAsOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvbW1jL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9tZW1zdGljay9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvbGVkcy9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvaW5maW5pYmFuZC9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9NYWtlZmlsZSBiL2RyaXZlcnMvTWFrZWZpbGUKaW5kZXggZjFjMTFkYi4uZTVlMzk0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL01ha2VmaWxlCkBAIC02NSw2ICs2NSw3IEBACiBvYmotJChDT05GSUdfVzEpCQkrPSB3MS8KIG9iai0kKENPTkZJR19QT1dFUl9TVVBQTFkpCSs9IHBvd2VyLwogb2JqLSQoQ09ORklHX0hXTU9OKQkJKz0gaHdtb24vCitvYmotJChDT05GSUdfVEhFUk1BTCkJCSs9IHRoZXJtYWwvCiBvYmotJChDT05GSUdfV0FUQ0hET0cpCQkrPSB3YXRjaGRvZy8KIG9iai0kKENPTkZJR19QSE9ORSkJCSs9IHRlbGVwaG9ueS8KIG9iai0kKENPTkZJR19NRCkJCSs9IG1kLwpAQCAtNzcsNiArNzgsNyBAQAogb2JqLSQoQ09ORklHX0NQVV9GUkVRKQkJKz0gY3B1ZnJlcS8KIG9iai0kKENPTkZJR19DUFVfSURMRSkJCSs9IGNwdWlkbGUvCiBvYmotJChDT05GSUdfTU1DKQkJKz0gbW1jLworb2JqLSQoQ09ORklHX01FTVNUSUNLKQkJKz0gbWVtc3RpY2svCiBvYmotJChDT05GSUdfTkVXX0xFRFMpCQkrPSBsZWRzLwogb2JqLSQoQ09ORklHX0lORklOSUJBTkQpCSs9IGluZmluaWJhbmQvCiBvYmotJChDT05GSUdfU0dJX1NOKQkJKz0gc24vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvS2NvbmZpZyBiL2RyaXZlcnMvYWNwaS9LY29uZmlnCmluZGV4IGNjZjZlYTkuLmY2ODhjMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvYWNwaS9LY29uZmlnCkBAIC02OCwyNiArNjgsMjggQEAKIAogCSAgU2F5IE4gdG8gZGVsZXRlIC9wcm9jL2FjcGkvIGZpbGVzIHRoYXQgaGF2ZSBtb3ZlZCB0byAvc3lzLwogY29uZmlnIEFDUElfUFJPQ0ZTX1BPV0VSCi0JYm9vbCAiRGVwcmVjYXRlZCBwb3dlciAvcHJvYy9hY3BpIGZvbGRlcnMiCisJYm9vbCAiRGVwcmVjYXRlZCBwb3dlciAvcHJvYy9hY3BpIGRpcmVjdG9yaWVzIgogCWRlcGVuZHMgb24gUFJPQ19GUwogCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KIAkgIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdGhpcyBvcHRpb24gYWxsb3dzCi0gICAgICAgICAgZGVwcmVjYXRlZCBwb3dlciAvcHJvYy9hY3BpLyBmb2xkZXJzIHRvIGV4aXN0LCBldmVuIHdoZW4KKyAgICAgICAgICBkZXByZWNhdGVkIHBvd2VyIC9wcm9jL2FjcGkvIGRpcmVjdG9yaWVzIHRvIGV4aXN0LCBldmVuIHdoZW4KICAgICAgICAgICB0aGV5IGhhdmUgYmVlbiByZXBsYWNlZCBieSBmdW5jdGlvbnMgaW4gL3N5cy4KLSAgICAgICAgICBUaGUgZGVwcmVjYXRlZCBmb2xkZXJzIChhbmQgdGhlaXIgcmVwbGFjZW1lbnRzKSBpbmNsdWRlOgorICAgICAgICAgIFRoZSBkZXByZWNhdGVkIGRpcmVjdG9yaWVzIChhbmQgdGhlaXIgcmVwbGFjZW1lbnRzKSBpbmNsdWRlOgogCSAgL3Byb2MvYWNwaS9iYXR0ZXJ5LyogKC9zeXMvY2xhc3MvcG93ZXJfc3VwcGx5LyopCiAJICAvcHJvYy9hY3BpL2FjX2FkYXB0ZXIvKiAoc3lzL2NsYXNzL3Bvd2VyX3N1cHBseS8qKQotCSAgVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiAvcHJvYy9hY3BpLyBmb2xkZXJzCisJICBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIC9wcm9jL2FjcGkvIGRpcmVjdG9yaWVzCiAJICBhbmQgZnVuY3Rpb25zLCB3aGljaCBkbyBub3QgeWV0IGV4aXN0IGluIC9zeXMKIAotCSAgU2F5IE4gdG8gZGVsZXRlIHBvd2VyIC9wcm9jL2FjcGkvIGZvbGRlcnMgdGhhdCBoYXZlIG1vdmVkIHRvIC9zeXMvCisJICBTYXkgTiB0byBkZWxldGUgcG93ZXIgL3Byb2MvYWNwaS8gZGlyZWN0b3JpZXMgdGhhdCBoYXZlIG1vdmVkIHRvIC9zeXMvCisKIGNvbmZpZyBBQ1BJX1NZU0ZTX1BPV0VSCiAJYm9vbCAiRnV0dXJlIHBvd2VyIC9zeXMgaW50ZXJmYWNlIgogCXNlbGVjdCBQT1dFUl9TVVBQTFkKIAlkZWZhdWx0IHkKIAktLS1oZWxwLS0tCiAJICBTYXkgTiB0byBkaXNhYmxlIHBvd2VyIC9zeXMgaW50ZXJmYWNlCisKIGNvbmZpZyBBQ1BJX1BST0NfRVZFTlQKIAlib29sICJEZXByZWNhdGVkIC9wcm9jL2FjcGkvZXZlbnQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBST0NfRlMKQEAgLTE4Niw2ICsxODgsNyBAQAogY29uZmlnIEFDUElfVEhFUk1BTAogCXRyaXN0YXRlICJUaGVybWFsIFpvbmUiCiAJZGVwZW5kcyBvbiBBQ1BJX1BST0NFU1NPUgorCXNlbGVjdCBUSEVSTUFMCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgVGhpcyBkcml2ZXIgYWRkcyBzdXBwb3J0IGZvciBBQ1BJIHRoZXJtYWwgem9uZXMuICBNb3N0IG1vYmlsZSBhbmQKQEAgLTE5OSw2ICsyMDIsMjggQEAKIAlkZXBlbmRzIG9uIChYODYgfHwgSUE2NCkKIAlkZWZhdWx0IHkgaWYgSUE2NF9HRU5FUklDIHx8IElBNjRfU0dJX1NOMgogCitjb25maWcgQUNQSV9XTUkKKwl0cmlzdGF0ZSAiV01JIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gWDg2CisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIHRoZSBBQ1BJLVdNSSAoV2luZG93cyBNYW5hZ2VtZW50CisJICBJbnN0cnVtZW50YXRpb24pIG1hcHBlciBkZXZpY2UgKFBOUDBDMTQpIGZvdW5kIG9uIHNvbWUgc3lzdGVtcy4KKworCSAgQUNQSS1XTUkgaXMgYSBwcm9wcmlldGFyeSBleHRlbnNpb24gdG8gQUNQSSB0byBleHBvc2UgcGFydHMgb2YgdGhlCisJICBBQ1BJIGZpcm13YXJlIHRvIHVzZXJzcGFjZSAtIHRoaXMgaXMgZG9uZSB0aHJvdWdoIHZhcmlvdXMgdmVuZG9yCisJICBkZWZpbmVkIG1ldGhvZHMgYW5kIGRhdGEgYmxvY2tzIGluIGEgUE5QMEMxNCBkZXZpY2UsIHdoaWNoIGFyZSB0aGVuCisJICBtYWRlIGF2YWlsYWJsZSBmb3IgdXNlcnNwYWNlIHRvIGNhbGwuCisKKwkgIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGluIExpbnV4IGN1cnJlbnRseSBvbmx5IGV4cG9zZXMgdGhpcyB0bworCSAgb3RoZXIga2VybmVsIHNwYWNlIGRyaXZlcnMuCisKKwkgIFRoaXMgZHJpdmVyIGlzIGEgcmVxdWlyZWQgZGVwZW5kZW5jeSB0byBidWlsZCB0aGUgZmlybXdhcmUgc3BlY2lmaWMKKwkgIGRyaXZlcnMgbmVlZGVkIG9uIG1hbnkgbWFjaGluZXMsIGluY2x1ZGluZyBBY2VyIGFuZCBIUCBsYXB0b3BzLgorCisJICBJdCBpcyBzYWZlIHRvIGVuYWJsZSB0aGlzIGRyaXZlciBldmVuIGlmIHlvdXIgRFNEVCBkb2Vzbid0IGRlZmluZQorCSAgYW55IEFDUEktV01JIGRldmljZXMuCisKIGNvbmZpZyBBQ1BJX0FTVVMKICAgICAgICAgdHJpc3RhdGUgIkFTVVMvTWVkaW9uIExhcHRvcCBFeHRyYXMiCiAJZGVwZW5kcyBvbiBYODYKQEAgLTI2Myw4ICsyODgsMTAgQEAKIAlkZXBlbmRzIG9uICFTVEFOREFMT05FCiAJZGVmYXVsdCBuIAogCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGlzIHRvIGxvYWQgYSBjdXN0b20gQUNQSSBEU0RUCi0JICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRoYXQgaXMsIHNheSBOLgorCSAgVGhpcyBvcHRpb24gc3VwcG9ydHMgYSBjdXN0b20gRFNEVCBieSBsaW5raW5nIGl0IGludG8gdGhlIGtlcm5lbC4KKwkgIFNlZSBEb2N1bWVudGF0aW9uL2FjcGkvZHNkdC1vdmVycmlkZS50eHQKKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAogY29uZmlnIEFDUElfQ1VTVE9NX0RTRFRfRklMRQogCXN0cmluZyAiQ3VzdG9tIERTRFQgVGFibGUgZmlsZSB0byBpbmNsdWRlIgpAQCAtMjc0LDYgKzMwMSwxNyBAQAogCSAgRW50ZXIgdGhlIGZ1bGwgcGF0aCBuYW1lIHRvIHRoZSBmaWxlIHdoaWNoIGluY2x1ZGVzIHRoZSBBbWxDb2RlCiAJICBkZWNsYXJhdGlvbi4KIAorY29uZmlnIEFDUElfQ1VTVE9NX0RTRFRfSU5JVFJECisJYm9vbCAiUmVhZCBDdXN0b20gRFNEVCBmcm9tIGluaXRyYW1mcyIKKwlkZXBlbmRzIG9uIEJMS19ERVZfSU5JVFJECisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBvcHRpb24gc3VwcG9ydHMgYSBjdXN0b20gRFNEVCBieSBvcHRpb25hbGx5IGxvYWRpbmcgaXQgZnJvbSBpbml0cmQuCisJICBTZWUgRG9jdW1lbnRhdGlvbi9hY3BpL2RzZHQtb3ZlcnJpZGUudHh0CisKKwkgIElmIHlvdSBhcmUgbm90IHVzaW5nIHRoaXMgZmVhdHVyZSBub3csIGJ1dCBtYXkgdXNlIGl0IGxhdGVyLAorCSAgaXQgaXMgc2FmZSB0byBzYXkgWSBoZXJlLgorCiBjb25maWcgQUNQSV9CTEFDS0xJU1RfWUVBUgogCWludCAiRGlzYWJsZSBBQ1BJIGZvciBzeXN0ZW1zIGJlZm9yZSBKYW4gMXN0IHRoaXMgeWVhciIgaWYgWDg2XzMyCiAJZGVmYXVsdCAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvTWFrZWZpbGUgYi9kcml2ZXJzL2FjcGkvTWFrZWZpbGUKaW5kZXggNDU2NDQ2Zi4uZjI5ODEyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYWNwaS9NYWtlZmlsZQpAQCAtNTUsNiArNTUsNyBAQAogb2JqLSQoQ09ORklHX0FDUElfU1lTVEVNKQkrPSBzeXN0ZW0ubyBldmVudC5vCiBvYmotJChDT05GSUdfQUNQSV9ERUJVRykJKz0gZGVidWcubwogb2JqLSQoQ09ORklHX0FDUElfTlVNQSkJCSs9IG51bWEubworb2JqLSQoQ09ORklHX0FDUElfV01JKQkJKz0gd21pLm8KIG9iai0kKENPTkZJR19BQ1BJX0FTVVMpCQkrPSBhc3VzX2FjcGkubwogb2JqLSQoQ09ORklHX0FDUElfVE9TSElCQSkJKz0gdG9zaGliYV9hY3BpLm8KIG9iai0kKENPTkZJR19BQ1BJX0hPVFBMVUdfTUVNT1JZKQkrPSBhY3BpX21lbWhvdHBsdWcubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FzdXNfYWNwaS5jIGIvZHJpdmVycy9hY3BpL2FzdXNfYWNwaS5jCmluZGV4IGQ5MTVmZWMuLmQyNWVmOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hc3VzX2FjcGkuYworKysgYi9kcml2ZXJzL2FjcGkvYXN1c19hY3BpLmMKQEAgLTE0Miw2ICsxNDIsNyBAQAogCQl4eE4sCQkvL00yNDAwTiwgTTM3MDBOLCBNNTIwME4sIE02ODAwTiwgUzEzMDBOLCBTNTIwME4KIAkJQTRTLCAgICAgICAgICAgIC8vWjgxc3AKIAkJLy8oQ2VudHJpbm8pCisJCUYzU2EsCiAJCUVORF9NT0RFTAogCX0gbW9kZWw7CQkvL01vZGVscyBjdXJyZW50bHkgc3VwcG9ydGVkCiAJdTE2IGV2ZW50X2NvdW50WzEyOF07CS8vY291bnQgZm9yIGVhY2ggZXZlbnQgVE9ETyBtYWtlIHRoaXMgYmV0dGVyCkBAIC00MDUsNyArNDA2LDIwIEBACiAJCS5icmlnaHRuZXNzX2dldCAgICA9ICJHUExWIiwKIAkJLm10X2J0X3N3aXRjaCAgICAgID0gIkJMRUQiLAogCQkubXRfd2xlZCAgICAgICAgICAgPSAiV0xFRCIKLQl9CisJfSwKKworCXsKKwkJLm5hbWUJCT0gIkYzU2EiLAorCQkubXRfYnRfc3dpdGNoCT0gIkJMRUQiLAorCQkubXRfd2xlZAk9ICJXTEVEIiwKKwkJLm10X21sZWQJPSAiTUxFRCIsCisJCS5icmlnaHRuZXNzX2dldAk9ICJHUExWIiwKKwkJLmJyaWdodG5lc3Nfc2V0CT0gIlNQTFYiLAorCQkubXRfbGNkX3N3aXRjaAk9ICJcXF9TQi5QQ0kwLlNCUkcuRUMwLl9RMTAiLAorCQkubGNkX3N0YXR1cwk9ICJcXF9TQi5QQ0kwLlNCUkcuRUMwLlJQSU4iLAorCQkuZGlzcGxheV9nZXQJPSAiXFxBRFZHIiwKKwkJLmRpc3BsYXlfc2V0CT0gIlNEU1AiLAorCX0sCiAKIH07CiAKQEAgLTcxMCwxNSArNzI0LDggQEAKIHsKIAlpbnQgbGNkID0gMDsKIAotCWlmIChob3RrLT5tb2RlbCAhPSBMM0gpIHsKLQkJLyogV2UgZG9uJ3QgaGF2ZSB0byBjaGVjayBhbnl0aGluZyBpZiB3ZSBhcmUgaGVyZSAqLwotCQlpZiAoIXJlYWRfYWNwaV9pbnQoTlVMTCwgaG90ay0+bWV0aG9kcy0+bGNkX3N0YXR1cywgJmxjZCkpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAgIkFzdXMgQUNQSTogRXJyb3IgcmVhZGluZyBMQ0Qgc3RhdHVzXG4iKTsKLQotCQlpZiAoaG90ay0+bW9kZWwgPT0gTDJEKQotCQkJbGNkID0gfmxjZDsKLQl9IGVsc2UgewkJLyogTDNIIGFuZCB0aGUgbGlrZSBoYXZlIHRvIGJlIGhhbmRsZWQgZGlmZmVyZW50bHkgKi8KKwlpZiAoaG90ay0+bW9kZWwgPT0gTDNIKSB7CisJCS8qIEwzSCBhbmQgdGhlIGxpa2UgaGF2ZSB0byBiZSBoYW5kbGVkIGRpZmZlcmVudGx5ICovCiAJCWFjcGlfc3RhdHVzIHN0YXR1cyA9IDA7CiAJCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGlucHV0OwogCQl1bmlvbiBhY3BpX29iamVjdCBtdF9wYXJhbXNbMl07CkBAIC03NDUsNiArNzUyLDMyIEBACiAJCWlmIChvdXRfb2JqLnR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpCiAJCQkvKiBUaGF0J3Mgd2hhdCB0aGUgQU1MIGNvZGUgZG9lcyAqLwogCQkJbGNkID0gb3V0X29iai5pbnRlZ2VyLnZhbHVlID4+IDg7CisJfSBlbHNlIGlmIChob3RrLT5tb2RlbCA9PSBGM1NhKSB7CisJCXVuc2lnbmVkIGxvbmcgdG1wOworCQl1bmlvbiBhY3BpX29iamVjdCBwYXJhbTsKKwkJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgaW5wdXQ7CisJCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCQkvKiBSZWFkIHBpbiAxMSAqLworCQlwYXJhbS50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVI7CisJCXBhcmFtLmludGVnZXIudmFsdWUgPSAweDExOworCQlpbnB1dC5jb3VudCA9IDE7CisJCWlucHV0LnBvaW50ZXIgPSAmcGFyYW07CisKKwkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKE5VTEwsIGhvdGstPm1ldGhvZHMtPmxjZF9zdGF0dXMsCisJCQkJCQkmaW5wdXQsICZ0bXApOworCQlpZiAoc3RhdHVzICE9IEFFX09LKQorCQkJcmV0dXJuIC0xOworCisJCWxjZCA9IHRtcDsKKwl9IGVsc2UgeworCQkvKiBXZSBkb24ndCBoYXZlIHRvIGNoZWNrIGFueXRoaW5nIGlmIHdlIGFyZSBoZXJlICovCisJCWlmICghcmVhZF9hY3BpX2ludChOVUxMLCBob3RrLT5tZXRob2RzLT5sY2Rfc3RhdHVzLCAmbGNkKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiQXN1cyBBQ1BJOiBFcnJvciByZWFkaW5nIExDRCBzdGF0dXNcbiIpOworCisJCWlmIChob3RrLT5tb2RlbCA9PSBMMkQpCisJCQlsY2QgPSB+bGNkOwogCX0KIAogCXJldHVybiAobGNkICYgMSk7CkBAIC0xMTM0LDYgKzExNjcsOCBAQAogCQlyZXR1cm4gVzVBOwogCWVsc2UgaWYgKHN0cm5jbXAobW9kZWwsICJBNFMiLCAzKSA9PSAwKQogCQlyZXR1cm4gQTRTOworCWVsc2UgaWYgKHN0cm5jbXAobW9kZWwsICJGM1NhIiwgNCkgPT0gMCkKKwkJcmV0dXJuIEYzU2E7CiAJZWxzZQogCQlyZXR1cm4gRU5EX01PREVMOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2JhdHRlcnkuYyBiL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMKaW5kZXggYzRhNzY5ZC4uZjYyMTVlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2JhdHRlcnkuYworKysgYi9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jCkBAIC0xOTQsNiArMTk0LDkgQEAKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUjoKIAkJdmFsLT5zdHJ2YWwgPSBiYXR0ZXJ5LT5vZW1faW5mbzsKIAkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TRVJJQUxfTlVNQkVSOgorCQl2YWwtPnN0cnZhbCA9IGJhdHRlcnktPnNlcmlhbF9udW1iZXI7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTIxMiw2ICsyMTUsNyBAQAogCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9OT1csCiAJUE9XRVJfU1VQUExZX1BST1BfTU9ERUxfTkFNRSwKIAlQT1dFUl9TVVBQTFlfUFJPUF9NQU5VRkFDVFVSRVIsCisJUE9XRVJfU1VQUExZX1BST1BfU0VSSUFMX05VTUJFUiwKIH07CiAKIHN0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBlbmVyZ3lfYmF0dGVyeV9wcm9wc1tdID0gewpAQCAtMjI2LDYgKzIzMCw3IEBACiAJUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX05PVywKIAlQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FLAogCVBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUiwKKwlQT1dFUl9TVVBQTFlfUFJPUF9TRVJJQUxfTlVNQkVSLAogfTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYmF5LmMgYi9kcml2ZXJzL2FjcGkvYmF5LmMKaW5kZXggNmRhZjYwODguLjFmYTg2ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9iYXkuYworKysgYi9kcml2ZXJzL2FjcGkvYmF5LmMKQEAgLTQ2LDYgKzQ2LDEyIEBACiAJcHJpbnRrKEtFUk5fREVCVUcgUFJFRklYICIlczogJXNcbiIsIHByZWZpeCwgcyk7IH0KIHN0YXRpYyB2b2lkIGJheV9ub3RpZnkoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZXZlbnQsIHZvaWQgKmRhdGEpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGJheV9kZXZpY2VfaWRzW10gPSB7CisJeyJMTlhJT0JBWSIsIDB9LAorCXsiIiwgMH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCBiYXlfZGV2aWNlX2lkcyk7CisKIHN0cnVjdCBiYXkgewogCWFjcGlfaGFuZGxlIGhhbmRsZTsKIAljaGFyICpuYW1lOwpAQCAtMTI4LDcgKzEzNCw3IEBACiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGJheV9wcmVzZW50KGJheSkpOwogCiB9Ci1ERVZJQ0VfQVRUUihwcmVzZW50LCBTX0lSVUdPLCBzaG93X3ByZXNlbnQsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHByZXNlbnQsIFNfSVJVR08sIHNob3dfcHJlc2VudCwgTlVMTCk7CiAKIC8qCiAgKiB3cml0ZV9lamVjdCAtIHdyaXRlIG1ldGhvZCBmb3IgImVqZWN0IiBmaWxlIGluIHN5c2ZzCkBAIC0xNDQsNyArMTUwLDcgQEAKIAllamVjdF9kZXZpY2UoYmF5LT5oYW5kbGUpOwogCXJldHVybiBjb3VudDsKIH0KLURFVklDRV9BVFRSKGVqZWN0LCBTX0lXVVNSLCBOVUxMLCB3cml0ZV9lamVjdCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZWplY3QsIFNfSVdVU1IsIE5VTEwsIHdyaXRlX2VqZWN0KTsKIAogLyoqCiAgKiBpc19hdGEgLSBzZWUgaWYgYSBkZXZpY2UgaXMgYW4gYXRhIGRldmljZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2JsYWNrbGlzdC5jIGIvZHJpdmVycy9hY3BpL2JsYWNrbGlzdC5jCmluZGV4IDg4MDk2NTQuLjljZTk4M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ibGFja2xpc3QuYworKysgYi9kcml2ZXJzL2FjcGkvYmxhY2tsaXN0LmMKQEAgLTcwLDggKzcwLDYgQEAKIAkvKiBJQk0gNjAwRSAtIF9BRFIgc2hvdWxkIHJldHVybiA3LCBidXQgaXQgcmV0dXJucyAxICovCiAJeyJJQk0gICAiLCAiVFA2MDBFICAiLCAweDAwMDAwMTA1LCBBQ1BJX1NJR19EU0RULCBsZXNzX3RoYW5fb3JfZXF1YWwsCiAJICJJbmNvcnJlY3QgX0FEUiIsIDF9LAotCXsiQVNVU1wwXDAiLCAiUDJCLVMgICAiLCAwLCBBQ1BJX1NJR19EU0RULCBhbGxfdmVyc2lvbnMsCi0JICJCb2d1cyBQQ0kgcm91dGluZyIsIDF9LAogCiAJeyIifQogfTsKQEAgLTIwOCwzMyArMjA2LDM1IEBACiAJICogRGlzYWJsZSBPU0koTGludXgpIHdhcm5pbmdzIG9uIGFsbCAiQWNlciwgaW5jLiIKIAkgKgogCSAqIF9PU0koTGludXgpIGRpc2FibGVzIHRoZSBsYXRlc3QgV2luZG93cyBCSU9TIGNvZGU6CisJICogRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJBc3BpcmUgMzEwMCIpLAogCSAqIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQXNwaXJlIDUwNTAiKSwKKwkgKiBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkFzcGlyZSA1MTAwIiksCiAJICogRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJBc3BpcmUgNTU4MCIpLAogCSAqIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVHJhdmVsTWF0ZSAzMDEwIiksCiAJICogX09TSShMaW51eCkgZWZmZWN0IHVua25vd246CiAJICogRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJGZXJyYXJpIDUwMDAiKSwKIAkgKi8KLQl7Ci0JLmNhbGxiYWNrID0gZG1pX2Rpc2FibGVfb3NpX2xpbnV4LAotCS5pZGVudCA9ICJBY2VyLCBpbmMuIiwKLQkubWF0Y2hlcyA9IHsKLQkJICAgICBETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBY2VyLCBpbmMuIiksCi0JCX0sCi0JfSwKKwkvKgorCSAqIG5vdGUgdGhhdCBkbWlfY2hlY2tfc3lzdGVtKCkgdXNlcyBzdHJzdHIoKQorCSAqIHRvIG1hdGNoIHN1Yi1zdHJpbmdzIHJhdGhlciB0aGFuICFzdHJjbXAoKSwKKwkgKiBzbyAiQWNlciIgYmVsb3cgbWF0Y2hlcyAiQWNlciwgaW5jLiIgYWJvdmUuCisJICovCiAJLyoKIAkgKiBEaXNhYmxlIE9TSShMaW51eCkgd2FybmluZ3Mgb24gYWxsICJBY2VyIgogCSAqCiAJICogX09TSShMaW51eCkgZWZmZWN0IHVua25vd246Ci0JICogRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJBc3BpcmUgNTEwMCIpLAogCSAqIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQXNwaXJlIDU2MTAiKSwKIAkgKiBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkFzcGlyZSA3NzIwWiIpLAogCSAqIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVHJhdmVsTWF0ZSA1NTIwIiksCiAJICogRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJUcmF2ZWxNYXRlIDY0NjAiKSwKIAkgKiBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlRyYXZlbE1hdGUgNzUxMCIpLAogCSAqIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiRXh0ZW5zYSA1MjIwIiksCisJICoKKwkgKiBfT1NJKExpbnV4KSBpcyBhIE5PUDoKKwkgKiBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkFzcGlyZSA1MzE1IiksCiAJICovCiAJewotCS5jYWxsYmFjayA9IGRtaV91bmtub3duX29zaV9saW51eCwKKwkuY2FsbGJhY2sgPSBkbWlfZGlzYWJsZV9vc2lfbGludXgsCiAJLmlkZW50ID0gIkFjZXIiLAogCS5tYXRjaGVzID0gewogCQkgICAgIERNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKQEAgLTI0MiwyMSArMjQyLDIyIEBACiAJfSwKIAkvKgogCSAqIERpc2FibGUgT1NJKExpbnV4KSB3YXJuaW5ncyBvbiBhbGwgIkFwcGxlIENvbXB1dGVyLCBJbmMuIgorCSAqIERpc2FibGUgT1NJKExpbnV4KSB3YXJuaW5ncyBvbiBhbGwgIkFwcGxlIEluYy4iCiAJICoKIAkgKiBfT1NJKExpbnV4KSBjb25maXJtZWQgdG8gYmUgYSBOT1A6CiAJICogRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNCb29rMSwxIiksCiAJICogRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNCb29rMiwxIiksCiAJICogRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNCb29rUHJvMiwyIiksCisJICogRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNCb29rUHJvMywxIiksCiAJICogX09TSShMaW51eCkgZWZmZWN0IHVua25vd246CiAJICogRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNYWNQcm8yLDEiKSwKIAkgKiBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2tQcm8xLDEiKSwKLQkgKiBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1hY0Jvb2tQcm8zLDEiKSwKIAkgKi8KIAl7CiAJLmNhbGxiYWNrID0gZG1pX2Rpc2FibGVfb3NpX2xpbnV4LAogCS5pZGVudCA9ICJBcHBsZSIsCiAJLm1hdGNoZXMgPSB7Ci0JCSAgICAgRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQXBwbGUgQ29tcHV0ZXIsIEluYy4iKSwKKwkJICAgICBETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBcHBsZSIpLAogCQl9LAogCX0sCiAJLyoKQEAgLTI5NCwxMyArMjk1LDEzIEBACiAJICogRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiSUZMOTEiKSwKIAkgKi8KIAl7Ci0JLmNhbGxiYWNrID0gZG1pX3Vua25vd25fb3NpX2xpbnV4LAorCS5jYWxsYmFjayA9IGRtaV9kaXNhYmxlX29zaV9saW51eCwKIAkuaWRlbnQgPSAiQ29tcGFsIiwKIAkubWF0Y2hlcyA9IHsKIAkJICAgICBETUlfTUFUQ0goRE1JX0JJT1NfVkVORE9SLCAiQ09NUEFMIiksCiAJCX0sCiAJfSwKLQl7IC8qIE9TSShMaW51eCkgdG91Y2hlcyBVU0IsIGJyZWFrcyBzdXNwZW5kIHRvIGRpc2sgKi8KKwl7IC8qIE9TSShMaW51eCkgdG91Y2hlcyBVU0IsIHVua25vd24gc2lkZS1lZmZlY3QgKi8KIAkuY2FsbGJhY2sgPSBkbWlfZGlzYWJsZV9vc2lfbGludXgsCiAJLmlkZW50ID0gIkRlbGwgRGltZW5zaW9uIDUxNTAiLAogCS5tYXRjaGVzID0gewpAQCAtMzEwLDcgKzMxMSw3IEBACiAJfSwKIAl7IC8qIE9TSShMaW51eCkgaXMgYSBOT1AgKi8KIAkuY2FsbGJhY2sgPSBkbWlfZGlzYWJsZV9vc2lfbGludXgsCi0JLmlkZW50ID0gIkRlbGwiLAorCS5pZGVudCA9ICJEZWxsIGkxNTAxIiwKIAkubWF0Y2hlcyA9IHsKIAkJICAgICBETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKIAkJICAgICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkluc3Bpcm9uIDE1MDEiKSwKQEAgLTMxOCw3ICszMTksNyBAQAogCX0sCiAJeyAvKiBPU0koTGludXgpIGVmZmVjdCB1bmtub3duICovCiAJLmNhbGxiYWNrID0gZG1pX3Vua25vd25fb3NpX2xpbnV4LAotCS5pZGVudCA9ICJEZWxsIiwKKwkuaWRlbnQgPSAiRGVsbCBMYXRpdHVkZSBEODMwIiwKIAkubWF0Y2hlcyA9IHsKIAkJICAgICBETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKIAkJICAgICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxhdGl0dWRlIEQ4MzAiKSwKQEAgLTMyNiw3ICszMjcsNyBAQAogCX0sCiAJeyAvKiBPU0koTGludXgpIGVmZmVjdCB1bmtub3duICovCiAJLmNhbGxiYWNrID0gZG1pX3Vua25vd25fb3NpX2xpbnV4LAotCS5pZGVudCA9ICJEZWxsIiwKKwkuaWRlbnQgPSAiRGVsbCBPUCBHWDYyMCIsCiAJLm1hdGNoZXMgPSB7CiAJCSAgICAgRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCiAJCSAgICAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJPcHRpUGxleCBHWDYyMCIpLApAQCAtMzM0LDE1ICszMzUsMjMgQEAKIAl9LAogCXsgLyogT1NJKExpbnV4KSBlZmZlY3QgdW5rbm93biAqLwogCS5jYWxsYmFjayA9IGRtaV91bmtub3duX29zaV9saW51eCwKLQkuaWRlbnQgPSAiRGVsbCIsCisJLmlkZW50ID0gIkRlbGwgUEUgMTkwMCIsCiAJLm1hdGNoZXMgPSB7CiAJCSAgICAgRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCiAJCSAgICAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJQb3dlckVkZ2UgMTkwMCIpLAogCQl9LAogCX0sCisJeyAvKiBPU0koTGludXgpIGlzIGEgTk9QICovCisJLmNhbGxiYWNrID0gZG1pX2Rpc2FibGVfb3NpX2xpbnV4LAorCS5pZGVudCA9ICJEZWxsIFBFIFIyMDAiLAorCS5tYXRjaGVzID0geworCQkgICAgIERNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAorCQkgICAgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUG93ZXJFZGdlIFIyMDAiKSwKKwkJfSwKKwl9LAogCXsgLyogT1NJKExpbnV4KSB0b3VjaGVzIFVTQiAqLwogCS5jYWxsYmFjayA9IGRtaV9kaXNhYmxlX29zaV9saW51eCwKLQkuaWRlbnQgPSAiRGVsbCIsCisJLmlkZW50ID0gIkRlbGwgUFIgMzkwIiwKIAkubWF0Y2hlcyA9IHsKIAkJICAgICBETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKIAkJICAgICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlByZWNpc2lvbiBXb3JrU3RhdGlvbiAzOTAiKSwKQEAgLTM1OCw3ICszNjcsNyBAQAogCX0sCiAJeyAvKiBPU0koTGludXgpIGVmZmVjdCB1bmtub3duICovCiAJLmNhbGxiYWNrID0gZG1pX3Vua25vd25fb3NpX2xpbnV4LAotCS5pZGVudCA9ICJEZWxsIiwKKwkuaWRlbnQgPSAiRGVsbCBQRSBTQzQ0MCIsCiAJLm1hdGNoZXMgPSB7CiAJCSAgICAgRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCiAJCSAgICAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJQb3dlckVkZ2UgU0M0NDAiKSwKQEAgLTQzNiw2ICs0NDUsOCBAQAogCSAqIERNSV9NQVRDSChETUlfUFJPRFVDVF9WRVJTSU9OLCAiVGhpbmtQYWQgVDYxIiksCiAJICogX09TSShMaW51eCkgaXMgYSBOT1A6CiAJICogRE1JX01BVENIKERNSV9QUk9EVUNUX1ZFUlNJT04sICIzMDAwIE4xMDAiKSwKKwkgKiBfT1NJKExpbnV4KSBlZmZlY3QgdW5rbm93bgorCSAqIERNSV9NQVRDSChETUlfUFJPRFVDVF9WRVJTSU9OLCAiVGhpbmtQYWQgWDYxIiksCiAJICovCiAJewogCS5jYWxsYmFjayA9IGRtaV9lbmFibGVfb3NpX2xpbnV4LApAQCAtNDU1LDYgKzQ2NiwxNCBAQAogCX0sCiAJewogCS5jYWxsYmFjayA9IGRtaV91bmtub3duX29zaV9saW51eCwKKwkuaWRlbnQgPSAiTGVub3ZvIFRoaW5rUGFkIFg2MSIsCisJLm1hdGNoZXMgPSB7CisJCSAgICAgRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiTEVOT1ZPIiksCisJCSAgICAgRE1JX01BVENIKERNSV9QUk9EVUNUX1ZFUlNJT04sICJUaGlua1BhZCBYNjEiKSwKKwkJfSwKKwl9LAorCXsKKwkuY2FsbGJhY2sgPSBkbWlfdW5rbm93bl9vc2lfbGludXgsCiAJLmlkZW50ID0gIkxlbm92byAzMDAwIFYxMDAiLAogCS5tYXRjaGVzID0gewogCQkgICAgIERNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkxFTk9WTyIpLApAQCAtNDc0LDYgKzQ5MywxMSBAQAogCSAqCiAJICogX09TSShMaW51eCkgY29uZmlybWVkIHRvIGJlIGEgTk9QOgogCSAqIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUDEtSjE1MEIiKSwKKwkgKiB3aXRoIERNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIlJPQ0tZIiksCisJICoKKwkgKiB1bmtub3duOgorCSAqIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUzEtTURHREciKSwKKwkgKiB3aXRoIERNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIlJPQ0tZIiksCiAJICovCiAJewogCS5jYWxsYmFjayA9IGRtaV9kaXNhYmxlX29zaV9saW51eCwKQEAgLTQ5MSw2ICs1MTUsMTYgQEAKIAkJICAgICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk5FQyBWRVJTQSBNMzYwIiksCiAJCX0sCiAJfSwKKwkvKiBQYW5hc29uaWMgKi8KKwl7CisJLmNhbGxiYWNrID0gZG1pX3Vua25vd25fb3NpX2xpbnV4LAorCS5pZGVudCA9ICJQYW5hc29uaWMiLAorCS5tYXRjaGVzID0geworCQkgICAgIERNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIk1hdHN1c2hpdGEiKSwKKwkJCS8qIFRvdWdoYm9vayBDRi01MiAqLworCQkgICAgIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQ0YtNTJDQ0FCVkJHIiksCisJCX0sCisJfSwKIAkvKgogCSAqIERpc2FibGUgT1NJKExpbnV4KSB3YXJuaW5ncyBvbiBhbGwgIlNhbXN1bmcgRWxlY3Ryb25pY3MiCiAJICoKQEAgLTUxNiw3ICs1NTAsNyBAQAogCSAqIERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVkdOLUZaMTFNIiksCiAJICovCiAJewotCS5jYWxsYmFjayA9IGRtaV91bmtub3duX29zaV9saW51eCwKKwkuY2FsbGJhY2sgPSBkbWlfZGlzYWJsZV9vc2lfbGludXgsCiAJLmlkZW50ID0gIlNvbnkiLAogCS5tYXRjaGVzID0gewogCQkgICAgIERNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNvbnkgQ29ycG9yYXRpb24iKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9idXMuYyBiL2RyaXZlcnMvYWNwaS9idXMuYwppbmRleCAxYjRjZjk4Li44YjBkNGI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYnVzLmMKKysrIGIvZHJpdmVycy9hY3BpL2J1cy5jCkBAIC0xMjIsNiArMTIyLDMxIEBACiAKIEVYUE9SVF9TWU1CT0woYWNwaV9idXNfZ2V0X3N0YXR1cyk7CiAKK3ZvaWQgYWNwaV9idXNfcHJpdmF0ZV9kYXRhX2hhbmRsZXIoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJCSAgIHUzMiBmdW5jdGlvbiwgdm9pZCAqY29udGV4dCkKK3sKKwlyZXR1cm47Cit9CitFWFBPUlRfU1lNQk9MKGFjcGlfYnVzX3ByaXZhdGVfZGF0YV9oYW5kbGVyKTsKKworaW50IGFjcGlfYnVzX2dldF9wcml2YXRlX2RhdGEoYWNwaV9oYW5kbGUgaGFuZGxlLCB2b2lkICoqZGF0YSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKworCWlmICghKmRhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RhdHVzID0gYWNwaV9nZXRfZGF0YShoYW5kbGUsIGFjcGlfYnVzX3ByaXZhdGVfZGF0YV9oYW5kbGVyLCBkYXRhKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgfHwgISpkYXRhKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIk5vIGNvbnRleHQgZm9yIG9iamVjdCBbJXBdXG4iLAorCQkJCWhhbmRsZSkpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYWNwaV9idXNfZ2V0X3ByaXZhdGVfZGF0YSk7CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3dlciBNYW5hZ2VtZW50CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMzY2LDcgKzM5MSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLUVYUE9SVF9TWU1CT0woYWNwaV9idXNfcmVjZWl2ZV9ldmVudCk7CiAjZW5kaWYJLyogQ09ORklHX0FDUElfUFJPQ19FVkVOVCAqLwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2RlYnVnLmMgYi9kcml2ZXJzL2FjcGkvZGVidWcuYwppbmRleCBiZjUxM2UwLi42ZGY1NjRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGVidWcuYworKysgYi9kcml2ZXJzL2FjcGkvZGVidWcuYwpAQCAtMTMwLDYgKzEzMCw2MyBAQAogbW9kdWxlX3BhcmFtX2NhbGwoZGVidWdfbGF5ZXIsIHBhcmFtX3NldF91aW50LCBwYXJhbV9nZXRfZGVidWdfbGF5ZXIsICZhY3BpX2RiZ19sYXllciwgMDY0NCk7CiBtb2R1bGVfcGFyYW1fY2FsbChkZWJ1Z19sZXZlbCwgcGFyYW1fc2V0X3VpbnQsIHBhcmFtX2dldF9kZWJ1Z19sZXZlbCwgJmFjcGlfZGJnX2xldmVsLCAwNjQ0KTsKIAorc3RhdGljIGNoYXIgdHJhY2VfbWV0aG9kX25hbWVbNl07Cittb2R1bGVfcGFyYW1fc3RyaW5nKHRyYWNlX21ldGhvZF9uYW1lLCB0cmFjZV9tZXRob2RfbmFtZSwgNiwgMDY0NCk7CitzdGF0aWMgdW5zaWduZWQgaW50IHRyYWNlX2RlYnVnX2xheWVyOworbW9kdWxlX3BhcmFtKHRyYWNlX2RlYnVnX2xheWVyLCB1aW50LCAwNjQ0KTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdHJhY2VfZGVidWdfbGV2ZWw7Cittb2R1bGVfcGFyYW0odHJhY2VfZGVidWdfbGV2ZWwsIHVpbnQsIDA2NDQpOworCitzdGF0aWMgaW50IHBhcmFtX3NldF90cmFjZV9zdGF0ZShjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQoreworCWludCByZXN1bHQgPSAwOworCisJaWYgKCFzdHJuY21wKHZhbCwgImVuYWJsZSIsIHN0cmxlbigiZW5hYmxlIikgLSAxKSkgeworCQlyZXN1bHQgPSBhY3BpX2RlYnVnX3RyYWNlKHRyYWNlX21ldGhvZF9uYW1lLCB0cmFjZV9kZWJ1Z19sZXZlbCwKKwkJCQkJICB0cmFjZV9kZWJ1Z19sYXllciwgMCk7CisJCWlmIChyZXN1bHQpCisJCQlyZXN1bHQgPSAtRUJVU1k7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoIXN0cm5jbXAodmFsLCAiZGlzYWJsZSIsIHN0cmxlbigiZGlzYWJsZSIpIC0gMSkpIHsKKwkJaW50IG5hbWUgPSAwOworCQlyZXN1bHQgPSBhY3BpX2RlYnVnX3RyYWNlKChjaGFyICopJm5hbWUsIHRyYWNlX2RlYnVnX2xldmVsLAorCQkJCQkgIHRyYWNlX2RlYnVnX2xheWVyLCAwKTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJlc3VsdCA9IC1FQlVTWTsKKwkJZ290byBleGl0OworCX0KKworCWlmICghc3RybmNtcCh2YWwsICIxIiwgMSkpIHsKKwkJcmVzdWx0ID0gYWNwaV9kZWJ1Z190cmFjZSh0cmFjZV9tZXRob2RfbmFtZSwgdHJhY2VfZGVidWdfbGV2ZWwsCisJCQkJCSAgdHJhY2VfZGVidWdfbGF5ZXIsIDEpOworCQlpZiAocmVzdWx0KQorCQkJcmVzdWx0ID0gLUVCVVNZOworCQlnb3RvIGV4aXQ7CisJfQorCisJcmVzdWx0ID0gLUVJTlZBTDsKK2V4aXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBwYXJhbV9nZXRfdHJhY2Vfc3RhdGUoY2hhciAqYnVmZmVyLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKK3sKKwlpZiAoIWFjcGlfZ2JsX3RyYWNlX21ldGhvZF9uYW1lKQorCQlyZXR1cm4gc3ByaW50ZihidWZmZXIsICJkaXNhYmxlIik7CisJZWxzZSB7CisJCWlmIChhY3BpX2dibF90cmFjZV9mbGFncyAmIDEpCisJCQlyZXR1cm4gc3ByaW50ZihidWZmZXIsICIxIik7CisJCWVsc2UKKwkJCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgImVuYWJsZSIpOworCX0KKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX3BhcmFtX2NhbGwodHJhY2Vfc3RhdGUsIHBhcmFtX3NldF90cmFjZV9zdGF0ZSwgcGFyYW1fZ2V0X3RyYWNlX3N0YXRlLAorCQkgIE5VTEwsIDA2NDQpOworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlMgSW50ZXJmYWNlICgvcHJvYykKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc29wY29kZS5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvcGNvZGUuYwppbmRleCBmYzlkYTQ4Li5mNTAxZTA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc29wY29kZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzb3Bjb2RlLmMKQEAgLTM1OSw3ICszNTksOSBAQAogCiAJc3RhdHVzID0gYWNwaV9vc192YWxpZGF0ZV9hZGRyZXNzKG9ial9kZXNjLT5yZWdpb24uc3BhY2VfaWQsCiAJCQkJCSAgb2JqX2Rlc2MtPnJlZ2lvbi5hZGRyZXNzLAotCQkJCQkgIChhY3BpX3NpemUpIG9ial9kZXNjLT5yZWdpb24ubGVuZ3RoKTsKKwkJCQkJICAoYWNwaV9zaXplKSBvYmpfZGVzYy0+cmVnaW9uLmxlbmd0aCwKKwkJCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUobm9kZSkpOworCiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCS8qCiAJCSAqIEludmFsaWQgYWRkcmVzcy9sZW5ndGguIFdlIHdpbGwgZW1pdCBhbiBlcnJvciBtZXNzYWdlIGFuZCBtYXJrCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZG9jay5jIGIvZHJpdmVycy9hY3BpL2RvY2suYwppbmRleCAxZGFiZGY0Li4zMDdjZWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZG9jay5jCisrKyBiL2RyaXZlcnMvYWNwaS9kb2NrLmMKQEAgLTUxLDYgKzUxLDEyIEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZG9ja19kZXZpY2U7CiBzdGF0aWMgY2hhciBkb2NrX2RldmljZV9uYW1lW10gPSAiZG9jayI7CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgZG9ja19kZXZpY2VfaWRzW10gPSB7CisJeyJMTlhET0NLIiwgMH0sCisJeyIiLCAwfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIGRvY2tfZGV2aWNlX2lkcyk7CisKIHN0cnVjdCBkb2NrX3N0YXRpb24gewogCWFjcGlfaGFuZGxlIGhhbmRsZTsKIAl1bnNpZ25lZCBsb25nIGxhc3RfZG9ja190aW1lOwpAQCAtNjgwLDcgKzY4Niw3IEBACiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGRvY2tfcHJlc2VudChkb2NrX3N0YXRpb24pKTsKIAogfQotREVWSUNFX0FUVFIoZG9ja2VkLCBTX0lSVUdPLCBzaG93X2RvY2tlZCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZG9ja2VkLCBTX0lSVUdPLCBzaG93X2RvY2tlZCwgTlVMTCk7CiAKIC8qCiAgKiBzaG93X2ZsYWdzIC0gcmVhZCBtZXRob2QgZm9yIGZsYWdzIGZpbGUgaW4gc3lzZnMKQEAgLTY5MSw3ICs2OTcsNyBAQAogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBkb2NrX3N0YXRpb24tPmZsYWdzKTsKIAogfQotREVWSUNFX0FUVFIoZmxhZ3MsIFNfSVJVR08sIHNob3dfZmxhZ3MsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGZsYWdzLCBTX0lSVUdPLCBzaG93X2ZsYWdzLCBOVUxMKTsKIAogLyoKICAqIHdyaXRlX3VuZG9jayAtIHdyaXRlIG1ldGhvZCBmb3IgInVuZG9jayIgZmlsZSBpbiBzeXNmcwpAQCAtNzA3LDcgKzcxMyw3IEBACiAJcmV0ID0gaGFuZGxlX2VqZWN0X3JlcXVlc3QoZG9ja19zdGF0aW9uLCBBQ1BJX05PVElGWV9FSkVDVF9SRVFVRVNUKTsKIAlyZXR1cm4gcmV0ID8gcmV0OiBjb3VudDsKIH0KLURFVklDRV9BVFRSKHVuZG9jaywgU19JV1VTUiwgTlVMTCwgd3JpdGVfdW5kb2NrKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih1bmRvY2ssIFNfSVdVU1IsIE5VTEwsIHdyaXRlX3VuZG9jayk7CiAKIC8qCiAgKiBzaG93X2RvY2tfdWlkIC0gcmVhZCBtZXRob2QgZm9yICJ1aWQiIGZpbGUgaW4gc3lzZnMKQEAgLTcyMyw3ICs3MjksNyBAQAogCiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWx4XG4iLCBsYnVmKTsKIH0KLURFVklDRV9BVFRSKHVpZCwgU19JUlVHTywgc2hvd19kb2NrX3VpZCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodWlkLCBTX0lSVUdPLCBzaG93X2RvY2tfdWlkLCBOVUxMKTsKIAogLyoqCiAgKiBkb2NrX2FkZCAtIGFkZCBhIG5ldyBkb2NrIHN0YXRpb24KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9lYy5jIGIvZHJpdmVycy9hY3BpL2VjLmMKaW5kZXggOTg3Yjk2Ny4uNzIyMmExOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2VjLmMKKysrIGIvZHJpdmVycy9hY3BpL2VjLmMKQEAgLTU3Myw3ICs1NzMsNyBAQAogCQkgICAgICB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKnJlZ2lvbl9jb250ZXh0KQogewogCXN0cnVjdCBhY3BpX2VjICplYyA9IGhhbmRsZXJfY29udGV4dDsKLQlpbnQgcmVzdWx0ID0gMCwgaSA9IDA7CisJaW50IHJlc3VsdCA9IDAsIGk7CiAJdTggdGVtcCA9IDA7CiAKIAlpZiAoKGFkZHJlc3MgPiAweEZGKSB8fCAhdmFsdWUgfHwgIWhhbmRsZXJfY29udGV4dCkKQEAgLTU4NSw3ICs1ODUsMTggQEAKIAlpZiAoYml0cyAhPSA4ICYmIGFjcGlfc3RyaWN0KQogCQlyZXR1cm4gQUVfQkFEX1BBUkFNRVRFUjsKIAotCXdoaWxlIChiaXRzIC0gaSA+IDApIHsKKwlhY3BpX2VjX2J1cnN0X2VuYWJsZShlYyk7CisKKwlpZiAoZnVuY3Rpb24gPT0gQUNQSV9SRUFEKSB7CisJCXJlc3VsdCA9IGFjcGlfZWNfcmVhZChlYywgYWRkcmVzcywgJnRlbXApOworCQkqdmFsdWUgPSB0ZW1wOworCX0gZWxzZSB7CisJCXRlbXAgPSAweGZmICYgKCp2YWx1ZSk7CisJCXJlc3VsdCA9IGFjcGlfZWNfd3JpdGUoZWMsIGFkZHJlc3MsIHRlbXApOworCX0KKworCWZvciAoaSA9IDg7IHVubGlrZWx5KGJpdHMgLSBpID4gMCk7IGkgKz0gOCkgeworCQkrK2FkZHJlc3M7CiAJCWlmIChmdW5jdGlvbiA9PSBBQ1BJX1JFQUQpIHsKIAkJCXJlc3VsdCA9IGFjcGlfZWNfcmVhZChlYywgYWRkcmVzcywgJnRlbXApOwogCQkJKCp2YWx1ZSkgfD0gKChhY3BpX2ludGVnZXIpdGVtcCkgPDwgaTsKQEAgLTU5MywxMCArNjA0LDEwIEBACiAJCQl0ZW1wID0gMHhmZiAmICgoKnZhbHVlKSA+PiBpKTsKIAkJCXJlc3VsdCA9IGFjcGlfZWNfd3JpdGUoZWMsIGFkZHJlc3MsIHRlbXApOwogCQl9Ci0JCWkgKz0gODsKLQkJKythZGRyZXNzOwogCX0KIAorCWFjcGlfZWNfYnVyc3RfZGlzYWJsZShlYyk7CisKIAlzd2l0Y2ggKHJlc3VsdCkgewogCWNhc2UgLUVJTlZBTDoKIAkJcmV0dXJuIEFFX0JBRF9QQVJBTUVURVI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnQuYyBiL2RyaXZlcnMvYWNwaS9ldmVudC5jCmluZGV4IDVjOTU4NjMuLjU0NzlkYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudC5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudC5jCkBAIC0xMDksNiArMTA5LDM0IEBACiB9OwogI2VuZGlmCS8qIENPTkZJR19BQ1BJX1BST0NfRVZFTlQgKi8KIAorLyogQUNQSSBub3RpZmllciBjaGFpbiAqLworQkxPQ0tJTkdfTk9USUZJRVJfSEVBRChhY3BpX2NoYWluX2hlYWQpOworCitpbnQgYWNwaV9ub3RpZmllcl9jYWxsX2NoYWluKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2LCB1MzIgdHlwZSwgdTMyIGRhdGEpCit7CisJc3RydWN0IGFjcGlfYnVzX2V2ZW50IGV2ZW50OworCisJc3RyY3B5KGV2ZW50LmRldmljZV9jbGFzcywgZGV2LT5wbnAuZGV2aWNlX2NsYXNzKTsKKwlzdHJjcHkoZXZlbnQuYnVzX2lkLCBkZXYtPnBucC5idXNfaWQpOworCWV2ZW50LnR5cGUgPSB0eXBlOworCWV2ZW50LmRhdGEgPSBkYXRhOworCXJldHVybiAoYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmYWNwaV9jaGFpbl9oZWFkLCAwLCAodm9pZCAqKSZldmVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgID09IE5PVElGWV9CQUQpID8gLUVJTlZBTCA6IDA7Cit9CitFWFBPUlRfU1lNQk9MKGFjcGlfbm90aWZpZXJfY2FsbF9jaGFpbik7CisKK2ludCByZWdpc3Rlcl9hY3BpX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0dXJuIGJsb2NraW5nX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZhY3BpX2NoYWluX2hlYWQsIG5iKTsKK30KK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfYWNwaV9ub3RpZmllcik7CisKK2ludCB1bnJlZ2lzdGVyX2FjcGlfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmYWNwaV9jaGFpbl9oZWFkLCBuYik7Cit9CitFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfYWNwaV9ub3RpZmllcik7CisKICNpZmRlZiBDT05GSUdfTkVUCiBzdGF0aWMgdW5zaWduZWQgaW50IGFjcGlfZXZlbnRfc2VxbnVtOwogc3RydWN0IGFjcGlfZ2VubF9ldmVudCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2ZXZlbnQuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZldmVudC5jCmluZGV4IGU0MTI4NzguLjMwNDg4MDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZldmVudC5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZldmVudC5jCkBAIC0yNTksNyArMjU5LDcgQEAKIAkJCWVuYWJsZV9iaXRfbWFzaykpIHsKIAogCQkJLyogRm91bmQgYW4gYWN0aXZlIChzaWduYWxsZWQpIGV2ZW50ICovCi0KKwkJCWFjcGlfb3NfZml4ZWRfZXZlbnRfY291bnQoaSk7CiAJCQlpbnRfc3RhdHVzIHw9IGFjcGlfZXZfZml4ZWRfZXZlbnRfZGlzcGF0Y2goKHUzMikgaSk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlLmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlLmMKaW5kZXggZTIyZjRhOS4uMGRhZGQyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGUuYwpAQCAtMjcwLDE4ICsyNzAsMTggQEAKIAljYXNlIEFDUElfR1BFX1RZUEVfV0FLRV9SVU46CiAJCUFDUElfQ0xFQVJfQklUKGdwZV9ldmVudF9pbmZvLT5mbGFncywgQUNQSV9HUEVfV0FLRV9FTkFCTEVEKTsKIAotCQkvKmxpbnQgLWZhbGx0aHJvdWdoICovCisJCS8qIGZhbGx0aHJvdWdoICovCiAKIAljYXNlIEFDUElfR1BFX1RZUEVfUlVOVElNRToKIAogCQkvKiBEaXNhYmxlIHRoZSByZXF1ZXN0ZWQgcnVudGltZSBHUEUgKi8KIAogCQlBQ1BJX0NMRUFSX0JJVChncGVfZXZlbnRfaW5mby0+ZmxhZ3MsIEFDUElfR1BFX1JVTl9FTkFCTEVEKTsKLQkJc3RhdHVzID0gYWNwaV9od193cml0ZV9ncGVfZW5hYmxlX3JlZyhncGVfZXZlbnRfaW5mbyk7Ci0JCWJyZWFrOworCisJCS8qIGZhbGx0aHJvdWdoICovCiAKIAlkZWZhdWx0OgotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJCWFjcGlfaHdfd3JpdGVfZ3BlX2VuYWJsZV9yZWcoZ3BlX2V2ZW50X2luZm8pOwogCX0KIAogCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CkBAIC01MDEsNiArNTAxLDcgQEAKICAqICAgICAgICAgICAgICBhbiBpbnRlcnJ1cHQgaGFuZGxlci4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYWNwaV9ldl9hc3luY2hfZW5hYmxlX2dwZSh2b2lkICpjb250ZXh0KTsKIAogc3RhdGljIHZvaWQgQUNQSV9TWVNURU1fWEZBQ0UgYWNwaV9ldl9hc3luY2hfZXhlY3V0ZV9ncGVfbWV0aG9kKHZvaWQgKmNvbnRleHQpCiB7CkBAIC01NzYsMjIgKzU3NywzMCBAQAogCQkJCQkgbWV0aG9kX25vZGUpKSk7CiAJCX0KIAl9CisJLyogRGVmZXIgZW5hYmxpbmcgb2YgR1BFIHVudGlsIGFsbCBub3RpZnkgaGFuZGxlcnMgYXJlIGRvbmUgKi8KKwlhY3BpX29zX2V4ZWN1dGUoT1NMX05PVElGWV9IQU5ETEVSLCBhY3BpX2V2X2FzeW5jaF9lbmFibGVfZ3BlLAorCQkJCWdwZV9ldmVudF9pbmZvKTsKKwlyZXR1cm5fVk9JRDsKK30KIAotCWlmICgobG9jYWxfZ3BlX2V2ZW50X2luZm8uZmxhZ3MgJiBBQ1BJX0dQRV9YUlVQVF9UWVBFX01BU0spID09CitzdGF0aWMgdm9pZCBhY3BpX2V2X2FzeW5jaF9lbmFibGVfZ3BlKHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvID0gY29udGV4dDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJaWYgKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9YUlVQVF9UWVBFX01BU0spID09CiAJICAgIEFDUElfR1BFX0xFVkVMX1RSSUdHRVJFRCkgewogCQkvKgogCQkgKiBHUEUgaXMgbGV2ZWwtdHJpZ2dlcmVkLCB3ZSBjbGVhciB0aGUgR1BFIHN0YXR1cyBiaXQgYWZ0ZXIKIAkJICogaGFuZGxpbmcgdGhlIGV2ZW50LgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9od19jbGVhcl9ncGUoJmxvY2FsX2dwZV9ldmVudF9pbmZvKTsKKwkJc3RhdHVzID0gYWNwaV9od19jbGVhcl9ncGUoZ3BlX2V2ZW50X2luZm8pOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCXJldHVybl9WT0lEOwogCQl9CiAJfQogCiAJLyogRW5hYmxlIHRoaXMgR1BFICovCi0KLQkodm9pZClhY3BpX2h3X3dyaXRlX2dwZV9lbmFibGVfcmVnKCZsb2NhbF9ncGVfZXZlbnRfaW5mbyk7CisJKHZvaWQpYWNwaV9od193cml0ZV9ncGVfZW5hYmxlX3JlZyhncGVfZXZlbnRfaW5mbyk7CiAJcmV0dXJuX1ZPSUQ7CiB9CiAKQEAgLTYxOCw3ICs2MjcsNyBAQAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRShldl9ncGVfZGlzcGF0Y2gpOwogCi0JYWNwaV9ncGVfY291bnQrKzsKKwlhY3BpX29zX2dwZV9jb3VudChncGVfbnVtYmVyKTsKIAogCS8qCiAJICogSWYgZWRnZS10cmlnZ2VyZWQsIGNsZWFyIHRoZSBHUEUgc3RhdHVzIGJpdCBub3cuICBOb3RlIHRoYXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9mYW4uYyBiL2RyaXZlcnMvYWNwaS9mYW4uYwppbmRleCBhNmUxNDlkLi40OGNiNzA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZmFuLmMKKysrIGIvZHJpdmVycy9hY3BpL2Zhbi5jCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQorI2luY2x1ZGUgPGxpbnV4L3RoZXJtYWwuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KIApAQCAtNjgsOSArNjgsNTUgQEAKIAkJfSwKIH07CiAKKy8qIHRoZXJtYWwgY29vbGluZyBkZXZpY2UgY2FsbGJhY2tzICovCitzdGF0aWMgaW50IGZhbl9nZXRfbWF4X3N0YXRlKHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCit7CisJLyogQUNQSSBmYW4gZGV2aWNlIG9ubHkgc3VwcG9ydCB0d28gc3RhdGVzOiBPTi9PRkYgKi8KKwlyZXR1cm4gc3ByaW50ZihidWYsICIxXG4iKTsKK30KKworc3RhdGljIGludCBmYW5fZ2V0X2N1cl9zdGF0ZShzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gY2Rldi0+ZGV2ZGF0YTsKKwlpbnQgc3RhdGU7CisJaW50IHJlc3VsdDsKKworCWlmICghZGV2aWNlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlc3VsdCA9IGFjcGlfYnVzX2dldF9wb3dlcihkZXZpY2UtPmhhbmRsZSwgJnN0YXRlKTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gcmVzdWx0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHN0YXRlID09IEFDUElfU1RBVEVfRDMgPyAiMCIgOgorCQkJIChzdGF0ZSA9PSBBQ1BJX1NUQVRFX0QwID8gIjEiIDogInVua25vd24iKSk7Cit9CisKK3N0YXRpYyBpbnQKK2Zhbl9zZXRfY3VyX3N0YXRlKHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2LCB1bnNpZ25lZCBpbnQgc3RhdGUpCit7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBjZGV2LT5kZXZkYXRhOworCWludCByZXN1bHQ7CisKKwlpZiAoIWRldmljZSB8fCAoc3RhdGUgIT0gMCAmJiBzdGF0ZSAhPSAxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXN1bHQgPSBhY3BpX2J1c19zZXRfcG93ZXIoZGV2aWNlLT5oYW5kbGUsCisJCQkJc3RhdGUgPyBBQ1BJX1NUQVRFX0QwIDogQUNQSV9TVEFURV9EMyk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzIGZhbl9jb29saW5nX29wcyA9IHsKKwkuZ2V0X21heF9zdGF0ZSA9IGZhbl9nZXRfbWF4X3N0YXRlLAorCS5nZXRfY3VyX3N0YXRlID0gZmFuX2dldF9jdXJfc3RhdGUsCisJLnNldF9jdXJfc3RhdGUgPSBmYW5fc2V0X2N1cl9zdGF0ZSwKK307CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUyBJbnRlcmZhY2UgKC9wcm9jKQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZmRlZiBDT05GSUdfQUNQSV9QUk9DRlMKIAogc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYWNwaV9mYW5fZGlyOwogCkBAIC0xNzEsNyArMjE3LDE3IEBACiAKIAlyZXR1cm4gMDsKIH0KKyNlbHNlCitzdGF0aWMgaW50IGFjcGlfZmFuX2FkZF9mcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3sKKwlyZXR1cm4gMDsKK30KIAorc3RhdGljIGludCBhY3BpX2Zhbl9yZW1vdmVfZnMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXIgSW50ZXJmYWNlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTc5LDkgKzIzNSw4IEBACiBzdGF0aWMgaW50IGFjcGlfZmFuX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlpbnQgcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgYWNwaV9mYW4gKmZhbiA9IE5VTEw7CiAJaW50IHN0YXRlID0gMDsKLQorCXN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2OwogCiAJaWYgKCFkZXZpY2UpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTk5LDYgKzI1NCwyNSBAQAogCWFjcGlfYnVzX3NldF9wb3dlcihkZXZpY2UtPmhhbmRsZSwgc3RhdGUpOwogCWRldmljZS0+ZmxhZ3MuZm9yY2VfcG93ZXJfc3RhdGUgPSAwOwogCisJY2RldiA9IHRoZXJtYWxfY29vbGluZ19kZXZpY2VfcmVnaXN0ZXIoIkZhbiIsIGRldmljZSwKKwkJCQkJCSZmYW5fY29vbGluZ19vcHMpOworCWlmIChjZGV2KQorCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAorCQkJIiVzIGlzIHJlZ2lzdGVyZWQgYXMgY29vbGluZ19kZXZpY2UlZFxuIiwKKwkJCWRldmljZS0+ZGV2LmJ1c19pZCwgY2Rldi0+aWQpOworCWVsc2UKKwkJZ290byBlbmQ7CisJYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpID0gY2RldjsKKwlyZXN1bHQgPSBzeXNmc19jcmVhdGVfbGluaygmZGV2aWNlLT5kZXYua29iaiwgJmNkZXYtPmRldmljZS5rb2JqLAorCQkJCQkidGhlcm1hbF9jb29saW5nIik7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCXJlc3VsdCA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZjZGV2LT5kZXZpY2Uua29iaiwgJmRldmljZS0+ZGV2LmtvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGV2aWNlIik7CisgICAgICAgIGlmIChyZXN1bHQpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKwogCXJlc3VsdCA9IGFjcGlfZmFuX2FkZF9mcyhkZXZpY2UpOwogCWlmIChyZXN1bHQpCiAJCWdvdG8gZW5kOwpAQCAtMjA4LDE4ICsyODIsMjAgQEAKIAkgICAgICAgIWRldmljZS0+cG93ZXIuc3RhdGUgPyAib24iIDogIm9mZiIpOwogCiAgICAgICBlbmQ6Ci0JaWYgKHJlc3VsdCkKLQkJa2ZyZWUoZmFuKTsKLQogCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBpbnQgYWNwaV9mYW5fcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKIHsKLQlpZiAoIWRldmljZSB8fCAhYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpKQorCXN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2ID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCisJaWYgKCFkZXZpY2UgfHwgIWNkZXYpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJYWNwaV9mYW5fcmVtb3ZlX2ZzKGRldmljZSk7CisJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldmljZS0+ZGV2LmtvYmosICJ0aGVybWFsX2Nvb2xpbmciKTsKKwlzeXNmc19yZW1vdmVfbGluaygmY2Rldi0+ZGV2aWNlLmtvYmosICJkZXZpY2UiKTsKKwl0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX3VucmVnaXN0ZXIoY2Rldik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI2MSwxMCArMzM3LDEyIEBACiAJaW50IHJlc3VsdCA9IDA7CiAKIAorI2lmZGVmIENPTkZJR19BQ1BJX1BST0NGUwogCWFjcGlfZmFuX2RpciA9IHByb2NfbWtkaXIoQUNQSV9GQU5fQ0xBU1MsIGFjcGlfcm9vdF9kaXIpOwogCWlmICghYWNwaV9mYW5fZGlyKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlhY3BpX2Zhbl9kaXItPm93bmVyID0gVEhJU19NT0RVTEU7CisjZW5kaWYKIAogCXJlc3VsdCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmYWNwaV9mYW5fZHJpdmVyKTsKIAlpZiAocmVzdWx0IDwgMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2dsdWUuYyBiL2RyaXZlcnMvYWNwaS9nbHVlLmMKaW5kZXggNDg5M2UyNS4uZWRhMDk3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2dsdWUuYworKysgYi9kcml2ZXJzL2FjcGkvZ2x1ZS5jCkBAIC0zNiw4ICszNiw2IEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLUVYUE9SVF9TWU1CT0wocmVnaXN0ZXJfYWNwaV9idXNfdHlwZSk7Ci0KIGludCB1bnJlZ2lzdGVyX2FjcGlfYnVzX3R5cGUoc3RydWN0IGFjcGlfYnVzX3R5cGUgKnR5cGUpCiB7CiAJaWYgKGFjcGlfZGlzYWJsZWQpCkBAIC01Myw4ICs1MSw2IEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLUVYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9hY3BpX2J1c190eXBlKTsKLQogc3RhdGljIHN0cnVjdCBhY3BpX2J1c190eXBlICphY3BpX2dldF9idXNfdHlwZShzdHJ1Y3QgYnVzX3R5cGUgKnR5cGUpCiB7CiAJc3RydWN0IGFjcGlfYnVzX3R5cGUgKnRtcCwgKnJldCA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdzbGVlcC5jIGIvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3c2xlZXAuYwppbmRleCBmZDFjNGJhLi4wNThkMGJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdzbGVlcC5jCisrKyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3NsZWVwLmMKQEAgLTI4NiwxMyArMjg2LDEzIEBACiAJfQogCiAJLyoKKwkgKiAxKSBEaXNhYmxlL0NsZWFyIGFsbCBHUEVzCiAJICogMikgRW5hYmxlIGFsbCB3YWtldXAgR1BFcwogCSAqLwogCXN0YXR1cyA9IGFjcGlfaHdfZGlzYWJsZV9hbGxfZ3BlcygpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9Ci0KIAlhY3BpX2dibF9zeXN0ZW1fYXdha2VfYW5kX3J1bm5pbmcgPSBGQUxTRTsKIAogCXN0YXR1cyA9IGFjcGlfaHdfZW5hYmxlX2FsbF93YWtldXBfZ3BlcygpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmZXZhbC5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmZXZhbC5jCmluZGV4IGYzOWZiYzYuLmI5MjEzM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4ZmV2YWwuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZldmFsLmMKQEAgLTQ0Myw2ICs0NDMsNyBAQAogCXN0cnVjdCBhY3BpY2FfZGV2aWNlX2lkIGhpZDsKIAlzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkX2xpc3QgKmNpZDsKIAlhY3BpX25hdGl2ZV91aW50IGk7CisJaW50IGZvdW5kOwogCiAJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CkBAIC00OTYsMTYgKzQ5NywxOSBAQAogCiAJCQkvKiBXYWxrIHRoZSBDSUQgbGlzdCAqLwogCisJCQlmb3VuZCA9IDA7CiAJCQlmb3IgKGkgPSAwOyBpIDwgY2lkLT5jb3VudDsgaSsrKSB7CiAJCQkJaWYgKEFDUElfU1RSTkNNUChjaWQtPmlkW2ldLnZhbHVlLCBpbmZvLT5oaWQsCiAJCQkJCQkgc2l6ZW9mKHN0cnVjdAotCQkJCQkJCWFjcGlfY29tcGF0aWJsZV9pZCkpICE9CisJCQkJCQkJYWNwaV9jb21wYXRpYmxlX2lkKSkgPT0KIAkJCQkgICAgMCkgewotCQkJCQlBQ1BJX0ZSRUUoY2lkKTsKLQkJCQkJcmV0dXJuIChBRV9PSyk7CisJCQkJCWZvdW5kID0gMTsKKwkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQogCQkJQUNQSV9GUkVFKGNpZCk7CisJCQlpZiAoIWZvdW5kKQorCQkJCXJldHVybiAoQUVfT0spOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbnVtYS5jIGIvZHJpdmVycy9hY3BpL251bWEuYwppbmRleCAwODIyZDlmLi41ZDU5Y2IzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbnVtYS5jCisrKyBiL2RyaXZlcnMvYWNwaS9udW1hLmMKQEAgLTc4LDYgKzc4LDcgQEAKIAlyZXR1cm4gbm9kZTsKIH0KIAorI2lmIDAKIHZvaWQgX19jcHVpbml0IGFjcGlfdW5tYXBfcHhtX3RvX25vZGUoaW50IG5vZGUpCiB7CiAJaW50IHB4bSA9IG5vZGVfdG9fcHhtX21hcFtub2RlXTsKQEAgLTg1LDYgKzg2LDcgQEAKIAlub2RlX3RvX3B4bV9tYXBbbm9kZV0gPSBQWE1fSU5WQUw7CiAJbm9kZV9jbGVhcihub2RlLCBub2Rlc19mb3VuZF9tYXApOwogfQorI2VuZGlmICAvKiAgMCAgKi8KIAogc3RhdGljIHZvaWQgX19pbml0CiBhY3BpX3RhYmxlX3ByaW50X3NyYXRfZW50cnkoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICpoZWFkZXIpCkBAIC0yNDcsNyArMjQ5LDYgQEAKIAl9IHdoaWxlIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSk7CiAJcmV0dXJuIC0xOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX2dldF9weG0pOwogCiBpbnQgYWNwaV9nZXRfbm9kZShhY3BpX2hhbmRsZSAqaGFuZGxlKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL29zbC5jIGIvZHJpdmVycy9hY3BpL29zbC5jCmluZGV4IGU1M2ZiNTEuLmExNDUwMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9vc2wuYworKysgYi9kcml2ZXJzL2FjcGkvb3NsLmMKQEAgLTQ0LDYgKzQ0LDggQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSA8bGludXgvZWZpLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfT1NfU0VSVklDRVMKIEFDUElfTU9EVUxFX05BTUUoIm9zbCIpOwpAQCAtNzQsOSArNzYsMjUgQEAKIHN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqa2FjcGlkX3dxOwogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICprYWNwaV9ub3RpZnlfd3E7CiAKK3N0cnVjdCBhY3BpX3Jlc19saXN0IHsKKwlyZXNvdXJjZV9zaXplX3Qgc3RhcnQ7CisJcmVzb3VyY2Vfc2l6ZV90IGVuZDsKKwlhY3BpX2Fkcl9zcGFjZV90eXBlIHJlc291cmNlX3R5cGU7IC8qIElPIHBvcnQsIFN5c3RlbSBtZW1vcnksIC4uLiovCisJY2hhciBuYW1lWzVdOyAgIC8qIG9ubHkgY2FuIGhhdmUgYSBsZW5ndGggb2YgNCBjaGFycywgbWFrZSB1c2Ugb2YgdGhpcworCQkJICAgb25lIGluc3RlYWQgb2YgcmVzLT5uYW1lLCBubyBuZWVkIHRvIGthbGxvYyB0aGVuICovCisJc3RydWN0IGxpc3RfaGVhZCByZXNvdXJjZV9saXN0OworfTsKKworc3RhdGljIExJU1RfSEVBRChyZXNvdXJjZV9saXN0X2hlYWQpOworc3RhdGljIERFRklORV9TUElOTE9DSyhhY3BpX3Jlc19sb2NrKTsKKwogI2RlZmluZQlPU0lfU1RSSU5HX0xFTkdUSF9NQVggNjQJLyogYXJiaXRyYXJ5ICovCiBzdGF0aWMgY2hhciBvc2lfYWRkaXRpb25hbF9zdHJpbmdbT1NJX1NUUklOR19MRU5HVEhfTUFYXTsKIAorI2lmZGVmIENPTkZJR19BQ1BJX0NVU1RPTV9EU0RUX0lOSVRSRAorc3RhdGljIGludCBhY3BpX25vX2luaXRyZF9vdmVycmlkZTsKKyNlbmRpZgorCiAvKgogICogIk9kZSB0byBfT1NJKExpbnV4KSIKICAqCkBAIC0xMjAsNyArMTM4LDcgQEAKICAqLwogI2RlZmluZSBPU0lfTElOVVhfRU5BQkxFIDAKIAotc3RydWN0IG9zaV9saW51eCB7CitzdGF0aWMgc3RydWN0IG9zaV9saW51eCB7CiAJdW5zaWduZWQgaW50CWVuYWJsZToxOwogCXVuc2lnbmVkIGludAlkbWk6MTsKIAl1bnNpZ25lZCBpbnQJY21kbGluZToxOwpAQCAtMjE5LDggKzIzNyw2IEBACiAJdmFfZW5kKGFyZ3MpOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfb3NfcHJpbnRmKTsKLQogdm9pZCBhY3BpX29zX3ZwcmludGYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCiB7CiAJc3RhdGljIGNoYXIgYnVmZmVyWzUxMl07CkBAIC0yNTAsMTEgKzI2NiwxNiBAQAogCQkJICAgICAgICJTeXN0ZW0gZGVzY3JpcHRpb24gdGFibGVzIG5vdCBmb3VuZFxuIik7CiAJCQlyZXR1cm4gMDsKIAkJfQotCX0gZWxzZQotCQlyZXR1cm4gYWNwaV9maW5kX3JzZHAoKTsKKwl9IGVsc2UgeworCQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgcGEgPSAwOworCisJCWFjcGlfZmluZF9yb290X3BvaW50ZXIoJnBhKTsKKwkJcmV0dXJuIHBhOworCX0KIH0KIAotdm9pZCBfX2lvbWVtICphY3BpX29zX21hcF9tZW1vcnkoYWNwaV9waHlzaWNhbF9hZGRyZXNzIHBoeXMsIGFjcGlfc2l6ZSBzaXplKQordm9pZCBfX2lvbWVtICpfX2luaXRfcmVmb2sKK2FjcGlfb3NfbWFwX21lbW9yeShhY3BpX3BoeXNpY2FsX2FkZHJlc3MgcGh5cywgYWNwaV9zaXplIHNpemUpCiB7CiAJaWYgKHBoeXMgPiBVTE9OR19NQVgpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiQ2Fubm90IG1hcCBtZW1vcnkgdGhhdCBoaWdoXG4iKTsKQEAgLTMxMiw2ICszMzMsNjcgQEAKIAlyZXR1cm4gQUVfT0s7CiB9CiAKKyNpZmRlZiBDT05GSUdfQUNQSV9DVVNUT01fRFNEVF9JTklUUkQKK3N0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqYWNwaV9maW5kX2RzZHRfaW5pdHJkKHZvaWQpCit7CisJc3RydWN0IGZpbGUgKmZpcm13YXJlX2ZpbGU7CisJbW1fc2VnbWVudF90IG9sZGZzOworCXVuc2lnbmVkIGxvbmcgbGVuLCBsZW4yOworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqZHNkdF9idWZmZXIsICpyZXQgPSBOVUxMOworCXN0cnVjdCBrc3RhdCBzdGF0OworCWNoYXIgKnJhbWZzX2RzZHRfbmFtZSA9ICIvRFNEVC5hbWwiOworCisJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkNoZWNraW5nIGluaXRyYW1mcyBmb3IgY3VzdG9tIERTRFRcbiIpOworCisJLyoKKwkgKiBOZXZlciBkbyB0aGlzIGF0IGhvbWUsIG9ubHkgdGhlIHVzZXItc3BhY2UgaXMgYWxsb3dlZCB0byBvcGVuIGEgZmlsZS4KKwkgKiBUaGUgY2xlYW4gd2F5IHdvdWxkIGJlIHRvIHVzZSB0aGUgZmlybXdhcmUgbG9hZGVyLgorCSAqIEJ1dCB0aGlzIGNvZGUgbXVzdCBiZSBydW4gYmVmb3JlIHRoZXJlIGlzIGFueSB1c2Vyc3BhY2UgYXZhaWxhYmxlLgorCSAqIEEgc3RhdGljL2luaXQgZmlybXdhcmUgaW5mcmFzdHJ1Y3R1cmUgZG9lc24ndCBleGlzdCB5ZXQuLi4KKwkgKi8KKwlpZiAodmZzX3N0YXQocmFtZnNfZHNkdF9uYW1lLCAmc3RhdCkgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbGVuID0gc3RhdC5zaXplOworCS8qIGNoZWNrIGVzcGVjaWFsbHkgYWdhaW5zdCBlbXB0eSBmaWxlcyAqLworCWlmIChsZW4gPD0gNCkgeworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJGYWlsZWQ6IERTRFQgb25seSAlbHUgYnl0ZXMuXG4iLCBsZW4pOworCQlyZXR1cm4gcmV0OworCX0KKworCWZpcm13YXJlX2ZpbGUgPSBmaWxwX29wZW4ocmFtZnNfZHNkdF9uYW1lLCBPX1JET05MWSwgMCk7CisJaWYgKElTX0VSUihmaXJtd2FyZV9maWxlKSkgeworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJGYWlsZWQgdG8gb3BlbiAlcy5cbiIsIHJhbWZzX2RzZHRfbmFtZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJZHNkdF9idWZmZXIgPSBrbWFsbG9jKGxlbiwgR0ZQX0FUT01JQyk7CisJaWYgKCFkc2R0X2J1ZmZlcikgeworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJGYWlsZWQgdG8gYWxsb2NhdGUgJWx1IGJ5dGVzLlxuIiwgbGVuKTsKKwkJZ290byBlcnI7CisJfQorCisJb2xkZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwlsZW4yID0gdmZzX3JlYWQoZmlybXdhcmVfZmlsZSwgKGNoYXIgX191c2VyICopZHNkdF9idWZmZXIsIGxlbiwKKwkJJmZpcm13YXJlX2ZpbGUtPmZfcG9zKTsKKwlzZXRfZnMob2xkZnMpOworCWlmIChsZW4yIDwgbGVuKSB7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkZhaWxlZCB0byByZWFkICVsdSBieXRlcyBmcm9tICVzLlxuIiwKKwkJCWxlbiwgcmFtZnNfZHNkdF9uYW1lKTsKKwkJQUNQSV9GUkVFKGRzZHRfYnVmZmVyKTsKKwkJZ290byBlcnI7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkZvdW5kICVsdSBieXRlIERTRFQgaW4gJXMuXG4iLAorCQkJbGVuLCByYW1mc19kc2R0X25hbWUpOworCXJldCA9IGRzZHRfYnVmZmVyOworZXJyOgorCWZpbHBfY2xvc2UoZmlybXdhcmVfZmlsZSwgTlVMTCk7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCiBhY3BpX3N0YXR1cwogYWNwaV9vc190YWJsZV9vdmVycmlkZShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiBleGlzdGluZ190YWJsZSwKIAkJICAgICAgIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKiBuZXdfdGFibGUpCkBAIC0zMTksMjAgKzQwMSw1MiBAQAogCWlmICghZXhpc3RpbmdfdGFibGUgfHwgIW5ld190YWJsZSkKIAkJcmV0dXJuIEFFX0JBRF9QQVJBTUVURVI7CiAKKwkqbmV3X3RhYmxlID0gTlVMTDsKKwogI2lmZGVmIENPTkZJR19BQ1BJX0NVU1RPTV9EU0RUCiAJaWYgKHN0cm5jbXAoZXhpc3RpbmdfdGFibGUtPnNpZ25hdHVyZSwgIkRTRFQiLCA0KSA9PSAwKQogCQkqbmV3X3RhYmxlID0gKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKUFtbENvZGU7Ci0JZWxzZQotCQkqbmV3X3RhYmxlID0gTlVMTDsKLSNlbHNlCi0JKm5ld190YWJsZSA9IE5VTEw7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfQUNQSV9DVVNUT01fRFNEVF9JTklUUkQKKwlpZiAoKHN0cm5jbXAoZXhpc3RpbmdfdGFibGUtPnNpZ25hdHVyZSwgIkRTRFQiLCA0KSA9PSAwKSAmJgorCSAgICAhYWNwaV9ub19pbml0cmRfb3ZlcnJpZGUpIHsKKwkJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICppbml0cmRfdGFibGU7CisKKwkJaW5pdHJkX3RhYmxlID0gYWNwaV9maW5kX2RzZHRfaW5pdHJkKCk7CisJCWlmIChpbml0cmRfdGFibGUpCisJCQkqbmV3X3RhYmxlID0gaW5pdHJkX3RhYmxlOworCX0KKyNlbmRpZgorCWlmICgqbmV3X3RhYmxlICE9IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIk92ZXJyaWRlIFslNC40cy0lOC44c10sICIKKwkJCSAgICJ0aGlzIGlzIHVuc2FmZTogdGFpbnRpbmcga2VybmVsXG4iLAorCQkgICAgICAgZXhpc3RpbmdfdGFibGUtPnNpZ25hdHVyZSwKKwkJICAgICAgIGV4aXN0aW5nX3RhYmxlLT5vZW1fdGFibGVfaWQpOworCQlhZGRfdGFpbnQoVEFJTlRfT1ZFUlJJRERFTl9BQ1BJX1RBQkxFKTsKKwl9CiAJcmV0dXJuIEFFX09LOwogfQogCisjaWZkZWYgQ09ORklHX0FDUElfQ1VTVE9NX0RTRFRfSU5JVFJECitpbnQgX19pbml0IGFjcGlfbm9faW5pdHJkX292ZXJyaWRlX3NldHVwKGNoYXIgKnMpCit7CisJYWNwaV9ub19pbml0cmRfb3ZlcnJpZGUgPSAxOworCXJldHVybiAxOworfQorX19zZXR1cCgiYWNwaV9ub19pbml0cmRfb3ZlcnJpZGUiLCBhY3BpX25vX2luaXRyZF9vdmVycmlkZV9zZXR1cCk7CisjZW5kaWYKKwogc3RhdGljIGlycXJldHVybl90IGFjcGlfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlyZXR1cm4gKCphY3BpX2lycV9oYW5kbGVyKSAoYWNwaV9pcnFfY29udGV4dCkgPyBJUlFfSEFORExFRCA6IElSUV9OT05FOworCXUzMiBoYW5kbGVkOworCisJaGFuZGxlZCA9ICgqYWNwaV9pcnFfaGFuZGxlcikgKGFjcGlfaXJxX2NvbnRleHQpOworCisJaWYgKGhhbmRsZWQpIHsKKwkJYWNwaV9pcnFfaGFuZGxlZCsrOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfSBlbHNlCisJCXJldHVybiBJUlFfTk9ORTsKIH0KIAogYWNwaV9zdGF0dXMKQEAgLTM0MSw2ICs0NTUsOCBAQAogewogCXVuc2lnbmVkIGludCBpcnE7CiAKKwlhY3BpX2lycV9zdGF0c19pbml0KCk7CisKIAkvKgogCSAqIElnbm9yZSB0aGUgR1NJIGZyb20gdGhlIGNvcmUsIGFuZCB1c2UgdGhlIHZhbHVlIGluIG91ciBjb3B5IG9mIHRoZQogCSAqIEZBRFQuIEl0IG1heSBub3QgYmUgdGhlIHNhbWUgaWYgYW4gaW50ZXJydXB0IHNvdXJjZSBvdmVycmlkZSBleGlzdHMKQEAgLTM4NCw4ICs1MDAsNiBAQAogCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShtc2Vjc190b19qaWZmaWVzKG1zKSk7CiB9CiAKLUVYUE9SVF9TWU1CT0woYWNwaV9vc19zbGVlcCk7Ci0KIHZvaWQgYWNwaV9vc19zdGFsbCh1MzIgdXMpCiB7CiAJd2hpbGUgKHVzKSB7CkBAIC0zOTksOCArNTEzLDYgQEAKIAl9CiB9CiAKLUVYUE9SVF9TWU1CT0woYWNwaV9vc19zdGFsbCk7Ci0KIC8qCiAgKiBTdXBwb3J0IEFDUEkgMy4wIEFNTCBUaW1lciBvcGVyYW5kCiAgKiBSZXR1cm5zIDY0LWJpdCBmcmVlLXJ1bm5pbmcsIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyB0aW1lcgpAQCAtNTUwLDggKzY2Miw2IEBACiAJcmV0dXJuIChyZXN1bHQgPyBBRV9FUlJPUiA6IEFFX09LKTsKIH0KIAotRVhQT1JUX1NZTUJPTChhY3BpX29zX3JlYWRfcGNpX2NvbmZpZ3VyYXRpb24pOwotCiBhY3BpX3N0YXR1cwogYWNwaV9vc193cml0ZV9wY2lfY29uZmlndXJhdGlvbihzdHJ1Y3QgYWNwaV9wY2lfaWQgKiBwY2lfaWQsIHUzMiByZWcsCiAJCQkJYWNwaV9pbnRlZ2VyIHZhbHVlLCB1MzIgd2lkdGgpCkBAIC02NjEsMjUgKzc3MSw2IEBACiAJZHBjLT5mdW5jdGlvbihkcGMtPmNvbnRleHQpOwogCWtmcmVlKGRwYyk7CiAKLQkvKiBZaWVsZCBjcHUgdG8gbm90aWZ5IHRocmVhZCAqLwotCWNvbmRfcmVzY2hlZCgpOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBhY3BpX29zX2V4ZWN1dGVfbm90aWZ5KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgYWNwaV9vc19kcGMgKmRwYyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWNwaV9vc19kcGMsIHdvcmspOwotCi0JaWYgKCFkcGMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiSW52YWxpZCAoTlVMTCkgY29udGV4dFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlkcGMtPmZ1bmN0aW9uKGRwYy0+Y29udGV4dCk7Ci0KLQlrZnJlZShkcGMpOwotCiAJcmV0dXJuOwogfQogCkBAIC03MDMsNyArNzk0LDcgQEAKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAlzdHJ1Y3QgYWNwaV9vc19kcGMgKmRwYzsKLQorCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpxdWV1ZTsKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCiAJCQkgICJTY2hlZHVsaW5nIGZ1bmN0aW9uIFslcCglcCldIGZvciBkZWZlcnJlZCBleGVjdXRpb24uXG4iLAogCQkJICBmdW5jdGlvbiwgY29udGV4dCkpOwpAQCAtNzI3LDIwICs4MTgsMTMgQEAKIAlkcGMtPmZ1bmN0aW9uID0gZnVuY3Rpb247CiAJZHBjLT5jb250ZXh0ID0gY29udGV4dDsKIAotCWlmICh0eXBlID09IE9TTF9OT1RJRllfSEFORExFUikgewotCQlJTklUX1dPUksoJmRwYy0+d29yaywgYWNwaV9vc19leGVjdXRlX25vdGlmeSk7Ci0JCWlmICghcXVldWVfd29yayhrYWNwaV9ub3RpZnlfd3EsICZkcGMtPndvcmspKSB7Ci0JCQlzdGF0dXMgPSBBRV9FUlJPUjsKLQkJCWtmcmVlKGRwYyk7Ci0JCX0KLQl9IGVsc2UgewotCQlJTklUX1dPUksoJmRwYy0+d29yaywgYWNwaV9vc19leGVjdXRlX2RlZmVycmVkKTsKLQkJaWYgKCFxdWV1ZV93b3JrKGthY3BpZF93cSwgJmRwYy0+d29yaykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiQ2FsbCB0byBxdWV1ZV93b3JrKCkgZmFpbGVkLlxuIikpOwotCQkJc3RhdHVzID0gQUVfRVJST1I7Ci0JCQlrZnJlZShkcGMpOwotCQl9CisJSU5JVF9XT1JLKCZkcGMtPndvcmssIGFjcGlfb3NfZXhlY3V0ZV9kZWZlcnJlZCk7CisJcXVldWUgPSAodHlwZSA9PSBPU0xfTk9USUZZX0hBTkRMRVIpID8ga2FjcGlfbm90aWZ5X3dxIDoga2FjcGlkX3dxOworCWlmICghcXVldWVfd29yayhxdWV1ZSwgJmRwYy0+d29yaykpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCSAgIkNhbGwgdG8gcXVldWVfd29yaygpIGZhaWxlZC5cbiIpKTsKKwkJc3RhdHVzID0gQUVfRVJST1I7CisJCWtmcmVlKGRwYyk7CiAJfQogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQpAQCAtNzkzLDggKzg3Nyw2IEBACiAJcmV0dXJuIEFFX09LOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfb3NfY3JlYXRlX3NlbWFwaG9yZSk7Ci0KIC8qCiAgKiBUT0RPOiBBIGJldHRlciB3YXkgdG8gZGVsZXRlIHNlbWFwaG9yZXM/ICBMaW51eCBkb2Vzbid0IGhhdmUgYQogICogJ2RlbGV0ZV9zZW1hcGhvcmUoKScgZnVuY3Rpb24gLS0gbWF5IHJlc3VsdCBpbiBhbiBpbnZhbGlkCkBAIC04MTgsOCArOTAwLDYgQEAKIAlyZXR1cm4gQUVfT0s7CiB9CiAKLUVYUE9SVF9TWU1CT0woYWNwaV9vc19kZWxldGVfc2VtYXBob3JlKTsKLQogLyoKICAqIFRPRE86IFRoZSBrZXJuZWwgZG9lc24ndCBoYXZlIGEgJ2Rvd25fdGltZW91dCcgZnVuY3Rpb24gLS0gaGFkIHRvCiAgKiBpbXByb3Zpc2UuICBUaGUgcHJvY2VzcyBpcyB0byBzbGVlcCBmb3Igb25lIHNjaGVkdWxlciBxdWFudHVtCkBAIC05MTIsOCArOTkyLDYgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfb3Nfd2FpdF9zZW1hcGhvcmUpOwotCiAvKgogICogVE9ETzogU3VwcG9ydCBmb3IgdW5pdHMgPiAxPwogICovCkBAIC05MzYsOCArMTAxNCw2IEBACiAJcmV0dXJuIEFFX09LOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfb3Nfc2lnbmFsX3NlbWFwaG9yZSk7Ci0KICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogdTMyIGFjcGlfb3NfZ2V0X2xpbmUoY2hhciAqYnVmZmVyKQogewpAQCAtOTgxLDggKzEwNTcsNiBAQAogCXJldHVybiBBRV9PSzsKIH0KIAotRVhQT1JUX1NZTUJPTChhY3BpX29zX3NpZ25hbCk7Ci0KIHN0YXRpYyBpbnQgX19pbml0IGFjcGlfb3NfbmFtZV9zZXR1cChjaGFyICpzdHIpCiB7CiAJY2hhciAqcCA9IGFjcGlfb3NfbmFtZTsKQEAgLTExMDIsNiArMTE3NiwxMjggQEAKIAogX19zZXR1cCgiYWNwaV93YWtlX2dwZXNfYWx3YXlzX29uIiwgYWNwaV93YWtlX2dwZXNfYWx3YXlzX29uX3NldHVwKTsKIAorLyogQ2hlY2sgb2YgcmVzb3VyY2UgaW50ZXJmZXJlbmNlIGJldHdlZW4gbmF0aXZlIGRyaXZlcnMgYW5kIEFDUEkKKyAqIE9wZXJhdGlvblJlZ2lvbnMgKFN5c3RlbUlPIGFuZCBTeXN0ZW0gTWVtb3J5IG9ubHkpLgorICogSU8gcG9ydHMgYW5kIG1lbW9yeSBkZWNsYXJlZCBpbiBBQ1BJIG1pZ2h0IGJlIHVzZWQgYnkgdGhlIEFDUEkgc3Vic3lzdGVtCisgKiBpbiBhcmJpdHJhcnkgQU1MIGNvZGUgYW5kIGNhbiBpbnRlcmZlcmUgd2l0aCBsZWdhY3kgZHJpdmVycy4KKyAqIGFjcGlfZW5mb3JjZV9yZXNvdXJjZXM9IGNhbiBiZSBzZXQgdG86CisgKgorICogICAtIHN0cmljdCAgICAgICAgICAgKDIpCisgKiAgICAgLT4gZnVydGhlciBkcml2ZXIgdHJ5aW5nIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2VzIHdpbGwgbm90IGxvYWQKKyAqICAgLSBsYXggKGRlZmF1bHQpICAgICgxKQorICogICAgIC0+IGZ1cnRoZXIgZHJpdmVyIHRyeWluZyB0byBhY2Nlc3MgdGhlIHJlc291cmNlcyB3aWxsIGxvYWQsIGJ1dCB5b3UKKyAqICAgICBnZXQgYSBzeXN0ZW0gbWVzc2FnZSB0aGF0IHNvbWV0aGluZyBtaWdodCBnbyB3cm9uZy4uLgorICoKKyAqICAgLSBubyAgICAgICAgICAgICAgICgwKQorICogICAgIC0+IEFDUEkgT3BlcmF0aW9uIFJlZ2lvbiByZXNvdXJjZXMgd2lsbCBub3QgYmUgcmVnaXN0ZXJlZAorICoKKyAqLworI2RlZmluZSBFTkZPUkNFX1JFU09VUkNFU19TVFJJQ1QgMgorI2RlZmluZSBFTkZPUkNFX1JFU09VUkNFU19MQVggICAgMQorI2RlZmluZSBFTkZPUkNFX1JFU09VUkNFU19OTyAgICAgMAorCitzdGF0aWMgdW5zaWduZWQgaW50IGFjcGlfZW5mb3JjZV9yZXNvdXJjZXMgPSBFTkZPUkNFX1JFU09VUkNFU19MQVg7CisKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfZW5mb3JjZV9yZXNvdXJjZXNfc2V0dXAoY2hhciAqc3RyKQoreworCWlmIChzdHIgPT0gTlVMTCB8fCAqc3RyID09ICdcMCcpCisJCXJldHVybiAwOworCisJaWYgKCFzdHJjbXAoInN0cmljdCIsIHN0cikpCisJCWFjcGlfZW5mb3JjZV9yZXNvdXJjZXMgPSBFTkZPUkNFX1JFU09VUkNFU19TVFJJQ1Q7CisJZWxzZSBpZiAoIXN0cmNtcCgibGF4Iiwgc3RyKSkKKwkJYWNwaV9lbmZvcmNlX3Jlc291cmNlcyA9IEVORk9SQ0VfUkVTT1VSQ0VTX0xBWDsKKwllbHNlIGlmICghc3RyY21wKCJubyIsIHN0cikpCisJCWFjcGlfZW5mb3JjZV9yZXNvdXJjZXMgPSBFTkZPUkNFX1JFU09VUkNFU19OTzsKKworCXJldHVybiAxOworfQorCitfX3NldHVwKCJhY3BpX2VuZm9yY2VfcmVzb3VyY2VzPSIsIGFjcGlfZW5mb3JjZV9yZXNvdXJjZXNfc2V0dXApOworCisvKiBDaGVjayBmb3IgcmVzb3VyY2UgY29uZmxpY3RzIGJldHdlZW4gQUNQSSBPcGVyYXRpb25SZWdpb25zIGFuZCBuYXRpdmUKKyAqIGRyaXZlcnMgKi8KK2ludCBhY3BpX2NoZWNrX3Jlc291cmNlX2NvbmZsaWN0KHN0cnVjdCByZXNvdXJjZSAqcmVzKQoreworCXN0cnVjdCBhY3BpX3Jlc19saXN0ICpyZXNfbGlzdF9lbGVtOworCWludCBpb3BvcnQ7CisJaW50IGNsYXNoID0gMDsKKworCWlmIChhY3BpX2VuZm9yY2VfcmVzb3VyY2VzID09IEVORk9SQ0VfUkVTT1VSQ0VTX05PKQorCQlyZXR1cm4gMDsKKwlpZiAoIShyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykgJiYgIShyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pKQorCQlyZXR1cm4gMDsKKworCWlvcG9ydCA9IHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPOworCisJc3Bpbl9sb2NrKCZhY3BpX3Jlc19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlc19saXN0X2VsZW0sICZyZXNvdXJjZV9saXN0X2hlYWQsCisJCQkgICAgcmVzb3VyY2VfbGlzdCkgeworCQlpZiAoaW9wb3J0ICYmIChyZXNfbGlzdF9lbGVtLT5yZXNvdXJjZV90eXBlCisJCQkgICAgICAgIT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIWlvcG9ydCAmJiAocmVzX2xpc3RfZWxlbS0+cmVzb3VyY2VfdHlwZQorCQkJCSE9IEFDUElfQURSX1NQQUNFX1NZU1RFTV9NRU1PUlkpKQorCQkJY29udGludWU7CisKKwkJaWYgKHJlcy0+ZW5kIDwgcmVzX2xpc3RfZWxlbS0+c3RhcnQKKwkJICAgIHx8IHJlc19saXN0X2VsZW0tPmVuZCA8IHJlcy0+c3RhcnQpCisJCQljb250aW51ZTsKKwkJY2xhc2ggPSAxOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJmFjcGlfcmVzX2xvY2spOworCisJaWYgKGNsYXNoKSB7CisJCWlmIChhY3BpX2VuZm9yY2VfcmVzb3VyY2VzICE9IEVORk9SQ0VfUkVTT1VSQ0VTX05PKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlc0FDUEk6ICVzIHJlc291cmNlICVzIFsweCVsbHgtMHglbGx4XSIKKwkJCSAgICAgICAiIGNvbmZsaWN0cyB3aXRoIEFDUEkgcmVnaW9uICVzIgorCQkJICAgICAgICIgWzB4JWxseC0weCVsbHhdXG4iLAorCQkJICAgICAgIGFjcGlfZW5mb3JjZV9yZXNvdXJjZXMgPT0gRU5GT1JDRV9SRVNPVVJDRVNfTEFYCisJCQkgICAgICAgPyBLRVJOX1dBUk5JTkcgOiBLRVJOX0VSUiwKKwkJCSAgICAgICBpb3BvcnQgPyAiSS9PIiA6ICJNZW1vcnkiLCByZXMtPm5hbWUsCisJCQkgICAgICAgKGxvbmcgbG9uZykgcmVzLT5zdGFydCwgKGxvbmcgbG9uZykgcmVzLT5lbmQsCisJCQkgICAgICAgcmVzX2xpc3RfZWxlbS0+bmFtZSwKKwkJCSAgICAgICAobG9uZyBsb25nKSByZXNfbGlzdF9lbGVtLT5zdGFydCwKKwkJCSAgICAgICAobG9uZyBsb25nKSByZXNfbGlzdF9lbGVtLT5lbmQpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiQUNQSTogRGV2aWNlIG5lZWRzIGFuIEFDUEkgZHJpdmVyXG4iKTsKKwkJfQorCQlpZiAoYWNwaV9lbmZvcmNlX3Jlc291cmNlcyA9PSBFTkZPUkNFX1JFU09VUkNFU19TVFJJQ1QpCisJCQlyZXR1cm4gLUVCVVNZOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYWNwaV9jaGVja19yZXNvdXJjZV9jb25mbGljdCk7CisKK2ludCBhY3BpX2NoZWNrX3JlZ2lvbihyZXNvdXJjZV9zaXplX3Qgc3RhcnQsIHJlc291cmNlX3NpemVfdCBuLAorCQkgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCByZXNvdXJjZSByZXMgPSB7CisJCS5zdGFydCA9IHN0YXJ0LAorCQkuZW5kICAgPSBzdGFydCArIG4gLSAxLAorCQkubmFtZSAgPSBuYW1lLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lPLAorCX07CisKKwlyZXR1cm4gYWNwaV9jaGVja19yZXNvdXJjZV9jb25mbGljdCgmcmVzKTsKK30KK0VYUE9SVF9TWU1CT0woYWNwaV9jaGVja19yZWdpb24pOworCitpbnQgYWNwaV9jaGVja19tZW1fcmVnaW9uKHJlc291cmNlX3NpemVfdCBzdGFydCwgcmVzb3VyY2Vfc2l6ZV90IG4sCisJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHJlc291cmNlIHJlcyA9IHsKKwkJLnN0YXJ0ID0gc3RhcnQsCisJCS5lbmQgICA9IHN0YXJ0ICsgbiAtIDEsCisJCS5uYW1lICA9IG5hbWUsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX07CisKKwlyZXR1cm4gYWNwaV9jaGVja19yZXNvdXJjZV9jb25mbGljdCgmcmVzKTsKKworfQorRVhQT1JUX1NZTUJPTChhY3BpX2NoZWNrX21lbV9yZWdpb24pOworCiAvKgogICogQWNxdWlyZSBhIHNwaW5sb2NrLgogICoKQEAgLTEyMTMsMjQgKzE0MDksMjQgQEAKICAqCiAgKglSZXR1cm5zIDAgb24gc3VjY2VzcwogICovCi1pbnQgYWNwaV9kbWlfZHVtcCh2b2lkKQorc3RhdGljIGludCBhY3BpX2RtaV9kdW1wKHZvaWQpCiB7CiAKIAlpZiAoIWRtaV9hdmFpbGFibGUpCiAJCXJldHVybiAtMTsKIAogCXByaW50ayhLRVJOX05PVElDRSBQUkVGSVggIkRNSSBTeXN0ZW0gVmVuZG9yOiAlc1xuIiwKLQkJZG1pX2dldF9zbG90KERNSV9TWVNfVkVORE9SKSk7CisJCWRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX1NZU19WRU5ET1IpKTsKIAlwcmludGsoS0VSTl9OT1RJQ0UgUFJFRklYICJETUkgUHJvZHVjdCBOYW1lOiAlc1xuIiwKLQkJZG1pX2dldF9zbG90KERNSV9QUk9EVUNUX05BTUUpKTsKKwkJZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfUFJPRFVDVF9OQU1FKSk7CiAJcHJpbnRrKEtFUk5fTk9USUNFIFBSRUZJWCAiRE1JIFByb2R1Y3QgVmVyc2lvbjogJXNcbiIsCi0JCWRtaV9nZXRfc2xvdChETUlfUFJPRFVDVF9WRVJTSU9OKSk7CisJCWRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX1BST0RVQ1RfVkVSU0lPTikpOwogCXByaW50ayhLRVJOX05PVElDRSBQUkVGSVggIkRNSSBCb2FyZCBOYW1lOiAlc1xuIiwKLQkJZG1pX2dldF9zbG90KERNSV9CT0FSRF9OQU1FKSk7CisJCWRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX0JPQVJEX05BTUUpKTsKIAlwcmludGsoS0VSTl9OT1RJQ0UgUFJFRklYICJETUkgQklPUyBWZW5kb3I6ICVzXG4iLAotCQlkbWlfZ2V0X3Nsb3QoRE1JX0JJT1NfVkVORE9SKSk7CisJCWRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX0JJT1NfVkVORE9SKSk7CiAJcHJpbnRrKEtFUk5fTk9USUNFIFBSRUZJWCAiRE1JIEJJT1MgRGF0ZTogJXNcbiIsCi0JCWRtaV9nZXRfc2xvdChETUlfQklPU19EQVRFKSk7CisJCWRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX0JJT1NfREFURSkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzAzLDEwICsxNDk5LDQ2IEBACiBhY3BpX29zX3ZhbGlkYXRlX2FkZHJlc3MgKAogICAgIHU4ICAgICAgICAgICAgICAgICAgIHNwYWNlX2lkLAogICAgIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgIGFkZHJlc3MsCi0gICAgYWNwaV9zaXplICAgICAgICAgICAgICAgbGVuZ3RoKQorICAgIGFjcGlfc2l6ZSAgICAgICAgICAgICAgIGxlbmd0aCwKKyAgICBjaGFyICpuYW1lKQogeworCXN0cnVjdCBhY3BpX3Jlc19saXN0ICpyZXM7CisJaWYgKGFjcGlfZW5mb3JjZV9yZXNvdXJjZXMgPT0gRU5GT1JDRV9SRVNPVVJDRVNfTk8pCisJCXJldHVybiBBRV9PSzsKIAotICAgIHJldHVybiBBRV9PSzsKKwlzd2l0Y2ggKHNwYWNlX2lkKSB7CisJY2FzZSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU86CisJY2FzZSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZOgorCQkvKiBPbmx5IGludGVyZmVyZW5jZSBjaGVja3MgYWdhaW5zdCBTeXN0ZW1JTyBhbmQgU3l0ZW1NZW1vcnkKKwkJICAgYXJlIG5lZWRlZCAqLworCQlyZXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWNwaV9yZXNfbGlzdCksIEdGUF9LRVJORUwpOworCQlpZiAoIXJlcykKKwkJCXJldHVybiBBRV9PSzsKKwkJLyogQUNQSSBuYW1lcyBhcmUgZml4ZWQgdG8gNCBieXRlcywgc3RpbGwgYmV0dGVyIHVzZSBzdHJsY3B5ICovCisJCXN0cmxjcHkocmVzLT5uYW1lLCBuYW1lLCA1KTsKKwkJcmVzLT5zdGFydCA9IGFkZHJlc3M7CisJCXJlcy0+ZW5kID0gYWRkcmVzcyArIGxlbmd0aCAtIDE7CisJCXJlcy0+cmVzb3VyY2VfdHlwZSA9IHNwYWNlX2lkOworCQlzcGluX2xvY2soJmFjcGlfcmVzX2xvY2spOworCQlsaXN0X2FkZCgmcmVzLT5yZXNvdXJjZV9saXN0LCAmcmVzb3VyY2VfbGlzdF9oZWFkKTsKKwkJc3Bpbl91bmxvY2soJmFjcGlfcmVzX2xvY2spOworCQlwcl9kZWJ1ZygiQWRkZWQgJXMgcmVzb3VyY2U6IHN0YXJ0OiAweCVsbHgsIGVuZDogMHglbGx4LCAiCisJCQkgIm5hbWU6ICVzXG4iLCAoc3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPKQorCQkJID8gIlN5c3RlbUlPIiA6ICJTeXN0ZW0gTWVtb3J5IiwKKwkJCSAodW5zaWduZWQgbG9uZyBsb25nKXJlcy0+c3RhcnQsCisJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXMtPmVuZCwKKwkJCSByZXMtPm5hbWUpOworCQlicmVhazsKKwljYXNlIEFDUElfQURSX1NQQUNFX1BDSV9DT05GSUc6CisJY2FzZSBBQ1BJX0FEUl9TUEFDRV9FQzoKKwljYXNlIEFDUElfQURSX1NQQUNFX1NNQlVTOgorCWNhc2UgQUNQSV9BRFJfU1BBQ0VfQ01PUzoKKwljYXNlIEFDUElfQURSX1NQQUNFX1BDSV9CQVJfVEFSR0VUOgorCWNhc2UgQUNQSV9BRFJfU1BBQ0VfREFUQV9UQUJMRToKKwljYXNlIEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFOgorCQlicmVhazsKKwl9CisJcmV0dXJuIEFFX09LOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfYmluZC5jIGIvZHJpdmVycy9hY3BpL3BjaV9iaW5kLmMKaW5kZXggMzg4MzAwZC4uNGIyNTJlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9iaW5kLmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9iaW5kLmMKQEAgLTQ0LDYgKzQ0LDggQEAKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OwogfTsKIAorc3RhdGljIGludCBhY3BpX3BjaV91bmJpbmQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOworCiBzdGF0aWMgdm9pZCBhY3BpX3BjaV9kYXRhX2hhbmRsZXIoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZnVuY3Rpb24sCiAJCQkJICB2b2lkICpjb250ZXh0KQogewpAQCAtMjY3LDcgKzI2OSw3IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotaW50IGFjcGlfcGNpX3VuYmluZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3N0YXRpYyBpbnQgYWNwaV9wY2lfdW5iaW5kKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCWludCByZXN1bHQgPSAwOwogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9pcnEuYyBiL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMKaW5kZXggNjIwMTBjMi4uN2YxOTg1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9pcnEuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX2lycS5jCkBAIC01MSwxMCArNTEsOCBAQAogCQkJCQkJCSAgaW50IGJ1cywKIAkJCQkJCQkgIGludCBkZXZpY2UsIGludCBwaW4pCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbm9kZSA9IE5VTEw7CiAJc3RydWN0IGFjcGlfcHJ0X2VudHJ5ICplbnRyeSA9IE5VTEw7CiAKLQogCWlmICghYWNwaV9wcnQuY291bnQpCiAJCXJldHVybiBOVUxMOwogCkBAIC02NCw4ICs2Miw3IEBACiAJICoKIAkgKi8KIAlzcGluX2xvY2soJmFjcGlfcHJ0X2xvY2spOwotCWxpc3RfZm9yX2VhY2gobm9kZSwgJmFjcGlfcHJ0LmVudHJpZXMpIHsKLQkJZW50cnkgPSBsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBhY3BpX3BydF9lbnRyeSwgbm9kZSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmFjcGlfcHJ0LmVudHJpZXMsIG5vZGUpIHsKIAkJaWYgKChzZWdtZW50ID09IGVudHJ5LT5pZC5zZWdtZW50KQogCQkgICAgJiYgKGJ1cyA9PSBlbnRyeS0+aWQuYnVzKQogCQkgICAgJiYgKGRldmljZSA9PSBlbnRyeS0+aWQuZGV2aWNlKQpAQCAtNDc4LDggKzQ3NSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLUVYUE9SVF9TWU1CT0woYWNwaV9wY2lfaXJxX2VuYWJsZSk7Ci0KIC8qIEZJWE1FOiBpbXBsZW1lbnQgeDg2L3g4Nl82NCB2ZXJzaW9uICovCiB2b2lkIF9fYXR0cmlidXRlX18gKCh3ZWFrKSkgYWNwaV91bnJlZ2lzdGVyX2dzaSh1MzIgaSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfbGluay5jIGIvZHJpdmVycy9hY3BpL3BjaV9saW5rLmMKaW5kZXggNTQwMGVhMS4uMjMzYzQwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9saW5rLmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9saW5rLmMKQEAgLTk1LDcgKzk1LDcgQEAKIAlpbnQgY291bnQ7CiAJc3RydWN0IGxpc3RfaGVhZCBlbnRyaWVzOwogfSBhY3BpX2xpbms7Ci1ERUZJTkVfTVVURVgoYWNwaV9saW5rX2xvY2spOworc3RhdGljIERFRklORV9NVVRFWChhY3BpX2xpbmtfbG9jayk7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJIExpbmsgRGV2aWNlIE1hbmFnZW1lbnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wb3dlci5jIGIvZHJpdmVycy9hY3BpL3Bvd2VyLmMKaW5kZXggYWYxNzY5YS4uNzZiZjZkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Bvd2VyLmMKKysrIGIvZHJpdmVycy9hY3BpL3Bvd2VyLmMKQEAgLTQ1OCwxMSArNDU4LDkgQEAKIAl9CiAKICAgICAgZW5kOgotCWlmIChyZXN1bHQpIHsKKwlpZiAocmVzdWx0KQogCQlkZXZpY2UtPnBvd2VyLnN0YXRlID0gQUNQSV9TVEFURV9VTktOT1dOOwotCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiVHJhbnNpdGlvbmluZyBkZXZpY2UgWyVzXSB0byBEJWRcbiIsCi0JCQkgICAgICBkZXZpY2UtPnBucC5idXNfaWQsIHN0YXRlKTsKLQl9IGVsc2UgeworCWVsc2UgewogCS8qIFdlIHNob3VsZG4ndCBjaGFuZ2UgdGhlIHN0YXRlIHRpbGwgYWxsIGFib3ZlIG9wZXJhdGlvbnMgc3VjY2VlZCAqLwogCQlkZXZpY2UtPnBvd2VyLnN0YXRlID0gc3RhdGU7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwppbmRleCBlNDhlZTRmLi43NWNjZjVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwpAQCAtNjY4LDYgKzY2OCwyNCBAQAogCiAJYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdChwciwgZGV2aWNlKTsKIAorCXByLT5jZGV2ID0gdGhlcm1hbF9jb29saW5nX2RldmljZV9yZWdpc3RlcigiUHJvY2Vzc29yIiwgZGV2aWNlLAorCQkJCQkJJnByb2Nlc3Nvcl9jb29saW5nX29wcyk7CisJaWYgKHByLT5jZGV2KQorCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAorCQkJIiVzIGlzIHJlZ2lzdGVyZWQgYXMgY29vbGluZ19kZXZpY2UlZFxuIiwKKwkJCWRldmljZS0+ZGV2LmJ1c19pZCwgcHItPmNkZXYtPmlkKTsKKwllbHNlCisJCWdvdG8gZW5kOworCisJcmVzdWx0ID0gc3lzZnNfY3JlYXRlX2xpbmsoJmRldmljZS0+ZGV2LmtvYmosICZwci0+Y2Rldi0+ZGV2aWNlLmtvYmosCisJCQkJCSJ0aGVybWFsX2Nvb2xpbmciKTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gcmVzdWx0OworCXJlc3VsdCA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZwci0+Y2Rldi0+ZGV2aWNlLmtvYmosICZkZXZpY2UtPmRldi5rb2JqLAorCQkJCQkiZGV2aWNlIik7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKwogCWlmIChwci0+ZmxhZ3MudGhyb3R0bGluZykgewogCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiJXMgWyVzXSAoc3VwcG9ydHMiLAogCQkgICAgICAgYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSk7CkBAIC03OTEsNiArODA5LDExIEBACiAKIAlhY3BpX3Byb2Nlc3Nvcl9yZW1vdmVfZnMoZGV2aWNlKTsKIAorCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXZpY2UtPmRldi5rb2JqLCAidGhlcm1hbF9jb29saW5nIik7CisJc3lzZnNfcmVtb3ZlX2xpbmsoJnByLT5jZGV2LT5kZXZpY2Uua29iaiwgImRldmljZSIpOworCXRoZXJtYWxfY29vbGluZ19kZXZpY2VfdW5yZWdpc3Rlcihwci0+Y2Rldik7CisJcHItPmNkZXYgPSBOVUxMOworCiAJcHJvY2Vzc29yc1twci0+aWRdID0gTlVMTDsKIAogCWtmcmVlKHByKTsKQEAgLTgxMiwxMSArODM1LDE4IEBACiAKIAogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJfU1RBIiwgTlVMTCwgJnN0YSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpIHx8ICEoc3RhICYgQUNQSV9TVEFfREVWSUNFX1BSRVNFTlQpKSB7Ci0JCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJQcm9jZXNzb3IgRGV2aWNlIGlzIG5vdCBwcmVzZW50IikpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7CisJLyoKKwkgKiBpZiBhIHByb2Nlc3NvciBvYmplY3QgZG9lcyBub3QgaGF2ZSBhbiBfU1RBIG9iamVjdCwKKwkgKiBPU1BNIGFzc3VtZXMgdGhhdCB0aGUgcHJvY2Vzc29yIGlzIHByZXNlbnQuCisJICovCisJaWYgKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpCisJCXJldHVybiAxOworCisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpICYmIChzdGEgJiBBQ1BJX1NUQV9ERVZJQ0VfUFJFU0VOVCkpCisJCXJldHVybiAxOworCisJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywgIlByb2Nlc3NvciBEZXZpY2UgaXMgbm90IHByZXNlbnQiKSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYwpAQCAtMTA2MSw2ICsxMDkxLDggQEAKIAogCWFjcGlfcHJvY2Vzc29yX3BwY19pbml0KCk7CiAKKwlhY3BpX3Byb2Nlc3Nvcl90aHJvdHRsaW5nX2luaXQoKTsKKwogCXJldHVybiAwOwogCiBvdXRfY3B1aWRsZToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKaW5kZXggMTk5ZWEyMS4uMzIwMDNmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKQEAgLTk4LDYgKzk4LDkgQEAKIAogc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9zZXRfcG93ZXJfcG9saWN5KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpOwogCisjZWxzZQkvKiBDT05GSUdfQ1BVX0lETEUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbGF0ZW5jeV9mYWN0b3IgX19yZWFkX21vc3RseSA9IDI7Cittb2R1bGVfcGFyYW0obGF0ZW5jeV9mYWN0b3IsIHVpbnQsIDA2NDQpOwogI2VuZGlmCiAKIC8qCkBAIC0yMDEsNiArMjA0LDEwIEBACiAJCXJldHVybiBQTV9USU1FUl9USUNLU19UT19VUygoMHhGRkZGRkZGRiAtIHQxKSArIHQyKTsKIH0KIAorLyoKKyAqIENhbGxlcnMgc2hvdWxkIGRpc2FibGUgaW50ZXJydXB0cyBiZWZvcmUgdGhlIGNhbGwgYW5kIGVuYWJsZQorICogaW50ZXJydXB0cyBhZnRlciByZXR1cm4uCisgKi8KIHN0YXRpYyB2b2lkIGFjcGlfc2FmZV9oYWx0KHZvaWQpCiB7CiAJY3VycmVudF90aHJlYWRfaW5mbygpLT5zdGF0dXMgJj0gflRTX1BPTExJTkc7CkBAIC0yNjEsNyArMjY4LDcgQEAKIC8qIENvbW1vbiBDLXN0YXRlIGVudHJ5IGZvciBDMiwgQzMsIC4uICovCiBzdGF0aWMgdm9pZCBhY3BpX2NzdGF0ZV9lbnRlcihzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmNzdGF0ZSkKIHsKLQlpZiAoY3N0YXRlLT5zcGFjZV9pZCA9PSBBQ1BJX0NTVEFURV9GRkgpIHsKKwlpZiAoY3N0YXRlLT5lbnRyeV9tZXRob2QgPT0gQUNQSV9DU1RBVEVfRkZIKSB7CiAJCS8qIENhbGwgaW50byBhcmNoaXRlY3R1cmFsIEZGSCBiYXNlZCBDLXN0YXRlICovCiAJCWFjcGlfcHJvY2Vzc29yX2ZmaF9jc3RhdGVfZW50ZXIoY3N0YXRlKTsKIAl9IGVsc2UgewpAQCAtNDEzLDYgKzQyMCw4IEBACiAJCQlwbV9pZGxlX3NhdmUoKTsKIAkJZWxzZQogCQkJYWNwaV9zYWZlX2hhbHQoKTsKKworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTUyMSw2ICs1MzAsNyBAQAogCQkgKiAgICAgICBza2V3IG90aGVyd2lzZS4KIAkJICovCiAJCXNsZWVwX3RpY2tzID0gMHhGRkZGRkZGRjsKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9TVEFURV9DMjoKQEAgLTkyMiwyMCArOTMyLDIwIEBACiAJCWN4LmFkZHJlc3MgPSByZWctPmFkZHJlc3M7CiAJCWN4LmluZGV4ID0gY3VycmVudF9jb3VudCArIDE7CiAKLQkJY3guc3BhY2VfaWQgPSBBQ1BJX0NTVEFURV9TWVNURU1JTzsKKwkJY3guZW50cnlfbWV0aG9kID0gQUNQSV9DU1RBVEVfU1lTVEVNSU87CiAJCWlmIChyZWctPnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFKSB7CiAJCQlpZiAoYWNwaV9wcm9jZXNzb3JfZmZoX2NzdGF0ZV9wcm9iZQogCQkJCQkocHItPmlkLCAmY3gsIHJlZykgPT0gMCkgewotCQkJCWN4LnNwYWNlX2lkID0gQUNQSV9DU1RBVEVfRkZIOwotCQkJfSBlbHNlIGlmIChjeC50eXBlICE9IEFDUElfU1RBVEVfQzEpIHsKKwkJCQljeC5lbnRyeV9tZXRob2QgPSBBQ1BJX0NTVEFURV9GRkg7CisJCQl9IGVsc2UgaWYgKGN4LnR5cGUgPT0gQUNQSV9TVEFURV9DMSkgewogCQkJCS8qCiAJCQkJICogQzEgaXMgYSBzcGVjaWFsIGNhc2Ugd2hlcmUgRklYRURfSEFSRFdBUkUKIAkJCQkgKiBjYW4gYmUgaGFuZGxlZCBpbiBub24tTVdBSVQgd2F5IGFzIHdlbGwuCiAJCQkJICogSW4gdGhhdCBjYXNlLCBzYXZlIHRoaXMgX0NTVCBlbnRyeSBpbmZvLgotCQkJCSAqIFRoYXQgaXMsIHdlIHJldGFpbiBzcGFjZV9pZCBvZiBTWVNURU1fSU8gZm9yCi0JCQkJICogaGFsdCBiYXNlZCBDMS4KIAkJCQkgKiBPdGhlcndpc2UsIGlnbm9yZSB0aGlzIGluZm8gYW5kIGNvbnRpbnVlLgogCQkJCSAqLworCQkJCWN4LmVudHJ5X21ldGhvZCA9IEFDUElfQ1NUQVRFX0hBTFQ7CisJCQl9IGVsc2UgewogCQkJCWNvbnRpbnVlOwogCQkJfQogCQl9CkBAIC0xMzY5LDEyICsxMzc5LDE2IEBACiAvKioKICAqIGFjcGlfaWRsZV9kb19lbnRyeSAtIGEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgZG9lcyBDMiBhbmQgQzMgdHlwZSBlbnRyeQogICogQGN4OiBjc3RhdGUgZGF0YQorICoKKyAqIENhbGxlciBkaXNhYmxlcyBpbnRlcnJ1cHQgYmVmb3JlIGNhbGwgYW5kIGVuYWJsZXMgaW50ZXJydXB0IGFmdGVyIHJldHVybi4KICAqLwogc3RhdGljIGlubGluZSB2b2lkIGFjcGlfaWRsZV9kb19lbnRyeShzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmN4KQogewotCWlmIChjeC0+c3BhY2VfaWQgPT0gQUNQSV9DU1RBVEVfRkZIKSB7CisJaWYgKGN4LT5lbnRyeV9tZXRob2QgPT0gQUNQSV9DU1RBVEVfRkZIKSB7CiAJCS8qIENhbGwgaW50byBhcmNoaXRlY3R1cmFsIEZGSCBiYXNlZCBDLXN0YXRlICovCiAJCWFjcGlfcHJvY2Vzc29yX2ZmaF9jc3RhdGVfZW50ZXIoY3gpOworCX0gZWxzZSBpZiAoY3gtPmVudHJ5X21ldGhvZCA9PSBBQ1BJX0NTVEFURV9IQUxUKSB7CisJCWFjcGlfc2FmZV9oYWx0KCk7CiAJfSBlbHNlIHsKIAkJaW50IHVudXNlZDsKIAkJLyogSU8gcG9ydCBiYXNlZCBDLXN0YXRlICovCkBAIC0xMzk2LDIxICsxNDEwLDI3IEBACiBzdGF0aWMgaW50IGFjcGlfaWRsZV9lbnRlcl9jMShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwKIAkJCSAgICAgIHN0cnVjdCBjcHVpZGxlX3N0YXRlICpzdGF0ZSkKIHsKKwl1MzIgdDEsIHQyOwogCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHI7CiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpjeCA9IGNwdWlkbGVfZ2V0X3N0YXRlZGF0YShzdGF0ZSk7CisKIAlwciA9IHByb2Nlc3NvcnNbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKIAogCWlmICh1bmxpa2VseSghcHIpKQogCQlyZXR1cm4gMDsKIAorCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJaWYgKHByLT5mbGFncy5ibV9jaGVjaykKIAkJYWNwaV9pZGxlX3VwZGF0ZV9ibV9ybGQocHIsIGN4KTsKIAotCWFjcGlfc2FmZV9oYWx0KCk7CisJdDEgPSBpbmwoYWNwaV9nYmxfRkFEVC54cG1fdGltZXJfYmxvY2suYWRkcmVzcyk7CisJYWNwaV9pZGxlX2RvX2VudHJ5KGN4KTsKKwl0MiA9IGlubChhY3BpX2dibF9GQURULnhwbV90aW1lcl9ibG9jay5hZGRyZXNzKTsKIAorCWxvY2FsX2lycV9lbmFibGUoKTsKIAljeC0+dXNhZ2UrKzsKIAotCXJldHVybiAwOworCXJldHVybiB0aWNrc19lbGFwc2VkX2luX3VzKHQxLCB0Mik7CiB9CiAKIC8qKgpAQCAtMTUxNyw3ICsxNTM3LDkgQEAKIAkJaWYgKGRldi0+c2FmZV9zdGF0ZSkgewogCQkJcmV0dXJuIGRldi0+c2FmZV9zdGF0ZS0+ZW50ZXIoZGV2LCBkZXYtPnNhZmVfc3RhdGUpOwogCQl9IGVsc2UgeworCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAkJCWFjcGlfc2FmZV9oYWx0KCk7CisJCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTE2MDksNyArMTYzMSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3Jfc2V0dXBfY3B1aWRsZShzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQogewotCWludCBpLCBjb3VudCA9IDA7CisJaW50IGksIGNvdW50ID0gQ1BVSURMRV9EUklWRVJfU1RBVEVfU1RBUlQ7CiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpjeDsKIAlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGU7CiAJc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYgPSAmcHItPnBvd2VyLmRldjsKQEAgLTE2MzgsMTMgKzE2NjAsMTQgQEAKIAogCQlzbnByaW50ZihzdGF0ZS0+bmFtZSwgQ1BVSURMRV9OQU1FX0xFTiwgIkMlZCIsIGkpOwogCQlzdGF0ZS0+ZXhpdF9sYXRlbmN5ID0gY3gtPmxhdGVuY3k7Ci0JCXN0YXRlLT50YXJnZXRfcmVzaWRlbmN5ID0gY3gtPmxhdGVuY3kgKiA2OworCQlzdGF0ZS0+dGFyZ2V0X3Jlc2lkZW5jeSA9IGN4LT5sYXRlbmN5ICogbGF0ZW5jeV9mYWN0b3I7CiAJCXN0YXRlLT5wb3dlcl91c2FnZSA9IGN4LT5wb3dlcjsKIAogCQlzdGF0ZS0+ZmxhZ3MgPSAwOwogCQlzd2l0Y2ggKGN4LT50eXBlKSB7CiAJCQljYXNlIEFDUElfU1RBVEVfQzE6CiAJCQlzdGF0ZS0+ZmxhZ3MgfD0gQ1BVSURMRV9GTEFHX1NIQUxMT1c7CisJCQlzdGF0ZS0+ZmxhZ3MgfD0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQ7CiAJCQlzdGF0ZS0+ZW50ZXIgPSBhY3BpX2lkbGVfZW50ZXJfYzE7CiAJCQlkZXYtPnNhZmVfc3RhdGUgPSBzdGF0ZTsKIAkJCWJyZWFrOwpAQCAtMTY2Nyw2ICsxNjkwLDggQEAKIAkJfQogCiAJCWNvdW50Kys7CisJCWlmIChjb3VudCA9PSBDUFVJRExFX1NUQVRFX01BWCkKKwkJCWJyZWFrOwogCX0KIAogCWRldi0+c3RhdGVfY291bnQgPSBjb3VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMKaW5kZXggNDYzYjAyNC4uYjQ3N2E0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMKQEAgLTUwLDYgKzUwLDEwIEBACiAKIHN0YXRpYyBERUZJTkVfTVVURVgocGVyZm9ybWFuY2VfbXV0ZXgpOwogCisvKiBVc2UgY3B1ZnJlcSBkZWJ1ZyBsYXllciBmb3IgX1BQQyBjaGFuZ2VzLiAqLworI2RlZmluZSBjcHVmcmVxX3ByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfQ09SRSwgXAorCQkJCQkJImNwdWZyZXEtY29yZSIsIG1zZykKKwogLyoKICAqIF9QUEMgc3VwcG9ydCBpcyBpbXBsZW1lbnRlZCBhcyBhIENQVWZyZXEgcG9saWN5IG5vdGlmaWVyOgogICogVGhpcyBtZWFucyBlYWNoIHRpbWUgYSBDUFVmcmVxIGRyaXZlciByZWdpc3RlcmVkIGFsc28gd2l0aApAQCAtNjAsNiArNjQsMTEgQEAKICAqIHBvbGljeSBpcyBhZGp1c3RlZCBhY2NvcmRpbmdseS4KICAqLwogCitzdGF0aWMgdW5zaWduZWQgaW50IGlnbm9yZV9wcGMgPSAwOworbW9kdWxlX3BhcmFtKGlnbm9yZV9wcGMsIHVpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZ25vcmVfcHBjLCAiSWYgdGhlIGZyZXF1ZW5jeSBvZiB5b3VyIG1hY2hpbmUgZ2V0cyB3cm9uZ2x5IiBcCisJCSAibGltaXRlZCBieSBCSU9TLCB0aGlzIHNob3VsZCBoZWxwIik7CisKICNkZWZpbmUgUFBDX1JFR0lTVEVSRUQgICAxCiAjZGVmaW5lIFBQQ19JTl9VU0UgICAgICAgMgogCkBAIC03Miw2ICs4MSw5IEBACiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcjsKIAl1bnNpZ25lZCBpbnQgcHBjID0gMDsKIAorCWlmIChpZ25vcmVfcHBjKQorCQlyZXR1cm4gMDsKKwogCW11dGV4X2xvY2soJnBlcmZvcm1hbmNlX211dGV4KTsKIAogCWlmIChldmVudCAhPSBDUFVGUkVRX0lOQ09NUEFUSUJMRSkKQEAgLTEyMyw2ICsxMzUsOSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwljcHVmcmVxX3ByaW50aygiQ1BVICVkOiBfUFBDIGlzICVkIC0gZnJlcXVlbmN5ICVzIGxpbWl0ZWRcbiIsIHByLT5pZCwKKwkJICAgICAgIChpbnQpcHBjLCBwcGMgPyAiIiA6ICJub3QiKTsKKwogCXByLT5wZXJmb3JtYW5jZV9wbGF0Zm9ybV9saW1pdCA9IChpbnQpcHBjOwogCiAJcmV0dXJuIDA7CkBAIC0xMzAsNyArMTQ1LDEzIEBACiAKIGludCBhY3BpX3Byb2Nlc3Nvcl9wcGNfaGFzX2NoYW5nZWQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKIHsKLQlpbnQgcmV0ID0gYWNwaV9wcm9jZXNzb3JfZ2V0X3BsYXRmb3JtX2xpbWl0KHByKTsKKwlpbnQgcmV0OworCisJaWYgKGlnbm9yZV9wcGMpCisJCXJldHVybiAwOworCisJcmV0ID0gYWNwaV9wcm9jZXNzb3JfZ2V0X3BsYXRmb3JtX2xpbWl0KHByKTsKKwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gKHJldCk7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl90aGVybWFsLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3RoZXJtYWwuYwppbmRleCAwNmU2ZjNmLi45Y2I0M2Y1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3RoZXJtYWwuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3RoZXJtYWwuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTkzLDYgKzk0LDkgQEAKICAqIF9hbnlfIGNwdWZyZXEgZHJpdmVyIGFuZCBub3Qgb25seSB0aGUgYWNwaS1jcHVmcmVxIGRyaXZlci4KICAqLwogCisjZGVmaW5lIENQVUZSRVFfVEhFUk1BTF9NSU5fU1RFUCAwCisjZGVmaW5lIENQVUZSRVFfVEhFUk1BTF9NQVhfU1RFUCAzCisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgY3B1ZnJlcV90aGVybWFsX3JlZHVjdGlvbl9wY3RnW05SX0NQVVNdOwogc3RhdGljIHVuc2lnbmVkIGludCBhY3BpX3RoZXJtYWxfY3B1ZnJlcV9pc19pbml0ID0gMDsKIApAQCAtMTA5LDggKzExMyw5IEBACiAJaWYgKCFjcHVfaGFzX2NwdWZyZXEoY3B1KSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoY3B1ZnJlcV90aGVybWFsX3JlZHVjdGlvbl9wY3RnW2NwdV0gPCA2MCkgewotCQljcHVmcmVxX3RoZXJtYWxfcmVkdWN0aW9uX3BjdGdbY3B1XSArPSAyMDsKKwlpZiAoY3B1ZnJlcV90aGVybWFsX3JlZHVjdGlvbl9wY3RnW2NwdV0gPAorCQlDUFVGUkVRX1RIRVJNQUxfTUFYX1NURVApIHsKKwkJY3B1ZnJlcV90aGVybWFsX3JlZHVjdGlvbl9wY3RnW2NwdV0rKzsKIAkJY3B1ZnJlcV91cGRhdGVfcG9saWN5KGNwdSk7CiAJCXJldHVybiAwOwogCX0KQEAgLTEyMyw4ICsxMjgsOSBAQAogCWlmICghY3B1X2hhc19jcHVmcmVxKGNwdSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKGNwdWZyZXFfdGhlcm1hbF9yZWR1Y3Rpb25fcGN0Z1tjcHVdID4gMjApCi0JCWNwdWZyZXFfdGhlcm1hbF9yZWR1Y3Rpb25fcGN0Z1tjcHVdIC09IDIwOworCWlmIChjcHVmcmVxX3RoZXJtYWxfcmVkdWN0aW9uX3BjdGdbY3B1XSA+CisJCShDUFVGUkVRX1RIRVJNQUxfTUlOX1NURVAgKyAxKSkKKwkJY3B1ZnJlcV90aGVybWFsX3JlZHVjdGlvbl9wY3RnW2NwdV0tLTsKIAllbHNlCiAJCWNwdWZyZXFfdGhlcm1hbF9yZWR1Y3Rpb25fcGN0Z1tjcHVdID0gMDsKIAljcHVmcmVxX3VwZGF0ZV9wb2xpY3koY3B1KTsKQEAgLTE0Myw3ICsxNDksNyBAQAogCiAJbWF4X2ZyZXEgPQogCSAgICAocG9saWN5LT5jcHVpbmZvLm1heF9mcmVxICoKLQkgICAgICgxMDAgLSBjcHVmcmVxX3RoZXJtYWxfcmVkdWN0aW9uX3BjdGdbcG9saWN5LT5jcHVdKSkgLyAxMDA7CisJICAgICAoMTAwIC0gY3B1ZnJlcV90aGVybWFsX3JlZHVjdGlvbl9wY3RnW3BvbGljeS0+Y3B1XSAqIDIwKSkgLyAxMDA7CiAKIAljcHVmcmVxX3ZlcmlmeV93aXRoaW5fbGltaXRzKHBvbGljeSwgMCwgbWF4X2ZyZXEpOwogCkBAIC0xNTUsNiArMTYxLDMyIEBACiAJLm5vdGlmaWVyX2NhbGwgPSBhY3BpX3RoZXJtYWxfY3B1ZnJlcV9ub3RpZmllciwKIH07CiAKK3N0YXRpYyBpbnQgY3B1ZnJlcV9nZXRfbWF4X3N0YXRlKHVuc2lnbmVkIGludCBjcHUpCit7CisJaWYgKCFjcHVfaGFzX2NwdWZyZXEoY3B1KSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gQ1BVRlJFUV9USEVSTUFMX01BWF9TVEVQOworfQorCitzdGF0aWMgaW50IGNwdWZyZXFfZ2V0X2N1cl9zdGF0ZSh1bnNpZ25lZCBpbnQgY3B1KQoreworCWlmICghY3B1X2hhc19jcHVmcmVxKGNwdSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIGNwdWZyZXFfdGhlcm1hbF9yZWR1Y3Rpb25fcGN0Z1tjcHVdOworfQorCitzdGF0aWMgaW50IGNwdWZyZXFfc2V0X2N1cl9zdGF0ZSh1bnNpZ25lZCBpbnQgY3B1LCBpbnQgc3RhdGUpCit7CisJaWYgKCFjcHVfaGFzX2NwdWZyZXEoY3B1KSkKKwkJcmV0dXJuIDA7CisKKwljcHVmcmVxX3RoZXJtYWxfcmVkdWN0aW9uX3BjdGdbY3B1XSA9IHN0YXRlOworCWNwdWZyZXFfdXBkYXRlX3BvbGljeShjcHUpOworCXJldHVybiAwOworfQorCiB2b2lkIGFjcGlfdGhlcm1hbF9jcHVmcmVxX2luaXQodm9pZCkKIHsKIAlpbnQgaTsKQEAgLTE3OSw2ICsyMTEsMjAgQEAKIH0KIAogI2Vsc2UJCQkJLyogISBDT05GSUdfQ1BVX0ZSRVEgKi8KK3N0YXRpYyBpbnQgY3B1ZnJlcV9nZXRfbWF4X3N0YXRlKHVuc2lnbmVkIGludCBjcHUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3B1ZnJlcV9nZXRfY3VyX3N0YXRlKHVuc2lnbmVkIGludCBjcHUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3B1ZnJlcV9zZXRfY3VyX3N0YXRlKHVuc2lnbmVkIGludCBjcHUsIGludCBzdGF0ZSkKK3sKKwlyZXR1cm4gMDsKK30KIAogc3RhdGljIGludCBhY3BpX3RoZXJtYWxfY3B1ZnJlcV9pbmNyZWFzZSh1bnNpZ25lZCBpbnQgY3B1KQogewpAQCAtMzEwLDYgKzM1Niw4NCBAQAogCXJldHVybiAwOwogfQogCisvKiB0aGVybWFsIGNvb2xpZ24gZGV2aWNlIGNhbGxiYWNrcyAqLworc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9tYXhfc3RhdGUoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKK3sKKwlpbnQgbWF4X3N0YXRlID0gMDsKKworCS8qCisJICogVGhlcmUgZXhpc3RzIGZvdXIgc3RhdGVzIGFjY29yZGluZyB0bworCSAqIGNwdWZyZXFfdGhlcm1hbF9yZWR1Y3Rpb25fcHRnLiAwLCAxLCAyLCAzCisJICovCisJbWF4X3N0YXRlICs9IGNwdWZyZXFfZ2V0X21heF9zdGF0ZShwci0+aWQpOworCWlmIChwci0+ZmxhZ3MudGhyb3R0bGluZykKKwkJbWF4X3N0YXRlICs9IChwci0+dGhyb3R0bGluZy5zdGF0ZV9jb3VudCAtMSk7CisKKwlyZXR1cm4gbWF4X3N0YXRlOworfQorc3RhdGljIGludAorcHJvY2Vzc29yX2dldF9tYXhfc3RhdGUoc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IGNkZXYtPmRldmRhdGE7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKKworCWlmICghZGV2aWNlIHx8ICFwcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgYWNwaV9wcm9jZXNzb3JfbWF4X3N0YXRlKHByKSk7Cit9CisKK3N0YXRpYyBpbnQKK3Byb2Nlc3Nvcl9nZXRfY3VyX3N0YXRlKHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBjZGV2LT5kZXZkYXRhOworCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CisJaW50IGN1cl9zdGF0ZTsKKworCWlmICghZGV2aWNlIHx8ICFwcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljdXJfc3RhdGUgPSBjcHVmcmVxX2dldF9jdXJfc3RhdGUocHItPmlkKTsKKwlpZiAocHItPmZsYWdzLnRocm90dGxpbmcpCisJCWN1cl9zdGF0ZSArPSBwci0+dGhyb3R0bGluZy5zdGF0ZTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjdXJfc3RhdGUpOworfQorCitzdGF0aWMgaW50Citwcm9jZXNzb3Jfc2V0X2N1cl9zdGF0ZShzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldiwgdW5zaWduZWQgaW50IHN0YXRlKQoreworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gY2Rldi0+ZGV2ZGF0YTsKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCWludCByZXN1bHQgPSAwOworCWludCBtYXhfcHN0YXRlOworCisJaWYgKCFkZXZpY2UgfHwgIXByKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1heF9wc3RhdGUgPSBjcHVmcmVxX2dldF9tYXhfc3RhdGUocHItPmlkKTsKKworCWlmIChzdGF0ZSA+IGFjcGlfcHJvY2Vzc29yX21heF9zdGF0ZShwcikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHN0YXRlIDw9IG1heF9wc3RhdGUpIHsKKwkJaWYgKHByLT5mbGFncy50aHJvdHRsaW5nICYmIHByLT50aHJvdHRsaW5nLnN0YXRlKQorCQkJcmVzdWx0ID0gYWNwaV9wcm9jZXNzb3Jfc2V0X3Rocm90dGxpbmcocHIsIDApOworCQljcHVmcmVxX3NldF9jdXJfc3RhdGUocHItPmlkLCBzdGF0ZSk7CisJfSBlbHNlIHsKKwkJY3B1ZnJlcV9zZXRfY3VyX3N0YXRlKHByLT5pZCwgbWF4X3BzdGF0ZSk7CisJCXJlc3VsdCA9IGFjcGlfcHJvY2Vzc29yX3NldF90aHJvdHRsaW5nKHByLAorCQkJCXN0YXRlIC0gbWF4X3BzdGF0ZSk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX29wcyBwcm9jZXNzb3JfY29vbGluZ19vcHMgPSB7CisJLmdldF9tYXhfc3RhdGUgPSBwcm9jZXNzb3JfZ2V0X21heF9zdGF0ZSwKKwkuZ2V0X2N1cl9zdGF0ZSA9IHByb2Nlc3Nvcl9nZXRfY3VyX3N0YXRlLAorCS5zZXRfY3VyX3N0YXRlID0gcHJvY2Vzc29yX3NldF9jdXJfc3RhdGUsCit9OworCiAvKiAvcHJvYyBpbnRlcmZhY2UgKi8KIAogc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9saW1pdF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl90aHJvdHRsaW5nLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3Rocm90dGxpbmcuYwppbmRleCAxNjg1YjQwLi4xYjhlNTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3Rocm90dGxpbmcuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3Rocm90dGxpbmcuYwpAQCAtNDUsOSArNDUsMjI5IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgICAgIEFDUElfUFJPQ0VTU09SX0NPTVBPTkVOVAogQUNQSV9NT0RVTEVfTkFNRSgicHJvY2Vzc29yX3Rocm90dGxpbmciKTsKIAorc3RydWN0IHRocm90dGxpbmdfdHN0YXRlIHsKKwl1bnNpZ25lZCBpbnQgY3B1OwkJLyogY3B1IG5yICovCisJaW50IHRhcmdldF9zdGF0ZTsJCS8qIHRhcmdldCBULXN0YXRlICovCit9OworCisjZGVmaW5lIFRIUk9UVExJTkdfUFJFQ0hBTkdFICAgICAgICgxKQorI2RlZmluZSBUSFJPVFRMSU5HX1BPU1RDSEFOR0UgICAgICAoMikKKwogc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfdGhyb3R0bGluZyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKTsKIGludCBhY3BpX3Byb2Nlc3Nvcl9zZXRfdGhyb3R0bGluZyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLCBpbnQgc3RhdGUpOwogCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX3VwZGF0ZV90c2RfY29vcmQodm9pZCkKK3sKKwlpbnQgY291bnQsIGNvdW50X3RhcmdldDsKKwlpbnQgcmV0dmFsID0gMDsKKwl1bnNpZ25lZCBpbnQgaSwgajsKKwljcHVtYXNrX3QgY292ZXJlZF9jcHVzOworCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsICptYXRjaF9wcjsKKwlzdHJ1Y3QgYWNwaV90c2RfcGFja2FnZSAqcGRvbWFpbiwgKm1hdGNoX3Bkb21haW47CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3Rocm90dGxpbmcgKnB0aHJvdHRsaW5nLCAqbWF0Y2hfcHRocm90dGxpbmc7CisKKwkvKgorCSAqIE5vdyB0aGF0IHdlIGhhdmUgX1RTRCBkYXRhIGZyb20gYWxsIENQVXMsIGxldHMgc2V0dXAgVC1zdGF0ZQorCSAqIGNvb3JkaW5hdGlvbiBiZXR3ZWVuIGFsbCBDUFVzLgorCSAqLworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCXByID0gcHJvY2Vzc29yc1tpXTsKKwkJaWYgKCFwcikKKwkJCWNvbnRpbnVlOworCisJCS8qIEJhc2ljIHZhbGlkaXR5IGNoZWNrIGZvciBkb21haW4gaW5mbyAqLworCQlwdGhyb3R0bGluZyA9ICYocHItPnRocm90dGxpbmcpOworCisJCS8qCisJCSAqIElmIHRzZCBwYWNrYWdlIGZvciBvbmUgY3B1IGlzIGludmFsaWQsIHRoZSBjb29yZGluYXRpb24KKwkJICogYW1vbmcgYWxsIENQVXMgaXMgdGhvdWdodCBhcyBpbnZhbGlkLgorCQkgKiBNYXliZSBpdCBpcyB1Z2x5LgorCQkgKi8KKwkJaWYgKCFwdGhyb3R0bGluZy0+dHNkX3ZhbGlkX2ZsYWcpIHsKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycl9yZXQ7CisKKwljcHVzX2NsZWFyKGNvdmVyZWRfY3B1cyk7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKKwkJcHIgPSBwcm9jZXNzb3JzW2ldOworCQlpZiAoIXByKQorCQkJY29udGludWU7CisKKwkJaWYgKGNwdV9pc3NldChpLCBjb3ZlcmVkX2NwdXMpKQorCQkJY29udGludWU7CisJCXB0aHJvdHRsaW5nID0gJnByLT50aHJvdHRsaW5nOworCisJCXBkb21haW4gPSAmKHB0aHJvdHRsaW5nLT5kb21haW5faW5mbyk7CisJCWNwdV9zZXQoaSwgcHRocm90dGxpbmctPnNoYXJlZF9jcHVfbWFwKTsKKwkJY3B1X3NldChpLCBjb3ZlcmVkX2NwdXMpOworCQkvKgorCQkgKiBJZiB0aGUgbnVtYmVyIG9mIHByb2Nlc3NvciBpbiB0aGUgVFNEIGRvbWFpbiBpcyAxLCBpdCBpcworCQkgKiB1bm5lY2Vzc2FyeSB0byBwYXJzZSB0aGUgY29vcmRpbmF0aW9uIGZvciB0aGlzIENQVS4KKwkJICovCisJCWlmIChwZG9tYWluLT5udW1fcHJvY2Vzc29ycyA8PSAxKQorCQkJY29udGludWU7CisKKwkJLyogVmFsaWRhdGUgdGhlIERvbWFpbiBpbmZvICovCisJCWNvdW50X3RhcmdldCA9IHBkb21haW4tPm51bV9wcm9jZXNzb3JzOworCQljb3VudCA9IDE7CisKKwkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGopIHsKKwkJCWlmIChpID09IGopCisJCQkJY29udGludWU7CisKKwkJCW1hdGNoX3ByID0gcHJvY2Vzc29yc1tqXTsKKwkJCWlmICghbWF0Y2hfcHIpCisJCQkJY29udGludWU7CisKKwkJCW1hdGNoX3B0aHJvdHRsaW5nID0gJihtYXRjaF9wci0+dGhyb3R0bGluZyk7CisJCQltYXRjaF9wZG9tYWluID0gJihtYXRjaF9wdGhyb3R0bGluZy0+ZG9tYWluX2luZm8pOworCQkJaWYgKG1hdGNoX3Bkb21haW4tPmRvbWFpbiAhPSBwZG9tYWluLT5kb21haW4pCisJCQkJY29udGludWU7CisKKwkJCS8qIEhlcmUgaSBhbmQgaiBhcmUgaW4gdGhlIHNhbWUgZG9tYWluLgorCQkJICogSWYgdHdvIFRTRCBwYWNrYWdlcyBoYXZlIHRoZSBzYW1lIGRvbWFpbiwgdGhleQorCQkJICogc2hvdWxkIGhhdmUgdGhlIHNhbWUgbnVtX3BvcmNlc3NvcnMgYW5kCisJCQkgKiBjb29yZGluYXRpb24gdHlwZS4gT3RoZXJ3aXNlIGl0IHdpbGwgYmUgcmVnYXJkZWQKKwkJCSAqIGFzIGlsbGVnYWwuCisJCQkgKi8KKwkJCWlmIChtYXRjaF9wZG9tYWluLT5udW1fcHJvY2Vzc29ycyAhPSBjb3VudF90YXJnZXQpIHsKKwkJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJCWdvdG8gZXJyX3JldDsKKwkJCX0KKworCQkJaWYgKHBkb21haW4tPmNvb3JkX3R5cGUgIT0gbWF0Y2hfcGRvbWFpbi0+Y29vcmRfdHlwZSkgeworCQkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQkJZ290byBlcnJfcmV0OworCQkJfQorCisJCQljcHVfc2V0KGosIGNvdmVyZWRfY3B1cyk7CisJCQljcHVfc2V0KGosIHB0aHJvdHRsaW5nLT5zaGFyZWRfY3B1X21hcCk7CisJCQljb3VudCsrOworCQl9CisJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShqKSB7CisJCQlpZiAoaSA9PSBqKQorCQkJCWNvbnRpbnVlOworCisJCQltYXRjaF9wciA9IHByb2Nlc3NvcnNbal07CisJCQlpZiAoIW1hdGNoX3ByKQorCQkJCWNvbnRpbnVlOworCisJCQltYXRjaF9wdGhyb3R0bGluZyA9ICYobWF0Y2hfcHItPnRocm90dGxpbmcpOworCQkJbWF0Y2hfcGRvbWFpbiA9ICYobWF0Y2hfcHRocm90dGxpbmctPmRvbWFpbl9pbmZvKTsKKwkJCWlmIChtYXRjaF9wZG9tYWluLT5kb21haW4gIT0gcGRvbWFpbi0+ZG9tYWluKQorCQkJCWNvbnRpbnVlOworCisJCQkvKgorCQkJICogSWYgc29tZSBDUFVTIGhhdmUgdGhlIHNhbWUgZG9tYWluLCB0aGV5CisJCQkgKiB3aWxsIGhhdmUgdGhlIHNhbWUgc2hhcmVkX2NwdV9tYXAuCisJCQkgKi8KKwkJCW1hdGNoX3B0aHJvdHRsaW5nLT5zaGFyZWRfY3B1X21hcCA9CisJCQkJcHRocm90dGxpbmctPnNoYXJlZF9jcHVfbWFwOworCQl9CisJfQorCitlcnJfcmV0OgorCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCXByID0gcHJvY2Vzc29yc1tpXTsKKwkJaWYgKCFwcikKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIEFzc3VtZSBubyBjb29yZGluYXRpb24gb24gYW55IGVycm9yIHBhcnNpbmcgZG9tYWluIGluZm8uCisJCSAqIFRoZSBjb29yZGluYXRpb24gdHlwZSB3aWxsIGJlIGZvcmNlZCBhcyBTV19BTEwuCisJCSAqLworCQlpZiAocmV0dmFsKSB7CisJCQlwdGhyb3R0bGluZyA9ICYocHItPnRocm90dGxpbmcpOworCQkJY3B1c19jbGVhcihwdGhyb3R0bGluZy0+c2hhcmVkX2NwdV9tYXApOworCQkJY3B1X3NldChpLCBwdGhyb3R0bGluZy0+c2hhcmVkX2NwdV9tYXApOworCQkJcHRocm90dGxpbmctPnNoYXJlZF90eXBlID0gRE9NQUlOX0NPT1JEX1RZUEVfU1dfQUxMOworCQl9CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFVwZGF0ZSB0aGUgVC1zdGF0ZSBjb29yZGluYXRpb24gYWZ0ZXIgdGhlIF9UU0QKKyAqIGRhdGEgZm9yIGFsbCBjcHVzIGlzIG9idGFpbmVkLgorICovCit2b2lkIGFjcGlfcHJvY2Vzc29yX3Rocm90dGxpbmdfaW5pdCh2b2lkKQoreworCWlmIChhY3BpX3Byb2Nlc3Nvcl91cGRhdGVfdHNkX2Nvb3JkKCkpCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCSJBc3N1bWUgbm8gVC1zdGF0ZSBjb29yZGluYXRpb25cbiIpKTsKKworCXJldHVybjsKK30KKworc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl90aHJvdHRsaW5nX25vdGlmaWVyKHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHRocm90dGxpbmdfdHN0YXRlICpwX3RzdGF0ZSA9IGRhdGE7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcjsKKwl1bnNpZ25lZCBpbnQgY3B1IDsKKwlpbnQgdGFyZ2V0X3N0YXRlOworCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9saW1pdCAqcF9saW1pdDsKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfdGhyb3R0bGluZyAqcF90aHJvdHRsaW5nOworCisJY3B1ID0gcF90c3RhdGUtPmNwdTsKKwlwciA9IHByb2Nlc3NvcnNbY3B1XTsKKwlpZiAoIXByKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkludmFsaWQgcHIgcG9pbnRlclxuIikpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFwci0+ZmxhZ3MudGhyb3R0bGluZykgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJUaHJvdHRsaW5nIGNvbnRyb2wgaXMgIgorCQkJCSJ1bnN1cHBvcnRlZCBvbiBDUFUgJWRcbiIsIGNwdSkpOworCQlyZXR1cm4gMDsKKwl9CisJdGFyZ2V0X3N0YXRlID0gcF90c3RhdGUtPnRhcmdldF9zdGF0ZTsKKwlwX3Rocm90dGxpbmcgPSAmKHByLT50aHJvdHRsaW5nKTsKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBUSFJPVFRMSU5HX1BSRUNIQU5HRToKKwkJLyoKKwkJICogUHJlY2hhbmdlIGV2ZW50IGlzIHVzZWQgdG8gY2hvb3NlIG9uZSBwcm9wZXIgdC1zdGF0ZSwKKwkJICogd2hpY2ggbWVldHMgdGhlIGxpbWl0cyBvZiB0aGVybWFsLCB1c2VyIGFuZCBfVFBDLgorCQkgKi8KKwkJcF9saW1pdCA9ICZwci0+bGltaXQ7CisJCWlmIChwX2xpbWl0LT50aGVybWFsLnR4ID4gdGFyZ2V0X3N0YXRlKQorCQkJdGFyZ2V0X3N0YXRlID0gcF9saW1pdC0+dGhlcm1hbC50eDsKKwkJaWYgKHBfbGltaXQtPnVzZXIudHggPiB0YXJnZXRfc3RhdGUpCisJCQl0YXJnZXRfc3RhdGUgPSBwX2xpbWl0LT51c2VyLnR4OworCQlpZiAocHItPnRocm90dGxpbmdfcGxhdGZvcm1fbGltaXQgPiB0YXJnZXRfc3RhdGUpCisJCQl0YXJnZXRfc3RhdGUgPSBwci0+dGhyb3R0bGluZ19wbGF0Zm9ybV9saW1pdDsKKwkJaWYgKHRhcmdldF9zdGF0ZSA+PSBwX3Rocm90dGxpbmctPnN0YXRlX2NvdW50KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJIkV4Y2VlZCB0aGUgbGltaXQgb2YgVC1zdGF0ZSBcbiIpOworCQkJdGFyZ2V0X3N0YXRlID0gcF90aHJvdHRsaW5nLT5zdGF0ZV9jb3VudCAtIDE7CisJCX0KKwkJcF90c3RhdGUtPnRhcmdldF9zdGF0ZSA9IHRhcmdldF9zdGF0ZTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiUHJlQ2hhbmdlIEV2ZW50OiIKKwkJCQkidGFyZ2V0IFQtc3RhdGUgb2YgQ1BVICVkIGlzIFQlZFxuIiwKKwkJCQljcHUsIHRhcmdldF9zdGF0ZSkpOworCQlicmVhazsKKwljYXNlIFRIUk9UVExJTkdfUE9TVENIQU5HRToKKwkJLyoKKwkJICogUG9zdGNoYW5nZSBldmVudCBpcyBvbmx5IHVzZWQgdG8gdXBkYXRlIHRoZQorCQkgKiBULXN0YXRlIGZsYWcgb2YgYWNwaV9wcm9jZXNzb3JfdGhyb3R0bGluZy4KKwkJICovCisJCXBfdGhyb3R0bGluZy0+c3RhdGUgPSB0YXJnZXRfc3RhdGU7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlBvc3RDaGFuZ2UgRXZlbnQ6IgorCQkJCSJDUFUgJWQgaXMgc3dpdGNoZWQgdG8gVCVkXG4iLAorCQkJCWNwdSwgdGFyZ2V0X3N0YXRlKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJVbnN1cHBvcnRlZCBUaHJvdHRsaW5nIG5vdGlmaWVyIGV2ZW50XG4iKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBfVFBDIC0gVGhyb3R0bGluZyBQcmVzZW50IENhcGFiaWxpdGllcwogICovCkBAIC0yOTMsNiArNTEzLDEwIEBACiAJc3RydWN0IGFjcGlfYnVmZmVyIHN0YXRlID0geyAwLCBOVUxMIH07CiAJdW5pb24gYWNwaV9vYmplY3QgKnRzZCA9IE5VTEw7CiAJc3RydWN0IGFjcGlfdHNkX3BhY2thZ2UgKnBkb21haW47CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3Rocm90dGxpbmcgKnB0aHJvdHRsaW5nOworCisJcHRocm90dGxpbmcgPSAmcHItPnRocm90dGxpbmc7CisJcHRocm90dGxpbmctPnRzZF92YWxpZF9mbGFnID0gMDsKIAogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KHByLT5oYW5kbGUsICJfVFNEIiwgTlVMTCwgJmJ1ZmZlcik7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CkBAIC0zNDAsNiArNTY0LDIyIEBACiAJCWdvdG8gZW5kOwogCX0KIAorCXB0aHJvdHRsaW5nID0gJnByLT50aHJvdHRsaW5nOworCXB0aHJvdHRsaW5nLT50c2RfdmFsaWRfZmxhZyA9IDE7CisJcHRocm90dGxpbmctPnNoYXJlZF90eXBlID0gcGRvbWFpbi0+Y29vcmRfdHlwZTsKKwljcHVfc2V0KHByLT5pZCwgcHRocm90dGxpbmctPnNoYXJlZF9jcHVfbWFwKTsKKwkvKgorCSAqIElmIHRoZSBjb29yZGluYXRpb24gdHlwZSBpcyBub3QgZGVmaW5lZCBpbiBBQ1BJIHNwZWMsCisJICogdGhlIHRzZF92YWxpZF9mbGFnIHdpbGwgYmUgY2xlYXIgYW5kIGNvb3JkaW5hdGlvbiB0eXBlCisJICogd2lsbCBiZSBmb3JlY2QgYXMgRE9NQUlOX0NPT1JEX1RZUEVfU1dfQUxMLgorCSAqLworCWlmIChwZG9tYWluLT5jb29yZF90eXBlICE9IERPTUFJTl9DT09SRF9UWVBFX1NXX0FMTCAmJgorCQlwZG9tYWluLT5jb29yZF90eXBlICE9IERPTUFJTl9DT09SRF9UWVBFX1NXX0FOWSAmJgorCQlwZG9tYWluLT5jb29yZF90eXBlICE9IERPTUFJTl9DT09SRF9UWVBFX0hXX0FMTCkgeworCQlwdGhyb3R0bGluZy0+dHNkX3ZhbGlkX2ZsYWcgPSAwOworCQlwdGhyb3R0bGluZy0+c2hhcmVkX3R5cGUgPSBET01BSU5fQ09PUkRfVFlQRV9TV19BTEw7CisJfQorCiAgICAgICBlbmQ6CiAJa2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwogCXJldHVybiByZXN1bHQ7CkBAIC01ODksNiArODI5LDExIEBACiAJY3B1bWFza190IHNhdmVkX21hc2s7CiAJaW50IHJldDsKIAorCWlmICghcHIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFwci0+ZmxhZ3MudGhyb3R0bGluZykKKwkJcmV0dXJuIC1FTk9ERVY7CiAJLyoKIAkgKiBNaWdyYXRlIHRhc2sgdG8gdGhlIGNwdSBwb2ludGVkIGJ5IHByLgogCSAqLwpAQCAtNzQyLDEzICs5ODcsOTIgQEAKIGludCBhY3BpX3Byb2Nlc3Nvcl9zZXRfdGhyb3R0bGluZyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLCBpbnQgc3RhdGUpCiB7CiAJY3B1bWFza190IHNhdmVkX21hc2s7Ci0JaW50IHJldDsKLQkvKgotCSAqIE1pZ3JhdGUgdGFzayB0byB0aGUgY3B1IHBvaW50ZWQgYnkgcHIuCi0JICovCisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yICptYXRjaF9wcjsKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfdGhyb3R0bGluZyAqcF90aHJvdHRsaW5nOworCXN0cnVjdCB0aHJvdHRsaW5nX3RzdGF0ZSB0X3N0YXRlOworCWNwdW1hc2tfdCBvbmxpbmVfdGhyb3R0bGluZ19jcHVzOworCisJaWYgKCFwcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXByLT5mbGFncy50aHJvdHRsaW5nKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICgoc3RhdGUgPCAwKSB8fCAoc3RhdGUgPiAocHItPnRocm90dGxpbmcuc3RhdGVfY291bnQgLSAxKSkpCisJCXJldHVybiAtRUlOVkFMOworCiAJc2F2ZWRfbWFzayA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKLQlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2tfb2ZfY3B1KHByLT5pZCkpOwotCXJldCA9IHByLT50aHJvdHRsaW5nLmFjcGlfcHJvY2Vzc29yX3NldF90aHJvdHRsaW5nKHByLCBzdGF0ZSk7CisJdF9zdGF0ZS50YXJnZXRfc3RhdGUgPSBzdGF0ZTsKKwlwX3Rocm90dGxpbmcgPSAmKHByLT50aHJvdHRsaW5nKTsKKwljcHVzX2FuZChvbmxpbmVfdGhyb3R0bGluZ19jcHVzLCBjcHVfb25saW5lX21hcCwKKwkJCXBfdGhyb3R0bGluZy0+c2hhcmVkX2NwdV9tYXApOworCS8qCisJICogVGhlIHRocm90dGxpbmcgbm90aWZpZXIgd2lsbCBiZSBjYWxsZWQgZm9yIGV2ZXJ5CisJICogYWZmZWN0ZWQgY3B1IGluIG9yZGVyIHRvIGdldCBvbmUgcHJvcGVyIFQtc3RhdGUuCisJICogVGhlIG5vdGlmaWVyIGV2ZW50IGlzIFRIUk9UVExJTkdfUFJFQ0hBTkdFLgorCSAqLworCWZvcl9lYWNoX2NwdV9tYXNrKGksIG9ubGluZV90aHJvdHRsaW5nX2NwdXMpIHsKKwkJdF9zdGF0ZS5jcHUgPSBpOworCQlhY3BpX3Byb2Nlc3Nvcl90aHJvdHRsaW5nX25vdGlmaWVyKFRIUk9UVExJTkdfUFJFQ0hBTkdFLAorCQkJCQkJCSZ0X3N0YXRlKTsKKwl9CisJLyoKKwkgKiBUaGUgZnVuY3Rpb24gb2YgYWNwaV9wcm9jZXNzb3Jfc2V0X3Rocm90dGxpbmcgd2lsbCBiZSBjYWxsZWQKKwkgKiB0byBzd2l0Y2ggVC1zdGF0ZS4gSWYgdGhlIGNvb3JkaW5hdGlvbiB0eXBlIGlzIFNXX0FMTCBvciBIV19BTEwsCisJICogaXQgaXMgbmVjZXNzYXJ5IHRvIGNhbGwgaXQgZm9yIGV2ZXJ5IGFmZmVjdGVkIGNwdS4gT3RoZXJ3aXNlCisJICogaXQgY2FuIGJlIGNhbGxlZCBvbmx5IGZvciB0aGUgY3B1IHBvaW50ZWQgYnkgcHIuCisJICovCisJaWYgKHBfdGhyb3R0bGluZy0+c2hhcmVkX3R5cGUgPT0gRE9NQUlOX0NPT1JEX1RZUEVfU1dfQU5ZKSB7CisJCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFza19vZl9jcHUocHItPmlkKSk7CisJCXJldCA9IHBfdGhyb3R0bGluZy0+YWNwaV9wcm9jZXNzb3Jfc2V0X3Rocm90dGxpbmcocHIsCisJCQkJCQl0X3N0YXRlLnRhcmdldF9zdGF0ZSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogV2hlbiB0aGUgVC1zdGF0ZSBjb29yZGluYXRpb24gaXMgU1dfQUxMIG9yIEhXX0FMTCwKKwkJICogaXQgaXMgbmVjZXNzYXJ5IHRvIHNldCBULXN0YXRlIGZvciBldmVyeSBhZmZlY3RlZAorCQkgKiBjcHVzLgorCQkgKi8KKwkJZm9yX2VhY2hfY3B1X21hc2soaSwgb25saW5lX3Rocm90dGxpbmdfY3B1cykgeworCQkJbWF0Y2hfcHIgPSBwcm9jZXNzb3JzW2ldOworCQkJLyoKKwkJCSAqIElmIHRoZSBwb2ludGVyIGlzIGludmFsaWQsIHdlIHdpbGwgcmVwb3J0IHRoZQorCQkJICogZXJyb3IgbWVzc2FnZSBhbmQgY29udGludWUuCisJCQkgKi8KKwkJCWlmICghbWF0Y2hfcHIpIHsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJCSJJbnZhbGlkIFBvaW50ZXIgZm9yIENQVSAlZFxuIiwgaSkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyoKKwkJCSAqIElmIHRoZSB0aHJvdHRsaW5nIGNvbnRyb2wgaXMgdW5zdXBwb3J0ZWQgb24gQ1BVIGksCisJCQkgKiB3ZSB3aWxsIHJlcG9ydCB0aGUgZXJyb3IgbWVzc2FnZSBhbmQgY29udGludWUuCisJCQkgKi8KKwkJCWlmICghbWF0Y2hfcHItPmZsYWdzLnRocm90dGxpbmcpIHsKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJCSJUaHJvdHRsaW5nIENvbnRyb2xsIGlzIHVuc3VwcG9ydGVkICIKKwkJCQkJIm9uIENQVSAlZFxuIiwgaSkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJdF9zdGF0ZS5jcHUgPSBpOworCQkJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdShpKSk7CisJCQlyZXQgPSBtYXRjaF9wci0+dGhyb3R0bGluZy4KKwkJCQlhY3BpX3Byb2Nlc3Nvcl9zZXRfdGhyb3R0bGluZygKKwkJCQltYXRjaF9wciwgdF9zdGF0ZS50YXJnZXRfc3RhdGUpOworCQl9CisJfQorCS8qCisJICogQWZ0ZXIgdGhlIHNldF90aHJvdHRsaW5nIGlzIGNhbGxlZCwgdGhlCisJICogdGhyb3R0bGluZyBub3RpZmllciBpcyBjYWxsZWQgZm9yIGV2ZXJ5CisJICogYWZmZWN0ZWQgY3B1IHRvIHVwZGF0ZSB0aGUgVC1zdGF0ZXMuCisJICogVGhlIG5vdGlmaWVyIGV2ZW50IGlzIFRIUk9UVExJTkdfUE9TVENIQU5HRQorCSAqLworCWZvcl9lYWNoX2NwdV9tYXNrKGksIG9ubGluZV90aHJvdHRsaW5nX2NwdXMpIHsKKwkJdF9zdGF0ZS5jcHUgPSBpOworCQlhY3BpX3Byb2Nlc3Nvcl90aHJvdHRsaW5nX25vdGlmaWVyKFRIUk9UVExJTkdfUE9TVENIQU5HRSwKKwkJCQkJCQkmdF9zdGF0ZSk7CisJfQogCS8qIHJlc3RvcmUgdGhlIHByZXZpb3VzIHN0YXRlICovCiAJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBzYXZlZF9tYXNrKTsKIAlyZXR1cm4gcmV0OwpAQCAtNzU3LDYgKzEwODEsNyBAQAogaW50IGFjcGlfcHJvY2Vzc29yX2dldF90aHJvdHRsaW5nX2luZm8oc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKIHsKIAlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfdGhyb3R0bGluZyAqcHRocm90dGxpbmc7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCiAJCQkgICJwYmxrX2FkZHJlc3NbMHglMDh4XSBkdXR5X29mZnNldFslZF0gZHV0eV93aWR0aFslZF1cbiIsCkBAIC03ODgsNyArMTExMywxNiBAQAogCQkgICAgJmFjcGlfcHJvY2Vzc29yX3NldF90aHJvdHRsaW5nX3B0YzsKIAl9CiAKLQlhY3BpX3Byb2Nlc3Nvcl9nZXRfdHNkKHByKTsKKwkvKgorCSAqIElmIFRTRCBwYWNrYWdlIGZvciBvbmUgQ1BVIGNhbid0IGJlIHBhcnNlZCBzdWNjZXNzZnVsbHksIGl0IG1lYW5zCisJICogdGhhdCB0aGlzIENQVSB3aWxsIGhhdmUgbm8gY29vcmRpbmF0aW9uIHdpdGggb3RoZXIgQ1BVcy4KKwkgKi8KKwlpZiAoYWNwaV9wcm9jZXNzb3JfZ2V0X3RzZChwcikpIHsKKwkJcHRocm90dGxpbmcgPSAmcHItPnRocm90dGxpbmc7CisJCXB0aHJvdHRsaW5nLT50c2RfdmFsaWRfZmxhZyA9IDA7CisJCWNwdV9zZXQocHItPmlkLCBwdGhyb3R0bGluZy0+c2hhcmVkX2NwdV9tYXApOworCQlwdGhyb3R0bGluZy0+c2hhcmVkX3R5cGUgPSBET01BSU5fQ09PUkRfVFlQRV9TV19BTEw7CisJfQogCiAJLyoKIAkgKiBQSUlYNCBFcnJhdGE6IFdlIGRvbid0IHN1cHBvcnQgdGhyb3R0bGluZyBvbiB0aGUgb3JpZ2luYWwgUElJWDQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2JzLmMgYi9kcml2ZXJzL2FjcGkvc2JzLmMKaW5kZXggZjEzNmM3ZC4uMTE5NDEwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Nicy5jCisrKyBiL2RyaXZlcnMvYWNwaS9zYnMuYwpAQCAtODg4LDcgKzg4OCw3IEBACiAjZW5kaWYKIH0KIAotdm9pZCBhY3BpX3Nic19jYWxsYmFjayh2b2lkICpjb250ZXh0KQorc3RhdGljIHZvaWQgYWNwaV9zYnNfY2FsbGJhY2sodm9pZCAqY29udGV4dCkKIHsKIAlpbnQgaWQ7CiAJc3RydWN0IGFjcGlfc2JzICpzYnMgPSBjb250ZXh0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Nic2hjLmMgYi9kcml2ZXJzL2FjcGkvc2JzaGMuYwppbmRleCBmZDQwYjZhMS4uYWU5YTkwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Nic2hjLmMKKysrIGIvZHJpdmVycy9hY3BpL3Nic2hjLmMKQEAgLTExMSw4ICsxMTEsOCBAQAogCQlyZXR1cm4gLUVUSU1FOwogfQogCi1pbnQgYWNwaV9zbWJ1c190cmFuc2FjdGlvbihzdHJ1Y3QgYWNwaV9zbWJfaGMgKmhjLCB1OCBwcm90b2NvbCwgdTggYWRkcmVzcywKLQkJICAgIHU4IGNvbW1hbmQsIHU4ICpkYXRhLCB1OCBsZW5ndGgpCitzdGF0aWMgaW50IGFjcGlfc21idXNfdHJhbnNhY3Rpb24oc3RydWN0IGFjcGlfc21iX2hjICpoYywgdTggcHJvdG9jb2wsCisJCQkJICB1OCBhZGRyZXNzLCB1OCBjb21tYW5kLCB1OCAqZGF0YSwgdTggbGVuZ3RoKQogewogCWludCByZXQgPSAtRUZBVUxULCBpOwogCXU4IHRlbXAsIHN6ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zY2FuLmMgYi9kcml2ZXJzL2FjcGkvc2Nhbi5jCmluZGV4IGQ5ZDUzMWMuLjNmYWMwMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zY2FuLmMKKysrIGIvZHJpdmVycy9hY3BpL3NjYW4uYwpAQCAtNTksNyArNTksNyBAQAogCQkJY291bnQgPSBzbnByaW50ZigmbW9kYWxpYXNbbGVuXSwgc2l6ZSwgIiVzOiIsCiAJCQkJCSBjaWRfbGlzdC0+aWRbaV0udmFsdWUpOwogCQkJaWYgKGNvdW50IDwgMCB8fCBjb3VudCA+PSBzaXplKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJhY3BpOiAlcyBjaWRbJWldIGV4Y2VlZHMgZXZlbnQgYnVmZmVyIHNpemUiLAorCQkJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIiVzIGNpZFslaV0gZXhjZWVkcyBldmVudCBidWZmZXIgc2l6ZSIsCiAJCQkJICAgICAgIGFjcGlfZGV2LT5wbnAuZGV2aWNlX25hbWUsIGkpOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtNDUzLDcgKzQ1Myw3IEBACiAJZGV2aWNlLT5kZXYucmVsZWFzZSA9ICZhY3BpX2RldmljZV9yZWxlYXNlOwogCXJlc3VsdCA9IGRldmljZV9hZGQoJmRldmljZS0+ZGV2KTsKIAlpZihyZXN1bHQpIHsKLQkJcHJpbnRrKCJFcnJvciBhZGRpbmcgZGV2aWNlICVzIiwgZGV2aWNlLT5kZXYuYnVzX2lkKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXJyb3IgYWRkaW5nIGRldmljZSAlcyIsIGRldmljZS0+ZGV2LmJ1c19pZCk7CiAJCWdvdG8gZW5kOwogCX0KIApAQCAtOTQxLDYgKzk0MSwxNSBAQAogCXJldHVybiAtRU5PREVWOwogfQogCisvKgorICogYWNwaV9kb2NrX21hdGNoIC0gc2VlIGlmIGEgZGV2aWNlIGhhcyBhIF9EQ0sgbWV0aG9kCisgKi8KK3N0YXRpYyBpbnQgYWNwaV9kb2NrX21hdGNoKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoreworCWFjcGlfaGFuZGxlIHRtcDsKKwlyZXR1cm4gYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX0RDSyIsICZ0bXApOworfQorCiBzdGF0aWMgdm9pZCBhY3BpX2RldmljZV9zZXRfaWQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsCiAJCQkgICAgICAgc3RydWN0IGFjcGlfZGV2aWNlICpwYXJlbnQsIGFjcGlfaGFuZGxlIGhhbmRsZSwKIAkJCSAgICAgICBpbnQgdHlwZSkKQEAgLTk1MCwxMyArOTU5LDE0IEBACiAJY2hhciAqaGlkID0gTlVMTDsKIAljaGFyICp1aWQgPSBOVUxMOwogCXN0cnVjdCBhY3BpX2NvbXBhdGlibGVfaWRfbGlzdCAqY2lkX2xpc3QgPSBOVUxMOworCWNvbnN0IGNoYXIgKmNpZF9hZGQgPSBOVUxMOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgQUNQSV9CVVNfVFlQRV9ERVZJQ0U6CiAJCXN0YXR1cyA9IGFjcGlfZ2V0X29iamVjdF9pbmZvKGhhbmRsZSwgJmJ1ZmZlcik7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcHJpbnRrKCIlczogRXJyb3IgcmVhZGluZyBkZXZpY2UgaW5mb1xuIiwgX19GVU5DVElPTl9fKTsKKwkJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIiVzOiBFcnJvciByZWFkaW5nIGRldmljZSBpbmZvXG4iLCBfX0ZVTkNUSU9OX18pOwogCQkJcmV0dXJuOwogCQl9CiAKQEAgLTk3MiwxNSArOTgyLDE4IEBACiAJCQlkZXZpY2UtPmZsYWdzLmJ1c19hZGRyZXNzID0gMTsKIAkJfQogCi0JCWlmKCEoaW5mby0+dmFsaWQgJiAoQUNQSV9WQUxJRF9ISUQgfCBBQ1BJX1ZBTElEX0NJRCkpKXsKLQkJCXN0YXR1cyA9IGFjcGlfdmlkZW9fYnVzX21hdGNoKGRldmljZSk7Ci0JCQlpZihBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKLQkJCQloaWQgPSBBQ1BJX1ZJREVPX0hJRDsKKwkJLyogSWYgd2UgaGF2ZSBhIHZpZGVvL2JheS9kb2NrIGRldmljZSwgYWRkIG91ciBzZWxmZGVmaW5lZAorCQkgICBISUQgdG8gdGhlIENJRCBsaXN0LiBMaWtlIHRoYXQgdGhlIHZpZGVvL2JheS9kb2NrIGRyaXZlcnMKKwkJICAgd2lsbCBnZXQgYXV0b2xvYWRlZCBhbmQgdGhlIGRldmljZSBtaWdodCBzdGlsbCBtYXRjaAorCQkgICBhZ2FpbnN0IGFub3RoZXIgZHJpdmVyLgorCQkqLworCQlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfdmlkZW9fYnVzX21hdGNoKGRldmljZSkpKQorCQkJY2lkX2FkZCA9IEFDUElfVklERU9fSElEOworCQllbHNlIGlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9iYXlfbWF0Y2goZGV2aWNlKSkpCisJCQljaWRfYWRkID0gQUNQSV9CQVlfSElEOworCQllbHNlIGlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9kb2NrX21hdGNoKGRldmljZSkpKQorCQkJY2lkX2FkZCA9IEFDUElfRE9DS19ISUQ7CiAKLQkJCXN0YXR1cyA9IGFjcGlfYmF5X21hdGNoKGRldmljZSk7Ci0JCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCi0JCQkJaGlkID0gQUNQSV9CQVlfSElEOwotCQl9CiAJCWJyZWFrOwogCWNhc2UgQUNQSV9CVVNfVFlQRV9QT1dFUjoKIAkJaGlkID0gQUNQSV9QT1dFUl9ISUQ7CkBAIC0xMDIxLDEyICsxMDM0LDQ1IEBACiAJCXN0cmNweShkZXZpY2UtPnBucC51bmlxdWVfaWQsIHVpZCk7CiAJCWRldmljZS0+ZmxhZ3MudW5pcXVlX2lkID0gMTsKIAl9Ci0JaWYgKGNpZF9saXN0KSB7Ci0JCWRldmljZS0+cG5wLmNpZF9saXN0ID0ga21hbGxvYyhjaWRfbGlzdC0+c2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChkZXZpY2UtPnBucC5jaWRfbGlzdCkKLQkJCW1lbWNweShkZXZpY2UtPnBucC5jaWRfbGlzdCwgY2lkX2xpc3QsIGNpZF9saXN0LT5zaXplKTsKLQkJZWxzZQotCQkJcHJpbnRrKEtFUk5fRVJSICJNZW1vcnkgYWxsb2NhdGlvbiBlcnJvclxuIik7CisJaWYgKGNpZF9saXN0IHx8IGNpZF9hZGQpIHsKKwkJc3RydWN0ICBhY3BpX2NvbXBhdGlibGVfaWRfbGlzdCAqbGlzdDsKKwkJaW50IHNpemUgPSAwOworCQlpbnQgY291bnQgPSAwOworCisJCWlmIChjaWRfbGlzdCkgeworCQkJc2l6ZSA9IGNpZF9saXN0LT5zaXplOworCQl9IGVsc2UgaWYgKGNpZF9hZGQpIHsKKwkJCXNpemUgPSBzaXplb2Yoc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0KTsKKwkJCWNpZF9saXN0ID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoKGFjcGlfc2l6ZSkgc2l6ZSk7CisJCQlpZiAoIWNpZF9saXN0KSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJNZW1vcnkgYWxsb2NhdGlvbiBlcnJvclxuIik7CisJCQkJa2ZyZWUoYnVmZmVyLnBvaW50ZXIpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSB7CisJCQkJY2lkX2xpc3QtPmNvdW50ID0gMDsKKwkJCQljaWRfbGlzdC0+c2l6ZSA9IHNpemU7CisJCQl9CisJCX0KKwkJaWYgKGNpZF9hZGQpCisJCQlzaXplICs9IHNpemVvZihzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkKTsKKwkJbGlzdCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisKKwkJaWYgKGxpc3QpIHsKKwkJCWlmIChjaWRfbGlzdCkgeworCQkJCW1lbWNweShsaXN0LCBjaWRfbGlzdCwgY2lkX2xpc3QtPnNpemUpOworCQkJCWNvdW50ID0gY2lkX2xpc3QtPmNvdW50OworCQkJfQorCQkJaWYgKGNpZF9hZGQpIHsKKwkJCQlzdHJuY3B5KGxpc3QtPmlkW2NvdW50XS52YWx1ZSwgY2lkX2FkZCwKKwkJCQkJQUNQSV9NQVhfQ0lEX0xFTkdUSCk7CisJCQkJY291bnQrKzsKKwkJCQlkZXZpY2UtPmZsYWdzLmNvbXBhdGlibGVfaWRzID0gMTsKKwkJCX0KKwkJCWxpc3QtPnNpemUgPSBzaXplOworCQkJbGlzdC0+Y291bnQgPSBjb3VudDsKKwkJCWRldmljZS0+cG5wLmNpZF9saXN0ID0gbGlzdDsKKwkJfSBlbHNlCisJCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJNZW1vcnkgYWxsb2NhdGlvbiBlcnJvclxuIik7CiAJfQogCiAJa2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwpAQCAtMTA1MCw3ICsxMDk2LDcgQEAKIAkJCQkJICBhY3BpX2J1c19kYXRhX2hhbmRsZXIsIGRldmljZSk7CiAKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlwcmludGsoIkVycm9yIGF0dGFjaGluZyBkZXZpY2UgZGF0YVxuIik7CisJCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJFcnJvciBhdHRhY2hpbmcgZGV2aWNlIGRhdGFcbiIpOwogCQkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJfQogCX0KQEAgLTEwODEsNiArMTEyNywyMCBAQAogfQogCiBzdGF0aWMgaW50CithY3BpX2lzX2NoaWxkX2RldmljZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwKKwkJCWludCAoKm1hdGNoZXIpKHN0cnVjdCBhY3BpX2RldmljZSAqKSkKK3sKKwlpbnQgcmVzdWx0ID0gLUVOT0RFVjsKKworCWRvIHsKKwkJaWYgKEFDUElfU1VDQ0VTUyhtYXRjaGVyKGRldmljZSkpKQorCQkJcmV0dXJuIEFFX09LOworCX0gd2hpbGUgKChkZXZpY2UgPSBkZXZpY2UtPnBhcmVudCkpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludAogYWNwaV9hZGRfc2luZ2xlX29iamVjdChzdHJ1Y3QgYWNwaV9kZXZpY2UgKipjaGlsZCwKIAkJICAgICAgIHN0cnVjdCBhY3BpX2RldmljZSAqcGFyZW50LCBhY3BpX2hhbmRsZSBoYW5kbGUsIGludCB0eXBlLAogCQkJc3RydWN0IGFjcGlfYnVzX29wcyAqb3BzKQpAQCAtMTEzMSwxMCArMTE5MSwyMCBAQAogCWNhc2UgQUNQSV9CVVNfVFlQRV9QUk9DRVNTT1I6CiAJY2FzZSBBQ1BJX0JVU19UWVBFX0RFVklDRToKIAkJcmVzdWx0ID0gYWNwaV9idXNfZ2V0X3N0YXR1cyhkZXZpY2UpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHJlc3VsdCkgfHwgIWRldmljZS0+c3RhdHVzLnByZXNlbnQpIHsKLQkJCXJlc3VsdCA9IC1FTk9FTlQ7CisJCWlmIChBQ1BJX0ZBSUxVUkUocmVzdWx0KSkgeworCQkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJCWdvdG8gZW5kOwogCQl9CisJCWlmICghZGV2aWNlLT5zdGF0dXMucHJlc2VudCkgeworCQkJLyogQmF5IGFuZCBkb2NrIHNob3VsZCBiZSBoYW5kbGVkIGV2ZW4gaWYgYWJzZW50ICovCisJCQlpZiAoIUFDUElfU1VDQ0VTUygKKwkJCSAgICAgYWNwaV9pc19jaGlsZF9kZXZpY2UoZGV2aWNlLCBhY3BpX2JheV9tYXRjaCkpICYmCisJCQkgICAgIUFDUElfU1VDQ0VTUygKKwkJCSAgICAgYWNwaV9pc19jaGlsZF9kZXZpY2UoZGV2aWNlLCBhY3BpX2RvY2tfbWF0Y2gpKSkgeworCQkJCQlyZXN1bHQgPSAtRU5PREVWOworCQkJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQogCQlicmVhazsKIAlkZWZhdWx0OgogCQlTVFJVQ1RfVE9fSU5UKGRldmljZS0+c3RhdHVzKSA9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2xlZXAvbWFpbi5jIGIvZHJpdmVycy9hY3BpL3NsZWVwL21haW4uYwppbmRleCA0ODVkZTEzLi4yOTNhMWNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2xlZXAvbWFpbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9zbGVlcC9tYWluLmMKQEAgLTE3MCw3ICsxNzAsNyBAQAogCS8qIFJlcHJvZ3JhbSBjb250cm9sIHJlZ2lzdGVycyBhbmQgZXhlY3V0ZSBfQkZTICovCiAJYWNwaV9sZWF2ZV9zbGVlcF9zdGF0ZV9wcmVwKGFjcGlfc3RhdGUpOwogCi0JLyogQUNQSSAzLjAgc3BlY3MgKFA2Mikgc2F5cyB0aGF0IGl0J3MgdGhlIHJlc3BvbnNhYmlsdHkKKwkvKiBBQ1BJIDMuMCBzcGVjcyAoUDYyKSBzYXlzIHRoYXQgaXQncyB0aGUgcmVzcG9uc2liaWxpdHkKIAkgKiBvZiB0aGUgT1NQTSB0byBjbGVhciB0aGUgc3RhdHVzIGJpdCBbIGltcGx5aW5nIHRoYXQgdGhlCiAJICogUE9XRVJfQlVUVE9OIGV2ZW50IHNob3VsZCBub3QgcmVhY2ggdXNlcnNwYWNlIF0KIAkgKi8KQEAgLTQ3MiwxMSArNDcyLDIwIEBACiAJaWYgKGFjcGlfdGFyZ2V0X3NsZWVwX3N0YXRlID09IEFDUElfU1RBVEVfUzAgfHwKIAkgICAgKHdha2UgJiYgYWRldi0+d2FrZXVwLnN0YXRlLmVuYWJsZWQgJiYKIAkgICAgIGFkZXYtPndha2V1cC5zbGVlcF9zdGF0ZSA8PSBhY3BpX3RhcmdldF9zbGVlcF9zdGF0ZSkpIHsKKwkJYWNwaV9zdGF0dXMgc3RhdHVzOworCiAJCWFjcGlfbWV0aG9kWzNdID0gJ1cnOwotCQlhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCBhY3BpX21ldGhvZCwgTlVMTCwgJmRfbWF4KTsKLQkJLyogU2FuaXR5IGNoZWNrICovCi0JCWlmIChkX21heCA8IGRfbWluKQorCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCBhY3BpX21ldGhvZCwgTlVMTCwKKwkJCQkJCSZkX21heCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJZF9tYXggPSBkX21pbjsKKwkJfSBlbHNlIGlmIChkX21heCA8IGRfbWluKSB7CisJCQkvKiBXYXJuIHRoZSB1c2VyIG9mIHRoZSBicm9rZW4gRFNEVCAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQUNQSTogV3JvbmcgdmFsdWUgZnJvbSAlc1xuIiwKKwkJCQlhY3BpX21ldGhvZCk7CisJCQkvKiBTYW5pdGl6ZSBpdCAqLwogCQkJZF9taW4gPSBkX21heDsKKwkJfQogCX0KIAogCWlmIChkX21pbl9wKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NsZWVwL3Byb2MuYyBiL2RyaXZlcnMvYWNwaS9zbGVlcC9wcm9jLmMKaW5kZXggMTUzODM1NS4uZjhkZjUyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NsZWVwL3Byb2MuYworKysgYi9kcml2ZXJzL2FjcGkvc2xlZXAvcHJvYy5jCkBAIC0xNzgsNiArMTc4LDkgQEAKIAkgKiBUcnkgdG8gZmluZCBkZWxpbWV0ZXIsIG9ubHkgdG8gaW5zZXJ0IG51bGwuICBUaGUgZW5kIG9mIHRoZQogCSAqIHN0cmluZyB3b24ndCBoYXZlIG9uZSwgYnV0IGlzIHN0aWxsIHZhbGlkLgogCSAqLworCWlmICgqcCA9PSBOVUxMKQorCQlyZXR1cm4gcmVzdWx0OworCiAJbmV4dCA9IHN0cnBicmsoKnAsICItIDoiKTsKIAlpZiAobmV4dCkKIAkJKm5leHQrKyA9ICdcMCc7CkBAIC0xOTAsNiArMTkzLDggQEAKIAogCWlmIChuZXh0KQogCQkqcCA9IG5leHQ7CisJZWxzZQorCQkqcCA9IE5VTEw7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMjUxLDI3ICsyNTYsNiBAQAogCWlmICgocmVzdWx0ID0gZ2V0X2RhdGVfZmllbGQoJnAsICZzZWMpKSkKIAkJZ290byBlbmQ7CiAKLQlpZiAoc2VjID4gNTkpIHsKLQkJbWluICs9IDE7Ci0JCXNlYyAtPSA2MDsKLQl9Ci0JaWYgKG1pbiA+IDU5KSB7Ci0JCWhyICs9IDE7Ci0JCW1pbiAtPSA2MDsKLQl9Ci0JaWYgKGhyID4gMjMpIHsKLQkJZGF5ICs9IDE7Ci0JCWhyIC09IDI0OwotCX0KLQlpZiAoZGF5ID4gMzEpIHsKLQkJbW8gKz0gMTsKLQkJZGF5IC09IDMxOwotCX0KLQlpZiAobW8gPiAxMikgewotCQl5ciArPSAxOwotCQltbyAtPSAxMjsKLQl9Ci0KIAlzcGluX2xvY2tfaXJxKCZydGNfbG9jayk7CiAKIAlydGNfY29udHJvbCA9IENNT1NfUkVBRChSVENfQ09OVFJPTCk7CkBAIC0yODgsMjQgKzI3MiwyNCBAQAogCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOwogCiAJaWYgKHNlYyA+IDU5KSB7Ci0JCW1pbisrOwotCQlzZWMgLT0gNjA7CisJCW1pbiArPSBzZWMvNjA7CisJCXNlYyA9IHNlYyU2MDsKIAl9CiAJaWYgKG1pbiA+IDU5KSB7Ci0JCWhyKys7Ci0JCW1pbiAtPSA2MDsKKwkJaHIgKz0gbWluLzYwOworCQltaW4gPSBtaW4lNjA7CiAJfQogCWlmIChociA+IDIzKSB7Ci0JCWRheSsrOwotCQlociAtPSAyNDsKKwkJZGF5ICs9IGhyLzI0OworCQlociA9IGhyJTI0OwogCX0KIAlpZiAoZGF5ID4gMzEpIHsKLQkJbW8rKzsKLQkJZGF5IC09IDMxOworCQltbyArPSBkYXkvMzI7CisJCWRheSA9IGRheSUzMjsKIAl9CiAJaWYgKG1vID4gMTIpIHsKLQkJeXIrKzsKLQkJbW8gLT0gMTI7CisJCXlyICs9IG1vLzEzOworCQltbyA9IG1vJTEzOwogCX0KIAogCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zeXN0ZW0uYyBiL2RyaXZlcnMvYWNwaS9zeXN0ZW0uYwppbmRleCA1ZmZlMGVhLi41NWNmNGMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc3lzdGVtLmMKKysrIGIvZHJpdmVycy9hY3BpL3N5c3RlbS5jCkBAIC00MCw2ICs0MCw4IEBACiAjZGVmaW5lIEFDUElfU1lTVEVNX0NMQVNTCQkic3lzdGVtIgogI2RlZmluZSBBQ1BJX1NZU1RFTV9ERVZJQ0VfTkFNRQkJIlN5c3RlbSIKIAordTMyIGFjcGlfaXJxX2hhbmRsZWQ7CisKIC8qCiAgKiBNYWtlIEFDUElDQSB2ZXJzaW9uIHdvcmsgYXMgbW9kdWxlIHBhcmFtCiAgKi8KQEAgLTE2Niw2ICsxNjgsMjEyIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBEZXRhaWxlZCBBQ1BJIElSUSBjb3VudGVycyBpbiAvc3lzL2Zpcm13YXJlL2FjcGkvaW50ZXJydXB0cy8KKyAqIFNlZSBEb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWZpcm13YXJlLWFjcGkKKyAqLworCisjZGVmaW5lIENPVU5UX0dQRSAwCisjZGVmaW5lIENPVU5UX1NDSSAxCS8qIGFjcGlfaXJxX2hhbmRsZWQgKi8KKyNkZWZpbmUgQ09VTlRfRVJST1IgMgkvKiBvdGhlciAqLworI2RlZmluZSBOVU1fQ09VTlRFUlNfRVhUUkEgMworCitzdGF0aWMgdTMyICphbGxfY291bnRlcnM7CitzdGF0aWMgdTMyIG51bV9ncGVzOworc3RhdGljIHUzMiBudW1fY291bnRlcnM7CitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqKmFsbF9hdHRyczsKK3N0YXRpYyB1MzIgYWNwaV9ncGVfY291bnQ7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGludGVycnVwdF9zdGF0c19hdHRyX2dyb3VwID0geworCS5uYW1lID0gImludGVycnVwdHMiLAorfTsKK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmNvdW50ZXJfYXR0cnM7CisKK3N0YXRpYyBpbnQgY291bnRfbnVtX2dwZXModm9pZCkKK3sKKwlpbnQgY291bnQgPSAwOworCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfaW5mbzsKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrOworCWFjcGlfY3B1X2ZsYWdzIGZsYWdzOworCisJZmxhZ3MgPSBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2dibF9ncGVfbG9jayk7CisKKwlncGVfeHJ1cHRfaW5mbyA9IGFjcGlfZ2JsX2dwZV94cnVwdF9saXN0X2hlYWQ7CisJd2hpbGUgKGdwZV94cnVwdF9pbmZvKSB7CisJCWdwZV9ibG9jayA9IGdwZV94cnVwdF9pbmZvLT5ncGVfYmxvY2tfbGlzdF9oZWFkOworCQl3aGlsZSAoZ3BlX2Jsb2NrKSB7CisJCQljb3VudCArPSBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50ICoKKwkJCSAgICBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSDsKKwkJCWdwZV9ibG9jayA9IGdwZV9ibG9jay0+bmV4dDsKKwkJfQorCQlncGVfeHJ1cHRfaW5mbyA9IGdwZV94cnVwdF9pbmZvLT5uZXh0OworCX0KKwlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2dibF9ncGVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdm9pZCBkZWxldGVfZ3BlX2F0dHJfYXJyYXkodm9pZCkKK3sKKwl1MzIgKnRtcCA9IGFsbF9jb3VudGVyczsKKworCWFsbF9jb3VudGVycyA9IE5VTEw7CisJa2ZyZWUodG1wKTsKKworCWlmIChjb3VudGVyX2F0dHJzKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBudW1fZ3BlczsgaSsrKQorCQkJa2ZyZWUoY291bnRlcl9hdHRyc1tpXS5hdHRyLm5hbWUpOworCisJCWtmcmVlKGNvdW50ZXJfYXR0cnMpOworCX0KKwlrZnJlZShhbGxfYXR0cnMpOworCisJcmV0dXJuOworfQorCit2b2lkIGFjcGlfb3NfZ3BlX2NvdW50KHUzMiBncGVfbnVtYmVyKQoreworCWFjcGlfZ3BlX2NvdW50Kys7CisKKwlpZiAoIWFsbF9jb3VudGVycykKKwkJcmV0dXJuOworCisJaWYgKGdwZV9udW1iZXIgPCBudW1fZ3BlcykKKwkJYWxsX2NvdW50ZXJzW2dwZV9udW1iZXJdKys7CisJZWxzZQorCQlhbGxfY291bnRlcnNbbnVtX2dwZXMgKyBBQ1BJX05VTV9GSVhFRF9FVkVOVFMgKyBDT1VOVF9FUlJPUl0rKzsKKworCXJldHVybjsKK30KKwordm9pZCBhY3BpX29zX2ZpeGVkX2V2ZW50X2NvdW50KHUzMiBldmVudF9udW1iZXIpCit7CisJaWYgKCFhbGxfY291bnRlcnMpCisJCXJldHVybjsKKworCWlmIChldmVudF9udW1iZXIgPCBBQ1BJX05VTV9GSVhFRF9FVkVOVFMpCisJCWFsbF9jb3VudGVyc1tudW1fZ3BlcyArIGV2ZW50X251bWJlcl0rKzsKKwllbHNlCisJCWFsbF9jb3VudGVyc1tudW1fZ3BlcyArIEFDUElfTlVNX0ZJWEVEX0VWRU5UUyArIENPVU5UX0VSUk9SXSsrOworCisJcmV0dXJuOworfQorCitzdGF0aWMgc3NpemVfdCBjb3VudGVyX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJYWxsX2NvdW50ZXJzW251bV9ncGVzICsgQUNQSV9OVU1fRklYRURfRVZFTlRTICsgQ09VTlRfU0NJXSA9CisJCWFjcGlfaXJxX2hhbmRsZWQ7CisJYWxsX2NvdW50ZXJzW251bV9ncGVzICsgQUNQSV9OVU1fRklYRURfRVZFTlRTICsgQ09VTlRfR1BFXSA9CisJCWFjcGlfZ3BlX2NvdW50OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGFsbF9jb3VudGVyc1thdHRyIC0gY291bnRlcl9hdHRyc10pOworfQorCisvKgorICogY291bnRlcl9zZXQoKSBzZXRzIHRoZSBzcGVjaWZpZWQgY291bnRlci4KKyAqIHNldHRpbmcgdGhlIHRvdGFsICJzY2kiIGZpbGUgdG8gYW55IHZhbHVlIGNsZWFycyBhbGwgY291bnRlcnMuCisgKi8KK3N0YXRpYyBzc2l6ZV90IGNvdW50ZXJfc2V0KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCXN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgaW5kZXggPSBhdHRyIC0gY291bnRlcl9hdHRyczsKKworCWlmIChpbmRleCA9PSBudW1fZ3BlcyArIEFDUElfTlVNX0ZJWEVEX0VWRU5UUyArIENPVU5UX1NDSSkgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9jb3VudGVyczsgKytpKQorCQkJYWxsX2NvdW50ZXJzW2ldID0gMDsKKwkJYWNwaV9ncGVfY291bnQgPSAwOworCQlhY3BpX2lycV9oYW5kbGVkID0gMDsKKworCX0gZWxzZQorCQlhbGxfY291bnRlcnNbaW5kZXhdID0gc3RydG91bChidWYsIE5VTEwsIDApOworCisJcmV0dXJuIHNpemU7Cit9CisKK3ZvaWQgYWNwaV9pcnFfc3RhdHNfaW5pdCh2b2lkKQoreworCWludCBpOworCisJaWYgKGFsbF9jb3VudGVycykKKwkJcmV0dXJuOworCisJbnVtX2dwZXMgPSBjb3VudF9udW1fZ3BlcygpOworCW51bV9jb3VudGVycyA9IG51bV9ncGVzICsgQUNQSV9OVU1fRklYRURfRVZFTlRTICsgTlVNX0NPVU5URVJTX0VYVFJBOworCisJYWxsX2F0dHJzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGF0dHJpYnV0ZSAqKSAqIChudW1fY291bnRlcnMgKyAxKSwKKwkJCUdGUF9LRVJORUwpOworCWlmIChhbGxfYXR0cnMgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJYWxsX2NvdW50ZXJzID0ga3phbGxvYyhzaXplb2YodTMyKSAqIChudW1fY291bnRlcnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoYWxsX2NvdW50ZXJzID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKworCWNvdW50ZXJfYXR0cnMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga29ial9hdHRyaWJ1dGUpICogKG51bV9jb3VudGVycyksCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoY291bnRlcl9hdHRycyA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvdW50ZXJzOyArK2kpIHsKKwkJY2hhciBidWZmZXJbMTBdOworCQljaGFyICpuYW1lOworCisJCWlmIChpIDwgbnVtX2dwZXMpCisJCQlzcHJpbnRmKGJ1ZmZlciwgImdwZSUwMlgiLCBpKTsKKwkJZWxzZSBpZiAoaSA9PSBudW1fZ3BlcyArIEFDUElfRVZFTlRfUE1USU1FUikKKwkJCXNwcmludGYoYnVmZmVyLCAiZmZfcG10aW1lciIpOworCQllbHNlIGlmIChpID09IG51bV9ncGVzICsgQUNQSV9FVkVOVF9HTE9CQUwpCisJCQlzcHJpbnRmKGJ1ZmZlciwgImZmX2dibF9sb2NrIik7CisJCWVsc2UgaWYgKGkgPT0gbnVtX2dwZXMgKyBBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTikKKwkJCXNwcmludGYoYnVmZmVyLCAiZmZfcHdyX2J0biIpOworCQllbHNlIGlmIChpID09IG51bV9ncGVzICsgQUNQSV9FVkVOVF9TTEVFUF9CVVRUT04pCisJCQlzcHJpbnRmKGJ1ZmZlciwgImZmX3NscF9idG4iKTsKKwkJZWxzZSBpZiAoaSA9PSBudW1fZ3BlcyArIEFDUElfRVZFTlRfUlRDKQorCQkJc3ByaW50ZihidWZmZXIsICJmZl9ydF9jbGsiKTsKKwkJZWxzZSBpZiAoaSA9PSBudW1fZ3BlcyArIEFDUElfTlVNX0ZJWEVEX0VWRU5UUyArIENPVU5UX0dQRSkKKwkJCXNwcmludGYoYnVmZmVyLCAiZ3BlX2FsbCIpOworCQllbHNlIGlmIChpID09IG51bV9ncGVzICsgQUNQSV9OVU1fRklYRURfRVZFTlRTICsgQ09VTlRfU0NJKQorCQkJc3ByaW50ZihidWZmZXIsICJzY2kiKTsKKwkJZWxzZSBpZiAoaSA9PSBudW1fZ3BlcyArIEFDUElfTlVNX0ZJWEVEX0VWRU5UUyArIENPVU5UX0VSUk9SKQorCQkJc3ByaW50ZihidWZmZXIsICJlcnJvciIpOworCQllbHNlCisJCQlzcHJpbnRmKGJ1ZmZlciwgImJ1ZyUwMlgiLCBpKTsKKworCQluYW1lID0ga3phbGxvYyhzdHJsZW4oYnVmZmVyKSArIDEsIEdGUF9LRVJORUwpOworCQlpZiAobmFtZSA9PSBOVUxMKQorCQkJZ290byBmYWlsOworCQlzdHJuY3B5KG5hbWUsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikgKyAxKTsKKworCQljb3VudGVyX2F0dHJzW2ldLmF0dHIubmFtZSA9IG5hbWU7CisJCWNvdW50ZXJfYXR0cnNbaV0uYXR0ci5tb2RlID0gMDY0NDsKKwkJY291bnRlcl9hdHRyc1tpXS5zaG93ID0gY291bnRlcl9zaG93OworCQljb3VudGVyX2F0dHJzW2ldLnN0b3JlID0gY291bnRlcl9zZXQ7CisKKwkJYWxsX2F0dHJzW2ldID0gJmNvdW50ZXJfYXR0cnNbaV0uYXR0cjsKKwl9CisKKwlpbnRlcnJ1cHRfc3RhdHNfYXR0cl9ncm91cC5hdHRycyA9IGFsbF9hdHRyczsKKwlpZiAoIXN5c2ZzX2NyZWF0ZV9ncm91cChhY3BpX2tvYmosICZpbnRlcnJ1cHRfc3RhdHNfYXR0cl9ncm91cCkpCisJCXJldHVybjsKKworZmFpbDoKKwlkZWxldGVfZ3BlX2F0dHJfYXJyYXkoKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpbnRlcnJ1cHRfc3RhdHNfZXhpdCh2b2lkKQoreworCXN5c2ZzX3JlbW92ZV9ncm91cChhY3BpX2tvYmosICZpbnRlcnJ1cHRfc3RhdHNfYXR0cl9ncm91cCk7CisKKwlkZWxldGVfZ3BlX2F0dHJfYXJyYXkoKTsKKworCXJldHVybjsKK30KKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTIEludGVyZmFjZSAoL3Byb2MpCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy9NYWtlZmlsZSBiL2RyaXZlcnMvYWNwaS90YWJsZXMvTWFrZWZpbGUKaW5kZXggMGE3ZDdhZi4uNzM4NWVmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL01ha2VmaWxlCkBAIC0yLDYgKzIsNiBAQAogIyBNYWtlZmlsZSBmb3IgYWxsIExpbnV4IEFDUEkgaW50ZXJwcmV0ZXIgc3ViZGlyZWN0b3JpZXMKICMKIAotb2JqLXkgOj0gdGJ4ZmFjZS5vIHRiaW5zdGFsLm8gIHRidXRpbHMubyB0YmZpbmQubyB0YmZhZHQubworb2JqLXkgOj0gdGJ4ZmFjZS5vIHRiaW5zdGFsLm8gdGJ1dGlscy5vIHRiZmluZC5vIHRiZmFkdC5vIHRieGZyb290Lm8KIAogRVhUUkFfQ0ZMQUdTICs9ICQoQUNQSV9DRkxBR1MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZyb290LmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZyb290LmMKaW5kZXggY2Y4ZmE1MS4uOWVjYjRiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90Ynhmcm9vdC5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZnJvb3QuYwpAQCAtMTAwLDcgKzEwMCw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRlVOQ1RJT046ICAgIGFjcGlfdGJfZmluZF9yc2RwCisgKiBGVU5DVElPTjogICAgYWNwaV9maW5kX3Jvb3RfcG9pbnRlcgogICoKICAqIFBBUkFNRVRFUlM6ICB0YWJsZV9hZGRyZXNzICAgICAgICAgICAtIFdoZXJlIHRoZSB0YWJsZSBwb2ludGVyIGlzIHJldHVybmVkCiAgKgpAQCAtMjE5LDggKzIxOSw2IEBACiAJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9GT1VORCk7CiB9CiAKLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX2ZpbmRfcm9vdF9wb2ludGVyKQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3NjYW5fbWVtb3J5X2Zvcl9yc2RwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGhlcm1hbC5jIGIvZHJpdmVycy9hY3BpL3RoZXJtYWwuYwppbmRleCA1Zjc5YjQ0Li44ZDRiNzliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGhlcm1hbC5jCisrKyBiL2RyaXZlcnMvYWNwaS90aGVybWFsLmMKQEAgLTQzLDcgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC90aGVybWFsLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKQEAgLTY1LDkgKzY1LDYgQEAKICNkZWZpbmUgQUNQSV9USEVSTUFMX01BWF9BQ1RJVkUJMTAKICNkZWZpbmUgQUNQSV9USEVSTUFMX01BWF9MSU1JVF9TVFJfTEVOIDY1CiAKLSNkZWZpbmUgS0VMVklOX1RPX0NFTFNJVVModCkgICAgKGxvbmcpKCgobG9uZyl0LTI3MzI+PTApID8gKChsb25nKXQtMjczMis1KS8xMCA6ICgobG9uZyl0LTI3MzItNSkvMTApCi0jZGVmaW5lIENFTFNJVVNfVE9fS0VMVklOKHQpCSgodCsyNzMpKjEwKQotCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfVEhFUk1BTF9DT01QT05FTlQKIEFDUElfTU9EVUxFX05BTUUoInRoZXJtYWwiKTsKIApAQCAtMTk1LDYgKzE5Miw4IEBACiAJc3RydWN0IGFjcGlfdGhlcm1hbF90cmlwcyB0cmlwczsKIAlzdHJ1Y3QgYWNwaV9oYW5kbGVfbGlzdCBkZXZpY2VzOwogCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCXN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0aGVybWFsX3pvbmU7CisJaW50IHR6X2VuYWJsZWQ7CiAJc3RydWN0IG11dGV4IGxvY2s7CiB9OwogCkBAIC0zMjEsMTc4ICszMjAsMjI2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWNwaV90aGVybWFsX2dldF90cmlwX3BvaW50cyhzdHJ1Y3QgYWNwaV90aGVybWFsICp0eikKKyNkZWZpbmUgQUNQSV9UUklQU19DUklUSUNBTAkweDAxCisjZGVmaW5lIEFDUElfVFJJUFNfSE9UCQkweDAyCisjZGVmaW5lIEFDUElfVFJJUFNfUEFTU0lWRQkweDA0CisjZGVmaW5lIEFDUElfVFJJUFNfQUNUSVZFCTB4MDgKKyNkZWZpbmUgQUNQSV9UUklQU19ERVZJQ0VTCTB4MTAKKworI2RlZmluZSBBQ1BJX1RSSVBTX1JFRlJFU0hfVEhSRVNIT0xEUwkoQUNQSV9UUklQU19QQVNTSVZFIHwgQUNQSV9UUklQU19BQ1RJVkUpCisjZGVmaW5lIEFDUElfVFJJUFNfUkVGUkVTSF9ERVZJQ0VTCUFDUElfVFJJUFNfREVWSUNFUworCisjZGVmaW5lIEFDUElfVFJJUFNfSU5JVCAgICAgIChBQ1BJX1RSSVBTX0NSSVRJQ0FMIHwgQUNQSV9UUklQU19IT1QgfAlcCisJCQkgICAgICBBQ1BJX1RSSVBTX1BBU1NJVkUgfCBBQ1BJX1RSSVBTX0FDVElWRSB8CVwKKwkJCSAgICAgIEFDUElfVFJJUFNfREVWSUNFUykKKworLyoKKyAqIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biBvdXQgaW4gdHdvIGNhc2VzOgorICogMS5BbiBpbnZhbGlkIHRyaXAgcG9pbnQgYmVjb21lcyBpbnZhbGlkIG9yIGEgdmFsaWQgdHJpcCBwb2ludCBiZWNvbWVzIGludmFsaWQKKyAqICAgd2hlbiByZS1ldmFsdWF0aW5nIHRoZSBBTUwgY29kZS4KKyAqIDIuVE9ETzogRGV2aWNlcyBsaXN0ZWQgaW4gX1BTTCwgX0FMeCwgX1RaRCBtYXkgY2hhbmdlLgorICogICBXZSBuZWVkIHRvIHJlLWJpbmQgdGhlIGNvb2xpbmcgZGV2aWNlcyBvZiBhIHRoZXJtYWwgem9uZSB3aGVuIHRoaXMgb2NjdXJzLgorICovCisjZGVmaW5lIEFDUElfVEhFUk1BTF9UUklQU19FWENFUFRJT04oZmxhZ3MsIHN0cikJXAorZG8gewlcCisJaWYgKGZsYWdzICE9IEFDUElfVFJJUFNfSU5JVCkJXAorCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgQUVfRVJST1IsCVwKKwkJIkFDUEkgdGhlcm1hbCB0cmlwIHBvaW50ICVzIGNoYW5nZWRcbiIJXAorCQkiUGxlYXNlIHNlbmQgYWNwaWR1bXAgdG8gbGludXgtYWNwaUB2Z2VyLmtlcm5lbC5vcmdcbiIsIHN0cikpOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgaW50IGFjcGlfdGhlcm1hbF90cmlwc191cGRhdGUoc3RydWN0IGFjcGlfdGhlcm1hbCAqdHosIGludCBmbGFnKQogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCWludCBpID0gMDsKLQotCi0JaWYgKCF0eikKLQkJcmV0dXJuIC1FSU5WQUw7CisJc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QgZGV2aWNlczsKKwlpbnQgdmFsaWQgPSAwOworCWludCBpOwogCiAJLyogQ3JpdGljYWwgU2h1dGRvd24gKHJlcXVpcmVkKSAqLwotCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKHR6LT5kZXZpY2UtPmhhbmRsZSwgIl9DUlQiLCBOVUxMLAotCQkJCSAgICAgICAmdHotPnRyaXBzLmNyaXRpY2FsLnRlbXBlcmF0dXJlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJdHotPnRyaXBzLmNyaXRpY2FsLmZsYWdzLnZhbGlkID0gMDsKLQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywgIk5vIGNyaXRpY2FsIHRocmVzaG9sZCIpKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfSBlbHNlIHsKLQkJdHotPnRyaXBzLmNyaXRpY2FsLmZsYWdzLnZhbGlkID0gMTsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJCSAgIkZvdW5kIGNyaXRpY2FsIHRocmVzaG9sZCBbJWx1XVxuIiwKLQkJCQkgIHR6LT50cmlwcy5jcml0aWNhbC50ZW1wZXJhdHVyZSkpOwotCX0KLQotCWlmICh0ei0+dHJpcHMuY3JpdGljYWwuZmxhZ3MudmFsaWQgPT0gMSkgewotCQlpZiAoY3J0ID09IC0xKSB7CisJaWYgKGZsYWcgJiBBQ1BJX1RSSVBTX0NSSVRJQ0FMKSB7CisJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcih0ei0+ZGV2aWNlLT5oYW5kbGUsCisJCQkJIl9DUlQiLCBOVUxMLCAmdHotPnRyaXBzLmNyaXRpY2FsLnRlbXBlcmF0dXJlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQl0ei0+dHJpcHMuY3JpdGljYWwuZmxhZ3MudmFsaWQgPSAwOwotCQl9IGVsc2UgaWYgKGNydCA+IDApIHsKLQkJCXVuc2lnbmVkIGxvbmcgY3J0X2sgPSBDRUxTSVVTX1RPX0tFTFZJTihjcnQpOwotCi0JCQkvKgotCQkJICogQWxsb3cgb3ZlcnJpZGUgdG8gbG93ZXIgY3JpdGljYWwgdGhyZXNob2xkCi0JCQkgKi8KLQkJCWlmIChjcnRfayA8IHR6LT50cmlwcy5jcml0aWNhbC50ZW1wZXJhdHVyZSkKLQkJCQl0ei0+dHJpcHMuY3JpdGljYWwudGVtcGVyYXR1cmUgPSBjcnRfazsKKwkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCisJCQkJCSJObyBjcml0aWNhbCB0aHJlc2hvbGQiKSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfSBlbHNlIHsKKwkJCXR6LT50cmlwcy5jcml0aWNhbC5mbGFncy52YWxpZCA9IDE7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJCSJGb3VuZCBjcml0aWNhbCB0aHJlc2hvbGQgWyVsdV1cbiIsCisJCQkJCXR6LT50cmlwcy5jcml0aWNhbC50ZW1wZXJhdHVyZSkpOworCQl9CisJCWlmICh0ei0+dHJpcHMuY3JpdGljYWwuZmxhZ3MudmFsaWQgPT0gMSkgeworCQkJaWYgKGNydCA9PSAtMSkgeworCQkJCXR6LT50cmlwcy5jcml0aWNhbC5mbGFncy52YWxpZCA9IDA7CisJCQl9IGVsc2UgaWYgKGNydCA+IDApIHsKKwkJCQl1bnNpZ25lZCBsb25nIGNydF9rID0gQ0VMU0lVU19UT19LRUxWSU4oY3J0KTsKKwkJCQkvKgorCQkJCSAqIEFsbG93IG92ZXJyaWRlIHRvIGxvd2VyIGNyaXRpY2FsIHRocmVzaG9sZAorCQkJCSAqLworCQkJCWlmIChjcnRfayA8IHR6LT50cmlwcy5jcml0aWNhbC50ZW1wZXJhdHVyZSkKKwkJCQkJdHotPnRyaXBzLmNyaXRpY2FsLnRlbXBlcmF0dXJlID0gY3J0X2s7CisJCQl9CiAJCX0KIAl9CiAKIAkvKiBDcml0aWNhbCBTbGVlcCAob3B0aW9uYWwpICovCi0KLQlzdGF0dXMgPQotCSAgICBhY3BpX2V2YWx1YXRlX2ludGVnZXIodHotPmRldmljZS0+aGFuZGxlLCAiX0hPVCIsIE5VTEwsCi0JCQkJICAmdHotPnRyaXBzLmhvdC50ZW1wZXJhdHVyZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXR6LT50cmlwcy5ob3QuZmxhZ3MudmFsaWQgPSAwOwotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJObyBob3QgdGhyZXNob2xkXG4iKSk7Ci0JfSBlbHNlIHsKLQkJdHotPnRyaXBzLmhvdC5mbGFncy52YWxpZCA9IDE7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkZvdW5kIGhvdCB0aHJlc2hvbGQgWyVsdV1cbiIsCi0JCQkJICB0ei0+dHJpcHMuaG90LnRlbXBlcmF0dXJlKSk7Ci0JfQotCi0JLyogUGFzc2l2ZTogUHJvY2Vzc29ycyAob3B0aW9uYWwpICovCi0KLQlpZiAocHN2ID09IC0xKSB7Ci0JCXN0YXR1cyA9IEFFX1NVUFBPUlQ7Ci0JfSBlbHNlIGlmIChwc3YgPiAwKSB7Ci0JCXR6LT50cmlwcy5wYXNzaXZlLnRlbXBlcmF0dXJlID0gQ0VMU0lVU19UT19LRUxWSU4ocHN2KTsKLQkJc3RhdHVzID0gQUVfT0s7Ci0JfSBlbHNlIHsKKwlpZiAoZmxhZyAmIEFDUElfVFJJUFNfSE9UKSB7CiAJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcih0ei0+ZGV2aWNlLT5oYW5kbGUsCi0JCQkiX1BTViIsIE5VTEwsICZ0ei0+dHJpcHMucGFzc2l2ZS50ZW1wZXJhdHVyZSk7Ci0JfQotCi0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXR6LT50cmlwcy5wYXNzaXZlLmZsYWdzLnZhbGlkID0gMDsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiTm8gcGFzc2l2ZSB0aHJlc2hvbGRcbiIpKTsKLQl9IGVsc2UgewotCQl0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy52YWxpZCA9IDE7Ci0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfZXZhbHVhdGVfaW50ZWdlcih0ei0+ZGV2aWNlLT5oYW5kbGUsICJfVEMxIiwgTlVMTCwKLQkJCQkJICAmdHotPnRyaXBzLnBhc3NpdmUudGMxKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQkJdHotPnRyaXBzLnBhc3NpdmUuZmxhZ3MudmFsaWQgPSAwOwotCi0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX2V2YWx1YXRlX2ludGVnZXIodHotPmRldmljZS0+aGFuZGxlLCAiX1RDMiIsIE5VTEwsCi0JCQkJCSAgJnR6LT50cmlwcy5wYXNzaXZlLnRjMik7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJCXR6LT50cmlwcy5wYXNzaXZlLmZsYWdzLnZhbGlkID0gMDsKLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKHR6LT5kZXZpY2UtPmhhbmRsZSwgIl9UU1AiLCBOVUxMLAotCQkJCQkgICZ0ei0+dHJpcHMucGFzc2l2ZS50c3ApOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCQl0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy52YWxpZCA9IDA7Ci0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfZXZhbHVhdGVfcmVmZXJlbmNlKHR6LT5kZXZpY2UtPmhhbmRsZSwgIl9QU0wiLCBOVUxMLAotCQkJCQkgICAgJnR6LT50cmlwcy5wYXNzaXZlLmRldmljZXMpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCQl0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy52YWxpZCA9IDA7Ci0KLQkJaWYgKCF0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy52YWxpZCkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJJbnZhbGlkIHBhc3NpdmUgdGhyZXNob2xkXG4iKTsKLQkJZWxzZQorCQkJCSJfSE9UIiwgTlVMTCwgJnR6LT50cmlwcy5ob3QudGVtcGVyYXR1cmUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXR6LT50cmlwcy5ob3QuZmxhZ3MudmFsaWQgPSAwOwogCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJCQkgICJGb3VuZCBwYXNzaXZlIHRocmVzaG9sZCBbJWx1XVxuIiwKLQkJCQkJICB0ei0+dHJpcHMucGFzc2l2ZS50ZW1wZXJhdHVyZSkpOworCQkJCQkiTm8gaG90IHRocmVzaG9sZFxuIikpOworCQl9IGVsc2UgeworCQkJdHotPnRyaXBzLmhvdC5mbGFncy52YWxpZCA9IDE7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkJCSJGb3VuZCBob3QgdGhyZXNob2xkIFslbHVdXG4iLAorCQkJCQl0ei0+dHJpcHMuY3JpdGljYWwudGVtcGVyYXR1cmUpKTsKKwkJfQogCX0KIAotCS8qIEFjdGl2ZTogRmFucywgZXRjLiAob3B0aW9uYWwpICovCisJLyogUGFzc2l2ZSAob3B0aW9uYWwpICovCisJaWYgKGZsYWcgJiBBQ1BJX1RSSVBTX1BBU1NJVkUpIHsKKwkJdmFsaWQgPSB0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy52YWxpZDsKKwkJaWYgKHBzdiA9PSAtMSkgeworCQkJc3RhdHVzID0gQUVfU1VQUE9SVDsKKwkJfSBlbHNlIGlmIChwc3YgPiAwKSB7CisJCQl0ei0+dHJpcHMucGFzc2l2ZS50ZW1wZXJhdHVyZSA9IENFTFNJVVNfVE9fS0VMVklOKHBzdik7CisJCQlzdGF0dXMgPSBBRV9PSzsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcih0ei0+ZGV2aWNlLT5oYW5kbGUsCisJCQkJIl9QU1YiLCBOVUxMLCAmdHotPnRyaXBzLnBhc3NpdmUudGVtcGVyYXR1cmUpOworCQl9CiAKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQkJdHotPnRyaXBzLnBhc3NpdmUuZmxhZ3MudmFsaWQgPSAwOworCQllbHNlIHsKKwkJCXR6LT50cmlwcy5wYXNzaXZlLmZsYWdzLnZhbGlkID0gMTsKKwkJCWlmIChmbGFnID09IEFDUElfVFJJUFNfSU5JVCkgeworCQkJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcigKKwkJCQkJCXR6LT5kZXZpY2UtPmhhbmRsZSwgIl9UQzEiLAorCQkJCQkJTlVMTCwgJnR6LT50cmlwcy5wYXNzaXZlLnRjMSk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQkJCQl0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy52YWxpZCA9IDA7CisJCQkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKAorCQkJCQkJdHotPmRldmljZS0+aGFuZGxlLCAiX1RDMiIsCisJCQkJCQlOVUxMLCAmdHotPnRyaXBzLnBhc3NpdmUudGMyKTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCQkJCXR6LT50cmlwcy5wYXNzaXZlLmZsYWdzLnZhbGlkID0gMDsKKwkJCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoCisJCQkJCQl0ei0+ZGV2aWNlLT5oYW5kbGUsICJfVFNQIiwKKwkJCQkJCU5VTEwsICZ0ei0+dHJpcHMucGFzc2l2ZS50c3ApOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJCQkJdHotPnRyaXBzLnBhc3NpdmUuZmxhZ3MudmFsaWQgPSAwOworCQkJfQorCQl9CisJfQorCWlmICgoZmxhZyAmIEFDUElfVFJJUFNfREVWSUNFUykgJiYgdHotPnRyaXBzLnBhc3NpdmUuZmxhZ3MudmFsaWQpIHsKKwkJbWVtc2V0KCZkZXZpY2VzLCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QpKTsKKwkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9yZWZlcmVuY2UodHotPmRldmljZS0+aGFuZGxlLCAiX1BTTCIsCisJCQkJCQkJTlVMTCwgJmRldmljZXMpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCQl0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy52YWxpZCA9IDA7CisJCWVsc2UKKwkJCXR6LT50cmlwcy5wYXNzaXZlLmZsYWdzLnZhbGlkID0gMTsKKworCQlpZiAobWVtY21wKCZ0ei0+dHJpcHMucGFzc2l2ZS5kZXZpY2VzLCAmZGV2aWNlcywKKwkJCQlzaXplb2Yoc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QpKSkgeworCQkJbWVtY3B5KCZ0ei0+dHJpcHMucGFzc2l2ZS5kZXZpY2VzLCAmZGV2aWNlcywKKwkJCQlzaXplb2Yoc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QpKTsKKwkJCUFDUElfVEhFUk1BTF9UUklQU19FWENFUFRJT04oZmxhZywgImRldmljZSIpOworCQl9CisJfQorCWlmICgoZmxhZyAmIEFDUElfVFJJUFNfUEFTU0lWRSkgfHwgKGZsYWcgJiBBQ1BJX1RSSVBTX0RFVklDRVMpKSB7CisJCWlmICh2YWxpZCAhPSB0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy52YWxpZCkKKwkJCQlBQ1BJX1RIRVJNQUxfVFJJUFNfRVhDRVBUSU9OKGZsYWcsICJzdGF0ZSIpOworCX0KKworCS8qIEFjdGl2ZSAob3B0aW9uYWwpICovCiAJZm9yIChpID0gMDsgaSA8IEFDUElfVEhFUk1BTF9NQVhfQUNUSVZFOyBpKyspIHsKLQogCQljaGFyIG5hbWVbNV0gPSB7ICdfJywgJ0EnLCAnQycsICgnMCcgKyBpKSwgJ1wwJyB9OworCQl2YWxpZCA9IHR6LT50cmlwcy5hY3RpdmVbaV0uZmxhZ3MudmFsaWQ7CiAKIAkJaWYgKGFjdCA9PSAtMSkKLQkJCWJyZWFrOwkvKiBkaXNhYmxlIGFsbCBhY3RpdmUgdHJpcCBwb2ludHMgKi8KKwkJCWJyZWFrOyAvKiBkaXNhYmxlIGFsbCBhY3RpdmUgdHJpcCBwb2ludHMgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIodHotPmRldmljZS0+aGFuZGxlLAotCQkJbmFtZSwgTlVMTCwgJnR6LT50cmlwcy5hY3RpdmVbaV0udGVtcGVyYXR1cmUpOwotCi0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJaWYgKGkgPT0gMCkJLyogbm8gYWN0aXZlIHRyaXAgcG9pbnRzICovCisJCWlmIChmbGFnICYgQUNQSV9UUklQU19BQ1RJVkUpIHsKKwkJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcih0ei0+ZGV2aWNlLT5oYW5kbGUsCisJCQkJbmFtZSwgTlVMTCwgJnR6LT50cmlwcy5hY3RpdmVbaV0udGVtcGVyYXR1cmUpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJdHotPnRyaXBzLmFjdGl2ZVtpXS5mbGFncy52YWxpZCA9IDA7CisJCQkJaWYgKGkgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGFjdCA8PSAwKQorCQkJCQlicmVhazsKKwkJCQlpZiAoaSA9PSAxKQorCQkJCQl0ei0+dHJpcHMuYWN0aXZlWzBdLnRlbXBlcmF0dXJlID0KKwkJCQkJCUNFTFNJVVNfVE9fS0VMVklOKGFjdCk7CisJCQkJZWxzZQorCQkJCQkvKgorCQkJCQkgKiBEb24ndCBhbGxvdyBvdmVycmlkZSBoaWdoZXIgdGhhbgorCQkJCQkgKiB0aGUgbmV4dCBoaWdoZXIgdHJpcCBwb2ludAorCQkJCQkgKi8KKwkJCQkJdHotPnRyaXBzLmFjdGl2ZVtpIC0gMV0udGVtcGVyYXR1cmUgPQorCQkJCQkJKHR6LT50cmlwcy5hY3RpdmVbaSAtIDJdLnRlbXBlcmF0dXJlIDwKKwkJCQkJCUNFTFNJVVNfVE9fS0VMVklOKGFjdCkgPworCQkJCQkJdHotPnRyaXBzLmFjdGl2ZVtpIC0gMl0udGVtcGVyYXR1cmUgOgorCQkJCQkJQ0VMU0lVU19UT19LRUxWSU4oYWN0KSk7CiAJCQkJYnJlYWs7Ci0JCQlpZiAoYWN0IDw9IDApCS8qIG5vIG92ZXJyaWRlIHJlcXVlc3RlZCAqLwotCQkJCWJyZWFrOwotCQkJaWYgKGkgPT0gMSkgewkvKiAxIHRyaXAgcG9pbnQgKi8KLQkJCQl0ei0+dHJpcHMuYWN0aXZlWzBdLnRlbXBlcmF0dXJlID0KLQkJCQkJQ0VMU0lVU19UT19LRUxWSU4oYWN0KTsKLQkJCX0gZWxzZSB7CS8qIG11bHRpcGxlIHRyaXBzICovCi0JCQkJLyoKLQkJCQkgKiBEb24ndCBhbGxvdyBvdmVycmlkZSBoaWdoZXIgdGhhbgotCQkJCSAqIHRoZSBuZXh0IGhpZ2hlciB0cmlwIHBvaW50Ci0JCQkJICovCi0JCQkJdHotPnRyaXBzLmFjdGl2ZVtpIC0gMV0udGVtcGVyYXR1cmUgPQotCQkJCSAgICAodHotPnRyaXBzLmFjdGl2ZVtpIC0gMl0udGVtcGVyYXR1cmUgPAotCQkJCQlDRUxTSVVTX1RPX0tFTFZJTihhY3QpID8KLQkJCQkJdHotPnRyaXBzLmFjdGl2ZVtpIC0gMl0udGVtcGVyYXR1cmUgOgotCQkJCQlDRUxTSVVTX1RPX0tFTFZJTihhY3QpKTsKLQkJCX0KLQkJCWJyZWFrOworCQkJfSBlbHNlCisJCQkJdHotPnRyaXBzLmFjdGl2ZVtpXS5mbGFncy52YWxpZCA9IDE7CiAJCX0KIAogCQluYW1lWzJdID0gJ0wnOwotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9ldmFsdWF0ZV9yZWZlcmVuY2UodHotPmRldmljZS0+aGFuZGxlLCBuYW1lLCBOVUxMLAotCQkJCQkgICAgJnR6LT50cmlwcy5hY3RpdmVbaV0uZGV2aWNlcyk7Ci0JCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQkJdHotPnRyaXBzLmFjdGl2ZVtpXS5mbGFncy52YWxpZCA9IDE7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkJCSAgIkZvdW5kIGFjdGl2ZSB0aHJlc2hvbGQgWyVkXTpbJWx1XVxuIiwKLQkJCQkJICBpLCB0ei0+dHJpcHMuYWN0aXZlW2ldLnRlbXBlcmF0dXJlKSk7Ci0JCX0gZWxzZQotCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKLQkJCQkJIkludmFsaWQgYWN0aXZlIHRocmVzaG9sZCBbJWRdIiwgaSkpOworCQlpZiAoKGZsYWcgJiBBQ1BJX1RSSVBTX0RFVklDRVMpICYmIHR6LT50cmlwcy5hY3RpdmVbaV0uZmxhZ3MudmFsaWQgKSB7CisJCQltZW1zZXQoJmRldmljZXMsIDAsIHNpemVvZihzdHJ1Y3QgYWNwaV9oYW5kbGVfbGlzdCkpOworCQkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9yZWZlcmVuY2UodHotPmRldmljZS0+aGFuZGxlLAorCQkJCQkJbmFtZSwgTlVMTCwgJmRldmljZXMpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQkJCXR6LT50cmlwcy5hY3RpdmVbaV0uZmxhZ3MudmFsaWQgPSAwOworCQkJZWxzZQorCQkJCXR6LT50cmlwcy5hY3RpdmVbaV0uZmxhZ3MudmFsaWQgPSAxOworCisJCQlpZiAobWVtY21wKCZ0ei0+dHJpcHMuYWN0aXZlW2ldLmRldmljZXMsICZkZXZpY2VzLAorCQkJCQlzaXplb2Yoc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QpKSkgeworCQkJCW1lbWNweSgmdHotPnRyaXBzLmFjdGl2ZVtpXS5kZXZpY2VzLCAmZGV2aWNlcywKKwkJCQkJc2l6ZW9mKHN0cnVjdCBhY3BpX2hhbmRsZV9saXN0KSk7CisJCQkJQUNQSV9USEVSTUFMX1RSSVBTX0VYQ0VQVElPTihmbGFnLCAiZGV2aWNlIik7CisJCQl9CisJCX0KKwkJaWYgKChmbGFnICYgQUNQSV9UUklQU19BQ1RJVkUpIHx8IChmbGFnICYgQUNQSV9UUklQU19ERVZJQ0VTKSkKKwkJCWlmICh2YWxpZCAhPSB0ei0+dHJpcHMuYWN0aXZlW2ldLmZsYWdzLnZhbGlkKQorCQkJCUFDUElfVEhFUk1BTF9UUklQU19FWENFUFRJT04oZmxhZywgInN0YXRlIik7CisKKwkJaWYgKCF0ei0+dHJpcHMuYWN0aXZlW2ldLmZsYWdzLnZhbGlkKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGZsYWcgJiBBQ1BJX1RSSVBTX0RFVklDRVMpIHsKKwkJbWVtc2V0KCZkZXZpY2VzLCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QpKTsKKwkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9yZWZlcmVuY2UodHotPmRldmljZS0+aGFuZGxlLCAiX1RaRCIsCisJCQkJCQlOVUxMLCAmZGV2aWNlcyk7CisJCWlmIChtZW1jbXAoJnR6LT5kZXZpY2VzLCAmZGV2aWNlcywKKwkJCQlzaXplb2Yoc3RydWN0IGFjcGlfaGFuZGxlX2xpc3QpKSkgeworCQkJbWVtY3B5KCZ0ei0+ZGV2aWNlcywgJmRldmljZXMsCisJCQkJc2l6ZW9mKHN0cnVjdCBhY3BpX2hhbmRsZV9saXN0KSk7CisJCQlBQ1BJX1RIRVJNQUxfVFJJUFNfRVhDRVBUSU9OKGZsYWcsICJkZXZpY2UiKTsKKwkJfQogCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFjcGlfdGhlcm1hbF9nZXRfZGV2aWNlcyhzdHJ1Y3QgYWNwaV90aGVybWFsICp0eikKK3N0YXRpYyBpbnQgYWNwaV90aGVybWFsX2dldF90cmlwX3BvaW50cyhzdHJ1Y3QgYWNwaV90aGVybWFsICp0eikKIHsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCi0JaWYgKCF0eikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzdGF0dXMgPQotCSAgICBhY3BpX2V2YWx1YXRlX3JlZmVyZW5jZSh0ei0+ZGV2aWNlLT5oYW5kbGUsICJfVFpEIiwgTlVMTCwgJnR6LT5kZXZpY2VzKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGFjcGlfdGhlcm1hbF90cmlwc191cGRhdGUodHosIEFDUElfVFJJUFNfSU5JVCk7CiB9CiAKIHN0YXRpYyBpbnQgYWNwaV90aGVybWFsX2NyaXRpY2FsKHN0cnVjdCBhY3BpX3RoZXJtYWwgKnR6KQogewotCWlmICghdHogfHwgIXR6LT50cmlwcy5jcml0aWNhbC5mbGFncy52YWxpZCB8fCBub2NydCkKKwlpZiAoIXR6IHx8ICF0ei0+dHJpcHMuY3JpdGljYWwuZmxhZ3MudmFsaWQpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKHR6LT50ZW1wZXJhdHVyZSA+PSB0ei0+dHJpcHMuY3JpdGljYWwudGVtcGVyYXR1cmUpIHsKQEAgLTUwMSw5ICs1NDgsNiBAQAogCX0gZWxzZSBpZiAodHotPnRyaXBzLmNyaXRpY2FsLmZsYWdzLmVuYWJsZWQpCiAJCXR6LT50cmlwcy5jcml0aWNhbC5mbGFncy5lbmFibGVkID0gMDsKIAotCXByaW50ayhLRVJOX0VNRVJHCi0JICAgICAgICJDcml0aWNhbCB0ZW1wZXJhdHVyZSByZWFjaGVkICglbGQgQyksIHNodXR0aW5nIGRvd24uXG4iLAotCSAgICAgICBLRUxWSU5fVE9fQ0VMU0lVUyh0ei0+dGVtcGVyYXR1cmUpKTsKIAlhY3BpX2J1c19nZW5lcmF0ZV9wcm9jX2V2ZW50KHR6LT5kZXZpY2UsIEFDUElfVEhFUk1BTF9OT1RJRllfQ1JJVElDQUwsCiAJCQkJdHotPnRyaXBzLmNyaXRpY2FsLmZsYWdzLmVuYWJsZWQpOwogCWFjcGlfYnVzX2dlbmVyYXRlX25ldGxpbmtfZXZlbnQodHotPmRldmljZS0+cG5wLmRldmljZV9jbGFzcywKQEAgLTUxMSwxNCArNTU1LDIwIEBACiAJCQkJCSAgQUNQSV9USEVSTUFMX05PVElGWV9DUklUSUNBTCwKIAkJCQkJICB0ei0+dHJpcHMuY3JpdGljYWwuZmxhZ3MuZW5hYmxlZCk7CiAKLQlvcmRlcmx5X3Bvd2Vyb2ZmKHRydWUpOworCS8qIHRha2Ugbm8gYWN0aW9uIGlmIG5vY3J0IGlzIHNldCAqLworCWlmKCFub2NydCkgeworCQlwcmludGsoS0VSTl9FTUVSRworCQkJIkNyaXRpY2FsIHRlbXBlcmF0dXJlIHJlYWNoZWQgKCVsZCBDKSwgc2h1dHRpbmcgZG93bi5cbiIsCisJCQlLRUxWSU5fVE9fQ0VMU0lVUyh0ei0+dGVtcGVyYXR1cmUpKTsKKwkJb3JkZXJseV9wb3dlcm9mZih0cnVlKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBhY3BpX3RoZXJtYWxfaG90KHN0cnVjdCBhY3BpX3RoZXJtYWwgKnR6KQogewotCWlmICghdHogfHwgIXR6LT50cmlwcy5ob3QuZmxhZ3MudmFsaWQgfHwgbm9jcnQpCisJaWYgKCF0eiB8fCAhdHotPnRyaXBzLmhvdC5mbGFncy52YWxpZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAodHotPnRlbXBlcmF0dXJlID49IHR6LT50cmlwcy5ob3QudGVtcGVyYXR1cmUpIHsKQEAgLTUzNCw3ICs1ODQsNyBAQAogCQkJCQkgIEFDUElfVEhFUk1BTF9OT1RJRllfSE9ULAogCQkJCQkgIHR6LT50cmlwcy5ob3QuZmxhZ3MuZW5hYmxlZCk7CiAKLQkvKiBUQkQ6IENhbGwgdXNlci1tb2RlICJzbGVlcChTNCkiIGZ1bmN0aW9uICovCisJLyogVEJEOiBDYWxsIHVzZXItbW9kZSAic2xlZXAoUzQpIiBmdW5jdGlvbiBpZiBub2NydCBpcyBjbGVhcmVkICovCiAKIAlyZXR1cm4gMDsKIH0KQEAgLTczMiw2ICs3ODIsOSBAQAogCWlmIChyZXN1bHQpCiAJCWdvdG8gdW5sb2NrOwogCisJaWYgKCF0ei0+dHpfZW5hYmxlZCkKKwkJZ290byB1bmxvY2s7CisKIAltZW1zZXQoJnR6LT5zdGF0ZSwgMCwgc2l6ZW9mKHR6LT5zdGF0ZSkpOwogCiAJLyoKQEAgLTgyNSw2ICs4NzgsMjkwIEBACiAJbXV0ZXhfdW5sb2NrKCZ0ei0+bG9jayk7CiB9CiAKKy8qIHN5cyBJL0YgZm9yIGdlbmVyaWMgdGhlcm1hbCBzeXNmcyBzdXBwb3J0ICovCitzdGF0aWMgaW50IHRoZXJtYWxfZ2V0X3RlbXAoc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnRoZXJtYWwsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWNwaV90aGVybWFsICp0eiA9IHRoZXJtYWwtPmRldmRhdGE7CisKKwlpZiAoIXR6KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgS0VMVklOX1RPX0NFTFNJVVModHotPnRlbXBlcmF0dXJlKSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGVuYWJsZWRbXSA9ICJrZXJuZWwiOworc3RhdGljIGNvbnN0IGNoYXIgZGlzYWJsZWRbXSA9ICJ1c2VyIjsKK3N0YXRpYyBpbnQgdGhlcm1hbF9nZXRfbW9kZShzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdGhlcm1hbCwKKwkJCQljaGFyICpidWYpCit7CisJc3RydWN0IGFjcGlfdGhlcm1hbCAqdHogPSB0aGVybWFsLT5kZXZkYXRhOworCisJaWYgKCF0eikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgdHotPnR6X2VuYWJsZWQgPworCQkJZW5hYmxlZCA6IGRpc2FibGVkKTsKK30KKworc3RhdGljIGludCB0aGVybWFsX3NldF9tb2RlKHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0aGVybWFsLAorCQkJCWNvbnN0IGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWNwaV90aGVybWFsICp0eiA9IHRoZXJtYWwtPmRldmRhdGE7CisJaW50IGVuYWJsZTsKKworCWlmICghdHopCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBlbmFibGUvZGlzYWJsZSB0aGVybWFsIG1hbmFnZW1lbnQgZnJvbSBBQ1BJIHRoZXJtYWwgZHJpdmVyCisJICovCisJaWYgKCFzdHJuY21wKGJ1ZiwgZW5hYmxlZCwgc2l6ZW9mIGVuYWJsZWQgLSAxKSkKKwkJZW5hYmxlID0gMTsKKwllbHNlIGlmICghc3RybmNtcChidWYsIGRpc2FibGVkLCBzaXplb2YgZGlzYWJsZWQgLSAxKSkKKwkJZW5hYmxlID0gMDsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGVuYWJsZSAhPSB0ei0+dHpfZW5hYmxlZCkgeworCQl0ei0+dHpfZW5hYmxlZCA9IGVuYWJsZTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJIiVzIEFDUEkgdGhlcm1hbCBjb250cm9sXG4iLAorCQkJdHotPnR6X2VuYWJsZWQgPyBlbmFibGVkIDogZGlzYWJsZWQpKTsKKwkJYWNwaV90aGVybWFsX2NoZWNrKHR6KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGhlcm1hbF9nZXRfdHJpcF90eXBlKHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0aGVybWFsLAorCQkJCSBpbnQgdHJpcCwgY2hhciAqYnVmKQoreworCXN0cnVjdCBhY3BpX3RoZXJtYWwgKnR6ID0gdGhlcm1hbC0+ZGV2ZGF0YTsKKwlpbnQgaTsKKworCWlmICghdHogfHwgdHJpcCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHR6LT50cmlwcy5jcml0aWNhbC5mbGFncy52YWxpZCkgeworCQlpZiAoIXRyaXApCisJCQlyZXR1cm4gc3ByaW50ZihidWYsICJjcml0aWNhbFxuIik7CisJCXRyaXAtLTsKKwl9CisKKwlpZiAodHotPnRyaXBzLmhvdC5mbGFncy52YWxpZCkgeworCQlpZiAoIXRyaXApCisJCQlyZXR1cm4gc3ByaW50ZihidWYsICJob3RcbiIpOworCQl0cmlwLS07CisJfQorCisJaWYgKHR6LT50cmlwcy5wYXNzaXZlLmZsYWdzLnZhbGlkKSB7CisJCWlmICghdHJpcCkKKwkJCXJldHVybiBzcHJpbnRmKGJ1ZiwgInBhc3NpdmVcbiIpOworCQl0cmlwLS07CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFDUElfVEhFUk1BTF9NQVhfQUNUSVZFICYmCisJCXR6LT50cmlwcy5hY3RpdmVbaV0uZmxhZ3MudmFsaWQ7IGkrKykgeworCQlpZiAoIXRyaXApCisJCQlyZXR1cm4gc3ByaW50ZihidWYsICJhY3RpdmUlZFxuIiwgaSk7CisJCXRyaXAtLTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCB0aGVybWFsX2dldF90cmlwX3RlbXAoc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnRoZXJtYWwsCisJCQkJIGludCB0cmlwLCBjaGFyICpidWYpCit7CisJc3RydWN0IGFjcGlfdGhlcm1hbCAqdHogPSB0aGVybWFsLT5kZXZkYXRhOworCWludCBpOworCisJaWYgKCF0eiB8fCB0cmlwIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodHotPnRyaXBzLmNyaXRpY2FsLmZsYWdzLnZhbGlkKSB7CisJCWlmICghdHJpcCkKKwkJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgS0VMVklOX1RPX0NFTFNJVVMoCisJCQkJdHotPnRyaXBzLmNyaXRpY2FsLnRlbXBlcmF0dXJlKSk7CisJCXRyaXAtLTsKKwl9CisKKwlpZiAodHotPnRyaXBzLmhvdC5mbGFncy52YWxpZCkgeworCQlpZiAoIXRyaXApCisJCQlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIEtFTFZJTl9UT19DRUxTSVVTKAorCQkJCQl0ei0+dHJpcHMuaG90LnRlbXBlcmF0dXJlKSk7CisJCXRyaXAtLTsKKwl9CisKKwlpZiAodHotPnRyaXBzLnBhc3NpdmUuZmxhZ3MudmFsaWQpIHsKKwkJaWYgKCF0cmlwKQorCQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBLRUxWSU5fVE9fQ0VMU0lVUygKKwkJCQkJdHotPnRyaXBzLnBhc3NpdmUudGVtcGVyYXR1cmUpKTsKKwkJdHJpcC0tOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBQ1BJX1RIRVJNQUxfTUFYX0FDVElWRSAmJgorCQl0ei0+dHJpcHMuYWN0aXZlW2ldLmZsYWdzLnZhbGlkOyBpKyspIHsKKwkJaWYgKCF0cmlwKQorCQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBLRUxWSU5fVE9fQ0VMU0lVUygKKwkJCQkJdHotPnRyaXBzLmFjdGl2ZVtpXS50ZW1wZXJhdHVyZSkpOworCQl0cmlwLS07CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3R5cGVkZWYgaW50ICgqY2IpKHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICosIGludCwKKwkJICBzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqKTsKK3N0YXRpYyBpbnQgYWNwaV90aGVybWFsX2Nvb2xpbmdfZGV2aWNlX2NiKHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0aGVybWFsLAorCQkJCQlzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldiwKKwkJCQkJY2IgYWN0aW9uKQoreworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gY2Rldi0+ZGV2ZGF0YTsKKwlzdHJ1Y3QgYWNwaV90aGVybWFsICp0eiA9IHRoZXJtYWwtPmRldmRhdGE7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXY7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwlpbnQgaTsKKwlpbnQgajsKKwlpbnQgdHJpcCA9IC0xOworCWludCByZXN1bHQgPSAwOworCisJaWYgKHR6LT50cmlwcy5jcml0aWNhbC5mbGFncy52YWxpZCkKKwkJdHJpcCsrOworCisJaWYgKHR6LT50cmlwcy5ob3QuZmxhZ3MudmFsaWQpCisJCXRyaXArKzsKKworCWlmICh0ei0+dHJpcHMucGFzc2l2ZS5mbGFncy52YWxpZCkgeworCQl0cmlwKys7CisJCWZvciAoaSA9IDA7IGkgPCB0ei0+dHJpcHMucGFzc2l2ZS5kZXZpY2VzLmNvdW50OworCQkgICAgaSsrKSB7CisJCQloYW5kbGUgPSB0ei0+dHJpcHMucGFzc2l2ZS5kZXZpY2VzLmhhbmRsZXNbaV07CisJCQlzdGF0dXMgPSBhY3BpX2J1c19nZXRfZGV2aWNlKGhhbmRsZSwgJmRldik7CisJCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykgJiYgKGRldiA9PSBkZXZpY2UpKSB7CisJCQkJcmVzdWx0ID0gYWN0aW9uKHRoZXJtYWwsIHRyaXAsIGNkZXYpOworCQkJCWlmIChyZXN1bHQpCisJCQkJCWdvdG8gZmFpbGVkOworCQkJfQorCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFDUElfVEhFUk1BTF9NQVhfQUNUSVZFOyBpKyspIHsKKwkJaWYgKCF0ei0+dHJpcHMuYWN0aXZlW2ldLmZsYWdzLnZhbGlkKQorCQkJYnJlYWs7CisJCXRyaXArKzsKKwkJZm9yIChqID0gMDsKKwkJICAgIGogPCB0ei0+dHJpcHMuYWN0aXZlW2ldLmRldmljZXMuY291bnQ7CisJCSAgICBqKyspIHsKKwkJCWhhbmRsZSA9IHR6LT50cmlwcy5hY3RpdmVbaV0uZGV2aWNlcy5oYW5kbGVzW2pdOworCQkJc3RhdHVzID0gYWNwaV9idXNfZ2V0X2RldmljZShoYW5kbGUsICZkZXYpOworCQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpICYmIChkZXYgPT0gZGV2aWNlKSkgeworCQkJCXJlc3VsdCA9IGFjdGlvbih0aGVybWFsLCB0cmlwLCBjZGV2KTsKKwkJCQlpZiAocmVzdWx0KQorCQkJCQlnb3RvIGZhaWxlZDsKKwkJCX0KKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCB0ei0+ZGV2aWNlcy5jb3VudDsgaSsrKSB7CisJCWhhbmRsZSA9IHR6LT5kZXZpY2VzLmhhbmRsZXNbaV07CisJCXN0YXR1cyA9IGFjcGlfYnVzX2dldF9kZXZpY2UoaGFuZGxlLCAmZGV2KTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpICYmIChkZXYgPT0gZGV2aWNlKSkgeworCQkJcmVzdWx0ID0gYWN0aW9uKHRoZXJtYWwsIC0xLCBjZGV2KTsKKwkJCWlmIChyZXN1bHQpCisJCQkJZ290byBmYWlsZWQ7CisJCX0KKwl9CisKK2ZhaWxlZDoKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50CithY3BpX3RoZXJtYWxfYmluZF9jb29saW5nX2RldmljZShzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdGhlcm1hbCwKKwkJCQkJc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXYpCit7CisJcmV0dXJuIGFjcGlfdGhlcm1hbF9jb29saW5nX2RldmljZV9jYih0aGVybWFsLCBjZGV2LAorCQkJCXRoZXJtYWxfem9uZV9iaW5kX2Nvb2xpbmdfZGV2aWNlKTsKK30KKworc3RhdGljIGludAorYWNwaV90aGVybWFsX3VuYmluZF9jb29saW5nX2RldmljZShzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdGhlcm1hbCwKKwkJCQkJc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXYpCit7CisJcmV0dXJuIGFjcGlfdGhlcm1hbF9jb29saW5nX2RldmljZV9jYih0aGVybWFsLCBjZGV2LAorCQkJCXRoZXJtYWxfem9uZV91bmJpbmRfY29vbGluZ19kZXZpY2UpOworfQorCitzdGF0aWMgc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2Vfb3BzIGFjcGlfdGhlcm1hbF96b25lX29wcyA9IHsKKwkuYmluZCA9IGFjcGlfdGhlcm1hbF9iaW5kX2Nvb2xpbmdfZGV2aWNlLAorCS51bmJpbmQJPSBhY3BpX3RoZXJtYWxfdW5iaW5kX2Nvb2xpbmdfZGV2aWNlLAorCS5nZXRfdGVtcCA9IHRoZXJtYWxfZ2V0X3RlbXAsCisJLmdldF9tb2RlID0gdGhlcm1hbF9nZXRfbW9kZSwKKwkuc2V0X21vZGUgPSB0aGVybWFsX3NldF9tb2RlLAorCS5nZXRfdHJpcF90eXBlID0gdGhlcm1hbF9nZXRfdHJpcF90eXBlLAorCS5nZXRfdHJpcF90ZW1wID0gdGhlcm1hbF9nZXRfdHJpcF90ZW1wLAorfTsKKworc3RhdGljIGludCBhY3BpX3RoZXJtYWxfcmVnaXN0ZXJfdGhlcm1hbF96b25lKHN0cnVjdCBhY3BpX3RoZXJtYWwgKnR6KQoreworCWludCB0cmlwcyA9IDA7CisJaW50IHJlc3VsdDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJaW50IGk7CisKKwlpZiAodHotPnRyaXBzLmNyaXRpY2FsLmZsYWdzLnZhbGlkKQorCQl0cmlwcysrOworCisJaWYgKHR6LT50cmlwcy5ob3QuZmxhZ3MudmFsaWQpCisJCXRyaXBzKys7CisKKwlpZiAodHotPnRyaXBzLnBhc3NpdmUuZmxhZ3MudmFsaWQpCisJCXRyaXBzKys7CisKKwlmb3IgKGkgPSAwOyBpIDwgQUNQSV9USEVSTUFMX01BWF9BQ1RJVkUgJiYKKwkJCXR6LT50cmlwcy5hY3RpdmVbaV0uZmxhZ3MudmFsaWQ7IGkrKywgdHJpcHMrKyk7CisJdHotPnRoZXJtYWxfem9uZSA9IHRoZXJtYWxfem9uZV9kZXZpY2VfcmVnaXN0ZXIoIkFDUEkgdGhlcm1hbCB6b25lIiwKKwkJCQkJdHJpcHMsIHR6LCAmYWNwaV90aGVybWFsX3pvbmVfb3BzKTsKKwlpZiAoIXR6LT50aGVybWFsX3pvbmUpCisJCXJldHVybiAtRU5PREVWOworCisJcmVzdWx0ID0gc3lzZnNfY3JlYXRlX2xpbmsoJnR6LT5kZXZpY2UtPmRldi5rb2JqLAorCQkJCSAgICZ0ei0+dGhlcm1hbF96b25lLT5kZXZpY2Uua29iaiwgInRoZXJtYWxfem9uZSIpOworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisKKwlyZXN1bHQgPSBzeXNmc19jcmVhdGVfbGluaygmdHotPnRoZXJtYWxfem9uZS0+ZGV2aWNlLmtvYmosCisJCQkJICAgJnR6LT5kZXZpY2UtPmRldi5rb2JqLCAiZGV2aWNlIik7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCXN0YXR1cyA9IGFjcGlfYXR0YWNoX2RhdGEodHotPmRldmljZS0+aGFuZGxlLAorCQkJCSAgYWNwaV9idXNfcHJpdmF0ZV9kYXRhX2hhbmRsZXIsCisJCQkJICB0ei0+dGhlcm1hbF96b25lKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkiRXJyb3IgYXR0YWNoaW5nIGRldmljZSBkYXRhXG4iKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXR6LT50el9lbmFibGVkID0gMTsKKworCXByaW50ayhLRVJOX0lORk8gUFJFRklYICIlcyBpcyByZWdpc3RlcmVkIGFzIHRoZXJtYWxfem9uZSVkXG4iLAorCQkJdHotPmRldmljZS0+ZGV2LmJ1c19pZCwgdHotPnRoZXJtYWxfem9uZS0+aWQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhY3BpX3RoZXJtYWxfdW5yZWdpc3Rlcl90aGVybWFsX3pvbmUoc3RydWN0IGFjcGlfdGhlcm1hbCAqdHopCit7CisJc3lzZnNfcmVtb3ZlX2xpbmsoJnR6LT5kZXZpY2UtPmRldi5rb2JqLCAidGhlcm1hbF96b25lIik7CisJc3lzZnNfcmVtb3ZlX2xpbmsoJnR6LT50aGVybWFsX3pvbmUtPmRldmljZS5rb2JqLCAiZGV2aWNlIik7CisJdGhlcm1hbF96b25lX2RldmljZV91bnJlZ2lzdGVyKHR6LT50aGVybWFsX3pvbmUpOworCXR6LT50aGVybWFsX3pvbmUgPSBOVUxMOworCWFjcGlfZGV0YWNoX2RhdGEodHotPmRldmljZS0+aGFuZGxlLCBhY3BpX2J1c19wcml2YXRlX2RhdGFfaGFuZGxlcik7Cit9CisKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTIEludGVyZmFjZSAoL3Byb2MpCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTE4MSwxNSArMTUxOCwxNSBAQAogCQlhY3BpX3RoZXJtYWxfY2hlY2sodHopOwogCQlicmVhazsKIAljYXNlIEFDUElfVEhFUk1BTF9OT1RJRllfVEhSRVNIT0xEUzoKLQkJYWNwaV90aGVybWFsX2dldF90cmlwX3BvaW50cyh0eik7CisJCWFjcGlfdGhlcm1hbF90cmlwc191cGRhdGUodHosIEFDUElfVFJJUFNfUkVGUkVTSF9USFJFU0hPTERTKTsKIAkJYWNwaV90aGVybWFsX2NoZWNrKHR6KTsKIAkJYWNwaV9idXNfZ2VuZXJhdGVfcHJvY19ldmVudChkZXZpY2UsIGV2ZW50LCAwKTsKIAkJYWNwaV9idXNfZ2VuZXJhdGVfbmV0bGlua19ldmVudChkZXZpY2UtPnBucC5kZXZpY2VfY2xhc3MsCiAJCQkJCQkgIGRldmljZS0+ZGV2LmJ1c19pZCwgZXZlbnQsIDApOwogCQlicmVhazsKIAljYXNlIEFDUElfVEhFUk1BTF9OT1RJRllfREVWSUNFUzoKLQkJaWYgKHR6LT5mbGFncy5kZXZpY2VzKQotCQkJYWNwaV90aGVybWFsX2dldF9kZXZpY2VzKHR6KTsKKwkJYWNwaV90aGVybWFsX3RyaXBzX3VwZGF0ZSh0eiwgQUNQSV9UUklQU19SRUZSRVNIX0RFVklDRVMpOworCQlhY3BpX3RoZXJtYWxfY2hlY2sodHopOwogCQlhY3BpX2J1c19nZW5lcmF0ZV9wcm9jX2V2ZW50KGRldmljZSwgZXZlbnQsIDApOwogCQlhY3BpX2J1c19nZW5lcmF0ZV9uZXRsaW5rX2V2ZW50KGRldmljZS0+cG5wLmRldmljZV9jbGFzcywKIAkJCQkJCSAgZGV2aWNlLT5kZXYuYnVzX2lkLCBldmVudCwgMCk7CkBAIC0xMjMyLDExICsxNTY5LDYgQEAKIAllbHNlCiAJCWFjcGlfdGhlcm1hbF9nZXRfcG9sbGluZ19mcmVxdWVuY3kodHopOwogCi0JLyogR2V0IGRldmljZXMgaW4gdGhpcyB0aGVybWFsIHpvbmUgW19UWkRdIChvcHRpb25hbCkgKi8KLQlyZXN1bHQgPSBhY3BpX3RoZXJtYWxfZ2V0X2RldmljZXModHopOwotCWlmICghcmVzdWx0KQotCQl0ei0+ZmxhZ3MuZGV2aWNlcyA9IDE7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTI2MCwxMyArMTU5MiwxOSBAQAogCXN0cmNweShhY3BpX2RldmljZV9jbGFzcyhkZXZpY2UpLCBBQ1BJX1RIRVJNQUxfQ0xBU1MpOwogCWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSA9IHR6OwogCW11dGV4X2luaXQoJnR6LT5sb2NrKTsKKworCiAJcmVzdWx0ID0gYWNwaV90aGVybWFsX2dldF9pbmZvKHR6KTsKIAlpZiAocmVzdWx0KQotCQlnb3RvIGVuZDsKKwkJZ290byBmcmVlX21lbW9yeTsKKworCXJlc3VsdCA9IGFjcGlfdGhlcm1hbF9yZWdpc3Rlcl90aGVybWFsX3pvbmUodHopOworCWlmIChyZXN1bHQpCisJCWdvdG8gZnJlZV9tZW1vcnk7CiAKIAlyZXN1bHQgPSBhY3BpX3RoZXJtYWxfYWRkX2ZzKGRldmljZSk7CiAJaWYgKHJlc3VsdCkKLQkJZ290byBlbmQ7CisJCWdvdG8gdW5yZWdpc3Rlcl90aGVybWFsX3pvbmU7CiAKIAlpbml0X3RpbWVyKCZ0ei0+dGltZXIpOwogCkBAIC0xMjc3LDE5ICsxNjE1LDIxIEBACiAJCQkJCSAgICAgYWNwaV90aGVybWFsX25vdGlmeSwgdHopOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXN1bHQgPSAtRU5PREVWOwotCQlnb3RvIGVuZDsKKwkJZ290byByZW1vdmVfZnM7CiAJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIiVzIFslc10gKCVsZCBDKVxuIiwKIAkgICAgICAgYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKIAkgICAgICAgS0VMVklOX1RPX0NFTFNJVVModHotPnRlbXBlcmF0dXJlKSk7CisJZ290byBlbmQ7CiAKLSAgICAgIGVuZDoKLQlpZiAocmVzdWx0KSB7Ci0JCWFjcGlfdGhlcm1hbF9yZW1vdmVfZnMoZGV2aWNlKTsKLQkJa2ZyZWUodHopOwotCX0KLQorcmVtb3ZlX2ZzOgorCWFjcGlfdGhlcm1hbF9yZW1vdmVfZnMoZGV2aWNlKTsKK3VucmVnaXN0ZXJfdGhlcm1hbF96b25lOgorCXRoZXJtYWxfem9uZV9kZXZpY2VfdW5yZWdpc3Rlcih0ei0+dGhlcm1hbF96b25lKTsKK2ZyZWVfbWVtb3J5OgorCWtmcmVlKHR6KTsKK2VuZDoKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0xMzI5LDYgKzE2NjksNyBAQAogCX0KIAogCWFjcGlfdGhlcm1hbF9yZW1vdmVfZnMoZGV2aWNlKTsKKwlhY3BpX3RoZXJtYWxfdW5yZWdpc3Rlcl90aGVybWFsX3pvbmUodHopOwogCW11dGV4X2Rlc3Ryb3koJnR6LT5sb2NrKTsKIAlrZnJlZSh0eik7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Z2xvYmFsLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Z2xvYmFsLmMKaW5kZXggOTNlYTgyOS4uNjMwYzlhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGdsb2JhbC5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRnbG9iYWwuYwpAQCAtNjcxLDcgKzY3MSw2IEBACiAKIAkvKiBHUEUgc3VwcG9ydCAqLwogCi0JYWNwaV9ncGVfY291bnQgPSAwOwogCWFjcGlfZ2JsX2dwZV94cnVwdF9saXN0X2hlYWQgPSBOVUxMOwogCWFjcGlfZ2JsX2dwZV9mYWR0X2Jsb2Nrc1swXSA9IE5VTEw7CiAJYWNwaV9nYmxfZ3BlX2ZhZHRfYmxvY2tzWzFdID0gTlVMTDsKQEAgLTczNSw0ICs3MzQsMyBAQAogCiBBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9kYmdfbGV2ZWwpCiAgICAgQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZGJnX2xheWVyKQotICAgIEFDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dwZV9jb3VudCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS92aWRlby5jIGIvZHJpdmVycy9hY3BpL3ZpZGVvLmMKaW5kZXggYmQ3N2U4MS4uN2Y3MTRmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3ZpZGVvLmMKKysrIGIvZHJpdmVycy9hY3BpL3ZpZGVvLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CisjaW5jbHVkZSA8bGludXgvdGhlcm1hbC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvX291dHB1dC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTcyLDggKzczLDEyIEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkFDUEkgVmlkZW8gRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKK3N0YXRpYyBpbnQgYnJpZ2h0bmVzc19zd2l0Y2hfZW5hYmxlZCA9IDE7Cittb2R1bGVfcGFyYW0oYnJpZ2h0bmVzc19zd2l0Y2hfZW5hYmxlZCwgYm9vbCwgMDY0NCk7CisKIHN0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIHN0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CitzdGF0aWMgaW50IGFjcGlfdmlkZW9fcmVzdW1lKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCB2aWRlb19kZXZpY2VfaWRzW10gPSB7CiAJe0FDUElfVklERU9fSElELCAwfSwKQEAgLTg4LDYgKzkzLDcgQEAKIAkub3BzID0gewogCQkuYWRkID0gYWNwaV92aWRlb19idXNfYWRkLAogCQkucmVtb3ZlID0gYWNwaV92aWRlb19idXNfcmVtb3ZlLAorCQkucmVzdW1lID0gYWNwaV92aWRlb19yZXN1bWUsCiAJCX0sCiB9OwogCkBAIC0xNzksNiArMTg1LDcgQEAKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2VfYnJpZ2h0bmVzcyAqYnJpZ2h0bmVzczsKIAlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmFja2xpZ2h0OworCXN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2OwogCXN0cnVjdCBvdXRwdXRfZGV2aWNlICpvdXRwdXRfZGV2OwogfTsKIApAQCAtMjczLDcgKzI4MCw2IEBACiBzdGF0aWMgdm9pZCBhY3BpX3ZpZGVvX2RldmljZV9iaW5kKHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqdmlkZW8sCiAJCQkJICAgc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXZpY2UpOwogc3RhdGljIGludCBhY3BpX3ZpZGVvX2RldmljZV9lbnVtZXJhdGUoc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbyk7Ci1zdGF0aWMgaW50IGFjcGlfdmlkZW9fc3dpdGNoX291dHB1dChzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvLCBpbnQgZXZlbnQpOwogc3RhdGljIGludCBhY3BpX3ZpZGVvX2RldmljZV9sY2Rfc2V0X2xldmVsKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2aWNlLAogCQkJaW50IGxldmVsKTsKIHN0YXRpYyBpbnQgYWNwaV92aWRlb19kZXZpY2VfbGNkX2dldF9sZXZlbF9jdXJyZW50KApAQCAtMjkyLDE4ICsyOTgsMjYgQEAKIHN0YXRpYyBpbnQgYWNwaV92aWRlb19nZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCiB7CiAJdW5zaWduZWQgbG9uZyBjdXJfbGV2ZWw7CisJaW50IGk7CiAJc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICp2ZCA9CiAJCShzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKilibF9nZXRfZGF0YShiZCk7CiAJYWNwaV92aWRlb19kZXZpY2VfbGNkX2dldF9sZXZlbF9jdXJyZW50KHZkLCAmY3VyX2xldmVsKTsKLQlyZXR1cm4gKGludCkgY3VyX2xldmVsOworCWZvciAoaSA9IDI7IGkgPCB2ZC0+YnJpZ2h0bmVzcy0+Y291bnQ7IGkrKykgeworCQlpZiAodmQtPmJyaWdodG5lc3MtPmxldmVsc1tpXSA9PSBjdXJfbGV2ZWwpCisJCQkvKiBUaGUgZmlyc3QgdHdvIGVudHJpZXMgYXJlIHNwZWNpYWwgLSBzZWUgcGFnZSA1NzUKKwkJCSAgIG9mIHRoZSBBQ1BJIHNwZWMgMy4wICovCisJCQlyZXR1cm4gaS0yOworCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBhY3BpX3ZpZGVvX3NldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKIHsKLQlpbnQgcmVxdWVzdF9sZXZlbCA9IGJkLT5wcm9wcy5icmlnaHRuZXNzOworCWludCByZXF1ZXN0X2xldmVsID0gYmQtPnByb3BzLmJyaWdodG5lc3MrMjsKIAlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKnZkID0KIAkJKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqKWJsX2dldF9kYXRhKGJkKTsKLQlhY3BpX3ZpZGVvX2RldmljZV9sY2Rfc2V0X2xldmVsKHZkLCByZXF1ZXN0X2xldmVsKTsKKwlhY3BpX3ZpZGVvX2RldmljZV9sY2Rfc2V0X2xldmVsKHZkLAorCQkJCQl2ZC0+YnJpZ2h0bmVzcy0+bGV2ZWxzW3JlcXVlc3RfbGV2ZWxdKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzM0LDYgKzM0OCw1NCBAQAogCS5zZXRfc3RhdGUgPSBhY3BpX3ZpZGVvX291dHB1dF9zZXQsCiAJLmdldF9zdGF0dXMgPSBhY3BpX3ZpZGVvX291dHB1dF9nZXQsCiB9OworCisKKy8qIHRoZXJtYWwgY29vbGluZyBkZXZpY2UgY2FsbGJhY2tzICovCitzdGF0aWMgaW50IHZpZGVvX2dldF9tYXhfc3RhdGUoc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IGNkZXYtPmRldmRhdGE7CisJc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICp2aWRlbyA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2aWRlby0+YnJpZ2h0bmVzcy0+Y291bnQgLSAzKTsKK30KKworc3RhdGljIGludCB2aWRlb19nZXRfY3VyX3N0YXRlKHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBjZGV2LT5kZXZkYXRhOworCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqdmlkZW8gPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CisJdW5zaWduZWQgbG9uZyBsZXZlbDsKKwlpbnQgc3RhdGU7CisKKwlhY3BpX3ZpZGVvX2RldmljZV9sY2RfZ2V0X2xldmVsX2N1cnJlbnQodmlkZW8sICZsZXZlbCk7CisJZm9yIChzdGF0ZSA9IDI7IHN0YXRlIDwgdmlkZW8tPmJyaWdodG5lc3MtPmNvdW50OyBzdGF0ZSsrKQorCQlpZiAobGV2ZWwgPT0gdmlkZW8tPmJyaWdodG5lc3MtPmxldmVsc1tzdGF0ZV0pCisJCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKKwkJCQkgICAgICAgdmlkZW8tPmJyaWdodG5lc3MtPmNvdW50IC0gc3RhdGUgLSAxKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50Cit2aWRlb19zZXRfY3VyX3N0YXRlKHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2LCB1bnNpZ25lZCBpbnQgc3RhdGUpCit7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBjZGV2LT5kZXZkYXRhOworCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqdmlkZW8gPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CisJaW50IGxldmVsOworCisJaWYgKCBzdGF0ZSA+PSB2aWRlby0+YnJpZ2h0bmVzcy0+Y291bnQgLSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0YXRlID0gdmlkZW8tPmJyaWdodG5lc3MtPmNvdW50IC0gc3RhdGU7CisJbGV2ZWwgPSB2aWRlby0+YnJpZ2h0bmVzcy0+bGV2ZWxzW3N0YXRlIC0xXTsKKwlyZXR1cm4gYWNwaV92aWRlb19kZXZpY2VfbGNkX3NldF9sZXZlbCh2aWRlbywgbGV2ZWwpOworfQorCitzdGF0aWMgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzIHZpZGVvX2Nvb2xpbmdfb3BzID0geworCS5nZXRfbWF4X3N0YXRlID0gdmlkZW9fZ2V0X21heF9zdGF0ZSwKKwkuZ2V0X2N1cl9zdGF0ZSA9IHZpZGVvX2dldF9jdXJfc3RhdGUsCisJLnNldF9jdXJfc3RhdGUgPSB2aWRlb19zZXRfY3VyX3N0YXRlLAorfTsKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlbyBNYW5hZ2VtZW50CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNjUyLDcgKzcxNCw3IEBACiAJa2ZyZWUob2JqKTsKIAogCWlmIChkZXZpY2UtPmNhcC5fQkNMICYmIGRldmljZS0+Y2FwLl9CQ00gJiYgZGV2aWNlLT5jYXAuX0JRQyAmJiBtYXhfbGV2ZWwgPiAwKXsKLQkJdW5zaWduZWQgbG9uZyB0bXA7CisJCWludCByZXN1bHQ7CiAJCXN0YXRpYyBpbnQgY291bnQgPSAwOwogCQljaGFyICpuYW1lOwogCQluYW1lID0ga3phbGxvYyhNQVhfTkFNRV9MRU4sIEdGUF9LRVJORUwpOwpAQCAtNjYwLDE0ICs3MjIsMzAgQEAKIAkJCXJldHVybjsKIAogCQlzcHJpbnRmKG5hbWUsICJhY3BpX3ZpZGVvJWQiLCBjb3VudCsrKTsKLQkJYWNwaV92aWRlb19kZXZpY2VfbGNkX2dldF9sZXZlbF9jdXJyZW50KGRldmljZSwgJnRtcCk7CiAJCWRldmljZS0+YmFja2xpZ2h0ID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcihuYW1lLAogCQkJTlVMTCwgZGV2aWNlLCAmYWNwaV9iYWNrbGlnaHRfb3BzKTsKLQkJZGV2aWNlLT5iYWNrbGlnaHQtPnByb3BzLm1heF9icmlnaHRuZXNzID0gbWF4X2xldmVsOwotCQlkZXZpY2UtPmJhY2tsaWdodC0+cHJvcHMuYnJpZ2h0bmVzcyA9IChpbnQpdG1wOworCQlkZXZpY2UtPmJhY2tsaWdodC0+cHJvcHMubWF4X2JyaWdodG5lc3MgPSBkZXZpY2UtPmJyaWdodG5lc3MtPmNvdW50LTM7CisJCWRldmljZS0+YmFja2xpZ2h0LT5wcm9wcy5icmlnaHRuZXNzID0gYWNwaV92aWRlb19nZXRfYnJpZ2h0bmVzcyhkZXZpY2UtPmJhY2tsaWdodCk7CiAJCWJhY2tsaWdodF91cGRhdGVfc3RhdHVzKGRldmljZS0+YmFja2xpZ2h0KTsKLQogCQlrZnJlZShuYW1lKTsKKworCQlkZXZpY2UtPmNkZXYgPSB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX3JlZ2lzdGVyKCJMQ0QiLAorCQkJCQlkZXZpY2UtPmRldiwgJnZpZGVvX2Nvb2xpbmdfb3BzKTsKKwkJaWYgKGRldmljZS0+Y2RldikgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVgKKwkJCQkiJXMgaXMgcmVnaXN0ZXJlZCBhcyBjb29saW5nX2RldmljZSVkXG4iLAorCQkJCWRldmljZS0+ZGV2LT5kZXYuYnVzX2lkLCBkZXZpY2UtPmNkZXYtPmlkKTsKKwkJCXJlc3VsdCA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZkZXZpY2UtPmRldi0+ZGV2LmtvYmosCisJCQkJCSAgJmRldmljZS0+Y2Rldi0+ZGV2aWNlLmtvYmosCisJCQkJCSAgInRoZXJtYWxfY29vbGluZyIpOworCQkJaWYgKHJlc3VsdCkKKwkJCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJDcmVhdGUgc3lzZnMgbGlua1xuIik7CisJCQlyZXN1bHQgPSBzeXNmc19jcmVhdGVfbGluaygmZGV2aWNlLT5jZGV2LT5kZXZpY2Uua29iaiwKKwkJCQkJICAmZGV2aWNlLT5kZXYtPmRldi5rb2JqLAorCQkJCQkgICJkZXZpY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpCisJCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiQ3JlYXRlIHN5c2ZzIGxpbmtcbiIpOworCQl9CiAJfQogCWlmIChkZXZpY2UtPmNhcC5fRENTICYmIGRldmljZS0+Y2FwLl9EU1MpewogCQlzdGF0aWMgaW50IGNvdW50ID0gMDsKQEAgLTcyNiwxMSArODA0LDQwIEBACiBzdGF0aWMgaW50IGFjcGlfdmlkZW9fYnVzX2NoZWNrKHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqdmlkZW8pCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gLUVOT0VOVDsKLQorCWxvbmcgZGV2aWNlX2lkOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZTsKIAogCWlmICghdmlkZW8pCiAJCXJldHVybiAtRUlOVkFMOwogCisJZGV2aWNlID0gdmlkZW8tPmRldmljZTsKKworCXN0YXR1cyA9CisJICAgIGFjcGlfZXZhbHVhdGVfaW50ZWdlcihkZXZpY2UtPmhhbmRsZSwgIl9BRFIiLCBOVUxMLCAmZGV2aWNlX2lkKTsKKworCWlmICghQUNQSV9TVUNDRVNTKHN0YXR1cykpCisJCXJldHVybiAtRU5PREVWOworCisJLyogV2UgbmVlZCB0byBhdHRlbXB0IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBfQURSIHJlZmVycyB0byBhCisJICAgUENJIGRldmljZSBvciBub3QuIFRoZXJlJ3Mgbm8gdGVycmlibHkgZ29vZCB3YXkgdG8gZG8gdGhpcywKKwkgICBzbyB0aGUgYmVzdCB3ZSBjYW4gaG9wZSBmb3IgaXMgdG8gYXNzdW1lIHRoYXQgdGhlcmUnbGwgbmV2ZXIKKwkgICBiZSBhIHZpZGVvIGRldmljZSBpbiB0aGUgaG9zdCBicmlkZ2UgKi8KKwlpZiAoZGV2aWNlX2lkID49IDB4MTAwMDApIHsKKwkJLyogSXQgbG9va3MgbGlrZSBhIFBDSSBkZXZpY2UuIERvZXMgaXQgZXhpc3Q/ICovCisJCWRldiA9IGFjcGlfZ2V0X3BoeXNpY2FsX2RldmljZShkZXZpY2UtPmhhbmRsZSk7CisJfSBlbHNlIHsKKwkJLyogSXQgZG9lc24ndCBsb29rIGxpa2UgYSBQQ0kgZGV2aWNlLiBEb2VzIGl0cyBwYXJlbnQKKwkJICAgZXhpc3Q/ICovCisJCWFjcGlfaGFuZGxlIHBoYW5kbGU7CisJCWlmIChhY3BpX2dldF9wYXJlbnQoZGV2aWNlLT5oYW5kbGUsICZwaGFuZGxlKSkKKwkJCXJldHVybiAtRU5PREVWOworCQlkZXYgPSBhY3BpX2dldF9waHlzaWNhbF9kZXZpY2UocGhhbmRsZSk7CisJfQorCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKwlwdXRfZGV2aWNlKGRldik7CisKIAkvKiBTaW5jZSB0aGVyZSBpcyBubyBISUQsIENJRCBhbmQgc28gb24gZm9yIFZHQSBkcml2ZXIsIHdlIGhhdmUKIAkgKiB0byBjaGVjayB3ZWxsIGtub3duIHJlcXVpcmVkIG5vZGVzLgogCSAqLwpAQCAtMTI1Niw4ICsxMzYzLDM3IEBACiAKIHN0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfYWRkX2ZzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogeworCWxvbmcgZGV2aWNlX2lkOworCWludCBzdGF0dXM7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeSA9IE5VTEw7CiAJc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwlzdGF0dXMgPQorCSAgICBhY3BpX2V2YWx1YXRlX2ludGVnZXIoZGV2aWNlLT5oYW5kbGUsICJfQURSIiwgTlVMTCwgJmRldmljZV9pZCk7CisKKwlpZiAoIUFDUElfU1VDQ0VTUyhzdGF0dXMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIFdlIG5lZWQgdG8gYXR0ZW1wdCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgX0FEUiByZWZlcnMgdG8gYQorCSAgIFBDSSBkZXZpY2Ugb3Igbm90LiBUaGVyZSdzIG5vIHRlcnJpYmx5IGdvb2Qgd2F5IHRvIGRvIHRoaXMsCisJICAgc28gdGhlIGJlc3Qgd2UgY2FuIGhvcGUgZm9yIGlzIHRvIGFzc3VtZSB0aGF0IHRoZXJlJ2xsIG5ldmVyCisJICAgYmUgYSB2aWRlbyBkZXZpY2UgaW4gdGhlIGhvc3QgYnJpZGdlICovCisJaWYgKGRldmljZV9pZCA+PSAweDEwMDAwKSB7CisJCS8qIEl0IGxvb2tzIGxpa2UgYSBQQ0kgZGV2aWNlLiBEb2VzIGl0IGV4aXN0PyAqLworCQlkZXYgPSBhY3BpX2dldF9waHlzaWNhbF9kZXZpY2UoZGV2aWNlLT5oYW5kbGUpOworCX0gZWxzZSB7CisJCS8qIEl0IGRvZXNuJ3QgbG9vayBsaWtlIGEgUENJIGRldmljZS4gRG9lcyBpdHMgcGFyZW50CisJCSAgIGV4aXN0PyAqLworCQlhY3BpX2hhbmRsZSBwaGFuZGxlOworCQlpZiAoYWNwaV9nZXRfcGFyZW50KGRldmljZS0+aGFuZGxlLCAmcGhhbmRsZSkpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJZGV2ID0gYWNwaV9nZXRfcGh5c2ljYWxfZGV2aWNlKHBoYW5kbGUpOworCX0KKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisJcHV0X2RldmljZShkZXYpOworCiAKIAogCXZpZGVvID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwpAQCAtMTU4MCw2NCArMTcxNiw2IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotLyoKLSAqICBBcmc6Ci0gKiAgCXZpZGVvCTogdmlkZW8gYnVzIGRldmljZSAKLSAqICAJZXZlbnQJOiBub3RpZnkgZXZlbnQKLSAqCi0gKiAgUmV0dXJuOgotICogIAk8IDAJOiBlcnJvcgotICogIAotICoJMS4gRmluZCBvdXQgdGhlIGN1cnJlbnQgYWN0aXZlIG91dHB1dCBkZXZpY2UuCi0gKgkyLiBJZGVudGlmeSB0aGUgbmV4dCBvdXRwdXQgZGV2aWNlIHRvIHN3aXRjaCB0by4KLSAqCTMuIGNhbGwgX0RTUyB0byBkbyBhY3R1YWwgc3dpdGNoLgotICovCi0KLXN0YXRpYyBpbnQgYWNwaV92aWRlb19zd2l0Y2hfb3V0cHV0KHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqdmlkZW8sIGludCBldmVudCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlOwotCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldl9uZXh0ID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldl9wcmV2ID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIHN0YXRlOwotCWludCBzdGF0dXMgPSAwOwotCi0JbXV0ZXhfbG9jaygmdmlkZW8tPmRldmljZV9saXN0X2xvY2spOwotCi0JbGlzdF9mb3JfZWFjaChub2RlLCAmdmlkZW8tPnZpZGVvX2RldmljZV9saXN0KSB7Ci0JCWRldiA9IGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UsIGVudHJ5KTsKLQkJc3RhdHVzID0gYWNwaV92aWRlb19kZXZpY2VfZ2V0X3N0YXRlKGRldiwgJnN0YXRlKTsKLQkJaWYgKHN0YXRlICYgMHgyKSB7Ci0JCQlkZXZfbmV4dCA9IGNvbnRhaW5lcl9vZihub2RlLT5uZXh0LAotCQkJCQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UsIGVudHJ5KTsKLQkJCWRldl9wcmV2ID0gY29udGFpbmVyX29mKG5vZGUtPnByZXYsCi0JCQkJCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSwgZW50cnkpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLQlkZXZfbmV4dCA9IGNvbnRhaW5lcl9vZihub2RlLT5uZXh0LCBzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UsIGVudHJ5KTsKLQlkZXZfcHJldiA9IGNvbnRhaW5lcl9vZihub2RlLT5wcmV2LCBzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UsIGVudHJ5KTsKLQotIG91dDoKLQltdXRleF91bmxvY2soJnZpZGVvLT5kZXZpY2VfbGlzdF9sb2NrKTsKLQotCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIEFDUElfVklERU9fTk9USUZZX0NZQ0xFOgotCWNhc2UgQUNQSV9WSURFT19OT1RJRllfTkVYVF9PVVRQVVQ6Ci0JCWFjcGlfdmlkZW9fZGV2aWNlX3NldF9zdGF0ZShkZXYsIDApOwotCQlhY3BpX3ZpZGVvX2RldmljZV9zZXRfc3RhdGUoZGV2X25leHQsIDB4ODAwMDAwMDEpOwotCQlicmVhazsKLQljYXNlIEFDUElfVklERU9fTk9USUZZX1BSRVZfT1VUUFVUOgotCQlhY3BpX3ZpZGVvX2RldmljZV9zZXRfc3RhdGUoZGV2LCAwKTsKLQkJYWNwaV92aWRlb19kZXZpY2Vfc2V0X3N0YXRlKGRldl9wcmV2LCAweDgwMDAwMDAxKTsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCiBzdGF0aWMgaW50CiBhY3BpX3ZpZGVvX2dldF9uZXh0X2xldmVsKHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGV2aWNlLAogCQkJICB1MzIgbGV2ZWxfY3VycmVudCwgdTMyIGV2ZW50KQpAQCAtMTcyOSw2ICsxODA3LDE0IEBACiAJCQkJCSAgICBBQ1BJX0RFVklDRV9OT1RJRlksCiAJCQkJCSAgICBhY3BpX3ZpZGVvX2RldmljZV9ub3RpZnkpOwogCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihkZXZpY2UtPmJhY2tsaWdodCk7CisJaWYgKGRldmljZS0+Y2RldikgeworCQlzeXNmc19yZW1vdmVfbGluaygmZGV2aWNlLT5kZXYtPmRldi5rb2JqLAorCQkJCSAgInRoZXJtYWxfY29vbGluZyIpOworCQlzeXNmc19yZW1vdmVfbGluaygmZGV2aWNlLT5jZGV2LT5kZXZpY2Uua29iaiwKKwkJCQkgICJkZXZpY2UiKTsKKwkJdGhlcm1hbF9jb29saW5nX2RldmljZV91bnJlZ2lzdGVyKGRldmljZS0+Y2Rldik7CisJCWRldmljZS0+Y2RldiA9IE5VTEw7CisJfQogCXZpZGVvX291dHB1dF91bnJlZ2lzdGVyKGRldmljZS0+b3V0cHV0X2Rldik7CiAKIAlyZXR1cm4gMDsKQEAgLTE3OTcsMjMgKzE4ODMsMTkgQEAKIAkJCQkJICogY29ubmVjdG9yLiAqLwogCQlhY3BpX3ZpZGVvX2RldmljZV9lbnVtZXJhdGUodmlkZW8pOwogCQlhY3BpX3ZpZGVvX2RldmljZV9yZWJpbmQodmlkZW8pOwotCQlhY3BpX3ZpZGVvX3N3aXRjaF9vdXRwdXQodmlkZW8sIGV2ZW50KTsKIAkJYWNwaV9idXNfZ2VuZXJhdGVfcHJvY19ldmVudChkZXZpY2UsIGV2ZW50LCAwKTsKIAkJa2V5Y29kZSA9IEtFWV9TV0lUQ0hWSURFT01PREU7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1ZJREVPX05PVElGWV9DWUNMRToJLyogQ3ljbGUgRGlzcGxheSBvdXRwdXQgaG90a2V5IHByZXNzZWQuICovCi0JCWFjcGlfdmlkZW9fc3dpdGNoX291dHB1dCh2aWRlbywgZXZlbnQpOwogCQlhY3BpX2J1c19nZW5lcmF0ZV9wcm9jX2V2ZW50KGRldmljZSwgZXZlbnQsIDApOwogCQlrZXljb2RlID0gS0VZX1NXSVRDSFZJREVPTU9ERTsKIAkJYnJlYWs7CiAJY2FzZSBBQ1BJX1ZJREVPX05PVElGWV9ORVhUX09VVFBVVDoJLyogTmV4dCBEaXNwbGF5IG91dHB1dCBob3RrZXkgcHJlc3NlZC4gKi8KLQkJYWNwaV92aWRlb19zd2l0Y2hfb3V0cHV0KHZpZGVvLCBldmVudCk7CiAJCWFjcGlfYnVzX2dlbmVyYXRlX3Byb2NfZXZlbnQoZGV2aWNlLCBldmVudCwgMCk7CiAJCWtleWNvZGUgPSBLRVlfVklERU9fTkVYVDsKIAkJYnJlYWs7CiAJY2FzZSBBQ1BJX1ZJREVPX05PVElGWV9QUkVWX09VVFBVVDoJLyogcHJldmlvdXMgRGlzcGxheSBvdXRwdXQgaG90a2V5IHByZXNzZWQuICovCi0JCWFjcGlfdmlkZW9fc3dpdGNoX291dHB1dCh2aWRlbywgZXZlbnQpOwogCQlhY3BpX2J1c19nZW5lcmF0ZV9wcm9jX2V2ZW50KGRldmljZSwgZXZlbnQsIDApOwogCQlrZXljb2RlID0gS0VZX1ZJREVPX1BSRVY7CiAJCWJyZWFrOwpAQCAtMTgyNSw2ICsxOTA3LDcgQEAKIAkJYnJlYWs7CiAJfQogCisJYWNwaV9ub3RpZmllcl9jYWxsX2NoYWluKGRldmljZSwgZXZlbnQsIDApOwogCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIGtleWNvZGUsIDEpOwogCWlucHV0X3N5bmMoaW5wdXQpOwogCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIGtleWNvZGUsIDApOwpAQCAtMTg1MCwyNyArMTkzMywzMiBAQAogCiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgQUNQSV9WSURFT19OT1RJRllfQ1lDTEVfQlJJR0hUTkVTUzoJLyogQ3ljbGUgYnJpZ2h0bmVzcyAqLwotCQlhY3BpX3ZpZGVvX3N3aXRjaF9icmlnaHRuZXNzKHZpZGVvX2RldmljZSwgZXZlbnQpOworCQlpZiAoYnJpZ2h0bmVzc19zd2l0Y2hfZW5hYmxlZCkKKwkJCWFjcGlfdmlkZW9fc3dpdGNoX2JyaWdodG5lc3ModmlkZW9fZGV2aWNlLCBldmVudCk7CiAJCWFjcGlfYnVzX2dlbmVyYXRlX3Byb2NfZXZlbnQoZGV2aWNlLCBldmVudCwgMCk7CiAJCWtleWNvZGUgPSBLRVlfQlJJR0hUTkVTU19DWUNMRTsKIAkJYnJlYWs7CiAJY2FzZSBBQ1BJX1ZJREVPX05PVElGWV9JTkNfQlJJR0hUTkVTUzoJLyogSW5jcmVhc2UgYnJpZ2h0bmVzcyAqLwotCQlhY3BpX3ZpZGVvX3N3aXRjaF9icmlnaHRuZXNzKHZpZGVvX2RldmljZSwgZXZlbnQpOworCQlpZiAoYnJpZ2h0bmVzc19zd2l0Y2hfZW5hYmxlZCkKKwkJCWFjcGlfdmlkZW9fc3dpdGNoX2JyaWdodG5lc3ModmlkZW9fZGV2aWNlLCBldmVudCk7CiAJCWFjcGlfYnVzX2dlbmVyYXRlX3Byb2NfZXZlbnQoZGV2aWNlLCBldmVudCwgMCk7CiAJCWtleWNvZGUgPSBLRVlfQlJJR0hUTkVTU1VQOwogCQlicmVhazsKIAljYXNlIEFDUElfVklERU9fTk9USUZZX0RFQ19CUklHSFRORVNTOgkvKiBEZWNyZWFzZSBicmlnaHRuZXNzICovCi0JCWFjcGlfdmlkZW9fc3dpdGNoX2JyaWdodG5lc3ModmlkZW9fZGV2aWNlLCBldmVudCk7CisJCWlmIChicmlnaHRuZXNzX3N3aXRjaF9lbmFibGVkKQorCQkJYWNwaV92aWRlb19zd2l0Y2hfYnJpZ2h0bmVzcyh2aWRlb19kZXZpY2UsIGV2ZW50KTsKIAkJYWNwaV9idXNfZ2VuZXJhdGVfcHJvY19ldmVudChkZXZpY2UsIGV2ZW50LCAwKTsKIAkJa2V5Y29kZSA9IEtFWV9CUklHSFRORVNTRE9XTjsKIAkJYnJlYWs7CiAJY2FzZSBBQ1BJX1ZJREVPX05PVElGWV9aRVJPX0JSSUdIVE5FU1M6CS8qIHplcm8gYnJpZ2h0bmVzc3MgKi8KLQkJYWNwaV92aWRlb19zd2l0Y2hfYnJpZ2h0bmVzcyh2aWRlb19kZXZpY2UsIGV2ZW50KTsKKwkJaWYgKGJyaWdodG5lc3Nfc3dpdGNoX2VuYWJsZWQpCisJCQlhY3BpX3ZpZGVvX3N3aXRjaF9icmlnaHRuZXNzKHZpZGVvX2RldmljZSwgZXZlbnQpOwogCQlhY3BpX2J1c19nZW5lcmF0ZV9wcm9jX2V2ZW50KGRldmljZSwgZXZlbnQsIDApOwogCQlrZXljb2RlID0gS0VZX0JSSUdIVE5FU1NfWkVSTzsKIAkJYnJlYWs7CiAJY2FzZSBBQ1BJX1ZJREVPX05PVElGWV9ESVNQTEFZX09GRjoJLyogZGlzcGxheSBkZXZpY2Ugb2ZmICovCi0JCWFjcGlfdmlkZW9fc3dpdGNoX2JyaWdodG5lc3ModmlkZW9fZGV2aWNlLCBldmVudCk7CisJCWlmIChicmlnaHRuZXNzX3N3aXRjaF9lbmFibGVkKQorCQkJYWNwaV92aWRlb19zd2l0Y2hfYnJpZ2h0bmVzcyh2aWRlb19kZXZpY2UsIGV2ZW50KTsKIAkJYWNwaV9idXNfZ2VuZXJhdGVfcHJvY19ldmVudChkZXZpY2UsIGV2ZW50LCAwKTsKIAkJa2V5Y29kZSA9IEtFWV9ESVNQTEFZX09GRjsKIAkJYnJlYWs7CkBAIC0xODgxLDYgKzE5NjksNyBAQAogCQlicmVhazsKIAl9CiAKKwlhY3BpX25vdGlmaWVyX2NhbGxfY2hhaW4oZGV2aWNlLCBldmVudCwgMCk7CiAJaW5wdXRfcmVwb3J0X2tleShpbnB1dCwga2V5Y29kZSwgMSk7CiAJaW5wdXRfc3luYyhpbnB1dCk7CiAJaW5wdXRfcmVwb3J0X2tleShpbnB1dCwga2V5Y29kZSwgMCk7CkBAIC0xODkwLDYgKzE5NzksMjUgQEAKIH0KIAogc3RhdGljIGludCBpbnN0YW5jZTsKK3N0YXRpYyBpbnQgYWNwaV92aWRlb19yZXN1bWUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbzsKKwlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKnZpZGVvX2RldmljZTsKKwlpbnQgaTsKKworCWlmICghZGV2aWNlIHx8ICFhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJdmlkZW8gPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmlkZW8tPmF0dGFjaGVkX2NvdW50OyBpKyspIHsKKwkJdmlkZW9fZGV2aWNlID0gdmlkZW8tPmF0dGFjaGVkX2FycmF5W2ldLmJpbmRfaW5mbzsKKwkJaWYgKHZpZGVvX2RldmljZSAmJiB2aWRlb19kZXZpY2UtPmJhY2tsaWdodCkKKwkJCWFjcGlfdmlkZW9fc2V0X2JyaWdodG5lc3ModmlkZW9fZGV2aWNlLT5iYWNrbGlnaHQpOworCX0KKwlyZXR1cm4gQUVfT0s7Cit9CisKIHN0YXRpYyBpbnQgYWNwaV92aWRlb19idXNfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS93bWkuYyBiL2RyaXZlcnMvYWNwaS93bWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmI4NGFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL3dtaS5jCkBAIC0wLDAgKzEsNzEwIEBACisvKgorICogIEFDUEktV01JIG1hcHBpbmcgZHJpdmVyCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IENhcmxvcyBDb3JiYWNobyA8Y2FybG9zQHN0cmFuZ2V3b3JsZHMuY28udWs+CisgKgorICogIEdVSUQgcGFyc2luZyBjb2RlIGZyb20gbGRtLmMgaXM6CisgKiAgIENvcHlyaWdodCAoQykgMjAwMSwyMDAyIFJpY2hhcmQgUnVzc29uIDxsZG1AZmxhdGNhcC5vcmc+CisgKiAgIENvcHlyaWdodCAoYykgMjAwMS0yMDA3IEFudG9uIEFsdGFwYXJtYWtvdgorICogICBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiBKYWtvYiBLZW1pIDxqYWtvYi5rZW1pQHRlbGlhLmNvbT4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EuCisgKgorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KKworQUNQSV9NT0RVTEVfTkFNRSgid21pIik7CitNT0RVTEVfQVVUSE9SKCJDYXJsb3MgQ29yYmFjaG8iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUNQSS1XTUkgTWFwcGluZyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBBQ1BJX1dNSV9DTEFTUyAid21pIgorCisjdW5kZWYgUFJFRklYCisjZGVmaW5lIFBSRUZJWCAiQUNQSTogV01JOiAiCisKK3N0YXRpYyBERUZJTkVfTVVURVgod21pX2RhdGFfbG9jayk7CisKK3N0cnVjdCBndWlkX2Jsb2NrIHsKKwljaGFyIGd1aWRbMTZdOworCXVuaW9uIHsKKwkJY2hhciBvYmplY3RfaWRbMl07CisJCXN0cnVjdCB7CisJCQl1bnNpZ25lZCBjaGFyIG5vdGlmeV9pZDsKKwkJCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQ7CisJCX07CisJfTsKKwl1OCBpbnN0YW5jZV9jb3VudDsKKwl1OCBmbGFnczsKK307CisKK3N0cnVjdCB3bWlfYmxvY2sgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZ3VpZF9ibG9jayBnYmxvY2s7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCXdtaV9ub3RpZnlfaGFuZGxlciBoYW5kbGVyOworCXZvaWQgKmhhbmRsZXJfZGF0YTsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgd21pX2Jsb2NrIHdtaV9ibG9ja3M7CisKKy8qCisgKiBJZiB0aGUgR1VJRCBkYXRhIGJsb2NrIGlzIG1hcmtlZCBhcyBleHBlbnNpdmUsIHdlIG11c3QgZW5hYmxlIGFuZAorICogZXhwbGljaXRpbHkgZGlzYWJsZSBkYXRhIGNvbGxlY3Rpb24uCisgKi8KKyNkZWZpbmUgQUNQSV9XTUlfRVhQRU5TSVZFICAgMHgxCisjZGVmaW5lIEFDUElfV01JX01FVEhPRCAgICAgIDB4MgkvKiBHVUlEIGlzIGEgbWV0aG9kICovCisjZGVmaW5lIEFDUElfV01JX1NUUklORyAgICAgIDB4NAkvKiBHVUlEIHRha2VzICYgcmV0dXJucyBhIHN0cmluZyAqLworI2RlZmluZSBBQ1BJX1dNSV9FVkVOVCAgICAgICAweDgJLyogR1VJRCBpcyBhbiBldmVudCAqLworCitzdGF0aWMgaW50IGFjcGlfd21pX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOworc3RhdGljIGludCBhY3BpX3dtaV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIHdtaV9kZXZpY2VfaWRzW10gPSB7CisJeyJQTlAwQzE0IiwgMH0sCisJeyJwbnAwYzE0IiwgMH0sCisJeyIiLCAwfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIHdtaV9kZXZpY2VfaWRzKTsKKworc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX3dtaV9kcml2ZXIgPSB7CisJLm5hbWUgPSAid21pIiwKKwkuY2xhc3MgPSBBQ1BJX1dNSV9DTEFTUywKKwkuaWRzID0gd21pX2RldmljZV9pZHMsCisJLm9wcyA9IHsKKwkJLmFkZCA9IGFjcGlfd21pX2FkZCwKKwkJLnJlbW92ZSA9IGFjcGlfd21pX3JlbW92ZSwKKwkJfSwKK307CisKKy8qCisgKiBHVUlEIHBhcnNpbmcgZnVuY3Rpb25zCisgKi8KKworLyoqCisgKiB3bWlfcGFyc2VfaGV4Ynl0ZSAtIENvbnZlcnQgYSBBU0NJSSBoZXggbnVtYmVyIHRvIGEgYnl0ZQorICogQHNyYzogIFBvaW50ZXIgdG8gYXQgbGVhc3QgMiBjaGFyYWN0ZXJzIHRvIGNvbnZlcnQuCisgKgorICogQ29udmVydCBhIHR3byBjaGFyYWN0ZXIgQVNDSUkgaGV4IHN0cmluZyB0byBhIG51bWJlci4KKyAqCisgKiBSZXR1cm46ICAwLTI1NSAgU3VjY2VzcywgdGhlIGJ5dGUgd2FzIHBhcnNlZCBjb3JyZWN0bHkKKyAqICAgICAgICAgIC0xICAgICBFcnJvciwgYW4gaW52YWxpZCBjaGFyYWN0ZXIgd2FzIHN1cHBsaWVkCisgKi8KK3N0YXRpYyBpbnQgd21pX3BhcnNlX2hleGJ5dGUoY29uc3QgdTggKnNyYykKK3sKKwl1bnNpZ25lZCBpbnQgeDsgLyogRm9yIGNvcnJlY3Qgd3JhcHBpbmcgKi8KKwlpbnQgaDsKKworCS8qIGhpZ2ggcGFydCAqLworCXggPSBzcmNbMF07CisJaWYgKHggLSAnMCcgPD0gJzknIC0gJzAnKSB7CisJCWggPSB4IC0gJzAnOworCX0gZWxzZSBpZiAoeCAtICdhJyA8PSAnZicgLSAnYScpIHsKKwkJaCA9IHggLSAnYScgKyAxMDsKKwl9IGVsc2UgaWYgKHggLSAnQScgPD0gJ0YnIC0gJ0EnKSB7CisJCWggPSB4IC0gJ0EnICsgMTA7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC0xOworCX0KKwloIDw8PSA0OworCisJLyogbG93IHBhcnQgKi8KKwl4ID0gc3JjWzFdOworCWlmICh4IC0gJzAnIDw9ICc5JyAtICcwJykKKwkJcmV0dXJuIGggfCAoeCAtICcwJyk7CisJaWYgKHggLSAnYScgPD0gJ2YnIC0gJ2EnKQorCQlyZXR1cm4gaCB8ICh4IC0gJ2EnICsgMTApOworCWlmICh4IC0gJ0EnIDw9ICdGJyAtICdBJykKKwkJcmV0dXJuIGggfCAoeCAtICdBJyArIDEwKTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qKgorICogd21pX3N3YXBfYnl0ZXMgLSBSZWFycmFuZ2UgR1VJRCBieXRlcyB0byBtYXRjaCBHVUlEIGJpbmFyeQorICogQHNyYzogICBNZW1vcnkgYmxvY2sgaG9sZGluZyBiaW5hcnkgR1VJRCAoMTYgYnl0ZXMpCisgKiBAZGVzdDogIE1lbW9yeSBibG9jayB0byBob2xkIGJ5dGUgc3dhcHBlZCBiaW5hcnkgR1VJRCAoMTYgYnl0ZXMpCisgKgorICogQnl0ZSBzd2FwIGEgYmluYXJ5IEdVSUQgdG8gbWF0Y2ggaXQncyByZWFsIEdVSUQgdmFsdWUKKyAqLworc3RhdGljIHZvaWQgd21pX3N3YXBfYnl0ZXModTggKnNyYywgdTggKmRlc3QpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IDM7IGkrKykKKwkJbWVtY3B5KGRlc3QgKyBpLCBzcmMgKyAoMyAtIGkpLCAxKTsKKworCWZvciAoaSA9IDA7IGkgPD0gMTsgaSsrKQorCQltZW1jcHkoZGVzdCArIDQgKyBpLCBzcmMgKyAoNSAtIGkpLCAxKTsKKworCWZvciAoaSA9IDA7IGkgPD0gMTsgaSsrKQorCQltZW1jcHkoZGVzdCArIDYgKyBpLCBzcmMgKyAoNyAtIGkpLCAxKTsKKworCW1lbWNweShkZXN0ICsgOCwgc3JjICsgOCwgOCk7Cit9CisKKy8qKgorICogd21pX3BhcnNlX2d1aWQgLSBDb252ZXJ0IEdVSUQgZnJvbSBBU0NJSSB0byBiaW5hcnkKKyAqIEBzcmM6ICAgMzYgY2hhciBzdHJpbmcgb2YgdGhlIGZvcm0gZmE1MGZmMmItZjJlOC00NWRlLTgzZmEtNjU0MTdmMmY0OWJhCisgKiBAZGVzdDogIE1lbW9yeSBibG9jayB0byBob2xkIGJpbmFyeSBHVUlEICgxNiBieXRlcykKKyAqCisgKiBOLkIuIFRoZSBHVUlEIG5lZWQgbm90IGJlIE5VTEwgdGVybWluYXRlZC4KKyAqCisgKiBSZXR1cm46ICAndHJ1ZScgICBAZGVzdCBjb250YWlucyBiaW5hcnkgR1VJRAorICogICAgICAgICAgJ2ZhbHNlJyAgQGRlc3QgY29udGVudHMgYXJlIHVuZGVmaW5lZAorICovCitzdGF0aWMgYm9vbCB3bWlfcGFyc2VfZ3VpZChjb25zdCB1OCAqc3JjLCB1OCAqZGVzdCkKK3sKKwlzdGF0aWMgY29uc3QgaW50IHNpemVbXSA9IHsgNCwgMiwgMiwgMiwgNiB9OworCWludCBpLCBqLCB2OworCisJaWYgKHNyY1s4XSAgIT0gJy0nIHx8IHNyY1sxM10gIT0gJy0nIHx8CisJCXNyY1sxOF0gIT0gJy0nIHx8IHNyY1syM10gIT0gJy0nKQorCQlyZXR1cm4gZmFsc2U7CisKKwlmb3IgKGogPSAwOyBqIDwgNTsgaisrLCBzcmMrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZVtqXTsgaSsrLCBzcmMgKz0gMiwgKmRlc3QrKyA9IHYpIHsKKwkJCXYgPSB3bWlfcGFyc2VfaGV4Ynl0ZShzcmMpOworCQkJaWYgKHYgPCAwKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBmaW5kX2d1aWQoY29uc3QgY2hhciAqZ3VpZF9zdHJpbmcsIHN0cnVjdCB3bWlfYmxvY2sgKipvdXQpCit7CisJY2hhciB0bXBbMTZdLCBndWlkX2lucHV0WzE2XTsKKwlzdHJ1Y3Qgd21pX2Jsb2NrICp3YmxvY2s7CisJc3RydWN0IGd1aWRfYmxvY2sgKmJsb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisKKwl3bWlfcGFyc2VfZ3VpZChndWlkX3N0cmluZywgdG1wKTsKKwl3bWlfc3dhcF9ieXRlcyh0bXAsIGd1aWRfaW5wdXQpOworCisJbGlzdF9mb3JfZWFjaChwLCAmd21pX2Jsb2Nrcy5saXN0KSB7CisJCXdibG9jayA9IGxpc3RfZW50cnkocCwgc3RydWN0IHdtaV9ibG9jaywgbGlzdCk7CisJCWJsb2NrID0gJndibG9jay0+Z2Jsb2NrOworCisJCWlmIChtZW1jbXAoYmxvY2stPmd1aWQsIGd1aWRfaW5wdXQsIDE2KSA9PSAwKSB7CisJCQlpZiAob3V0KQorCQkJCSpvdXQgPSB3YmxvY2s7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEV4cG9ydGVkIFdNSSBmdW5jdGlvbnMKKyAqLworLyoqCisgKiB3bWlfZXZhbHVhdGVfbWV0aG9kIC0gRXZhbHVhdGUgYSBXTUkgbWV0aG9kCisgKiBAZ3VpZF9zdHJpbmc6IDM2IGNoYXIgc3RyaW5nIG9mIHRoZSBmb3JtIGZhNTBmZjJiLWYyZTgtNDVkZS04M2ZhLTY1NDE3ZjJmNDliYQorICogQGluc3RhbmNlOiBJbnN0YW5jZSBpbmRleAorICogQG1ldGhvZF9pZDogTWV0aG9kIElEIHRvIGNhbGwKKyAqICZpbjogQnVmZmVyIGNvbnRhaW5pbmcgaW5wdXQgZm9yIHRoZSBtZXRob2QgY2FsbAorICogJm91dDogRW1wdHkgYnVmZmVyIHRvIHJldHVybiB0aGUgbWV0aG9kIHJlc3VsdHMKKyAqCisgKiBDYWxsIGFuIEFDUEktV01JIG1ldGhvZAorICovCithY3BpX3N0YXR1cyB3bWlfZXZhbHVhdGVfbWV0aG9kKGNvbnN0IGNoYXIgKmd1aWRfc3RyaW5nLCB1OCBpbnN0YW5jZSwKK3UzMiBtZXRob2RfaWQsIGNvbnN0IHN0cnVjdCBhY3BpX2J1ZmZlciAqaW4sIHN0cnVjdCBhY3BpX2J1ZmZlciAqb3V0KQoreworCXN0cnVjdCBndWlkX2Jsb2NrICpibG9jayA9IE5VTEw7CisJc3RydWN0IHdtaV9ibG9jayAqd2Jsb2NrID0gTlVMTDsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGlucHV0OworCXVuaW9uIGFjcGlfb2JqZWN0IHBhcmFtc1szXTsKKwljaGFyIG1ldGhvZFs0XSA9ICJXTSI7CisKKwlpZiAoIWZpbmRfZ3VpZChndWlkX3N0cmluZywgJndibG9jaykpCisJCXJldHVybiBBRV9CQURfQUREUkVTUzsKKworCWJsb2NrID0gJndibG9jay0+Z2Jsb2NrOworCWhhbmRsZSA9IHdibG9jay0+aGFuZGxlOworCisJaWYgKCFibG9jay0+ZmxhZ3MgJiBBQ1BJX1dNSV9NRVRIT0QpCisJCXJldHVybiBBRV9CQURfREFUQTsKKworCWlmIChibG9jay0+aW5zdGFuY2VfY291bnQgPCBpbnN0YW5jZSkKKwkJcmV0dXJuIEFFX0JBRF9QQVJBTUVURVI7CisKKwlpbnB1dC5jb3VudCA9IDI7CisJaW5wdXQucG9pbnRlciA9IHBhcmFtczsKKwlwYXJhbXNbMF0udHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOworCXBhcmFtc1swXS5pbnRlZ2VyLnZhbHVlID0gaW5zdGFuY2U7CisJcGFyYW1zWzFdLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKKwlwYXJhbXNbMV0uaW50ZWdlci52YWx1ZSA9IG1ldGhvZF9pZDsKKworCWlmIChpbikgeworCQlpbnB1dC5jb3VudCA9IDM7CisKKwkJaWYgKGJsb2NrLT5mbGFncyAmIEFDUElfV01JX1NUUklORykgeworCQkJcGFyYW1zWzJdLnR5cGUgPSBBQ1BJX1RZUEVfU1RSSU5HOworCQl9IGVsc2UgeworCQkJcGFyYW1zWzJdLnR5cGUgPSBBQ1BJX1RZUEVfQlVGRkVSOworCQl9CisJCXBhcmFtc1syXS5idWZmZXIubGVuZ3RoID0gaW4tPmxlbmd0aDsKKwkJcGFyYW1zWzJdLmJ1ZmZlci5wb2ludGVyID0gaW4tPnBvaW50ZXI7CisJfQorCisJc3RybmNhdChtZXRob2QsIGJsb2NrLT5vYmplY3RfaWQsIDIpOworCisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCBtZXRob2QsICZpbnB1dCwgb3V0KTsKKworCXJldHVybiBzdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3bWlfZXZhbHVhdGVfbWV0aG9kKTsKKworLyoqCisgKiB3bWlfcXVlcnlfYmxvY2sgLSBSZXR1cm4gY29udGVudHMgb2YgYSBXTUkgYmxvY2sKKyAqIEBndWlkX3N0cmluZzogMzYgY2hhciBzdHJpbmcgb2YgdGhlIGZvcm0gZmE1MGZmMmItZjJlOC00NWRlLTgzZmEtNjU0MTdmMmY0OWJhCisgKiBAaW5zdGFuY2U6IEluc3RhbmNlIGluZGV4CisgKiAmb3V0OiBFbXB0eSBidWZmZXIgdG8gcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgZGF0YSBibG9jayB0bworICoKKyAqIFJldHVybiB0aGUgY29udGVudHMgb2YgYW4gQUNQSS1XTUkgZGF0YSBibG9jayB0byBhIGJ1ZmZlcgorICovCithY3BpX3N0YXR1cyB3bWlfcXVlcnlfYmxvY2soY29uc3QgY2hhciAqZ3VpZF9zdHJpbmcsIHU4IGluc3RhbmNlLAorc3RydWN0IGFjcGlfYnVmZmVyICpvdXQpCit7CisJc3RydWN0IGd1aWRfYmxvY2sgKmJsb2NrID0gTlVMTDsKKwlzdHJ1Y3Qgd21pX2Jsb2NrICp3YmxvY2sgPSBOVUxMOworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXMsIHdjX3N0YXR1cyA9IEFFX0VSUk9SOworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGlucHV0LCB3Y19pbnB1dDsKKwl1bmlvbiBhY3BpX29iamVjdCB3Y19wYXJhbXNbMV0sIHdxX3BhcmFtc1sxXTsKKwljaGFyIG1ldGhvZFs0XTsKKwljaGFyIHdjX21ldGhvZFs0XSA9ICJXQyI7CisKKwlpZiAoIWd1aWRfc3RyaW5nIHx8ICFvdXQpCisJCXJldHVybiBBRV9CQURfUEFSQU1FVEVSOworCisJaWYgKCFmaW5kX2d1aWQoZ3VpZF9zdHJpbmcsICZ3YmxvY2spKQorCQlyZXR1cm4gQUVfQkFEX0FERFJFU1M7CisKKwlibG9jayA9ICZ3YmxvY2stPmdibG9jazsKKwloYW5kbGUgPSB3YmxvY2stPmhhbmRsZTsKKworCWlmIChibG9jay0+aW5zdGFuY2VfY291bnQgPCBpbnN0YW5jZSkKKwkJcmV0dXJuIEFFX0JBRF9QQVJBTUVURVI7CisKKwkvKiBDaGVjayBHVUlEIGlzIGEgZGF0YSBibG9jayAqLworCWlmIChibG9jay0+ZmxhZ3MgJiAoQUNQSV9XTUlfRVZFTlQgfCBBQ1BJX1dNSV9NRVRIT0QpKQorCQlyZXR1cm4gQUVfQkFEX0FERFJFU1M7CisKKwlpbnB1dC5jb3VudCA9IDE7CisJaW5wdXQucG9pbnRlciA9IHdxX3BhcmFtczsKKwl3cV9wYXJhbXNbMF0udHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOworCXdxX3BhcmFtc1swXS5pbnRlZ2VyLnZhbHVlID0gaW5zdGFuY2U7CisKKwkvKgorCSAqIElmIEFDUElfV01JX0VYUEVOU0lWRSwgY2FsbCB0aGUgcmVsZXZhbnQgV0N4eCBtZXRob2QgZmlyc3QgdG8KKwkgKiBlbmFibGUgY29sbGVjdGlvbi4KKwkgKi8KKwlpZiAoYmxvY2stPmZsYWdzICYgQUNQSV9XTUlfRVhQRU5TSVZFKSB7CisJCXdjX2lucHV0LmNvdW50ID0gMTsKKwkJd2NfaW5wdXQucG9pbnRlciA9IHdjX3BhcmFtczsKKwkJd2NfcGFyYW1zWzBdLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKKwkJd2NfcGFyYW1zWzBdLmludGVnZXIudmFsdWUgPSAxOworCisJCXN0cm5jYXQod2NfbWV0aG9kLCBibG9jay0+b2JqZWN0X2lkLCAyKTsKKworCQkvKgorCQkgKiBTb21lIEdVSURzIGJyZWFrIHRoZSBzcGVjaWZpY2F0aW9uIGJ5IGRlY2xhcmluZyB0aGVtc2VsdmVzCisJCSAqIGV4cGVuc2l2ZSwgYnV0IGhhdmUgbm8gY29ycmVzcG9uZGluZyBXQ3h4IG1ldGhvZC4gU28gd2UKKwkJICogc2hvdWxkIG5vdCBmYWlsIGlmIHRoaXMgaGFwcGVucy4KKwkJICovCisJCXdjX3N0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgd2NfbWV0aG9kLAorCQkJJndjX2lucHV0LCBOVUxMKTsKKwl9CisKKwlzdHJjcHkobWV0aG9kLCAiV1EiKTsKKwlzdHJuY2F0KG1ldGhvZCwgYmxvY2stPm9iamVjdF9pZCwgMik7CisKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIG1ldGhvZCwgTlVMTCwgb3V0KTsKKworCS8qCisJICogSWYgQUNQSV9XTUlfRVhQRU5TSVZFLCBjYWxsIHRoZSByZWxldmFudCBXQ3h4IG1ldGhvZCwgZXZlbiBpZgorCSAqIHRoZSBXUXh4IG1ldGhvZCBmYWlsZWQgLSB3ZSBzaG91bGQgZGlzYWJsZSBjb2xsZWN0aW9uIGFueXdheS4KKwkgKi8KKwlpZiAoKGJsb2NrLT5mbGFncyAmIEFDUElfV01JX0VYUEVOU0lWRSkgJiYgd2Nfc3RhdHVzKSB7CisJCXdjX3BhcmFtc1swXS5pbnRlZ2VyLnZhbHVlID0gMDsKKwkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLAorCQl3Y19tZXRob2QsICZ3Y19pbnB1dCwgTlVMTCk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdtaV9xdWVyeV9ibG9jayk7CisKKy8qKgorICogd21pX3NldF9ibG9jayAtIFdyaXRlIHRvIGEgV01JIGJsb2NrCisgKiBAZ3VpZF9zdHJpbmc6IDM2IGNoYXIgc3RyaW5nIG9mIHRoZSBmb3JtIGZhNTBmZjJiLWYyZTgtNDVkZS04M2ZhLTY1NDE3ZjJmNDliYQorICogQGluc3RhbmNlOiBJbnN0YW5jZSBpbmRleAorICogJmluOiBCdWZmZXIgY29udGFpbmluZyBuZXcgdmFsdWVzIGZvciB0aGUgZGF0YSBibG9jaworICoKKyAqIFdyaXRlIHRoZSBjb250ZW50cyBvZiB0aGUgaW5wdXQgYnVmZmVyIHRvIGFuIEFDUEktV01JIGRhdGEgYmxvY2sKKyAqLworYWNwaV9zdGF0dXMgd21pX3NldF9ibG9jayhjb25zdCBjaGFyICpndWlkX3N0cmluZywgdTggaW5zdGFuY2UsCitjb25zdCBzdHJ1Y3QgYWNwaV9idWZmZXIgKmluKQoreworCXN0cnVjdCBndWlkX2Jsb2NrICpibG9jayA9IE5VTEw7CisJc3RydWN0IHdtaV9ibG9jayAqd2Jsb2NrID0gTlVMTDsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgaW5wdXQ7CisJdW5pb24gYWNwaV9vYmplY3QgcGFyYW1zWzJdOworCWNoYXIgbWV0aG9kWzRdID0gIldTIjsKKworCWlmICghZ3VpZF9zdHJpbmcgfHwgIWluKQorCQlyZXR1cm4gQUVfQkFEX0RBVEE7CisKKwlpZiAoIWZpbmRfZ3VpZChndWlkX3N0cmluZywgJndibG9jaykpCisJCXJldHVybiBBRV9CQURfQUREUkVTUzsKKworCWJsb2NrID0gJndibG9jay0+Z2Jsb2NrOworCWhhbmRsZSA9IHdibG9jay0+aGFuZGxlOworCisJaWYgKGJsb2NrLT5pbnN0YW5jZV9jb3VudCA8IGluc3RhbmNlKQorCQlyZXR1cm4gQUVfQkFEX1BBUkFNRVRFUjsKKworCS8qIENoZWNrIEdVSUQgaXMgYSBkYXRhIGJsb2NrICovCisJaWYgKGJsb2NrLT5mbGFncyAmIChBQ1BJX1dNSV9FVkVOVCB8IEFDUElfV01JX01FVEhPRCkpCisJCXJldHVybiBBRV9CQURfQUREUkVTUzsKKworCWlucHV0LmNvdW50ID0gMjsKKwlpbnB1dC5wb2ludGVyID0gcGFyYW1zOworCXBhcmFtc1swXS50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVI7CisJcGFyYW1zWzBdLmludGVnZXIudmFsdWUgPSBpbnN0YW5jZTsKKworCWlmIChibG9jay0+ZmxhZ3MgJiBBQ1BJX1dNSV9TVFJJTkcpIHsKKwkJcGFyYW1zWzFdLnR5cGUgPSBBQ1BJX1RZUEVfU1RSSU5HOworCX0gZWxzZSB7CisJCXBhcmFtc1sxXS50eXBlID0gQUNQSV9UWVBFX0JVRkZFUjsKKwl9CisJcGFyYW1zWzFdLmJ1ZmZlci5sZW5ndGggPSBpbi0+bGVuZ3RoOworCXBhcmFtc1sxXS5idWZmZXIucG9pbnRlciA9IGluLT5wb2ludGVyOworCisJc3RybmNhdChtZXRob2QsIGJsb2NrLT5vYmplY3RfaWQsIDIpOworCisJcmV0dXJuIGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgbWV0aG9kLCAmaW5wdXQsIE5VTEwpOworfQorRVhQT1JUX1NZTUJPTF9HUEwod21pX3NldF9ibG9jayk7CisKKy8qKgorICogd21pX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIgLSBSZWdpc3RlciBoYW5kbGVyIGZvciBXTUkgZXZlbnRzCisgKiBAaGFuZGxlcjogRnVuY3Rpb24gdG8gaGFuZGxlIG5vdGlmaWNhdGlvbnMKKyAqIEBkYXRhOiBEYXRhIHRvIGJlIHJldHVybmVkIHRvIGhhbmRsZXIgd2hlbiBldmVudCBpcyBmaXJlZAorICoKKyAqIFJlZ2lzdGVyIGEgaGFuZGxlciBmb3IgZXZlbnRzIHNlbnQgdG8gdGhlIEFDUEktV01JIG1hcHBlciBkZXZpY2UuCisgKi8KK2FjcGlfc3RhdHVzIHdtaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKGNvbnN0IGNoYXIgKmd1aWQsCit3bWlfbm90aWZ5X2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgd21pX2Jsb2NrICpibG9jazsKKworCWlmICghZ3VpZCB8fCAhaGFuZGxlcikKKwkJcmV0dXJuIEFFX0JBRF9QQVJBTUVURVI7CisKKwlmaW5kX2d1aWQoZ3VpZCwgJmJsb2NrKTsKKwlpZiAoIWJsb2NrKQorCQlyZXR1cm4gQUVfTk9UX0VYSVNUOworCisJaWYgKGJsb2NrLT5oYW5kbGVyKQorCQlyZXR1cm4gQUVfQUxSRUFEWV9BQ1FVSVJFRDsKKworCWJsb2NrLT5oYW5kbGVyID0gaGFuZGxlcjsKKwlibG9jay0+aGFuZGxlcl9kYXRhID0gZGF0YTsKKworCXJldHVybiBBRV9PSzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdtaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKTsKKworLyoqCisgKiB3bWlfdW5pbnN0YWxsX25vdGlmeV9oYW5kbGVyIC0gVW5yZWdpc3RlciBoYW5kbGVyIGZvciBXTUkgZXZlbnRzCisgKgorICogVW5yZWdpc3RlciBoYW5kbGVyIGZvciBldmVudHMgc2VudCB0byB0aGUgQUNQSS1XTUkgbWFwcGVyIGRldmljZS4KKyAqLworYWNwaV9zdGF0dXMgd21pX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihjb25zdCBjaGFyICpndWlkKQoreworCXN0cnVjdCB3bWlfYmxvY2sgKmJsb2NrOworCisJaWYgKCFndWlkKQorCQlyZXR1cm4gQUVfQkFEX1BBUkFNRVRFUjsKKworCWZpbmRfZ3VpZChndWlkLCAmYmxvY2spOworCWlmICghYmxvY2spCisJCXJldHVybiBBRV9OT1RfRVhJU1Q7CisKKwlpZiAoIWJsb2NrLT5oYW5kbGVyKQorCQlyZXR1cm4gQUVfTlVMTF9FTlRSWTsKKworCWJsb2NrLT5oYW5kbGVyID0gTlVMTDsKKwlibG9jay0+aGFuZGxlcl9kYXRhID0gTlVMTDsKKworCXJldHVybiBBRV9PSzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdtaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIpOworCisvKioKKyAqIHdtaV9nZXRfZXZlbnRfZGF0YSAtIEdldCBXTUkgZGF0YSBhc3NvY2lhdGVkIHdpdGggYW4gZXZlbnQKKyAqCisgKiBAZXZlbnQgLSBFdmVudCB0byBmaW5kCisgKiAmb3V0IC0gQnVmZmVyIHRvIGhvbGQgZXZlbnQgZGF0YQorICoKKyAqIFJldHVybnMgZXh0cmEgZGF0YSBhc3NvY2lhdGVkIHdpdGggYW4gZXZlbnQgaW4gV01JLgorICovCithY3BpX3N0YXR1cyB3bWlfZ2V0X2V2ZW50X2RhdGEodTMyIGV2ZW50LCBzdHJ1Y3QgYWNwaV9idWZmZXIgKm91dCkKK3sKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBpbnB1dDsKKwl1bmlvbiBhY3BpX29iamVjdCBwYXJhbXNbMV07CisJc3RydWN0IGd1aWRfYmxvY2sgKmdibG9jazsKKwlzdHJ1Y3Qgd21pX2Jsb2NrICp3YmxvY2s7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworCWlucHV0LmNvdW50ID0gMTsKKwlpbnB1dC5wb2ludGVyID0gcGFyYW1zOworCXBhcmFtc1swXS50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVI7CisJcGFyYW1zWzBdLmludGVnZXIudmFsdWUgPSBldmVudDsKKworCWxpc3RfZm9yX2VhY2gocCwgJndtaV9ibG9ja3MubGlzdCkgeworCQl3YmxvY2sgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCB3bWlfYmxvY2ssIGxpc3QpOworCQlnYmxvY2sgPSAmd2Jsb2NrLT5nYmxvY2s7CisKKwkJaWYgKChnYmxvY2stPmZsYWdzICYgQUNQSV9XTUlfRVZFTlQpICYmCisJCQkoZ2Jsb2NrLT5ub3RpZnlfaWQgPT0gZXZlbnQpKQorCQkJcmV0dXJuIGFjcGlfZXZhbHVhdGVfb2JqZWN0KHdibG9jay0+aGFuZGxlLCAiX1dFRCIsCisJCQkJJmlucHV0LCBvdXQpOworCX0KKworCXJldHVybiBBRV9OT1RfRk9VTkQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3bWlfZ2V0X2V2ZW50X2RhdGEpOworCisvKioKKyAqIHdtaV9oYXNfZ3VpZCAtIENoZWNrIGlmIGEgR1VJRCBpcyBhdmFpbGFibGUKKyAqIEBndWlkX3N0cmluZzogMzYgY2hhciBzdHJpbmcgb2YgdGhlIGZvcm0gZmE1MGZmMmItZjJlOC00NWRlLTgzZmEtNjU0MTdmMmY0OWJhCisgKgorICogQ2hlY2sgaWYgYSBnaXZlbiBHVUlEIGlzIGRlZmluZWQgYnkgX1dERworICovCitib29sIHdtaV9oYXNfZ3VpZChjb25zdCBjaGFyICpndWlkX3N0cmluZykKK3sKKwlyZXR1cm4gZmluZF9ndWlkKGd1aWRfc3RyaW5nLCBOVUxMKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdtaV9oYXNfZ3VpZCk7CisKKy8qCisgKiBQYXJzZSB0aGUgX1dERyBtZXRob2QgZm9yIHRoZSBHVUlEIGRhdGEgYmxvY2tzCisgKi8KK3N0YXRpYyBfX2luaXQgYWNwaV9zdGF0dXMgcGFyc2Vfd2RnKGFjcGlfaGFuZGxlIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgb3V0ID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCXN0cnVjdCBndWlkX2Jsb2NrICpnYmxvY2s7CisJc3RydWN0IHdtaV9ibG9jayAqd2Jsb2NrOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MzIgaSwgdG90YWw7CisKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsICJfV0RHIiwgTlVMTCwgJm91dCk7CisKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiBzdGF0dXM7CisKKwlvYmogPSAodW5pb24gYWNwaV9vYmplY3QgKikgb3V0LnBvaW50ZXI7CisKKwlpZiAob2JqLT50eXBlICE9IEFDUElfVFlQRV9CVUZGRVIpCisJCXJldHVybiBBRV9FUlJPUjsKKworCXRvdGFsID0gb2JqLT5idWZmZXIubGVuZ3RoIC8gc2l6ZW9mKHN0cnVjdCBndWlkX2Jsb2NrKTsKKworCWdibG9jayA9IGt6YWxsb2Mob2JqLT5idWZmZXIubGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdibG9jaykKKwkJcmV0dXJuIEFFX05PX01FTU9SWTsKKworCW1lbWNweShnYmxvY2ssIG9iai0+YnVmZmVyLnBvaW50ZXIsIG9iai0+YnVmZmVyLmxlbmd0aCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdG90YWw7IGkrKykgeworCQl3YmxvY2sgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd21pX2Jsb2NrKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghd2Jsb2NrKQorCQkJcmV0dXJuIEFFX05PX01FTU9SWTsKKworCQl3YmxvY2stPmdibG9jayA9IGdibG9ja1tpXTsKKwkJd2Jsb2NrLT5oYW5kbGUgPSBoYW5kbGU7CisJCWxpc3RfYWRkX3RhaWwoJndibG9jay0+bGlzdCwgJndtaV9ibG9ja3MubGlzdCk7CisJfQorCisJa2ZyZWUob3V0LnBvaW50ZXIpOworCWtmcmVlKGdibG9jayk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogV01JIGNhbiBoYXZlIEVtYmVkZGVkQ29udHJvbCBhY2Nlc3MgcmVnaW9ucy4gSW4gd2hpY2ggY2FzZSwgd2UganVzdCB3YW50IHRvCisgKiBoYW5kIHRoZXNlIG9mZiB0byB0aGUgRUMgZHJpdmVyLgorICovCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfd21pX2VjX3NwYWNlX2hhbmRsZXIodTMyIGZ1bmN0aW9uLCBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJICAgICAgdTMyIGJpdHMsIGFjcGlfaW50ZWdlciAqIHZhbHVlLAorCQkgICAgICB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKnJlZ2lvbl9jb250ZXh0KQoreworCWludCByZXN1bHQgPSAwLCBpID0gMDsKKwl1OCB0ZW1wID0gMDsKKworCWlmICgoYWRkcmVzcyA+IDB4RkYpIHx8ICF2YWx1ZSkKKwkJcmV0dXJuIEFFX0JBRF9QQVJBTUVURVI7CisKKwlpZiAoZnVuY3Rpb24gIT0gQUNQSV9SRUFEICYmIGZ1bmN0aW9uICE9IEFDUElfV1JJVEUpCisJCXJldHVybiBBRV9CQURfUEFSQU1FVEVSOworCisJaWYgKGJpdHMgIT0gOCkKKwkJcmV0dXJuIEFFX0JBRF9QQVJBTUVURVI7CisKKwlpZiAoZnVuY3Rpb24gPT0gQUNQSV9SRUFEKSB7CisJCXJlc3VsdCA9IGVjX3JlYWQoYWRkcmVzcywgJnRlbXApOworCQkoKnZhbHVlKSB8PSAoKGFjcGlfaW50ZWdlcil0ZW1wKSA8PCBpOworCX0gZWxzZSB7CisJCXRlbXAgPSAweGZmICYgKCgqdmFsdWUpID4+IGkpOworCQlyZXN1bHQgPSBlY193cml0ZShhZGRyZXNzLCB0ZW1wKTsKKwl9CisKKwlzd2l0Y2ggKHJlc3VsdCkgeworCWNhc2UgLUVJTlZBTDoKKwkJcmV0dXJuIEFFX0JBRF9QQVJBTUVURVI7CisJCWJyZWFrOworCWNhc2UgLUVOT0RFVjoKKwkJcmV0dXJuIEFFX05PVF9GT1VORDsKKwkJYnJlYWs7CisJY2FzZSAtRVRJTUU6CisJCXJldHVybiBBRV9USU1FOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gQUVfT0s7CisJfQorfQorCitzdGF0aWMgdm9pZCBhY3BpX3dtaV9ub3RpZnkoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZXZlbnQsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGd1aWRfYmxvY2sgKmJsb2NrOworCXN0cnVjdCB3bWlfYmxvY2sgKndibG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gZGF0YTsKKworCWxpc3RfZm9yX2VhY2gocCwgJndtaV9ibG9ja3MubGlzdCkgeworCQl3YmxvY2sgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCB3bWlfYmxvY2ssIGxpc3QpOworCQlibG9jayA9ICZ3YmxvY2stPmdibG9jazsKKworCQlpZiAoKGJsb2NrLT5mbGFncyAmIEFDUElfV01JX0VWRU5UKSAmJgorCQkJKGJsb2NrLT5ub3RpZnlfaWQgPT0gZXZlbnQpKSB7CisJCQlpZiAod2Jsb2NrLT5oYW5kbGVyKQorCQkJCXdibG9jay0+aGFuZGxlcihldmVudCwgd2Jsb2NrLT5oYW5kbGVyX2RhdGEpOworCisJCQlhY3BpX2J1c19nZW5lcmF0ZV9uZXRsaW5rX2V2ZW50KAorCQkJCWRldmljZS0+cG5wLmRldmljZV9jbGFzcywgZGV2aWNlLT5kZXYuYnVzX2lkLAorCQkJCWV2ZW50LCAwKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGFjcGlfd21pX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCit7CisJYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoZGV2aWNlLT5oYW5kbGUsIEFDUElfREVWSUNFX05PVElGWSwKKwkJYWNwaV93bWlfbm90aWZ5KTsKKworCWFjcGlfcmVtb3ZlX2FkZHJlc3Nfc3BhY2VfaGFuZGxlcihkZXZpY2UtPmhhbmRsZSwKKwkJCQlBQ1BJX0FEUl9TUEFDRV9FQywgJmFjcGlfd21pX2VjX3NwYWNlX2hhbmRsZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfd21pX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJaW50IHJlc3VsdCA9IDA7CisKKwlzdGF0dXMgPSBhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoZGV2aWNlLT5oYW5kbGUsIEFDUElfREVWSUNFX05PVElGWSwKKwkJYWNwaV93bWlfbm90aWZ5LCBkZXZpY2UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJFcnJvciBpbnN0YWxsaW5nIG5vdGlmeSBoYW5kbGVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJc3RhdHVzID0gYWNwaV9pbnN0YWxsX2FkZHJlc3Nfc3BhY2VfaGFuZGxlcihkZXZpY2UtPmhhbmRsZSwKKwkJCQkJCSAgICBBQ1BJX0FEUl9TUEFDRV9FQywKKwkJCQkJCSAgICAmYWNwaV93bWlfZWNfc3BhY2VfaGFuZGxlciwKKwkJCQkJCSAgICBOVUxMLCBOVUxMKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiAtRU5PREVWOworCisJc3RhdHVzID0gcGFyc2Vfd2RnKGRldmljZS0+aGFuZGxlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXJyb3IgaW5zdGFsbGluZyBFQyByZWdpb24gaGFuZGxlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfd21pX2luaXQodm9pZCkKK3sKKwlhY3BpX3N0YXR1cyByZXN1bHQ7CisKKwlpZiAoYWNwaV9kaXNhYmxlZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlJTklUX0xJU1RfSEVBRCgmd21pX2Jsb2Nrcy5saXN0KTsKKworCXJlc3VsdCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmYWNwaV93bWlfZHJpdmVyKTsKKworCWlmIChyZXN1bHQgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJFcnJvciBsb2FkaW5nIG1hcHBlclxuIik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIk1hcHBlciBsb2FkZWRcbiIpOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhY3BpX3dtaV9leGl0KHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKnRtcDsKKwlzdHJ1Y3Qgd21pX2Jsb2NrICp3YmxvY2s7CisKKwlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmYWNwaV93bWlfZHJpdmVyKTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShwLCB0bXAsICZ3bWlfYmxvY2tzLmxpc3QpIHsKKwkJd2Jsb2NrID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgd21pX2Jsb2NrLCBsaXN0KTsKKworCQlsaXN0X2RlbChwKTsKKwkJa2ZyZWUod2Jsb2NrKTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiTWFwcGVyIHVubG9hZGVkXG4iKTsKK30KKworc3Vic3lzX2luaXRjYWxsKGFjcGlfd21pX2luaXQpOworbW9kdWxlX2V4aXQoYWNwaV93bWlfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYyBiL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCmluZGV4IDAyOTU4NTUuLjRhMWI5YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCkBAIC0yOTIsNyArMjkyLDggQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGZ3X3NldHVwX2RldmljZV9pZChzdHJ1Y3QgZGV2aWNlICpmX2Rldiwgc3RydWN0IGRldmljZSAqZGV2KQogewotCXNucHJpbnRmKGZfZGV2LT5idXNfaWQsIEJVU19JRF9TSVpFLCAiZmlybXdhcmUtJXMiLCBkZXYtPmJ1c19pZCk7CisJLyogWFhYIHdhcm5pbmcgd2Ugc2hvdWxkIHdhdGNoIG91dCBmb3IgbmFtZSBjb2xsaXNpb25zICovCisJc3RybGNweShmX2Rldi0+YnVzX2lkLCBkZXYtPmJ1c19pZCwgQlVTX0lEX1NJWkUpOwogfQogCiBzdGF0aWMgaW50IGZ3X3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgZGV2aWNlICoqZGV2X3AsIGNvbnN0IGNoYXIgKmZ3X25hbWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL0tjb25maWcgYi9kcml2ZXJzL2Jsb2NrL0tjb25maWcKaW5kZXggNjRlNTE0OC4uYjZkMjMwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9LY29uZmlnCisrKyBiL2RyaXZlcnMvYmxvY2svS2NvbmZpZwpAQCAtMzIyLDcgKzMyMiw3IEBACiAJICBJZiB1bnN1cmUsIHNheSBOLgogCiBjb25maWcgQkxLX0RFVl9SQU0KLQl0cmlzdGF0ZSAiUkFNIGRpc2sgc3VwcG9ydCIKKwl0cmlzdGF0ZSAiUkFNIGJsb2NrIGRldmljZSBzdXBwb3J0IgogCS0tLWhlbHAtLS0KIAkgIFNheWluZyBZIGhlcmUgd2lsbCBhbGxvdyB5b3UgdG8gdXNlIGEgcG9ydGlvbiBvZiB5b3VyIFJBTSBtZW1vcnkgYXMKIAkgIGEgYmxvY2sgZGV2aWNlLCBzbyB0aGF0IHlvdSBjYW4gbWFrZSBmaWxlIHN5c3RlbXMgb24gaXQsIHJlYWQgYW5kCkBAIC0zNTcsMTUgKzM1NywxNSBAQAogCSAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgNDA5NiBraWxvYnl0ZXMuIE9ubHkgY2hhbmdlIHRoaXMgaWYgeW91IGtub3cKIAkgIHdoYXQgeW91IGFyZSBkb2luZy4KIAotY29uZmlnIEJMS19ERVZfUkFNX0JMT0NLU0laRQotCWludCAiRGVmYXVsdCBSQU0gZGlzayBibG9jayBzaXplIChieXRlcykiCitjb25maWcgQkxLX0RFVl9YSVAKKwlib29sICJTdXBwb3J0IFhJUCBmaWxlc3lzdGVtcyBvbiBSQU0gYmxvY2sgZGV2aWNlIgogCWRlcGVuZHMgb24gQkxLX0RFVl9SQU0KLQlkZWZhdWx0ICIxMDI0IgorCWRlZmF1bHQgbgogCWhlbHAKLQkgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEwMjQgYnl0ZXMuICBQQUdFX1NJWkUgaXMgYSBtdWNoIG1vcmUKLQkgIGVmZmljaWVudCBjaG9pY2UgaG93ZXZlci4gIFRoZSBkZWZhdWx0IGlzIGtlcHQgdG8gZW5zdXJlIGluaXRyZAotCSAgc2V0dXBzIGZ1bmN0aW9uIC0gYXBwYXJlbnRseSBuZWVkZWQgYnkgdGhlIHJkX2xvYWRfaW1hZ2Ugcm91dGluZQotCSAgdGhhdCBzdXBwb3NlcyB0aGUgZmlsZXN5c3RlbSBpbiB0aGUgaW1hZ2UgdXNlcyBhIDEwMjQgYmxvY2tzaXplLgorCSAgU3VwcG9ydCBYSVAgZmlsZXN5c3RlbXMgKHN1Y2ggYXMgZXh0MiB3aXRoIFhJUCBzdXBwb3J0IG9uKSBvbgorCSAgdG9wIG9mIGJsb2NrIHJhbSBkZXZpY2UuIFRoaXMgd2lsbCBzbGlnaHRseSBlbmxhcmdlIHRoZSBrZXJuZWwsIGFuZAorCSAgd2lsbCBwcmV2ZW50IFJBTSBibG9jayBkZXZpY2UgYmFja2luZyBzdG9yZSBtZW1vcnkgZnJvbSBiZWluZworCSAgYWxsb2NhdGVkIGZyb20gaGlnaG1lbSAob25seSBhIHByb2JsZW0gZm9yIGhpZ2htZW0gc3lzdGVtcykuCiAKIGNvbmZpZyBDRFJPTV9QS1RDRFZECiAJdHJpc3RhdGUgIlBhY2tldCB3cml0aW5nIG9uIENEL0RWRCBtZWRpYSIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svTWFrZWZpbGUgYi9kcml2ZXJzL2Jsb2NrL01ha2VmaWxlCmluZGV4IDc2OTE1MDUuLjAxYzk3MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ibG9jay9NYWtlZmlsZQpAQCAtMTEsNyArMTEsNyBAQAogb2JqLSQoQ09ORklHX1BTM19ESVNLKQkJKz0gcHMzZGlzay5vCiBvYmotJChDT05GSUdfQVRBUklfRkxPUFBZKQkrPSBhdGFmbG9wLm8KIG9iai0kKENPTkZJR19BTUlHQV9aMlJBTSkJKz0gejJyYW0ubwotb2JqLSQoQ09ORklHX0JMS19ERVZfUkFNKQkrPSByZC5vCitvYmotJChDT05GSUdfQkxLX0RFVl9SQU0pCSs9IGJyZC5vCiBvYmotJChDT05GSUdfQkxLX0RFVl9MT09QKQkrPSBsb29wLm8KIG9iai0kKENPTkZJR19CTEtfREVWX1BTMikJKz0gcHMyZXNkaS5vCiBvYmotJChDT05GSUdfQkxLX0RFVl9YRCkJKz0geGQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9hb2UvYW9lLmggYi9kcml2ZXJzL2Jsb2NrL2FvZS9hb2UuaAppbmRleCAwN2YwMmY4Li4yODBlNzFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2UuaAorKysgYi9kcml2ZXJzL2Jsb2NrL2FvZS9hb2UuaApAQCAtMSw1ICsxLDUgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwNiBDb3JhaWQsIEluYy4gIFNlZSBDT1BZSU5HIGZvciBHUEwgdGVybXMuICovCi0jZGVmaW5lIFZFUlNJT04gIjMyIgorLyogQ29weXJpZ2h0IChjKSAyMDA3IENvcmFpZCwgSW5jLiAgU2VlIENPUFlJTkcgZm9yIEdQTCB0ZXJtcy4gKi8KKyNkZWZpbmUgVkVSU0lPTiAiNDciCiAjZGVmaW5lIEFPRV9NQUpPUiAxNTIKICNkZWZpbmUgREVWSUNFX05BTUUgImFvZSIKIApAQCAtNzYsMTAgKzc2LDggQEAKIAlERVZGTF9FWFQgPSAoMTw8MiksCS8qIGRldmljZSBhY2NlcHRzIGxiYTQ4IGNvbW1hbmRzICovCiAJREVWRkxfQ0xPU0VXQUlUID0gKDE8PDMpLCAvKiBkZXZpY2UgaXMgd2FpdGluZyBmb3IgYWxsIGNsb3NlcyB0byByZXZhbGlkYXRlICovCiAJREVWRkxfR0RBTExPQyA9ICgxPDw0KSwJLyogbmVlZCB0byBhbGxvYyBnZW5kaXNrICovCi0JREVWRkxfUEFVU0UgPSAoMTw8NSksCisJREVWRkxfS0lDS01FID0gKDE8PDUpLAkvKiBzbG93IHBvbGxpbmcgbmV0d29yayBjYXJkIGNhdGNoICovCiAJREVWRkxfTkVXU0laRSA9ICgxPDw2KSwJLyogbmVlZCB0byB1cGRhdGUgZGV2IHNpemUgaW4gYmxvY2sgbGF5ZXIgKi8KLQlERVZGTF9NQVhCQ05UID0gKDE8PDcpLCAvKiBkLT5tYXhiY250IGlzIG5vdCBjaGFuZ2VhYmxlICovCi0JREVWRkxfS0lDS01FID0gKDE8PDgpLAogCiAJQlVGRkxfRkFJTCA9IDEsCiB9OwpAQCAtODgsMTcgKzg2LDI1IEBACiAJREVGQVVMVEJDTlQgPSAyICogNTEyLAkvKiAyIHNlY3RvcnMgKi8KIAlOUEVSU0hFTEYgPSAxNiwJCS8qIG51bWJlciBvZiBzbG90cyBwZXIgc2hlbGYgYWRkcmVzcyAqLwogCUZSRUVUQUcgPSAtMSwKLQlNSU5fQlVGUyA9IDgsCisJTUlOX0JVRlMgPSAxNiwKKwlOVEFSR0VUUyA9IDgsCisJTkFPRUlGUyA9IDgsCisJTlNLQlBPT0xNQVggPSAxMjgsCisKKwlUSU1FUlRJQ0sgPSBIWiAvIDEwLAorCU1JTlRJTUVSID0gSFogPj4gMiwKKwlNQVhUSU1FUiA9IEhaIDw8IDEsCisJSEVMUFdBSVQgPSAyMCwKIH07CiAKIHN0cnVjdCBidWYgewogCXN0cnVjdCBsaXN0X2hlYWQgYnVmczsKLQl1bG9uZyBzdGFydF90aW1lOwkvKiBmb3IgZGlzayBzdGF0cyAqLworCXVsb25nIHN0aW1lOwkvKiBmb3IgZGlzayBzdGF0cyAqLwogCXVsb25nIGZsYWdzOwogCXVsb25nIG5mcmFtZXNvdXQ7Ci0JY2hhciAqYnVmYWRkcjsKIAl1bG9uZyByZXNpZDsKIAl1bG9uZyBidl9yZXNpZDsKKwl1bG9uZyBidl9vZmY7CiAJc2VjdG9yX3Qgc2VjdG9yOwogCXN0cnVjdCBiaW8gKmJpbzsKIAlzdHJ1Y3QgYmlvX3ZlYyAqYnY7CkBAIC0xMTQsMTkgKzEyMCwzOCBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiB9OwogCitzdHJ1Y3QgYW9laWYgeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZDsKKwl1bnNpZ25lZCBjaGFyIGxvc3Q7CisJdW5zaWduZWQgY2hhciBsb3N0anVtYm87CisJdXNob3J0IG1heGJjbnQ7Cit9OworCitzdHJ1Y3QgYW9ldGd0IHsKKwl1bnNpZ25lZCBjaGFyIGFkZHJbNl07CisJdXNob3J0IG5mcmFtZXM7CisJc3RydWN0IGZyYW1lICpmcmFtZXM7CisJc3RydWN0IGFvZWlmIGlmc1tOQU9FSUZTXTsKKwlzdHJ1Y3QgYW9laWYgKmlmcDsJLyogY3VycmVudCBhb2VpZiBpbiB1c2UgKi8KKwl1c2hvcnQgbm91dDsKKwl1c2hvcnQgbWF4b3V0OworCXUxNiBsYXN0dGFnOwkJLyogbGFzdCB0YWcgc2VudCAqLworCXUxNiB1c2VtZTsKKwl1bG9uZyBsYXN0d2FkajsJCS8qIGxhc3Qgd2luZG93IGFkanVzdG1lbnQgKi8KKwlpbnQgd3BrdHMsIHJwa3RzOworCWludCBkYXRhcmVmOworfTsKKwogc3RydWN0IGFvZWRldiB7CiAJc3RydWN0IGFvZWRldiAqbmV4dDsKLQl1bnNpZ25lZCBjaGFyIGFkZHJbNl07CS8qIHJlbW90ZSBtYWMgYWRkciAqLwotCXVzaG9ydCBmbGFnczsKIAl1bG9uZyBzeXNtaW5vcjsKIAl1bG9uZyBhb2VtYWpvcjsKLQl1bG9uZyBhb2VtaW5vcjsKKwl1MTYgYW9lbWlub3I7CisJdTE2IGZsYWdzOwogCXUxNiBub3BlbjsJCS8qIChiZF9vcGVuZXJzIGlzbid0IGF2YWlsYWJsZSB3aXRob3V0IHNsZWVwaW5nKSAqLwotCXUxNiBsYXN0dGFnOwkJLyogbGFzdCB0YWcgc2VudCAqLwogCXUxNiBydHRhdmc7CQkvKiByb3VuZCB0cmlwIGF2ZXJhZ2Ugb2YgcmVxdWVzdHMvcmVzcG9uc2VzICovCiAJdTE2IG1pbnRpbWVyOwogCXUxNiBmd192ZXI7CQkvKiB2ZXJzaW9uIG9mIGJsYWRlJ3MgZmlybXdhcmUgKi8KLQl1MTYgbWF4YmNudDsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsvKiBkaXNrIGNyZWF0ZSB3b3JrIHN0cnVjdCAqLwogCXN0cnVjdCBnZW5kaXNrICpnZDsKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSBibGtxOwpAQCAtMTM0LDE1ICsxNTksMTcgQEAKIAlzZWN0b3JfdCBzc2l6ZTsKIAlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKIAlzcGlubG9ja190IGxvY2s7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmlmcDsJLyogaW50ZXJmYWNlIGVkIGlzIGF0dGFjaGVkIHRvICovCiAJc3RydWN0IHNrX2J1ZmYgKnNlbmRxX2hkOyAvKiBwYWNrZXRzIG5lZWRpbmcgdG8gYmUgc2VudCwgbGlzdCBoZWFkICovCiAJc3RydWN0IHNrX2J1ZmYgKnNlbmRxX3RsOworCXN0cnVjdCBza19idWZmICpza2Jwb29sX2hkOworCXN0cnVjdCBza19idWZmICpza2Jwb29sX3RsOworCWludCBuc2ticG9vbDsKIAltZW1wb29sX3QgKmJ1ZnBvb2w7CS8qIGZvciBkZWFkbG9jay1mcmVlIEJ1ZiBhbGxvY2F0aW9uICovCiAJc3RydWN0IGxpc3RfaGVhZCBidWZxOwkvKiBxdWV1ZSBvZiBiaW9zIHRvIHdvcmsgb24gKi8KIAlzdHJ1Y3QgYnVmICppbnByb2Nlc3M7CS8qIHRoZSBvbmUgd2UncmUgY3VycmVudGx5IHdvcmtpbmcgb24gKi8KLQl1c2hvcnQgbG9zdGp1bWJvOwotCXVzaG9ydCBuZnJhbWVzOwkJLyogbnVtYmVyIG9mIGZyYW1lcyBiZWxvdyAqLwotCXN0cnVjdCBmcmFtZSAqZnJhbWVzOworCXN0cnVjdCBhb2V0Z3QgKnRhcmdldHNbTlRBUkdFVFNdOworCXN0cnVjdCBhb2V0Z3QgKip0Z3Q7CS8qIHRhcmdldCBpbiB1c2Ugd2hlbiB3b3JraW5nICovCisJc3RydWN0IGFvZXRndCAqKmh0Z3Q7CS8qIHRhcmdldCBuZWVkaW5nIHJleG1pdCBhc3Npc3RhbmNlICovCiB9OwogCiAKQEAgLTE2MCwxNCArMTg3LDE2IEBACiB2b2lkIGFvZWNtZF9hdGFfcnNwKHN0cnVjdCBza19idWZmICopOwogdm9pZCBhb2VjbWRfY2ZnX3JzcChzdHJ1Y3Qgc2tfYnVmZiAqKTsKIHZvaWQgYW9lY21kX3NsZWVwd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7Ci1zdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYih1bG9uZyk7Cit2b2lkIGFvZWNtZF9jbGVhbnNsYXRlKHN0cnVjdCBhb2VkZXYgKik7CitzdHJ1Y3Qgc2tfYnVmZiAqYW9lY21kX2F0YV9pZChzdHJ1Y3QgYW9lZGV2ICopOwogCiBpbnQgYW9lZGV2X2luaXQodm9pZCk7CiB2b2lkIGFvZWRldl9leGl0KHZvaWQpOwogc3RydWN0IGFvZWRldiAqYW9lZGV2X2J5X2FvZWFkZHIoaW50IG1haiwgaW50IG1pbik7Ci1zdHJ1Y3QgYW9lZGV2ICphb2VkZXZfYnlfc3lzbWlub3JfbSh1bG9uZyBzeXNtaW5vciwgdWxvbmcgYnVmY250KTsKK3N0cnVjdCBhb2VkZXYgKmFvZWRldl9ieV9zeXNtaW5vcl9tKHVsb25nIHN5c21pbm9yKTsKIHZvaWQgYW9lZGV2X2Rvd25kZXYoc3RydWN0IGFvZWRldiAqZCk7CiBpbnQgYW9lZGV2X2lzYnVzeShzdHJ1Y3QgYW9lZGV2ICpkKTsKK2ludCBhb2VkZXZfZmx1c2goY29uc3QgY2hhciBfX3VzZXIgKnN0ciwgc2l6ZV90IHNpemUpOwogCiBpbnQgYW9lbmV0X2luaXQodm9pZCk7CiB2b2lkIGFvZW5ldF9leGl0KHZvaWQpOwpAQCAtMTc1LDQgKzIwNCw0IEBACiBpbnQgaXNfYW9lX25ldGlmKHN0cnVjdCBuZXRfZGV2aWNlICppZnApOwogaW50IHNldF9hb2VfaWZsaXN0KGNvbnN0IGNoYXIgX191c2VyICpzdHIsIHNpemVfdCBzaXplKTsKIAotdTY0IG1hY19hZGRyKGNoYXIgYWRkcls2XSk7Cit1bnNpZ25lZCBsb25nIGxvbmcgbWFjX2FkZHIoY2hhciBhZGRyWzZdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZWJsay5jIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lYmxrLmMKaW5kZXggODI2ZDEyMy4uMGMzOTc4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9hb2UvYW9lYmxrLmMKKysrIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lYmxrLmMKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDYgQ29yYWlkLCBJbmMuICBTZWUgQ09QWUlORyBmb3IgR1BMIHRlcm1zLiAqLworLyogQ29weXJpZ2h0IChjKSAyMDA3IENvcmFpZCwgSW5jLiAgU2VlIENPUFlJTkcgZm9yIEdQTCB0ZXJtcy4gKi8KIC8qCiAgKiBhb2VibGsuYwogICogYmxvY2sgZGV2aWNlIHJvdXRpbmVzCkBAIC0yNCw3ICsyNCw3IEBACiAJcmV0dXJuIHNucHJpbnRmKHBhZ2UsIFBBR0VfU0laRSwKIAkJCSIlcyVzXG4iLAogCQkJKGQtPmZsYWdzICYgREVWRkxfVVApID8gInVwIiA6ICJkb3duIiwKLQkJCShkLT5mbGFncyAmIERFVkZMX1BBVVNFKSA/ICIscGF1c2VkIiA6CisJCQkoZC0+ZmxhZ3MgJiBERVZGTF9LSUNLTUUpID8gIixraWNrbWUiIDoKIAkJCShkLT5ub3BlbiAmJiAhKGQtPmZsYWdzICYgREVWRkxfVVApKSA/ICIsY2xvc2V3YWl0IiA6ICIiKTsKIAkvKiBJJ2QgcmF0aGVyIHNlZSBub3BlbiBleHBvcnRlZCBzbyB3ZSBjYW4gZGl0Y2ggY2xvc2V3YWl0ICovCiB9CkBAIC0zMywxNyArMzMsNDggQEAKIHsKIAlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGRldl90b19kaXNrKGRldik7CiAJc3RydWN0IGFvZWRldiAqZCA9IGRpc2stPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYW9ldGd0ICp0ID0gZC0+dGFyZ2V0c1swXTsKIAotCXJldHVybiBzbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsICIlMDEybGx4XG4iLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyltYWNfYWRkcihkLT5hZGRyKSk7CisJaWYgKHQgPT0gTlVMTCkKKwkJcmV0dXJuIHNucHJpbnRmKHBhZ2UsIFBBR0VfU0laRSwgIm5vbmVcbiIpOworCXJldHVybiBzbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsICIlMDEybGx4XG4iLCBtYWNfYWRkcih0LT5hZGRyKSk7CiB9CiBzdGF0aWMgc3NpemVfdCBhb2VkaXNrX3Nob3dfbmV0aWYoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKnBhZ2UpCiB7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBkZXZfdG9fZGlzayhkZXYpOwogCXN0cnVjdCBhb2VkZXYgKmQgPSBkaXNrLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kc1s4XSwgKipuZCwgKipubmQsICoqbmU7CisJc3RydWN0IGFvZXRndCAqKnQsICoqdGU7CisJc3RydWN0IGFvZWlmICppZnAsICplOworCWNoYXIgKnA7CiAKLQlyZXR1cm4gc25wcmludGYocGFnZSwgUEFHRV9TSVpFLCAiJXNcbiIsIGQtPmlmcC0+bmFtZSk7CisJbWVtc2V0KG5kcywgMCwgc2l6ZW9mIG5kcyk7CisJbmQgPSBuZHM7CisJbmUgPSBuZCArIEFSUkFZX1NJWkUobmRzKTsKKwl0ID0gZC0+dGFyZ2V0czsKKwl0ZSA9IHQgKyBOVEFSR0VUUzsKKwlmb3IgKDsgdCA8IHRlICYmICp0OyB0KyspIHsKKwkJaWZwID0gKCp0KS0+aWZzOworCQllID0gaWZwICsgTkFPRUlGUzsKKwkJZm9yICg7IGlmcCA8IGUgJiYgaWZwLT5uZDsgaWZwKyspIHsKKwkJCWZvciAobm5kID0gbmRzOyBubmQgPCBuZDsgbm5kKyspCisJCQkJaWYgKCpubmQgPT0gaWZwLT5uZCkKKwkJCQkJYnJlYWs7CisJCQlpZiAobm5kID09IG5kICYmIG5kICE9IG5lKQorCQkJCSpuZCsrID0gaWZwLT5uZDsKKwkJfQorCX0KKworCW5lID0gbmQ7CisJbmQgPSBuZHM7CisJaWYgKCpuZCA9PSBOVUxMKQorCQlyZXR1cm4gc25wcmludGYocGFnZSwgUEFHRV9TSVpFLCAibm9uZVxuIik7CisJZm9yIChwID0gcGFnZTsgbmQgPCBuZTsgbmQrKykKKwkJcCArPSBzbnByaW50ZihwLCBQQUdFX1NJWkUgLSAocC1wYWdlKSwgIiVzJXMiLAorCQkJcCA9PSBwYWdlID8gIiIgOiAiLCIsICgqbmQpLT5uYW1lKTsKKwlwICs9IHNucHJpbnRmKHAsIFBBR0VfU0laRSAtIChwLXBhZ2UpLCAiXG4iKTsKKwlyZXR1cm4gcC1wYWdlOwogfQogLyogZmlybXdhcmUgdmVyc2lvbiAqLwogc3RhdGljIHNzaXplX3QgYW9lZGlza19zaG93X2Z3dmVyKHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTEzNCw3ICsxNjUsMjMgQEAKIAogCWJsa19xdWV1ZV9ib3VuY2UocSwgJmJpbyk7CiAKKwlpZiAoYmlvID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhb2U6IGJpbyBpcyBOVUxMXG4iKTsKKwkJQlVHKCk7CisJCXJldHVybiAwOworCX0KIAlkID0gYmlvLT5iaV9iZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CisJaWYgKGQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImFvZTogYmRfZGlzay0+cHJpdmF0ZV9kYXRhIGlzIE5VTExcbiIpOworCQlCVUcoKTsKKwkJYmlvX2VuZGlvKGJpbywgLUVOWElPKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChiaW8tPmJpX2lvX3ZlYyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYW9lOiBiaV9pb192ZWMgaXMgTlVMTFxuIik7CisJCUJVRygpOworCQliaW9fZW5kaW8oYmlvLCAtRU5YSU8pOworCQlyZXR1cm4gMDsKKwl9CiAJYnVmID0gbWVtcG9vbF9hbGxvYyhkLT5idWZwb29sLCBHRlBfTk9JTyk7CiAJaWYgKGJ1ZiA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImFvZTogYnVmIGFsbG9jYXRpb24gZmFpbHVyZVxuIik7CkBAIC0xNDMsMTkgKzE5MCwxOSBAQAogCX0KIAltZW1zZXQoYnVmLCAwLCBzaXplb2YoKmJ1ZikpOwogCUlOSVRfTElTVF9IRUFEKCZidWYtPmJ1ZnMpOwotCWJ1Zi0+c3RhcnRfdGltZSA9IGppZmZpZXM7CisJYnVmLT5zdGltZSA9IGppZmZpZXM7CiAJYnVmLT5iaW8gPSBiaW87CiAJYnVmLT5yZXNpZCA9IGJpby0+Ymlfc2l6ZTsKIAlidWYtPnNlY3RvciA9IGJpby0+Ymlfc2VjdG9yOwogCWJ1Zi0+YnYgPSAmYmlvLT5iaV9pb192ZWNbYmlvLT5iaV9pZHhdOwotCVdBUk5fT04oYnVmLT5idi0+YnZfbGVuID09IDApOwogCWJ1Zi0+YnZfcmVzaWQgPSBidWYtPmJ2LT5idl9sZW47Ci0JYnVmLT5idWZhZGRyID0gcGFnZV9hZGRyZXNzKGJ1Zi0+YnYtPmJ2X3BhZ2UpICsgYnVmLT5idi0+YnZfb2Zmc2V0OworCVdBUk5fT04oYnVmLT5idl9yZXNpZCA9PSAwKTsKKwlidWYtPmJ2X29mZiA9IGJ1Zi0+YnYtPmJ2X29mZnNldDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkLT5sb2NrLCBmbGFncyk7CiAKIAlpZiAoKGQtPmZsYWdzICYgREVWRkxfVVApID09IDApIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiBkZXZpY2UgJWxkLiVsZCBpcyBub3QgdXBcbiIsCisJCXByaW50ayhLRVJOX0lORk8gImFvZTogZGV2aWNlICVsZC4lZCBpcyBub3QgdXBcbiIsCiAJCQlkLT5hb2VtYWpvciwgZC0+YW9lbWlub3IpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT5sb2NrLCBmbGFncyk7CiAJCW1lbXBvb2xfZnJlZShidWYsIGQtPmJ1ZnBvb2wpOwpAQCAtMjA4LDE0ICsyNTUsMTUgQEAKIAogCWdkID0gYWxsb2NfZGlzayhBT0VfUEFSVElUSU9OUyk7CiAJaWYgKGdkID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhb2U6IGNhbm5vdCBhbGxvY2F0ZSBkaXNrIHN0cnVjdHVyZSBmb3IgJWxkLiVsZFxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiYW9lOiBjYW5ub3QgYWxsb2NhdGUgZGlzayBzdHJ1Y3R1cmUgZm9yICVsZC4lZFxuIiwKIAkJCWQtPmFvZW1ham9yLCBkLT5hb2VtaW5vcik7CiAJCWdvdG8gZXJyOwogCX0KIAogCWQtPmJ1ZnBvb2wgPSBtZW1wb29sX2NyZWF0ZV9zbGFiX3Bvb2woTUlOX0JVRlMsIGJ1Zl9wb29sX2NhY2hlKTsKIAlpZiAoZC0+YnVmcG9vbCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYW9lOiBjYW5ub3QgYWxsb2NhdGUgYnVmcG9vbCBmb3IgJWxkLiVsZFxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSICJhb2U6IGNhbm5vdCBhbGxvY2F0ZSBidWZwb29sIGZvciAlbGQuJWRcbiIsCiAJCQlkLT5hb2VtYWpvciwgZC0+YW9lbWlub3IpOwogCQlnb3RvIGVycl9kaXNrOwogCX0KQEAgLTIyOSw3ICsyNzcsNyBAQAogCWdkLT5mb3BzID0gJmFvZV9iZG9wczsKIAlnZC0+cHJpdmF0ZV9kYXRhID0gZDsKIAlnZC0+Y2FwYWNpdHkgPSBkLT5zc2l6ZTsKLQlzbnByaW50ZihnZC0+ZGlza19uYW1lLCBzaXplb2YgZ2QtPmRpc2tfbmFtZSwgImV0aGVyZC9lJWxkLiVsZCIsCisJc25wcmludGYoZ2QtPmRpc2tfbmFtZSwgc2l6ZW9mIGdkLT5kaXNrX25hbWUsICJldGhlcmQvZSVsZC4lZCIsCiAJCWQtPmFvZW1ham9yLCBkLT5hb2VtaW5vcik7CiAKIAlnZC0+cXVldWUgPSAmZC0+YmxrcTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZWNoci5jIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lY2hyLmMKaW5kZXggZDU0ODBlMy4uZThlNjBlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9hb2UvYW9lY2hyLmMKKysrIGIvZHJpdmVycy9ibG9jay9hb2UvYW9lY2hyLmMKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDYgQ29yYWlkLCBJbmMuICBTZWUgQ09QWUlORyBmb3IgR1BMIHRlcm1zLiAqLworLyogQ29weXJpZ2h0IChjKSAyMDA3IENvcmFpZCwgSW5jLiAgU2VlIENPUFlJTkcgZm9yIEdQTCB0ZXJtcy4gKi8KIC8qCiAgKiBhb2VjaHIuYwogICogQW9FIGNoYXJhY3RlciBkZXZpY2UgZHJpdmVyCkBAIC02LDYgKzYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgImFvZS5oIgogCiBlbnVtIHsKQEAgLTE0LDYgKzE1LDcgQEAKIAlNSU5PUl9ESVNDT1ZFUiwKIAlNSU5PUl9JTlRFUkZBQ0VTLAogCU1JTk9SX1JFVkFMSURBVEUsCisJTUlOT1JfRkxVU0gsCiAJTVNHU1ogPSAyMDQ4LAogCU5NU0cgPSAxMDAsCQkvKiBtZXNzYWdlIGJhY2tsb2cgdG8gcmV0YWluICovCiB9OwpAQCAtNDIsNiArNDQsNyBAQAogCXsgTUlOT1JfRElTQ09WRVIsICJkaXNjb3ZlciIgfSwKIAl7IE1JTk9SX0lOVEVSRkFDRVMsICJpbnRlcmZhY2VzIiB9LAogCXsgTUlOT1JfUkVWQUxJREFURSwgInJldmFsaWRhdGUiIH0sCisJeyBNSU5PUl9GTFVTSCwgImZsdXNoIiB9LAogfTsKIAogc3RhdGljIGludApAQCAtNjgsNiArNzEsNyBAQAogCWludCBtYWpvciwgbWlub3IsIG47CiAJdWxvbmcgZmxhZ3M7CiAJc3RydWN0IGFvZWRldiAqZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWNoYXIgYnVmWzE2XTsKIAogCWlmIChzaXplID49IHNpemVvZiBidWYpCkBAIC04NSwxMyArODksMjAgQEAKIAlkID0gYW9lZGV2X2J5X2FvZWFkZHIobWFqb3IsIG1pbm9yKTsKIAlpZiAoIWQpCiAJCXJldHVybiAtRUlOVkFMOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmQtPmxvY2ssIGZsYWdzKTsKLQlkLT5mbGFncyAmPSB+REVWRkxfTUFYQkNOVDsKLQlkLT5mbGFncyB8PSBERVZGTF9QQVVTRTsKKwlhb2VjbWRfY2xlYW5zbGF0ZShkKTsKK2xvb3A6CisJc2tiID0gYW9lY21kX2F0YV9pZChkKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT5sb2NrLCBmbGFncyk7CisJLyogdHJ5IGFnYWluIGlmIHdlIGFyZSBhYmxlIHRvIHNsZWVwIGEgYml0LAorCSAqIG90aGVyd2lzZSBnaXZlIHVwIHRoaXMgcmV2YWxpZGF0aW9uCisJICovCisJaWYgKCFza2IgJiYgIW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDIwMCkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmQtPmxvY2ssIGZsYWdzKTsKKwkJZ290byBsb29wOworCX0KKwlhb2VuZXRfeG1pdChza2IpOwogCWFvZWNtZF9jZmcobWFqb3IsIG1pbm9yKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0xNDksNiArMTYwLDkgQEAKIAkJYnJlYWs7CiAJY2FzZSBNSU5PUl9SRVZBTElEQVRFOgogCQlyZXQgPSByZXZhbGlkYXRlKGJ1ZiwgY250KTsKKwkJYnJlYWs7CisJY2FzZSBNSU5PUl9GTFVTSDoKKwkJcmV0ID0gYW9lZGV2X2ZsdXNoKGJ1ZiwgY250KTsKIAl9CiAJaWYgKHJldCA9PSAwKQogCQlyZXQgPSBjbnQ7CkBAIC0xODUsNTIgKzE5OSw1MSBAQAogCXVsb25nIGZsYWdzOwogCiAJbiA9ICh1bnNpZ25lZCBsb25nKSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0Jc3dpdGNoIChuKSB7Ci0JY2FzZSBNSU5PUl9FUlI6Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZlbXNnc19sb2NrLCBmbGFncyk7Ci1sb29wOgorCWlmIChuICE9IE1JTk9SX0VSUikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW1zZ3NfbG9jaywgZmxhZ3MpOworCisJZm9yICg7OykgewogCQllbSA9IGVtc2dzICsgZW1zZ3NfaGVhZF9pZHg7Ci0JCWlmICgoZW0tPmZsYWdzICYgRU1GTF9WQUxJRCkgPT0gMCkgewotCQkJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05ERUxBWSkgewotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtc2dzX2xvY2ssIGZsYWdzKTsKLQkJCQlyZXR1cm4gLUVBR0FJTjsKLQkJCX0KLQkJCW5ibG9ja2VkX2Vtc2dzX3JlYWRlcnMrKzsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW1zZ3NfbG9jaywgZmxhZ3MpOwotCi0JCQluID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZlbXNnc19zZW1hKTsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmVtc2dzX2xvY2ssIGZsYWdzKTsKLQotCQkJbmJsb2NrZWRfZW1zZ3NfcmVhZGVycy0tOwotCi0JCQlpZiAobikgewotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtc2dzX2xvY2ssIGZsYWdzKTsKLQkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCQkJfQotCQkJZ290byBsb29wOwotCQl9Ci0JCWlmIChlbS0+bGVuID4gY250KSB7CisJCWlmICgoZW0tPmZsYWdzICYgRU1GTF9WQUxJRCkgIT0gMCkKKwkJCWJyZWFrOworCQlpZiAoZmlscC0+Zl9mbGFncyAmIE9fTkRFTEFZKSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXNnc19sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm4gLUVBR0FJTjsKIAkJfQotCQltcCA9IGVtLT5tc2c7Ci0JCWxlbiA9IGVtLT5sZW47Ci0JCWVtLT5tc2cgPSBOVUxMOwotCQllbS0+ZmxhZ3MgJj0gfkVNRkxfVkFMSUQ7Ci0KLQkJZW1zZ3NfaGVhZF9pZHgrKzsKLQkJZW1zZ3NfaGVhZF9pZHggJT0gQVJSQVlfU0laRShlbXNncyk7CisJCW5ibG9ja2VkX2Vtc2dzX3JlYWRlcnMrKzsKIAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXNnc19sb2NrLCBmbGFncyk7CiAKLQkJbiA9IGNvcHlfdG9fdXNlcihidWYsIG1wLCBsZW4pOwotCQlrZnJlZShtcCk7Ci0JCXJldHVybiBuID09IDAgPyBsZW4gOiAtRUZBVUxUOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUZBVUxUOworCQluID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZlbXNnc19zZW1hKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZW1zZ3NfbG9jaywgZmxhZ3MpOworCisJCW5ibG9ja2VkX2Vtc2dzX3JlYWRlcnMtLTsKKworCQlpZiAobikgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW1zZ3NfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJfQogCX0KKwlpZiAoZW0tPmxlbiA+IGNudCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXNnc19sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwltcCA9IGVtLT5tc2c7CisJbGVuID0gZW0tPmxlbjsKKwllbS0+bXNnID0gTlVMTDsKKwllbS0+ZmxhZ3MgJj0gfkVNRkxfVkFMSUQ7CisKKwllbXNnc19oZWFkX2lkeCsrOworCWVtc2dzX2hlYWRfaWR4ICU9IEFSUkFZX1NJWkUoZW1zZ3MpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW1zZ3NfbG9jaywgZmxhZ3MpOworCisJbiA9IGNvcHlfdG9fdXNlcihidWYsIG1wLCBsZW4pOworCWtmcmVlKG1wKTsKKwlyZXR1cm4gbiA9PSAwID8gbGVuIDogLUVGQVVMVDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYW9lX2ZvcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VjbWQuYyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWNtZC5jCmluZGV4IDRkNTlkNTAuLmQwMDI5M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZWNtZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWNtZC5jCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA2IENvcmFpZCwgSW5jLiAgU2VlIENPUFlJTkcgZm9yIEdQTCB0ZXJtcy4gKi8KKy8qIENvcHlyaWdodCAoYykgMjAwNyBDb3JhaWQsIEluYy4gIFNlZSBDT1BZSU5HIGZvciBHUEwgdGVybXMuICovCiAvKgogICogYW9lY21kLmMKICAqIEZpbGVzeXN0ZW0gcmVxdWVzdCBoYW5kbGluZyBtZXRob2RzCkBAIC05LDE5ICs5LDIxIEBACiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZ2VuaGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogI2luY2x1ZGUgImFvZS5oIgogCi0jZGVmaW5lIFRJTUVSVElDSyAoSFogLyAxMCkKLSNkZWZpbmUgTUlOVElNRVIgKDIgKiBUSU1FUlRJQ0spCi0jZGVmaW5lIE1BWFRJTUVSIChIWiA8PCAxKQotCiBzdGF0aWMgaW50IGFvZV9kZWFkc2VjcyA9IDYwICogMzsKIG1vZHVsZV9wYXJhbShhb2VfZGVhZHNlY3MsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGFvZV9kZWFkc2VjcywgIkFmdGVyIGFvZV9kZWFkc2VjcyBzZWNvbmRzLCBnaXZlIHVwIGFuZCBmYWlsIGRldi4iKTsKIAotc3RydWN0IHNrX2J1ZmYgKgorc3RhdGljIGludCBhb2VfbWF4b3V0ID0gMTY7Cittb2R1bGVfcGFyYW0oYW9lX21heG91dCwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYW9lX21heG91dCwKKwkiT25seSBhb2VfbWF4b3V0IG91dHN0YW5kaW5nIHBhY2tldHMgZm9yIGV2ZXJ5IE1BQyBvbiBlWC5ZLiIpOworCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgogbmV3X3NrYih1bG9uZyBsZW4pCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTQzLDEyICs0NSwxMiBAQAogfQogCiBzdGF0aWMgc3RydWN0IGZyYW1lICoKLWdldGZyYW1lKHN0cnVjdCBhb2VkZXYgKmQsIGludCB0YWcpCitnZXRmcmFtZShzdHJ1Y3QgYW9ldGd0ICp0LCBpbnQgdGFnKQogewogCXN0cnVjdCBmcmFtZSAqZiwgKmU7CiAKLQlmID0gZC0+ZnJhbWVzOwotCWUgPSBmICsgZC0+bmZyYW1lczsKKwlmID0gdC0+ZnJhbWVzOworCWUgPSBmICsgdC0+bmZyYW1lczsKIAlmb3IgKDsgZjxlOyBmKyspCiAJCWlmIChmLT50YWcgPT0gdGFnKQogCQkJcmV0dXJuIGY7CkBAIC02MSwyMSArNjMsMjEgQEAKICAqIFRoaXMgZHJpdmVyIHJlc2VydmVzIHRhZyAtMSB0byBtZWFuICJ1bnVzZWQgZnJhbWUuIgogICovCiBzdGF0aWMgaW50Ci1uZXd0YWcoc3RydWN0IGFvZWRldiAqZCkKK25ld3RhZyhzdHJ1Y3QgYW9ldGd0ICp0KQogewogCXJlZ2lzdGVyIHVsb25nIG47CiAKIAluID0gamlmZmllcyAmIDB4ZmZmZjsKLQlyZXR1cm4gbiB8PSAoKytkLT5sYXN0dGFnICYgMHg3ZmZmKSA8PCAxNjsKKwlyZXR1cm4gbiB8PSAoKyt0LT5sYXN0dGFnICYgMHg3ZmZmKSA8PCAxNjsKIH0KIAogc3RhdGljIGludAotYW9laGRyX2F0YWluaXQoc3RydWN0IGFvZWRldiAqZCwgc3RydWN0IGFvZV9oZHIgKmgpCithb2VoZHJfYXRhaW5pdChzdHJ1Y3QgYW9lZGV2ICpkLCBzdHJ1Y3QgYW9ldGd0ICp0LCBzdHJ1Y3QgYW9lX2hkciAqaCkKIHsKLQl1MzIgaG9zdF90YWcgPSBuZXd0YWcoZCk7CisJdTMyIGhvc3RfdGFnID0gbmV3dGFnKHQpOwogCi0JbWVtY3B5KGgtPnNyYywgZC0+aWZwLT5kZXZfYWRkciwgc2l6ZW9mIGgtPnNyYyk7Ci0JbWVtY3B5KGgtPmRzdCwgZC0+YWRkciwgc2l6ZW9mIGgtPmRzdCk7CisJbWVtY3B5KGgtPnNyYywgdC0+aWZwLT5uZC0+ZGV2X2FkZHIsIHNpemVvZiBoLT5zcmMpOworCW1lbWNweShoLT5kc3QsIHQtPmFkZHIsIHNpemVvZiBoLT5kc3QpOwogCWgtPnR5cGUgPSBfX2NvbnN0YW50X2NwdV90b19iZTE2KEVUSF9QX0FPRSk7CiAJaC0+dmVyZmwgPSBBT0VfSFZFUjsKIAloLT5tYWpvciA9IGNwdV90b19iZTE2KGQtPmFvZW1ham9yKTsKQEAgLTk4LDQyICsxMDAsMTYyIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1hb2VjbWRfYXRhX3J3KHN0cnVjdCBhb2VkZXYgKmQsIHN0cnVjdCBmcmFtZSAqZikKK2lmcm90YXRlKHN0cnVjdCBhb2V0Z3QgKnQpCiB7CisJdC0+aWZwKys7CisJaWYgKHQtPmlmcCA+PSAmdC0+aWZzW05BT0VJRlNdIHx8IHQtPmlmcC0+bmQgPT0gTlVMTCkKKwkJdC0+aWZwID0gdC0+aWZzOworCWlmICh0LT5pZnAtPm5kID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiBubyBpbnRlcmZhY2UgdG8gcm90YXRlIHRvXG4iKTsKKwkJQlVHKCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorc2tiX3Bvb2xfcHV0KHN0cnVjdCBhb2VkZXYgKmQsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKCFkLT5za2Jwb29sX2hkKQorCQlkLT5za2Jwb29sX2hkID0gc2tiOworCWVsc2UKKwkJZC0+c2ticG9vbF90bC0+bmV4dCA9IHNrYjsKKwlkLT5za2Jwb29sX3RsID0gc2tiOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgorc2tiX3Bvb2xfZ2V0KHN0cnVjdCBhb2VkZXYgKmQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXNrYiA9IGQtPnNrYnBvb2xfaGQ7CisJaWYgKHNrYiAmJiBhdG9taWNfcmVhZCgmc2tiX3NoaW5mbyhza2IpLT5kYXRhcmVmKSA9PSAxKSB7CisJCWQtPnNrYnBvb2xfaGQgPSBza2ItPm5leHQ7CisJCXNrYi0+bmV4dCA9IE5VTEw7CisJCXJldHVybiBza2I7CisJfQorCWlmIChkLT5uc2ticG9vbCA8IE5TS0JQT09MTUFYCisJJiYgKHNrYiA9IG5ld19za2IoRVRIX1pMRU4pKSkgeworCQlkLT5uc2ticG9vbCsrOworCQlyZXR1cm4gc2tiOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogZnJlZWZyYW1lIGlzIHdoZXJlIHdlIGRvIG91ciBsb2FkIGJhbGFuY2luZyBzbyBpdCdzIGEgbGl0dGxlIGhhaXJ5LiAqLworc3RhdGljIHN0cnVjdCBmcmFtZSAqCitmcmVlZnJhbWUoc3RydWN0IGFvZWRldiAqZCkKK3sKKwlzdHJ1Y3QgZnJhbWUgKmYsICplLCAqcmY7CisJc3RydWN0IGFvZXRndCAqKnQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWlmIChkLT50YXJnZXRzWzBdID09IE5VTEwpIHsJLyogc2hvdWxkbid0IGhhcHBlbiwgYnV0IEknbSBwYXJhbm9pZCAqLworCQlwcmludGsoS0VSTl9FUlIgImFvZTogTlVMTCBUQVJHRVRTIVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwl0ID0gZC0+dGd0OworCXQrKzsKKwlpZiAodCA+PSAmZC0+dGFyZ2V0c1tOVEFSR0VUU10gfHwgISp0KQorCQl0ID0gZC0+dGFyZ2V0czsKKwlmb3IgKDs7KSB7CisJCWlmICgoKnQpLT5ub3V0IDwgKCp0KS0+bWF4b3V0CisJCSYmIHQgIT0gZC0+aHRndAorCQkmJiAoKnQpLT5pZnAtPm5kKSB7CisJCQlyZiA9IE5VTEw7CisJCQlmID0gKCp0KS0+ZnJhbWVzOworCQkJZSA9IGYgKyAoKnQpLT5uZnJhbWVzOworCQkJZm9yICg7IGYgPCBlOyBmKyspIHsKKwkJCQlpZiAoZi0+dGFnICE9IEZSRUVUQUcpCisJCQkJCWNvbnRpbnVlOworCQkJCXNrYiA9IGYtPnNrYjsKKwkJCQlpZiAoIXNrYgorCQkJCSYmICEoZi0+c2tiID0gc2tiID0gbmV3X3NrYihFVEhfWkxFTikpKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoYXRvbWljX3JlYWQoJnNrYl9zaGluZm8oc2tiKS0+ZGF0YXJlZikKKwkJCQkJIT0gMSkgeworCQkJCQlpZiAoIXJmKQorCQkJCQkJcmYgPSBmOworCQkJCQljb250aW51ZTsKKwkJCQl9Citnb3RvbmU6CQkJCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPSBza2ItPmRhdGFfbGVuID0gMDsKKwkJCQlza2JfdHJpbShza2IsIDApOworCQkJCWQtPnRndCA9IHQ7CisJCQkJaWZyb3RhdGUoKnQpOworCQkJCXJldHVybiBmOworCQkJfQorCQkJLyogV29yayBjYW4gYmUgZG9uZSwgYnV0IHRoZSBuZXR3b3JrIGxheWVyIGlzCisJCQkgICBob2xkaW5nIG91ciBwcmVjaW91cyBwYWNrZXRzLiAgVHJ5IHRvIGdyYWIKKwkJCSAgIG9uZSBmcm9tIHRoZSBwb29sLiAqLworCQkJZiA9IHJmOworCQkJaWYgKGYgPT0gTlVMTCkgewkvKiBtb3JlIHBhcmFub2lhICovCisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSJhb2U6IGZyZWVmcmFtZTogJXMuXG4iLAorCQkJCQkidW5leHBlY3RlZCBudWxsIHJmIik7CisJCQkJZC0+ZmxhZ3MgfD0gREVWRkxfS0lDS01FOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJc2tiID0gc2tiX3Bvb2xfZ2V0KGQpOworCQkJaWYgKHNrYikgeworCQkJCXNrYl9wb29sX3B1dChkLCBmLT5za2IpOworCQkJCWYtPnNrYiA9IHNrYjsKKwkJCQlnb3RvIGdvdG9uZTsKKwkJCX0KKwkJCSgqdCktPmRhdGFyZWYrKzsKKwkJCWlmICgoKnQpLT5ub3V0ID09IDApCisJCQkJZC0+ZmxhZ3MgfD0gREVWRkxfS0lDS01FOworCQl9CisJCWlmICh0ID09IGQtPnRndCkJLyogd2UndmUgbG9vcGVkIGFuZCBmb3VuZCBuYWRhICovCisJCQlicmVhazsKKwkJdCsrOworCQlpZiAodCA+PSAmZC0+dGFyZ2V0c1tOVEFSR0VUU10gfHwgISp0KQorCQkJdCA9IGQtPnRhcmdldHM7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50Cithb2VjbWRfYXRhX3J3KHN0cnVjdCBhb2VkZXYgKmQpCit7CisJc3RydWN0IGZyYW1lICpmOwogCXN0cnVjdCBhb2VfaGRyICpoOwogCXN0cnVjdCBhb2VfYXRhaGRyICphaDsKIAlzdHJ1Y3QgYnVmICpidWY7CisJc3RydWN0IGJpb192ZWMgKmJ2OworCXN0cnVjdCBhb2V0Z3QgKnQ7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1bG9uZyBiY250OwotCXJlZ2lzdGVyIHNlY3Rvcl90IHNlY3RvcjsKIAljaGFyIHdyaXRlYml0LCBleHRiaXQ7CiAKIAl3cml0ZWJpdCA9IDB4MTA7CiAJZXh0Yml0ID0gMHg0OwogCisJZiA9IGZyZWVmcmFtZShkKTsKKwlpZiAoZiA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwl0ID0gKmQtPnRndDsKIAlidWYgPSBkLT5pbnByb2Nlc3M7Ci0KLQlzZWN0b3IgPSBidWYtPnNlY3RvcjsKLQliY250ID0gYnVmLT5idl9yZXNpZDsKLQlpZiAoYmNudCA+IGQtPm1heGJjbnQpCi0JCWJjbnQgPSBkLT5tYXhiY250OwotCisJYnYgPSBidWYtPmJ2OworCWJjbnQgPSB0LT5pZnAtPm1heGJjbnQ7CisJaWYgKGJjbnQgPT0gMCkKKwkJYmNudCA9IERFRkFVTFRCQ05UOworCWlmIChiY250ID4gYnVmLT5idl9yZXNpZCkKKwkJYmNudCA9IGJ1Zi0+YnZfcmVzaWQ7CiAJLyogaW5pdGlhbGl6ZSB0aGUgaGVhZGVycyAmIGZyYW1lICovCiAJc2tiID0gZi0+c2tiOwogCWggPSAoc3RydWN0IGFvZV9oZHIgKikgc2tiX21hY19oZWFkZXIoc2tiKTsKIAlhaCA9IChzdHJ1Y3QgYW9lX2F0YWhkciAqKSAoaCsxKTsKIAlza2JfcHV0KHNrYiwgc2l6ZW9mICpoICsgc2l6ZW9mICphaCk7CiAJbWVtc2V0KGgsIDAsIHNrYi0+bGVuKTsKLQlmLT50YWcgPSBhb2VoZHJfYXRhaW5pdChkLCBoKTsKKwlmLT50YWcgPSBhb2VoZHJfYXRhaW5pdChkLCB0LCBoKTsKKwl0LT5ub3V0Kys7CiAJZi0+d2FpdGVkID0gMDsKIAlmLT5idWYgPSBidWY7Ci0JZi0+YnVmYWRkciA9IGJ1Zi0+YnVmYWRkcjsKKwlmLT5idWZhZGRyID0gcGFnZV9hZGRyZXNzKGJ2LT5idl9wYWdlKSArIGJ1Zi0+YnZfb2ZmOwogCWYtPmJjbnQgPSBiY250OwotCWYtPmxiYSA9IHNlY3RvcjsKKwlmLT5sYmEgPSBidWYtPnNlY3RvcjsKIAogCS8qIHNldCB1cCBhdGEgaGVhZGVyICovCiAJYWgtPnNjbnQgPSBiY250ID4+IDk7Ci0JcHV0X2xiYShhaCwgc2VjdG9yKTsKKwlwdXRfbGJhKGFoLCBidWYtPnNlY3Rvcik7CiAJaWYgKGQtPmZsYWdzICYgREVWRkxfRVhUKSB7CiAJCWFoLT5hZmxhZ3MgfD0gQU9FQUZMX0VYVDsKIAl9IGVsc2UgewpAQCAtMTQxLDE0ICsyNjMsMTQgQEAKIAkJYWgtPmxiYTMgJj0gMHgwZjsKIAkJYWgtPmxiYTMgfD0gMHhlMDsJLyogTEJBIGJpdCArIG9ic29sZXRlIDB4YTAgKi8KIAl9Ci0KIAlpZiAoYmlvX2RhdGFfZGlyKGJ1Zi0+YmlvKSA9PSBXUklURSkgewotCQlza2JfZmlsbF9wYWdlX2Rlc2Moc2tiLCAwLCB2aXJ0X3RvX3BhZ2UoZi0+YnVmYWRkciksCi0JCQlvZmZzZXRfaW5fcGFnZShmLT5idWZhZGRyKSwgYmNudCk7CisJCXNrYl9maWxsX3BhZ2VfZGVzYyhza2IsIDAsIGJ2LT5idl9wYWdlLCBidWYtPmJ2X29mZiwgYmNudCk7CiAJCWFoLT5hZmxhZ3MgfD0gQU9FQUZMX1dSSVRFOwogCQlza2ItPmxlbiArPSBiY250OwogCQlza2ItPmRhdGFfbGVuID0gYmNudDsKKwkJdC0+d3BrdHMrKzsKIAl9IGVsc2UgeworCQl0LT5ycGt0cysrOwogCQl3cml0ZWJpdCA9IDA7CiAJfQogCkBAIC0xNTYsMjkgKzI3OCwyOSBAQAogCiAJLyogbWFyayBhbGwgdHJhY2tpbmcgZmllbGRzIGFuZCBsb2FkIG91dCAqLwogCWJ1Zi0+bmZyYW1lc291dCArPSAxOwotCWJ1Zi0+YnVmYWRkciArPSBiY250OworCWJ1Zi0+YnZfb2ZmICs9IGJjbnQ7CiAJYnVmLT5idl9yZXNpZCAtPSBiY250OwotLyogcHJpbnRrKEtFUk5fREVCVUcgImFvZTogYnZfcmVzaWQ9JWxkXG4iLCBidWYtPmJ2X3Jlc2lkKTsgKi8KIAlidWYtPnJlc2lkIC09IGJjbnQ7CiAJYnVmLT5zZWN0b3IgKz0gYmNudCA+PiA5OwogCWlmIChidWYtPnJlc2lkID09IDApIHsKIAkJZC0+aW5wcm9jZXNzID0gTlVMTDsKIAl9IGVsc2UgaWYgKGJ1Zi0+YnZfcmVzaWQgPT0gMCkgewotCQlidWYtPmJ2Kys7Ci0JCVdBUk5fT04oYnVmLT5idi0+YnZfbGVuID09IDApOwotCQlidWYtPmJ2X3Jlc2lkID0gYnVmLT5idi0+YnZfbGVuOwotCQlidWYtPmJ1ZmFkZHIgPSBwYWdlX2FkZHJlc3MoYnVmLT5idi0+YnZfcGFnZSkgKyBidWYtPmJ2LT5idl9vZmZzZXQ7CisJCWJ1Zi0+YnYgPSArK2J2OworCQlidWYtPmJ2X3Jlc2lkID0gYnYtPmJ2X2xlbjsKKwkJV0FSTl9PTihidWYtPmJ2X3Jlc2lkID09IDApOworCQlidWYtPmJ2X29mZiA9IGJ2LT5idl9vZmZzZXQ7CiAJfQogCi0Jc2tiLT5kZXYgPSBkLT5pZnA7CisJc2tiLT5kZXYgPSB0LT5pZnAtPm5kOwogCXNrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOwotCWlmIChza2IgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWlmIChkLT5zZW5kcV9oZCkKLQkJZC0+c2VuZHFfdGwtPm5leHQgPSBza2I7Ci0JZWxzZQotCQlkLT5zZW5kcV9oZCA9IHNrYjsKLQlkLT5zZW5kcV90bCA9IHNrYjsKKwlpZiAoc2tiKSB7CisJCWlmIChkLT5zZW5kcV9oZCkKKwkJCWQtPnNlbmRxX3RsLT5uZXh0ID0gc2tiOworCQllbHNlCisJCQlkLT5zZW5kcV9oZCA9IHNrYjsKKwkJZC0+c2VuZHFfdGwgPSBza2I7CisJfQorCXJldHVybiAxOwogfQogCiAvKiBzb21lIGNhbGxlcnMgY2Fubm90IHNsZWVwLCBhbmQgdGhleSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uLApAQCAtMjMyLDYyICszNTQsOCBAQAogCXJldHVybiBzbDsKIH0KIAotc3RhdGljIHN0cnVjdCBmcmFtZSAqCi1mcmVlZnJhbWUoc3RydWN0IGFvZWRldiAqZCkKLXsKLQlzdHJ1Y3QgZnJhbWUgKmYsICplOwotCWludCBuID0gMDsKLQotCWYgPSBkLT5mcmFtZXM7Ci0JZSA9IGYgKyBkLT5uZnJhbWVzOwotCWZvciAoOyBmPGU7IGYrKykgewotCQlpZiAoZi0+dGFnICE9IEZSRUVUQUcpCi0JCQljb250aW51ZTsKLQkJaWYgKGF0b21pY19yZWFkKCZza2Jfc2hpbmZvKGYtPnNrYiktPmRhdGFyZWYpID09IDEpIHsKLQkJCXNrYl9zaGluZm8oZi0+c2tiKS0+bnJfZnJhZ3MgPSBmLT5za2ItPmRhdGFfbGVuID0gMDsKLQkJCXNrYl90cmltKGYtPnNrYiwgMCk7Ci0JCQlyZXR1cm4gZjsKLQkJfQotCQluKys7Ci0JfQotCWlmIChuID09IGQtPm5mcmFtZXMpCS8qIHdhaXQgZm9yIG5ldHdvcmsgbGF5ZXIgKi8KLQkJZC0+ZmxhZ3MgfD0gREVWRkxfS0lDS01FOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIGVudGVycyB3aXRoIGQtPmxvY2sgaGVsZCAqLwotdm9pZAotYW9lY21kX3dvcmsoc3RydWN0IGFvZWRldiAqZCkKLXsKLQlzdHJ1Y3QgZnJhbWUgKmY7Ci0Jc3RydWN0IGJ1ZiAqYnVmOwotCi0JaWYgKGQtPmZsYWdzICYgREVWRkxfUEFVU0UpIHsKLQkJaWYgKCFhb2VkZXZfaXNidXN5KGQpKQotCQkJZC0+c2VuZHFfaGQgPSBhb2VjbWRfY2ZnX3BrdHMoZC0+YW9lbWFqb3IsCi0JCQkJCQlkLT5hb2VtaW5vciwgJmQtPnNlbmRxX3RsKTsKLQkJcmV0dXJuOwotCX0KLQotbG9vcDoKLQlmID0gZnJlZWZyYW1lKGQpOwotCWlmIChmID09IE5VTEwpCi0JCXJldHVybjsKLQlpZiAoZC0+aW5wcm9jZXNzID09IE5VTEwpIHsKLQkJaWYgKGxpc3RfZW1wdHkoJmQtPmJ1ZnEpKQotCQkJcmV0dXJuOwotCQlidWYgPSBjb250YWluZXJfb2YoZC0+YnVmcS5uZXh0LCBzdHJ1Y3QgYnVmLCBidWZzKTsKLQkJbGlzdF9kZWwoZC0+YnVmcS5uZXh0KTsKLS8qcHJpbnRrKEtFUk5fREVCVUcgImFvZTogYmlfc2l6ZT0lbGRcbiIsIGJ1Zi0+YmlvLT5iaV9zaXplKTsgKi8KLQkJZC0+aW5wcm9jZXNzID0gYnVmOwotCX0KLQlhb2VjbWRfYXRhX3J3KGQsIGYpOwotCWdvdG8gbG9vcDsKLX0KLQogc3RhdGljIHZvaWQKLXJleG1pdChzdHJ1Y3QgYW9lZGV2ICpkLCBzdHJ1Y3QgZnJhbWUgKmYpCityZXNlbmQoc3RydWN0IGFvZWRldiAqZCwgc3RydWN0IGFvZXRndCAqdCwgc3RydWN0IGZyYW1lICpmKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGFvZV9oZHIgKmg7CkBAIC0yOTUsNDEgKzM2Myw0NiBAQAogCWNoYXIgYnVmWzEyOF07CiAJdTMyIG47CiAKLQluID0gbmV3dGFnKGQpOwotCi0Jc25wcmludGYoYnVmLCBzaXplb2YgYnVmLAotCQkiJTE1cyBlJWxkLiVsZCBvbGR0YWc9JTA4eEAlMDhseCBuZXd0YWc9JTA4eFxuIiwKLQkJInJldHJhbnNtaXQiLAotCQlkLT5hb2VtYWpvciwgZC0+YW9lbWlub3IsIGYtPnRhZywgamlmZmllcywgbik7Ci0JYW9lY2hyX2Vycm9yKGJ1Zik7Ci0KKwlpZnJvdGF0ZSh0KTsKKwluID0gbmV3dGFnKHQpOwogCXNrYiA9IGYtPnNrYjsKIAloID0gKHN0cnVjdCBhb2VfaGRyICopIHNrYl9tYWNfaGVhZGVyKHNrYik7CiAJYWggPSAoc3RydWN0IGFvZV9hdGFoZHIgKikgKGgrMSk7CisKKwlzbnByaW50ZihidWYsIHNpemVvZiBidWYsCisJCSIlMTVzIGUlbGQuJWQgb2xkdGFnPSUwOHhAJTA4bHggbmV3dGFnPSUwOHggIgorCQkicz0lMDEybGx4IGQ9JTAxMmxseCBub3V0PSVkXG4iLAorCQkicmV0cmFuc21pdCIsIGQtPmFvZW1ham9yLCBkLT5hb2VtaW5vciwgZi0+dGFnLCBqaWZmaWVzLCBuLAorCQltYWNfYWRkcihoLT5zcmMpLAorCQltYWNfYWRkcihoLT5kc3QpLCB0LT5ub3V0KTsKKwlhb2VjaHJfZXJyb3IoYnVmKTsKKwogCWYtPnRhZyA9IG47CiAJaC0+dGFnID0gY3B1X3RvX2JlMzIobik7Ci0JbWVtY3B5KGgtPmRzdCwgZC0+YWRkciwgc2l6ZW9mIGgtPmRzdCk7Ci0JbWVtY3B5KGgtPnNyYywgZC0+aWZwLT5kZXZfYWRkciwgc2l6ZW9mIGgtPnNyYyk7CisJbWVtY3B5KGgtPmRzdCwgdC0+YWRkciwgc2l6ZW9mIGgtPmRzdCk7CisJbWVtY3B5KGgtPnNyYywgdC0+aWZwLT5uZC0+ZGV2X2FkZHIsIHNpemVvZiBoLT5zcmMpOwogCi0JbiA9IERFRkFVTFRCQ05UIC8gNTEyOwotCWlmIChhaC0+c2NudCA+IG4pIHsKLQkJYWgtPnNjbnQgPSBuOworCXN3aXRjaCAoYWgtPmNtZHN0YXQpIHsKKwlkZWZhdWx0OgorCQlicmVhazsKKwljYXNlIFdJTl9SRUFEOgorCWNhc2UgV0lOX1JFQURfRVhUOgorCWNhc2UgV0lOX1dSSVRFOgorCWNhc2UgV0lOX1dSSVRFX0VYVDoKKwkJcHV0X2xiYShhaCwgZi0+bGJhKTsKKworCQluID0gZi0+YmNudDsKKwkJaWYgKG4gPiBERUZBVUxUQkNOVCkKKwkJCW4gPSBERUZBVUxUQkNOVDsKKwkJYWgtPnNjbnQgPSBuID4+IDk7CiAJCWlmIChhaC0+YWZsYWdzICYgQU9FQUZMX1dSSVRFKSB7CiAJCQlza2JfZmlsbF9wYWdlX2Rlc2Moc2tiLCAwLCB2aXJ0X3RvX3BhZ2UoZi0+YnVmYWRkciksCi0JCQkJb2Zmc2V0X2luX3BhZ2UoZi0+YnVmYWRkciksIERFRkFVTFRCQ05UKTsKLQkJCXNrYi0+bGVuID0gc2l6ZW9mICpoICsgc2l6ZW9mICphaCArIERFRkFVTFRCQ05UOwotCQkJc2tiLT5kYXRhX2xlbiA9IERFRkFVTFRCQ05UOwotCQl9Ci0JCWlmICgrK2QtPmxvc3RqdW1ibyA+IChkLT5uZnJhbWVzIDw8IDEpKQotCQlpZiAoZC0+bWF4YmNudCAhPSBERUZBVUxUQkNOVCkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiBlJWxkLiVsZDogdG9vIG1hbnkgbG9zdCBqdW1ibyBvbiAlcyAtIHVzaW5nIDFLQiBmcmFtZXMuXG4iLAotCQkJCWQtPmFvZW1ham9yLCBkLT5hb2VtaW5vciwgZC0+aWZwLT5uYW1lKTsKLQkJCWQtPm1heGJjbnQgPSBERUZBVUxUQkNOVDsKLQkJCWQtPmZsYWdzIHw9IERFVkZMX01BWEJDTlQ7CisJCQkJb2Zmc2V0X2luX3BhZ2UoZi0+YnVmYWRkciksIG4pOworCQkJc2tiLT5sZW4gPSBzaXplb2YgKmggKyBzaXplb2YgKmFoICsgbjsKKwkJCXNrYi0+ZGF0YV9sZW4gPSBuOwogCQl9CiAJfQotCi0Jc2tiLT5kZXYgPSBkLT5pZnA7CisJc2tiLT5kZXYgPSB0LT5pZnAtPm5kOwogCXNrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOwogCWlmIChza2IgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMzUyLDEwICs0MjUsOTIgQEAKIAlyZXR1cm4gbjsKIH0KIAorc3RhdGljIHN0cnVjdCBhb2VpZiAqCitnZXRpZihzdHJ1Y3QgYW9ldGd0ICp0LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmQpCit7CisJc3RydWN0IGFvZWlmICpwLCAqZTsKKworCXAgPSB0LT5pZnM7CisJZSA9IHAgKyBOQU9FSUZTOworCWZvciAoOyBwIDwgZTsgcCsrKQorCQlpZiAocC0+bmQgPT0gbmQpCisJCQlyZXR1cm4gcDsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBhb2VpZiAqCithZGRpZihzdHJ1Y3QgYW9ldGd0ICp0LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmQpCit7CisJc3RydWN0IGFvZWlmICpwOworCisJcCA9IGdldGlmKHQsIE5VTEwpOworCWlmICghcCkKKwkJcmV0dXJuIE5VTEw7CisJcC0+bmQgPSBuZDsKKwlwLT5tYXhiY250ID0gREVGQVVMVEJDTlQ7CisJcC0+bG9zdCA9IDA7CisJcC0+bG9zdGp1bWJvID0gMDsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIHZvaWQKK2VqZWN0aWYoc3RydWN0IGFvZXRndCAqdCwgc3RydWN0IGFvZWlmICppZnApCit7CisJc3RydWN0IGFvZWlmICplOworCXVsb25nIG47CisKKwllID0gdC0+aWZzICsgTkFPRUlGUyAtIDE7CisJbiA9IChlIC0gaWZwKSAqIHNpemVvZiAqaWZwOworCW1lbW1vdmUoaWZwLCBpZnArMSwgbik7CisJZS0+bmQgPSBOVUxMOworfQorCitzdGF0aWMgaW50CitzdGh0aXRoKHN0cnVjdCBhb2VkZXYgKmQpCit7CisJc3RydWN0IGZyYW1lICpmLCAqZSwgKm5mOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGFvZXRndCAqaHQgPSAqZC0+aHRndDsKKworCWYgPSBodC0+ZnJhbWVzOworCWUgPSBmICsgaHQtPm5mcmFtZXM7CisJZm9yICg7IGYgPCBlOyBmKyspIHsKKwkJaWYgKGYtPnRhZyA9PSBGUkVFVEFHKQorCQkJY29udGludWU7CisJCW5mID0gZnJlZWZyYW1lKGQpOworCQlpZiAoIW5mKQorCQkJcmV0dXJuIDA7CisJCXNrYiA9IG5mLT5za2I7CisJCSpuZiA9ICpmOworCQlmLT5za2IgPSBza2I7CisJCWYtPnRhZyA9IEZSRUVUQUc7CisJCW5mLT53YWl0ZWQgPSAwOworCQlodC0+bm91dC0tOworCQkoKmQtPnRndCktPm5vdXQrKzsKKwkJcmVzZW5kKGQsICpkLT50Z3QsIG5mKTsKKwl9CisJLyogaGUncyBjbGVhbiwgaGUncyB1c2VsZXNzLiAgdGFrZSBhd2F5IGhpcyBpbnRlcmZhY2VzICovCisJbWVtc2V0KGh0LT5pZnMsIDAsIHNpemVvZiBodC0+aWZzKTsKKwlkLT5odGd0ID0gTlVMTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyCithdGFfc2NudCh1bnNpZ25lZCBjaGFyICpwYWNrZXQpIHsKKwlzdHJ1Y3QgYW9lX2hkciAqaDsKKwlzdHJ1Y3QgYW9lX2F0YWhkciAqYWg7CisKKwloID0gKHN0cnVjdCBhb2VfaGRyICopIHBhY2tldDsKKwlhaCA9IChzdHJ1Y3QgYW9lX2F0YWhkciAqKSAoaCsxKTsKKwlyZXR1cm4gYWgtPnNjbnQ7Cit9CisKIHN0YXRpYyB2b2lkCiByZXhtaXRfdGltZXIodWxvbmcgdnApCiB7CiAJc3RydWN0IGFvZWRldiAqZDsKKwlzdHJ1Y3QgYW9ldGd0ICp0LCAqKnR0LCAqKnRlOworCXN0cnVjdCBhb2VpZiAqaWZwOwogCXN0cnVjdCBmcmFtZSAqZiwgKmU7CiAJc3RydWN0IHNrX2J1ZmYgKnNsOwogCXJlZ2lzdGVyIGxvbmcgdGltZW91dDsKQEAgLTM3NCwzMSArNTI5LDc5IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KLQlmID0gZC0+ZnJhbWVzOwotCWUgPSBmICsgZC0+bmZyYW1lczsKLQlmb3IgKDsgZjxlOyBmKyspIHsKLQkJaWYgKGYtPnRhZyAhPSBGUkVFVEFHICYmIHRzaW5jZShmLT50YWcpID49IHRpbWVvdXQpIHsKKwl0dCA9IGQtPnRhcmdldHM7CisJdGUgPSB0dCArIE5UQVJHRVRTOworCWZvciAoOyB0dCA8IHRlICYmICp0dDsgdHQrKykgeworCQl0ID0gKnR0OworCQlmID0gdC0+ZnJhbWVzOworCQllID0gZiArIHQtPm5mcmFtZXM7CisJCWZvciAoOyBmIDwgZTsgZisrKSB7CisJCQlpZiAoZi0+dGFnID09IEZSRUVUQUcKKwkJCXx8IHRzaW5jZShmLT50YWcpIDwgdGltZW91dCkKKwkJCQljb250aW51ZTsKIAkJCW4gPSBmLT53YWl0ZWQgKz0gdGltZW91dDsKIAkJCW4gLz0gSFo7Ci0JCQlpZiAobiA+IGFvZV9kZWFkc2VjcykgeyAvKiB3YWl0ZWQgdG9vIGxvbmcgZm9yIHJlc3BvbnNlICovCisJCQlpZiAobiA+IGFvZV9kZWFkc2VjcykgeworCQkJCS8qIHdhaXRlZCB0b28gbG9uZy4gIGRldmljZSBmYWlsdXJlLiAqLwogCQkJCWFvZWRldl9kb3duZGV2KGQpOwogCQkJCWJyZWFrOwogCQkJfQotCQkJcmV4bWl0KGQsIGYpOworCisJCQlpZiAobiA+IEhFTFBXQUlUIC8qIHNlZSBpZiBhbm90aGVyIHRhcmdldCBjYW4gaGVscCAqLworCQkJJiYgKHR0ICE9IGQtPnRhcmdldHMgfHwgZC0+dGFyZ2V0c1sxXSkpCisJCQkJZC0+aHRndCA9IHR0OworCisJCQlpZiAodC0+bm91dCA9PSB0LT5tYXhvdXQpIHsKKwkJCQlpZiAodC0+bWF4b3V0ID4gMSkKKwkJCQkJdC0+bWF4b3V0LS07CisJCQkJdC0+bGFzdHdhZGogPSBqaWZmaWVzOworCQkJfQorCisJCQlpZnAgPSBnZXRpZih0LCBmLT5za2ItPmRldik7CisJCQlpZiAoaWZwICYmICsraWZwLT5sb3N0ID4gKHQtPm5mcmFtZXMgPDwgMSkKKwkJCSYmIChpZnAgIT0gdC0+aWZzIHx8IHQtPmlmc1sxXS5uZCkpIHsKKwkJCQllamVjdGlmKHQsIGlmcCk7CisJCQkJaWZwID0gTlVMTDsKKwkJCX0KKworCQkJaWYgKGF0YV9zY250KHNrYl9tYWNfaGVhZGVyKGYtPnNrYikpID4gREVGQVVMVEJDTlQgLyA1MTIKKwkJCSYmIGlmcCAmJiArK2lmcC0+bG9zdGp1bWJvID4gKHQtPm5mcmFtZXMgPDwgMSkKKwkJCSYmIGlmcC0+bWF4YmNudCAhPSBERUZBVUxUQkNOVCkgeworCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkJImFvZTogZSVsZC4lZDogIgorCQkJCQkidG9vIG1hbnkgbG9zdCBqdW1ibyBvbiAiCisJCQkJCSIlczolMDEybGx4IC0gIgorCQkJCQkiZmFsbGluZyBiYWNrIHRvICVkIGZyYW1lcy5cbiIsCisJCQkJCWQtPmFvZW1ham9yLCBkLT5hb2VtaW5vciwKKwkJCQkJaWZwLT5uZC0+bmFtZSwgbWFjX2FkZHIodC0+YWRkciksCisJCQkJCURFRkFVTFRCQ05UKTsKKwkJCQlpZnAtPm1heGJjbnQgPSAwOworCQkJfQorCQkJcmVzZW5kKGQsIHQsIGYpOworCQl9CisKKwkJLyogd2luZG93IGNoZWNrICovCisJCWlmICh0LT5ub3V0ID09IHQtPm1heG91dAorCQkmJiB0LT5tYXhvdXQgPCB0LT5uZnJhbWVzCisJCSYmIChqaWZmaWVzIC0gdC0+bGFzdHdhZGopL0haID4gMTApIHsKKwkJCXQtPm1heG91dCsrOworCQkJdC0+bGFzdHdhZGogPSBqaWZmaWVzOwogCQl9CiAJfQotCWlmIChkLT5mbGFncyAmIERFVkZMX0tJQ0tNRSkgeworCisJaWYgKGQtPnNlbmRxX2hkKSB7CisJCW4gPSBkLT5ydHRhdmcgPDw9IDE7CisJCWlmIChuID4gTUFYVElNRVIpCisJCQlkLT5ydHRhdmcgPSBNQVhUSU1FUjsKKwl9CisKKwlpZiAoZC0+ZmxhZ3MgJiBERVZGTF9LSUNLTUUgfHwgZC0+aHRndCkgewogCQlkLT5mbGFncyAmPSB+REVWRkxfS0lDS01FOwogCQlhb2VjbWRfd29yayhkKTsKIAl9CiAKIAlzbCA9IGQtPnNlbmRxX2hkOwogCWQtPnNlbmRxX2hkID0gZC0+c2VuZHFfdGwgPSBOVUxMOwotCWlmIChzbCkgewotCQluID0gZC0+cnR0YXZnIDw8PSAxOwotCQlpZiAobiA+IE1BWFRJTUVSKQotCQkJZC0+cnR0YXZnID0gTUFYVElNRVI7Ci0JfQogCiAJZC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBUSU1FUlRJQ0s7CiAJYWRkX3RpbWVyKCZkLT50aW1lcik7CkBAIC00MDgsNiArNjExLDI1IEBACiAJYW9lbmV0X3htaXQoc2wpOwogfQogCisvKiBlbnRlcnMgd2l0aCBkLT5sb2NrIGhlbGQgKi8KK3ZvaWQKK2FvZWNtZF93b3JrKHN0cnVjdCBhb2VkZXYgKmQpCit7CisJc3RydWN0IGJ1ZiAqYnVmOworbG9vcDoKKwlpZiAoZC0+aHRndCAmJiAhc3RodGl0aChkKSkKKwkJcmV0dXJuOworCWlmIChkLT5pbnByb2Nlc3MgPT0gTlVMTCkgeworCQlpZiAobGlzdF9lbXB0eSgmZC0+YnVmcSkpCisJCQlyZXR1cm47CisJCWJ1ZiA9IGNvbnRhaW5lcl9vZihkLT5idWZxLm5leHQsIHN0cnVjdCBidWYsIGJ1ZnMpOworCQlsaXN0X2RlbChkLT5idWZxLm5leHQpOworCQlkLT5pbnByb2Nlc3MgPSBidWY7CisJfQorCWlmIChhb2VjbWRfYXRhX3J3KGQpKQorCQlnb3RvIGxvb3A7Cit9CisKIC8qIHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgd29yayB0aGF0IGhhcyBiZWVuIGRlZmVycmVkIHVudGlsIHNsZWVwaW5nIGlzIE9LCiAgKi8KIHZvaWQKQEAgLTQ0MCw3ICs2NjIsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotYXRhaWRfY29tcGxldGUoc3RydWN0IGFvZWRldiAqZCwgdW5zaWduZWQgY2hhciAqaWQpCithdGFpZF9jb21wbGV0ZShzdHJ1Y3QgYW9lZGV2ICpkLCBzdHJ1Y3QgYW9ldGd0ICp0LCB1bnNpZ25lZCBjaGFyICppZCkKIHsKIAl1NjQgc3NpemU7CiAJdTE2IG47CkBAIC00NzUsMjQgKzY5NywyMCBAQAogCX0KIAogCWlmIChkLT5zc2l6ZSAhPSBzc2l6ZSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiAlMDEybGx4IGUlbHUuJWx1IHYlMDR4IGhhcyAlbGx1IHNlY3RvcnNcbiIsCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKW1hY19hZGRyKGQtPmFkZHIpLAorCQlwcmludGsoS0VSTl9JTkZPCisJCQkiYW9lOiAlMDEybGx4IGUlbGQuJWQgdiUwNHggaGFzICVsbHUgc2VjdG9yc1xuIiwKKwkJCW1hY19hZGRyKHQtPmFkZHIpLAogCQkJZC0+YW9lbWFqb3IsIGQtPmFvZW1pbm9yLAogCQkJZC0+ZndfdmVyLCAobG9uZyBsb25nKXNzaXplKTsKIAlkLT5zc2l6ZSA9IHNzaXplOwogCWQtPmdlby5zdGFydCA9IDA7CisJaWYgKGQtPmZsYWdzICYgKERFVkZMX0dEQUxMT0N8REVWRkxfTkVXU0laRSkpCisJCXJldHVybjsKIAlpZiAoZC0+Z2QgIT0gTlVMTCkgewogCQlkLT5nZC0+Y2FwYWNpdHkgPSBzc2l6ZTsKIAkJZC0+ZmxhZ3MgfD0gREVWRkxfTkVXU0laRTsKLQl9IGVsc2UgewotCQlpZiAoZC0+ZmxhZ3MgJiBERVZGTF9HREFMTE9DKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImFvZTogY2FuJ3Qgc2NoZWR1bGUgd29yayBmb3IgZSVsdS4lbHUsICVzXG4iLAotCQkJICAgICAgIGQtPmFvZW1ham9yLCBkLT5hb2VtaW5vciwKLQkJCSAgICAgICAiaXQncyBhbHJlYWR5IG9uISAgVGhpcyBzaG91bGRuJ3QgaGFwcGVuLlxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KKwl9IGVsc2UKIAkJZC0+ZmxhZ3MgfD0gREVWRkxfR0RBTExPQzsKLQl9CiAJc2NoZWR1bGVfd29yaygmZC0+d29yayk7CiB9CiAKQEAgLTUxOSw2ICs3MzcsMzEgQEAKIAlkLT5ydHRhdmcgKz0gbiA+PiAyOwogfQogCitzdGF0aWMgc3RydWN0IGFvZXRndCAqCitnZXR0Z3Qoc3RydWN0IGFvZWRldiAqZCwgY2hhciAqYWRkcikKK3sKKwlzdHJ1Y3QgYW9ldGd0ICoqdCwgKiplOworCisJdCA9IGQtPnRhcmdldHM7CisJZSA9IHQgKyBOVEFSR0VUUzsKKwlmb3IgKDsgdCA8IGUgJiYgKnQ7IHQrKykKKwkJaWYgKG1lbWNtcCgoKnQpLT5hZGRyLCBhZGRyLCBzaXplb2YoKCp0KS0+YWRkcikpID09IDApCisJCQlyZXR1cm4gKnQ7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZGlza3N0YXRzKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBzdHJ1Y3QgYmlvICpiaW8sIHVsb25nIGR1cmF0aW9uLCBzZWN0b3JfdCBzZWN0b3IpCit7CisJdW5zaWduZWQgbG9uZyBuX3NlY3QgPSBiaW8tPmJpX3NpemUgPj4gOTsKKwljb25zdCBpbnQgcncgPSBiaW9fZGF0YV9kaXIoYmlvKTsKKworCWFsbF9zdGF0X2luYyhkaXNrLCBpb3NbcnddLCBzZWN0b3IpOworCWFsbF9zdGF0X2FkZChkaXNrLCB0aWNrc1tyd10sIGR1cmF0aW9uLCBzZWN0b3IpOworCWFsbF9zdGF0X2FkZChkaXNrLCBzZWN0b3JzW3J3XSwgbl9zZWN0LCBzZWN0b3IpOworCWFsbF9zdGF0X2FkZChkaXNrLCBpb190aWNrcywgZHVyYXRpb24sIHNlY3Rvcik7Cit9CisKIHZvaWQKIGFvZWNtZF9hdGFfcnNwKHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC01MjgsNiArNzcxLDggQEAKIAlzdHJ1Y3QgZnJhbWUgKmY7CiAJc3RydWN0IGJ1ZiAqYnVmOwogCXN0cnVjdCBza19idWZmICpzbDsKKwlzdHJ1Y3QgYW9ldGd0ICp0OworCXN0cnVjdCBhb2VpZiAqaWZwOwogCXJlZ2lzdGVyIGxvbmcgbjsKIAl1bG9uZyBmbGFnczsKIAljaGFyIGVidWZbMTI4XTsKQEAgLTU0Nyw3ICs3OTIsMTQgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZC0+bG9jaywgZmxhZ3MpOwogCiAJbiA9IGJlMzJfdG9fY3B1KGdldF91bmFsaWduZWQoJmhpbi0+dGFnKSk7Ci0JZiA9IGdldGZyYW1lKGQsIG4pOworCXQgPSBnZXR0Z3QoZCwgaGluLT5zcmMpOworCWlmICh0ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiBjYW4ndCBmaW5kIHRhcmdldCBlJWxkLiVkOiUwMTJsbHhcbiIsCisJCQlkLT5hb2VtYWpvciwgZC0+YW9lbWlub3IsIG1hY19hZGRyKGhpbi0+c3JjKSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlmID0gZ2V0ZnJhbWUodCwgbik7CiAJaWYgKGYgPT0gTlVMTCkgewogCQljYWxjX3J0dGF2ZyhkLCAtdHNpbmNlKG4pKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+bG9jaywgZmxhZ3MpOwpAQCAtNTY5LDI0ICs4MjEsMjQgQEAKIAlhaG91dCA9IChzdHJ1Y3QgYW9lX2F0YWhkciAqKSAoaG91dCsxKTsKIAlidWYgPSBmLT5idWY7CiAKLQlpZiAoYWhvdXQtPmNtZHN0YXQgPT0gV0lOX0lERU5USUZZKQotCQlkLT5mbGFncyAmPSB+REVWRkxfUEFVU0U7CiAJaWYgKGFoaW4tPmNtZHN0YXQgJiAweGE5KSB7CS8qIHRoZXNlIGJpdHMgY2xlYXJlZCBvbiBzdWNjZXNzICovCiAJCXByaW50ayhLRVJOX0VSUgotCQkJImFvZTogYXRhIGVycm9yIGNtZD0lMi4yWGggc3RhdD0lMi4yWGggZnJvbSBlJWxkLiVsZFxuIiwKKwkJCSJhb2U6IGF0YSBlcnJvciBjbWQ9JTIuMlhoIHN0YXQ9JTIuMlhoIGZyb20gZSVsZC4lZFxuIiwKIAkJCWFob3V0LT5jbWRzdGF0LCBhaGluLT5jbWRzdGF0LAogCQkJZC0+YW9lbWFqb3IsIGQtPmFvZW1pbm9yKTsKIAkJaWYgKGJ1ZikKIAkJCWJ1Zi0+ZmxhZ3MgfD0gQlVGRkxfRkFJTDsKIAl9IGVsc2UgeworCQlpZiAoZC0+aHRndCAmJiB0ID09ICpkLT5odGd0KSAvKiBJJ2xsIGhlbHAgbXlzZWxmLCB0aGFuayB5b3UuICovCisJCQlkLT5odGd0ID0gTlVMTDsKIAkJbiA9IGFob3V0LT5zY250IDw8IDk7CiAJCXN3aXRjaCAoYWhvdXQtPmNtZHN0YXQpIHsKIAkJY2FzZSBXSU5fUkVBRDoKIAkJY2FzZSBXSU5fUkVBRF9FWFQ6CiAJCQlpZiAoc2tiLT5sZW4gLSBzaXplb2YgKmhpbiAtIHNpemVvZiAqYWhpbiA8IG4pIHsKIAkJCQlwcmludGsoS0VSTl9FUlIKLQkJCQkJImFvZTogcnVudCBkYXRhIHNpemUgaW4gcmVhZC4gIHNrYi0+bGVuPSVkXG4iLAotCQkJCQlza2ItPmxlbik7CisJCQkJCSJhb2U6ICVzLiAgc2tiLT5sZW49JWQgbmVlZD0lbGRcbiIsCisJCQkJCSJydW50IGRhdGEgc2l6ZSBpbiByZWFkIiwgc2tiLT5sZW4sIG4pOwogCQkJCS8qIGZhaWwgZnJhbWUgZj8gIGp1c3QgcmV0dXJuaW5nIHdpbGwgcmV4bWl0LiAqLwogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPmxvY2ssIGZsYWdzKTsKIAkJCQlyZXR1cm47CkBAIC01OTQsMzIgKzg0NiwxOCBAQAogCQkJbWVtY3B5KGYtPmJ1ZmFkZHIsIGFoaW4rMSwgbik7CiAJCWNhc2UgV0lOX1dSSVRFOgogCQljYXNlIFdJTl9XUklURV9FWFQ6Ci0JCQlpZiAoZi0+YmNudCAtPSBuKSB7Ci0JCQkJc2tiID0gZi0+c2tiOwotCQkJCWYtPmJ1ZmFkZHIgKz0gbjsKLQkJCQlwdXRfbGJhKGFob3V0LCBmLT5sYmEgKz0gYWhvdXQtPnNjbnQpOwotCQkJCW4gPSBmLT5iY250OworCQkJaWZwID0gZ2V0aWYodCwgc2tiLT5kZXYpOworCQkJaWYgKGlmcCkgeworCQkJCWlmcC0+bG9zdCA9IDA7CiAJCQkJaWYgKG4gPiBERUZBVUxUQkNOVCkKLQkJCQkJbiA9IERFRkFVTFRCQ05UOwotCQkJCWFob3V0LT5zY250ID0gbiA+PiA5OwotCQkJCWlmIChhaG91dC0+YWZsYWdzICYgQU9FQUZMX1dSSVRFKSB7Ci0JCQkJCXNrYl9maWxsX3BhZ2VfZGVzYyhza2IsIDAsCi0JCQkJCQl2aXJ0X3RvX3BhZ2UoZi0+YnVmYWRkciksCi0JCQkJCQlvZmZzZXRfaW5fcGFnZShmLT5idWZhZGRyKSwgbik7Ci0JCQkJCXNrYi0+bGVuID0gc2l6ZW9mICpob3V0ICsgc2l6ZW9mICphaG91dCArIG47Ci0JCQkJCXNrYi0+ZGF0YV9sZW4gPSBuOwotCQkJCX0KLQkJCQlmLT50YWcgPSBuZXd0YWcoZCk7Ci0JCQkJaG91dC0+dGFnID0gY3B1X3RvX2JlMzIoZi0+dGFnKTsKLQkJCQlza2ItPmRldiA9IGQtPmlmcDsKLQkJCQlza2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT5sb2NrLCBmbGFncyk7Ci0JCQkJaWYgKHNrYikKLQkJCQkJYW9lbmV0X3htaXQoc2tiKTsKLQkJCQlyZXR1cm47CisJCQkJCWlmcC0+bG9zdGp1bWJvID0gMDsKIAkJCX0KLQkJCWlmIChuID4gREVGQVVMVEJDTlQpCi0JCQkJZC0+bG9zdGp1bWJvID0gMDsKKwkJCWlmIChmLT5iY250IC09IG4pIHsKKwkJCQlmLT5sYmEgKz0gbiA+PiA5OworCQkJCWYtPmJ1ZmFkZHIgKz0gbjsKKwkJCQlyZXNlbmQoZCwgdCwgZik7CisJCQkJZ290byB4bWl0OworCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgV0lOX0lERU5USUZZOgogCQkJaWYgKHNrYi0+bGVuIC0gc2l6ZW9mICpoaW4gLSBzaXplb2YgKmFoaW4gPCA1MTIpIHsKQEAgLTYyOSw3ICs4NjcsNyBAQAogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPmxvY2ssIGZsYWdzKTsKIAkJCQlyZXR1cm47CiAJCQl9Ci0JCQlhdGFpZF9jb21wbGV0ZShkLCAoY2hhciAqKSAoYWhpbisxKSk7CisJCQlhdGFpZF9jb21wbGV0ZShkLCB0LCAoY2hhciAqKSAoYWhpbisxKSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXByaW50ayhLRVJOX0lORk8KQEAgLTY0MCwyOCArODc4LDE5IEBACiAJCX0KIAl9CiAKLQlpZiAoYnVmKSB7Ci0JCWJ1Zi0+bmZyYW1lc291dCAtPSAxOwotCQlpZiAoYnVmLT5uZnJhbWVzb3V0ID09IDAgJiYgYnVmLT5yZXNpZCA9PSAwKSB7Ci0JCQl1bnNpZ25lZCBsb25nIGR1cmF0aW9uID0gamlmZmllcyAtIGJ1Zi0+c3RhcnRfdGltZTsKLQkJCXVuc2lnbmVkIGxvbmcgbl9zZWN0ID0gYnVmLT5iaW8tPmJpX3NpemUgPj4gOTsKLQkJCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gZC0+Z2Q7Ci0JCQljb25zdCBpbnQgcncgPSBiaW9fZGF0YV9kaXIoYnVmLT5iaW8pOwotCi0JCQlkaXNrX3N0YXRfaW5jKGRpc2ssIGlvc1tyd10pOwotCQkJZGlza19zdGF0X2FkZChkaXNrLCB0aWNrc1tyd10sIGR1cmF0aW9uKTsKLQkJCWRpc2tfc3RhdF9hZGQoZGlzaywgc2VjdG9yc1tyd10sIG5fc2VjdCk7Ci0JCQlkaXNrX3N0YXRfYWRkKGRpc2ssIGlvX3RpY2tzLCBkdXJhdGlvbik7Ci0JCQluID0gKGJ1Zi0+ZmxhZ3MgJiBCVUZGTF9GQUlMKSA/IC1FSU8gOiAwOwotCQkJYmlvX2VuZGlvKGJ1Zi0+YmlvLCBuKTsKLQkJCW1lbXBvb2xfZnJlZShidWYsIGQtPmJ1ZnBvb2wpOwotCQl9CisJaWYgKGJ1ZiAmJiAtLWJ1Zi0+bmZyYW1lc291dCA9PSAwICYmIGJ1Zi0+cmVzaWQgPT0gMCkgeworCQlkaXNrc3RhdHMoZC0+Z2QsIGJ1Zi0+YmlvLCBqaWZmaWVzIC0gYnVmLT5zdGltZSwgYnVmLT5zZWN0b3IpOworCQluID0gKGJ1Zi0+ZmxhZ3MgJiBCVUZGTF9GQUlMKSA/IC1FSU8gOiAwOworCQliaW9fZW5kaW8oYnVmLT5iaW8sIG4pOworCQltZW1wb29sX2ZyZWUoYnVmLCBkLT5idWZwb29sKTsKIAl9CiAKIAlmLT5idWYgPSBOVUxMOwogCWYtPnRhZyA9IEZSRUVUQUc7CisJdC0+bm91dC0tOwogCiAJYW9lY21kX3dvcmsoZCk7Cit4bWl0OgogCXNsID0gZC0+c2VuZHFfaGQ7CiAJZC0+c2VuZHFfaGQgPSBkLT5zZW5kcV90bCA9IE5VTEw7CiAKQEAgLTY3OSwyMyArOTA4LDIwIEBACiAJYW9lbmV0X3htaXQoc2wpOwogfQogIAotLyoKLSAqIFNpbmNlIHdlIG9ubHkgY2FsbCB0aGlzIGluIG9uZSBwbGFjZSAoYW5kIGl0IG9ubHkgcHJlcGFyZXMgb25lIGZyYW1lKQotICogd2UganVzdCByZXR1cm4gdGhlIHNrYi4gIFVzdWFsbHkgd2UnZCBjaGFpbiBpdCB1cCB0byB0aGUgYW9lZGV2IHNlbmRxLgotICovCi1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgorc3RydWN0IHNrX2J1ZmYgKgogYW9lY21kX2F0YV9pZChzdHJ1Y3QgYW9lZGV2ICpkKQogewogCXN0cnVjdCBhb2VfaGRyICpoOwogCXN0cnVjdCBhb2VfYXRhaGRyICphaDsKIAlzdHJ1Y3QgZnJhbWUgKmY7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgYW9ldGd0ICp0OwogCiAJZiA9IGZyZWVmcmFtZShkKTsKLQlpZiAoZiA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYW9lOiBjYW4ndCBnZXQgYSBmcmFtZS4gVGhpcyBzaG91bGRuJ3QgaGFwcGVuLlxuIik7CisJaWYgKGYgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7Ci0JfQorCisJdCA9ICpkLT50Z3Q7CiAKIAkvKiBpbml0aWFsaXplIHRoZSBoZWFkZXJzICYgZnJhbWUgKi8KIAlza2IgPSBmLT5za2I7CkBAIC03MDMsNyArOTI5LDggQEAKIAlhaCA9IChzdHJ1Y3QgYW9lX2F0YWhkciAqKSAoaCsxKTsKIAlza2JfcHV0KHNrYiwgc2l6ZW9mICpoICsgc2l6ZW9mICphaCk7CiAJbWVtc2V0KGgsIDAsIHNrYi0+bGVuKTsKLQlmLT50YWcgPSBhb2VoZHJfYXRhaW5pdChkLCBoKTsKKwlmLT50YWcgPSBhb2VoZHJfYXRhaW5pdChkLCB0LCBoKTsKKwl0LT5ub3V0Kys7CiAJZi0+d2FpdGVkID0gMDsKIAogCS8qIHNldCB1cCBhdGEgaGVhZGVyICovCkBAIC03MTEsNyArOTM4LDcgQEAKIAlhaC0+Y21kc3RhdCA9IFdJTl9JREVOVElGWTsKIAlhaC0+bGJhMyA9IDB4YTA7CiAKLQlza2ItPmRldiA9IGQtPmlmcDsKKwlza2ItPmRldiA9IHQtPmlmcC0+bmQ7CiAKIAlkLT5ydHRhdmcgPSBNQVhUSU1FUjsKIAlkLT50aW1lci5mdW5jdGlvbiA9IHJleG1pdF90aW1lcjsKQEAgLTcxOSwxNSArOTQ2LDUyIEBACiAJcmV0dXJuIHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOwogfQogIAorc3RhdGljIHN0cnVjdCBhb2V0Z3QgKgorYWRkdGd0KHN0cnVjdCBhb2VkZXYgKmQsIGNoYXIgKmFkZHIsIHVsb25nIG5mcmFtZXMpCit7CisJc3RydWN0IGFvZXRndCAqdCwgKip0dCwgKip0ZTsKKwlzdHJ1Y3QgZnJhbWUgKmYsICplOworCisJdHQgPSBkLT50YXJnZXRzOworCXRlID0gdHQgKyBOVEFSR0VUUzsKKwlmb3IgKDsgdHQgPCB0ZSAmJiAqdHQ7IHR0KyspCisJCTsKKworCWlmICh0dCA9PSB0ZSkgeworCQlwcmludGsoS0VSTl9JTkZPCisJCQkiYW9lOiBkZXZpY2UgYWRkdGd0IGZhaWx1cmU7IHRvbyBtYW55IHRhcmdldHNcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJdCA9IGtjYWxsb2MoMSwgc2l6ZW9mICp0LCBHRlBfQVRPTUlDKTsKKwlmID0ga2NhbGxvYyhuZnJhbWVzLCBzaXplb2YgKmYsIEdGUF9BVE9NSUMpOworCWlmICghdCB8fCAhZikgeworCQlrZnJlZShmKTsKKwkJa2ZyZWUodCk7CisJCXByaW50ayhLRVJOX0lORk8gImFvZTogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSB0byBhZGQgdGFyZ2V0XG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJdC0+bmZyYW1lcyA9IG5mcmFtZXM7CisJdC0+ZnJhbWVzID0gZjsKKwllID0gZiArIG5mcmFtZXM7CisJZm9yICg7IGYgPCBlOyBmKyspCisJCWYtPnRhZyA9IEZSRUVUQUc7CisJbWVtY3B5KHQtPmFkZHIsIGFkZHIsIHNpemVvZiB0LT5hZGRyKTsKKwl0LT5pZnAgPSB0LT5pZnM7CisJdC0+bWF4b3V0ID0gdC0+bmZyYW1lczsKKwlyZXR1cm4gKnR0ID0gdDsKK30KKwogdm9pZAogYW9lY21kX2NmZ19yc3Aoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgYW9lZGV2ICpkOwogCXN0cnVjdCBhb2VfaGRyICpoOwogCXN0cnVjdCBhb2VfY2ZnaGRyICpjaDsKKwlzdHJ1Y3QgYW9ldGd0ICp0OworCXN0cnVjdCBhb2VpZiAqaWZwOwogCXVsb25nIGZsYWdzLCBzeXNtaW5vciwgYW9lbWFqb3I7CiAJc3RydWN0IHNrX2J1ZmYgKnNsOwotCWVudW0geyBNQVhGUkFNRVMgPSAxNiB9OwogCXUxNiBuOwogCiAJaCA9IChzdHJ1Y3QgYW9lX2hkciAqKSBza2JfbWFjX2hlYWRlcihza2IpOwpAQCAtNzUyLDEwICsxMDE2LDEwIEBACiAJfQogCiAJbiA9IGJlMTZfdG9fY3B1KGNoLT5idWZjbnQpOwotCWlmIChuID4gTUFYRlJBTUVTKQkvKiBrZWVwIGl0IHJlYXNvbmFibGUgKi8KLQkJbiA9IE1BWEZSQU1FUzsKKwlpZiAobiA+IGFvZV9tYXhvdXQpCS8qIGtlZXAgaXQgcmVhc29uYWJsZSAqLworCQluID0gYW9lX21heG91dDsKIAotCWQgPSBhb2VkZXZfYnlfc3lzbWlub3JfbShzeXNtaW5vciwgbik7CisJZCA9IGFvZWRldl9ieV9zeXNtaW5vcl9tKHN5c21pbm9yKTsKIAlpZiAoZCA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImFvZTogZGV2aWNlIHN5c21pbm9yX20gZmFpbHVyZVxuIik7CiAJCXJldHVybjsKQEAgLTc2MywzOCArMTAyNyw3NCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmQtPmxvY2ssIGZsYWdzKTsKIAotCS8qIHBlcm1pdCBkZXZpY2UgdG8gbWlncmF0ZSBtYWMgYW5kIG5ldHdvcmsgaW50ZXJmYWNlICovCi0JZC0+aWZwID0gc2tiLT5kZXY7Ci0JbWVtY3B5KGQtPmFkZHIsIGgtPnNyYywgc2l6ZW9mIGQtPmFkZHIpOwotCWlmICghKGQtPmZsYWdzICYgREVWRkxfTUFYQkNOVCkpIHsKLQkJbiA9IGQtPmlmcC0+bXR1OworCXQgPSBnZXR0Z3QoZCwgaC0+c3JjKTsKKwlpZiAoIXQpIHsKKwkJdCA9IGFkZHRndChkLCBoLT5zcmMsIG4pOworCQlpZiAoIXQpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlpZnAgPSBnZXRpZih0LCBza2ItPmRldik7CisJaWYgKCFpZnApIHsKKwkJaWZwID0gYWRkaWYodCwgc2tiLT5kZXYpOworCQlpZiAoIWlmcCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSJhb2U6IGRldmljZSBhZGRpZiBmYWlsdXJlOyAiCisJCQkJInRvbyBtYW55IGludGVyZmFjZXM/XG4iKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlpZiAoaWZwLT5tYXhiY250KSB7CisJCW4gPSBpZnAtPm5kLT5tdHU7CiAJCW4gLT0gc2l6ZW9mIChzdHJ1Y3QgYW9lX2hkcikgKyBzaXplb2YgKHN0cnVjdCBhb2VfYXRhaGRyKTsKIAkJbiAvPSA1MTI7CiAJCWlmIChuID4gY2gtPnNjbnQpCiAJCQluID0gY2gtPnNjbnQ7CiAJCW4gPSBuID8gbiAqIDUxMiA6IERFRkFVTFRCQ05UOwotCQlpZiAobiAhPSBkLT5tYXhiY250KSB7CisJCWlmIChuICE9IGlmcC0+bWF4YmNudCkgewogCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJCSJhb2U6IGUlbGQuJWxkOiBzZXR0aW5nICVkIGJ5dGUgZGF0YSBmcmFtZXMgb24gJXNcbiIsCi0JCQkJZC0+YW9lbWFqb3IsIGQtPmFvZW1pbm9yLCBuLCBkLT5pZnAtPm5hbWUpOwotCQkJZC0+bWF4YmNudCA9IG47CisJCQkJImFvZTogZSVsZC4lZDogc2V0dGluZyAlZCVzJXM6JTAxMmxseFxuIiwKKwkJCQlkLT5hb2VtYWpvciwgZC0+YW9lbWlub3IsIG4sCisJCQkJIiBieXRlIGRhdGEgZnJhbWVzIG9uICIsIGlmcC0+bmQtPm5hbWUsCisJCQkJbWFjX2FkZHIodC0+YWRkcikpOworCQkJaWZwLT5tYXhiY250ID0gbjsKIAkJfQogCX0KIAogCS8qIGRvbid0IGNoYW5nZSB1c2VycycgcGVyc3BlY3RpdmUgKi8KLQlpZiAoZC0+bm9wZW4gJiYgIShkLT5mbGFncyAmIERFVkZMX1BBVVNFKSkgeworCWlmIChkLT5ub3BlbikgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT5sb2NrLCBmbGFncyk7CiAJCXJldHVybjsKIAl9Ci0JZC0+ZmxhZ3MgfD0gREVWRkxfUEFVU0U7CS8qIGZvcmNlIHBhdXNlICovCi0JZC0+bWludGltZXIgPSBNSU5USU1FUjsKIAlkLT5md192ZXIgPSBiZTE2X3RvX2NwdShjaC0+Znd2ZXIpOwogCi0JLyogY2hlY2sgZm9yIGFscmVhZHkgb3V0c3RhbmRpbmcgYXRhaWQgKi8KLQlzbCA9IGFvZWRldl9pc2J1c3koZCkgPT0gMCA/IGFvZWNtZF9hdGFfaWQoZCkgOiBOVUxMOworCXNsID0gYW9lY21kX2F0YV9pZChkKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPmxvY2ssIGZsYWdzKTsKIAogCWFvZW5ldF94bWl0KHNsKTsKIH0KIAordm9pZAorYW9lY21kX2NsZWFuc2xhdGUoc3RydWN0IGFvZWRldiAqZCkKK3sKKwlzdHJ1Y3QgYW9ldGd0ICoqdCwgKip0ZTsKKwlzdHJ1Y3QgYW9laWYgKnAsICplOworCisJZC0+bWludGltZXIgPSBNSU5USU1FUjsKKworCXQgPSBkLT50YXJnZXRzOworCXRlID0gdCArIE5UQVJHRVRTOworCWZvciAoOyB0IDwgdGUgJiYgKnQ7IHQrKykgeworCQkoKnQpLT5tYXhvdXQgPSAoKnQpLT5uZnJhbWVzOworCQlwID0gKCp0KS0+aWZzOworCQllID0gcCArIE5BT0VJRlM7CisJCWZvciAoOyBwIDwgZTsgcCsrKSB7CisJCQlwLT5sb3N0anVtYm8gPSAwOworCQkJcC0+bG9zdCA9IDA7CisJCQlwLT5tYXhiY250ID0gREVGQVVMVEJDTlQ7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VkZXYuYyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWRldi5jCmluZGV4IDUxZjUwNzEuLmY5YTFjZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYW9lL2FvZWRldi5jCisrKyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZWRldi5jCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA2IENvcmFpZCwgSW5jLiAgU2VlIENPUFlJTkcgZm9yIEdQTCB0ZXJtcy4gKi8KKy8qIENvcHlyaWdodCAoYykgMjAwNyBDb3JhaWQsIEluYy4gIFNlZSBDT1BZSU5HIGZvciBHUEwgdGVybXMuICovCiAvKgogICogYW9lZGV2LmMKICAqIEFvRSBkZXZpY2UgdXRpbGl0eSBmdW5jdGlvbnM7IG1haW50YWlucyBkZXZpY2UgbGlzdC4KQEAgLTcsMjMgKzcsMzIgQEAKICNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSAiYW9lLmgiCiAKK3N0YXRpYyB2b2lkIGR1bW15X3RpbWVyKHVsb25nKTsKK3N0YXRpYyB2b2lkIGFvZWRldl9mcmVlZGV2KHN0cnVjdCBhb2VkZXYgKik7CitzdGF0aWMgdm9pZCBmcmVldGd0KHN0cnVjdCBhb2VkZXYgKmQsIHN0cnVjdCBhb2V0Z3QgKnQpOworc3RhdGljIHZvaWQgc2ticG9vbGZyZWUoc3RydWN0IGFvZWRldiAqZCk7CisKIHN0YXRpYyBzdHJ1Y3QgYW9lZGV2ICpkZXZsaXN0Owotc3RhdGljIHNwaW5sb2NrX3QgZGV2bGlzdF9sb2NrOworc3RhdGljIERFRklORV9TUElOTE9DSyhkZXZsaXN0X2xvY2spOwogCiBpbnQKIGFvZWRldl9pc2J1c3koc3RydWN0IGFvZWRldiAqZCkKIHsKKwlzdHJ1Y3QgYW9ldGd0ICoqdCwgKip0ZTsKIAlzdHJ1Y3QgZnJhbWUgKmYsICplOwogCi0JZiA9IGQtPmZyYW1lczsKLQllID0gZiArIGQtPm5mcmFtZXM7Ci0JZG8gewotCQlpZiAoZi0+dGFnICE9IEZSRUVUQUcpCi0JCQlyZXR1cm4gMTsKLQl9IHdoaWxlICgrK2YgPCBlKTsKLQorCXQgPSBkLT50YXJnZXRzOworCXRlID0gdCArIE5UQVJHRVRTOworCWZvciAoOyB0IDwgdGUgJiYgKnQ7IHQrKykgeworCQlmID0gKCp0KS0+ZnJhbWVzOworCQllID0gZiArICgqdCktPm5mcmFtZXM7CisJCWZvciAoOyBmIDwgZTsgZisrKQorCQkJaWYgKGYtPnRhZyAhPSBGUkVFVEFHKQorCQkJCXJldHVybiAxOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNTUsNzUgKzY0LDQxIEBACiAJYWRkX3RpbWVyKCZkLT50aW1lcik7CiB9CiAKLS8qIGNhbGxlZCB3aXRoIGRldmxpc3QgbG9jayBoZWxkICovCi1zdGF0aWMgc3RydWN0IGFvZWRldiAqCi1hb2VkZXZfbmV3ZGV2KHVsb25nIG5mcmFtZXMpCi17Ci0Jc3RydWN0IGFvZWRldiAqZDsKLQlzdHJ1Y3QgZnJhbWUgKmYsICplOwotCi0JZCA9IGt6YWxsb2Moc2l6ZW9mICpkLCBHRlBfQVRPTUlDKTsKLQlmID0ga2NhbGxvYyhuZnJhbWVzLCBzaXplb2YgKmYsIEdGUF9BVE9NSUMpOwotIAlzd2l0Y2ggKCFkIHx8ICFmKSB7Ci0gCWNhc2UgMDoKLSAJCWQtPm5mcmFtZXMgPSBuZnJhbWVzOwotIAkJZC0+ZnJhbWVzID0gZjsKLSAJCWUgPSBmICsgbmZyYW1lczsKLSAJCWZvciAoOyBmPGU7IGYrKykgewotIAkJCWYtPnRhZyA9IEZSRUVUQUc7Ci0gCQkJZi0+c2tiID0gbmV3X3NrYihFVEhfWkxFTik7Ci0gCQkJaWYgKCFmLT5za2IpCi0gCQkJCWJyZWFrOwotIAkJfQotIAkJaWYgKGYgPT0gZSkKLSAJCQlicmVhazsKLSAJCXdoaWxlIChmID4gZC0+ZnJhbWVzKSB7Ci0gCQkJZi0tOwotIAkJCWRldl9rZnJlZV9za2IoZi0+c2tiKTsKLSAJCX0KLSAJZGVmYXVsdDoKLSAJCWlmIChmKQotIAkJCWtmcmVlKGYpOwotIAkJaWYgKGQpCi0gCQkJa2ZyZWUoZCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlJTklUX1dPUksoJmQtPndvcmssIGFvZWNtZF9zbGVlcHdvcmspOwotCXNwaW5fbG9ja19pbml0KCZkLT5sb2NrKTsKLQlpbml0X3RpbWVyKCZkLT50aW1lcik7Ci0JZC0+dGltZXIuZGF0YSA9ICh1bG9uZykgZDsKLQlkLT50aW1lci5mdW5jdGlvbiA9IGR1bW15X3RpbWVyOwotCWQtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7Ci0JYWRkX3RpbWVyKCZkLT50aW1lcik7Ci0JZC0+YnVmcG9vbCA9IE5VTEw7CS8qIGRlZmVyIHRvIGFvZWJsa19nZGFsbG9jICovCi0JSU5JVF9MSVNUX0hFQUQoJmQtPmJ1ZnEpOwotCWQtPm5leHQgPSBkZXZsaXN0OwotCWRldmxpc3QgPSBkOwotCi0JcmV0dXJuIGQ7Ci19Ci0KIHZvaWQKIGFvZWRldl9kb3duZGV2KHN0cnVjdCBhb2VkZXYgKmQpCiB7CisJc3RydWN0IGFvZXRndCAqKnQsICoqdGU7CiAJc3RydWN0IGZyYW1lICpmLCAqZTsKIAlzdHJ1Y3QgYnVmICpidWY7CiAJc3RydWN0IGJpbyAqYmlvOwogCi0JZiA9IGQtPmZyYW1lczsKLQllID0gZiArIGQtPm5mcmFtZXM7Ci0JZm9yICg7IGY8ZTsgZi0+dGFnID0gRlJFRVRBRywgZi0+YnVmID0gTlVMTCwgZisrKSB7Ci0JCWlmIChmLT50YWcgPT0gRlJFRVRBRyB8fCBmLT5idWYgPT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCQlidWYgPSBmLT5idWY7Ci0JCWJpbyA9IGJ1Zi0+YmlvOwotCQlpZiAoLS1idWYtPm5mcmFtZXNvdXQgPT0gMCkgewotCQkJbWVtcG9vbF9mcmVlKGJ1ZiwgZC0+YnVmcG9vbCk7Ci0JCQliaW9fZW5kaW8oYmlvLCAtRUlPKTsKKwl0ID0gZC0+dGFyZ2V0czsKKwl0ZSA9IHQgKyBOVEFSR0VUUzsKKwlmb3IgKDsgdCA8IHRlICYmICp0OyB0KyspIHsKKwkJZiA9ICgqdCktPmZyYW1lczsKKwkJZSA9IGYgKyAoKnQpLT5uZnJhbWVzOworCQlmb3IgKDsgZiA8IGU7IGYtPnRhZyA9IEZSRUVUQUcsIGYtPmJ1ZiA9IE5VTEwsIGYrKykgeworCQkJaWYgKGYtPnRhZyA9PSBGUkVFVEFHIHx8IGYtPmJ1ZiA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJYnVmID0gZi0+YnVmOworCQkJYmlvID0gYnVmLT5iaW87CisJCQlpZiAoLS1idWYtPm5mcmFtZXNvdXQgPT0gMAorCQkJJiYgYnVmICE9IGQtPmlucHJvY2VzcykgeworCQkJCW1lbXBvb2xfZnJlZShidWYsIGQtPmJ1ZnBvb2wpOworCQkJCWJpb19lbmRpbyhiaW8sIC1FSU8pOworCQkJfQogCQl9Ci0JCXNrYl9zaGluZm8oZi0+c2tiKS0+bnJfZnJhZ3MgPSBmLT5za2ItPmRhdGFfbGVuID0gMDsKKwkJKCp0KS0+bWF4b3V0ID0gKCp0KS0+bmZyYW1lczsKKwkJKCp0KS0+bm91dCA9IDA7CisJfQorCWJ1ZiA9IGQtPmlucHJvY2VzczsKKwlpZiAoYnVmKSB7CisJCWJpbyA9IGJ1Zi0+YmlvOworCQltZW1wb29sX2ZyZWUoYnVmLCBkLT5idWZwb29sKTsKKwkJYmlvX2VuZGlvKGJpbywgLUVJTyk7CiAJfQogCWQtPmlucHJvY2VzcyA9IE5VTEw7CisJZC0+aHRndCA9IE5VTEw7CiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmQtPmJ1ZnEpKSB7CiAJCWJ1ZiA9IGNvbnRhaW5lcl9vZihkLT5idWZxLm5leHQsIHN0cnVjdCBidWYsIGJ1ZnMpOwpAQCAtMTM2LDEyICsxMTEsMTE0IEBACiAJaWYgKGQtPmdkKQogCQlkLT5nZC0+Y2FwYWNpdHkgPSAwOwogCi0JZC0+ZmxhZ3MgJj0gfihERVZGTF9VUCB8IERFVkZMX1BBVVNFKTsKKwlkLT5mbGFncyAmPSB+REVWRkxfVVA7Cit9CisKK3N0YXRpYyB2b2lkCithb2VkZXZfZnJlZWRldihzdHJ1Y3QgYW9lZGV2ICpkKQoreworCXN0cnVjdCBhb2V0Z3QgKip0LCAqKmU7CisKKwlpZiAoZC0+Z2QpIHsKKwkJYW9lZGlza19ybV9zeXNmcyhkKTsKKwkJZGVsX2dlbmRpc2soZC0+Z2QpOworCQlwdXRfZGlzayhkLT5nZCk7CisJfQorCXQgPSBkLT50YXJnZXRzOworCWUgPSB0ICsgTlRBUkdFVFM7CisJZm9yICg7IHQgPCBlICYmICp0OyB0KyspCisJCWZyZWV0Z3QoZCwgKnQpOworCWlmIChkLT5idWZwb29sKQorCQltZW1wb29sX2Rlc3Ryb3koZC0+YnVmcG9vbCk7CisJc2ticG9vbGZyZWUoZCk7CisJa2ZyZWUoZCk7Cit9CisKK2ludAorYW9lZGV2X2ZsdXNoKGNvbnN0IGNoYXIgX191c2VyICpzdHIsIHNpemVfdCBjbnQpCit7CisJdWxvbmcgZmxhZ3M7CisJc3RydWN0IGFvZWRldiAqZCwgKipkZDsKKwlzdHJ1Y3QgYW9lZGV2ICpybWQgPSBOVUxMOworCWNoYXIgYnVmWzE2XTsKKwlpbnQgYWxsID0gMDsKKworCWlmIChjbnQgPj0gMykgeworCQlpZiAoY250ID4gc2l6ZW9mIGJ1ZikKKwkJCWNudCA9IHNpemVvZiBidWY7CisJCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHN0ciwgY250KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlhbGwgPSAhc3RybmNtcChidWYsICJhbGwiLCAzKTsKKwl9CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZsaXN0X2xvY2ssIGZsYWdzKTsKKwlkZCA9ICZkZXZsaXN0OworCXdoaWxlICgoZCA9ICpkZCkpIHsKKwkJc3Bpbl9sb2NrKCZkLT5sb2NrKTsKKwkJaWYgKCghYWxsICYmIChkLT5mbGFncyAmIERFVkZMX1VQKSkKKwkJfHwgKGQtPmZsYWdzICYgKERFVkZMX0dEQUxMT0N8REVWRkxfTkVXU0laRSkpCisJCXx8IGQtPm5vcGVuKSB7CisJCQlzcGluX3VubG9jaygmZC0+bG9jayk7CisJCQlkZCA9ICZkLT5uZXh0OworCQkJY29udGludWU7CisJCX0KKwkJKmRkID0gZC0+bmV4dDsKKwkJYW9lZGV2X2Rvd25kZXYoZCk7CisJCWQtPmZsYWdzIHw9IERFVkZMX1RLSUxMOworCQlzcGluX3VubG9jaygmZC0+bG9jayk7CisJCWQtPm5leHQgPSBybWQ7CisJCXJtZCA9IGQ7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmxpc3RfbG9jaywgZmxhZ3MpOworCXdoaWxlICgoZCA9IHJtZCkpIHsKKwkJcm1kID0gZC0+bmV4dDsKKwkJZGVsX3RpbWVyX3N5bmMoJmQtPnRpbWVyKTsKKwkJYW9lZGV2X2ZyZWVkZXYoZCk7CS8qIG11c3QgYmUgYWJsZSB0byBzbGVlcCAqLworCX0KKwlyZXR1cm4gMDsKK30KKworLyogSSdtIG5vdCByZWFsbHkgc3VyZSB0aGF0IHRoaXMgaXMgYSByZWFsaXN0aWMgcHJvYmxlbSwgYnV0IGlmIHRoZQorbmV0d29yayBkcml2ZXIgZ29lcyBnb256byBsZXQncyBqdXN0IGxlYWsgbWVtb3J5IGFmdGVyIGNvbXBsYWluaW5nLiAqLworc3RhdGljIHZvaWQKK3NrYmZyZWUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwllbnVtIHsgU21zID0gMTAwLCBUbXMgPSAzKjEwMDB9OworCWludCBpID0gVG1zIC8gU21zOworCisJaWYgKHNrYiA9PSBOVUxMKQorCQlyZXR1cm47CisJd2hpbGUgKGF0b21pY19yZWFkKCZza2Jfc2hpbmZvKHNrYiktPmRhdGFyZWYpICE9IDEgJiYgaS0tID4gMCkKKwkJbXNsZWVwKFNtcyk7CisJaWYgKGkgPD0gMCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJhb2U6ICVzIGhvbGRzIHJlZjogJXNcbiIsCisJCQlza2ItPmRldiA/IHNrYi0+ZGV2LT5uYW1lIDogIm5ldGlmIiwKKwkJCSJjYW5ub3QgZnJlZSBza2IgLS0gbWVtb3J5IGxlYWtlZC4iKTsKKwkJcmV0dXJuOworCX0KKwlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID0gc2tiLT5kYXRhX2xlbiA9IDA7CisJc2tiX3RyaW0oc2tiLCAwKTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7Cit9CisKK3N0YXRpYyB2b2lkCitza2Jwb29sZnJlZShzdHJ1Y3QgYW9lZGV2ICpkKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwl3aGlsZSAoKHNrYiA9IGQtPnNrYnBvb2xfaGQpKSB7CisJCWQtPnNrYnBvb2xfaGQgPSBza2ItPm5leHQ7CisJCXNrYi0+bmV4dCA9IE5VTEw7CisJCXNrYmZyZWUoc2tiKTsKKwl9CisJZC0+c2ticG9vbF90bCA9IE5VTEw7CiB9CiAKIC8qIGZpbmQgaXQgb3IgbWFsbG9jIGl0ICovCiBzdHJ1Y3QgYW9lZGV2ICoKLWFvZWRldl9ieV9zeXNtaW5vcl9tKHVsb25nIHN5c21pbm9yLCB1bG9uZyBidWZjbnQpCithb2VkZXZfYnlfc3lzbWlub3JfbSh1bG9uZyBzeXNtaW5vcikKIHsKIAlzdHJ1Y3QgYW9lZGV2ICpkOwogCXVsb25nIGZsYWdzOwpAQCAtMTUxLDQzICsyMjgsNDMgQEAKIAlmb3IgKGQ9ZGV2bGlzdDsgZDsgZD1kLT5uZXh0KQogCQlpZiAoZC0+c3lzbWlub3IgPT0gc3lzbWlub3IpCiAJCQlicmVhazsKLQotCWlmIChkID09IE5VTEwpIHsKLQkJZCA9IGFvZWRldl9uZXdkZXYoYnVmY250KTsKLQkgCWlmIChkID09IE5VTEwpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmxpc3RfbG9jaywgZmxhZ3MpOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiYW9lOiBhb2VkZXZfbmV3ZGV2IGZhaWx1cmUuXG4iKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWQtPnN5c21pbm9yID0gc3lzbWlub3I7Ci0JCWQtPmFvZW1ham9yID0gQU9FTUFKT1Ioc3lzbWlub3IpOwotCQlkLT5hb2VtaW5vciA9IEFPRU1JTk9SKHN5c21pbm9yKTsKLQl9Ci0KKwlpZiAoZCkKKwkJZ290byBvdXQ7CisJZCA9IGtjYWxsb2MoMSwgc2l6ZW9mICpkLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWQpCisJCWdvdG8gb3V0OworCUlOSVRfV09SSygmZC0+d29yaywgYW9lY21kX3NsZWVwd29yayk7CisJc3Bpbl9sb2NrX2luaXQoJmQtPmxvY2spOworCWluaXRfdGltZXIoJmQtPnRpbWVyKTsKKwlkLT50aW1lci5kYXRhID0gKHVsb25nKSBkOworCWQtPnRpbWVyLmZ1bmN0aW9uID0gZHVtbXlfdGltZXI7CisJZC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKwlhZGRfdGltZXIoJmQtPnRpbWVyKTsKKwlkLT5idWZwb29sID0gTlVMTDsJLyogZGVmZXIgdG8gYW9lYmxrX2dkYWxsb2MgKi8KKwlkLT50Z3QgPSBkLT50YXJnZXRzOworCUlOSVRfTElTVF9IRUFEKCZkLT5idWZxKTsKKwlkLT5zeXNtaW5vciA9IHN5c21pbm9yOworCWQtPmFvZW1ham9yID0gQU9FTUFKT1Ioc3lzbWlub3IpOworCWQtPmFvZW1pbm9yID0gQU9FTUlOT1Ioc3lzbWlub3IpOworCWQtPm1pbnRpbWVyID0gTUlOVElNRVI7CisJZC0+bmV4dCA9IGRldmxpc3Q7CisJZGV2bGlzdCA9IGQ7Cisgb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmxpc3RfbG9jaywgZmxhZ3MpOwogCXJldHVybiBkOwogfQogCiBzdGF0aWMgdm9pZAotYW9lZGV2X2ZyZWVkZXYoc3RydWN0IGFvZWRldiAqZCkKK2ZyZWV0Z3Qoc3RydWN0IGFvZWRldiAqZCwgc3RydWN0IGFvZXRndCAqdCkKIHsKIAlzdHJ1Y3QgZnJhbWUgKmYsICplOwogCi0JaWYgKGQtPmdkKSB7Ci0JCWFvZWRpc2tfcm1fc3lzZnMoZCk7Ci0JCWRlbF9nZW5kaXNrKGQtPmdkKTsKLQkJcHV0X2Rpc2soZC0+Z2QpOwotCX0KLQlmID0gZC0+ZnJhbWVzOwotCWUgPSBmICsgZC0+bmZyYW1lczsKLQlmb3IgKDsgZjxlOyBmKyspIHsKLQkJc2tiX3NoaW5mbyhmLT5za2IpLT5ucl9mcmFncyA9IDA7Ci0JCWRldl9rZnJlZV9za2IoZi0+c2tiKTsKLQl9Ci0Ja2ZyZWUoZC0+ZnJhbWVzKTsKLQlpZiAoZC0+YnVmcG9vbCkKLQkJbWVtcG9vbF9kZXN0cm95KGQtPmJ1ZnBvb2wpOwotCWtmcmVlKGQpOworCWYgPSB0LT5mcmFtZXM7CisJZSA9IGYgKyB0LT5uZnJhbWVzOworCWZvciAoOyBmIDwgZTsgZisrKQorCQlza2JmcmVlKGYtPnNrYik7CisJa2ZyZWUodC0+ZnJhbWVzKTsKKwlrZnJlZSh0KTsKIH0KIAogdm9pZApAQCAtMjE0LDcgKzI5MSw1IEBACiBpbnQgX19pbml0CiBhb2VkZXZfaW5pdCh2b2lkKQogewotCXNwaW5fbG9ja19pbml0KCZkZXZsaXN0X2xvY2spOwogCXJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VtYWluLmMgYi9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VtYWluLmMKaW5kZXggYTA0YjdkNi4uN2IxNWE1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9hb2UvYW9lbWFpbi5jCisrKyBiL2RyaXZlcnMvYmxvY2svYW9lL2FvZW1haW4uYwpAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwNiBDb3JhaWQsIEluYy4gIFNlZSBDT1BZSU5HIGZvciBHUEwgdGVybXMuICovCisvKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ29yYWlkLCBJbmMuICBTZWUgQ09QWUlORyBmb3IgR1BMIHRlcm1zLiAqLwogLyoKICAqIGFvZW1haW4uYwogICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzLCBkaXNjb3ZlciB0aW1lcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9hb2UvYW9lbmV0LmMgYi9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VuZXQuYwppbmRleCA0ZTZkZWI3Li44NDYwZWY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VuZXQuYworKysgYi9kcml2ZXJzL2Jsb2NrL2FvZS9hb2VuZXQuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwNiBDb3JhaWQsIEluYy4gIFNlZSBDT1BZSU5HIGZvciBHUEwgdGVybXMuICovCisvKiBDb3B5cmlnaHQgKGMpIDIwMDcgQ29yYWlkLCBJbmMuICBTZWUgQ09QWUlORyBmb3IgR1BMIHRlcm1zLiAqLwogLyoKICAqIGFvZW5ldC5jCiAgKiBFdGhlcm5ldCBwb3J0aW9uIG9mIEFvRSBkcml2ZXIKQEAgLTgzLDcgKzgzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdTY0Cit1bnNpZ25lZCBsb25nIGxvbmcKIG1hY19hZGRyKGNoYXIgYWRkcls2XSkKIHsKIAlfX2JlNjQgbiA9IDA7CkBAIC05MSw3ICs5MSw3IEBACiAKIAltZW1jcHkocCArIDIsIGFkZHIsIDYpOwkvKiAoc2l6ZW9mIGFkZHIgIT0gNikgKi8KIAotCXJldHVybiBfX2JlNjRfdG9fY3B1KG4pOworCXJldHVybiAodW5zaWduZWQgbG9uZyBsb25nKSBfX2JlNjRfdG9fY3B1KG4pOwogfQogCiB2b2lkCkBAIC0xMzcsOSArMTM3LDEyIEBACiAJCWlmIChuID4gTkVDT0RFUykKIAkJCW4gPSAwOwogCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fRVJSICJhb2U6IGVycm9yIHBhY2tldCBmcm9tICVkLiVkOyBlY29kZT0lZCAnJXMnXG4iLAotCQkJICAgICAgIGJlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoJmgtPm1ham9yKSksIGgtPm1pbm9yLAotCQkJICAgICAgIGgtPmVyciwgYW9lX2Vycmxpc3Rbbl0pOworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJIiVzJWQuJWRAJXM7IGVjb2RlPSVkICclcydcbiIsCisJCQkJImFvZTogZXJyb3IgcGFja2V0IGZyb20gIiwKKwkJCQliZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKCZoLT5tYWpvcikpLAorCQkJCWgtPm1pbm9yLCBza2ItPmRldi0+bmFtZSwKKwkJCQloLT5lcnIsIGFvZV9lcnJsaXN0W25dKTsKIAkJZ290byBleGl0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9icmQuYyBiL2RyaXZlcnMvYmxvY2svYnJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUzNjQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmxvY2svYnJkLmMKQEAgLTAsMCArMSw1ODMgQEAKKy8qCisgKiBSYW0gYmFja2VkIGJsb2NrIGRldmljZSBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE5pY2sgUGlnZ2luCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTm92ZWxsIEluYy4KKyAqCisgKiBQYXJ0cyBkZXJpdmVkIGZyb20gZHJpdmVycy9ibG9jay9yZC5jLCBhbmQgZHJpdmVycy9ibG9jay9sb29wLmMsIGNvcHlyaWdodAorICogb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvYmlvLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhZGl4LXRyZWUuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPiAvKiBpbnZhbGlkYXRlX2JoX2xydXMoKSAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBTRUNUT1JfU0hJRlQJCTkKKyNkZWZpbmUgUEFHRV9TRUNUT1JTX1NISUZUCShQQUdFX1NISUZUIC0gU0VDVE9SX1NISUZUKQorI2RlZmluZSBQQUdFX1NFQ1RPUlMJCSgxIDw8IFBBR0VfU0VDVE9SU19TSElGVCkKKworLyoKKyAqIEVhY2ggYmxvY2sgcmFtZGlzayBkZXZpY2UgaGFzIGEgcmFkaXhfdHJlZSBicmRfcGFnZXMgb2YgcGFnZXMgdGhhdCBzdG9yZXMKKyAqIHRoZSBwYWdlcyBjb250YWluaW5nIHRoZSBibG9jayBkZXZpY2UncyBjb250ZW50cy4gQSBicmQgcGFnZSdzIC0+aW5kZXggaXMKKyAqIGl0cyBvZmZzZXQgaW4gUEFHRV9TSVpFIHVuaXRzLiBUaGlzIGlzIHNpbWlsYXIgdG8sIGJ1dCBpbiBubyB3YXkgY29ubmVjdGVkCisgKiB3aXRoLCB0aGUga2VybmVsJ3MgcGFnZWNhY2hlIG9yIGJ1ZmZlciBjYWNoZSAod2hpY2ggc2l0IGFib3ZlIG91ciBibG9jaworICogZGV2aWNlKS4KKyAqLworc3RydWN0IGJyZF9kZXZpY2UgeworCWludAkJYnJkX251bWJlcjsKKwlpbnQJCWJyZF9yZWZjbnQ7CisJbG9mZl90CQlicmRfb2Zmc2V0OworCWxvZmZfdAkJYnJkX3NpemVsaW1pdDsKKwl1bnNpZ25lZAlicmRfYmxvY2tzaXplOworCisJc3RydWN0IHJlcXVlc3RfcXVldWUJKmJyZF9xdWV1ZTsKKwlzdHJ1Y3QgZ2VuZGlzawkJKmJyZF9kaXNrOworCXN0cnVjdCBsaXN0X2hlYWQJYnJkX2xpc3Q7CisKKwkvKgorCSAqIEJhY2tpbmcgc3RvcmUgb2YgcGFnZXMgYW5kIGxvY2sgdG8gcHJvdGVjdCBpdC4gVGhpcyBpcyB0aGUgY29udGVudHMKKwkgKiBvZiB0aGUgYmxvY2sgZGV2aWNlLgorCSAqLworCXNwaW5sb2NrX3QJCWJyZF9sb2NrOworCXN0cnVjdCByYWRpeF90cmVlX3Jvb3QJYnJkX3BhZ2VzOworfTsKKworLyoKKyAqIExvb2sgdXAgYW5kIHJldHVybiBhIGJyZCdzIHBhZ2UgZm9yIGEgZ2l2ZW4gc2VjdG9yLgorICovCitzdGF0aWMgc3RydWN0IHBhZ2UgKmJyZF9sb29rdXBfcGFnZShzdHJ1Y3QgYnJkX2RldmljZSAqYnJkLCBzZWN0b3JfdCBzZWN0b3IpCit7CisJcGdvZmZfdCBpZHg7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwkvKgorCSAqIFRoZSBwYWdlIGxpZmV0aW1lIGlzIHByb3RlY3RlZCBieSB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgb3BlbmVkIHRoZQorCSAqIGRldmljZSBub2RlIC0tIGJyZCBwYWdlcyB3aWxsIG5ldmVyIGJlIGRlbGV0ZWQgdW5kZXIgdXMsIHNvIHdlCisJICogZG9uJ3QgbmVlZCBhbnkgZnVydGhlciBsb2NraW5nIG9yIHJlZmNvdW50aW5nLgorCSAqCisJICogVGhpcyBpcyBzdHJpY3RseSB0cnVlIGZvciB0aGUgcmFkaXgtdHJlZSBub2RlcyBhcyB3ZWxsIChpZS4gd2UKKwkgKiBkb24ndCBhY3R1YWxseSBuZWVkIHRoZSByY3VfcmVhZF9sb2NrKCkpLCBob3dldmVyIHRoYXQgaXMgbm90IGEKKwkgKiBkb2N1bWVudGVkIGZlYXR1cmUgb2YgdGhlIHJhZGl4LXRyZWUgQVBJIHNvIGl0IGlzIGJldHRlciB0byBiZQorCSAqIHNhZmUgaGVyZSAod2UgZG9uJ3QgaGF2ZSB0b3RhbCBleGNsdXNpb24gZnJvbSByYWRpeCB0cmVlIHVwZGF0ZXMKKwkgKiBoZXJlLCBvbmx5IGRlbGV0ZXMpLgorCSAqLworCXJjdV9yZWFkX2xvY2soKTsKKwlpZHggPSBzZWN0b3IgPj4gUEFHRV9TRUNUT1JTX1NISUZUOyAvKiBzZWN0b3IgdG8gcGFnZSBpbmRleCAqLworCXBhZ2UgPSByYWRpeF90cmVlX2xvb2t1cCgmYnJkLT5icmRfcGFnZXMsIGlkeCk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlCVUdfT04ocGFnZSAmJiBwYWdlLT5pbmRleCAhPSBpZHgpOworCisJcmV0dXJuIHBhZ2U7Cit9CisKKy8qCisgKiBMb29rIHVwIGFuZCByZXR1cm4gYSBicmQncyBwYWdlIGZvciBhIGdpdmVuIHNlY3Rvci4KKyAqIElmIG9uZSBkb2VzIG5vdCBleGlzdCwgYWxsb2NhdGUgYW4gZW1wdHkgcGFnZSwgYW5kIGluc2VydCB0aGF0LiBUaGVuCisgKiByZXR1cm4gaXQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqYnJkX2luc2VydF9wYWdlKHN0cnVjdCBicmRfZGV2aWNlICpicmQsIHNlY3Rvcl90IHNlY3RvcikKK3sKKwlwZ29mZl90IGlkeDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlnZnBfdCBnZnBfZmxhZ3M7CisKKwlwYWdlID0gYnJkX2xvb2t1cF9wYWdlKGJyZCwgc2VjdG9yKTsKKwlpZiAocGFnZSkKKwkJcmV0dXJuIHBhZ2U7CisKKwkvKgorCSAqIE11c3QgdXNlIE5PSU8gYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHJlY3Vyc2UgYmFjayBpbnRvIHRoZQorCSAqIGJsb2NrIG9yIGZpbGVzeXN0ZW0gbGF5ZXJzIGZyb20gcGFnZSByZWNsYWltLgorCSAqCisJICogQ2Fubm90IHN1cHBvcnQgWElQIGFuZCBoaWdobWVtLCBiZWNhdXNlIG91ciAtPmRpcmVjdF9hY2Nlc3MKKwkgKiByb3V0aW5lIGZvciBYSVAgbXVzdCByZXR1cm4gbWVtb3J5IHRoYXQgaXMgYWx3YXlzIGFkZHJlc3NhYmxlLgorCSAqIElmIFhJUCB3YXMgcmV3b3JrZWQgdG8gdXNlIHBmbnMgYW5kIGttYXAgdGhyb3VnaG91dCwgdGhpcworCSAqIHJlc3RyaWN0aW9uIG1pZ2h0IGJlIGFibGUgdG8gYmUgbGlmdGVkLgorCSAqLworCWdmcF9mbGFncyA9IEdGUF9OT0lPIHwgX19HRlBfWkVSTzsKKyNpZm5kZWYgQ09ORklHX0JMS19ERVZfWElQCisJZ2ZwX2ZsYWdzIHw9IF9fR0ZQX0hJR0hNRU07CisjZW5kaWYKKwlwYWdlID0gYWxsb2NfcGFnZShHRlBfTk9JTyB8IF9fR0ZQX0hJR0hNRU0gfCBfX0dGUF9aRVJPKTsKKwlpZiAoIXBhZ2UpCisJCXJldHVybiBOVUxMOworCisJaWYgKHJhZGl4X3RyZWVfcHJlbG9hZChHRlBfTk9JTykpIHsKKwkJX19mcmVlX3BhZ2UocGFnZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXNwaW5fbG9jaygmYnJkLT5icmRfbG9jayk7CisJaWR4ID0gc2VjdG9yID4+IFBBR0VfU0VDVE9SU19TSElGVDsKKwlpZiAocmFkaXhfdHJlZV9pbnNlcnQoJmJyZC0+YnJkX3BhZ2VzLCBpZHgsIHBhZ2UpKSB7CisJCV9fZnJlZV9wYWdlKHBhZ2UpOworCQlwYWdlID0gcmFkaXhfdHJlZV9sb29rdXAoJmJyZC0+YnJkX3BhZ2VzLCBpZHgpOworCQlCVUdfT04oIXBhZ2UpOworCQlCVUdfT04ocGFnZS0+aW5kZXggIT0gaWR4KTsKKwl9IGVsc2UKKwkJcGFnZS0+aW5kZXggPSBpZHg7CisJc3Bpbl91bmxvY2soJmJyZC0+YnJkX2xvY2spOworCisJcmFkaXhfdHJlZV9wcmVsb2FkX2VuZCgpOworCisJcmV0dXJuIHBhZ2U7Cit9CisKKy8qCisgKiBGcmVlIGFsbCBiYWNraW5nIHN0b3JlIHBhZ2VzIGFuZCByYWRpeCB0cmVlLiBUaGlzIG11c3Qgb25seSBiZSBjYWxsZWQgd2hlbgorICogdGhlcmUgYXJlIG5vIG90aGVyIHVzZXJzIG9mIHRoZSBkZXZpY2UuCisgKi8KKyNkZWZpbmUgRlJFRV9CQVRDSCAxNgorc3RhdGljIHZvaWQgYnJkX2ZyZWVfcGFnZXMoc3RydWN0IGJyZF9kZXZpY2UgKmJyZCkKK3sKKwl1bnNpZ25lZCBsb25nIHBvcyA9IDA7CisJc3RydWN0IHBhZ2UgKnBhZ2VzW0ZSRUVfQkFUQ0hdOworCWludCBucl9wYWdlczsKKworCWRvIHsKKwkJaW50IGk7CisKKwkJbnJfcGFnZXMgPSByYWRpeF90cmVlX2dhbmdfbG9va3VwKCZicmQtPmJyZF9wYWdlcywKKwkJCQkodm9pZCAqKilwYWdlcywgcG9zLCBGUkVFX0JBVENIKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgeworCQkJdm9pZCAqcmV0OworCisJCQlCVUdfT04ocGFnZXNbaV0tPmluZGV4IDwgcG9zKTsKKwkJCXBvcyA9IHBhZ2VzW2ldLT5pbmRleDsKKwkJCXJldCA9IHJhZGl4X3RyZWVfZGVsZXRlKCZicmQtPmJyZF9wYWdlcywgcG9zKTsKKwkJCUJVR19PTighcmV0IHx8IHJldCAhPSBwYWdlc1tpXSk7CisJCQlfX2ZyZWVfcGFnZShwYWdlc1tpXSk7CisJCX0KKworCQlwb3MrKzsKKworCQkvKgorCQkgKiBUaGlzIGFzc3VtZXMgcmFkaXhfdHJlZV9nYW5nX2xvb2t1cCBhbHdheXMgcmV0dXJucyBhcworCQkgKiBtYW55IHBhZ2VzIGFzIHBvc3NpYmxlLiBJZiB0aGUgcmFkaXgtdHJlZSBjb2RlIGNoYW5nZXMsCisJCSAqIHNvIHdpbGwgdGhpcyBoYXZlIHRvLgorCQkgKi8KKwl9IHdoaWxlIChucl9wYWdlcyA9PSBGUkVFX0JBVENIKTsKK30KKworLyoKKyAqIGNvcHlfdG9fYnJkX3NldHVwIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjb3B5X3RvX2JyZC4gSXQgbWF5IHNsZWVwLgorICovCitzdGF0aWMgaW50IGNvcHlfdG9fYnJkX3NldHVwKHN0cnVjdCBicmRfZGV2aWNlICpicmQsIHNlY3Rvcl90IHNlY3Rvciwgc2l6ZV90IG4pCit7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IChzZWN0b3IgJiAoUEFHRV9TRUNUT1JTLTEpKSA8PCBTRUNUT1JfU0hJRlQ7CisJc2l6ZV90IGNvcHk7CisKKwljb3B5ID0gbWluX3Qoc2l6ZV90LCBuLCBQQUdFX1NJWkUgLSBvZmZzZXQpOworCWlmICghYnJkX2luc2VydF9wYWdlKGJyZCwgc2VjdG9yKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGNvcHkgPCBuKSB7CisJCXNlY3RvciArPSBjb3B5ID4+IFNFQ1RPUl9TSElGVDsKKwkJaWYgKCFicmRfaW5zZXJ0X3BhZ2UoYnJkLCBzZWN0b3IpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCisvKgorICogQ29weSBuIGJ5dGVzIGZyb20gc3JjIHRvIHRoZSBicmQgc3RhcnRpbmcgYXQgc2VjdG9yLiBEb2VzIG5vdCBzbGVlcC4KKyAqLworc3RhdGljIHZvaWQgY29weV90b19icmQoc3RydWN0IGJyZF9kZXZpY2UgKmJyZCwgY29uc3Qgdm9pZCAqc3JjLAorCQkJc2VjdG9yX3Qgc2VjdG9yLCBzaXplX3QgbikKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl2b2lkICpkc3Q7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IChzZWN0b3IgJiAoUEFHRV9TRUNUT1JTLTEpKSA8PCBTRUNUT1JfU0hJRlQ7CisJc2l6ZV90IGNvcHk7CisKKwljb3B5ID0gbWluX3Qoc2l6ZV90LCBuLCBQQUdFX1NJWkUgLSBvZmZzZXQpOworCXBhZ2UgPSBicmRfbG9va3VwX3BhZ2UoYnJkLCBzZWN0b3IpOworCUJVR19PTighcGFnZSk7CisKKwlkc3QgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMSk7CisJbWVtY3B5KGRzdCArIG9mZnNldCwgc3JjLCBjb3B5KTsKKwlrdW5tYXBfYXRvbWljKGRzdCwgS01fVVNFUjEpOworCisJaWYgKGNvcHkgPCBuKSB7CisJCXNyYyArPSBjb3B5OworCQlzZWN0b3IgKz0gY29weSA+PiBTRUNUT1JfU0hJRlQ7CisJCWNvcHkgPSBuIC0gY29weTsKKwkJcGFnZSA9IGJyZF9sb29rdXBfcGFnZShicmQsIHNlY3Rvcik7CisJCUJVR19PTighcGFnZSk7CisKKwkJZHN0ID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjEpOworCQltZW1jcHkoZHN0LCBzcmMsIGNvcHkpOworCQlrdW5tYXBfYXRvbWljKGRzdCwgS01fVVNFUjEpOworCX0KK30KKworLyoKKyAqIENvcHkgbiBieXRlcyB0byBkc3QgZnJvbSB0aGUgYnJkIHN0YXJ0aW5nIGF0IHNlY3Rvci4gRG9lcyBub3Qgc2xlZXAuCisgKi8KK3N0YXRpYyB2b2lkIGNvcHlfZnJvbV9icmQodm9pZCAqZHN0LCBzdHJ1Y3QgYnJkX2RldmljZSAqYnJkLAorCQkJc2VjdG9yX3Qgc2VjdG9yLCBzaXplX3QgbikKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl2b2lkICpzcmM7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IChzZWN0b3IgJiAoUEFHRV9TRUNUT1JTLTEpKSA8PCBTRUNUT1JfU0hJRlQ7CisJc2l6ZV90IGNvcHk7CisKKwljb3B5ID0gbWluX3Qoc2l6ZV90LCBuLCBQQUdFX1NJWkUgLSBvZmZzZXQpOworCXBhZ2UgPSBicmRfbG9va3VwX3BhZ2UoYnJkLCBzZWN0b3IpOworCWlmIChwYWdlKSB7CisJCXNyYyA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIxKTsKKwkJbWVtY3B5KGRzdCwgc3JjICsgb2Zmc2V0LCBjb3B5KTsKKwkJa3VubWFwX2F0b21pYyhzcmMsIEtNX1VTRVIxKTsKKwl9IGVsc2UKKwkJbWVtc2V0KGRzdCwgMCwgY29weSk7CisKKwlpZiAoY29weSA8IG4pIHsKKwkJZHN0ICs9IGNvcHk7CisJCXNlY3RvciArPSBjb3B5ID4+IFNFQ1RPUl9TSElGVDsKKwkJY29weSA9IG4gLSBjb3B5OworCQlwYWdlID0gYnJkX2xvb2t1cF9wYWdlKGJyZCwgc2VjdG9yKTsKKwkJaWYgKHBhZ2UpIHsKKwkJCXNyYyA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIxKTsKKwkJCW1lbWNweShkc3QsIHNyYywgY29weSk7CisJCQlrdW5tYXBfYXRvbWljKHNyYywgS01fVVNFUjEpOworCQl9IGVsc2UKKwkJCW1lbXNldChkc3QsIDAsIGNvcHkpOworCX0KK30KKworLyoKKyAqIFByb2Nlc3MgYSBzaW5nbGUgYnZlYyBvZiBhIGJpby4KKyAqLworc3RhdGljIGludCBicmRfZG9fYnZlYyhzdHJ1Y3QgYnJkX2RldmljZSAqYnJkLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCXVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBvZmYsIGludCBydywKKwkJCXNlY3Rvcl90IHNlY3RvcikKK3sKKwl2b2lkICptZW07CisJaW50IGVyciA9IDA7CisKKwlpZiAocncgIT0gUkVBRCkgeworCQllcnIgPSBjb3B5X3RvX2JyZF9zZXR1cChicmQsIHNlY3RvciwgbGVuKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKworCW1lbSA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwlpZiAocncgPT0gUkVBRCkgeworCQljb3B5X2Zyb21fYnJkKG1lbSArIG9mZiwgYnJkLCBzZWN0b3IsIGxlbik7CisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCX0gZWxzZQorCQljb3B5X3RvX2JyZChicmQsIG1lbSArIG9mZiwgc2VjdG9yLCBsZW4pOworCWt1bm1hcF9hdG9taWMobWVtLCBLTV9VU0VSMCk7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGJyZF9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gYmlvLT5iaV9iZGV2OworCXN0cnVjdCBicmRfZGV2aWNlICpicmQgPSBiZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CisJaW50IHJ3OworCXN0cnVjdCBiaW9fdmVjICpidmVjOworCXNlY3Rvcl90IHNlY3RvcjsKKwlpbnQgaTsKKwlpbnQgZXJyID0gLUVJTzsKKworCXNlY3RvciA9IGJpby0+Ymlfc2VjdG9yOworCWlmIChzZWN0b3IgKyAoYmlvLT5iaV9zaXplID4+IFNFQ1RPUl9TSElGVCkgPgorCQkJCQkJZ2V0X2NhcGFjaXR5KGJkZXYtPmJkX2Rpc2spKQorCQlnb3RvIG91dDsKKworCXJ3ID0gYmlvX3J3KGJpbyk7CisJaWYgKHJ3ID09IFJFQURBKQorCQlydyA9IFJFQUQ7CisKKwliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCBiaW8sIGkpIHsKKwkJdW5zaWduZWQgaW50IGxlbiA9IGJ2ZWMtPmJ2X2xlbjsKKwkJZXJyID0gYnJkX2RvX2J2ZWMoYnJkLCBidmVjLT5idl9wYWdlLCBsZW4sCisJCQkJCWJ2ZWMtPmJ2X29mZnNldCwgcncsIHNlY3Rvcik7CisJCWlmIChlcnIpCisJCQlicmVhazsKKwkJc2VjdG9yICs9IGxlbiA+PiBTRUNUT1JfU0hJRlQ7CisJfQorCitvdXQ6CisJYmlvX2VuZGlvKGJpbywgZXJyKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0JMS19ERVZfWElQCitzdGF0aWMgaW50IGJyZF9kaXJlY3RfYWNjZXNzIChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBzZWN0b3IsCisJCQl1bnNpZ25lZCBsb25nICpkYXRhKQoreworCXN0cnVjdCBicmRfZGV2aWNlICpicmQgPSBiZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlpZiAoIWJyZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKHNlY3RvciAmIChQQUdFX1NFQ1RPUlMtMSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChzZWN0b3IgKyBQQUdFX1NFQ1RPUlMgPiBnZXRfY2FwYWNpdHkoYmRldi0+YmRfZGlzaykpCisJCXJldHVybiAtRVJBTkdFOworCXBhZ2UgPSBicmRfaW5zZXJ0X3BhZ2UoYnJkLCBzZWN0b3IpOworCWlmICghcGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJKmRhdGEgPSAodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGJyZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gaW5vZGUtPmlfYmRldjsKKwlzdHJ1Y3QgYnJkX2RldmljZSAqYnJkID0gYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGNtZCAhPSBCTEtGTFNCVUYpCisJCXJldHVybiAtRU5PVFRZOworCisJLyoKKwkgKiByYW0gZGV2aWNlIEJMS0ZMU0JVRiBoYXMgc3BlY2lhbCBzZW1hbnRpY3MsIHdlIHdhbnQgdG8gYWN0dWFsbHkKKwkgKiByZWxlYXNlIGFuZCBkZXN0cm95IHRoZSByYW1kaXNrIGRhdGEuCisJICovCisJbXV0ZXhfbG9jaygmYmRldi0+YmRfbXV0ZXgpOworCWVycm9yID0gLUVCVVNZOworCWlmIChiZGV2LT5iZF9vcGVuZXJzIDw9IDEpIHsKKwkJLyoKKwkJICogSW52YWxpZGF0ZSB0aGUgY2FjaGUgZmlyc3QsIHNvIGl0IGlzbid0IHdyaXR0ZW4KKwkJICogYmFjayB0byB0aGUgZGV2aWNlLgorCQkgKgorCQkgKiBBbm90aGVyIHRocmVhZCBtaWdodCBpbnN0YW50aWF0ZSBtb3JlIGJ1ZmZlcmNhY2hlIGhlcmUsCisJCSAqIGJ1dCB0aGVyZSBpcyBub3QgbXVjaCB3ZSBjYW4gZG8gdG8gY2xvc2UgdGhhdCByYWNlLgorCQkgKi8KKwkJaW52YWxpZGF0ZV9iaF9scnVzKCk7CisJCXRydW5jYXRlX2lub2RlX3BhZ2VzKGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcsIDApOworCQlicmRfZnJlZV9wYWdlcyhicmQpOworCQllcnJvciA9IDA7CisJfQorCW11dGV4X3VubG9jaygmYmRldi0+YmRfbXV0ZXgpOworCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIGJyZF9mb3BzID0geworCS5vd25lciA9CQlUSElTX01PRFVMRSwKKwkuaW9jdGwgPQkJYnJkX2lvY3RsLAorI2lmZGVmIENPTkZJR19CTEtfREVWX1hJUAorCS5kaXJlY3RfYWNjZXNzID0JYnJkX2RpcmVjdF9hY2Nlc3MsCisjZW5kaWYKK307CisKKy8qCisgKiBBbmQgbm93IHRoZSBtb2R1bGVzIGNvZGUgYW5kIGtlcm5lbCBpbnRlcmZhY2UuCisgKi8KK3N0YXRpYyBpbnQgcmRfbnI7CitpbnQgcmRfc2l6ZSA9IENPTkZJR19CTEtfREVWX1JBTV9TSVpFOworbW9kdWxlX3BhcmFtKHJkX25yLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhyZF9uciwgIk1heGltdW0gbnVtYmVyIG9mIGJyZCBkZXZpY2VzIik7Cittb2R1bGVfcGFyYW0ocmRfc2l6ZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocmRfc2l6ZSwgIlNpemUgb2YgZWFjaCBSQU0gZGlzayBpbiBrYnl0ZXMuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfQkxPQ0tERVZfTUFKT1IoUkFNRElTS19NQUpPUik7CisKKyNpZm5kZWYgTU9EVUxFCisvKiBMZWdhY3kgYm9vdCBvcHRpb25zIC0gbm9ubW9kdWxhciAqLworc3RhdGljIGludCBfX2luaXQgcmFtZGlza19zaXplKGNoYXIgKnN0cikKK3sKKwlyZF9zaXplID0gc2ltcGxlX3N0cnRvbChzdHIsIE5VTEwsIDApOworCXJldHVybiAxOworfQorc3RhdGljIGludCBfX2luaXQgcmFtZGlza19zaXplMihjaGFyICpzdHIpCit7CisJcmV0dXJuIHJhbWRpc2tfc2l6ZShzdHIpOworfQorX19zZXR1cCgicmFtZGlzaz0iLCByYW1kaXNrX3NpemUpOworX19zZXR1cCgicmFtZGlza19zaXplPSIsIHJhbWRpc2tfc2l6ZTIpOworI2VuZGlmCisKKy8qCisgKiBUaGUgZGV2aWNlIHNjaGVtZSBpcyBkZXJpdmVkIGZyb20gbG9vcC5jLiBLZWVwIHRoZW0gaW4gc3luY2ggd2hlcmUgcG9zc2libGUKKyAqIChzaG91bGQgc2hhcmUgY29kZSBldmVudHVhbGx5KS4KKyAqLworc3RhdGljIExJU1RfSEVBRChicmRfZGV2aWNlcyk7CitzdGF0aWMgREVGSU5FX01VVEVYKGJyZF9kZXZpY2VzX211dGV4KTsKKworc3RhdGljIHN0cnVjdCBicmRfZGV2aWNlICpicmRfYWxsb2MoaW50IGkpCit7CisJc3RydWN0IGJyZF9kZXZpY2UgKmJyZDsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKKworCWJyZCA9IGt6YWxsb2Moc2l6ZW9mKCpicmQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJyZCkKKwkJZ290byBvdXQ7CisJYnJkLT5icmRfbnVtYmVyCQk9IGk7CisJc3Bpbl9sb2NrX2luaXQoJmJyZC0+YnJkX2xvY2spOworCUlOSVRfUkFESVhfVFJFRSgmYnJkLT5icmRfcGFnZXMsIEdGUF9BVE9NSUMpOworCisJYnJkLT5icmRfcXVldWUgPSBibGtfYWxsb2NfcXVldWUoR0ZQX0tFUk5FTCk7CisJaWYgKCFicmQtPmJyZF9xdWV1ZSkKKwkJZ290byBvdXRfZnJlZV9kZXY7CisJYmxrX3F1ZXVlX21ha2VfcmVxdWVzdChicmQtPmJyZF9xdWV1ZSwgYnJkX21ha2VfcmVxdWVzdCk7CisJYmxrX3F1ZXVlX21heF9zZWN0b3JzKGJyZC0+YnJkX3F1ZXVlLCAxMDI0KTsKKwlibGtfcXVldWVfYm91bmNlX2xpbWl0KGJyZC0+YnJkX3F1ZXVlLCBCTEtfQk9VTkNFX0FOWSk7CisKKwlkaXNrID0gYnJkLT5icmRfZGlzayA9IGFsbG9jX2Rpc2soMSk7CisJaWYgKCFkaXNrKQorCQlnb3RvIG91dF9mcmVlX3F1ZXVlOworCWRpc2stPm1ham9yCQk9IFJBTURJU0tfTUFKT1I7CisJZGlzay0+Zmlyc3RfbWlub3IJPSBpOworCWRpc2stPmZvcHMJCT0gJmJyZF9mb3BzOworCWRpc2stPnByaXZhdGVfZGF0YQk9IGJyZDsKKwlkaXNrLT5xdWV1ZQkJPSBicmQtPmJyZF9xdWV1ZTsKKwlzcHJpbnRmKGRpc2stPmRpc2tfbmFtZSwgInJhbSVkIiwgaSk7CisJc2V0X2NhcGFjaXR5KGRpc2ssIHJkX3NpemUgKiAyKTsKKworCXJldHVybiBicmQ7CisKK291dF9mcmVlX3F1ZXVlOgorCWJsa19jbGVhbnVwX3F1ZXVlKGJyZC0+YnJkX3F1ZXVlKTsKK291dF9mcmVlX2RldjoKKwlrZnJlZShicmQpOworb3V0OgorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBicmRfZnJlZShzdHJ1Y3QgYnJkX2RldmljZSAqYnJkKQoreworCXB1dF9kaXNrKGJyZC0+YnJkX2Rpc2spOworCWJsa19jbGVhbnVwX3F1ZXVlKGJyZC0+YnJkX3F1ZXVlKTsKKwlicmRfZnJlZV9wYWdlcyhicmQpOworCWtmcmVlKGJyZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnJkX2RldmljZSAqYnJkX2luaXRfb25lKGludCBpKQoreworCXN0cnVjdCBicmRfZGV2aWNlICpicmQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJyZCwgJmJyZF9kZXZpY2VzLCBicmRfbGlzdCkgeworCQlpZiAoYnJkLT5icmRfbnVtYmVyID09IGkpCisJCQlnb3RvIG91dDsKKwl9CisKKwlicmQgPSBicmRfYWxsb2MoaSk7CisJaWYgKGJyZCkgeworCQlhZGRfZGlzayhicmQtPmJyZF9kaXNrKTsKKwkJbGlzdF9hZGRfdGFpbCgmYnJkLT5icmRfbGlzdCwgJmJyZF9kZXZpY2VzKTsKKwl9CitvdXQ6CisJcmV0dXJuIGJyZDsKK30KKworc3RhdGljIHZvaWQgYnJkX2RlbF9vbmUoc3RydWN0IGJyZF9kZXZpY2UgKmJyZCkKK3sKKwlsaXN0X2RlbCgmYnJkLT5icmRfbGlzdCk7CisJZGVsX2dlbmRpc2soYnJkLT5icmRfZGlzayk7CisJYnJkX2ZyZWUoYnJkKTsKK30KKworc3RhdGljIHN0cnVjdCBrb2JqZWN0ICpicmRfcHJvYmUoZGV2X3QgZGV2LCBpbnQgKnBhcnQsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGJyZF9kZXZpY2UgKmJyZDsKKwlzdHJ1Y3Qga29iamVjdCAqa29iajsKKworCW11dGV4X2xvY2soJmJyZF9kZXZpY2VzX211dGV4KTsKKwlicmQgPSBicmRfaW5pdF9vbmUoZGV2ICYgTUlOT1JNQVNLKTsKKwlrb2JqID0gYnJkID8gZ2V0X2Rpc2soYnJkLT5icmRfZGlzaykgOiBFUlJfUFRSKC1FTk9NRU0pOworCW11dGV4X3VubG9jaygmYnJkX2RldmljZXNfbXV0ZXgpOworCisJKnBhcnQgPSAwOworCXJldHVybiBrb2JqOworfQorCitzdGF0aWMgaW50IF9faW5pdCBicmRfaW5pdCh2b2lkKQoreworCWludCBpLCBucjsKKwl1bnNpZ25lZCBsb25nIHJhbmdlOworCXN0cnVjdCBicmRfZGV2aWNlICpicmQsICpuZXh0OworCisJLyoKKwkgKiBicmQgbW9kdWxlIG5vdyBoYXMgYSBmZWF0dXJlIHRvIGluc3RhbnRpYXRlIHVuZGVybHlpbmcgZGV2aWNlCisJICogc3RydWN0dXJlIG9uLWRlbWFuZCwgcHJvdmlkZWQgdGhhdCB0aGVyZSBpcyBhbiBhY2Nlc3MgZGV2IG5vZGUuCisJICogSG93ZXZlciwgdGhpcyB3aWxsIG5vdCB3b3JrIHdlbGwgd2l0aCB1c2VyIHNwYWNlIHRvb2wgdGhhdCBkb2Vzbid0CisJICoga25vdyBhYm91dCBzdWNoICJmZWF0dXJlIi4gIEluIG9yZGVyIHRvIG5vdCBicmVhayBhbnkgZXhpc3RpbmcKKwkgKiB0b29sLCB3ZSBkbyB0aGUgZm9sbG93aW5nOgorCSAqCisJICogKDEpIGlmIHJkX25yIGlzIHNwZWNpZmllZCwgY3JlYXRlIHRoYXQgbWFueSB1cGZyb250LCBhbmQgdGhpcworCSAqICAgICBhbHNvIGJlY29tZXMgYSBoYXJkIGxpbWl0LgorCSAqICgyKSBpZiByZF9uciBpcyBub3Qgc3BlY2lmaWVkLCBjcmVhdGUgMSByZCBkZXZpY2Ugb24gbW9kdWxlCisJICogICAgIGxvYWQsIHVzZXIgY2FuIGZ1cnRoZXIgZXh0ZW5kIGJyZCBkZXZpY2UgYnkgY3JlYXRlIGRldiBub2RlCisJICogICAgIHRoZW1zZWx2ZXMgYW5kIGhhdmUga2VybmVsIGF1dG9tYXRpY2FsbHkgaW5zdGFudGlhdGUgYWN0dWFsCisJICogICAgIGRldmljZSBvbi1kZW1hbmQuCisJICovCisJaWYgKHJkX25yID4gMVVMIDw8IE1JTk9SQklUUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocmRfbnIpIHsKKwkJbnIgPSByZF9ucjsKKwkJcmFuZ2UgPSByZF9ucjsKKwl9IGVsc2UgeworCQluciA9IENPTkZJR19CTEtfREVWX1JBTV9DT1VOVDsKKwkJcmFuZ2UgPSAxVUwgPDwgTUlOT1JCSVRTOworCX0KKworCWlmIChyZWdpc3Rlcl9ibGtkZXYoUkFNRElTS19NQUpPUiwgInJhbWRpc2siKSkKKwkJcmV0dXJuIC1FSU87CisKKwlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgeworCQlicmQgPSBicmRfYWxsb2MoaSk7CisJCWlmICghYnJkKQorCQkJZ290byBvdXRfZnJlZTsKKwkJbGlzdF9hZGRfdGFpbCgmYnJkLT5icmRfbGlzdCwgJmJyZF9kZXZpY2VzKTsKKwl9CisKKwkvKiBwb2ludCBvZiBubyByZXR1cm4gKi8KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYnJkLCAmYnJkX2RldmljZXMsIGJyZF9saXN0KQorCQlhZGRfZGlzayhicmQtPmJyZF9kaXNrKTsKKworCWJsa19yZWdpc3Rlcl9yZWdpb24oTUtERVYoUkFNRElTS19NQUpPUiwgMCksIHJhbmdlLAorCQkJCSAgVEhJU19NT0RVTEUsIGJyZF9wcm9iZSwgTlVMTCwgTlVMTCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJicmQ6IG1vZHVsZSBsb2FkZWRcbiIpOworCXJldHVybiAwOworCitvdXRfZnJlZToKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYnJkLCBuZXh0LCAmYnJkX2RldmljZXMsIGJyZF9saXN0KSB7CisJCWxpc3RfZGVsKCZicmQtPmJyZF9saXN0KTsKKwkJYnJkX2ZyZWUoYnJkKTsKKwl9CisKKwl1bnJlZ2lzdGVyX2Jsa2RldihSQU1ESVNLX01BSk9SLCAiYnJkIik7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBicmRfZXhpdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcmFuZ2U7CisJc3RydWN0IGJyZF9kZXZpY2UgKmJyZCwgKm5leHQ7CisKKwlyYW5nZSA9IHJkX25yID8gcmRfbnIgOiAgMVVMIDw8IE1JTk9SQklUUzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShicmQsIG5leHQsICZicmRfZGV2aWNlcywgYnJkX2xpc3QpCisJCWJyZF9kZWxfb25lKGJyZCk7CisKKwlibGtfdW5yZWdpc3Rlcl9yZWdpb24oTUtERVYoUkFNRElTS19NQUpPUiwgMCksIHJhbmdlKTsKKwl1bnJlZ2lzdGVyX2Jsa2RldihSQU1ESVNLX01BSk9SLCAicmFtZGlzayIpOworfQorCittb2R1bGVfaW5pdChicmRfaW5pdCk7Cittb2R1bGVfZXhpdChicmRfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svbmJkLmMgYi9kcml2ZXJzL2Jsb2NrL25iZC5jCmluZGV4IGFlMzEwNjAuLjAxODc1M2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svbmJkLmMKKysrIGIvZHJpdmVycy9ibG9jay9uYmQuYwpAQCAtNTQsNyArNTQsNyBAQAogI2VuZGlmIC8qIE5ERUJVRyAqLwogCiBzdGF0aWMgdW5zaWduZWQgaW50IG5iZHNfbWF4ID0gMTY7Ci1zdGF0aWMgc3RydWN0IG5iZF9kZXZpY2UgbmJkX2RldltNQVhfTkJEXTsKK3N0YXRpYyBzdHJ1Y3QgbmJkX2RldmljZSAqbmJkX2RldjsKIAogLyoKICAqIFVzZSBqdXN0IG9uZSBsb2NrIChvciBhdCBtb3N0IDEgcGVyIE5JQykuIFR3byBhcmd1bWVudHMgZm9yIHRoaXM6CkBAIC02NDksMTEgKzY0OSw5IEBACiAKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBuYmRfcmVxdWVzdCkgIT0gMjgpOwogCi0JaWYgKG5iZHNfbWF4ID4gTUFYX05CRCkgewotCQlwcmludGsoS0VSTl9DUklUICJuYmQ6IGNhbm5vdCBhbGxvY2F0ZSBtb3JlIHRoYW4gJXUgbmJkczsgJXUgcmVxdWVzdGVkLlxuIiwgTUFYX05CRCwKLQkJCQluYmRzX21heCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KKwluYmRfZGV2ID0ga2NhbGxvYyhuYmRzX21heCwgc2l6ZW9mKCpuYmRfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuYmRfZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKIAogCWZvciAoaSA9IDA7IGkgPCBuYmRzX21heDsgaSsrKSB7CiAJCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gYWxsb2NfZGlzaygxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svcmQuYyBiL2RyaXZlcnMvYmxvY2svcmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZlMjNiZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2Jsb2NrL3JkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzcgKzAsMCBAQAotLyoKLSAqIHJhbWRpc2suYyAtIE11bHRpcGxlIFJBTSBkaXNrIGRyaXZlciAtIGd6aXAtbG9hZGluZyB2ZXJzaW9uIC0gdi4gMC44IGJldGEuCi0gKgotICogKEMpIENoYWQgUGFnZSwgVGhlb2RvcmUgVHMnbywgZXQuIGFsLCAxOTk1LgotICoKLSAqIFRoaXMgUkFNIGRpc2sgaXMgZGVzaWduZWQgdG8gaGF2ZSBmaWxlc3lzdGVtcyBjcmVhdGVkIG9uIGl0IGFuZCBtb3VudGVkCi0gKiBqdXN0IGxpa2UgYSByZWd1bGFyIGZsb3BweSBkaXNrLgotICoKLSAqIEl0IGFsc28gZG9lcyBzb21ldGhpbmcgc3VnZ2VzdGVkIGJ5IExpbnVzOiB1c2UgdGhlIGJ1ZmZlciBjYWNoZSBhcyB0aGUKLSAqIFJBTSBkaXNrIGRhdGEuICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGR5bmFtaWNhbGx5IGFsbG9jYXRlIHRoZSBSQU0gZGlzawotICogYnVmZmVyIC0gd2l0aCBzb21lIGNvbnNlcXVlbmNlcyBJIGhhdmUgdG8gZGVhbCB3aXRoIGFzIEkgd3JpdGUgdGhpcy4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIHJhbWRpc2suYywgd3JpdHRlbiBtb3N0bHkgYnkKLSAqIFRoZW9kb3JlIFRzJ28gKFRZVCkgaW4gMTk5MS4gIFRoZSBjb2RlIHdhcyBsYXJnZWx5IHJld3JpdHRlbiBieQotICogQ2hhZCBQYWdlIHRvIHVzZSB0aGUgYnVmZmVyIGNhY2hlIHRvIHN0b3JlIHRoZSBSQU0gZGlzayBkYXRhIGluCi0gKiAxOTk1OyBUaGVvZG9yZSB0aGVuIHRvb2sgb3ZlciB0aGUgZHJpdmVyIGFnYWluLCBhbmQgY2xlYW5lZCBpdCB1cAotICogZm9yIGluY2x1c2lvbiBpbiB0aGUgbWFpbmxpbmUga2VybmVsLgotICoKLSAqIFRoZSBvcmlnaW5hbCBDUkFNRElTSyBjb2RlIHdhcyB3cml0dGVuIGJ5IFJpY2hhcmQgTHlvbnMsIGFuZAotICogYWRhcHRlZCBieSBDaGFkIFBhZ2UgdG8gdXNlIHRoZSBuZXcgUkFNIGRpc2sgaW50ZXJmYWNlLiAgVGhlb2RvcmUKLSAqIFRzJ28gcmV3cm90ZSBpdCBzbyB0aGF0IGJvdGggdGhlIGNvbXByZXNzZWQgUkFNIGRpc2sgbG9hZGVyIGFuZCB0aGUKLSAqIGtlcm5lbCBkZWNvbXByZXNzb3IgdXNlcyB0aGUgc2FtZSBpbmZsYXRlLmMgY29kZWJhc2UuICBUaGUgUkFNIGRpc2sKLSAqIGxvYWRlciBub3cgYWxzbyBsb2FkcyBpbnRvIGEgZHluYW1pYyAoYnVmZmVyIGNhY2hlIGJhc2VkKSBSQU0gZGlzaywKLSAqIG5vdCB0aGUgb2xkIHN0YXRpYyBSQU0gZGlzay4gIFN1cHBvcnQgZm9yIHRoZSBvbGQgc3RhdGljIFJBTSBkaXNrIGhhcwotICogYmVlbiBjb21wbGV0ZWx5IHJlbW92ZWQuCi0gKgotICogTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQgYWRkZWQgYnkgVG9tIER5YXMuCi0gKgotICogRnVydGhlciBjbGVhbnVwcyBieSBDaGFkIFBhZ2UgKHBhZ2UwNTg4QHN1bmRhbmNlLnNqc3UuZWR1KToKLSAqCUNvc21ldGljIGNoYW5nZXMgaW4gI2lmZGVmIE1PRFVMRSwgY29kZSBtb3ZlbWVudCwgZXRjLgotICogCVdoZW4gdGhlIFJBTSBkaXNrIG1vZHVsZSBpcyByZW1vdmVkLCBmcmVlIHRoZSBwcm90ZWN0ZWQgYnVmZmVycwotICogCURlZmF1bHQgUkFNIGRpc2sgc2l6ZSBjaGFuZ2VkIHRvIDIuODggTUIKLSAqCi0gKiAgQWRkZWQgaW5pdHJkOiBXZXJuZXIgQWxtZXNiZXJnZXIgJiBIYW5zIExlcm1lbiwgRmViICc5NgotICoKLSAqIDQvMjUvOTYgOiBNYWRlIFJBTSBkaXNrIHNpemUgYSBwYXJhbWV0ZXIgKGRlZmF1bHQgaXMgbm93IDQgTUIpCi0gKgkJLSBDaGFkIFBhZ2UKLSAqCi0gKiBBZGQgc3VwcG9ydCBmb3IgZnMgaW1hZ2VzIHNwbGl0IGFjcm9zcyA+MSBkaXNrLCBQYXVsIEdvcnRtYWtlciwgTWFyICc5OAotICoKLSAqIE1ha2UgYmxvY2sgc2l6ZSBhbmQgYmxvY2sgc2l6ZSBzaGlmdCBmb3IgUkFNIGRpc2tzIGEgZ2xvYmFsIG1hY3JvCi0gKiBhbmQgc2V0IGJsa19zaXplIGZvciAtRU5PU1BDLCAgICAgV2VybmVyIEZpbmsgPHdlcm5lckBzdXNlLmRlPiwgQXByICc5OQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgotI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CQkvKiBmb3IgaW52YWxpZGF0ZV9iZGV2KCkgKi8KLSNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgotI2luY2x1ZGUgPGxpbnV4L2Jsa3BnLmg+Ci0jaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbG9nMi5oPgotCi0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQotLyogVmFyaW91cyBzdGF0aWMgdmFyaWFibGVzIGdvIGhlcmUuICBNb3N0IGFyZSB1c2VkIG9ubHkgaW4gdGhlIFJBTSBkaXNrIGNvZGUuCi0gKi8KLQotc3RhdGljIHN0cnVjdCBnZW5kaXNrICpyZF9kaXNrc1tDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlRdOwotc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2UgKnJkX2JkZXZbQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UXTsvKiBQcm90ZWN0ZWQgZGV2aWNlIGRhdGEgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcmRfcXVldWVbQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UXTsKLQotLyoKLSAqIFBhcmFtZXRlcnMgZm9yIHRoZSBib290LWxvYWRpbmcgb2YgdGhlIFJBTSBkaXNrLiAgVGhlc2UgYXJlIHNldCBieQotICogaW5pdC9tYWluLmMgKGZyb20gYXJndW1lbnRzIHRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lKSBvciBmcm9tIHRoZQotICogYXJjaGl0ZWN0dXJlLXNwZWNpZmljIHNldHVwIHJvdXRpbmUgKGZyb20gdGhlIHN0b3JlZCBib290IHNlY3RvcgotICogaW5mb3JtYXRpb24pLgotICovCi1pbnQgcmRfc2l6ZSA9IENPTkZJR19CTEtfREVWX1JBTV9TSVpFOwkJLyogU2l6ZSBvZiB0aGUgUkFNIGRpc2tzICovCi0vKgotICogSXQgd291bGQgYmUgdmVyeSBkZXNpcmFibGUgdG8gaGF2ZSBhIHNvZnQtYmxvY2tzaXplICh0aGF0IGluIHRoZSBjYXNlCi0gKiBvZiB0aGUgcmFtZGlzayBkcml2ZXIgaXMgYWxzbyB0aGUgaGFyZGJsb2Nrc2l6ZSA7KSBvZiBQQUdFX1NJWkUgYmVjYXVzZQotICogZG9pbmcgdGhhdCB3ZSdsbCBhY2hpZXZlIGEgZmFyIGJldHRlciBNTSBmb290cHJpbnQuIFVzaW5nIGEgcmRfYmxvY2tzaXplIG9mCi0gKiBCTE9DS19TSVpFIGluIHRoZSB3b3JzdCBjYXNlIHdlJ2xsIG1ha2UgUEFHRV9TSVpFL0JMT0NLX1NJWkUgYnVmZmVyLXBhZ2VzCi0gKiB1bmZyZWVhYmxlLiBXaXRoIGEgcmRfYmxvY2tzaXplIG9mIFBBR0VfU0laRSBpbnN0ZWFkIHdlIGFyZSBzdXJlIHRoYXQgb25seQotICogMSBwYWdlIHdpbGwgYmUgcHJvdGVjdGVkLiBEZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIHJhbWRpc2sgeW91Ci0gKiBtYXkgd2FudCB0byBjaGFuZ2UgdGhlIHJhbWRpc2sgYmxvY2tzaXplIHRvIGFjaGlldmUgYSBiZXR0ZXIgb3Igd29yc2UgTU0KLSAqIGJlaGF2aW91ci4gVGhlIGRlZmF1bHQgaXMgc3RpbGwgQkxPQ0tfU0laRSAobmVlZGVkIGJ5IHJkX2xvYWRfaW1hZ2UgdGhhdAotICogc3VwcG9zZXMgdGhlIGZpbGVzeXN0ZW0gaW4gdGhlIGltYWdlIHVzZXMgYSBCTE9DS19TSVpFIGJsb2Nrc2l6ZSkuCi0gKi8KLXN0YXRpYyBpbnQgcmRfYmxvY2tzaXplID0gQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRTsKLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCBMaW51cyBUb3J2YWxkcy4KLSAqICAgICAgICAgICAgICAgMjAwMCBUcmFuc21ldGEgQ29ycC4KLSAqIGFvcHMgY29waWVkIGZyb20gcmFtZnMuCi0gKi8KLQotLyoKLSAqIElmIGEgcmFtZGlzayBwYWdlIGhhcyBidWZmZXJzLCBzb21lIG1heSBiZSB1cHRvZGF0ZSBhbmQgc29tZSBtYXkgYmUgbm90LgotICogVG8gYnJpbmcgdGhlIHBhZ2UgdXB0b2RhdGUgd2UgemVybyBvdXQgdGhlIG5vbi11cHRvZGF0ZSBidWZmZXJzLiAgVGhlCi0gKiBwYWdlIG11c3QgYmUgbG9ja2VkLgotICovCi1zdGF0aWMgdm9pZCBtYWtlX3BhZ2VfdXB0b2RhdGUoc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JaWYgKHBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKLQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKLQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkID0gYmg7Ci0KLQkJZG8gewotCQkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKSB7Ci0JCQkJbWVtc2V0KGJoLT5iX2RhdGEsIDAsIGJoLT5iX3NpemUpOwotCQkJCS8qCi0JCQkJICogYWtwbTogSSdtIHRvdGFsbHkgdW5kZWNpZGVkIGFib3V0IHRoaXMuICBUaGUKLQkJCQkgKiBidWZmZXIgaGFzIGp1c3QgYmVlbiBtYWdpY2FsbHkgYnJvdWdodCAidXAgdG8KLQkJCQkgKiBkYXRlIiwgYnV0IG5vYm9keSBzaG91bGQgd2FudCB0byBiZSByZWFkaW5nCi0JCQkJICogaXQgYW55d2F5LCBiZWNhdXNlIGl0IGhhc24ndCBiZWVuIHVzZWQgZm9yCi0JCQkJICogYW55dGhpbmcgeWV0LiAgSXQgaXMgc3RpbGwgaW4gYSAibm90IHJlYWQKLQkJCQkgKiBmcm9tIGRpc2sgeWV0IiBzdGF0ZS4KLQkJCQkgKgotCQkJCSAqIEJ1dCBub24tdXB0b2RhdGUgYnVmZmVycyBhZ2FpbnN0IGFuIHVwdG9kYXRlCi0JCQkJICogcGFnZSBhcmUgYWdhaW5zdCB0aGUgcnVsZXMuICBTbyBkbyBpdCBhbnl3YXkuCi0JCQkJICovCi0JCQkJIHNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwotCQkJfQotCQl9IHdoaWxlICgoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOwotCX0gZWxzZSB7Ci0JCW1lbXNldChwYWdlX2FkZHJlc3MocGFnZSksIDAsIFBBR0VfQ0FDSEVfU0laRSk7Ci0JfQotCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwotCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKLX0KLQotc3RhdGljIGludCByYW1kaXNrX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkKLQkJbWFrZV9wYWdlX3VwdG9kYXRlKHBhZ2UpOwotCXVubG9ja19wYWdlKHBhZ2UpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJhbWRpc2tfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCQkJdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCB0bykKLXsKLQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkKLQkJbWFrZV9wYWdlX3VwdG9kYXRlKHBhZ2UpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJhbWRpc2tfY29tbWl0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJCQl1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIHRvKQotewotCXNldF9wYWdlX2RpcnR5KHBhZ2UpOwotCXJldHVybiAwOwotfQotCi0vKgotICogLT53cml0ZXBhZ2UgdG8gdGhlIGJsb2NrZGV2J3MgbWFwcGluZyBoYXMgdG8gcmVkaXJ0eSB0aGUgcGFnZSBzbyB0aGF0IHRoZQotICogVk0gZG9lc24ndCBnbyBhbmQgc3RlYWwgaXQuICBXZSByZXR1cm4gQU9QX1dSSVRFUEFHRV9BQ1RJVkFURSBzbyB0aGF0IHRoZSBWTQotICogd29uJ3QgdHJ5IHRvIChwb2ludGxlc3NseSkgd3JpdGUgdGhlIHBhZ2UgYWdhaW4gZm9yIGEgd2hpbGUuCi0gKgotICogUmVhbGx5LCB0aGVzZSBwYWdlcyBzaG91bGQgbm90IGJlIG9uIHRoZSBMUlUgYXQgYWxsLgotICovCi1zdGF0aWMgaW50IHJhbWRpc2tfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKLXsKLQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkKLQkJbWFrZV9wYWdlX3VwdG9kYXRlKHBhZ2UpOwotCVNldFBhZ2VEaXJ0eShwYWdlKTsKLQlpZiAod2JjLT5mb3JfcmVjbGFpbSkKLQkJcmV0dXJuIEFPUF9XUklURVBBR0VfQUNUSVZBVEU7Ci0JdW5sb2NrX3BhZ2UocGFnZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBUaGlzIGlzIGEgbGl0dGxlIHNwZWVkdXAgdGhpbmc6IHNob3J0LWNpcmN1aXQgYXR0ZW1wdHMgdG8gd3JpdGUgYmFjayB0aGUKLSAqIHJhbWRpc2sgYmxvY2tkZXYgaW5vZGUgdG8gaXRzIG5vbi1leGlzdGVudCBiYWNraW5nIHN0b3JlLgotICovCi1zdGF0aWMgaW50IHJhbWRpc2tfd3JpdGVwYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKLQkJCQlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKLXsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIHJhbWRpc2sgYmxvY2tkZXYgcGFnZXMgaGF2ZSB0aGVpciBvd24gLT5zZXRfcGFnZV9kaXJ0eSgpIGJlY2F1c2Ugd2UgZG9uJ3QKLSAqIHdhbnQgdGhlbSB0byBjb250cmlidXRlIHRvIGRpcnR5IG1lbW9yeSBhY2NvdW50aW5nLgotICovCi1zdGF0aWMgaW50IHJhbWRpc2tfc2V0X3BhZ2VfZGlydHkoc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JaWYgKCFUZXN0U2V0UGFnZURpcnR5KHBhZ2UpKQotCQlyZXR1cm4gMTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIHJlbGVhc2VwYWdlIGlzIGNhbGxlZCBieSBwYWdldmVjX3N0cmlwL3RyeV90b19yZWxlYXNlX3BhZ2UgaWYKLSAqIGJ1ZmZlcnNfaGVhZHNfb3Zlcl9saW1pdCBpcyB0cnVlLiBXaXRob3V0IGEgcmVsZWFzZXBhZ2UgZnVuY3Rpb24KLSAqIHRyeV90b19mcmVlX2J1ZmZlcnMgaXMgY2FsbGVkIGluc3RlYWQuIFRoYXQgY2FuIHVuc2V0IHRoZSBkaXJ0eQotICogYml0IG9mIG91ciByYW0gZGlzayBwYWdlcywgd2hpY2ggd2lsbCBiZSBldmVudHVhbGx5IGZyZWVkLCBldmVuCi0gKiBpZiB0aGUgcGFnZSBpcyBzdGlsbCBpbiB1c2UuCi0gKi8KLXN0YXRpYyBpbnQgcmFtZGlza19yZWxlYXNlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgZ2ZwX3QgZHVtbXkpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHJhbWRpc2tfYW9wcyA9IHsKLQkucmVhZHBhZ2UJPSByYW1kaXNrX3JlYWRwYWdlLAotCS5wcmVwYXJlX3dyaXRlCT0gcmFtZGlza19wcmVwYXJlX3dyaXRlLAotCS5jb21taXRfd3JpdGUJPSByYW1kaXNrX2NvbW1pdF93cml0ZSwKLQkud3JpdGVwYWdlCT0gcmFtZGlza193cml0ZXBhZ2UsCi0JLnNldF9wYWdlX2RpcnR5CT0gcmFtZGlza19zZXRfcGFnZV9kaXJ0eSwKLQkud3JpdGVwYWdlcwk9IHJhbWRpc2tfd3JpdGVwYWdlcywKLQkucmVsZWFzZXBhZ2UJPSByYW1kaXNrX3JlbGVhc2VwYWdlLAotfTsKLQotc3RhdGljIGludCByZF9ibGtkZXZfcGFnZWNhY2hlX0lPKGludCBydywgc3RydWN0IGJpb192ZWMgKnZlYywgc2VjdG9yX3Qgc2VjdG9yLAotCQkJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKQotewotCXBnb2ZmX3QgaW5kZXggPSBzZWN0b3IgPj4gKFBBR0VfQ0FDSEVfU0hJRlQgLSA5KTsKLQl1bnNpZ25lZCBpbnQgdmVjX29mZnNldCA9IHZlYy0+YnZfb2Zmc2V0OwotCWludCBvZmZzZXQgPSAoc2VjdG9yIDw8IDkpICYgflBBR0VfQ0FDSEVfTUFTSzsKLQlpbnQgc2l6ZSA9IHZlYy0+YnZfbGVuOwotCWludCBlcnIgPSAwOwotCi0JZG8gewotCQlpbnQgY291bnQ7Ci0JCXN0cnVjdCBwYWdlICpwYWdlOwotCQljaGFyICpzcmM7Ci0JCWNoYXIgKmRzdDsKLQotCQljb3VudCA9IFBBR0VfQ0FDSEVfU0laRSAtIG9mZnNldDsKLQkJaWYgKGNvdW50ID4gc2l6ZSkKLQkJCWNvdW50ID0gc2l6ZTsKLQkJc2l6ZSAtPSBjb3VudDsKLQotCQlwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4KTsKLQkJaWYgKCFwYWdlKSB7Ci0JCQllcnIgPSAtRU5PTUVNOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkKLQkJCW1ha2VfcGFnZV91cHRvZGF0ZShwYWdlKTsKLQotCQlpbmRleCsrOwotCi0JCWlmIChydyA9PSBSRUFEKSB7Ci0JCQlzcmMgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCkgKyBvZmZzZXQ7Ci0JCQlkc3QgPSBrbWFwX2F0b21pYyh2ZWMtPmJ2X3BhZ2UsIEtNX1VTRVIxKSArIHZlY19vZmZzZXQ7Ci0JCX0gZWxzZSB7Ci0JCQlzcmMgPSBrbWFwX2F0b21pYyh2ZWMtPmJ2X3BhZ2UsIEtNX1VTRVIwKSArIHZlY19vZmZzZXQ7Ci0JCQlkc3QgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMSkgKyBvZmZzZXQ7Ci0JCX0KLQkJb2Zmc2V0ID0gMDsKLQkJdmVjX29mZnNldCArPSBjb3VudDsKLQotCQltZW1jcHkoZHN0LCBzcmMsIGNvdW50KTsKLQotCQlrdW5tYXBfYXRvbWljKHNyYywgS01fVVNFUjApOwotCQlrdW5tYXBfYXRvbWljKGRzdCwgS01fVVNFUjEpOwotCi0JCWlmIChydyA9PSBSRUFEKQotCQkJZmx1c2hfZGNhY2hlX3BhZ2UodmVjLT5idl9wYWdlKTsKLQkJZWxzZQotCQkJc2V0X3BhZ2VfZGlydHkocGFnZSk7Ci0JCXVubG9ja19wYWdlKHBhZ2UpOwotCQlwdXRfcGFnZShwYWdlKTsKLQl9IHdoaWxlIChzaXplKTsKLQotIG91dDoKLQlyZXR1cm4gZXJyOwotfQotCi0vKgotICogIEJhc2ljYWxseSwgbXkgc3RyYXRlZ3kgaGVyZSBpcyB0byBzZXQgdXAgYSBidWZmZXItaGVhZCB3aGljaCBjYW4ndCBiZQotICogIGRlbGV0ZWQsIGFuZCBtYWtlIHRoYXQgbXkgUmFtZGlzay4gIElmIHRoZSByZXF1ZXN0IGlzIG91dHNpZGUgb2YgdGhlCi0gKiAgYWxsb2NhdGVkIHNpemUsIHdlIG11c3QgZ2V0IHJpZCBvZiBpdC4uLgotICoKLSAqIDE5LUpBTi0xOTk4ICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4gIEFkZGVkIGRldmZzIHN1cHBvcnQKLSAqCi0gKi8KLXN0YXRpYyBpbnQgcmRfbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pCi17Ci0Jc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IGJpby0+YmlfYmRldjsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqIG1hcHBpbmcgPSBiZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nOwotCXNlY3Rvcl90IHNlY3RvciA9IGJpby0+Ymlfc2VjdG9yOwotCXVuc2lnbmVkIGxvbmcgbGVuID0gYmlvLT5iaV9zaXplID4+IDk7Ci0JaW50IHJ3ID0gYmlvX2RhdGFfZGlyKGJpbyk7Ci0Jc3RydWN0IGJpb192ZWMgKmJ2ZWM7Ci0JaW50IHJldCA9IDAsIGk7Ci0KLQlpZiAoc2VjdG9yICsgbGVuID4gZ2V0X2NhcGFjaXR5KGJkZXYtPmJkX2Rpc2spKQotCQlnb3RvIGZhaWw7Ci0KLQlpZiAocnc9PVJFQURBKQotCQlydz1SRUFEOwotCi0JYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpKSB7Ci0JCXJldCB8PSByZF9ibGtkZXZfcGFnZWNhY2hlX0lPKHJ3LCBidmVjLCBzZWN0b3IsIG1hcHBpbmcpOwotCQlzZWN0b3IgKz0gYnZlYy0+YnZfbGVuID4+IDk7Ci0JfQotCWlmIChyZXQpCi0JCWdvdG8gZmFpbDsKLQotCWJpb19lbmRpbyhiaW8sIDApOwotCXJldHVybiAwOwotZmFpbDoKLQliaW9faW9fZXJyb3IoYmlvKTsKLQlyZXR1cm4gMDsKLX0gCi0KLXN0YXRpYyBpbnQgcmRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgZXJyb3I7Ci0Jc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IGlub2RlLT5pX2JkZXY7Ci0KLQlpZiAoY21kICE9IEJMS0ZMU0JVRikKLQkJcmV0dXJuIC1FTk9UVFk7Ci0KLQkvKgotCSAqIHNwZWNpYWw6IHdlIHdhbnQgdG8gcmVsZWFzZSB0aGUgcmFtZGlzayBtZW1vcnksIGl0J3Mgbm90IGxpa2Ugd2l0aAotCSAqIHRoZSBvdGhlciBibG9ja2RldmljZXMgd2hlcmUgdGhpcyBpb2N0bCBvbmx5IGZsdXNoZXMgYXdheSB0aGUgYnVmZmVyCi0JICogY2FjaGUKLQkgKi8KLQllcnJvciA9IC1FQlVTWTsKLQltdXRleF9sb2NrKCZiZGV2LT5iZF9tdXRleCk7Ci0JaWYgKGJkZXYtPmJkX29wZW5lcnMgPD0gMikgewotCQl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhiZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nLCAwKTsKLQkJZXJyb3IgPSAwOwotCX0KLQltdXRleF91bmxvY2soJmJkZXYtPmJkX211dGV4KTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qCi0gKiBUaGlzIGlzIHRoZSBiYWNraW5nX2Rldl9pbmZvIGZvciB0aGUgYmxvY2tkZXYgaW5vZGUgaXRzZWxmLiAgSXQgZG9lc24ndCBuZWVkCi0gKiB3cml0ZWJhY2sgYW5kIGl0IGRvZXMgbm90IGNvbnRyaWJ1dGUgdG8gZGlydHkgbWVtb3J5IGFjY291bnRpbmcuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyByZF9iYWNraW5nX2Rldl9pbmZvID0gewotCS5yYV9wYWdlcwk9IDAsCS8qIE5vIHJlYWRhaGVhZCAqLwotCS5jYXBhYmlsaXRpZXMJPSBCRElfQ0FQX05PX0FDQ1RfRElSVFkgfCBCRElfQ0FQX05PX1dSSVRFQkFDSyB8IEJESV9DQVBfTUFQX0NPUFksCi0JLnVucGx1Z19pb19mbgk9IGRlZmF1bHRfdW5wbHVnX2lvX2ZuLAotfTsKLQotLyoKLSAqIFRoaXMgaXMgdGhlIGJhY2tpbmdfZGV2X2luZm8gZm9yIHRoZSBmaWxlcyB3aGljaCBsaXZlIGF0b3AgdGhlIHJhbWRpc2sKLSAqICJkZXZpY2UiLiAgVGhlc2UgZmlsZXMgZG8gbmVlZCB3cml0ZWJhY2sgYW5kIHRoZXkgZG8gY29udHJpYnV0ZSB0byBkaXJ0eQotICogbWVtb3J5IGFjY291bnRpbmcuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyByZF9maWxlX2JhY2tpbmdfZGV2X2luZm8gPSB7Ci0JLnJhX3BhZ2VzCT0gMCwJLyogTm8gcmVhZGFoZWFkICovCi0JLmNhcGFiaWxpdGllcwk9IEJESV9DQVBfTUFQX0NPUFksCS8qIERvZXMgY29udHJpYnV0ZSB0byBkaXJ0eSBtZW1vcnkgKi8KLQkudW5wbHVnX2lvX2ZuCT0gZGVmYXVsdF91bnBsdWdfaW9fZm4sCi19OwotCi1zdGF0aWMgaW50IHJkX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCi17Ci0JdW5zaWduZWQgdW5pdCA9IGltaW5vcihpbm9kZSk7Ci0KLQlpZiAocmRfYmRldlt1bml0XSA9PSBOVUxMKSB7Ci0JCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBpbm9kZS0+aV9iZGV2OwotCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKLQkJdW5zaWduZWQgYnNpemU7Ci0JCWdmcF90IGdmcF9tYXNrOwotCi0JCWlub2RlID0gaWdyYWIoYmRldi0+YmRfaW5vZGUpOwotCQlyZF9iZGV2W3VuaXRdID0gYmRldjsKLQkJYmRldi0+YmRfb3BlbmVycysrOwotCQlic2l6ZSA9IGJkZXZfaGFyZHNlY3Rfc2l6ZShiZGV2KTsKLQkJYmRldi0+YmRfYmxvY2tfc2l6ZSA9IGJzaXplOwotCQlpbm9kZS0+aV9ibGtiaXRzID0gYmxrc2l6ZV9iaXRzKGJzaXplKTsKLQkJaW5vZGUtPmlfc2l6ZSA9IGdldF9jYXBhY2l0eShiZGV2LT5iZF9kaXNrKTw8OTsKLQotCQltYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKLQkJbWFwcGluZy0+YV9vcHMgPSAmcmFtZGlza19hb3BzOwotCQltYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJnJkX2JhY2tpbmdfZGV2X2luZm87Ci0JCWJkZXYtPmJkX2lub2RlX2JhY2tpbmdfZGV2X2luZm8gPSAmcmRfZmlsZV9iYWNraW5nX2Rldl9pbmZvOwotCi0JCS8qCi0JCSAqIERlZXAgYmFkbmVzcy4gIHJkX2Jsa2Rldl9wYWdlY2FjaGVfSU8oKSBuZWVkcyB0byBhbGxvY2F0ZQotCQkgKiBwYWdlY2FjaGUgcGFnZXMgd2l0aGluIGEgcmVxdWVzdF9mbi4gIFdlIGNhbm5vdCByZWN1ciBiYWNrCi0JCSAqIGludG8gdGhlIGZpbGVzeXN0ZW0gd2hpY2ggaXMgbW91bnRlZCBhdG9wIHRoZSByYW1kaXNrLCBiZWNhdXNlCi0JCSAqIHRoYXQgd291bGQgZGVhZGxvY2sgb24gZnMgbG9ja3MuICBBbmQgd2UgcmVhbGx5IGRvbid0IHdhbnQKLQkJICogdG8gcmVlbnRlciByZF9ibGtkZXZfcGFnZWNhY2hlX0lPIHdoZW4gd2UncmUgYWxyZWFkeSB3aXRoaW4KLQkJICogdGhhdCBmdW5jdGlvbi4KLQkJICoKLQkJICogU28gd2UgdHVybiBvZmYgX19HRlBfRlMgYW5kIF9fR0ZQX0lPLgotCQkgKgotCQkgKiBBbmQgdG8gZ2l2ZSB0aGlzIHRoaW5nIGEgaG9wZSBvZiB3b3JraW5nLCB0dXJuIG9uIF9fR0ZQX0hJR0guCi0JCSAqIEhvcGVmdWxseSwgdGhlcmUncyBlbm91Z2ggcmVndWxhciBtZW1vcnkgYWxsb2NhdGlvbiBnb2luZyBvbgotCQkgKiBmb3IgdGhlIHBhZ2UgYWxsb2NhdG9yIGVtZXJnZW5jeSBwb29scyB0byBrZWVwIHRoZSByYW1kaXNrCi0JCSAqIGRyaXZlciBoYXBweS4KLQkJICovCi0JCWdmcF9tYXNrID0gbWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKTsKLQkJZ2ZwX21hc2sgJj0gfihfX0dGUF9GU3xfX0dGUF9JTyk7Ci0JCWdmcF9tYXNrIHw9IF9fR0ZQX0hJR0g7Ci0JCW1hcHBpbmdfc2V0X2dmcF9tYXNrKG1hcHBpbmcsIGdmcF9tYXNrKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyByZF9iZF9vcCA9IHsKLQkub3duZXIgPQlUSElTX01PRFVMRSwKLQkub3BlbiA9CQlyZF9vcGVuLAotCS5pb2N0bCA9CXJkX2lvY3RsLAotfTsKLQotLyoKLSAqIEJlZm9yZSBmcmVlaW5nIHRoZSBtb2R1bGUsIGludmFsaWRhdGUgYWxsIG9mIHRoZSBwcm90ZWN0ZWQgYnVmZmVycyEKLSAqLwotc3RhdGljIHZvaWQgX19leGl0IHJkX2NsZWFudXAodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ7IGkrKykgewotCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gcmRfYmRldltpXTsKLQkJcmRfYmRldltpXSA9IE5VTEw7Ci0JCWlmIChiZGV2KSB7Ci0JCQlpbnZhbGlkYXRlX2JkZXYoYmRldik7Ci0JCQlibGtkZXZfcHV0KGJkZXYpOwotCQl9Ci0JCWRlbF9nZW5kaXNrKHJkX2Rpc2tzW2ldKTsKLQkJcHV0X2Rpc2socmRfZGlza3NbaV0pOwotCQlibGtfY2xlYW51cF9xdWV1ZShyZF9xdWV1ZVtpXSk7Ci0JfQotCXVucmVnaXN0ZXJfYmxrZGV2KFJBTURJU0tfTUFKT1IsICJyYW1kaXNrIik7Ci0KLQliZGlfZGVzdHJveSgmcmRfZmlsZV9iYWNraW5nX2Rldl9pbmZvKTsKLQliZGlfZGVzdHJveSgmcmRfYmFja2luZ19kZXZfaW5mbyk7Ci19Ci0KLS8qCi0gKiBUaGlzIGlzIHRoZSByZWdpc3RyYXRpb24gYW5kIGluaXRpYWxpemF0aW9uIHNlY3Rpb24gb2YgdGhlIFJBTSBkaXNrIGRyaXZlcgotICovCi1zdGF0aWMgaW50IF9faW5pdCByZF9pbml0KHZvaWQpCi17Ci0JaW50IGk7Ci0JaW50IGVycjsKLQotCWVyciA9IGJkaV9pbml0KCZyZF9iYWNraW5nX2Rldl9pbmZvKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDI7Ci0KLQllcnIgPSBiZGlfaW5pdCgmcmRfZmlsZV9iYWNraW5nX2Rldl9pbmZvKTsKLQlpZiAoZXJyKSB7Ci0JCWJkaV9kZXN0cm95KCZyZF9iYWNraW5nX2Rldl9pbmZvKTsKLQkJZ290byBvdXQyOwotCX0KLQotCWVyciA9IC1FTk9NRU07Ci0KLQlpZiAocmRfYmxvY2tzaXplID4gUEFHRV9TSVpFIHx8IHJkX2Jsb2Nrc2l6ZSA8IDUxMiB8fAotCQkJIWlzX3Bvd2VyX29mXzIocmRfYmxvY2tzaXplKSkgewotCQlwcmludGsoIlJBTURJU0s6IHdyb25nIGJsb2Nrc2l6ZSAlZCwgcmV2ZXJ0aW5nIHRvIGRlZmF1bHRzXG4iLAotCQkgICAgICAgcmRfYmxvY2tzaXplKTsKLQkJcmRfYmxvY2tzaXplID0gQkxPQ0tfU0laRTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UOyBpKyspIHsKLQkJcmRfZGlza3NbaV0gPSBhbGxvY19kaXNrKDEpOwotCQlpZiAoIXJkX2Rpc2tzW2ldKQotCQkJZ290byBvdXQ7Ci0KLQkJcmRfcXVldWVbaV0gPSBibGtfYWxsb2NfcXVldWUoR0ZQX0tFUk5FTCk7Ci0JCWlmICghcmRfcXVldWVbaV0pIHsKLQkJCXB1dF9kaXNrKHJkX2Rpc2tzW2ldKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCi0JaWYgKHJlZ2lzdGVyX2Jsa2RldihSQU1ESVNLX01BSk9SLCAicmFtZGlzayIpKSB7Ci0JCWVyciA9IC1FSU87Ci0JCWdvdG8gb3V0OwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ7IGkrKykgewotCQlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IHJkX2Rpc2tzW2ldOwotCi0JCWJsa19xdWV1ZV9tYWtlX3JlcXVlc3QocmRfcXVldWVbaV0sICZyZF9tYWtlX3JlcXVlc3QpOwotCQlibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZShyZF9xdWV1ZVtpXSwgcmRfYmxvY2tzaXplKTsKLQotCQkvKiByZF9zaXplIGlzIGdpdmVuIGluIGtCICovCi0JCWRpc2stPm1ham9yID0gUkFNRElTS19NQUpPUjsKLQkJZGlzay0+Zmlyc3RfbWlub3IgPSBpOwotCQlkaXNrLT5mb3BzID0gJnJkX2JkX29wOwotCQlkaXNrLT5xdWV1ZSA9IHJkX3F1ZXVlW2ldOwotCQlkaXNrLT5mbGFncyB8PSBHRU5IRF9GTF9TVVBQUkVTU19QQVJUSVRJT05fSU5GTzsKLQkJc3ByaW50ZihkaXNrLT5kaXNrX25hbWUsICJyYW0lZCIsIGkpOwotCQlzZXRfY2FwYWNpdHkoZGlzaywgcmRfc2l6ZSAqIDIpOwotCQlhZGRfZGlzayhyZF9kaXNrc1tpXSk7Ci0JfQotCi0JLyogcmRfc2l6ZSBpcyBnaXZlbiBpbiBrQiAqLwotCXByaW50aygiUkFNRElTSyBkcml2ZXIgaW5pdGlhbGl6ZWQ6ICIKLQkJIiVkIFJBTSBkaXNrcyBvZiAlZEsgc2l6ZSAlZCBibG9ja3NpemVcbiIsCi0JCUNPTkZJR19CTEtfREVWX1JBTV9DT1VOVCwgcmRfc2l6ZSwgcmRfYmxvY2tzaXplKTsKLQotCXJldHVybiAwOwotb3V0OgotCXdoaWxlIChpLS0pIHsKLQkJcHV0X2Rpc2socmRfZGlza3NbaV0pOwotCQlibGtfY2xlYW51cF9xdWV1ZShyZF9xdWV1ZVtpXSk7Ci0JfQotCWJkaV9kZXN0cm95KCZyZF9iYWNraW5nX2Rldl9pbmZvKTsKLQliZGlfZGVzdHJveSgmcmRfZmlsZV9iYWNraW5nX2Rldl9pbmZvKTsKLW91dDI6Ci0JcmV0dXJuIGVycjsKLX0KLQotbW9kdWxlX2luaXQocmRfaW5pdCk7Ci1tb2R1bGVfZXhpdChyZF9jbGVhbnVwKTsKLQotLyogb3B0aW9ucyAtIG5vbm1vZHVsYXIgKi8KLSNpZm5kZWYgTU9EVUxFCi1zdGF0aWMgaW50IF9faW5pdCByYW1kaXNrX3NpemUoY2hhciAqc3RyKQotewotCXJkX3NpemUgPSBzaW1wbGVfc3RydG9sKHN0cixOVUxMLDApOwotCXJldHVybiAxOwotfQotc3RhdGljIGludCBfX2luaXQgcmFtZGlza19ibG9ja3NpemUoY2hhciAqc3RyKQotewotCXJkX2Jsb2Nrc2l6ZSA9IHNpbXBsZV9zdHJ0b2woc3RyLE5VTEwsMCk7Ci0JcmV0dXJuIDE7Ci19Ci1fX3NldHVwKCJyYW1kaXNrX3NpemU9IiwgcmFtZGlza19zaXplKTsKLV9fc2V0dXAoInJhbWRpc2tfYmxvY2tzaXplPSIsIHJhbWRpc2tfYmxvY2tzaXplKTsKLSNlbmRpZgotCi0vKiBvcHRpb25zIC0gbW9kdWxhciAqLwotbW9kdWxlX3BhcmFtKHJkX3NpemUsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHJkX3NpemUsICJTaXplIG9mIGVhY2ggUkFNIGRpc2sgaW4ga2J5dGVzLiIpOwotbW9kdWxlX3BhcmFtKHJkX2Jsb2Nrc2l6ZSwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MocmRfYmxvY2tzaXplLCAiQmxvY2tzaXplIG9mIGVhY2ggUkFNIGRpc2sgaW4gYnl0ZXMuIik7Ci1NT0RVTEVfQUxJQVNfQkxPQ0tERVZfTUFKT1IoUkFNRElTS19NQUpPUik7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svdWIuYyBiL2RyaXZlcnMvYmxvY2svdWIuYwppbmRleCBhNzBjMWMyLi5jNDUyZTJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3ViLmMKKysrIGIvZHJpdmVycy9ibG9jay91Yi5jCkBAIC02NTcsNyArNjU3LDYgQEAKIAlpZiAoKGNtZCA9IHViX2dldF9jbWQobHVuKSkgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwogCW1lbXNldChjbWQsIDAsIHNpemVvZihzdHJ1Y3QgdWJfc2NzaV9jbWQpKTsKLQlzZ19pbml0X3RhYmxlKGNtZC0+c2d2LCBVQl9NQVhfUkVRX1NHKTsKIAogCWJsa2Rldl9kZXF1ZXVlX3JlcXVlc3QocnEpOwogCkBAIC02NjgsNiArNjY3LDcgQEAKIAkvKgogCSAqIGdldCBzY2F0dGVybGlzdCBmcm9tIGJsb2NrIGxheWVyCiAJICovCisJc2dfaW5pdF90YWJsZSgmdXJxLT5zZ3ZbMF0sIFVCX01BWF9SRVFfU0cpOwogCW5fZWxlbSA9IGJsa19ycV9tYXBfc2cobHVuLT5kaXNrLT5xdWV1ZSwgcnEsICZ1cnEtPnNndlswXSk7CiAJaWYgKG5fZWxlbSA8IDApIHsKIAkJLyogSW1wb3NzaWJsZSwgYmVjYXVzZSBibGtfcnFfbWFwX3NnIHNob3VsZCBub3QgaGl0IEVOT01FTS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sveHN5c2FjZS5jIGIvZHJpdmVycy9ibG9jay94c3lzYWNlLmMKaW5kZXggNzhlYmZmZi4uNGE3YTA1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay94c3lzYWNlLmMKKysrIGIvZHJpdmVycy9ibG9jay94c3lzYWNlLmMKQEAgLTEyMDIsOCArMTIwMiwxMCBAQAogfQogCiAvKiBNYXRjaCB0YWJsZSBmb3Igb2ZfcGxhdGZvcm0gYmluZGluZyAqLwotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgX19kZXZpbml0IGFjZV9vZl9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAieGlsaW54LHhzeXNhY2UiLCB9LAorc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgYWNlX29mX21hdGNoW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInhsbngsb3BiLXN5c2FjZS0xLjAwLmIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAieGxueCxvcGItc3lzYWNlLTEuMDAuYyIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ4bG54LHhwcy1zeXNhY2UtMS4wMC5hIiwgfSwKIAl7fSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBhY2Vfb2ZfbWF0Y2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jZHJvbS92aW9jZC5jIGIvZHJpdmVycy9jZHJvbS92aW9jZC5jCmluZGV4IDg0NzNiOWYuLmNhYzA2YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2Ryb20vdmlvY2QuYworKysgYi9kcml2ZXJzL2Nkcm9tL3Zpb2NkLmMKQEAgLTU1OCw3ICs1NTgsNyBAQAogCS5jYXBhYmlsaXR5ID0gQ0RDX0NMT1NFX1RSQVkgfCBDRENfT1BFTl9UUkFZIHwgQ0RDX0xPQ0sgfCBDRENfU0VMRUNUX1NQRUVEIHwgQ0RDX1NFTEVDVF9ESVNDIHwgQ0RDX01VTFRJX1NFU1NJT04gfCBDRENfTUNOIHwgQ0RDX01FRElBX0NIQU5HRUQgfCBDRENfUExBWV9BVURJTyB8IENEQ19SRVNFVCB8IENEQ19EUklWRV9TVEFUVVMgfCBDRENfR0VORVJJQ19QQUNLRVQgfCBDRENfQ0RfUiB8IENEQ19DRF9SVyB8IENEQ19EVkQgfCBDRENfRFZEX1IgfCBDRENfRFZEX1JBTSB8IENEQ19SQU0KIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IGZpbmRfY2FwYWJpbGl0eShjb25zdCBjaGFyICp0eXBlKQorc3RhdGljIGludCBmaW5kX2NhcGFiaWxpdHkoY29uc3QgY2hhciAqdHlwZSkKIHsKIAlzdHJ1Y3QgY2FwYWJpbGl0eV9lbnRyeSAqZW50cnk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9LY29uZmlnIGIvZHJpdmVycy9jaGFyL0tjb25maWcKaW5kZXggODViZjliMi4uZjAxYWM5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL0tjb25maWcKQEAgLTE5NCwxNyArMTk0LDYgQEAKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtb3hhLgogCiBjb25maWcgTU9YQV9TTUFSVElPCi0JdHJpc3RhdGUgIk1veGEgU21hcnRJTyBzdXBwb3J0IChPQlNPTEVURSkiCi0JZGVwZW5kcyBvbiBTRVJJQUxfTk9OU1RBTkRBUkQKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgTW94YSBTbWFydElPIG11bHRpcG9ydCBzZXJpYWwgY2FyZC4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUgKCA9IGNvZGUgd2hpY2ggY2FuIGJlCi0JICBpbnNlcnRlZCBpbiBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBydW5uaW5nIGtlcm5lbCB3aGVuZXZlciB5b3Ugd2FudCkuCi0JICBUaGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG14c2VyLiBJZiB5b3Ugd2FudCB0byBkbyB0aGF0LCBzYXkgTQotCSAgaGVyZS4KLQotY29uZmlnIE1PWEFfU01BUlRJT19ORVcKIAl0cmlzdGF0ZSAiTW94YSBTbWFydElPIHN1cHBvcnQgdi4gMi4wIgogCWRlcGVuZHMgb24gU0VSSUFMX05PTlNUQU5EQVJEICYmIChQQ0kgfHwgRUlTQSB8fCBJU0EpCiAJaGVscApAQCAtMjE1LDcgKzIwNCw3IEBACiAJICBjaGFuZ2VzIGZpbmFsbHkgcmVzdWx0aW5nIGluIFBDSSBwcm9iaW5nLgogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAotCSAgbXhzZXJfbmV3LiBJZiB5b3Ugd2FudCB0byBkbyB0aGF0LCBzYXkgTSBoZXJlLgorCSAgbXhzZXIuIElmIHlvdSB3YW50IHRvIGRvIHRoYXQsIHNheSBNIGhlcmUuCiAKIGNvbmZpZyBJU0kKIAl0cmlzdGF0ZSAiTXVsdGktVGVjaCBtdWx0aXBvcnQgY2FyZCBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgpAQCAtODQxLDYgKzgzMCwxNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZHRsay4KIAorY29uZmlnIFhJTElOWF9IV0lDQVAKKwl0cmlzdGF0ZSAiWGlsaW54IEhXSUNBUCBTdXBwb3J0IgorCWRlcGVuZHMgb24gWElMSU5YX1ZJUlRFWAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgWGlsaW54IEludGVybmFsIENvbmZpZ3VyYXRpb24KKwkgIEFjY2VzcyBQb3J0IChJQ0FQKSBkcml2ZXIuICBUaGUgSUNBUCBpcyB1c2VkIG9uIFhpbGlueCBWaXJ0ZXgKKwkgIEZQR0EgcGxhdGZvcm1zIHRvIHBhcnRpYWxseSByZWNvbmZpZ3VyZSB0aGUgRlBHQSBhdCBydW50aW1lLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgUjM5NjQKIAl0cmlzdGF0ZSAiU2llbWVucyBSMzk2NCBsaW5lIGRpc2NpcGxpbmUiCiAJLS0taGVscC0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL01ha2VmaWxlCmluZGV4IDk2ZmMwMWUuLjU0MDdiNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKQEAgLTMzLDcgKzMzLDYgQEAKIG9iai0kKENPTkZJR19BMjIzMikJCSs9IHNlcl9hMjIzMi5vIGdlbmVyaWNfc2VyaWFsLm8KIG9iai0kKENPTkZJR19BVEFSSV9EU1A1NkspCSs9IGRzcDU2ay5vCiBvYmotJChDT05GSUdfTU9YQV9TTUFSVElPKQkrPSBteHNlci5vCi1vYmotJChDT05GSUdfTU9YQV9TTUFSVElPX05FVykJKz0gbXhzZXJfbmV3Lm8KIG9iai0kKENPTkZJR19DT01QVVRPTkUpCQkrPSBpcDIvCiBvYmotJChDT05GSUdfUklTQ09NOCkJCSs9IHJpc2NvbTgubwogb2JqLSQoQ09ORklHX0lTSSkJCSs9IGlzaWNvbS5vCkBAIC03Nyw2ICs3Niw3IEBACiBvYmotJChDT05GSUdfU0dJX0RTMTI4NikJKz0gZHMxMjg2Lm8KIG9iai0kKENPTkZJR19TR0lfSVAyN19SVEMpCSs9IGlwMjctcnRjLm8KIG9iai0kKENPTkZJR19EUzEzMDIpCQkrPSBkczEzMDIubworb2JqLSQoQ09ORklHX1hJTElOWF9IV0lDQVApCSs9IHhpbGlueF9od2ljYXAvCiBpZmVxICgkKENPTkZJR19HRU5FUklDX05WUkFNKSx5KQogICBvYmotJChDT05GSUdfTlZSQU0pCSs9IGdlbmVyaWNfbnZyYW0ubwogZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FwcGxpY29tLmMgYi9kcml2ZXJzL2NoYXIvYXBwbGljb20uYwppbmRleCAxZjBiNzUyLi5hN2M0OTkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYXBwbGljb20uYworKysgYi9kcml2ZXJzL2NoYXIvYXBwbGljb20uYwpAQCAtNTcsNyArNTcsNiBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FQUExJQ09NX1BDSTIwMDBJQlNfQ0FOIDB4MDAwMgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FQUExJQ09NX1BDSTIwMDBQRkIgICAgIDB4MDAwMwogI2VuZGlmCi0jZGVmaW5lIE1BWF9QQ0lfREVWSUNFX05VTSAzCiAKIHN0YXRpYyBjaGFyICphcHBsaWNvbV9wY2lfZGV2bmFtZXNbXSA9IHsKIAkiUENJIGJvYXJkIiwKQEAgLTY2LDEyICs2NSw5IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYXBwbGljb21fcGNpX3RibFtdID0gewotCXsgUENJX1ZFTkRPUl9JRF9BUFBMSUNPTSwgUENJX0RFVklDRV9JRF9BUFBMSUNPTV9QQ0lHRU5FUklDLAotCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAotCXsgUENJX1ZFTkRPUl9JRF9BUFBMSUNPTSwgUENJX0RFVklDRV9JRF9BUFBMSUNPTV9QQ0kyMDAwSUJTX0NBTiwKLQkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKLQl7IFBDSV9WRU5ET1JfSURfQVBQTElDT00sIFBDSV9ERVZJQ0VfSURfQVBQTElDT01fUENJMjAwMFBGQiwKLQkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFBDSV9WREVWSUNFKEFQUExJQ09NLCBQQ0lfREVWSUNFX0lEX0FQUExJQ09NX1BDSUdFTkVSSUMpIH0sCisJeyBQQ0lfVkRFVklDRShBUFBMSUNPTSwgUENJX0RFVklDRV9JRF9BUFBMSUNPTV9QQ0kyMDAwSUJTX0NBTikgfSwKKwl7IFBDSV9WREVWSUNFKEFQUExJQ09NLCBQQ0lfREVWSUNFX0lEX0FQUExJQ09NX1BDSTIwMDBQRkIpIH0sCiAJeyAwIH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYXBwbGljb21fcGNpX3RibCk7CkBAIC0xOTcsMzEgKzE5MywyOSBAQAogCiAJd2hpbGUgKCAoZGV2ID0gcGNpX2dldF9jbGFzcyhQQ0lfQ0xBU1NfT1RIRVJTIDw8IDE2LCBkZXYpKSkgewogCi0JCWlmIChkZXYtPnZlbmRvciAhPSBQQ0lfVkVORE9SX0lEX0FQUExJQ09NKQotCQkJY29udGludWU7Ci0JCQotCQlpZiAoZGV2LT5kZXZpY2UgID4gTUFYX1BDSV9ERVZJQ0VfTlVNIHx8IGRldi0+ZGV2aWNlID09IDApCisJCWlmICghcGNpX21hdGNoX2lkKGFwcGxpY29tX3BjaV90YmwsIGRldikpCiAJCQljb250aW51ZTsKIAkJCiAJCWlmIChwY2lfZW5hYmxlX2RldmljZShkZXYpKQogCQkJcmV0dXJuIC1FSU87CiAKLQkJUmFtSU8gPSBpb3JlbWFwKGRldi0+cmVzb3VyY2VbMF0uc3RhcnQsIExFTl9SQU1fSU8pOworCQlSYW1JTyA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCksIExFTl9SQU1fSU8pOwogCiAJCWlmICghUmFtSU8pIHsKIAkJCXByaW50ayhLRVJOX0lORk8gImFjLm86IEZhaWxlZCB0byBpb3JlbWFwIFBDSSBtZW1vcnkgIgogCQkJCSJzcGFjZSBhdCAweCVsbHhcbiIsCi0JCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylkZXYtPnJlc291cmNlWzBdLnN0YXJ0KTsKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApKTsKIAkJCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAogCQlwcmludGsoS0VSTl9JTkZPICJBcHBsaWNvbSAlcyBmb3VuZCBhdCBtZW0gMHglbGx4LCBpcnEgJWRcbiIsCiAJCSAgICAgICBhcHBsaWNvbV9wY2lfZGV2bmFtZXNbZGV2LT5kZXZpY2UtMV0sCi0JCQkgICAodW5zaWduZWQgbG9uZyBsb25nKWRldi0+cmVzb3VyY2VbMF0uc3RhcnQsCisJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApLAogCQkgICAgICAgZGV2LT5pcnEpOwogCi0JCWJvYXJkbm8gPSBhY19yZWdpc3Rlcl9ib2FyZChkZXYtPnJlc291cmNlWzBdLnN0YXJ0LCBSYW1JTywwKTsKKwkJYm9hcmRubyA9IGFjX3JlZ2lzdGVyX2JvYXJkKHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIDApLAorCQkJCVJhbUlPLCAwKTsKIAkJaWYgKCFib2FyZG5vKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPICJhYy5vOiBQQ0kgQXBwbGljb20gZGV2aWNlIGRvZXNuJ3QgaGF2ZSBjb3JyZWN0IHNpZ25hdHVyZS5cbiIpOwogCQkJaW91bm1hcChSYW1JTyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvZHJtL0tjb25maWcKaW5kZXggYmEzMDU4ZC4uNjEwZDZmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vS2NvbmZpZwpAQCAtMzgsNyArMzgsNyBAQAogCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGFuIEFUSSBSYWRlb24gZ3JhcGhpY3MgY2FyZC4gIFRoZXJlCiAJICBhcmUgYm90aCBQQ0kgYW5kIEFHUCB2ZXJzaW9ucy4gIFlvdSBkb24ndCBuZWVkIHRvIGNob29zZSB0aGlzIHRvCiAJICBydW4gdGhlIFJhZGVvbiBpbiBwbGFpbiBWR0EgbW9kZS4KLQkgIAorCiAJICBJZiBNIGlzIHNlbGVjdGVkLCB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHJhZGVvbi4KIAogY29uZmlnIERSTV9JODEwCkBAIC03MSw5ICs3MSw5IEBACiAJICA4NTJHTSwgODU1R00gODY1RyBvciA5MTVHIGludGVncmF0ZWQgZ3JhcGhpY3MuICBJZiBNIGlzIHNlbGVjdGVkLCB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpOTE1LiAgQUdQIHN1cHBvcnQgaXMgcmVxdWlyZWQgZm9yIHRoaXMgZHJpdmVyCiAJICB0byB3b3JrLiBUaGlzIGRyaXZlciBpcyB1c2VkIGJ5IHRoZSBJbnRlbCBkcml2ZXIgaW4gWC5vcmcgNi44IGFuZAotCSAgWEZyZWU4NiA0LjQgYW5kIGFib3ZlLiBJZiB1bnN1cmUsIGJ1aWxkIHRoaXMgYW5kIGk4MzAgYXMgbW9kdWxlcyBhbmQgCisJICBYRnJlZTg2IDQuNCBhbmQgYWJvdmUuIElmIHVuc3VyZSwgYnVpbGQgdGhpcyBhbmQgaTgzMCBhcyBtb2R1bGVzIGFuZAogCSAgdGhlIFggc2VydmVyIHdpbGwgbG9hZCB0aGUgY29ycmVjdCBvbmUuCi0JCisKIGVuZGNob2ljZQogCiBjb25maWcgRFJNX01HQQpAQCAtODgsNyArODgsNyBAQAogCXRyaXN0YXRlICJTaVMgdmlkZW8gY2FyZHMiCiAJZGVwZW5kcyBvbiBEUk0gJiYgQUdQCiAJaGVscAotCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgU2lTIDYzMCBvciBjb21wYXRpYmxlIHZpZGVvIAorCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgU2lTIDYzMCBvciBjb21wYXRpYmxlIHZpZGVvCiAgICAgICAgICAgY2hpcHNldC4gSWYgTSBpcyBzZWxlY3RlZCB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNpcy4gQUdQCiAgICAgICAgICAgc3VwcG9ydCBpcyByZXF1aXJlZCBmb3IgdGhpcyBkcml2ZXIgdG8gd29yay4KIApAQCAtMTA1LDQgKzEwNSwzIEBACiAJaGVscAogCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgU2F2YWdlM0QvNC9TdXBlclNhdmFnZS9Qcm8vVHdpc3RlcgogCSAgY2hpcHNldC4gSWYgTSBpcyBzZWxlY3RlZCB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNhdmFnZS4KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9kcm0vTWFrZWZpbGUKaW5kZXggNjkxNWEwNS4uMTI4M2RlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2NoYXIvZHJtL01ha2VmaWxlCkBAIC0zOCw1ICszOCwzIEBACiBvYmotJChDT05GSUdfRFJNX1NJUykgICArPSBzaXMubwogb2JqLSQoQ09ORklHX0RSTV9TQVZBR0UpKz0gc2F2YWdlLm8KIG9iai0kKENPTkZJR19EUk1fVklBKQkrPXZpYS5vCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9SRUFETUUuZHJtIGIvZHJpdmVycy9jaGFyL2RybS9SRUFETUUuZHJtCmluZGV4IGFmNzRjZDcuLmI1YjMzMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vUkVBRE1FLmRybQorKysgYi9kcml2ZXJzL2NoYXIvZHJtL1JFQURNRS5kcm0KQEAgLTQxLDQgKzQxLDMgQEAKIAogICAgIEEgU2VjdXJpdHkgQW5hbHlzaXMgb2YgdGhlIERpcmVjdCBSZW5kZXJpbmcgSW5mcmFzdHJ1Y3R1cmUKICAgICBodHRwOi8vZHJpLnNvdXJjZWZvcmdlLm5ldC9kb2Mvc2VjdXJpdHlfbG93X2xldmVsLmh0bWwKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9hdGlfcGNpZ2FydC5jIGIvZHJpdmVycy9jaGFyL2RybS9hdGlfcGNpZ2FydC5jCmluZGV4IDMzNDU2NDEuLmQzNTJkYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vYXRpX3BjaWdhcnQuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2F0aV9wY2lnYXJ0LmMKQEAgLTQxLDcgKzQxLDcgQEAKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlpbnQgaTsKIAotCURSTV9ERUJVRygiJXM6IGFsbG9jICVkIG9yZGVyXG4iLCBfX0ZVTkNUSU9OX18sIG9yZGVyKTsKKwlEUk1fREVCVUcoIiVkIG9yZGVyXG4iLCBvcmRlcik7CiAKIAlhZGRyZXNzID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMIHwgX19HRlBfQ09NUCwKIAkJCQkgICBvcmRlcik7CkBAIC01NCw3ICs1NCw3IEBACiAJZm9yIChpID0gMDsgaSA8IG9yZGVyOyBpKyssIHBhZ2UrKykKIAkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOwogCi0JRFJNX0RFQlVHKCIlczogcmV0dXJuaW5nIDB4JTA4bHhcbiIsIF9fRlVOQ1RJT05fXywgYWRkcmVzcyk7CisJRFJNX0RFQlVHKCJyZXR1cm5pbmcgMHglMDhseFxuIiwgYWRkcmVzcyk7CiAJcmV0dXJuICh2b2lkICopYWRkcmVzczsKIH0KIApAQCAtNjMsNyArNjMsNyBAQAogCXN0cnVjdCBwYWdlICpwYWdlOwogCWludCBpOwogCWludCBudW1fcGFnZXMgPSAxIDw8IG9yZGVyOwotCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJRFJNX0RFQlVHKCJcbiIpOwogCiAJcGFnZSA9IHZpcnRfdG9fcGFnZSgodW5zaWduZWQgbG9uZylhZGRyZXNzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vZHJtLmgKaW5kZXggODJmYjNkMC4uM2EwNWM2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm0uaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybS5oCkBAIC0yMDIsNyArMjAyLDggQEAKIAlfRFJNX0tFUk5FTCA9IDB4MDgsCSAgICAgLyoqPCBrZXJuZWwgcmVxdWlyZXMgYWNjZXNzICovCiAJX0RSTV9XUklURV9DT01CSU5JTkcgPSAweDEwLCAvKio8IHVzZSB3cml0ZS1jb21iaW5pbmcgaWYgYXZhaWxhYmxlICovCiAJX0RSTV9DT05UQUlOU19MT0NLID0gMHgyMCwgICAvKio8IFNITSBwYWdlIHRoYXQgY29udGFpbnMgbG9jayAqLwotCV9EUk1fUkVNT1ZBQkxFID0gMHg0MAkgICAgIC8qKjwgUmVtb3ZhYmxlIG1hcHBpbmcgKi8KKwlfRFJNX1JFTU9WQUJMRSA9IDB4NDAsCSAgICAgLyoqPCBSZW1vdmFibGUgbWFwcGluZyAqLworCV9EUk1fRFJJVkVSID0gMHg4MAkgICAgIC8qKjwgTWFuYWdlZCBieSBkcml2ZXIgKi8KIH07CiAKIHN0cnVjdCBkcm1fY3R4X3ByaXZfbWFwIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtUC5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1QLmgKaW5kZXggZGRlMDJhMS4uMTlkM2JlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1QLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1QLmgKQEAgLTI5Miw3ICsyOTIsNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKIAlzdHJ1Y3QgZHJtX2hhc2hfaXRlbSBoYXNoX2l0ZW07CiAJc3RydWN0IGRybV9maWxlICpwcml2OwotCXN0cnVjdCBkcm1fbWFnaWNfZW50cnkgKm5leHQ7CiB9OwogCiBzdHJ1Y3QgZHJtX3ZtYV9lbnRyeSB7CkBAIC0zODgsOCArMzg3LDggQEAKIAlzdHJ1Y3QgZHJtX2hlYWQgKmhlYWQ7CiAJaW50IHJlbW92ZV9hdXRoX29uX2Nsb3NlOwogCXVuc2lnbmVkIGxvbmcgbG9ja19jb3VudDsKLQl2b2lkICpkcml2ZXJfcHJpdjsKIAlzdHJ1Y3QgZmlsZSAqZmlscDsKKwl2b2lkICpkcml2ZXJfcHJpdjsKIH07CiAKIC8qKiBXYWl0IHF1ZXVlICovCkBAIC00MDEsMTEgKzQwMCw5IEBACiAJd2FpdF9xdWV1ZV9oZWFkX3QgcmVhZF9xdWV1ZTsJLyoqPCBQcm9jZXNzZXMgd2FpdGluZyBvbiBibG9ja19yZWFkICovCiAJYXRvbWljX3QgYmxvY2tfd3JpdGU7CQkvKio8IFF1ZXVlIGJsb2NrZWQgZm9yIHdyaXRlcyAqLwogCXdhaXRfcXVldWVfaGVhZF90IHdyaXRlX3F1ZXVlOwkvKio8IFByb2Nlc3NlcyB3YWl0aW5nIG9uIGJsb2NrX3dyaXRlICovCi0jaWYgMQogCWF0b21pY190IHRvdGFsX3F1ZXVlZDsJCS8qKjwgVG90YWwgcXVldWVkIHN0YXRpc3RpYyAqLwogCWF0b21pY190IHRvdGFsX2ZsdXNoZWQ7CQkvKio8IFRvdGFsIGZsdXNoZXMgc3RhdGlzdGljICovCiAJYXRvbWljX3QgdG90YWxfbG9ja3M7CQkvKio8IFRvdGFsIGxvY2tzIHN0YXRpc3RpY3MgKi8KLSNlbmRpZgogCWVudW0gZHJtX2N0eF9mbGFncyBmbGFnczsJLyoqPCBDb250ZXh0IHByZXNlcnZpbmcgYW5kIDJELW9ubHkgKi8KIAlzdHJ1Y3QgZHJtX3dhaXRsaXN0IHdhaXRsaXN0OwkvKio8IFBlbmRpbmcgYnVmZmVycyAqLwogCXdhaXRfcXVldWVfaGVhZF90IGZsdXNoX3F1ZXVlOwkvKio8IFByb2Nlc3NlcyB3YWl0aW5nIHVudGlsIGZsdXNoICovCkBAIC00MTYsNyArNDEzLDggQEAKICAqLwogc3RydWN0IGRybV9sb2NrX2RhdGEgewogCXN0cnVjdCBkcm1faHdfbG9jayAqaHdfbG9jazsJLyoqPCBIYXJkd2FyZSBsb2NrICovCi0Jc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXY7CS8qKjwgRmlsZSBkZXNjciBvZiBsb2NrIGhvbGRlciAoMD1rZXJuZWwpICovCisJLyoqIFByaXZhdGUgb2YgbG9jayBob2xkZXIncyBmaWxlIChOVUxMPWtlcm5lbCkgKi8KKwlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdjsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBsb2NrX3F1ZXVlOwkvKio8IFF1ZXVlIG9mIGJsb2NrZWQgcHJvY2Vzc2VzICovCiAJdW5zaWduZWQgbG9uZyBsb2NrX3RpbWU7CS8qKjwgVGltZSBvZiBsYXN0IGxvY2sgaW4gamlmZmllcyAqLwogCXNwaW5sb2NrX3Qgc3BpbmxvY2s7CkBAIC00OTEsNiArNDg5LDI3IEBACiAJc3RydWN0IGRybV9od19sb2NrICpsb2NrOwogfTsKIAorCisvKgorICogR2VuZXJpYyBtZW1vcnkgbWFuYWdlciBzdHJ1Y3RzCisgKi8KKworc3RydWN0IGRybV9tbV9ub2RlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZsX2VudHJ5OworCXN0cnVjdCBsaXN0X2hlYWQgbWxfZW50cnk7CisJaW50IGZyZWU7CisJdW5zaWduZWQgbG9uZyBzdGFydDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJc3RydWN0IGRybV9tbSAqbW07CisJdm9pZCAqcHJpdmF0ZTsKK307CisKK3N0cnVjdCBkcm1fbW0geworCXN0cnVjdCBsaXN0X2hlYWQgZmxfZW50cnk7CisJc3RydWN0IGxpc3RfaGVhZCBtbF9lbnRyeTsKK307CisKKwogLyoqCiAgKiBNYXBwaW5ncyBsaXN0CiAgKi8KQEAgLTQ5OCw3ICs1MTcsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsJCS8qKjwgbGlzdCBoZWFkICovCiAJc3RydWN0IGRybV9oYXNoX2l0ZW0gaGFzaDsKIAlzdHJ1Y3QgZHJtX21hcCAqbWFwOwkJCS8qKjwgbWFwcGluZyAqLwotCXVuc2lnbmVkIGludCB1c2VyX3Rva2VuOworCXVpbnQ2NF90IHVzZXJfdG9rZW47CiB9OwogCiB0eXBlZGVmIHN0cnVjdCBkcm1fbWFwIGRybV9sb2NhbF9tYXBfdDsKQEAgLTUzNiwyNCArNTU1LDYgQEAKIAlpbnQgdGFibGVfc2l6ZTsKIH07CiAKLS8qCi0gKiBHZW5lcmljIG1lbW9yeSBtYW5hZ2VyIHN0cnVjdHMKLSAqLwotc3RydWN0IGRybV9tbV9ub2RlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGZsX2VudHJ5OwotCXN0cnVjdCBsaXN0X2hlYWQgbWxfZW50cnk7Ci0JaW50IGZyZWU7Ci0JdW5zaWduZWQgbG9uZyBzdGFydDsKLQl1bnNpZ25lZCBsb25nIHNpemU7Ci0Jc3RydWN0IGRybV9tbSAqbW07Ci0Jdm9pZCAqcHJpdmF0ZTsKLX07Ci0KLXN0cnVjdCBkcm1fbW0gewotCXN0cnVjdCBsaXN0X2hlYWQgZmxfZW50cnk7Ci0Jc3RydWN0IGxpc3RfaGVhZCBtbF9lbnRyeTsKLX07Ci0KIC8qKgogICogRFJNIGRyaXZlciBzdHJ1Y3R1cmUuIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudCB0aGUgY29tbW9uIGNvZGUgZm9yCiAgKiBhIGZhbWlseSBvZiBjYXJkcy4gVGhlcmUgd2lsbCBvbmUgZHJtX2RldmljZSBmb3IgZWFjaCBjYXJkIHByZXNlbnQKQEAgLTU2Nyw2ICs1NjgsOCBAQAogCXZvaWQgKCpwb3N0Y2xvc2UpIChzdHJ1Y3QgZHJtX2RldmljZSAqLCBzdHJ1Y3QgZHJtX2ZpbGUgKik7CiAJdm9pZCAoKmxhc3RjbG9zZSkgKHN0cnVjdCBkcm1fZGV2aWNlICopOwogCWludCAoKnVubG9hZCkgKHN0cnVjdCBkcm1fZGV2aWNlICopOworCWludCAoKnN1c3BlbmQpIChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKKwlpbnQgKCpyZXN1bWUpIChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIAlpbnQgKCpkbWFfaW9jdGwpIChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CiAJdm9pZCAoKmRtYV9yZWFkeSkgKHN0cnVjdCBkcm1fZGV2aWNlICopOwogCWludCAoKmRtYV9xdWllc2NlbnQpIChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKQEAgLTY0Miw2ICs2NDUsNyBAQAogICogbWF5IGNvbnRhaW4gbXVsdGlwbGUgaGVhZHMuCiAgKi8KIHN0cnVjdCBkcm1fZGV2aWNlIHsKKwlzdHJ1Y3QgZGV2aWNlIGRldjsJCS8qKjwgTGludXggZGV2aWNlICovCiAJY2hhciAqdW5pcXVlOwkJCS8qKjwgVW5pcXVlIGlkZW50aWZpZXI6IGUuZy4sIGJ1c2lkICovCiAJaW50IHVuaXF1ZV9sZW47CQkJLyoqPCBMZW5ndGggb2YgdW5pcXVlIGZpZWxkICovCiAJY2hhciAqZGV2bmFtZTsJCQkvKio8IEZvciAvcHJvYy9pbnRlcnJ1cHRzICovCkBAIC03NTAsNyArNzU0LDYgQEAKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CiAjZW5kaWYKIAlzdHJ1Y3QgZHJtX3NnX21lbSAqc2c7CS8qKjwgU2NhdHRlciBnYXRoZXIgbWVtb3J5ICovCi0JdW5zaWduZWQgbG9uZyAqY3R4X2JpdG1hcDsJLyoqPCBjb250ZXh0IGJpdG1hcCAqLwogCXZvaWQgKmRldl9wcml2YXRlOwkJLyoqPCBkZXZpY2UgcHJpdmF0ZSBkYXRhICovCiAJc3RydWN0IGRybV9zaWdkYXRhIHNpZ2RhdGE7CSAgIC8qKjwgRm9yIGJsb2NrX2FsbF9zaWduYWxzICovCiAJc2lnc2V0X3Qgc2lnbWFzazsKQEAgLTg0Nyw2ICs4NTAsOCBAQAogCiAJCQkJLyogTWFwcGluZyBzdXBwb3J0IChkcm1fdm0uaCkgKi8KIGV4dGVybiBpbnQgZHJtX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRybV9jb3JlX2dldF9tYXBfb2ZzKHN0cnVjdCBkcm1fbWFwICogbWFwKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGRybV9jb3JlX2dldF9yZWdfb2ZzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBkcm1fcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KTsKIAogCQkJCS8qIE1lbW9yeSBtYW5hZ2VtZW50IHN1cHBvcnQgKGRybV9tZW1vcnkuaCkgKi8KQEAgLTEwNjEsMTEgKzEwNjYsMTEgQEAKIGV4dGVybiB2b2lkIGRybV9wY2lfZnJlZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBkcm1fZG1hX2hhbmRsZV90ICogZG1haCk7CiAKIAkJCSAgICAgICAvKiBzeXNmcyBzdXBwb3J0IChkcm1fc3lzZnMuYykgKi8KK3N0cnVjdCBkcm1fc3lzZnNfY2xhc3M7CiBleHRlcm4gc3RydWN0IGNsYXNzICpkcm1fc3lzZnNfY3JlYXRlKHN0cnVjdCBtb2R1bGUgKm93bmVyLCBjaGFyICpuYW1lKTsKLWV4dGVybiB2b2lkIGRybV9zeXNmc19kZXN0cm95KHN0cnVjdCBjbGFzcyAqY3MpOwotZXh0ZXJuIHN0cnVjdCBjbGFzc19kZXZpY2UgKmRybV9zeXNmc19kZXZpY2VfYWRkKHN0cnVjdCBjbGFzcyAqY3MsCi0JCQkJCQkgc3RydWN0IGRybV9oZWFkICpoZWFkKTsKLWV4dGVybiB2b2lkIGRybV9zeXNmc19kZXZpY2VfcmVtb3ZlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2Rldik7CitleHRlcm4gdm9pZCBkcm1fc3lzZnNfZGVzdHJveSh2b2lkKTsKK2V4dGVybiBpbnQgZHJtX3N5c2ZzX2RldmljZV9hZGQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9oZWFkICpoZWFkKTsKK2V4dGVybiB2b2lkIGRybV9zeXNmc19kZXZpY2VfcmVtb3ZlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogCiAvKgogICogQmFzaWMgbWVtb3J5IG1hbmFnZXIgc3VwcG9ydCAoZHJtX21tLmMpCkBAIC0xMDczLDcgKzEwNzgsNyBAQAogZXh0ZXJuIHN0cnVjdCBkcm1fbW1fbm9kZSAqZHJtX21tX2dldF9ibG9jayhzdHJ1Y3QgZHJtX21tX25vZGUgKiBwYXJlbnQsCiAJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJCQkgICAgICAgdW5zaWduZWQgYWxpZ25tZW50KTsKLXZvaWQgZHJtX21tX3B1dF9ibG9jayhzdHJ1Y3QgZHJtX21tX25vZGUgKiBjdXIpOworZXh0ZXJuIHZvaWQgZHJtX21tX3B1dF9ibG9jayhzdHJ1Y3QgZHJtX21tX25vZGUgKiBjdXIpOwogZXh0ZXJuIHN0cnVjdCBkcm1fbW1fbm9kZSAqZHJtX21tX3NlYXJjaF9mcmVlKGNvbnN0IHN0cnVjdCBkcm1fbW0gKm1tLCB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkJCSB1bnNpZ25lZCBhbGlnbm1lbnQsIGludCBiZXN0X21hdGNoKTsKIGV4dGVybiBpbnQgZHJtX21tX2luaXQoc3RydWN0IGRybV9tbSAqbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CkBAIC0xMTQ0LDggKzExNDksNSBAQAogCiAvKkB9Ki8KIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtX2NvcmVfZ2V0X21hcF9vZnMoc3RydWN0IGRybV9tYXAgKiBtYXApOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZHJtX2NvcmVfZ2V0X3JlZ19vZnMoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Ci0KICNlbmRpZgkJCQkvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2FncHN1cHBvcnQuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2FncHN1cHBvcnQuYwppbmRleCAyMTRmNGZiLi45NDY4Yzc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9hZ3BzdXBwb3J0LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fYWdwc3VwcG9ydC5jCkBAIC0xNjYsNyArMTY2LDYgQEAKIAogCWRldi0+YWdwLT5tb2RlID0gbW9kZS5tb2RlOwogCWFncF9lbmFibGUoZGV2LT5hZ3AtPmJyaWRnZSwgbW9kZS5tb2RlKTsKLQlkZXYtPmFncC0+YmFzZSA9IGRldi0+YWdwLT5hZ3BfaW5mby5hcGVyX2Jhc2U7CiAJZGV2LT5hZ3AtPmVuYWJsZWQgPSAxOwogCXJldHVybiAwOwogfQpAQCAtNDE3LDcgKzQxNiw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJmhlYWQtPm1lbW9yeSk7CiAJaGVhZC0+Y2FudF91c2VfYXBlcnR1cmUgPSBoZWFkLT5hZ3BfaW5mby5jYW50X3VzZV9hcGVydHVyZTsKIAloZWFkLT5wYWdlX21hc2sgPSBoZWFkLT5hZ3BfaW5mby5wYWdlX21hc2s7Ci0KKwloZWFkLT5iYXNlID0gaGVhZC0+YWdwX2luZm8uYXBlcl9iYXNlOwogCXJldHVybiBoZWFkOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMKaW5kZXggZDI0YTZjMi4uYmRlNjRiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fYnVmcy5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2J1ZnMuYwpAQCAtMTg0LDcgKzE4NCw3IEBACiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CiAJCX0KLQkJCQkKKwogCQlicmVhazsKIAljYXNlIF9EUk1fU0hNOgogCQlsaXN0ID0gZHJtX2ZpbmRfbWF0Y2hpbmdfbWFwKGRldiwgbWFwKTsKQEAgLTIyOSwxMSArMjI5LDE3IEBACiAjaWZkZWYgX19hbHBoYV9fCiAJCW1hcC0+b2Zmc2V0ICs9IGRldi0+aG9zZS0+bWVtX3NwYWNlLT5zdGFydDsKICNlbmRpZgotCQkvKiBOb3RlOiBkZXYtPmFncC0+YmFzZSBtYXkgYWN0dWFsbHkgYmUgMCB3aGVuIHRoZSBEUk0KLQkJICogaXMgbm90IGluIGNvbnRyb2wgb2YgQUdQIHNwYWNlLiBCdXQgaWYgdXNlciBzcGFjZSBpcwotCQkgKiBpdCBzaG91bGQgYWxyZWFkeSBoYXZlIGFkZGVkIHRoZSBBR1AgYmFzZSBpdHNlbGYuCisJCS8qIEluIHNvbWUgY2FzZXMgKGk4MTAgZHJpdmVyKSwgdXNlciBzcGFjZSBtYXkgaGF2ZSBhbHJlYWR5CisJCSAqIGFkZGVkIHRoZSBBR1AgYmFzZSBpdHNlbGYsIGJlY2F1c2UgZGV2LT5hZ3AtPmJhc2UgcHJldmlvdXNseQorCQkgKiBvbmx5IGdvdCBzZXQgZHVyaW5nIEFHUCBlbmFibGUuICBTbywgb25seSBhZGQgdGhlIGJhc2UKKwkJICogYWRkcmVzcyBpZiB0aGUgbWFwJ3Mgb2Zmc2V0IGlzbid0IGFscmVhZHkgd2l0aGluIHRoZQorCQkgKiBhcGVydHVyZS4KIAkJICovCi0JCW1hcC0+b2Zmc2V0ICs9IGRldi0+YWdwLT5iYXNlOworCQlpZiAobWFwLT5vZmZzZXQgPCBkZXYtPmFncC0+YmFzZSB8fAorCQkgICAgbWFwLT5vZmZzZXQgPiBkZXYtPmFncC0+YmFzZSArCisJCSAgICBkZXYtPmFncC0+YWdwX2luZm8uYXBlcl9zaXplICogMTAyNCAqIDEwMjQgLSAxKSB7CisJCQltYXAtPm9mZnNldCArPSBkZXYtPmFncC0+YmFzZTsKKwkJfQogCQltYXAtPm10cnIgPSBkZXYtPmFncC0+YWdwX210cnI7CS8qIGZvciBnZXRtYXAgKi8KIAogCQkvKiBUaGlzIGFzc3VtZXMgdGhlIERSTSBpcyBpbiB0b3RhbCBjb250cm9sIG9mIEFHUCBzcGFjZS4KQEAgLTQyOSw2ICs0MzUsNyBAQAogCiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0woZHJtX3JtbWFwKTsKIAogLyogVGhlIHJtbWFwIGlvY3RsIGFwcGVhcnMgdG8gYmUgdW5uZWNlc3NhcnkuICBBbGwgbWFwcGluZ3MgYXJlIHRvcm4gZG93biBvbgogICogdGhlIGxhc3QgY2xvc2Ugb2YgdGhlIGRldmljZSwgYW5kIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciBjbGVhbnVwIHdoZW4gdGhpbmdzCkBAIC04MTQsOSArODIxLDkgQEAKIAlwYWdlX2NvdW50ID0gMDsKIAogCXdoaWxlIChlbnRyeS0+YnVmX2NvdW50IDwgY291bnQpIHsKLQkJCisKIAkJZG1haCA9IGRybV9wY2lfYWxsb2MoZGV2LCBQQUdFX1NJWkUgPDwgcGFnZV9vcmRlciwgMHgxMDAwLCAweGZmZmZmZmZmdWwpOwotCQkKKwogCQlpZiAoIWRtYWgpIHsKIAkJCS8qIFNldCBjb3VudCBjb3JyZWN0bHkgc28gd2UgZnJlZSB0aGUgcHJvcGVyIGFtb3VudC4gKi8KIAkJCWVudHJ5LT5idWZfY291bnQgPSBjb3VudDsKQEAgLTE1OTIsNSArMTU5OSwzIEBACiAJcmV0dXJuIG9yZGVyOwogfQogRVhQT1JUX1NZTUJPTChkcm1fb3JkZXIpOwotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2NvbnRleHQuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2NvbnRleHQuYwppbmRleCAxN2ZlNjllLi5kNTA1ZjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9jb250ZXh0LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fY29udGV4dC5jCkBAIC0xNTksNyArMTU5LDcgQEAKIAlyZXF1ZXN0LT5oYW5kbGUgPSBOVUxMOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoX2VudHJ5LCAmZGV2LT5tYXBsaXN0LCBoZWFkKSB7CiAJCWlmIChfZW50cnktPm1hcCA9PSBtYXApIHsKLQkJCXJlcXVlc3QtPmhhbmRsZSA9IAorCQkJcmVxdWVzdC0+aGFuZGxlID0KIAkJCSAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKV9lbnRyeS0+dXNlcl90b2tlbjsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2Rydi5jCmluZGV4IDQ0YTQ2MjYuLjBlN2FmNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2Rydi5jCkBAIC0yMDAsOCArMjAwLDEwIEBACiAJfQogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJfbGlzdCwgbGlzdF90LCAmZGV2LT5tYXBsaXN0LCBoZWFkKSB7Ci0JCWRybV9ybW1hcF9sb2NrZWQoZGV2LCByX2xpc3QtPm1hcCk7Ci0JCXJfbGlzdCA9IE5VTEw7CisJCWlmICghKHJfbGlzdC0+bWFwLT5mbGFncyAmIF9EUk1fRFJJVkVSKSkgeworCQkJZHJtX3JtbWFwX2xvY2tlZChkZXYsIHJfbGlzdC0+bWFwKTsKKwkJCXJfbGlzdCA9IE5VTEw7CisJCX0KIAl9CiAKIAlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9ETUFfUVVFVUUpICYmIGRldi0+cXVldWVsaXN0KSB7CkBAIC0yNTUsOCArMjU3LDYgQEAKIAogCURSTV9ERUJVRygiXG4iKTsKIAotCWRybV9tZW1faW5pdCgpOwotCiAJZm9yIChpID0gMDsgZHJpdmVyLT5wY2lfZHJpdmVyLmlkX3RhYmxlW2ldLnZlbmRvciAhPSAwOyBpKyspIHsKIAkJcGlkID0gKHN0cnVjdCBwY2lfZGV2aWNlX2lkICopJmRyaXZlci0+cGNpX2RyaXZlci5pZF90YWJsZVtpXTsKIApAQCAtMjkzLDEwICsyOTMsNiBAQAogCiAJZHJtX2xhc3RjbG9zZShkZXYpOwogCi0JZHJtX2h0X3JlbW92ZSgmZGV2LT5tYXBfaGFzaCk7Ci0KLQlkcm1fY3R4Yml0bWFwX2NsZWFudXAoZGV2KTsKLQogCWlmIChkcm1fY29yZV9oYXNfTVRSUihkZXYpICYmIGRybV9jb3JlX2hhc19BR1AoZGV2KSAmJgogCSAgICBkZXYtPmFncCAmJiBkZXYtPmFncC0+YWdwX210cnIgPj0gMCkgewogCQlpbnQgcmV0dmFsOwpAQCAtMzE0LDYgKzMxMCw5IEBACiAJaWYgKGRldi0+ZHJpdmVyLT51bmxvYWQpCiAJCWRldi0+ZHJpdmVyLT51bmxvYWQoZGV2KTsKIAorCWRybV9odF9yZW1vdmUoJmRldi0+bWFwX2hhc2gpOworCWRybV9jdHhiaXRtYXBfY2xlYW51cChkZXYpOworCiAJZHJtX3B1dF9oZWFkKCZkZXYtPnByaW1hcnkpOwogCWlmIChkcm1fcHV0X2RldihkZXYpKQogCQlEUk1fRVJST1IoIkNhbm5vdCB1bmxvYWQgbW9kdWxlXG4iKTsKQEAgLTM4MywyMiArMzgyLDI0IEBACiAJCWdvdG8gZXJyX3AzOwogCX0KIAorCWRybV9tZW1faW5pdCgpOworCiAJRFJNX0lORk8oIkluaXRpYWxpemVkICVzICVkLiVkLiVkICVzXG4iLAogCQkgQ09SRV9OQU1FLCBDT1JFX01BSk9SLCBDT1JFX01JTk9SLCBDT1JFX1BBVENITEVWRUwsIENPUkVfREFURSk7CiAJcmV0dXJuIDA7Ci0gICAgICBlcnJfcDM6Ci0JZHJtX3N5c2ZzX2Rlc3Ryb3koZHJtX2NsYXNzKTsKLSAgICAgIGVycl9wMjoKK2Vycl9wMzoKKwlkcm1fc3lzZnNfZGVzdHJveSgpOworZXJyX3AyOgogCXVucmVnaXN0ZXJfY2hyZGV2KERSTV9NQUpPUiwgImRybSIpOwogCWRybV9mcmVlKGRybV9oZWFkcywgc2l6ZW9mKCpkcm1faGVhZHMpICogZHJtX2NhcmRzX2xpbWl0LCBEUk1fTUVNX1NUVUIpOwotICAgICAgZXJyX3AxOgorZXJyX3AxOgogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBkcm1fY29yZV9leGl0KHZvaWQpCiB7CiAJcmVtb3ZlX3Byb2NfZW50cnkoImRyaSIsIE5VTEwpOwotCWRybV9zeXNmc19kZXN0cm95KGRybV9jbGFzcyk7CisJZHJtX3N5c2ZzX2Rlc3Ryb3koKTsKIAogCXVucmVnaXN0ZXJfY2hyZGV2KERSTV9NQUpPUiwgImRybSIpOwogCkBAIC00OTQsMjMgKzQ5NSwyNSBAQAogCX0gZWxzZSB7CiAJCWlmIChjbWQgJiAoSU9DX0lOIHwgSU9DX09VVCkpIHsKIAkJCWtkYXRhID0ga21hbGxvYyhfSU9DX1NJWkUoY21kKSwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIWtkYXRhKQotCQkJCXJldHVybiAtRU5PTUVNOworCQkJaWYgKCFrZGF0YSkgeworCQkJCXJldGNvZGUgPSAtRU5PTUVNOworCQkJCWdvdG8gZXJyX2kxOworCQkJfQogCQl9CiAKIAkJaWYgKGNtZCAmIElPQ19JTikgewogCQkJaWYgKGNvcHlfZnJvbV91c2VyKGtkYXRhLCAodm9pZCBfX3VzZXIgKilhcmcsCiAJCQkJCSAgIF9JT0NfU0laRShjbWQpKSAhPSAwKSB7Ci0JCQkJcmV0Y29kZSA9IC1FQUNDRVM7CisJCQkJcmV0Y29kZSA9IC1FRkFVTFQ7CiAJCQkJZ290byBlcnJfaTE7CiAJCQl9CiAJCX0KIAkJcmV0Y29kZSA9IGZ1bmMoZGV2LCBrZGF0YSwgZmlsZV9wcml2KTsKIAotCQlpZiAoY21kICYgSU9DX09VVCkgeworCQlpZiAoKHJldGNvZGUgPT0gMCkgJiYgKGNtZCAmIElPQ19PVVQpKSB7CiAJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywga2RhdGEsCiAJCQkJCSBfSU9DX1NJWkUoY21kKSkgIT0gMCkKLQkJCQlyZXRjb2RlID0gLUVBQ0NFUzsKKwkJCQlyZXRjb2RlID0gLUVGQVVMVDsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1faGFzaHRhYi5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faGFzaHRhYi5jCmluZGV4IDRiOGU3ZGIuLjMzMTYwNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2hhc2h0YWIuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9oYXNodGFiLmMKQEAgLTgwLDcgKzgwLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaGxpc3Rfbm9kZSAqZHJtX2h0X2ZpbmRfa2V5KHN0cnVjdCBkcm1fb3Blbl9oYXNoICpodCwgCitzdGF0aWMgc3RydWN0IGhsaXN0X25vZGUgKmRybV9odF9maW5kX2tleShzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQsCiAJCQkJCSAgdW5zaWduZWQgbG9uZyBrZXkpCiB7CiAJc3RydWN0IGRybV9oYXNoX2l0ZW0gKmVudHJ5OwpAQCAtMTI5LDcgKzEyOSw3IEBACiB9CiAKIC8qCi0gKiBKdXN0IGluc2VydCBhbiBpdGVtIGFuZCByZXR1cm4gYW55ICJiaXRzIiBiaXQga2V5IHRoYXQgaGFzbid0IGJlZW4gCisgKiBKdXN0IGluc2VydCBhbiBpdGVtIGFuZCByZXR1cm4gYW55ICJiaXRzIiBiaXQga2V5IHRoYXQgaGFzbid0IGJlZW4KICAqIHVzZWQgYmVmb3JlLgogICovCiBpbnQgZHJtX2h0X2p1c3RfaW5zZXJ0X3BsZWFzZShzdHJ1Y3QgZHJtX29wZW5faGFzaCAqaHQsIHN0cnVjdCBkcm1faGFzaF9pdGVtICppdGVtLApAQCAtMjAwLDQgKzIwMCwzIEBACiAJCWh0LT50YWJsZSA9IE5VTEw7CiAJfQogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9oYXNodGFiLmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9oYXNodGFiLmgKaW5kZXggNTczZTMzMy4uY2QyYjE4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1faGFzaHRhYi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2hhc2h0YWIuaApAQCAtNjUsNCArNjUsMyBAQAogCiAKICNlbmRpZgotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2MzMi5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faW9jMzIuYwppbmRleCAyMjg2ZjMzLi45MGY1YThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2MzMi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lvYzMyLmMKQEAgLTEwNTEsOCArMTA1MSwxMiBAQAogCWRybV9pb2N0bF9jb21wYXRfdCAqZm47CiAJaW50IHJldDsKIAorCS8qIEFzc3VtZSB0aGF0IGlvY3RscyB3aXRob3V0IGFuIGV4cGxpY2l0IGNvbXBhdCByb3V0aW5lIHdpbGwganVzdAorCSAqIHdvcmsuICBUaGlzIG1heSBub3QgYWx3YXlzIGJlIGEgZ29vZCBhc3N1bXB0aW9uLCBidXQgaXQncyBiZXR0ZXIKKwkgKiB0aGFuIGFsd2F5cyBmYWlsaW5nLgorCSAqLwogCWlmIChuciA+PSBBUlJBWV9TSVpFKGRybV9jb21wYXRfaW9jdGxzKSkKLQkJcmV0dXJuIC1FTk9UVFk7CisJCXJldHVybiBkcm1faW9jdGwoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbHAsIGNtZCwgYXJnKTsKIAogCWZuID0gZHJtX2NvbXBhdF9pb2N0bHNbbnJdOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2N0bC5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faW9jdGwuYwppbmRleCAzY2JlYmY4Li4xNjgyOWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2N0bC5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lvY3RsLmMKQEAgLTIzNCwyNiArMjM0LDIzIEBACiAKIAlpZHggPSBjbGllbnQtPmlkeDsKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JCi0JaWYgKGxpc3RfZW1wdHkoJmRldi0+ZmlsZWxpc3QpKSB7Ci0JCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAKIAlpID0gMDsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHB0LCAmZGV2LT5maWxlbGlzdCwgbGhlYWQpIHsKLQkJaWYgKGkrKyA+PSBpZHgpCi0JCQlicmVhazsKLQl9CisJCWlmIChpKysgPj0gaWR4KSB7CisJCQljbGllbnQtPmF1dGggPSBwdC0+YXV0aGVudGljYXRlZDsKKwkJCWNsaWVudC0+cGlkID0gcHQtPnBpZDsKKwkJCWNsaWVudC0+dWlkID0gcHQtPnVpZDsKKwkJCWNsaWVudC0+bWFnaWMgPSBwdC0+bWFnaWM7CisJCQljbGllbnQtPmlvY3MgPSBwdC0+aW9jdGxfY291bnQ7CisJCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAotCWNsaWVudC0+YXV0aCA9IHB0LT5hdXRoZW50aWNhdGVkOwotCWNsaWVudC0+cGlkID0gcHQtPnBpZDsKLQljbGllbnQtPnVpZCA9IHB0LT51aWQ7Ci0JY2xpZW50LT5tYWdpYyA9IHB0LT5tYWdpYzsKLQljbGllbnQtPmlvY3MgPSBwdC0+aW9jdGxfY291bnQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKIAotCXJldHVybiAwOworCXJldHVybiAtRUlOVkFMOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faXJxLmMKaW5kZXggMDVlYWU2My4uMDg5YzAxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1faXJxLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1faXJxLmMKQEAgLTEwNyw3ICsxMDcsNyBAQAogCWRldi0+aXJxX2VuYWJsZWQgPSAxOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCi0JRFJNX0RFQlVHKCIlczogaXJxPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGRldi0+aXJxKTsKKwlEUk1fREVCVUcoImlycT0lZFxuIiwgZGV2LT5pcnEpOwogCiAJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfSVJRX1ZCTCkpIHsKIAkJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT52YmxfcXVldWUpOwpAQCAtMTY0LDcgKzE2NCw3IEBACiAJaWYgKCFpcnFfZW5hYmxlZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlEUk1fREVCVUcoIiVzOiBpcnE9JWRcbiIsIF9fRlVOQ1RJT05fXywgZGV2LT5pcnEpOworCURSTV9ERUJVRygiaXJxPSVkXG4iLCBkZXYtPmlycSk7CiAKIAlkZXYtPmRyaXZlci0+aXJxX3VuaW5zdGFsbChkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnkuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX21lbW9yeS5jCmluZGV4IDkzMDE5OTAuLjg0NTA4MWI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnkuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9tZW1vcnkuYwpAQCAtMTc5LDQgKzE3OSwzIEBACiAJCWlvdW5tYXAobWFwLT5oYW5kbGUpOwogfQogRVhQT1JUX1NZTUJPTChkcm1fY29yZV9pb3JlbWFwZnJlZSk7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX21tLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9tbS5jCmluZGV4IDg2ZjRlYjYuLmRjZmY5ZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX21tLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbW0uYwpAQCAtMjkzLDQgKzI5MywzIEBACiAKIAlkcm1fZnJlZShlbnRyeSwgc2l6ZW9mKCplbnRyeSksIERSTV9NRU1fTU0pOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9vc19saW51eC5oIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fb3NfbGludXguaAppbmRleCBkYWE2OWM5Li44ZGJkMjU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9vc19saW51eC5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX29zX2xpbnV4LmgKQEAgLTY5LDkgKzY5LDkgQEAKICNkZWZpbmUgRFJNX0NPUFlfVE9fVVNFUihhcmcxLCBhcmcyLCBhcmczKQkJXAogCWNvcHlfdG9fdXNlcihhcmcxLCBhcmcyLCBhcmczKQogLyogTWFjcm9zIGZvciBjb3B5ZnJvbSB1c2VyLCBidXQgY2hlY2tpbmcgcmVhZGFiaWxpdHkgb25seSBvbmNlICovCi0jZGVmaW5lIERSTV9WRVJJRllBUkVBX1JFQUQoIHVhZGRyLCBzaXplICkgCQlcCisjZGVmaW5lIERSTV9WRVJJRllBUkVBX1JFQUQoIHVhZGRyLCBzaXplICkJCVwKIAkoYWNjZXNzX29rKCBWRVJJRllfUkVBRCwgdWFkZHIsIHNpemUgKSA/IDAgOiAtRUZBVUxUKQotI2RlZmluZSBEUk1fQ09QWV9GUk9NX1VTRVJfVU5DSEVDS0VEKGFyZzEsIGFyZzIsIGFyZzMpIAlcCisjZGVmaW5lIERSTV9DT1BZX0ZST01fVVNFUl9VTkNIRUNLRUQoYXJnMSwgYXJnMiwgYXJnMykJXAogCV9fY29weV9mcm9tX3VzZXIoYXJnMSwgYXJnMiwgYXJnMykKICNkZWZpbmUgRFJNX0NPUFlfVE9fVVNFUl9VTkNIRUNLRUQoYXJnMSwgYXJnMiwgYXJnMykJXAogCV9fY29weV90b191c2VyKGFyZzEsIGFyZzIsIGFyZzMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9wY2lpZHMuaCBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3BjaWlkcy5oCmluZGV4IDQzZDNjNDIuLmY1MjQ2ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3BjaWlkcy5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3BjaWlkcy5oCkBAIC0xMzksNiArMTM5LDEwMSBAQAogCXsweDEwMDIsIDB4NWU0YywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjQxMHxSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDVlNGQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY0MTB8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg1ZTRmLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNDEwfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzEwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SNTIwfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzEwMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SNTIwfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxMDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjUyMHxSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3MTAzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1I1MjB8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzEwNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SNTIwfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzEwNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SNTIwfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzEwNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SNTIwfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxMDgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjUyMHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxMDksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjUyMHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxMEEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjUyMHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxMEIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjUyMHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxMEMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjUyMHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxMEUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjUyMHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxMEYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjUyMHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxNDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY1MTV8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3MTQxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNTE1fFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzE0MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjUxNXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxNDMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY1MTV8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3MTQ0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNTE1fFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxNDUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY1MTV8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzE0NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjUxNXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxNDcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY1MTV8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3MTQ5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNTE1fFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxNEEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY1MTV8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzE0QiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjUxNXxSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3MTRDLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNTE1fFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxNEQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY1MTV8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3MTRFLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNTE1fFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzE0RiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjUxNXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxNTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY1MTV8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3MTUyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNTE1fFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzE1MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjUxNXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxNUUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY1MTV8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3MTVGLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNTE1fFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzE4MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjUxNXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxODEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY1MTV8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3MTgzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNTE1fFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzE4NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjUxNXxSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3MTg3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNTE1fFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzE4OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjUxNXxSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3MThBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNTE1fFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxOEIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY1MTV8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzE4QywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjUxNXxSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3MThELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNTE1fFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxOEYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY1MTV8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3MTkzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNTE1fFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzE5NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjUxNXxSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3MTlCLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNTE1fFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzE5RiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjUxNXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxQzAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY1MzB8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3MUMxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNTMwfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzFDMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjUzMHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxQzMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY1MzB8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3MUM0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNTMwfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxQzUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY1MzB8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzFDNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjUzMHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxQzcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY1MzB8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3MUNELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNTMwfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzFDRSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjUzMHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxRDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY1MzB8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3MUQ0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNTMwfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcxRDUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY1MzB8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzFENiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjUzMHxSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3MURBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNTMwfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzFERSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjUzMHxSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3MjAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNTMwfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzIxMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjUzMHxSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3MjExLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNTMwfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcyNDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjU4MHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcyNDMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjU4MHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcyNDQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjU4MHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcyNDUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjU4MHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcyNDYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjU4MHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcyNDcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjU4MHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcyNDgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjU4MHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcyNDksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjU4MHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcyNEEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjU4MHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcyNEIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjU4MHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcyNEMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjU4MHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcyNEQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjU4MHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcyNEUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjU4MHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcyNEYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjU4MHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcyODAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY1NzB8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3MjgxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNTYwfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzI4MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjU2MHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcyODQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUjU4MHxSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3Mjg3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNTYwfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzI4OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjU3MHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcyODksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY1NzB8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3MjhCLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNTcwfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzI4QywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjU3MHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcyOTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY1NjB8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg3MjkxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JWNTYwfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4NzI5MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SVjU2MHxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDcyOTcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUlY1NjB8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg3ODM0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JTMzAwfFJBREVPTl9JU19JR1B8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg3ODM1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JTMzAwfFJBREVPTl9JU19JR1B8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXswLCAwLCAwfQpAQCAtMzExLDUgKzQwNiw1IEBACiAJezB4ODA4NiwgMHgyOWQyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAogCXsweDgwODYsIDB4MmEwMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKIAl7MHg4MDg2LCAweDJhMTIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4ODA4NiwgMHgyYTQyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAogCXswLCAwLCAwfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9wcm9jLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9wcm9jLmMKaW5kZXggMTJkZmVhOC4uZDliNTYwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fcHJvYy5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3Byb2MuYwpAQCAtMjM2LDExICsyMzYsMTEgQEAKIAkJCXR5cGUgPSAiPz8iOwogCQllbHNlCiAJCQl0eXBlID0gdHlwZXNbbWFwLT50eXBlXTsKLQkJRFJNX1BST0NfUFJJTlQoIiU0ZCAweCUwOGx4IDB4JTA4bHggJTQuNHMgIDB4JTAyeCAweCUwOHggIiwKKwkJRFJNX1BST0NfUFJJTlQoIiU0ZCAweCUwOGx4IDB4JTA4bHggJTQuNHMgIDB4JTAyeCAweCUwOGx4ICIsCiAJCQkgICAgICAgaSwKIAkJCSAgICAgICBtYXAtPm9mZnNldCwKIAkJCSAgICAgICBtYXAtPnNpemUsIHR5cGUsIG1hcC0+ZmxhZ3MsCi0JCQkgICAgICAgcl9saXN0LT51c2VyX3Rva2VuKTsKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZykgcl9saXN0LT51c2VyX3Rva2VuKTsKIAkJaWYgKG1hcC0+bXRyciA8IDApIHsKIAkJCURSTV9QUk9DX1BSSU5UKCJub25lXG4iKTsKIAkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NhcmVhLmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zYXJlYS5oCmluZGV4IGUwNDBmNDcuLjQ4MDAzNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NhcmVhLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc2FyZWEuaApAQCAtNDUsNyArNDUsNyBAQAogI2VuZGlmCiAKIC8qKiBNYXhpbXVtIG51bWJlciBvZiBkcmF3YWJsZXMgaW4gdGhlIFNBUkVBICovCi0jZGVmaW5lIFNBUkVBX01BWF9EUkFXQUJMRVMgCQkyNTYKKyNkZWZpbmUgU0FSRUFfTUFYX0RSQVdBQkxFUwkJMjU2CiAKICNkZWZpbmUgU0FSRUFfRFJBV0FCTEVfQ0xBSU1FRF9FTlRSWSAgICAweDgwMDAwMDAwCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NjYXR0ZXIuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3NjYXR0ZXIuYwppbmRleCBlYjdmYTQzLi4yNmQ4ZjY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9zY2F0dGVyLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc2NhdHRlci5jCkBAIC02Nyw3ICs2Nyw3IEBACiAJc3RydWN0IGRybV9zZ19tZW0gKmVudHJ5OwogCXVuc2lnbmVkIGxvbmcgcGFnZXMsIGksIGo7CiAKLQlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCURSTV9ERUJVRygiXG4iKTsKIAogCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9TRykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtODEsNyArODEsNyBAQAogCiAJbWVtc2V0KGVudHJ5LCAwLCBzaXplb2YoKmVudHJ5KSk7CiAJcGFnZXMgPSAocmVxdWVzdC0+c2l6ZSArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFOwotCURSTV9ERUJVRygic2cgc2l6ZT0lbGQgcGFnZXM9JWxkXG4iLCByZXF1ZXN0LT5zaXplLCBwYWdlcyk7CisJRFJNX0RFQlVHKCJzaXplPSVsZCBwYWdlcz0lbGRcbiIsIHJlcXVlc3QtPnNpemUsIHBhZ2VzKTsKIAogCWVudHJ5LT5wYWdlcyA9IHBhZ2VzOwogCWVudHJ5LT5wYWdlbGlzdCA9IGRybV9hbGxvYyhwYWdlcyAqIHNpemVvZigqZW50cnktPnBhZ2VsaXN0KSwKQEAgLTEyMiw4ICsxMjIsOCBAQAogCiAJZW50cnktPmhhbmRsZSA9IFNjYXR0ZXJIYW5kbGUoKHVuc2lnbmVkIGxvbmcpZW50cnktPnZpcnR1YWwpOwogCi0JRFJNX0RFQlVHKCJzZyBhbGxvYyBoYW5kbGUgID0gJTA4bHhcbiIsIGVudHJ5LT5oYW5kbGUpOwotCURSTV9ERUJVRygic2cgYWxsb2MgdmlydHVhbCA9ICVwXG4iLCBlbnRyeS0+dmlydHVhbCk7CisJRFJNX0RFQlVHKCJoYW5kbGUgID0gJTA4bHhcbiIsIGVudHJ5LT5oYW5kbGUpOworCURSTV9ERUJVRygidmlydHVhbCA9ICVwXG4iLCBlbnRyeS0+dmlydHVhbCk7CiAKIAlmb3IgKGkgPSAodW5zaWduZWQgbG9uZyllbnRyeS0+dmlydHVhbCwgaiA9IDA7IGogPCBwYWdlczsKIAkgICAgIGkgKz0gUEFHRV9TSVpFLCBqKyspIHsKQEAgLTIxMCw3ICsyMTAsNyBAQAogCWlmICghZW50cnkgfHwgZW50cnktPmhhbmRsZSAhPSByZXF1ZXN0LT5oYW5kbGUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JRFJNX0RFQlVHKCJzZyBmcmVlIHZpcnR1YWwgID0gJXBcbiIsIGVudHJ5LT52aXJ0dWFsKTsKKwlEUk1fREVCVUcoInZpcnR1YWwgID0gJXBcbiIsIGVudHJ5LT52aXJ0dWFsKTsKIAogCWRybV9zZ19jbGVhbnVwKGVudHJ5KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc3R1Yi5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc3R1Yi5jCmluZGV4IGVlODNmZjkuLmQ5M2EyMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N0dWIuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zdHViLmMKQEAgLTk4LDEwICs5OCw2IEBACiAKIAlkZXYtPmRyaXZlciA9IGRyaXZlcjsKIAotCWlmIChkZXYtPmRyaXZlci0+bG9hZCkKLQkJaWYgKChyZXRjb2RlID0gZGV2LT5kcml2ZXItPmxvYWQoZGV2LCBlbnQtPmRyaXZlcl9kYXRhKSkpCi0JCQlnb3RvIGVycm9yX291dF91bnJlZzsKLQogCWlmIChkcm1fY29yZV9oYXNfQUdQKGRldikpIHsKIAkJaWYgKGRybV9kZXZpY2VfaXNfYWdwKGRldikpCiAJCQlkZXYtPmFncCA9IGRybV9hZ3BfaW5pdChkZXYpOwpAQCAtMTIwLDYgKzExNiwxMCBAQAogCQl9CiAJfQogCisJaWYgKGRldi0+ZHJpdmVyLT5sb2FkKQorCQlpZiAoKHJldGNvZGUgPSBkZXYtPmRyaXZlci0+bG9hZChkZXYsIGVudC0+ZHJpdmVyX2RhdGEpKSkKKwkJCWdvdG8gZXJyb3Jfb3V0X3VucmVnOworCiAJcmV0Y29kZSA9IGRybV9jdHhiaXRtYXBfaW5pdChkZXYpOwogCWlmIChyZXRjb2RlKSB7CiAJCURSTV9FUlJPUigiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgY29udGV4dCBiaXRtYXAuXG4iKTsKQEAgLTE2OCwxMSArMTY4LDEwIEBACiAJCQkJZ290byBlcnJfZzE7CiAJCQl9CiAKLQkJCWhlYWQtPmRldl9jbGFzcyA9IGRybV9zeXNmc19kZXZpY2VfYWRkKGRybV9jbGFzcywgaGVhZCk7Ci0JCQlpZiAoSVNfRVJSKGhlYWQtPmRldl9jbGFzcykpIHsKKwkJCXJldCA9IGRybV9zeXNmc19kZXZpY2VfYWRkKGRldiwgaGVhZCk7CisJCQlpZiAocmV0KSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkJICAgICAgICJEUk06IEVycm9yIHN5c2ZzX2RldmljZV9hZGQuXG4iKTsKLQkJCQlyZXQgPSBQVFJfRVJSKGhlYWQtPmRldl9jbGFzcyk7CiAJCQkJZ290byBlcnJfZzI7CiAJCQl9CiAJCQkqaGVhZHMgPSBoZWFkOwpAQCAtMjE4LDEzICsyMTcsMTQgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycl9nMTsKIAorCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwogCWlmICgocmV0ID0gZHJtX2ZpbGxfaW5fZGV2KGRldiwgcGRldiwgZW50LCBkcml2ZXIpKSkgewogCQlwcmludGsoS0VSTl9FUlIgIkRSTTogRmlsbF9pbl9kZXYgZmFpbGVkLlxuIik7CiAJCWdvdG8gZXJyX2cyOwogCX0KIAlpZiAoKHJldCA9IGRybV9nZXRfaGVhZChkZXYsICZkZXYtPnByaW1hcnkpKSkKIAkJZ290byBlcnJfZzI7Ci0JCisKIAlEUk1fSU5GTygiSW5pdGlhbGl6ZWQgJXMgJWQuJWQuJWQgJXMgb24gbWlub3IgJWRcbiIsCiAJCSBkcml2ZXItPm5hbWUsIGRyaXZlci0+bWFqb3IsIGRyaXZlci0+bWlub3IsIGRyaXZlci0+cGF0Y2hsZXZlbCwKIAkJIGRyaXZlci0+ZGF0ZSwgZGV2LT5wcmltYXJ5Lm1pbm9yKTsKQEAgLTI4Myw3ICsyODMsNyBAQAogCURSTV9ERUJVRygicmVsZWFzZSBzZWNvbmRhcnkgbWlub3IgJWRcbiIsIG1pbm9yKTsKIAogCWRybV9wcm9jX2NsZWFudXAobWlub3IsIGRybV9wcm9jX3Jvb3QsIGhlYWQtPmRldl9yb290KTsKLQlkcm1fc3lzZnNfZGV2aWNlX3JlbW92ZShoZWFkLT5kZXZfY2xhc3MpOworCWRybV9zeXNmc19kZXZpY2VfcmVtb3ZlKGhlYWQtPmRldik7CiAKIAkqaGVhZCA9IChzdHJ1Y3QgZHJtX2hlYWQpIHsuZGV2ID0gTlVMTH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N5c2ZzLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zeXNmcy5jCmluZGV4IGNmNDM0OWIuLmZhMzYxNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc3lzZnMuYwpAQCAtMTksNiArMTksNDUgQEAKICNpbmNsdWRlICJkcm1fY29yZS5oIgogI2luY2x1ZGUgImRybVAuaCIKIAorI2RlZmluZSB0b19kcm1fZGV2aWNlKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgZHJtX2RldmljZSwgZGV2KQorCisvKioKKyAqIGRybV9zeXNmc19zdXNwZW5kIC0gRFJNIGNsYXNzIHN1c3BlbmQgaG9vaworICogQGRldjogTGludXggZGV2aWNlIHRvIHN1c3BlbmQKKyAqIEBzdGF0ZTogcG93ZXIgc3RhdGUgdG8gZW50ZXIKKyAqCisgKiBKdXN0IGZpZ3VyZXMgb3V0IHdoYXQgdGhlIGFjdHVhbCBzdHJ1Y3QgZHJtX2RldmljZSBhc3NvY2lhdGVkIHdpdGgKKyAqIEBkZXYgaXMgYW5kIGNhbGxzIGl0cyBzdXNwZW5kIGhvb2ssIGlmIHByZXNlbnQuCisgKi8KK3N0YXRpYyBpbnQgZHJtX3N5c2ZzX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRybV9kZXYgPSB0b19kcm1fZGV2aWNlKGRldik7CisKKwlwcmludGsoS0VSTl9FUlIgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaWYgKGRybV9kZXYtPmRyaXZlci0+c3VzcGVuZCkKKwkJcmV0dXJuIGRybV9kZXYtPmRyaXZlci0+c3VzcGVuZChkcm1fZGV2KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGRybV9zeXNmc19yZXN1bWUgLSBEUk0gY2xhc3MgcmVzdW1lIGhvb2sKKyAqIEBkZXY6IExpbnV4IGRldmljZSB0byByZXN1bWUKKyAqCisgKiBKdXN0IGZpZ3VyZXMgb3V0IHdoYXQgdGhlIGFjdHVhbCBzdHJ1Y3QgZHJtX2RldmljZSBhc3NvY2lhdGVkIHdpdGgKKyAqIEBkZXYgaXMgYW5kIGNhbGxzIGl0cyByZXN1bWUgaG9vaywgaWYgcHJlc2VudC4KKyAqLworc3RhdGljIGludCBkcm1fc3lzZnNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2RldiA9IHRvX2RybV9kZXZpY2UoZGV2KTsKKworCWlmIChkcm1fZGV2LT5kcml2ZXItPnJlc3VtZSkKKwkJcmV0dXJuIGRybV9kZXYtPmRyaXZlci0+cmVzdW1lKGRybV9kZXYpOworCisJcmV0dXJuIDA7Cit9CisKIC8qIERpc3BsYXkgdGhlIHZlcnNpb24gb2YgZHJtX2NvcmUuIFRoaXMgZG9lc24ndCB3b3JrIHJpZ2h0IGluIGN1cnJlbnQgZGVzaWduICovCiBzdGF0aWMgc3NpemVfdCB2ZXJzaW9uX3Nob3coc3RydWN0IGNsYXNzICpkZXYsIGNoYXIgKmJ1ZikKIHsKQEAgLTMzLDcgKzcyLDcgQEAKICAqIEBvd25lcjogcG9pbnRlciB0byB0aGUgbW9kdWxlIHRoYXQgaXMgdG8gIm93biIgdGhpcyBzdHJ1Y3QgZHJtX3N5c2ZzX2NsYXNzCiAgKiBAbmFtZTogcG9pbnRlciB0byBhIHN0cmluZyBmb3IgdGhlIG5hbWUgb2YgdGhpcyBjbGFzcy4KICAqCi0gKiBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIGEgc3RydWN0IGRybV9zeXNmc19jbGFzcyBwb2ludGVyIHRoYXQgY2FuIHRoZW4gYmUgdXNlZAorICogVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBEUk0gY2xhc3MgcG9pbnRlciB0aGF0IGNhbiB0aGVuIGJlIHVzZWQKICAqIGluIGNhbGxzIHRvIGRybV9zeXNmc19kZXZpY2VfYWRkKCkuCiAgKgogICogTm90ZSwgdGhlIHBvaW50ZXIgY3JlYXRlZCBoZXJlIGlzIHRvIGJlIGRlc3Ryb3llZCB3aGVuIGZpbmlzaGVkIGJ5IG1ha2luZyBhCkBAIC01MCw2ICs4OSw5IEBACiAJCWdvdG8gZXJyX291dDsKIAl9CiAKKwljbGFzcy0+c3VzcGVuZCA9IGRybV9zeXNmc19zdXNwZW5kOworCWNsYXNzLT5yZXN1bWUgPSBkcm1fc3lzZnNfcmVzdW1lOworCiAJZXJyID0gY2xhc3NfY3JlYXRlX2ZpbGUoY2xhc3MsICZjbGFzc19hdHRyX3ZlcnNpb24pOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX291dF9jbGFzczsKQEAgLTYzLDk0ICsxMDUsMTAwIEBACiB9CiAKIC8qKgotICogZHJtX3N5c2ZzX2Rlc3Ryb3kgLSBkZXN0cm95cyBhIHN0cnVjdCBkcm1fc3lzZnNfY2xhc3Mgc3RydWN0dXJlCi0gKiBAY3M6IHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBkcm1fc3lzZnNfY2xhc3MgdGhhdCBpcyB0byBiZSBkZXN0cm95ZWQKKyAqIGRybV9zeXNmc19kZXN0cm95IC0gZGVzdHJveXMgRFJNIGNsYXNzCiAgKgotICogTm90ZSwgdGhlIHBvaW50ZXIgdG8gYmUgZGVzdHJveWVkIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIGNhbGwgdG8KLSAqIGRybV9zeXNmc19jcmVhdGUoKS4KKyAqIERlc3Ryb3kgdGhlIERSTSBkZXZpY2UgY2xhc3MuCiAgKi8KLXZvaWQgZHJtX3N5c2ZzX2Rlc3Ryb3koc3RydWN0IGNsYXNzICpjbGFzcykKK3ZvaWQgZHJtX3N5c2ZzX2Rlc3Ryb3kodm9pZCkKIHsKLQlpZiAoKGNsYXNzID09IE5VTEwpIHx8IChJU19FUlIoY2xhc3MpKSkKKwlpZiAoKGRybV9jbGFzcyA9PSBOVUxMKSB8fCAoSVNfRVJSKGRybV9jbGFzcykpKQogCQlyZXR1cm47Ci0KLQljbGFzc19yZW1vdmVfZmlsZShjbGFzcywgJmNsYXNzX2F0dHJfdmVyc2lvbik7Ci0JY2xhc3NfZGVzdHJveShjbGFzcyk7CisJY2xhc3NfcmVtb3ZlX2ZpbGUoZHJtX2NsYXNzLCAmY2xhc3NfYXR0cl92ZXJzaW9uKTsKKwljbGFzc19kZXN0cm95KGRybV9jbGFzcyk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfZHJpKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZSwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2hvd19kcmkoc3RydWN0IGRldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiA9ICgoc3RydWN0IGRybV9oZWFkICopY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2aWNlKSktPmRldjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gdG9fZHJtX2RldmljZShkZXZpY2UpOwogCWlmIChkZXYtPmRyaXZlci0+ZHJpX2xpYnJhcnlfbmFtZSkKIAkJcmV0dXJuIGRldi0+ZHJpdmVyLT5kcmlfbGlicmFyeV9uYW1lKGRldiwgYnVmKTsKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgZGV2LT5kcml2ZXItPnBjaV9kcml2ZXIubmFtZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBjbGFzc19kZXZpY2VfYXR0cnNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZpY2VfYXR0cnNbXSA9IHsKIAlfX0FUVFIoZHJpX2xpYnJhcnlfbmFtZSwgU19JUlVHTywgc2hvd19kcmksIE5VTEwpLAogfTsKIAogLyoqCi0gKiBkcm1fc3lzZnNfZGV2aWNlX2FkZCAtIGFkZHMgYSBjbGFzcyBkZXZpY2UgdG8gc3lzZnMgZm9yIGEgY2hhcmFjdGVyIGRyaXZlcgotICogQGNzOiBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgY2xhc3MgdGhhdCB0aGlzIGRldmljZSBzaG91bGQgYmUgcmVnaXN0ZXJlZCB0by4KLSAqIEBkZXY6IHRoZSBkZXZfdCBmb3IgdGhlIGRldmljZSB0byBiZSBhZGRlZC4KLSAqIEBkZXZpY2U6IGEgcG9pbnRlciB0byBhIHN0cnVjdCBkZXZpY2UgdGhhdCBpcyBhc3Npb2NpYXRlZCB3aXRoIHRoaXMgY2xhc3MgZGV2aWNlLgotICogQGZtdDogc3RyaW5nIGZvciB0aGUgY2xhc3MgZGV2aWNlJ3MgbmFtZQorICogZHJtX3N5c2ZzX2RldmljZV9yZWxlYXNlIC0gZG8gbm90aGluZworICogQGRldjogTGludXggZGV2aWNlCiAgKgotICogQSBzdHJ1Y3QgY2xhc3NfZGV2aWNlIHdpbGwgYmUgY3JlYXRlZCBpbiBzeXNmcywgcmVnaXN0ZXJlZCB0byB0aGUgc3BlY2lmaWVkCi0gKiBjbGFzcy4gIEEgImRldiIgZmlsZSB3aWxsIGJlIGNyZWF0ZWQsIHNob3dpbmcgdGhlIGRldl90IGZvciB0aGUgZGV2aWNlLiAgVGhlCi0gKiBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgY2xhc3NfZGV2aWNlIHdpbGwgYmUgcmV0dXJuZWQgZnJvbSB0aGUgY2FsbC4gIEFueSBmdXJ0aGVyCi0gKiBzeXNmcyBmaWxlcyB0aGF0IG1pZ2h0IGJlIHJlcXVpcmVkIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoaXMgcG9pbnRlci4KLSAqIE5vdGU6IHRoZSBzdHJ1Y3QgY2xhc3MgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBoYXZlIHByZXZpb3VzbHkgYmVlbgotICogY3JlYXRlZCB3aXRoIGEgY2FsbCB0byBkcm1fc3lzZnNfY3JlYXRlKCkuCisgKiBOb3JtYWxseSwgdGhpcyB3b3VsZCBmcmVlIHRoZSBEUk0gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBAZGV2LCBhbG9uZworICogd2l0aCBjbGVhbmluZyB1cCBhbnkgb3RoZXIgc3R1ZmYuICBCdXQgd2UgZG8gdGhhdCBpbiB0aGUgRFJNIGNvcmUsIHNvCisgKiB0aGlzIGZ1bmN0aW9uIGNhbiBqdXN0IHJldHVybiBhbmQgaG9wZSB0aGF0IHRoZSBjb3JlIGRvZXMgaXRzIGpvYi4KICAqLwotc3RydWN0IGNsYXNzX2RldmljZSAqZHJtX3N5c2ZzX2RldmljZV9hZGQoc3RydWN0IGNsYXNzICpjcywgc3RydWN0IGRybV9oZWFkICpoZWFkKQorc3RhdGljIHZvaWQgZHJtX3N5c2ZzX2RldmljZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7Ci0JaW50IGksIGosIGVycjsKKwlyZXR1cm47Cit9CiAKLQljbGFzc19kZXYgPSBjbGFzc19kZXZpY2VfY3JlYXRlKGNzLCBOVUxMLAotCQkJCQlNS0RFVihEUk1fTUFKT1IsIGhlYWQtPm1pbm9yKSwKLQkJCQkJJihoZWFkLT5kZXYtPnBkZXYpLT5kZXYsCi0JCQkJCSJjYXJkJWQiLCBoZWFkLT5taW5vcik7Ci0JaWYgKElTX0VSUihjbGFzc19kZXYpKSB7Ci0JCWVyciA9IFBUUl9FUlIoY2xhc3NfZGV2KTsKKy8qKgorICogZHJtX3N5c2ZzX2RldmljZV9hZGQgLSBhZGRzIGEgY2xhc3MgZGV2aWNlIHRvIHN5c2ZzIGZvciBhIGNoYXJhY3RlciBkcml2ZXIKKyAqIEBkZXY6IERSTSBkZXZpY2UgdG8gYmUgYWRkZWQKKyAqIEBoZWFkOiBEUk0gaGVhZCBpbiBxdWVzdGlvbgorICoKKyAqIEFkZCBhIERSTSBkZXZpY2UgdG8gdGhlIERSTSdzIGRldmljZSBtb2RlbCBjbGFzcy4gIFdlIHVzZSBAZGV2J3MgUENJIGRldmljZQorICogYXMgdGhlIHBhcmVudCBmb3IgdGhlIExpbnV4IGRldmljZSwgYW5kIG1ha2Ugc3VyZSBpdCBoYXMgYSBmaWxlIGNvbnRhaW5pbmcKKyAqIHRoZSBkcml2ZXIgd2UncmUgdXNpbmcgKGZvciB1c2Vyc3BhY2UgY29tcGF0aWJpbGl0eSkuCisgKi8KK2ludCBkcm1fc3lzZnNfZGV2aWNlX2FkZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2hlYWQgKmhlYWQpCit7CisJaW50IGVycjsKKwlpbnQgaSwgajsKKworCWRldi0+ZGV2LnBhcmVudCA9ICZkZXYtPnBkZXYtPmRldjsKKwlkZXYtPmRldi5jbGFzcyA9IGRybV9jbGFzczsKKwlkZXYtPmRldi5yZWxlYXNlID0gZHJtX3N5c2ZzX2RldmljZV9yZWxlYXNlOworCWRldi0+ZGV2LmRldnQgPSBoZWFkLT5kZXZpY2U7CisJc25wcmludGYoZGV2LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgImNhcmQlZCIsIGhlYWQtPm1pbm9yKTsKKworCWVyciA9IGRldmljZV9yZWdpc3RlcigmZGV2LT5kZXYpOworCWlmIChlcnIpIHsKKwkJRFJNX0VSUk9SKCJkZXZpY2UgYWRkIGZhaWxlZDogJWRcbiIsIGVycik7CiAJCWdvdG8gZXJyX291dDsKIAl9CiAKLQljbGFzc19zZXRfZGV2ZGF0YShjbGFzc19kZXYsIGhlYWQpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2xhc3NfZGV2aWNlX2F0dHJzKTsgaSsrKSB7Ci0JCWVyciA9IGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShjbGFzc19kZXYsCi0JCQkJCSAgICAgICAmY2xhc3NfZGV2aWNlX2F0dHJzW2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZXZpY2VfYXR0cnMpOyBpKyspIHsKKwkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldmljZV9hdHRyc1tpXSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGVycl9vdXRfZmlsZXM7CiAJfQogCi0JcmV0dXJuIGNsYXNzX2RldjsKKwlyZXR1cm4gMDsKIAogZXJyX291dF9maWxlczoKIAlpZiAoaSA+IDApCiAJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCi0JCQljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUoY2xhc3NfZGV2LAotCQkJCQkJICZjbGFzc19kZXZpY2VfYXR0cnNbaV0pOwotCWNsYXNzX2RldmljZV91bnJlZ2lzdGVyKGNsYXNzX2Rldik7CisJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2aWNlX2F0dHJzW2ldKTsKKwlkZXZpY2VfdW5yZWdpc3RlcigmZGV2LT5kZXYpOwogZXJyX291dDoKLQlyZXR1cm4gRVJSX1BUUihlcnIpOworCisJcmV0dXJuIGVycjsKIH0KIAogLyoqCi0gKiBkcm1fc3lzZnNfZGV2aWNlX3JlbW92ZSAtIHJlbW92ZXMgYSBjbGFzcyBkZXZpY2UgdGhhdCB3YXMgY3JlYXRlZCB3aXRoIGRybV9zeXNmc19kZXZpY2VfYWRkKCkKLSAqIEBkZXY6IHRoZSBkZXZfdCBvZiB0aGUgZGV2aWNlIHRoYXQgd2FzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZC4KKyAqIGRybV9zeXNmc19kZXZpY2VfcmVtb3ZlIC0gcmVtb3ZlIERSTSBkZXZpY2UKKyAqIEBkZXY6IERSTSBkZXZpY2UgdG8gcmVtb3ZlCiAgKgogICogVGhpcyBjYWxsIHVucmVnaXN0ZXJzIGFuZCBjbGVhbnMgdXAgYSBjbGFzcyBkZXZpY2UgdGhhdCB3YXMgY3JlYXRlZCB3aXRoIGEKICAqIGNhbGwgdG8gZHJtX3N5c2ZzX2RldmljZV9hZGQoKQogICovCi12b2lkIGRybV9zeXNmc19kZXZpY2VfcmVtb3ZlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldikKK3ZvaWQgZHJtX3N5c2ZzX2RldmljZV9yZW1vdmUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNsYXNzX2RldmljZV9hdHRycyk7IGkrKykKLQkJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKGNsYXNzX2RldiwgJmNsYXNzX2RldmljZV9hdHRyc1tpXSk7Ci0JY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoY2xhc3NfZGV2KTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZXZpY2VfYXR0cnMpOyBpKyspCisJCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5kZXYsICZkZXZpY2VfYXR0cnNbaV0pOworCWRldmljZV91bnJlZ2lzdGVyKCZkZXYtPmRldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV92bS5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fdm0uYwppbmRleCBlZjVlNmIxLi5jZWE0MTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV92bS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3ZtLmMKQEAgLTE4MCw3ICsxODAsNyBAQAogCQlyZXR1cm4gTk9QQUdFX1NJR0JVUzsKIAlnZXRfcGFnZShwYWdlKTsKIAotCURSTV9ERUJVRygic2htX25vcGFnZSAweCVseFxuIiwgYWRkcmVzcyk7CisJRFJNX0RFQlVHKCIweCVseFxuIiwgYWRkcmVzcyk7CiAJcmV0dXJuIHBhZ2U7CiB9CiAKQEAgLTI5NCw3ICsyOTQsNyBAQAogCiAJZ2V0X3BhZ2UocGFnZSk7CiAKLQlEUk1fREVCVUcoImRtYV9ub3BhZ2UgMHglbHggKHBhZ2UgJWx1KVxuIiwgYWRkcmVzcywgcGFnZV9ucik7CisJRFJNX0RFQlVHKCIweCVseCAocGFnZSAlbHUpXG4iLCBhZGRyZXNzLCBwYWdlX25yKTsKIAlyZXR1cm4gcGFnZTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODEwX2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2RtYS5jCmluZGV4IGViMzgxYTcuLjhkN2VhODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kbWEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZG1hLmMKQEAgLTQwLDcgKzQwLDcgQEAKIAogI2RlZmluZSBJODEwX0JVRl9GUkVFCQkyCiAjZGVmaW5lIEk4MTBfQlVGX0NMSUVOVAkJMQotI2RlZmluZSBJODEwX0JVRl9IQVJEV0FSRSAgICAgIAkwCisjZGVmaW5lIEk4MTBfQlVGX0hBUkRXQVJFCTAKIAogI2RlZmluZSBJODEwX0JVRl9VTk1BUFBFRCAwCiAjZGVmaW5lIEk4MTBfQlVGX01BUFBFRCAgIDEKQEAgLTU3MCw3ICs1NzAsNyBAQAogCWRybV9pODEwX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAl1bnNpZ25lZCBpbnQgZGlydHkgPSBzYXJlYV9wcml2LT5kaXJ0eTsKIAotCURSTV9ERUJVRygiJXMgJXhcbiIsIF9fRlVOQ1RJT05fXywgZGlydHkpOworCURSTV9ERUJVRygiJXhcbiIsIGRpcnR5KTsKIAogCWlmIChkaXJ0eSAmIEk4MTBfVVBMT0FEX0JVRkZFUlMpIHsKIAkJaTgxMEVtaXREZXN0VmVyaWZpZWQoZGV2LCBzYXJlYV9wcml2LT5CdWZmZXJTdGF0ZSk7CkBAIC04MDIsOCArODAyLDcgQEAKIAlpbnQgcGl0Y2ggPSBkZXZfcHJpdi0+cGl0Y2g7CiAJUklOR19MT0NBTFM7CiAKLQlEUk1fREVCVUcoIiVzOiBwYWdlPSVkIHBmQ3VycmVudFBhZ2U9JWRcbiIsCi0JCSAgX19GVU5DVElPTl9fLAorCURSTV9ERUJVRygicGFnZT0lZCBwZkN1cnJlbnRQYWdlPSVkXG4iLAogCQkgIGRldl9wcml2LT5jdXJyZW50X3BhZ2UsCiAJCSAgZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmX2N1cnJlbnRfcGFnZSk7CiAKQEAgLTg0OCw4ICs4NDcsNiBAQAogCWRybV9pODEwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCVJJTkdfTE9DQUxTOwogCi0vKiAgCXByaW50aygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7ICovCi0KIAlpODEwX2tlcm5lbF9sb3N0X2NvbnRleHQoZGV2KTsKIAogCUJFR0lOX0xQX1JJTkcoNCk7CkBAIC04NjksOCArODY2LDYgQEAKIAlpbnQgaSwgcmV0ID0gMDsKIAlSSU5HX0xPQ0FMUzsKIAotLyogIAlwcmludGsoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOyAqLwotCiAJaTgxMF9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CiAKIAlCRUdJTl9MUF9SSU5HKDIpOwpAQCAtOTQ5LDcgKzk0NCw3IEBACiAKIAlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxlX3ByaXYpOwogCi0JRFJNX0RFQlVHKCJpODEwIGRtYSB2ZXJ0ZXgsIGlkeCAlZCB1c2VkICVkIGRpc2NhcmQgJWRcbiIsCisJRFJNX0RFQlVHKCJpZHggJWQgdXNlZCAlZCBkaXNjYXJkICVkXG4iLAogCQkgIHZlcnRleC0+aWR4LCB2ZXJ0ZXgtPnVzZWQsIHZlcnRleC0+ZGlzY2FyZCk7CiAKIAlpZiAodmVydGV4LT5pZHggPCAwIHx8IHZlcnRleC0+aWR4ID4gZG1hLT5idWZfY291bnQpCkBAIC05ODcsNyArOTgyLDcgQEAKIHN0YXRpYyBpbnQgaTgxMF9zd2FwX2J1ZnMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJCSAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7Ci0JRFJNX0RFQlVHKCJpODEwX3N3YXBfYnVmc1xuIik7CisJRFJNX0RFQlVHKCJcbiIpOwogCiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlsZV9wcml2KTsKIApAQCAtMTA2OCwxMSArMTA2MywxMCBAQAogCiAJc2FyZWFfcHJpdi0+ZGlydHkgPSAweDdmOwogCi0JRFJNX0RFQlVHKCJkaXNwYXRjaCBtYyBhZGRyIDB4JWx4LCB1c2VkIDB4JXhcbiIsIGFkZHJlc3MsIHVzZWQpOworCURSTV9ERUJVRygiYWRkciAweCVseCwgdXNlZCAweCV4XG4iLCBhZGRyZXNzLCB1c2VkKTsKIAogCWRldl9wcml2LT5jb3VudGVyKys7CiAJRFJNX0RFQlVHKCJkaXNwYXRjaCBjb3VudGVyIDogJWxkXG4iLCBkZXZfcHJpdi0+Y291bnRlcik7Ci0JRFJNX0RFQlVHKCJpODEwX2RtYV9kaXNwYXRjaF9tY1xuIik7CiAJRFJNX0RFQlVHKCJzdGFydCA6ICVseFxuIiwgc3RhcnQpOwogCURSTV9ERUJVRygidXNlZCA6ICVkXG4iLCB1c2VkKTsKIAlEUk1fREVCVUcoInN0YXJ0ICsgdXNlZCAtIDQgOiAlbGRcbiIsIHN0YXJ0ICsgdXNlZCAtIDQpOwpAQCAtMTE3OSw3ICsxMTczLDcgQEAKIHsKIAlkcm1faTgxMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAotCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJRFJNX0RFQlVHKCJcbiIpOwogCWRldl9wcml2LT5wYWdlX2ZsaXBwaW5nID0gMTsKIAlkZXZfcHJpdi0+Y3VycmVudF9wYWdlID0gMDsKIAlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+cGZfY3VycmVudF9wYWdlID0gZGV2X3ByaXYtPmN1cnJlbnRfcGFnZTsKQEAgLTExODksNyArMTE4Myw3IEBACiB7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKLQlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCURSTV9ERUJVRygiXG4iKTsKIAlpZiAoZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSAhPSAwKQogCQlpODEwX2RtYV9kaXNwYXRjaF9mbGlwKGRldik7CiAKQEAgLTEyMDIsNyArMTE5Niw3IEBACiB7CiAJZHJtX2k4MTBfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKLQlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCURSTV9ERUJVRygiXG4iKTsKIAogCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbGVfcHJpdik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuaAppbmRleCAwYWY0NTg3Li4wMTE4ODQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2Rydi5oCkBAIC0yNSw3ICsyNSw3IEBACiAgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAgKgogICogQXV0aG9yczogUmlja2FyZCBFLiAoUmlrKSBGYWl0aCA8ZmFpdGhAdmFsaW51eC5jb20+Ci0gKiAJICAgIEplZmYgSGFydG1hbm4gPGpoYXJ0bWFubkB2YWxpbnV4LmNvbT4KKyAqCSAgICBKZWZmIEhhcnRtYW5uIDxqaGFydG1hbm5AdmFsaW51eC5jb20+CiAgKgogICovCiAKQEAgLTEzNCw3ICsxMzQsNyBAQAogI2RlZmluZSBJODEwX0FERFIocmVnKQkJKEk4MTBfQkFTRShyZWcpICsgcmVnKQogI2RlZmluZSBJODEwX0RFUkVGKHJlZykJCSooX192b2xhdGlsZV9fIGludCAqKUk4MTBfQUREUihyZWcpCiAjZGVmaW5lIEk4MTBfUkVBRChyZWcpCQlJODEwX0RFUkVGKHJlZykKLSNkZWZpbmUgSTgxMF9XUklURShyZWcsdmFsKSAJZG8geyBJODEwX0RFUkVGKHJlZykgPSB2YWw7IH0gd2hpbGUgKDApCisjZGVmaW5lIEk4MTBfV1JJVEUocmVnLHZhbCkJZG8geyBJODEwX0RFUkVGKHJlZykgPSB2YWw7IH0gd2hpbGUgKDApCiAjZGVmaW5lIEk4MTBfREVSRUYxNihyZWcpCSooX192b2xhdGlsZV9fIHUxNiAqKUk4MTBfQUREUihyZWcpCiAjZGVmaW5lIEk4MTBfUkVBRDE2KHJlZykJSTgxMF9ERVJFRjE2KHJlZykKICNkZWZpbmUgSTgxMF9XUklURTE2KHJlZyx2YWwpCWRvIHsgSTgxMF9ERVJFRjE2KHJlZykgPSB2YWw7IH0gd2hpbGUgKDApCkBAIC0xNDUsNyArMTQ1LDcgQEAKIAogI2RlZmluZSBCRUdJTl9MUF9SSU5HKG4pIGRvIHsJCQkJCQlcCiAJaWYgKEk4MTBfVkVSQk9TRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgRFJNX0RFQlVHKCJCRUdJTl9MUF9SSU5HKCVkKSBpbiAlc1xuIiwgbiwgX19GVU5DVElPTl9fKTsJXAorCQlEUk1fREVCVUcoIkJFR0lOX0xQX1JJTkcoJWQpXG4iLCBuKTsJCQlcCiAJaWYgKGRldl9wcml2LT5yaW5nLnNwYWNlIDwgbio0KQkJCQkJXAogCQlpODEwX3dhaXRfcmluZyhkZXYsIG4qNCk7CQkJCVwKIAlkZXZfcHJpdi0+cmluZy5zcGFjZSAtPSBuKjQ7CQkJCQlcCkBAIC0xNTUsMTkgKzE1NSwxOSBAQAogfSB3aGlsZSAoMCkKIAogI2RlZmluZSBBRFZBTkNFX0xQX1JJTkcoKSBkbyB7CQkJCSAgICAgICAgXAotCWlmIChJODEwX1ZFUkJPU0UpIERSTV9ERUJVRygiQURWQU5DRV9MUF9SSU5HXG4iKTsgICAgCVwKLQlkZXZfcHJpdi0+cmluZy50YWlsID0gb3V0cmluZzsJCSAgICAgICAgCVwKKwlpZiAoSTgxMF9WRVJCT1NFKSBEUk1fREVCVUcoIkFEVkFOQ0VfTFBfUklOR1xuIik7CVwKKwlkZXZfcHJpdi0+cmluZy50YWlsID0gb3V0cmluZzsJCQkJXAogCUk4MTBfV1JJVEUoTFBfUklORyArIFJJTkdfVEFJTCwgb3V0cmluZyk7CSAgICAgICAgXAogfSB3aGlsZSgwKQogCi0jZGVmaW5lIE9VVF9SSU5HKG4pIGRvIHsgIAkJCQkgICAgICAgICAgICAgICAgXAorI2RlZmluZSBPVVRfUklORyhuKSBkbyB7CQkJCSAgICAgICAgICAgICAgICBcCiAJaWYgKEk4MTBfVkVSQk9TRSkgRFJNX0RFQlVHKCIgICBPVVRfUklORyAleFxuIiwgKGludCkobikpOwlcCiAJKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikodmlydCArIG91dHJpbmcpID0gbjsJICAgICAgICAgICAgICAgIFwKIAlvdXRyaW5nICs9IDQ7CQkJCQkgICAgICAgICAgICAgICAgXAogCW91dHJpbmcgJj0gcmluZ21hc2s7CQkJICAgICAgICAgICAgICAgICAgICAgICAgXAogfSB3aGlsZSAoMCkKIAotI2RlZmluZSBHRlhfT1BfVVNFUl9JTlRFUlJVUFQgCQkoKDA8PDI5KXwoMjw8MjMpKQorI2RlZmluZSBHRlhfT1BfVVNFUl9JTlRFUlJVUFQJCSgoMDw8MjkpfCgyPDwyMykpCiAjZGVmaW5lIEdGWF9PUF9CUkVBS1BPSU5UX0lOVEVSUlVQVAkoKDA8PDI5KXwoMTw8MjMpKQogI2RlZmluZSBDTURfUkVQT1JUX0hFQUQJCQkoNzw8MjMpCiAjZGVmaW5lIENNRF9TVE9SRV9EV09SRF9JRFgJCSgoMHgyMTw8MjMpIHwgMHgxKQpAQCAtMTg0LDI4ICsxODQsMjggQEAKIAogI2RlZmluZSBJODEwUkVHX0hXU1RBTQkJMHgwMjA5OAogI2RlZmluZSBJODEwUkVHX0lOVF9JREVOVElUWV9SCTB4MDIwYTQKLSNkZWZpbmUgSTgxMFJFR19JTlRfTUFTS19SIAkweDAyMGE4CisjZGVmaW5lIEk4MTBSRUdfSU5UX01BU0tfUgkweDAyMGE4CiAjZGVmaW5lIEk4MTBSRUdfSU5UX0VOQUJMRV9SCTB4MDIwYTAKIAotI2RlZmluZSBMUF9SSU5HICAgICAJCTB4MjAzMAotI2RlZmluZSBIUF9SSU5HICAgICAJCTB4MjA0MAotI2RlZmluZSBSSU5HX1RBSUwgICAgICAJCTB4MDAKKyNkZWZpbmUgTFBfUklORwkJCTB4MjAzMAorI2RlZmluZSBIUF9SSU5HCQkJMHgyMDQwCisjZGVmaW5lIFJJTkdfVEFJTAkJMHgwMAogI2RlZmluZSBUQUlMX0FERFIJCTB4MDAwRkZGRjgKLSNkZWZpbmUgUklOR19IRUFEICAgICAgCQkweDA0Ci0jZGVmaW5lIEhFQURfV1JBUF9DT1VOVCAgICAgCTB4RkZFMDAwMDAKLSNkZWZpbmUgSEVBRF9XUkFQX09ORSAgICAgICAJMHgwMDIwMDAwMAotI2RlZmluZSBIRUFEX0FERFIgICAgICAgICAgIAkweDAwMUZGRkZDCi0jZGVmaW5lIFJJTkdfU1RBUlQgICAgIAkJMHgwOAotI2RlZmluZSBTVEFSVF9BRERSICAgICAgICAgIAkweDAwRkZGRkY4Ci0jZGVmaW5lIFJJTkdfTEVOICAgICAgIAkJMHgwQwotI2RlZmluZSBSSU5HX05SX1BBR0VTICAgICAgIAkweDAwMEZGMDAwCi0jZGVmaW5lIFJJTkdfUkVQT1JUX01BU0sgICAgCTB4MDAwMDAwMDYKLSNkZWZpbmUgUklOR19SRVBPUlRfNjRLICAgICAJMHgwMDAwMDAwMgotI2RlZmluZSBSSU5HX1JFUE9SVF8xMjhLICAgIAkweDAwMDAwMDA0Ci0jZGVmaW5lIFJJTkdfTk9fUkVQT1JUICAgICAgCTB4MDAwMDAwMDAKLSNkZWZpbmUgUklOR19WQUxJRF9NQVNLICAgICAJMHgwMDAwMDAwMQotI2RlZmluZSBSSU5HX1ZBTElEICAgICAgICAgIAkweDAwMDAwMDAxCi0jZGVmaW5lIFJJTkdfSU5WQUxJRCAgICAgICAgCTB4MDAwMDAwMDAKKyNkZWZpbmUgUklOR19IRUFECQkweDA0CisjZGVmaW5lIEhFQURfV1JBUF9DT1VOVAkJMHhGRkUwMDAwMAorI2RlZmluZSBIRUFEX1dSQVBfT05FCQkweDAwMjAwMDAwCisjZGVmaW5lIEhFQURfQUREUgkJMHgwMDFGRkZGQworI2RlZmluZSBSSU5HX1NUQVJUCQkweDA4CisjZGVmaW5lIFNUQVJUX0FERFIJCTB4MDBGRkZGRjgKKyNkZWZpbmUgUklOR19MRU4JCTB4MEMKKyNkZWZpbmUgUklOR19OUl9QQUdFUwkJMHgwMDBGRjAwMAorI2RlZmluZSBSSU5HX1JFUE9SVF9NQVNLCTB4MDAwMDAwMDYKKyNkZWZpbmUgUklOR19SRVBPUlRfNjRLCQkweDAwMDAwMDAyCisjZGVmaW5lIFJJTkdfUkVQT1JUXzEyOEsJMHgwMDAwMDAwNAorI2RlZmluZSBSSU5HX05PX1JFUE9SVAkJMHgwMDAwMDAwMAorI2RlZmluZSBSSU5HX1ZBTElEX01BU0sJCTB4MDAwMDAwMDEKKyNkZWZpbmUgUklOR19WQUxJRAkJMHgwMDAwMDAwMQorI2RlZmluZSBSSU5HX0lOVkFMSUQJCTB4MDAwMDAwMDAKIAogI2RlZmluZSBHRlhfT1BfU0NJU1NPUiAgICAgICAgICgoMHgzPDwyOSl8KDB4MWM8PDI0KXwoMHgxMDw8MTkpKQogI2RlZmluZSBTQ19VUERBVEVfU0NJU1NPUiAgICAgICAoMHgxPDwxKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2RtYS5jCmluZGV4IDY5YTM2M2UuLjM3OWNiZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kbWEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZG1hLmMKQEAgLTQyLDcgKzQyLDcgQEAKIAogI2RlZmluZSBJODMwX0JVRl9GUkVFCQkyCiAjZGVmaW5lIEk4MzBfQlVGX0NMSUVOVAkJMQotI2RlZmluZSBJODMwX0JVRl9IQVJEV0FSRSAgICAgIAkwCisjZGVmaW5lIEk4MzBfQlVGX0hBUkRXQVJFCTAKIAogI2RlZmluZSBJODMwX0JVRl9VTk1BUFBFRCAwCiAjZGVmaW5lIEk4MzBfQlVGX01BUFBFRCAgIDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcm0uaAppbmRleCA5NjhhNmQ5Li40YjAwZDJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJtLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2RybS5oCkBAIC0xMiw5ICsxMiw5IEBACiAjZGVmaW5lIF9JODMwX0RFRklORVNfCiAKICNkZWZpbmUgSTgzMF9ETUFfQlVGX09SREVSCQkxMgotI2RlZmluZSBJODMwX0RNQV9CVUZfU1ogCQkoMTw8STgzMF9ETUFfQlVGX09SREVSKQotI2RlZmluZSBJODMwX0RNQV9CVUZfTlIgCQkyNTYKLSNkZWZpbmUgSTgzMF9OUl9TQVJFQV9DTElQUkVDVFMgCTgKKyNkZWZpbmUgSTgzMF9ETUFfQlVGX1NaCQkJKDE8PEk4MzBfRE1BX0JVRl9PUkRFUikKKyNkZWZpbmUgSTgzMF9ETUFfQlVGX05SCQkJMjU2CisjZGVmaW5lIEk4MzBfTlJfU0FSRUFfQ0xJUFJFQ1RTCQk4CiAKIC8qIEVhY2ggcmVnaW9uIGlzIGEgbWluaW11bSBvZiA2NGssIGFuZCB0aGVyZSBhcmUgYXQgbW9zdCA2NCBvZiB0aGVtLgogICovCkBAIC01OCw3ICs1OCw3IEBACiAjZGVmaW5lIEk4MzBfVVBMT0FEX1RFWEJMRU5EX01BU0sJMHhmMDAwMDAKICNkZWZpbmUgSTgzMF9VUExPQURfVEVYX1BBTEVUVEVfTihuKSAgICAoMHgxMDAwMDAwIDw8IChuKSkKICNkZWZpbmUgSTgzMF9VUExPQURfVEVYX1BBTEVUVEVfU0hBUkVECTB4NDAwMDAwMAotI2RlZmluZSBJODMwX1VQTE9BRF9TVElQUExFICAgICAgICAgCTB4ODAwMDAwMAorI2RlZmluZSBJODMwX1VQTE9BRF9TVElQUExFCQkweDgwMDAwMDAKIAogLyogSW5kaWNlcyBpbnRvIGJ1Zi5TZXR1cCB3aGVyZSB2YXJpb3VzIGJpdHMgb2Ygc3RhdGUgYXJlIG1pcnJvcmVkIHBlcgogICogY29udGV4dCBhbmQgcGVyIGJ1ZmZlci4gIFRoZXNlIGNhbiBiZSBmaXJlZCBhdCB0aGUgY2FyZCBhcyBhIHVuaXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmgKaW5kZXggZGIzYTlmYS4uNGNhYmE4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuaApAQCAtMjUsNyArMjUsNyBAQAogICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogICoKICAqIEF1dGhvcnM6IFJpY2thcmQgRS4gKFJpaykgRmFpdGggPGZhaXRoQHZhbGludXguY29tPgotICogCSAgICBKZWZmIEhhcnRtYW5uIDxqaGFydG1hbm5AdmFsaW51eC5jb20+CisgKgkgICAgSmVmZiBIYXJ0bWFubiA8amhhcnRtYW5uQHZhbGludXguY29tPgogICoKICAqLwogCkBAIC0xNTYsOCArMTU2LDcgQEAKIAogI2RlZmluZSBCRUdJTl9MUF9SSU5HKG4pIGRvIHsJCQkJXAogCWlmIChJODMwX1ZFUkJPU0UpCQkJCVwKLQkJcHJpbnRrKCJCRUdJTl9MUF9SSU5HKCVkKSBpbiAlc1xuIiwJXAotCQkJICBuLCBfX0ZVTkNUSU9OX18pOwkJXAorCQlwcmludGsoIkJFR0lOX0xQX1JJTkcoJWQpXG4iLCAobikpOwlcCiAJaWYgKGRldl9wcml2LT5yaW5nLnNwYWNlIDwgbio0KQkJCVwKIAkJaTgzMF93YWl0X3JpbmcoZGV2LCBuKjQsIF9fRlVOQ1RJT05fXyk7CQlcCiAJb3V0Y291bnQgPSAwOwkJCQkJXApAQCAtMTgzLDcgKzE4Miw3IEBACiAKIGV4dGVybiBpbnQgaTgzMF93YWl0X3Jpbmcoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsIGludCBuLCBjb25zdCBjaGFyICpjYWxsZXIpOwogCi0jZGVmaW5lIEdGWF9PUF9VU0VSX0lOVEVSUlVQVCAJCSgoMDw8MjkpfCgyPDwyMykpCisjZGVmaW5lIEdGWF9PUF9VU0VSX0lOVEVSUlVQVAkJKCgwPDwyOSl8KDI8PDIzKSkKICNkZWZpbmUgR0ZYX09QX0JSRUFLUE9JTlRfSU5URVJSVVBUCSgoMDw8MjkpfCgxPDwyMykpCiAjZGVmaW5lIENNRF9SRVBPUlRfSEVBRAkJCSg3PDwyMykKICNkZWZpbmUgQ01EX1NUT1JFX0RXT1JEX0lEWAkJKCgweDIxPDwyMykgfCAweDEpCkBAIC0yMDMsMzAgKzIwMiwzMCBAQAogCiAjZGVmaW5lIEk4MzBSRUdfSFdTVEFNCQkweDAyMDk4CiAjZGVmaW5lIEk4MzBSRUdfSU5UX0lERU5USVRZX1IJMHgwMjBhNAotI2RlZmluZSBJODMwUkVHX0lOVF9NQVNLX1IgCTB4MDIwYTgKKyNkZWZpbmUgSTgzMFJFR19JTlRfTUFTS19SCTB4MDIwYTgKICNkZWZpbmUgSTgzMFJFR19JTlRfRU5BQkxFX1IJMHgwMjBhMAogCiAjZGVmaW5lIEk4MzBfSVJRX1JFU0VSVkVEICgoMTw8MTMpfCgzPDwyKSkKIAotI2RlZmluZSBMUF9SSU5HICAgICAJCTB4MjAzMAotI2RlZmluZSBIUF9SSU5HICAgICAJCTB4MjA0MAotI2RlZmluZSBSSU5HX1RBSUwgICAgICAJCTB4MDAKKyNkZWZpbmUgTFBfUklORwkJCTB4MjAzMAorI2RlZmluZSBIUF9SSU5HCQkJMHgyMDQwCisjZGVmaW5lIFJJTkdfVEFJTAkJMHgwMAogI2RlZmluZSBUQUlMX0FERFIJCTB4MDAxRkZGRjgKLSNkZWZpbmUgUklOR19IRUFEICAgICAgCQkweDA0Ci0jZGVmaW5lIEhFQURfV1JBUF9DT1VOVCAgICAgCTB4RkZFMDAwMDAKLSNkZWZpbmUgSEVBRF9XUkFQX09ORSAgICAgICAJMHgwMDIwMDAwMAotI2RlZmluZSBIRUFEX0FERFIgICAgICAgICAgIAkweDAwMUZGRkZDCi0jZGVmaW5lIFJJTkdfU1RBUlQgICAgIAkJMHgwOAotI2RlZmluZSBTVEFSVF9BRERSICAgICAgICAgIAkweDB4RkZGRkYwMDAKLSNkZWZpbmUgUklOR19MRU4gICAgICAgCQkweDBDCi0jZGVmaW5lIFJJTkdfTlJfUEFHRVMgICAgICAgCTB4MDAxRkYwMDAKLSNkZWZpbmUgUklOR19SRVBPUlRfTUFTSyAgICAJMHgwMDAwMDAwNgotI2RlZmluZSBSSU5HX1JFUE9SVF82NEsgICAgIAkweDAwMDAwMDAyCi0jZGVmaW5lIFJJTkdfUkVQT1JUXzEyOEsgICAgCTB4MDAwMDAwMDQKLSNkZWZpbmUgUklOR19OT19SRVBPUlQgICAgICAJMHgwMDAwMDAwMAotI2RlZmluZSBSSU5HX1ZBTElEX01BU0sgICAgIAkweDAwMDAwMDAxCi0jZGVmaW5lIFJJTkdfVkFMSUQgICAgICAgICAgCTB4MDAwMDAwMDEKLSNkZWZpbmUgUklOR19JTlZBTElEICAgICAgICAJMHgwMDAwMDAwMAorI2RlZmluZSBSSU5HX0hFQUQJCTB4MDQKKyNkZWZpbmUgSEVBRF9XUkFQX0NPVU5UCQkweEZGRTAwMDAwCisjZGVmaW5lIEhFQURfV1JBUF9PTkUJCTB4MDAyMDAwMDAKKyNkZWZpbmUgSEVBRF9BRERSCQkweDAwMUZGRkZDCisjZGVmaW5lIFJJTkdfU1RBUlQJCTB4MDgKKyNkZWZpbmUgU1RBUlRfQUREUgkJMHgweEZGRkZGMDAwCisjZGVmaW5lIFJJTkdfTEVOCQkweDBDCisjZGVmaW5lIFJJTkdfTlJfUEFHRVMJCTB4MDAxRkYwMDAKKyNkZWZpbmUgUklOR19SRVBPUlRfTUFTSwkweDAwMDAwMDA2CisjZGVmaW5lIFJJTkdfUkVQT1JUXzY0SwkJMHgwMDAwMDAwMgorI2RlZmluZSBSSU5HX1JFUE9SVF8xMjhLCTB4MDAwMDAwMDQKKyNkZWZpbmUgUklOR19OT19SRVBPUlQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgUklOR19WQUxJRF9NQVNLCQkweDAwMDAwMDAxCisjZGVmaW5lIFJJTkdfVkFMSUQJCTB4MDAwMDAwMDEKKyNkZWZpbmUgUklOR19JTlZBTElECQkweDAwMDAwMDAwCiAKICNkZWZpbmUgR0ZYX09QX1NDSVNTT1IgICAgICAgICAoKDB4Mzw8MjkpfCgweDFjPDwyNCl8KDB4MTA8PDE5KSkKICNkZWZpbmUgU0NfVVBEQVRFX1NDSVNTT1IgICAgICAgKDB4MTw8MSkKQEAgLTI3OSw5ICsyNzgsOSBAQAogI2RlZmluZSBYWV9TUkNfQ09QWV9CTFRfV1JJVEVfQUxQSEEgICAgICgxPDwyMSkKICNkZWZpbmUgWFlfU1JDX0NPUFlfQkxUX1dSSVRFX1JHQiAgICAgICAoMTw8MjApCiAKLSNkZWZpbmUgTUlfQkFUQ0hfQlVGRkVSIAkoKDB4MzA8PDIzKXwxKQotI2RlZmluZSBNSV9CQVRDSF9CVUZGRVJfU1RBUlQgCSgweDMxPDwyMykKLSNkZWZpbmUgTUlfQkFUQ0hfQlVGRkVSX0VORCAJKDB4QTw8MjMpCisjZGVmaW5lIE1JX0JBVENIX0JVRkZFUgkJKCgweDMwPDwyMyl8MSkKKyNkZWZpbmUgTUlfQkFUQ0hfQlVGRkVSX1NUQVJUCSgweDMxPDwyMykKKyNkZWZpbmUgTUlfQkFUQ0hfQlVGRkVSX0VORAkoMHhBPDwyMykKICNkZWZpbmUgTUlfQkFUQ0hfTk9OX1NFQ1VSRQkoMSkKIAogI2RlZmluZSBNSV9XQUlUX0ZPUl9FVkVOVCAgICAgICAoKDB4Mzw8MjMpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2lycS5jCmluZGV4IDc2NDAzZjQuLmEzM2RiNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9pcnEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfaXJxLmMKQEAgLTE0NCw3ICsxNDQsNyBAQAogCQkgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQogewogCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCWRybV9pODMwX2lycV93YWl0X3QgKmlycXdhaXQgPSBkYXRhOyAKKwlkcm1faTgzMF9pcnFfd2FpdF90ICppcnF3YWl0ID0gZGF0YTsKIAogCWlmICghZGV2X3ByaXYpIHsKIAkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kbWEuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kbWEuYwppbmRleCBlNjFhNDNlLi40Mzk4NmQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZG1hLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RtYS5jCkBAIC0zMSwxNyArMzEsNiBAQAogI2luY2x1ZGUgImk5MTVfZHJtLmgiCiAjaW5jbHVkZSAiaTkxNV9kcnYuaCIKIAotI2RlZmluZSBJU19JOTY1RyhkZXYpIChkZXYtPnBjaV9kZXZpY2UgPT0gMHgyOTcyIHx8IFwKLQkJICAgICAgIGRldi0+cGNpX2RldmljZSA9PSAweDI5ODIgfHwgXAotCQkgICAgICAgZGV2LT5wY2lfZGV2aWNlID09IDB4Mjk5MiB8fCBcCi0JCSAgICAgICBkZXYtPnBjaV9kZXZpY2UgPT0gMHgyOUEyIHx8IFwKLQkJICAgICAgIGRldi0+cGNpX2RldmljZSA9PSAweDJBMDIgfHwgXAotCQkgICAgICAgZGV2LT5wY2lfZGV2aWNlID09IDB4MkExMikKLQotI2RlZmluZSBJU19HMzMoZGV2KSAoZGV2LT5wY2lfZGV2aWNlID09IDB4MjliMiB8fCBcCi0JCSAgICAgZGV2LT5wY2lfZGV2aWNlID09IDB4MjljMiB8fCBcCi0JCSAgICAgZGV2LT5wY2lfZGV2aWNlID09IDB4MjlkMikKLQogLyogUmVhbGx5IHdhbnQgYW4gT1MtaW5kZXBlbmRlbnQgcmVzZXR0YWJsZSB0aW1lci4gIFdvdWxkIGxpa2UgdG8gaGF2ZQogICogdGhpcyBsb29wIHJ1biBmb3IgKGVnKSAzIHNlYywgYnV0IGhhdmUgdGhlIHRpbWVyIHJlc2V0IGV2ZXJ5IHRpbWUKICAqIHRoZSBoZWFkIHBvaW50ZXIgY2hhbmdlcywgc28gdGhhdCBFQlVTWSBvbmx5IGhhcHBlbnMgaWYgdGhlIHJpbmcKQEAgLTkwLDYgKzc5LDcgQEAKIAogc3RhdGljIGludCBpOTE1X2RtYV9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2KQogeworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCS8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBoZXJlIGJlY2F1c2UgdGhlIHVuaW5zdGFsbCBpb2N0bAogCSAqIG1heSBub3QgaGF2ZSBiZWVuIGNhbGxlZCBmcm9tIHVzZXJzcGFjZSBhbmQgYWZ0ZXIgZGV2X3ByaXZhdGUKIAkgKiBpcyBmcmVlZCwgaXQncyB0b28gbGF0ZS4KQEAgLTk3LDUyICs4Nyw0MiBAQAogCWlmIChkZXYtPmlycSkKIAkJZHJtX2lycV91bmluc3RhbGwoZGV2KTsKIAotCWlmIChkZXYtPmRldl9wcml2YXRlKSB7Ci0JCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPQotCQkgICAgKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCWlmIChkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0KSB7CisJCWRybV9jb3JlX2lvcmVtYXBmcmVlKCZkZXZfcHJpdi0+cmluZy5tYXAsIGRldik7CisJCWRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQgPSAwOworCQlkZXZfcHJpdi0+cmluZy5tYXAuaGFuZGxlID0gMDsKKwkJZGV2X3ByaXYtPnJpbmcubWFwLnNpemUgPSAwOworCX0KIAotCQlpZiAoZGV2X3ByaXYtPnJpbmcudmlydHVhbF9zdGFydCkgewotCQkJZHJtX2NvcmVfaW9yZW1hcGZyZWUoJmRldl9wcml2LT5yaW5nLm1hcCwgZGV2KTsKLQkJfQorCWlmIChkZXZfcHJpdi0+c3RhdHVzX3BhZ2VfZG1haCkgeworCQlkcm1fcGNpX2ZyZWUoZGV2LCBkZXZfcHJpdi0+c3RhdHVzX3BhZ2VfZG1haCk7CisJCWRldl9wcml2LT5zdGF0dXNfcGFnZV9kbWFoID0gTlVMTDsKKwkJLyogTmVlZCB0byByZXdyaXRlIGhhcmR3YXJlIHN0YXR1cyBwYWdlICovCisJCUk5MTVfV1JJVEUoMHgwMjA4MCwgMHgxZmZmZjAwMCk7CisJfQogCi0JCWlmIChkZXZfcHJpdi0+c3RhdHVzX3BhZ2VfZG1haCkgewotCQkJZHJtX3BjaV9mcmVlKGRldiwgZGV2X3ByaXYtPnN0YXR1c19wYWdlX2RtYWgpOwotCQkJLyogTmVlZCB0byByZXdyaXRlIGhhcmR3YXJlIHN0YXR1cyBwYWdlICovCi0JCQlJOTE1X1dSSVRFKDB4MDIwODAsIDB4MWZmZmYwMDApOwotCQl9Ci0KLQkJaWYgKGRldl9wcml2LT5zdGF0dXNfZ2Z4X2FkZHIpIHsKLQkJCWRldl9wcml2LT5zdGF0dXNfZ2Z4X2FkZHIgPSAwOwotCQkJZHJtX2NvcmVfaW9yZW1hcGZyZWUoJmRldl9wcml2LT5od3NfbWFwLCBkZXYpOwotCQkJSTkxNV9XUklURSgweDIwODAsIDB4MWZmZmYwMDApOwotCQl9Ci0KLQkJZHJtX2ZyZWUoZGV2LT5kZXZfcHJpdmF0ZSwgc2l6ZW9mKGRybV9pOTE1X3ByaXZhdGVfdCksCi0JCQkgRFJNX01FTV9EUklWRVIpOwotCi0JCWRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOworCWlmIChkZXZfcHJpdi0+c3RhdHVzX2dmeF9hZGRyKSB7CisJCWRldl9wcml2LT5zdGF0dXNfZ2Z4X2FkZHIgPSAwOworCQlkcm1fY29yZV9pb3JlbWFwZnJlZSgmZGV2X3ByaXYtPmh3c19tYXAsIGRldik7CisJCUk5MTVfV1JJVEUoMHgyMDgwLCAweDFmZmZmMDAwKTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpOTE1X2luaXRpYWxpemUoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYsCi0JCQkgICBkcm1faTkxNV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKLQkJCSAgIGRybV9pOTE1X2luaXRfdCAqIGluaXQpCitzdGF0aWMgaW50IGk5MTVfaW5pdGlhbGl6ZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgZHJtX2k5MTVfaW5pdF90ICogaW5pdCkKIHsKLQltZW1zZXQoZGV2X3ByaXYsIDAsIHNpemVvZihkcm1faTkxNV9wcml2YXRlX3QpKTsKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAogCWRldl9wcml2LT5zYXJlYSA9IGRybV9nZXRzYXJlYShkZXYpOwogCWlmICghZGV2X3ByaXYtPnNhcmVhKSB7CiAJCURSTV9FUlJPUigiY2FuIG5vdCBmaW5kIHNhcmVhIVxuIik7Ci0JCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OwogCQlpOTE1X2RtYV9jbGVhbnVwKGRldik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWRldl9wcml2LT5tbWlvX21hcCA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5tbWlvX29mZnNldCk7CiAJaWYgKCFkZXZfcHJpdi0+bW1pb19tYXApIHsKLQkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CiAJCWk5MTVfZG1hX2NsZWFudXAoZGV2KTsKIAkJRFJNX0VSUk9SKCJjYW4gbm90IGZpbmQgbW1pbyBtYXAhXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNjUsNyArMTQ1LDYgQEAKIAlkcm1fY29yZV9pb3JlbWFwKCZkZXZfcHJpdi0+cmluZy5tYXAsIGRldik7CiAKIAlpZiAoZGV2X3ByaXYtPnJpbmcubWFwLmhhbmRsZSA9PSBOVUxMKSB7Ci0JCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OwogCQlpOTE1X2RtYV9jbGVhbnVwKGRldik7CiAJCURSTV9FUlJPUigiY2FuIG5vdCBpb3JlbWFwIHZpcnR1YWwgYWRkcmVzcyBmb3IiCiAJCQkgICIgcmluZyBidWZmZXJcbiIpOwpAQCAtMTk3LDcgKzE3Niw2IEBACiAJCQlkcm1fcGNpX2FsbG9jKGRldiwgUEFHRV9TSVpFLCBQQUdFX1NJWkUsIDB4ZmZmZmZmZmYpOwogCiAJCWlmICghZGV2X3ByaXYtPnN0YXR1c19wYWdlX2RtYWgpIHsKLQkJCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OwogCQkJaTkxNV9kbWFfY2xlYW51cChkZXYpOwogCQkJRFJNX0VSUk9SKCJDYW4gbm90IGFsbG9jYXRlIGhhcmR3YXJlIHN0YXR1cyBwYWdlXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwpAQCAtMjA5LDcgKzE4Nyw2IEBACiAJCUk5MTVfV1JJVEUoMHgwMjA4MCwgZGV2X3ByaXYtPmRtYV9zdGF0dXNfcGFnZSk7CiAJfQogCURSTV9ERUJVRygiRW5hYmxlZCBoYXJkd2FyZSBzdGF0dXMgcGFnZVxuIik7Ci0JZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI1NCwxNyArMjMxLDEyIEBACiBzdGF0aWMgaW50IGk5MTVfZG1hX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAkJCSBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdikKIHsKLQlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2OwogCWRybV9pOTE1X2luaXRfdCAqaW5pdCA9IGRhdGE7CiAJaW50IHJldGNvZGUgPSAwOwogCiAJc3dpdGNoIChpbml0LT5mdW5jKSB7CiAJY2FzZSBJOTE1X0lOSVRfRE1BOgotCQlkZXZfcHJpdiA9IGRybV9hbGxvYyhzaXplb2YoZHJtX2k5MTVfcHJpdmF0ZV90KSwKLQkJCQkgICAgIERSTV9NRU1fRFJJVkVSKTsKLQkJaWYgKGRldl9wcml2ID09IE5VTEwpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJcmV0Y29kZSA9IGk5MTVfaW5pdGlhbGl6ZShkZXYsIGRldl9wcml2LCBpbml0KTsKKwkJcmV0Y29kZSA9IGk5MTVfaW5pdGlhbGl6ZShkZXYsIGluaXQpOwogCQlicmVhazsKIAljYXNlIEk5MTVfQ0xFQU5VUF9ETUE6CiAJCXJldGNvZGUgPSBpOTE1X2RtYV9jbGVhbnVwKGRldik7CkBAIC0zNTEsNyArMzIzLDcgQEAKIHsKIAlpbnQgcmV0ID0gZG9fdmFsaWRhdGVfY21kKGNtZCk7CiAKLS8qIAlwcmludGsoInZhbGlkYXRlX2NtZCggJXggKTogJWRcbiIsIGNtZCwgcmV0KTsgKi8KKy8qCXByaW50aygidmFsaWRhdGVfY21kKCAleCApOiAlZFxuIiwgY21kLCByZXQpOyAqLwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTY4NSw3ICs2NTcsNyBAQAogCWludCB2YWx1ZTsKIAogCWlmICghZGV2X3ByaXYpIHsKLQkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJRFJNX0VSUk9SKCJjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNzE5LDcgKzY5MSw3IEBACiAJZHJtX2k5MTVfc2V0cGFyYW1fdCAqcGFyYW0gPSBkYXRhOwogCiAJaWYgKCFkZXZfcHJpdikgewotCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEUk1fRVJST1IoImNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC03NDksNyArNzIxLDcgQEAKIAlkcm1faTkxNV9od3NfYWRkcl90ICpod3MgPSBkYXRhOwogCiAJaWYgKCFkZXZfcHJpdikgewotCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEUk1fRVJST1IoImNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC03NTcsNyArNzI5LDcgQEAKIAogCWRldl9wcml2LT5zdGF0dXNfZ2Z4X2FkZHIgPSBod3MtPmFkZHIgJiAoMHgxZmZmZjw8MTIpOwogCi0JZGV2X3ByaXYtPmh3c19tYXAub2Zmc2V0ID0gZGV2LT5hZ3AtPmFncF9pbmZvLmFwZXJfYmFzZSArIGh3cy0+YWRkcjsKKwlkZXZfcHJpdi0+aHdzX21hcC5vZmZzZXQgPSBkZXYtPmFncC0+YmFzZSArIGh3cy0+YWRkcjsKIAlkZXZfcHJpdi0+aHdzX21hcC5zaXplID0gNCoxMDI0OwogCWRldl9wcml2LT5od3NfbWFwLnR5cGUgPSAwOwogCWRldl9wcml2LT5od3NfbWFwLmZsYWdzID0gMDsKQEAgLTc2NSw3ICs3MzcsNiBAQAogCiAJZHJtX2NvcmVfaW9yZW1hcCgmZGV2X3ByaXYtPmh3c19tYXAsIGRldik7CiAJaWYgKGRldl9wcml2LT5od3NfbWFwLmhhbmRsZSA9PSBOVUxMKSB7Ci0JCWRldi0+ZGV2X3ByaXZhdGUgPSAodm9pZCAqKWRldl9wcml2OwogCQlpOTE1X2RtYV9jbGVhbnVwKGRldik7CiAJCWRldl9wcml2LT5zdGF0dXNfZ2Z4X2FkZHIgPSAwOwogCQlEUk1fRVJST1IoImNhbiBub3QgaW9yZW1hcCB2aXJ0dWFsIGFkZHJlc3MgZm9yIgpAQCAtNzg0LDYgKzc1NSwxMCBAQAogCiBpbnQgaTkxNV9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQogeworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgbG9uZyBiYXNlLCBzaXplOworCWludCByZXQgPSAwLCBtbWlvX2JhciA9IElTX0k5WFgoZGV2KSA/IDAgOiAxOworCiAJLyogaTkxNSBoYXMgNCBtb3JlIGNvdW50ZXJzICovCiAJZGV2LT5jb3VudGVycyArPSA0OwogCWRldi0+dHlwZXNbNl0gPSBfRFJNX1NUQVRfSVJROwpAQCAtNzkxLDI0ICs3NjYsNTEgQEAKIAlkZXYtPnR5cGVzWzhdID0gX0RSTV9TVEFUX1NFQ09OREFSWTsKIAlkZXYtPnR5cGVzWzldID0gX0RSTV9TVEFUX0RNQTsKIAorCWRldl9wcml2ID0gZHJtX2FsbG9jKHNpemVvZihkcm1faTkxNV9wcml2YXRlX3QpLCBEUk1fTUVNX0RSSVZFUik7CisJaWYgKGRldl9wcml2ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KGRldl9wcml2LCAwLCBzaXplb2YoZHJtX2k5MTVfcHJpdmF0ZV90KSk7CisKKwlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKworCS8qIEFkZCByZWdpc3RlciBtYXAgKG5lZWRlZCBmb3Igc3VzcGVuZC9yZXN1bWUpICovCisJYmFzZSA9IGRybV9nZXRfcmVzb3VyY2Vfc3RhcnQoZGV2LCBtbWlvX2Jhcik7CisJc2l6ZSA9IGRybV9nZXRfcmVzb3VyY2VfbGVuKGRldiwgbW1pb19iYXIpOworCisJcmV0ID0gZHJtX2FkZG1hcChkZXYsIGJhc2UsIHNpemUsIF9EUk1fUkVHSVNURVJTLAorCQkJIF9EUk1fS0VSTkVMIHwgX0RSTV9EUklWRVIsCisJCQkgJmRldl9wcml2LT5tbWlvX21hcCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGk5MTVfZHJpdmVyX3VubG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoZGV2X3ByaXYtPm1taW9fbWFwKQorCQlkcm1fcm1tYXAoZGV2LCBkZXZfcHJpdi0+bW1pb19tYXApOworCisJZHJtX2ZyZWUoZGV2LT5kZXZfcHJpdmF0ZSwgc2l6ZW9mKGRybV9pOTE1X3ByaXZhdGVfdCksCisJCSBEUk1fTUVNX0RSSVZFUik7CisKIAlyZXR1cm4gMDsKIH0KIAogdm9pZCBpOTE1X2RyaXZlcl9sYXN0Y2xvc2Uoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpCiB7Ci0JaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKLQkJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAoZGV2X3ByaXYtPmFncF9oZWFwKQogCQlpOTE1X21lbV90YWtlZG93bigmKGRldl9wcml2LT5hZ3BfaGVhcCkpOwotCX0KKwogCWk5MTVfZG1hX2NsZWFudXAoZGV2KTsKIH0KIAogdm9pZCBpOTE1X2RyaXZlcl9wcmVjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7Ci0JaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKLQkJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JCWk5MTVfbWVtX3JlbGVhc2UoZGV2LCBmaWxlX3ByaXYsIGRldl9wcml2LT5hZ3BfaGVhcCk7Ci0JfQorCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWk5MTVfbWVtX3JlbGVhc2UoZGV2LCBmaWxlX3ByaXYsIGRldl9wcml2LT5hZ3BfaGVhcCk7CiB9CiAKIHN0cnVjdCBkcm1faW9jdGxfZGVzYyBpOTE1X2lvY3Rsc1tdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5jCmluZGV4IDg1YmNjMjcuLjUyZTUxMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmMKQEAgLTM4LDYgKzM4LDQ2NSBAQAogCWk5MTVfUENJX0lEUwogfTsKIAorZW51bSBwaXBlIHsKKyAgICBQSVBFX0EgPSAwLAorICAgIFBJUEVfQiwKK307CisKK3N0YXRpYyBib29sIGk5MTVfcGlwZV9lbmFibGVkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGVudW0gcGlwZSBwaXBlKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlpZiAocGlwZSA9PSBQSVBFX0EpCisJCXJldHVybiAoSTkxNV9SRUFEKERQTExfQSkgJiBEUExMX1ZDT19FTkFCTEUpOworCWVsc2UKKwkJcmV0dXJuIChJOTE1X1JFQUQoRFBMTF9CKSAmIERQTExfVkNPX0VOQUJMRSk7Cit9CisKK3N0YXRpYyB2b2lkIGk5MTVfc2F2ZV9wYWxldHRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGVudW0gcGlwZSBwaXBlKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgbG9uZyByZWcgPSAocGlwZSA9PSBQSVBFX0EgPyBQQUxFVFRFX0EgOiBQQUxFVFRFX0IpOworCXUzMiAqYXJyYXk7CisJaW50IGk7CisKKwlpZiAoIWk5MTVfcGlwZV9lbmFibGVkKGRldiwgcGlwZSkpCisJCXJldHVybjsKKworCWlmIChwaXBlID09IFBJUEVfQSkKKwkJYXJyYXkgPSBkZXZfcHJpdi0+c2F2ZV9wYWxldHRlX2E7CisJZWxzZQorCQlhcnJheSA9IGRldl9wcml2LT5zYXZlX3BhbGV0dGVfYjsKKworCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorCQlhcnJheVtpXSA9IEk5MTVfUkVBRChyZWcgKyAoaSA8PCAyKSk7Cit9CisKK3N0YXRpYyB2b2lkIGk5MTVfcmVzdG9yZV9wYWxldHRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGVudW0gcGlwZSBwaXBlKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdW5zaWduZWQgbG9uZyByZWcgPSAocGlwZSA9PSBQSVBFX0EgPyBQQUxFVFRFX0EgOiBQQUxFVFRFX0IpOworCXUzMiAqYXJyYXk7CisJaW50IGk7CisKKwlpZiAoIWk5MTVfcGlwZV9lbmFibGVkKGRldiwgcGlwZSkpCisJCXJldHVybjsKKworCWlmIChwaXBlID09IFBJUEVfQSkKKwkJYXJyYXkgPSBkZXZfcHJpdi0+c2F2ZV9wYWxldHRlX2E7CisJZWxzZQorCQlhcnJheSA9IGRldl9wcml2LT5zYXZlX3BhbGV0dGVfYjsKKworCWZvcihpID0gMDsgaSA8IDI1NjsgaSsrKQorCQlJOTE1X1dSSVRFKHJlZyArIChpIDw8IDIpLCBhcnJheVtpXSk7Cit9CisKK3N0YXRpYyB1OCBpOTE1X3JlYWRfaW5kZXhlZCh1MTYgaW5kZXhfcG9ydCwgdTE2IGRhdGFfcG9ydCwgdTggcmVnKQoreworCW91dGIocmVnLCBpbmRleF9wb3J0KTsKKwlyZXR1cm4gaW5iKGRhdGFfcG9ydCk7Cit9CisKK3N0YXRpYyB1OCBpOTE1X3JlYWRfYXIodTE2IHN0MDEsIHU4IHJlZywgdTE2IHBhbGV0dGVfZW5hYmxlKQoreworCWluYihzdDAxKTsKKwlvdXRiKHBhbGV0dGVfZW5hYmxlIHwgcmVnLCBWR0FfQVJfSU5ERVgpOworCXJldHVybiBpbmIoVkdBX0FSX0RBVEFfUkVBRCk7Cit9CisKK3N0YXRpYyB2b2lkIGk5MTVfd3JpdGVfYXIodTggc3QwMSwgdTggcmVnLCB1OCB2YWwsIHUxNiBwYWxldHRlX2VuYWJsZSkKK3sKKwlpbmIoc3QwMSk7CisJb3V0YihwYWxldHRlX2VuYWJsZSB8IHJlZywgVkdBX0FSX0lOREVYKTsKKwlvdXRiKHZhbCwgVkdBX0FSX0RBVEFfV1JJVEUpOworfQorCitzdGF0aWMgdm9pZCBpOTE1X3dyaXRlX2luZGV4ZWQodTE2IGluZGV4X3BvcnQsIHUxNiBkYXRhX3BvcnQsIHU4IHJlZywgdTggdmFsKQoreworCW91dGIocmVnLCBpbmRleF9wb3J0KTsKKwlvdXRiKHZhbCwgZGF0YV9wb3J0KTsKK30KKworc3RhdGljIHZvaWQgaTkxNV9zYXZlX3ZnYShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJaW50IGk7CisJdTE2IGNyX2luZGV4LCBjcl9kYXRhLCBzdDAxOworCisJLyogVkdBIGNvbG9yIHBhbGV0dGUgcmVnaXN0ZXJzICovCisJZGV2X3ByaXYtPnNhdmVEQUNNQVNLID0gaW5iKFZHQV9EQUNNQVNLKTsKKwkvKiBEQUNDUlggYXV0b21hdGljYWxseSBpbmNyZW1lbnRzIGR1cmluZyByZWFkICovCisJb3V0YigwLCBWR0FfREFDUlgpOworCS8qIFJlYWQgMyBieXRlcyBvZiBjb2xvciBkYXRhIGZyb20gZWFjaCBpbmRleCAqLworCWZvciAoaSA9IDA7IGkgPCAyNTYgKiAzOyBpKyspCisJCWRldl9wcml2LT5zYXZlREFDREFUQVtpXSA9IGluYihWR0FfREFDREFUQSk7CisKKwkvKiBNU1IgYml0cyAqLworCWRldl9wcml2LT5zYXZlTVNSID0gaW5iKFZHQV9NU1JfUkVBRCk7CisJaWYgKGRldl9wcml2LT5zYXZlTVNSICYgVkdBX01TUl9DR0FfTU9ERSkgeworCQljcl9pbmRleCA9IFZHQV9DUl9JTkRFWF9DR0E7CisJCWNyX2RhdGEgPSBWR0FfQ1JfREFUQV9DR0E7CisJCXN0MDEgPSBWR0FfU1QwMV9DR0E7CisJfSBlbHNlIHsKKwkJY3JfaW5kZXggPSBWR0FfQ1JfSU5ERVhfTURBOworCQljcl9kYXRhID0gVkdBX0NSX0RBVEFfTURBOworCQlzdDAxID0gVkdBX1NUMDFfTURBOworCX0KKworCS8qIENSVCBjb250cm9sbGVyIHJlZ3MgKi8KKwlpOTE1X3dyaXRlX2luZGV4ZWQoY3JfaW5kZXgsIGNyX2RhdGEsIDB4MTEsCisJCQkgICBpOTE1X3JlYWRfaW5kZXhlZChjcl9pbmRleCwgY3JfZGF0YSwgMHgxMSkgJgorCQkJICAgKH4weDgwKSk7CisJZm9yIChpID0gMDsgaSA8IDB4MjQ7IGkrKykKKwkJZGV2X3ByaXYtPnNhdmVDUltpXSA9CisJCQlpOTE1X3JlYWRfaW5kZXhlZChjcl9pbmRleCwgY3JfZGF0YSwgaSk7CisJLyogTWFrZSBzdXJlIHdlIGRvbid0IHR1cm4gb2ZmIENSIGdyb3VwIDAgd3JpdGVzICovCisJZGV2X3ByaXYtPnNhdmVDUlsweDExXSAmPSB+MHg4MDsKKworCS8qIEF0dHJpYnV0ZSBjb250cm9sbGVyIHJlZ2lzdGVycyAqLworCWluYihzdDAxKTsKKwlkZXZfcHJpdi0+c2F2ZUFSX0lOREVYID0gaW5iKFZHQV9BUl9JTkRFWCk7CisJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspCisJCWRldl9wcml2LT5zYXZlQVJbaV0gPSBpOTE1X3JlYWRfYXIoc3QwMSwgaSwgMCk7CisJaW5iKHN0MDEpOworCW91dGIoZGV2X3ByaXYtPnNhdmVBUl9JTkRFWCwgVkdBX0FSX0lOREVYKTsKKworCS8qIEdyYXBoaWNzIGNvbnRyb2xsZXIgcmVnaXN0ZXJzICovCisJZm9yIChpID0gMDsgaSA8IDk7IGkrKykKKwkJZGV2X3ByaXYtPnNhdmVHUltpXSA9CisJCQlpOTE1X3JlYWRfaW5kZXhlZChWR0FfR1JfSU5ERVgsIFZHQV9HUl9EQVRBLCBpKTsKKworCWRldl9wcml2LT5zYXZlR1JbMHgxMF0gPQorCQlpOTE1X3JlYWRfaW5kZXhlZChWR0FfR1JfSU5ERVgsIFZHQV9HUl9EQVRBLCAweDEwKTsKKwlkZXZfcHJpdi0+c2F2ZUdSWzB4MTFdID0KKwkJaTkxNV9yZWFkX2luZGV4ZWQoVkdBX0dSX0lOREVYLCBWR0FfR1JfREFUQSwgMHgxMSk7CisJZGV2X3ByaXYtPnNhdmVHUlsweDE4XSA9CisJCWk5MTVfcmVhZF9pbmRleGVkKFZHQV9HUl9JTkRFWCwgVkdBX0dSX0RBVEEsIDB4MTgpOworCisJLyogU2VxdWVuY2VyIHJlZ2lzdGVycyAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWRldl9wcml2LT5zYXZlU1JbaV0gPQorCQkJaTkxNV9yZWFkX2luZGV4ZWQoVkdBX1NSX0lOREVYLCBWR0FfU1JfREFUQSwgaSk7Cit9CisKK3N0YXRpYyB2b2lkIGk5MTVfcmVzdG9yZV92Z2Eoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCBpOworCXUxNiBjcl9pbmRleCwgY3JfZGF0YSwgc3QwMTsKKworCS8qIE1TUiBiaXRzICovCisJb3V0YihkZXZfcHJpdi0+c2F2ZU1TUiwgVkdBX01TUl9XUklURSk7CisJaWYgKGRldl9wcml2LT5zYXZlTVNSICYgVkdBX01TUl9DR0FfTU9ERSkgeworCQljcl9pbmRleCA9IFZHQV9DUl9JTkRFWF9DR0E7CisJCWNyX2RhdGEgPSBWR0FfQ1JfREFUQV9DR0E7CisJCXN0MDEgPSBWR0FfU1QwMV9DR0E7CisJfSBlbHNlIHsKKwkJY3JfaW5kZXggPSBWR0FfQ1JfSU5ERVhfTURBOworCQljcl9kYXRhID0gVkdBX0NSX0RBVEFfTURBOworCQlzdDAxID0gVkdBX1NUMDFfTURBOworCX0KKworCS8qIFNlcXVlbmNlciByZWdpc3RlcnMsIGRvbid0IHdyaXRlIFNSMDcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQorCQlpOTE1X3dyaXRlX2luZGV4ZWQoVkdBX1NSX0lOREVYLCBWR0FfU1JfREFUQSwgaSwKKwkJCQkgICBkZXZfcHJpdi0+c2F2ZVNSW2ldKTsKKworCS8qIENSVCBjb250cm9sbGVyIHJlZ3MgKi8KKwkvKiBFbmFibGUgQ1IgZ3JvdXAgMCB3cml0ZXMgKi8KKwlpOTE1X3dyaXRlX2luZGV4ZWQoY3JfaW5kZXgsIGNyX2RhdGEsIDB4MTEsIGRldl9wcml2LT5zYXZlQ1JbMHgxMV0pOworCWZvciAoaSA9IDA7IGkgPCAweDI0OyBpKyspCisJCWk5MTVfd3JpdGVfaW5kZXhlZChjcl9pbmRleCwgY3JfZGF0YSwgaSwgZGV2X3ByaXYtPnNhdmVDUltpXSk7CisKKwkvKiBHcmFwaGljcyBjb250cm9sbGVyIHJlZ3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorCQlpOTE1X3dyaXRlX2luZGV4ZWQoVkdBX0dSX0lOREVYLCBWR0FfR1JfREFUQSwgaSwKKwkJCQkgICBkZXZfcHJpdi0+c2F2ZUdSW2ldKTsKKworCWk5MTVfd3JpdGVfaW5kZXhlZChWR0FfR1JfSU5ERVgsIFZHQV9HUl9EQVRBLCAweDEwLAorCQkJICAgZGV2X3ByaXYtPnNhdmVHUlsweDEwXSk7CisJaTkxNV93cml0ZV9pbmRleGVkKFZHQV9HUl9JTkRFWCwgVkdBX0dSX0RBVEEsIDB4MTEsCisJCQkgICBkZXZfcHJpdi0+c2F2ZUdSWzB4MTFdKTsKKwlpOTE1X3dyaXRlX2luZGV4ZWQoVkdBX0dSX0lOREVYLCBWR0FfR1JfREFUQSwgMHgxOCwKKwkJCSAgIGRldl9wcml2LT5zYXZlR1JbMHgxOF0pOworCisJLyogQXR0cmlidXRlIGNvbnRyb2xsZXIgcmVnaXN0ZXJzICovCisJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspCisJCWk5MTVfd3JpdGVfYXIoc3QwMSwgaSwgZGV2X3ByaXYtPnNhdmVBUltpXSwgMCk7CisJaW5iKHN0MDEpOyAvKiBzd2l0Y2ggYmFjayB0byBpbmRleCBtb2RlICovCisJb3V0YihkZXZfcHJpdi0+c2F2ZUFSX0lOREVYIHwgMHgyMCwgVkdBX0FSX0lOREVYKTsKKworCS8qIFZHQSBjb2xvciBwYWxldHRlIHJlZ2lzdGVycyAqLworCW91dGIoZGV2X3ByaXYtPnNhdmVEQUNNQVNLLCBWR0FfREFDTUFTSyk7CisJLyogREFDQ1JYIGF1dG9tYXRpY2FsbHkgaW5jcmVtZW50cyBkdXJpbmcgcmVhZCAqLworCW91dGIoMCwgVkdBX0RBQ1dYKTsKKwkvKiBSZWFkIDMgYnl0ZXMgb2YgY29sb3IgZGF0YSBmcm9tIGVhY2ggaW5kZXggKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjU2ICogMzsgaSsrKQorCQlvdXRiKGRldl9wcml2LT5zYXZlREFDREFUQVtpXSwgVkdBX0RBQ0RBVEEpOworCit9CisKK3N0YXRpYyBpbnQgaTkxNV9zdXNwZW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaTsKKworCWlmICghZGV2IHx8ICFkZXZfcHJpdikgeworCQlwcmludGsoS0VSTl9FUlIgImRldjogJXAsIGRldl9wcml2OiAlcFxuIiwgZGV2LCBkZXZfcHJpdik7CisJCXByaW50ayhLRVJOX0VSUiAiRFJNIG5vdCBpbml0aWFsaXplZCwgYWJvcnRpbmcgc3VzcGVuZC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwY2lfc2F2ZV9zdGF0ZShkZXYtPnBkZXYpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldi0+cGRldiwgTEJCLCAmZGV2X3ByaXYtPnNhdmVMQkIpOworCisJLyogUGlwZSAmIHBsYW5lIEEgaW5mbyAqLworCWRldl9wcml2LT5zYXZlUElQRUFDT05GID0gSTkxNV9SRUFEKFBJUEVBQ09ORik7CisJZGV2X3ByaXYtPnNhdmVQSVBFQVNSQyA9IEk5MTVfUkVBRChQSVBFQVNSQyk7CisJZGV2X3ByaXYtPnNhdmVGUEEwID0gSTkxNV9SRUFEKEZQQTApOworCWRldl9wcml2LT5zYXZlRlBBMSA9IEk5MTVfUkVBRChGUEExKTsKKwlkZXZfcHJpdi0+c2F2ZURQTExfQSA9IEk5MTVfUkVBRChEUExMX0EpOworCWlmIChJU19JOTY1RyhkZXYpKQorCQlkZXZfcHJpdi0+c2F2ZURQTExfQV9NRCA9IEk5MTVfUkVBRChEUExMX0FfTUQpOworCWRldl9wcml2LT5zYXZlSFRPVEFMX0EgPSBJOTE1X1JFQUQoSFRPVEFMX0EpOworCWRldl9wcml2LT5zYXZlSEJMQU5LX0EgPSBJOTE1X1JFQUQoSEJMQU5LX0EpOworCWRldl9wcml2LT5zYXZlSFNZTkNfQSA9IEk5MTVfUkVBRChIU1lOQ19BKTsKKwlkZXZfcHJpdi0+c2F2ZVZUT1RBTF9BID0gSTkxNV9SRUFEKFZUT1RBTF9BKTsKKwlkZXZfcHJpdi0+c2F2ZVZCTEFOS19BID0gSTkxNV9SRUFEKFZCTEFOS19BKTsKKwlkZXZfcHJpdi0+c2F2ZVZTWU5DX0EgPSBJOTE1X1JFQUQoVlNZTkNfQSk7CisJZGV2X3ByaXYtPnNhdmVCQ0xSUEFUX0EgPSBJOTE1X1JFQUQoQkNMUlBBVF9BKTsKKworCWRldl9wcml2LT5zYXZlRFNQQUNOVFIgPSBJOTE1X1JFQUQoRFNQQUNOVFIpOworCWRldl9wcml2LT5zYXZlRFNQQVNUUklERSA9IEk5MTVfUkVBRChEU1BBU1RSSURFKTsKKwlkZXZfcHJpdi0+c2F2ZURTUEFTSVpFID0gSTkxNV9SRUFEKERTUEFTSVpFKTsKKwlkZXZfcHJpdi0+c2F2ZURTUEFQT1MgPSBJOTE1X1JFQUQoRFNQQVBPUyk7CisJZGV2X3ByaXYtPnNhdmVEU1BBQkFTRSA9IEk5MTVfUkVBRChEU1BBQkFTRSk7CisJaWYgKElTX0k5NjVHKGRldikpIHsKKwkJZGV2X3ByaXYtPnNhdmVEU1BBU1VSRiA9IEk5MTVfUkVBRChEU1BBU1VSRik7CisJCWRldl9wcml2LT5zYXZlRFNQQVRJTEVPRkYgPSBJOTE1X1JFQUQoRFNQQVRJTEVPRkYpOworCX0KKwlpOTE1X3NhdmVfcGFsZXR0ZShkZXYsIFBJUEVfQSk7CisKKwkvKiBQaXBlICYgcGxhbmUgQiBpbmZvICovCisJZGV2X3ByaXYtPnNhdmVQSVBFQkNPTkYgPSBJOTE1X1JFQUQoUElQRUJDT05GKTsKKwlkZXZfcHJpdi0+c2F2ZVBJUEVCU1JDID0gSTkxNV9SRUFEKFBJUEVCU1JDKTsKKwlkZXZfcHJpdi0+c2F2ZUZQQjAgPSBJOTE1X1JFQUQoRlBCMCk7CisJZGV2X3ByaXYtPnNhdmVGUEIxID0gSTkxNV9SRUFEKEZQQjEpOworCWRldl9wcml2LT5zYXZlRFBMTF9CID0gSTkxNV9SRUFEKERQTExfQik7CisJaWYgKElTX0k5NjVHKGRldikpCisJCWRldl9wcml2LT5zYXZlRFBMTF9CX01EID0gSTkxNV9SRUFEKERQTExfQl9NRCk7CisJZGV2X3ByaXYtPnNhdmVIVE9UQUxfQiA9IEk5MTVfUkVBRChIVE9UQUxfQik7CisJZGV2X3ByaXYtPnNhdmVIQkxBTktfQiA9IEk5MTVfUkVBRChIQkxBTktfQik7CisJZGV2X3ByaXYtPnNhdmVIU1lOQ19CID0gSTkxNV9SRUFEKEhTWU5DX0IpOworCWRldl9wcml2LT5zYXZlVlRPVEFMX0IgPSBJOTE1X1JFQUQoVlRPVEFMX0IpOworCWRldl9wcml2LT5zYXZlVkJMQU5LX0IgPSBJOTE1X1JFQUQoVkJMQU5LX0IpOworCWRldl9wcml2LT5zYXZlVlNZTkNfQiA9IEk5MTVfUkVBRChWU1lOQ19CKTsKKwlkZXZfcHJpdi0+c2F2ZUJDTFJQQVRfQSA9IEk5MTVfUkVBRChCQ0xSUEFUX0EpOworCisJZGV2X3ByaXYtPnNhdmVEU1BCQ05UUiA9IEk5MTVfUkVBRChEU1BCQ05UUik7CisJZGV2X3ByaXYtPnNhdmVEU1BCU1RSSURFID0gSTkxNV9SRUFEKERTUEJTVFJJREUpOworCWRldl9wcml2LT5zYXZlRFNQQlNJWkUgPSBJOTE1X1JFQUQoRFNQQlNJWkUpOworCWRldl9wcml2LT5zYXZlRFNQQlBPUyA9IEk5MTVfUkVBRChEU1BCUE9TKTsKKwlkZXZfcHJpdi0+c2F2ZURTUEJCQVNFID0gSTkxNV9SRUFEKERTUEJCQVNFKTsKKwlpZiAoSVNfSTk2NUdNKGRldikgfHwgSVNfSUdEX0dNKGRldikpIHsKKwkJZGV2X3ByaXYtPnNhdmVEU1BCU1VSRiA9IEk5MTVfUkVBRChEU1BCU1VSRik7CisJCWRldl9wcml2LT5zYXZlRFNQQlRJTEVPRkYgPSBJOTE1X1JFQUQoRFNQQlRJTEVPRkYpOworCX0KKwlpOTE1X3NhdmVfcGFsZXR0ZShkZXYsIFBJUEVfQik7CisKKwkvKiBDUlQgc3RhdGUgKi8KKwlkZXZfcHJpdi0+c2F2ZUFEUEEgPSBJOTE1X1JFQUQoQURQQSk7CisKKwkvKiBMVkRTIHN0YXRlICovCisJZGV2X3ByaXYtPnNhdmVQUF9DT05UUk9MID0gSTkxNV9SRUFEKFBQX0NPTlRST0wpOworCWRldl9wcml2LT5zYXZlUEZJVF9QR01fUkFUSU9TID0gSTkxNV9SRUFEKFBGSVRfUEdNX1JBVElPUyk7CisJZGV2X3ByaXYtPnNhdmVCTENfUFdNX0NUTCA9IEk5MTVfUkVBRChCTENfUFdNX0NUTCk7CisJaWYgKElTX0k5NjVHKGRldikpCisJCWRldl9wcml2LT5zYXZlQkxDX1BXTV9DVEwyID0gSTkxNV9SRUFEKEJMQ19QV01fQ1RMMik7CisJaWYgKElTX01PQklMRShkZXYpICYmICFJU19JODMwKGRldikpCisJCWRldl9wcml2LT5zYXZlTFZEUyA9IEk5MTVfUkVBRChMVkRTKTsKKwlpZiAoIUlTX0k4MzAoZGV2KSAmJiAhSVNfODQ1RyhkZXYpKQorCQlkZXZfcHJpdi0+c2F2ZVBGSVRfQ09OVFJPTCA9IEk5MTVfUkVBRChQRklUX0NPTlRST0wpOworCWRldl9wcml2LT5zYXZlTFZEU1BQX09OID0gSTkxNV9SRUFEKExWRFNQUF9PTik7CisJZGV2X3ByaXYtPnNhdmVMVkRTUFBfT0ZGID0gSTkxNV9SRUFEKExWRFNQUF9PRkYpOworCWRldl9wcml2LT5zYXZlUFBfQ1lDTEUgPSBJOTE1X1JFQUQoUFBfQ1lDTEUpOworCisJLyogRklYTUU6IHNhdmUgVFYgJiBTRFZPIHN0YXRlICovCisKKwkvKiBGQkMgc3RhdGUgKi8KKwlkZXZfcHJpdi0+c2F2ZUZCQ19DRkJfQkFTRSA9IEk5MTVfUkVBRChGQkNfQ0ZCX0JBU0UpOworCWRldl9wcml2LT5zYXZlRkJDX0xMX0JBU0UgPSBJOTE1X1JFQUQoRkJDX0xMX0JBU0UpOworCWRldl9wcml2LT5zYXZlRkJDX0NPTlRST0wyID0gSTkxNV9SRUFEKEZCQ19DT05UUk9MMik7CisJZGV2X3ByaXYtPnNhdmVGQkNfQ09OVFJPTCA9IEk5MTVfUkVBRChGQkNfQ09OVFJPTCk7CisKKwkvKiBWR0Egc3RhdGUgKi8KKwlkZXZfcHJpdi0+c2F2ZVZDTEtfRElWSVNPUl9WR0EwID0gSTkxNV9SRUFEKFZDTEtfRElWSVNPUl9WR0EwKTsKKwlkZXZfcHJpdi0+c2F2ZVZDTEtfRElWSVNPUl9WR0ExID0gSTkxNV9SRUFEKFZDTEtfRElWSVNPUl9WR0ExKTsKKwlkZXZfcHJpdi0+c2F2ZVZDTEtfUE9TVF9ESVYgPSBJOTE1X1JFQUQoVkNMS19QT1NUX0RJVik7CisJZGV2X3ByaXYtPnNhdmVWR0FDTlRSTCA9IEk5MTVfUkVBRChWR0FDTlRSTCk7CisKKwkvKiBTY3JhdGNoIHNwYWNlICovCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJZGV2X3ByaXYtPnNhdmVTV0YwW2ldID0gSTkxNV9SRUFEKFNXRjAgKyAoaSA8PCAyKSk7CisJCWRldl9wcml2LT5zYXZlU1dGMVtpXSA9IEk5MTVfUkVBRChTV0YxMCArIChpIDw8IDIpKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJZGV2X3ByaXYtPnNhdmVTV0YyW2ldID0gSTkxNV9SRUFEKFNXRjMwICsgKGkgPDwgMikpOworCisJaTkxNV9zYXZlX3ZnYShkZXYpOworCisJLyogU2h1dCBkb3duIHRoZSBkZXZpY2UgKi8KKwlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2LT5wZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldi0+cGRldiwgUENJX0QzaG90KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk5MTVfcmVzdW1lKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlpbnQgaTsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LT5wZGV2LCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKGRldi0+cGRldik7CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRldi0+cGRldikpCisJCXJldHVybiAtMTsKKworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYtPnBkZXYsIExCQiwgZGV2X3ByaXYtPnNhdmVMQkIpOworCisJLyogUGlwZSAmIHBsYW5lIEEgaW5mbyAqLworCS8qIFByaW1lIHRoZSBjbG9jayAqLworCWlmIChkZXZfcHJpdi0+c2F2ZURQTExfQSAmIERQTExfVkNPX0VOQUJMRSkgeworCQlJOTE1X1dSSVRFKERQTExfQSwgZGV2X3ByaXYtPnNhdmVEUExMX0EgJgorCQkJICAgfkRQTExfVkNPX0VOQUJMRSk7CisJCXVkZWxheSgxNTApOworCX0KKwlJOTE1X1dSSVRFKEZQQTAsIGRldl9wcml2LT5zYXZlRlBBMCk7CisJSTkxNV9XUklURShGUEExLCBkZXZfcHJpdi0+c2F2ZUZQQTEpOworCS8qIEFjdHVhbGx5IGVuYWJsZSBpdCAqLworCUk5MTVfV1JJVEUoRFBMTF9BLCBkZXZfcHJpdi0+c2F2ZURQTExfQSk7CisJdWRlbGF5KDE1MCk7CisJaWYgKElTX0k5NjVHKGRldikpCisJCUk5MTVfV1JJVEUoRFBMTF9BX01ELCBkZXZfcHJpdi0+c2F2ZURQTExfQV9NRCk7CisJdWRlbGF5KDE1MCk7CisKKwkvKiBSZXN0b3JlIG1vZGUgKi8KKwlJOTE1X1dSSVRFKEhUT1RBTF9BLCBkZXZfcHJpdi0+c2F2ZUhUT1RBTF9BKTsKKwlJOTE1X1dSSVRFKEhCTEFOS19BLCBkZXZfcHJpdi0+c2F2ZUhCTEFOS19BKTsKKwlJOTE1X1dSSVRFKEhTWU5DX0EsIGRldl9wcml2LT5zYXZlSFNZTkNfQSk7CisJSTkxNV9XUklURShWVE9UQUxfQSwgZGV2X3ByaXYtPnNhdmVWVE9UQUxfQSk7CisJSTkxNV9XUklURShWQkxBTktfQSwgZGV2X3ByaXYtPnNhdmVWQkxBTktfQSk7CisJSTkxNV9XUklURShWU1lOQ19BLCBkZXZfcHJpdi0+c2F2ZVZTWU5DX0EpOworCUk5MTVfV1JJVEUoQkNMUlBBVF9BLCBkZXZfcHJpdi0+c2F2ZUJDTFJQQVRfQSk7CisKKwkvKiBSZXN0b3JlIHBsYW5lIGluZm8gKi8KKwlJOTE1X1dSSVRFKERTUEFTSVpFLCBkZXZfcHJpdi0+c2F2ZURTUEFTSVpFKTsKKwlJOTE1X1dSSVRFKERTUEFQT1MsIGRldl9wcml2LT5zYXZlRFNQQVBPUyk7CisJSTkxNV9XUklURShQSVBFQVNSQywgZGV2X3ByaXYtPnNhdmVQSVBFQVNSQyk7CisJSTkxNV9XUklURShEU1BBQkFTRSwgZGV2X3ByaXYtPnNhdmVEU1BBQkFTRSk7CisJSTkxNV9XUklURShEU1BBU1RSSURFLCBkZXZfcHJpdi0+c2F2ZURTUEFTVFJJREUpOworCWlmIChJU19JOTY1RyhkZXYpKSB7CisJCUk5MTVfV1JJVEUoRFNQQVNVUkYsIGRldl9wcml2LT5zYXZlRFNQQVNVUkYpOworCQlJOTE1X1dSSVRFKERTUEFUSUxFT0ZGLCBkZXZfcHJpdi0+c2F2ZURTUEFUSUxFT0ZGKTsKKwl9CisKKwlpZiAoKGRldl9wcml2LT5zYXZlRFBMTF9BICYgRFBMTF9WQ09fRU5BQkxFKSAmJgorCSAgICAoZGV2X3ByaXYtPnNhdmVEUExMX0EgJiBEUExMX1ZHQV9NT0RFX0RJUykpCisJCUk5MTVfV1JJVEUoUElQRUFDT05GLCBkZXZfcHJpdi0+c2F2ZVBJUEVBQ09ORik7CisKKwlpOTE1X3Jlc3RvcmVfcGFsZXR0ZShkZXYsIFBJUEVfQSk7CisJLyogRW5hYmxlIHRoZSBwbGFuZSAqLworCUk5MTVfV1JJVEUoRFNQQUNOVFIsIGRldl9wcml2LT5zYXZlRFNQQUNOVFIpOworCUk5MTVfV1JJVEUoRFNQQUJBU0UsIEk5MTVfUkVBRChEU1BBQkFTRSkpOworCisJLyogUGlwZSAmIHBsYW5lIEIgaW5mbyAqLworCWlmIChkZXZfcHJpdi0+c2F2ZURQTExfQiAmIERQTExfVkNPX0VOQUJMRSkgeworCQlJOTE1X1dSSVRFKERQTExfQiwgZGV2X3ByaXYtPnNhdmVEUExMX0IgJgorCQkJICAgfkRQTExfVkNPX0VOQUJMRSk7CisJCXVkZWxheSgxNTApOworCX0KKwlJOTE1X1dSSVRFKEZQQjAsIGRldl9wcml2LT5zYXZlRlBCMCk7CisJSTkxNV9XUklURShGUEIxLCBkZXZfcHJpdi0+c2F2ZUZQQjEpOworCS8qIEFjdHVhbGx5IGVuYWJsZSBpdCAqLworCUk5MTVfV1JJVEUoRFBMTF9CLCBkZXZfcHJpdi0+c2F2ZURQTExfQik7CisJdWRlbGF5KDE1MCk7CisJaWYgKElTX0k5NjVHKGRldikpCisJCUk5MTVfV1JJVEUoRFBMTF9CX01ELCBkZXZfcHJpdi0+c2F2ZURQTExfQl9NRCk7CisJdWRlbGF5KDE1MCk7CisKKwkvKiBSZXN0b3JlIG1vZGUgKi8KKwlJOTE1X1dSSVRFKEhUT1RBTF9CLCBkZXZfcHJpdi0+c2F2ZUhUT1RBTF9CKTsKKwlJOTE1X1dSSVRFKEhCTEFOS19CLCBkZXZfcHJpdi0+c2F2ZUhCTEFOS19CKTsKKwlJOTE1X1dSSVRFKEhTWU5DX0IsIGRldl9wcml2LT5zYXZlSFNZTkNfQik7CisJSTkxNV9XUklURShWVE9UQUxfQiwgZGV2X3ByaXYtPnNhdmVWVE9UQUxfQik7CisJSTkxNV9XUklURShWQkxBTktfQiwgZGV2X3ByaXYtPnNhdmVWQkxBTktfQik7CisJSTkxNV9XUklURShWU1lOQ19CLCBkZXZfcHJpdi0+c2F2ZVZTWU5DX0IpOworCUk5MTVfV1JJVEUoQkNMUlBBVF9CLCBkZXZfcHJpdi0+c2F2ZUJDTFJQQVRfQik7CisKKwkvKiBSZXN0b3JlIHBsYW5lIGluZm8gKi8KKwlJOTE1X1dSSVRFKERTUEJTSVpFLCBkZXZfcHJpdi0+c2F2ZURTUEJTSVpFKTsKKwlJOTE1X1dSSVRFKERTUEJQT1MsIGRldl9wcml2LT5zYXZlRFNQQlBPUyk7CisJSTkxNV9XUklURShQSVBFQlNSQywgZGV2X3ByaXYtPnNhdmVQSVBFQlNSQyk7CisJSTkxNV9XUklURShEU1BCQkFTRSwgZGV2X3ByaXYtPnNhdmVEU1BCQkFTRSk7CisJSTkxNV9XUklURShEU1BCU1RSSURFLCBkZXZfcHJpdi0+c2F2ZURTUEJTVFJJREUpOworCWlmIChJU19JOTY1RyhkZXYpKSB7CisJCUk5MTVfV1JJVEUoRFNQQlNVUkYsIGRldl9wcml2LT5zYXZlRFNQQlNVUkYpOworCQlJOTE1X1dSSVRFKERTUEJUSUxFT0ZGLCBkZXZfcHJpdi0+c2F2ZURTUEJUSUxFT0ZGKTsKKwl9CisKKwlpZiAoKGRldl9wcml2LT5zYXZlRFBMTF9CICYgRFBMTF9WQ09fRU5BQkxFKSAmJgorCSAgICAoZGV2X3ByaXYtPnNhdmVEUExMX0IgJiBEUExMX1ZHQV9NT0RFX0RJUykpCisJCUk5MTVfV1JJVEUoUElQRUJDT05GLCBkZXZfcHJpdi0+c2F2ZVBJUEVCQ09ORik7CisJaTkxNV9yZXN0b3JlX3BhbGV0dGUoZGV2LCBQSVBFX0EpOworCS8qIEVuYWJsZSB0aGUgcGxhbmUgKi8KKwlJOTE1X1dSSVRFKERTUEJDTlRSLCBkZXZfcHJpdi0+c2F2ZURTUEJDTlRSKTsKKwlJOTE1X1dSSVRFKERTUEJCQVNFLCBJOTE1X1JFQUQoRFNQQkJBU0UpKTsKKworCS8qIENSVCBzdGF0ZSAqLworCUk5MTVfV1JJVEUoQURQQSwgZGV2X3ByaXYtPnNhdmVBRFBBKTsKKworCS8qIExWRFMgc3RhdGUgKi8KKwlpZiAoSVNfSTk2NUcoZGV2KSkKKwkJSTkxNV9XUklURShCTENfUFdNX0NUTDIsIGRldl9wcml2LT5zYXZlQkxDX1BXTV9DVEwyKTsKKwlpZiAoSVNfTU9CSUxFKGRldikgJiYgIUlTX0k4MzAoZGV2KSkKKwkJSTkxNV9XUklURShMVkRTLCBkZXZfcHJpdi0+c2F2ZUxWRFMpOworCWlmICghSVNfSTgzMChkZXYpICYmICFJU184NDVHKGRldikpCisJCUk5MTVfV1JJVEUoUEZJVF9DT05UUk9MLCBkZXZfcHJpdi0+c2F2ZVBGSVRfQ09OVFJPTCk7CisKKwlJOTE1X1dSSVRFKFBGSVRfUEdNX1JBVElPUywgZGV2X3ByaXYtPnNhdmVQRklUX1BHTV9SQVRJT1MpOworCUk5MTVfV1JJVEUoQkxDX1BXTV9DVEwsIGRldl9wcml2LT5zYXZlQkxDX1BXTV9DVEwpOworCUk5MTVfV1JJVEUoTFZEU1BQX09OLCBkZXZfcHJpdi0+c2F2ZUxWRFNQUF9PTik7CisJSTkxNV9XUklURShMVkRTUFBfT0ZGLCBkZXZfcHJpdi0+c2F2ZUxWRFNQUF9PRkYpOworCUk5MTVfV1JJVEUoUFBfQ1lDTEUsIGRldl9wcml2LT5zYXZlUFBfQ1lDTEUpOworCUk5MTVfV1JJVEUoUFBfQ09OVFJPTCwgZGV2X3ByaXYtPnNhdmVQUF9DT05UUk9MKTsKKworCS8qIEZJWE1FOiByZXN0b3JlIFRWICYgU0RWTyBzdGF0ZSAqLworCisJLyogRkJDIGluZm8gKi8KKwlJOTE1X1dSSVRFKEZCQ19DRkJfQkFTRSwgZGV2X3ByaXYtPnNhdmVGQkNfQ0ZCX0JBU0UpOworCUk5MTVfV1JJVEUoRkJDX0xMX0JBU0UsIGRldl9wcml2LT5zYXZlRkJDX0xMX0JBU0UpOworCUk5MTVfV1JJVEUoRkJDX0NPTlRST0wyLCBkZXZfcHJpdi0+c2F2ZUZCQ19DT05UUk9MMik7CisJSTkxNV9XUklURShGQkNfQ09OVFJPTCwgZGV2X3ByaXYtPnNhdmVGQkNfQ09OVFJPTCk7CisKKwkvKiBWR0Egc3RhdGUgKi8KKwlJOTE1X1dSSVRFKFZHQUNOVFJMLCBkZXZfcHJpdi0+c2F2ZVZHQUNOVFJMKTsKKwlJOTE1X1dSSVRFKFZDTEtfRElWSVNPUl9WR0EwLCBkZXZfcHJpdi0+c2F2ZVZDTEtfRElWSVNPUl9WR0EwKTsKKwlJOTE1X1dSSVRFKFZDTEtfRElWSVNPUl9WR0ExLCBkZXZfcHJpdi0+c2F2ZVZDTEtfRElWSVNPUl9WR0ExKTsKKwlJOTE1X1dSSVRFKFZDTEtfUE9TVF9ESVYsIGRldl9wcml2LT5zYXZlVkNMS19QT1NUX0RJVik7CisJdWRlbGF5KDE1MCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlJOTE1X1dSSVRFKFNXRjAgKyAoaSA8PCAyKSwgZGV2X3ByaXYtPnNhdmVTV0YwW2ldKTsKKwkJSTkxNV9XUklURShTV0YxMCArIChpIDw8IDIpLCBkZXZfcHJpdi0+c2F2ZVNXRjFbaSs3XSk7CisJfQorCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCUk5MTVfV1JJVEUoU1dGMzAgKyAoaSA8PCAyKSwgZGV2X3ByaXYtPnNhdmVTV0YyW2ldKTsKKworCWk5MTVfcmVzdG9yZV92Z2EoZGV2KTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGRybV9kcml2ZXIgZHJpdmVyID0gewogCS8qIGRvbid0IHVzZSBtdHJyJ3MgaGVyZSwgdGhlIFhzZXJ2ZXIgb3IgdXNlciBzcGFjZSBhcHAgc2hvdWxkCiAJICogZGVhbCB3aXRoIHRoZW0gZm9yIGludGVsIGhhcmR3YXJlLgpAQCAtNDcsOCArNTA2LDExIEBACiAJICAgIERSSVZFUl9IQVZFX0lSUSB8IERSSVZFUl9JUlFfU0hBUkVEIHwgRFJJVkVSX0lSUV9WQkwgfAogCSAgICBEUklWRVJfSVJRX1ZCTDIsCiAJLmxvYWQgPSBpOTE1X2RyaXZlcl9sb2FkLAorCS51bmxvYWQgPSBpOTE1X2RyaXZlcl91bmxvYWQsCiAJLmxhc3RjbG9zZSA9IGk5MTVfZHJpdmVyX2xhc3RjbG9zZSwKIAkucHJlY2xvc2UgPSBpOTE1X2RyaXZlcl9wcmVjbG9zZSwKKwkuc3VzcGVuZCA9IGk5MTVfc3VzcGVuZCwKKwkucmVzdW1lID0gaTkxNV9yZXN1bWUsCiAJLmRldmljZV9pc19hZ3AgPSBpOTE1X2RyaXZlcl9kZXZpY2VfaXNfYWdwLAogCS52Ymxhbmtfd2FpdCA9IGk5MTVfZHJpdmVyX3ZibGFua193YWl0LAogCS52Ymxhbmtfd2FpdDIgPSBpOTE1X2RyaXZlcl92Ymxhbmtfd2FpdDIsCkBAIC03Nyw3ICs1MzksNyBAQAogCQkgLm5hbWUgPSBEUklWRVJfTkFNRSwKIAkJIC5pZF90YWJsZSA9IHBjaWlkbGlzdCwKIAl9LAotCQorCiAJLm5hbWUgPSBEUklWRVJfTkFNRSwKIAkuZGVzYyA9IERSSVZFUl9ERVNDLAogCS5kYXRlID0gRFJJVkVSX0RBVEUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmgKaW5kZXggZTA2NDI5Mi4uZjgzMDhiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuaApAQCAtMTE0LDYgKzExNCw4NSBAQAogCXNwaW5sb2NrX3Qgc3dhcHNfbG9jazsKIAlkcm1faTkxNV92Ymxfc3dhcF90IHZibF9zd2FwczsKIAl1bnNpZ25lZCBpbnQgc3dhcHNfcGVuZGluZzsKKworCS8qIFJlZ2lzdGVyIHN0YXRlICovCisJdTggc2F2ZUxCQjsKKwl1MzIgc2F2ZURTUEFDTlRSOworCXUzMiBzYXZlRFNQQkNOVFI7CisJdTMyIHNhdmVQSVBFQUNPTkY7CisJdTMyIHNhdmVQSVBFQkNPTkY7CisJdTMyIHNhdmVQSVBFQVNSQzsKKwl1MzIgc2F2ZVBJUEVCU1JDOworCXUzMiBzYXZlRlBBMDsKKwl1MzIgc2F2ZUZQQTE7CisJdTMyIHNhdmVEUExMX0E7CisJdTMyIHNhdmVEUExMX0FfTUQ7CisJdTMyIHNhdmVIVE9UQUxfQTsKKwl1MzIgc2F2ZUhCTEFOS19BOworCXUzMiBzYXZlSFNZTkNfQTsKKwl1MzIgc2F2ZVZUT1RBTF9BOworCXUzMiBzYXZlVkJMQU5LX0E7CisJdTMyIHNhdmVWU1lOQ19BOworCXUzMiBzYXZlQkNMUlBBVF9BOworCXUzMiBzYXZlRFNQQVNUUklERTsKKwl1MzIgc2F2ZURTUEFTSVpFOworCXUzMiBzYXZlRFNQQVBPUzsKKwl1MzIgc2F2ZURTUEFCQVNFOworCXUzMiBzYXZlRFNQQVNVUkY7CisJdTMyIHNhdmVEU1BBVElMRU9GRjsKKwl1MzIgc2F2ZVBGSVRfUEdNX1JBVElPUzsKKwl1MzIgc2F2ZUJMQ19QV01fQ1RMOworCXUzMiBzYXZlQkxDX1BXTV9DVEwyOworCXUzMiBzYXZlRlBCMDsKKwl1MzIgc2F2ZUZQQjE7CisJdTMyIHNhdmVEUExMX0I7CisJdTMyIHNhdmVEUExMX0JfTUQ7CisJdTMyIHNhdmVIVE9UQUxfQjsKKwl1MzIgc2F2ZUhCTEFOS19COworCXUzMiBzYXZlSFNZTkNfQjsKKwl1MzIgc2F2ZVZUT1RBTF9COworCXUzMiBzYXZlVkJMQU5LX0I7CisJdTMyIHNhdmVWU1lOQ19COworCXUzMiBzYXZlQkNMUlBBVF9COworCXUzMiBzYXZlRFNQQlNUUklERTsKKwl1MzIgc2F2ZURTUEJTSVpFOworCXUzMiBzYXZlRFNQQlBPUzsKKwl1MzIgc2F2ZURTUEJCQVNFOworCXUzMiBzYXZlRFNQQlNVUkY7CisJdTMyIHNhdmVEU1BCVElMRU9GRjsKKwl1MzIgc2F2ZVZDTEtfRElWSVNPUl9WR0EwOworCXUzMiBzYXZlVkNMS19ESVZJU09SX1ZHQTE7CisJdTMyIHNhdmVWQ0xLX1BPU1RfRElWOworCXUzMiBzYXZlVkdBQ05UUkw7CisJdTMyIHNhdmVBRFBBOworCXUzMiBzYXZlTFZEUzsKKwl1MzIgc2F2ZUxWRFNQUF9PTjsKKwl1MzIgc2F2ZUxWRFNQUF9PRkY7CisJdTMyIHNhdmVEVk9BOworCXUzMiBzYXZlRFZPQjsKKwl1MzIgc2F2ZURWT0M7CisJdTMyIHNhdmVQUF9PTjsKKwl1MzIgc2F2ZVBQX09GRjsKKwl1MzIgc2F2ZVBQX0NPTlRST0w7CisJdTMyIHNhdmVQUF9DWUNMRTsKKwl1MzIgc2F2ZVBGSVRfQ09OVFJPTDsKKwl1MzIgc2F2ZV9wYWxldHRlX2FbMjU2XTsKKwl1MzIgc2F2ZV9wYWxldHRlX2JbMjU2XTsKKwl1MzIgc2F2ZUZCQ19DRkJfQkFTRTsKKwl1MzIgc2F2ZUZCQ19MTF9CQVNFOworCXUzMiBzYXZlRkJDX0NPTlRST0w7CisJdTMyIHNhdmVGQkNfQ09OVFJPTDI7CisJdTMyIHNhdmVTV0YwWzE2XTsKKwl1MzIgc2F2ZVNXRjFbMTZdOworCXUzMiBzYXZlU1dGMlszXTsKKwl1OCBzYXZlTVNSOworCXU4IHNhdmVTUls4XTsKKwl1OCBzYXZlR1JbMjVdOworCXU4IHNhdmVBUl9JTkRFWDsKKwl1OCBzYXZlQVJbMjBdOworCXU4IHNhdmVEQUNNQVNLOworCXU4IHNhdmVEQUNEQVRBWzI1NiozXTsgLyogMjU2IDMtYnl0ZSBjb2xvcnMgKi8KKwl1OCBzYXZlQ1JbMzZdOwogfSBkcm1faTkxNV9wcml2YXRlX3Q7CiAKIGV4dGVybiBzdHJ1Y3QgZHJtX2lvY3RsX2Rlc2MgaTkxNV9pb2N0bHNbXTsKQEAgLTEyMiw2ICsyMDEsNyBAQAogCQkJCS8qIGk5MTVfZG1hLmMgKi8KIGV4dGVybiB2b2lkIGk5MTVfa2VybmVsX2xvc3RfY29udGV4dChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiBleHRlcm4gaW50IGk5MTVfZHJpdmVyX2xvYWQoc3RydWN0IGRybV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CitleHRlcm4gaW50IGk5MTVfZHJpdmVyX3VubG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIGk5MTVfZHJpdmVyX2xhc3RjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiBleHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9wcmVjbG9zZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAogCQkJCSBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CkBAIC0xNjMsNyArMjQzLDcgQEAKIAogI2RlZmluZSBJOTE1X1JFQUQocmVnKSAgICAgICAgICBEUk1fUkVBRDMyKGRldl9wcml2LT5tbWlvX21hcCwgKHJlZykpCiAjZGVmaW5lIEk5MTVfV1JJVEUocmVnLHZhbCkgICAgIERSTV9XUklURTMyKGRldl9wcml2LT5tbWlvX21hcCwgKHJlZyksICh2YWwpKQotI2RlZmluZSBJOTE1X1JFQUQxNihyZWcpIAlEUk1fUkVBRDE2KGRldl9wcml2LT5tbWlvX21hcCwgKHJlZykpCisjZGVmaW5lIEk5MTVfUkVBRDE2KHJlZykJRFJNX1JFQUQxNihkZXZfcHJpdi0+bW1pb19tYXAsIChyZWcpKQogI2RlZmluZSBJOTE1X1dSSVRFMTYocmVnLHZhbCkJRFJNX1dSSVRFMTYoZGV2X3ByaXYtPm1taW9fbWFwLCAocmVnKSwgKHZhbCkpCiAKICNkZWZpbmUgSTkxNV9WRVJCT1NFIDAKQEAgLTE3Myw5ICsyNTMsOCBAQAogCiAjZGVmaW5lIEJFR0lOX0xQX1JJTkcobikgZG8gewkJCQlcCiAJaWYgKEk5MTVfVkVSQk9TRSkJCQkJXAotCQlEUk1fREVCVUcoIkJFR0lOX0xQX1JJTkcoJWQpIGluICVzXG4iLAlcCi0JCQkgIChuKSwgX19GVU5DVElPTl9fKTsJCVwKLQlpZiAoZGV2X3ByaXYtPnJpbmcuc3BhY2UgPCAobikqNCkJCQlcCisJCURSTV9ERUJVRygiQkVHSU5fTFBfUklORyglZClcbiIsIChuKSk7CVwKKwlpZiAoZGV2X3ByaXYtPnJpbmcuc3BhY2UgPCAobikqNCkJCVwKIAkJaTkxNV93YWl0X3JpbmcoZGV2LCAobikqNCwgX19GVU5DVElPTl9fKTsJCVwKIAlvdXRjb3VudCA9IDA7CQkJCQlcCiAJb3V0cmluZyA9IGRldl9wcml2LT5yaW5nLnRhaWw7CQkJXApAQCAtMjAwLDcgKzI3OSw1MSBAQAogCiBleHRlcm4gaW50IGk5MTVfd2FpdF9yaW5nKHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBpbnQgbiwgY29uc3QgY2hhciAqY2FsbGVyKTsKIAotI2RlZmluZSBHRlhfT1BfVVNFUl9JTlRFUlJVUFQgCQkoKDA8PDI5KXwoMjw8MjMpKQorLyogRXh0ZW5kZWQgY29uZmlnIHNwYWNlICovCisjZGVmaW5lIExCQiAweGY0CisKKy8qIFZHQSBzdHVmZiAqLworCisjZGVmaW5lIFZHQV9TVDAxX01EQSAweDNiYQorI2RlZmluZSBWR0FfU1QwMV9DR0EgMHgzZGEKKworI2RlZmluZSBWR0FfTVNSX1dSSVRFIDB4M2MyCisjZGVmaW5lIFZHQV9NU1JfUkVBRCAweDNjYworI2RlZmluZSAgIFZHQV9NU1JfTUVNX0VOICgxPDwxKQorI2RlZmluZSAgIFZHQV9NU1JfQ0dBX01PREUgKDE8PDApCisKKyNkZWZpbmUgVkdBX1NSX0lOREVYIDB4M2M0CisjZGVmaW5lIFZHQV9TUl9EQVRBIDB4M2M1CisKKyNkZWZpbmUgVkdBX0FSX0lOREVYIDB4M2MwCisjZGVmaW5lICAgVkdBX0FSX1ZJRF9FTiAoMTw8NSkKKyNkZWZpbmUgVkdBX0FSX0RBVEFfV1JJVEUgMHgzYzAKKyNkZWZpbmUgVkdBX0FSX0RBVEFfUkVBRCAweDNjMQorCisjZGVmaW5lIFZHQV9HUl9JTkRFWCAweDNjZQorI2RlZmluZSBWR0FfR1JfREFUQSAweDNjZgorLyogR1IwNSAqLworI2RlZmluZSAgIFZHQV9HUl9NRU1fUkVBRF9NT0RFX1NISUZUIDMKKyNkZWZpbmUgICAgIFZHQV9HUl9NRU1fUkVBRF9NT0RFX1BMQU5FIDEKKy8qIEdSMDYgKi8KKyNkZWZpbmUgICBWR0FfR1JfTUVNX01PREVfTUFTSyAweGMKKyNkZWZpbmUgICBWR0FfR1JfTUVNX01PREVfU0hJRlQgMgorI2RlZmluZSAgIFZHQV9HUl9NRU1fQTAwMDBfQUZGRkYgMAorI2RlZmluZSAgIFZHQV9HUl9NRU1fQTAwMDBfQkZGRkYgMQorI2RlZmluZSAgIFZHQV9HUl9NRU1fQjAwMDBfQjdGRkYgMgorI2RlZmluZSAgIFZHQV9HUl9NRU1fQjAwMDBfQkZGRkYgMworCisjZGVmaW5lIFZHQV9EQUNNQVNLIDB4M2M2CisjZGVmaW5lIFZHQV9EQUNSWCAweDNjNworI2RlZmluZSBWR0FfREFDV1ggMHgzYzgKKyNkZWZpbmUgVkdBX0RBQ0RBVEEgMHgzYzkKKworI2RlZmluZSBWR0FfQ1JfSU5ERVhfTURBIDB4M2I0CisjZGVmaW5lIFZHQV9DUl9EQVRBX01EQSAweDNiNQorI2RlZmluZSBWR0FfQ1JfSU5ERVhfQ0dBIDB4M2Q0CisjZGVmaW5lIFZHQV9DUl9EQVRBX0NHQSAweDNkNQorCisjZGVmaW5lIEdGWF9PUF9VU0VSX0lOVEVSUlVQVAkJKCgwPDwyOSl8KDI8PDIzKSkKICNkZWZpbmUgR0ZYX09QX0JSRUFLUE9JTlRfSU5URVJSVVBUCSgoMDw8MjkpfCgxPDwyMykpCiAjZGVmaW5lIENNRF9SRVBPUlRfSEVBRAkJCSg3PDwyMykKICNkZWZpbmUgQ01EX1NUT1JFX0RXT1JEX0lEWAkJKCgweDIxPDwyMykgfCAweDEpCkBAIC0yMTUsOSArMzM4LDQ3IEBACiAjZGVmaW5lIEJCMV9VTlBST1RFQ1RFRCAgICAgICAoMDw8MCkKICNkZWZpbmUgQkIyX0VORF9BRERSX01BU0sgICAgICh+MHg3KQogCisvKiBGcmFtZWJ1ZmZlciBjb21wcmVzc2lvbiAqLworI2RlZmluZSBGQkNfQ0ZCX0JBU0UJCTB4MDMyMDAgLyogNGsgcGFnZSBhbGlnbmVkICovCisjZGVmaW5lIEZCQ19MTF9CQVNFCQkweDAzMjA0IC8qIDRrIHBhZ2UgYWxpZ25lZCAqLworI2RlZmluZSBGQkNfQ09OVFJPTAkJMHgwMzIwOAorI2RlZmluZSAgIEZCQ19DVExfRU4JCSgxPDwzMSkKKyNkZWZpbmUgICBGQkNfQ1RMX1BFUklPRElDCSgxPDwzMCkKKyNkZWZpbmUgICBGQkNfQ1RMX0lOVEVSVkFMX1NISUZUICgxNikKKyNkZWZpbmUgICBGQkNfQ1RMX1VOQ09NUFJFU1NJQkxFICgxPDwxNCkKKyNkZWZpbmUgICBGQkNfQ1RMX1NUUklERV9TSElGVAkoNSkKKyNkZWZpbmUgICBGQkNfQ1RMX0ZFTkNFTk8JKDE8PDApCisjZGVmaW5lIEZCQ19DT01NQU5ECQkweDAzMjBjCisjZGVmaW5lICAgRkJDX0NNRF9DT01QUkVTUwkoMTw8MCkKKyNkZWZpbmUgRkJDX1NUQVRVUwkJMHgwMzIxMAorI2RlZmluZSAgIEZCQ19TVEFUX0NPTVBSRVNTSU5HCSgxPDwzMSkKKyNkZWZpbmUgICBGQkNfU1RBVF9DT01QUkVTU0VECSgxPDwzMCkKKyNkZWZpbmUgICBGQkNfU1RBVF9NT0RJRklFRAkoMTw8MjkpCisjZGVmaW5lICAgRkJDX1NUQVRfQ1VSUkVOVF9MSU5FCSgxPDwwKQorI2RlZmluZSBGQkNfQ09OVFJPTDIJCTB4MDMyMTQKKyNkZWZpbmUgICBGQkNfQ1RMX0ZFTkNFX0RCTAkoMDw8NCkKKyNkZWZpbmUgICBGQkNfQ1RMX0lETEVfSU1NCSgwPDwyKQorI2RlZmluZSAgIEZCQ19DVExfSURMRV9GVUxMCSgxPDwyKQorI2RlZmluZSAgIEZCQ19DVExfSURMRV9MSU5FCSgyPDwyKQorI2RlZmluZSAgIEZCQ19DVExfSURMRV9ERUJVRwkoMzw8MikKKyNkZWZpbmUgICBGQkNfQ1RMX0NQVV9GRU5DRQkoMTw8MSkKKyNkZWZpbmUgICBGQkNfQ1RMX1BMQU5FQQkoMDw8MCkKKyNkZWZpbmUgICBGQkNfQ1RMX1BMQU5FQgkoMTw8MCkKKyNkZWZpbmUgRkJDX0ZFTkNFX09GRgkJMHgwMzIxYgorCisjZGVmaW5lIEZCQ19MTF9TSVpFCQkoMTUzNikKKyNkZWZpbmUgRkJDX0xMX1BBRAkJKDMyKQorCisvKiBJbnRlcnJ1cHQgYml0czoKKyAqLworI2RlZmluZSBVU0VSX0lOVF9GTEFHICAgICgxPDwxKQorI2RlZmluZSBWU1lOQ19QSVBFQl9GTEFHICgxPDw1KQorI2RlZmluZSBWU1lOQ19QSVBFQV9GTEFHICgxPDw3KQorI2RlZmluZSBIV0JfT09NX0ZMQUcgICAgICgxPDwxMykgLyogYmlubmVyIG91dCBvZiBtZW1vcnkgKi8KKwogI2RlZmluZSBJOTE1UkVHX0hXU1RBTQkJMHgwMjA5OAogI2RlZmluZSBJOTE1UkVHX0lOVF9JREVOVElUWV9SCTB4MDIwYTQKLSNkZWZpbmUgSTkxNVJFR19JTlRfTUFTS19SIAkweDAyMGE4CisjZGVmaW5lIEk5MTVSRUdfSU5UX01BU0tfUgkweDAyMGE4CiAjZGVmaW5lIEk5MTVSRUdfSU5UX0VOQUJMRV9SCTB4MDIwYTAKIAogI2RlZmluZSBJOTE1UkVHX1BJUEVBU1RBVAkweDcwMDI0CkBAIC0yMjksNyArMzkwLDcgQEAKICNkZWZpbmUgU1JYX0lOREVYCQkweDNjNAogI2RlZmluZSBTUlhfREFUQQkJMHgzYzUKICNkZWZpbmUgU1IwMQkJCTEKLSNkZWZpbmUgU1IwMV9TQ1JFRU5fT0ZGIAkoMTw8NSkKKyNkZWZpbmUgU1IwMV9TQ1JFRU5fT0ZGCQkoMTw8NSkKIAogI2RlZmluZSBQUENSCQkJMHg2MTIwNAogI2RlZmluZSBQUENSX09OCQkJKDE8PDApCkBAIC0yNDksMzEgKzQxMCwxMjkgQEAKICNkZWZpbmUgQURQQV9EUE1TX09GRgkJKDM8PDEwKQogCiAjZGVmaW5lIE5PUElEICAgICAgICAgICAgICAgICAgIDB4MjA5NAotI2RlZmluZSBMUF9SSU5HICAgICAJCTB4MjAzMAotI2RlZmluZSBIUF9SSU5HICAgICAJCTB4MjA0MAotI2RlZmluZSBSSU5HX1RBSUwgICAgICAJCTB4MDAKKyNkZWZpbmUgTFBfUklORwkJCTB4MjAzMAorI2RlZmluZSBIUF9SSU5HCQkJMHgyMDQwCisvKiBUaGUgYmlubmVyIGhhcyBpdHMgb3duIHJpbmcgYnVmZmVyOgorICovCisjZGVmaW5lIEhXQl9SSU5HCQkweDI0MDAKKworI2RlZmluZSBSSU5HX1RBSUwJCTB4MDAKICNkZWZpbmUgVEFJTF9BRERSCQkweDAwMUZGRkY4Ci0jZGVmaW5lIFJJTkdfSEVBRCAgICAgIAkJMHgwNAotI2RlZmluZSBIRUFEX1dSQVBfQ09VTlQgICAgIAkweEZGRTAwMDAwCi0jZGVmaW5lIEhFQURfV1JBUF9PTkUgICAgICAgCTB4MDAyMDAwMDAKLSNkZWZpbmUgSEVBRF9BRERSICAgICAgICAgICAJMHgwMDFGRkZGQwotI2RlZmluZSBSSU5HX1NUQVJUICAgICAJCTB4MDgKLSNkZWZpbmUgU1RBUlRfQUREUiAgICAgICAgICAJMHgweEZGRkZGMDAwCi0jZGVmaW5lIFJJTkdfTEVOICAgICAgIAkJMHgwQwotI2RlZmluZSBSSU5HX05SX1BBR0VTICAgICAgIAkweDAwMUZGMDAwCi0jZGVmaW5lIFJJTkdfUkVQT1JUX01BU0sgICAgCTB4MDAwMDAwMDYKLSNkZWZpbmUgUklOR19SRVBPUlRfNjRLICAgICAJMHgwMDAwMDAwMgotI2RlZmluZSBSSU5HX1JFUE9SVF8xMjhLICAgIAkweDAwMDAwMDA0Ci0jZGVmaW5lIFJJTkdfTk9fUkVQT1JUICAgICAgCTB4MDAwMDAwMDAKLSNkZWZpbmUgUklOR19WQUxJRF9NQVNLICAgICAJMHgwMDAwMDAwMQotI2RlZmluZSBSSU5HX1ZBTElEICAgICAgICAgIAkweDAwMDAwMDAxCi0jZGVmaW5lIFJJTkdfSU5WQUxJRCAgICAgICAgCTB4MDAwMDAwMDAKKyNkZWZpbmUgUklOR19IRUFECQkweDA0CisjZGVmaW5lIEhFQURfV1JBUF9DT1VOVAkJMHhGRkUwMDAwMAorI2RlZmluZSBIRUFEX1dSQVBfT05FCQkweDAwMjAwMDAwCisjZGVmaW5lIEhFQURfQUREUgkJMHgwMDFGRkZGQworI2RlZmluZSBSSU5HX1NUQVJUCQkweDA4CisjZGVmaW5lIFNUQVJUX0FERFIJCTB4MHhGRkZGRjAwMAorI2RlZmluZSBSSU5HX0xFTgkJMHgwQworI2RlZmluZSBSSU5HX05SX1BBR0VTCQkweDAwMUZGMDAwCisjZGVmaW5lIFJJTkdfUkVQT1JUX01BU0sJMHgwMDAwMDAwNgorI2RlZmluZSBSSU5HX1JFUE9SVF82NEsJCTB4MDAwMDAwMDIKKyNkZWZpbmUgUklOR19SRVBPUlRfMTI4SwkweDAwMDAwMDA0CisjZGVmaW5lIFJJTkdfTk9fUkVQT1JUCQkweDAwMDAwMDAwCisjZGVmaW5lIFJJTkdfVkFMSURfTUFTSwkJMHgwMDAwMDAwMQorI2RlZmluZSBSSU5HX1ZBTElECQkweDAwMDAwMDAxCisjZGVmaW5lIFJJTkdfSU5WQUxJRAkJMHgwMDAwMDAwMAorCisvKiBJbnN0cnVjdGlvbiBwYXJzZXIgZXJyb3IgcmVnOgorICovCisjZGVmaW5lIElQRUlSCQkJMHgyMDg4CisKKy8qIFNjcmF0Y2ggcGFkIGRlYnVnIDAgcmVnOgorICovCisjZGVmaW5lIFNDUEQwCQkJMHgyMDljCisKKy8qIEVycm9yIHN0YXR1cyByZWc6CisgKi8KKyNkZWZpbmUgRVNSCQkJMHgyMGI4CisKKy8qIFNlY29uZGFyeSBETUEgZmV0Y2ggYWRkcmVzcyBkZWJ1ZyByZWc6CisgKi8KKyNkZWZpbmUgRE1BX0ZBRERfUwkJMHgyMGQ0CisKKy8qIENhY2hlIG1vZGUgMCByZWcuCisgKiAgLSBNYW5pcHVsYXRpbmcgcmVuZGVyIGNhY2hlIGJlaGF2aW91ciBpcyBjZW50cmFsCisgKiAgICB0byB0aGUgY29uY2VwdCBvZiB6b25lIHJlbmRlcmluZywgdHVuaW5nIHRoaXMgcmVnIGNhbiBoZWxwIGF2b2lkCisgKiAgICB1bm5lY2Vzc2FyeSByZW5kZXIgY2FjaGUgcmVhZHMgYW5kIGV2ZW4gd3JpdGVzIChmb3Igei9zdGVuY2lsKQorICogICAgYXQgYmVnaW5uaW5nIGFuZCBlbmQgb2Ygc2NlbmUuCisgKgorICogLSBUbyBjaGFuZ2UgYSBiaXQsIHdyaXRlIHRvIHRoaXMgcmVnIHdpdGggYSBtYXNrIGJpdCBzZXQgYW5kIHRoZQorICogYml0IG9mIGludGVyZXN0IGVpdGhlciBzZXQgb3IgY2xlYXJlZC4gIEVHOiAoQklUPDwxNikgfCBCSVQgdG8gc2V0LgorICovCisjZGVmaW5lIENhY2hlX01vZGVfMAkJMHgyMTIwCisjZGVmaW5lIENNMF9NQVNLX1NISUZUICAgICAgICAgIDE2CisjZGVmaW5lIENNMF9JWl9PUFRfRElTQUJMRSAgICAgICgxPDw2KQorI2RlZmluZSBDTTBfWlJfT1BUX0RJU0FCTEUgICAgICAoMTw8NSkKKyNkZWZpbmUgQ00wX0RFUFRIX0VWSUNUX0RJU0FCTEUgKDE8PDQpCisjZGVmaW5lIENNMF9DT0xPUl9FVklDVF9ESVNBQkxFICgxPDwzKQorI2RlZmluZSBDTTBfREVQVEhfV1JJVEVfRElTQUJMRSAoMTw8MSkKKyNkZWZpbmUgQ00wX1JDX09QX0ZMVVNIX0RJU0FCTEUgKDE8PDApCisKKworLyogR3JhcGhpY3MgZmx1c2ggY29udHJvbC4gIEEgQ1BVIHdyaXRlIGZsdXNoZXMgdGhlIEdXQiBvZiBhbGwgd3JpdGVzLgorICogVGhlIGRhdGEgaXMgZGlzY2FyZGVkLgorICovCisjZGVmaW5lIEdGWF9GTFNIX0NOVEwJCTB4MjE3MAorCisvKiBCaW5uZXIgY29udHJvbC4gIERlZmluZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBiaW4gcG9pbnRlciBsaXN0OgorICovCisjZGVmaW5lIEJJTkNUTAkJCTB4MjQyMAorI2RlZmluZSBCQ19NQVNLCQkJKDEgPDwgOSkKKworLyogQmlubmVkIHNjZW5lIGluZm8uCisgKi8KKyNkZWZpbmUgQklOU0NFTkUJCTB4MjQyOAorI2RlZmluZSBCU19PUF9MT0FECQkoMSA8PCA4KQorI2RlZmluZSBCU19NQVNLCQkJKDEgPDwgMjIpCisKKy8qIEJpbiBjb21tYW5kIHBhcnNlciBkZWJ1ZyByZWc6CisgKi8KKyNkZWZpbmUgQkNQRAkJCTB4MjQ4MAorCisvKiBCaW4gbWVtb3J5IGNvbnRyb2wgZGVidWcgcmVnOgorICovCisjZGVmaW5lIEJNQ0QJCQkweDI0ODQKKworLyogQmluIGRhdGEgY2FjaGUgZGVidWcgcmVnOgorICovCisjZGVmaW5lIEJEQ0QJCQkweDI0ODgKKworLyogQmlubmVyIHBvaW50ZXIgY2FjaGUgZGVidWcgcmVnOgorICovCisjZGVmaW5lIEJQQ0QJCQkweDI0OGMKKworLyogQmlubmVyIHNjcmF0Y2ggcGFkIGRlYnVnIHJlZzoKKyAqLworI2RlZmluZSBCSU5TS1BECQkJMHgyNGYwCisKKy8qIEhXQiBzY3JhdGNoIHBhZCBkZWJ1ZyByZWc6CisgKi8KKyNkZWZpbmUgSFdCU0tQRAkJCTB4MjRmNAorCisvKiBCaW5uZXIgbWVtb3J5IHBvb2wgcmVnOgorICovCisjZGVmaW5lIEJNUF9CVUZGRVIJCTB4MjQzMAorI2RlZmluZSBCTVBfUEFHRV9TSVpFXzRLCSgwIDw8IDEwKQorI2RlZmluZSBCTVBfQlVGRkVSX1NJWkVfU0hJRlQJMQorI2RlZmluZSBCTVBfRU5BQkxFCQkoMSA8PCAwKQorCisvKiBHZXQvcHV0IG1lbW9yeSBmcm9tIHRoZSBiaW5uZXIgbWVtb3J5IHBvb2w6CisgKi8KKyNkZWZpbmUgQk1QX0dFVAkJCTB4MjQzOAorI2RlZmluZSBCTVBfUFVUCQkJMHgyNDQwCisjZGVmaW5lIEJNUF9PRkZTRVRfU0hJRlQJNQorCisvKiAzRCBzdGF0ZSBwYWNrZXRzOgorICovCisjZGVmaW5lIEdGWF9PUF9SQVNURVJfUlVMRVMgICAgKCgweDM8PDI5KXwoMHg3PDwyNCkpCiAKICNkZWZpbmUgR0ZYX09QX1NDSVNTT1IgICAgICAgICAoKDB4Mzw8MjkpfCgweDFjPDwyNCl8KDB4MTA8PDE5KSkKICNkZWZpbmUgU0NfVVBEQVRFX1NDSVNTT1IgICAgICAgKDB4MTw8MSkKICNkZWZpbmUgU0NfRU5BQkxFX01BU0sgICAgICAgICAgKDB4MTw8MCkKICNkZWZpbmUgU0NfRU5BQkxFICAgICAgICAgICAgICAgKDB4MTw8MCkKIAorI2RlZmluZSBHRlhfT1BfTE9BRF9JTkRJUkVDVCAgICgoMHgzPDwyOSl8KDB4MWQ8PDI0KXwoMHg3PDwxNikpCisKICNkZWZpbmUgR0ZYX09QX1NDSVNTT1JfSU5GTyAgICAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4ODE8PDE2KXwoMHgxKSkKICNkZWZpbmUgU0NJX1lNSU5fTUFTSyAgICAgICgweGZmZmY8PDE2KQogI2RlZmluZSBTQ0lfWE1JTl9NQVNLICAgICAgKDB4ZmZmZjw8MCkKQEAgLTI5MCwxNyArNTQ5LDE5IEBACiAKICNkZWZpbmUgR0ZYX09QX0RSQVdSRUNUX0lORk9fSTk2NSAoKDB4NzkwMDw8MTYpfDB4MikKIAorI2RlZmluZSBTUkNfQ09QWV9CTFRfQ01EICAgICAgICAgICAgICAgICgoMjw8MjkpfCgweDQzPDwyMil8NCkKICNkZWZpbmUgWFlfU1JDX0NPUFlfQkxUX0NNRAkJKCgyPDwyOSl8KDB4NTM8PDIyKXw2KQogI2RlZmluZSBYWV9TUkNfQ09QWV9CTFRfV1JJVEVfQUxQSEEJKDE8PDIxKQogI2RlZmluZSBYWV9TUkNfQ09QWV9CTFRfV1JJVEVfUkdCCSgxPDwyMCkKIAotI2RlZmluZSBNSV9CQVRDSF9CVUZGRVIgCSgoMHgzMDw8MjMpfDEpCi0jZGVmaW5lIE1JX0JBVENIX0JVRkZFUl9TVEFSVCAJKDB4MzE8PDIzKQotI2RlZmluZSBNSV9CQVRDSF9CVUZGRVJfRU5EIAkoMHhBPDwyMykKKyNkZWZpbmUgTUlfQkFUQ0hfQlVGRkVSCQkoKDB4MzA8PDIzKXwxKQorI2RlZmluZSBNSV9CQVRDSF9CVUZGRVJfU1RBUlQJKDB4MzE8PDIzKQorI2RlZmluZSBNSV9CQVRDSF9CVUZGRVJfRU5ECSgweEE8PDIzKQogI2RlZmluZSBNSV9CQVRDSF9OT05fU0VDVVJFCSgxKQogI2RlZmluZSBNSV9CQVRDSF9OT05fU0VDVVJFX0k5NjUgKDE8PDgpCiAKICNkZWZpbmUgTUlfV0FJVF9GT1JfRVZFTlQgICAgICAgKCgweDM8PDIzKSkKKyNkZWZpbmUgTUlfV0FJVF9GT1JfUExBTkVfQl9GTElQICAgICAgKDE8PDYpCiAjZGVmaW5lIE1JX1dBSVRfRk9SX1BMQU5FX0FfRkxJUCAgICAgICgxPDwyKQogI2RlZmluZSBNSV9XQUlUX0ZPUl9QTEFORV9BX1NDQU5MSU5FUyAoMTw8MSkKIApAQCAtMzA4LDkgKzU2OSw1MzggQEAKIAogI2RlZmluZSBDTURfT1BfRElTUExBWUJVRkZFUl9JTkZPICgoMHgwPDwyOSl8KDB4MTQ8PDIzKXwyKQogI2RlZmluZSBBU1lOQ19GTElQICAgICAgICAgICAgICAgICgxPDwyMikKKyNkZWZpbmUgRElTUExBWV9QTEFORV9BICAgICAgICAgICAoMDw8MjApCisjZGVmaW5lIERJU1BMQVlfUExBTkVfQiAgICAgICAgICAgKDE8PDIwKQorCisvKiBEaXNwbGF5IHJlZ3MgKi8KKyNkZWZpbmUgRFNQQUNOVFIgICAgICAgICAgICAgICAgMHg3MDE4MAorI2RlZmluZSBEU1BCQ05UUiAgICAgICAgICAgICAgICAweDcxMTgwCisjZGVmaW5lIERJU1BQTEFORV9TRUxfUElQRV9NQVNLICAgICAgICAgICAgICAgICAoMTw8MjQpCisKKy8qIERlZmluZSB0aGUgcmVnaW9uIG9mIGludGVyZXN0IGZvciB0aGUgYmlubmVyOgorICovCisjZGVmaW5lIENNRF9PUF9CSU5fQ09OVFJPTAkgKCgweDM8PDI5KXwoMHgxZDw8MjQpfCgweDg0PDwxNil8NCkKIAogI2RlZmluZSBDTURfT1BfREVTVEJVRkZFUl9JTkZPCSAoKDB4Mzw8MjkpfCgweDFkPDwyNCl8KDB4OGU8PDE2KXwxKQogCi0jZGVmaW5lIFJFQURfQlJFQURDUlVNQihkZXZfcHJpdikgKCgodTMyICopKGRldl9wcml2LT5od19zdGF0dXNfcGFnZSkpWzVdKQorI2RlZmluZSBDTURfTUlfRkxVU0ggICAgICAgICAoMHgwNCA8PCAyMykKKyNkZWZpbmUgTUlfTk9fV1JJVEVfRkxVU0ggICAgKDEgPDwgMikKKyNkZWZpbmUgTUlfUkVBRF9GTFVTSCAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgTUlfRVhFX0ZMVVNIICAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgTUlfRU5EX1NDRU5FICAgICAgICAgKDEgPDwgNCkgLyogZmx1c2ggYmlubmVyIGFuZCBpbmNyIHNjZW5lIGNvdW50ICovCisjZGVmaW5lIE1JX1NDRU5FX0NPVU5UICAgICAgICgxIDw8IDMpIC8qIGp1c3QgaW5jcmVtZW50IHNjZW5lIGNvdW50ICovCisKKyNkZWZpbmUgQlJFQURDUlVNQl9CSVRTIDMxCisjZGVmaW5lIEJSRUFEQ1JVTUJfTUFTSyAoKDFVIDw8IEJSRUFEQ1JVTUJfQklUUykgLSAxKQorCisjZGVmaW5lIFJFQURfQlJFQURDUlVNQihkZXZfcHJpdikgICgoKHZvbGF0aWxlIHUzMiopKGRldl9wcml2LT5od19zdGF0dXNfcGFnZSkpWzVdKQorI2RlZmluZSBSRUFEX0hXU1AoZGV2X3ByaXYsIHJlZykgICgoKHZvbGF0aWxlIHUzMiopKGRldl9wcml2LT5od19zdGF0dXNfcGFnZSkpW3JlZ10pCisKKyNkZWZpbmUgQkxDX1BXTV9DVEwJCTB4NjEyNTQKKyNkZWZpbmUgQkFDS0xJR0hUX01PRFVMQVRJT05fRlJFUV9TSElGVAkJKDE3KQorCisjZGVmaW5lIEJMQ19QV01fQ1RMMgkJMHg2MTI1MAorLyoqCisgKiBUaGlzIGlzIHRoZSBtb3N0IHNpZ25pZmljYW50IDE1IGJpdHMgb2YgdGhlIG51bWJlciBvZiBiYWNrbGlnaHQgY3ljbGVzIGluIGEKKyAqIGNvbXBsZXRlIGN5Y2xlIG9mIHRoZSBtb2R1bGF0ZWQgYmFja2xpZ2h0IGNvbnRyb2wuCisgKgorICogVGhlIGFjdHVhbCB2YWx1ZSBpcyB0aGlzIGZpZWxkIG11bHRpcGxpZWQgYnkgdHdvLgorICovCisjZGVmaW5lIEJBQ0tMSUdIVF9NT0RVTEFUSU9OX0ZSRVFfTUFTSwkJKDB4N2ZmZiA8PCAxNykKKyNkZWZpbmUgQkxNX0xFR0FDWV9NT0RFCQkJCSgxIDw8IDE2KQorLyoqCisgKiBUaGlzIGlzIHRoZSBudW1iZXIgb2YgY3ljbGVzIG91dCBvZiB0aGUgYmFja2xpZ2h0IG1vZHVsYXRpb24gY3ljbGUgZm9yIHdoaWNoCisgKiB0aGUgYmFja2xpZ2h0IGlzIG9uLgorICoKKyAqIFRoaXMgZmllbGQgbXVzdCBiZSBubyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBjeWNsZXMgaW4gdGhlIGNvbXBsZXRlCisgKiBiYWNrbGlnaHQgbW9kdWxhdGlvbiBjeWNsZS4KKyAqLworI2RlZmluZSBCQUNLTElHSFRfRFVUWV9DWUNMRV9TSElGVAkJKDApCisjZGVmaW5lIEJBQ0tMSUdIVF9EVVRZX0NZQ0xFX01BU0sJCSgweGZmZmYpCisKKyNkZWZpbmUgSTkxNV9HQ0ZHQwkJCTB4ZjAKKyNkZWZpbmUgSTkxNV9MT1dfRlJFUVVFTkNZX0VOQUJMRQkJKDEgPDwgNykKKyNkZWZpbmUgSTkxNV9ESVNQTEFZX0NMT0NLXzE5MF8yMDBfTUhaCQkoMCA8PCA0KQorI2RlZmluZSBJOTE1X0RJU1BMQVlfQ0xPQ0tfMzMzX01IWgkJKDQgPDwgNCkKKyNkZWZpbmUgSTkxNV9ESVNQTEFZX0NMT0NLX01BU0sJCQkoNyA8PCA0KQorCisjZGVmaW5lIEk4NTVfSFBMTENDCQkJMHhjMAorI2RlZmluZSBJODU1X0NMT0NLX0NPTlRST0xfTUFTSwkJCSgzIDw8IDApCisjZGVmaW5lIEk4NTVfQ0xPQ0tfMTMzXzIwMAkJCSgwIDw8IDApCisjZGVmaW5lIEk4NTVfQ0xPQ0tfMTAwXzIwMAkJCSgxIDw8IDApCisjZGVmaW5lIEk4NTVfQ0xPQ0tfMTAwXzEzMwkJCSgyIDw8IDApCisjZGVmaW5lIEk4NTVfQ0xPQ0tfMTY2XzI1MAkJCSgzIDw8IDApCisKKy8qIHAzMTcsIDMxOQorICovCisjZGVmaW5lIFZDTEsyX1ZDT19NICAgICAgICAweDYwMDggLyogdHJlYXQgYXMgMTYgYml0PyAoaW5jbHVkZXMgbXNicykgKi8KKyNkZWZpbmUgVkNMSzJfVkNPX04gICAgICAgIDB4NjAwYQorI2RlZmluZSBWQ0xLMl9WQ09fRElWX1NFTCAgMHg2MDEyCisKKyNkZWZpbmUgVkNMS19ESVZJU09SX1ZHQTAgICAweDYwMDAKKyNkZWZpbmUgVkNMS19ESVZJU09SX1ZHQTEgICAweDYwMDQKKyNkZWZpbmUgVkNMS19QT1NUX0RJVgkgICAgMHg2MDEwCisvKiogU2VsZWN0cyBhIHBvc3QgZGl2aXNvciBvZiA0IGluc3RlYWQgb2YgMi4gKi8KKyMgZGVmaW5lIFZHQTFfUERfUDJfRElWXzQJKDEgPDwgMTUpCisvKiogT3ZlcnJpZGVzIHRoZSBwMiBwb3N0IGRpdmlzb3IgZmllbGQgKi8KKyMgZGVmaW5lIFZHQTFfUERfUDFfRElWXzIJKDEgPDwgMTMpCisjIGRlZmluZSBWR0ExX1BEX1AxX1NISUZUCTgKKy8qKiBQMSB2YWx1ZSBpcyAyIGdyZWF0ZXIgdGhhbiB0aGlzIGZpZWxkICovCisjIGRlZmluZSBWR0ExX1BEX1AxX01BU0sJKDB4MWYgPDwgOCkKKy8qKiBTZWxlY3RzIGEgcG9zdCBkaXZpc29yIG9mIDQgaW5zdGVhZCBvZiAyLiAqLworIyBkZWZpbmUgVkdBMF9QRF9QMl9ESVZfNAkoMSA8PCA3KQorLyoqIE92ZXJyaWRlcyB0aGUgcDIgcG9zdCBkaXZpc29yIGZpZWxkICovCisjIGRlZmluZSBWR0EwX1BEX1AxX0RJVl8yCSgxIDw8IDUpCisjIGRlZmluZSBWR0EwX1BEX1AxX1NISUZUCTAKKy8qKiBQMSB2YWx1ZSBpcyAyIGdyZWF0ZXIgdGhhbiB0aGlzIGZpZWxkICovCisjIGRlZmluZSBWR0EwX1BEX1AxX01BU0sJKDB4MWYgPDwgMCkKKworLyogSTgzMCBDUlRDIHJlZ2lzdGVycyAqLworI2RlZmluZSBIVE9UQUxfQQkweDYwMDAwCisjZGVmaW5lIEhCTEFOS19BCTB4NjAwMDQKKyNkZWZpbmUgSFNZTkNfQQkJMHg2MDAwOAorI2RlZmluZSBWVE9UQUxfQQkweDYwMDBjCisjZGVmaW5lIFZCTEFOS19BCTB4NjAwMTAKKyNkZWZpbmUgVlNZTkNfQQkJMHg2MDAxNAorI2RlZmluZSBQSVBFQVNSQwkweDYwMDFjCisjZGVmaW5lIEJDTFJQQVRfQQkweDYwMDIwCisjZGVmaW5lIFZTWU5DU0hJRlRfQQkweDYwMDI4CisKKyNkZWZpbmUgSFRPVEFMX0IJMHg2MTAwMAorI2RlZmluZSBIQkxBTktfQgkweDYxMDA0CisjZGVmaW5lIEhTWU5DX0IJCTB4NjEwMDgKKyNkZWZpbmUgVlRPVEFMX0IJMHg2MTAwYworI2RlZmluZSBWQkxBTktfQgkweDYxMDEwCisjZGVmaW5lIFZTWU5DX0IJCTB4NjEwMTQKKyNkZWZpbmUgUElQRUJTUkMJMHg2MTAxYworI2RlZmluZSBCQ0xSUEFUX0IJMHg2MTAyMAorI2RlZmluZSBWU1lOQ1NISUZUX0IJMHg2MTAyOAorCisjZGVmaW5lIFBQX1NUQVRVUwkweDYxMjAwCisjIGRlZmluZSBQUF9PTgkJCQkJKDEgPDwgMzEpCisvKioKKyAqIEluZGljYXRlcyB0aGF0IGFsbCBkZXBlbmRlbmNpZXMgb2YgdGhlIHBhbmVsIGFyZSBvbjoKKyAqCisgKiAtIFBMTCBlbmFibGVkCisgKiAtIHBpcGUgZW5hYmxlZAorICogLSBMVkRTL0RWT0IvRFZPQyBvbgorICovCisjIGRlZmluZSBQUF9SRUFEWQkJCQkoMSA8PCAzMCkKKyMgZGVmaW5lIFBQX1NFUVVFTkNFX05PTkUJCQkoMCA8PCAyOCkKKyMgZGVmaW5lIFBQX1NFUVVFTkNFX09OCQkJCSgxIDw8IDI4KQorIyBkZWZpbmUgUFBfU0VRVUVOQ0VfT0ZGCQkJKDIgPDwgMjgpCisjIGRlZmluZSBQUF9TRVFVRU5DRV9NQVNLCQkJMHgzMDAwMDAwMAorI2RlZmluZSBQUF9DT05UUk9MCTB4NjEyMDQKKyMgZGVmaW5lIFBPV0VSX1RBUkdFVF9PTgkJCSgxIDw8IDApCisKKyNkZWZpbmUgTFZEU1BQX09OICAgICAgIDB4NjEyMDgKKyNkZWZpbmUgTFZEU1BQX09GRiAgICAgIDB4NjEyMGMKKyNkZWZpbmUgUFBfQ1lDTEUgICAgICAgIDB4NjEyMTAKKworI2RlZmluZSBQRklUX0NPTlRST0wJMHg2MTIzMAorIyBkZWZpbmUgUEZJVF9FTkFCTEUJCQkJKDEgPDwgMzEpCisjIGRlZmluZSBQRklUX1BJUEVfTUFTSwkJCQkoMyA8PCAyOSkKKyMgZGVmaW5lIFBGSVRfUElQRV9TSElGVAkJCTI5CisjIGRlZmluZSBWRVJUX0lOVEVSUF9ESVNBQkxFCQkJKDAgPDwgMTApCisjIGRlZmluZSBWRVJUX0lOVEVSUF9CSUxJTkVBUgkJCSgxIDw8IDEwKQorIyBkZWZpbmUgVkVSVF9JTlRFUlBfTUFTSwkJCSgzIDw8IDEwKQorIyBkZWZpbmUgVkVSVF9BVVRPX1NDQUxFCQkJKDEgPDwgOSkKKyMgZGVmaW5lIEhPUklaX0lOVEVSUF9ESVNBQkxFCQkJKDAgPDwgNikKKyMgZGVmaW5lIEhPUklaX0lOVEVSUF9CSUxJTkVBUgkJCSgxIDw8IDYpCisjIGRlZmluZSBIT1JJWl9JTlRFUlBfTUFTSwkJCSgzIDw8IDYpCisjIGRlZmluZSBIT1JJWl9BVVRPX1NDQUxFCQkJKDEgPDwgNSkKKyMgZGVmaW5lIFBBTkVMXzhUTzZfRElUSEVSX0VOQUJMRQkJKDEgPDwgMykKKworI2RlZmluZSBQRklUX1BHTV9SQVRJT1MJMHg2MTIzNAorIyBkZWZpbmUgUEZJVF9WRVJUX1NDQUxFX01BU0sJCQkweGZmZjAwMDAwCisjIGRlZmluZSBQRklUX0hPUklaX1NDQUxFX01BU0sJCQkweDAwMDBmZmYwCisKKyNkZWZpbmUgUEZJVF9BVVRPX1JBVElPUwkweDYxMjM4CisKKworI2RlZmluZSBEUExMX0EJCTB4MDYwMTQKKyNkZWZpbmUgRFBMTF9CCQkweDA2MDE4CisjIGRlZmluZSBEUExMX1ZDT19FTkFCTEUJCQkoMSA8PCAzMSkKKyMgZGVmaW5lIERQTExfRFZPX0hJR0hfU1BFRUQJCQkoMSA8PCAzMCkKKyMgZGVmaW5lIERQTExfU1lOQ0xPQ0tfRU5BQkxFCQkJKDEgPDwgMjkpCisjIGRlZmluZSBEUExMX1ZHQV9NT0RFX0RJUwkJCSgxIDw8IDI4KQorIyBkZWZpbmUgRFBMTEJfTU9ERV9EQUNfU0VSSUFMCQkJKDEgPDwgMjYpIC8qIGk5MTUgKi8KKyMgZGVmaW5lIERQTExCX01PREVfTFZEUwkJCSgyIDw8IDI2KSAvKiBpOTE1ICovCisjIGRlZmluZSBEUExMX01PREVfTUFTSwkJCQkoMyA8PCAyNikKKyMgZGVmaW5lIERQTExfREFDX1NFUklBTF9QMl9DTE9DS19ESVZfMTAJKDAgPDwgMjQpIC8qIGk5MTUgKi8KKyMgZGVmaW5lIERQTExfREFDX1NFUklBTF9QMl9DTE9DS19ESVZfNQkJKDEgPDwgMjQpIC8qIGk5MTUgKi8KKyMgZGVmaW5lIERQTExCX0xWRFNfUDJfQ0xPQ0tfRElWXzE0CQkoMCA8PCAyNCkgLyogaTkxNSAqLworIyBkZWZpbmUgRFBMTEJfTFZEU19QMl9DTE9DS19ESVZfNwkJKDEgPDwgMjQpIC8qIGk5MTUgKi8KKyMgZGVmaW5lIERQTExfUDJfQ0xPQ0tfRElWX01BU0sJCQkweDAzMDAwMDAwIC8qIGk5MTUgKi8KKyMgZGVmaW5lIERQTExfRlBBMDFfUDFfUE9TVF9ESVZfTUFTSwkJMHgwMGZmMDAwMCAvKiBpOTE1ICovCisvKioKKyAqICBUaGUgaTgzMCBnZW5lcmF0aW9uLCBpbiBEQUMvc2VyaWFsIG1vZGUsIGRlZmluZXMgcDEgYXMgdHdvIHBsdXMgdGhpcworICogYml0ZmllbGQsIG9yIGp1c3QgMiBpZiBQTExfUDFfRElWSURFX0JZX1RXTyBpcyBzZXQuCisgKi8KKyMgZGVmaW5lIERQTExfRlBBMDFfUDFfUE9TVF9ESVZfTUFTS19JODMwCTB4MDAxZjAwMDAKKy8qKgorICogVGhlIGk4MzAgZ2VuZXJhdGlvbiwgaW4gTFZEUyBtb2RlLCBkZWZpbmVzIFAxIGFzIHRoZSBiaXQgbnVtYmVyIHNldCB3aXRoaW4KKyAqIHRoaXMgZmllbGQgKG9ubHkgb25lIGJpdCBtYXkgYmUgc2V0KS4KKyAqLworIyBkZWZpbmUgRFBMTF9GUEEwMV9QMV9QT1NUX0RJVl9NQVNLX0k4MzBfTFZEUwkweDAwM2YwMDAwCisjIGRlZmluZSBEUExMX0ZQQTAxX1AxX1BPU1RfRElWX1NISUZUCQkxNgorIyBkZWZpbmUgUExMX1AyX0RJVklERV9CWV80CQkJKDEgPDwgMjMpIC8qIGk4MzAsIHJlcXVpcmVkIGluIERWTyBub24tZ2FuZyAqLworIyBkZWZpbmUgUExMX1AxX0RJVklERV9CWV9UV08JCQkoMSA8PCAyMSkgLyogaTgzMCAqLworIyBkZWZpbmUgUExMX1JFRl9JTlBVVF9EUkVGQ0xLCQkJKDAgPDwgMTMpCisjIGRlZmluZSBQTExfUkVGX0lOUFVUX1RWQ0xLSU5BCQkJKDEgPDwgMTMpIC8qIGk4MzAgKi8KKyMgZGVmaW5lIFBMTF9SRUZfSU5QVVRfVFZDTEtJTkJDCQkoMiA8PCAxMykgLyogU0RWTyBUVkNMS0lOICovCisjIGRlZmluZSBQTExCX1JFRl9JTlBVVF9TUFJFQURTUEVDVFJVTUlOCSgzIDw8IDEzKQorIyBkZWZpbmUgUExMX1JFRl9JTlBVVF9NQVNLCQkJKDMgPDwgMTMpCisjIGRlZmluZSBQTExfTE9BRF9QVUxTRV9QSEFTRV9TSElGVAkJOQorLyoKKyAqIFBhcmFsbGVsIHRvIFNlcmlhbCBMb2FkIFB1bHNlIHBoYXNlIHNlbGVjdGlvbi4KKyAqIFNlbGVjdHMgdGhlIHBoYXNlIGZvciB0aGUgMTBYIERQTEwgY2xvY2sgZm9yIHRoZSBQQ0llCisgKiBkaWdpdGFsIGRpc3BsYXkgcG9ydC4gVGhlIHJhbmdlIGlzIDQgdG8gMTM7IDEwIG9yIG1vcmUKKyAqIGlzIGp1c3QgYSBmbGlwIGRlbGF5LiBUaGUgZGVmYXVsdCBpcyA2CisgKi8KKyMgZGVmaW5lIFBMTF9MT0FEX1BVTFNFX1BIQVNFX01BU0sJCSgweGYgPDwgUExMX0xPQURfUFVMU0VfUEhBU0VfU0hJRlQpCisjIGRlZmluZSBESVNQTEFZX1JBVEVfU0VMRUNUX0ZQQTEJCSgxIDw8IDgpCisKKy8qKgorICogU0RWTyBtdWx0aXBsaWVyIGZvciA5NDVHL0dNLiBOb3QgdXNlZCBvbiA5NjUuCisgKgorICogXHNhIERQTExfTURfVURJX01VTFRJUExJRVJfTUFTSworICovCisjIGRlZmluZSBTRFZPX01VTFRJUExJRVJfTUFTSwkJCTB4MDAwMDAwZmYKKyMgZGVmaW5lIFNEVk9fTVVMVElQTElFUl9TSElGVF9ISVJFUwkJNAorIyBkZWZpbmUgU0RWT19NVUxUSVBMSUVSX1NISUZUX1ZHQQkJMAorCisvKiogQGRlZmdyb3VwIERQTExfTUQKKyAqIEB7CisgKi8KKy8qKiBQaXBlIEEgU0RWTy9VREkgY2xvY2sgbXVsdGlwbGllci9kaXZpZGVyIHJlZ2lzdGVyIGZvciBHOTY1LiAqLworI2RlZmluZSBEUExMX0FfTUQJCTB4MDYwMWMKKy8qKiBQaXBlIEIgU0RWTy9VREkgY2xvY2sgbXVsdGlwbGllci9kaXZpZGVyIHJlZ2lzdGVyIGZvciBHOTY1LiAqLworI2RlZmluZSBEUExMX0JfTUQJCTB4MDYwMjAKKy8qKgorICogVURJIHBpeGVsIGRpdmlkZXIsIGNvbnRyb2xsaW5nIGhvdyBtYW55IHBpeGVscyBhcmUgc3R1ZmZlZCBpbnRvIGEgcGFja2V0LgorICoKKyAqIFZhbHVlIGlzIHBpeGVscyBtaW51cyAxLiAgTXVzdCBiZSBzZXQgdG8gMSBwaXhlbCBmb3IgU0RWTy4KKyAqLworIyBkZWZpbmUgRFBMTF9NRF9VRElfRElWSURFUl9NQVNLCQkweDNmMDAwMDAwCisjIGRlZmluZSBEUExMX01EX1VESV9ESVZJREVSX1NISUZUCQkyNAorLyoqIFVESSBwaXhlbCBkaXZpZGVyIGZvciBWR0EsIHNhbWUgYXMgRFBMTF9NRF9VRElfRElWSURFUl9NQVNLLiAqLworIyBkZWZpbmUgRFBMTF9NRF9WR0FfVURJX0RJVklERVJfTUFTSwkJMHgwMDNmMDAwMAorIyBkZWZpbmUgRFBMTF9NRF9WR0FfVURJX0RJVklERVJfU0hJRlQJCTE2CisvKioKKyAqIFNEVk8vVURJIHBpeGVsIG11bHRpcGxpZXIuCisgKgorICogU0RWTyByZXF1aXJlcyB0aGF0IHRoZSBidXMgY2xvY2sgcmF0ZSBiZSBiZXR3ZWVuIDEgYW5kIDIgR2h6LCBhbmQgdGhlIGJ1cworICogY2xvY2sgcmF0ZSBpcyAxMCB0aW1lcyB0aGUgRFBMTCBjbG9jay4gIEF0IGxvdyByZXNvbHV0aW9uL3JlZnJlc2ggcmF0ZQorICogbW9kZXMsIHRoZSBidXMgcmF0ZSB3b3VsZCBiZSBiZWxvdyB0aGUgbGltaXRzLCBzbyBTRFZPIGFsbG93cyBmb3Igc3R1ZmZpbmcKKyAqIGR1bW15IGJ5dGVzIGluIHRoZSBkYXRhc3RyZWFtIGF0IGFuIGluY3JlYXNlZCBjbG9jayByYXRlLCB3aXRoIGJvdGggc2lkZXMgb2YKKyAqIHRoZSBsaW5rIGtub3dpbmcgaG93IG1hbnkgYnl0ZXMgYXJlIGZpbGwuCisgKgorICogU28sIGZvciBhIG1vZGUgd2l0aCBhIGRvdGNsb2NrIG9mIDY1TWh6LCB3ZSB3b3VsZCB3YW50IHRvIGRvdWJsZSB0aGUgY2xvY2sKKyAqIHJhdGUgdG8gMTMwTWh6IHRvIGdldCBhIGJ1cyByYXRlIG9mIDEuMzBHaHouICBUaGUgRFBMTCBjbG9jayByYXRlIHdvdWxkIGJlCisgKiBzZXQgdG8gMTMwTWh6LCBhbmQgdGhlIFNEVk8gbXVsdGlwbGllciBzZXQgdG8gMnggaW4gdGhpcyByZWdpc3RlciBhbmQKKyAqIHRocm91Z2ggYW4gU0RWTyBjb21tYW5kLgorICoKKyAqIFRoaXMgcmVnaXN0ZXIgZmllbGQgaGFzIHZhbHVlcyBvZiBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgbWludXMgMSwgd2l0aAorICogYSBtYXhpbXVtIG11bHRpcGxpZXIgb2YgNSBmb3IgU0RWTy4KKyAqLworIyBkZWZpbmUgRFBMTF9NRF9VRElfTVVMVElQTElFUl9NQVNLCQkweDAwMDAzZjAwCisjIGRlZmluZSBEUExMX01EX1VESV9NVUxUSVBMSUVSX1NISUZUCQk4CisvKiogU0RWTy9VREkgcGl4ZWwgbXVsdGlwbGllciBmb3IgVkdBLCBzYW1lIGFzIERQTExfTURfVURJX01VTFRJUExJRVJfTUFTSy4KKyAqIFRoaXMgYmVzdCBiZSBzZXQgdG8gdGhlIGRlZmF1bHQgdmFsdWUgKDMpIG9yIHRoZSBDUlQgd29uJ3Qgd29yay4gTm8sCisgKiBJIGRvbid0IGVudGlyZWx5IHVuZGVyc3RhbmQgd2hhdCB0aGlzIGRvZXMuLi4KKyAqLworIyBkZWZpbmUgRFBMTF9NRF9WR0FfVURJX01VTFRJUExJRVJfTUFTSwkweDAwMDAwMDNmCisjIGRlZmluZSBEUExMX01EX1ZHQV9VRElfTVVMVElQTElFUl9TSElGVAkwCisvKiogQH0gKi8KKworI2RlZmluZSBEUExMX1RFU1QJCTB4NjA2YworIyBkZWZpbmUgRFBMTEJfVEVTVF9TRFZPX0RJVl8xCQkJKDAgPDwgMjIpCisjIGRlZmluZSBEUExMQl9URVNUX1NEVk9fRElWXzIJCQkoMSA8PCAyMikKKyMgZGVmaW5lIERQTExCX1RFU1RfU0RWT19ESVZfNAkJCSgyIDw8IDIyKQorIyBkZWZpbmUgRFBMTEJfVEVTVF9TRFZPX0RJVl9NQVNLCQkoMyA8PCAyMikKKyMgZGVmaW5lIERQTExCX1RFU1RfTl9CWVBBU1MJCQkoMSA8PCAxOSkKKyMgZGVmaW5lIERQTExCX1RFU1RfTV9CWVBBU1MJCQkoMSA8PCAxOCkKKyMgZGVmaW5lIERQTExCX0lOUFVUX0JVRkZFUl9FTkFCTEUJCSgxIDw8IDE2KQorIyBkZWZpbmUgRFBMTEFfVEVTVF9OX0JZUEFTUwkJCSgxIDw8IDMpCisjIGRlZmluZSBEUExMQV9URVNUX01fQllQQVNTCQkJKDEgPDwgMikKKyMgZGVmaW5lIERQTExBX0lOUFVUX0JVRkZFUl9FTkFCTEUJCSgxIDw8IDApCisKKyNkZWZpbmUgQURQQQkJCTB4NjExMDAKKyNkZWZpbmUgQURQQV9EQUNfRU5BQkxFCQkoMTw8MzEpCisjZGVmaW5lIEFEUEFfREFDX0RJU0FCTEUJMAorI2RlZmluZSBBRFBBX1BJUEVfU0VMRUNUX01BU0sJKDE8PDMwKQorI2RlZmluZSBBRFBBX1BJUEVfQV9TRUxFQ1QJMAorI2RlZmluZSBBRFBBX1BJUEVfQl9TRUxFQ1QJKDE8PDMwKQorI2RlZmluZSBBRFBBX1VTRV9WR0FfSFZQT0xBUklUWSAoMTw8MTUpCisjZGVmaW5lIEFEUEFfU0VUU19IVlBPTEFSSVRZCTAKKyNkZWZpbmUgQURQQV9WU1lOQ19DTlRMX0RJU0FCTEUgKDE8PDExKQorI2RlZmluZSBBRFBBX1ZTWU5DX0NOVExfRU5BQkxFCTAKKyNkZWZpbmUgQURQQV9IU1lOQ19DTlRMX0RJU0FCTEUgKDE8PDEwKQorI2RlZmluZSBBRFBBX0hTWU5DX0NOVExfRU5BQkxFCTAKKyNkZWZpbmUgQURQQV9WU1lOQ19BQ1RJVkVfSElHSAkoMTw8NCkKKyNkZWZpbmUgQURQQV9WU1lOQ19BQ1RJVkVfTE9XCTAKKyNkZWZpbmUgQURQQV9IU1lOQ19BQ1RJVkVfSElHSAkoMTw8MykKKyNkZWZpbmUgQURQQV9IU1lOQ19BQ1RJVkVfTE9XCTAKKworI2RlZmluZSBGUEEwCQkweDA2MDQwCisjZGVmaW5lIEZQQTEJCTB4MDYwNDQKKyNkZWZpbmUgRlBCMAkJMHgwNjA0OAorI2RlZmluZSBGUEIxCQkweDA2MDRjCisjIGRlZmluZSBGUF9OX0RJVl9NQVNLCQkJCTB4MDAzZjAwMDAKKyMgZGVmaW5lIEZQX05fRElWX1NISUZUCQkJCTE2CisjIGRlZmluZSBGUF9NMV9ESVZfTUFTSwkJCQkweDAwMDAzZjAwCisjIGRlZmluZSBGUF9NMV9ESVZfU0hJRlQJCQk4CisjIGRlZmluZSBGUF9NMl9ESVZfTUFTSwkJCQkweDAwMDAwMDNmCisjIGRlZmluZSBGUF9NMl9ESVZfU0hJRlQJCQkwCisKKworI2RlZmluZSBQT1JUX0hPVFBMVUdfRU4JCTB4NjExMTAKKyMgZGVmaW5lIFNEVk9CX0hPVFBMVUdfSU5UX0VOCQkJKDEgPDwgMjYpCisjIGRlZmluZSBTRFZPQ19IT1RQTFVHX0lOVF9FTgkJCSgxIDw8IDI1KQorIyBkZWZpbmUgVFZfSE9UUExVR19JTlRfRU4JCQkoMSA8PCAxOCkKKyMgZGVmaW5lIENSVF9IT1RQTFVHX0lOVF9FTgkJCSgxIDw8IDkpCisjIGRlZmluZSBDUlRfSE9UUExVR19GT1JDRV9ERVRFQ1QJCSgxIDw8IDMpCisKKyNkZWZpbmUgUE9SVF9IT1RQTFVHX1NUQVQJMHg2MTExNAorIyBkZWZpbmUgQ1JUX0hPVFBMVUdfSU5UX1NUQVRVUwkJCSgxIDw8IDExKQorIyBkZWZpbmUgVFZfSE9UUExVR19JTlRfU1RBVFVTCQkJKDEgPDwgMTApCisjIGRlZmluZSBDUlRfSE9UUExVR19NT05JVE9SX01BU0sJCSgzIDw8IDgpCisjIGRlZmluZSBDUlRfSE9UUExVR19NT05JVE9SX0NPTE9SCQkoMyA8PCA4KQorIyBkZWZpbmUgQ1JUX0hPVFBMVUdfTU9OSVRPUl9NT05PCQkoMiA8PCA4KQorIyBkZWZpbmUgQ1JUX0hPVFBMVUdfTU9OSVRPUl9OT05FCQkoMCA8PCA4KQorIyBkZWZpbmUgU0RWT0NfSE9UUExVR19JTlRfU1RBVFVTCQkoMSA8PCA3KQorIyBkZWZpbmUgU0RWT0JfSE9UUExVR19JTlRfU1RBVFVTCQkoMSA8PCA2KQorCisjZGVmaW5lIFNEVk9CCQkJMHg2MTE0MAorI2RlZmluZSBTRFZPQwkJCTB4NjExNjAKKyNkZWZpbmUgU0RWT19FTkFCTEUJCQkJKDEgPDwgMzEpCisjZGVmaW5lIFNEVk9fUElQRV9CX1NFTEVDVAkJCSgxIDw8IDMwKQorI2RlZmluZSBTRFZPX1NUQUxMX1NFTEVDVAkJCSgxIDw8IDI5KQorI2RlZmluZSBTRFZPX0lOVEVSUlVQVF9FTkFCTEUJCQkoMSA8PCAyNikKKy8qKgorICogOTE1Ry9HTSBTRFZPIHBpeGVsIG11bHRpcGxpZXIuCisgKgorICogUHJvZ3JhbW1lZCB2YWx1ZSBpcyBtdWx0aXBsaWVyIC0gMSwgdXAgdG8gNXguCisgKgorICogXHNhIERQTExfTURfVURJX01VTFRJUExJRVJfTUFTSworICovCisjZGVmaW5lIFNEVk9fUE9SVF9NVUxUSVBMWV9NQVNLCQkJKDcgPDwgMjMpCisjZGVmaW5lIFNEVk9fUE9SVF9NVUxUSVBMWV9TSElGVAkJMjMKKyNkZWZpbmUgU0RWT19QSEFTRV9TRUxFQ1RfTUFTSwkJCSgxNSA8PCAxOSkKKyNkZWZpbmUgU0RWT19QSEFTRV9TRUxFQ1RfREVGQVVMVAkJKDYgPDwgMTkpCisjZGVmaW5lIFNEVk9fQ0xPQ0tfT1VUUFVUX0lOVkVSVAkJKDEgPDwgMTgpCisjZGVmaW5lIFNEVk9DX0dBTkdfTU9ERQkJCQkoMSA8PCAxNikKKyNkZWZpbmUgU0RWT19CT1JERVJfRU5BQkxFCQkJKDEgPDwgNykKKyNkZWZpbmUgU0RWT0JfUENJRV9DT05DVVJSRU5DWQkJCSgxIDw8IDMpCisjZGVmaW5lIFNEVk9fREVURUNURUQJCQkJKDEgPDwgMikKKy8qIEJpdHMgdG8gYmUgcHJlc2VydmVkIHdoZW4gd3JpdGluZyAqLworI2RlZmluZSBTRFZPQl9QUkVTRVJWRV9NQVNLCQkJKCgxIDw8IDE3KSB8ICgxIDw8IDE2KSB8ICgxIDw8IDE0KSkKKyNkZWZpbmUgU0RWT0NfUFJFU0VSVkVfTUFTSwkJCSgxIDw8IDE3KQorCisvKiogQGRlZmdyb3VwIExWRFMKKyAqIEB7CisgKi8KKy8qKgorICogVGhpcyByZWdpc3RlciBjb250cm9scyB0aGUgTFZEUyBvdXRwdXQgZW5hYmxlLCBwaXBlIHNlbGVjdGlvbiwgYW5kIGRhdGEKKyAqIGZvcm1hdCBzZWxlY3Rpb24uCisgKgorICogQWxsIG9mIHRoZSBjbG9jay9kYXRhIHBhaXJzIGFyZSBmb3JjZSBwb3dlcmVkIGRvd24gYnkgcG93ZXIgc2VxdWVuY2luZy4KKyAqLworI2RlZmluZSBMVkRTCQkJMHg2MTE4MAorLyoqCisgKiBFbmFibGVzIHRoZSBMVkRTIHBvcnQuICBUaGlzIGJpdCBtdXN0IGJlIHNldCBiZWZvcmUgRFBMTHMgYXJlIGVuYWJsZWQsIGFzCisgKiB0aGUgRFBMTCBzZW1hbnRpY3MgY2hhbmdlIHdoZW4gdGhlIExWRFMgaXMgYXNzaWduZWQgdG8gdGhhdCBwaXBlLgorICovCisjIGRlZmluZSBMVkRTX1BPUlRfRU4JCQkoMSA8PCAzMSkKKy8qKiBTZWxlY3RzIHBpcGUgQiBmb3IgTFZEUyBkYXRhLiAgTXVzdCBiZSBzZXQgb24gcHJlLTk2NS4gKi8KKyMgZGVmaW5lIExWRFNfUElQRUJfU0VMRUNUCQkoMSA8PCAzMCkKKworLyoqCisgKiBFbmFibGVzIHRoZSBBMC1BMiBkYXRhIHBhaXJzIGFuZCBDTEtBLCBjb250YWluaW5nIDE4IGJpdHMgb2YgY29sb3IgZGF0YSBwZXIKKyAqIHBpeGVsLgorICovCisjIGRlZmluZSBMVkRTX0EwQTJfQ0xLQV9QT1dFUl9NQVNLCSgzIDw8IDgpCisjIGRlZmluZSBMVkRTX0EwQTJfQ0xLQV9QT1dFUl9ET1dOCSgwIDw8IDgpCisjIGRlZmluZSBMVkRTX0EwQTJfQ0xLQV9QT1dFUl9VUAkoMyA8PCA4KQorLyoqCisgKiBDb250cm9scyB0aGUgQTMgZGF0YSBwYWlyLCB3aGljaCBjb250YWlucyB0aGUgYWRkaXRpb25hbCBMU0JzIGZvciAyNCBiaXQKKyAqIG1vZGUuICBPbmx5IGVuYWJsZWQgaWYgTFZEU19BMEEyX0NMS0FfUE9XRVJfVVAgYWxzbyBpbmRpY2F0ZXMgaXQgc2hvdWxkIGJlCisgKiBvbi4KKyAqLworIyBkZWZpbmUgTFZEU19BM19QT1dFUl9NQVNLCQkoMyA8PCA2KQorIyBkZWZpbmUgTFZEU19BM19QT1dFUl9ET1dOCQkoMCA8PCA2KQorIyBkZWZpbmUgTFZEU19BM19QT1dFUl9VUAkJKDMgPDwgNikKKy8qKgorICogQ29udHJvbHMgdGhlIENMS0IgcGFpci4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgc2V0IHdoZW4gTFZEU19CMEIzX1BPV0VSX1VQCisgKiBpcyBzZXQuCisgKi8KKyMgZGVmaW5lIExWRFNfQ0xLQl9QT1dFUl9NQVNLCQkoMyA8PCA0KQorIyBkZWZpbmUgTFZEU19DTEtCX1BPV0VSX0RPV04JCSgwIDw8IDQpCisjIGRlZmluZSBMVkRTX0NMS0JfUE9XRVJfVVAJCSgzIDw8IDQpCisKKy8qKgorICogQ29udHJvbHMgdGhlIEIwLUIzIGRhdGEgcGFpcnMuICBUaGlzIG11c3QgYmUgc2V0IHRvIG1hdGNoIHRoZSBEUExMIHAyCisgKiBzZXR0aW5nIGZvciB3aGV0aGVyIHdlIGFyZSBpbiBkdWFsLWNoYW5uZWwgbW9kZS4gIFRoZSBCMyBwYWlyIHdpbGwKKyAqIGFkZGl0aW9uYWxseSBvbmx5IGJlIHBvd2VyZWQgdXAgd2hlbiBMVkRTX0EzX1BPV0VSX1VQIGlzIHNldC4KKyAqLworIyBkZWZpbmUgTFZEU19CMEIzX1BPV0VSX01BU0sJCSgzIDw8IDIpCisjIGRlZmluZSBMVkRTX0IwQjNfUE9XRVJfRE9XTgkJKDAgPDwgMikKKyMgZGVmaW5lIExWRFNfQjBCM19QT1dFUl9VUAkJKDMgPDwgMikKKworI2RlZmluZSBQSVBFQUNPTkYgMHg3MDAwOAorI2RlZmluZSBQSVBFQUNPTkZfRU5BQkxFCSgxPDwzMSkKKyNkZWZpbmUgUElQRUFDT05GX0RJU0FCTEUJMAorI2RlZmluZSBQSVBFQUNPTkZfRE9VQkxFX1dJREUJKDE8PDMwKQorI2RlZmluZSBJOTY1X1BJUEVDT05GX0FDVElWRQkoMTw8MzApCisjZGVmaW5lIFBJUEVBQ09ORl9TSU5HTEVfV0lERQkwCisjZGVmaW5lIFBJUEVBQ09ORl9QSVBFX1VOTE9DS0VEIDAKKyNkZWZpbmUgUElQRUFDT05GX1BJUEVfTE9DS0VECSgxPDwyNSkKKyNkZWZpbmUgUElQRUFDT05GX1BBTEVUVEUJMAorI2RlZmluZSBQSVBFQUNPTkZfR0FNTUEJCSgxPDwyNCkKKyNkZWZpbmUgUElQRUNPTkZfRk9SQ0VfQk9SREVSCSgxPDwyNSkKKyNkZWZpbmUgUElQRUNPTkZfUFJPR1JFU1NJVkUJKDAgPDwgMjEpCisjZGVmaW5lIFBJUEVDT05GX0lOVEVSTEFDRV9XX0ZJRUxEX0lORElDQVRJT04JKDYgPDwgMjEpCisjZGVmaW5lIFBJUEVDT05GX0lOVEVSTEFDRV9GSUVMRF8wX09OTFkJCSg3IDw8IDIxKQorCisjZGVmaW5lIFBJUEVCQ09ORiAweDcxMDA4CisjZGVmaW5lIFBJUEVCQ09ORl9FTkFCTEUJKDE8PDMxKQorI2RlZmluZSBQSVBFQkNPTkZfRElTQUJMRQkwCisjZGVmaW5lIFBJUEVCQ09ORl9ET1VCTEVfV0lERQkoMTw8MzApCisjZGVmaW5lIFBJUEVCQ09ORl9ESVNBQkxFCTAKKyNkZWZpbmUgUElQRUJDT05GX0dBTU1BCQkoMTw8MjQpCisjZGVmaW5lIFBJUEVCQ09ORl9QQUxFVFRFCTAKKworI2RlZmluZSBQSVBFQkdDTUFYUkVECQkweDcxMDEwCisjZGVmaW5lIFBJUEVCR0NNQVhHUkVFTgkJMHg3MTAxNAorI2RlZmluZSBQSVBFQkdDTUFYQkxVRQkJMHg3MTAxOAorI2RlZmluZSBQSVBFQlNUQVQJCTB4NzEwMjQKKyNkZWZpbmUgUElQRUJGUkFNRUhJR0gJCTB4NzEwNDAKKyNkZWZpbmUgUElQRUJGUkFNRVBJWEVMCQkweDcxMDQ0CisKKyNkZWZpbmUgRFNQQUNOVFIJCTB4NzAxODAKKyNkZWZpbmUgRFNQQkNOVFIJCTB4NzExODAKKyNkZWZpbmUgRElTUExBWV9QTEFORV9FTkFCTEUJCQkoMTw8MzEpCisjZGVmaW5lIERJU1BMQVlfUExBTkVfRElTQUJMRQkJCTAKKyNkZWZpbmUgRElTUFBMQU5FX0dBTU1BX0VOQUJMRQkJCSgxPDwzMCkKKyNkZWZpbmUgRElTUFBMQU5FX0dBTU1BX0RJU0FCTEUJCQkwCisjZGVmaW5lIERJU1BQTEFORV9QSVhGT1JNQVRfTUFTSwkJKDB4Zjw8MjYpCisjZGVmaW5lIERJU1BQTEFORV84QlBQCQkJCSgweDI8PDI2KQorI2RlZmluZSBESVNQUExBTkVfMTVfMTZCUFAJCQkoMHg0PDwyNikKKyNkZWZpbmUgRElTUFBMQU5FXzE2QlBQCQkJCSgweDU8PDI2KQorI2RlZmluZSBESVNQUExBTkVfMzJCUFBfTk9fQUxQSEEJCSgweDY8PDI2KQorI2RlZmluZSBESVNQUExBTkVfMzJCUFAJCQkJKDB4Nzw8MjYpCisjZGVmaW5lIERJU1BQTEFORV9TVEVSRU9fRU5BQkxFCQkJKDE8PDI1KQorI2RlZmluZSBESVNQUExBTkVfU1RFUkVPX0RJU0FCTEUJCTAKKyNkZWZpbmUgRElTUFBMQU5FX1NFTF9QSVBFX01BU0sJCQkoMTw8MjQpCisjZGVmaW5lIERJU1BQTEFORV9TRUxfUElQRV9BCQkJMAorI2RlZmluZSBESVNQUExBTkVfU0VMX1BJUEVfQgkJCSgxPDwyNCkKKyNkZWZpbmUgRElTUFBMQU5FX1NSQ19LRVlfRU5BQkxFCQkoMTw8MjIpCisjZGVmaW5lIERJU1BQTEFORV9TUkNfS0VZX0RJU0FCTEUJCTAKKyNkZWZpbmUgRElTUFBMQU5FX0xJTkVfRE9VQkxFCQkJKDE8PDIwKQorI2RlZmluZSBESVNQUExBTkVfTk9fTElORV9ET1VCTEUJCTAKKyNkZWZpbmUgRElTUFBMQU5FX1NURVJFT19QT0xBUklUWV9GSVJTVAkJMAorI2RlZmluZSBESVNQUExBTkVfU1RFUkVPX1BPTEFSSVRZX1NFQ09ORAkoMTw8MTgpCisvKiBwbGFuZSBCIG9ubHkgKi8KKyNkZWZpbmUgRElTUFBMQU5FX0FMUEhBX1RSQU5TX0VOQUJMRQkJKDE8PDE1KQorI2RlZmluZSBESVNQUExBTkVfQUxQSEFfVFJBTlNfRElTQUJMRQkJMAorI2RlZmluZSBESVNQUExBTkVfU1BSSVRFX0FCT1ZFX0RJU1BMQVlBCQkwCisjZGVmaW5lIERJU1BQTEFORV9TUFJJVEVfQUJPVkVfT1ZFUkxBWQkJKDEpCisKKyNkZWZpbmUgRFNQQUJBU0UJCTB4NzAxODQKKyNkZWZpbmUgRFNQQVNUUklERQkJMHg3MDE4OAorCisjZGVmaW5lIERTUEJCQVNFCQkweDcxMTg0CisjZGVmaW5lIERTUEJBRERSCQlEU1BCQkFTRQorI2RlZmluZSBEU1BCU1RSSURFCQkweDcxMTg4CisKKyNkZWZpbmUgRFNQQUtFWVZBTAkJMHg3MDE5NAorI2RlZmluZSBEU1BBS0VZTUFTSwkJMHg3MDE5OAorCisjZGVmaW5lIERTUEFQT1MJCQkweDcwMThDIC8qIHJlc2VydmVkICovCisjZGVmaW5lIERTUEFTSVpFCQkweDcwMTkwCisjZGVmaW5lIERTUEJQT1MJCQkweDcxMThDCisjZGVmaW5lIERTUEJTSVpFCQkweDcxMTkwCisKKyNkZWZpbmUgRFNQQVNVUkYJCTB4NzAxOUMKKyNkZWZpbmUgRFNQQVRJTEVPRkYJCTB4NzAxQTQKKworI2RlZmluZSBEU1BCU1VSRgkJMHg3MTE5QworI2RlZmluZSBEU1BCVElMRU9GRgkJMHg3MTFBNAorCisjZGVmaW5lIFZHQUNOVFJMCQkweDcxNDAwCisjIGRlZmluZSBWR0FfRElTUF9ESVNBQkxFCQkJKDEgPDwgMzEpCisjIGRlZmluZSBWR0FfMlhfTU9ERQkJCQkoMSA8PCAzMCkKKyMgZGVmaW5lIFZHQV9QSVBFX0JfU0VMRUNUCQkJKDEgPDwgMjkpCisKKy8qCisgKiBTb21lIEJJT1Mgc2NyYXRjaCBhcmVhIHJlZ2lzdGVycy4gIFRoZSA4NDUgKGFuZCA4MzA/KSBzdG9yZSB0aGUgYW1vdW50CisgKiBvZiB2aWRlbyBtZW1vcnkgYXZhaWxhYmxlIHRvIHRoZSBCSU9TIGluIFNXRjEuCisgKi8KKworI2RlZmluZSBTV0YwCQkJMHg3MTQxMAorCisvKgorICogODU1IHNjcmF0Y2ggcmVnaXN0ZXJzLgorICovCisjZGVmaW5lIFNXRjEwCQkJMHg3MDQxMAorCisjZGVmaW5lIFNXRjMwCQkJMHg3MjQxNAorCisvKgorICogT3ZlcmxheSByZWdpc3RlcnMuICBUaGVzZSBhcmUgb3ZlcmxheSByZWdpc3RlcnMgYWNjZXNzZWQgdmlhIE1NSU8uCisgKiBUaG9zZSBsb2FkZWQgdmlhIHRoZSBvdmVybGF5IHJlZ2lzdGVyIHBhZ2UgYXJlIGRlZmluZWQgaW4gaTgzMF92aWRlby5jLgorICovCisjZGVmaW5lIE9WQURECQkJMHgzMDAwMAorCisjZGVmaW5lIERPVlNUQQkJCTB4MzAwMDgKKyNkZWZpbmUgT0NfQlVGCQkJKDB4Mzw8MjApCisKKyNkZWZpbmUgT0dBTUM1CQkJMHgzMDAxMAorI2RlZmluZSBPR0FNQzQJCQkweDMwMDE0CisjZGVmaW5lIE9HQU1DMwkJCTB4MzAwMTgKKyNkZWZpbmUgT0dBTUMyCQkJMHgzMDAxYworI2RlZmluZSBPR0FNQzEJCQkweDMwMDIwCisjZGVmaW5lIE9HQU1DMAkJCTB4MzAwMjQKKy8qCisgKiBQYWxldHRlIHJlZ2lzdGVycworICovCisjZGVmaW5lIFBBTEVUVEVfQQkJMHgwYTAwMAorI2RlZmluZSBQQUxFVFRFX0IJCTB4MGE4MDAKKworI2RlZmluZSBJU19JODMwKGRldikgKChkZXYpLT5wY2lfZGV2aWNlID09IDB4MzU3NykKKyNkZWZpbmUgSVNfODQ1RyhkZXYpICgoZGV2KS0+cGNpX2RldmljZSA9PSAweDI1NjIpCisjZGVmaW5lIElTX0k4NVgoZGV2KSAoKGRldiktPnBjaV9kZXZpY2UgPT0gMHgzNTgyKQorI2RlZmluZSBJU19JODU1KGRldikgKChkZXYpLT5wY2lfZGV2aWNlID09IDB4MzU4MikKKyNkZWZpbmUgSVNfSTg2NUcoZGV2KSAoKGRldiktPnBjaV9kZXZpY2UgPT0gMHgyNTcyKQorCisjZGVmaW5lIElTX0k5MTVHKGRldikgKChkZXYpLT5wY2lfZGV2aWNlID09IDB4MjU4MiB8fCAoZGV2KS0+cGNpX2RldmljZSA9PSAweDI1OGEpCisjZGVmaW5lIElTX0k5MTVHTShkZXYpICgoZGV2KS0+cGNpX2RldmljZSA9PSAweDI1OTIpCisjZGVmaW5lIElTX0k5NDVHKGRldikgKChkZXYpLT5wY2lfZGV2aWNlID09IDB4Mjc3MikKKyNkZWZpbmUgSVNfSTk0NUdNKGRldikgKChkZXYpLT5wY2lfZGV2aWNlID09IDB4MjdBMikKKworI2RlZmluZSBJU19JOTY1RyhkZXYpICgoZGV2KS0+cGNpX2RldmljZSA9PSAweDI5NzIgfHwgXAorCQkgICAgICAgKGRldiktPnBjaV9kZXZpY2UgPT0gMHgyOTgyIHx8IFwKKwkJICAgICAgIChkZXYpLT5wY2lfZGV2aWNlID09IDB4Mjk5MiB8fCBcCisJCSAgICAgICAoZGV2KS0+cGNpX2RldmljZSA9PSAweDI5QTIgfHwgXAorCQkgICAgICAgKGRldiktPnBjaV9kZXZpY2UgPT0gMHgyQTAyIHx8IFwKKwkJICAgICAgIChkZXYpLT5wY2lfZGV2aWNlID09IDB4MkExMiB8fCBcCisJCSAgICAgICAoZGV2KS0+cGNpX2RldmljZSA9PSAweDJBNDIpCisKKyNkZWZpbmUgSVNfSTk2NUdNKGRldikgKChkZXYpLT5wY2lfZGV2aWNlID09IDB4MkEwMikKKworI2RlZmluZSBJU19JR0RfR00oZGV2KSAoKGRldiktPnBjaV9kZXZpY2UgPT0gMHgyQTQyKQorCisjZGVmaW5lIElTX0czMyhkZXYpICAgICgoZGV2KS0+cGNpX2RldmljZSA9PSAweDI5QzIgfHwJXAorCQkJKGRldiktPnBjaV9kZXZpY2UgPT0gMHgyOUIyIHx8CVwKKwkJCShkZXYpLT5wY2lfZGV2aWNlID09IDB4MjlEMikKKworI2RlZmluZSBJU19JOVhYKGRldikgKElTX0k5MTVHKGRldikgfHwgSVNfSTkxNUdNKGRldikgfHwgSVNfSTk0NUcoZGV2KSB8fCBcCisJCSAgICAgIElTX0k5NDVHTShkZXYpIHx8IElTX0k5NjVHKGRldikgfHwgSVNfRzMzKGRldikpCisKKyNkZWZpbmUgSVNfTU9CSUxFKGRldikgKElTX0k4MzAoZGV2KSB8fCBJU19JODVYKGRldikgfHwgSVNfSTkxNUdNKGRldikgfHwgXAorCQkJSVNfSTk0NUdNKGRldikgfHwgSVNfSTk2NUdNKGRldikgfHwgSVNfSUdEX0dNKGRldikpCisKKyNkZWZpbmUgUFJJTUFSWV9SSU5HQlVGRkVSX1NJWkUgICAgICAgICAoMTI4KjEwMjQpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lycS5jCmluZGV4IGE0NDNmNGEuLjkyNjUzYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9pcnEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfaXJxLmMKQEAgLTI3Niw3ICsyNzYsNyBAQAogCiAJaTkxNV9rZXJuZWxfbG9zdF9jb250ZXh0KGRldik7CiAKLQlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCURSTV9ERUJVRygiXG4iKTsKIAogCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2VucXVldWUgPSArK2Rldl9wcml2LT5jb3VudGVyOwogCkBAIC0yOTEsNyArMjkxLDcgQEAKIAlPVVRfUklORygwKTsKIAlPVVRfUklORyhHRlhfT1BfVVNFUl9JTlRFUlJVUFQpOwogCUFEVkFOQ0VfTFBfUklORygpOwotCQorCiAJcmV0dXJuIGRldl9wcml2LT5jb3VudGVyOwogfQogCkBAIC0zMDAsNyArMzAwLDcgQEAKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOwogCWludCByZXQgPSAwOwogCi0JRFJNX0RFQlVHKCIlcyBpcnFfbnI9JWQgYnJlYWRjcnVtYj0lZFxuIiwgX19GVU5DVElPTl9fLCBpcnFfbnIsCisJRFJNX0RFQlVHKCJpcnFfbnI9JWQgYnJlYWRjcnVtYj0lZFxuIiwgaXJxX25yLAogCQkgIFJFQURfQlJFQURDUlVNQihkZXZfcHJpdikpOwogCiAJaWYgKFJFQURfQlJFQURDUlVNQihkZXZfcHJpdikgPj0gaXJxX25yKQpAQCAtMzEyLDggKzMxMiw3IEBACiAJCSAgICBSRUFEX0JSRUFEQ1JVTUIoZGV2X3ByaXYpID49IGlycV9ucik7CiAKIAlpZiAocmV0ID09IC1FQlVTWSkgewotCQlEUk1fRVJST1IoIiVzOiBFQlVTWSAtLSByZWM6ICVkIGVtaXR0ZWQ6ICVkXG4iLAotCQkJICBfX0ZVTkNUSU9OX18sCisJCURSTV9FUlJPUigiRUJVU1kgLS0gcmVjOiAlZCBlbWl0dGVkOiAlZFxuIiwKIAkJCSAgUkVBRF9CUkVBRENSVU1CKGRldl9wcml2KSwgKGludClkZXZfcHJpdi0+Y291bnRlcik7CiAJfQogCkBAIC0zMjksMTQgKzMyOCwxNCBAQAogCWludCByZXQgPSAwOwogCiAJaWYgKCFkZXZfcHJpdikgewotCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEUk1fRVJST1IoImNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJRFJNX1dBSVRfT04ocmV0LCBkZXYtPnZibF9xdWV1ZSwgMyAqIERSTV9IWiwKIAkJICAgICgoKGN1cl92YmxhbmsgPSBhdG9taWNfcmVhZChjb3VudGVyKSkKIAkJCS0gKnNlcXVlbmNlKSA8PSAoMTw8MjMpKSk7Ci0JCisKIAkqc2VxdWVuY2UgPSBjdXJfdmJsYW5rOwogCiAJcmV0dXJuIHJldDsKQEAgLTM2NSw3ICszNjQsNyBAQAogCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbGVfcHJpdik7CiAKIAlpZiAoIWRldl9wcml2KSB7Ci0JCURSTV9FUlJPUigiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisJCURSTV9FUlJPUigiY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTM4OCw3ICszODcsNyBAQAogCWRybV9pOTE1X2lycV93YWl0X3QgKmlycXdhaXQgPSBkYXRhOwogCiAJaWYgKCFkZXZfcHJpdikgewotCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEUk1fRVJST1IoImNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC00MTgsMTMgKzQxNywxMiBAQAogCWRybV9pOTE1X3ZibGFua19waXBlX3QgKnBpcGUgPSBkYXRhOwogCiAJaWYgKCFkZXZfcHJpdikgewotCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEUk1fRVJST1IoImNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKHBpcGUtPnBpcGUgJiB+KERSTV9JOTE1X1ZCTEFOS19QSVBFX0F8RFJNX0k5MTVfVkJMQU5LX1BJUEVfQikpIHsKLQkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBpbnZhbGlkIHBpcGUgMHgleFxuIiwgCi0JCQkgIF9fRlVOQ1RJT05fXywgcGlwZS0+cGlwZSk7CisJCURSTV9FUlJPUigiY2FsbGVkIHdpdGggaW52YWxpZCBwaXBlIDB4JXhcbiIsIHBpcGUtPnBpcGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTQ0Myw3ICs0NDEsNyBAQAogCXUxNiBmbGFnOwogCiAJaWYgKCFkZXZfcHJpdikgewotCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEUk1fRVJST1IoImNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC01NTUsNyArNTUzLDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfcHJpdi0+c3dhcHNfbG9jaywgaXJxZmxhZ3MpOwogCi0JbGlzdF9hZGRfdGFpbCgoc3RydWN0IGxpc3RfaGVhZCAqKXZibF9zd2FwLCAmZGV2X3ByaXYtPnZibF9zd2Fwcy5oZWFkKTsKKwlsaXN0X2FkZF90YWlsKCZ2Ymxfc3dhcC0+aGVhZCwgJmRldl9wcml2LT52Ymxfc3dhcHMuaGVhZCk7CiAJZGV2X3ByaXYtPnN3YXBzX3BlbmRpbmcrKzsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5zd2Fwc19sb2NrLCBpcnFmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfbWVtLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfbWVtLmMKaW5kZXggNTZmYjliMy4uNjEyNmE2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X21lbS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9tZW0uYwpAQCAtMjc2LDcgKzI3Niw3IEBACiAJc3RydWN0IG1lbV9ibG9jayAqYmxvY2ssICoqaGVhcDsKIAogCWlmICghZGV2X3ByaXYpIHsKLQkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJRFJNX0VSUk9SKCJjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMzE0LDcgKzMxNCw3IEBACiAJc3RydWN0IG1lbV9ibG9jayAqYmxvY2ssICoqaGVhcDsKIAogCWlmICghZGV2X3ByaXYpIHsKLQkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJRFJNX0VSUk9SKCJjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMzQyLDcgKzM0Miw3IEBACiAJc3RydWN0IG1lbV9ibG9jayAqKmhlYXA7CiAKIAlpZiAoIWRldl9wcml2KSB7Ci0JCURSTV9FUlJPUigiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisJCURSTV9FUlJPUigiY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTM2Niw3ICszNjYsNyBAQAogCXN0cnVjdCBtZW1fYmxvY2sgKipoZWFwOwogCiAJaWYgKCAhZGV2X3ByaXYgKSB7Ci0JCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJRFJNX0VSUk9SKCAiY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIgKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0zNzUsNyArMzc1LDcgQEAKIAkJRFJNX0VSUk9SKCJnZXRfaGVhcCBmYWlsZWQiKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQotCQorCiAJaWYgKCEqaGVhcCkgewogCQlEUk1fRVJST1IoImhlYXAgbm90IGluaXRpYWxpemVkPyIpOwogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTM4NCw0ICszODQsMyBAQAogCWk5MTVfbWVtX3Rha2Vkb3duKCBoZWFwICk7CiAJcmV0dXJuIDA7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RtYS5jIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZG1hLmMKaW5kZXggYzU2N2MzNC4uYzFkMTJkYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RtYS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2RtYS5jCkBAIC00OTMsNyArNDkzLDcgQEAKIAkJCSAgZG1hX2JzLT5hZ3Bfc2l6ZSk7CiAJCXJldHVybiBlcnI7CiAJfQotCQorCiAJZGV2X3ByaXYtPmFncF9zaXplID0gYWdwX3NpemU7CiAJZGV2X3ByaXYtPmFncF9oYW5kbGUgPSBhZ3BfcmVxLmhhbmRsZTsKIApAQCAtNTUwLDcgKzU1MCw3IEBACiAJewogCQlzdHJ1Y3QgZHJtX21hcF9saXN0ICpfZW50cnk7CiAJCXVuc2lnbmVkIGxvbmcgYWdwX3Rva2VuID0gMDsKLQkJCisKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShfZW50cnksICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKIAkJCWlmIChfZW50cnktPm1hcCA9PSBkZXYtPmFncF9idWZmZXJfbWFwKQogCQkJCWFncF90b2tlbiA9IF9lbnRyeS0+dXNlcl90b2tlbjsKQEAgLTk2NCw3ICs5NjQsNyBAQAogCiAJCQkJZnJlZV9yZXEuaGFuZGxlID0gZGV2X3ByaXYtPmFncF9oYW5kbGU7CiAJCQkJZHJtX2FncF9mcmVlKGRldiwgJmZyZWVfcmVxKTsKLQkKKwogCQkJCWRldl9wcml2LT5hZ3BfdGV4dHVyZXMgPSBOVUxMOwogCQkJCWRldl9wcml2LT5hZ3Bfc2l6ZSA9IDA7CiAJCQkJZGV2X3ByaXYtPmFncF9oYW5kbGUgPSAwOwpAQCAtOTk4LDcgKzk5OCw3IEBACiAJCX0KIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgbWdhX2RtYV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCkBAIC0xMDUwLDcgKzEwNTAsNyBAQAogI2lmIE1HQV9ETUFfREVCVUcKIAkJaW50IHJldCA9IG1nYV9kb193YWl0X2Zvcl9pZGxlKGRldl9wcml2KTsKIAkJaWYgKHJldCA8IDApCi0JCQlEUk1fSU5GTygiJXM6IC1FQlVTWVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCURSTV9JTkZPKCItRUJVU1lcbiIpOwogCQlyZXR1cm4gcmV0OwogI2Vsc2UKIAkJcmV0dXJuIG1nYV9kb193YWl0X2Zvcl9pZGxlKGRldl9wcml2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmgKaW5kZXggY2Q5NGMwNC4uZjZlYmQyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2FfZHJ2LmgKQEAgLTIxNiw4ICsyMTYsOCBAQAogI2RlZmluZSBNR0FfV1JJVEUoIHJlZywgdmFsICkJRFJNX1dSSVRFMzIoZGV2X3ByaXYtPm1taW8sIChyZWcpLCAodmFsKSkKICNlbmRpZgogCi0jZGVmaW5lIERXR1JFRzAgCTB4MWMwMAotI2RlZmluZSBEV0dSRUcwX0VORCAJMHgxZGZmCisjZGVmaW5lIERXR1JFRzAJCTB4MWMwMAorI2RlZmluZSBEV0dSRUcwX0VORAkweDFkZmYKICNkZWZpbmUgRFdHUkVHMQkJMHgyYzAwCiAjZGVmaW5lIERXR1JFRzFfRU5ECTB4MmRmZgogCkBAIC0yNDksNyArMjQ5LDcgQEAKIAkJfSBlbHNlIGlmICggZGV2X3ByaXYtPnByaW0uc3BhY2UgPAkJCVwKIAkJCSAgICBkZXZfcHJpdi0+cHJpbS5oaWdoX21hcmsgKSB7CQlcCiAJCQlpZiAoIE1HQV9ETUFfREVCVUcgKQkJCQlcCi0JCQkJRFJNX0lORk8oICIlczogd3JhcC4uLlxuIiwgX19GVU5DVElPTl9fICk7CVwKKwkJCQlEUk1fSU5GTyggIndyYXAuLi5cbiIpOwkJXAogCQkJcmV0dXJuIC1FQlVTWTsJCQlcCiAJCX0JCQkJCQkJXAogCX0JCQkJCQkJCVwKQEAgLTI2MCw3ICsyNjAsNyBAQAogCWlmICggdGVzdF9iaXQoIDAsICZkZXZfcHJpdi0+cHJpbS53cmFwcGVkICkgKSB7CQkJXAogCQlpZiAoIG1nYV9kb193YWl0X2Zvcl9pZGxlKCBkZXZfcHJpdiApIDwgMCApIHsJCVwKIAkJCWlmICggTUdBX0RNQV9ERUJVRyApCQkJCVwKLQkJCQlEUk1fSU5GTyggIiVzOiB3cmFwLi4uXG4iLCBfX0ZVTkNUSU9OX18gKTsJXAorCQkJCURSTV9JTkZPKCAid3JhcC4uLlxuIik7CQlcCiAJCQlyZXR1cm4gLUVCVVNZOwkJCVwKIAkJfQkJCQkJCQlcCiAJCW1nYV9kb19kbWFfd3JhcF9lbmQoIGRldl9wcml2ICk7CQkJXApAQCAtMjgwLDggKzI4MCw3IEBACiAjZGVmaW5lIEJFR0lOX0RNQSggbiApCQkJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCiAJaWYgKCBNR0FfVkVSQk9TRSApIHsJCQkJCQlcCi0JCURSTV9JTkZPKCAiQkVHSU5fRE1BKCAlZCApIGluICVzXG4iLAkJCVwKLQkJCSAgKG4pLCBfX0ZVTkNUSU9OX18gKTsJCQkJXAorCQlEUk1fSU5GTyggIkJFR0lOX0RNQSggJWQgKVxuIiwgKG4pICk7CQlcCiAJCURSTV9JTkZPKCAiICAgc3BhY2U9MHgleCByZXE9MHglWnhcbiIsCQkJXAogCQkJICBkZXZfcHJpdi0+cHJpbS5zcGFjZSwgKG4pICogRE1BX0JMT0NLX1NJWkUgKTsJXAogCX0JCQkJCQkJCVwKQEAgLTI5Miw3ICsyOTEsNyBAQAogI2RlZmluZSBCRUdJTl9ETUFfV1JBUCgpCQkJCQkJXAogZG8gewkJCQkJCQkJCVwKIAlpZiAoIE1HQV9WRVJCT1NFICkgewkJCQkJCVwKLQkJRFJNX0lORk8oICJCRUdJTl9ETUEoKSBpbiAlc1xuIiwgX19GVU5DVElPTl9fICk7CQlcCisJCURSTV9JTkZPKCAiQkVHSU5fRE1BKClcbiIgKTsJCQkJXAogCQlEUk1fSU5GTyggIiAgIHNwYWNlPTB4JXhcbiIsIGRldl9wcml2LT5wcmltLnNwYWNlICk7CVwKIAl9CQkJCQkJCQlcCiAJcHJpbSA9IGRldl9wcml2LT5wcmltLnN0YXJ0OwkJCQkJXApAQCAtMzExLDcgKzMxMCw3IEBACiAjZGVmaW5lIEZMVVNIX0RNQSgpCQkJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCiAJaWYgKCAwICkgewkJCQkJCQlcCi0JCURSTV9JTkZPKCAiJXM6XG4iLCBfX0ZVTkNUSU9OX18gKTsJCQkJXAorCQlEUk1fSU5GTyggIlxuIiApOwkJCQkJXAogCQlEUk1fSU5GTyggIiAgIHRhaWw9MHglMDZ4IGhlYWQ9MHglMDZseFxuIiwJCVwKIAkJCSAgZGV2X3ByaXYtPnByaW0udGFpbCwJCQkJXAogCQkJICBNR0FfUkVBRCggTUdBX1BSSU1BRERSRVNTICkgLQkJCVwKQEAgLTM5NCwyMiArMzkzLDIyIEBACiAjZGVmaW5lIE1HQV9WSU5UQ0xSCQkJKDEgPDwgNCkKICNkZWZpbmUgTUdBX1ZJTlRFTgkJCSgxIDw8IDUpCiAKLSNkZWZpbmUgTUdBX0FMUEhBQ1RSTCAJCQkweDJjN2MKLSNkZWZpbmUgTUdBX0FSMCAJCQkweDFjNjAKLSNkZWZpbmUgTUdBX0FSMSAJCQkweDFjNjQKLSNkZWZpbmUgTUdBX0FSMiAJCQkweDFjNjgKLSNkZWZpbmUgTUdBX0FSMyAJCQkweDFjNmMKLSNkZWZpbmUgTUdBX0FSNCAJCQkweDFjNzAKLSNkZWZpbmUgTUdBX0FSNSAJCQkweDFjNzQKLSNkZWZpbmUgTUdBX0FSNiAJCQkweDFjNzgKKyNkZWZpbmUgTUdBX0FMUEhBQ1RSTAkJCTB4MmM3YworI2RlZmluZSBNR0FfQVIwCQkJCTB4MWM2MAorI2RlZmluZSBNR0FfQVIxCQkJCTB4MWM2NAorI2RlZmluZSBNR0FfQVIyCQkJCTB4MWM2OAorI2RlZmluZSBNR0FfQVIzCQkJCTB4MWM2YworI2RlZmluZSBNR0FfQVI0CQkJCTB4MWM3MAorI2RlZmluZSBNR0FfQVI1CQkJCTB4MWM3NAorI2RlZmluZSBNR0FfQVI2CQkJCTB4MWM3OAogCiAjZGVmaW5lIE1HQV9DWEJORFJZCQkJMHgxYzgwCi0jZGVmaW5lIE1HQV9DWExFRlQgCQkJMHgxY2EwCisjZGVmaW5lIE1HQV9DWExFRlQJCQkweDFjYTAKICNkZWZpbmUgTUdBX0NYUklHSFQJCQkweDFjYTQKIAotI2RlZmluZSBNR0FfRE1BUEFEIAkJCTB4MWM1NAotI2RlZmluZSBNR0FfRFNUT1JHIAkJCTB4MmNiOAotI2RlZmluZSBNR0FfRFdHQ1RMIAkJCTB4MWMwMAorI2RlZmluZSBNR0FfRE1BUEFECQkJMHgxYzU0CisjZGVmaW5lIE1HQV9EU1RPUkcJCQkweDJjYjgKKyNkZWZpbmUgTUdBX0RXR0NUTAkJCTB4MWMwMAogIwlkZWZpbmUgTUdBX09QQ09EX01BU0sJCQkoMTUgPDwgMCkKICMJZGVmaW5lIE1HQV9PUENPRF9UUkFQCQkJKDQgPDwgMCkKICMJZGVmaW5lIE1HQV9PUENPRF9URVhUVVJFX1RSQVAJCSg2IDw8IDApCkBAIC00NTUsMjcgKzQ1NCwyNyBAQAogIwlkZWZpbmUgTUdBX0NMSVBESVMJCQkoMSA8PCAzMSkKICNkZWZpbmUgTUdBX0RXR1NZTkMJCQkweDJjNGMKIAotI2RlZmluZSBNR0FfRkNPTCAJCQkweDFjMjQKLSNkZWZpbmUgTUdBX0ZJRk9TVEFUVVMgCQkJMHgxZTEwCi0jZGVmaW5lIE1HQV9GT0dDT0wgCQkJMHgxY2Y0CisjZGVmaW5lIE1HQV9GQ09MCQkJMHgxYzI0CisjZGVmaW5lIE1HQV9GSUZPU1RBVFVTCQkJMHgxZTEwCisjZGVmaW5lIE1HQV9GT0dDT0wJCQkweDFjZjQKICNkZWZpbmUgTUdBX0ZYQk5EUlkJCQkweDFjODQKLSNkZWZpbmUgTUdBX0ZYTEVGVCAJCQkweDFjYTgKKyNkZWZpbmUgTUdBX0ZYTEVGVAkJCTB4MWNhOAogI2RlZmluZSBNR0FfRlhSSUdIVAkJCTB4MWNhYwogCi0jZGVmaW5lIE1HQV9JQ0xFQVIgCQkJMHgxZTE4CisjZGVmaW5lIE1HQV9JQ0xFQVIJCQkweDFlMTgKICMJZGVmaW5lIE1HQV9TT0ZUUkFQSUNMUgkJCSgxIDw8IDApCiAjCWRlZmluZSBNR0FfVkxJTkVJQ0xSCQkJKDEgPDwgNSkKLSNkZWZpbmUgTUdBX0lFTiAJCQkweDFlMWMKKyNkZWZpbmUgTUdBX0lFTgkJCQkweDFlMWMKICMJZGVmaW5lIE1HQV9TT0ZUUkFQSUVOCQkJKDEgPDwgMCkKICMJZGVmaW5lIE1HQV9WTElORUlFTgkJCSgxIDw8IDUpCiAKLSNkZWZpbmUgTUdBX0xFTiAJCQkweDFjNWMKKyNkZWZpbmUgTUdBX0xFTgkJCQkweDFjNWMKIAogI2RlZmluZSBNR0FfTUFDQ0VTUwkJCTB4MWMwNAogCi0jZGVmaW5lIE1HQV9QSVRDSCAJCQkweDFjOGMKLSNkZWZpbmUgTUdBX1BMTldUIAkJCTB4MWMxYwotI2RlZmluZSBNR0FfUFJJTUFERFJFU1MgCQkweDFlNTgKKyNkZWZpbmUgTUdBX1BJVENICQkJMHgxYzhjCisjZGVmaW5lIE1HQV9QTE5XVAkJCTB4MWMxYworI2RlZmluZSBNR0FfUFJJTUFERFJFU1MJCQkweDFlNTgKICMJZGVmaW5lIE1HQV9ETUFfR0VORVJBTAkJCSgwIDw8IDApCiAjCWRlZmluZSBNR0FfRE1BX0JMSVQJCQkoMSA8PCAwKQogIwlkZWZpbmUgTUdBX0RNQV9WRUNUT1IJCQkoMiA8PCAwKQpAQCAtNDg3LDQzICs0ODYsNDMgQEAKICMJZGVmaW5lIE1HQV9QUklNUFRSRU4wCQkJKDEgPDwgMCkKICMJZGVmaW5lIE1HQV9QUklNUFRSRU4xCQkJKDEgPDwgMSkKIAotI2RlZmluZSBNR0FfUlNUIAkJCTB4MWU0MAorI2RlZmluZSBNR0FfUlNUCQkJCTB4MWU0MAogIwlkZWZpbmUgTUdBX1NPRlRSRVNFVAkJCSgxIDw8IDApCiAjCWRlZmluZSBNR0FfU09GVEVYVFJTVAkJCSgxIDw8IDEpCiAKLSNkZWZpbmUgTUdBX1NFQ0FERFJFU1MgCQkJMHgyYzQwCi0jZGVmaW5lIE1HQV9TRUNFTkQgCQkJMHgyYzQ0Ci0jZGVmaW5lIE1HQV9TRVRVUEFERFJFU1MgCQkweDJjZDAKLSNkZWZpbmUgTUdBX1NFVFVQRU5EIAkJCTB4MmNkNAorI2RlZmluZSBNR0FfU0VDQUREUkVTUwkJCTB4MmM0MAorI2RlZmluZSBNR0FfU0VDRU5ECQkJMHgyYzQ0CisjZGVmaW5lIE1HQV9TRVRVUEFERFJFU1MJCTB4MmNkMAorI2RlZmluZSBNR0FfU0VUVVBFTkQJCQkweDJjZDQKICNkZWZpbmUgTUdBX1NHTgkJCQkweDFjNTgKICNkZWZpbmUgTUdBX1NPRlRSQVAJCQkweDJjNDgKLSNkZWZpbmUgTUdBX1NSQ09SRyAJCQkweDJjYjQKKyNkZWZpbmUgTUdBX1NSQ09SRwkJCTB4MmNiNAogIwlkZWZpbmUgTUdBX1NSTU1BUF9NQVNLCQkJKDEgPDwgMCkKICMJZGVmaW5lIE1HQV9TUkNNQVBfRkIJCQkoMCA8PCAwKQogIwlkZWZpbmUgTUdBX1NSQ01BUF9TWVNNRU0JCSgxIDw8IDApCiAjCWRlZmluZSBNR0FfU1JDQUNDX01BU0sJCQkoMSA8PCAxKQogIwlkZWZpbmUgTUdBX1NSQ0FDQ19QQ0kJCQkoMCA8PCAxKQogIwlkZWZpbmUgTUdBX1NSQ0FDQ19BR1AJCQkoMSA8PCAxKQotI2RlZmluZSBNR0FfU1RBVFVTIAkJCTB4MWUxNAorI2RlZmluZSBNR0FfU1RBVFVTCQkJMHgxZTE0CiAjCWRlZmluZSBNR0FfU09GVFJBUEVOCQkJKDEgPDwgMCkKICMJZGVmaW5lIE1HQV9WU1lOQ1BFTgkJCSgxIDw8IDQpCiAjCWRlZmluZSBNR0FfVkxJTkVQRU4JCQkoMSA8PCA1KQogIwlkZWZpbmUgTUdBX0RXR0VOR1NUUwkJCSgxIDw8IDE2KQogIwlkZWZpbmUgTUdBX0VORFBSRE1BU1RTCQkJKDEgPDwgMTcpCiAjZGVmaW5lIE1HQV9TVEVOQ0lMCQkJMHgyY2M4Ci0jZGVmaW5lIE1HQV9TVEVOQ0lMQ1RMIAkJCTB4MmNjYworI2RlZmluZSBNR0FfU1RFTkNJTENUTAkJCTB4MmNjYwogCi0jZGVmaW5lIE1HQV9URFVBTFNUQUdFMCAJCTB4MmNmOAotI2RlZmluZSBNR0FfVERVQUxTVEFHRTEgCQkweDJjZmMKLSNkZWZpbmUgTUdBX1RFWEJPUkRFUkNPTCAJCTB4MmM1YwotI2RlZmluZSBNR0FfVEVYQ1RMIAkJCTB4MmMzMAorI2RlZmluZSBNR0FfVERVQUxTVEFHRTAJCQkweDJjZjgKKyNkZWZpbmUgTUdBX1REVUFMU1RBR0UxCQkJMHgyY2ZjCisjZGVmaW5lIE1HQV9URVhCT1JERVJDT0wJCTB4MmM1YworI2RlZmluZSBNR0FfVEVYQ1RMCQkJMHgyYzMwCiAjZGVmaW5lIE1HQV9URVhDVEwyCQkJMHgyYzNjCiAjCWRlZmluZSBNR0FfRFVBTFRFWAkJCSgxIDw8IDcpCiAjCWRlZmluZSBNR0FfRzQwMF9UQzJfTUFHSUMJCSgxIDw8IDE1KQogIwlkZWZpbmUgTUdBX01BUDFfRU5BQkxFCQkJKDEgPDwgMzEpCi0jZGVmaW5lIE1HQV9URVhGSUxURVIgCQkJMHgyYzU4Ci0jZGVmaW5lIE1HQV9URVhIRUlHSFQgCQkJMHgyYzJjCi0jZGVmaW5lIE1HQV9URVhPUkcgCQkJMHgyYzI0CisjZGVmaW5lIE1HQV9URVhGSUxURVIJCQkweDJjNTgKKyNkZWZpbmUgTUdBX1RFWEhFSUdIVAkJCTB4MmMyYworI2RlZmluZSBNR0FfVEVYT1JHCQkJMHgyYzI0CiAjCWRlZmluZSBNR0FfVEVYT1JHTUFQX01BU0sJCSgxIDw8IDApCiAjCWRlZmluZSBNR0FfVEVYT1JHTUFQX0ZCCQkJKDAgPDwgMCkKICMJZGVmaW5lIE1HQV9URVhPUkdNQVBfU1lTTUVNCQkoMSA8PCAwKQpAQCAtNTM0LDQ1ICs1MzMsNDUgQEAKICNkZWZpbmUgTUdBX1RFWE9SRzIJCQkweDJjYTgKICNkZWZpbmUgTUdBX1RFWE9SRzMJCQkweDJjYWMKICNkZWZpbmUgTUdBX1RFWE9SRzQJCQkweDJjYjAKLSNkZWZpbmUgTUdBX1RFWFRSQU5TIAkJCTB4MmMzNAotI2RlZmluZSBNR0FfVEVYVFJBTlNISUdIIAkJMHgyYzM4Ci0jZGVmaW5lIE1HQV9URVhXSURUSCAJCQkweDJjMjgKKyNkZWZpbmUgTUdBX1RFWFRSQU5TCQkJMHgyYzM0CisjZGVmaW5lIE1HQV9URVhUUkFOU0hJR0gJCTB4MmMzOAorI2RlZmluZSBNR0FfVEVYV0lEVEgJCQkweDJjMjgKIAotI2RlZmluZSBNR0FfV0FDQ0VQVFNFUSAJCQkweDFkZDQKLSNkZWZpbmUgTUdBX1dDT0RFQUREUiAJCQkweDFlNmMKLSNkZWZpbmUgTUdBX1dGTEFHIAkJCTB4MWRjNAotI2RlZmluZSBNR0FfV0ZMQUcxIAkJCTB4MWRlMAorI2RlZmluZSBNR0FfV0FDQ0VQVFNFUQkJCTB4MWRkNAorI2RlZmluZSBNR0FfV0NPREVBRERSCQkJMHgxZTZjCisjZGVmaW5lIE1HQV9XRkxBRwkJCTB4MWRjNAorI2RlZmluZSBNR0FfV0ZMQUcxCQkJMHgxZGUwCiAjZGVmaW5lIE1HQV9XRkxBR05CCQkJMHgxZTY0Ci0jZGVmaW5lIE1HQV9XRkxBR05CMSAJCQkweDFlMDgKKyNkZWZpbmUgTUdBX1dGTEFHTkIxCQkJMHgxZTA4CiAjZGVmaW5lIE1HQV9XR0VUTVNCCQkJMHgxZGM4Ci0jZGVmaW5lIE1HQV9XSUFERFIgCQkJMHgxZGMwCisjZGVmaW5lIE1HQV9XSUFERFIJCQkweDFkYzAKICNkZWZpbmUgTUdBX1dJQUREUjIJCQkweDFkZDgKICMJZGVmaW5lIE1HQV9XTU9ERV9TVVNQRU5ECQkoMCA8PCAwKQogIwlkZWZpbmUgTUdBX1dNT0RFX1JFU1VNRQkJCSgxIDw8IDApCiAjCWRlZmluZSBNR0FfV01PREVfSlVNUAkJCSgyIDw8IDApCiAjCWRlZmluZSBNR0FfV01PREVfU1RBUlQJCQkoMyA8PCAwKQogIwlkZWZpbmUgTUdBX1dBR1BfRU5BQkxFCQkJKDEgPDwgMikKLSNkZWZpbmUgTUdBX1dNSVNDIAkJCTB4MWU3MAorI2RlZmluZSBNR0FfV01JU0MJCQkweDFlNzAKICMJZGVmaW5lIE1HQV9XVUNPREVDQUNIRV9FTkFCTEUJCSgxIDw8IDApCiAjCWRlZmluZSBNR0FfV01BU1RFUl9FTkFCTEUJCSgxIDw8IDEpCiAjCWRlZmluZSBNR0FfV0NBQ0hFRkxVU0hfRU5BQkxFCQkoMSA8PCAzKQogI2RlZmluZSBNR0FfV1ZSVFhTWgkJCTB4MWRjYwogCi0jZGVmaW5lIE1HQV9ZQk9UIAkJCTB4MWM5YwotI2RlZmluZSBNR0FfWURTVCAJCQkweDFjOTAKKyNkZWZpbmUgTUdBX1lCT1QJCQkweDFjOWMKKyNkZWZpbmUgTUdBX1lEU1QJCQkweDFjOTAKICNkZWZpbmUgTUdBX1lEU1RMRU4JCQkweDFjODgKICNkZWZpbmUgTUdBX1lEU1RPUkcJCQkweDFjOTQKLSNkZWZpbmUgTUdBX1lUT1AgCQkJMHgxYzk4CisjZGVmaW5lIE1HQV9ZVE9QCQkJMHgxYzk4CiAKLSNkZWZpbmUgTUdBX1pPUkcgCQkJMHgxYzBjCisjZGVmaW5lIE1HQV9aT1JHCQkJMHgxYzBjCiAKIC8qIFRoaXMgZmluaXNoZXMgdGhlIGN1cnJlbnQgYmF0Y2ggb2YgY29tbWFuZHMKICAqLwotI2RlZmluZSBNR0FfRVhFQyAJCQkweDAxMDAKKyNkZWZpbmUgTUdBX0VYRUMJCQkweDAxMDAKIAogLyogQUdQIFBMTCBlbmNvZGluZyAoZm9yIEcyMDAgb25seSkuCiAgKi8KLSNkZWZpbmUgTUdBX0FHUF9QTEwgCQkJMHgxZTRjCisjZGVmaW5lIE1HQV9BR1BfUExMCQkJMHgxZTRjCiAjCWRlZmluZSBNR0FfQUdQMlhQTExfRElTQUJMRQkJKDAgPDwgMCkKICMJZGVmaW5lIE1HQV9BR1AyWFBMTF9FTkFCTEUJCSgxIDw8IDApCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX3N0YXRlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9zdGF0ZS5jCmluZGV4IDVlYzhiNjEuLmQzZjhhYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX3N0YXRlLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9tZ2Ffc3RhdGUuYwpAQCAtMTUwLDggKzE1MCw4IEBACiAJZHJtX21nYV90ZXh0dXJlX3JlZ3NfdCAqdGV4ID0gJnNhcmVhX3ByaXYtPnRleF9zdGF0ZVswXTsKIAlETUFfTE9DQUxTOwogCi0vKiAgCXByaW50aygibWdhX2c0MDBfZW1pdF90ZXgwICV4ICV4ICV4XG4iLCB0ZXgtPnRleG9yZywgKi8KLS8qICAJICAgICAgIHRleC0+dGV4Y3RsLCB0ZXgtPnRleGN0bDIpOyAqLworLyoJcHJpbnRrKCJtZ2FfZzQwMF9lbWl0X3RleDAgJXggJXggJXhcbiIsIHRleC0+dGV4b3JnLCAqLworLyoJICAgICAgIHRleC0+dGV4Y3RsLCB0ZXgtPnRleGN0bDIpOyAqLwogCiAJQkVHSU5fRE1BKDYpOwogCkBAIC0xOTAsOCArMTkwLDggQEAKIAlkcm1fbWdhX3RleHR1cmVfcmVnc190ICp0ZXggPSAmc2FyZWFfcHJpdi0+dGV4X3N0YXRlWzFdOwogCURNQV9MT0NBTFM7CiAKLS8qICAJcHJpbnRrKCJtZ2FfZzQwMF9lbWl0X3RleDEgJXggJXggJXhcbiIsIHRleC0+dGV4b3JnLCAgKi8KLS8qICAJICAgICAgIHRleC0+dGV4Y3RsLCB0ZXgtPnRleGN0bDIpOyAqLworLyoJcHJpbnRrKCJtZ2FfZzQwMF9lbWl0X3RleDEgJXggJXggJXhcbiIsIHRleC0+dGV4b3JnLCAgKi8KKy8qCSAgICAgICB0ZXgtPnRleGN0bCwgdGV4LT50ZXhjdGwyKTsgKi8KIAogCUJFR0lOX0RNQSg1KTsKIApAQCAtMjU2LDcgKzI1Niw3IEBACiAJdW5zaWduZWQgaW50IHBpcGUgPSBzYXJlYV9wcml2LT53YXJwX3BpcGU7CiAJRE1BX0xPQ0FMUzsKIAotLyogIAlwcmludGsoIm1nYV9nNDAwX2VtaXRfcGlwZSAleFxuIiwgcGlwZSk7ICovCisvKglwcmludGsoIm1nYV9nNDAwX2VtaXRfcGlwZSAleFxuIiwgcGlwZSk7ICovCiAKIAlCRUdJTl9ETUEoMTApOwogCkBAIC02MTksNyArNjE5LDcgQEAKIAogCUZMVVNIX0RNQSgpOwogCi0JRFJNX0RFQlVHKCIlcy4uLiBkb25lLlxuIiwgX19GVU5DVElPTl9fKTsKKwlEUk1fREVCVUcoIi4uLiBkb25lLlxuIik7CiB9CiAKIHN0YXRpYyB2b2lkIG1nYV9kbWFfZGlzcGF0Y2hfdmVydGV4KHN0cnVjdCBkcm1fZGV2aWNlICogZGV2LCBzdHJ1Y3QgZHJtX2J1ZiAqIGJ1ZikKQEAgLTYzMSw3ICs2MzEsNyBAQAogCXUzMiBsZW5ndGggPSAodTMyKSBidWYtPnVzZWQ7CiAJaW50IGkgPSAwOwogCURNQV9MT0NBTFM7Ci0JRFJNX0RFQlVHKCJ2ZXJ0ZXg6IGJ1Zj0lZCB1c2VkPSVkXG4iLCBidWYtPmlkeCwgYnVmLT51c2VkKTsKKwlEUk1fREVCVUcoImJ1Zj0lZCB1c2VkPSVkXG4iLCBidWYtPmlkeCwgYnVmLT51c2VkKTsKIAogCWlmIChidWYtPnVzZWQpIHsKIAkJYnVmX3ByaXYtPmRpc3BhdGNoZWQgPSAxOwpAQCAtNjc4LDcgKzY3OCw3IEBACiAJdTMyIGFkZHJlc3MgPSAodTMyKSBidWYtPmJ1c19hZGRyZXNzOwogCWludCBpID0gMDsKIAlETUFfTE9DQUxTOwotCURSTV9ERUJVRygiaW5kaWNlczogYnVmPSVkIHN0YXJ0PSVkIGVuZD0lZFxuIiwgYnVmLT5pZHgsIHN0YXJ0LCBlbmQpOworCURSTV9ERUJVRygiYnVmPSVkIHN0YXJ0PSVkIGVuZD0lZFxuIiwgYnVmLT5pZHgsIHN0YXJ0LCBlbmQpOwogCiAJaWYgKHN0YXJ0ICE9IGVuZCkgewogCQlidWZfcHJpdi0+ZGlzcGF0Y2hlZCA9IDE7CkBAIC05NTUsNyArOTU1LDcgQEAKICNpZiAwCiAJaWYgKG1nYV9kb193YWl0X2Zvcl9pZGxlKGRldl9wcml2KSA8IDApIHsKIAkJaWYgKE1HQV9ETUFfREVCVUcpCi0JCQlEUk1fSU5GTygiJXM6IC1FQlVTWVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCURSTV9JTkZPKCItRUJVU1lcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KICNlbmRpZgpAQCAtMTAxNCw3ICsxMDE0LDcgQEAKIAlpbnQgdmFsdWU7CiAKIAlpZiAoIWRldl9wcml2KSB7Ci0JCURSTV9FUlJPUigiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisJCURSTV9FUlJPUigiY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTEwNDYsNyArMTA0Niw3IEBACiAJRE1BX0xPQ0FMUzsKIAogCWlmICghZGV2X3ByaXYpIHsKLQkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJRFJNX0VSUk9SKCJjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTA3NSw3ICsxMDc1LDcgQEAKIAl1MzIgKmZlbmNlID0gZGF0YTsKIAogCWlmICghZGV2X3ByaXYpIHsKLQkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJRFJNX0VSUk9SKCJjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2NjZS5jIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2NjZS5jCmluZGV4IDdkNTUwYWIuLjg5MmUwYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9jY2UuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfY2NlLmMKQEAgLTEsNCArMSw0IEBACi0vKiByMTI4X2NjZS5jIC0tIEFUSSBSYWdlIDEyOCBkcml2ZXIgLSotIGxpbnV4LWMgLSotIAorLyogcjEyOF9jY2UuYyAtLSBBVEkgUmFnZSAxMjggZHJpdmVyIC0qLSBsaW51eC1jIC0qLQogICogQ3JlYXRlZDogV2VkIEFwciAgNSAxOToyNDoxOSAyMDAwIGJ5IGtldmluQHByZWNpc2lvbmluc2lnaHQuY29tCiAgKi8KIC8qCkBAIC02NTEsNyArNjUxLDcgQEAKIAlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxlX3ByaXYpOwogCiAJaWYgKGRldl9wcml2LT5jY2VfcnVubmluZyB8fCBkZXZfcHJpdi0+Y2NlX21vZGUgPT0gUjEyOF9QTTRfTk9OUE00KSB7Ci0JCURSTV9ERUJVRygiJXMgd2hpbGUgQ0NFIHJ1bm5pbmdcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURSTV9ERUJVRygid2hpbGUgQ0NFIHJ1bm5pbmdcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTcxMCw3ICs3MTAsNyBAQAogCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbGVfcHJpdik7CiAKIAlpZiAoIWRldl9wcml2KSB7Ci0JCURSTV9ERUJVRygiJXMgY2FsbGVkIGJlZm9yZSBpbml0IGRvbmVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCURSTV9ERUJVRygiY2FsbGVkIGJlZm9yZSBpbml0IGRvbmVcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuaAppbmRleCA1MDQxYmQ4Li4wMTExMDVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5oCkBAIC00NjIsOCArNDYyLDcgQEAKIAogI2RlZmluZSBCRUdJTl9SSU5HKCBuICkgZG8gewkJCQkJCVwKIAlpZiAoIFIxMjhfVkVSQk9TRSApIHsJCQkJCQlcCi0JCURSTV9JTkZPKCAiQkVHSU5fUklORyggJWQgKSBpbiAlc1xuIiwJCQlcCi0JCQkgICAobiksIF9fRlVOQ1RJT05fXyApOwkJCQlcCisJCURSTV9JTkZPKCAiQkVHSU5fUklORyggJWQgKVxuIiwgKG4pKTsJCQlcCiAJfQkJCQkJCQkJXAogCWlmICggZGV2X3ByaXYtPnJpbmcuc3BhY2UgPD0gKG4pICogc2l6ZW9mKHUzMikgKSB7CQlcCiAJCUNPTU1JVF9SSU5HKCk7CQkJCQkJXApAQCAtNDkzLDcgKzQ5Miw3IEBACiAJCQl3cml0ZSAqIHNpemVvZih1MzIpICk7CQkJCVwKIAl9CQkJCQkJCQlcCiAJaWYgKCgoZGV2X3ByaXYtPnJpbmcudGFpbCArIF9ucikgJiB0YWlsX21hc2spICE9IHdyaXRlKSB7CVwKLQkJRFJNX0VSUk9SKCAJCQkJCQlcCisJCURSTV9FUlJPUigJCQkJCQlcCiAJCQkiQURWQU5DRV9SSU5HKCk6IG1pc21hdGNoOiBucjogJXggd3JpdGU6ICV4IGxpbmU6ICVkXG4iLAlcCiAJCQkoKGRldl9wcml2LT5yaW5nLnRhaWwgKyBfbnIpICYgdGFpbF9tYXNrKSwJXAogCQkJd3JpdGUsIF9fTElORV9fKTsJCQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X3N0YXRlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfc3RhdGUuYwppbmRleCBiN2Y0ODNjLi41MWE5YWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfc3RhdGUuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfc3RhdGUuYwpAQCAtNDIsNyArNDIsNyBAQAogewogCXUzMiBhdXhfc2NfY250bCA9IDB4MDAwMDAwMDA7CiAJUklOR19MT0NBTFM7Ci0JRFJNX0RFQlVHKCIgICAgJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJRFJNX0RFQlVHKCJcbiIpOwogCiAJQkVHSU5fUklORygoY291bnQgPCAzID8gY291bnQgOiAzKSAqIDUgKyAyKTsKIApAQCAtODUsNyArODUsNyBAQAogCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlkcm1fcjEyOF9jb250ZXh0X3JlZ3NfdCAqY3R4ID0gJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGU7CiAJUklOR19MT0NBTFM7Ci0JRFJNX0RFQlVHKCIgICAgJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJRFJNX0RFQlVHKCJcbiIpOwogCiAJQkVHSU5fUklORygyKTsKIApAQCAtMTAwLDcgKzEwMCw3IEBACiAJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwogCWRybV9yMTI4X2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKIAlSSU5HX0xPQ0FMUzsKLQlEUk1fREVCVUcoIiAgICAlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlEUk1fREVCVUcoIlxuIik7CiAKIAlCRUdJTl9SSU5HKDEzKTsKIApAQCAtMTI2LDcgKzEyNiw3IEBACiAJZHJtX3IxMjhfc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwogCWRybV9yMTI4X2NvbnRleHRfcmVnc190ICpjdHggPSAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZTsKIAlSSU5HX0xPQ0FMUzsKLQlEUk1fREVCVUcoIiAgICAlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlEUk1fREVCVUcoIlxuIik7CiAKIAlCRUdJTl9SSU5HKDMpOwogCkBAIC0xNDIsNyArMTQyLDcgQEAKIAlkcm1fcjEyOF9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CiAJZHJtX3IxMjhfY29udGV4dF9yZWdzX3QgKmN0eCA9ICZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlOwogCVJJTkdfTE9DQUxTOwotCURSTV9ERUJVRygiICAgICVzXG4iLCBfX0ZVTkNUSU9OX18pOworCURSTV9ERUJVRygiXG4iKTsKIAogCUJFR0lOX1JJTkcoNSk7CiAKQEAgLTE2MSw3ICsxNjEsNyBAQAogCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlkcm1fcjEyOF9jb250ZXh0X3JlZ3NfdCAqY3R4ID0gJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGU7CiAJUklOR19MT0NBTFM7Ci0JRFJNX0RFQlVHKCIgICAgJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJRFJNX0RFQlVHKCJcbiIpOwogCiAJQkVHSU5fUklORygyKTsKIApAQCAtMTc4LDcgKzE3OCw3IEBACiAJZHJtX3IxMjhfdGV4dHVyZV9yZWdzX3QgKnRleCA9ICZzYXJlYV9wcml2LT50ZXhfc3RhdGVbMF07CiAJaW50IGk7CiAJUklOR19MT0NBTFM7Ci0JRFJNX0RFQlVHKCIgICAgJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJRFJNX0RFQlVHKCJcbiIpOwogCiAJQkVHSU5fUklORyg3ICsgUjEyOF9NQVhfVEVYVFVSRV9MRVZFTFMpOwogCkBAIC0yMDQsNyArMjA0LDcgQEAKIAlkcm1fcjEyOF90ZXh0dXJlX3JlZ3NfdCAqdGV4ID0gJnNhcmVhX3ByaXYtPnRleF9zdGF0ZVsxXTsKIAlpbnQgaTsKIAlSSU5HX0xPQ0FMUzsKLQlEUk1fREVCVUcoIiAgICAlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlEUk1fREVCVUcoIlxuIik7CiAKIAlCRUdJTl9SSU5HKDUgKyBSMTI4X01BWF9URVhUVVJFX0xFVkVMUyk7CiAKQEAgLTIyNiw3ICsyMjYsNyBAQAogCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAl1bnNpZ25lZCBpbnQgZGlydHkgPSBzYXJlYV9wcml2LT5kaXJ0eTsKIAotCURSTV9ERUJVRygiJXM6IGRpcnR5PTB4JTA4eFxuIiwgX19GVU5DVElPTl9fLCBkaXJ0eSk7CisJRFJNX0RFQlVHKCJkaXJ0eT0weCUwOHhcbiIsIGRpcnR5KTsKIAogCWlmIChkaXJ0eSAmIFIxMjhfVVBMT0FEX0NPUkUpIHsKIAkJcjEyOF9lbWl0X2NvcmUoZGV2X3ByaXYpOwpAQCAtMzYyLDcgKzM2Miw3IEBACiAJdW5zaWduZWQgaW50IGZsYWdzID0gY2xlYXItPmZsYWdzOwogCWludCBpOwogCVJJTkdfTE9DQUxTOwotCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJRFJNX0RFQlVHKCJcbiIpOwogCiAJaWYgKGRldl9wcml2LT5wYWdlX2ZsaXBwaW5nICYmIGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMSkgewogCQl1bnNpZ25lZCBpbnQgdG1wID0gZmxhZ3M7CkBAIC00NjYsNyArNDY2LDcgQEAKIAlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqcGJveCA9IHNhcmVhX3ByaXYtPmJveGVzOwogCWludCBpOwogCVJJTkdfTE9DQUxTOwotCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJRFJNX0RFQlVHKCJcbiIpOwogCiAjaWYgUjEyOF9QRVJGT1JNQU5DRV9CT1hFUwogCS8qIERvIHNvbWUgdHJpdmlhbCBwZXJmb3JtYW5jZSBtb25pdG9yaW5nLi4uCkBAIC01MjgsOCArNTI4LDcgQEAKIHsKIAlkcm1fcjEyOF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKLQlEUk1fREVCVUcoIiVzOiBwYWdlPSVkIHBmQ3VycmVudFBhZ2U9JWRcbiIsCi0JCSAgX19GVU5DVElPTl9fLAorCURSTV9ERUJVRygicGFnZT0lZCBwZkN1cnJlbnRQYWdlPSVkXG4iLAogCQkgIGRldl9wcml2LT5jdXJyZW50X3BhZ2UsIGRldl9wcml2LT5zYXJlYV9wcml2LT5wZkN1cnJlbnRQYWdlKTsKIAogI2lmIFIxMjhfUEVSRk9STUFOQ0VfQk9YRVMKQEAgLTExNTYsNyArMTE1NSw3IEBACiAJaW50IGNvdW50LCAqeCwgKnk7CiAJaW50IGksIHhidWZfc2l6ZSwgeWJ1Zl9zaXplOwogCVJJTkdfTE9DQUxTOwotCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJRFJNX0RFQlVHKCJcbiIpOwogCiAJY291bnQgPSBkZXB0aC0+bjsKIAlpZiAoY291bnQgPiA0MDk2IHx8IGNvdW50IDw9IDApCkBAIC0xMjI2LDcgKzEyMjUsNyBAQAogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBpOwogCVJJTkdfTE9DQUxTOwotCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJRFJNX0RFQlVHKCJcbiIpOwogCiAJQkVHSU5fUklORygzMyk7CiAKQEAgLTEzMDksNyArMTMwOCw3IEBACiBzdGF0aWMgaW50IHIxMjhfY2NlX2ZsaXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlEUk1fREVCVUcoIlxuIik7CiAKIAlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxlX3ByaXYpOwogCkBAIC0xMzI4LDcgKzEzMjcsNyBAQAogewogCWRybV9yMTI4X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9yMTI4X3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKLQlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCURSTV9ERUJVRygiXG4iKTsKIAogCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbGVfcHJpdik7CiAKQEAgLTEzNTYsNyArMTM1NSw3IEBACiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlsZV9wcml2KTsKIAogCWlmICghZGV2X3ByaXYpIHsKLQkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJRFJNX0VSUk9SKCJjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTQxMiw3ICsxNDExLDcgQEAKIAlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxlX3ByaXYpOwogCiAJaWYgKCFkZXZfcHJpdikgewotCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEUk1fRVJST1IoImNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xNTU3LDExICsxNTU2LDExIEBACiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlsZV9wcml2KTsKIAogCWlmICghZGV2X3ByaXYpIHsKLQkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJRFJNX0VSUk9SKCJjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCURSTV9ERUJVRygiaW5kaXJlY3Q6IGlkeD0lZCBzPSVkIGU9JWQgZD0lZFxuIiwKKwlEUk1fREVCVUcoImlkeD0lZCBzPSVkIGU9JWQgZD0lZFxuIiwKIAkJICBpbmRpcmVjdC0+aWR4LCBpbmRpcmVjdC0+c3RhcnQsIGluZGlyZWN0LT5lbmQsCiAJCSAgaW5kaXJlY3QtPmRpc2NhcmQpOwogCkBAIC0xNjIyLDcgKzE2MjEsNyBAQAogCWludCB2YWx1ZTsKIAogCWlmICghZGV2X3ByaXYpIHsKLQkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJRFJNX0VSUk9SKCJjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMzAwX2NtZGJ1Zi5jIGIvZHJpdmVycy9jaGFyL2RybS9yMzAwX2NtZGJ1Zi5jCmluZGV4IDU5YjI5NDQ4Li4wZjRhZmM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3IzMDBfY21kYnVmLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMzAwX2NtZGJ1Zi5jCkBAIC03NywyMyArNzcsMzEgQEAKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCX0KIAotCQkJYm94LngxID0KLQkJCSAgICAoYm94LngxICsKLQkJCSAgICAgUjMwMF9DTElQUkVDVF9PRkZTRVQpICYgUjMwMF9DTElQUkVDVF9NQVNLOwotCQkJYm94LnkxID0KLQkJCSAgICAoYm94LnkxICsKLQkJCSAgICAgUjMwMF9DTElQUkVDVF9PRkZTRVQpICYgUjMwMF9DTElQUkVDVF9NQVNLOwotCQkJYm94LngyID0KLQkJCSAgICAoYm94LngyICsKLQkJCSAgICAgUjMwMF9DTElQUkVDVF9PRkZTRVQpICYgUjMwMF9DTElQUkVDVF9NQVNLOwotCQkJYm94LnkyID0KLQkJCSAgICAoYm94LnkyICsKLQkJCSAgICAgUjMwMF9DTElQUkVDVF9PRkZTRVQpICYgUjMwMF9DTElQUkVDVF9NQVNLOworCQkJaWYgKChkZXZfcHJpdi0+ZmxhZ3MgJiBSQURFT05fRkFNSUxZX01BU0spID49IENISVBfUlY1MTUpIHsKKwkJCQlib3gueDEgPSAoYm94LngxKSAmCisJCQkJCVIzMDBfQ0xJUFJFQ1RfTUFTSzsKKwkJCQlib3gueTEgPSAoYm94LnkxKSAmCisJCQkJCVIzMDBfQ0xJUFJFQ1RfTUFTSzsKKwkJCQlib3gueDIgPSAoYm94LngyKSAmCisJCQkJCVIzMDBfQ0xJUFJFQ1RfTUFTSzsKKwkJCQlib3gueTIgPSAoYm94LnkyKSAmCisJCQkJCVIzMDBfQ0xJUFJFQ1RfTUFTSzsKKwkJCX0gZWxzZSB7CisJCQkJYm94LngxID0gKGJveC54MSArIFIzMDBfQ0xJUFJFQ1RfT0ZGU0VUKSAmCisJCQkJCVIzMDBfQ0xJUFJFQ1RfTUFTSzsKKwkJCQlib3gueTEgPSAoYm94LnkxICsgUjMwMF9DTElQUkVDVF9PRkZTRVQpICYKKwkJCQkJUjMwMF9DTElQUkVDVF9NQVNLOworCQkJCWJveC54MiA9IChib3gueDIgKyBSMzAwX0NMSVBSRUNUX09GRlNFVCkgJgorCQkJCQlSMzAwX0NMSVBSRUNUX01BU0s7CisJCQkJYm94LnkyID0gKGJveC55MiArIFIzMDBfQ0xJUFJFQ1RfT0ZGU0VUKSAmCisJCQkJCVIzMDBfQ0xJUFJFQ1RfTUFTSzsKIAorCQkJfQogCQkJT1VUX1JJTkcoKGJveC54MSA8PCBSMzAwX0NMSVBSRUNUX1hfU0hJRlQpIHwKIAkJCQkgKGJveC55MSA8PCBSMzAwX0NMSVBSRUNUX1lfU0hJRlQpKTsKIAkJCU9VVF9SSU5HKChib3gueDIgPDwgUjMwMF9DTElQUkVDVF9YX1NISUZUKSB8CiAJCQkJIChib3gueTIgPDwgUjMwMF9DTElQUkVDVF9ZX1NISUZUKSk7CisKIAkJfQogCiAJCU9VVF9SSU5HX1JFRyhSMzAwX1JFX0NMSVBSRUNUX0NOVEwsIHIzMDBfY2xpcHJlY3RfY250bFtuciAtIDFdKTsKQEAgLTEzMyw5ICsxNDEsMTEgQEAKIAogc3RhdGljIHU4IHIzMDBfcmVnX2ZsYWdzWzB4MTAwMDAgPj4gMl07CiAKLXZvaWQgcjMwMF9pbml0X3JlZ19mbGFncyh2b2lkKQordm9pZCByMzAwX2luaXRfcmVnX2ZsYWdzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJaW50IGk7CisJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwogCW1lbXNldChyMzAwX3JlZ19mbGFncywgMCwgMHgxMDAwMCA+PiAyKTsKICNkZWZpbmUgQUREX1JBTkdFX01BUksocmVnLCBjb3VudCxtYXJrKSBcCiAJCWZvcihpPSgocmVnKT4+Mik7aTwoKHJlZyk+PjIpKyhjb3VudCk7aSsrKVwKQEAgLTIzMCw2ICsyNDAsOSBAQAogCUFERF9SQU5HRShSMzAwX1ZBUF9JTlBVVF9ST1VURV8wXzAsIDgpOwogCUFERF9SQU5HRShSMzAwX1ZBUF9JTlBVVF9ST1VURV8xXzAsIDgpOwogCisJaWYgKChkZXZfcHJpdi0+ZmxhZ3MgJiBSQURFT05fRkFNSUxZX01BU0spID49IENISVBfUlY1MTUpIHsKKwkJQUREX1JBTkdFKDB4NDA3NCwgMTYpOworCX0KIH0KIAogc3RhdGljIF9faW5saW5lX18gaW50IHIzMDBfY2hlY2tfcmFuZ2UodW5zaWduZWQgcmVnLCBpbnQgY291bnQpCkBAIC00ODYsNyArNDk5LDcgQEAKIAlpZiAoY21kWzBdICYgMHg4MDAwKSB7CiAJCXUzMiBvZmZzZXQ7CiAKLQkJaWYgKGNtZFsxXSAmIChSQURFT05fR01DX1NSQ19QSVRDSF9PRkZTRVRfQ05UTCAKKwkJaWYgKGNtZFsxXSAmIChSQURFT05fR01DX1NSQ19QSVRDSF9PRkZTRVRfQ05UTAogCQkJICAgICAgfCBSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCkpIHsKIAkJCW9mZnNldCA9IGNtZFsyXSA8PCAxMDsKIAkJCXJldCA9ICFyYWRlb25fY2hlY2tfb2Zmc2V0KGRldl9wcml2LCBvZmZzZXQpOwpAQCAtNTA0LDcgKzUxNyw3IEBACiAJCQkJRFJNX0VSUk9SKCJJbnZhbGlkIGJpdGJsdCBzZWNvbmQgb2Zmc2V0IGlzICUwOFhcbiIsIG9mZnNldCk7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9Ci0JCQkKKwogCQl9CiAJfQogCkBAIC03MjMsNTQgKzczNiw1NCBAQAogCXUzMiAqcmVmX2FnZV9iYXNlOwogCXUzMiBpLCBidWZfaWR4LCBoX3BlbmRpbmc7CiAJUklOR19MT0NBTFM7Ci0JCi0JaWYgKGNtZGJ1Zi0+YnVmc3ogPCAKKworCWlmIChjbWRidWYtPmJ1ZnN6IDwKIAkgICAgKHNpemVvZih1NjQpICsgaGVhZGVyLnNjcmF0Y2gubl9idWZzICogc2l6ZW9mKGJ1Zl9pZHgpKSkgewogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JCisKIAlpZiAoaGVhZGVyLnNjcmF0Y2gucmVnID49IDUpIHsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCQorCiAJZGV2X3ByaXYtPnNjcmF0Y2hfYWdlc1toZWFkZXIuc2NyYXRjaC5yZWddKys7Ci0JCisKIAlyZWZfYWdlX2Jhc2UgPSAgKHUzMiAqKSh1bnNpZ25lZCBsb25nKSooKHVpbnQ2NF90ICopY21kYnVmLT5idWYpOwotCQorCiAJY21kYnVmLT5idWYgKz0gc2l6ZW9mKHU2NCk7CiAJY21kYnVmLT5idWZzeiAtPSBzaXplb2YodTY0KTsKLQkKKwogCWZvciAoaT0wOyBpIDwgaGVhZGVyLnNjcmF0Y2gubl9idWZzOyBpKyspIHsKIAkJYnVmX2lkeCA9ICoodTMyICopY21kYnVmLT5idWY7CiAJCWJ1Zl9pZHggKj0gMjsgLyogOCBieXRlcyBwZXIgYnVmICovCi0JCQorCiAJCWlmIChEUk1fQ09QWV9UT19VU0VSKHJlZl9hZ2VfYmFzZSArIGJ1Zl9pZHgsICZkZXZfcHJpdi0+c2NyYXRjaF9hZ2VzW2hlYWRlci5zY3JhdGNoLnJlZ10sIHNpemVvZih1MzIpKSkgewogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJCQkJCisKIAkJaWYgKERSTV9DT1BZX0ZST01fVVNFUigmaF9wZW5kaW5nLCByZWZfYWdlX2Jhc2UgKyBidWZfaWR4ICsgMSwgc2l6ZW9mKHUzMikpKSB7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQkJCQkKKwogCQlpZiAoaF9wZW5kaW5nID09IDApIHsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCQkJCQorCiAJCWhfcGVuZGluZy0tOwotCQkJCQkJCisKIAkJaWYgKERSTV9DT1BZX1RPX1VTRVIocmVmX2FnZV9iYXNlICsgYnVmX2lkeCArIDEsICZoX3BlbmRpbmcsIHNpemVvZih1MzIpKSkgewogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJCQkJCisKIAkJY21kYnVmLT5idWYgKz0gc2l6ZW9mKGJ1Zl9pZHgpOwogCQljbWRidWYtPmJ1ZnN6IC09IHNpemVvZihidWZfaWR4KTsKIAl9Ci0JCisKIAlCRUdJTl9SSU5HKDIpOwogCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fU0NSQVRDSF9SRUcwICsgaGVhZGVyLnNjcmF0Y2gucmVnICogNCwgMCApICk7CiAJT1VUX1JJTkcoIGRldl9wcml2LT5zY3JhdGNoX2FnZXNbaGVhZGVyLnNjcmF0Y2gucmVnXSApOwogCUFEVkFOQ0VfUklORygpOwotCQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTkxOSw3ICs5MzIsNyBAQAogCQkJCWdvdG8gY2xlYW51cDsKIAkJCX0KIAkJCWJyZWFrOwotCQkJCisKIAkJZGVmYXVsdDoKIAkJCURSTV9FUlJPUigiYmFkIGNtZF90eXBlICVpIGF0ICVwXG4iLAogCQkJCSAgaGVhZGVyLmhlYWRlci5jbWRfdHlwZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjMwMF9yZWcuaCBiL2RyaXZlcnMvY2hhci9kcm0vcjMwMF9yZWcuaAppbmRleCBmYTE5NGE0Li44ZjY2NGFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3IzMDBfcmVnLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMzAwX3JlZy5oCkBAIC04NTMsMTMgKzg1MywxMyBAQAogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfVzhaOFk4WDgJCSAgICAweEMKICMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX1cyWjEwWTEwWDEwCSAgICAweEQKICMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX1cxNloxNlkxNlgxNgkgICAgMHhFCi0jCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9EWFQxCSAgICAJICAgIDB4RgotIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfRFhUMwkgICAgCSAgICAweDEwCi0jCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9EWFQ1CSAgICAJICAgIDB4MTEKKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0RYVDEJCSAgICAweEYKKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0RYVDMJCSAgICAweDEwCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9EWFQ1CQkgICAgMHgxMQogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfRDNETUZUX0N4VjhVOAkgICAgMHgxMiAgICAgLyogbm8gc3dpenpsZSAqLwotIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQThSOEc4QjgJICAgIAkgICAgMHgxMyAgICAgLyogbm8gc3dpenpsZSAqLwotIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQjhHOF9COEc4CSAgICAJICAgIDB4MTQgICAgIC8qIG5vIHN3aXp6bGUgKi8KLSMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0c4UjhfRzhCOAkgICAgCSAgICAweDE1ICAgICAvKiBubyBzd2l6emxlICovCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9BOFI4RzhCOAkJICAgIDB4MTMgICAgIC8qIG5vIHN3aXp6bGUgKi8KKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0I4RzhfQjhHOAkJICAgIDB4MTQgICAgIC8qIG5vIHN3aXp6bGUgKi8KKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0c4UjhfRzhCOAkJICAgIDB4MTUgICAgIC8qIG5vIHN3aXp6bGUgKi8KIAkvKiAweDE2IC0gc29tZSAxNiBiaXQgZ3JlZW4gZm9ybWF0Li4gPz8gKi8KICMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX1VOSzI1CQkgICAoMSA8PCAyNSkgLyogbm8gc3dpenpsZSAqLwogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQ1VCSUNfTUFQCQkgICAoMSA8PCAyNikKQEAgLTg2NywxOSArODY3LDE5IEBACiAJLyogZ2FwICovCiAJLyogRmxvYXRpbmcgcG9pbnQgZm9ybWF0cyAqLwogCS8qIE5vdGUgLSBoYXJkd2FyZSBzdXBwb3J0cyBib3RoIDE2IGFuZCAzMiBiaXQgZmxvYXRpbmcgcG9pbnQgKi8KLSMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0ZMX0kxNgkgICAgCSAgICAweDE4Ci0jCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9GTF9JMTZBMTYJICAgIAkgICAgMHgxOQorIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfRkxfSTE2CQkgICAgMHgxOAorIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfRkxfSTE2QTE2CQkgICAgMHgxOQogIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfRkxfUjE2RzE2QjE2QTE2CSAgICAweDFBCi0jCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9GTF9JMzIJICAgIAkgICAgMHgxQgotIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfRkxfSTMyQTMyCSAgICAJICAgIDB4MUMKKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0ZMX0kzMgkJICAgIDB4MUIKKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0ZMX0kzMkEzMgkJICAgIDB4MUMKICMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0ZMX1IzMkczMkIzMkEzMgkgICAgMHgxRAogCS8qIGFscGhhIG1vZGVzLCBjb252ZW5pZW5jZSBtb3N0bHkgKi8KIAkvKiBpZiB5b3UgaGF2ZSBhbHBoYSwgcGljayBjb25zdGFudCBhcHByb3ByaWF0ZSB0byB0aGUKIAkgICBudW1iZXIgb2YgY2hhbm5lbHMgKDEgZm9yIEk4LCAyIGZvciBJOEE4LCA0IGZvciBSOEc4QjhBOCwgZXRjICovCi0jIAlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQUxQSEFfMUNICQkgICAgMHgwMDAKLSMgCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9BTFBIQV8yQ0gJCSAgICAweDIwMAotIyAJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0FMUEhBXzRDSAkJICAgIDB4NjAwCi0jIAlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQUxQSEFfTk9ORQkgICAgMHhBMDAKKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0FMUEhBXzFDSAkJICAgIDB4MDAwCisjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9BTFBIQV8yQ0gJCSAgICAweDIwMAorIwlkZWZpbmUgUjMwMF9UWF9GT1JNQVRfQUxQSEFfNENICQkgICAgMHg2MDAKKyMJZGVmaW5lIFIzMDBfVFhfRk9STUFUX0FMUEhBX05PTkUJICAgIDB4QTAwCiAJLyogU3dpenpsaW5nICovCiAJLyogY29uc3RhbnRzICovCiAjCWRlZmluZSBSMzAwX1RYX0ZPUk1BVF9YCQkwCkBAIC0xMzYwLDExICsxMzYwLDExIEBACiAjICAgICAgIGRlZmluZSBSMzAwX1JCM0RfWl9ESVNBQkxFRF8yICAgICAgICAgICAgMHgwMDAwMDAxNAogIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX1pfVEVTVCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTIKICMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9aX1RFU1RfQU5EX1dSSVRFICAgICAgICAweDAwMDAwMDE2Ci0jICAgICAgIGRlZmluZSBSMzAwX1JCM0RfWl9XUklURV9PTkxZICAgICAgICAJIDB4MDAwMDAwMDYKKyMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9aX1dSSVRFX09OTFkJCSAweDAwMDAwMDA2CiAKICMgICAgICAgZGVmaW5lIFIzMDBfUkIzRF9aX1RFU1QgICAgICAgICAgICAgICAgICAweDAwMDAwMDEyCiAjICAgICAgIGRlZmluZSBSMzAwX1JCM0RfWl9URVNUX0FORF9XUklURSAgICAgICAgMHgwMDAwMDAxNgotIyAgICAgICBkZWZpbmUgUjMwMF9SQjNEX1pfV1JJVEVfT05MWSAgICAgICAgCSAweDAwMDAwMDA2CisjICAgICAgIGRlZmluZSBSMzAwX1JCM0RfWl9XUklURV9PTkxZCQkgMHgwMDAwMDAwNgogIwlkZWZpbmUgUjMwMF9SQjNEX1NURU5DSUxfRU5BQkxFCQkgMHgwMDAwMDAwMQogCiAjZGVmaW5lIFIzMDBfUkIzRF9aU1RFTkNJTF9DTlRMXzEgICAgICAgICAgICAgICAgICAgMHg0RjA0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9jcC5jIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fY3AuYwppbmRleCAyNGZjYThlLi41ZGM3OTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9jcC5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2NwLmMKQEAgLTgxNiw2ICs4MTYsNDYgQEAKIAl7MDAwMDAwMDAwMCwgMDAwMDAwMDAwMH0sCiB9OwogCitzdGF0aWMgdTMyIFJBREVPTl9SRUFEX01DSU5EKGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IGFkZHIpCit7CisJdTMyIHJldDsKKwlSQURFT05fV1JJVEUoUjUyMF9NQ19JTkRfSU5ERVgsIDB4N2YwMDAwIHwgKGFkZHIgJiAweGZmKSk7CisJcmV0ID0gUkFERU9OX1JFQUQoUjUyMF9NQ19JTkRfREFUQSk7CisJUkFERU9OX1dSSVRFKFI1MjBfTUNfSU5EX0lOREVYLCAwKTsKKwlyZXR1cm4gcmV0OworfQorCit1MzIgcmFkZW9uX3JlYWRfZmJfbG9jYXRpb24oZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2KQoreworCisJaWYgKChkZXZfcHJpdi0+ZmxhZ3MgJiBSQURFT05fRkFNSUxZX01BU0spID09IENISVBfUlY1MTUpCisJCXJldHVybiBSQURFT05fUkVBRF9NQ0lORChkZXZfcHJpdiwgUlY1MTVfTUNfRkJfTE9DQVRJT04pOworCWVsc2UgaWYgKChkZXZfcHJpdi0+ZmxhZ3MgJiBSQURFT05fRkFNSUxZX01BU0spID4gQ0hJUF9SVjUxNSkKKwkJcmV0dXJuIFJBREVPTl9SRUFEX01DSU5EKGRldl9wcml2LCBSNTIwX01DX0ZCX0xPQ0FUSU9OKTsKKwllbHNlCisJCXJldHVybiBSQURFT05fUkVBRChSQURFT05fTUNfRkJfTE9DQVRJT04pOworfQorCitzdGF0aWMgdm9pZCByYWRlb25fd3JpdGVfZmJfbG9jYXRpb24oZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LCB1MzIgZmJfbG9jKQoreworCWlmICgoZGV2X3ByaXYtPmZsYWdzICYgUkFERU9OX0ZBTUlMWV9NQVNLKSA9PSBDSElQX1JWNTE1KQorCQlSQURFT05fV1JJVEVfTUNJTkQoUlY1MTVfTUNfRkJfTE9DQVRJT04sIGZiX2xvYyk7CisJZWxzZSBpZiAoKGRldl9wcml2LT5mbGFncyAmIFJBREVPTl9GQU1JTFlfTUFTSykgPiBDSElQX1JWNTE1KQorCQlSQURFT05fV1JJVEVfTUNJTkQoUjUyMF9NQ19GQl9MT0NBVElPTiwgZmJfbG9jKTsKKwllbHNlCisJCVJBREVPTl9XUklURShSQURFT05fTUNfRkJfTE9DQVRJT04sIGZiX2xvYyk7Cit9CisKK3N0YXRpYyB2b2lkIHJhZGVvbl93cml0ZV9hZ3BfbG9jYXRpb24oZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LCB1MzIgYWdwX2xvYykKK3sKKwlpZiAoKGRldl9wcml2LT5mbGFncyAmIFJBREVPTl9GQU1JTFlfTUFTSykgPT0gQ0hJUF9SVjUxNSkKKwkJUkFERU9OX1dSSVRFX01DSU5EKFJWNTE1X01DX0FHUF9MT0NBVElPTiwgYWdwX2xvYyk7CisJZWxzZSBpZiAoKGRldl9wcml2LT5mbGFncyAmIFJBREVPTl9GQU1JTFlfTUFTSykgPiBDSElQX1JWNTE1KQorCQlSQURFT05fV1JJVEVfTUNJTkQoUjUyMF9NQ19BR1BfTE9DQVRJT04sIGFncF9sb2MpOworCWVsc2UKKwkJUkFERU9OX1dSSVRFKFJBREVPTl9NQ19BR1BfTE9DQVRJT04sIGFncF9sb2MpOworfQorCiBzdGF0aWMgaW50IFJBREVPTl9SRUFEX1BMTChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwgaW50IGFkZHIpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTgyNCw3ICs4NjQsNyBAQAogCXJldHVybiBSQURFT05fUkVBRChSQURFT05fQ0xPQ0tfQ05UTF9EQVRBKTsKIH0KIAotc3RhdGljIGludCBSQURFT05fUkVBRF9QQ0lFKGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IGFkZHIpCitzdGF0aWMgdTMyIFJBREVPTl9SRUFEX1BDSUUoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LCBpbnQgYWRkcikKIHsKIAlSQURFT05fV1JJVEU4KFJBREVPTl9QQ0lFX0lOREVYLCBhZGRyICYgMHhmZik7CiAJcmV0dXJuIFJBREVPTl9SRUFEKFJBREVPTl9QQ0lFX0RBVEEpOwpAQCAtMTA3NCw0MSArMTExNCw0MyBAQAogCiAJcmFkZW9uX2RvX3BpeGNhY2hlX2ZsdXNoKGRldl9wcml2KTsKIAotCWNsb2NrX2NudGxfaW5kZXggPSBSQURFT05fUkVBRChSQURFT05fQ0xPQ0tfQ05UTF9JTkRFWCk7Ci0JbWNsa19jbnRsID0gUkFERU9OX1JFQURfUExMKGRldiwgUkFERU9OX01DTEtfQ05UTCk7CisJaWYgKChkZXZfcHJpdi0+ZmxhZ3MgJiBSQURFT05fRkFNSUxZX01BU0spIDwgQ0hJUF9SVjUxNSkgeworCQljbG9ja19jbnRsX2luZGV4ID0gUkFERU9OX1JFQUQoUkFERU9OX0NMT0NLX0NOVExfSU5ERVgpOworCQltY2xrX2NudGwgPSBSQURFT05fUkVBRF9QTEwoZGV2LCBSQURFT05fTUNMS19DTlRMKTsKIAotCVJBREVPTl9XUklURV9QTEwoUkFERU9OX01DTEtfQ05UTCwgKG1jbGtfY250bCB8Ci0JCQkJCSAgICBSQURFT05fRk9SQ0VPTl9NQ0xLQSB8Ci0JCQkJCSAgICBSQURFT05fRk9SQ0VPTl9NQ0xLQiB8Ci0JCQkJCSAgICBSQURFT05fRk9SQ0VPTl9ZQ0xLQSB8Ci0JCQkJCSAgICBSQURFT05fRk9SQ0VPTl9ZQ0xLQiB8Ci0JCQkJCSAgICBSQURFT05fRk9SQ0VPTl9NQyB8Ci0JCQkJCSAgICBSQURFT05fRk9SQ0VPTl9BSUMpKTsKKwkJUkFERU9OX1dSSVRFX1BMTChSQURFT05fTUNMS19DTlRMLCAobWNsa19jbnRsIHwKKwkJCQkJCSAgICBSQURFT05fRk9SQ0VPTl9NQ0xLQSB8CisJCQkJCQkgICAgUkFERU9OX0ZPUkNFT05fTUNMS0IgfAorCQkJCQkJICAgIFJBREVPTl9GT1JDRU9OX1lDTEtBIHwKKwkJCQkJCSAgICBSQURFT05fRk9SQ0VPTl9ZQ0xLQiB8CisJCQkJCQkgICAgUkFERU9OX0ZPUkNFT05fTUMgfAorCQkJCQkJICAgIFJBREVPTl9GT1JDRU9OX0FJQykpOwogCi0JcmJibV9zb2Z0X3Jlc2V0ID0gUkFERU9OX1JFQUQoUkFERU9OX1JCQk1fU09GVF9SRVNFVCk7CisJCXJiYm1fc29mdF9yZXNldCA9IFJBREVPTl9SRUFEKFJBREVPTl9SQkJNX1NPRlRfUkVTRVQpOwogCi0JUkFERU9OX1dSSVRFKFJBREVPTl9SQkJNX1NPRlRfUkVTRVQsIChyYmJtX3NvZnRfcmVzZXQgfAotCQkJCQkgICAgICBSQURFT05fU09GVF9SRVNFVF9DUCB8Ci0JCQkJCSAgICAgIFJBREVPTl9TT0ZUX1JFU0VUX0hJIHwKLQkJCQkJICAgICAgUkFERU9OX1NPRlRfUkVTRVRfU0UgfAotCQkJCQkgICAgICBSQURFT05fU09GVF9SRVNFVF9SRSB8Ci0JCQkJCSAgICAgIFJBREVPTl9TT0ZUX1JFU0VUX1BQIHwKLQkJCQkJICAgICAgUkFERU9OX1NPRlRfUkVTRVRfRTIgfAotCQkJCQkgICAgICBSQURFT05fU09GVF9SRVNFVF9SQikpOwotCVJBREVPTl9SRUFEKFJBREVPTl9SQkJNX1NPRlRfUkVTRVQpOwotCVJBREVPTl9XUklURShSQURFT05fUkJCTV9TT0ZUX1JFU0VULCAocmJibV9zb2Z0X3Jlc2V0ICYKLQkJCQkJICAgICAgfihSQURFT05fU09GVF9SRVNFVF9DUCB8Ci0JCQkJCQlSQURFT05fU09GVF9SRVNFVF9ISSB8Ci0JCQkJCQlSQURFT05fU09GVF9SRVNFVF9TRSB8Ci0JCQkJCQlSQURFT05fU09GVF9SRVNFVF9SRSB8Ci0JCQkJCQlSQURFT05fU09GVF9SRVNFVF9QUCB8Ci0JCQkJCQlSQURFT05fU09GVF9SRVNFVF9FMiB8Ci0JCQkJCQlSQURFT05fU09GVF9SRVNFVF9SQikpKTsKLQlSQURFT05fUkVBRChSQURFT05fUkJCTV9TT0ZUX1JFU0VUKTsKKwkJUkFERU9OX1dSSVRFKFJBREVPTl9SQkJNX1NPRlRfUkVTRVQsIChyYmJtX3NvZnRfcmVzZXQgfAorCQkJCQkJICAgICAgUkFERU9OX1NPRlRfUkVTRVRfQ1AgfAorCQkJCQkJICAgICAgUkFERU9OX1NPRlRfUkVTRVRfSEkgfAorCQkJCQkJICAgICAgUkFERU9OX1NPRlRfUkVTRVRfU0UgfAorCQkJCQkJICAgICAgUkFERU9OX1NPRlRfUkVTRVRfUkUgfAorCQkJCQkJICAgICAgUkFERU9OX1NPRlRfUkVTRVRfUFAgfAorCQkJCQkJICAgICAgUkFERU9OX1NPRlRfUkVTRVRfRTIgfAorCQkJCQkJICAgICAgUkFERU9OX1NPRlRfUkVTRVRfUkIpKTsKKwkJUkFERU9OX1JFQUQoUkFERU9OX1JCQk1fU09GVF9SRVNFVCk7CisJCVJBREVPTl9XUklURShSQURFT05fUkJCTV9TT0ZUX1JFU0VULCAocmJibV9zb2Z0X3Jlc2V0ICYKKwkJCQkJCSAgICAgIH4oUkFERU9OX1NPRlRfUkVTRVRfQ1AgfAorCQkJCQkJCVJBREVPTl9TT0ZUX1JFU0VUX0hJIHwKKwkJCQkJCQlSQURFT05fU09GVF9SRVNFVF9TRSB8CisJCQkJCQkJUkFERU9OX1NPRlRfUkVTRVRfUkUgfAorCQkJCQkJCVJBREVPTl9TT0ZUX1JFU0VUX1BQIHwKKwkJCQkJCQlSQURFT05fU09GVF9SRVNFVF9FMiB8CisJCQkJCQkJUkFERU9OX1NPRlRfUkVTRVRfUkIpKSk7CisJCVJBREVPTl9SRUFEKFJBREVPTl9SQkJNX1NPRlRfUkVTRVQpOwogCi0JUkFERU9OX1dSSVRFX1BMTChSQURFT05fTUNMS19DTlRMLCBtY2xrX2NudGwpOwotCVJBREVPTl9XUklURShSQURFT05fQ0xPQ0tfQ05UTF9JTkRFWCwgY2xvY2tfY250bF9pbmRleCk7Ci0JUkFERU9OX1dSSVRFKFJBREVPTl9SQkJNX1NPRlRfUkVTRVQsIHJiYm1fc29mdF9yZXNldCk7CisJCVJBREVPTl9XUklURV9QTEwoUkFERU9OX01DTEtfQ05UTCwgbWNsa19jbnRsKTsKKwkJUkFERU9OX1dSSVRFKFJBREVPTl9DTE9DS19DTlRMX0lOREVYLCBjbG9ja19jbnRsX2luZGV4KTsKKwkJUkFERU9OX1dSSVRFKFJBREVPTl9SQkJNX1NPRlRfUkVTRVQsIHJiYm1fc29mdF9yZXNldCk7CisJfQogCiAJLyogUmVzZXQgdGhlIENQIHJpbmcgKi8KIAlyYWRlb25fZG9fY3BfcmVzZXQoZGV2X3ByaXYpOwpAQCAtMTEyNywyMSArMTE2OSwyMSBAQAogewogCXUzMiByaW5nX3N0YXJ0LCBjdXJfcmVhZF9wdHI7CiAJdTMyIHRtcDsKLQkKKwogCS8qIEluaXRpYWxpemUgdGhlIG1lbW9yeSBjb250cm9sbGVyLiBXaXRoIG5ldyBtZW1vcnkgbWFwLCB0aGUgZmIgbG9jYXRpb24KIAkgKiBpcyBub3QgY2hhbmdlZCwgaXQgc2hvdWxkIGhhdmUgYmVlbiBwcm9wZXJseSBpbml0aWFsaXplZCBhbHJlYWR5LiBQYXJ0CiAJICogb2YgdGhlIHByb2JsZW0gaXMgdGhhdCB0aGUgY29kZSBiZWxvdyBpcyBib2d1cywgYXNzdW1pbmcgdGhlIEdBUlQgaXMKIAkgKiBhbHdheXMgYXBwZW5kZWQgdG8gdGhlIGZiIHdoaWNoIGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgY2FzZQogCSAqLwogCWlmICghZGV2X3ByaXYtPm5ld19tZW1tYXApCi0JCVJBREVPTl9XUklURShSQURFT05fTUNfRkJfTE9DQVRJT04sCisJCXJhZGVvbl93cml0ZV9mYl9sb2NhdGlvbihkZXZfcHJpdiwKIAkJCSAgICAgKChkZXZfcHJpdi0+Z2FydF92bV9zdGFydCAtIDEpICYgMHhmZmZmMDAwMCkKIAkJCSAgICAgfCAoZGV2X3ByaXYtPmZiX2xvY2F0aW9uID4+IDE2KSk7CiAKICNpZiBfX09TX0hBU19BR1AKIAlpZiAoZGV2X3ByaXYtPmZsYWdzICYgUkFERU9OX0lTX0FHUCkgewogCQlSQURFT05fV1JJVEUoUkFERU9OX0FHUF9CQVNFLCAodW5zaWduZWQgaW50KWRldi0+YWdwLT5iYXNlKTsKLQkJUkFERU9OX1dSSVRFKFJBREVPTl9NQ19BR1BfTE9DQVRJT04sCisJCXJhZGVvbl93cml0ZV9hZ3BfbG9jYXRpb24oZGV2X3ByaXYsCiAJCQkgICAgICgoKGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0IC0gMSArCiAJCQkJZGV2X3ByaXYtPmdhcnRfc2l6ZSkgJiAweGZmZmYwMDAwKSB8CiAJCQkgICAgICAoZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQgPj4gMTYpKSk7CkBAIC0xMTkwLDkgKzEyMzIsMTUgQEAKIAkvKiBTZXQgcmluZyBidWZmZXIgc2l6ZSAqLwogI2lmZGVmIF9fQklHX0VORElBTgogCVJBREVPTl9XUklURShSQURFT05fQ1BfUkJfQ05UTCwKLQkJICAgICBkZXZfcHJpdi0+cmluZy5zaXplX2wycXcgfCBSQURFT05fQlVGX1NXQVBfMzJCSVQpOworCQkgICAgIFJBREVPTl9CVUZfU1dBUF8zMkJJVCB8CisJCSAgICAgKGRldl9wcml2LT5yaW5nLmZldGNoX3NpemVfbDJvdyA8PCAxOCkgfAorCQkgICAgIChkZXZfcHJpdi0+cmluZy5ycHRyX3VwZGF0ZV9sMnF3IDw8IDgpIHwKKwkJICAgICBkZXZfcHJpdi0+cmluZy5zaXplX2wycXcpOwogI2Vsc2UKLQlSQURFT05fV1JJVEUoUkFERU9OX0NQX1JCX0NOVEwsIGRldl9wcml2LT5yaW5nLnNpemVfbDJxdyk7CisJUkFERU9OX1dSSVRFKFJBREVPTl9DUF9SQl9DTlRMLAorCQkgICAgIChkZXZfcHJpdi0+cmluZy5mZXRjaF9zaXplX2wyb3cgPDwgMTgpIHwKKwkJICAgICAoZGV2X3ByaXYtPnJpbmcucnB0cl91cGRhdGVfbDJxdyA8PCA4KSB8CisJCSAgICAgZGV2X3ByaXYtPnJpbmcuc2l6ZV9sMnF3KTsKICNlbmRpZgogCiAJLyogU3RhcnQgd2l0aCBhc3N1bWluZyB0aGF0IHdyaXRlYmFjayBkb2Vzbid0IHdvcmsgKi8KQEAgLTEyOTksNyArMTM0Nyw3IEBACiAKIAkJUkFERU9OX1dSSVRFKFJBREVPTl9BR1BfQkFTRSwgKHVuc2lnbmVkIGludClkZXZfcHJpdi0+Z2FydF92bV9zdGFydCk7CiAJCWRldl9wcml2LT5nYXJ0X3NpemUgPSAzMioxMDI0KjEwMjQ7Ci0JCVJBREVPTl9XUklURShSQURFT05fTUNfQUdQX0xPQ0FUSU9OLAorCQlyYWRlb25fd3JpdGVfYWdwX2xvY2F0aW9uKGRldl9wcml2LAogCQkJICAgICAoKChkZXZfcHJpdi0+Z2FydF92bV9zdGFydCAtIDEgKwogCQkJICAgICAgIGRldl9wcml2LT5nYXJ0X3NpemUpICYgMHhmZmZmMDAwMCkgfAogCQkJICAgICAoZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQgPj4gMTYpKSk7CkBAIC0xMzMzLDcgKzEzODEsNyBAQAogCQkJCSAgZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQgKwogCQkJCSAgZGV2X3ByaXYtPmdhcnRfc2l6ZSAtIDEpOwogCi0JCVJBREVPTl9XUklURShSQURFT05fTUNfQUdQX0xPQ0FUSU9OLCAweGZmZmZmZmMwKTsJLyogPz8gKi8KKwkJcmFkZW9uX3dyaXRlX2FncF9sb2NhdGlvbihkZXZfcHJpdiwgMHhmZmZmZmZjMCk7IC8qID8/ICovCiAKIAkJUkFERU9OX1dSSVRFX1BDSUUoUkFERU9OX1BDSUVfVFhfR0FSVF9DTlRMLAogCQkJCSAgUkFERU9OX1BDSUVfVFhfR0FSVF9FTik7CkBAIC0xMzU4LDcgKzE0MDYsNyBAQAogCQlyZXR1cm47CiAJfQogCi0gCXRtcCA9IFJBREVPTl9SRUFEKFJBREVPTl9BSUNfQ05UTCk7CisJdG1wID0gUkFERU9OX1JFQUQoUkFERU9OX0FJQ19DTlRMKTsKIAogCWlmIChvbikgewogCQlSQURFT05fV1JJVEUoUkFERU9OX0FJQ19DTlRMLApAQCAtMTM3Niw3ICsxNDI0LDcgQEAKIAogCQkvKiBUdXJuIG9mZiBBR1AgYXBlcnR1cmUgLS0gaXMgdGhpcyByZXF1aXJlZCBmb3IgUENJIEdBUlQ/CiAJCSAqLwotCQlSQURFT05fV1JJVEUoUkFERU9OX01DX0FHUF9MT0NBVElPTiwgMHhmZmZmZmZjMCk7CS8qID8/ICovCisJCXJhZGVvbl93cml0ZV9hZ3BfbG9jYXRpb24oZGV2X3ByaXYsIDB4ZmZmZmZmYzApOwogCQlSQURFT05fV1JJVEUoUkFERU9OX0FHUF9DT01NQU5ELCAwKTsJLyogY2xlYXIgQUdQX0NPTU1BTkQgKi8KIAl9IGVsc2UgewogCQlSQURFT05fV1JJVEUoUkFERU9OX0FJQ19DTlRMLApAQCAtMTU4MSwxMCArMTYyOSw5IEBACiAJCQkgIGRldi0+YWdwX2J1ZmZlcl9tYXAtPmhhbmRsZSk7CiAJfQogCi0JZGV2X3ByaXYtPmZiX2xvY2F0aW9uID0gKFJBREVPTl9SRUFEKFJBREVPTl9NQ19GQl9MT0NBVElPTikKLQkJCQkgJiAweGZmZmYpIDw8IDE2OwotCWRldl9wcml2LT5mYl9zaXplID0gCi0JCSgoUkFERU9OX1JFQUQoUkFERU9OX01DX0ZCX0xPQ0FUSU9OKSAmIDB4ZmZmZjAwMDB1KSArIDB4MTAwMDApCisJZGV2X3ByaXYtPmZiX2xvY2F0aW9uID0gKHJhZGVvbl9yZWFkX2ZiX2xvY2F0aW9uKGRldl9wcml2KSAmIDB4ZmZmZikgPDwgMTY7CisJZGV2X3ByaXYtPmZiX3NpemUgPQorCQkoKHJhZGVvbl9yZWFkX2ZiX2xvY2F0aW9uKGRldl9wcml2KSAmIDB4ZmZmZjAwMDB1KSArIDB4MTAwMDApCiAJCS0gZGV2X3ByaXYtPmZiX2xvY2F0aW9uOwogCiAJZGV2X3ByaXYtPmZyb250X3BpdGNoX29mZnNldCA9ICgoKGRldl9wcml2LT5mcm9udF9waXRjaCAvIDY0KSA8PCAyMikgfApAQCAtMTYzMCw3ICsxNjc3LDcgQEAKIAkJCSAgICAoKGJhc2UgKyBkZXZfcHJpdi0+Z2FydF9zaXplKSAmIDB4ZmZmZmZmZmZ1bCkgPCBiYXNlKQogCQkJCWJhc2UgPSBkZXZfcHJpdi0+ZmJfbG9jYXRpb24KIAkJCQkJLSBkZXZfcHJpdi0+Z2FydF9zaXplOwotCQl9CQkKKwkJfQogCQlkZXZfcHJpdi0+Z2FydF92bV9zdGFydCA9IGJhc2UgJiAweGZmYzAwMDAwdTsKIAkJaWYgKGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0ICE9IGJhc2UpCiAJCQlEUk1fSU5GTygiR0FSVCBhbGlnbmVkIGRvd24gZnJvbSAweCUwOHggdG8gMHglMDh4XG4iLApAQCAtMTY2Myw2ICsxNzEwLDExIEBACiAJZGV2X3ByaXYtPnJpbmcuc2l6ZSA9IGluaXQtPnJpbmdfc2l6ZTsKIAlkZXZfcHJpdi0+cmluZy5zaXplX2wycXcgPSBkcm1fb3JkZXIoaW5pdC0+cmluZ19zaXplIC8gOCk7CiAKKwlkZXZfcHJpdi0+cmluZy5ycHRyX3VwZGF0ZSA9IC8qIGluaXQtPnJwdHJfdXBkYXRlICovIDQwOTY7CisJZGV2X3ByaXYtPnJpbmcucnB0cl91cGRhdGVfbDJxdyA9IGRybV9vcmRlciggLyogaW5pdC0+cnB0cl91cGRhdGUgKi8gNDA5NiAvIDgpOworCisJZGV2X3ByaXYtPnJpbmcuZmV0Y2hfc2l6ZSA9IC8qIGluaXQtPmZldGNoX3NpemUgKi8gMzI7CisJZGV2X3ByaXYtPnJpbmcuZmV0Y2hfc2l6ZV9sMm93ID0gZHJtX29yZGVyKCAvKiBpbml0LT5mZXRjaF9zaXplICovIDMyIC8gMTYpOwogCWRldl9wcml2LT5yaW5nLnRhaWxfbWFzayA9IChkZXZfcHJpdi0+cmluZy5zaXplIC8gc2l6ZW9mKHUzMikpIC0gMTsKIAogCWRldl9wcml2LT5yaW5nLmhpZ2hfbWFyayA9IFJBREVPTl9SSU5HX0hJR0hfTUFSSzsKQEAgLTE4MzAsNyArMTg4Miw3IEBACiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlsZV9wcml2KTsKIAogCWlmIChpbml0LT5mdW5jID09IFJBREVPTl9JTklUX1IzMDBfQ1ApCi0JCXIzMDBfaW5pdF9yZWdfZmxhZ3MoKTsKKwkJcjMwMF9pbml0X3JlZ19mbGFncyhkZXYpOwogCiAJc3dpdGNoIChpbml0LT5mdW5jKSB7CiAJY2FzZSBSQURFT05fSU5JVF9DUDoKQEAgLTE4NTIsMTIgKzE5MDQsMTIgQEAKIAlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxlX3ByaXYpOwogCiAJaWYgKGRldl9wcml2LT5jcF9ydW5uaW5nKSB7Ci0JCURSTV9ERUJVRygiJXMgd2hpbGUgQ1AgcnVubmluZ1xuIiwgX19GVU5DVElPTl9fKTsKKwkJRFJNX0RFQlVHKCJ3aGlsZSBDUCBydW5uaW5nXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmIChkZXZfcHJpdi0+Y3BfbW9kZSA9PSBSQURFT05fQ1NRX1BSSURJU19JTkRESVMpIHsKLQkJRFJNX0RFQlVHKCIlcyBjYWxsZWQgd2l0aCBib2d1cyBDUCBtb2RlICglZClcbiIsCi0JCQkgIF9fRlVOQ1RJT05fXywgZGV2X3ByaXYtPmNwX21vZGUpOworCQlEUk1fREVCVUcoImNhbGxlZCB3aXRoIGJvZ3VzIENQIG1vZGUgKCVkKVxuIiwKKwkJCSAgZGV2X3ByaXYtPmNwX21vZGUpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE5NjIsNyArMjAxNCw3IEBACiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlsZV9wcml2KTsKIAogCWlmICghZGV2X3ByaXYpIHsKLQkJRFJNX0RFQlVHKCIlcyBjYWxsZWQgYmVmb3JlIGluaXQgZG9uZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJRFJNX0RFQlVHKCJjYWxsZWQgYmVmb3JlIGluaXQgZG9uZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjIzOSw2ICsyMjkxLDEwIEBACiAJY2FzZSBDSElQX1IzNTA6CiAJY2FzZSBDSElQX1I0MjA6CiAJY2FzZSBDSElQX1JWNDEwOgorCWNhc2UgQ0hJUF9SVjUxNToKKwljYXNlIENISVBfUjUyMDoKKwljYXNlIENISVBfUlY1NzA6CisJY2FzZSBDSElQX1I1ODA6CiAJCWRldl9wcml2LT5mbGFncyB8PSBSQURFT05fSEFTX0hJRVJaOwogCQlicmVhazsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcm0uaAppbmRleCA1YThlMjNmLi43MWU1YjIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcm0uaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcm0uaApAQCAtMjIzLDEwICsyMjMsMTAgQEAKICNkZWZpbmUgUjMwMF9DTURfQ1BfREVMQVkJCTUKICNkZWZpbmUgUjMwMF9DTURfRE1BX0RJU0NBUkQJCTYKICNkZWZpbmUgUjMwMF9DTURfV0FJVAkJCTcKLSMJZGVmaW5lIFIzMDBfV0FJVF8yRCAgCQkweDEKLSMJZGVmaW5lIFIzMDBfV0FJVF8zRCAgCQkweDIKLSMJZGVmaW5lIFIzMDBfV0FJVF8yRF9DTEVBTiAgCTB4MwotIwlkZWZpbmUgUjMwMF9XQUlUXzNEX0NMRUFOICAJMHg0CisjCWRlZmluZSBSMzAwX1dBSVRfMkQJCTB4MQorIwlkZWZpbmUgUjMwMF9XQUlUXzNECQkweDIKKyMJZGVmaW5lIFIzMDBfV0FJVF8yRF9DTEVBTgkweDMKKyMJZGVmaW5lIFIzMDBfV0FJVF8zRF9DTEVBTgkweDQKICNkZWZpbmUgUjMwMF9DTURfU0NSQVRDSAkJOAogCiB0eXBlZGVmIHVuaW9uIHsKQEAgLTY1Niw2ICs2NTYsNyBAQAogI2RlZmluZSBSQURFT05fUEFSQU1fU0NSQVRDSF9PRkZTRVQgICAgICAgIDExCiAjZGVmaW5lIFJBREVPTl9QQVJBTV9DQVJEX1RZUEUgICAgICAgICAgICAgMTIKICNkZWZpbmUgUkFERU9OX1BBUkFNX1ZCTEFOS19DUlRDICAgICAgICAgICAxMyAgIC8qIFZCTEFOSyBDUlRDICovCisjZGVmaW5lIFJBREVPTl9QQVJBTV9GQl9MT0NBVElPTiAgICAgICAgICAgMTQgICAvKiBGQiBsb2NhdGlvbiAqLwogCiB0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2dldHBhcmFtIHsKIAlpbnQgcGFyYW07CkBAIC03MjIsNyArNzIzLDcgQEAKIAl1bnNpZ25lZCBpbnQgYWRkcmVzczsKIH0gZHJtX3JhZGVvbl9zdXJmYWNlX2ZyZWVfdDsKIAotI2RlZmluZQlEUk1fUkFERU9OX1ZCTEFOS19DUlRDMSAJMQotI2RlZmluZQlEUk1fUkFERU9OX1ZCTEFOS19DUlRDMiAJMgorI2RlZmluZQlEUk1fUkFERU9OX1ZCTEFOS19DUlRDMQkJMQorI2RlZmluZQlEUk1fUkFERU9OX1ZCTEFOS19DUlRDMgkJMgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmgKaW5kZXggYmZiYjYwYS4uNDQzNDMzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmgKQEAgLTEyMyw2ICsxMjMsMTIgQEAKIAlDSElQX1I0MjAsCiAJQ0hJUF9SVjQxMCwKIAlDSElQX1JTNDAwLAorCUNISVBfUlY1MTUsCisJQ0hJUF9SNTIwLAorCUNISVBfUlY1MzAsCisJQ0hJUF9SVjU2MCwKKwlDSElQX1JWNTcwLAorCUNISVBfUjU4MCwKIAlDSElQX0xBU1QsCiB9OwogCkBAIC0xNjYsNiArMTcyLDEyIEBACiAJaW50IHNpemU7CiAJaW50IHNpemVfbDJxdzsKIAorCWludCBycHRyX3VwZGF0ZTsgLyogRG91YmxlIFdvcmRzICovCisJaW50IHJwdHJfdXBkYXRlX2wycXc7IC8qIGxvZzIgUXVhZCBXb3JkcyAqLworCisJaW50IGZldGNoX3NpemU7IC8qIERvdWJsZSBXb3JkcyAqLworCWludCBmZXRjaF9zaXplX2wyb3c7IC8qIGxvZzIgT2N0IFdvcmRzICovCisKIAl1MzIgdGFpbDsKIAl1MzIgdGFpbF9tYXNrOwogCWludCBzcGFjZTsKQEAgLTMzNiw2ICszNDgsNyBAQAogZXh0ZXJuIGludCByYWRlb25fZW5naW5lX3Jlc2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KTsKIGV4dGVybiBpbnQgcmFkZW9uX2Z1bGxzY3JlZW4oc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpOwogZXh0ZXJuIGludCByYWRlb25fY3BfYnVmZmVycyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdik7CitleHRlcm4gdTMyIHJhZGVvbl9yZWFkX2ZiX2xvY2F0aW9uKGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdik7CiAKIGV4dGVybiB2b2lkIHJhZGVvbl9mcmVlbGlzdF9yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqIGRldik7CiBleHRlcm4gc3RydWN0IGRybV9idWYgKnJhZGVvbl9mcmVlbGlzdF9nZXQoc3RydWN0IGRybV9kZXZpY2UgKiBkZXYpOwpAQCAtMzgyLDcgKzM5NSw3IEBACiAJCQkJdW5zaWduZWQgbG9uZyBhcmcpOwogCiAvKiByMzAwX2NtZGJ1Zi5jICovCi1leHRlcm4gdm9pZCByMzAwX2luaXRfcmVnX2ZsYWdzKHZvaWQpOworZXh0ZXJuIHZvaWQgcjMwMF9pbml0X3JlZ19mbGFncyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogZXh0ZXJuIGludCByMzAwX2RvX2NwX2NtZGJ1ZihzdHJ1Y3QgZHJtX2RldmljZSAqIGRldiwKIAkJCSAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCkBAIC00MjksNyArNDQyLDcgQEAKICNkZWZpbmUgUkFERU9OX1BDSUVfSU5ERVggICAgICAgICAgICAgICAweDAwMzAKICNkZWZpbmUgUkFERU9OX1BDSUVfREFUQSAgICAgICAgICAgICAgICAweDAwMzQKICNkZWZpbmUgUkFERU9OX1BDSUVfVFhfR0FSVF9DTlRMCTB4MTAKLSMJZGVmaW5lIFJBREVPTl9QQ0lFX1RYX0dBUlRfRU4gICAJKDEgPDwgMCkKKyMJZGVmaW5lIFJBREVPTl9QQ0lFX1RYX0dBUlRfRU4JCSgxIDw8IDApCiAjCWRlZmluZSBSQURFT05fUENJRV9UWF9HQVJUX1VOTUFQUEVEX0FDQ0VTU19QQVNTX1RIUlUgKDA8PDEpCiAjCWRlZmluZSBSQURFT05fUENJRV9UWF9HQVJUX1VOTUFQUEVEX0FDQ0VTU19DTEFNUF9MTyAgKDE8PDEpCiAjCWRlZmluZSBSQURFT05fUENJRV9UWF9HQVJUX1VOTUFQUEVEX0FDQ0VTU19ESVNDQVJEICAgKDM8PDEpCkBAIC00MzksNyArNDUyLDcgQEAKICMJZGVmaW5lIFJBREVPTl9QQ0lFX1RYX0dBUlRfSU5WQUxJREFURV9UTEIJKDE8PDgpCiAjZGVmaW5lIFJBREVPTl9QQ0lFX1RYX0RJU0NBUkRfUkRfQUREUl9MTyAweDExCiAjZGVmaW5lIFJBREVPTl9QQ0lFX1RYX0RJU0NBUkRfUkRfQUREUl9ISSAweDEyCi0jZGVmaW5lIFJBREVPTl9QQ0lFX1RYX0dBUlRfQkFTRSAgCTB4MTMKKyNkZWZpbmUgUkFERU9OX1BDSUVfVFhfR0FSVF9CQVNFCTB4MTMKICNkZWZpbmUgUkFERU9OX1BDSUVfVFhfR0FSVF9TVEFSVF9MTwkweDE0CiAjZGVmaW5lIFJBREVPTl9QQ0lFX1RYX0dBUlRfU1RBUlRfSEkJMHgxNQogI2RlZmluZSBSQURFT05fUENJRV9UWF9HQVJUX0VORF9MTwkweDE2CkBAIC00NTQsNiArNDY3LDE2IEBACiAjZGVmaW5lIFJBREVPTl9JR1BHQVJUX0VOQUJMRSAgICAgICAgICAgMHgzOAogI2RlZmluZSBSQURFT05fSUdQR0FSVF9VTktfMzkgICAgICAgICAgIDB4MzkKIAorI2RlZmluZSBSNTIwX01DX0lORF9JTkRFWCAweDcwCisjZGVmaW5lIFI1MjBfTUNfSU5EX1dSX0VOICgxPDwyNCkKKyNkZWZpbmUgUjUyMF9NQ19JTkRfREFUQSAgMHg3NAorCisjZGVmaW5lIFJWNTE1X01DX0ZCX0xPQ0FUSU9OIDB4MDEKKyNkZWZpbmUgUlY1MTVfTUNfQUdQX0xPQ0FUSU9OIDB4MDIKKworI2RlZmluZSBSNTIwX01DX0ZCX0xPQ0FUSU9OIDB4MDQKKyNkZWZpbmUgUjUyMF9NQ19BR1BfTE9DQVRJT04gMHgwNQorCiAjZGVmaW5lIFJBREVPTl9NUFBfVEJfQ09ORklHCQkweDAxYzAKICNkZWZpbmUgUkFERU9OX01FTV9DTlRMCQkJMHgwMTQwCiAjZGVmaW5lIFJBREVPTl9NRU1fU0RSQU1fTU9ERV9SRUcJMHgwMTU4CkBAIC01MTIsMTIgKzUzNSwxMiBAQAogCiAjZGVmaW5lIFJBREVPTl9HRU5fSU5UX1NUQVRVUwkJMHgwMDQ0CiAjCWRlZmluZSBSQURFT05fQ1JUQ19WQkxBTktfU1RBVAkJKDEgPDwgMCkKLSMJZGVmaW5lIFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUX0FDSyAgIAkoMSA8PCAwKQorIwlkZWZpbmUgUkFERU9OX0NSVENfVkJMQU5LX1NUQVRfQUNLCSgxIDw8IDApCiAjCWRlZmluZSBSQURFT05fQ1JUQzJfVkJMQU5LX1NUQVQJCSgxIDw8IDkpCi0jCWRlZmluZSBSQURFT05fQ1JUQzJfVkJMQU5LX1NUQVRfQUNLICAgCSgxIDw8IDkpCisjCWRlZmluZSBSQURFT05fQ1JUQzJfVkJMQU5LX1NUQVRfQUNLCSgxIDw8IDkpCiAjCWRlZmluZSBSQURFT05fR1VJX0lETEVfSU5UX1RFU1RfQUNLICAgICAoMSA8PCAxOSkKICMJZGVmaW5lIFJBREVPTl9TV19JTlRfVEVTVAkJKDEgPDwgMjUpCi0jCWRlZmluZSBSQURFT05fU1dfSU5UX1RFU1RfQUNLICAgCSgxIDw8IDI1KQorIwlkZWZpbmUgUkFERU9OX1NXX0lOVF9URVNUX0FDSwkJKDEgPDwgMjUpCiAjCWRlZmluZSBSQURFT05fU1dfSU5UX0ZJUkUJCSgxIDw8IDI2KQogCiAjZGVmaW5lIFJBREVPTl9IT1NUX1BBVEhfQ05UTAkJMHgwMTMwCkBAIC02MTUsOSArNjM4LDUxIEBACiAjCWRlZmluZSBSQURFT05fU09GVF9SRVNFVF9FMgkJKDEgPDwgIDUpCiAjCWRlZmluZSBSQURFT05fU09GVF9SRVNFVF9SQgkJKDEgPDwgIDYpCiAjCWRlZmluZSBSQURFT05fU09GVF9SRVNFVF9IRFAJCSgxIDw8ICA3KQorLyoKKyAqICAgNjowICBBdmFpbGFibGUgc2xvdHMgaW4gdGhlIEZJRk8KKyAqICAgOCAgICBIb3N0IEludGVyZmFjZSBhY3RpdmUKKyAqICAgOSAgICBDUCByZXF1ZXN0IGFjdGl2ZQorICogICAxMCAgIEZJRk8gcmVxdWVzdCBhY3RpdmUKKyAqICAgMTEgICBIb3N0IEludGVyZmFjZSByZXRyeSBhY3RpdmUKKyAqICAgMTIgICBDUCByZXRyeSBhY3RpdmUKKyAqICAgMTMgICBGSUZPIHJldHJ5IGFjdGl2ZQorICogICAxNCAgIEZJRk8gcGlwZWxpbmUgYnVzeQorICogICAxNSAgIEV2ZW50IGVuZ2luZSBidXN5CisgKiAgIDE2ICAgQ1AgY29tbWFuZCBzdHJlYW0gYnVzeQorICogICAxNyAgIDJEIGVuZ2luZSBidXN5CisgKiAgIDE4ICAgMkQgcG9ydGlvbiBvZiByZW5kZXIgYmFja2VuZCBidXN5CisgKiAgIDIwICAgM0Qgc2V0dXAgZW5naW5lIGJ1c3kKKyAqICAgMjYgICBHQSBlbmdpbmUgYnVzeQorICogICAyNyAgIENCQSAyRCBlbmdpbmUgYnVzeQorICogICAzMSAgIDJEIGVuZ2luZSBidXN5IG9yIDNEIGVuZ2luZSBidXN5IG9yIEZJRk8gbm90IGVtcHR5IG9yIENQIGJ1c3kgb3IKKyAqICAgICAgICAgICBjb21tYW5kIHN0cmVhbSBxdWV1ZSBub3QgZW1wdHkgb3IgUmluZyBCdWZmZXIgbm90IGVtcHR5CisgKi8KICNkZWZpbmUgUkFERU9OX1JCQk1fU1RBVFVTCQkweDBlNDAKKy8qIFNhbWUgYXMgdGhlIHByZXZpb3VzIFJBREVPTl9SQkJNX1NUQVRVUzsgdGhpcyBpcyBhIG1pcnJvciBvZiB0aGF0IHJlZ2lzdGVyLiAgKi8KKy8qICNkZWZpbmUgUkFERU9OX1JCQk1fU1RBVFVTCQkweDE3NDAgKi8KKy8qIGJpdHMgNjowIGFyZSBkd29yZCBzbG90cyBhdmFpbGFibGUgaW4gdGhlIGNtZCBmaWZvICovCiAjCWRlZmluZSBSQURFT05fUkJCTV9GSUZPQ05UX01BU0sJCTB4MDA3ZgotIwlkZWZpbmUgUkFERU9OX1JCQk1fQUNUSVZFCQkoMSA8PCAzMSkKKyMJZGVmaW5lIFJBREVPTl9ISVJRX09OX1JCQgkoMSA8PCAgOCkKKyMJZGVmaW5lIFJBREVPTl9DUFJRX09OX1JCQgkoMSA8PCAgOSkKKyMJZGVmaW5lIFJBREVPTl9DRlJRX09OX1JCQgkoMSA8PCAxMCkKKyMJZGVmaW5lIFJBREVPTl9ISVJRX0lOX1JUQlVGCSgxIDw8IDExKQorIwlkZWZpbmUgUkFERU9OX0NQUlFfSU5fUlRCVUYJKDEgPDwgMTIpCisjCWRlZmluZSBSQURFT05fQ0ZSUV9JTl9SVEJVRgkoMSA8PCAxMykKKyMJZGVmaW5lIFJBREVPTl9QSVBFX0JVU1kJCSgxIDw8IDE0KQorIwlkZWZpbmUgUkFERU9OX0VOR19FVl9CVVNZCSgxIDw8IDE1KQorIwlkZWZpbmUgUkFERU9OX0NQX0NNRFNUUk1fQlVTWQkoMSA8PCAxNikKKyMJZGVmaW5lIFJBREVPTl9FMl9CVVNZCQkoMSA8PCAxNykKKyMJZGVmaW5lIFJBREVPTl9SQjJEX0JVU1kJCSgxIDw8IDE4KQorIwlkZWZpbmUgUkFERU9OX1JCM0RfQlVTWQkJKDEgPDwgMTkpIC8qIG5vdCB1c2VkIG9uIHIzMDAgKi8KKyMJZGVmaW5lIFJBREVPTl9WQVBfQlVTWQkJKDEgPDwgMjApCisjCWRlZmluZSBSQURFT05fUkVfQlVTWQkJKDEgPDwgMjEpIC8qIG5vdCB1c2VkIG9uIHIzMDAgKi8KKyMJZGVmaW5lIFJBREVPTl9UQU1fQlVTWQkJKDEgPDwgMjIpIC8qIG5vdCB1c2VkIG9uIHIzMDAgKi8KKyMJZGVmaW5lIFJBREVPTl9URE1fQlVTWQkJKDEgPDwgMjMpIC8qIG5vdCB1c2VkIG9uIHIzMDAgKi8KKyMJZGVmaW5lIFJBREVPTl9QQl9CVVNZCQkoMSA8PCAyNCkgLyogbm90IHVzZWQgb24gcjMwMCAqLworIwlkZWZpbmUgUkFERU9OX1RJTV9CVVNZCQkoMSA8PCAyNSkgLyogbm90IHVzZWQgb24gcjMwMCAqLworIwlkZWZpbmUgUkFERU9OX0dBX0JVU1kJCSgxIDw8IDI2KQorIwlkZWZpbmUgUkFERU9OX0NCQTJEX0JVU1kJKDEgPDwgMjcpCisjCWRlZmluZSBSQURFT05fUkJCTV9BQ1RJVkUJKDEgPDwgMzEpCiAjZGVmaW5lIFJBREVPTl9SRV9MSU5FX1BBVFRFUk4JCTB4MWNkMAogI2RlZmluZSBSQURFT05fUkVfTUlTQwkJCTB4MjZjNAogI2RlZmluZSBSQURFT05fUkVfVE9QX0xFRlQJCTB4MjZjMApAQCAtMTAwNCw2ICsxMDY5LDEzIEBACiAJUkFERU9OX1dSSVRFKCBSQURFT05fUENJRV9EQVRBLCAodmFsKSApOwkJCVwKIH0gd2hpbGUgKDApCiAKKyNkZWZpbmUgUkFERU9OX1dSSVRFX01DSU5EKCBhZGRyLCB2YWwgKQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJUkFERU9OX1dSSVRFKFI1MjBfTUNfSU5EX0lOREVYLCAweGZmMDAwMCB8ICgoYWRkcikgJiAweGZmKSk7CVwKKwkJUkFERU9OX1dSSVRFKFI1MjBfTUNfSU5EX0RBVEEsICh2YWwpKTsJCQlcCisJCVJBREVPTl9XUklURShSNTIwX01DX0lORF9JTkRFWCwgMCk7CVwKKwl9IHdoaWxlICgwKQorCiAjZGVmaW5lIENQX1BBQ0tFVDAoIHJlZywgbiApCQkJCQkJXAogCShSQURFT05fQ1BfUEFDS0VUMCB8ICgobikgPDwgMTYpIHwgKChyZWcpID4+IDIpKQogI2RlZmluZSBDUF9QQUNLRVQwX1RBQkxFKCByZWcsIG4gKQkJCQkJXApAQCAtMTExNCw4ICsxMTg2LDcgQEAKIAogI2RlZmluZSBCRUdJTl9SSU5HKCBuICkgZG8gewkJCQkJCVwKIAlpZiAoIFJBREVPTl9WRVJCT1NFICkgewkJCQkJCVwKLQkJRFJNX0lORk8oICJCRUdJTl9SSU5HKCAlZCApIGluICVzXG4iLAkJCVwKLQkJCSAgIG4sIF9fRlVOQ1RJT05fXyApOwkJCQlcCisJCURSTV9JTkZPKCAiQkVHSU5fUklORyggJWQgKVxuIiwgKG4pKTsJCQlcCiAJfQkJCQkJCQkJXAogCWlmICggZGV2X3ByaXYtPnJpbmcuc3BhY2UgPD0gKG4pICogc2l6ZW9mKHUzMikgKSB7CQlcCiAgICAgICAgICAgICAgICAgQ09NTUlUX1JJTkcoKTsJCQkJCQlcCkBAIC0xMTMzLDcgKzEyMDQsNyBAQAogCQkJICB3cml0ZSwgZGV2X3ByaXYtPnJpbmcudGFpbCApOwkJCVwKIAl9CQkJCQkJCQlcCiAJaWYgKCgoZGV2X3ByaXYtPnJpbmcudGFpbCArIF9ucikgJiBtYXNrKSAhPSB3cml0ZSkgewkJXAotCQlEUk1fRVJST1IoIAkJCQkJCVwKKwkJRFJNX0VSUk9SKAkJCQkJCVwKIAkJCSJBRFZBTkNFX1JJTkcoKTogbWlzbWF0Y2g6IG5yOiAleCB3cml0ZTogJXggbGluZTogJWRcbiIsCVwKIAkJCSgoZGV2X3ByaXYtPnJpbmcudGFpbCArIF9ucikgJiBtYXNrKSwJCVwKIAkJCXdyaXRlLCBfX0xJTkVfXyk7CQkJCQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25faXJxLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9pcnEuYwppbmRleCA4NGY1YmMzLi4wMDlhZjM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9pcnEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9pcnEuYwpAQCAtMTU0LDcgKzE1NCw3IEBACiAJaW50IGFjayA9IDA7CiAJYXRvbWljX3QgKmNvdW50ZXI7CiAJaWYgKCFkZXZfcHJpdikgewotCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEUk1fRVJST1IoImNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMDUsNyArMjA1LDcgQEAKIAlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxlX3ByaXYpOwogCiAJaWYgKCFkZXZfcHJpdikgewotCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEUk1fRVJST1IoImNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMjcsNyArMjI3LDcgQEAKIAlkcm1fcmFkZW9uX2lycV93YWl0X3QgKmlycXdhaXQgPSBkYXRhOwogCiAJaWYgKCFkZXZfcHJpdikgewotCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEUk1fRVJST1IoImNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9tZW0uYyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX21lbS5jCmluZGV4IGEyOWFjZmUuLjc4YjM0ZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX21lbS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX21lbS5jCkBAIC0yMjQsNyArMjI0LDcgQEAKIAlzdHJ1Y3QgbWVtX2Jsb2NrICpibG9jaywgKipoZWFwOwogCiAJaWYgKCFkZXZfcHJpdikgewotCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEUk1fRVJST1IoImNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yNTksNyArMjU5LDcgQEAKIAlzdHJ1Y3QgbWVtX2Jsb2NrICpibG9jaywgKipoZWFwOwogCiAJaWYgKCFkZXZfcHJpdikgewotCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEUk1fRVJST1IoImNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yODUsNyArMjg1LDcgQEAKIAlzdHJ1Y3QgbWVtX2Jsb2NrICoqaGVhcDsKIAogCWlmICghZGV2X3ByaXYpIHsKLQkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJRFJNX0VSUk9SKCJjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fc3RhdGUuYyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX3N0YXRlLmMKaW5kZXggZjgyNGYyZjUuLjZmNzU1MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX3N0YXRlLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fc3RhdGUuYwpAQCAtODk4LDcgKzg5OCw3IEBACiAJCQlpbnQgdyA9IHBib3hbaV0ueDIgLSB4OwogCQkJaW50IGggPSBwYm94W2ldLnkyIC0geTsKIAotCQkJRFJNX0RFQlVHKCJkaXNwYXRjaCBjbGVhciAlZCwlZC0lZCwlZCBmbGFncyAweCV4XG4iLAorCQkJRFJNX0RFQlVHKCIlZCwlZC0lZCwlZCBmbGFncyAweCV4XG4iLAogCQkJCSAgeCwgeSwgdywgaCwgZmxhZ3MpOwogCiAJCQlpZiAoZmxhZ3MgJiBSQURFT05fRlJPTlQpIHsKQEAgLTEzNjgsNyArMTM2OCw3IEBACiAJCWludCB3ID0gcGJveFtpXS54MiAtIHg7CiAJCWludCBoID0gcGJveFtpXS55MiAtIHk7CiAKLQkJRFJNX0RFQlVHKCJkaXNwYXRjaCBzd2FwICVkLCVkLSVkLCVkXG4iLCB4LCB5LCB3LCBoKTsKKwkJRFJNX0RFQlVHKCIlZCwlZC0lZCwlZFxuIiwgeCwgeSwgdywgaCk7CiAKIAkJQkVHSU5fUklORyg5KTsKIApAQCAtMTQyMiw4ICsxNDIyLDcgQEAKIAlpbnQgb2Zmc2V0ID0gKGRldl9wcml2LT5zYXJlYV9wcml2LT5wZkN1cnJlbnRQYWdlID09IDEpCiAJICAgID8gZGV2X3ByaXYtPmZyb250X29mZnNldCA6IGRldl9wcml2LT5iYWNrX29mZnNldDsKIAlSSU5HX0xPQ0FMUzsKLQlEUk1fREVCVUcoIiVzOiBwZkN1cnJlbnRQYWdlPSVkXG4iLAotCQkgIF9fRlVOQ1RJT05fXywKKwlEUk1fREVCVUcoInBmQ3VycmVudFBhZ2U9JWRcbiIsCiAJCSAgZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmQ3VycmVudFBhZ2UpOwogCiAJLyogRG8gc29tZSB0cml2aWFsIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcuLi4KQEAgLTE1NjIsNyArMTU2MSw3IEBACiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKLQlEUk1fREVCVUcoImluZGlyZWN0OiBidWY9JWQgcz0weCV4IGU9MHgleFxuIiwgYnVmLT5pZHgsIHN0YXJ0LCBlbmQpOworCURSTV9ERUJVRygiYnVmPSVkIHM9MHgleCBlPTB4JXhcbiIsIGJ1Zi0+aWR4LCBzdGFydCwgZW5kKTsKIAogCWlmIChzdGFydCAhPSBlbmQpIHsKIAkJaW50IG9mZnNldCA9IChkZXZfcHJpdi0+Z2FydF9idWZmZXJzX29mZnNldApAQCAtMTc1OCw3ICsxNzU3LDcgQEAKIAkJCWJ1ZiA9IHJhZGVvbl9mcmVlbGlzdF9nZXQoZGV2KTsKIAkJfQogCQlpZiAoIWJ1ZikgewotCQkJRFJNX0RFQlVHKCJyYWRlb25fY3BfZGlzcGF0Y2hfdGV4dHVyZTogRUFHQUlOXG4iKTsKKwkJCURSTV9ERUJVRygiRUFHQUlOXG4iKTsKIAkJCWlmIChEUk1fQ09QWV9UT19VU0VSKHRleC0+aW1hZ2UsIGltYWdlLCBzaXplb2YoKmltYWdlKSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQlyZXR1cm4gLUVBR0FJTjsKQEAgLTI0MTMsNyArMjQxMiw3IEBACiAKIAlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxlX3ByaXYpOwogCi0JRFJNX0RFQlVHKCJpbmRpcmVjdDogaWR4PSVkIHM9JWQgZT0lZCBkPSVkXG4iLAorCURSTV9ERUJVRygiaWR4PSVkIHM9JWQgZT0lZCBkPSVkXG4iLAogCQkgIGluZGlyZWN0LT5pZHgsIGluZGlyZWN0LT5zdGFydCwgaW5kaXJlY3QtPmVuZCwKIAkJICBpbmRpcmVjdC0+ZGlzY2FyZCk7CiAKQEAgLTI3NzksNyArMjc3OCw3IEBACiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKIAotCURSTV9ERUJVRygiJXM6ICV4XG4iLCBfX0ZVTkNUSU9OX18sIGZsYWdzKTsKKwlEUk1fREVCVUcoIiV4XG4iLCBmbGFncyk7CiAJc3dpdGNoIChmbGFncykgewogCWNhc2UgUkFERU9OX1dBSVRfMkQ6CiAJCUJFR0lOX1JJTkcoMik7CkBAIC0zMDM1LDYgKzMwMzQsOSBAQAogCWNhc2UgUkFERU9OX1BBUkFNX1ZCTEFOS19DUlRDOgogCQl2YWx1ZSA9IHJhZGVvbl92YmxhbmtfY3J0Y19nZXQoZGV2KTsKIAkJYnJlYWs7CisJY2FzZSBSQURFT05fUEFSQU1fRkJfTE9DQVRJT046CisJCXZhbHVlID0gcmFkZW9uX3JlYWRfZmJfbG9jYXRpb24oZGV2X3ByaXYpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlEUk1fREVCVUcoIkludmFsaWQgcGFyYW1ldGVyICVkXG4iLCBwYXJhbS0+cGFyYW0pOwogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX3N0YXRlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3NhdmFnZV9zdGF0ZS5jCmluZGV4IGJmOGUwZTEuLjVmNjIzOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vc2F2YWdlX3N0YXRlLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9zYXZhZ2Vfc3RhdGUuYwpAQCAtNTEyLDcgKzUxMiw3IEBACiAJCQlETUFfRFJBV19QUklNSVRJVkUoY291bnQsIHByaW0sIHNraXApOwogCiAJCQlpZiAodmJfc3RyaWRlID09IHZ0eF9zaXplKSB7Ci0JCQkJRE1BX0NPUFkoJnZ0eGJ1Zlt2Yl9zdHJpZGUgKiBzdGFydF0sIAorCQkJCURNQV9DT1BZKCZ2dHhidWZbdmJfc3RyaWRlICogc3RhcnRdLAogCQkJCQkgdnR4X3NpemUgKiBjb3VudCk7CiAJCQl9IGVsc2UgewogCQkJCWZvciAoaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBjb3VudDsgKytpKSB7CkBAIC03NDIsNyArNzQyLDcgQEAKIAl3aGlsZSAobiAhPSAwKSB7CiAJCS8qIENhbiBlbWl0IHVwIHRvIDI1NSB2ZXJ0aWNlcyAoODUgdHJpYW5nbGVzKSBhdCBvbmNlLiAqLwogCQl1bnNpZ25lZCBpbnQgY291bnQgPSBuID4gMjU1ID8gMjU1IDogbjsKLQkJCisKIAkJLyogQ2hlY2sgaW5kaWNlcyAqLwogCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewogCQkJaWYgKGlkeFtpXSA+IHZiX3NpemUgLyAodmJfc3RyaWRlICogNCkpIHsKQEAgLTkzMyw3ICs5MzMsNyBAQAogCQkJCS8qIGogd2FzIGNoZWNrIGluIHNhdmFnZV9iY2lfY21kYnVmICovCiAJCQkJcmV0ID0gc2F2YWdlX2Rpc3BhdGNoX3ZiX2lkeChkZXZfcHJpdiwKIAkJCQkJJmNtZF9oZWFkZXIsIChjb25zdCB1aW50MTZfdCAqKWNtZGJ1ZiwKLQkJCQkJKGNvbnN0IHVpbnQzMl90ICopdnR4YnVmLCB2Yl9zaXplLCAKKwkJCQkJKGNvbnN0IHVpbnQzMl90ICopdnR4YnVmLCB2Yl9zaXplLAogCQkJCQl2Yl9zdHJpZGUpOwogCQkJCWNtZGJ1ZiArPSBqOwogCQkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9zaXNfbW0uYyBiL2RyaXZlcnMvY2hhci9kcm0vc2lzX21tLmMKaW5kZXggYTZiN2NjZC4uYjM4Nzg3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9zaXNfbW0uYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3Npc19tbS5jCkBAIC0xMTUsNyArMTE1LDcgQEAKIAlkZXZfcHJpdi0+dnJhbV9vZmZzZXQgPSBmYi0+b2Zmc2V0OwogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JRFJNX0RFQlVHKCJvZmZzZXQgPSAldSwgc2l6ZSA9ICV1IiwgZmItPm9mZnNldCwgZmItPnNpemUpOworCURSTV9ERUJVRygib2Zmc2V0ID0gJXUsIHNpemUgPSAldVxuIiwgZmItPm9mZnNldCwgZmItPnNpemUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMDUsNyArMjA1LDcgQEAKIAlkZXZfcHJpdi0+YWdwX29mZnNldCA9IGFncC0+b2Zmc2V0OwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwogCi0JRFJNX0RFQlVHKCJvZmZzZXQgPSAldSwgc2l6ZSA9ICV1IiwgYWdwLT5vZmZzZXQsIGFncC0+c2l6ZSk7CisJRFJNX0RFQlVHKCJvZmZzZXQgPSAldSwgc2l6ZSA9ICV1XG4iLCBhZ3AtPm9mZnNldCwgYWdwLT5zaXplKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQ5LDcgKzI0OSw3IEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KLQkKKwogCS8qCiAJICogSW1wbGVtZW50IGEgZGV2aWNlIHN3aXRjaCBoZXJlIGlmIG5lZWRlZAogCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWEuYwppbmRleCA3MDA5ZGJkLi45NGJhZWM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWEuYwpAQCAtMTc5LDE0ICsxNzksMTIgQEAKIAl9CiAKIAlpZiAoZGV2X3ByaXYtPnJpbmcudmlydHVhbF9zdGFydCAhPSBOVUxMKSB7Ci0JCURSTV9FUlJPUigiJXMgY2FsbGVkIGFnYWluIHdpdGhvdXQgY2FsbGluZyBjbGVhbnVwXG4iLAotCQkJICBfX0ZVTkNUSU9OX18pOworCQlEUk1fRVJST1IoImNhbGxlZCBhZ2FpbiB3aXRob3V0IGNhbGxpbmcgY2xlYW51cFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAogCWlmICghZGV2LT5hZ3AgfHwgIWRldi0+YWdwLT5iYXNlKSB7Ci0JCURSTV9FUlJPUigiJXMgY2FsbGVkIHdpdGggbm8gYWdwIG1lbW9yeSBhdmFpbGFibGVcbiIsCi0JCQkgIF9fRlVOQ1RJT05fXyk7CisJCURSTV9FUlJPUigiY2FsbGVkIHdpdGggbm8gYWdwIG1lbW9yeSBhdmFpbGFibGVcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKQEAgLTI2Nyw4ICsyNjUsNyBAQAogCWRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAKIAlpZiAoZGV2X3ByaXYtPnJpbmcudmlydHVhbF9zdGFydCA9PSBOVUxMKSB7Ci0JCURSTV9FUlJPUigiJXMgY2FsbGVkIHdpdGhvdXQgaW5pdGlhbGl6aW5nIEFHUCByaW5nIGJ1ZmZlci5cbiIsCi0JCQkgIF9fRlVOQ1RJT05fXyk7CisJCURSTV9FUlJPUigiY2FsbGVkIHdpdGhvdXQgaW5pdGlhbGl6aW5nIEFHUCByaW5nIGJ1ZmZlci5cbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKQEAgLTMzNyw4ICszMzQsNyBAQAogCiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlsZV9wcml2KTsKIAotCURSTV9ERUJVRygidmlhIGNtZGJ1ZmZlciwgYnVmICVwIHNpemUgJWx1XG4iLCBjbWRidWYtPmJ1ZiwKLQkJICBjbWRidWYtPnNpemUpOworCURSTV9ERUJVRygiYnVmICVwIHNpemUgJWx1XG4iLCBjbWRidWYtPmJ1ZiwgY21kYnVmLT5zaXplKTsKIAogCXJldCA9IHZpYV9kaXNwYXRjaF9jbWRidWZmZXIoZGV2LCBjbWRidWYpOwogCWlmIChyZXQpIHsKQEAgLTM3OSw4ICszNzUsNyBAQAogCiAJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlsZV9wcml2KTsKIAotCURSTV9ERUJVRygidmlhX3BjaV9jbWRidWZmZXIsIGJ1ZiAlcCBzaXplICVsdVxuIiwgY21kYnVmLT5idWYsCi0JCSAgY21kYnVmLT5zaXplKTsKKwlEUk1fREVCVUcoImJ1ZiAlcCBzaXplICVsdVxuIiwgY21kYnVmLT5idWYsIGNtZGJ1Zi0+c2l6ZSk7CiAKIAlyZXQgPSB2aWFfZGlzcGF0Y2hfcGNpX2NtZGJ1ZmZlcihkZXYsIGNtZGJ1Zik7CiAJaWYgKHJldCkgewpAQCAtNjQ4LDE0ICs2NDMsMTMgQEAKIAl1aW50MzJfdCB0bXBfc2l6ZSwgY291bnQ7CiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2OwogCi0JRFJNX0RFQlVHKCJ2aWEgY21kYnVmX3NpemVcbiIpOworCURSTV9ERUJVRygiXG4iKTsKIAlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxlX3ByaXYpOwogCiAJZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAogCWlmIChkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0ID09IE5VTEwpIHsKLQkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aG91dCBpbml0aWFsaXppbmcgQUdQIHJpbmcgYnVmZmVyLlxuIiwKLQkJCSAgX19GVU5DVElPTl9fKTsKKwkJRFJNX0VSUk9SKCJjYWxsZWQgd2l0aG91dCBpbml0aWFsaXppbmcgQUdQIHJpbmcgYnVmZmVyLlxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hYmxpdC5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hYmxpdC5jCmluZGV4IGM2ZmQxNmYuLjMzYzUxOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYWJsaXQuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWFibGl0LmMKQEAgLTEsNSArMSw1IEBACiAvKiB2aWFfZG1hYmxpdC5jIC0tIFBDSSBETUEgQml0Qmx0IHN1cHBvcnQgZm9yIHRoZSBWSUEgVW5pY2hyb21lL1BybwotICogCisgKgogICogQ29weXJpZ2h0IChDKSAyMDA1IFRob21hcyBIZWxsc3Ryb20sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKQEAgLTE2LDIyICsxNiwyMiBAQAogICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKICAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAogICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMsIEFVVEhPUlMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIAotICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIAotICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSAKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQogICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICAqCi0gKiBBdXRob3JzOiAKKyAqIEF1dGhvcnM6CiAgKiAgICBUaG9tYXMgSGVsbHN0cm9tLgogICogICAgUGFydGlhbGx5IGJhc2VkIG9uIGNvZGUgb2J0YWluZWQgZnJvbSBEaWdlbyBJbmMuCiAgKi8KIAogCiAvKgotICogVW5tYXBzIHRoZSBETUEgbWFwcGluZ3MuIAotICogRklYTUU6IElzIHRoaXMgYSBOb09wIG9uIHg4Nj8gQWxzbyAKLSAqIEZJWE1FOiBXaGF0IGhhcHBlbnMgaWYgdGhpcyBvbmUgaXMgY2FsbGVkIGFuZCBhIHBlbmRpbmcgYmxpdCBoYXMgcHJldmlvdXNseSBkb25lIAotICogdGhlIHNhbWUgRE1BIG1hcHBpbmdzPyAKKyAqIFVubWFwcyB0aGUgRE1BIG1hcHBpbmdzLgorICogRklYTUU6IElzIHRoaXMgYSBOb09wIG9uIHg4Nj8gQWxzbworICogRklYTUU6IFdoYXQgaGFwcGVucyBpZiB0aGlzIG9uZSBpcyBjYWxsZWQgYW5kIGEgcGVuZGluZyBibGl0IGhhcyBwcmV2aW91c2x5IGRvbmUKKyAqIHRoZSBzYW1lIERNQSBtYXBwaW5ncz8KICAqLwogCiAjaW5jbHVkZSAiZHJtUC5oIgpAQCAtNjUsNyArNjUsNyBAQAogCWludCBudW1fZGVzYyA9IHZzZy0+bnVtX2Rlc2M7CiAJdW5zaWduZWQgY3VyX2Rlc2NyaXB0b3JfcGFnZSA9IG51bV9kZXNjIC8gdnNnLT5kZXNjcmlwdG9yc19wZXJfcGFnZTsKIAl1bnNpZ25lZCBkZXNjcmlwdG9yX3RoaXNfcGFnZSA9IG51bV9kZXNjICUgdnNnLT5kZXNjcmlwdG9yc19wZXJfcGFnZTsKLQlkcm1fdmlhX2Rlc2NyaXB0b3JfdCAqZGVzY19wdHIgPSB2c2ctPmRlc2NfcGFnZXNbY3VyX2Rlc2NyaXB0b3JfcGFnZV0gKyAKKwlkcm1fdmlhX2Rlc2NyaXB0b3JfdCAqZGVzY19wdHIgPSB2c2ctPmRlc2NfcGFnZXNbY3VyX2Rlc2NyaXB0b3JfcGFnZV0gKwogCQlkZXNjcmlwdG9yX3RoaXNfcGFnZTsKIAlkbWFfYWRkcl90IG5leHQgPSB2c2ctPmNoYWluX3N0YXJ0OwogCkBAIC03Myw3ICs3Myw3IEBACiAJCWlmIChkZXNjcmlwdG9yX3RoaXNfcGFnZS0tID09IDApIHsKIAkJCWN1cl9kZXNjcmlwdG9yX3BhZ2UtLTsKIAkJCWRlc2NyaXB0b3JfdGhpc19wYWdlID0gdnNnLT5kZXNjcmlwdG9yc19wZXJfcGFnZSAtIDE7Ci0JCQlkZXNjX3B0ciA9IHZzZy0+ZGVzY19wYWdlc1tjdXJfZGVzY3JpcHRvcl9wYWdlXSArIAorCQkJZGVzY19wdHIgPSB2c2ctPmRlc2NfcGFnZXNbY3VyX2Rlc2NyaXB0b3JfcGFnZV0gKwogCQkJCWRlc2NyaXB0b3JfdGhpc19wYWdlOwogCQl9CiAJCWRtYV91bm1hcF9zaW5nbGUoJnBkZXYtPmRldiwgbmV4dCwgc2l6ZW9mKCpkZXNjX3B0ciksIERNQV9UT19ERVZJQ0UpOwpAQCAtOTMsNyArOTMsNyBAQAogc3RhdGljIHZvaWQKIHZpYV9tYXBfYmxpdF9mb3JfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkgICBjb25zdCBkcm1fdmlhX2RtYWJsaXRfdCAqeGZlciwKLQkJICAgZHJtX3ZpYV9zZ19pbmZvX3QgKnZzZywgCisJCSAgIGRybV92aWFfc2dfaW5mb190ICp2c2csCiAJCSAgIGludCBtb2RlKQogewogCXVuc2lnbmVkIGN1cl9kZXNjcmlwdG9yX3BhZ2UgPSAwOwpAQCAtMTEwLDcgKzExMCw3IEBACiAJZG1hX2FkZHJfdCBuZXh0ID0gMCB8IFZJQV9ETUFfRFBSX0VDOwogCWRybV92aWFfZGVzY3JpcHRvcl90ICpkZXNjX3B0ciA9IE5VTEw7CiAKLQlpZiAobW9kZSA9PSAxKSAKKwlpZiAobW9kZSA9PSAxKQogCQlkZXNjX3B0ciA9IHZzZy0+ZGVzY19wYWdlc1tjdXJfZGVzY3JpcHRvcl9wYWdlXTsKIAogCWZvciAoY3VyX2xpbmUgPSAwOyBjdXJfbGluZSA8IHhmZXItPm51bV9saW5lczsgKytjdXJfbGluZSkgewpAQCAtMTE4LDI0ICsxMTgsMjQgQEAKIAkJbGluZV9sZW4gPSB4ZmVyLT5saW5lX2xlbmd0aDsKIAkJY3VyX2ZiID0gZmJfYWRkcjsKIAkJY3VyX21lbSA9IG1lbV9hZGRyOwotCQkKKwogCQl3aGlsZSAobGluZV9sZW4gPiAwKSB7CiAKIAkJCXJlbWFpbmluZ19sZW4gPSBtaW4oUEFHRV9TSVpFLVZJQV9QR09GRihjdXJfbWVtKSwgbGluZV9sZW4pOwogCQkJbGluZV9sZW4gLT0gcmVtYWluaW5nX2xlbjsKIAogCQkJaWYgKG1vZGUgPT0gMSkgewotCQkJCWRlc2NfcHRyLT5tZW1fYWRkciA9IAotCQkJCQlkbWFfbWFwX3BhZ2UoJnBkZXYtPmRldiwgCi0JCQkJCQkgICAgIHZzZy0+cGFnZXNbVklBX1BGTihjdXJfbWVtKSAtIAorCQkJCWRlc2NfcHRyLT5tZW1fYWRkciA9CisJCQkJCWRtYV9tYXBfcGFnZSgmcGRldi0+ZGV2LAorCQkJCQkJICAgICB2c2ctPnBhZ2VzW1ZJQV9QRk4oY3VyX21lbSkgLQogCQkJCQkJCQlWSUFfUEZOKGZpcnN0X2FkZHIpXSwKLQkJCQkJCSAgICAgVklBX1BHT0ZGKGN1cl9tZW0pLCByZW1haW5pbmdfbGVuLCAKKwkJCQkJCSAgICAgVklBX1BHT0ZGKGN1cl9tZW0pLCByZW1haW5pbmdfbGVuLAogCQkJCQkJICAgICB2c2ctPmRpcmVjdGlvbik7CiAJCQkJZGVzY19wdHItPmRldl9hZGRyID0gY3VyX2ZiOwotCQkJCQorCiAJCQkJZGVzY19wdHItPnNpemUgPSByZW1haW5pbmdfbGVuOwogCQkJCWRlc2NfcHRyLT5uZXh0ID0gKHVpbnQzMl90KSBuZXh0OwotCQkJCW5leHQgPSBkbWFfbWFwX3NpbmdsZSgmcGRldi0+ZGV2LCBkZXNjX3B0ciwgc2l6ZW9mKCpkZXNjX3B0ciksIAorCQkJCW5leHQgPSBkbWFfbWFwX3NpbmdsZSgmcGRldi0+ZGV2LCBkZXNjX3B0ciwgc2l6ZW9mKCpkZXNjX3B0ciksCiAJCQkJCQkgICAgICBETUFfVE9fREVWSUNFKTsKIAkJCQlkZXNjX3B0cisrOwogCQkJCWlmICgrK251bV9kZXNjcmlwdG9yc190aGlzX3BhZ2UgPj0gdnNnLT5kZXNjcmlwdG9yc19wZXJfcGFnZSkgewpAQCAtMTQzLDEyICsxNDMsMTIgQEAKIAkJCQkJZGVzY19wdHIgPSB2c2ctPmRlc2NfcGFnZXNbKytjdXJfZGVzY3JpcHRvcl9wYWdlXTsKIAkJCQl9CiAJCQl9Ci0JCQkKKwogCQkJbnVtX2Rlc2MrKzsKIAkJCWN1cl9tZW0gKz0gcmVtYWluaW5nX2xlbjsKIAkJCWN1cl9mYiArPSByZW1haW5pbmdfbGVuOwogCQl9Ci0JCQorCiAJCW1lbV9hZGRyICs9IHhmZXItPm1lbV9zdHJpZGU7CiAJCWZiX2FkZHIgKz0geGZlci0+ZmJfc3RyaWRlOwogCX0KQEAgLTE2MSwxNCArMTYxLDE0IEBACiB9CiAKIC8qCi0gKiBGdW5jdGlvbiB0aGF0IGZyZWVzIHVwIGFsbCByZXNvdXJjZXMgZm9yIGEgYmxpdC4gSXQgaXMgdXNhYmxlIGV2ZW4gaWYgdGhlIAorICogRnVuY3Rpb24gdGhhdCBmcmVlcyB1cCBhbGwgcmVzb3VyY2VzIGZvciBhIGJsaXQuIEl0IGlzIHVzYWJsZSBldmVuIGlmIHRoZQogICogYmxpdCBpbmZvIGhhcyBvbmx5IGJlZW4gcGFydGlhbGx5IGJ1aWx0IGFzIGxvbmcgYXMgdGhlIHN0YXR1cyBlbnVtIGlzIGNvbnNpc3RlbnQKICAqIHdpdGggdGhlIGFjdHVhbCBzdGF0dXMgb2YgdGhlIHVzZWQgcmVzb3VyY2VzLgogICovCiAKIAogc3RhdGljIHZvaWQKLXZpYV9mcmVlX3NnX2luZm8oc3RydWN0IHBjaV9kZXYgKnBkZXYsIGRybV92aWFfc2dfaW5mb190ICp2c2cpIAordmlhX2ZyZWVfc2dfaW5mbyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgZHJtX3ZpYV9zZ19pbmZvX3QgKnZzZykKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlpbnQgaTsKQEAgLTE4NSw3ICsxODUsNyBAQAogCWNhc2UgZHJfdmlhX3BhZ2VzX2xvY2tlZDoKIAkJZm9yIChpPTA7IGk8dnNnLT5udW1fcGFnZXM7ICsraSkgewogCQkJaWYgKCBOVUxMICE9IChwYWdlID0gdnNnLT5wYWdlc1tpXSkpIHsKLQkJCQlpZiAoISBQYWdlUmVzZXJ2ZWQocGFnZSkgJiYgKERNQV9GUk9NX0RFVklDRSA9PSB2c2ctPmRpcmVjdGlvbikpIAorCQkJCWlmICghIFBhZ2VSZXNlcnZlZChwYWdlKSAmJiAoRE1BX0ZST01fREVWSUNFID09IHZzZy0+ZGlyZWN0aW9uKSkKIAkJCQkJU2V0UGFnZURpcnR5KHBhZ2UpOwogCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJCX0KQEAgLTIwMCw3ICsyMDAsNyBAQAogCQl2c2ctPmJvdW5jZV9idWZmZXIgPSBOVUxMOwogCX0KIAl2c2ctPmZyZWVfb25fc2VxdWVuY2UgPSAwOwotfQkJCit9CiAKIC8qCiAgKiBGaXJlIGEgYmxpdCBlbmdpbmUuCkBAIC0yMTMsNyArMjEzLDcgQEAKIAogCVZJQV9XUklURShWSUFfUENJX0RNQV9NQVIwICsgZW5naW5lKjB4MTAsIDApOwogCVZJQV9XUklURShWSUFfUENJX0RNQV9EQVIwICsgZW5naW5lKjB4MTAsIDApOwotCVZJQV9XUklURShWSUFfUENJX0RNQV9DU1IwICsgZW5naW5lKjB4MDQsIFZJQV9ETUFfQ1NSX0REIHwgVklBX0RNQV9DU1JfVEQgfCAKKwlWSUFfV1JJVEUoVklBX1BDSV9ETUFfQ1NSMCArIGVuZ2luZSoweDA0LCBWSUFfRE1BX0NTUl9ERCB8IFZJQV9ETUFfQ1NSX1REIHwKIAkJICBWSUFfRE1BX0NTUl9ERSk7CiAJVklBX1dSSVRFKFZJQV9QQ0lfRE1BX01SMCAgKyBlbmdpbmUqMHgwNCwgVklBX0RNQV9NUl9DTSB8IFZJQV9ETUFfTVJfVERJRSk7CiAJVklBX1dSSVRFKFZJQV9QQ0lfRE1BX0JDUjAgKyBlbmdpbmUqMHgxMCwgMCk7CkBAIC0yMzMsOSArMjMzLDkgQEAKIHsKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGxvbmcgZmlyc3RfcGZuID0gVklBX1BGTih4ZmVyLT5tZW1fYWRkcik7Ci0JdnNnLT5udW1fcGFnZXMgPSBWSUFfUEZOKHhmZXItPm1lbV9hZGRyICsgKHhmZXItPm51bV9saW5lcyAqIHhmZXItPm1lbV9zdHJpZGUgLTEpKSAtIAorCXZzZy0+bnVtX3BhZ2VzID0gVklBX1BGTih4ZmVyLT5tZW1fYWRkciArICh4ZmVyLT5udW1fbGluZXMgKiB4ZmVyLT5tZW1fc3RyaWRlIC0xKSkgLQogCQlmaXJzdF9wZm4gKyAxOwotCQorCiAJaWYgKE5VTEwgPT0gKHZzZy0+cGFnZXMgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgcGFnZSAqKSAqIHZzZy0+bnVtX3BhZ2VzKSkpCiAJCXJldHVybiAtRU5PTUVNOwogCW1lbXNldCh2c2ctPnBhZ2VzLCAwLCBzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiB2c2ctPm51bV9wYWdlcyk7CkBAIC0yNDgsNyArMjQ4LDcgQEAKIAogCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAJaWYgKHJldCAhPSB2c2ctPm51bV9wYWdlcykgewotCQlpZiAocmV0IDwgMCkgCisJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAkJdnNnLT5zdGF0ZSA9IGRyX3ZpYV9wYWdlc19sb2NrZWQ7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjY0LDIxICsyNjQsMjEgQEAKICAqIHF1aXRlIGxhcmdlIGZvciBzb21lIGJsaXRzLCBhbmQgcGFnZXMgZG9uJ3QgbmVlZCB0byBiZSBjb250aW5nb3VzLgogICovCiAKLXN0YXRpYyBpbnQgCitzdGF0aWMgaW50CiB2aWFfYWxsb2NfZGVzY19wYWdlcyhkcm1fdmlhX3NnX2luZm9fdCAqdnNnKQogewogCWludCBpOwotCQorCiAJdnNnLT5kZXNjcmlwdG9yc19wZXJfcGFnZSA9IFBBR0VfU0laRSAvIHNpemVvZiggZHJtX3ZpYV9kZXNjcmlwdG9yX3QpOwotCXZzZy0+bnVtX2Rlc2NfcGFnZXMgPSAodnNnLT5udW1fZGVzYyArIHZzZy0+ZGVzY3JpcHRvcnNfcGVyX3BhZ2UgLSAxKSAvIAorCXZzZy0+bnVtX2Rlc2NfcGFnZXMgPSAodnNnLT5udW1fZGVzYyArIHZzZy0+ZGVzY3JpcHRvcnNfcGVyX3BhZ2UgLSAxKSAvCiAJCXZzZy0+ZGVzY3JpcHRvcnNfcGVyX3BhZ2U7CiAKIAlpZiAoTlVMTCA9PSAgKHZzZy0+ZGVzY19wYWdlcyA9IGtjYWxsb2ModnNnLT5udW1fZGVzY19wYWdlcywgc2l6ZW9mKHZvaWQgKiksIEdGUF9LRVJORUwpKSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JCisKIAl2c2ctPnN0YXRlID0gZHJfdmlhX2Rlc2NfcGFnZXNfYWxsb2M7CiAJZm9yIChpPTA7IGk8dnNnLT5udW1fZGVzY19wYWdlczsgKytpKSB7Ci0JCWlmIChOVUxMID09ICh2c2ctPmRlc2NfcGFnZXNbaV0gPSAKKwkJaWYgKE5VTEwgPT0gKHZzZy0+ZGVzY19wYWdlc1tpXSA9CiAJCQkgICAgIChkcm1fdmlhX2Rlc2NyaXB0b3JfdCAqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCkpKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMjg2LDcgKzI4Niw3IEBACiAJCSAgdnNnLT5udW1fZGVzYyk7CiAJcmV0dXJuIDA7CiB9Ci0JCQkKKwogc3RhdGljIHZvaWQKIHZpYV9hYm9ydF9kbWFibGl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBlbmdpbmUpCiB7CkBAIC0zMDAsNyArMzAwLDcgQEAKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOwogCi0JVklBX1dSSVRFKFZJQV9QQ0lfRE1BX0NTUjAgKyBlbmdpbmUqMHgwNCwgVklBX0RNQV9DU1JfVEQgfCBWSUFfRE1BX0NTUl9ERCk7IAorCVZJQV9XUklURShWSUFfUENJX0RNQV9DU1IwICsgZW5naW5lKjB4MDQsIFZJQV9ETUFfQ1NSX1REIHwgVklBX0RNQV9DU1JfREQpOwogfQogCiAKQEAgLTMxMSw3ICszMTEsNyBAQAogICogdGFzay4gQmFzaWNhbGx5IHRoZSB0YXNrIG9mIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBpcyB0byBzdWJtaXQgYSBuZXcgYmxpdCB0byB0aGUgZW5naW5lLCB3aGlsZQogICogdGhlIHdvcmtxdWV1ZSB0YXNrIHRha2VzIGNhcmUgb2YgcHJvY2Vzc2luZyBhc3NvY2lhdGVkIHdpdGggdGhlIG9sZCBibGl0LgogICovCi0JCQorCiB2b2lkCiB2aWFfZG1hYmxpdF9oYW5kbGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBlbmdpbmUsIGludCBmcm9tX2lycSkKIHsKQEAgLTMzMSwxOSArMzMxLDE5IEBACiAJCXNwaW5fbG9ja19pcnFzYXZlKCZibGl0cS0+YmxpdF9sb2NrLCBpcnFzYXZlKTsKIAl9CiAKLQlkb25lX3RyYW5zZmVyID0gYmxpdHEtPmlzX2FjdGl2ZSAmJiAKKwlkb25lX3RyYW5zZmVyID0gYmxpdHEtPmlzX2FjdGl2ZSAmJgogCSAgKCggc3RhdHVzID0gVklBX1JFQUQoVklBX1BDSV9ETUFfQ1NSMCArIGVuZ2luZSoweDA0KSkgJiBWSUFfRE1BX0NTUl9URCk7Ci0JZG9uZV90cmFuc2ZlciA9IGRvbmVfdHJhbnNmZXIgfHwgKCBibGl0cS0+YWJvcnRpbmcgJiYgIShzdGF0dXMgJiBWSUFfRE1BX0NTUl9ERSkpOyAKKwlkb25lX3RyYW5zZmVyID0gZG9uZV90cmFuc2ZlciB8fCAoIGJsaXRxLT5hYm9ydGluZyAmJiAhKHN0YXR1cyAmIFZJQV9ETUFfQ1NSX0RFKSk7CiAKIAljdXIgPSBibGl0cS0+Y3VyOwogCWlmIChkb25lX3RyYW5zZmVyKSB7CiAKIAkJYmxpdHEtPmJsaXRzW2N1cl0tPmFib3J0ZWQgPSBibGl0cS0+YWJvcnRpbmc7CiAJCWJsaXRxLT5kb25lX2JsaXRfaGFuZGxlKys7Ci0JCURSTV9XQUtFVVAoYmxpdHEtPmJsaXRfcXVldWUgKyBjdXIpOwkJCisJCURSTV9XQUtFVVAoYmxpdHEtPmJsaXRfcXVldWUgKyBjdXIpOwogCiAJCWN1cisrOwotCQlpZiAoY3VyID49IFZJQV9OVU1fQkxJVF9TTE9UUykgCisJCWlmIChjdXIgPj0gVklBX05VTV9CTElUX1NMT1RTKQogCQkJY3VyID0gMDsKIAkJYmxpdHEtPmN1ciA9IGN1cjsKIApAQCAtMzU1LDcgKzM1NSw3IEBACiAKIAkJYmxpdHEtPmlzX2FjdGl2ZSA9IDA7CiAJCWJsaXRxLT5hYm9ydGluZyA9IDA7Ci0JCXNjaGVkdWxlX3dvcmsoJmJsaXRxLT53cSk7CQorCQlzY2hlZHVsZV93b3JrKCZibGl0cS0+d3EpOwogCiAJfSBlbHNlIGlmIChibGl0cS0+aXNfYWN0aXZlICYmIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgYmxpdHEtPmVuZCkpIHsKIApAQCAtMzY3LDcgKzM2Nyw3IEBACiAJCWJsaXRxLT5hYm9ydGluZyA9IDE7CiAJCWJsaXRxLT5lbmQgPSBqaWZmaWVzICsgRFJNX0haOwogCX0KLQkgIAkJCisKIAlpZiAoIWJsaXRxLT5pc19hY3RpdmUpIHsKIAkJaWYgKGJsaXRxLT5udW1fb3V0c3RhbmRpbmcpIHsKIAkJCXZpYV9maXJlX2RtYWJsaXQoZGV2LCBibGl0cS0+YmxpdHNbY3VyXSwgZW5naW5lKTsKQEAgLTM4MywxNCArMzgzLDE0IEBACiAJCQl9CiAJCQl2aWFfZG1hYmxpdF9lbmdpbmVfb2ZmKGRldiwgZW5naW5lKTsKIAkJfQotCX0JCQorCX0KIAogCWlmIChmcm9tX2lycSkgewogCQlzcGluX3VubG9jaygmYmxpdHEtPmJsaXRfbG9jayk7CiAJfSBlbHNlIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxpdHEtPmJsaXRfbG9jaywgaXJxc2F2ZSk7CiAJfQotfSAKK30KIAogCiAKQEAgLTQyNiwxMyArNDI2LDEzIEBACiAKIAlyZXR1cm4gYWN0aXZlOwogfQotCQorCiAvKgogICogU3luYy4gV2FpdCBmb3IgYXQgbGVhc3QgdGhyZWUgc2Vjb25kcyBmb3IgdGhlIGJsaXQgdG8gYmUgcGVyZm9ybWVkLgogICovCiAKIHN0YXRpYyBpbnQKLXZpYV9kbWFibGl0X3N5bmMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgaGFuZGxlLCBpbnQgZW5naW5lKSAKK3ZpYV9kbWFibGl0X3N5bmMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgaGFuZGxlLCBpbnQgZW5naW5lKQogewogCiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTQ0MSwxMiArNDQxLDEyIEBACiAJaW50IHJldCA9IDA7CiAKIAlpZiAodmlhX2RtYWJsaXRfYWN0aXZlKGJsaXRxLCBlbmdpbmUsIGhhbmRsZSwgJnF1ZXVlKSkgewotCQlEUk1fV0FJVF9PTihyZXQsICpxdWV1ZSwgMyAqIERSTV9IWiwgCisJCURSTV9XQUlUX09OKHJldCwgKnF1ZXVlLCAzICogRFJNX0haLAogCQkJICAgICF2aWFfZG1hYmxpdF9hY3RpdmUoYmxpdHEsIGVuZ2luZSwgaGFuZGxlLCBOVUxMKSk7CiAJfQogCURSTV9ERUJVRygiRE1BIGJsaXQgc3luYyBoYW5kbGUgMHgleCBlbmdpbmUgJWQgcmV0dXJuZWQgJWRcbiIsCiAJCSAgaGFuZGxlLCBlbmdpbmUsIHJldCk7Ci0JCisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC00NjgsMTIgKzQ2OCwxMiBAQAogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBibGl0cS0+ZGV2OwogCWludCBlbmdpbmUgPSAoaW50KQogCQkoYmxpdHEgLSAoKGRybV92aWFfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZSktPmJsaXRfcXVldWVzKTsKLQkJCi0JRFJNX0RFQlVHKCJQb2xsaW5nIHRpbWVyIGNhbGxlZCBmb3IgZW5naW5lICVkLCBqaWZmaWVzICVsdVxuIiwgZW5naW5lLCAKKworCURSTV9ERUJVRygiUG9sbGluZyB0aW1lciBjYWxsZWQgZm9yIGVuZ2luZSAlZCwgamlmZmllcyAlbHVcbiIsIGVuZ2luZSwKIAkJICAodW5zaWduZWQgbG9uZykgamlmZmllcyk7CiAKIAl2aWFfZG1hYmxpdF9oYW5kbGVyKGRldiwgZW5naW5lLCAwKTsKLQkKKwogCWlmICghdGltZXJfcGVuZGluZygmYmxpdHEtPnBvbGxfdGltZXIpKSB7CiAJCW1vZF90aW1lcigmYmxpdHEtPnBvbGxfdGltZXIsIGppZmZpZXMgKyAxKTsKIApAQCAtNDk3LDcgKzQ5Nyw3IEBACiAgKi8KIAogCi1zdGF0aWMgdm9pZCAKK3N0YXRpYyB2b2lkCiB2aWFfZG1hYmxpdF93b3JrcXVldWUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCWRybV92aWFfYmxpdHFfdCAqYmxpdHEgPSBjb250YWluZXJfb2Yod29yaywgZHJtX3ZpYV9ibGl0cV90LCB3cSk7CkBAIC01MDUsMzggKzUwNSwzOCBAQAogCXVuc2lnbmVkIGxvbmcgaXJxc2F2ZTsKIAlkcm1fdmlhX3NnX2luZm9fdCAqY3VyX3NnOwogCWludCBjdXJfcmVsZWFzZWQ7Ci0JCi0JCi0JRFJNX0RFQlVHKCJXb3JrcXVldWUgdGFzayBjYWxsZWQgZm9yIGJsaXQgZW5naW5lICVsZFxuIiwodW5zaWduZWQgbG9uZykgCisKKworCURSTV9ERUJVRygiV29ya3F1ZXVlIHRhc2sgY2FsbGVkIGZvciBibGl0IGVuZ2luZSAlbGRcbiIsKHVuc2lnbmVkIGxvbmcpCiAJCSAgKGJsaXRxIC0gKChkcm1fdmlhX3ByaXZhdGVfdCAqKWRldi0+ZGV2X3ByaXZhdGUpLT5ibGl0X3F1ZXVlcykpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJsaXRxLT5ibGl0X2xvY2ssIGlycXNhdmUpOwotCQorCiAJd2hpbGUoYmxpdHEtPnNlcnZpY2VkICE9IGJsaXRxLT5jdXIpIHsKIAogCQljdXJfcmVsZWFzZWQgPSBibGl0cS0+c2VydmljZWQrKzsKIAogCQlEUk1fREVCVUcoIlJlbGVhc2luZyBibGl0IHNsb3QgJWRcbiIsIGN1cl9yZWxlYXNlZCk7CiAKLQkJaWYgKGJsaXRxLT5zZXJ2aWNlZCA+PSBWSUFfTlVNX0JMSVRfU0xPVFMpIAorCQlpZiAoYmxpdHEtPnNlcnZpY2VkID49IFZJQV9OVU1fQkxJVF9TTE9UUykKIAkJCWJsaXRxLT5zZXJ2aWNlZCA9IDA7Ci0JCQorCiAJCWN1cl9zZyA9IGJsaXRxLT5ibGl0c1tjdXJfcmVsZWFzZWRdOwogCQlibGl0cS0+bnVtX2ZyZWUrKzsKLQkJCQkKKwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGl0cS0+YmxpdF9sb2NrLCBpcnFzYXZlKTsKLQkJCisKIAkJRFJNX1dBS0VVUCgmYmxpdHEtPmJ1c3lfcXVldWUpOwotCQkKKwogCQl2aWFfZnJlZV9zZ19pbmZvKGRldi0+cGRldiwgY3VyX3NnKTsKIAkJa2ZyZWUoY3VyX3NnKTsKLQkJCisKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmJsaXRxLT5ibGl0X2xvY2ssIGlycXNhdmUpOwogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsaXRxLT5ibGl0X2xvY2ssIGlycXNhdmUpOwogfQotCQorCiAKIC8qCiAgKiBJbml0IGFsbCBibGl0IGVuZ2luZXMuIEN1cnJlbnRseSB3ZSB1c2UgdHdvLCBidXQgc29tZSBoYXJkd2FyZSBoYXZlIDQuCkBAIC01NTAsOCArNTUwLDggQEAKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOwogCWRybV92aWFfYmxpdHFfdCAqYmxpdHE7CiAKLQlwY2lfc2V0X21hc3RlcihkZXYtPnBkZXYpOwkKLQkKKwlwY2lfc2V0X21hc3RlcihkZXYtPnBkZXYpOworCiAJZm9yIChpPTA7IGk8IFZJQV9OVU1fQkxJVF9FTkdJTkVTOyArK2kpIHsKIAkJYmxpdHEgPSBkZXZfcHJpdi0+YmxpdF9xdWV1ZXMgKyBpOwogCQlibGl0cS0+ZGV2ID0gZGV2OwpAQCAtNTcyLDIwICs1NzIsMjAgQEAKIAkJSU5JVF9XT1JLKCZibGl0cS0+d3EsIHZpYV9kbWFibGl0X3dvcmtxdWV1ZSk7CiAJCXNldHVwX3RpbWVyKCZibGl0cS0+cG9sbF90aW1lciwgdmlhX2RtYWJsaXRfdGltZXIsCiAJCQkJKHVuc2lnbmVkIGxvbmcpYmxpdHEpOwotCX0JCisJfQogfQogCiAvKgogICogQnVpbGQgYWxsIGluZm8gYW5kIGRvIGFsbCBtYXBwaW5ncyByZXF1aXJlZCBmb3IgYSBibGl0LgogICovCi0JCQorCiAKIHN0YXRpYyBpbnQKIHZpYV9idWlsZF9zZ19pbmZvKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGRybV92aWFfc2dfaW5mb190ICp2c2csIGRybV92aWFfZG1hYmxpdF90ICp4ZmVyKQogewogCWludCBkcmF3ID0geGZlci0+dG9fZmI7CiAJaW50IHJldCA9IDA7Ci0JCisKIAl2c2ctPmRpcmVjdGlvbiA9IChkcmF3KSA/IERNQV9UT19ERVZJQ0UgOiBETUFfRlJPTV9ERVZJQ0U7CiAJdnNnLT5ib3VuY2VfYnVmZmVyID0gTlVMTDsKIApAQCAtNTk5LDcgKzU5OSw3IEBACiAJLyoKIAkgKiBCZWxvdyBjaGVjayBpcyBhIGRyaXZlciBsaW1pdGF0aW9uLCBub3QgYSBoYXJkd2FyZSBvbmUuIFdlCiAJICogZG9uJ3Qgd2FudCB0byBsb2NrIHVudXNlZCBwYWdlcywgYW5kIGRvbid0IHdhbnQgdG8gaW5jb3BvcmF0ZSB0aGUKLQkgKiBleHRyYSBsb2dpYyBvZiBhdm9pZGluZyB0aGVtLiBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vLiAKKwkgKiBleHRyYSBsb2dpYyBvZiBhdm9pZGluZyB0aGVtLiBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vLgogCSAqIChOb3QgYSBiaWcgbGltaXRhdGlvbiBhbnl3YXkuKQogCSAqLwogCkBAIC02MjUsMTEgKzYyNSwxMSBAQAogCWlmICh4ZmVyLT5udW1fbGluZXMgPiAyMDQ4IHx8ICh4ZmVyLT5udW1fbGluZXMqeGZlci0+bWVtX3N0cmlkZSA+ICgyMDQ4KjIwNDgqNCkpKSB7CiAJCURSTV9FUlJPUigiVG9vIGxhcmdlIFBDSSBETUEgYml0Ymx0LlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwotCX0JCQorCX0KIAotCS8qIAorCS8qCiAJICogd2UgYWxsb3cgYSBuZWdhdGl2ZSBmYiBzdHJpZGUgdG8gYWxsb3cgZmxpcHBpbmcgb2YgaW1hZ2VzIGluCi0JICogdHJhbnNmZXIuIAorCSAqIHRyYW5zZmVyLgogCSAqLwogCiAJaWYgKHhmZXItPm1lbV9zdHJpZGUgPCB4ZmVyLT5saW5lX2xlbmd0aCB8fApAQCAtNjUzLDExICs2NTMsMTEgQEAKICNlbHNlCiAJaWYgKCgoKHVuc2lnbmVkIGxvbmcpeGZlci0+bWVtX2FkZHIgJiAxNSkgfHwKIAkgICAgICAoKHVuc2lnbmVkIGxvbmcpeGZlci0+ZmJfYWRkciAmIDMpKSB8fAotCSAgICgoeGZlci0+bnVtX2xpbmVzID4gMSkgJiYgCisJICAgKCh4ZmVyLT5udW1fbGluZXMgPiAxKSAmJgogCSAgICgoeGZlci0+bWVtX3N0cmlkZSAmIDE1KSB8fCAoeGZlci0+ZmJfc3RyaWRlICYgMykpKSkgewogCQlEUk1fRVJST1IoIkludmFsaWQgRFJNIGJpdGJsdCBhbGlnbm1lbnQuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQkKKwl9CiAjZW5kaWYKIAogCWlmICgwICE9IChyZXQgPSB2aWFfbG9ja19hbGxfZG1hX3BhZ2VzKHZzZywgeGZlcikpKSB7CkBAIC02NzMsMTcgKzY3MywxNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAl2aWFfbWFwX2JsaXRfZm9yX2RldmljZShkZXYtPnBkZXYsIHhmZXIsIHZzZywgMSk7Ci0JCisKIAlyZXR1cm4gMDsKIH0KLQkKKwogCiAvKgogICogUmVzZXJ2ZSBvbmUgZnJlZSBzbG90IGluIHRoZSBibGl0IHF1ZXVlLiBXaWxsIHdhaXQgZm9yIG9uZSBzZWNvbmQgZm9yIG9uZQogICogdG8gYmVjb21lIGF2YWlsYWJsZS4gT3RoZXJ3aXNlIC1FQlVTWSBpcyByZXR1cm5lZC4KICAqLwogCi1zdGF0aWMgaW50IAorc3RhdGljIGludAogdmlhX2RtYWJsaXRfZ3JhYl9zbG90KGRybV92aWFfYmxpdHFfdCAqYmxpdHEsIGludCBlbmdpbmUpCiB7CiAJaW50IHJldD0wOwpAQCAtNjk4LDEwICs2OTgsMTAgQEAKIAkJaWYgKHJldCkgewogCQkJcmV0dXJuICgtRUlOVFIgPT0gcmV0KSA/IC1FQUdBSU4gOiByZXQ7CiAJCX0KLQkJCisKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmJsaXRxLT5ibGl0X2xvY2ssIGlycXNhdmUpOwogCX0KLQkKKwogCWJsaXRxLT5udW1fZnJlZS0tOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsaXRxLT5ibGl0X2xvY2ssIGlycXNhdmUpOwogCkBAIC03MTIsNyArNzEyLDcgQEAKICAqIEhhbmQgYmFjayBhIGZyZWUgc2xvdCBpZiB3ZSBjaGFuZ2VkIG91ciBtaW5kLgogICovCiAKLXN0YXRpYyB2b2lkIAorc3RhdGljIHZvaWQKIHZpYV9kbWFibGl0X3JlbGVhc2Vfc2xvdChkcm1fdmlhX2JsaXRxX3QgKmJsaXRxKQogewogCXVuc2lnbmVkIGxvbmcgaXJxc2F2ZTsKQEAgLTcyOCw4ICs3MjgsOCBAQAogICovCiAKIAotc3RhdGljIGludCAKLXZpYV9kbWFibGl0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGRybV92aWFfZG1hYmxpdF90ICp4ZmVyKQkgCitzdGF0aWMgaW50Cit2aWFfZG1hYmxpdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBkcm1fdmlhX2RtYWJsaXRfdCAqeGZlcikKIHsKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKilkZXYtPmRldl9wcml2YXRlOwogCWRybV92aWFfc2dfaW5mb190ICp2c2c7CkBAIC03NjAsMTUgKzc2MCwxNSBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZibGl0cS0+YmxpdF9sb2NrLCBpcnFzYXZlKTsKIAogCWJsaXRxLT5ibGl0c1tibGl0cS0+aGVhZCsrXSA9IHZzZzsKLQlpZiAoYmxpdHEtPmhlYWQgPj0gVklBX05VTV9CTElUX1NMT1RTKSAKKwlpZiAoYmxpdHEtPmhlYWQgPj0gVklBX05VTV9CTElUX1NMT1RTKQogCQlibGl0cS0+aGVhZCA9IDA7CiAJYmxpdHEtPm51bV9vdXRzdGFuZGluZysrOwotCXhmZXItPnN5bmMuc3luY19oYW5kbGUgPSArK2JsaXRxLT5jdXJfYmxpdF9oYW5kbGU7IAorCXhmZXItPnN5bmMuc3luY19oYW5kbGUgPSArK2JsaXRxLT5jdXJfYmxpdF9oYW5kbGU7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGl0cS0+YmxpdF9sb2NrLCBpcnFzYXZlKTsKIAl4ZmVyLT5zeW5jLmVuZ2luZSA9IGVuZ2luZTsKIAotICAgICAgIAl2aWFfZG1hYmxpdF9oYW5kbGVyKGRldiwgZW5naW5lLCAwKTsKKwl2aWFfZG1hYmxpdF9oYW5kbGVyKGRldiwgZW5naW5lLCAwKTsKIAogCXJldHVybiAwOwogfQpAQCAtNzc2LDcgKzc3Niw3IEBACiAvKgogICogU3luYyBvbiBhIHByZXZpb3VzbHkgc3VibWl0dGVkIGJsaXQuIE5vdGUgdGhhdCB0aGUgWCBzZXJ2ZXIgdXNlIHNpZ25hbHMgZXh0ZW5zaXZlbHksIGFuZAogICogdGhhdCB0aGVyZSBpcyBhIHZlcnkgYmlnIHByb2JhYmlsaXR5IHRoYXQgdGhpcyBJT0NUTCB3aWxsIGJlIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLiBJbiB0aGF0Ci0gKiBjYXNlIGl0IHJldHVybnMgd2l0aCAtRUFHQUlOIGZvciB0aGUgc2lnbmFsIHRvIGJlIGRlbGl2ZXJlZC4gCisgKiBjYXNlIGl0IHJldHVybnMgd2l0aCAtRUFHQUlOIGZvciB0aGUgc2lnbmFsIHRvIGJlIGRlbGl2ZXJlZC4KICAqIFRoZSBjYWxsZXIgc2hvdWxkIHRoZW4gcmVpc3N1ZSB0aGUgSU9DVEwuIFRoaXMgaXMgc2ltaWxhciB0byB3aGF0IGlzIGJlaW5nIGRvbmUgZm9yIGRybUdldExvY2soKS4KICAqLwogCkBAIC03ODYsNyArNzg2LDcgQEAKIAlkcm1fdmlhX2JsaXRzeW5jX3QgKnN5bmMgPSBkYXRhOwogCWludCBlcnI7CiAKLQlpZiAoc3luYy0+ZW5naW5lID49IFZJQV9OVU1fQkxJVF9FTkdJTkVTKSAKKwlpZiAoc3luYy0+ZW5naW5lID49IFZJQV9OVU1fQkxJVF9FTkdJTkVTKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWVyciA9IHZpYV9kbWFibGl0X3N5bmMoZGV2LCBzeW5jLT5zeW5jX2hhbmRsZSwgc3luYy0+ZW5naW5lKTsKQEAgLTc5NiwxNSArNzk2LDE1IEBACiAKIAlyZXR1cm4gZXJyOwogfQotCQorCiAKIC8qCiAgKiBRdWV1ZSBhIGJsaXQgYW5kIGhhbmQgYmFjayBhIGhhbmRsZSB0byBiZSB1c2VkIGZvciBzeW5jLiBUaGlzIElPQ1RMIG1heSBiZSBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbAotICogd2hpbGUgd2FpdGluZyBmb3IgYSBmcmVlIHNsb3QgaW4gdGhlIGJsaXQgcXVldWUuIEluIHRoYXQgY2FzZSBpdCByZXR1cm5zIHdpdGggLUVBR0FJTiBhbmQgc2hvdWxkIAorICogd2hpbGUgd2FpdGluZyBmb3IgYSBmcmVlIHNsb3QgaW4gdGhlIGJsaXQgcXVldWUuIEluIHRoYXQgY2FzZSBpdCByZXR1cm5zIHdpdGggLUVBR0FJTiBhbmQgc2hvdWxkCiAgKiBiZSByZWlzc3VlZC4gU2VlIHRoZSBhYm92ZSBJT0NUTCBjb2RlLgogICovCiAKLWludCAKK2ludAogdmlhX2RtYV9ibGl0KCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLCBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiApCiB7CiAJZHJtX3ZpYV9kbWFibGl0X3QgKnhmZXIgPSBkYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hYmxpdC5oIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZG1hYmxpdC5oCmluZGV4IDZmNmE1MTMuLjc0MDhhNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYWJsaXQuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWFibGl0LmgKQEAgLTEsNSArMSw1IEBACiAvKiB2aWFfZG1hYmxpdC5oIC0tIFBDSSBETUEgQml0Qmx0IHN1cHBvcnQgZm9yIHRoZSBWSUEgVW5pY2hyb21lL1BybwotICogCisgKgogICogQ29weXJpZ2h0IDIwMDUgVGhvbWFzIEhlbGxzdHJvbS4KICAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgpAQCAtMTcsMTIgKzE3LDEyIEBACiAgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKLSAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgCi0gKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgCi0gKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCiAgKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogICoKLSAqIEF1dGhvcnM6IAorICogQXV0aG9yczoKICAqICAgIFRob21hcyBIZWxsc3Ryb20uCiAgKiAgICBSZWdpc3RlciBpbmZvIGZyb20gRGlnZW8gSW5jLgogICovCkBAIC02Nyw3ICs2Nyw3IEBACiAJdW5zaWduZWQgY3VyOwogCXVuc2lnbmVkIG51bV9mcmVlOwogCXVuc2lnbmVkIG51bV9vdXRzdGFuZGluZzsKLQl1bnNpZ25lZCBsb25nIGVuZDsgIAorCXVuc2lnbmVkIGxvbmcgZW5kOwogICAgICAgICBpbnQgYWJvcnRpbmc7CiAJaW50IGlzX2FjdGl2ZTsKIAlkcm1fdmlhX3NnX2luZm9fdCAqYmxpdHNbVklBX05VTV9CTElUX1NMT1RTXTsKQEAgLTc3LDQ2ICs3Nyw0NiBAQAogCXN0cnVjdCB3b3JrX3N0cnVjdCB3cTsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBwb2xsX3RpbWVyOwogfSBkcm1fdmlhX2JsaXRxX3Q7Ci0JCiAKLS8qIAorCisvKgogICogIFBDSSBETUEgUmVnaXN0ZXJzCiAgKiAgQ2hhbm5lbHMgMiAmIDMgZG9uJ3Qgc2VlbSB0byBiZSBpbXBsZW1lbnRlZCBpbiBoYXJkd2FyZS4KICAqLwotIAotI2RlZmluZSBWSUFfUENJX0RNQV9NQVIwICAgICAgICAgICAgMHhFNDAgICAvKiBNZW1vcnkgQWRkcmVzcyBSZWdpc3RlciBvZiBDaGFubmVsIDAgKi8gCi0jZGVmaW5lIFZJQV9QQ0lfRE1BX0RBUjAgICAgICAgICAgICAweEU0NCAgIC8qIERldmljZSBBZGRyZXNzIFJlZ2lzdGVyIG9mIENoYW5uZWwgMCAqLyAKLSNkZWZpbmUgVklBX1BDSV9ETUFfQkNSMCAgICAgICAgICAgIDB4RTQ4ICAgLyogQnl0ZSBDb3VudCBSZWdpc3RlciBvZiBDaGFubmVsIDAgKi8gCi0jZGVmaW5lIFZJQV9QQ0lfRE1BX0RQUjAgICAgICAgICAgICAweEU0QyAgIC8qIERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciBvZiBDaGFubmVsIDAgKi8gCiAKLSNkZWZpbmUgVklBX1BDSV9ETUFfTUFSMSAgICAgICAgICAgIDB4RTUwICAgLyogTWVtb3J5IEFkZHJlc3MgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAxICovIAotI2RlZmluZSBWSUFfUENJX0RNQV9EQVIxICAgICAgICAgICAgMHhFNTQgICAvKiBEZXZpY2UgQWRkcmVzcyBSZWdpc3RlciBvZiBDaGFubmVsIDEgKi8gCi0jZGVmaW5lIFZJQV9QQ0lfRE1BX0JDUjEgICAgICAgICAgICAweEU1OCAgIC8qIEJ5dGUgQ291bnQgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAxICovIAotI2RlZmluZSBWSUFfUENJX0RNQV9EUFIxICAgICAgICAgICAgMHhFNUMgICAvKiBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAxICovIAorI2RlZmluZSBWSUFfUENJX0RNQV9NQVIwICAgICAgICAgICAgMHhFNDAgICAvKiBNZW1vcnkgQWRkcmVzcyBSZWdpc3RlciBvZiBDaGFubmVsIDAgKi8KKyNkZWZpbmUgVklBX1BDSV9ETUFfREFSMCAgICAgICAgICAgIDB4RTQ0ICAgLyogRGV2aWNlIEFkZHJlc3MgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAwICovCisjZGVmaW5lIFZJQV9QQ0lfRE1BX0JDUjAgICAgICAgICAgICAweEU0OCAgIC8qIEJ5dGUgQ291bnQgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAwICovCisjZGVmaW5lIFZJQV9QQ0lfRE1BX0RQUjAgICAgICAgICAgICAweEU0QyAgIC8qIERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciBvZiBDaGFubmVsIDAgKi8KIAotI2RlZmluZSBWSUFfUENJX0RNQV9NQVIyICAgICAgICAgICAgMHhFNjAgICAvKiBNZW1vcnkgQWRkcmVzcyBSZWdpc3RlciBvZiBDaGFubmVsIDIgKi8gCi0jZGVmaW5lIFZJQV9QQ0lfRE1BX0RBUjIgICAgICAgICAgICAweEU2NCAgIC8qIERldmljZSBBZGRyZXNzIFJlZ2lzdGVyIG9mIENoYW5uZWwgMiAqLyAKLSNkZWZpbmUgVklBX1BDSV9ETUFfQkNSMiAgICAgICAgICAgIDB4RTY4ICAgLyogQnl0ZSBDb3VudCBSZWdpc3RlciBvZiBDaGFubmVsIDIgKi8gCi0jZGVmaW5lIFZJQV9QQ0lfRE1BX0RQUjIgICAgICAgICAgICAweEU2QyAgIC8qIERlc2NyaXB0b3IgUG9pbnRlciBSZWdpc3RlciBvZiBDaGFubmVsIDIgKi8gCisjZGVmaW5lIFZJQV9QQ0lfRE1BX01BUjEgICAgICAgICAgICAweEU1MCAgIC8qIE1lbW9yeSBBZGRyZXNzIFJlZ2lzdGVyIG9mIENoYW5uZWwgMSAqLworI2RlZmluZSBWSUFfUENJX0RNQV9EQVIxICAgICAgICAgICAgMHhFNTQgICAvKiBEZXZpY2UgQWRkcmVzcyBSZWdpc3RlciBvZiBDaGFubmVsIDEgKi8KKyNkZWZpbmUgVklBX1BDSV9ETUFfQkNSMSAgICAgICAgICAgIDB4RTU4ICAgLyogQnl0ZSBDb3VudCBSZWdpc3RlciBvZiBDaGFubmVsIDEgKi8KKyNkZWZpbmUgVklBX1BDSV9ETUFfRFBSMSAgICAgICAgICAgIDB4RTVDICAgLyogRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyIG9mIENoYW5uZWwgMSAqLwogCi0jZGVmaW5lIFZJQV9QQ0lfRE1BX01BUjMgICAgICAgICAgICAweEU3MCAgIC8qIE1lbW9yeSBBZGRyZXNzIFJlZ2lzdGVyIG9mIENoYW5uZWwgMyAqLyAKLSNkZWZpbmUgVklBX1BDSV9ETUFfREFSMyAgICAgICAgICAgIDB4RTc0ICAgLyogRGV2aWNlIEFkZHJlc3MgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAzICovIAotI2RlZmluZSBWSUFfUENJX0RNQV9CQ1IzICAgICAgICAgICAgMHhFNzggICAvKiBCeXRlIENvdW50IFJlZ2lzdGVyIG9mIENoYW5uZWwgMyAqLyAKLSNkZWZpbmUgVklBX1BDSV9ETUFfRFBSMyAgICAgICAgICAgIDB4RTdDICAgLyogRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyIG9mIENoYW5uZWwgMyAqLyAKKyNkZWZpbmUgVklBX1BDSV9ETUFfTUFSMiAgICAgICAgICAgIDB4RTYwICAgLyogTWVtb3J5IEFkZHJlc3MgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAyICovCisjZGVmaW5lIFZJQV9QQ0lfRE1BX0RBUjIgICAgICAgICAgICAweEU2NCAgIC8qIERldmljZSBBZGRyZXNzIFJlZ2lzdGVyIG9mIENoYW5uZWwgMiAqLworI2RlZmluZSBWSUFfUENJX0RNQV9CQ1IyICAgICAgICAgICAgMHhFNjggICAvKiBCeXRlIENvdW50IFJlZ2lzdGVyIG9mIENoYW5uZWwgMiAqLworI2RlZmluZSBWSUFfUENJX0RNQV9EUFIyICAgICAgICAgICAgMHhFNkMgICAvKiBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAyICovCiAKLSNkZWZpbmUgVklBX1BDSV9ETUFfTVIwICAgICAgICAgICAgIDB4RTgwICAgLyogTW9kZSBSZWdpc3RlciBvZiBDaGFubmVsIDAgKi8gCi0jZGVmaW5lIFZJQV9QQ0lfRE1BX01SMSAgICAgICAgICAgICAweEU4NCAgIC8qIE1vZGUgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAxICovIAotI2RlZmluZSBWSUFfUENJX0RNQV9NUjIgICAgICAgICAgICAgMHhFODggICAvKiBNb2RlIFJlZ2lzdGVyIG9mIENoYW5uZWwgMiAqLyAKLSNkZWZpbmUgVklBX1BDSV9ETUFfTVIzICAgICAgICAgICAgIDB4RThDICAgLyogTW9kZSBSZWdpc3RlciBvZiBDaGFubmVsIDMgKi8gCisjZGVmaW5lIFZJQV9QQ0lfRE1BX01BUjMgICAgICAgICAgICAweEU3MCAgIC8qIE1lbW9yeSBBZGRyZXNzIFJlZ2lzdGVyIG9mIENoYW5uZWwgMyAqLworI2RlZmluZSBWSUFfUENJX0RNQV9EQVIzICAgICAgICAgICAgMHhFNzQgICAvKiBEZXZpY2UgQWRkcmVzcyBSZWdpc3RlciBvZiBDaGFubmVsIDMgKi8KKyNkZWZpbmUgVklBX1BDSV9ETUFfQkNSMyAgICAgICAgICAgIDB4RTc4ICAgLyogQnl0ZSBDb3VudCBSZWdpc3RlciBvZiBDaGFubmVsIDMgKi8KKyNkZWZpbmUgVklBX1BDSV9ETUFfRFBSMyAgICAgICAgICAgIDB4RTdDICAgLyogRGVzY3JpcHRvciBQb2ludGVyIFJlZ2lzdGVyIG9mIENoYW5uZWwgMyAqLwogCi0jZGVmaW5lIFZJQV9QQ0lfRE1BX0NTUjAgICAgICAgICAgICAweEU5MCAgIC8qIENvbW1hbmQvU3RhdHVzIFJlZ2lzdGVyIG9mIENoYW5uZWwgMCAqLyAKLSNkZWZpbmUgVklBX1BDSV9ETUFfQ1NSMSAgICAgICAgICAgIDB4RTk0ICAgLyogQ29tbWFuZC9TdGF0dXMgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAxICovIAotI2RlZmluZSBWSUFfUENJX0RNQV9DU1IyICAgICAgICAgICAgMHhFOTggICAvKiBDb21tYW5kL1N0YXR1cyBSZWdpc3RlciBvZiBDaGFubmVsIDIgKi8gCi0jZGVmaW5lIFZJQV9QQ0lfRE1BX0NTUjMgICAgICAgICAgICAweEU5QyAgIC8qIENvbW1hbmQvU3RhdHVzIFJlZ2lzdGVyIG9mIENoYW5uZWwgMyAqLyAKKyNkZWZpbmUgVklBX1BDSV9ETUFfTVIwICAgICAgICAgICAgIDB4RTgwICAgLyogTW9kZSBSZWdpc3RlciBvZiBDaGFubmVsIDAgKi8KKyNkZWZpbmUgVklBX1BDSV9ETUFfTVIxICAgICAgICAgICAgIDB4RTg0ICAgLyogTW9kZSBSZWdpc3RlciBvZiBDaGFubmVsIDEgKi8KKyNkZWZpbmUgVklBX1BDSV9ETUFfTVIyICAgICAgICAgICAgIDB4RTg4ICAgLyogTW9kZSBSZWdpc3RlciBvZiBDaGFubmVsIDIgKi8KKyNkZWZpbmUgVklBX1BDSV9ETUFfTVIzICAgICAgICAgICAgIDB4RThDICAgLyogTW9kZSBSZWdpc3RlciBvZiBDaGFubmVsIDMgKi8KIAotI2RlZmluZSBWSUFfUENJX0RNQV9QVFIgICAgICAgICAgICAgMHhFQTAgICAvKiBQcmlvcml0eSBUeXBlIFJlZ2lzdGVyICovIAorI2RlZmluZSBWSUFfUENJX0RNQV9DU1IwICAgICAgICAgICAgMHhFOTAgICAvKiBDb21tYW5kL1N0YXR1cyBSZWdpc3RlciBvZiBDaGFubmVsIDAgKi8KKyNkZWZpbmUgVklBX1BDSV9ETUFfQ1NSMSAgICAgICAgICAgIDB4RTk0ICAgLyogQ29tbWFuZC9TdGF0dXMgUmVnaXN0ZXIgb2YgQ2hhbm5lbCAxICovCisjZGVmaW5lIFZJQV9QQ0lfRE1BX0NTUjIgICAgICAgICAgICAweEU5OCAgIC8qIENvbW1hbmQvU3RhdHVzIFJlZ2lzdGVyIG9mIENoYW5uZWwgMiAqLworI2RlZmluZSBWSUFfUENJX0RNQV9DU1IzICAgICAgICAgICAgMHhFOUMgICAvKiBDb21tYW5kL1N0YXR1cyBSZWdpc3RlciBvZiBDaGFubmVsIDMgKi8KIAotLyogRGVmaW5lIGZvciBETUEgZW5naW5lICovIAorI2RlZmluZSBWSUFfUENJX0RNQV9QVFIgICAgICAgICAgICAgMHhFQTAgICAvKiBQcmlvcml0eSBUeXBlIFJlZ2lzdGVyICovCisKKy8qIERlZmluZSBmb3IgRE1BIGVuZ2luZSAqLwogLyogRFBSICovCiAjZGVmaW5lIFZJQV9ETUFfRFBSX0VDCQkoMTw8MSkJLyogZW5kIG9mIGNoYWluICovCiAjZGVmaW5lIFZJQV9ETUFfRFBSX0RESUUJKDE8PDIpCS8qIGRlc2NyaXB0b3IgZG9uZSBpbnRlcnJ1cHQgZW5hYmxlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RybS5oCmluZGV4IDhmNTNjNzYuLmEzYjVjMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RybS5oCkBAIC0zNSw3ICszNSw3IEBACiAjaW5jbHVkZSAidmlhX2RybWNsaWVudC5oIgogI2VuZGlmCiAKLSNkZWZpbmUgVklBX05SX1NBUkVBX0NMSVBSRUNUUyAJCTgKKyNkZWZpbmUgVklBX05SX1NBUkVBX0NMSVBSRUNUUwkJOAogI2RlZmluZSBWSUFfTlJfWFZNQ19QT1JUUyAgICAgICAgICAgICAgIDEwCiAjZGVmaW5lIFZJQV9OUl9YVk1DX0xPQ0tTICAgICAgICAgICAgICAgNQogI2RlZmluZSBWSUFfTUFYX0NBQ0hFTElORV9TSVpFICAgICAgICAgIDY0CkBAIC0yNTksNyArMjU5LDcgQEAKIHR5cGVkZWYgc3RydWN0IGRybV92aWFfZG1hYmxpdCB7CiAJdWludDMyX3QgbnVtX2xpbmVzOwogCXVpbnQzMl90IGxpbmVfbGVuZ3RoOwotCQorCiAJdWludDMyX3QgZmJfYWRkcjsKIAl1aW50MzJfdCBmYl9zdHJpZGU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHJ2LmMKaW5kZXggMmQ0OTU3YS4uODBjMDFjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHJ2LmMKQEAgLTcxLDcgKzcxLDcgQEAKIAkJIC5uYW1lID0gRFJJVkVSX05BTUUsCiAJCSAuaWRfdGFibGUgPSBwY2lpZGxpc3QsCiAJfSwKLQkKKwogCS5uYW1lID0gRFJJVkVSX05BTUUsCiAJLmRlc2MgPSBEUklWRVJfREVTQywKIAkuZGF0ZSA9IERSSVZFUl9EQVRFLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfaXJxLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9pcnEuYwppbmRleCA5YzFkNTJiLi5jNmJiOTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9pcnEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9pcnEuYwpAQCAtMTY5LDkgKzE2OSw5IEBACiAJdW5zaWduZWQgaW50IGN1cl92Ymxhbms7CiAJaW50IHJldCA9IDA7CiAKLQlEUk1fREVCVUcoInZpYWRydl92Ymxhbmtfd2FpdFxuIik7CisJRFJNX0RFQlVHKCJcbiIpOwogCWlmICghZGV2X3ByaXYpIHsKLQkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJRFJNX0VSUk9SKCJjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjAxLDI0ICsyMDEsMjMgQEAKIAltYXNrYXJyYXlfdCAqbWFza3M7CiAJaW50IHJlYWxfaXJxOwogCi0JRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlEUk1fREVCVUcoIlxuIik7CiAKIAlpZiAoIWRldl9wcml2KSB7Ci0JCURSTV9FUlJPUigiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisJCURSTV9FUlJPUigiY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoaXJxID49IGRybV92aWFfaXJxX251bSkgewotCQlEUk1fRVJST1IoIiVzIFRyeWluZyB0byB3YWl0IG9uIHVua25vd24gaXJxICVkXG4iLCBfX0ZVTkNUSU9OX18sCi0JCQkgIGlycSk7CisJCURSTV9FUlJPUigiVHJ5aW5nIHRvIHdhaXQgb24gdW5rbm93biBpcnEgJWRcbiIsIGlycSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXJlYWxfaXJxID0gZGV2X3ByaXYtPmlycV9tYXBbaXJxXTsKIAogCWlmIChyZWFsX2lycSA8IDApIHsKLQkJRFJNX0VSUk9SKCIlcyBWaWRlbyBJUlEgJWQgbm90IGF2YWlsYWJsZSBvbiB0aGlzIGhhcmR3YXJlLlxuIiwKLQkJCSAgX19GVU5DVElPTl9fLCBpcnEpOworCQlEUk1fRVJST1IoIlZpZGVvIElSUSAlZCBub3QgYXZhaWxhYmxlIG9uIHRoaXMgaGFyZHdhcmUuXG4iLAorCQkJICBpcnEpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTI1MSw3ICsyNTAsNyBAQAogCWRybV92aWFfaXJxX3QgKmN1cl9pcnE7CiAJaW50IGk7CiAKLQlEUk1fREVCVUcoImRyaXZlcl9pcnFfcHJlaW5zdGFsbDogZGV2X3ByaXY6ICVwXG4iLCBkZXZfcHJpdik7CisJRFJNX0RFQlVHKCJkZXZfcHJpdjogJXBcbiIsIGRldl9wcml2KTsKIAlpZiAoZGV2X3ByaXYpIHsKIAkJY3VyX2lycSA9IGRldl9wcml2LT52aWFfaXJxczsKIApAQCAtMjk4LDcgKzI5Nyw3IEBACiAJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIHN0YXR1czsKIAotCURSTV9ERUJVRygidmlhX2RyaXZlcl9pcnFfcG9zdGluc3RhbGxcbiIpOworCURSTV9ERUJVRygiXG4iKTsKIAlpZiAoZGV2X3ByaXYpIHsKIAkJc3RhdHVzID0gVklBX1JFQUQoVklBX1JFR19JTlRFUlJVUFQpOwogCQlWSUFfV1JJVEUoVklBX1JFR19JTlRFUlJVUFQsIHN0YXR1cyB8IFZJQV9JUlFfR0xPQkFMCkBAIC0zMTcsNyArMzE2LDcgQEAKIAlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAl1MzIgc3RhdHVzOwogCi0JRFJNX0RFQlVHKCJkcml2ZXJfaXJxX3VuaW5zdGFsbClcbiIpOworCURSTV9ERUJVRygiXG4iKTsKIAlpZiAoZGV2X3ByaXYpIHsKIAogCQkvKiBTb21lIG1vcmUgbWFnaWMsIG9oIGZvciBzb21lIGRhdGEgc2hlZXRzICEgKi8KQEAgLTM0NCw3ICszNDMsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChpcnF3YWl0LT5yZXF1ZXN0LmlycSA+PSBkZXZfcHJpdi0+bnVtX2lycXMpIHsKLQkJRFJNX0VSUk9SKCIlcyBUcnlpbmcgdG8gd2FpdCBvbiB1bmtub3duIGlycSAlZFxuIiwgX19GVU5DVElPTl9fLAorCQlEUk1fRVJST1IoIlRyeWluZyB0byB3YWl0IG9uIHVua25vd24gaXJxICVkXG4iLAogCQkJICBpcnF3YWl0LT5yZXF1ZXN0LmlycSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTM2Miw4ICszNjEsNyBAQAogCX0KIAogCWlmIChpcnF3YWl0LT5yZXF1ZXN0LnR5cGUgJiBWSUFfSVJRX1NJR05BTCkgewotCQlEUk1fRVJST1IoIiVzIFNpZ25hbHMgb24gVmlhIElSUXMgbm90IGltcGxlbWVudGVkIHlldC5cbiIsCi0JCQkgIF9fRlVOQ1RJT05fXyk7CisJCURSTV9FUlJPUigiU2lnbmFscyBvbiBWaWEgSVJRcyBub3QgaW1wbGVtZW50ZWQgeWV0LlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfbWFwLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tYXAuYwppbmRleCAxMDA5MTUwLi5hOTY3NTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tYXAuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tYXAuYwpAQCAtMjksNyArMjksNyBAQAogewogCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKLQlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCURSTV9ERUJVRygiXG4iKTsKIAogCWRldl9wcml2LT5zYXJlYSA9IGRybV9nZXRzYXJlYShkZXYpOwogCWlmICghZGV2X3ByaXYtPnNhcmVhKSB7CkBAIC03OSw3ICs3OSw3IEBACiB7CiAJZHJtX3ZpYV9pbml0X3QgKmluaXQgPSBkYXRhOwogCi0JRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlEUk1fREVCVUcoIlxuIik7CiAKIAlzd2l0Y2ggKGluaXQtPmZ1bmMpIHsKIAljYXNlIFZJQV9JTklUX01BUDoKQEAgLTEyMSw0ICsxMjEsMyBAQAogCiAJcmV0dXJuIDA7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX21tLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tbS5jCmluZGV4IDNmZmJmODYuLmU2NDA5NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX21tLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfbW0uYwpAQCAtNTMsNyArNTMsNyBAQAogCWRldl9wcml2LT5hZ3Bfb2Zmc2V0ID0gYWdwLT5vZmZzZXQ7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKLQlEUk1fREVCVUcoIm9mZnNldCA9ICV1LCBzaXplID0gJXUiLCBhZ3AtPm9mZnNldCwgYWdwLT5zaXplKTsKKwlEUk1fREVCVUcoIm9mZnNldCA9ICV1LCBzaXplID0gJXVcbiIsIGFncC0+b2Zmc2V0LCBhZ3AtPnNpemUpOwogCXJldHVybiAwOwogfQogCkBAIC03Nyw3ICs3Nyw3IEBACiAJZGV2X3ByaXYtPnZyYW1fb2Zmc2V0ID0gZmItPm9mZnNldDsKIAogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCURSTV9ERUJVRygib2Zmc2V0ID0gJXUsIHNpemUgPSAldSIsIGZiLT5vZmZzZXQsIGZiLT5zaXplKTsKKwlEUk1fREVCVUcoIm9mZnNldCA9ICV1LCBzaXplID0gJXVcbiIsIGZiLT5vZmZzZXQsIGZiLT5zaXplKTsKIAogCXJldHVybiAwOwogCkBAIC0xMTMsNyArMTEzLDcgQEAKIAlkZXZfcHJpdi0+dnJhbV9pbml0aWFsaXplZCA9IDA7CiAJZGV2X3ByaXYtPmFncF9pbml0aWFsaXplZCA9IDA7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci19CQorfQogCiBpbnQgdmlhX21lbV9hbGxvYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfdmlkZW8uYyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZpZGVvLmMKaW5kZXggYzE1ZTc1Yi4uNmVjMDRhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS92aWFfdmlkZW8uYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92aWRlby5jCkBAIC0zMyw3ICszMyw3IEBACiB7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCURSTV9ERUJVRygiXG4iKTsKIAogCWZvciAoaSA9IDA7IGkgPCBWSUFfTlJfWFZNQ19MT0NLUzsgKytpKSB7CiAJCURSTV9JTklUX1dBSVRRVUVVRSgmKGRldl9wcml2LT5kZWNvZGVyX3F1ZXVlW2ldKSk7CkBAIC03Myw3ICs3Myw3IEBACiAJZHJtX3ZpYV9zYXJlYV90ICpzQVByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlpbnQgcmV0ID0gMDsKIAotCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJRFJNX0RFQlVHKCJcbiIpOwogCiAJaWYgKGZ4LT5sb2NrID4gVklBX05SX1hWTUNfTE9DS1MpCiAJCXJldHVybiAtRUZBVUxUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2VwY2EuaCBiL2RyaXZlcnMvY2hhci9lcGNhLmgKaW5kZXggYTI5NzIzOC4uM2M3N2MwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2VwY2EuaAorKysgYi9kcml2ZXJzL2NoYXIvZXBjYS5oCkBAIC03Nyw3ICs3Nyw2IEBACiAjZGVmaW5lIE9OICAgICAgICAgMQogCiAjZGVmaW5lIEZFUFRJTUVPVVQgMjAwMDAwICAKLSNkZWZpbmUgU0VSSUFMX1RZUEVfTk9STUFMICAxCiAjZGVmaW5lIFNFUklBTF9UWVBFX0lORk8gICAgMwogI2RlZmluZSBFUENBX0VWRU5UX0hBTkdVUCAgIDEKICNkZWZpbmUgRVBDQV9NQUdJQyAgICAgICAgICAweDVjNmRmMTA0TApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2VzcC5jIGIvZHJpdmVycy9jaGFyL2VzcC5jCmluZGV4IDI4NjA3NzYuLmMwMWUyNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9lc3AuYworKysgYi9kcml2ZXJzL2NoYXIvZXNwLmMKQEAgLTExMSw5ICsxMTEsNiBAQAogCiBzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmVzcF9kcml2ZXI7CiAKLS8qIHNlcmlhbCBzdWJ0eXBlIGRlZmluaXRpb25zICovCi0jZGVmaW5lIFNFUklBTF9UWVBFX05PUk1BTAkxCi0KIC8qCiAgKiBTZXJpYWwgZHJpdmVyIGNvbmZpZ3VyYXRpb24gc2VjdGlvbi4gIEhlcmUgYXJlIHRoZSB2YXJpb3VzIG9wdGlvbnM6CiAgKgpAQCAtMjQ1LDE3ICsyNDIsNiBAQAogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCi0vKgotICogVGhpcyByb3V0aW5lIGlzIHVzZWQgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyIHRvIHNjaGVkdWxlCi0gKiBwcm9jZXNzaW5nIGluIHRoZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgcG9ydGlvbiBvZiB0aGUgZHJpdmVyLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcnNfc2NoZWRfZXZlbnQoc3RydWN0IGVzcF9zdHJ1Y3QgKmluZm8sCi0JCQkJICBpbnQgZXZlbnQpCi17Ci0JaW5mby0+ZXZlbnQgfD0gMSA8PCBldmVudDsKLQlzY2hlZHVsZV93b3JrKCZpbmZvLT50cXVldWUpOwotfQotCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBpb19sb2NrKTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZXNwX3Bpb19idWZmZXIgKmdldF9waW9fYnVmZmVyKHZvaWQpCkBAIC00NzcsNyArNDYzLDggQEAKIAl9CiAKIAlpZiAoaW5mby0+eG1pdF9jbnQgPCBXQUtFVVBfQ0hBUlMpIHsKLQkJcnNfc2NoZWRfZXZlbnQoaW5mbywgRVNQX0VWRU5UX1dSSVRFX1dBS0VVUCk7CisJCWlmIChpbmZvLT50dHkpCisJCQl0dHlfd2FrZXVwKGluZm8tPnR0eSk7CiAKICNpZmRlZiBTRVJJQUxfREVCVUdfSU5UUgogCQlwcmludGsoIlRIUkUuLi4iKTsKQEAgLTUxNSw3ICs1MDIsOCBAQAogCWluZm8tPnhtaXRfdGFpbCA9IChpbmZvLT54bWl0X3RhaWwgKyBkbWFfYnl0ZXMpICYgKEVTUF9YTUlUX1NJWkUgLSAxKTsKIAogCWlmIChpbmZvLT54bWl0X2NudCA8IFdBS0VVUF9DSEFSUykgewotCQlyc19zY2hlZF9ldmVudChpbmZvLCBFU1BfRVZFTlRfV1JJVEVfV0FLRVVQKTsKKwkJaWYgKGluZm8tPnR0eSkKKwkJCXR0eV93YWtldXAoaW5mby0+dHR5KTsKIAogI2lmZGVmIFNFUklBTF9ERUJVR19JTlRSCiAJCXByaW50aygiVEhSRS4uLiIpOwpAQCAtNjA3LDcgKzU5NSw3IEBACiAjaWZkZWYgU0VSSUFMX0RFQlVHX09QRU4KIAkJCXByaW50aygic2NoZWR1bGluZyBoYW5ndXAuLi4iKTsKICNlbmRpZgotCQkJc2NoZWR1bGVfd29yaygmaW5mby0+dHF1ZXVlX2hhbmd1cCk7CisJCQl0dHlfaGFuZ3VwKGluZm8tPnR0eSk7CiAJCX0KIAl9CiB9CkBAIC03MjMsNDEgKzcxMSw2IEBACiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIAotc3RhdGljIHZvaWQgZG9fc29mdGludChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGVzcF9zdHJ1Y3QJKmluZm8gPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGVzcF9zdHJ1Y3QsIHRxdWV1ZSk7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKLQkKLQl0dHkgPSBpbmZvLT50dHk7Ci0JaWYgKCF0dHkpCi0JCXJldHVybjsKLQotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRVNQX0VWRU5UX1dSSVRFX1dBS0VVUCwgJmluZm8tPmV2ZW50KSkgewotCQl0dHlfd2FrZXVwKHR0eSk7Ci0JfQotfQotCi0vKgotICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHRoZSBzY2hlZHVsZXIgdHF1ZXVlIHdoZW4gdGhlIGludGVycnVwdAotICogcm91dGluZSBoYXMgc2lnbmFsbGVkIHRoYXQgYSBoYW5ndXAgaGFzIG9jY3VycmVkLiAgVGhlIHBhdGggb2YKLSAqIGhhbmd1cCBwcm9jZXNzaW5nIGlzOgotICoKLSAqIAlzZXJpYWwgaW50ZXJydXB0IHJvdXRpbmUgLT4gKHNjaGVkdWxlciB0cXVldWUpIC0+Ci0gKiAJZG9fc2VyaWFsX2hhbmd1cCgpIC0+IHR0eS0+aGFuZ3VwKCkgLT4gZXNwX2hhbmd1cCgpCi0gKiAKLSAqLwotc3RhdGljIHZvaWQgZG9fc2VyaWFsX2hhbmd1cChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGVzcF9zdHJ1Y3QJKmluZm8gPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGVzcF9zdHJ1Y3QsIHRxdWV1ZV9oYW5ndXApOwotCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7Ci0JCi0JdHR5ID0gaW5mby0+dHR5OwotCWlmICh0dHkpCi0JCXR0eV9oYW5ndXAodHR5KTsKLX0KLQogLyoKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogTG93IGxldmVsIHV0aWxpdHkgc3Vicm91dGluZXMgZm9yIHRoZSBzZXJpYWwgZHJpdmVyOiAgcm91dGluZXMgdG8KQEAgLTIwNDEsNyArMTk5NCw2IEBACiAJCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKIAl0dHlfbGRpc2NfZmx1c2godHR5KTsKIAl0dHktPmNsb3NpbmcgPSAwOwotCWluZm8tPmV2ZW50ID0gMDsKIAlpbmZvLT50dHkgPSBOVUxMOwogCiAJaWYgKGluZm8tPmJsb2NrZWRfb3BlbikgewpAQCAtMjEwOSw3ICsyMDYxLDYgQEAKIAkKIAlyc19mbHVzaF9idWZmZXIodHR5KTsKIAlzaHV0ZG93bihpbmZvKTsKLQlpbmZvLT5ldmVudCA9IDA7CiAJaW5mby0+Y291bnQgPSAwOwogCWluZm8tPmZsYWdzICY9IH5BU1lOQ19OT1JNQUxfQUNUSVZFOwogCWluZm8tPnR0eSA9IE5VTEw7CkBAIC0yNDk1LDggKzI0NDYsNiBAQAogCQlpbmZvLT5tYWdpYyA9IEVTUF9NQUdJQzsKIAkJaW5mby0+Y2xvc2VfZGVsYXkgPSA1KkhaLzEwOwogCQlpbmZvLT5jbG9zaW5nX3dhaXQgPSAzMCpIWjsKLQkJSU5JVF9XT1JLKCZpbmZvLT50cXVldWUsIGRvX3NvZnRpbnQpOwotCQlJTklUX1dPUksoJmluZm8tPnRxdWV1ZV9oYW5ndXAsIGRvX3NlcmlhbF9oYW5ndXApOwogCQlpbmZvLT5jb25maWcucnhfdGltZW91dCA9IHJ4X3RpbWVvdXQ7CiAJCWluZm8tPmNvbmZpZy5mbG93X29uID0gZmxvd19vbjsKIAkJaW5mby0+Y29uZmlnLmZsb3dfb2ZmID0gZmxvd19vZmY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaThrLmMgYi9kcml2ZXJzL2NoYXIvaThrLmMKaW5kZXggMTc5MjIzYS4uODYwOWI4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2k4ay5jCisrKyBiL2RyaXZlcnMvY2hhci9pOGsuYwpAQCAtMTEzLDYgKzExMywzMyBAQAogCWludCByYzsKIAlpbnQgZWF4ID0gcmVncy0+ZWF4OwogCisjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQorCWFzbSgicHVzaHEgJSVyYXhcblx0IgorCQkibW92bCAwKCUlcmF4KSwlJWVkeFxuXHQiCisJCSJwdXNocSAlJXJkeFxuXHQiCisJCSJtb3ZsIDQoJSVyYXgpLCUlZWJ4XG5cdCIKKwkJIm1vdmwgOCglJXJheCksJSVlY3hcblx0IgorCQkibW92bCAxMiglJXJheCksJSVlZHhcblx0IgorCQkibW92bCAxNiglJXJheCksJSVlc2lcblx0IgorCQkibW92bCAyMCglJXJheCksJSVlZGlcblx0IgorCQkicG9wcSAlJXJheFxuXHQiCisJCSJvdXQgJSVhbCwkMHhiMlxuXHQiCisJCSJvdXQgJSVhbCwkMHg4NFxuXHQiCisJCSJ4Y2hncSAlJXJheCwoJSVyc3ApXG5cdCIKKwkJIm1vdmwgJSVlYngsNCglJXJheClcblx0IgorCQkibW92bCAlJWVjeCw4KCUlcmF4KVxuXHQiCisJCSJtb3ZsICUlZWR4LDEyKCUlcmF4KVxuXHQiCisJCSJtb3ZsICUlZXNpLDE2KCUlcmF4KVxuXHQiCisJCSJtb3ZsICUlZWRpLDIwKCUlcmF4KVxuXHQiCisJCSJwb3BxICUlcmR4XG5cdCIKKwkJIm1vdmwgJSVlZHgsMCglJXJheClcblx0IgorCQkibGFoZlxuXHQiCisJCSJzaHJsICQ4LCUlZWF4XG5cdCIKKwkJImFuZGwgJDEsJSVlYXhcbiIKKwkJOiI9YSIocmMpCisJCTogICAgImEiKHJlZ3MpCisJCTogICAgIiVlYngiLCAiJWVjeCIsICIlZWR4IiwgIiVlc2kiLCAiJWVkaSIsICJtZW1vcnkiKTsKKyNlbHNlCiAJYXNtKCJwdXNobCAlJWVheFxuXHQiCiAJICAgICJtb3ZsIDAoJSVlYXgpLCUlZWR4XG5cdCIKIAkgICAgInB1c2ggJSVlZHhcblx0IgpAQCAtMTM3LDcgKzE2NCw3IEBACiAJICAgICJhbmRsICQxLCUlZWF4XG4iOiI9YSIocmMpCiAJICAgIDogICAgImEiKHJlZ3MpCiAJICAgIDogICAgIiVlYngiLCAiJWVjeCIsICIlZWR4IiwgIiVlc2kiLCAiJWVkaSIsICJtZW1vcnkiKTsKLQorI2VuZGlmCiAJaWYgKHJjICE9IDAgfHwgKHJlZ3MtPmVheCAmIDB4ZmZmZikgPT0gMHhmZmZmIHx8IHJlZ3MtPmVheCA9PSBlYXgpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC00NDYsNiArNDczLDEzIEBACiAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1NMDYxIiksCiAJCX0sCiAJfSwKKwl7CisJCS5pZGVudCA9ICJEZWxsIEluc3Bpcm9uIDMiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNUDA2MSIpLAorCQl9LAorCX0sCiAJeyB9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAyL2lwMm1haW4uYyBiL2RyaXZlcnMvY2hhci9pcDIvaXAybWFpbi5jCmluZGV4IDBmNDljY2YwLi5iMWQ2Y2FkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXAyL2lwMm1haW4uYworKysgYi9kcml2ZXJzL2NoYXIvaXAyL2lwMm1haW4uYwpAQCAtMTUzLDkgKzE1Myw2IEBACiBzdGF0aWMgY2hhciAqcGNEcml2ZXJfbmFtZSAgID0gImlwMiI7CiBzdGF0aWMgY2hhciAqcGNJcGwgICAgCQkgPSAiaXAyaXBsIjsKIAotLyogU2VyaWFsIHN1YnR5cGUgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgU0VSSUFMX1RZUEVfTk9STUFMICAgIDEKLQogLy8gY2hlZXp5IGtsdWRnZSBvciBnZW5pdXMgLSB5b3UgZGVjaWRlPwogaW50IGlwMl9sb2FkbWFpbihpbnQgKiwgaW50ICosIHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyICpGaXBfZmlybXdhcmU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMgYi9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMKaW5kZXggMWYyN2JlMS4uYzY0NTQ1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lzdGFsbGlvbi5jCisrKyBiL2RyaXZlcnMvY2hhci9pc3RhbGxpb24uYwpAQCAtNjI3LDcgKzYyNyw2IEBACiBzdGF0aWMgaW50CXN0bGlfcmF3b3BlbihzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCwgc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgdW5zaWduZWQgbG9uZyBhcmcsIGludCB3YWl0KTsKIHN0YXRpYyBpbnQJc3RsaV9yYXdjbG9zZShzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCwgc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgdW5zaWduZWQgbG9uZyBhcmcsIGludCB3YWl0KTsKIHN0YXRpYyBpbnQJc3RsaV93YWl0Y2FycmllcihzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCwgc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgc3RydWN0IGZpbGUgKmZpbHApOwotc3RhdGljIHZvaWQJc3RsaV9kb2hhbmd1cChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CiBzdGF0aWMgaW50CXN0bGlfc2V0cG9ydChzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwKTsKIHN0YXRpYyBpbnQJc3RsaV9jbWR3YWl0KHN0cnVjdCBzdGxpYnJkICpicmRwLCBzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwLCB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqYXJnLCBpbnQgc2l6ZSwgaW50IGNvcHliYWNrKTsKIHN0YXRpYyB2b2lkCXN0bGlfc2VuZGNtZChzdHJ1Y3Qgc3RsaWJyZCAqYnJkcCwgc3RydWN0IHN0bGlwb3J0ICpwb3J0cCwgdW5zaWduZWQgbG9uZyBjbWQsIHZvaWQgKmFyZywgaW50IHNpemUsIGludCBjb3B5YmFjayk7CkBAIC0xODI0LDI1ICsxODIzLDYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqCVNjaGVkdWxlciBjYWxsZWQgaGFuZyB1cCByb3V0aW5lLiBUaGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBzY2hlZHVsZXIsCi0gKglub3QgZGlyZWN0IGZyb20gdGhlIGRyaXZlciAicG9sbCIgcm91dGluZS4gV2UgY2FuJ3QgY2FsbCBpdCB0aGVyZQotICoJc2luY2UgdGhlIHJlYWwgbG9jYWwgaGFuZ3VwIGNvZGUgd2lsbCBlbmFibGUvZGlzYWJsZSB0aGUgYm9hcmQgYW5kCi0gKglvdGhlciB0aGluZ3MgdGhhdCB3ZSBjYW4ndCBkbyB3aGlsZSBoYW5kbGluZyB0aGUgcG9sbC4gTXVjaCBlYXNpZXIKLSAqCXRvIGRlYWwgd2l0aCBpdCBzb21lIHRpbWUgbGF0ZXIgKGRvbid0IHJlYWxseSBjYXJlIHdoZW4sIGhhbmd1cHMKLSAqCWFyZW4ndCB0aGF0IHRpbWUgY3JpdGljYWwpLgotICovCi0KLXN0YXRpYyB2b2lkIHN0bGlfZG9oYW5ndXAoc3RydWN0IHdvcmtfc3RydWN0ICp1Z2x5X2FwaSkKLXsKLQlzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwID0gY29udGFpbmVyX29mKHVnbHlfYXBpLCBzdHJ1Y3Qgc3RsaXBvcnQsIHRxaGFuZ3VwKTsKLQlpZiAocG9ydHAtPnR0eSAhPSBOVUxMKSB7Ci0JCXR0eV9oYW5ndXAocG9ydHAtPnR0eSk7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCiAgKglIYW5ndXAgdGhpcyBwb3J0LiBUaGlzIGlzIHByZXR0eSBtdWNoIGxpa2UgY2xvc2luZyB0aGUgcG9ydCwgb25seQogICoJYSBsaXR0bGUgbW9yZSBicnV0YWwuIE5vIHdhaXRpbmcgZm9yIGRhdGEgdG8gZHJhaW4uIFNodXRkb3duIHRoZQogICoJcG9ydCBhbmQgbWF5YmUgZHJvcCBzaWduYWxzLiBUaGlzIGlzIHJhdGhlciB0cmlja3kgcmVhbGx5LiBXZSB3YW50CkBAIC0yNDA1LDcgKzIzODUsNyBAQAogCQkJICAgICgocG9ydHAtPnNpZ3MgJiBUSU9DTV9DRCkgPT0gMCkpIHsKIAkJCQlpZiAocG9ydHAtPmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpIHsKIAkJCQkJaWYgKHR0eSkKLQkJCQkJCXNjaGVkdWxlX3dvcmsoJnBvcnRwLT50cWhhbmd1cCk7CisJCQkJCQl0dHlfaGFuZ3VwKHR0eSk7CiAJCQkJfQogCQkJfQogCQl9CkBAIC0yNzMzLDcgKzI3MTMsNiBAQAogCQlwb3J0cC0+YmF1ZF9iYXNlID0gU1RMX0JBVURCQVNFOwogCQlwb3J0cC0+Y2xvc2VfZGVsYXkgPSBTVExfQ0xPU0VERUxBWTsKIAkJcG9ydHAtPmNsb3Npbmdfd2FpdCA9IDMwICogSFo7Ci0JCUlOSVRfV09SSygmcG9ydHAtPnRxaGFuZ3VwLCBzdGxpX2RvaGFuZ3VwKTsKIAkJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydHAtPm9wZW5fd2FpdCk7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBvcnRwLT5jbG9zZV93YWl0KTsKIAkJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydHAtPnJhd193YWl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9rZXlib2FyZC5jIGIvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMKaW5kZXggZmM1NGQyMy4uNGRiZDM0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMKKysrIGIvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMKQEAgLTM4LDcgKzM4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9rYmRfa2Vybi5oPgogI2luY2x1ZGUgPGxpbnV4L2tiZF9kaWFjci5oPgogI2luY2x1ZGUgPGxpbnV4L3Z0X2tlcm4uaD4KLSNpbmNsdWRlIDxsaW51eC9jb25zb2xlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgpAQCAtMTk0LDcgKzE5Myw3IEBACiAJaW50IGVycm9yID0gLUVOT0RFVjsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoaGFuZGxlLCAma2JkX2hhbmRsZXIuaF9saXN0LCBoX25vZGUpIHsKLQkJZXJyb3IgPSBoYW5kbGUtPmRldi0+Z2V0a2V5Y29kZShoYW5kbGUtPmRldiwgc2NhbmNvZGUsICZrZXljb2RlKTsKKwkJZXJyb3IgPSBpbnB1dF9nZXRfa2V5Y29kZShoYW5kbGUtPmRldiwgc2NhbmNvZGUsICZrZXljb2RlKTsKIAkJaWYgKCFlcnJvcikKIAkJCXJldHVybiBrZXljb2RlOwogCX0KQEAgLTIwOCw3ICsyMDcsNyBAQAogCWludCBlcnJvciA9IC1FTk9ERVY7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhhbmRsZSwgJmtiZF9oYW5kbGVyLmhfbGlzdCwgaF9ub2RlKSB7Ci0JCWVycm9yID0gaGFuZGxlLT5kZXYtPnNldGtleWNvZGUoaGFuZGxlLT5kZXYsIHNjYW5jb2RlLCBrZXljb2RlKTsKKwkJZXJyb3IgPSBpbnB1dF9zZXRfa2V5Y29kZShoYW5kbGUtPmRldiwgc2NhbmNvZGUsIGtleWNvZGUpOwogCQlpZiAoIWVycm9yKQogCQkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21iY3MuYyBiL2RyaXZlcnMvY2hhci9tYmNzLmMKaW5kZXggM2M1ODAyYS4uZjQ3MTZhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21iY3MuYworKysgYi9kcml2ZXJzL2NoYXIvbWJjcy5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtMjgxLDcgKzI4Miw3IEBACiAJdm9pZCAqbW1yX2Jhc2UgPSBzb2Z0LT5tbXJfYmFzZTsKIAl1bmlvbiBjbV9jb250cm9sIGNtX2NvbnRyb2w7CiAKLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzb2Z0LT5hbGdvbG9jaykpCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc29mdC0+YWxnb2xvY2spKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCiAJYXRvbWljX3NldCgmc29mdC0+YWxnb19kb25lLCAwKTsKQEAgLTI5OCw3ICsyOTksNyBAQAogCWNtX2NvbnRyb2wuYWxnX2dvID0gMTsKIAlNQkNTX01NUl9TRVQobW1yX2Jhc2UsIE1CQ1NfQ01fQ09OVFJPTCwgY21fY29udHJvbC5jbV9jb250cm9sX3JlZyk7CiAKLQl1cCgmc29mdC0+YWxnb2xvY2spOworCW11dGV4X3VubG9jaygmc29mdC0+YWxnb2xvY2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMDksNyArMzEwLDcgQEAKIHsKIAlpbnQgcnYgPSAwOwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmc29mdC0+ZG1hd3JpdGVsb2NrKSkKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzb2Z0LT5kbWF3cml0ZWxvY2spKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCiAJYXRvbWljX3NldCgmc29mdC0+ZG1hd3JpdGVfZG9uZSwgMCk7CkBAIC0zMzUsNyArMzM2LDcgQEAKIAkqb2ZmICs9IGxlbjsKIAogZG1hd3JpdGVfZXhpdDoKLQl1cCgmc29mdC0+ZG1hd3JpdGVsb2NrKTsKKwltdXRleF91bmxvY2soJnNvZnQtPmRtYXdyaXRlbG9jayk7CiAKIAlyZXR1cm4gcnY7CiB9CkBAIC0zNDYsNyArMzQ3LDcgQEAKIHsKIAlpbnQgcnYgPSAwOwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmc29mdC0+ZG1hcmVhZGxvY2spKQorCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnNvZnQtPmRtYXJlYWRsb2NrKSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAogCWF0b21pY19zZXQoJnNvZnQtPmRtYXdyaXRlX2RvbmUsIDApOwpAQCAtMzcxLDcgKzM3Miw3IEBACiAJKm9mZiArPSBsZW47CiAKIGRtYXJlYWRfZXhpdDoKLQl1cCgmc29mdC0+ZG1hcmVhZGxvY2spOworCW11dGV4X3VubG9jaygmc29mdC0+ZG1hcmVhZGxvY2spOwogCiAJcmV0dXJuIHJ2OwogfQpAQCAtNzYyLDkgKzc2Myw5IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmc29mdC0+ZG1hcmVhZF9xdWV1ZSk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmc29mdC0+YWxnb19xdWV1ZSk7CiAKLQlpbml0X01VVEVYKCZzb2Z0LT5kbWF3cml0ZWxvY2spOwotCWluaXRfTVVURVgoJnNvZnQtPmRtYXJlYWRsb2NrKTsKLQlpbml0X01VVEVYKCZzb2Z0LT5hbGdvbG9jayk7CisJbXV0ZXhfaW5pdCgmc29mdC0+ZG1hd3JpdGVsb2NrKTsKKwltdXRleF9pbml0KCZzb2Z0LT5kbWFyZWFkbG9jayk7CisJbXV0ZXhfaW5pdCgmc29mdC0+YWxnb2xvY2spOwogCiAJbWJjc19nZXRkbWFfaW5pdCgmc29mdC0+Z2V0ZG1hKTsKIAltYmNzX3B1dGRtYV9pbml0KCZzb2Z0LT5wdXRkbWEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21iY3MuaCBiL2RyaXZlcnMvY2hhci9tYmNzLmgKaW5kZXggYzk5MDVhMy4uYmE2NzE1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21iY3MuaAorKysgYi9kcml2ZXJzL2NoYXIvbWJjcy5oCkBAIC01MzcsOSArNTM3LDkgQEAKIAlhdG9taWNfdCBkbWF3cml0ZV9kb25lOwogCWF0b21pY190IGRtYXJlYWRfZG9uZTsKIAlhdG9taWNfdCBhbGdvX2RvbmU7Ci0Jc3RydWN0IHNlbWFwaG9yZSBkbWF3cml0ZWxvY2s7Ci0Jc3RydWN0IHNlbWFwaG9yZSBkbWFyZWFkbG9jazsKLQlzdHJ1Y3Qgc2VtYXBob3JlIGFsZ29sb2NrOworCXN0cnVjdCBtdXRleCBkbWF3cml0ZWxvY2s7CisJc3RydWN0IG11dGV4IGRtYXJlYWRsb2NrOworCXN0cnVjdCBtdXRleCBhbGdvbG9jazsKIH07CiAKIHN0YXRpYyBpbnQgbWJjc19vcGVuKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBmaWxlICpmcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbW94YS5jIGIvZHJpdmVycy9jaGFyL21veGEuYwppbmRleCAyZmMyNTVhLi42NGI3YjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbW94YS5jCisrKyBiL2RyaXZlcnMvY2hhci9tb3hhLmMKQEAgLTIwNyw3ICsyMDcsNyBAQAogc3RhdGljIGludCBtb3hhX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcik7CiBzdGF0aWMgdm9pZCBtb3hhX3BvbGwodW5zaWduZWQgbG9uZyk7Ci1zdGF0aWMgdm9pZCBtb3hhX3NldF90dHlfcGFyYW0oc3RydWN0IHR0eV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBtb3hhX3NldF90dHlfcGFyYW0oc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGt0ZXJtaW9zICopOwogc3RhdGljIGludCBtb3hhX2Jsb2NrX3RpbGxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKiwKIAkJCSAgICBzdHJ1Y3QgbW94YV9wb3J0ICopOwogc3RhdGljIHZvaWQgbW94YV9zZXR1cF9lbXB0eV9ldmVudChzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKQEAgLTUwMCw3ICs1MDAsNyBAQAogCWNoLT50dHkgPSB0dHk7CiAJaWYgKCEoY2gtPmFzeW5jZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHsKIAkJY2gtPnN0YXR1c2ZsYWdzID0gMDsKLQkJbW94YV9zZXRfdHR5X3BhcmFtKHR0eSk7CisJCW1veGFfc2V0X3R0eV9wYXJhbSh0dHksIHR0eS0+dGVybWlvcyk7CiAJCU1veGFQb3J0TGluZUN0cmwoY2gtPnBvcnQsIDEsIDEpOwogCQlNb3hhUG9ydEVuYWJsZShjaC0+cG9ydCk7CiAJCWNoLT5hc3luY2ZsYWdzIHw9IEFTWU5DX0lOSVRJQUxJWkVEOwpAQCAtODAzLDcgKzgwMyw3IEBACiAKIAlpZiAoY2ggPT0gTlVMTCkKIAkJcmV0dXJuOwotCW1veGFfc2V0X3R0eV9wYXJhbSh0dHkpOworCW1veGFfc2V0X3R0eV9wYXJhbSh0dHksIG9sZF90ZXJtaW9zKTsKIAlpZiAoIShvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkgJiYKIAkgICAgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkpCiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPm9wZW5fd2FpdCk7CkBAIC05MDMsMTEgKzkwMywxMSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCBtb3hhX3NldF90dHlfcGFyYW0oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3N0YXRpYyB2b2lkIG1veGFfc2V0X3R0eV9wYXJhbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQogewogCXJlZ2lzdGVyIHN0cnVjdCBrdGVybWlvcyAqdHM7CiAJc3RydWN0IG1veGFfcG9ydCAqY2g7Ci0JaW50IHJ0cywgY3RzLCB0eGZsb3csIHJ4ZmxvdywgeGFueTsKKwlpbnQgcnRzLCBjdHMsIHR4ZmxvdywgcnhmbG93LCB4YW55LCBiYXVkOwogCiAJY2ggPSAoc3RydWN0IG1veGFfcG9ydCAqKSB0dHktPmRyaXZlcl9kYXRhOwogCXRzID0gdHR5LT50ZXJtaW9zOwpAQCAtOTI0LDggKzkyNCwxNSBAQAogCQlyeGZsb3cgPSAxOwogCWlmICh0cy0+Y19pZmxhZyAmIElYQU5ZKQogCQl4YW55ID0gMTsKKworCS8qIENsZWFyIHRoZSBmZWF0dXJlcyB3ZSBkb24ndCBzdXBwb3J0ICovCisJdHMtPmNfY2ZsYWcgJj0gfkNNU1BBUjsKIAlNb3hhUG9ydEZsb3dDdHJsKGNoLT5wb3J0LCBydHMsIGN0cywgdHhmbG93LCByeGZsb3csIHhhbnkpOwotCU1veGFQb3J0U2V0VGVybWlvKGNoLT5wb3J0LCB0cywgdHR5X2dldF9iYXVkX3JhdGUodHR5KSk7CisJYmF1ZCA9IE1veGFQb3J0U2V0VGVybWlvKGNoLT5wb3J0LCB0cywgdHR5X2dldF9iYXVkX3JhdGUodHR5KSk7CisJaWYgKGJhdWQgPT0gLTEpCisJCWJhdWQgPSB0dHlfdGVybWlvc19iYXVkX3JhdGUob2xkX3Rlcm1pb3MpOworCS8qIE5vdCBwdXQgdGhlIGJhdWQgcmF0ZSBpbnRvIHRoZSB0ZXJtaW9zIGRhdGEgKi8KKwl0dHlfZW5jb2RlX2JhdWRfcmF0ZSh0dHksIGJhdWQsIGJhdWQpOwogfQogCiBzdGF0aWMgaW50IG1veGFfYmxvY2tfdGlsbF9yZWFkeShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCwKQEAgLTIwNjUsNyArMjA3Miw3IEBACiAJCWlmIChiYXVkID49IDkyMTYwMEwpCiAJCQlyZXR1cm4gKC0xKTsKIAl9Ci0JTW94YVBvcnRTZXRCYXVkKHBvcnQsIGJhdWQpOworCWJhdWQgPSBNb3hhUG9ydFNldEJhdWQocG9ydCwgYmF1ZCk7CiAKIAlpZiAodGVybWlvLT5jX2lmbGFnICYgKElYT04gfCBJWE9GRiB8IElYQU5ZKSkgewogCQl3cml0ZWIodGVybWlvLT5jX2NjW1ZTVEFSVF0sIG9mc0FkZHIgKyBGdW5jQXJnKTsKQEAgLTIwNzQsNyArMjA4MSw3IEBACiAJCW1veGFfd2FpdF9maW5pc2gob2ZzQWRkcik7CiAKIAl9Ci0JcmV0dXJuICgwKTsKKwlyZXR1cm4gKGJhdWQpOwogfQogCiBpbnQgTW94YVBvcnRHZXRMaW5lT3V0KGludCBwb3J0LCBpbnQgKmR0clN0YXRlLCBpbnQgKnJ0c1N0YXRlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL214c2VyLmMgYi9kcml2ZXJzL2NoYXIvbXhzZXIuYwppbmRleCA0NzQyMDc4Li42OGMyZTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbXhzZXIuYworKysgYi9kcml2ZXJzL2NoYXIvbXhzZXIuYwpAQCAtMSw0MSArMSwyNCBAQAogLyoKICAqICAgICAgICAgIG14c2VyLmMgIC0tIE1PWEEgU21hcnRpby9JbmR1c3RpbyBmYW1pbHkgbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCiAgKgotICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSAgTW94YSBUZWNobm9sb2dpZXMgKHN1cHBvcnRAbW94YS5jb20udHcpLgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiAgTW94YSBUZWNobm9sb2dpZXMgKHN1cHBvcnRAbW94YS5jb20pLgorICoJQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggIEppcmkgU2xhYnkgPGppcmlzbGFieUBnbWFpbC5jb20+CiAgKgotICogICAgICBUaGlzIGNvZGUgaXMgbG9vc2VseSBiYXNlZCBvbiB0aGUgTGludXggc2VyaWFsIGRyaXZlciwgd3JpdHRlbiBieQotICogICAgICBMaW51cyBUb3J2YWxkcywgVGhlb2RvcmUgVCdzbyBhbmQgb3RoZXJzLgorICogICAgICBUaGlzIGNvZGUgaXMgbG9vc2VseSBiYXNlZCBvbiB0aGUgMS44IG1veGEgZHJpdmVyIHdoaWNoIGlzIGJhc2VkIG9uCisgKglMaW51eCBzZXJpYWwgZHJpdmVyLCB3cml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzLCBUaGVvZG9yZSBUJ3NvIGFuZAorICoJb3RoZXJzLgogICoKICAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqCi0gKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKglPcmlnaW5hbCByZWxlYXNlCTEwLzI2LzAwCi0gKgotICoJMDIvMDYvMDEJU3VwcG9ydCBNT1hBIEluZHVzdGlvIGZhbWlseSBib2FyZHMuCi0gKgkwMi8wNi8wMQlTdXBwb3J0IFRJT0NHSUNPVU5ULgotICoJMDIvMDYvMDEJRml4IHRoZSBwcm9ibGVtIGZvciBjb25uZWN0aW5nIHRvIHNlcmlhbCBtb3VzZS4KLSAqCTAyLzA2LzAxCUZpeCB0aGUgcHJvYmxlbSBmb3IgSC9XIGZsb3cgY29udHJvbC4KLSAqCTAyLzA2LzAxCUZpeCB0aGUgY29tcGxpbmcgd2FybmluZyB3aGVuIENPTkZJR19QQ0kKLSAqCQkJZG9uJ3QgYmUgZGVmaW5lZC4KLSAqCiAgKglGZWQgdGhyb3VnaCBhIGNsZWFudXAsIGluZGVudCBhbmQgcmVtb3ZlIG9mIG5vbiAyLjYgY29kZSBieSBBbGFuIENveAogICoJPGFsYW5AcmVkaGF0LmNvbT4uIFRoZSBvcmlnaW5hbCAxLjggY29kZSBpcyBhdmFpbGFibGUgb24gd3d3Lm1veGEuY29tLgogICoJLSBGaXhlZCB4ODZfNjQgY2xlYW5uZXNzCiAgKgktIEZpeGVkIHNsZWVwIHdpdGggc3BpbmxvY2sgaGVsZCBpbiBteHNlcl9zZW5kX2JyZWFrCiAgKi8KIAotCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KQEAgLTY0LDMzICs0NywzNyBAQAogCiAjaW5jbHVkZSAibXhzZXIuaCIKIAotI2RlZmluZQlNWFNFUl9WRVJTSU9OCSIxLjgiCisjZGVmaW5lCU1YU0VSX1ZFUlNJT04JIjIuMC4zIgkJLyogMS4xMSAqLwogI2RlZmluZQlNWFNFUk1BSk9SCSAxNzQKICNkZWZpbmUJTVhTRVJDVU1BSk9SCSAxNzUKIAotI2RlZmluZQlNWFNFUl9FVkVOVF9UWExPVwkxCi0jZGVmaW5lCU1YU0VSX0VWRU5UX0hBTkdVUAkyCi0KICNkZWZpbmUgTVhTRVJfQk9BUkRTCQk0CS8qIE1heC4gYm9hcmRzICovCi0jZGVmaW5lIE1YU0VSX1BPUlRTCQkzMgkvKiBNYXguIHBvcnRzICovCiAjZGVmaW5lIE1YU0VSX1BPUlRTX1BFUl9CT0FSRAk4CS8qIE1heC4gcG9ydHMgcGVyIGJvYXJkICovCi0jZGVmaW5lIE1YU0VSX0lTUl9QQVNTX0xJTUlUCTI1NgorI2RlZmluZSBNWFNFUl9QT1JUUwkJKE1YU0VSX0JPQVJEUyAqIE1YU0VSX1BPUlRTX1BFUl9CT0FSRCkKKyNkZWZpbmUgTVhTRVJfSVNSX1BBU1NfTElNSVQJMTAwCiAKICNkZWZpbmUJTVhTRVJfRVJSX0lPQUREUgktMQogI2RlZmluZQlNWFNFUl9FUlJfSVJRCQktMgogI2RlZmluZQlNWFNFUl9FUlJfSVJRX0NPTkZMSVQJLTMKICNkZWZpbmUJTVhTRVJfRVJSX1ZFQ1RPUgktNAogCi0jZGVmaW5lIFNFUklBTF9UWVBFX05PUk1BTAkxCi0jZGVmaW5lIFNFUklBTF9UWVBFX0NBTExPVVQJMgorLypDaGVja0lzTW94YU11c3QgcmV0dXJuIHZhbHVlKi8KKyNkZWZpbmUgTU9YQV9PVEhFUl9VQVJUCQkweDAwCisjZGVmaW5lIE1PWEFfTVVTVF9NVTE1MF9IV0lECTB4MDEKKyNkZWZpbmUgTU9YQV9NVVNUX01VODYwX0hXSUQJMHgwMgogCiAjZGVmaW5lIFdBS0VVUF9DSEFSUwkJMjU2CiAKICNkZWZpbmUgVUFSVF9NQ1JfQUZFCQkweDIwCiAjZGVmaW5lIFVBUlRfTFNSX1NQRUNJQUwJMHgxRQogCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ0IxMDgJMHgxMDgwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ0IxMTQJMHgxMTQyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1AxMTRVTAkweDExNDMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DQjEzNEkJMHgxMzQxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ1AxMzhVCTB4MTM4MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BPUzEwNFVMCTB4MTA0NAogCi0jZGVmaW5lIElSUV9UKGluZm8pICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TSEFSRV9JUlEpID8gSVJRRl9TSEFSRUQgOiBJUlFGX0RJU0FCTEVEKQogCiAjZGVmaW5lIEMxNjhfQVNJQ19JRCAgICAxCiAjZGVmaW5lIEMxMDRfQVNJQ19JRCAgICAyCkBAIC05OSw4OCArODYsMTEgQEAKICNkZWZpbmUgQ0kxMzRfQVNJQ19JRAkzCiAjZGVmaW5lIENJMTA0Sl9BU0lDX0lEICA1CiAKLWVudW0gewotCU1YU0VSX0JPQVJEX0MxNjhfSVNBID0gMSwKLQlNWFNFUl9CT0FSRF9DMTA0X0lTQSwKLQlNWFNFUl9CT0FSRF9DSTEwNEosCi0JTVhTRVJfQk9BUkRfQzE2OF9QQ0ksCi0JTVhTRVJfQk9BUkRfQzEwNF9QQ0ksCi0JTVhTRVJfQk9BUkRfQzEwMl9JU0EsCi0JTVhTRVJfQk9BUkRfQ0kxMzIsCi0JTVhTRVJfQk9BUkRfQ0kxMzQsCi0JTVhTRVJfQk9BUkRfQ1AxMzIsCi0JTVhTRVJfQk9BUkRfQ1AxMTQsCi0JTVhTRVJfQk9BUkRfQ1QxMTQsCi0JTVhTRVJfQk9BUkRfQ1AxMDIsCi0JTVhTRVJfQk9BUkRfQ1AxMDRVLAotCU1YU0VSX0JPQVJEX0NQMTY4VSwKLQlNWFNFUl9CT0FSRF9DUDEzMlUsCi0JTVhTRVJfQk9BUkRfQ1AxMzRVLAotCU1YU0VSX0JPQVJEX0NQMTA0SlUsCi0JTVhTRVJfQk9BUkRfUkM3MDAwLAotCU1YU0VSX0JPQVJEX0NQMTE4VSwKLQlNWFNFUl9CT0FSRF9DUDEwMlVMLAotCU1YU0VSX0JPQVJEX0NQMTAyVSwKLX07Ci0KLXN0YXRpYyBjaGFyICpteHNlcl9icmRuYW1lW10gPSB7Ci0JIkMxNjggc2VyaWVzIiwKLQkiQzEwNCBzZXJpZXMiLAotCSJDSS0xMDRKIHNlcmllcyIsCi0JIkMxNjhIL1BDSSBzZXJpZXMiLAotCSJDMTA0SC9QQ0kgc2VyaWVzIiwKLQkiQzEwMiBzZXJpZXMiLAotCSJDSS0xMzIgc2VyaWVzIiwKLQkiQ0ktMTM0IHNlcmllcyIsCi0JIkNQLTEzMiBzZXJpZXMiLAotCSJDUC0xMTQgc2VyaWVzIiwKLQkiQ1QtMTE0IHNlcmllcyIsCi0JIkNQLTEwMiBzZXJpZXMiLAotCSJDUC0xMDRVIHNlcmllcyIsCi0JIkNQLTE2OFUgc2VyaWVzIiwKLQkiQ1AtMTMyVSBzZXJpZXMiLAotCSJDUC0xMzRVIHNlcmllcyIsCi0JIkNQLTEwNEpVIHNlcmllcyIsCi0JIk1veGEgVUM3MDAwIFNlcmlhbCIsCi0JIkNQLTExOFUgc2VyaWVzIiwKLQkiQ1AtMTAyVUwgc2VyaWVzIiwKLQkiQ1AtMTAyVSBzZXJpZXMiLAotfTsKLQotc3RhdGljIGludCBteHNlcl9udW1wb3J0c1tdID0gewotCTgsCQkJLyogQzE2OC1JU0EgKi8KLQk0LAkJCS8qIEMxMDQtSVNBICovCi0JNCwJCQkvKiBDSTEwNEogKi8KLQk4LAkJCS8qIEMxNjgtUENJICovCi0JNCwJCQkvKiBDMTA0LVBDSSAqLwotCTIsCQkJLyogQzEwMi1JU0EgKi8KLQkyLAkJCS8qIENJMTMyICovCi0JNCwJCQkvKiBDSTEzNCAqLwotCTIsCQkJLyogQ1AxMzIgKi8KLQk0LAkJCS8qIENQMTE0ICovCi0JNCwJCQkvKiBDVDExNCAqLwotCTIsCQkJLyogQ1AxMDIgKi8KLQk0LAkJCS8qIENQMTA0VSAqLwotCTgsCQkJLyogQ1AxNjhVICovCi0JMiwJCQkvKiBDUDEzMlUgKi8KLQk0LAkJCS8qIENQMTM0VSAqLwotCTQsCQkJLyogQ1AxMDRKVSAqLwotCTgsCQkJLyogUkM3MDAwICovCi0JOCwJCQkvKiBDUDExOFUgKi8KLQkyLAkJCS8qIENQMTAyVUwgKi8KLQkyLAkJCS8qIENQMTAyVSAqLwotfTsKLQotI2RlZmluZSBVQVJUX1RZUEVfTlVNCTIKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBHbW94YV91YXJ0X2lkW1VBUlRfVFlQRV9OVU1dID0gewotCU1PWEFfTVVTVF9NVTE1MF9IV0lELAotCU1PWEFfTVVTVF9NVTg2MF9IV0lECi19OworI2RlZmluZSBNWFNFUl9ISUdIQkFVRAkxCisjZGVmaW5lIE1YU0VSX0hBUzIJMgogCiAvKiBUaGlzIGlzIG9ubHkgZm9yIFBDSSAqLwotI2RlZmluZSBVQVJUX0lORk9fTlVNCTMKLXN0cnVjdCBteHBjaXVhcnRfaW5mbyB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHsKIAlpbnQgdHlwZTsKIAlpbnQgdHhfZmlmbzsKIAlpbnQgcnhfZmlmbzsKQEAgLTE4OSw1MSArOTksODUgQEAKIAlpbnQgcnhfdHJpZ2dlcjsKIAlpbnQgcnhfbG93X3dhdGVyOwogCWxvbmcgbWF4X2JhdWQ7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG14cGNpdWFydF9pbmZvIEdwY2lfdWFydF9pbmZvW1VBUlRfSU5GT19OVU1dID0geworfSBHcGNpX3VhcnRfaW5mb1tdID0gewogCXtNT1hBX09USEVSX1VBUlQsIDE2LCAxNiwgMTYsIDE0LCAxNCwgMSwgOTIxNjAwTH0sCiAJe01PWEFfTVVTVF9NVTE1MF9IV0lELCA2NCwgNjQsIDY0LCA0OCwgNDgsIDE2LCAyMzA0MDBMfSwKIAl7TU9YQV9NVVNUX01VODYwX0hXSUQsIDEyOCwgMTI4LCAxMjgsIDk2LCA5NiwgMzIsIDkyMTYwMEx9CiB9OworI2RlZmluZSBVQVJUX0lORk9fTlVNCUFSUkFZX1NJWkUoR3BjaV91YXJ0X2luZm8pCiAKLQotI2lmZGVmIENPTkZJR19QQ0kKLQotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG14c2VyX3BjaWJyZHNbXSA9IHsKLQl7UENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQzE2OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQzE2OF9QQ0l9LAotCXtQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DMTA0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNWFNFUl9CT0FSRF9DMTA0X1BDSX0sCi0Je1BDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTMyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNWFNFUl9CT0FSRF9DUDEzMn0sCi0Je1BDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTE0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNWFNFUl9CT0FSRF9DUDExNH0sCi0Je1BDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NUMTE0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNWFNFUl9CT0FSRF9DVDExNH0sCi0Je1BDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTAyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNWFNFUl9CT0FSRF9DUDEwMn0sCi0Je1BDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTA0VSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQ1AxMDRVfSwKLQl7UENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxNjhVLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNWFNFUl9CT0FSRF9DUDE2OFV9LAotCXtQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEzMlUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIE1YU0VSX0JPQVJEX0NQMTMyVX0sCi0Je1BDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTM0VSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQ1AxMzRVfSwKLQl7UENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMDRKVSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfQ1AxMDRKVX0sCi0Je1BDSV9WRU5ET1JfSURfTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX1JDNzAwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVhTRVJfQk9BUkRfUkM3MDAwfSwKLQl7UENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMThVLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNWFNFUl9CT0FSRF9DUDExOFV9LAotCXtQQ0lfVkVORE9SX0lEX01PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEwMlVMLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNWFNFUl9CT0FSRF9DUDEwMlVMfSwKLQl7UENJX1ZFTkRPUl9JRF9NT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMDJVLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBNWFNFUl9CT0FSRF9DUDEwMlV9LAotCXswfQorc3RydWN0IG14c2VyX2NhcmRpbmZvIHsKKwljaGFyICpuYW1lOworCXVuc2lnbmVkIGludCBucG9ydHM7CisJdW5zaWduZWQgaW50IGZsYWdzOwogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBteHNlcl9jYXJkaW5mbyBteHNlcl9jYXJkc1tdID0geworLyogMCovCXsgIkMxNjggc2VyaWVzIiwJOCwgfSwKKwl7ICJDMTA0IHNlcmllcyIsCTQsIH0sCisJeyAiQ0ktMTA0SiBzZXJpZXMiLAk0LCB9LAorCXsgIkMxNjhIL1BDSSBzZXJpZXMiLAk4LCB9LAorCXsgIkMxMDRIL1BDSSBzZXJpZXMiLAk0LCB9LAorLyogNSovCXsgIkMxMDIgc2VyaWVzIiwJNCwgTVhTRVJfSEFTMiB9LAkvKiBDMTAyLUlTQSAqLworCXsgIkNJLTEzMiBzZXJpZXMiLAk0LCBNWFNFUl9IQVMyIH0sCisJeyAiQ0ktMTM0IHNlcmllcyIsCTQsIH0sCisJeyAiQ1AtMTMyIHNlcmllcyIsCTIsIH0sCisJeyAiQ1AtMTE0IHNlcmllcyIsCTQsIH0sCisvKjEwKi8JeyAiQ1QtMTE0IHNlcmllcyIsCTQsIH0sCisJeyAiQ1AtMTAyIHNlcmllcyIsCTIsIE1YU0VSX0hJR0hCQVVEIH0sCisJeyAiQ1AtMTA0VSBzZXJpZXMiLAk0LCB9LAorCXsgIkNQLTE2OFUgc2VyaWVzIiwJOCwgfSwKKwl7ICJDUC0xMzJVIHNlcmllcyIsCTIsIH0sCisvKjE1Ki8JeyAiQ1AtMTM0VSBzZXJpZXMiLAk0LCB9LAorCXsgIkNQLTEwNEpVIHNlcmllcyIsCTQsIH0sCisJeyAiTW94YSBVQzcwMDAgU2VyaWFsIiwJOCwgfSwJCS8qIFJDNzAwMCAqLworCXsgIkNQLTExOFUgc2VyaWVzIiwJOCwgfSwKKwl7ICJDUC0xMDJVTCBzZXJpZXMiLAkyLCB9LAorLyoyMCovCXsgIkNQLTEwMlUgc2VyaWVzIiwJMiwgfSwKKwl7ICJDUC0xMThFTCBzZXJpZXMiLAk4LCB9LAorCXsgIkNQLTE2OEVMIHNlcmllcyIsCTgsIH0sCisJeyAiQ1AtMTA0RUwgc2VyaWVzIiwJNCwgfSwKKwl7ICJDQi0xMDggc2VyaWVzIiwJOCwgfSwKKy8qMjUqLwl7ICJDQi0xMTQgc2VyaWVzIiwJNCwgfSwKKwl7ICJDQi0xMzRJIHNlcmllcyIsCTQsIH0sCisJeyAiQ1AtMTM4VSBzZXJpZXMiLAk4LCB9LAorCXsgIlBPUy0xMDRVTCBzZXJpZXMiLAk0LCB9LAorCXsgIkNQLTExNFVMIHNlcmllcyIsCTQsIH0KK307CisKKy8qIGRyaXZlcl9kYXRhIGNvcnJlc3BvbmQgdG8gdGhlIGxpbmVzIGluIHRoZSBzdHJ1Y3R1cmUgYWJvdmUKKyAgIHNlZSBhbHNvIElTQSBwcm9iZSBmdW5jdGlvbiBiZWZvcmUgeW91IGNoYW5nZSBzb21ldGhpbmcgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBteHNlcl9wY2licmRzW10gPSB7CisJeyBQQ0lfVkRFVklDRShNT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQzE2OCksCS5kcml2ZXJfZGF0YSA9IDMgfSwKKwl7IFBDSV9WREVWSUNFKE1PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DMTA0KSwJLmRyaXZlcl9kYXRhID0gNCB9LAorCXsgUENJX1ZERVZJQ0UoTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTMyKSwJLmRyaXZlcl9kYXRhID0gOCB9LAorCXsgUENJX1ZERVZJQ0UoTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTE0KSwJLmRyaXZlcl9kYXRhID0gOSB9LAorCXsgUENJX1ZERVZJQ0UoTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NUMTE0KSwJLmRyaXZlcl9kYXRhID0gMTAgfSwKKwl7IFBDSV9WREVWSUNFKE1PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEwMiksCS5kcml2ZXJfZGF0YSA9IDExIH0sCisJeyBQQ0lfVkRFVklDRShNT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMDRVKSwJLmRyaXZlcl9kYXRhID0gMTIgfSwKKwl7IFBDSV9WREVWSUNFKE1PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDE2OFUpLAkuZHJpdmVyX2RhdGEgPSAxMyB9LAorCXsgUENJX1ZERVZJQ0UoTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTMyVSksCS5kcml2ZXJfZGF0YSA9IDE0IH0sCisJeyBQQ0lfVkRFVklDRShNT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMzRVKSwJLmRyaXZlcl9kYXRhID0gMTUgfSwKKwl7IFBDSV9WREVWSUNFKE1PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEwNEpVKSwuZHJpdmVyX2RhdGEgPSAxNiB9LAorCXsgUENJX1ZERVZJQ0UoTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX1JDNzAwMCksCS5kcml2ZXJfZGF0YSA9IDE3IH0sCisJeyBQQ0lfVkRFVklDRShNT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMThVKSwJLmRyaXZlcl9kYXRhID0gMTggfSwKKwl7IFBDSV9WREVWSUNFKE1PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEwMlVMKSwuZHJpdmVyX2RhdGEgPSAxOSB9LAorCXsgUENJX1ZERVZJQ0UoTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTAyVSksCS5kcml2ZXJfZGF0YSA9IDIwIH0sCisJeyBQQ0lfVkRFVklDRShNT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMThFTCksLmRyaXZlcl9kYXRhID0gMjEgfSwKKwl7IFBDSV9WREVWSUNFKE1PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDE2OEVMKSwuZHJpdmVyX2RhdGEgPSAyMiB9LAorCXsgUENJX1ZERVZJQ0UoTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTA0RUwpLC5kcml2ZXJfZGF0YSA9IDIzIH0sCisJeyBQQ0lfVkRFVklDRShNT1hBLCBQQ0lfREVWSUNFX0lEX0NCMTA4KSwJLmRyaXZlcl9kYXRhID0gMjQgfSwKKwl7IFBDSV9WREVWSUNFKE1PWEEsIFBDSV9ERVZJQ0VfSURfQ0IxMTQpLAkuZHJpdmVyX2RhdGEgPSAyNSB9LAorCXsgUENJX1ZERVZJQ0UoTU9YQSwgUENJX0RFVklDRV9JRF9DQjEzNEkpLAkuZHJpdmVyX2RhdGEgPSAyNiB9LAorCXsgUENJX1ZERVZJQ0UoTU9YQSwgUENJX0RFVklDRV9JRF9DUDEzOFUpLAkuZHJpdmVyX2RhdGEgPSAyNyB9LAorCXsgUENJX1ZERVZJQ0UoTU9YQSwgUENJX0RFVklDRV9JRF9QT1MxMDRVTCksCS5kcml2ZXJfZGF0YSA9IDI4IH0sCisJeyBQQ0lfVkRFVklDRShNT1hBLCBQQ0lfREVWSUNFX0lEX0NQMTE0VUwpLAkuZHJpdmVyX2RhdGEgPSAyOSB9LAorCXsgfQorfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBteHNlcl9wY2licmRzKTsKIAotCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgX21veGFfcGNpX2luZm8gewotCXVuc2lnbmVkIHNob3J0IGJ1c051bTsKLQl1bnNpZ25lZCBzaG9ydCBkZXZOdW07Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXY7CS8qIGFkZCBieSBWaWN0b3IgWXUuIDA2LTIzLTIwMDMgKi8KLX0gbW94YV9wY2lfaW5mbzsKLQogc3RhdGljIGludCBpb2FkZHJbTVhTRVJfQk9BUkRTXSA9IHsgMCwgMCwgMCwgMCB9Owogc3RhdGljIGludCB0dHltYWpvciA9IE1YU0VSTUFKT1I7Ci1zdGF0aWMgaW50IGNhbGxvdXRtYWpvciA9IE1YU0VSQ1VNQUpPUjsKLXN0YXRpYyBpbnQgdmVyYm9zZSA9IDA7CiAKIC8qIFZhcmlhYmxlcyBmb3IgaW5zbW9kICovCiAKQEAgLTI0MSw4ICsxODUsNiBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJNT1hBIFNtYXJ0aW8vSW5kdXN0aW8gRmFtaWx5IE11bHRpcG9ydCBCb2FyZCBEZXZpY2UgRHJpdmVyIik7CiBtb2R1bGVfcGFyYW1fYXJyYXkoaW9hZGRyLCBpbnQsIE5VTEwsIDApOwogbW9kdWxlX3BhcmFtKHR0eW1ham9yLCBpbnQsIDApOwotbW9kdWxlX3BhcmFtKGNhbGxvdXRtYWpvciwgaW50LCAwKTsKLW1vZHVsZV9wYXJhbSh2ZXJib3NlLCBib29sLCAwKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogc3RydWN0IG14c2VyX2xvZyB7CkBAIC0yNzcsNjcgKzIxOSw2OSBAQAogCWludCBpZnR5cGVbMzJdOwogfTsKIAotc3RydWN0IG14c2VyX2h3Y29uZiB7Ci0JaW50IGJvYXJkX3R5cGU7Ci0JaW50IHBvcnRzOwotCWludCBpcnE7Ci0JaW50IHZlY3RvcjsKLQlpbnQgdmVjdG9yX21hc2s7Ci0JaW50IHVhcnRfdHlwZTsKLQlpbnQgaW9hZGRyW01YU0VSX1BPUlRTX1BFUl9CT0FSRF07Ci0JaW50IGJhdWRfYmFzZVtNWFNFUl9QT1JUU19QRVJfQk9BUkRdOwotCW1veGFfcGNpX2luZm8gcGNpSW5mbzsKLQlpbnQgSXNNb3hhTXVzdENoaXBGbGFnOwkvKiBhZGQgYnkgVmljdG9yIFl1LiAwOC0zMC0yMDAyICovCi0JaW50IE1heENhblNldEJhdWRSYXRlW01YU0VSX1BPUlRTX1BFUl9CT0FSRF07CS8qIGFkZCBieSBWaWN0b3IgWXUuIDA5LTA0LTIwMDIgKi8KLQlpbnQgb3Btb2RlX2lvYWRkcltNWFNFUl9QT1JUU19QRVJfQk9BUkRdOwkvKiBhZGQgYnkgVmljdG9yIFl1LiAwMS0wNS0yMDA0ICovCi19Oworc3RydWN0IG14c2VyX2JvYXJkOwogCi1zdHJ1Y3QgbXhzZXJfc3RydWN0IHsKLQlpbnQgcG9ydDsKLQlpbnQgYmFzZTsJCS8qIHBvcnQgYmFzZSBhZGRyZXNzICovCi0JaW50IGlycTsJCS8qIHBvcnQgdXNpbmcgaXJxIG5vLiAqLwotCWludCB2ZWN0b3I7CQkvKiBwb3J0IGlycSB2ZWN0b3IgKi8KLQlpbnQgdmVjdG9ybWFzazsJCS8qIHBvcnQgdmVjdG9yIG1hc2sgKi8KK3N0cnVjdCBteHNlcl9wb3J0IHsKKwlzdHJ1Y3QgbXhzZXJfYm9hcmQgKmJvYXJkOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisKKwl1bnNpZ25lZCBsb25nIGlvYWRkcjsKKwl1bnNpZ25lZCBsb25nIG9wbW9kZV9pb2FkZHI7CisJaW50IG1heF9iYXVkOworCiAJaW50IHJ4X2hpZ2hfd2F0ZXI7CiAJaW50IHJ4X3RyaWdnZXI7CQkvKiBSeCBmaWZvIHRyaWdnZXIgbGV2ZWwgKi8KIAlpbnQgcnhfbG93X3dhdGVyOwogCWludCBiYXVkX2Jhc2U7CQkvKiBtYXguIHNwZWVkICovCi0JaW50IGZsYWdzOwkJLyogZGVmaW5lZCBpbiB0dHkuaCAqLwogCWludCB0eXBlOwkJLyogVUFSVCB0eXBlICovCi0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwlpbnQgZmxhZ3M7CQkvKiBkZWZpbmVkIGluIHR0eS5oICovCisKKwlpbnQgeF9jaGFyOwkJLyogeG9uL3hvZmYgY2hhcmFjdGVyICovCisJaW50IElFUjsJCS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKwlpbnQgTUNSOwkJLyogTW9kZW0gY29udHJvbCByZWdpc3RlciAqLworCisJdW5zaWduZWQgY2hhciBzdG9wX3J4OworCXVuc2lnbmVkIGNoYXIgbGRpc2Nfc3RvcF9yeDsKKworCWludCBjdXN0b21fZGl2aXNvcjsKKwlpbnQgY2xvc2VfZGVsYXk7CisJdW5zaWduZWQgc2hvcnQgY2xvc2luZ193YWl0OworCXVuc2lnbmVkIGNoYXIgZXJyX3NoYWRvdzsKKwl1bnNpZ25lZCBsb25nIGV2ZW50OworCisJaW50IGNvdW50OwkJLyogIyBvZiBmZCBvbiBkZXZpY2UgKi8KKwlpbnQgYmxvY2tlZF9vcGVuOwkvKiAjIG9mIGJsb2NrZWQgb3BlbnMgKi8KKwlzdHJ1Y3QgYXN5bmNfaWNvdW50IGljb3VudDsgLyoga2VybmVsIGNvdW50ZXJzIGZvciA0IGlucHV0IGludGVycnVwdHMgKi8KKwlpbnQgdGltZW91dDsKKwogCWludCByZWFkX3N0YXR1c19tYXNrOwogCWludCBpZ25vcmVfc3RhdHVzX21hc2s7CiAJaW50IHhtaXRfZmlmb19zaXplOwotCWludCBjdXN0b21fZGl2aXNvcjsKLQlpbnQgeF9jaGFyOwkJLyogeG9uL3hvZmYgY2hhcmFjdGVyICovCi0JaW50IGNsb3NlX2RlbGF5OwotCXVuc2lnbmVkIHNob3J0IGNsb3Npbmdfd2FpdDsKLQlpbnQgSUVSOwkJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLwotCWludCBNQ1I7CQkvKiBNb2RlbSBjb250cm9sIHJlZ2lzdGVyICovCi0JdW5zaWduZWQgbG9uZyBldmVudDsKLQlpbnQgY291bnQ7CQkvKiAjIG9mIGZkIG9uIGRldmljZSAqLwotCWludCBibG9ja2VkX29wZW47CS8qICMgb2YgYmxvY2tlZCBvcGVucyAqLwogCXVuc2lnbmVkIGNoYXIgKnhtaXRfYnVmOwogCWludCB4bWl0X2hlYWQ7CiAJaW50IHhtaXRfdGFpbDsKIAlpbnQgeG1pdF9jbnQ7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHRxdWV1ZTsKKwogCXN0cnVjdCBrdGVybWlvcyBub3JtYWxfdGVybWlvczsKLQlzdHJ1Y3Qga3Rlcm1pb3MgY2FsbG91dF90ZXJtaW9zOwotCXdhaXRfcXVldWVfaGVhZF90IG9wZW5fd2FpdDsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBjbG9zZV93YWl0OwotCXdhaXRfcXVldWVfaGVhZF90IGRlbHRhX21zcl93YWl0OwotCXN0cnVjdCBhc3luY19pY291bnQgaWNvdW50OwkvKiBrZXJuZWwgY291bnRlcnMgZm9yIHRoZSA0IGlucHV0IGludGVycnVwdHMgKi8KLQlpbnQgdGltZW91dDsKLQlpbnQgSXNNb3hhTXVzdENoaXBGbGFnOwkvKiBhZGQgYnkgVmljdG9yIFl1LiAwOC0zMC0yMDAyICovCi0JaW50IE1heENhblNldEJhdWRSYXRlOwkvKiBhZGQgYnkgVmljdG9yIFl1LiAwOS0wNC0yMDAyICovCi0JaW50IG9wbW9kZV9pb2FkZHI7CS8qIGFkZCBieSBWaWN0b3IgWXUuIDAxLTA1LTIwMDQgKi8KLQl1bnNpZ25lZCBjaGFyIHN0b3Bfcng7Ci0JdW5zaWduZWQgY2hhciBsZGlzY19zdG9wX3J4OwotCWxvbmcgcmVhbGJhdWQ7CisKIAlzdHJ1Y3QgbXhzZXJfbW9uIG1vbl9kYXRhOwotCXVuc2lnbmVkIGNoYXIgZXJyX3NoYWRvdzsKKwogCXNwaW5sb2NrX3Qgc2xvY2s7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0OworCXdhaXRfcXVldWVfaGVhZF90IGRlbHRhX21zcl93YWl0OworfTsKKworc3RydWN0IG14c2VyX2JvYXJkIHsKKwl1bnNpZ25lZCBpbnQgaWR4OworCWludCBpcnE7CisJY29uc3Qgc3RydWN0IG14c2VyX2NhcmRpbmZvICppbmZvOworCXVuc2lnbmVkIGxvbmcgdmVjdG9yOworCXVuc2lnbmVkIGxvbmcgdmVjdG9yX21hc2s7CisKKwlpbnQgY2hpcF9mbGFnOworCWludCB1YXJ0X3R5cGU7CisKKwlzdHJ1Y3QgbXhzZXJfcG9ydCBwb3J0c1tNWFNFUl9QT1JUU19QRVJfQk9BUkRdOwogfTsKIAogc3RydWN0IG14c2VyX21zdGF0dXMgewpAQCAtMzU1LDczICsyOTksMTYgQEAKIAkvKiAgMHgxODAsIDB4MjgwLCAweDIwMCwgMHgzMjAgKi8KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgbXhzZXJfYm9hcmQgbXhzZXJfYm9hcmRzW01YU0VSX0JPQVJEU107CiBzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKm14dmFyX3Nkcml2ZXI7Ci1zdGF0aWMgc3RydWN0IG14c2VyX3N0cnVjdCBteHZhcl90YWJsZVtNWFNFUl9QT1JUU107Ci1zdGF0aWMgc3RydWN0IHR0eV9zdHJ1Y3QgKm14dmFyX3R0eVtNWFNFUl9QT1JUUyArIDFdOwotc3RhdGljIHN0cnVjdCBrdGVybWlvcyAqbXh2YXJfdGVybWlvc1tNWFNFUl9QT1JUUyArIDFdOwotc3RhdGljIHN0cnVjdCBrdGVybWlvcyAqbXh2YXJfdGVybWlvc19sb2NrZWRbTVhTRVJfUE9SVFMgKyAxXTsKIHN0YXRpYyBzdHJ1Y3QgbXhzZXJfbG9nIG14dmFyX2xvZzsKIHN0YXRpYyBpbnQgbXh2YXJfZGlhZ2ZsYWc7CiBzdGF0aWMgdW5zaWduZWQgY2hhciBteHNlcl9tc3JbTVhTRVJfUE9SVFMgKyAxXTsKIHN0YXRpYyBzdHJ1Y3QgbXhzZXJfbW9uX2V4dCBtb25fZGF0YV9leHQ7CiBzdGF0aWMgaW50IG14c2VyX3NldF9iYXVkX21ldGhvZFtNWFNFUl9QT1JUUyArIDFdOwotc3RhdGljIHNwaW5sb2NrX3QgZ21fbG9jazsKLQotLyoKLSAqIFRoaXMgaXMgdXNlZCB0byBmaWd1cmUgb3V0IHRoZSBkaXZpc29yIHNwZWVkcyBhbmQgdGhlIHRpbWVvdXRzCi0gKi8KLQotc3RhdGljIHN0cnVjdCBteHNlcl9od2NvbmYgbXhzZXJjZmdbTVhTRVJfQk9BUkRTXTsKLQotLyoKLSAqIHN0YXRpYyBmdW5jdGlvbnM6Ci0gKi8KLQotc3RhdGljIHZvaWQgbXhzZXJfZ2V0Y2ZnKGludCBib2FyZCwgc3RydWN0IG14c2VyX2h3Y29uZiAqaHdjb25mKTsKLXN0YXRpYyBpbnQgbXhzZXJfaW5pdCh2b2lkKTsKLQotLyogc3RhdGljIHZvaWQgICBteHNlcl9wb2xsKHVuc2lnbmVkIGxvbmcpOyAqLwotc3RhdGljIGludCBteHNlcl9nZXRfSVNBX2NvbmYoaW50LCBzdHJ1Y3QgbXhzZXJfaHdjb25mICopOwotc3RhdGljIHZvaWQgbXhzZXJfZG9fc29mdGludChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7Ci1zdGF0aWMgaW50IG14c2VyX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKik7Ci1zdGF0aWMgdm9pZCBteHNlcl9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgZmlsZSAqKTsKLXN0YXRpYyBpbnQgbXhzZXJfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqLCBpbnQpOwotc3RhdGljIGludCBteHNlcl93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICopOwotc3RhdGljIHZvaWQgbXhzZXJfZmx1c2hfYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICopOwotc3RhdGljIGludCBteHNlcl9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKik7Ci1zdGF0aWMgdm9pZCBteHNlcl9mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKLXN0YXRpYyB2b2lkIG14c2VyX3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICosIHVuc2lnbmVkIGNoYXIpOwotc3RhdGljIGludCBteHNlcl9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgZmlsZSAqLCB1aW50LCB1bG9uZyk7Ci1zdGF0aWMgaW50IG14c2VyX2lvY3RsX3NwZWNpYWwodW5zaWduZWQgaW50LCB2b2lkIF9fdXNlciAqKTsKLXN0YXRpYyB2b2lkIG14c2VyX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICopOwotc3RhdGljIHZvaWQgbXhzZXJfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKLXN0YXRpYyB2b2lkIG14c2VyX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBrdGVybWlvcyAqKTsKLXN0YXRpYyB2b2lkIG14c2VyX3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKik7Ci1zdGF0aWMgdm9pZCBteHNlcl9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKLXN0YXRpYyB2b2lkIG14c2VyX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqKTsKLXN0YXRpYyB2b2lkIG14c2VyX3JzX2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICosIGludCk7Ci1zdGF0aWMgaXJxcmV0dXJuX3QgbXhzZXJfaW50ZXJydXB0KGludCwgdm9pZCAqKTsKLXN0YXRpYyB2b2lkIG14c2VyX3JlY2VpdmVfY2hhcnMoc3RydWN0IG14c2VyX3N0cnVjdCAqLCBpbnQgKik7Ci1zdGF0aWMgdm9pZCBteHNlcl90cmFuc21pdF9jaGFycyhzdHJ1Y3QgbXhzZXJfc3RydWN0ICopOwotc3RhdGljIHZvaWQgbXhzZXJfY2hlY2tfbW9kZW1fc3RhdHVzKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKiwgaW50KTsKLXN0YXRpYyBpbnQgbXhzZXJfYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICosIHN0cnVjdCBteHNlcl9zdHJ1Y3QgKik7Ci1zdGF0aWMgaW50IG14c2VyX3N0YXJ0dXAoc3RydWN0IG14c2VyX3N0cnVjdCAqKTsKLXN0YXRpYyB2b2lkIG14c2VyX3NodXRkb3duKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKik7Ci1zdGF0aWMgaW50IG14c2VyX2NoYW5nZV9zcGVlZChzdHJ1Y3QgbXhzZXJfc3RydWN0ICosIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpOwotc3RhdGljIGludCBteHNlcl9nZXRfc2VyaWFsX2luZm8oc3RydWN0IG14c2VyX3N0cnVjdCAqLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKik7Ci1zdGF0aWMgaW50IG14c2VyX3NldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgbXhzZXJfc3RydWN0ICosIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqKTsKLXN0YXRpYyBpbnQgbXhzZXJfZ2V0X2xzcl9pbmZvKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKiwgdW5zaWduZWQgaW50IF9fdXNlciAqKTsKLXN0YXRpYyB2b2lkIG14c2VyX3NlbmRfYnJlYWsoc3RydWN0IG14c2VyX3N0cnVjdCAqLCBpbnQpOwotc3RhdGljIGludCBteHNlcl90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgZmlsZSAqKTsKLXN0YXRpYyBpbnQgbXhzZXJfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwotc3RhdGljIGludCBteHNlcl9zZXRfYmF1ZChzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvLCBsb25nIG5ld3NwZCk7Ci1zdGF0aWMgdm9pZCBteHNlcl93YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpOwotCi1zdGF0aWMgdm9pZCBteHNlcl9zdGFydHJ4KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQgbXhzZXJfc3RvcHJ4KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwogCiAjaWZkZWYgQ09ORklHX1BDSQotc3RhdGljIGludCBDaGVja0lzTW94YU11c3QoaW50IGlvKQorc3RhdGljIGludCBfX2RldmluaXQgQ2hlY2tJc01veGFNdXN0KHVuc2lnbmVkIGxvbmcgaW8pCiB7CiAJdTggb2xkbWNyLCBod2lkOwogCWludCBpOwpAQCAtNDM3LDkwICszMjQsMTUgQEAKIAl9CiAKIAlHRVRfTU9YQV9NVVNUX0hBUkRXQVJFX0lEKGlvLCAmaHdpZCk7Ci0JZm9yIChpID0gMDsgaSA8IFVBUlRfVFlQRV9OVU07IGkrKykgewotCQlpZiAoaHdpZCA9PSBHbW94YV91YXJ0X2lkW2ldKQorCWZvciAoaSA9IDE7IGkgPCBVQVJUX0lORk9fTlVNOyBpKyspIHsgLyogMCA9IE9USEVSX1VBUlQgKi8KKwkJaWYgKGh3aWQgPT0gR3BjaV91YXJ0X2luZm9baV0udHlwZSkKIAkJCXJldHVybiAoaW50KWh3aWQ7CiAJfQogCXJldHVybiBNT1hBX09USEVSX1VBUlQ7CiB9CiAjZW5kaWYKIAotLyogYWJvdmUgaXMgbW9kaWZpZWQgYnkgVmljdG9yIFl1LiAwOC0xNS0yMDAyICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgbXhzZXJfb3BzID0gewotCS5vcGVuID0gbXhzZXJfb3BlbiwKLQkuY2xvc2UgPSBteHNlcl9jbG9zZSwKLQkud3JpdGUgPSBteHNlcl93cml0ZSwKLQkucHV0X2NoYXIgPSBteHNlcl9wdXRfY2hhciwKLQkuZmx1c2hfY2hhcnMgPSBteHNlcl9mbHVzaF9jaGFycywKLQkud3JpdGVfcm9vbSA9IG14c2VyX3dyaXRlX3Jvb20sCi0JLmNoYXJzX2luX2J1ZmZlciA9IG14c2VyX2NoYXJzX2luX2J1ZmZlciwKLQkuZmx1c2hfYnVmZmVyID0gbXhzZXJfZmx1c2hfYnVmZmVyLAotCS5pb2N0bCA9IG14c2VyX2lvY3RsLAotCS50aHJvdHRsZSA9IG14c2VyX3Rocm90dGxlLAotCS51bnRocm90dGxlID0gbXhzZXJfdW50aHJvdHRsZSwKLQkuc2V0X3Rlcm1pb3MgPSBteHNlcl9zZXRfdGVybWlvcywKLQkuc3RvcCA9IG14c2VyX3N0b3AsCi0JLnN0YXJ0ID0gbXhzZXJfc3RhcnQsCi0JLmhhbmd1cCA9IG14c2VyX2hhbmd1cCwKLQkuYnJlYWtfY3RsID0gbXhzZXJfcnNfYnJlYWssCi0JLndhaXRfdW50aWxfc2VudCA9IG14c2VyX3dhaXRfdW50aWxfc2VudCwKLQkudGlvY21nZXQgPSBteHNlcl90aW9jbWdldCwKLQkudGlvY21zZXQgPSBteHNlcl90aW9jbXNldCwKLX07Ci0KLS8qCi0gKiBUaGUgTU9YQSBTbWFydGlvL0luZHVzdGlvIHNlcmlhbCBkcml2ZXIgYm9vdC10aW1lIGluaXRpYWxpemF0aW9uIGNvZGUhCi0gKi8KLQotc3RhdGljIGludCBfX2luaXQgbXhzZXJfbW9kdWxlX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JaWYgKHZlcmJvc2UpCi0JCXByaW50ayhLRVJOX0RFQlVHICJMb2FkaW5nIG1vZHVsZSBteHNlciAuLi5cbiIpOwotCXJldCA9IG14c2VyX2luaXQoKTsKLQlpZiAodmVyYm9zZSkKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkRvbmUuXG4iKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXhzZXJfbW9kdWxlX2V4aXQodm9pZCkKLXsKLQlpbnQgaSwgZXJyOwotCi0JaWYgKHZlcmJvc2UpCi0JCXByaW50ayhLRVJOX0RFQlVHICJVbmxvYWRpbmcgbW9kdWxlIG14c2VyIC4uLlxuIik7Ci0KLQllcnIgPSB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIobXh2YXJfc2RyaXZlcik7Ci0JaWYgKCFlcnIpCi0JCXB1dF90dHlfZHJpdmVyKG14dmFyX3Nkcml2ZXIpOwotCWVsc2UKLQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZG4ndCB1bnJlZ2lzdGVyIE1PWEEgU21hcnRpby9JbmR1c3RpbyBmYW1pbHkgc2VyaWFsIGRyaXZlclxuIik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTVhTRVJfQk9BUkRTOyBpKyspIHsKLQkJc3RydWN0IHBjaV9kZXYgKnBkZXY7Ci0KLQkJaWYgKG14c2VyY2ZnW2ldLmJvYXJkX3R5cGUgPT0gLTEpCi0JCQljb250aW51ZTsKLQkJZWxzZSB7Ci0JCQlwZGV2ID0gbXhzZXJjZmdbaV0ucGNpSW5mby5wZGV2OwotCQkJZnJlZV9pcnEobXhzZXJjZmdbaV0uaXJxLCAmbXh2YXJfdGFibGVbaSAqIE1YU0VSX1BPUlRTX1BFUl9CT0FSRF0pOwotCQkJaWYgKHBkZXYgIT0gTlVMTCkgewkvKiBQQ0kgKi8KLQkJCQlyZWxlYXNlX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMiksIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMikpOwotCQkJCXJlbGVhc2VfcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAzKSk7Ci0JCQkJcGNpX2Rldl9wdXQocGRldik7Ci0JCQl9IGVsc2UgewotCQkJCXJlbGVhc2VfcmVnaW9uKG14c2VyY2ZnW2ldLmlvYWRkclswXSwgOCAqIG14c2VyY2ZnW2ldLnBvcnRzKTsKLQkJCQlyZWxlYXNlX3JlZ2lvbihteHNlcmNmZ1tpXS52ZWN0b3IsIDEpOwotCQkJfQotCQl9Ci0JfQotCWlmICh2ZXJib3NlKQotCQlwcmludGsoS0VSTl9ERUJVRyAiRG9uZS5cbiIpOwotfQotCi1zdGF0aWMgdm9pZCBwcm9jZXNzX3R4cnhfZmlmbyhzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvKQorc3RhdGljIHZvaWQgcHJvY2Vzc190eHJ4X2ZpZm8oc3RydWN0IG14c2VyX3BvcnQgKmluZm8pCiB7CiAJaW50IGk7CiAKQEAgLTUyOSw0MTIgKzM0MSwxOCBAQAogCQlpbmZvLT5yeF9oaWdoX3dhdGVyID0gMTsKIAkJaW5mby0+cnhfbG93X3dhdGVyID0gMTsKIAkJaW5mby0+eG1pdF9maWZvX3NpemUgPSAxOwotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBVQVJUX0lORk9fTlVNOyBpKyspIHsKLQkJCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcgPT0gR3BjaV91YXJ0X2luZm9baV0udHlwZSkgeworCX0gZWxzZQorCQlmb3IgKGkgPSAwOyBpIDwgVUFSVF9JTkZPX05VTTsgaSsrKQorCQkJaWYgKGluZm8tPmJvYXJkLT5jaGlwX2ZsYWcgPT0gR3BjaV91YXJ0X2luZm9baV0udHlwZSkgewogCQkJCWluZm8tPnJ4X3RyaWdnZXIgPSBHcGNpX3VhcnRfaW5mb1tpXS5yeF90cmlnZ2VyOwogCQkJCWluZm8tPnJ4X2xvd193YXRlciA9IEdwY2lfdWFydF9pbmZvW2ldLnJ4X2xvd193YXRlcjsKIAkJCQlpbmZvLT5yeF9oaWdoX3dhdGVyID0gR3BjaV91YXJ0X2luZm9baV0ucnhfaGlnaF93YXRlcjsKIAkJCQlpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9IEdwY2lfdWFydF9pbmZvW2ldLnhtaXRfZmlmb19zaXplOwogCQkJCWJyZWFrOwogCQkJfQotCQl9Ci0JfQogfQogCi1zdGF0aWMgaW50IG14c2VyX2luaXRicmQoaW50IGJvYXJkLCBzdHJ1Y3QgbXhzZXJfaHdjb25mICpod2NvbmYpCi17Ci0Jc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbzsKLQlpbnQgcmV0dmFsOwotCWludCBpLCBuOwotCi0JbiA9IGJvYXJkICogTVhTRVJfUE9SVFNfUEVSX0JPQVJEOwotCWluZm8gPSAmbXh2YXJfdGFibGVbbl07Ci0JLyppZiAodmVyYm9zZSkgKi8gIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgICAgICAgdHR5TUklZCAtIHR0eU1JJWQgIiwKLQkJCW4sIG4gKyBod2NvbmYtPnBvcnRzIC0gMSk7Ci0JCXByaW50aygiIG1heC4gYmF1ZCByYXRlID0gJWQgYnBzLlxuIiwKLQkJCWh3Y29uZi0+TWF4Q2FuU2V0QmF1ZFJhdGVbMF0pOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBod2NvbmYtPnBvcnRzOyBpKyssIG4rKywgaW5mbysrKSB7Ci0JCWluZm8tPnBvcnQgPSBuOwotCQlpbmZvLT5iYXNlID0gaHdjb25mLT5pb2FkZHJbaV07Ci0JCWluZm8tPmlycSA9IGh3Y29uZi0+aXJxOwotCQlpbmZvLT52ZWN0b3IgPSBod2NvbmYtPnZlY3RvcjsKLQkJaW5mby0+dmVjdG9ybWFzayA9IGh3Y29uZi0+dmVjdG9yX21hc2s7Ci0JCWluZm8tPm9wbW9kZV9pb2FkZHIgPSBod2NvbmYtPm9wbW9kZV9pb2FkZHJbaV07CS8qIGFkZCBieSBWaWN0b3IgWXUuIDAxLTA1LTIwMDQgKi8KLQkJaW5mby0+c3RvcF9yeCA9IDA7Ci0JCWluZm8tPmxkaXNjX3N0b3BfcnggPSAwOwotCi0JCWluZm8tPklzTW94YU11c3RDaGlwRmxhZyA9IGh3Y29uZi0+SXNNb3hhTXVzdENoaXBGbGFnOwotCQkvKiBFbmhhbmNlIG1vZGUgZW5hYmxlZCBoZXJlICovCi0JCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcgIT0gTU9YQV9PVEhFUl9VQVJUKSB7Ci0JCQlFTkFCTEVfTU9YQV9NVVNUX0VOQ0hBTkNFX01PREUoaW5mby0+YmFzZSk7Ci0JCX0KLQotCQlpbmZvLT5mbGFncyA9IEFTWU5DX1NIQVJFX0lSUTsKLQkJaW5mby0+dHlwZSA9IGh3Y29uZi0+dWFydF90eXBlOwotCQlpbmZvLT5iYXVkX2Jhc2UgPSBod2NvbmYtPmJhdWRfYmFzZVtpXTsKLQotCQlpbmZvLT5NYXhDYW5TZXRCYXVkUmF0ZSA9IGh3Y29uZi0+TWF4Q2FuU2V0QmF1ZFJhdGVbaV07Ci0KLQkJcHJvY2Vzc190eHJ4X2ZpZm8oaW5mbyk7Ci0KLQotCQlpbmZvLT5jdXN0b21fZGl2aXNvciA9IGh3Y29uZi0+YmF1ZF9iYXNlW2ldICogMTY7Ci0JCWluZm8tPmNsb3NlX2RlbGF5ID0gNSAqIEhaIC8gMTA7Ci0JCWluZm8tPmNsb3Npbmdfd2FpdCA9IDMwICogSFo7Ci0JCUlOSVRfV09SSygmaW5mby0+dHF1ZXVlLCBteHNlcl9kb19zb2Z0aW50KTsKLQkJaW5mby0+bm9ybWFsX3Rlcm1pb3MgPSBteHZhcl9zZHJpdmVyLT5pbml0X3Rlcm1pb3M7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPm9wZW5fd2FpdCk7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmNsb3NlX3dhaXQpOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7Ci0JCW1lbXNldCgmaW5mby0+bW9uX2RhdGEsIDAsIHNpemVvZihzdHJ1Y3QgbXhzZXJfbW9uKSk7Ci0JCWluZm8tPmVycl9zaGFkb3cgPSAwOwotCQlzcGluX2xvY2tfaW5pdCgmaW5mby0+c2xvY2spOwotCX0KLQkvKgotCSAqIEFsbG9jYXRlIHRoZSBJUlEgaWYgbmVjZXNzYXJ5Ci0JICovCi0KLQotCS8qIGJlZm9yZSBzZXQgSU5UIElTUiwgZGlzYWJsZSBhbGwgaW50ICovCi0JZm9yIChpID0gMDsgaSA8IGh3Y29uZi0+cG9ydHM7IGkrKykgewotCQlvdXRiKGluYihod2NvbmYtPmlvYWRkcltpXSArIFVBUlRfSUVSKSAmIDB4ZjAsCi0JCQlod2NvbmYtPmlvYWRkcltpXSArIFVBUlRfSUVSKTsKLQl9Ci0KLQluID0gYm9hcmQgKiBNWFNFUl9QT1JUU19QRVJfQk9BUkQ7Ci0JaW5mbyA9ICZteHZhcl90YWJsZVtuXTsKLQotCXJldHZhbCA9IHJlcXVlc3RfaXJxKGh3Y29uZi0+aXJxLCBteHNlcl9pbnRlcnJ1cHQsIElSUV9UKGluZm8pLAotCQkJCSJteHNlciIsIGluZm8pOwotCWlmIChyZXR2YWwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJCb2FyZCAlZDogJXMiLAotCQkJYm9hcmQsIG14c2VyX2JyZG5hbWVbaHdjb25mLT5ib2FyZF90eXBlIC0gMV0pOwotCQlwcmludGsoIiAgUmVxdWVzdCBpcnEgZmFpbGVkLCBJUlEgKCVkKSBtYXkgY29uZmxpY3Qgd2l0aCIKLQkJCSIgYW5vdGhlciBkZXZpY2UuXG4iLCBpbmZvLT5pcnEpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbXhzZXJfZ2V0Y2ZnKGludCBib2FyZCwgc3RydWN0IG14c2VyX2h3Y29uZiAqaHdjb25mKQotewotCW14c2VyY2ZnW2JvYXJkXSA9ICpod2NvbmY7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUENJCi1zdGF0aWMgaW50IG14c2VyX2dldF9QQ0lfY29uZihpbnQgYnVzbnVtLCBpbnQgZGV2bnVtLCBpbnQgYm9hcmRfdHlwZSwgc3RydWN0IG14c2VyX2h3Y29uZiAqaHdjb25mKQotewotCWludCBpLCBqOwotCS8qIHVuc2lnbmVkIGludCB2YWw7ICovCi0JdW5zaWduZWQgaW50IGlvYWRkcmVzczsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGh3Y29uZi0+cGNpSW5mby5wZGV2OwotCi0JLyogaW8gYWRkcmVzcyAqLwotCWh3Y29uZi0+Ym9hcmRfdHlwZSA9IGJvYXJkX3R5cGU7Ci0JaHdjb25mLT5wb3J0cyA9IG14c2VyX251bXBvcnRzW2JvYXJkX3R5cGUgLSAxXTsKLQlpb2FkZHJlc3MgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMik7Ci0JcmVxdWVzdF9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDIpLAotCQkJIm14c2VyKElPKSIpOwotCi0JZm9yIChpID0gMDsgaSA8IGh3Y29uZi0+cG9ydHM7IGkrKykKLQkJaHdjb25mLT5pb2FkZHJbaV0gPSBpb2FkZHJlc3MgKyA4ICogaTsKLQotCS8qIHZlY3RvciAqLwotCWlvYWRkcmVzcyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKTsKLQlyZXF1ZXN0X3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMyksIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMyksCi0JCQkibXhzZXIodmVjdG9yKSIpOwotCWh3Y29uZi0+dmVjdG9yID0gaW9hZGRyZXNzOwotCi0JLyogaXJxICovCi0JaHdjb25mLT5pcnEgPSBod2NvbmYtPnBjaUluZm8ucGRldi0+aXJxOwotCi0JaHdjb25mLT5Jc01veGFNdXN0Q2hpcEZsYWcgPSBDaGVja0lzTW94YU11c3QoaHdjb25mLT5pb2FkZHJbMF0pOwotCWh3Y29uZi0+dWFydF90eXBlID0gUE9SVF8xNjU1MEE7Ci0JaHdjb25mLT52ZWN0b3JfbWFzayA9IDA7Ci0KLQotCWZvciAoaSA9IDA7IGkgPCBod2NvbmYtPnBvcnRzOyBpKyspIHsKLQkJZm9yIChqID0gMDsgaiA8IFVBUlRfSU5GT19OVU07IGorKykgewotCQkJaWYgKEdwY2lfdWFydF9pbmZvW2pdLnR5cGUgPT0gaHdjb25mLT5Jc01veGFNdXN0Q2hpcEZsYWcpIHsKLQkJCQlod2NvbmYtPk1heENhblNldEJhdWRSYXRlW2ldID0gR3BjaV91YXJ0X2luZm9bal0ubWF4X2JhdWQ7Ci0KLQkJCQkvKiBleGNlcHRpb24uLi4uQ1AtMTAyICovCi0JCQkJaWYgKGJvYXJkX3R5cGUgPT0gTVhTRVJfQk9BUkRfQ1AxMDIpCi0JCQkJCWh3Y29uZi0+TWF4Q2FuU2V0QmF1ZFJhdGVbaV0gPSA5MjE2MDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoaHdjb25mLT5Jc01veGFNdXN0Q2hpcEZsYWcgPT0gTU9YQV9NVVNUX01VODYwX0hXSUQpIHsKLQkJZm9yIChpID0gMDsgaSA8IGh3Y29uZi0+cG9ydHM7IGkrKykgewotCQkJaWYgKGkgPCA0KQotCQkJCWh3Y29uZi0+b3Btb2RlX2lvYWRkcltpXSA9IGlvYWRkcmVzcyArIDQ7Ci0JCQllbHNlCi0JCQkJaHdjb25mLT5vcG1vZGVfaW9hZGRyW2ldID0gaW9hZGRyZXNzICsgMHgwYzsKLQkJfQotCQlvdXRiKDAsIGlvYWRkcmVzcyArIDQpOwkvKiBkZWZhdWx0IHNldCB0byBSUzIzMiBtb2RlICovCi0JCW91dGIoMCwgaW9hZGRyZXNzICsgMHgwYyk7CS8qIGRlZmF1bHQgc2V0IHRvIFJTMjMyIG1vZGUgKi8KLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgaHdjb25mLT5wb3J0czsgaSsrKSB7Ci0JCWh3Y29uZi0+dmVjdG9yX21hc2sgfD0gKDEgPDwgaSk7Ci0JCWh3Y29uZi0+YmF1ZF9iYXNlW2ldID0gOTIxNjAwOwotCX0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50IG14c2VyX2luaXQodm9pZCkKLXsKLQlpbnQgaSwgbSwgcmV0dmFsLCBiLCBuOwotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKLQlpbnQgaW5kZXg7Ci0JdW5zaWduZWQgY2hhciBidXNudW0sIGRldm51bTsKLQlzdHJ1Y3QgbXhzZXJfaHdjb25mIGh3Y29uZjsKLQotCW14dmFyX3Nkcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKE1YU0VSX1BPUlRTICsgMSk7Ci0JaWYgKCFteHZhcl9zZHJpdmVyKQotCQlyZXR1cm4gLUVOT01FTTsKLQlzcGluX2xvY2tfaW5pdCgmZ21fbG9jayk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTVhTRVJfQk9BUkRTOyBpKyspIHsKLQkJbXhzZXJjZmdbaV0uYm9hcmRfdHlwZSA9IC0xOwotCX0KLQotCXByaW50ayhLRVJOX0lORk8gIk1PWEEgU21hcnRpby9JbmR1c3RpbyBmYW1pbHkgZHJpdmVyIHZlcnNpb24gJXNcbiIsCi0JCU1YU0VSX1ZFUlNJT04pOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgdHR5X2RyaXZlciBzdHJ1Y3R1cmUgKi8KLQltZW1zZXQobXh2YXJfc2RyaXZlciwgMCwgc2l6ZW9mKHN0cnVjdCB0dHlfZHJpdmVyKSk7Ci0JbXh2YXJfc2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKLQlteHZhcl9zZHJpdmVyLT5tYWdpYyA9IFRUWV9EUklWRVJfTUFHSUM7Ci0JbXh2YXJfc2RyaXZlci0+bmFtZSA9ICJ0dHlNSSI7Ci0JbXh2YXJfc2RyaXZlci0+bWFqb3IgPSB0dHltYWpvcjsKLQlteHZhcl9zZHJpdmVyLT5taW5vcl9zdGFydCA9IDA7Ci0JbXh2YXJfc2RyaXZlci0+bnVtID0gTVhTRVJfUE9SVFMgKyAxOwotCW14dmFyX3Nkcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOwotCW14dmFyX3Nkcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7Ci0JbXh2YXJfc2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOwotCW14dmFyX3Nkcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjk2MDB8Q1M4fENSRUFEfEhVUENMfENMT0NBTDsKLQlteHZhcl9zZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19pc3BlZWQgPSA5NjAwOwotCW14dmFyX3Nkcml2ZXItPmluaXRfdGVybWlvcy5jX29zcGVlZCA9IDk2MDA7Ci0JbXh2YXJfc2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXOwotCXR0eV9zZXRfb3BlcmF0aW9ucyhteHZhcl9zZHJpdmVyLCAmbXhzZXJfb3BzKTsKLQlteHZhcl9zZHJpdmVyLT50dHlzID0gbXh2YXJfdHR5OwotCW14dmFyX3Nkcml2ZXItPnRlcm1pb3MgPSBteHZhcl90ZXJtaW9zOwotCW14dmFyX3Nkcml2ZXItPnRlcm1pb3NfbG9ja2VkID0gbXh2YXJfdGVybWlvc19sb2NrZWQ7Ci0KLQlteHZhcl9kaWFnZmxhZyA9IDA7Ci0JbWVtc2V0KG14dmFyX3RhYmxlLCAwLCBNWFNFUl9QT1JUUyAqIHNpemVvZihzdHJ1Y3QgbXhzZXJfc3RydWN0KSk7Ci0JbWVtc2V0KCZteHZhcl9sb2csIDAsIHNpemVvZihzdHJ1Y3QgbXhzZXJfbG9nKSk7Ci0KLQltZW1zZXQoJm14c2VyX21zciwgMCwgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpICogKE1YU0VSX1BPUlRTICsgMSkpOwotCW1lbXNldCgmbW9uX2RhdGFfZXh0LCAwLCBzaXplb2Yoc3RydWN0IG14c2VyX21vbl9leHQpKTsKLQltZW1zZXQoJm14c2VyX3NldF9iYXVkX21ldGhvZCwgMCwgc2l6ZW9mKGludCkgKiAoTVhTRVJfUE9SVFMgKyAxKSk7Ci0JbWVtc2V0KCZod2NvbmYsIDAsIHNpemVvZihzdHJ1Y3QgbXhzZXJfaHdjb25mKSk7Ci0KLQltID0gMDsKLQkvKiBTdGFydCBmaW5kaW5nIElTQSBib2FyZHMgaGVyZSAqLwotCWZvciAoYiA9IDA7IGIgPCBNWFNFUl9CT0FSRFMgJiYgbSA8IE1YU0VSX0JPQVJEUzsgYisrKSB7Ci0JCWludCBjYXA7Ci0KLQkJaWYgKCEoY2FwID0gbXhzZXJCb2FyZENBUFtiXSkpCi0JCQljb250aW51ZTsKLQotCQlyZXR2YWwgPSBteHNlcl9nZXRfSVNBX2NvbmYoY2FwLCAmaHdjb25mKTsKLQotCQlpZiAocmV0dmFsICE9IDApCi0JCQlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBNT1hBICVzIGJvYXJkIChDQVA9MHgleClcbiIsCi0JCQkJbXhzZXJfYnJkbmFtZVtod2NvbmYuYm9hcmRfdHlwZSAtIDFdLCBpb2FkZHJbYl0pOwotCi0JCWlmIChyZXR2YWwgPD0gMCkgewotCQkJaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfSVJRKQotCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBpbnRlcnJ1cHQgbnVtYmVyLCAiCi0JCQkJCSJib2FyZCBub3QgY29uZmlndXJlZFxuIik7Ci0JCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX0lSUV9DT05GTElUKQotCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBpbnRlcnJ1cHQgbnVtYmVyLCAiCi0JCQkJCSJib2FyZCBub3QgY29uZmlndXJlZFxuIik7Ci0JCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX1ZFQ1RPUikKLQkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IHZlY3RvciwgIgotCQkJCQkiYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIpOwotCQkJZWxzZSBpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JT0FERFIpCi0JCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIEkvTyBhZGRyZXNzLCAiCi0JCQkJCSJib2FyZCBub3QgY29uZmlndXJlZFxuIik7Ci0KLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaHdjb25mLnBjaUluZm8uYnVzTnVtID0gMDsKLQkJaHdjb25mLnBjaUluZm8uZGV2TnVtID0gMDsKLQkJaHdjb25mLnBjaUluZm8ucGRldiA9IE5VTEw7Ci0KLQkJbXhzZXJfZ2V0Y2ZnKG0sICZod2NvbmYpOwotCQkvKgotCQkgKiBpbml0IG14c2VyY2ZnIGZpcnN0LAotCQkgKiBvciBteHNlcmNmZyBkYXRhIGlzIG5vdCBjb3JyZWN0IG9uIElTUi4KLQkJICovCi0JCS8qIG14c2VyX2luaXRicmQgd2lsbCBob29rIElTUi4gKi8KLQkJaWYgKG14c2VyX2luaXRicmQobSwgJmh3Y29uZikgPCAwKQotCQkJY29udGludWU7Ci0KLQkJbSsrOwotCX0KLQotCS8qIFN0YXJ0IGZpbmRpbmcgSVNBIGJvYXJkcyBmcm9tIG1vZHVsZSBhcmcgKi8KLQlmb3IgKGIgPSAwOyBiIDwgTVhTRVJfQk9BUkRTICYmIG0gPCBNWFNFUl9CT0FSRFM7IGIrKykgewotCQlpbnQgY2FwOwotCi0JCWlmICghKGNhcCA9IGlvYWRkcltiXSkpCi0JCQljb250aW51ZTsKLQotCQlyZXR2YWwgPSBteHNlcl9nZXRfSVNBX2NvbmYoY2FwLCAmaHdjb25mKTsKLQotCQlpZiAocmV0dmFsICE9IDApCi0JCQlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBNT1hBICVzIGJvYXJkIChDQVA9MHgleClcbiIsCi0JCQkJbXhzZXJfYnJkbmFtZVtod2NvbmYuYm9hcmRfdHlwZSAtIDFdLCBpb2FkZHJbYl0pOwotCi0JCWlmIChyZXR2YWwgPD0gMCkgewotCQkJaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfSVJRKQotCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBpbnRlcnJ1cHQgbnVtYmVyLCAiCi0JCQkJCSJib2FyZCBub3QgY29uZmlndXJlZFxuIik7Ci0JCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX0lSUV9DT05GTElUKQotCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBpbnRlcnJ1cHQgbnVtYmVyLCAiCi0JCQkJCSJib2FyZCBub3QgY29uZmlndXJlZFxuIik7Ci0JCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX1ZFQ1RPUikKLQkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IHZlY3RvciwgIgotCQkJCQkiYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIpOwotCQkJZWxzZSBpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JT0FERFIpCi0JCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIEkvTyBhZGRyZXNzLCAiCi0JCQkJCSJib2FyZCBub3QgY29uZmlndXJlZFxuIik7Ci0KLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaHdjb25mLnBjaUluZm8uYnVzTnVtID0gMDsKLQkJaHdjb25mLnBjaUluZm8uZGV2TnVtID0gMDsKLQkJaHdjb25mLnBjaUluZm8ucGRldiA9IE5VTEw7Ci0KLQkJbXhzZXJfZ2V0Y2ZnKG0sICZod2NvbmYpOwotCQkvKgotCQkgKiBpbml0IG14c2VyY2ZnIGZpcnN0LAotCQkgKiBvciBteHNlcmNmZyBkYXRhIGlzIG5vdCBjb3JyZWN0IG9uIElTUi4KLQkJICovCi0JCS8qIG14c2VyX2luaXRicmQgd2lsbCBob29rIElTUi4gKi8KLQkJaWYgKG14c2VyX2luaXRicmQobSwgJmh3Y29uZikgPCAwKQotCQkJY29udGludWU7Ci0KLQkJbSsrOwotCX0KLQotCS8qIHN0YXJ0IGZpbmRpbmcgUENJIGJvYXJkIGhlcmUgKi8KLSNpZmRlZiBDT05GSUdfUENJCi0JbiA9IEFSUkFZX1NJWkUobXhzZXJfcGNpYnJkcykgLSAxOwotCWluZGV4ID0gMDsKLQliID0gMDsKLQl3aGlsZSAoYiA8IG4pIHsKLQkJcGRldiA9IHBjaV9nZXRfZGV2aWNlKG14c2VyX3BjaWJyZHNbYl0udmVuZG9yLAotCQkJCW14c2VyX3BjaWJyZHNbYl0uZGV2aWNlLCBwZGV2KTsKLQkJaWYgKHBkZXYgPT0gTlVMTCkgewotCQkJYisrOwotCQkJY29udGludWU7Ci0JCX0KLQkJaHdjb25mLnBjaUluZm8uYnVzTnVtID0gYnVzbnVtID0gcGRldi0+YnVzLT5udW1iZXI7Ci0JCWh3Y29uZi5wY2lJbmZvLmRldk51bSA9IGRldm51bSA9IFBDSV9TTE9UKHBkZXYtPmRldmZuKSA8PCAzOwotCQlod2NvbmYucGNpSW5mby5wZGV2ID0gcGRldjsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgTU9YQSAlcyBib2FyZChCdXNObz0lZCxEZXZObz0lZClcbiIsCi0JCQlteHNlcl9icmRuYW1lWyhpbnQpIChteHNlcl9wY2licmRzW2JdLmRyaXZlcl9kYXRhKSAtIDFdLAotCQkJYnVzbnVtLCBkZXZudW0gPj4gMyk7Ci0JCWluZGV4Kys7Ci0JCWlmIChtID49IE1YU0VSX0JPQVJEUykKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJCSJUb28gbWFueSBTbWFydGlvL0luZHVzdGlvIGZhbWlseSBib2FyZHMgZmluZCAiCi0JCQkJIihtYXhpbXVtICVkKSwgYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIsCi0JCQkJTVhTRVJfQk9BUkRTKTsKLQkJZWxzZSB7Ci0JCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIk1veGEgU21hcnRJL08gUENJIGVuYWJsZSAiCi0JCQkJCSJmYWlsICFcbiIpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJcmV0dmFsID0gbXhzZXJfZ2V0X1BDSV9jb25mKGJ1c251bSwgZGV2bnVtLAotCQkJCQkoaW50KW14c2VyX3BjaWJyZHNbYl0uZHJpdmVyX2RhdGEsCi0JCQkJCSZod2NvbmYpOwotCQkJaWYgKHJldHZhbCA8IDApIHsKLQkJCQlpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JUlEpCi0JCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkJIkludmFsaWQgaW50ZXJydXB0IG51bWJlciwgIgotCQkJCQkJImJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKLQkJCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX0lSUV9DT05GTElUKQotCQkJCQlwcmludGsoS0VSTl9FUlIKLQkJCQkJCSJJbnZhbGlkIGludGVycnVwdCBudW1iZXIsICIKLQkJCQkJCSJib2FyZCBub3QgY29uZmlndXJlZFxuIik7Ci0JCQkJZWxzZSBpZiAocmV0dmFsID09IE1YU0VSX0VSUl9WRUNUT1IpCi0JCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkJIkludmFsaWQgaW50ZXJydXB0IHZlY3RvciwgIgotCQkJCQkJImJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKLQkJCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX0lPQUREUikKLQkJCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCQkiSW52YWxpZCBJL08gYWRkcmVzcywgIgotCQkJCQkJImJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCW14c2VyX2dldGNmZyhtLCAmaHdjb25mKTsKLQkJCS8qIGluaXQgbXhzZXJjZmcgZmlyc3QsCi0JCQkgKiBvciBteHNlcmNmZyBkYXRhIGlzIG5vdCBjb3JyZWN0IG9uIElTUi4KLQkJCSAqLwotCQkJLyogbXhzZXJfaW5pdGJyZCB3aWxsIGhvb2sgSVNSLiAqLwotCQkJaWYgKG14c2VyX2luaXRicmQobSwgJmh3Y29uZikgPCAwKQotCQkJCWNvbnRpbnVlOwotCQkJbSsrOwotCQkJLyogS2VlcCBhbiBleHRyYSByZWZlcmVuY2UgaWYgd2Ugc3VjY2VlZGVkLiBJdCB3aWxsCi0JCQkgICBiZSByZXR1cm5lZCBhdCB1bmxvYWQgdGltZSAqLwotCQkJcGNpX2Rldl9nZXQocGRldik7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCXJldHZhbCA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIobXh2YXJfc2RyaXZlcik7Ci0JaWYgKHJldHZhbCkgewotCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IGluc3RhbGwgTU9YQSBTbWFydGlvL0luZHVzdGlvIGZhbWlseSIKLQkJCQkiIGRyaXZlciAhXG4iKTsKLQkJcHV0X3R0eV9kcml2ZXIobXh2YXJfc2RyaXZlcik7Ci0KLQkJZm9yIChpID0gMDsgaSA8IE1YU0VSX0JPQVJEUzsgaSsrKSB7Ci0JCQlpZiAobXhzZXJjZmdbaV0uYm9hcmRfdHlwZSA9PSAtMSkKLQkJCQljb250aW51ZTsKLQkJCWVsc2UgewotCQkJCWZyZWVfaXJxKG14c2VyY2ZnW2ldLmlycSwgJm14dmFyX3RhYmxlW2kgKiBNWFNFUl9QT1JUU19QRVJfQk9BUkRdKTsKLQkJCQkvKiB0b2RvOiByZWxlYXNlIGlvLCB2ZWN0b3IgKi8KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBteHNlcl9kb19zb2Z0aW50KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBteHNlcl9zdHJ1Y3QsIHRxdWV1ZSk7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKLQotCXR0eSA9IGluZm8tPnR0eTsKLQotCWlmICh0dHkpIHsKLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChNWFNFUl9FVkVOVF9UWExPVywgJmluZm8tPmV2ZW50KSkKLQkJCXR0eV93YWtldXAodHR5KTsKLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChNWFNFUl9FVkVOVF9IQU5HVVAsICZpbmZvLT5ldmVudCkpCi0JCQl0dHlfaGFuZ3VwKHR0eSk7Ci0JfQotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBteHNlcl9nZXRfbXNyKGludCBiYXNlYWRkciwgaW50IG1vZGUsIGludCBwb3J0LCBzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvKQorc3RhdGljIHVuc2lnbmVkIGNoYXIgbXhzZXJfZ2V0X21zcihpbnQgYmFzZWFkZHIsIGludCBtb2RlLCBpbnQgcG9ydCkKIHsKIAl1bnNpZ25lZCBjaGFyIHN0YXR1cyA9IDA7CiAKQEAgLTk0OSw2ICszNjcsNTI0IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdGljIGludCBteHNlcl9ibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCXN0cnVjdCBteHNlcl9wb3J0ICpwb3J0KQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCWludCByZXR2YWw7CisJaW50IGRvX2Nsb2NhbCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogSWYgbm9uLWJsb2NraW5nIG1vZGUgaXMgc2V0LCBvciB0aGUgcG9ydCBpcyBub3QgZW5hYmxlZCwKKwkgKiB0aGVuIG1ha2UgdGhlIGNoZWNrIHVwIGZyb250IGFuZCB0aGVuIGV4aXQuCisJICovCisJaWYgKChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgfHwKKwkJCXRlc3RfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpKSB7CisJCXBvcnQtPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7CisJCXJldHVybiAwOworCX0KKworCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpCisJCWRvX2Nsb2NhbCA9IDE7CisKKwkvKgorCSAqIEJsb2NrIHdhaXRpbmcgZm9yIHRoZSBjYXJyaWVyIGRldGVjdCBhbmQgdGhlIGxpbmUgdG8gYmVjb21lCisJICogZnJlZSAoaS5lLiwgbm90IGluIHVzZSBieSB0aGUgY2FsbG91dCkuICBXaGlsZSB3ZSBhcmUgaW4KKwkgKiB0aGlzIGxvb3AsIHBvcnQtPmNvdW50IGlzIGRyb3BwZWQgYnkgb25lLCBzbyB0aGF0CisJICogbXhzZXJfY2xvc2UoKSBrbm93cyB3aGVuIHRvIGZyZWUgdGhpbmdzLiAgV2UgcmVzdG9yZSBpdCB1cG9uCisJICogZXhpdCwgZWl0aGVyIG5vcm1hbCBvciBhYm5vcm1hbC4KKwkgKi8KKwlyZXR2YWwgPSAwOworCWFkZF93YWl0X3F1ZXVlKCZwb3J0LT5vcGVuX3dhaXQsICZ3YWl0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5zbG9jaywgZmxhZ3MpOworCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkKKwkJcG9ydC0+Y291bnQtLTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5zbG9jaywgZmxhZ3MpOworCXBvcnQtPmJsb2NrZWRfb3BlbisrOworCXdoaWxlICgxKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5zbG9jaywgZmxhZ3MpOworCQlvdXRiKGluYihwb3J0LT5pb2FkZHIgKyBVQVJUX01DUikgfAorCQkJVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfUlRTLCBwb3J0LT5pb2FkZHIgKyBVQVJUX01DUik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPnNsb2NrLCBmbGFncyk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8ICEocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHsKKwkJCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCisJCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWVsc2UKKwkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIShwb3J0LT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpICYmCisJCQkJKGRvX2Nsb2NhbCB8fAorCQkJCShpbmIocG9ydC0+aW9hZGRyICsgVUFSVF9NU1IpICYgVUFSVF9NU1JfRENEKSkpCisJCQlicmVhazsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQlzY2hlZHVsZSgpOworCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZwb3J0LT5vcGVuX3dhaXQsICZ3YWl0KTsKKwlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpCisJCXBvcnQtPmNvdW50Kys7CisJcG9ydC0+YmxvY2tlZF9vcGVuLS07CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlwb3J0LT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14c2VyX3NldF9iYXVkKHN0cnVjdCBteHNlcl9wb3J0ICppbmZvLCBsb25nIG5ld3NwZCkKK3sKKwlpbnQgcXVvdCA9IDAsIGJhdWQ7CisJdW5zaWduZWQgY2hhciBjdmFsOworCisJaWYgKCFpbmZvLT50dHkgfHwgIWluZm8tPnR0eS0+dGVybWlvcykKKwkJcmV0dXJuIC0xOworCisJaWYgKCEoaW5mby0+aW9hZGRyKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKG5ld3NwZCA+IGluZm8tPm1heF9iYXVkKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobmV3c3BkID09IDEzNCkgeworCQlxdW90ID0gMiAqIGluZm8tPmJhdWRfYmFzZSAvIDI2OTsKKwkJdHR5X2VuY29kZV9iYXVkX3JhdGUoaW5mby0+dHR5LCAxMzQsIDEzNCk7CisJfSBlbHNlIGlmIChuZXdzcGQpIHsKKwkJcXVvdCA9IGluZm8tPmJhdWRfYmFzZSAvIG5ld3NwZDsKKwkJaWYgKHF1b3QgPT0gMCkKKwkJCXF1b3QgPSAxOworCQliYXVkID0gaW5mby0+YmF1ZF9iYXNlL3F1b3Q7CisJCXR0eV9lbmNvZGVfYmF1ZF9yYXRlKGluZm8tPnR0eSwgYmF1ZCwgYmF1ZCk7CisJfSBlbHNlIHsKKwkJcXVvdCA9IDA7CisJfQorCisJaW5mby0+dGltZW91dCA9ICgoaW5mby0+eG1pdF9maWZvX3NpemUgKiBIWiAqIDEwICogcXVvdCkgLyBpbmZvLT5iYXVkX2Jhc2UpOworCWluZm8tPnRpbWVvdXQgKz0gSFogLyA1MDsJLyogQWRkIC4wMiBzZWNvbmRzIG9mIHNsb3AgKi8KKworCWlmIChxdW90KSB7CisJCWluZm8tPk1DUiB8PSBVQVJUX01DUl9EVFI7CisJCW91dGIoaW5mby0+TUNSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX01DUik7CisJfSBlbHNlIHsKKwkJaW5mby0+TUNSICY9IH5VQVJUX01DUl9EVFI7CisJCW91dGIoaW5mby0+TUNSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX01DUik7CisJCXJldHVybiAwOworCX0KKworCWN2YWwgPSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9MQ1IpOworCisJb3V0YihjdmFsIHwgVUFSVF9MQ1JfRExBQiwgaW5mby0+aW9hZGRyICsgVUFSVF9MQ1IpOwkvKiBzZXQgRExBQiAqLworCisJb3V0YihxdW90ICYgMHhmZiwgaW5mby0+aW9hZGRyICsgVUFSVF9ETEwpOwkvKiBMUyBvZiBkaXZpc29yICovCisJb3V0YihxdW90ID4+IDgsIGluZm8tPmlvYWRkciArIFVBUlRfRExNKTsJLyogTVMgb2YgZGl2aXNvciAqLworCW91dGIoY3ZhbCwgaW5mby0+aW9hZGRyICsgVUFSVF9MQ1IpOwkvKiByZXNldCBETEFCICovCisKKyNpZmRlZiBCT1RIRVIKKwlpZiAoQ19CQVVEKGluZm8tPnR0eSkgPT0gQk9USEVSKSB7CisJCXF1b3QgPSBpbmZvLT5iYXVkX2Jhc2UgJSBuZXdzcGQ7CisJCXF1b3QgKj0gODsKKwkJaWYgKHF1b3QgJSBuZXdzcGQgPiBuZXdzcGQgLyAyKSB7CisJCQlxdW90IC89IG5ld3NwZDsKKwkJCXF1b3QrKzsKKwkJfSBlbHNlCisJCQlxdW90IC89IG5ld3NwZDsKKworCQlTRVRfTU9YQV9NVVNUX0VOVU1fVkFMVUUoaW5mby0+aW9hZGRyLCBxdW90KTsKKwl9IGVsc2UKKyNlbmRpZgorCQlTRVRfTU9YQV9NVVNUX0VOVU1fVkFMVUUoaW5mby0+aW9hZGRyLCAwKTsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBzZXQgdGhlIFVBUlQgZGl2aXNvciByZWdpc3RlcnMgdG8gbWF0Y2gKKyAqIHRoZSBzcGVjaWZpZWQgYmF1ZCByYXRlIGZvciBhIHNlcmlhbCBwb3J0LgorICovCitzdGF0aWMgaW50IG14c2VyX2NoYW5nZV9zcGVlZChzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbywKKwkJc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKK3sKKwl1bnNpZ25lZCBjZmxhZywgY3ZhbCwgZmNyOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCisJaWYgKCFpbmZvLT50dHkgfHwgIWluZm8tPnR0eS0+dGVybWlvcykKKwkJcmV0dXJuIHJldDsKKwljZmxhZyA9IGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKwlpZiAoIShpbmZvLT5pb2FkZHIpKQorCQlyZXR1cm4gcmV0OworCisJaWYgKG14c2VyX3NldF9iYXVkX21ldGhvZFtpbmZvLT50dHktPmluZGV4XSA9PSAwKQorCQlteHNlcl9zZXRfYmF1ZChpbmZvLCB0dHlfZ2V0X2JhdWRfcmF0ZShpbmZvLT50dHkpKTsKKworCS8qIGJ5dGUgc2l6ZSBhbmQgcGFyaXR5ICovCisJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7CisJY2FzZSBDUzU6CisJCWN2YWwgPSAweDAwOworCQlicmVhazsKKwljYXNlIENTNjoKKwkJY3ZhbCA9IDB4MDE7CisJCWJyZWFrOworCWNhc2UgQ1M3OgorCQljdmFsID0gMHgwMjsKKwkJYnJlYWs7CisJY2FzZSBDUzg6CisJCWN2YWwgPSAweDAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljdmFsID0gMHgwMDsKKwkJYnJlYWs7CQkvKiB0b28ga2VlcCBHQ0Mgc2h1dC4uLiAqLworCX0KKwlpZiAoY2ZsYWcgJiBDU1RPUEIpCisJCWN2YWwgfD0gMHgwNDsKKwlpZiAoY2ZsYWcgJiBQQVJFTkIpCisJCWN2YWwgfD0gVUFSVF9MQ1JfUEFSSVRZOworCWlmICghKGNmbGFnICYgUEFST0REKSkKKwkJY3ZhbCB8PSBVQVJUX0xDUl9FUEFSOworCWlmIChjZmxhZyAmIENNU1BBUikKKwkJY3ZhbCB8PSBVQVJUX0xDUl9TUEFSOworCisJaWYgKChpbmZvLT50eXBlID09IFBPUlRfODI1MCkgfHwgKGluZm8tPnR5cGUgPT0gUE9SVF8xNjQ1MCkpIHsKKwkJaWYgKGluZm8tPmJvYXJkLT5jaGlwX2ZsYWcpIHsKKwkJCWZjciA9IFVBUlRfRkNSX0VOQUJMRV9GSUZPOworCQkJZmNyIHw9IE1PWEFfTVVTVF9GQ1JfR0RBX01PREVfRU5BQkxFOworCQkJU0VUX01PWEFfTVVTVF9GSUZPX1ZBTFVFKGluZm8pOworCQl9IGVsc2UKKwkJCWZjciA9IDA7CisJfSBlbHNlIHsKKwkJZmNyID0gVUFSVF9GQ1JfRU5BQkxFX0ZJRk87CisJCWlmIChpbmZvLT5ib2FyZC0+Y2hpcF9mbGFnKSB7CisJCQlmY3IgfD0gTU9YQV9NVVNUX0ZDUl9HREFfTU9ERV9FTkFCTEU7CisJCQlTRVRfTU9YQV9NVVNUX0ZJRk9fVkFMVUUoaW5mbyk7CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKGluZm8tPnJ4X3RyaWdnZXIpIHsKKwkJCWNhc2UgMToKKwkJCQlmY3IgfD0gVUFSVF9GQ1JfVFJJR0dFUl8xOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCWZjciB8PSBVQVJUX0ZDUl9UUklHR0VSXzQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDg6CisJCQkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfODsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfMTQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiBDVFMgZmxvdyBjb250cm9sIGZsYWcgYW5kIG1vZGVtIHN0YXR1cyBpbnRlcnJ1cHRzICovCisJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9NU0k7CisJaW5mby0+TUNSICY9IH5VQVJUX01DUl9BRkU7CisJaWYgKGNmbGFnICYgQ1JUU0NUUykgeworCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19DVFNfRkxPVzsKKwkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX01TSTsKKwkJaWYgKChpbmZvLT50eXBlID09IFBPUlRfMTY1NTBBKSB8fCAoaW5mby0+Ym9hcmQtPmNoaXBfZmxhZykpIHsKKwkJCWluZm8tPk1DUiB8PSBVQVJUX01DUl9BRkU7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9NU1IpOworCQkJaWYgKGluZm8tPnR0eS0+aHdfc3RvcHBlZCkgeworCQkJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9DVFMpIHsKKwkJCQkJaW5mby0+dHR5LT5od19zdG9wcGVkID0gMDsKKwkJCQkJaWYgKGluZm8tPnR5cGUgIT0gUE9SVF8xNjU1MEEgJiYKKwkJCQkJCQkhaW5mby0+Ym9hcmQtPmNoaXBfZmxhZykgeworCQkJCQkJb3V0YihpbmZvLT5JRVIgJiB+VUFSVF9JRVJfVEhSSSwKKwkJCQkJCQlpbmZvLT5pb2FkZHIgKworCQkJCQkJCVVBUlRfSUVSKTsKKwkJCQkJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOworCQkJCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmlvYWRkciArCisJCQkJCQkJCVVBUlRfSUVSKTsKKwkJCQkJfQorCQkJCQl0dHlfd2FrZXVwKGluZm8tPnR0eSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoIShzdGF0dXMgJiBVQVJUX01TUl9DVFMpKSB7CisJCQkJCWluZm8tPnR0eS0+aHdfc3RvcHBlZCA9IDE7CisJCQkJCWlmICgoaW5mby0+dHlwZSAhPSBQT1JUXzE2NTUwQSkgJiYKKwkJCQkJCQkoIWluZm8tPmJvYXJkLT5jaGlwX2ZsYWcpKSB7CisJCQkJCQlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX1RIUkk7CisJCQkJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+aW9hZGRyICsKKwkJCQkJCQkJVUFSVF9JRVIpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0NUU19GTE9XOworCX0KKwlvdXRiKGluZm8tPk1DUiwgaW5mby0+aW9hZGRyICsgVUFSVF9NQ1IpOworCWlmIChjZmxhZyAmIENMT0NBTCkgeworCQlpbmZvLT5mbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7CisJfSBlbHNlIHsKKwkJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfQ0hFQ0tfQ0Q7CisJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9NU0k7CisJfQorCW91dGIoaW5mby0+SUVSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUik7CisKKwkvKgorCSAqIFNldCB1cCBwYXJpdHkgY2hlY2sgZmxhZworCSAqLworCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgPSBVQVJUX0xTUl9PRSB8IFVBUlRfTFNSX1RIUkUgfCBVQVJUX0xTUl9EUjsKKwlpZiAoSV9JTlBDSyhpbmZvLT50dHkpKQorCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0ZFIHwgVUFSVF9MU1JfUEU7CisJaWYgKElfQlJLSU5UKGluZm8tPnR0eSkgfHwgSV9QQVJNUksoaW5mby0+dHR5KSkKKwkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9CSTsKKworCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayA9IDA7CisKKwlpZiAoSV9JR05CUksoaW5mby0+dHR5KSkgeworCQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfQkk7CisJCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfQkk7CisJCS8qCisJCSAqIElmIHdlJ3JlIGlnbm9yZSBwYXJpdHkgYW5kIGJyZWFrIGluZGljYXRvcnMsIGlnbm9yZQorCQkgKiBvdmVycnVucyB0b28uICAoRm9yIHJlYWwgcmF3IHN1cHBvcnQpLgorCQkgKi8KKwkJaWYgKElfSUdOUEFSKGluZm8tPnR0eSkpIHsKKwkJCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayB8PQorCQkJCQkJVUFSVF9MU1JfT0UgfAorCQkJCQkJVUFSVF9MU1JfUEUgfAorCQkJCQkJVUFSVF9MU1JfRkU7CisJCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9CisJCQkJCQlVQVJUX0xTUl9PRSB8CisJCQkJCQlVQVJUX0xTUl9QRSB8CisJCQkJCQlVQVJUX0xTUl9GRTsKKwkJfQorCX0KKwlpZiAoaW5mby0+Ym9hcmQtPmNoaXBfZmxhZykgeworCQlTRVRfTU9YQV9NVVNUX1hPTjFfVkFMVUUoaW5mby0+aW9hZGRyLCBTVEFSVF9DSEFSKGluZm8tPnR0eSkpOworCQlTRVRfTU9YQV9NVVNUX1hPRkYxX1ZBTFVFKGluZm8tPmlvYWRkciwgU1RPUF9DSEFSKGluZm8tPnR0eSkpOworCQlpZiAoSV9JWE9OKGluZm8tPnR0eSkpIHsKKwkJCUVOQUJMRV9NT1hBX01VU1RfUlhfU09GVFdBUkVfRkxPV19DT05UUk9MKGluZm8tPmlvYWRkcik7CisJCX0gZWxzZSB7CisJCQlESVNBQkxFX01PWEFfTVVTVF9SWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woaW5mby0+aW9hZGRyKTsKKwkJfQorCQlpZiAoSV9JWE9GRihpbmZvLT50dHkpKSB7CisJCQlFTkFCTEVfTU9YQV9NVVNUX1RYX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChpbmZvLT5pb2FkZHIpOworCQl9IGVsc2UgeworCQkJRElTQUJMRV9NT1hBX01VU1RfVFhfU09GVFdBUkVfRkxPV19DT05UUk9MKGluZm8tPmlvYWRkcik7CisJCX0KKwl9CisKKworCW91dGIoZmNyLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0ZDUik7CS8qIHNldCBmY3IgKi8KKwlvdXRiKGN2YWwsIGluZm8tPmlvYWRkciArIFVBUlRfTENSKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG14c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhzdHJ1Y3QgbXhzZXJfcG9ydCAqcG9ydCwgaW50IHN0YXR1cykKK3sKKwkvKiB1cGRhdGUgaW5wdXQgbGluZSBjb3VudGVycyAqLworCWlmIChzdGF0dXMgJiBVQVJUX01TUl9URVJJKQorCQlwb3J0LT5pY291bnQucm5nKys7CisJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0REU1IpCisJCXBvcnQtPmljb3VudC5kc3IrKzsKKwlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRERDRCkKKwkJcG9ydC0+aWNvdW50LmRjZCsrOworCWlmIChzdGF0dXMgJiBVQVJUX01TUl9EQ1RTKQorCQlwb3J0LT5pY291bnQuY3RzKys7CisJcG9ydC0+bW9uX2RhdGEubW9kZW1fc3RhdHVzID0gc3RhdHVzOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+ZGVsdGFfbXNyX3dhaXQpOworCisJaWYgKChwb3J0LT5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKSAmJiAoc3RhdHVzICYgVUFSVF9NU1JfRERDRCkpIHsKKwkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDRCkKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+b3Blbl93YWl0KTsKKwl9CisKKwlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19DVFNfRkxPVykgeworCQlpZiAocG9ydC0+dHR5LT5od19zdG9wcGVkKSB7CisJCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfQ1RTKSB7CisJCQkJcG9ydC0+dHR5LT5od19zdG9wcGVkID0gMDsKKworCQkJCWlmICgocG9ydC0+dHlwZSAhPSBQT1JUXzE2NTUwQSkgJiYKKwkJCQkJCSghcG9ydC0+Ym9hcmQtPmNoaXBfZmxhZykpIHsKKwkJCQkJb3V0Yihwb3J0LT5JRVIgJiB+VUFSVF9JRVJfVEhSSSwKKwkJCQkJCXBvcnQtPmlvYWRkciArIFVBUlRfSUVSKTsKKwkJCQkJcG9ydC0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CisJCQkJCW91dGIocG9ydC0+SUVSLCBwb3J0LT5pb2FkZHIgKworCQkJCQkJCVVBUlRfSUVSKTsKKwkJCQl9CisJCQkJdHR5X3dha2V1cChwb3J0LT50dHkpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCEoc3RhdHVzICYgVUFSVF9NU1JfQ1RTKSkgeworCQkJCXBvcnQtPnR0eS0+aHdfc3RvcHBlZCA9IDE7CisJCQkJaWYgKHBvcnQtPnR5cGUgIT0gUE9SVF8xNjU1MEEgJiYKKwkJCQkJCSFwb3J0LT5ib2FyZC0+Y2hpcF9mbGFnKSB7CisJCQkJCXBvcnQtPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKKwkJCQkJb3V0Yihwb3J0LT5JRVIsIHBvcnQtPmlvYWRkciArCisJCQkJCQkJVUFSVF9JRVIpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGludCBteHNlcl9zdGFydHVwKHN0cnVjdCBteHNlcl9wb3J0ICppbmZvKQoreworCXVuc2lnbmVkIGxvbmcgcGFnZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcGFnZSA9IF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXBhZ2UpCisJCXJldHVybiAtRU5PTUVNOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgeworCQlmcmVlX3BhZ2UocGFnZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCWlmICghaW5mby0+aW9hZGRyIHx8ICFpbmZvLT50eXBlKSB7CisJCWlmIChpbmZvLT50dHkpCisJCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCQlmcmVlX3BhZ2UocGFnZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKwlpZiAoaW5mby0+eG1pdF9idWYpCisJCWZyZWVfcGFnZShwYWdlKTsKKwllbHNlCisJCWluZm8tPnhtaXRfYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgcGFnZTsKKworCS8qCisJICogQ2xlYXIgdGhlIEZJRk8gYnVmZmVycyBhbmQgZGlzYWJsZSB0aGVtCisJICogKHRoZXkgd2lsbCBiZSByZWVuYWJsZWQgaW4gbXhzZXJfY2hhbmdlX3NwZWVkKCkpCisJICovCisJaWYgKGluZm8tPmJvYXJkLT5jaGlwX2ZsYWcpCisJCW91dGIoKFVBUlRfRkNSX0NMRUFSX1JDVlIgfAorCQkJVUFSVF9GQ1JfQ0xFQVJfWE1JVCB8CisJCQlNT1hBX01VU1RfRkNSX0dEQV9NT0RFX0VOQUJMRSksIGluZm8tPmlvYWRkciArIFVBUlRfRkNSKTsKKwllbHNlCisJCW91dGIoKFVBUlRfRkNSX0NMRUFSX1JDVlIgfCBVQVJUX0ZDUl9DTEVBUl9YTUlUKSwKKwkJCWluZm8tPmlvYWRkciArIFVBUlRfRkNSKTsKKworCS8qCisJICogQXQgdGhpcyBwb2ludCB0aGVyZSdzIG5vIHdheSB0aGUgTFNSIGNvdWxkIHN0aWxsIGJlIDB4RkY7CisJICogaWYgaXQgaXMsIHRoZW4gYmFpbCBvdXQsIGJlY2F1c2UgdGhlcmUncyBsaWtlbHkgbm8gVUFSVAorCSAqIGhlcmUuCisJICovCisJaWYgKGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX0xTUikgPT0gMHhmZikgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQlpZiAoY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQkJaWYgKGluZm8tPnR0eSkKKwkJCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyoKKwkgKiBDbGVhciB0aGUgaW50ZXJydXB0IHJlZ2lzdGVycy4KKwkgKi8KKwkodm9pZCkgaW5iKGluZm8tPmlvYWRkciArIFVBUlRfTFNSKTsKKwkodm9pZCkgaW5iKGluZm8tPmlvYWRkciArIFVBUlRfUlgpOworCSh2b2lkKSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9JSVIpOworCSh2b2lkKSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9NU1IpOworCisJLyoKKwkgKiBOb3csIGluaXRpYWxpemUgdGhlIFVBUlQKKwkgKi8KKwlvdXRiKFVBUlRfTENSX1dMRU44LCBpbmZvLT5pb2FkZHIgKyBVQVJUX0xDUik7CS8qIHJlc2V0IERMQUIgKi8KKwlpbmZvLT5NQ1IgPSBVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFM7CisJb3V0YihpbmZvLT5NQ1IsIGluZm8tPmlvYWRkciArIFVBUlRfTUNSKTsKKworCS8qCisJICogRmluYWxseSwgZW5hYmxlIGludGVycnVwdHMKKwkgKi8KKwlpbmZvLT5JRVIgPSBVQVJUX0lFUl9NU0kgfCBVQVJUX0lFUl9STFNJIHwgVUFSVF9JRVJfUkRJOworCisJaWYgKGluZm8tPmJvYXJkLT5jaGlwX2ZsYWcpCisJCWluZm8tPklFUiB8PSBNT1hBX01VU1RfSUVSX0VHREFJOworCW91dGIoaW5mby0+SUVSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUik7CS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisKKwkvKgorCSAqIEFuZCBjbGVhciB0aGUgaW50ZXJydXB0IHJlZ2lzdGVycyBhZ2FpbiBmb3IgbHVjay4KKwkgKi8KKwkodm9pZCkgaW5iKGluZm8tPmlvYWRkciArIFVBUlRfTFNSKTsKKwkodm9pZCkgaW5iKGluZm8tPmlvYWRkciArIFVBUlRfUlgpOworCSh2b2lkKSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9JSVIpOworCSh2b2lkKSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9NU1IpOworCisJaWYgKGluZm8tPnR0eSkKKwkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOworCWluZm8tPnhtaXRfY250ID0gaW5mby0+eG1pdF9oZWFkID0gaW5mby0+eG1pdF90YWlsID0gMDsKKworCS8qCisJICogYW5kIHNldCB0aGUgc3BlZWQgb2YgdGhlIHNlcmlhbCBwb3J0CisJICovCisJbXhzZXJfY2hhbmdlX3NwZWVkKGluZm8sIE5VTEwpOworCWluZm8tPmZsYWdzIHw9IEFTWU5DX0lOSVRJQUxJWkVEOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSB3aWxsIHNodXRkb3duIGEgc2VyaWFsIHBvcnQ7IGludGVycnVwdHMgbWF5YmUgZGlzYWJsZWQsIGFuZAorICogRFRSIGlzIGRyb3BwZWQgaWYgdGhlIGhhbmd1cCBvbiBjbG9zZSB0ZXJtaW8gZmxhZyBpcyBvbi4KKyAqLworc3RhdGljIHZvaWQgbXhzZXJfc2h1dGRvd24oc3RydWN0IG14c2VyX3BvcnQgKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogY2xlYXIgZGVsdGFfbXNyX3dhaXQgcXVldWUgdG8gYXZvaWQgbWVtIGxlYWtzOiB3ZSBtYXkgZnJlZSB0aGUgaXJxCisJICogaGVyZSBzbyB0aGUgcXVldWUgbWlnaHQgbmV2ZXIgYmUgd2FrZW4gdXAKKwkgKi8KKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmRlbHRhX21zcl93YWl0KTsKKworCS8qCisJICogRnJlZSB0aGUgSVJRLCBpZiBuZWNlc3NhcnkKKwkgKi8KKwlpZiAoaW5mby0+eG1pdF9idWYpIHsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBpbmZvLT54bWl0X2J1Zik7CisJCWluZm8tPnhtaXRfYnVmID0gTlVMTDsKKwl9CisKKwlpbmZvLT5JRVIgPSAwOworCW91dGIoMHgwMCwgaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOworCisJaWYgKCFpbmZvLT50dHkgfHwgKGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKSkKKwkJaW5mby0+TUNSICY9IH4oVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfUlRTKTsKKwlvdXRiKGluZm8tPk1DUiwgaW5mby0+aW9hZGRyICsgVUFSVF9NQ1IpOworCisJLyogY2xlYXIgUngvVHggRklGTydzICovCisJaWYgKGluZm8tPmJvYXJkLT5jaGlwX2ZsYWcpCisJCW91dGIoVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8IFVBUlRfRkNSX0NMRUFSX1hNSVQgfAorCQkJCU1PWEFfTVVTVF9GQ1JfR0RBX01PREVfRU5BQkxFLAorCQkJCWluZm8tPmlvYWRkciArIFVBUlRfRkNSKTsKKwllbHNlCisJCW91dGIoVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8IFVBUlRfRkNSX0NMRUFSX1hNSVQsCisJCQlpbmZvLT5pb2FkZHIgKyBVQVJUX0ZDUik7CisKKwkvKiByZWFkIGRhdGEgcG9ydCB0byByZXNldCB0aGluZ3MgKi8KKwkodm9pZCkgaW5iKGluZm8tPmlvYWRkciArIFVBUlRfUlgpOworCisJaWYgKGluZm8tPnR0eSkKKwkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKKworCWluZm8tPmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKKworCWlmIChpbmZvLT5ib2FyZC0+Y2hpcF9mbGFnKQorCQlTRVRfTU9YQV9NVVNUX05PX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChpbmZvLT5pb2FkZHIpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKK30KKwogLyoKICAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBzZXJpYWwgcG9ydCBpcyBvcGVuZWQuICBJdAogICogZW5hYmxlcyBpbnRlcnJ1cHRzIGZvciBhIHNlcmlhbCBwb3J0LCBsaW5raW5nIGluIGl0cyBhc3luYyBzdHJ1Y3R1cmUgaW50bwpAQCAtOTU3LDE5ICs4OTMsMTcgQEAKICAqLwogc3RhdGljIGludCBteHNlcl9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQogewotCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm87CisJc3RydWN0IG14c2VyX3BvcnQgKmluZm87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0dmFsLCBsaW5lOwogCi0JLyogaW5pdGlhbGl6ZSBkcml2ZXJfZGF0YSBpbiBjYXNlIHNvbWV0aGluZyBmYWlscyAqLwotCXR0eS0+ZHJpdmVyX2RhdGEgPSBOVUxMOwotCiAJbGluZSA9IHR0eS0+aW5kZXg7CiAJaWYgKGxpbmUgPT0gTVhTRVJfUE9SVFMpCiAJCXJldHVybiAwOwogCWlmIChsaW5lIDwgMCB8fCBsaW5lID4gTVhTRVJfUE9SVFMpCiAJCXJldHVybiAtRU5PREVWOwotCWluZm8gPSBteHZhcl90YWJsZSArIGxpbmU7Ci0JaWYgKCFpbmZvLT5iYXNlKQorCWluZm8gPSAmbXhzZXJfYm9hcmRzW2xpbmUgLyBNWFNFUl9QT1JUU19QRVJfQk9BUkRdLnBvcnRzW2xpbmUgJSBNWFNFUl9QT1JUU19QRVJfQk9BUkRdOworCWlmICghaW5mby0+aW9hZGRyKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXR0eS0+ZHJpdmVyX2RhdGEgPSBpbmZvOwpAQCAtOTc3LDYgKzkxMSw5IEBACiAJLyoKIAkgKiBTdGFydCB1cCBzZXJpYWwgcG9ydAogCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCWluZm8tPmNvdW50Kys7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAlyZXR2YWwgPSBteHNlcl9zdGFydHVwKGluZm8pOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CkBAIC05ODUsMjEgKzkyMiw2IEBACiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAotCWluZm8tPmNvdW50Kys7Ci0KLQlpZiAoKGluZm8tPmNvdW50ID09IDEpICYmIChpbmZvLT5mbGFncyAmIEFTWU5DX1NQTElUX1RFUk1JT1MpKSB7Ci0JCWlmICh0dHktPmRyaXZlci0+c3VidHlwZSA9PSBTRVJJQUxfVFlQRV9OT1JNQUwpCi0JCQkqdHR5LT50ZXJtaW9zID0gaW5mby0+bm9ybWFsX3Rlcm1pb3M7Ci0JCWVsc2UKLQkJCSp0dHktPnRlcm1pb3MgPSBpbmZvLT5jYWxsb3V0X3Rlcm1pb3M7Ci0JCW14c2VyX2NoYW5nZV9zcGVlZChpbmZvLCBOVUxMKTsKLQl9Ci0KLQkvKgotCXN0YXR1cyA9IG14c2VyX2dldF9tc3IoaW5mby0+YmFzZSwgMCwgaW5mby0+cG9ydCk7Ci0JbXhzZXJfY2hlY2tfbW9kZW1fc3RhdHVzKGluZm8sIHN0YXR1cyk7Ci0JKi8KLQogCS8qIHVubWFyayBoZXJlIGZvciB2ZXJ5IGhpZ2ggYmF1ZCByYXRlIChleC4gOTIxNjAwIGJwcykgdXNlZCAqLwogCXR0eS0+bG93X2xhdGVuY3kgPSAxOwogCXJldHVybiAwOwpAQCAtMTAxMywxMSArOTM1LDEwIEBACiAgKi8KIHN0YXRpYyB2b2lkIG14c2VyX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQogewotCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKIAogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCB0dHlfbGRpc2MgKmxkOwogCiAJaWYgKHR0eS0+aW5kZXggPT0gTVhTRVJfUE9SVFMpCiAJCXJldHVybjsKQEAgLTEwNDQsNyArOTY1LDcgQEAKIAl9CiAJaWYgKC0taW5mby0+Y291bnQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAibXhzZXJfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudCBmb3IgIgotCQkJInR0eXMlZDogJWRcbiIsIGluZm8tPnBvcnQsIGluZm8tPmNvdW50KTsKKwkJCSJ0dHlzJWQ6ICVkXG4iLCB0dHktPmluZGV4LCBpbmZvLT5jb3VudCk7CiAJCWluZm8tPmNvdW50ID0gMDsKIAl9CiAJaWYgKGluZm8tPmNvdW50KSB7CkBAIC0xMDczLDIwICs5OTQsMTggQEAKIAkgKiBsaW5lIHN0YXR1cyByZWdpc3Rlci4KIAkgKi8KIAlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX1JMU0k7Ci0JaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykKKwlpZiAoaW5mby0+Ym9hcmQtPmNoaXBfZmxhZykKIAkJaW5mby0+SUVSICY9IH5NT1hBX01VU1RfUkVDVl9JU1I7Ci0vKiBieSBXaWxsaWFtCi0JaW5mby0+cmVhZF9zdGF0dXNfbWFzayAmPSB+VUFSVF9MU1JfRFI7Ci0qLworCiAJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKLQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUik7CiAJCS8qCiAJCSAqIEJlZm9yZSB3ZSBkcm9wIERUUiwgbWFrZSBzdXJlIHRoZSBVQVJUIHRyYW5zbWl0dGVyCiAJCSAqIGhhcyBjb21wbGV0ZWx5IGRyYWluZWQ7IHRoaXMgaXMgZXNwZWNpYWxseQogCQkgKiBpbXBvcnRhbnQgaWYgdGhlcmUgaXMgYSB0cmFuc21pdCBGSUZPIQogCQkgKi8KIAkJdGltZW91dCA9IGppZmZpZXMgKyBIWjsKLQkJd2hpbGUgKCEoaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xTUikgJiBVQVJUX0xTUl9URU1UKSkgeworCQl3aGlsZSAoIShpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9MU1IpICYgVUFSVF9MU1JfVEVNVCkpIHsKIAkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSg1KTsKIAkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQogCQkJCWJyZWFrOwpAQCAtMTA5NiwxNCArMTAxNSw5IEBACiAKIAlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikKIAkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOwotCQkKLQlsZCA9IHR0eV9sZGlzY19yZWYodHR5KTsKLQlpZiAobGQpIHsKLQkJaWYgKGxkLT5mbHVzaF9idWZmZXIpCi0JCQlsZC0+Zmx1c2hfYnVmZmVyKHR0eSk7Ci0JCXR0eV9sZGlzY19kZXJlZihsZCk7Ci0JfQotCQkKKworCXR0eV9sZGlzY19mbHVzaCh0dHkpOworCiAJdHR5LT5jbG9zaW5nID0gMDsKIAlpbmZvLT5ldmVudCA9IDA7CiAJaW5mby0+dHR5ID0gTlVMTDsKQEAgLTExMTQsMTQgKzEwMjgsMTIgQEAKIAl9CiAKIAlpbmZvLT5mbGFncyAmPSB+KEFTWU5DX05PUk1BTF9BQ1RJVkUgfCBBU1lOQ19DTE9TSU5HKTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmNsb3NlX3dhaXQpOwotCiB9CiAKIHN0YXRpYyBpbnQgbXhzZXJfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCiB7CiAJaW50IGMsIHRvdGFsID0gMDsKLQlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghaW5mby0+eG1pdF9idWYpCkBAIC0xMTQ1LDEzICsxMDU3LDE1IEBACiAJCXRvdGFsICs9IGM7CiAJfQogCi0JaWYgKGluZm8tPnhtaXRfY250ICYmICF0dHktPnN0b3BwZWQgJiYgIShpbmZvLT5JRVIgJiBVQVJUX0lFUl9USFJJKSkgeworCWlmIChpbmZvLT54bWl0X2NudCAmJiAhdHR5LT5zdG9wcGVkKSB7CiAJCWlmICghdHR5LT5od19zdG9wcGVkIHx8CiAJCQkJKGluZm8tPnR5cGUgPT0gUE9SVF8xNjU1MEEpIHx8Ci0JCQkJKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykpIHsKKwkJCQkoaW5mby0+Ym9hcmQtPmNoaXBfZmxhZykpIHsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQkJb3V0YihpbmZvLT5JRVIgJiB+VUFSVF9JRVJfVEhSSSwgaW5mby0+aW9hZGRyICsKKwkJCQkJVUFSVF9JRVIpOwogCQkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7Ci0JCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKKwkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUik7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwogCQl9CiAJfQpAQCAtMTE2MCw3ICsxMDc0LDcgQEAKIAogc3RhdGljIHZvaWQgbXhzZXJfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjaCkKIHsKLQlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghaW5mby0+eG1pdF9idWYpCkBAIC0xMTc0LDEzICsxMDg4LDE0IEBACiAJaW5mby0+eG1pdF9oZWFkICY9IFNFUklBTF9YTUlUX1NJWkUgLSAxOwogCWluZm8tPnhtaXRfY250Kys7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQlpZiAoIXR0eS0+c3RvcHBlZCAmJiAhKGluZm8tPklFUiAmIFVBUlRfSUVSX1RIUkkpKSB7CisJaWYgKCF0dHktPnN0b3BwZWQpIHsKIAkJaWYgKCF0dHktPmh3X3N0b3BwZWQgfHwKIAkJCQkoaW5mby0+dHlwZSA9PSBQT1JUXzE2NTUwQSkgfHwKLQkJCQlpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpIHsKKwkJCQlpbmZvLT5ib2FyZC0+Y2hpcF9mbGFnKSB7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwkJCW91dGIoaW5mby0+SUVSICYgflVBUlRfSUVSX1RIUkksIGluZm8tPmlvYWRkciArIFVBUlRfSUVSKTsKIAkJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOwotCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAkJfQogCX0KQEAgLTExODksNyArMTEwNCw3IEBACiAKIHN0YXRpYyB2b2lkIG14c2VyX2ZsdXNoX2NoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0Jc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoaW5mby0+eG1pdF9jbnQgPD0gMCB8fApAQCAtMTE5NywyMSArMTExMiwyMiBAQAogCQkJIWluZm8tPnhtaXRfYnVmIHx8CiAJCQkodHR5LT5od19zdG9wcGVkICYmCiAJCQkgKGluZm8tPnR5cGUgIT0gUE9SVF8xNjU1MEEpICYmCi0JCQkgKCFpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpCisJCQkgKCFpbmZvLT5ib2FyZC0+Y2hpcF9mbGFnKQogCQkJKSkKIAkJcmV0dXJuOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiAKKwlvdXRiKGluZm8tPklFUiAmIH5VQVJUX0lFUl9USFJJLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUik7CiAJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7Ci0Jb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisJb3V0YihpbmZvLT5JRVIsIGluZm8tPmlvYWRkciArIFVBUlRfSUVSKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQgbXhzZXJfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpbnQgcmV0OwogCiAJcmV0ID0gU0VSSUFMX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfY250IC0gMTsKQEAgLTEyMjIsMTMgKzExMzgsMTMgQEAKIAogc3RhdGljIGludCBteHNlcl9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJcmV0dXJuIGluZm8tPnhtaXRfY250OwogfQogCiBzdGF0aWMgdm9pZCBteHNlcl9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJY2hhciBmY3I7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMTIzNiwzOSArMTE1Miw0OTcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAlpbmZvLT54bWl0X2NudCA9IGluZm8tPnhtaXRfaGVhZCA9IGluZm8tPnhtaXRfdGFpbCA9IDA7CiAKLQkvKiBiZWxvdyBhZGRlZCBieSBzaGluaGF5ICovCi0JZmNyID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0ZDUik7CisJZmNyID0gaW5iKGluZm8tPmlvYWRkciArIFVBUlRfRkNSKTsKIAlvdXRiKChmY3IgfCBVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwgVUFSVF9GQ1JfQ0xFQVJfWE1JVCksCi0JCWluZm8tPmJhc2UgKyBVQVJUX0ZDUik7Ci0Jb3V0YihmY3IsIGluZm8tPmJhc2UgKyBVQVJUX0ZDUik7CisJCWluZm8tPmlvYWRkciArIFVBUlRfRkNSKTsKKwlvdXRiKGZjciwgaW5mby0+aW9hZGRyICsgVUFSVF9GQ1IpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQkvKiBhYm92ZSBhZGRlZCBieSBzaGluaGF5ICovCiAKIAl0dHlfd2FrZXVwKHR0eSk7CiB9CiAKLXN0YXRpYyBpbnQgbXhzZXJfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZnJpZW5kcyBvZiBteHNlcl9pb2N0bCgpCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCBteHNlcl9nZXRfc2VyaWFsX2luZm8oc3RydWN0IG14c2VyX3BvcnQgKmluZm8sCisJCXN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqcmV0aW5mbykKIHsKLQlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpbnQgcmV0dmFsOwotCXN0cnVjdCBhc3luY19pY291bnQgY3ByZXYsIGNub3c7CS8qIGtlcm5lbCBjb3VudGVyIHRlbXBzICovCisJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgdG1wID0geworCQkudHlwZSA9IGluZm8tPnR5cGUsCisJCS5saW5lID0gaW5mby0+dHR5LT5pbmRleCwKKwkJLnBvcnQgPSBpbmZvLT5pb2FkZHIsCisJCS5pcnEgPSBpbmZvLT5ib2FyZC0+aXJxLAorCQkuZmxhZ3MgPSBpbmZvLT5mbGFncywKKwkJLmJhdWRfYmFzZSA9IGluZm8tPmJhdWRfYmFzZSwKKwkJLmNsb3NlX2RlbGF5ID0gaW5mby0+Y2xvc2VfZGVsYXksCisJCS5jbG9zaW5nX3dhaXQgPSBpbmZvLT5jbG9zaW5nX3dhaXQsCisJCS5jdXN0b21fZGl2aXNvciA9IGluZm8tPmN1c3RvbV9kaXZpc29yLAorCQkuaHViNiA9IDAKKwl9OworCWlmIChjb3B5X3RvX3VzZXIocmV0aW5mbywgJnRtcCwgc2l6ZW9mKCpyZXRpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14c2VyX3NldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbywKKwkJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpuZXdfaW5mbykKK3sKKwlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBuZXdfc2VyaWFsOworCXNwZWVkX3QgYmF1ZDsKKwl1bnNpZ25lZCBsb25nIHNsX2ZsYWdzOworCXVuc2lnbmVkIGludCBmbGFnczsKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmICghbmV3X2luZm8gfHwgIWluZm8tPmlvYWRkcikKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfc2VyaWFsLCBuZXdfaW5mbywgc2l6ZW9mKG5ld19zZXJpYWwpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAobmV3X3NlcmlhbC5pcnEgIT0gaW5mby0+Ym9hcmQtPmlycSB8fAorCQkJbmV3X3NlcmlhbC5wb3J0ICE9IGluZm8tPmlvYWRkcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmbGFncyA9IGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0s7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJaWYgKChuZXdfc2VyaWFsLmJhdWRfYmFzZSAhPSBpbmZvLT5iYXVkX2Jhc2UpIHx8CisJCQkJKG5ld19zZXJpYWwuY2xvc2VfZGVsYXkgIT0gaW5mby0+Y2xvc2VfZGVsYXkpIHx8CisJCQkJKChuZXdfc2VyaWFsLmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSAhPSAoaW5mby0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWluZm8tPmZsYWdzID0gKChpbmZvLT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgfAorCQkJCShuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfVVNSX01BU0spKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBPSywgcGFzdCB0aGlzIHBvaW50LCBhbGwgdGhlIGVycm9yIGNoZWNraW5nIGhhcyBiZWVuIGRvbmUuCisJCSAqIEF0IHRoaXMgcG9pbnQsIHdlIHN0YXJ0IG1ha2luZyBjaGFuZ2VzLi4uLi4KKwkJICovCisJCWluZm8tPmZsYWdzID0gKChpbmZvLT5mbGFncyAmIH5BU1lOQ19GTEFHUykgfAorCQkJCShuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfRkxBR1MpKTsKKwkJaW5mby0+Y2xvc2VfZGVsYXkgPSBuZXdfc2VyaWFsLmNsb3NlX2RlbGF5ICogSFogLyAxMDA7CisJCWluZm8tPmNsb3Npbmdfd2FpdCA9IG5ld19zZXJpYWwuY2xvc2luZ193YWl0ICogSFogLyAxMDA7CisJCWluZm8tPnR0eS0+bG93X2xhdGVuY3kgPQorCQkJCShpbmZvLT5mbGFncyAmIEFTWU5DX0xPV19MQVRFTkNZKSA/IDEgOiAwOworCQlpbmZvLT50dHktPmxvd19sYXRlbmN5ID0gMDsKKwkJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfQ1VTVCAmJgorCQkJCShuZXdfc2VyaWFsLmJhdWRfYmFzZSAhPSBpbmZvLT5iYXVkX2Jhc2UgfHwKKwkJCQluZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yICE9CisJCQkJaW5mby0+Y3VzdG9tX2Rpdmlzb3IpKSB7CisJCQliYXVkID0gbmV3X3NlcmlhbC5iYXVkX2Jhc2UgLyBuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yOworCQkJdHR5X2VuY29kZV9iYXVkX3JhdGUoaW5mby0+dHR5LCBiYXVkLCBiYXVkKTsKKwkJfQorCX0KKworCWluZm8tPnR5cGUgPSBuZXdfc2VyaWFsLnR5cGU7CisKKwlwcm9jZXNzX3R4cnhfZmlmbyhpbmZvKTsKKworCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7CisJCWlmIChmbGFncyAhPSAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgc2xfZmxhZ3MpOworCQkJbXhzZXJfY2hhbmdlX3NwZWVkKGluZm8sIE5VTEwpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIHNsX2ZsYWdzKTsKKwkJfQorCX0gZWxzZQorCQlyZXR2YWwgPSBteHNlcl9zdGFydHVwKGluZm8pOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIG14c2VyX2dldF9sc3JfaW5mbyAtIGdldCBsaW5lIHN0YXR1cyByZWdpc3RlciBpbmZvCisgKgorICogUHVycG9zZTogTGV0IHVzZXIgY2FsbCBpb2N0bCgpIHRvIGdldCBpbmZvIHdoZW4gdGhlIFVBUlQgcGh5c2ljYWxseQorICoJICAgIGlzIGVtcHRpZWQuICBPbiBidXMgdHlwZXMgbGlrZSBSUzQ4NSwgdGhlIHRyYW5zbWl0dGVyIG11c3QKKyAqCSAgICByZWxlYXNlIHRoZSBidXMgYWZ0ZXIgdHJhbnNtaXR0aW5nLiBUaGlzIG11c3QgYmUgZG9uZSB3aGVuCisgKgkgICAgdGhlIHRyYW5zbWl0IHNoaWZ0IHJlZ2lzdGVyIGlzIGVtcHR5LCBub3QgYmUgZG9uZSB3aGVuIHRoZQorICoJICAgIHRyYW5zbWl0IGhvbGRpbmcgcmVnaXN0ZXIgaXMgZW1wdHkuICBUaGlzIGZ1bmN0aW9uYWxpdHkKKyAqCSAgICBhbGxvd3MgYW4gUlM0ODUgZHJpdmVyIHRvIGJlIHdyaXR0ZW4gaW4gdXNlciBzcGFjZS4KKyAqLworc3RhdGljIGludCBteHNlcl9nZXRfbHNyX2luZm8oc3RydWN0IG14c2VyX3BvcnQgKmluZm8sCisJCXVuc2lnbmVkIGludCBfX3VzZXIgKnZhbHVlKQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCXVuc2lnbmVkIGludCByZXN1bHQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCXN0YXR1cyA9IGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX0xTUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlyZXN1bHQgPSAoKHN0YXR1cyAmIFVBUlRfTFNSX1RFTVQpID8gVElPQ1NFUl9URU1UIDogMCk7CisJcmV0dXJuIHB1dF91c2VyKHJlc3VsdCwgdmFsdWUpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIHNlbmRzIGEgYnJlYWsgY2hhcmFjdGVyIG91dCB0aGUgc2VyaWFsIHBvcnQuCisgKi8KK3N0YXRpYyB2b2lkIG14c2VyX3NlbmRfYnJlYWsoc3RydWN0IG14c2VyX3BvcnQgKmluZm8sIGludCBkdXJhdGlvbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFpbmZvLT5pb2FkZHIpCisJCXJldHVybjsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCW91dGIoaW5iKGluZm8tPmlvYWRkciArIFVBUlRfTENSKSB8IFVBUlRfTENSX1NCQywKKwkJaW5mby0+aW9hZGRyICsgVUFSVF9MQ1IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJc2NoZWR1bGVfdGltZW91dChkdXJhdGlvbik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJb3V0YihpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9MQ1IpICYgflVBUlRfTENSX1NCQywKKwkJaW5mby0+aW9hZGRyICsgVUFSVF9MQ1IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgbXhzZXJfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGNoYXIgY29udHJvbCwgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKworCWlmICh0dHktPmluZGV4ID09IE1YU0VSX1BPUlRTKQorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCWlmICh0ZXN0X2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKSkKKwkJcmV0dXJuIC1FSU87CisKKwljb250cm9sID0gaW5mby0+TUNSOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CisJc3RhdHVzID0gaW5iKGluZm8tPmlvYWRkciArIFVBUlRfTVNSKTsKKwlpZiAoc3RhdHVzICYgVUFSVF9NU1JfQU5ZX0RFTFRBKQorCQlteHNlcl9jaGVja19tb2RlbV9zdGF0dXMoaW5mbywgc3RhdHVzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCXJldHVybiAoKGNvbnRyb2wgJiBVQVJUX01DUl9SVFMpID8gVElPQ01fUlRTIDogMCkgfAorCQkgICAgKChjb250cm9sICYgVUFSVF9NQ1JfRFRSKSA/IFRJT0NNX0RUUiA6IDApIHwKKwkJICAgICgoc3RhdHVzICYgVUFSVF9NU1JfRENEKSA/IFRJT0NNX0NBUiA6IDApIHwKKwkJICAgICgoc3RhdHVzICYgVUFSVF9NU1JfUkkpID8gVElPQ01fUk5HIDogMCkgfAorCQkgICAgKChzdGF0dXMgJiBVQVJUX01TUl9EU1IpID8gVElPQ01fRFNSIDogMCkgfAorCQkgICAgKChzdGF0dXMgJiBVQVJUX01TUl9DVFMpID8gVElPQ01fQ1RTIDogMCk7Cit9CisKK3N0YXRpYyBpbnQgbXhzZXJfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCXVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKwlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCisJaWYgKHR0eS0+aW5kZXggPT0gTVhTRVJfUE9SVFMpCisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJaWYgKHRlc3RfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpKQorCQlyZXR1cm4gLUVJTzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCisJaWYgKHNldCAmIFRJT0NNX1JUUykKKwkJaW5mby0+TUNSIHw9IFVBUlRfTUNSX1JUUzsKKwlpZiAoc2V0ICYgVElPQ01fRFRSKQorCQlpbmZvLT5NQ1IgfD0gVUFSVF9NQ1JfRFRSOworCisJaWYgKGNsZWFyICYgVElPQ01fUlRTKQorCQlpbmZvLT5NQ1IgJj0gflVBUlRfTUNSX1JUUzsKKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCisJCWluZm8tPk1DUiAmPSB+VUFSVF9NQ1JfRFRSOworCisJb3V0YihpbmZvLT5NQ1IsIGluZm8tPmlvYWRkciArIFVBUlRfTUNSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBteHNlcl9wcm9ncmFtX21vZGUoaW50IHBvcnQpCit7CisJaW50IGlkLCBpLCBqLCBuOworCisJb3V0YigwLCBwb3J0KTsKKwlvdXRiKDAsIHBvcnQpOworCW91dGIoMCwgcG9ydCk7CisJKHZvaWQpaW5iKHBvcnQpOworCSh2b2lkKWluYihwb3J0KTsKKwlvdXRiKDAsIHBvcnQpOworCSh2b2lkKWluYihwb3J0KTsKKworCWlkID0gaW5iKHBvcnQgKyAxKSAmIDB4MUY7CisJaWYgKChpZCAhPSBDMTY4X0FTSUNfSUQpICYmCisJCQkoaWQgIT0gQzEwNF9BU0lDX0lEKSAmJgorCQkJKGlkICE9IEMxMDJfQVNJQ19JRCkgJiYKKwkJCShpZCAhPSBDSTEzMl9BU0lDX0lEKSAmJgorCQkJKGlkICE9IENJMTM0X0FTSUNfSUQpICYmCisJCQkoaWQgIT0gQ0kxMDRKX0FTSUNfSUQpKQorCQlyZXR1cm4gLTE7CisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCA0OyBpKyspIHsKKwkJbiA9IGluYihwb3J0ICsgMik7CisJCWlmIChuID09ICdNJykgeworCQkJaiA9IDE7CisJCX0gZWxzZSBpZiAoKGogPT0gMSkgJiYgKG4gPT0gMSkpIHsKKwkJCWogPSAyOworCQkJYnJlYWs7CisJCX0gZWxzZQorCQkJaiA9IDA7CisJfQorCWlmIChqICE9IDIpCisJCWlkID0gLTI7CisJcmV0dXJuIGlkOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgbXhzZXJfbm9ybWFsX21vZGUoaW50IHBvcnQpCit7CisJaW50IGksIG47CisKKwlvdXRiKDB4QTUsIHBvcnQgKyAxKTsKKwlvdXRiKDB4ODAsIHBvcnQgKyAzKTsKKwlvdXRiKDEyLCBwb3J0ICsgMCk7CS8qIDk2MDAgYnBzICovCisJb3V0YigwLCBwb3J0ICsgMSk7CisJb3V0YigweDAzLCBwb3J0ICsgMyk7CS8qIDggZGF0YSBiaXRzICovCisJb3V0YigweDEzLCBwb3J0ICsgNCk7CS8qIGxvb3AgYmFjayBtb2RlICovCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJbiA9IGluYihwb3J0ICsgNSk7CisJCWlmICgobiAmIDB4NjEpID09IDB4NjApCisJCQlicmVhazsKKwkJaWYgKChuICYgMSkgPT0gMSkKKwkJCSh2b2lkKWluYihwb3J0KTsKKwl9CisJb3V0YigweDAwLCBwb3J0ICsgNCk7Cit9CisKKyNkZWZpbmUgQ0hJUF9TSyAJMHgwMQkvKiBTZXJpYWwgRGF0YSBDbG9jayAgaW4gRXByb20gKi8KKyNkZWZpbmUgQ0hJUF9ETyAJMHgwMgkvKiBTZXJpYWwgRGF0YSBPdXRwdXQgaW4gRXByb20gKi8KKyNkZWZpbmUgQ0hJUF9DUyAJMHgwNAkvKiBTZXJpYWwgQ2hpcCBTZWxlY3QgaW4gRXByb20gKi8KKyNkZWZpbmUgQ0hJUF9ESSAJMHgwOAkvKiBTZXJpYWwgRGF0YSBJbnB1dCAgaW4gRXByb20gKi8KKyNkZWZpbmUgRU5fQ0NNRCAJMHgwMDAJLyogQ2hpcCdzIGNvbW1hbmQgcmVnaXN0ZXIgICAgICovCisjZGVmaW5lIEVOMF9SU0FSTE8JMHgwMDgJLyogUmVtb3RlIHN0YXJ0IGFkZHJlc3MgcmVnIDAgICovCisjZGVmaW5lIEVOMF9SU0FSSEkJMHgwMDkJLyogUmVtb3RlIHN0YXJ0IGFkZHJlc3MgcmVnIDEgICovCisjZGVmaW5lIEVOMF9SQ05UTE8JMHgwMEEJLyogUmVtb3RlIGJ5dGUgY291bnQgcmVnIFdSICAgICovCisjZGVmaW5lIEVOMF9SQ05USEkJMHgwMEIJLyogUmVtb3RlIGJ5dGUgY291bnQgcmVnIFdSICAgICovCisjZGVmaW5lIEVOMF9EQ0ZHCTB4MDBFCS8qIERhdGEgY29uZmlndXJhdGlvbiByZWcgV1IgICAqLworI2RlZmluZSBFTjBfUE9SVAkweDAxMAkvKiBSY3YgbWlzc2VkIGZyYW1lIGVycm9yIGNvdW50ZXIgUkQgKi8KKyNkZWZpbmUgRU5DX1BBR0UwCTB4MDAwCS8qIFNlbGVjdCBwYWdlIDAgb2YgY2hpcCByZWdpc3RlcnMgICAqLworI2RlZmluZSBFTkNfUEFHRTMJMHgwQzAJLyogU2VsZWN0IHBhZ2UgMyBvZiBjaGlwIHJlZ2lzdGVycyAgICovCitzdGF0aWMgaW50IF9faW5pdCBteHNlcl9yZWFkX3JlZ2lzdGVyKGludCBwb3J0LCB1bnNpZ25lZCBzaG9ydCAqcmVncykKK3sKKwlpbnQgaSwgaywgdmFsdWUsIGlkOworCXVuc2lnbmVkIGludCBqOworCisJaWQgPSBteHNlcl9wcm9ncmFtX21vZGUocG9ydCk7CisJaWYgKGlkIDwgMCkKKwkJcmV0dXJuIGlkOworCWZvciAoaSA9IDA7IGkgPCAxNDsgaSsrKSB7CisJCWsgPSAoaSAmIDB4M0YpIHwgMHgxODA7CisJCWZvciAoaiA9IDB4MTAwOyBqID4gMDsgaiA+Pj0gMSkgeworCQkJb3V0YihDSElQX0NTLCBwb3J0KTsKKwkJCWlmIChrICYgaikgeworCQkJCW91dGIoQ0hJUF9DUyB8IENISVBfRE8sIHBvcnQpOworCQkJCW91dGIoQ0hJUF9DUyB8IENISVBfRE8gfCBDSElQX1NLLCBwb3J0KTsJLyogQT8gYml0IG9mIHJlYWQgKi8KKwkJCX0gZWxzZSB7CisJCQkJb3V0YihDSElQX0NTLCBwb3J0KTsKKwkJCQlvdXRiKENISVBfQ1MgfCBDSElQX1NLLCBwb3J0KTsJLyogQT8gYml0IG9mIHJlYWQgKi8KKwkJCX0KKwkJfQorCQkodm9pZClpbmIocG9ydCk7CisJCXZhbHVlID0gMDsKKwkJZm9yIChrID0gMCwgaiA9IDB4ODAwMDsgayA8IDE2OyBrKyssIGogPj49IDEpIHsKKwkJCW91dGIoQ0hJUF9DUywgcG9ydCk7CisJCQlvdXRiKENISVBfQ1MgfCBDSElQX1NLLCBwb3J0KTsKKwkJCWlmIChpbmIocG9ydCkgJiBDSElQX0RJKQorCQkJCXZhbHVlIHw9IGo7CisJCX0KKwkJcmVnc1tpXSA9IHZhbHVlOworCQlvdXRiKDAsIHBvcnQpOworCX0KKwlteHNlcl9ub3JtYWxfbW9kZShwb3J0KTsKKwlyZXR1cm4gaWQ7Cit9CisKK3N0YXRpYyBpbnQgbXhzZXJfaW9jdGxfc3BlY2lhbCh1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJncCkKK3sKKwlzdHJ1Y3QgbXhzZXJfcG9ydCAqcG9ydDsKKwlpbnQgcmVzdWx0LCBzdGF0dXM7CisJdW5zaWduZWQgaW50IGksIGo7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTU9YQV9HRVRfTUFKT1I6CisJCXJldHVybiBwdXRfdXNlcih0dHltYWpvciwgKGludCBfX3VzZXIgKilhcmdwKTsKKworCWNhc2UgTU9YQV9DSEtQT1JURU5BQkxFOgorCQlyZXN1bHQgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9CT0FSRFM7IGkrKykKKwkJCWZvciAoaiA9IDA7IGogPCBNWFNFUl9QT1JUU19QRVJfQk9BUkQ7IGorKykKKwkJCQlpZiAobXhzZXJfYm9hcmRzW2ldLnBvcnRzW2pdLmlvYWRkcikKKwkJCQkJcmVzdWx0IHw9ICgxIDw8IGkpOworCisJCXJldHVybiBwdXRfdXNlcihyZXN1bHQsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZ3ApOworCWNhc2UgTU9YQV9HRVREQVRBQ09VTlQ6CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm14dmFyX2xvZywgc2l6ZW9mKG14dmFyX2xvZykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCWNhc2UgTU9YQV9HRVRNU1RBVFVTOgorCQlmb3IgKGkgPSAwOyBpIDwgTVhTRVJfQk9BUkRTOyBpKyspCisJCQlmb3IgKGogPSAwOyBqIDwgTVhTRVJfUE9SVFNfUEVSX0JPQVJEOyBqKyspIHsKKwkJCQlwb3J0ID0gJm14c2VyX2JvYXJkc1tpXS5wb3J0c1tqXTsKKworCQkJCUdNU3RhdHVzW2ldLnJpID0gMDsKKwkJCQlpZiAoIXBvcnQtPmlvYWRkcikgeworCQkJCQlHTVN0YXR1c1tpXS5kY2QgPSAwOworCQkJCQlHTVN0YXR1c1tpXS5kc3IgPSAwOworCQkJCQlHTVN0YXR1c1tpXS5jdHMgPSAwOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlpZiAoIXBvcnQtPnR0eSB8fCAhcG9ydC0+dHR5LT50ZXJtaW9zKQorCQkJCQlHTVN0YXR1c1tpXS5jZmxhZyA9CisJCQkJCQlwb3J0LT5ub3JtYWxfdGVybWlvcy5jX2NmbGFnOworCQkJCWVsc2UKKwkJCQkJR01TdGF0dXNbaV0uY2ZsYWcgPQorCQkJCQkJcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCisJCQkJc3RhdHVzID0gaW5iKHBvcnQtPmlvYWRkciArIFVBUlRfTVNSKTsKKwkJCQlpZiAoc3RhdHVzICYgMHg4MCAvKlVBUlRfTVNSX0RDRCAqLyApCisJCQkJCUdNU3RhdHVzW2ldLmRjZCA9IDE7CisJCQkJZWxzZQorCQkJCQlHTVN0YXR1c1tpXS5kY2QgPSAwOworCisJCQkJaWYgKHN0YXR1cyAmIDB4MjAgLypVQVJUX01TUl9EU1IgKi8gKQorCQkJCQlHTVN0YXR1c1tpXS5kc3IgPSAxOworCQkJCWVsc2UKKwkJCQkJR01TdGF0dXNbaV0uZHNyID0gMDsKKworCisJCQkJaWYgKHN0YXR1cyAmIDB4MTAgLypVQVJUX01TUl9DVFMgKi8gKQorCQkJCQlHTVN0YXR1c1tpXS5jdHMgPSAxOworCQkJCWVsc2UKKwkJCQkJR01TdGF0dXNbaV0uY3RzID0gMDsKKwkJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBHTVN0YXR1cywKKwkJCQlzaXplb2Yoc3RydWN0IG14c2VyX21zdGF0dXMpICogTVhTRVJfUE9SVFMpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCWNhc2UgTU9YQV9BU1BQX01PTl9FWFQ6IHsKKwkJaW50IHAsIHNoaWZ0Yml0OworCQl1bnNpZ25lZCBsb25nIG9wbW9kZTsKKwkJdW5zaWduZWQgY2ZsYWcsIGlmbGFnOworCisJCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9CT0FSRFM7IGkrKykKKwkJCWZvciAoaiA9IDA7IGogPCBNWFNFUl9QT1JUU19QRVJfQk9BUkQ7IGorKykgeworCQkJCXBvcnQgPSAmbXhzZXJfYm9hcmRzW2ldLnBvcnRzW2pdOworCQkJCWlmICghcG9ydC0+aW9hZGRyKQorCQkJCQljb250aW51ZTsKKworCQkJCXN0YXR1cyA9IG14c2VyX2dldF9tc3IocG9ydC0+aW9hZGRyLCAwLCBpKTsKKworCQkJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9URVJJKQorCQkJCQlwb3J0LT5pY291bnQucm5nKys7CisJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0REU1IpCisJCQkJCXBvcnQtPmljb3VudC5kc3IrKzsKKwkJCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRERDRCkKKwkJCQkJcG9ydC0+aWNvdW50LmRjZCsrOworCQkJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9EQ1RTKQorCQkJCQlwb3J0LT5pY291bnQuY3RzKys7CisKKwkJCQlwb3J0LT5tb25fZGF0YS5tb2RlbV9zdGF0dXMgPSBzdGF0dXM7CisJCQkJbW9uX2RhdGFfZXh0LnJ4X2NudFtpXSA9IHBvcnQtPm1vbl9kYXRhLnJ4Y250OworCQkJCW1vbl9kYXRhX2V4dC50eF9jbnRbaV0gPSBwb3J0LT5tb25fZGF0YS50eGNudDsKKwkJCQltb25fZGF0YV9leHQudXBfcnhjbnRbaV0gPQorCQkJCQlwb3J0LT5tb25fZGF0YS51cF9yeGNudDsKKwkJCQltb25fZGF0YV9leHQudXBfdHhjbnRbaV0gPQorCQkJCQlwb3J0LT5tb25fZGF0YS51cF90eGNudDsKKwkJCQltb25fZGF0YV9leHQubW9kZW1fc3RhdHVzW2ldID0KKwkJCQkJcG9ydC0+bW9uX2RhdGEubW9kZW1fc3RhdHVzOworCQkJCW1vbl9kYXRhX2V4dC5iYXVkcmF0ZVtpXSA9CisJCQkJCXR0eV9nZXRfYmF1ZF9yYXRlKHBvcnQtPnR0eSk7CisKKwkJCQlpZiAoIXBvcnQtPnR0eSB8fCAhcG9ydC0+dHR5LT50ZXJtaW9zKSB7CisJCQkJCWNmbGFnID0gcG9ydC0+bm9ybWFsX3Rlcm1pb3MuY19jZmxhZzsKKwkJCQkJaWZsYWcgPSBwb3J0LT5ub3JtYWxfdGVybWlvcy5jX2lmbGFnOworCQkJCX0gZWxzZSB7CisJCQkJCWNmbGFnID0gcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCQkJCQlpZmxhZyA9IHBvcnQtPnR0eS0+dGVybWlvcy0+Y19pZmxhZzsKKwkJCQl9CisKKwkJCQltb25fZGF0YV9leHQuZGF0YWJpdHNbaV0gPSBjZmxhZyAmIENTSVpFOworCisJCQkJbW9uX2RhdGFfZXh0LnN0b3BiaXRzW2ldID0gY2ZsYWcgJiBDU1RPUEI7CisKKwkJCQltb25fZGF0YV9leHQucGFyaXR5W2ldID0KKwkJCQkJY2ZsYWcgJiAoUEFSRU5CIHwgUEFST0REIHwgQ01TUEFSKTsKKworCQkJCW1vbl9kYXRhX2V4dC5mbG93Y3RybFtpXSA9IDB4MDA7CisKKwkJCQlpZiAoY2ZsYWcgJiBDUlRTQ1RTKQorCQkJCQltb25fZGF0YV9leHQuZmxvd2N0cmxbaV0gfD0gMHgwMzsKKworCQkJCWlmIChpZmxhZyAmIChJWE9OIHwgSVhPRkYpKQorCQkJCQltb25fZGF0YV9leHQuZmxvd2N0cmxbaV0gfD0gMHgwQzsKKworCQkJCWlmIChwb3J0LT50eXBlID09IFBPUlRfMTY1NTBBKQorCQkJCQltb25fZGF0YV9leHQuZmlmb1tpXSA9IDE7CisJCQkJZWxzZQorCQkJCQltb25fZGF0YV9leHQuZmlmb1tpXSA9IDA7CisKKwkJCQlwID0gaSAlIDQ7CisJCQkJc2hpZnRiaXQgPSBwICogMjsKKwkJCQlvcG1vZGUgPSBpbmIocG9ydC0+b3Btb2RlX2lvYWRkcikgPj4gc2hpZnRiaXQ7CisJCQkJb3Btb2RlICY9IE9QX01PREVfTUFTSzsKKworCQkJCW1vbl9kYXRhX2V4dC5pZnR5cGVbaV0gPSBvcG1vZGU7CisKKwkJCX0KKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm1vbl9kYXRhX2V4dCwKKwkJCQkJCXNpemVvZihtb25fZGF0YV9leHQpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJcmV0dXJuIDA7CisKKwl9IGRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14c2VyX2NmbGFnc19jaGFuZ2VkKHN0cnVjdCBteHNlcl9wb3J0ICppbmZvLCB1bnNpZ25lZCBsb25nIGFyZywKKwkJc3RydWN0IGFzeW5jX2ljb3VudCAqY3ByZXYpCit7CisJc3RydWN0IGFzeW5jX2ljb3VudCBjbm93OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCWNub3cgPSBpbmZvLT5pY291bnQ7CS8qIGF0b21pYyBjb3B5ICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKworCXJldCA9CSgoYXJnICYgVElPQ01fUk5HKSAmJiAoY25vdy5ybmcgIT0gY3ByZXYtPnJuZykpIHx8CisJCSgoYXJnICYgVElPQ01fRFNSKSAmJiAoY25vdy5kc3IgIT0gY3ByZXYtPmRzcikpIHx8CisJCSgoYXJnICYgVElPQ01fQ0QpICAmJiAoY25vdy5kY2QgIT0gY3ByZXYtPmRjZCkpIHx8CisJCSgoYXJnICYgVElPQ01fQ1RTKSAmJiAoY25vdy5jdHMgIT0gY3ByZXYtPmN0cykpOworCisJKmNwcmV2ID0gY25vdzsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXhzZXJfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgYXN5bmNfaWNvdW50IGNub3c7CiAJc3RydWN0IHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgX191c2VyICpwX2N1c2VyOwotCXVuc2lnbmVkIGxvbmcgdGVtcGw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgcmV0dmFsOwogCiAJaWYgKHR0eS0+aW5kZXggPT0gTVhTRVJfUE9SVFMpCiAJCXJldHVybiBteHNlcl9pb2N0bF9zcGVjaWFsKGNtZCwgYXJncCk7CiAKLQkvKiBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDEtMDUtMjAwNCAqLwogCWlmIChjbWQgPT0gTU9YQV9TRVRfT1BfTU9ERSB8fCBjbWQgPT0gTU9YQV9HRVRfT1BfTU9ERSkgewotCQlpbnQgb3Btb2RlLCBwOworCQlpbnQgcDsKKwkJdW5zaWduZWQgbG9uZyBvcG1vZGU7CiAJCXN0YXRpYyB1bnNpZ25lZCBjaGFyIE1vZGVNYXNrW10gPSB7IDB4ZmMsIDB4ZjMsIDB4Y2YsIDB4M2YgfTsKIAkJaW50IHNoaWZ0Yml0OwogCQl1bnNpZ25lZCBjaGFyIHZhbCwgbWFzazsKIAotCQlwID0gaW5mby0+cG9ydCAlIDQ7CisJCXAgPSB0dHktPmluZGV4ICUgNDsKIAkJaWYgKGNtZCA9PSBNT1hBX1NFVF9PUF9NT0RFKSB7CiAJCQlpZiAoZ2V0X3VzZXIob3Btb2RlLCAoaW50IF9fdXNlciAqKSBhcmdwKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTEyODcsMTcgKzE2NjEsMTYgQEAKIAkJCXNoaWZ0Yml0ID0gcCAqIDI7CiAJCQlvcG1vZGUgPSBpbmIoaW5mby0+b3Btb2RlX2lvYWRkcikgPj4gc2hpZnRiaXQ7CiAJCQlvcG1vZGUgJj0gT1BfTU9ERV9NQVNLOwotCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmb3Btb2RlLCBzaXplb2YoaW50KSkpCisJCQlpZiAocHV0X3VzZXIob3Btb2RlLCAoaW50IF9fdXNlciAqKWFyZ3ApKQogCQkJCXJldHVybiAtRUZBVUxUOwogCQl9CiAJCXJldHVybiAwOwogCX0KLQkvKiBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwMS0wNS0yMDA0ICovCiAKLQlpZiAoKGNtZCAhPSBUSU9DR1NFUklBTCkgJiYgKGNtZCAhPSBUSU9DTUlXQUlUKSAmJiAoY21kICE9IFRJT0NHSUNPVU5UKSkgewotCQlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCi0JCQlyZXR1cm4gLUVJTzsKLQl9CisJaWYgKGNtZCAhPSBUSU9DR1NFUklBTCAmJiBjbWQgIT0gVElPQ01JV0FJVCAmJiBjbWQgIT0gVElPQ0dJQ09VTlQgJiYKKwkJCXRlc3RfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpKQorCQlyZXR1cm4gLUVJTzsKKwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBUQ1NCUks6CQkvKiBTVklEIHZlcnNpb246IG5vbi16ZXJvIGFyZyAtLT4gbm8gYnJlYWsgKi8KIAkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOwpAQCAtMTMxNSwxMSArMTY4OCwxMCBAQAogCQlteHNlcl9zZW5kX2JyZWFrKGluZm8sIGFyZyA/IGFyZyAqIChIWiAvIDEwKSA6IEhaIC8gNCk7CiAJCXJldHVybiAwOwogCWNhc2UgVElPQ0dTT0ZUQ0FSOgotCQlyZXR1cm4gcHV0X3VzZXIoQ19DTE9DQUwodHR5KSA/IDEgOiAwLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmdwKTsKKwkJcmV0dXJuIHB1dF91c2VyKCEhQ19DTE9DQUwodHR5KSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJncCk7CiAJY2FzZSBUSU9DU1NPRlRDQVI6Ci0JCWlmIChnZXRfdXNlcih0ZW1wbCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGFyZ3ApKQorCQlpZiAoZ2V0X3VzZXIoYXJnLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmdwKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQlhcmcgPSB0ZW1wbDsKIAkJdHR5LT50ZXJtaW9zLT5jX2NmbGFnID0gKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiB+Q0xPQ0FMKSB8IChhcmcgPyBDTE9DQUwgOiAwKSk7CiAJCXJldHVybiAwOwogCWNhc2UgVElPQ0dTRVJJQUw6CkBAIC0xMzM5LDMwICsxNzExLDE5IEBACiAJCWNub3cgPSBpbmZvLT5pY291bnQ7CS8qIG5vdGUgdGhlIGNvdW50ZXJzIG9uIGVudHJ5ICovCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiAKLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluZm8tPmRlbHRhX21zcl93YWl0LCAoewotCQkJY3ByZXYgPSBjbm93OwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0JCQljbm93ID0gaW5mby0+aWNvdW50OwkvKiBhdG9taWMgY29weSAqLwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQotCQkJKChhcmcgJiBUSU9DTV9STkcpICYmIChjbm93LnJuZyAhPSBjcHJldi5ybmcpKSB8fAotCQkJKChhcmcgJiBUSU9DTV9EU1IpICYmIChjbm93LmRzciAhPSBjcHJldi5kc3IpKSB8fAotCQkJKChhcmcgJiBUSU9DTV9DRCkgICYmIChjbm93LmRjZCAhPSBjcHJldi5kY2QpKSB8fAotCQkJKChhcmcgJiBUSU9DTV9DVFMpICYmIChjbm93LmN0cyAhPSBjcHJldi5jdHMpKTsKLQkJfSkpOwotCQlicmVhazsKLQkJLyoKLQkJICogR2V0IGNvdW50ZXIgb2YgaW5wdXQgc2VyaWFsIGxpbmUgaW50ZXJydXB0cyAoRENELFJJLERTUixDVFMpCi0JCSAqIFJldHVybjogd3JpdGUgY291bnRlcnMgdG8gdGhlIHVzZXIgcGFzc2VkIGNvdW50ZXIgc3RydWN0Ci0JCSAqIE5COiBib3RoIDEtPjAgYW5kIDAtPjEgdHJhbnNpdGlvbnMgYXJlIGNvdW50ZWQgZXhjZXB0IGZvcgotCQkgKiAgICAgUkkgd2hlcmUgb25seSAwLT4xIGlzIGNvdW50ZWQuCi0JCSAqLworCQlyZXR1cm4gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluZm8tPmRlbHRhX21zcl93YWl0LAorCQkJCW14c2VyX2NmbGFnc19jaGFuZ2VkKGluZm8sIGFyZywgJmNub3cpKTsKKwkvKgorCSAqIEdldCBjb3VudGVyIG9mIGlucHV0IHNlcmlhbCBsaW5lIGludGVycnVwdHMgKERDRCxSSSxEU1IsQ1RTKQorCSAqIFJldHVybjogd3JpdGUgY291bnRlcnMgdG8gdGhlIHVzZXIgcGFzc2VkIGNvdW50ZXIgc3RydWN0CisJICogTkI6IGJvdGggMS0+MCBhbmQgMC0+MSB0cmFuc2l0aW9ucyBhcmUgY291bnRlZCBleGNlcHQgZm9yCisJICogICAgIFJJIHdoZXJlIG9ubHkgMC0+MSBpcyBjb3VudGVkLgorCSAqLwogCWNhc2UgVElPQ0dJQ09VTlQ6CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwogCQljbm93ID0gaW5mby0+aWNvdW50OwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwogCQlwX2N1c2VyID0gYXJncDsKLQkJLyogbW9kaWZpZWQgYnkgY2FzcGVyIDEvMTEvMjAwMCAqLwogCQlpZiAocHV0X3VzZXIoY25vdy5mcmFtZSwgJnBfY3VzZXItPmZyYW1lKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlpZiAocHV0X3VzZXIoY25vdy5icmssICZwX2N1c2VyLT5icmspKQpAQCAtMTM4NCwyNDAgKzE3NDUsNjUgQEAKIAkJcmV0dXJuIDA7CiAJY2FzZSBNT1hBX0hpZ2hTcGVlZE9uOgogCQlyZXR1cm4gcHV0X3VzZXIoaW5mby0+YmF1ZF9iYXNlICE9IDExNTIwMCA/IDEgOiAwLCAoaW50IF9fdXNlciAqKWFyZ3ApOwotCWNhc2UgTU9YQV9TRFNfUlNUSUNPVU5URVI6IHsKLQkJCWluZm8tPm1vbl9kYXRhLnJ4Y250ID0gMDsKLQkJCWluZm8tPm1vbl9kYXRhLnR4Y250ID0gMDsKLQkJCXJldHVybiAwOwotCQl9Ci0vKiAoYWJvdmUpIGFkZGVkIGJ5IEphbWVzLiAqLwotCWNhc2UgTU9YQV9BU1BQX1NFVEJBVUQ6ewotCQkJbG9uZyBiYXVkOwotCQkJaWYgKGdldF91c2VyKGJhdWQsIChsb25nIF9fdXNlciAqKWFyZ3ApKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJbXhzZXJfc2V0X2JhdWQoaW5mbywgYmF1ZCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCWNhc2UgTU9YQV9BU1BQX0dFVEJBVUQ6Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8tPnJlYWxiYXVkLCBzaXplb2YobG9uZykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KKwljYXNlIE1PWEFfU0RTX1JTVElDT1VOVEVSOgorCQlpbmZvLT5tb25fZGF0YS5yeGNudCA9IDA7CisJCWluZm8tPm1vbl9kYXRhLnR4Y250ID0gMDsKIAkJcmV0dXJuIDA7CiAKIAljYXNlIE1PWEFfQVNQUF9PUVVFVUU6ewotCQkJaW50IGxlbiwgbHNyOworCQlpbnQgbGVuLCBsc3I7CiAKLQkJCWxlbiA9IG14c2VyX2NoYXJzX2luX2J1ZmZlcih0dHkpOworCQlsZW4gPSBteHNlcl9jaGFyc19pbl9idWZmZXIodHR5KTsKIAotCQkJbHNyID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xTUikgJiBVQVJUX0xTUl9URU1UOworCQlsc3IgPSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9MU1IpICYgVUFSVF9MU1JfVEVNVDsKIAotCQkJbGVuICs9IChsc3IgPyAwIDogMSk7CisJCWxlbiArPSAobHNyID8gMCA6IDEpOwogCi0JCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZsZW4sIHNpemVvZihpbnQpKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQljYXNlIE1PWEFfQVNQUF9NT046IHsKLQkJCWludCBtY3IsIHN0YXR1czsKLQotCQkJLyogaW5mby0+bW9uX2RhdGEuc2VyX3BhcmFtID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOyAqLwotCi0JCQlzdGF0dXMgPSBteHNlcl9nZXRfbXNyKGluZm8tPmJhc2UsIDEsIGluZm8tPnBvcnQsIGluZm8pOwotCQkJbXhzZXJfY2hlY2tfbW9kZW1fc3RhdHVzKGluZm8sIHN0YXR1cyk7Ci0KLQkJCW1jciA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9NQ1IpOwotCQkJaWYgKG1jciAmIE1PWEFfTVVTVF9NQ1JfWE9OX0ZMQUcpCi0JCQkJaW5mby0+bW9uX2RhdGEuaG9sZF9yZWFzb24gJj0gfk5QUElfTk9USUZZX1hPRkZIT0xEOwotCQkJZWxzZQotCQkJCWluZm8tPm1vbl9kYXRhLmhvbGRfcmVhc29uIHw9IE5QUElfTk9USUZZX1hPRkZIT0xEOwotCi0JCQlpZiAobWNyICYgTU9YQV9NVVNUX01DUl9UWF9YT04pCi0JCQkJaW5mby0+bW9uX2RhdGEuaG9sZF9yZWFzb24gJj0gfk5QUElfTk9USUZZX1hPRkZYRU5UOwotCQkJZWxzZQotCQkJCWluZm8tPm1vbl9kYXRhLmhvbGRfcmVhc29uIHw9IE5QUElfTk9USUZZX1hPRkZYRU5UOwotCi0JCQlpZiAoaW5mby0+dHR5LT5od19zdG9wcGVkKQotCQkJCWluZm8tPm1vbl9kYXRhLmhvbGRfcmVhc29uIHw9IE5QUElfTk9USUZZX0NUU0hPTEQ7Ci0JCQllbHNlCi0JCQkJaW5mby0+bW9uX2RhdGEuaG9sZF9yZWFzb24gJj0gfk5QUElfTk9USUZZX0NUU0hPTEQ7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8tPm1vbl9kYXRhLAotCQkJCQlzaXplb2Yoc3RydWN0IG14c2VyX21vbikpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCi0JY2FzZSBNT1hBX0FTUFBfTFNUQVRVUzogewotCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mby0+ZXJyX3NoYWRvdywKLQkJCQkJc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkJaW5mby0+ZXJyX3NoYWRvdyA9IDA7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCWNhc2UgTU9YQV9TRVRfQkFVRF9NRVRIT0Q6IHsKLQkJCWludCBtZXRob2Q7Ci0KLQkJCWlmIChnZXRfdXNlcihtZXRob2QsIChpbnQgX191c2VyICopYXJncCkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlteHNlcl9zZXRfYmF1ZF9tZXRob2RbaW5mby0+cG9ydF0gPSBtZXRob2Q7Ci0JCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZtZXRob2QsIHNpemVvZihpbnQpKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCQlyZXR1cm4gcHV0X3VzZXIobGVuLCAoaW50IF9fdXNlciAqKWFyZ3ApOwogCX0KLQlyZXR1cm4gMDsKLX0KKwljYXNlIE1PWEFfQVNQUF9NT046IHsKKwkJaW50IG1jciwgc3RhdHVzOwogCi0jaWZuZGVmIENNU1BBUgotI2RlZmluZQlDTVNQQVIgMDEwMDAwMDAwMDAwCi0jZW5kaWYKKwkJc3RhdHVzID0gbXhzZXJfZ2V0X21zcihpbmZvLT5pb2FkZHIsIDEsIHR0eS0+aW5kZXgpOworCQlteHNlcl9jaGVja19tb2RlbV9zdGF0dXMoaW5mbywgc3RhdHVzKTsKIAotc3RhdGljIGludCBteHNlcl9pb2N0bF9zcGVjaWFsKHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmdwKQotewotCWludCBpLCByZXN1bHQsIHN0YXR1czsKKwkJbWNyID0gaW5iKGluZm8tPmlvYWRkciArIFVBUlRfTUNSKTsKKwkJaWYgKG1jciAmIE1PWEFfTVVTVF9NQ1JfWE9OX0ZMQUcpCisJCQlpbmZvLT5tb25fZGF0YS5ob2xkX3JlYXNvbiAmPSB+TlBQSV9OT1RJRllfWE9GRkhPTEQ7CisJCWVsc2UKKwkJCWluZm8tPm1vbl9kYXRhLmhvbGRfcmVhc29uIHw9IE5QUElfTk9USUZZX1hPRkZIT0xEOwogCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIE1PWEFfR0VUX0NPTkY6Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgbXhzZXJjZmcsCi0JCQkJc2l6ZW9mKHN0cnVjdCBteHNlcl9od2NvbmYpICogNCkpCisJCWlmIChtY3IgJiBNT1hBX01VU1RfTUNSX1RYX1hPTikKKwkJCWluZm8tPm1vbl9kYXRhLmhvbGRfcmVhc29uICY9IH5OUFBJX05PVElGWV9YT0ZGWEVOVDsKKwkJZWxzZQorCQkJaW5mby0+bW9uX2RhdGEuaG9sZF9yZWFzb24gfD0gTlBQSV9OT1RJRllfWE9GRlhFTlQ7CisKKwkJaWYgKGluZm8tPnR0eS0+aHdfc3RvcHBlZCkKKwkJCWluZm8tPm1vbl9kYXRhLmhvbGRfcmVhc29uIHw9IE5QUElfTk9USUZZX0NUU0hPTEQ7CisJCWVsc2UKKwkJCWluZm8tPm1vbl9kYXRhLmhvbGRfcmVhc29uICY9IH5OUFBJX05PVElGWV9DVFNIT0xEOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8tPm1vbl9kYXRhLAorCQkJCXNpemVvZihzdHJ1Y3QgbXhzZXJfbW9uKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKKwogCQlyZXR1cm4gMDsKLQljYXNlIE1PWEFfR0VUX01BSk9SOgotCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ0dHltYWpvciwgc2l6ZW9mKGludCkpKQorCX0KKwljYXNlIE1PWEFfQVNQUF9MU1RBVFVTOiB7CisJCWlmIChwdXRfdXNlcihpbmZvLT5lcnJfc2hhZG93LCAodW5zaWduZWQgY2hhciBfX3VzZXIgKilhcmdwKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKIAotCWNhc2UgTU9YQV9HRVRfQ1VNQUpPUjoKLQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2FsbG91dG1ham9yLCBzaXplb2YoaW50KSkpCisJCWluZm8tPmVycl9zaGFkb3cgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBNT1hBX1NFVF9CQVVEX01FVEhPRDogeworCQlpbnQgbWV0aG9kOworCisJCWlmIChnZXRfdXNlcihtZXRob2QsIChpbnQgX191c2VyICopYXJncCkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIDA7Ci0KLQljYXNlIE1PWEFfQ0hLUE9SVEVOQUJMRToKLQkJcmVzdWx0ID0gMDsKLQkJZm9yIChpID0gMDsgaSA8IE1YU0VSX1BPUlRTOyBpKyspIHsKLQkJCWlmIChteHZhcl90YWJsZVtpXS5iYXNlKQotCQkJCXJlc3VsdCB8PSAoMSA8PCBpKTsKLQkJfQotCQlyZXR1cm4gcHV0X3VzZXIocmVzdWx0LCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmdwKTsKLQljYXNlIE1PWEFfR0VUREFUQUNPVU5UOgotCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZteHZhcl9sb2csIHNpemVvZihteHZhcl9sb2cpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKLQljYXNlIE1PWEFfR0VUTVNUQVRVUzoKLQkJZm9yIChpID0gMDsgaSA8IE1YU0VSX1BPUlRTOyBpKyspIHsKLQkJCUdNU3RhdHVzW2ldLnJpID0gMDsKLQkJCWlmICghbXh2YXJfdGFibGVbaV0uYmFzZSkgewotCQkJCUdNU3RhdHVzW2ldLmRjZCA9IDA7Ci0JCQkJR01TdGF0dXNbaV0uZHNyID0gMDsKLQkJCQlHTVN0YXR1c1tpXS5jdHMgPSAwOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoIW14dmFyX3RhYmxlW2ldLnR0eSB8fCAhbXh2YXJfdGFibGVbaV0udHR5LT50ZXJtaW9zKQotCQkJCUdNU3RhdHVzW2ldLmNmbGFnID0gbXh2YXJfdGFibGVbaV0ubm9ybWFsX3Rlcm1pb3MuY19jZmxhZzsKLQkJCWVsc2UKLQkJCQlHTVN0YXR1c1tpXS5jZmxhZyA9IG14dmFyX3RhYmxlW2ldLnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKLQotCQkJc3RhdHVzID0gaW5iKG14dmFyX3RhYmxlW2ldLmJhc2UgKyBVQVJUX01TUik7Ci0JCQlpZiAoc3RhdHVzICYgMHg4MCAvKlVBUlRfTVNSX0RDRCAqLyApCi0JCQkJR01TdGF0dXNbaV0uZGNkID0gMTsKLQkJCWVsc2UKLQkJCQlHTVN0YXR1c1tpXS5kY2QgPSAwOwotCi0JCQlpZiAoc3RhdHVzICYgMHgyMCAvKlVBUlRfTVNSX0RTUiAqLyApCi0JCQkJR01TdGF0dXNbaV0uZHNyID0gMTsKLQkJCWVsc2UKLQkJCQlHTVN0YXR1c1tpXS5kc3IgPSAwOwotCi0KLQkJCWlmIChzdGF0dXMgJiAweDEwIC8qVUFSVF9NU1JfQ1RTICovICkKLQkJCQlHTVN0YXR1c1tpXS5jdHMgPSAxOwotCQkJZWxzZQotCQkJCUdNU3RhdHVzW2ldLmN0cyA9IDA7Ci0JCX0KLQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBHTVN0YXR1cywKLQkJCQlzaXplb2Yoc3RydWN0IG14c2VyX21zdGF0dXMpICogTVhTRVJfUE9SVFMpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOwotCWNhc2UgTU9YQV9BU1BQX01PTl9FWFQ6IHsKLQkJCWludCBzdGF0dXM7Ci0JCQlpbnQgb3Btb2RlLCBwOwotCQkJaW50IHNoaWZ0Yml0OwotCQkJdW5zaWduZWQgY2ZsYWcsIGlmbGFnOwotCi0JCQlmb3IgKGkgPSAwOyBpIDwgTVhTRVJfUE9SVFM7IGkrKykgewotCQkJCWlmICghbXh2YXJfdGFibGVbaV0uYmFzZSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlzdGF0dXMgPSBteHNlcl9nZXRfbXNyKG14dmFyX3RhYmxlW2ldLmJhc2UsIDAsCi0JCQkJCQkJaSwgJihteHZhcl90YWJsZVtpXSkpOwotCQkJCS8qCi0JCQkJbXhzZXJfY2hlY2tfbW9kZW1fc3RhdHVzKCZteHZhcl90YWJsZVtpXSwKLQkJCQkJCQkJc3RhdHVzKTsKLQkJCQkqLwotCQkJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9URVJJKQotCQkJCQlteHZhcl90YWJsZVtpXS5pY291bnQucm5nKys7Ci0JCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0REU1IpCi0JCQkJCW14dmFyX3RhYmxlW2ldLmljb3VudC5kc3IrKzsKLQkJCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRERDRCkKLQkJCQkJbXh2YXJfdGFibGVbaV0uaWNvdW50LmRjZCsrOwotCQkJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9EQ1RTKQotCQkJCQlteHZhcl90YWJsZVtpXS5pY291bnQuY3RzKys7Ci0KLQkJCQlteHZhcl90YWJsZVtpXS5tb25fZGF0YS5tb2RlbV9zdGF0dXMgPSBzdGF0dXM7Ci0JCQkJbW9uX2RhdGFfZXh0LnJ4X2NudFtpXSA9IG14dmFyX3RhYmxlW2ldLm1vbl9kYXRhLnJ4Y250OwotCQkJCW1vbl9kYXRhX2V4dC50eF9jbnRbaV0gPSBteHZhcl90YWJsZVtpXS5tb25fZGF0YS50eGNudDsKLQkJCQltb25fZGF0YV9leHQudXBfcnhjbnRbaV0gPSBteHZhcl90YWJsZVtpXS5tb25fZGF0YS51cF9yeGNudDsKLQkJCQltb25fZGF0YV9leHQudXBfdHhjbnRbaV0gPSBteHZhcl90YWJsZVtpXS5tb25fZGF0YS51cF90eGNudDsKLQkJCQltb25fZGF0YV9leHQubW9kZW1fc3RhdHVzW2ldID0gbXh2YXJfdGFibGVbaV0ubW9uX2RhdGEubW9kZW1fc3RhdHVzOwotCQkJCW1vbl9kYXRhX2V4dC5iYXVkcmF0ZVtpXSA9IG14dmFyX3RhYmxlW2ldLnJlYWxiYXVkOwotCi0JCQkJaWYgKCFteHZhcl90YWJsZVtpXS50dHkgfHwgIW14dmFyX3RhYmxlW2ldLnR0eS0+dGVybWlvcykgewotCQkJCQljZmxhZyA9IG14dmFyX3RhYmxlW2ldLm5vcm1hbF90ZXJtaW9zLmNfY2ZsYWc7Ci0JCQkJCWlmbGFnID0gbXh2YXJfdGFibGVbaV0ubm9ybWFsX3Rlcm1pb3MuY19pZmxhZzsKLQkJCQl9IGVsc2UgewotCQkJCQljZmxhZyA9IG14dmFyX3RhYmxlW2ldLnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKLQkJCQkJaWZsYWcgPSBteHZhcl90YWJsZVtpXS50dHktPnRlcm1pb3MtPmNfaWZsYWc7Ci0JCQkJfQotCi0JCQkJbW9uX2RhdGFfZXh0LmRhdGFiaXRzW2ldID0gY2ZsYWcgJiBDU0laRTsKLQotCQkJCW1vbl9kYXRhX2V4dC5zdG9wYml0c1tpXSA9IGNmbGFnICYgQ1NUT1BCOwotCi0JCQkJbW9uX2RhdGFfZXh0LnBhcml0eVtpXSA9IGNmbGFnICYgKFBBUkVOQiB8IFBBUk9ERCB8IENNU1BBUik7Ci0KLQkJCQltb25fZGF0YV9leHQuZmxvd2N0cmxbaV0gPSAweDAwOwotCi0JCQkJaWYgKGNmbGFnICYgQ1JUU0NUUykKLQkJCQkJbW9uX2RhdGFfZXh0LmZsb3djdHJsW2ldIHw9IDB4MDM7Ci0KLQkJCQlpZiAoaWZsYWcgJiAoSVhPTiB8IElYT0ZGKSkKLQkJCQkJbW9uX2RhdGFfZXh0LmZsb3djdHJsW2ldIHw9IDB4MEM7Ci0KLQkJCQlpZiAobXh2YXJfdGFibGVbaV0udHlwZSA9PSBQT1JUXzE2NTUwQSkKLQkJCQkJbW9uX2RhdGFfZXh0LmZpZm9baV0gPSAxOwotCQkJCWVsc2UKLQkJCQkJbW9uX2RhdGFfZXh0LmZpZm9baV0gPSAwOwotCi0JCQkJcCA9IGkgJSA0OwotCQkJCXNoaWZ0Yml0ID0gcCAqIDI7Ci0JCQkJb3Btb2RlID0gaW5iKG14dmFyX3RhYmxlW2ldLm9wbW9kZV9pb2FkZHIpID4+IHNoaWZ0Yml0OwotCQkJCW9wbW9kZSAmPSBPUF9NT0RFX01BU0s7Ci0KLQkJCQltb25fZGF0YV9leHQuaWZ0eXBlW2ldID0gb3Btb2RlOwotCi0JCQl9Ci0JCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZtb25fZGF0YV9leHQsIHNpemVvZihzdHJ1Y3QgbXhzZXJfbW9uX2V4dCkpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCi0JCQlyZXR1cm4gMDsKLQotCQl9CisJCW14c2VyX3NldF9iYXVkX21ldGhvZFt0dHktPmluZGV4XSA9IG1ldGhvZDsKKwkJcmV0dXJuIHB1dF91c2VyKG1ldGhvZCwgKGludCBfX3VzZXIgKilhcmdwKTsKKwl9CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9JT0NUTENNRDsKIAl9CkBAIC0xNjI2LDc0ICsxODEyLDI0IEBACiAKIHN0YXRpYyB2b2lkIG14c2VyX3N0b3ByeChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwotCS8qIHVuc2lnbmVkIGxvbmcgZmxhZ3M7ICovCisJc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwogCiAJaW5mby0+bGRpc2Nfc3RvcF9yeCA9IDE7CiAJaWYgKElfSVhPRkYodHR5KSkgewotCQkvKiBNWF9MT0NLKCZpbmZvLT5zbG9jayk7ICovCi0JCS8qIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyICovCi0JCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpIHsKKwkJaWYgKGluZm8tPmJvYXJkLT5jaGlwX2ZsYWcpIHsKIAkJCWluZm8tPklFUiAmPSB+TU9YQV9NVVNUX1JFQ1ZfSVNSOwotCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOwogCQl9IGVsc2UgewotCQkJLyogYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMiAqLwogCQkJaW5mby0+eF9jaGFyID0gU1RPUF9DSEFSKHR0eSk7Ci0JCQkvKiBtYXNrIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMiAqLwotCQkJLyogb3V0YihpbmZvLT5JRVIsIDApOyAqLwotCQkJb3V0YigwLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOworCQkJb3V0YigwLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUik7CiAJCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKLQkJCS8qIGZvcmNlIFR4IGludGVycnVwdCAqLwotCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7Ci0JCX0JCS8qIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KLQkJLyogTVhfVU5MT0NLKCZpbmZvLT5zbG9jayk7ICovCi0JfQotCi0JaWYgKGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKLQkJLyogTVhfTE9DSygmaW5mby0+c2xvY2spOyAqLwotCQlpbmZvLT5NQ1IgJj0gflVBUlRfTUNSX1JUUzsKLQkJb3V0YihpbmZvLT5NQ1IsIGluZm8tPmJhc2UgKyBVQVJUX01DUik7Ci0JCS8qIE1YX1VOTE9DSygmaW5mby0+c2xvY2spOyAqLwotCX0KLX0KLQotc3RhdGljIHZvaWQgbXhzZXJfc3RhcnRyeChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwotCS8qIHVuc2lnbmVkIGxvbmcgZmxhZ3M7ICovCi0KLQlpbmZvLT5sZGlzY19zdG9wX3J4ID0gMDsKLQlpZiAoSV9JWE9GRih0dHkpKSB7Ci0JCWlmIChpbmZvLT54X2NoYXIpCi0JCQlpbmZvLT54X2NoYXIgPSAwOwotCQllbHNlIHsKLQkJCS8qIE1YX0xPQ0soJmluZm8tPnNsb2NrKTsgKi8KLQotCQkJLyogZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KLQkJCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpIHsKLQkJCQlpbmZvLT5JRVIgfD0gTU9YQV9NVVNUX1JFQ1ZfSVNSOwotCQkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyICovCi0KLQkJCQlpbmZvLT54X2NoYXIgPSBTVEFSVF9DSEFSKHR0eSk7Ci0JCQkJLyogbWFzayBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KLQkJCQkvKiBvdXRiKGluZm8tPklFUiwgMCk7ICovCi0JCQkJLyogYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMiAqLwotCQkJCW91dGIoMCwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKLQkJCQkvKiBmb3JjZSBUeCBpbnRlcnJ1cHQgKi8KLQkJCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKLQkJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKLQkJCX0JLyogYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMiAqLwotCQkJLyogTVhfVU5MT0NLKCZpbmZvLT5zbG9jayk7ICovCisJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOwogCQl9CiAJfQogCiAJaWYgKGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKLQkJLyogTVhfTE9DSygmaW5mby0+c2xvY2spOyAqLwotCQlpbmZvLT5NQ1IgfD0gVUFSVF9NQ1JfUlRTOwotCQlvdXRiKGluZm8tPk1DUiwgaW5mby0+YmFzZSArIFVBUlRfTUNSKTsKLQkJLyogTVhfVU5MT0NLKCZpbmZvLT5zbG9jayk7ICovCisJCWluZm8tPk1DUiAmPSB+VUFSVF9NQ1JfUlRTOworCQlvdXRiKGluZm8tPk1DUiwgaW5mby0+aW9hZGRyICsgVUFSVF9NQ1IpOwogCX0KIH0KIApAQCAtMTcwMyw1MSArMTgzOSwzNCBAQAogICovCiBzdGF0aWMgdm9pZCBteHNlcl90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCS8qIHN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOyAqLwotCS8qIHVuc2lnbmVkIGxvbmcgZmxhZ3M7ICovCi0KLQkvKiBNWF9MT0NLKCZpbmZvLT5zbG9jayk7ICovCiAJbXhzZXJfc3RvcHJ4KHR0eSk7Ci0JLyogTVhfVU5MT0NLKCZpbmZvLT5zbG9jayk7ICovCiB9CiAKIHN0YXRpYyB2b2lkIG14c2VyX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQkvKiBzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsgKi8KLQkvKiB1bnNpZ25lZCBsb25nIGZsYWdzOyAqLworCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKIAotCS8qIE1YX0xPQ0soJmluZm8tPnNsb2NrKTsgKi8KLQlteHNlcl9zdGFydHJ4KHR0eSk7Ci0JLyogTVhfVU5MT0NLKCZpbmZvLT5zbG9jayk7ICovCi19Ci0KLXN0YXRpYyB2b2lkIG14c2VyX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCi17Ci0Jc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCW14c2VyX2NoYW5nZV9zcGVlZChpbmZvLCBvbGRfdGVybWlvcyk7Ci0KLQlpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYKLQkJCSEodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykpIHsKLQkJdHR5LT5od19zdG9wcGVkID0gMDsKLQkJbXhzZXJfc3RhcnQodHR5KTsKKwkvKiBzdGFydHJ4ICovCisJaW5mby0+bGRpc2Nfc3RvcF9yeCA9IDA7CisJaWYgKElfSVhPRkYodHR5KSkgeworCQlpZiAoaW5mby0+eF9jaGFyKQorCQkJaW5mby0+eF9jaGFyID0gMDsKKwkJZWxzZSB7CisJCQlpZiAoaW5mby0+Ym9hcmQtPmNoaXBfZmxhZykgeworCQkJCWluZm8tPklFUiB8PSBNT1hBX01VU1RfUkVDVl9JU1I7CisJCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmlvYWRkciArIFVBUlRfSUVSKTsKKwkJCX0gZWxzZSB7CisJCQkJaW5mby0+eF9jaGFyID0gU1RBUlRfQ0hBUih0dHkpOworCQkJCW91dGIoMCwgaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOworCQkJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOworCQkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUik7CisJCQl9CisJCX0KIAl9CiAKLS8qIEhhbmRsZSBzdyBzdG9wcGVkICovCi0JaWYgKChvbGRfdGVybWlvcy0+Y19pZmxhZyAmIElYT04pICYmCi0JCQkhKHR0eS0+dGVybWlvcy0+Y19pZmxhZyAmIElYT04pKSB7Ci0JCXR0eS0+c3RvcHBlZCA9IDA7Ci0KLQkJLyogZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KLQkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0JCQlESVNBQkxFX01PWEFfTVVTVF9SWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woaW5mby0+YmFzZSk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCQl9Ci0JCS8qIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KLQotCQlteHNlcl9zdGFydCh0dHkpOworCWlmIChpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCWluZm8tPk1DUiB8PSBVQVJUX01DUl9SVFM7CisJCW91dGIoaW5mby0+TUNSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX01DUik7CiAJfQogfQogCkBAIC0xNzU5LDM2ICsxODc4LDY3IEBACiAgKi8KIHN0YXRpYyB2b2lkIG14c2VyX3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwogCWlmIChpbmZvLT5JRVIgJiBVQVJUX0lFUl9USFJJKSB7CiAJCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKLQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUik7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIG14c2VyX3N0YXJ0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0Jc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQlpZiAoaW5mby0+eG1pdF9jbnQgJiYgaW5mby0+eG1pdF9idWYgJiYgIShpbmZvLT5JRVIgJiBVQVJUX0lFUl9USFJJKSkgeworCWlmIChpbmZvLT54bWl0X2NudCAmJiBpbmZvLT54bWl0X2J1ZikgeworCQlvdXRiKGluZm8tPklFUiAmIH5VQVJUX0lFUl9USFJJLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUik7CiAJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOwotCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKKwkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmlvYWRkciArIFVBUlRfSUVSKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIH0KIAorc3RhdGljIHZvaWQgbXhzZXJfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKK3sKKwlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCW14c2VyX2NoYW5nZV9zcGVlZChpbmZvLCBvbGRfdGVybWlvcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKworCWlmICgob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSAmJgorCQkJISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkgeworCQl0dHktPmh3X3N0b3BwZWQgPSAwOworCQlteHNlcl9zdGFydCh0dHkpOworCX0KKworCS8qIEhhbmRsZSBzdyBzdG9wcGVkICovCisJaWYgKChvbGRfdGVybWlvcy0+Y19pZmxhZyAmIElYT04pICYmCisJCQkhKHR0eS0+dGVybWlvcy0+Y19pZmxhZyAmIElYT04pKSB7CisJCXR0eS0+c3RvcHBlZCA9IDA7CisKKwkJaWYgKGluZm8tPmJvYXJkLT5jaGlwX2ZsYWcpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQkJRElTQUJMRV9NT1hBX01VU1RfUlhfU09GVFdBUkVfRkxPV19DT05UUk9MKGluZm8tPmlvYWRkcik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCQl9CisKKwkJbXhzZXJfc3RhcnQodHR5KTsKKwl9Cit9CisKIC8qCiAgKiBteHNlcl93YWl0X3VudGlsX3NlbnQoKSAtLS0gd2FpdCB1bnRpbCB0aGUgdHJhbnNtaXR0ZXIgaXMgZW1wdHkKICAqLwogc3RhdGljIHZvaWQgbXhzZXJfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQogewotCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nIG9yaWdfamlmZmllcywgY2hhcl90aW1lOwogCWludCBsc3I7CiAKQEAgLTE4MjksNyArMTk3OSw3IEBACiAJCXRpbWVvdXQsIGNoYXJfdGltZSk7CiAJcHJpbnRrKCJqaWZmPSVsdS4uLiIsIGppZmZpZXMpOwogI2VuZGlmCi0Jd2hpbGUgKCEoKGxzciA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9MU1IpKSAmIFVBUlRfTFNSX1RFTVQpKSB7CisJd2hpbGUgKCEoKGxzciA9IGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX0xTUikpICYgVUFSVF9MU1JfVEVNVCkpIHsKICNpZmRlZiBTRVJJQUxfREVCVUdfUlNfV0FJVF9VTlRJTF9TRU5UCiAJCXByaW50aygibHNyID0gJWQgKGppZmY9JWx1KS4uLiIsIGxzciwgamlmZmllcyk7CiAjZW5kaWYKQEAgLTE4NDYsMTMgKzE5OTYsMTIgQEAKICNlbmRpZgogfQogCi0KIC8qCiAgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHR0eV9oYW5ndXAoKSB3aGVuIGEgaGFuZ3VwIGlzIHNpZ25hbGVkLgogICovCi12b2lkIG14c2VyX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQorc3RhdGljIHZvaWQgbXhzZXJfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0Jc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwogCiAJbXhzZXJfZmx1c2hfYnVmZmVyKHR0eSk7CiAJbXhzZXJfc2h1dGRvd24oaW5mbyk7CkBAIC0xODYzLDIzMSArMjAxMiw3MyBAQAogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKIH0KIAotCi0vKiBhZGRlZCBieSBKYW1lcyAwMy0xMi0yMDA0LiAqLwogLyoKICAqIG14c2VyX3JzX2JyZWFrKCkgLS0tIHJvdXRpbmUgd2hpY2ggdHVybnMgdGhlIGJyZWFrIGhhbmRsaW5nIG9uIG9yIG9mZgogICovCiBzdGF0aWMgdm9pZCBteHNlcl9yc19icmVhayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYnJlYWtfc3RhdGUpCiB7Ci0Jc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAlpZiAoYnJlYWtfc3RhdGUgPT0gLTEpCi0JCW91dGIoaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xDUikgfCBVQVJUX0xDUl9TQkMsCi0JCQlpbmZvLT5iYXNlICsgVUFSVF9MQ1IpOworCQlvdXRiKGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX0xDUikgfCBVQVJUX0xDUl9TQkMsCisJCQlpbmZvLT5pb2FkZHIgKyBVQVJUX0xDUik7CiAJZWxzZQotCQlvdXRiKGluYihpbmZvLT5iYXNlICsgVUFSVF9MQ1IpICYgflVBUlRfTENSX1NCQywKLQkJCWluZm8tPmJhc2UgKyBVQVJUX0xDUik7CisJCW91dGIoaW5iKGluZm8tPmlvYWRkciArIFVBUlRfTENSKSAmIH5VQVJUX0xDUl9TQkMsCisJCQlpbmZvLT5pb2FkZHIgKyBVQVJUX0xDUik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIH0KIAotLyogKGFib3ZlKSBhZGRlZCBieSBKYW1lcy4gKi8KLQotCi0vKgotICogVGhpcyBpcyB0aGUgc2VyaWFsIGRyaXZlcidzIGdlbmVyaWMgaW50ZXJydXB0IHJvdXRpbmUKLSAqLwotc3RhdGljIGlycXJldHVybl90IG14c2VyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCitzdGF0aWMgdm9pZCBteHNlcl9yZWNlaXZlX2NoYXJzKHN0cnVjdCBteHNlcl9wb3J0ICpwb3J0LCBpbnQgKnN0YXR1cykKIHsKLQlpbnQgc3RhdHVzLCBpaXIsIGk7Ci0Jc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbzsKLQlzdHJ1Y3QgbXhzZXJfc3RydWN0ICpwb3J0OwotCWludCBtYXgsIGlycWJpdHMsIGJpdHMsIG1zcjsKLQlpbnQgcGFzc19jb3VudGVyID0gMDsKLQlpbnQgaGFuZGxlZCA9IElSUV9OT05FOwotCi0JcG9ydCA9IE5VTEw7Ci0JLyogc3Bpbl9sb2NrKCZnbV9sb2NrKTsgKi8KLQotCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9CT0FSRFM7IGkrKykgewotCQlpZiAoZGV2X2lkID09ICYobXh2YXJfdGFibGVbaSAqIE1YU0VSX1BPUlRTX1BFUl9CT0FSRF0pKSB7Ci0JCQlwb3J0ID0gZGV2X2lkOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoaSA9PSBNWFNFUl9CT0FSRFMpCi0JCWdvdG8gaXJxX3N0b3A7Ci0JaWYgKHBvcnQgPT0gMCkKLQkJZ290byBpcnFfc3RvcDsKLQltYXggPSBteHNlcl9udW1wb3J0c1tteHNlcmNmZ1tpXS5ib2FyZF90eXBlIC0gMV07Ci0Jd2hpbGUgKDEpIHsKLQkJaXJxYml0cyA9IGluYihwb3J0LT52ZWN0b3IpICYgcG9ydC0+dmVjdG9ybWFzazsKLQkJaWYgKGlycWJpdHMgPT0gcG9ydC0+dmVjdG9ybWFzaykKLQkJCWJyZWFrOwotCi0JCWhhbmRsZWQgPSBJUlFfSEFORExFRDsKLQkJZm9yIChpID0gMCwgYml0cyA9IDE7IGkgPCBtYXg7IGkrKywgaXJxYml0cyB8PSBiaXRzLCBiaXRzIDw8PSAxKSB7Ci0JCQlpZiAoaXJxYml0cyA9PSBwb3J0LT52ZWN0b3JtYXNrKQotCQkJCWJyZWFrOwotCQkJaWYgKGJpdHMgJiBpcnFiaXRzKQotCQkJCWNvbnRpbnVlOwotCQkJaW5mbyA9IHBvcnQgKyBpOwotCi0JCQkvKiBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDktMTMtMjAwMiAqLwotCQkJaWlyID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0lJUik7Ci0JCQlpZiAoaWlyICYgVUFSVF9JSVJfTk9fSU5UKQotCQkJCWNvbnRpbnVlOwotCQkJaWlyICY9IE1PWEFfTVVTVF9JSVJfTUFTSzsKLQkJCWlmICghaW5mby0+dHR5KSB7Ci0JCQkJc3RhdHVzID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xTUik7Ci0JCQkJb3V0YigweDI3LCBpbmZvLT5iYXNlICsgVUFSVF9GQ1IpOwotCQkJCWluYihpbmZvLT5iYXNlICsgVUFSVF9NU1IpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvKiBtYXNrIGJ5IFZpY3RvciBZdS4gMDktMTMtMjAwMgotCQkJICAgaWYgKCAhaW5mby0+dHR5IHx8Ci0JCQkgICAoaW5iKGluZm8tPmJhc2UgKyBVQVJUX0lJUikgJiBVQVJUX0lJUl9OT19JTlQpICkKLQkJCSAgIGNvbnRpbnVlOwotCQkJICovCi0JCQkvKiBtYXNrIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgotCQkJICAgc3RhdHVzID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xTUikgJiBpbmZvLT5yZWFkX3N0YXR1c19tYXNrOwotCQkJICovCi0KLQkJCS8qIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyICovCi0JCQlzdGF0dXMgPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfTFNSKTsKLQotCQkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX1BFKQotCQkJCWluZm8tPmVycl9zaGFkb3cgfD0gTlBQSV9OT1RJRllfUEFSSVRZOwotCQkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX0ZFKQotCQkJCWluZm8tPmVycl9zaGFkb3cgfD0gTlBQSV9OT1RJRllfRlJBTUlORzsKLQkJCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9PRSkKLQkJCQlpbmZvLT5lcnJfc2hhZG93IHw9IE5QUElfTk9USUZZX0hXX09WRVJSVU47Ci0JCQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfQkkpCi0JCQkJaW5mby0+ZXJyX3NoYWRvdyB8PSBOUFBJX05PVElGWV9CUkVBSzsKLQotCQkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykgewotCQkJCS8qCi0JCQkJICAgaWYgKCAoc3RhdHVzICYgMHgwMikgJiYgIShzdGF0dXMgJiAweDAxKSApIHsKLQkJCQkgICBvdXRiKGluZm8tPmJhc2UrVUFSVF9GQ1IsICAweDIzKTsKLQkJCQkgICBjb250aW51ZTsKLQkJCQkgICB9Ci0JCQkJICovCi0JCQkJaWYgKGlpciA9PSBNT1hBX01VU1RfSUlSX0dEQSB8fAotCQkJCQkJaWlyID09IE1PWEFfTVVTVF9JSVJfUkRBIHx8Ci0JCQkJCQlpaXIgPT0gTU9YQV9NVVNUX0lJUl9SVE8gfHwKLQkJCQkJCWlpciA9PSBNT1hBX01VU1RfSUlSX0xTUikKLQkJCQkJbXhzZXJfcmVjZWl2ZV9jaGFycyhpbmZvLCAmc3RhdHVzKTsKLQotCQkJfSBlbHNlIHsKLQkJCQkvKiBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyICovCi0KLQkJCQlzdGF0dXMgJj0gaW5mby0+cmVhZF9zdGF0dXNfbWFzazsKLQkJCQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfRFIpCi0JCQkJCW14c2VyX3JlY2VpdmVfY2hhcnMoaW5mbywgJnN0YXR1cyk7Ci0JCQl9Ci0JCQltc3IgPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfTVNSKTsKLQkJCWlmIChtc3IgJiBVQVJUX01TUl9BTllfREVMVEEpIHsKLQkJCQlteHNlcl9jaGVja19tb2RlbV9zdGF0dXMoaW5mbywgbXNyKTsKLQkJCX0KLQkJCS8qIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0xMy0yMDAyICovCi0JCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSB7Ci0JCQkJaWYgKChpaXIgPT0gMHgwMikgJiYgKHN0YXR1cyAmIFVBUlRfTFNSX1RIUkUpKSB7Ci0JCQkJCW14c2VyX3RyYW5zbWl0X2NoYXJzKGluZm8pOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLyogYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMTMtMjAwMiAqLwotCi0JCQkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX1RIUkUpIHsKLS8qIDgtMi05OSBieSBXaWxsaWFtCi0JCQkgICAgaWYgKCBpbmZvLT54X2NoYXIgfHwgKGluZm8tPnhtaXRfY250ID4gMCkgKQotKi8KLQkJCQkJbXhzZXJfdHJhbnNtaXRfY2hhcnMoaW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChwYXNzX2NvdW50ZXIrKyA+IE1YU0VSX0lTUl9QQVNTX0xJTUlUKSB7Ci0JCQlicmVhazsJLyogUHJldmVudCBpbmZpbml0ZSBsb29wcyAqLwotCQl9Ci0JfQotCi0gICAgICBpcnFfc3RvcDoKLQkvKiBzcGluX3VubG9jaygmZ21fbG9jayk7ICovCi0JcmV0dXJuIGhhbmRsZWQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG14c2VyX3JlY2VpdmVfY2hhcnMoc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbywgaW50ICpzdGF0dXMpCi17Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnR0eTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcG9ydC0+dHR5OwogCXVuc2lnbmVkIGNoYXIgY2gsIGdkbDsKIAlpbnQgaWdub3JlZCA9IDA7CiAJaW50IGNudCA9IDA7CiAJaW50IHJlY3Zfcm9vbTsKIAlpbnQgbWF4ID0gMjU2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAogCXJlY3Zfcm9vbSA9IHR0eS0+cmVjZWl2ZV9yb29tOwotCWlmICgocmVjdl9yb29tID09IDApICYmICghaW5mby0+bGRpc2Nfc3RvcF9yeCkpIHsKLQkJLyogbXhzZXJfdGhyb3R0bGUodHR5KTsgKi8KKwlpZiAoKHJlY3Zfcm9vbSA9PSAwKSAmJiAoIXBvcnQtPmxkaXNjX3N0b3BfcngpKQogCQlteHNlcl9zdG9wcngodHR5KTsKLQkJLyogcmV0dXJuOyAqLwotCX0KIAotCS8qIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyICovCi0JaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZyAhPSBNT1hBX09USEVSX1VBUlQpIHsKKwlpZiAocG9ydC0+Ym9hcmQtPmNoaXBfZmxhZyAhPSBNT1hBX09USEVSX1VBUlQpIHsKIAotCQlpZiAoKnN0YXR1cyAmIFVBUlRfTFNSX1NQRUNJQUwpIHsKKwkJaWYgKCpzdGF0dXMgJiBVQVJUX0xTUl9TUEVDSUFMKQogCQkJZ290byBpbnRyX29sZDsKLQkJfQotCQkvKiBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDItMTEtMjAwNCAqLwotCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnID09IE1PWEFfTVVTVF9NVTg2MF9IV0lEICYmCisJCWlmIChwb3J0LT5ib2FyZC0+Y2hpcF9mbGFnID09IE1PWEFfTVVTVF9NVTg2MF9IV0lEICYmCiAJCQkJKCpzdGF0dXMgJiBNT1hBX01VU1RfTFNSX1JFUlIpKQogCQkJZ290byBpbnRyX29sZDsKLQkJLyogYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDItMTQtMjAwNCAqLwogCQlpZiAoKnN0YXR1cyAmIE1PWEFfTVVTVF9MU1JfUkVSUikKIAkJCWdvdG8gaW50cl9vbGQ7CiAKLQkJZ2RsID0gaW5iKGluZm8tPmJhc2UgKyBNT1hBX01VU1RfR0RMX1JFR0lTVEVSKTsKKwkJZ2RsID0gaW5iKHBvcnQtPmlvYWRkciArIE1PWEFfTVVTVF9HRExfUkVHSVNURVIpOwogCi0JCS8qIGFkZCBieSBWaWN0b3IgWXUuIDAyLTExLTIwMDQgKi8KLQkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZyA9PSBNT1hBX01VU1RfTVUxNTBfSFdJRCkKKwkJaWYgKHBvcnQtPmJvYXJkLT5jaGlwX2ZsYWcgPT0gTU9YQV9NVVNUX01VMTUwX0hXSUQpCiAJCQlnZGwgJj0gTU9YQV9NVVNUX0dETF9NQVNLOwogCQlpZiAoZ2RsID49IHJlY3Zfcm9vbSkgewotCQkJaWYgKCFpbmZvLT5sZGlzY19zdG9wX3J4KSB7Ci0JCQkJLyogbXhzZXJfdGhyb3R0bGUodHR5KTsgKi8KKwkJCWlmICghcG9ydC0+bGRpc2Nfc3RvcF9yeCkKIAkJCQlteHNlcl9zdG9wcngodHR5KTsKLQkJCX0KLQkJCS8qIHJldHVybjsgKi8KIAkJfQogCQl3aGlsZSAoZ2RsLS0pIHsKLQkJCWNoID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX1JYKTsKKwkJCWNoID0gaW5iKHBvcnQtPmlvYWRkciArIFVBUlRfUlgpOwogCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgMCk7CiAJCQljbnQrKzsKLQkJCS8qCi0JCQkgICBpZiAoKGNudCA+PSBISV9XQVRFUikgJiYgKGluZm8tPnN0b3BfcnggPT0gMCkpIHsKLQkJCSAgIG14c2VyX3N0b3ByeCh0dHkpOwotCQkJICAgaW5mby0+c3RvcF9yeCA9IDE7Ci0JCQkgICBicmVhazsKLQkJCSAgIH0gKi8KIAkJfQogCQlnb3RvIGVuZF9pbnRyOwogCX0KLSBpbnRyX29sZDoKLQkvKiBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyICovCitpbnRyX29sZDoKIAogCWRvIHsKIAkJaWYgKG1heC0tIDwgMCkKIAkJCWJyZWFrOwotCQkvKgotCQkgICBpZiAoKGNudCA+PSBISV9XQVRFUikgJiYgKGluZm8tPnN0b3BfcnggPT0gMCkpIHsKLQkJICAgbXhzZXJfc3RvcHJ4KHR0eSk7Ci0JCSAgIGluZm8tPnN0b3Bfcng9MTsKLQkJICAgYnJlYWs7Ci0JCSAgIH0KLQkJICovCiAKLQkJY2ggPSBpbmIoaW5mby0+YmFzZSArIFVBUlRfUlgpOwotCQkvKiBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMiAqLwotCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnICYmICgqc3RhdHVzICYgVUFSVF9MU1JfT0UpIC8qJiYgISgqc3RhdHVzJlVBUlRfTFNSX0RSKSAqLyApCi0JCQlvdXRiKDB4MjMsIGluZm8tPmJhc2UgKyBVQVJUX0ZDUik7Ci0JCSpzdGF0dXMgJj0gaW5mby0+cmVhZF9zdGF0dXNfbWFzazsKLQkJLyogYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMiAqLwotCQlpZiAoKnN0YXR1cyAmIGluZm8tPmlnbm9yZV9zdGF0dXNfbWFzaykgeworCQljaCA9IGluYihwb3J0LT5pb2FkZHIgKyBVQVJUX1JYKTsKKwkJaWYgKHBvcnQtPmJvYXJkLT5jaGlwX2ZsYWcgJiYgKCpzdGF0dXMgJiBVQVJUX0xTUl9PRSkpCisJCQlvdXRiKDB4MjMsIHBvcnQtPmlvYWRkciArIFVBUlRfRkNSKTsKKwkJKnN0YXR1cyAmPSBwb3J0LT5yZWFkX3N0YXR1c19tYXNrOworCQlpZiAoKnN0YXR1cyAmIHBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzaykgewogCQkJaWYgKCsraWdub3JlZCA+IDEwMCkKIAkJCQlicmVhazsKIAkJfSBlbHNlIHsKQEAgLTIwOTUsODg1ICsyMDg2LDM0MyBAQAogCQkJaWYgKCpzdGF0dXMgJiBVQVJUX0xTUl9TUEVDSUFMKSB7CiAJCQkJaWYgKCpzdGF0dXMgJiBVQVJUX0xTUl9CSSkgewogCQkJCQlmbGFnID0gVFRZX0JSRUFLOwotLyogYWRkZWQgYnkgY2FzcGVyIDEvMTEvMjAwMCAqLwotCQkJCQlpbmZvLT5pY291bnQuYnJrKys7Ci0vKiAqLwotCQkJCQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TQUspCisJCQkJCXBvcnQtPmljb3VudC5icmsrKzsKKworCQkJCQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19TQUspCiAJCQkJCQlkb19TQUsodHR5KTsKIAkJCQl9IGVsc2UgaWYgKCpzdGF0dXMgJiBVQVJUX0xTUl9QRSkgewogCQkJCQlmbGFnID0gVFRZX1BBUklUWTsKLS8qIGFkZGVkIGJ5IGNhc3BlciAxLzExLzIwMDAgKi8KLQkJCQkJaW5mby0+aWNvdW50LnBhcml0eSsrOwotLyogKi8KKwkJCQkJcG9ydC0+aWNvdW50LnBhcml0eSsrOwogCQkJCX0gZWxzZSBpZiAoKnN0YXR1cyAmIFVBUlRfTFNSX0ZFKSB7CiAJCQkJCWZsYWcgPSBUVFlfRlJBTUU7Ci0vKiBhZGRlZCBieSBjYXNwZXIgMS8xMS8yMDAwICovCi0JCQkJCWluZm8tPmljb3VudC5mcmFtZSsrOwotLyogKi8KKwkJCQkJcG9ydC0+aWNvdW50LmZyYW1lKys7CiAJCQkJfSBlbHNlIGlmICgqc3RhdHVzICYgVUFSVF9MU1JfT0UpIHsKIAkJCQkJZmxhZyA9IFRUWV9PVkVSUlVOOwotLyogYWRkZWQgYnkgY2FzcGVyIDEvMTEvMjAwMCAqLwotCQkJCQlpbmZvLT5pY291bnQub3ZlcnJ1bisrOwotLyogKi8KLQkJCQl9CisJCQkJCXBvcnQtPmljb3VudC5vdmVycnVuKys7CisJCQkJfSBlbHNlCisJCQkJCWZsYWcgPSBUVFlfQlJFQUs7CiAJCQl9CiAJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCBmbGFnKTsKIAkJCWNudCsrOwogCQkJaWYgKGNudCA+PSByZWN2X3Jvb20pIHsKLQkJCQlpZiAoIWluZm8tPmxkaXNjX3N0b3BfcngpIHsKLQkJCQkJLyogbXhzZXJfdGhyb3R0bGUodHR5KTsgKi8KKwkJCQlpZiAoIXBvcnQtPmxkaXNjX3N0b3BfcngpCiAJCQkJCW14c2VyX3N0b3ByeCh0dHkpOwotCQkJCX0KIAkJCQlicmVhazsKIAkJCX0KIAogCQl9CiAKLQkJLyogZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KLQkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykKKwkJaWYgKHBvcnQtPmJvYXJkLT5jaGlwX2ZsYWcpCiAJCQlicmVhazsKLQkJLyogYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMiAqLwogCi0JCS8qIG1hc2sgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCi0JCSAqc3RhdHVzID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xTUikgJiBpbmZvLT5yZWFkX3N0YXR1c19tYXNrOwotCQkgKi8KLQkJLyogZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KLQkJKnN0YXR1cyA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9MU1IpOwotCQkvKiBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyICovCisJCSpzdGF0dXMgPSBpbmIocG9ydC0+aW9hZGRyICsgVUFSVF9MU1IpOwogCX0gd2hpbGUgKCpzdGF0dXMgJiBVQVJUX0xTUl9EUik7CiAKLWVuZF9pbnRyOgkJLyogYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMiAqLwotCW14dmFyX2xvZy5yeGNudFtpbmZvLT5wb3J0XSArPSBjbnQ7Ci0JaW5mby0+bW9uX2RhdGEucnhjbnQgKz0gY250OwotCWluZm8tPm1vbl9kYXRhLnVwX3J4Y250ICs9IGNudDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworZW5kX2ludHI6CisJbXh2YXJfbG9nLnJ4Y250W3BvcnQtPnR0eS0+aW5kZXhdICs9IGNudDsKKwlwb3J0LT5tb25fZGF0YS5yeGNudCArPSBjbnQ7CisJcG9ydC0+bW9uX2RhdGEudXBfcnhjbnQgKz0gY250OwogCisJLyoKKwkgKiBXZSBhcmUgY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0IGNvbnRleHQgd2l0aCAmcG9ydC0+c2xvY2sKKwkgKiBiZWluZyBoZWxkLiBEcm9wIGl0IHRlbXBvcmFyaWx5IGluIG9yZGVyIHRvIHByZXZlbnQKKwkgKiByZWN1cnNpdmUgbG9ja2luZy4KKwkgKi8KKwlzcGluX3VubG9jaygmcG9ydC0+c2xvY2spOwogCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CisJc3Bpbl9sb2NrKCZwb3J0LT5zbG9jayk7CiB9CiAKLXN0YXRpYyB2b2lkIG14c2VyX3RyYW5zbWl0X2NoYXJzKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8pCitzdGF0aWMgdm9pZCBteHNlcl90cmFuc21pdF9jaGFycyhzdHJ1Y3QgbXhzZXJfcG9ydCAqcG9ydCkKIHsKIAlpbnQgY291bnQsIGNudDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0KLQlpZiAoaW5mby0+eF9jaGFyKSB7Ci0JCW91dGIoaW5mby0+eF9jaGFyLCBpbmZvLT5iYXNlICsgVUFSVF9UWCk7Ci0JCWluZm8tPnhfY2hhciA9IDA7Ci0JCW14dmFyX2xvZy50eGNudFtpbmZvLT5wb3J0XSsrOwotCQlpbmZvLT5tb25fZGF0YS50eGNudCsrOwotCQlpbmZvLT5tb25fZGF0YS51cF90eGNudCsrOwotCi0vKiBhZGRlZCBieSBjYXNwZXIgMS8xMS8yMDAwICovCi0JCWluZm8tPmljb3VudC50eCsrOwotLyogKi8KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlpZiAocG9ydC0+eF9jaGFyKSB7CisJCW91dGIocG9ydC0+eF9jaGFyLCBwb3J0LT5pb2FkZHIgKyBVQVJUX1RYKTsKKwkJcG9ydC0+eF9jaGFyID0gMDsKKwkJbXh2YXJfbG9nLnR4Y250W3BvcnQtPnR0eS0+aW5kZXhdKys7CisJCXBvcnQtPm1vbl9kYXRhLnR4Y250Kys7CisJCXBvcnQtPm1vbl9kYXRhLnVwX3R4Y250Kys7CisJCXBvcnQtPmljb3VudC50eCsrOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKGluZm8tPnhtaXRfYnVmID09IDApIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKKwlpZiAocG9ydC0+eG1pdF9idWYgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKChwb3J0LT54bWl0X2NudCA8PSAwKSB8fCBwb3J0LT50dHktPnN0b3BwZWQgfHwKKwkJCShwb3J0LT50dHktPmh3X3N0b3BwZWQgJiYKKwkJCShwb3J0LT50eXBlICE9IFBPUlRfMTY1NTBBKSAmJgorCQkJKCFwb3J0LT5ib2FyZC0+Y2hpcF9mbGFnKSkpIHsKKwkJcG9ydC0+SUVSICY9IH5VQVJUX0lFUl9USFJJOworCQlvdXRiKHBvcnQtPklFUiwgcG9ydC0+aW9hZGRyICsgVUFSVF9JRVIpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKChpbmZvLT54bWl0X2NudCA8PSAwKSB8fCBpbmZvLT50dHktPnN0b3BwZWQgfHwKLQkJCShpbmZvLT50dHktPmh3X3N0b3BwZWQgJiYKLQkJCShpbmZvLT50eXBlICE9IFBPUlRfMTY1NTBBKSAmJgotCQkJKCFpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpKSkgewotCQlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX1RIUkk7Ci0JCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JY250ID0gaW5mby0+eG1pdF9jbnQ7Ci0JY291bnQgPSBpbmZvLT54bWl0X2ZpZm9fc2l6ZTsKKwljbnQgPSBwb3J0LT54bWl0X2NudDsKKwljb3VudCA9IHBvcnQtPnhtaXRfZmlmb19zaXplOwogCWRvIHsKLQkJb3V0YihpbmZvLT54bWl0X2J1ZltpbmZvLT54bWl0X3RhaWwrK10sCi0JCQlpbmZvLT5iYXNlICsgVUFSVF9UWCk7Ci0JCWluZm8tPnhtaXRfdGFpbCA9IGluZm8tPnhtaXRfdGFpbCAmIChTRVJJQUxfWE1JVF9TSVpFIC0gMSk7Ci0JCWlmICgtLWluZm8tPnhtaXRfY250IDw9IDApCisJCW91dGIocG9ydC0+eG1pdF9idWZbcG9ydC0+eG1pdF90YWlsKytdLAorCQkJcG9ydC0+aW9hZGRyICsgVUFSVF9UWCk7CisJCXBvcnQtPnhtaXRfdGFpbCA9IHBvcnQtPnhtaXRfdGFpbCAmIChTRVJJQUxfWE1JVF9TSVpFIC0gMSk7CisJCWlmICgtLXBvcnQtPnhtaXRfY250IDw9IDApCiAJCQlicmVhazsKIAl9IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0JbXh2YXJfbG9nLnR4Y250W2luZm8tPnBvcnRdICs9IChjbnQgLSBpbmZvLT54bWl0X2NudCk7CisJbXh2YXJfbG9nLnR4Y250W3BvcnQtPnR0eS0+aW5kZXhdICs9IChjbnQgLSBwb3J0LT54bWl0X2NudCk7CiAKLS8qIGFkZGVkIGJ5IEphbWVzIDAzLTEyLTIwMDQuICovCi0JaW5mby0+bW9uX2RhdGEudHhjbnQgKz0gKGNudCAtIGluZm8tPnhtaXRfY250KTsKLQlpbmZvLT5tb25fZGF0YS51cF90eGNudCArPSAoY250IC0gaW5mby0+eG1pdF9jbnQpOwotLyogKGFib3ZlKSBhZGRlZCBieSBKYW1lcy4gKi8KKwlwb3J0LT5tb25fZGF0YS50eGNudCArPSAoY250IC0gcG9ydC0+eG1pdF9jbnQpOworCXBvcnQtPm1vbl9kYXRhLnVwX3R4Y250ICs9IChjbnQgLSBwb3J0LT54bWl0X2NudCk7CisJcG9ydC0+aWNvdW50LnR4ICs9IChjbnQgLSBwb3J0LT54bWl0X2NudCk7CiAKLS8qIGFkZGVkIGJ5IGNhc3BlciAxLzExLzIwMDAgKi8KLQlpbmZvLT5pY291bnQudHggKz0gKGNudCAtIGluZm8tPnhtaXRfY250KTsKLS8qICovCisJaWYgKHBvcnQtPnhtaXRfY250IDwgV0FLRVVQX0NIQVJTKQorCQl0dHlfd2FrZXVwKHBvcnQtPnR0eSk7CiAKLQlpZiAoaW5mby0+eG1pdF9jbnQgPCBXQUtFVVBfQ0hBUlMpIHsKLQkJc2V0X2JpdChNWFNFUl9FVkVOVF9UWExPVywgJmluZm8tPmV2ZW50KTsKLQkJc2NoZWR1bGVfd29yaygmaW5mby0+dHF1ZXVlKTsKKwlpZiAocG9ydC0+eG1pdF9jbnQgPD0gMCkgeworCQlwb3J0LT5JRVIgJj0gflVBUlRfSUVSX1RIUkk7CisJCW91dGIocG9ydC0+SUVSLCBwb3J0LT5pb2FkZHIgKyBVQVJUX0lFUik7CiAJfQotCWlmIChpbmZvLT54bWl0X2NudCA8PSAwKSB7Ci0JCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKLQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG14c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvLCBpbnQgc3RhdHVzKQotewotCS8qIHVwZGF0ZSBpbnB1dCBsaW5lIGNvdW50ZXJzICovCi0JaWYgKHN0YXR1cyAmIFVBUlRfTVNSX1RFUkkpCi0JCWluZm8tPmljb3VudC5ybmcrKzsKLQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRERTUikKLQkJaW5mby0+aWNvdW50LmRzcisrOwotCWlmIChzdGF0dXMgJiBVQVJUX01TUl9ERENEKQotCQlpbmZvLT5pY291bnQuZGNkKys7Ci0JaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDVFMpCi0JCWluZm8tPmljb3VudC5jdHMrKzsKLQlpbmZvLT5tb25fZGF0YS5tb2RlbV9zdGF0dXMgPSBzdGF0dXM7Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7Ci0KLQlpZiAoKGluZm8tPmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpICYmIChzdGF0dXMgJiBVQVJUX01TUl9ERENEKSkgewotCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRENEKQotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOwotCQlzY2hlZHVsZV93b3JrKCZpbmZvLT50cXVldWUpOwotCX0KLQotCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0NUU19GTE9XKSB7Ci0JCWlmIChpbmZvLT50dHktPmh3X3N0b3BwZWQpIHsKLQkJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9DVFMpIHsKLQkJCQlpbmZvLT50dHktPmh3X3N0b3BwZWQgPSAwOwotCi0JCQkJaWYgKChpbmZvLT50eXBlICE9IFBPUlRfMTY1NTBBKSAmJgotCQkJCQkJKCFpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpKSB7Ci0JCQkJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOwotCQkJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKLQkJCQl9Ci0JCQkJc2V0X2JpdChNWFNFUl9FVkVOVF9UWExPVywgJmluZm8tPmV2ZW50KTsKLQkJCQlzY2hlZHVsZV93b3JrKCZpbmZvLT50cXVldWUpOwkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICghKHN0YXR1cyAmIFVBUlRfTVNSX0NUUykpIHsKLQkJCQlpbmZvLT50dHktPmh3X3N0b3BwZWQgPSAxOwotCQkJCWlmICgoaW5mby0+dHlwZSAhPSBQT1JUXzE2NTUwQSkgJiYKLQkJCQkJCSghaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkgewotCQkJCQlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX1RIUkk7Ci0JCQkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KLQotc3RhdGljIGludCBteHNlcl9ibG9ja190aWxfcmVhZHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8pCi17Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0JaW50IHJldHZhbDsKLQlpbnQgZG9fY2xvY2FsID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyoKLQkgKiBJZiBub24tYmxvY2tpbmcgbW9kZSBpcyBzZXQsIG9yIHRoZSBwb3J0IGlzIG5vdCBlbmFibGVkLAotCSAqIHRoZW4gbWFrZSB0aGUgY2hlY2sgdXAgZnJvbnQgYW5kIHRoZW4gZXhpdC4KLQkgKi8KLQlpZiAoKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB8fCAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpKSB7Ci0JCWluZm8tPmZsYWdzIHw9IEFTWU5DX05PUk1BTF9BQ1RJVkU7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpCi0JCWRvX2Nsb2NhbCA9IDE7Ci0KLQkvKgotCSAqIEJsb2NrIHdhaXRpbmcgZm9yIHRoZSBjYXJyaWVyIGRldGVjdCBhbmQgdGhlIGxpbmUgdG8gYmVjb21lCi0JICogZnJlZSAoaS5lLiwgbm90IGluIHVzZSBieSB0aGUgY2FsbG91dCkuICBXaGlsZSB3ZSBhcmUgaW4KLQkgKiB0aGlzIGxvb3AsIGluZm8tPmNvdW50IGlzIGRyb3BwZWQgYnkgb25lLCBzbyB0aGF0Ci0JICogbXhzZXJfY2xvc2UoKSBrbm93cyB3aGVuIHRvIGZyZWUgdGhpbmdzLiAgV2UgcmVzdG9yZSBpdCB1cG9uCi0JICogZXhpdCwgZWl0aGVyIG5vcm1hbCBvciBhYm5vcm1hbC4KLQkgKi8KLQlyZXR2YWwgPSAwOwotCWFkZF93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkKLQkJaW5mby0+Y291bnQtLTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCWluZm8tPmJsb2NrZWRfb3BlbisrOwotCXdoaWxlICgxKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCQlvdXRiKGluYihpbmZvLT5iYXNlICsgVUFSVF9NQ1IpIHwKLQkJCVVBUlRfTUNSX0RUUiB8IFVBUlRfTUNSX1JUUywgaW5mby0+YmFzZSArIFVBUlRfTUNSKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKHR0eV9odW5nX3VwX3AoZmlscCkgfHwgIShpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSkgewotCQkJaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSFVQX05PVElGWSkKLQkJCQlyZXR2YWwgPSAtRUFHQUlOOwotCQkJZWxzZQotCQkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgJiYKLQkJCQkoZG9fY2xvY2FsIHx8Ci0JCQkJKGluYihpbmZvLT5iYXNlICsgVUFSVF9NU1IpICYgVUFSVF9NU1JfRENEKSkpCi0JCQlicmVhazsKLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7Ci0JCQlicmVhazsKLQkJfQotCQlzY2hlZHVsZSgpOwotCX0KLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKLQlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpCi0JCWluZm8tPmNvdW50Kys7Ci0JaW5mby0+YmxvY2tlZF9vcGVuLS07Ci0JaWYgKHJldHZhbCkKLQkJcmV0dXJuIHJldHZhbDsKLQlpbmZvLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG14c2VyX3N0YXJ0dXAoc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbykKLXsKLQl1bnNpZ25lZCBsb25nIHBhZ2U7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXBhZ2UgPSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYWdlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCi0JaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKLQkJZnJlZV9wYWdlKHBhZ2UpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoIWluZm8tPmJhc2UgfHwgIWluZm8tPnR5cGUpIHsKLQkJaWYgKGluZm8tPnR0eSkKLQkJCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmaW5mby0+dHR5LT5mbGFncyk7Ci0JCWZyZWVfcGFnZShwYWdlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChpbmZvLT54bWl0X2J1ZikKLQkJZnJlZV9wYWdlKHBhZ2UpOwotCWVsc2UKLQkJaW5mby0+eG1pdF9idWYgPSAodW5zaWduZWQgY2hhciAqKSBwYWdlOwotCi0JLyoKLQkgKiBDbGVhciB0aGUgRklGTyBidWZmZXJzIGFuZCBkaXNhYmxlIHRoZW0KLQkgKiAodGhleSB3aWxsIGJlIHJlZW5hYmxlZCBpbiBteHNlcl9jaGFuZ2Vfc3BlZWQoKSkKLQkgKi8KLQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKQotCQlvdXRiKChVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwKLQkJCVVBUlRfRkNSX0NMRUFSX1hNSVQgfAotCQkJTU9YQV9NVVNUX0ZDUl9HREFfTU9ERV9FTkFCTEUpLCBpbmZvLT5iYXNlICsgVUFSVF9GQ1IpOwotCWVsc2UKLQkJb3V0YigoVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8IFVBUlRfRkNSX0NMRUFSX1hNSVQpLAotCQkJaW5mby0+YmFzZSArIFVBUlRfRkNSKTsKLQotCS8qCi0JICogQXQgdGhpcyBwb2ludCB0aGVyZSdzIG5vIHdheSB0aGUgTFNSIGNvdWxkIHN0aWxsIGJlIDB4RkY7Ci0JICogaWYgaXQgaXMsIHRoZW4gYmFpbCBvdXQsIGJlY2F1c2UgdGhlcmUncyBsaWtlbHkgbm8gVUFSVAotCSAqIGhlcmUuCi0JICovCi0JaWYgKGluYihpbmZvLT5iYXNlICsgVUFSVF9MU1IpID09IDB4ZmYpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQkJaWYgKGNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKLQkJCWlmIChpbmZvLT50dHkpCi0JCQkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKLQkJCXJldHVybiAwOwotCQl9IGVsc2UKLQkJCXJldHVybiAtRU5PREVWOwotCX0KLQotCS8qCi0JICogQ2xlYXIgdGhlIGludGVycnVwdCByZWdpc3RlcnMuCi0JICovCi0JKHZvaWQpIGluYihpbmZvLT5iYXNlICsgVUFSVF9MU1IpOwotCSh2b2lkKSBpbmIoaW5mby0+YmFzZSArIFVBUlRfUlgpOwotCSh2b2lkKSBpbmIoaW5mby0+YmFzZSArIFVBUlRfSUlSKTsKLQkodm9pZCkgaW5iKGluZm8tPmJhc2UgKyBVQVJUX01TUik7Ci0KLQkvKgotCSAqIE5vdywgaW5pdGlhbGl6ZSB0aGUgVUFSVAotCSAqLwotCW91dGIoVUFSVF9MQ1JfV0xFTjgsIGluZm8tPmJhc2UgKyBVQVJUX0xDUik7CS8qIHJlc2V0IERMQUIgKi8KLQlpbmZvLT5NQ1IgPSBVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFM7Ci0Jb3V0YihpbmZvLT5NQ1IsIGluZm8tPmJhc2UgKyBVQVJUX01DUik7Ci0KLQkvKgotCSAqIEZpbmFsbHksIGVuYWJsZSBpbnRlcnJ1cHRzCi0JICovCi0JaW5mby0+SUVSID0gVUFSVF9JRVJfTVNJIHwgVUFSVF9JRVJfUkxTSSB8IFVBUlRfSUVSX1JESTsKLQkvKiBpbmZvLT5JRVIgPSBVQVJUX0lFUl9STFNJIHwgVUFSVF9JRVJfUkRJOyAqLwotCi0JLyogZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA4LTMwLTIwMDIgKi8KLQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKQotCQlpbmZvLT5JRVIgfD0gTU9YQV9NVVNUX0lFUl9FR0RBSTsKLQkvKiBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOC0zMC0yMDAyICovCi0Jb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCi0KLQkvKgotCSAqIEFuZCBjbGVhciB0aGUgaW50ZXJydXB0IHJlZ2lzdGVycyBhZ2FpbiBmb3IgbHVjay4KLQkgKi8KLQkodm9pZCkgaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xTUik7Ci0JKHZvaWQpIGluYihpbmZvLT5iYXNlICsgVUFSVF9SWCk7Ci0JKHZvaWQpIGluYihpbmZvLT5iYXNlICsgVUFSVF9JSVIpOwotCSh2b2lkKSBpbmIoaW5mby0+YmFzZSArIFVBUlRfTVNSKTsKLQotCWlmIChpbmZvLT50dHkpCi0JCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKLQlpbmZvLT54bWl0X2NudCA9IGluZm8tPnhtaXRfaGVhZCA9IGluZm8tPnhtaXRfdGFpbCA9IDA7Ci0KLQkvKgotCSAqIGFuZCBzZXQgdGhlIHNwZWVkIG9mIHRoZSBzZXJpYWwgcG9ydAotCSAqLwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0JbXhzZXJfY2hhbmdlX3NwZWVkKGluZm8sIE5VTEwpOwotCi0JaW5mby0+ZmxhZ3MgfD0gQVNZTkNfSU5JVElBTElaRUQ7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCi0gKiBUaGlzIHJvdXRpbmUgd2lsbCBzaHV0ZG93biBhIHNlcmlhbCBwb3J0OyBpbnRlcnJ1cHRzIG1heWJlIGRpc2FibGVkLCBhbmQKLSAqIERUUiBpcyBkcm9wcGVkIGlmIHRoZSBoYW5ndXAgb24gY2xvc2UgdGVybWlvIGZsYWcgaXMgb24uCisgKiBUaGlzIGlzIHRoZSBzZXJpYWwgZHJpdmVyJ3MgZ2VuZXJpYyBpbnRlcnJ1cHQgcm91dGluZQogICovCi1zdGF0aWMgdm9pZCBteHNlcl9zaHV0ZG93bihzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvKQorc3RhdGljIGlycXJldHVybl90IG14c2VyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgc3RhdHVzLCBpaXIsIGk7CisJc3RydWN0IG14c2VyX2JvYXJkICpicmQgPSBOVUxMOworCXN0cnVjdCBteHNlcl9wb3J0ICpwb3J0OworCWludCBtYXgsIGlycWJpdHMsIGJpdHMsIG1zcjsKKwl1bnNpZ25lZCBpbnQgaW50X2NudCwgcGFzc19jb3VudGVyID0gMDsKKwlpbnQgaGFuZGxlZCA9IElSUV9OT05FOwogCi0JaWYgKCEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpCi0JCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgTVhTRVJfQk9BUkRTOyBpKyspCisJCWlmIChkZXZfaWQgPT0gJm14c2VyX2JvYXJkc1tpXSkgeworCQkJYnJkID0gZGV2X2lkOworCQkJYnJlYWs7CisJCX0KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOworCWlmIChpID09IE1YU0VSX0JPQVJEUykKKwkJZ290byBpcnFfc3RvcDsKKwlpZiAoYnJkID09IE5VTEwpCisJCWdvdG8gaXJxX3N0b3A7CisJbWF4ID0gYnJkLT5pbmZvLT5ucG9ydHM7CisJd2hpbGUgKHBhc3NfY291bnRlcisrIDwgTVhTRVJfSVNSX1BBU1NfTElNSVQpIHsKKwkJaXJxYml0cyA9IGluYihicmQtPnZlY3RvcikgJiBicmQtPnZlY3Rvcl9tYXNrOworCQlpZiAoaXJxYml0cyA9PSBicmQtPnZlY3Rvcl9tYXNrKQorCQkJYnJlYWs7CiAKLQkvKgotCSAqIGNsZWFyIGRlbHRhX21zcl93YWl0IHF1ZXVlIHRvIGF2b2lkIG1lbSBsZWFrczogd2UgbWF5IGZyZWUgdGhlIGlycQotCSAqIGhlcmUgc28gdGhlIHF1ZXVlIG1pZ2h0IG5ldmVyIGJlIHdha2VuIHVwCi0JICovCi0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CisJCWhhbmRsZWQgPSBJUlFfSEFORExFRDsKKwkJZm9yIChpID0gMCwgYml0cyA9IDE7IGkgPCBtYXg7IGkrKywgaXJxYml0cyB8PSBiaXRzLCBiaXRzIDw8PSAxKSB7CisJCQlpZiAoaXJxYml0cyA9PSBicmQtPnZlY3Rvcl9tYXNrKQorCQkJCWJyZWFrOworCQkJaWYgKGJpdHMgJiBpcnFiaXRzKQorCQkJCWNvbnRpbnVlOworCQkJcG9ydCA9ICZicmQtPnBvcnRzW2ldOwogCi0JLyoKLQkgKiBGcmVlIHRoZSBJUlEsIGlmIG5lY2Vzc2FyeQotCSAqLwotCWlmIChpbmZvLT54bWl0X2J1ZikgewotCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGluZm8tPnhtaXRfYnVmKTsKLQkJaW5mby0+eG1pdF9idWYgPSBOVUxMOworCQkJaW50X2NudCA9IDA7CisJCQlzcGluX2xvY2soJnBvcnQtPnNsb2NrKTsKKwkJCWRvIHsKKwkJCQlpaXIgPSBpbmIocG9ydC0+aW9hZGRyICsgVUFSVF9JSVIpOworCQkJCWlmIChpaXIgJiBVQVJUX0lJUl9OT19JTlQpCisJCQkJCWJyZWFrOworCQkJCWlpciAmPSBNT1hBX01VU1RfSUlSX01BU0s7CisJCQkJaWYgKCFwb3J0LT50dHkgfHwKKwkJCQkJCShwb3J0LT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpIHx8CisJCQkJCQkhKHBvcnQtPmZsYWdzICYKKwkJCQkJCQlBU1lOQ19JTklUSUFMSVpFRCkpIHsKKwkJCQkJc3RhdHVzID0gaW5iKHBvcnQtPmlvYWRkciArIFVBUlRfTFNSKTsKKwkJCQkJb3V0YigweDI3LCBwb3J0LT5pb2FkZHIgKyBVQVJUX0ZDUik7CisJCQkJCWluYihwb3J0LT5pb2FkZHIgKyBVQVJUX01TUik7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXN0YXR1cyA9IGluYihwb3J0LT5pb2FkZHIgKyBVQVJUX0xTUik7CisKKwkJCQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfUEUpCisJCQkJCXBvcnQtPmVycl9zaGFkb3cgfD0gTlBQSV9OT1RJRllfUEFSSVRZOworCQkJCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9GRSkKKwkJCQkJcG9ydC0+ZXJyX3NoYWRvdyB8PSBOUFBJX05PVElGWV9GUkFNSU5HOworCQkJCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9PRSkKKwkJCQkJcG9ydC0+ZXJyX3NoYWRvdyB8PQorCQkJCQkJTlBQSV9OT1RJRllfSFdfT1ZFUlJVTjsKKwkJCQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfQkkpCisJCQkJCXBvcnQtPmVycl9zaGFkb3cgfD0gTlBQSV9OT1RJRllfQlJFQUs7CisKKwkJCQlpZiAocG9ydC0+Ym9hcmQtPmNoaXBfZmxhZykgeworCQkJCQlpZiAoaWlyID09IE1PWEFfTVVTVF9JSVJfR0RBIHx8CisJCQkJCSAgICBpaXIgPT0gTU9YQV9NVVNUX0lJUl9SREEgfHwKKwkJCQkJICAgIGlpciA9PSBNT1hBX01VU1RfSUlSX1JUTyB8fAorCQkJCQkgICAgaWlyID09IE1PWEFfTVVTVF9JSVJfTFNSKQorCQkJCQkJbXhzZXJfcmVjZWl2ZV9jaGFycyhwb3J0LAorCQkJCQkJCQkmc3RhdHVzKTsKKworCQkJCX0gZWxzZSB7CisJCQkJCXN0YXR1cyAmPSBwb3J0LT5yZWFkX3N0YXR1c19tYXNrOworCQkJCQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfRFIpCisJCQkJCQlteHNlcl9yZWNlaXZlX2NoYXJzKHBvcnQsCisJCQkJCQkJCSZzdGF0dXMpOworCQkJCX0KKwkJCQltc3IgPSBpbmIocG9ydC0+aW9hZGRyICsgVUFSVF9NU1IpOworCQkJCWlmIChtc3IgJiBVQVJUX01TUl9BTllfREVMVEEpCisJCQkJCW14c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhwb3J0LCBtc3IpOworCisJCQkJaWYgKHBvcnQtPmJvYXJkLT5jaGlwX2ZsYWcpIHsKKwkJCQkJaWYgKGlpciA9PSAweDAyICYmIChzdGF0dXMgJgorCQkJCQkJCQlVQVJUX0xTUl9USFJFKSkKKwkJCQkJCW14c2VyX3RyYW5zbWl0X2NoYXJzKHBvcnQpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9USFJFKQorCQkJCQkJbXhzZXJfdHJhbnNtaXRfY2hhcnMocG9ydCk7CisJCQkJfQorCQkJfSB3aGlsZSAoaW50X2NudCsrIDwgTVhTRVJfSVNSX1BBU1NfTElNSVQpOworCQkJc3Bpbl91bmxvY2soJnBvcnQtPnNsb2NrKTsKKwkJfQogCX0KIAotCWluZm8tPklFUiA9IDA7Ci0Jb3V0YigweDAwLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOwotCi0JaWYgKCFpbmZvLT50dHkgfHwgKGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKSkKLQkJaW5mby0+TUNSICY9IH4oVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfUlRTKTsKLQlvdXRiKGluZm8tPk1DUiwgaW5mby0+YmFzZSArIFVBUlRfTUNSKTsKLQotCS8qIGNsZWFyIFJ4L1R4IEZJRk8ncyAqLwotCS8qIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOC0zMC0yMDAyICovCi0JaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykKLQkJb3V0YigoVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8Ci0JCQlVQVJUX0ZDUl9DTEVBUl9YTUlUIHwKLQkJCU1PWEFfTVVTVF9GQ1JfR0RBX01PREVfRU5BQkxFKSwgaW5mby0+YmFzZSArIFVBUlRfRkNSKTsKLQllbHNlCi0JCS8qIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA4LTMwLTIwMDIgKi8KLQkJb3V0YigoVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8IFVBUlRfRkNSX0NMRUFSX1hNSVQpLAotCQkJaW5mby0+YmFzZSArIFVBUlRfRkNSKTsKLQotCS8qIHJlYWQgZGF0YSBwb3J0IHRvIHJlc2V0IHRoaW5ncyAqLwotCSh2b2lkKSBpbmIoaW5mby0+YmFzZSArIFVBUlRfUlgpOwotCi0JaWYgKGluZm8tPnR0eSkKLQkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKLQotCWluZm8tPmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKLQotCS8qIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0yMy0yMDAyICovCi0JaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykKLQkJU0VUX01PWEFfTVVTVF9OT19TT0ZUV0FSRV9GTE9XX0NPTlRST0woaW5mby0+YmFzZSk7Ci0JLyogYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMjMtMjAwMiAqLwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKK2lycV9zdG9wOgorCXJldHVybiBoYW5kbGVkOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9vcGVyYXRpb25zIG14c2VyX29wcyA9IHsKKwkub3BlbiA9IG14c2VyX29wZW4sCisJLmNsb3NlID0gbXhzZXJfY2xvc2UsCisJLndyaXRlID0gbXhzZXJfd3JpdGUsCisJLnB1dF9jaGFyID0gbXhzZXJfcHV0X2NoYXIsCisJLmZsdXNoX2NoYXJzID0gbXhzZXJfZmx1c2hfY2hhcnMsCisJLndyaXRlX3Jvb20gPSBteHNlcl93cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSBteHNlcl9jaGFyc19pbl9idWZmZXIsCisJLmZsdXNoX2J1ZmZlciA9IG14c2VyX2ZsdXNoX2J1ZmZlciwKKwkuaW9jdGwgPSBteHNlcl9pb2N0bCwKKwkudGhyb3R0bGUgPSBteHNlcl90aHJvdHRsZSwKKwkudW50aHJvdHRsZSA9IG14c2VyX3VudGhyb3R0bGUsCisJLnNldF90ZXJtaW9zID0gbXhzZXJfc2V0X3Rlcm1pb3MsCisJLnN0b3AgPSBteHNlcl9zdG9wLAorCS5zdGFydCA9IG14c2VyX3N0YXJ0LAorCS5oYW5ndXAgPSBteHNlcl9oYW5ndXAsCisJLmJyZWFrX2N0bCA9IG14c2VyX3JzX2JyZWFrLAorCS53YWl0X3VudGlsX3NlbnQgPSBteHNlcl93YWl0X3VudGlsX3NlbnQsCisJLnRpb2NtZ2V0ID0gbXhzZXJfdGlvY21nZXQsCisJLnRpb2Ntc2V0ID0gbXhzZXJfdGlvY21zZXQsCit9OworCiAvKgotICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBzZXQgdGhlIFVBUlQgZGl2aXNvciByZWdpc3RlcnMgdG8gbWF0Y2gKLSAqIHRoZSBzcGVjaWZpZWQgYmF1ZCByYXRlIGZvciBhIHNlcmlhbCBwb3J0LgorICogVGhlIE1PWEEgU21hcnRpby9JbmR1c3RpbyBzZXJpYWwgZHJpdmVyIGJvb3QtdGltZSBpbml0aWFsaXphdGlvbiBjb2RlIQogICovCi1zdGF0aWMgaW50IG14c2VyX2NoYW5nZV9zcGVlZChzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvLCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQorCitzdGF0aWMgdm9pZCBteHNlcl9yZWxlYXNlX3JlcyhzdHJ1Y3QgbXhzZXJfYm9hcmQgKmJyZCwgc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCXVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgY2ZsYWcsIGN2YWwsIGZjcjsKLQlpbnQgcmV0ID0gMDsKLQl1bnNpZ25lZCBjaGFyIHN0YXR1czsKLQlsb25nIGJhdWQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghaW5mby0+dHR5IHx8ICFpbmZvLT50dHktPnRlcm1pb3MpCi0JCXJldHVybiByZXQ7Ci0JY2ZsYWcgPSBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7Ci0JaWYgKCEoaW5mby0+YmFzZSkpCi0JCXJldHVybiByZXQ7Ci0KLSNpZm5kZWYgQjkyMTYwMAotI2RlZmluZSBCOTIxNjAwIChCNDYwODAwICsxKQorCWlmIChpcnEpCisJCWZyZWVfaXJxKGJyZC0+aXJxLCBicmQpOworCWlmIChwZGV2ICE9IE5VTEwpIHsJLyogUENJICovCisjaWZkZWYgQ09ORklHX1BDSQorCQlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMik7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAzKTsKICNlbmRpZgotCWlmIChteHNlcl9zZXRfYmF1ZF9tZXRob2RbaW5mby0+cG9ydF0gPT0gMCkgewotCQliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUoaW5mby0+dHR5KTsKLQkJbXhzZXJfc2V0X2JhdWQoaW5mbywgYmF1ZCk7Ci0JfQotCi0JLyogYnl0ZSBzaXplIGFuZCBwYXJpdHkgKi8KLQlzd2l0Y2ggKGNmbGFnICYgQ1NJWkUpIHsKLQljYXNlIENTNToKLQkJY3ZhbCA9IDB4MDA7Ci0JCWJyZWFrOwotCWNhc2UgQ1M2OgotCQljdmFsID0gMHgwMTsKLQkJYnJlYWs7Ci0JY2FzZSBDUzc6Ci0JCWN2YWwgPSAweDAyOwotCQlicmVhazsKLQljYXNlIENTODoKLQkJY3ZhbCA9IDB4MDM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWN2YWwgPSAweDAwOwotCQlicmVhazsJCS8qIHRvbyBrZWVwIEdDQyBzaHV0Li4uICovCi0JfQotCWlmIChjZmxhZyAmIENTVE9QQikKLQkJY3ZhbCB8PSAweDA0OwotCWlmIChjZmxhZyAmIFBBUkVOQikKLQkJY3ZhbCB8PSBVQVJUX0xDUl9QQVJJVFk7Ci0JaWYgKCEoY2ZsYWcgJiBQQVJPREQpKQotCQljdmFsIHw9IFVBUlRfTENSX0VQQVI7Ci0JaWYgKGNmbGFnICYgQ01TUEFSKQotCQljdmFsIHw9IFVBUlRfTENSX1NQQVI7Ci0KLQlpZiAoKGluZm8tPnR5cGUgPT0gUE9SVF84MjUwKSB8fCAoaW5mby0+dHlwZSA9PSBQT1JUXzE2NDUwKSkgewotCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSB7Ci0JCQlmY3IgPSBVQVJUX0ZDUl9FTkFCTEVfRklGTzsKLQkJCWZjciB8PSBNT1hBX01VU1RfRkNSX0dEQV9NT0RFX0VOQUJMRTsKLQkJCVNFVF9NT1hBX01VU1RfRklGT19WQUxVRShpbmZvKTsKLQkJfSBlbHNlCi0JCQlmY3IgPSAwOwogCX0gZWxzZSB7Ci0JCWZjciA9IFVBUlRfRkNSX0VOQUJMRV9GSUZPOwotCQkvKiBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDgtMzAtMjAwMiAqLwotCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSB7Ci0JCQlmY3IgfD0gTU9YQV9NVVNUX0ZDUl9HREFfTU9ERV9FTkFCTEU7Ci0JCQlTRVRfTU9YQV9NVVNUX0ZJRk9fVkFMVUUoaW5mbyk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOC0zMC0yMDAyICovCi0JCQlzd2l0Y2ggKGluZm8tPnJ4X3RyaWdnZXIpIHsKLQkJCWNhc2UgMToKLQkJCQlmY3IgfD0gVUFSVF9GQ1JfVFJJR0dFUl8xOwotCQkJCWJyZWFrOwotCQkJY2FzZSA0OgotCQkJCWZjciB8PSBVQVJUX0ZDUl9UUklHR0VSXzQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDg6Ci0JCQkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfODsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfMTQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KKwkJcmVsZWFzZV9yZWdpb24oYnJkLT5wb3J0c1swXS5pb2FkZHIsIDggKiBicmQtPmluZm8tPm5wb3J0cyk7CisJCXJlbGVhc2VfcmVnaW9uKGJyZC0+dmVjdG9yLCAxKTsKIAl9Ci0KLQkvKiBDVFMgZmxvdyBjb250cm9sIGZsYWcgYW5kIG1vZGVtIHN0YXR1cyBpbnRlcnJ1cHRzICovCi0JaW5mby0+SUVSICY9IH5VQVJUX0lFUl9NU0k7Ci0JaW5mby0+TUNSICY9IH5VQVJUX01DUl9BRkU7Ci0JaWYgKGNmbGFnICYgQ1JUU0NUUykgewotCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19DVFNfRkxPVzsKLQkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX01TSTsKLQkJaWYgKChpbmZvLT50eXBlID09IFBPUlRfMTY1NTBBKSB8fCAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkgewotCQkJaW5mby0+TUNSIHw9IFVBUlRfTUNSX0FGRTsKLQkJfSBlbHNlIHsKLQkJCXN0YXR1cyA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9NU1IpOwotCQkJaWYgKGluZm8tPnR0eS0+aHdfc3RvcHBlZCkgewotCQkJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9DVFMpIHsKLQkJCQkJaW5mby0+dHR5LT5od19zdG9wcGVkID0gMDsKLQkJCQkJaWYgKChpbmZvLT50eXBlICE9IFBPUlRfMTY1NTBBKSAmJgotCQkJCQkJCSghaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkgewotCQkJCQkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7Ci0JCQkJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKLQkJCQkJfQotCQkJCQlzZXRfYml0KE1YU0VSX0VWRU5UX1RYTE9XLCAmaW5mby0+ZXZlbnQpOwotCQkJCQlzY2hlZHVsZV93b3JrKCZpbmZvLT50cXVldWUpOwkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICghKHN0YXR1cyAmIFVBUlRfTVNSX0NUUykpIHsKLQkJCQkJaW5mby0+dHR5LT5od19zdG9wcGVkID0gMTsKLQkJCQkJaWYgKChpbmZvLT50eXBlICE9IFBPUlRfMTY1NTBBKSAmJgotCQkJCQkJCSghaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkgewotCQkJCQkJaW5mby0+SUVSICY9IH5VQVJUX0lFUl9USFJJOwotCQkJCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlpbmZvLT5mbGFncyAmPSB+QVNZTkNfQ1RTX0ZMT1c7Ci0JfQotCW91dGIoaW5mby0+TUNSLCBpbmZvLT5iYXNlICsgVUFSVF9NQ1IpOwotCWlmIChjZmxhZyAmIENMT0NBTCkgewotCQlpbmZvLT5mbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7Ci0JfSBlbHNlIHsKLQkJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfQ0hFQ0tfQ0Q7Ci0JCWluZm8tPklFUiB8PSBVQVJUX0lFUl9NU0k7Ci0JfQotCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOwotCi0JLyoKLQkgKiBTZXQgdXAgcGFyaXR5IGNoZWNrIGZsYWcKLQkgKi8KLQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrID0gVUFSVF9MU1JfT0UgfCBVQVJUX0xTUl9USFJFIHwgVUFSVF9MU1JfRFI7Ci0JaWYgKElfSU5QQ0soaW5mby0+dHR5KSkKLQkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9GRSB8IFVBUlRfTFNSX1BFOwotCWlmIChJX0JSS0lOVChpbmZvLT50dHkpIHx8IElfUEFSTVJLKGluZm8tPnR0eSkpCi0JCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfQkk7Ci0KLQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgPSAwOwotCi0JaWYgKElfSUdOQlJLKGluZm8tPnR0eSkpIHsKLQkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0JJOwotCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0JJOwotCQkvKgotCQkgKiBJZiB3ZSdyZSBpZ25vcmUgcGFyaXR5IGFuZCBicmVhayBpbmRpY2F0b3JzLCBpZ25vcmUKLQkJICogb3ZlcnJ1bnMgdG9vLiAgKEZvciByZWFsIHJhdyBzdXBwb3J0KS4KLQkJICovCi0JCWlmIChJX0lHTlBBUihpbmZvLT50dHkpKSB7Ci0JCQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgfD0KLQkJCQkJCVVBUlRfTFNSX09FIHwKLQkJCQkJCVVBUlRfTFNSX1BFIHwKLQkJCQkJCVVBUlRfTFNSX0ZFOwotCQkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PQotCQkJCQkJVUFSVF9MU1JfT0UgfAotCQkJCQkJVUFSVF9MU1JfUEUgfAotCQkJCQkJVUFSVF9MU1JfRkU7Ci0JCX0KLQl9Ci0JLyogZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KLQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCQlTRVRfTU9YQV9NVVNUX1hPTjFfVkFMVUUoaW5mby0+YmFzZSwgU1RBUlRfQ0hBUihpbmZvLT50dHkpKTsKLQkJU0VUX01PWEFfTVVTVF9YT0ZGMV9WQUxVRShpbmZvLT5iYXNlLCBTVE9QX0NIQVIoaW5mby0+dHR5KSk7Ci0JCWlmIChJX0lYT04oaW5mby0+dHR5KSkgewotCQkJRU5BQkxFX01PWEFfTVVTVF9SWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woaW5mby0+YmFzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlESVNBQkxFX01PWEFfTVVTVF9SWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woaW5mby0+YmFzZSk7Ci0JCX0KLQkJaWYgKElfSVhPRkYoaW5mby0+dHR5KSkgewotCQkJRU5BQkxFX01PWEFfTVVTVF9UWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woaW5mby0+YmFzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlESVNBQkxFX01PWEFfTVVTVF9UWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woaW5mby0+YmFzZSk7Ci0JCX0KLQkJLyoKLQkJICAgaWYgKCBJX0lYQU5ZKGluZm8tPnR0eSkgKSB7Ci0JCSAgIGluZm8tPk1DUiB8PSBNT1hBX01VU1RfTUNSX1hPTl9BTlk7Ci0JCSAgIEVOQUJMRV9NT1hBX01VU1RfWE9OX0FOWV9GTE9XX0NPTlRST0woaW5mby0+YmFzZSk7Ci0JCSAgIH0gZWxzZSB7Ci0JCSAgIGluZm8tPk1DUiAmPSB+TU9YQV9NVVNUX01DUl9YT05fQU5ZOwotCQkgICBESVNBQkxFX01PWEFfTVVTVF9YT05fQU5ZX0ZMT1dfQ09OVFJPTChpbmZvLT5iYXNlKTsKLQkJICAgfQotCQkgKi8KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQl9Ci0JLyogYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMiAqLwotCi0KLQlvdXRiKGZjciwgaW5mby0+YmFzZSArIFVBUlRfRkNSKTsJLyogc2V0IGZjciAqLwotCW91dGIoY3ZhbCwgaW5mby0+YmFzZSArIFVBUlRfTENSKTsKLQotCXJldHVybiByZXQ7CiB9CiAKLQotc3RhdGljIGludCBteHNlcl9zZXRfYmF1ZChzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvLCBsb25nIG5ld3NwZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IG14c2VyX2luaXRicmQoc3RydWN0IG14c2VyX2JvYXJkICpicmQsCisJCXN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCWludCBxdW90ID0gMDsKLQl1bnNpZ25lZCBjaGFyIGN2YWw7Ci0JaW50IHJldCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbzsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0dmFsOwogCi0JaWYgKCFpbmZvLT50dHkgfHwgIWluZm8tPnR0eS0+dGVybWlvcykKLQkJcmV0dXJuIHJldDsKKwlwcmludGsoS0VSTl9JTkZPICJtYXguIGJhdWQgcmF0ZSA9ICVkIGJwcy5cbiIsIGJyZC0+cG9ydHNbMF0ubWF4X2JhdWQpOwogCi0JaWYgKCEoaW5mby0+YmFzZSkpCi0JCXJldHVybiByZXQ7CisJZm9yIChpID0gMDsgaSA8IGJyZC0+aW5mby0+bnBvcnRzOyBpKyspIHsKKwkJaW5mbyA9ICZicmQtPnBvcnRzW2ldOworCQlpbmZvLT5ib2FyZCA9IGJyZDsKKwkJaW5mby0+c3RvcF9yeCA9IDA7CisJCWluZm8tPmxkaXNjX3N0b3BfcnggPSAwOwogCi0JaWYgKG5ld3NwZCA+IGluZm8tPk1heENhblNldEJhdWRSYXRlKQotCQlyZXR1cm4gMDsKKwkJLyogRW5oYW5jZSBtb2RlIGVuYWJsZWQgaGVyZSAqLworCQlpZiAoYnJkLT5jaGlwX2ZsYWcgIT0gTU9YQV9PVEhFUl9VQVJUKQorCQkJRU5BQkxFX01PWEFfTVVTVF9FTkNIQU5DRV9NT0RFKGluZm8tPmlvYWRkcik7CiAKLQlpbmZvLT5yZWFsYmF1ZCA9IG5ld3NwZDsKLQlpZiAobmV3c3BkID09IDEzNCkgewotCQlxdW90ID0gKDIgKiBpbmZvLT5iYXVkX2Jhc2UgLyAyNjkpOwotCX0gZWxzZSBpZiAobmV3c3BkKSB7Ci0JCXF1b3QgPSBpbmZvLT5iYXVkX2Jhc2UgLyBuZXdzcGQ7Ci0JCWlmIChxdW90ID09IDApCi0JCQlxdW90ID0gMTsKLQl9IGVsc2UgewotCQlxdW90ID0gMDsKKwkJaW5mby0+ZmxhZ3MgPSBBU1lOQ19TSEFSRV9JUlE7CisJCWluZm8tPnR5cGUgPSBicmQtPnVhcnRfdHlwZTsKKworCQlwcm9jZXNzX3R4cnhfZmlmbyhpbmZvKTsKKworCQlpbmZvLT5jdXN0b21fZGl2aXNvciA9IGluZm8tPmJhdWRfYmFzZSAqIDE2OworCQlpbmZvLT5jbG9zZV9kZWxheSA9IDUgKiBIWiAvIDEwOworCQlpbmZvLT5jbG9zaW5nX3dhaXQgPSAzMCAqIEhaOworCQlpbmZvLT5ub3JtYWxfdGVybWlvcyA9IG14dmFyX3Nkcml2ZXItPmluaXRfdGVybWlvczsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+b3Blbl93YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+ZGVsdGFfbXNyX3dhaXQpOworCQltZW1zZXQoJmluZm8tPm1vbl9kYXRhLCAwLCBzaXplb2Yoc3RydWN0IG14c2VyX21vbikpOworCQlpbmZvLT5lcnJfc2hhZG93ID0gMDsKKwkJc3Bpbl9sb2NrX2luaXQoJmluZm8tPnNsb2NrKTsKKworCQkvKiBiZWZvcmUgc2V0IElOVCBJU1IsIGRpc2FibGUgYWxsIGludCAqLworCQlvdXRiKGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUikgJiAweGYwLAorCQkJaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOwogCX0KIAotCWluZm8tPnRpbWVvdXQgPSAoKGluZm8tPnhtaXRfZmlmb19zaXplICogSFogKiAxMCAqIHF1b3QpIC8gaW5mby0+YmF1ZF9iYXNlKTsKLQlpbmZvLT50aW1lb3V0ICs9IEhaIC8gNTA7CS8qIEFkZCAuMDIgc2Vjb25kcyBvZiBzbG9wICovCi0KLQlpZiAocXVvdCkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQkJaW5mby0+TUNSIHw9IFVBUlRfTUNSX0RUUjsKLQkJb3V0YihpbmZvLT5NQ1IsIGluZm8tPmJhc2UgKyBVQVJUX01DUik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0JfSBlbHNlIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0JCWluZm8tPk1DUiAmPSB+VUFSVF9NQ1JfRFRSOwotCQlvdXRiKGluZm8tPk1DUiwgaW5mby0+YmFzZSArIFVBUlRfTUNSKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQljdmFsID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xDUik7Ci0KLQlvdXRiKGN2YWwgfCBVQVJUX0xDUl9ETEFCLCBpbmZvLT5iYXNlICsgVUFSVF9MQ1IpOwkvKiBzZXQgRExBQiAqLwotCi0Jb3V0YihxdW90ICYgMHhmZiwgaW5mby0+YmFzZSArIFVBUlRfRExMKTsJLyogTFMgb2YgZGl2aXNvciAqLwotCW91dGIocXVvdCA+PiA4LCBpbmZvLT5iYXNlICsgVUFSVF9ETE0pOwkvKiBNUyBvZiBkaXZpc29yICovCi0Jb3V0YihjdmFsLCBpbmZvLT5iYXNlICsgVUFSVF9MQ1IpOwkvKiByZXNldCBETEFCICovCi0KLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIGZyaWVuZHMgb2YgbXhzZXJfaW9jdGwoKQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLXN0YXRpYyBpbnQgbXhzZXJfZ2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8sIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqcmV0aW5mbykKLXsKLQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCB0bXA7Ci0KLQlpZiAoIXJldGluZm8pCi0JCXJldHVybiAtRUZBVUxUOwotCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7Ci0JdG1wLnR5cGUgPSBpbmZvLT50eXBlOwotCXRtcC5saW5lID0gaW5mby0+cG9ydDsKLQl0bXAucG9ydCA9IGluZm8tPmJhc2U7Ci0JdG1wLmlycSA9IGluZm8tPmlycTsKLQl0bXAuZmxhZ3MgPSBpbmZvLT5mbGFnczsKLQl0bXAuYmF1ZF9iYXNlID0gaW5mby0+YmF1ZF9iYXNlOwotCXRtcC5jbG9zZV9kZWxheSA9IGluZm8tPmNsb3NlX2RlbGF5OwotCXRtcC5jbG9zaW5nX3dhaXQgPSBpbmZvLT5jbG9zaW5nX3dhaXQ7Ci0JdG1wLmN1c3RvbV9kaXZpc29yID0gaW5mby0+Y3VzdG9tX2Rpdmlzb3I7Ci0JdG1wLmh1YjYgPSAwOwotCWlmIChjb3B5X3RvX3VzZXIocmV0aW5mbywgJnRtcCwgc2l6ZW9mKCpyZXRpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG14c2VyX3NldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKm5ld19pbmZvKQotewotCXN0cnVjdCBzZXJpYWxfc3RydWN0IG5ld19zZXJpYWw7Ci0JdW5zaWduZWQgaW50IGZsYWdzOwotCWludCByZXR2YWwgPSAwOwotCi0JaWYgKCFuZXdfaW5mbyB8fCAhaW5mby0+YmFzZSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfc2VyaWFsLCBuZXdfaW5mbywgc2l6ZW9mKG5ld19zZXJpYWwpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoKG5ld19zZXJpYWwuaXJxICE9IGluZm8tPmlycSkgfHwKLQkJCShuZXdfc2VyaWFsLnBvcnQgIT0gaW5mby0+YmFzZSkgfHwKLQkJCShuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yICE9IGluZm8tPmN1c3RvbV9kaXZpc29yKSB8fAotCQkJKG5ld19zZXJpYWwuYmF1ZF9iYXNlICE9IGluZm8tPmJhdWRfYmFzZSkpCi0JCXJldHVybiAtRVBFUk07Ci0KLQlmbGFncyA9IGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0s7Ci0KLQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKLQkJaWYgKChuZXdfc2VyaWFsLmJhdWRfYmFzZSAhPSBpbmZvLT5iYXVkX2Jhc2UpIHx8Ci0JCQkJKG5ld19zZXJpYWwuY2xvc2VfZGVsYXkgIT0gaW5mby0+Y2xvc2VfZGVsYXkpIHx8Ci0JCQkJKChuZXdfc2VyaWFsLmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSAhPSAoaW5mby0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spKSkKLQkJCXJldHVybiAtRVBFUk07Ci0JCWluZm8tPmZsYWdzID0gKChpbmZvLT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgfAotCQkJCShuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfVVNSX01BU0spKTsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBPSywgcGFzdCB0aGlzIHBvaW50LCBhbGwgdGhlIGVycm9yIGNoZWNraW5nIGhhcyBiZWVuIGRvbmUuCi0JCSAqIEF0IHRoaXMgcG9pbnQsIHdlIHN0YXJ0IG1ha2luZyBjaGFuZ2VzLi4uLi4KLQkJICovCi0JCWluZm8tPmZsYWdzID0gKChpbmZvLT5mbGFncyAmIH5BU1lOQ19GTEFHUykgfAotCQkJCShuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfRkxBR1MpKTsKLQkJaW5mby0+Y2xvc2VfZGVsYXkgPSBuZXdfc2VyaWFsLmNsb3NlX2RlbGF5ICogSFogLyAxMDA7Ci0JCWluZm8tPmNsb3Npbmdfd2FpdCA9IG5ld19zZXJpYWwuY2xvc2luZ193YWl0ICogSFogLyAxMDA7Ci0JCWluZm8tPnR0eS0+bG93X2xhdGVuY3kgPQotCQkJCShpbmZvLT5mbGFncyAmIEFTWU5DX0xPV19MQVRFTkNZKSA/IDEgOiAwOwotCQlpbmZvLT50dHktPmxvd19sYXRlbmN5ID0gMDsJLyogKGluZm8tPmZsYWdzICYgQVNZTkNfTE9XX0xBVEVOQ1kpID8gMSA6IDA7ICovCi0JfQotCi0JLyogYWRkZWQgYnkgY2FzcGVyLCAzLzE3LzIwMDAsIGZvciBtb3VzZSAqLwotCWluZm8tPnR5cGUgPSBuZXdfc2VyaWFsLnR5cGU7Ci0KLQlwcm9jZXNzX3R4cnhfZmlmbyhpbmZvKTsKLQotCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7Ci0JCWlmIChmbGFncyAhPSAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykpIHsKLQkJCW14c2VyX2NoYW5nZV9zcGVlZChpbmZvLCBOVUxMKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXJldHZhbCA9IG14c2VyX3N0YXJ0dXAoaW5mbyk7CisJcmV0dmFsID0gcmVxdWVzdF9pcnEoYnJkLT5pcnEsIG14c2VyX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsICJteHNlciIsCisJCQlicmQpOworCWlmIChyZXR2YWwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCb2FyZCAlczogUmVxdWVzdCBpcnEgZmFpbGVkLCBJUlEgKCVkKSBtYXkgIgorCQkJImNvbmZsaWN0IHdpdGggYW5vdGhlciBkZXZpY2UuXG4iLAorCQkJYnJkLT5pbmZvLT5uYW1lLCBicmQtPmlycSk7CisJCS8qIFdlIGhvbGQgcmVzb3VyY2VzLCB3ZSBuZWVkIHRvIHJlbGVhc2UgdGhlbS4gKi8KKwkJbXhzZXJfcmVsZWFzZV9yZXMoYnJkLCBwZGV2LCAwKTsKIAl9CiAJcmV0dXJuIHJldHZhbDsKIH0KIAotLyoKLSAqIG14c2VyX2dldF9sc3JfaW5mbyAtIGdldCBsaW5lIHN0YXR1cyByZWdpc3RlciBpbmZvCi0gKgotICogUHVycG9zZTogTGV0IHVzZXIgY2FsbCBpb2N0bCgpIHRvIGdldCBpbmZvIHdoZW4gdGhlIFVBUlQgcGh5c2ljYWxseQotICoJICAgIGlzIGVtcHRpZWQuICBPbiBidXMgdHlwZXMgbGlrZSBSUzQ4NSwgdGhlIHRyYW5zbWl0dGVyIG11c3QKLSAqCSAgICByZWxlYXNlIHRoZSBidXMgYWZ0ZXIgdHJhbnNtaXR0aW5nLiBUaGlzIG11c3QgYmUgZG9uZSB3aGVuCi0gKgkgICAgdGhlIHRyYW5zbWl0IHNoaWZ0IHJlZ2lzdGVyIGlzIGVtcHR5LCBub3QgYmUgZG9uZSB3aGVuIHRoZQotICoJICAgIHRyYW5zbWl0IGhvbGRpbmcgcmVnaXN0ZXIgaXMgZW1wdHkuICBUaGlzIGZ1bmN0aW9uYWxpdHkKLSAqCSAgICBhbGxvd3MgYW4gUlM0ODUgZHJpdmVyIHRvIGJlIHdyaXR0ZW4gaW4gdXNlciBzcGFjZS4KLSAqLwotc3RhdGljIGludCBteHNlcl9nZXRfbHNyX2luZm8oc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbywgdW5zaWduZWQgaW50IF9fdXNlciAqdmFsdWUpCi17Ci0JdW5zaWduZWQgY2hhciBzdGF0dXM7Ci0JdW5zaWduZWQgaW50IHJlc3VsdDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0Jc3RhdHVzID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xTUik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQlyZXN1bHQgPSAoKHN0YXR1cyAmIFVBUlRfTFNSX1RFTVQpID8gVElPQ1NFUl9URU1UIDogMCk7Ci0JcmV0dXJuIHB1dF91c2VyKHJlc3VsdCwgdmFsdWUpOwotfQotCi0vKgotICogVGhpcyByb3V0aW5lIHNlbmRzIGEgYnJlYWsgY2hhcmFjdGVyIG91dCB0aGUgc2VyaWFsIHBvcnQuCi0gKi8KLXN0YXRpYyB2b2lkIG14c2VyX3NlbmRfYnJlYWsoc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbywgaW50IGR1cmF0aW9uKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIWluZm8tPmJhc2UpCi0JCXJldHVybjsKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCW91dGIoaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xDUikgfCBVQVJUX0xDUl9TQkMsCi0JCWluZm8tPmJhc2UgKyBVQVJUX0xDUik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQlzY2hlZHVsZV90aW1lb3V0KGR1cmF0aW9uKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQlvdXRiKGluYihpbmZvLT5iYXNlICsgVUFSVF9MQ1IpICYgflVBUlRfTENSX1NCQywKLQkJaW5mby0+YmFzZSArIFVBUlRfTENSKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IG14c2VyX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwotCXVuc2lnbmVkIGNoYXIgY29udHJvbCwgc3RhdHVzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQotCWlmICh0dHktPmluZGV4ID09IE1YU0VSX1BPUlRTKQotCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwotCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQljb250cm9sID0gaW5mby0+TUNSOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0Jc3RhdHVzID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX01TUik7Ci0JaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0FOWV9ERUxUQSkKLQkJbXhzZXJfY2hlY2tfbW9kZW1fc3RhdHVzKGluZm8sIHN0YXR1cyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gKChjb250cm9sICYgVUFSVF9NQ1JfUlRTKSA/IFRJT0NNX1JUUyA6IDApIHwKLQkJICAgICgoY29udHJvbCAmIFVBUlRfTUNSX0RUUikgPyBUSU9DTV9EVFIgOiAwKSB8Ci0JCSAgICAoKHN0YXR1cyAmIFVBUlRfTVNSX0RDRCkgPyBUSU9DTV9DQVIgOiAwKSB8Ci0JCSAgICAoKHN0YXR1cyAmIFVBUlRfTVNSX1JJKSA/IFRJT0NNX1JORyA6IDApIHwKLQkJICAgICgoc3RhdHVzICYgVUFSVF9NU1JfRFNSKSA/IFRJT0NNX0RTUiA6IDApIHwKLQkJICAgICgoc3RhdHVzICYgVUFSVF9NU1JfQ1RTKSA/IFRJT0NNX0NUUyA6IDApOwotfQotCi1zdGF0aWMgaW50IG14c2VyX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCi17Ci0Jc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCi0JaWYgKHR0eS0+aW5kZXggPT0gTVhTRVJfUE9SVFMpCi0JCXJldHVybiAtRU5PSU9DVExDTUQ7Ci0JaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQotCQlyZXR1cm4gLUVJTzsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCi0JaWYgKHNldCAmIFRJT0NNX1JUUykKLQkJaW5mby0+TUNSIHw9IFVBUlRfTUNSX1JUUzsKLQlpZiAoc2V0ICYgVElPQ01fRFRSKQotCQlpbmZvLT5NQ1IgfD0gVUFSVF9NQ1JfRFRSOwotCi0JaWYgKGNsZWFyICYgVElPQ01fUlRTKQotCQlpbmZvLT5NQ1IgJj0gflVBUlRfTUNSX1JUUzsKLQlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCi0JCWluZm8tPk1DUiAmPSB+VUFSVF9NQ1JfRFRSOwotCi0Jb3V0YihpbmZvLT5NQ1IsIGluZm8tPmJhc2UgKyBVQVJUX01DUik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IG14c2VyX3JlYWRfcmVnaXN0ZXIoaW50LCB1bnNpZ25lZCBzaG9ydCAqKTsKLXN0YXRpYyBpbnQgbXhzZXJfcHJvZ3JhbV9tb2RlKGludCk7Ci1zdGF0aWMgdm9pZCBteHNlcl9ub3JtYWxfbW9kZShpbnQpOwotCi1zdGF0aWMgaW50IG14c2VyX2dldF9JU0FfY29uZihpbnQgY2FwLCBzdHJ1Y3QgbXhzZXJfaHdjb25mICpod2NvbmYpCitzdGF0aWMgaW50IF9faW5pdCBteHNlcl9nZXRfSVNBX2NvbmYoaW50IGNhcCwgc3RydWN0IG14c2VyX2JvYXJkICpicmQpCiB7CiAJaW50IGlkLCBpLCBiaXRzOwogCXVuc2lnbmVkIHNob3J0IHJlZ3NbMTZdLCBpcnE7CiAJdW5zaWduZWQgY2hhciBzY3JhdGNoLCBzY3JhdGNoMjsKIAotCWh3Y29uZi0+SXNNb3hhTXVzdENoaXBGbGFnID0gTU9YQV9PVEhFUl9VQVJUOworCWJyZC0+Y2hpcF9mbGFnID0gTU9YQV9PVEhFUl9VQVJUOwogCiAJaWQgPSBteHNlcl9yZWFkX3JlZ2lzdGVyKGNhcCwgcmVncyk7Ci0JaWYgKGlkID09IEMxNjhfQVNJQ19JRCkgewotCQlod2NvbmYtPmJvYXJkX3R5cGUgPSBNWFNFUl9CT0FSRF9DMTY4X0lTQTsKLQkJaHdjb25mLT5wb3J0cyA9IDg7Ci0JfSBlbHNlIGlmIChpZCA9PSBDMTA0X0FTSUNfSUQpIHsKLQkJaHdjb25mLT5ib2FyZF90eXBlID0gTVhTRVJfQk9BUkRfQzEwNF9JU0E7Ci0JCWh3Y29uZi0+cG9ydHMgPSA0OwotCX0gZWxzZSBpZiAoaWQgPT0gQzEwMl9BU0lDX0lEKSB7Ci0JCWh3Y29uZi0+Ym9hcmRfdHlwZSA9IE1YU0VSX0JPQVJEX0MxMDJfSVNBOwotCQlod2NvbmYtPnBvcnRzID0gMjsKLQl9IGVsc2UgaWYgKGlkID09IENJMTMyX0FTSUNfSUQpIHsKLQkJaHdjb25mLT5ib2FyZF90eXBlID0gTVhTRVJfQk9BUkRfQ0kxMzI7Ci0JCWh3Y29uZi0+cG9ydHMgPSAyOwotCX0gZWxzZSBpZiAoaWQgPT0gQ0kxMzRfQVNJQ19JRCkgewotCQlod2NvbmYtPmJvYXJkX3R5cGUgPSBNWFNFUl9CT0FSRF9DSTEzNDsKLQkJaHdjb25mLT5wb3J0cyA9IDQ7Ci0JfSBlbHNlIGlmIChpZCA9PSBDSTEwNEpfQVNJQ19JRCkgewotCQlod2NvbmYtPmJvYXJkX3R5cGUgPSBNWFNFUl9CT0FSRF9DSTEwNEo7Ci0JCWh3Y29uZi0+cG9ydHMgPSA0OwotCX0gZWxzZQorCXN3aXRjaCAoaWQpIHsKKwljYXNlIEMxNjhfQVNJQ19JRDoKKwkJYnJkLT5pbmZvID0gJm14c2VyX2NhcmRzWzBdOworCQlicmVhazsKKwljYXNlIEMxMDRfQVNJQ19JRDoKKwkJYnJkLT5pbmZvID0gJm14c2VyX2NhcmRzWzFdOworCQlicmVhazsKKwljYXNlIENJMTA0Sl9BU0lDX0lEOgorCQlicmQtPmluZm8gPSAmbXhzZXJfY2FyZHNbMl07CisJCWJyZWFrOworCWNhc2UgQzEwMl9BU0lDX0lEOgorCQlicmQtPmluZm8gPSAmbXhzZXJfY2FyZHNbNV07CisJCWJyZWFrOworCWNhc2UgQ0kxMzJfQVNJQ19JRDoKKwkJYnJkLT5pbmZvID0gJm14c2VyX2NhcmRzWzZdOworCQlicmVhazsKKwljYXNlIENJMTM0X0FTSUNfSUQ6CisJCWJyZC0+aW5mbyA9ICZteHNlcl9jYXJkc1s3XTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJcmV0dXJuIDA7CisJfQogCiAJaXJxID0gMDsKLQlpZiAoaHdjb25mLT5wb3J0cyA9PSAyKSB7CisJLyogc29tZSBJU0EgY2FyZHMgaGF2ZSAyIHBvcnRzLCBidXQgd2Ugd2FudCB0byBzZWUgdGhlbSBhcyA0LXBvcnQgKHdoeT8pCisJICAgRmxhZy1oYWNrIGNoZWNrcyBpZiBjb25maWd1cmF0aW9uIHNob3VsZCBiZSByZWFkIGFzIDItcG9ydCBoZXJlLiAqLworCWlmIChicmQtPmluZm8tPm5wb3J0cyA9PSAyIHx8IChicmQtPmluZm8tPmZsYWdzICYgTVhTRVJfSEFTMikpIHsKIAkJaXJxID0gcmVnc1s5XSAmIDB4RjAwMDsKIAkJaXJxID0gaXJxIHwgKGlycSA+PiA0KTsKIAkJaWYgKGlycSAhPSAocmVnc1s5XSAmIDB4RkYwMCkpCiAJCQlyZXR1cm4gTVhTRVJfRVJSX0lSUV9DT05GTElUOwotCX0gZWxzZSBpZiAoaHdjb25mLT5wb3J0cyA9PSA0KSB7CisJfSBlbHNlIGlmIChicmQtPmluZm8tPm5wb3J0cyA9PSA0KSB7CiAJCWlycSA9IHJlZ3NbOV0gJiAweEYwMDA7CiAJCWlycSA9IGlycSB8IChpcnEgPj4gNCk7CiAJCWlycSA9IGlycSB8IChpcnEgPj4gOCk7CiAJCWlmIChpcnEgIT0gcmVnc1s5XSkKIAkJCXJldHVybiBNWFNFUl9FUlJfSVJRX0NPTkZMSVQ7Ci0JfSBlbHNlIGlmIChod2NvbmYtPnBvcnRzID09IDgpIHsKKwl9IGVsc2UgaWYgKGJyZC0+aW5mby0+bnBvcnRzID09IDgpIHsKIAkJaXJxID0gcmVnc1s5XSAmIDB4RjAwMDsKIAkJaXJxID0gaXJxIHwgKGlycSA+PiA0KTsKIAkJaXJxID0gaXJxIHwgKGlycSA+PiA4KTsKQEAgLTI5ODMsMjMgKzI0MzIsMjMgQEAKIAogCWlmICghaXJxKQogCQlyZXR1cm4gTVhTRVJfRVJSX0lSUTsKLQlod2NvbmYtPmlycSA9ICgoaW50KShpcnEgJiAweEYwMDApID4+IDEyKTsKKwlicmQtPmlycSA9ICgoaW50KShpcnEgJiAweEYwMDApID4+IDEyKTsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQlod2NvbmYtPmlvYWRkcltpXSA9IChpbnQpIHJlZ3NbaSArIDFdICYgMHhGRkY4OworCQlicmQtPnBvcnRzW2ldLmlvYWRkciA9IChpbnQpIHJlZ3NbaSArIDFdICYgMHhGRkY4OwogCWlmICgocmVnc1sxMl0gJiAweDgwKSA9PSAwKQogCQlyZXR1cm4gTVhTRVJfRVJSX1ZFQ1RPUjsKLQlod2NvbmYtPnZlY3RvciA9IChpbnQpcmVnc1sxMV07CS8qIGludGVycnVwdCB2ZWN0b3IgKi8KKwlicmQtPnZlY3RvciA9IChpbnQpcmVnc1sxMV07CS8qIGludGVycnVwdCB2ZWN0b3IgKi8KIAlpZiAoaWQgPT0gMSkKLQkJaHdjb25mLT52ZWN0b3JfbWFzayA9IDB4MDBGRjsKKwkJYnJkLT52ZWN0b3JfbWFzayA9IDB4MDBGRjsKIAllbHNlCi0JCWh3Y29uZi0+dmVjdG9yX21hc2sgPSAweDAwMEY7CisJCWJyZC0+dmVjdG9yX21hc2sgPSAweDAwMEY7CiAJZm9yIChpID0gNywgYml0cyA9IDB4MDEwMDsgaSA+PSAwOyBpLS0sIGJpdHMgPDw9IDEpIHsKIAkJaWYgKHJlZ3NbMTJdICYgYml0cykgewotCQkJaHdjb25mLT5iYXVkX2Jhc2VbaV0gPSA5MjE2MDA7Ci0JCQlod2NvbmYtPk1heENhblNldEJhdWRSYXRlW2ldID0gOTIxNjAwOwkvKiBhZGQgYnkgVmljdG9yIFl1LiAwOS0wNC0yMDAyICovCisJCQlicmQtPnBvcnRzW2ldLmJhdWRfYmFzZSA9IDkyMTYwMDsKKwkJCWJyZC0+cG9ydHNbaV0ubWF4X2JhdWQgPSA5MjE2MDA7CiAJCX0gZWxzZSB7Ci0JCQlod2NvbmYtPmJhdWRfYmFzZVtpXSA9IDExNTIwMDsKLQkJCWh3Y29uZi0+TWF4Q2FuU2V0QmF1ZFJhdGVbaV0gPSAxMTUyMDA7CS8qIGFkZCBieSBWaWN0b3IgWXUuIDA5LTA0LTIwMDIgKi8KKwkJCWJyZC0+cG9ydHNbaV0uYmF1ZF9iYXNlID0gMTE1MjAwOworCQkJYnJkLT5wb3J0c1tpXS5tYXhfYmF1ZCA9IDExNTIwMDsKIAkJfQogCX0KIAlzY3JhdGNoMiA9IGluYihjYXAgKyBVQVJUX0xDUikgJiAoflVBUlRfTENSX0RMQUIpOwpAQCAtMzAxMCwxMjMgKzI0NTksMjc5IEBACiAJc2NyYXRjaCA9IGluYihjYXAgKyBVQVJUX0lJUik7CiAKIAlpZiAoc2NyYXRjaCAmIDB4QzApCi0JCWh3Y29uZi0+dWFydF90eXBlID0gUE9SVF8xNjU1MEE7CisJCWJyZC0+dWFydF90eXBlID0gUE9SVF8xNjU1MEE7CiAJZWxzZQotCQlod2NvbmYtPnVhcnRfdHlwZSA9IFBPUlRfMTY0NTA7Ci0JaWYgKGlkID09IDEpCi0JCWh3Y29uZi0+cG9ydHMgPSA4OwotCWVsc2UKLQkJaHdjb25mLT5wb3J0cyA9IDQ7Ci0JcmVxdWVzdF9yZWdpb24oaHdjb25mLT5pb2FkZHJbMF0sIDggKiBod2NvbmYtPnBvcnRzLCAibXhzZXIoSU8pIik7Ci0JcmVxdWVzdF9yZWdpb24oaHdjb25mLT52ZWN0b3IsIDEsICJteHNlcih2ZWN0b3IpIik7Ci0JcmV0dXJuIGh3Y29uZi0+cG9ydHM7CisJCWJyZC0+dWFydF90eXBlID0gUE9SVF8xNjQ1MDsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGJyZC0+cG9ydHNbMF0uaW9hZGRyLCA4ICogYnJkLT5pbmZvLT5ucG9ydHMsCisJCQkibXhzZXIoSU8pIikpCisJCXJldHVybiBNWFNFUl9FUlJfSU9BRERSOworCWlmICghcmVxdWVzdF9yZWdpb24oYnJkLT52ZWN0b3IsIDEsICJteHNlcih2ZWN0b3IpIikpIHsKKwkJcmVsZWFzZV9yZWdpb24oYnJkLT5wb3J0c1swXS5pb2FkZHIsIDggKiBicmQtPmluZm8tPm5wb3J0cyk7CisJCXJldHVybiBNWFNFUl9FUlJfVkVDVE9SOworCX0KKwlyZXR1cm4gYnJkLT5pbmZvLT5ucG9ydHM7CiB9CiAKLSNkZWZpbmUgQ0hJUF9TSyAJMHgwMQkvKiBTZXJpYWwgRGF0YSBDbG9jayAgaW4gRXByb20gKi8KLSNkZWZpbmUgQ0hJUF9ETyAJMHgwMgkvKiBTZXJpYWwgRGF0YSBPdXRwdXQgaW4gRXByb20gKi8KLSNkZWZpbmUgQ0hJUF9DUyAJMHgwNAkvKiBTZXJpYWwgQ2hpcCBTZWxlY3QgaW4gRXByb20gKi8KLSNkZWZpbmUgQ0hJUF9ESSAJMHgwOAkvKiBTZXJpYWwgRGF0YSBJbnB1dCAgaW4gRXByb20gKi8KLSNkZWZpbmUgRU5fQ0NNRCAJMHgwMDAJLyogQ2hpcCdzIGNvbW1hbmQgcmVnaXN0ZXIgICAgICovCi0jZGVmaW5lIEVOMF9SU0FSTE8JMHgwMDgJLyogUmVtb3RlIHN0YXJ0IGFkZHJlc3MgcmVnIDAgICovCi0jZGVmaW5lIEVOMF9SU0FSSEkJMHgwMDkJLyogUmVtb3RlIHN0YXJ0IGFkZHJlc3MgcmVnIDEgICovCi0jZGVmaW5lIEVOMF9SQ05UTE8JMHgwMEEJLyogUmVtb3RlIGJ5dGUgY291bnQgcmVnIFdSICAgICovCi0jZGVmaW5lIEVOMF9SQ05USEkJMHgwMEIJLyogUmVtb3RlIGJ5dGUgY291bnQgcmVnIFdSICAgICovCi0jZGVmaW5lIEVOMF9EQ0ZHCTB4MDBFCS8qIERhdGEgY29uZmlndXJhdGlvbiByZWcgV1IgICAqLwotI2RlZmluZSBFTjBfUE9SVAkweDAxMAkvKiBSY3YgbWlzc2VkIGZyYW1lIGVycm9yIGNvdW50ZXIgUkQgKi8KLSNkZWZpbmUgRU5DX1BBR0UwCTB4MDAwCS8qIFNlbGVjdCBwYWdlIDAgb2YgY2hpcCByZWdpc3RlcnMgICAqLwotI2RlZmluZSBFTkNfUEFHRTMJMHgwQzAJLyogU2VsZWN0IHBhZ2UgMyBvZiBjaGlwIHJlZ2lzdGVycyAgICovCi1zdGF0aWMgaW50IG14c2VyX3JlYWRfcmVnaXN0ZXIoaW50IHBvcnQsIHVuc2lnbmVkIHNob3J0ICpyZWdzKQorc3RhdGljIGludCBfX2RldmluaXQgbXhzZXJfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7Ci0JaW50IGksIGssIHZhbHVlLCBpZDsKLQl1bnNpZ25lZCBpbnQgajsKKyNpZmRlZiBDT05GSUdfUENJCisJc3RydWN0IG14c2VyX2JvYXJkICpicmQ7CisJdW5zaWduZWQgaW50IGksIGo7CisJdW5zaWduZWQgbG9uZyBpb2FkZHJlc3M7CisJaW50IHJldHZhbCA9IC1FSU5WQUw7CiAKLQlpZCA9IG14c2VyX3Byb2dyYW1fbW9kZShwb3J0KTsKLQlpZiAoaWQgPCAwKQotCQlyZXR1cm4gaWQ7Ci0JZm9yIChpID0gMDsgaSA8IDE0OyBpKyspIHsKLQkJayA9IChpICYgMHgzRikgfCAweDE4MDsKLQkJZm9yIChqID0gMHgxMDA7IGogPiAwOyBqID4+PSAxKSB7Ci0JCQlvdXRiKENISVBfQ1MsIHBvcnQpOwotCQkJaWYgKGsgJiBqKSB7Ci0JCQkJb3V0YihDSElQX0NTIHwgQ0hJUF9ETywgcG9ydCk7Ci0JCQkJb3V0YihDSElQX0NTIHwgQ0hJUF9ETyB8IENISVBfU0ssIHBvcnQpOwkvKiBBPyBiaXQgb2YgcmVhZCAqLwotCQkJfSBlbHNlIHsKLQkJCQlvdXRiKENISVBfQ1MsIHBvcnQpOwotCQkJCW91dGIoQ0hJUF9DUyB8IENISVBfU0ssIHBvcnQpOwkvKiBBPyBiaXQgb2YgcmVhZCAqLworCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9CT0FSRFM7IGkrKykKKwkJaWYgKG14c2VyX2JvYXJkc1tpXS5pbmZvID09IE5VTEwpCisJCQlicmVhazsKKworCWlmIChpID49IE1YU0VSX0JPQVJEUykgeworCQlwcmludGsoS0VSTl9FUlIgIlRvbyBtYW55IFNtYXJ0aW8vSW5kdXN0aW8gZmFtaWx5IGJvYXJkcyBmb3VuZCAiCisJCQkiKG1heGltdW0gJWQpLCBib2FyZCBub3QgY29uZmlndXJlZFxuIiwgTVhTRVJfQk9BUkRTKTsKKwkJZ290byBlcnI7CisJfQorCisJYnJkID0gJm14c2VyX2JvYXJkc1tpXTsKKwlicmQtPmlkeCA9IGkgKiBNWFNFUl9QT1JUU19QRVJfQk9BUkQ7CisJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgTU9YQSAlcyBib2FyZCAoQnVzTm89JWQsIERldk5vPSVkKVxuIiwKKwkJbXhzZXJfY2FyZHNbZW50LT5kcml2ZXJfZGF0YV0ubmFtZSwKKwkJcGRldi0+YnVzLT5udW1iZXIsIFBDSV9TTE9UKHBkZXYtPmRldmZuKSk7CisKKwlyZXR2YWwgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTW94YSBTbWFydEkvTyBQQ0kgZW5hYmxlIGZhaWwgIVxuIik7CisJCWdvdG8gZXJyOworCX0KKworCS8qIGlvIGFkZHJlc3MgKi8KKwlpb2FkZHJlc3MgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMik7CisJcmV0dmFsID0gcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIDIsICJteHNlcihJTykiKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycjsKKworCWJyZC0+aW5mbyA9ICZteHNlcl9jYXJkc1tlbnQtPmRyaXZlcl9kYXRhXTsKKwlmb3IgKGkgPSAwOyBpIDwgYnJkLT5pbmZvLT5ucG9ydHM7IGkrKykKKwkJYnJkLT5wb3J0c1tpXS5pb2FkZHIgPSBpb2FkZHJlc3MgKyA4ICogaTsKKworCS8qIHZlY3RvciAqLworCWlvYWRkcmVzcyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKTsKKwlyZXR2YWwgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgMywgIm14c2VyKHZlY3RvcikiKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycl9yZWxpbzsKKwlicmQtPnZlY3RvciA9IGlvYWRkcmVzczsKKworCS8qIGlycSAqLworCWJyZC0+aXJxID0gcGRldi0+aXJxOworCisJYnJkLT5jaGlwX2ZsYWcgPSBDaGVja0lzTW94YU11c3QoYnJkLT5wb3J0c1swXS5pb2FkZHIpOworCWJyZC0+dWFydF90eXBlID0gUE9SVF8xNjU1MEE7CisJYnJkLT52ZWN0b3JfbWFzayA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnJkLT5pbmZvLT5ucG9ydHM7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgVUFSVF9JTkZPX05VTTsgaisrKSB7CisJCQlpZiAoR3BjaV91YXJ0X2luZm9bal0udHlwZSA9PSBicmQtPmNoaXBfZmxhZykgeworCQkJCWJyZC0+cG9ydHNbaV0ubWF4X2JhdWQgPQorCQkJCQlHcGNpX3VhcnRfaW5mb1tqXS5tYXhfYmF1ZDsKKworCQkJCS8qIGV4Y2VwdGlvbi4uLi5DUC0xMDIgKi8KKwkJCQlpZiAoYnJkLT5pbmZvLT5mbGFncyAmIE1YU0VSX0hJR0hCQVVEKQorCQkJCQlicmQtPnBvcnRzW2ldLm1heF9iYXVkID0gOTIxNjAwOworCQkJCWJyZWFrOwogCQkJfQogCQl9Ci0JCSh2b2lkKWluYihwb3J0KTsKLQkJdmFsdWUgPSAwOwotCQlmb3IgKGsgPSAwLCBqID0gMHg4MDAwOyBrIDwgMTY7IGsrKywgaiA+Pj0gMSkgewotCQkJb3V0YihDSElQX0NTLCBwb3J0KTsKLQkJCW91dGIoQ0hJUF9DUyB8IENISVBfU0ssIHBvcnQpOwotCQkJaWYgKGluYihwb3J0KSAmIENISVBfREkpCi0JCQkJdmFsdWUgfD0gajsKKwl9CisKKwlpZiAoYnJkLT5jaGlwX2ZsYWcgPT0gTU9YQV9NVVNUX01VODYwX0hXSUQpIHsKKwkJZm9yIChpID0gMDsgaSA8IGJyZC0+aW5mby0+bnBvcnRzOyBpKyspIHsKKwkJCWlmIChpIDwgNCkKKwkJCQlicmQtPnBvcnRzW2ldLm9wbW9kZV9pb2FkZHIgPSBpb2FkZHJlc3MgKyA0OworCQkJZWxzZQorCQkJCWJyZC0+cG9ydHNbaV0ub3Btb2RlX2lvYWRkciA9IGlvYWRkcmVzcyArIDB4MGM7CiAJCX0KLQkJcmVnc1tpXSA9IHZhbHVlOwotCQlvdXRiKDAsIHBvcnQpOworCQlvdXRiKDAsIGlvYWRkcmVzcyArIDQpOwkvKiBkZWZhdWx0IHNldCB0byBSUzIzMiBtb2RlICovCisJCW91dGIoMCwgaW9hZGRyZXNzICsgMHgwYyk7CS8qIGRlZmF1bHQgc2V0IHRvIFJTMjMyIG1vZGUgKi8KIAl9Ci0JbXhzZXJfbm9ybWFsX21vZGUocG9ydCk7Ci0JcmV0dXJuIGlkOworCisJZm9yIChpID0gMDsgaSA8IGJyZC0+aW5mby0+bnBvcnRzOyBpKyspIHsKKwkJYnJkLT52ZWN0b3JfbWFzayB8PSAoMSA8PCBpKTsKKwkJYnJkLT5wb3J0c1tpXS5iYXVkX2Jhc2UgPSA5MjE2MDA7CisJfQorCisJLyogbXhzZXJfaW5pdGJyZCB3aWxsIGhvb2sgSVNSLiAqLworCXJldHZhbCA9IG14c2VyX2luaXRicmQoYnJkLCBwZGV2KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycl9udWxsOworCisJZm9yIChpID0gMDsgaSA8IGJyZC0+aW5mby0+bnBvcnRzOyBpKyspCisJCXR0eV9yZWdpc3Rlcl9kZXZpY2UobXh2YXJfc2RyaXZlciwgYnJkLT5pZHggKyBpLCAmcGRldi0+ZGV2KTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBicmQpOworCisJcmV0dXJuIDA7CitlcnJfcmVsaW86CisJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDIpOworZXJyX251bGw6CisJYnJkLT5pbmZvID0gTlVMTDsKK2VycjoKKwlyZXR1cm4gcmV0dmFsOworI2Vsc2UKKwlyZXR1cm4gLUVOT0RFVjsKKyNlbmRpZgogfQogCi1zdGF0aWMgaW50IG14c2VyX3Byb2dyYW1fbW9kZShpbnQgcG9ydCkKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBteHNlcl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0JaW50IGlkLCBpLCBqLCBuOwotCS8qIHVuc2lnbmVkIGxvbmcgZmxhZ3M7ICovCisJc3RydWN0IG14c2VyX2JvYXJkICpicmQgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgaW50IGk7CiAKLQlzcGluX2xvY2soJmdtX2xvY2spOwotCW91dGIoMCwgcG9ydCk7Ci0Jb3V0YigwLCBwb3J0KTsKLQlvdXRiKDAsIHBvcnQpOwotCSh2b2lkKWluYihwb3J0KTsKLQkodm9pZClpbmIocG9ydCk7Ci0Jb3V0YigwLCBwb3J0KTsKLQkodm9pZClpbmIocG9ydCk7Ci0JLyogcmVzdG9yZV9mbGFncyhmbGFncyk7ICovCi0Jc3Bpbl91bmxvY2soJmdtX2xvY2spOworCWZvciAoaSA9IDA7IGkgPCBicmQtPmluZm8tPm5wb3J0czsgaSsrKQorCQl0dHlfdW5yZWdpc3Rlcl9kZXZpY2UobXh2YXJfc2RyaXZlciwgYnJkLT5pZHggKyBpKTsKIAotCWlkID0gaW5iKHBvcnQgKyAxKSAmIDB4MUY7Ci0JaWYgKChpZCAhPSBDMTY4X0FTSUNfSUQpICYmCi0JCQkoaWQgIT0gQzEwNF9BU0lDX0lEKSAmJgotCQkJKGlkICE9IEMxMDJfQVNJQ19JRCkgJiYKLQkJCShpZCAhPSBDSTEzMl9BU0lDX0lEKSAmJgotCQkJKGlkICE9IENJMTM0X0FTSUNfSUQpICYmCi0JCQkoaWQgIT0gQ0kxMDRKX0FTSUNfSUQpKQotCQlyZXR1cm4gLTE7Ci0JZm9yIChpID0gMCwgaiA9IDA7IGkgPCA0OyBpKyspIHsKLQkJbiA9IGluYihwb3J0ICsgMik7Ci0JCWlmIChuID09ICdNJykgewotCQkJaiA9IDE7Ci0JCX0gZWxzZSBpZiAoKGogPT0gMSkgJiYgKG4gPT0gMSkpIHsKLQkJCWogPSAyOwotCQkJYnJlYWs7Ci0JCX0gZWxzZQotCQkJaiA9IDA7Ci0JfQotCWlmIChqICE9IDIpCi0JCWlkID0gLTI7Ci0JcmV0dXJuIGlkOworCW14c2VyX3JlbGVhc2VfcmVzKGJyZCwgcGRldiwgMSk7CisJYnJkLT5pbmZvID0gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgbXhzZXJfbm9ybWFsX21vZGUoaW50IHBvcnQpCi17Ci0JaW50IGksIG47CitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbXhzZXJfZHJpdmVyID0geworCS5uYW1lID0gIm14c2VyIiwKKwkuaWRfdGFibGUgPSBteHNlcl9wY2licmRzLAorCS5wcm9iZSA9IG14c2VyX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChteHNlcl9yZW1vdmUpCit9OwogCi0Jb3V0YigweEE1LCBwb3J0ICsgMSk7Ci0Jb3V0YigweDgwLCBwb3J0ICsgMyk7Ci0Jb3V0YigxMiwgcG9ydCArIDApOwkvKiA5NjAwIGJwcyAqLwotCW91dGIoMCwgcG9ydCArIDEpOwotCW91dGIoMHgwMywgcG9ydCArIDMpOwkvKiA4IGRhdGEgYml0cyAqLwotCW91dGIoMHgxMywgcG9ydCArIDQpOwkvKiBsb29wIGJhY2sgbW9kZSAqLwotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCW4gPSBpbmIocG9ydCArIDUpOwotCQlpZiAoKG4gJiAweDYxKSA9PSAweDYwKQotCQkJYnJlYWs7Ci0JCWlmICgobiAmIDEpID09IDEpCi0JCQkodm9pZClpbmIocG9ydCk7CitzdGF0aWMgaW50IF9faW5pdCBteHNlcl9tb2R1bGVfaW5pdCh2b2lkKQoreworCXN0cnVjdCBteHNlcl9ib2FyZCAqYnJkOworCXVuc2lnbmVkIGxvbmcgY2FwOworCXVuc2lnbmVkIGludCBpLCBtLCBpc2Fsb29wOworCWludCByZXR2YWwsIGI7CisKKwlwcl9kZWJ1ZygiTG9hZGluZyBtb2R1bGUgbXhzZXIgLi4uXG4iKTsKKworCW14dmFyX3Nkcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKE1YU0VSX1BPUlRTICsgMSk7CisJaWYgKCFteHZhcl9zZHJpdmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByaW50ayhLRVJOX0lORk8gIk1PWEEgU21hcnRpby9JbmR1c3RpbyBmYW1pbHkgZHJpdmVyIHZlcnNpb24gJXNcbiIsCisJCU1YU0VSX1ZFUlNJT04pOworCisJLyogSW5pdGlhbGl6ZSB0aGUgdHR5X2RyaXZlciBzdHJ1Y3R1cmUgKi8KKwlteHZhcl9zZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCW14dmFyX3Nkcml2ZXItPm1hZ2ljID0gVFRZX0RSSVZFUl9NQUdJQzsKKwlteHZhcl9zZHJpdmVyLT5uYW1lID0gInR0eU1JIjsKKwlteHZhcl9zZHJpdmVyLT5tYWpvciA9IHR0eW1ham9yOworCW14dmFyX3Nkcml2ZXItPm1pbm9yX3N0YXJ0ID0gMDsKKwlteHZhcl9zZHJpdmVyLT5udW0gPSBNWFNFUl9QT1JUUyArIDE7CisJbXh2YXJfc2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJbXh2YXJfc2RyaXZlci0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwlteHZhcl9zZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJbXh2YXJfc2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPSBCOTYwMHxDUzh8Q1JFQUR8SFVQQ0x8Q0xPQ0FMOworCW14dmFyX3Nkcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBV3xUVFlfRFJJVkVSX0RZTkFNSUNfREVWOworCXR0eV9zZXRfb3BlcmF0aW9ucyhteHZhcl9zZHJpdmVyLCAmbXhzZXJfb3BzKTsKKworCXJldHZhbCA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIobXh2YXJfc2RyaXZlcik7CisJaWYgKHJldHZhbCkgeworCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IGluc3RhbGwgTU9YQSBTbWFydGlvL0luZHVzdGlvIGZhbWlseSAiCisJCQkJInR0eSBkcml2ZXIgIVxuIik7CisJCWdvdG8gZXJyX3B1dDsKIAl9Ci0Jb3V0YigweDAwLCBwb3J0ICsgNCk7CisKKwlteHZhcl9kaWFnZmxhZyA9IDA7CisKKwltID0gMDsKKwkvKiBTdGFydCBmaW5kaW5nIElTQSBib2FyZHMgaGVyZSAqLworCWZvciAoaXNhbG9vcCA9IDA7IGlzYWxvb3AgPCAyOyBpc2Fsb29wKyspCisJCWZvciAoYiA9IDA7IGIgPCBNWFNFUl9CT0FSRFMgJiYgbSA8IE1YU0VSX0JPQVJEUzsgYisrKSB7CisJCQlpZiAoIWlzYWxvb3ApCisJCQkJY2FwID0gbXhzZXJCb2FyZENBUFtiXTsgLyogcHJlZGVmaW5lZCAqLworCQkJZWxzZQorCQkJCWNhcCA9IGlvYWRkcltiXTsgLyogbW9kdWxlIHBhcmFtICovCisKKwkJCWlmICghY2FwKQorCQkJCWNvbnRpbnVlOworCisJCQlicmQgPSAmbXhzZXJfYm9hcmRzW21dOworCQkJcmV0dmFsID0gbXhzZXJfZ2V0X0lTQV9jb25mKGNhcCwgYnJkKTsKKworCQkJaWYgKHJldHZhbCAhPSAwKQorCQkJCXByaW50ayhLRVJOX0lORk8gIkZvdW5kIE1PWEEgJXMgYm9hcmQgIgorCQkJCQkiKENBUD0weCV4KVxuIiwKKwkJCQkJYnJkLT5pbmZvLT5uYW1lLCBpb2FkZHJbYl0pOworCisJCQlpZiAocmV0dmFsIDw9IDApIHsKKwkJCQlpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JUlEpCisJCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBpbnRlcnJ1cHQgIgorCQkJCQkJIm51bWJlciwgYm9hcmQgbm90ICIKKwkJCQkJCSJjb25maWd1cmVkXG4iKTsKKwkJCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX0lSUV9DT05GTElUKQorCQkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0ICIKKwkJCQkJCSJudW1iZXIsIGJvYXJkIG5vdCAiCisJCQkJCQkiY29uZmlndXJlZFxuIik7CisJCQkJZWxzZSBpZiAocmV0dmFsID09IE1YU0VSX0VSUl9WRUNUT1IpCisJCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBpbnRlcnJ1cHQgIgorCQkJCQkJInZlY3RvciwgYm9hcmQgbm90ICIKKwkJCQkJCSJjb25maWd1cmVkXG4iKTsKKwkJCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX0lPQUREUikKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIEkvTyBhZGRyZXNzLCAiCisJCQkJCQkiYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIpOworCisJCQkJYnJkLT5pbmZvID0gTlVMTDsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogbXhzZXJfaW5pdGJyZCB3aWxsIGhvb2sgSVNSLiAqLworCQkJaWYgKG14c2VyX2luaXRicmQoYnJkLCBOVUxMKSA8IDApIHsKKwkJCQlicmQtPmluZm8gPSBOVUxMOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlicmQtPmlkeCA9IG0gKiBNWFNFUl9QT1JUU19QRVJfQk9BUkQ7CisJCQlmb3IgKGkgPSAwOyBpIDwgYnJkLT5pbmZvLT5ucG9ydHM7IGkrKykKKwkJCQl0dHlfcmVnaXN0ZXJfZGV2aWNlKG14dmFyX3Nkcml2ZXIsIGJyZC0+aWR4ICsgaSwKKwkJCQkJCU5VTEwpOworCisJCQltKys7CisJCX0KKworCXJldHZhbCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJm14c2VyX2RyaXZlcik7CisJaWYgKHJldHZhbCkgeworCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IHJlZ2lzdGVyIHBjaSBkcml2ZXJcbiIpOworCQlpZiAoIW0pIHsKKwkJCXJldHZhbCA9IC1FTk9ERVY7CisJCQlnb3RvIGVycl91bnI7CisJCX0gLyogZWxzZTogd2UgaGF2ZSBzb21lIElTQSBjYXJkcyB1bmRlciBjb250cm9sICovCisJfQorCisJcHJfZGVidWcoIkRvbmUuXG4iKTsKKworCXJldHVybiAwOworZXJyX3VucjoKKwl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIobXh2YXJfc2RyaXZlcik7CitlcnJfcHV0OgorCXB1dF90dHlfZHJpdmVyKG14dmFyX3Nkcml2ZXIpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBteHNlcl9tb2R1bGVfZXhpdCh2b2lkKQoreworCXVuc2lnbmVkIGludCBpLCBqOworCisJcHJfZGVidWcoIlVubG9hZGluZyBtb2R1bGUgbXhzZXIgLi4uXG4iKTsKKworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmbXhzZXJfZHJpdmVyKTsKKworCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9CT0FSRFM7IGkrKykgLyogSVNBIHJlbWFpbnMgKi8KKwkJaWYgKG14c2VyX2JvYXJkc1tpXS5pbmZvICE9IE5VTEwpCisJCQlmb3IgKGogPSAwOyBqIDwgbXhzZXJfYm9hcmRzW2ldLmluZm8tPm5wb3J0czsgaisrKQorCQkJCXR0eV91bnJlZ2lzdGVyX2RldmljZShteHZhcl9zZHJpdmVyLAorCQkJCQkJbXhzZXJfYm9hcmRzW2ldLmlkeCArIGopOworCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihteHZhcl9zZHJpdmVyKTsKKwlwdXRfdHR5X2RyaXZlcihteHZhcl9zZHJpdmVyKTsKKworCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9CT0FSRFM7IGkrKykKKwkJaWYgKG14c2VyX2JvYXJkc1tpXS5pbmZvICE9IE5VTEwpCisJCQlteHNlcl9yZWxlYXNlX3JlcygmbXhzZXJfYm9hcmRzW2ldLCBOVUxMLCAxKTsKKworCXByX2RlYnVnKCJEb25lLlxuIik7CiB9CiAKIG1vZHVsZV9pbml0KG14c2VyX21vZHVsZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9teHNlci5oIGIvZHJpdmVycy9jaGFyL214c2VyLmgKaW5kZXggMWY0YWE0NS4uODQ0MTcxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL214c2VyLmgKKysrIGIvZHJpdmVycy9jaGFyL214c2VyLmgKQEAgLTQsMTkgKzQsMTcgQEAKIC8qCiAgKglTZW1pLXB1YmxpYyBjb250cm9sIGludGVyZmFjZXMKICAqLwotIAorCiAvKgogICoJTU9YQSBpb2N0bHMKICAqLwogCiAjZGVmaW5lIE1PWEEJCQkweDQwMAogI2RlZmluZSBNT1hBX0dFVERBVEFDT1VOVAkoTU9YQSArIDIzKQotI2RlZmluZQlNT1hBX0dFVF9DT05GCQkoTU9YQSArIDM1KQogI2RlZmluZSBNT1hBX0RJQUdOT1NFCQkoTU9YQSArIDUwKQogI2RlZmluZSBNT1hBX0NIS1BPUlRFTkFCTEUJKE1PWEEgKyA2MCkKICNkZWZpbmUgTU9YQV9IaWdoU3BlZWRPbgkoTU9YQSArIDYxKQogI2RlZmluZSBNT1hBX0dFVF9NQUpPUgkJKE1PWEEgKyA2MykKLSNkZWZpbmUgTU9YQV9HRVRfQ1VNQUpPUgkoTU9YQSArIDY0KQogI2RlZmluZSBNT1hBX0dFVE1TVEFUVVMJCShNT1hBICsgNjUpCiAjZGVmaW5lIE1PWEFfU0VUX09QX01PREUJKE1PWEEgKyA2NikKICNkZWZpbmUgTU9YQV9HRVRfT1BfTU9ERQkoTU9YQSArIDY3KQpAQCAtMjYsMjYgKzI0LDE0IEBACiAjZGVmaW5lIFJTNDIyX01PREUJCTIKICNkZWZpbmUgUlM0ODVfNFdJUkVfTU9ERQkzCiAjZGVmaW5lIE9QX01PREVfTUFTSwkJMwotLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDEtMDUtMjAwNAogCi0jZGVmaW5lIFRUWV9USFJFU0hPTERfVEhST1RUTEUgIDEyOAotCi0jZGVmaW5lIEhJX1dBVEVSCQk3NjgKLQotLy8gYWRkZWQgYnkgSmFtZXMuIDAzLTExLTIwMDQuCi0jZGVmaW5lIE1PWEFfU0RTX0dFVElDT1VOVEVSICAJKE1PWEEgKyA2OCkKLSNkZWZpbmUgTU9YQV9TRFNfUlNUSUNPVU5URVIgIAkoTU9YQSArIDY5KQotLy8gKGFib3ZlKSBhZGRlZCBieSBKYW1lcy4KLQorI2RlZmluZSBNT1hBX1NEU19SU1RJQ09VTlRFUgkoTU9YQSArIDY5KQogI2RlZmluZSBNT1hBX0FTUFBfT1FVRVVFICAJKE1PWEEgKyA3MCkKLSNkZWZpbmUgTU9YQV9BU1BQX1NFVEJBVUQgCShNT1hBICsgNzEpCi0jZGVmaW5lIE1PWEFfQVNQUF9HRVRCQVVEIAkoTU9YQSArIDcyKQogI2RlZmluZSBNT1hBX0FTUFBfTU9OICAgICAJKE1PWEEgKyA3MykKICNkZWZpbmUgTU9YQV9BU1BQX0xTVEFUVVMgCShNT1hBICsgNzQpCiAjZGVmaW5lIE1PWEFfQVNQUF9NT05fRVhUIAkoTU9YQSArIDc1KQogI2RlZmluZSBNT1hBX1NFVF9CQVVEX01FVEhPRAkoTU9YQSArIDc2KQogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAjZGVmaW5lIE5QUElfTk9USUZZX1BBUklUWQkweDAxCkBAIC01NCw1MSArNDAsNDYgQEAKICNkZWZpbmUgTlBQSV9OT1RJRllfU1dfT1ZFUlJVTgkweDA4CiAjZGVmaW5lIE5QUElfTk9USUZZX0JSRUFLCTB4MTAKIAotI2RlZmluZSBOUFBJX05PVElGWV9DVFNIT0xEICAgICAgICAgMHgwMQkvLyBUeCBob2xkIGJ5IENUUyBsb3cKLSNkZWZpbmUgTlBQSV9OT1RJRllfRFNSSE9MRCAgICAgICAgIDB4MDIJLy8gVHggaG9sZCBieSBEU1IgbG93Ci0jZGVmaW5lIE5QUElfTk9USUZZX1hPRkZIT0xEICAgICAgICAweDA4CS8vIFR4IGhvbGQgYnkgWG9mZiByZWNlaXZlZAotI2RlZmluZSBOUFBJX05PVElGWV9YT0ZGWEVOVCAgICAgICAgMHgxMAkvLyBYb2ZmIFNlbnQKKyNkZWZpbmUgTlBQSV9OT1RJRllfQ1RTSE9MRCAgICAgICAgIDB4MDEJLyogVHggaG9sZCBieSBDVFMgbG93ICovCisjZGVmaW5lIE5QUElfTk9USUZZX0RTUkhPTEQgICAgICAgICAweDAyCS8qIFR4IGhvbGQgYnkgRFNSIGxvdyAqLworI2RlZmluZSBOUFBJX05PVElGWV9YT0ZGSE9MRCAgICAgICAgMHgwOAkvKiBUeCBob2xkIGJ5IFhvZmYgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgTlBQSV9OT1RJRllfWE9GRlhFTlQgICAgICAgIDB4MTAJLyogWG9mZiBTZW50ICovCiAKLS8vQ2hlY2tJc01veGFNdXN0IHJldHVybiB2YWx1ZQotI2RlZmluZSBNT1hBX09USEVSX1VBUlQJCQkweDAwCi0jZGVmaW5lIE1PWEFfTVVTVF9NVTE1MF9IV0lECQkweDAxCi0jZGVmaW5lIE1PWEFfTVVTVF9NVTg2MF9IV0lECQkweDAyCi0KLS8vIGZvbGxvdyBqdXN0IGZvciBNb3hhIE11c3QgY2hpcCBkZWZpbmUuCi0vLwotLy8gd2hlbiBMQ1IgcmVnaXN0ZXIgKG9mZnNldCAweDAzKSB3cml0ZSBmb2xsb3dpbmcgdmFsdWUsCi0vLyB0aGUgTXVzdCBjaGlwIHdpbGwgZW50ZXIgZW5jaGFuY2UgbW9kZS4gQW5kIHdyaXRlIHZhbHVlCi0vLyBvbiBFRlIgKG9mZnNldCAweDAyKSBiaXQgNiw3IHRvIGNoYW5nZSBiYW5rLgorLyogZm9sbG93IGp1c3QgZm9yIE1veGEgTXVzdCBjaGlwIGRlZmluZS4gKi8KKy8qICovCisvKiB3aGVuIExDUiByZWdpc3RlciAob2Zmc2V0IDB4MDMpIHdyaXRlIGZvbGxvd2luZyB2YWx1ZSwgKi8KKy8qIHRoZSBNdXN0IGNoaXAgd2lsbCBlbnRlciBlbmNoYW5jZSBtb2RlLiBBbmQgd3JpdGUgdmFsdWUgKi8KKy8qIG9uIEVGUiAob2Zmc2V0IDB4MDIpIGJpdCA2LDcgdG8gY2hhbmdlIGJhbmsuICovCiAjZGVmaW5lIE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRQkweEJGCiAKLS8vIHdoZW4gZW5oYW5jZSBtb2RlIGVuYWJsZSwgYWNjZXNzIG9uIGdlbmVyYWwgYmFuayByZWdpc3RlcgorLyogd2hlbiBlbmhhbmNlIG1vZGUgZW5hYmxlLCBhY2Nlc3Mgb24gZ2VuZXJhbCBiYW5rIHJlZ2lzdGVyICovCiAjZGVmaW5lIE1PWEFfTVVTVF9HRExfUkVHSVNURVIJCTB4MDcKICNkZWZpbmUgTU9YQV9NVVNUX0dETF9NQVNLCQkweDdGCiAjZGVmaW5lIE1PWEFfTVVTVF9HRExfSEFTX0JBRF9EQVRBCTB4ODAKIAotI2RlZmluZSBNT1hBX01VU1RfTFNSX1JFUlIJCTB4ODAJLy8gZXJyb3IgaW4gcmVjZWl2ZSBGSUZPCi0vLyBlbmNoYW5jZSByZWdpc3RlciBiYW5rIHNlbGVjdCBhbmQgZW5jaGFuY2UgbW9kZSBzZXR0aW5nIHJlZ2lzdGVyCi0vLyB3aGVuIExDUiByZWdpc3RlciBlcXVhbCB0byAweEJGCisjZGVmaW5lIE1PWEFfTVVTVF9MU1JfUkVSUgkJMHg4MAkvKiBlcnJvciBpbiByZWNlaXZlIEZJRk8gKi8KKy8qIGVuY2hhbmNlIHJlZ2lzdGVyIGJhbmsgc2VsZWN0IGFuZCBlbmNoYW5jZSBtb2RlIHNldHRpbmcgcmVnaXN0ZXIgKi8KKy8qIHdoZW4gTENSIHJlZ2lzdGVyIGVxdWFsIHRvIDB4QkYgKi8KICNkZWZpbmUgTU9YQV9NVVNUX0VGUl9SRUdJU1RFUgkJMHgwMgotLy8gZW5jaGFuY2UgbW9kZSBlbmFibGUKKy8qIGVuY2hhbmNlIG1vZGUgZW5hYmxlICovCiAjZGVmaW5lIE1PWEFfTVVTVF9FRlJfRUZSQl9FTkFCTEUJMHgxMAotLy8gZW5jaGFuY2UgcmVpc3RlciBiYW5rIHNldCAwLCAxLCAyCisvKiBlbmNoYW5jZSByZWlzdGVyIGJhbmsgc2V0IDAsIDEsIDIgKi8KICNkZWZpbmUgTU9YQV9NVVNUX0VGUl9CQU5LMAkJMHgwMAogI2RlZmluZSBNT1hBX01VU1RfRUZSX0JBTksxCQkweDQwCiAjZGVmaW5lIE1PWEFfTVVTVF9FRlJfQkFOSzIJCTB4ODAKICNkZWZpbmUgTU9YQV9NVVNUX0VGUl9CQU5LMwkJMHhDMAogI2RlZmluZSBNT1hBX01VU1RfRUZSX0JBTktfTUFTSwkJMHhDMAogCi0vLyBzZXQgWE9OMSB2YWx1ZSByZWdpc3Rlciwgd2hlbiBMQ1I9MHhCRiBhbmQgY2hhbmdlIHRvIGJhbmswCisvKiBzZXQgWE9OMSB2YWx1ZSByZWdpc3Rlciwgd2hlbiBMQ1I9MHhCRiBhbmQgY2hhbmdlIHRvIGJhbmswICovCiAjZGVmaW5lIE1PWEFfTVVTVF9YT04xX1JFR0lTVEVSCQkweDA0CiAKLS8vIHNldCBYT04yIHZhbHVlIHJlZ2lzdGVyLCB3aGVuIExDUj0weEJGIGFuZCBjaGFuZ2UgdG8gYmFuazAKKy8qIHNldCBYT04yIHZhbHVlIHJlZ2lzdGVyLCB3aGVuIExDUj0weEJGIGFuZCBjaGFuZ2UgdG8gYmFuazAgKi8KICNkZWZpbmUgTU9YQV9NVVNUX1hPTjJfUkVHSVNURVIJCTB4MDUKIAotLy8gc2V0IFhPRkYxIHZhbHVlIHJlZ2lzdGVyLCB3aGVuIExDUj0weEJGIGFuZCBjaGFuZ2UgdG8gYmFuazAKKy8qIHNldCBYT0ZGMSB2YWx1ZSByZWdpc3Rlciwgd2hlbiBMQ1I9MHhCRiBhbmQgY2hhbmdlIHRvIGJhbmswICovCiAjZGVmaW5lIE1PWEFfTVVTVF9YT0ZGMV9SRUdJU1RFUgkweDA2CiAKLS8vIHNldCBYT0ZGMiB2YWx1ZSByZWdpc3Rlciwgd2hlbiBMQ1I9MHhCRiBhbmQgY2hhbmdlIHRvIGJhbmswCisvKiBzZXQgWE9GRjIgdmFsdWUgcmVnaXN0ZXIsIHdoZW4gTENSPTB4QkYgYW5kIGNoYW5nZSB0byBiYW5rMCAqLwogI2RlZmluZSBNT1hBX01VU1RfWE9GRjJfUkVHSVNURVIJMHgwNwogCiAjZGVmaW5lIE1PWEFfTVVTVF9SQlJUTF9SRUdJU1RFUgkweDA0CkBAIC0xMTAsMzIgKzkxLDMyIEBACiAjZGVmaW5lIE1PWEFfTVVTVF9FQ1JfUkVHSVNURVIJCTB4MDYKICNkZWZpbmUgTU9YQV9NVVNUX0NTUl9SRUdJU1RFUgkJMHgwNwogCi0vLyBnb29kIGRhdGEgbW9kZSBlbmFibGUKKy8qIGdvb2QgZGF0YSBtb2RlIGVuYWJsZSAqLwogI2RlZmluZSBNT1hBX01VU1RfRkNSX0dEQV9NT0RFX0VOQUJMRQkweDIwCi0vLyBvbmx5IGdvb2QgZGF0YSBwdXQgaW50byBSeEZJRk8KKy8qIG9ubHkgZ29vZCBkYXRhIHB1dCBpbnRvIFJ4RklGTyAqLwogI2RlZmluZSBNT1hBX01VU1RfRkNSX0dEQV9PTkxZX0VOQUJMRQkweDEwCiAKLS8vIGVuYWJsZSBDVFMgaW50ZXJydXB0CisvKiBlbmFibGUgQ1RTIGludGVycnVwdCAqLwogI2RlZmluZSBNT1hBX01VU1RfSUVSX0VDVFNJCQkweDgwCi0vLyBlbmFibGUgUlRTIGludGVycnVwdAorLyogZW5hYmxlIFJUUyBpbnRlcnJ1cHQgKi8KICNkZWZpbmUgTU9YQV9NVVNUX0lFUl9FUlRTSQkJMHg0MAotLy8gZW5hYmxlIFhvbi9Yb2ZmIGludGVycnVwdAorLyogZW5hYmxlIFhvbi9Yb2ZmIGludGVycnVwdCAqLwogI2RlZmluZSBNT1hBX01VU1RfSUVSX1hJTlQJCTB4MjAKLS8vIGVuYWJsZSBHREEgaW50ZXJydXB0CisvKiBlbmFibGUgR0RBIGludGVycnVwdCAqLwogI2RlZmluZSBNT1hBX01VU1RfSUVSX0VHREFJCQkweDEwCiAKICNkZWZpbmUgTU9YQV9NVVNUX1JFQ1ZfSVNSCQkoVUFSVF9JRVJfUkRJIHwgTU9YQV9NVVNUX0lFUl9FR0RBSSkKIAotLy8gR0RBIGludGVycnVwdCBwZW5kaW5nCisvKiBHREEgaW50ZXJydXB0IHBlbmRpbmcgKi8KICNkZWZpbmUgTU9YQV9NVVNUX0lJUl9HREEJCTB4MUMKICNkZWZpbmUgTU9YQV9NVVNUX0lJUl9SREEJCTB4MDQKICNkZWZpbmUgTU9YQV9NVVNUX0lJUl9SVE8JCTB4MEMKICNkZWZpbmUgTU9YQV9NVVNUX0lJUl9MU1IJCTB4MDYKIAotLy8gcmVjaWV2ZWQgWG9uL1hvZmYgb3Igc3BlY2ljYWwgaW50ZXJydXB0IHBlbmRpbmcKKy8qIHJlY2lldmVkIFhvbi9Yb2ZmIG9yIHNwZWNpY2FsIGludGVycnVwdCBwZW5kaW5nICovCiAjZGVmaW5lIE1PWEFfTVVTVF9JSVJfWFNDCQkweDEwCiAKLS8vIFJUUy9DVFMgY2hhbmdlIHN0YXRlIGludGVycnVwdCBwZW5kaW5nCisvKiBSVFMvQ1RTIGNoYW5nZSBzdGF0ZSBpbnRlcnJ1cHQgcGVuZGluZyAqLwogI2RlZmluZSBNT1hBX01VU1RfSUlSX1JUU0NUUwkJMHgyMAogI2RlZmluZSBNT1hBX01VU1RfSUlSX01BU0sJCTB4M0UKIApAQCAtMTQzLDI5OSArMTI0LDE2NCBAQAogI2RlZmluZSBNT1hBX01VU1RfTUNSX1hPTl9BTlkJCTB4ODAKICNkZWZpbmUgTU9YQV9NVVNUX01DUl9UWF9YT04JCTB4MDgKIAotCi0vLyBzb2Z0d2FyZSBmbG93IGNvbnRyb2wgb24gY2hpcCBtYXNrIHZhbHVlCisvKiBzb2Z0d2FyZSBmbG93IGNvbnRyb2wgb24gY2hpcCBtYXNrIHZhbHVlICovCiAjZGVmaW5lIE1PWEFfTVVTVF9FRlJfU0ZfTUFTSwkJMHgwRgotLy8gc2VuZCBYb24xL1hvZmYxCisvKiBzZW5kIFhvbjEvWG9mZjEgKi8KICNkZWZpbmUgTU9YQV9NVVNUX0VGUl9TRl9UWDEJCTB4MDgKLS8vIHNlbmQgWG9uMi9Yb2ZmMgorLyogc2VuZCBYb24yL1hvZmYyICovCiAjZGVmaW5lIE1PWEFfTVVTVF9FRlJfU0ZfVFgyCQkweDA0Ci0vLyBzZW5kIFhvbjEsWG9uMi9Yb2ZmMSxYb2ZmMgorLyogc2VuZCBYb24xLFhvbjIvWG9mZjEsWG9mZjIgKi8KICNkZWZpbmUgTU9YQV9NVVNUX0VGUl9TRl9UWDEyCQkweDBDCi0vLyBkb24ndCBzZW5kIFhvbi9Yb2ZmCisvKiBkb24ndCBzZW5kIFhvbi9Yb2ZmICovCiAjZGVmaW5lIE1PWEFfTVVTVF9FRlJfU0ZfVFhfTk8JCTB4MDAKLS8vIFR4IHNvZnR3YXJlIGZsb3cgY29udHJvbCBtYXNrCisvKiBUeCBzb2Z0d2FyZSBmbG93IGNvbnRyb2wgbWFzayAqLwogI2RlZmluZSBNT1hBX01VU1RfRUZSX1NGX1RYX01BU0sJMHgwQwotLy8gZG9uJ3QgcmVjZWl2ZSBYb24vWG9mZgorLyogZG9uJ3QgcmVjZWl2ZSBYb24vWG9mZiAqLwogI2RlZmluZSBNT1hBX01VU1RfRUZSX1NGX1JYX05PCQkweDAwCi0vLyByZWNlaXZlIFhvbjEvWG9mZjEKKy8qIHJlY2VpdmUgWG9uMS9Yb2ZmMSAqLwogI2RlZmluZSBNT1hBX01VU1RfRUZSX1NGX1JYMQkJMHgwMgotLy8gcmVjZWl2ZSBYb24yL1hvZmYyCisvKiByZWNlaXZlIFhvbjIvWG9mZjIgKi8KICNkZWZpbmUgTU9YQV9NVVNUX0VGUl9TRl9SWDIJCTB4MDEKLS8vIHJlY2VpdmUgWG9uMSxYb24yL1hvZmYxLFhvZmYyCisvKiByZWNlaXZlIFhvbjEsWG9uMi9Yb2ZmMSxYb2ZmMiAqLwogI2RlZmluZSBNT1hBX01VU1RfRUZSX1NGX1JYMTIJCTB4MDMKLS8vIFJ4IHNvZnR3YXJlIGZsb3cgY29udHJvbCBtYXNrCisvKiBSeCBzb2Z0d2FyZSBmbG93IGNvbnRyb2wgbWFzayAqLwogI2RlZmluZSBNT1hBX01VU1RfRUZSX1NGX1JYX01BU0sJMHgwMwogCi0vLyNkZWZpbmUgTU9YQV9NVVNUX01JTl9YT0ZGTElNSVQgICAgICAgICAgICAgICA2NgotLy8jZGVmaW5lIE1PWEFfTVVTVF9NSU5fWE9OTElNSVQgICAgICAgICAgICAgICAgMjAKLS8vI2RlZmluZSBJRDFfUlhfVFJJRyAgICAgICAgICAgICAgICAgICAxMjAKLQotCi0jZGVmaW5lIENIRUNLX01PWEFfTVVTVF9YT0ZGTElNSVQoaW5mbykgeyAJXAotCWlmICggKGluZm8pLT5Jc01veGFNdXN0Q2hpcEZsYWcgJiYgCVwKLQkgKGluZm8pLT5IYW5kRmxvdy5Yb2ZmTGltaXQgPCBNT1hBX01VU1RfTUlOX1hPRkZMSU1JVCApIHsJXAotCQkoaW5mbyktPkhhbmRGbG93LlhvZmZMaW1pdCA9IE1PWEFfTVVTVF9NSU5fWE9GRkxJTUlUOwlcCi0JCShpbmZvKS0+SGFuZEZsb3cuWG9uTGltaXQgPSBNT1hBX01VU1RfTUlOX1hPTkxJTUlUOwlcCi0JfQlcCi19Ci0KLSNkZWZpbmUgRU5BQkxFX01PWEFfTVVTVF9FTkNIQU5DRV9NT0RFKGJhc2VpbykgeyBcCi0JdTgJX19vbGRsY3IsIF9fZWZyOwlcCi0JX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisjZGVmaW5lIEVOQUJMRV9NT1hBX01VU1RfRU5DSEFOQ0VfTU9ERShiYXNlaW8pIGRvIHsgCQlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwkJCQlcCisJX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwkJCVwKIAlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCi0JX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKLQlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0VGUkJfRU5BQkxFOwlcCi0Jb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKLQlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLX0KKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJCVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0VGUkJfRU5BQkxFOwkJCVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJCVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CQkJXAorfSB3aGlsZSAoMCkKIAotI2RlZmluZSBESVNBQkxFX01PWEFfTVVTVF9FTkNIQU5DRV9NT0RFKGJhc2VpbykgewlcCi0JdTgJX19vbGRsY3IsIF9fZWZyOwlcCi0JX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisjZGVmaW5lIERJU0FCTEVfTU9YQV9NVVNUX0VOQ0hBTkNFX01PREUoYmFzZWlvKSBkbyB7CQlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwkJCQlcCisJX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwkJCVwKIAlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCi0JX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKLQlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9FRlJCX0VOQUJMRTsJXAotCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCi0Jb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCi19CisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CQlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfRUZSQl9FTkFCTEU7CQkJXAorCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwkJXAorCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJCQlcCit9IHdoaWxlICgwKQogCi0jZGVmaW5lIFNFVF9NT1hBX01VU1RfWE9OMV9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKLQl1OAlfX29sZGxjciwgX19lZnI7CVwKLQlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9YT04xX1ZBTFVFKGJhc2VpbywgVmFsdWUpIGRvIHsJCVwKKwl1OAlfX29sZGxjciwgX19lZnI7CQkJCVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CQkJXAogCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLQlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAotCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX0JBTktfTUFTSzsJXAotCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfQkFOSzA7CVwKLQlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwkJXAorCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX0JBTktfTUFTSzsJCQlcCisJX19lZnIgfD0gTU9YQV9NVVNUX0VGUl9CQU5LMDsJCQkJXAorCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwkJXAogCW91dGIoKHU4KShWYWx1ZSksIChiYXNlaW8pK01PWEFfTVVTVF9YT04xX1JFR0lTVEVSKTsJXAotCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJXAotfQorCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJCQlcCit9IHdoaWxlICgwKQogCi0jZGVmaW5lIFNFVF9NT1hBX01VU1RfWE9OMl9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKLQl1OAlfX29sZGxjciwgX19lZnI7CVwKLQlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9YT0ZGMV9WQUxVRShiYXNlaW8sIFZhbHVlKSBkbyB7CQlcCisJdTgJX19vbGRsY3IsIF9fZWZyOwkJCQlcCisJX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwkJCVwKIAlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCi0JX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKLQlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKLQlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTkswOwlcCi0Jb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKLQlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfWE9OMl9SRUdJU1RFUik7CVwKLQlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLX0KLQotI2RlZmluZSBTRVRfTU9YQV9NVVNUX1hPRkYxX1ZBTFVFKGJhc2VpbywgVmFsdWUpIHsJXAotCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAotCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAotCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLQlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAotCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX0JBTktfTUFTSzsJXAotCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfQkFOSzA7CVwKLQlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwkJXAorCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX0JBTktfTUFTSzsJCQlcCisJX19lZnIgfD0gTU9YQV9NVVNUX0VGUl9CQU5LMDsJCQkJXAorCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwkJXAogCW91dGIoKHU4KShWYWx1ZSksIChiYXNlaW8pK01PWEFfTVVTVF9YT0ZGMV9SRUdJU1RFUik7CVwKLQlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLX0KKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CQkJXAorfSB3aGlsZSAoMCkKIAotI2RlZmluZSBTRVRfTU9YQV9NVVNUX1hPRkYyX1ZBTFVFKGJhc2VpbywgVmFsdWUpIHsJXAotCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAotCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAorI2RlZmluZSBTRVRfTU9YQV9NVVNUX0ZJRk9fVkFMVUUoaW5mbykgZG8gewkJCVwKKwl1OAlfX29sZGxjciwgX19lZnI7CQkJCVwKKwlfX29sZGxjciA9IGluYigoaW5mbyktPmlvYWRkcitVQVJUX0xDUik7CQlcCisJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChpbmZvKS0+aW9hZGRyK1VBUlRfTENSKTtcCisJX19lZnIgPSBpbmIoKGluZm8pLT5pb2FkZHIrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CQkJXAorCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfQkFOSzE7CQkJCVwKKwlvdXRiKF9fZWZyLCAoaW5mbyktPmlvYWRkcitNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAorCW91dGIoKHU4KSgoaW5mbyktPnJ4X2hpZ2hfd2F0ZXIpLCAoaW5mbyktPmlvYWRkcisJXAorCQkJTU9YQV9NVVNUX1JCUlRIX1JFR0lTVEVSKTsJCVwKKwlvdXRiKCh1OCkoKGluZm8pLT5yeF90cmlnZ2VyKSwgKGluZm8pLT5pb2FkZHIrCQlcCisJCQlNT1hBX01VU1RfUkJSVElfUkVHSVNURVIpOwkJXAorCW91dGIoKHU4KSgoaW5mbyktPnJ4X2xvd193YXRlciksIChpbmZvKS0+aW9hZGRyKwlcCisJCQlNT1hBX01VU1RfUkJSVExfUkVHSVNURVIpOwkJXAorCW91dGIoX19vbGRsY3IsIChpbmZvKS0+aW9hZGRyK1VBUlRfTENSKTsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU0VUX01PWEFfTVVTVF9FTlVNX1ZBTFVFKGJhc2VpbywgVmFsdWUpIGRvIHsJCVwKKwl1OAlfX29sZGxjciwgX19lZnI7CQkJCVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CQkJXAogCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLQlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAotCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX0JBTktfTUFTSzsJXAotCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfQkFOSzA7CVwKLQlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAotCW91dGIoKHU4KShWYWx1ZSksIChiYXNlaW8pK01PWEFfTVVTVF9YT0ZGMl9SRUdJU1RFUik7CVwKLQlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLX0KLQotI2RlZmluZSBTRVRfTU9YQV9NVVNUX1JCUlRMX1ZBTFVFKGJhc2VpbywgVmFsdWUpIHsJXAotCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAotCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAotCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLQlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAotCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX0JBTktfTUFTSzsJXAotCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfQkFOSzE7CVwKLQlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAotCW91dGIoKHU4KShWYWx1ZSksIChiYXNlaW8pK01PWEFfTVVTVF9SQlJUTF9SRUdJU1RFUik7CVwKLQlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLX0KLQotI2RlZmluZSBTRVRfTU9YQV9NVVNUX1JCUlRIX1ZBTFVFKGJhc2VpbywgVmFsdWUpIHsJXAotCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAotCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAotCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLQlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAotCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX0JBTktfTUFTSzsJXAotCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfQkFOSzE7CVwKLQlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAotCW91dGIoKHU4KShWYWx1ZSksIChiYXNlaW8pK01PWEFfTVVTVF9SQlJUSF9SRUdJU1RFUik7CVwKLQlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLX0KLQotI2RlZmluZSBTRVRfTU9YQV9NVVNUX1JCUlRJX1ZBTFVFKGJhc2VpbywgVmFsdWUpIHsJXAotCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAotCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAotCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLQlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAotCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX0JBTktfTUFTSzsJXAotCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfQkFOSzE7CVwKLQlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAotCW91dGIoKHU4KShWYWx1ZSksIChiYXNlaW8pK01PWEFfTVVTVF9SQlJUSV9SRUdJU1RFUik7CVwKLQlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLX0KLQotI2RlZmluZSBTRVRfTU9YQV9NVVNUX1RIUlRMX1ZBTFVFKGJhc2VpbywgVmFsdWUpIHsJXAotCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAotCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAotCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLQlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAotCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX0JBTktfTUFTSzsJXAotCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfQkFOSzE7CVwKLQlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAotCW91dGIoKHU4KShWYWx1ZSksIChiYXNlaW8pK01PWEFfTVVTVF9USFJUTF9SRUdJU1RFUik7CVwKLQlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLX0KLQotLy8jZGVmaW5lIE1PWEFfTVVTVF9SQlJMX1ZBTFVFICA0Ci0jZGVmaW5lIFNFVF9NT1hBX01VU1RfRklGT19WQUxVRShpbmZvKSB7CVwKLQl1OAlfX29sZGxjciwgX19lZnI7CVwKLQlfX29sZGxjciA9IGluYigoaW5mbyktPmJhc2UrVUFSVF9MQ1IpOwlcCi0Jb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChpbmZvKS0+YmFzZStVQVJUX0xDUik7CVwKLQlfX2VmciA9IGluYigoaW5mbyktPmJhc2UrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKLQlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKLQlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTksxOwlcCi0Jb3V0YihfX2VmciwgKGluZm8pLT5iYXNlK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCi0Jb3V0YigodTgpKChpbmZvKS0+cnhfaGlnaF93YXRlciksIChpbmZvKS0+YmFzZStNT1hBX01VU1RfUkJSVEhfUkVHSVNURVIpOwlcCi0Jb3V0YigodTgpKChpbmZvKS0+cnhfdHJpZ2dlciksIChpbmZvKS0+YmFzZStNT1hBX01VU1RfUkJSVElfUkVHSVNURVIpOwlcCi0Jb3V0YigodTgpKChpbmZvKS0+cnhfbG93X3dhdGVyKSwgKGluZm8pLT5iYXNlK01PWEFfTVVTVF9SQlJUTF9SRUdJU1RFUik7CVwKLQlvdXRiKF9fb2xkbGNyLCAoaW5mbyktPmJhc2UrVUFSVF9MQ1IpOwlcCi19Ci0KLQotCi0jZGVmaW5lIFNFVF9NT1hBX01VU1RfRU5VTV9WQUxVRShiYXNlaW8sIFZhbHVlKSB7CVwKLQl1OAlfX29sZGxjciwgX19lZnI7CVwKLQlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKLQlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCi0JX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKLQlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CVwKLQlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTksyOwlcCi0Jb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJCVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CQkJXAorCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfQkFOSzI7CQkJCVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJCVwKIAlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfRU5VTV9SRUdJU1RFUik7CVwKLQlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLX0KKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CQkJXAorfSB3aGlsZSAoMCkKIAotI2RlZmluZSBHRVRfTU9YQV9NVVNUX0hBUkRXQVJFX0lEKGJhc2VpbywgcElkKSB7CVwKLQl1OAlfX29sZGxjciwgX19lZnI7CVwKLQlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKyNkZWZpbmUgR0VUX01PWEFfTVVTVF9IQVJEV0FSRV9JRChiYXNlaW8sIHBJZCkgZG8gewkJXAorCXU4CV9fb2xkbGNyLCBfX2VmcjsJCQkJXAorCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJCQlcCiAJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAotCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCi0JX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfQkFOS19NQVNLOwlcCi0JX19lZnIgfD0gTU9YQV9NVVNUX0VGUl9CQU5LMjsJXAotCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCi0JKnBJZCA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfSFdJRF9SRUdJU1RFUik7CVwKLQlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLX0KKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJCVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CQkJXAorCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfQkFOSzI7CQkJCVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJCVwKKwkqcElkID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9IV0lEX1JFR0lTVEVSKTsJCVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CQkJXAorfSB3aGlsZSAoMCkKIAotI2RlZmluZSBTRVRfTU9YQV9NVVNUX05PX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChiYXNlaW8pIHsJXAotCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAotCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAorI2RlZmluZSBTRVRfTU9YQV9NVVNUX05PX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChiYXNlaW8pIGRvIHsJXAorCXU4CV9fb2xkbGNyLCBfX2VmcjsJCQkJXAorCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJCQlcCiAJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAotCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCi0JX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfU0ZfTUFTSzsJXAotCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCi0Jb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCi19CisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CQlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfU0ZfTUFTSzsJCQlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CQlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwkJCVwKK30gd2hpbGUgKDApCiAKLSNkZWZpbmUgU0VUX01PWEFfTVVTVF9KVVNUX1RYX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChiYXNlaW8pIHsJXAotCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAotCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAorI2RlZmluZSBFTkFCTEVfTU9YQV9NVVNUX1RYX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChiYXNlaW8pIGRvIHsJXAorCXU4CV9fb2xkbGNyLCBfX2VmcjsJCQkJXAorCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJCQlcCiAJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAotCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCi0JX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfU0ZfTUFTSzsJXAotCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfU0ZfVFgxOwlcCi0Jb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKLQlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLX0KKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJCVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9TRl9UWF9NQVNLOwkJCVwKKwlfX2VmciB8PSBNT1hBX01VU1RfRUZSX1NGX1RYMTsJCQkJXAorCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwkJXAorCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJCQlcCit9IHdoaWxlICgwKQogCi0jZGVmaW5lIEVOQUJMRV9NT1hBX01VU1RfVFhfU09GVFdBUkVfRkxPV19DT05UUk9MKGJhc2VpbykgewlcCi0JdTgJX19vbGRsY3IsIF9fZWZyOwlcCi0JX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCisjZGVmaW5lIERJU0FCTEVfTU9YQV9NVVNUX1RYX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChiYXNlaW8pIGRvIHsJXAorCXU4CV9fb2xkbGNyLCBfX2VmcjsJCQkJXAorCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJCQlcCiAJb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAotCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCi0JX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfU0ZfVFhfTUFTSzsJXAotCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfU0ZfVFgxOwlcCi0Jb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKLQlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLX0KKwlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJCVwKKwlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9TRl9UWF9NQVNLOwkJCVwKKwlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJCVwKKwlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CQkJXAorfSB3aGlsZSAoMCkKIAotI2RlZmluZSBESVNBQkxFX01PWEFfTVVTVF9UWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woYmFzZWlvKSB7CVwKLQl1OAlfX29sZGxjciwgX19lZnI7CVwKLQlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKKyNkZWZpbmUgRU5BQkxFX01PWEFfTVVTVF9SWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woYmFzZWlvKSBkbyB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CQkJCVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CQkJXAogCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLQlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAotCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX1NGX1RYX01BU0s7CVwKLQlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAotCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJXAotfQorCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwkJXAorCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX1NGX1JYX01BU0s7CQkJXAorCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfU0ZfUlgxOwkJCQlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CQlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwkJCVwKK30gd2hpbGUgKDApCiAKLSNkZWZpbmUgU0VUX01PWEFfTVVTVF9KVVNUX1JYX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChiYXNlaW8pIHsJXAotCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAotCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAorI2RlZmluZSBESVNBQkxFX01PWEFfTVVTVF9SWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woYmFzZWlvKSBkbyB7CVwKKwl1OAlfX29sZGxjciwgX19lZnI7CQkJCVwKKwlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CQkJXAogCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLQlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAotCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX1NGX01BU0s7CVwKLQlfX2VmciB8PSBNT1hBX01VU1RfRUZSX1NGX1JYMTsJXAotCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCi0Jb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCi19Ci0KLSNkZWZpbmUgRU5BQkxFX01PWEFfTVVTVF9SWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woYmFzZWlvKSB7CVwKLQl1OAlfX29sZGxjciwgX19lZnI7CVwKLQlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CVwKLQlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCi0JX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKLQlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9TRl9SWF9NQVNLOwlcCi0JX19lZnIgfD0gTU9YQV9NVVNUX0VGUl9TRl9SWDE7CVwKLQlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAotCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJXAotfQotCi0jZGVmaW5lIERJU0FCTEVfTU9YQV9NVVNUX1JYX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChiYXNlaW8pIHsJXAotCXU4CV9fb2xkbGNyLCBfX2VmcjsJXAotCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJXAotCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLQlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAotCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX1NGX1JYX01BU0s7CVwKLQlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAotCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJXAotfQotCi0jZGVmaW5lIEVOQUJMRV9NT1hBX01VU1RfVFhfUlhfU09GVFdBUkVfRkxPV19DT05UUk9MKGJhc2VpbykgewlcCi0JdTgJX19vbGRsY3IsIF9fZWZyOwlcCi0JX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwlcCi0Jb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAotCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCi0JX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfU0ZfTUFTSzsJXAotCV9fZWZyIHw9IChNT1hBX01VU1RfRUZSX1NGX1JYMXxNT1hBX01VU1RfRUZSX1NGX1RYMSk7CVwKLQlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJXAotCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJXAotfQotCi0jZGVmaW5lIEVOQUJMRV9NT1hBX01VU1RfWE9OX0FOWV9GTE9XX0NPTlRST0woYmFzZWlvKSB7CVwKLQl1OAlfX29sZG1jcjsJXAotCV9fb2xkbWNyID0gaW5iKChiYXNlaW8pK1VBUlRfTUNSKTsJXAotCV9fb2xkbWNyIHw9IE1PWEFfTVVTVF9NQ1JfWE9OX0FOWTsJXAotCW91dGIoX19vbGRtY3IsIChiYXNlaW8pK1VBUlRfTUNSKTsJXAotfQotCi0jZGVmaW5lIERJU0FCTEVfTU9YQV9NVVNUX1hPTl9BTllfRkxPV19DT05UUk9MKGJhc2VpbykgewlcCi0JdTgJX19vbGRtY3I7CVwKLQlfX29sZG1jciA9IGluYigoYmFzZWlvKStVQVJUX01DUik7CVwKLQlfX29sZG1jciAmPSB+TU9YQV9NVVNUX01DUl9YT05fQU5ZOwlcCi0Jb3V0YihfX29sZG1jciwgKGJhc2VpbykrVUFSVF9NQ1IpOwlcCi19Ci0KLSNkZWZpbmUgUkVBRF9NT1hBX01VU1RfR0RMKGJhc2VpbykJaW5iKChiYXNlaW8pK01PWEFfTVVTVF9HRExfUkVHSVNURVIpCisJX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CQlcCisJX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfU0ZfUlhfTUFTSzsJCQlcCisJb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CQlcCisJb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwkJCVwKK30gd2hpbGUgKDApCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL214c2VyX25ldy5jIGIvZHJpdmVycy9jaGFyL214c2VyX25ldy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjFiZWU0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2hhci9teHNlcl9uZXcuYworKysgL2Rldi9udWxsCkBAIC0xLDI4MTYgKzAsMCBAQAotLyoKLSAqICAgICAgICAgIG14c2VyLmMgIC0tIE1PWEEgU21hcnRpby9JbmR1c3RpbyBmYW1pbHkgbXVsdGlwb3J0IHNlcmlhbCBkcml2ZXIuCi0gKgotICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNiAgTW94YSBUZWNobm9sb2dpZXMgKHN1cHBvcnRAbW94YS5jb20udHcpLgotICoJQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgIEppcmkgU2xhYnkgPGppcmlzbGFieUBnbWFpbC5jb20+Ci0gKgotICogICAgICBUaGlzIGNvZGUgaXMgbG9vc2VseSBiYXNlZCBvbiB0aGUgMS44IG1veGEgZHJpdmVyIHdoaWNoIGlzIGJhc2VkIG9uCi0gKglMaW51eCBzZXJpYWwgZHJpdmVyLCB3cml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzLCBUaGVvZG9yZSBUJ3NvIGFuZAotICoJb3RoZXJzLgotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKglGZWQgdGhyb3VnaCBhIGNsZWFudXAsIGluZGVudCBhbmQgcmVtb3ZlIG9mIG5vbiAyLjYgY29kZSBieSBBbGFuIENveAotICoJPGFsYW5AcmVkaGF0LmNvbT4uIFRoZSBvcmlnaW5hbCAxLjggY29kZSBpcyBhdmFpbGFibGUgb24gd3d3Lm1veGEuY29tLgotICoJLSBGaXhlZCB4ODZfNjQgY2xlYW5uZXNzCi0gKgktIEZpeGVkIHNsZWVwIHdpdGggc3BpbmxvY2sgaGVsZCBpbiBteHNlcl9zZW5kX2JyZWFrCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgotI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgotI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZmNudGwuaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9nZnAuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLSNpbmNsdWRlICJteHNlcl9uZXcuaCIKLQotI2RlZmluZQlNWFNFUl9WRVJTSU9OCSIyLjAuMiIJCS8qIDEuMTAgKi8KLSNkZWZpbmUJTVhTRVJNQUpPUgkgMTc0Ci0jZGVmaW5lCU1YU0VSQ1VNQUpPUgkgMTc1Ci0KLSNkZWZpbmUgTVhTRVJfQk9BUkRTCQk0CS8qIE1heC4gYm9hcmRzICovCi0jZGVmaW5lIE1YU0VSX1BPUlRTX1BFUl9CT0FSRAk4CS8qIE1heC4gcG9ydHMgcGVyIGJvYXJkICovCi0jZGVmaW5lIE1YU0VSX1BPUlRTCQkoTVhTRVJfQk9BUkRTICogTVhTRVJfUE9SVFNfUEVSX0JPQVJEKQotI2RlZmluZSBNWFNFUl9JU1JfUEFTU19MSU1JVAkxMDAKLQotI2RlZmluZQlNWFNFUl9FUlJfSU9BRERSCS0xCi0jZGVmaW5lCU1YU0VSX0VSUl9JUlEJCS0yCi0jZGVmaW5lCU1YU0VSX0VSUl9JUlFfQ09ORkxJVAktMwotI2RlZmluZQlNWFNFUl9FUlJfVkVDVE9SCS00Ci0KLS8qQ2hlY2tJc01veGFNdXN0IHJldHVybiB2YWx1ZSovCi0jZGVmaW5lIE1PWEFfT1RIRVJfVUFSVAkJMHgwMAotI2RlZmluZSBNT1hBX01VU1RfTVUxNTBfSFdJRAkweDAxCi0jZGVmaW5lIE1PWEFfTVVTVF9NVTg2MF9IV0lECTB4MDIKLQotI2RlZmluZSBXQUtFVVBfQ0hBUlMJCTI1NgotCi0jZGVmaW5lIFVBUlRfTUNSX0FGRQkJMHgyMAotI2RlZmluZSBVQVJUX0xTUl9TUEVDSUFMCTB4MUUKLQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NCMTA4CTB4MTA4MAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NCMTE0CTB4MTE0MgotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NCMTM0SQkweDEzNDEKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9DUDEzOFUJMHgxMzgwCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfUE9TMTA0VUwJMHgxMDQ0Ci0KLQotI2RlZmluZSBDMTY4X0FTSUNfSUQgICAgMQotI2RlZmluZSBDMTA0X0FTSUNfSUQgICAgMgotI2RlZmluZSBDMTAyX0FTSUNfSUQJMHhCCi0jZGVmaW5lIENJMTMyX0FTSUNfSUQJNAotI2RlZmluZSBDSTEzNF9BU0lDX0lECTMKLSNkZWZpbmUgQ0kxMDRKX0FTSUNfSUQgIDUKLQotI2RlZmluZSBNWFNFUl9ISUdIQkFVRAkxCi0jZGVmaW5lIE1YU0VSX0hBUzIJMgotCi0vKiBUaGlzIGlzIG9ubHkgZm9yIFBDSSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCB7Ci0JaW50IHR5cGU7Ci0JaW50IHR4X2ZpZm87Ci0JaW50IHJ4X2ZpZm87Ci0JaW50IHhtaXRfZmlmb19zaXplOwotCWludCByeF9oaWdoX3dhdGVyOwotCWludCByeF90cmlnZ2VyOwotCWludCByeF9sb3dfd2F0ZXI7Ci0JbG9uZyBtYXhfYmF1ZDsKLX0gR3BjaV91YXJ0X2luZm9bXSA9IHsKLQl7TU9YQV9PVEhFUl9VQVJULCAxNiwgMTYsIDE2LCAxNCwgMTQsIDEsIDkyMTYwMEx9LAotCXtNT1hBX01VU1RfTVUxNTBfSFdJRCwgNjQsIDY0LCA2NCwgNDgsIDQ4LCAxNiwgMjMwNDAwTH0sCi0Je01PWEFfTVVTVF9NVTg2MF9IV0lELCAxMjgsIDEyOCwgMTI4LCA5NiwgOTYsIDMyLCA5MjE2MDBMfQotfTsKLSNkZWZpbmUgVUFSVF9JTkZPX05VTQlBUlJBWV9TSVpFKEdwY2lfdWFydF9pbmZvKQotCi1zdHJ1Y3QgbXhzZXJfY2FyZGluZm8gewotCXVuc2lnbmVkIGludCBucG9ydHM7Ci0JY2hhciAqbmFtZTsKLQl1bnNpZ25lZCBpbnQgZmxhZ3M7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG14c2VyX2NhcmRpbmZvIG14c2VyX2NhcmRzW10gPSB7Ci0vKiAwKi8JeyA4LCAiQzE2OCBzZXJpZXMiLCB9LAotCXsgNCwgIkMxMDQgc2VyaWVzIiwgfSwKLQl7IDQsICJDSS0xMDRKIHNlcmllcyIsIH0sCi0JeyA4LCAiQzE2OEgvUENJIHNlcmllcyIsIH0sCi0JeyA0LCAiQzEwNEgvUENJIHNlcmllcyIsIH0sCi0vKiA1Ki8JeyA0LCAiQzEwMiBzZXJpZXMiLCBNWFNFUl9IQVMyIH0sCS8qIEMxMDItSVNBICovCi0JeyA0LCAiQ0ktMTMyIHNlcmllcyIsIE1YU0VSX0hBUzIgfSwKLQl7IDQsICJDSS0xMzQgc2VyaWVzIiwgfSwKLQl7IDIsICJDUC0xMzIgc2VyaWVzIiwgfSwKLQl7IDQsICJDUC0xMTQgc2VyaWVzIiwgfSwKLS8qMTAqLwl7IDQsICJDVC0xMTQgc2VyaWVzIiwgfSwKLQl7IDIsICJDUC0xMDIgc2VyaWVzIiwgTVhTRVJfSElHSEJBVUQgfSwKLQl7IDQsICJDUC0xMDRVIHNlcmllcyIsIH0sCi0JeyA4LCAiQ1AtMTY4VSBzZXJpZXMiLCB9LAotCXsgMiwgIkNQLTEzMlUgc2VyaWVzIiwgfSwKLS8qMTUqLwl7IDQsICJDUC0xMzRVIHNlcmllcyIsIH0sCi0JeyA0LCAiQ1AtMTA0SlUgc2VyaWVzIiwgfSwKLQl7IDgsICJNb3hhIFVDNzAwMCBTZXJpYWwiLCB9LAkJLyogUkM3MDAwICovCi0JeyA4LCAiQ1AtMTE4VSBzZXJpZXMiLCB9LAotCXsgMiwgIkNQLTEwMlVMIHNlcmllcyIsIH0sCi0vKjIwKi8JeyAyLCAiQ1AtMTAyVSBzZXJpZXMiLCB9LAotCXsgOCwgIkNQLTExOEVMIHNlcmllcyIsIH0sCi0JeyA4LCAiQ1AtMTY4RUwgc2VyaWVzIiwgfSwKLQl7IDQsICJDUC0xMDRFTCBzZXJpZXMiLCB9LAotCXsgOCwgIkNCLTEwOCBzZXJpZXMiLCB9LAotLyoyNSovCXsgNCwgIkNCLTExNCBzZXJpZXMiLCB9LAotCXsgNCwgIkNCLTEzNEkgc2VyaWVzIiwgfSwKLQl7IDgsICJDUC0xMzhVIHNlcmllcyIsIH0sCi0JeyA0LCAiUE9TLTEwNFVMIHNlcmllcyIsIH0KLX07Ci0KLS8qIGRyaXZlcl9kYXRhIGNvcnJlc3BvbmQgdG8gdGhlIGxpbmVzIGluIHRoZSBzdHJ1Y3R1cmUgYWJvdmUKLSAgIHNlZSBhbHNvIElTQSBwcm9iZSBmdW5jdGlvbiBiZWZvcmUgeW91IGNoYW5nZSBzb21ldGhpbmcgKi8KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBteHNlcl9wY2licmRzW10gPSB7Ci0JeyBQQ0lfVkRFVklDRShNT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQzE2OCksCS5kcml2ZXJfZGF0YSA9IDMgfSwKLQl7IFBDSV9WREVWSUNFKE1PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DMTA0KSwJLmRyaXZlcl9kYXRhID0gNCB9LAotCXsgUENJX1ZERVZJQ0UoTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTMyKSwJLmRyaXZlcl9kYXRhID0gOCB9LAotCXsgUENJX1ZERVZJQ0UoTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTE0KSwJLmRyaXZlcl9kYXRhID0gOSB9LAotCXsgUENJX1ZERVZJQ0UoTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NUMTE0KSwJLmRyaXZlcl9kYXRhID0gMTAgfSwKLQl7IFBDSV9WREVWSUNFKE1PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEwMiksCS5kcml2ZXJfZGF0YSA9IDExIH0sCi0JeyBQQ0lfVkRFVklDRShNT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMDRVKSwJLmRyaXZlcl9kYXRhID0gMTIgfSwKLQl7IFBDSV9WREVWSUNFKE1PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDE2OFUpLAkuZHJpdmVyX2RhdGEgPSAxMyB9LAotCXsgUENJX1ZERVZJQ0UoTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTMyVSksCS5kcml2ZXJfZGF0YSA9IDE0IH0sCi0JeyBQQ0lfVkRFVklDRShNT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMzRVKSwJLmRyaXZlcl9kYXRhID0gMTUgfSwKLQl7IFBDSV9WREVWSUNFKE1PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEwNEpVKSwuZHJpdmVyX2RhdGEgPSAxNiB9LAotCXsgUENJX1ZERVZJQ0UoTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX1JDNzAwMCksCS5kcml2ZXJfZGF0YSA9IDE3IH0sCi0JeyBQQ0lfVkRFVklDRShNT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMThVKSwJLmRyaXZlcl9kYXRhID0gMTggfSwKLQl7IFBDSV9WREVWSUNFKE1PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDEwMlVMKSwuZHJpdmVyX2RhdGEgPSAxOSB9LAotCXsgUENJX1ZERVZJQ0UoTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTAyVSksCS5kcml2ZXJfZGF0YSA9IDIwIH0sCi0JeyBQQ0lfVkRFVklDRShNT1hBLCBQQ0lfREVWSUNFX0lEX01PWEFfQ1AxMThFTCksLmRyaXZlcl9kYXRhID0gMjEgfSwKLQl7IFBDSV9WREVWSUNFKE1PWEEsIFBDSV9ERVZJQ0VfSURfTU9YQV9DUDE2OEVMKSwuZHJpdmVyX2RhdGEgPSAyMiB9LAotCXsgUENJX1ZERVZJQ0UoTU9YQSwgUENJX0RFVklDRV9JRF9NT1hBX0NQMTA0RUwpLC5kcml2ZXJfZGF0YSA9IDIzIH0sCi0JeyBQQ0lfVkRFVklDRShNT1hBLCBQQ0lfREVWSUNFX0lEX0NCMTA4KSwJLmRyaXZlcl9kYXRhID0gMjQgfSwKLQl7IFBDSV9WREVWSUNFKE1PWEEsIFBDSV9ERVZJQ0VfSURfQ0IxMTQpLAkuZHJpdmVyX2RhdGEgPSAyNSB9LAotCXsgUENJX1ZERVZJQ0UoTU9YQSwgUENJX0RFVklDRV9JRF9DQjEzNEkpLAkuZHJpdmVyX2RhdGEgPSAyNiB9LAotCXsgUENJX1ZERVZJQ0UoTU9YQSwgUENJX0RFVklDRV9JRF9DUDEzOFUpLAkuZHJpdmVyX2RhdGEgPSAyNyB9LAotCXsgUENJX1ZERVZJQ0UoTU9YQSwgUENJX0RFVklDRV9JRF9QT1MxMDRVTCksCS5kcml2ZXJfZGF0YSA9IDI4IH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG14c2VyX3BjaWJyZHMpOwotCi1zdGF0aWMgaW50IG14dmFyX2JhdWRfdGFibGVbXSA9IHsKLQkwLCA1MCwgNzUsIDExMCwgMTM0LCAxNTAsIDIwMCwgMzAwLCA2MDAsIDEyMDAsIDE4MDAsIDI0MDAsCi0JNDgwMCwgOTYwMCwgMTkyMDAsIDM4NDAwLCA1NzYwMCwgMTE1MjAwLCAyMzA0MDAsIDQ2MDgwMCwgOTIxNjAwCi19Owotc3RhdGljIHVuc2lnbmVkIGludCBteHZhcl9iYXVkX3RhYmxlMVtdID0gewotCTAsIEI1MCwgQjc1LCBCMTEwLCBCMTM0LCBCMTUwLCBCMjAwLCBCMzAwLCBCNjAwLCBCMTIwMCwgQjE4MDAsIEIyNDAwLAotCUI0ODAwLCBCOTYwMCwgQjE5MjAwLCBCMzg0MDAsIEI1NzYwMCwgQjExNTIwMCwgQjIzMDQwMCwgQjQ2MDgwMCwgQjkyMTYwMAotfTsKLSNkZWZpbmUgQkFVRF9UQUJMRV9OTyBBUlJBWV9TSVpFKG14dmFyX2JhdWRfdGFibGUpCi0KLSNkZWZpbmUgQl9TUEVDCUIyMDAwMDAwCi0KLXN0YXRpYyBpbnQgaW9hZGRyW01YU0VSX0JPQVJEU10gPSB7IDAsIDAsIDAsIDAgfTsKLXN0YXRpYyBpbnQgdHR5bWFqb3IgPSBNWFNFUk1BSk9SOwotc3RhdGljIGludCBjYWxsb3V0bWFqb3IgPSBNWFNFUkNVTUFKT1I7Ci0KLS8qIFZhcmlhYmxlcyBmb3IgaW5zbW9kICovCi0KLU1PRFVMRV9BVVRIT1IoIkNhc3BlciBZYW5nIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk1PWEEgU21hcnRpby9JbmR1c3RpbyBGYW1pbHkgTXVsdGlwb3J0IEJvYXJkIERldmljZSBEcml2ZXIiKTsKLW1vZHVsZV9wYXJhbV9hcnJheShpb2FkZHIsIGludCwgTlVMTCwgMCk7Ci1tb2R1bGVfcGFyYW0odHR5bWFqb3IsIGludCwgMCk7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0cnVjdCBteHNlcl9sb2cgewotCWludCB0aWNrOwotCXVuc2lnbmVkIGxvbmcgcnhjbnRbTVhTRVJfUE9SVFNdOwotCXVuc2lnbmVkIGxvbmcgdHhjbnRbTVhTRVJfUE9SVFNdOwotfTsKLQotCi1zdHJ1Y3QgbXhzZXJfbW9uIHsKLQl1bnNpZ25lZCBsb25nIHJ4Y250OwotCXVuc2lnbmVkIGxvbmcgdHhjbnQ7Ci0JdW5zaWduZWQgbG9uZyB1cF9yeGNudDsKLQl1bnNpZ25lZCBsb25nIHVwX3R4Y250OwotCWludCBtb2RlbV9zdGF0dXM7Ci0JdW5zaWduZWQgY2hhciBob2xkX3JlYXNvbjsKLX07Ci0KLXN0cnVjdCBteHNlcl9tb25fZXh0IHsKLQl1bnNpZ25lZCBsb25nIHJ4X2NudFszMl07Ci0JdW5zaWduZWQgbG9uZyB0eF9jbnRbMzJdOwotCXVuc2lnbmVkIGxvbmcgdXBfcnhjbnRbMzJdOwotCXVuc2lnbmVkIGxvbmcgdXBfdHhjbnRbMzJdOwotCWludCBtb2RlbV9zdGF0dXNbMzJdOwotCi0JbG9uZyBiYXVkcmF0ZVszMl07Ci0JaW50IGRhdGFiaXRzWzMyXTsKLQlpbnQgc3RvcGJpdHNbMzJdOwotCWludCBwYXJpdHlbMzJdOwotCWludCBmbG93Y3RybFszMl07Ci0JaW50IGZpZm9bMzJdOwotCWludCBpZnR5cGVbMzJdOwotfTsKLQotc3RydWN0IG14c2VyX2JvYXJkOwotCi1zdHJ1Y3QgbXhzZXJfcG9ydCB7Ci0Jc3RydWN0IG14c2VyX2JvYXJkICpib2FyZDsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwotCi0JdW5zaWduZWQgbG9uZyBpb2FkZHI7Ci0JdW5zaWduZWQgbG9uZyBvcG1vZGVfaW9hZGRyOwotCWludCBtYXhfYmF1ZDsKLQotCWludCByeF9oaWdoX3dhdGVyOwotCWludCByeF90cmlnZ2VyOwkJLyogUnggZmlmbyB0cmlnZ2VyIGxldmVsICovCi0JaW50IHJ4X2xvd193YXRlcjsKLQlpbnQgYmF1ZF9iYXNlOwkJLyogbWF4LiBzcGVlZCAqLwotCWxvbmcgcmVhbGJhdWQ7Ci0JaW50IHR5cGU7CQkvKiBVQVJUIHR5cGUgKi8KLQlpbnQgZmxhZ3M7CQkvKiBkZWZpbmVkIGluIHR0eS5oICovCi0JaW50IHNwZWVkOwotCi0JaW50IHhfY2hhcjsJCS8qIHhvbi94b2ZmIGNoYXJhY3RlciAqLwotCWludCBJRVI7CQkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCi0JaW50IE1DUjsJCS8qIE1vZGVtIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQotCXVuc2lnbmVkIGNoYXIgc3RvcF9yeDsKLQl1bnNpZ25lZCBjaGFyIGxkaXNjX3N0b3Bfcng7Ci0KLQlpbnQgY3VzdG9tX2Rpdmlzb3I7Ci0JaW50IGNsb3NlX2RlbGF5OwotCXVuc2lnbmVkIHNob3J0IGNsb3Npbmdfd2FpdDsKLQl1bnNpZ25lZCBjaGFyIGVycl9zaGFkb3c7Ci0JdW5zaWduZWQgbG9uZyBldmVudDsKLQotCWludCBjb3VudDsJCS8qICMgb2YgZmQgb24gZGV2aWNlICovCi0JaW50IGJsb2NrZWRfb3BlbjsJLyogIyBvZiBibG9ja2VkIG9wZW5zICovCi0Jc3RydWN0IGFzeW5jX2ljb3VudCBpY291bnQ7IC8qIGtlcm5lbCBjb3VudGVycyBmb3IgNCBpbnB1dCBpbnRlcnJ1cHRzICovCi0JaW50IHRpbWVvdXQ7Ci0KLQlpbnQgcmVhZF9zdGF0dXNfbWFzazsKLQlpbnQgaWdub3JlX3N0YXR1c19tYXNrOwotCWludCB4bWl0X2ZpZm9fc2l6ZTsKLQl1bnNpZ25lZCBjaGFyICp4bWl0X2J1ZjsKLQlpbnQgeG1pdF9oZWFkOwotCWludCB4bWl0X3RhaWw7Ci0JaW50IHhtaXRfY250OwotCi0Jc3RydWN0IGt0ZXJtaW9zIG5vcm1hbF90ZXJtaW9zOwotCi0Jc3RydWN0IG14c2VyX21vbiBtb25fZGF0YTsKLQotCXNwaW5sb2NrX3Qgc2xvY2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0OwotCXdhaXRfcXVldWVfaGVhZF90IGRlbHRhX21zcl93YWl0OwotfTsKLQotc3RydWN0IG14c2VyX2JvYXJkIHsKLQl1bnNpZ25lZCBpbnQgaWR4OwotCWludCBpcnE7Ci0JY29uc3Qgc3RydWN0IG14c2VyX2NhcmRpbmZvICppbmZvOwotCXVuc2lnbmVkIGxvbmcgdmVjdG9yOwotCXVuc2lnbmVkIGxvbmcgdmVjdG9yX21hc2s7Ci0KLQlpbnQgY2hpcF9mbGFnOwotCWludCB1YXJ0X3R5cGU7Ci0KLQlzdHJ1Y3QgbXhzZXJfcG9ydCBwb3J0c1tNWFNFUl9QT1JUU19QRVJfQk9BUkRdOwotfTsKLQotc3RydWN0IG14c2VyX21zdGF0dXMgewotCXRjZmxhZ190IGNmbGFnOwotCWludCBjdHM7Ci0JaW50IGRzcjsKLQlpbnQgcmk7Ci0JaW50IGRjZDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXhzZXJfbXN0YXR1cyBHTVN0YXR1c1tNWFNFUl9QT1JUU107Ci0KLXN0YXRpYyBpbnQgbXhzZXJCb2FyZENBUFtNWFNFUl9CT0FSRFNdID0gewotCTAsIDAsIDAsIDAKLQkvKiAgMHgxODAsIDB4MjgwLCAweDIwMCwgMHgzMjAgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXhzZXJfYm9hcmQgbXhzZXJfYm9hcmRzW01YU0VSX0JPQVJEU107Ci1zdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKm14dmFyX3Nkcml2ZXI7Ci1zdGF0aWMgc3RydWN0IG14c2VyX2xvZyBteHZhcl9sb2c7Ci1zdGF0aWMgaW50IG14dmFyX2RpYWdmbGFnOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgbXhzZXJfbXNyW01YU0VSX1BPUlRTICsgMV07Ci1zdGF0aWMgc3RydWN0IG14c2VyX21vbl9leHQgbW9uX2RhdGFfZXh0Owotc3RhdGljIGludCBteHNlcl9zZXRfYmF1ZF9tZXRob2RbTVhTRVJfUE9SVFMgKyAxXTsKLQotI2lmZGVmIENPTkZJR19QQ0kKLXN0YXRpYyBpbnQgX19kZXZpbml0IENoZWNrSXNNb3hhTXVzdChpbnQgaW8pCi17Ci0JdTggb2xkbWNyLCBod2lkOwotCWludCBpOwotCi0Jb3V0YigwLCBpbyArIFVBUlRfTENSKTsKLQlESVNBQkxFX01PWEFfTVVTVF9FTkNIQU5DRV9NT0RFKGlvKTsKLQlvbGRtY3IgPSBpbmIoaW8gKyBVQVJUX01DUik7Ci0Jb3V0YigwLCBpbyArIFVBUlRfTUNSKTsKLQlTRVRfTU9YQV9NVVNUX1hPTjFfVkFMVUUoaW8sIDB4MTEpOwotCWlmICgoaHdpZCA9IGluYihpbyArIFVBUlRfTUNSKSkgIT0gMCkgewotCQlvdXRiKG9sZG1jciwgaW8gKyBVQVJUX01DUik7Ci0JCXJldHVybiBNT1hBX09USEVSX1VBUlQ7Ci0JfQotCi0JR0VUX01PWEFfTVVTVF9IQVJEV0FSRV9JRChpbywgJmh3aWQpOwotCWZvciAoaSA9IDE7IGkgPCBVQVJUX0lORk9fTlVNOyBpKyspIHsgLyogMCA9IE9USEVSX1VBUlQgKi8KLQkJaWYgKGh3aWQgPT0gR3BjaV91YXJ0X2luZm9baV0udHlwZSkKLQkJCXJldHVybiAoaW50KWh3aWQ7Ci0JfQotCXJldHVybiBNT1hBX09USEVSX1VBUlQ7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgcHJvY2Vzc190eHJ4X2ZpZm8oc3RydWN0IG14c2VyX3BvcnQgKmluZm8pCi17Ci0JaW50IGk7Ci0KLQlpZiAoKGluZm8tPnR5cGUgPT0gUE9SVF8xNjQ1MCkgfHwgKGluZm8tPnR5cGUgPT0gUE9SVF84MjUwKSkgewotCQlpbmZvLT5yeF90cmlnZ2VyID0gMTsKLQkJaW5mby0+cnhfaGlnaF93YXRlciA9IDE7Ci0JCWluZm8tPnJ4X2xvd193YXRlciA9IDE7Ci0JCWluZm8tPnhtaXRfZmlmb19zaXplID0gMTsKLQl9IGVsc2UKLQkJZm9yIChpID0gMDsgaSA8IFVBUlRfSU5GT19OVU07IGkrKykKLQkJCWlmIChpbmZvLT5ib2FyZC0+Y2hpcF9mbGFnID09IEdwY2lfdWFydF9pbmZvW2ldLnR5cGUpIHsKLQkJCQlpbmZvLT5yeF90cmlnZ2VyID0gR3BjaV91YXJ0X2luZm9baV0ucnhfdHJpZ2dlcjsKLQkJCQlpbmZvLT5yeF9sb3dfd2F0ZXIgPSBHcGNpX3VhcnRfaW5mb1tpXS5yeF9sb3dfd2F0ZXI7Ci0JCQkJaW5mby0+cnhfaGlnaF93YXRlciA9IEdwY2lfdWFydF9pbmZvW2ldLnJ4X2hpZ2hfd2F0ZXI7Ci0JCQkJaW5mby0+eG1pdF9maWZvX3NpemUgPSBHcGNpX3VhcnRfaW5mb1tpXS54bWl0X2ZpZm9fc2l6ZTsKLQkJCQlicmVhazsKLQkJCX0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgbXhzZXJfZ2V0X21zcihpbnQgYmFzZWFkZHIsIGludCBtb2RlLCBpbnQgcG9ydCkKLXsKLQl1bnNpZ25lZCBjaGFyIHN0YXR1cyA9IDA7Ci0KLQlzdGF0dXMgPSBpbmIoYmFzZWFkZHIgKyBVQVJUX01TUik7Ci0KLQlteHNlcl9tc3JbcG9ydF0gJj0gMHgwRjsKLQlteHNlcl9tc3JbcG9ydF0gfD0gc3RhdHVzOwotCXN0YXR1cyA9IG14c2VyX21zcltwb3J0XTsKLQlpZiAobW9kZSkKLQkJbXhzZXJfbXNyW3BvcnRdID0gMDsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBpbnQgbXhzZXJfYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwLAotCQlzdHJ1Y3QgbXhzZXJfcG9ydCAqcG9ydCkKLXsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQlpbnQgcmV0dmFsOwotCWludCBkb19jbG9jYWwgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKgotCSAqIElmIG5vbi1ibG9ja2luZyBtb2RlIGlzIHNldCwgb3IgdGhlIHBvcnQgaXMgbm90IGVuYWJsZWQsCi0JICogdGhlbiBtYWtlIHRoZSBjaGVjayB1cCBmcm9udCBhbmQgdGhlbiBleGl0LgotCSAqLwotCWlmICgoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHx8Ci0JCQl0ZXN0X2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKSkgewotCQlwb3J0LT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKQotCQlkb19jbG9jYWwgPSAxOwotCi0JLyoKLQkgKiBCbG9jayB3YWl0aW5nIGZvciB0aGUgY2FycmllciBkZXRlY3QgYW5kIHRoZSBsaW5lIHRvIGJlY29tZQotCSAqIGZyZWUgKGkuZS4sIG5vdCBpbiB1c2UgYnkgdGhlIGNhbGxvdXQpLiAgV2hpbGUgd2UgYXJlIGluCi0JICogdGhpcyBsb29wLCBwb3J0LT5jb3VudCBpcyBkcm9wcGVkIGJ5IG9uZSwgc28gdGhhdAotCSAqIG14c2VyX2Nsb3NlKCkga25vd3Mgd2hlbiB0byBmcmVlIHRoaW5ncy4gIFdlIHJlc3RvcmUgaXQgdXBvbgotCSAqIGV4aXQsIGVpdGhlciBub3JtYWwgb3IgYWJub3JtYWwuCi0JICovCi0JcmV0dmFsID0gMDsKLQlhZGRfd2FpdF9xdWV1ZSgmcG9ydC0+b3Blbl93YWl0LCAmd2FpdCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+c2xvY2ssIGZsYWdzKTsKLQlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpCi0JCXBvcnQtPmNvdW50LS07Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+c2xvY2ssIGZsYWdzKTsKLQlwb3J0LT5ibG9ja2VkX29wZW4rKzsKLQl3aGlsZSAoMSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+c2xvY2ssIGZsYWdzKTsKLQkJb3V0YihpbmIocG9ydC0+aW9hZGRyICsgVUFSVF9NQ1IpIHwKLQkJCVVBUlRfTUNSX0RUUiB8IFVBUlRfTUNSX1JUUywgcG9ydC0+aW9hZGRyICsgVUFSVF9NQ1IpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5zbG9jaywgZmxhZ3MpOwotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fCAhKHBvcnQtPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKSB7Ci0JCQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19IVVBfTk9USUZZKQotCQkJCXJldHZhbCA9IC1FQUdBSU47Ci0JCQllbHNlCi0JCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKCEocG9ydC0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSAmJgotCQkJCShkb19jbG9jYWwgfHwKLQkJCQkoaW5iKHBvcnQtPmlvYWRkciArIFVBUlRfTVNSKSAmIFVBUlRfTVNSX0RDRCkpKQotCQkJYnJlYWs7Ci0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOwotCQkJYnJlYWs7Ci0JCX0KLQkJc2NoZWR1bGUoKTsKLQl9Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmcG9ydC0+b3Blbl93YWl0LCAmd2FpdCk7Ci0JaWYgKCF0dHlfaHVuZ191cF9wKGZpbHApKQotCQlwb3J0LT5jb3VudCsrOwotCXBvcnQtPmJsb2NrZWRfb3Blbi0tOwotCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7Ci0JcG9ydC0+ZmxhZ3MgfD0gQVNZTkNfTk9STUFMX0FDVElWRTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBteHNlcl9zZXRfYmF1ZChzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbywgbG9uZyBuZXdzcGQpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0JaW50IHF1b3QgPSAwOwotCXVuc2lnbmVkIGNoYXIgY3ZhbDsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghaW5mby0+dHR5IHx8ICFpbmZvLT50dHktPnRlcm1pb3MpCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoIShpbmZvLT5pb2FkZHIpKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKG5ld3NwZCA+IGluZm8tPm1heF9iYXVkKQotCQlyZXR1cm4gMDsKLQotCWluZm8tPnJlYWxiYXVkID0gbmV3c3BkOwotCWZvciAoaSA9IDA7IGkgPCBCQVVEX1RBQkxFX05POyBpKyspCi0JICAgICAgIGlmIChuZXdzcGQgPT0gbXh2YXJfYmF1ZF90YWJsZVtpXSkKLQkJICAgICAgIGJyZWFrOwotCWlmIChpID09IEJBVURfVEFCTEVfTk8pIHsKLQkJcXVvdCA9IGluZm8tPmJhdWRfYmFzZSAvIGluZm8tPnNwZWVkOwotCQlpZiAoaW5mby0+c3BlZWQgPD0gMCB8fCBpbmZvLT5zcGVlZCA+IGluZm8tPm1heF9iYXVkKQotCQkJcXVvdCA9IDA7Ci0JfSBlbHNlIHsKLQkJaWYgKG5ld3NwZCA9PSAxMzQpIHsKLQkJCXF1b3QgPSAoMiAqIGluZm8tPmJhdWRfYmFzZSAvIDI2OSk7Ci0JCX0gZWxzZSBpZiAobmV3c3BkKSB7Ci0JCQlxdW90ID0gaW5mby0+YmF1ZF9iYXNlIC8gbmV3c3BkOwotCQkJaWYgKHF1b3QgPT0gMCkKLQkJCQlxdW90ID0gMTsKLQkJfSBlbHNlIHsKLQkJCXF1b3QgPSAwOwotCQl9Ci0JfQotCi0JaW5mby0+dGltZW91dCA9ICgoaW5mby0+eG1pdF9maWZvX3NpemUgKiBIWiAqIDEwICogcXVvdCkgLyBpbmZvLT5iYXVkX2Jhc2UpOwotCWluZm8tPnRpbWVvdXQgKz0gSFogLyA1MDsJLyogQWRkIC4wMiBzZWNvbmRzIG9mIHNsb3AgKi8KLQotCWlmIChxdW90KSB7Ci0JCWluZm8tPk1DUiB8PSBVQVJUX01DUl9EVFI7Ci0JCW91dGIoaW5mby0+TUNSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX01DUik7Ci0JfSBlbHNlIHsKLQkJaW5mby0+TUNSICY9IH5VQVJUX01DUl9EVFI7Ci0JCW91dGIoaW5mby0+TUNSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX01DUik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JY3ZhbCA9IGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX0xDUik7Ci0KLQlvdXRiKGN2YWwgfCBVQVJUX0xDUl9ETEFCLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0xDUik7CS8qIHNldCBETEFCICovCi0KLQlvdXRiKHF1b3QgJiAweGZmLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0RMTCk7CS8qIExTIG9mIGRpdmlzb3IgKi8KLQlvdXRiKHF1b3QgPj4gOCwgaW5mby0+aW9hZGRyICsgVUFSVF9ETE0pOwkvKiBNUyBvZiBkaXZpc29yICovCi0Jb3V0YihjdmFsLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0xDUik7CS8qIHJlc2V0IERMQUIgKi8KLQotCWlmIChpID09IEJBVURfVEFCTEVfTk8pIHsKLQkJcXVvdCA9IGluZm8tPmJhdWRfYmFzZSAlIGluZm8tPnNwZWVkOwotCQlxdW90ICo9IDg7Ci0JCWlmICgocXVvdCAlIGluZm8tPnNwZWVkKSA+IChpbmZvLT5zcGVlZCAvIDIpKSB7Ci0JCQlxdW90IC89IGluZm8tPnNwZWVkOwotCQkJcXVvdCsrOwotCQl9IGVsc2UgewotCQkJcXVvdCAvPSBpbmZvLT5zcGVlZDsKLQkJfQotCQlTRVRfTU9YQV9NVVNUX0VOVU1fVkFMVUUoaW5mby0+aW9hZGRyLCBxdW90KTsKLQl9IGVsc2UKLQkJU0VUX01PWEFfTVVTVF9FTlVNX1ZBTFVFKGluZm8tPmlvYWRkciwgMCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBzZXQgdGhlIFVBUlQgZGl2aXNvciByZWdpc3RlcnMgdG8gbWF0Y2gKLSAqIHRoZSBzcGVjaWZpZWQgYmF1ZCByYXRlIGZvciBhIHNlcmlhbCBwb3J0LgotICovCi1zdGF0aWMgaW50IG14c2VyX2NoYW5nZV9zcGVlZChzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbywKLQkJc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKLXsKLQl1bnNpZ25lZCBjZmxhZywgY3ZhbCwgZmNyOwotCWludCByZXQgPSAwOwotCXVuc2lnbmVkIGNoYXIgc3RhdHVzOwotCWxvbmcgYmF1ZDsKLQotCWlmICghaW5mby0+dHR5IHx8ICFpbmZvLT50dHktPnRlcm1pb3MpCi0JCXJldHVybiByZXQ7Ci0JY2ZsYWcgPSBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7Ci0JaWYgKCEoaW5mby0+aW9hZGRyKSkKLQkJcmV0dXJuIHJldDsKLQotCWlmIChteHNlcl9zZXRfYmF1ZF9tZXRob2RbaW5mby0+dHR5LT5pbmRleF0gPT0gMCkgewotCQlpZiAoKGNmbGFnICYgQ0JBVUQpID09IEJfU1BFQykKLQkJCWJhdWQgPSBpbmZvLT5zcGVlZDsKLQkJZWxzZQotCQkJYmF1ZCA9IHR0eV9nZXRfYmF1ZF9yYXRlKGluZm8tPnR0eSk7Ci0JCW14c2VyX3NldF9iYXVkKGluZm8sIGJhdWQpOwotCX0KLQotCS8qIGJ5dGUgc2l6ZSBhbmQgcGFyaXR5ICovCi0Jc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7Ci0JY2FzZSBDUzU6Ci0JCWN2YWwgPSAweDAwOwotCQlicmVhazsKLQljYXNlIENTNjoKLQkJY3ZhbCA9IDB4MDE7Ci0JCWJyZWFrOwotCWNhc2UgQ1M3OgotCQljdmFsID0gMHgwMjsKLQkJYnJlYWs7Ci0JY2FzZSBDUzg6Ci0JCWN2YWwgPSAweDAzOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQljdmFsID0gMHgwMDsKLQkJYnJlYWs7CQkvKiB0b28ga2VlcCBHQ0Mgc2h1dC4uLiAqLwotCX0KLQlpZiAoY2ZsYWcgJiBDU1RPUEIpCi0JCWN2YWwgfD0gMHgwNDsKLQlpZiAoY2ZsYWcgJiBQQVJFTkIpCi0JCWN2YWwgfD0gVUFSVF9MQ1JfUEFSSVRZOwotCWlmICghKGNmbGFnICYgUEFST0REKSkKLQkJY3ZhbCB8PSBVQVJUX0xDUl9FUEFSOwotCWlmIChjZmxhZyAmIENNU1BBUikKLQkJY3ZhbCB8PSBVQVJUX0xDUl9TUEFSOwotCi0JaWYgKChpbmZvLT50eXBlID09IFBPUlRfODI1MCkgfHwgKGluZm8tPnR5cGUgPT0gUE9SVF8xNjQ1MCkpIHsKLQkJaWYgKGluZm8tPmJvYXJkLT5jaGlwX2ZsYWcpIHsKLQkJCWZjciA9IFVBUlRfRkNSX0VOQUJMRV9GSUZPOwotCQkJZmNyIHw9IE1PWEFfTVVTVF9GQ1JfR0RBX01PREVfRU5BQkxFOwotCQkJU0VUX01PWEFfTVVTVF9GSUZPX1ZBTFVFKGluZm8pOwotCQl9IGVsc2UKLQkJCWZjciA9IDA7Ci0JfSBlbHNlIHsKLQkJZmNyID0gVUFSVF9GQ1JfRU5BQkxFX0ZJRk87Ci0JCWlmIChpbmZvLT5ib2FyZC0+Y2hpcF9mbGFnKSB7Ci0JCQlmY3IgfD0gTU9YQV9NVVNUX0ZDUl9HREFfTU9ERV9FTkFCTEU7Ci0JCQlTRVRfTU9YQV9NVVNUX0ZJRk9fVkFMVUUoaW5mbyk7Ci0JCX0gZWxzZSB7Ci0JCQlzd2l0Y2ggKGluZm8tPnJ4X3RyaWdnZXIpIHsKLQkJCWNhc2UgMToKLQkJCQlmY3IgfD0gVUFSVF9GQ1JfVFJJR0dFUl8xOwotCQkJCWJyZWFrOwotCQkJY2FzZSA0OgotCQkJCWZjciB8PSBVQVJUX0ZDUl9UUklHR0VSXzQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDg6Ci0JCQkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfODsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfMTQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBDVFMgZmxvdyBjb250cm9sIGZsYWcgYW5kIG1vZGVtIHN0YXR1cyBpbnRlcnJ1cHRzICovCi0JaW5mby0+SUVSICY9IH5VQVJUX0lFUl9NU0k7Ci0JaW5mby0+TUNSICY9IH5VQVJUX01DUl9BRkU7Ci0JaWYgKGNmbGFnICYgQ1JUU0NUUykgewotCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19DVFNfRkxPVzsKLQkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX01TSTsKLQkJaWYgKChpbmZvLT50eXBlID09IFBPUlRfMTY1NTBBKSB8fCAoaW5mby0+Ym9hcmQtPmNoaXBfZmxhZykpIHsKLQkJCWluZm8tPk1DUiB8PSBVQVJUX01DUl9BRkU7Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0dXMgPSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9NU1IpOwotCQkJaWYgKGluZm8tPnR0eS0+aHdfc3RvcHBlZCkgewotCQkJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9DVFMpIHsKLQkJCQkJaW5mby0+dHR5LT5od19zdG9wcGVkID0gMDsKLQkJCQkJaWYgKGluZm8tPnR5cGUgIT0gUE9SVF8xNjU1MEEgJiYKLQkJCQkJCQkhaW5mby0+Ym9hcmQtPmNoaXBfZmxhZykgewotCQkJCQkJb3V0YihpbmZvLT5JRVIgJiB+VUFSVF9JRVJfVEhSSSwKLQkJCQkJCQlpbmZvLT5pb2FkZHIgKwotCQkJCQkJCVVBUlRfSUVSKTsKLQkJCQkJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOwotCQkJCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmlvYWRkciArCi0JCQkJCQkJCVVBUlRfSUVSKTsKLQkJCQkJfQotCQkJCQl0dHlfd2FrZXVwKGluZm8tPnR0eSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIShzdGF0dXMgJiBVQVJUX01TUl9DVFMpKSB7Ci0JCQkJCWluZm8tPnR0eS0+aHdfc3RvcHBlZCA9IDE7Ci0JCQkJCWlmICgoaW5mby0+dHlwZSAhPSBQT1JUXzE2NTUwQSkgJiYKLQkJCQkJCQkoIWluZm8tPmJvYXJkLT5jaGlwX2ZsYWcpKSB7Ci0JCQkJCQlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX1RIUkk7Ci0JCQkJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+aW9hZGRyICsKLQkJCQkJCQkJVUFSVF9JRVIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0NUU19GTE9XOwotCX0KLQlvdXRiKGluZm8tPk1DUiwgaW5mby0+aW9hZGRyICsgVUFSVF9NQ1IpOwotCWlmIChjZmxhZyAmIENMT0NBTCkgewotCQlpbmZvLT5mbGFncyAmPSB+QVNZTkNfQ0hFQ0tfQ0Q7Ci0JfSBlbHNlIHsKLQkJaW5mby0+ZmxhZ3MgfD0gQVNZTkNfQ0hFQ0tfQ0Q7Ci0JCWluZm8tPklFUiB8PSBVQVJUX0lFUl9NU0k7Ci0JfQotCW91dGIoaW5mby0+SUVSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUik7Ci0KLQkvKgotCSAqIFNldCB1cCBwYXJpdHkgY2hlY2sgZmxhZwotCSAqLwotCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgPSBVQVJUX0xTUl9PRSB8IFVBUlRfTFNSX1RIUkUgfCBVQVJUX0xTUl9EUjsKLQlpZiAoSV9JTlBDSyhpbmZvLT50dHkpKQotCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX0ZFIHwgVUFSVF9MU1JfUEU7Ci0JaWYgKElfQlJLSU5UKGluZm8tPnR0eSkgfHwgSV9QQVJNUksoaW5mby0+dHR5KSkKLQkJaW5mby0+cmVhZF9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9CSTsKLQotCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayA9IDA7Ci0KLQlpZiAoSV9JR05CUksoaW5mby0+dHR5KSkgewotCQlpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfQkk7Ci0JCWluZm8tPnJlYWRfc3RhdHVzX21hc2sgfD0gVUFSVF9MU1JfQkk7Ci0JCS8qCi0JCSAqIElmIHdlJ3JlIGlnbm9yZSBwYXJpdHkgYW5kIGJyZWFrIGluZGljYXRvcnMsIGlnbm9yZQotCQkgKiBvdmVycnVucyB0b28uICAoRm9yIHJlYWwgcmF3IHN1cHBvcnQpLgotCQkgKi8KLQkJaWYgKElfSUdOUEFSKGluZm8tPnR0eSkpIHsKLQkJCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayB8PQotCQkJCQkJVUFSVF9MU1JfT0UgfAotCQkJCQkJVUFSVF9MU1JfUEUgfAotCQkJCQkJVUFSVF9MU1JfRkU7Ci0JCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9Ci0JCQkJCQlVQVJUX0xTUl9PRSB8Ci0JCQkJCQlVQVJUX0xTUl9QRSB8Ci0JCQkJCQlVQVJUX0xTUl9GRTsKLQkJfQotCX0KLQlpZiAoaW5mby0+Ym9hcmQtPmNoaXBfZmxhZykgewotCQlTRVRfTU9YQV9NVVNUX1hPTjFfVkFMVUUoaW5mby0+aW9hZGRyLCBTVEFSVF9DSEFSKGluZm8tPnR0eSkpOwotCQlTRVRfTU9YQV9NVVNUX1hPRkYxX1ZBTFVFKGluZm8tPmlvYWRkciwgU1RPUF9DSEFSKGluZm8tPnR0eSkpOwotCQlpZiAoSV9JWE9OKGluZm8tPnR0eSkpIHsKLQkJCUVOQUJMRV9NT1hBX01VU1RfUlhfU09GVFdBUkVfRkxPV19DT05UUk9MKGluZm8tPmlvYWRkcik7Ci0JCX0gZWxzZSB7Ci0JCQlESVNBQkxFX01PWEFfTVVTVF9SWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woaW5mby0+aW9hZGRyKTsKLQkJfQotCQlpZiAoSV9JWE9GRihpbmZvLT50dHkpKSB7Ci0JCQlFTkFCTEVfTU9YQV9NVVNUX1RYX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChpbmZvLT5pb2FkZHIpOwotCQl9IGVsc2UgewotCQkJRElTQUJMRV9NT1hBX01VU1RfVFhfU09GVFdBUkVfRkxPV19DT05UUk9MKGluZm8tPmlvYWRkcik7Ci0JCX0KLQl9Ci0KLQotCW91dGIoZmNyLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0ZDUik7CS8qIHNldCBmY3IgKi8KLQlvdXRiKGN2YWwsIGluZm8tPmlvYWRkciArIFVBUlRfTENSKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG14c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhzdHJ1Y3QgbXhzZXJfcG9ydCAqcG9ydCwgaW50IHN0YXR1cykKLXsKLQkvKiB1cGRhdGUgaW5wdXQgbGluZSBjb3VudGVycyAqLwotCWlmIChzdGF0dXMgJiBVQVJUX01TUl9URVJJKQotCQlwb3J0LT5pY291bnQucm5nKys7Ci0JaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0REU1IpCi0JCXBvcnQtPmljb3VudC5kc3IrKzsKLQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRERDRCkKLQkJcG9ydC0+aWNvdW50LmRjZCsrOwotCWlmIChzdGF0dXMgJiBVQVJUX01TUl9EQ1RTKQotCQlwb3J0LT5pY291bnQuY3RzKys7Ci0JcG9ydC0+bW9uX2RhdGEubW9kZW1fc3RhdHVzID0gc3RhdHVzOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+ZGVsdGFfbXNyX3dhaXQpOwotCi0JaWYgKChwb3J0LT5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKSAmJiAoc3RhdHVzICYgVUFSVF9NU1JfRERDRCkpIHsKLQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDRCkKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+b3Blbl93YWl0KTsKLQl9Ci0KLQlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19DVFNfRkxPVykgewotCQlpZiAocG9ydC0+dHR5LT5od19zdG9wcGVkKSB7Ci0JCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfQ1RTKSB7Ci0JCQkJcG9ydC0+dHR5LT5od19zdG9wcGVkID0gMDsKLQotCQkJCWlmICgocG9ydC0+dHlwZSAhPSBQT1JUXzE2NTUwQSkgJiYKLQkJCQkJCSghcG9ydC0+Ym9hcmQtPmNoaXBfZmxhZykpIHsKLQkJCQkJb3V0Yihwb3J0LT5JRVIgJiB+VUFSVF9JRVJfVEhSSSwKLQkJCQkJCXBvcnQtPmlvYWRkciArIFVBUlRfSUVSKTsKLQkJCQkJcG9ydC0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7Ci0JCQkJCW91dGIocG9ydC0+SUVSLCBwb3J0LT5pb2FkZHIgKwotCQkJCQkJCVVBUlRfSUVSKTsKLQkJCQl9Ci0JCQkJdHR5X3dha2V1cChwb3J0LT50dHkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKCEoc3RhdHVzICYgVUFSVF9NU1JfQ1RTKSkgewotCQkJCXBvcnQtPnR0eS0+aHdfc3RvcHBlZCA9IDE7Ci0JCQkJaWYgKHBvcnQtPnR5cGUgIT0gUE9SVF8xNjU1MEEgJiYKLQkJCQkJCSFwb3J0LT5ib2FyZC0+Y2hpcF9mbGFnKSB7Ci0JCQkJCXBvcnQtPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKLQkJCQkJb3V0Yihwb3J0LT5JRVIsIHBvcnQtPmlvYWRkciArCi0JCQkJCQkJVUFSVF9JRVIpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KLQotc3RhdGljIGludCBteHNlcl9zdGFydHVwKHN0cnVjdCBteHNlcl9wb3J0ICppbmZvKQotewotCXVuc2lnbmVkIGxvbmcgcGFnZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JcGFnZSA9IF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKLQlpZiAoIXBhZ2UpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0KLQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgewotCQlmcmVlX3BhZ2UocGFnZSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICghaW5mby0+aW9hZGRyIHx8ICFpbmZvLT50eXBlKSB7Ci0JCWlmIChpbmZvLT50dHkpCi0JCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOwotCQlmcmVlX3BhZ2UocGFnZSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoaW5mby0+eG1pdF9idWYpCi0JCWZyZWVfcGFnZShwYWdlKTsKLQllbHNlCi0JCWluZm8tPnhtaXRfYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgcGFnZTsKLQotCS8qCi0JICogQ2xlYXIgdGhlIEZJRk8gYnVmZmVycyBhbmQgZGlzYWJsZSB0aGVtCi0JICogKHRoZXkgd2lsbCBiZSByZWVuYWJsZWQgaW4gbXhzZXJfY2hhbmdlX3NwZWVkKCkpCi0JICovCi0JaWYgKGluZm8tPmJvYXJkLT5jaGlwX2ZsYWcpCi0JCW91dGIoKFVBUlRfRkNSX0NMRUFSX1JDVlIgfAotCQkJVUFSVF9GQ1JfQ0xFQVJfWE1JVCB8Ci0JCQlNT1hBX01VU1RfRkNSX0dEQV9NT0RFX0VOQUJMRSksIGluZm8tPmlvYWRkciArIFVBUlRfRkNSKTsKLQllbHNlCi0JCW91dGIoKFVBUlRfRkNSX0NMRUFSX1JDVlIgfCBVQVJUX0ZDUl9DTEVBUl9YTUlUKSwKLQkJCWluZm8tPmlvYWRkciArIFVBUlRfRkNSKTsKLQotCS8qCi0JICogQXQgdGhpcyBwb2ludCB0aGVyZSdzIG5vIHdheSB0aGUgTFNSIGNvdWxkIHN0aWxsIGJlIDB4RkY7Ci0JICogaWYgaXQgaXMsIHRoZW4gYmFpbCBvdXQsIGJlY2F1c2UgdGhlcmUncyBsaWtlbHkgbm8gVUFSVAotCSAqIGhlcmUuCi0JICovCi0JaWYgKGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX0xTUikgPT0gMHhmZikgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCQlpZiAoY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewotCQkJaWYgKGluZm8tPnR0eSkKLQkJCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JLyoKLQkgKiBDbGVhciB0aGUgaW50ZXJydXB0IHJlZ2lzdGVycy4KLQkgKi8KLQkodm9pZCkgaW5iKGluZm8tPmlvYWRkciArIFVBUlRfTFNSKTsKLQkodm9pZCkgaW5iKGluZm8tPmlvYWRkciArIFVBUlRfUlgpOwotCSh2b2lkKSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9JSVIpOwotCSh2b2lkKSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9NU1IpOwotCi0JLyoKLQkgKiBOb3csIGluaXRpYWxpemUgdGhlIFVBUlQKLQkgKi8KLQlvdXRiKFVBUlRfTENSX1dMRU44LCBpbmZvLT5pb2FkZHIgKyBVQVJUX0xDUik7CS8qIHJlc2V0IERMQUIgKi8KLQlpbmZvLT5NQ1IgPSBVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFM7Ci0Jb3V0YihpbmZvLT5NQ1IsIGluZm8tPmlvYWRkciArIFVBUlRfTUNSKTsKLQotCS8qCi0JICogRmluYWxseSwgZW5hYmxlIGludGVycnVwdHMKLQkgKi8KLQlpbmZvLT5JRVIgPSBVQVJUX0lFUl9NU0kgfCBVQVJUX0lFUl9STFNJIHwgVUFSVF9JRVJfUkRJOwotCi0JaWYgKGluZm8tPmJvYXJkLT5jaGlwX2ZsYWcpCi0JCWluZm8tPklFUiB8PSBNT1hBX01VU1RfSUVSX0VHREFJOwotCW91dGIoaW5mby0+SUVSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUik7CS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCi0KLQkvKgotCSAqIEFuZCBjbGVhciB0aGUgaW50ZXJydXB0IHJlZ2lzdGVycyBhZ2FpbiBmb3IgbHVjay4KLQkgKi8KLQkodm9pZCkgaW5iKGluZm8tPmlvYWRkciArIFVBUlRfTFNSKTsKLQkodm9pZCkgaW5iKGluZm8tPmlvYWRkciArIFVBUlRfUlgpOwotCSh2b2lkKSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9JSVIpOwotCSh2b2lkKSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9NU1IpOwotCi0JaWYgKGluZm8tPnR0eSkKLQkJY2xlYXJfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOwotCWluZm8tPnhtaXRfY250ID0gaW5mby0+eG1pdF9oZWFkID0gaW5mby0+eG1pdF90YWlsID0gMDsKLQotCS8qCi0JICogYW5kIHNldCB0aGUgc3BlZWQgb2YgdGhlIHNlcmlhbCBwb3J0Ci0JICovCi0JbXhzZXJfY2hhbmdlX3NwZWVkKGluZm8sIE5VTEwpOwotCWluZm8tPmZsYWdzIHw9IEFTWU5DX0lOSVRJQUxJWkVEOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSB3aWxsIHNodXRkb3duIGEgc2VyaWFsIHBvcnQ7IGludGVycnVwdHMgbWF5YmUgZGlzYWJsZWQsIGFuZAotICogRFRSIGlzIGRyb3BwZWQgaWYgdGhlIGhhbmd1cCBvbiBjbG9zZSB0ZXJtaW8gZmxhZyBpcyBvbi4KLSAqLwotc3RhdGljIHZvaWQgbXhzZXJfc2h1dGRvd24oc3RydWN0IG14c2VyX3BvcnQgKmluZm8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQotCS8qCi0JICogY2xlYXIgZGVsdGFfbXNyX3dhaXQgcXVldWUgdG8gYXZvaWQgbWVtIGxlYWtzOiB3ZSBtYXkgZnJlZSB0aGUgaXJxCi0JICogaGVyZSBzbyB0aGUgcXVldWUgbWlnaHQgbmV2ZXIgYmUgd2FrZW4gdXAKLQkgKi8KLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmRlbHRhX21zcl93YWl0KTsKLQotCS8qCi0JICogRnJlZSB0aGUgSVJRLCBpZiBuZWNlc3NhcnkKLQkgKi8KLQlpZiAoaW5mby0+eG1pdF9idWYpIHsKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBpbmZvLT54bWl0X2J1Zik7Ci0JCWluZm8tPnhtaXRfYnVmID0gTlVMTDsKLQl9Ci0KLQlpbmZvLT5JRVIgPSAwOwotCW91dGIoMHgwMCwgaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOwotCi0JaWYgKCFpbmZvLT50dHkgfHwgKGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKSkKLQkJaW5mby0+TUNSICY9IH4oVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfUlRTKTsKLQlvdXRiKGluZm8tPk1DUiwgaW5mby0+aW9hZGRyICsgVUFSVF9NQ1IpOwotCi0JLyogY2xlYXIgUngvVHggRklGTydzICovCi0JaWYgKGluZm8tPmJvYXJkLT5jaGlwX2ZsYWcpCi0JCW91dGIoVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8IFVBUlRfRkNSX0NMRUFSX1hNSVQgfAotCQkJCU1PWEFfTVVTVF9GQ1JfR0RBX01PREVfRU5BQkxFLAotCQkJCWluZm8tPmlvYWRkciArIFVBUlRfRkNSKTsKLQllbHNlCi0JCW91dGIoVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8IFVBUlRfRkNSX0NMRUFSX1hNSVQsCi0JCQlpbmZvLT5pb2FkZHIgKyBVQVJUX0ZDUik7Ci0KLQkvKiByZWFkIGRhdGEgcG9ydCB0byByZXNldCB0aGluZ3MgKi8KLQkodm9pZCkgaW5iKGluZm8tPmlvYWRkciArIFVBUlRfUlgpOwotCi0JaWYgKGluZm8tPnR0eSkKLQkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKLQotCWluZm8tPmZsYWdzICY9IH5BU1lOQ19JTklUSUFMSVpFRDsKLQotCWlmIChpbmZvLT5ib2FyZC0+Y2hpcF9mbGFnKQotCQlTRVRfTU9YQV9NVVNUX05PX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChpbmZvLT5pb2FkZHIpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBzZXJpYWwgcG9ydCBpcyBvcGVuZWQuICBJdAotICogZW5hYmxlcyBpbnRlcnJ1cHRzIGZvciBhIHNlcmlhbCBwb3J0LCBsaW5raW5nIGluIGl0cyBhc3luYyBzdHJ1Y3R1cmUgaW50bwotICogdGhlIElSUSBjaGFpbi4gICBJdCBhbHNvIHBlcmZvcm1zIHRoZSBzZXJpYWwtc3BlY2lmaWMKLSAqIGluaXRpYWxpemF0aW9uIGZvciB0aGUgdHR5IHN0cnVjdHVyZS4KLSAqLwotc3RhdGljIGludCBteHNlcl9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQotewotCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldHZhbCwgbGluZTsKLQotCWxpbmUgPSB0dHktPmluZGV4OwotCWlmIChsaW5lID09IE1YU0VSX1BPUlRTKQotCQlyZXR1cm4gMDsKLQlpZiAobGluZSA8IDAgfHwgbGluZSA+IE1YU0VSX1BPUlRTKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlpbmZvID0gJm14c2VyX2JvYXJkc1tsaW5lIC8gTVhTRVJfUE9SVFNfUEVSX0JPQVJEXS5wb3J0c1tsaW5lICUgTVhTRVJfUE9SVFNfUEVSX0JPQVJEXTsKLQlpZiAoIWluZm8tPmlvYWRkcikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQl0dHktPmRyaXZlcl9kYXRhID0gaW5mbzsKLQlpbmZvLT50dHkgPSB0dHk7Ci0JLyoKLQkgKiBTdGFydCB1cCBzZXJpYWwgcG9ydAotCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCWluZm8tPmNvdW50Kys7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQlyZXR2YWwgPSBteHNlcl9zdGFydHVwKGluZm8pOwotCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7Ci0KLQlyZXR2YWwgPSBteHNlcl9ibG9ja190aWxfcmVhZHkodHR5LCBmaWxwLCBpbmZvKTsKLQlpZiAocmV0dmFsKQotCQlyZXR1cm4gcmV0dmFsOwotCi0JLyogdW5tYXJrIGhlcmUgZm9yIHZlcnkgaGlnaCBiYXVkIHJhdGUgKGV4LiA5MjE2MDAgYnBzKSB1c2VkICovCi0JdHR5LT5sb3dfbGF0ZW5jeSA9IDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gdGhlIHNlcmlhbCBwb3J0IGdldHMgY2xvc2VkLiAgRmlyc3QsIHdlCi0gKiB3YWl0IGZvciB0aGUgbGFzdCByZW1haW5pbmcgZGF0YSB0byBiZSBzZW50LiAgVGhlbiwgd2UgdW5saW5rIGl0cwotICogYXN5bmMgc3RydWN0dXJlIGZyb20gdGhlIGludGVycnVwdCBjaGFpbiBpZiBuZWNlc3NhcnksIGFuZCB3ZSBmcmVlCi0gKiB0aGF0IElSUSBpZiBub3RoaW5nIGlzIGxlZnQgaW4gdGhlIGNoYWluLgotICovCi1zdGF0aWMgdm9pZCBteHNlcl9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKLXsKLQlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0KLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICh0dHktPmluZGV4ID09IE1YU0VSX1BPUlRTKQotCQlyZXR1cm47Ci0JaWYgKCFpbmZvKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQotCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCh0dHktPmNvdW50ID09IDEpICYmIChpbmZvLT5jb3VudCAhPSAxKSkgewotCQkvKgotCQkgKiBVaCwgb2guICB0dHktPmNvdW50IGlzIDEsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHR0eQotCQkgKiBzdHJ1Y3R1cmUgd2lsbCBiZSBmcmVlZC4gIEluZm8tPmNvdW50IHNob3VsZCBhbHdheXMKLQkJICogYmUgb25lIGluIHRoZXNlIGNvbmRpdGlvbnMuICBJZiBpdCdzIGdyZWF0ZXIgdGhhbgotCQkgKiBvbmUsIHdlJ3ZlIGdvdCByZWFsIHByb2JsZW1zLCBzaW5jZSBpdCBtZWFucyB0aGUKLQkJICogc2VyaWFsIHBvcnQgd29uJ3QgYmUgc2h1dGRvd24uCi0JCSAqLwotCQlwcmludGsoS0VSTl9FUlIgIm14c2VyX2Nsb3NlOiBiYWQgc2VyaWFsIHBvcnQgY291bnQ7ICIKLQkJCSJ0dHktPmNvdW50IGlzIDEsIGluZm8tPmNvdW50IGlzICVkXG4iLCBpbmZvLT5jb3VudCk7Ci0JCWluZm8tPmNvdW50ID0gMTsKLQl9Ci0JaWYgKC0taW5mby0+Y291bnQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibXhzZXJfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudCBmb3IgIgotCQkJInR0eXMlZDogJWRcbiIsIHR0eS0+aW5kZXgsIGluZm8tPmNvdW50KTsKLQkJaW5mby0+Y291bnQgPSAwOwotCX0KLQlpZiAoaW5mby0+Y291bnQpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQlpbmZvLT5mbGFncyB8PSBBU1lOQ19DTE9TSU5HOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBTYXZlIHRoZSB0ZXJtaW9zIHN0cnVjdHVyZSwgc2luY2UgdGhpcyBwb3J0IG1heSBoYXZlCi0JICogc2VwYXJhdGUgdGVybWlvcyBmb3IgY2FsbG91dCBhbmQgZGlhbGluLgotCSAqLwotCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX05PUk1BTF9BQ1RJVkUpCi0JCWluZm8tPm5vcm1hbF90ZXJtaW9zID0gKnR0eS0+dGVybWlvczsKLQkvKgotCSAqIE5vdyB3ZSB3YWl0IGZvciB0aGUgdHJhbnNtaXQgYnVmZmVyIHRvIGNsZWFyOyBhbmQgd2Ugbm90aWZ5Ci0JICogdGhlIGxpbmUgZGlzY2lwbGluZSB0byBvbmx5IHByb2Nlc3MgWE9OL1hPRkYgY2hhcmFjdGVycy4KLQkgKi8KLQl0dHktPmNsb3NpbmcgPSAxOwotCWlmIChpbmZvLT5jbG9zaW5nX3dhaXQgIT0gQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUpCi0JCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCBpbmZvLT5jbG9zaW5nX3dhaXQpOwotCS8qCi0JICogQXQgdGhpcyBwb2ludCB3ZSBzdG9wIGFjY2VwdGluZyBpbnB1dC4gIFRvIGRvIHRoaXMsIHdlCi0JICogZGlzYWJsZSB0aGUgcmVjZWl2ZSBsaW5lIHN0YXR1cyBpbnRlcnJ1cHRzLCBhbmQgdGVsbCB0aGUKLQkgKiBpbnRlcnJ1cHQgZHJpdmVyIHRvIHN0b3AgY2hlY2tpbmcgdGhlIGRhdGEgcmVhZHkgYml0IGluIHRoZQotCSAqIGxpbmUgc3RhdHVzIHJlZ2lzdGVyLgotCSAqLwotCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfUkxTSTsKLQlpZiAoaW5mby0+Ym9hcmQtPmNoaXBfZmxhZykKLQkJaW5mby0+SUVSICY9IH5NT1hBX01VU1RfUkVDVl9JU1I7Ci0KLQlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgewotCQlvdXRiKGluZm8tPklFUiwgaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOwotCQkvKgotCQkgKiBCZWZvcmUgd2UgZHJvcCBEVFIsIG1ha2Ugc3VyZSB0aGUgVUFSVCB0cmFuc21pdHRlcgotCQkgKiBoYXMgY29tcGxldGVseSBkcmFpbmVkOyB0aGlzIGlzIGVzcGVjaWFsbHkKLQkJICogaW1wb3J0YW50IGlmIHRoZXJlIGlzIGEgdHJhbnNtaXQgRklGTyEKLQkJICovCi0JCXRpbWVvdXQgPSBqaWZmaWVzICsgSFo7Ci0JCXdoaWxlICghKGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX0xTUikgJiBVQVJUX0xTUl9URU1UKSkgewotCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDUpOwotCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JbXhzZXJfc2h1dGRvd24oaW5mbyk7Ci0KLQlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikKLQkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOwotCi0JdHR5X2xkaXNjX2ZsdXNoKHR0eSk7Ci0KLQl0dHktPmNsb3NpbmcgPSAwOwotCWluZm8tPmV2ZW50ID0gMDsKLQlpbmZvLT50dHkgPSBOVUxMOwotCWlmIChpbmZvLT5ibG9ja2VkX29wZW4pIHsKLQkJaWYgKGluZm8tPmNsb3NlX2RlbGF5KQotCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKGluZm8tPmNsb3NlX2RlbGF5KTsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOwotCX0KLQotCWluZm8tPmZsYWdzICY9IH4oQVNZTkNfTk9STUFMX0FDVElWRSB8IEFTWU5DX0NMT1NJTkcpOwotfQotCi1zdGF0aWMgaW50IG14c2VyX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQotewotCWludCBjLCB0b3RhbCA9IDA7Ci0Jc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIWluZm8tPnhtaXRfYnVmKQotCQlyZXR1cm4gMDsKLQotCXdoaWxlICgxKSB7Ci0JCWMgPSBtaW5fdChpbnQsIGNvdW50LCBtaW4oU0VSSUFMX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfY250IC0gMSwKLQkJCQkJICBTRVJJQUxfWE1JVF9TSVpFIC0gaW5mby0+eG1pdF9oZWFkKSk7Ci0JCWlmIChjIDw9IDApCi0JCQlicmVhazsKLQotCQltZW1jcHkoaW5mby0+eG1pdF9idWYgKyBpbmZvLT54bWl0X2hlYWQsIGJ1ZiwgYyk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCQlpbmZvLT54bWl0X2hlYWQgPSAoaW5mby0+eG1pdF9oZWFkICsgYykgJgotCQkJCSAgKFNFUklBTF9YTUlUX1NJWkUgLSAxKTsKLQkJaW5mby0+eG1pdF9jbnQgKz0gYzsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQotCQlidWYgKz0gYzsKLQkJY291bnQgLT0gYzsKLQkJdG90YWwgKz0gYzsKLQl9Ci0KLQlpZiAoaW5mby0+eG1pdF9jbnQgJiYgIXR0eS0+c3RvcHBlZCkgewotCQlpZiAoIXR0eS0+aHdfc3RvcHBlZCB8fAotCQkJCShpbmZvLT50eXBlID09IFBPUlRfMTY1NTBBKSB8fAotCQkJCShpbmZvLT5ib2FyZC0+Y2hpcF9mbGFnKSkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0JCQlvdXRiKGluZm8tPklFUiAmIH5VQVJUX0lFUl9USFJJLCBpbmZvLT5pb2FkZHIgKwotCQkJCQlVQVJUX0lFUik7Ci0JCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKLQkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUik7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCQl9Ci0JfQotCXJldHVybiB0b3RhbDsKLX0KLQotc3RhdGljIHZvaWQgbXhzZXJfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjaCkKLXsKLQlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghaW5mby0+eG1pdF9idWYpCi0JCXJldHVybjsKLQotCWlmIChpbmZvLT54bWl0X2NudCA+PSBTRVJJQUxfWE1JVF9TSVpFIC0gMSkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0JaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF9oZWFkKytdID0gY2g7Ci0JaW5mby0+eG1pdF9oZWFkICY9IFNFUklBTF9YTUlUX1NJWkUgLSAxOwotCWluZm8tPnhtaXRfY250Kys7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQlpZiAoIXR0eS0+c3RvcHBlZCkgewotCQlpZiAoIXR0eS0+aHdfc3RvcHBlZCB8fAotCQkJCShpbmZvLT50eXBlID09IFBPUlRfMTY1NTBBKSB8fAotCQkJCWluZm8tPmJvYXJkLT5jaGlwX2ZsYWcpIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCQkJb3V0YihpbmZvLT5JRVIgJiB+VUFSVF9JRVJfVEhSSSwgaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOwotCQkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7Ci0JCQlvdXRiKGluZm8tPklFUiwgaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQkJfQotCX0KLX0KLQotCi1zdGF0aWMgdm9pZCBteHNlcl9mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGluZm8tPnhtaXRfY250IDw9IDAgfHwKLQkJCXR0eS0+c3RvcHBlZCB8fAotCQkJIWluZm8tPnhtaXRfYnVmIHx8Ci0JCQkodHR5LT5od19zdG9wcGVkICYmCi0JCQkgKGluZm8tPnR5cGUgIT0gUE9SVF8xNjU1MEEpICYmCi0JCQkgKCFpbmZvLT5ib2FyZC0+Y2hpcF9mbGFnKQotCQkJKSkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0KLQlvdXRiKGluZm8tPklFUiAmIH5VQVJUX0lFUl9USFJJLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUik7Ci0JaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7Ci0Jb3V0YihpbmZvLT5JRVIsIGluZm8tPmlvYWRkciArIFVBUlRfSUVSKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgbXhzZXJfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gU0VSSUFMX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfY250IC0gMTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0ID0gMDsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG14c2VyX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlyZXR1cm4gaW5mby0+eG1pdF9jbnQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG14c2VyX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKLQljaGFyIGZjcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQlpbmZvLT54bWl0X2NudCA9IGluZm8tPnhtaXRfaGVhZCA9IGluZm8tPnhtaXRfdGFpbCA9IDA7Ci0KLQlmY3IgPSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9GQ1IpOwotCW91dGIoKGZjciB8IFVBUlRfRkNSX0NMRUFSX1JDVlIgfCBVQVJUX0ZDUl9DTEVBUl9YTUlUKSwKLQkJaW5mby0+aW9hZGRyICsgVUFSVF9GQ1IpOwotCW91dGIoZmNyLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0ZDUik7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCi0JdHR5X3dha2V1cCh0dHkpOwotfQotCi0vKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBmcmllbmRzIG9mIG14c2VyX2lvY3RsKCkKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi1zdGF0aWMgaW50IG14c2VyX2dldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbywKLQkJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpyZXRpbmZvKQotewotCXN0cnVjdCBzZXJpYWxfc3RydWN0IHRtcDsKLQotCWlmICghcmV0aW5mbykKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKLQl0bXAudHlwZSA9IGluZm8tPnR5cGU7Ci0JdG1wLmxpbmUgPSBpbmZvLT50dHktPmluZGV4OwotCXRtcC5wb3J0ID0gaW5mby0+aW9hZGRyOwotCXRtcC5pcnEgPSBpbmZvLT5ib2FyZC0+aXJxOwotCXRtcC5mbGFncyA9IGluZm8tPmZsYWdzOwotCXRtcC5iYXVkX2Jhc2UgPSBpbmZvLT5iYXVkX2Jhc2U7Ci0JdG1wLmNsb3NlX2RlbGF5ID0gaW5mby0+Y2xvc2VfZGVsYXk7Ci0JdG1wLmNsb3Npbmdfd2FpdCA9IGluZm8tPmNsb3Npbmdfd2FpdDsKLQl0bXAuY3VzdG9tX2Rpdmlzb3IgPSBpbmZvLT5jdXN0b21fZGl2aXNvcjsKLQl0bXAuaHViNiA9IDA7Ci0JaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YoKnJldGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXhzZXJfc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBteHNlcl9wb3J0ICppbmZvLAotCQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKm5ld19pbmZvKQotewotCXN0cnVjdCBzZXJpYWxfc3RydWN0IG5ld19zZXJpYWw7Ci0JdW5zaWduZWQgbG9uZyBzbF9mbGFnczsKLQl1bnNpZ25lZCBpbnQgZmxhZ3M7Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQlpZiAoIW5ld19pbmZvIHx8ICFpbmZvLT5pb2FkZHIpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X3NlcmlhbCwgbmV3X2luZm8sIHNpemVvZihuZXdfc2VyaWFsKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKChuZXdfc2VyaWFsLmlycSAhPSBpbmZvLT5ib2FyZC0+aXJxKSB8fAotCQkJKG5ld19zZXJpYWwucG9ydCAhPSBpbmZvLT5pb2FkZHIpIHx8Ci0JCQkobmV3X3NlcmlhbC5jdXN0b21fZGl2aXNvciAhPSBpbmZvLT5jdXN0b21fZGl2aXNvcikgfHwKLQkJCShuZXdfc2VyaWFsLmJhdWRfYmFzZSAhPSBpbmZvLT5iYXVkX2Jhc2UpKQotCQlyZXR1cm4gLUVQRVJNOwotCi0JZmxhZ3MgPSBpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLOwotCi0JaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7Ci0JCWlmICgobmV3X3NlcmlhbC5iYXVkX2Jhc2UgIT0gaW5mby0+YmF1ZF9iYXNlKSB8fAotCQkJCShuZXdfc2VyaWFsLmNsb3NlX2RlbGF5ICE9IGluZm8tPmNsb3NlX2RlbGF5KSB8fAotCQkJCSgobmV3X3NlcmlhbC5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgIT0gKGluZm8tPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSkpCi0JCQlyZXR1cm4gLUVQRVJNOwotCQlpbmZvLT5mbGFncyA9ICgoaW5mby0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spIHwKLQkJCQkobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX1VTUl9NQVNLKSk7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogT0ssIHBhc3QgdGhpcyBwb2ludCwgYWxsIHRoZSBlcnJvciBjaGVja2luZyBoYXMgYmVlbiBkb25lLgotCQkgKiBBdCB0aGlzIHBvaW50LCB3ZSBzdGFydCBtYWtpbmcgY2hhbmdlcy4uLi4uCi0JCSAqLwotCQlpbmZvLT5mbGFncyA9ICgoaW5mby0+ZmxhZ3MgJiB+QVNZTkNfRkxBR1MpIHwKLQkJCQkobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX0ZMQUdTKSk7Ci0JCWluZm8tPmNsb3NlX2RlbGF5ID0gbmV3X3NlcmlhbC5jbG9zZV9kZWxheSAqIEhaIC8gMTAwOwotCQlpbmZvLT5jbG9zaW5nX3dhaXQgPSBuZXdfc2VyaWFsLmNsb3Npbmdfd2FpdCAqIEhaIC8gMTAwOwotCQlpbmZvLT50dHktPmxvd19sYXRlbmN5ID0KLQkJCQkoaW5mby0+ZmxhZ3MgJiBBU1lOQ19MT1dfTEFURU5DWSkgPyAxIDogMDsKLQkJaW5mby0+dHR5LT5sb3dfbGF0ZW5jeSA9IDA7Ci0JfQotCi0JaW5mby0+dHlwZSA9IG5ld19zZXJpYWwudHlwZTsKLQotCXByb2Nlc3NfdHhyeF9maWZvKGluZm8pOwotCi0JaWYgKGluZm8tPmZsYWdzICYgQVNZTkNfSU5JVElBTElaRUQpIHsKLQkJaWYgKGZsYWdzICE9IChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBzbF9mbGFncyk7Ci0JCQlteHNlcl9jaGFuZ2Vfc3BlZWQoaW5mbywgTlVMTCk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgc2xfZmxhZ3MpOwotCQl9Ci0JfSBlbHNlCi0JCXJldHZhbCA9IG14c2VyX3N0YXJ0dXAoaW5mbyk7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKgotICogbXhzZXJfZ2V0X2xzcl9pbmZvIC0gZ2V0IGxpbmUgc3RhdHVzIHJlZ2lzdGVyIGluZm8KLSAqCi0gKiBQdXJwb3NlOiBMZXQgdXNlciBjYWxsIGlvY3RsKCkgdG8gZ2V0IGluZm8gd2hlbiB0aGUgVUFSVCBwaHlzaWNhbGx5Ci0gKgkgICAgaXMgZW1wdGllZC4gIE9uIGJ1cyB0eXBlcyBsaWtlIFJTNDg1LCB0aGUgdHJhbnNtaXR0ZXIgbXVzdAotICoJICAgIHJlbGVhc2UgdGhlIGJ1cyBhZnRlciB0cmFuc21pdHRpbmcuIFRoaXMgbXVzdCBiZSBkb25lIHdoZW4KLSAqCSAgICB0aGUgdHJhbnNtaXQgc2hpZnQgcmVnaXN0ZXIgaXMgZW1wdHksIG5vdCBiZSBkb25lIHdoZW4gdGhlCi0gKgkgICAgdHJhbnNtaXQgaG9sZGluZyByZWdpc3RlciBpcyBlbXB0eS4gIFRoaXMgZnVuY3Rpb25hbGl0eQotICoJICAgIGFsbG93cyBhbiBSUzQ4NSBkcml2ZXIgdG8gYmUgd3JpdHRlbiBpbiB1c2VyIHNwYWNlLgotICovCi1zdGF0aWMgaW50IG14c2VyX2dldF9sc3JfaW5mbyhzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbywKLQkJdW5zaWduZWQgaW50IF9fdXNlciAqdmFsdWUpCi17Ci0JdW5zaWduZWQgY2hhciBzdGF0dXM7Ci0JdW5zaWduZWQgaW50IHJlc3VsdDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0Jc3RhdHVzID0gaW5iKGluZm8tPmlvYWRkciArIFVBUlRfTFNSKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCXJlc3VsdCA9ICgoc3RhdHVzICYgVUFSVF9MU1JfVEVNVCkgPyBUSU9DU0VSX1RFTVQgOiAwKTsKLQlyZXR1cm4gcHV0X3VzZXIocmVzdWx0LCB2YWx1ZSk7Ci19Ci0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgc2VuZHMgYSBicmVhayBjaGFyYWN0ZXIgb3V0IHRoZSBzZXJpYWwgcG9ydC4KLSAqLwotc3RhdGljIHZvaWQgbXhzZXJfc2VuZF9icmVhayhzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbywgaW50IGR1cmF0aW9uKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIWluZm8tPmlvYWRkcikKLQkJcmV0dXJuOwotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0Jb3V0YihpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9MQ1IpIHwgVUFSVF9MQ1JfU0JDLAotCQlpbmZvLT5pb2FkZHIgKyBVQVJUX0xDUik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQlzY2hlZHVsZV90aW1lb3V0KGR1cmF0aW9uKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQlvdXRiKGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX0xDUikgJiB+VUFSVF9MQ1JfU0JDLAotCQlpbmZvLT5pb2FkZHIgKyBVQVJUX0xDUik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGludCBteHNlcl90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgY2hhciBjb250cm9sLCBzdGF0dXM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCi0JaWYgKHR0eS0+aW5kZXggPT0gTVhTRVJfUE9SVFMpCi0JCXJldHVybiAtRU5PSU9DVExDTUQ7Ci0JaWYgKHRlc3RfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpKQotCQlyZXR1cm4gLUVJTzsKLQotCWNvbnRyb2wgPSBpbmZvLT5NQ1I7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQlzdGF0dXMgPSBpbmIoaW5mby0+aW9hZGRyICsgVUFSVF9NU1IpOwotCWlmIChzdGF0dXMgJiBVQVJUX01TUl9BTllfREVMVEEpCi0JCW14c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhpbmZvLCBzdGF0dXMpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0JcmV0dXJuICgoY29udHJvbCAmIFVBUlRfTUNSX1JUUykgPyBUSU9DTV9SVFMgOiAwKSB8Ci0JCSAgICAoKGNvbnRyb2wgJiBVQVJUX01DUl9EVFIpID8gVElPQ01fRFRSIDogMCkgfAotCQkgICAgKChzdGF0dXMgJiBVQVJUX01TUl9EQ0QpID8gVElPQ01fQ0FSIDogMCkgfAotCQkgICAgKChzdGF0dXMgJiBVQVJUX01TUl9SSSkgPyBUSU9DTV9STkcgOiAwKSB8Ci0JCSAgICAoKHN0YXR1cyAmIFVBUlRfTVNSX0RTUikgPyBUSU9DTV9EU1IgOiAwKSB8Ci0JCSAgICAoKHN0YXR1cyAmIFVBUlRfTVNSX0NUUykgPyBUSU9DTV9DVFMgOiAwKTsKLX0KLQotc3RhdGljIGludCBteHNlcl90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQotewotCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0KLQlpZiAodHR5LT5pbmRleCA9PSBNWFNFUl9QT1JUUykKLQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKLQlpZiAodGVzdF9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncykpCi0JCXJldHVybiAtRUlPOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0KLQlpZiAoc2V0ICYgVElPQ01fUlRTKQotCQlpbmZvLT5NQ1IgfD0gVUFSVF9NQ1JfUlRTOwotCWlmIChzZXQgJiBUSU9DTV9EVFIpCi0JCWluZm8tPk1DUiB8PSBVQVJUX01DUl9EVFI7Ci0KLQlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpCi0JCWluZm8tPk1DUiAmPSB+VUFSVF9NQ1JfUlRTOwotCWlmIChjbGVhciAmIFRJT0NNX0RUUikKLQkJaW5mby0+TUNSICY9IH5VQVJUX01DUl9EVFI7Ci0KLQlvdXRiKGluZm8tPk1DUiwgaW5mby0+aW9hZGRyICsgVUFSVF9NQ1IpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IG14c2VyX3Byb2dyYW1fbW9kZShpbnQgcG9ydCkKLXsKLQlpbnQgaWQsIGksIGosIG47Ci0KLQlvdXRiKDAsIHBvcnQpOwotCW91dGIoMCwgcG9ydCk7Ci0Jb3V0YigwLCBwb3J0KTsKLQkodm9pZClpbmIocG9ydCk7Ci0JKHZvaWQpaW5iKHBvcnQpOwotCW91dGIoMCwgcG9ydCk7Ci0JKHZvaWQpaW5iKHBvcnQpOwotCi0JaWQgPSBpbmIocG9ydCArIDEpICYgMHgxRjsKLQlpZiAoKGlkICE9IEMxNjhfQVNJQ19JRCkgJiYKLQkJCShpZCAhPSBDMTA0X0FTSUNfSUQpICYmCi0JCQkoaWQgIT0gQzEwMl9BU0lDX0lEKSAmJgotCQkJKGlkICE9IENJMTMyX0FTSUNfSUQpICYmCi0JCQkoaWQgIT0gQ0kxMzRfQVNJQ19JRCkgJiYKLQkJCShpZCAhPSBDSTEwNEpfQVNJQ19JRCkpCi0JCXJldHVybiAtMTsKLQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IDQ7IGkrKykgewotCQluID0gaW5iKHBvcnQgKyAyKTsKLQkJaWYgKG4gPT0gJ00nKSB7Ci0JCQlqID0gMTsKLQkJfSBlbHNlIGlmICgoaiA9PSAxKSAmJiAobiA9PSAxKSkgewotCQkJaiA9IDI7Ci0JCQlicmVhazsKLQkJfSBlbHNlCi0JCQlqID0gMDsKLQl9Ci0JaWYgKGogIT0gMikKLQkJaWQgPSAtMjsKLQlyZXR1cm4gaWQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBteHNlcl9ub3JtYWxfbW9kZShpbnQgcG9ydCkKLXsKLQlpbnQgaSwgbjsKLQotCW91dGIoMHhBNSwgcG9ydCArIDEpOwotCW91dGIoMHg4MCwgcG9ydCArIDMpOwotCW91dGIoMTIsIHBvcnQgKyAwKTsJLyogOTYwMCBicHMgKi8KLQlvdXRiKDAsIHBvcnQgKyAxKTsKLQlvdXRiKDB4MDMsIHBvcnQgKyAzKTsJLyogOCBkYXRhIGJpdHMgKi8KLQlvdXRiKDB4MTMsIHBvcnQgKyA0KTsJLyogbG9vcCBiYWNrIG1vZGUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQluID0gaW5iKHBvcnQgKyA1KTsKLQkJaWYgKChuICYgMHg2MSkgPT0gMHg2MCkKLQkJCWJyZWFrOwotCQlpZiAoKG4gJiAxKSA9PSAxKQotCQkJKHZvaWQpaW5iKHBvcnQpOwotCX0KLQlvdXRiKDB4MDAsIHBvcnQgKyA0KTsKLX0KLQotI2RlZmluZSBDSElQX1NLIAkweDAxCS8qIFNlcmlhbCBEYXRhIENsb2NrICBpbiBFcHJvbSAqLwotI2RlZmluZSBDSElQX0RPIAkweDAyCS8qIFNlcmlhbCBEYXRhIE91dHB1dCBpbiBFcHJvbSAqLwotI2RlZmluZSBDSElQX0NTIAkweDA0CS8qIFNlcmlhbCBDaGlwIFNlbGVjdCBpbiBFcHJvbSAqLwotI2RlZmluZSBDSElQX0RJIAkweDA4CS8qIFNlcmlhbCBEYXRhIElucHV0ICBpbiBFcHJvbSAqLwotI2RlZmluZSBFTl9DQ01EIAkweDAwMAkvKiBDaGlwJ3MgY29tbWFuZCByZWdpc3RlciAgICAgKi8KLSNkZWZpbmUgRU4wX1JTQVJMTwkweDAwOAkvKiBSZW1vdGUgc3RhcnQgYWRkcmVzcyByZWcgMCAgKi8KLSNkZWZpbmUgRU4wX1JTQVJISQkweDAwOQkvKiBSZW1vdGUgc3RhcnQgYWRkcmVzcyByZWcgMSAgKi8KLSNkZWZpbmUgRU4wX1JDTlRMTwkweDAwQQkvKiBSZW1vdGUgYnl0ZSBjb3VudCByZWcgV1IgICAgKi8KLSNkZWZpbmUgRU4wX1JDTlRISQkweDAwQgkvKiBSZW1vdGUgYnl0ZSBjb3VudCByZWcgV1IgICAgKi8KLSNkZWZpbmUgRU4wX0RDRkcJMHgwMEUJLyogRGF0YSBjb25maWd1cmF0aW9uIHJlZyBXUiAgICovCi0jZGVmaW5lIEVOMF9QT1JUCTB4MDEwCS8qIFJjdiBtaXNzZWQgZnJhbWUgZXJyb3IgY291bnRlciBSRCAqLwotI2RlZmluZSBFTkNfUEFHRTAJMHgwMDAJLyogU2VsZWN0IHBhZ2UgMCBvZiBjaGlwIHJlZ2lzdGVycyAgICovCi0jZGVmaW5lIEVOQ19QQUdFMwkweDBDMAkvKiBTZWxlY3QgcGFnZSAzIG9mIGNoaXAgcmVnaXN0ZXJzICAgKi8KLXN0YXRpYyBpbnQgX19pbml0IG14c2VyX3JlYWRfcmVnaXN0ZXIoaW50IHBvcnQsIHVuc2lnbmVkIHNob3J0ICpyZWdzKQotewotCWludCBpLCBrLCB2YWx1ZSwgaWQ7Ci0JdW5zaWduZWQgaW50IGo7Ci0KLQlpZCA9IG14c2VyX3Byb2dyYW1fbW9kZShwb3J0KTsKLQlpZiAoaWQgPCAwKQotCQlyZXR1cm4gaWQ7Ci0JZm9yIChpID0gMDsgaSA8IDE0OyBpKyspIHsKLQkJayA9IChpICYgMHgzRikgfCAweDE4MDsKLQkJZm9yIChqID0gMHgxMDA7IGogPiAwOyBqID4+PSAxKSB7Ci0JCQlvdXRiKENISVBfQ1MsIHBvcnQpOwotCQkJaWYgKGsgJiBqKSB7Ci0JCQkJb3V0YihDSElQX0NTIHwgQ0hJUF9ETywgcG9ydCk7Ci0JCQkJb3V0YihDSElQX0NTIHwgQ0hJUF9ETyB8IENISVBfU0ssIHBvcnQpOwkvKiBBPyBiaXQgb2YgcmVhZCAqLwotCQkJfSBlbHNlIHsKLQkJCQlvdXRiKENISVBfQ1MsIHBvcnQpOwotCQkJCW91dGIoQ0hJUF9DUyB8IENISVBfU0ssIHBvcnQpOwkvKiBBPyBiaXQgb2YgcmVhZCAqLwotCQkJfQotCQl9Ci0JCSh2b2lkKWluYihwb3J0KTsKLQkJdmFsdWUgPSAwOwotCQlmb3IgKGsgPSAwLCBqID0gMHg4MDAwOyBrIDwgMTY7IGsrKywgaiA+Pj0gMSkgewotCQkJb3V0YihDSElQX0NTLCBwb3J0KTsKLQkJCW91dGIoQ0hJUF9DUyB8IENISVBfU0ssIHBvcnQpOwotCQkJaWYgKGluYihwb3J0KSAmIENISVBfREkpCi0JCQkJdmFsdWUgfD0gajsKLQkJfQotCQlyZWdzW2ldID0gdmFsdWU7Ci0JCW91dGIoMCwgcG9ydCk7Ci0JfQotCW14c2VyX25vcm1hbF9tb2RlKHBvcnQpOwotCXJldHVybiBpZDsKLX0KLQotc3RhdGljIGludCBteHNlcl9pb2N0bF9zcGVjaWFsKHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmdwKQotewotCXN0cnVjdCBteHNlcl9wb3J0ICpwb3J0OwotCWludCByZXN1bHQsIHN0YXR1czsKLQl1bnNpZ25lZCBpbnQgaSwgajsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBNT1hBX0dFVF9DT05GOgotLyoJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgbXhzZXJjZmcsCi0JCQkJc2l6ZW9mKHN0cnVjdCBteHNlcl9od2NvbmYpICogNCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIDA7Ki8KLQkJcmV0dXJuIC1FTlhJTzsKLQljYXNlIE1PWEFfR0VUX01BSk9SOgotCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ0dHltYWpvciwgc2l6ZW9mKGludCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOwotCi0JY2FzZSBNT1hBX0dFVF9DVU1BSk9SOgotCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZjYWxsb3V0bWFqb3IsIHNpemVvZihpbnQpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKLQotCWNhc2UgTU9YQV9DSEtQT1JURU5BQkxFOgotCQlyZXN1bHQgPSAwOwotCi0JCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9CT0FSRFM7IGkrKykKLQkJCWZvciAoaiA9IDA7IGogPCBNWFNFUl9QT1JUU19QRVJfQk9BUkQ7IGorKykKLQkJCQlpZiAobXhzZXJfYm9hcmRzW2ldLnBvcnRzW2pdLmlvYWRkcikKLQkJCQkJcmVzdWx0IHw9ICgxIDw8IGkpOwotCi0JCXJldHVybiBwdXRfdXNlcihyZXN1bHQsICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZ3ApOwotCWNhc2UgTU9YQV9HRVREQVRBQ09VTlQ6Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm14dmFyX2xvZywgc2l6ZW9mKG14dmFyX2xvZykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOwotCWNhc2UgTU9YQV9HRVRNU1RBVFVTOgotCQlmb3IgKGkgPSAwOyBpIDwgTVhTRVJfQk9BUkRTOyBpKyspCi0JCQlmb3IgKGogPSAwOyBqIDwgTVhTRVJfUE9SVFNfUEVSX0JPQVJEOyBqKyspIHsKLQkJCQlwb3J0ID0gJm14c2VyX2JvYXJkc1tpXS5wb3J0c1tqXTsKLQotCQkJCUdNU3RhdHVzW2ldLnJpID0gMDsKLQkJCQlpZiAoIXBvcnQtPmlvYWRkcikgewotCQkJCQlHTVN0YXR1c1tpXS5kY2QgPSAwOwotCQkJCQlHTVN0YXR1c1tpXS5kc3IgPSAwOwotCQkJCQlHTVN0YXR1c1tpXS5jdHMgPSAwOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoIXBvcnQtPnR0eSB8fCAhcG9ydC0+dHR5LT50ZXJtaW9zKQotCQkJCQlHTVN0YXR1c1tpXS5jZmxhZyA9Ci0JCQkJCQlwb3J0LT5ub3JtYWxfdGVybWlvcy5jX2NmbGFnOwotCQkJCWVsc2UKLQkJCQkJR01TdGF0dXNbaV0uY2ZsYWcgPQotCQkJCQkJcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnOwotCi0JCQkJc3RhdHVzID0gaW5iKHBvcnQtPmlvYWRkciArIFVBUlRfTVNSKTsKLQkJCQlpZiAoc3RhdHVzICYgMHg4MCAvKlVBUlRfTVNSX0RDRCAqLyApCi0JCQkJCUdNU3RhdHVzW2ldLmRjZCA9IDE7Ci0JCQkJZWxzZQotCQkJCQlHTVN0YXR1c1tpXS5kY2QgPSAwOwotCi0JCQkJaWYgKHN0YXR1cyAmIDB4MjAgLypVQVJUX01TUl9EU1IgKi8gKQotCQkJCQlHTVN0YXR1c1tpXS5kc3IgPSAxOwotCQkJCWVsc2UKLQkJCQkJR01TdGF0dXNbaV0uZHNyID0gMDsKLQotCi0JCQkJaWYgKHN0YXR1cyAmIDB4MTAgLypVQVJUX01TUl9DVFMgKi8gKQotCQkJCQlHTVN0YXR1c1tpXS5jdHMgPSAxOwotCQkJCWVsc2UKLQkJCQkJR01TdGF0dXNbaV0uY3RzID0gMDsKLQkJCX0KLQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBHTVN0YXR1cywKLQkJCQlzaXplb2Yoc3RydWN0IG14c2VyX21zdGF0dXMpICogTVhTRVJfUE9SVFMpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXJldHVybiAwOwotCWNhc2UgTU9YQV9BU1BQX01PTl9FWFQ6IHsKLQkJaW50IHAsIHNoaWZ0Yml0OwotCQl1bnNpZ25lZCBsb25nIG9wbW9kZTsKLQkJdW5zaWduZWQgY2ZsYWcsIGlmbGFnOwotCi0JCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9CT0FSRFM7IGkrKykKLQkJCWZvciAoaiA9IDA7IGogPCBNWFNFUl9QT1JUU19QRVJfQk9BUkQ7IGorKykgewotCQkJCXBvcnQgPSAmbXhzZXJfYm9hcmRzW2ldLnBvcnRzW2pdOwotCQkJCWlmICghcG9ydC0+aW9hZGRyKQotCQkJCQljb250aW51ZTsKLQotCQkJCXN0YXR1cyA9IG14c2VyX2dldF9tc3IocG9ydC0+aW9hZGRyLCAwLCBpKTsKLQotCQkJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9URVJJKQotCQkJCQlwb3J0LT5pY291bnQucm5nKys7Ci0JCQkJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0REU1IpCi0JCQkJCXBvcnQtPmljb3VudC5kc3IrKzsKLQkJCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRERDRCkKLQkJCQkJcG9ydC0+aWNvdW50LmRjZCsrOwotCQkJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9EQ1RTKQotCQkJCQlwb3J0LT5pY291bnQuY3RzKys7Ci0KLQkJCQlwb3J0LT5tb25fZGF0YS5tb2RlbV9zdGF0dXMgPSBzdGF0dXM7Ci0JCQkJbW9uX2RhdGFfZXh0LnJ4X2NudFtpXSA9IHBvcnQtPm1vbl9kYXRhLnJ4Y250OwotCQkJCW1vbl9kYXRhX2V4dC50eF9jbnRbaV0gPSBwb3J0LT5tb25fZGF0YS50eGNudDsKLQkJCQltb25fZGF0YV9leHQudXBfcnhjbnRbaV0gPQotCQkJCQlwb3J0LT5tb25fZGF0YS51cF9yeGNudDsKLQkJCQltb25fZGF0YV9leHQudXBfdHhjbnRbaV0gPQotCQkJCQlwb3J0LT5tb25fZGF0YS51cF90eGNudDsKLQkJCQltb25fZGF0YV9leHQubW9kZW1fc3RhdHVzW2ldID0KLQkJCQkJcG9ydC0+bW9uX2RhdGEubW9kZW1fc3RhdHVzOwotCQkJCW1vbl9kYXRhX2V4dC5iYXVkcmF0ZVtpXSA9IHBvcnQtPnJlYWxiYXVkOwotCi0JCQkJaWYgKCFwb3J0LT50dHkgfHwgIXBvcnQtPnR0eS0+dGVybWlvcykgewotCQkJCQljZmxhZyA9IHBvcnQtPm5vcm1hbF90ZXJtaW9zLmNfY2ZsYWc7Ci0JCQkJCWlmbGFnID0gcG9ydC0+bm9ybWFsX3Rlcm1pb3MuY19pZmxhZzsKLQkJCQl9IGVsc2UgewotCQkJCQljZmxhZyA9IHBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZzsKLQkJCQkJaWZsYWcgPSBwb3J0LT50dHktPnRlcm1pb3MtPmNfaWZsYWc7Ci0JCQkJfQotCi0JCQkJbW9uX2RhdGFfZXh0LmRhdGFiaXRzW2ldID0gY2ZsYWcgJiBDU0laRTsKLQotCQkJCW1vbl9kYXRhX2V4dC5zdG9wYml0c1tpXSA9IGNmbGFnICYgQ1NUT1BCOwotCi0JCQkJbW9uX2RhdGFfZXh0LnBhcml0eVtpXSA9Ci0JCQkJCWNmbGFnICYgKFBBUkVOQiB8IFBBUk9ERCB8IENNU1BBUik7Ci0KLQkJCQltb25fZGF0YV9leHQuZmxvd2N0cmxbaV0gPSAweDAwOwotCi0JCQkJaWYgKGNmbGFnICYgQ1JUU0NUUykKLQkJCQkJbW9uX2RhdGFfZXh0LmZsb3djdHJsW2ldIHw9IDB4MDM7Ci0KLQkJCQlpZiAoaWZsYWcgJiAoSVhPTiB8IElYT0ZGKSkKLQkJCQkJbW9uX2RhdGFfZXh0LmZsb3djdHJsW2ldIHw9IDB4MEM7Ci0KLQkJCQlpZiAocG9ydC0+dHlwZSA9PSBQT1JUXzE2NTUwQSkKLQkJCQkJbW9uX2RhdGFfZXh0LmZpZm9baV0gPSAxOwotCQkJCWVsc2UKLQkJCQkJbW9uX2RhdGFfZXh0LmZpZm9baV0gPSAwOwotCi0JCQkJcCA9IGkgJSA0OwotCQkJCXNoaWZ0Yml0ID0gcCAqIDI7Ci0JCQkJb3Btb2RlID0gaW5iKHBvcnQtPm9wbW9kZV9pb2FkZHIpID4+IHNoaWZ0Yml0OwotCQkJCW9wbW9kZSAmPSBPUF9NT0RFX01BU0s7Ci0KLQkJCQltb25fZGF0YV9leHQuaWZ0eXBlW2ldID0gb3Btb2RlOwotCi0JCQl9Ci0JCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZtb25fZGF0YV9leHQsCi0JCQkJCQlzaXplb2YobW9uX2RhdGFfZXh0KSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJCXJldHVybiAwOwotCi0JfSBkZWZhdWx0OgotCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBteHNlcl9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwotCXN0cnVjdCBhc3luY19pY291bnQgY3ByZXYsIGNub3c7CS8qIGtlcm5lbCBjb3VudGVyIHRlbXBzICovCi0Jc3RydWN0IHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgX191c2VyICpwX2N1c2VyOwotCXVuc2lnbmVkIGxvbmcgdGVtcGw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgaTsKLQl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlpbnQgcmV0dmFsOwotCi0JaWYgKHR0eS0+aW5kZXggPT0gTVhTRVJfUE9SVFMpCi0JCXJldHVybiBteHNlcl9pb2N0bF9zcGVjaWFsKGNtZCwgYXJncCk7Ci0KLQlpZiAoY21kID09IE1PWEFfU0VUX09QX01PREUgfHwgY21kID09IE1PWEFfR0VUX09QX01PREUpIHsKLQkJaW50IHA7Ci0JCXVuc2lnbmVkIGxvbmcgb3Btb2RlOwotCQlzdGF0aWMgdW5zaWduZWQgY2hhciBNb2RlTWFza1tdID0geyAweGZjLCAweGYzLCAweGNmLCAweDNmIH07Ci0JCWludCBzaGlmdGJpdDsKLQkJdW5zaWduZWQgY2hhciB2YWwsIG1hc2s7Ci0KLQkJcCA9IHR0eS0+aW5kZXggJSA0OwotCQlpZiAoY21kID09IE1PWEFfU0VUX09QX01PREUpIHsKLQkJCWlmIChnZXRfdXNlcihvcG1vZGUsIChpbnQgX191c2VyICopIGFyZ3ApKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJaWYgKG9wbW9kZSAhPSBSUzIzMl9NT0RFICYmCi0JCQkJCW9wbW9kZSAhPSBSUzQ4NV8yV0lSRV9NT0RFICYmCi0JCQkJCW9wbW9kZSAhPSBSUzQyMl9NT0RFICYmCi0JCQkJCW9wbW9kZSAhPSBSUzQ4NV80V0lSRV9NT0RFKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJbWFzayA9IE1vZGVNYXNrW3BdOwotCQkJc2hpZnRiaXQgPSBwICogMjsKLQkJCXZhbCA9IGluYihpbmZvLT5vcG1vZGVfaW9hZGRyKTsKLQkJCXZhbCAmPSBtYXNrOwotCQkJdmFsIHw9IChvcG1vZGUgPDwgc2hpZnRiaXQpOwotCQkJb3V0Yih2YWwsIGluZm8tPm9wbW9kZV9pb2FkZHIpOwotCQl9IGVsc2UgewotCQkJc2hpZnRiaXQgPSBwICogMjsKLQkJCW9wbW9kZSA9IGluYihpbmZvLT5vcG1vZGVfaW9hZGRyKSA+PiBzaGlmdGJpdDsKLQkJCW9wbW9kZSAmPSBPUF9NT0RFX01BU0s7Ci0JCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZvcG1vZGUsIHNpemVvZihpbnQpKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoY21kID09IE1PWEFfU0VUX1NQRUNJQUxfQkFVRF9SQVRFKSB7Ci0JCWludCBzcGVlZDsKLQotCQlpZiAoZ2V0X3VzZXIoc3BlZWQsIChpbnQgX191c2VyICopYXJncCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYgKHNwZWVkIDw9IDAgfHwgc3BlZWQgPiBpbmZvLT5tYXhfYmF1ZCkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAoIWluZm8tPnR0eSB8fCAhaW5mby0+dHR5LT50ZXJtaW9zIHx8ICFpbmZvLT5pb2FkZHIpCi0JCQlyZXR1cm4gMDsKLQkJaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICY9IH4oQ0JBVUQgfCBDQkFVREVYKTsKLQkJZm9yIChpID0gMDsgaSA8IEJBVURfVEFCTEVfTk87IGkrKykKLQkJCWlmIChzcGVlZCA9PSBteHZhcl9iYXVkX3RhYmxlW2ldKQotCQkJCWJyZWFrOwotCQlpZiAoaSA9PSBCQVVEX1RBQkxFX05PKSB7Ci0JCQlpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgfD0gQl9TUEVDOwotCQl9IGVsc2UgaWYgKHNwZWVkICE9IDApCi0JCQlpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgfD0gbXh2YXJfYmF1ZF90YWJsZTFbaV07Ci0KLQkJaW5mby0+c3BlZWQgPSBzcGVlZDsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0JCW14c2VyX2NoYW5nZV9zcGVlZChpbmZvLCBOVUxMKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQotCQlyZXR1cm4gMDsKLQl9IGVsc2UgaWYgKGNtZCA9PSBNT1hBX0dFVF9TUEVDSUFMX0JBVURfUkFURSkgewotCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZpbmZvLT5zcGVlZCwgc2l6ZW9mKGludCkpKQotCQkgICAgIHJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoY21kICE9IFRJT0NHU0VSSUFMICYmIGNtZCAhPSBUSU9DTUlXQUlUICYmIGNtZCAhPSBUSU9DR0lDT1VOVCAmJgotCQkJdGVzdF9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncykpCi0JCXJldHVybiAtRUlPOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFRDU0JSSzoJCS8qIFNWSUQgdmVyc2lvbjogbm9uLXplcm8gYXJnIC0tPiBubyBicmVhayAqLwotCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7Ci0JCWlmIChyZXR2YWwpCi0JCQlyZXR1cm4gcmV0dmFsOwotCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7Ci0JCWlmICghYXJnKQotCQkJbXhzZXJfc2VuZF9icmVhayhpbmZvLCBIWiAvIDQpOwkvKiAxLzQgc2Vjb25kICovCi0JCXJldHVybiAwOwotCWNhc2UgVENTQlJLUDoJCS8qIHN1cHBvcnQgZm9yIFBPU0lYIHRjc2VuZGJyZWFrKCkgKi8KLQkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOwotCQlpZiAocmV0dmFsKQotCQkJcmV0dXJuIHJldHZhbDsKLQkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDApOwotCQlteHNlcl9zZW5kX2JyZWFrKGluZm8sIGFyZyA/IGFyZyAqIChIWiAvIDEwKSA6IEhaIC8gNCk7Ci0JCXJldHVybiAwOwotCWNhc2UgVElPQ0dTT0ZUQ0FSOgotCQlyZXR1cm4gcHV0X3VzZXIoQ19DTE9DQUwodHR5KSA/IDEgOiAwLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmdwKTsKLQljYXNlIFRJT0NTU09GVENBUjoKLQkJaWYgKGdldF91c2VyKHRlbXBsLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgYXJncCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJYXJnID0gdGVtcGw7Ci0JCXR0eS0+dGVybWlvcy0+Y19jZmxhZyA9ICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgfkNMT0NBTCkgfCAoYXJnID8gQ0xPQ0FMIDogMCkpOwotCQlyZXR1cm4gMDsKLQljYXNlIFRJT0NHU0VSSUFMOgotCQlyZXR1cm4gbXhzZXJfZ2V0X3NlcmlhbF9pbmZvKGluZm8sIGFyZ3ApOwotCWNhc2UgVElPQ1NTRVJJQUw6Ci0JCXJldHVybiBteHNlcl9zZXRfc2VyaWFsX2luZm8oaW5mbywgYXJncCk7Ci0JY2FzZSBUSU9DU0VSR0VUTFNSOgkvKiBHZXQgbGluZSBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkJcmV0dXJuIG14c2VyX2dldF9sc3JfaW5mbyhpbmZvLCBhcmdwKTsKLQkJLyoKLQkJICogV2FpdCBmb3IgYW55IG9mIHRoZSA0IG1vZGVtIGlucHV0cyAoRENELFJJLERTUixDVFMpIHRvIGNoYW5nZQotCQkgKiAtIG1hc2sgcGFzc2VkIGluIGFyZyBmb3IgbGluZXMgb2YgaW50ZXJlc3QKLQkJICogICAodXNlIHwnZWQgVElPQ01fUk5HL0RTUi9DRC9DVFMgZm9yIG1hc2tpbmcpCi0JCSAqIENhbGxlciBzaG91bGQgdXNlIFRJT0NHSUNPVU5UIHRvIHNlZSB3aGljaCBvbmUgaXQgd2FzCi0JCSAqLwotCWNhc2UgVElPQ01JV0FJVDoKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0JCWNub3cgPSBpbmZvLT5pY291bnQ7CS8qIG5vdGUgdGhlIGNvdW50ZXJzIG9uIGVudHJ5ICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0KLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGluZm8tPmRlbHRhX21zcl93YWl0LCAoewotCQkJY3ByZXYgPSBjbm93OwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0JCQljbm93ID0gaW5mby0+aWNvdW50OwkvKiBhdG9taWMgY29weSAqLwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQotCQkJKChhcmcgJiBUSU9DTV9STkcpICYmIChjbm93LnJuZyAhPSBjcHJldi5ybmcpKSB8fAotCQkJKChhcmcgJiBUSU9DTV9EU1IpICYmIChjbm93LmRzciAhPSBjcHJldi5kc3IpKSB8fAotCQkJKChhcmcgJiBUSU9DTV9DRCkgICYmIChjbm93LmRjZCAhPSBjcHJldi5kY2QpKSB8fAotCQkJKChhcmcgJiBUSU9DTV9DVFMpICYmIChjbm93LmN0cyAhPSBjcHJldi5jdHMpKTsKLQkJfSkpOwotCQlicmVhazsKLQkvKgotCSAqIEdldCBjb3VudGVyIG9mIGlucHV0IHNlcmlhbCBsaW5lIGludGVycnVwdHMgKERDRCxSSSxEU1IsQ1RTKQotCSAqIFJldHVybjogd3JpdGUgY291bnRlcnMgdG8gdGhlIHVzZXIgcGFzc2VkIGNvdW50ZXIgc3RydWN0Ci0JICogTkI6IGJvdGggMS0+MCBhbmQgMC0+MSB0cmFuc2l0aW9ucyBhcmUgY291bnRlZCBleGNlcHQgZm9yCi0JICogICAgIFJJIHdoZXJlIG9ubHkgMC0+MSBpcyBjb3VudGVkLgotCSAqLwotCWNhc2UgVElPQ0dJQ09VTlQ6Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCQljbm93ID0gaW5mby0+aWNvdW50OwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCQlwX2N1c2VyID0gYXJncDsKLQkJaWYgKHB1dF91c2VyKGNub3cuZnJhbWUsICZwX2N1c2VyLT5mcmFtZSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYgKHB1dF91c2VyKGNub3cuYnJrLCAmcF9jdXNlci0+YnJrKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAocHV0X3VzZXIoY25vdy5vdmVycnVuLCAmcF9jdXNlci0+b3ZlcnJ1bikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYgKHB1dF91c2VyKGNub3cuYnVmX292ZXJydW4sICZwX2N1c2VyLT5idWZfb3ZlcnJ1bikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYgKHB1dF91c2VyKGNub3cucGFyaXR5LCAmcF9jdXNlci0+cGFyaXR5KSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAocHV0X3VzZXIoY25vdy5yeCwgJnBfY3VzZXItPnJ4KSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAocHV0X3VzZXIoY25vdy50eCwgJnBfY3VzZXItPnR4KSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlwdXRfdXNlcihjbm93LmN0cywgJnBfY3VzZXItPmN0cyk7Ci0JCXB1dF91c2VyKGNub3cuZHNyLCAmcF9jdXNlci0+ZHNyKTsKLQkJcHV0X3VzZXIoY25vdy5ybmcsICZwX2N1c2VyLT5ybmcpOwotCQlwdXRfdXNlcihjbm93LmRjZCwgJnBfY3VzZXItPmRjZCk7Ci0JCXJldHVybiAwOwotCWNhc2UgTU9YQV9IaWdoU3BlZWRPbjoKLQkJcmV0dXJuIHB1dF91c2VyKGluZm8tPmJhdWRfYmFzZSAhPSAxMTUyMDAgPyAxIDogMCwgKGludCBfX3VzZXIgKilhcmdwKTsKLQljYXNlIE1PWEFfU0RTX1JTVElDT1VOVEVSOgotCQlpbmZvLT5tb25fZGF0YS5yeGNudCA9IDA7Ci0JCWluZm8tPm1vbl9kYXRhLnR4Y250ID0gMDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBNT1hBX0FTUFBfU0VUQkFVRDp7Ci0JCWxvbmcgYmF1ZDsKLQkJaWYgKGdldF91c2VyKGJhdWQsIChsb25nIF9fdXNlciAqKWFyZ3ApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCQlteHNlcl9zZXRfYmF1ZChpbmZvLCBiYXVkKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgTU9YQV9BU1BQX0dFVEJBVUQ6Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8tPnJlYWxiYXVkLCBzaXplb2YobG9uZykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJcmV0dXJuIDA7Ci0KLQljYXNlIE1PWEFfQVNQUF9PUVVFVUU6ewotCQlpbnQgbGVuLCBsc3I7Ci0KLQkJbGVuID0gbXhzZXJfY2hhcnNfaW5fYnVmZmVyKHR0eSk7Ci0KLQkJbHNyID0gaW5iKGluZm8tPmlvYWRkciArIFVBUlRfTFNSKSAmIFVBUlRfTFNSX1RFTVQ7Ci0KLQkJbGVuICs9IChsc3IgPyAwIDogMSk7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmbGVuLCBzaXplb2YoaW50KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBNT1hBX0FTUFBfTU9OOiB7Ci0JCWludCBtY3IsIHN0YXR1czsKLQotCQlzdGF0dXMgPSBteHNlcl9nZXRfbXNyKGluZm8tPmlvYWRkciwgMSwgdHR5LT5pbmRleCk7Ci0JCW14c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhpbmZvLCBzdGF0dXMpOwotCi0JCW1jciA9IGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX01DUik7Ci0JCWlmIChtY3IgJiBNT1hBX01VU1RfTUNSX1hPTl9GTEFHKQotCQkJaW5mby0+bW9uX2RhdGEuaG9sZF9yZWFzb24gJj0gfk5QUElfTk9USUZZX1hPRkZIT0xEOwotCQllbHNlCi0JCQlpbmZvLT5tb25fZGF0YS5ob2xkX3JlYXNvbiB8PSBOUFBJX05PVElGWV9YT0ZGSE9MRDsKLQotCQlpZiAobWNyICYgTU9YQV9NVVNUX01DUl9UWF9YT04pCi0JCQlpbmZvLT5tb25fZGF0YS5ob2xkX3JlYXNvbiAmPSB+TlBQSV9OT1RJRllfWE9GRlhFTlQ7Ci0JCWVsc2UKLQkJCWluZm8tPm1vbl9kYXRhLmhvbGRfcmVhc29uIHw9IE5QUElfTk9USUZZX1hPRkZYRU5UOwotCi0JCWlmIChpbmZvLT50dHktPmh3X3N0b3BwZWQpCi0JCQlpbmZvLT5tb25fZGF0YS5ob2xkX3JlYXNvbiB8PSBOUFBJX05PVElGWV9DVFNIT0xEOwotCQllbHNlCi0JCQlpbmZvLT5tb25fZGF0YS5ob2xkX3JlYXNvbiAmPSB+TlBQSV9OT1RJRllfQ1RTSE9MRDsKLQotCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZpbmZvLT5tb25fZGF0YSwKLQkJCQlzaXplb2Yoc3RydWN0IG14c2VyX21vbikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCWNhc2UgTU9YQV9BU1BQX0xTVEFUVVM6IHsKLQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mby0+ZXJyX3NoYWRvdywKLQkJCQlzaXplb2YodW5zaWduZWQgY2hhcikpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJaW5mby0+ZXJyX3NoYWRvdyA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQljYXNlIE1PWEFfU0VUX0JBVURfTUVUSE9EOiB7Ci0JCWludCBtZXRob2Q7Ci0KLQkJaWYgKGdldF91c2VyKG1ldGhvZCwgKGludCBfX3VzZXIgKilhcmdwKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlteHNlcl9zZXRfYmF1ZF9tZXRob2RbdHR5LT5pbmRleF0gPSBtZXRob2Q7Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm1ldGhvZCwgc2l6ZW9mKGludCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PSU9DVExDTUQ7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBteHNlcl9zdG9wcngoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0KLQlpbmZvLT5sZGlzY19zdG9wX3J4ID0gMTsKLQlpZiAoSV9JWE9GRih0dHkpKSB7Ci0JCWlmIChpbmZvLT5ib2FyZC0+Y2hpcF9mbGFnKSB7Ci0JCQlpbmZvLT5JRVIgJj0gfk1PWEFfTVVTVF9SRUNWX0lTUjsKLQkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUik7Ci0JCX0gZWxzZSB7Ci0JCQlpbmZvLT54X2NoYXIgPSBTVE9QX0NIQVIodHR5KTsKLQkJCW91dGIoMCwgaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOwotCQkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7Ci0JCQlvdXRiKGluZm8tPklFUiwgaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOwotCQl9Ci0JfQotCi0JaWYgKGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKLQkJaW5mby0+TUNSICY9IH5VQVJUX01DUl9SVFM7Ci0JCW91dGIoaW5mby0+TUNSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX01DUik7Ci0JfQotfQotCi0vKgotICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgdXBwZXItbGF5ZXIgdHR5IGxheWVyIHRvIHNpZ25hbCB0aGF0Ci0gKiBpbmNvbWluZyBjaGFyYWN0ZXJzIHNob3VsZCBiZSB0aHJvdHRsZWQuCi0gKi8KLXN0YXRpYyB2b2lkIG14c2VyX3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0JbXhzZXJfc3RvcHJ4KHR0eSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG14c2VyX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0KLQkvKiBzdGFydHJ4ICovCi0JaW5mby0+bGRpc2Nfc3RvcF9yeCA9IDA7Ci0JaWYgKElfSVhPRkYodHR5KSkgewotCQlpZiAoaW5mby0+eF9jaGFyKQotCQkJaW5mby0+eF9jaGFyID0gMDsKLQkJZWxzZSB7Ci0JCQlpZiAoaW5mby0+Ym9hcmQtPmNoaXBfZmxhZykgewotCQkJCWluZm8tPklFUiB8PSBNT1hBX01VU1RfUkVDVl9JU1I7Ci0JCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmlvYWRkciArIFVBUlRfSUVSKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5mby0+eF9jaGFyID0gU1RBUlRfQ0hBUih0dHkpOwotCQkJCW91dGIoMCwgaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOwotCQkJCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOwotCQkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgewotCQlpbmZvLT5NQ1IgfD0gVUFSVF9NQ1JfUlRTOwotCQlvdXRiKGluZm8tPk1DUiwgaW5mby0+aW9hZGRyICsgVUFSVF9NQ1IpOwotCX0KLX0KLQotLyoKLSAqIG14c2VyX3N0b3AoKSBhbmQgbXhzZXJfc3RhcnQoKQotICoKLSAqIFRoaXMgcm91dGluZXMgYXJlIGNhbGxlZCBiZWZvcmUgc2V0dGluZyBvciByZXNldHRpbmcgdHR5LT5zdG9wcGVkLgotICogVGhleSBlbmFibGUgb3IgZGlzYWJsZSB0cmFuc21pdHRlciBpbnRlcnJ1cHRzLCBhcyBuZWNlc3NhcnkuCi0gKi8KLXN0YXRpYyB2b2lkIG14c2VyX3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCWlmIChpbmZvLT5JRVIgJiBVQVJUX0lFUl9USFJJKSB7Ci0JCWluZm8tPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKLQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmlvYWRkciArIFVBUlRfSUVSKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgbXhzZXJfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgbXhzZXJfcG9ydCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCWlmIChpbmZvLT54bWl0X2NudCAmJiBpbmZvLT54bWl0X2J1ZikgewotCQlvdXRiKGluZm8tPklFUiAmIH5VQVJUX0lFUl9USFJJLCBpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUik7Ci0JCWluZm8tPklFUiB8PSBVQVJUX0lFUl9USFJJOwotCQlvdXRiKGluZm8tPklFUiwgaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBteHNlcl9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQotewotCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0JbXhzZXJfY2hhbmdlX3NwZWVkKGluZm8sIG9sZF90ZXJtaW9zKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCi0JaWYgKChvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpICYmCi0JCQkhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSB7Ci0JCXR0eS0+aHdfc3RvcHBlZCA9IDA7Ci0JCW14c2VyX3N0YXJ0KHR0eSk7Ci0JfQotCi0JLyogSGFuZGxlIHN3IHN0b3BwZWQgKi8KLQlpZiAoKG9sZF90ZXJtaW9zLT5jX2lmbGFnICYgSVhPTikgJiYKLQkJCSEodHR5LT50ZXJtaW9zLT5jX2lmbGFnICYgSVhPTikpIHsKLQkJdHR5LT5zdG9wcGVkID0gMDsKLQotCQlpZiAoaW5mby0+Ym9hcmQtPmNoaXBfZmxhZykgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0JCQlESVNBQkxFX01PWEFfTVVTVF9SWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woaW5mby0+aW9hZGRyKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7Ci0JCX0KLQotCQlteHNlcl9zdGFydCh0dHkpOwotCX0KLX0KLQotLyoKLSAqIG14c2VyX3dhaXRfdW50aWxfc2VudCgpIC0tLSB3YWl0IHVudGlsIHRoZSB0cmFuc21pdHRlciBpcyBlbXB0eQotICovCi1zdGF0aWMgdm9pZCBteHNlcl93YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpCi17Ci0Jc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwotCXVuc2lnbmVkIGxvbmcgb3JpZ19qaWZmaWVzLCBjaGFyX3RpbWU7Ci0JaW50IGxzcjsKLQotCWlmIChpbmZvLT50eXBlID09IFBPUlRfVU5LTk9XTikKLQkJcmV0dXJuOwotCi0JaWYgKGluZm8tPnhtaXRfZmlmb19zaXplID09IDApCi0JCXJldHVybjsJCS8qIEp1c3QgaW4gY2FzZS4uLi4gKi8KLQotCW9yaWdfamlmZmllcyA9IGppZmZpZXM7Ci0JLyoKLQkgKiBTZXQgdGhlIGNoZWNrIGludGVydmFsIHRvIGJlIDEvNSBvZiB0aGUgZXN0aW1hdGVkIHRpbWUgdG8KLQkgKiBzZW5kIGEgc2luZ2xlIGNoYXJhY3RlciwgYW5kIG1ha2UgaXQgYXQgbGVhc3QgMS4gIFRoZSBjaGVjawotCSAqIGludGVydmFsIHNob3VsZCBhbHNvIGJlIGxlc3MgdGhhbiB0aGUgdGltZW91dC4KLQkgKgotCSAqIE5vdGU6IHdlIGhhdmUgdG8gdXNlIHByZXR0eSB0aWdodCB0aW1pbmdzIGhlcmUgdG8gc2F0aXNmeQotCSAqIHRoZSBOSVNULVBDVFMuCi0JICovCi0JY2hhcl90aW1lID0gKGluZm8tPnRpbWVvdXQgLSBIWiAvIDUwKSAvIGluZm8tPnhtaXRfZmlmb19zaXplOwotCWNoYXJfdGltZSA9IGNoYXJfdGltZSAvIDU7Ci0JaWYgKGNoYXJfdGltZSA9PSAwKQotCQljaGFyX3RpbWUgPSAxOwotCWlmICh0aW1lb3V0ICYmIHRpbWVvdXQgPCBjaGFyX3RpbWUpCi0JCWNoYXJfdGltZSA9IHRpbWVvdXQ7Ci0JLyoKLQkgKiBJZiB0aGUgdHJhbnNtaXR0ZXIgaGFzbid0IGNsZWFyZWQgaW4gdHdpY2UgdGhlIGFwcHJveGltYXRlCi0JICogYW1vdW50IG9mIHRpbWUgdG8gc2VuZCB0aGUgZW50aXJlIEZJRk8sIGl0IHByb2JhYmx5IHdvbid0Ci0JICogZXZlciBjbGVhci4gIFRoaXMgYXNzdW1lcyB0aGUgVUFSVCBpc24ndCBkb2luZyBmbG93Ci0JICogY29udHJvbCwgd2hpY2ggaXMgY3VycmVudGx5IHRoZSBjYXNlLiAgSGVuY2UsIGlmIGl0IGV2ZXIKLQkgKiB0YWtlcyBsb25nZXIgdGhhbiBpbmZvLT50aW1lb3V0LCB0aGlzIGlzIHByb2JhYmx5IGR1ZSB0byBhCi0JICogVUFSVCBidWcgb2Ygc29tZSBraW5kLiAgU28sIHdlIGNsYW1wIHRoZSB0aW1lb3V0IHBhcmFtZXRlciBhdAotCSAqIDIqaW5mby0+dGltZW91dC4KLQkgKi8KLQlpZiAoIXRpbWVvdXQgfHwgdGltZW91dCA+IDIgKiBpbmZvLT50aW1lb3V0KQotCQl0aW1lb3V0ID0gMiAqIGluZm8tPnRpbWVvdXQ7Ci0jaWZkZWYgU0VSSUFMX0RFQlVHX1JTX1dBSVRfVU5USUxfU0VOVAotCXByaW50ayhLRVJOX0RFQlVHICJJbiByc193YWl0X3VudGlsX3NlbnQoJWQpIGNoZWNrPSVsdS4uLiIsCi0JCXRpbWVvdXQsIGNoYXJfdGltZSk7Ci0JcHJpbnRrKCJqaWZmPSVsdS4uLiIsIGppZmZpZXMpOwotI2VuZGlmCi0Jd2hpbGUgKCEoKGxzciA9IGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX0xTUikpICYgVUFSVF9MU1JfVEVNVCkpIHsKLSNpZmRlZiBTRVJJQUxfREVCVUdfUlNfV0FJVF9VTlRJTF9TRU5UCi0JCXByaW50aygibHNyID0gJWQgKGppZmY9JWx1KS4uLiIsIGxzciwgamlmZmllcyk7Ci0jZW5kaWYKLQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKGNoYXJfdGltZSk7Ci0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCWJyZWFrOwotCQlpZiAodGltZW91dCAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIG9yaWdfamlmZmllcyArIHRpbWVvdXQpKQotCQkJYnJlYWs7Ci0JfQotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0KLSNpZmRlZiBTRVJJQUxfREVCVUdfUlNfV0FJVF9VTlRJTF9TRU5UCi0JcHJpbnRrKCJsc3IgPSAlZCAoamlmZj0lbHUpLi4uZG9uZVxuIiwgbHNyLCBqaWZmaWVzKTsKLSNlbmRpZgotfQotCi0vKgotICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0dHlfaGFuZ3VwKCkgd2hlbiBhIGhhbmd1cCBpcyBzaWduYWxlZC4KLSAqLwotc3RhdGljIHZvaWQgbXhzZXJfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwotCi0JbXhzZXJfZmx1c2hfYnVmZmVyKHR0eSk7Ci0JbXhzZXJfc2h1dGRvd24oaW5mbyk7Ci0JaW5mby0+ZXZlbnQgPSAwOwotCWluZm8tPmNvdW50ID0gMDsKLQlpbmZvLT5mbGFncyAmPSB+QVNZTkNfTk9STUFMX0FDVElWRTsKLQlpbmZvLT50dHkgPSBOVUxMOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKLX0KLQotLyoKLSAqIG14c2VyX3JzX2JyZWFrKCkgLS0tIHJvdXRpbmUgd2hpY2ggdHVybnMgdGhlIGJyZWFrIGhhbmRsaW5nIG9uIG9yIG9mZgotICovCi1zdGF0aWMgdm9pZCBteHNlcl9yc19icmVhayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYnJlYWtfc3RhdGUpCi17Ci0Jc3RydWN0IG14c2VyX3BvcnQgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQlpZiAoYnJlYWtfc3RhdGUgPT0gLTEpCi0JCW91dGIoaW5iKGluZm8tPmlvYWRkciArIFVBUlRfTENSKSB8IFVBUlRfTENSX1NCQywKLQkJCWluZm8tPmlvYWRkciArIFVBUlRfTENSKTsKLQllbHNlCi0JCW91dGIoaW5iKGluZm8tPmlvYWRkciArIFVBUlRfTENSKSAmIH5VQVJUX0xDUl9TQkMsCi0JCQlpbmZvLT5pb2FkZHIgKyBVQVJUX0xDUik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgbXhzZXJfcmVjZWl2ZV9jaGFycyhzdHJ1Y3QgbXhzZXJfcG9ydCAqcG9ydCwgaW50ICpzdGF0dXMpCi17Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPnR0eTsKLQl1bnNpZ25lZCBjaGFyIGNoLCBnZGw7Ci0JaW50IGlnbm9yZWQgPSAwOwotCWludCBjbnQgPSAwOwotCWludCByZWN2X3Jvb207Ci0JaW50IG1heCA9IDI1NjsKLQotCXJlY3Zfcm9vbSA9IHR0eS0+cmVjZWl2ZV9yb29tOwotCWlmICgocmVjdl9yb29tID09IDApICYmICghcG9ydC0+bGRpc2Nfc3RvcF9yeCkpCi0JCW14c2VyX3N0b3ByeCh0dHkpOwotCi0JaWYgKHBvcnQtPmJvYXJkLT5jaGlwX2ZsYWcgIT0gTU9YQV9PVEhFUl9VQVJUKSB7Ci0KLQkJaWYgKCpzdGF0dXMgJiBVQVJUX0xTUl9TUEVDSUFMKQotCQkJZ290byBpbnRyX29sZDsKLQkJaWYgKHBvcnQtPmJvYXJkLT5jaGlwX2ZsYWcgPT0gTU9YQV9NVVNUX01VODYwX0hXSUQgJiYKLQkJCQkoKnN0YXR1cyAmIE1PWEFfTVVTVF9MU1JfUkVSUikpCi0JCQlnb3RvIGludHJfb2xkOwotCQlpZiAoKnN0YXR1cyAmIE1PWEFfTVVTVF9MU1JfUkVSUikKLQkJCWdvdG8gaW50cl9vbGQ7Ci0KLQkJZ2RsID0gaW5iKHBvcnQtPmlvYWRkciArIE1PWEFfTVVTVF9HRExfUkVHSVNURVIpOwotCi0JCWlmIChwb3J0LT5ib2FyZC0+Y2hpcF9mbGFnID09IE1PWEFfTVVTVF9NVTE1MF9IV0lEKQotCQkJZ2RsICY9IE1PWEFfTVVTVF9HRExfTUFTSzsKLQkJaWYgKGdkbCA+PSByZWN2X3Jvb20pIHsKLQkJCWlmICghcG9ydC0+bGRpc2Nfc3RvcF9yeCkKLQkJCQlteHNlcl9zdG9wcngodHR5KTsKLQkJfQotCQl3aGlsZSAoZ2RsLS0pIHsKLQkJCWNoID0gaW5iKHBvcnQtPmlvYWRkciArIFVBUlRfUlgpOwotCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBjaCwgMCk7Ci0JCQljbnQrKzsKLQkJfQotCQlnb3RvIGVuZF9pbnRyOwotCX0KLWludHJfb2xkOgotCi0JZG8gewotCQlpZiAobWF4LS0gPCAwKQotCQkJYnJlYWs7Ci0KLQkJY2ggPSBpbmIocG9ydC0+aW9hZGRyICsgVUFSVF9SWCk7Ci0JCWlmIChwb3J0LT5ib2FyZC0+Y2hpcF9mbGFnICYmICgqc3RhdHVzICYgVUFSVF9MU1JfT0UpKQotCQkJb3V0YigweDIzLCBwb3J0LT5pb2FkZHIgKyBVQVJUX0ZDUik7Ci0JCSpzdGF0dXMgJj0gcG9ydC0+cmVhZF9zdGF0dXNfbWFzazsKLQkJaWYgKCpzdGF0dXMgJiBwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2spIHsKLQkJCWlmICgrK2lnbm9yZWQgPiAxMDApCi0JCQkJYnJlYWs7Ci0JCX0gZWxzZSB7Ci0JCQljaGFyIGZsYWcgPSAwOwotCQkJaWYgKCpzdGF0dXMgJiBVQVJUX0xTUl9TUEVDSUFMKSB7Ci0JCQkJaWYgKCpzdGF0dXMgJiBVQVJUX0xTUl9CSSkgewotCQkJCQlmbGFnID0gVFRZX0JSRUFLOwotCQkJCQlwb3J0LT5pY291bnQuYnJrKys7Ci0KLQkJCQkJaWYgKHBvcnQtPmZsYWdzICYgQVNZTkNfU0FLKQotCQkJCQkJZG9fU0FLKHR0eSk7Ci0JCQkJfSBlbHNlIGlmICgqc3RhdHVzICYgVUFSVF9MU1JfUEUpIHsKLQkJCQkJZmxhZyA9IFRUWV9QQVJJVFk7Ci0JCQkJCXBvcnQtPmljb3VudC5wYXJpdHkrKzsKLQkJCQl9IGVsc2UgaWYgKCpzdGF0dXMgJiBVQVJUX0xTUl9GRSkgewotCQkJCQlmbGFnID0gVFRZX0ZSQU1FOwotCQkJCQlwb3J0LT5pY291bnQuZnJhbWUrKzsKLQkJCQl9IGVsc2UgaWYgKCpzdGF0dXMgJiBVQVJUX0xTUl9PRSkgewotCQkJCQlmbGFnID0gVFRZX09WRVJSVU47Ci0JCQkJCXBvcnQtPmljb3VudC5vdmVycnVuKys7Ci0JCQkJfSBlbHNlCi0JCQkJCWZsYWcgPSBUVFlfQlJFQUs7Ci0JCQl9Ci0JCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCBmbGFnKTsKLQkJCWNudCsrOwotCQkJaWYgKGNudCA+PSByZWN2X3Jvb20pIHsKLQkJCQlpZiAoIXBvcnQtPmxkaXNjX3N0b3BfcngpCi0JCQkJCW14c2VyX3N0b3ByeCh0dHkpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCX0KLQotCQlpZiAocG9ydC0+Ym9hcmQtPmNoaXBfZmxhZykKLQkJCWJyZWFrOwotCi0JCSpzdGF0dXMgPSBpbmIocG9ydC0+aW9hZGRyICsgVUFSVF9MU1IpOwotCX0gd2hpbGUgKCpzdGF0dXMgJiBVQVJUX0xTUl9EUik7Ci0KLWVuZF9pbnRyOgotCW14dmFyX2xvZy5yeGNudFtwb3J0LT50dHktPmluZGV4XSArPSBjbnQ7Ci0JcG9ydC0+bW9uX2RhdGEucnhjbnQgKz0gY250OwotCXBvcnQtPm1vbl9kYXRhLnVwX3J4Y250ICs9IGNudDsKLQotCS8qCi0JICogV2UgYXJlIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdCBjb250ZXh0IHdpdGggJnBvcnQtPnNsb2NrCi0JICogYmVpbmcgaGVsZC4gRHJvcCBpdCB0ZW1wb3JhcmlseSBpbiBvcmRlciB0byBwcmV2ZW50Ci0JICogcmVjdXJzaXZlIGxvY2tpbmcuCi0JICovCi0Jc3Bpbl91bmxvY2soJnBvcnQtPnNsb2NrKTsKLQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwotCXNwaW5fbG9jaygmcG9ydC0+c2xvY2spOwotfQotCi1zdGF0aWMgdm9pZCBteHNlcl90cmFuc21pdF9jaGFycyhzdHJ1Y3QgbXhzZXJfcG9ydCAqcG9ydCkKLXsKLQlpbnQgY291bnQsIGNudDsKLQotCWlmIChwb3J0LT54X2NoYXIpIHsKLQkJb3V0Yihwb3J0LT54X2NoYXIsIHBvcnQtPmlvYWRkciArIFVBUlRfVFgpOwotCQlwb3J0LT54X2NoYXIgPSAwOwotCQlteHZhcl9sb2cudHhjbnRbcG9ydC0+dHR5LT5pbmRleF0rKzsKLQkJcG9ydC0+bW9uX2RhdGEudHhjbnQrKzsKLQkJcG9ydC0+bW9uX2RhdGEudXBfdHhjbnQrKzsKLQkJcG9ydC0+aWNvdW50LnR4Kys7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocG9ydC0+eG1pdF9idWYgPT0gMCkKLQkJcmV0dXJuOwotCi0JaWYgKChwb3J0LT54bWl0X2NudCA8PSAwKSB8fCBwb3J0LT50dHktPnN0b3BwZWQgfHwKLQkJCShwb3J0LT50dHktPmh3X3N0b3BwZWQgJiYKLQkJCShwb3J0LT50eXBlICE9IFBPUlRfMTY1NTBBKSAmJgotCQkJKCFwb3J0LT5ib2FyZC0+Y2hpcF9mbGFnKSkpIHsKLQkJcG9ydC0+SUVSICY9IH5VQVJUX0lFUl9USFJJOwotCQlvdXRiKHBvcnQtPklFUiwgcG9ydC0+aW9hZGRyICsgVUFSVF9JRVIpOwotCQlyZXR1cm47Ci0JfQotCi0JY250ID0gcG9ydC0+eG1pdF9jbnQ7Ci0JY291bnQgPSBwb3J0LT54bWl0X2ZpZm9fc2l6ZTsKLQlkbyB7Ci0JCW91dGIocG9ydC0+eG1pdF9idWZbcG9ydC0+eG1pdF90YWlsKytdLAotCQkJcG9ydC0+aW9hZGRyICsgVUFSVF9UWCk7Ci0JCXBvcnQtPnhtaXRfdGFpbCA9IHBvcnQtPnhtaXRfdGFpbCAmIChTRVJJQUxfWE1JVF9TSVpFIC0gMSk7Ci0JCWlmICgtLXBvcnQtPnhtaXRfY250IDw9IDApCi0JCQlicmVhazsKLQl9IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0JbXh2YXJfbG9nLnR4Y250W3BvcnQtPnR0eS0+aW5kZXhdICs9IChjbnQgLSBwb3J0LT54bWl0X2NudCk7Ci0KLQlwb3J0LT5tb25fZGF0YS50eGNudCArPSAoY250IC0gcG9ydC0+eG1pdF9jbnQpOwotCXBvcnQtPm1vbl9kYXRhLnVwX3R4Y250ICs9IChjbnQgLSBwb3J0LT54bWl0X2NudCk7Ci0JcG9ydC0+aWNvdW50LnR4ICs9IChjbnQgLSBwb3J0LT54bWl0X2NudCk7Ci0KLQlpZiAocG9ydC0+eG1pdF9jbnQgPCBXQUtFVVBfQ0hBUlMpCi0JCXR0eV93YWtldXAocG9ydC0+dHR5KTsKLQotCWlmIChwb3J0LT54bWl0X2NudCA8PSAwKSB7Ci0JCXBvcnQtPklFUiAmPSB+VUFSVF9JRVJfVEhSSTsKLQkJb3V0Yihwb3J0LT5JRVIsIHBvcnQtPmlvYWRkciArIFVBUlRfSUVSKTsKLQl9Ci19Ci0KLS8qCi0gKiBUaGlzIGlzIHRoZSBzZXJpYWwgZHJpdmVyJ3MgZ2VuZXJpYyBpbnRlcnJ1cHQgcm91dGluZQotICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgbXhzZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlpbnQgc3RhdHVzLCBpaXIsIGk7Ci0Jc3RydWN0IG14c2VyX2JvYXJkICpicmQgPSBOVUxMOwotCXN0cnVjdCBteHNlcl9wb3J0ICpwb3J0OwotCWludCBtYXgsIGlycWJpdHMsIGJpdHMsIG1zcjsKLQl1bnNpZ25lZCBpbnQgaW50X2NudCwgcGFzc19jb3VudGVyID0gMDsKLQlpbnQgaGFuZGxlZCA9IElSUV9OT05FOwotCi0JZm9yIChpID0gMDsgaSA8IE1YU0VSX0JPQVJEUzsgaSsrKQotCQlpZiAoZGV2X2lkID09ICZteHNlcl9ib2FyZHNbaV0pIHsKLQkJCWJyZCA9IGRldl9pZDsKLQkJCWJyZWFrOwotCQl9Ci0KLQlpZiAoaSA9PSBNWFNFUl9CT0FSRFMpCi0JCWdvdG8gaXJxX3N0b3A7Ci0JaWYgKGJyZCA9PSBOVUxMKQotCQlnb3RvIGlycV9zdG9wOwotCW1heCA9IGJyZC0+aW5mby0+bnBvcnRzOwotCXdoaWxlIChwYXNzX2NvdW50ZXIrKyA8IE1YU0VSX0lTUl9QQVNTX0xJTUlUKSB7Ci0JCWlycWJpdHMgPSBpbmIoYnJkLT52ZWN0b3IpICYgYnJkLT52ZWN0b3JfbWFzazsKLQkJaWYgKGlycWJpdHMgPT0gYnJkLT52ZWN0b3JfbWFzaykKLQkJCWJyZWFrOwotCi0JCWhhbmRsZWQgPSBJUlFfSEFORExFRDsKLQkJZm9yIChpID0gMCwgYml0cyA9IDE7IGkgPCBtYXg7IGkrKywgaXJxYml0cyB8PSBiaXRzLCBiaXRzIDw8PSAxKSB7Ci0JCQlpZiAoaXJxYml0cyA9PSBicmQtPnZlY3Rvcl9tYXNrKQotCQkJCWJyZWFrOwotCQkJaWYgKGJpdHMgJiBpcnFiaXRzKQotCQkJCWNvbnRpbnVlOwotCQkJcG9ydCA9ICZicmQtPnBvcnRzW2ldOwotCi0JCQlpbnRfY250ID0gMDsKLQkJCXNwaW5fbG9jaygmcG9ydC0+c2xvY2spOwotCQkJZG8gewotCQkJCWlpciA9IGluYihwb3J0LT5pb2FkZHIgKyBVQVJUX0lJUik7Ci0JCQkJaWYgKGlpciAmIFVBUlRfSUlSX05PX0lOVCkKLQkJCQkJYnJlYWs7Ci0JCQkJaWlyICY9IE1PWEFfTVVTVF9JSVJfTUFTSzsKLQkJCQlpZiAoIXBvcnQtPnR0eSB8fAotCQkJCQkJKHBvcnQtPmZsYWdzICYgQVNZTkNfQ0xPU0lORykgfHwKLQkJCQkJCSEocG9ydC0+ZmxhZ3MgJgotCQkJCQkJCUFTWU5DX0lOSVRJQUxJWkVEKSkgewotCQkJCQlzdGF0dXMgPSBpbmIocG9ydC0+aW9hZGRyICsgVUFSVF9MU1IpOwotCQkJCQlvdXRiKDB4MjcsIHBvcnQtPmlvYWRkciArIFVBUlRfRkNSKTsKLQkJCQkJaW5iKHBvcnQtPmlvYWRkciArIFVBUlRfTVNSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJc3RhdHVzID0gaW5iKHBvcnQtPmlvYWRkciArIFVBUlRfTFNSKTsKLQotCQkJCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9QRSkKLQkJCQkJcG9ydC0+ZXJyX3NoYWRvdyB8PSBOUFBJX05PVElGWV9QQVJJVFk7Ci0JCQkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX0ZFKQotCQkJCQlwb3J0LT5lcnJfc2hhZG93IHw9IE5QUElfTk9USUZZX0ZSQU1JTkc7Ci0JCQkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX09FKQotCQkJCQlwb3J0LT5lcnJfc2hhZG93IHw9Ci0JCQkJCQlOUFBJX05PVElGWV9IV19PVkVSUlVOOwotCQkJCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9CSSkKLQkJCQkJcG9ydC0+ZXJyX3NoYWRvdyB8PSBOUFBJX05PVElGWV9CUkVBSzsKLQotCQkJCWlmIChwb3J0LT5ib2FyZC0+Y2hpcF9mbGFnKSB7Ci0JCQkJCWlmIChpaXIgPT0gTU9YQV9NVVNUX0lJUl9HREEgfHwKLQkJCQkJICAgIGlpciA9PSBNT1hBX01VU1RfSUlSX1JEQSB8fAotCQkJCQkgICAgaWlyID09IE1PWEFfTVVTVF9JSVJfUlRPIHx8Ci0JCQkJCSAgICBpaXIgPT0gTU9YQV9NVVNUX0lJUl9MU1IpCi0JCQkJCQlteHNlcl9yZWNlaXZlX2NoYXJzKHBvcnQsCi0JCQkJCQkJCSZzdGF0dXMpOwotCi0JCQkJfSBlbHNlIHsKLQkJCQkJc3RhdHVzICY9IHBvcnQtPnJlYWRfc3RhdHVzX21hc2s7Ci0JCQkJCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9EUikKLQkJCQkJCW14c2VyX3JlY2VpdmVfY2hhcnMocG9ydCwKLQkJCQkJCQkJJnN0YXR1cyk7Ci0JCQkJfQotCQkJCW1zciA9IGluYihwb3J0LT5pb2FkZHIgKyBVQVJUX01TUik7Ci0JCQkJaWYgKG1zciAmIFVBUlRfTVNSX0FOWV9ERUxUQSkKLQkJCQkJbXhzZXJfY2hlY2tfbW9kZW1fc3RhdHVzKHBvcnQsIG1zcik7Ci0KLQkJCQlpZiAocG9ydC0+Ym9hcmQtPmNoaXBfZmxhZykgewotCQkJCQlpZiAoaWlyID09IDB4MDIgJiYgKHN0YXR1cyAmCi0JCQkJCQkJCVVBUlRfTFNSX1RIUkUpKQotCQkJCQkJbXhzZXJfdHJhbnNtaXRfY2hhcnMocG9ydCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX1RIUkUpCi0JCQkJCQlteHNlcl90cmFuc21pdF9jaGFycyhwb3J0KTsKLQkJCQl9Ci0JCQl9IHdoaWxlIChpbnRfY250KysgPCBNWFNFUl9JU1JfUEFTU19MSU1JVCk7Ci0JCQlzcGluX3VubG9jaygmcG9ydC0+c2xvY2spOwotCQl9Ci0JfQotCi1pcnFfc3RvcDoKLQlyZXR1cm4gaGFuZGxlZDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBteHNlcl9vcHMgPSB7Ci0JLm9wZW4gPSBteHNlcl9vcGVuLAotCS5jbG9zZSA9IG14c2VyX2Nsb3NlLAotCS53cml0ZSA9IG14c2VyX3dyaXRlLAotCS5wdXRfY2hhciA9IG14c2VyX3B1dF9jaGFyLAotCS5mbHVzaF9jaGFycyA9IG14c2VyX2ZsdXNoX2NoYXJzLAotCS53cml0ZV9yb29tID0gbXhzZXJfd3JpdGVfcm9vbSwKLQkuY2hhcnNfaW5fYnVmZmVyID0gbXhzZXJfY2hhcnNfaW5fYnVmZmVyLAotCS5mbHVzaF9idWZmZXIgPSBteHNlcl9mbHVzaF9idWZmZXIsCi0JLmlvY3RsID0gbXhzZXJfaW9jdGwsCi0JLnRocm90dGxlID0gbXhzZXJfdGhyb3R0bGUsCi0JLnVudGhyb3R0bGUgPSBteHNlcl91bnRocm90dGxlLAotCS5zZXRfdGVybWlvcyA9IG14c2VyX3NldF90ZXJtaW9zLAotCS5zdG9wID0gbXhzZXJfc3RvcCwKLQkuc3RhcnQgPSBteHNlcl9zdGFydCwKLQkuaGFuZ3VwID0gbXhzZXJfaGFuZ3VwLAotCS5icmVha19jdGwgPSBteHNlcl9yc19icmVhaywKLQkud2FpdF91bnRpbF9zZW50ID0gbXhzZXJfd2FpdF91bnRpbF9zZW50LAotCS50aW9jbWdldCA9IG14c2VyX3Rpb2NtZ2V0LAotCS50aW9jbXNldCA9IG14c2VyX3Rpb2Ntc2V0LAotfTsKLQotLyoKLSAqIFRoZSBNT1hBIFNtYXJ0aW8vSW5kdXN0aW8gc2VyaWFsIGRyaXZlciBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gY29kZSEKLSAqLwotCi1zdGF0aWMgdm9pZCBteHNlcl9yZWxlYXNlX3JlcyhzdHJ1Y3QgbXhzZXJfYm9hcmQgKmJyZCwgc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCXVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKGlycSkKLQkJZnJlZV9pcnEoYnJkLT5pcnEsIGJyZCk7Ci0JaWYgKHBkZXYgIT0gTlVMTCkgewkvKiBQQ0kgKi8KLSNpZmRlZiBDT05GSUdfUENJCi0JCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAyKTsKLQkJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDMpOwotI2VuZGlmCi0JfSBlbHNlIHsKLQkJcmVsZWFzZV9yZWdpb24oYnJkLT5wb3J0c1swXS5pb2FkZHIsIDggKiBicmQtPmluZm8tPm5wb3J0cyk7Ci0JCXJlbGVhc2VfcmVnaW9uKGJyZC0+dmVjdG9yLCAxKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IG14c2VyX2luaXRicmQoc3RydWN0IG14c2VyX2JvYXJkICpicmQsCi0JCXN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBteHNlcl9wb3J0ICppbmZvOwotCXVuc2lnbmVkIGludCBpOwotCWludCByZXR2YWw7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJtYXguIGJhdWQgcmF0ZSA9ICVkIGJwcy5cbiIsIGJyZC0+cG9ydHNbMF0ubWF4X2JhdWQpOwotCi0JZm9yIChpID0gMDsgaSA8IGJyZC0+aW5mby0+bnBvcnRzOyBpKyspIHsKLQkJaW5mbyA9ICZicmQtPnBvcnRzW2ldOwotCQlpbmZvLT5ib2FyZCA9IGJyZDsKLQkJaW5mby0+c3RvcF9yeCA9IDA7Ci0JCWluZm8tPmxkaXNjX3N0b3BfcnggPSAwOwotCi0JCS8qIEVuaGFuY2UgbW9kZSBlbmFibGVkIGhlcmUgKi8KLQkJaWYgKGJyZC0+Y2hpcF9mbGFnICE9IE1PWEFfT1RIRVJfVUFSVCkKLQkJCUVOQUJMRV9NT1hBX01VU1RfRU5DSEFOQ0VfTU9ERShpbmZvLT5pb2FkZHIpOwotCi0JCWluZm8tPmZsYWdzID0gQVNZTkNfU0hBUkVfSVJROwotCQlpbmZvLT50eXBlID0gYnJkLT51YXJ0X3R5cGU7Ci0KLQkJcHJvY2Vzc190eHJ4X2ZpZm8oaW5mbyk7Ci0KLQkJaW5mby0+Y3VzdG9tX2Rpdmlzb3IgPSBpbmZvLT5iYXVkX2Jhc2UgKiAxNjsKLQkJaW5mby0+Y2xvc2VfZGVsYXkgPSA1ICogSFogLyAxMDsKLQkJaW5mby0+Y2xvc2luZ193YWl0ID0gMzAgKiBIWjsKLQkJaW5mby0+bm9ybWFsX3Rlcm1pb3MgPSBteHZhcl9zZHJpdmVyLT5pbml0X3Rlcm1pb3M7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPm9wZW5fd2FpdCk7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmRlbHRhX21zcl93YWl0KTsKLQkJaW5mby0+c3BlZWQgPSA5NjAwOwotCQltZW1zZXQoJmluZm8tPm1vbl9kYXRhLCAwLCBzaXplb2Yoc3RydWN0IG14c2VyX21vbikpOwotCQlpbmZvLT5lcnJfc2hhZG93ID0gMDsKLQkJc3Bpbl9sb2NrX2luaXQoJmluZm8tPnNsb2NrKTsKLQotCQkvKiBiZWZvcmUgc2V0IElOVCBJU1IsIGRpc2FibGUgYWxsIGludCAqLwotCQlvdXRiKGluYihpbmZvLT5pb2FkZHIgKyBVQVJUX0lFUikgJiAweGYwLAotCQkJaW5mby0+aW9hZGRyICsgVUFSVF9JRVIpOwotCX0KLQotCXJldHZhbCA9IHJlcXVlc3RfaXJxKGJyZC0+aXJxLCBteHNlcl9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCAibXhzZXIiLAotCQkJYnJkKTsKLQlpZiAocmV0dmFsKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQm9hcmQgJXM6IFJlcXVlc3QgaXJxIGZhaWxlZCwgSVJRICglZCkgbWF5ICIKLQkJCSJjb25mbGljdCB3aXRoIGFub3RoZXIgZGV2aWNlLlxuIiwKLQkJCWJyZC0+aW5mby0+bmFtZSwgYnJkLT5pcnEpOwotCQkvKiBXZSBob2xkIHJlc291cmNlcywgd2UgbmVlZCB0byByZWxlYXNlIHRoZW0uICovCi0JCW14c2VyX3JlbGVhc2VfcmVzKGJyZCwgcGRldiwgMCk7Ci0JfQotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IG14c2VyX2dldF9JU0FfY29uZihpbnQgY2FwLCBzdHJ1Y3QgbXhzZXJfYm9hcmQgKmJyZCkKLXsKLQlpbnQgaWQsIGksIGJpdHM7Ci0JdW5zaWduZWQgc2hvcnQgcmVnc1sxNl0sIGlycTsKLQl1bnNpZ25lZCBjaGFyIHNjcmF0Y2gsIHNjcmF0Y2gyOwotCi0JYnJkLT5jaGlwX2ZsYWcgPSBNT1hBX09USEVSX1VBUlQ7Ci0KLQlpZCA9IG14c2VyX3JlYWRfcmVnaXN0ZXIoY2FwLCByZWdzKTsKLQlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBDMTY4X0FTSUNfSUQ6Ci0JCWJyZC0+aW5mbyA9ICZteHNlcl9jYXJkc1swXTsKLQkJYnJlYWs7Ci0JY2FzZSBDMTA0X0FTSUNfSUQ6Ci0JCWJyZC0+aW5mbyA9ICZteHNlcl9jYXJkc1sxXTsKLQkJYnJlYWs7Ci0JY2FzZSBDSTEwNEpfQVNJQ19JRDoKLQkJYnJkLT5pbmZvID0gJm14c2VyX2NhcmRzWzJdOwotCQlicmVhazsKLQljYXNlIEMxMDJfQVNJQ19JRDoKLQkJYnJkLT5pbmZvID0gJm14c2VyX2NhcmRzWzVdOwotCQlicmVhazsKLQljYXNlIENJMTMyX0FTSUNfSUQ6Ci0JCWJyZC0+aW5mbyA9ICZteHNlcl9jYXJkc1s2XTsKLQkJYnJlYWs7Ci0JY2FzZSBDSTEzNF9BU0lDX0lEOgotCQlicmQtPmluZm8gPSAmbXhzZXJfY2FyZHNbN107Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAwOwotCX0KLQotCWlycSA9IDA7Ci0JLyogc29tZSBJU0EgY2FyZHMgaGF2ZSAyIHBvcnRzLCBidXQgd2Ugd2FudCB0byBzZWUgdGhlbSBhcyA0LXBvcnQgKHdoeT8pCi0JICAgRmxhZy1oYWNrIGNoZWNrcyBpZiBjb25maWd1cmF0aW9uIHNob3VsZCBiZSByZWFkIGFzIDItcG9ydCBoZXJlLiAqLwotCWlmIChicmQtPmluZm8tPm5wb3J0cyA9PSAyIHx8IChicmQtPmluZm8tPmZsYWdzICYgTVhTRVJfSEFTMikpIHsKLQkJaXJxID0gcmVnc1s5XSAmIDB4RjAwMDsKLQkJaXJxID0gaXJxIHwgKGlycSA+PiA0KTsKLQkJaWYgKGlycSAhPSAocmVnc1s5XSAmIDB4RkYwMCkpCi0JCQlyZXR1cm4gTVhTRVJfRVJSX0lSUV9DT05GTElUOwotCX0gZWxzZSBpZiAoYnJkLT5pbmZvLT5ucG9ydHMgPT0gNCkgewotCQlpcnEgPSByZWdzWzldICYgMHhGMDAwOwotCQlpcnEgPSBpcnEgfCAoaXJxID4+IDQpOwotCQlpcnEgPSBpcnEgfCAoaXJxID4+IDgpOwotCQlpZiAoaXJxICE9IHJlZ3NbOV0pCi0JCQlyZXR1cm4gTVhTRVJfRVJSX0lSUV9DT05GTElUOwotCX0gZWxzZSBpZiAoYnJkLT5pbmZvLT5ucG9ydHMgPT0gOCkgewotCQlpcnEgPSByZWdzWzldICYgMHhGMDAwOwotCQlpcnEgPSBpcnEgfCAoaXJxID4+IDQpOwotCQlpcnEgPSBpcnEgfCAoaXJxID4+IDgpOwotCQlpZiAoKGlycSAhPSByZWdzWzldKSB8fCAoaXJxICE9IHJlZ3NbMTBdKSkKLQkJCXJldHVybiBNWFNFUl9FUlJfSVJRX0NPTkZMSVQ7Ci0JfQotCi0JaWYgKCFpcnEpCi0JCXJldHVybiBNWFNFUl9FUlJfSVJROwotCWJyZC0+aXJxID0gKChpbnQpKGlycSAmIDB4RjAwMCkgPj4gMTIpOwotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCWJyZC0+cG9ydHNbaV0uaW9hZGRyID0gKGludCkgcmVnc1tpICsgMV0gJiAweEZGRjg7Ci0JaWYgKChyZWdzWzEyXSAmIDB4ODApID09IDApCi0JCXJldHVybiBNWFNFUl9FUlJfVkVDVE9SOwotCWJyZC0+dmVjdG9yID0gKGludClyZWdzWzExXTsJLyogaW50ZXJydXB0IHZlY3RvciAqLwotCWlmIChpZCA9PSAxKQotCQlicmQtPnZlY3Rvcl9tYXNrID0gMHgwMEZGOwotCWVsc2UKLQkJYnJkLT52ZWN0b3JfbWFzayA9IDB4MDAwRjsKLQlmb3IgKGkgPSA3LCBiaXRzID0gMHgwMTAwOyBpID49IDA7IGktLSwgYml0cyA8PD0gMSkgewotCQlpZiAocmVnc1sxMl0gJiBiaXRzKSB7Ci0JCQlicmQtPnBvcnRzW2ldLmJhdWRfYmFzZSA9IDkyMTYwMDsKLQkJCWJyZC0+cG9ydHNbaV0ubWF4X2JhdWQgPSA5MjE2MDA7Ci0JCX0gZWxzZSB7Ci0JCQlicmQtPnBvcnRzW2ldLmJhdWRfYmFzZSA9IDExNTIwMDsKLQkJCWJyZC0+cG9ydHNbaV0ubWF4X2JhdWQgPSAxMTUyMDA7Ci0JCX0KLQl9Ci0Jc2NyYXRjaDIgPSBpbmIoY2FwICsgVUFSVF9MQ1IpICYgKH5VQVJUX0xDUl9ETEFCKTsKLQlvdXRiKHNjcmF0Y2gyIHwgVUFSVF9MQ1JfRExBQiwgY2FwICsgVUFSVF9MQ1IpOwotCW91dGIoMCwgY2FwICsgVUFSVF9FRlIpOwkvKiBFRlIgaXMgdGhlIHNhbWUgYXMgRkNSICovCi0Jb3V0YihzY3JhdGNoMiwgY2FwICsgVUFSVF9MQ1IpOwotCW91dGIoVUFSVF9GQ1JfRU5BQkxFX0ZJRk8sIGNhcCArIFVBUlRfRkNSKTsKLQlzY3JhdGNoID0gaW5iKGNhcCArIFVBUlRfSUlSKTsKLQotCWlmIChzY3JhdGNoICYgMHhDMCkKLQkJYnJkLT51YXJ0X3R5cGUgPSBQT1JUXzE2NTUwQTsKLQllbHNlCi0JCWJyZC0+dWFydF90eXBlID0gUE9SVF8xNjQ1MDsKLQlpZiAoIXJlcXVlc3RfcmVnaW9uKGJyZC0+cG9ydHNbMF0uaW9hZGRyLCA4ICogYnJkLT5pbmZvLT5ucG9ydHMsCi0JCQkibXhzZXIoSU8pIikpCi0JCXJldHVybiBNWFNFUl9FUlJfSU9BRERSOwotCWlmICghcmVxdWVzdF9yZWdpb24oYnJkLT52ZWN0b3IsIDEsICJteHNlcih2ZWN0b3IpIikpIHsKLQkJcmVsZWFzZV9yZWdpb24oYnJkLT5wb3J0c1swXS5pb2FkZHIsIDggKiBicmQtPmluZm8tPm5wb3J0cyk7Ci0JCXJldHVybiBNWFNFUl9FUlJfVkVDVE9SOwotCX0KLQlyZXR1cm4gYnJkLT5pbmZvLT5ucG9ydHM7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IG14c2VyX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQotewotI2lmZGVmIENPTkZJR19QQ0kKLQlzdHJ1Y3QgbXhzZXJfYm9hcmQgKmJyZDsKLQl1bnNpZ25lZCBpbnQgaSwgajsKLQl1bnNpZ25lZCBsb25nIGlvYWRkcmVzczsKLQlpbnQgcmV0dmFsID0gLUVJTlZBTDsKLQotCWZvciAoaSA9IDA7IGkgPCBNWFNFUl9CT0FSRFM7IGkrKykKLQkJaWYgKG14c2VyX2JvYXJkc1tpXS5pbmZvID09IE5VTEwpCi0JCQlicmVhazsKLQotCWlmIChpID49IE1YU0VSX0JPQVJEUykgewotCQlwcmludGsoS0VSTl9FUlIgIlRvbyBtYW55IFNtYXJ0aW8vSW5kdXN0aW8gZmFtaWx5IGJvYXJkcyBmb3VuZCAiCi0JCQkiKG1heGltdW0gJWQpLCBib2FyZCBub3QgY29uZmlndXJlZFxuIiwgTVhTRVJfQk9BUkRTKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JYnJkID0gJm14c2VyX2JvYXJkc1tpXTsKLQlicmQtPmlkeCA9IGkgKiBNWFNFUl9QT1JUU19QRVJfQk9BUkQ7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgTU9YQSAlcyBib2FyZCAoQnVzTm89JWQsIERldk5vPSVkKVxuIiwKLQkJbXhzZXJfY2FyZHNbZW50LT5kcml2ZXJfZGF0YV0ubmFtZSwKLQkJcGRldi0+YnVzLT5udW1iZXIsIFBDSV9TTE9UKHBkZXYtPmRldmZuKSk7Ci0KLQlyZXR2YWwgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKLQlpZiAocmV0dmFsKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTW94YSBTbWFydEkvTyBQQ0kgZW5hYmxlIGZhaWwgIVxuIik7Ci0JCWdvdG8gZXJyOwotCX0KLQotCS8qIGlvIGFkZHJlc3MgKi8KLQlpb2FkZHJlc3MgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMik7Ci0JcmV0dmFsID0gcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIDIsICJteHNlcihJTykiKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGVycjsKLQotCWJyZC0+aW5mbyA9ICZteHNlcl9jYXJkc1tlbnQtPmRyaXZlcl9kYXRhXTsKLQlmb3IgKGkgPSAwOyBpIDwgYnJkLT5pbmZvLT5ucG9ydHM7IGkrKykKLQkJYnJkLT5wb3J0c1tpXS5pb2FkZHIgPSBpb2FkZHJlc3MgKyA4ICogaTsKLQotCS8qIHZlY3RvciAqLwotCWlvYWRkcmVzcyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKTsKLQlyZXR2YWwgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgMywgIm14c2VyKHZlY3RvcikiKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGVycl9yZWxpbzsKLQlicmQtPnZlY3RvciA9IGlvYWRkcmVzczsKLQotCS8qIGlycSAqLwotCWJyZC0+aXJxID0gcGRldi0+aXJxOwotCi0JYnJkLT5jaGlwX2ZsYWcgPSBDaGVja0lzTW94YU11c3QoYnJkLT5wb3J0c1swXS5pb2FkZHIpOwotCWJyZC0+dWFydF90eXBlID0gUE9SVF8xNjU1MEE7Ci0JYnJkLT52ZWN0b3JfbWFzayA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYnJkLT5pbmZvLT5ucG9ydHM7IGkrKykgewotCQlmb3IgKGogPSAwOyBqIDwgVUFSVF9JTkZPX05VTTsgaisrKSB7Ci0JCQlpZiAoR3BjaV91YXJ0X2luZm9bal0udHlwZSA9PSBicmQtPmNoaXBfZmxhZykgewotCQkJCWJyZC0+cG9ydHNbaV0ubWF4X2JhdWQgPQotCQkJCQlHcGNpX3VhcnRfaW5mb1tqXS5tYXhfYmF1ZDsKLQotCQkJCS8qIGV4Y2VwdGlvbi4uLi5DUC0xMDIgKi8KLQkJCQlpZiAoYnJkLT5pbmZvLT5mbGFncyAmIE1YU0VSX0hJR0hCQVVEKQotCQkJCQlicmQtPnBvcnRzW2ldLm1heF9iYXVkID0gOTIxNjAwOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKGJyZC0+Y2hpcF9mbGFnID09IE1PWEFfTVVTVF9NVTg2MF9IV0lEKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBicmQtPmluZm8tPm5wb3J0czsgaSsrKSB7Ci0JCQlpZiAoaSA8IDQpCi0JCQkJYnJkLT5wb3J0c1tpXS5vcG1vZGVfaW9hZGRyID0gaW9hZGRyZXNzICsgNDsKLQkJCWVsc2UKLQkJCQlicmQtPnBvcnRzW2ldLm9wbW9kZV9pb2FkZHIgPSBpb2FkZHJlc3MgKyAweDBjOwotCQl9Ci0JCW91dGIoMCwgaW9hZGRyZXNzICsgNCk7CS8qIGRlZmF1bHQgc2V0IHRvIFJTMjMyIG1vZGUgKi8KLQkJb3V0YigwLCBpb2FkZHJlc3MgKyAweDBjKTsJLyogZGVmYXVsdCBzZXQgdG8gUlMyMzIgbW9kZSAqLwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBicmQtPmluZm8tPm5wb3J0czsgaSsrKSB7Ci0JCWJyZC0+dmVjdG9yX21hc2sgfD0gKDEgPDwgaSk7Ci0JCWJyZC0+cG9ydHNbaV0uYmF1ZF9iYXNlID0gOTIxNjAwOwotCX0KLQotCS8qIG14c2VyX2luaXRicmQgd2lsbCBob29rIElTUi4gKi8KLQlyZXR2YWwgPSBteHNlcl9pbml0YnJkKGJyZCwgcGRldik7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBlcnJfbnVsbDsKLQotCWZvciAoaSA9IDA7IGkgPCBicmQtPmluZm8tPm5wb3J0czsgaSsrKQotCQl0dHlfcmVnaXN0ZXJfZGV2aWNlKG14dmFyX3Nkcml2ZXIsIGJyZC0+aWR4ICsgaSwgJnBkZXYtPmRldik7Ci0KLQlwY2lfc2V0X2RydmRhdGEocGRldiwgYnJkKTsKLQotCXJldHVybiAwOwotZXJyX3JlbGlvOgotCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAyKTsKLWVycl9udWxsOgotCWJyZC0+aW5mbyA9IE5VTEw7Ci1lcnI6Ci0JcmV0dXJuIHJldHZhbDsKLSNlbHNlCi0JcmV0dXJuIC1FTk9ERVY7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQgX19kZXZleGl0IG14c2VyX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgbXhzZXJfYm9hcmQgKmJyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBicmQtPmluZm8tPm5wb3J0czsgaSsrKQotCQl0dHlfdW5yZWdpc3Rlcl9kZXZpY2UobXh2YXJfc2RyaXZlciwgYnJkLT5pZHggKyBpKTsKLQotCW14c2VyX3JlbGVhc2VfcmVzKGJyZCwgcGRldiwgMSk7Ci0JYnJkLT5pbmZvID0gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIG14c2VyX2RyaXZlciA9IHsKLQkubmFtZSA9ICJteHNlciIsCi0JLmlkX3RhYmxlID0gbXhzZXJfcGNpYnJkcywKLQkucHJvYmUgPSBteHNlcl9wcm9iZSwKLQkucmVtb3ZlID0gX19kZXZleGl0X3AobXhzZXJfcmVtb3ZlKQotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXhzZXJfbW9kdWxlX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgbXhzZXJfYm9hcmQgKmJyZDsKLQl1bnNpZ25lZCBsb25nIGNhcDsKLQl1bnNpZ25lZCBpbnQgaSwgbSwgaXNhbG9vcDsKLQlpbnQgcmV0dmFsLCBiOwotCi0JcHJfZGVidWcoIkxvYWRpbmcgbW9kdWxlIG14c2VyIC4uLlxuIik7Ci0KLQlteHZhcl9zZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihNWFNFUl9QT1JUUyArIDEpOwotCWlmICghbXh2YXJfc2RyaXZlcikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwcmludGsoS0VSTl9JTkZPICJNT1hBIFNtYXJ0aW8vSW5kdXN0aW8gZmFtaWx5IGRyaXZlciB2ZXJzaW9uICVzXG4iLAotCQlNWFNFUl9WRVJTSU9OKTsKLQotCS8qIEluaXRpYWxpemUgdGhlIHR0eV9kcml2ZXIgc3RydWN0dXJlICovCi0JbXh2YXJfc2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKLQlteHZhcl9zZHJpdmVyLT5tYWdpYyA9IFRUWV9EUklWRVJfTUFHSUM7Ci0JbXh2YXJfc2RyaXZlci0+bmFtZSA9ICJ0dHlNSSI7Ci0JbXh2YXJfc2RyaXZlci0+bWFqb3IgPSB0dHltYWpvcjsKLQlteHZhcl9zZHJpdmVyLT5taW5vcl9zdGFydCA9IDA7Ci0JbXh2YXJfc2RyaXZlci0+bnVtID0gTVhTRVJfUE9SVFMgKyAxOwotCW14dmFyX3Nkcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOwotCW14dmFyX3Nkcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7Ci0JbXh2YXJfc2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOwotCW14dmFyX3Nkcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjk2MDB8Q1M4fENSRUFEfEhVUENMfENMT0NBTDsKLQlteHZhcl9zZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVd8VFRZX0RSSVZFUl9EWU5BTUlDX0RFVjsKLQl0dHlfc2V0X29wZXJhdGlvbnMobXh2YXJfc2RyaXZlciwgJm14c2VyX29wcyk7Ci0KLQlyZXR2YWwgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKG14dmFyX3Nkcml2ZXIpOwotCWlmIChyZXR2YWwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZG4ndCBpbnN0YWxsIE1PWEEgU21hcnRpby9JbmR1c3RpbyBmYW1pbHkgIgotCQkJCSJ0dHkgZHJpdmVyICFcbiIpOwotCQlnb3RvIGVycl9wdXQ7Ci0JfQotCi0JbXh2YXJfZGlhZ2ZsYWcgPSAwOwotCi0JbSA9IDA7Ci0JLyogU3RhcnQgZmluZGluZyBJU0EgYm9hcmRzIGhlcmUgKi8KLQlmb3IgKGlzYWxvb3AgPSAwOyBpc2Fsb29wIDwgMjsgaXNhbG9vcCsrKQotCQlmb3IgKGIgPSAwOyBiIDwgTVhTRVJfQk9BUkRTICYmIG0gPCBNWFNFUl9CT0FSRFM7IGIrKykgewotCQkJaWYgKCFpc2Fsb29wKQotCQkJCWNhcCA9IG14c2VyQm9hcmRDQVBbYl07IC8qIHByZWRlZmluZWQgKi8KLQkJCWVsc2UKLQkJCQljYXAgPSBpb2FkZHJbYl07IC8qIG1vZHVsZSBwYXJhbSAqLwotCi0JCQlpZiAoIWNhcCkKLQkJCQljb250aW51ZTsKLQotCQkJYnJkID0gJm14c2VyX2JvYXJkc1ttXTsKLQkJCXJldHZhbCA9IG14c2VyX2dldF9JU0FfY29uZihjYXAsIGJyZCk7Ci0KLQkJCWlmIChyZXR2YWwgIT0gMCkKLQkJCQlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBNT1hBICVzIGJvYXJkICIKLQkJCQkJIihDQVA9MHgleClcbiIsCi0JCQkJCWJyZC0+aW5mby0+bmFtZSwgaW9hZGRyW2JdKTsKLQotCQkJaWYgKHJldHZhbCA8PSAwKSB7Ci0JCQkJaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfSVJRKQotCQkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0ICIKLQkJCQkJCSJudW1iZXIsIGJvYXJkIG5vdCAiCi0JCQkJCQkiY29uZmlndXJlZFxuIik7Ci0JCQkJZWxzZSBpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JUlFfQ09ORkxJVCkKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGludGVycnVwdCAiCi0JCQkJCQkibnVtYmVyLCBib2FyZCBub3QgIgotCQkJCQkJImNvbmZpZ3VyZWRcbiIpOwotCQkJCWVsc2UgaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfVkVDVE9SKQotCQkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0ICIKLQkJCQkJCSJ2ZWN0b3IsIGJvYXJkIG5vdCAiCi0JCQkJCQkiY29uZmlndXJlZFxuIik7Ci0JCQkJZWxzZSBpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JT0FERFIpCi0JCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBJL08gYWRkcmVzcywgIgotCQkJCQkJImJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKLQotCQkJCWJyZC0+aW5mbyA9IE5VTEw7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8qIG14c2VyX2luaXRicmQgd2lsbCBob29rIElTUi4gKi8KLQkJCWlmIChteHNlcl9pbml0YnJkKGJyZCwgTlVMTCkgPCAwKSB7Ci0JCQkJYnJkLT5pbmZvID0gTlVMTDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJYnJkLT5pZHggPSBtICogTVhTRVJfUE9SVFNfUEVSX0JPQVJEOwotCQkJZm9yIChpID0gMDsgaSA8IGJyZC0+aW5mby0+bnBvcnRzOyBpKyspCi0JCQkJdHR5X3JlZ2lzdGVyX2RldmljZShteHZhcl9zZHJpdmVyLCBicmQtPmlkeCArIGksCi0JCQkJCQlOVUxMKTsKLQotCQkJbSsrOwotCQl9Ci0KLQlyZXR2YWwgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZteHNlcl9kcml2ZXIpOwotCWlmIChyZXR2YWwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCByZWdpc3RlciBwY2kgZHJpdmVyXG4iKTsKLQkJaWYgKCFtKSB7Ci0JCQlyZXR2YWwgPSAtRU5PREVWOwotCQkJZ290byBlcnJfdW5yOwotCQl9IC8qIGVsc2U6IHdlIGhhdmUgc29tZSBJU0EgY2FyZHMgdW5kZXIgY29udHJvbCAqLwotCX0KLQotCXByX2RlYnVnKCJEb25lLlxuIik7Ci0KLQlyZXR1cm4gMDsKLWVycl91bnI6Ci0JdHR5X3VucmVnaXN0ZXJfZHJpdmVyKG14dmFyX3Nkcml2ZXIpOwotZXJyX3B1dDoKLQlwdXRfdHR5X2RyaXZlcihteHZhcl9zZHJpdmVyKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXhzZXJfbW9kdWxlX2V4aXQodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgaSwgajsKLQotCXByX2RlYnVnKCJVbmxvYWRpbmcgbW9kdWxlIG14c2VyIC4uLlxuIik7Ci0KLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm14c2VyX2RyaXZlcik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTVhTRVJfQk9BUkRTOyBpKyspIC8qIElTQSByZW1haW5zICovCi0JCWlmIChteHNlcl9ib2FyZHNbaV0uaW5mbyAhPSBOVUxMKQotCQkJZm9yIChqID0gMDsgaiA8IG14c2VyX2JvYXJkc1tpXS5pbmZvLT5ucG9ydHM7IGorKykKLQkJCQl0dHlfdW5yZWdpc3Rlcl9kZXZpY2UobXh2YXJfc2RyaXZlciwKLQkJCQkJCW14c2VyX2JvYXJkc1tpXS5pZHggKyBqKTsKLQl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIobXh2YXJfc2RyaXZlcik7Ci0JcHV0X3R0eV9kcml2ZXIobXh2YXJfc2RyaXZlcik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTVhTRVJfQk9BUkRTOyBpKyspCi0JCWlmIChteHNlcl9ib2FyZHNbaV0uaW5mbyAhPSBOVUxMKQotCQkJbXhzZXJfcmVsZWFzZV9yZXMoJm14c2VyX2JvYXJkc1tpXSwgTlVMTCwgMSk7Ci0KLQlwcl9kZWJ1ZygiRG9uZS5cbiIpOwotfQotCi1tb2R1bGVfaW5pdChteHNlcl9tb2R1bGVfaW5pdCk7Ci1tb2R1bGVfZXhpdChteHNlcl9tb2R1bGVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXhzZXJfbmV3LmggYi9kcml2ZXJzL2NoYXIvbXhzZXJfbmV3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MmY3NzYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL214c2VyX25ldy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLSNpZm5kZWYgX01YU0VSX0gKLSNkZWZpbmUgX01YU0VSX0gKLQotLyoKLSAqCVNlbWktcHVibGljIGNvbnRyb2wgaW50ZXJmYWNlcwotICovCi0KLS8qCi0gKglNT1hBIGlvY3RscwotICovCi0KLSNkZWZpbmUgTU9YQQkJCTB4NDAwCi0jZGVmaW5lIE1PWEFfR0VUREFUQUNPVU5UCShNT1hBICsgMjMpCi0jZGVmaW5lCU1PWEFfR0VUX0NPTkYJCShNT1hBICsgMzUpCi0jZGVmaW5lIE1PWEFfRElBR05PU0UJCShNT1hBICsgNTApCi0jZGVmaW5lIE1PWEFfQ0hLUE9SVEVOQUJMRQkoTU9YQSArIDYwKQotI2RlZmluZSBNT1hBX0hpZ2hTcGVlZE9uCShNT1hBICsgNjEpCi0jZGVmaW5lIE1PWEFfR0VUX01BSk9SCQkoTU9YQSArIDYzKQotI2RlZmluZSBNT1hBX0dFVF9DVU1BSk9SCShNT1hBICsgNjQpCi0jZGVmaW5lIE1PWEFfR0VUTVNUQVRVUwkJKE1PWEEgKyA2NSkKLSNkZWZpbmUgTU9YQV9TRVRfT1BfTU9ERQkoTU9YQSArIDY2KQotI2RlZmluZSBNT1hBX0dFVF9PUF9NT0RFCShNT1hBICsgNjcpCi0KLSNkZWZpbmUgUlMyMzJfTU9ERQkJMAotI2RlZmluZSBSUzQ4NV8yV0lSRV9NT0RFCTEKLSNkZWZpbmUgUlM0MjJfTU9ERQkJMgotI2RlZmluZSBSUzQ4NV80V0lSRV9NT0RFCTMKLSNkZWZpbmUgT1BfTU9ERV9NQVNLCQkzCi0KLSNkZWZpbmUgTU9YQV9TRFNfUlNUSUNPVU5URVIJKE1PWEEgKyA2OSkKLSNkZWZpbmUgTU9YQV9BU1BQX09RVUVVRSAgCShNT1hBICsgNzApCi0jZGVmaW5lIE1PWEFfQVNQUF9TRVRCQVVEIAkoTU9YQSArIDcxKQotI2RlZmluZSBNT1hBX0FTUFBfR0VUQkFVRCAJKE1PWEEgKyA3MikKLSNkZWZpbmUgTU9YQV9BU1BQX01PTiAgICAgCShNT1hBICsgNzMpCi0jZGVmaW5lIE1PWEFfQVNQUF9MU1RBVFVTIAkoTU9YQSArIDc0KQotI2RlZmluZSBNT1hBX0FTUFBfTU9OX0VYVCAJKE1PWEEgKyA3NSkKLSNkZWZpbmUgTU9YQV9TRVRfQkFVRF9NRVRIT0QJKE1PWEEgKyA3NikKLSNkZWZpbmUgTU9YQV9TRVRfU1BFQ0lBTF9CQVVEX1JBVEUJKE1PWEEgKyA3NykKLSNkZWZpbmUgTU9YQV9HRVRfU1BFQ0lBTF9CQVVEX1JBVEUJKE1PWEEgKyA3OCkKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNkZWZpbmUgTlBQSV9OT1RJRllfUEFSSVRZCTB4MDEKLSNkZWZpbmUgTlBQSV9OT1RJRllfRlJBTUlORwkweDAyCi0jZGVmaW5lIE5QUElfTk9USUZZX0hXX09WRVJSVU4JMHgwNAotI2RlZmluZSBOUFBJX05PVElGWV9TV19PVkVSUlVOCTB4MDgKLSNkZWZpbmUgTlBQSV9OT1RJRllfQlJFQUsJMHgxMAotCi0jZGVmaW5lIE5QUElfTk9USUZZX0NUU0hPTEQgICAgICAgICAweDAxCS8qIFR4IGhvbGQgYnkgQ1RTIGxvdyAqLwotI2RlZmluZSBOUFBJX05PVElGWV9EU1JIT0xEICAgICAgICAgMHgwMgkvKiBUeCBob2xkIGJ5IERTUiBsb3cgKi8KLSNkZWZpbmUgTlBQSV9OT1RJRllfWE9GRkhPTEQgICAgICAgIDB4MDgJLyogVHggaG9sZCBieSBYb2ZmIHJlY2VpdmVkICovCi0jZGVmaW5lIE5QUElfTk9USUZZX1hPRkZYRU5UICAgICAgICAweDEwCS8qIFhvZmYgU2VudCAqLwotCi0vKiBmb2xsb3cganVzdCBmb3IgTW94YSBNdXN0IGNoaXAgZGVmaW5lLiAqLwotLyogKi8KLS8qIHdoZW4gTENSIHJlZ2lzdGVyIChvZmZzZXQgMHgwMykgd3JpdGUgZm9sbG93aW5nIHZhbHVlLCAqLwotLyogdGhlIE11c3QgY2hpcCB3aWxsIGVudGVyIGVuY2hhbmNlIG1vZGUuIEFuZCB3cml0ZSB2YWx1ZSAqLwotLyogb24gRUZSIChvZmZzZXQgMHgwMikgYml0IDYsNyB0byBjaGFuZ2UgYmFuay4gKi8KLSNkZWZpbmUgTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFCTB4QkYKLQotLyogd2hlbiBlbmhhbmNlIG1vZGUgZW5hYmxlLCBhY2Nlc3Mgb24gZ2VuZXJhbCBiYW5rIHJlZ2lzdGVyICovCi0jZGVmaW5lIE1PWEFfTVVTVF9HRExfUkVHSVNURVIJCTB4MDcKLSNkZWZpbmUgTU9YQV9NVVNUX0dETF9NQVNLCQkweDdGCi0jZGVmaW5lIE1PWEFfTVVTVF9HRExfSEFTX0JBRF9EQVRBCTB4ODAKLQotI2RlZmluZSBNT1hBX01VU1RfTFNSX1JFUlIJCTB4ODAJLyogZXJyb3IgaW4gcmVjZWl2ZSBGSUZPICovCi0vKiBlbmNoYW5jZSByZWdpc3RlciBiYW5rIHNlbGVjdCBhbmQgZW5jaGFuY2UgbW9kZSBzZXR0aW5nIHJlZ2lzdGVyICovCi0vKiB3aGVuIExDUiByZWdpc3RlciBlcXVhbCB0byAweEJGICovCi0jZGVmaW5lIE1PWEFfTVVTVF9FRlJfUkVHSVNURVIJCTB4MDIKLS8qIGVuY2hhbmNlIG1vZGUgZW5hYmxlICovCi0jZGVmaW5lIE1PWEFfTVVTVF9FRlJfRUZSQl9FTkFCTEUJMHgxMAotLyogZW5jaGFuY2UgcmVpc3RlciBiYW5rIHNldCAwLCAxLCAyICovCi0jZGVmaW5lIE1PWEFfTVVTVF9FRlJfQkFOSzAJCTB4MDAKLSNkZWZpbmUgTU9YQV9NVVNUX0VGUl9CQU5LMQkJMHg0MAotI2RlZmluZSBNT1hBX01VU1RfRUZSX0JBTksyCQkweDgwCi0jZGVmaW5lIE1PWEFfTVVTVF9FRlJfQkFOSzMJCTB4QzAKLSNkZWZpbmUgTU9YQV9NVVNUX0VGUl9CQU5LX01BU0sJCTB4QzAKLQotLyogc2V0IFhPTjEgdmFsdWUgcmVnaXN0ZXIsIHdoZW4gTENSPTB4QkYgYW5kIGNoYW5nZSB0byBiYW5rMCAqLwotI2RlZmluZSBNT1hBX01VU1RfWE9OMV9SRUdJU1RFUgkJMHgwNAotCi0vKiBzZXQgWE9OMiB2YWx1ZSByZWdpc3Rlciwgd2hlbiBMQ1I9MHhCRiBhbmQgY2hhbmdlIHRvIGJhbmswICovCi0jZGVmaW5lIE1PWEFfTVVTVF9YT04yX1JFR0lTVEVSCQkweDA1Ci0KLS8qIHNldCBYT0ZGMSB2YWx1ZSByZWdpc3Rlciwgd2hlbiBMQ1I9MHhCRiBhbmQgY2hhbmdlIHRvIGJhbmswICovCi0jZGVmaW5lIE1PWEFfTVVTVF9YT0ZGMV9SRUdJU1RFUgkweDA2Ci0KLS8qIHNldCBYT0ZGMiB2YWx1ZSByZWdpc3Rlciwgd2hlbiBMQ1I9MHhCRiBhbmQgY2hhbmdlIHRvIGJhbmswICovCi0jZGVmaW5lIE1PWEFfTVVTVF9YT0ZGMl9SRUdJU1RFUgkweDA3Ci0KLSNkZWZpbmUgTU9YQV9NVVNUX1JCUlRMX1JFR0lTVEVSCTB4MDQKLSNkZWZpbmUgTU9YQV9NVVNUX1JCUlRIX1JFR0lTVEVSCTB4MDUKLSNkZWZpbmUgTU9YQV9NVVNUX1JCUlRJX1JFR0lTVEVSCTB4MDYKLSNkZWZpbmUgTU9YQV9NVVNUX1RIUlRMX1JFR0lTVEVSCTB4MDcKLSNkZWZpbmUgTU9YQV9NVVNUX0VOVU1fUkVHSVNURVIJCTB4MDQKLSNkZWZpbmUgTU9YQV9NVVNUX0hXSURfUkVHSVNURVIJCTB4MDUKLSNkZWZpbmUgTU9YQV9NVVNUX0VDUl9SRUdJU1RFUgkJMHgwNgotI2RlZmluZSBNT1hBX01VU1RfQ1NSX1JFR0lTVEVSCQkweDA3Ci0KLS8qIGdvb2QgZGF0YSBtb2RlIGVuYWJsZSAqLwotI2RlZmluZSBNT1hBX01VU1RfRkNSX0dEQV9NT0RFX0VOQUJMRQkweDIwCi0vKiBvbmx5IGdvb2QgZGF0YSBwdXQgaW50byBSeEZJRk8gKi8KLSNkZWZpbmUgTU9YQV9NVVNUX0ZDUl9HREFfT05MWV9FTkFCTEUJMHgxMAotCi0vKiBlbmFibGUgQ1RTIGludGVycnVwdCAqLwotI2RlZmluZSBNT1hBX01VU1RfSUVSX0VDVFNJCQkweDgwCi0vKiBlbmFibGUgUlRTIGludGVycnVwdCAqLwotI2RlZmluZSBNT1hBX01VU1RfSUVSX0VSVFNJCQkweDQwCi0vKiBlbmFibGUgWG9uL1hvZmYgaW50ZXJydXB0ICovCi0jZGVmaW5lIE1PWEFfTVVTVF9JRVJfWElOVAkJMHgyMAotLyogZW5hYmxlIEdEQSBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgTU9YQV9NVVNUX0lFUl9FR0RBSQkJMHgxMAotCi0jZGVmaW5lIE1PWEFfTVVTVF9SRUNWX0lTUgkJKFVBUlRfSUVSX1JESSB8IE1PWEFfTVVTVF9JRVJfRUdEQUkpCi0KLS8qIEdEQSBpbnRlcnJ1cHQgcGVuZGluZyAqLwotI2RlZmluZSBNT1hBX01VU1RfSUlSX0dEQQkJMHgxQwotI2RlZmluZSBNT1hBX01VU1RfSUlSX1JEQQkJMHgwNAotI2RlZmluZSBNT1hBX01VU1RfSUlSX1JUTwkJMHgwQwotI2RlZmluZSBNT1hBX01VU1RfSUlSX0xTUgkJMHgwNgotCi0vKiByZWNpZXZlZCBYb24vWG9mZiBvciBzcGVjaWNhbCBpbnRlcnJ1cHQgcGVuZGluZyAqLwotI2RlZmluZSBNT1hBX01VU1RfSUlSX1hTQwkJMHgxMAotCi0vKiBSVFMvQ1RTIGNoYW5nZSBzdGF0ZSBpbnRlcnJ1cHQgcGVuZGluZyAqLwotI2RlZmluZSBNT1hBX01VU1RfSUlSX1JUU0NUUwkJMHgyMAotI2RlZmluZSBNT1hBX01VU1RfSUlSX01BU0sJCTB4M0UKLQotI2RlZmluZSBNT1hBX01VU1RfTUNSX1hPTl9GTEFHCQkweDQwCi0jZGVmaW5lIE1PWEFfTVVTVF9NQ1JfWE9OX0FOWQkJMHg4MAotI2RlZmluZSBNT1hBX01VU1RfTUNSX1RYX1hPTgkJMHgwOAotCi0vKiBzb2Z0d2FyZSBmbG93IGNvbnRyb2wgb24gY2hpcCBtYXNrIHZhbHVlICovCi0jZGVmaW5lIE1PWEFfTVVTVF9FRlJfU0ZfTUFTSwkJMHgwRgotLyogc2VuZCBYb24xL1hvZmYxICovCi0jZGVmaW5lIE1PWEFfTVVTVF9FRlJfU0ZfVFgxCQkweDA4Ci0vKiBzZW5kIFhvbjIvWG9mZjIgKi8KLSNkZWZpbmUgTU9YQV9NVVNUX0VGUl9TRl9UWDIJCTB4MDQKLS8qIHNlbmQgWG9uMSxYb24yL1hvZmYxLFhvZmYyICovCi0jZGVmaW5lIE1PWEFfTVVTVF9FRlJfU0ZfVFgxMgkJMHgwQwotLyogZG9uJ3Qgc2VuZCBYb24vWG9mZiAqLwotI2RlZmluZSBNT1hBX01VU1RfRUZSX1NGX1RYX05PCQkweDAwCi0vKiBUeCBzb2Z0d2FyZSBmbG93IGNvbnRyb2wgbWFzayAqLwotI2RlZmluZSBNT1hBX01VU1RfRUZSX1NGX1RYX01BU0sJMHgwQwotLyogZG9uJ3QgcmVjZWl2ZSBYb24vWG9mZiAqLwotI2RlZmluZSBNT1hBX01VU1RfRUZSX1NGX1JYX05PCQkweDAwCi0vKiByZWNlaXZlIFhvbjEvWG9mZjEgKi8KLSNkZWZpbmUgTU9YQV9NVVNUX0VGUl9TRl9SWDEJCTB4MDIKLS8qIHJlY2VpdmUgWG9uMi9Yb2ZmMiAqLwotI2RlZmluZSBNT1hBX01VU1RfRUZSX1NGX1JYMgkJMHgwMQotLyogcmVjZWl2ZSBYb24xLFhvbjIvWG9mZjEsWG9mZjIgKi8KLSNkZWZpbmUgTU9YQV9NVVNUX0VGUl9TRl9SWDEyCQkweDAzCi0vKiBSeCBzb2Z0d2FyZSBmbG93IGNvbnRyb2wgbWFzayAqLwotI2RlZmluZSBNT1hBX01VU1RfRUZSX1NGX1JYX01BU0sJMHgwMwotCi0jZGVmaW5lIEVOQUJMRV9NT1hBX01VU1RfRU5DSEFOQ0VfTU9ERShiYXNlaW8pIGRvIHsgCQlcCi0JdTgJX19vbGRsY3IsIF9fZWZyOwkJCQlcCi0JX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwkJCVwKLQlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCi0JX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CQlcCi0JX19lZnIgfD0gTU9YQV9NVVNUX0VGUl9FRlJCX0VOQUJMRTsJCQlcCi0Jb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CQlcCi0Jb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgRElTQUJMRV9NT1hBX01VU1RfRU5DSEFOQ0VfTU9ERShiYXNlaW8pIGRvIHsJCVwKLQl1OAlfX29sZGxjciwgX19lZnI7CQkJCVwKLQlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CQkJXAotCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLQlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJCVwKLQlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9FRlJCX0VOQUJMRTsJCQlcCi0Jb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CQlcCi0Jb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgU0VUX01PWEFfTVVTVF9YT04xX1ZBTFVFKGJhc2VpbywgVmFsdWUpIGRvIHsJCVwKLQl1OAlfX29sZGxjciwgX19lZnI7CQkJCVwKLQlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CQkJXAotCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLQlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJCVwKLQlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CQkJXAotCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfQkFOSzA7CQkJCVwKLQlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJCVwKLQlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfWE9OMV9SRUdJU1RFUik7CVwKLQlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBTRVRfTU9YQV9NVVNUX1hPRkYxX1ZBTFVFKGJhc2VpbywgVmFsdWUpIGRvIHsJCVwKLQl1OAlfX29sZGxjciwgX19lZnI7CQkJCVwKLQlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CQkJXAotCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLQlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJCVwKLQlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9CQU5LX01BU0s7CQkJXAotCV9fZWZyIHw9IE1PWEFfTVVTVF9FRlJfQkFOSzA7CQkJCVwKLQlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJCVwKLQlvdXRiKCh1OCkoVmFsdWUpLCAoYmFzZWlvKStNT1hBX01VU1RfWE9GRjFfUkVHSVNURVIpOwlcCi0Jb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgU0VUX01PWEFfTVVTVF9GSUZPX1ZBTFVFKGluZm8pIGRvIHsJCQlcCi0JdTgJX19vbGRsY3IsIF9fZWZyOwkJCQlcCi0JX19vbGRsY3IgPSBpbmIoKGluZm8pLT5pb2FkZHIrVUFSVF9MQ1IpOwkJXAotCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoaW5mbyktPmlvYWRkcitVQVJUX0xDUik7XAotCV9fZWZyID0gaW5iKChpbmZvKS0+aW9hZGRyK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwlcCi0JX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfQkFOS19NQVNLOwkJCVwKLQlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTksxOwkJCQlcCi0Jb3V0YihfX2VmciwgKGluZm8pLT5pb2FkZHIrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CVwKLQlvdXRiKCh1OCkoKGluZm8pLT5yeF9oaWdoX3dhdGVyKSwgKGluZm8pLT5pb2FkZHIrCVwKLQkJCU1PWEFfTVVTVF9SQlJUSF9SRUdJU1RFUik7CQlcCi0Jb3V0YigodTgpKChpbmZvKS0+cnhfdHJpZ2dlciksIChpbmZvKS0+aW9hZGRyKwkJXAotCQkJTU9YQV9NVVNUX1JCUlRJX1JFR0lTVEVSKTsJCVwKLQlvdXRiKCh1OCkoKGluZm8pLT5yeF9sb3dfd2F0ZXIpLCAoaW5mbyktPmlvYWRkcisJXAotCQkJTU9YQV9NVVNUX1JCUlRMX1JFR0lTVEVSKTsJCVwKLQlvdXRiKF9fb2xkbGNyLCAoaW5mbyktPmlvYWRkcitVQVJUX0xDUik7CQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFNFVF9NT1hBX01VU1RfRU5VTV9WQUxVRShiYXNlaW8sIFZhbHVlKSBkbyB7CQlcCi0JdTgJX19vbGRsY3IsIF9fZWZyOwkJCQlcCi0JX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwkJCVwKLQlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCi0JX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CQlcCi0JX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfQkFOS19NQVNLOwkJCVwKLQlfX2VmciB8PSBNT1hBX01VU1RfRUZSX0JBTksyOwkJCQlcCi0Jb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CQlcCi0Jb3V0YigodTgpKFZhbHVlKSwgKGJhc2VpbykrTU9YQV9NVVNUX0VOVU1fUkVHSVNURVIpOwlcCi0Jb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgR0VUX01PWEFfTVVTVF9IQVJEV0FSRV9JRChiYXNlaW8sIHBJZCkgZG8gewkJXAotCXU4CV9fb2xkbGNyLCBfX2VmcjsJCQkJXAotCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJCQlcCi0Jb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAotCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwkJXAotCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX0JBTktfTUFTSzsJCQlcCi0JX19lZnIgfD0gTU9YQV9NVVNUX0VGUl9CQU5LMjsJCQkJXAotCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwkJXAotCSpwSWQgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0hXSURfUkVHSVNURVIpOwkJXAotCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFNFVF9NT1hBX01VU1RfTk9fU09GVFdBUkVfRkxPV19DT05UUk9MKGJhc2VpbykgZG8gewlcCi0JdTgJX19vbGRsY3IsIF9fZWZyOwkJCQlcCi0JX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwkJCVwKLQlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCi0JX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CQlcCi0JX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfU0ZfTUFTSzsJCQlcCi0Jb3V0YihfX2VmciwgKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CQlcCi0Jb3V0YihfX29sZGxjciwgKGJhc2VpbykrVUFSVF9MQ1IpOwkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgRU5BQkxFX01PWEFfTVVTVF9UWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woYmFzZWlvKSBkbyB7CVwKLQl1OAlfX29sZGxjciwgX19lZnI7CQkJCVwKLQlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CQkJXAotCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLQlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJCVwKLQlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9TRl9UWF9NQVNLOwkJCVwKLQlfX2VmciB8PSBNT1hBX01VU1RfRUZSX1NGX1RYMTsJCQkJXAotCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwkJXAotCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIERJU0FCTEVfTU9YQV9NVVNUX1RYX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChiYXNlaW8pIGRvIHsJXAotCXU4CV9fb2xkbGNyLCBfX2VmcjsJCQkJXAotCV9fb2xkbGNyID0gaW5iKChiYXNlaW8pK1VBUlRfTENSKTsJCQlcCi0Jb3V0YihNT1hBX01VU1RfRU5URVJfRU5DSEFOQ0UsIChiYXNlaW8pK1VBUlRfTENSKTsJXAotCV9fZWZyID0gaW5iKChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwkJXAotCV9fZWZyICY9IH5NT1hBX01VU1RfRUZSX1NGX1RYX01BU0s7CQkJXAotCW91dGIoX19lZnIsIChiYXNlaW8pK01PWEFfTVVTVF9FRlJfUkVHSVNURVIpOwkJXAotCW91dGIoX19vbGRsY3IsIChiYXNlaW8pK1VBUlRfTENSKTsJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEVOQUJMRV9NT1hBX01VU1RfUlhfU09GVFdBUkVfRkxPV19DT05UUk9MKGJhc2VpbykgZG8gewlcCi0JdTgJX19vbGRsY3IsIF9fZWZyOwkJCQlcCi0JX19vbGRsY3IgPSBpbmIoKGJhc2VpbykrVUFSVF9MQ1IpOwkJCVwKLQlvdXRiKE1PWEFfTVVTVF9FTlRFUl9FTkNIQU5DRSwgKGJhc2VpbykrVUFSVF9MQ1IpOwlcCi0JX19lZnIgPSBpbmIoKGJhc2VpbykrTU9YQV9NVVNUX0VGUl9SRUdJU1RFUik7CQlcCi0JX19lZnIgJj0gfk1PWEFfTVVTVF9FRlJfU0ZfUlhfTUFTSzsJCQlcCi0JX19lZnIgfD0gTU9YQV9NVVNUX0VGUl9TRl9SWDE7CQkJCVwKLQlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJCVwKLQlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBESVNBQkxFX01PWEFfTVVTVF9SWF9TT0ZUV0FSRV9GTE9XX0NPTlRST0woYmFzZWlvKSBkbyB7CVwKLQl1OAlfX29sZGxjciwgX19lZnI7CQkJCVwKLQlfX29sZGxjciA9IGluYigoYmFzZWlvKStVQVJUX0xDUik7CQkJXAotCW91dGIoTU9YQV9NVVNUX0VOVEVSX0VOQ0hBTkNFLCAoYmFzZWlvKStVQVJUX0xDUik7CVwKLQlfX2VmciA9IGluYigoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJCVwKLQlfX2VmciAmPSB+TU9YQV9NVVNUX0VGUl9TRl9SWF9NQVNLOwkJCVwKLQlvdXRiKF9fZWZyLCAoYmFzZWlvKStNT1hBX01VU1RfRUZSX1JFR0lTVEVSKTsJCVwKLQlvdXRiKF9fb2xkbGNyLCAoYmFzZWlvKStVQVJUX0xDUik7CQkJXAotfSB3aGlsZSAoMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbl90dHkuYyBiL2RyaXZlcnMvY2hhci9uX3R0eS5jCmluZGV4IDkwYzM5NjkuLjQ2YjJhMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9uX3R0eS5jCisrKyBiL2RyaXZlcnMvY2hhci9uX3R0eS5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIG5fdHR5LmMgLS0tIGltcGxlbWVudHMgdGhlIE5fVFRZIGxpbmUgZGlzY2lwbGluZS4KLSAqIAorICoKICAqIFRoaXMgY29kZSB1c2VkIHRvIGJlIGluIHR0eV9pby5jLCBidXQgdGhpbmdzIGFyZSBnZXR0aW5nIGhhaXJ5CiAgKiBlbm91Z2ggdGhhdCBpdCBtYWRlIHNlbnNlIHRvIHNwbGl0IHRoaW5ncyBvZmYuICAoVGhlIE5fVFRZCiAgKiBwcm9jZXNzaW5nIGhhcyBjaGFuZ2VkIHNvIG11Y2ggdGhhdCBpdCdzIGhhcmRseSByZWNvZ25pemFibGUsCkBAIC04LDE5ICs4LDE5IEBACiAgKgogICogTm90ZSB0aGF0IHRoZSBvcGVuIHJvdXRpbmUgZm9yIE5fVFRZIGlzIGd1YXJhbnRlZWQgbmV2ZXIgdG8gcmV0dXJuCiAgKiBhbiBlcnJvci4gIFRoaXMgaXMgYmVjYXVzZSBMaW51eCB3aWxsIGZhbGwgYmFjayB0byBzZXR0aW5nIGEgbGluZQotICogdG8gTl9UVFkgaWYgaXQgY2FuIG5vdCBzd2l0Y2ggdG8gYW55IG90aGVyIGxpbmUgZGlzY2lwbGluZS4gIAorICogdG8gTl9UVFkgaWYgaXQgY2FuIG5vdCBzd2l0Y2ggdG8gYW55IG90aGVyIGxpbmUgZGlzY2lwbGluZS4KICAqCiAgKiBXcml0dGVuIGJ5IFRoZW9kb3JlIFRzJ28sIENvcHlyaWdodCAxOTk0LgotICogCisgKgogICogVGhpcyBmaWxlIGFsc28gY29udGFpbnMgY29kZSBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMsCiAgKiBDb3B5cmlnaHQgMTk5MSwgMTk5MiwgMTk5MywgYW5kIGJ5IEp1bGlhbiBDb3dsZXksIENvcHlyaWdodCAxOTk0LgotICogCisgKgogICogVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlLgogICoKICAqIFJlZHVjZWQgbWVtb3J5IHVzYWdlIGZvciBvbGRlciBBUk0gc3lzdGVtcyAgLSBSdXNzZWxsIEtpbmcuCiAgKgotICogMjAwMC8wMS8yMCAgIEZpeGVkIFNNUCBsb2NraW5nIG9uIHB1dF90dHlfcXVldWUgdXNpbmcgYml0cyBvZiAKKyAqIDIwMDAvMDEvMjAgICBGaXhlZCBTTVAgbG9ja2luZyBvbiBwdXRfdHR5X3F1ZXVlIHVzaW5nIGJpdHMgb2YKICAqCQl0aGUgcGF0Y2ggYnkgQW5kcmV3IEouIEtyb2xsIDxhZzc4NEBmcmVlbmV0LmJ1ZmZhbG8uZWR1PgogICoJCXdobyBhY3R1YWxseSBmaW5hbGx5IHByb3ZlZCB0aGVyZSByZWFsbHkgd2FzIGEgcmFjZS4KICAqCkBAIC0xNDQsMTEgKzE0NCwxMSBAQAogICoJQ2FuIHNsZWVwLCBtYXkgYmUgY2FsbGVkIHVuZGVyIHRoZSBhdG9taWNfcmVhZF9sb2NrIG11dGV4IGJ1dAogICoJdGhpcyBpcyBub3QgZ3VhcmFudGVlZC4KICAqLwotIAotc3RhdGljIHZvaWQgY2hlY2tfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKKworc3RhdGljIHZvaWQgY2hlY2tfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCWlmICh0dHktPmNvdW50ICYmCi0JICAgIHRlc3RfYW5kX2NsZWFyX2JpdChUVFlfVEhST1RUTEVELCAmdHR5LT5mbGFncykgJiYgCisJICAgIHRlc3RfYW5kX2NsZWFyX2JpdChUVFlfVEhST1RUTEVELCAmdHR5LT5mbGFncykgJiYKIAkgICAgdHR5LT5kcml2ZXItPnVudGhyb3R0bGUpCiAJCXR0eS0+ZHJpdmVyLT51bnRocm90dGxlKHR0eSk7CiB9CkBAIC0xNTcsNyArMTU3LDcgQEAKICAqCXJlc2V0X2J1ZmZlcl9mbGFncwktCXJlc2V0IGJ1ZmZlciBzdGF0ZQogICoJQHR0eTogdGVybWluYWwgdG8gcmVzZXQKICAqCi0gKglSZXNldCB0aGUgcmVhZCBidWZmZXIgY291bnRlcnMsIGNsZWFyIHRoZSBmbGFncywgCisgKglSZXNldCB0aGUgcmVhZCBidWZmZXIgY291bnRlcnMsIGNsZWFyIHRoZSBmbGFncywKICAqCWFuZCBtYWtlIHN1cmUgdGhlIGRyaXZlciBpcyB1bnRocm90dGxlZC4gQ2FsbGVkCiAgKglmcm9tIG5fdHR5X29wZW4oKSBhbmQgbl90dHlfZmx1c2hfYnVmZmVyKCkuCiAgKi8KQEAgLTE4NiwxMiArMTg2LDEyIEBACiAgKglGSVhNRTogdHR5LT5jdHJsX3N0YXR1cyBpcyBub3Qgc3BpbmxvY2tlZCBhbmQgcmVsaWVzIG9uCiAgKglsb2NrX2tlcm5lbCgpIHN0aWxsLgogICovCi0gCi1zdGF0aWMgdm9pZCBuX3R0eV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCisKK3N0YXRpYyB2b2lkIG5fdHR5X2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCS8qIGNsZWFyIGV2ZXJ5dGhpbmcgYW5kIHVudGhyb3R0bGUgdGhlIGRyaXZlciAqLwogCXJlc2V0X2J1ZmZlcl9mbGFncyh0dHkpOwotCQorCiAJaWYgKCF0dHktPmxpbmspCiAJCXJldHVybjsKIApAQCAtMjA2LDkgKzIwNiw5IEBACiAgKglAdHR5OiB0dHkgZGV2aWNlCiAgKgogICoJUmVwb3J0IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBidWZmZXJlZCB0byBiZSBkZWxpdmVyZWQgdG8gdXNlcgotICoJYXQgdGhpcyBpbnN0YW50IGluIHRpbWUuIAorICoJYXQgdGhpcyBpbnN0YW50IGluIHRpbWUuCiAgKi8KLSAKKwogc3RhdGljIHNzaXplX3Qgbl90dHlfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTIzNCw3ICsyMzQsNyBAQAogICoJY2hhcmFjdGVyLiBXZSB1c2UgdGhpcyB0byBjb3JyZWN0bHkgY29tcHV0ZSB0aGUgb24gc2NyZWVuIHNpemUKICAqCW9mIHRoZSBjaGFyYWN0ZXIgd2hlbiBwcmludGluZwogICovCi0gCisKIHN0YXRpYyBpbmxpbmUgaW50IGlzX3V0ZjhfY29udGludWF0aW9uKHVuc2lnbmVkIGNoYXIgYykKIHsKIAlyZXR1cm4gKGMgJiAweGMwKSA9PSAweDgwOwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAgKglSZXR1cm5zIHRydWUgaWYgdGhlIHV0ZjggY2hhcmFjdGVyICdjJyBpcyBhIG11bHRpYnl0ZSBjb250aW51YXRpb24KICAqCWNoYXJhY3RlciBhbmQgdGhlIHRlcm1pbmFsIGlzIGluIHVuaWNvZGUgbW9kZS4KICAqLwotIAorCiBzdGF0aWMgaW5saW5lIGludCBpc19jb250aW51YXRpb24odW5zaWduZWQgY2hhciBjLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCXJldHVybiBJX0lVVEY4KHR0eSkgJiYgaXNfdXRmOF9jb250aW51YXRpb24oYyk7CkBAIC0yNjYsNyArMjY2LDcgQEAKICAqCUNhbGxlZCBmcm9tIGJvdGggdGhlIHJlY2VpdmUgYW5kIHRyYW5zbWl0IHNpZGVzIGFuZCBjYW4gYmUgY2FsbGVkCiAgKglyZS1lbnRyYW50bHkuIFJlbGllcyBvbiBsb2NrX2tlcm5lbCgpIHN0aWxsLgogICovCi0gCisKIHN0YXRpYyBpbnQgb3Bvc3QodW5zaWduZWQgY2hhciBjLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCWludAlzcGFjZSwgc3BhY2VzOwpAQCAtMzM5LDkgKzMzOSw5IEBACiAgKgogICoJQ2FsbGVkIGZyb20gd3JpdGVfY2hhbiB1bmRlciB0aGUgdHR5IGxheWVyIHdyaXRlIGxvY2suCiAgKi8KLSAKLXN0YXRpYyBzc2l6ZV90IG9wb3N0X2Jsb2NrKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LAotCQkgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqIGJ1ZiwgdW5zaWduZWQgaW50IG5yKQorCitzdGF0aWMgc3NpemVfdCBvcG9zdF9ibG9jayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgbnIpCiB7CiAJaW50CXNwYWNlOwogCWludCAJaTsKQEAgLTM4Niw3ICszODYsNyBAQAogYnJlYWtfb3V0OgogCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfY2hhcnMpCiAJCXR0eS0+ZHJpdmVyLT5mbHVzaF9jaGFycyh0dHkpOwotCWkgPSB0dHktPmRyaXZlci0+d3JpdGUodHR5LCBidWYsIGkpOwkKKwlpID0gdHR5LT5kcml2ZXItPndyaXRlKHR0eSwgYnVmLCBpKTsKIAlyZXR1cm4gaTsKIH0KIApAQCAtMzk4LDcgKzM5OCw3IEBACiAgKgogICoJUXVldWUgYSBieXRlIHRvIHRoZSBkcml2ZXIgbGF5ZXIgZm9yIG91dHB1dAogICovCi0gCisKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfY2hhcih1bnNpZ25lZCBjaGFyIGMsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJdHR5LT5kcml2ZXItPnB1dF9jaGFyKHR0eSwgYyk7CkBAIC00MDksNyArNDA5LDcgQEAKICAqCUBjOiB1bmljb2RlIGJ5dGUgdG8gZWNobwogICoJQHR0eTogdGVybWluYWwgZGV2aWNlCiAgKgotICoJRWNobyB1c2VyIGlucHV0IGJhY2sgb250byB0aGUgc2NyZWVuLiBUaGlzIG11c3QgYmUgY2FsbGVkIG9ubHkgd2hlbiAKKyAqCUVjaG8gdXNlciBpbnB1dCBiYWNrIG9udG8gdGhlIHNjcmVlbi4gVGhpcyBtdXN0IGJlIGNhbGxlZCBvbmx5IHdoZW4KICAqCUxfRUNITyh0dHkpIGlzIHRydWUuIENhbGxlZCBmcm9tIHRoZSBkcml2ZXIgcmVjZWl2ZV9idWYgcGF0aC4KICAqLwogCkBAIC00NDEsNyArNDQxLDcgQEAKICAqCXByZXNlbnQgaW4gdGhlIHN0cmVhbSBmcm9tIHRoZSBkcml2ZXIgbGF5ZXIuIEhhbmRsZXMgdGhlIGNvbXBsZXhpdGllcwogICoJb2YgVVRGLTggbXVsdGlieXRlIHN5bWJvbHMuCiAgKi8KLSAKKwogc3RhdGljIHZvaWQgZXJhc2VyKHVuc2lnbmVkIGNoYXIgYywgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKIAllbnVtIHsgRVJBU0UsIFdFUkFTRSwgS0lMTCB9IGtpbGxfdHlwZTsKQEAgLTU0MSw3ICs1NDEsNyBAQAogCiAJCQkJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwogCQkJCWlmICh0dHktPmNvbHVtbiA+IDB4ODAwMDAwMDApCi0JCQkJCXR0eS0+Y29sdW1uID0gMDsgCisJCQkJCXR0eS0+Y29sdW1uID0gMDsKIAogCQkJCS8qIE5vdyBiYWNrdXAgdG8gdGhhdCBjb2x1bW4uICovCiAJCQkJd2hpbGUgKHR0eS0+Y29sdW1uID4gY29sKSB7CkBAIC01ODUsNyArNTg1LDcgQEAKICAqCXNldHRpbmdzIGFuZCBjaGFyYWN0ZXIgdXNlZC4gQ2FsbGVkIGZyb20gdGhlIGRyaXZlciByZWNlaXZlX2J1ZgogICoJcGF0aCBzbyBzZXJpYWxpemVkLgogICovCi0gCisKIHN0YXRpYyBpbmxpbmUgdm9pZCBpc2lnKGludCBzaWcsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBmbHVzaCkKIHsKIAlpZiAodHR5LT5wZ3JwKQpAQCAtNjA2LDcgKzYwNiw3IEBACiAgKgogICoJQ2FsbGVkIGZyb20gdGhlIHJlY2VpdmVfYnVmIHBhdGggc28gc2luZ2xlIHRocmVhZGVkLgogICovCi0gCisKIHN0YXRpYyBpbmxpbmUgdm9pZCBuX3R0eV9yZWNlaXZlX2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJaWYgKElfSUdOQlJLKHR0eSkpCkBAIC02MzUsNyArNjM1LDcgQEAKICAqCW5lZWQgbG9ja2luZyBhcyBudW1fb3ZlcnJ1biBhbmQgb3ZlcnJ1bl90aW1lIGFyZSBmdW5jdGlvbgogICoJcHJpdmF0ZS4KICAqLwotIAorCiBzdGF0aWMgaW5saW5lIHZvaWQgbl90dHlfcmVjZWl2ZV9vdmVycnVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJY2hhciBidWZbNjRdOwpAQCAtNjYyLDkgKzY2Miw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgbl90dHlfcmVjZWl2ZV9wYXJpdHlfZXJyb3Ioc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKIAkJCQkJICAgICAgdW5zaWduZWQgY2hhciBjKQogewotCWlmIChJX0lHTlBBUih0dHkpKSB7CisJaWYgKElfSUdOUEFSKHR0eSkpCiAJCXJldHVybjsKLQl9CiAJaWYgKElfUEFSTVJLKHR0eSkpIHsKIAkJcHV0X3R0eV9xdWV1ZSgnXDM3NycsIHR0eSk7CiAJCXB1dF90dHlfcXVldWUoJ1wwJywgdHR5KTsKQEAgLTY4Miw3ICs2ODEsNyBAQAogICoJQGM6IGNoYXJhY3RlcgogICoKICAqCVByb2Nlc3MgYW4gaW5kaXZpZHVhbCBjaGFyYWN0ZXIgb2YgaW5wdXQgcmVjZWl2ZWQgZnJvbSB0aGUgZHJpdmVyLgotICoJVGhpcyBpcyBzZXJpYWxpemVkIHdpdGggcmVzcGVjdCB0byBpdHNlbGYgYnkgdGhlIHJ1bGVzIGZvciB0aGUgCisgKglUaGlzIGlzIHNlcmlhbGl6ZWQgd2l0aCByZXNwZWN0IHRvIGl0c2VsZiBieSB0aGUgcnVsZXMgZm9yIHRoZQogICoJZHJpdmVyIGFib3ZlLgogICovCiAKQEAgLTY5NCw3ICs2OTMsNyBAQAogCQlwdXRfdHR5X3F1ZXVlKGMsIHR0eSk7CiAJCXJldHVybjsKIAl9Ci0JCisKIAlpZiAoSV9JU1RSSVAodHR5KSkKIAkJYyAmPSAweDdmOwogCWlmIChJX0lVQ0xDKHR0eSkgJiYgTF9JRVhURU4odHR5KSkKQEAgLTczOSw3ICs3MzgsNyBAQAogCQlwdXRfdHR5X3F1ZXVlKGMsIHR0eSk7CiAJCXJldHVybjsKIAl9Ci0JCQorCiAJaWYgKGMgPT0gJ1xyJykgewogCQlpZiAoSV9JR05DUih0dHkpKQogCQkJcmV0dXJuOwpAQCAtODI1LDggKzgyNCw4IEBACiAJCQlnb3RvIGhhbmRsZV9uZXdsaW5lOwogCQl9CiAJCWlmIChjID09IEVPRl9DSEFSKHR0eSkpIHsKLQkJICAgICAgICBpZiAodHR5LT5jYW5vbl9oZWFkICE9IHR0eS0+cmVhZF9oZWFkKQotCQkJICAgICAgICBzZXRfYml0KFRUWV9QVVNILCAmdHR5LT5mbGFncyk7CisJCQlpZiAodHR5LT5jYW5vbl9oZWFkICE9IHR0eS0+cmVhZF9oZWFkKQorCQkJCXNldF9iaXQoVFRZX1BVU0gsICZ0dHktPmZsYWdzKTsKIAkJCWMgPSBfX0RJU0FCTEVEX0NIQVI7CiAJCQlnb3RvIGhhbmRsZV9uZXdsaW5lOwogCQl9CkBAIC04NTAsNyArODQ5LDcgQEAKIAkJCWlmIChJX1BBUk1SSyh0dHkpICYmIGMgPT0gKHVuc2lnbmVkIGNoYXIpICdcMzc3JykKIAkJCQlwdXRfdHR5X3F1ZXVlKGMsIHR0eSk7CiAKLQkJaGFuZGxlX25ld2xpbmU6CitoYW5kbGVfbmV3bGluZToKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHktPnJlYWRfbG9jaywgZmxhZ3MpOwogCQkJc2V0X2JpdCh0dHktPnJlYWRfaGVhZCwgdHR5LT5yZWFkX2ZsYWdzKTsKIAkJCXB1dF90dHlfcXVldWVfbm9sb2NrKGMsIHR0eSk7CkBAIC04NjMsNyArODYyLDcgQEAKIAkJCXJldHVybjsKIAkJfQogCX0KLQkKKwogCWZpbmlzaF9lcmFzaW5nKHR0eSk7CiAJaWYgKExfRUNITyh0dHkpKSB7CiAJCWlmICh0dHktPnJlYWRfY250ID49IE5fVFRZX0JVRl9TSVpFLTEpIHsKQEAgLTg4NCw3ICs4ODMsNyBAQAogCQlwdXRfdHR5X3F1ZXVlKGMsIHR0eSk7CiAKIAlwdXRfdHR5X3F1ZXVlKGMsIHR0eSk7Ci19CQorfQogCiAKIC8qKgpAQCAtODk4LDEyICs4OTcsMTAgQEAKIAogc3RhdGljIHZvaWQgbl90dHlfd3JpdGVfd2FrZXVwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0JaWYgKHR0eS0+ZmFzeW5jKQotCXsKLSAJCXNldF9iaXQoVFRZX0RPX1dSSVRFX1dBS0VVUCwgJnR0eS0+ZmxhZ3MpOworCWlmICh0dHktPmZhc3luYykgeworCQlzZXRfYml0KFRUWV9ET19XUklURV9XQUtFVVAsICZ0dHktPmZsYWdzKTsKIAkJa2lsbF9mYXN5bmMoJnR0eS0+ZmFzeW5jLCBTSUdJTywgUE9MTF9PVVQpOwogCX0KLQlyZXR1cm47CiB9CiAKIC8qKgpAQCAtOTE4LDcgKzkxNSw3IEBACiAgKglub3QgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4gVGhlIGRyaXZlciBpcyByZXNwb25zaWJsZSBmb3IgbWFraW5nCiAgKgljYWxscyBvbmUgYXQgYSB0aW1lIGFuZCBpbiBvcmRlciAob3IgdXNpbmcgZmx1c2hfdG9fbGRpc2MpCiAgKi8KLSAKKwogc3RhdGljIHZvaWQgbl90dHlfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsCiAJCQkgICAgICBjaGFyICpmcCwgaW50IGNvdW50KQogewpAQCAtOTUwLDcgKzk0Nyw3IEBACiAJCXR0eS0+cmVhZF9jbnQgKz0gaTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5yZWFkX2xvY2ssIGNwdWZsYWdzKTsKIAl9IGVsc2UgewotCQlmb3IgKGk9Y291bnQsIHAgPSBjcCwgZiA9IGZwOyBpOyBpLS0sIHArKykgeworCQlmb3IgKGkgPSBjb3VudCwgcCA9IGNwLCBmID0gZnA7IGk7IGktLSwgcCsrKSB7CiAJCQlpZiAoZikKIAkJCQlmbGFncyA9ICpmKys7CiAJCQlzd2l0Y2ggKGZsYWdzKSB7CkBAIC05NjgsNyArOTY1LDcgQEAKIAkJCQluX3R0eV9yZWNlaXZlX292ZXJydW4odHR5KTsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6Ci0JCQkJcHJpbnRrKCIlczogdW5rbm93biBmbGFnICVkXG4iLAorCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVua25vd24gZmxhZyAlZFxuIiwKIAkJCQkgICAgICAgdHR5X25hbWUodHR5LCBidWYpLCBmbGFncyk7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0xMDAxLDcgKzk5OCw3IEBACiBpbnQgaXNfaWdub3JlZChpbnQgc2lnKQogewogCXJldHVybiAoc2lnaXNtZW1iZXIoJmN1cnJlbnQtPmJsb2NrZWQsIHNpZykgfHwKLQkgICAgICAgIGN1cnJlbnQtPnNpZ2hhbmQtPmFjdGlvbltzaWctMV0uc2Euc2FfaGFuZGxlciA9PSBTSUdfSUdOKTsKKwkJY3VycmVudC0+c2lnaGFuZC0+YWN0aW9uW3NpZy0xXS5zYS5zYV9oYW5kbGVyID09IFNJR19JR04pOwogfQogCiAvKioKQEAgLTEwMTEsMTYgKzEwMDgsMTYgQEAKICAqCiAgKglDYWxsZWQgYnkgdGhlIHR0eSBsYXllciB3aGVuIHRoZSB1c2VyIGNoYW5nZXMgdGVybWlvcyBmbGFncyBzbwogICoJdGhhdCB0aGUgbGluZSBkaXNjaXBsaW5lIGNhbiBwbGFuIGFoZWFkLiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBzbGVlcAotICoJYW5kIGlzIHByb3RlY3RlZCBmcm9tIHJlLWVudHJ5IGJ5IHRoZSB0dHkgbGF5ZXIuIFRoZSB1c2VyIGlzIAorICoJYW5kIGlzIHByb3RlY3RlZCBmcm9tIHJlLWVudHJ5IGJ5IHRoZSB0dHkgbGF5ZXIuIFRoZSB1c2VyIGlzCiAgKglndWFyYW50ZWVkIHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBiZSByZS1lbnRlcmVkIG9yIGluIHByb2dyZXNzCiAgKgl3aGVuIHRoZSBsZGlzYyBpcyBjbG9zZWQuCiAgKi8KLSAKLXN0YXRpYyB2b2lkIG5fdHR5X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqIG9sZCkKKworc3RhdGljIHZvaWQgbl90dHlfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGt0ZXJtaW9zICpvbGQpCiB7CiAJaWYgKCF0dHkpCiAJCXJldHVybjsKLQkKKwogCXR0eS0+aWNhbm9uID0gKExfSUNBTk9OKHR0eSkgIT0gMCk7CiAJaWYgKHRlc3RfYml0KFRUWV9IV19DT09LX0lOLCAmdHR5LT5mbGFncykpIHsKIAkJdHR5LT5yYXcgPSAxOwpAQCAtMTA4NSwxMiArMTA4MiwxMiBAQAogICoJbl90dHlfY2xvc2UJCS0JY2xvc2UgdGhlIGxkaXNjIGZvciB0aGlzIHR0eQogICoJQHR0eTogZGV2aWNlCiAgKgotICoJQ2FsbGVkIGZyb20gdGhlIHRlcm1pbmFsIGxheWVyIHdoZW4gdGhpcyBsaW5lIGRpc2NpcGxpbmUgaXMgCi0gKgliZWluZyBzaHV0IGRvd24sIGVpdGhlciBiZWNhdXNlIG9mIGEgY2xvc2Ugb3IgYmVjc3VzZSBvZiBhIAorICoJQ2FsbGVkIGZyb20gdGhlIHRlcm1pbmFsIGxheWVyIHdoZW4gdGhpcyBsaW5lIGRpc2NpcGxpbmUgaXMKKyAqCWJlaW5nIHNodXQgZG93biwgZWl0aGVyIGJlY2F1c2Ugb2YgYSBjbG9zZSBvciBiZWNzdXNlIG9mIGEKICAqCWRpc2NpcGxpbmUgY2hhbmdlLiBUaGUgZnVuY3Rpb24gd2lsbCBub3QgYmUgY2FsbGVkIHdoaWxlIG90aGVyCiAgKglsZGlzYyBtZXRob2RzIGFyZSBpbiBwcm9ncmVzcy4KICAqLwotIAorCiBzdGF0aWMgdm9pZCBuX3R0eV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCW5fdHR5X2ZsdXNoX2J1ZmZlcih0dHkpOwpAQCAtMTEwNCw3ICsxMTAxLDcgQEAKICAqCW5fdHR5X29wZW4JCS0Jb3BlbiBhbiBsZGlzYwogICoJQHR0eTogdGVybWluYWwgdG8gb3BlbgogICoKLSAqCUNhbGxlZCB3aGVuIHRoaXMgbGluZSBkaXNjaXBsaW5lIGlzIGJlaW5nIGF0dGFjaGVkIHRvIHRoZSAKKyAqCUNhbGxlZCB3aGVuIHRoaXMgbGluZSBkaXNjaXBsaW5lIGlzIGJlaW5nIGF0dGFjaGVkIHRvIHRoZQogICoJdGVybWluYWwgZGV2aWNlLiBDYW4gc2xlZXAuIENhbGxlZCBzZXJpYWxpemVkIHNvIHRoYXQgbm8KICAqCW90aGVyIGV2ZW50cyB3aWxsIG9jY3VyIGluIHBhcmFsbGVsLiBObyBmdXJ0aGVyIG9wZW4gd2lsbCBvY2N1cgogICoJdW50aWwgYSBjbG9zZS4KQEAgLTExNTcsNyArMTE1NCw3IEBACiAgKglDYWxsZWQgdW5kZXIgdGhlIHR0eS0+YXRvbWljX3JlYWRfbG9jayBzZW0KICAqCiAgKi8KLSAKKwogc3RhdGljIGludCBjb3B5X2Zyb21fcmVhZF9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKIAkJCQkgICAgICB1bnNpZ25lZCBjaGFyIF9fdXNlciAqKmIsCiAJCQkJICAgICAgc2l6ZV90ICpucikKQEAgLTExODYsNyArMTE4Myw4IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotZXh0ZXJuIHNzaXplX3QgcmVkaXJlY3RlZF90dHlfd3JpdGUoc3RydWN0IGZpbGUgKixjb25zdCBjaGFyICosc2l6ZV90LGxvZmZfdCAqKTsKK2V4dGVybiBzc2l6ZV90IHJlZGlyZWN0ZWRfdHR5X3dyaXRlKHN0cnVjdCBmaWxlICosIGNvbnN0IGNoYXIgKiwKKwkJCQkJCQlzaXplX3QsIGxvZmZfdCAqKTsKIAogLyoqCiAgKglqb2JfY29udHJvbAkJLQljaGVjayBqb2IgY29udHJvbApAQCAtMTE5NCwxMCArMTE5MiwxMCBAQAogICoJQGZpbGU6IGZpbGUgaGFuZGxlCiAgKgogICoJUGVyZm9ybSBqb2IgY29udHJvbCBtYW5hZ2VtZW50IGNoZWNrcyBvbiB0aGlzIGZpbGUvdHR5IGRlc2NyaXB0b3IKLSAqCWFuZCBpZiBhcHByb3ByaWF0ZSBzZW5kIGFueSBuZWVkZWQgc2lnbmFscyBhbmQgcmV0dXJuIGEgbmVnYXRpdmUgCisgKglhbmQgaWYgYXBwcm9wcmlhdGUgc2VuZCBhbnkgbmVlZGVkIHNpZ25hbHMgYW5kIHJldHVybiBhIG5lZ2F0aXZlCiAgKgllcnJvciBjb2RlIGlmIGFjdGlvbiBzaG91bGQgYmUgdGFrZW4uCiAgKi8KLSAKKwogc3RhdGljIGludCBqb2JfY29udHJvbChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAkvKiBKb2IgY29udHJvbCBjaGVjayAtLSBtdXN0IGJlIGRvbmUgYXQgc3RhcnQgYW5kIGFmdGVyCkBAIC0xMjA4LDcgKzEyMDYsNyBAQAogCWlmIChmaWxlLT5mX29wLT53cml0ZSAhPSByZWRpcmVjdGVkX3R0eV93cml0ZSAmJgogCSAgICBjdXJyZW50LT5zaWduYWwtPnR0eSA9PSB0dHkpIHsKIAkJaWYgKCF0dHktPnBncnApCi0JCQlwcmludGsoInJlYWRfY2hhbjogbm8gdHR5LT5wZ3JwIVxuIik7CisJCQlwcmludGsoS0VSTl9FUlIgInJlYWRfY2hhbjogbm8gdHR5LT5wZ3JwIVxuIik7CiAJCWVsc2UgaWYgKHRhc2tfcGdycChjdXJyZW50KSAhPSB0dHktPnBncnApIHsKIAkJCWlmIChpc19pZ25vcmVkKFNJR1RUSU4pIHx8CiAJCQkgICAgaXNfY3VycmVudF9wZ3JwX29ycGhhbmVkKCkpCkBAIC0xMjIwLDcgKzEyMTgsNyBAQAogCX0KIAlyZXR1cm4gMDsKIH0KLSAKKwogCiAvKioKICAqCXJlYWRfY2hhbgkJLQlyZWFkIGZ1bmN0aW9uIGZvciB0dHkKQEAgLTEyMzYsNyArMTIzNCw3IEBACiAgKgogICoJVGhpcyBjb2RlIG11c3QgYmUgc3VyZSBuZXZlciB0byBzbGVlcCB0aHJvdWdoIGEgaGFuZ3VwLgogICovCi0gCisKIHN0YXRpYyBzc2l6ZV90IHJlYWRfY2hhbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCSB1bnNpZ25lZCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbnIpCiB7CkBAIC0xMjUyLDE0ICsxMjUwLDE0IEBACiBkb19pdF9hZ2FpbjoKIAogCWlmICghdHR5LT5yZWFkX2J1ZikgewotCQlwcmludGsoIm5fdHR5X3JlYWRfY2hhbjogY2FsbGVkIHdpdGggcmVhZF9idWYgPT0gTlVMTD8hP1xuIik7CisJCXByaW50ayhLRVJOX0VSUiAibl90dHlfcmVhZF9jaGFuOiByZWFkX2J1ZiA9PSBOVUxMPyE/XG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCiAJYyA9IGpvYl9jb250cm9sKHR0eSwgZmlsZSk7Ci0JaWYoYyA8IDApCisJaWYgKGMgPCAwKQogCQlyZXR1cm4gYzsKLQkKKwogCW1pbmltdW0gPSB0aW1lID0gMDsKIAl0aW1lb3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CiAJaWYgKCF0dHktPmljYW5vbikgewpAQCAtMTI4Nyw4ICsxMjg1LDcgQEAKIAlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKIAkJaWYgKCFtdXRleF90cnlsb2NrKCZ0dHktPmF0b21pY19yZWFkX2xvY2spKQogCQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnR0eS0+YXRvbWljX3JlYWRfbG9jaykpCiAJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCX0KQEAgLTEzMTQsMTEgKzEzMTEsMTEgQEAKIAkJICAgc28gdGhhdCBhbnkgaW50ZXJydXB0IHdpbGwgc2V0IHRoZSBzdGF0ZSBiYWNrIHRvCiAJCSAgIFRBU0tfUlVOTklORy4gKi8KIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCisKIAkJaWYgKCgobWluaW11bSAtIChiIC0gYnVmKSkgPCB0dHktPm1pbmltdW1fdG9fd2FrZSkgJiYKIAkJICAgICgobWluaW11bSAtIChiIC0gYnVmKSkgPj0gMSkpCiAJCQl0dHktPm1pbmltdW1fdG9fd2FrZSA9IChtaW5pbXVtIC0gKGIgLSBidWYpKTsKLQkJCisKIAkJaWYgKCFpbnB1dF9hdmFpbGFibGVfcCh0dHksIDApKSB7CiAJCQlpZiAodGVzdF9iaXQoVFRZX09USEVSX0NMT1NFRCwgJnR0eS0+ZmxhZ3MpKSB7CiAJCQkJcmV0dmFsID0gLUVJTzsKQEAgLTEzNTUsNyArMTM1Miw3IEBACiAJCWlmICh0dHktPmljYW5vbikgewogCQkJLyogTi5CLiBhdm9pZCBvdmVycnVuIGlmIG5yID09IDAgKi8KIAkJCXdoaWxlIChuciAmJiB0dHktPnJlYWRfY250KSB7Ci0gCQkJCWludCBlb2w7CisJCQkJaW50IGVvbDsKIAogCQkJCWVvbCA9IHRlc3RfYW5kX2NsZWFyX2JpdCh0dHktPnJlYWRfdGFpbCwKIAkJCQkJCXR0eS0+cmVhZF9mbGFncyk7CkBAIC0xNDI3LDcgKzE0MjQsNyBAQAogCWlmIChzaXplKSB7CiAJCXJldHZhbCA9IHNpemU7CiAJCWlmIChucikKLQkgICAgICAgCQljbGVhcl9iaXQoVFRZX1BVU0gsICZ0dHktPmZsYWdzKTsKKwkJCWNsZWFyX2JpdChUVFlfUFVTSCwgJnR0eS0+ZmxhZ3MpOwogCX0gZWxzZSBpZiAodGVzdF9hbmRfY2xlYXJfYml0KFRUWV9QVVNILCAmdHR5LT5mbGFncykpCiAJCSBnb3RvIGRvX2l0X2FnYWluOwogCkBAIC0xNDUwLDkgKzE0NDcsOSBAQAogICoKICAqCVRoaXMgY29kZSBtdXN0IGJlIHN1cmUgbmV2ZXIgdG8gc2xlZXAgdGhyb3VnaCBhIGhhbmd1cC4KICAqLwotIAotc3RhdGljIHNzaXplX3Qgd3JpdGVfY2hhbihzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAotCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmLCBzaXplX3QgbnIpCisKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX2NoYW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IG5yKQogewogCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmIgPSBidWY7CiAJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CkBAIC0xNTQyLDggKzE1MzksOSBAQAogICoJcmVjb21wdXRlIHRoZSBuZXcgbGltaXRzLiBQb3NzaWJseSBzZXRfdGVybWlvcyBzaG91bGQgaXNzdWUKICAqCWEgcmVhZCB3YWtldXAgdG8gZml4IHRoaXMgYnVnLgogICovCi0gCi1zdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9wb2xsKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsIHBvbGxfdGFibGUgKndhaXQpCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX3BvbGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCQkJcG9sbF90YWJsZSAqd2FpdCkKIHsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wY21jaWEvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9wY21jaWEvS2NvbmZpZwppbmRleCBmMjVmYWNkLi4wMGI4YTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcGNtY2lhL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9LY29uZmlnCkBAIC00Myw1ICs0MywxNCBAQAogCSAgKGh0dHA6Ly93d3cub21uaWtleS5jb20vKSwgb3IgYSBjdXJyZW50IGRldmVsb3BtZW50IHZlcnNpb24gb2YgT3BlbkNUCiAJICAoaHR0cDovL3d3dy5vcGVuc2Mub3JnLykuCiAKK2NvbmZpZyBJUFdJUkVMRVNTCisJdHJpc3RhdGUgIklQV2lyZWxlc3MgM0cgVU1UUyBQQ01DSUEgY2FyZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENNQ0lBCisJc2VsZWN0IFBQUAorCWhlbHAKKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIDNHIFVNVFMgUENNQ0lBIGNhcmQgZnJvbSBJUFdpcmVsZXNzIGNvbXBhbnkuIEluCisJICBzb21lIGNvdW50cmllcyAoZm9yIGV4YW1wbGUgQ3plY2ggUmVwdWJsaWMsIFQtTW9iaWxlIElTUCkgdGhpcyBjYXJkCisJICBpcyBzaGlwcGVkIGZvciBzZXJ2aWNlIGNhbGxlZCBVTVRTIDRHLgorCiBlbmRtZW51CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wY21jaWEvTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL01ha2VmaWxlCmluZGV4IDBhYWUyMDkuLmJlOGYyODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9wY21jaWEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9NYWtlZmlsZQpAQCAtNCw2ICs0LDggQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBQQ01DSUEgY2hhciBkZXZpY2UgZHJpdmVycy4KICMKIAorb2JqLXkgKz0gaXB3aXJlbGVzcy8KKwogb2JqLSQoQ09ORklHX1NZTkNMSU5LX0NTKSArPSBzeW5jbGlua19jcy5vCiBvYmotJChDT05GSUdfQ0FSRE1BTl80MDAwKSArPSBjbTQwMDBfY3Mubwogb2JqLSQoQ09ORklHX0NBUkRNQU5fNDA0MCkgKz0gY200MDQwX2NzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wY21jaWEvaXB3aXJlbGVzcy9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9wY21jaWEvaXB3aXJlbGVzcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzFlYjU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9pcHdpcmVsZXNzL01ha2VmaWxlCkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgZHJpdmVycy9jaGFyL3BjbWNpYS9pcHdpcmVsZXNzL01ha2VmaWxlCisjCisjIE1ha2VmaWxlIGZvciB0aGUgSVBXaXJlbGVzcyBkcml2ZXIKKyMKKworb2JqLSQoQ09ORklHX0lQV0lSRUxFU1MpICs9IGlwd2lyZWxlc3MubworCitpcHdpcmVsZXNzLW9ianMgOj0gaGFyZHdhcmUubyBtYWluLm8gbmV0d29yay5vIHR0eS5vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wY21jaWEvaXB3aXJlbGVzcy9oYXJkd2FyZS5jIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9pcHdpcmVsZXNzL2hhcmR3YXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY5NzhmZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9wY21jaWEvaXB3aXJlbGVzcy9oYXJkd2FyZS5jCkBAIC0wLDAgKzEsMTc4NyBAQAorLyoKKyAqIElQV2lyZWxlc3MgM0cgUENNQ0lBIE5ldHdvcmsgRHJpdmVyCisgKgorICogT3JpZ2luYWwgY29kZQorICogICBieSBTdGVwaGVuIEJsYWNraGVhdGggPHN0ZXBoZW5AYmxhY2tzYXBwaGlyZS5jb20+LAorICogICAgICBCZW4gTWFydGVsIDxiZW5tQHN5bW1ldHJpYy5jby5uej4KKyAqCisgKiBDb3B5cmlnaHRlZCBhcyBmb2xsb3dzOgorICogICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgU3ltbWV0cmljIFN5c3RlbXMgTHRkIChOWikKKyAqCisgKiBWYXJpb3VzIGRyaXZlciBjaGFuZ2VzIGFuZCByZXdyaXRlcywgcG9ydCB0byBuZXcga2VybmVscworICogICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBKaXJpIEtvc2luYQorICoKKyAqIE1pc2MgY29kZSBjbGVhbnVwcyBhbmQgdXBkYXRlcworICogICBDb3B5cmlnaHQgKEMpIDIwMDcgRGF2aWQgU3RlcmJhCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgImhhcmR3YXJlLmgiCisjaW5jbHVkZSAic2V0dXBfcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJuZXR3b3JrLmgiCisjaW5jbHVkZSAibWFpbi5oIgorCitzdGF0aWMgdm9pZCBpcHdfc2VuZF9zZXR1cF9wYWNrZXQoc3RydWN0IGlwd19oYXJkd2FyZSAqaHcpOworc3RhdGljIHZvaWQgaGFuZGxlX3JlY2VpdmVkX1NFVFVQX3BhY2tldChzdHJ1Y3QgaXB3X2hhcmR3YXJlICppcHcsCisJCQkJCSB1bnNpZ25lZCBpbnQgYWRkcmVzcywKKwkJCQkJIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4sCisJCQkJCSBpbnQgaXNfbGFzdCk7CitzdGF0aWMgdm9pZCBpcHdpcmVsZXNzX3NldHVwX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBoYW5kbGVfcmVjZWl2ZWRfQ1RSTF9wYWNrZXQoc3RydWN0IGlwd19oYXJkd2FyZSAqaHcsCisJCXVuc2lnbmVkIGludCBjaGFubmVsX2lkeCwgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbik7CisKKy8qI2RlZmluZSBUSU1JTkdfRElBR05PU1RJQ1MqLworCisjaWZkZWYgVElNSU5HX0RJQUdOT1NUSUNTCisKK3N0YXRpYyBzdHJ1Y3QgdGltaW5nX3N0YXRzIHsKKwl1bnNpZ25lZCBsb25nIGxhc3RfcmVwb3J0X3RpbWU7CisJdW5zaWduZWQgbG9uZyByZWFkX3RpbWU7CisJdW5zaWduZWQgbG9uZyB3cml0ZV90aW1lOworCXVuc2lnbmVkIGxvbmcgcmVhZF9ieXRlczsKKwl1bnNpZ25lZCBsb25nIHdyaXRlX2J5dGVzOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZTsKK307CisKK3N0YXRpYyB2b2lkIHN0YXJ0X3RpbWluZyh2b2lkKQoreworCXRpbWluZ19zdGF0cy5zdGFydF90aW1lID0gamlmZmllczsKK30KKworc3RhdGljIHZvaWQgZW5kX3JlYWRfdGltaW5nKHVuc2lnbmVkIGxlbmd0aCkKK3sKKwl0aW1pbmdfc3RhdHMucmVhZF90aW1lICs9IChqaWZmaWVzIC0gc3RhcnRfdGltZSk7CisJdGltaW5nX3N0YXRzLnJlYWRfYnl0ZXMgKz0gbGVuZ3RoICsgMjsKKwlyZXBvcnRfdGltaW5nKCk7Cit9CisKK3N0YXRpYyB2b2lkIGVuZF93cml0ZV90aW1pbmcodW5zaWduZWQgbGVuZ3RoKQoreworCXRpbWluZ19zdGF0cy53cml0ZV90aW1lICs9IChqaWZmaWVzIC0gc3RhcnRfdGltZSk7CisJdGltaW5nX3N0YXRzLndyaXRlX2J5dGVzICs9IGxlbmd0aCArIDI7CisJcmVwb3J0X3RpbWluZygpOworfQorCitzdGF0aWMgdm9pZCByZXBvcnRfdGltaW5nKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBzaW5jZSA9IGppZmZpZXMgLSB0aW1pbmdfc3RhdHMubGFzdF9yZXBvcnRfdGltZTsKKworCS8qIElmIGl0J3MgYmVlbiBtb3JlIHRoYW4gb25lIHNlY29uZC4uLiAqLworCWlmIChzaW5jZSA+PSBIWikgeworCQlpbnQgZmlyc3QgPSAodGltaW5nX3N0YXRzLmxhc3RfcmVwb3J0X3RpbWUgPT0gMCk7CisKKwkJdGltaW5nX3N0YXRzLmxhc3RfcmVwb3J0X3RpbWUgPSBqaWZmaWVzOworCQlpZiAoIWZpcnN0KQorCQkJcHJpbnRrKEtFUk5fSU5GTyBJUFdJUkVMRVNTX1BDQ0FSRF9OQU1FCisJCQkgICAgICAgIjogJXUgdXMgZWxhcHNlZCAtIHJlYWQgJWx1IGJ5dGVzIGluICV1IHVzLCAiCisJCQkgICAgICAgIndyb3RlICVsdSBieXRlcyBpbiAldSB1c1xuIiwKKwkJCSAgICAgICBqaWZmaWVzX3RvX3VzZWNzKHNpbmNlKSwKKwkJCSAgICAgICB0aW1pbmdfc3RhdHMucmVhZF9ieXRlcywKKwkJCSAgICAgICBqaWZmaWVzX3RvX3VzZWNzKHRpbWluZ19zdGF0cy5yZWFkX3RpbWUpLAorCQkJICAgICAgIHRpbWluZ19zdGF0cy53cml0ZV9ieXRlcywKKwkJCSAgICAgICBqaWZmaWVzX3RvX3VzZWNzKHRpbWluZ19zdGF0cy53cml0ZV90aW1lKSk7CisKKwkJdGltaW5nX3N0YXRzLnJlYWRfdGltZSA9IDA7CisJCXRpbWluZ19zdGF0cy53cml0ZV90aW1lID0gMDsKKwkJdGltaW5nX3N0YXRzLnJlYWRfYnl0ZXMgPSAwOworCQl0aW1pbmdfc3RhdHMud3JpdGVfYnl0ZXMgPSAwOworCX0KK30KKyNlbHNlCitzdGF0aWMgdm9pZCBzdGFydF90aW1pbmcodm9pZCkgeyB9CitzdGF0aWMgdm9pZCBlbmRfcmVhZF90aW1pbmcodW5zaWduZWQgbGVuZ3RoKSB7IH0KK3N0YXRpYyB2b2lkIGVuZF93cml0ZV90aW1pbmcodW5zaWduZWQgbGVuZ3RoKSB7IH0KKyNlbmRpZgorCisvKiBJbXBvcnRlZCBJUFcgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBMTF9NVFVfVjEgMzE4CisjZGVmaW5lIExMX01UVV9WMiAyNTAKKyNkZWZpbmUgTExfTVRVX01BWCAoTExfTVRVX1YxID4gTExfTVRVX1YyID8gTExfTVRVX1YxIDogTExfTVRVX1YyKQorCisjZGVmaW5lIFBSSU9fREFUQSAgMgorI2RlZmluZSBQUklPX0NUUkwgIDEKKyNkZWZpbmUgUFJJT19TRVRVUCAwCisKKy8qIEFkZHJlc3NlcyAqLworI2RlZmluZSBBRERSX1NFVFVQX1BST1QgMAorCisvKiBQcm90b2NvbCBpZHMgKi8KK2VudW0geworCS8qIElkZW50aWZpZXIgZm9yIHRoZSBDb20gRGF0YSBwcm90b2NvbCAqLworCVRMX1BST1RPQ09MSURfQ09NX0RBVEEgPSAwLAorCisJLyogSWRlbnRpZmllciBmb3IgdGhlIENvbSBDb250cm9sIHByb3RvY29sICovCisJVExfUFJPVE9DT0xJRF9DT01fQ1RSTCA9IDEsCisKKwkvKiBJZGVudGlmaWVyIGZvciB0aGUgU2V0dXAgcHJvdG9jb2wgKi8KKwlUTF9QUk9UT0NPTElEX1NFVFVQID0gMgorfTsKKworLyogTnVtYmVyIG9mIGJ5dGVzIGluIE5MIHBhY2tldCBoZWFkZXIgKGNhbm5vdCBkbworICogc2l6ZW9mKG5sX3BhY2tldF9oZWFkZXIpIHNpbmNlIGl0J3MgYSBiaXRmaWVsZCkgKi8KKyNkZWZpbmUgTkxfRklSU1RfUEFDS0VUX0hFQURFUl9TSVpFICAgICAgICAzCisKKy8qIE51bWJlciBvZiBieXRlcyBpbiBOTCBwYWNrZXQgaGVhZGVyIChjYW5ub3QgZG8KKyAqIHNpemVvZihubF9wYWNrZXRfaGVhZGVyKSBzaW5jZSBpdCdzIGEgYml0ZmllbGQpICovCisjZGVmaW5lIE5MX0ZPTExPV0lOR19QQUNLRVRfSEVBREVSX1NJWkUgICAgMQorCitzdHJ1Y3QgbmxfZmlyc3RfcGFja2V0X2hlYWRlciB7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJdW5zaWduZWQgY2hhciBwYWNrZXRfcmFuazoyOworCXVuc2lnbmVkIGNoYXIgYWRkcmVzczozOworCXVuc2lnbmVkIGNoYXIgcHJvdG9jb2w6MzsKKyNlbHNlCisJdW5zaWduZWQgY2hhciBwcm90b2NvbDozOworCXVuc2lnbmVkIGNoYXIgYWRkcmVzczozOworCXVuc2lnbmVkIGNoYXIgcGFja2V0X3Jhbms6MjsKKyNlbmRpZgorCXVuc2lnbmVkIGNoYXIgbGVuZ3RoX2xzYjsKKwl1bnNpZ25lZCBjaGFyIGxlbmd0aF9tc2I7Cit9OworCitzdHJ1Y3QgbmxfcGFja2V0X2hlYWRlciB7CisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisJdW5zaWduZWQgY2hhciBwYWNrZXRfcmFuazoyOworCXVuc2lnbmVkIGNoYXIgYWRkcmVzczozOworCXVuc2lnbmVkIGNoYXIgcHJvdG9jb2w6MzsKKyNlbHNlCisJdW5zaWduZWQgY2hhciBwcm90b2NvbDozOworCXVuc2lnbmVkIGNoYXIgYWRkcmVzczozOworCXVuc2lnbmVkIGNoYXIgcGFja2V0X3Jhbms6MjsKKyNlbmRpZgorfTsKKworLyogVmFsdWUgb2YgJ3BhY2tldF9yYW5rJyBhYm92ZSAqLworI2RlZmluZSBOTF9JTlRFUk1FRElBVEVfUEFDS0VUICAgIDB4MAorI2RlZmluZSBOTF9MQVNUX1BBQ0tFVCAgICAgICAgICAgIDB4MQorI2RlZmluZSBOTF9GSVJTVF9QQUNLRVQgICAgICAgICAgIDB4MgorCit1bmlvbiBubF9wYWNrZXQgeworCS8qIE5ldHdvcmsgcGFja2V0IGhlYWRlciBvZiB0aGUgZmlyc3QgcGFja2V0IChhIHNwZWNpYWwgY2FzZSkgKi8KKwlzdHJ1Y3QgbmxfZmlyc3RfcGFja2V0X2hlYWRlciBoZHJfZmlyc3Q7CisJLyogTmV0d29yayBwYWNrZXQgaGVhZGVyIG9mIHRoZSBmb2xsb3dpbmcgcGFja2V0cyAoaWYgYW55KSAqLworCXN0cnVjdCBubF9wYWNrZXRfaGVhZGVyIGhkcjsKKwkvKiBDb21wbGV0ZSBuZXR3b3JrIHBhY2tldCAoaGVhZGVyICsgZGF0YSkgKi8KKwl1bnNpZ25lZCBjaGFyIHJhd3BrdFtMTF9NVFVfTUFYXTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworI2RlZmluZSBIV19WRVJTSU9OX1VOS05PV04gLTEKKyNkZWZpbmUgSFdfVkVSU0lPTl8xIDEKKyNkZWZpbmUgSFdfVkVSU0lPTl8yIDIKKworLyogSVBXIEkvTyBwb3J0cyAqLworI2RlZmluZSBJT0lFUiAweDAwCQkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIElPSVIgIDB4MDIJCS8qIEludGVycnVwdCBTb3VyY2UvQUNLIHJlZ2lzdGVyICovCisjZGVmaW5lIElPRENSIDB4MDQJCS8qIERhdGEgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBJT0RSUiAweDA2CQkvKiBEYXRhIFJlYWQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSU9EV1IgMHgwOAkJLyogRGF0YSBXcml0ZSBSZWdpc3RlciAqLworI2RlZmluZSBJT0VTUiAweDBBCQkvKiBFbWJlZGRlZCBEcml2ZXIgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIElPUlhSIDB4MEMJCS8qIFJ4IEZpZm8gUmVnaXN0ZXIgKEhvc3QgdG8gRW1iZWRkZWQpICovCisjZGVmaW5lIElPVFhSIDB4MEUJCS8qIFR4IEZpZm8gUmVnaXN0ZXIgKEVtYmVkZGVkIHRvIEhvc3QpICovCisKKy8qIEkvTyBwb3J0cyBhbmQgYml0IGRlZmluaXRpb25zIGZvciB2ZXJzaW9uIDEgb2YgdGhlIGhhcmR3YXJlICovCisKKy8qIElFUiBiaXRzKi8KKyNkZWZpbmUgSUVSX1JYRU5BQkxFRCAgIDB4MQorI2RlZmluZSBJRVJfVFhFTkFCTEVEICAgMHgyCisKKy8qIElTUiBiaXRzICovCisjZGVmaW5lIElSX1JYSU5UUiAgICAgICAweDEKKyNkZWZpbmUgSVJfVFhJTlRSICAgICAgIDB4MgorCisvKiBEQ1IgYml0cyAqLworI2RlZmluZSBEQ1JfUlhET05FICAgICAgMHgxCisjZGVmaW5lIERDUl9UWERPTkUgICAgICAweDIKKyNkZWZpbmUgRENSX1JYUkVTRVQgICAgIDB4NAorI2RlZmluZSBEQ1JfVFhSRVNFVCAgICAgMHg4CisKKy8qIEkvTyBwb3J0cyBhbmQgYml0IGRlZmluaXRpb25zIGZvciB2ZXJzaW9uIDIgb2YgdGhlIGhhcmR3YXJlICovCisKK3N0cnVjdCBNRU1DQ1IgeworCXVuc2lnbmVkIHNob3J0IHJlZ19jb25maWdfb3B0aW9uOwkvKiBQQ0NPUjogQ29uZmlndXJhdGlvbiBPcHRpb24gUmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBzaG9ydCByZWdfY29uZmlnX2FuZF9zdGF0dXM7CS8qIFBDQ1NSOiBDb25maWd1cmF0aW9uIGFuZCBTdGF0dXMgUmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBzaG9ydCByZWdfcGluX3JlcGxhY2VtZW50OwkvKiBQQ1BSUjogUGluIFJlcGxhY2VtYW50IFJlZ2lzdGVyICovCisJdW5zaWduZWQgc2hvcnQgcmVnX3NvY2tldF9hbmRfY29weTsJLyogUENTQ1I6IFNvY2tldCBhbmQgQ29weSBSZWdpc3RlciAqLworCXVuc2lnbmVkIHNob3J0IHJlZ19leHRfc3RhdHVzOwkJLyogUENFU1I6IEV4dGVuZGVuZCBTdGF0dXMgUmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBzaG9ydCByZWdfaW9fYmFzZTsJCS8qIFBDSU9COiBJL08gQmFzZSBSZWdpc3RlciAqLworfTsKKworc3RydWN0IE1FTUlORlJFRyB7CisJdW5zaWduZWQgc2hvcnQgbWVtcmVnX3R4X29sZDsJLyogVFggUmVnaXN0ZXIgKFIvVykgKi8KKwl1bnNpZ25lZCBzaG9ydCBwYWQxOworCXVuc2lnbmVkIHNob3J0IG1lbXJlZ19yeF9kb25lOwkvKiBSWERvbmUgUmVnaXN0ZXIgKFIvVykgKi8KKwl1bnNpZ25lZCBzaG9ydCBwYWQyOworCXVuc2lnbmVkIHNob3J0IG1lbXJlZ19yeDsJLyogUlggUmVnaXN0ZXIgKFIvVykgKi8KKwl1bnNpZ25lZCBzaG9ydCBwYWQzOworCXVuc2lnbmVkIHNob3J0IG1lbXJlZ19wY19pbnRlcnJ1cHRfYWNrOwkvKiBQQyBpbnRyIEFjayBSZWdpc3RlciAoVykgKi8KKwl1bnNpZ25lZCBzaG9ydCBwYWQ0OworCXVuc2lnbmVkIGxvbmcgbWVtcmVnX2NhcmRfcHJlc2VudDsvKiBNYXNrIGZvciBIb3N0IHRvIGNoZWNrIChSKSBmb3IKKwkJCQkJICAgKiBDQVJEX1BSRVNFTlRfVkFMVUUgKi8KKwl1bnNpZ25lZCBzaG9ydCBtZW1yZWdfdHhfbmV3OwkvKiBUWDIgKG5ldykgUmVnaXN0ZXIgKFIvVykgKi8KK307CisKKyNkZWZpbmUgSU9ETUFEUFIgMHgwMAkJLyogRE1BIERhdGEgUG9ydCBSZWdpc3RlciAoUi9XKSAqLworCisjZGVmaW5lIENBUkRfUFJFU0VOVF9WQUxVRSAoMHhCRUVGQ0FGRVVMKQorCisjZGVmaW5lIE1FTVRYX1RYICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgTUVNUlhfUlggICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBNRU1SWF9SWF9ET05FICAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIE1FTVJYX1BDSU5UQUNLSyAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgTUVNUlhfTUVNU1BVUklPVVNJTlQgICAgICAgICAgIDB4MDAwMQorCisjZGVmaW5lIE5MX05VTV9PRl9QUklPUklUSUVTICAgICAgIDMKKyNkZWZpbmUgTkxfTlVNX09GX1BST1RPQ09MUyAgICAgICAgMworI2RlZmluZSBOTF9OVU1fT0ZfQUREUkVTU0VTICAgICAgICBOT19PRl9JUFdfQ0hBTk5FTFMKKworc3RydWN0IGlwd19oYXJkd2FyZSB7CisJdW5zaWduZWQgaW50IGJhc2VfcG9ydDsKKwlzaG9ydCBod192ZXJzaW9uOworCXVuc2lnbmVkIHNob3J0IGxsX210dTsKKwlzcGlubG9ja190IHNwaW5sb2NrOworCisJaW50IGluaXRpYWxpemluZzsKKwlpbnQgaW5pdF9sb29wczsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBzZXR1cF90aW1lcjsKKworCWludCB0eF9yZWFkeTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHR4X3F1ZXVlW05MX05VTV9PRl9QUklPUklUSUVTXTsKKwkvKiBUcnVlIGlmIGFueSBwYWNrZXRzIGFyZSBxdWV1ZWQgZm9yIHRyYW5zbWlzc2lvbiAqLworCWludCB0eF9xdWV1ZWQ7CisKKwlpbnQgcnhfYnl0ZXNfcXVldWVkOworCXN0cnVjdCBsaXN0X2hlYWQgcnhfcXVldWU7CisJLyogUG9vbCBvZiByeF9wYWNrZXQgc3RydWN0dXJlcyB0aGF0IGFyZSBub3QgY3VycmVudGx5IHVzZWQuICovCisJc3RydWN0IGxpc3RfaGVhZCByeF9wb29sOworCWludCByeF9wb29sX3NpemU7CisJLyogVHJ1ZSBpZiByZWNlcHRpb24gb2YgZGF0YSBpcyBibG9ja2VkIHdoaWxlIHVzZXJzcGFjZSBwcm9jZXNzZXMgaXQuICovCisJaW50IGJsb2NraW5nX3J4OworCS8qIFRydWUgaWYgdGhlcmUgaXMgUlggZGF0YSByZWFkeSBvbiB0aGUgaGFyZHdhcmUuICovCisJaW50IHJ4X3JlYWR5OworCXVuc2lnbmVkIHNob3J0IGxhc3RfbWVtdHhfc2VyaWFsOworCS8qCisJICogTmV3ZXIgdmVyc2lvbnMgb2YgdGhlIFYyIGNhcmQgZmlybXdhcmUgc2VuZCBzZXJpYWwgbnVtYmVycyBpbiB0aGUKKwkgKiBNZW1UWCByZWdpc3Rlci4gJ3NlcmlhbF9udW1iZXJfZGV0ZWN0ZWQnIGlzIHNldCB0cnVlIHdoZW4gd2UgZGV0ZWN0CisJICogYSBub24temVybyBzZXJpYWwgbnVtYmVyIChpbmRpY2F0aW5nIHRoZSBuZXcgZmlybXdhcmUpLiAgVGhlcmVhZnRlciwKKwkgKiB0aGUgZHJpdmVyIGNhbiBzYWZlbHkgaWdub3JlIHRoZSBUaW1lciBSZWNvdmVyeSByZS1zZW5kcyB0byBhdm9pZAorCSAqIG91dC1vZi1zeW5jIHByb2JsZW1zLgorCSAqLworCWludCBzZXJpYWxfbnVtYmVyX2RldGVjdGVkOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrX3J4OworCisJLyogVHJ1ZSBpZiB3ZSBhcmUgdG8gc2VuZCB0aGUgc2V0LXVwIGRhdGEgdG8gdGhlIGhhcmR3YXJlLiAqLworCWludCB0b19zZXR1cDsKKworCS8qIENhcmQgaGFzIGJlZW4gcmVtb3ZlZCAqLworCWludCByZW1vdmVkOworCS8qIFNhdmVkIGlycSB2YWx1ZSB3aGVuIHdlIGRpc2FibGUgdGhlIGludGVycnVwdC4gKi8KKwlpbnQgaXJxOworCS8qIFRydWUgaWYgdGhpcyBkcml2ZXIgaXMgc2h1dHRpbmcgZG93bi4gKi8KKwlpbnQgc2h1dHRpbmdfZG93bjsKKwkvKiBNb2RlbSBjb250cm9sIGxpbmVzICovCisJdW5zaWduZWQgaW50IGNvbnRyb2xfbGluZXNbTkxfTlVNX09GX0FERFJFU1NFU107CisJc3RydWN0IGlwd19yeF9wYWNrZXQgKnBhY2tldF9hc3NlbWJsZXJbTkxfTlVNX09GX0FERFJFU1NFU107CisKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdGFza2xldDsKKworCS8qIFRoZSBoYW5kbGUgZm9yIHRoZSBuZXR3b3JrIGxheWVyLCBmb3IgdGhlIHNlbmRpbmcgb2YgZXZlbnRzIHRvIGl0LiAqLworCXN0cnVjdCBpcHdfbmV0d29yayAqbmV0d29yazsKKwlzdHJ1Y3QgTUVNSU5GUkVHIF9faW9tZW0gKm1lbW9yeV9pbmZvX3JlZ3M7CisJc3RydWN0IE1FTUNDUiBfX2lvbWVtICptZW1yZWdzX0NDUjsKKwl2b2lkICgqcmVib290X2NhbGxiYWNrKSAodm9pZCAqZGF0YSk7CisJdm9pZCAqcmVib290X2NhbGxiYWNrX2RhdGE7CisKKwl1bnNpZ25lZCBzaG9ydCBfX2lvbWVtICptZW1yZWdfdHg7Cit9OworCisvKgorICogUGFja2V0IGluZm8gc3RydWN0dXJlIGZvciB0eCBwYWNrZXRzLgorICogTm90ZTogbm90IGFsbCB0aGUgZmllbGRzIGRlZmluZWQgaGVyZSBhcmUgcmVxdWlyZWQgZm9yIGFsbCBwcm90b2NvbHMKKyAqLworc3RydWN0IGlwd190eF9wYWNrZXQgeworCXN0cnVjdCBsaXN0X2hlYWQgcXVldWU7CisJLyogY2hhbm5lbCBpZHggKyAxICovCisJdW5zaWduZWQgY2hhciBkZXN0X2FkZHI7CisJLyogU0VUVVAsIENUUkwgb3IgREFUQSAqLworCXVuc2lnbmVkIGNoYXIgcHJvdG9jb2w7CisJLyogTGVuZ3RoIG9mIGRhdGEgYmxvY2ssIHdoaWNoIHN0YXJ0cyBhdCB0aGUgZW5kIG9mIHRoaXMgc3RydWN0dXJlICovCisJdW5zaWduZWQgc2hvcnQgbGVuZ3RoOworCS8qIFNlbmRpbmcgc3RhdGUgKi8KKwkvKiBPZmZzZXQgb2Ygd2hlcmUgd2UndmUgc2VudCB1cCB0byBzbyBmYXIgKi8KKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwkvKiBDb3VudCBvZiBwYWNrZXQgZnJhZ21lbnRzLCBzdGFydGluZyBhdCAwICovCisJaW50IGZyYWdtZW50X2NvdW50OworCisJLyogQ2FsbGVkIGFmdGVyIHBhY2tldCBpcyBzZW50IGFuZCBiZWZvcmUgaXMgZnJlZWQgKi8KKwl2b2lkICgqcGFja2V0X2NhbGxiYWNrKSAodm9pZCAqY2JfZGF0YSwgdW5zaWduZWQgaW50IHBhY2tldF9sZW5ndGgpOworCXZvaWQgKmNhbGxiYWNrX2RhdGE7Cit9OworCisvKiBTaWduYWxzIGZyb20gRFRFICovCisjZGVmaW5lIENPTUNUUkxfUlRTCTAKKyNkZWZpbmUgQ09NQ1RSTF9EVFIJMQorCisvKiBTaWduYWxzIGZyb20gRENFICovCisjZGVmaW5lIENPTUNUUkxfQ1RTCTIKKyNkZWZpbmUgQ09NQ1RSTF9EQ0QJMworI2RlZmluZSBDT01DVFJMX0RTUgk0CisjZGVmaW5lIENPTUNUUkxfUkkJNQorCitzdHJ1Y3QgaXB3X2NvbnRyb2xfcGFja2V0X2JvZHkgeworCS8qIERURSBzaWduYWwgb3IgRENFIHNpZ25hbCAqLworCXVuc2lnbmVkIGNoYXIgc2lnX25vOworCS8qIDA6IHNldCBzaWduYWwsIDE6IGNsZWFyIHNpZ25hbCAqLworCXVuc2lnbmVkIGNoYXIgdmFsdWU7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBpcHdfY29udHJvbF9wYWNrZXQgeworCXN0cnVjdCBpcHdfdHhfcGFja2V0IGhlYWRlcjsKKwlzdHJ1Y3QgaXB3X2NvbnRyb2xfcGFja2V0X2JvZHkgYm9keTsKK307CisKK3N0cnVjdCBpcHdfcnhfcGFja2V0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHF1ZXVlOworCXVuc2lnbmVkIGludCBjYXBhY2l0eTsKKwl1bnNpZ25lZCBpbnQgbGVuZ3RoOworCXVuc2lnbmVkIGludCBwcm90b2NvbDsKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbF9pZHg7Cit9OworCisjaWZkZWYgSVBXSVJFTEVTU19TVEFURV9ERUJVRworaW50IGlwd2lyZWxlc3NfZHVtcF9oYXJkd2FyZV9zdGF0ZShjaGFyICpwLCBzaXplX3QgbGltaXQsCisJCQkJICAgc3RydWN0IGlwd19oYXJkd2FyZSAqaHcpCit7CisJcmV0dXJuIHNucHJpbnRmKHAsIGxpbWl0LAorCQkJImRlYnVnOiBpbml0aWFsaXppbmc9JWRcbiIKKwkJCSJkZWJ1ZzogdHhfcmVhZHk9JWRcbiIKKwkJCSJkZWJ1ZzogdHhfcXVldWVkPSVkXG4iCisJCQkiZGVidWc6IHJ4X3JlYWR5PSVkXG4iCisJCQkiZGVidWc6IHJ4X2J5dGVzX3F1ZXVlZD0lZFxuIgorCQkJImRlYnVnOiBibG9ja2luZ19yeD0lZFxuIgorCQkJImRlYnVnOiByZW1vdmVkPSVkXG4iCisJCQkiZGVidWc6IGhhcmR3YXJlLnNodXR0aW5nX2Rvd249JWRcbiIKKwkJCSJkZWJ1ZzogdG9fc2V0dXA9JWRcbiIsCisJCQlody0+aW5pdGlhbGl6aW5nLAorCQkJaHctPnR4X3JlYWR5LAorCQkJaHctPnR4X3F1ZXVlZCwKKwkJCWh3LT5yeF9yZWFkeSwKKwkJCWh3LT5yeF9ieXRlc19xdWV1ZWQsCisJCQlody0+YmxvY2tpbmdfcngsCisJCQlody0+cmVtb3ZlZCwKKwkJCWh3LT5zaHV0dGluZ19kb3duLAorCQkJaHctPnRvX3NldHVwKTsKK30KKyNlbmRpZgorCitzdGF0aWMgY2hhciAqZGF0YV90eXBlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuZ3RoKQoreworCXN0cnVjdCBubF9wYWNrZXRfaGVhZGVyICpoZHIgPSAoc3RydWN0IG5sX3BhY2tldF9oZWFkZXIgKikgYnVmOworCisJaWYgKGxlbmd0aCA9PSAwKQorCQlyZXR1cm4gIiAgICAgIjsKKworCWlmIChoZHItPnBhY2tldF9yYW5rICYgTkxfRklSU1RfUEFDS0VUKSB7CisJCXN3aXRjaCAoaGRyLT5wcm90b2NvbCkgeworCQljYXNlIFRMX1BST1RPQ09MSURfQ09NX0RBVEE6CXJldHVybiAiREFUQSAiOworCQljYXNlIFRMX1BST1RPQ09MSURfQ09NX0NUUkw6CXJldHVybiAiQ1RSTCAiOworCQljYXNlIFRMX1BST1RPQ09MSURfU0VUVVA6CXJldHVybiAiU0VUVVAiOworCQlkZWZhdWx0OiByZXR1cm4gIj8/Pz8gIjsKKwkJfQorCX0gZWxzZQorCQlyZXR1cm4gIiAgICAgIjsKK30KKworI2RlZmluZSBEVU1QX01BWF9CWVRFUyA2NAorCitzdGF0aWMgdm9pZCBkdW1wX2RhdGFfYnl0ZXMoY29uc3QgY2hhciAqdHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwKKwkJCSAgICB1bnNpZ25lZCBsZW5ndGgpCit7CisJY2hhciBwcmVmaXhbNTZdOworCisJc3ByaW50ZihwcmVmaXgsIElQV0lSRUxFU1NfUENDQVJEX05BTUUgIjogJXMgJXMgIiwKKwkJCXR5cGUsIGRhdGFfdHlwZShkYXRhLCBsZW5ndGgpKTsKKwlwcmludF9oZXhfZHVtcF9ieXRlcyhwcmVmaXgsIDAsICh2b2lkICopZGF0YSwKKwkJCWxlbmd0aCA8IERVTVBfTUFYX0JZVEVTID8gbGVuZ3RoIDogRFVNUF9NQVhfQllURVMpOworfQorCitzdGF0aWMgaW50IGRvX3NlbmRfZnJhZ21lbnQoc3RydWN0IGlwd19oYXJkd2FyZSAqaHcsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCQkgICAgdW5zaWduZWQgbGVuZ3RoKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzdGFydF90aW1pbmcoKTsKKworCWlmIChsZW5ndGggPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAobGVuZ3RoID4gaHctPmxsX210dSkKKwkJcmV0dXJuIC0xOworCisJaWYgKGlwd2lyZWxlc3NfZGVidWcpCisJCWR1bXBfZGF0YV9ieXRlcygic2VuZCIsIGRhdGEsIGxlbmd0aCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPnNwaW5sb2NrLCBmbGFncyk7CisKKwlpZiAoaHctPmh3X3ZlcnNpb24gPT0gSFdfVkVSU0lPTl8xKSB7CisJCW91dHcoKHVuc2lnbmVkIHNob3J0KSBsZW5ndGgsIGh3LT5iYXNlX3BvcnQgKyBJT0RXUik7CisKKwkJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAyKSB7CisJCQl1bnNpZ25lZCBzaG9ydCBkID0gZGF0YVtpXTsKKwkJCV9fbGUxNiByYXdfZGF0YTsKKworCQkJaWYgKGxpa2VseShpICsgMSA8IGxlbmd0aCkpCisJCQkJZCB8PSBkYXRhW2kgKyAxXSA8PCA4OworCQkJcmF3X2RhdGEgPSBjcHVfdG9fbGUxNihkKTsKKwkJCW91dHcocmF3X2RhdGEsIGh3LT5iYXNlX3BvcnQgKyBJT0RXUik7CisJCX0KKworCQlvdXR3KERDUl9UWERPTkUsIGh3LT5iYXNlX3BvcnQgKyBJT0RDUik7CisJfSBlbHNlIGlmIChody0+aHdfdmVyc2lvbiA9PSBIV19WRVJTSU9OXzIpIHsKKwkJb3V0dygodW5zaWduZWQgc2hvcnQpIGxlbmd0aCwgaHctPmJhc2VfcG9ydCArIElPRE1BRFBSKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDIpIHsKKwkJCXVuc2lnbmVkIHNob3J0IGQgPSBkYXRhW2ldOworCQkJX19sZTE2IHJhd19kYXRhOworCisJCQlpZiAoKGkgKyAxIDwgbGVuZ3RoKSkKKwkJCQlkIHw9IGRhdGFbaSArIDFdIDw8IDg7CisJCQlyYXdfZGF0YSA9IGNwdV90b19sZTE2KGQpOworCQkJb3V0dyhyYXdfZGF0YSwgaHctPmJhc2VfcG9ydCArIElPRE1BRFBSKTsKKwkJfQorCQl3aGlsZSAoKGkgJiAzKSAhPSAyKSB7CisJCQlvdXR3KCh1bnNpZ25lZCBzaG9ydCkgMHhERUFELCBody0+YmFzZV9wb3J0ICsgSU9ETUFEUFIpOworCQkJaSArPSAyOworCQl9CisJCXdyaXRldyhNRU1SWF9SWCwgJmh3LT5tZW1vcnlfaW5mb19yZWdzLT5tZW1yZWdfcngpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5zcGlubG9jaywgZmxhZ3MpOworCisJZW5kX3dyaXRlX3RpbWluZyhsZW5ndGgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG9fc2VuZF9wYWNrZXQoc3RydWN0IGlwd19oYXJkd2FyZSAqaHcsIHN0cnVjdCBpcHdfdHhfcGFja2V0ICpwYWNrZXQpCit7CisJdW5zaWduZWQgc2hvcnQgZnJhZ21lbnRfZGF0YV9sZW47CisJdW5zaWduZWQgc2hvcnQgZGF0YV9sZWZ0ID0gcGFja2V0LT5sZW5ndGggLSBwYWNrZXQtPm9mZnNldDsKKwl1bnNpZ25lZCBzaG9ydCBoZWFkZXJfc2l6ZTsKKwl1bmlvbiBubF9wYWNrZXQgcGt0OworCisJaGVhZGVyX3NpemUgPQorCSAgICAocGFja2V0LT5mcmFnbWVudF9jb3VudCA9PSAwKQorCSAgICA/IE5MX0ZJUlNUX1BBQ0tFVF9IRUFERVJfU0laRQorCSAgICA6IE5MX0ZPTExPV0lOR19QQUNLRVRfSEVBREVSX1NJWkU7CisJZnJhZ21lbnRfZGF0YV9sZW4gPSBody0+bGxfbXR1IC0gaGVhZGVyX3NpemU7CisJaWYgKGRhdGFfbGVmdCA8IGZyYWdtZW50X2RhdGFfbGVuKQorCQlmcmFnbWVudF9kYXRhX2xlbiA9IGRhdGFfbGVmdDsKKworCXBrdC5oZHJfZmlyc3QucHJvdG9jb2wgPSBwYWNrZXQtPnByb3RvY29sOworCXBrdC5oZHJfZmlyc3QuYWRkcmVzcyA9IHBhY2tldC0+ZGVzdF9hZGRyOworCXBrdC5oZHJfZmlyc3QucGFja2V0X3JhbmsgPSAwOworCisJLyogRmlyc3QgcGFja2V0PyAqLworCWlmIChwYWNrZXQtPmZyYWdtZW50X2NvdW50ID09IDApIHsKKwkJcGt0Lmhkcl9maXJzdC5wYWNrZXRfcmFuayB8PSBOTF9GSVJTVF9QQUNLRVQ7CisJCXBrdC5oZHJfZmlyc3QubGVuZ3RoX2xzYiA9ICh1bnNpZ25lZCBjaGFyKSBwYWNrZXQtPmxlbmd0aDsKKwkJcGt0Lmhkcl9maXJzdC5sZW5ndGhfbXNiID0KKwkJCSh1bnNpZ25lZCBjaGFyKSAocGFja2V0LT5sZW5ndGggPj4gOCk7CisJfQorCisJbWVtY3B5KHBrdC5yYXdwa3QgKyBoZWFkZXJfc2l6ZSwKKwkgICAgICAgKCh1bnNpZ25lZCBjaGFyICopIHBhY2tldCkgKyBzaXplb2Yoc3RydWN0IGlwd190eF9wYWNrZXQpICsKKwkgICAgICAgcGFja2V0LT5vZmZzZXQsIGZyYWdtZW50X2RhdGFfbGVuKTsKKwlwYWNrZXQtPm9mZnNldCArPSBmcmFnbWVudF9kYXRhX2xlbjsKKwlwYWNrZXQtPmZyYWdtZW50X2NvdW50Kys7CisKKwkvKiBMYXN0IHBhY2tldD8gKE1heSBhbHNvIGJlIGZpcnN0IHBhY2tldC4pICovCisJaWYgKHBhY2tldC0+b2Zmc2V0ID09IHBhY2tldC0+bGVuZ3RoKQorCQlwa3QuaGRyX2ZpcnN0LnBhY2tldF9yYW5rIHw9IE5MX0xBU1RfUEFDS0VUOworCWRvX3NlbmRfZnJhZ21lbnQoaHcsIHBrdC5yYXdwa3QsIGhlYWRlcl9zaXplICsgZnJhZ21lbnRfZGF0YV9sZW4pOworCisJLyogSWYgdGhpcyBwYWNrZXQgaGFzIHVuc2VudCBkYXRhLCB0aGVuIHJlLXF1ZXVlIGl0LiAqLworCWlmIChwYWNrZXQtPm9mZnNldCA8IHBhY2tldC0+bGVuZ3RoKSB7CisJCS8qCisJCSAqIFJlLXF1ZXVlIGl0IGF0IHRoZSBoZWFkIG9mIHRoZSBoaWdoZXN0IHByaW9yaXR5IHF1ZXVlIHNvCisJCSAqIGl0IGdvZXMgYmVmb3JlIGFsbCBvdGhlciBwYWNrZXRzCisJCSAqLworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZody0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJbGlzdF9hZGQoJnBhY2tldC0+cXVldWUsICZody0+dHhfcXVldWVbMF0pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+c3BpbmxvY2ssIGZsYWdzKTsKKwl9IGVsc2UgeworCQlpZiAocGFja2V0LT5wYWNrZXRfY2FsbGJhY2spCisJCQlwYWNrZXQtPnBhY2tldF9jYWxsYmFjayhwYWNrZXQtPmNhbGxiYWNrX2RhdGEsCisJCQkJCXBhY2tldC0+bGVuZ3RoKTsKKwkJa2ZyZWUocGFja2V0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXB3X3NldHVwX2hhcmR3YXJlKHN0cnVjdCBpcHdfaGFyZHdhcmUgKmh3KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPnNwaW5sb2NrLCBmbGFncyk7CisJaWYgKGh3LT5od192ZXJzaW9uID09IEhXX1ZFUlNJT05fMSkgeworCQkvKiBSZXNldCBSWCBGSUZPICovCisJCW91dHcoRENSX1JYUkVTRVQsIGh3LT5iYXNlX3BvcnQgKyBJT0RDUik7CisJCS8qIFNCOiBSZXNldCBUWCBGSUZPICovCisJCW91dHcoRENSX1RYUkVTRVQsIGh3LT5iYXNlX3BvcnQgKyBJT0RDUik7CisKKwkJLyogRW5hYmxlIFRYIGFuZCBSWCBpbnRlcnJ1cHRzLiAqLworCQlvdXR3KElFUl9UWEVOQUJMRUQgfCBJRVJfUlhFTkFCTEVELCBody0+YmFzZV9wb3J0ICsgSU9JRVIpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFNldCBJTlRSQUNLIGJpdCAoYml0IDApLCB3aGljaCBtZWFucyB3ZSBtdXN0IGV4cGxpY2l0bHkKKwkJICogYWNrbm93bGVkZ2UgaW50ZXJydXB0cyBieSBjbGVhcmluZyBiaXQgMiBvZiByZWdfY29uZmlnX2FuZF9zdGF0dXMuCisJCSAqLworCQl1bnNpZ25lZCBzaG9ydCBjc3IgPSByZWFkdygmaHctPm1lbXJlZ3NfQ0NSLT5yZWdfY29uZmlnX2FuZF9zdGF0dXMpOworCisJCWNzciB8PSAxOworCQl3cml0ZXcoY3NyLCAmaHctPm1lbXJlZ3NfQ0NSLT5yZWdfY29uZmlnX2FuZF9zdGF0dXMpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+c3BpbmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIElmICdwYWNrZXQnIGlzIE5VTEwsIHRoZW4gdGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSBuZXcgcGFja2V0LCBzZXR0aW5nIGl0cworICogbGVuZ3RoIHRvIDAgYW5kIGVuc3VyaW5nIGl0IGhhcyB0aGUgc3BlY2lmaWVkIG1pbmltdW0gYW1vdW50IG9mIGZyZWUgc3BhY2UuCisgKgorICogSWYgJ3BhY2tldCcgaXMgbm90IE5VTEwsIHRoZW4gdGhpcyBmdW5jdGlvbiBlbmxhcmdlcyBpdCBpZiBpdCBkb2Vzbid0CisgKiBoYXZlIHRoZSBzcGVjaWZpZWQgbWluaW11bSBhbW91bnQgb2YgZnJlZSBzcGFjZS4KKyAqCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXB3X3J4X3BhY2tldCAqcG9vbF9hbGxvY2F0ZShzdHJ1Y3QgaXB3X2hhcmR3YXJlICpodywKKwkJCQkJICAgc3RydWN0IGlwd19yeF9wYWNrZXQgKnBhY2tldCwKKwkJCQkJICAgaW50IG1pbmltdW1fZnJlZV9zcGFjZSkKK3sKKworCWlmICghcGFja2V0KSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJLyoKKwkJICogSWYgdGhpcyBpcyB0aGUgZmlyc3QgZnJhZ21lbnQsIHRoZW4gd2Ugd2lsbCBuZWVkIHRvIGZldGNoIGEKKwkJICogcGFja2V0IHRvIHB1dCBpdCBpbi4KKwkJICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZody0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJLyogSWYgd2UgaGF2ZSBvbmUgaW4gb3VyIHBvb2wsIHRoZW4gcHVsbCBpdCBvdXQuICovCisJCWlmICghbGlzdF9lbXB0eSgmaHctPnJ4X3Bvb2wpKSB7CisJCQlwYWNrZXQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZody0+cnhfcG9vbCwKKwkJCQkJc3RydWN0IGlwd19yeF9wYWNrZXQsIHF1ZXVlKTsKKwkJCWxpc3RfZGVsKCZwYWNrZXQtPnF1ZXVlKTsKKwkJCWh3LT5yeF9wb29sX3NpemUtLTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5zcGlubG9jaywgZmxhZ3MpOworCQl9IGVsc2UgeworCQkJLyogT3RoZXJ3aXNlIGFsbG9jYXRlIGEgbmV3IG9uZS4gKi8KKwkJCXN0YXRpYyBpbnQgbWluX2NhcGFjaXR5ID0gMjU2OworCQkJaW50IG5ld19jYXBhY2l0eTsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPnNwaW5sb2NrLCBmbGFncyk7CisJCQluZXdfY2FwYWNpdHkgPQorCQkJICAgIG1pbmltdW1fZnJlZV9zcGFjZSA+IG1pbl9jYXBhY2l0eQorCQkJICAgID8gbWluaW11bV9mcmVlX3NwYWNlCisJCQkgICAgOiBtaW5fY2FwYWNpdHk7CisJCQlwYWNrZXQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXB3X3J4X3BhY2tldCkKKwkJCQkJKyBuZXdfY2FwYWNpdHksIEdGUF9BVE9NSUMpOworCQkJaWYgKCFwYWNrZXQpCisJCQkJcmV0dXJuIE5VTEw7CisJCQlwYWNrZXQtPmNhcGFjaXR5ID0gbmV3X2NhcGFjaXR5OworCQl9CisJCXBhY2tldC0+bGVuZ3RoID0gMDsKKwl9CisKKwkvKgorCSAqIElmIHRoaXMgcGFja2V0IGRvZXMgbm90IGhhdmUgc3VmZmljaWVudCBjYXBhY2l0eSBmb3IgdGhlIGRhdGEgd2UKKwkgKiB3YW50IHRvIGFkZCwgdGhlbiBtYWtlIGl0IGJpZ2dlci4KKwkgKi8KKwlpZiAocGFja2V0LT5sZW5ndGggKyBtaW5pbXVtX2ZyZWVfc3BhY2UgPiBwYWNrZXQtPmNhcGFjaXR5KSB7CisJCXN0cnVjdCBpcHdfcnhfcGFja2V0ICpvbGRfcGFja2V0ID0gcGFja2V0OworCisJCXBhY2tldCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcHdfcnhfcGFja2V0KSArCisJCQkJb2xkX3BhY2tldC0+bGVuZ3RoICsgbWluaW11bV9mcmVlX3NwYWNlLAorCQkJCUdGUF9BVE9NSUMpOworCQlpZiAoIXBhY2tldCkKKwkJCXJldHVybiBOVUxMOworCQltZW1jcHkocGFja2V0LCBvbGRfcGFja2V0LAorCQkJCXNpemVvZihzdHJ1Y3QgaXB3X3J4X3BhY2tldCkKKwkJCQkJKyBvbGRfcGFja2V0LT5sZW5ndGgpOworCQlwYWNrZXQtPmNhcGFjaXR5ID0gb2xkX3BhY2tldC0+bGVuZ3RoICsgbWluaW11bV9mcmVlX3NwYWNlOworCQlrZnJlZShvbGRfcGFja2V0KTsKKwl9CisKKwlyZXR1cm4gcGFja2V0OworfQorCitzdGF0aWMgdm9pZCBwb29sX2ZyZWUoc3RydWN0IGlwd19oYXJkd2FyZSAqaHcsIHN0cnVjdCBpcHdfcnhfcGFja2V0ICpwYWNrZXQpCit7CisJaWYgKGh3LT5yeF9wb29sX3NpemUgPiA2KQorCQlrZnJlZShwYWNrZXQpOworCWVsc2UgeworCQlody0+cnhfcG9vbF9zaXplKys7CisJCWxpc3RfYWRkX3RhaWwoJnBhY2tldC0+cXVldWUsICZody0+cnhfcG9vbCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBxdWV1ZV9yZWNlaXZlZF9wYWNrZXQoc3RydWN0IGlwd19oYXJkd2FyZSAqaHcsCisJCQkJICB1bnNpZ25lZCBpbnQgcHJvdG9jb2wsIHVuc2lnbmVkIGludCBhZGRyZXNzLAorCQkJCSAgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbmd0aCwgaW50IGlzX2xhc3QpCit7CisJdW5zaWduZWQgaW50IGNoYW5uZWxfaWR4ID0gYWRkcmVzcyAtIDE7CisJc3RydWN0IGlwd19yeF9wYWNrZXQgKnBhY2tldCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIERpc2NhcmQgcGFja2V0IGlmIGNoYW5uZWwgaW5kZXggaXMgb3V0IG9mIHJhbmdlLiAqLworCWlmIChjaGFubmVsX2lkeCA+PSBOTF9OVU1fT0ZfQUREUkVTU0VTKSB7CisJCXByaW50ayhLRVJOX0lORk8gSVBXSVJFTEVTU19QQ0NBUkRfTkFNRQorCQkgICAgICAgIjogZGF0YSBwYWNrZXQgaGFzIGJhZCBhZGRyZXNzICV1XG4iLCBhZGRyZXNzKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogLT5wYWNrZXRfYXNzZW1ibGVyIGlzIHNhZmUgdG8gdG91Y2ggdW5sb2NrZWQsIHRoaXMgaXMgdGhlIG9ubHkgcGxhY2UKKwkgKi8KKwlpZiAocHJvdG9jb2wgPT0gVExfUFJPVE9DT0xJRF9DT01fREFUQSkgeworCQlzdHJ1Y3QgaXB3X3J4X3BhY2tldCAqKmFzc2VtID0KKwkJCSZody0+cGFja2V0X2Fzc2VtYmxlcltjaGFubmVsX2lkeF07CisKKwkJLyoKKwkJICogQ3JlYXRlIGEgbmV3IHBhY2tldCwgb3IgYXNzZW1ibGVyIGFscmVhZHkgY29udGFpbnMgb25lCisJCSAqIGVubGFyZ2UgaXQgYnkgJ2xlbmd0aCcgYnl0ZXMuCisJCSAqLworCQkoKmFzc2VtKSA9IHBvb2xfYWxsb2NhdGUoaHcsICphc3NlbSwgbGVuZ3RoKTsKKwkJaWYgKCEoKmFzc2VtKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIElQV0lSRUxFU1NfUENDQVJEX05BTUUKKwkJCQkiOiBubyBtZW1vcnkgZm9yIGluY29tbWluZyBkYXRhIHBhY2tldCwgZHJvcHBlZCFcbiIpOworCQkJcmV0dXJuOworCQl9CisJCSgqYXNzZW0pLT5wcm90b2NvbCA9IHByb3RvY29sOworCQkoKmFzc2VtKS0+Y2hhbm5lbF9pZHggPSBjaGFubmVsX2lkeDsKKworCQkvKiBBcHBlbmQgdGhpcyBwYWNrZXQgZGF0YSBvbnRvIGV4aXN0aW5nIGRhdGEuICovCisJCW1lbWNweSgodW5zaWduZWQgY2hhciAqKSgqYXNzZW0pICsKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGlwd19yeF9wYWNrZXQpCisJCQkJKyAoKmFzc2VtKS0+bGVuZ3RoLCBkYXRhLCBsZW5ndGgpOworCQkoKmFzc2VtKS0+bGVuZ3RoICs9IGxlbmd0aDsKKwkJaWYgKGlzX2xhc3QpIHsKKwkJCXBhY2tldCA9ICphc3NlbTsKKwkJCSphc3NlbSA9IE5VTEw7CisJCQkvKiBDb3VudCBxdWV1ZWQgREFUQSBieXRlcyBvbmx5ICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPnNwaW5sb2NrLCBmbGFncyk7CisJCQlody0+cnhfYnl0ZXNfcXVldWVkICs9IHBhY2tldC0+bGVuZ3RoOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPnNwaW5sb2NrLCBmbGFncyk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBJZiBpdCdzIGEgQ1RSTCBwYWNrZXQsIGRvbid0IGFzc2VtYmxlLCBqdXN0IHF1ZXVlIGl0LiAqLworCQlwYWNrZXQgPSBwb29sX2FsbG9jYXRlKGh3LCBOVUxMLCBsZW5ndGgpOworCQlpZiAoIXBhY2tldCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIElQV0lSRUxFU1NfUENDQVJEX05BTUUKKwkJCQkiOiBubyBtZW1vcnkgZm9yIGluY29tbWluZyBjdHJsIHBhY2tldCwgZHJvcHBlZCFcbiIpOworCQkJcmV0dXJuOworCQl9CisJCXBhY2tldC0+cHJvdG9jb2wgPSBwcm90b2NvbDsKKwkJcGFja2V0LT5jaGFubmVsX2lkeCA9IGNoYW5uZWxfaWR4OworCQltZW1jcHkoKHVuc2lnbmVkIGNoYXIgKilwYWNrZXQgKyBzaXplb2Yoc3RydWN0IGlwd19yeF9wYWNrZXQpLAorCQkJCWRhdGEsIGxlbmd0aCk7CisJCXBhY2tldC0+bGVuZ3RoID0gbGVuZ3RoOworCX0KKworCS8qCisJICogSWYgdGhpcyBpcyB0aGUgbGFzdCBwYWNrZXQsIHRoZW4gc2VuZCB0aGUgYXNzZW1ibGVkIHBhY2tldCBvbiB0byB0aGUKKwkgKiBuZXR3b3JrIGxheWVyLgorCSAqLworCWlmIChwYWNrZXQpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5zcGlubG9jaywgZmxhZ3MpOworCQlsaXN0X2FkZF90YWlsKCZwYWNrZXQtPnF1ZXVlLCAmaHctPnJ4X3F1ZXVlKTsKKwkJLyogQmxvY2sgcmVjZXB0aW9uIG9mIGluY29taW5nIHBhY2tldHMgaWYgcXVldWUgaXMgZnVsbC4gKi8KKwkJaHctPmJsb2NraW5nX3J4ID0KKwkJCWh3LT5yeF9ieXRlc19xdWV1ZWQgPj0gSVBXSVJFTEVTU19SWF9RVUVVRV9TSVpFOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5zcGlubG9jaywgZmxhZ3MpOworCQlzY2hlZHVsZV93b3JrKCZody0+d29ya19yeCk7CisJfQorfQorCisvKgorICogV29ya3F1ZXVlIGNhbGxiYWNrCisgKi8KK3N0YXRpYyB2b2lkIGlwd19yZWNlaXZlX2RhdGFfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmtfcngpCit7CisJc3RydWN0IGlwd19oYXJkd2FyZSAqaHcgPQorCSAgICBjb250YWluZXJfb2Yod29ya19yeCwgc3RydWN0IGlwd19oYXJkd2FyZSwgd29ya19yeCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZody0+c3BpbmxvY2ssIGZsYWdzKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmh3LT5yeF9xdWV1ZSkpIHsKKwkJc3RydWN0IGlwd19yeF9wYWNrZXQgKnBhY2tldCA9CisJCQlsaXN0X2ZpcnN0X2VudHJ5KCZody0+cnhfcXVldWUsCisJCQkJCXN0cnVjdCBpcHdfcnhfcGFja2V0LCBxdWV1ZSk7CisKKwkJaWYgKGh3LT5zaHV0dGluZ19kb3duKQorCQkJYnJlYWs7CisJCWxpc3RfZGVsKCZwYWNrZXQtPnF1ZXVlKTsKKworCQkvKgorCQkgKiBOb3RlOiBpcHdpcmVsZXNzX25ldHdvcmtfcGFja2V0X3JlY2VpdmVkIG11c3QgYmUgY2FsbGVkIGluIGEKKwkJICogcHJvY2VzcyBjb250ZXh0IChpLmUuIHZpYSBzY2hlZHVsZV93b3JrKSBiZWNhdXNlIHRoZSB0dHkKKwkJICogb3V0cHV0IGNvZGUgY2FuIHNsZWVwIGluIHRoZSB0dHlfZmxpcF9idWZmZXJfcHVzaCBjYWxsLgorCQkgKi8KKwkJaWYgKHBhY2tldC0+cHJvdG9jb2wgPT0gVExfUFJPVE9DT0xJRF9DT01fREFUQSkgeworCQkJaWYgKGh3LT5uZXR3b3JrICE9IE5VTEwpIHsKKwkJCQkvKiBJZiB0aGUgbmV0d29yayBoYXNuJ3QgYmVlbiBkaXNjb25uZWN0ZWQuICovCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPnNwaW5sb2NrLCBmbGFncyk7CisJCQkJLyoKKwkJCQkgKiBUaGlzIG11c3QgcnVuIHVubG9ja2VkIGR1ZSB0byB0dHkgcHJvY2Vzc2luZworCQkJCSAqIGFuZCBtdXRleCBsb2NraW5nCisJCQkJICovCisJCQkJaXB3aXJlbGVzc19uZXR3b3JrX3BhY2tldF9yZWNlaXZlZCgKKwkJCQkJCWh3LT5uZXR3b3JrLAorCQkJCQkJcGFja2V0LT5jaGFubmVsX2lkeCwKKwkJCQkJCSh1bnNpZ25lZCBjaGFyICopcGFja2V0CisJCQkJCQkrIHNpemVvZihzdHJ1Y3QgaXB3X3J4X3BhY2tldCksCisJCQkJCQlwYWNrZXQtPmxlbmd0aCk7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5zcGlubG9jaywgZmxhZ3MpOworCQkJfQorCQkJLyogQ291bnQgcXVldWVkIERBVEEgYnl0ZXMgb25seSAqLworCQkJaHctPnJ4X2J5dGVzX3F1ZXVlZCAtPSBwYWNrZXQtPmxlbmd0aDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBUaGlzIGlzIHNhZmUgdG8gYmUgY2FsbGVkIGxvY2tlZCwgY2FsbGNoYWluIGRvZXMKKwkJCSAqIG5vdCBibG9jaworCQkJICovCisJCQloYW5kbGVfcmVjZWl2ZWRfQ1RSTF9wYWNrZXQoaHcsIHBhY2tldC0+Y2hhbm5lbF9pZHgsCisJCQkJCSh1bnNpZ25lZCBjaGFyICopcGFja2V0CisJCQkJCSsgc2l6ZW9mKHN0cnVjdCBpcHdfcnhfcGFja2V0KSwKKwkJCQkJcGFja2V0LT5sZW5ndGgpOworCQl9CisJCXBvb2xfZnJlZShodywgcGFja2V0KTsKKwkJLyoKKwkJICogVW5ibG9jayByZWNlcHRpb24gb2YgaW5jb21pbmcgcGFja2V0cyBpZiBxdWV1ZSBpcyBubyBsb25nZXIKKwkJICogZnVsbC4KKwkJICovCisJCWh3LT5ibG9ja2luZ19yeCA9CisJCQlody0+cnhfYnl0ZXNfcXVldWVkID49IElQV0lSRUxFU1NfUlhfUVVFVUVfU0laRTsKKwkJaWYgKGh3LT5zaHV0dGluZ19kb3duKQorCQkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5zcGlubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfcmVjZWl2ZWRfQ1RSTF9wYWNrZXQoc3RydWN0IGlwd19oYXJkd2FyZSAqaHcsCisJCQkJCXVuc2lnbmVkIGludCBjaGFubmVsX2lkeCwKKwkJCQkJdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgaXB3X2NvbnRyb2xfcGFja2V0X2JvZHkgKmJvZHkgPQorCQkoc3RydWN0IGlwd19jb250cm9sX3BhY2tldF9ib2R5ICopIGRhdGE7CisJdW5zaWduZWQgaW50IGNoYW5nZWRfbWFzazsKKworCWlmIChsZW4gIT0gc2l6ZW9mKHN0cnVjdCBpcHdfY29udHJvbF9wYWNrZXRfYm9keSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBJUFdJUkVMRVNTX1BDQ0FSRF9OQU1FCisJCSAgICAgICAiOiBjb250cm9sIHBhY2tldCB3YXMgJWQgYnl0ZXMgLSB3cm9uZyBzaXplIVxuIiwKKwkJICAgICAgIGxlbik7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKGJvZHktPnNpZ19ubykgeworCWNhc2UgQ09NQ1RSTF9DVFM6CisJCWNoYW5nZWRfbWFzayA9IElQV19DT05UUk9MX0xJTkVfQ1RTOworCQlicmVhazsKKwljYXNlIENPTUNUUkxfRENEOgorCQljaGFuZ2VkX21hc2sgPSBJUFdfQ09OVFJPTF9MSU5FX0RDRDsKKwkJYnJlYWs7CisJY2FzZSBDT01DVFJMX0RTUjoKKwkJY2hhbmdlZF9tYXNrID0gSVBXX0NPTlRST0xfTElORV9EU1I7CisJCWJyZWFrOworCWNhc2UgQ09NQ1RSTF9SSToKKwkJY2hhbmdlZF9tYXNrID0gSVBXX0NPTlRST0xfTElORV9SSTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY2hhbmdlZF9tYXNrID0gMDsKKwl9CisKKwlpZiAoY2hhbmdlZF9tYXNrICE9IDApIHsKKwkJaWYgKGJvZHktPnZhbHVlKQorCQkJaHctPmNvbnRyb2xfbGluZXNbY2hhbm5lbF9pZHhdIHw9IGNoYW5nZWRfbWFzazsKKwkJZWxzZQorCQkJaHctPmNvbnRyb2xfbGluZXNbY2hhbm5lbF9pZHhdICY9IH5jaGFuZ2VkX21hc2s7CisJCWlmIChody0+bmV0d29yaykKKwkJCWlwd2lyZWxlc3NfbmV0d29ya19ub3RpZnlfY29udHJvbF9saW5lX2NoYW5nZSgKKwkJCQkJaHctPm5ldHdvcmssCisJCQkJCWNoYW5uZWxfaWR4LAorCQkJCQlody0+Y29udHJvbF9saW5lc1tjaGFubmVsX2lkeF0sCisJCQkJCWNoYW5nZWRfbWFzayk7CisJfQorfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfcmVjZWl2ZWRfcGFja2V0KHN0cnVjdCBpcHdfaGFyZHdhcmUgKmh3LAorCQkJCSAgIHVuaW9uIG5sX3BhY2tldCAqcGFja2V0LAorCQkJCSAgIHVuc2lnbmVkIHNob3J0IGxlbikKK3sKKwl1bnNpZ25lZCBpbnQgcHJvdG9jb2wgPSBwYWNrZXQtPmhkci5wcm90b2NvbDsKKwl1bnNpZ25lZCBpbnQgYWRkcmVzcyA9IHBhY2tldC0+aGRyLmFkZHJlc3M7CisJdW5zaWduZWQgaW50IGhlYWRlcl9sZW5ndGg7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwl1bnNpZ25lZCBpbnQgZGF0YV9sZW47CisJaW50IGlzX2xhc3QgPSBwYWNrZXQtPmhkci5wYWNrZXRfcmFuayAmIE5MX0xBU1RfUEFDS0VUOworCisJaWYgKHBhY2tldC0+aGRyLnBhY2tldF9yYW5rICYgTkxfRklSU1RfUEFDS0VUKQorCQloZWFkZXJfbGVuZ3RoID0gTkxfRklSU1RfUEFDS0VUX0hFQURFUl9TSVpFOworCWVsc2UKKwkJaGVhZGVyX2xlbmd0aCA9IE5MX0ZPTExPV0lOR19QQUNLRVRfSEVBREVSX1NJWkU7CisKKwlkYXRhID0gcGFja2V0LT5yYXdwa3QgKyBoZWFkZXJfbGVuZ3RoOworCWRhdGFfbGVuID0gbGVuIC0gaGVhZGVyX2xlbmd0aDsKKwlzd2l0Y2ggKHByb3RvY29sKSB7CisJY2FzZSBUTF9QUk9UT0NPTElEX0NPTV9EQVRBOgorCWNhc2UgVExfUFJPVE9DT0xJRF9DT01fQ1RSTDoKKwkJcXVldWVfcmVjZWl2ZWRfcGFja2V0KGh3LCBwcm90b2NvbCwgYWRkcmVzcywgZGF0YSwgZGF0YV9sZW4sCisJCQkJaXNfbGFzdCk7CisJCWJyZWFrOworCWNhc2UgVExfUFJPVE9DT0xJRF9TRVRVUDoKKwkJaGFuZGxlX3JlY2VpdmVkX1NFVFVQX3BhY2tldChodywgYWRkcmVzcywgZGF0YSwgZGF0YV9sZW4sCisJCQkJaXNfbGFzdCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgYWNrbm93bGVkZ2VfZGF0YV9yZWFkKHN0cnVjdCBpcHdfaGFyZHdhcmUgKmh3KQoreworCWlmIChody0+aHdfdmVyc2lvbiA9PSBIV19WRVJTSU9OXzEpCisJCW91dHcoRENSX1JYRE9ORSwgaHctPmJhc2VfcG9ydCArIElPRENSKTsKKwllbHNlCisJCXdyaXRldyhNRU1SWF9QQ0lOVEFDS0ssCisJCQkJJmh3LT5tZW1vcnlfaW5mb19yZWdzLT5tZW1yZWdfcGNfaW50ZXJydXB0X2Fjayk7Cit9CisKKy8qCisgKiBSZXRyaWV2ZSBhIHBhY2tldCBmcm9tIHRoZSBJUFcgaGFyZHdhcmUuCisgKi8KK3N0YXRpYyB2b2lkIGRvX3JlY2VpdmVfcGFja2V0KHN0cnVjdCBpcHdfaGFyZHdhcmUgKmh3KQoreworCXVuc2lnbmVkIGxlbjsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIHBrdFtMTF9NVFVfTUFYXTsKKworCXN0YXJ0X3RpbWluZygpOworCisJaWYgKGh3LT5od192ZXJzaW9uID09IEhXX1ZFUlNJT05fMSkgeworCQlsZW4gPSBpbncoaHctPmJhc2VfcG9ydCArIElPRFJSKTsKKwkJaWYgKGxlbiA+IGh3LT5sbF9tdHUpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gSVBXSVJFTEVTU19QQ0NBUkRfTkFNRQorCQkJICAgICAgICI6IHJlY2VpdmVkIGEgcGFja2V0IG9mICV1IGJ5dGVzIC0gIgorCQkJICAgICAgICJsb25nZXIgdGhhbiB0aGUgTVRVIVxuIiwgbGVuKTsKKwkJCW91dHcoRENSX1JYRE9ORSB8IERDUl9SWFJFU0VULCBody0+YmFzZV9wb3J0ICsgSU9EQ1IpOworCQkJcmV0dXJuOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7CisJCQlfX2xlMTYgcmF3X2RhdGEgPSBpbncoaHctPmJhc2VfcG9ydCArIElPRFJSKTsKKwkJCXVuc2lnbmVkIHNob3J0IGRhdGEgPSBsZTE2X3RvX2NwdShyYXdfZGF0YSk7CisKKwkJCXBrdFtpXSA9ICh1bnNpZ25lZCBjaGFyKSBkYXRhOworCQkJcGt0W2kgKyAxXSA9ICh1bnNpZ25lZCBjaGFyKSAoZGF0YSA+PiA4KTsKKwkJfQorCX0gZWxzZSB7CisJCWxlbiA9IGludyhody0+YmFzZV9wb3J0ICsgSU9ETUFEUFIpOworCQlpZiAobGVuID4gaHctPmxsX210dSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBJUFdJUkVMRVNTX1BDQ0FSRF9OQU1FCisJCQkgICAgICAgIjogcmVjZWl2ZWQgYSBwYWNrZXQgb2YgJXUgYnl0ZXMgLSAiCisJCQkgICAgICAgImxvbmdlciB0aGFuIHRoZSBNVFUhXG4iLCBsZW4pOworCQkJd3JpdGV3KE1FTVJYX1BDSU5UQUNLSywKKwkJCQkmaHctPm1lbW9yeV9pbmZvX3JlZ3MtPm1lbXJlZ19wY19pbnRlcnJ1cHRfYWNrKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMikgeworCQkJX19sZTE2IHJhd19kYXRhID0gaW53KGh3LT5iYXNlX3BvcnQgKyBJT0RNQURQUik7CisJCQl1bnNpZ25lZCBzaG9ydCBkYXRhID0gbGUxNl90b19jcHUocmF3X2RhdGEpOworCisJCQlwa3RbaV0gPSAodW5zaWduZWQgY2hhcikgZGF0YTsKKwkJCXBrdFtpICsgMV0gPSAodW5zaWduZWQgY2hhcikgKGRhdGEgPj4gOCk7CisJCX0KKworCQl3aGlsZSAoKGkgJiAzKSAhPSAyKSB7CisJCQlpbncoaHctPmJhc2VfcG9ydCArIElPRE1BRFBSKTsKKwkJCWkgKz0gMjsKKwkJfQorCX0KKworCWFja25vd2xlZGdlX2RhdGFfcmVhZChodyk7CisKKwlpZiAoaXB3aXJlbGVzc19kZWJ1ZykKKwkJZHVtcF9kYXRhX2J5dGVzKCJyZWN2IiwgcGt0LCBsZW4pOworCisJaGFuZGxlX3JlY2VpdmVkX3BhY2tldChodywgKHVuaW9uIG5sX3BhY2tldCAqKSBwa3QsIGxlbik7CisKKwllbmRfcmVhZF90aW1pbmcobGVuKTsKK30KKworc3RhdGljIGludCBnZXRfY3VycmVudF9wYWNrZXRfcHJpb3JpdHkoc3RydWN0IGlwd19oYXJkd2FyZSAqaHcpCit7CisJLyoKKwkgKiBJZiB3ZSdyZSBpbml0aWFsaXppbmcsIGRvbid0IHNlbmQgYW55dGhpbmcgb2YgaGlnaGVyIHByaW9yaXR5IHRoYW4KKwkgKiBQUklPX1NFVFVQLiAgVGhlIG5ldHdvcmsgbGF5ZXIgdGhlcmVmb3JlIG5lZWQgbm90IGNhcmUgYWJvdXQKKwkgKiBoYXJkd2FyZSBpbml0aWFsaXphdGlvbiAtIGFueSBvZiBpdHMgc3R1ZmYgd2lsbCBzaW1wbHkgYmUgcXVldWVkCisJICogdW50aWwgc2V0dXAgaXMgY29tcGxldGUuCisJICovCisJcmV0dXJuIChody0+dG9fc2V0dXAgfHwgaHctPmluaXRpYWxpemluZworCQkJPyBQUklPX1NFVFVQICsgMSA6CisJCQlOTF9OVU1fT0ZfUFJJT1JJVElFUyk7Cit9CisKKy8qCisgKiByZXR1cm4gMSBpZiBzb21ldGhpbmcgaGFzIGJlZW4gcmVjZWl2ZWQgZnJvbSBodworICovCitzdGF0aWMgaW50IGdldF9wYWNrZXRzX2Zyb21faHcoc3RydWN0IGlwd19oYXJkd2FyZSAqaHcpCit7CisJaW50IHJlY2VpdmVkID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5zcGlubG9jaywgZmxhZ3MpOworCXdoaWxlIChody0+cnhfcmVhZHkgJiYgIWh3LT5ibG9ja2luZ19yeCkgeworCQlyZWNlaXZlZCA9IDE7CisJCWh3LT5yeF9yZWFkeS0tOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+c3BpbmxvY2ssIGZsYWdzKTsKKworCQlkb19yZWNlaXZlX3BhY2tldChodyk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5zcGlubG9jaywgZmxhZ3MpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZWNlaXZlZDsKK30KKworLyoKKyAqIFNlbmQgcGVuZGluZyBwYWNrZXQgdXAgdG8gZ2l2ZW4gcHJpb3JpdHksIHByaW9yaXRpemUgU0VUVVAgZGF0YSB1bnRpbAorICogaGFyZHdhcmUgaXMgZnVsbHkgc2V0dXAuCisgKgorICogcmV0dXJuIDEgaWYgbW9yZSBwYWNrZXRzIGNhbiBiZSBzZW50CisgKi8KK3N0YXRpYyBpbnQgc2VuZF9wZW5kaW5nX3BhY2tldChzdHJ1Y3QgaXB3X2hhcmR3YXJlICpodywgaW50IHByaW9yaXR5X2xpbWl0KQoreworCWludCBtb3JlX3RvX3NlbmQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPnNwaW5sb2NrLCBmbGFncyk7CisJaWYgKGh3LT50eF9xdWV1ZWQgJiYgaHctPnR4X3JlYWR5ICE9IDApIHsKKwkJaW50IHByaW9yaXR5OworCQlzdHJ1Y3QgaXB3X3R4X3BhY2tldCAqcGFja2V0ID0gTlVMTDsKKworCQlody0+dHhfcmVhZHktLTsKKworCQkvKiBQaWNrIGEgcGFja2V0ICovCisJCWZvciAocHJpb3JpdHkgPSAwOyBwcmlvcml0eSA8IHByaW9yaXR5X2xpbWl0OyBwcmlvcml0eSsrKSB7CisJCQlpZiAoIWxpc3RfZW1wdHkoJmh3LT50eF9xdWV1ZVtwcmlvcml0eV0pKSB7CisJCQkJcGFja2V0ID0gbGlzdF9maXJzdF9lbnRyeSgKKwkJCQkJCSZody0+dHhfcXVldWVbcHJpb3JpdHldLAorCQkJCQkJc3RydWN0IGlwd190eF9wYWNrZXQsCisJCQkJCQlxdWV1ZSk7CisKKwkJCQlsaXN0X2RlbCgmcGFja2V0LT5xdWV1ZSk7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIXBhY2tldCkgeworCQkJaHctPnR4X3F1ZXVlZCA9IDA7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybiAwOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5zcGlubG9jaywgZmxhZ3MpOworCisJCS8qIFNlbmQgKi8KKwkJZG9fc2VuZF9wYWNrZXQoaHcsIHBhY2tldCk7CisKKwkJLyogQ2hlY2sgaWYgbW9yZSB0byBzZW5kICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZody0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJZm9yIChwcmlvcml0eSA9IDA7IHByaW9yaXR5IDwgcHJpb3JpdHlfbGltaXQ7IHByaW9yaXR5KyspCisJCQlpZiAoIWxpc3RfZW1wdHkoJmh3LT50eF9xdWV1ZVtwcmlvcml0eV0pKSB7CisJCQkJbW9yZV90b19zZW5kID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKworCQlpZiAoIW1vcmVfdG9fc2VuZCkKKwkJCWh3LT50eF9xdWV1ZWQgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBtb3JlX3RvX3NlbmQ7Cit9CisKKy8qCisgKiBTZW5kIGFuZCByZWNlaXZlIGFsbCBxdWV1ZWQgcGFja2V0cy4KKyAqLworc3RhdGljIHZvaWQgaXB3aXJlbGVzc19kb190YXNrbGV0KHVuc2lnbmVkIGxvbmcgaHdfKQoreworCXN0cnVjdCBpcHdfaGFyZHdhcmUgKmh3ID0gKHN0cnVjdCBpcHdfaGFyZHdhcmUgKikgaHdfOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPnNwaW5sb2NrLCBmbGFncyk7CisJaWYgKGh3LT5zaHV0dGluZ19kb3duKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJaWYgKGh3LT50b19zZXR1cCA9PSAxKSB7CisJCS8qCisJCSAqIEluaXRpYWwgc2V0dXAgZGF0YSBzZW50IHRvIGhhcmR3YXJlCisJCSAqLworCQlody0+dG9fc2V0dXAgPSAyOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+c3BpbmxvY2ssIGZsYWdzKTsKKworCQlpcHdfc2V0dXBfaGFyZHdhcmUoaHcpOworCQlpcHdfc2VuZF9zZXR1cF9wYWNrZXQoaHcpOworCisJCXNlbmRfcGVuZGluZ19wYWNrZXQoaHcsIFBSSU9fU0VUVVAgKyAxKTsKKwkJZ2V0X3BhY2tldHNfZnJvbV9odyhodyk7CisJfSBlbHNlIHsKKwkJaW50IHByaW9yaXR5X2xpbWl0ID0gZ2V0X2N1cnJlbnRfcGFja2V0X3ByaW9yaXR5KGh3KTsKKwkJaW50IGFnYWluOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5zcGlubG9jaywgZmxhZ3MpOworCisJCWRvIHsKKwkJCWFnYWluID0gc2VuZF9wZW5kaW5nX3BhY2tldChodywgcHJpb3JpdHlfbGltaXQpOworCQkJYWdhaW4gfD0gZ2V0X3BhY2tldHNfZnJvbV9odyhodyk7CisJCX0gd2hpbGUgKGFnYWluKTsKKwl9Cit9CisKKy8qCisgKiByZXR1cm4gdHJ1ZSBpZiB0aGUgY2FyZCBpcyBwaHlzaWNhbGx5IHByZXNlbnQuCisgKi8KK3N0YXRpYyBpbnQgaXNfY2FyZF9wcmVzZW50KHN0cnVjdCBpcHdfaGFyZHdhcmUgKmh3KQoreworCWlmIChody0+aHdfdmVyc2lvbiA9PSBIV19WRVJTSU9OXzEpCisJCXJldHVybiBpbncoaHctPmJhc2VfcG9ydCArIElPSVIpICE9IDB4RkZGRjsKKwllbHNlCisJCXJldHVybiByZWFkbCgmaHctPm1lbW9yeV9pbmZvX3JlZ3MtPm1lbXJlZ19jYXJkX3ByZXNlbnQpID09CisJCSAgICBDQVJEX1BSRVNFTlRfVkFMVUU7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpcHdpcmVsZXNzX2hhbmRsZV92MV9pbnRlcnJ1cHQoaW50IGlycSwKKwkJCQkJCSAgc3RydWN0IGlwd19oYXJkd2FyZSAqaHcpCit7CisJdW5zaWduZWQgc2hvcnQgaXJxbjsKKworCWlycW4gPSBpbncoaHctPmJhc2VfcG9ydCArIElPSVIpOworCisJLyogQ2hlY2sgaWYgY2FyZCBpcyBwcmVzZW50ICovCisJaWYgKGlycW4gPT0gMHhGRkZGKQorCQlyZXR1cm4gSVJRX05PTkU7CisJZWxzZSBpZiAoaXJxbiAhPSAwKSB7CisJCXVuc2lnbmVkIHNob3J0IGFjayA9IDA7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJLyogVHJhbnNtaXQgY29tcGxldGUuICovCisJCWlmIChpcnFuICYgSVJfVFhJTlRSKSB7CisJCQlhY2sgfD0gSVJfVFhJTlRSOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5zcGlubG9jaywgZmxhZ3MpOworCQkJaHctPnR4X3JlYWR5Kys7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJfQorCQkvKiBSZWNlaXZlZCBkYXRhICovCisJCWlmIChpcnFuICYgSVJfUlhJTlRSKSB7CisJCQlhY2sgfD0gSVJfUlhJTlRSOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5zcGlubG9jaywgZmxhZ3MpOworCQkJaHctPnJ4X3JlYWR5Kys7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJfQorCQlpZiAoYWNrICE9IDApIHsKKwkJCW91dHcoYWNrLCBody0+YmFzZV9wb3J0ICsgSU9JUik7CisJCQl0YXNrbGV0X3NjaGVkdWxlKCZody0+dGFza2xldCk7CisJCX0KKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKK3N0YXRpYyB2b2lkIGFja25vd2xlZGdlX3BjbWNpYV9pbnRlcnJ1cHQoc3RydWN0IGlwd19oYXJkd2FyZSAqaHcpCit7CisJdW5zaWduZWQgc2hvcnQgY3NyID0gcmVhZHcoJmh3LT5tZW1yZWdzX0NDUi0+cmVnX2NvbmZpZ19hbmRfc3RhdHVzKTsKKworCWNzciAmPSAweGZmZmQ7CisJd3JpdGV3KGNzciwgJmh3LT5tZW1yZWdzX0NDUi0+cmVnX2NvbmZpZ19hbmRfc3RhdHVzKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGlwd2lyZWxlc3NfaGFuZGxlX3YyX3YzX2ludGVycnVwdChpbnQgaXJxLAorCQkJCQkJICAgICBzdHJ1Y3QgaXB3X2hhcmR3YXJlICpodykKK3sKKwlpbnQgdHggPSAwOworCWludCByeCA9IDA7CisJaW50IHJ4X3JlcGVhdCA9IDA7CisJaW50IHRyeV9tZW1fdHhfb2xkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkbyB7CisKKwl1bnNpZ25lZCBzaG9ydCBtZW10eCA9IHJlYWR3KGh3LT5tZW1yZWdfdHgpOworCXVuc2lnbmVkIHNob3J0IG1lbXR4X3NlcmlhbDsKKwl1bnNpZ25lZCBzaG9ydCBtZW1yeGRvbmUgPQorCQlyZWFkdygmaHctPm1lbW9yeV9pbmZvX3JlZ3MtPm1lbXJlZ19yeF9kb25lKTsKKworCXRyeV9tZW1fdHhfb2xkID0gMDsKKworCS8qIGNoZWNrIHdoZXRoZXIgdGhlIGludGVycnVwdCB3YXMgZ2VuZXJhdGVkIGJ5IGlwd2lyZWxlc3MgY2FyZCAqLworCWlmICghKG1lbXR4ICYgTUVNVFhfVFgpICYmICEobWVtcnhkb25lICYgTUVNUlhfUlhfRE9ORSkpIHsKKworCQkvKiBjaGVjayBpZiB0aGUgY2FyZCB1c2VzIG1lbXJlZ190eF9vbGQgcmVnaXN0ZXIgKi8KKwkJaWYgKGh3LT5tZW1yZWdfdHggPT0gJmh3LT5tZW1vcnlfaW5mb19yZWdzLT5tZW1yZWdfdHhfbmV3KSB7CisJCQltZW10eCA9IHJlYWR3KCZody0+bWVtb3J5X2luZm9fcmVncy0+bWVtcmVnX3R4X29sZCk7CisJCQlpZiAobWVtdHggJiBNRU1UWF9UWCkgeworCQkJCXByaW50ayhLRVJOX0lORk8gSVBXSVJFTEVTU19QQ0NBUkRfTkFNRQorCQkJCQkiOiBVc2luZyBtZW1yZWdfdHhfb2xkXG4iKTsKKwkJCQlody0+bWVtcmVnX3R4ID0KKwkJCQkJJmh3LT5tZW1vcnlfaW5mb19yZWdzLT5tZW1yZWdfdHhfb2xkOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gSVJRX05PTkU7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gSVJRX05PTkU7CisJCX0KKwl9CisKKwkvKgorCSAqIFNlZSBpZiB0aGUgY2FyZCBpcyBwaHlzaWNhbGx5IHByZXNlbnQuIE5vdGUgdGhhdCB3aGlsZSBpdCBpcworCSAqIHBvd2VyaW5nIHVwLCBpdCBhcHBlYXJzIG5vdCB0byBiZSBwcmVzZW50LgorCSAqLworCWlmICghaXNfY2FyZF9wcmVzZW50KGh3KSkgeworCQlhY2tub3dsZWRnZV9wY21jaWFfaW50ZXJydXB0KGh3KTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCW1lbXR4X3NlcmlhbCA9IG1lbXR4ICYgKHVuc2lnbmVkIHNob3J0KSAweGZmMDA7CisJaWYgKG1lbXR4ICYgTUVNVFhfVFgpIHsKKwkJd3JpdGV3KG1lbXR4X3NlcmlhbCwgaHctPm1lbXJlZ190eCk7CisKKwkJaWYgKGh3LT5zZXJpYWxfbnVtYmVyX2RldGVjdGVkKSB7CisJCQlpZiAobWVtdHhfc2VyaWFsICE9IGh3LT5sYXN0X21lbXR4X3NlcmlhbCkgeworCQkJCWh3LT5sYXN0X21lbXR4X3NlcmlhbCA9IG1lbXR4X3NlcmlhbDsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPnNwaW5sb2NrLCBmbGFncyk7CisJCQkJaHctPnJ4X3JlYWR5Kys7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPnNwaW5sb2NrLCBmbGFncyk7CisJCQkJcnggPSAxOworCQkJfSBlbHNlCisJCQkJLyogSWdub3JlICdUaW1lciBSZWNvdmVyeScgZHVwbGljYXRlcy4gKi8KKwkJCQlyeF9yZXBlYXQgPSAxOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIElmIGEgbm9uLXplcm8gc2VyaWFsIG51bWJlciBpcyBzZWVuLCB0aGVuIGVuYWJsZQorCQkJICogc2VyaWFsIG51bWJlciBjaGVja2luZy4KKwkJCSAqLworCQkJaWYgKG1lbXR4X3NlcmlhbCAhPSAwKSB7CisJCQkJaHctPnNlcmlhbF9udW1iZXJfZGV0ZWN0ZWQgPSAxOworCQkJCXByaW50ayhLRVJOX0RFQlVHIElQV0lSRUxFU1NfUENDQVJEX05BTUUKKwkJCQkJIjogbWVtcmVnX3R4IHNlcmlhbCBudW0gZGV0ZWN0ZWRcbiIpOworCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5zcGlubG9jaywgZmxhZ3MpOworCQkJCWh3LT5yeF9yZWFkeSsrOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5zcGlubG9jaywgZmxhZ3MpOworCQkJfQorCQkJcnggPSAxOworCQl9CisJfQorCWlmIChtZW1yeGRvbmUgJiBNRU1SWF9SWF9ET05FKSB7CisJCXdyaXRldygwLCAmaHctPm1lbW9yeV9pbmZvX3JlZ3MtPm1lbXJlZ19yeF9kb25lKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5zcGlubG9jaywgZmxhZ3MpOworCQlody0+dHhfcmVhZHkrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHctPnNwaW5sb2NrLCBmbGFncyk7CisJCXR4ID0gMTsKKwl9CisJaWYgKHR4KQorCQl3cml0ZXcoTUVNUlhfUENJTlRBQ0tLLAorCQkJCSZody0+bWVtb3J5X2luZm9fcmVncy0+bWVtcmVnX3BjX2ludGVycnVwdF9hY2spOworCisJYWNrbm93bGVkZ2VfcGNtY2lhX2ludGVycnVwdChodyk7CisKKwlpZiAodHggfHwgcngpCisJCXRhc2tsZXRfc2NoZWR1bGUoJmh3LT50YXNrbGV0KTsKKwllbHNlIGlmICghcnhfcmVwZWF0KSB7CisJCWlmIChody0+bWVtcmVnX3R4ID09ICZody0+bWVtb3J5X2luZm9fcmVncy0+bWVtcmVnX3R4X25ldykgeworCQkJaWYgKGh3LT5zZXJpYWxfbnVtYmVyX2RldGVjdGVkKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgSVBXSVJFTEVTU19QQ0NBUkRfTkFNRQorCQkJCQkiOiBzcHVyaW91cyBpbnRlcnJ1cHQgLSBuZXdfdHggbW9kZVxuIik7CisJCQllbHNlIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HIElQV0lSRUxFU1NfUENDQVJEX05BTUUKKwkJCQkJIjogbm8gdmFsaWQgbWVtcmVnX3R4IHZhbHVlIC0gIgorCQkJCQkic3dpdGNoaW5nIHRvIHRoZSBvbGQgbWVtcmVnX3R4XG4iKTsKKwkJCQlody0+bWVtcmVnX3R4ID0KKwkJCQkJJmh3LT5tZW1vcnlfaW5mb19yZWdzLT5tZW1yZWdfdHhfb2xkOworCQkJCXRyeV9tZW1fdHhfb2xkID0gMTsKKwkJCX0KKwkJfSBlbHNlCisJCQlwcmludGsoS0VSTl9XQVJOSU5HIElQV0lSRUxFU1NfUENDQVJEX05BTUUKKwkJCQkJIjogc3B1cmlvdXMgaW50ZXJydXB0IC0gb2xkX3R4IG1vZGVcbiIpOworCX0KKworCX0gd2hpbGUgKHRyeV9tZW1fdHhfb2xkID09IDEpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitpcnFyZXR1cm5fdCBpcHdpcmVsZXNzX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBpcHdfaGFyZHdhcmUgKmh3ID0gZGV2X2lkOworCisJaWYgKGh3LT5od192ZXJzaW9uID09IEhXX1ZFUlNJT05fMSkKKwkJcmV0dXJuIGlwd2lyZWxlc3NfaGFuZGxlX3YxX2ludGVycnVwdChpcnEsIGh3KTsKKwllbHNlCisJCXJldHVybiBpcHdpcmVsZXNzX2hhbmRsZV92Ml92M19pbnRlcnJ1cHQoaXJxLCBodyk7Cit9CisKK3N0YXRpYyB2b2lkIGZsdXNoX3BhY2tldHNfdG9faHcoc3RydWN0IGlwd19oYXJkd2FyZSAqaHcpCit7CisJaW50IHByaW9yaXR5X2xpbWl0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPnNwaW5sb2NrLCBmbGFncyk7CisJcHJpb3JpdHlfbGltaXQgPSBnZXRfY3VycmVudF9wYWNrZXRfcHJpb3JpdHkoaHcpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5zcGlubG9jaywgZmxhZ3MpOworCisJd2hpbGUgKHNlbmRfcGVuZGluZ19wYWNrZXQoaHcsIHByaW9yaXR5X2xpbWl0KSk7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfcGFja2V0KHN0cnVjdCBpcHdfaGFyZHdhcmUgKmh3LCBpbnQgcHJpb3JpdHksCisJCQlzdHJ1Y3QgaXB3X3R4X3BhY2tldCAqcGFja2V0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPnNwaW5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmcGFja2V0LT5xdWV1ZSwgJmh3LT50eF9xdWV1ZVtwcmlvcml0eV0pOworCWh3LT50eF9xdWV1ZWQgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5zcGlubG9jaywgZmxhZ3MpOworCisJZmx1c2hfcGFja2V0c190b19odyhodyk7Cit9CisKKy8qIENyZWF0ZSBkYXRhIHBhY2tldCwgbm9uLWF0b21pYyBhbGxvY2F0aW9uICovCitzdGF0aWMgdm9pZCAqYWxsb2NfZGF0YV9wYWNrZXQoaW50IGRhdGFfc2l6ZSwKKwkJCQl1bnNpZ25lZCBjaGFyIGRlc3RfYWRkciwKKwkJCQl1bnNpZ25lZCBjaGFyIHByb3RvY29sKQoreworCXN0cnVjdCBpcHdfdHhfcGFja2V0ICpwYWNrZXQgPSBremFsbG9jKAorCQkJc2l6ZW9mKHN0cnVjdCBpcHdfdHhfcGFja2V0KSArIGRhdGFfc2l6ZSwKKwkJCUdGUF9BVE9NSUMpOworCisJaWYgKCFwYWNrZXQpCisJCXJldHVybiBOVUxMOworCisJSU5JVF9MSVNUX0hFQUQoJnBhY2tldC0+cXVldWUpOworCXBhY2tldC0+ZGVzdF9hZGRyID0gZGVzdF9hZGRyOworCXBhY2tldC0+cHJvdG9jb2wgPSBwcm90b2NvbDsKKwlwYWNrZXQtPmxlbmd0aCA9IGRhdGFfc2l6ZTsKKworCXJldHVybiBwYWNrZXQ7Cit9CisKK3N0YXRpYyB2b2lkICphbGxvY19jdHJsX3BhY2tldChpbnQgaGVhZGVyX3NpemUsCisJCQkgICAgICAgdW5zaWduZWQgY2hhciBkZXN0X2FkZHIsCisJCQkgICAgICAgdW5zaWduZWQgY2hhciBwcm90b2NvbCwKKwkJCSAgICAgICB1bnNpZ25lZCBjaGFyIHNpZ19ubykKK3sKKwkvKgorCSAqIHNpZ19ubyBpcyBsb2NhdGVkIHJpZ2h0IGFmdGVyIGlwd190eF9wYWNrZXQgc3RydWN0IGluIGV2ZXJ5CisJICogQ1RSTCBvciBTRVRVUCBwYWNrZXRzLCB3ZSBjYW4gdXNlIGlwd19jb250cm9sX3BhY2tldCBhcyBhCisJICogY29tbW9uIHN0cnVjdAorCSAqLworCXN0cnVjdCBpcHdfY29udHJvbF9wYWNrZXQgKnBhY2tldCA9IGt6YWxsb2MoaGVhZGVyX3NpemUsIEdGUF9BVE9NSUMpOworCisJaWYgKCFwYWNrZXQpCisJCXJldHVybiBOVUxMOworCisJSU5JVF9MSVNUX0hFQUQoJnBhY2tldC0+aGVhZGVyLnF1ZXVlKTsKKwlwYWNrZXQtPmhlYWRlci5kZXN0X2FkZHIgPSBkZXN0X2FkZHI7CisJcGFja2V0LT5oZWFkZXIucHJvdG9jb2wgPSBwcm90b2NvbDsKKwlwYWNrZXQtPmhlYWRlci5sZW5ndGggPSBoZWFkZXJfc2l6ZSAtIHNpemVvZihzdHJ1Y3QgaXB3X3R4X3BhY2tldCk7CisJcGFja2V0LT5ib2R5LnNpZ19ubyA9IHNpZ19ubzsKKworCXJldHVybiBwYWNrZXQ7Cit9CisKK2ludCBpcHdpcmVsZXNzX3NlbmRfcGFja2V0KHN0cnVjdCBpcHdfaGFyZHdhcmUgKmh3LCB1bnNpZ25lZCBpbnQgY2hhbm5lbF9pZHgsCisJCQkgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IGxlbmd0aCwKKwkJCSAgICB2b2lkICgqY2FsbGJhY2spICh2b2lkICpjYiwgdW5zaWduZWQgaW50IGxlbmd0aCksCisJCQkgICAgdm9pZCAqY2FsbGJhY2tfZGF0YSkKK3sKKwlzdHJ1Y3QgaXB3X3R4X3BhY2tldCAqcGFja2V0OworCisJcGFja2V0ID0gYWxsb2NfZGF0YV9wYWNrZXQobGVuZ3RoLAorCQkJICAgICAgICh1bnNpZ25lZCBjaGFyKSAoY2hhbm5lbF9pZHggKyAxKSwKKwkJCSAgICAgICBUTF9QUk9UT0NPTElEX0NPTV9EQVRBKTsKKwlpZiAoIXBhY2tldCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcGFja2V0LT5wYWNrZXRfY2FsbGJhY2sgPSBjYWxsYmFjazsKKwlwYWNrZXQtPmNhbGxiYWNrX2RhdGEgPSBjYWxsYmFja19kYXRhOworCW1lbWNweSgodW5zaWduZWQgY2hhciAqKSBwYWNrZXQgKworCQkJc2l6ZW9mKHN0cnVjdCBpcHdfdHhfcGFja2V0KSwgZGF0YSwgbGVuZ3RoKTsKKworCXNlbmRfcGFja2V0KGh3LCBQUklPX0RBVEEsIHBhY2tldCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2NvbnRyb2xfbGluZShzdHJ1Y3QgaXB3X2hhcmR3YXJlICpodywgaW50IHByaW8sCisJCQkgICB1bnNpZ25lZCBpbnQgY2hhbm5lbF9pZHgsIGludCBsaW5lLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IGlwd19jb250cm9sX3BhY2tldCAqcGFja2V0OworCWludCBwcm90b2NvbGlkID0gVExfUFJPVE9DT0xJRF9DT01fQ1RSTDsKKworCWlmIChwcmlvID09IFBSSU9fU0VUVVApCisJCXByb3RvY29saWQgPSBUTF9QUk9UT0NPTElEX1NFVFVQOworCisJcGFja2V0ID0gYWxsb2NfY3RybF9wYWNrZXQoc2l6ZW9mKHN0cnVjdCBpcHdfY29udHJvbF9wYWNrZXQpLAorCQkJKHVuc2lnbmVkIGNoYXIpIChjaGFubmVsX2lkeCArIDEpLAorCQkJcHJvdG9jb2xpZCwgbGluZSk7CisJaWYgKCFwYWNrZXQpCisJCXJldHVybiAtRU5PTUVNOworCXBhY2tldC0+aGVhZGVyLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaXB3X2NvbnRyb2xfcGFja2V0X2JvZHkpOworCXBhY2tldC0+Ym9keS52YWx1ZSA9ICh1bnNpZ25lZCBjaGFyKSAoc3RhdGUgPT0gMCA/IDAgOiAxKTsKKwlzZW5kX3BhY2tldChodywgcHJpbywgJnBhY2tldC0+aGVhZGVyKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHNldF9EVFIoc3RydWN0IGlwd19oYXJkd2FyZSAqaHcsIGludCBwcmlvcml0eSwKKwkJICAgdW5zaWduZWQgaW50IGNoYW5uZWxfaWR4LCBpbnQgc3RhdGUpCit7CisJaWYgKHN0YXRlICE9IDApCisJCWh3LT5jb250cm9sX2xpbmVzW2NoYW5uZWxfaWR4XSB8PSBJUFdfQ09OVFJPTF9MSU5FX0RUUjsKKwllbHNlCisJCWh3LT5jb250cm9sX2xpbmVzW2NoYW5uZWxfaWR4XSAmPSB+SVBXX0NPTlRST0xfTElORV9EVFI7CisKKwlyZXR1cm4gc2V0X2NvbnRyb2xfbGluZShodywgcHJpb3JpdHksIGNoYW5uZWxfaWR4LCBDT01DVFJMX0RUUiwgc3RhdGUpOworfQorCitzdGF0aWMgaW50IHNldF9SVFMoc3RydWN0IGlwd19oYXJkd2FyZSAqaHcsIGludCBwcmlvcml0eSwKKwkJICAgdW5zaWduZWQgaW50IGNoYW5uZWxfaWR4LCBpbnQgc3RhdGUpCit7CisJaWYgKHN0YXRlICE9IDApCisJCWh3LT5jb250cm9sX2xpbmVzW2NoYW5uZWxfaWR4XSB8PSBJUFdfQ09OVFJPTF9MSU5FX1JUUzsKKwllbHNlCisJCWh3LT5jb250cm9sX2xpbmVzW2NoYW5uZWxfaWR4XSAmPSB+SVBXX0NPTlRST0xfTElORV9SVFM7CisKKwlyZXR1cm4gc2V0X2NvbnRyb2xfbGluZShodywgcHJpb3JpdHksIGNoYW5uZWxfaWR4LCBDT01DVFJMX1JUUywgc3RhdGUpOworfQorCitpbnQgaXB3aXJlbGVzc19zZXRfRFRSKHN0cnVjdCBpcHdfaGFyZHdhcmUgKmh3LCB1bnNpZ25lZCBpbnQgY2hhbm5lbF9pZHgsCisJCSAgICAgICBpbnQgc3RhdGUpCit7CisJcmV0dXJuIHNldF9EVFIoaHcsIFBSSU9fQ1RSTCwgY2hhbm5lbF9pZHgsIHN0YXRlKTsKK30KKworaW50IGlwd2lyZWxlc3Nfc2V0X1JUUyhzdHJ1Y3QgaXB3X2hhcmR3YXJlICpodywgdW5zaWduZWQgaW50IGNoYW5uZWxfaWR4LAorCQkgICAgICAgaW50IHN0YXRlKQoreworCXJldHVybiBzZXRfUlRTKGh3LCBQUklPX0NUUkwsIGNoYW5uZWxfaWR4LCBzdGF0ZSk7Cit9CisKK3N0cnVjdCBpcHdfc2V0dXBfZ2V0X3ZlcnNpb25fcXVlcnlfcGFja2V0IHsKKwlzdHJ1Y3QgaXB3X3R4X3BhY2tldCBoZWFkZXI7CisJc3RydWN0IHRsX3NldHVwX2dldF92ZXJzaW9uX3FyeSBib2R5OworfTsKKworc3RydWN0IGlwd19zZXR1cF9jb25maWdfcGFja2V0IHsKKwlzdHJ1Y3QgaXB3X3R4X3BhY2tldCBoZWFkZXI7CisJc3RydWN0IHRsX3NldHVwX2NvbmZpZ19tc2cgYm9keTsKK307CisKK3N0cnVjdCBpcHdfc2V0dXBfY29uZmlnX2RvbmVfcGFja2V0IHsKKwlzdHJ1Y3QgaXB3X3R4X3BhY2tldCBoZWFkZXI7CisJc3RydWN0IHRsX3NldHVwX2NvbmZpZ19kb25lX21zZyBib2R5OworfTsKKworc3RydWN0IGlwd19zZXR1cF9vcGVuX3BhY2tldCB7CisJc3RydWN0IGlwd190eF9wYWNrZXQgaGVhZGVyOworCXN0cnVjdCB0bF9zZXR1cF9vcGVuX21zZyBib2R5OworfTsKKworc3RydWN0IGlwd19zZXR1cF9pbmZvX3BhY2tldCB7CisJc3RydWN0IGlwd190eF9wYWNrZXQgaGVhZGVyOworCXN0cnVjdCB0bF9zZXR1cF9pbmZvX21zZyBib2R5OworfTsKKworc3RydWN0IGlwd19zZXR1cF9yZWJvb3RfbXNnX2FjayB7CisJc3RydWN0IGlwd190eF9wYWNrZXQgaGVhZGVyOworCXN0cnVjdCBUbFNldHVwUmVib290TXNnQWNrIGJvZHk7Cit9OworCisvKiBUaGlzIGhhbmRsZXMgdGhlIGFjdHVhbCBpbml0aWFsaXphdGlvbiBvZiB0aGUgY2FyZCAqLworc3RhdGljIHZvaWQgX19oYW5kbGVfc2V0dXBfZ2V0X3ZlcnNpb25fcnNwKHN0cnVjdCBpcHdfaGFyZHdhcmUgKmh3KQoreworCXN0cnVjdCBpcHdfc2V0dXBfY29uZmlnX3BhY2tldCAqY29uZmlnX3BhY2tldDsKKwlzdHJ1Y3QgaXB3X3NldHVwX2NvbmZpZ19kb25lX3BhY2tldCAqY29uZmlnX2RvbmVfcGFja2V0OworCXN0cnVjdCBpcHdfc2V0dXBfb3Blbl9wYWNrZXQgKm9wZW5fcGFja2V0OworCXN0cnVjdCBpcHdfc2V0dXBfaW5mb19wYWNrZXQgKmluZm9fcGFja2V0OworCWludCBwb3J0OworCXVuc2lnbmVkIGludCBjaGFubmVsX2lkeDsKKworCS8qIGdlbmVyYXRlIGNvbmZpZyBwYWNrZXQgKi8KKwlmb3IgKHBvcnQgPSAxOyBwb3J0IDw9IE5MX05VTV9PRl9BRERSRVNTRVM7IHBvcnQrKykgeworCQljb25maWdfcGFja2V0ID0gYWxsb2NfY3RybF9wYWNrZXQoCisJCQkJc2l6ZW9mKHN0cnVjdCBpcHdfc2V0dXBfY29uZmlnX3BhY2tldCksCisJCQkJQUREUl9TRVRVUF9QUk9ULAorCQkJCVRMX1BST1RPQ09MSURfU0VUVVAsCisJCQkJVExfU0VUVVBfU0lHTk9fQ09ORklHX01TRyk7CisJCWlmICghY29uZmlnX3BhY2tldCkKKwkJCWdvdG8gZXhpdF9ub21lbTsKKwkJY29uZmlnX3BhY2tldC0+aGVhZGVyLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgdGxfc2V0dXBfY29uZmlnX21zZyk7CisJCWNvbmZpZ19wYWNrZXQtPmJvZHkucG9ydF9ubyA9IHBvcnQ7CisJCWNvbmZpZ19wYWNrZXQtPmJvZHkucHJpb19kYXRhID0gUFJJT19EQVRBOworCQljb25maWdfcGFja2V0LT5ib2R5LnByaW9fY3RybCA9IFBSSU9fQ1RSTDsKKwkJc2VuZF9wYWNrZXQoaHcsIFBSSU9fU0VUVVAsICZjb25maWdfcGFja2V0LT5oZWFkZXIpOworCX0KKwljb25maWdfZG9uZV9wYWNrZXQgPSBhbGxvY19jdHJsX3BhY2tldCgKKwkJCXNpemVvZihzdHJ1Y3QgaXB3X3NldHVwX2NvbmZpZ19kb25lX3BhY2tldCksCisJCQlBRERSX1NFVFVQX1BST1QsCisJCQlUTF9QUk9UT0NPTElEX1NFVFVQLAorCQkJVExfU0VUVVBfU0lHTk9fQ09ORklHX0RPTkVfTVNHKTsKKwlpZiAoIWNvbmZpZ19kb25lX3BhY2tldCkKKwkJZ290byBleGl0X25vbWVtOworCWNvbmZpZ19kb25lX3BhY2tldC0+aGVhZGVyLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgdGxfc2V0dXBfY29uZmlnX2RvbmVfbXNnKTsKKwlzZW5kX3BhY2tldChodywgUFJJT19TRVRVUCwgJmNvbmZpZ19kb25lX3BhY2tldC0+aGVhZGVyKTsKKworCS8qIGdlbmVyYXRlIG9wZW4gcGFja2V0ICovCisJZm9yIChwb3J0ID0gMTsgcG9ydCA8PSBOTF9OVU1fT0ZfQUREUkVTU0VTOyBwb3J0KyspIHsKKwkJb3Blbl9wYWNrZXQgPSBhbGxvY19jdHJsX3BhY2tldCgKKwkJCQlzaXplb2Yoc3RydWN0IGlwd19zZXR1cF9vcGVuX3BhY2tldCksCisJCQkJQUREUl9TRVRVUF9QUk9ULAorCQkJCVRMX1BST1RPQ09MSURfU0VUVVAsCisJCQkJVExfU0VUVVBfU0lHTk9fT1BFTl9NU0cpOworCQlpZiAoIW9wZW5fcGFja2V0KQorCQkJZ290byBleGl0X25vbWVtOworCQlvcGVuX3BhY2tldC0+aGVhZGVyLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgdGxfc2V0dXBfb3Blbl9tc2cpOworCQlvcGVuX3BhY2tldC0+Ym9keS5wb3J0X25vID0gcG9ydDsKKwkJc2VuZF9wYWNrZXQoaHcsIFBSSU9fU0VUVVAsICZvcGVuX3BhY2tldC0+aGVhZGVyKTsKKwl9CisJZm9yIChjaGFubmVsX2lkeCA9IDA7CisJCQljaGFubmVsX2lkeCA8IE5MX05VTV9PRl9BRERSRVNTRVM7IGNoYW5uZWxfaWR4KyspIHsKKwkJaW50IHJldDsKKworCQlyZXQgPSBzZXRfRFRSKGh3LCBQUklPX1NFVFVQLCBjaGFubmVsX2lkeCwKKwkJCShody0+Y29udHJvbF9saW5lc1tjaGFubmVsX2lkeF0gJgorCQkJIElQV19DT05UUk9MX0xJTkVfRFRSKSAhPSAwKTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIElQV0lSRUxFU1NfUENDQVJEX05BTUUKKwkJCQkJIjogZXJyb3Igc2V0dGluZyBEVFIgKCVkKVxuIiwgcmV0KTsKKwkJCXJldHVybjsKKwkJfQorCisJCXNldF9SVFMoaHcsIFBSSU9fU0VUVVAsIGNoYW5uZWxfaWR4LAorCQkJKGh3LT5jb250cm9sX2xpbmVzIFtjaGFubmVsX2lkeF0gJgorCQkJIElQV19DT05UUk9MX0xJTkVfUlRTKSAhPSAwKTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIElQV0lSRUxFU1NfUENDQVJEX05BTUUKKwkJCQkJIjogZXJyb3Igc2V0dGluZyBSVFMgKCVkKVxuIiwgcmV0KTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwkvKgorCSAqIEZvciBORElTIHdlIGFzc3VtZSB0aGF0IHdlIGFyZSB1c2luZyBzeW5jIFBQUCBmcmFtZXMsIGZvciBDT00gYXN5bmMuCisJICogVGhpcyBkcml2ZXIgdXNlcyBORElTIG1vZGUgdG9vLiBXZSBkb24ndCBib3RoZXIgd2l0aCB0cmFuc2xhdGlvbgorCSAqIGZyb20gYXN5bmMgLT4gc3luYyBQUFAuCisJICovCisJaW5mb19wYWNrZXQgPSBhbGxvY19jdHJsX3BhY2tldChzaXplb2Yoc3RydWN0IGlwd19zZXR1cF9pbmZvX3BhY2tldCksCisJCQlBRERSX1NFVFVQX1BST1QsCisJCQlUTF9QUk9UT0NPTElEX1NFVFVQLAorCQkJVExfU0VUVVBfU0lHTk9fSU5GT19NU0cpOworCWlmICghaW5mb19wYWNrZXQpCisJCWdvdG8gZXhpdF9ub21lbTsKKwlpbmZvX3BhY2tldC0+aGVhZGVyLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgdGxfc2V0dXBfaW5mb19tc2cpOworCWluZm9fcGFja2V0LT5ib2R5LmRyaXZlcl90eXBlID0gTkRJU1dBTl9EUklWRVI7CisJaW5mb19wYWNrZXQtPmJvZHkubWFqb3JfdmVyc2lvbiA9IE5ESVNXQU5fRFJJVkVSX01BSk9SX1ZFUlNJT047CisJaW5mb19wYWNrZXQtPmJvZHkubWlub3JfdmVyc2lvbiA9IE5ESVNXQU5fRFJJVkVSX01JTk9SX1ZFUlNJT047CisJc2VuZF9wYWNrZXQoaHcsIFBSSU9fU0VUVVAsICZpbmZvX3BhY2tldC0+aGVhZGVyKTsKKworCS8qIEluaXRpYWxpemF0aW9uIGlzIG5vdyBjb21wbGV0ZSwgc28gd2UgY2xlYXIgdGhlICd0b19zZXR1cCcgZmxhZyAqLworCWh3LT50b19zZXR1cCA9IDA7CisKKwlyZXR1cm47CisKK2V4aXRfbm9tZW06CisJcHJpbnRrKEtFUk5fRVJSIElQV0lSRUxFU1NfUENDQVJEX05BTUUKKwkJCSI6IG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jIGNvbnRyb2wgcGFja2V0XG4iKTsKKwlody0+dG9fc2V0dXAgPSAtMTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX3NldHVwX2dldF92ZXJzaW9uX3JzcChzdHJ1Y3QgaXB3X2hhcmR3YXJlICpodywKKwkJdW5zaWduZWQgY2hhciB2ZXJzX25vKQoreworCWRlbF90aW1lcigmaHctPnNldHVwX3RpbWVyKTsKKwlody0+aW5pdGlhbGl6aW5nID0gMDsKKwlwcmludGsoS0VSTl9JTkZPIElQV0lSRUxFU1NfUENDQVJEX05BTUUgIjogY2FyZCBpcyByZWFkeS5cbiIpOworCisJaWYgKHZlcnNfbm8gPT0gVExfU0VUVVBfVkVSU0lPTikKKwkJX19oYW5kbGVfc2V0dXBfZ2V0X3ZlcnNpb25fcnNwKGh3KTsKKwllbHNlCisJCXByaW50ayhLRVJOX0VSUgorCQkJCUlQV0lSRUxFU1NfUENDQVJEX05BTUUKKwkJCQkiOiBpbnZhbGlkIGhhcmR3YXJlIHZlcnNpb24gbm8gJXVcbiIsCisJCQkJKHVuc2lnbmVkIGludCkgdmVyc19ubyk7Cit9CisKK3N0YXRpYyB2b2lkIGlwd19zZW5kX3NldHVwX3BhY2tldChzdHJ1Y3QgaXB3X2hhcmR3YXJlICpodykKK3sKKwlzdHJ1Y3QgaXB3X3NldHVwX2dldF92ZXJzaW9uX3F1ZXJ5X3BhY2tldCAqdmVyX3BhY2tldDsKKworCXZlcl9wYWNrZXQgPSBhbGxvY19jdHJsX3BhY2tldCgKKwkJCXNpemVvZihzdHJ1Y3QgaXB3X3NldHVwX2dldF92ZXJzaW9uX3F1ZXJ5X3BhY2tldCksCisJCQlBRERSX1NFVFVQX1BST1QsIFRMX1BST1RPQ09MSURfU0VUVVAsCisJCQlUTF9TRVRVUF9TSUdOT19HRVRfVkVSU0lPTl9RUlkpOworCXZlcl9wYWNrZXQtPmhlYWRlci5sZW5ndGggPSBzaXplb2Yoc3RydWN0IHRsX3NldHVwX2dldF92ZXJzaW9uX3FyeSk7CisKKwkvKgorCSAqIFJlc3BvbnNlIGlzIGhhbmRsZWQgaW4gaGFuZGxlX3JlY2VpdmVkX1NFVFVQX3BhY2tldAorCSAqLworCXNlbmRfcGFja2V0KGh3LCBQUklPX1NFVFVQLCAmdmVyX3BhY2tldC0+aGVhZGVyKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX3JlY2VpdmVkX1NFVFVQX3BhY2tldChzdHJ1Y3QgaXB3X2hhcmR3YXJlICpodywKKwkJCQkJIHVuc2lnbmVkIGludCBhZGRyZXNzLAorCQkJCQkgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbiwKKwkJCQkJIGludCBpc19sYXN0KQoreworCXVuaW9uIGlwd19zZXR1cF9yeF9tc2cgKnJ4X21zZyA9ICh1bmlvbiBpcHdfc2V0dXBfcnhfbXNnICopIGRhdGE7CisKKwlpZiAoYWRkcmVzcyAhPSBBRERSX1NFVFVQX1BST1QpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBJUFdJUkVMRVNTX1BDQ0FSRF9OQU1FCisJCSAgICAgICAiOiBzZXR1cCBwYWNrZXQgaGFzIGJhZCBhZGRyZXNzICVkXG4iLCBhZGRyZXNzKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAocnhfbXNnLT5zaWdfbm8pIHsKKwljYXNlIFRMX1NFVFVQX1NJR05PX0dFVF9WRVJTSU9OX1JTUDoKKwkJaWYgKGh3LT50b19zZXR1cCkKKwkJCWhhbmRsZV9zZXR1cF9nZXRfdmVyc2lvbl9yc3AoaHcsCisJCQkJCXJ4X21zZy0+dmVyc2lvbl9yc3BfbXNnLnZlcnNpb24pOworCQlicmVhazsKKworCWNhc2UgVExfU0VUVVBfU0lHTk9fT1BFTl9NU0c6CisJCWlmIChpcHdpcmVsZXNzX2RlYnVnKSB7CisJCQl1bnNpZ25lZCBpbnQgY2hhbm5lbF9pZHggPSByeF9tc2ctPm9wZW5fbXNnLnBvcnRfbm8gLSAxOworCisJCQlwcmludGsoS0VSTl9JTkZPIElQV0lSRUxFU1NfUENDQVJEX05BTUUKKwkJCSAgICAgICAiOiBPUEVOX01TRyBbY2hhbm5lbCAldV0gcmVwbHkgcmVjZWl2ZWRcbiIsCisJCQkgICAgICAgY2hhbm5lbF9pZHgpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBUTF9TRVRVUF9TSUdOT19JTkZPX01TR19BQ0s6CisJCWlmIChpcHdpcmVsZXNzX2RlYnVnKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgSVBXSVJFTEVTU19QQ0NBUkRfTkFNRQorCQkJICAgICAgICI6IGNhcmQgc3VjY2Vzc2Z1bGx5IGNvbmZpZ3VyZWQgYXMgTkRJU1dBTlxuIik7CisJCWJyZWFrOworCisJY2FzZSBUTF9TRVRVUF9TSUdOT19SRUJPT1RfTVNHOgorCQlpZiAoaHctPnRvX3NldHVwKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgSVBXSVJFTEVTU19QQ0NBUkRfTkFNRQorCQkJICAgICAgICI6IFNldHVwIG5vdCBjb21wbGV0ZWQgLSBpZ25vcmluZyByZWJvb3QgbXNnXG4iKTsKKwkJZWxzZSB7CisJCQlzdHJ1Y3QgaXB3X3NldHVwX3JlYm9vdF9tc2dfYWNrICpwYWNrZXQ7CisKKwkJCXByaW50ayhLRVJOX0RFQlVHIElQV0lSRUxFU1NfUENDQVJEX05BTUUKKwkJCSAgICAgICAiOiBBY2tub3dsZWRnaW5nIFJFQk9PVCBtZXNzYWdlXG4iKTsKKwkJCXBhY2tldCA9IGFsbG9jX2N0cmxfcGFja2V0KAorCQkJCQlzaXplb2Yoc3RydWN0IGlwd19zZXR1cF9yZWJvb3RfbXNnX2FjayksCisJCQkJCUFERFJfU0VUVVBfUFJPVCwgVExfUFJPVE9DT0xJRF9TRVRVUCwKKwkJCQkJVExfU0VUVVBfU0lHTk9fUkVCT09UX01TR19BQ0spOworCQkJcGFja2V0LT5oZWFkZXIubGVuZ3RoID0KKwkJCQlzaXplb2Yoc3RydWN0IFRsU2V0dXBSZWJvb3RNc2dBY2spOworCQkJc2VuZF9wYWNrZXQoaHcsIFBSSU9fU0VUVVAsICZwYWNrZXQtPmhlYWRlcik7CisJCQlpZiAoaHctPnJlYm9vdF9jYWxsYmFjaykKKwkJCQlody0+cmVib290X2NhbGxiYWNrKGh3LT5yZWJvb3RfY2FsbGJhY2tfZGF0YSk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPIElQV0lSRUxFU1NfUENDQVJEX05BTUUKKwkJICAgICAgICI6IHVua25vd24gc2V0dXAgbWVzc2FnZSAldSByZWNlaXZlZFxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBpbnQpIHJ4X21zZy0+c2lnX25vKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRvX2Nsb3NlX2hhcmR3YXJlKHN0cnVjdCBpcHdfaGFyZHdhcmUgKmh3KQoreworCXVuc2lnbmVkIGludCBpcnFuOworCisJaWYgKGh3LT5od192ZXJzaW9uID09IEhXX1ZFUlNJT05fMSkgeworCQkvKiBEaXNhYmxlIFRYIGFuZCBSWCBpbnRlcnJ1cHRzLiAqLworCQlvdXR3KDAsIGh3LT5iYXNlX3BvcnQgKyBJT0lFUik7CisKKwkJLyogQWNrbm93bGVkZ2UgYW55IG91dHN0YW5kaW5nIGludGVycnVwdCByZXF1ZXN0cyAqLworCQlpcnFuID0gaW53KGh3LT5iYXNlX3BvcnQgKyBJT0lSKTsKKwkJaWYgKGlycW4gJiBJUl9UWElOVFIpCisJCQlvdXR3KElSX1RYSU5UUiwgaHctPmJhc2VfcG9ydCArIElPSVIpOworCQlpZiAoaXJxbiAmIElSX1JYSU5UUikKKwkJCW91dHcoSVJfUlhJTlRSLCBody0+YmFzZV9wb3J0ICsgSU9JUik7CisKKwkJc3luY2hyb25pemVfaXJxKGh3LT5pcnEpOworCX0KK30KKworc3RydWN0IGlwd19oYXJkd2FyZSAqaXB3aXJlbGVzc19oYXJkd2FyZV9jcmVhdGUodm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaXB3X2hhcmR3YXJlICpodyA9CisJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpcHdfaGFyZHdhcmUpLCBHRlBfS0VSTkVMKTsKKworCWlmICghaHcpCisJCXJldHVybiBOVUxMOworCisJaHctPmlycSA9IC0xOworCWh3LT5pbml0aWFsaXppbmcgPSAxOworCWh3LT50eF9yZWFkeSA9IDE7CisJaHctPnJ4X2J5dGVzX3F1ZXVlZCA9IDA7CisJaHctPnJ4X3Bvb2xfc2l6ZSA9IDA7CisJaHctPmxhc3RfbWVtdHhfc2VyaWFsID0gKHVuc2lnbmVkIHNob3J0KSAweGZmZmY7CisJZm9yIChpID0gMDsgaSA8IE5MX05VTV9PRl9QUklPUklUSUVTOyBpKyspCisJCUlOSVRfTElTVF9IRUFEKCZody0+dHhfcXVldWVbaV0pOworCisJSU5JVF9MSVNUX0hFQUQoJmh3LT5yeF9xdWV1ZSk7CisJSU5JVF9MSVNUX0hFQUQoJmh3LT5yeF9wb29sKTsKKwlzcGluX2xvY2tfaW5pdCgmaHctPnNwaW5sb2NrKTsKKwl0YXNrbGV0X2luaXQoJmh3LT50YXNrbGV0LCBpcHdpcmVsZXNzX2RvX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKSBodyk7CisJSU5JVF9XT1JLKCZody0+d29ya19yeCwgaXB3X3JlY2VpdmVfZGF0YV93b3JrKTsKKwlzZXR1cF90aW1lcigmaHctPnNldHVwX3RpbWVyLCBpcHdpcmVsZXNzX3NldHVwX3RpbWVyLAorCQkJKHVuc2lnbmVkIGxvbmcpIGh3KTsKKworCXJldHVybiBodzsKK30KKwordm9pZCBpcHdpcmVsZXNzX2luaXRfaGFyZHdhcmVfdjEoc3RydWN0IGlwd19oYXJkd2FyZSAqaHcsCisJCXVuc2lnbmVkIGludCBiYXNlX3BvcnQsCisJCXZvaWQgX19pb21lbSAqYXR0cl9tZW1vcnksCisJCXZvaWQgX19pb21lbSAqY29tbW9uX21lbW9yeSwKKwkJaW50IGlzX3YyX2NhcmQsCisJCXZvaWQgKCpyZWJvb3RfY2FsbGJhY2spICh2b2lkICpkYXRhKSwKKwkJdm9pZCAqcmVib290X2NhbGxiYWNrX2RhdGEpCit7CisJaWYgKGh3LT5yZW1vdmVkKSB7CisJCWh3LT5yZW1vdmVkID0gMDsKKwkJZW5hYmxlX2lycShody0+aXJxKTsKKwl9CisJaHctPmJhc2VfcG9ydCA9IGJhc2VfcG9ydDsKKwlody0+aHdfdmVyc2lvbiA9IGlzX3YyX2NhcmQgPyBIV19WRVJTSU9OXzIgOiBIV19WRVJTSU9OXzE7CisJaHctPmxsX210dSA9IGh3LT5od192ZXJzaW9uID09IEhXX1ZFUlNJT05fMSA/IExMX01UVV9WMSA6IExMX01UVV9WMjsKKwlody0+bWVtcmVnc19DQ1IgPSAoc3RydWN0IE1FTUNDUiBfX2lvbWVtICopCisJCQkoKHVuc2lnbmVkIHNob3J0IF9faW9tZW0gKikgYXR0cl9tZW1vcnkgKyAweDIwMCk7CisJaHctPm1lbW9yeV9pbmZvX3JlZ3MgPSAoc3RydWN0IE1FTUlORlJFRyBfX2lvbWVtICopIGNvbW1vbl9tZW1vcnk7CisJaHctPm1lbXJlZ190eCA9ICZody0+bWVtb3J5X2luZm9fcmVncy0+bWVtcmVnX3R4X25ldzsKKwlody0+cmVib290X2NhbGxiYWNrID0gcmVib290X2NhbGxiYWNrOworCWh3LT5yZWJvb3RfY2FsbGJhY2tfZGF0YSA9IHJlYm9vdF9jYWxsYmFja19kYXRhOworfQorCit2b2lkIGlwd2lyZWxlc3NfaW5pdF9oYXJkd2FyZV92Ml92MyhzdHJ1Y3QgaXB3X2hhcmR3YXJlICpodykKK3sKKwlody0+aW5pdGlhbGl6aW5nID0gMTsKKwlody0+aW5pdF9sb29wcyA9IDA7CisJcHJpbnRrKEtFUk5fSU5GTyBJUFdJUkVMRVNTX1BDQ0FSRF9OQU1FCisJICAgICAgICI6IHdhaXRpbmcgZm9yIGNhcmQgdG8gc3RhcnQgdXAuLi5cbiIpOworCWlwd2lyZWxlc3Nfc2V0dXBfdGltZXIoKHVuc2lnbmVkIGxvbmcpIGh3KTsKK30KKworc3RhdGljIHZvaWQgaXB3aXJlbGVzc19zZXR1cF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGlwd19oYXJkd2FyZSAqaHcgPSAoc3RydWN0IGlwd19oYXJkd2FyZSAqKSBkYXRhOworCisJaHctPmluaXRfbG9vcHMrKzsKKworCWlmIChody0+aW5pdF9sb29wcyA9PSBUTF9TRVRVUF9NQVhfVkVSU0lPTl9RUlkgJiYKKwkJCWh3LT5od192ZXJzaW9uID09IEhXX1ZFUlNJT05fMiAmJgorCQkJaHctPm1lbXJlZ190eCA9PSAmaHctPm1lbW9yeV9pbmZvX3JlZ3MtPm1lbXJlZ190eF9uZXcpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBJUFdJUkVMRVNTX1BDQ0FSRF9OQU1FCisJCQkJIjogZmFpbGVkIHRvIHN0YXJ0dXAgdXNpbmcgVFgyLCB0cnlpbmcgVFhcbiIpOworCisJCWh3LT5tZW1yZWdfdHggPSAmaHctPm1lbW9yeV9pbmZvX3JlZ3MtPm1lbXJlZ190eF9vbGQ7CisJCWh3LT5pbml0X2xvb3BzID0gMDsKKwl9CisJLyogR2l2ZSB1cCBhZnRlciBhIGNlcnRhaW4gbnVtYmVyIG9mIHJldHJpZXMgKi8KKwlpZiAoaHctPmluaXRfbG9vcHMgPT0gVExfU0VUVVBfTUFYX1ZFUlNJT05fUVJZKSB7CisJCXByaW50ayhLRVJOX0lORk8gSVBXSVJFTEVTU19QQ0NBUkRfTkFNRQorCQkgICAgICAgIjogY2FyZCBmYWlsZWQgdG8gc3RhcnQgdXAhXG4iKTsKKwkJaHctPmluaXRpYWxpemluZyA9IDA7CisJfSBlbHNlIHsKKwkJLyogRG8gbm90IGF0dGVtcHQgdG8gd3JpdGUgdG8gdGhlIGJvYXJkIGlmIGl0IGlzIG5vdCBwcmVzZW50LiAqLworCQlpZiAoaXNfY2FyZF9wcmVzZW50KGh3KSkgeworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5zcGlubG9jaywgZmxhZ3MpOworCQkJaHctPnRvX3NldHVwID0gMTsKKwkJCWh3LT50eF9yZWFkeSA9IDE7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJmh3LT50YXNrbGV0KTsKKwkJfQorCisJCW1vZF90aW1lcigmaHctPnNldHVwX3RpbWVyLAorCQkJamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoVExfU0VUVVBfVkVSU0lPTl9RUllfVE1PKSk7CisJfQorfQorCisvKgorICogU3RvcCBhbnkgaW50ZXJydXB0cyBmcm9tIGV4ZWN1dGluZyBzbyB0aGF0LCBvbmNlIHRoaXMgZnVuY3Rpb24gcmV0dXJucywKKyAqIG90aGVyIGxheWVycyBvZiB0aGUgZHJpdmVyIGNhbiBiZSBzdXJlIHRoZXkgd29uJ3QgZ2V0IGFueSBtb3JlIGNhbGxiYWNrcy4KKyAqIFRodXMgbXVzdCBiZSBjYWxsZWQgb24gYSBwcm9wZXIgcHJvY2VzcyBjb250ZXh0LgorICovCit2b2lkIGlwd2lyZWxlc3Nfc3RvcF9pbnRlcnJ1cHRzKHN0cnVjdCBpcHdfaGFyZHdhcmUgKmh3KQoreworCWlmICghaHctPnNodXR0aW5nX2Rvd24pIHsKKwkJLyogVGVsbCBldmVyeW9uZSB3ZSBhcmUgZ29pbmcgZG93bi4gKi8KKwkJaHctPnNodXR0aW5nX2Rvd24gPSAxOworCQlkZWxfdGltZXIoJmh3LT5zZXR1cF90aW1lcik7CisKKwkJLyogUHJldmVudCB0aGUgaGFyZHdhcmUgZnJvbSBzZW5kaW5nIGFueSBtb3JlIGludGVycnVwdHMgKi8KKwkJZG9fY2xvc2VfaGFyZHdhcmUoaHcpOworCX0KK30KKwordm9pZCBpcHdpcmVsZXNzX2hhcmR3YXJlX2ZyZWUoc3RydWN0IGlwd19oYXJkd2FyZSAqaHcpCit7CisJaW50IGk7CisJc3RydWN0IGlwd19yeF9wYWNrZXQgKnJwLCAqcnE7CisJc3RydWN0IGlwd190eF9wYWNrZXQgKnRwLCAqdHE7CisKKwlpcHdpcmVsZXNzX3N0b3BfaW50ZXJydXB0cyhodyk7CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJZm9yIChpID0gMDsgaSA8IE5MX05VTV9PRl9BRERSRVNTRVM7IGkrKykKKwkJaWYgKGh3LT5wYWNrZXRfYXNzZW1ibGVyW2ldICE9IE5VTEwpCisJCQlrZnJlZShody0+cGFja2V0X2Fzc2VtYmxlcltpXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTkxfTlVNX09GX1BSSU9SSVRJRVM7IGkrKykKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRwLCB0cSwgJmh3LT50eF9xdWV1ZVtpXSwgcXVldWUpIHsKKwkJCWxpc3RfZGVsKCZ0cC0+cXVldWUpOworCQkJa2ZyZWUodHApOworCQl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocnAsIHJxLCAmaHctPnJ4X3F1ZXVlLCBxdWV1ZSkgeworCQlsaXN0X2RlbCgmcnAtPnF1ZXVlKTsKKwkJa2ZyZWUocnApOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShycCwgcnEsICZody0+cnhfcG9vbCwgcXVldWUpIHsKKwkJbGlzdF9kZWwoJnJwLT5xdWV1ZSk7CisJCWtmcmVlKHJwKTsKKwl9CisJa2ZyZWUoaHcpOworfQorCisvKgorICogQXNzb2NpYXRlIHRoZSBzcGVjaWZpZWQgbmV0d29yayB3aXRoIHRoaXMgaGFyZHdhcmUsIHNvIGl0IHdpbGwgcmVjZWl2ZSBldmVudHMKKyAqIGZyb20gaXQuCisgKi8KK3ZvaWQgaXB3aXJlbGVzc19hc3NvY2lhdGVfbmV0d29yayhzdHJ1Y3QgaXB3X2hhcmR3YXJlICpodywKKwkJCQkgIHN0cnVjdCBpcHdfbmV0d29yayAqbmV0d29yaykKK3sKKwlody0+bmV0d29yayA9IG5ldHdvcms7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcGNtY2lhL2lwd2lyZWxlc3MvaGFyZHdhcmUuaCBiL2RyaXZlcnMvY2hhci9wY21jaWEvaXB3aXJlbGVzcy9oYXJkd2FyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MzE5MGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL2lwd2lyZWxlc3MvaGFyZHdhcmUuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogSVBXaXJlbGVzcyAzRyBQQ01DSUEgTmV0d29yayBEcml2ZXIKKyAqCisgKiBPcmlnaW5hbCBjb2RlCisgKiAgIGJ5IFN0ZXBoZW4gQmxhY2toZWF0aCA8c3RlcGhlbkBibGFja3NhcHBoaXJlLmNvbT4sCisgKiAgICAgIEJlbiBNYXJ0ZWwgPGJlbm1Ac3ltbWV0cmljLmNvLm56PgorICoKKyAqIENvcHlyaWdodGVkIGFzIGZvbGxvd3M6CisgKiAgIENvcHlyaWdodCAoQykgMjAwNCBieSBTeW1tZXRyaWMgU3lzdGVtcyBMdGQgKE5aKQorICoKKyAqIFZhcmlvdXMgZHJpdmVyIGNoYW5nZXMgYW5kIHJld3JpdGVzLCBwb3J0IHRvIG5ldyBrZXJuZWxzCisgKiAgIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IEppcmkgS29zaW5hCisgKgorICogTWlzYyBjb2RlIGNsZWFudXBzIGFuZCB1cGRhdGVzCisgKiAgIENvcHlyaWdodCAoQykgMjAwNyBEYXZpZCBTdGVyYmEKKyAqLworCisjaWZuZGVmIF9JUFdJUkVMRVNTX0NTX0hBUkRXQVJFX0hfCisjZGVmaW5lIF9JUFdJUkVMRVNTX0NTX0hBUkRXQVJFX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNkZWZpbmUgSVBXX0NPTlRST0xfTElORV9DVFMgMHgwMDAxCisjZGVmaW5lIElQV19DT05UUk9MX0xJTkVfRENEIDB4MDAwMgorI2RlZmluZSBJUFdfQ09OVFJPTF9MSU5FX0RTUiAweDAwMDQKKyNkZWZpbmUgSVBXX0NPTlRST0xfTElORV9SSSAgMHgwMDA4CisjZGVmaW5lIElQV19DT05UUk9MX0xJTkVfRFRSIDB4MDAxMAorI2RlZmluZSBJUFdfQ09OVFJPTF9MSU5FX1JUUyAweDAwMjAKKworc3RydWN0IGlwd19oYXJkd2FyZTsKK3N0cnVjdCBpcHdfbmV0d29yazsKKworc3RydWN0IGlwd19oYXJkd2FyZSAqaXB3aXJlbGVzc19oYXJkd2FyZV9jcmVhdGUodm9pZCk7Cit2b2lkIGlwd2lyZWxlc3NfaGFyZHdhcmVfZnJlZShzdHJ1Y3QgaXB3X2hhcmR3YXJlICpodyk7CitpcnFyZXR1cm5fdCBpcHdpcmVsZXNzX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2ludCBpcHdpcmVsZXNzX3NldF9EVFIoc3RydWN0IGlwd19oYXJkd2FyZSAqaHcsIHVuc2lnbmVkIGludCBjaGFubmVsX2lkeCwKKwkJaW50IHN0YXRlKTsKK2ludCBpcHdpcmVsZXNzX3NldF9SVFMoc3RydWN0IGlwd19oYXJkd2FyZSAqaHcsIHVuc2lnbmVkIGludCBjaGFubmVsX2lkeCwKKwkJaW50IHN0YXRlKTsKK2ludCBpcHdpcmVsZXNzX3NlbmRfcGFja2V0KHN0cnVjdCBpcHdfaGFyZHdhcmUgKmh3LAorCQkJICAgIHVuc2lnbmVkIGludCBjaGFubmVsX2lkeCwKKwkJCSAgICB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJICAgIHVuc2lnbmVkIGludCBsZW5ndGgsCisJCQkgICAgdm9pZCAoKnBhY2tldF9zZW50X2NhbGxiYWNrKSAodm9pZCAqY2IsCisJCQkJCQkJICB1bnNpZ25lZCBpbnQgbGVuZ3RoKSwKKwkJCSAgICB2b2lkICpzZW50X2NiX2RhdGEpOwordm9pZCBpcHdpcmVsZXNzX2Fzc29jaWF0ZV9uZXR3b3JrKHN0cnVjdCBpcHdfaGFyZHdhcmUgKmh3LAorCQlzdHJ1Y3QgaXB3X25ldHdvcmsgKm5ldCk7Cit2b2lkIGlwd2lyZWxlc3Nfc3RvcF9pbnRlcnJ1cHRzKHN0cnVjdCBpcHdfaGFyZHdhcmUgKmh3KTsKK3ZvaWQgaXB3aXJlbGVzc19pbml0X2hhcmR3YXJlX3YxKHN0cnVjdCBpcHdfaGFyZHdhcmUgKmh3LAorCQkJCSB1bnNpZ25lZCBpbnQgYmFzZV9wb3J0LAorCQkJCSB2b2lkIF9faW9tZW0gKmF0dHJfbWVtb3J5LAorCQkJCSB2b2lkIF9faW9tZW0gKmNvbW1vbl9tZW1vcnksCisJCQkJIGludCBpc192Ml9jYXJkLAorCQkJCSB2b2lkICgqcmVib290X2NiKSAodm9pZCAqZGF0YSksCisJCQkJIHZvaWQgKnJlYm9vdF9jYl9kYXRhKTsKK3ZvaWQgaXB3aXJlbGVzc19pbml0X2hhcmR3YXJlX3YyX3YzKHN0cnVjdCBpcHdfaGFyZHdhcmUgKmh3KTsKK3ZvaWQgaXB3aXJlbGVzc19zbGVlcCh1bnNpZ25lZCBpbnQgdGVudGhzKTsKK2ludCBpcHdpcmVsZXNzX2R1bXBfaGFyZHdhcmVfc3RhdGUoY2hhciAqcCwgc2l6ZV90IGxpbWl0LAorCQkJCSAgIHN0cnVjdCBpcHdfaGFyZHdhcmUgKmh3KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcGNtY2lhL2lwd2lyZWxlc3MvbWFpbi5jIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9pcHdpcmVsZXNzL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGM3Zjg0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9pcHdpcmVsZXNzL21haW4uYwpAQCAtMCwwICsxLDUwMSBAQAorLyoKKyAqIElQV2lyZWxlc3MgM0cgUENNQ0lBIE5ldHdvcmsgRHJpdmVyCisgKgorICogT3JpZ2luYWwgY29kZQorICogICBieSBTdGVwaGVuIEJsYWNraGVhdGggPHN0ZXBoZW5AYmxhY2tzYXBwaGlyZS5jb20+LAorICogICAgICBCZW4gTWFydGVsIDxiZW5tQHN5bW1ldHJpYy5jby5uej4KKyAqCisgKiBDb3B5cmlnaHRlZCBhcyBmb2xsb3dzOgorICogICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgU3ltbWV0cmljIFN5c3RlbXMgTHRkIChOWikKKyAqCisgKiBWYXJpb3VzIGRyaXZlciBjaGFuZ2VzIGFuZCByZXdyaXRlcywgcG9ydCB0byBuZXcga2VybmVscworICogICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBKaXJpIEtvc2luYQorICoKKyAqIE1pc2MgY29kZSBjbGVhbnVwcyBhbmQgdXBkYXRlcworICogICBDb3B5cmlnaHQgKEMpIDIwMDcgRGF2aWQgU3RlcmJhCisgKi8KKworI2luY2x1ZGUgImhhcmR3YXJlLmgiCisjaW5jbHVkZSAibmV0d29yay5oIgorI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJ0dHkuaCIKKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KKyNpbmNsdWRlIDxwY21jaWEvZGV2aWNlX2lkLmg+CisjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBpcHdfaWRzW10gPSB7CisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMmYyLCAweDAxMDApLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDJmMiwgMHgwMjAwKSwKKwlQQ01DSUFfREVWSUNFX05VTEwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgaXB3X2lkcyk7CisKK3N0YXRpYyB2b2lkIGlwd2lyZWxlc3NfZGV0YWNoKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKTsKKworLyoKKyAqIE1vZHVsZSBwYXJhbXMKKyAqLworLyogRGVidWcgbW9kZTogbW9yZSB2ZXJib3NlLCBwcmludCBzZW50L3JlY3YgYnl0ZXMgKi8KK2ludCBpcHdpcmVsZXNzX2RlYnVnOworaW50IGlwd2lyZWxlc3NfbG9vcGJhY2s7CitpbnQgaXB3aXJlbGVzc19vdXRfcXVldWUgPSAxOworCittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIGlwd2lyZWxlc3NfZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW1fbmFtZWQobG9vcGJhY2ssIGlwd2lyZWxlc3NfbG9vcGJhY2ssIGludCwgMCk7Cittb2R1bGVfcGFyYW1fbmFtZWQob3V0X3F1ZXVlLCBpcHdpcmVsZXNzX291dF9xdWV1ZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJzd2l0Y2ggb24gZGVidWcgbWVzc2FnZXMgWzBdIik7CitNT0RVTEVfUEFSTV9ERVNDKGxvb3BiYWNrLAorCQkiZGVidWc6IGVuYWJsZSByYXNfcmF3IGNoYW5uZWwgWzBdIik7CitNT0RVTEVfUEFSTV9ERVNDKG91dF9xdWV1ZSwgImRlYnVnOiBzZXQgc2l6ZSBvZiBvdXRnb2luZyBxdWV1ZSBbMV0iKTsKKworLyogRXhlY3V0ZXMgaW4gcHJvY2VzcyBjb250ZXh0LiAqLworc3RhdGljIHZvaWQgc2lnbmFsbGVkX3JlYm9vdF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19yZWJvb3QpCit7CisJc3RydWN0IGlwd19kZXYgKmlwdyA9IGNvbnRhaW5lcl9vZih3b3JrX3JlYm9vdCwgc3RydWN0IGlwd19kZXYsCisJCQl3b3JrX3JlYm9vdCk7CisJc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmsgPSBpcHctPmxpbms7CisJaW50IHJldCA9IHBjY2FyZF9yZXNldF9jYXJkKGxpbmstPnNvY2tldCk7CisKKwlpZiAocmV0ICE9IENTX1NVQ0NFU1MpCisJCWNzX2Vycm9yKGxpbmssIFJlc2V0Q2FyZCwgcmV0KTsKK30KKworc3RhdGljIHZvaWQgc2lnbmFsbGVkX3JlYm9vdF9jYWxsYmFjayh2b2lkICpjYWxsYmFja19kYXRhKQoreworCXN0cnVjdCBpcHdfZGV2ICppcHcgPSAoc3RydWN0IGlwd19kZXYgKikgY2FsbGJhY2tfZGF0YTsKKworCS8qIERlbGVnYXRlIHRvIHByb2Nlc3MgY29udGV4dC4gKi8KKwlzY2hlZHVsZV93b3JrKCZpcHctPndvcmtfcmVib290KTsKK30KKworc3RhdGljIGludCBjb25maWdfaXB3aXJlbGVzcyhzdHJ1Y3QgaXB3X2RldiAqaXB3KQoreworCXN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rID0gaXB3LT5saW5rOworCWludCByZXQ7CisJY29uZmlnX2luZm9fdCBjb25mOworCXR1cGxlX3QgdHVwbGU7CisJdW5zaWduZWQgc2hvcnQgYnVmWzY0XTsKKwljaXNwYXJzZV90IHBhcnNlOworCXVuc2lnbmVkIHNob3J0IGNvcl92YWx1ZTsKKwl3aW5fcmVxX3QgcmVxdWVzdF9hdHRyX21lbW9yeTsKKwl3aW5fcmVxX3QgcmVxdWVzdF9jb21tb25fbWVtb3J5OworCW1lbXJlcV90IG1lbXJlcV9hdHRyX21lbW9yeTsKKwltZW1yZXFfdCBtZW1yZXFfY29tbW9uX21lbW9yeTsKKworCWlwdy0+aXNfdjJfY2FyZCA9IDA7CisKKwl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKwl0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopIGJ1ZjsKKwl0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKKwl0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisKKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBSRVRVUk5fRklSU1RfVFVQTEU7CisKKwlyZXQgPSBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSk7CisKKwl3aGlsZSAocmV0ID09IDApIHsKKwkJcmV0ID0gcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSk7CisKKwkJaWYgKHJldCAhPSBDU19TVUNDRVNTKSB7CisJCQljc19lcnJvcihsaW5rLCBHZXRUdXBsZURhdGEsIHJldCk7CisJCQlnb3RvIGV4aXQwOworCQl9CisJCXJldCA9IHBjbWNpYV9nZXRfbmV4dF90dXBsZShsaW5rLCAmdHVwbGUpOworCX0KKworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOworCisJcmV0ID0gcGNtY2lhX2dldF9maXJzdF90dXBsZShsaW5rLCAmdHVwbGUpOworCisJaWYgKHJldCAhPSBDU19TVUNDRVNTKSB7CisJCWNzX2Vycm9yKGxpbmssIEdldEZpcnN0VHVwbGUsIHJldCk7CisJCWdvdG8gZXhpdDA7CisJfQorCisJcmV0ID0gcGNtY2lhX2dldF90dXBsZV9kYXRhKGxpbmssICZ0dXBsZSk7CisKKwlpZiAocmV0ICE9IENTX1NVQ0NFU1MpIHsKKwkJY3NfZXJyb3IobGluaywgR2V0VHVwbGVEYXRhLCByZXQpOworCQlnb3RvIGV4aXQwOworCX0KKworCXJldCA9IHBjbWNpYV9wYXJzZV90dXBsZShsaW5rLCAmdHVwbGUsICZwYXJzZSk7CisKKwlpZiAocmV0ICE9IENTX1NVQ0NFU1MpIHsKKwkJY3NfZXJyb3IobGluaywgUGFyc2VUdXBsZSwgcmV0KTsKKwkJZ290byBleGl0MDsKKwl9CisKKwlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworCWxpbmstPmlvLkJhc2VQb3J0MSA9IHBhcnNlLmNmdGFibGVfZW50cnkuaW8ud2luWzBdLmJhc2U7CisJbGluay0+aW8uTnVtUG9ydHMxID0gcGFyc2UuY2Z0YWJsZV9lbnRyeS5pby53aW5bMF0ubGVuOworCWxpbmstPmlvLklPQWRkckxpbmVzID0gMTY7CisKKwlsaW5rLT5pcnEuSVJRSW5mbzEgPSBwYXJzZS5jZnRhYmxlX2VudHJ5LmlycS5JUlFJbmZvMTsKKworCS8qIDB4NDAgY2F1c2VzIGl0IHRvIGdlbmVyYXRlIGxldmVsIG1vZGUgaW50ZXJydXB0cy4gKi8KKwkvKiAweDA0IGVuYWJsZXMgSVJFUSBwaW4uICovCisJY29yX3ZhbHVlID0gcGFyc2UuY2Z0YWJsZV9lbnRyeS5pbmRleCB8IDB4NDQ7CisJbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNvcl92YWx1ZTsKKworCS8qIElSUSBhbmQgSS9PIHNldHRpbmdzICovCisJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKKworCXJldCA9IHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUobGluaywgJnR1cGxlKTsKKworCWlmIChyZXQgIT0gQ1NfU1VDQ0VTUykgeworCQljc19lcnJvcihsaW5rLCBHZXRGaXJzdFR1cGxlLCByZXQpOworCQlnb3RvIGV4aXQwOworCX0KKworCXJldCA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShsaW5rLCAmdHVwbGUpOworCisJaWYgKHJldCAhPSBDU19TVUNDRVNTKSB7CisJCWNzX2Vycm9yKGxpbmssIEdldFR1cGxlRGF0YSwgcmV0KTsKKwkJZ290byBleGl0MDsKKwl9CisKKwlyZXQgPSBwY21jaWFfcGFyc2VfdHVwbGUobGluaywgJnR1cGxlLCAmcGFyc2UpOworCisJaWYgKHJldCAhPSBDU19TVUNDRVNTKSB7CisJCWNzX2Vycm9yKGxpbmssIEdldFR1cGxlRGF0YSwgcmV0KTsKKwkJZ290byBleGl0MDsKKwl9CisJbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROworCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOworCWxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKKwlsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKKworCWxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRFlOQU1JQ19TSEFSSU5HIHwgSVJRX0hBTkRMRV9QUkVTRU5UOworCWxpbmstPmlycS5IYW5kbGVyID0gaXB3aXJlbGVzc19pbnRlcnJ1cHQ7CisJbGluay0+aXJxLkluc3RhbmNlID0gaXB3LT5oYXJkd2FyZTsKKworCXJldCA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmssICZsaW5rLT5pbyk7CisKKwlpZiAocmV0ICE9IENTX1NVQ0NFU1MpIHsKKwkJY3NfZXJyb3IobGluaywgUmVxdWVzdElPLCByZXQpOworCQlnb3RvIGV4aXQwOworCX0KKworCS8qIG1lbW9yeSBzZXR0aW5ncyAqLworCisJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CisKKwlyZXQgPSBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGxpbmssICZ0dXBsZSk7CisKKwlpZiAocmV0ICE9IENTX1NVQ0NFU1MpIHsKKwkJY3NfZXJyb3IobGluaywgR2V0Rmlyc3RUdXBsZSwgcmV0KTsKKwkJZ290byBleGl0MTsKKwl9CisKKwlyZXQgPSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEobGluaywgJnR1cGxlKTsKKworCWlmIChyZXQgIT0gQ1NfU1VDQ0VTUykgeworCQljc19lcnJvcihsaW5rLCBHZXRUdXBsZURhdGEsIHJldCk7CisJCWdvdG8gZXhpdDE7CisJfQorCisJcmV0ID0gcGNtY2lhX3BhcnNlX3R1cGxlKGxpbmssICZ0dXBsZSwgJnBhcnNlKTsKKworCWlmIChyZXQgIT0gQ1NfU1VDQ0VTUykgeworCQljc19lcnJvcihsaW5rLCBQYXJzZVR1cGxlLCByZXQpOworCQlnb3RvIGV4aXQxOworCX0KKworCWlmIChwYXJzZS5jZnRhYmxlX2VudHJ5Lm1lbS5ud2luID4gMCkgeworCQlyZXF1ZXN0X2NvbW1vbl9tZW1vcnkuQXR0cmlidXRlcyA9CisJCQlXSU5fREFUQV9XSURUSF8xNiB8IFdJTl9NRU1PUllfVFlQRV9DTSB8IFdJTl9FTkFCTEU7CisJCXJlcXVlc3RfY29tbW9uX21lbW9yeS5CYXNlID0KKwkJCXBhcnNlLmNmdGFibGVfZW50cnkubWVtLndpblswXS5ob3N0X2FkZHI7CisJCXJlcXVlc3RfY29tbW9uX21lbW9yeS5TaXplID0gcGFyc2UuY2Z0YWJsZV9lbnRyeS5tZW0ud2luWzBdLmxlbjsKKwkJaWYgKHJlcXVlc3RfY29tbW9uX21lbW9yeS5TaXplIDwgMHgxMDAwKQorCQkJcmVxdWVzdF9jb21tb25fbWVtb3J5LlNpemUgPSAweDEwMDA7CisJCXJlcXVlc3RfY29tbW9uX21lbW9yeS5BY2Nlc3NTcGVlZCA9IDA7CisKKwkJcmV0ID0gcGNtY2lhX3JlcXVlc3Rfd2luZG93KCZsaW5rLCAmcmVxdWVzdF9jb21tb25fbWVtb3J5LAorCQkJCSZpcHctPmhhbmRsZV9jb21tb25fbWVtb3J5KTsKKworCQlpZiAocmV0ICE9IENTX1NVQ0NFU1MpIHsKKwkJCWNzX2Vycm9yKGxpbmssIFJlcXVlc3RXaW5kb3csIHJldCk7CisJCQlnb3RvIGV4aXQxOworCQl9CisKKwkJbWVtcmVxX2NvbW1vbl9tZW1vcnkuQ2FyZE9mZnNldCA9CisJCQlwYXJzZS5jZnRhYmxlX2VudHJ5Lm1lbS53aW5bMF0uY2FyZF9hZGRyOworCQltZW1yZXFfY29tbW9uX21lbW9yeS5QYWdlID0gMDsKKworCQlyZXQgPSBwY21jaWFfbWFwX21lbV9wYWdlKGlwdy0+aGFuZGxlX2NvbW1vbl9tZW1vcnksCisJCQkJJm1lbXJlcV9jb21tb25fbWVtb3J5KTsKKworCQlpZiAocmV0ICE9IENTX1NVQ0NFU1MpIHsKKwkJCWNzX2Vycm9yKGxpbmssIE1hcE1lbVBhZ2UsIHJldCk7CisJCQlnb3RvIGV4aXQxOworCQl9CisKKwkJaXB3LT5pc192Ml9jYXJkID0KKwkJCXBhcnNlLmNmdGFibGVfZW50cnkubWVtLndpblswXS5sZW4gPT0gMHgxMDA7CisKKwkJaXB3LT5jb21tb25fbWVtb3J5ID0gaW9yZW1hcChyZXF1ZXN0X2NvbW1vbl9tZW1vcnkuQmFzZSwKKwkJCQlyZXF1ZXN0X2NvbW1vbl9tZW1vcnkuU2l6ZSk7CisKKwkJcmVxdWVzdF9hdHRyX21lbW9yeS5BdHRyaWJ1dGVzID0KKwkJCVdJTl9EQVRBX1dJRFRIXzE2IHwgV0lOX01FTU9SWV9UWVBFX0FNIHwgV0lOX0VOQUJMRTsKKwkJcmVxdWVzdF9hdHRyX21lbW9yeS5CYXNlID0gMDsKKwkJcmVxdWVzdF9hdHRyX21lbW9yeS5TaXplID0gMDsJLyogdGhpcyB1c2VkIHRvIGJlIDB4MTAwMCAqLworCQlyZXF1ZXN0X2F0dHJfbWVtb3J5LkFjY2Vzc1NwZWVkID0gMDsKKworCQlyZXQgPSBwY21jaWFfcmVxdWVzdF93aW5kb3coJmxpbmssICZyZXF1ZXN0X2F0dHJfbWVtb3J5LAorCQkJCSZpcHctPmhhbmRsZV9hdHRyX21lbW9yeSk7CisKKwkJaWYgKHJldCAhPSBDU19TVUNDRVNTKSB7CisJCQljc19lcnJvcihsaW5rLCBSZXF1ZXN0V2luZG93LCByZXQpOworCQkJZ290byBleGl0MjsKKwkJfQorCisJCW1lbXJlcV9hdHRyX21lbW9yeS5DYXJkT2Zmc2V0ID0gMDsKKwkJbWVtcmVxX2F0dHJfbWVtb3J5LlBhZ2UgPSAwOworCisJCXJldCA9IHBjbWNpYV9tYXBfbWVtX3BhZ2UoaXB3LT5oYW5kbGVfYXR0cl9tZW1vcnksCisJCQkJJm1lbXJlcV9hdHRyX21lbW9yeSk7CisKKwkJaWYgKHJldCAhPSBDU19TVUNDRVNTKSB7CisJCQljc19lcnJvcihsaW5rLCBNYXBNZW1QYWdlLCByZXQpOworCQkJZ290byBleGl0MjsKKwkJfQorCisJCWlwdy0+YXR0cl9tZW1vcnkgPSBpb3JlbWFwKHJlcXVlc3RfYXR0cl9tZW1vcnkuQmFzZSwKKwkJCQlyZXF1ZXN0X2F0dHJfbWVtb3J5LlNpemUpOworCX0KKworCUlOSVRfV09SSygmaXB3LT53b3JrX3JlYm9vdCwgc2lnbmFsbGVkX3JlYm9vdF93b3JrKTsKKworCWlwd2lyZWxlc3NfaW5pdF9oYXJkd2FyZV92MShpcHctPmhhcmR3YXJlLCBsaW5rLT5pby5CYXNlUG9ydDEsCisJCQkJICAgIGlwdy0+YXR0cl9tZW1vcnksIGlwdy0+Y29tbW9uX21lbW9yeSwKKwkJCQkgICAgaXB3LT5pc192Ml9jYXJkLCBzaWduYWxsZWRfcmVib290X2NhbGxiYWNrLAorCQkJCSAgICBpcHcpOworCisJcmV0ID0gcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmssICZsaW5rLT5pcnEpOworCisJaWYgKHJldCAhPSBDU19TVUNDRVNTKSB7CisJCWNzX2Vycm9yKGxpbmssIFJlcXVlc3RJUlEsIHJldCk7CisJCWdvdG8gZXhpdDM7CisJfQorCisJLyogTG9vayB1cCBjdXJyZW50IFZjYyAqLworCisJcmV0ID0gcGNtY2lhX2dldF9jb25maWd1cmF0aW9uX2luZm8obGluaywgJmNvbmYpOworCisJaWYgKHJldCAhPSBDU19TVUNDRVNTKSB7CisJCWNzX2Vycm9yKGxpbmssIEdldENvbmZpZ3VyYXRpb25JbmZvLCByZXQpOworCQlnb3RvIGV4aXQ0OworCX0KKworCXByaW50ayhLRVJOX0lORk8gSVBXSVJFTEVTU19QQ0NBUkRfTkFNRSAiOiBDYXJkIHR5cGUgJXNcbiIsCisJCQlpcHctPmlzX3YyX2NhcmQgPyAiVjIvVjMiIDogIlYxIik7CisJcHJpbnRrKEtFUk5fSU5GTyBJUFdJUkVMRVNTX1BDQ0FSRF9OQU1FCisJCQkiOiBJL08gcG9ydHMgMHglMDR4LTB4JTA0eCwgaXJxICVkXG4iLAorCQkJKHVuc2lnbmVkIGludCkgbGluay0+aW8uQmFzZVBvcnQxLAorCQkJKHVuc2lnbmVkIGludCkgKGxpbmstPmlvLkJhc2VQb3J0MSArCisJCQkJbGluay0+aW8uTnVtUG9ydHMxIC0gMSksCisJCQkodW5zaWduZWQgaW50KSBsaW5rLT5pcnEuQXNzaWduZWRJUlEpOworCWlmIChpcHctPmF0dHJfbWVtb3J5ICYmIGlwdy0+Y29tbW9uX21lbW9yeSkKKwkJcHJpbnRrKEtFUk5fSU5GTyBJUFdJUkVMRVNTX1BDQ0FSRF9OQU1FCisJCQkJIjogYXR0ciBtZW1vcnkgMHglMDhseC0weCUwOGx4LCAiCisJCQkJImNvbW1vbiBtZW1vcnkgMHglMDhseC0weCUwOGx4XG4iLAorCQkJCXJlcXVlc3RfYXR0cl9tZW1vcnkuQmFzZSwKKwkJCQlyZXF1ZXN0X2F0dHJfbWVtb3J5LkJhc2UKKwkJCQkrIHJlcXVlc3RfYXR0cl9tZW1vcnkuU2l6ZSAtIDEsCisJCQkJcmVxdWVzdF9jb21tb25fbWVtb3J5LkJhc2UsCisJCQkJcmVxdWVzdF9jb21tb25fbWVtb3J5LkJhc2UKKwkJCQkrIHJlcXVlc3RfY29tbW9uX21lbW9yeS5TaXplIC0gMSk7CisKKwlpcHctPm5ldHdvcmsgPSBpcHdpcmVsZXNzX25ldHdvcmtfY3JlYXRlKGlwdy0+aGFyZHdhcmUpOworCWlmICghaXB3LT5uZXR3b3JrKQorCQlnb3RvIGV4aXQzOworCisJaXB3LT50dHkgPSBpcHdpcmVsZXNzX3R0eV9jcmVhdGUoaXB3LT5oYXJkd2FyZSwgaXB3LT5uZXR3b3JrLAorCQkJaXB3LT5ub2Rlcyk7CisJaWYgKCFpcHctPnR0eSkKKwkJZ290byBleGl0MzsKKworCWlwd2lyZWxlc3NfaW5pdF9oYXJkd2FyZV92Ml92MyhpcHctPmhhcmR3YXJlKTsKKworCS8qCisJICogRG8gdGhlIFJlcXVlc3RDb25maWd1cmF0aW9uIGxhc3QsIGJlY2F1c2UgaXQgZW5hYmxlcyBpbnRlcnJ1cHRzLgorCSAqIFRoZW4gd2UgZG9uJ3QgZ2V0IGFueSBpbnRlcnJ1cHRzIGJlZm9yZSB3ZSdyZSByZWFkeSBmb3IgdGhlbS4KKwkgKi8KKwlyZXQgPSBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmssICZsaW5rLT5jb25mKTsKKworCWlmIChyZXQgIT0gQ1NfU1VDQ0VTUykgeworCQljc19lcnJvcihsaW5rLCBSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcmV0KTsKKwkJZ290byBleGl0NDsKKwl9CisKKwlsaW5rLT5kZXZfbm9kZSA9ICZpcHctPm5vZGVzWzBdOworCisJcmV0dXJuIDA7CisKK2V4aXQ0OgorCXBjbWNpYV9kaXNhYmxlX2RldmljZShsaW5rKTsKK2V4aXQzOgorCWlmIChpcHctPmF0dHJfbWVtb3J5KSB7CisJCWlvdW5tYXAoaXB3LT5hdHRyX21lbW9yeSk7CisJCXBjbWNpYV9yZWxlYXNlX3dpbmRvdyhpcHctPmhhbmRsZV9hdHRyX21lbW9yeSk7CisJCXBjbWNpYV9kaXNhYmxlX2RldmljZShsaW5rKTsKKwl9CitleGl0MjoKKwlpZiAoaXB3LT5jb21tb25fbWVtb3J5KSB7CisJCWlvdW5tYXAoaXB3LT5jb21tb25fbWVtb3J5KTsKKwkJcGNtY2lhX3JlbGVhc2Vfd2luZG93KGlwdy0+aGFuZGxlX2NvbW1vbl9tZW1vcnkpOworCX0KK2V4aXQxOgorCXBjbWNpYV9kaXNhYmxlX2RldmljZShsaW5rKTsKK2V4aXQwOgorCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9pcHdpcmVsZXNzKHN0cnVjdCBpcHdfZGV2ICppcHcpCit7CisJc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmsgPSBpcHctPmxpbms7CisKKwlwY21jaWFfZGlzYWJsZV9kZXZpY2UobGluayk7CisKKwlpZiAoaXB3LT5jb21tb25fbWVtb3J5KQorCQlpb3VubWFwKGlwdy0+Y29tbW9uX21lbW9yeSk7CisJaWYgKGlwdy0+YXR0cl9tZW1vcnkpCisJCWlvdW5tYXAoaXB3LT5hdHRyX21lbW9yeSk7CisJaWYgKGlwdy0+Y29tbW9uX21lbW9yeSkKKwkJcGNtY2lhX3JlbGVhc2Vfd2luZG93KGlwdy0+aGFuZGxlX2NvbW1vbl9tZW1vcnkpOworCWlmIChpcHctPmF0dHJfbWVtb3J5KQorCQlwY21jaWFfcmVsZWFzZV93aW5kb3coaXB3LT5oYW5kbGVfYXR0cl9tZW1vcnkpOworCXBjbWNpYV9kaXNhYmxlX2RldmljZShsaW5rKTsKK30KKworLyoKKyAqIGlwd2lyZWxlc3NfYXR0YWNoKCkgY3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcKKyAqIGxvY2FsIGRhdGEgc3RydWN0dXJlcyBmb3Igb25lIGRldmljZSAob25lIGludGVyZmFjZSkuICBUaGUgZGV2aWNlCisgKiBpcyByZWdpc3RlcmVkIHdpdGggQ2FyZCBTZXJ2aWNlcy4KKyAqCisgKiBUaGUgcGNtY2lhX2RldmljZSBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQsIGJ1dCB3ZSBkb24ndCBhY3R1YWxseQorICogY29uZmlndXJlIHRoZSBjYXJkIGF0IHRoaXMgcG9pbnQgLS0gd2Ugd2FpdCB1bnRpbCB3ZSByZWNlaXZlIGEKKyAqIGNhcmQgaW5zZXJ0aW9uIGV2ZW50LgorICovCitzdGF0aWMgaW50IGlwd2lyZWxlc3NfYXR0YWNoKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQoreworCXN0cnVjdCBpcHdfZGV2ICppcHc7CisJaW50IHJldDsKKworCWlwdyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpcHdfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpcHcpCisJCXJldHVybiAtRU5PTUVNOworCisJaXB3LT5saW5rID0gbGluazsKKwlsaW5rLT5wcml2ID0gaXB3OworCWxpbmstPmlycS5JbnN0YW5jZSA9IGlwdzsKKworCS8qIExpbmsgdGhpcyBkZXZpY2UgaW50byBvdXIgZGV2aWNlIGxpc3QuICovCisJbGluay0+ZGV2X25vZGUgPSAmaXB3LT5ub2Rlc1swXTsKKworCWlwdy0+aGFyZHdhcmUgPSBpcHdpcmVsZXNzX2hhcmR3YXJlX2NyZWF0ZSgpOworCWlmICghaXB3LT5oYXJkd2FyZSkgeworCQlrZnJlZShpcHcpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogUmVnaXN0ZXJDbGllbnQgd2lsbCBjYWxsIGNvbmZpZ19pcHdpcmVsZXNzICovCisKKwlyZXQgPSBjb25maWdfaXB3aXJlbGVzcyhpcHcpOworCisJaWYgKHJldCAhPSAwKSB7CisJCWNzX2Vycm9yKGxpbmssIFJlZ2lzdGVyQ2xpZW50LCByZXQpOworCQlpcHdpcmVsZXNzX2RldGFjaChsaW5rKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiAgVGhlIGRldmljZSBpcyBkZS1yZWdpc3RlcmVkIHdpdGgKKyAqIENhcmQgU2VydmljZXMuICBJZiBpdCBoYXMgYmVlbiByZWxlYXNlZCwgYWxsIGxvY2FsIGRhdGEgc3RydWN0dXJlcworICogYXJlIGZyZWVkLiAgT3RoZXJ3aXNlLCB0aGUgc3RydWN0dXJlcyB3aWxsIGJlIGZyZWVkIHdoZW4gdGhlIGRldmljZQorICogaXMgcmVsZWFzZWQuCisgKi8KK3N0YXRpYyB2b2lkIGlwd2lyZWxlc3NfZGV0YWNoKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKQoreworCXN0cnVjdCBpcHdfZGV2ICppcHcgPSBsaW5rLT5wcml2OworCisJcmVsZWFzZV9pcHdpcmVsZXNzKGlwdyk7CisKKwkvKiBCcmVhayB0aGUgbGluayB3aXRoIENhcmQgU2VydmljZXMgKi8KKwlpZiAobGluaykKKwkJcGNtY2lhX2Rpc2FibGVfZGV2aWNlKGxpbmspOworCisJaWYgKGlwdy0+dHR5ICE9IE5VTEwpCisJCWlwd2lyZWxlc3NfdHR5X2ZyZWUoaXB3LT50dHkpOworCWlmIChpcHctPm5ldHdvcmsgIT0gTlVMTCkKKwkJaXB3aXJlbGVzc19uZXR3b3JrX2ZyZWUoaXB3LT5uZXR3b3JrKTsKKwlpZiAoaXB3LT5oYXJkd2FyZSAhPSBOVUxMKQorCQlpcHdpcmVsZXNzX2hhcmR3YXJlX2ZyZWUoaXB3LT5oYXJkd2FyZSk7CisJa2ZyZWUoaXB3KTsKK30KKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIG1lID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkucHJvYmUgICAgICAgICAgPSBpcHdpcmVsZXNzX2F0dGFjaCwKKwkucmVtb3ZlICAgICAgICAgPSBpcHdpcmVsZXNzX2RldGFjaCwKKwkuZHJ2ID0geyAubmFtZSAgPSBJUFdJUkVMRVNTX1BDQ0FSRF9OQU1FIH0sCisJLmlkX3RhYmxlICAgICAgID0gaXB3X2lkcworfTsKKworLyoKKyAqIE1vZHVsZSBpbnNlcnRpb24gOiBpbml0aWFsaXNhdGlvbiBvZiB0aGUgbW9kdWxlLgorICogUmVnaXN0ZXIgdGhlIGNhcmQgd2l0aCBjYXJkbWdyLi4uCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGluaXRfaXB3aXJlbGVzcyh2b2lkKQoreworCWludCByZXQ7CisKKwlwcmludGsoS0VSTl9JTkZPIElQV0lSRUxFU1NfUENDQVJEX05BTUUgIiAiCisJICAgICAgIElQV0lSRUxFU1NfUENNQ0lBX1ZFUlNJT04gIiBieSAiIElQV0lSRUxFU1NfUENNQ0lBX0FVVEhPUiAiXG4iKTsKKworCXJldCA9IGlwd2lyZWxlc3NfdHR5X2luaXQoKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZtZSk7CisJaWYgKHJldCAhPSAwKQorCQlpcHdpcmVsZXNzX3R0eV9yZWxlYXNlKCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTW9kdWxlIHJlbW92YWwKKyAqLworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfaXB3aXJlbGVzcyh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gSVBXSVJFTEVTU19QQ0NBUkRfTkFNRSAiICIKKwkJCUlQV0lSRUxFU1NfUENNQ0lBX1ZFUlNJT04gIiByZW1vdmVkXG4iKTsKKworCXBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmbWUpOworCWlwd2lyZWxlc3NfdHR5X3JlbGVhc2UoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9pcHdpcmVsZXNzKTsKK21vZHVsZV9leGl0KGV4aXRfaXB3aXJlbGVzcyk7CisKK01PRFVMRV9BVVRIT1IoSVBXSVJFTEVTU19QQ01DSUFfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihJUFdJUkVMRVNTX1BDQ0FSRF9OQU1FICIgIiBJUFdJUkVMRVNTX1BDTUNJQV9WRVJTSU9OKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wY21jaWEvaXB3aXJlbGVzcy9tYWluLmggYi9kcml2ZXJzL2NoYXIvcGNtY2lhL2lwd2lyZWxlc3MvbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZmRjYzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL2lwd2lyZWxlc3MvbWFpbi5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBJUFdpcmVsZXNzIDNHIFBDTUNJQSBOZXR3b3JrIERyaXZlcgorICoKKyAqIE9yaWdpbmFsIGNvZGUKKyAqICAgYnkgU3RlcGhlbiBCbGFja2hlYXRoIDxzdGVwaGVuQGJsYWNrc2FwcGhpcmUuY29tPiwKKyAqICAgICAgQmVuIE1hcnRlbCA8YmVubUBzeW1tZXRyaWMuY28ubno+CisgKgorICogQ29weXJpZ2h0ZWQgYXMgZm9sbG93czoKKyAqICAgQ29weXJpZ2h0IChDKSAyMDA0IGJ5IFN5bW1ldHJpYyBTeXN0ZW1zIEx0ZCAoTlopCisgKgorICogVmFyaW91cyBkcml2ZXIgY2hhbmdlcyBhbmQgcmV3cml0ZXMsIHBvcnQgdG8gbmV3IGtlcm5lbHMKKyAqICAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgSmlyaSBLb3NpbmEKKyAqCisgKiBNaXNjIGNvZGUgY2xlYW51cHMgYW5kIHVwZGF0ZXMKKyAqICAgQ29weXJpZ2h0IChDKSAyMDA3IERhdmlkIFN0ZXJiYQorICovCisKKyNpZm5kZWYgX0lQV0lSRUxFU1NfQ1NfSF8KKyNkZWZpbmUgX0lQV0lSRUxFU1NfQ1NfSF8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKworI2luY2x1ZGUgImhhcmR3YXJlLmgiCisKKyNkZWZpbmUgSVBXSVJFTEVTU19QQ0NBUkRfTkFNRQkJImlwd2lyZWxlc3MiCisjZGVmaW5lIElQV0lSRUxFU1NfUENNQ0lBX1ZFUlNJT04JIjEuMSIKKyNkZWZpbmUgSVBXSVJFTEVTU19QQ01DSUFfQVVUSE9SICAgICAgICBcCisJIlN0ZXBoZW4gQmxhY2toZWF0aCwgQmVuIE1hcnRlbCwgSmlyaSBLb3NpbmEgYW5kIERhdmlkIFN0ZXJiYSIKKworI2RlZmluZSBJUFdJUkVMRVNTX1RYX1FVRVVFX1NJWkUgIDI2MjE0NAorI2RlZmluZSBJUFdJUkVMRVNTX1JYX1FVRVVFX1NJWkUgIDI2MjE0NAorCisjZGVmaW5lIElQV0lSRUxFU1NfU1RBVEVfREVCVUcKKworc3RydWN0IGlwd19oYXJkd2FyZTsKK3N0cnVjdCBpcHdfbmV0d29yazsKK3N0cnVjdCBpcHdfdHR5OworCitzdHJ1Y3QgaXB3X2RldiB7CisJc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbms7CisJaW50IGlzX3YyX2NhcmQ7CisJd2luZG93X2hhbmRsZV90IGhhbmRsZV9hdHRyX21lbW9yeTsKKwl2b2lkIF9faW9tZW0gKmF0dHJfbWVtb3J5OworCXdpbmRvd19oYW5kbGVfdCBoYW5kbGVfY29tbW9uX21lbW9yeTsKKwl2b2lkIF9faW9tZW0gKmNvbW1vbl9tZW1vcnk7CisJZGV2X25vZGVfdCBub2Rlc1syXTsKKwkvKiBSZWZlcmVuY2UgdG8gYXR0cmlidXRlIG1lbW9yeSwgY29udGFpbmluZyBDSVMgZGF0YSAqLworCXZvaWQgKmF0dHJpYnV0ZV9tZW1vcnk7CisKKwkvKiBIYXJkd2FyZSBjb250ZXh0ICovCisJc3RydWN0IGlwd19oYXJkd2FyZSAqaGFyZHdhcmU7CisJLyogTmV0d29yayBsYXllciBjb250ZXh0ICovCisJc3RydWN0IGlwd19uZXR3b3JrICpuZXR3b3JrOworCS8qIFRUWSBkZXZpY2UgY29udGV4dCAqLworCXN0cnVjdCBpcHdfdHR5ICp0dHk7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcmtfcmVib290OworfTsKKworLyogTW9kdWxlIHBhcmFtZXRyZXMgKi8KK2V4dGVybiBpbnQgaXB3aXJlbGVzc19kZWJ1ZzsKK2V4dGVybiBpbnQgaXB3aXJlbGVzc19sb29wYmFjazsKK2V4dGVybiBpbnQgaXB3aXJlbGVzc19vdXRfcXVldWU7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3BjbWNpYS9pcHdpcmVsZXNzL25ldHdvcmsuYyBiL2RyaXZlcnMvY2hhci9wY21jaWEvaXB3aXJlbGVzcy9uZXR3b3JrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYzNTIzMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9wY21jaWEvaXB3aXJlbGVzcy9uZXR3b3JrLmMKQEAgLTAsMCArMSw1MTIgQEAKKy8qCisgKiBJUFdpcmVsZXNzIDNHIFBDTUNJQSBOZXR3b3JrIERyaXZlcgorICoKKyAqIE9yaWdpbmFsIGNvZGUKKyAqICAgYnkgU3RlcGhlbiBCbGFja2hlYXRoIDxzdGVwaGVuQGJsYWNrc2FwcGhpcmUuY29tPiwKKyAqICAgICAgQmVuIE1hcnRlbCA8YmVubUBzeW1tZXRyaWMuY28ubno+CisgKgorICogQ29weXJpZ2h0ZWQgYXMgZm9sbG93czoKKyAqICAgQ29weXJpZ2h0IChDKSAyMDA0IGJ5IFN5bW1ldHJpYyBTeXN0ZW1zIEx0ZCAoTlopCisgKgorICogVmFyaW91cyBkcml2ZXIgY2hhbmdlcyBhbmQgcmV3cml0ZXMsIHBvcnQgdG8gbmV3IGtlcm5lbHMKKyAqICAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgSmlyaSBLb3NpbmEKKyAqCisgKiBNaXNjIGNvZGUgY2xlYW51cHMgYW5kIHVwZGF0ZXMKKyAqICAgQ29weXJpZ2h0IChDKSAyMDA3IERhdmlkIFN0ZXJiYQorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BwcF9jaGFubmVsLmg+CisjaW5jbHVkZSA8bGludXgvcHBwX2RlZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9wcHAuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgIm5ldHdvcmsuaCIKKyNpbmNsdWRlICJoYXJkd2FyZS5oIgorI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJ0dHkuaCIKKworI2RlZmluZSBNQVhfT1VUR09JTkdfUEFDS0VUU19RVUVVRUQgICBpcHdpcmVsZXNzX291dF9xdWV1ZQorI2RlZmluZSBNQVhfQVNTT0NJQVRFRF9UVFlTIDIKKworI2RlZmluZSBTQ19SQ1ZfQklUUyAgICAgKFNDX1JDVl9CN18xfFNDX1JDVl9CN18wfFNDX1JDVl9PRERQfFNDX1JDVl9FVk5QKQorCitzdHJ1Y3QgaXB3X25ldHdvcmsgeworCS8qIEhhcmR3YXJlIGNvbnRleHQsIHVzZWQgZm9yIGNhbGxzIHRvIGhhcmR3YXJlIGxheWVyLiAqLworCXN0cnVjdCBpcHdfaGFyZHdhcmUgKmhhcmR3YXJlOworCS8qIENvbnRleHQgZm9yIGtlcm5lbCAnZ2VuZXJpY19wcHAnIGZ1bmN0aW9uYWxpdHkgKi8KKwlzdHJ1Y3QgcHBwX2NoYW5uZWwgKnBwcF9jaGFubmVsOworCS8qIHR0eSBjb250ZXh0IGNvbm5lY3RlZCB3aXRoIElQVyBjb25zb2xlICovCisJc3RydWN0IGlwd190dHkgKmFzc29jaWF0ZWRfdHR5c1tOT19PRl9JUFdfQ0hBTk5FTFNdW01BWF9BU1NPQ0lBVEVEX1RUWVNdOworCS8qIFRydWUgaWYgcHBwIG5lZWRzIHdha2luZyB1cCBvbmNlIHdlJ3JlIHJlYWR5IHRvIHhtaXQgKi8KKwlpbnQgcHBwX2Jsb2NrZWQ7CisJLyogTnVtYmVyIG9mIHBhY2tldHMgcXVldWVkIHVwIGluIGhhcmR3YXJlIG1vZHVsZS4gKi8KKwlpbnQgb3V0Z29pbmdfcGFja2V0c19xdWV1ZWQ7CisJLyogU3BpbmxvY2sgdG8gYXZvaWQgaW50ZXJydXB0cyBkdXJpbmcgc2h1dGRvd24gKi8KKwlzcGlubG9ja190IHNwaW5sb2NrOworCXN0cnVjdCBtdXRleCBjbG9zZV9sb2NrOworCisJLyogUFBQIGlvY3RsIGRhdGEsIG5vdCBhY3R1YWxseSB1c2VkIGFueXdlcmUgKi8KKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgaW50IHJiaXRzOworCXUzMiB4YWNjbVs4XTsKKwl1MzIgcmFjY207CisJaW50IG1ydTsKKworCWludCBzaHV0dGluZ19kb3duOworCXVuc2lnbmVkIGludCByYXNfY29udHJvbF9saW5lczsKKworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrX2dvX29ubGluZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29ya19nb19vZmZsaW5lOworfTsKKworCisjaWZkZWYgSVBXSVJFTEVTU19TVEFURV9ERUJVRworaW50IGlwd2lyZWxlc3NfZHVtcF9uZXR3b3JrX3N0YXRlKGNoYXIgKnAsIHNpemVfdCBsaW1pdCwKKwkJCQkgIHN0cnVjdCBpcHdfbmV0d29yayAqbmV0d29yaykKK3sKKwlyZXR1cm4gc25wcmludGYocCwgbGltaXQsCisJCQkiZGVidWc6IHBwcF9ibG9ja2VkPSVkXG4iCisJCQkiZGVidWc6IG91dGdvaW5nX3BhY2tldHNfcXVldWVkPSVkXG4iCisJCQkiZGVidWc6IG5ldHdvcmsuc2h1dHRpbmdfZG93bj0lZFxuIiwKKwkJCW5ldHdvcmstPnBwcF9ibG9ja2VkLAorCQkJbmV0d29yay0+b3V0Z29pbmdfcGFja2V0c19xdWV1ZWQsCisJCQluZXR3b3JrLT5zaHV0dGluZ19kb3duKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBub3RpZnlfcGFja2V0X3NlbnQodm9pZCAqY2FsbGJhY2tfZGF0YSwgdW5zaWduZWQgaW50IHBhY2tldF9sZW5ndGgpCit7CisJc3RydWN0IGlwd19uZXR3b3JrICpuZXR3b3JrID0gY2FsbGJhY2tfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5ldHdvcmstPnNwaW5sb2NrLCBmbGFncyk7CisJbmV0d29yay0+b3V0Z29pbmdfcGFja2V0c19xdWV1ZWQtLTsKKwlpZiAobmV0d29yay0+cHBwX2NoYW5uZWwgIT0gTlVMTCkgeworCQlpZiAobmV0d29yay0+cHBwX2Jsb2NrZWQpIHsKKwkJCW5ldHdvcmstPnBwcF9ibG9ja2VkID0gMDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5ldHdvcmstPnNwaW5sb2NrLCBmbGFncyk7CisJCQlwcHBfb3V0cHV0X3dha2V1cChuZXR3b3JrLT5wcHBfY2hhbm5lbCk7CisJCQlpZiAoaXB3aXJlbGVzc19kZWJ1ZykKKwkJCQlwcmludGsoS0VSTl9JTkZPIElQV0lSRUxFU1NfUENDQVJEX05BTUUKKwkJCQkgICAgICAgIjogcHBwIHVuYmxvY2tlZFxuIik7CisJCX0gZWxzZQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmV0d29yay0+c3BpbmxvY2ssIGZsYWdzKTsKKwl9IGVsc2UKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmV0d29yay0+c3BpbmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIENhbGxlZCBieSB0aGUgcHBwIHN5c3RlbSB3aGVuIGl0IGhhcyBhIHBhY2tldCB0byBzZW5kIHRvIHRoZSBoYXJkd2FyZS4KKyAqLworc3RhdGljIGludCBpcHdpcmVsZXNzX3BwcF9zdGFydF94bWl0KHN0cnVjdCBwcHBfY2hhbm5lbCAqcHBwX2NoYW5uZWwsCisJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcHdfbmV0d29yayAqbmV0d29yayA9IHBwcF9jaGFubmVsLT5wcml2YXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbmV0d29yay0+c3BpbmxvY2ssIGZsYWdzKTsKKwlpZiAobmV0d29yay0+b3V0Z29pbmdfcGFja2V0c19xdWV1ZWQgPCBNQVhfT1VUR09JTkdfUEFDS0VUU19RVUVVRUQpIHsKKwkJdW5zaWduZWQgY2hhciAqYnVmOworCQlzdGF0aWMgdW5zaWduZWQgY2hhciBoZWFkZXJbXSA9IHsKKwkJCVBQUF9BTExTVEFUSU9OUywgLyogMHhmZiAqLworCQkJUFBQX1VJLAkJIC8qIDB4MDMgKi8KKwkJfTsKKwkJaW50IHJldDsKKworCQluZXR3b3JrLT5vdXRnb2luZ19wYWNrZXRzX3F1ZXVlZCsrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXR3b3JrLT5zcGlubG9jaywgZmxhZ3MpOworCisJCS8qCisJCSAqIElmIHdlIGhhdmUgdGhlIHJlcXVlc3RlZCBhbW91bnQgb2YgaGVhZHJvb20gaW4gdGhlIHNrYiB3ZQorCQkgKiB3ZXJlIGhhbmRlZCwgdGhlbiB3ZSBjYW4gYWRkIHRoZSBoZWFkZXIgZWZmaWNpZW50bHkuCisJCSAqLworCQlpZiAoc2tiX2hlYWRyb29tKHNrYikgPj0gMikgeworCQkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgMiksIGhlYWRlciwgMik7CisJCQlyZXQgPSBpcHdpcmVsZXNzX3NlbmRfcGFja2V0KG5ldHdvcmstPmhhcmR3YXJlLAorCQkJCQkgICAgICAgSVBXX0NIQU5ORUxfUkFTLCBza2ItPmRhdGEsCisJCQkJCSAgICAgICBza2ItPmxlbiwKKwkJCQkJICAgICAgIG5vdGlmeV9wYWNrZXRfc2VudCwKKwkJCQkJICAgICAgIG5ldHdvcmspOworCQkJaWYgKHJldCA9PSAtMSkgeworCQkJCXNrYl9wdWxsKHNrYiwgMik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBPdGhlcndpc2UgKHJhcmVseSkgd2UgZG8gaXQgaW5lZmZpY2llbnRseS4gKi8KKwkJCWJ1ZiA9IGttYWxsb2Moc2tiLT5sZW4gKyAyLCBHRlBfQVRPTUlDKTsKKwkJCWlmICghYnVmKQorCQkJCXJldHVybiAwOworCQkJbWVtY3B5KGJ1ZiArIDIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQkJbWVtY3B5KGJ1ZiwgaGVhZGVyLCAyKTsKKwkJCXJldCA9IGlwd2lyZWxlc3Nfc2VuZF9wYWNrZXQobmV0d29yay0+aGFyZHdhcmUsCisJCQkJCSAgICAgICBJUFdfQ0hBTk5FTF9SQVMsIGJ1ZiwKKwkJCQkJICAgICAgIHNrYi0+bGVuICsgMiwKKwkJCQkJICAgICAgIG5vdGlmeV9wYWNrZXRfc2VudCwKKwkJCQkJICAgICAgIG5ldHdvcmspOworCQkJa2ZyZWUoYnVmKTsKKwkJCWlmIChyZXQgPT0gLTEpCisJCQkJcmV0dXJuIDA7CisJCX0KKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCS8qCisJCSAqIE90aGVyd2lzZSByZWplY3QgdGhlIHBhY2tldCwgYW5kIGZsYWcgdGhhdCB0aGUgcHBwIHN5c3RlbQorCQkgKiBuZWVkcyB0byBiZSB1bmJsb2NrZWQgb25jZSB3ZSBhcmUgcmVhZHkgdG8gc2VuZC4KKwkJICovCisJCW5ldHdvcmstPnBwcF9ibG9ja2VkID0gMTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmV0d29yay0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKiBIYW5kbGUgYW4gaW9jdGwgY2FsbCB0aGF0IGhhcyBjb21lIGluIHZpYSBwcHAuIChjb3B5IG9mIHBwcF9hc3luY19pb2N0bCgpICovCitzdGF0aWMgaW50IGlwd2lyZWxlc3NfcHBwX2lvY3RsKHN0cnVjdCBwcHBfY2hhbm5lbCAqcHBwX2NoYW5uZWwsCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGlwd19uZXR3b3JrICpuZXR3b3JrID0gcHBwX2NoYW5uZWwtPnByaXZhdGU7CisJaW50IGVyciwgdmFsOworCXUzMiBhY2NtWzhdOworCWludCBfX3VzZXIgKnVzZXJfYXJnID0gKGludCBfX3VzZXIgKikgYXJnOworCisJZXJyID0gLUVGQVVMVDsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUFBQSU9DR0ZMQUdTOgorCQl2YWwgPSBuZXR3b3JrLT5mbGFncyB8IG5ldHdvcmstPnJiaXRzOworCQlpZiAocHV0X3VzZXIodmFsLCB1c2VyX2FyZykpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ1NGTEFHUzoKKwkJaWYgKGdldF91c2VyKHZhbCwgdXNlcl9hcmcpKQorCQkJYnJlYWs7CisJCW5ldHdvcmstPmZsYWdzID0gdmFsICYgflNDX1JDVl9CSVRTOworCQluZXR3b3JrLT5yYml0cyA9IHZhbCAmIFNDX1JDVl9CSVRTOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DR0FTWU5DTUFQOgorCQlpZiAocHV0X3VzZXIobmV0d29yay0+eGFjY21bMF0sIHVzZXJfYXJnKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DU0FTWU5DTUFQOgorCQlpZiAoZ2V0X3VzZXIobmV0d29yay0+eGFjY21bMF0sIHVzZXJfYXJnKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DR1JBU1lOQ01BUDoKKwkJaWYgKHB1dF91c2VyKG5ldHdvcmstPnJhY2NtLCB1c2VyX2FyZykpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ1NSQVNZTkNNQVA6CisJCWlmIChnZXRfdXNlcihuZXR3b3JrLT5yYWNjbSwgdXNlcl9hcmcpKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NHWEFTWU5DTUFQOgorCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSBhcmcsIG5ldHdvcmstPnhhY2NtLAorCQkJCQlzaXplb2YobmV0d29yay0+eGFjY20pKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DU1hBU1lOQ01BUDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGFjY20sICh2b2lkIF9fdXNlciAqKSBhcmcsIHNpemVvZihhY2NtKSkpCisJCQlicmVhazsKKwkJYWNjbVsyXSAmPSB+MHg0MDAwMDAwMFU7CS8qIGNhbid0IGVzY2FwZSAweDVlICovCisJCWFjY21bM10gfD0gMHg2MDAwMDAwMFU7CS8qIG11c3QgZXNjYXBlIDB4N2QsIDB4N2UgKi8KKwkJbWVtY3B5KG5ldHdvcmstPnhhY2NtLCBhY2NtLCBzaXplb2YobmV0d29yay0+eGFjY20pKTsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ0dNUlU6CisJCWlmIChwdXRfdXNlcihuZXR3b3JrLT5tcnUsIHVzZXJfYXJnKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DU01SVToKKwkJaWYgKGdldF91c2VyKHZhbCwgdXNlcl9hcmcpKQorCQkJYnJlYWs7CisJCWlmICh2YWwgPCBQUFBfTVJVKQorCQkJdmFsID0gUFBQX01SVTsKKwkJbmV0d29yay0+bXJ1ID0gdmFsOworCQllcnIgPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FTk9UVFk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBwcHBfY2hhbm5lbF9vcHMgaXB3aXJlbGVzc19wcHBfY2hhbm5lbF9vcHMgPSB7CisJLnN0YXJ0X3htaXQgPSBpcHdpcmVsZXNzX3BwcF9zdGFydF94bWl0LAorCS5pb2N0bCAgICAgID0gaXB3aXJlbGVzc19wcHBfaW9jdGwKK307CisKK3N0YXRpYyB2b2lkIGRvX2dvX29ubGluZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmtfZ29fb25saW5lKQoreworCXN0cnVjdCBpcHdfbmV0d29yayAqbmV0d29yayA9CisJCWNvbnRhaW5lcl9vZih3b3JrX2dvX29ubGluZSwgc3RydWN0IGlwd19uZXR3b3JrLAorCQkJCXdvcmtfZ29fb25saW5lKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5ldHdvcmstPnNwaW5sb2NrLCBmbGFncyk7CisJaWYgKCFuZXR3b3JrLT5wcHBfY2hhbm5lbCkgeworCQlzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW5uZWw7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmV0d29yay0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJY2hhbm5lbCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwcHBfY2hhbm5lbCksIEdGUF9LRVJORUwpOworCQlpZiAoIWNoYW5uZWwpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBJUFdJUkVMRVNTX1BDQ0FSRF9OQU1FCisJCQkJCSI6IHVuYWJsZSB0byBhbGxvY2F0ZSBQUFAgY2hhbm5lbFxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJY2hhbm5lbC0+cHJpdmF0ZSA9IG5ldHdvcms7CisJCWNoYW5uZWwtPm10dSA9IDE2Mzg0OwkvKiBXaWxkIGd1ZXNzICovCisJCWNoYW5uZWwtPmhkcmxlbiA9IDI7CisJCWNoYW5uZWwtPm9wcyA9ICZpcHdpcmVsZXNzX3BwcF9jaGFubmVsX29wczsKKworCQluZXR3b3JrLT5mbGFncyA9IDA7CisJCW5ldHdvcmstPnJiaXRzID0gMDsKKwkJbmV0d29yay0+bXJ1ID0gUFBQX01SVTsKKwkJbWVtc2V0KG5ldHdvcmstPnhhY2NtLCAwLCBzaXplb2YobmV0d29yay0+eGFjY20pKTsKKwkJbmV0d29yay0+eGFjY21bMF0gPSB+MFU7CisJCW5ldHdvcmstPnhhY2NtWzNdID0gMHg2MDAwMDAwMFU7CisJCW5ldHdvcmstPnJhY2NtID0gfjBVOworCQlwcHBfcmVnaXN0ZXJfY2hhbm5lbChjaGFubmVsKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm5ldHdvcmstPnNwaW5sb2NrLCBmbGFncyk7CisJCW5ldHdvcmstPnBwcF9jaGFubmVsID0gY2hhbm5lbDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmV0d29yay0+c3BpbmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgZG9fZ29fb2ZmbGluZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmtfZ29fb2ZmbGluZSkKK3sKKwlzdHJ1Y3QgaXB3X25ldHdvcmsgKm5ldHdvcmsgPQorCQljb250YWluZXJfb2Yod29ya19nb19vZmZsaW5lLCBzdHJ1Y3QgaXB3X25ldHdvcmssCisJCQkJd29ya19nb19vZmZsaW5lKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbXV0ZXhfbG9jaygmbmV0d29yay0+Y2xvc2VfbG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm5ldHdvcmstPnNwaW5sb2NrLCBmbGFncyk7CisJaWYgKG5ldHdvcmstPnBwcF9jaGFubmVsICE9IE5VTEwpIHsKKwkJc3RydWN0IHBwcF9jaGFubmVsICpjaGFubmVsID0gbmV0d29yay0+cHBwX2NoYW5uZWw7CisKKwkJbmV0d29yay0+cHBwX2NoYW5uZWwgPSBOVUxMOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXR3b3JrLT5zcGlubG9jaywgZmxhZ3MpOworCQltdXRleF91bmxvY2soJm5ldHdvcmstPmNsb3NlX2xvY2spOworCQlwcHBfdW5yZWdpc3Rlcl9jaGFubmVsKGNoYW5uZWwpOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5ldHdvcmstPnNwaW5sb2NrLCBmbGFncyk7CisJCW11dGV4X3VubG9jaygmbmV0d29yay0+Y2xvc2VfbG9jayk7CisJfQorfQorCit2b2lkIGlwd2lyZWxlc3NfbmV0d29ya19ub3RpZnlfY29udHJvbF9saW5lX2NoYW5nZShzdHJ1Y3QgaXB3X25ldHdvcmsgKm5ldHdvcmssCisJCQkJCQkgICB1bnNpZ25lZCBpbnQgY2hhbm5lbF9pZHgsCisJCQkJCQkgICB1bnNpZ25lZCBpbnQgY29udHJvbF9saW5lcywKKwkJCQkJCSAgIHVuc2lnbmVkIGludCBjaGFuZ2VkX21hc2spCit7CisJaW50IGk7CisKKwlpZiAoY2hhbm5lbF9pZHggPT0gSVBXX0NIQU5ORUxfUkFTKQorCQluZXR3b3JrLT5yYXNfY29udHJvbF9saW5lcyA9IGNvbnRyb2xfbGluZXM7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0FTU09DSUFURURfVFRZUzsgaSsrKSB7CisJCXN0cnVjdCBpcHdfdHR5ICp0dHkgPQorCQkJbmV0d29yay0+YXNzb2NpYXRlZF90dHlzW2NoYW5uZWxfaWR4XVtpXTsKKworCQkvKgorCQkgKiBJZiBpdCdzIGFzc29jaWF0ZWQgd2l0aCBhIHR0eSAob3RoZXIgdGhhbiB0aGUgUkFTIGNoYW5uZWwKKwkJICogd2hlbiB3ZSdyZSBvbmxpbmUpLCB0aGVuIHNlbmQgdGhlIGRhdGEgdG8gdGhhdCB0dHkuICBUaGUgUkFTCisJCSAqIGNoYW5uZWwncyBkYXRhIGlzIGhhbmRsZWQgYWJvdmUgLSBpdCBhbHdheXMgZ29lcyB0aHJvdWdoCisJCSAqIHBwcF9nZW5lcmljLgorCQkgKi8KKwkJaWYgKHR0eSkKKwkJCWlwd2lyZWxlc3NfdHR5X25vdGlmeV9jb250cm9sX2xpbmVfY2hhbmdlKHR0eSwKKwkJCQkJCQkJICBjaGFubmVsX2lkeCwKKwkJCQkJCQkJICBjb250cm9sX2xpbmVzLAorCQkJCQkJCQkgIGNoYW5nZWRfbWFzayk7CisJfQorfQorCisvKgorICogU29tZSB2ZXJzaW9ucyBvZiBmaXJtd2FyZSBzdHVmZiBwYWNrZXRzIHdpdGggMHhmZiAweDAzIChQUFA6IEFMTFNUQVRJT05TLCBVSSkKKyAqIGJ5dGVzLCB3aGljaCBhcmUgcmVxdWlyZWQgb24gc2VudCBwYWNrZXQsIGJ1dCBub3QgYWx3YXlzIHByZXNlbnQgb24gcmVjZWl2ZWQKKyAqIHBhY2tldHMKKyAqLworc3RhdGljIHN0cnVjdCBza19idWZmICppcHdfcGFja2V0X3JlY2VpdmVkX3NrYih1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJaWYgKGxlbmd0aCA+IDIgJiYgZGF0YVswXSA9PSBQUFBfQUxMU1RBVElPTlMgJiYgZGF0YVsxXSA9PSBQUFBfVUkpIHsKKwkJbGVuZ3RoIC09IDI7CisJCWRhdGEgKz0gMjsKKwl9CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbmd0aCArIDQpOworCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJbWVtY3B5KHNrYl9wdXQoc2tiLCBsZW5ndGgpLCBkYXRhLCBsZW5ndGgpOworCisJcmV0dXJuIHNrYjsKK30KKwordm9pZCBpcHdpcmVsZXNzX25ldHdvcmtfcGFja2V0X3JlY2VpdmVkKHN0cnVjdCBpcHdfbmV0d29yayAqbmV0d29yaywKKwkJCQkJdW5zaWduZWQgaW50IGNoYW5uZWxfaWR4LAorCQkJCQl1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJCQl1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0FTU09DSUFURURfVFRZUzsgaSsrKSB7CisJCXN0cnVjdCBpcHdfdHR5ICp0dHkgPSBuZXR3b3JrLT5hc3NvY2lhdGVkX3R0eXNbY2hhbm5lbF9pZHhdW2ldOworCisJCS8qCisJCSAqIElmIGl0J3MgYXNzb2NpYXRlZCB3aXRoIGEgdHR5IChvdGhlciB0aGFuIHRoZSBSQVMgY2hhbm5lbAorCQkgKiB3aGVuIHdlJ3JlIG9ubGluZSksIHRoZW4gc2VuZCB0aGUgZGF0YSB0byB0aGF0IHR0eS4gIFRoZSBSQVMKKwkJICogY2hhbm5lbCdzIGRhdGEgaXMgaGFuZGxlZCBhYm92ZSAtIGl0IGFsd2F5cyBnb2VzIHRocm91Z2gKKwkJICogcHBwX2dlbmVyaWMuCisJCSAqLworCQlpZiAodHR5ICYmIGNoYW5uZWxfaWR4ID09IElQV19DSEFOTkVMX1JBUworCQkJCSYmIChuZXR3b3JrLT5yYXNfY29udHJvbF9saW5lcyAmCisJCQkJCUlQV19DT05UUk9MX0xJTkVfRENEKSAhPSAwCisJCQkJJiYgaXB3aXJlbGVzc190dHlfaXNfbW9kZW0odHR5KSkgeworCQkJLyoKKwkJCSAqIElmIGRhdGEgY2FtZSBpbiBvbiB0aGUgUkFTIGNoYW5uZWwgYW5kIHRoaXMgdHR5IGlzCisJCQkgKiB0aGUgbW9kZW0gdHR5LCBhbmQgd2UgYXJlIG9ubGluZSwgdGhlbiB3ZSBzZW5kIGl0IHRvCisJCQkgKiB0aGUgUFBQIGxheWVyLgorCQkJICovCisJCQltdXRleF9sb2NrKCZuZXR3b3JrLT5jbG9zZV9sb2NrKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZuZXR3b3JrLT5zcGlubG9jaywgZmxhZ3MpOworCQkJaWYgKG5ldHdvcmstPnBwcF9jaGFubmVsICE9IE5VTEwpIHsKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmV0d29yay0+c3BpbmxvY2ssCisJCQkJCQlmbGFncyk7CisKKwkJCQkvKiBTZW5kIHRoZSBkYXRhIHRvIHRoZSBwcHBfZ2VuZXJpYyBtb2R1bGUuICovCisJCQkJc2tiID0gaXB3X3BhY2tldF9yZWNlaXZlZF9za2IoZGF0YSwgbGVuZ3RoKTsKKwkJCQlwcHBfaW5wdXQobmV0d29yay0+cHBwX2NoYW5uZWwsIHNrYik7CisJCQl9IGVsc2UKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXR3b3JrLT5zcGlubG9jaywKKwkJCQkJCWZsYWdzKTsKKwkJCW11dGV4X3VubG9jaygmbmV0d29yay0+Y2xvc2VfbG9jayk7CisJCX0KKwkJLyogT3RoZXJ3aXNlIHdlIHNlbmQgaXQgb3V0IHRoZSB0dHkuICovCisJCWVsc2UKKwkJCWlwd2lyZWxlc3NfdHR5X3JlY2VpdmVkKHR0eSwgZGF0YSwgbGVuZ3RoKTsKKwl9Cit9CisKK3N0cnVjdCBpcHdfbmV0d29yayAqaXB3aXJlbGVzc19uZXR3b3JrX2NyZWF0ZShzdHJ1Y3QgaXB3X2hhcmR3YXJlICpodykKK3sKKwlzdHJ1Y3QgaXB3X25ldHdvcmsgKm5ldHdvcmsgPQorCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgaXB3X25ldHdvcmspLCBHRlBfQVRPTUlDKTsKKworCWlmICghbmV0d29yaykKKwkJcmV0dXJuIE5VTEw7CisKKwlzcGluX2xvY2tfaW5pdCgmbmV0d29yay0+c3BpbmxvY2spOworCW11dGV4X2luaXQoJm5ldHdvcmstPmNsb3NlX2xvY2spOworCisJbmV0d29yay0+aGFyZHdhcmUgPSBodzsKKworCUlOSVRfV09SSygmbmV0d29yay0+d29ya19nb19vbmxpbmUsIGRvX2dvX29ubGluZSk7CisJSU5JVF9XT1JLKCZuZXR3b3JrLT53b3JrX2dvX29mZmxpbmUsIGRvX2dvX29mZmxpbmUpOworCisJaXB3aXJlbGVzc19hc3NvY2lhdGVfbmV0d29yayhodywgbmV0d29yayk7CisKKwlyZXR1cm4gbmV0d29yazsKK30KKwordm9pZCBpcHdpcmVsZXNzX25ldHdvcmtfZnJlZShzdHJ1Y3QgaXB3X25ldHdvcmsgKm5ldHdvcmspCit7CisJbmV0d29yay0+c2h1dHRpbmdfZG93biA9IDE7CisKKwlpcHdpcmVsZXNzX3BwcF9jbG9zZShuZXR3b3JrKTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJaXB3aXJlbGVzc19zdG9wX2ludGVycnVwdHMobmV0d29yay0+aGFyZHdhcmUpOworCWlwd2lyZWxlc3NfYXNzb2NpYXRlX25ldHdvcmsobmV0d29yay0+aGFyZHdhcmUsIE5VTEwpOworCisJa2ZyZWUobmV0d29yayk7Cit9CisKK3ZvaWQgaXB3aXJlbGVzc19hc3NvY2lhdGVfbmV0d29ya190dHkoc3RydWN0IGlwd19uZXR3b3JrICpuZXR3b3JrLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBjaGFubmVsX2lkeCwKKwkJCQkgICAgICBzdHJ1Y3QgaXB3X3R0eSAqdHR5KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9BU1NPQ0lBVEVEX1RUWVM7IGkrKykKKwkJaWYgKG5ldHdvcmstPmFzc29jaWF0ZWRfdHR5c1tjaGFubmVsX2lkeF1baV0gPT0gTlVMTCkgeworCQkJbmV0d29yay0+YXNzb2NpYXRlZF90dHlzW2NoYW5uZWxfaWR4XVtpXSA9IHR0eTsKKwkJCWJyZWFrOworCQl9Cit9CisKK3ZvaWQgaXB3aXJlbGVzc19kaXNhc3NvY2lhdGVfbmV0d29ya190dHlzKHN0cnVjdCBpcHdfbmV0d29yayAqbmV0d29yaywKKwkJCQkJICB1bnNpZ25lZCBpbnQgY2hhbm5lbF9pZHgpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0FTU09DSUFURURfVFRZUzsgaSsrKQorCQluZXR3b3JrLT5hc3NvY2lhdGVkX3R0eXNbY2hhbm5lbF9pZHhdW2ldID0gTlVMTDsKK30KKwordm9pZCBpcHdpcmVsZXNzX3BwcF9vcGVuKHN0cnVjdCBpcHdfbmV0d29yayAqbmV0d29yaykKK3sKKwlpZiAoaXB3aXJlbGVzc19kZWJ1ZykKKwkJcHJpbnRrKEtFUk5fREVCVUcgSVBXSVJFTEVTU19QQ0NBUkRfTkFNRSAiOiBvbmxpbmVcbiIpOworCXNjaGVkdWxlX3dvcmsoJm5ldHdvcmstPndvcmtfZ29fb25saW5lKTsKK30KKwordm9pZCBpcHdpcmVsZXNzX3BwcF9jbG9zZShzdHJ1Y3QgaXB3X25ldHdvcmsgKm5ldHdvcmspCit7CisJLyogRGlzY29ubmVjdCBmcm9tIHRoZSB3aXJlbGVzcyBuZXR3b3JrLiAqLworCWlmIChpcHdpcmVsZXNzX2RlYnVnKQorCQlwcmludGsoS0VSTl9ERUJVRyBJUFdJUkVMRVNTX1BDQ0FSRF9OQU1FICI6IG9mZmxpbmVcbiIpOworCXNjaGVkdWxlX3dvcmsoJm5ldHdvcmstPndvcmtfZ29fb2ZmbGluZSk7Cit9CisKK2ludCBpcHdpcmVsZXNzX3BwcF9jaGFubmVsX2luZGV4KHN0cnVjdCBpcHdfbmV0d29yayAqbmV0d29yaykKK3sKKwlpbnQgcmV0ID0gLTE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZuZXR3b3JrLT5zcGlubG9jaywgZmxhZ3MpOworCWlmIChuZXR3b3JrLT5wcHBfY2hhbm5lbCAhPSBOVUxMKQorCQlyZXQgPSBwcHBfY2hhbm5lbF9pbmRleChuZXR3b3JrLT5wcHBfY2hhbm5lbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmV0d29yay0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBpcHdpcmVsZXNzX3BwcF91bml0X251bWJlcihzdHJ1Y3QgaXB3X25ldHdvcmsgKm5ldHdvcmspCit7CisJaW50IHJldCA9IC0xOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbmV0d29yay0+c3BpbmxvY2ssIGZsYWdzKTsKKwlpZiAobmV0d29yay0+cHBwX2NoYW5uZWwgIT0gTlVMTCkKKwkJcmV0ID0gcHBwX3VuaXRfbnVtYmVyKG5ldHdvcmstPnBwcF9jaGFubmVsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXR3b3JrLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wY21jaWEvaXB3aXJlbGVzcy9uZXR3b3JrLmggYi9kcml2ZXJzL2NoYXIvcGNtY2lhL2lwd2lyZWxlc3MvbmV0d29yay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZTFlOTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL2lwd2lyZWxlc3MvbmV0d29yay5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBJUFdpcmVsZXNzIDNHIFBDTUNJQSBOZXR3b3JrIERyaXZlcgorICoKKyAqIE9yaWdpbmFsIGNvZGUKKyAqICAgYnkgU3RlcGhlbiBCbGFja2hlYXRoIDxzdGVwaGVuQGJsYWNrc2FwcGhpcmUuY29tPiwKKyAqICAgICAgQmVuIE1hcnRlbCA8YmVubUBzeW1tZXRyaWMuY28ubno+CisgKgorICogQ29weXJpZ2h0ZWQgYXMgZm9sbG93czoKKyAqICAgQ29weXJpZ2h0IChDKSAyMDA0IGJ5IFN5bW1ldHJpYyBTeXN0ZW1zIEx0ZCAoTlopCisgKgorICogVmFyaW91cyBkcml2ZXIgY2hhbmdlcyBhbmQgcmV3cml0ZXMsIHBvcnQgdG8gbmV3IGtlcm5lbHMKKyAqICAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgSmlyaSBLb3NpbmEKKyAqCisgKiBNaXNjIGNvZGUgY2xlYW51cHMgYW5kIHVwZGF0ZXMKKyAqICAgQ29weXJpZ2h0IChDKSAyMDA3IERhdmlkIFN0ZXJiYQorICovCisKKyNpZm5kZWYgX0lQV0lSRUxFU1NfQ1NfTkVUV09SS19IXworI2RlZmluZSBfSVBXSVJFTEVTU19DU19ORVRXT1JLX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3QgaXB3X25ldHdvcms7CitzdHJ1Y3QgaXB3X3R0eTsKK3N0cnVjdCBpcHdfaGFyZHdhcmU7CisKKy8qIERlZmluaXRpb25zIG9mIHRoZSBkaWZmZXJlbnQgY2hhbm5lbHMgb24gdGhlIFBDTUNJQSBVRSAqLworI2RlZmluZSBJUFdfQ0hBTk5FTF9SQVMgICAgICAwCisjZGVmaW5lIElQV19DSEFOTkVMX0RJQUxMRVIgIDEKKyNkZWZpbmUgSVBXX0NIQU5ORUxfQ09OU09MRSAgMgorI2RlZmluZSBOT19PRl9JUFdfQ0hBTk5FTFMgICA1CisKK3ZvaWQgaXB3aXJlbGVzc19uZXR3b3JrX25vdGlmeV9jb250cm9sX2xpbmVfY2hhbmdlKHN0cnVjdCBpcHdfbmV0d29yayAqbmV0LAorCQl1bnNpZ25lZCBpbnQgY2hhbm5lbF9pZHgsIHVuc2lnbmVkIGludCBjb250cm9sX2xpbmVzLAorCQl1bnNpZ25lZCBpbnQgY29udHJvbF9tYXNrKTsKK3ZvaWQgaXB3aXJlbGVzc19uZXR3b3JrX3BhY2tldF9yZWNlaXZlZChzdHJ1Y3QgaXB3X25ldHdvcmsgKm5ldCwKKwkJdW5zaWduZWQgaW50IGNoYW5uZWxfaWR4LCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQl1bnNpZ25lZCBpbnQgbGVuZ3RoKTsKK3N0cnVjdCBpcHdfbmV0d29yayAqaXB3aXJlbGVzc19uZXR3b3JrX2NyZWF0ZShzdHJ1Y3QgaXB3X2hhcmR3YXJlICpodyk7Cit2b2lkIGlwd2lyZWxlc3NfbmV0d29ya19mcmVlKHN0cnVjdCBpcHdfbmV0d29yayAqbmV0KTsKK3ZvaWQgaXB3aXJlbGVzc19hc3NvY2lhdGVfbmV0d29ya190dHkoc3RydWN0IGlwd19uZXR3b3JrICpuZXQsCisJCXVuc2lnbmVkIGludCBjaGFubmVsX2lkeCwgc3RydWN0IGlwd190dHkgKnR0eSk7Cit2b2lkIGlwd2lyZWxlc3NfZGlzYXNzb2NpYXRlX25ldHdvcmtfdHR5cyhzdHJ1Y3QgaXB3X25ldHdvcmsgKm5ldCwKKwkJdW5zaWduZWQgaW50IGNoYW5uZWxfaWR4KTsKKwordm9pZCBpcHdpcmVsZXNzX3BwcF9vcGVuKHN0cnVjdCBpcHdfbmV0d29yayAqbmV0KTsKKwordm9pZCBpcHdpcmVsZXNzX3BwcF9jbG9zZShzdHJ1Y3QgaXB3X25ldHdvcmsgKm5ldCk7CitpbnQgaXB3aXJlbGVzc19wcHBfY2hhbm5lbF9pbmRleChzdHJ1Y3QgaXB3X25ldHdvcmsgKm5ldCk7CitpbnQgaXB3aXJlbGVzc19wcHBfdW5pdF9udW1iZXIoc3RydWN0IGlwd19uZXR3b3JrICpuZXQpOworCitpbnQgaXB3aXJlbGVzc19kdW1wX25ldHdvcmtfc3RhdGUoY2hhciAqcCwgc2l6ZV90IGxpbWl0LAorCQkJCSAgc3RydWN0IGlwd19uZXR3b3JrICpuZXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wY21jaWEvaXB3aXJlbGVzcy9zZXR1cF9wcm90b2NvbC5oIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9pcHdpcmVsZXNzL3NldHVwX3Byb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ2YmNjNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9wY21jaWEvaXB3aXJlbGVzcy9zZXR1cF9wcm90b2NvbC5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogSVBXaXJlbGVzcyAzRyBQQ01DSUEgTmV0d29yayBEcml2ZXIKKyAqCisgKiBPcmlnaW5hbCBjb2RlCisgKiAgIGJ5IFN0ZXBoZW4gQmxhY2toZWF0aCA8c3RlcGhlbkBibGFja3NhcHBoaXJlLmNvbT4sCisgKiAgICAgIEJlbiBNYXJ0ZWwgPGJlbm1Ac3ltbWV0cmljLmNvLm56PgorICoKKyAqIENvcHlyaWdodGVkIGFzIGZvbGxvd3M6CisgKiAgIENvcHlyaWdodCAoQykgMjAwNCBieSBTeW1tZXRyaWMgU3lzdGVtcyBMdGQgKE5aKQorICoKKyAqIFZhcmlvdXMgZHJpdmVyIGNoYW5nZXMgYW5kIHJld3JpdGVzLCBwb3J0IHRvIG5ldyBrZXJuZWxzCisgKiAgIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IEppcmkgS29zaW5hCisgKgorICogTWlzYyBjb2RlIGNsZWFudXBzIGFuZCB1cGRhdGVzCisgKiAgIENvcHlyaWdodCAoQykgMjAwNyBEYXZpZCBTdGVyYmEKKyAqLworCisjaWZuZGVmIF9JUFdJUkVMRVNTX0NTX1NFVFVQX1BST1RPQ09MX0hfCisjZGVmaW5lIF9JUFdJUkVMRVNTX0NTX1NFVFVQX1BST1RPQ09MX0hfCisKKy8qIFZlcnNpb24gb2YgdGhlIHNldHVwIHByb3RvY29sIGFuZCB0cmFuc3BvcnQgcHJvdG9jb2xzICovCisjZGVmaW5lIFRMX1NFVFVQX1ZFUlNJT04JCTEKKworI2RlZmluZSBUTF9TRVRVUF9WRVJTSU9OX1FSWV9UTU8JMTAwMAorI2RlZmluZSBUTF9TRVRVUF9NQVhfVkVSU0lPTl9RUlkJMzAKKworLyogTWVzc2FnZSBudW1iZXJzIDAtOSBhcmUgb2Jzb2xldGVkIGFuZCBtdXN0IG5vdCBiZSByZXVzZWQhICovCisjZGVmaW5lIFRMX1NFVFVQX1NJR05PX0dFVF9WRVJTSU9OX1FSWQkxMAorI2RlZmluZSBUTF9TRVRVUF9TSUdOT19HRVRfVkVSU0lPTl9SU1AJMTEKKyNkZWZpbmUgVExfU0VUVVBfU0lHTk9fQ09ORklHX01TRwkxMgorI2RlZmluZSBUTF9TRVRVUF9TSUdOT19DT05GSUdfRE9ORV9NU0cJMTMKKyNkZWZpbmUgVExfU0VUVVBfU0lHTk9fT1BFTl9NU0cJCTE0CisjZGVmaW5lIFRMX1NFVFVQX1NJR05PX0NMT1NFX01TRwkxNQorCisjZGVmaW5lIFRMX1NFVFVQX1NJR05PX0lORk9fTVNHICAgICAyMAorI2RlZmluZSBUTF9TRVRVUF9TSUdOT19JTkZPX01TR19BQ0sgMjEKKworI2RlZmluZSBUTF9TRVRVUF9TSUdOT19SRUJPT1RfTVNHICAgICAgMjIKKyNkZWZpbmUgVExfU0VUVVBfU0lHTk9fUkVCT09UX01TR19BQ0sgIDIzCisKKy8qIFN5bmNocm9ub3VzIHN0YXJ0LW1lc3NhZ2VzICovCitzdHJ1Y3QgdGxfc2V0dXBfZ2V0X3ZlcnNpb25fcXJ5IHsKKwl1bnNpZ25lZCBjaGFyIHNpZ19ubzsJCS8qIFRMX1NFVFVQX1NJR05PX0dFVF9WRVJTSU9OX1FSWSAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdHJ1Y3QgdGxfc2V0dXBfZ2V0X3ZlcnNpb25fcnNwIHsKKwl1bnNpZ25lZCBjaGFyIHNpZ19ubzsJCS8qIFRMX1NFVFVQX1NJR05PX0dFVF9WRVJTSU9OX1JTUCAqLworCXVuc2lnbmVkIGNoYXIgdmVyc2lvbjsJCS8qIFRMX1NFVFVQX1ZFUlNJT04gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IHRsX3NldHVwX2NvbmZpZ19tc2cgeworCXVuc2lnbmVkIGNoYXIgc2lnX25vOwkJLyogVExfU0VUVVBfU0lHTk9fQ09ORklHX01TRyAqLworCXVuc2lnbmVkIGNoYXIgcG9ydF9ubzsKKwl1bnNpZ25lZCBjaGFyIHByaW9fZGF0YTsKKwl1bnNpZ25lZCBjaGFyIHByaW9fY3RybDsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IHRsX3NldHVwX2NvbmZpZ19kb25lX21zZyB7CisJdW5zaWduZWQgY2hhciBzaWdfbm87CQkvKiBUTF9TRVRVUF9TSUdOT19DT05GSUdfRE9ORV9NU0cgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworLyogQXN5bmNyb25vdXMgbWVzc2FnZXMgKi8KK3N0cnVjdCB0bF9zZXR1cF9vcGVuX21zZyB7CisJdW5zaWduZWQgY2hhciBzaWdfbm87CQkvKiBUTF9TRVRVUF9TSUdOT19PUEVOX01TRyAqLworCXVuc2lnbmVkIGNoYXIgcG9ydF9ubzsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IHRsX3NldHVwX2Nsb3NlX21zZyB7CisJdW5zaWduZWQgY2hhciBzaWdfbm87CQkvKiBUTF9TRVRVUF9TSUdOT19DTE9TRV9NU0cgKi8KKwl1bnNpZ25lZCBjaGFyIHBvcnRfbm87Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKKy8qIERyaXZlciB0eXBlICAtIGZvciB1c2UgaW4gdGxfc2V0dXBfaW5mb19tc2cuZHJpdmVyX3R5cGUgKi8KKyNkZWZpbmUgQ09NTV9EUklWRVIgICAgIDAKKyNkZWZpbmUgTkRJU1dBTl9EUklWRVIgIDEKKyNkZWZpbmUgTkRJU1dBTl9EUklWRVJfTUFKT1JfVkVSU0lPTiAgMgorI2RlZmluZSBORElTV0FOX0RSSVZFUl9NSU5PUl9WRVJTSU9OICAwCisKKy8qCisgKiBJdCBzaG91bGQgbm90IG1hdHRlciB3aGVuIHRoaXMgbWVzc2FnZSBjb21lcyBvdmVyIGFzIHdlIGp1c3Qgc3RvcmUgdGhlCisgKiByZXN1bHRzIGFuZCBzZW5kIHRoZSBBQ0suCisgKi8KK3N0cnVjdCB0bF9zZXR1cF9pbmZvX21zZyB7CisJdW5zaWduZWQgY2hhciBzaWdfbm87CQkvKiBUTF9TRVRVUF9TSUdOT19JTkZPX01TRyAqLworCXVuc2lnbmVkIGNoYXIgZHJpdmVyX3R5cGU7CisJdW5zaWduZWQgY2hhciBtYWpvcl92ZXJzaW9uOworCXVuc2lnbmVkIGNoYXIgbWlub3JfdmVyc2lvbjsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IHRsX3NldHVwX2luZm9fbXNnQWNrIHsKKwl1bnNpZ25lZCBjaGFyIHNpZ19ubzsJCS8qIFRMX1NFVFVQX1NJR05PX0lORk9fTVNHX0FDSyAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdHJ1Y3QgVGxTZXR1cFJlYm9vdE1zZ0FjayB7CisJdW5zaWduZWQgY2hhciBzaWdfbm87CQkvKiBUTF9TRVRVUF9TSUdOT19SRUJPT1RfTVNHX0FDSyAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCisvKiBEZWZpbmUgYSB1bmlvbiBvZiBhbGwgdGhlIG1zZ3MgdGhhdCB0aGUgZHJpdmVyIGNhbiByZWNlaXZlIGZyb20gdGhlIGNhcmQuKi8KK3VuaW9uIGlwd19zZXR1cF9yeF9tc2cgeworCXVuc2lnbmVkIGNoYXIgc2lnX25vOworCXN0cnVjdCB0bF9zZXR1cF9nZXRfdmVyc2lvbl9yc3AgdmVyc2lvbl9yc3BfbXNnOworCXN0cnVjdCB0bF9zZXR1cF9vcGVuX21zZyBvcGVuX21zZzsKKwlzdHJ1Y3QgdGxfc2V0dXBfY2xvc2VfbXNnIGNsb3NlX21zZzsKKwlzdHJ1Y3QgdGxfc2V0dXBfaW5mb19tc2cgSW5mb01zZzsKKwlzdHJ1Y3QgdGxfc2V0dXBfaW5mb19tc2dBY2sgaW5mb19tc2dfYWNrOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCisjZW5kaWYJCQkJLyogX0lQV0lSRUxFU1NfQ1NfU0VUVVBfUFJPVE9DT0xfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wY21jaWEvaXB3aXJlbGVzcy90dHkuYyBiL2RyaXZlcnMvY2hhci9wY21jaWEvaXB3aXJlbGVzcy90dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmYzODE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9pcHdpcmVsZXNzL3R0eS5jCkBAIC0wLDAgKzEsNjg4IEBACisvKgorICogSVBXaXJlbGVzcyAzRyBQQ01DSUEgTmV0d29yayBEcml2ZXIKKyAqCisgKiBPcmlnaW5hbCBjb2RlCisgKiAgIGJ5IFN0ZXBoZW4gQmxhY2toZWF0aCA8c3RlcGhlbkBibGFja3NhcHBoaXJlLmNvbT4sCisgKiAgICAgIEJlbiBNYXJ0ZWwgPGJlbm1Ac3ltbWV0cmljLmNvLm56PgorICoKKyAqIENvcHlyaWdodGVkIGFzIGZvbGxvd3M6CisgKiAgIENvcHlyaWdodCAoQykgMjAwNCBieSBTeW1tZXRyaWMgU3lzdGVtcyBMdGQgKE5aKQorICoKKyAqIFZhcmlvdXMgZHJpdmVyIGNoYW5nZXMgYW5kIHJld3JpdGVzLCBwb3J0IHRvIG5ldyBrZXJuZWxzCisgKiAgIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IEppcmkgS29zaW5hCisgKgorICogTWlzYyBjb2RlIGNsZWFudXBzIGFuZCB1cGRhdGVzCisgKiAgIENvcHlyaWdodCAoQykgMjAwNyBEYXZpZCBTdGVyYmEKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvcHBwX2RlZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3BwcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlICJ0dHkuaCIKKyNpbmNsdWRlICJuZXR3b3JrLmgiCisjaW5jbHVkZSAiaGFyZHdhcmUuaCIKKyNpbmNsdWRlICJtYWluLmgiCisKKyNkZWZpbmUgSVBXSVJFTEVTU19QQ01DSUFfU1RBUlQgCSgwKQorI2RlZmluZSBJUFdJUkVMRVNTX1BDTUNJQV9NSU5PUlMJKDI0KQorI2RlZmluZSBJUFdJUkVMRVNTX1BDTUNJQV9NSU5PUl9SQU5HRQkoOCkKKworI2RlZmluZSBUVFlUWVBFX01PREVNICAgICgwKQorI2RlZmluZSBUVFlUWVBFX01PTklUT1IgICgxKQorI2RlZmluZSBUVFlUWVBFX1JBU19SQVcgICgyKQorCitzdHJ1Y3QgaXB3X3R0eSB7CisJaW50IGluZGV4OworCXN0cnVjdCBpcHdfaGFyZHdhcmUgKmhhcmR3YXJlOworCXVuc2lnbmVkIGludCBjaGFubmVsX2lkeDsKKwl1bnNpZ25lZCBpbnQgc2Vjb25kYXJ5X2NoYW5uZWxfaWR4OworCWludCB0dHlfdHlwZTsKKwlzdHJ1Y3QgaXB3X25ldHdvcmsgKm5ldHdvcms7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKmxpbnV4X3R0eTsKKwlpbnQgb3Blbl9jb3VudDsKKwl1bnNpZ25lZCBpbnQgY29udHJvbF9saW5lczsKKwlzdHJ1Y3QgbXV0ZXggaXB3X3R0eV9tdXRleDsKKwlpbnQgdHhfYnl0ZXNfcXVldWVkOworCWludCBjbG9zaW5nOworfTsKKworc3RhdGljIHN0cnVjdCBpcHdfdHR5ICp0dHlzW0lQV0lSRUxFU1NfUENNQ0lBX01JTk9SU107CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqaXB3X3R0eV9kcml2ZXI7CisKK3N0YXRpYyBjaGFyICp0dHlfdHlwZV9uYW1lKGludCB0dHlfdHlwZSkKK3sKKwlzdGF0aWMgY2hhciAqY2hhbm5lbF9uYW1lc1tdID0geworCQkibW9kZW0iLAorCQkibW9uaXRvciIsCisJCSJSQVMtcmF3IgorCX07CisKKwlyZXR1cm4gY2hhbm5lbF9uYW1lc1t0dHlfdHlwZV07Cit9CisKK3N0YXRpYyB2b2lkIHJlcG9ydF9yZWdpc3RlcmluZyhzdHJ1Y3QgaXB3X3R0eSAqdHR5KQoreworCWNoYXIgKmlmdHlwZSA9IHR0eV90eXBlX25hbWUodHR5LT50dHlfdHlwZSk7CisKKwlwcmludGsoS0VSTl9JTkZPIElQV0lSRUxFU1NfUENDQVJEX05BTUUKKwkgICAgICAgIjogcmVnaXN0ZXJpbmcgJXMgZGV2aWNlIHR0eUlQV3AlZFxuIiwgaWZ0eXBlLCB0dHktPmluZGV4KTsKK30KKworc3RhdGljIHZvaWQgcmVwb3J0X2RlcmVnaXN0ZXJpbmcoc3RydWN0IGlwd190dHkgKnR0eSkKK3sKKwljaGFyICppZnR5cGUgPSB0dHlfdHlwZV9uYW1lKHR0eS0+dHR5X3R5cGUpOworCisJcHJpbnRrKEtFUk5fSU5GTyBJUFdJUkVMRVNTX1BDQ0FSRF9OQU1FCisJICAgICAgICI6IGRlcmVnaXN0ZXJpbmcgJXMgZGV2aWNlIHR0eUlQV3AlZFxuIiwgaWZ0eXBlLAorCSAgICAgICB0dHktPmluZGV4KTsKK30KKworc3RhdGljIHN0cnVjdCBpcHdfdHR5ICpnZXRfdHR5KGludCBtaW5vcikKK3sKKwlpZiAobWlub3IgPCBpcHdfdHR5X2RyaXZlci0+bWlub3Jfc3RhcnQKKwkJCXx8IG1pbm9yID49IGlwd190dHlfZHJpdmVyLT5taW5vcl9zdGFydCArCisJCQlJUFdJUkVMRVNTX1BDTUNJQV9NSU5PUlMpCisJCXJldHVybiBOVUxMOworCWVsc2UgeworCQlpbnQgbWlub3Jfb2Zmc2V0ID0gbWlub3IgLSBpcHdfdHR5X2RyaXZlci0+bWlub3Jfc3RhcnQ7CisKKwkJLyoKKwkJICogVGhlICdyYXNfcmF3JyBjaGFubmVsIGlzIG9ubHkgYXZhaWxhYmxlIHdoZW4gJ2xvb3BiYWNrJyBtb2RlCisJCSAqIGlzIGVuYWJsZWQuCisJCSAqIE51bWJlciBvZiBtaW5vciBzdGFydHMgd2l0aCAxNiAoX1JBTkdFICogX1JBU19SQVcpLgorCQkgKi8KKwkJaWYgKCFpcHdpcmVsZXNzX2xvb3BiYWNrICYmCisJCQkJbWlub3Jfb2Zmc2V0ID49CisJCQkJIElQV0lSRUxFU1NfUENNQ0lBX01JTk9SX1JBTkdFICogVFRZVFlQRV9SQVNfUkFXKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJcmV0dXJuIHR0eXNbbWlub3Jfb2Zmc2V0XTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaXB3X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKmxpbnV4X3R0eSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJaW50IG1pbm9yID0gbGludXhfdHR5LT5pbmRleDsKKwlzdHJ1Y3QgaXB3X3R0eSAqdHR5ID0gZ2V0X3R0eShtaW5vcik7CisKKwlpZiAoIXR0eSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltdXRleF9sb2NrKCZ0dHktPmlwd190dHlfbXV0ZXgpOworCisJaWYgKHR0eS0+Y2xvc2luZykgeworCQltdXRleF91bmxvY2soJnR0eS0+aXB3X3R0eV9tdXRleCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAodHR5LT5vcGVuX2NvdW50ID09IDApCisJCXR0eS0+dHhfYnl0ZXNfcXVldWVkID0gMDsKKworCXR0eS0+b3Blbl9jb3VudCsrOworCisJdHR5LT5saW51eF90dHkgPSBsaW51eF90dHk7CisJbGludXhfdHR5LT5kcml2ZXJfZGF0YSA9IHR0eTsKKwlsaW51eF90dHktPmxvd19sYXRlbmN5ID0gMTsKKworCWlmICh0dHktPnR0eV90eXBlID09IFRUWVRZUEVfTU9ERU0pCisJCWlwd2lyZWxlc3NfcHBwX29wZW4odHR5LT5uZXR3b3JrKTsKKworCW11dGV4X3VubG9jaygmdHR5LT5pcHdfdHR5X211dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkb19pcHdfY2xvc2Uoc3RydWN0IGlwd190dHkgKnR0eSkKK3sKKwl0dHktPm9wZW5fY291bnQtLTsKKworCWlmICh0dHktPm9wZW5fY291bnQgPT0gMCkgeworCQlzdHJ1Y3QgdHR5X3N0cnVjdCAqbGludXhfdHR5ID0gdHR5LT5saW51eF90dHk7CisKKwkJaWYgKGxpbnV4X3R0eSAhPSBOVUxMKSB7CisJCQl0dHktPmxpbnV4X3R0eSA9IE5VTEw7CisJCQlsaW51eF90dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKKworCQkJaWYgKHR0eS0+dHR5X3R5cGUgPT0gVFRZVFlQRV9NT0RFTSkKKwkJCQlpcHdpcmVsZXNzX3BwcF9jbG9zZSh0dHktPm5ldHdvcmspOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBpcHdfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICpsaW51eF90dHkpCit7CisJc3RydWN0IGlwd190dHkgKnR0eSA9IGxpbnV4X3R0eS0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoIXR0eSkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmdHR5LT5pcHdfdHR5X211dGV4KTsKKwlpZiAodHR5LT5vcGVuX2NvdW50ID09IDApIHsKKwkJbXV0ZXhfdW5sb2NrKCZ0dHktPmlwd190dHlfbXV0ZXgpOworCQlyZXR1cm47CisJfQorCisJZG9faXB3X2Nsb3NlKHR0eSk7CisKKwltdXRleF91bmxvY2soJnR0eS0+aXB3X3R0eV9tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIGlwd19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqbGludXhfdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlpcHdfaGFuZ3VwKGxpbnV4X3R0eSk7Cit9CisKKy8qIFRha2UgZGF0YSByZWNlaXZlZCBmcm9tIGhhcmR3YXJlLCBhbmQgc2VuZCBpdCBvdXQgdGhlIHR0eSAqLwordm9pZCBpcHdpcmVsZXNzX3R0eV9yZWNlaXZlZChzdHJ1Y3QgaXB3X3R0eSAqdHR5LCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqbGludXhfdHR5OworCWludCB3b3JrID0gMDsKKworCW11dGV4X2xvY2soJnR0eS0+aXB3X3R0eV9tdXRleCk7CisJbGludXhfdHR5ID0gdHR5LT5saW51eF90dHk7CisJaWYgKGxpbnV4X3R0eSA9PSBOVUxMKSB7CisJCW11dGV4X3VubG9jaygmdHR5LT5pcHdfdHR5X211dGV4KTsKKwkJcmV0dXJuOworCX0KKworCWlmICghdHR5LT5vcGVuX2NvdW50KSB7CisJCW11dGV4X3VubG9jaygmdHR5LT5pcHdfdHR5X211dGV4KTsKKwkJcmV0dXJuOworCX0KKwltdXRleF91bmxvY2soJnR0eS0+aXB3X3R0eV9tdXRleCk7CisKKwl3b3JrID0gdHR5X2luc2VydF9mbGlwX3N0cmluZyhsaW51eF90dHksIGRhdGEsIGxlbmd0aCk7CisKKwlpZiAod29yayAhPSBsZW5ndGgpCisJCXByaW50ayhLRVJOX0RFQlVHIElQV0lSRUxFU1NfUENDQVJEX05BTUUKKwkJCQkiOiAlZCBjaGFycyBub3QgaW5zZXJ0ZWQgdG8gZmxpcCBidWZmZXIhXG4iLAorCQkJCWxlbmd0aCAtIHdvcmspOworCisJLyoKKwkgKiBUaGlzIG1heSBzbGVlcCBpZiAtPmxvd19sYXRlbmN5IGlzIHNldAorCSAqLworCWlmICh3b3JrKQorCQl0dHlfZmxpcF9idWZmZXJfcHVzaChsaW51eF90dHkpOworfQorCitzdGF0aWMgdm9pZCBpcHdfd3JpdGVfcGFja2V0X3NlbnRfY2FsbGJhY2sodm9pZCAqY2FsbGJhY2tfZGF0YSwKKwkJCQkJICAgdW5zaWduZWQgaW50IHBhY2tldF9sZW5ndGgpCit7CisJc3RydWN0IGlwd190dHkgKnR0eSA9IGNhbGxiYWNrX2RhdGE7CisKKwkvKgorCSAqIFBhY2tldCBoYXMgYmVlbiBzZW50LCBzbyB3ZSBzdWJ0cmFjdCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gb3VyCisJICogdGFsbHkgb2Ygb3V0c3RhbmRpbmcgVFggYnl0ZXMuCisJICovCisJdHR5LT50eF9ieXRlc19xdWV1ZWQgLT0gcGFja2V0X2xlbmd0aDsKK30KKworc3RhdGljIGludCBpcHdfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKmxpbnV4X3R0eSwKKwkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgaXB3X3R0eSAqdHR5ID0gbGludXhfdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgcm9vbSwgcmV0OworCisJaWYgKCF0dHkpCisJCXJldHVybiAtRU5PREVWOworCisJbXV0ZXhfbG9jaygmdHR5LT5pcHdfdHR5X211dGV4KTsKKwlpZiAoIXR0eS0+b3Blbl9jb3VudCkgeworCQltdXRleF91bmxvY2soJnR0eS0+aXB3X3R0eV9tdXRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJvb20gPSBJUFdJUkVMRVNTX1RYX1FVRVVFX1NJWkUgLSB0dHktPnR4X2J5dGVzX3F1ZXVlZDsKKwlpZiAocm9vbSA8IDApCisJCXJvb20gPSAwOworCS8qIERvbid0IGFsbG93IGNhbGxlciB0byB3cml0ZSBhbnkgbW9yZSB0aGFuIHdlIGhhdmUgcm9vbSBmb3IgKi8KKwlpZiAoY291bnQgPiByb29tKQorCQljb3VudCA9IHJvb207CisKKwlpZiAoY291bnQgPT0gMCkgeworCQltdXRleF91bmxvY2soJnR0eS0+aXB3X3R0eV9tdXRleCk7CisJCXJldHVybiAwOworCX0KKworCXJldCA9IGlwd2lyZWxlc3Nfc2VuZF9wYWNrZXQodHR5LT5oYXJkd2FyZSwgSVBXX0NIQU5ORUxfUkFTLAorCQkJICAgICAgICh1bnNpZ25lZCBjaGFyICopIGJ1ZiwgY291bnQsCisJCQkgICAgICAgaXB3X3dyaXRlX3BhY2tldF9zZW50X2NhbGxiYWNrLCB0dHkpOworCWlmIChyZXQgPT0gLTEpIHsKKwkJbXV0ZXhfdW5sb2NrKCZ0dHktPmlwd190dHlfbXV0ZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwl0dHktPnR4X2J5dGVzX3F1ZXVlZCArPSBjb3VudDsKKwltdXRleF91bmxvY2soJnR0eS0+aXB3X3R0eV9tdXRleCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgaXB3X3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKmxpbnV4X3R0eSkKK3sKKwlzdHJ1Y3QgaXB3X3R0eSAqdHR5ID0gbGludXhfdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgcm9vbTsKKworCWlmICghdHR5KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghdHR5LT5vcGVuX2NvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJvb20gPSBJUFdJUkVMRVNTX1RYX1FVRVVFX1NJWkUgLSB0dHktPnR4X2J5dGVzX3F1ZXVlZDsKKwlpZiAocm9vbSA8IDApCisJCXJvb20gPSAwOworCisJcmV0dXJuIHJvb207Cit9CisKK3N0YXRpYyBpbnQgaXB3aXJlbGVzc19nZXRfc2VyaWFsX2luZm8oc3RydWN0IGlwd190dHkgKnR0eSwKKwkJCQkgICAgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnJldGluZm8pCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgdG1wOworCisJaWYgKCFyZXRpbmZvKQorCQlyZXR1cm4gKC1FRkFVTFQpOworCisJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKwl0bXAudHlwZSA9IFBPUlRfVU5LTk9XTjsKKwl0bXAubGluZSA9IHR0eS0+aW5kZXg7CisJdG1wLnBvcnQgPSAwOworCXRtcC5pcnEgPSAwOworCXRtcC5mbGFncyA9IDA7CisJdG1wLmJhdWRfYmFzZSA9IDExNTIwMDsKKwl0bXAuY2xvc2VfZGVsYXkgPSAwOworCXRtcC5jbG9zaW5nX3dhaXQgPSAwOworCXRtcC5jdXN0b21fZGl2aXNvciA9IDA7CisJdG1wLmh1YjYgPSAwOworCWlmIChjb3B5X3RvX3VzZXIocmV0aW5mbywgJnRtcCwgc2l6ZW9mKCpyZXRpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB3X2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqbGludXhfdHR5KQoreworCXN0cnVjdCBpcHdfdHR5ICp0dHkgPSBsaW51eF90dHktPmRyaXZlcl9kYXRhOworCisJaWYgKCF0dHkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCF0dHktPm9wZW5fY291bnQpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHR0eS0+dHhfYnl0ZXNfcXVldWVkOworfQorCitzdGF0aWMgaW50IGdldF9jb250cm9sX2xpbmVzKHN0cnVjdCBpcHdfdHR5ICp0dHkpCit7CisJdW5zaWduZWQgaW50IG15ID0gdHR5LT5jb250cm9sX2xpbmVzOworCXVuc2lnbmVkIGludCBvdXQgPSAwOworCisJaWYgKG15ICYgSVBXX0NPTlRST0xfTElORV9SVFMpCisJCW91dCB8PSBUSU9DTV9SVFM7CisJaWYgKG15ICYgSVBXX0NPTlRST0xfTElORV9EVFIpCisJCW91dCB8PSBUSU9DTV9EVFI7CisJaWYgKG15ICYgSVBXX0NPTlRST0xfTElORV9DVFMpCisJCW91dCB8PSBUSU9DTV9DVFM7CisJaWYgKG15ICYgSVBXX0NPTlRST0xfTElORV9EU1IpCisJCW91dCB8PSBUSU9DTV9EU1I7CisJaWYgKG15ICYgSVBXX0NPTlRST0xfTElORV9EQ0QpCisJCW91dCB8PSBUSU9DTV9DRDsKKworCXJldHVybiBvdXQ7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2NvbnRyb2xfbGluZXMoc3RydWN0IGlwd190dHkgKnR0eSwgdW5zaWduZWQgaW50IHNldCwKKwkJCSAgICAgdW5zaWduZWQgaW50IGNsZWFyKQoreworCWludCByZXQ7CisKKwlpZiAoc2V0ICYgVElPQ01fUlRTKSB7CisJCXJldCA9IGlwd2lyZWxlc3Nfc2V0X1JUUyh0dHktPmhhcmR3YXJlLCB0dHktPmNoYW5uZWxfaWR4LCAxKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWlmICh0dHktPnNlY29uZGFyeV9jaGFubmVsX2lkeCAhPSAtMSkgeworCQkJcmV0ID0gaXB3aXJlbGVzc19zZXRfUlRTKHR0eS0+aGFyZHdhcmUsCisJCQkJCSAgdHR5LT5zZWNvbmRhcnlfY2hhbm5lbF9pZHgsIDEpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCWlmIChzZXQgJiBUSU9DTV9EVFIpIHsKKwkJcmV0ID0gaXB3aXJlbGVzc19zZXRfRFRSKHR0eS0+aGFyZHdhcmUsIHR0eS0+Y2hhbm5lbF9pZHgsIDEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKHR0eS0+c2Vjb25kYXJ5X2NoYW5uZWxfaWR4ICE9IC0xKSB7CisJCQlyZXQgPSBpcHdpcmVsZXNzX3NldF9EVFIodHR5LT5oYXJkd2FyZSwKKwkJCQkJICB0dHktPnNlY29uZGFyeV9jaGFubmVsX2lkeCwgMSk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJaWYgKGNsZWFyICYgVElPQ01fUlRTKSB7CisJCXJldCA9IGlwd2lyZWxlc3Nfc2V0X1JUUyh0dHktPmhhcmR3YXJlLCB0dHktPmNoYW5uZWxfaWR4LCAwKTsKKwkJaWYgKHR0eS0+c2Vjb25kYXJ5X2NoYW5uZWxfaWR4ICE9IC0xKSB7CisJCQlyZXQgPSBpcHdpcmVsZXNzX3NldF9SVFModHR5LT5oYXJkd2FyZSwKKwkJCQkJICB0dHktPnNlY29uZGFyeV9jaGFubmVsX2lkeCwgMCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJaWYgKGNsZWFyICYgVElPQ01fRFRSKSB7CisJCXJldCA9IGlwd2lyZWxlc3Nfc2V0X0RUUih0dHktPmhhcmR3YXJlLCB0dHktPmNoYW5uZWxfaWR4LCAwKTsKKwkJaWYgKHR0eS0+c2Vjb25kYXJ5X2NoYW5uZWxfaWR4ICE9IC0xKSB7CisJCQlyZXQgPSBpcHdpcmVsZXNzX3NldF9EVFIodHR5LT5oYXJkd2FyZSwKKwkJCQkJICB0dHktPnNlY29uZGFyeV9jaGFubmVsX2lkeCwgMCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB3X3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICpsaW51eF90dHksIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBpcHdfdHR5ICp0dHkgPSBsaW51eF90dHktPmRyaXZlcl9kYXRhOworCisJaWYgKCF0dHkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCF0dHktPm9wZW5fY291bnQpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGdldF9jb250cm9sX2xpbmVzKHR0eSk7Cit9CisKK3N0YXRpYyBpbnQKK2lwd190aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqbGludXhfdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkgICAgIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKwlzdHJ1Y3QgaXB3X3R0eSAqdHR5ID0gbGludXhfdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmICghdHR5KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghdHR5LT5vcGVuX2NvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBzZXRfY29udHJvbF9saW5lcyh0dHksIHNldCwgY2xlYXIpOworfQorCitzdGF0aWMgaW50IGlwd19pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqbGludXhfdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaXB3X3R0eSAqdHR5ID0gbGludXhfdHR5LT5kcml2ZXJfZGF0YTsKKworCWlmICghdHR5KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghdHR5LT5vcGVuX2NvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUSU9DR1NFUklBTDoKKwkJcmV0dXJuIGlwd2lyZWxlc3NfZ2V0X3NlcmlhbF9pbmZvKHR0eSwgKHZvaWQgX191c2VyICopIGFyZyk7CisKKwljYXNlIFRJT0NTU0VSSUFMOgorCQlyZXR1cm4gMDsJLyogS2VlcHMgdGhlIFBDTUNJQSBzY3JpcHRzIGhhcHB5LiAqLworCX0KKworCWlmICh0dHktPnR0eV90eXBlID09IFRUWVRZUEVfTU9ERU0pIHsKKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBQUFBJT0NHQ0hBTjoKKwkJCXsKKwkJCQlpbnQgY2hhbiA9IGlwd2lyZWxlc3NfcHBwX2NoYW5uZWxfaW5kZXgoCisJCQkJCQkJdHR5LT5uZXR3b3JrKTsKKworCQkJCWlmIChjaGFuIDwgMCkKKwkJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQkJaWYgKHB1dF91c2VyKGNoYW4sIChpbnQgX191c2VyICopIGFyZykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBQUFBJT0NHVU5JVDoKKwkJCXsKKwkJCQlpbnQgdW5pdCA9IGlwd2lyZWxlc3NfcHBwX3VuaXRfbnVtYmVyKAorCQkJCQkJdHR5LT5uZXR3b3JrKTsKKworCQkJCWlmICh1bml0IDwgMCkKKwkJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQkJaWYgKHB1dF91c2VyKHVuaXQsIChpbnQgX191c2VyICopIGFyZykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBUQ0dFVFM6CisJCWNhc2UgVENHRVRBOgorCQkJcmV0dXJuIG5fdHR5X2lvY3RsKGxpbnV4X3R0eSwgZmlsZSwgY21kLCBhcmcpOworCisJCWNhc2UgVENGTFNIOgorCQkJcmV0dXJuIG5fdHR5X2lvY3RsKGxpbnV4X3R0eSwgZmlsZSwgY21kLCBhcmcpOworCisJCWNhc2UgRklPTlJFQUQ6CisJCQl7CisJCQkJaW50IHZhbCA9IDA7CisKKwkJCQlpZiAocHV0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKSBhcmcpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIC1FTk9JT0NUTENNRDsKK30KKworc3RhdGljIGludCBhZGRfdHR5KGRldl9ub2RlX3QgKm5vZGVzcCwgaW50IGosCisJCSAgICBzdHJ1Y3QgaXB3X2hhcmR3YXJlICpoYXJkd2FyZSwKKwkJICAgIHN0cnVjdCBpcHdfbmV0d29yayAqbmV0d29yaywgaW50IGNoYW5uZWxfaWR4LAorCQkgICAgaW50IHNlY29uZGFyeV9jaGFubmVsX2lkeCwgaW50IHR0eV90eXBlKQoreworCXR0eXNbal0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXB3X3R0eSksIEdGUF9LRVJORUwpOworCWlmICghdHR5c1tqXSkKKwkJcmV0dXJuIC1FTk9NRU07CisJdHR5c1tqXS0+aW5kZXggPSBqOworCXR0eXNbal0tPmhhcmR3YXJlID0gaGFyZHdhcmU7CisJdHR5c1tqXS0+Y2hhbm5lbF9pZHggPSBjaGFubmVsX2lkeDsKKwl0dHlzW2pdLT5zZWNvbmRhcnlfY2hhbm5lbF9pZHggPSBzZWNvbmRhcnlfY2hhbm5lbF9pZHg7CisJdHR5c1tqXS0+bmV0d29yayA9IG5ldHdvcms7CisJdHR5c1tqXS0+dHR5X3R5cGUgPSB0dHlfdHlwZTsKKwltdXRleF9pbml0KCZ0dHlzW2pdLT5pcHdfdHR5X211dGV4KTsKKworCXR0eV9yZWdpc3Rlcl9kZXZpY2UoaXB3X3R0eV9kcml2ZXIsIGosIE5VTEwpOworCWlwd2lyZWxlc3NfYXNzb2NpYXRlX25ldHdvcmtfdHR5KG5ldHdvcmssIGNoYW5uZWxfaWR4LCB0dHlzW2pdKTsKKworCWlmIChzZWNvbmRhcnlfY2hhbm5lbF9pZHggIT0gLTEpCisJCWlwd2lyZWxlc3NfYXNzb2NpYXRlX25ldHdvcmtfdHR5KG5ldHdvcmssCisJCQkJCQkgc2Vjb25kYXJ5X2NoYW5uZWxfaWR4LAorCQkJCQkJIHR0eXNbal0pOworCWlmIChub2Rlc3AgIT0gTlVMTCkgeworCQlzcHJpbnRmKG5vZGVzcC0+ZGV2X25hbWUsICJ0dHlJUFdwJWQiLCBqKTsKKwkJbm9kZXNwLT5tYWpvciA9IGlwd190dHlfZHJpdmVyLT5tYWpvcjsKKwkJbm9kZXNwLT5taW5vciA9IGogKyBpcHdfdHR5X2RyaXZlci0+bWlub3Jfc3RhcnQ7CisJfQorCWlmIChnZXRfdHR5KGogKyBpcHdfdHR5X2RyaXZlci0+bWlub3Jfc3RhcnQpID09IHR0eXNbal0pCisJCXJlcG9ydF9yZWdpc3RlcmluZyh0dHlzW2pdKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGlwd190dHkgKmlwd2lyZWxlc3NfdHR5X2NyZWF0ZShzdHJ1Y3QgaXB3X2hhcmR3YXJlICpoYXJkd2FyZSwKKwkJCQkgICAgICBzdHJ1Y3QgaXB3X25ldHdvcmsgKm5ldHdvcmssCisJCQkJICAgICAgZGV2X25vZGVfdCAqbm9kZXMpCit7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgSVBXSVJFTEVTU19QQ01DSUFfTUlOT1JfUkFOR0U7IGkrKykgeworCQlpbnQgYWxsZnJlZSA9IDE7CisKKwkJZm9yIChqID0gaTsgaiA8IElQV0lSRUxFU1NfUENNQ0lBX01JTk9SUzsKKwkJCQlqICs9IElQV0lSRUxFU1NfUENNQ0lBX01JTk9SX1JBTkdFKQorCQkJaWYgKHR0eXNbal0gIT0gTlVMTCkgeworCQkJCWFsbGZyZWUgPSAwOworCQkJCWJyZWFrOworCQkJfQorCisJCWlmIChhbGxmcmVlKSB7CisJCQlqID0gaTsKKworCQkJaWYgKGFkZF90dHkoJm5vZGVzWzBdLCBqLCBoYXJkd2FyZSwgbmV0d29yaywKKwkJCQkJSVBXX0NIQU5ORUxfRElBTExFUiwgSVBXX0NIQU5ORUxfUkFTLAorCQkJCQlUVFlUWVBFX01PREVNKSkKKwkJCQlyZXR1cm4gTlVMTDsKKworCQkJaiArPSBJUFdJUkVMRVNTX1BDTUNJQV9NSU5PUl9SQU5HRTsKKwkJCWlmIChhZGRfdHR5KCZub2Rlc1sxXSwgaiwgaGFyZHdhcmUsIG5ldHdvcmssCisJCQkJCUlQV19DSEFOTkVMX0RJQUxMRVIsIC0xLAorCQkJCQlUVFlUWVBFX01PTklUT1IpKQorCQkJCXJldHVybiBOVUxMOworCisJCQlqICs9IElQV0lSRUxFU1NfUENNQ0lBX01JTk9SX1JBTkdFOworCQkJaWYgKGFkZF90dHkoTlVMTCwgaiwgaGFyZHdhcmUsIG5ldHdvcmssCisJCQkJCUlQV19DSEFOTkVMX1JBUywgLTEsCisJCQkJCVRUWVRZUEVfUkFTX1JBVykpCisJCQkJcmV0dXJuIE5VTEw7CisKKwkJCW5vZGVzWzBdLm5leHQgPSAmbm9kZXNbMV07CisJCQlub2Rlc1sxXS5uZXh0ID0gTlVMTDsKKworCQkJcmV0dXJuIHR0eXNbaV07CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgaXB3aXJlbGVzc19uZXR3b3JrX2ZyZWUoKS4KKyAqLwordm9pZCBpcHdpcmVsZXNzX3R0eV9mcmVlKHN0cnVjdCBpcHdfdHR5ICp0dHkpCit7CisJaW50IGo7CisJc3RydWN0IGlwd19uZXR3b3JrICpuZXR3b3JrID0gdHR5c1t0dHktPmluZGV4XS0+bmV0d29yazsKKworCWZvciAoaiA9IHR0eS0+aW5kZXg7IGogPCBJUFdJUkVMRVNTX1BDTUNJQV9NSU5PUlM7CisJCQlqICs9IElQV0lSRUxFU1NfUENNQ0lBX01JTk9SX1JBTkdFKSB7CisJCXN0cnVjdCBpcHdfdHR5ICp0dHlqID0gdHR5c1tqXTsKKworCQlpZiAodHR5aikgeworCQkJbXV0ZXhfbG9jaygmdHR5ai0+aXB3X3R0eV9tdXRleCk7CisJCQlpZiAoZ2V0X3R0eShqICsgaXB3X3R0eV9kcml2ZXItPm1pbm9yX3N0YXJ0KSA9PSB0dHlqKQorCQkJCXJlcG9ydF9kZXJlZ2lzdGVyaW5nKHR0eWopOworCQkJdHR5ai0+Y2xvc2luZyA9IDE7CisJCQlpZiAodHR5ai0+bGludXhfdHR5ICE9IE5VTEwpIHsKKwkJCQltdXRleF91bmxvY2soJnR0eWotPmlwd190dHlfbXV0ZXgpOworCQkJCXR0eV9oYW5ndXAodHR5ai0+bGludXhfdHR5KTsKKwkJCQkvKiBXYWl0IHRpbGwgdGhlIHR0eV9oYW5ndXAgaGFzIGNvbXBsZXRlZCAqLworCQkJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJCQkJbXV0ZXhfbG9jaygmdHR5ai0+aXB3X3R0eV9tdXRleCk7CisJCQl9CisJCQl3aGlsZSAodHR5ai0+b3Blbl9jb3VudCkKKwkJCQlkb19pcHdfY2xvc2UodHR5aik7CisJCQlpcHdpcmVsZXNzX2Rpc2Fzc29jaWF0ZV9uZXR3b3JrX3R0eXMobmV0d29yaywKKwkJCQkJCQkgICAgIHR0eWotPmNoYW5uZWxfaWR4KTsKKwkJCXR0eV91bnJlZ2lzdGVyX2RldmljZShpcHdfdHR5X2RyaXZlciwgaik7CisJCQl0dHlzW2pdID0gTlVMTDsKKwkJCW11dGV4X3VubG9jaygmdHR5ai0+aXB3X3R0eV9tdXRleCk7CisJCQlrZnJlZSh0dHlqKTsKKwkJfQorCX0KK30KKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyB0dHlfb3BzID0geworCS5vcGVuID0gaXB3X29wZW4sCisJLmNsb3NlID0gaXB3X2Nsb3NlLAorCS5oYW5ndXAgPSBpcHdfaGFuZ3VwLAorCS53cml0ZSA9IGlwd193cml0ZSwKKwkud3JpdGVfcm9vbSA9IGlwd193cml0ZV9yb29tLAorCS5pb2N0bCA9IGlwd19pb2N0bCwKKwkuY2hhcnNfaW5fYnVmZmVyID0gaXB3X2NoYXJzX2luX2J1ZmZlciwKKwkudGlvY21nZXQgPSBpcHdfdGlvY21nZXQsCisJLnRpb2Ntc2V0ID0gaXB3X3Rpb2Ntc2V0LAorfTsKKworaW50IGlwd2lyZWxlc3NfdHR5X2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCisJaXB3X3R0eV9kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKElQV0lSRUxFU1NfUENNQ0lBX01JTk9SUyk7CisJaWYgKCFpcHdfdHR5X2RyaXZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpcHdfdHR5X2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlpcHdfdHR5X2RyaXZlci0+ZHJpdmVyX25hbWUgPSBJUFdJUkVMRVNTX1BDQ0FSRF9OQU1FOworCWlwd190dHlfZHJpdmVyLT5uYW1lID0gInR0eUlQV3AiOworCWlwd190dHlfZHJpdmVyLT5tYWpvciA9IDA7CisJaXB3X3R0eV9kcml2ZXItPm1pbm9yX3N0YXJ0ID0gSVBXSVJFTEVTU19QQ01DSUFfU1RBUlQ7CisJaXB3X3R0eV9kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCWlwd190dHlfZHJpdmVyLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCWlwd190dHlfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVcgfCBUVFlfRFJJVkVSX0RZTkFNSUNfREVWOworCWlwd190dHlfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJaXB3X3R0eV9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0KKwkgICAgQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOworCWlwd190dHlfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19pc3BlZWQgPSA5NjAwOworCWlwd190dHlfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19vc3BlZWQgPSA5NjAwOworCXR0eV9zZXRfb3BlcmF0aW9ucyhpcHdfdHR5X2RyaXZlciwgJnR0eV9vcHMpOworCXJlc3VsdCA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoaXB3X3R0eV9kcml2ZXIpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIElQV0lSRUxFU1NfUENDQVJEX05BTUUKKwkJICAgICAgICI6IGZhaWxlZCB0byByZWdpc3RlciB0dHkgZHJpdmVyXG4iKTsKKwkJcHV0X3R0eV9kcml2ZXIoaXB3X3R0eV9kcml2ZXIpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIGlwd2lyZWxlc3NfdHR5X3JlbGVhc2Uodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGlwd190dHlfZHJpdmVyKTsKKwlwdXRfdHR5X2RyaXZlcihpcHdfdHR5X2RyaXZlcik7CisJaWYgKHJldCAhPSAwKQorCQlwcmludGsoS0VSTl9FUlIgSVBXSVJFTEVTU19QQ0NBUkRfTkFNRQorCQkJIjogdHR5X3VucmVnaXN0ZXJfZHJpdmVyIGZhaWxlZCB3aXRoIGNvZGUgJWRcbiIsIHJldCk7Cit9CisKK2ludCBpcHdpcmVsZXNzX3R0eV9pc19tb2RlbShzdHJ1Y3QgaXB3X3R0eSAqdHR5KQoreworCXJldHVybiB0dHktPnR0eV90eXBlID09IFRUWVRZUEVfTU9ERU07Cit9CisKK3ZvaWQKK2lwd2lyZWxlc3NfdHR5X25vdGlmeV9jb250cm9sX2xpbmVfY2hhbmdlKHN0cnVjdCBpcHdfdHR5ICp0dHksCisJCQkJCSAgdW5zaWduZWQgaW50IGNoYW5uZWxfaWR4LAorCQkJCQkgIHVuc2lnbmVkIGludCBjb250cm9sX2xpbmVzLAorCQkJCQkgIHVuc2lnbmVkIGludCBjaGFuZ2VkX21hc2spCit7CisJdW5zaWduZWQgaW50IG9sZF9jb250cm9sX2xpbmVzID0gdHR5LT5jb250cm9sX2xpbmVzOworCisJdHR5LT5jb250cm9sX2xpbmVzID0gKHR0eS0+Y29udHJvbF9saW5lcyAmIH5jaGFuZ2VkX21hc2spCisJCXwgKGNvbnRyb2xfbGluZXMgJiBjaGFuZ2VkX21hc2spOworCisJLyoKKwkgKiBJZiBEQ0QgaXMgZGUtYXNzZXJ0ZWQsIHdlIGNsb3NlIHRoZSB0dHkgc28gcHBwZCBjYW4gdGVsbCB0aGF0IHdlCisJICogaGF2ZSBnb25lIG9mZmxpbmUuCisJICovCisJaWYgKChvbGRfY29udHJvbF9saW5lcyAmIElQV19DT05UUk9MX0xJTkVfRENEKQorCQkJJiYgISh0dHktPmNvbnRyb2xfbGluZXMgJiBJUFdfQ09OVFJPTF9MSU5FX0RDRCkKKwkJCSYmIHR0eS0+bGludXhfdHR5KSB7CisJCXR0eV9oYW5ndXAodHR5LT5saW51eF90dHkpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3BjbWNpYS9pcHdpcmVsZXNzL3R0eS5oIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9pcHdpcmVsZXNzL3R0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZGViOTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL2lwd2lyZWxlc3MvdHR5LmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIElQV2lyZWxlc3MgM0cgUENNQ0lBIE5ldHdvcmsgRHJpdmVyCisgKgorICogT3JpZ2luYWwgY29kZQorICogICBieSBTdGVwaGVuIEJsYWNraGVhdGggPHN0ZXBoZW5AYmxhY2tzYXBwaGlyZS5jb20+LAorICogICAgICBCZW4gTWFydGVsIDxiZW5tQHN5bW1ldHJpYy5jby5uej4KKyAqCisgKiBDb3B5cmlnaHRlZCBhcyBmb2xsb3dzOgorICogICBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgU3ltbWV0cmljIFN5c3RlbXMgTHRkIChOWikKKyAqCisgKiBWYXJpb3VzIGRyaXZlciBjaGFuZ2VzIGFuZCByZXdyaXRlcywgcG9ydCB0byBuZXcga2VybmVscworICogICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBKaXJpIEtvc2luYQorICoKKyAqIE1pc2MgY29kZSBjbGVhbnVwcyBhbmQgdXBkYXRlcworICogICBDb3B5cmlnaHQgKEMpIDIwMDcgRGF2aWQgU3RlcmJhCisgKi8KKworI2lmbmRlZiBfSVBXSVJFTEVTU19DU19UVFlfSF8KKyNkZWZpbmUgX0lQV0lSRUxFU1NfQ1NfVFRZX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisKK3N0cnVjdCBpcHdfdHR5Oworc3RydWN0IGlwd19uZXR3b3JrOworc3RydWN0IGlwd19oYXJkd2FyZTsKKworaW50IGlwd2lyZWxlc3NfdHR5X2luaXQodm9pZCk7Cit2b2lkIGlwd2lyZWxlc3NfdHR5X3JlbGVhc2Uodm9pZCk7CisKK3N0cnVjdCBpcHdfdHR5ICppcHdpcmVsZXNzX3R0eV9jcmVhdGUoc3RydWN0IGlwd19oYXJkd2FyZSAqaHcsCisJCQkJICAgICAgc3RydWN0IGlwd19uZXR3b3JrICpuZXQsCisJCQkJICAgICAgZGV2X25vZGVfdCAqbm9kZXMpOwordm9pZCBpcHdpcmVsZXNzX3R0eV9mcmVlKHN0cnVjdCBpcHdfdHR5ICp0dHkpOwordm9pZCBpcHdpcmVsZXNzX3R0eV9yZWNlaXZlZChzdHJ1Y3QgaXB3X3R0eSAqdHR5LCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoKTsKK2ludCBpcHdpcmVsZXNzX3R0eV9pc19tb2RlbShzdHJ1Y3QgaXB3X3R0eSAqdHR5KTsKK3ZvaWQgaXB3aXJlbGVzc190dHlfbm90aWZ5X2NvbnRyb2xfbGluZV9jaGFuZ2Uoc3RydWN0IGlwd190dHkgKnR0eSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBjaGFubmVsX2lkeCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCBjb250cm9sX2xpbmVzLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGNoYW5nZWRfbWFzayk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpc2NvbTguYyBiL2RyaXZlcnMvY2hhci9yaXNjb204LmMKaW5kZXggZDEzMGI4Ny4uOGZjNGZlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpc2NvbTguYworKysgYi9kcml2ZXJzL2NoYXIvcmlzY29tOC5jCkBAIC03OCw4ICs3OCw2IEBACiAJIEFTWU5DX1NQRF9ISSAgICAgICB8IEFTWU5DX1NQRUVEX1ZISSAgICB8IEFTWU5DX1NFU1NJT05fTE9DS09VVCB8IFwKIAkgQVNZTkNfUEdSUF9MT0NLT1VUIHwgQVNZTkNfQ0FMTE9VVF9OT0hVUCkKIAotI2RlZmluZSBSU19FVkVOVF9XUklURV9XQUtFVVAJMAotCiBzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnJpc2NvbV9kcml2ZXI7CiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0socmlzY29tX2xvY2spOwpAQCAtMzE0LDEyICszMTIsNiBAQAogICogCiAgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHJjX21hcmtfZXZlbnQoc3RydWN0IHJpc2NvbV9wb3J0ICogcG9ydCwgaW50IGV2ZW50KQotewotCXNldF9iaXQoZXZlbnQsICZwb3J0LT5ldmVudCk7Ci0Jc2NoZWR1bGVfd29yaygmcG9ydC0+dHF1ZXVlKTsKLX0KLQogc3RhdGljIGlubGluZSBzdHJ1Y3QgcmlzY29tX3BvcnQgKiByY19nZXRfcG9ydChzdHJ1Y3QgcmlzY29tX2JvYXJkIGNvbnN0ICogYnAsCiAJCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyIGNvbnN0ICogd2hhdCkKIHsKQEAgLTQ4Niw3ICs0NzgsNyBAQAogCQlyY19vdXQoYnAsIENEMTgwX0lFUiwgcG9ydC0+SUVSKTsKIAl9CiAJaWYgKHBvcnQtPnhtaXRfY250IDw9IHBvcnQtPndha2V1cF9jaGFycykKLQkJcmNfbWFya19ldmVudChwb3J0LCBSU19FVkVOVF9XUklURV9XQUtFVVApOworCQl0dHlfd2FrZXVwKHR0eSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCByY19jaGVja19tb2RlbShzdHJ1Y3QgcmlzY29tX2JvYXJkIGNvbnN0ICogYnApCkBAIC01MDUsNyArNDk3LDcgQEAKIAkJaWYgKHJjX2luKGJwLCBDRDE4MF9NU1ZSKSAmIE1TVlJfQ0QpIAogCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5vcGVuX3dhaXQpOwogCQllbHNlCi0JCQlzY2hlZHVsZV93b3JrKCZwb3J0LT50cXVldWVfaGFuZ3VwKTsKKwkJCXR0eV9oYW5ndXAodHR5KTsKIAl9CiAJCiAjaWZkZWYgUklTQ09NX0JSQUlOX0RBTUFHRURfQ1RTCkBAIC01MTQsNyArNTA2LDcgQEAKIAkJCXR0eS0+aHdfc3RvcHBlZCA9IDA7CiAJCQlwb3J0LT5JRVIgfD0gSUVSX1RYUkRZOwogCQkJaWYgKHBvcnQtPnhtaXRfY250IDw9IHBvcnQtPndha2V1cF9jaGFycykKLQkJCQlyY19tYXJrX2V2ZW50KHBvcnQsIFJTX0VWRU5UX1dSSVRFX1dBS0VVUCk7CisJCQkJdHR5X3dha2V1cCh0dHkpOwogCQl9IGVsc2UgIHsKIAkJCXR0eS0+aHdfc3RvcHBlZCA9IDE7CiAJCQlwb3J0LT5JRVIgJj0gfklFUl9UWFJEWTsKQEAgLTUyNiw3ICs1MTgsNyBAQAogCQkJdHR5LT5od19zdG9wcGVkID0gMDsKIAkJCXBvcnQtPklFUiB8PSBJRVJfVFhSRFk7CiAJCQlpZiAocG9ydC0+eG1pdF9jbnQgPD0gcG9ydC0+d2FrZXVwX2NoYXJzKQotCQkJCXJjX21hcmtfZXZlbnQocG9ydCwgUlNfRVZFTlRfV1JJVEVfV0FLRVVQKTsKKwkJCQl0dHlfd2FrZXVwKHR0eSk7CiAJCX0gZWxzZSAgewogCQkJdHR5LT5od19zdG9wcGVkID0gMTsKIAkJCXBvcnQtPklFUiAmPSB+SUVSX1RYUkRZOwpAQCAtMTA5MSw3ICsxMDgzLDYgQEAKIAl0dHlfbGRpc2NfZmx1c2godHR5KTsKIAogCXR0eS0+Y2xvc2luZyA9IDA7Ci0JcG9ydC0+ZXZlbnQgPSAwOwogCXBvcnQtPnR0eSA9IE5VTEw7CiAJaWYgKHBvcnQtPmJsb2NrZWRfb3BlbikgewogCQlpZiAocG9ydC0+Y2xvc2VfZGVsYXkpIHsKQEAgLTE1MjYsMjUgKzE1MTcsNiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJpc2NvbV9sb2NrLCBmbGFncyk7CiB9CiAKLS8qCi0gKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gdGhlIHdvcmsgcXVldWUgd2hlbiB0aGUgaW50ZXJydXB0Ci0gKiByb3V0aW5lIGhhcyBzaWduYWxsZWQgdGhhdCBhIGhhbmd1cCBoYXMgb2NjdXJyZWQuICBUaGUgcGF0aCBvZgotICogaGFuZ3VwIHByb2Nlc3NpbmcgaXM6Ci0gKgotICogCXNlcmlhbCBpbnRlcnJ1cHQgcm91dGluZSAtPiAod29ya3F1ZXVlKSAtPgotICogCWRvX3JjX2hhbmd1cCgpIC0+IHR0eS0+aGFuZ3VwKCkgLT4gcmNfaGFuZ3VwKCkKLSAqIAotICovCi1zdGF0aWMgdm9pZCBkb19yY19oYW5ndXAoc3RydWN0IHdvcmtfc3RydWN0ICp1Z2x5X2FwaSkKLXsKLQlzdHJ1Y3QgcmlzY29tX3BvcnQJKnBvcnQgPSBjb250YWluZXJfb2YodWdseV9hcGksIHN0cnVjdCByaXNjb21fcG9ydCwgdHF1ZXVlX2hhbmd1cCk7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eTsKLQkKLQl0dHkgPSBwb3J0LT50dHk7Ci0JaWYgKHR0eSkKLQkJdHR5X2hhbmd1cCh0dHkpOwkvKiBGSVhNRTogbW9kdWxlIHJlbW92YWwgcmFjZSBzdGlsbCBoZXJlICovCi19Ci0KIHN0YXRpYyB2b2lkIHJjX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKIHsKIAlzdHJ1Y3QgcmlzY29tX3BvcnQgKnBvcnQgPSAoc3RydWN0IHJpc2NvbV9wb3J0ICopdHR5LT5kcml2ZXJfZGF0YTsKQEAgLTE1NTYsNyArMTUyOCw2IEBACiAJYnAgPSBwb3J0X0JvYXJkKHBvcnQpOwogCQogCXJjX3NodXRkb3duX3BvcnQoYnAsIHBvcnQpOwotCXBvcnQtPmV2ZW50ID0gMDsKIAlwb3J0LT5jb3VudCA9IDA7CiAJcG9ydC0+ZmxhZ3MgJj0gfkFTWU5DX05PUk1BTF9BQ1RJVkU7CiAJcG9ydC0+dHR5ID0gTlVMTDsKQEAgLTE1ODYsMTggKzE1NTcsNiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgZG9fc29mdGludChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnVnbHlfYXBpKQotewotCXN0cnVjdCByaXNjb21fcG9ydAkqcG9ydCA9IGNvbnRhaW5lcl9vZih1Z2x5X2FwaSwgc3RydWN0IHJpc2NvbV9wb3J0LCB0cXVldWUpOwotCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7Ci0JCi0JaWYoISh0dHkgPSBwb3J0LT50dHkpKSAKLQkJcmV0dXJuOwotCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSU19FVkVOVF9XUklURV9XQUtFVVAsICZwb3J0LT5ldmVudCkpCi0JCXR0eV93YWtldXAodHR5KTsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfb3BlcmF0aW9ucyByaXNjb21fb3BzID0gewogCS5vcGVuICA9IHJjX29wZW4sCiAJLmNsb3NlID0gcmNfY2xvc2UsCkBAIC0xNjE4LDcgKzE1NzcsNyBAQAogCS50aW9jbXNldCA9IHJjX3Rpb2Ntc2V0LAogfTsKIAotc3RhdGljIGlubGluZSBpbnQgcmNfaW5pdF9kcml2ZXJzKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCByY19pbml0X2RyaXZlcnModm9pZCkKIHsKIAlpbnQgZXJyb3I7CiAJaW50IGk7CkBAIC0xNjUwLDggKzE2MDksNiBAQAogCW1lbXNldChyY19wb3J0LCAwLCBzaXplb2YocmNfcG9ydCkpOwogCWZvciAoaSA9IDA7IGkgPCBSQ19OUE9SVCAqIFJDX05CT0FSRDsgaSsrKSAgewogCQlyY19wb3J0W2ldLm1hZ2ljID0gUklTQ09NOF9NQUdJQzsKLQkJSU5JVF9XT1JLKCZyY19wb3J0W2ldLnRxdWV1ZSwgZG9fc29mdGludCk7Ci0JCUlOSVRfV09SSygmcmNfcG9ydFtpXS50cXVldWVfaGFuZ3VwLCBkb19yY19oYW5ndXApOwogCQlyY19wb3J0W2ldLmNsb3NlX2RlbGF5ID0gNTAgKiBIWi8xMDA7CiAJCXJjX3BvcnRbaV0uY2xvc2luZ193YWl0ID0gMzAwMCAqIEhaLzEwMDsKIAkJaW5pdF93YWl0cXVldWVfaGVhZCgmcmNfcG9ydFtpXS5vcGVuX3dhaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jpc2NvbTguaCBiL2RyaXZlcnMvY2hhci9yaXNjb204LmgKaW5kZXggOWNjMTMxMy4uY2RmZGY0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpc2NvbTguaAorKysgYi9kcml2ZXJzL2NoYXIvcmlzY29tOC5oCkBAIC03MSw3ICs3MSw2IEBACiAJc3RydWN0IHR0eV9zdHJ1Y3QgCSogdHR5OwogCWludAkJCWNvdW50OwogCWludAkJCWJsb2NrZWRfb3BlbjsKLQl1bnNpZ25lZCBsb25nCQlldmVudDsgLyogbG9uZyByZXEnZCBmb3Igc2V0X2JpdCAtLVJSICovCiAJaW50CQkJdGltZW91dDsKIAlpbnQJCQljbG9zZV9kZWxheTsKIAl1bnNpZ25lZCBjaGFyIAkJKiB4bWl0X2J1ZjsKQEAgLTgxLDggKzgwLDYgQEAKIAlpbnQJCQl4bWl0X2NudDsKIAl3YWl0X3F1ZXVlX2hlYWRfdAlvcGVuX3dhaXQ7CiAJd2FpdF9xdWV1ZV9oZWFkX3QJY2xvc2Vfd2FpdDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJdHF1ZXVlOwotCXN0cnVjdCB3b3JrX3N0cnVjdAl0cXVldWVfaGFuZ3VwOwogCXNob3J0CQkJd2FrZXVwX2NoYXJzOwogCXNob3J0CQkJYnJlYWtfbGVuZ3RoOwogCXVuc2lnbmVkIHNob3J0CQljbG9zaW5nX3dhaXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcm9ja2V0LmMgYi9kcml2ZXJzL2NoYXIvcm9ja2V0LmMKaW5kZXggZDgzNDE5Yy4uNzJmMjg5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3JvY2tldC5jCisrKyBiL2RyaXZlcnMvY2hhci9yb2NrZXQuYwpAQCAtNDAsMTIgKzQwLDYgQEAKICAqLwogCiAvKioqKioqIERlZmluZXMgKioqKioqLwotI2lmZGVmIFBDSV9OVU1fUkVTT1VSQ0VTCi0jZGVmaW5lIFBDSV9CQVNFX0FERFJFU1MoZGV2LCByKSAoKGRldiktPnJlc291cmNlW3JdLnN0YXJ0KQotI2Vsc2UKLSNkZWZpbmUgUENJX0JBU0VfQUREUkVTUyhkZXYsIHIpICgoZGV2KS0+YmFzZV9hZGRyZXNzW3JdKQotI2VuZGlmCi0KICNkZWZpbmUgUk9DS0VUX1BBUkFOT0lBX0NIRUNLCiAjZGVmaW5lIFJPQ0tFVF9ESVNBQkxFX1NJTVVTQUdFCiAKQEAgLTMwNSw4ICsyOTksOCBAQAogCWlmICghaW5mbykKIAkJcmV0dXJuIDE7CiAJaWYgKGluZm8tPm1hZ2ljICE9IFJQT1JUX01BR0lDKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIldhcm5pbmc6IGJhZCBtYWdpYyBudW1iZXIgZm9yIHJvY2tldHBvcnQgc3RydWN0IGluICVzXG4iLAotCQkgICAgIHJvdXRpbmUpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJXYXJuaW5nOiBiYWQgbWFnaWMgbnVtYmVyIGZvciByb2NrZXRwb3J0ICIKKwkJCQkic3RydWN0IGluICVzXG4iLCByb3V0aW5lKTsKIAkJcmV0dXJuIDE7CiAJfQogI2VuZGlmCkBAIC0zMjgsNyArMzIyLDcgQEAKIAogCVRvUmVjdiA9IHNHZXRSeENudChjcCk7CiAjaWZkZWYgUk9DS0VUX0RFQlVHX0lOVFIKLQlwcmludGsoS0VSTl9JTkZPICJycF9kb19yZWNlaXZlKCVkKS4uLiIsIFRvUmVjdik7CisJcHJpbnRrKEtFUk5fSU5GTyAicnBfZG9fcmVjZWl2ZSglZCkuLi5cbiIsIFRvUmVjdik7CiAjZW5kaWYKIAlpZiAoVG9SZWN2ID09IDApCiAJCXJldHVybjsKQEAgLTM0MSw3ICszMzUsNyBAQAogCWlmIChDaGFuU3RhdHVzICYgKFJYRk9WRVJGTCB8IFJYQlJFQUsgfCBSWEZSQU1FIHwgUlhQQVJJVFkpKSB7CiAJCWlmICghKENoYW5TdGF0dXMgJiBTVEFUTU9ERSkpIHsKICNpZmRlZiBST0NLRVRfREVCVUdfUkVDRUlWRQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiRW50ZXJpbmcgU1RBVE1PREUuLi4iKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIkVudGVyaW5nIFNUQVRNT0RFLi4uXG4iKTsKICNlbmRpZgogCQkJQ2hhblN0YXR1cyB8PSBTVEFUTU9ERTsKIAkJCXNFblJ4U3RhdHVzTW9kZShjcCk7CkBAIC0zNTUsMTUgKzM0OSwxNSBAQAogCSAqLwogCWlmIChDaGFuU3RhdHVzICYgU1RBVE1PREUpIHsKICNpZmRlZiBST0NLRVRfREVCVUdfUkVDRUlWRQotCQlwcmludGsoS0VSTl9JTkZPICJJZ25vcmUgJXgsIHJlYWQgJXguLi4iLCBpbmZvLT5pZ25vcmVfc3RhdHVzX21hc2ssCi0JCSAgICAgICBpbmZvLT5yZWFkX3N0YXR1c19tYXNrKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSWdub3JlICV4LCByZWFkICV4Li4uXG4iLAorCQkJaW5mby0+aWdub3JlX3N0YXR1c19tYXNrLCBpbmZvLT5yZWFkX3N0YXR1c19tYXNrKTsKICNlbmRpZgogCQl3aGlsZSAoVG9SZWN2KSB7CiAJCQljaGFyIGZsYWc7CiAKIAkJCUNoYXJOU3RhdCA9IHNJblcoc0dldFR4UnhEYXRhSU8oY3ApKTsKICNpZmRlZiBST0NLRVRfREVCVUdfUkVDRUlWRQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXguLi4iLCBDaGFyTlN0YXQpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXguLi5cbiIsIENoYXJOU3RhdCk7CiAjZW5kaWYKIAkJCWlmIChDaGFyTlN0YXQgJiBTVE1CUkVBS0gpCiAJCQkJQ2hhck5TdGF0ICY9IH4oU1RNRlJBTUVIIHwgU1RNUEFSSVRZSCk7CkBAIC00MzUsMTIgKzQyOSwxMyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKICNpZmRlZiBST0NLRVRfREVCVUdfSU5UUgotCXByaW50ayhLRVJOX0lORk8gInJwX2RvX3RyYW5zbWl0ICIpOworCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgX19mdW5jX18pOwogI2VuZGlmCiAJaWYgKCFpbmZvKQogCQlyZXR1cm47CiAJaWYgKCFpbmZvLT50dHkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAgInJwOiBXQVJOSU5HIHJwX2RvX3RyYW5zbWl0IGNhbGxlZCB3aXRoIGluZm8tPnR0eT09TlVMTFxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInJwOiBXQVJOSU5HICVzIGNhbGxlZCB3aXRoICIKKwkJCQkiaW5mby0+dHR5PT1OVUxMXG4iLCBfX2Z1bmNfXyk7CiAJCWNsZWFyX2JpdCgoaW5mby0+YWlvcCAqIDgpICsgaW5mby0+Y2hhbiwgKHZvaWQgKikgJnhtaXRfZmxhZ3NbaW5mby0+Ym9hcmRdKTsKIAkJcmV0dXJuOwogCX0KQEAgLTQ2NCw3ICs0NTksNyBAQAogCQlpbmZvLT54bWl0X2NudCAtPSBjOwogCQlpbmZvLT54bWl0X2ZpZm9fcm9vbSAtPSBjOwogI2lmZGVmIFJPQ0tFVF9ERUJVR19JTlRSCi0JCXByaW50ayhLRVJOX0lORk8gInR4ICVkIGNoYXJzLi4uIiwgYyk7CisJCXByaW50ayhLRVJOX0lORk8gInR4ICVkIGNoYXJzLi4uXG4iLCBjKTsKICNlbmRpZgogCX0KIApAQCAtNDgxLDcgKzQ3Niw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAogI2lmZGVmIFJPQ0tFVF9ERUJVR19JTlRSCi0JcHJpbnRrKEtFUk5fSU5GTyAiKCVkLCVkLCVkLCVkKS4uLiIsIGluZm8tPnhtaXRfY250LCBpbmZvLT54bWl0X2hlYWQsCisJcHJpbnRrKEtFUk5fREVCVUcgIiglZCwlZCwlZCwlZCkuLi5cbiIsIGluZm8tPnhtaXRfY250LCBpbmZvLT54bWl0X2hlYWQsCiAJICAgICAgIGluZm8tPnhtaXRfdGFpbCwgaW5mby0+eG1pdF9maWZvX3Jvb20pOwogI2VuZGlmCiB9CkBAIC01MDEsMTEgKzQ5NiwxMyBAQAogCQlyZXR1cm47CiAKIAlpZiAoKGluZm8tPmZsYWdzICYgUk9DS0VUX0lOSVRJQUxJWkVEKSA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gInJwOiBXQVJOSU5HOiBycF9oYW5kbGVfcG9ydCBjYWxsZWQgd2l0aCBpbmZvLT5mbGFncyAmIE5PVF9JTklUXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicnA6IFdBUk5JTkc6IHJwX2hhbmRsZV9wb3J0IGNhbGxlZCB3aXRoICIKKwkJCQkiaW5mby0+ZmxhZ3MgJiBOT1RfSU5JVFxuIik7CiAJCXJldHVybjsKIAl9CiAJaWYgKCFpbmZvLT50dHkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAicnA6IFdBUk5JTkc6IHJwX2hhbmRsZV9wb3J0IGNhbGxlZCB3aXRoIGluZm8tPnR0eT09TlVMTFxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInJwOiBXQVJOSU5HOiBycF9oYW5kbGVfcG9ydCBjYWxsZWQgd2l0aCAiCisJCQkJImluZm8tPnR0eT09TlVMTFxuIik7CiAJCXJldHVybjsKIAl9CiAJY3AgPSAmaW5mby0+Y2hhbm5lbDsKQEAgLTUxMyw3ICs1MTAsNyBAQAogCiAJSW50TWFzayA9IHNHZXRDaGFuSW50SUQoY3ApICYgaW5mby0+aW50bWFzazsKICNpZmRlZiBST0NLRVRfREVCVUdfSU5UUgotCXByaW50ayhLRVJOX0lORk8gInJwX2ludGVycnVwdCAlMDJ4Li4uIiwgSW50TWFzayk7CisJcHJpbnRrKEtFUk5fSU5GTyAicnBfaW50ZXJydXB0ICUwMnguLi5cbiIsIEludE1hc2spOwogI2VuZGlmCiAJQ2hhblN0YXR1cyA9IHNHZXRDaGFuU3RhdHVzKGNwKTsKIAlpZiAoSW50TWFzayAmIFJYRl9UUklHKSB7CS8qIFJ4IEZJRk8gdHJpZ2dlciBsZXZlbCAqLwpAQCAtNTIxLDcgKzUxOCw3IEBACiAJfQogCWlmIChJbnRNYXNrICYgREVMVEFfQ0QpIHsJLyogQ0QgY2hhbmdlICAqLwogI2lmIChkZWZpbmVkKFJPQ0tFVF9ERUJVR19PUEVOKSB8fCBkZWZpbmVkKFJPQ0tFVF9ERUJVR19JTlRSKSB8fCBkZWZpbmVkKFJPQ0tFVF9ERUJVR19IQU5HVVApKQotCQlwcmludGsoS0VSTl9JTkZPICJ0dHlSJWQgQ0Qgbm93ICVzLi4uIiwgaW5mby0+bGluZSwKKwkJcHJpbnRrKEtFUk5fSU5GTyAidHR5UiVkIENEIG5vdyAlcy4uLlxuIiwgaW5mby0+bGluZSwKIAkJICAgICAgIChDaGFuU3RhdHVzICYgQ0RfQUNUKSA/ICJvbiIgOiAib2ZmIik7CiAjZW5kaWYKIAkJaWYgKCEoQ2hhblN0YXR1cyAmIENEX0FDVCkgJiYgaW5mby0+Y2Rfc3RhdHVzKSB7CkBAIC02MzgsNyArNjM1LDggQEAKIAkvKiAgR2V0IGEgcl9wb3J0IHN0cnVjdCBmb3IgdGhlIHBvcnQsIGZpbGwgaXQgaW4gYW5kIHNhdmUgaXQgZ2xvYmFsbHksIGluZGV4ZWQgYnkgbGluZSBudW1iZXIgKi8KIAlpbmZvID0ga3phbGxvYyhzaXplb2YgKHN0cnVjdCByX3BvcnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluZm8pIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiQ291bGRuJ3QgYWxsb2NhdGUgaW5mbyBzdHJ1Y3QgZm9yIGxpbmUgIyVkXG4iLCBsaW5lKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZG4ndCBhbGxvY2F0ZSBpbmZvIHN0cnVjdCBmb3IgbGluZSAjJWRcbiIsCisJCQkJbGluZSk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTY2OCw3ICs2NjYsOCBAQAogCiAJaW5mby0+aW50bWFzayA9IFJYRl9UUklHIHwgVFhGSUZPX01UIHwgU1JDX0lOVCB8IERFTFRBX0NEIHwgREVMVEFfQ1RTIHwgREVMVEFfRFNSOwogCWlmIChzSW5pdENoYW4oY3RscCwgJmluZm8tPmNoYW5uZWwsIGFpb3AsIGNoYW4pID09IDApIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUm9ja2V0UG9ydCBzSW5pdENoYW4oJWQsICVkLCAlZCkgZmFpbGVkIVxuIiwgYm9hcmQsIGFpb3AsIGNoYW4pOworCQlwcmludGsoS0VSTl9FUlIgIlJvY2tldFBvcnQgc0luaXRDaGFuKCVkLCAlZCwgJWQpIGZhaWxlZCFcbiIsCisJCQkJYm9hcmQsIGFpb3AsIGNoYW4pOwogCQlrZnJlZShpbmZvKTsKIAkJcmV0dXJuOwogCX0KQEAgLTcxNiwxMSArNzE1LDEwIEBACiAJdW5zaWduZWQgcm9ja2V0TW9kZTsKIAlpbnQgYml0cywgYmF1ZCwgZGl2aXNvcjsKIAlDSEFOTkVMX3QgKmNwOworCXN0cnVjdCBrdGVybWlvcyAqdCA9IGluZm8tPnR0eS0+dGVybWlvczsKIAotCWlmICghaW5mby0+dHR5IHx8ICFpbmZvLT50dHktPnRlcm1pb3MpCi0JCXJldHVybjsKIAljcCA9ICZpbmZvLT5jaGFubmVsOwotCWNmbGFnID0gaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCWNmbGFnID0gdC0+Y19jZmxhZzsKIAogCS8qIEJ5dGUgc2l6ZSBhbmQgcGFyaXR5ICovCiAJaWYgKChjZmxhZyAmIENTSVpFKSA9PSBDUzgpIHsKQEAgLTc1NSwxMCArNzUzLDcgQEAKIAkJYmF1ZCA9IDk2MDA7CiAJZGl2aXNvciA9ICgocnBfYmF1ZF9iYXNlW2luZm8tPmJvYXJkXSArIChiYXVkID4+IDEpKSAvIGJhdWQpIC0gMTsKIAlpZiAoKGRpdmlzb3IgPj0gODE5MiB8fCBkaXZpc29yIDwgMCkgJiYgb2xkX3Rlcm1pb3MpIHsKLQkJaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICY9IH5DQkFVRDsKLQkJaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnIHw9Ci0JCSAgICAob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCk7Ci0JCWJhdWQgPSB0dHlfZ2V0X2JhdWRfcmF0ZShpbmZvLT50dHkpOworCQliYXVkID0gdHR5X3Rlcm1pb3NfYmF1ZF9yYXRlKG9sZF90ZXJtaW9zKTsKIAkJaWYgKCFiYXVkKQogCQkJYmF1ZCA9IDk2MDA7CiAJCWRpdmlzb3IgPSAocnBfYmF1ZF9iYXNlW2luZm8tPmJvYXJkXSAvIGJhdWQpIC0gMTsKQEAgLTc3MCw2ICs3NjUsOSBAQAogCWluZm8tPmNwcyA9IGJhdWQgLyBiaXRzOwogCXNTZXRCYXVkKGNwLCBkaXZpc29yKTsKIAorCS8qIEZJWE1FOiBTaG91bGQgcmVhbGx5IGJhY2sgY29tcHV0ZSBhIGJhdWQgcmF0ZSBmcm9tIHRoZSBkaXZpc29yICovCisJdHR5X2VuY29kZV9iYXVkX3JhdGUoaW5mby0+dHR5LCBiYXVkLCBiYXVkKTsKKwogCWlmIChjZmxhZyAmIENSVFNDVFMpIHsKIAkJaW5mby0+aW50bWFzayB8PSBERUxUQV9DVFM7CiAJCXNFbkNUU0Zsb3dDdGwoY3ApOwpAQCAtOTc2LDcgKzk3NCw3IEBACiAJQ0hBTk5FTF90ICpjcDsKIAl1bnNpZ25lZCBsb25nIHBhZ2U7CiAKLQlsaW5lID0gVFRZX0dFVF9MSU5FKHR0eSk7CisJbGluZSA9IHR0eS0+aW5kZXg7CiAJaWYgKChsaW5lIDwgMCkgfHwgKGxpbmUgPj0gTUFYX1JQX1BPUlRTKSB8fCAoKGluZm8gPSBycF90YWJsZVtsaW5lXSkgPT0gTlVMTCkpCiAJCXJldHVybiAtRU5YSU87CiAKQEAgLTEwMDcsNyArMTAwNSw4IEBACiAJCWF0b21pY19pbmMoJnJwX251bV9wb3J0c19vcGVuKTsKIAogI2lmZGVmIFJPQ0tFVF9ERUJVR19PUEVOCi0JCXByaW50ayhLRVJOX0lORk8gInJvY2tldCBtb2QrKyA9ICVkLi4uIiwgYXRvbWljX3JlYWQoJnJwX251bV9wb3J0c19vcGVuKSk7CisJCXByaW50ayhLRVJOX0lORk8gInJvY2tldCBtb2QrKyA9ICVkLi4uXG4iLAorCQkJCWF0b21pY19yZWFkKCZycF9udW1fcG9ydHNfb3BlbikpOwogI2VuZGlmCiAJfQogI2lmZGVmIFJPQ0tFVF9ERUJVR19PUEVOCkBAIC0xMTAzLDEzICsxMTAyLDEzIEBACiAJCSAqIG9uZSwgd2UndmUgZ290IHJlYWwgcHJvYmxlbXMsIHNpbmNlIGl0IG1lYW5zIHRoZQogCQkgKiBzZXJpYWwgcG9ydCB3b24ndCBiZSBzaHV0ZG93bi4KIAkJICovCi0JCXByaW50ayhLRVJOX0lORk8gInJwX2Nsb3NlOiBiYWQgc2VyaWFsIHBvcnQgY291bnQ7IHR0eS0+Y291bnQgaXMgMSwgIgotCQkgICAgICAgImluZm8tPmNvdW50IGlzICVkXG4iLCBpbmZvLT5jb3VudCk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInJwX2Nsb3NlOiBiYWQgc2VyaWFsIHBvcnQgY291bnQ7ICIKKwkJCSJ0dHktPmNvdW50IGlzIDEsIGluZm8tPmNvdW50IGlzICVkXG4iLCBpbmZvLT5jb3VudCk7CiAJCWluZm8tPmNvdW50ID0gMTsKIAl9CiAJaWYgKC0taW5mby0+Y291bnQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gInJwX2Nsb3NlOiBiYWQgc2VyaWFsIHBvcnQgY291bnQgZm9yIHR0eVIlZDogJWRcbiIsCi0JCSAgICAgICBpbmZvLT5saW5lLCBpbmZvLT5jb3VudCk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInJwX2Nsb3NlOiBiYWQgc2VyaWFsIHBvcnQgY291bnQgZm9yICIKKwkJCQkidHR5UiVkOiAlZFxuIiwgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOwogCQlpbmZvLT5jb3VudCA9IDA7CiAJfQogCWlmIChpbmZvLT5jb3VudCkgewpAQCAtMTE2MCw4ICsxMTU5LDcgQEAKIAlpZiAoQ19IVVBDTCh0dHkpKQogCQlzQ2xyRFRSKGNwKTsKIAotCWlmIChUVFlfRFJJVkVSX0ZMVVNIX0JVRkZFUl9FWElTVFModHR5KSkKLQkJVFRZX0RSSVZFUl9GTFVTSF9CVUZGRVIodHR5KTsKKwlycF9mbHVzaF9idWZmZXIodHR5KTsKIAkJCiAJdHR5X2xkaXNjX2ZsdXNoKHR0eSk7CiAKQEAgLTExODQsNyArMTE4Miw4IEBACiAJYXRvbWljX2RlYygmcnBfbnVtX3BvcnRzX29wZW4pOwogCiAjaWZkZWYgUk9DS0VUX0RFQlVHX09QRU4KLQlwcmludGsoS0VSTl9JTkZPICJyb2NrZXQgbW9kLS0gPSAlZC4uLiIsIGF0b21pY19yZWFkKCZycF9udW1fcG9ydHNfb3BlbikpOworCXByaW50ayhLRVJOX0lORk8gInJvY2tldCBtb2QtLSA9ICVkLi4uXG4iLAorCQkJYXRvbWljX3JlYWQoJnJwX251bV9wb3J0c19vcGVuKSk7CiAJcHJpbnRrKEtFUk5fSU5GTyAicnBfY2xvc2UgdHR5UiVkIGNvbXBsZXRlIHNodXRkb3duXG4iLCBpbmZvLT5saW5lKTsKICNlbmRpZgogCkBAIC0xMjAyLDE1ICsxMjAxLDE0IEBACiAKIAljZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKIAotCWlmIChjZmxhZyA9PSBvbGRfdGVybWlvcy0+Y19jZmxhZykKLQkJcmV0dXJuOwotCiAJLyoKIAkgKiBUaGlzIGRyaXZlciBkb2Vzbid0IHN1cHBvcnQgQ1M1IG9yIENTNgogCSAqLwogCWlmICgoKGNmbGFnICYgQ1NJWkUpID09IENTNSkgfHwgKChjZmxhZyAmIENTSVpFKSA9PSBDUzYpKQogCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPQogCQkgICAgKChjZmxhZyAmIH5DU0laRSkgfCAob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDU0laRSkpOworCS8qIE9yIENNU1BBUiAqLworCXR0eS0+dGVybWlvcy0+Y19jZmxhZyAmPSB+Q01TUEFSOwogCiAJY29uZmlndXJlX3JfcG9ydChpbmZvLCBvbGRfdGVybWlvcyk7CiAKQEAgLTE0MDEsNiArMTM5OSw5IEBACiB7CiAJaW50IHJlc2V0OwogCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXNldCwgYXJnLCBzaXplb2YgKGludCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlpZiAocmVzZXQpCkBAIC0xNTY5LDkgKzE1NzAsOSBAQAogCiAJb3JpZ19qaWZmaWVzID0gamlmZmllczsKICNpZmRlZiBST0NLRVRfREVCVUdfV0FJVF9VTlRJTF9TRU5UCi0JcHJpbnRrKEtFUk5fSU5GTyAiSW4gUlBfd2FpdF91bnRpbF9zZW50KCVkKSAoamlmZj0lbHUpLi4uIiwgdGltZW91dCwKKwlwcmludGsoS0VSTl9JTkZPICJJbiBSUF93YWl0X3VudGlsX3NlbnQoJWQpIChqaWZmPSVsdSkuLi5cbiIsIHRpbWVvdXQsCiAJICAgICAgIGppZmZpZXMpOwotCXByaW50ayhLRVJOX0lORk8gImNwcz0lZC4uLiIsIGluZm8tPmNwcyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiY3BzPSVkLi4uXG4iLCBpbmZvLT5jcHMpOwogI2VuZGlmCiAJd2hpbGUgKDEpIHsKIAkJdHhjbnQgPSBzR2V0VHhDbnQoY3ApOwpAQCAtMTU5Miw3ICsxNTkzLDggQEAKIAkJaWYgKGNoZWNrX3RpbWUgPT0gMCkKIAkJCWNoZWNrX3RpbWUgPSAxOwogI2lmZGVmIFJPQ0tFVF9ERUJVR19XQUlUX1VOVElMX1NFTlQKLQkJcHJpbnRrKEtFUk5fSU5GTyAidHhjbnQgPSAlZCAoamlmZj0lbHUsY2hlY2s9JWQpLi4uIiwgdHhjbnQsIGppZmZpZXMsIGNoZWNrX3RpbWUpOworCQlwcmludGsoS0VSTl9JTkZPICJ0eGNudCA9ICVkIChqaWZmPSVsdSxjaGVjaz0lZCkuLi5cbiIsIHR4Y250LAorCQkJCWppZmZpZXMsIGNoZWNrX3RpbWUpOwogI2VuZGlmCiAJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoY2hlY2tfdGltZSkpOwogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCkBAIC0xNjE2LDcgKzE2MTgsNyBAQAogCQlyZXR1cm47CiAKICNpZiAoZGVmaW5lZChST0NLRVRfREVCVUdfT1BFTikgfHwgZGVmaW5lZChST0NLRVRfREVCVUdfSEFOR1VQKSkKLQlwcmludGsoS0VSTl9JTkZPICJycF9oYW5ndXAgb2YgdHR5UiVkLi4uIiwgaW5mby0+bGluZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAicnBfaGFuZ3VwIG9mIHR0eVIlZC4uLlxuIiwgaW5mby0+bGluZSk7CiAjZW5kaWYKIAlycF9mbHVzaF9idWZmZXIodHR5KTsKIAlpZiAoaW5mby0+ZmxhZ3MgJiBST0NLRVRfQ0xPU0lORykKQEAgLTE2NjQsNyArMTY2Niw3IEBACiAJbXV0ZXhfbG9jaygmaW5mby0+d3JpdGVfbXR4KTsKIAogI2lmZGVmIFJPQ0tFVF9ERUJVR19XUklURQotCXByaW50ayhLRVJOX0lORk8gInJwX3B1dF9jaGFyICVjLi4uIiwgY2gpOworCXByaW50ayhLRVJOX0lORk8gInJwX3B1dF9jaGFyICVjLi4uXG4iLCBjaCk7CiAjZW5kaWYKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwpAQCAtMTcwOSw3ICsxNzExLDcgQEAKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAogI2lmZGVmIFJPQ0tFVF9ERUJVR19XUklURQotCXByaW50ayhLRVJOX0lORk8gInJwX3dyaXRlICVkIGNoYXJzLi4uIiwgY291bnQpOworCXByaW50ayhLRVJOX0lORk8gInJwX3dyaXRlICVkIGNoYXJzLi4uXG4iLCBjb3VudCk7CiAjZW5kaWYKIAljcCA9ICZpbmZvLT5jaGFubmVsOwogCkBAIC0xNzk4LDcgKzE4MDAsNyBAQAogCWlmIChyZXQgPCAwKQogCQlyZXQgPSAwOwogI2lmZGVmIFJPQ0tFVF9ERUJVR19XUklURQotCXByaW50ayhLRVJOX0lORk8gInJwX3dyaXRlX3Jvb20gcmV0dXJucyAlZC4uLiIsIHJldCk7CisJcHJpbnRrKEtFUk5fSU5GTyAicnBfd3JpdGVfcm9vbSByZXR1cm5zICVkLi4uXG4iLCByZXQpOwogI2VuZGlmCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE4MTgsNyArMTgyMCw3IEBACiAJY3AgPSAmaW5mby0+Y2hhbm5lbDsKIAogI2lmZGVmIFJPQ0tFVF9ERUJVR19XUklURQotCXByaW50ayhLRVJOX0lORk8gInJwX2NoYXJzX2luX2J1ZmZlciByZXR1cm5zICVkLi4uIiwgaW5mby0+eG1pdF9jbnQpOworCXByaW50ayhLRVJOX0lORk8gInJwX2NoYXJzX2luX2J1ZmZlciByZXR1cm5zICVkLi4uXG4iLCBpbmZvLT54bWl0X2NudCk7CiAjZW5kaWYKIAlyZXR1cm4gaW5mby0+eG1pdF9jbnQ7CiB9CkBAIC0yMTYxLDE0ICsyMTYzLDExIEBACiAJZm9yIChhaW9wID0gMDsgYWlvcCA8IG1heF9udW1fYWlvcHM7IGFpb3ArKykKIAkJY3RscC0+QWlvcE51bUNoYW5bYWlvcF0gPSBwb3J0c19wZXJfYWlvcDsKIAotCXByaW50aygiQ29tdHJvbCBQQ0kgY29udHJvbGxlciAjJWQgSUQgMHgleCBmb3VuZCBpbiBidXM6c2xvdDpmbiAlcyBhdCBhZGRyZXNzICUwNGx4LCAiCi0JICAgICAiJWQgQUlPUChzKSAoJXMpXG4iLCBpLCBkZXYtPmRldmljZSwgcGNpX25hbWUoZGV2KSwKLQkgICAgIHJja3RwdF9pb19hZGRyW2ldLCBudW1fYWlvcHMsIHJvY2tldE1vZGVsW2ldLm1vZGVsU3RyaW5nKTsKLQlwcmludGsoS0VSTl9JTkZPICJJbnN0YWxsaW5nICVzLCBjcmVhdGluZyAvZGV2L3R0eVIlZCAtICVsZFxuIiwKLQkgICAgICAgcm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsCi0JICAgICAgIHJvY2tldE1vZGVsW2ldLnN0YXJ0aW5nUG9ydE51bWJlciwKLQkgICAgICAgcm9ja2V0TW9kZWxbaV0uc3RhcnRpbmdQb3J0TnVtYmVyICsKLQkgICAgICAgcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMgLSAxKTsKKwlkZXZfaW5mbygmZGV2LT5kZXYsICJjb210cm9sIFBDSSBjb250cm9sbGVyICMlZCBmb3VuZCBhdCAiCisJCSJhZGRyZXNzICUwNGx4LCAlZCBBSU9QKHMpICglcyksIGNyZWF0aW5nIHR0eVIlZCAtICVsZFxuIiwKKwkJaSwgcmNrdHB0X2lvX2FkZHJbaV0sIG51bV9haW9wcywgcm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsCisJCXJvY2tldE1vZGVsW2ldLnN0YXJ0aW5nUG9ydE51bWJlciwKKwkJcm9ja2V0TW9kZWxbaV0uc3RhcnRpbmdQb3J0TnVtYmVyICsgcm9ja2V0TW9kZWxbaV0ubnVtUG9ydHMtMSk7CiAKIAlpZiAobnVtX2Fpb3BzIDw9IDApIHsKIAkJcmNrdHB0X2lvX2FkZHJbaV0gPSAwOwpAQCAtMjE5MSwxMCArMjE5MCwxMCBAQAogCQludW1fY2hhbiA9IHBvcnRzX3Blcl9haW9wOwogCQlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbnVtX2NoYW47IGNoYW4rKykKIAkJCXNQQ0lNb2RlbVJlc2V0KGN0bHAsIGNoYW4sIDEpOwotCQltZGVsYXkoNTAwKTsKKwkJbXNsZWVwKDUwMCk7CiAJCWZvciAoY2hhbiA9IDA7IGNoYW4gPCBudW1fY2hhbjsgY2hhbisrKQogCQkJc1BDSU1vZGVtUmVzZXQoY3RscCwgY2hhbiwgMCk7Ci0JCW1kZWxheSg1MDApOworCQltc2xlZXAoNTAwKTsKIAkJcm1TcGVha2VyUmVzZXQoY3RscCwgcm9ja2V0TW9kZWxbaV0ubW9kZWwpOwogCX0KIAlyZXR1cm4gKDEpOwpAQCAtMjI0MCw3ICsyMjM5LDkgQEAKIAogCS8qICBSZXNlcnZlIHRoZSBJTyByZWdpb24gKi8KIAlpZiAoIXJlcXVlc3RfcmVnaW9uKHJja3RwdF9pb19hZGRyW2ldLCA2NCwgIkNvbXRyb2wgUm9ja2V0UG9ydCIpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIlVuYWJsZSB0byByZXNlcnZlIElPIHJlZ2lvbiBmb3IgY29uZmlndXJlZCBJU0EgUm9ja2V0UG9ydCBhdCBhZGRyZXNzIDB4JWx4LCBib2FyZCBub3QgaW5zdGFsbGVkLi4uXG4iLCByY2t0cHRfaW9fYWRkcltpXSk7CisJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIHJlc2VydmUgSU8gcmVnaW9uIGZvciBjb25maWd1cmVkICIKKwkJCQkiSVNBIFJvY2tldFBvcnQgYXQgYWRkcmVzcyAweCVseCwgYm9hcmQgbm90ICIKKwkJCQkiaW5zdGFsbGVkLi4uXG4iLCByY2t0cHRfaW9fYWRkcltpXSk7CiAJCXJja3RwdF9pb19hZGRyW2ldID0gMDsKIAkJcmV0dXJuICgwKTsKIAl9CkBAIC0yMzA5LDEwICsyMzEwLDEwIEBACiAJCXRvdGFsX251bV9jaGFuID0gbnVtX2NoYW47CiAJCWZvciAoY2hhbiA9IDA7IGNoYW4gPCBudW1fY2hhbjsgY2hhbisrKQogCQkJc01vZGVtUmVzZXQoY3RscCwgY2hhbiwgMSk7Ci0JCW1kZWxheSg1MDApOworCQltc2xlZXAoNTAwKTsKIAkJZm9yIChjaGFuID0gMDsgY2hhbiA8IG51bV9jaGFuOyBjaGFuKyspCiAJCQlzTW9kZW1SZXNldChjdGxwLCBjaGFuLCAwKTsKLQkJbWRlbGF5KDUwMCk7CisJCW1zbGVlcCg1MDApOwogCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRNb2RlbSBJU0EiKTsKIAl9IGVsc2UgewogCQlzdHJjcHkocm9ja2V0TW9kZWxbaV0ubW9kZWxTdHJpbmcsICJSb2NrZXRQb3J0IElTQSIpOwpAQCAtMjQ4MCw3ICsyNDgxLDcgQEAKIAogCXJldHZhbCA9IHR0eV91bnJlZ2lzdGVyX2RyaXZlcihyb2NrZXRfZHJpdmVyKTsKIAlpZiAocmV0dmFsKQotCQlwcmludGsoS0VSTl9JTkZPICJFcnJvciAlZCB3aGlsZSB0cnlpbmcgdG8gdW5yZWdpc3RlciAiCisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgJWQgd2hpbGUgdHJ5aW5nIHRvIHVucmVnaXN0ZXIgIgogCQkgICAgICAgInJvY2tldHBvcnQgZHJpdmVyXG4iLCAtcmV0dmFsKTsKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfUlBfUE9SVFM7IGkrKykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yb2NrZXRfaW50LmggYi9kcml2ZXJzL2NoYXIvcm9ja2V0X2ludC5oCmluZGV4IDU1YjhmMmQuLmYzYTc1NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yb2NrZXRfaW50LmgKKysrIGIvZHJpdmVycy9jaGFyL3JvY2tldF9pbnQuaApAQCAtNDIsNyArNDIsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIHNPdXRCKHVuc2lnbmVkIHNob3J0IHBvcnQsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCiB7CiAjaWZkZWYgUk9DS0VUX0RFQlVHX0lPCi0JcHJpbnRrKCJzT3V0QigleCwgJXgpLi4uIiwgcG9ydCwgdmFsdWUpOworCXByaW50ayhLRVJOX0RFQlVHICJzT3V0QigleCwgJXgpLi4uXG4iLCBwb3J0LCB2YWx1ZSk7CiAjZW5kaWYKIAlvdXRiX3AodmFsdWUsIHBvcnQpOwogfQpAQCAtNTAsNyArNTAsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIHNPdXRXKHVuc2lnbmVkIHNob3J0IHBvcnQsIHVuc2lnbmVkIHNob3J0IHZhbHVlKQogewogI2lmZGVmIFJPQ0tFVF9ERUJVR19JTwotCXByaW50aygic091dFcoJXgsICV4KS4uLiIsIHBvcnQsIHZhbHVlKTsKKwlwcmludGsoS0VSTl9ERUJVRyAic091dFcoJXgsICV4KS4uLlxuIiwgcG9ydCwgdmFsdWUpOwogI2VuZGlmCiAJb3V0d19wKHZhbHVlLCBwb3J0KTsKIH0KQEAgLTU4LDcgKzU4LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzT3V0RFcodW5zaWduZWQgc2hvcnQgcG9ydCwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKIHsKICNpZmRlZiBST0NLRVRfREVCVUdfSU8KLQlwcmludGsoInNPdXREVygleCwgJWx4KS4uLiIsIHBvcnQsIHZhbHVlKTsKKwlwcmludGsoS0VSTl9ERUJVRyAic091dERXKCV4LCAlbHgpLi4uXG4iLCBwb3J0LCB2YWx1ZSk7CiAjZW5kaWYKIAlvdXRsX3AoY3B1X3RvX2xlMzIodmFsdWUpLCBwb3J0KTsKIH0KQEAgLTEwNSwxMiArMTA1LDYgQEAKICNkZWZpbmUgQUlPUElEX05VTEwgLTEJCS8qIG5vIEFJT1Agb3IgY2hhbm5lbCBleGlzdHMgKi8KICNkZWZpbmUgQUlPUElEXzAwMDEgMHgwMDAxCS8qIEFJT1AgcmVsZWFzZSAxICovCiAKLSNkZWZpbmUgTlVMTERFViAtMQkJLyogaWRlbnRpZmllcyBub24tZXhpc3RhbnQgZGV2aWNlICovCi0jZGVmaW5lIE5VTExDVEwgLTEJCS8qIGlkZW50aWZpZXMgbm9uLWV4aXN0YW50IGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgTlVMTENUTFBUUiAoQ09OVFJPTExFUl9UICopMAkvKiBpZGVudGlmaWVzIG5vbi1leGlzdGFudCBjb250cm9sbGVyICovCi0jZGVmaW5lIE5VTExBSU9QIC0xCQkvKiBpZGVudGlmaWVzIG5vbi1leGlzdGFudCBBSU9QICovCi0jZGVmaW5lIE5VTExDSEFOIC0xCQkvKiBpZGVudGlmaWVzIG5vbi1leGlzdGFudCBjaGFubmVsICovCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBHbG9iYWwgUmVnaXN0ZXIgT2Zmc2V0cyAtIERpcmVjdCBBY2Nlc3MgLSBGaXhlZCB2YWx1ZXMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTExODcsOSArMTE4MSw2IEBACiAjZGVmaW5lIFJPQ0tFVF9DTE9TSU5HCQkweDQwMDAwMDAwCS8qIFNlcmlhbCBwb3J0IGlzIGNsb3NpbmcgKi8KICNkZWZpbmUgUk9DS0VUX05PUk1BTF9BQ1RJVkUJMHgyMDAwMDAwMAkvKiBOb3JtYWwgcG9ydCBpcyBhY3RpdmUgKi8KIAotLyogdHR5IHN1YnR5cGVzICovCi0jZGVmaW5lIFNFUklBTF9UWVBFX05PUk1BTCAxCi0KIC8qCiAgKiBBc3NpZ25lZCBtYWpvciBudW1iZXJzIGZvciB0aGUgQ29tdHJvbCBSb2NrZXRwb3J0CiAgKi8KQEAgLTEyNDAsMTIgKzEyMzEsMyBAQAogLyogQ29tcGFjdCBQQ0kgZGV2aWNlICovIAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NSUDE2SU5URgkJMHgwOTAzCS8qIFJvY2tldHBvcnQgQ29tcGFjdCBQQ0kgMTYgcG9ydCB3L2V4dGVybmFsIEkvRiAqLwogCi0jZGVmaW5lIFRUWV9HRVRfTElORSh0KSB0LT5pbmRleAotI2RlZmluZSBUVFlfRFJJVkVSX01JTk9SX1NUQVJUKHQpIHQtPmRyaXZlci0+bWlub3Jfc3RhcnQKLSNkZWZpbmUgVFRZX0RSSVZFUl9TVUJUWVBFKHQpIHQtPmRyaXZlci0+c3VidHlwZQotI2RlZmluZSBUVFlfRFJJVkVSX05BTUUodCkgdC0+ZHJpdmVyLT5uYW1lCi0jZGVmaW5lIFRUWV9EUklWRVJfTkFNRV9CQVNFKHQpIHQtPmRyaXZlci0+bmFtZV9iYXNlCi0jZGVmaW5lIFRUWV9EUklWRVJfRkxVU0hfQlVGRkVSX0VYSVNUUyh0KSB0LT5kcml2ZXItPmZsdXNoX2J1ZmZlcgotI2RlZmluZSBUVFlfRFJJVkVSX0ZMVVNIX0JVRkZFUih0KSB0LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0KQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zZXJpYWwxNjcuYyBiL2RyaXZlcnMvY2hhci9zZXJpYWwxNjcuYwppbmRleCBmMTQ5N2NlLi5kZjhjZDBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc2VyaWFsMTY3LmMKKysrIGIvZHJpdmVycy9jaGFyL3NlcmlhbDE2Ny5jCkBAIC05MCw4ICs5MCw2IEBACiAKICNkZWZpbmUgU1REX0NPTV9GTEFHUyAoMCkKIAotI2RlZmluZSBTRVJJQUxfVFlQRV9OT1JNQUwgIDEKLQogc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpjeV9zZXJpYWxfZHJpdmVyOwogZXh0ZXJuIGludCBzZXJpYWxfY29uc29sZTsKIHN0YXRpYyBzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqc2VyaWFsX2NvbnNvbGVfaW5mbyA9IE5VTEw7CkBAIC0zNTksMTggKzM1Nyw2IEBACiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQkJCQkvKiBjeV9zdGFydCAqLwogCi0vKgotICogVGhpcyByb3V0aW5lIGlzIHVzZWQgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyIHRvIHNjaGVkdWxlCi0gKiBwcm9jZXNzaW5nIGluIHRoZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgcG9ydGlvbiBvZiB0aGUgZHJpdmVyCi0gKiAoYWxzbyBrbm93biBhcyB0aGUgImJvdHRvbSBoYWxmIikuICBUaGlzIGNhbiBiZSBjYWxsZWQgYW55Ci0gKiBudW1iZXIgb2YgdGltZXMgZm9yIGFueSBjaGFubmVsIHdpdGhvdXQgaGFybS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGN5X3NjaGVkX2V2ZW50KHN0cnVjdCBjeWNsYWRlc19wb3J0ICppbmZvLCBpbnQgZXZlbnQpCi17Ci0JaW5mby0+ZXZlbnQgfD0gMSA8PCBldmVudDsJLyogcmVtZW1iZXIgd2hhdCBraW5kIG9mIGV2ZW50IGFuZCB3aG8gKi8KLQlzY2hlZHVsZV93b3JrKCZpbmZvLT50cXVldWUpOwotfQkJCQkvKiBjeV9zY2hlZF9ldmVudCAqLwotCiAvKiBUaGUgcmVhbCBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lcyBhcmUgY2FsbGVkCiAgICB3aGVuZXZlciB0aGUgY2FyZCB3YW50cyBpdHMgaGFuZCBoZWxkLS1jaGFycwogICAgcmVjZWl2ZWQsIG91dCBidWZmZXIgZW1wdHksIG1vZGVtIGNoYW5nZSwgZXRjLgpAQCAtNDg1LDEwICs0NzEsMTIgQEAKIAkJICAgICYmIChpbmZvLT5mbGFncyAmIEFTWU5DX0NIRUNLX0NEKSkgewogCQkJaWYgKG1kbV9zdGF0dXMgJiBDeURDRCkgewogLyogQ1AoJyEnKTsgKi8KLQkJCQljeV9zY2hlZF9ldmVudChpbmZvLCBDeV9FVkVOVF9PUEVOX1dBS0VVUCk7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOwogCQkJfSBlbHNlIHsKIC8qIENQKCdAJyk7ICovCi0JCQkJY3lfc2NoZWRfZXZlbnQoaW5mbywgQ3lfRVZFTlRfSEFOR1VQKTsKKwkJCQl0dHlfaGFuZ3VwKGluZm8tPnR0eSk7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOworCQkJCWluZm8tPmZsYWdzICY9IH5BU1lOQ19OT1JNQUxfQUNUSVZFOwogCQkJfQogCQl9CiAJCWlmICgobWRtX2NoYW5nZSAmIEN5Q1RTKQpAQCAtNDk4LDggKzQ4Niw3IEBACiAJCQkJCS8qICEhISBjeV9zdGFydCBpc24ndCB1c2VkIGJlY2F1c2UuLi4gKi8KIAkJCQkJaW5mby0+dHR5LT5zdG9wcGVkID0gMDsKIAkJCQkJYmFzZV9hZGRyW0N5SUVSXSB8PSBDeVR4TXB0eTsKLQkJCQkJY3lfc2NoZWRfZXZlbnQoaW5mbywKLQkJCQkJCSAgICAgICBDeV9FVkVOVF9XUklURV9XQUtFVVApOworCQkJCQl0dHlfd2FrZXVwKGluZm8tPnR0eSk7CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlpZiAoIShtZG1fc3RhdHVzICYgQ3lDVFMpKSB7CkBAIC01NDUsOSArNTMyLDYgQEAKIAlpbmZvLT5sYXN0X2FjdGl2ZSA9IGppZmZpZXM7CiAJaWYgKGluZm8tPnR0eSA9PSAwKSB7CiAJCWJhc2VfYWRkcltDeUlFUl0gJj0gfihDeVR4TXB0eSB8IEN5VHhSZHkpOwotCQlpZiAoaW5mby0+eG1pdF9jbnQgPCBXQUtFVVBfQ0hBUlMpIHsKLQkJCWN5X3NjaGVkX2V2ZW50KGluZm8sIEN5X0VWRU5UX1dSSVRFX1dBS0VVUCk7Ci0JCX0KIAkJYmFzZV9hZGRyW0N5VEVPSVJdID0gQ3lOT1RSQU5TOwogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJfQpAQCAtNjI5LDkgKzYxMyw5IEBACiAJCX0KIAl9CiAKLQlpZiAoaW5mby0+eG1pdF9jbnQgPCBXQUtFVVBfQ0hBUlMpIHsKLQkJY3lfc2NoZWRfZXZlbnQoaW5mbywgQ3lfRVZFTlRfV1JJVEVfV0FLRVVQKTsKLQl9CisJaWYgKGluZm8tPnhtaXRfY250IDwgV0FLRVVQX0NIQVJTKQorCQl0dHlfd2FrZXVwKGluZm8tPnR0eSk7CisKIAliYXNlX2FkZHJbQ3lURU9JUl0gPSAoY2hhcl9jb3VudCAhPSBzYXZlZF9jbnQpID8gMCA6IEN5Tk9UUkFOUzsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CQkJCS8qIGN5X3R4X2ludGVycnVwdCAqLwpAQCAtNjkyLDQ5ICs2NzYsNiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0JCQkJLyogY3lfcnhfaW50ZXJydXB0ICovCiAKLS8qCi0gKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBoYW5kbGUgdGhlICJib3R0b20gaGFsZiIgcHJvY2Vzc2luZyBmb3IgdGhlCi0gKiBzZXJpYWwgZHJpdmVyLCBrbm93biBhbHNvIHRoZSAic29mdHdhcmUgaW50ZXJydXB0IiBwcm9jZXNzaW5nLgotICogVGhpcyBwcm9jZXNzaW5nIGlzIGRvbmUgYXQgdGhlIGtlcm5lbCBpbnRlcnJ1cHQgbGV2ZWwsIGFmdGVyIHRoZQotICogY3kjL19pbnRlcnJ1cHQoKSBoYXMgcmV0dXJuZWQsIEJVVCBXSVRIIElOVEVSUlVQVFMgVFVSTkVEIE9OLiAgVGhpcwotICogaXMgd2hlcmUgdGltZS1jb25zdW1pbmcgYWN0aXZpdGllcyB3aGljaCBjYW4gbm90IGJlIGRvbmUgaW4gdGhlCi0gKiBpbnRlcnJ1cHQgZHJpdmVyIHByb3BlciBhcmUgZG9uZTsgdGhlIGludGVycnVwdCBkcml2ZXIgc2NoZWR1bGVzCi0gKiB0aGVtIHVzaW5nIGN5X3NjaGVkX2V2ZW50KCksIGFuZCB0aGV5IGdldCBkb25lIGhlcmUuCi0gKgotICogVGhpcyBpcyBkb25lIHRocm91Z2ggb25lIGxldmVsIG9mIGluZGlyZWN0aW9uLS10aGUgdGFzayBxdWV1ZS4KLSAqIFdoZW4gYSBoYXJkd2FyZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIHdhbnRzIHNlcnZpY2UgYnkgdGhlCi0gKiBkcml2ZXIncyBib3R0b20gaGFsZiwgaXQgZW5xdWV1ZXMgdGhlIGFwcHJvcHJpYXRlIHRxX3N0cnVjdCAob25lCi0gKiBwZXIgcG9ydCkgdG8gdGhlIGtldmVudGQgd29yayBxdWV1ZSBhbmQgc2V0cyBhIHJlcXVlc3QgZmxhZwotICogdGhhdCB0aGUgd29yayBxdWV1ZSBiZSBwcm9jZXNzZWQuCi0gKgotICogQWx0aG91Z2ggdGhpcyBtYXkgc2VlbSB1bndpZWxkeSwgaXQgZ2l2ZXMgdGhlIHN5c3RlbSBhIHdheSB0bwotICogcGFzcyBhbiBhcmd1bWVudCAoaW4gdGhpcyBjYXNlIHRoZSBwb2ludGVyIHRvIHRoZSBjeWNsYWRlc19wb3J0Ci0gKiBzdHJ1Y3R1cmUpIHRvIHRoZSBib3R0b20gaGFsZiBvZiB0aGUgZHJpdmVyLiAgUHJldmlvdXMga2VybmVscwotICogaGFkIHRvIHBvbGwgZXZlcnkgcG9ydCB0byBzZWUgaWYgdGhhdCBwb3J0IG5lZWRlZCBzZXJ2aWNpbmcuCi0gKi8KLXN0YXRpYyB2b2lkIGRvX3NvZnRpbnQoc3RydWN0IHdvcmtfc3RydWN0ICp1Z2x5X2FwaSkKLXsKLQlzdHJ1Y3QgY3ljbGFkZXNfcG9ydCAqaW5mbyA9Ci0JICAgIGNvbnRhaW5lcl9vZih1Z2x5X2FwaSwgc3RydWN0IGN5Y2xhZGVzX3BvcnQsIHRxdWV1ZSk7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKLQotCXR0eSA9IGluZm8tPnR0eTsKLQlpZiAoIXR0eSkKLQkJcmV0dXJuOwotCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDeV9FVkVOVF9IQU5HVVAsICZpbmZvLT5ldmVudCkpIHsKLQkJdHR5X2hhbmd1cChpbmZvLT50dHkpOwotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7Ci0JCWluZm8tPmZsYWdzICY9IH5BU1lOQ19OT1JNQUxfQUNUSVZFOwotCX0KLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEN5X0VWRU5UX09QRU5fV0FLRVVQLCAmaW5mby0+ZXZlbnQpKSB7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+b3Blbl93YWl0KTsKLQl9Ci0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDeV9FVkVOVF9XUklURV9XQUtFVVAsICZpbmZvLT5ldmVudCkpIHsKLQkJdHR5X3dha2V1cCh0dHkpOwotCX0KLX0JCQkJLyogZG9fc29mdGludCAqLwotCiAvKiBUaGlzIGlzIGNhbGxlZCB3aGVuZXZlciBhIHBvcnQgYmVjb21lcyBhY3RpdmU7CiAgICBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkIGFuZCBEVFIgJiBSVFMgYXJlIHR1cm5lZCBvbi4KICAqLwpAQCAtMTc0NSw3ICsxNjg2LDYgQEAKIAlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikKIAkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOwogCXR0eV9sZGlzY19mbHVzaCh0dHkpOwotCWluZm8tPmV2ZW50ID0gMDsKIAlpbmZvLT50dHkgPSBOVUxMOwogCWlmIChpbmZvLT5ibG9ja2VkX29wZW4pIHsKIAkJaWYgKGluZm8tPmNsb3NlX2RlbGF5KSB7CkBAIC0yMjM2LDcgKzIxNzYsNiBAQAogCQkJCWluZm8tPnJjbyA9IGJhdWRfY29bRGVmU3BlZWRdID4+IDU7CS8qIFJ4IENPICovCiAJCQkJaW5mby0+Y2xvc2VfZGVsYXkgPSAwOwogCQkJCWluZm8tPnhfY2hhciA9IDA7Ci0JCQkJaW5mby0+ZXZlbnQgPSAwOwogCQkJCWluZm8tPmNvdW50ID0gMDsKICNpZmRlZiBTRVJJQUxfREVCVUdfQ09VTlQKIAkJCQlwcmludGsoImN5YzogJWQ6IHNldHRpbmcgY291bnQgdG8gMFxuIiwKQEAgLTIyNDUsNyArMjE4NCw2IEBACiAJCQkJaW5mby0+YmxvY2tlZF9vcGVuID0gMDsKIAkJCQlpbmZvLT5kZWZhdWx0X3RocmVzaG9sZCA9IDA7CiAJCQkJaW5mby0+ZGVmYXVsdF90aW1lb3V0ID0gMDsKLQkJCQlJTklUX1dPUksoJmluZm8tPnRxdWV1ZSwgZG9fc29mdGludCk7CiAJCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5mby0+b3Blbl93YWl0KTsKIAkJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5jbG9zZV93YWl0KTsKIAkJCQkvKiBpbmZvLT5zZXNzaW9uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3BlY2lhbGl4LmMgYi9kcml2ZXJzL2NoYXIvc3BlY2lhbGl4LmMKaW5kZXggNDU1ODU1Ni4uYzBlMDhjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3NwZWNpYWxpeC5jCisrKyBiL2RyaXZlcnMvY2hhci9zcGVjaWFsaXguYwpAQCAtMTc4LDkgKzE3OCw2IEBACiAJIEFTWU5DX1NQRF9ISSAgICAgICB8IEFTWU5DX1NQRUVEX1ZISSAgICB8IEFTWU5DX1NFU1NJT05fTE9DS09VVCB8IFwKIAkgQVNZTkNfUEdSUF9MT0NLT1VUIHwgQVNZTkNfQ0FMTE9VVF9OT0hVUCkKIAotI3VuZGVmIFJTX0VWRU5UX1dSSVRFX1dBS0VVUAotI2RlZmluZSBSU19FVkVOVF9XUklURV9XQUtFVVAJMAotCiBzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnNwZWNpYWxpeF9kcml2ZXI7CiAKIHN0YXRpYyBzdHJ1Y3Qgc3BlY2lhbGl4X2JvYXJkIHN4X2JvYXJkW1NYX05CT0FSRF0gPSAgewpAQCAtNjAyLDE3ICs1OTksNiBAQAogICogIEludGVycnVwdCBwcm9jZXNzaW5nIHJvdXRpbmVzLgogICogKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHN4X21hcmtfZXZlbnQoc3RydWN0IHNwZWNpYWxpeF9wb3J0ICogcG9ydCwgaW50IGV2ZW50KQotewotCWZ1bmNfZW50ZXIoKTsKLQotCXNldF9iaXQoZXZlbnQsICZwb3J0LT5ldmVudCk7Ci0Jc2NoZWR1bGVfd29yaygmcG9ydC0+dHF1ZXVlKTsKLQotCWZ1bmNfZXhpdCgpOwotfQotCi0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNwZWNpYWxpeF9wb3J0ICogc3hfZ2V0X3BvcnQoc3RydWN0IHNwZWNpYWxpeF9ib2FyZCAqIGJwLAogCQkJCQkgICAgICAgdW5zaWduZWQgY2hhciBjb25zdCAqIHdoYXQpCiB7CkBAIC04MDksNyArNzk1LDcgQEAKIAkJc3hfb3V0KGJwLCBDRDE4NnhfSUVSLCBwb3J0LT5JRVIpOwogCX0KIAlpZiAocG9ydC0+eG1pdF9jbnQgPD0gcG9ydC0+d2FrZXVwX2NoYXJzKQotCQlzeF9tYXJrX2V2ZW50KHBvcnQsIFJTX0VWRU5UX1dSSVRFX1dBS0VVUCk7CisgCQl0dHlfd2FrZXVwKHR0eSk7CiAKIAlmdW5jX2V4aXQoKTsKIH0KQEAgLTgzOSw3ICs4MjUsNyBAQAogCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5vcGVuX3dhaXQpOwogCQl9IGVsc2UgewogCQkJZHByaW50ayAoU1hfREVCVUdfU0lHTkFMUywgIlNlbmRpbmcgSFVQLlxuIik7Ci0JCQlzY2hlZHVsZV93b3JrKCZwb3J0LT50cXVldWVfaGFuZ3VwKTsKKwkJCXR0eV9oYW5ndXAodHR5KTsKIAkJfQogCX0KIApAQCAtODQ5LDcgKzgzNSw3IEBACiAJCQl0dHktPmh3X3N0b3BwZWQgPSAwOwogCQkJcG9ydC0+SUVSIHw9IElFUl9UWFJEWTsKIAkJCWlmIChwb3J0LT54bWl0X2NudCA8PSBwb3J0LT53YWtldXBfY2hhcnMpCi0JCQkJc3hfbWFya19ldmVudChwb3J0LCBSU19FVkVOVF9XUklURV9XQUtFVVApOworCQkJCXR0eV93YWtldXAodHR5KTsKIAkJfSBlbHNlIHsKIAkJCXR0eS0+aHdfc3RvcHBlZCA9IDE7CiAJCQlwb3J0LT5JRVIgJj0gfklFUl9UWFJEWTsKQEAgLTg2MSw3ICs4NDcsNyBAQAogCQkJdHR5LT5od19zdG9wcGVkID0gMDsKIAkJCXBvcnQtPklFUiB8PSBJRVJfVFhSRFk7CiAJCQlpZiAocG9ydC0+eG1pdF9jbnQgPD0gcG9ydC0+d2FrZXVwX2NoYXJzKQotCQkJCXN4X21hcmtfZXZlbnQocG9ydCwgUlNfRVZFTlRfV1JJVEVfV0FLRVVQKTsKKwkJCQl0dHlfd2FrZXVwKHR0eSk7CiAJCX0gZWxzZSB7CiAJCQl0dHktPmh3X3N0b3BwZWQgPSAxOwogCQkJcG9ydC0+SUVSICY9IH5JRVJfVFhSRFk7CkBAIC0xNjE4LDcgKzE2MDQsNiBAQAogCXR0eV9sZGlzY19mbHVzaCh0dHkpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiAJdHR5LT5jbG9zaW5nID0gMDsKLQlwb3J0LT5ldmVudCA9IDA7CiAJcG9ydC0+dHR5ID0gTlVMTDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiAJaWYgKHBvcnQtPmJsb2NrZWRfb3BlbikgewpAQCAtMjIzNSwzMiArMjIyMCw2IEBACiAJZnVuY19leGl0KCk7CiB9CiAKLQotLyoKLSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSB0aGUgd29yay1xdWV1ZSB3aGVuIHRoZSBpbnRlcnJ1cHQKLSAqIHJvdXRpbmUgaGFzIHNpZ25hbGxlZCB0aGF0IGEgaGFuZ3VwIGhhcyBvY2N1cnJlZC4gIFRoZSBwYXRoIG9mCi0gKiBoYW5ndXAgcHJvY2Vzc2luZyBpczoKLSAqCi0gKiAJc2VyaWFsIGludGVycnVwdCByb3V0aW5lIC0+ICh3b3JrcXVldWUpIC0+Ci0gKiAJZG9fc3hfaGFuZ3VwKCkgLT4gdHR5LT5oYW5ndXAoKSAtPiBzeF9oYW5ndXAoKQotICoKLSAqLwotc3RhdGljIHZvaWQgZG9fc3hfaGFuZ3VwKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQJKnBvcnQgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNwZWNpYWxpeF9wb3J0LCB0cXVldWVfaGFuZ3VwKTsKLQlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OwotCi0JZnVuY19lbnRlcigpOwotCi0JdHR5ID0gcG9ydC0+dHR5OwotCWlmICh0dHkpCi0JCXR0eV9oYW5ndXAodHR5KTsJLyogRklYTUU6IG1vZHVsZSByZW1vdmFsIHJhY2UgaGVyZSAqLwotCi0JZnVuY19leGl0KCk7Ci19Ci0KLQogc3RhdGljIHZvaWQgc3hfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQogewogCXN0cnVjdCBzcGVjaWFsaXhfcG9ydCAqcG9ydCA9IChzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQgKil0dHktPmRyaXZlcl9kYXRhOwpAQCAtMjI3OCw3ICsyMjM3LDYgQEAKIAogCXN4X3NodXRkb3duX3BvcnQoYnAsIHBvcnQpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0JcG9ydC0+ZXZlbnQgPSAwOwogCWJwLT5jb3VudCAtPSBwb3J0LT5jb3VudDsKIAlpZiAoYnAtPmNvdW50IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgInN4JWQ6IHN4X2hhbmd1cDogYmFkIGJvYXJkIGNvdW50OiAlZCBwb3J0OiAlZFxuIiwKQEAgLTIzMjAsMjYgKzIyNzgsNiBAQAogCX0KIH0KIAotCi1zdGF0aWMgdm9pZCBkb19zb2Z0aW50KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3Qgc3BlY2lhbGl4X3BvcnQJKnBvcnQgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNwZWNpYWxpeF9wb3J0LCB0cXVldWUpOwotCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7Ci0KLQlmdW5jX2VudGVyKCk7Ci0KLQlpZighKHR0eSA9IHBvcnQtPnR0eSkpIHsKLQkJZnVuY19leGl0KCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJTX0VWRU5UX1dSSVRFX1dBS0VVUCwgJnBvcnQtPmV2ZW50KSkKLSAJCXR0eV93YWtldXAodHR5KTsKLQotCWZ1bmNfZXhpdCgpOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9vcGVyYXRpb25zIHN4X29wcyA9IHsKIAkub3BlbiAgPSBzeF9vcGVuLAogCS5jbG9zZSA9IHN4X2Nsb3NlLApAQCAtMjM5Nyw4ICsyMzM1LDYgQEAKIAltZW1zZXQoc3hfcG9ydCwgMCwgc2l6ZW9mKHN4X3BvcnQpKTsKIAlmb3IgKGkgPSAwOyBpIDwgU1hfTlBPUlQgKiBTWF9OQk9BUkQ7IGkrKykgewogCQlzeF9wb3J0W2ldLm1hZ2ljID0gU1BFQ0lBTElYX01BR0lDOwotCQlJTklUX1dPUksoJnN4X3BvcnRbaV0udHF1ZXVlLCBkb19zb2Z0aW50KTsKLQkJSU5JVF9XT1JLKCZzeF9wb3J0W2ldLnRxdWV1ZV9oYW5ndXAsIGRvX3N4X2hhbmd1cCk7CiAJCXN4X3BvcnRbaV0uY2xvc2VfZGVsYXkgPSA1MCAqIEhaLzEwMDsKIAkJc3hfcG9ydFtpXS5jbG9zaW5nX3dhaXQgPSAzMDAwICogSFovMTAwOwogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzeF9wb3J0W2ldLm9wZW5fd2FpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3BlY2lhbGl4X2lvOC5oIGIvZHJpdmVycy9jaGFyL3NwZWNpYWxpeF9pbzguaAppbmRleCA4OTViZDkwLi4zZjJmODViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3BlY2lhbGl4X2lvOC5oCisrKyBiL2RyaXZlcnMvY2hhci9zcGVjaWFsaXhfaW84LmgKQEAgLTExMiw3ICsxMTIsNiBAQAogCXN0cnVjdCB0dHlfc3RydWN0IAkqIHR0eTsKIAlpbnQJCQljb3VudDsKIAlpbnQJCQlibG9ja2VkX29wZW47Ci0JdWxvbmcJCQlldmVudDsKIAlpbnQJCQl0aW1lb3V0OwogCWludAkJCWNsb3NlX2RlbGF5OwogCXVuc2lnbmVkIGNoYXIgCQkqIHhtaXRfYnVmOwpAQCAtMTIyLDggKzEyMSw2IEBACiAJaW50CQkJeG1pdF9jbnQ7CiAJd2FpdF9xdWV1ZV9oZWFkX3QJb3Blbl93YWl0OwogCXdhaXRfcXVldWVfaGVhZF90CWNsb3NlX3dhaXQ7Ci0Jc3RydWN0IHdvcmtfc3RydWN0CXRxdWV1ZTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJdHF1ZXVlX2hhbmd1cDsKIAlzaG9ydAkJCXdha2V1cF9jaGFyczsKIAlzaG9ydAkJCWJyZWFrX2xlbmd0aDsKIAl1bnNpZ25lZCBzaG9ydAkJY2xvc2luZ193YWl0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N0YWxsaW9uLmMgYi9kcml2ZXJzL2NoYXIvc3RhbGxpb24uYwppbmRleCA0NTc1OGQ1Li5mZWFjNTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3RhbGxpb24uYworKysgYi9kcml2ZXJzL2NoYXIvc3RhbGxpb24uYwpAQCAtMTQ1LDggKzE0NSw3IEBACiAgKi8KICNkZWZpbmUJQVNZSV9UWEJVU1kJMQogI2RlZmluZQlBU1lJX1RYTE9XCTIKLSNkZWZpbmUJQVNZSV9EQ0RDSEFOR0UJMwotI2RlZmluZQlBU1lJX1RYRkxPV0VECTQKKyNkZWZpbmUJQVNZSV9UWEZMT1dFRAkzCiAKIC8qCiAgKglEZWZpbmUgYW4gYXJyYXkgb2YgYm9hcmQgbmFtZXMgYXMgcHJpbnRhYmxlIHN0cmluZ3MuIEhhbmR5IGZvcgpAQCAtNjEwLDYgKzYwOSwyMyBAQAogCiBzdGF0aWMgc3RydWN0IGNsYXNzICpzdGFsbGlvbl9jbGFzczsKIAorc3RhdGljIHZvaWQgc3RsX2NkX2NoYW5nZShzdHJ1Y3Qgc3RscG9ydCAqcG9ydHApCit7CisJdW5zaWduZWQgaW50IG9sZHNpZ3MgPSBwb3J0cC0+c2lnczsKKworCWlmICghcG9ydHAtPnR0eSkKKwkJcmV0dXJuOworCisJcG9ydHAtPnNpZ3MgPSBzdGxfZ2V0c2lnbmFscyhwb3J0cCk7CisKKwlpZiAoKHBvcnRwLT5zaWdzICYgVElPQ01fQ0QpICYmICgob2xkc2lncyAmIFRJT0NNX0NEKSA9PSAwKSkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0cC0+b3Blbl93YWl0KTsKKworCWlmICgob2xkc2lncyAmIFRJT0NNX0NEKSAmJiAoKHBvcnRwLT5zaWdzICYgVElPQ01fQ0QpID09IDApKQorCQlpZiAocG9ydHAtPmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpCisJCQl0dHlfaGFuZ3VwKHBvcnRwLT50dHkpOworfQorCiAvKgogICoJQ2hlY2sgZm9yIGFueSBhcmd1bWVudHMgcGFzc2VkIGluIG9uIHRoZSBtb2R1bGUgbG9hZCBjb21tYW5kIGxpbmUuCiAgKi8KQEAgLTE3NzEsNDEgKzE3ODcsNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICoJU2VydmljZSBhbiBvZmYtbGV2ZWwgcmVxdWVzdCBmb3Igc29tZSBjaGFubmVsLgotICovCi1zdGF0aWMgdm9pZCBzdGxfb2ZmaW50cihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHN0bHBvcnQJCSpwb3J0cCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc3RscG9ydCwgdHF1ZXVlKTsKLQlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OwotCXVuc2lnbmVkIGludAkJb2xkc2lnczsKLQotCXByX2RlYnVnKCJzdGxfb2ZmaW50cihwb3J0cD0lcClcbiIsIHBvcnRwKTsKLQotCWlmIChwb3J0cCA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQl0dHkgPSBwb3J0cC0+dHR5OwotCWlmICh0dHkgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JaWYgKHRlc3RfYml0KEFTWUlfVFhMT1csICZwb3J0cC0+aXN0YXRlKSkKLQkJdHR5X3dha2V1cCh0dHkpOwotCi0JaWYgKHRlc3RfYml0KEFTWUlfRENEQ0hBTkdFLCAmcG9ydHAtPmlzdGF0ZSkpIHsKLQkJY2xlYXJfYml0KEFTWUlfRENEQ0hBTkdFLCAmcG9ydHAtPmlzdGF0ZSk7Ci0JCW9sZHNpZ3MgPSBwb3J0cC0+c2lnczsKLQkJcG9ydHAtPnNpZ3MgPSBzdGxfZ2V0c2lnbmFscyhwb3J0cCk7Ci0JCWlmICgocG9ydHAtPnNpZ3MgJiBUSU9DTV9DRCkgJiYgKChvbGRzaWdzICYgVElPQ01fQ0QpID09IDApKQotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0cC0+b3Blbl93YWl0KTsKLQkJaWYgKChvbGRzaWdzICYgVElPQ01fQ0QpICYmICgocG9ydHAtPnNpZ3MgJiBUSU9DTV9DRCkgPT0gMCkpCi0JCQlpZiAocG9ydHAtPmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpCi0JCQkJdHR5X2hhbmd1cCh0dHkpOwkvKiBGSVhNRTogbW9kdWxlIHJlbW92YWwgcmFjZSBoZXJlIC0gQUtQTSAqLwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgogICoJSW5pdGlhbGl6ZSBhbGwgdGhlIHBvcnRzIG9uIGEgcGFuZWwuCiAgKi8KIApAQCAtMTg0MCw3ICsxODIxLDYgQEAKIAkJcG9ydHAtPmJhdWRfYmFzZSA9IFNUTF9CQVVEQkFTRTsKIAkJcG9ydHAtPmNsb3NlX2RlbGF5ID0gU1RMX0NMT1NFREVMQVk7CiAJCXBvcnRwLT5jbG9zaW5nX3dhaXQgPSAzMCAqIEhaOwotCQlJTklUX1dPUksoJnBvcnRwLT50cXVldWUsIHN0bF9vZmZpbnRyKTsKIAkJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9ydHAtPm9wZW5fd2FpdCk7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBvcnRwLT5jbG9zZV93YWl0KTsKIAkJcG9ydHAtPnN0YXRzLmJyZCA9IHBvcnRwLT5icmRucjsKQEAgLTM1MzAsNyArMzUxMCw4IEBACiAJaWYgKChsZW4gPT0gMCkgfHwgKChsZW4gPCBTVExfVFhCVUZMT1cpICYmCiAJICAgICh0ZXN0X2JpdChBU1lJX1RYTE9XLCAmcG9ydHAtPmlzdGF0ZSkgPT0gMCkpKSB7CiAJCXNldF9iaXQoQVNZSV9UWExPVywgJnBvcnRwLT5pc3RhdGUpOwotCQlzY2hlZHVsZV93b3JrKCZwb3J0cC0+dHF1ZXVlKTsKKwkJaWYgKHBvcnRwLT50dHkpCisJCQl0dHlfd2FrZXVwKHBvcnRwLT50dHkpOwogCX0KIAogCWlmIChsZW4gPT0gMCkgewpAQCAtMzU0Niw3ICszNTI3LDggQEAKIAl9IGVsc2UgewogCQlsZW4gPSBtaW4obGVuLCBDRDE0MDBfVFhGSUZPU0laRSk7CiAJCXBvcnRwLT5zdGF0cy50eHRvdGFsICs9IGxlbjsKLQkJc3RsZW4gPSBtaW4obGVuLCAoKHBvcnRwLT50eC5idWYgKyBTVExfVFhCVUZTSVpFKSAtIHRhaWwpKTsKKwkJc3RsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwKKwkJCQkocG9ydHAtPnR4LmJ1ZiArIFNUTF9UWEJVRlNJWkUpIC0gdGFpbCk7CiAJCW91dGIoKFREUiArIHBvcnRwLT51YXJ0YWRkciksIGlvYWRkcik7CiAJCW91dHNiKChpb2FkZHIgKyBFUkVHX0RBVEEpLCB0YWlsLCBzdGxlbik7CiAJCWxlbiAtPSBzdGxlbjsKQEAgLTM1OTksNyArMzU4MSw3IEBACiAJCW91dGIoKFJEQ1IgKyBwb3J0cC0+dWFydGFkZHIpLCBpb2FkZHIpOwogCQlsZW4gPSBpbmIoaW9hZGRyICsgRVJFR19EQVRBKTsKIAkJaWYgKHR0eSA9PSBOVUxMIHx8IChidWZsZW4gPSB0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIGxlbikpID09IDApIHsKLQkJCWxlbiA9IG1pbihsZW4sIHNpemVvZihzdGxfdW53YW50ZWQpKTsKKwkJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLCBzaXplb2Yoc3RsX3Vud2FudGVkKSk7CiAJCQlvdXRiKChSRFNSICsgcG9ydHAtPnVhcnRhZGRyKSwgaW9hZGRyKTsKIAkJCWluc2IoKGlvYWRkciArIEVSRUdfREFUQSksICZzdGxfdW53YW50ZWRbMF0sIGxlbik7CiAJCQlwb3J0cC0+c3RhdHMucnhsb3N0ICs9IGxlbjsKQEAgLTM2OTIsOCArMzY3NCw3IEBACiAJb3V0YigoTUlTUiArIHBvcnRwLT51YXJ0YWRkciksIGlvYWRkcik7CiAJbWlzciA9IGluYihpb2FkZHIgKyBFUkVHX0RBVEEpOwogCWlmIChtaXNyICYgTUlTUl9EQ0QpIHsKLQkJc2V0X2JpdChBU1lJX0RDRENIQU5HRSwgJnBvcnRwLT5pc3RhdGUpOwotCQlzY2hlZHVsZV93b3JrKCZwb3J0cC0+dHF1ZXVlKTsKKwkJc3RsX2NkX2NoYW5nZShwb3J0cCk7CiAJCXBvcnRwLT5zdGF0cy5tb2RlbSsrOwogCX0KIApAQCAtNDQ0Nyw3ICs0NDI4LDggQEAKIAlpZiAoKGxlbiA9PSAwKSB8fCAoKGxlbiA8IFNUTF9UWEJVRkxPVykgJiYKIAkgICAgKHRlc3RfYml0KEFTWUlfVFhMT1csICZwb3J0cC0+aXN0YXRlKSA9PSAwKSkpIHsKIAkJc2V0X2JpdChBU1lJX1RYTE9XLCAmcG9ydHAtPmlzdGF0ZSk7Ci0JCXNjaGVkdWxlX3dvcmsoJnBvcnRwLT50cXVldWUpOyAKKwkJaWYgKHBvcnRwLT50dHkpCisJCQl0dHlfd2FrZXVwKHBvcnRwLT50dHkpOwogCX0KIAogCWlmIChsZW4gPT0gMCkgewpAQCAtNDQ2NSw3ICs0NDQ3LDggQEAKIAl9IGVsc2UgewogCQlsZW4gPSBtaW4obGVuLCBTQzI2MTk4X1RYRklGT1NJWkUpOwogCQlwb3J0cC0+c3RhdHMudHh0b3RhbCArPSBsZW47Ci0JCXN0bGVuID0gbWluKGxlbiwgKChwb3J0cC0+dHguYnVmICsgU1RMX1RYQlVGU0laRSkgLSB0YWlsKSk7CisJCXN0bGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sCisJCQkJKHBvcnRwLT50eC5idWYgKyBTVExfVFhCVUZTSVpFKSAtIHRhaWwpOwogCQlvdXRiKEdUWEZJRk8sIChpb2FkZHIgKyBYUF9BRERSKSk7CiAJCW91dHNiKChpb2FkZHIgKyBYUF9EQVRBKSwgdGFpbCwgc3RsZW4pOwogCQlsZW4gLT0gc3RsZW47CkBAIC00NTA2LDcgKzQ0ODksNyBAQAogCiAJaWYgKChpYWNrICYgSVZSX1RZUEVNQVNLKSA9PSBJVlJfUlhEQVRBKSB7CiAJCWlmICh0dHkgPT0gTlVMTCB8fCAoYnVmbGVuID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBsZW4pKSA9PSAwKSB7Ci0JCQlsZW4gPSBtaW4obGVuLCBzaXplb2Yoc3RsX3Vud2FudGVkKSk7CisJCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlbiwgc2l6ZW9mKHN0bF91bndhbnRlZCkpOwogCQkJb3V0YihHUlhGSUZPLCAoaW9hZGRyICsgWFBfQUREUikpOwogCQkJaW5zYigoaW9hZGRyICsgWFBfREFUQSksICZzdGxfdW53YW50ZWRbMF0sIGxlbik7CiAJCQlwb3J0cC0+c3RhdHMucnhsb3N0ICs9IGxlbjsKQEAgLTQ2NDcsOCArNDYzMCw3IEBACiAJY2FzZSBDSVJfU1VCQ09TOgogCQlpcHIgPSBzdGxfc2MyNjE5OGdldHJlZyhwb3J0cCwgSVBSKTsKIAkJaWYgKGlwciAmIElQUl9EQ0RDSEFOR0UpIHsKLQkJCXNldF9iaXQoQVNZSV9EQ0RDSEFOR0UsICZwb3J0cC0+aXN0YXRlKTsKLQkJCXNjaGVkdWxlX3dvcmsoJnBvcnRwLT50cXVldWUpOyAKKwkJCXN0bF9jZF9jaGFuZ2UocG9ydHApOwogCQkJcG9ydHAtPnN0YXRzLm1vZGVtKys7CiAJCX0KIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3guaCBiL2RyaXZlcnMvY2hhci9zeC5oCmluZGV4IDcwZDk3ODMuLjg3YzJkZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zeC5oCisrKyBiL2RyaXZlcnMvY2hhci9zeC5oCkBAIC04OCw4ICs4OCw2IEBACiAKICNkZWZpbmUgSVNfQ0ZfQk9BUkQoYm9hcmQpIChib2FyZC0+ZmxhZ3MgJiAoU1hfQ0ZJU0FfQk9BUkQgfCBTWF9DRlBDSV9CT0FSRCkpCiAKLSNkZWZpbmUgU0VSSUFMX1RZUEVfTk9STUFMIDEKLQogLyogVGhlIFNJIHByb2Nlc3NvciBjbG9jayBpcyByZXF1aXJlZCB0byBjYWxjdWxhdGUgdGhlIGNjX2ludF9jb3VudCByZWdpc3RlcgogICAgdmFsdWUgZm9yIHRoZSBTSSBjYXJkcy4gKi8KICNkZWZpbmUgU0lfUFJPQ0VTU09SX0NMT0NLIDI1MDAwMDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHR5X2F1ZGl0LmMgYi9kcml2ZXJzL2NoYXIvdHR5X2F1ZGl0LmMKaW5kZXggYmFjZGVkMC4uNzcyMjQ2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3R0eV9hdWRpdC5jCisrKyBiL2RyaXZlcnMvY2hhci90dHlfYXVkaXQuYwpAQCAtMjcsNyArMjcsNyBAQAogewogCXN0cnVjdCB0dHlfYXVkaXRfYnVmICpidWY7CiAKLQlidWYgPSBrbWFsbG9jKHNpemVvZiAoKmJ1ZiksIEdGUF9LRVJORUwpOworCWJ1ZiA9IGttYWxsb2Moc2l6ZW9mKCpidWYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikKIAkJZ290byBlcnI7CiAJaWYgKFBBR0VfU0laRSAhPSBOX1RUWV9CVUZfU0laRSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90dHlfaW8uYyBiL2RyaXZlcnMvY2hhci90dHlfaW8uYwppbmRleCA3OWM4NmM0Li42MTNlYzgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHR5X2lvLmMKKysrIGIvZHJpdmVycy9jaGFyL3R0eV9pby5jCkBAIC0xOSw3ICsxOSw3IEBACiAgKiBBbHNvIHJlc3RydWN0dXJlZCByb3V0aW5lcyBzbyB0aGF0IHRoZXJlIGlzIG1vcmUgb2YgYSBzZXBhcmF0aW9uCiAgKiBiZXR3ZWVuIHRoZSBoaWdoLWxldmVsIHR0eSByb3V0aW5lcyAodHR5X2lvLmMgYW5kIHR0eV9pb2N0bC5jKSBhbmQKICAqIHRoZSBsb3ctbGV2ZWwgdHR5IHJvdXRpbmVzIChzZXJpYWwuYywgcHR5LmMsIGNvbnNvbGUuYykuICBUaGlzCi0gKiBtYWtlcyBmb3IgY2xlYW5lciBhbmQgbW9yZSBjb21wYWN0IGNvZGUuICAtVFlULCA5LzE3LzkyIAorICogbWFrZXMgZm9yIGNsZWFuZXIgYW5kIG1vcmUgY29tcGFjdCBjb2RlLiAgLVRZVCwgOS8xNy85MgogICoKICAqIE1vZGlmaWVkIGJ5IEZyZWQgTi4gdmFuIEtlbXBlbiwgMDEvMjkvOTMsIHRvIGFkZCBsaW5lIGRpc2NpcGxpbmVzCiAgKiB3aGljaCBjYW4gYmUgZHluYW1pY2FsbHkgYWN0aXZhdGVkIGFuZCBkZS1hY3RpdmF0ZWQgYnkgdGhlIGxpbmUKQEAgLTQxLDcgKzQxLDcgQEAKICAqCiAgKiBOZXcgVElPQ0xJTlVYIHZhcmlhbnRzIGFkZGVkLgogICoJLS0gbWpAazMzMi5mZWxkLmN2dXQuY3osIDE5LU5vdi05NQotICogCisgKgogICogUmVzdHJpY3QgdnQgc3dpdGNoaW5nIHZpYSBpb2N0bCgpCiAgKiAgICAgIC0tIGdyaWZAY3MudWNyLmVkdSwgNS1EZWMtOTUKICAqCkBAIC02Miw3ICs2Miw4IEBACiAgKiAgICAgIC0tIFJ1c3NlbGwgS2luZyA8cm1rQGFybS5saW51eC5vcmcudWs+CiAgKgogICogTW92ZSBkb19TQUsoKSBpbnRvIHByb2Nlc3MgY29udGV4dC4gIExlc3Mgc3RhY2sgdXNlIGluIGRldmZzIGZ1bmN0aW9ucy4KLSAqIGFsbG9jX3R0eV9zdHJ1Y3QoKSBhbHdheXMgdXNlcyBrbWFsbG9jKCkgLS0gQW5kcmV3IE1vcnRvbiA8YW5kcmV3bUB1b3cuZWR1LmV1PiAxN01hcjAxCisgKiBhbGxvY190dHlfc3RydWN0KCkgYWx3YXlzIHVzZXMga21hbGxvYygpCisgKgkJCSAtLSBBbmRyZXcgTW9ydG9uIDxhbmRyZXdtQHVvdy5lZHUuZXU+IDE3TWFyMDEKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTEyNiw3ICsxMjcsNyBAQAogLyogVGhpcyBsaXN0IGdldHMgcG9rZWQgYXQgYnkgcHJvY2ZzIGFuZCB2YXJpb3VzIGJpdHMgb2YgYm9vdCB1cCBjb2RlLiBUaGlzCiAgICBjb3VsZCBkbyB3aXRoIHNvbWUgcmF0aW9uYWxpc2F0aW9uIHN1Y2ggYXMgcHVsbGluZyB0aGUgdHR5IHByb2MgZnVuY3Rpb24KICAgIGludG8gdGhpcyBmaWxlICovCi0gICAKKwogTElTVF9IRUFEKHR0eV9kcml2ZXJzKTsJCQkvKiBsaW5rZWQgbGlzdCBvZiB0dHkgZHJpdmVycyAqLwogCiAvKiBNdXRleCB0byBwcm90ZWN0IGNyZWF0aW5nIGFuZCByZWxlYXNpbmcgYSB0dHkuIFRoaXMgaXMgc2hhcmVkIHdpdGgKQEAgLTEzNiw3ICsxMzcsNyBAQAogCiAjaWZkZWYgQ09ORklHX1VOSVg5OF9QVFlTCiBleHRlcm4gc3RydWN0IHR0eV9kcml2ZXIgKnB0bV9kcml2ZXI7CS8qIFVuaXg5OCBwdHkgbWFzdGVyczsgZm9yIC9kZXYvcHRteCAqLwotZXh0ZXJuIGludCBwdHlfbGltaXQ7CQkvKiBDb25maWcgbGltaXQgb24gVW5peDk4IHB0eXMgKi8KK2V4dGVybiBpbnQgcHR5X2xpbWl0OwkJCS8qIENvbmZpZyBsaW1pdCBvbiBVbml4OTggcHR5cyAqLwogc3RhdGljIERFRklORV9JRFIoYWxsb2NhdGVkX3B0eXMpOwogc3RhdGljIERFRklORV9NVVRFWChhbGxvY2F0ZWRfcHR5c19sb2NrKTsKIHN0YXRpYyBpbnQgcHRteF9vcGVuKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKQEAgLTE0NiwxOSArMTQ3LDIwIEBACiAKIHN0YXRpYyBzc2l6ZV90IHR0eV9yZWFkKHN0cnVjdCBmaWxlICosIGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOwogc3RhdGljIHNzaXplX3QgdHR5X3dyaXRlKHN0cnVjdCBmaWxlICosIGNvbnN0IGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOwotc3NpemVfdCByZWRpcmVjdGVkX3R0eV93cml0ZShzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKK3NzaXplX3QgcmVkaXJlY3RlZF90dHlfd3JpdGUoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciBfX3VzZXIgKiwKKwkJCQkJCQlzaXplX3QsIGxvZmZfdCAqKTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgdHR5X3BvbGwoc3RydWN0IGZpbGUgKiwgcG9sbF90YWJsZSAqKTsKIHN0YXRpYyBpbnQgdHR5X29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwogc3RhdGljIGludCB0dHlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7Ci1pbnQgdHR5X2lvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCitpbnQgdHR5X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKICNpZmRlZiBDT05GSUdfQ09NUEFUCi1zdGF0aWMgbG9uZyB0dHlfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICogZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKK3N0YXRpYyBsb25nIHR0eV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCiAJCQkJdW5zaWduZWQgbG9uZyBhcmcpOwogI2Vsc2UKICNkZWZpbmUgdHR5X2NvbXBhdF9pb2N0bCBOVUxMCiAjZW5kaWYKLXN0YXRpYyBpbnQgdHR5X2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICogZmlscCwgaW50IG9uKTsKK3N0YXRpYyBpbnQgdHR5X2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgb24pOwogc3RhdGljIHZvaWQgcmVsZWFzZV90dHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGlkeCk7CiBzdGF0aWMgdm9pZCBfX3Byb2Nfc2V0X3R0eShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiBzdGF0aWMgdm9pZCBwcm9jX3NldF90dHkoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwpAQCAtMjQ0LDcgKzI0Niw3IEBACiAjaWZkZWYgQ0hFQ0tfVFRZX0NPVU5UCiAJc3RydWN0IGxpc3RfaGVhZCAqcDsKIAlpbnQgY291bnQgPSAwOwotCQorCiAJZmlsZV9saXN0X2xvY2soKTsKIAlsaXN0X2Zvcl9lYWNoKHAsICZ0dHktPnR0eV9maWxlcykgewogCQljb3VudCsrOwpAQCAtMjgxLDExICsyODMsMTEgQEAKIHN0YXRpYyB2b2lkIHR0eV9idWZmZXJfZnJlZV9hbGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKIAlzdHJ1Y3QgdHR5X2J1ZmZlciAqdGhlYWQ7Ci0Jd2hpbGUoKHRoZWFkID0gdHR5LT5idWYuaGVhZCkgIT0gTlVMTCkgeworCXdoaWxlICgodGhlYWQgPSB0dHktPmJ1Zi5oZWFkKSAhPSBOVUxMKSB7CiAJCXR0eS0+YnVmLmhlYWQgPSB0aGVhZC0+bmV4dDsKIAkJa2ZyZWUodGhlYWQpOwogCX0KLQl3aGlsZSgodGhlYWQgPSB0dHktPmJ1Zi5mcmVlKSAhPSBOVUxMKSB7CisJd2hpbGUgKCh0aGVhZCA9IHR0eS0+YnVmLmZyZWUpICE9IE5VTEwpIHsKIAkJdHR5LT5idWYuZnJlZSA9IHRoZWFkLT5uZXh0OwogCQlrZnJlZSh0aGVhZCk7CiAJfQpAQCAtMzMxLDcgKzMzMyw3IEBACiAJaWYgKHR0eS0+YnVmLm1lbW9yeV91c2VkICsgc2l6ZSA+IDY1NTM2KQogCQlyZXR1cm4gTlVMTDsKIAlwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHR0eV9idWZmZXIpICsgMiAqIHNpemUsIEdGUF9BVE9NSUMpOwotCWlmKHAgPT0gTlVMTCkKKwlpZiAocCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAlwLT51c2VkID0gMDsKIAlwLT5zaXplID0gc2l6ZTsKQEAgLTM2MSw3ICszNjMsNyBAQAogCXR0eS0+YnVmLm1lbW9yeV91c2VkIC09IGItPnNpemU7CiAJV0FSTl9PTih0dHktPmJ1Zi5tZW1vcnlfdXNlZCA8IDApOwogCi0JaWYoYi0+c2l6ZSA+PSA1MTIpCisJaWYgKGItPnNpemUgPj0gNTEyKQogCQlrZnJlZShiKTsKIAllbHNlIHsKIAkJYi0+bmV4dCA9IHR0eS0+YnVmLmZyZWU7CkBAIC0zODQsNyArMzg2LDcgQEAKIHsKIAlzdHJ1Y3QgdHR5X2J1ZmZlciAqdGhlYWQ7CiAKLQl3aGlsZSgodGhlYWQgPSB0dHktPmJ1Zi5oZWFkKSAhPSBOVUxMKSB7CisJd2hpbGUgKCh0aGVhZCA9IHR0eS0+YnVmLmhlYWQpICE9IE5VTEwpIHsKIAkJdHR5LT5idWYuaGVhZCA9IHRoZWFkLT5uZXh0OwogCQl0dHlfYnVmZmVyX2ZyZWUodHR5LCB0aGVhZCk7CiAJfQpAQCAtNDM2LDkgKzQzOCw5IEBACiBzdGF0aWMgc3RydWN0IHR0eV9idWZmZXIgKnR0eV9idWZmZXJfZmluZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgdHR5X2J1ZmZlciAqKnRiaCA9ICZ0dHktPmJ1Zi5mcmVlOwotCXdoaWxlKCgqdGJoKSAhPSBOVUxMKSB7CisJd2hpbGUgKCgqdGJoKSAhPSBOVUxMKSB7CiAJCXN0cnVjdCB0dHlfYnVmZmVyICp0ID0gKnRiaDsKLQkJaWYodC0+c2l6ZSA+PSBzaXplKSB7CisJCWlmICh0LT5zaXplID49IHNpemUpIHsKIAkJCSp0YmggPSB0LT5uZXh0OwogCQkJdC0+bmV4dCA9IE5VTEw7CiAJCQl0LT51c2VkID0gMDsKQEAgLTQ1MCw3ICs0NTIsNyBAQAogCQl0YmggPSAmKCgqdGJoKS0+bmV4dCk7CiAJfQogCS8qIFJvdW5kIHRoZSBidWZmZXIgc2l6ZSBvdXQgKi8KLQlzaXplID0gKHNpemUgKyAweEZGKSAmIH4gMHhGRjsKKwlzaXplID0gKHNpemUgKyAweEZGKSAmIH4weEZGOwogCXJldHVybiB0dHlfYnVmZmVyX2FsbG9jKHR0eSwgc2l6ZSk7CiAJLyogU2hvdWxkIHBvc3NpYmx5IGNoZWNrIGlmIHRoaXMgZmFpbHMgZm9yIHRoZSBsYXJnZXN0IGJ1ZmZlciB3ZQogCSAgIGhhdmUgcXVldWVkIGFuZCByZWN5Y2xlIHRoYXQgPyAqLwpAQCAtNTIwLDcgKzUyMiw3IEBACiAJCWludCBzcGFjZSA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgc2l6ZSAtIGNvcGllZCk7CiAJCXN0cnVjdCB0dHlfYnVmZmVyICp0YiA9IHR0eS0+YnVmLnRhaWw7CiAJCS8qIElmIHRoZXJlIGlzIG5vIHNwYWNlIHRoZW4gdGIgbWF5IGJlIE5VTEwgKi8KLQkJaWYodW5saWtlbHkoc3BhY2UgPT0gMCkpCisJCWlmICh1bmxpa2VseShzcGFjZSA9PSAwKSkKIAkJCWJyZWFrOwogCQltZW1jcHkodGItPmNoYXJfYnVmX3B0ciArIHRiLT51c2VkLCBjaGFycywgc3BhY2UpOwogCQltZW1zZXQodGItPmZsYWdfYnVmX3B0ciArIHRiLT51c2VkLCBUVFlfTk9STUFMLCBzcGFjZSk7CkBAIC01NTYsNyArNTU4LDcgQEAKIAkJaW50IHNwYWNlID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBzaXplIC0gY29waWVkKTsKIAkJc3RydWN0IHR0eV9idWZmZXIgKnRiID0gdHR5LT5idWYudGFpbDsKIAkJLyogSWYgdGhlcmUgaXMgbm8gc3BhY2UgdGhlbiB0YiBtYXkgYmUgTlVMTCAqLwotCQlpZih1bmxpa2VseShzcGFjZSA9PSAwKSkKKwkJaWYgKHVubGlrZWx5KHNwYWNlID09IDApKQogCQkJYnJlYWs7CiAJCW1lbWNweSh0Yi0+Y2hhcl9idWZfcHRyICsgdGItPnVzZWQsIGNoYXJzLCBzcGFjZSk7CiAJCW1lbWNweSh0Yi0+ZmxhZ19idWZfcHRyICsgdGItPnVzZWQsIGZsYWdzLCBzcGFjZSk7CkBAIC02MDgsNyArNjEwLDggQEAKICAqCUxvY2tpbmc6IE1heSBjYWxsIGZ1bmN0aW9ucyB0YWtpbmcgdHR5LT5idWYubG9jawogICovCiAKLWludCB0dHlfcHJlcGFyZV9mbGlwX3N0cmluZyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyICoqY2hhcnMsIHNpemVfdCBzaXplKQoraW50IHR0eV9wcmVwYXJlX2ZsaXBfc3RyaW5nKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgKipjaGFycywKKwkJCQkJCQkJc2l6ZV90IHNpemUpCiB7CiAJaW50IHNwYWNlID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBzaXplKTsKIAlpZiAobGlrZWx5KHNwYWNlKSkgewpAQCAtNjM4LDcgKzY0MSw4IEBACiAgKglMb2NraW5nOiBNYXkgY2FsbCBmdW5jdGlvbnMgdGFraW5nIHR0eS0+YnVmLmxvY2sKICAqLwogCi1pbnQgdHR5X3ByZXBhcmVfZmxpcF9zdHJpbmdfZmxhZ3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciAqKmNoYXJzLCBjaGFyICoqZmxhZ3MsIHNpemVfdCBzaXplKQoraW50IHR0eV9wcmVwYXJlX2ZsaXBfc3RyaW5nX2ZsYWdzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQl1bnNpZ25lZCBjaGFyICoqY2hhcnMsIGNoYXIgKipmbGFncywgc2l6ZV90IHNpemUpCiB7CiAJaW50IHNwYWNlID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBzaXplKTsKIAlpZiAobGlrZWx5KHNwYWNlKSkgewpAQCAtNjYwLDEyICs2NjQsMTIgQEAKICAqCUBudW06IGxpbmUgZGlzY2lwbGluZSBudW1iZXIKICAqCiAgKglUaGlzIGlzIHByb2JhYmx5IG92ZXJraWxsIGZvciByZWFsIHdvcmxkIHByb2Nlc3NvcnMgYnV0Ci0gKgl0aGV5IGFyZSBub3Qgb24gaG90IHBhdGhzIHNvIGEgbGl0dGxlIGRpc2NpcGxpbmUgd29uJ3QgZG8gCisgKgl0aGV5IGFyZSBub3Qgb24gaG90IHBhdGhzIHNvIGEgbGl0dGxlIGRpc2NpcGxpbmUgd29uJ3QgZG8KICAqCWFueSBoYXJtLgogICoKICAqCUxvY2tpbmc6IHRha2VzIHRlcm1pb3NfbXV0ZXgKICAqLwotIAorCiBzdGF0aWMgdm9pZCB0dHlfc2V0X3Rlcm1pb3NfbGRpc2Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IG51bSkKIHsKIAltdXRleF9sb2NrKCZ0dHktPnRlcm1pb3NfbXV0ZXgpOwpAQCAtNjc4LDEwICs2ODIsMTEgQEAKICAqCW11c3QgYmUgdGFrZW4gd2l0aCBpcnFzIG9mZiBiZWNhdXNlIHRoZXJlIGFyZSBoYW5ndXAgcGF0aAogICoJY2FsbGVycyB3aG8gd2lsbCBkbyBsZGlzYyBsb29rdXBzIGFuZCBjYW5ub3Qgc2xlZXAuCiAgKi8KLSAKKwogc3RhdGljIERFRklORV9TUElOTE9DSyh0dHlfbGRpc2NfbG9jayk7CiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQodHR5X2xkaXNjX3dhaXQpOwotc3RhdGljIHN0cnVjdCB0dHlfbGRpc2MgdHR5X2xkaXNjc1tOUl9MRElTQ1NdOwkvKiBsaW5lIGRpc2MgZGlzcGF0Y2ggdGFibGUgKi8KKy8qIExpbmUgZGlzYyBkaXNwYXRjaCB0YWJsZSAqLworc3RhdGljIHN0cnVjdCB0dHlfbGRpc2MgdHR5X2xkaXNjc1tOUl9MRElTQ1NdOwogCiAvKioKICAqCXR0eV9yZWdpc3Rlcl9sZGlzYwktCWluc3RhbGwgYSBsaW5lIGRpc2NpcGxpbmUKQEAgLTcwMCwxNyArNzA1LDE3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0ID0gMDsKLQkKKwogCWlmIChkaXNjIDwgTl9UVFkgfHwgZGlzYyA+PSBOUl9MRElTQ1MpCiAJCXJldHVybiAtRUlOVkFMOwotCQorCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7CiAJdHR5X2xkaXNjc1tkaXNjXSA9ICpuZXdfbGRpc2M7CiAJdHR5X2xkaXNjc1tkaXNjXS5udW0gPSBkaXNjOwogCXR0eV9sZGlzY3NbZGlzY10uZmxhZ3MgfD0gTERJU0NfRkxBR19ERUZJTkVEOwogCXR0eV9sZGlzY3NbZGlzY10ucmVmY291bnQgPSAwOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7Ci0JCisKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTCh0dHlfcmVnaXN0ZXJfbGRpc2MpOwpAQCAtNzY2LDIwICs3NzEsMTggQEAKIAogCWlmIChkaXNjIDwgTl9UVFkgfHwgZGlzYyA+PSBOUl9MRElTQ1MpCiAJCXJldHVybiBOVUxMOwotCQorCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7CiAKIAlsZCA9ICZ0dHlfbGRpc2NzW2Rpc2NdOwogCS8qIENoZWNrIHRoZSBlbnRyeSBpcyBkZWZpbmVkICovCi0JaWYobGQtPmZsYWdzICYgTERJU0NfRkxBR19ERUZJTkVEKQotCXsKKwlpZiAobGQtPmZsYWdzICYgTERJU0NfRkxBR19ERUZJTkVEKSB7CiAJCS8qIElmIHRoZSBtb2R1bGUgaXMgYmVpbmcgdW5sb2FkZWQgd2UgY2FuJ3QgdXNlIGl0ICovCiAJCWlmICghdHJ5X21vZHVsZV9nZXQobGQtPm93bmVyKSkKLQkJICAgICAgIAlsZCA9IE5VTEw7CisJCQlsZCA9IE5VTEw7CiAJCWVsc2UgLyogbG9jayBpdCAqLwogCQkJbGQtPnJlZmNvdW50Kys7Ci0JfQotCWVsc2UKKwl9IGVsc2UKIAkJbGQgPSBOVUxMOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7CiAJcmV0dXJuIGxkOwpAQCAtODAyLDkgKzgwNSw5IEBACiB7CiAJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkKKwogCUJVR19PTihkaXNjIDwgTl9UVFkgfHwgZGlzYyA+PSBOUl9MRElTQ1MpOwotCQkKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHlfbGRpc2NfbG9jaywgZmxhZ3MpOwogCWxkID0gJnR0eV9sZGlzY3NbZGlzY107CiAJQlVHX09OKGxkLT5yZWZjb3VudCA9PSAwKTsKQEAgLTgxMiw3ICs4MTUsNyBAQAogCW1vZHVsZV9wdXQobGQtPm93bmVyKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHlfbGRpc2NfbG9jaywgZmxhZ3MpOwogfQotCQorCiBFWFBPUlRfU1lNQk9MX0dQTCh0dHlfbGRpc2NfcHV0KTsKIAogLyoqCkBAIC04NTEsMTEgKzg1NCwxMCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CiAJaW50IHJldCA9IDA7Ci0JCisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKIAlsZCA9ICZ0dHktPmxkaXNjOwotCWlmKHRlc3RfYml0KFRUWV9MRElTQywgJnR0eS0+ZmxhZ3MpKQotCXsKKwlpZiAodGVzdF9iaXQoVFRZX0xESVNDLCAmdHR5LT5mbGFncykpIHsKIAkJbGQtPnJlZmNvdW50Kys7CiAJCXJldCA9IDE7CiAJfQpAQCAtODY3LDggKzg2OSw4IEBACiAgKgl0dHlfbGRpc2NfcmVmX3dhaXQJLQl3YWl0IGZvciB0aGUgdHR5IGxkaXNjCiAgKglAdHR5OiB0dHkgZGV2aWNlCiAgKgotICoJRGVyZWZlcmVuY2UgdGhlIGxpbmUgZGlzY2lwbGluZSBmb3IgdGhlIHRlcm1pbmFsIGFuZCB0YWtlIGEgCi0gKglyZWZlcmVuY2UgdG8gaXQuIElmIHRoZSBsaW5lIGRpc2NpcGxpbmUgaXMgaW4gZmx1eCB0aGVuIAorICoJRGVyZWZlcmVuY2UgdGhlIGxpbmUgZGlzY2lwbGluZSBmb3IgdGhlIHRlcm1pbmFsIGFuZCB0YWtlIGEKKyAqCXJlZmVyZW5jZSB0byBpdC4gSWYgdGhlIGxpbmUgZGlzY2lwbGluZSBpcyBpbiBmbHV4IHRoZW4KICAqCXdhaXQgcGF0aWVudGx5IHVudGlsIGl0IGNoYW5nZXMuCiAgKgogICoJTm90ZTogTXVzdCBub3QgYmUgY2FsbGVkIGZyb20gYW4gSVJRL3RpbWVyIGNvbnRleHQuIFRoZSBjYWxsZXIKQEAgLTg3OCwxMiArODgwLDEyIEBACiAgKgogICoJTG9ja2luZzogY2FsbCBmdW5jdGlvbnMgdGFrZSB0dHlfbGRpc2NfbG9jawogICovCi0gCisKIHN0cnVjdCB0dHlfbGRpc2MgKnR0eV9sZGlzY19yZWZfd2FpdChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCS8qIHdhaXRfZXZlbnQgaXMgYSBtYWNybyAqLwogCXdhaXRfZXZlbnQodHR5X2xkaXNjX3dhaXQsIHR0eV9sZGlzY190cnkodHR5KSk7Ci0JaWYodHR5LT5sZGlzYy5yZWZjb3VudCA9PSAwKQorCWlmICh0dHktPmxkaXNjLnJlZmNvdW50ID09IDApCiAJCXByaW50ayhLRVJOX0VSUiAidHR5X2xkaXNjX3JlZl93YWl0XG4iKTsKIAlyZXR1cm4gJnR0eS0+bGRpc2M7CiB9CkBAIC04OTQsMTYgKzg5NiwxNiBAQAogICoJdHR5X2xkaXNjX3JlZgkJLQlnZXQgdGhlIHR0eSBsZGlzYwogICoJQHR0eTogdHR5IGRldmljZQogICoKLSAqCURlcmVmZXJlbmNlIHRoZSBsaW5lIGRpc2NpcGxpbmUgZm9yIHRoZSB0ZXJtaW5hbCBhbmQgdGFrZSBhIAotICoJcmVmZXJlbmNlIHRvIGl0LiBJZiB0aGUgbGluZSBkaXNjaXBsaW5lIGlzIGluIGZsdXggdGhlbiAKKyAqCURlcmVmZXJlbmNlIHRoZSBsaW5lIGRpc2NpcGxpbmUgZm9yIHRoZSB0ZXJtaW5hbCBhbmQgdGFrZSBhCisgKglyZWZlcmVuY2UgdG8gaXQuIElmIHRoZSBsaW5lIGRpc2NpcGxpbmUgaXMgaW4gZmx1eCB0aGVuCiAgKglyZXR1cm4gTlVMTC4gQ2FuIGJlIGNhbGxlZCBmcm9tIElSUSBhbmQgdGltZXIgZnVuY3Rpb25zLgogICoKICAqCUxvY2tpbmc6IGNhbGxlZCBmdW5jdGlvbnMgdGFrZSB0dHlfbGRpc2NfbG9jawogICovCi0gCisKIHN0cnVjdCB0dHlfbGRpc2MgKnR0eV9sZGlzY19yZWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlpZih0dHlfbGRpc2NfdHJ5KHR0eSkpCisJaWYgKHR0eV9sZGlzY190cnkodHR5KSkKIAkJcmV0dXJuICZ0dHktPmxkaXNjOwogCXJldHVybiBOVUxMOwogfQpAQCAtOTE5LDE5ICs5MjEsMTkgQEAKICAqCiAgKglMb2NraW5nOiB0YWtlcyB0dHlfbGRpc2NfbG9jawogICovCi0gCisKIHZvaWQgdHR5X2xkaXNjX2RlcmVmKHN0cnVjdCB0dHlfbGRpc2MgKmxkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlCVUdfT04obGQgPT0gTlVMTCk7Ci0JCQorCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7Ci0JaWYobGQtPnJlZmNvdW50ID09IDApCisJaWYgKGxkLT5yZWZjb3VudCA9PSAwKQogCQlwcmludGsoS0VSTl9FUlIgInR0eV9sZGlzY19kZXJlZjogbm8gcmVmZXJlbmNlcy5cbiIpOwogCWVsc2UKIAkJbGQtPnJlZmNvdW50LS07Ci0JaWYobGQtPnJlZmNvdW50ID09IDApCisJaWYgKGxkLT5yZWZjb3VudCA9PSAwKQogCQl3YWtlX3VwKCZ0dHlfbGRpc2Nfd2FpdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKIH0KQEAgLTk1NCw3ICs5NTYsNyBAQAogCXNldF9iaXQoVFRZX0xESVNDLCAmdHR5LT5mbGFncyk7CiAJd2FrZV91cCgmdHR5X2xkaXNjX3dhaXQpOwogfQotCQorCiAvKioKICAqCXR0eV9zZXRfbGRpc2MJCS0Jc2V0IGxpbmUgZGlzY2lwbGluZQogICoJQHR0eTogdGhlIHRlcm1pbmFsIHRvIHNldApAQCAtOTY2LDcgKzk2OCw3IEBACiAgKglMb2NraW5nOiB0YWtlcyB0dHlfbGRpc2NfbG9jay4KICAqCQkgY2FsbGVkIGZ1bmN0aW9ucyB0YWtlIHRlcm1pb3NfbXV0ZXgKICAqLwotIAorCiBzdGF0aWMgaW50IHR0eV9zZXRfbGRpc2Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGxkaXNjKQogewogCWludCByZXR2YWwgPSAwOwpAQCAtMTAyMiw3ICsxMDI0LDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHlfbGRpc2NfbG9jaywgZmxhZ3MpOwogCWlmICh0dHktPmxkaXNjLnJlZmNvdW50IHx8IChvX3R0eSAmJiBvX3R0eS0+bGRpc2MucmVmY291bnQpKSB7Ci0JCWlmKHR0eS0+bGRpc2MucmVmY291bnQpIHsKKwkJaWYgKHR0eS0+bGRpc2MucmVmY291bnQpIHsKIAkJCS8qIEZyZWUgdGhlIG5ldyBsZGlzYyB3ZSBncmFiYmVkLiBNdXN0IGRyb3AgdGhlIGxvY2sKIAkJCSAgIGZpcnN0LiAqLwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKQEAgLTEwMzEsMTQgKzEwMzMsMTQgQEAKIAkJCSAqIFRoZXJlIGFyZSBzZXZlcmFsIHJlYXNvbnMgd2UgbWF5IGJlIGJ1c3ksIGluY2x1ZGluZwogCQkJICogcmFuZG9tIG1vbWVudGFyeSBJL08gdHJhZmZpYy4gV2UgbXVzdCB0aGVyZWZvcmUKIAkJCSAqIHJldHJ5LiBXZSBjb3VsZCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGJsb2NraW5nIG9wcwotCQkJICogYW5kIHJldHJpZXMgaWYgd2UgbWFkZSB0dHlfbGRpc2Nfd2FpdCgpIHNtYXJ0ZXIuIFRoYXQKLQkJCSAqIGlzIHVwIGZvciBkaXNjdXNzaW9uLgorCQkJICogYW5kIHJldHJpZXMgaWYgd2UgbWFkZSB0dHlfbGRpc2Nfd2FpdCgpIHNtYXJ0ZXIuCisJCQkgKiBUaGF0IGlzIHVwIGZvciBkaXNjdXNzaW9uLgogCQkJICovCiAJCQlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHR0eV9sZGlzY193YWl0LCB0dHktPmxkaXNjLnJlZmNvdW50ID09IDApIDwgMCkKIAkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCQkJZ290byByZXN0YXJ0OwogCQl9Ci0JCWlmKG9fdHR5ICYmIG9fdHR5LT5sZGlzYy5yZWZjb3VudCkgeworCQlpZiAob190dHkgJiYgb190dHktPmxkaXNjLnJlZmNvdW50KSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHlfbGRpc2NfbG9jaywgZmxhZ3MpOwogCQkJdHR5X2xkaXNjX3B1dChsZGlzYyk7CiAJCQlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHR0eV9sZGlzY193YWl0LCBvX3R0eS0+bGRpc2MucmVmY291bnQgPT0gMCkgPCAwKQpAQCAtMTA0Niw5ICsxMDQ4LDEwIEBACiAJCQlnb3RvIHJlc3RhcnQ7CiAJCX0KIAl9Ci0KLQkvKiBpZiB0aGUgVFRZX0xESVNDIGJpdCBpcyBzZXQsIHRoZW4gd2UgYXJlIHJhY2luZyBhZ2FpbnN0IGFub3RoZXIgbGRpc2MgY2hhbmdlICovCi0KKwkvKgorCSAqCUlmIHRoZSBUVFlfTERJU0MgYml0IGlzIHNldCwgdGhlbiB3ZSBhcmUgcmFjaW5nIGFnYWluc3QKKwkgKglhbm90aGVyIGxkaXNjIGNoYW5nZQorCSAqLwogCWlmICghdGVzdF9iaXQoVFRZX0xESVNDLCAmdHR5LT5mbGFncykpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKIAkJdHR5X2xkaXNjX3B1dChsZGlzYyk7CkBAIC0xMDcyLDcgKzEwNzUsNiBAQAogCS8qCiAJICogV2FpdCBmb3IgLT5oYW5ndXBfd29yayBhbmQgLT5idWYud29yayBoYW5kbGVycyB0byB0ZXJtaW5hdGUKIAkgKi8KLQkgCiAJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAkvKiBTaHV0ZG93biB0aGUgY3VycmVudCBkaXNjaXBsaW5lLiAqLwogCWlmICh0dHktPmxkaXNjLmNsb3NlKQpAQCAtMTEwNiwyMSArMTEwOCwyMSBAQAogCS8qIEF0IHRoaXMgcG9pbnQgd2UgaG9sZCBhIHJlZmVyZW5jZSB0byB0aGUgbmV3IGxkaXNjIGFuZCBhCiAJICAgYSByZWZlcmVuY2UgdG8gdGhlIG9sZCBsZGlzYy4gSWYgd2UgZW5kZWQgdXAgZmxpcHBpbmcgYmFjawogCSAgIHRvIHRoZSBleGlzdGluZyBsZGlzYyB3ZSBoYXZlIHR3byByZWZlcmVuY2VzIHRvIGl0ICovCi0JCisKIAlpZiAodHR5LT5sZGlzYy5udW0gIT0gb19sZGlzYy5udW0gJiYgdHR5LT5kcml2ZXItPnNldF9sZGlzYykKIAkJdHR5LT5kcml2ZXItPnNldF9sZGlzYyh0dHkpOwotCQkKKwogCXR0eV9sZGlzY19wdXQob19sZGlzYy5udW0pOwotCQorCiAJLyoKIAkgKglBbGxvdyBsZGlzYyByZWZlcmVuY2luZyB0byBvY2N1ciBhcyBzb29uIGFzIHRoZSBkcml2ZXIKIAkgKglsZGlzYyBjYWxsYmFjayBjb21wbGV0ZXMuCiAJICovCi0JIAorCiAJdHR5X2xkaXNjX2VuYWJsZSh0dHkpOwogCWlmIChvX3R0eSkKIAkJdHR5X2xkaXNjX2VuYWJsZShvX3R0eSk7Ci0JCisKIAkvKiBSZXN0YXJ0IGl0IGluIGNhc2Ugbm8gY2hhcmFjdGVycyBraWNrIGl0IG9mZi4gU2FmZSBpZgogCSAgIGFscmVhZHkgcnVubmluZyAqLwogCWlmICh3b3JrKQpAQCAtMTE2NCw3ICsxMTY2LDcgQEAKICAqCUxvY2tpbmc6IG5vbmUKICAqLwogCi1pbnQgdHR5X2NoZWNrX2NoYW5nZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSkKK2ludCB0dHlfY2hlY2tfY2hhbmdlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJaWYgKGN1cnJlbnQtPnNpZ25hbC0+dHR5ICE9IHR0eSkKIAkJcmV0dXJuIDA7CkBAIC0xMTg1LDMxICsxMTg3LDMxIEBACiAKIEVYUE9SVF9TWU1CT0wodHR5X2NoZWNrX2NoYW5nZSk7CiAKLXN0YXRpYyBzc2l6ZV90IGh1bmdfdXBfdHR5X3JlYWQoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwKK3N0YXRpYyBzc2l6ZV90IGh1bmdfdXBfdHR5X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCiAJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGh1bmdfdXBfdHR5X3dyaXRlKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsCitzdGF0aWMgc3NpemVfdCBodW5nX3VwX3R0eV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJcmV0dXJuIC1FSU87CiB9CiAKIC8qIE5vIGtlcm5lbCBsb2NrIGhlbGQgLSBub25lIG5lZWRlZCA7KSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBodW5nX3VwX3R0eV9wb2xsKHN0cnVjdCBmaWxlICogZmlscCwgcG9sbF90YWJsZSAqIHdhaXQpCitzdGF0aWMgdW5zaWduZWQgaW50IGh1bmdfdXBfdHR5X3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsIHBvbGxfdGFibGUgKndhaXQpCiB7CiAJcmV0dXJuIFBPTExJTiB8IFBPTExPVVQgfCBQT0xMRVJSIHwgUE9MTEhVUCB8IFBPTExSRE5PUk0gfCBQT0xMV1JOT1JNOwogfQogCi1zdGF0aWMgaW50IGh1bmdfdXBfdHR5X2lvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCitzdGF0aWMgaW50IGh1bmdfdXBfdHR5X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlyZXR1cm4gY21kID09IFRJT0NTUEdSUCA/IC1FTk9UVFkgOiAtRUlPOwogfQogCi1zdGF0aWMgbG9uZyBodW5nX3VwX3R0eV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKiBmaWxlLAorc3RhdGljIGxvbmcgaHVuZ191cF90dHlfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAogCQkJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJcmV0dXJuIGNtZCA9PSBUSU9DU1BHUlAgPyAtRU5PVFRZIDogLUVJTzsKQEAgLTEyNzQsMTUgKzEyNzYsMTUgQEAKICAqCWluZm9ybXMgdGhlIGxpbmUgZGlzY2lwbGluZSBpZiBwcmVzZW50IHRoYXQgdGhlIGRyaXZlciBpcyByZWFkeQogICoJdG8gcmVjZWl2ZSBtb3JlIG91dHB1dCBkYXRhLgogICovCi0gCisKIHZvaWQgdHR5X3dha2V1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCXN0cnVjdCB0dHlfbGRpc2MgKmxkOwotCQorCiAJaWYgKHRlc3RfYml0KFRUWV9ET19XUklURV9XQUtFVVAsICZ0dHktPmZsYWdzKSkgewogCQlsZCA9IHR0eV9sZGlzY19yZWYodHR5KTsKLQkJaWYobGQpIHsKLQkJCWlmKGxkLT53cml0ZV93YWtldXApCisJCWlmIChsZCkgeworCQkJaWYgKGxkLT53cml0ZV93YWtldXApCiAJCQkJbGQtPndyaXRlX3dha2V1cCh0dHkpOwogCQkJdHR5X2xkaXNjX2RlcmVmKGxkKTsKIAkJfQpAQCAtMTI5OSwxMiArMTMwMSwxMiBAQAogICoJRmx1c2ggdGhlIGxpbmUgZGlzY2lwbGluZSBxdWV1ZSAoaWYgYW55KSBmb3IgdGhpcyB0dHkuIElmIHRoZXJlCiAgKglpcyBubyBsaW5lIGRpc2NpcGxpbmUgYWN0aXZlIHRoaXMgaXMgYSBuby1vcC4KICAqLwotIAorCiB2b2lkIHR0eV9sZGlzY19mbHVzaChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCXN0cnVjdCB0dHlfbGRpc2MgKmxkID0gdHR5X2xkaXNjX3JlZih0dHkpOwotCWlmKGxkKSB7Ci0JCWlmKGxkLT5mbHVzaF9idWZmZXIpCisJaWYgKGxkKSB7CisJCWlmIChsZC0+Zmx1c2hfYnVmZmVyKQogCQkJbGQtPmZsdXNoX2J1ZmZlcih0dHkpOwogCQl0dHlfbGRpc2NfZGVyZWYobGQpOwogCX0KQEAgLTEzMjgsNyArMTMzMCw3IEBACiAJdHR5LT50ZXJtaW9zLT5jX29zcGVlZCA9IHR0eV90ZXJtaW9zX2JhdWRfcmF0ZSh0dHktPnRlcm1pb3MpOwogCW11dGV4X3VubG9jaygmdHR5LT50ZXJtaW9zX211dGV4KTsKIH0KLQkKKwogLyoqCiAgKglkb190dHlfaGFuZ3VwCQktCWFjdHVhbCBoYW5kbGVyIGZvciBoYW5ndXAgZXZlbnRzCiAgKglAd29yazogdHR5IGRldmljZQpAQCAtMTM1NSw3ICsxMzU3LDcgQEAKIHsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0dHlfc3RydWN0LCBoYW5ndXBfd29yayk7Ci0Jc3RydWN0IGZpbGUgKiBjb25zX2ZpbHAgPSBOVUxMOworCXN0cnVjdCBmaWxlICpjb25zX2ZpbHAgPSBOVUxMOwogCXN0cnVjdCBmaWxlICpmaWxwLCAqZiA9IE5VTEw7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwOwogCXN0cnVjdCB0dHlfbGRpc2MgKmxkOwpAQCAtMTM3Myw3ICsxMzc1LDcgQEAKIAkJcmVkaXJlY3QgPSBOVUxMOwogCX0KIAlzcGluX3VubG9jaygmcmVkaXJlY3RfbG9jayk7Ci0JCisKIAljaGVja190dHlfY291bnQodHR5LCAiZG9fdHR5X2hhbmd1cCIpOwogCWZpbGVfbGlzdF9sb2NrKCk7CiAJLyogVGhpcyBicmVha3MgZm9yIGZpbGUgaGFuZGxlcyBiZWluZyBzZW50IG92ZXIgQUZfVU5JWCBzb2NrZXRzID8gKi8KQEAgLTEzODcsMTMgKzEzODksMTQgQEAKIAkJZmlscC0+Zl9vcCA9ICZodW5nX3VwX3R0eV9mb3BzOwogCX0KIAlmaWxlX2xpc3RfdW5sb2NrKCk7Ci0JCi0JLyogRklYTUUhIFdoYXQgYXJlIHRoZSBsb2NraW5nIGlzc3VlcyBoZXJlPyBUaGlzIG1heSBtZSBvdmVyZG9pbmcgdGhpbmdzLi4KLQkgKiB0aGlzIHF1ZXN0aW9uIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IG5vdyB0aGF0IHdlJ3ZlIHJlbW92ZWQgdGhlIGlycWxvY2suICovCi0KKwkvKgorCSAqIEZJWE1FISBXaGF0IGFyZSB0aGUgbG9ja2luZyBpc3N1ZXMgaGVyZT8gVGhpcyBtYXkgbWUgb3ZlcmRvaW5nCisJICogdGhpbmdzLi4uIFRoaXMgcXVlc3Rpb24gaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgbm93IHRoYXQgd2UndmUKKwkgKiByZW1vdmVkIHRoZSBpcnFsb2NrLgorCSAqLwogCWxkID0gdHR5X2xkaXNjX3JlZih0dHkpOwotCWlmKGxkICE9IE5VTEwpCS8qIFdlIG1heSBoYXZlIG5vIGxpbmUgZGlzY2lwbGluZSBhdCB0aGlzIHBvaW50ICovCi0JeworCWlmIChsZCAhPSBOVUxMKSB7CisJCS8qIFdlIG1heSBoYXZlIG5vIGxpbmUgZGlzY2lwbGluZSBhdCB0aGlzIHBvaW50ICovCiAJCWlmIChsZC0+Zmx1c2hfYnVmZmVyKQogCQkJbGQtPmZsdXNoX2J1ZmZlcih0dHkpOwogCQlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikKQEAgLTE0MDQsMjYgKzE0MDcsMjQgQEAKIAkJaWYgKGxkLT5oYW5ndXApCiAJCQlsZC0+aGFuZ3VwKHR0eSk7CiAJfQotCi0JLyogRklYTUU6IE9uY2Ugd2UgdHJ1c3QgdGhlIExESVNDIGNvZGUgYmV0dGVyIHdlIGNhbiB3YWl0IGhlcmUgZm9yCi0JICAgbGRpc2MgY29tcGxldGlvbiBhbmQgZml4IHRoZSBkcml2ZXIgY2FsbCByYWNlICovCi0JICAgCisJLyoKKwkgKiBGSVhNRTogT25jZSB3ZSB0cnVzdCB0aGUgTERJU0MgY29kZSBiZXR0ZXIgd2UgY2FuIHdhaXQgaGVyZSBmb3IKKwkgKiBsZGlzYyBjb21wbGV0aW9uIGFuZCBmaXggdGhlIGRyaXZlciBjYWxsIHJhY2UKKwkgKi8KIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJnR0eS0+d3JpdGVfd2FpdCk7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPnJlYWRfd2FpdCk7Ci0KIAkvKgogCSAqIFNodXRkb3duIHRoZSBjdXJyZW50IGxpbmUgZGlzY2lwbGluZSwgYW5kIHJlc2V0IGl0IHRvCiAJICogTl9UVFkuCiAJICovCiAJaWYgKHR0eS0+ZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfUkVTRVRfVEVSTUlPUykKIAkJdHR5X3Jlc2V0X3Rlcm1pb3ModHR5KTsKLQkKIAkvKiBEZWZlciBsZGlzYyBzd2l0Y2ggKi8KIAkvKiB0dHlfZGVmZXJyZWRfbGRpc2Nfc3dpdGNoKE5fVFRZKTsKLQkKKwogCSAgVGhpcyBzaG91bGQgZ2V0IGRvbmUgYXV0b21hdGljYWxseSB3aGVuIHRoZSBwb3J0IGNsb3NlcyBhbmQKIAkgIHR0eV9yZWxlYXNlIGlzIGNhbGxlZCAqLwotCQorCiAJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAlpZiAodHR5LT5zZXNzaW9uKSB7CiAJCWRvX2VhY2hfcGlkX3Rhc2sodHR5LT5zZXNzaW9uLCBQSURUWVBFX1NJRCwgcCkgewpAQCAtMTQ1MSwxMCArMTQ1MiwxMCBAQAogCXR0eS0+cGdycCA9IE5VTEw7CiAJdHR5LT5jdHJsX3N0YXR1cyA9IDA7CiAJLyoKLQkgKglJZiBvbmUgb2YgdGhlIGRldmljZXMgbWF0Y2hlcyBhIGNvbnNvbGUgcG9pbnRlciwgd2UKLQkgKgljYW5ub3QganVzdCBjYWxsIGhhbmd1cCgpIGJlY2F1c2UgdGhhdCB3aWxsIGNhdXNlCi0JICoJdHR5LT5jb3VudCBhbmQgc3RhdGUtPmNvdW50IHRvIGdvIG91dCBvZiBzeW5jLgotCSAqCVNvIHdlIGp1c3QgY2FsbCBjbG9zZSgpIHRoZSByaWdodCBudW1iZXIgb2YgdGltZXMuCisJICogSWYgb25lIG9mIHRoZSBkZXZpY2VzIG1hdGNoZXMgYSBjb25zb2xlIHBvaW50ZXIsIHdlCisJICogY2Fubm90IGp1c3QgY2FsbCBoYW5ndXAoKSBiZWNhdXNlIHRoYXQgd2lsbCBjYXVzZQorCSAqIHR0eS0+Y291bnQgYW5kIHN0YXRlLT5jb3VudCB0byBnbyBvdXQgb2Ygc3luYy4KKwkgKiBTbyB3ZSBqdXN0IGNhbGwgY2xvc2UoKSB0aGUgcmlnaHQgbnVtYmVyIG9mIHRpbWVzLgogCSAqLwogCWlmIChjb25zX2ZpbHApIHsKIAkJaWYgKHR0eS0+ZHJpdmVyLT5jbG9zZSkKQEAgLTE0NjIsMTIgKzE0NjMsMTIgQEAKIAkJCQl0dHktPmRyaXZlci0+Y2xvc2UodHR5LCBjb25zX2ZpbHApOwogCX0gZWxzZSBpZiAodHR5LT5kcml2ZXItPmhhbmd1cCkKIAkJKHR0eS0+ZHJpdmVyLT5oYW5ndXApKHR0eSk7Ci0JCQotCS8qIFdlIGRvbid0IHdhbnQgdG8gaGF2ZSBkcml2ZXIvbGRpc2MgaW50ZXJhY3Rpb25zIGJleW9uZAotCSAgIHRoZSBvbmVzIHdlIGRpZCBoZXJlLiBUaGUgZHJpdmVyIGxheWVyIGV4cGVjdHMgbm8KLQkgICBjYWxscyBhZnRlciAtPmhhbmd1cCgpIGZyb20gdGhlIGxkaXNjIHNpZGUuIEhvd2V2ZXIgd2UKLQkgICBjYW4ndCB5ZXQgZ3VhcmFudGVlIGFsbCB0aGF0ICovCi0KKwkvKgorCSAqIFdlIGRvbid0IHdhbnQgdG8gaGF2ZSBkcml2ZXIvbGRpc2MgaW50ZXJhY3Rpb25zIGJleW9uZAorCSAqIHRoZSBvbmVzIHdlIGRpZCBoZXJlLiBUaGUgZHJpdmVyIGxheWVyIGV4cGVjdHMgbm8KKwkgKiBjYWxscyBhZnRlciAtPmhhbmd1cCgpIGZyb20gdGhlIGxkaXNjIHNpZGUuIEhvd2V2ZXIgd2UKKwkgKiBjYW4ndCB5ZXQgZ3VhcmFudGVlIGFsbCB0aGF0LgorCSAqLwogCXNldF9iaXQoVFRZX0hVUFBFRCwgJnR0eS0+ZmxhZ3MpOwogCWlmIChsZCkgewogCQl0dHlfbGRpc2NfZW5hYmxlKHR0eSk7CkBAIC0xNDg2LDExICsxNDg3LDEwIEBACiAgKglzY2hlZHVsZSBhIGhhbmd1cCBzZXF1ZW5jZSB0byBydW4gYWZ0ZXIgdGhpcyBldmVudC4KICAqLwogCi12b2lkIHR0eV9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit2b2lkIHR0eV9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKICNpZmRlZiBUVFlfREVCVUdfSEFOR1VQCiAJY2hhcglidWZbNjRdOwotCQogCXByaW50ayhLRVJOX0RFQlVHICIlcyBoYW5ndXAuLi5cbiIsIHR0eV9uYW1lKHR0eSwgYnVmKSk7CiAjZW5kaWYKIAlzY2hlZHVsZV93b3JrKCZ0dHktPmhhbmd1cF93b3JrKTsKQEAgLTE1MDcsNyArMTUwNyw3IEBACiAgKglpcyBjb21wbGV0ZS4gVGhhdCBndWFyYW50ZWUgaXMgbmVjZXNzYXJ5IGZvciBzZWN1cml0eSByZWFzb25zLgogICovCiAKLXZvaWQgdHR5X3ZoYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit2b2lkIHR0eV92aGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAjaWZkZWYgVFRZX0RFQlVHX0hBTkdVUAogCWNoYXIJYnVmWzY0XTsKQEAgLTE1MTYsNiArMTUxNiw3IEBACiAjZW5kaWYKIAlkb190dHlfaGFuZ3VwKCZ0dHktPmhhbmd1cF93b3JrKTsKIH0KKwogRVhQT1JUX1NZTUJPTCh0dHlfdmhhbmd1cCk7CiAKIC8qKgpAQCAtMTUyNiw3ICsxNTI3LDcgQEAKICAqCWxvc3MKICAqLwogCi1pbnQgdHR5X2h1bmdfdXBfcChzdHJ1Y3QgZmlsZSAqIGZpbHApCitpbnQgdHR5X2h1bmdfdXBfcChzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlyZXR1cm4gKGZpbHAtPmZfb3AgPT0gJmh1bmdfdXBfdHR5X2ZvcHMpOwogfQpAQCAtMTUzNCw4ICsxNTM1LDEyIEBACiBFWFBPUlRfU1lNQk9MKHR0eV9odW5nX3VwX3ApOwogCiAvKioKLSAqIGlzX3R0eQktCWNoZWNrZXIgd2hldGhlciBmaWxlIGlzIGEgVFRZCisgKglpc190dHkJLQljaGVja2VyIHdoZXRoZXIgZmlsZSBpcyBhIFRUWQorICoJQGZpbHA6CQlmaWxlIGhhbmRsZSB0aGF0IG1heSBiZSBhIHR0eQorICoKKyAqCUNoZWNrIGlmIHRoZSBmaWxlIGhhbmRsZSBpcyBhIHR0eSBoYW5kbGUuCiAgKi8KKwogaW50IGlzX3R0eShzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlyZXR1cm4gZmlscC0+Zl9vcC0+cmVhZCA9PSB0dHlfcmVhZApAQCAtMTYwMSw3ICsxNjA2LDcgQEAKIAkJCXB1dF9waWQob2xkX3BncnApOwogCQl9CiAJCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKLQkJdW5sb2NrX2tlcm5lbCgpOwkKKwkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm47CiAJfQogCWlmICh0dHlfcGdycCkgewpAQCAtMTcxMSw3ICsxNzE2LDYgQEAKIAl9CiAJaWYgKHR0eS0+ZHJpdmVyLT5zdGFydCkKIAkJKHR0eS0+ZHJpdmVyLT5zdGFydCkodHR5KTsKLQogCS8qIElmIHdlIGhhdmUgYSBydW5uaW5nIGxpbmUgZGlzY2lwbGluZSBpdCBtYXkgbmVlZCBraWNraW5nICovCiAJdHR5X3dha2V1cCh0dHkpOwogfQpAQCAtMTczNSwxMSArMTczOSwxMSBAQAogICoJaW4gbmV3IGNvZGUuIE11bHRpcGxlIHJlYWQgY2FsbHMgbWF5IGJlIG91dHN0YW5kaW5nIGluIHBhcmFsbGVsLgogICovCiAKLXN0YXRpYyBzc2l6ZV90IHR0eV9yZWFkKHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBjb3VudCwgCitzdGF0aWMgc3NpemVfdCB0dHlfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAogCQkJbG9mZl90ICpwcG9zKQogewogCWludCBpOwotCXN0cnVjdCB0dHlfc3RydWN0ICogdHR5OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKIApAQCAtMTc1NSw3ICsxNzU5LDcgQEAKIAlsZCA9IHR0eV9sZGlzY19yZWZfd2FpdCh0dHkpOwogCWxvY2tfa2VybmVsKCk7CiAJaWYgKGxkLT5yZWFkKQotCQlpID0gKGxkLT5yZWFkKSh0dHksZmlsZSxidWYsY291bnQpOworCQlpID0gKGxkLT5yZWFkKSh0dHksIGZpbGUsIGJ1ZiwgY291bnQpOwogCWVsc2UKIAkJaSA9IC1FSU87CiAJdHR5X2xkaXNjX2RlcmVmKGxkKTsKQEAgLTE3OTUsNyArMTc5OSw3IEBACiB7CiAJc3NpemVfdCByZXQsIHdyaXR0ZW4gPSAwOwogCXVuc2lnbmVkIGludCBjaHVuazsKLQkKKwogCXJldCA9IHR0eV93cml0ZV9sb2NrKHR0eSwgZmlsZS0+Zl9mbGFncyAmIE9fTkRFTEFZKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKQEAgLTE4OTEsMjEgKzE4OTUsMjIgQEAKICAqCWtlcm5lbCBsb2NrIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuIE5ldyBjb2RlIHNob3VsZCBub3QgcmVseSBvbiB0aGlzLgogICovCiAKLXN0YXRpYyBzc2l6ZV90IHR0eV93cml0ZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQsCi0JCQkgbG9mZl90ICpwcG9zKQorc3RhdGljIHNzaXplX3QgdHR5X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHk7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzc2l6ZV90IHJldDsKIAlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKLQkKKwogCXR0eSA9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKIAlpZiAodHR5X3BhcmFub2lhX2NoZWNrKHR0eSwgaW5vZGUsICJ0dHlfd3JpdGUiKSkKIAkJcmV0dXJuIC1FSU87Ci0JaWYgKCF0dHkgfHwgIXR0eS0+ZHJpdmVyLT53cml0ZSB8fCAodGVzdF9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncykpKQotCQlyZXR1cm4gLUVJTzsKKwlpZiAoIXR0eSB8fCAhdHR5LT5kcml2ZXItPndyaXRlIHx8CisJCSh0ZXN0X2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKSkpCisJCQlyZXR1cm4gLUVJTzsKIAotCWxkID0gdHR5X2xkaXNjX3JlZl93YWl0KHR0eSk7CQkKKwlsZCA9IHR0eV9sZGlzY19yZWZfd2FpdCh0dHkpOwogCWlmICghbGQtPndyaXRlKQogCQlyZXQgPSAtRUlPOwogCWVsc2UKQEAgLTE5MTQsOCArMTkxOSw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3NpemVfdCByZWRpcmVjdGVkX3R0eV93cml0ZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQsCi0JCQkgbG9mZl90ICpwcG9zKQorc3NpemVfdCByZWRpcmVjdGVkX3R0eV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBmaWxlICpwID0gTlVMTDsKIApAQCAtMTkzMiw3ICsxOTM3LDYgQEAKIAkJZnB1dChwKTsKIAkJcmV0dXJuIHJlczsKIAl9Ci0KIAlyZXR1cm4gdHR5X3dyaXRlKGZpbGUsIGJ1ZiwgY291bnQsIHBwb3MpOwogfQogCkBAIC0xOTU0LDggKzE5NTgsOCBAQAogCWludCBpID0gaW5kZXggKyBkcml2ZXItPm5hbWVfYmFzZTsKIAkvKiAtPm5hbWUgaXMgaW5pdGlhbGl6ZWQgdG8gInR0eXAiLCBidXQgInR0eSIgaXMgZXhwZWN0ZWQgKi8KIAlzcHJpbnRmKHAsICIlcyVjJXgiLAotCQkJZHJpdmVyLT5zdWJ0eXBlID09IFBUWV9UWVBFX1NMQVZFID8gInR0eSIgOiBkcml2ZXItPm5hbWUsCi0JCQlwdHljaGFyW2kgPj4gNCAmIDB4Zl0sIGkgJiAweGYpOworCQlkcml2ZXItPnN1YnR5cGUgPT0gUFRZX1RZUEVfU0xBVkUgPyAidHR5IiA6IGRyaXZlci0+bmFtZSwKKwkJcHR5Y2hhcltpID4+IDQgJiAweGZdLCBpICYgMHhmKTsKIH0KIAogLyoqCkBAIC0yMDM0LDcgKzIwMzgsNyBAQAogCSAqIEZpcnN0IHRpbWUgb3BlbiBpcyBjb21wbGV4LCBlc3BlY2lhbGx5IGZvciBQVFkgZGV2aWNlcy4KIAkgKiBUaGlzIGNvZGUgZ3VhcmFudGVlcyB0aGF0IGVpdGhlciBldmVyeXRoaW5nIHN1Y2NlZWRzIGFuZCB0aGUKIAkgKiBUVFkgaXMgcmVhZHkgZm9yIG9wZXJhdGlvbiwgb3IgZWxzZSB0aGUgdGFibGUgc2xvdHMgYXJlIHZhY2F0ZWQKLQkgKiBhbmQgdGhlIGFsbG9jYXRlZCBtZW1vcnkgcmVsZWFzZWQuICAoRXhjZXB0IHRoYXQgdGhlIHRlcm1pb3MgCisJICogYW5kIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IHJlbGVhc2VkLiAgKEV4Y2VwdCB0aGF0IHRoZSB0ZXJtaW9zCiAJICogYW5kIGxvY2tlZCB0ZXJtaW9zIG1heSBiZSByZXRhaW5lZC4pCiAJICovCiAKQEAgLTIwNDgsNyArMjA1Miw3IEBACiAJbHRwID0gb19sdHAgPSBOVUxMOwogCiAJdHR5ID0gYWxsb2NfdHR5X3N0cnVjdCgpOwotCWlmKCF0dHkpCisJaWYgKCF0dHkpCiAJCWdvdG8gZmFpbF9ub19tZW07CiAJaW5pdGlhbGl6ZV90dHlfc3RydWN0KHR0eSk7CiAJdHR5LT5kcml2ZXIgPSBkcml2ZXI7CkBAIC0yMTA5LDkgKzIxMTMsOCBAQAogCQkvKgogCQkgKiBFdmVyeXRoaW5nIGFsbG9jYXRlZCAuLi4gc2V0IHVwIHRoZSBvX3R0eSBzdHJ1Y3R1cmUuCiAJCSAqLwotCQlpZiAoIShkcml2ZXItPm90aGVyLT5mbGFncyAmIFRUWV9EUklWRVJfREVWUFRTX01FTSkpIHsKKwkJaWYgKCEoZHJpdmVyLT5vdGhlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX0RFVlBUU19NRU0pKQogCQkJZHJpdmVyLT5vdGhlci0+dHR5c1tpZHhdID0gb190dHk7Ci0JCX0KIAkJaWYgKCEqb190cF9sb2MpCiAJCQkqb190cF9sb2MgPSBvX3RwOwogCQlpZiAoISpvX2x0cF9sb2MpCkBAIC0yMTI3LDE1ICsyMTMwLDE0IEBACiAJCW9fdHR5LT5saW5rID0gdHR5OwogCX0KIAotCS8qIAorCS8qCiAJICogQWxsIHN0cnVjdHVyZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCwgc28gbm93IHdlIGluc3RhbGwgdGhlbS4KIAkgKiBGYWlsdXJlcyBhZnRlciB0aGlzIHBvaW50IHVzZSByZWxlYXNlX3R0eSB0byBjbGVhbiB1cCwgc28KIAkgKiB0aGVyZSdzIG5vIG5lZWQgdG8gbnVsbCBvdXQgdGhlIGxvY2FsIHBvaW50ZXJzLgogCSAqLwotCWlmICghKGRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX0RFVlBUU19NRU0pKSB7CisJaWYgKCEoZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfREVWUFRTX01FTSkpCiAJCWRyaXZlci0+dHR5c1tpZHhdID0gdHR5OwotCX0KLQkKKwogCWlmICghKnRwX2xvYykKIAkJKnRwX2xvYyA9IHRwOwogCWlmICghKmx0cF9sb2MpCkBAIC0yMTQ4LDcgKzIxNTAsNyBAQAogCWRyaXZlci0+cmVmY291bnQrKzsKIAl0dHktPmNvdW50Kys7CiAKLQkvKiAKKwkvKgogCSAqIFN0cnVjdHVyZXMgYWxsIGluc3RhbGxlZCAuLi4gY2FsbCB0aGUgbGRpc2Mgb3BlbiByb3V0aW5lcy4KIAkgKiBJZiB3ZSBmYWlsIGhlcmUganVzdCBjYWxsIHJlbGVhc2VfdHR5IHRvIGNsZWFuIHVwLiAgTm8gbmVlZAogCSAqIHRvIGRlY3JlbWVudCB0aGUgdXNlIGNvdW50cywgYXMgcmVsZWFzZV90dHkgZG9lc24ndCBjYXJlLgpAQCAtMjE4NSw3ICsyMTg3LDcgQEAKIAlpZiAoZHJpdmVyLT50eXBlID09IFRUWV9EUklWRVJfVFlQRV9QVFkgJiYKIAkgICAgZHJpdmVyLT5zdWJ0eXBlID09IFBUWV9UWVBFX01BU1RFUikgewogCQkvKgotCQkgKiBzcGVjaWFsIGNhc2UgZm9yIFBUWSBtYXN0ZXJzOiBvbmx5IG9uZSBvcGVuIHBlcm1pdHRlZCwgCisJCSAqIHNwZWNpYWwgY2FzZSBmb3IgUFRZIG1hc3RlcnM6IG9ubHkgb25lIG9wZW4gcGVybWl0dGVkLAogCQkgKiBhbmQgdGhlIHNsYXZlIHNpZGUgb3BlbiBjb3VudCBpcyBpbmNyZW1lbnRlZCBhcyB3ZWxsLgogCQkgKi8KIAkJaWYgKHR0eS0+Y291bnQpIHsKQEAgLTIxOTgsMTEgKzIyMDAsMTEgQEAKIAl0dHktPmRyaXZlciA9IGRyaXZlcjsgLyogTi5CLiB3aHkgZG8gdGhpcyBldmVyeSB0aW1lPz8gKi8KIAogCS8qIEZJWE1FICovCi0JaWYoIXRlc3RfYml0KFRUWV9MRElTQywgJnR0eS0+ZmxhZ3MpKQorCWlmICghdGVzdF9iaXQoVFRZX0xESVNDLCAmdHR5LT5mbGFncykpCiAJCXByaW50ayhLRVJOX0VSUiAiaW5pdF9kZXYgYnV0IG5vIGxkaXNjXG4iKTsKIHN1Y2Nlc3M6CiAJKnJldF90dHkgPSB0dHk7Ci0JCisKIAkvKiBBbGwgcGF0aHMgY29tZSB0aHJvdWdoIGhlcmUgdG8gcmVsZWFzZSB0aGUgbXV0ZXggKi8KIGVuZF9pbml0OgogCXJldHVybiByZXR2YWw7CkBAIC0yMzA0LDcgKzIzMDYsNyBAQAogICogV1NIIDA5LzA5Lzk3OiByZXdyaXR0ZW4gdG8gYXZvaWQgc29tZSBuYXN0eSByYWNlIGNvbmRpdGlvbnMgdGhhdCBjb3VsZAogICogbGVhZCB0byBkb3VibGUgZnJlZXMgb3IgcmVsZWFzaW5nIG1lbW9yeSBzdGlsbCBpbiB1c2UuCiAgKi8KLXN0YXRpYyB2b2lkIHJlbGVhc2VfZGV2KHN0cnVjdCBmaWxlICogZmlscCkKK3N0YXRpYyB2b2lkIHJlbGVhc2VfZGV2KHN0cnVjdCBmaWxlICpmaWxwKQogewogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHksICpvX3R0eTsKIAlpbnQJcHR5X21hc3RlciwgdHR5X2Nsb3NpbmcsIG9fdHR5X2Nsb3NpbmcsIGRvX3NsZWVwOwpAQCAtMjMxMiw5ICsyMzE0LDEwIEBACiAJaW50CWlkeDsKIAljaGFyCWJ1Zls2NF07CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkKKwogCXR0eSA9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKWZpbHAtPnByaXZhdGVfZGF0YTsKLQlpZiAodHR5X3BhcmFub2lhX2NoZWNrKHR0eSwgZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSwgInJlbGVhc2VfZGV2IikpCisJaWYgKHR0eV9wYXJhbm9pYV9jaGVjayh0dHksIGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsCisJCQkJCQkJInJlbGVhc2VfZGV2IikpCiAJCXJldHVybjsKIAogCWNoZWNrX3R0eV9jb3VudCh0dHksICJyZWxlYXNlX2RldiIpOwpAQCAtMjM3NCw3ICsyMzc3LDcgQEAKIAkJCSAgICAgICBpZHgsIHR0eS0+bmFtZSk7CiAJCQlyZXR1cm47CiAJCX0KLQkJaWYgKG9fdHR5LT50ZXJtaW9zX2xvY2tlZCAhPSAKKwkJaWYgKG9fdHR5LT50ZXJtaW9zX2xvY2tlZCAhPQogCQkgICAgICB0dHktPmRyaXZlci0+b3RoZXItPnRlcm1pb3NfbG9ja2VkW2lkeF0pIHsKIAkJCXByaW50ayhLRVJOX0RFQlVHICJyZWxlYXNlX2Rldjogb3RoZXItPnRlcm1pb3NfbG9ja2VkWyIKIAkJCQkJICAiJWRdIG5vdCBvX3Rlcm1pb3NfbG9ja2VkIGZvciAoJXMpXG4iLApAQCAtMjQxMCw3ICsyNDEzLDcgQEAKIAl3aGlsZSAoMSkgewogCQkvKiBHdWFyZCBhZ2FpbnN0IHJhY2VzIHdpdGggdHR5LT5jb3VudCBjaGFuZ2VzIGVsc2V3aGVyZSBhbmQKIAkJICAgb3BlbnMgb24gL2Rldi90dHkgKi8KLQkJICAgCisKIAkJbXV0ZXhfbG9jaygmdHR5X211dGV4KTsKIAkJdHR5X2Nsb3NpbmcgPSB0dHktPmNvdW50IDw9IDE7CiAJCW9fdHR5X2Nsb3NpbmcgPSBvX3R0eSAmJgpAQCAtMjQ0NCwxMSArMjQ0NywxMSBAQAogCQkJCSAgICAiYWN0aXZlIVxuIiwgdHR5X25hbWUodHR5LCBidWYpKTsKIAkJbXV0ZXhfdW5sb2NrKCZ0dHlfbXV0ZXgpOwogCQlzY2hlZHVsZSgpOwotCX0JCisJfQogCiAJLyoKLQkgKiBUaGUgY2xvc2luZyBmbGFncyBhcmUgbm93IGNvbnNpc3RlbnQgd2l0aCB0aGUgb3BlbiBjb3VudHMgb24gCi0JICogYm90aCBzaWRlcywgYW5kIHdlJ3ZlIGNvbXBsZXRlZCB0aGUgbGFzdCBvcGVyYXRpb24gdGhhdCBjb3VsZCAKKwkgKiBUaGUgY2xvc2luZyBmbGFncyBhcmUgbm93IGNvbnNpc3RlbnQgd2l0aCB0aGUgb3BlbiBjb3VudHMgb24KKwkgKiBib3RoIHNpZGVzLCBhbmQgd2UndmUgY29tcGxldGVkIHRoZSBsYXN0IG9wZXJhdGlvbiB0aGF0IGNvdWxkCiAJICogYmxvY2ssIHNvIGl0J3Mgc2FmZSB0byBwcm9jZWVkIHdpdGggY2xvc2luZy4KIAkgKi8KIAlpZiAocHR5X21hc3RlcikgewpAQCAtMjQ2NCw3ICsyNDY3LDcgQEAKIAkJICAgICAgIHR0eS0+Y291bnQsIHR0eV9uYW1lKHR0eSwgYnVmKSk7CiAJCXR0eS0+Y291bnQgPSAwOwogCX0KLQkKKwogCS8qCiAJICogV2UndmUgZGVjcmVtZW50ZWQgdHR5LT5jb3VudCwgc28gd2UgbmVlZCB0byByZW1vdmUgdGhpcyBmaWxlCiAJICogZGVzY3JpcHRvciBvZmYgdGhlIHR0eS0+dHR5X2ZpbGVzIGxpc3Q7IHRoaXMgc2VydmVzIHR3bwpAQCAtMjQ4NCw5ICsyNDg3LDkgQEAKIAkgKiBjYXNlIG9mIGEgcHR5IHdlIG1heSBoYXZlIHRvIHdhaXQgYXJvdW5kIGZvciB0aGUgb3RoZXIgc2lkZQogCSAqIHRvIGNsb3NlLCBhbmQgVFRZX0NMT1NJTkcgbWFrZXMgc3VyZSB3ZSBjYW4ndCBiZSByZW9wZW5lZC4KIAkgKi8KLQlpZih0dHlfY2xvc2luZykKKwlpZiAodHR5X2Nsb3NpbmcpCiAJCXNldF9iaXQoVFRZX0NMT1NJTkcsICZ0dHktPmZsYWdzKTsKLQlpZihvX3R0eV9jbG9zaW5nKQorCWlmIChvX3R0eV9jbG9zaW5nKQogCQlzZXRfYml0KFRUWV9DTE9TSU5HLCAmb190dHktPmZsYWdzKTsKIAogCS8qCkBAIC0yNTA3LDcgKzI1MTAsNyBAQAogCS8qIGNoZWNrIHdoZXRoZXIgYm90aCBzaWRlcyBhcmUgY2xvc2luZyAuLi4gKi8KIAlpZiAoIXR0eV9jbG9zaW5nIHx8IChvX3R0eSAmJiAhb190dHlfY2xvc2luZykpCiAJCXJldHVybjsKLQkKKwogI2lmZGVmIFRUWV9ERUJVR19IQU5HVVAKIAlwcmludGsoS0VSTl9ERUJVRyAiZnJlZWluZyB0dHkgc3RydWN0dXJlLi4uIik7CiAjZW5kaWYKQEAgLTI1MjIsMTcgKzI1MjUsMTYgQEAKIAkvKgogCSAqIFdhaXQgZm9yIC0+aGFuZ3VwX3dvcmsgYW5kIC0+YnVmLndvcmsgaGFuZGxlcnMgdG8gdGVybWluYXRlCiAJICovCi0JIAorCiAJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKLQkKKwogCS8qCiAJICogV2FpdCBmb3IgYW55IHNob3J0IHRlcm0gdXNlcnMgKHdlIGtub3cgdGhleSBhcmUganVzdCBkcml2ZXIKIAkgKiBzaWRlIHdhaXRlcnMgYXMgdGhlIGZpbGUgaXMgY2xvc2luZyBzbyB1c2VyIGNvdW50IG9uIHRoZSBmaWxlCiAJICogc2lkZSBpcyB6ZXJvLgogCSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHlfbGRpc2NfbG9jaywgZmxhZ3MpOwotCXdoaWxlKHR0eS0+bGRpc2MucmVmY291bnQpCi0JeworCXdoaWxlICh0dHktPmxkaXNjLnJlZmNvdW50KSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7CiAJCXdhaXRfZXZlbnQodHR5X2xkaXNjX3dhaXQsIHR0eS0+bGRpc2MucmVmY291bnQgPT0gMCk7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHlfbGRpc2NfbG9jaywgZmxhZ3MpOwpAQCAtMjU0NywxMiArMjU0OSwxMiBAQAogCWlmICh0dHktPmxkaXNjLmNsb3NlKQogCQkodHR5LT5sZGlzYy5jbG9zZSkodHR5KTsKIAl0dHlfbGRpc2NfcHV0KHR0eS0+bGRpc2MubnVtKTsKLQkKKwogCS8qCiAJICoJU3dpdGNoIHRoZSBsaW5lIGRpc2NpcGxpbmUgYmFjawogCSAqLwogCXR0eV9sZGlzY19hc3NpZ24odHR5LCB0dHlfbGRpc2NfZ2V0KE5fVFRZKSk7Ci0JdHR5X3NldF90ZXJtaW9zX2xkaXNjKHR0eSxOX1RUWSk7IAorCXR0eV9zZXRfdGVybWlvc19sZGlzYyh0dHksIE5fVFRZKTsKIAlpZiAob190dHkpIHsKIAkJLyogRklYTUU6IGNvdWxkIG9fdHR5IGJlIGluIHNldGxkaXNjIGhlcmUgPyAqLwogCQljbGVhcl9iaXQoVFRZX0xESVNDLCAmb190dHktPmZsYWdzKTsKQEAgLTI1NjAsNyArMjU2Miw3IEBACiAJCQkob190dHktPmxkaXNjLmNsb3NlKShvX3R0eSk7CiAJCXR0eV9sZGlzY19wdXQob190dHktPmxkaXNjLm51bSk7CiAJCXR0eV9sZGlzY19hc3NpZ24ob190dHksIHR0eV9sZGlzY19nZXQoTl9UVFkpKTsKLQkJdHR5X3NldF90ZXJtaW9zX2xkaXNjKG9fdHR5LE5fVFRZKTsgCisJCXR0eV9zZXRfdGVybWlvc19sZGlzYyhvX3R0eSwgTl9UVFkpOwogCX0KIAkvKgogCSAqIFRoZSByZWxlYXNlX3R0eSBmdW5jdGlvbiB0YWtlcyBjYXJlIG9mIHRoZSBkZXRhaWxzIG9mIGNsZWFyaW5nCkBAIC0yNjAwLDcgKzI2MDIsNyBAQAogICoJCSAtPnNpZ2xvY2sgcHJvdGVjdHMgLT5zaWduYWwvLT5zaWdoYW5kCiAgKi8KIAotc3RhdGljIGludCB0dHlfb3BlbihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQorc3RhdGljIGludCB0dHlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCWludCBub2N0dHksIHJldHZhbDsKQEAgLTI2MTAsMTUgKzI2MTIsMTUgQEAKIAl1bnNpZ25lZCBzaG9ydCBzYXZlZF9mbGFncyA9IGZpbHAtPmZfZmxhZ3M7CiAKIAlub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxwKTsKLQkKKwogcmV0cnlfb3BlbjoKIAlub2N0dHkgPSBmaWxwLT5mX2ZsYWdzICYgT19OT0NUVFk7CiAJaW5kZXggID0gLTE7CiAJcmV0dmFsID0gMDsKLQkKKwogCW11dGV4X2xvY2soJnR0eV9tdXRleCk7CiAKLQlpZiAoZGV2aWNlID09IE1LREVWKFRUWUFVWF9NQUpPUiwwKSkgeworCWlmIChkZXZpY2UgPT0gTUtERVYoVFRZQVVYX01BSk9SLCAwKSkgewogCQl0dHkgPSBnZXRfY3VycmVudF90dHkoKTsKIAkJaWYgKCF0dHkpIHsKIAkJCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKQEAgLTI2MzEsNyArMjYzMyw3IEBACiAJCWdvdG8gZ290X2RyaXZlcjsKIAl9CiAjaWZkZWYgQ09ORklHX1ZUCi0JaWYgKGRldmljZSA9PSBNS0RFVihUVFlfTUFKT1IsMCkpIHsKKwlpZiAoZGV2aWNlID09IE1LREVWKFRUWV9NQUpPUiwgMCkpIHsKIAkJZXh0ZXJuIHN0cnVjdCB0dHlfZHJpdmVyICpjb25zb2xlX2RyaXZlcjsKIAkJZHJpdmVyID0gY29uc29sZV9kcml2ZXI7CiAJCWluZGV4ID0gZmdfY29uc29sZTsKQEAgLTI2MzksNyArMjY0MSw3IEBACiAJCWdvdG8gZ290X2RyaXZlcjsKIAl9CiAjZW5kaWYKLQlpZiAoZGV2aWNlID09IE1LREVWKFRUWUFVWF9NQUpPUiwxKSkgeworCWlmIChkZXZpY2UgPT0gTUtERVYoVFRZQVVYX01BSk9SLCAxKSkgewogCQlkcml2ZXIgPSBjb25zb2xlX2RldmljZSgmaW5kZXgpOwogCQlpZiAoZHJpdmVyKSB7CiAJCQkvKiBEb24ndCBsZXQgL2Rldi9jb25zb2xlIGJsb2NrICovCkBAIC0yNjc5LDcgKzI2ODEsOCBAQAogCX0KIAlmaWxwLT5mX2ZsYWdzID0gc2F2ZWRfZmxhZ3M7CiAKLQlpZiAoIXJldHZhbCAmJiB0ZXN0X2JpdChUVFlfRVhDTFVTSVZFLCAmdHR5LT5mbGFncykgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJaWYgKCFyZXR2YWwgJiYgdGVzdF9iaXQoVFRZX0VYQ0xVU0lWRSwgJnR0eS0+ZmxhZ3MpICYmCisJCQkJCQkhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJcmV0dmFsID0gLUVCVVNZOwogCiAJaWYgKHJldHZhbCkgewpAQCAtMjcyMywxMSArMjcyNiwxMSBAQAogICoJQWxsb2NhdGUgYSB1bml4OTggcHR5IG1hc3RlciBkZXZpY2UgZnJvbSB0aGUgcHRteCBkcml2ZXIuCiAgKgogICoJTG9ja2luZzogdHR5X211dGV4IHByb3RlY3RzIHRoZWluaXRfZGV2IHdvcmsuIHR0eS0+Y291bnQgc2hvdWxkCi0gCQlwcm90ZWN0IHRoZSByZXN0LgorICogCQlwcm90ZWN0IHRoZSByZXN0LgogICoJCWFsbG9jYXRlZF9wdHlzX2xvY2sgaGFuZGxlcyB0aGUgbGlzdCBvZiBmcmVlIHB0eSBudW1iZXJzCiAgKi8KIAotc3RhdGljIGludCBwdG14X29wZW4oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCkKK3N0YXRpYyBpbnQgcHRteF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJaW50IHJldHZhbDsKQEAgLTI3NTksNyArMjc2Miw3IEBACiAJbXV0ZXhfbG9jaygmdHR5X211dGV4KTsKIAlyZXR2YWwgPSBpbml0X2RldihwdG1fZHJpdmVyLCBpbmRleCwgJnR0eSk7CiAJbXV0ZXhfdW5sb2NrKCZ0dHlfbXV0ZXgpOwotCQorCiAJaWYgKHJldHZhbCkKIAkJZ290byBvdXQ7CiAKQEAgLTI4MDAsNyArMjgwMyw3IEBACiAgKgkJVGFrZXMgYmtsLiBTZWUgcmVsZWFzZV9kZXYKICAqLwogCi1zdGF0aWMgaW50IHR0eV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCitzdGF0aWMgaW50IHR0eV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCWxvY2tfa2VybmVsKCk7CiAJcmVsZWFzZV9kZXYoZmlscCk7CkBAIC0yODIwLDE2ICsyODIzLDE2IEBACiAgKgltYXkgYmUgcmUtZW50ZXJlZCBmcmVlbHkgYnkgb3RoZXIgY2FsbGVycy4KICAqLwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHR0eV9wb2xsKHN0cnVjdCBmaWxlICogZmlscCwgcG9sbF90YWJsZSAqIHdhaXQpCitzdGF0aWMgdW5zaWduZWQgaW50IHR0eV9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBwb2xsX3RhYmxlICp3YWl0KQogewotCXN0cnVjdCB0dHlfc3RydWN0ICogdHR5OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CiAJaW50IHJldCA9IDA7CiAKIAl0dHkgPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKilmaWxwLT5wcml2YXRlX2RhdGE7CiAJaWYgKHR0eV9wYXJhbm9pYV9jaGVjayh0dHksIGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsICJ0dHlfcG9sbCIpKQogCQlyZXR1cm4gMDsKLQkJCisKIAlsZCA9IHR0eV9sZGlzY19yZWZfd2FpdCh0dHkpOwogCWlmIChsZC0+cG9sbCkKIAkJcmV0ID0gKGxkLT5wb2xsKSh0dHksIGZpbHAsIHdhaXQpOwpAQCAtMjgzNywxNSArMjg0MCwxNSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgdHR5X2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICogZmlscCwgaW50IG9uKQorc3RhdGljIGludCB0dHlfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIGludCBvbikKIHsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCWludCByZXR2YWw7CiAKIAl0dHkgPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKilmaWxwLT5wcml2YXRlX2RhdGE7CiAJaWYgKHR0eV9wYXJhbm9pYV9jaGVjayh0dHksIGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUsICJ0dHlfZmFzeW5jIikpCiAJCXJldHVybiAwOwotCQorCiAJcmV0dmFsID0gZmFzeW5jX2hlbHBlcihmZCwgZmlscCwgb24sICZ0dHktPmZhc3luYyk7CiAJaWYgKHJldHZhbCA8PSAwKQogCQlyZXR1cm4gcmV0dmFsOwpAQCAtMjg5Myw3ICsyODk2LDcgQEAKIHsKIAljaGFyIGNoLCBtYnogPSAwOwogCXN0cnVjdCB0dHlfbGRpc2MgKmxkOwotCQorCiAJaWYgKChjdXJyZW50LT5zaWduYWwtPnR0eSAhPSB0dHkpICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwogCWlmIChnZXRfdXNlcihjaCwgcCkpCkBAIC0yOTE1LDcgKzI5MTgsNyBAQAogICoJCWlzIGNvbnNpc3RlbnQuCiAgKi8KIAotc3RhdGljIGludCB0aW9jZ3dpbnN6KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB3aW5zaXplIF9fdXNlciAqIGFyZykKK3N0YXRpYyBpbnQgdGlvY2d3aW5zeihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qgd2luc2l6ZSBfX3VzZXIgKmFyZykKIHsKIAlpbnQgZXJyOwogCkBAIC0yOTQ0LDcgKzI5NDcsNyBAQAogICovCiAKIHN0YXRpYyBpbnQgdGlvY3N3aW5zeihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqcmVhbF90dHksCi0Jc3RydWN0IHdpbnNpemUgX191c2VyICogYXJnKQorCXN0cnVjdCB3aW5zaXplIF9fdXNlciAqYXJnKQogewogCXN0cnVjdCB3aW5zaXplIHRtcF93czsKIApAQCAtMjk2MCw3ICsyOTYzLDcgQEAKIAkJaWYgKHZjX2xvY2tfcmVzaXplKHR0eS0+ZHJpdmVyX2RhdGEsIHRtcF93cy53c19jb2wsCiAJCQkJCXRtcF93cy53c19yb3cpKSB7CiAJCQltdXRleF91bmxvY2soJnR0eS0+dGVybWlvc19tdXRleCk7Ci0gCQkJcmV0dXJuIC1FTlhJTzsKKwkJCXJldHVybiAtRU5YSU87CiAJCX0KIAl9CiAjZW5kaWYKQEAgLTMwNzAsNyArMzA3Myw3IEBACiAJCSAqIFRoaXMgdHR5IGlzIGFscmVhZHkgdGhlIGNvbnRyb2xsaW5nCiAJCSAqIHR0eSBmb3IgYW5vdGhlciBzZXNzaW9uIGdyb3VwIQogCQkgKi8KLQkJaWYgKChhcmcgPT0gMSkgJiYgY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQlpZiAoYXJnID09IDEgJiYgY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewogCQkJLyoKIAkJCSAqIFN0ZWFsIGl0IGF3YXkKIAkJCSAqLwpAQCAtMzMwMywxNCArMzMwNiwxNCBAQAogLyoKICAqIFNwbGl0IHRoaXMgdXAsIGFzIGdjYyBjYW4gY2hva2Ugb24gaXQgb3RoZXJ3aXNlLi4KICAqLwotaW50IHR0eV9pb2N0bChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlLAoraW50IHR0eV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCAqcmVhbF90dHk7CiAJdm9pZCBfX3VzZXIgKnAgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJaW50IHJldHZhbDsKIAlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKLQkKKwogCXR0eSA9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKIAlpZiAodHR5X3BhcmFub2lhX2NoZWNrKHR0eSwgaW5vZGUsICJ0dHlfaW9jdGwiKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zMzI2LDEzICszMzI5LDEzIEBACiAJICogQnJlYWsgaGFuZGxpbmcgYnkgZHJpdmVyCiAJICovCiAJaWYgKCF0dHktPmRyaXZlci0+YnJlYWtfY3RsKSB7Ci0JCXN3aXRjaChjbWQpIHsKKwkJc3dpdGNoIChjbWQpIHsKIAkJY2FzZSBUSU9DU0JSSzoKIAkJY2FzZSBUSU9DQ0JSSzoKIAkJCWlmICh0dHktPmRyaXZlci0+aW9jdGwpCiAJCQkJcmV0dXJuIHR0eS0+ZHJpdmVyLT5pb2N0bCh0dHksIGZpbGUsIGNtZCwgYXJnKTsKIAkJCXJldHVybiAtRUlOVkFMOwotCQkJCisKIAkJLyogVGhlc2UgdHdvIGlvY3RsJ3MgYWx3YXlzIHJldHVybiBzdWNjZXNzOyBldmVuIGlmICovCiAJCS8qIHRoZSBkcml2ZXIgZG9lc24ndCBzdXBwb3J0IHRoZW0uICovCiAJCWNhc2UgVENTQlJLOgpAQCAtMzM1NCw3ICszMzU3LDcgQEAKIAljYXNlIFRJT0NTQlJLOgogCWNhc2UgVElPQ0NCUks6CiAJY2FzZSBUQ1NCUks6Ci0JY2FzZSBUQ1NCUktQOgkJCQorCWNhc2UgVENTQlJLUDoKIAkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOwogCQlpZiAocmV0dmFsKQogCQkJcmV0dXJuIHJldHZhbDsKQEAgLTMzNjcsODEgKzMzNzAsODAgQEAKIAl9CiAKIAlzd2l0Y2ggKGNtZCkgewotCQljYXNlIFRJT0NTVEk6Ci0JCQlyZXR1cm4gdGlvY3N0aSh0dHksIHApOwotCQljYXNlIFRJT0NHV0lOU1o6Ci0JCQlyZXR1cm4gdGlvY2d3aW5zeih0dHksIHApOwotCQljYXNlIFRJT0NTV0lOU1o6Ci0JCQlyZXR1cm4gdGlvY3N3aW5zeih0dHksIHJlYWxfdHR5LCBwKTsKLQkJY2FzZSBUSU9DQ09OUzoKLQkJCXJldHVybiByZWFsX3R0eSE9dHR5ID8gLUVJTlZBTCA6IHRpb2Njb25zKGZpbGUpOwotCQljYXNlIEZJT05CSU86Ci0JCQlyZXR1cm4gZmlvbmJpbyhmaWxlLCBwKTsKLQkJY2FzZSBUSU9DRVhDTDoKLQkJCXNldF9iaXQoVFRZX0VYQ0xVU0lWRSwgJnR0eS0+ZmxhZ3MpOwotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgVElPQ05YQ0w6Ci0JCQljbGVhcl9iaXQoVFRZX0VYQ0xVU0lWRSwgJnR0eS0+ZmxhZ3MpOwotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgVElPQ05PVFRZOgotCQkJaWYgKGN1cnJlbnQtPnNpZ25hbC0+dHR5ICE9IHR0eSkKLQkJCQlyZXR1cm4gLUVOT1RUWTsKLQkJCW5vX3R0eSgpOwotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgVElPQ1NDVFRZOgotCQkJcmV0dXJuIHRpb2NzY3R0eSh0dHksIGFyZyk7Ci0JCWNhc2UgVElPQ0dQR1JQOgotCQkJcmV0dXJuIHRpb2NncGdycCh0dHksIHJlYWxfdHR5LCBwKTsKLQkJY2FzZSBUSU9DU1BHUlA6Ci0JCQlyZXR1cm4gdGlvY3NwZ3JwKHR0eSwgcmVhbF90dHksIHApOwotCQljYXNlIFRJT0NHU0lEOgotCQkJcmV0dXJuIHRpb2Nnc2lkKHR0eSwgcmVhbF90dHksIHApOwotCQljYXNlIFRJT0NHRVREOgotCQkJLyogRklYTUU6IGNoZWNrIHRoaXMgaXMgb2sgKi8KLQkJCXJldHVybiBwdXRfdXNlcih0dHktPmxkaXNjLm51bSwgKGludCBfX3VzZXIgKilwKTsKLQkJY2FzZSBUSU9DU0VURDoKLQkJCXJldHVybiB0aW9jc2V0ZCh0dHksIHApOworCWNhc2UgVElPQ1NUSToKKwkJcmV0dXJuIHRpb2NzdGkodHR5LCBwKTsKKwljYXNlIFRJT0NHV0lOU1o6CisJCXJldHVybiB0aW9jZ3dpbnN6KHR0eSwgcCk7CisJY2FzZSBUSU9DU1dJTlNaOgorCQlyZXR1cm4gdGlvY3N3aW5zeih0dHksIHJlYWxfdHR5LCBwKTsKKwljYXNlIFRJT0NDT05TOgorCQlyZXR1cm4gcmVhbF90dHkgIT0gdHR5ID8gLUVJTlZBTCA6IHRpb2Njb25zKGZpbGUpOworCWNhc2UgRklPTkJJTzoKKwkJcmV0dXJuIGZpb25iaW8oZmlsZSwgcCk7CisJY2FzZSBUSU9DRVhDTDoKKwkJc2V0X2JpdChUVFlfRVhDTFVTSVZFLCAmdHR5LT5mbGFncyk7CisJCXJldHVybiAwOworCWNhc2UgVElPQ05YQ0w6CisJCWNsZWFyX2JpdChUVFlfRVhDTFVTSVZFLCAmdHR5LT5mbGFncyk7CisJCXJldHVybiAwOworCWNhc2UgVElPQ05PVFRZOgorCQlpZiAoY3VycmVudC0+c2lnbmFsLT50dHkgIT0gdHR5KQorCQkJcmV0dXJuIC1FTk9UVFk7CisJCW5vX3R0eSgpOworCQlyZXR1cm4gMDsKKwljYXNlIFRJT0NTQ1RUWToKKwkJcmV0dXJuIHRpb2NzY3R0eSh0dHksIGFyZyk7CisJY2FzZSBUSU9DR1BHUlA6CisJCXJldHVybiB0aW9jZ3BncnAodHR5LCByZWFsX3R0eSwgcCk7CisJY2FzZSBUSU9DU1BHUlA6CisJCXJldHVybiB0aW9jc3BncnAodHR5LCByZWFsX3R0eSwgcCk7CisJY2FzZSBUSU9DR1NJRDoKKwkJcmV0dXJuIHRpb2Nnc2lkKHR0eSwgcmVhbF90dHksIHApOworCWNhc2UgVElPQ0dFVEQ6CisJCS8qIEZJWE1FOiBjaGVjayB0aGlzIGlzIG9rICovCisJCXJldHVybiBwdXRfdXNlcih0dHktPmxkaXNjLm51bSwgKGludCBfX3VzZXIgKilwKTsKKwljYXNlIFRJT0NTRVREOgorCQlyZXR1cm4gdGlvY3NldGQodHR5LCBwKTsKICNpZmRlZiBDT05GSUdfVlQKLQkJY2FzZSBUSU9DTElOVVg6Ci0JCQlyZXR1cm4gdGlvY2xpbnV4KHR0eSwgYXJnKTsKKwljYXNlIFRJT0NMSU5VWDoKKwkJcmV0dXJuIHRpb2NsaW51eCh0dHksIGFyZyk7CiAjZW5kaWYKLQkJLyoKLQkJICogQnJlYWsgaGFuZGxpbmcKKwkvKgorCSAqIEJyZWFrIGhhbmRsaW5nCisJICovCisJY2FzZSBUSU9DU0JSSzoJLyogVHVybiBicmVhayBvbiwgdW5jb25kaXRpb25hbGx5ICovCisJCXR0eS0+ZHJpdmVyLT5icmVha19jdGwodHR5LCAtMSk7CisJCXJldHVybiAwOworCisJY2FzZSBUSU9DQ0JSSzoJLyogVHVybiBicmVhayBvZmYsIHVuY29uZGl0aW9uYWxseSAqLworCQl0dHktPmRyaXZlci0+YnJlYWtfY3RsKHR0eSwgMCk7CisJCXJldHVybiAwOworCWNhc2UgVENTQlJLOiAgIC8qIFNWSUQgdmVyc2lvbjogbm9uLXplcm8gYXJnIC0tPiBubyBicmVhayAqLworCQkvKiBub24temVybyBhcmcgbWVhbnMgd2FpdCBmb3IgYWxsIG91dHB1dCBkYXRhCisJCSAqIHRvIGJlIHNlbnQgKHBlcmZvcm1lZCBhYm92ZSkgYnV0IGRvbid0IHNlbmQgYnJlYWsuCisJCSAqIFRoaXMgaXMgdXNlZCBieSB0aGUgdGNkcmFpbigpIHRlcm1pb3MgZnVuY3Rpb24uCiAJCSAqLwotCQljYXNlIFRJT0NTQlJLOgkvKiBUdXJuIGJyZWFrIG9uLCB1bmNvbmRpdGlvbmFsbHkgKi8KLQkJCXR0eS0+ZHJpdmVyLT5icmVha19jdGwodHR5LCAtMSk7Ci0JCQlyZXR1cm4gMDsKLQkJCQotCQljYXNlIFRJT0NDQlJLOgkvKiBUdXJuIGJyZWFrIG9mZiwgdW5jb25kaXRpb25hbGx5ICovCi0JCQl0dHktPmRyaXZlci0+YnJlYWtfY3RsKHR0eSwgMCk7Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSBUQ1NCUks6ICAgLyogU1ZJRCB2ZXJzaW9uOiBub24temVybyBhcmcgLS0+IG5vIGJyZWFrICovCi0JCQkvKiBub24temVybyBhcmcgbWVhbnMgd2FpdCBmb3IgYWxsIG91dHB1dCBkYXRhCi0JCQkgKiB0byBiZSBzZW50IChwZXJmb3JtZWQgYWJvdmUpIGJ1dCBkb24ndCBzZW5kIGJyZWFrLgotCQkJICogVGhpcyBpcyB1c2VkIGJ5IHRoZSB0Y2RyYWluKCkgdGVybWlvcyBmdW5jdGlvbi4KLQkJCSAqLwotCQkJaWYgKCFhcmcpCi0JCQkJcmV0dXJuIHNlbmRfYnJlYWsodHR5LCAyNTApOwotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgVENTQlJLUDoJLyogc3VwcG9ydCBmb3IgUE9TSVggdGNzZW5kYnJlYWsoKSAqLwkKLQkJCXJldHVybiBzZW5kX2JyZWFrKHR0eSwgYXJnID8gYXJnKjEwMCA6IDI1MCk7CisJCWlmICghYXJnKQorCQkJcmV0dXJuIHNlbmRfYnJlYWsodHR5LCAyNTApOworCQlyZXR1cm4gMDsKKwljYXNlIFRDU0JSS1A6CS8qIHN1cHBvcnQgZm9yIFBPU0lYIHRjc2VuZGJyZWFrKCkgKi8KKwkJcmV0dXJuIHNlbmRfYnJlYWsodHR5LCBhcmcgPyBhcmcqMTAwIDogMjUwKTsKIAotCQljYXNlIFRJT0NNR0VUOgotCQkJcmV0dXJuIHR0eV90aW9jbWdldCh0dHksIGZpbGUsIHApOwotCi0JCWNhc2UgVElPQ01TRVQ6Ci0JCWNhc2UgVElPQ01CSUM6Ci0JCWNhc2UgVElPQ01CSVM6Ci0JCQlyZXR1cm4gdHR5X3Rpb2Ntc2V0KHR0eSwgZmlsZSwgY21kLCBwKTsKLQkJY2FzZSBUQ0ZMU0g6Ci0JCQlzd2l0Y2ggKGFyZykgewotCQkJY2FzZSBUQ0lGTFVTSDoKLQkJCWNhc2UgVENJT0ZMVVNIOgotCQkJCS8qIGZsdXNoIHR0eSBidWZmZXIgYW5kIGFsbG93IGxkaXNjIHRvIHByb2Nlc3MgaW9jdGwgKi8KLQkJCQl0dHlfYnVmZmVyX2ZsdXNoKHR0eSk7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJY2FzZSBUSU9DTUdFVDoKKwkJcmV0dXJuIHR0eV90aW9jbWdldCh0dHksIGZpbGUsIHApOworCWNhc2UgVElPQ01TRVQ6CisJY2FzZSBUSU9DTUJJQzoKKwljYXNlIFRJT0NNQklTOgorCQlyZXR1cm4gdHR5X3Rpb2Ntc2V0KHR0eSwgZmlsZSwgY21kLCBwKTsKKwljYXNlIFRDRkxTSDoKKwkJc3dpdGNoIChhcmcpIHsKKwkJY2FzZSBUQ0lGTFVTSDoKKwkJY2FzZSBUQ0lPRkxVU0g6CisJCS8qIGZsdXNoIHR0eSBidWZmZXIgYW5kIGFsbG93IGxkaXNjIHRvIHByb2Nlc3MgaW9jdGwgKi8KKwkJCXR0eV9idWZmZXJfZmx1c2godHR5KTsKIAkJCWJyZWFrOworCQl9CisJCWJyZWFrOwogCX0KIAlpZiAodHR5LT5kcml2ZXItPmlvY3RsKSB7CiAJCXJldHZhbCA9ICh0dHktPmRyaXZlci0+aW9jdGwpKHR0eSwgZmlsZSwgY21kLCBhcmcpOwpAQCAtMzQ2MCw3ICszNDYyLDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19DT01QQVQKLXN0YXRpYyBsb25nIHR0eV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKiBmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorc3RhdGljIGxvbmcgdHR5X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKIAkJCQl1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CkBAIC0zNDkxLDcgKzM0OTMsNyBAQAogICogcHJldmVudCB0cm9qYW4gaG9yc2VzIGJ5IGtpbGxpbmcgYWxsIHByb2Nlc3NlcyBhc3NvY2lhdGVkIHdpdGggdGhpcwogICogdHR5IHdoZW4gdGhlIHVzZXIgaGl0cyB0aGUgIlNlY3VyZSBBdHRlbnRpb24gS2V5Ii4gIFJlcXVpcmVkIGZvcgogICogc3VwZXItcGFyYW5vaWQgYXBwbGljYXRpb25zIC0tLSBzZWUgdGhlIE9yYW5nZSBCb29rIGZvciBtb3JlIGRldGFpbHMuCi0gKiAKKyAqCiAgKiBUaGlzIGNvZGUgY291bGQgYmUgbmljZXI7IGlkZWFsbHkgaXQgc2hvdWxkIHNlbmQgYSBIVVAsIHdhaXQgYSBmZXcKICAqIHNlY29uZHMsIHRoZW4gc2VuZCBhIElOVCwgYW5kIHRoZW4gYSBLSUxMIHNpZ25hbC4gIEJ1dCB5b3UgdGhlbgogICogaGF2ZSB0byBjb29yZGluYXRlIHdpdGggdGhlIGluaXQgcHJvY2Vzcywgc2luY2UgYWxsIHByb2Nlc3NlcyBhc3NvY2lhdGVkCkBAIC0zNTE1LDE2ICszNTE3LDE2IEBACiAJaW50CQlpOwogCXN0cnVjdCBmaWxlCSpmaWxwOwogCXN0cnVjdCBmZHRhYmxlICpmZHQ7Ci0JCisKIAlpZiAoIXR0eSkKIAkJcmV0dXJuOwogCXNlc3Npb24gPSB0dHktPnNlc3Npb247Ci0JCisKIAl0dHlfbGRpc2NfZmx1c2godHR5KTsKIAogCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQogCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7Ci0JCisKIAlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwogCS8qIEtpbGwgdGhlIGVudGlyZSBzZXNzaW9uICovCiAJZG9fZWFjaF9waWRfdGFzayhzZXNzaW9uLCBQSURUWVBFX1NJRCwgcCkgewpAQCAtMzU1Miw3ICszNTU0LDcgQEAKIAkJCSAqLwogCQkJc3Bpbl9sb2NrKCZwLT5maWxlcy0+ZmlsZV9sb2NrKTsKIAkJCWZkdCA9IGZpbGVzX2ZkdGFibGUocC0+ZmlsZXMpOwotCQkJZm9yIChpPTA7IGkgPCBmZHQtPm1heF9mZHM7IGkrKykgeworCQkJZm9yIChpID0gMDsgaSA8IGZkdC0+bWF4X2ZkczsgaSsrKSB7CiAJCQkJZmlscCA9IGZjaGVja19maWxlcyhwLT5maWxlcywgaSk7CiAJCQkJaWYgKCFmaWxwKQogCQkJCQljb250aW51ZTsKQEAgLTM2MDYsNyArMzYwOCw3IEBACiAgKgl3aGlsZSBpbnZva2luZyB0aGUgbGluZSBkaXNjaXBsaW5lIHJlY2VpdmVfYnVmIG1ldGhvZC4gVGhlCiAgKglyZWNlaXZlX2J1ZiBtZXRob2QgaXMgc2luZ2xlIHRocmVhZGVkIGZvciBlYWNoIHR0eSBpbnN0YW5jZS4KICAqLwotIAorCiBzdGF0aWMgdm9pZCBmbHVzaF90b19sZGlzYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9CkBAIC0zNjIyLDcgKzM2MjQsOCBAQAogCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5idWYubG9jaywgZmxhZ3MpOwotCXNldF9iaXQoVFRZX0ZMVVNISU5HLCAmdHR5LT5mbGFncyk7CS8qIFNvIHdlIGtub3cgYSBmbHVzaCBpcyBydW5uaW5nICovCisJLyogU28gd2Uga25vdyBhIGZsdXNoIGlzIHJ1bm5pbmcgKi8KKwlzZXRfYml0KFRUWV9GTFVTSElORywgJnR0eS0+ZmxhZ3MpOwogCWhlYWQgPSB0dHktPmJ1Zi5oZWFkOwogCWlmIChoZWFkICE9IE5VTEwpIHsKIAkJdHR5LT5idWYuaGVhZCA9IE5VTEw7CkBAIC0zNzk1LDcgKzM3OTgsOCBAQAogCiB2b2lkIHR0eV91bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyLCB1bnNpZ25lZCBpbmRleCkKIHsKLQlkZXZpY2VfZGVzdHJveSh0dHlfY2xhc3MsIE1LREVWKGRyaXZlci0+bWFqb3IsIGRyaXZlci0+bWlub3Jfc3RhcnQpICsgaW5kZXgpOworCWRldmljZV9kZXN0cm95KHR0eV9jbGFzcywKKwkJTUtERVYoZHJpdmVyLT5tYWpvciwgZHJpdmVyLT5taW5vcl9zdGFydCkgKyBpbmRleCk7CiB9CiAKIEVYUE9SVF9TWU1CT0wodHR5X3JlZ2lzdGVyX2RldmljZSk7CkBAIC0zODU5LDcgKzM4NjMsNyBAQAogaW50IHR0eV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlcikKIHsKIAlpbnQgZXJyb3I7Ci0gICAgICAgIGludCBpOworCWludCBpOwogCWRldl90IGRldjsKIAl2b2lkICoqcCA9IE5VTEw7CiAKQEAgLTM4NzMsOCArMzg3Nyw4IEBACiAJfQogCiAJaWYgKCFkcml2ZXItPm1ham9yKSB7Ci0JCWVycm9yID0gYWxsb2NfY2hyZGV2X3JlZ2lvbigmZGV2LCBkcml2ZXItPm1pbm9yX3N0YXJ0LCBkcml2ZXItPm51bSwKLQkJCQkJCWRyaXZlci0+bmFtZSk7CisJCWVycm9yID0gYWxsb2NfY2hyZGV2X3JlZ2lvbigmZGV2LCBkcml2ZXItPm1pbm9yX3N0YXJ0LAorCQkJCQkJZHJpdmVyLT5udW0sIGRyaXZlci0+bmFtZSk7CiAJCWlmICghZXJyb3IpIHsKIAkJCWRyaXZlci0+bWFqb3IgPSBNQUpPUihkZXYpOwogCQkJZHJpdmVyLT5taW5vcl9zdGFydCA9IE1JTk9SKGRldik7CkBAIC0zODkxLDcgKzM4OTUsOCBAQAogCWlmIChwKSB7CiAJCWRyaXZlci0+dHR5cyA9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKilwOwogCQlkcml2ZXItPnRlcm1pb3MgPSAoc3RydWN0IGt0ZXJtaW9zICoqKShwICsgZHJpdmVyLT5udW0pOwotCQlkcml2ZXItPnRlcm1pb3NfbG9ja2VkID0gKHN0cnVjdCBrdGVybWlvcyAqKikocCArIGRyaXZlci0+bnVtICogMik7CisJCWRyaXZlci0+dGVybWlvc19sb2NrZWQgPSAoc3RydWN0IGt0ZXJtaW9zICoqKQorCQkJCQkJCShwICsgZHJpdmVyLT5udW0gKiAyKTsKIAl9IGVsc2UgewogCQlkcml2ZXItPnR0eXMgPSBOVUxMOwogCQlkcml2ZXItPnRlcm1pb3MgPSBOVUxMOwpAQCAtMzkxMSwxMyArMzkxNiwxMyBAQAogCiAJaWYgKCFkcml2ZXItPnB1dF9jaGFyKQogCQlkcml2ZXItPnB1dF9jaGFyID0gdHR5X2RlZmF1bHRfcHV0X2NoYXI7Ci0JCisKIAltdXRleF9sb2NrKCZ0dHlfbXV0ZXgpOwogCWxpc3RfYWRkKCZkcml2ZXItPnR0eV9kcml2ZXJzLCAmdHR5X2RyaXZlcnMpOwogCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKLQkKLQlpZiAoICEoZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfRFlOQU1JQ19ERVYpICkgewotCQlmb3IoaSA9IDA7IGkgPCBkcml2ZXItPm51bTsgaSsrKQorCisJaWYgKCEoZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfRFlOQU1JQ19ERVYpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBkcml2ZXItPm51bTsgaSsrKQogCQkgICAgdHR5X3JlZ2lzdGVyX2RldmljZShkcml2ZXIsIGksIE5VTEwpOwogCX0KIAlwcm9jX3R0eV9yZWdpc3Rlcl9kcml2ZXIoZHJpdmVyKTsKQEAgLTQwMzcsNyArNDA0Miw3IEBACiAJKHZvaWQpIHR0eV9yZWdpc3Rlcl9sZGlzYyhOX1RUWSwgJnR0eV9sZGlzY19OX1RUWSk7CiAKIAkvKgotCSAqIHNldCB1cCB0aGUgY29uc29sZSBkZXZpY2Ugc28gdGhhdCBsYXRlciBib290IHNlcXVlbmNlcyBjYW4gCisJICogc2V0IHVwIHRoZSBjb25zb2xlIGRldmljZSBzbyB0aGF0IGxhdGVyIGJvb3Qgc2VxdWVuY2VzIGNhbgogCSAqIGluZm9ybSBhYm91dCBwcm9ibGVtcyBldGMuLgogCSAqLwogCWNhbGwgPSBfX2Nvbl9pbml0Y2FsbF9zdGFydDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90dHlfaW9jdGwuYyBiL2RyaXZlcnMvY2hhci90dHlfaW9jdGwuYwppbmRleCBkNGI2ZDY0Li5mOTVhODBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHR5X2lvY3RsLmMKKysrIGIvZHJpdmVycy9jaGFyL3R0eV9pb2N0bC5jCkBAIC01MCwxMSArNTAsMTEgQEAKICAqCUxvY2tpbmc6IG5vbmUKICAqLwogCi12b2lkIHR0eV93YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIGxvbmcgdGltZW91dCkKK3ZvaWQgdHR5X3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBsb25nIHRpbWVvdXQpCiB7CiAjaWZkZWYgVFRZX0RFQlVHX1dBSVRfVU5USUxfU0VOVAogCWNoYXIgYnVmWzY0XTsKLQkKKwogCXByaW50ayhLRVJOX0RFQlVHICIlcyB3YWl0IHVudGlsIHNlbnQuLi5cbiIsIHR0eV9uYW1lKHR0eSwgYnVmKSk7CiAjZW5kaWYKIAlpZiAoIXR0eS0+ZHJpdmVyLT5jaGFyc19pbl9idWZmZXIpCkBAIC02Nyw3ICs2Nyw2IEBACiAJaWYgKHR0eS0+ZHJpdmVyLT53YWl0X3VudGlsX3NlbnQpCiAJCXR0eS0+ZHJpdmVyLT53YWl0X3VudGlsX3NlbnQodHR5LCB0aW1lb3V0KTsKIH0KLQogRVhQT1JUX1NZTUJPTCh0dHlfd2FpdF91bnRpbF9zZW50KTsKIAogc3RhdGljIHZvaWQgdW5zZXRfbG9ja2VkX3Rlcm1pb3Moc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zLApAQCAtNzUsOCArNzQsOCBAQAogCQkJCSBzdHJ1Y3Qga3Rlcm1pb3MgKmxvY2tlZCkKIHsKIAlpbnQJaTsKLQkKLSNkZWZpbmUgTk9TRVRfTUFTSyh4LHkseikgKHggPSAoKHgpICYgfih6KSkgfCAoKHkpICYgKHopKSkKKworI2RlZmluZSBOT1NFVF9NQVNLKHgsIHksIHopICh4ID0gKCh4KSAmIH4oeikpIHwgKCh5KSAmICh6KSkpCiAKIAlpZiAoIWxvY2tlZCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJXYXJuaW5nPyE/IHRlcm1pb3NfbG9ja2VkIGlzIE5VTEwuXG4iKTsKQEAgLTg4LDcgKzg3LDcgQEAKIAlOT1NFVF9NQVNLKHRlcm1pb3MtPmNfY2ZsYWcsIG9sZC0+Y19jZmxhZywgbG9ja2VkLT5jX2NmbGFnKTsKIAlOT1NFVF9NQVNLKHRlcm1pb3MtPmNfbGZsYWcsIG9sZC0+Y19sZmxhZywgbG9ja2VkLT5jX2xmbGFnKTsKIAl0ZXJtaW9zLT5jX2xpbmUgPSBsb2NrZWQtPmNfbGluZSA/IG9sZC0+Y19saW5lIDogdGVybWlvcy0+Y19saW5lOwotCWZvciAoaT0wOyBpIDwgTkNDUzsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBOQ0NTOyBpKyspCiAJCXRlcm1pb3MtPmNfY2NbaV0gPSBsb2NrZWQtPmNfY2NbaV0gPwogCQkJb2xkLT5jX2NjW2ldIDogdGVybWlvcy0+Y19jY1tpXTsKIAkvKiBGSVhNRTogV2hhdCBzaG91bGQgd2UgZG8gZm9yIGkvb3NwZWVkICovCkBAIC0xNjMsNyArMTYyLDYgQEAKIAl9CiAJcmV0dXJuIGJhdWRfdGFibGVbY2JhdWRdOwogfQotCiBFWFBPUlRfU1lNQk9MKHR0eV90ZXJtaW9zX2JhdWRfcmF0ZSk7CiAKIC8qKgpAQCAtMjAzLDcgKzIwMSw2IEBACiAJcmV0dXJuIHR0eV90ZXJtaW9zX2JhdWRfcmF0ZSh0ZXJtaW9zKTsKICNlbmRpZgogfQotCiBFWFBPUlRfU1lNQk9MKHR0eV90ZXJtaW9zX2lucHV0X2JhdWRfcmF0ZSk7CiAKIC8qKgpAQCAtMzM4LDcgKzMzNSw2IEBACiAKIAlyZXR1cm4gYmF1ZDsKIH0KLQogRVhQT1JUX1NZTUJPTCh0dHlfZ2V0X2JhdWRfcmF0ZSk7CiAKIC8qKgpAQCAtMzYxLDcgKzM1Nyw2IEBACiAJbmV3LT5jX2lzcGVlZCA9IG9sZC0+Y19pc3BlZWQ7CiAJbmV3LT5jX29zcGVlZCA9IG9sZC0+Y19vc3BlZWQ7CiB9Ci0KIEVYUE9SVF9TWU1CT0wodHR5X3Rlcm1pb3NfY29weV9odyk7CiAKIC8qKgpAQCAtMzk1LDE2ICszOTAsMTYgQEAKICAqCUxvY2tpbmc6IHRlcm1pb3Nfc2VtCiAgKi8KIAotc3RhdGljIHZvaWQgY2hhbmdlX3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBrdGVybWlvcyAqIG5ld190ZXJtaW9zKQorc3RhdGljIHZvaWQgY2hhbmdlX3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGt0ZXJtaW9zICpuZXdfdGVybWlvcykKIHsKIAlpbnQgY2Fub25fY2hhbmdlOwogCXN0cnVjdCBrdGVybWlvcyBvbGRfdGVybWlvcyA9ICp0dHktPnRlcm1pb3M7CiAJc3RydWN0IHR0eV9sZGlzYyAqbGQ7Ci0JCisKIAkvKgogCSAqCVBlcmZvcm0gdGhlIGFjdHVhbCB0ZXJtaW9zIGludGVybmFsIGNoYW5nZXMgdW5kZXIgbG9jay4KIAkgKi8KLQkgCisKIAogCS8qIEZJWE1FOiB3ZSBuZWVkIHRvIGRlY2lkZSBvbiBzb21lIGxvY2tpbmcvb3JkZXJpbmcgc2VtYW50aWNzCiAJICAgZm9yIHRoZSBzZXRfdGVybWlvcyBub3RpZmljYXRpb24gZXZlbnR1YWxseSAqLwpAQCAtNDE5LDcgKzQxNCw3IEBACiAJCXR0eS0+Y2Fub25fZGF0YSA9IDA7CiAJCXR0eS0+ZXJhc2luZyA9IDA7CiAJfQotCQorCiAJLyogVGhpcyBiaXQgc2hvdWxkIGJlIGluIHRoZSBsZGlzYyBjb2RlICovCiAJaWYgKGNhbm9uX2NoYW5nZSAmJiAhTF9JQ0FOT04odHR5KSAmJiB0dHktPnJlYWRfY250KQogCQkvKiBHZXQgY2hhcmFjdGVycyBsZWZ0IG92ZXIgZnJvbSBjYW5vbmljYWwgbW9kZS4gKi8KQEAgLTQ0Miw3ICs0MzcsNyBAQAogCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPmxpbmstPnJlYWRfd2FpdCk7CiAJCX0KIAl9Ci0JICAgCisKIAlpZiAodHR5LT5kcml2ZXItPnNldF90ZXJtaW9zKQogCQkoKnR0eS0+ZHJpdmVyLT5zZXRfdGVybWlvcykodHR5LCAmb2xkX3Rlcm1pb3MpOwogCWVsc2UKQEAgLTQ3MCw3ICs0NjUsNyBAQAogICoJCUNhbGxlZCBmdW5jdGlvbnMgdGFrZSBsZGlzYyBhbmQgdGVybWlvc19zZW0gbG9ja3MKICAqLwogCi1zdGF0aWMgaW50IHNldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCB2b2lkIF9fdXNlciAqYXJnLCBpbnQgb3B0KQorc3RhdGljIGludCBzZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB2b2lkIF9fdXNlciAqYXJnLCBpbnQgb3B0KQogewogCXN0cnVjdCBrdGVybWlvcyB0bXBfdGVybWlvczsKIAlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKQEAgLTUwMSwxOSArNDk2LDE5IEBACiAJCXJldHVybiAtRUZBVUxUOwogI2VuZGlmCiAKLQkvKiBJZiBvbGQgc3R5bGUgQmZvbyB2YWx1ZXMgYXJlIHVzZWQgdGhlbiBsb2FkIGNfaXNwZWVkL2Nfb3NwZWVkIHdpdGggdGhlIHJlYWwgc3BlZWQKLQkgICBzbyBpdHMgdW5jb25kaXRpb25hbGx5IHVzYWJsZSAqLworCS8qIElmIG9sZCBzdHlsZSBCZm9vIHZhbHVlcyBhcmUgdXNlZCB0aGVuIGxvYWQgY19pc3BlZWQvY19vc3BlZWQKKwkgKiB3aXRoIHRoZSByZWFsIHNwZWVkIHNvIGl0cyB1bmNvbmRpdGlvbmFsbHkgdXNhYmxlICovCiAJdG1wX3Rlcm1pb3MuY19pc3BlZWQgPSB0dHlfdGVybWlvc19pbnB1dF9iYXVkX3JhdGUoJnRtcF90ZXJtaW9zKTsKIAl0bXBfdGVybWlvcy5jX29zcGVlZCA9IHR0eV90ZXJtaW9zX2JhdWRfcmF0ZSgmdG1wX3Rlcm1pb3MpOwogCiAJbGQgPSB0dHlfbGRpc2NfcmVmKHR0eSk7Ci0JCisKIAlpZiAobGQgIT0gTlVMTCkgewogCQlpZiAoKG9wdCAmIFRFUk1JT1NfRkxVU0gpICYmIGxkLT5mbHVzaF9idWZmZXIpCiAJCQlsZC0+Zmx1c2hfYnVmZmVyKHR0eSk7CiAJCXR0eV9sZGlzY19kZXJlZihsZCk7CiAJfQotCQorCiAJaWYgKG9wdCAmIFRFUk1JT1NfV0FJVCkgewogCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKQEAgLTUyOSwxNCArNTI0LDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ2V0X3Rlcm1pbyhzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IHRlcm1pbyBfX3VzZXIgKiB0ZXJtaW8pCitzdGF0aWMgaW50IGdldF90ZXJtaW8oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pbyBfX3VzZXIgKnRlcm1pbykKIHsKIAlpZiAoa2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW8odGVybWlvLCB0dHktPnRlcm1pb3MpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5xX2Nhbm9uKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQorc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5xX2Nhbm9uKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJaW50IG5yLCBoZWFkLCB0YWlsOwogCkBAIC01NjEsNyArNTU2LDcgQEAKICAqCiAgKiBUaGUgInNnX2ZsYWdzIiB0cmFuc2xhdGlvbiBpcyBhIGpva2UuLgogICovCi1zdGF0aWMgaW50IGdldF9zZ2ZsYWdzKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQorc3RhdGljIGludCBnZXRfc2dmbGFncyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCWludCBmbGFncyA9IDA7CiAKQEAgLTU3OSw3ICs1NzQsNyBAQAogCXJldHVybiBmbGFnczsKIH0KIAotc3RhdGljIGludCBnZXRfc2d0dHliKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3Qgc2d0dHliIF9fdXNlciAqIHNndHR5YikKK3N0YXRpYyBpbnQgZ2V0X3NndHR5YihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qgc2d0dHliIF9fdXNlciAqc2d0dHliKQogewogCXN0cnVjdCBzZ3R0eWIgdG1wOwogCkBAIC01OTAsMTEgKzU4NSwxMSBAQAogCXRtcC5zZ19raWxsID0gdHR5LT50ZXJtaW9zLT5jX2NjW1ZLSUxMXTsKIAl0bXAuc2dfZmxhZ3MgPSBnZXRfc2dmbGFncyh0dHkpOwogCW11dGV4X3VubG9jaygmdHR5LT50ZXJtaW9zX211dGV4KTsKLQkKKwogCXJldHVybiBjb3B5X3RvX3VzZXIoc2d0dHliLCAmdG1wLCBzaXplb2YodG1wKSkgPyAtRUZBVUxUIDogMDsKIH0KIAotc3RhdGljIHZvaWQgc2V0X3NnZmxhZ3Moc3RydWN0IGt0ZXJtaW9zICogdGVybWlvcywgaW50IGZsYWdzKQorc3RhdGljIHZvaWQgc2V0X3NnZmxhZ3Moc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zLCBpbnQgZmxhZ3MpCiB7CiAJdGVybWlvcy0+Y19pZmxhZyA9IElDUk5MIHwgSVhPTjsKIAl0ZXJtaW9zLT5jX29mbGFnID0gMDsKQEAgLTYzMSw3ICs2MjYsNyBAQAogICoJTG9ja2luZzogdGVybWlvc19zZW0KICAqLwogCi1zdGF0aWMgaW50IHNldF9zZ3R0eWIoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBzZ3R0eWIgX191c2VyICogc2d0dHliKQorc3RhdGljIGludCBzZXRfc2d0dHliKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBzZ3R0eWIgX191c2VyICpzZ3R0eWIpCiB7CiAJaW50IHJldHZhbDsKIAlzdHJ1Y3Qgc2d0dHliIHRtcDsKQEAgLTY0MCw3ICs2MzUsNyBAQAogCXJldHZhbCA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwotCQorCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXAsIHNndHR5Yiwgc2l6ZW9mKHRtcCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIApAQCAtNjUxLDcgKzY0Niw4IEBACiAJc2V0X3NnZmxhZ3MoJnRlcm1pb3MsIHRtcC5zZ19mbGFncyk7CiAJLyogVHJ5IGFuZCBlbmNvZGUgaW50byBCZm9vIGZvcm1hdCAqLwogI2lmZGVmIEJPVEhFUgotCXR0eV90ZXJtaW9zX2VuY29kZV9iYXVkX3JhdGUoJnRlcm1pb3MsIHRlcm1pb3MuY19pc3BlZWQsIHRlcm1pb3MuY19vc3BlZWQpOworCXR0eV90ZXJtaW9zX2VuY29kZV9iYXVkX3JhdGUoJnRlcm1pb3MsIHRlcm1pb3MuY19pc3BlZWQsCisJCQkJCQl0ZXJtaW9zLmNfb3NwZWVkKTsKICNlbmRpZgogCW11dGV4X3VubG9jaygmdHR5LT50ZXJtaW9zX211dGV4KTsKIAljaGFuZ2VfdGVybWlvcyh0dHksICZ0ZXJtaW9zKTsKQEAgLTY2MCw3ICs2NTYsNyBAQAogI2VuZGlmCiAKICNpZmRlZiBUSU9DR0VUQwotc3RhdGljIGludCBnZXRfdGNoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgdGNoYXJzIF9fdXNlciAqIHRjaGFycykKK3N0YXRpYyBpbnQgZ2V0X3RjaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGNoYXJzIF9fdXNlciAqdGNoYXJzKQogewogCXN0cnVjdCB0Y2hhcnMgdG1wOwogCkBAIC02NzMsNyArNjY5LDcgQEAKIAlyZXR1cm4gY29weV90b191c2VyKHRjaGFycywgJnRtcCwgc2l6ZW9mKHRtcCkpID8gLUVGQVVMVCA6IDA7CiB9CiAKLXN0YXRpYyBpbnQgc2V0X3RjaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwgc3RydWN0IHRjaGFycyBfX3VzZXIgKiB0Y2hhcnMpCitzdGF0aWMgaW50IHNldF90Y2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRjaGFycyBfX3VzZXIgKnRjaGFycykKIHsKIAlzdHJ1Y3QgdGNoYXJzIHRtcDsKIApAQCAtNjkwLDIwICs2ODYsMjIgQEAKICNlbmRpZgogCiAjaWZkZWYgVElPQ0dMVEMKLXN0YXRpYyBpbnQgZ2V0X2x0Y2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBsdGNoYXJzIF9fdXNlciAqIGx0Y2hhcnMpCitzdGF0aWMgaW50IGdldF9sdGNoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBsdGNoYXJzIF9fdXNlciAqbHRjaGFycykKIHsKIAlzdHJ1Y3QgbHRjaGFycyB0bXA7CiAKIAl0bXAudF9zdXNwYyA9IHR0eS0+dGVybWlvcy0+Y19jY1tWU1VTUF07Ci0JdG1wLnRfZHN1c3BjID0gdHR5LT50ZXJtaW9zLT5jX2NjW1ZTVVNQXTsJLyogd2hhdCBpcyBkc3VzcGMgYW55d2F5PyAqLworCS8qIHdoYXQgaXMgZHN1c3BjIGFueXdheT8gKi8KKwl0bXAudF9kc3VzcGMgPSB0dHktPnRlcm1pb3MtPmNfY2NbVlNVU1BdOwogCXRtcC50X3Jwcm50YyA9IHR0eS0+dGVybWlvcy0+Y19jY1tWUkVQUklOVF07Ci0JdG1wLnRfZmx1c2hjID0gdHR5LT50ZXJtaW9zLT5jX2NjW1ZFT0wyXTsJLyogd2hhdCBpcyBmbHVzaGMgYW55d2F5PyAqLworCS8qIHdoYXQgaXMgZmx1c2hjIGFueXdheT8gKi8KKwl0bXAudF9mbHVzaGMgPSB0dHktPnRlcm1pb3MtPmNfY2NbVkVPTDJdOwogCXRtcC50X3dlcmFzYyA9IHR0eS0+dGVybWlvcy0+Y19jY1tWV0VSQVNFXTsKIAl0bXAudF9sbmV4dGMgPSB0dHktPnRlcm1pb3MtPmNfY2NbVkxORVhUXTsKIAlyZXR1cm4gY29weV90b191c2VyKGx0Y2hhcnMsICZ0bXAsIHNpemVvZih0bXApKSA/IC1FRkFVTFQgOiAwOwogfQogCi1zdGF0aWMgaW50IHNldF9sdGNoYXJzKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgbHRjaGFycyBfX3VzZXIgKiBsdGNoYXJzKQorc3RhdGljIGludCBzZXRfbHRjaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgbHRjaGFycyBfX3VzZXIgKmx0Y2hhcnMpCiB7CiAJc3RydWN0IGx0Y2hhcnMgdG1wOwogCkBAIC03MTEsOSArNzA5LDExIEBACiAJCXJldHVybiAtRUZBVUxUOwogCiAJdHR5LT50ZXJtaW9zLT5jX2NjW1ZTVVNQXSA9IHRtcC50X3N1c3BjOwotCXR0eS0+dGVybWlvcy0+Y19jY1tWRU9MMl0gPSB0bXAudF9kc3VzcGM7CS8qIHdoYXQgaXMgZHN1c3BjIGFueXdheT8gKi8KKwkvKiB3aGF0IGlzIGRzdXNwYyBhbnl3YXk/ICovCisJdHR5LT50ZXJtaW9zLT5jX2NjW1ZFT0wyXSA9IHRtcC50X2RzdXNwYzsKIAl0dHktPnRlcm1pb3MtPmNfY2NbVlJFUFJJTlRdID0gdG1wLnRfcnBybnRjOwotCXR0eS0+dGVybWlvcy0+Y19jY1tWRU9MMl0gPSB0bXAudF9mbHVzaGM7CS8qIHdoYXQgaXMgZmx1c2hjIGFueXdheT8gKi8KKwkvKiB3aGF0IGlzIGZsdXNoYyBhbnl3YXk/ICovCisJdHR5LT50ZXJtaW9zLT5jX2NjW1ZFT0wyXSA9IHRtcC50X2ZsdXNoYzsKIAl0dHktPnRlcm1pb3MtPmNfY2NbVldFUkFTRV0gPSB0bXAudF93ZXJhc2M7CiAJdHR5LT50ZXJtaW9zLT5jX2NjW1ZMTkVYVF0gPSB0bXAudF9sbmV4dGM7CiAJcmV0dXJuIDA7CkBAIC03NjEsMTAgKzc2MSwxMCBAQAogICoJY29uc2lzdGVudCBtb2RlIHNldHRpbmcuCiAgKi8KIAotaW50IHR0eV9tb2RlX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKK2ludCB0dHlfbW9kZV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXN0cnVjdCB0dHlfc3RydWN0ICogcmVhbF90dHk7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnJlYWxfdHR5OwogCXZvaWQgX191c2VyICpwID0gKHZvaWQgX191c2VyICopYXJnOwogCiAJaWYgKHR0eS0+ZHJpdmVyLT50eXBlID09IFRUWV9EUklWRVJfVFlQRV9QVFkgJiYKQEAgLTc3NSwxMDAgKzc3NSwxMDAgQEAKIAogCXN3aXRjaCAoY21kKSB7CiAjaWZkZWYgVElPQ0dFVFAKLQkJY2FzZSBUSU9DR0VUUDoKLQkJCXJldHVybiBnZXRfc2d0dHliKHJlYWxfdHR5LCAoc3RydWN0IHNndHR5YiBfX3VzZXIgKikgYXJnKTsKLQkJY2FzZSBUSU9DU0VUUDoKLQkJY2FzZSBUSU9DU0VUTjoKLQkJCXJldHVybiBzZXRfc2d0dHliKHJlYWxfdHR5LCAoc3RydWN0IHNndHR5YiBfX3VzZXIgKikgYXJnKTsKKwljYXNlIFRJT0NHRVRQOgorCQlyZXR1cm4gZ2V0X3NndHR5YihyZWFsX3R0eSwgKHN0cnVjdCBzZ3R0eWIgX191c2VyICopIGFyZyk7CisJY2FzZSBUSU9DU0VUUDoKKwljYXNlIFRJT0NTRVROOgorCQlyZXR1cm4gc2V0X3NndHR5YihyZWFsX3R0eSwgKHN0cnVjdCBzZ3R0eWIgX191c2VyICopIGFyZyk7CiAjZW5kaWYKICNpZmRlZiBUSU9DR0VUQwotCQljYXNlIFRJT0NHRVRDOgotCQkJcmV0dXJuIGdldF90Y2hhcnMocmVhbF90dHksIHApOwotCQljYXNlIFRJT0NTRVRDOgotCQkJcmV0dXJuIHNldF90Y2hhcnMocmVhbF90dHksIHApOworCWNhc2UgVElPQ0dFVEM6CisJCXJldHVybiBnZXRfdGNoYXJzKHJlYWxfdHR5LCBwKTsKKwljYXNlIFRJT0NTRVRDOgorCQlyZXR1cm4gc2V0X3RjaGFycyhyZWFsX3R0eSwgcCk7CiAjZW5kaWYKICNpZmRlZiBUSU9DR0xUQwotCQljYXNlIFRJT0NHTFRDOgotCQkJcmV0dXJuIGdldF9sdGNoYXJzKHJlYWxfdHR5LCBwKTsKLQkJY2FzZSBUSU9DU0xUQzoKLQkJCXJldHVybiBzZXRfbHRjaGFycyhyZWFsX3R0eSwgcCk7CisJY2FzZSBUSU9DR0xUQzoKKwkJcmV0dXJuIGdldF9sdGNoYXJzKHJlYWxfdHR5LCBwKTsKKwljYXNlIFRJT0NTTFRDOgorCQlyZXR1cm4gc2V0X2x0Y2hhcnMocmVhbF90dHksIHApOwogI2VuZGlmCi0JCWNhc2UgVENTRVRTRjoKLQkJCXJldHVybiBzZXRfdGVybWlvcyhyZWFsX3R0eSwgcCwgIFRFUk1JT1NfRkxVU0ggfCBURVJNSU9TX1dBSVQgfCBURVJNSU9TX09MRCk7Ci0JCWNhc2UgVENTRVRTVzoKLQkJCXJldHVybiBzZXRfdGVybWlvcyhyZWFsX3R0eSwgcCwgVEVSTUlPU19XQUlUIHwgVEVSTUlPU19PTEQpOwotCQljYXNlIFRDU0VUUzoKLQkJCXJldHVybiBzZXRfdGVybWlvcyhyZWFsX3R0eSwgcCwgVEVSTUlPU19PTEQpOworCWNhc2UgVENTRVRTRjoKKwkJcmV0dXJuIHNldF90ZXJtaW9zKHJlYWxfdHR5LCBwLCAgVEVSTUlPU19GTFVTSCB8IFRFUk1JT1NfV0FJVCB8IFRFUk1JT1NfT0xEKTsKKwljYXNlIFRDU0VUU1c6CisJCXJldHVybiBzZXRfdGVybWlvcyhyZWFsX3R0eSwgcCwgVEVSTUlPU19XQUlUIHwgVEVSTUlPU19PTEQpOworCWNhc2UgVENTRVRTOgorCQlyZXR1cm4gc2V0X3Rlcm1pb3MocmVhbF90dHksIHAsIFRFUk1JT1NfT0xEKTsKICNpZm5kZWYgVENHRVRTMgotCQljYXNlIFRDR0VUUzoKLQkJCWlmIChrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3MoKHN0cnVjdCB0ZXJtaW9zIF9fdXNlciAqKWFyZywgcmVhbF90dHktPnRlcm1pb3MpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcmV0dXJuIDA7CisJY2FzZSBUQ0dFVFM6CisJCWlmIChrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3MoKHN0cnVjdCB0ZXJtaW9zIF9fdXNlciAqKWFyZywgcmVhbF90dHktPnRlcm1pb3MpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOwogI2Vsc2UKLQkJY2FzZSBUQ0dFVFM6Ci0JCQlpZiAoa2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zXzEoKHN0cnVjdCB0ZXJtaW9zIF9fdXNlciAqKWFyZywgcmVhbF90dHktPnRlcm1pb3MpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgVENHRVRTMjoKLQkJCWlmIChrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3MoKHN0cnVjdCB0ZXJtaW9zMiBfX3VzZXIgKilhcmcsIHJlYWxfdHR5LT50ZXJtaW9zKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXJldHVybiAwOwotCQljYXNlIFRDU0VUU0YyOgotCQkJcmV0dXJuIHNldF90ZXJtaW9zKHJlYWxfdHR5LCBwLCAgVEVSTUlPU19GTFVTSCB8IFRFUk1JT1NfV0FJVCk7Ci0JCWNhc2UgVENTRVRTVzI6Ci0JCQlyZXR1cm4gc2V0X3Rlcm1pb3MocmVhbF90dHksIHAsIFRFUk1JT1NfV0FJVCk7Ci0JCWNhc2UgVENTRVRTMjoKLQkJCXJldHVybiBzZXRfdGVybWlvcyhyZWFsX3R0eSwgcCwgMCk7CisJY2FzZSBUQ0dFVFM6CisJCWlmIChrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3NfMSgoc3RydWN0IHRlcm1pb3MgX191c2VyICopYXJnLCByZWFsX3R0eS0+dGVybWlvcykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJY2FzZSBUQ0dFVFMyOgorCQlpZiAoa2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKChzdHJ1Y3QgdGVybWlvczIgX191c2VyICopYXJnLCByZWFsX3R0eS0+dGVybWlvcykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJY2FzZSBUQ1NFVFNGMjoKKwkJcmV0dXJuIHNldF90ZXJtaW9zKHJlYWxfdHR5LCBwLCAgVEVSTUlPU19GTFVTSCB8IFRFUk1JT1NfV0FJVCk7CisJY2FzZSBUQ1NFVFNXMjoKKwkJcmV0dXJuIHNldF90ZXJtaW9zKHJlYWxfdHR5LCBwLCBURVJNSU9TX1dBSVQpOworCWNhc2UgVENTRVRTMjoKKwkJcmV0dXJuIHNldF90ZXJtaW9zKHJlYWxfdHR5LCBwLCAwKTsKICNlbmRpZgotCQljYXNlIFRDR0VUQToKLQkJCXJldHVybiBnZXRfdGVybWlvKHJlYWxfdHR5LCBwKTsKLQkJY2FzZSBUQ1NFVEFGOgotCQkJcmV0dXJuIHNldF90ZXJtaW9zKHJlYWxfdHR5LCBwLCBURVJNSU9TX0ZMVVNIIHwgVEVSTUlPU19XQUlUIHwgVEVSTUlPU19URVJNSU8pOwotCQljYXNlIFRDU0VUQVc6Ci0JCQlyZXR1cm4gc2V0X3Rlcm1pb3MocmVhbF90dHksIHAsIFRFUk1JT1NfV0FJVCB8IFRFUk1JT1NfVEVSTUlPKTsKLQkJY2FzZSBUQ1NFVEE6Ci0JCQlyZXR1cm4gc2V0X3Rlcm1pb3MocmVhbF90dHksIHAsIFRFUk1JT1NfVEVSTUlPKTsKKwljYXNlIFRDR0VUQToKKwkJcmV0dXJuIGdldF90ZXJtaW8ocmVhbF90dHksIHApOworCWNhc2UgVENTRVRBRjoKKwkJcmV0dXJuIHNldF90ZXJtaW9zKHJlYWxfdHR5LCBwLCBURVJNSU9TX0ZMVVNIIHwgVEVSTUlPU19XQUlUIHwgVEVSTUlPU19URVJNSU8pOworCWNhc2UgVENTRVRBVzoKKwkJcmV0dXJuIHNldF90ZXJtaW9zKHJlYWxfdHR5LCBwLCBURVJNSU9TX1dBSVQgfCBURVJNSU9TX1RFUk1JTyk7CisJY2FzZSBUQ1NFVEE6CisJCXJldHVybiBzZXRfdGVybWlvcyhyZWFsX3R0eSwgcCwgVEVSTUlPU19URVJNSU8pOwogI2lmbmRlZiBUQ0dFVFMyCi0JCWNhc2UgVElPQ0dMQ0tUUk1JT1M6Ci0JCQlpZiAoa2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKChzdHJ1Y3QgdGVybWlvcyBfX3VzZXIgKilhcmcsIHJlYWxfdHR5LT50ZXJtaW9zX2xvY2tlZCkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlyZXR1cm4gMDsKLQotCQljYXNlIFRJT0NTTENLVFJNSU9TOgotCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQotCQkJCXJldHVybiAtRVBFUk07Ci0JCQlpZiAodXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKHJlYWxfdHR5LT50ZXJtaW9zX2xvY2tlZCwgKHN0cnVjdCB0ZXJtaW9zIF9fdXNlciAqKSBhcmcpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcmV0dXJuIDA7CisJY2FzZSBUSU9DR0xDS1RSTUlPUzoKKwkJaWYgKGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcygoc3RydWN0IHRlcm1pb3MgX191c2VyICopYXJnLCByZWFsX3R0eS0+dGVybWlvc19sb2NrZWQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCWNhc2UgVElPQ1NMQ0tUUk1JT1M6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmICh1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3MocmVhbF90dHktPnRlcm1pb3NfbG9ja2VkLAorCQkJCQkgICAgICAgKHN0cnVjdCB0ZXJtaW9zIF9fdXNlciAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOwogI2Vsc2UKLQkJY2FzZSBUSU9DR0xDS1RSTUlPUzoKLQkJCWlmIChrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3NfMSgoc3RydWN0IHRlcm1pb3MgX191c2VyICopYXJnLCByZWFsX3R0eS0+dGVybWlvc19sb2NrZWQpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcmV0dXJuIDA7Ci0KLQkJY2FzZSBUSU9DU0xDS1RSTUlPUzoKLQkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJCQlyZXR1cm4gLUVQRVJNOwotCQkJaWYgKHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvc18xKHJlYWxfdHR5LT50ZXJtaW9zX2xvY2tlZCwgKHN0cnVjdCB0ZXJtaW9zIF9fdXNlciAqKSBhcmcpKQotCQkJCXJldHVybiAtRUZBVUxUOworCWNhc2UgVElPQ0dMQ0tUUk1JT1M6CisJCWlmIChrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3NfMSgoc3RydWN0IHRlcm1pb3MgX191c2VyICopYXJnLCByZWFsX3R0eS0+dGVybWlvc19sb2NrZWQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCWNhc2UgVElPQ1NMQ0tUUk1JT1M6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmICh1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3NfMShyZWFsX3R0eS0+dGVybWlvc19sb2NrZWQsCisJCQkJCSAgICAgICAoc3RydWN0IHRlcm1pb3MgX191c2VyICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCXJldHVybiAwOwogI2VuZGlmCi0JCWNhc2UgVElPQ0dTT0ZUQ0FSOgotCQkJcmV0dXJuIHB1dF91c2VyKENfQ0xPQ0FMKHR0eSkgPyAxIDogMCwgKGludCBfX3VzZXIgKilhcmcpOwotCQljYXNlIFRJT0NTU09GVENBUjoKLQkJCWlmIChnZXRfdXNlcihhcmcsICh1bnNpZ25lZCBpbnQgX191c2VyICopIGFyZykpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQltdXRleF9sb2NrKCZ0dHktPnRlcm1pb3NfbXV0ZXgpOwotCQkJdHR5LT50ZXJtaW9zLT5jX2NmbGFnID0KLQkJCQkoKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIH5DTE9DQUwpIHwKLQkJCQkgKGFyZyA/IENMT0NBTCA6IDApKTsKLQkJCW11dGV4X3VubG9jaygmdHR5LT50ZXJtaW9zX211dGV4KTsKLQkJCXJldHVybiAwOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwljYXNlIFRJT0NHU09GVENBUjoKKwkJcmV0dXJuIHB1dF91c2VyKENfQ0xPQ0FMKHR0eSkgPyAxIDogMCwKKwkJCQkJCShpbnQgX191c2VyICopYXJnKTsKKwljYXNlIFRJT0NTU09GVENBUjoKKwkJaWYgKGdldF91c2VyKGFyZywgKHVuc2lnbmVkIGludCBfX3VzZXIgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQltdXRleF9sb2NrKCZ0dHktPnRlcm1pb3NfbXV0ZXgpOworCQl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPQorCQkJKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiB+Q0xPQ0FMKSB8CisJCQkgKGFyZyA/IENMT0NBTCA6IDApKTsKKwkJbXV0ZXhfdW5sb2NrKCZ0dHktPnRlcm1pb3NfbXV0ZXgpOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogCX0KIH0KLQogRVhQT1JUX1NZTUJPTF9HUEwodHR5X21vZGVfaW9jdGwpOwogCiBpbnQgdHR5X3BlcmZvcm1fZmx1c2goc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgbG9uZyBhcmcpCkBAIC04OTksMTMgKzg5OSwxMiBAQAogCXR0eV9sZGlzY19kZXJlZihsZCk7CiAJcmV0dXJuIDA7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKHR0eV9wZXJmb3JtX2ZsdXNoKTsKIAotaW50IG5fdHR5X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCitpbnQgbl90dHlfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqIHJlYWxfdHR5OworCXN0cnVjdCB0dHlfc3RydWN0ICpyZWFsX3R0eTsKIAlpbnQgcmV0dmFsOwogCiAJaWYgKHR0eS0+ZHJpdmVyLT50eXBlID09IFRUWV9EUklWRVJfVFlQRV9QVFkgJiYKQEAgLTkxNSw2OCArOTE0LDY3IEBACiAJCXJlYWxfdHR5ID0gdHR5OwogCiAJc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBUQ1hPTkM6Ci0JCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7Ci0JCQlpZiAocmV0dmFsKQotCQkJCXJldHVybiByZXR2YWw7Ci0JCQlzd2l0Y2ggKGFyZykgewotCQkJY2FzZSBUQ09PRkY6Ci0JCQkJaWYgKCF0dHktPmZsb3dfc3RvcHBlZCkgewotCQkJCQl0dHktPmZsb3dfc3RvcHBlZCA9IDE7Ci0JCQkJCXN0b3BfdHR5KHR0eSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBUQ09PTjoKLQkJCQlpZiAodHR5LT5mbG93X3N0b3BwZWQpIHsKLQkJCQkJdHR5LT5mbG93X3N0b3BwZWQgPSAwOwotCQkJCQlzdGFydF90dHkodHR5KTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRDSU9GRjoKLQkJCQlpZiAoU1RPUF9DSEFSKHR0eSkgIT0gX19ESVNBQkxFRF9DSEFSKQotCQkJCQlyZXR1cm4gc2VuZF9wcmlvX2NoYXIodHR5LCBTVE9QX0NIQVIodHR5KSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRDSU9OOgotCQkJCWlmIChTVEFSVF9DSEFSKHR0eSkgIT0gX19ESVNBQkxFRF9DSEFSKQotCQkJCQlyZXR1cm4gc2VuZF9wcmlvX2NoYXIodHR5LCBTVEFSVF9DSEFSKHR0eSkpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIFRDWE9OQzoKKwkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJc3dpdGNoIChhcmcpIHsKKwkJY2FzZSBUQ09PRkY6CisJCQlpZiAoIXR0eS0+Zmxvd19zdG9wcGVkKSB7CisJCQkJdHR5LT5mbG93X3N0b3BwZWQgPSAxOworCQkJCXN0b3BfdHR5KHR0eSk7CiAJCQl9Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSBUQ0ZMU0g6Ci0JCQlyZXR1cm4gdHR5X3BlcmZvcm1fZmx1c2godHR5LCBhcmcpOwotCQljYXNlIFRJT0NPVVRROgotCQkJcmV0dXJuIHB1dF91c2VyKHR0eS0+ZHJpdmVyLT5jaGFyc19pbl9idWZmZXIgPwotCQkJCQl0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKHR0eSkgOiAwLAotCQkJCQkoaW50IF9fdXNlciAqKSBhcmcpOwotCQljYXNlIFRJT0NJTlE6Ci0JCQlyZXR2YWwgPSB0dHktPnJlYWRfY250OwotCQkJaWYgKExfSUNBTk9OKHR0eSkpCi0JCQkJcmV0dmFsID0gaW5xX2Nhbm9uKHR0eSk7Ci0JCQlyZXR1cm4gcHV0X3VzZXIocmV0dmFsLCAodW5zaWduZWQgaW50IF9fdXNlciAqKSBhcmcpOwotCQljYXNlIFRJT0NQS1Q6Ci0JCXsKLQkJCWludCBwa3Rtb2RlOwotCi0JCQlpZiAodHR5LT5kcml2ZXItPnR5cGUgIT0gVFRZX0RSSVZFUl9UWVBFX1BUWSB8fAotCQkJICAgIHR0eS0+ZHJpdmVyLT5zdWJ0eXBlICE9IFBUWV9UWVBFX01BU1RFUikKLQkJCQlyZXR1cm4gLUVOT1RUWTsKLQkJCWlmIChnZXRfdXNlcihwa3Rtb2RlLCAoaW50IF9fdXNlciAqKSBhcmcpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJaWYgKHBrdG1vZGUpIHsKLQkJCQlpZiAoIXR0eS0+cGFja2V0KSB7Ci0JCQkJCXR0eS0+cGFja2V0ID0gMTsKLQkJCQkJdHR5LT5saW5rLT5jdHJsX3N0YXR1cyA9IDA7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJdHR5LT5wYWNrZXQgPSAwOwotCQkJcmV0dXJuIDA7Ci0JCX0KKwkJCWJyZWFrOworCQljYXNlIFRDT09OOgorCQkJaWYgKHR0eS0+Zmxvd19zdG9wcGVkKSB7CisJCQkJdHR5LT5mbG93X3N0b3BwZWQgPSAwOworCQkJCXN0YXJ0X3R0eSh0dHkpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVENJT0ZGOgorCQkJaWYgKFNUT1BfQ0hBUih0dHkpICE9IF9fRElTQUJMRURfQ0hBUikKKwkJCQlyZXR1cm4gc2VuZF9wcmlvX2NoYXIodHR5LCBTVE9QX0NIQVIodHR5KSk7CisJCQlicmVhazsKKwkJY2FzZSBUQ0lPTjoKKwkJCWlmIChTVEFSVF9DSEFSKHR0eSkgIT0gX19ESVNBQkxFRF9DSEFSKQorCQkJCXJldHVybiBzZW5kX3ByaW9fY2hhcih0dHksIFNUQVJUX0NIQVIodHR5KSk7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCS8qIFRyeSB0aGUgbW9kZSBjb21tYW5kcyAqLwotCQkJcmV0dXJuIHR0eV9tb2RlX2lvY3RsKHR0eSwgZmlsZSwgY21kLCBhcmcpOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLX0KKwkJcmV0dXJuIDA7CisJY2FzZSBUQ0ZMU0g6CisJCXJldHVybiB0dHlfcGVyZm9ybV9mbHVzaCh0dHksIGFyZyk7CisJY2FzZSBUSU9DT1VUUToKKwkJcmV0dXJuIHB1dF91c2VyKHR0eS0+ZHJpdmVyLT5jaGFyc19pbl9idWZmZXIgPworCQkJCXR0eS0+ZHJpdmVyLT5jaGFyc19pbl9idWZmZXIodHR5KSA6IDAsCisJCQkJKGludCBfX3VzZXIgKikgYXJnKTsKKwljYXNlIFRJT0NJTlE6CisJCXJldHZhbCA9IHR0eS0+cmVhZF9jbnQ7CisJCWlmIChMX0lDQU5PTih0dHkpKQorCQkJcmV0dmFsID0gaW5xX2Nhbm9uKHR0eSk7CisJCXJldHVybiBwdXRfdXNlcihyZXR2YWwsICh1bnNpZ25lZCBpbnQgX191c2VyICopIGFyZyk7CisJY2FzZSBUSU9DUEtUOgorCXsKKwkJaW50IHBrdG1vZGU7CiAKKwkJaWYgKHR0eS0+ZHJpdmVyLT50eXBlICE9IFRUWV9EUklWRVJfVFlQRV9QVFkgfHwKKwkJICAgIHR0eS0+ZHJpdmVyLT5zdWJ0eXBlICE9IFBUWV9UWVBFX01BU1RFUikKKwkJCXJldHVybiAtRU5PVFRZOworCQlpZiAoZ2V0X3VzZXIocGt0bW9kZSwgKGludCBfX3VzZXIgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAocGt0bW9kZSkgeworCQkJaWYgKCF0dHktPnBhY2tldCkgeworCQkJCXR0eS0+cGFja2V0ID0gMTsKKwkJCQl0dHktPmxpbmstPmN0cmxfc3RhdHVzID0gMDsKKwkJCX0KKwkJfSBlbHNlCisJCQl0dHktPnBhY2tldCA9IDA7CisJCXJldHVybiAwOworCX0KKwlkZWZhdWx0OgorCQkvKiBUcnkgdGhlIG1vZGUgY29tbWFuZHMgKi8KKwkJcmV0dXJuIHR0eV9tb2RlX2lvY3RsKHR0eSwgZmlsZSwgY21kLCBhcmcpOworCX0KK30KIEVYUE9SVF9TWU1CT0wobl90dHlfaW9jdGwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3hpbGlueF9od2ljYXAvTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIveGlsaW54X2h3aWNhcC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDkxY2JjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3hpbGlueF9od2ljYXAvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgWGlsaW54IE9QQiBod2ljYXAgZHJpdmVyCisjCisKK29iai0kKENPTkZJR19YSUxJTlhfSFdJQ0FQKSArPSB4aWxpbnhfaHdpY2FwX20ubyAKKyAKK3hpbGlueF9od2ljYXBfbS15IDo9IHhpbGlueF9od2ljYXAubyBmaWZvX2ljYXAubyBidWZmZXJfaWNhcC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIveGlsaW54X2h3aWNhcC9idWZmZXJfaWNhcC5jIGIvZHJpdmVycy9jaGFyL3hpbGlueF9od2ljYXAvYnVmZmVyX2ljYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmVhMmJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3hpbGlueF9od2ljYXAvYnVmZmVyX2ljYXAuYwpAQCAtMCwwICsxLDM4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIEF1dGhvcjogWGlsaW54LCBJbmMuCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFhJTElOWCBJUyBQUk9WSURJTkcgVEhJUyBERVNJR04sIENPREUsIE9SIElORk9STUFUSU9OICJBUyBJUyIKKyAqICAgICBBUyBBIENPVVJURVNZIFRPIFlPVSwgU09MRUxZIEZPUiBVU0UgSU4gREVWRUxPUElORyBQUk9HUkFNUyBBTkQKKyAqICAgICBTT0xVVElPTlMgRk9SIFhJTElOWCBERVZJQ0VTLiAgQlkgUFJPVklESU5HIFRISVMgREVTSUdOLCBDT0RFLAorICogICAgIE9SIElORk9STUFUSU9OIEFTIE9ORSBQT1NTSUJMRSBJTVBMRU1FTlRBVElPTiBPRiBUSElTIEZFQVRVUkUsCisgKiAgICAgQVBQTElDQVRJT04gT1IgU1RBTkRBUkQsIFhJTElOWCBJUyBNQUtJTkcgTk8gUkVQUkVTRU5UQVRJT04KKyAqICAgICBUSEFUIFRISVMgSU1QTEVNRU5UQVRJT04gSVMgRlJFRSBGUk9NIEFOWSBDTEFJTVMgT0YgSU5GUklOR0VNRU5ULAorICogICAgIEFORCBZT1UgQVJFIFJFU1BPTlNJQkxFIEZPUiBPQlRBSU5JTkcgQU5ZIFJJR0hUUyBZT1UgTUFZIFJFUVVJUkUKKyAqICAgICBGT1IgWU9VUiBJTVBMRU1FTlRBVElPTi4gIFhJTElOWCBFWFBSRVNTTFkgRElTQ0xBSU1TIEFOWQorICogICAgIFdBUlJBTlRZIFdIQVRTT0VWRVIgV0lUSCBSRVNQRUNUIFRPIFRIRSBBREVRVUFDWSBPRiBUSEUKKyAqICAgICBJTVBMRU1FTlRBVElPTiwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBBTlkgV0FSUkFOVElFUyBPUgorICogICAgIFJFUFJFU0VOVEFUSU9OUyBUSEFUIFRISVMgSU1QTEVNRU5UQVRJT04gSVMgRlJFRSBGUk9NIENMQUlNUyBPRgorICogICAgIElORlJJTkdFTUVOVCwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiAgICAgWGlsaW54IHByb2R1Y3RzIGFyZSBub3QgaW50ZW5kZWQgZm9yIHVzZSBpbiBsaWZlIHN1cHBvcnQgYXBwbGlhbmNlcywKKyAqICAgICBkZXZpY2VzLCBvciBzeXN0ZW1zLiBVc2UgaW4gc3VjaCBhcHBsaWNhdGlvbnMgaXMgZXhwcmVzc2x5IHByb2hpYml0ZWQuCisgKgorICogICAgIChjKSBDb3B5cmlnaHQgMjAwMy0yMDA4IFhpbGlueCBJbmMuCisgKiAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICAgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogICAgIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImJ1ZmZlcl9pY2FwLmgiCisKKy8qIEluZGljYXRlcyBob3cgbWFueSBieXRlcyB3aWxsIGZpdCBpbiBhIGJ1ZmZlci4gKDEgQlJBTSkgKi8KKyNkZWZpbmUgWEhJX01BWF9CVUZGRVJfQllURVMgICAgICAgIDIwNDgKKyNkZWZpbmUgWEhJX01BWF9CVUZGRVJfSU5UUyAgICAgICAgIChYSElfTUFYX0JVRkZFUl9CWVRFUyA+PiAyKQorCisvKiBGaWxlIGFjY2VzcyBhbmQgZXJyb3IgY29uc3RhbnRzICovCisjZGVmaW5lIFhISV9ERVZJQ0VfUkVBRF9FUlJPUiAgICAgICAtMQorI2RlZmluZSBYSElfREVWSUNFX1dSSVRFX0VSUk9SICAgICAgLTIKKyNkZWZpbmUgWEhJX0JVRkZFUl9PVkVSRkxPV19FUlJPUiAgIC0zCisKKyNkZWZpbmUgWEhJX0RFVklDRV9SRUFEICAgICAgICAgICAgIDB4MQorI2RlZmluZSBYSElfREVWSUNFX1dSSVRFICAgICAgICAgICAgMHgwCisKKy8qIENvbnN0YW50cyBmb3IgY2hlY2tpbmcgdHJhbnNmZXIgc3RhdHVzICovCisjZGVmaW5lIFhISV9DWUNMRV9ET05FICAgICAgICAgICAgICAwCisjZGVmaW5lIFhISV9DWUNMRV9FWEVDVVRJTkcgICAgICAgICAxCisKKy8qIGJ1ZmZlcl9pY2FwIHJlZ2lzdGVyIG9mZnNldHMgKi8KKworLyogU2l6ZSBvZiB0cmFuc2ZlciwgcmVhZCAmIHdyaXRlICovCisjZGVmaW5lIFhISV9TSVpFX1JFR19PRkZTRVQgICAgICAgIDB4ODAwTAorLyogb2Zmc2V0IGludG8gYnJhbSwgcmVhZCAmIHdyaXRlICovCisjZGVmaW5lIFhISV9CUkFNX09GRlNFVF9SRUdfT0ZGU0VUIDB4ODA0TAorLyogUmVhZCBub3QgQ29uZmlndXJlLCBkaXJlY3Rpb24gb2YgdHJhbnNmZXIuICBXcml0ZSBvbmx5ICovCisjZGVmaW5lIFhISV9STkNfUkVHX09GRlNFVCAgICAgICAgIDB4ODA4TAorLyogSW5kaWNhdGVzIHRyYW5zZmVyIGNvbXBsZXRlLiBSZWFkIG9ubHkgKi8KKyNkZWZpbmUgWEhJX1NUQVRVU19SRUdfT0ZGU0VUICAgICAgMHg4MENMCisKKy8qIENvbnN0YW50cyBmb3Igc2V0dGluZyB0aGUgUk5DIHJlZ2lzdGVyICovCisjZGVmaW5lIFhISV9DT05GSUdVUkUgICAgICAgICAgICAgIDB4MFVMCisjZGVmaW5lIFhISV9SRUFEQkFDSyAgICAgICAgICAgICAgIDB4MVVMCisKKy8qIENvbnN0YW50cyBmb3IgdGhlIERvbmUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgWEhJX05PVF9GSU5JU0hFRCAgICAgICAgICAgMHgwVUwKKyNkZWZpbmUgWEhJX0ZJTklTSEVEICAgICAgICAgICAgICAgMHgxVUwKKworI2RlZmluZSBYSElfQlVGRkVSX1NUQVJUIDAKKworLyoqCisgKiBidWZmZXJfaWNhcF9nZXRfc3RhdHVzOiBHZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdGF0dXMgcmVnaXN0ZXIuCisgKiBAcGFyYW1ldGVyIGJhc2VfYWRkcmVzczogaXMgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlCisgKgorICogVGhlIHN0YXR1cyByZWdpc3RlciBjb250YWlucyB0aGUgSUNBUCBzdGF0dXMgYW5kIHRoZSBkb25lIGJpdC4KKyAqCisgKiBEOCAtIGNmZ2VycgorICogRDcgLSBkYWxpZ24KKyAqIEQ2IC0gcmlwCisgKiBENSAtIGluX2Fib3J0X2wKKyAqIEQ0IC0gQWx3YXlzIDEKKyAqIEQzIC0gQWx3YXlzIDEKKyAqIEQyIC0gQWx3YXlzIDEKKyAqIEQxIC0gQWx3YXlzIDEKKyAqIEQwIC0gRG9uZSBiaXQKKyAqKi8KK3N0YXRpYyBpbmxpbmUgdTMyIGJ1ZmZlcl9pY2FwX2dldF9zdGF0dXModm9pZCBfX2lvbWVtICpiYXNlX2FkZHJlc3MpCit7CisJcmV0dXJuIGluX2JlMzIoYmFzZV9hZGRyZXNzICsgWEhJX1NUQVRVU19SRUdfT0ZGU0VUKTsKK30KKworLyoqCisgKiBidWZmZXJfaWNhcF9nZXRfYnJhbTogUmVhZHMgZGF0YSBmcm9tIHRoZSBzdG9yYWdlIGJ1ZmZlciBicmFtLgorICogQHBhcmFtZXRlciBiYXNlX2FkZHJlc3M6IGNvbnRhaW5zIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNvbXBvbmVudC4KKyAqIEBwYXJhbWV0ZXIgb2Zmc2V0OiBUaGUgd29yZCBvZmZzZXQgZnJvbSB3aGljaCB0aGUgZGF0YSBzaG91bGQgYmUgcmVhZC4KKyAqCisgKiBBIGJyYW0gaXMgdXNlZCBhcyBhIGNvbmZpZ3VyYXRpb24gbWVtb3J5IGNhY2hlLiAgT25lIGZyYW1lIG9mIGRhdGEgY2FuCisgKiBiZSBzdG9yZWQgaW4gdGhpcyAic3RvcmFnZSBidWZmZXIiLgorICoqLworc3RhdGljIGlubGluZSB1MzIgYnVmZmVyX2ljYXBfZ2V0X2JyYW0odm9pZCBfX2lvbWVtICpiYXNlX2FkZHJlc3MsCisJCXUzMiBvZmZzZXQpCit7CisJcmV0dXJuIGluX2JlMzIoYmFzZV9hZGRyZXNzICsgKG9mZnNldCA8PCAyKSk7Cit9CisKKy8qKgorICogYnVmZmVyX2ljYXBfYnVzeTogUmV0dXJuIHRydWUgaWYgdGhlIGljYXAgZGV2aWNlIGlzIGJ1c3kKKyAqIEBwYXJhbWV0ZXIgYmFzZV9hZGRyZXNzOiBpcyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UKKyAqCisgKiBUaGUgcXVlcmllcyB0aGUgbG93IG9yZGVyIGJpdCBvZiB0aGUgc3RhdHVzIHJlZ2lzdGVyLCB3aGljaAorICogaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvciByZWFkYmFjayBvcGVyYXRpb24KKyAqIGhhcyBjb21wbGV0ZWQuCisgKiovCitzdGF0aWMgaW5saW5lIGJvb2wgYnVmZmVyX2ljYXBfYnVzeSh2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcykKK3sKKwlyZXR1cm4gKGJ1ZmZlcl9pY2FwX2dldF9zdGF0dXMoYmFzZV9hZGRyZXNzKSAmIDEpID09IFhISV9OT1RfRklOSVNIRUQ7Cit9CisKKy8qKgorICogYnVmZmVyX2ljYXBfYnVzeTogUmV0dXJuIHRydWUgaWYgdGhlIGljYXAgZGV2aWNlIGlzIG5vdCBidXN5CisgKiBAcGFyYW1ldGVyIGJhc2VfYWRkcmVzczogaXMgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgZGV2aWNlCisgKgorICogVGhlIHF1ZXJpZXMgdGhlIGxvdyBvcmRlciBiaXQgb2YgdGhlIHN0YXR1cyByZWdpc3Rlciwgd2hpY2gKKyAqIGluZGljYXRlcyB3aGV0aGVyIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gb3IgcmVhZGJhY2sgb3BlcmF0aW9uCisgKiBoYXMgY29tcGxldGVkLgorICoqLworc3RhdGljIGlubGluZSBib29sIGJ1ZmZlcl9pY2FwX2RvbmUodm9pZCBfX2lvbWVtICpiYXNlX2FkZHJlc3MpCit7CisJcmV0dXJuIChidWZmZXJfaWNhcF9nZXRfc3RhdHVzKGJhc2VfYWRkcmVzcykgJiAxKSA9PSBYSElfRklOSVNIRUQ7Cit9CisKKy8qKgorICogYnVmZmVyX2ljYXBfc2V0X3NpemU6IFNldCB0aGUgc2l6ZSByZWdpc3Rlci4KKyAqIEBwYXJhbWV0ZXIgYmFzZV9hZGRyZXNzOiBpcyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UKKyAqIEBwYXJhbWV0ZXIgZGF0YTogVGhlIHNpemUgaW4gYnl0ZXMuCisgKgorICogVGhlIHNpemUgcmVnaXN0ZXIgaG9sZHMgdGhlIG51bWJlciBvZiA4IGJpdCBieXRlcyB0byB0cmFuc2ZlciBiZXR3ZWVuCisgKiBicmFtIGFuZCB0aGUgaWNhcCAob3IgaWNhcCB0byBicmFtKS4KKyAqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBidWZmZXJfaWNhcF9zZXRfc2l6ZSh2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcywKKwkJdTMyIGRhdGEpCit7CisJb3V0X2JlMzIoYmFzZV9hZGRyZXNzICsgWEhJX1NJWkVfUkVHX09GRlNFVCwgZGF0YSk7Cit9CisKKy8qKgorICogYnVmZmVyX2ljYXBfbVNldG9mZnNldFJlZzogU2V0IHRoZSBicmFtIG9mZnNldCByZWdpc3Rlci4KKyAqIEBwYXJhbWV0ZXIgYmFzZV9hZGRyZXNzOiBjb250YWlucyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UuCisgKiBAcGFyYW1ldGVyIGRhdGE6IGlzIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIHRoZSBkYXRhIHJlZ2lzdGVyLgorICoKKyAqIFRoZSBicmFtIG9mZnNldCByZWdpc3RlciBob2xkcyB0aGUgc3RhcnRpbmcgYnJhbSBhZGRyZXNzIHRvIHRyYW5zZmVyCisgKiBkYXRhIGZyb20gZHVyaW5nIGNvbmZpZ3VyYXRpb24gb3Igd3JpdGUgZGF0YSB0byBkdXJpbmcgcmVhZGJhY2suCisgKiovCitzdGF0aWMgaW5saW5lIHZvaWQgYnVmZmVyX2ljYXBfc2V0X29mZnNldCh2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcywKKwkJdTMyIGRhdGEpCit7CisJb3V0X2JlMzIoYmFzZV9hZGRyZXNzICsgWEhJX0JSQU1fT0ZGU0VUX1JFR19PRkZTRVQsIGRhdGEpOworfQorCisvKioKKyAqIGJ1ZmZlcl9pY2FwX3NldF9ybmM6IFNldCB0aGUgUk5DIChSZWFkYmFjayBub3QgQ29uZmlndXJlKSByZWdpc3Rlci4KKyAqIEBwYXJhbWV0ZXIgYmFzZV9hZGRyZXNzOiBjb250YWlucyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UuCisgKiBAcGFyYW1ldGVyIGRhdGE6IGlzIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIHRoZSBkYXRhIHJlZ2lzdGVyLgorICoKKyAqIFRoZSBSTkMgcmVnaXN0ZXIgZGV0ZXJtaW5lcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBkYXRhIHRyYW5zZmVyLiAgSXQKKyAqIGNvbnRyb2xzIHdoZXRoZXIgYSBjb25maWd1cmF0aW9uIG9yIHJlYWRiYWNrIHRha2UgcGxhY2UuICBXcml0aW5nIHRvCisgKiB0aGlzIHJlZ2lzdGVyIGluaXRpYXRlcyB0aGUgdHJhbnNmZXIuICBBIHZhbHVlIG9mIDEgaW5pdGlhdGVzIGEKKyAqIHJlYWRiYWNrIHdoaWxlIHdyaXRpbmcgYSB2YWx1ZSBvZiAwIGluaXRpYXRlcyBhIGNvbmZpZ3VyYXRpb24uCisgKiovCitzdGF0aWMgaW5saW5lIHZvaWQgYnVmZmVyX2ljYXBfc2V0X3JuYyh2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcywKKwkJdTMyIGRhdGEpCit7CisJb3V0X2JlMzIoYmFzZV9hZGRyZXNzICsgWEhJX1JOQ19SRUdfT0ZGU0VULCBkYXRhKTsKK30KKworLyoqCisgKiBidWZmZXJfaWNhcF9zZXRfYnJhbTogV3JpdGUgZGF0YSB0byB0aGUgc3RvcmFnZSBidWZmZXIgYnJhbS4KKyAqIEBwYXJhbWV0ZXIgYmFzZV9hZGRyZXNzOiBjb250YWlucyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBjb21wb25lbnQuCisgKiBAcGFyYW1ldGVyIG9mZnNldDogVGhlIHdvcmQgb2Zmc2V0IGF0IHdoaWNoIHRoZSBkYXRhIHNob3VsZCBiZSB3cml0dGVuLgorICogQHBhcmFtZXRlciBkYXRhOiBUaGUgdmFsdWUgdG8gYmUgd3JpdHRlbiB0byB0aGUgYnJhbSBvZmZzZXQuCisgKgorICogQSBicmFtIGlzIHVzZWQgYXMgYSBjb25maWd1cmF0aW9uIG1lbW9yeSBjYWNoZS4gIE9uZSBmcmFtZSBvZiBkYXRhIGNhbgorICogYmUgc3RvcmVkIGluIHRoaXMgInN0b3JhZ2UgYnVmZmVyIi4KKyAqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBidWZmZXJfaWNhcF9zZXRfYnJhbSh2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcywKKwkJdTMyIG9mZnNldCwgdTMyIGRhdGEpCit7CisJb3V0X2JlMzIoYmFzZV9hZGRyZXNzICsgKG9mZnNldCA8PCAyKSwgZGF0YSk7Cit9CisKKy8qKgorICogYnVmZmVyX2ljYXBfZGV2aWNlX3JlYWQ6IFRyYW5zZmVyIGJ5dGVzIGZyb20gSUNBUCB0byB0aGUgc3RvcmFnZSBidWZmZXIuCisgKiBAcGFyYW1ldGVyIGRydmRhdGE6IGEgcG9pbnRlciB0byB0aGUgZHJ2ZGF0YS4KKyAqIEBwYXJhbWV0ZXIgb2Zmc2V0OiBUaGUgc3RvcmFnZSBidWZmZXIgc3RhcnQgYWRkcmVzcy4KKyAqIEBwYXJhbWV0ZXIgY291bnQ6IFRoZSBudW1iZXIgb2Ygd29yZHMgKDMyIGJpdCkgdG8gcmVhZCBmcm9tIHRoZQorICogICAgICAgICAgIGRldmljZSAoSUNBUCkuCisgKiovCitzdGF0aWMgaW50IGJ1ZmZlcl9pY2FwX2RldmljZV9yZWFkKHN0cnVjdCBod2ljYXBfZHJ2ZGF0YSAqZHJ2ZGF0YSwKKwkJdTMyIG9mZnNldCwgdTMyIGNvdW50KQoreworCisJczMyIHJldHJpZXMgPSAwOworCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzID0gZHJ2ZGF0YS0+YmFzZV9hZGRyZXNzOworCisJaWYgKGJ1ZmZlcl9pY2FwX2J1c3koYmFzZV9hZGRyZXNzKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICgob2Zmc2V0ICsgY291bnQpID4gWEhJX01BWF9CVUZGRVJfSU5UUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBzZXRTaXplIGNvdW50KjQgdG8gZ2V0IGJ5dGVzLiAqLworCWJ1ZmZlcl9pY2FwX3NldF9zaXplKGJhc2VfYWRkcmVzcywgKGNvdW50IDw8IDIpKTsKKwlidWZmZXJfaWNhcF9zZXRfb2Zmc2V0KGJhc2VfYWRkcmVzcywgb2Zmc2V0KTsKKwlidWZmZXJfaWNhcF9zZXRfcm5jKGJhc2VfYWRkcmVzcywgWEhJX1JFQURCQUNLKTsKKworCXdoaWxlIChidWZmZXJfaWNhcF9idXN5KGJhc2VfYWRkcmVzcykpIHsKKwkJcmV0cmllcysrOworCQlpZiAocmV0cmllcyA+IFhISV9NQVhfUkVUUklFUykKKwkJCXJldHVybiAtRUJVU1k7CisJfQorCXJldHVybiAwOworCit9OworCisvKioKKyAqIGJ1ZmZlcl9pY2FwX2RldmljZV93cml0ZTogVHJhbnNmZXIgYnl0ZXMgZnJvbSBJQ0FQIHRvIHRoZSBzdG9yYWdlIGJ1ZmZlci4KKyAqIEBwYXJhbWV0ZXIgZHJ2ZGF0YTogYSBwb2ludGVyIHRvIHRoZSBkcnZkYXRhLgorICogQHBhcmFtZXRlciBvZmZzZXQ6IFRoZSBzdG9yYWdlIGJ1ZmZlciBzdGFydCBhZGRyZXNzLgorICogQHBhcmFtZXRlciBjb3VudDogVGhlIG51bWJlciBvZiB3b3JkcyAoMzIgYml0KSB0byByZWFkIGZyb20gdGhlCisgKiAgICAgICAgICAgZGV2aWNlIChJQ0FQKS4KKyAqKi8KK3N0YXRpYyBpbnQgYnVmZmVyX2ljYXBfZGV2aWNlX3dyaXRlKHN0cnVjdCBod2ljYXBfZHJ2ZGF0YSAqZHJ2ZGF0YSwKKwkJdTMyIG9mZnNldCwgdTMyIGNvdW50KQoreworCisJczMyIHJldHJpZXMgPSAwOworCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzID0gZHJ2ZGF0YS0+YmFzZV9hZGRyZXNzOworCisJaWYgKGJ1ZmZlcl9pY2FwX2J1c3koYmFzZV9hZGRyZXNzKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICgob2Zmc2V0ICsgY291bnQpID4gWEhJX01BWF9CVUZGRVJfSU5UUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBzZXRTaXplIGNvdW50KjQgdG8gZ2V0IGJ5dGVzLiAqLworCWJ1ZmZlcl9pY2FwX3NldF9zaXplKGJhc2VfYWRkcmVzcywgY291bnQgPDwgMik7CisJYnVmZmVyX2ljYXBfc2V0X29mZnNldChiYXNlX2FkZHJlc3MsIG9mZnNldCk7CisJYnVmZmVyX2ljYXBfc2V0X3JuYyhiYXNlX2FkZHJlc3MsIFhISV9DT05GSUdVUkUpOworCisJd2hpbGUgKGJ1ZmZlcl9pY2FwX2J1c3koYmFzZV9hZGRyZXNzKSkgeworCQlyZXRyaWVzKys7CisJCWlmIChyZXRyaWVzID4gWEhJX01BWF9SRVRSSUVTKQorCQkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcmV0dXJuIDA7CisKK307CisKKy8qKgorICogYnVmZmVyX2ljYXBfcmVzZXQ6IFJlc2V0IHRoZSBsb2dpYyBvZiB0aGUgaWNhcCBkZXZpY2UuCisgKiBAcGFyYW1ldGVyIGRydmRhdGE6IGEgcG9pbnRlciB0byB0aGUgZHJ2ZGF0YS4KKyAqCisgKiBXcml0aW5nIHRvIHRoZSBzdGF0dXMgcmVnaXN0ZXIgcmVzZXRzIHRoZSBJQ0FQIGxvZ2ljIGluIGFuIGludGVybmFsCisgKiB2ZXJzaW9uIG9mIHRoZSBjb3JlLiAgRm9yIHRoZSB2ZXJzaW9uIG9mIHRoZSBjb3JlIHB1Ymxpc2hlZCBpbiBFREssCisgKiB0aGlzIGlzIGEgbm9vcC4KKyAqKi8KK3ZvaWQgYnVmZmVyX2ljYXBfcmVzZXQoc3RydWN0IGh3aWNhcF9kcnZkYXRhICpkcnZkYXRhKQoreworICAgIG91dF9iZTMyKGRydmRhdGEtPmJhc2VfYWRkcmVzcyArIFhISV9TVEFUVVNfUkVHX09GRlNFVCwgMHhGRUZFKTsKK30KKworLyoqCisgKiBidWZmZXJfaWNhcF9zZXRfY29uZmlndXJhdGlvbjogTG9hZCBhIHBhcnRpYWwgYml0c3RyZWFtIGZyb20gc3lzdGVtIG1lbW9yeS4KKyAqIEBwYXJhbWV0ZXIgZHJ2ZGF0YTogYSBwb2ludGVyIHRvIHRoZSBkcnZkYXRhLgorICogQHBhcmFtZXRlciBkYXRhOiBLZXJuZWwgYWRkcmVzcyBvZiB0aGUgcGFydGlhbCBiaXRzdHJlYW0uCisgKiBAcGFyYW1ldGVyIHNpemU6IHRoZSBzaXplIG9mIHRoZSBwYXJ0aWFsIGJpdHN0cmVhbSBpbiAzMiBiaXQgd29yZHMuCisgKiovCitpbnQgYnVmZmVyX2ljYXBfc2V0X2NvbmZpZ3VyYXRpb24oc3RydWN0IGh3aWNhcF9kcnZkYXRhICpkcnZkYXRhLCB1MzIgKmRhdGEsCisJCQkgICAgIHUzMiBzaXplKQoreworCWludCBzdGF0dXM7CisJczMyIGJ1ZmZlcl9jb3VudCA9IDA7CisJczMyIG51bV93cml0ZXMgPSAwOworCWJvb2wgZGlydHkgPSAwOworCXUzMiBpOworCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyZXNzID0gZHJ2ZGF0YS0+YmFzZV9hZGRyZXNzOworCisJLyogTG9vcCB0aHJvdWdoIGFsbCB0aGUgZGF0YSAqLworCWZvciAoaSA9IDAsIGJ1ZmZlcl9jb3VudCA9IDA7IGkgPCBzaXplOyBpKyspIHsKKworCQkvKiBDb3B5IGRhdGEgdG8gYnJhbSAqLworCQlidWZmZXJfaWNhcF9zZXRfYnJhbShiYXNlX2FkZHJlc3MsIGJ1ZmZlcl9jb3VudCwgZGF0YVtpXSk7CisJCWRpcnR5ID0gMTsKKworCQlpZiAoYnVmZmVyX2NvdW50IDwgWEhJX01BWF9CVUZGRVJfSU5UUyAtIDEpIHsKKwkJCWJ1ZmZlcl9jb3VudCsrOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBXcml0ZSBkYXRhIHRvIElDQVAgKi8KKwkJc3RhdHVzID0gYnVmZmVyX2ljYXBfZGV2aWNlX3dyaXRlKAorCQkJCWRydmRhdGEsCisJCQkJWEhJX0JVRkZFUl9TVEFSVCwKKwkJCQlYSElfTUFYX0JVRkZFUl9JTlRTKTsKKwkJaWYgKHN0YXR1cyAhPSAwKSB7CisJCQkvKiBhYm9ydC4gKi8KKwkJCWJ1ZmZlcl9pY2FwX3Jlc2V0KGRydmRhdGEpOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCisJCWJ1ZmZlcl9jb3VudCA9IDA7CisJCW51bV93cml0ZXMrKzsKKwkJZGlydHkgPSAwOworCX0KKworCS8qIFdyaXRlIHVud3JpdHRlbiBkYXRhIHRvIElDQVAgKi8KKwlpZiAoZGlydHkpIHsKKwkJLyogV3JpdGUgZGF0YSB0byBJQ0FQICovCisJCXN0YXR1cyA9IGJ1ZmZlcl9pY2FwX2RldmljZV93cml0ZShkcnZkYXRhLCBYSElfQlVGRkVSX1NUQVJULAorCQkJCQkgICAgIGJ1ZmZlcl9jb3VudCk7CisJCWlmIChzdGF0dXMgIT0gMCkgeworCQkJLyogYWJvcnQuICovCisJCQlidWZmZXJfaWNhcF9yZXNldChkcnZkYXRhKTsKKwkJfQorCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXJldHVybiAwOworfTsKKworLyoqCisgKiBidWZmZXJfaWNhcF9nZXRfY29uZmlndXJhdGlvbjogUmVhZCBjb25maWd1cmF0aW9uIGRhdGEgZnJvbSB0aGUgZGV2aWNlLgorICogQHBhcmFtZXRlciBkcnZkYXRhOiBhIHBvaW50ZXIgdG8gdGhlIGRydmRhdGEuCisgKiBAcGFyYW1ldGVyIGRhdGE6IEFkZHJlc3Mgb2YgdGhlIGRhdGEgcmVwcmVzZW50aW5nIHRoZSBwYXJ0aWFsIGJpdHN0cmVhbQorICogQHBhcmFtZXRlciBzaXplOiB0aGUgc2l6ZSBvZiB0aGUgcGFydGlhbCBiaXRzdHJlYW0gaW4gMzIgYml0IHdvcmRzLgorICoqLworaW50IGJ1ZmZlcl9pY2FwX2dldF9jb25maWd1cmF0aW9uKHN0cnVjdCBod2ljYXBfZHJ2ZGF0YSAqZHJ2ZGF0YSwgdTMyICpkYXRhLAorCQkJICAgICB1MzIgc2l6ZSkKK3sKKwlpbnQgc3RhdHVzOworCXMzMiBidWZmZXJfY291bnQgPSAwOworCXMzMiByZWFkX2NvdW50ID0gMDsKKwl1MzIgaTsKKwl2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcyA9IGRydmRhdGEtPmJhc2VfYWRkcmVzczsKKworCS8qIExvb3AgdGhyb3VnaCBhbGwgdGhlIGRhdGEgKi8KKwlmb3IgKGkgPSAwLCBidWZmZXJfY291bnQgPSBYSElfTUFYX0JVRkZFUl9JTlRTOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWlmIChidWZmZXJfY291bnQgPT0gWEhJX01BWF9CVUZGRVJfSU5UUykgeworCQkJdTMyIHdvcmRzX3JlbWFpbmluZyA9IHNpemUgLSBpOworCQkJdTMyIHdvcmRzX3RvX3JlYWQgPQorCQkJCXdvcmRzX3JlbWFpbmluZyA8CisJCQkJWEhJX01BWF9CVUZGRVJfSU5UUyA/IHdvcmRzX3JlbWFpbmluZyA6CisJCQkJWEhJX01BWF9CVUZGRVJfSU5UUzsKKworCQkJLyogUmVhZCBkYXRhIGZyb20gSUNBUCAqLworCQkJc3RhdHVzID0gYnVmZmVyX2ljYXBfZGV2aWNlX3JlYWQoCisJCQkJCWRydmRhdGEsCisJCQkJCVhISV9CVUZGRVJfU1RBUlQsCisJCQkJCXdvcmRzX3RvX3JlYWQpOworCQkJaWYgKHN0YXR1cyAhPSAwKSB7CisJCQkJLyogYWJvcnQuICovCisJCQkJYnVmZmVyX2ljYXBfcmVzZXQoZHJ2ZGF0YSk7CisJCQkJcmV0dXJuIHN0YXR1czsKKwkJCX0KKworCQkJYnVmZmVyX2NvdW50ID0gMDsKKwkJCXJlYWRfY291bnQrKzsKKwkJfQorCisJCS8qIENvcHkgZGF0YSBmcm9tIGJyYW0gKi8KKwkJZGF0YVtpXSA9IGJ1ZmZlcl9pY2FwX2dldF9icmFtKGJhc2VfYWRkcmVzcywgYnVmZmVyX2NvdW50KTsKKwkJYnVmZmVyX2NvdW50Kys7CisJfQorCisJcmV0dXJuIDA7Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3hpbGlueF9od2ljYXAvYnVmZmVyX2ljYXAuaCBiL2RyaXZlcnMvY2hhci94aWxpbnhfaHdpY2FwL2J1ZmZlcl9pY2FwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMxODQ5NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci94aWxpbnhfaHdpY2FwL2J1ZmZlcl9pY2FwLmgKQEAgLTAsMCArMSw1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIEF1dGhvcjogWGlsaW54LCBJbmMuCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFhJTElOWCBJUyBQUk9WSURJTkcgVEhJUyBERVNJR04sIENPREUsIE9SIElORk9STUFUSU9OICJBUyBJUyIKKyAqICAgICBBUyBBIENPVVJURVNZIFRPIFlPVSwgU09MRUxZIEZPUiBVU0UgSU4gREVWRUxPUElORyBQUk9HUkFNUyBBTkQKKyAqICAgICBTT0xVVElPTlMgRk9SIFhJTElOWCBERVZJQ0VTLiAgQlkgUFJPVklESU5HIFRISVMgREVTSUdOLCBDT0RFLAorICogICAgIE9SIElORk9STUFUSU9OIEFTIE9ORSBQT1NTSUJMRSBJTVBMRU1FTlRBVElPTiBPRiBUSElTIEZFQVRVUkUsCisgKiAgICAgQVBQTElDQVRJT04gT1IgU1RBTkRBUkQsIFhJTElOWCBJUyBNQUtJTkcgTk8gUkVQUkVTRU5UQVRJT04KKyAqICAgICBUSEFUIFRISVMgSU1QTEVNRU5UQVRJT04gSVMgRlJFRSBGUk9NIEFOWSBDTEFJTVMgT0YgSU5GUklOR0VNRU5ULAorICogICAgIEFORCBZT1UgQVJFIFJFU1BPTlNJQkxFIEZPUiBPQlRBSU5JTkcgQU5ZIFJJR0hUUyBZT1UgTUFZIFJFUVVJUkUKKyAqICAgICBGT1IgWU9VUiBJTVBMRU1FTlRBVElPTi4gIFhJTElOWCBFWFBSRVNTTFkgRElTQ0xBSU1TIEFOWQorICogICAgIFdBUlJBTlRZIFdIQVRTT0VWRVIgV0lUSCBSRVNQRUNUIFRPIFRIRSBBREVRVUFDWSBPRiBUSEUKKyAqICAgICBJTVBMRU1FTlRBVElPTiwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBBTlkgV0FSUkFOVElFUyBPUgorICogICAgIFJFUFJFU0VOVEFUSU9OUyBUSEFUIFRISVMgSU1QTEVNRU5UQVRJT04gSVMgRlJFRSBGUk9NIENMQUlNUyBPRgorICogICAgIElORlJJTkdFTUVOVCwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiAgICAgWGlsaW54IHByb2R1Y3RzIGFyZSBub3QgaW50ZW5kZWQgZm9yIHVzZSBpbiBsaWZlIHN1cHBvcnQgYXBwbGlhbmNlcywKKyAqICAgICBkZXZpY2VzLCBvciBzeXN0ZW1zLiBVc2UgaW4gc3VjaCBhcHBsaWNhdGlvbnMgaXMgZXhwcmVzc2x5IHByb2hpYml0ZWQuCisgKgorICogICAgIChjKSBDb3B5cmlnaHQgMjAwMy0yMDA4IFhpbGlueCBJbmMuCisgKiAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICAgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogICAgIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBYSUxJTlhfQlVGRkVSX0lDQVBfSF8JLyogcHJldmVudCBjaXJjdWxhciBpbmNsdXNpb25zICovCisjZGVmaW5lIFhJTElOWF9CVUZGRVJfSUNBUF9IXwkvKiBieSB1c2luZyBwcm90ZWN0aW9uIG1hY3JvcyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSAieGlsaW54X2h3aWNhcC5oIgorCit2b2lkIGJ1ZmZlcl9pY2FwX3Jlc2V0KHN0cnVjdCBod2ljYXBfZHJ2ZGF0YSAqZHJ2ZGF0YSk7CisKKy8qIExvYWRzIGEgcGFydGlhbCBiaXRzdHJlYW0gZnJvbSBzeXN0ZW0gbWVtb3J5LiAqLworaW50IGJ1ZmZlcl9pY2FwX3NldF9jb25maWd1cmF0aW9uKHN0cnVjdCBod2ljYXBfZHJ2ZGF0YSAqZHJ2ZGF0YSwgdTMyICpkYXRhLAorCQkJICAgICB1MzIgU2l6ZSk7CisKKy8qIExvYWRzIGEgcGFydGlhbCBiaXRzdHJlYW0gZnJvbSBzeXN0ZW0gbWVtb3J5LiAqLworaW50IGJ1ZmZlcl9pY2FwX2dldF9jb25maWd1cmF0aW9uKHN0cnVjdCBod2ljYXBfZHJ2ZGF0YSAqZHJ2ZGF0YSwgdTMyICpkYXRhLAorCQkJICAgICB1MzIgU2l6ZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3hpbGlueF9od2ljYXAvZmlmb19pY2FwLmMgYi9kcml2ZXJzL2NoYXIveGlsaW54X2h3aWNhcC9maWZvX2ljYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTg4MzE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3hpbGlueF9od2ljYXAvZmlmb19pY2FwLmMKQEAgLTAsMCArMSwzODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBBdXRob3I6IFhpbGlueCwgSW5jLgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogICAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogICAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBYSUxJTlggSVMgUFJPVklESU5HIFRISVMgREVTSUdOLCBDT0RFLCBPUiBJTkZPUk1BVElPTiAiQVMgSVMiCisgKiAgICAgQVMgQSBDT1VSVEVTWSBUTyBZT1UsIFNPTEVMWSBGT1IgVVNFIElOIERFVkVMT1BJTkcgUFJPR1JBTVMgQU5ECisgKiAgICAgU09MVVRJT05TIEZPUiBYSUxJTlggREVWSUNFUy4gIEJZIFBST1ZJRElORyBUSElTIERFU0lHTiwgQ09ERSwKKyAqICAgICBPUiBJTkZPUk1BVElPTiBBUyBPTkUgUE9TU0lCTEUgSU1QTEVNRU5UQVRJT04gT0YgVEhJUyBGRUFUVVJFLAorICogICAgIEFQUExJQ0FUSU9OIE9SIFNUQU5EQVJELCBYSUxJTlggSVMgTUFLSU5HIE5PIFJFUFJFU0VOVEFUSU9OCisgKiAgICAgVEhBVCBUSElTIElNUExFTUVOVEFUSU9OIElTIEZSRUUgRlJPTSBBTlkgQ0xBSU1TIE9GIElORlJJTkdFTUVOVCwKKyAqICAgICBBTkQgWU9VIEFSRSBSRVNQT05TSUJMRSBGT1IgT0JUQUlOSU5HIEFOWSBSSUdIVFMgWU9VIE1BWSBSRVFVSVJFCisgKiAgICAgRk9SIFlPVVIgSU1QTEVNRU5UQVRJT04uICBYSUxJTlggRVhQUkVTU0xZIERJU0NMQUlNUyBBTlkKKyAqICAgICBXQVJSQU5UWSBXSEFUU09FVkVSIFdJVEggUkVTUEVDVCBUTyBUSEUgQURFUVVBQ1kgT0YgVEhFCisgKiAgICAgSU1QTEVNRU5UQVRJT04sIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT1IKKyAqICAgICBSRVBSRVNFTlRBVElPTlMgVEhBVCBUSElTIElNUExFTUVOVEFUSU9OIElTIEZSRUUgRlJPTSBDTEFJTVMgT0YKKyAqICAgICBJTkZSSU5HRU1FTlQsIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogICAgIFhpbGlueCBwcm9kdWN0cyBhcmUgbm90IGludGVuZGVkIGZvciB1c2UgaW4gbGlmZSBzdXBwb3J0IGFwcGxpYW5jZXMsCisgKiAgICAgZGV2aWNlcywgb3Igc3lzdGVtcy4gVXNlIGluIHN1Y2ggYXBwbGljYXRpb25zIGlzIGV4cHJlc3NseSBwcm9oaWJpdGVkLgorICoKKyAqICAgICAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBYaWxpbnggSW5jLgorICogICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICAgICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJmaWZvX2ljYXAuaCIKKworLyogUmVnaXN0ZXIgb2Zmc2V0cyBmb3IgdGhlIFhId0ljYXAgZGV2aWNlLiAqLworI2RlZmluZSBYSElfR0lFUl9PRkZTRVQJMHgxQyAgLyogRGV2aWNlIEdsb2JhbCBJbnRlcnJ1cHQgRW5hYmxlIFJlZyAqLworI2RlZmluZSBYSElfSVBJU1JfT0ZGU0VUIDB4MjAgIC8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWEhJX0lQSUVSX09GRlNFVCAweDI4ICAvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIFhISV9XRl9PRkZTRVQgMHgxMDAgLyogV3JpdGUgRklGTyAqLworI2RlZmluZSBYSElfUkZfT0ZGU0VUIDB4MTA0IC8qIFJlYWQgRklGTyAqLworI2RlZmluZSBYSElfU1pfT0ZGU0VUIDB4MTA4IC8qIFNpemUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWEhJX0NSX09GRlNFVCAweDEwQyAvKiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFhISV9TUl9PRkZTRVQgMHgxMTAgLyogU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFhISV9XRlZfT0ZGU0VUIDB4MTE0IC8qIFdyaXRlIEZJRk8gVmFjYW5jeSBSZWdpc3RlciAqLworI2RlZmluZSBYSElfUkZPX09GRlNFVCAweDExOCAvKiBSZWFkIEZJRk8gT2NjdXBhbmN5IFJlZ2lzdGVyICovCisKKy8qIERldmljZSBHbG9iYWwgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAoR0lFUikgYml0IGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgWEhJX0dJRVJfR0lFX01BU0sgMHg4MDAwMDAwMCAvKiBHbG9iYWwgSW50ZXJydXB0IGVuYWJsZSBNYXNrICovCisKKy8qKgorICogSHdJY2FwIERldmljZSBJbnRlcnJ1cHQgU3RhdHVzL0VuYWJsZSBSZWdpc3RlcnMKKyAqCisgKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIChJUElTUikgOiBUaGlzIHJlZ2lzdGVyIGhvbGRzIHRoZQorICogaW50ZXJydXB0IHN0YXR1cyBmbGFncyBmb3IgdGhlIGRldmljZS4gVGhlc2UgYml0cyBhcmUgdG9nZ2xlIG9uCisgKiB3cml0ZS4KKyAqCisgKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIChJUElFUikgOiBUaGlzIHJlZ2lzdGVyIGlzIHVzZWQgdG8gZW5hYmxlCisgKiBpbnRlcnJ1cHQgc291cmNlcyBmb3IgdGhlIGRldmljZS4KKyAqIFdyaXRpbmcgYSAnMScgdG8gYSBiaXQgZW5hYmxlcyB0aGUgY29ycmVzcG9uZGluZyBpbnRlcnJ1cHQuCisgKiBXcml0aW5nIGEgJzAnIHRvIGEgYml0IGRpc2FibGVzIHRoZSBjb3JyZXNwb25kaW5nIGludGVycnVwdC4KKyAqCisgKiBJUElTUi9JUElFUiByZWdpc3RlcnMgaGF2ZSB0aGUgc2FtZSBiaXQgZGVmaW5pdGlvbnMgYW5kIGFyZSBvbmx5IGRlZmluZWQKKyAqIG9uY2UuCisgKi8KKyNkZWZpbmUgWEhJX0lQSVhSX1JGVUxMX01BU0sgMHgwMDAwMDAwOCAvKiBSZWFkIEZJRk8gRnVsbCAqLworI2RlZmluZSBYSElfSVBJWFJfV0VNUFRZX01BU0sgMHgwMDAwMDAwNCAvKiBXcml0ZSBGSUZPIEVtcHR5ICovCisjZGVmaW5lIFhISV9JUElYUl9SRFBfTUFTSyAweDAwMDAwMDAyIC8qIFJlYWQgRklGTyBoYWxmIGZ1bGwgKi8KKyNkZWZpbmUgWEhJX0lQSVhSX1dSUF9NQVNLIDB4MDAwMDAwMDEgLyogV3JpdGUgRklGTyBoYWxmIGZ1bGwgKi8KKyNkZWZpbmUgWEhJX0lQSVhSX0FMTF9NQVNLIDB4MDAwMDAwMEYgLyogTWFzayBvZiBhbGwgaW50ZXJydXB0cyAqLworCisvKiBDb250cm9sIFJlZ2lzdGVyIChDUikgKi8KKyNkZWZpbmUgWEhJX0NSX1NXX1JFU0VUX01BU0sgMHgwMDAwMDAwOCAvKiBTVyBSZXNldCBNYXNrICovCisjZGVmaW5lIFhISV9DUl9GSUZPX0NMUl9NQVNLIDB4MDAwMDAwMDQgLyogRklGTyBDbGVhciBNYXNrICovCisjZGVmaW5lIFhISV9DUl9SRUFEX01BU0sgMHgwMDAwMDAwMiAvKiBSZWFkIGZyb20gSUNBUCB0byBGSUZPICovCisjZGVmaW5lIFhISV9DUl9XUklURV9NQVNLIDB4MDAwMDAwMDEgLyogV3JpdGUgZnJvbSBGSUZPIHRvIElDQVAgKi8KKworLyogU3RhdHVzIFJlZ2lzdGVyIChTUikgKi8KKyNkZWZpbmUgWEhJX1NSX0NGR0VSUl9OX01BU0sgMHgwMDAwMDEwMCAvKiBDb25maWcgRXJyb3IgTWFzayAqLworI2RlZmluZSBYSElfU1JfREFMSUdOX01BU0sgMHgwMDAwMDA4MCAvKiBEYXRhIEFsaWdubWVudCBNYXNrICovCisjZGVmaW5lIFhISV9TUl9SSVBfTUFTSyAweDAwMDAwMDQwIC8qIFJlYWQgYmFjayBNYXNrICovCisjZGVmaW5lIFhISV9TUl9JTl9BQk9SVF9OX01BU0sgMHgwMDAwMDAyMCAvKiBTZWxlY3QgTWFwIEFib3J0IE1hc2sgKi8KKyNkZWZpbmUgWEhJX1NSX0RPTkVfTUFTSyAweDAwMDAwMDAxIC8qIERvbmUgYml0IE1hc2sgICovCisKKworI2RlZmluZSBYSElfV0ZPX01BWF9WQUNBTkNZIDEwMjQgLyogTWF4IFdyaXRlIEZJRk8gVmFjYW5jeSwgaW4gd29yZHMgKi8KKyNkZWZpbmUgWEhJX1JGT19NQVhfT0NDVVBBTkNZIDI1NiAvKiBNYXggUmVhZCBGSUZPIE9jY3VwYW5jeSwgaW4gd29yZHMgKi8KKy8qIFRoZSBtYXhpbXVtIGFtb3VudCB3ZSBjYW4gcmVxdWVzdCBmcm9tIGZpZm9faWNhcF9nZXRfY29uZmlndXJhdGlvbgorICAgYXQgb25jZSwgaW4gYnl0ZXMuICovCisjZGVmaW5lIFhISV9NQVhfUkVBRF9UUkFOU0FDVElPTl9XT1JEUyAweEZGRgorCisKKy8qKgorICogZmlmb19pY2FwX2ZpZm9fd3JpdGU6IFdyaXRlIGRhdGEgdG8gdGhlIHdyaXRlIEZJRk8uCisgKiBAcGFyYW1ldGVyIGRydmRhdGE6IGEgcG9pbnRlciB0byB0aGUgZHJ2ZGF0YS4KKyAqIEBwYXJhbWV0ZXIgZGF0YTogdGhlIDMyLWJpdCB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIHRoZSBGSUZPLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBzaWxlbnRseSBmYWlsIGlmIHRoZSBmaWZvIGlzIGZ1bGwuCisgKiovCitzdGF0aWMgaW5saW5lIHZvaWQgZmlmb19pY2FwX2ZpZm9fd3JpdGUoc3RydWN0IGh3aWNhcF9kcnZkYXRhICpkcnZkYXRhLAorCQl1MzIgZGF0YSkKK3sKKwlkZXZfZGJnKGRydmRhdGEtPmRldiwgImZpZm9fd3JpdGU6ICV4XG4iLCBkYXRhKTsKKwlvdXRfYmUzMihkcnZkYXRhLT5iYXNlX2FkZHJlc3MgKyBYSElfV0ZfT0ZGU0VULCBkYXRhKTsKK30KKworLyoqCisgKiBmaWZvX2ljYXBfZmlmb19yZWFkOiBSZWFkIGRhdGEgZnJvbSB0aGUgUmVhZCBGSUZPLgorICogQHBhcmFtZXRlciBkcnZkYXRhOiBhIHBvaW50ZXIgdG8gdGhlIGRydmRhdGEuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHNpbGVudGx5IGZhaWwgaWYgdGhlIGZpZm8gaXMgZW1wdHkuCisgKiovCitzdGF0aWMgaW5saW5lIHUzMiBmaWZvX2ljYXBfZmlmb19yZWFkKHN0cnVjdCBod2ljYXBfZHJ2ZGF0YSAqZHJ2ZGF0YSkKK3sKKwl1MzIgZGF0YSA9IGluX2JlMzIoZHJ2ZGF0YS0+YmFzZV9hZGRyZXNzICsgWEhJX1JGX09GRlNFVCk7CisJZGV2X2RiZyhkcnZkYXRhLT5kZXYsICJmaWZvX3JlYWQ6ICV4XG4iLCBkYXRhKTsKKwlyZXR1cm4gZGF0YTsKK30KKworLyoqCisgKiBmaWZvX2ljYXBfc2V0X3JlYWRfc2l6ZTogU2V0IHRoZSB0aGUgc2l6ZSByZWdpc3Rlci4KKyAqIEBwYXJhbWV0ZXIgZHJ2ZGF0YTogYSBwb2ludGVyIHRvIHRoZSBkcnZkYXRhLgorICogQHBhcmFtZXRlciBkYXRhOiB0aGUgc2l6ZSBvZiB0aGUgZm9sbG93aW5nIHJlYWQgdHJhbnNhY3Rpb24sIGluIHdvcmRzLgorICoqLworc3RhdGljIGlubGluZSB2b2lkIGZpZm9faWNhcF9zZXRfcmVhZF9zaXplKHN0cnVjdCBod2ljYXBfZHJ2ZGF0YSAqZHJ2ZGF0YSwKKwkJdTMyIGRhdGEpCit7CisJb3V0X2JlMzIoZHJ2ZGF0YS0+YmFzZV9hZGRyZXNzICsgWEhJX1NaX09GRlNFVCwgZGF0YSk7Cit9CisKKy8qKgorICogZmlmb19pY2FwX3N0YXJ0X2NvbmZpZzogSW5pdGlhdGUgYSBjb25maWd1cmF0aW9uICh3cml0ZSkgdG8gdGhlIGRldmljZS4KKyAqIEBwYXJhbWV0ZXIgZHJ2ZGF0YTogYSBwb2ludGVyIHRvIHRoZSBkcnZkYXRhLgorICoqLworc3RhdGljIGlubGluZSB2b2lkIGZpZm9faWNhcF9zdGFydF9jb25maWcoc3RydWN0IGh3aWNhcF9kcnZkYXRhICpkcnZkYXRhKQoreworCW91dF9iZTMyKGRydmRhdGEtPmJhc2VfYWRkcmVzcyArIFhISV9DUl9PRkZTRVQsIFhISV9DUl9XUklURV9NQVNLKTsKKwlkZXZfZGJnKGRydmRhdGEtPmRldiwgImNvbmZpZ3VyYXRpb24gc3RhcnRlZFxuIik7Cit9CisKKy8qKgorICogZmlmb19pY2FwX3N0YXJ0X3JlYWRiYWNrOiBJbml0aWF0ZSBhIHJlYWRiYWNrIGZyb20gdGhlIGRldmljZS4KKyAqIEBwYXJhbWV0ZXIgZHJ2ZGF0YTogYSBwb2ludGVyIHRvIHRoZSBkcnZkYXRhLgorICoqLworc3RhdGljIGlubGluZSB2b2lkIGZpZm9faWNhcF9zdGFydF9yZWFkYmFjayhzdHJ1Y3QgaHdpY2FwX2RydmRhdGEgKmRydmRhdGEpCit7CisJb3V0X2JlMzIoZHJ2ZGF0YS0+YmFzZV9hZGRyZXNzICsgWEhJX0NSX09GRlNFVCwgWEhJX0NSX1JFQURfTUFTSyk7CisJZGV2X2RiZyhkcnZkYXRhLT5kZXYsICJyZWFkYmFjayBzdGFydGVkXG4iKTsKK30KKworLyoqCisgKiBmaWZvX2ljYXBfYnVzeTogUmV0dXJuIHRydWUgaWYgdGhlIElDQVAgaXMgc3RpbGwgcHJvY2Vzc2luZyBhIHRyYW5zYWN0aW9uLgorICogQHBhcmFtZXRlciBkcnZkYXRhOiBhIHBvaW50ZXIgdG8gdGhlIGRydmRhdGEuCisgKiovCitzdGF0aWMgaW5saW5lIHUzMiBmaWZvX2ljYXBfYnVzeShzdHJ1Y3QgaHdpY2FwX2RydmRhdGEgKmRydmRhdGEpCit7CisJdTMyIHN0YXR1cyA9IGluX2JlMzIoZHJ2ZGF0YS0+YmFzZV9hZGRyZXNzICsgWEhJX1NSX09GRlNFVCk7CisJZGV2X2RiZyhkcnZkYXRhLT5kZXYsICJHZXR0aW5nIHN0YXR1cyA9ICV4XG4iLCBzdGF0dXMpOworCXJldHVybiAoc3RhdHVzICYgWEhJX1NSX0RPTkVfTUFTSykgPyAwIDogMTsKK30KKworLyoqCisgKiBmaWZvX2ljYXBfd3JpdGVfZmlmb192YWNhbmN5OiBRdWVyeSB0aGUgd3JpdGUgZmlmbyBhdmFpbGFibGUgc3BhY2UuCisgKiBAcGFyYW1ldGVyIGRydmRhdGE6IGEgcG9pbnRlciB0byB0aGUgZHJ2ZGF0YS4KKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiB3b3JkcyB0aGF0IGNhbiBiZSBzYWZlbHkgcHVzaGVkIGludG8gdGhlIHdyaXRlIGZpZm8uCisgKiovCitzdGF0aWMgaW5saW5lIHUzMiBmaWZvX2ljYXBfd3JpdGVfZmlmb192YWNhbmN5KAorCQlzdHJ1Y3QgaHdpY2FwX2RydmRhdGEgKmRydmRhdGEpCit7CisJcmV0dXJuIGluX2JlMzIoZHJ2ZGF0YS0+YmFzZV9hZGRyZXNzICsgWEhJX1dGVl9PRkZTRVQpOworfQorCisvKioKKyAqIGZpZm9faWNhcF9yZWFkX2ZpZm9fb2NjdXBhbmN5OiBRdWVyeSB0aGUgcmVhZCBmaWZvIGF2YWlsYWJsZSBkYXRhLgorICogQHBhcmFtZXRlciBkcnZkYXRhOiBhIHBvaW50ZXIgdG8gdGhlIGRydmRhdGEuCisgKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygd29yZHMgdGhhdCBjYW4gYmUgc2FmZWx5IHJlYWQgZnJvbSB0aGUgcmVhZCBmaWZvLgorICoqLworc3RhdGljIGlubGluZSB1MzIgZmlmb19pY2FwX3JlYWRfZmlmb19vY2N1cGFuY3koCisJCXN0cnVjdCBod2ljYXBfZHJ2ZGF0YSAqZHJ2ZGF0YSkKK3sKKwlyZXR1cm4gaW5fYmUzMihkcnZkYXRhLT5iYXNlX2FkZHJlc3MgKyBYSElfUkZPX09GRlNFVCk7Cit9CisKKy8qKgorICogZmlmb19pY2FwX3NldF9jb25maWd1cmF0aW9uOiBTZW5kIGNvbmZpZ3VyYXRpb24gZGF0YSB0byB0aGUgSUNBUC4KKyAqIEBwYXJhbWV0ZXIgZHJ2ZGF0YTogYSBwb2ludGVyIHRvIHRoZSBkcnZkYXRhLgorICogQHBhcmFtZXRlciBmcmFtZV9idWZmZXI6IGEgcG9pbnRlciB0byB0aGUgZGF0YSB0byBiZSB3cml0dGVuIHRvIHRoZQorICoJCUlDQVAgZGV2aWNlLgorICogQHBhcmFtZXRlciBudW1fd29yZHM6IHRoZSBudW1iZXIgb2Ygd29yZHMgKDMyIGJpdCkgdG8gd3JpdGUgdG8gdGhlIElDQVAKKyAqCQlkZXZpY2UuCisKKyAqIFRoaXMgZnVuY3Rpb24gd3JpdGVzIHRoZSBnaXZlbiB1c2VyIGRhdGEgdG8gdGhlIFdyaXRlIEZJRk8gaW4KKyAqIHBvbGxlZCBtb2RlIGFuZCBzdGFydHMgdGhlIHRyYW5zZmVyIG9mIHRoZSBkYXRhIHRvCisgKiB0aGUgSUNBUCBkZXZpY2UuCisgKiovCitpbnQgZmlmb19pY2FwX3NldF9jb25maWd1cmF0aW9uKHN0cnVjdCBod2ljYXBfZHJ2ZGF0YSAqZHJ2ZGF0YSwKKwkJdTMyICpmcmFtZV9idWZmZXIsIHUzMiBudW1fd29yZHMpCit7CisKKwl1MzIgd3JpdGVfZmlmb192YWNhbmN5ID0gMDsKKwl1MzIgcmV0cmllcyA9IDA7CisJdTMyIHJlbWFpbmluZ193b3JkczsKKworCWRldl9kYmcoZHJ2ZGF0YS0+ZGV2LCAiZmlmb19zZXRfY29uZmlndXJhdGlvblxuIik7CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBJQ0FQIGRldmljZSBpcyBCdXN5IHdpdGggdGhlIGxhc3QgUmVhZC9Xcml0ZQorCSAqLworCWlmIChmaWZvX2ljYXBfYnVzeShkcnZkYXRhKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qCisJICogU2V0IHVwIHRoZSBidWZmZXIgcG9pbnRlciBhbmQgdGhlIHdvcmRzIHRvIGJlIHRyYW5zZmVycmVkLgorCSAqLworCXJlbWFpbmluZ193b3JkcyA9IG51bV93b3JkczsKKworCXdoaWxlIChyZW1haW5pbmdfd29yZHMgPiAwKSB7CisJCS8qCisJCSAqIFdhaXQgdW50aWwgd2UgaGF2ZSBzb21lIGRhdGEgaW4gdGhlIGZpZm8uCisJCSAqLworCQl3aGlsZSAod3JpdGVfZmlmb192YWNhbmN5ID09IDApIHsKKwkJCXdyaXRlX2ZpZm9fdmFjYW5jeSA9CisJCQkJZmlmb19pY2FwX3dyaXRlX2ZpZm9fdmFjYW5jeShkcnZkYXRhKTsKKwkJCXJldHJpZXMrKzsKKwkJCWlmIChyZXRyaWVzID4gWEhJX01BWF9SRVRSSUVTKQorCQkJCXJldHVybiAtRUlPOworCQl9CisKKwkJLyoKKwkJICogV3JpdGUgZGF0YSBpbnRvIHRoZSBXcml0ZSBGSUZPLgorCQkgKi8KKwkJd2hpbGUgKCh3cml0ZV9maWZvX3ZhY2FuY3kgIT0gMCkgJiYKKwkJCQkocmVtYWluaW5nX3dvcmRzID4gMCkpIHsKKwkJCWZpZm9faWNhcF9maWZvX3dyaXRlKGRydmRhdGEsICpmcmFtZV9idWZmZXIpOworCisJCQlyZW1haW5pbmdfd29yZHMtLTsKKwkJCXdyaXRlX2ZpZm9fdmFjYW5jeS0tOworCQkJZnJhbWVfYnVmZmVyKys7CisJCX0KKwkJLyogU3RhcnQgcHVzaGluZyB3aGF0ZXZlciBpcyBpbiB0aGUgRklGTyBpbnRvIHRoZSBJQ0FQLiAqLworCQlmaWZvX2ljYXBfc3RhcnRfY29uZmlnKGRydmRhdGEpOworCX0KKworCS8qIFdhaXQgdW50aWwgdGhlIHdyaXRlIGhhcyBmaW5pc2hlZC4gKi8KKwl3aGlsZSAoZmlmb19pY2FwX2J1c3koZHJ2ZGF0YSkpIHsKKwkJcmV0cmllcysrOworCQlpZiAocmV0cmllcyA+IFhISV9NQVhfUkVUUklFUykKKwkJCWJyZWFrOworCX0KKworCWRldl9kYmcoZHJ2ZGF0YS0+ZGV2LCAiZG9uZSBmaWZvX3NldF9jb25maWd1cmF0aW9uXG4iKTsKKworCS8qCisJICogSWYgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2Ygd29yZHMgaGF2ZSBub3QgYmVlbiByZWFkIGZyb20KKwkgKiB0aGUgZGV2aWNlIHRoZW4gaW5kaWNhdGUgZmFpbHVyZS4KKwkgKi8KKwlpZiAocmVtYWluaW5nX3dvcmRzICE9IDApCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZmlmb19pY2FwX2dldF9jb25maWd1cmF0aW9uOiBSZWFkIGNvbmZpZ3VyYXRpb24gZGF0YSBmcm9tIHRoZSBkZXZpY2UuCisgKiBAcGFyYW1ldGVyIGRydmRhdGE6IGEgcG9pbnRlciB0byB0aGUgZHJ2ZGF0YS4KKyAqIEBwYXJhbWV0ZXIgZGF0YTogQWRkcmVzcyBvZiB0aGUgZGF0YSByZXByZXNlbnRpbmcgdGhlIHBhcnRpYWwgYml0c3RyZWFtCisgKiBAcGFyYW1ldGVyIHNpemU6IHRoZSBzaXplIG9mIHRoZSBwYXJ0aWFsIGJpdHN0cmVhbSBpbiAzMiBiaXQgd29yZHMuCisgKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB3b3JkcyBmcm9tIHRoZSBJQ0FQIGRldmljZSBpbgorICogdGhlIHBvbGxlZCBtb2RlLgorICovCitpbnQgZmlmb19pY2FwX2dldF9jb25maWd1cmF0aW9uKHN0cnVjdCBod2ljYXBfZHJ2ZGF0YSAqZHJ2ZGF0YSwKKwkJdTMyICpmcmFtZV9idWZmZXIsIHUzMiBudW1fd29yZHMpCit7CisKKwl1MzIgcmVhZF9maWZvX29jY3VwYW5jeSA9IDA7CisJdTMyIHJldHJpZXMgPSAwOworCXUzMiAqZGF0YSA9IGZyYW1lX2J1ZmZlcjsKKwl1MzIgcmVtYWluaW5nX3dvcmRzOworCXUzMiB3b3Jkc190b19yZWFkOworCisJZGV2X2RiZyhkcnZkYXRhLT5kZXYsICJmaWZvX2dldF9jb25maWd1cmF0aW9uXG4iKTsKKworCS8qCisJICogQ2hlY2sgaWYgdGhlIElDQVAgZGV2aWNlIGlzIEJ1c3kgd2l0aCB0aGUgbGFzdCBXcml0ZS9SZWFkCisJICovCisJaWYgKGZpZm9faWNhcF9idXN5KGRydmRhdGEpKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmVtYWluaW5nX3dvcmRzID0gbnVtX3dvcmRzOworCisJd2hpbGUgKHJlbWFpbmluZ193b3JkcyA+IDApIHsKKwkJd29yZHNfdG9fcmVhZCA9IHJlbWFpbmluZ193b3JkczsKKwkJLyogVGhlIGhhcmR3YXJlIGhhcyBhIGxpbWl0IG9uIHRoZSBudW1iZXIgb2Ygd29yZHMKKwkJICAgdGhhdCBjYW4gYmUgcmVhZCBhdCBvbmUgdGltZS4gICovCisJCWlmICh3b3Jkc190b19yZWFkID4gWEhJX01BWF9SRUFEX1RSQU5TQUNUSU9OX1dPUkRTKQorCQkJd29yZHNfdG9fcmVhZCA9IFhISV9NQVhfUkVBRF9UUkFOU0FDVElPTl9XT1JEUzsKKworCQlyZW1haW5pbmdfd29yZHMgLT0gd29yZHNfdG9fcmVhZDsKKworCQlmaWZvX2ljYXBfc2V0X3JlYWRfc2l6ZShkcnZkYXRhLCB3b3Jkc190b19yZWFkKTsKKwkJZmlmb19pY2FwX3N0YXJ0X3JlYWRiYWNrKGRydmRhdGEpOworCisJCXdoaWxlICh3b3Jkc190b19yZWFkID4gMCkgeworCQkJLyogV2FpdCB1bnRpbCB3ZSBoYXZlIHNvbWUgZGF0YSBpbiB0aGUgZmlmby4gKi8KKwkJCXdoaWxlIChyZWFkX2ZpZm9fb2NjdXBhbmN5ID09IDApIHsKKwkJCQlyZWFkX2ZpZm9fb2NjdXBhbmN5ID0KKwkJCQkJZmlmb19pY2FwX3JlYWRfZmlmb19vY2N1cGFuY3koZHJ2ZGF0YSk7CisJCQkJcmV0cmllcysrOworCQkJCWlmIChyZXRyaWVzID4gWEhJX01BWF9SRVRSSUVTKQorCQkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKworCQkJaWYgKHJlYWRfZmlmb19vY2N1cGFuY3kgPiB3b3Jkc190b19yZWFkKQorCQkJCXJlYWRfZmlmb19vY2N1cGFuY3kgPSB3b3Jkc190b19yZWFkOworCisJCQl3b3Jkc190b19yZWFkIC09IHJlYWRfZmlmb19vY2N1cGFuY3k7CisKKwkJCS8qIFJlYWQgdGhlIGRhdGEgZnJvbSB0aGUgUmVhZCBGSUZPLiAqLworCQkJd2hpbGUgKHJlYWRfZmlmb19vY2N1cGFuY3kgIT0gMCkgeworCQkJCSpkYXRhKysgPSBmaWZvX2ljYXBfZmlmb19yZWFkKGRydmRhdGEpOworCQkJCXJlYWRfZmlmb19vY2N1cGFuY3ktLTsKKwkJCX0KKwkJfQorCX0KKworCWRldl9kYmcoZHJ2ZGF0YS0+ZGV2LCAiZG9uZSBmaWZvX2dldF9jb25maWd1cmF0aW9uXG4iKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGJ1ZmZlcl9pY2FwX3Jlc2V0OiBSZXNldCB0aGUgbG9naWMgb2YgdGhlIGljYXAgZGV2aWNlLgorICogQHBhcmFtZXRlciBkcnZkYXRhOiBhIHBvaW50ZXIgdG8gdGhlIGRydmRhdGEuCisgKgorICogVGhpcyBmdW5jdGlvbiBmb3JjZXMgdGhlIHNvZnR3YXJlIHJlc2V0IG9mIHRoZSBjb21wbGV0ZSBIV0lDQVAgZGV2aWNlLgorICogQWxsIHRoZSByZWdpc3RlcnMgd2lsbCByZXR1cm4gdG8gdGhlIGRlZmF1bHQgdmFsdWUgYW5kIHRoZSBGSUZPIGlzIGFsc28KKyAqIGZsdXNoZWQgYXMgYSBwYXJ0IG9mIHRoaXMgc29mdHdhcmUgcmVzZXQuCisgKi8KK3ZvaWQgZmlmb19pY2FwX3Jlc2V0KHN0cnVjdCBod2ljYXBfZHJ2ZGF0YSAqZHJ2ZGF0YSkKK3sKKwl1MzIgcmVnX2RhdGE7CisJLyoKKwkgKiBSZXNldCB0aGUgZGV2aWNlIGJ5IHNldHRpbmcvY2xlYXJpbmcgdGhlIFJFU0VUIGJpdCBpbiB0aGUKKwkgKiBDb250cm9sIFJlZ2lzdGVyLgorCSAqLworCXJlZ19kYXRhID0gaW5fYmUzMihkcnZkYXRhLT5iYXNlX2FkZHJlc3MgKyBYSElfQ1JfT0ZGU0VUKTsKKworCW91dF9iZTMyKGRydmRhdGEtPmJhc2VfYWRkcmVzcyArIFhISV9DUl9PRkZTRVQsCisJCQkJcmVnX2RhdGEgfCBYSElfQ1JfU1dfUkVTRVRfTUFTSyk7CisKKwlvdXRfYmUzMihkcnZkYXRhLT5iYXNlX2FkZHJlc3MgKyBYSElfQ1JfT0ZGU0VULAorCQkJCXJlZ19kYXRhICYgKH5YSElfQ1JfU1dfUkVTRVRfTUFTSykpOworCit9CisKKy8qKgorICogZmlmb19pY2FwX2ZsdXNoX2ZpZm86IFRoaXMgZnVuY3Rpb24gZmx1c2hlcyB0aGUgRklGT3MgaW4gdGhlIGRldmljZS4KKyAqIEBwYXJhbWV0ZXIgZHJ2ZGF0YTogYSBwb2ludGVyIHRvIHRoZSBkcnZkYXRhLgorICovCit2b2lkIGZpZm9faWNhcF9mbHVzaF9maWZvKHN0cnVjdCBod2ljYXBfZHJ2ZGF0YSAqZHJ2ZGF0YSkKK3sKKwl1MzIgcmVnX2RhdGE7CisJLyoKKwkgKiBGbHVzaCB0aGUgRklGTyBieSBzZXR0aW5nL2NsZWFyaW5nIHRoZSBGSUZPIENsZWFyIGJpdCBpbiB0aGUKKwkgKiBDb250cm9sIFJlZ2lzdGVyLgorCSAqLworCXJlZ19kYXRhID0gaW5fYmUzMihkcnZkYXRhLT5iYXNlX2FkZHJlc3MgKyBYSElfQ1JfT0ZGU0VUKTsKKworCW91dF9iZTMyKGRydmRhdGEtPmJhc2VfYWRkcmVzcyArIFhISV9DUl9PRkZTRVQsCisJCQkJcmVnX2RhdGEgfCBYSElfQ1JfRklGT19DTFJfTUFTSyk7CisKKwlvdXRfYmUzMihkcnZkYXRhLT5iYXNlX2FkZHJlc3MgKyBYSElfQ1JfT0ZGU0VULAorCQkJCXJlZ19kYXRhICYgKH5YSElfQ1JfRklGT19DTFJfTUFTSykpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIveGlsaW54X2h3aWNhcC9maWZvX2ljYXAuaCBiL2RyaXZlcnMvY2hhci94aWxpbnhfaHdpY2FwL2ZpZm9faWNhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMzA2OGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIveGlsaW54X2h3aWNhcC9maWZvX2ljYXAuaApAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgQXV0aG9yOiBYaWxpbngsIEluYy4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICAgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICAgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgWElMSU5YIElTIFBST1ZJRElORyBUSElTIERFU0lHTiwgQ09ERSwgT1IgSU5GT1JNQVRJT04gIkFTIElTIgorICogICAgIEFTIEEgQ09VUlRFU1kgVE8gWU9VLCBTT0xFTFkgRk9SIFVTRSBJTiBERVZFTE9QSU5HIFBST0dSQU1TIEFORAorICogICAgIFNPTFVUSU9OUyBGT1IgWElMSU5YIERFVklDRVMuICBCWSBQUk9WSURJTkcgVEhJUyBERVNJR04sIENPREUsCisgKiAgICAgT1IgSU5GT1JNQVRJT04gQVMgT05FIFBPU1NJQkxFIElNUExFTUVOVEFUSU9OIE9GIFRISVMgRkVBVFVSRSwKKyAqICAgICBBUFBMSUNBVElPTiBPUiBTVEFOREFSRCwgWElMSU5YIElTIE1BS0lORyBOTyBSRVBSRVNFTlRBVElPTgorICogICAgIFRIQVQgVEhJUyBJTVBMRU1FTlRBVElPTiBJUyBGUkVFIEZST00gQU5ZIENMQUlNUyBPRiBJTkZSSU5HRU1FTlQsCisgKiAgICAgQU5EIFlPVSBBUkUgUkVTUE9OU0lCTEUgRk9SIE9CVEFJTklORyBBTlkgUklHSFRTIFlPVSBNQVkgUkVRVUlSRQorICogICAgIEZPUiBZT1VSIElNUExFTUVOVEFUSU9OLiAgWElMSU5YIEVYUFJFU1NMWSBESVNDTEFJTVMgQU5ZCisgKiAgICAgV0FSUkFOVFkgV0hBVFNPRVZFUiBXSVRIIFJFU1BFQ1QgVE8gVEhFIEFERVFVQUNZIE9GIFRIRQorICogICAgIElNUExFTUVOVEFUSU9OLCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIEFOWSBXQVJSQU5USUVTIE9SCisgKiAgICAgUkVQUkVTRU5UQVRJT05TIFRIQVQgVEhJUyBJTVBMRU1FTlRBVElPTiBJUyBGUkVFIEZST00gQ0xBSU1TIE9GCisgKiAgICAgSU5GUklOR0VNRU5ULCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiAgICAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqICAgICBYaWxpbnggcHJvZHVjdHMgYXJlIG5vdCBpbnRlbmRlZCBmb3IgdXNlIGluIGxpZmUgc3VwcG9ydCBhcHBsaWFuY2VzLAorICogICAgIGRldmljZXMsIG9yIHN5c3RlbXMuIFVzZSBpbiBzdWNoIGFwcGxpY2F0aW9ucyBpcyBleHByZXNzbHkgcHJvaGliaXRlZC4KKyAqCisgKiAgICAgKGMpIENvcHlyaWdodCAyMDA3LTIwMDggWGlsaW54IEluYy4KKyAqICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogICAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgICAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFhJTElOWF9GSUZPX0lDQVBfSF8JLyogcHJldmVudCBjaXJjdWxhciBpbmNsdXNpb25zICovCisjZGVmaW5lIFhJTElOWF9GSUZPX0lDQVBfSF8JLyogYnkgdXNpbmcgcHJvdGVjdGlvbiBtYWNyb3MgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgInhpbGlueF9od2ljYXAuaCIKKworLyogUmVhZHMgaW50ZWdlcnMgZnJvbSB0aGUgZGV2aWNlIGludG8gdGhlIHN0b3JhZ2UgYnVmZmVyLiAqLworaW50IGZpZm9faWNhcF9nZXRfY29uZmlndXJhdGlvbigKKwkJc3RydWN0IGh3aWNhcF9kcnZkYXRhICpkcnZkYXRhLAorCQl1MzIgKkZyYW1lQnVmZmVyLAorCQl1MzIgTnVtV29yZHMpOworCisvKiBXcml0ZXMgaW50ZWdlcnMgdG8gdGhlIGRldmljZSBmcm9tIHRoZSBzdG9yYWdlIGJ1ZmZlci4gKi8KK2ludCBmaWZvX2ljYXBfc2V0X2NvbmZpZ3VyYXRpb24oCisJCXN0cnVjdCBod2ljYXBfZHJ2ZGF0YSAqZHJ2ZGF0YSwKKwkJdTMyICpGcmFtZUJ1ZmZlciwKKwkJdTMyIE51bVdvcmRzKTsKKwordm9pZCBmaWZvX2ljYXBfcmVzZXQoc3RydWN0IGh3aWNhcF9kcnZkYXRhICpkcnZkYXRhKTsKK3ZvaWQgZmlmb19pY2FwX2ZsdXNoX2ZpZm8oc3RydWN0IGh3aWNhcF9kcnZkYXRhICpkcnZkYXRhKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIveGlsaW54X2h3aWNhcC94aWxpbnhfaHdpY2FwLmMgYi9kcml2ZXJzL2NoYXIveGlsaW54X2h3aWNhcC94aWxpbnhfaHdpY2FwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRmNmFlZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci94aWxpbnhfaHdpY2FwL3hpbGlueF9od2ljYXAuYwpAQCAtMCwwICsxLDkwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIEF1dGhvcjogWGlsaW54LCBJbmMuCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFhJTElOWCBJUyBQUk9WSURJTkcgVEhJUyBERVNJR04sIENPREUsIE9SIElORk9STUFUSU9OICJBUyBJUyIKKyAqICAgICBBUyBBIENPVVJURVNZIFRPIFlPVSwgU09MRUxZIEZPUiBVU0UgSU4gREVWRUxPUElORyBQUk9HUkFNUyBBTkQKKyAqICAgICBTT0xVVElPTlMgRk9SIFhJTElOWCBERVZJQ0VTLiAgQlkgUFJPVklESU5HIFRISVMgREVTSUdOLCBDT0RFLAorICogICAgIE9SIElORk9STUFUSU9OIEFTIE9ORSBQT1NTSUJMRSBJTVBMRU1FTlRBVElPTiBPRiBUSElTIEZFQVRVUkUsCisgKiAgICAgQVBQTElDQVRJT04gT1IgU1RBTkRBUkQsIFhJTElOWCBJUyBNQUtJTkcgTk8gUkVQUkVTRU5UQVRJT04KKyAqICAgICBUSEFUIFRISVMgSU1QTEVNRU5UQVRJT04gSVMgRlJFRSBGUk9NIEFOWSBDTEFJTVMgT0YgSU5GUklOR0VNRU5ULAorICogICAgIEFORCBZT1UgQVJFIFJFU1BPTlNJQkxFIEZPUiBPQlRBSU5JTkcgQU5ZIFJJR0hUUyBZT1UgTUFZIFJFUVVJUkUKKyAqICAgICBGT1IgWU9VUiBJTVBMRU1FTlRBVElPTi4gIFhJTElOWCBFWFBSRVNTTFkgRElTQ0xBSU1TIEFOWQorICogICAgIFdBUlJBTlRZIFdIQVRTT0VWRVIgV0lUSCBSRVNQRUNUIFRPIFRIRSBBREVRVUFDWSBPRiBUSEUKKyAqICAgICBJTVBMRU1FTlRBVElPTiwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBBTlkgV0FSUkFOVElFUyBPUgorICogICAgIFJFUFJFU0VOVEFUSU9OUyBUSEFUIFRISVMgSU1QTEVNRU5UQVRJT04gSVMgRlJFRSBGUk9NIENMQUlNUyBPRgorICogICAgIElORlJJTkdFTUVOVCwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogICAgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiAgICAgWGlsaW54IHByb2R1Y3RzIGFyZSBub3QgaW50ZW5kZWQgZm9yIHVzZSBpbiBsaWZlIHN1cHBvcnQgYXBwbGlhbmNlcywKKyAqICAgICBkZXZpY2VzLCBvciBzeXN0ZW1zLiBVc2UgaW4gc3VjaCBhcHBsaWNhdGlvbnMgaXMgZXhwcmVzc2x5IHByb2hpYml0ZWQuCisgKgorICogICAgIChjKSBDb3B5cmlnaHQgMjAwMiBYaWxpbnggSW5jLiwgU3lzdGVtcyBFbmdpbmVlcmluZyBHcm91cAorICogICAgIChjKSBDb3B5cmlnaHQgMjAwNCBYaWxpbnggSW5jLiwgU3lzdGVtcyBFbmdpbmVlcmluZyBHcm91cAorICogICAgIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IFhpbGlueCBJbmMuCisgKiAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICAgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogICAgIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoaXMgaXMgdGhlIGNvZGUgYmVoaW5kIC9kZXYveGlsaW54X2ljYXAgLS0gaXQgYWxsb3dzIGEgdXNlci1zcGFjZQorICogYXBwbGljYXRpb24gdG8gdXNlIHRoZSBYaWxpbnggSUNBUCBzdWJzeXN0ZW0uCisgKgorICogVGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGFyZSBwb3NzaWJsZToKKyAqCisgKiBvcGVuICAgICAgICAgb3BlbiB0aGUgcG9ydCBhbmQgaW5pdGlhbGl6ZSBmb3IgYWNjZXNzLgorICogcmVsZWFzZSAgICAgIHJlbGVhc2UgcG9ydAorICogd3JpdGUgICAgICAgIFdyaXRlIGEgYml0c3RyZWFtIHRvIHRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3Nvci4KKyAqIHJlYWQgICAgICAgICBSZWFkIGEgZGF0YSBzdHJlYW0gZnJvbSB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzb3IuCisgKgorICogQWZ0ZXIgYmVpbmcgb3BlbmVkLCB0aGUgcG9ydCBpcyBpbml0aWFsaXplZCBhbmQgYWNjZXNzZWQgdG8gYXZvaWQgYQorICogY29ycnVwdGVkIGZpcnN0IHJlYWQgd2hpY2ggbWF5IG9jY3VyIHdpdGggc29tZSBoYXJkd2FyZS4gIFRoZSBwb3J0CisgKiBpcyBsZWZ0IGluIGEgZGVzeW5jaGVkIHN0YXRlLCByZXF1aXJpbmcgdGhhdCBhIHN5bmNoIHNlcXVlbmNlIGJlCisgKiB0cmFuc21pdHRlZCBiZWZvcmUgYW55IHZhbGlkIGNvbmZpZ3VyYXRpb24gZGF0YS4gIEEgdXNlciB3aWxsIGhhdmUKKyAqIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIGRldmljZSB3aGlsZSBpdCByZW1haW5zIG9wZW4sIGFuZCB0aGUgc3RhdGUKKyAqIG9mIHRoZSBJQ0FQIGNhbm5vdCBiZSBndWFyYW50ZWVkIGFmdGVyIHRoZSBkZXZpY2UgaXMgY2xvc2VkLiAgTm90ZQorICogdGhhdCBhIGNvbXBsZXRlIHJlc2V0IG9mIHRoZSBjb3JlIGFuZCB0aGUgc3RhdGUgb2YgdGhlIElDQVAgY2Fubm90CisgKiBiZSBwZXJmb3JtZWQgb24gbWFueSB2ZXJzaW9ucyBvZiB0aGUgY29yZXMsIGhlbmNlIHVzZXJzIG9mIHRoaXMKKyAqIGRldmljZSBzaG91bGQgYXZvaWQgbWFraW5nIGluY29uc2lzdGVudCBhY2Nlc3NlcyB0byB0aGUgZGV2aWNlLiAgSW4KKyAqIHBhcnRpY3VsYXIsIGFjY2Vzc2luZyB0aGUgcmVhZCBpbnRlcmZhY2UsIHdpdGhvdXQgZmlyc3QgZ2VuZXJhdGluZworICogYSB3cml0ZSBjb250YWluaW5nIGEgcmVhZGJhY2sgcGFja2V0IGNhbiBsZWF2ZSB0aGUgSUNBUCBpbiBhbgorICogaW5hY2Nlc3NpYmxlIHN0YXRlLgorICoKKyAqIE5vdGUgdGhhdCBpbiBvcmRlciB0byB1c2UgdGhlIHJlYWQgaW50ZXJmYWNlLCBpdCBpcyBmaXJzdCBuZWNlc3NhcnkKKyAqIHRvIHdyaXRlIGEgcmVxdWVzdCBwYWNrZXQgdG8gdGhlIHdyaXRlIGludGVyZmFjZS4gIGkuZS4sIGl0IGlzIG5vdAorICogcG9zc2libGUgdG8gc2ltcGx5IHJlYWRiYWNrIHRoZSBiaXRzdHJlYW0gKG9yIGFueSBjb25maWd1cmF0aW9uCisgKiBiaXRzKSBmcm9tIGEgZGV2aWNlIHdpdGhvdXQgc3BlY2lmaWNhbGx5IHJlcXVlc3RpbmcgdGhlbSBmaXJzdC4KKyAqIFRoZSBjb2RlIHRvIGNyYWZ0IHN1Y2ggcGFja2V0cyBpcyBpbnRlbmRlZCB0byBiZSBwYXJ0IG9mIHRoZQorICogdXNlci1zcGFjZSBhcHBsaWNhdGlvbiBjb2RlIHRoYXQgdXNlcyB0aGlzIGRldmljZS4gIFRoZSBzaW1wbGVzdAorICogd2F5IHRvIHVzZSB0aGlzIGludGVyZmFjZSBpcyBzaW1wbHk6CisgKgorICogY3AgZm9vLmJpdCAvZGV2L3hpbGlueF9pY2FwCisgKgorICogTm90ZSB0aGF0IHVubGVzcyBmb28uYml0IGlzIGFuIGFwcHJvcHJpYXRlbHkgY29uc3RydWN0ZWQgcGFydGlhbAorICogYml0c3RyZWFtLCB0aGlzIGhhcyBhIGhpZ2ggbGlrZWx5aG9vZCBvZiBvdmVyd3JpdGluZyB0aGUgZGVzaWduCisgKiBjdXJyZW50bHkgcHJvZ3JhbW1lZCBpbiB0aGUgRlBHQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpZmRlZiBDT05GSUdfT0YKKy8qIEZvciBvcGVuIGZpcm13YXJlLiAqLworI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInhpbGlueF9od2ljYXAuaCIKKyNpbmNsdWRlICJidWZmZXJfaWNhcC5oIgorI2luY2x1ZGUgImZpZm9faWNhcC5oIgorCisjZGVmaW5lIERSSVZFUl9OQU1FICJ4aWxpbnhfaWNhcCIKKworI2RlZmluZSBIV0lDQVBfUkVHUyAgICgweDEwMDAwKQorCisvKiBkeW5hbWljYWxseSBhbGxvY2F0ZSBkZXZpY2UgbnVtYmVyICovCitzdGF0aWMgaW50IHhod2ljYXBfbWFqb3I7CitzdGF0aWMgaW50IHhod2ljYXBfbWlub3I7CisjZGVmaW5lIEhXSUNBUF9ERVZJQ0VTIDEKKworbW9kdWxlX3BhcmFtKHhod2ljYXBfbWFqb3IsIGludCwgU19JUlVHTyk7Cittb2R1bGVfcGFyYW0oeGh3aWNhcF9taW5vciwgaW50LCBTX0lSVUdPKTsKKworLyogQW4gYXJyYXksIHdoaWNoIGlzIHNldCB0byB0cnVlIHdoZW4gdGhlIGRldmljZSBpcyByZWdpc3RlcmVkLiAqLworc3RhdGljIGJvb2wgcHJvYmVkX2RldmljZXNbSFdJQ0FQX0RFVklDRVNdOworCitzdGF0aWMgc3RydWN0IGNsYXNzICppY2FwX2NsYXNzOworCisjZGVmaW5lIFVOSU1QTEVNRU5URUQgMHhGRkZGCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29uZmlnX3JlZ2lzdGVycyB2Ml9jb25maWdfcmVnaXN0ZXJzID0geworCS5DUkMgPSAwLAorCS5GQVIgPSAxLAorCS5GRFJJID0gMiwKKwkuRkRSTyA9IDMsCisJLkNNRCA9IDQsCisJLkNUTCA9IDUsCisJLk1BU0sgPSA2LAorCS5TVEFUID0gNywKKwkuTE9VVCA9IDgsCisJLkNPUiA9IDksCisJLk1GV1IgPSAxMCwKKwkuRkxSID0gMTEsCisJLktFWSA9IDEyLAorCS5DQkMgPSAxMywKKwkuSURDT0RFID0gMTQsCisJLkFYU1MgPSBVTklNUExFTUVOVEVELAorCS5DMFJfMSA9IFVOSU1QTEVNRU5URUQsCisJLkNTT0IgPSBVTklNUExFTUVOVEVELAorCS5XQlNUQVIgPSBVTklNUExFTUVOVEVELAorCS5USU1FUiA9IFVOSU1QTEVNRU5URUQsCisJLkJPT1RTVFMgPSBVTklNUExFTUVOVEVELAorCS5DVExfMSA9IFVOSU1QTEVNRU5URUQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbmZpZ19yZWdpc3RlcnMgdjRfY29uZmlnX3JlZ2lzdGVycyA9IHsKKwkuQ1JDID0gMCwKKwkuRkFSID0gMSwKKwkuRkRSSSA9IDIsCisJLkZEUk8gPSAzLAorCS5DTUQgPSA0LAorCS5DVEwgPSA1LAorCS5NQVNLID0gNiwKKwkuU1RBVCA9IDcsCisJLkxPVVQgPSA4LAorCS5DT1IgPSA5LAorCS5NRldSID0gMTAsCisJLkZMUiA9IFVOSU1QTEVNRU5URUQsCisJLktFWSA9IFVOSU1QTEVNRU5URUQsCisJLkNCQyA9IDExLAorCS5JRENPREUgPSAxMiwKKwkuQVhTUyA9IDEzLAorCS5DMFJfMSA9IFVOSU1QTEVNRU5URUQsCisJLkNTT0IgPSBVTklNUExFTUVOVEVELAorCS5XQlNUQVIgPSBVTklNUExFTUVOVEVELAorCS5USU1FUiA9IFVOSU1QTEVNRU5URUQsCisJLkJPT1RTVFMgPSBVTklNUExFTUVOVEVELAorCS5DVExfMSA9IFVOSU1QTEVNRU5URUQsCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBjb25maWdfcmVnaXN0ZXJzIHY1X2NvbmZpZ19yZWdpc3RlcnMgPSB7CisJLkNSQyA9IDAsCisJLkZBUiA9IDEsCisJLkZEUkkgPSAyLAorCS5GRFJPID0gMywKKwkuQ01EID0gNCwKKwkuQ1RMID0gNSwKKwkuTUFTSyA9IDYsCisJLlNUQVQgPSA3LAorCS5MT1VUID0gOCwKKwkuQ09SID0gOSwKKwkuTUZXUiA9IDEwLAorCS5GTFIgPSBVTklNUExFTUVOVEVELAorCS5LRVkgPSBVTklNUExFTUVOVEVELAorCS5DQkMgPSAxMSwKKwkuSURDT0RFID0gMTIsCisJLkFYU1MgPSAxMywKKwkuQzBSXzEgPSAxNCwKKwkuQ1NPQiA9IDE1LAorCS5XQlNUQVIgPSAxNiwKKwkuVElNRVIgPSAxNywKKwkuQk9PVFNUUyA9IDE4LAorCS5DVExfMSA9IDE5LAorfTsKKworLyoqCisgKiBod2ljYXBfY29tbWFuZF9kZXN5bmM6IFNlbmQgYSBERVNZTkMgY29tbWFuZCB0byB0aGUgSUNBUCBwb3J0LgorICogQHBhcmFtZXRlciBkcnZkYXRhOiBhIHBvaW50ZXIgdG8gdGhlIGRydmRhdGEuCisgKgorICogVGhpcyBjb21tYW5kIGRlc3luY2hyb25pemVzIHRoZSBJQ0FQIEFmdGVyIHRoaXMgY29tbWFuZCwgYQorICogYml0c3RyZWFtIGNvbnRhaW5pbmcgYSBOVUxMIHBhY2tldCwgZm9sbG93ZWQgYnkgYSBTWU5DSCBwYWNrZXQgaXMKKyAqIHJlcXVpcmVkIGJlZm9yZSB0aGUgSUNBUCB3aWxsIHJlY29nbml6ZSBjb21tYW5kcy4KKyAqLworaW50IGh3aWNhcF9jb21tYW5kX2Rlc3luYyhzdHJ1Y3QgaHdpY2FwX2RydmRhdGEgKmRydmRhdGEpCit7CisJdTMyIGJ1ZmZlcls0XTsKKwl1MzIgaW5kZXggPSAwOworCisJLyoKKwkgKiBDcmVhdGUgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbiB0byB0aGUgSUNBUC4KKwkgKi8KKwlidWZmZXJbaW5kZXgrK10gPSBod2ljYXBfdHlwZV8xX3dyaXRlKGRydmRhdGEtPmNvbmZpZ19yZWdzLT5DTUQpIHwgMTsKKwlidWZmZXJbaW5kZXgrK10gPSBYSElfQ01EX0RFU1lOQ0g7CisJYnVmZmVyW2luZGV4KytdID0gWEhJX05PT1BfUEFDS0VUOworCWJ1ZmZlcltpbmRleCsrXSA9IFhISV9OT09QX1BBQ0tFVDsKKworCS8qCisJICogV3JpdGUgdGhlIGRhdGEgdG8gdGhlIEZJRk8gYW5kIGludGlhdGUgdGhlIHRyYW5zZmVyIG9mIGRhdGEgcHJlc2VudAorCSAqIGluIHRoZSBGSUZPIHRvIHRoZSBJQ0FQIGRldmljZS4KKwkgKi8KKwlyZXR1cm4gZHJ2ZGF0YS0+Y29uZmlnLT5zZXRfY29uZmlndXJhdGlvbihkcnZkYXRhLAorCQkJJmJ1ZmZlclswXSwgaW5kZXgpOworfQorCisvKioKKyAqIGh3aWNhcF9jb21tYW5kX2NhcHR1cmU6IFNlbmQgYSBDQVBUVVJFIGNvbW1hbmQgdG8gdGhlIElDQVAgcG9ydC4KKyAqIEBwYXJhbWV0ZXIgZHJ2ZGF0YTogYSBwb2ludGVyIHRvIHRoZSBkcnZkYXRhLgorICoKKyAqIFRoaXMgY29tbWFuZCBjYXB0dXJlcyBhbGwgb2YgdGhlIGZsaXAgZmxvcCBzdGF0ZXMgc28gdGhleSB3aWxsIGJlCisgKiBhdmFpbGFibGUgZHVyaW5nIHJlYWRiYWNrLiAgT25lIGNhbiB1c2UgdGhpcyBjb21tYW5kIGluc3RlYWQgb2YKKyAqIGVuYWJsaW5nIHRoZSBDQVBUVVJFIGJsb2NrIGluIHRoZSBkZXNpZ24uCisgKi8KK2ludCBod2ljYXBfY29tbWFuZF9jYXB0dXJlKHN0cnVjdCBod2ljYXBfZHJ2ZGF0YSAqZHJ2ZGF0YSkKK3sKKwl1MzIgYnVmZmVyWzddOworCXUzMiBpbmRleCA9IDA7CisKKwkvKgorCSAqIENyZWF0ZSB0aGUgZGF0YSB0byBiZSB3cml0dGVuIHRvIHRoZSBJQ0FQLgorCSAqLworCWJ1ZmZlcltpbmRleCsrXSA9IFhISV9EVU1NWV9QQUNLRVQ7CisJYnVmZmVyW2luZGV4KytdID0gWEhJX1NZTkNfUEFDS0VUOworCWJ1ZmZlcltpbmRleCsrXSA9IFhISV9OT09QX1BBQ0tFVDsKKwlidWZmZXJbaW5kZXgrK10gPSBod2ljYXBfdHlwZV8xX3dyaXRlKGRydmRhdGEtPmNvbmZpZ19yZWdzLT5DTUQpIHwgMTsKKwlidWZmZXJbaW5kZXgrK10gPSBYSElfQ01EX0dDQVBUVVJFOworCWJ1ZmZlcltpbmRleCsrXSA9IFhISV9EVU1NWV9QQUNLRVQ7CisJYnVmZmVyW2luZGV4KytdID0gWEhJX0RVTU1ZX1BBQ0tFVDsKKworCS8qCisJICogV3JpdGUgdGhlIGRhdGEgdG8gdGhlIEZJRk8gYW5kIGludGlhdGUgdGhlIHRyYW5zZmVyIG9mIGRhdGEKKwkgKiBwcmVzZW50IGluIHRoZSBGSUZPIHRvIHRoZSBJQ0FQIGRldmljZS4KKwkgKi8KKwlyZXR1cm4gZHJ2ZGF0YS0+Y29uZmlnLT5zZXRfY29uZmlndXJhdGlvbihkcnZkYXRhLAorCQkJJmJ1ZmZlclswXSwgaW5kZXgpOworCit9CisKKy8qKgorICogaHdpY2FwX2dldF9jb25maWd1cmF0aW9uX3JlZ2lzdGVyOiBRdWVyeSBhIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuCisgKiBAcGFyYW1ldGVyIGRydmRhdGE6IGEgcG9pbnRlciB0byB0aGUgZHJ2ZGF0YS4KKyAqIEBwYXJhbWV0ZXIgcmVnOiBhIGNvbnN0YW50IHdoaWNoIHJlcHJlc2VudHMgdGhlIGNvbmZpZ3VyYXRpb24KKyAqCQlyZWdpc3RlciB2YWx1ZSB0byBiZSByZXR1cm5lZC4KKyAqIAkJRXhhbXBsZXM6ICBYSElfSURDT0RFLCBYSElfRkxSLgorICogQHBhcmFtZXRlciBSZWdEYXRhOiByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXIuCisgKgorICogU2VuZHMgYSBxdWVyeSBwYWNrZXQgdG8gdGhlIElDQVAgYW5kIHRoZW4gcmVjZWl2ZXMgdGhlIHJlc3BvbnNlLgorICogVGhlIGljYXAgaXMgbGVmdCBpbiBTeW5jaGVkIHN0YXRlLgorICovCitpbnQgaHdpY2FwX2dldF9jb25maWd1cmF0aW9uX3JlZ2lzdGVyKHN0cnVjdCBod2ljYXBfZHJ2ZGF0YSAqZHJ2ZGF0YSwKKwkJdTMyIHJlZywgdTMyICpSZWdEYXRhKQoreworCWludCBzdGF0dXM7CisJdTMyIGJ1ZmZlcls2XTsKKwl1MzIgaW5kZXggPSAwOworCisJLyoKKwkgKiBDcmVhdGUgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbiB0byB0aGUgSUNBUC4KKwkgKi8KKwlidWZmZXJbaW5kZXgrK10gPSBYSElfRFVNTVlfUEFDS0VUOworCWJ1ZmZlcltpbmRleCsrXSA9IFhISV9TWU5DX1BBQ0tFVDsKKwlidWZmZXJbaW5kZXgrK10gPSBYSElfTk9PUF9QQUNLRVQ7CisJYnVmZmVyW2luZGV4KytdID0gaHdpY2FwX3R5cGVfMV9yZWFkKHJlZykgfCAxOworCWJ1ZmZlcltpbmRleCsrXSA9IFhISV9OT09QX1BBQ0tFVDsKKwlidWZmZXJbaW5kZXgrK10gPSBYSElfTk9PUF9QQUNLRVQ7CisKKwkvKgorCSAqIFdyaXRlIHRoZSBkYXRhIHRvIHRoZSBGSUZPIGFuZCBpbnRpYXRlIHRoZSB0cmFuc2ZlciBvZiBkYXRhIHByZXNlbnQKKwkgKiBpbiB0aGUgRklGTyB0byB0aGUgSUNBUCBkZXZpY2UuCisJICovCisJc3RhdHVzID0gZHJ2ZGF0YS0+Y29uZmlnLT5zZXRfY29uZmlndXJhdGlvbihkcnZkYXRhLAorCQkJJmJ1ZmZlclswXSwgaW5kZXgpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisKKwkvKgorCSAqIFJlYWQgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKwkgKi8KKwlzdGF0dXMgPSBkcnZkYXRhLT5jb25maWctPmdldF9jb25maWd1cmF0aW9uKGRydmRhdGEsIFJlZ0RhdGEsIDEpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGh3aWNhcF9pbml0aWFsaXplX2h3aWNhcChzdHJ1Y3QgaHdpY2FwX2RydmRhdGEgKmRydmRhdGEpCit7CisJaW50IHN0YXR1czsKKwl1MzIgaWRjb2RlOworCisJZGV2X2RiZyhkcnZkYXRhLT5kZXYsICJpbml0aWFsaXppbmdcbiIpOworCisJLyogQWJvcnQgYW55IGN1cnJlbnQgdHJhbnNhY3Rpb24sIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIHRoZQorCSAqIElDQVAgaW4gYSBnb29kIHN0YXRlLiAqLworCWRldl9kYmcoZHJ2ZGF0YS0+ZGV2LCAiUmVzZXQuLi5cbiIpOworCWRydmRhdGEtPmNvbmZpZy0+cmVzZXQoZHJ2ZGF0YSk7CisKKwlkZXZfZGJnKGRydmRhdGEtPmRldiwgIkRlc3luYy4uLlxuIik7CisJc3RhdHVzID0gaHdpY2FwX2NvbW1hbmRfZGVzeW5jKGRydmRhdGEpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisKKwkvKiBBdHRlbXB0IHRvIHJlYWQgdGhlIElEQ09ERSBmcm9tIElDQVAuICBUaGlzCisJICogbWF5IG5vdCBiZSByZXR1cm5lZCBjb3JyZWN0bHksIGR1ZSB0byB0aGUgZGVzaWduIG9mIHRoZQorCSAqIGhhcmR3YXJlLgorCSAqLworCWRldl9kYmcoZHJ2ZGF0YS0+ZGV2LCAiUmVhZGluZyBJRENPREUuLi5cbiIpOworCXN0YXR1cyA9IGh3aWNhcF9nZXRfY29uZmlndXJhdGlvbl9yZWdpc3RlcigKKwkJCWRydmRhdGEsIGRydmRhdGEtPmNvbmZpZ19yZWdzLT5JRENPREUsICZpZGNvZGUpOworCWRldl9kYmcoZHJ2ZGF0YS0+ZGV2LCAiSURDT0RFID0gJXhcbiIsIGlkY29kZSk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCWRldl9kYmcoZHJ2ZGF0YS0+ZGV2LCAiRGVzeW5jLi4uXG4iKTsKKwlzdGF0dXMgPSBod2ljYXBfY29tbWFuZF9kZXN5bmMoZHJ2ZGF0YSk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAoraHdpY2FwX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGh3aWNhcF9kcnZkYXRhICpkcnZkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNzaXplX3QgYnl0ZXNfdG9fcmVhZCA9IDA7CisJdTMyICprYnVmOworCXUzMiB3b3JkczsKKwl1MzIgYnl0ZXNfcmVtYWluaW5nOworCWludCBzdGF0dXM7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkcnZkYXRhLT5zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJaWYgKGRydmRhdGEtPnJlYWRfYnVmZmVyX2luX3VzZSkgeworCQkvKiBJZiB0aGVyZSBhcmUgbGVmdG92ZXIgYnl0ZXMgaW4gdGhlIGJ1ZmZlciwganVzdCAqLworCQkvKiByZXR1cm4gdGhlbSBhbmQgZG9uJ3QgdHJ5IHRvIHJlYWQgbW9yZSBmcm9tIHRoZSAqLworCQkvKiBJQ0FQIGRldmljZS4gKi8KKwkJYnl0ZXNfdG9fcmVhZCA9CisJCQkoY291bnQgPCBkcnZkYXRhLT5yZWFkX2J1ZmZlcl9pbl91c2UpID8gY291bnQgOgorCQkJZHJ2ZGF0YS0+cmVhZF9idWZmZXJfaW5fdXNlOworCisJCS8qIFJldHVybiB0aGUgZGF0YSBjdXJyZW50bHkgaW4gdGhlIHJlYWQgYnVmZmVyLiAqLworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgZHJ2ZGF0YS0+cmVhZF9idWZmZXIsIGJ5dGVzX3RvX3JlYWQpKSB7CisJCQlzdGF0dXMgPSAtRUZBVUxUOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlkcnZkYXRhLT5yZWFkX2J1ZmZlcl9pbl91c2UgLT0gYnl0ZXNfdG9fcmVhZDsKKwkJbWVtY3B5KGRydmRhdGEtPnJlYWRfYnVmZmVyICsgYnl0ZXNfdG9fcmVhZCwKKwkJCQlkcnZkYXRhLT5yZWFkX2J1ZmZlciwgNCAtIGJ5dGVzX3RvX3JlYWQpOworCX0gZWxzZSB7CisJCS8qIEdldCBuZXcgZGF0YSBmcm9tIHRoZSBJQ0FQLCBhbmQgcmV0dXJuIHdhcyB3YXMgcmVxdWVzdGVkLiAqLworCQlrYnVmID0gKHUzMiAqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCWlmICgha2J1ZikgeworCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQkvKiBUaGUgSUNBUCBkZXZpY2UgaXMgb25seSBhYmxlIHRvIHJlYWQgY29tcGxldGUgKi8KKwkJLyogd29yZHMuICBJZiBhIG51bWJlciBvZiBieXRlcyB0aGF0IGRvIG5vdCBjb3JyZXNwb25kICovCisJCS8qIHRvIGNvbXBsZXRlIHdvcmRzIGlzIHJlcXVlc3RlZCwgdGhlbiB3ZSByZWFkIGVub3VnaCAqLworCQkvKiB3b3JkcyB0byBnZXQgdGhlIHJlcXVpcmVkIG51bWJlciBvZiBieXRlcywgYW5kIHRoZW4gKi8KKwkJLyogc2F2ZSB0aGUgcmVtYWluaW5nIGJ5dGVzIGZvciB0aGUgbmV4dCByZWFkLiAqLworCisJCS8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIHdvcmRzIHRvIHJlYWQsIHJvdW5kaW5nIHVwICovCisJCS8qIGlmIG5lY2Vzc2FyeS4gKi8KKwkJd29yZHMgPSAoKGNvdW50ICsgMykgPj4gMik7CisJCWJ5dGVzX3RvX3JlYWQgPSB3b3JkcyA8PCAyOworCisJCWlmIChieXRlc190b19yZWFkID4gUEFHRV9TSVpFKQorCQkJYnl0ZXNfdG9fcmVhZCA9IFBBR0VfU0laRTsKKworCQkvKiBFbnN1cmUgd2Ugb25seSByZWFkIGEgY29tcGxldGUgbnVtYmVyIG9mIHdvcmRzLiAqLworCQlieXRlc19yZW1haW5pbmcgPSBieXRlc190b19yZWFkICYgMzsKKwkJYnl0ZXNfdG9fcmVhZCAmPSB+MzsKKwkJd29yZHMgPSBieXRlc190b19yZWFkID4+IDI7CisKKwkJc3RhdHVzID0gZHJ2ZGF0YS0+Y29uZmlnLT5nZXRfY29uZmlndXJhdGlvbihkcnZkYXRhLAorCQkJCWtidWYsIHdvcmRzKTsKKworCQkvKiBJZiB3ZSBkaWRuJ3QgcmVhZCBjb3JyZWN0bHksIHRoZW4gYmFpbCBvdXQuICovCisJCWlmIChzdGF0dXMpIHsKKwkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylrYnVmKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQkvKiBJZiB3ZSBmYWlsIHRvIHJldHVybiB0aGUgZGF0YSB0byB0aGUgdXNlciwgdGhlbiBiYWlsIG91dC4gKi8KKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsIGtidWYsIGJ5dGVzX3RvX3JlYWQpKSB7CisJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpa2J1Zik7CisJCQlzdGF0dXMgPSAtRUZBVUxUOworCQkJZ290byBlcnJvcjsKKwkJfQorCQltZW1jcHkoa2J1ZiwgZHJ2ZGF0YS0+cmVhZF9idWZmZXIsIGJ5dGVzX3JlbWFpbmluZyk7CisJCWRydmRhdGEtPnJlYWRfYnVmZmVyX2luX3VzZSA9IGJ5dGVzX3JlbWFpbmluZzsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWtidWYpOworCX0KKwlzdGF0dXMgPSBieXRlc190b19yZWFkOworIGVycm9yOgorCXVwKCZkcnZkYXRhLT5zZW0pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBzc2l6ZV90Citod2ljYXBfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGh3aWNhcF9kcnZkYXRhICpkcnZkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNzaXplX3Qgd3JpdHRlbiA9IDA7CisJc3NpemVfdCBsZWZ0ID0gY291bnQ7CisJdTMyICprYnVmOworCXNzaXplX3QgbGVuOworCXNzaXplX3Qgc3RhdHVzOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZHJ2ZGF0YS0+c2VtKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWxlZnQgKz0gZHJ2ZGF0YS0+d3JpdGVfYnVmZmVyX2luX3VzZTsKKworCS8qIE9ubHkgd3JpdGUgbXVsdGlwbGVzIG9mIDQgYnl0ZXMuICovCisJaWYgKGxlZnQgPCA0KSB7CisJCXN0YXR1cyA9IDA7CisJCWdvdG8gZXJyb3I7CisJfQorCisJa2J1ZiA9ICh1MzIgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmICgha2J1ZikgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KKworCXdoaWxlIChsZWZ0ID4gMykgeworCQkvKiBvbmx5IHdyaXRlIG11bHRpcGxlcyBvZiA0IGJ5dGVzLCBzbyB0aGVyZSBtaWdodCAqLworCQkvKiBiZSBhcyBtYW55IGFzIDMgYnl0ZXMgbGVmdCAoYXQgdGhlIGVuZCkuICovCisJCWxlbiA9IGxlZnQ7CisKKwkJaWYgKGxlbiA+IFBBR0VfU0laRSkKKwkJCWxlbiA9IFBBR0VfU0laRTsKKwkJbGVuICY9IH4zOworCisJCWlmIChkcnZkYXRhLT53cml0ZV9idWZmZXJfaW5fdXNlKSB7CisJCQltZW1jcHkoa2J1ZiwgZHJ2ZGF0YS0+d3JpdGVfYnVmZmVyLAorCQkJCQlkcnZkYXRhLT53cml0ZV9idWZmZXJfaW5fdXNlKTsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigKKwkJCSAgICAoKChjaGFyICopa2J1ZikgKyAoZHJ2ZGF0YS0+d3JpdGVfYnVmZmVyX2luX3VzZSkpLAorCQkJICAgIGJ1ZiArIHdyaXR0ZW4sCisJCQkgICAgbGVuIC0gKGRydmRhdGEtPndyaXRlX2J1ZmZlcl9pbl91c2UpKSkgeworCQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylrYnVmKTsKKwkJCQlzdGF0dXMgPSAtRUZBVUxUOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoa2J1ZiwgYnVmICsgd3JpdHRlbiwgbGVuKSkgeworCQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylrYnVmKTsKKwkJCQlzdGF0dXMgPSAtRUZBVUxUOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCX0KKworCQlzdGF0dXMgPSBkcnZkYXRhLT5jb25maWctPnNldF9jb25maWd1cmF0aW9uKGRydmRhdGEsCisJCQkJa2J1ZiwgbGVuID4+IDIpOworCisJCWlmIChzdGF0dXMpIHsKKwkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylrYnVmKTsKKwkJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCQlnb3RvIGVycm9yOworCQl9CisJCWlmIChkcnZkYXRhLT53cml0ZV9idWZmZXJfaW5fdXNlKSB7CisJCQlsZW4gLT0gZHJ2ZGF0YS0+d3JpdGVfYnVmZmVyX2luX3VzZTsKKwkJCWxlZnQgLT0gZHJ2ZGF0YS0+d3JpdGVfYnVmZmVyX2luX3VzZTsKKwkJCWRydmRhdGEtPndyaXRlX2J1ZmZlcl9pbl91c2UgPSAwOworCQl9CisJCXdyaXR0ZW4gKz0gbGVuOworCQlsZWZ0IC09IGxlbjsKKwl9CisJaWYgKChsZWZ0ID4gMCkgJiYgKGxlZnQgPCA0KSkgeworCQlpZiAoIWNvcHlfZnJvbV91c2VyKGRydmRhdGEtPndyaXRlX2J1ZmZlciwKKwkJCQkJCWJ1ZiArIHdyaXR0ZW4sIGxlZnQpKSB7CisJCQlkcnZkYXRhLT53cml0ZV9idWZmZXJfaW5fdXNlID0gbGVmdDsKKwkJCXdyaXR0ZW4gKz0gbGVmdDsKKwkJCWxlZnQgPSAwOworCQl9CisJfQorCisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWtidWYpOworCXN0YXR1cyA9IHdyaXR0ZW47CisgZXJyb3I6CisJdXAoJmRydmRhdGEtPnNlbSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBod2ljYXBfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaHdpY2FwX2RydmRhdGEgKmRydmRhdGE7CisJaW50IHN0YXR1czsKKworCWRydmRhdGEgPSBjb250YWluZXJfb2YoaW5vZGUtPmlfY2Rldiwgc3RydWN0IGh3aWNhcF9kcnZkYXRhLCBjZGV2KTsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRydmRhdGEtPnNlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlpZiAoZHJ2ZGF0YS0+aXNfb3BlbikgeworCQlzdGF0dXMgPSAtRUJVU1k7CisJCWdvdG8gZXJyb3I7CisJfQorCisJc3RhdHVzID0gaHdpY2FwX2luaXRpYWxpemVfaHdpY2FwKGRydmRhdGEpOworCWlmIChzdGF0dXMpIHsKKwkJZGV2X2VycihkcnZkYXRhLT5kZXYsICJGYWlsZWQgdG8gb3BlbiBmaWxlIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZHJ2ZGF0YTsKKwlkcnZkYXRhLT53cml0ZV9idWZmZXJfaW5fdXNlID0gMDsKKwlkcnZkYXRhLT5yZWFkX2J1ZmZlcl9pbl91c2UgPSAwOworCWRydmRhdGEtPmlzX29wZW4gPSAxOworCisgZXJyb3I6CisJdXAoJmRydmRhdGEtPnNlbSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBod2ljYXBfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaHdpY2FwX2RydmRhdGEgKmRydmRhdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IGk7CisJaW50IHN0YXR1cyA9IDA7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkcnZkYXRhLT5zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJaWYgKGRydmRhdGEtPndyaXRlX2J1ZmZlcl9pbl91c2UpIHsKKwkJLyogRmx1c2ggd3JpdGUgYnVmZmVyLiAqLworCQlmb3IgKGkgPSBkcnZkYXRhLT53cml0ZV9idWZmZXJfaW5fdXNlOyBpIDwgNDsgaSsrKQorCQkJZHJ2ZGF0YS0+d3JpdGVfYnVmZmVyW2ldID0gMDsKKworCQlzdGF0dXMgPSBkcnZkYXRhLT5jb25maWctPnNldF9jb25maWd1cmF0aW9uKGRydmRhdGEsCisJCQkJKHUzMiAqKSBkcnZkYXRhLT53cml0ZV9idWZmZXIsIDEpOworCQlpZiAoc3RhdHVzKQorCQkJZ290byBlcnJvcjsKKwl9CisKKwlzdGF0dXMgPSBod2ljYXBfY29tbWFuZF9kZXN5bmMoZHJ2ZGF0YSk7CisJaWYgKHN0YXR1cykKKwkJZ290byBlcnJvcjsKKworIGVycm9yOgorCWRydmRhdGEtPmlzX29wZW4gPSAwOworCXVwKCZkcnZkYXRhLT5zZW0pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGh3aWNhcF9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS53cml0ZSA9IGh3aWNhcF93cml0ZSwKKwkucmVhZCA9IGh3aWNhcF9yZWFkLAorCS5vcGVuID0gaHdpY2FwX29wZW4sCisJLnJlbGVhc2UgPSBod2ljYXBfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGh3aWNhcF9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpZCwKKwkJY29uc3Qgc3RydWN0IHJlc291cmNlICpyZWdzX3JlcywKKwkJY29uc3Qgc3RydWN0IGh3aWNhcF9kcml2ZXJfY29uZmlnICpjb25maWcsCisJCWNvbnN0IHN0cnVjdCBjb25maWdfcmVnaXN0ZXJzICpjb25maWdfcmVncykKK3sKKwlkZXZfdCBkZXZ0OworCXN0cnVjdCBod2ljYXBfZHJ2ZGF0YSAqZHJ2ZGF0YSA9IE5VTEw7CisJaW50IHJldHZhbCA9IDA7CisKKwlkZXZfaW5mbyhkZXYsICJYaWxpbnggaWNhcCBwb3J0IGRyaXZlclxuIik7CisKKwlpZiAoaWQgPCAwKSB7CisJCWZvciAoaWQgPSAwOyBpZCA8IEhXSUNBUF9ERVZJQ0VTOyBpZCsrKQorCQkJaWYgKCFwcm9iZWRfZGV2aWNlc1tpZF0pCisJCQkJYnJlYWs7CisJfQorCWlmIChpZCA8IDAgfHwgaWQgPj0gSFdJQ0FQX0RFVklDRVMpIHsKKwkJZGV2X2VycihkZXYsICIlcyVpIHRvbyBsYXJnZVxuIiwgRFJJVkVSX05BTUUsIGlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChwcm9iZWRfZGV2aWNlc1tpZF0pIHsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgYXNzaWduIHRvICVzJWk7IGl0IGlzIGFscmVhZHkgaW4gdXNlXG4iLAorCQkJRFJJVkVSX05BTUUsIGlkKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlwcm9iZWRfZGV2aWNlc1tpZF0gPSAxOworCisJZGV2dCA9IE1LREVWKHhod2ljYXBfbWFqb3IsIHhod2ljYXBfbWlub3IgKyBpZCk7CisKKwlkcnZkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGh3aWNhcF9kcnZkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcnZkYXRhKSB7CisJCWRldl9lcnIoZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgZGV2aWNlIHByaXZhdGUgcmVjb3JkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldCgodm9pZCAqKWRydmRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgaHdpY2FwX2RydmRhdGEpKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCAodm9pZCAqKWRydmRhdGEpOworCisJaWYgKCFyZWdzX3JlcykgeworCQlkZXZfZXJyKGRldiwgIkNvdWxkbid0IGdldCByZWdpc3RlcnMgcmVzb3VyY2VcbiIpOworCQlyZXR2YWwgPSAtRUZBVUxUOworCQlnb3RvIGZhaWxlZDE7CisJfQorCisJZHJ2ZGF0YS0+bWVtX3N0YXJ0ID0gcmVnc19yZXMtPnN0YXJ0OworCWRydmRhdGEtPm1lbV9lbmQgPSByZWdzX3Jlcy0+ZW5kOworCWRydmRhdGEtPm1lbV9zaXplID0gcmVnc19yZXMtPmVuZCAtIHJlZ3NfcmVzLT5zdGFydCArIDE7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihkcnZkYXRhLT5tZW1fc3RhcnQsCisJCQkJCWRydmRhdGEtPm1lbV9zaXplLCBEUklWRVJfTkFNRSkpIHsKKwkJZGV2X2VycihkZXYsICJDb3VsZG4ndCBsb2NrIG1lbW9yeSByZWdpb24gYXQgJXBcbiIsCisJCQkodm9pZCAqKXJlZ3NfcmVzLT5zdGFydCk7CisJCXJldHZhbCA9IC1FQlVTWTsKKwkJZ290byBmYWlsZWQxOworCX0KKworCWRydmRhdGEtPmRldnQgPSBkZXZ0OworCWRydmRhdGEtPmRldiA9IGRldjsKKwlkcnZkYXRhLT5iYXNlX2FkZHJlc3MgPSBpb3JlbWFwKGRydmRhdGEtPm1lbV9zdGFydCwgZHJ2ZGF0YS0+bWVtX3NpemUpOworCWlmICghZHJ2ZGF0YS0+YmFzZV9hZGRyZXNzKSB7CisJCWRldl9lcnIoZGV2LCAiaW9yZW1hcCgpIGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbGVkMjsKKwl9CisKKwlkcnZkYXRhLT5jb25maWcgPSBjb25maWc7CisJZHJ2ZGF0YS0+Y29uZmlnX3JlZ3MgPSBjb25maWdfcmVnczsKKworCWluaXRfTVVURVgoJmRydmRhdGEtPnNlbSk7CisJZHJ2ZGF0YS0+aXNfb3BlbiA9IDA7CisKKwlkZXZfaW5mbyhkZXYsICJpb3JlbWFwICVseCB0byAlcCB3aXRoIHNpemUgJXhcbiIsCisJCSAodW5zaWduZWQgbG9uZyBpbnQpZHJ2ZGF0YS0+bWVtX3N0YXJ0LAorCQkJZHJ2ZGF0YS0+YmFzZV9hZGRyZXNzLCBkcnZkYXRhLT5tZW1fc2l6ZSk7CisKKwljZGV2X2luaXQoJmRydmRhdGEtPmNkZXYsICZod2ljYXBfZm9wcyk7CisJZHJ2ZGF0YS0+Y2Rldi5vd25lciA9IFRISVNfTU9EVUxFOworCXJldHZhbCA9IGNkZXZfYWRkKCZkcnZkYXRhLT5jZGV2LCBkZXZ0LCAxKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoZGV2LCAiY2Rldl9hZGQoKSBmYWlsZWRcbiIpOworCQlnb3RvIGZhaWxlZDM7CisJfQorCS8qICBkZXZmc19ta19jZGV2KGRldnQsIFNfSUZDSFJ8U19JUlVHT3xTX0lXVUdPLCBEUklWRVJfTkFNRSk7ICovCisJY2xhc3NfZGV2aWNlX2NyZWF0ZShpY2FwX2NsYXNzLCBOVUxMLCBkZXZ0LCBOVUxMLCBEUklWRVJfTkFNRSk7CisJcmV0dXJuIDA7CQkvKiBzdWNjZXNzICovCisKKyBmYWlsZWQzOgorCWlvdW5tYXAoZHJ2ZGF0YS0+YmFzZV9hZGRyZXNzKTsKKworIGZhaWxlZDI6CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlZ3NfcmVzLT5zdGFydCwgZHJ2ZGF0YS0+bWVtX3NpemUpOworCisgZmFpbGVkMToKKwlrZnJlZShkcnZkYXRhKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHdpY2FwX2RyaXZlcl9jb25maWcgYnVmZmVyX2ljYXBfY29uZmlnID0geworCS5nZXRfY29uZmlndXJhdGlvbiA9IGJ1ZmZlcl9pY2FwX2dldF9jb25maWd1cmF0aW9uLAorCS5zZXRfY29uZmlndXJhdGlvbiA9IGJ1ZmZlcl9pY2FwX3NldF9jb25maWd1cmF0aW9uLAorCS5yZXNldCA9IGJ1ZmZlcl9pY2FwX3Jlc2V0LAorfTsKKworc3RhdGljIHN0cnVjdCBod2ljYXBfZHJpdmVyX2NvbmZpZyBmaWZvX2ljYXBfY29uZmlnID0geworCS5nZXRfY29uZmlndXJhdGlvbiA9IGZpZm9faWNhcF9nZXRfY29uZmlndXJhdGlvbiwKKwkuc2V0X2NvbmZpZ3VyYXRpb24gPSBmaWZvX2ljYXBfc2V0X2NvbmZpZ3VyYXRpb24sCisJLnJlc2V0ID0gZmlmb19pY2FwX3Jlc2V0LAorfTsKKworc3RhdGljIGludCBfX2RldmV4aXQgaHdpY2FwX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGh3aWNhcF9kcnZkYXRhICpkcnZkYXRhOworCisJZHJ2ZGF0YSA9IChzdHJ1Y3QgaHdpY2FwX2RydmRhdGEgKilkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICghZHJ2ZGF0YSkKKwkJcmV0dXJuIDA7CisKKwljbGFzc19kZXZpY2VfZGVzdHJveShpY2FwX2NsYXNzLCBkcnZkYXRhLT5kZXZ0KTsKKwljZGV2X2RlbCgmZHJ2ZGF0YS0+Y2Rldik7CisJaW91bm1hcChkcnZkYXRhLT5iYXNlX2FkZHJlc3MpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihkcnZkYXRhLT5tZW1fc3RhcnQsIGRydmRhdGEtPm1lbV9zaXplKTsKKwlrZnJlZShkcnZkYXRhKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKwlwcm9iZWRfZGV2aWNlc1tNSU5PUihkZXYtPmRldnQpLXhod2ljYXBfbWlub3JdID0gMDsKKworCXJldHVybiAwOwkJLyogc3VjY2VzcyAqLworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBod2ljYXBfZHJ2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJY29uc3Qgc3RydWN0IGNvbmZpZ19yZWdpc3RlcnMgKnJlZ3M7CisJY29uc3QgY2hhciAqZmFtaWx5OworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBJdCdzIG1vc3QgbGlrZWx5IHRoYXQgd2UncmUgdXNpbmcgVjQsIGlmIHRoZSBmYW1pbHkgaXMgbm90CisJICAgc3BlY2lmaWVkICovCisJcmVncyA9ICZ2NF9jb25maWdfcmVnaXN0ZXJzOworCWZhbWlseSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJaWYgKGZhbWlseSkgeworCQlpZiAoIXN0cmNtcChmYW1pbHksICJ2aXJ0ZXgycCIpKSB7CisJCQlyZWdzID0gJnYyX2NvbmZpZ19yZWdpc3RlcnM7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChmYW1pbHksICJ2aXJ0ZXg0IikpIHsKKwkJCXJlZ3MgPSAmdjRfY29uZmlnX3JlZ2lzdGVyczsKKwkJfSBlbHNlIGlmICghc3RyY21wKGZhbWlseSwgInZpcnRleDUiKSkgeworCQkJcmVncyA9ICZ2NV9jb25maWdfcmVnaXN0ZXJzOworCQl9CisJfQorCisJcmV0dXJuIGh3aWNhcF9zZXR1cCgmcGRldi0+ZGV2LCBwZGV2LT5pZCwgcmVzLAorCQkJJmJ1ZmZlcl9pY2FwX2NvbmZpZywgcmVncyk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGh3aWNhcF9kcnZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIGh3aWNhcF9yZW1vdmUoJnBkZXYtPmRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGh3aWNhcF9wbGF0Zm9ybV9kcml2ZXIgPSB7CisJLnByb2JlID0gaHdpY2FwX2Rydl9wcm9iZSwKKwkucmVtb3ZlID0gaHdpY2FwX2Rydl9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5uYW1lID0gRFJJVkVSX05BTUUsCisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogT0YgYnVzIGJpbmRpbmcKKyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfT0YpCitzdGF0aWMgaW50IF9fZGV2aW5pdAoraHdpY2FwX29mX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzOworCWNvbnN0IHVuc2lnbmVkIGludCAqaWQ7CisJY29uc3QgY2hhciAqZmFtaWx5OworCWludCByYzsKKwljb25zdCBzdHJ1Y3QgaHdpY2FwX2RyaXZlcl9jb25maWcgKmNvbmZpZyA9IG1hdGNoLT5kYXRhOworCWNvbnN0IHN0cnVjdCBjb25maWdfcmVnaXN0ZXJzICpyZWdzOworCisJZGV2X2RiZygmb3AtPmRldiwgImh3aWNhcF9vZl9wcm9iZSglcCwgJXApXG4iLCBvcCwgbWF0Y2gpOworCisJcmMgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG9wLT5ub2RlLCAwLCAmcmVzKTsKKwlpZiAocmMpIHsKKwkJZGV2X2Vycigmb3AtPmRldiwgImludmFsaWQgYWRkcmVzc1xuIik7CisJCXJldHVybiByYzsKKwl9CisKKwlpZCA9IG9mX2dldF9wcm9wZXJ0eShvcC0+bm9kZSwgInBvcnQtbnVtYmVyIiwgTlVMTCk7CisKKwkvKiBJdCdzIG1vc3QgbGlrZWx5IHRoYXQgd2UncmUgdXNpbmcgVjQsIGlmIHRoZSBmYW1pbHkgaXMgbm90CisJICAgc3BlY2lmaWVkICovCisJcmVncyA9ICZ2NF9jb25maWdfcmVnaXN0ZXJzOworCWZhbWlseSA9IG9mX2dldF9wcm9wZXJ0eShvcC0+bm9kZSwgInhsbngsZmFtaWx5IiwgTlVMTCk7CisKKwlpZiAoZmFtaWx5KSB7CisJCWlmICghc3RyY21wKGZhbWlseSwgInZpcnRleDJwIikpIHsKKwkJCXJlZ3MgPSAmdjJfY29uZmlnX3JlZ2lzdGVyczsKKwkJfSBlbHNlIGlmICghc3RyY21wKGZhbWlseSwgInZpcnRleDQiKSkgeworCQkJcmVncyA9ICZ2NF9jb25maWdfcmVnaXN0ZXJzOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoZmFtaWx5LCAidmlydGV4NSIpKSB7CisJCQlyZWdzID0gJnY1X2NvbmZpZ19yZWdpc3RlcnM7CisJCX0KKwl9CisJcmV0dXJuIGh3aWNhcF9zZXR1cCgmb3AtPmRldiwgaWQgPyAqaWQgOiAtMSwgJnJlcywgY29uZmlnLAorCQkJcmVncyk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGh3aWNhcF9vZl9yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb3ApCit7CisJcmV0dXJuIGh3aWNhcF9yZW1vdmUoJm9wLT5kZXYpOworfQorCisvKiBNYXRjaCB0YWJsZSBmb3Igb2ZfcGxhdGZvcm0gYmluZGluZyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgX19kZXZpbml0IGh3aWNhcF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAieGxueCxvcGItaHdpY2FwLTEuMDAuYiIsIC5kYXRhID0gJmJ1ZmZlcl9pY2FwX2NvbmZpZ30sCisJeyAuY29tcGF0aWJsZSA9ICJ4bG54LHhwcy1od2ljYXAtMS4wMC5hIiwgLmRhdGEgPSAmZmlmb19pY2FwX2NvbmZpZ30sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgaHdpY2FwX29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgaHdpY2FwX29mX2RyaXZlciA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubmFtZSA9IERSSVZFUl9OQU1FLAorCS5tYXRjaF90YWJsZSA9IGh3aWNhcF9vZl9tYXRjaCwKKwkucHJvYmUgPSBod2ljYXBfb2ZfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGh3aWNhcF9vZl9yZW1vdmUpLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJJVkVSX05BTUUsCisJfSwKK307CisKKy8qIFJlZ2lzdHJhdGlvbiBoZWxwZXJzIHRvIGtlZXAgdGhlIG51bWJlciBvZiAjaWZkZWZzIHRvIGEgbWluaW11bSAqLworc3RhdGljIGlubGluZSBpbnQgX19kZXZpbml0IGh3aWNhcF9vZl9yZWdpc3Rlcih2b2lkKQoreworCXByX2RlYnVnKCJod2ljYXA6IGNhbGxpbmcgb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKClcbiIpOworCXJldHVybiBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJmh3aWNhcF9vZl9kcml2ZXIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19kZXZleGl0IGh3aWNhcF9vZl91bnJlZ2lzdGVyKHZvaWQpCit7CisJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJmh3aWNhcF9vZl9kcml2ZXIpOworfQorI2Vsc2UgLyogQ09ORklHX09GICovCisvKiBDT05GSUdfT0Ygbm90IGVuYWJsZWQ7IGRvIG5vdGhpbmcgaGVscGVycyAqLworc3RhdGljIGlubGluZSBpbnQgX19kZXZpbml0IGh3aWNhcF9vZl9yZWdpc3Rlcih2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgX19kZXZleGl0IGh3aWNhcF9vZl91bnJlZ2lzdGVyKHZvaWQpIHsgfQorI2VuZGlmIC8qIENPTkZJR19PRiAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBod2ljYXBfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlkZXZfdCBkZXZ0OworCWludCByZXR2YWw7CisKKwlpY2FwX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAieGlsaW54X2NvbmZpZyIpOworCisJaWYgKHhod2ljYXBfbWFqb3IpIHsKKwkJZGV2dCA9IE1LREVWKHhod2ljYXBfbWFqb3IsIHhod2ljYXBfbWlub3IpOworCQlyZXR2YWwgPSByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKAorCQkJCWRldnQsCisJCQkJSFdJQ0FQX0RFVklDRVMsCisJCQkJRFJJVkVSX05BTUUpOworCQlpZiAocmV0dmFsIDwgMCkKKwkJCXJldHVybiByZXR2YWw7CisJfSBlbHNlIHsKKwkJcmV0dmFsID0gYWxsb2NfY2hyZGV2X3JlZ2lvbigmZGV2dCwKKwkJCQl4aHdpY2FwX21pbm9yLAorCQkJCUhXSUNBUF9ERVZJQ0VTLAorCQkJCURSSVZFUl9OQU1FKTsKKwkJaWYgKHJldHZhbCA8IDApCisJCQlyZXR1cm4gcmV0dmFsOworCQl4aHdpY2FwX21ham9yID0gTUFKT1IoZGV2dCk7CisJfQorCisJcmV0dmFsID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZod2ljYXBfcGxhdGZvcm1fZHJpdmVyKTsKKworCWlmIChyZXR2YWwpCisJCWdvdG8gZmFpbGVkMTsKKworCXJldHZhbCA9IGh3aWNhcF9vZl9yZWdpc3RlcigpOworCisJaWYgKHJldHZhbCkKKwkJZ290byBmYWlsZWQyOworCisJcmV0dXJuIHJldHZhbDsKKworIGZhaWxlZDI6CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmh3aWNhcF9wbGF0Zm9ybV9kcml2ZXIpOworCisgZmFpbGVkMToKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2dCwgSFdJQ0FQX0RFVklDRVMpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGh3aWNhcF9tb2R1bGVfY2xlYW51cCh2b2lkKQoreworCWRldl90IGRldnQgPSBNS0RFVih4aHdpY2FwX21ham9yLCB4aHdpY2FwX21pbm9yKTsKKworCWNsYXNzX2Rlc3Ryb3koaWNhcF9jbGFzcyk7CisKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaHdpY2FwX3BsYXRmb3JtX2RyaXZlcik7CisKKwlod2ljYXBfb2ZfdW5yZWdpc3RlcigpOworCisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGRldnQsIEhXSUNBUF9ERVZJQ0VTKTsKK30KKworbW9kdWxlX2luaXQoaHdpY2FwX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KGh3aWNhcF9tb2R1bGVfY2xlYW51cCk7CisKK01PRFVMRV9BVVRIT1IoIlhpbGlueCwgSW5jOyBYaWxpbnggUmVzZWFyY2ggTGFicyBHcm91cCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJYaWxpbnggSUNBUCBQb3J0IERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3hpbGlueF9od2ljYXAveGlsaW54X2h3aWNhcC5oIGIvZHJpdmVycy9jaGFyL3hpbGlueF9od2ljYXAveGlsaW54X2h3aWNhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNzcxY2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIveGlsaW54X2h3aWNhcC94aWxpbnhfaHdpY2FwLmgKQEAgLTAsMCArMSwxOTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBBdXRob3I6IFhpbGlueCwgSW5jLgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogICAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogICAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICAgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBYSUxJTlggSVMgUFJPVklESU5HIFRISVMgREVTSUdOLCBDT0RFLCBPUiBJTkZPUk1BVElPTiAiQVMgSVMiCisgKiAgICAgQVMgQSBDT1VSVEVTWSBUTyBZT1UsIFNPTEVMWSBGT1IgVVNFIElOIERFVkVMT1BJTkcgUFJPR1JBTVMgQU5ECisgKiAgICAgU09MVVRJT05TIEZPUiBYSUxJTlggREVWSUNFUy4gIEJZIFBST1ZJRElORyBUSElTIERFU0lHTiwgQ09ERSwKKyAqICAgICBPUiBJTkZPUk1BVElPTiBBUyBPTkUgUE9TU0lCTEUgSU1QTEVNRU5UQVRJT04gT0YgVEhJUyBGRUFUVVJFLAorICogICAgIEFQUExJQ0FUSU9OIE9SIFNUQU5EQVJELCBYSUxJTlggSVMgTUFLSU5HIE5PIFJFUFJFU0VOVEFUSU9OCisgKiAgICAgVEhBVCBUSElTIElNUExFTUVOVEFUSU9OIElTIEZSRUUgRlJPTSBBTlkgQ0xBSU1TIE9GIElORlJJTkdFTUVOVCwKKyAqICAgICBBTkQgWU9VIEFSRSBSRVNQT05TSUJMRSBGT1IgT0JUQUlOSU5HIEFOWSBSSUdIVFMgWU9VIE1BWSBSRVFVSVJFCisgKiAgICAgRk9SIFlPVVIgSU1QTEVNRU5UQVRJT04uICBYSUxJTlggRVhQUkVTU0xZIERJU0NMQUlNUyBBTlkKKyAqICAgICBXQVJSQU5UWSBXSEFUU09FVkVSIFdJVEggUkVTUEVDVCBUTyBUSEUgQURFUVVBQ1kgT0YgVEhFCisgKiAgICAgSU1QTEVNRU5UQVRJT04sIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT1IKKyAqICAgICBSRVBSRVNFTlRBVElPTlMgVEhBVCBUSElTIElNUExFTUVOVEFUSU9OIElTIEZSRUUgRlJPTSBDTEFJTVMgT0YKKyAqICAgICBJTkZSSU5HRU1FTlQsIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqICAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogICAgIFhpbGlueCBwcm9kdWN0cyBhcmUgbm90IGludGVuZGVkIGZvciB1c2UgaW4gbGlmZSBzdXBwb3J0IGFwcGxpYW5jZXMsCisgKiAgICAgZGV2aWNlcywgb3Igc3lzdGVtcy4gVXNlIGluIHN1Y2ggYXBwbGljYXRpb25zIGlzIGV4cHJlc3NseSBwcm9oaWJpdGVkLgorICoKKyAqICAgICAoYykgQ29weXJpZ2h0IDIwMDMtMjAwNyBYaWxpbnggSW5jLgorICogICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICAgICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgWElMSU5YX0hXSUNBUF9IXwkvKiBwcmV2ZW50IGNpcmN1bGFyIGluY2x1c2lvbnMgKi8KKyNkZWZpbmUgWElMSU5YX0hXSUNBUF9IXwkvKiBieSB1c2luZyBwcm90ZWN0aW9uIG1hY3JvcyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK3N0cnVjdCBod2ljYXBfZHJ2ZGF0YSB7CisJdTMyIHdyaXRlX2J1ZmZlcl9pbl91c2U7ICAvKiBBbHdheXMgaW4gWzAsM10gKi8KKwl1OCB3cml0ZV9idWZmZXJbNF07CisJdTMyIHJlYWRfYnVmZmVyX2luX3VzZTsJICAvKiBBbHdheXMgaW4gWzAsM10gKi8KKwl1OCByZWFkX2J1ZmZlcls0XTsKKwl1MzIgbWVtX3N0YXJ0OwkJICAvKiBwaHlzLiBhZGRyZXNzIG9mIHRoZSBjb250cm9sIHJlZ2lzdGVycyAqLworCXUzMiBtZW1fZW5kOwkJICAvKiBwaHlzLiBhZGRyZXNzIG9mIHRoZSBjb250cm9sIHJlZ2lzdGVycyAqLworCXUzMiBtZW1fc2l6ZTsKKwl2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzczsvKiB2aXJ0LiBhZGRyZXNzIG9mIHRoZSBjb250cm9sIHJlZ2lzdGVycyAqLworCisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBjZGV2IGNkZXY7CS8qIENoYXIgZGV2aWNlIHN0cnVjdHVyZSAqLworCWRldl90IGRldnQ7CisKKwljb25zdCBzdHJ1Y3QgaHdpY2FwX2RyaXZlcl9jb25maWcgKmNvbmZpZzsKKwljb25zdCBzdHJ1Y3QgY29uZmlnX3JlZ2lzdGVycyAqY29uZmlnX3JlZ3M7CisJdm9pZCAqcHJpdmF0ZV9kYXRhOworCWJvb2wgaXNfb3BlbjsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKK307CisKK3N0cnVjdCBod2ljYXBfZHJpdmVyX2NvbmZpZyB7CisJaW50ICgqZ2V0X2NvbmZpZ3VyYXRpb24pKHN0cnVjdCBod2ljYXBfZHJ2ZGF0YSAqZHJ2ZGF0YSwgdTMyICpkYXRhLAorCQkJdTMyIHNpemUpOworCWludCAoKnNldF9jb25maWd1cmF0aW9uKShzdHJ1Y3QgaHdpY2FwX2RydmRhdGEgKmRydmRhdGEsIHUzMiAqZGF0YSwKKwkJCXUzMiBzaXplKTsKKwl2b2lkICgqcmVzZXQpKHN0cnVjdCBod2ljYXBfZHJ2ZGF0YSAqZHJ2ZGF0YSk7Cit9OworCisvKiBOdW1iZXIgb2YgdGltZXMgdG8gcG9sbCB0aGUgZG9uZSByZWdzaXRlciAqLworI2RlZmluZSBYSElfTUFYX1JFVFJJRVMgICAgIDEwCisKKy8qKioqKioqKioqKiogQ29uc3RhbnQgRGVmaW5pdGlvbnMgKioqKioqKioqKioqKi8KKworI2RlZmluZSBYSElfUEFEX0ZSQU1FUyAgICAgICAgICAgICAgMHgxCisKKy8qIE1hc2sgZm9yIGNhbGN1bGF0aW5nIGNvbmZpZ3VyYXRpb24gcGFja2V0IGhlYWRlcnMgKi8KKyNkZWZpbmUgWEhJX1dPUkRfQ09VTlRfTUFTS19UWVBFXzEgIDB4N0ZGVUwKKyNkZWZpbmUgWEhJX1dPUkRfQ09VTlRfTUFTS19UWVBFXzIgIDB4MUZGRkZGVUwKKyNkZWZpbmUgWEhJX1RZUEVfTUFTSyAgICAgICAgICAgICAgIDB4NworI2RlZmluZSBYSElfUkVHSVNURVJfTUFTSyAgICAgICAgICAgMHhGCisjZGVmaW5lIFhISV9PUF9NQVNLICAgICAgICAgICAgICAgICAweDMKKworI2RlZmluZSBYSElfVFlQRV9TSElGVCAgICAgICAgICAgICAgMjkKKyNkZWZpbmUgWEhJX1JFR0lTVEVSX1NISUZUICAgICAgICAgIDEzCisjZGVmaW5lIFhISV9PUF9TSElGVCAgICAgICAgICAgICAgICAyNworCisjZGVmaW5lIFhISV9UWVBFXzEgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFhISV9UWVBFXzIgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFhISV9PUF9XUklURSAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFhISV9PUF9SRUFEICAgICAgICAgICAgICAgICAxCisKKy8qIEFkZHJlc3MgQmxvY2sgVHlwZXMgKi8KKyNkZWZpbmUgWEhJX0ZBUl9DTEJfQkxPQ0sgICAgICAgICAgIDAKKyNkZWZpbmUgWEhJX0ZBUl9CUkFNX0JMT0NLICAgICAgICAgIDEKKyNkZWZpbmUgWEhJX0ZBUl9CUkFNX0lOVF9CTE9DSyAgICAgIDIKKworc3RydWN0IGNvbmZpZ19yZWdpc3RlcnMgeworCXUzMiBDUkM7CisJdTMyIEZBUjsKKwl1MzIgRkRSSTsKKwl1MzIgRkRSTzsKKwl1MzIgQ01EOworCXUzMiBDVEw7CisJdTMyIE1BU0s7CisJdTMyIFNUQVQ7CisJdTMyIExPVVQ7CisJdTMyIENPUjsKKwl1MzIgTUZXUjsKKwl1MzIgRkxSOworCXUzMiBLRVk7CisJdTMyIENCQzsKKwl1MzIgSURDT0RFOworCXUzMiBBWFNTOworCXUzMiBDMFJfMTsKKwl1MzIgQ1NPQjsKKwl1MzIgV0JTVEFSOworCXUzMiBUSU1FUjsKKwl1MzIgQk9PVFNUUzsKKwl1MzIgQ1RMXzE7Cit9OworCisvKiBDb25maWd1cmF0aW9uIENvbW1hbmRzICovCisjZGVmaW5lIFhISV9DTURfTlVMTCAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFhISV9DTURfV0NGRyAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFhISV9DTURfTUZXICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFhISV9DTURfREdISUdIICAgICAgICAgICAgICAzCisjZGVmaW5lIFhISV9DTURfUkNGRyAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFhISV9DTURfU1RBUlQgICAgICAgICAgICAgICA1CisjZGVmaW5lIFhISV9DTURfUkNBUCAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFhISV9DTURfUkNSQyAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFhISV9DTURfQUdISUdIICAgICAgICAgICAgICA4CisjZGVmaW5lIFhISV9DTURfU1dJVENIICAgICAgICAgICAgICA5CisjZGVmaW5lIFhISV9DTURfR1JFU1RPUkUgICAgICAgICAgICAxMAorI2RlZmluZSBYSElfQ01EX1NIVVRET1dOICAgICAgICAgICAgMTEKKyNkZWZpbmUgWEhJX0NNRF9HQ0FQVFVSRSAgICAgICAgICAgIDEyCisjZGVmaW5lIFhISV9DTURfREVTWU5DSCAgICAgICAgICAgICAxMworI2RlZmluZSBYSElfQ01EX0lQUk9HICAgICAgICAgICAgICAgMTUgLyogT25seSBpbiBWaXJ0ZXg1ICovCisjZGVmaW5lIFhISV9DTURfQ1JDQyAgICAgICAgICAgICAgICAxNiAvKiBPbmx5IGluIFZpcnRleDUgKi8KKyNkZWZpbmUgWEhJX0NNRF9MVElNRVIgICAgICAgICAgICAgIDE3IC8qIE9ubHkgaW4gVmlydGV4NSAqLworCisvKiBQYWNrZXQgY29uc3RhbnRzICovCisjZGVmaW5lIFhISV9TWU5DX1BBQ0tFVCAgICAgICAgICAgICAweEFBOTk1NTY2VUwKKyNkZWZpbmUgWEhJX0RVTU1ZX1BBQ0tFVCAgICAgICAgICAgIDB4RkZGRkZGRkZVTAorI2RlZmluZSBYSElfTk9PUF9QQUNLRVQgICAgICAgICAgICAgKFhISV9UWVBFXzEgPDwgWEhJX1RZUEVfU0hJRlQpCisjZGVmaW5lIFhISV9UWVBFXzJfUkVBRCAoKFhISV9UWVBFXzIgPDwgWEhJX1RZUEVfU0hJRlQpIHwgXAorCQkJKFhISV9PUF9SRUFEIDw8IFhISV9PUF9TSElGVCkpCisKKyNkZWZpbmUgWEhJX1RZUEVfMl9XUklURSAoKFhISV9UWVBFXzIgPDwgWEhJX1RZUEVfU0hJRlQpIHwgXAorCQkJKFhISV9PUF9XUklURSA8PCBYSElfT1BfU0hJRlQpKQorCisjZGVmaW5lIFhISV9UWVBFMl9DTlRfTUFTSyAgICAgICAgICAweDA3RkZGRkZGCisKKyNkZWZpbmUgWEhJX1RZUEVfMV9QQUNLRVRfTUFYX1dPUkRTIDIwNDdVTAorI2RlZmluZSBYSElfVFlQRV8xX0hFQURFUl9CWVRFUyAgICAgNAorI2RlZmluZSBYSElfVFlQRV8yX0hFQURFUl9CWVRFUyAgICAgOAorCisvKiBDb25zdGFudCB0byB1c2UgZm9yIENSQyBjaGVjayB3aGVuIENSQyBoYXMgYmVlbiBkaXNhYmxlZCAqLworI2RlZmluZSBYSElfRElTQUJMRURfQVVUT19DUkMgICAgICAgMHgwMDAwREVGQ1VMCisKKy8qKgorICogaHdpY2FwX3R5cGVfMV9yZWFkOiBHZW5lcmF0ZXMgYSBUeXBlIDEgcmVhZCBwYWNrZXQgaGVhZGVyLgorICogQHBhcmFtZXRlcjogUmVnaXN0ZXIgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lzdGVyIHRvIGJlIHJlYWQgYmFjay4KKyAqCisgKiBHZW5lcmF0ZXMgYSBUeXBlIDEgcmVhZCBwYWNrZXQgaGVhZGVyLCB3aGljaCBpcyB1c2VkIHRvIGluZGlyZWN0bHkKKyAqIHJlYWQgcmVnaXN0ZXJzIGluIHRoZSBjb25maWd1cmF0aW9uIGxvZ2ljLiAgVGhpcyBwYWNrZXQgbXVzdCB0aGVuCisgKiBiZSBzZW50IHRocm91Z2ggdGhlIGljYXAgZGV2aWNlLCBhbmQgYSByZXR1cm4gcGFja2V0IHJlY2VpdmVkIHdpdGgKKyAqIHRoZSBpbmZvcm1hdGlvbi4KKyAqKi8KK3N0YXRpYyBpbmxpbmUgdTMyIGh3aWNhcF90eXBlXzFfcmVhZCh1MzIgUmVnaXN0ZXIpCit7CisJcmV0dXJuIChYSElfVFlQRV8xIDw8IFhISV9UWVBFX1NISUZUKSB8CisJCShSZWdpc3RlciA8PCBYSElfUkVHSVNURVJfU0hJRlQpIHwKKwkJKFhISV9PUF9SRUFEIDw8IFhISV9PUF9TSElGVCk7Cit9CisKKy8qKgorICogaHdpY2FwX3R5cGVfMV93cml0ZTogR2VuZXJhdGVzIGEgVHlwZSAxIHdyaXRlIHBhY2tldCBoZWFkZXIKKyAqIEBwYXJhbWV0ZXI6IFJlZ2lzdGVyIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSByZWdpc3RlciB0byBiZSByZWFkIGJhY2suCisgKiovCitzdGF0aWMgaW5saW5lIHUzMiBod2ljYXBfdHlwZV8xX3dyaXRlKHUzMiBSZWdpc3RlcikKK3sKKwlyZXR1cm4gKFhISV9UWVBFXzEgPDwgWEhJX1RZUEVfU0hJRlQpIHwKKwkJKFJlZ2lzdGVyIDw8IFhISV9SRUdJU1RFUl9TSElGVCkgfAorCQkoWEhJX09QX1dSSVRFIDw8IFhISV9PUF9TSElGVCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL0tjb25maWcgYi9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZwppbmRleCA3MjFmODZmLi5jMTU5YWU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZworKysgYi9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZwpAQCAtOSw5ICs5LDYgQEAKIAkgIGNsb2NrIHNwZWVkLCB5b3UgbmVlZCB0byBlaXRoZXIgZW5hYmxlIGEgZHluYW1pYyBjcHVmcmVxIGdvdmVybm9yCiAJICAoc2VlIGJlbG93KSBhZnRlciBib290LCBvciB1c2UgYSB1c2Vyc3BhY2UgdG9vbC4KIAotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY3B1ZnJlcS4KLQogCSAgRm9yIGRldGFpbHMsIHRha2UgYSBsb29rIGF0IDxmaWxlOkRvY3VtZW50YXRpb24vY3B1LWZyZXE+LgogCiAJICBJZiBpbiBkb3VidCwgc2F5IE4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYwppbmRleCBiNzMwZDY3Li42NDkyNmFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKQEAgLTI4Nyw3ICsyODcsNyBAQAogCWlmICghbF9wX2pfcmVmX2ZyZXEpIHsKIAkJbF9wX2pfcmVmID0gbG9vcHNfcGVyX2ppZmZ5OwogCQlsX3Bfal9yZWZfZnJlcSA9IGNpLT5vbGQ7Ci0JCWRwcmludGsoInNhdmluZyAlbHUgYXMgcmVmZXJlbmNlIHZhbHVlIGZvciBsb29wc19wZXJfamlmZnk7IgorCQlkcHJpbnRrKCJzYXZpbmcgJWx1IGFzIHJlZmVyZW5jZSB2YWx1ZSBmb3IgbG9vcHNfcGVyX2ppZmZ5OyAiCiAJCQkiZnJlcSBpcyAldSBrSHpcbiIsIGxfcF9qX3JlZiwgbF9wX2pfcmVmX2ZyZXEpOwogCX0KIAlpZiAoKHZhbCA9PSBDUFVGUkVRX1BSRUNIQU5HRSAgJiYgY2ktPm9sZCA8IGNpLT5uZXcpIHx8CkBAIC0yOTUsNyArMjk1LDcgQEAKIAkgICAgKHZhbCA9PSBDUFVGUkVRX1JFU1VNRUNIQU5HRSB8fCB2YWwgPT0gQ1BVRlJFUV9TVVNQRU5EQ0hBTkdFKSkgewogCQlsb29wc19wZXJfamlmZnkgPSBjcHVmcmVxX3NjYWxlKGxfcF9qX3JlZiwgbF9wX2pfcmVmX2ZyZXEsCiAJCQkJCQkJCWNpLT5uZXcpOwotCQlkcHJpbnRrKCJzY2FsaW5nIGxvb3BzX3Blcl9qaWZmeSB0byAlbHUiCisJCWRwcmludGsoInNjYWxpbmcgbG9vcHNfcGVyX2ppZmZ5IHRvICVsdSAiCiAJCQkiZm9yIGZyZXF1ZW5jeSAldSBrSHpcbiIsIGxvb3BzX3Blcl9qaWZmeSwgY2ktPm5ldyk7CiAJfQogfQpAQCAtNjAxLDYgKzYwMSwzMSBAQAogCXJldHVybiBpOwogfQogCitzdGF0aWMgc3NpemVfdCBzdG9yZV9zY2FsaW5nX3NldHNwZWVkKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpbnQgZnJlcSA9IDA7CisJdW5zaWduZWQgaW50IHJldDsKKworCWlmICghcG9saWN5LT5nb3Zlcm5vci0+c3RvcmVfc2V0c3BlZWQpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gc3NjYW5mKGJ1ZiwgIiV1IiwgJmZyZXEpOworCWlmIChyZXQgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwb2xpY3ktPmdvdmVybm9yLT5zdG9yZV9zZXRzcGVlZChwb2xpY3ksIGZyZXEpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3NjYWxpbmdfc2V0c3BlZWQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIGNoYXIgKmJ1ZikKK3sKKwlpZiAoIXBvbGljeS0+Z292ZXJub3ItPnNob3dfc2V0c3BlZWQpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjx1bnN1cHBvcnRlZD5cbiIpOworCisJcmV0dXJuIHBvbGljeS0+Z292ZXJub3ItPnNob3dfc2V0c3BlZWQocG9saWN5LCBidWYpOworfQogCiAjZGVmaW5lIGRlZmluZV9vbmVfcm8oX25hbWUpIFwKIHN0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyIF9uYW1lID0gXApAQCAtNjI0LDYgKzY0OSw3IEBACiBkZWZpbmVfb25lX3J3KHNjYWxpbmdfbWluX2ZyZXEpOwogZGVmaW5lX29uZV9ydyhzY2FsaW5nX21heF9mcmVxKTsKIGRlZmluZV9vbmVfcncoc2NhbGluZ19nb3Zlcm5vcik7CitkZWZpbmVfb25lX3J3KHNjYWxpbmdfc2V0c3BlZWQpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqIGRlZmF1bHRfYXR0cnNbXSA9IHsKIAkmY3B1aW5mb19taW5fZnJlcS5hdHRyLApAQCAtNjM0LDYgKzY2MCw3IEBACiAJJnNjYWxpbmdfZ292ZXJub3IuYXR0ciwKIAkmc2NhbGluZ19kcml2ZXIuYXR0ciwKIAkmc2NhbGluZ19hdmFpbGFibGVfZ292ZXJub3JzLmF0dHIsCisJJnNjYWxpbmdfc2V0c3BlZWQuYXR0ciwKIAlOVUxMCiB9OwogCkBAIC0xMzEzLDcgKzEzNDAsNyBAQAogCQkJc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7CiAKIAkJCWlmICghKGNwdWZyZXFfZHJpdmVyLT5mbGFncyAmIENQVUZSRVFfUE1fTk9fV0FSTikpCi0JCQkJZHByaW50aygiV2FybmluZzogQ1BVIGZyZXF1ZW5jeSIKKwkJCQlkcHJpbnRrKCJXYXJuaW5nOiBDUFUgZnJlcXVlbmN5ICIKIAkJCQkgICAgICAgImlzICV1LCBjcHVmcmVxIGFzc3VtZWQgJXUga0h6LlxuIiwKIAkJCQkgICAgICAgY3VyX2ZyZXEsIGNwdV9wb2xpY3ktPmN1cik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3VzZXJzcGFjZS5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfdXNlcnNwYWNlLmMKaW5kZXggZjhjZGRlNC4uY2IyYWMwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfdXNlcnNwYWNlLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfdXNlcnNwYWNlLmMKQEAgLTY1LDEyICs2NSwxMiBAQAogCiAvKioKICAqIGNwdWZyZXFfc2V0IC0gc2V0IHRoZSBDUFUgZnJlcXVlbmN5CisgKiBAcG9saWN5OiBwb2ludGVyIHRvIHBvbGljeSBzdHJ1Y3Qgd2hlcmUgZnJlcSBpcyBiZWluZyBzZXQKICAqIEBmcmVxOiB0YXJnZXQgZnJlcXVlbmN5IGluIGtIegotICogQGNwdTogQ1BVIGZvciB3aGljaCB0aGUgZnJlcXVlbmN5IGlzIHRvIGJlIHNldAogICoKICAqIFNldHMgdGhlIENQVSBmcmVxdWVuY3kgdG8gZnJlcS4KICAqLwotc3RhdGljIGludCBjcHVmcmVxX3NldCh1bnNpZ25lZCBpbnQgZnJlcSwgc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCitzdGF0aWMgaW50IGNwdWZyZXFfc2V0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LCB1bnNpZ25lZCBpbnQgZnJlcSkKIHsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIApAQCAtMTAyLDM0ICsxMDIsMTEgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiogc3lzZnMgaW50ZXJmYWNlICoqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBzc2l6ZV90IHNob3dfc3BlZWQgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X3NwZWVkKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LCBjaGFyICpidWYpCiB7Ci0JcmV0dXJuIHNwcmludGYgKGJ1ZiwgIiV1XG4iLCBjcHVfY3VyX2ZyZXFbcG9saWN5LT5jcHVdKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgY3B1X2N1cl9mcmVxW3BvbGljeS0+Y3B1XSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90Ci1zdG9yZV9zcGVlZCAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXVuc2lnbmVkIGludCBmcmVxID0gMDsKLQl1bnNpZ25lZCBpbnQgcmV0OwotCi0JcmV0ID0gc3NjYW5mIChidWYsICIldSIsICZmcmVxKTsKLQlpZiAocmV0ICE9IDEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY3B1ZnJlcV9zZXQoZnJlcSwgcG9saWN5KTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIgZnJlcV9hdHRyX3NjYWxpbmdfc2V0c3BlZWQgPQotewotCS5hdHRyID0geyAubmFtZSA9ICJzY2FsaW5nX3NldHNwZWVkIiwgLm1vZGUgPSAwNjQ0IH0sCi0JLnNob3cgPSBzaG93X3NwZWVkLAotCS5zdG9yZSA9IHN0b3JlX3NwZWVkLAotfTsKLQogc3RhdGljIGludCBjcHVmcmVxX2dvdmVybm9yX3VzZXJzcGFjZShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSwKIAkJCQkgICB1bnNpZ25lZCBpbnQgZXZlbnQpCiB7CkBAIC0xNDIsMTAgKzExOSw2IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJQlVHX09OKCFwb2xpY3ktPmN1cik7CiAJCW11dGV4X2xvY2soJnVzZXJzcGFjZV9tdXRleCk7Ci0JCXJjID0gc3lzZnNfY3JlYXRlX2ZpbGUgKCZwb2xpY3ktPmtvYmosCi0JCQkJCSZmcmVxX2F0dHJfc2NhbGluZ19zZXRzcGVlZC5hdHRyKTsKLQkJaWYgKHJjKQotCQkJZ290byBzdGFydF9vdXQ7CiAKIAkJaWYgKGNwdXNfdXNpbmdfdXNlcnNwYWNlX2dvdmVybm9yID09IDApIHsKIAkJCWNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoCkBAIC0xNjAsNyArMTMzLDcgQEAKIAkJY3B1X2N1cl9mcmVxW2NwdV0gPSBwb2xpY3ktPmN1cjsKIAkJY3B1X3NldF9mcmVxW2NwdV0gPSBwb2xpY3ktPmN1cjsKIAkJZHByaW50aygibWFuYWdpbmcgY3B1ICV1IHN0YXJ0ZWQgKCV1IC0gJXUga0h6LCBjdXJyZW50bHkgJXUga0h6KVxuIiwgY3B1LCBjcHVfbWluX2ZyZXFbY3B1XSwgY3B1X21heF9mcmVxW2NwdV0sIGNwdV9jdXJfZnJlcVtjcHVdKTsKLXN0YXJ0X291dDoKKwogCQltdXRleF91bmxvY2soJnVzZXJzcGFjZV9tdXRleCk7CiAJCWJyZWFrOwogCWNhc2UgQ1BVRlJFUV9HT1ZfU1RPUDoKQEAgLTE3Niw3ICsxNDksNiBAQAogCQljcHVfbWluX2ZyZXFbY3B1XSA9IDA7CiAJCWNwdV9tYXhfZnJlcVtjcHVdID0gMDsKIAkJY3B1X3NldF9mcmVxW2NwdV0gPSAwOwotCQlzeXNmc19yZW1vdmVfZmlsZSAoJnBvbGljeS0+a29iaiwgJmZyZXFfYXR0cl9zY2FsaW5nX3NldHNwZWVkLmF0dHIpOwogCQlkcHJpbnRrKCJtYW5hZ2luZyBjcHUgJXUgc3RvcHBlZFxuIiwgY3B1KTsKIAkJbXV0ZXhfdW5sb2NrKCZ1c2Vyc3BhY2VfbXV0ZXgpOwogCQlicmVhazsKQEAgLTIxMSw2ICsxODMsOCBAQAogc3RydWN0IGNwdWZyZXFfZ292ZXJub3IgY3B1ZnJlcV9nb3ZfdXNlcnNwYWNlID0gewogCS5uYW1lCQk9ICJ1c2Vyc3BhY2UiLAogCS5nb3Zlcm5vcgk9IGNwdWZyZXFfZ292ZXJub3JfdXNlcnNwYWNlLAorCS5zdG9yZV9zZXRzcGVlZAk9IGNwdWZyZXFfc2V0LAorCS5zaG93X3NldHNwZWVkCT0gc2hvd19zcGVlZCwKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiB9OwogRVhQT1JUX1NZTUJPTChjcHVmcmVxX2dvdl91c2Vyc3BhY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2ZyZXFfdGFibGUuYyBiL2RyaXZlcnMvY3B1ZnJlcS9mcmVxX3RhYmxlLmMKaW5kZXggNTQwOWYzYS4uYWU2Y2Q2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2ZyZXFfdGFibGUuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvZnJlcV90YWJsZS5jCkBAIC0xNzEsNyArMTcxLDcgQEAKIAogc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqc2hvd190YWJsZVtOUl9DUFVTXTsKIC8qKgotICogc2hvd19zY2FsaW5nX2dvdmVybm9yIC0gc2hvdyB0aGUgY3VycmVudCBwb2xpY3kgZm9yIHRoZSBzcGVjaWZpZWQgQ1BVCisgKiBzaG93X2F2YWlsYWJsZV9mcmVxcyAtIHNob3cgYXZhaWxhYmxlIGZyZXF1ZW5jaWVzIGZvciB0aGUgc3BlY2lmaWVkIENQVQogICovCiBzdGF0aWMgc3NpemVfdCBzaG93X2F2YWlsYWJsZV9mcmVxcyAoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIGNoYXIgKmJ1ZikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9LY29uZmlnIGIvZHJpdmVycy9jcHVpZGxlL0tjb25maWcKaW5kZXggM2JlZDQxMi4uN2RiYzRhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVpZGxlL0tjb25maWcKKysrIGIvZHJpdmVycy9jcHVpZGxlL0tjb25maWcKQEAgLTEsMTMgKzEsMTMgQEAKIAogY29uZmlnIENQVV9JRExFCiAJYm9vbCAiQ1BVIGlkbGUgUE0gc3VwcG9ydCIKKwlkZWZhdWx0IEFDUEkKIAloZWxwCiAJICBDUFUgaWRsZSBpcyBhIGdlbmVyaWMgZnJhbWV3b3JrIGZvciBzdXBwb3J0aW5nIHNvZnR3YXJlLWNvbnRyb2xsZWQKIAkgIGlkbGUgcHJvY2Vzc29yIHBvd2VyIG1hbmFnZW1lbnQuICBJdCBpbmNsdWRlcyBtb2R1bGFyIGNyb3NzLXBsYXRmb3JtCiAJICBnb3Zlcm5vcnMgdGhhdCBjYW4gYmUgc3dhcHBlZCBkdXJpbmcgcnVudGltZS4KIAotCSAgSWYgeW91J3JlIHVzaW5nIGEgbW9iaWxlIHBsYXRmb3JtIHRoYXQgc3VwcG9ydHMgQ1BVIGlkbGUgUE0gKGUuZy4KLQkgIGFuIEFDUEktY2FwYWJsZSBub3RlYm9vayksIHlvdSBzaG91bGQgc2F5IFkgaGVyZS4KKwkgIElmIHlvdSdyZSB1c2luZyBhbiBBQ1BJLWVuYWJsZWQgcGxhdGZvcm0sIHlvdSBzaG91bGQgc2F5IFkgaGVyZS4KIAogY29uZmlnIENQVV9JRExFX0dPVl9MQURERVIKIAlib29sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS5jIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUuYwppbmRleCAyYTk4ZDk5Li4yYzRiMmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS5jCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbV9xb3NfcGFyYW1zLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1aWRsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CiAKICNpbmNsdWRlICJjcHVpZGxlLmgiCiAKQEAgLTE4MCw2ICsxODEsNDQgQEAKIAogRVhQT1JUX1NZTUJPTF9HUEwoY3B1aWRsZV9kaXNhYmxlX2RldmljZSk7CiAKKyNpZmRlZiBDT05GSUdfQVJDSF9IQVNfQ1BVX1JFTEFYCitzdGF0aWMgaW50IHBvbGxfaWRsZShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwgc3RydWN0IGNwdWlkbGVfc3RhdGUgKnN0KQoreworCWt0aW1lX3QJdDEsIHQyOworCXM2NCBkaWZmOworCWludCByZXQ7CisKKwl0MSA9IGt0aW1lX2dldCgpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKwl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKQorCQljcHVfcmVsYXgoKTsKKworCXQyID0ga3RpbWVfZ2V0KCk7CisJZGlmZiA9IGt0aW1lX3RvX3VzKGt0aW1lX3N1Yih0MiwgdDEpKTsKKwlpZiAoZGlmZiA+IElOVF9NQVgpCisJCWRpZmYgPSBJTlRfTUFYOworCisJcmV0ID0gKGludCkgZGlmZjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBwb2xsX2lkbGVfaW5pdChzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqc3RhdGUgPSAmZGV2LT5zdGF0ZXNbMF07CisKKwljcHVpZGxlX3NldF9zdGF0ZWRhdGEoc3RhdGUsIE5VTEwpOworCisJc25wcmludGYoc3RhdGUtPm5hbWUsIENQVUlETEVfTkFNRV9MRU4sICJDMCAocG9sbCBpZGxlKSIpOworCXN0YXRlLT5leGl0X2xhdGVuY3kgPSAwOworCXN0YXRlLT50YXJnZXRfcmVzaWRlbmN5ID0gMDsKKwlzdGF0ZS0+cG93ZXJfdXNhZ2UgPSAtMTsKKwlzdGF0ZS0+ZmxhZ3MgPSBDUFVJRExFX0ZMQUdfUE9MTCB8IENQVUlETEVfRkxBR19USU1FX1ZBTElEOworCXN0YXRlLT5lbnRlciA9IHBvbGxfaWRsZTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBwb2xsX2lkbGVfaW5pdChzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldikge30KKyNlbmRpZiAvKiBDT05GSUdfQVJDSF9IQVNfQ1BVX1JFTEFYICovCisKIC8qKgogICogY3B1aWRsZV9yZWdpc3Rlcl9kZXZpY2UgLSByZWdpc3RlcnMgYSBDUFUncyBpZGxlIFBNIGZlYXR1cmUKICAqIEBkZXY6IHRoZSBjcHUKQEAgLTE5OCw2ICsyMzcsOCBAQAogCiAJbXV0ZXhfbG9jaygmY3B1aWRsZV9sb2NrKTsKIAorCXBvbGxfaWRsZV9pbml0KGRldik7CisKIAlwZXJfY3B1KGNwdWlkbGVfZGV2aWNlcywgZGV2LT5jcHUpID0gZGV2OwogCWxpc3RfYWRkKCZkZXYtPmRldmljZV9saXN0LCAmY3B1aWRsZV9kZXRlY3RlZF9kZXZpY2VzKTsKIAlpZiAoKHJldCA9IGNwdWlkbGVfYWRkX3N5c2ZzKHN5c19kZXYpKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kY2EvZGNhLXN5c2ZzLmMgYi9kcml2ZXJzL2RjYS9kY2Etc3lzZnMuYwppbmRleCAyNGEyNjNiLi4wMTEzMjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RjYS9kY2Etc3lzZnMuYworKysgYi9kcml2ZXJzL2RjYS9kY2Etc3lzZnMuYwpAQCAtMTIsMTAgKzEyLDEwIEBACiAKIGludCBkY2Ffc3lzZnNfYWRkX3JlcShzdHJ1Y3QgZGNhX3Byb3ZpZGVyICpkY2EsIHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHNsb3QpCiB7Ci0Jc3RydWN0IGNsYXNzX2RldmljZSAqY2Q7CisJc3RydWN0IGRldmljZSAqY2Q7CiAKLQljZCA9IGNsYXNzX2RldmljZV9jcmVhdGUoZGNhX2NsYXNzLCBkY2EtPmNkLCBNS0RFVigwLCBzbG90ICsgMSksCi0JCQkJIGRldiwgInJlcXVlc3RlciVkIiwgc2xvdCk7CisJY2QgPSBkZXZpY2VfY3JlYXRlKGRjYV9jbGFzcywgZGNhLT5jZCwgTUtERVYoMCwgc2xvdCArIDEpLAorCQkJICAgInJlcXVlc3RlciVkIiwgc2xvdCk7CiAJaWYgKElTX0VSUihjZCkpCiAJCXJldHVybiBQVFJfRVJSKGNkKTsKIAlyZXR1cm4gMDsKQEAgLTIzLDEyICsyMywxMiBAQAogCiB2b2lkIGRjYV9zeXNmc19yZW1vdmVfcmVxKHN0cnVjdCBkY2FfcHJvdmlkZXIgKmRjYSwgaW50IHNsb3QpCiB7Ci0JY2xhc3NfZGV2aWNlX2Rlc3Ryb3koZGNhX2NsYXNzLCBNS0RFVigwLCBzbG90ICsgMSkpOworCWRldmljZV9kZXN0cm95KGRjYV9jbGFzcywgTUtERVYoMCwgc2xvdCArIDEpKTsKIH0KIAogaW50IGRjYV9zeXNmc19hZGRfcHJvdmlkZXIoc3RydWN0IGRjYV9wcm92aWRlciAqZGNhLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGNsYXNzX2RldmljZSAqY2Q7CisJc3RydWN0IGRldmljZSAqY2Q7CiAJaW50IGVyciA9IDA7CiAKIGlkcl90cnlfYWdhaW46CkBAIC00Niw4ICs0Niw3IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0JY2QgPSBjbGFzc19kZXZpY2VfY3JlYXRlKGRjYV9jbGFzcywgTlVMTCwgTUtERVYoMCwgMCksCi0JCQkJIGRldiwgImRjYSVkIiwgZGNhLT5pZCk7CisJY2QgPSBkZXZpY2VfY3JlYXRlKGRjYV9jbGFzcywgZGV2LCBNS0RFVigwLCAwKSwgImRjYSVkIiwgZGNhLT5pZCk7CiAJaWYgKElTX0VSUihjZCkpIHsKIAkJc3Bpbl9sb2NrKCZkY2FfaWRyX2xvY2spOwogCQlpZHJfcmVtb3ZlKCZkY2FfaWRyLCBkY2EtPmlkKTsKQEAgLTYwLDcgKzU5LDcgQEAKIAogdm9pZCBkY2Ffc3lzZnNfcmVtb3ZlX3Byb3ZpZGVyKHN0cnVjdCBkY2FfcHJvdmlkZXIgKmRjYSkKIHsKLQljbGFzc19kZXZpY2VfdW5yZWdpc3RlcihkY2EtPmNkKTsKKwlkZXZpY2VfdW5yZWdpc3RlcihkY2EtPmNkKTsKIAlkY2EtPmNkID0gTlVMTDsKIAlzcGluX2xvY2soJmRjYV9pZHJfbG9jayk7CiAJaWRyX3JlbW92ZSgmZGNhX2lkciwgZGNhLT5pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvS2NvbmZpZyBiL2RyaXZlcnMvZWRhYy9LY29uZmlnCmluZGV4IDk4YjZiNGYuLjJiMzgyOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvZWRhYy9LY29uZmlnCkBAIC05Nyw3ICs5Nyw3IEBACiAKIGNvbmZpZyBFREFDX0kzMDAwCiAJdHJpc3RhdGUgIkludGVsIDMwMDAvMzAxMCIKLQlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQyAmJiBQQ0kgJiYgWDg2XzMyCisJZGVwZW5kcyBvbiBFREFDX01NX0VEQUMgJiYgUENJICYmIFg4NgogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIGVycm9yIGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiBvbiB0aGUgSW50ZWwKIAkgIDMwMDAgYW5kIDMwMTAgc2VydmVyIGNoaXBzZXRzLgpAQCAtMTIzLDYgKzEyMywyMCBAQAogCSAgU3VwcG9ydCBmb3IgZXJyb3IgZGV0ZWN0aW9uIGFuZCBjb3JyZWN0aW9uIHRoZSBJbnRlbAogCSAgR3JlZWtjcmVlay9CbGFja2ZvcmQgY2hpcHNldHMuCiAKK2NvbmZpZyBFREFDX01QQzg1WFgKKwl0cmlzdGF0ZSAiRnJlZXNjYWxlIE1QQzg1eHgiCisJZGVwZW5kcyBvbiBFREFDX01NX0VEQUMgJiYgRlNMX1NPQyAmJiBNUEM4NXh4CisJaGVscAorCSAgU3VwcG9ydCBmb3IgZXJyb3IgZGV0ZWN0aW9uIGFuZCBjb3JyZWN0aW9uIG9uIHRoZSBGcmVlc2NhbGUKKwkgIE1QQzg1NjAsIE1QQzg1NDAsIE1QQzg1NDgKKworY29uZmlnIEVEQUNfTVY2NFg2MAorCXRyaXN0YXRlICJNYXJ2ZWxsIE1WNjR4NjAiCisJZGVwZW5kcyBvbiBFREFDX01NX0VEQUMgJiYgTVY2NFg2MAorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIGVycm9yIGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiBvbiB0aGUgTWFydmVsbAorCSAgTVY2NDM2MCBhbmQgTVY2NDQ2MCBjaGlwc2V0cy4KKwogY29uZmlnIEVEQUNfUEFTRU1JCiAJdHJpc3RhdGUgIlBBIFNlbWkgUFdSZmljaWVudCIKIAlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQyAmJiBQQ0kKQEAgLTEzMSw1ICsxNDUsMTIgQEAKIAkgIFN1cHBvcnQgZm9yIGVycm9yIGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiBvbiBQQSBTZW1pCiAJICBQV1JmaWNpZW50LgogCitjb25maWcgRURBQ19DRUxMCisJdHJpc3RhdGUgIkNlbGwgQnJvYWRiYW5kIEVuZ2luZSBtZW1vcnkgY29udHJvbGxlciIKKwlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQyAmJiBQUENfQ0VMTF9OQVRJVkUKKwloZWxwCisJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gb24gdGhlCisJICBDZWxsIEJyb2FkYmFuZCBFbmdpbmUgaW50ZXJuYWwgbWVtb3J5IGNvbnRyb2xsZXIKKwkgIG9uIHBsYXRmb3JtIHdpdGhvdXQgYSBoeXBlcnZpc29yCiAKIGVuZGlmICMgRURBQwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL01ha2VmaWxlIGIvZHJpdmVycy9lZGFjL01ha2VmaWxlCmluZGV4IDAyYzA5ZjAuLjgzODA3NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2VkYWMvTWFrZWZpbGUKQEAgLTI4LDQgKzI4LDcgQEAKIG9iai0kKENPTkZJR19FREFDX0k4Mjg2MCkJCSs9IGk4Mjg2MF9lZGFjLm8KIG9iai0kKENPTkZJR19FREFDX1I4MjYwMCkJCSs9IHI4MjYwMF9lZGFjLm8KIG9iai0kKENPTkZJR19FREFDX1BBU0VNSSkJCSs9IHBhc2VtaV9lZGFjLm8KK29iai0kKENPTkZJR19FREFDX01QQzg1WFgpCQkrPSBtcGM4NXh4X2VkYWMubworb2JqLSQoQ09ORklHX0VEQUNfTVY2NFg2MCkJCSs9IG12NjR4NjBfZWRhYy5vCitvYmotJChDT05GSUdfRURBQ19DRUxMKQkJCSs9IGNlbGxfZWRhYy5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9jZWxsX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9jZWxsX2VkYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTQxMTJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9lZGFjL2NlbGxfZWRhYy5jCkBAIC0wLDAgKzEsMjU4IEBACisvKgorICogQ2VsbCBNSUMgZHJpdmVyIGZvciBFQ0MgY291bnRpbmcKKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBCZW5qYW1pbiBIZXJyZW5zY2htaWR0LCBJQk0gQ29ycC4KKyAqICAgICAgICAgICAgICAgIDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+CisgKgorICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqLworI3VuZGVmIERFQlVHCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3RvcF9tYWNoaW5lLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9jZWxsLXJlZ3MuaD4KKworI2luY2x1ZGUgImVkYWNfY29yZS5oIgorCitzdHJ1Y3QgY2VsbF9lZGFjX3ByaXYKK3sKKwlzdHJ1Y3QgY2JlX21pY190bV9yZWdzIF9faW9tZW0JKnJlZ3M7CisJaW50CQkJCW5vZGU7CisJaW50CQkJCWNoYW5tYXNrOworI2lmZGVmIERFQlVHCisJdTY0CQkJCXByZXZfZmlyOworI2VuZGlmCit9OworCitzdGF0aWMgdm9pZCBjZWxsX2VkYWNfY291bnRfY2Uoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLCBpbnQgY2hhbiwgdTY0IGFyKQoreworCXN0cnVjdCBjZWxsX2VkYWNfcHJpdgkJKnByaXYgPSBtY2ktPnB2dF9pbmZvOworCXN0cnVjdCBjc3Jvd19pbmZvCQkqY3Nyb3cgPSAmbWNpLT5jc3Jvd3NbMF07CisJdW5zaWduZWQgbG9uZwkJCWFkZHJlc3MsIHBmbiwgb2Zmc2V0OworCisJZGV2X2RiZyhtY2ktPmRldiwgIkVDQyBDRSBlcnIgb24gbm9kZSAlZCwgY2hhbm5lbCAlZCwgYXIgPSAweCUwMTZseFxuIiwKKwkJcHJpdi0+bm9kZSwgY2hhbiwgYXIpOworCisJLyogQWRkcmVzcyBkZWNvZGluZyBpcyBsaWtlbHkgYSBiaXQgYm9ndXMsIHRvIGRibCBjaGVjayAqLworCWFkZHJlc3MgPSAoYXIgJiAweGZmZmZmZmZmZTAwMDAwMDB1bCkgPj4gMjk7CisJaWYgKHByaXYtPmNoYW5tYXNrID09IDB4MykKKwkJYWRkcmVzcyA9IChhZGRyZXNzIDw8IDEpIHwgY2hhbjsKKwlwZm4gPSBhZGRyZXNzID4+IFBBR0VfU0hJRlQ7CisJb2Zmc2V0ID0gYWRkcmVzcyAmIH5QQUdFX01BU0s7CisKKwkvKiBUT0RPOiBEZWNvZGluZyBvZiB0aGUgZXJyb3IgYWRkcmVzc3MgKi8KKwllZGFjX21jX2hhbmRsZV9jZShtY2ksIGNzcm93LT5maXJzdF9wYWdlICsgcGZuLCBvZmZzZXQsCisJCQkgIDAsIDAsIGNoYW4sICIiKTsKK30KKworc3RhdGljIHZvaWQgY2VsbF9lZGFjX2NvdW50X3VlKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwgaW50IGNoYW4sIHU2NCBhcikKK3sKKwlzdHJ1Y3QgY2VsbF9lZGFjX3ByaXYJCSpwcml2ID0gbWNpLT5wdnRfaW5mbzsKKwlzdHJ1Y3QgY3Nyb3dfaW5mbwkJKmNzcm93ID0gJm1jaS0+Y3Nyb3dzWzBdOworCXVuc2lnbmVkIGxvbmcJCQlhZGRyZXNzLCBwZm4sIG9mZnNldDsKKworCWRldl9kYmcobWNpLT5kZXYsICJFQ0MgVUUgZXJyIG9uIG5vZGUgJWQsIGNoYW5uZWwgJWQsIGFyID0gMHglMDE2bHhcbiIsCisJCXByaXYtPm5vZGUsIGNoYW4sIGFyKTsKKworCS8qIEFkZHJlc3MgZGVjb2RpbmcgaXMgbGlrZWx5IGEgYml0IGJvZ3VzLCB0byBkYmwgY2hlY2sgKi8KKwlhZGRyZXNzID0gKGFyICYgMHhmZmZmZmZmZmUwMDAwMDAwdWwpID4+IDI5OworCWlmIChwcml2LT5jaGFubWFzayA9PSAweDMpCisJCWFkZHJlc3MgPSAoYWRkcmVzcyA8PCAxKSB8IGNoYW47CisJcGZuID0gYWRkcmVzcyA+PiBQQUdFX1NISUZUOworCW9mZnNldCA9IGFkZHJlc3MgJiB+UEFHRV9NQVNLOworCisJLyogVE9ETzogRGVjb2Rpbmcgb2YgdGhlIGVycm9yIGFkZHJlc3NzICovCisJZWRhY19tY19oYW5kbGVfdWUobWNpLCBjc3Jvdy0+Zmlyc3RfcGFnZSArIHBmbiwgb2Zmc2V0LCAwLCAiIik7Cit9CisKK3N0YXRpYyB2b2lkIGNlbGxfZWRhY19jaGVjayhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJc3RydWN0IGNlbGxfZWRhY19wcml2CQkqcHJpdiA9IG1jaS0+cHZ0X2luZm87CisJdTY0CQkJCWZpciwgYWRkcmVnLCBjbGVhciA9IDA7CisKKwlmaXIgPSBpbl9iZTY0KCZwcml2LT5yZWdzLT5taWNfZmlyKTsKKyNpZmRlZiBERUJVRworCWlmIChmaXIgIT0gcHJpdi0+cHJldl9maXIpIHsKKwkJZGV2X2RiZyhtY2ktPmRldiwgImZpciBjaGFuZ2UgOiAweCUwMTZseFxuIiwgZmlyKTsKKwkJcHJpdi0+cHJldl9maXIgPSBmaXI7CisJfQorI2VuZGlmCisJaWYgKChwcml2LT5jaGFubWFzayAmIDB4MSkgJiYgKGZpciAmIENCRV9NSUNfRklSX0VDQ19TSU5HTEVfMF9FUlIpKSB7CisJCWFkZHJlZyA9IGluX2JlNjQoJnByaXYtPnJlZ3MtPm1pY19kZl9lY2NfYWRkcmVzc18wKTsKKwkJY2xlYXIgfD0gQ0JFX01JQ19GSVJfRUNDX1NJTkdMRV8wX1JFU0VUOworCQljZWxsX2VkYWNfY291bnRfY2UobWNpLCAwLCBhZGRyZWcpOworCX0KKwlpZiAoKHByaXYtPmNoYW5tYXNrICYgMHgyKSAmJiAoZmlyICYgQ0JFX01JQ19GSVJfRUNDX1NJTkdMRV8xX0VSUikpIHsKKwkJYWRkcmVnID0gaW5fYmU2NCgmcHJpdi0+cmVncy0+bWljX2RmX2VjY19hZGRyZXNzXzEpOworCQljbGVhciB8PSBDQkVfTUlDX0ZJUl9FQ0NfU0lOR0xFXzFfUkVTRVQ7CisJCWNlbGxfZWRhY19jb3VudF9jZShtY2ksIDEsIGFkZHJlZyk7CisJfQorCWlmICgocHJpdi0+Y2hhbm1hc2sgJiAweDEpICYmIChmaXIgJiBDQkVfTUlDX0ZJUl9FQ0NfTVVMVElfMF9FUlIpKSB7CisJCWFkZHJlZyA9IGluX2JlNjQoJnByaXYtPnJlZ3MtPm1pY19kZl9lY2NfYWRkcmVzc18wKTsKKwkJY2xlYXIgfD0gQ0JFX01JQ19GSVJfRUNDX01VTFRJXzBfUkVTRVQ7CisJCWNlbGxfZWRhY19jb3VudF91ZShtY2ksIDAsIGFkZHJlZyk7CisJfQorCWlmICgocHJpdi0+Y2hhbm1hc2sgJiAweDIpICYmIChmaXIgJiBDQkVfTUlDX0ZJUl9FQ0NfTVVMVElfMV9FUlIpKSB7CisJCWFkZHJlZyA9IGluX2JlNjQoJnByaXYtPnJlZ3MtPm1pY19kZl9lY2NfYWRkcmVzc18xKTsKKwkJY2xlYXIgfD0gQ0JFX01JQ19GSVJfRUNDX01VTFRJXzFfUkVTRVQ7CisJCWNlbGxfZWRhY19jb3VudF91ZShtY2ksIDEsIGFkZHJlZyk7CisJfQorCisJLyogVGhlIHByb2NlZHVyZSBmb3IgY2xlYXJpbmcgRklSIGJpdHMgaXMgYSBiaXQgLi4uIHdlaXJkICovCisJaWYgKGNsZWFyKSB7CisJCWZpciAmPSB+KENCRV9NSUNfRklSX0VDQ19FUlJfTUFTSyB8IENCRV9NSUNfRklSX0VDQ19TRVRfTUFTSyk7CisJCWZpciB8PSBDQkVfTUlDX0ZJUl9FQ0NfUkVTRVRfTUFTSzsKKwkJZmlyICY9IH5jbGVhcjsKKwkJb3V0X2JlNjQoJnByaXYtPnJlZ3MtPm1pY19maXIsIGZpcik7CisJCSh2b2lkKWluX2JlNjQoJnByaXYtPnJlZ3MtPm1pY19maXIpOworCisJCW1iKCk7CS8qIHN5bmMgdXAgKi8KKyNpZmRlZiBERUJVRworCQlmaXIgPSBpbl9iZTY0KCZwcml2LT5yZWdzLT5taWNfZmlyKTsKKwkJZGV2X2RiZyhtY2ktPmRldiwgImZpciBjbGVhciAgOiAweCUwMTZseFxuIiwgZmlyKTsKKyNlbmRpZgorCX0KK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGNlbGxfZWRhY19pbml0X2Nzcm93cyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJc3RydWN0IGNzcm93X2luZm8JCSpjc3JvdyA9ICZtY2ktPmNzcm93c1swXTsKKwlzdHJ1Y3QgY2VsbF9lZGFjX3ByaXYJCSpwcml2ID0gbWNpLT5wdnRfaW5mbzsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUJCSpucDsKKworCWZvciAobnAgPSBOVUxMOworCSAgICAgKG5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUobnAsICJtZW1vcnkiKSkgIT0gTlVMTDspIHsKKwkJc3RydWN0IHJlc291cmNlIHI7CisKKwkJLyogV2UgImtub3ciIHRoYXQgdGhlIENlbGwgZmlybXdhcmUgb25seSBjcmVhdGVzIG9uZSBlbnRyeQorCQkgKiBpbiB0aGUgIm1lbW9yeSIgbm9kZXMuIElmIHRoYXQgY2hhbmdlcywgdGhpcyBjb2RlIHdpbGwKKwkJICogbmVlZCB0byBiZSBhZGFwdGVkLgorCQkgKi8KKwkJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyKSkKKwkJCWNvbnRpbnVlOworCQlpZiAob2Zfbm9kZV90b19uaWQobnApICE9IHByaXYtPm5vZGUpCisJCQljb250aW51ZTsKKwkJY3Nyb3ctPmZpcnN0X3BhZ2UgPSByLnN0YXJ0ID4+IFBBR0VfU0hJRlQ7CisJCWNzcm93LT5ucl9wYWdlcyA9IChyLmVuZCAtIHIuc3RhcnQgKyAxKSA+PiBQQUdFX1NISUZUOworCQljc3Jvdy0+bGFzdF9wYWdlID0gY3Nyb3ctPmZpcnN0X3BhZ2UgKyBjc3Jvdy0+bnJfcGFnZXMgLSAxOworCQljc3Jvdy0+bXR5cGUgPSBNRU1fWERSOworCQljc3Jvdy0+ZWRhY19tb2RlID0gRURBQ19GTEFHX0VDIHwgRURBQ19GTEFHX1NFQ0RFRDsKKwkJZGV2X2RiZyhtY2ktPmRldiwKKwkJCSJJbml0aWFsaXplZCBvbiBub2RlICVkLCBjaGFubWFzaz0weCV4LCIKKwkJCSIgZmlyc3RfcGFnZT0weCVseCwgbnJfcGFnZXM9MHgleFxuIiwKKwkJCXByaXYtPm5vZGUsIHByaXYtPmNoYW5tYXNrLAorCQkJY3Nyb3ctPmZpcnN0X3BhZ2UsIGNzcm93LT5ucl9wYWdlcyk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBfX2RldmluaXQgY2VsbF9lZGFjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGNiZV9taWNfdG1fcmVncyBfX2lvbWVtCSpyZWdzOworCXN0cnVjdCBtZW1fY3RsX2luZm8JCSptY2k7CisJc3RydWN0IGNlbGxfZWRhY19wcml2CQkqcHJpdjsKKwl1NjQJCQkJcmVnOworCWludAkJCQlyYywgY2hhbm1hc2s7CisKKwlyZWdzID0gY2JlX2dldF9jcHVfbWljX3RtX3JlZ3MoY2JlX25vZGVfdG9fY3B1KHBkZXYtPmlkKSk7CisJaWYgKHJlZ3MgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBHZXQgY2hhbm5lbCBwb3B1bGF0aW9uICovCisJcmVnID0gaW5fYmU2NCgmcmVncy0+bWljX21udF9jZmcpOworCWRldl9kYmcoJnBkZXYtPmRldiwgIk1JQ19NTlRfQ0ZHID0gMHglMDE2bHhcbiIsIHJlZyk7CisJY2hhbm1hc2sgPSAwOworCWlmIChyZWcgJiBDQkVfTUlDX01OVF9DRkdfQ0hBTl8wX1BPUCkKKwkJY2hhbm1hc2sgfD0gMHgxOworCWlmIChyZWcgJiBDQkVfTUlDX01OVF9DRkdfQ0hBTl8xX1BPUCkKKwkJY2hhbm1hc2sgfD0gMHgyOworCWlmIChjaGFubWFzayA9PSAwKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkgIll1Y2sgISBObyBjaGFubmVsIHBvcHVsYXRlZCA/IEFib3J0aW5nICFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJZGV2X2RiZygmcGRldi0+ZGV2LCAiSW5pdGlhbCBGSVIgPSAweCUwMTZseFxuIiwKKwkJaW5fYmU2NCgmcmVncy0+bWljX2ZpcikpOworCisJLyogQWxsb2NhdGUgJiBpbml0IEVEQUMgTUMgZGF0YSBzdHJ1Y3R1cmUgKi8KKwltY2kgPSBlZGFjX21jX2FsbG9jKHNpemVvZihzdHJ1Y3QgY2VsbF9lZGFjX3ByaXYpLCAxLAorCQkJICAgIGNoYW5tYXNrID09IDMgPyAyIDogMSwgcGRldi0+aWQpOworCWlmIChtY2kgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcHJpdiA9IG1jaS0+cHZ0X2luZm87CisJcHJpdi0+cmVncyA9IHJlZ3M7CisJcHJpdi0+bm9kZSA9IHBkZXYtPmlkOworCXByaXYtPmNoYW5tYXNrID0gY2hhbm1hc2s7CisJbWNpLT5kZXYgPSAmcGRldi0+ZGV2OworCW1jaS0+bXR5cGVfY2FwID0gTUVNX0ZMQUdfWERSOworCW1jaS0+ZWRhY19jdGxfY2FwID0gRURBQ19GTEFHX05PTkUgfCBFREFDX0ZMQUdfRUMgfCBFREFDX0ZMQUdfU0VDREVEOworCW1jaS0+ZWRhY19jYXAgPSBFREFDX0ZMQUdfRUMgfCBFREFDX0ZMQUdfU0VDREVEOworCW1jaS0+bW9kX25hbWUgPSAiY2VsbF9lZGFjIjsKKwltY2ktPmN0bF9uYW1lID0gIk1JQyI7CisJbWNpLT5kZXZfbmFtZSA9IHBkZXYtPmRldi5idXNfaWQ7CisJbWNpLT5lZGFjX2NoZWNrID0gY2VsbF9lZGFjX2NoZWNrOworCWNlbGxfZWRhY19pbml0X2Nzcm93cyhtY2kpOworCisJLyogUmVnaXN0ZXIgd2l0aCBFREFDIGNvcmUgKi8KKwlyYyA9IGVkYWNfbWNfYWRkX21jKG1jaSk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciB3aXRoIEVEQUMgY29yZVxuIik7CisJCWVkYWNfbWNfZnJlZShtY2kpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGNlbGxfZWRhY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kgPSBlZGFjX21jX2RlbF9tYygmcGRldi0+ZGV2KTsKKwlpZiAobWNpKQorCQllZGFjX21jX2ZyZWUobWNpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgY2VsbF9lZGFjX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiY2JlLW1pYyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IGNlbGxfZWRhY19wcm9iZSwKKwkucmVtb3ZlCQk9IGNlbGxfZWRhY19yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjZWxsX2VkYWNfaW5pdCh2b2lkKQoreworCS8qIFNhbml0eSBjaGVjayByZWdpc3RlcnMgZGF0YSBzdHJ1Y3R1cmUgKi8KKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGNiZV9taWNfdG1fcmVncywKKwkJCSAgICAgIG1pY19kZl9lY2NfYWRkcmVzc18wKSAhPSAweGY4KTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGNiZV9taWNfdG1fcmVncywKKwkJCSAgICAgIG1pY19kZl9lY2NfYWRkcmVzc18xKSAhPSAweDFiOCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBjYmVfbWljX3RtX3JlZ3MsCisJCQkgICAgICBtaWNfZGZfY29uZmlnKSAhPSAweDIxOCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBjYmVfbWljX3RtX3JlZ3MsCisJCQkgICAgICBtaWNfZmlyKSAhPSAweDIzMCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBjYmVfbWljX3RtX3JlZ3MsCisJCQkgICAgICBtaWNfbW50X2NmZykgIT0gMHgyMTApOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgY2JlX21pY190bV9yZWdzLAorCQkJICAgICAgbWljX2V4YykgIT0gMHgyMDgpOworCisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmY2VsbF9lZGFjX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjZWxsX2VkYWNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZjZWxsX2VkYWNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoY2VsbF9lZGFjX2luaXQpOworbW9kdWxlX2V4aXQoY2VsbF9lZGFjX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkVDQyBjb3VudGluZyBmb3IgQ2VsbCBNSUMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9lZGFjX2NvcmUuaCBiL2RyaXZlcnMvZWRhYy9lZGFjX2NvcmUuaAppbmRleCAyZDIzZTMwLi5hOWFhODQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvZWRhY19jb3JlLmgKKysrIGIvZHJpdmVycy9lZGFjL2VkYWNfY29yZS5oCkBAIC0xMzYsNiArMTM2LDcgQEAKIAlNRU1fRERSMiwJCS8qIEREUjIgUkFNICovCiAJTUVNX0ZCX0REUjIsCQkvKiBmdWxseSBidWZmZXJlZCBERFIyICovCiAJTUVNX1JERFIyLAkJLyogUmVnaXN0ZXJlZCBERFIyIFJBTSAqLworCU1FTV9YRFIsCQkvKiBSYW1idXMgWERSICovCiB9OwogCiAjZGVmaW5lIE1FTV9GTEFHX0VNUFRZCQlCSVQoTUVNX0VNUFRZKQpAQCAtMTUyLDYgKzE1Myw3IEBACiAjZGVmaW5lIE1FTV9GTEFHX0REUjIgICAgICAgICAgIEJJVChNRU1fRERSMikKICNkZWZpbmUgTUVNX0ZMQUdfRkJfRERSMiAgICAgICAgQklUKE1FTV9GQl9ERFIyKQogI2RlZmluZSBNRU1fRkxBR19SRERSMiAgICAgICAgICBCSVQoTUVNX1JERFIyKQorI2RlZmluZSBNRU1fRkxBR19YRFIgICAgICAgICAgICBCSVQoTUVNX1hEUikKIAogLyogY2hpcHNldCBFcnJvciBEZXRlY3Rpb24gYW5kIENvcnJlY3Rpb24gY2FwYWJpbGl0aWVzIGFuZCBtb2RlICovCiBlbnVtIGVkYWNfdHlwZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZWRhY19kZXZpY2UuYyBiL2RyaXZlcnMvZWRhYy9lZGFjX2RldmljZS5jCmluZGV4IGYzNjkwYTYuLmI5NTUyYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9lZGFjX2RldmljZS5jCisrKyBiL2RyaXZlcnMvZWRhYy9lZGFjX2RldmljZS5jCkBAIC0xNTUsNiArMTU1LDEwIEBACiAJZGV2X2N0bC0+aW5zdGFuY2VzID0gZGV2X2luc3Q7CiAJZGV2X2N0bC0+cHZ0X2luZm8gPSBwdnQ7CiAKKwkvKiBEZWZhdWx0IGxvZ2dpbmcgb2YgQ0VzIGFuZCBVRXMgKi8KKwlkZXZfY3RsLT5sb2dfY2UgPSAxOworCWRldl9jdGwtPmxvZ191ZSA9IDE7CisKIAkvKiBOYW1lIG9mIHRoaXMgZWRhYyBkZXZpY2UgKi8KIAlzbnByaW50ZihkZXZfY3RsLT5uYW1lLHNpemVvZihkZXZfY3RsLT5uYW1lKSwiJXMiLGVkYWNfZGV2aWNlX25hbWUpOwogCkBAIC00MzYsNyArNDQwLDcgQEAKIAkgKi8KIAlpZiAoZWRhY19kZXYtPnBvbGxfbXNlYyA9PSAxMDAwKQogCQlxdWV1ZV9kZWxheWVkX3dvcmsoZWRhY193b3JrcXVldWUsICZlZGFjX2Rldi0+d29yaywKLQkJCQlyb3VuZF9qaWZmaWVzKGVkYWNfZGV2LT5kZWxheSkpOworCQkJCXJvdW5kX2ppZmZpZXNfcmVsYXRpdmUoZWRhY19kZXYtPmRlbGF5KSk7CiAJZWxzZQogCQlxdWV1ZV9kZWxheWVkX3dvcmsoZWRhY193b3JrcXVldWUsICZlZGFjX2Rldi0+d29yaywKIAkJCQllZGFjX2Rldi0+ZGVsYXkpOwpAQCAtNDY4LDcgKzQ3Miw3IEBACiAJICovCiAJaWYgKGVkYWNfZGV2LT5wb2xsX21zZWMgPT0gMTAwMCkKIAkJcXVldWVfZGVsYXllZF93b3JrKGVkYWNfd29ya3F1ZXVlLCAmZWRhY19kZXYtPndvcmssCi0JCQkJcm91bmRfamlmZmllcyhlZGFjX2Rldi0+ZGVsYXkpKTsKKwkJCQlyb3VuZF9qaWZmaWVzX3JlbGF0aXZlKGVkYWNfZGV2LT5kZWxheSkpOwogCWVsc2UKIAkJcXVldWVfZGVsYXllZF93b3JrKGVkYWNfd29ya3F1ZXVlLCAmZWRhY19kZXYtPndvcmssCiAJCQkJZWRhY19kZXYtPmRlbGF5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9lZGFjX21jX3N5c2ZzLmMgYi9kcml2ZXJzL2VkYWMvZWRhY19tY19zeXNmcy5jCmluZGV4IDlhYWM4ODAuLjAyMWQxODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9lZGFjX21jX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9lZGFjL2VkYWNfbWNfc3lzZnMuYwpAQCAtNzMsNyArNzMsOCBAQAogCVtNRU1fUk1CU10gPSAiUk1CUyIsCiAJW01FTV9ERFIyXSA9ICJVbmJ1ZmZlcmVkLUREUjIiLAogCVtNRU1fRkJfRERSMl0gPSAiRnVsbHlCdWZmZXJlZC1ERFIyIiwKLQlbTUVNX1JERFIyXSA9ICJSZWdpc3RlcmVkLUREUjIiCisJW01FTV9SRERSMl0gPSAiUmVnaXN0ZXJlZC1ERFIyIiwKKwlbTUVNX1hEUl0gPSAiWERSIgogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRldl90eXBlc1tdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2VkYWNfcGNpLmMgYi9kcml2ZXJzL2VkYWMvZWRhY19wY2kuYwppbmRleCBlMGI0N2I3Li4zMmJlNDM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvZWRhY19wY2kuYworKysgYi9kcml2ZXJzL2VkYWMvZWRhY19wY2kuYwpAQCAtMjQ2LDcgKzI0Niw3IEBACiAJCS8qIGlmIHdlIGFyZSBvbiBhIG9uZSBzZWNvbmQgcGVyaW9kLCB0aGVuIHVzZSByb3VuZCAqLwogCQltc2VjID0gZWRhY19wY2lfZ2V0X3BvbGxfbXNlYygpOwogCQlpZiAobXNlYyA9PSAxMDAwKQotCQkJZGVsYXkgPSByb3VuZF9qaWZmaWVzKG1zZWNzX3RvX2ppZmZpZXMobXNlYykpOworCQkJZGVsYXkgPSByb3VuZF9qaWZmaWVzX3JlbGF0aXZlKG1zZWNzX3RvX2ppZmZpZXMobXNlYykpOwogCQllbHNlCiAJCQlkZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMobXNlYyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9lZGFjX3BjaV9zeXNmcy5jIGIvZHJpdmVycy9lZGFjL2VkYWNfcGNpX3N5c2ZzLmMKaW5kZXggNWIwNzVkYS4uNzFjMzE5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2VkYWNfcGNpX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9lZGFjL2VkYWNfcGNpX3N5c2ZzLmMKQEAgLTU1OCw4ICs1NTgsMTAgQEAKIAogCWRlYnVnZjQoIlBDSSBTVEFUVVM9IDB4JTA0eCAlc1xuIiwgc3RhdHVzLCBkZXYtPmRldi5idXNfaWQpOwogCi0JLyogY2hlY2sgdGhlIHN0YXR1cyByZWcgZm9yIGVycm9ycyAqLwotCWlmIChzdGF0dXMpIHsKKwkvKiBjaGVjayB0aGUgc3RhdHVzIHJlZyBmb3IgZXJyb3JzIG9uIGJvYXJkcyBOT1QgbWFya2VkIGFzIGJyb2tlbgorCSAqIGlmIGJyb2tlbiwgd2UgY2Fubm90IHRydXN0IGFueSBvZiB0aGUgc3RhdHVzIGJpdHMKKwkgKi8KKwlpZiAoc3RhdHVzICYmICFkZXYtPmJyb2tlbl9wYXJpdHlfc3RhdHVzKSB7CiAJCWlmIChzdGF0dXMgJiAoUENJX1NUQVRVU19TSUdfU1lTVEVNX0VSUk9SKSkgewogCQkJZWRhY19wcmludGsoS0VSTl9DUklULCBFREFDX1BDSSwKIAkJCQkiU2lnbmFsZWQgU3lzdGVtIEVycm9yIG9uICVzXG4iLApAQCAtNTkzLDggKzU5NSwxMCBAQAogCiAJCWRlYnVnZjQoIlBDSSBTRUNfU1RBVFVTPSAweCUwNHggJXNcbiIsIHN0YXR1cywgZGV2LT5kZXYuYnVzX2lkKTsKIAotCQkvKiBjaGVjayB0aGUgc2Vjb25kYXJ5IHN0YXR1cyByZWcgZm9yIGVycm9ycyAqLwotCQlpZiAoc3RhdHVzKSB7CisJCS8qIGNoZWNrIHRoZSBzZWNvbmRhcnkgc3RhdHVzIHJlZyBmb3IgZXJyb3JzLAorCQkgKiBvbiBOT1QgYnJva2VuIGJvYXJkcworCQkgKi8KKwkJaWYgKHN0YXR1cyAmJiAhZGV2LT5icm9rZW5fcGFyaXR5X3N0YXR1cykgewogCQkJaWYgKHN0YXR1cyAmIChQQ0lfU1RBVFVTX1NJR19TWVNURU1fRVJST1IpKSB7CiAJCQkJZWRhY19wcmludGsoS0VSTl9DUklULCBFREFDX1BDSSwgIkJyaWRnZSAiCiAJCQkJCSJTaWduYWxlZCBTeXN0ZW0gRXJyb3Igb24gJXNcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvaTMwMDBfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2kzMDAwX2VkYWMuYwppbmRleCBlODk1ZjlmLi41ZDQyOTI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvaTMwMDBfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9pMzAwMF9lZGFjLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2VkYWMuaD4KICNpbmNsdWRlICJlZGFjX2NvcmUuaCIKIAogI2RlZmluZSBJMzAwMF9SRVZJU0lPTgkJIjEuMSIKQEAgLTMwLDEwNSArMzEsMTM5IEBACiAjZGVmaW5lIEkzMDAwX01DSEJBUl9NQVNLCTB4ZmZmZmMwMDAKICNkZWZpbmUgSTMwMDBfTU1SX1dJTkRPV19TSVpFCTE2Mzg0CiAKLSNkZWZpbmUgSTMwMDBfRURFQVAJCTB4NzAJLyogRXh0ZW5kZWQgRFJBTSBFcnJvciBBZGRyZXNzIFBvaW50ZXIgKDhiKQotCQkJCQkgKgotCQkJCQkgKiA3OjEgICByZXNlcnZlZAotCQkJCQkgKiAwICAgICBiaXQgMzIgb2YgYWRkcmVzcwotCQkJCQkgKi8KLSNkZWZpbmUgSTMwMDBfREVBUAkJMHg1OAkvKiBEUkFNIEVycm9yIEFkZHJlc3MgUG9pbnRlciAoMzJiKQotCQkJCQkgKgotCQkJCQkgKiAzMTo3ICBhZGRyZXNzCi0JCQkJCSAqIDY6MSAgIHJlc2VydmVkCi0JCQkJCSAqIDAgICAgIEVycm9yIGNoYW5uZWwgMC8xCi0JCQkJCSAqLwotI2RlZmluZSBJMzAwMF9ERUFQX0dSQUlOCSgxIDw8IDcpCi0jZGVmaW5lIEkzMDAwX0RFQVBfUEZOKGVkZWFwLCBkZWFwKQkoKCgoZWRlYXApICYgMSkgPDwgKDMyIC0gUEFHRV9TSElGVCkpIHwgXAotCQkJCQkoKGRlYXApID4+IFBBR0VfU0hJRlQpKQotI2RlZmluZSBJMzAwMF9ERUFQX09GRlNFVChkZWFwKQkJKChkZWFwKSAmIH4oSTMwMDBfREVBUF9HUkFJTi0xKSAmIH5QQUdFX01BU0spCi0jZGVmaW5lIEkzMDAwX0RFQVBfQ0hBTk5FTChkZWFwKQkoKGRlYXApICYgMSkKKyNkZWZpbmUgSTMwMDBfRURFQVAJMHg3MAkvKiBFeHRlbmRlZCBEUkFNIEVycm9yIEFkZHJlc3MgUG9pbnRlciAoOGIpCisJCQkJICoKKwkJCQkgKiA3OjEgICByZXNlcnZlZAorCQkJCSAqIDAgICAgIGJpdCAzMiBvZiBhZGRyZXNzCisJCQkJICovCisjZGVmaW5lIEkzMDAwX0RFQVAJMHg1OAkvKiBEUkFNIEVycm9yIEFkZHJlc3MgUG9pbnRlciAoMzJiKQorCQkJCSAqCisJCQkJICogMzE6NyAgYWRkcmVzcworCQkJCSAqIDY6MSAgIHJlc2VydmVkCisJCQkJICogMCAgICAgRXJyb3IgY2hhbm5lbCAwLzEKKwkJCQkgKi8KKyNkZWZpbmUgSTMwMDBfREVBUF9HUkFJTiAJCSgxIDw8IDcpCiAKLSNkZWZpbmUgSTMwMDBfREVSUlNZTgkJMHg1YwkvKiBEUkFNIEVycm9yIFN5bmRyb21lICg4YikKLQkJCQkJICoKLQkJCQkJICogIDc6MCAgRFJBTSBFQ0MgU3luZHJvbWUKLQkJCQkJICovCisvKgorICogSGVscGVyIGZ1bmN0aW9ucyB0byBkZWNvZGUgdGhlIERFQVAvRURFQVAgaGFyZHdhcmUgcmVnaXN0ZXJzLgorICoKKyAqIFRoZSB0eXBlIHByb21vdGlvbiBoZXJlIGlzIGRlbGliZXJhdGU7IHdlJ3JlIGRlcml2aW5nIGFuCisgKiB1bnNpZ25lZCBsb25nIHBmbiBhbmQgb2Zmc2V0IGZyb20gaGFyZHdhcmUgcmVncyB3aGljaCBhcmUgdTgvdTMyLgorICovCiAKLSNkZWZpbmUgSTMwMDBfRVJSU1RTCQkweGM4CS8qIEVycm9yIFN0YXR1cyBSZWdpc3RlciAoMTZiKQotCQkJCQkgKgotCQkJCQkgKiAxNToxMiByZXNlcnZlZAotCQkJCQkgKiAxMSAgICBNQ0ggVGhlcm1hbCBTZW5zb3IgRXZlbnQgZm9yIFNNSS9TQ0kvU0VSUgotCQkJCQkgKiAxMCAgICByZXNlcnZlZAotCQkJCQkgKiAgOSAgICBMT0NLIHRvIG5vbi1EUkFNIE1lbW9yeSBGbGFnIChMQ0tGKQotCQkJCQkgKiAgOCAgICBSZWNlaXZlZCBSZWZyZXNoIFRpbWVvdXQgRmxhZyAoUlJUT0YpCi0JCQkJCSAqICA3OjIgIHJlc2VydmVkCi0JCQkJCSAqICAxICAgIE11bHRpcGxlLWJpdCBEUkFNIEVDQyBFcnJvciBGbGFnIChETUVSUikKLQkJCQkJICogIDAgICAgU2luZ2xlLWJpdCBEUkFNIEVDQyBFcnJvciBGbGFnIChEU0VSUikKLQkJCQkJICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZGVhcF9wZm4odTggZWRlYXAsIHUzMiBkZWFwKQoreworCWRlYXAgPj49IFBBR0VfU0hJRlQ7CisJZGVhcCB8PSAoZWRlYXAgJiAxKSA8PCAoMzIgLSBQQUdFX1NISUZUKTsKKwlyZXR1cm4gZGVhcDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGRlYXBfb2Zmc2V0KHUzMiBkZWFwKQoreworCXJldHVybiBkZWFwICYgfihJMzAwMF9ERUFQX0dSQUlOIC0gMSkgJiB+UEFHRV9NQVNLOworfQorCitzdGF0aWMgaW5saW5lIGludCBkZWFwX2NoYW5uZWwodTMyIGRlYXApCit7CisJcmV0dXJuIGRlYXAgJiAxOworfQorCisjZGVmaW5lIEkzMDAwX0RFUlJTWU4JMHg1YwkvKiBEUkFNIEVycm9yIFN5bmRyb21lICg4YikKKwkJCQkgKgorCQkJCSAqICA3OjAgIERSQU0gRUNDIFN5bmRyb21lCisJCQkJICovCisKKyNkZWZpbmUgSTMwMDBfRVJSU1RTCTB4YzgJLyogRXJyb3IgU3RhdHVzIFJlZ2lzdGVyICgxNmIpCisJCQkJICoKKwkJCQkgKiAxNToxMiByZXNlcnZlZAorCQkJCSAqIDExICAgIE1DSCBUaGVybWFsIFNlbnNvciBFdmVudAorCQkJCSAqICAgICAgICAgZm9yIFNNSS9TQ0kvU0VSUgorCQkJCSAqIDEwICAgIHJlc2VydmVkCisJCQkJICogIDkgICAgTE9DSyB0byBub24tRFJBTSBNZW1vcnkgRmxhZyAoTENLRikKKwkJCQkgKiAgOCAgICBSZWNlaXZlZCBSZWZyZXNoIFRpbWVvdXQgRmxhZyAoUlJUT0YpCisJCQkJICogIDc6MiAgcmVzZXJ2ZWQKKwkJCQkgKiAgMSAgICBNdWx0aS1iaXQgRFJBTSBFQ0MgRXJyb3IgRmxhZyAoRE1FUlIpCisJCQkJICogIDAgICAgU2luZ2xlLWJpdCBEUkFNIEVDQyBFcnJvciBGbGFnIChEU0VSUikKKwkJCQkgKi8KICNkZWZpbmUgSTMwMDBfRVJSU1RTX0JJVFMJMHgwYjAzCS8qIGJpdHMgd2hpY2ggaW5kaWNhdGUgZXJyb3JzICovCiAjZGVmaW5lIEkzMDAwX0VSUlNUU19VRQkJMHgwMDAyCiAjZGVmaW5lIEkzMDAwX0VSUlNUU19DRQkJMHgwMDAxCiAKLSNkZWZpbmUgSTMwMDBfRVJSQ01ECQkweGNhCS8qIEVycm9yIENvbW1hbmQgKDE2YikKLQkJCQkJICoKLQkJCQkJICogMTU6MTIgcmVzZXJ2ZWQKLQkJCQkJICogMTEgICAgU0VSUiBvbiBNQ0ggVGhlcm1hbCBTZW5zb3IgRXZlbnQgKFRTRVNFUlIpCi0JCQkJCSAqIDEwICAgIHJlc2VydmVkCi0JCQkJCSAqICA5ICAgIFNFUlIgb24gTE9DSyB0byBub24tRFJBTSBNZW1vcnkgKExDS0VSUikKLQkJCQkJICogIDggICAgU0VSUiBvbiBEUkFNIFJlZnJlc2ggVGltZW91dCAoRFJUT0VSUikKLQkJCQkJICogIDc6MiAgcmVzZXJ2ZWQKLQkJCQkJICogIDEgICAgU0VSUiBNdWx0aXBsZS1CaXQgRFJBTSBFQ0MgRXJyb3IgKERNRVJSKQotCQkJCQkgKiAgMCAgICBTRVJSIG9uIFNpbmdsZS1CaXQgRUNDIEVycm9yIChEU0VSUikKLQkJCQkJICovCisjZGVmaW5lIEkzMDAwX0VSUkNNRAkweGNhCS8qIEVycm9yIENvbW1hbmQgKDE2YikKKwkJCQkgKgorCQkJCSAqIDE1OjEyIHJlc2VydmVkCisJCQkJICogMTEgICAgU0VSUiBvbiBNQ0ggVGhlcm1hbCBTZW5zb3IgRXZlbnQKKwkJCQkgKiAgICAgICAgIChUU0VTRVJSKQorCQkJCSAqIDEwICAgIHJlc2VydmVkCisJCQkJICogIDkgICAgU0VSUiBvbiBMT0NLIHRvIG5vbi1EUkFNIE1lbW9yeQorCQkJCSAqICAgICAgICAgKExDS0VSUikKKwkJCQkgKiAgOCAgICBTRVJSIG9uIERSQU0gUmVmcmVzaCBUaW1lb3V0CisJCQkJICogICAgICAgICAoRFJUT0VSUikKKwkJCQkgKiAgNzoyICByZXNlcnZlZAorCQkJCSAqICAxICAgIFNFUlIgTXVsdGktQml0IERSQU0gRUNDIEVycm9yCisJCQkJICogICAgICAgICAoRE1FUlIpCisJCQkJICogIDAgICAgU0VSUiBvbiBTaW5nbGUtQml0IEVDQyBFcnJvcgorCQkJCSAqICAgICAgICAgKERTRVJSKQorCQkJCSAqLwogCiAvKiBJbnRlbCAgTU1JTyByZWdpc3RlciBzcGFjZSAtIGRldmljZSAwIGZ1bmN0aW9uIDAgLSBNTVIgc3BhY2UgKi8KIAogI2RlZmluZSBJMzAwMF9EUkJfU0hJRlQgMjUJLyogMzJNaUIgZ3JhaW4gKi8KIAotI2RlZmluZSBJMzAwMF9DMERSQgkJMHgxMDAJLyogQ2hhbm5lbCAwIERSQU0gUmFuayBCb3VuZGFyeSAoOGIgeCA0KQotCQkJCQkgKgotCQkJCQkgKiA3OjAgICBDaGFubmVsIDAgRFJBTSBSYW5rIEJvdW5kYXJ5IEFkZHJlc3MKLQkJCQkJICovCi0jZGVmaW5lIEkzMDAwX0MxRFJCCQkweDE4MAkvKiBDaGFubmVsIDEgRFJBTSBSYW5rIEJvdW5kYXJ5ICg4YiB4IDQpCi0JCQkJCSAqCi0JCQkJCSAqIDc6MCAgIENoYW5uZWwgMSBEUkFNIFJhbmsgQm91bmRhcnkgQWRkcmVzcwotCQkJCQkgKi8KKyNkZWZpbmUgSTMwMDBfQzBEUkIJMHgxMDAJLyogQ2hhbm5lbCAwIERSQU0gUmFuayBCb3VuZGFyeSAoOGIgeCA0KQorCQkJCSAqCisJCQkJICogNzowICAgQ2hhbm5lbCAwIERSQU0gUmFuayBCb3VuZGFyeSBBZGRyZXNzCisJCQkJICovCisjZGVmaW5lIEkzMDAwX0MxRFJCCTB4MTgwCS8qIENoYW5uZWwgMSBEUkFNIFJhbmsgQm91bmRhcnkgKDhiIHggNCkKKwkJCQkgKgorCQkJCSAqIDc6MCAgIENoYW5uZWwgMSBEUkFNIFJhbmsgQm91bmRhcnkgQWRkcmVzcworCQkJCSAqLwogCi0jZGVmaW5lIEkzMDAwX0MwRFJBCQkweDEwOAkvKiBDaGFubmVsIDAgRFJBTSBSYW5rIEF0dHJpYnV0ZSAoOGIgeCAyKQotCQkJCQkgKgotCQkJCQkgKiA3ICAgICByZXNlcnZlZAotCQkJCQkgKiA2OjQgICBEUkFNIG9kZCBSYW5rIEF0dHJpYnV0ZQotCQkJCQkgKiAzICAgICByZXNlcnZlZAotCQkJCQkgKiAyOjAgICBEUkFNIGV2ZW4gUmFuayBBdHRyaWJ1dGUKLQkJCQkJICoKLQkJCQkJICogRWFjaCBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgcGFnZQotCQkJCQkgKiBzaXplIG9mIHRoZSBjb3JyZXNwb25kaW5nIHJhbms6Ci0JCQkJCSAqICAgICAwMDA6IHVucG9wdWxhdGVkCi0JCQkJCSAqICAgICAwMDE6IHJlc2VydmVkCi0JCQkJCSAqICAgICAwMTA6IDQgS0IKLQkJCQkJICogICAgIDAxMTogOCBLQgotCQkJCQkgKiAgICAgMTAwOiAxNiBLQgotCQkJCQkgKiAgICAgT3RoZXJzOiByZXNlcnZlZAotCQkJCQkgKi8KLSNkZWZpbmUgSTMwMDBfQzFEUkEJCTB4MTg4CS8qIENoYW5uZWwgMSBEUkFNIFJhbmsgQXR0cmlidXRlICg4YiB4IDIpICovCi0jZGVmaW5lIE9ERF9SQU5LX0FUVFJJQihkcmEpICgoKGRyYSkgJiAweDcwKSA+PiA0KQotI2RlZmluZSBFVkVOX1JBTktfQVRUUklCKGRyYSkgKChkcmEpICYgMHgwNykKKyNkZWZpbmUgSTMwMDBfQzBEUkEJMHgxMDgJLyogQ2hhbm5lbCAwIERSQU0gUmFuayBBdHRyaWJ1dGUgKDhiIHggMikKKwkJCQkgKgorCQkJCSAqIDcgICAgIHJlc2VydmVkCisJCQkJICogNjo0ICAgRFJBTSBvZGQgUmFuayBBdHRyaWJ1dGUKKwkJCQkgKiAzICAgICByZXNlcnZlZAorCQkJCSAqIDI6MCAgIERSQU0gZXZlbiBSYW5rIEF0dHJpYnV0ZQorCQkJCSAqCisJCQkJICogRWFjaCBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgcGFnZQorCQkJCSAqIHNpemUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcmFuazoKKwkJCQkgKiAgICAgMDAwOiB1bnBvcHVsYXRlZAorCQkJCSAqICAgICAwMDE6IHJlc2VydmVkCisJCQkJICogICAgIDAxMDogNCBLQgorCQkJCSAqICAgICAwMTE6IDggS0IKKwkJCQkgKiAgICAgMTAwOiAxNiBLQgorCQkJCSAqICAgICBPdGhlcnM6IHJlc2VydmVkCisJCQkJICovCisjZGVmaW5lIEkzMDAwX0MxRFJBCTB4MTg4CS8qIENoYW5uZWwgMSBEUkFNIFJhbmsgQXR0cmlidXRlICg4YiB4IDIpICovCiAKLSNkZWZpbmUgSTMwMDBfQzBEUkMwCQkweDEyMAkvKiBEUkFNIENvbnRyb2xsZXIgTW9kZSAwICgzMmIpCi0JCQkJCSAqCi0JCQkJCSAqIDMxOjMwIHJlc2VydmVkCi0JCQkJCSAqIDI5ICAgIEluaXRpYWxpemF0aW9uIENvbXBsZXRlIChJQykKLQkJCQkJICogMjg6MTEgcmVzZXJ2ZWQKLQkJCQkJICogMTA6OCAgUmVmcmVzaCBNb2RlIFNlbGVjdCAoUk1TKQotCQkJCQkgKiA3ICAgICByZXNlcnZlZAotCQkJCQkgKiA2OjQgICBNb2RlIFNlbGVjdCAoU01TKQotCQkJCQkgKiAzOjIgICByZXNlcnZlZAotCQkJCQkgKiAxOjAgICBEUkFNIFR5cGUgKERUKQotCQkJCQkgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBvZGRfcmFua19hdHRyaWIodW5zaWduZWQgY2hhciBkcmEpCit7CisJcmV0dXJuIChkcmEgJiAweDcwKSA+PiA0OworfQogCi0jZGVmaW5lIEkzMDAwX0MwRFJDMQkJMHgxMjQJLyogRFJBTSBDb250cm9sbGVyIE1vZGUgMSAoMzJiKQotCQkJCQkgKgotCQkJCQkgKiAzMSAgICBFbmhhbmNlZCBBZGRyZXNzaW5nIEVuYWJsZSAoRU5IQURFKQotCQkJCQkgKiAzMDowICByZXNlcnZlZAotCQkJCQkgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBldmVuX3JhbmtfYXR0cmliKHVuc2lnbmVkIGNoYXIgZHJhKQoreworCXJldHVybiBkcmEgJiAweDA3OworfQorCisjZGVmaW5lIEkzMDAwX0MwRFJDMAkweDEyMAkvKiBEUkFNIENvbnRyb2xsZXIgTW9kZSAwICgzMmIpCisJCQkJICoKKwkJCQkgKiAzMTozMCByZXNlcnZlZAorCQkJCSAqIDI5ICAgIEluaXRpYWxpemF0aW9uIENvbXBsZXRlIChJQykKKwkJCQkgKiAyODoxMSByZXNlcnZlZAorCQkJCSAqIDEwOjggIFJlZnJlc2ggTW9kZSBTZWxlY3QgKFJNUykKKwkJCQkgKiA3ICAgICByZXNlcnZlZAorCQkJCSAqIDY6NCAgIE1vZGUgU2VsZWN0IChTTVMpCisJCQkJICogMzoyICAgcmVzZXJ2ZWQKKwkJCQkgKiAxOjAgICBEUkFNIFR5cGUgKERUKQorCQkJCSAqLworCisjZGVmaW5lIEkzMDAwX0MwRFJDMQkweDEyNAkvKiBEUkFNIENvbnRyb2xsZXIgTW9kZSAxICgzMmIpCisJCQkJICoKKwkJCQkgKiAzMSAgICBFbmhhbmNlZCBBZGRyZXNzaW5nIEVuYWJsZSAoRU5IQURFKQorCQkJCSAqIDMwOjAgIHJlc2VydmVkCisJCQkJICovCiAKIGVudW0gaTMwMDBwX2NoaXBzIHsKIAlJMzAwMCA9IDAsCkBAIC0xODcsNyArMjIyLDggQEAKIAkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgSTMwMDBfREVSUlNZTiwgJmluZm8tPmRlcnJzeW4pOwogCX0KIAotCS8qIENsZWFyIGFueSBlcnJvciBiaXRzLgorCS8qCisJICogQ2xlYXIgYW55IGVycm9yIGJpdHMuCiAJICogKFllcywgd2UgcmVhbGx5IGNsZWFyIGJpdHMgYnkgd3JpdGluZyAxIHRvIHRoZW0uKQogCSAqLwogCXBjaV93cml0ZV9iaXRzMTYocGRldiwgSTMwMDBfRVJSU1RTLCBJMzAwMF9FUlJTVFNfQklUUywKQEAgLTE5OCw4ICsyMzQsOCBAQAogCQkJCXN0cnVjdCBpMzAwMF9lcnJvcl9pbmZvICppbmZvLAogCQkJCWludCBoYW5kbGVfZXJyb3JzKQogewotCWludCByb3csIG11bHRpX2NoYW47Ci0JaW50IHBmbiwgb2Zmc2V0LCBjaGFubmVsOworCWludCByb3csIG11bHRpX2NoYW4sIGNoYW5uZWw7CisJdW5zaWduZWQgbG9uZyBwZm4sIG9mZnNldDsKIAogCW11bHRpX2NoYW4gPSBtY2ktPmNzcm93c1swXS5ucl9jaGFubmVscyAtIDE7CiAKQEAgLTIxNCw5ICsyNTAsOSBAQAogCQlpbmZvLT5lcnJzdHMgPSBpbmZvLT5lcnJzdHMyOwogCX0KIAotCXBmbiA9IEkzMDAwX0RFQVBfUEZOKGluZm8tPmVkZWFwLCBpbmZvLT5kZWFwKTsKLQlvZmZzZXQgPSBJMzAwMF9ERUFQX09GRlNFVChpbmZvLT5kZWFwKTsKLQljaGFubmVsID0gSTMwMDBfREVBUF9DSEFOTkVMKGluZm8tPmRlYXApOworCXBmbiA9IGRlYXBfcGZuKGluZm8tPmVkZWFwLCBpbmZvLT5kZWFwKTsKKwlvZmZzZXQgPSBkZWFwX29mZnNldChpbmZvLT5kZWFwKTsKKwljaGFubmVsID0gZGVhcF9jaGFubmVsKGluZm8tPmRlYXApOwogCiAJcm93ID0gZWRhY19tY19maW5kX2Nzcm93X2J5X3BhZ2UobWNpLCBwZm4pOwogCkBAIC0yNDUsMTYgKzI4MSwxOCBAQAogewogCWludCBpOwogCi0JLyogSWYgdGhlIGNoYW5uZWxzIGFyZW4ndCBwb3B1bGF0ZWQgaWRlbnRpY2FsbHkgdGhlbgorCS8qCisJICogSWYgdGhlIGNoYW5uZWxzIGFyZW4ndCBwb3B1bGF0ZWQgaWRlbnRpY2FsbHkgdGhlbgogCSAqIHdlJ3JlIG5vdCBpbnRlcmxlYXZlZC4KIAkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgSTMwMDBfUkFOS1NfUEVSX0NIQU5ORUwgLyAyOyBpKyspCi0JCWlmIChPRERfUkFOS19BVFRSSUIoYzBkcmFbaV0pICE9IE9ERF9SQU5LX0FUVFJJQihjMWRyYVtpXSkgfHwKLQkJCUVWRU5fUkFOS19BVFRSSUIoYzBkcmFbaV0pICE9Ci0JCQkJCQlFVkVOX1JBTktfQVRUUklCKGMxZHJhW2ldKSkKKwkJaWYgKG9kZF9yYW5rX2F0dHJpYihjMGRyYVtpXSkgIT0gb2RkX3JhbmtfYXR0cmliKGMxZHJhW2ldKSB8fAorCQkJZXZlbl9yYW5rX2F0dHJpYihjMGRyYVtpXSkgIT0KKwkJCQkJCWV2ZW5fcmFua19hdHRyaWIoYzFkcmFbaV0pKQogCQkJcmV0dXJuIDA7CiAKLQkvKiBJZiB0aGUgcmFuayBib3VuZGFyaWVzIGZvciB0aGUgdHdvIGNoYW5uZWxzIGFyZSBkaWZmZXJlbnQKKwkvKgorCSAqIElmIHRoZSByYW5rIGJvdW5kYXJpZXMgZm9yIHRoZSB0d28gY2hhbm5lbHMgYXJlIGRpZmZlcmVudAogCSAqIHRoZW4gd2UncmUgbm90IGludGVybGVhdmVkLgogCSAqLwogCWZvciAoaSA9IDA7IGkgPCBJMzAwMF9SQU5LU19QRVJfQ0hBTk5FTDsgaSsrKQpAQCAtMjg4LDYgKzMyNiwxNSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwlzd2l0Y2ggKGVkYWNfb3Bfc3RhdGUpIHsKKwljYXNlIEVEQUNfT1BTVEFURV9QT0xMOgorCWNhc2UgRURBQ19PUFNUQVRFX05NSToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZWRhY19vcF9zdGF0ZSA9IEVEQUNfT1BTVEFURV9QT0xMOworCQlicmVhazsKKwl9CisKIAljMGRyYVswXSA9IHJlYWRiKHdpbmRvdyArIEkzMDAwX0MwRFJBICsgMCk7CS8qIHJhbmtzIDAsMSAqLwogCWMwZHJhWzFdID0gcmVhZGIod2luZG93ICsgSTMwMDBfQzBEUkEgKyAxKTsJLyogcmFua3MgMiwzICovCiAJYzFkcmFbMF0gPSByZWFkYih3aW5kb3cgKyBJMzAwMF9DMURSQSArIDApOwkvKiByYW5rcyAwLDEgKi8KQEAgLTMwMCw3ICszNDcsOCBAQAogCiAJaW91bm1hcCh3aW5kb3cpOwogCi0JLyogRmlndXJlIG91dCBob3cgbWFueSBjaGFubmVscyB3ZSBoYXZlLgorCS8qCisJICogRmlndXJlIG91dCBob3cgbWFueSBjaGFubmVscyB3ZSBoYXZlLgogCSAqCiAJICogSWYgd2UgaGF2ZSB3aGF0IHRoZSBkYXRhc2hlZXQgY2FsbHMgImFzeW1tZXRyaWMgY2hhbm5lbHMiCiAJICogKGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzIHdoYXQgd2FzIGNhbGxlZCAidmlydHVhbCBzaW5nbGUKQEAgLTM2Myw3ICs0MTEsOCBAQAogCQljc3Jvdy0+ZWRhY19tb2RlID0gRURBQ19VTktOT1dOOwogCX0KIAotCS8qIENsZWFyIGFueSBlcnJvciBiaXRzLgorCS8qCisJICogQ2xlYXIgYW55IGVycm9yIGJpdHMuCiAJICogKFllcywgd2UgcmVhbGx5IGNsZWFyIGJpdHMgYnkgd3JpdGluZyAxIHRvIHRoZW0uKQogCSAqLwogCXBjaV93cml0ZV9iaXRzMTYocGRldiwgSTMwMDBfRVJSU1RTLCBJMzAwMF9FUlJTVFNfQklUUywKQEAgLTM5MCw3ICs0MzksNyBAQAogCWRlYnVnZjMoIk1DOiAlcygpOiBzdWNjZXNzXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIDA7CiAKLSAgICAgIGZhaWw6CitmYWlsOgogCWlmIChtY2kpCiAJCWVkYWNfbWNfZnJlZShtY2kpOwogCkBAIC00MDksNyArNDU4LDcgQEAKIAkJcmV0dXJuIC1FSU87CiAKIAlyYyA9IGkzMDAwX3Byb2JlMShwZGV2LCBlbnQtPmRyaXZlcl9kYXRhKTsKLQlpZiAobWNpX3BkZXYgPT0gTlVMTCkKKwlpZiAoIW1jaV9wZGV2KQogCQltY2lfcGRldiA9IHBjaV9kZXZfZ2V0KHBkZXYpOwogCiAJcmV0dXJuIHJjOwpAQCAtNDI0LDcgKzQ3Myw4IEBACiAJaWYgKGkzMDAwX3BjaSkKIAkJZWRhY19wY2lfcmVsZWFzZV9nZW5lcmljX2N0bChpMzAwMF9wY2kpOwogCi0JaWYgKChtY2kgPSBlZGFjX21jX2RlbF9tYygmcGRldi0+ZGV2KSkgPT0gTlVMTCkKKwltY2kgPSBlZGFjX21jX2RlbF9tYygmcGRldi0+ZGV2KTsKKwlpZiAoIW1jaSkKIAkJcmV0dXJuOwogCiAJZWRhY19tY19mcmVlKG1jaSk7CkBAIC00NTcsNyArNTA3LDcgQEAKIAlpZiAocGNpX3JjIDwgMCkKIAkJZ290byBmYWlsMDsKIAotCWlmIChtY2lfcGRldiA9PSBOVUxMKSB7CisJaWYgKCFtY2lfcGRldikgewogCQlpMzAwMF9yZWdpc3RlcmVkID0gMDsKIAkJbWNpX3BkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAogCQkJCQlQQ0lfREVWSUNFX0lEX0lOVEVMXzMwMDBfSEIsIE5VTEwpOwpAQCAtNTA0LDMgKzU1NCw2IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJBa2FtYWkgVGVjaG5vbG9naWVzIEFydGh1ciBVbGZlbGR0L0phc29uIFVobGVua290dCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJNQyBzdXBwb3J0IGZvciBJbnRlbCAzMDAwIG1lbW9yeSBodWIgY29udHJvbGxlcnMiKTsKKworbW9kdWxlX3BhcmFtKGVkYWNfb3Bfc3RhdGUsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVkYWNfb3Bfc3RhdGUsICJFREFDIEVycm9yIFJlcG9ydGluZyBzdGF0ZTogMD1Qb2xsLDE9Tk1JIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvbXBjODV4eF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvbXBjODV4eF9lZGFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY1NzMyZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuYwpAQCAtMCwwICsxLDEwNDMgQEAKKy8qCisgKiBGcmVlc2NhbGUgTVBDODV4eCBNZW1vcnkgQ29udHJvbGxlciBrZW5lbCBtb2R1bGUKKyAqCisgKiBBdXRob3I6IERhdmUgSmlhbmcgPGRqaWFuZ0BtdmlzdGEuY29tPgorICoKKyAqIDIwMDYtMjAwNyAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lZGFjLmg+CisKKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGFzbS9tcGM4NXh4Lmg+CisjaW5jbHVkZSAiZWRhY19tb2R1bGUuaCIKKyNpbmNsdWRlICJlZGFjX2NvcmUuaCIKKyNpbmNsdWRlICJtcGM4NXh4X2VkYWMuaCIKKworc3RhdGljIGludCBlZGFjX2Rldl9pZHg7CitzdGF0aWMgaW50IGVkYWNfcGNpX2lkeDsKK3N0YXRpYyBpbnQgZWRhY19tY19pZHg7CisKK3N0YXRpYyB1MzIgb3JpZ19kZHJfZXJyX2Rpc2FibGU7CitzdGF0aWMgdTMyIG9yaWdfZGRyX2Vycl9zYmU7CisKKy8qCisgKiBQQ0kgRXJyIGRlZmluZXMKKyAqLworI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyB1MzIgb3JpZ19wY2lfZXJyX2NhcF9kcjsKK3N0YXRpYyB1MzIgb3JpZ19wY2lfZXJyX2VuOworI2VuZGlmCisKK3N0YXRpYyB1MzIgb3JpZ19sMl9lcnJfZGlzYWJsZTsKK3N0YXRpYyB1MzIgb3JpZ19oaWQxOworCitzdGF0aWMgY29uc3QgY2hhciAqbXBjODV4eF9jdGxfbmFtZSA9ICJNUEM4NXh4IjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBNQyBTWVNGUyBwYXJ0cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHNzaXplX3QgbXBjODV4eF9tY19pbmplY3RfZGF0YV9oaV9zaG93KHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJCQkJICAgICAgY2hhciAqZGF0YSkKK3sKKwlzdHJ1Y3QgbXBjODV4eF9tY19wZGF0YSAqcGRhdGEgPSBtY2ktPnB2dF9pbmZvOworCXJldHVybiBzcHJpbnRmKGRhdGEsICIweCUwOHgiLAorCQkgICAgICAgaW5fYmUzMihwZGF0YS0+bWNfdmJhc2UgKworCQkJICAgICAgIE1QQzg1WFhfTUNfREFUQV9FUlJfSU5KRUNUX0hJKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1wYzg1eHhfbWNfaW5qZWN0X2RhdGFfbG9fc2hvdyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQkJCSAgICAgIGNoYXIgKmRhdGEpCit7CisJc3RydWN0IG1wYzg1eHhfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKKwlyZXR1cm4gc3ByaW50ZihkYXRhLCAiMHglMDh4IiwKKwkJICAgICAgIGluX2JlMzIocGRhdGEtPm1jX3ZiYXNlICsKKwkJCSAgICAgICBNUEM4NVhYX01DX0RBVEFfRVJSX0lOSkVDVF9MTykpOworfQorCitzdGF0aWMgc3NpemVfdCBtcGM4NXh4X21jX2luamVjdF9jdHJsX3Nob3coc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLCBjaGFyICpkYXRhKQoreworCXN0cnVjdCBtcGM4NXh4X21jX3BkYXRhICpwZGF0YSA9IG1jaS0+cHZ0X2luZm87CisJcmV0dXJuIHNwcmludGYoZGF0YSwgIjB4JTA4eCIsCisJCSAgICAgICBpbl9iZTMyKHBkYXRhLT5tY192YmFzZSArIE1QQzg1WFhfTUNfRUNDX0VSUl9JTkpFQ1QpKTsKK30KKworc3RhdGljIHNzaXplX3QgbXBjODV4eF9tY19pbmplY3RfZGF0YV9oaV9zdG9yZShzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IG1wYzg1eHhfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKKwlpZiAoaXNkaWdpdCgqZGF0YSkpIHsKKwkJb3V0X2JlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVBDODVYWF9NQ19EQVRBX0VSUl9JTkpFQ1RfSEksCisJCQkgc2ltcGxlX3N0cnRvdWwoZGF0YSwgTlVMTCwgMCkpOworCQlyZXR1cm4gY291bnQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBtcGM4NXh4X21jX2luamVjdF9kYXRhX2xvX3N0b3JlKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJCQkJICAgICAgIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgbXBjODV4eF9tY19wZGF0YSAqcGRhdGEgPSBtY2ktPnB2dF9pbmZvOworCWlmIChpc2RpZ2l0KCpkYXRhKSkgeworCQlvdXRfYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0RBVEFfRVJSX0lOSkVDVF9MTywKKwkJCSBzaW1wbGVfc3RydG91bChkYXRhLCBOVUxMLCAwKSk7CisJCXJldHVybiBjb3VudDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1wYzg1eHhfbWNfaW5qZWN0X2N0cmxfc3RvcmUoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJCQkgICAgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBtcGM4NXh4X21jX3BkYXRhICpwZGF0YSA9IG1jaS0+cHZ0X2luZm87CisJaWYgKGlzZGlnaXQoKmRhdGEpKSB7CisJCW91dF9iZTMyKHBkYXRhLT5tY192YmFzZSArIE1QQzg1WFhfTUNfRUNDX0VSUl9JTkpFQ1QsCisJCQkgc2ltcGxlX3N0cnRvdWwoZGF0YSwgTlVMTCwgMCkpOworCQlyZXR1cm4gY291bnQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG1jaWRldl9zeXNmc19hdHRyaWJ1dGUgbXBjODV4eF9tY19zeXNmc19hdHRyaWJ1dGVzW10gPSB7CisJeworCSAuYXR0ciA9IHsKKwkJICAubmFtZSA9ICJpbmplY3RfZGF0YV9oaSIsCisJCSAgLm1vZGUgPSAoU19JUlVHTyB8IFNfSVdVU1IpCisJCSAgfSwKKwkgLnNob3cgPSBtcGM4NXh4X21jX2luamVjdF9kYXRhX2hpX3Nob3csCisJIC5zdG9yZSA9IG1wYzg1eHhfbWNfaW5qZWN0X2RhdGFfaGlfc3RvcmV9LAorCXsKKwkgLmF0dHIgPSB7CisJCSAgLm5hbWUgPSAiaW5qZWN0X2RhdGFfbG8iLAorCQkgIC5tb2RlID0gKFNfSVJVR08gfCBTX0lXVVNSKQorCQkgIH0sCisJIC5zaG93ID0gbXBjODV4eF9tY19pbmplY3RfZGF0YV9sb19zaG93LAorCSAuc3RvcmUgPSBtcGM4NXh4X21jX2luamVjdF9kYXRhX2xvX3N0b3JlfSwKKwl7CisJIC5hdHRyID0geworCQkgIC5uYW1lID0gImluamVjdF9jdHJsIiwKKwkJICAubW9kZSA9IChTX0lSVUdPIHwgU19JV1VTUikKKwkJICB9LAorCSAuc2hvdyA9IG1wYzg1eHhfbWNfaW5qZWN0X2N0cmxfc2hvdywKKwkgLnN0b3JlID0gbXBjODV4eF9tY19pbmplY3RfY3RybF9zdG9yZX0sCisKKwkvKiBFbmQgb2YgbGlzdCAqLworCXsKKwkgLmF0dHIgPSB7Lm5hbWUgPSBOVUxMfQorCSB9Cit9OworCitzdGF0aWMgdm9pZCBtcGM4NXh4X3NldF9tY19zeXNmc19hdHRyaWJ1dGVzKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwltY2ktPm1jX2RyaXZlcl9zeXNmc19hdHRyaWJ1dGVzID0gbXBjODV4eF9tY19zeXNmc19hdHRyaWJ1dGVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQQ0kgRXJyIGRldmljZSAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQ09ORklHX1BDSQorCitzdGF0aWMgdm9pZCBtcGM4NXh4X3BjaV9jaGVjayhzdHJ1Y3QgZWRhY19wY2lfY3RsX2luZm8gKnBjaSkKK3sKKwlzdHJ1Y3QgbXBjODV4eF9wY2lfcGRhdGEgKnBkYXRhID0gcGNpLT5wdnRfaW5mbzsKKwl1MzIgZXJyX2RldGVjdDsKKworCWVycl9kZXRlY3QgPSBpbl9iZTMyKHBkYXRhLT5wY2lfdmJhc2UgKyBNUEM4NVhYX1BDSV9FUlJfRFIpOworCisJLyogbWFzdGVyIGFib3J0cyBjYW4gaGFwcGVuIGR1cmluZyBQQ0kgY29uZmlnIGN5Y2xlcyAqLworCWlmICghKGVycl9kZXRlY3QgJiB+KFBDSV9FREVfTVVMVElfRVJSIHwgUENJX0VERV9NU1RfQUJSVCkpKSB7CisJCW91dF9iZTMyKHBkYXRhLT5wY2lfdmJhc2UgKyBNUEM4NVhYX1BDSV9FUlJfRFIsIGVycl9kZXRlY3QpOworCQlyZXR1cm47CisJfQorCisJcHJpbnRrKEtFUk5fRVJSICJQQ0kgZXJyb3IocykgZGV0ZWN0ZWRcbiIpOworCXByaW50ayhLRVJOX0VSUiAiUENJL1ggRVJSX0RSIHJlZ2lzdGVyOiAlIzA4eFxuIiwgZXJyX2RldGVjdCk7CisKKwlwcmludGsoS0VSTl9FUlIgIlBDSS9YIEVSUl9BVFRSSUIgcmVnaXN0ZXI6ICUjMDh4XG4iLAorCSAgICAgICBpbl9iZTMyKHBkYXRhLT5wY2lfdmJhc2UgKyBNUEM4NVhYX1BDSV9FUlJfQVRUUklCKSk7CisJcHJpbnRrKEtFUk5fRVJSICJQQ0kvWCBFUlJfQUREUiByZWdpc3RlcjogJSMwOHhcbiIsCisJICAgICAgIGluX2JlMzIocGRhdGEtPnBjaV92YmFzZSArIE1QQzg1WFhfUENJX0VSUl9BRERSKSk7CisJcHJpbnRrKEtFUk5fRVJSICJQQ0kvWCBFUlJfRVhUX0FERFIgcmVnaXN0ZXI6ICUjMDh4XG4iLAorCSAgICAgICBpbl9iZTMyKHBkYXRhLT5wY2lfdmJhc2UgKyBNUEM4NVhYX1BDSV9FUlJfRVhUX0FERFIpKTsKKwlwcmludGsoS0VSTl9FUlIgIlBDSS9YIEVSUl9ETCByZWdpc3RlcjogJSMwOHhcbiIsCisJICAgICAgIGluX2JlMzIocGRhdGEtPnBjaV92YmFzZSArIE1QQzg1WFhfUENJX0VSUl9ETCkpOworCXByaW50ayhLRVJOX0VSUiAiUENJL1ggRVJSX0RIIHJlZ2lzdGVyOiAlIzA4eFxuIiwKKwkgICAgICAgaW5fYmUzMihwZGF0YS0+cGNpX3ZiYXNlICsgTVBDODVYWF9QQ0lfRVJSX0RIKSk7CisKKwkvKiBjbGVhciBlcnJvciBiaXRzICovCisJb3V0X2JlMzIocGRhdGEtPnBjaV92YmFzZSArIE1QQzg1WFhfUENJX0VSUl9EUiwgZXJyX2RldGVjdCk7CisKKwlpZiAoZXJyX2RldGVjdCAmIFBDSV9FREVfUEVSUl9NQVNLKQorCQllZGFjX3BjaV9oYW5kbGVfcGUocGNpLCBwY2ktPmN0bF9uYW1lKTsKKworCWlmICgoZXJyX2RldGVjdCAmIH5QQ0lfRURFX01VTFRJX0VSUikgJiB+UENJX0VERV9QRVJSX01BU0spCisJCWVkYWNfcGNpX2hhbmRsZV9ucGUocGNpLCBwY2ktPmN0bF9uYW1lKTsKK30KKworc3RhdGljIGlycXJldHVybl90IG1wYzg1eHhfcGNpX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGVkYWNfcGNpX2N0bF9pbmZvICpwY2kgPSBkZXZfaWQ7CisJc3RydWN0IG1wYzg1eHhfcGNpX3BkYXRhICpwZGF0YSA9IHBjaS0+cHZ0X2luZm87CisJdTMyIGVycl9kZXRlY3Q7CisKKwllcnJfZGV0ZWN0ID0gaW5fYmUzMihwZGF0YS0+cGNpX3ZiYXNlICsgTVBDODVYWF9QQ0lfRVJSX0RSKTsKKworCWlmICghZXJyX2RldGVjdCkKKwkJcmV0dXJuIElSUV9OT05FOworCisJbXBjODV4eF9wY2lfY2hlY2socGNpKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgbXBjODV4eF9wY2lfZXJyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGVkYWNfcGNpX2N0bF9pbmZvICpwY2k7CisJc3RydWN0IG1wYzg1eHhfcGNpX3BkYXRhICpwZGF0YTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisJaW50IHJlcyA9IDA7CisKKwlpZiAoIWRldnJlc19vcGVuX2dyb3VwKCZwZGV2LT5kZXYsIG1wYzg1eHhfcGNpX2Vycl9wcm9iZSwgR0ZQX0tFUk5FTCkpCisJCXJldHVybiAtRU5PTUVNOworCisJcGNpID0gZWRhY19wY2lfYWxsb2NfY3RsX2luZm8oc2l6ZW9mKCpwZGF0YSksICJtcGM4NXh4X3BjaV9lcnIiKTsKKwlpZiAoIXBjaSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwZGF0YSA9IHBjaS0+cHZ0X2luZm87CisJcGRhdGEtPm5hbWUgPSAibXBjODV4eF9wY2lfZXJyIjsKKwlwZGF0YS0+aXJxID0gTk9fSVJROworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBjaSk7CisJcGNpLT5kZXYgPSAmcGRldi0+ZGV2OworCXBjaS0+bW9kX25hbWUgPSBFREFDX01PRF9TVFI7CisJcGNpLT5jdGxfbmFtZSA9IHBkYXRhLT5uYW1lOworCXBjaS0+ZGV2X25hbWUgPSBwZGV2LT5kZXYuYnVzX2lkOworCisJaWYgKGVkYWNfb3Bfc3RhdGUgPT0gRURBQ19PUFNUQVRFX1BPTEwpCisJCXBjaS0+ZWRhY19jaGVjayA9IG1wYzg1eHhfcGNpX2NoZWNrOworCisJcGRhdGEtPmVkYWNfaWR4ID0gZWRhY19wY2lfaWR4Kys7CisKKwlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGdldCByZXNvdXJjZSBmb3IgIgorCQkgICAgICAgIlBDSSBlcnIgcmVnc1xuIiwgX19mdW5jX18pOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIHItPnN0YXJ0LAorCQkJCSAgICAgci0+ZW5kIC0gci0+c3RhcnQgKyAxLCBwZGF0YS0+bmFtZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBtZW0gcmVnaW9uXG4iLAorCQkgICAgICAgX19mdW5jX18pOworCQlyZXMgPSAtRUJVU1k7CisJCWdvdG8gZXJyOworCX0KKworCXBkYXRhLT5wY2lfdmJhc2UgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgci0+c3RhcnQsCisJCQkJCXItPmVuZCAtIHItPnN0YXJ0ICsgMSk7CisJaWYgKCFwZGF0YS0+cGNpX3ZiYXNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBzZXR1cCBQQ0kgZXJyIHJlZ3NcbiIsIF9fZnVuY19fKTsKKwkJcmVzID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJb3JpZ19wY2lfZXJyX2NhcF9kciA9CisJICAgIGluX2JlMzIocGRhdGEtPnBjaV92YmFzZSArIE1QQzg1WFhfUENJX0VSUl9DQVBfRFIpOworCisJLyogUENJIG1hc3RlciBhYm9ydCBpcyBleHBlY3RlZCBkdXJpbmcgY29uZmlnIGN5Y2xlcyAqLworCW91dF9iZTMyKHBkYXRhLT5wY2lfdmJhc2UgKyBNUEM4NVhYX1BDSV9FUlJfQ0FQX0RSLCAweDQwKTsKKworCW9yaWdfcGNpX2Vycl9lbiA9IGluX2JlMzIocGRhdGEtPnBjaV92YmFzZSArIE1QQzg1WFhfUENJX0VSUl9FTik7CisKKwkvKiBkaXNhYmxlIG1hc3RlciBhYm9ydCByZXBvcnRpbmcgKi8KKwlvdXRfYmUzMihwZGF0YS0+cGNpX3ZiYXNlICsgTVBDODVYWF9QQ0lfRVJSX0VOLCB+MHg0MCk7CisKKwkvKiBjbGVhciBlcnJvciBiaXRzICovCisJb3V0X2JlMzIocGRhdGEtPnBjaV92YmFzZSArIE1QQzg1WFhfUENJX0VSUl9EUiwgfjApOworCisJaWYgKGVkYWNfcGNpX2FkZF9kZXZpY2UocGNpLCBwZGF0YS0+ZWRhY19pZHgpID4gMCkgeworCQlkZWJ1Z2YzKCIlcygpOiBmYWlsZWQgZWRhY19wY2lfYWRkX2RldmljZSgpXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyOworCX0KKworCWlmIChlZGFjX29wX3N0YXRlID09IEVEQUNfT1BTVEFURV9JTlQpIHsKKwkJcGRhdGEtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJCXJlcyA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgcGRhdGEtPmlycSwKKwkJCQkgICAgICAgbXBjODV4eF9wY2lfaXNyLCBJUlFGX0RJU0FCTEVELAorCQkJCSAgICAgICAiW0VEQUNdIFBDSSBlcnIiLCBwY2kpOworCQlpZiAocmVzIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIiVzOiBVbmFibGUgdG8gcmVxdWllc3QgaXJxICVkIGZvciAiCisJCQkgICAgICAgIk1QQzg1eHggUENJIGVyclxuIiwgX19mdW5jX18sIHBkYXRhLT5pcnEpOworCQkJcmVzID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyMjsKKwkJfQorCisJCXByaW50ayhLRVJOX0lORk8gRURBQ19NT0RfU1RSICIgYWNxdWlyZWQgaXJxICVkIGZvciBQQ0kgRXJyXG4iLAorCQkgICAgICAgcGRhdGEtPmlycSk7CisJfQorCisJZGV2cmVzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LCBtcGM4NXh4X3BjaV9lcnJfcHJvYmUpOworCWRlYnVnZjMoIiVzKCk6IHN1Y2Nlc3NcbiIsIF9fZnVuY19fKTsKKwlwcmludGsoS0VSTl9JTkZPIEVEQUNfTU9EX1NUUiAiIFBDSSBlcnIgcmVnaXN0ZXJlZFxuIik7CisKKwlyZXR1cm4gMDsKKworZXJyMjoKKwllZGFjX3BjaV9kZWxfZGV2aWNlKCZwZGV2LT5kZXYpOworZXJyOgorCWVkYWNfcGNpX2ZyZWVfY3RsX2luZm8ocGNpKTsKKwlkZXZyZXNfcmVsZWFzZV9ncm91cCgmcGRldi0+ZGV2LCBtcGM4NXh4X3BjaV9lcnJfcHJvYmUpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgbXBjODV4eF9wY2lfZXJyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBlZGFjX3BjaV9jdGxfaW5mbyAqcGNpID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IG1wYzg1eHhfcGNpX3BkYXRhICpwZGF0YSA9IHBjaS0+cHZ0X2luZm87CisKKwlkZWJ1Z2YwKCIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlvdXRfYmUzMihwZGF0YS0+cGNpX3ZiYXNlICsgTVBDODVYWF9QQ0lfRVJSX0NBUF9EUiwKKwkJIG9yaWdfcGNpX2Vycl9jYXBfZHIpOworCisJb3V0X2JlMzIocGRhdGEtPnBjaV92YmFzZSArIE1QQzg1WFhfUENJX0VSUl9FTiwgb3JpZ19wY2lfZXJyX2VuKTsKKworCWVkYWNfcGNpX2RlbF9kZXZpY2UocGNpLT5kZXYpOworCisJaWYgKGVkYWNfb3Bfc3RhdGUgPT0gRURBQ19PUFNUQVRFX0lOVCkKKwkJaXJxX2Rpc3Bvc2VfbWFwcGluZyhwZGF0YS0+aXJxKTsKKworCWVkYWNfcGNpX2ZyZWVfY3RsX2luZm8ocGNpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtcGM4NXh4X3BjaV9lcnJfZHJpdmVyID0geworCS5wcm9iZSA9IG1wYzg1eHhfcGNpX2Vycl9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AobXBjODV4eF9wY2lfZXJyX3JlbW92ZSksCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibXBjODV4eF9wY2lfZXJyIiwKKwl9Cit9OworCisjZW5kaWYJCQkJLyogQ09ORklHX1BDSSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBMMiBFcnIgZGV2aWNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBMMiBTWVNGUyBwYXJ0cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHNzaXplX3QgbXBjODV4eF9sMl9pbmplY3RfZGF0YV9oaV9zaG93KHN0cnVjdCBlZGFjX2RldmljZV9jdGxfaW5mbworCQkJCQkgICAgICAqZWRhY19kZXYsIGNoYXIgKmRhdGEpCit7CisJc3RydWN0IG1wYzg1eHhfbDJfcGRhdGEgKnBkYXRhID0gZWRhY19kZXYtPnB2dF9pbmZvOworCXJldHVybiBzcHJpbnRmKGRhdGEsICIweCUwOHgiLAorCQkgICAgICAgaW5fYmUzMihwZGF0YS0+bDJfdmJhc2UgKyBNUEM4NVhYX0wyX0VSUklOSkhJKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1wYzg1eHhfbDJfaW5qZWN0X2RhdGFfbG9fc2hvdyhzdHJ1Y3QgZWRhY19kZXZpY2VfY3RsX2luZm8KKwkJCQkJICAgICAgKmVkYWNfZGV2LCBjaGFyICpkYXRhKQoreworCXN0cnVjdCBtcGM4NXh4X2wyX3BkYXRhICpwZGF0YSA9IGVkYWNfZGV2LT5wdnRfaW5mbzsKKwlyZXR1cm4gc3ByaW50ZihkYXRhLCAiMHglMDh4IiwKKwkJICAgICAgIGluX2JlMzIocGRhdGEtPmwyX3ZiYXNlICsgTVBDODVYWF9MMl9FUlJJTkpMTykpOworfQorCitzdGF0aWMgc3NpemVfdCBtcGM4NXh4X2wyX2luamVjdF9jdHJsX3Nob3coc3RydWN0IGVkYWNfZGV2aWNlX2N0bF9pbmZvCisJCQkJCSAgICplZGFjX2RldiwgY2hhciAqZGF0YSkKK3sKKwlzdHJ1Y3QgbXBjODV4eF9sMl9wZGF0YSAqcGRhdGEgPSBlZGFjX2Rldi0+cHZ0X2luZm87CisJcmV0dXJuIHNwcmludGYoZGF0YSwgIjB4JTA4eCIsCisJCSAgICAgICBpbl9iZTMyKHBkYXRhLT5sMl92YmFzZSArIE1QQzg1WFhfTDJfRVJSSU5KQ1RMKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1wYzg1eHhfbDJfaW5qZWN0X2RhdGFfaGlfc3RvcmUoc3RydWN0IGVkYWNfZGV2aWNlX2N0bF9pbmZvCisJCQkJCSAgICAgICAqZWRhY19kZXYsIGNvbnN0IGNoYXIgKmRhdGEsCisJCQkJCSAgICAgICBzaXplX3QgY291bnQpCit7CisJc3RydWN0IG1wYzg1eHhfbDJfcGRhdGEgKnBkYXRhID0gZWRhY19kZXYtPnB2dF9pbmZvOworCWlmIChpc2RpZ2l0KCpkYXRhKSkgeworCQlvdXRfYmUzMihwZGF0YS0+bDJfdmJhc2UgKyBNUEM4NVhYX0wyX0VSUklOSkhJLAorCQkJIHNpbXBsZV9zdHJ0b3VsKGRhdGEsIE5VTEwsIDApKTsKKwkJcmV0dXJuIGNvdW50OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgbXBjODV4eF9sMl9pbmplY3RfZGF0YV9sb19zdG9yZShzdHJ1Y3QgZWRhY19kZXZpY2VfY3RsX2luZm8KKwkJCQkJICAgICAgICplZGFjX2RldiwgY29uc3QgY2hhciAqZGF0YSwKKwkJCQkJICAgICAgIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgbXBjODV4eF9sMl9wZGF0YSAqcGRhdGEgPSBlZGFjX2Rldi0+cHZ0X2luZm87CisJaWYgKGlzZGlnaXQoKmRhdGEpKSB7CisJCW91dF9iZTMyKHBkYXRhLT5sMl92YmFzZSArIE1QQzg1WFhfTDJfRVJSSU5KTE8sCisJCQkgc2ltcGxlX3N0cnRvdWwoZGF0YSwgTlVMTCwgMCkpOworCQlyZXR1cm4gY291bnQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBtcGM4NXh4X2wyX2luamVjdF9jdHJsX3N0b3JlKHN0cnVjdCBlZGFjX2RldmljZV9jdGxfaW5mbworCQkJCQkgICAgKmVkYWNfZGV2LCBjb25zdCBjaGFyICpkYXRhLAorCQkJCQkgICAgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBtcGM4NXh4X2wyX3BkYXRhICpwZGF0YSA9IGVkYWNfZGV2LT5wdnRfaW5mbzsKKwlpZiAoaXNkaWdpdCgqZGF0YSkpIHsKKwkJb3V0X2JlMzIocGRhdGEtPmwyX3ZiYXNlICsgTVBDODVYWF9MMl9FUlJJTkpDVEwsCisJCQkgc2ltcGxlX3N0cnRvdWwoZGF0YSwgTlVMTCwgMCkpOworCQlyZXR1cm4gY291bnQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGVkYWNfZGV2X3N5c2ZzX2F0dHJpYnV0ZSBtcGM4NXh4X2wyX3N5c2ZzX2F0dHJpYnV0ZXNbXSA9IHsKKwl7CisJIC5hdHRyID0geworCQkgIC5uYW1lID0gImluamVjdF9kYXRhX2hpIiwKKwkJICAubW9kZSA9IChTX0lSVUdPIHwgU19JV1VTUikKKwkJICB9LAorCSAuc2hvdyA9IG1wYzg1eHhfbDJfaW5qZWN0X2RhdGFfaGlfc2hvdywKKwkgLnN0b3JlID0gbXBjODV4eF9sMl9pbmplY3RfZGF0YV9oaV9zdG9yZX0sCisJeworCSAuYXR0ciA9IHsKKwkJICAubmFtZSA9ICJpbmplY3RfZGF0YV9sbyIsCisJCSAgLm1vZGUgPSAoU19JUlVHTyB8IFNfSVdVU1IpCisJCSAgfSwKKwkgLnNob3cgPSBtcGM4NXh4X2wyX2luamVjdF9kYXRhX2xvX3Nob3csCisJIC5zdG9yZSA9IG1wYzg1eHhfbDJfaW5qZWN0X2RhdGFfbG9fc3RvcmV9LAorCXsKKwkgLmF0dHIgPSB7CisJCSAgLm5hbWUgPSAiaW5qZWN0X2N0cmwiLAorCQkgIC5tb2RlID0gKFNfSVJVR08gfCBTX0lXVVNSKQorCQkgIH0sCisJIC5zaG93ID0gbXBjODV4eF9sMl9pbmplY3RfY3RybF9zaG93LAorCSAuc3RvcmUgPSBtcGM4NXh4X2wyX2luamVjdF9jdHJsX3N0b3JlfSwKKworCS8qIEVuZCBvZiBsaXN0ICovCisJeworCSAuYXR0ciA9IHsubmFtZSA9IE5VTEx9CisJIH0KK307CisKK3N0YXRpYyB2b2lkIG1wYzg1eHhfc2V0X2wyX3N5c2ZzX2F0dHJpYnV0ZXMoc3RydWN0IGVkYWNfZGV2aWNlX2N0bF9pbmZvCisJCQkJCSAgICAqZWRhY19kZXYpCit7CisJZWRhY19kZXYtPnN5c2ZzX2F0dHJpYnV0ZXMgPSBtcGM4NXh4X2wyX3N5c2ZzX2F0dHJpYnV0ZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBMMiBvcHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIG1wYzg1eHhfbDJfY2hlY2soc3RydWN0IGVkYWNfZGV2aWNlX2N0bF9pbmZvICplZGFjX2RldikKK3sKKwlzdHJ1Y3QgbXBjODV4eF9sMl9wZGF0YSAqcGRhdGEgPSBlZGFjX2Rldi0+cHZ0X2luZm87CisJdTMyIGVycl9kZXRlY3Q7CisKKwllcnJfZGV0ZWN0ID0gaW5fYmUzMihwZGF0YS0+bDJfdmJhc2UgKyBNUEM4NVhYX0wyX0VSUkRFVCk7CisKKwlpZiAoIShlcnJfZGV0ZWN0ICYgTDJfRURFX01BU0spKQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9FUlIgIkVDQyBFcnJvciBpbiBDUFUgTDIgY2FjaGVcbiIpOworCXByaW50ayhLRVJOX0VSUiAiTDIgRXJyb3IgRGV0ZWN0IFJlZ2lzdGVyOiAweCUwOHhcbiIsIGVycl9kZXRlY3QpOworCXByaW50ayhLRVJOX0VSUiAiTDIgRXJyb3IgQ2FwdHVyZSBEYXRhIEhpZ2ggUmVnaXN0ZXI6IDB4JTA4eFxuIiwKKwkgICAgICAgaW5fYmUzMihwZGF0YS0+bDJfdmJhc2UgKyBNUEM4NVhYX0wyX0NBUFREQVRBSEkpKTsKKwlwcmludGsoS0VSTl9FUlIgIkwyIEVycm9yIENhcHR1cmUgRGF0YSBMbyBSZWdpc3RlcjogMHglMDh4XG4iLAorCSAgICAgICBpbl9iZTMyKHBkYXRhLT5sMl92YmFzZSArIE1QQzg1WFhfTDJfQ0FQVERBVEFMTykpOworCXByaW50ayhLRVJOX0VSUiAiTDIgRXJyb3IgU3luZHJvbWUgUmVnaXN0ZXI6IDB4JTA4eFxuIiwKKwkgICAgICAgaW5fYmUzMihwZGF0YS0+bDJfdmJhc2UgKyBNUEM4NVhYX0wyX0NBUFRFQ0MpKTsKKwlwcmludGsoS0VSTl9FUlIgIkwyIEVycm9yIEF0dHJpYnV0ZXMgQ2FwdHVyZSBSZWdpc3RlcjogMHglMDh4XG4iLAorCSAgICAgICBpbl9iZTMyKHBkYXRhLT5sMl92YmFzZSArIE1QQzg1WFhfTDJfRVJSQVRUUikpOworCXByaW50ayhLRVJOX0VSUiAiTDIgRXJyb3IgQWRkcmVzcyBDYXB0dXJlIFJlZ2lzdGVyOiAweCUwOHhcbiIsCisJICAgICAgIGluX2JlMzIocGRhdGEtPmwyX3ZiYXNlICsgTVBDODVYWF9MMl9FUlJBRERSKSk7CisKKwkvKiBjbGVhciBlcnJvciBkZXRlY3QgcmVnaXN0ZXIgKi8KKwlvdXRfYmUzMihwZGF0YS0+bDJfdmJhc2UgKyBNUEM4NVhYX0wyX0VSUkRFVCwgZXJyX2RldGVjdCk7CisKKwlpZiAoZXJyX2RldGVjdCAmIEwyX0VERV9DRV9NQVNLKQorCQllZGFjX2RldmljZV9oYW5kbGVfY2UoZWRhY19kZXYsIDAsIDAsIGVkYWNfZGV2LT5jdGxfbmFtZSk7CisKKwlpZiAoZXJyX2RldGVjdCAmIEwyX0VERV9VRV9NQVNLKQorCQllZGFjX2RldmljZV9oYW5kbGVfdWUoZWRhY19kZXYsIDAsIDAsIGVkYWNfZGV2LT5jdGxfbmFtZSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtcGM4NXh4X2wyX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGVkYWNfZGV2aWNlX2N0bF9pbmZvICplZGFjX2RldiA9IGRldl9pZDsKKwlzdHJ1Y3QgbXBjODV4eF9sMl9wZGF0YSAqcGRhdGEgPSBlZGFjX2Rldi0+cHZ0X2luZm87CisJdTMyIGVycl9kZXRlY3Q7CisKKwllcnJfZGV0ZWN0ID0gaW5fYmUzMihwZGF0YS0+bDJfdmJhc2UgKyBNUEM4NVhYX0wyX0VSUkRFVCk7CisKKwlpZiAoIShlcnJfZGV0ZWN0ICYgTDJfRURFX01BU0spKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwltcGM4NXh4X2wyX2NoZWNrKGVkYWNfZGV2KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgbXBjODV4eF9sMl9lcnJfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqb3AsCisJCQkJCSAgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCit7CisJc3RydWN0IGVkYWNfZGV2aWNlX2N0bF9pbmZvICplZGFjX2RldjsKKwlzdHJ1Y3QgbXBjODV4eF9sMl9wZGF0YSAqcGRhdGE7CisJc3RydWN0IHJlc291cmNlIHI7CisJaW50IHJlczsKKworCWlmICghZGV2cmVzX29wZW5fZ3JvdXAoJm9wLT5kZXYsIG1wYzg1eHhfbDJfZXJyX3Byb2JlLCBHRlBfS0VSTkVMKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllZGFjX2RldiA9IGVkYWNfZGV2aWNlX2FsbG9jX2N0bF9pbmZvKHNpemVvZigqcGRhdGEpLAorCQkJCQkgICAgICAiY3B1IiwgMSwgIkwiLCAxLCAyLCBOVUxMLCAwLAorCQkJCQkgICAgICBlZGFjX2Rldl9pZHgpOworCWlmICghZWRhY19kZXYpIHsKKwkJZGV2cmVzX3JlbGVhc2VfZ3JvdXAoJm9wLT5kZXYsIG1wYzg1eHhfbDJfZXJyX3Byb2JlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcGRhdGEgPSBlZGFjX2Rldi0+cHZ0X2luZm87CisJcGRhdGEtPm5hbWUgPSAibXBjODV4eF9sMl9lcnIiOworCXBkYXRhLT5pcnEgPSBOT19JUlE7CisJZWRhY19kZXYtPmRldiA9ICZvcC0+ZGV2OworCWRldl9zZXRfZHJ2ZGF0YShlZGFjX2Rldi0+ZGV2LCBlZGFjX2Rldik7CisJZWRhY19kZXYtPmN0bF9uYW1lID0gcGRhdGEtPm5hbWU7CisJZWRhY19kZXYtPmRldl9uYW1lID0gcGRhdGEtPm5hbWU7CisKKwlyZXMgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG9wLT5ub2RlLCAwLCAmcik7CisJaWYgKHJlcykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gZ2V0IHJlc291cmNlIGZvciAiCisJCSAgICAgICAiTDIgZXJyIHJlZ3NcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnI7CisJfQorCisJLyogd2Ugb25seSBuZWVkIHRoZSBlcnJvciByZWdpc3RlcnMgKi8KKwlyLnN0YXJ0ICs9IDB4ZTAwOworCisJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmb3AtPmRldiwgci5zdGFydCwKKwkJCQkgICAgIHIuZW5kIC0gci5zdGFydCArIDEsIHBkYXRhLT5uYW1lKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciB3aGlsZSByZXF1ZXN0aW5nIG1lbSByZWdpb25cbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCXJlcyA9IC1FQlVTWTsKKwkJZ290byBlcnI7CisJfQorCisJcGRhdGEtPmwyX3ZiYXNlID0gZGV2bV9pb3JlbWFwKCZvcC0+ZGV2LCByLnN0YXJ0LCByLmVuZCAtIHIuc3RhcnQgKyAxKTsKKwlpZiAoIXBkYXRhLT5sMl92YmFzZSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gc2V0dXAgTDIgZXJyIHJlZ3NcbiIsIF9fZnVuY19fKTsKKwkJcmVzID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJb3V0X2JlMzIocGRhdGEtPmwyX3ZiYXNlICsgTVBDODVYWF9MMl9FUlJERVQsIH4wKTsKKworCW9yaWdfbDJfZXJyX2Rpc2FibGUgPSBpbl9iZTMyKHBkYXRhLT5sMl92YmFzZSArIE1QQzg1WFhfTDJfRVJSRElTKTsKKworCS8qIGNsZWFyIHRoZSBlcnJfZGlzICovCisJb3V0X2JlMzIocGRhdGEtPmwyX3ZiYXNlICsgTVBDODVYWF9MMl9FUlJESVMsIDApOworCisJZWRhY19kZXYtPm1vZF9uYW1lID0gRURBQ19NT0RfU1RSOworCisJaWYgKGVkYWNfb3Bfc3RhdGUgPT0gRURBQ19PUFNUQVRFX1BPTEwpCisJCWVkYWNfZGV2LT5lZGFjX2NoZWNrID0gbXBjODV4eF9sMl9jaGVjazsKKworCW1wYzg1eHhfc2V0X2wyX3N5c2ZzX2F0dHJpYnV0ZXMoZWRhY19kZXYpOworCisJcGRhdGEtPmVkYWNfaWR4ID0gZWRhY19kZXZfaWR4Kys7CisKKwlpZiAoZWRhY19kZXZpY2VfYWRkX2RldmljZShlZGFjX2RldikgPiAwKSB7CisJCWRlYnVnZjMoIiVzKCk6IGZhaWxlZCBlZGFjX2RldmljZV9hZGRfZGV2aWNlKClcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKGVkYWNfb3Bfc3RhdGUgPT0gRURBQ19PUFNUQVRFX0lOVCkgeworCQlwZGF0YS0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAob3AtPm5vZGUsIDApOworCQlyZXMgPSBkZXZtX3JlcXVlc3RfaXJxKCZvcC0+ZGV2LCBwZGF0YS0+aXJxLAorCQkJCSAgICAgICBtcGM4NXh4X2wyX2lzciwgSVJRRl9ESVNBQkxFRCwKKwkJCQkgICAgICAgIltFREFDXSBMMiBlcnIiLCBlZGFjX2Rldik7CisJCWlmIChyZXMgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiJXM6IFVuYWJsZSB0byByZXF1aWVzdCBpcnEgJWQgZm9yICIKKwkJCSAgICAgICAiTVBDODV4eCBMMiBlcnJcbiIsIF9fZnVuY19fLCBwZGF0YS0+aXJxKTsKKwkJCWlycV9kaXNwb3NlX21hcHBpbmcocGRhdGEtPmlycSk7CisJCQlyZXMgPSAtRU5PREVWOworCQkJZ290byBlcnIyOworCQl9CisKKwkJcHJpbnRrKEtFUk5fSU5GTyBFREFDX01PRF9TVFIgIiBhY3F1aXJlZCBpcnEgJWQgZm9yIEwyIEVyclxuIiwKKwkJICAgICAgIHBkYXRhLT5pcnEpOworCisJCWVkYWNfZGV2LT5vcF9zdGF0ZSA9IE9QX1JVTk5JTkdfSU5URVJSVVBUOworCisJCW91dF9iZTMyKHBkYXRhLT5sMl92YmFzZSArIE1QQzg1WFhfTDJfRVJSSU5URU4sIEwyX0VJRV9NQVNLKTsKKwl9CisKKwlkZXZyZXNfcmVtb3ZlX2dyb3VwKCZvcC0+ZGV2LCBtcGM4NXh4X2wyX2Vycl9wcm9iZSk7CisKKwlkZWJ1Z2YzKCIlcygpOiBzdWNjZXNzXG4iLCBfX2Z1bmNfXyk7CisJcHJpbnRrKEtFUk5fSU5GTyBFREFDX01PRF9TVFIgIiBMMiBlcnIgcmVnaXN0ZXJlZFxuIik7CisKKwlyZXR1cm4gMDsKKworZXJyMjoKKwllZGFjX2RldmljZV9kZWxfZGV2aWNlKCZvcC0+ZGV2KTsKK2VycjoKKwlkZXZyZXNfcmVsZWFzZV9ncm91cCgmb3AtPmRldiwgbXBjODV4eF9sMl9lcnJfcHJvYmUpOworCWVkYWNfZGV2aWNlX2ZyZWVfY3RsX2luZm8oZWRhY19kZXYpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgbXBjODV4eF9sMl9lcnJfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9wKQoreworCXN0cnVjdCBlZGFjX2RldmljZV9jdGxfaW5mbyAqZWRhY19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpOworCXN0cnVjdCBtcGM4NXh4X2wyX3BkYXRhICpwZGF0YSA9IGVkYWNfZGV2LT5wdnRfaW5mbzsKKworCWRlYnVnZjAoIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWlmIChlZGFjX29wX3N0YXRlID09IEVEQUNfT1BTVEFURV9JTlQpIHsKKwkJb3V0X2JlMzIocGRhdGEtPmwyX3ZiYXNlICsgTVBDODVYWF9MMl9FUlJJTlRFTiwgMCk7CisJCWlycV9kaXNwb3NlX21hcHBpbmcocGRhdGEtPmlycSk7CisJfQorCisJb3V0X2JlMzIocGRhdGEtPmwyX3ZiYXNlICsgTVBDODVYWF9MMl9FUlJESVMsIG9yaWdfbDJfZXJyX2Rpc2FibGUpOworCWVkYWNfZGV2aWNlX2RlbF9kZXZpY2UoJm9wLT5kZXYpOworCWVkYWNfZGV2aWNlX2ZyZWVfY3RsX2luZm8oZWRhY19kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtcGM4NXh4X2wyX2Vycl9vZl9tYXRjaFtdID0geworCXsKKwkgLmNvbXBhdGlibGUgPSAiZnNsLDg1NDAtbDItY2FjaGUtY29udHJvbGxlciIsCisJIH0sCisJeworCSAuY29tcGF0aWJsZSA9ICJmc2wsODU0MS1sMi1jYWNoZS1jb250cm9sbGVyIiwKKwkgfSwKKwl7CisJIC5jb21wYXRpYmxlID0gImZzbCw4NTQ0LWwyLWNhY2hlLWNvbnRyb2xsZXIiLAorCSB9LAorCXsKKwkgLmNvbXBhdGlibGUgPSAiZnNsLDg1NDgtbDItY2FjaGUtY29udHJvbGxlciIsCisJIH0sCisJeworCSAuY29tcGF0aWJsZSA9ICJmc2wsODU1NS1sMi1jYWNoZS1jb250cm9sbGVyIiwKKwkgfSwKKwl7CisJIC5jb21wYXRpYmxlID0gImZzbCw4NTY4LWwyLWNhY2hlLWNvbnRyb2xsZXIiLAorCSB9LAorCXt9LAorfTsKKworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgbXBjODV4eF9sMl9lcnJfZHJpdmVyID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5uYW1lID0gIm1wYzg1eHhfbDJfZXJyIiwKKwkubWF0Y2hfdGFibGUgPSBtcGM4NXh4X2wyX2Vycl9vZl9tYXRjaCwKKwkucHJvYmUgPSBtcGM4NXh4X2wyX2Vycl9wcm9iZSwKKwkucmVtb3ZlID0gbXBjODV4eF9sMl9lcnJfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gIm1wYzg1eHhfbDJfZXJyIiwKKwkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisJCSAgIH0sCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNQyBFcnIgZGV2aWNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgbXBjODV4eF9tY19jaGVjayhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJc3RydWN0IG1wYzg1eHhfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKKwlzdHJ1Y3QgY3Nyb3dfaW5mbyAqY3Nyb3c7CisJdTMyIGVycl9kZXRlY3Q7CisJdTMyIHN5bmRyb21lOworCXUzMiBlcnJfYWRkcjsKKwl1MzIgcGZuOworCWludCByb3dfaW5kZXg7CisKKwllcnJfZGV0ZWN0ID0gaW5fYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0VSUl9ERVRFQ1QpOworCWlmIChlcnJfZGV0ZWN0KQorCQlyZXR1cm47CisKKwltcGM4NXh4X21jX3ByaW50ayhtY2ksIEtFUk5fRVJSLCAiRXJyIERldGVjdCBSZWdpc3RlcjogJSM4Ljh4XG4iLAorCQkJICBlcnJfZGV0ZWN0KTsKKworCS8qIG5vIG1vcmUgcHJvY2Vzc2luZyBpZiBub3QgRUNDIGJpdCBlcnJvcnMgKi8KKwlpZiAoIShlcnJfZGV0ZWN0ICYgKEREUl9FREVfU0JFIHwgRERSX0VERV9NQkUpKSkgeworCQlvdXRfYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0VSUl9ERVRFQ1QsIGVycl9kZXRlY3QpOworCQlyZXR1cm47CisJfQorCisJc3luZHJvbWUgPSBpbl9iZTMyKHBkYXRhLT5tY192YmFzZSArIE1QQzg1WFhfTUNfQ0FQVFVSRV9FQ0MpOworCWVycl9hZGRyID0gaW5fYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0NBUFRVUkVfQUREUkVTUyk7CisJcGZuID0gZXJyX2FkZHIgPj4gUEFHRV9TSElGVDsKKworCWZvciAocm93X2luZGV4ID0gMDsgcm93X2luZGV4IDwgbWNpLT5ucl9jc3Jvd3M7IHJvd19pbmRleCsrKSB7CisJCWNzcm93ID0gJm1jaS0+Y3Nyb3dzW3Jvd19pbmRleF07CisJCWlmICgocGZuID49IGNzcm93LT5maXJzdF9wYWdlKSAmJiAocGZuIDw9IGNzcm93LT5sYXN0X3BhZ2UpKQorCQkJYnJlYWs7CisJfQorCisJbXBjODV4eF9tY19wcmludGsobWNpLCBLRVJOX0VSUiwgIkNhcHR1cmUgRGF0YSBIaWdoOiAlIzguOHhcbiIsCisJCQkgIGluX2JlMzIocGRhdGEtPm1jX3ZiYXNlICsKKwkJCQkgIE1QQzg1WFhfTUNfQ0FQVFVSRV9EQVRBX0hJKSk7CisJbXBjODV4eF9tY19wcmludGsobWNpLCBLRVJOX0VSUiwgIkNhcHR1cmUgRGF0YSBMb3c6ICUjOC44eFxuIiwKKwkJCSAgaW5fYmUzMihwZGF0YS0+bWNfdmJhc2UgKworCQkJCSAgTVBDODVYWF9NQ19DQVBUVVJFX0RBVEFfTE8pKTsKKwltcGM4NXh4X21jX3ByaW50ayhtY2ksIEtFUk5fRVJSLCAic3luZHJvbWU6ICUjOC44eFxuIiwgc3luZHJvbWUpOworCW1wYzg1eHhfbWNfcHJpbnRrKG1jaSwgS0VSTl9FUlIsICJlcnIgYWRkcjogJSM4Ljh4XG4iLCBlcnJfYWRkcik7CisJbXBjODV4eF9tY19wcmludGsobWNpLCBLRVJOX0VSUiwgIlBGTjogJSM4Ljh4XG4iLCBwZm4pOworCisJLyogd2UgYXJlIG91dCBvZiByYW5nZSAqLworCWlmIChyb3dfaW5kZXggPT0gbWNpLT5ucl9jc3Jvd3MpCisJCW1wYzg1eHhfbWNfcHJpbnRrKG1jaSwgS0VSTl9FUlIsICJQRk4gb3V0IG9mIHJhbmdlIVxuIik7CisKKwlpZiAoZXJyX2RldGVjdCAmIEREUl9FREVfU0JFKQorCQllZGFjX21jX2hhbmRsZV9jZShtY2ksIHBmbiwgZXJyX2FkZHIgJiBQQUdFX01BU0ssCisJCQkJICBzeW5kcm9tZSwgcm93X2luZGV4LCAwLCBtY2ktPmN0bF9uYW1lKTsKKworCWlmIChlcnJfZGV0ZWN0ICYgRERSX0VERV9NQkUpCisJCWVkYWNfbWNfaGFuZGxlX3VlKG1jaSwgcGZuLCBlcnJfYWRkciAmIFBBR0VfTUFTSywKKwkJCQkgIHJvd19pbmRleCwgbWNpLT5jdGxfbmFtZSk7CisKKwlvdXRfYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0VSUl9ERVRFQ1QsIGVycl9kZXRlY3QpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbXBjODV4eF9tY19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IGRldl9pZDsKKwlzdHJ1Y3QgbXBjODV4eF9tY19wZGF0YSAqcGRhdGEgPSBtY2ktPnB2dF9pbmZvOworCXUzMiBlcnJfZGV0ZWN0OworCisJZXJyX2RldGVjdCA9IGluX2JlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVBDODVYWF9NQ19FUlJfREVURUNUKTsKKwlpZiAoIWVycl9kZXRlY3QpCisJCXJldHVybiBJUlFfTk9ORTsKKworCW1wYzg1eHhfbWNfY2hlY2sobWNpKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IG1wYzg1eHhfaW5pdF9jc3Jvd3Moc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCXN0cnVjdCBtcGM4NXh4X21jX3BkYXRhICpwZGF0YSA9IG1jaS0+cHZ0X2luZm87CisJc3RydWN0IGNzcm93X2luZm8gKmNzcm93OworCXUzMiBzZHJhbV9jdGw7CisJdTMyIHNkdHlwZTsKKwllbnVtIG1lbV90eXBlIG10eXBlOworCXUzMiBjc19ibmRzOworCWludCBpbmRleDsKKworCXNkcmFtX2N0bCA9IGluX2JlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVBDODVYWF9NQ19ERFJfU0RSQU1fQ0ZHKTsKKworCXNkdHlwZSA9IHNkcmFtX2N0bCAmIERTQ19TRFRZUEVfTUFTSzsKKwlpZiAoc2RyYW1fY3RsICYgRFNDX1JEX0VOKSB7CisJCXN3aXRjaCAoc2R0eXBlKSB7CisJCWNhc2UgRFNDX1NEVFlQRV9ERFI6CisJCQltdHlwZSA9IE1FTV9SRERSOworCQkJYnJlYWs7CisJCWNhc2UgRFNDX1NEVFlQRV9ERFIyOgorCQkJbXR5cGUgPSBNRU1fUkREUjI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW10eXBlID0gTUVNX1VOS05PV047CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAoc2R0eXBlKSB7CisJCWNhc2UgRFNDX1NEVFlQRV9ERFI6CisJCQltdHlwZSA9IE1FTV9ERFI7CisJCQlicmVhazsKKwkJY2FzZSBEU0NfU0RUWVBFX0REUjI6CisJCQltdHlwZSA9IE1FTV9ERFIyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQltdHlwZSA9IE1FTV9VTktOT1dOOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtY2ktPm5yX2Nzcm93czsgaW5kZXgrKykgeworCQl1MzIgc3RhcnQ7CisJCXUzMiBlbmQ7CisKKwkJY3Nyb3cgPSAmbWNpLT5jc3Jvd3NbaW5kZXhdOworCQljc19ibmRzID0gaW5fYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0NTX0JORFNfMCArCisJCQkJICAoaW5kZXggKiBNUEM4NVhYX01DX0NTX0JORFNfT0ZTKSk7CisJCXN0YXJ0ID0gKGNzX2JuZHMgJiAweGZmZjAwMDApIDw8IDQ7CisJCWVuZCA9ICgoY3NfYm5kcyAmIDB4ZmZmKSA8PCAyMCk7CisJCWlmIChzdGFydCkKKwkJCXN0YXJ0IHw9IDB4ZmZmZmY7CisJCWlmIChlbmQpCisJCQllbmQgfD0gMHhmZmZmZjsKKworCQlpZiAoc3RhcnQgPT0gZW5kKQorCQkJY29udGludWU7CS8qIG5vdCBwb3B1bGF0ZWQgKi8KKworCQljc3Jvdy0+Zmlyc3RfcGFnZSA9IHN0YXJ0ID4+IFBBR0VfU0hJRlQ7CisJCWNzcm93LT5sYXN0X3BhZ2UgPSBlbmQgPj4gUEFHRV9TSElGVDsKKwkJY3Nyb3ctPm5yX3BhZ2VzID0gY3Nyb3ctPmxhc3RfcGFnZSArIDEgLSBjc3Jvdy0+Zmlyc3RfcGFnZTsKKwkJY3Nyb3ctPmdyYWluID0gODsKKwkJY3Nyb3ctPm10eXBlID0gbXR5cGU7CisJCWNzcm93LT5kdHlwZSA9IERFVl9VTktOT1dOOworCQlpZiAoc2RyYW1fY3RsICYgRFNDX1gzMl9FTikKKwkJCWNzcm93LT5kdHlwZSA9IERFVl9YMzI7CisJCWNzcm93LT5lZGFjX21vZGUgPSBFREFDX1NFQ0RFRDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG1wYzg1eHhfbWNfZXJyX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9wLAorCQkJCQkgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaTsKKwlzdHJ1Y3QgbXBjODV4eF9tY19wZGF0YSAqcGRhdGE7CisJc3RydWN0IHJlc291cmNlIHI7CisJdTMyIHNkcmFtX2N0bDsKKwlpbnQgcmVzOworCisJaWYgKCFkZXZyZXNfb3Blbl9ncm91cCgmb3AtPmRldiwgbXBjODV4eF9tY19lcnJfcHJvYmUsIEdGUF9LRVJORUwpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1jaSA9IGVkYWNfbWNfYWxsb2Moc2l6ZW9mKCpwZGF0YSksIDQsIDEsIGVkYWNfbWNfaWR4KTsKKwlpZiAoIW1jaSkgeworCQlkZXZyZXNfcmVsZWFzZV9ncm91cCgmb3AtPmRldiwgbXBjODV4eF9tY19lcnJfcHJvYmUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwZGF0YSA9IG1jaS0+cHZ0X2luZm87CisJcGRhdGEtPm5hbWUgPSAibXBjODV4eF9tY19lcnIiOworCXBkYXRhLT5pcnEgPSBOT19JUlE7CisJbWNpLT5kZXYgPSAmb3AtPmRldjsKKwlwZGF0YS0+ZWRhY19pZHggPSBlZGFjX21jX2lkeCsrOworCWRldl9zZXRfZHJ2ZGF0YShtY2ktPmRldiwgbWNpKTsKKwltY2ktPmN0bF9uYW1lID0gcGRhdGEtPm5hbWU7CisJbWNpLT5kZXZfbmFtZSA9IHBkYXRhLT5uYW1lOworCisJcmVzID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShvcC0+bm9kZSwgMCwgJnIpOworCWlmIChyZXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGdldCByZXNvdXJjZSBmb3IgTUMgZXJyIHJlZ3NcbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyOworCX0KKworCWlmICghZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJm9wLT5kZXYsIHIuc3RhcnQsCisJCQkJICAgICByLmVuZCAtIHIuc3RhcnQgKyAxLCBwZGF0YS0+bmFtZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBtZW0gcmVnaW9uXG4iLAorCQkgICAgICAgX19mdW5jX18pOworCQlyZXMgPSAtRUJVU1k7CisJCWdvdG8gZXJyOworCX0KKworCXBkYXRhLT5tY192YmFzZSA9IGRldm1faW9yZW1hcCgmb3AtPmRldiwgci5zdGFydCwgci5lbmQgLSByLnN0YXJ0ICsgMSk7CisJaWYgKCFwZGF0YS0+bWNfdmJhc2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIHNldHVwIE1DIGVyciByZWdzXG4iLCBfX2Z1bmNfXyk7CisJCXJlcyA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCXNkcmFtX2N0bCA9IGluX2JlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVBDODVYWF9NQ19ERFJfU0RSQU1fQ0ZHKTsKKwlpZiAoIShzZHJhbV9jdGwgJiBEU0NfRUNDX0VOKSkgeworCQkvKiBubyBFQ0MgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vIEVDQyBESU1NcyBkaXNjb3ZlcmVkXG4iLCBfX2Z1bmNfXyk7CisJCXJlcyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyOworCX0KKworCWRlYnVnZjMoIiVzKCk6IGluaXQgbWNpXG4iLCBfX2Z1bmNfXyk7CisJbWNpLT5tdHlwZV9jYXAgPSBNRU1fRkxBR19SRERSIHwgTUVNX0ZMQUdfUkREUjIgfAorCSAgICBNRU1fRkxBR19ERFIgfCBNRU1fRkxBR19ERFIyOworCW1jaS0+ZWRhY19jdGxfY2FwID0gRURBQ19GTEFHX05PTkUgfCBFREFDX0ZMQUdfU0VDREVEOworCW1jaS0+ZWRhY19jYXAgPSBFREFDX0ZMQUdfU0VDREVEOworCW1jaS0+bW9kX25hbWUgPSBFREFDX01PRF9TVFI7CisJbWNpLT5tb2RfdmVyID0gTVBDODVYWF9SRVZJU0lPTjsKKworCWlmIChlZGFjX29wX3N0YXRlID09IEVEQUNfT1BTVEFURV9QT0xMKQorCQltY2ktPmVkYWNfY2hlY2sgPSBtcGM4NXh4X21jX2NoZWNrOworCisJbWNpLT5jdGxfcGFnZV90b19waHlzID0gTlVMTDsKKworCW1jaS0+c2NydWJfbW9kZSA9IFNDUlVCX1NXX1NSQzsKKworCW1wYzg1eHhfc2V0X21jX3N5c2ZzX2F0dHJpYnV0ZXMobWNpKTsKKworCW1wYzg1eHhfaW5pdF9jc3Jvd3MobWNpKTsKKworI2lmZGVmIENPTkZJR19FREFDX0RFQlVHCisJZWRhY19tY19yZWdpc3Rlcl9tY2lkZXZfZGVidWcoKHN0cnVjdCBhdHRyaWJ1dGUgKiopZGVidWdfYXR0cik7CisjZW5kaWYKKworCS8qIHN0b3JlIHRoZSBvcmlnaW5hbCBlcnJvciBkaXNhYmxlIGJpdHMgKi8KKwlvcmlnX2Rkcl9lcnJfZGlzYWJsZSA9CisJICAgIGluX2JlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVBDODVYWF9NQ19FUlJfRElTQUJMRSk7CisJb3V0X2JlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVBDODVYWF9NQ19FUlJfRElTQUJMRSwgMCk7CisKKwkvKiBjbGVhciBhbGwgZXJyb3IgYml0cyAqLworCW91dF9iZTMyKHBkYXRhLT5tY192YmFzZSArIE1QQzg1WFhfTUNfRVJSX0RFVEVDVCwgfjApOworCisJaWYgKGVkYWNfbWNfYWRkX21jKG1jaSkpIHsKKwkJZGVidWdmMygiJXMoKTogZmFpbGVkIGVkYWNfbWNfYWRkX21jKClcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKGVkYWNfb3Bfc3RhdGUgPT0gRURBQ19PUFNUQVRFX0lOVCkgeworCQlvdXRfYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0VSUl9JTlRfRU4sCisJCQkgRERSX0VJRV9NQkVFIHwgRERSX0VJRV9TQkVFKTsKKworCQkvKiBzdG9yZSB0aGUgb3JpZ2luYWwgZXJyb3IgbWFuYWdlbWVudCB0aHJlc2hvbGQgKi8KKwkJb3JpZ19kZHJfZXJyX3NiZSA9IGluX2JlMzIocGRhdGEtPm1jX3ZiYXNlICsKKwkJCQkJICAgTVBDODVYWF9NQ19FUlJfU0JFKSAmIDB4ZmYwMDAwOworCisJCS8qIHNldCB0aHJlc2hvbGQgdG8gMSBlcnJvciBwZXIgaW50ZXJydXB0ICovCisJCW91dF9iZTMyKHBkYXRhLT5tY192YmFzZSArIE1QQzg1WFhfTUNfRVJSX1NCRSwgMHgxMDAwMCk7CisKKwkJLyogcmVnaXN0ZXIgaW50ZXJydXB0cyAqLworCQlwZGF0YS0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAob3AtPm5vZGUsIDApOworCQlyZXMgPSBkZXZtX3JlcXVlc3RfaXJxKCZvcC0+ZGV2LCBwZGF0YS0+aXJxLAorCQkJCSAgICAgICBtcGM4NXh4X21jX2lzciwgSVJRRl9ESVNBQkxFRCwKKwkJCQkgICAgICAgIltFREFDXSBNQyBlcnIiLCBtY2kpOworCQlpZiAocmVzIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIHJlcXVlc3QgaXJxICVkIGZvciAiCisJCQkgICAgICAgIk1QQzg1eHggRFJBTSBFUlJcbiIsIF9fZnVuY19fLCBwZGF0YS0+aXJxKTsKKwkJCWlycV9kaXNwb3NlX21hcHBpbmcocGRhdGEtPmlycSk7CisJCQlyZXMgPSAtRU5PREVWOworCQkJZ290byBlcnIyOworCQl9CisKKwkJcHJpbnRrKEtFUk5fSU5GTyBFREFDX01PRF9TVFIgIiBhY3F1aXJlZCBpcnEgJWQgZm9yIE1DXG4iLAorCQkgICAgICAgcGRhdGEtPmlycSk7CisJfQorCisJZGV2cmVzX3JlbW92ZV9ncm91cCgmb3AtPmRldiwgbXBjODV4eF9tY19lcnJfcHJvYmUpOworCWRlYnVnZjMoIiVzKCk6IHN1Y2Nlc3NcbiIsIF9fZnVuY19fKTsKKwlwcmludGsoS0VSTl9JTkZPIEVEQUNfTU9EX1NUUiAiIE1DIGVyciByZWdpc3RlcmVkXG4iKTsKKworCXJldHVybiAwOworCitlcnIyOgorCWVkYWNfbWNfZGVsX21jKCZvcC0+ZGV2KTsKK2VycjoKKwlkZXZyZXNfcmVsZWFzZV9ncm91cCgmb3AtPmRldiwgbXBjODV4eF9tY19lcnJfcHJvYmUpOworCWVkYWNfbWNfZnJlZShtY2kpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgbXBjODV4eF9tY19lcnJfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9wKQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IGRldl9nZXRfZHJ2ZGF0YSgmb3AtPmRldik7CisJc3RydWN0IG1wYzg1eHhfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKKworCWRlYnVnZjAoIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWlmIChlZGFjX29wX3N0YXRlID09IEVEQUNfT1BTVEFURV9JTlQpIHsKKwkJb3V0X2JlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVBDODVYWF9NQ19FUlJfSU5UX0VOLCAwKTsKKwkJaXJxX2Rpc3Bvc2VfbWFwcGluZyhwZGF0YS0+aXJxKTsKKwl9CisKKwlvdXRfYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0VSUl9ESVNBQkxFLAorCQkgb3JpZ19kZHJfZXJyX2Rpc2FibGUpOworCW91dF9iZTMyKHBkYXRhLT5tY192YmFzZSArIE1QQzg1WFhfTUNfRVJSX1NCRSwgb3JpZ19kZHJfZXJyX3NiZSk7CisKKwllZGFjX21jX2RlbF9tYygmb3AtPmRldik7CisJZWRhY19tY19mcmVlKG1jaSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1wYzg1eHhfbWNfZXJyX29mX21hdGNoW10gPSB7CisJeworCSAuY29tcGF0aWJsZSA9ICJmc2wsODU0MC1tZW1vcnktY29udHJvbGxlciIsCisJIH0sCisJeworCSAuY29tcGF0aWJsZSA9ICJmc2wsODU0MS1tZW1vcnktY29udHJvbGxlciIsCisJIH0sCisJeworCSAuY29tcGF0aWJsZSA9ICJmc2wsODU0NC1tZW1vcnktY29udHJvbGxlciIsCisJIH0sCisJeworCSAuY29tcGF0aWJsZSA9ICJmc2wsODU0OC1tZW1vcnktY29udHJvbGxlciIsCisJIH0sCisJeworCSAuY29tcGF0aWJsZSA9ICJmc2wsODU1NS1tZW1vcnktY29udHJvbGxlciIsCisJIH0sCisJeworCSAuY29tcGF0aWJsZSA9ICJmc2wsODU2OC1tZW1vcnktY29udHJvbGxlciIsCisJIH0sCisJe30sCit9OworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBtcGM4NXh4X21jX2Vycl9kcml2ZXIgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm5hbWUgPSAibXBjODV4eF9tY19lcnIiLAorCS5tYXRjaF90YWJsZSA9IG1wYzg1eHhfbWNfZXJyX29mX21hdGNoLAorCS5wcm9iZSA9IG1wYzg1eHhfbWNfZXJyX3Byb2JlLAorCS5yZW1vdmUgPSBtcGM4NXh4X21jX2Vycl9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAibXBjODV4eF9tY19lcnIiLAorCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkJICAgfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1wYzg1eHhfbWNfaW5pdCh2b2lkKQoreworCWludCByZXMgPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyAiRnJlZXNjYWxlKFIpIE1QQzg1eHggRURBQyBkcml2ZXIsICIKKwkgICAgICAgIihDKSAyMDA2IE1vbnRhdmlzdGEgU29mdHdhcmVcbiIpOworCisJLyogbWFrZSBzdXJlIGVycm9yIHJlcG9ydGluZyBtZXRob2QgaXMgc2FuZSAqLworCXN3aXRjaCAoZWRhY19vcF9zdGF0ZSkgeworCWNhc2UgRURBQ19PUFNUQVRFX1BPTEw6CisJY2FzZSBFREFDX09QU1RBVEVfSU5UOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQllZGFjX29wX3N0YXRlID0gRURBQ19PUFNUQVRFX0lOVDsKKwkJYnJlYWs7CisJfQorCisJcmVzID0gb2ZfcmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZtcGM4NXh4X21jX2Vycl9kcml2ZXIpOworCWlmIChyZXMpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgRURBQ19NT0RfU1RSICJNQyBmYWlscyB0byByZWdpc3RlclxuIik7CisKKwlyZXMgPSBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJm1wYzg1eHhfbDJfZXJyX2RyaXZlcik7CisJaWYgKHJlcykKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBFREFDX01PRF9TVFIgIkwyIGZhaWxzIHRvIHJlZ2lzdGVyXG4iKTsKKworI2lmZGVmIENPTkZJR19QQ0kKKwlyZXMgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1wYzg1eHhfcGNpX2Vycl9kcml2ZXIpOworCWlmIChyZXMpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgRURBQ19NT0RfU1RSICJQQ0kgZmFpbHMgdG8gcmVnaXN0ZXJcbiIpOworI2VuZGlmCisKKwkvKgorCSAqIG5lZWQgdG8gY2xlYXIgSElEMVtSRlhFXSB0byBkaXNhYmxlIG1hY2hpbmUgY2hlY2sgaW50CisJICogc28gd2UgY2FuIGNhdGNoIGl0CisJICovCisJaWYgKGVkYWNfb3Bfc3RhdGUgPT0gRURBQ19PUFNUQVRFX0lOVCkgeworCQlvcmlnX2hpZDEgPSBtZnNwcihTUFJOX0hJRDEpOworCQltdHNwcihTUFJOX0hJRDEsIChvcmlnX2hpZDEgJiB+MHgyMDAwMCkpOworCX0KKworCXJldHVybiAwOworfQorCittb2R1bGVfaW5pdChtcGM4NXh4X21jX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbXBjODV4eF9tY19leGl0KHZvaWQpCit7CisJbXRzcHIoU1BSTl9ISUQxLCBvcmlnX2hpZDEpOworI2lmZGVmIENPTkZJR19QQ0kKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXBjODV4eF9wY2lfZXJyX2RyaXZlcik7CisjZW5kaWYKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmbXBjODV4eF9sMl9lcnJfZHJpdmVyKTsKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmbXBjODV4eF9tY19lcnJfZHJpdmVyKTsKK30KKworbW9kdWxlX2V4aXQobXBjODV4eF9tY19leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTW9udGF2aXN0YSBTb2Z0d2FyZSwgSW5jLiIpOworbW9kdWxlX3BhcmFtKGVkYWNfb3Bfc3RhdGUsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVkYWNfb3Bfc3RhdGUsCisJCSAiRURBQyBFcnJvciBSZXBvcnRpbmcgc3RhdGU6IDA9UG9sbCwgMj1JbnRlcnJ1cHQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuaCBiL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzViMzUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9lZGFjL21wYzg1eHhfZWRhYy5oCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogRnJlZXNjYWxlIE1QQzg1eHggTWVtb3J5IENvbnRyb2xsZXIga2VuZWwgbW9kdWxlCisgKiBBdXRob3I6IERhdmUgSmlhbmcgPGRqaWFuZ0BtdmlzdGEuY29tPgorICoKKyAqIDIwMDYtMjAwNyAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqCisgKi8KKyNpZm5kZWYgX01QQzg1WFhfRURBQ19IXworI2RlZmluZSBfTVBDODVYWF9FREFDX0hfCisKKyNkZWZpbmUgTVBDODVYWF9SRVZJU0lPTiAiIFZlcjogMi4wLjAgIiBfX0RBVEVfXworI2RlZmluZSBFREFDX01PRF9TVFIJIk1QQzg1eHhfZWRhYyIKKworI2RlZmluZSBtcGM4NXh4X3ByaW50ayhsZXZlbCwgZm10LCBhcmcuLi4pIFwKKwllZGFjX3ByaW50ayhsZXZlbCwgIk1QQzg1eHgiLCBmbXQsICMjYXJnKQorCisjZGVmaW5lIG1wYzg1eHhfbWNfcHJpbnRrKG1jaSwgbGV2ZWwsIGZtdCwgYXJnLi4uKSBcCisJZWRhY19tY19jaGlwc2V0X3ByaW50ayhtY2ksIGxldmVsLCAiTVBDODV4eCIsIGZtdCwgIyNhcmcpCisKKy8qCisgKiBEUkFNIGVycm9yIGRlZmluZXMKKyAqLworCisvKiBERFJfU0RSQU1fQ0ZHICovCisjZGVmaW5lIE1QQzg1WFhfTUNfRERSX1NEUkFNX0NGRwkweDAxMTAKKyNkZWZpbmUgTVBDODVYWF9NQ19DU19CTkRTXzAJCTB4MDAwMAorI2RlZmluZSBNUEM4NVhYX01DX0NTX0JORFNfMQkJMHgwMDA4CisjZGVmaW5lIE1QQzg1WFhfTUNfQ1NfQk5EU18yCQkweDAwMTAKKyNkZWZpbmUgTVBDODVYWF9NQ19DU19CTkRTXzMJCTB4MDAxOAorI2RlZmluZSBNUEM4NVhYX01DX0NTX0JORFNfT0ZTCQkweDAwMDgKKworI2RlZmluZSBNUEM4NVhYX01DX0RBVEFfRVJSX0lOSkVDVF9ISQkweDBlMDAKKyNkZWZpbmUgTVBDODVYWF9NQ19EQVRBX0VSUl9JTkpFQ1RfTE8JMHgwZTA0CisjZGVmaW5lIE1QQzg1WFhfTUNfRUNDX0VSUl9JTkpFQ1QJMHgwZTA4CisjZGVmaW5lIE1QQzg1WFhfTUNfQ0FQVFVSRV9EQVRBX0hJCTB4MGUyMAorI2RlZmluZSBNUEM4NVhYX01DX0NBUFRVUkVfREFUQV9MTwkweDBlMjQKKyNkZWZpbmUgTVBDODVYWF9NQ19DQVBUVVJFX0VDQwkJMHgwZTI4CisjZGVmaW5lIE1QQzg1WFhfTUNfRVJSX0RFVEVDVAkJMHgwZTQwCisjZGVmaW5lIE1QQzg1WFhfTUNfRVJSX0RJU0FCTEUJCTB4MGU0NAorI2RlZmluZSBNUEM4NVhYX01DX0VSUl9JTlRfRU4JCTB4MGU0OAorI2RlZmluZSBNUEM4NVhYX01DX0NBUFRVUkVfQVRSSUJVVEVTCTB4MGU0YworI2RlZmluZSBNUEM4NVhYX01DX0NBUFRVUkVfQUREUkVTUwkweDBlNTAKKyNkZWZpbmUgTVBDODVYWF9NQ19FUlJfU0JFCQkweDBlNTgKKworI2RlZmluZSBEU0NfTUVNX0VOCTB4ODAwMDAwMDAKKyNkZWZpbmUgRFNDX0VDQ19FTgkweDIwMDAwMDAwCisjZGVmaW5lIERTQ19SRF9FTgkweDEwMDAwMDAwCisKKyNkZWZpbmUgRFNDX1NEVFlQRV9NQVNLCQkweDA3MDAwMDAwCisKKyNkZWZpbmUgRFNDX1NEVFlQRV9ERFIJCTB4MDIwMDAwMDAKKyNkZWZpbmUgRFNDX1NEVFlQRV9ERFIyCQkweDAzMDAwMDAwCisjZGVmaW5lIERTQ19YMzJfRU4JMHgwMDAwMDAyMAorCisvKiBFcnJfSW50X0VuICovCisjZGVmaW5lIEREUl9FSUVfTVNFRQkweDEJLyogbWVtb3J5IHNlbGVjdCAqLworI2RlZmluZSBERFJfRUlFX1NCRUUJMHg0CS8qIHNpbmdsZS1iaXQgRUNDIGVycm9yICovCisjZGVmaW5lIEREUl9FSUVfTUJFRQkweDgJLyogbXVsdGktYml0IEVDQyBlcnJvciAqLworCisvKiBFcnJfRGV0ZWN0ICovCisjZGVmaW5lIEREUl9FREVfTVNFCQkweDEJLyogbWVtb3J5IHNlbGVjdCAqLworI2RlZmluZSBERFJfRURFX1NCRQkJMHg0CS8qIHNpbmdsZS1iaXQgRUNDIGVycm9yICovCisjZGVmaW5lIEREUl9FREVfTUJFCQkweDgJLyogbXVsdGktYml0IEVDQyBlcnJvciAqLworI2RlZmluZSBERFJfRURFX01NRQkJMHg4MDAwMDAwMAkvKiBtdWx0aXBsZSBtZW1vcnkgZXJyb3JzICovCisKKy8qIEVycl9EaXNhYmxlICovCisjZGVmaW5lIEREUl9FRElfTVNFRAkweDEJLyogbWVtb3J5IHNlbGVjdCBkaXNhYmxlICovCisjZGVmaW5lCUREUl9FRElfU0JFRAkweDQJLyogc2luZ2xlLWJpdCBFQ0MgZXJyb3IgZGlzYWJsZSAqLworI2RlZmluZQlERFJfRURJX01CRUQJMHg4CS8qIG11bHRpLWJpdCBFQ0MgZXJyb3IgZGlzYWJsZSAqLworCisvKgorICogTDIgRXJyIGRlZmluZXMKKyAqLworI2RlZmluZSBNUEM4NVhYX0wyX0VSUklOSkhJCTB4MDAwMAorI2RlZmluZSBNUEM4NVhYX0wyX0VSUklOSkxPCTB4MDAwNAorI2RlZmluZSBNUEM4NVhYX0wyX0VSUklOSkNUTAkweDAwMDgKKyNkZWZpbmUgTVBDODVYWF9MMl9DQVBUREFUQUhJCTB4MDAyMAorI2RlZmluZSBNUEM4NVhYX0wyX0NBUFREQVRBTE8JMHgwMDI0CisjZGVmaW5lIE1QQzg1WFhfTDJfQ0FQVEVDQwkweDAwMjgKKyNkZWZpbmUgTVBDODVYWF9MMl9FUlJERVQJMHgwMDQwCisjZGVmaW5lIE1QQzg1WFhfTDJfRVJSRElTCTB4MDA0NAorI2RlZmluZSBNUEM4NVhYX0wyX0VSUklOVEVOCTB4MDA0OAorI2RlZmluZSBNUEM4NVhYX0wyX0VSUkFUVFIJMHgwMDRjCisjZGVmaW5lIE1QQzg1WFhfTDJfRVJSQUREUgkweDAwNTAKKyNkZWZpbmUgTVBDODVYWF9MMl9FUlJDVEwJMHgwMDU4CisKKy8qIEVycm9yIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgTDJfRUlFX0wyQ0ZHSU5URU4JMHgxCisjZGVmaW5lIEwyX0VJRV9TQkVDQ0lOVEVOCTB4NAorI2RlZmluZSBMMl9FSUVfTUJFQ0NJTlRFTgkweDgKKyNkZWZpbmUgTDJfRUlFX1RQQVJJTlRFTgkweDEwCisjZGVmaW5lIEwyX0VJRV9NQVNLCShMMl9FSUVfTDJDRkdJTlRFTiB8IEwyX0VJRV9TQkVDQ0lOVEVOIHwgXAorCQkJTDJfRUlFX01CRUNDSU5URU4gfCBMMl9FSUVfVFBBUklOVEVOKQorCisvKiBFcnJvciBEZXRlY3QgKi8KKyNkZWZpbmUgTDJfRURFX0wyQ0ZHRVJSCQkweDEKKyNkZWZpbmUgTDJfRURFX1NCRUNDRVJSCQkweDQKKyNkZWZpbmUgTDJfRURFX01CRUNDRVJSCQkweDgKKyNkZWZpbmUgTDJfRURFX1RQQVJFUlIJCTB4MTAKKyNkZWZpbmUgTDJfRURFX01VTEwyRVJSCQkweDgwMDAwMDAwCisKKyNkZWZpbmUgTDJfRURFX0NFX01BU0sJTDJfRURFX1NCRUNDRVJSCisjZGVmaW5lIEwyX0VERV9VRV9NQVNLCShMMl9FREVfTDJDRkdFUlIgfCBMMl9FREVfTUJFQ0NFUlIgfCBcCisJCQlMMl9FREVfVFBBUkVSUikKKyNkZWZpbmUgTDJfRURFX01BU0sJKEwyX0VERV9MMkNGR0VSUiB8IEwyX0VERV9TQkVDQ0VSUiB8IFwKKwkJCUwyX0VERV9NQkVDQ0VSUiB8IEwyX0VERV9UUEFSRVJSIHwgTDJfRURFX01VTEwyRVJSKQorCisvKgorICogUENJIEVyciBkZWZpbmVzCisgKi8KKyNkZWZpbmUgUENJX0VERV9UT0UJCQkweDAwMDAwMDAxCisjZGVmaW5lIFBDSV9FREVfU0NNCQkJMHgwMDAwMDAwMgorI2RlZmluZSBQQ0lfRURFX0lSTVNWCQkJMHgwMDAwMDAwNAorI2RlZmluZSBQQ0lfRURFX09STVNWCQkJMHgwMDAwMDAwOAorI2RlZmluZSBQQ0lfRURFX09XTVNWCQkJMHgwMDAwMDAxMAorI2RlZmluZSBQQ0lfRURFX1RHVF9BQlJUCQkweDAwMDAwMDIwCisjZGVmaW5lIFBDSV9FREVfTVNUX0FCUlQJCTB4MDAwMDAwNDAKKyNkZWZpbmUgUENJX0VERV9UR1RfUEVSUgkJMHgwMDAwMDA4MAorI2RlZmluZSBQQ0lfRURFX01TVF9QRVJSCQkweDAwMDAwMTAwCisjZGVmaW5lIFBDSV9FREVfUkNWRF9TRVJSCQkweDAwMDAwMjAwCisjZGVmaW5lIFBDSV9FREVfQUREUl9QRVJSCQkweDAwMDAwNDAwCisjZGVmaW5lIFBDSV9FREVfTVVMVElfRVJSCQkweDgwMDAwMDAwCisKKyNkZWZpbmUgUENJX0VERV9QRVJSX01BU0sJKFBDSV9FREVfVEdUX1BFUlIgfCBQQ0lfRURFX01TVF9QRVJSIHwgXAorCQkJCVBDSV9FREVfQUREUl9QRVJSKQorCisjZGVmaW5lIE1QQzg1WFhfUENJX0VSUl9EUgkJMHgwMDAwCisjZGVmaW5lIE1QQzg1WFhfUENJX0VSUl9DQVBfRFIJCTB4MDAwNAorI2RlZmluZSBNUEM4NVhYX1BDSV9FUlJfRU4JCTB4MDAwOAorI2RlZmluZSBNUEM4NVhYX1BDSV9FUlJfQVRUUklCCQkweDAwMGMKKyNkZWZpbmUgTVBDODVYWF9QQ0lfRVJSX0FERFIJCTB4MDAxMAorI2RlZmluZSBNUEM4NVhYX1BDSV9FUlJfRVhUX0FERFIJMHgwMDE0CisjZGVmaW5lIE1QQzg1WFhfUENJX0VSUl9ETAkJMHgwMDE4CisjZGVmaW5lIE1QQzg1WFhfUENJX0VSUl9ESAkJMHgwMDFjCisjZGVmaW5lIE1QQzg1WFhfUENJX0dBU19USU1SCQkweDAwMjAKKyNkZWZpbmUgTVBDODVYWF9QQ0lfUENJWF9USU1SCQkweDAwMjQKKworc3RydWN0IG1wYzg1eHhfbWNfcGRhdGEgeworCWNoYXIgKm5hbWU7CisJaW50IGVkYWNfaWR4OworCXZvaWQgX19pb21lbSAqbWNfdmJhc2U7CisJaW50IGlycTsKK307CisKK3N0cnVjdCBtcGM4NXh4X2wyX3BkYXRhIHsKKwljaGFyICpuYW1lOworCWludCBlZGFjX2lkeDsKKwl2b2lkIF9faW9tZW0gKmwyX3ZiYXNlOworCWludCBpcnE7Cit9OworCitzdHJ1Y3QgbXBjODV4eF9wY2lfcGRhdGEgeworCWNoYXIgKm5hbWU7CisJaW50IGVkYWNfaWR4OworCXZvaWQgX19pb21lbSAqcGNpX3ZiYXNlOworCWludCBpcnE7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9tdjY0eDYwX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9tdjY0eDYwX2VkYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjA3MWYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9lZGFjL212NjR4NjBfZWRhYy5jCkBAIC0wLDAgKzEsODU1IEBACisvKgorICogTWFydmVsbCBNVjY0eDYwIE1lbW9yeSBDb250cm9sbGVyIGtlcm5lbCBtb2R1bGUgZm9yIFBQQyBwbGF0Zm9ybXMKKyAqCisgKiBBdXRob3I6IERhdmUgSmlhbmcgPGRqaWFuZ0BtdmlzdGEuY29tPgorICoKKyAqIDIwMDYtMjAwNyAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9lZGFjLmg+CisKKyNpbmNsdWRlICJlZGFjX2NvcmUuaCIKKyNpbmNsdWRlICJlZGFjX21vZHVsZS5oIgorI2luY2x1ZGUgIm12NjR4NjBfZWRhYy5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqbXY2NHg2MF9jdGxfbmFtZSA9ICJNVjY0eDYwIjsKK3N0YXRpYyBpbnQgZWRhY19kZXZfaWR4Oworc3RhdGljIGludCBlZGFjX3BjaV9pZHg7CitzdGF0aWMgaW50IGVkYWNfbWNfaWR4OworCisvKioqKioqKioqKioqKioqKioqKioqKiogUENJIGVyciBkZXZpY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgdm9pZCBtdjY0eDYwX3BjaV9jaGVjayhzdHJ1Y3QgZWRhY19wY2lfY3RsX2luZm8gKnBjaSkKK3sKKwlzdHJ1Y3QgbXY2NHg2MF9wY2lfcGRhdGEgKnBkYXRhID0gcGNpLT5wdnRfaW5mbzsKKwl1MzIgY2F1c2U7CisKKwljYXVzZSA9IGluX2xlMzIocGRhdGEtPnBjaV92YmFzZSArIE1WNjRYNjBfUENJX0VSUk9SX0NBVVNFKTsKKwlpZiAoIWNhdXNlKQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9FUlIgIkVycm9yIGluIFBDSSAlZCBJbnRlcmZhY2VcbiIsIHBkYXRhLT5wY2lfaG9zZSk7CisJcHJpbnRrKEtFUk5fRVJSICJDYXVzZSByZWdpc3RlcjogMHglMDh4XG4iLCBjYXVzZSk7CisJcHJpbnRrKEtFUk5fRVJSICJBZGRyZXNzIExvdzogMHglMDh4XG4iLAorCSAgICAgICBpbl9sZTMyKHBkYXRhLT5wY2lfdmJhc2UgKyBNVjY0WDYwX1BDSV9FUlJPUl9BRERSX0xPKSk7CisJcHJpbnRrKEtFUk5fRVJSICJBZGRyZXNzIEhpZ2g6IDB4JTA4eFxuIiwKKwkgICAgICAgaW5fbGUzMihwZGF0YS0+cGNpX3ZiYXNlICsgTVY2NFg2MF9QQ0lfRVJST1JfQUREUl9ISSkpOworCXByaW50ayhLRVJOX0VSUiAiQXR0cmlidXRlOiAweCUwOHhcbiIsCisJICAgICAgIGluX2xlMzIocGRhdGEtPnBjaV92YmFzZSArIE1WNjRYNjBfUENJX0VSUk9SX0FUVFIpKTsKKwlwcmludGsoS0VSTl9FUlIgIkNvbW1hbmQ6IDB4JTA4eFxuIiwKKwkgICAgICAgaW5fbGUzMihwZGF0YS0+cGNpX3ZiYXNlICsgTVY2NFg2MF9QQ0lfRVJST1JfQ01EKSk7CisJb3V0X2xlMzIocGRhdGEtPnBjaV92YmFzZSArIE1WNjRYNjBfUENJX0VSUk9SX0NBVVNFLCB+Y2F1c2UpOworCisJaWYgKGNhdXNlICYgTVY2NFg2MF9QQ0lfUEVfTUFTSykKKwkJZWRhY19wY2lfaGFuZGxlX3BlKHBjaSwgcGNpLT5jdGxfbmFtZSk7CisKKwlpZiAoIShjYXVzZSAmIE1WNjRYNjBfUENJX1BFX01BU0spKQorCQllZGFjX3BjaV9oYW5kbGVfbnBlKHBjaSwgcGNpLT5jdGxfbmFtZSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtdjY0eDYwX3BjaV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBlZGFjX3BjaV9jdGxfaW5mbyAqcGNpID0gZGV2X2lkOworCXN0cnVjdCBtdjY0eDYwX3BjaV9wZGF0YSAqcGRhdGEgPSBwY2ktPnB2dF9pbmZvOworCXUzMiB2YWw7CisKKwl2YWwgPSBpbl9sZTMyKHBkYXRhLT5wY2lfdmJhc2UgKyBNVjY0WDYwX1BDSV9FUlJPUl9DQVVTRSk7CisJaWYgKCF2YWwpCisJCXJldHVybiBJUlFfTk9ORTsKKworCW12NjR4NjBfcGNpX2NoZWNrKHBjaSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG12NjR4NjBfcGNpX2Vycl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBlZGFjX3BjaV9jdGxfaW5mbyAqcGNpOworCXN0cnVjdCBtdjY0eDYwX3BjaV9wZGF0YSAqcGRhdGE7CisJc3RydWN0IHJlc291cmNlICpyOworCWludCByZXMgPSAwOworCisJaWYgKCFkZXZyZXNfb3Blbl9ncm91cCgmcGRldi0+ZGV2LCBtdjY0eDYwX3BjaV9lcnJfcHJvYmUsIEdGUF9LRVJORUwpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBjaSA9IGVkYWNfcGNpX2FsbG9jX2N0bF9pbmZvKHNpemVvZigqcGRhdGEpLCAibXY2NHg2MF9wY2lfZXJyIik7CisJaWYgKCFwY2kpCisJCXJldHVybiAtRU5PTUVNOworCisJcGRhdGEgPSBwY2ktPnB2dF9pbmZvOworCisJcGRhdGEtPnBjaV9ob3NlID0gcGRldi0+aWQ7CisJcGRhdGEtPm5hbWUgPSAibXBjODV4eF9wY2lfZXJyIjsKKwlwZGF0YS0+aXJxID0gTk9fSVJROworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBjaSk7CisJcGNpLT5kZXYgPSAmcGRldi0+ZGV2OworCXBjaS0+ZGV2X25hbWUgPSBwZGV2LT5kZXYuYnVzX2lkOworCXBjaS0+bW9kX25hbWUgPSBFREFDX01PRF9TVFI7CisJcGNpLT5jdGxfbmFtZSA9IHBkYXRhLT5uYW1lOworCisJaWYgKGVkYWNfb3Bfc3RhdGUgPT0gRURBQ19PUFNUQVRFX1BPTEwpCisJCXBjaS0+ZWRhY19jaGVjayA9IG12NjR4NjBfcGNpX2NoZWNrOworCisJcGRhdGEtPmVkYWNfaWR4ID0gZWRhY19wY2lfaWR4Kys7CisKKwlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGdldCByZXNvdXJjZSBmb3IgIgorCQkgICAgICAgIlBDSSBlcnIgcmVnc1xuIiwgX19mdW5jX18pOworCQlyZXMgPSAtRU5PRU5UOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsCisJCQkJICAgICByLT5zdGFydCwKKwkJCQkgICAgIHItPmVuZCAtIHItPnN0YXJ0ICsgMSwKKwkJCQkgICAgIHBkYXRhLT5uYW1lKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciB3aGlsZSByZXF1ZXN0aW5nIG1lbSByZWdpb25cbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCXJlcyA9IC1FQlVTWTsKKwkJZ290byBlcnI7CisJfQorCisJcGRhdGEtPnBjaV92YmFzZSA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LAorCQkJCQlyLT5zdGFydCwKKwkJCQkJci0+ZW5kIC0gci0+c3RhcnQgKyAxKTsKKwlpZiAoIXBkYXRhLT5wY2lfdmJhc2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIHNldHVwIFBDSSBlcnIgcmVnc1xuIiwgX19mdW5jX18pOworCQlyZXMgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwlvdXRfbGUzMihwZGF0YS0+cGNpX3ZiYXNlICsgTVY2NFg2MF9QQ0lfRVJST1JfQ0FVU0UsIDApOworCW91dF9sZTMyKHBkYXRhLT5wY2lfdmJhc2UgKyBNVjY0WDYwX1BDSV9FUlJPUl9NQVNLLCAwKTsKKwlvdXRfbGUzMihwZGF0YS0+cGNpX3ZiYXNlICsgTVY2NFg2MF9QQ0lfRVJST1JfTUFTSywKKwkJIE1WNjRYNjBfUENJeF9FUlJfTUFTS19WQUwpOworCisJaWYgKGVkYWNfcGNpX2FkZF9kZXZpY2UocGNpLCBwZGF0YS0+ZWRhY19pZHgpID4gMCkgeworCQlkZWJ1Z2YzKCIlcygpOiBmYWlsZWQgZWRhY19wY2lfYWRkX2RldmljZSgpXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyOworCX0KKworCWlmIChlZGFjX29wX3N0YXRlID09IEVEQUNfT1BTVEFURV9JTlQpIHsKKwkJcGRhdGEtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJCXJlcyA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwKKwkJCQkgICAgICAgcGRhdGEtPmlycSwKKwkJCQkgICAgICAgbXY2NHg2MF9wY2lfaXNyLAorCQkJCSAgICAgICBJUlFGX0RJU0FCTEVELAorCQkJCSAgICAgICAiW0VEQUNdIFBDSSBlcnIiLAorCQkJCSAgICAgICBwY2kpOworCQlpZiAocmVzIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIHJlcXVlc3QgaXJxICVkIGZvciAiCisJCQkgICAgICAgIk1WNjR4NjAgUENJIEVSUlxuIiwgX19mdW5jX18sIHBkYXRhLT5pcnEpOworCQkJcmVzID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyMjsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPIEVEQUNfTU9EX1NUUiAiIGFjcXVpcmVkIGlycSAlZCBmb3IgUENJIEVyclxuIiwKKwkJICAgICAgIHBkYXRhLT5pcnEpOworCX0KKworCWRldnJlc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldiwgbXY2NHg2MF9wY2lfZXJyX3Byb2JlKTsKKworCS8qIGdldCB0aGlzIGZhciBhbmQgaXQncyBzdWNjZXNzZnVsICovCisJZGVidWdmMygiJXMoKTogc3VjY2Vzc1xuIiwgX19mdW5jX18pOworCisJcmV0dXJuIDA7CisKK2VycjI6CisJZWRhY19wY2lfZGVsX2RldmljZSgmcGRldi0+ZGV2KTsKK2VycjoKKwllZGFjX3BjaV9mcmVlX2N0bF9pbmZvKHBjaSk7CisJZGV2cmVzX3JlbGVhc2VfZ3JvdXAoJnBkZXYtPmRldiwgbXY2NHg2MF9wY2lfZXJyX3Byb2JlKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IG12NjR4NjBfcGNpX2Vycl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZWRhY19wY2lfY3RsX2luZm8gKnBjaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJZGVidWdmMCgiJXMoKVxuIiwgX19mdW5jX18pOworCisJZWRhY19wY2lfZGVsX2RldmljZSgmcGRldi0+ZGV2KTsKKworCWVkYWNfcGNpX2ZyZWVfY3RsX2luZm8ocGNpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtdjY0eDYwX3BjaV9lcnJfZHJpdmVyID0geworCS5wcm9iZSA9IG12NjR4NjBfcGNpX2Vycl9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AobXY2NHg2MF9wY2lfZXJyX3JlbW92ZSksCisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAibXY2NHg2MF9wY2lfZXJyIiwKKwl9Cit9OworCisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiogU1JBTSBlcnIgZGV2aWNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBtdjY0eDYwX3NyYW1fY2hlY2soc3RydWN0IGVkYWNfZGV2aWNlX2N0bF9pbmZvICplZGFjX2RldikKK3sKKwlzdHJ1Y3QgbXY2NHg2MF9zcmFtX3BkYXRhICpwZGF0YSA9IGVkYWNfZGV2LT5wdnRfaW5mbzsKKwl1MzIgY2F1c2U7CisKKwljYXVzZSA9IGluX2xlMzIocGRhdGEtPnNyYW1fdmJhc2UgKyBNVjY0WDYwX1NSQU1fRVJSX0NBVVNFKTsKKwlpZiAoIWNhdXNlKQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9FUlIgIkVycm9yIGluIGludGVybmFsIFNSQU1cbiIpOworCXByaW50ayhLRVJOX0VSUiAiQ2F1c2UgcmVnaXN0ZXI6IDB4JTA4eFxuIiwgY2F1c2UpOworCXByaW50ayhLRVJOX0VSUiAiQWRkcmVzcyBMb3c6IDB4JTA4eFxuIiwKKwkgICAgICAgaW5fbGUzMihwZGF0YS0+c3JhbV92YmFzZSArIE1WNjRYNjBfU1JBTV9FUlJfQUREUl9MTykpOworCXByaW50ayhLRVJOX0VSUiAiQWRkcmVzcyBIaWdoOiAweCUwOHhcbiIsCisJICAgICAgIGluX2xlMzIocGRhdGEtPnNyYW1fdmJhc2UgKyBNVjY0WDYwX1NSQU1fRVJSX0FERFJfSEkpKTsKKwlwcmludGsoS0VSTl9FUlIgIkRhdGEgTG93OiAweCUwOHhcbiIsCisJICAgICAgIGluX2xlMzIocGRhdGEtPnNyYW1fdmJhc2UgKyBNVjY0WDYwX1NSQU1fRVJSX0RBVEFfTE8pKTsKKwlwcmludGsoS0VSTl9FUlIgIkRhdGEgSGlnaDogMHglMDh4XG4iLAorCSAgICAgICBpbl9sZTMyKHBkYXRhLT5zcmFtX3ZiYXNlICsgTVY2NFg2MF9TUkFNX0VSUl9EQVRBX0hJKSk7CisJcHJpbnRrKEtFUk5fRVJSICJQYXJpdHk6IDB4JTA4eFxuIiwKKwkgICAgICAgaW5fbGUzMihwZGF0YS0+c3JhbV92YmFzZSArIE1WNjRYNjBfU1JBTV9FUlJfUEFSSVRZKSk7CisJb3V0X2xlMzIocGRhdGEtPnNyYW1fdmJhc2UgKyBNVjY0WDYwX1NSQU1fRVJSX0NBVVNFLCAwKTsKKworCWVkYWNfZGV2aWNlX2hhbmRsZV91ZShlZGFjX2RldiwgMCwgMCwgZWRhY19kZXYtPmN0bF9uYW1lKTsKK30KKworc3RhdGljIGlycXJldHVybl90IG12NjR4NjBfc3JhbV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBlZGFjX2RldmljZV9jdGxfaW5mbyAqZWRhY19kZXYgPSBkZXZfaWQ7CisJc3RydWN0IG12NjR4NjBfc3JhbV9wZGF0YSAqcGRhdGEgPSBlZGFjX2Rldi0+cHZ0X2luZm87CisJdTMyIGNhdXNlOworCisJY2F1c2UgPSBpbl9sZTMyKHBkYXRhLT5zcmFtX3ZiYXNlICsgTVY2NFg2MF9TUkFNX0VSUl9DQVVTRSk7CisJaWYgKCFjYXVzZSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJbXY2NHg2MF9zcmFtX2NoZWNrKGVkYWNfZGV2KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgbXY2NHg2MF9zcmFtX2Vycl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBlZGFjX2RldmljZV9jdGxfaW5mbyAqZWRhY19kZXY7CisJc3RydWN0IG12NjR4NjBfc3JhbV9wZGF0YSAqcGRhdGE7CisJc3RydWN0IHJlc291cmNlICpyOworCWludCByZXMgPSAwOworCisJaWYgKCFkZXZyZXNfb3Blbl9ncm91cCgmcGRldi0+ZGV2LCBtdjY0eDYwX3NyYW1fZXJyX3Byb2JlLCBHRlBfS0VSTkVMKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllZGFjX2RldiA9IGVkYWNfZGV2aWNlX2FsbG9jX2N0bF9pbmZvKHNpemVvZigqcGRhdGEpLAorCQkJCQkgICAgICAic3JhbSIsIDEsIE5VTEwsIDAsIDAsIE5VTEwsIDAsCisJCQkJCSAgICAgIGVkYWNfZGV2X2lkeCk7CisJaWYgKCFlZGFjX2RldikgeworCQlkZXZyZXNfcmVsZWFzZV9ncm91cCgmcGRldi0+ZGV2LCBtdjY0eDYwX3NyYW1fZXJyX3Byb2JlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcGRhdGEgPSBlZGFjX2Rldi0+cHZ0X2luZm87CisJcGRhdGEtPm5hbWUgPSAibXY2NHg2MF9zcmFtX2VyciI7CisJcGRhdGEtPmlycSA9IE5PX0lSUTsKKwllZGFjX2Rldi0+ZGV2ID0gJnBkZXYtPmRldjsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBlZGFjX2Rldik7CisJZWRhY19kZXYtPmRldl9uYW1lID0gcGRldi0+ZGV2LmJ1c19pZDsKKworCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gZ2V0IHJlc291cmNlIGZvciAiCisJCSAgICAgICAiU1JBTSBlcnIgcmVnc1xuIiwgX19mdW5jX18pOworCQlyZXMgPSAtRU5PRU5UOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsCisJCQkJICAgICByLT5zdGFydCwKKwkJCQkgICAgIHItPmVuZCAtIHItPnN0YXJ0ICsgMSwKKwkJCQkgICAgIHBkYXRhLT5uYW1lKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciB3aGlsZSByZXF1ZXN0IG1lbSByZWdpb25cbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCXJlcyA9IC1FQlVTWTsKKwkJZ290byBlcnI7CisJfQorCisJcGRhdGEtPnNyYW1fdmJhc2UgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwKKwkJCQkJIHItPnN0YXJ0LAorCQkJCQkgci0+ZW5kIC0gci0+c3RhcnQgKyAxKTsKKwlpZiAoIXBkYXRhLT5zcmFtX3ZiYXNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBzZXR1cCBTUkFNIGVyciByZWdzXG4iLAorCQkgICAgICAgX19mdW5jX18pOworCQlyZXMgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBzZXR1cCBTUkFNIGVyciByZWdpc3RlcnMgKi8KKwlvdXRfbGUzMihwZGF0YS0+c3JhbV92YmFzZSArIE1WNjRYNjBfU1JBTV9FUlJfQ0FVU0UsIDApOworCisJZWRhY19kZXYtPm1vZF9uYW1lID0gRURBQ19NT0RfU1RSOworCWVkYWNfZGV2LT5jdGxfbmFtZSA9IHBkYXRhLT5uYW1lOworCisJaWYgKGVkYWNfb3Bfc3RhdGUgPT0gRURBQ19PUFNUQVRFX1BPTEwpCisJCWVkYWNfZGV2LT5lZGFjX2NoZWNrID0gbXY2NHg2MF9zcmFtX2NoZWNrOworCisJcGRhdGEtPmVkYWNfaWR4ID0gZWRhY19kZXZfaWR4Kys7CisKKwlpZiAoZWRhY19kZXZpY2VfYWRkX2RldmljZShlZGFjX2RldikgPiAwKSB7CisJCWRlYnVnZjMoIiVzKCk6IGZhaWxlZCBlZGFjX2RldmljZV9hZGRfZGV2aWNlKClcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKGVkYWNfb3Bfc3RhdGUgPT0gRURBQ19PUFNUQVRFX0lOVCkgeworCQlwZGF0YS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwkJcmVzID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LAorCQkJCSAgICAgICBwZGF0YS0+aXJxLAorCQkJCSAgICAgICBtdjY0eDYwX3NyYW1faXNyLAorCQkJCSAgICAgICBJUlFGX0RJU0FCTEVELAorCQkJCSAgICAgICAiW0VEQUNdIFNSQU0gZXJyIiwKKwkJCQkgICAgICAgZWRhY19kZXYpOworCQlpZiAocmVzIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIiVzOiBVbmFibGUgdG8gcmVxdWVzdCBpcnEgJWQgZm9yICIKKwkJCSAgICAgICAiTVY2NHg2MCBTUkFNIEVSUlxuIiwgX19mdW5jX18sIHBkYXRhLT5pcnEpOworCQkJcmVzID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyMjsKKwkJfQorCisJCXByaW50ayhLRVJOX0lORk8gRURBQ19NT0RfU1RSICIgYWNxdWlyZWQgaXJxICVkIGZvciBTUkFNIEVyclxuIiwKKwkJICAgICAgIHBkYXRhLT5pcnEpOworCX0KKworCWRldnJlc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldiwgbXY2NHg2MF9zcmFtX2Vycl9wcm9iZSk7CisKKwkvKiBnZXQgdGhpcyBmYXIgYW5kIGl0J3Mgc3VjY2Vzc2Z1bCAqLworCWRlYnVnZjMoIiVzKCk6IHN1Y2Nlc3NcbiIsIF9fZnVuY19fKTsKKworCXJldHVybiAwOworCitlcnIyOgorCWVkYWNfZGV2aWNlX2RlbF9kZXZpY2UoJnBkZXYtPmRldik7CitlcnI6CisJZGV2cmVzX3JlbGVhc2VfZ3JvdXAoJnBkZXYtPmRldiwgbXY2NHg2MF9zcmFtX2Vycl9wcm9iZSk7CisJZWRhY19kZXZpY2VfZnJlZV9jdGxfaW5mbyhlZGFjX2Rldik7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBtdjY0eDYwX3NyYW1fZXJyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBlZGFjX2RldmljZV9jdGxfaW5mbyAqZWRhY19kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWRlYnVnZjAoIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWVkYWNfZGV2aWNlX2RlbF9kZXZpY2UoJnBkZXYtPmRldik7CisJZWRhY19kZXZpY2VfZnJlZV9jdGxfaW5mbyhlZGFjX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXY2NHg2MF9zcmFtX2Vycl9kcml2ZXIgPSB7CisJLnByb2JlID0gbXY2NHg2MF9zcmFtX2Vycl9wcm9iZSwKKwkucmVtb3ZlID0gbXY2NHg2MF9zcmFtX2Vycl9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAibXY2NHg2MF9zcmFtX2VyciIsCisJfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqIENQVSBlcnIgZGV2aWNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBtdjY0eDYwX2NwdV9jaGVjayhzdHJ1Y3QgZWRhY19kZXZpY2VfY3RsX2luZm8gKmVkYWNfZGV2KQoreworCXN0cnVjdCBtdjY0eDYwX2NwdV9wZGF0YSAqcGRhdGEgPSBlZGFjX2Rldi0+cHZ0X2luZm87CisJdTMyIGNhdXNlOworCisJY2F1c2UgPSBpbl9sZTMyKHBkYXRhLT5jcHVfdmJhc2VbMV0gKyBNVjY0eDYwX0NQVV9FUlJfQ0FVU0UpICYKKwkgICAgTVY2NHg2MF9DUFVfQ0FVU0VfTUFTSzsKKwlpZiAoIWNhdXNlKQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9FUlIgIkVycm9yIG9uIENQVSBpbnRlcmZhY2VcbiIpOworCXByaW50ayhLRVJOX0VSUiAiQ2F1c2UgcmVnaXN0ZXI6IDB4JTA4eFxuIiwgY2F1c2UpOworCXByaW50ayhLRVJOX0VSUiAiQWRkcmVzcyBMb3c6IDB4JTA4eFxuIiwKKwkgICAgICAgaW5fbGUzMihwZGF0YS0+Y3B1X3ZiYXNlWzBdICsgTVY2NHg2MF9DUFVfRVJSX0FERFJfTE8pKTsKKwlwcmludGsoS0VSTl9FUlIgIkFkZHJlc3MgSGlnaDogMHglMDh4XG4iLAorCSAgICAgICBpbl9sZTMyKHBkYXRhLT5jcHVfdmJhc2VbMF0gKyBNVjY0eDYwX0NQVV9FUlJfQUREUl9ISSkpOworCXByaW50ayhLRVJOX0VSUiAiRGF0YSBMb3c6IDB4JTA4eFxuIiwKKwkgICAgICAgaW5fbGUzMihwZGF0YS0+Y3B1X3ZiYXNlWzFdICsgTVY2NHg2MF9DUFVfRVJSX0RBVEFfTE8pKTsKKwlwcmludGsoS0VSTl9FUlIgIkRhdGEgSGlnaDogMHglMDh4XG4iLAorCSAgICAgICBpbl9sZTMyKHBkYXRhLT5jcHVfdmJhc2VbMV0gKyBNVjY0eDYwX0NQVV9FUlJfREFUQV9ISSkpOworCXByaW50ayhLRVJOX0VSUiAiUGFyaXR5OiAweCUwOHhcbiIsCisJICAgICAgIGluX2xlMzIocGRhdGEtPmNwdV92YmFzZVsxXSArIE1WNjR4NjBfQ1BVX0VSUl9QQVJJVFkpKTsKKwlvdXRfbGUzMihwZGF0YS0+Y3B1X3ZiYXNlWzFdICsgTVY2NHg2MF9DUFVfRVJSX0NBVVNFLCAwKTsKKworCWVkYWNfZGV2aWNlX2hhbmRsZV91ZShlZGFjX2RldiwgMCwgMCwgZWRhY19kZXYtPmN0bF9uYW1lKTsKK30KKworc3RhdGljIGlycXJldHVybl90IG12NjR4NjBfY3B1X2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGVkYWNfZGV2aWNlX2N0bF9pbmZvICplZGFjX2RldiA9IGRldl9pZDsKKwlzdHJ1Y3QgbXY2NHg2MF9jcHVfcGRhdGEgKnBkYXRhID0gZWRhY19kZXYtPnB2dF9pbmZvOworCXUzMiBjYXVzZTsKKworCWNhdXNlID0gaW5fbGUzMihwZGF0YS0+Y3B1X3ZiYXNlWzFdICsgTVY2NHg2MF9DUFVfRVJSX0NBVVNFKSAmCisJICAgIE1WNjR4NjBfQ1BVX0NBVVNFX01BU0s7CisJaWYgKCFjYXVzZSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJbXY2NHg2MF9jcHVfY2hlY2soZWRhY19kZXYpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtdjY0eDYwX2NwdV9lcnJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZWRhY19kZXZpY2VfY3RsX2luZm8gKmVkYWNfZGV2OworCXN0cnVjdCByZXNvdXJjZSAqcjsKKwlzdHJ1Y3QgbXY2NHg2MF9jcHVfcGRhdGEgKnBkYXRhOworCWludCByZXMgPSAwOworCisJaWYgKCFkZXZyZXNfb3Blbl9ncm91cCgmcGRldi0+ZGV2LCBtdjY0eDYwX2NwdV9lcnJfcHJvYmUsIEdGUF9LRVJORUwpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVkYWNfZGV2ID0gZWRhY19kZXZpY2VfYWxsb2NfY3RsX2luZm8oc2l6ZW9mKCpwZGF0YSksCisJCQkJCSAgICAgICJjcHUiLCAxLCBOVUxMLCAwLCAwLCBOVUxMLCAwLAorCQkJCQkgICAgICBlZGFjX2Rldl9pZHgpOworCWlmICghZWRhY19kZXYpIHsKKwkJZGV2cmVzX3JlbGVhc2VfZ3JvdXAoJnBkZXYtPmRldiwgbXY2NHg2MF9jcHVfZXJyX3Byb2JlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcGRhdGEgPSBlZGFjX2Rldi0+cHZ0X2luZm87CisJcGRhdGEtPm5hbWUgPSAibXY2NHg2MF9jcHVfZXJyIjsKKwlwZGF0YS0+aXJxID0gTk9fSVJROworCWVkYWNfZGV2LT5kZXYgPSAmcGRldi0+ZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGVkYWNfZGV2KTsKKwllZGFjX2Rldi0+ZGV2X25hbWUgPSBwZGV2LT5kZXYuYnVzX2lkOworCisJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBnZXQgcmVzb3VyY2UgZm9yICIKKwkJICAgICAgICJDUFUgZXJyIHJlZ3NcbiIsIF9fZnVuY19fKTsKKwkJcmVzID0gLUVOT0VOVDsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LAorCQkJCSAgICAgci0+c3RhcnQsCisJCQkJICAgICByLT5lbmQgLSByLT5zdGFydCArIDEsCisJCQkJICAgICBwZGF0YS0+bmFtZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBtZW0gcmVnaW9uXG4iLAorCQkgICAgICAgX19mdW5jX18pOworCQlyZXMgPSAtRUJVU1k7CisJCWdvdG8gZXJyOworCX0KKworCXBkYXRhLT5jcHVfdmJhc2VbMF0gPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwKKwkJCQkJICAgci0+c3RhcnQsCisJCQkJCSAgIHItPmVuZCAtIHItPnN0YXJ0ICsgMSk7CisJaWYgKCFwZGF0YS0+Y3B1X3ZiYXNlWzBdKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBzZXR1cCBDUFUgZXJyIHJlZ3NcbiIsIF9fZnVuY19fKTsKKwkJcmVzID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMSk7CisJaWYgKCFyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBnZXQgcmVzb3VyY2UgZm9yICIKKwkJICAgICAgICJDUFUgZXJyIHJlZ3NcbiIsIF9fZnVuY19fKTsKKwkJcmVzID0gLUVOT0VOVDsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LAorCQkJCSAgICAgci0+c3RhcnQsCisJCQkJICAgICByLT5lbmQgLSByLT5zdGFydCArIDEsCisJCQkJICAgICBwZGF0YS0+bmFtZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBtZW0gcmVnaW9uXG4iLAorCQkgICAgICAgX19mdW5jX18pOworCQlyZXMgPSAtRUJVU1k7CisJCWdvdG8gZXJyOworCX0KKworCXBkYXRhLT5jcHVfdmJhc2VbMV0gPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwKKwkJCQkJICAgci0+c3RhcnQsCisJCQkJCSAgIHItPmVuZCAtIHItPnN0YXJ0ICsgMSk7CisJaWYgKCFwZGF0YS0+Y3B1X3ZiYXNlWzFdKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBzZXR1cCBDUFUgZXJyIHJlZ3NcbiIsIF9fZnVuY19fKTsKKwkJcmVzID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJLyogc2V0dXAgQ1BVIGVyciByZWdpc3RlcnMgKi8KKwlvdXRfbGUzMihwZGF0YS0+Y3B1X3ZiYXNlWzFdICsgTVY2NHg2MF9DUFVfRVJSX0NBVVNFLCAwKTsKKwlvdXRfbGUzMihwZGF0YS0+Y3B1X3ZiYXNlWzFdICsgTVY2NHg2MF9DUFVfRVJSX01BU0ssIDApOworCW91dF9sZTMyKHBkYXRhLT5jcHVfdmJhc2VbMV0gKyBNVjY0eDYwX0NQVV9FUlJfTUFTSywgMHgwMDAwMDBmZik7CisKKwllZGFjX2Rldi0+bW9kX25hbWUgPSBFREFDX01PRF9TVFI7CisJZWRhY19kZXYtPmN0bF9uYW1lID0gcGRhdGEtPm5hbWU7CisJaWYgKGVkYWNfb3Bfc3RhdGUgPT0gRURBQ19PUFNUQVRFX1BPTEwpCisJCWVkYWNfZGV2LT5lZGFjX2NoZWNrID0gbXY2NHg2MF9jcHVfY2hlY2s7CisKKwlwZGF0YS0+ZWRhY19pZHggPSBlZGFjX2Rldl9pZHgrKzsKKworCWlmIChlZGFjX2RldmljZV9hZGRfZGV2aWNlKGVkYWNfZGV2KSA+IDApIHsKKwkJZGVidWdmMygiJXMoKTogZmFpbGVkIGVkYWNfZGV2aWNlX2FkZF9kZXZpY2UoKVxuIiwgX19mdW5jX18pOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoZWRhY19vcF9zdGF0ZSA9PSBFREFDX09QU1RBVEVfSU5UKSB7CisJCXBkYXRhLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCQlyZXMgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsCisJCQkJICAgICAgIHBkYXRhLT5pcnEsCisJCQkJICAgICAgIG12NjR4NjBfY3B1X2lzciwKKwkJCQkgICAgICAgSVJRRl9ESVNBQkxFRCwKKwkJCQkgICAgICAgIltFREFDXSBDUFUgZXJyIiwKKwkJCQkgICAgICAgZWRhY19kZXYpOworCQlpZiAocmVzIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIiVzOiBVbmFibGUgdG8gcmVxdWVzdCBpcnEgJWQgZm9yIE1WNjR4NjAgIgorCQkJICAgICAgICJDUFUgRVJSXG4iLCBfX2Z1bmNfXywgcGRhdGEtPmlycSk7CisJCQlyZXMgPSAtRU5PREVWOworCQkJZ290byBlcnIyOworCQl9CisKKwkJcHJpbnRrKEtFUk5fSU5GTyBFREFDX01PRF9TVFIKKwkJICAgICAgICIgYWNxdWlyZWQgaXJxICVkIGZvciBDUFUgRXJyXG4iLCBwZGF0YS0+aXJxKTsKKwl9CisKKwlkZXZyZXNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYsIG12NjR4NjBfY3B1X2Vycl9wcm9iZSk7CisKKwkvKiBnZXQgdGhpcyBmYXIgYW5kIGl0J3Mgc3VjY2Vzc2Z1bCAqLworCWRlYnVnZjMoIiVzKCk6IHN1Y2Nlc3NcbiIsIF9fZnVuY19fKTsKKworCXJldHVybiAwOworCitlcnIyOgorCWVkYWNfZGV2aWNlX2RlbF9kZXZpY2UoJnBkZXYtPmRldik7CitlcnI6CisJZGV2cmVzX3JlbGVhc2VfZ3JvdXAoJnBkZXYtPmRldiwgbXY2NHg2MF9jcHVfZXJyX3Byb2JlKTsKKwllZGFjX2RldmljZV9mcmVlX2N0bF9pbmZvKGVkYWNfZGV2KTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IG12NjR4NjBfY3B1X2Vycl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZWRhY19kZXZpY2VfY3RsX2luZm8gKmVkYWNfZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlkZWJ1Z2YwKCIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwllZGFjX2RldmljZV9kZWxfZGV2aWNlKCZwZGV2LT5kZXYpOworCWVkYWNfZGV2aWNlX2ZyZWVfY3RsX2luZm8oZWRhY19kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtdjY0eDYwX2NwdV9lcnJfZHJpdmVyID0geworCS5wcm9iZSA9IG12NjR4NjBfY3B1X2Vycl9wcm9iZSwKKwkucmVtb3ZlID0gbXY2NHg2MF9jcHVfZXJyX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9ICJtdjY0eDYwX2NwdV9lcnIiLAorCX0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBEUkFNIGVyciBkZXZpY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgbXY2NHg2MF9tY19jaGVjayhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJc3RydWN0IG12NjR4NjBfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKKwl1MzIgcmVnOworCXUzMiBlcnJfYWRkcjsKKwl1MzIgc2RyYW1fZWNjOworCXUzMiBjb21wX2VjYzsKKwl1MzIgc3luZHJvbWU7CisKKwlyZWcgPSBpbl9sZTMyKHBkYXRhLT5tY192YmFzZSArIE1WNjRYNjBfU0RSQU1fRVJSX0FERFIpOworCWlmICghcmVnKQorCQlyZXR1cm47CisKKwllcnJfYWRkciA9IHJlZyAmIH4weDM7CisJc2RyYW1fZWNjID0gaW5fbGUzMihwZGF0YS0+bWNfdmJhc2UgKyBNVjY0WDYwX1NEUkFNX0VSUl9FQ0NfUkNWRCk7CisJY29tcF9lY2MgPSBpbl9sZTMyKHBkYXRhLT5tY192YmFzZSArIE1WNjRYNjBfU0RSQU1fRVJSX0VDQ19DQUxDKTsKKwlzeW5kcm9tZSA9IHNkcmFtX2VjYyBeIGNvbXBfZWNjOworCisJLyogZmlyc3QgYml0IGNsZWFyIGluIEVDQyBFcnIgUmVnLCAxIGJpdCBlcnJvciwgY29ycmVjdGFibGUgYnkgSFcgKi8KKwlpZiAoIShyZWcgJiAweDEpKQorCQllZGFjX21jX2hhbmRsZV9jZShtY2ksIGVycl9hZGRyID4+IFBBR0VfU0hJRlQsCisJCQkJICBlcnJfYWRkciAmIFBBR0VfTUFTSywgc3luZHJvbWUsIDAsIDAsCisJCQkJICBtY2ktPmN0bF9uYW1lKTsKKwllbHNlCS8qIDIgYml0IGVycm9yLCBVRSAqLworCQllZGFjX21jX2hhbmRsZV91ZShtY2ksIGVycl9hZGRyID4+IFBBR0VfU0hJRlQsCisJCQkJICBlcnJfYWRkciAmIFBBR0VfTUFTSywgMCwgbWNpLT5jdGxfbmFtZSk7CisKKwkvKiBjbGVhciB0aGUgZXJyb3IgKi8KKwlvdXRfbGUzMihwZGF0YS0+bWNfdmJhc2UgKyBNVjY0WDYwX1NEUkFNX0VSUl9BRERSLCAwKTsKK30KKworc3RhdGljIGlycXJldHVybl90IG12NjR4NjBfbWNfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kgPSBkZXZfaWQ7CisJc3RydWN0IG12NjR4NjBfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKKwl1MzIgcmVnOworCisJcmVnID0gaW5fbGUzMihwZGF0YS0+bWNfdmJhc2UgKyBNVjY0WDYwX1NEUkFNX0VSUl9BRERSKTsKKwlpZiAoIXJlZykKKwkJcmV0dXJuIElSUV9OT05FOworCisJLyogd3JpdGluZyAwJ3MgdG8gdGhlIEVDQyBlcnIgYWRkciBpbiBjaGVjayBmdW5jdGlvbiBjbGVhcnMgaXJxICovCisJbXY2NHg2MF9tY19jaGVjayhtY2kpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBnZXRfdG90YWxfbWVtKHN0cnVjdCBtdjY0eDYwX21jX3BkYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gTlVMTDsKKwljb25zdCB1bnNpZ25lZCBpbnQgKnJlZzsKKworCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgIm1lbW9yeSIpOworCWlmICghbnApCisJCXJldHVybjsKKworCXJlZyA9IGdldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOworCisJcGRhdGEtPnRvdGFsX21lbSA9IHJlZ1sxXTsKK30KKworc3RhdGljIHZvaWQgbXY2NHg2MF9pbml0X2Nzcm93cyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQkJc3RydWN0IG12NjR4NjBfbWNfcGRhdGEgKnBkYXRhKQoreworCXN0cnVjdCBjc3Jvd19pbmZvICpjc3JvdzsKKwl1MzIgZGV2dHlwZTsKKwl1MzIgY3RsOworCisJZ2V0X3RvdGFsX21lbShwZGF0YSk7CisKKwljdGwgPSBpbl9sZTMyKHBkYXRhLT5tY192YmFzZSArIE1WNjRYNjBfU0RSQU1fQ09ORklHKTsKKworCWNzcm93ID0gJm1jaS0+Y3Nyb3dzWzBdOworCWNzcm93LT5maXJzdF9wYWdlID0gMDsKKwljc3Jvdy0+bnJfcGFnZXMgPSBwZGF0YS0+dG90YWxfbWVtID4+IFBBR0VfU0hJRlQ7CisJY3Nyb3ctPmxhc3RfcGFnZSA9IGNzcm93LT5maXJzdF9wYWdlICsgY3Nyb3ctPm5yX3BhZ2VzIC0gMTsKKwljc3Jvdy0+Z3JhaW4gPSA4OworCisJY3Nyb3ctPm10eXBlID0gKGN0bCAmIE1WNjRYNjBfU0RSQU1fUkVHSVNURVJFRCkgPyBNRU1fUkREUiA6IE1FTV9ERFI7CisKKwlkZXZ0eXBlID0gKGN0bCA+PiAyMCkgJiAweDM7CisJc3dpdGNoIChkZXZ0eXBlKSB7CisJY2FzZSAweDA6CisJCWNzcm93LT5kdHlwZSA9IERFVl9YMzI7CisJCWJyZWFrOworCWNhc2UgMHgyOgkJLyogY291bGQgYmUgWDggdG9vLCBidXQgbm8gd2F5IHRvIHRlbGwgKi8KKwkJY3Nyb3ctPmR0eXBlID0gREVWX1gxNjsKKwkJYnJlYWs7CisJY2FzZSAweDM6CisJCWNzcm93LT5kdHlwZSA9IERFVl9YNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY3Nyb3ctPmR0eXBlID0gREVWX1VOS05PV047CisJCWJyZWFrOworCX0KKworCWNzcm93LT5lZGFjX21vZGUgPSBFREFDX1NFQ0RFRDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgbXY2NHg2MF9tY19lcnJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2k7CisJc3RydWN0IG12NjR4NjBfbWNfcGRhdGEgKnBkYXRhOworCXN0cnVjdCByZXNvdXJjZSAqcjsKKwl1MzIgY3RsOworCWludCByZXMgPSAwOworCisJaWYgKCFkZXZyZXNfb3Blbl9ncm91cCgmcGRldi0+ZGV2LCBtdjY0eDYwX21jX2Vycl9wcm9iZSwgR0ZQX0tFUk5FTCkpCisJCXJldHVybiAtRU5PTUVNOworCisJbWNpID0gZWRhY19tY19hbGxvYyhzaXplb2Yoc3RydWN0IG12NjR4NjBfbWNfcGRhdGEpLCAxLCAxLCBlZGFjX21jX2lkeCk7CisJaWYgKCFtY2kpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogTm8gbWVtb3J5IGZvciBDUFUgZXJyXG4iLCBfX2Z1bmNfXyk7CisJCWRldnJlc19yZWxlYXNlX2dyb3VwKCZwZGV2LT5kZXYsIG12NjR4NjBfbWNfZXJyX3Byb2JlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcGRhdGEgPSBtY2ktPnB2dF9pbmZvOworCW1jaS0+ZGV2ID0gJnBkZXYtPmRldjsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtY2kpOworCXBkYXRhLT5uYW1lID0gIm12NjR4NjBfbWNfZXJyIjsKKwlwZGF0YS0+aXJxID0gTk9fSVJROworCW1jaS0+ZGV2X25hbWUgPSBwZGV2LT5kZXYuYnVzX2lkOworCXBkYXRhLT5lZGFjX2lkeCA9IGVkYWNfbWNfaWR4Kys7CisKKwlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGdldCByZXNvdXJjZSBmb3IgIgorCQkgICAgICAgIk1DIGVyciByZWdzXG4iLCBfX2Z1bmNfXyk7CisJCXJlcyA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyOworCX0KKworCWlmICghZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJnBkZXYtPmRldiwKKwkJCQkgICAgIHItPnN0YXJ0LAorCQkJCSAgICAgci0+ZW5kIC0gci0+c3RhcnQgKyAxLAorCQkJCSAgICAgcGRhdGEtPm5hbWUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIHdoaWxlIHJlcXVlc3RpbmcgbWVtIHJlZ2lvblxuIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJcmVzID0gLUVCVVNZOworCQlnb3RvIGVycjsKKwl9CisKKwlwZGF0YS0+bWNfdmJhc2UgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwKKwkJCQkgICAgICAgci0+c3RhcnQsCisJCQkJICAgICAgIHItPmVuZCAtIHItPnN0YXJ0ICsgMSk7CisJaWYgKCFwZGF0YS0+bWNfdmJhc2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIHNldHVwIE1DIGVyciByZWdzXG4iLCBfX2Z1bmNfXyk7CisJCXJlcyA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCWN0bCA9IGluX2xlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVY2NFg2MF9TRFJBTV9DT05GSUcpOworCWlmICghKGN0bCAmIE1WNjRYNjBfU0RSQU1fRUNDKSkgeworCQkvKiBOb24tRUNDIFJBTT8gKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vIEVDQyBESU1NcyBkaXNjb3ZlcmVkXG4iLCBfX2Z1bmNfXyk7CisJCXJlcyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyMjsKKwl9CisKKwlkZWJ1Z2YzKCIlcygpOiBpbml0IG1jaVxuIiwgX19mdW5jX18pOworCW1jaS0+bXR5cGVfY2FwID0gTUVNX0ZMQUdfUkREUiB8IE1FTV9GTEFHX0REUjsKKwltY2ktPmVkYWNfY3RsX2NhcCA9IEVEQUNfRkxBR19OT05FIHwgRURBQ19GTEFHX1NFQ0RFRDsKKwltY2ktPmVkYWNfY2FwID0gRURBQ19GTEFHX1NFQ0RFRDsKKwltY2ktPm1vZF9uYW1lID0gRURBQ19NT0RfU1RSOworCW1jaS0+bW9kX3ZlciA9IE1WNjR4NjBfUkVWSVNJT047CisJbWNpLT5jdGxfbmFtZSA9IG12NjR4NjBfY3RsX25hbWU7CisKKwlpZiAoZWRhY19vcF9zdGF0ZSA9PSBFREFDX09QU1RBVEVfUE9MTCkKKwkJbWNpLT5lZGFjX2NoZWNrID0gbXY2NHg2MF9tY19jaGVjazsKKworCW1jaS0+Y3RsX3BhZ2VfdG9fcGh5cyA9IE5VTEw7CisKKwltY2ktPnNjcnViX21vZGUgPSBTQ1JVQl9TV19TUkM7CisKKwltdjY0eDYwX2luaXRfY3Nyb3dzKG1jaSwgcGRhdGEpOworCisJLyogc2V0dXAgTUMgcmVnaXN0ZXJzICovCisJb3V0X2xlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVY2NFg2MF9TRFJBTV9FUlJfQUREUiwgMCk7CisJY3RsID0gaW5fbGUzMihwZGF0YS0+bWNfdmJhc2UgKyBNVjY0WDYwX1NEUkFNX0VSUl9FQ0NfQ05UTCk7CisJY3RsID0gKGN0bCAmIDB4ZmYwMGZmZmYpIHwgMHgxMDAwMDsKKwlvdXRfbGUzMihwZGF0YS0+bWNfdmJhc2UgKyBNVjY0WDYwX1NEUkFNX0VSUl9FQ0NfQ05UTCwgY3RsKTsKKworCWlmIChlZGFjX21jX2FkZF9tYyhtY2kpKSB7CisJCWRlYnVnZjMoIiVzKCk6IGZhaWxlZCBlZGFjX21jX2FkZF9tYygpXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyOworCX0KKworCWlmIChlZGFjX29wX3N0YXRlID09IEVEQUNfT1BTVEFURV9JTlQpIHsKKwkJLyogYWNxdWlyZSBpbnRlcnJ1cHQgdGhhdCByZXBvcnRzIGVycm9ycyAqLworCQlwZGF0YS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwkJcmVzID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LAorCQkJCSAgICAgICBwZGF0YS0+aXJxLAorCQkJCSAgICAgICBtdjY0eDYwX21jX2lzciwKKwkJCQkgICAgICAgSVJRRl9ESVNBQkxFRCwKKwkJCQkgICAgICAgIltFREFDXSBNQyBlcnIiLAorCQkJCSAgICAgICBtY2kpOworCQlpZiAocmVzIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIHJlcXVlc3QgaXJxICVkIGZvciAiCisJCQkgICAgICAgIk1WNjR4NjAgRFJBTSBFUlJcbiIsIF9fZnVuY19fLCBwZGF0YS0+aXJxKTsKKwkJCXJlcyA9IC1FTk9ERVY7CisJCQlnb3RvIGVycjI7CisJCX0KKworCQlwcmludGsoS0VSTl9JTkZPIEVEQUNfTU9EX1NUUiAiIGFjcXVpcmVkIGlycSAlZCBmb3IgTUMgRXJyXG4iLAorCQkgICAgICAgcGRhdGEtPmlycSk7CisJfQorCisJLyogZ2V0IHRoaXMgZmFyIGFuZCBpdCdzIHN1Y2Nlc3NmdWwgKi8KKwlkZWJ1Z2YzKCIlcygpOiBzdWNjZXNzXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gMDsKKworZXJyMjoKKwllZGFjX21jX2RlbF9tYygmcGRldi0+ZGV2KTsKK2VycjoKKwlkZXZyZXNfcmVsZWFzZV9ncm91cCgmcGRldi0+ZGV2LCBtdjY0eDYwX21jX2Vycl9wcm9iZSk7CisJZWRhY19tY19mcmVlKG1jaSk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBtdjY0eDYwX21jX2Vycl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWRlYnVnZjAoIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWVkYWNfbWNfZGVsX21jKCZwZGV2LT5kZXYpOworCWVkYWNfbWNfZnJlZShtY2kpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtdjY0eDYwX21jX2Vycl9kcml2ZXIgPSB7CisJLnByb2JlID0gbXY2NHg2MF9tY19lcnJfcHJvYmUsCisJLnJlbW92ZSA9IG12NjR4NjBfbWNfZXJyX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9ICJtdjY0eDYwX21jX2VyciIsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgbXY2NHg2MF9lZGFjX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gIk1hcnZlbGwgTVY2NHg2MCBFREFDIGRyaXZlciAiIE1WNjR4NjBfUkVWSVNJT04gIlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiXHQoQykgMjAwNi0yMDA3IE1vbnRhVmlzdGEgU29mdHdhcmVcbiIpOworCS8qIG1ha2Ugc3VyZSBlcnJvciByZXBvcnRpbmcgbWV0aG9kIGlzIHNhbmUgKi8KKwlzd2l0Y2ggKGVkYWNfb3Bfc3RhdGUpIHsKKwljYXNlIEVEQUNfT1BTVEFURV9QT0xMOgorCWNhc2UgRURBQ19PUFNUQVRFX0lOVDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZWRhY19vcF9zdGF0ZSA9IEVEQUNfT1BTVEFURV9JTlQ7CisJCWJyZWFrOworCX0KKworCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXY2NHg2MF9tY19lcnJfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlwcmludGsoS0VSTl9XQVJOSU5HIEVEQUNfTU9EX1NUUiAiTUMgZXJyIGZhaWxlZCB0byByZWdpc3RlclxuIik7CisKKwlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm12NjR4NjBfY3B1X2Vycl9kcml2ZXIpOworCWlmIChyZXQpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgRURBQ19NT0RfU1RSCisJCQkiQ1BVIGVyciBmYWlsZWQgdG8gcmVnaXN0ZXJcbiIpOworCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtdjY0eDYwX3NyYW1fZXJyX2RyaXZlcik7CisJaWYgKHJldCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBFREFDX01PRF9TVFIKKwkJCSJTUkFNIGVyciBmYWlsZWQgdG8gcmVnaXN0ZXJcbiIpOworCisjaWZkZWYgQ09ORklHX1BDSQorCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXY2NHg2MF9wY2lfZXJyX2RyaXZlcik7CisJaWYgKHJldCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBFREFDX01PRF9TVFIKKwkJCSJQQ0kgZXJyIGZhaWxlZCB0byByZWdpc3RlclxuIik7CisjZW5kaWYKKworCXJldHVybiByZXQ7Cit9Cittb2R1bGVfaW5pdChtdjY0eDYwX2VkYWNfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtdjY0eDYwX2VkYWNfZXhpdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19QQ0kKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXY2NHg2MF9wY2lfZXJyX2RyaXZlcik7CisjZW5kaWYKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXY2NHg2MF9zcmFtX2Vycl9kcml2ZXIpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtdjY0eDYwX2NwdV9lcnJfZHJpdmVyKTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXY2NHg2MF9tY19lcnJfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG12NjR4NjBfZWRhY19leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTW9udGF2aXN0YSBTb2Z0d2FyZSwgSW5jLiIpOworbW9kdWxlX3BhcmFtKGVkYWNfb3Bfc3RhdGUsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVkYWNfb3Bfc3RhdGUsCisJCSAiRURBQyBFcnJvciBSZXBvcnRpbmcgc3RhdGU6IDA9UG9sbCwgMj1JbnRlcnJ1cHQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9tdjY0eDYwX2VkYWMuaCBiL2RyaXZlcnMvZWRhYy9tdjY0eDYwX2VkYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDQyZTJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9lZGFjL212NjR4NjBfZWRhYy5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogRURBQyBkZWZzIGZvciBNYXJ2ZWxsIE1WNjR4NjAgYnJpZGdlIGNoaXAKKyAqCisgKiBBdXRob3I6IERhdmUgSmlhbmcgPGRqaWFuZ0BtdmlzdGEuY29tPgorICoKKyAqIDIwMDcgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCisgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKgorICovCisjaWZuZGVmIF9NVjY0WDYwX0VEQUNfSF8KKyNkZWZpbmUgX01WNjRYNjBfRURBQ19IXworCisjZGVmaW5lIE1WNjR4NjBfUkVWSVNJT04gIiBWZXI6IDIuMC4wICIgX19EQVRFX18KKyNkZWZpbmUgRURBQ19NT0RfU1RSCSJNVjY0eDYwX2VkYWMiCisKKyNkZWZpbmUgbXY2NHg2MF9wcmludGsobGV2ZWwsIGZtdCwgYXJnLi4uKSBcCisJZWRhY19wcmludGsobGV2ZWwsICJNVjY0eDYwIiwgZm10LCAjI2FyZykKKworI2RlZmluZSBtdjY0eDYwX21jX3ByaW50ayhtY2ksIGxldmVsLCBmbXQsIGFyZy4uLikgXAorCWVkYWNfbWNfY2hpcHNldF9wcmludGsobWNpLCBsZXZlbCwgIk1WNjR4NjAiLCBmbXQsICMjYXJnKQorCisvKiBDUFUgRXJyb3IgUmVwb3J0IFJlZ2lzdGVycyAqLworI2RlZmluZSBNVjY0eDYwX0NQVV9FUlJfQUREUl9MTwkJMHgwMAkvKiAweDAwNzAgKi8KKyNkZWZpbmUgTVY2NHg2MF9DUFVfRVJSX0FERFJfSEkJCTB4MDgJLyogMHgwMDc4ICovCisjZGVmaW5lIE1WNjR4NjBfQ1BVX0VSUl9EQVRBX0xPCQkweDAwCS8qIDB4MDEyOCAqLworI2RlZmluZSBNVjY0eDYwX0NQVV9FUlJfREFUQV9ISQkJMHgwOAkvKiAweDAxMzAgKi8KKyNkZWZpbmUgTVY2NHg2MF9DUFVfRVJSX1BBUklUWQkJMHgxMAkvKiAweDAxMzggKi8KKyNkZWZpbmUgTVY2NHg2MF9DUFVfRVJSX0NBVVNFCQkweDE4CS8qIDB4MDE0MCAqLworI2RlZmluZSBNVjY0eDYwX0NQVV9FUlJfTUFTSwkJMHgyMAkvKiAweDAxNDggKi8KKworI2RlZmluZSBNVjY0eDYwX0NQVV9DQVVTRV9NQVNLCQkweDA3ZmZmZmZmCisKKy8qIFNSQU0gRXJyb3IgUmVwb3J0IFJlZ2lzdGVycyAqLworI2RlZmluZSBNVjY0WDYwX1NSQU1fRVJSX0NBVVNFCQkweDA4CS8qIDB4MDM4OCAqLworI2RlZmluZSBNVjY0WDYwX1NSQU1fRVJSX0FERFJfTE8JMHgxMAkvKiAweDAzOTAgKi8KKyNkZWZpbmUgTVY2NFg2MF9TUkFNX0VSUl9BRERSX0hJCTB4NzgJLyogMHgwM2Y4ICovCisjZGVmaW5lIE1WNjRYNjBfU1JBTV9FUlJfREFUQV9MTwkweDE4CS8qIDB4MDM5OCAqLworI2RlZmluZSBNVjY0WDYwX1NSQU1fRVJSX0RBVEFfSEkJMHgyMAkvKiAweDAzYTAgKi8KKyNkZWZpbmUgTVY2NFg2MF9TUkFNX0VSUl9QQVJJVFkJCTB4MjgJLyogMHgwM2E4ICovCisKKy8qIFNEUkFNIENvbnRyb2xsZXIgUmVnaXN0ZXJzICovCisjZGVmaW5lIE1WNjRYNjBfU0RSQU1fQ09ORklHCQkweDAwCS8qIDB4MTQwMCAqLworI2RlZmluZSBNVjY0WDYwX1NEUkFNX0VSUl9EQVRBX0hJCTB4NDAJLyogMHgxNDQwICovCisjZGVmaW5lIE1WNjRYNjBfU0RSQU1fRVJSX0RBVEFfTE8JMHg0NAkvKiAweDE0NDQgKi8KKyNkZWZpbmUgTVY2NFg2MF9TRFJBTV9FUlJfRUNDX1JDVkQJMHg0OAkvKiAweDE0NDggKi8KKyNkZWZpbmUgTVY2NFg2MF9TRFJBTV9FUlJfRUNDX0NBTEMJMHg0YwkvKiAweDE0NGMgKi8KKyNkZWZpbmUgTVY2NFg2MF9TRFJBTV9FUlJfQUREUgkJMHg1MAkvKiAweDE0NTAgKi8KKyNkZWZpbmUgTVY2NFg2MF9TRFJBTV9FUlJfRUNDX0NOVEwJMHg1NAkvKiAweDE0NTQgKi8KKyNkZWZpbmUgTVY2NFg2MF9TRFJBTV9FUlJfRUNDX0VSUl9DTlQJMHg1OAkvKiAweDE0NTggKi8KKworI2RlZmluZSBNVjY0WDYwX1NEUkFNX1JFR0lTVEVSRUQJMHgyMDAwMAorI2RlZmluZSBNVjY0WDYwX1NEUkFNX0VDQwkJMHg0MDAwMAorCisjaWZkZWYgQ09ORklHX1BDSQorLyoKKyAqIEJpdCAwIG9mIE1WNjR4NjBfUENJeF9FUlJfTUFTSyBkb2VzIG5vdCBleGlzdCBvbiB0aGUgNjQzNjAgYW5kIGJlY2F1c2Ugb2YKKyAqIGVycmF0YSBGRXItIzExIGFuZCBGRXItIyMxNiBmb3IgdGhlIDY0NDYwLCBpdCBzaG91bGQgYmUgMCBvbiB0aGF0IGNoaXAgYXMKKyAqIHdlbGwuICBJT1csIGRvbid0IHNldCBiaXQgMC4KKyAqLworI2RlZmluZSBNVjY0WDYwX1BDSXhfRVJSX01BU0tfVkFMCTB4MDBhNTBjMjQKKworLyogUmVnaXN0ZXIgb2Zmc2V0cyBmcm9tIFBDSXggZXJyb3IgYWRkcmVzcyBsb3cgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTVY2NFg2MF9QQ0lfRVJST1JfQUREUl9MTwkweDAwCisjZGVmaW5lIE1WNjRYNjBfUENJX0VSUk9SX0FERFJfSEkJMHgwNAorI2RlZmluZSBNVjY0WDYwX1BDSV9FUlJPUl9BVFRSCQkweDA4CisjZGVmaW5lIE1WNjRYNjBfUENJX0VSUk9SX0NNRAkJMHgxMAorI2RlZmluZSBNVjY0WDYwX1BDSV9FUlJPUl9DQVVTRQkJMHgxOAorI2RlZmluZSBNVjY0WDYwX1BDSV9FUlJPUl9NQVNLCQkweDFjCisKKyNkZWZpbmUgTVY2NFg2MF9QQ0lfRVJSX1NXclBlcnIJCTB4MDAwMgorI2RlZmluZSBNVjY0WDYwX1BDSV9FUlJfU1JkUGVycgkJMHgwMDA0CisjZGVmaW5lCU1WNjRYNjBfUENJX0VSUl9NV3JQZXJyCQkweDAwMjAKKyNkZWZpbmUgTVY2NFg2MF9QQ0lfRVJSX01SZFBlcnIJCTB4MDA0MAorCisjZGVmaW5lIE1WNjRYNjBfUENJX1BFX01BU0sJKE1WNjRYNjBfUENJX0VSUl9TV3JQZXJyIHwgXAorCQkJCU1WNjRYNjBfUENJX0VSUl9TUmRQZXJyIHwgXAorCQkJCU1WNjRYNjBfUENJX0VSUl9NV3JQZXJyIHwgXAorCQkJCU1WNjRYNjBfUENJX0VSUl9NUmRQZXJyKQorCitzdHJ1Y3QgbXY2NHg2MF9wY2lfcGRhdGEgeworCWludCBwY2lfaG9zZTsKKwl2b2lkIF9faW9tZW0gKnBjaV92YmFzZTsKKwljaGFyICpuYW1lOworCWludCBpcnE7CisJaW50IGVkYWNfaWR4OworfTsKKworI2VuZGlmCQkJCS8qIENPTkZJR19QQ0kgKi8KKworc3RydWN0IG12NjR4NjBfbWNfcGRhdGEgeworCXZvaWQgX19pb21lbSAqbWNfdmJhc2U7CisJaW50IHRvdGFsX21lbTsKKwljaGFyICpuYW1lOworCWludCBpcnE7CisJaW50IGVkYWNfaWR4OworfTsKKworc3RydWN0IG12NjR4NjBfY3B1X3BkYXRhIHsKKwl2b2lkIF9faW9tZW0gKmNwdV92YmFzZVsyXTsKKwljaGFyICpuYW1lOworCWludCBpcnE7CisJaW50IGVkYWNfaWR4OworfTsKKworc3RydWN0IG12NjR4NjBfc3JhbV9wZGF0YSB7CisJdm9pZCBfX2lvbWVtICpzcmFtX3ZiYXNlOworCWNoYXIgKm5hbWU7CisJaW50IGlycTsKKwlpbnQgZWRhY19pZHg7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZG1pX3NjYW4uYyBiL2RyaXZlcnMvZmlybXdhcmUvZG1pX3NjYW4uYwppbmRleCA5MDA4ZWQ1Li42NTMyNjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9kbWlfc2Nhbi5jCkBAIC00MywxOCArNDMsMTIgQEAKICAqCVdlIGhhdmUgdG8gYmUgY2F1dGlvdXMgaGVyZS4gV2UgaGF2ZSBzZWVuIEJJT1NlcyB3aXRoIERNSSBwb2ludGVycwogICoJcG9pbnRpbmcgdG8gY29tcGxldGVseSB0aGUgd3JvbmcgcGxhY2UgZm9yIGV4YW1wbGUKICAqLwotc3RhdGljIGludCBfX2luaXQgZG1pX3RhYmxlKHUzMiBiYXNlLCBpbnQgbGVuLCBpbnQgbnVtLAotCQkJICAgIHZvaWQgKCpkZWNvZGUpKGNvbnN0IHN0cnVjdCBkbWlfaGVhZGVyICopKQorc3RhdGljIHZvaWQgZG1pX3RhYmxlKHU4ICpidWYsIGludCBsZW4sIGludCBudW0sCisJCSAgICAgIHZvaWQgKCpkZWNvZGUpKGNvbnN0IHN0cnVjdCBkbWlfaGVhZGVyICopKQogewotCXU4ICpidWYsICpkYXRhOworCXU4ICpkYXRhID0gYnVmOwogCWludCBpID0gMDsKIAotCWJ1ZiA9IGRtaV9pb3JlbWFwKGJhc2UsIGxlbik7Ci0JaWYgKGJ1ZiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0KLQlkYXRhID0gYnVmOwotCiAJLyoKIAkgKglTdG9wIHdoZW4gd2Ugc2VlIGFsbCB0aGUgaXRlbXMgdGhlIHRhYmxlIGNsYWltZWQgdG8gaGF2ZQogCSAqCU9SIHdlIHJ1biBvZmYgdGhlIGVuZCBvZiB0aGUgdGFibGUgKGFsc28gaGFwcGVucykKQEAgLTc1LDcgKzY5LDIzIEBACiAJCWRhdGEgKz0gMjsKIAkJaSsrOwogCX0KLQlkbWlfaW91bm1hcChidWYsIGxlbik7Cit9CisKK3N0YXRpYyB1MzIgZG1pX2Jhc2U7CitzdGF0aWMgdTE2IGRtaV9sZW47CitzdGF0aWMgdTE2IGRtaV9udW07CisKK3N0YXRpYyBpbnQgX19pbml0IGRtaV93YWxrX2Vhcmx5KHZvaWQgKCpkZWNvZGUpKGNvbnN0IHN0cnVjdCBkbWlfaGVhZGVyICopKQoreworCXU4ICpidWY7CisKKwlidWYgPSBkbWlfaW9yZW1hcChkbWlfYmFzZSwgZG1pX2xlbik7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlkbWlfdGFibGUoYnVmLCBkbWlfbGVuLCBkbWlfbnVtLCBkZWNvZGUpOworCisJZG1pX2lvdW5tYXAoYnVmLCBkbWlfbGVuKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQwLDYgKzI1MCwyOCBAQAogCWxpc3RfYWRkKCZkZXYtPmxpc3QsICZkbWlfZGV2aWNlcyk7CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBkbWlfc2F2ZV9leHRlbmRlZF9kZXZpY2VzKGNvbnN0IHN0cnVjdCBkbWlfaGVhZGVyICpkbSkKK3sKKwljb25zdCB1OCAqZCA9ICh1OCopIGRtICsgNTsKKwlzdHJ1Y3QgZG1pX2RldmljZSAqZGV2OworCisJLyogU2tpcCBkaXNhYmxlZCBkZXZpY2UgKi8KKwlpZiAoKCpkICYgMHg4MCkgPT0gMCkKKwkJcmV0dXJuOworCisJZGV2ID0gZG1pX2FsbG9jKHNpemVvZigqZGV2KSk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWlfc2F2ZV9leHRlbmRlZF9kZXZpY2VzOiBvdXQgb2YgbWVtb3J5LlxuIik7CisJCXJldHVybjsKKwl9CisKKwlkZXYtPnR5cGUgPSAqZC0tICYgMHg3ZjsKKwlkZXYtPm5hbWUgPSBkbWlfc3RyaW5nKGRtLCAqZCk7CisJZGV2LT5kZXZpY2VfZGF0YSA9IE5VTEw7CisKKwlsaXN0X2FkZCgmZGV2LT5saXN0LCAmZG1pX2RldmljZXMpOworfQorCiAvKgogICoJUHJvY2VzcyBhIERNSSB0YWJsZSBlbnRyeS4gUmlnaHQgbm93IGFsbCB3ZSBjYXJlIGFib3V0IGFyZSB0aGUgQklPUwogICoJYW5kIG1hY2hpbmUgZW50cmllcy4gRm9yIDIuNSB3ZSBzaG91bGQgcHVsbCB0aGUgc21idXMgY29udHJvbGxlciBpbmZvCkBAIC0yODIsNiArMzE0LDkgQEAKIAkJYnJlYWs7CiAJY2FzZSAzODoJLyogSVBNSSBEZXZpY2UgSW5mb3JtYXRpb24gKi8KIAkJZG1pX3NhdmVfaXBtaV9kZXZpY2UoZG0pOworCQlicmVhazsKKwljYXNlIDQxOgkvKiBPbmJvYXJkIERldmljZXMgRXh0ZW5kZWQgSW5mb3JtYXRpb24gKi8KKwkJZG1pX3NhdmVfZXh0ZW5kZWRfZGV2aWNlcyhkbSk7CiAJfQogfQogCkBAIC0yOTEsOSArMzI2LDkgQEAKIAogCW1lbWNweV9mcm9taW8oYnVmLCBwLCAxNSk7CiAJaWYgKChtZW1jbXAoYnVmLCAiX0RNSV8iLCA1KSA9PSAwKSAmJiBkbWlfY2hlY2tzdW0oYnVmKSkgewotCQl1MTYgbnVtID0gKGJ1ZlsxM10gPDwgOCkgfCBidWZbMTJdOwotCQl1MTYgbGVuID0gKGJ1Zls3XSA8PCA4KSB8IGJ1Zls2XTsKLQkJdTMyIGJhc2UgPSAoYnVmWzExXSA8PCAyNCkgfCAoYnVmWzEwXSA8PCAxNikgfAorCQlkbWlfbnVtID0gKGJ1ZlsxM10gPDwgOCkgfCBidWZbMTJdOworCQlkbWlfbGVuID0gKGJ1Zls3XSA8PCA4KSB8IGJ1Zls2XTsKKwkJZG1pX2Jhc2UgPSAoYnVmWzExXSA8PCAyNCkgfCAoYnVmWzEwXSA8PCAxNikgfAogCQkJKGJ1Zls5XSA8PCA4KSB8IGJ1Zls4XTsKIAogCQkvKgpAQCAtMzA1LDcgKzM0MCw3IEBACiAJCQkgICAgICAgYnVmWzE0XSA+PiA0LCBidWZbMTRdICYgMHhGKTsKIAkJZWxzZQogCQkJcHJpbnRrKEtFUk5fSU5GTyAiRE1JIHByZXNlbnQuXG4iKTsKLQkJaWYgKGRtaV90YWJsZShiYXNlLGxlbiwgbnVtLCBkbWlfZGVjb2RlKSA9PSAwKQorCQlpZiAoZG1pX3dhbGtfZWFybHkoZG1pX2RlY29kZSkgPT0gMCkKIAkJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gMTsKQEAgLTQ5MSwxMCArNTI2LDI1IEBACiB9CiAKIC8qKgotICoJZG1pX2dldF9zbG90IC0gcmV0dXJuIGRtaV9pZGVudFtzbG90XQotICoJQHNsb3Q6CWluZGV4IGludG8gZG1pX2lkZW50W10KKyAqCWRtaV93YWxrIC0gV2FsayB0aGUgRE1JIHRhYmxlIGFuZCBnZXQgY2FsbGVkIGJhY2sgZm9yIGV2ZXJ5IHJlY29yZAorICoJQGRlY29kZTogQ2FsbGJhY2sgZnVuY3Rpb24KKyAqCisgKglSZXR1cm5zIC0xIHdoZW4gdGhlIERNSSB0YWJsZSBjYW4ndCBiZSByZWFjaGVkLCAwIG9uIHN1Y2Nlc3MuCiAgKi8KLWNoYXIgKmRtaV9nZXRfc2xvdChpbnQgc2xvdCkKK2ludCBkbWlfd2Fsayh2b2lkICgqZGVjb2RlKShjb25zdCBzdHJ1Y3QgZG1pX2hlYWRlciAqKSkKIHsKLQlyZXR1cm4oZG1pX2lkZW50W3Nsb3RdKTsKKwl1OCAqYnVmOworCisJaWYgKCFkbWlfYXZhaWxhYmxlKQorCQlyZXR1cm4gLTE7CisKKwlidWYgPSBpb3JlbWFwKGRtaV9iYXNlLCBkbWlfbGVuKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWRtaV90YWJsZShidWYsIGRtaV9sZW4sIGRtaV9udW0sIGRlY29kZSk7CisKKwlpb3VubWFwKGJ1Zik7CisJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChkbWlfd2Fsayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL0tjb25maWcgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKaW5kZXggYTA0NDViZS4uNDEwZmZlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwpAQCAtNDMzLDEyICs0MzMsMTIgQEAKIAkgIHdpbGwgYmUgY2FsbGVkIGxtODUuCiAKIGNvbmZpZyBTRU5TT1JTX0xNODcKLQl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTg3IgorCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODcgYW5kIGNvbXBhdGlibGVzIgogCWRlcGVuZHMgb24gSTJDCiAJc2VsZWN0IEhXTU9OX1ZJRAogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODcKLQkgIHNlbnNvciBjaGlwcy4KKwkgIGFuZCBBbmFsb2cgRGV2aWNlcyBBRE0xMDI0IHNlbnNvciBjaGlwcy4KIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgbG04Ny4KQEAgLTU4OCw2ICs1ODgsMTYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHNtc2M0N2IzOTcuCiAKK2NvbmZpZyBTRU5TT1JTX0FEUzc4MjgKKwl0cmlzdGF0ZSAiVGV4YXMgSW5zdHJ1bWVudHMgQURTNzgyOCIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBUZXhhcyBJbnN0cnVtZW50cyBBRFM3ODI4CisJICAxMi1iaXQgOC1jaGFubmVsIEFEQyBkZXZpY2UuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGFkczc4MjguCisKIGNvbmZpZyBTRU5TT1JTX1RITUM1MAogCXRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBUSE1DNTAgLyBBbmFsb2cgRGV2aWNlcyBBRE0xMDIyIgogCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTApAQCAtNjMxLDEzICs2NDEsMTMgQEAKIAkgIHdpbGwgYmUgY2FsbGVkIHZ0ODIzMS4KIAogY29uZmlnIFNFTlNPUlNfVzgzNzgxRAotCXRyaXN0YXRlICJXaW5ib25kIFc4Mzc4MUQsIFc4Mzc4MkQsIFc4Mzc4M1MsIFc4MzYyN0hGLCBBc3VzIEFTOTkxMjdGIgorCXRyaXN0YXRlICJXaW5ib25kIFc4Mzc4MUQsIFc4Mzc4MkQsIFc4Mzc4M1MsIEFzdXMgQVM5OTEyN0YiCiAJZGVwZW5kcyBvbiBJMkMKIAlzZWxlY3QgSFdNT05fVklECiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBXaW5ib25kIFc4Mzc4eCBzZXJpZXMKLQkgIG9mIHNlbnNvciBjaGlwczogdGhlIFc4Mzc4MUQsIFc4Mzc4MkQsIFc4Mzc4M1MgYW5kIFc4MzYyN0hGLAotCSAgYW5kIHRoZSBzaW1pbGFyIEFzdXMgQVM5OTEyN0YuCisJICBvZiBzZW5zb3IgY2hpcHM6IHRoZSBXODM3ODFELCBXODM3ODJEIGFuZCBXODM3ODNTLCBhbmQgdGhlIHNpbWlsYXIKKwkgIEFzdXMgQVM5OTEyN0YuCiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHc4Mzc4MWQuCkBAIC02ODMsNiArNjkzLDE2IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCB3ODNsNzg1dHMuCiAKK2NvbmZpZyBTRU5TT1JTX1c4M0w3ODZORworCXRyaXN0YXRlICJXaW5ib25kIFc4M0w3ODZORywgVzgzTDc4Nk5SIgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgV2luYm9uZCBXODNMNzg2TkcKKwkgIGFuZCBXODNMNzg2TlIgc2Vuc29yIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCB3ODNsNzg2bmcuCisKIGNvbmZpZyBTRU5TT1JTX1c4MzYyN0hGCiAJdHJpc3RhdGUgIldpbmJvbmQgVzgzNjI3SEYsIFc4MzYyN1RIRiwgVzgzNjM3SEYsIFc4MzY4N1RIRiwgVzgzNjk3SEYiCiAJc2VsZWN0IEhXTU9OX1ZJRApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9NYWtlZmlsZSBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKaW5kZXggNTU1OTVmNi4uODI0MTYxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCkBAIC0yMiw2ICsyMiw3IEBACiBvYmotJChDT05GSUdfU0VOU09SU19BRE0xMDI5KQkrPSBhZG0xMDI5Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0FETTEwMzEpCSs9IGFkbTEwMzEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfQURNOTI0MCkJKz0gYWRtOTI0MC5vCitvYmotJChDT05GSUdfU0VOU09SU19BRFM3ODI4KQkrPSBhZHM3ODI4Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0FEVDc0NzApCSs9IGFkdDc0NzAubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfQVBQTEVTTUMpCSs9IGFwcGxlc21jLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0FNUykJKz0gYW1zLwpAQCAtNjgsNiArNjksNyBAQAogb2JqLSQoQ09ORklHX1NFTlNPUlNfVlQ4MjMxKQkrPSB2dDgyMzEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGKQkrPSB3ODM2MjdlaGYubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTKQkrPSB3ODNsNzg1dHMubworb2JqLSQoQ09ORklHX1NFTlNPUlNfVzgzTDc4Nk5HKQkrPSB3ODNsNzg2bmcubwogCiBpZmVxICgkKENPTkZJR19IV01PTl9ERUJVR19DSElQKSx5KQogRVhUUkFfQ0ZMQUdTICs9IC1EREVCVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYWJpdHVndXJ1My5jIGIvZHJpdmVycy9od21vbi9hYml0dWd1cnUzLmMKaW5kZXggZDlmMDRjZS4uZWQzM2ZkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hYml0dWd1cnUzLmMKKysrIGIvZHJpdmVycy9od21vbi9hYml0dWd1cnUzLmMKQEAgLTUyOCw2ICs1MjgsNyBAQAogCQl7ICJBVVgxIEZhbiIsCQkzMywgMiwgNjAsIDEsIDAgfSwKIAkJeyAiQVVYMiBGYW4iLAkJMzUsIDIsIDYwLCAxLCAwIH0sCiAJCXsgIkFVWDMgRmFuIiwJCTM2LCAyLCA2MCwgMSwgMCB9LAorCQl7ICJBVVg0IEZhbiIsCQkzNywgMiwgNjAsIDEsIDAgfSwKIAkJeyBOVUxMLCAwLCAwLCAwLCAwLCAwIH0gfQogCX0sCiAJeyAweDAwMUIsICJ1bmtub3duIiwgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZG0xMDIxLmMgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMjEuYwppbmRleCBlYmRjNmQ3Li5iOTZiZTc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkbTEwMjEuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMjEuYwpAQCAtMTE1LDcgKzExNSw2IEBACiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJPSAiYWRtMTAyMSIsCiAJfSwKLQkuaWQJCT0gSTJDX0RSSVZFUklEX0FETTEwMjEsCiAJLmF0dGFjaF9hZGFwdGVyCT0gYWRtMTAyMV9hdHRhY2hfYWRhcHRlciwKIAkuZGV0YWNoX2NsaWVudAk9IGFkbTEwMjFfZGV0YWNoX2NsaWVudCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FkbTEwMjUuYyBiL2RyaXZlcnMvaHdtb24vYWRtMTAyNS5jCmluZGV4IDA0MWVjYjAuLmU5NmMzNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWRtMTAyNS5jCisrKyBiL2RyaXZlcnMvaHdtb24vYWRtMTAyNS5jCkBAIC01MSw2ICs1MSw3IEBACiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9od21vbi12aWQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgpAQCAtNzQsNyArNzUsNyBAQAogICovCiAKICNkZWZpbmUgQURNMTAyNV9SRUdfTUFOX0lECQkweDNFCi0jZGVmaW5lIEFETTEwMjVfUkVHX0NISVBfSUQgCQkweDNGCisjZGVmaW5lIEFETTEwMjVfUkVHX0NISVBfSUQJCTB4M0YKICNkZWZpbmUgQURNMTAyNV9SRUdfQ09ORklHCQkweDQwCiAjZGVmaW5lIEFETTEwMjVfUkVHX1NUQVRVUzEJCTB4NDEKICNkZWZpbmUgQURNMTAyNV9SRUdfU1RBVFVTMgkJMHg0MgpAQCAtOTIsNyArOTMsNyBAQAogICogVGhlIEFETTEwMjUgdXNlcyBzaWduZWQgOC1iaXQgdmFsdWVzIGZvciB0ZW1wZXJhdHVyZXMuCiAgKi8KIAotc3RhdGljIGludCBpbl9zY2FsZVs2XSA9IHsgMjUwMCwgMjI1MCwgMzMwMCwgNTAwMCwgMTIwMDAsIDMzMDAgfTsKK3N0YXRpYyBjb25zdCBpbnQgaW5fc2NhbGVbNl0gPSB7IDI1MDAsIDIyNTAsIDMzMDAsIDUwMDAsIDEyMDAwLCAzMzAwIH07CiAKICNkZWZpbmUgSU5fRlJPTV9SRUcocmVnLHNjYWxlKQkoKChyZWcpICogKHNjYWxlKSArIDk2KSAvIDE5MikKICNkZWZpbmUgSU5fVE9fUkVHKHZhbCxzY2FsZSkJKCh2YWwpIDw9IDAgPyAwIDogXApAQCAtMTIyLDcgKzEyMyw2IEBACiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJPSAiYWRtMTAyNSIsCiAJfSwKLQkuaWQJCT0gSTJDX0RSSVZFUklEX0FETTEwMjUsCiAJLmF0dGFjaF9hZGFwdGVyCT0gYWRtMTAyNV9hdHRhY2hfYWRhcHRlciwKIAkuZGV0YWNoX2NsaWVudAk9IGFkbTEwMjVfZGV0YWNoX2NsaWVudCwKIH07CkBAIC0xNTMsODYgKzE1Myw5NiBAQAogICogU3lzZnMgc3R1ZmYKICAqLwogCi0jZGVmaW5lIHNob3dfaW4ob2Zmc2V0KSBcCi1zdGF0aWMgc3NpemVfdCBzaG93X2luIyNvZmZzZXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCi17IFwKLQlzdHJ1Y3QgYWRtMTAyNV9kYXRhICpkYXRhID0gYWRtMTAyNV91cGRhdGVfZGV2aWNlKGRldik7IFwKLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5bb2Zmc2V0XSwgXAotCQkgICAgICAgaW5fc2NhbGVbb2Zmc2V0XSkpOyBcCi19IFwKLXN0YXRpYyBzc2l6ZV90IHNob3dfaW4jI29mZnNldCMjX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIFwKLXsgXAotCXN0cnVjdCBhZG0xMDI1X2RhdGEgKmRhdGEgPSBhZG0xMDI1X3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbl9taW5bb2Zmc2V0XSwgXAotCQkgICAgICAgaW5fc2NhbGVbb2Zmc2V0XSkpOyBcCi19IFwKLXN0YXRpYyBzc2l6ZV90IHNob3dfaW4jI29mZnNldCMjX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIFwKLXsgXAotCXN0cnVjdCBhZG0xMDI1X2RhdGEgKmRhdGEgPSBhZG0xMDI1X3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbl9tYXhbb2Zmc2V0XSwgXAotCQkgICAgICAgaW5fc2NhbGVbb2Zmc2V0XSkpOyBcCi19IFwKLXN0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4jI29mZnNldCwgTlVMTCk7Ci1zaG93X2luKDApOwotc2hvd19pbigxKTsKLXNob3dfaW4oMik7Ci1zaG93X2luKDMpOwotc2hvd19pbig0KTsKLXNob3dfaW4oNSk7CitzdGF0aWMgc3NpemVfdAorc2hvd19pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwlzdHJ1Y3QgYWRtMTAyNV9kYXRhICpkYXRhID0gYWRtMTAyNV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluW2luZGV4XSwKKwkJICAgICAgIGluX3NjYWxlW2luZGV4XSkpOworfQogCi0jZGVmaW5lIHNob3dfdGVtcChvZmZzZXQpIFwKLXN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgXAoteyBcCi0Jc3RydWN0IGFkbTEwMjVfZGF0YSAqZGF0YSA9IGFkbTEwMjVfdXBkYXRlX2RldmljZShkZXYpOyBcCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcFtvZmZzZXQtMV0pKTsgXAotfSBcCi1zdGF0aWMgc3NpemVfdCBzaG93X3RlbXAjI29mZnNldCMjX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIFwKLXsgXAotCXN0cnVjdCBhZG0xMDI1X2RhdGEgKmRhdGEgPSBhZG0xMDI1X3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfbWluW29mZnNldC0xXSkpOyBcCi19IFwKLXN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjb2Zmc2V0IyNfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgXAoteyBcCi0Jc3RydWN0IGFkbTEwMjVfZGF0YSAqZGF0YSA9IGFkbTEwMjVfdXBkYXRlX2RldmljZShkZXYpOyBcCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9tYXhbb2Zmc2V0LTFdKSk7IFwKLX1cCi1zdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcCMjb2Zmc2V0LCBOVUxMKTsKLXNob3dfdGVtcCgxKTsKLXNob3dfdGVtcCgyKTsKK3N0YXRpYyBzc2l6ZV90CitzaG93X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwlzdHJ1Y3QgYWRtMTAyNV9kYXRhICpkYXRhID0gYWRtMTAyNV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21pbltpbmRleF0sCisJCSAgICAgICBpbl9zY2FsZVtpbmRleF0pKTsKK30KKworc3RhdGljIHNzaXplX3QKK3Nob3dfaW5fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXN0cnVjdCBhZG0xMDI1X2RhdGEgKmRhdGEgPSBhZG0xMDI1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5fbWF4W2luZGV4XSwKKwkJICAgICAgIGluX3NjYWxlW2luZGV4XSkpOworfQorCitzdGF0aWMgc3NpemVfdAorc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXN0cnVjdCBhZG0xMDI1X2RhdGEgKmRhdGEgPSBhZG0xMDI1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wW2luZGV4XSkpOworfQorCitzdGF0aWMgc3NpemVfdAorc2hvd190ZW1wX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwlzdHJ1Y3QgYWRtMTAyNV9kYXRhICpkYXRhID0gYWRtMTAyNV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9taW5baW5kZXhdKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzaG93X3RlbXBfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXN0cnVjdCBhZG0xMDI1X2RhdGEgKmRhdGEgPSBhZG0xMDI1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX21heFtpbmRleF0pKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMjVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5pbl9taW5baW5kZXhdID0gSU5fVE9fUkVHKHZhbCwgaW5fc2NhbGVbaW5kZXhdKTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURNMTAyNV9SRUdfSU5fTUlOKGluZGV4KSwKKwkJCQkgIGRhdGEtPmluX21pbltpbmRleF0pOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2luX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMjVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5pbl9tYXhbaW5kZXhdID0gSU5fVE9fUkVHKHZhbCwgaW5fc2NhbGVbaW5kZXhdKTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURNMTAyNV9SRUdfSU5fTUFYKGluZGV4KSwKKwkJCQkgIGRhdGEtPmluX21heFtpbmRleF0pOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KIAogI2RlZmluZSBzZXRfaW4ob2Zmc2V0KSBcCi1zdGF0aWMgc3NpemVfdCBzZXRfaW4jI29mZnNldCMjX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIFwKLQlzaXplX3QgY291bnQpIFwKLXsgXAotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKLQlzdHJ1Y3QgYWRtMTAyNV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKLQlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7IFwKLSBcCi0JbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOyBcCi0JZGF0YS0+aW5fbWluW29mZnNldF0gPSBJTl9UT19SRUcodmFsLCBpbl9zY2FsZVtvZmZzZXRdKTsgXAotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRE0xMDI1X1JFR19JTl9NSU4ob2Zmc2V0KSwgXAotCQkJCSAgZGF0YS0+aW5fbWluW29mZnNldF0pOyBcCi0JbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKLQlyZXR1cm4gY291bnQ7IFwKLX0gXAotc3RhdGljIHNzaXplX3Qgc2V0X2luIyNvZmZzZXQjI19tYXgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBcCi0Jc2l6ZV90IGNvdW50KSBcCi17IFwKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCi0Jc3RydWN0IGFkbTEwMjVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCi0JbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyBcCi0gXAotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAotCWRhdGEtPmluX21heFtvZmZzZXRdID0gSU5fVE9fUkVHKHZhbCwgaW5fc2NhbGVbb2Zmc2V0XSk7IFwKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURNMTAyNV9SRUdfSU5fTUFYKG9mZnNldCksIFwKLQkJCQkgIGRhdGEtPmluX21heFtvZmZzZXRdKTsgXAotCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOyBcCi0JcmV0dXJuIGNvdW50OyBcCi19IFwKLXN0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgXAotCXNob3dfaW4jI29mZnNldCMjX21pbiwgc2V0X2luIyNvZmZzZXQjI19taW4pOyBcCi1zdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21heCwgU19JV1VTUiB8IFNfSVJVR08sIFwKLQlzaG93X2luIyNvZmZzZXQjI19tYXgsIHNldF9pbiMjb2Zmc2V0IyNfbWF4KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBcCisJc2hvd19pbiwgTlVMTCwgb2Zmc2V0KTsgXAorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgXAorCXNob3dfaW5fbWluLCBzZXRfaW5fbWluLCBvZmZzZXQpOyBcCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluIyNvZmZzZXQjI19tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBcCisJc2hvd19pbl9tYXgsIHNldF9pbl9tYXgsIG9mZnNldCkKIHNldF9pbigwKTsKIHNldF9pbigxKTsKIHNldF9pbigyKTsKQEAgLTI0MCw2NSArMjUwLDkxIEBACiBzZXRfaW4oNCk7CiBzZXRfaW4oNSk7CiAKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgYWRtMTAyNV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfbWluW2luZGV4XSA9IFRFTVBfVE9fUkVHKHZhbCk7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFETTEwMjVfUkVHX1RFTVBfTE9XKGluZGV4KSwKKwkJCQkgIGRhdGEtPnRlbXBfbWluW2luZGV4XSk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkbTEwMjVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wX21heFtpbmRleF0gPSBURU1QX1RPX1JFRyh2YWwpOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRE0xMDI1X1JFR19URU1QX0hJR0goaW5kZXgpLAorCQkJCSAgZGF0YS0+dGVtcF9tYXhbaW5kZXhdKTsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKICNkZWZpbmUgc2V0X3RlbXAob2Zmc2V0KSBcCi1zdGF0aWMgc3NpemVfdCBzZXRfdGVtcCMjb2Zmc2V0IyNfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwgXAotCXNpemVfdCBjb3VudCkgXAoteyBcCi0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAotCXN0cnVjdCBhZG0xMDI1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAotCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsgXAotIFwKLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKLQlkYXRhLT50ZW1wX21pbltvZmZzZXQtMV0gPSBURU1QX1RPX1JFRyh2YWwpOyBcCi0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFETTEwMjVfUkVHX1RFTVBfTE9XKG9mZnNldC0xKSwgXAotCQkJCSAgZGF0YS0+dGVtcF9taW5bb2Zmc2V0LTFdKTsgXAotCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOyBcCi0JcmV0dXJuIGNvdW50OyBcCi19IFwKLXN0YXRpYyBzc2l6ZV90IHNldF90ZW1wIyNvZmZzZXQjI19tYXgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBcCi0Jc2l6ZV90IGNvdW50KSBcCi17IFwKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCi0Jc3RydWN0IGFkbTEwMjVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCi0JbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyBcCi0gXAotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAotCWRhdGEtPnRlbXBfbWF4W29mZnNldC0xXSA9IFRFTVBfVE9fUkVHKHZhbCk7IFwKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURNMTAyNV9SRUdfVEVNUF9ISUdIKG9mZnNldC0xKSwgXAotCQkJCSAgZGF0YS0+dGVtcF9tYXhbb2Zmc2V0LTFdKTsgXAotCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOyBcCi0JcmV0dXJuIGNvdW50OyBcCi19IFwKLXN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBcCi0Jc2hvd190ZW1wIyNvZmZzZXQjI19taW4sIHNldF90ZW1wIyNvZmZzZXQjI19taW4pOyBcCi1zdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgXAotCXNob3dfdGVtcCMjb2Zmc2V0IyNfbWF4LCBzZXRfdGVtcCMjb2Zmc2V0IyNfbWF4KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIFwKKwlzaG93X3RlbXAsIE5VTEwsIG9mZnNldCAtIDEpOyBcCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIFwKKwlzaG93X3RlbXBfbWluLCBzZXRfdGVtcF9taW4sIG9mZnNldCAtIDEpOyBcCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX21heCwgU19JV1VTUiB8IFNfSVJVR08sIFwKKwlzaG93X3RlbXBfbWF4LCBzZXRfdGVtcF9tYXgsIG9mZnNldCAtIDEpCiBzZXRfdGVtcCgxKTsKIHNldF90ZW1wKDIpOwogCi1zdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdAorc2hvd19hbGFybXMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBhZG0xMDI1X2RhdGEgKmRhdGEgPSBhZG0xMDI1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+YWxhcm1zKTsKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUihhbGFybXMsIFNfSVJVR08sIHNob3dfYWxhcm1zLCBOVUxMKTsKIAotc3RhdGljIHNzaXplX3Qgc2hvd192aWQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QKK3Nob3dfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCBiaXRuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJc3RydWN0IGFkbTEwMjVfZGF0YSAqZGF0YSA9IGFkbTEwMjVfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCAoZGF0YS0+YWxhcm1zID4+IGJpdG5yKSAmIDEpOworfQorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjBfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjFfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjNfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDMpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjRfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDgpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjVfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDkpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgNSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA0KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfZmF1bHQsIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDE0KTsKKworc3RhdGljIHNzaXplX3QKK3Nob3dfdmlkKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgYWRtMTAyNV9kYXRhICpkYXRhID0gYWRtMTAyNV91cGRhdGVfZGV2aWNlKGRldik7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZpZF9mcm9tX3JlZyhkYXRhLT52aWQsIGRhdGEtPnZybSkpOwogfQogc3RhdGljIERFVklDRV9BVFRSKGNwdTBfdmlkLCBTX0lSVUdPLCBzaG93X3ZpZCwgTlVMTCk7CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfdnJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90CitzaG93X3ZybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGFkbTEwMjVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT52cm0pOwogfQotc3RhdGljIHNzaXplX3Qgc2V0X3ZybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHNldF92cm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IGFkbTEwMjVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBhZG0xMDI1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlkYXRhLT52cm0gPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0zMTYsMjcgKzM1MiwzNSBAQAogfQogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRtMTAyNV9hdHRyaWJ1dGVzW10gPSB7Ci0JJmRldl9hdHRyX2luMF9pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl9pbjFfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfaW4yX2lucHV0LmF0dHIsCi0JJmRldl9hdHRyX2luM19pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl9pbjVfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfaW4wX21pbi5hdHRyLAotCSZkZXZfYXR0cl9pbjFfbWluLmF0dHIsCi0JJmRldl9hdHRyX2luMl9taW4uYXR0ciwKLQkmZGV2X2F0dHJfaW4zX21pbi5hdHRyLAotCSZkZXZfYXR0cl9pbjVfbWluLmF0dHIsCi0JJmRldl9hdHRyX2luMF9tYXguYXR0ciwKLQkmZGV2X2F0dHJfaW4xX21heC5hdHRyLAotCSZkZXZfYXR0cl9pbjJfbWF4LmF0dHIsCi0JJmRldl9hdHRyX2luM19tYXguYXR0ciwKLQkmZGV2X2F0dHJfaW41X21heC5hdHRyLAotCSZkZXZfYXR0cl90ZW1wMV9pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl90ZW1wMl9pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl90ZW1wMV9taW4uYXR0ciwKLQkmZGV2X2F0dHJfdGVtcDJfbWluLmF0dHIsCi0JJmRldl9hdHRyX3RlbXAxX21heC5hdHRyLAotCSZkZXZfYXR0cl90ZW1wMl9tYXguYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMF9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luM19pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW41X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjBfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjNfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjVfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjBfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjNfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjVfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjBfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4yX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjNfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNV9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfZmF1bHQuZGV2X2F0dHIuYXR0ciwKIAkmZGV2X2F0dHJfYWxhcm1zLmF0dHIsCiAJJmRldl9hdHRyX2NwdTBfdmlkLmF0dHIsCiAJJmRldl9hdHRyX3ZybS5hdHRyLApAQCAtMzQ3LDE1ICszOTEsMTYgQEAKIAkuYXR0cnMgPSBhZG0xMDI1X2F0dHJpYnV0ZXMsCiB9OwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRtMTAyNV9hdHRyaWJ1dGVzX29wdFtdID0gewotCSZkZXZfYXR0cl9pbjRfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfaW40X21pbi5hdHRyLAotCSZkZXZfYXR0cl9pbjRfbWF4LmF0dHIsCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRtMTAyNV9hdHRyaWJ1dGVzX2luNFtdID0geworCSZzZW5zb3JfZGV2X2F0dHJfaW40X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjRfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjRfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjRfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAlOVUxMCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZG0xMDI1X2dyb3VwX29wdCA9IHsKLQkuYXR0cnMgPSBhZG0xMDI1X2F0dHJpYnV0ZXNfb3B0LAorc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRtMTAyNV9ncm91cF9pbjQgPSB7CisJLmF0dHJzID0gYWRtMTAyNV9hdHRyaWJ1dGVzX2luNCwKIH07CiAKIC8qCkBAIC0zNjQsNyArNDA5LDcgQEAKICAqLwogc3RhdGljIGludCBhZG0xMDI1X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCBhZG0xMDI1X2RhdGEgKmRhdGE7CiAJaW50IGVyciA9IDA7CiAJY29uc3QgY2hhciAqbmFtZSA9ICIiOwpAQCAtMzc4LDE0ICs0MjMsMTEgQEAKIAkJZ290byBleGl0OwogCX0KIAotCS8qIFRoZSBjb21tb24gSTJDIGNsaWVudCBkYXRhIGlzIHBsYWNlZCByaWdodCBiZWZvcmUgdGhlCi0JICAgQURNMTAyNS1zcGVjaWZpYyBkYXRhLiAqLwotCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OwotCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKLQluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKLQluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKLQluZXdfY2xpZW50LT5kcml2ZXIgPSAmYWRtMTAyNV9kcml2ZXI7Ci0JbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCWNsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGF0YSk7CisJY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwljbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCWNsaWVudC0+ZHJpdmVyID0gJmFkbTEwMjVfZHJpdmVyOwogCiAJLyoKIAkgKiBOb3cgd2UgZG8gdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24uIEEgbmVnYXRpdmUga2luZCBtZWFucyB0aGF0CkBAIC0zOTcsMTIgKzQzOSwxMiBAQAogCSAqIHJlcXVlc3RlZCwgc28gYm90aCB0aGUgZGV0ZWN0aW9uIGFuZCB0aGUgaWRlbnRpZmljYXRpb24gc3RlcHMKIAkgKiBhcmUgc2tpcHBlZC4KIAkgKi8KLQljb25maWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgQURNMTAyNV9SRUdfQ09ORklHKTsKKwljb25maWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRE0xMDI1X1JFR19DT05GSUcpOwogCWlmIChraW5kIDwgMCkgeyAvKiBkZXRlY3Rpb24gKi8KIAkJaWYgKChjb25maWcgJiAweDgwKSAhPSAweDAwCi0JCSB8fCAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCisJCSB8fCAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKIAkJICAgICBBRE0xMDI1X1JFR19TVEFUVVMxKSAmIDB4QzApICE9IDB4MDAKLQkJIHx8IChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKKwkJIHx8IChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAogCQkgICAgIEFETTEwMjVfUkVHX1NUQVRVUzIpICYgMHhCQykgIT0gMHgwMCkgewogCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LAogCQkJCSJBRE0xMDI1IGRldGVjdGlvbiBmYWlsZWQgYXQgMHglMDJ4LlxuIiwKQEAgLTQxNCwxMSArNDU2LDkgQEAKIAlpZiAoa2luZCA8PSAwKSB7IC8qIGlkZW50aWZpY2F0aW9uICovCiAJCXU4IG1hbl9pZCwgY2hpcF9pZDsKIAotCQltYW5faWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKLQkJCSBBRE0xMDI1X1JFR19NQU5fSUQpOwotCQljaGlwX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCi0JCQkgIEFETTEwMjVfUkVHX0NISVBfSUQpOwotCQkKKwkJbWFuX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURNMTAyNV9SRUdfTUFOX0lEKTsKKwkJY2hpcF9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFETTEwMjVfUkVHX0NISVBfSUQpOworCiAJCWlmIChtYW5faWQgPT0gMHg0MSkgeyAvKiBBbmFsb2cgRGV2aWNlcyAqLwogCQkJaWYgKChjaGlwX2lkICYgMHhGMCkgPT0gMHgyMCkgeyAvKiBBRE0xMDI1L0FETTEwMjVBICovCiAJCQkJa2luZCA9IGFkbTEwMjU7CkBAIC00NDYsMzMgKzQ4NiwyOCBAQAogCX0KIAogCS8qIFdlIGNhbiBmaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcyAqLwotCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgbmFtZSwgSTJDX05BTUVfU0laRSk7Ci0JZGF0YS0+dmFsaWQgPSAwOworCXN0cmxjcHkoY2xpZW50LT5uYW1lLCBuYW1lLCBJMkNfTkFNRV9TSVpFKTsKIAltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCi0JaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpKSkKIAkJZ290byBleGl0X2ZyZWU7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBBRE0xMDI1IGNoaXAgKi8KLQlhZG0xMDI1X2luaXRfY2xpZW50KG5ld19jbGllbnQpOworCWFkbTEwMjVfaW5pdF9jbGllbnQoY2xpZW50KTsKIAogCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCi0JaWYgKChlcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJm5ld19jbGllbnQtPmRldi5rb2JqLCAmYWRtMTAyNV9ncm91cCkpKQorCWlmICgoZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmYWRtMTAyNV9ncm91cCkpKQogCQlnb3RvIGV4aXRfZGV0YWNoOwogCiAJLyogUGluIDExIGlzIGVpdGhlciBpbjQgKCsxMlYpIG9yIFZJRDQgKi8KIAlpZiAoIShjb25maWcgJiAweDIwKSkgewotCQlpZiAoKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAotCQkJCQkmZGV2X2F0dHJfaW40X2lucHV0KSkKLQkJIHx8IChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKLQkJCQkJJmRldl9hdHRyX2luNF9taW4pKQotCQkgfHwgKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAotCQkJCQkmZGV2X2F0dHJfaW40X21heCkpKQorCQlpZiAoKGVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwKKwkJCQkJICAgICAgJmFkbTEwMjVfZ3JvdXBfaW40KSkpCiAJCQlnb3RvIGV4aXRfcmVtb3ZlOwogCX0KIAotCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmbmV3X2NsaWVudC0+ZGV2KTsKKwlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKIAlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKIAkJZXJyID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOwogCQlnb3RvIGV4aXRfcmVtb3ZlOwpAQCAtNDgxLDEwICs1MTYsMTAgQEAKIAlyZXR1cm4gMDsKIAogZXhpdF9yZW1vdmU6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZuZXdfY2xpZW50LT5kZXYua29iaiwgJmFkbTEwMjVfZ3JvdXApOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmbmV3X2NsaWVudC0+ZGV2LmtvYmosICZhZG0xMDI1X2dyb3VwX29wdCk7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmYWRtMTAyNV9ncm91cCk7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmYWRtMTAyNV9ncm91cF9pbjQpOwogZXhpdF9kZXRhY2g6Ci0JaTJjX2RldGFjaF9jbGllbnQobmV3X2NsaWVudCk7CisJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKIGV4aXRfZnJlZToKIAlrZnJlZShkYXRhKTsKIGV4aXQ6CkBAIC01NDAsNyArNTc1LDcgQEAKIAogCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7CiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmYWRtMTAyNV9ncm91cCk7Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmYWRtMTAyNV9ncm91cF9vcHQpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmFkbTEwMjVfZ3JvdXBfaW40KTsKIAogCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpCiAJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FkbTEwMjYuYyBiL2RyaXZlcnMvaHdtb24vYWRtMTAyNi5jCmluZGV4IDNlNjNjMTQuLjgwMDJmNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWRtMTAyNi5jCisrKyBiL2RyaXZlcnMvaHdtb24vYWRtMTAyNi5jCkBAIC00MCw4ICs0MCw4IEBACiAvKiBJbnNtb2QgcGFyYW1ldGVycyAqLwogSTJDX0NMSUVOVF9JTlNNT0RfMShhZG0xMDI2KTsKIAotc3RhdGljIGludCBncGlvX2lucHV0WzE3XSAgPSB7IC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0JCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH07IAorc3RhdGljIGludCBncGlvX2lucHV0WzE3XSA9IHsgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwkJCQktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfTsKIHN0YXRpYyBpbnQgZ3Bpb19vdXRwdXRbMTddID0geyAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAogCQkJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9Owogc3RhdGljIGludCBncGlvX2ludmVydGVkWzE3XSA9IHsgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKQEAgLTQ5LDQ2ICs0OSw0OSBAQAogc3RhdGljIGludCBncGlvX25vcm1hbFsxN10gPSB7IC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCiAJCQkJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH07CiBzdGF0aWMgaW50IGdwaW9fZmFuWzhdID0geyAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfTsKLW1vZHVsZV9wYXJhbV9hcnJheShncGlvX2lucHV0LGludCxOVUxMLDApOwotTU9EVUxFX1BBUk1fREVTQyhncGlvX2lucHV0LCJMaXN0IG9mIEdQSU8gcGlucyAoMC0xNikgdG8gcHJvZ3JhbSBhcyBpbnB1dHMiKTsKLW1vZHVsZV9wYXJhbV9hcnJheShncGlvX291dHB1dCxpbnQsTlVMTCwwKTsKLU1PRFVMRV9QQVJNX0RFU0MoZ3Bpb19vdXRwdXQsIkxpc3Qgb2YgR1BJTyBwaW5zICgwLTE2KSB0byBwcm9ncmFtIGFzICIKK21vZHVsZV9wYXJhbV9hcnJheShncGlvX2lucHV0LCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhncGlvX2lucHV0LCAiTGlzdCBvZiBHUElPIHBpbnMgKDAtMTYpIHRvIHByb2dyYW0gYXMgaW5wdXRzIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZ3Bpb19vdXRwdXQsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGdwaW9fb3V0cHV0LCAiTGlzdCBvZiBHUElPIHBpbnMgKDAtMTYpIHRvIHByb2dyYW0gYXMgIgogCSJvdXRwdXRzIik7Ci1tb2R1bGVfcGFyYW1fYXJyYXkoZ3Bpb19pbnZlcnRlZCxpbnQsTlVMTCwwKTsKLU1PRFVMRV9QQVJNX0RFU0MoZ3Bpb19pbnZlcnRlZCwiTGlzdCBvZiBHUElPIHBpbnMgKDAtMTYpIHRvIHByb2dyYW0gYXMgIgorbW9kdWxlX3BhcmFtX2FycmF5KGdwaW9faW52ZXJ0ZWQsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGdwaW9faW52ZXJ0ZWQsICJMaXN0IG9mIEdQSU8gcGlucyAoMC0xNikgdG8gcHJvZ3JhbSBhcyAiCiAJImludmVydGVkIik7Ci1tb2R1bGVfcGFyYW1fYXJyYXkoZ3Bpb19ub3JtYWwsaW50LE5VTEwsMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGdwaW9fbm9ybWFsLCJMaXN0IG9mIEdQSU8gcGlucyAoMC0xNikgdG8gcHJvZ3JhbSBhcyAiCittb2R1bGVfcGFyYW1fYXJyYXkoZ3Bpb19ub3JtYWwsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGdwaW9fbm9ybWFsLCAiTGlzdCBvZiBHUElPIHBpbnMgKDAtMTYpIHRvIHByb2dyYW0gYXMgIgogCSJub3JtYWwvbm9uLWludmVydGVkIik7Ci1tb2R1bGVfcGFyYW1fYXJyYXkoZ3Bpb19mYW4saW50LE5VTEwsMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGdwaW9fZmFuLCJMaXN0IG9mIEdQSU8gcGlucyAoMC03KSB0byBwcm9ncmFtIGFzIGZhbiB0YWNocyIpOworbW9kdWxlX3BhcmFtX2FycmF5KGdwaW9fZmFuLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhncGlvX2ZhbiwgIkxpc3Qgb2YgR1BJTyBwaW5zICgwLTcpIHRvIHByb2dyYW0gYXMgZmFuIHRhY2hzIik7CiAKIC8qIE1hbnkgQURNMTAyNiBjb25zdGFudHMgc3BlY2lmaWVkIGJlbG93ICovCiAKIC8qIFRoZSBBRE0xMDI2IHJlZ2lzdGVycyAqLwotI2RlZmluZSBBRE0xMDI2X1JFR19DT05GSUcxICAweDAwCi0jZGVmaW5lIENGRzFfTU9OSVRPUiAgICAgMHgwMQotI2RlZmluZSBDRkcxX0lOVF9FTkFCTEUgIDB4MDIKLSNkZWZpbmUgQ0ZHMV9JTlRfQ0xFQVIgICAweDA0Ci0jZGVmaW5lIENGRzFfQUlOOF85ICAgICAgMHgwOAotI2RlZmluZSBDRkcxX1RIRVJNX0hPVCAgIDB4MTAKLSNkZWZpbmUgQ0ZHMV9EQUNfQUZDICAgICAweDIwCi0jZGVmaW5lIENGRzFfUFdNX0FGQyAgICAgMHg0MAotI2RlZmluZSBDRkcxX1JFU0VUICAgICAgIDB4ODAKLSNkZWZpbmUgQURNMTAyNl9SRUdfQ09ORklHMiAgMHgwMQorI2RlZmluZSBBRE0xMDI2X1JFR19DT05GSUcxCTB4MDAKKyNkZWZpbmUgQ0ZHMV9NT05JVE9SCQkweDAxCisjZGVmaW5lIENGRzFfSU5UX0VOQUJMRQkJMHgwMgorI2RlZmluZSBDRkcxX0lOVF9DTEVBUgkJMHgwNAorI2RlZmluZSBDRkcxX0FJTjhfOQkJMHgwOAorI2RlZmluZSBDRkcxX1RIRVJNX0hPVAkJMHgxMAorI2RlZmluZSBDRkcxX0RBQ19BRkMJCTB4MjAKKyNkZWZpbmUgQ0ZHMV9QV01fQUZDCQkweDQwCisjZGVmaW5lIENGRzFfUkVTRVQJCTB4ODAKKworI2RlZmluZSBBRE0xMDI2X1JFR19DT05GSUcyCTB4MDEKIC8qIENPTkZJRzIgY29udHJvbHMgRkFOMC9HUElPMCB0aHJvdWdoIEZBTjcvR1BJTzcgKi8KLSNkZWZpbmUgQURNMTAyNl9SRUdfQ09ORklHMyAgMHgwNwotI2RlZmluZSBDRkczX0dQSU8xNl9FTkFCTEUgIDB4MDEKLSNkZWZpbmUgQ0ZHM19DSV9DTEVBUiAgMHgwMgotI2RlZmluZSBDRkczX1ZSRUZfMjUwICAweDA0Ci0jZGVmaW5lIENGRzNfR1BJTzE2X0RJUiAgMHg0MAotI2RlZmluZSBDRkczX0dQSU8xNl9QT0wgIDB4ODAKLSNkZWZpbmUgQURNMTAyNl9SRUdfRTJDT05GSUcgIDB4MTMKLSNkZWZpbmUgRTJDRkdfUkVBRCAgMHgwMQotI2RlZmluZSBFMkNGR19XUklURSAgMHgwMgotI2RlZmluZSBFMkNGR19FUkFTRSAgMHgwNAotI2RlZmluZSBFMkNGR19ST00gIDB4MDgKLSNkZWZpbmUgRTJDRkdfQ0xLX0VYVCAgMHg4MAorCisjZGVmaW5lIEFETTEwMjZfUkVHX0NPTkZJRzMJMHgwNworI2RlZmluZSBDRkczX0dQSU8xNl9FTkFCTEUJMHgwMQorI2RlZmluZSBDRkczX0NJX0NMRUFSCQkweDAyCisjZGVmaW5lIENGRzNfVlJFRl8yNTAJCTB4MDQKKyNkZWZpbmUgQ0ZHM19HUElPMTZfRElSCQkweDQwCisjZGVmaW5lIENGRzNfR1BJTzE2X1BPTAkJMHg4MAorCisjZGVmaW5lIEFETTEwMjZfUkVHX0UyQ09ORklHCTB4MTMKKyNkZWZpbmUgRTJDRkdfUkVBRAkJMHgwMQorI2RlZmluZSBFMkNGR19XUklURQkJMHgwMgorI2RlZmluZSBFMkNGR19FUkFTRQkJMHgwNAorI2RlZmluZSBFMkNGR19ST00JCTB4MDgKKyNkZWZpbmUgRTJDRkdfQ0xLX0VYVAkJMHg4MAogCiAvKiBUaGVyZSBhcmUgMTAgZ2VuZXJhbCBhbmFsb2cgaW5wdXRzIGFuZCA3IGRlZGljYXRlZCBpbnB1dHMKICAqIFRoZXkgYXJlOgpAQCAtMTI5LDQ4ICsxMzIsNDggQEAKIHN0YXRpYyB1MTYgQURNMTAyNl9SRUdfVEVNUF9USEVSTVtdID0geyAweDBkLCAweDBlLCAweDBmIH07CiBzdGF0aWMgdTE2IEFETTEwMjZfUkVHX1RFTVBfT0ZGU0VUW10gPSB7IDB4MWUsIDB4NmUsIDB4NmYgfTsKIAotI2RlZmluZSBBRE0xMDI2X1JFR19GQU4obnIpICgweDM4ICsgKG5yKSkKLSNkZWZpbmUgQURNMTAyNl9SRUdfRkFOX01JTihucikgKDB4NjAgKyAobnIpKQotI2RlZmluZSBBRE0xMDI2X1JFR19GQU5fRElWXzBfMyAweDAyCi0jZGVmaW5lIEFETTEwMjZfUkVHX0ZBTl9ESVZfNF83IDB4MDMKKyNkZWZpbmUgQURNMTAyNl9SRUdfRkFOKG5yKQkJKDB4MzggKyAobnIpKQorI2RlZmluZSBBRE0xMDI2X1JFR19GQU5fTUlOKG5yKQkJKDB4NjAgKyAobnIpKQorI2RlZmluZSBBRE0xMDI2X1JFR19GQU5fRElWXzBfMwkJMHgwMgorI2RlZmluZSBBRE0xMDI2X1JFR19GQU5fRElWXzRfNwkJMHgwMwogCi0jZGVmaW5lIEFETTEwMjZfUkVHX0RBQyAgMHgwNAotI2RlZmluZSBBRE0xMDI2X1JFR19QV00gIDB4MDUKKyNkZWZpbmUgQURNMTAyNl9SRUdfREFDCQkJMHgwNAorI2RlZmluZSBBRE0xMDI2X1JFR19QV00JCQkweDA1CiAKLSNkZWZpbmUgQURNMTAyNl9SRUdfR1BJT19DRkdfMF8zIDB4MDgKLSNkZWZpbmUgQURNMTAyNl9SRUdfR1BJT19DRkdfNF83IDB4MDkKLSNkZWZpbmUgQURNMTAyNl9SRUdfR1BJT19DRkdfOF8xMSAweDBhCi0jZGVmaW5lIEFETTEwMjZfUkVHX0dQSU9fQ0ZHXzEyXzE1IDB4MGIKKyNkZWZpbmUgQURNMTAyNl9SRUdfR1BJT19DRkdfMF8zCTB4MDgKKyNkZWZpbmUgQURNMTAyNl9SRUdfR1BJT19DRkdfNF83CTB4MDkKKyNkZWZpbmUgQURNMTAyNl9SRUdfR1BJT19DRkdfOF8xMQkweDBhCisjZGVmaW5lIEFETTEwMjZfUkVHX0dQSU9fQ0ZHXzEyXzE1CTB4MGIKIC8qIENGR18xNiBpbiBSRUdfQ0ZHMyAqLwotI2RlZmluZSBBRE0xMDI2X1JFR19HUElPX1NUQVRVU18wXzcgMHgyNAotI2RlZmluZSBBRE0xMDI2X1JFR19HUElPX1NUQVRVU184XzE1IDB4MjUKKyNkZWZpbmUgQURNMTAyNl9SRUdfR1BJT19TVEFUVVNfMF83CTB4MjQKKyNkZWZpbmUgQURNMTAyNl9SRUdfR1BJT19TVEFUVVNfOF8xNQkweDI1CiAvKiBTVEFUVVNfMTYgaW4gUkVHX1NUQVRVUzQgKi8KLSNkZWZpbmUgQURNMTAyNl9SRUdfR1BJT19NQVNLXzBfNyAweDFjCi0jZGVmaW5lIEFETTEwMjZfUkVHX0dQSU9fTUFTS184XzE1IDB4MWQKKyNkZWZpbmUgQURNMTAyNl9SRUdfR1BJT19NQVNLXzBfNwkweDFjCisjZGVmaW5lIEFETTEwMjZfUkVHX0dQSU9fTUFTS184XzE1CTB4MWQKIC8qIE1BU0tfMTYgaW4gUkVHX01BU0s0ICovCiAKLSNkZWZpbmUgQURNMTAyNl9SRUdfQ09NUEFOWSAweDE2Ci0jZGVmaW5lIEFETTEwMjZfUkVHX1ZFUlNURVAgMHgxNworI2RlZmluZSBBRE0xMDI2X1JFR19DT01QQU5ZCQkweDE2CisjZGVmaW5lIEFETTEwMjZfUkVHX1ZFUlNURVAJCTB4MTcKIC8qIFRoZXNlIGFyZSB0aGUgcmVjb2duaXplZCB2YWx1ZXMgZm9yIHRoZSBhYm92ZSByZWdzICovCi0jZGVmaW5lIEFETTEwMjZfQ09NUEFOWV9BTkFMT0dfREVWIDB4NDEKLSNkZWZpbmUgQURNMTAyNl9WRVJTVEVQX0dFTkVSSUMgMHg0MAotI2RlZmluZSBBRE0xMDI2X1ZFUlNURVBfQURNMTAyNiAweDQ0CisjZGVmaW5lIEFETTEwMjZfQ09NUEFOWV9BTkFMT0dfREVWCTB4NDEKKyNkZWZpbmUgQURNMTAyNl9WRVJTVEVQX0dFTkVSSUMJCTB4NDAKKyNkZWZpbmUgQURNMTAyNl9WRVJTVEVQX0FETTEwMjYJCTB4NDQKIAotI2RlZmluZSBBRE0xMDI2X1JFR19NQVNLMSAweDE4Ci0jZGVmaW5lIEFETTEwMjZfUkVHX01BU0syIDB4MTkKLSNkZWZpbmUgQURNMTAyNl9SRUdfTUFTSzMgMHgxYQotI2RlZmluZSBBRE0xMDI2X1JFR19NQVNLNCAweDFiCisjZGVmaW5lIEFETTEwMjZfUkVHX01BU0sxCQkweDE4CisjZGVmaW5lIEFETTEwMjZfUkVHX01BU0syCQkweDE5CisjZGVmaW5lIEFETTEwMjZfUkVHX01BU0szCQkweDFhCisjZGVmaW5lIEFETTEwMjZfUkVHX01BU0s0CQkweDFiCiAKLSNkZWZpbmUgQURNMTAyNl9SRUdfU1RBVFVTMSAweDIwCi0jZGVmaW5lIEFETTEwMjZfUkVHX1NUQVRVUzIgMHgyMQotI2RlZmluZSBBRE0xMDI2X1JFR19TVEFUVVMzIDB4MjIKLSNkZWZpbmUgQURNMTAyNl9SRUdfU1RBVFVTNCAweDIzCisjZGVmaW5lIEFETTEwMjZfUkVHX1NUQVRVUzEJCTB4MjAKKyNkZWZpbmUgQURNMTAyNl9SRUdfU1RBVFVTMgkJMHgyMQorI2RlZmluZSBBRE0xMDI2X1JFR19TVEFUVVMzCQkweDIyCisjZGVmaW5lIEFETTEwMjZfUkVHX1NUQVRVUzQJCTB4MjMKIAogI2RlZmluZSBBRE0xMDI2X0ZBTl9BQ1RJVkFUSU9OX1RFTVBfSFlTVCAtNgotI2RlZmluZSBBRE0xMDI2X0ZBTl9DT05UUk9MX1RFTVBfUkFOR0UgMjAKLSNkZWZpbmUgQURNMTAyNl9QV01fTUFYIDI1NQorI2RlZmluZSBBRE0xMDI2X0ZBTl9DT05UUk9MX1RFTVBfUkFOR0UJMjAKKyNkZWZpbmUgQURNMTAyNl9QV01fTUFYCQkJMjU1CiAKLS8qIENvbnZlcnNpb25zLiBSb3VuZGluZyBhbmQgbGltaXQgY2hlY2tpbmcgaXMgb25seSBkb25lIG9uIHRoZSBUT19SRUcgCisvKiBDb252ZXJzaW9ucy4gUm91bmRpbmcgYW5kIGxpbWl0IGNoZWNraW5nIGlzIG9ubHkgZG9uZSBvbiB0aGUgVE9fUkVHCiAgKiB2YXJpYW50cy4gTm90ZSB0aGF0IHlvdSBzaG91bGQgYmUgYSBiaXQgY2FyZWZ1bCB3aXRoIHdoaWNoIGFyZ3VtZW50cwogICogdGhlc2UgbWFjcm9zIGFyZSBjYWxsZWQ6IGFyZ3VtZW50cyBtYXkgYmUgZXZhbHVhdGVkIG1vcmUgdGhhbiBvbmNlLgogICovCkBAIC0xODYsNTIgKzE4OSw0OSBAQAogICogVGhlIHZhbHVlcyBpbiB0aGlzIHRhYmxlIGFyZSBiYXNlZCBvbiBUYWJsZSBJSSwgcGFnZSAxNSBvZiB0aGUKICAqICAgIGRhdGFzaGVldC4KICAqLwotc3RhdGljIGludCBhZG0xMDI2X3NjYWxpbmdbXSA9IHsgIC8qIC4wMDEgVm9sdHMgKi8KLQkJMjI1MCwgMjI1MCwgMjI1MCwgMjI1MCwgMjI1MCwgMjI1MCwgCi0JCTE4NzUsIDE4NzUsIDE4NzUsIDE4NzUsIDMwMDAsIDMzMzAsIAorc3RhdGljIGludCBhZG0xMDI2X3NjYWxpbmdbXSA9IHsgLyogLjAwMSBWb2x0cyAqLworCQkyMjUwLCAyMjUwLCAyMjUwLCAyMjUwLCAyMjUwLCAyMjUwLAorCQkxODc1LCAxODc1LCAxODc1LCAxODc1LCAzMDAwLCAzMzMwLAogCQkzMzMwLCA0OTk1LCAyMjUwLCAxMjAwMCwgMTM4NzUKIAl9OwogI2RlZmluZSBORUcxMl9PRkZTRVQgIDE2MDAwCi0jZGVmaW5lIFNDQUxFKHZhbCxmcm9tLHRvKSAoKCh2YWwpKih0bykgKyAoKGZyb20pLzIpKS8oZnJvbSkpCi0jZGVmaW5lIElOU19UT19SRUcobix2YWwpICAoU0VOU09SU19MSU1JVChTQ0FMRSh2YWwsYWRtMTAyNl9zY2FsaW5nW25dLDE5MiksXAotCTAsMjU1KSkKLSNkZWZpbmUgSU5TX0ZST01fUkVHKG4sdmFsKSAoU0NBTEUodmFsLDE5MixhZG0xMDI2X3NjYWxpbmdbbl0pKQorI2RlZmluZSBTQ0FMRSh2YWwsIGZyb20sIHRvKSAoKCh2YWwpKih0bykgKyAoKGZyb20pLzIpKS8oZnJvbSkpCisjZGVmaW5lIElOU19UT19SRUcobiwgdmFsKSAgKFNFTlNPUlNfTElNSVQoU0NBTEUodmFsLCBhZG0xMDI2X3NjYWxpbmdbbl0sIDE5MiksXAorCTAsIDI1NSkpCisjZGVmaW5lIElOU19GUk9NX1JFRyhuLCB2YWwpIChTQ0FMRSh2YWwsIDE5MiwgYWRtMTAyNl9zY2FsaW5nW25dKSkKIAogLyogRkFOIHNwZWVkIGlzIG1lYXN1cmVkIHVzaW5nIDIyLjVrSHogY2xvY2sgYW5kIGNvdW50cyBmb3IgMiBwdWxzZXMKICAqICAgYW5kIHdlIGFzc3VtZSBhIDIgcHVsc2UtcGVyLXJldiBmYW4gdGFjaCBzaWduYWwKICAqICAgICAgMjI1MDAga0h6ICogNjAgKHNlYy9taW4pICogMiAocHVsc2UpIC8gMiAocHVsc2UvcmV2KSA9PSAxMzUwMDAwCiAgKi8KLSNkZWZpbmUgRkFOX1RPX1JFRyh2YWwsZGl2KSAgKCh2YWwpPD0wID8gMHhmZiA6IFNFTlNPUlNfTElNSVQoMTM1MDAwMC8oKHZhbCkqXAotCShkaXYpKSwxLDI1NCkpIAotI2RlZmluZSBGQU5fRlJPTV9SRUcodmFsLGRpdikgKCh2YWwpPT0wPy0xOih2YWwpPT0weGZmID8gMCA6IDEzNTAwMDAvKCh2YWwpKlwKLQkoZGl2KSkpCisjZGVmaW5lIEZBTl9UT19SRUcodmFsLCBkaXYpICAoKHZhbCkgPD0gMCA/IDB4ZmYgOiBcCisJCQkJU0VOU09SU19MSU1JVCgxMzUwMDAwLygodmFsKSooZGl2KSksIDEsIDI1NCkpCisjZGVmaW5lIEZBTl9GUk9NX1JFRyh2YWwsIGRpdikgKCh2YWwpID09IDAgPyAtMToodmFsKSA9PSAweGZmID8gMCA6IFwKKwkJCQkxMzUwMDAwLygodmFsKSooZGl2KSkpCiAjZGVmaW5lIERJVl9GUk9NX1JFRyh2YWwpICgxPDwodmFsKSkKLSNkZWZpbmUgRElWX1RPX1JFRyh2YWwpICgodmFsKT49OCA/IDMgOiAodmFsKT49NCA/IDIgOiAodmFsKT49MiA/IDEgOiAwKQorI2RlZmluZSBESVZfVE9fUkVHKHZhbCkgKCh2YWwpID49IDggPyAzIDogKHZhbCkgPj0gNCA/IDIgOiAodmFsKSA+PSAyID8gMSA6IDApCiAKIC8qIFRlbXBlcmF0dXJlIGlzIHJlcG9ydGVkIGluIDEgZGVnQyBpbmNyZW1lbnRzICovCiAjZGVmaW5lIFRFTVBfVE9fUkVHKHZhbCkgKFNFTlNPUlNfTElNSVQoKCh2YWwpKygodmFsKTwwID8gLTUwMCA6IDUwMCkpLzEwMDAsXAotCS0xMjcsMTI3KSkKKwktMTI3LCAxMjcpKQogI2RlZmluZSBURU1QX0ZST01fUkVHKHZhbCkgKCh2YWwpICogMTAwMCkKICNkZWZpbmUgT0ZGU0VUX1RPX1JFRyh2YWwpIChTRU5TT1JTX0xJTUlUKCgodmFsKSsoKHZhbCk8MCA/IC01MDAgOiA1MDApKS8xMDAwLFwKLQktMTI3LDEyNykpCisJLTEyNywgMTI3KSkKICNkZWZpbmUgT0ZGU0VUX0ZST01fUkVHKHZhbCkgKCh2YWwpICogMTAwMCkKIAotI2RlZmluZSBQV01fVE9fUkVHKHZhbCkgKFNFTlNPUlNfTElNSVQodmFsLDAsMjU1KSkKKyNkZWZpbmUgUFdNX1RPX1JFRyh2YWwpIChTRU5TT1JTX0xJTUlUKHZhbCwgMCwgMjU1KSkKICNkZWZpbmUgUFdNX0ZST01fUkVHKHZhbCkgKHZhbCkKIAogI2RlZmluZSBQV01fTUlOX1RPX1JFRyh2YWwpICgodmFsKSAmIDB4ZjApCiAjZGVmaW5lIFBXTV9NSU5fRlJPTV9SRUcodmFsKSAoKCh2YWwpICYgMHhmMCkgKyAoKHZhbCkgPj4gNCkpCiAKLS8qIEFuYWxvZyBvdXRwdXQgaXMgYSB2b2x0YWdlLCBhbmQgc2NhbGVkIHRvIG1pbGxpdm9sdHMuICBUaGUgZGF0YXNoZWV0IAotICogICBpbmRpY2F0ZXMgdGhhdCB0aGUgREFDIGNvdWxkIGJlIHVzZWQgdG8gZHJpdmUgdGhlIGZhbnMsIGJ1dCBpbiBvdXIgCisvKiBBbmFsb2cgb3V0cHV0IGlzIGEgdm9sdGFnZSwgYW5kIHNjYWxlZCB0byBtaWxsaXZvbHRzLiAgVGhlIGRhdGFzaGVldAorICogICBpbmRpY2F0ZXMgdGhhdCB0aGUgREFDIGNvdWxkIGJlIHVzZWQgdG8gZHJpdmUgdGhlIGZhbnMsIGJ1dCBpbiBvdXIKICAqICAgZXhhbXBsZSBib2FyZCAoQXJpbWEgSERBTUEpIGl0IGlzbid0IGNvbm5lY3RlZCB0byB0aGUgZmFucyBhdCBhbGwuCiAgKi8KLSNkZWZpbmUgREFDX1RPX1JFRyh2YWwpIChTRU5TT1JTX0xJTUlUKCgoKCh2YWwpKjI1NSkrNTAwKS8yNTAwKSwwLDI1NSkpIAorI2RlZmluZSBEQUNfVE9fUkVHKHZhbCkgKFNFTlNPUlNfTElNSVQoKCgoKHZhbCkqMjU1KSs1MDApLzI1MDApLCAwLCAyNTUpKQogI2RlZmluZSBEQUNfRlJPTV9SRUcodmFsKSAoKCh2YWwpKjI1MDApLzI1NSkKIAotLyogVHlwaWNhbGx5IHVzZWQgd2l0aCBzeXN0ZW1zIHVzaW5nIGEgdjkuMSBWUk0gc3BlYyA/ICovCi0jZGVmaW5lIEFETTEwMjZfSU5JVF9WUk0gIDkxCi0KIC8qIENoaXAgc2FtcGxpbmcgcmF0ZXMKICAqCiAgKiBTb21lIHNlbnNvcnMgYXJlIG5vdCB1cGRhdGVkIG1vcmUgZnJlcXVlbnRseSB0aGFuIG9uY2UgcGVyIHNlY29uZApAQCAtMjQzLDggKzI0Myw4IEBACiAgKiAgICBTbywgd2Uga2VlcCB0aGUgY29uZmlnIGRhdGEgdXAgdG8gZGF0ZSBpbiB0aGUgY2FjaGUKICAqICAgIHdoZW4gaXQgaXMgd3JpdHRlbiBhbmQgb25seSBzYW1wbGUgaXQgb25jZSBldmVyeSA1ICptaW51dGVzKgogICovCi0jZGVmaW5lIEFETTEwMjZfREFUQV9JTlRFUlZBTCAgKDEgKiBIWikKLSNkZWZpbmUgQURNMTAyNl9DT05GSUdfSU5URVJWQUwgICg1ICogNjAgKiBIWikKKyNkZWZpbmUgQURNMTAyNl9EQVRBX0lOVEVSVkFMCQkoMSAqIEhaKQorI2RlZmluZSBBRE0xMDI2X0NPTkZJR19JTlRFUlZBTAkJKDUgKiA2MCAqIEhaKQogCiAvKiBXZSBhbGxvdyBmb3IgbXVsdGlwbGUgY2hpcHMgaW4gYSBzaW5nbGUgc3lzdGVtLgogICoKQEAgLTI2MSwzNyArMjYxLDM2IEBACiBzdHJ1Y3QgYWRtMTAyNl9kYXRhIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CiAJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OwotCWVudW0gY2hpcHMgdHlwZTsKIAogCXN0cnVjdCBtdXRleCB1cGRhdGVfbG9jazsKIAlpbnQgdmFsaWQ7CQkvKiAhPTAgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KIAl1bnNpZ25lZCBsb25nIGxhc3RfcmVhZGluZzsJLyogSW4gamlmZmllcyAqLwogCXVuc2lnbmVkIGxvbmcgbGFzdF9jb25maWc7CS8qIEluIGppZmZpZXMgKi8KIAotCXU4IGluWzE3XTsgICAgICAgICAgICAgIC8qIFJlZ2lzdGVyIHZhbHVlICovCi0JdTggaW5fbWF4WzE3XTsgICAgICAgICAgLyogUmVnaXN0ZXIgdmFsdWUgKi8KLQl1OCBpbl9taW5bMTddOyAgICAgICAgICAvKiBSZWdpc3RlciB2YWx1ZSAqLwotCXM4IHRlbXBbM107ICAgICAgICAgICAgIC8qIFJlZ2lzdGVyIHZhbHVlICovCi0JczggdGVtcF9taW5bM107ICAgICAgICAgLyogUmVnaXN0ZXIgdmFsdWUgKi8KLQlzOCB0ZW1wX21heFszXTsgICAgICAgICAvKiBSZWdpc3RlciB2YWx1ZSAqLwotCXM4IHRlbXBfdG1pblszXTsgICAgICAgIC8qIFJlZ2lzdGVyIHZhbHVlICovCi0JczggdGVtcF9jcml0WzNdOyAgICAgICAgLyogUmVnaXN0ZXIgdmFsdWUgKi8KLQlzOCB0ZW1wX29mZnNldFszXTsgICAgICAvKiBSZWdpc3RlciB2YWx1ZSAqLwotCXU4IGZhbls4XTsgICAgICAgICAgICAgIC8qIFJlZ2lzdGVyIHZhbHVlICovCi0JdTggZmFuX21pbls4XTsgICAgICAgICAgLyogUmVnaXN0ZXIgdmFsdWUgKi8KLQl1OCBmYW5fZGl2WzhdOyAgICAgICAgICAvKiBEZWNvZGVkIHZhbHVlICovCi0Jc3RydWN0IHB3bV9kYXRhIHB3bTE7ICAgLyogUHdtIGNvbnRyb2wgdmFsdWVzICovCi0JaW50IHZpZDsgICAgICAgICAgICAgICAgLyogRGVjb2RlZCB2YWx1ZSAqLwotCXU4IHZybTsgICAgICAgICAgICAgICAgIC8qIFZSTSB2ZXJzaW9uICovCisJdTggaW5bMTddOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9tYXhbMTddOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9taW5bMTddOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwlzOCB0ZW1wWzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwlzOCB0ZW1wX21pblszXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJczggdGVtcF9tYXhbM107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXM4IHRlbXBfdG1pblszXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwlzOCB0ZW1wX2NyaXRbM107CS8qIFJlZ2lzdGVyIHZhbHVlICovCisJczggdGVtcF9vZmZzZXRbM107CS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggZmFuWzhdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5fbWluWzhdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5fZGl2WzhdOwkJLyogRGVjb2RlZCB2YWx1ZSAqLworCXN0cnVjdCBwd21fZGF0YSBwd20xOwkvKiBQd20gY29udHJvbCB2YWx1ZXMgKi8KKwlpbnQgdmlkOwkJLyogRGVjb2RlZCB2YWx1ZSAqLworCXU4IHZybTsJCQkvKiBWUk0gdmVyc2lvbiAqLwogCXU4IGFuYWxvZ19vdXQ7CQkvKiBSZWdpc3RlciB2YWx1ZSAoREFDKSAqLwotCWxvbmcgYWxhcm1zOyAgICAgICAgICAgIC8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLwotCWxvbmcgYWxhcm1fbWFzazsgICAgICAgIC8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLwotCWxvbmcgZ3BpbzsgICAgICAgICAgICAgIC8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLwotCWxvbmcgZ3Bpb19tYXNrOyAgICAgICAgIC8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLwotCXU4IGdwaW9fY29uZmlnWzE3XTsgICAgIC8qIERlY29kZWQgdmFsdWUgKi8KLQl1OCBjb25maWcxOyAgICAgICAgICAgICAvKiBSZWdpc3RlciB2YWx1ZSAqLwotCXU4IGNvbmZpZzI7ICAgICAgICAgICAgIC8qIFJlZ2lzdGVyIHZhbHVlICovCi0JdTggY29uZmlnMzsgICAgICAgICAgICAgLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwlsb25nIGFsYXJtczsJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLworCWxvbmcgYWxhcm1fbWFzazsJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIGNvbWJpbmVkICovCisJbG9uZyBncGlvOwkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIGNvbWJpbmVkICovCisJbG9uZyBncGlvX21hc2s7CQkvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KKwl1OCBncGlvX2NvbmZpZ1sxN107CS8qIERlY29kZWQgdmFsdWUgKi8KKwl1OCBjb25maWcxOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBjb25maWcyOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBjb25maWczOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KIH07CiAKIHN0YXRpYyBpbnQgYWRtMTAyNl9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOwpAQCAtMzAxLDcgKzMwMCw3IEBACiBzdGF0aWMgaW50IGFkbTEwMjZfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpOwogc3RhdGljIGludCBhZG0xMDI2X3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgaW50IHZhbHVlKTsKIHN0YXRpYyB2b2lkIGFkbTEwMjZfcHJpbnRfZ3BpbyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKLXN0YXRpYyB2b2lkIGFkbTEwMjZfZml4dXBfZ3BpbyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsgCitzdGF0aWMgdm9pZCBhZG0xMDI2X2ZpeHVwX2dwaW8oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CiBzdGF0aWMgc3RydWN0IGFkbTEwMjZfZGF0YSAqYWRtMTAyNl91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBhZG0xMDI2X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwogCkBAIC0zMTEsNyArMzEwLDcgQEAKIAkJLm5hbWUJPSAiYWRtMTAyNiIsCiAJfSwKIAkuYXR0YWNoX2FkYXB0ZXIgPSBhZG0xMDI2X2F0dGFjaF9hZGFwdGVyLAotCS5kZXRhY2hfY2xpZW50ICA9IGFkbTEwMjZfZGV0YWNoX2NsaWVudCwKKwkuZGV0YWNoX2NsaWVudAk9IGFkbTEwMjZfZGV0YWNoX2NsaWVudCwKIH07CiAKIHN0YXRpYyBpbnQgYWRtMTAyNl9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC0zNTUsNyArMzU0LDcgQEAKIAlpbnQgdmFsdWUsIGk7CiAJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCi0gICAgICAgIGRldl9kYmcoJmNsaWVudC0+ZGV2LCAiSW5pdGlhbGl6aW5nIGRldmljZVxuIik7CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJJbml0aWFsaXppbmcgZGV2aWNlXG4iKTsKIAkvKiBSZWFkIGNoaXAgY29uZmlnICovCiAJZGF0YS0+Y29uZmlnMSA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0NPTkZJRzEpOwogCWRhdGEtPmNvbmZpZzIgPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19DT05GSUcyKTsKQEAgLTM4NCw3ICszODMsNiBAQAogCQkJImFuZCB0ZW1wIGxpbWl0cyBlbmFibGVkLlxuIik7CiAJfQogCi0JdmFsdWUgPSBkYXRhLT5jb25maWczOwogCWlmIChkYXRhLT5jb25maWczICYgQ0ZHM19HUElPMTZfRU5BQkxFKSB7CiAJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiR1BJTzE2IGVuYWJsZWQuICBUSEVSTSAiCiAJCQkicGluIGRpc2FibGVkLlxuIik7CkBAIC00MjYsMTAgKzQyNCwxMCBAQAogCSAqICAgY29uZmlndXJlZCwgd2UgZG9uJ3Qgd2FudCB0byBtZXNzIHdpdGggdGhlbS4KIAkgKiAgIElmIHRoZXkgd2VyZW4ndCwgdGhlIGRlZmF1bHQgaXMgMTAwJSBQV00sIG5vCiAJICogICBjb250cm9sIGFuZCB3aWxsIHN1ZmZpY2UgdW50aWwgJ3NlbnNvcnMgLXMnCi0JICogICBjYW4gYmUgcnVuIGJ5IHRoZSB1c2VyLiAgV2UgRE8gc2V0IHRoZSBkZWZhdWx0IAorCSAqICAgY2FuIGJlIHJ1biBieSB0aGUgdXNlci4gIFdlIERPIHNldCB0aGUgZGVmYXVsdAogCSAqICAgdmFsdWUgZm9yIHB3bTEuYXV0b19wd21fbWluIHRvIGl0cyBtYXhpbXVtCiAJICogICBzbyB0aGF0IGVuYWJsaW5nIGF1dG9tYXRpYyBwd20gZmFuIGNvbnRyb2wKLQkgKiAgIHdpdGhvdXQgZmlyc3Qgc2V0dGluZyBhIHZhbHVlIGZvciBwd20xLmF1dG9fcHdtX21pbiAKKwkgKiAgIHdpdGhvdXQgZmlyc3Qgc2V0dGluZyBhIHZhbHVlIGZvciBwd20xLmF1dG9fcHdtX21pbgogCSAqICAgd2lsbCBub3QgcmVzdWx0IGluIHBvdGVudGlhbGx5IGRhbmdlcm91cyBmYW4gc3BlZWQgZGVjcmVhc2UuCiAJICovCiAJZGF0YS0+cHdtMS5hdXRvX3B3bV9taW49MjU1OwpAQCAtNDUzLDcgKzQ1MSw3IEBACiBzdGF0aWMgdm9pZCBhZG0xMDI2X3ByaW50X2dwaW8oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JaW50ICBpOworCWludCBpOwogCiAJZGV2X2RiZygmY2xpZW50LT5kZXYsICJHUElPIGNvbmZpZyBpczoiKTsKIAlmb3IgKGkgPSAwO2kgPD0gNzsrK2kpIHsKQEAgLTQ3Nyw3ICs0NzUsNyBAQAogCQkJZGF0YS0+Z3Bpb19jb25maWdbMTZdICYgMHgwMiA/ICIiIDogIiEiLAogCQkJZGF0YS0+Z3Bpb19jb25maWdbMTZdICYgMHgwMSA/ICJPVVQiIDogIklOIik7CiAJfSBlbHNlIHsKLQkJLyogR1BJTzE2IGlzIFRIRVJNICAqLworCQkvKiBHUElPMTYgaXMgVEhFUk0gKi8KIAkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJcdFRIRVJNXG4iKTsKIAl9CiB9CkBAIC00ODUsOCArNDgzLDggQEAKIHN0YXRpYyB2b2lkIGFkbTEwMjZfZml4dXBfZ3BpbyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlpbnQgIGk7Ci0JaW50ICB2YWx1ZTsKKwlpbnQgaTsKKwlpbnQgdmFsdWU7CiAKIAkvKiBNYWtlIHRoZSBjaGFuZ2VzIHJlcXVlc3RlZC4gKi8KIAkvKiBXZSBtYXkgbmVlZCB0byB1bmxvY2svc3RvcCBtb25pdG9yaW5nIG9yIHNvZnQtcmVzZXQgdGhlCkBAIC01MTYsMTQgKzUxNCwxNCBAQAogCQl9CiAJfQogCi0JLyogSW52ZXJ0ZWQgICovCisJLyogSW52ZXJ0ZWQgKi8KIAlmb3IgKGkgPSAwO2kgPD0gMTY7KytpKSB7CiAJCWlmIChncGlvX2ludmVydGVkW2ldID49IDAgJiYgZ3Bpb19pbnZlcnRlZFtpXSA8PSAxNikgewogCQkJZGF0YS0+Z3Bpb19jb25maWdbZ3Bpb19pbnZlcnRlZFtpXV0gJj0gfiAweDAyOwogCQl9CiAJfQogCi0JLyogTm9ybWFsIG92ZXJyaWRlcyBpbnZlcnRlZCAgKi8KKwkvKiBOb3JtYWwgb3ZlcnJpZGVzIGludmVydGVkICovCiAJZm9yIChpID0gMDtpIDw9IDE2OysraSkgewogCQlpZiAoZ3Bpb19ub3JtYWxbaV0gPj0gMCAmJiBncGlvX25vcm1hbFtpXSA8PSAxNikgewogCQkJZGF0YS0+Z3Bpb19jb25maWdbZ3Bpb19ub3JtYWxbaV1dIHw9IDB4MDI7CkBAIC01NjksNyArNTY3LDcgQEAKIAlpZiAoIWRhdGEtPnZhbGlkCiAJICAgIHx8IHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF9yZWFkaW5nICsgQURNMTAyNl9EQVRBX0lOVEVSVkFMKSkgewogCQkvKiBUaGluZ3MgdGhhdCBjaGFuZ2UgcXVpY2tseSAqLwotCQlkZXZfZGJnKCZjbGllbnQtPmRldiwiUmVhZGluZyBzZW5zb3IgdmFsdWVzXG4iKTsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJSZWFkaW5nIHNlbnNvciB2YWx1ZXNcbiIpOwogCQlmb3IgKGkgPSAwO2kgPD0gMTY7KytpKSB7CiAJCQlkYXRhLT5pbltpXSA9CiAJCQkgICAgYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfSU5baV0pOwpAQCAtNTgyLDE4ICs1ODAsMTggQEAKIAogCQlmb3IgKGkgPSAwO2kgPD0gMjsrK2kpIHsKIAkJCS8qIE5PVEU6IHRlbXBbXSBpcyBzOCBhbmQgd2UgYXNzdW1lIDIncyBjb21wbGVtZW50Ci0JCQkgKiAgICJjb252ZXJzaW9uIiBpbiB0aGUgYXNzaWdubWVudCAgICovCisJCQkgKiAgICJjb252ZXJzaW9uIiBpbiB0aGUgYXNzaWdubWVudCAqLwogCQkJZGF0YS0+dGVtcFtpXSA9CiAJCQkgICAgYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfVEVNUFtpXSk7CiAJCX0KIAotCQlkYXRhLT5wd20xLnB3bSA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIAorCQlkYXRhLT5wd20xLnB3bSA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsCiAJCQlBRE0xMDI2X1JFR19QV00pOwotCQlkYXRhLT5hbmFsb2dfb3V0ID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgCisJCWRhdGEtPmFuYWxvZ19vdXQgPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LAogCQkJQURNMTAyNl9SRUdfREFDKTsKIAkJLyogR1BJTzE2IGlzIE1TYml0IG9mIGFsYXJtcywgbW92ZSBpdCB0byBncGlvICovCiAJCWFsYXJtcyA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX1NUQVRVUzQpOwotCQlncGlvID0gYWxhcm1zICYgMHg4MCA/IDB4MDEwMCA6IDA7ICAvKiBHUElPMTYgKi8KKwkJZ3BpbyA9IGFsYXJtcyAmIDB4ODAgPyAweDAxMDAgOiAwOyAvKiBHUElPMTYgKi8KIAkJYWxhcm1zICY9IDB4N2Y7CiAJCWFsYXJtcyA8PD0gODsKIAkJYWxhcm1zIHw9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX1NUQVRVUzMpOwpAQCAtNjA0LDI0ICs2MDIsMjQgQEAKIAkJZGF0YS0+YWxhcm1zID0gYWxhcm1zOwogCiAJCS8qIFJlYWQgdGhlIEdQSU8gdmFsdWVzICovCi0JCWdwaW8gfD0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgCisJCWdwaW8gfD0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwKIAkJCUFETTEwMjZfUkVHX0dQSU9fU1RBVFVTXzhfMTUpOwogCQlncGlvIDw8PSA4OwotCQlncGlvIHw9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIAorCQlncGlvIHw9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsCiAJCQlBRE0xMDI2X1JFR19HUElPX1NUQVRVU18wXzcpOwogCQlkYXRhLT5ncGlvID0gZ3BpbzsKIAogCQlkYXRhLT5sYXN0X3JlYWRpbmcgPSBqaWZmaWVzOwotCX07ICAvKiBsYXN0X3JlYWRpbmcgKi8KKwl9OyAvKiBsYXN0X3JlYWRpbmcgKi8KIAogCWlmICghZGF0YS0+dmFsaWQgfHwKIAkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X2NvbmZpZyArIEFETTEwMjZfQ09ORklHX0lOVEVSVkFMKSkgewogCQkvKiBUaGluZ3MgdGhhdCBkb24ndCBjaGFuZ2Ugb2Z0ZW4gKi8KIAkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJSZWFkaW5nIGNvbmZpZyB2YWx1ZXNcbiIpOwogCQlmb3IgKGkgPSAwO2kgPD0gMTY7KytpKSB7Ci0JCQlkYXRhLT5pbl9taW5baV0gPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCAKKwkJCWRhdGEtPmluX21pbltpXSA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsCiAJCQkJQURNMTAyNl9SRUdfSU5fTUlOW2ldKTsKLQkJCWRhdGEtPmluX21heFtpXSA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIAorCQkJZGF0YS0+aW5fbWF4W2ldID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwKIAkJCQlBRE0xMDI2X1JFR19JTl9NQVhbaV0pOwogCQl9CiAKQEAgLTYyOSwzMiArNjI3LDMyIEBACiAJCQl8IChhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19GQU5fRElWXzRfNykKIAkJCTw8IDgpOwogCQlmb3IgKGkgPSAwO2kgPD0gNzsrK2kpIHsKLQkJCWRhdGEtPmZhbl9taW5baV0gPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCAKKwkJCWRhdGEtPmZhbl9taW5baV0gPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LAogCQkJCUFETTEwMjZfUkVHX0ZBTl9NSU4oaSkpOwogCQkJZGF0YS0+ZmFuX2RpdltpXSA9IERJVl9GUk9NX1JFRyh2YWx1ZSAmIDB4MDMpOwogCQkJdmFsdWUgPj49IDI7CiAJCX0KIAogCQlmb3IgKGkgPSAwOyBpIDw9IDI7ICsraSkgewotCQkJLyogTk9URTogdGVtcF94eHhbXSBhcmUgczggYW5kIHdlIGFzc3VtZSAyJ3MgCisJCQkvKiBOT1RFOiB0ZW1wX3h4eFtdIGFyZSBzOCBhbmQgd2UgYXNzdW1lIDIncwogCQkJICogICAgY29tcGxlbWVudCAiY29udmVyc2lvbiIgaW4gdGhlIGFzc2lnbm1lbnQKIAkJCSAqLwotCQkJZGF0YS0+dGVtcF9taW5baV0gPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCAKKwkJCWRhdGEtPnRlbXBfbWluW2ldID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwKIAkJCQlBRE0xMDI2X1JFR19URU1QX01JTltpXSk7Ci0JCQlkYXRhLT50ZW1wX21heFtpXSA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIAorCQkJZGF0YS0+dGVtcF9tYXhbaV0gPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LAogCQkJCUFETTEwMjZfUkVHX1RFTVBfTUFYW2ldKTsKLQkJCWRhdGEtPnRlbXBfdG1pbltpXSA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIAorCQkJZGF0YS0+dGVtcF90bWluW2ldID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwKIAkJCQlBRE0xMDI2X1JFR19URU1QX1RNSU5baV0pOwotCQkJZGF0YS0+dGVtcF9jcml0W2ldID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgCisJCQlkYXRhLT50ZW1wX2NyaXRbaV0gPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LAogCQkJCUFETTEwMjZfUkVHX1RFTVBfVEhFUk1baV0pOwotCQkJZGF0YS0+dGVtcF9vZmZzZXRbaV0gPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCAKKwkJCWRhdGEtPnRlbXBfb2Zmc2V0W2ldID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwKIAkJCQlBRE0xMDI2X1JFR19URU1QX09GRlNFVFtpXSk7CiAJCX0KIAogCQkvKiBSZWFkIHRoZSBTVEFUVVMvYWxhcm0gbWFza3MgKi8KLQkJYWxhcm1zICA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX01BU0s0KTsKLQkJZ3BpbyAgICA9IGFsYXJtcyAmIDB4ODAgPyAweDAxMDAgOiAwOyAgLyogR1BJTzE2ICovCi0JCWFsYXJtcyAgPSAoYWxhcm1zICYgMHg3ZikgPDwgODsKKwkJYWxhcm1zID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfTUFTSzQpOworCQlncGlvID0gYWxhcm1zICYgMHg4MCA/IDB4MDEwMCA6IDA7IC8qIEdQSU8xNiAqLworCQlhbGFybXMgPSAoYWxhcm1zICYgMHg3ZikgPDwgODsKIAkJYWxhcm1zIHw9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX01BU0szKTsKIAkJYWxhcm1zIDw8PSA4OwogCQlhbGFybXMgfD0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfTUFTSzIpOwpAQCAtNjYzLDI0ICs2NjEsMjQgQEAKIAkJZGF0YS0+YWxhcm1fbWFzayA9IGFsYXJtczsKIAogCQkvKiBSZWFkIHRoZSBHUElPIHZhbHVlcyAqLwotCQlncGlvIHw9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIAorCQlncGlvIHw9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsCiAJCQlBRE0xMDI2X1JFR19HUElPX01BU0tfOF8xNSk7CiAJCWdwaW8gPDw9IDg7CiAJCWdwaW8gfD0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfR1BJT19NQVNLXzBfNyk7CiAJCWRhdGEtPmdwaW9fbWFzayA9IGdwaW87CiAKIAkJLyogUmVhZCB2YXJpb3VzIHZhbHVlcyBmcm9tIENPTkZJRzEgKi8KLQkJZGF0YS0+Y29uZmlnMSA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIAorCQlkYXRhLT5jb25maWcxID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwKIAkJCUFETTEwMjZfUkVHX0NPTkZJRzEpOwogCQlpZiAoZGF0YS0+Y29uZmlnMSAmIENGRzFfUFdNX0FGQykgewogCQkJZGF0YS0+cHdtMS5lbmFibGUgPSAyOwotCQkJZGF0YS0+cHdtMS5hdXRvX3B3bV9taW4gPSAKKwkJCWRhdGEtPnB3bTEuYXV0b19wd21fbWluID0KIAkJCQlQV01fTUlOX0ZST01fUkVHKGRhdGEtPnB3bTEucHdtKTsKIAkJfQogCQkvKiBSZWFkIHRoZSBHUElPIGNvbmZpZyAqLwotCQlkYXRhLT5jb25maWcyID0gYWRtMTAyNl9yZWFkX3ZhbHVlKGNsaWVudCwgCisJCWRhdGEtPmNvbmZpZzIgPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LAogCQkJQURNMTAyNl9SRUdfQ09ORklHMik7Ci0JCWRhdGEtPmNvbmZpZzMgPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCAKKwkJZGF0YS0+Y29uZmlnMyA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsCiAJCQlBRE0xMDI2X1JFR19DT05GSUczKTsKIAkJZGF0YS0+Z3Bpb19jb25maWdbMTZdID0gKGRhdGEtPmNvbmZpZzMgPj4gNikgJiAweDAzOwogCkBAIC02OTUsNyArNjkzLDcgQEAKIAkJfQogCiAJCWRhdGEtPmxhc3RfY29uZmlnID0gamlmZmllczsKLQl9OyAgLyogbGFzdF9jb25maWcgKi8KKwl9OyAvKiBsYXN0X2NvbmZpZyAqLwogCiAJZGV2X2RiZygmY2xpZW50LT5kZXYsICJTZXR0aW5nIFZJRCBmcm9tIEdQSU8xMS0xNS5cbiIpOwogCWRhdGEtPnZpZCA9IChkYXRhLT5ncGlvID4+IDExKSAmIDB4MWY7CkBAIC03MTAsMTUgKzcwOCwxNSBAQAogCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqc2Vuc29yX2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7CiAJaW50IG5yID0gc2Vuc29yX2F0dHItPmluZGV4OwogCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBhZG0xMDI2X3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBJTlNfRlJPTV9SRUcobnIsIGRhdGEtPmluW25yXSkpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBJTlNfRlJPTV9SRUcobnIsIGRhdGEtPmluW25yXSkpOwogfQogc3RhdGljIHNzaXplX3Qgc2hvd19pbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJY2hhciAqYnVmKQogewogCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqc2Vuc29yX2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7CiAJaW50IG5yID0gc2Vuc29yX2F0dHItPmluZGV4OwotCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBhZG0xMDI2X3VwZGF0ZV9kZXZpY2UoZGV2KTsgCi0JcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgSU5TX0ZST01fUkVHKG5yLCBkYXRhLT5pbl9taW5bbnJdKSk7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBJTlNfRlJPTV9SRUcobnIsIGRhdGEtPmluX21pbltucl0pKTsKIH0KIHN0YXRpYyBzc2l6ZV90IHNldF9pbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCkBAIC03MzMsNyArNzMxLDcgQEAKIAlkYXRhLT5pbl9taW5bbnJdID0gSU5TX1RPX1JFRyhuciwgdmFsKTsKIAlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfSU5fTUlOW25yXSwgZGF0YS0+aW5fbWluW25yXSk7CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JcmV0dXJuIGNvdW50OyAKKwlyZXR1cm4gY291bnQ7CiB9CiBzdGF0aWMgc3NpemVfdCBzaG93X2luX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQljaGFyICpidWYpCkBAIC03NDEsNyArNzM5LDcgQEAKIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOwogCWludCBuciA9IHNlbnNvcl9hdHRyLT5pbmRleDsKIAlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgSU5TX0ZST01fUkVHKG5yLCBkYXRhLT5pbl9tYXhbbnJdKSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIElOU19GUk9NX1JFRyhuciwgZGF0YS0+aW5fbWF4W25yXSkpOwogfQogc3RhdGljIHNzaXplX3Qgc2V0X2luX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKQEAgLTc4OCwxMyArNzg2LDEzIEBACiBzdGF0aWMgc3NpemVfdCBzaG93X2luMTYoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBhZG0xMDI2X3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBJTlNfRlJPTV9SRUcoMTYsIGRhdGEtPmluWzE2XSkgLQorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBJTlNfRlJPTV9SRUcoMTYsIGRhdGEtPmluWzE2XSkgLQogCQlORUcxMl9PRkZTRVQpOwogfQogc3RhdGljIHNzaXplX3Qgc2hvd19pbjE2X21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOyAKLQlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBJTlNfRlJPTV9SRUcoMTYsIGRhdGEtPmluX21pblsxNl0pCisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBJTlNfRlJPTV9SRUcoMTYsIGRhdGEtPmluX21pblsxNl0pCiAJCS0gTkVHMTJfT0ZGU0VUKTsKIH0KIHN0YXRpYyBzc2l6ZV90IHNldF9pbjE2X21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKQEAgLTgwNywxMiArODA1LDEyIEBACiAJZGF0YS0+aW5fbWluWzE2XSA9IElOU19UT19SRUcoMTYsIHZhbCArIE5FRzEyX09GRlNFVCk7CiAJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0lOX01JTlsxNl0sIGRhdGEtPmluX21pblsxNl0pOwogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCXJldHVybiBjb3VudDsgCisJcmV0dXJuIGNvdW50OwogfQogc3RhdGljIHNzaXplX3Qgc2hvd19pbjE2X21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIElOU19GUk9NX1JFRygxNiwgZGF0YS0+aW5fbWF4WzE2XSkKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgSU5TX0ZST01fUkVHKDE2LCBkYXRhLT5pbl9tYXhbMTZdKQogCQkJLSBORUcxMl9PRkZTRVQpOwogfQogc3RhdGljIHNzaXplX3Qgc2V0X2luMTZfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQpAQCAtODQzLDcgKzg0MSw3IEBACiAJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZW5zb3JfYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsKIAlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+aW5kZXg7CiAJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5bbnJdLAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuW25yXSwKIAkJZGF0YS0+ZmFuX2Rpdltucl0pKTsKIH0KIHN0YXRpYyBzc2l6ZV90IHNob3dfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLApAQCAtODUyLDcgKzg1MCw3IEBACiAJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZW5zb3JfYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsKIAlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+aW5kZXg7CiAJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5fbWluW25yXSwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRkFOX0ZST01fUkVHKGRhdGEtPmZhbl9taW5bbnJdLAogCQlkYXRhLT5mYW5fZGl2W25yXSkpOwogfQogc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKQEAgLTg3MiwxMCArODcwLDEwIEBACiAJcmV0dXJuIGNvdW50OwogfQogCi0jZGVmaW5lIGZhbl9vZmZzZXQob2Zmc2V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlcCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAJXAotCQlvZmZzZXQgLSAxKTsJCQkJCQkJXAotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsICAgICAgICAgICAJXAorI2RlZmluZSBmYW5fb2Zmc2V0KG9mZnNldCkJCQkJCQlcCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLAlcCisJCW9mZnNldCAtIDEpOwkJCQkJCVwKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLAkJXAogCQlzaG93X2Zhbl9taW4sIHNldF9mYW5fbWluLCBvZmZzZXQgLSAxKTsKIAogZmFuX29mZnNldCgxKTsKQEAgLTg5Miw4ICs4OTAsOCBAQAogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CiAJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCWludCAgICBuZXdfbWluOwotCWludCAgICBuZXdfZGl2ID0gZGF0YS0+ZmFuX2RpdltmYW5dOworCWludCBuZXdfbWluOworCWludCBuZXdfZGl2ID0gZGF0YS0+ZmFuX2RpdltmYW5dOwogCiAJLyogMCBhbmQgMHhmZiBhcmUgc3BlY2lhbC4gIERvbid0IGFkanVzdCB0aGVtICovCiAJaWYgKGRhdGEtPmZhbl9taW5bZmFuXSA9PSAwIHx8IGRhdGEtPmZhbl9taW5bZmFuXSA9PSAweGZmKSB7CkBAIC05MTMsNyArOTExLDcgQEAKIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOwogCWludCBuciA9IHNlbnNvcl9hdHRyLT5pbmRleDsKIAlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgZGF0YS0+ZmFuX2Rpdltucl0pOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5mYW5fZGl2W25yXSk7CiB9CiBzdGF0aWMgc3NpemVfdCBzZXRfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKQEAgLTkyMiwxMCArOTIwLDEwIEBACiAJaW50IG5yID0gc2Vuc29yX2F0dHItPmluZGV4OwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CiAJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCWludCAgICB2YWwsb3JpZ19kaXYsbmV3X2RpdixzaGlmdDsKKwlpbnQgdmFsLCBvcmlnX2RpdiwgbmV3X2Rpdiwgc2hpZnQ7CiAKIAl2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwotCW5ld19kaXYgPSBESVZfVE9fUkVHKHZhbCk7IAorCW5ld19kaXYgPSBESVZfVE9fUkVHKHZhbCk7CiAJaWYgKG5ld19kaXYgPT0gMCkgewogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC05NDYsMTQgKzk0NCwxNCBAQAogCX0KIAogCWlmIChkYXRhLT5mYW5fZGl2W25yXSAhPSBvcmlnX2RpdikgewotCQlmaXh1cF9mYW5fbWluKGRldixucixvcmlnX2Rpdik7CisJCWZpeHVwX2Zhbl9taW4oZGV2LCBuciwgb3JpZ19kaXYpOwogCX0KIAltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKLSNkZWZpbmUgZmFuX29mZnNldF9kaXYob2Zmc2V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19kaXYsIFNfSVJVR08gfCBTX0lXVVNSLCAgICAgICAgIFwKKyNkZWZpbmUgZmFuX29mZnNldF9kaXYob2Zmc2V0KQkJCQkJCVwKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19kaXYsIFNfSVJVR08gfCBTX0lXVVNSLAkJXAogCQlzaG93X2Zhbl9kaXYsIHNldF9mYW5fZGl2LCBvZmZzZXQgLSAxKTsKIAogZmFuX29mZnNldF9kaXYoMSk7CkBAIC05NzIsNyArOTcwLDcgQEAKIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOwogCWludCBuciA9IHNlbnNvcl9hdHRyLT5pbmRleDsKIAlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wW25yXSkpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBbbnJdKSk7CiB9CiBzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCWNoYXIgKmJ1ZikKQEAgLTk4MCw3ICs5NzgsNyBAQAogCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqc2Vuc29yX2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7CiAJaW50IG5yID0gc2Vuc29yX2F0dHItPmluZGV4OwogCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBhZG0xMDI2X3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfbWluW25yXSkpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfbWluW25yXSkpOwogfQogc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQpAQCAtMTAwNCw3ICsxMDAyLDcgQEAKIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOwogCWludCBuciA9IHNlbnNvcl9hdHRyLT5pbmRleDsKIAlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX21heFtucl0pKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX21heFtucl0pKTsKIH0KIHN0YXRpYyBzc2l6ZV90IHNldF90ZW1wX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKQEAgLTEwMjQsNyArMTAyMiw3IEBACiB9CiAKICNkZWZpbmUgdGVtcF9yZWcob2Zmc2V0KQkJCQkJCVwKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcCwgCVwKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcCwJXAogCQlOVUxMLCBvZmZzZXQgLSAxKTsJCQkJCVwKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwJXAogCQlzaG93X3RlbXBfbWluLCBzZXRfdGVtcF9taW4sIG9mZnNldCAtIDEpOwkJXApAQCAtMTA0Miw3ICsxMDQwLDcgQEAKIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOwogCWludCBuciA9IHNlbnNvcl9hdHRyLT5pbmRleDsKIAlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX29mZnNldFtucl0pKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX29mZnNldFtucl0pKTsKIH0KIHN0YXRpYyBzc2l6ZV90IHNldF90ZW1wX29mZnNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCkBAIC0xMDc2LDcgKzEwNzQsNyBAQAogCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqc2Vuc29yX2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7CiAJaW50IG5yID0gc2Vuc29yX2F0dHItPmluZGV4OwogCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBhZG0xMDI2X3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBURU1QX0ZST01fUkVHKAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKAogCQlBRE0xMDI2X0ZBTl9BQ1RJVkFUSU9OX1RFTVBfSFlTVCArIGRhdGEtPnRlbXBfdG1pbltucl0pKTsKIH0KIHN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9hdXRvX3BvaW50Ml90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTEwODUsNyArMTA4Myw3IEBACiAJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZW5zb3JfYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsKIAlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+aW5kZXg7CiAJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF90bWluW25yXSArCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF90bWluW25yXSArCiAJCUFETTEwMjZfRkFOX0NPTlRST0xfVEVNUF9SQU5HRSkpOwogfQogc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2F1dG9fcG9pbnQxX3RlbXAoc3RydWN0IGRldmljZSAqZGV2LApAQCAtMTA5NCw3ICsxMDkyLDcgQEAKIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOwogCWludCBuciA9IHNlbnNvcl9hdHRyLT5pbmRleDsKIAlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX3RtaW5bbnJdKSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF90bWluW25yXSkpOwogfQogc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfYXV0b19wb2ludDFfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKQEAgLTExMTMsMTMgKzExMTEsMTMgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLSNkZWZpbmUgdGVtcF9hdXRvX3BvaW50KG9mZnNldCkJCQkJCQkJXAotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19hdXRvX3BvaW50MV90ZW1wLCBTX0lSVUdPIHwgU19JV1VTUiwJXAotCQlzaG93X3RlbXBfYXV0b19wb2ludDFfdGVtcCwgc2V0X3RlbXBfYXV0b19wb2ludDFfdGVtcCwgCQlcCi0JCW9mZnNldCAtIDEpOwkJCQkJCQlcCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX2F1dG9fcG9pbnQxX3RlbXBfaHlzdCwgU19JUlVHTywJXAotCQlzaG93X3RlbXBfYXV0b19wb2ludDFfdGVtcF9oeXN0LCBOVUxMLCBvZmZzZXQgLSAxKTsJCVwKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfYXV0b19wb2ludDJfdGVtcCwgU19JUlVHTywJCVwKKyNkZWZpbmUgdGVtcF9hdXRvX3BvaW50KG9mZnNldCkJCQkJCQlcCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX2F1dG9fcG9pbnQxX3RlbXAsCQlcCisJCVNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3RlbXBfYXV0b19wb2ludDFfdGVtcCwJCVwKKwkJc2V0X3RlbXBfYXV0b19wb2ludDFfdGVtcCwgb2Zmc2V0IC0gMSk7CQkJXAorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19hdXRvX3BvaW50MV90ZW1wX2h5c3QsIFNfSVJVR08sXAorCQlzaG93X3RlbXBfYXV0b19wb2ludDFfdGVtcF9oeXN0LCBOVUxMLCBvZmZzZXQgLSAxKTsJXAorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19hdXRvX3BvaW50Ml90ZW1wLCBTX0lSVUdPLAlcCiAJCXNob3dfdGVtcF9hdXRvX3BvaW50Ml90ZW1wLCBOVUxMLCBvZmZzZXQgLSAxKTsKIAogdGVtcF9hdXRvX3BvaW50KDEpOwpAQCAtMTEzMCw3ICsxMTI4LDcgQEAKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgKGRhdGEtPmNvbmZpZzEgJiBDRkcxX1RIRVJNX0hPVCkgPj4gNCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIChkYXRhLT5jb25maWcxICYgQ0ZHMV9USEVSTV9IT1QpID4+IDQpOwogfQogc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfY3JpdF9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCkBAIC0xMTQyLDcgKzExNDAsNyBAQAogCWlmICgodmFsID09IDEpIHx8ICh2YWw9PTApKSB7CiAJCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAkJZGF0YS0+Y29uZmlnMSA9IChkYXRhLT5jb25maWcxICYgfkNGRzFfVEhFUk1fSE9UKSB8ICh2YWwgPDwgNCk7Ci0JCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19DT05GSUcxLCAKKwkJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0NPTkZJRzEsCiAJCQlkYXRhLT5jb25maWcxKTsKIAkJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJfQpAQCAtMTE2Myw3ICsxMTYxLDcgQEAKIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOwogCWludCBuciA9IHNlbnNvcl9hdHRyLT5pbmRleDsKIAlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX2NyaXRbbnJdKSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9jcml0W25yXSkpOwogfQogc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfY3JpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKQEAgLTExOTMsNyArMTE5MSw3IEBACiBzdGF0aWMgc3NpemVfdCBzaG93X2FuYWxvZ19vdXRfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgREFDX0ZST01fUkVHKGRhdGEtPmFuYWxvZ19vdXQpKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgREFDX0ZST01fUkVHKGRhdGEtPmFuYWxvZ19vdXQpKTsKIH0KIHN0YXRpYyBzc2l6ZV90IHNldF9hbmFsb2dfb3V0X3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCiAJCXNpemVfdCBjb3VudCkKQEAgLTEyMDksMjYgKzEyMDcsMjUgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBERVZJQ0VfQVRUUihhbmFsb2dfb3V0LCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19hbmFsb2dfb3V0X3JlZywgCitzdGF0aWMgREVWSUNFX0FUVFIoYW5hbG9nX291dCwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfYW5hbG9nX291dF9yZWcsCiAJc2V0X2FuYWxvZ19vdXRfcmVnKTsKIAogc3RhdGljIHNzaXplX3Qgc2hvd192aWRfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgdmlkX2Zyb21fcmVnKGRhdGEtPnZpZCAmIDB4M2YsIGRhdGEtPnZybSkpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2aWRfZnJvbV9yZWcoZGF0YS0+dmlkICYgMHgzZiwgZGF0YS0+dnJtKSk7CiB9CiBzdGF0aWMgREVWSUNFX0FUVFIoY3B1MF92aWQsIFNfSVJVR08sIHNob3dfdmlkX3JlZywgTlVMTCk7CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfdnJtX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIGRhdGEtPnZybSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnZybSk7CiB9CiBzdGF0aWMgc3NpemVfdCBzdG9yZV92cm1fcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKIAkJc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCWRhdGEtPnZybSA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CiAJcmV0dXJuIGNvdW50OwpAQCAtMTIzOSwxNSArMTIzNiw1MiBAQAogc3RhdGljIHNzaXplX3Qgc2hvd19hbGFybXNfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCAobG9uZykgKGRhdGEtPmFsYXJtcykpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgZGF0YS0+YWxhcm1zKTsKIH0KIAogc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgc2hvd19hbGFybXNfcmVnLCBOVUxMKTsKIAorc3RhdGljIHNzaXplX3Qgc2hvd19hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICBjaGFyICpidWYpCit7CisJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOworCWludCBiaXRuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCAoZGF0YS0+YWxhcm1zID4+IGJpdG5yKSAmIDEpOworfQorCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjlfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjExX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xMl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMTNfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDQpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjE0X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA1KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xNV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgNik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMTZfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDcpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjBfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDgpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjFfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDkpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDEwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4zX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAxMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluNF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjVfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDEzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW42X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAxNCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluN19hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTUpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAxNik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjJfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDE3KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuM19hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTgpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW40X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAxOSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjVfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDIwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuNl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMjEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW43X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAyMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjhfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDIzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDI0KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xMF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMjUpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjhfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDI2KTsKKwogc3RhdGljIHNzaXplX3Qgc2hvd19hbGFybV9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCIlbGRcbiIsIGRhdGEtPmFsYXJtX21hc2spOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgZGF0YS0+YWxhcm1fbWFzayk7CiB9CiBzdGF0aWMgc3NpemVfdCBzZXRfYWxhcm1fbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCiAJCXNpemVfdCBjb3VudCkKQEAgLTEyODMsNyArMTMxNyw3IEBACiBzdGF0aWMgc3NpemVfdCBzaG93X2dwaW8oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBhZG0xMDI2X3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlyZXR1cm4gc3ByaW50ZihidWYsIiVsZFxuIiwgZGF0YS0+Z3Bpbyk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBkYXRhLT5ncGlvKTsKIH0KIHN0YXRpYyBzc2l6ZV90IHNldF9ncGlvKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKIAkJc2l6ZV90IGNvdW50KQpAQCAtMTI5MSwxNiArMTMyNSwxNiBAQAogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CiAJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwotCWxvbmcgICBncGlvOworCWxvbmcgZ3BpbzsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlkYXRhLT5ncGlvID0gdmFsICYgMHgxZmZmZjsKIAlncGlvID0gZGF0YS0+Z3BpbzsKLQlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfR1BJT19TVEFUVVNfMF83LGdwaW8gJiAweGZmKTsKKwlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfR1BJT19TVEFUVVNfMF83LCBncGlvICYgMHhmZik7CiAJZ3BpbyA+Pj0gODsKLQlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfR1BJT19TVEFUVVNfOF8xNSxncGlvICYgMHhmZik7CisJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0dQSU9fU1RBVFVTXzhfMTUsIGdwaW8gJiAweGZmKTsKIAlncGlvID0gKChncGlvID4+IDEpICYgMHg4MCkgfCAoZGF0YS0+YWxhcm1zID4+IDI0ICYgMHg3Zik7Ci0JYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX1NUQVRVUzQsZ3BpbyAmIDB4ZmYpOworCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19TVEFUVVM0LCBncGlvICYgMHhmZik7CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJcmV0dXJuIGNvdW50OwogfQpAQCAtMTMxMSw3ICsxMzQ1LDcgQEAKIHN0YXRpYyBzc2l6ZV90IHNob3dfZ3Bpb19tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCIlbGRcbiIsIGRhdGEtPmdwaW9fbWFzayk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBkYXRhLT5ncGlvX21hc2spOwogfQogc3RhdGljIHNzaXplX3Qgc2V0X2dwaW9fbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCiAJCXNpemVfdCBjb3VudCkKQEAgLTEzMTksMTYgKzEzNTMsMTYgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwogCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKLQlsb25nICAgbWFzazsKKwlsb25nIG1hc2s7CiAKIAltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJZGF0YS0+Z3Bpb19tYXNrID0gdmFsICYgMHgxZmZmZjsKIAltYXNrID0gZGF0YS0+Z3Bpb19tYXNrOwotCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19HUElPX01BU0tfMF83LG1hc2sgJiAweGZmKTsKKwlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfR1BJT19NQVNLXzBfNywgbWFzayAmIDB4ZmYpOwogCW1hc2sgPj49IDg7Ci0JYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0dQSU9fTUFTS184XzE1LG1hc2sgJiAweGZmKTsKKwlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfR1BJT19NQVNLXzhfMTUsIG1hc2sgJiAweGZmKTsKIAltYXNrID0gKChtYXNrID4+IDEpICYgMHg4MCkgfCAoZGF0YS0+YWxhcm1fbWFzayA+PiAyNCAmIDB4N2YpOwotCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19NQVNLMSxtYXNrICYgMHhmZik7CisJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX01BU0sxLCBtYXNrICYgMHhmZik7CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJcmV0dXJuIGNvdW50OwogfQpAQCAtMTMzOCw3ICsxMzcyLDcgQEAKIHN0YXRpYyBzc2l6ZV90IHNob3dfcHdtX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGFkbTEwMjZfZGF0YSAqZGF0YSA9IGFkbTEwMjZfdXBkYXRlX2RldmljZShkZXYpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIFBXTV9GUk9NX1JFRyhkYXRhLT5wd20xLnB3bSkpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBQV01fRlJPTV9SRUcoZGF0YS0+cHdtMS5wd20pKTsKIH0KIHN0YXRpYyBzc2l6ZV90IHNldF9wd21fcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKIAkJc2l6ZV90IGNvdW50KQpAQCAtMTM1OSw3ICsxMzkzLDcgQEAKIHN0YXRpYyBzc2l6ZV90IHNob3dfYXV0b19wd21fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgZGF0YS0+cHdtMS5hdXRvX3B3bV9taW4pOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5wd20xLmF1dG9fcHdtX21pbik7CiB9CiBzdGF0aWMgc3NpemVfdCBzZXRfYXV0b19wd21fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKIAkJc2l6ZV90IGNvdW50KQpAQCAtMTM2OSwxMCArMTQwMywxMCBAQAogCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCWRhdGEtPnB3bTEuYXV0b19wd21fbWluID0gU0VOU09SU19MSU1JVCh2YWwsMCwyNTUpOworCWRhdGEtPnB3bTEuYXV0b19wd21fbWluID0gU0VOU09SU19MSU1JVCh2YWwsIDAsIDI1NSk7CiAJaWYgKGRhdGEtPnB3bTEuZW5hYmxlID09IDIpIHsgLyogYXBwbHkgaW1tZWRpYXRlbHkgKi8KIAkJZGF0YS0+cHdtMS5wd20gPSBQV01fVE9fUkVHKChkYXRhLT5wd20xLnB3bSAmIDB4MGYpIHwKLQkJCVBXTV9NSU5fVE9fUkVHKGRhdGEtPnB3bTEuYXV0b19wd21fbWluKSk7IAorCQkJUFdNX01JTl9UT19SRUcoZGF0YS0+cHdtMS5hdXRvX3B3bV9taW4pKTsKIAkJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX1BXTSwgZGF0YS0+cHdtMS5wd20pOwogCX0KIAltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKQEAgLTEzODAsMTIgKzE0MTQsMTIgQEAKIH0KIHN0YXRpYyBzc2l6ZV90IHNob3dfYXV0b19wd21fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBBRE0xMDI2X1BXTV9NQVgpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBBRE0xMDI2X1BXTV9NQVgpOwogfQogc3RhdGljIHNzaXplX3Qgc2hvd19wd21fZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gYWRtMTAyNl91cGRhdGVfZGV2aWNlKGRldik7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgZGF0YS0+cHdtMS5lbmFibGUpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5wd20xLmVuYWJsZSk7CiB9CiBzdGF0aWMgc3NpemVfdCBzZXRfcHdtX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCiAJCXNpemVfdCBjb3VudCkKQEAgLTEzOTMsNyArMTQyNyw3IEBACiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKIAlzdHJ1Y3QgYWRtMTAyNl9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7Ci0JaW50ICAgICBvbGRfZW5hYmxlOworCWludCBvbGRfZW5hYmxlOwogCiAJaWYgKCh2YWwgPj0gMCkgJiYgKHZhbCA8IDMpKSB7CiAJCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKQEAgLTE0MDMsMTUgKzE0MzcsMTUgQEAKIAkJCQl8ICgodmFsID09IDIpID8gQ0ZHMV9QV01fQUZDIDogMCk7CiAJCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19DT05GSUcxLAogCQkJZGF0YS0+Y29uZmlnMSk7Ci0JCWlmICh2YWwgPT0gMikgeyAgLyogYXBwbHkgcHdtMV9hdXRvX3B3bV9taW4gdG8gcHdtMSAqLworCQlpZiAodmFsID09IDIpIHsgLyogYXBwbHkgcHdtMV9hdXRvX3B3bV9taW4gdG8gcHdtMSAqLwogCQkJZGF0YS0+cHdtMS5wd20gPSBQV01fVE9fUkVHKChkYXRhLT5wd20xLnB3bSAmIDB4MGYpIHwKLQkJCQlQV01fTUlOX1RPX1JFRyhkYXRhLT5wd20xLmF1dG9fcHdtX21pbikpOyAKLQkJCWFkbTEwMjZfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19QV00sIAorCQkJCVBXTV9NSU5fVE9fUkVHKGRhdGEtPnB3bTEuYXV0b19wd21fbWluKSk7CisJCQlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfUFdNLAogCQkJCWRhdGEtPnB3bTEucHdtKTsKIAkJfSBlbHNlIGlmICghKChvbGRfZW5hYmxlID09IDEpICYmICh2YWwgPT0gMSkpKSB7CiAJCQkvKiBzZXQgcHdtIHRvIHNhZmUgdmFsdWUgKi8KIAkJCWRhdGEtPnB3bTEucHdtID0gMjU1OwotCQkJYWRtMTAyNl93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX1BXTSwgCisJCQlhZG0xMDI2X3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAyNl9SRUdfUFdNLAogCQkJCWRhdGEtPnB3bTEucHdtKTsKIAkJfQogCQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKQEAgLTE0MjAsMjAgKzE0NTQsMjAgQEAKIH0KIAogLyogZW5hYmxlIFBXTSBmYW4gY29udHJvbCAqLwotc3RhdGljIERFVklDRV9BVFRSKHB3bTEsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3B3bV9yZWcsIHNldF9wd21fcmVnKTsgCi1zdGF0aWMgREVWSUNFX0FUVFIocHdtMiwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfcHdtX3JlZywgc2V0X3B3bV9yZWcpOyAKLXN0YXRpYyBERVZJQ0VfQVRUUihwd20zLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19wd21fcmVnLCBzZXRfcHdtX3JlZyk7IAotc3RhdGljIERFVklDRV9BVFRSKHB3bTFfZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19wd21fZW5hYmxlLCAKK3N0YXRpYyBERVZJQ0VfQVRUUihwd20xLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19wd21fcmVnLCBzZXRfcHdtX3JlZyk7CitzdGF0aWMgREVWSUNFX0FUVFIocHdtMiwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfcHdtX3JlZywgc2V0X3B3bV9yZWcpOworc3RhdGljIERFVklDRV9BVFRSKHB3bTMsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3B3bV9yZWcsIHNldF9wd21fcmVnKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwd20xX2VuYWJsZSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfcHdtX2VuYWJsZSwKIAlzZXRfcHdtX2VuYWJsZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIocHdtMl9lbmFibGUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3B3bV9lbmFibGUsIAorc3RhdGljIERFVklDRV9BVFRSKHB3bTJfZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19wd21fZW5hYmxlLAogCXNldF9wd21fZW5hYmxlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihwd20zX2VuYWJsZSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfcHdtX2VuYWJsZSwgCitzdGF0aWMgREVWSUNFX0FUVFIocHdtM19lbmFibGUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3B3bV9lbmFibGUsCiAJc2V0X3B3bV9lbmFibGUpOwotc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX2F1dG9fcG9pbnQxX3B3bSwgU19JUlVHTyB8IFNfSVdVU1IsIAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX2F1dG9fcG9pbnQxX3B3bSwgU19JUlVHTyB8IFNfSVdVU1IsCiAJc2hvd19hdXRvX3B3bV9taW4sIHNldF9hdXRvX3B3bV9taW4pOwotc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX2F1dG9fcG9pbnQxX3B3bSwgU19JUlVHTyB8IFNfSVdVU1IsIAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAyX2F1dG9fcG9pbnQxX3B3bSwgU19JUlVHTyB8IFNfSVdVU1IsCiAJc2hvd19hdXRvX3B3bV9taW4sIHNldF9hdXRvX3B3bV9taW4pOwotc3RhdGljIERFVklDRV9BVFRSKHRlbXAzX2F1dG9fcG9pbnQxX3B3bSwgU19JUlVHTyB8IFNfSVdVU1IsIAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAzX2F1dG9fcG9pbnQxX3B3bSwgU19JUlVHTyB8IFNfSVdVU1IsCiAJc2hvd19hdXRvX3B3bV9taW4sIHNldF9hdXRvX3B3bV9taW4pOwogCiBzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfYXV0b19wb2ludDJfcHdtLCBTX0lSVUdPLCBzaG93X2F1dG9fcHdtX21heCwgTlVMTCk7CkBAIC0xNDQ0LDEwNSArMTQ3OCwxMTUgQEAKIAkmc2Vuc29yX2Rldl9hdHRyX2luMF9pbnB1dC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW4wX21heC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW4wX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4wX2FsYXJtLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luMV9tYXguZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luMV9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9hbGFybS5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW4yX2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjJfbWF4LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjJfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luM19pbnB1dC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW4zX21heC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW4zX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4zX2FsYXJtLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjRfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luNF9tYXguZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luNF9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNF9hbGFybS5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW41X2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjVfbWF4LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjVfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjVfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luNl9pbnB1dC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW42X21heC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW42X21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW42X2FsYXJtLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjdfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luN19tYXguZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luN19taW4uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luOF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW44X21heC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW44X21pbi5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW45X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjlfbWF4LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjlfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjdfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luMTBfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luMTBfbWF4LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjEwX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xMF9hbGFybS5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW4xMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW4xMV9tYXguZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luMTFfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjExX2FsYXJtLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjEyX2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjEyX21heC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW4xMl9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMTJfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luMTNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luMTNfbWF4LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjEzX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xM19hbGFybS5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW4xNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW4xNF9tYXguZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luMTRfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjE0X2FsYXJtLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjE1X2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjE1X21heC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW4xNV9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMTVfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luMTZfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luMTZfbWF4LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjE2X21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xNl9hbGFybS5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV9kaXYuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2FsYXJtLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9mYW4yX2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9mYW4yX2Rpdi5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfZmFuMl9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2ZhbjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2ZhbjNfZGl2LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9mYW4zX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuM19hbGFybS5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfZmFuNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfZmFuNF9kaXYuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2ZhbjRfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW40X2FsYXJtLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9mYW41X2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9mYW41X2Rpdi5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfZmFuNV9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjVfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2ZhbjZfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2ZhbjZfZGl2LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9mYW42X21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuNl9hbGFybS5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfZmFuN19pbnB1dC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfZmFuN19kaXYuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2ZhbjdfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW43X2FsYXJtLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9mYW44X2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9mYW44X2Rpdi5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfZmFuOF9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXguZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9tYXguZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX21pbi5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX21heC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9hbGFybS5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX29mZnNldC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfYXV0b19wb2ludDFfdGVtcC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfYXV0b19wb2ludDFfdGVtcC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfYXV0b19wb2ludDFfdGVtcC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfYXV0b19wb2ludDFfdGVtcF9oeXN0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9hdXRvX3BvaW50MV90ZW1wX2h5c3QuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2F1dG9fcG9pbnQxX3RlbXBfaHlzdC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfYXV0b19wb2ludDJfdGVtcC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfYXV0b19wb2ludDJfdGVtcC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfYXV0b19wb2ludDJfdGVtcC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfY3JpdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfY3JpdC5kZXZfYXR0ci5hdHRyLAogCSZkZXZfYXR0cl90ZW1wMV9jcml0X2VuYWJsZS5hdHRyLAogCSZkZXZfYXR0cl90ZW1wMl9jcml0X2VuYWJsZS5hdHRyLAotCSZkZXZfYXR0cl90ZW1wM19jcml0X2VuYWJsZS5hdHRyLAogCSZkZXZfYXR0cl9jcHUwX3ZpZC5hdHRyLAogCSZkZXZfYXR0cl92cm0uYXR0ciwKIAkmZGV2X2F0dHJfYWxhcm1zLmF0dHIsCkBAIC0xNTU3LDEwICsxNjAxLDggQEAKIAkmZGV2X2F0dHJfcHdtM19lbmFibGUuYXR0ciwKIAkmZGV2X2F0dHJfdGVtcDFfYXV0b19wb2ludDFfcHdtLmF0dHIsCiAJJmRldl9hdHRyX3RlbXAyX2F1dG9fcG9pbnQxX3B3bS5hdHRyLAotCSZkZXZfYXR0cl90ZW1wM19hdXRvX3BvaW50MV9wd20uYXR0ciwKIAkmZGV2X2F0dHJfdGVtcDFfYXV0b19wb2ludDJfcHdtLmF0dHIsCiAJJmRldl9hdHRyX3RlbXAyX2F1dG9fcG9pbnQyX3B3bS5hdHRyLAotCSZkZXZfYXR0cl90ZW1wM19hdXRvX3BvaW50Ml9wd20uYXR0ciwKIAkmZGV2X2F0dHJfYW5hbG9nX291dC5hdHRyLAogCU5VTEwKIH07CkBAIC0xNTY5LDExICsxNjExLDQ1IEBACiAJLmF0dHJzID0gYWRtMTAyNl9hdHRyaWJ1dGVzLAogfTsKIAorc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkbTEwMjZfYXR0cmlidXRlc190ZW1wM1tdID0geworCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19hdXRvX3BvaW50MV90ZW1wLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19hdXRvX3BvaW50MV90ZW1wX2h5c3QuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2F1dG9fcG9pbnQyX3RlbXAuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2NyaXQuZGV2X2F0dHIuYXR0ciwKKwkmZGV2X2F0dHJfdGVtcDNfY3JpdF9lbmFibGUuYXR0ciwKKwkmZGV2X2F0dHJfdGVtcDNfYXV0b19wb2ludDFfcHdtLmF0dHIsCisJJmRldl9hdHRyX3RlbXAzX2F1dG9fcG9pbnQyX3B3bS5hdHRyLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRtMTAyNl9ncm91cF90ZW1wMyA9IHsKKwkuYXR0cnMgPSBhZG0xMDI2X2F0dHJpYnV0ZXNfdGVtcDMsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRtMTAyNl9hdHRyaWJ1dGVzX2luOF85W10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl9pbjhfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luOF9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luOF9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luOF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW45X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjlfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjlfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjlfYWxhcm0uZGV2X2F0dHIuYXR0ciwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkbTEwMjZfZ3JvdXBfaW44XzkgPSB7CisJLmF0dHJzID0gYWRtMTAyNl9hdHRyaWJ1dGVzX2luOF85LAorfTsKKwogc3RhdGljIGludCBhZG0xMDI2X2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLAogCQkJICBpbnQga2luZCkKIHsKIAlpbnQgY29tcGFueSwgdmVyc3RlcDsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGE7CiAJaW50IGVyciA9IDA7CiAJY29uc3QgY2hhciAqdHlwZV9uYW1lID0gIiI7CkBAIC0xNTkyLDI2ICsxNjY4LDI1IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKLQluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKLQlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7Ci0JbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7Ci0JbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7Ci0JbmV3X2NsaWVudC0+ZHJpdmVyID0gJmFkbTEwMjZfZHJpdmVyOwotCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKwljbGllbnQgPSAmZGF0YS0+Y2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOworCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwljbGllbnQtPmRyaXZlciA9ICZhZG0xMDI2X2RyaXZlcjsKIAogCS8qIE5vdywgd2UgZG8gdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24uICovCiAKLQljb21wYW55ID0gYWRtMTAyNl9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEFETTEwMjZfUkVHX0NPTVBBTlkpOwotCXZlcnN0ZXAgPSBhZG0xMDI2X3JlYWRfdmFsdWUobmV3X2NsaWVudCwgQURNMTAyNl9SRUdfVkVSU1RFUCk7CisJY29tcGFueSA9IGFkbTEwMjZfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMjZfUkVHX0NPTVBBTlkpOworCXZlcnN0ZXAgPSBhZG0xMDI2X3JlYWRfdmFsdWUoY2xpZW50LCBBRE0xMDI2X1JFR19WRVJTVEVQKTsKIAotCWRldl9kYmcoJm5ld19jbGllbnQtPmRldiwgIkRldGVjdGluZyBkZXZpY2UgYXQgJWQsMHglMDJ4IHdpdGgiCisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJEZXRlY3RpbmcgZGV2aWNlIGF0ICVkLDB4JTAyeCB3aXRoIgogCQkiIENPTVBBTlk6IDB4JTAyeCBhbmQgVkVSU1RFUDogMHglMDJ4XG4iLAotCQlpMmNfYWRhcHRlcl9pZChuZXdfY2xpZW50LT5hZGFwdGVyKSwgbmV3X2NsaWVudC0+YWRkciwKKwkJaTJjX2FkYXB0ZXJfaWQoY2xpZW50LT5hZGFwdGVyKSwgY2xpZW50LT5hZGRyLAogCQljb21wYW55LCB2ZXJzdGVwKTsKIAogCS8qIElmIGF1dG8tZGV0ZWN0aW5nLCBEZXRlcm1pbmUgdGhlIGNoaXAgdHlwZS4gKi8KIAlpZiAoa2luZCA8PSAwKSB7Ci0JCWRldl9kYmcoJm5ld19jbGllbnQtPmRldiwgIkF1dG9kZXRlY3RpbmcgZGV2aWNlIGF0ICVkLDB4JTAyeCAiCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiQXV0b2RldGVjdGluZyBkZXZpY2UgYXQgJWQsMHglMDJ4ICIKIAkJCSIuLi5cbiIsIGkyY19hZGFwdGVyX2lkKGFkYXB0ZXIpLCBhZGRyZXNzKTsKIAkJaWYgKGNvbXBhbnkgPT0gQURNMTAyNl9DT01QQU5ZX0FOQUxPR19ERVYKIAkJICAgICYmIHZlcnN0ZXAgPT0gQURNMTAyNl9WRVJTVEVQX0FETTEwMjYpIHsKQEAgLTE2MjcsMTYgKzE3MDIsMTUgQEAKIAkJCQl2ZXJzdGVwKTsKIAkJCWtpbmQgPSBhbnlfY2hpcDsKIAkJfSBlbHNlIHsKLQkJCWRldl9kYmcoJm5ld19jbGllbnQtPmRldiwgIjogQXV0b2RldGVjdGlvbiAiCisJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIjogQXV0b2RldGVjdGlvbiAiCiAJCQkJImZhaWxlZFxuIik7CiAJCQkvKiBOb3QgYW4gQURNMTAyNiAuLi4gKi8KLQkJCWlmIChraW5kID09IDApICB7IC8qIFVzZXIgdXNlZCBmb3JjZT14LHkgKi8KKwkJCWlmIChraW5kID09IDApIHsgLyogVXNlciB1c2VkIGZvcmNlPXgseSAqLwogCQkJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgIkdlbmVyaWMgQURNMTAyNiBub3QgIgogCQkJCQkiZm91bmQgYXQgJWQsMHglMDJ4LiAgVHJ5ICIKIAkJCQkJImZvcmNlX2FkbTEwMjYuXG4iLAogCQkJCQlpMmNfYWRhcHRlcl9pZChhZGFwdGVyKSwgYWRkcmVzcyk7CiAJCQl9Ci0JCQllcnIgPSAwOwogCQkJZ290byBleGl0ZnJlZTsKIAkJfQogCX0KQEAgLTE2NTUsMjggKzE3MjksMzQgQEAKIAkJZXJyID0gLUVGQVVMVDsKIAkJZ290byBleGl0ZnJlZTsKIAl9Ci0Jc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCB0eXBlX25hbWUsIEkyQ19OQU1FX1NJWkUpOworCXN0cmxjcHkoY2xpZW50LT5uYW1lLCB0eXBlX25hbWUsIEkyQ19OQU1FX1NJWkUpOwogCiAJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgKi8KLQlkYXRhLT50eXBlID0ga2luZDsKLQlkYXRhLT52YWxpZCA9IDA7CiAJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwogCiAJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLwotCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQorCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KSkpCiAJCWdvdG8gZXhpdGZyZWU7CiAKIAkvKiBTZXQgdGhlIFZSTSB2ZXJzaW9uICovCiAJZGF0YS0+dnJtID0gdmlkX3doaWNoX3ZybSgpOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgQURNMTAyNiBjaGlwICovCi0JYWRtMTAyNl9pbml0X2NsaWVudChuZXdfY2xpZW50KTsKKwlhZG0xMDI2X2luaXRfY2xpZW50KGNsaWVudCk7CiAKIAkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLwotCWlmICgoZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZuZXdfY2xpZW50LT5kZXYua29iaiwgJmFkbTEwMjZfZ3JvdXApKSkKKwlpZiAoKGVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmFkbTEwMjZfZ3JvdXApKSkKIAkJZ290byBleGl0ZGV0YWNoOworCWlmIChkYXRhLT5jb25maWcxICYgQ0ZHMV9BSU44XzkpCisJCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwKKwkJCQkJICZhZG0xMDI2X2dyb3VwX2luOF85KTsKKwllbHNlCisJCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwKKwkJCQkJICZhZG0xMDI2X2dyb3VwX3RlbXAzKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRyZW1vdmU7CiAKLQlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJm5ld19jbGllbnQtPmRldik7CisJZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZjbGllbnQtPmRldik7CiAJaWYgKElTX0VSUihkYXRhLT5od21vbl9kZXYpKSB7CiAJCWVyciA9IFBUUl9FUlIoZGF0YS0+aHdtb25fZGV2KTsKIAkJZ290byBleGl0cmVtb3ZlOwpAQCAtMTY4Niw5ICsxNzY2LDEzIEBACiAKIAkvKiBFcnJvciBvdXQgYW5kIGNsZWFudXAgY29kZSAqLwogZXhpdHJlbW92ZToKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJm5ld19jbGllbnQtPmRldi5rb2JqLCAmYWRtMTAyNl9ncm91cCk7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmYWRtMTAyNl9ncm91cCk7CisJaWYgKGRhdGEtPmNvbmZpZzEgJiBDRkcxX0FJTjhfOSkKKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmYWRtMTAyNl9ncm91cF9pbjhfOSk7CisJZWxzZQorCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZhZG0xMDI2X2dyb3VwX3RlbXAzKTsKIGV4aXRkZXRhY2g6Ci0JaTJjX2RldGFjaF9jbGllbnQobmV3X2NsaWVudCk7CisJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKIGV4aXRmcmVlOgogCWtmcmVlKGRhdGEpOwogZXhpdDoKQEAgLTE3MDAsNiArMTc4NCwxMCBAQAogCXN0cnVjdCBhZG0xMDI2X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwogCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmFkbTEwMjZfZ3JvdXApOworCWlmIChkYXRhLT5jb25maWcxICYgQ0ZHMV9BSU44XzkpCisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmFkbTEwMjZfZ3JvdXBfaW44XzkpOworCWVsc2UKKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmYWRtMTAyNl9ncm91cF90ZW1wMyk7CiAJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKIAlrZnJlZShkYXRhKTsKIAlyZXR1cm4gMDsKQEAgLTE3MTAsMTQgKzE3OTgsMTQgQEAKIAlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmFkbTEwMjZfZHJpdmVyKTsKIH0KIAotc3RhdGljIHZvaWQgIF9fZXhpdCBzbV9hZG0xMDI2X2V4aXQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBzbV9hZG0xMDI2X2V4aXQodm9pZCkKIHsKIAlpMmNfZGVsX2RyaXZlcigmYWRtMTAyNl9kcml2ZXIpOwogfQogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJQaGlsaXAgUG9rb3JueSA8cHBva29ybnlAcGVuZ3VpbmNvbXB1dGluZy5jb20+LCAiCi0gICAgICAgICAgICAgICJKdXN0aW4gVGhpZXNzZW4gPGp0aGllc3NlbkBwZW5ndWluY29tcHV0aW5nLmNvbT4iKTsKKwkgICAgICAiSnVzdGluIFRoaWVzc2VuIDxqdGhpZXNzZW5AcGVuZ3VpbmNvbXB1dGluZy5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkFETTEwMjYgZHJpdmVyIik7CiAKIG1vZHVsZV9pbml0KHNtX2FkbTEwMjZfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FkbTEwMzEuYyBiL2RyaXZlcnMvaHdtb24vYWRtMTAzMS5jCmluZGV4IDM3Y2ZjMTAuLjVhYWFkMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWRtMTAzMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vYWRtMTAzMS5jCkBAIC01LDcgKzUsNyBAQAogICBTdXBwb3J0cyBhZG0xMDMwIC8gYWRtMTAzMQogICBDb3B5cmlnaHQgKEMpIDIwMDQgQWxleGFuZHJlIGQnQWx0b24gPGFsZXhAYWxleGRhbHRvbi5vcmc+CiAgIFJld29ya2VkIGJ5IEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgotICAKKwogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgpAQCAtMjcsMjcgKzI3LDI4IEBACiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAvKiBGb2xsb3dpbmcgbWFjcm9zIHRha2VzIGNoYW5uZWwgcGFyYW1ldGVyIHN0YXJ0aW5nIGZyb20gMCB0byAyICovCiAjZGVmaW5lIEFETTEwMzFfUkVHX0ZBTl9TUEVFRChucikJKDB4MDggKyAobnIpKQotI2RlZmluZSBBRE0xMDMxX1JFR19GQU5fRElWKG5yKQkJKDB4MjAgICsgKG5yKSkKKyNkZWZpbmUgQURNMTAzMV9SRUdfRkFOX0RJVihucikJCSgweDIwICsgKG5yKSkKICNkZWZpbmUgQURNMTAzMV9SRUdfUFdNCQkJKDB4MjIpCiAjZGVmaW5lIEFETTEwMzFfUkVHX0ZBTl9NSU4obnIpCQkoMHgxMCArIChucikpCiAKLSNkZWZpbmUgQURNMTAzMV9SRUdfVEVNUF9NQVgobnIpCSgweDE0ICArIDQqKG5yKSkKLSNkZWZpbmUgQURNMTAzMV9SRUdfVEVNUF9NSU4obnIpCSgweDE1ICArIDQqKG5yKSkKLSNkZWZpbmUgQURNMTAzMV9SRUdfVEVNUF9DUklUKG5yKQkoMHgxNiAgKyA0KihucikpCisjZGVmaW5lIEFETTEwMzFfUkVHX1RFTVBfTUFYKG5yKQkoMHgxNCArIDQgKiAobnIpKQorI2RlZmluZSBBRE0xMDMxX1JFR19URU1QX01JTihucikJKDB4MTUgKyA0ICogKG5yKSkKKyNkZWZpbmUgQURNMTAzMV9SRUdfVEVNUF9DUklUKG5yKQkoMHgxNiArIDQgKiAobnIpKQogCi0jZGVmaW5lIEFETTEwMzFfUkVHX1RFTVAobnIpCQkoMHhhICsgKG5yKSkKKyNkZWZpbmUgQURNMTAzMV9SRUdfVEVNUChucikJCSgweDBhICsgKG5yKSkKICNkZWZpbmUgQURNMTAzMV9SRUdfQVVUT19URU1QKG5yKQkoMHgyNCArIChucikpCiAKICNkZWZpbmUgQURNMTAzMV9SRUdfU1RBVFVTKG5yKQkJKDB4MiArIChucikpCiAKLSNkZWZpbmUgQURNMTAzMV9SRUdfQ09ORjEJCTB4MAotI2RlZmluZSBBRE0xMDMxX1JFR19DT05GMgkJMHgxCi0jZGVmaW5lIEFETTEwMzFfUkVHX0VYVF9URU1QCQkweDYKKyNkZWZpbmUgQURNMTAzMV9SRUdfQ09ORjEJCTB4MDAKKyNkZWZpbmUgQURNMTAzMV9SRUdfQ09ORjIJCTB4MDEKKyNkZWZpbmUgQURNMTAzMV9SRUdfRVhUX1RFTVAJCTB4MDYKIAogI2RlZmluZSBBRE0xMDMxX0NPTkYxX01PTklUT1JfRU5BQkxFCTB4MDEJLyogTW9uaXRvcmluZyBlbmFibGUgKi8KICNkZWZpbmUgQURNMTAzMV9DT05GMV9QV01fSU5WRVJUCTB4MDgJLyogUFdNIEludmVydCAqLwpAQCAtNzgsNyArNzksNyBAQAogCS8qIFRoZSBjaGFuX3NlbGVjdF90YWJsZSBjb250YWlucyB0aGUgcG9zc2libGUgY29uZmlndXJhdGlvbnMgZm9yCiAJICogYXV0byBmYW4gY29udHJvbC4KIAkgKi8KLQlhdXRvX2NoYW5fdGFibGVfdCAqY2hhbl9zZWxlY3RfdGFibGU7CisJY29uc3QgYXV0b19jaGFuX3RhYmxlX3QgKmNoYW5fc2VsZWN0X3RhYmxlOwogCXUxNiBhbGFybTsKIAl1OCBjb25mMTsKIAl1OCBjb25mMjsKQEAgLTE4MSwyNSArMTgyLDI1IEBACiAjZGVmaW5lIEdFVF9GQU5fQVVUT19CSVRGSUVMRChkYXRhLCBpZHgpCVwKIAkoKihkYXRhKS0+Y2hhbl9zZWxlY3RfdGFibGUpW0ZBTl9DSEFOX0ZST01fUkVHKChkYXRhKS0+Y29uZjEpXVtpZHglMl0KIAotLyogVGhlIHRhYmxlcyBiZWxvdyBjb250YWlucyB0aGUgcG9zc2libGUgdmFsdWVzIGZvciB0aGUgYXV0byBmYW4gCisvKiBUaGUgdGFibGVzIGJlbG93IGNvbnRhaW5zIHRoZSBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBhdXRvIGZhbgogICogY29udHJvbCBiaXRmaWVsZHMuIHRoZSBpbmRleCBpbiB0aGUgdGFibGUgaXMgdGhlIHJlZ2lzdGVyIHZhbHVlLgogICogTVNiIGlzIHRoZSBhdXRvIGZhbiBjb250cm9sIGVuYWJsZSBiaXQsIHNvIHRoZSBmb3VyIGZpcnN0IGVudHJpZXMKICAqIGluIHRoZSB0YWJsZSBkaXNhYmxlcyBhdXRvIGZhbiBjb250cm9sIHdoZW4gYm90aCBiaXRmaWVsZHMgYXJlIHplcm8uCiAgKi8KLXN0YXRpYyBhdXRvX2NoYW5fdGFibGVfdCBhdXRvX2NoYW5uZWxfc2VsZWN0X3RhYmxlX2FkbTEwMzEgPSB7Ci0JezAsIDB9LCB7MCwgMH0sIHswLCAwfSwgezAsIDB9LAotCXsyIC8qMGIwMTAgKi8gLCA0IC8qMGIxMDAgKi8gfSwKLQl7MiAvKjBiMDEwICovICwgMiAvKjBiMDEwICovIH0sCi0JezQgLyowYjEwMCAqLyAsIDQgLyowYjEwMCAqLyB9LAotCXs3IC8qMGIxMTEgKi8gLCA3IC8qMGIxMTEgKi8gfSwKK3N0YXRpYyBjb25zdCBhdXRvX2NoYW5fdGFibGVfdCBhdXRvX2NoYW5uZWxfc2VsZWN0X3RhYmxlX2FkbTEwMzEgPSB7CisJeyAwLCAwIH0sIHsgMCwgMCB9LCB7IDAsIDAgfSwgeyAwLCAwIH0sCisJeyAyIC8qIDBiMDEwICovICwgNCAvKiAwYjEwMCAqLyB9LAorCXsgMiAvKiAwYjAxMCAqLyAsIDIgLyogMGIwMTAgKi8gfSwKKwl7IDQgLyogMGIxMDAgKi8gLCA0IC8qIDBiMTAwICovIH0sCisJeyA3IC8qIDBiMTExICovICwgNyAvKiAwYjExMSAqLyB9LAogfTsKIAotc3RhdGljIGF1dG9fY2hhbl90YWJsZV90IGF1dG9fY2hhbm5lbF9zZWxlY3RfdGFibGVfYWRtMTAzMCA9IHsKLQl7MCwgMH0sIHswLCAwfSwgezAsIDB9LCB7MCwgMH0sCi0JezIgLyowYjEwICovCQksIDB9LAotCXsweGZmIC8qaW52YWxpZCAqLwksIDB9LAotCXsweGZmIC8qaW52YWxpZCAqLwksIDB9LAotCXszIC8qMGIxMSAqLwkJLCAwfSwKK3N0YXRpYyBjb25zdCBhdXRvX2NoYW5fdGFibGVfdCBhdXRvX2NoYW5uZWxfc2VsZWN0X3RhYmxlX2FkbTEwMzAgPSB7CisJeyAwLCAwIH0sIHsgMCwgMCB9LCB7IDAsIDAgfSwgeyAwLCAwIH0sCisJeyAyIC8qIDBiMTAgKi8JCSwgMCB9LAorCXsgMHhmZiAvKiBpbnZhbGlkICovCSwgMCB9LAorCXsgMHhmZiAvKiBpbnZhbGlkICovCSwgMCB9LAorCXsgMyAvKiAwYjExICovCQksIDAgfSwKIH07CiAKIC8qIFRoYXQgZnVuY3Rpb24gY2hlY2tzIGlmIGEgYml0ZmllbGQgaXMgdmFsaWQgYW5kIHJldHVybnMgdGhlIG90aGVyIGJpdGZpZWxkCkBAIC0yMjgsOCArMjI5LDggQEAKIAkJCWJyZWFrOwogCQl9IGVsc2UgaWYgKHZhbCA9PSAoKmRhdGEtPmNoYW5fc2VsZWN0X3RhYmxlKVtpXVtjaGFuXSAmJgogCQkJICAgZmlyc3RfbWF0Y2ggPT0gLTEpIHsKLQkJCS8qIFNhdmUgdGhlIGZpcnN0IG1hdGNoIGluIGNhc2Ugb2YgYW4gZXhhY3QgbWF0Y2ggaGFzIG5vdCBiZWVuCi0JCQkgKiBmb3VuZCAKKwkJCS8qIFNhdmUgdGhlIGZpcnN0IG1hdGNoIGluIGNhc2Ugb2YgYW4gZXhhY3QgbWF0Y2ggaGFzCisJCQkgKiBub3QgYmVlbiBmb3VuZAogCQkJICovCiAJCQlmaXJzdF9tYXRjaCA9IGk7CiAJCX0KQEAgLTI0NSwxNyArMjQ2LDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2F1dG9fY2hhbm5lbChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fYXV0b19jaGFubmVsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKIAlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gYWRtMTAzMV91cGRhdGVfZGV2aWNlKGRldik7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIEdFVF9GQU5fQVVUT19CSVRGSUVMRChkYXRhLCBucikpOwogfQogCiBzdGF0aWMgc3NpemVfdAotc2V0X2Zhbl9hdXRvX2NoYW5uZWwoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG5yKQorc2V0X2Zhbl9hdXRvX2NoYW5uZWwoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwogCXN0cnVjdCBhZG0xMDMxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OwogCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwogCXU4IHJlZzsKIAlpbnQgcmV0OwpAQCAtMjY0LDE2ICsyNjksMTcgQEAKIAlvbGRfZmFuX21vZGUgPSBkYXRhLT5jb25mMTsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQkKKwogCWlmICgocmV0ID0gZ2V0X2Zhbl9hdXRvX25lYXJlc3QoZGF0YSwgbnIsIHZhbCwgZGF0YS0+Y29uZjEsICZyZWcpKSkgewogCQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0JaWYgKCgoZGF0YS0+Y29uZjEgPSBGQU5fQ0hBTl9UT19SRUcocmVnLCBkYXRhLT5jb25mMSkpICYgQURNMTAzMV9DT05GMV9BVVRPX01PREUpIF4gCisJZGF0YS0+Y29uZjEgPSBGQU5fQ0hBTl9UT19SRUcocmVnLCBkYXRhLT5jb25mMSk7CisJaWYgKChkYXRhLT5jb25mMSAmIEFETTEwMzFfQ09ORjFfQVVUT19NT0RFKSBeCiAJICAgIChvbGRfZmFuX21vZGUgJiBBRE0xMDMxX0NPTkYxX0FVVE9fTU9ERSkpIHsKIAkJaWYgKGRhdGEtPmNvbmYxICYgQURNMTAzMV9DT05GMV9BVVRPX01PREUpewotCQkJLyogU3dpdGNoIHRvIEF1dG8gRmFuIE1vZGUgCi0JCQkgKiBTYXZlIFBXTSByZWdpc3RlcnMgCisJCQkvKiBTd2l0Y2ggdG8gQXV0byBGYW4gTW9kZQorCQkJICogU2F2ZSBQV00gcmVnaXN0ZXJzCiAJCQkgKiBTZXQgUFdNIHJlZ2lzdGVycyB0byAzMyUgQm90aCAqLwogCQkJZGF0YS0+b2xkX3B3bVswXSA9IGRhdGEtPnB3bVswXTsKIAkJCWRhdGEtPm9sZF9wd21bMV0gPSBkYXRhLT5wd21bMV07CkBAIC0yODMsNyArMjg5LDcgQEAKIAkJCWRhdGEtPnB3bVswXSA9IGRhdGEtPm9sZF9wd21bMF07CiAJCQlkYXRhLT5wd21bMV0gPSBkYXRhLT5vbGRfcHdtWzFdOwogCQkJLyogUmVzdG9yZSBQV00gcmVnaXN0ZXJzICovCi0JCQlhZG0xMDMxX3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAzMV9SRUdfUFdNLCAKKwkJCWFkbTEwMzFfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDMxX1JFR19QV00sCiAJCQkJCSAgICBkYXRhLT5wd21bMF0gfCAoZGF0YS0+cHdtWzFdIDw8IDQpKTsKIAkJfQogCX0KQEAgLTI5Myw0MSArMjk5LDM1IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi0jZGVmaW5lIGZhbl9hdXRvX2NoYW5uZWxfb2Zmc2V0KG9mZnNldCkJCQkJCQlcCi1zdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9hdXRvX2NoYW5uZWxfIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAotewkJCQkJCQkJCQlcCi0JcmV0dXJuIHNob3dfZmFuX2F1dG9fY2hhbm5lbChkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAotfQkJCQkJCQkJCQlcCi1zdGF0aWMgc3NpemVfdCBzZXRfZmFuX2F1dG9fY2hhbm5lbF8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJCVwKLQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJCQkJCQlcCi17CQkJCQkJCQkJCVwKLQlyZXR1cm4gc2V0X2Zhbl9hdXRvX2NoYW5uZWwoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCVwKLX0JCQkJCQkJCQkJXAotc3RhdGljIERFVklDRV9BVFRSKGF1dG9fZmFuIyNvZmZzZXQjI19jaGFubmVsLCBTX0lSVUdPIHwgU19JV1VTUiwJCVwKLQkJICAgc2hvd19mYW5fYXV0b19jaGFubmVsXyMjb2Zmc2V0LAkJCQlcCi0JCSAgIHNldF9mYW5fYXV0b19jaGFubmVsXyMjb2Zmc2V0KQotCi1mYW5fYXV0b19jaGFubmVsX29mZnNldCgxKTsKLWZhbl9hdXRvX2NoYW5uZWxfb2Zmc2V0KDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihhdXRvX2ZhbjFfY2hhbm5lbCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCXNob3dfZmFuX2F1dG9fY2hhbm5lbCwgc2V0X2Zhbl9hdXRvX2NoYW5uZWwsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihhdXRvX2ZhbjJfY2hhbm5lbCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCXNob3dfZmFuX2F1dG9fY2hhbm5lbCwgc2V0X2Zhbl9hdXRvX2NoYW5uZWwsIDEpOwogCiAvKiBBdXRvIFRlbXBzICovCi1zdGF0aWMgc3NpemVfdCBzaG93X2F1dG9fdGVtcF9vZmYoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3N0YXRpYyBzc2l6ZV90IHNob3dfYXV0b190ZW1wX29mZihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogeworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CiAJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGFkbTEwMzFfdXBkYXRlX2RldmljZShkZXYpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKIAkJICAgICAgIEFVVE9fVEVNUF9PRkZfRlJPTV9SRUcoZGF0YS0+YXV0b190ZW1wW25yXSkpOwogfQotc3RhdGljIHNzaXplX3Qgc2hvd19hdXRvX3RlbXBfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCitzdGF0aWMgc3NpemVfdCBzaG93X2F1dG9fdGVtcF9taW4oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OwogCXN0cnVjdCBhZG0xMDMxX2RhdGEgKmRhdGEgPSBhZG0xMDMxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKIAkJICAgICAgIEFVVE9fVEVNUF9NSU5fRlJPTV9SRUcoZGF0YS0+YXV0b190ZW1wW25yXSkpOwogfQogc3RhdGljIHNzaXplX3QKLXNldF9hdXRvX3RlbXBfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBucikKK3NldF9hdXRvX3RlbXBfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKIAlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKIAlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKQEAgLTMzNywxNyArMzM3LDIxIEBACiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJcmV0dXJuIGNvdW50OwogfQotc3RhdGljIHNzaXplX3Qgc2hvd19hdXRvX3RlbXBfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCitzdGF0aWMgc3NpemVfdCBzaG93X2F1dG9fdGVtcF9tYXgoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OwogCXN0cnVjdCBhZG0xMDMxX2RhdGEgKmRhdGEgPSBhZG0xMDMxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKIAkJICAgICAgIEFVVE9fVEVNUF9NQVhfRlJPTV9SRUcoZGF0YS0+YXV0b190ZW1wW25yXSkpOwogfQogc3RhdGljIHNzaXplX3QKLXNldF9hdXRvX3RlbXBfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBucikKK3NldF9hdXRvX3RlbXBfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKIAlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKIAlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKQEAgLTM1OCw1NiArMzYyLDM3IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi0jZGVmaW5lIGF1dG9fdGVtcF9yZWcob2Zmc2V0KQkJCQkJCQlcCi1zdGF0aWMgc3NpemVfdCBzaG93X2F1dG9fdGVtcF8jI29mZnNldCMjX29mZiAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQlcCi17CQkJCQkJCQkJCVwKLQlyZXR1cm4gc2hvd19hdXRvX3RlbXBfb2ZmKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCi19CQkJCQkJCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHNob3dfYXV0b190ZW1wXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCVwKLXsJCQkJCQkJCQkJXAotCXJldHVybiBzaG93X2F1dG9fdGVtcF9taW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKLX0JCQkJCQkJCQkJXAotc3RhdGljIHNzaXplX3Qgc2hvd19hdXRvX3RlbXBfIyNvZmZzZXQjI19tYXggKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAotewkJCQkJCQkJCQlcCi0JcmV0dXJuIHNob3dfYXV0b190ZW1wX21heChkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAotfQkJCQkJCQkJCQlcCi1zdGF0aWMgc3NpemVfdCBzZXRfYXV0b190ZW1wXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAkJXAotCQkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCi17CQkJCQkJCQkJCVwKLQlyZXR1cm4gc2V0X2F1dG9fdGVtcF9taW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCVwKLX0JCQkJCQkJCQkJXAotc3RhdGljIHNzaXplX3Qgc2V0X2F1dG9fdGVtcF8jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJCVwKLQkJCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJXAotewkJCQkJCQkJCQlcCi0JcmV0dXJuIHNldF9hdXRvX3RlbXBfbWF4KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCi19CQkJCQkJCQkJCVwKLXN0YXRpYyBERVZJQ0VfQVRUUihhdXRvX3RlbXAjI29mZnNldCMjX29mZiwgU19JUlVHTywJCQkJXAotCQkgICBzaG93X2F1dG9fdGVtcF8jI29mZnNldCMjX29mZiwgTlVMTCk7CQkJXAotc3RhdGljIERFVklDRV9BVFRSKGF1dG9fdGVtcCMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwJCQlcCi0JCSAgIHNob3dfYXV0b190ZW1wXyMjb2Zmc2V0IyNfbWluLCBzZXRfYXV0b190ZW1wXyMjb2Zmc2V0IyNfbWluKTtcCi1zdGF0aWMgREVWSUNFX0FUVFIoYXV0b190ZW1wIyNvZmZzZXQjI19tYXgsIFNfSVJVR08gfCBTX0lXVVNSLAkJCVwKLQkJICAgc2hvd19hdXRvX3RlbXBfIyNvZmZzZXQjI19tYXgsIHNldF9hdXRvX3RlbXBfIyNvZmZzZXQjI19tYXgpCisjZGVmaW5lIGF1dG9fdGVtcF9yZWcob2Zmc2V0KQkJCQkJCVwKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoYXV0b190ZW1wIyNvZmZzZXQjI19vZmYsIFNfSVJVR08sCQlcCisJCXNob3dfYXV0b190ZW1wX29mZiwgTlVMTCwgb2Zmc2V0IC0gMSk7CQkJXAorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihhdXRvX3RlbXAjI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsCVwKKwkJc2hvd19hdXRvX3RlbXBfbWluLCBzZXRfYXV0b190ZW1wX21pbiwgb2Zmc2V0IC0gMSk7CVwKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoYXV0b190ZW1wIyNvZmZzZXQjI19tYXgsIFNfSVJVR08gfCBTX0lXVVNSLAlcCisJCXNob3dfYXV0b190ZW1wX21heCwgc2V0X2F1dG9fdGVtcF9tYXgsIG9mZnNldCAtIDEpCiAKIGF1dG9fdGVtcF9yZWcoMSk7CiBhdXRvX3RlbXBfcmVnKDIpOwogYXV0b190ZW1wX3JlZygzKTsKIAogLyogcHdtICovCi1zdGF0aWMgc3NpemVfdCBzaG93X3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQorc3RhdGljIHNzaXplX3Qgc2hvd19wd20oc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OwogCXN0cnVjdCBhZG0xMDMxX2RhdGEgKmRhdGEgPSBhZG0xMDMxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgUFdNX0ZST01fUkVHKGRhdGEtPnB3bVtucl0pKTsKIH0KLXN0YXRpYyBzc2l6ZV90Ci1zZXRfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBucikKK3N0YXRpYyBzc2l6ZV90IHNldF9wd20oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CiAJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CiAJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CiAJaW50IHJlZzsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlpZiAoKGRhdGEtPmNvbmYxICYgQURNMTAzMV9DT05GMV9BVVRPX01PREUpICYmIAorCWlmICgoZGF0YS0+Y29uZjEgJiBBRE0xMDMxX0NPTkYxX0FVVE9fTU9ERSkgJiYKIAkgICAgKCgodmFsPj40KSAmIDB4ZikgIT0gNSkpIHsKIAkJLyogSW4gYXV0b21hdGljIG1vZGUsIHRoZSBvbmx5IFBXTSBhY2NlcHRlZCBpcyAzMyUgKi8KIAkJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CkBAIC00MjIsMjEgKzQwNywxMiBAQAogCXJldHVybiBjb3VudDsKIH0KIAotI2RlZmluZSBwd21fcmVnKG9mZnNldCkJCQkJCQkJXAotc3RhdGljIHNzaXplX3Qgc2hvd19wd21fIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAotewkJCQkJCQkJCVwKLQlyZXR1cm4gc2hvd19wd20oZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKLX0JCQkJCQkJCQlcCi1zdGF0aWMgc3NpemVfdCBzZXRfcHdtXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAkJCVwKLQkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQlcCi17CQkJCQkJCQkJXAotCXJldHVybiBzZXRfcHdtKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCi19CQkJCQkJCQkJXAotc3RhdGljIERFVklDRV9BVFRSKHB3bSMjb2Zmc2V0LCBTX0lSVUdPIHwgU19JV1VTUiwJCQlcCi0JCSAgIHNob3dfcHdtXyMjb2Zmc2V0LCBzZXRfcHdtXyMjb2Zmc2V0KQotCi1wd21fcmVnKDEpOwotcHdtX3JlZygyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfcHdtLCBzZXRfcHdtLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMiwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfcHdtLCBzZXRfcHdtLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoYXV0b19mYW4xX21pbl9wd20sIFNfSVJVR08gfCBTX0lXVVNSLAorCQlzaG93X3B3bSwgc2V0X3B3bSwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGF1dG9fZmFuMl9taW5fcHdtLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJc2hvd19wd20sIHNldF9wd20sIDEpOwogCiAvKiBGYW5zICovCiAKQEAgLTQ3MSw3ICs0NDcsNyBAQAogCQkJICAgIEFVVE9fVEVNUF9NSU5fRlJPTV9SRUdfREVHKGRhdGEtPmF1dG9fdGVtcFswXSkKIAkJCSAgICB8fCBkYXRhLT50ZW1wWzFdID49CiAJCQkgICAgQVVUT19URU1QX01JTl9GUk9NX1JFR19ERUcoZGF0YS0+YXV0b190ZW1wWzFdKQotCQkJICAgIHx8IChkYXRhLT5jaGlwX3R5cGUgPT0gYWRtMTAzMSAKKwkJCSAgICB8fCAoZGF0YS0+Y2hpcF90eXBlID09IGFkbTEwMzEKIAkJCQkmJiBkYXRhLT50ZW1wWzJdID49CiAJCQkJQVVUT19URU1QX01JTl9GUk9NX1JFR19ERUcoZGF0YS0+YXV0b190ZW1wWzJdKSk7CiAJCQlicmVhazsKQEAgLTQ4Myw4ICs0NTksMTAgQEAKIH0KIAogCi1zdGF0aWMgc3NpemVfdCBzaG93X2ZhbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQorc3RhdGljIHNzaXplX3Qgc2hvd19mYW4oc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OwogCXN0cnVjdCBhZG0xMDMxX2RhdGEgKmRhdGEgPSBhZG0xMDMxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKIAlpbnQgdmFsdWU7CiAKQEAgLTQ5MywyOCArNDcxLDMzIEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbHVlKTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKIAlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gYWRtMTAzMV91cGRhdGVfZGV2aWNlKGRldik7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIEZBTl9ESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKIH0KLXN0YXRpYyBzc2l6ZV90IHNob3dfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogeworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CiAJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGFkbTEwMzFfdXBkYXRlX2RldmljZShkZXYpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAogCQkgICAgICAgRkFOX0ZST01fUkVHKGRhdGEtPmZhbl9taW5bbnJdLAogCQkJCSAgICBGQU5fRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkpOwogfQotc3RhdGljIHNzaXplX3QKLXNldF9mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBucikKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwogCXN0cnVjdCBhZG0xMDMxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OwogCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCWlmICh2YWwpIHsKLQkJZGF0YS0+ZmFuX21pbltucl0gPSAKKwkJZGF0YS0+ZmFuX21pbltucl0gPQogCQkJRkFOX1RPX1JFRyh2YWwsIEZBTl9ESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKIAl9IGVsc2UgewogCQlkYXRhLT5mYW5fbWluW25yXSA9IDB4ZmY7CkBAIC01MjMsMTEgKzUwNiwxMiBAQAogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCXJldHVybiBjb3VudDsKIH0KLXN0YXRpYyBzc2l6ZV90Ci1zZXRfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbnIpCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKIAlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKIAlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKIAl1OCB0bXA7CiAJaW50IG9sZF9kaXY7CkBAIC01MzUsNjggKzUxOSw1MyBAQAogCiAJdG1wID0gdmFsID09IDggPyAweGMwIDoKIAkgICAgICB2YWwgPT0gNCA/IDB4ODAgOgotCSAgICAgIHZhbCA9PSAyID8gMHg0MCA6CQotCSAgICAgIHZhbCA9PSAxID8gMHgwMCA6ICAKKwkgICAgICB2YWwgPT0gMiA/IDB4NDAgOgorCSAgICAgIHZhbCA9PSAxID8gMHgwMCA6CiAJICAgICAgMHhmZjsKIAlpZiAodG1wID09IDB4ZmYpCiAJCXJldHVybiAtRUlOVkFMOwotCQotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlvbGRfZGl2ID0gRkFOX0RJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSk7Ci0JZGF0YS0+ZmFuX2Rpdltucl0gPSAodG1wICYgMHhDMCkgfCAoMHgzZiAmIGRhdGEtPmZhbl9kaXZbbnJdKTsKLQluZXdfbWluID0gZGF0YS0+ZmFuX21pbltucl0gKiBvbGRfZGl2IC8gCi0JCUZBTl9ESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pOwotCWRhdGEtPmZhbl9taW5bbnJdID0gbmV3X21pbiA+IDB4ZmYgPyAweGZmIDogbmV3X21pbjsKLQlkYXRhLT5mYW5bbnJdID0gZGF0YS0+ZmFuW25yXSAqIG9sZF9kaXYgLyAKLQkJRkFOX0RJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSk7CiAKLQlhZG0xMDMxX3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAzMV9SRUdfRkFOX0RJVihuciksIAorCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkvKiBHZXQgZnJlc2ggcmVhZGluZ3MgKi8KKwlkYXRhLT5mYW5fZGl2W25yXSA9IGFkbTEwMzFfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCSAgICAgICBBRE0xMDMxX1JFR19GQU5fRElWKG5yKSk7CisJZGF0YS0+ZmFuX21pbltucl0gPSBhZG0xMDMxX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkgICAgICAgQURNMTAzMV9SRUdfRkFOX01JTihucikpOworCisJLyogV3JpdGUgdGhlIG5ldyBjbG9jayBkaXZpZGVyIGFuZCBmYW4gbWluICovCisJb2xkX2RpdiA9IEZBTl9ESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pOworCWRhdGEtPmZhbl9kaXZbbnJdID0gdG1wIHwgKDB4M2YgJiBkYXRhLT5mYW5fZGl2W25yXSk7CisJbmV3X21pbiA9IGRhdGEtPmZhbl9taW5bbnJdICogb2xkX2RpdiAvIHZhbDsKKwlkYXRhLT5mYW5fbWluW25yXSA9IG5ld19taW4gPiAweGZmID8gMHhmZiA6IG5ld19taW47CisKKwlhZG0xMDMxX3dyaXRlX3ZhbHVlKGNsaWVudCwgQURNMTAzMV9SRUdfRkFOX0RJVihuciksCiAJCQkgICAgZGF0YS0+ZmFuX2Rpdltucl0pOwotCWFkbTEwMzFfd3JpdGVfdmFsdWUoY2xpZW50LCBBRE0xMDMxX1JFR19GQU5fTUlOKG5yKSwgCisJYWRtMTAzMV93cml0ZV92YWx1ZShjbGllbnQsIEFETTEwMzFfUkVHX0ZBTl9NSU4obnIpLAogCQkJICAgIGRhdGEtPmZhbl9taW5bbnJdKTsKKworCS8qIEludmFsaWRhdGUgdGhlIGNhY2hlOiBmYW4gc3BlZWQgaXMgbm8gbG9uZ2VyIHZhbGlkICovCisJZGF0YS0+dmFsaWQgPSAwOwogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCXJldHVybiBjb3VudDsKIH0KIAogI2RlZmluZSBmYW5fb2Zmc2V0KG9mZnNldCkJCQkJCQlcCi1zdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQlcCi17CQkJCQkJCQkJXAotCXJldHVybiBzaG93X2ZhbihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAotfQkJCQkJCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCVwKLXsJCQkJCQkJCQlcCi0JcmV0dXJuIHNob3dfZmFuX21pbihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAotfQkJCQkJCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IyNfZGl2IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCVwKLXsJCQkJCQkJCQlcCi0JcmV0dXJuIHNob3dfZmFuX2RpdihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAotfQkJCQkJCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHNldF9mYW5fIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCQlcCi0JY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQkJCQlcCi17CQkJCQkJCQkJXAotCXJldHVybiBzZXRfZmFuX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAotfQkJCQkJCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHNldF9mYW5fIyNvZmZzZXQjI19kaXYgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCQlcCi0JY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQkJCQlcCi17CQkJCQkJCQkJXAotCXJldHVybiBzZXRfZmFuX2RpdihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAotfQkJCQkJCQkJCVwKLXN0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X2Zhbl8jI29mZnNldCwJXAotCQkgICBOVUxMKTsJCQkJCQlcCi1zdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLAkJXAotCQkgICBzaG93X2Zhbl8jI29mZnNldCMjX21pbiwgc2V0X2Zhbl8jI29mZnNldCMjX21pbik7CVwKLXN0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2RpdiwgU19JUlVHTyB8IFNfSVdVU1IsCQlcCi0JCSAgIHNob3dfZmFuXyMjb2Zmc2V0IyNfZGl2LCBzZXRfZmFuXyMjb2Zmc2V0IyNfZGl2KTsJXAotc3RhdGljIERFVklDRV9BVFRSKGF1dG9fZmFuIyNvZmZzZXQjI19taW5fcHdtLCBTX0lSVUdPIHwgU19JV1VTUiwJXAotCQkgICBzaG93X3B3bV8jI29mZnNldCwgc2V0X3B3bV8jI29mZnNldCkKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywJCQlcCisJCXNob3dfZmFuLCBOVUxMLCBvZmZzZXQgLSAxKTsJCQkJXAorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsCQlcCisJCXNob3dfZmFuX21pbiwgc2V0X2Zhbl9taW4sIG9mZnNldCAtIDEpOwkJCVwKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19kaXYsIFNfSVJVR08gfCBTX0lXVVNSLAkJXAorCQlzaG93X2Zhbl9kaXYsIHNldF9mYW5fZGl2LCBvZmZzZXQgLSAxKQogCiBmYW5fb2Zmc2V0KDEpOwogZmFuX29mZnNldCgyKTsKIAogCiAvKiBUZW1wcyAqLwotc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAorCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKIAlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gYWRtMTAzMV91cGRhdGVfZGV2aWNlKGRldik7CiAJaW50IGV4dDsKIAlleHQgPSBuciA9PSAwID8KQEAgLTYwNCwyNiArNTczLDMzIEBACiAJICAgICgoKGRhdGEtPmV4dF90ZW1wW25yXSA+PiAoKG5yIC0gMSkgKiAzKSkgJiA3KSk7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUdfRVhUKGRhdGEtPnRlbXBbbnJdLCBleHQpKTsKIH0KLXN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9taW4oc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogeworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CiAJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGFkbTEwMzFfdXBkYXRlX2RldmljZShkZXYpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfbWluW25yXSkpOwogfQotc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKIAlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gYWRtMTAzMV91cGRhdGVfZGV2aWNlKGRldik7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9tYXhbbnJdKSk7CiB9Ci1zdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfY3JpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQorc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2NyaXQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OwogCXN0cnVjdCBhZG0xMDMxX2RhdGEgKmRhdGEgPSBhZG0xMDMxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX2NyaXRbbnJdKSk7CiB9Ci1zdGF0aWMgc3NpemVfdAotc2V0X3RlbXBfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBucikKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CiAJc3RydWN0IGFkbTEwMzFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CiAJaW50IHZhbDsKIAogCXZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CkBAIC02MzUsMTEgKzYxMSwxMiBAQAogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCXJldHVybiBjb3VudDsKIH0KLXN0YXRpYyBzc2l6ZV90Ci1zZXRfdGVtcF9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG5yKQorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKIAlzdHJ1Y3QgYWRtMTAzMV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKIAlpbnQgdmFsOwogCiAJdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKQEAgLTY1MSwxMSArNjI4LDEyIEBACiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJcmV0dXJuIGNvdW50OwogfQotc3RhdGljIHNzaXplX3QKLXNldF90ZW1wX2NyaXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG5yKQorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfY3JpdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwogCXN0cnVjdCBhZG0xMDMxX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OwogCWludCB2YWw7CiAKIAl2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwpAQCAtNjY4LDQ2ICs2NDYsMTUgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLSNkZWZpbmUgdGVtcF9yZWcob2Zmc2V0KQkJCQkJCQlcCi1zdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKLXsJCQkJCQkJCQkJXAotCXJldHVybiBzaG93X3RlbXAoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCQlcCi19CQkJCQkJCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF8jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQkJXAotewkJCQkJCQkJCQlcCi0JcmV0dXJuIHNob3dfdGVtcF9taW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCQlcCi19CQkJCQkJCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF8jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQkJXAotewkJCQkJCQkJCQlcCi0JcmV0dXJuIHNob3dfdGVtcF9tYXgoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCQlcCi19CQkJCQkJCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF8jI29mZnNldCMjX2NyaXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAotewkJCQkJCQkJCQlcCi0JcmV0dXJuIHNob3dfdGVtcF9jcml0KGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCi19CQkJCQkJCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHNldF90ZW1wXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAkJCVwKLQkJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQlcCi17CQkJCQkJCQkJCVwKLQlyZXR1cm4gc2V0X3RlbXBfbWluKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQkJXAotfQkJCQkJCQkJCQlcCi1zdGF0aWMgc3NpemVfdCBzZXRfdGVtcF8jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJCQlcCi0JCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJXAotewkJCQkJCQkJCQlcCi0JcmV0dXJuIHNldF90ZW1wX21heChkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJCVwKLX0JCQkJCQkJCQkJXAotc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfIyNvZmZzZXQjI19jcml0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAkJCVwKLQkJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJXAotewkJCQkJCQkJCQlcCi0JcmV0dXJuIHNldF90ZW1wX2NyaXQoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCQlcCi19CQkJCQkJCQkJCVwKLXN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wXyMjb2Zmc2V0LAkJXAotCQkgICBOVUxMKTsJCQkJCQkJXAotc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsCQkJXAotCQkgICBzaG93X3RlbXBfIyNvZmZzZXQjI19taW4sIHNldF90ZW1wXyMjb2Zmc2V0IyNfbWluKTsJCVwKLXN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19tYXgsIFNfSVJVR08gfCBTX0lXVVNSLAkJCVwKLQkJICAgc2hvd190ZW1wXyMjb2Zmc2V0IyNfbWF4LCBzZXRfdGVtcF8jI29mZnNldCMjX21heCk7CQlcCi1zdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfY3JpdCwgU19JUlVHTyB8IFNfSVdVU1IsCQkJXAotCQkgICBzaG93X3RlbXBfIyNvZmZzZXQjI19jcml0LCBzZXRfdGVtcF8jI29mZnNldCMjX2NyaXQpCisjZGVmaW5lIHRlbXBfcmVnKG9mZnNldCkJCQkJCQlcCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLAkJXAorCQlzaG93X3RlbXAsIE5VTEwsIG9mZnNldCAtIDEpOwkJCQlcCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsCVwKKwkJc2hvd190ZW1wX21pbiwgc2V0X3RlbXBfbWluLCBvZmZzZXQgLSAxKTsJCVwKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwJXAorCQlzaG93X3RlbXBfbWF4LCBzZXRfdGVtcF9tYXgsIG9mZnNldCAtIDEpOwkJXAorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19jcml0LCBTX0lSVUdPIHwgU19JV1VTUiwJXAorCQlzaG93X3RlbXBfY3JpdCwgc2V0X3RlbXBfY3JpdCwgb2Zmc2V0IC0gMSkKIAogdGVtcF9yZWcoMSk7CiB0ZW1wX3JlZygyKTsKQEAgLTcyMiw2ICs2NjksMjkgQEAKIAogc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgc2hvd19hbGFybXMsIE5VTEwpOwogCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgYml0bnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXN0cnVjdCBhZG0xMDMxX2RhdGEgKmRhdGEgPSBhZG0xMDMxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgKGRhdGEtPmFsYXJtID4+IGJpdG5yKSAmIDEpOworfQorCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjFfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xX2ZhdWx0LCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfbWF4X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfbWluX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfY3JpdF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgNCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2ZhdWx0LCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA1KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA2KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWluX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA3KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgOCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjJfZmF1bHQsIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDkpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19tYXhfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDEwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfbWluX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAxMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2NyaXRfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDEyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfZmF1bHQsIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDEzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfY3JpdF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTQpOwogCiBzdGF0aWMgaW50IGFkbTEwMzFfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQogewpAQCAtNzMxLDI5ICs3MDEsMzggQEAKIH0KIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkbTEwMzFfYXR0cmlidXRlc1tdID0gewotCSZkZXZfYXR0cl9mYW4xX2lucHV0LmF0dHIsCi0JJmRldl9hdHRyX2ZhbjFfZGl2LmF0dHIsCi0JJmRldl9hdHRyX2ZhbjFfbWluLmF0dHIsCi0JJmRldl9hdHRyX3B3bTEuYXR0ciwKLQkmZGV2X2F0dHJfYXV0b19mYW4xX2NoYW5uZWwuYXR0ciwKLQkmZGV2X2F0dHJfdGVtcDFfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfdGVtcDFfbWluLmF0dHIsCi0JJmRldl9hdHRyX3RlbXAxX21heC5hdHRyLAotCSZkZXZfYXR0cl90ZW1wMV9jcml0LmF0dHIsCi0JJmRldl9hdHRyX3RlbXAyX2lucHV0LmF0dHIsCi0JJmRldl9hdHRyX3RlbXAyX21pbi5hdHRyLAotCSZkZXZfYXR0cl90ZW1wMl9tYXguYXR0ciwKLQkmZGV2X2F0dHJfdGVtcDJfY3JpdC5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV9kaXYuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2ZhdWx0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9wd20xLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9hdXRvX2ZhbjFfY2hhbm5lbC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfY3JpdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfY3JpdF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfZmF1bHQuZGV2X2F0dHIuYXR0ciwKIAotCSZkZXZfYXR0cl9hdXRvX3RlbXAxX29mZi5hdHRyLAotCSZkZXZfYXR0cl9hdXRvX3RlbXAxX21pbi5hdHRyLAotCSZkZXZfYXR0cl9hdXRvX3RlbXAxX21heC5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfYXV0b190ZW1wMV9vZmYuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2F1dG9fdGVtcDFfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9hdXRvX3RlbXAxX21heC5kZXZfYXR0ci5hdHRyLAogCi0JJmRldl9hdHRyX2F1dG9fdGVtcDJfb2ZmLmF0dHIsCi0JJmRldl9hdHRyX2F1dG9fdGVtcDJfbWluLmF0dHIsCi0JJmRldl9hdHRyX2F1dG9fdGVtcDJfbWF4LmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9hdXRvX3RlbXAyX29mZi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfYXV0b190ZW1wMl9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2F1dG9fdGVtcDJfbWF4LmRldl9hdHRyLmF0dHIsCiAKLQkmZGV2X2F0dHJfYXV0b19mYW4xX21pbl9wd20uYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2F1dG9fZmFuMV9taW5fcHdtLmRldl9hdHRyLmF0dHIsCiAKIAkmZGV2X2F0dHJfYWxhcm1zLmF0dHIsCiAKQEAgLTc2NSwxOSArNzQ0LDI1IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRtMTAzMV9hdHRyaWJ1dGVzX29wdFtdID0gewotCSZkZXZfYXR0cl9mYW4yX2lucHV0LmF0dHIsCi0JJmRldl9hdHRyX2ZhbjJfZGl2LmF0dHIsCi0JJmRldl9hdHRyX2ZhbjJfbWluLmF0dHIsCi0JJmRldl9hdHRyX3B3bTIuYXR0ciwKLQkmZGV2X2F0dHJfYXV0b19mYW4yX2NoYW5uZWwuYXR0ciwKLQkmZGV2X2F0dHJfdGVtcDNfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfdGVtcDNfbWluLmF0dHIsCi0JJmRldl9hdHRyX3RlbXAzX21heC5hdHRyLAotCSZkZXZfYXR0cl90ZW1wM19jcml0LmF0dHIsCi0JJmRldl9hdHRyX2F1dG9fdGVtcDNfb2ZmLmF0dHIsCi0JJmRldl9hdHRyX2F1dG9fdGVtcDNfbWluLmF0dHIsCi0JJmRldl9hdHRyX2F1dG9fdGVtcDNfbWF4LmF0dHIsCi0JJmRldl9hdHRyX2F1dG9fZmFuMl9taW5fcHdtLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4yX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4yX2Rpdi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuMl9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfZmF1bHQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3B3bTIuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2F1dG9fZmFuMl9jaGFubmVsLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19jcml0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19jcml0X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19mYXVsdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfYXV0b190ZW1wM19vZmYuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2F1dG9fdGVtcDNfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9hdXRvX3RlbXAzX21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfYXV0b19mYW4yX21pbl9wd20uZGV2X2F0dHIuYXR0ciwKIAlOVUxMCiB9OwogCkBAIC03ODgsNyArNzczLDcgQEAKIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGkyY19wcm9iZSAqLwogc3RhdGljIGludCBhZG0xMDMxX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCBhZG0xMDMxX2RhdGEgKmRhdGE7CiAJaW50IGVyciA9IDA7CiAJY29uc3QgY2hhciAqbmFtZSA9ICIiOwpAQCAtODAxLDE3ICs3ODYsMTYgQEAKIAkJZ290byBleGl0OwogCX0KIAotCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OwotCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKLQluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKLQluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKLQluZXdfY2xpZW50LT5kcml2ZXIgPSAmYWRtMTAzMV9kcml2ZXI7Ci0JbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCWNsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGF0YSk7CisJY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwljbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCWNsaWVudC0+ZHJpdmVyID0gJmFkbTEwMzFfZHJpdmVyOwogCiAJaWYgKGtpbmQgPCAwKSB7CiAJCWludCBpZCwgY287Ci0JCWlkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIDB4M2QpOwotCQljbyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCAweDNlKTsKKwkJaWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCAweDNkKTsKKwkJY28gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCAweDNlKTsKIAogCQlpZiAoISgoaWQgPT0gMHgzMSB8fCBpZCA9PSAweDMwKSAmJiBjbyA9PSAweDQxKSkKIAkJCWdvdG8gZXhpdF9mcmVlOwpAQCAtODMyLDI4ICs4MTYsMjcgQEAKIAl9CiAJZGF0YS0+Y2hpcF90eXBlID0ga2luZDsKIAotCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgbmFtZSwgSTJDX05BTUVfU0laRSk7Ci0JZGF0YS0+dmFsaWQgPSAwOworCXN0cmxjcHkoY2xpZW50LT5uYW1lLCBuYW1lLCBJMkNfTkFNRV9TSVpFKTsKIAltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCi0JaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpKSkKIAkJZ290byBleGl0X2ZyZWU7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBBRE0xMDMxIGNoaXAgKi8KLQlhZG0xMDMxX2luaXRfY2xpZW50KG5ld19jbGllbnQpOworCWFkbTEwMzFfaW5pdF9jbGllbnQoY2xpZW50KTsKIAogCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCi0JaWYgKChlcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJm5ld19jbGllbnQtPmRldi5rb2JqLCAmYWRtMTAzMV9ncm91cCkpKQorCWlmICgoZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmYWRtMTAzMV9ncm91cCkpKQogCQlnb3RvIGV4aXRfZGV0YWNoOwogCiAJaWYgKGtpbmQgPT0gYWRtMTAzMSkgewotCQlpZiAoKGVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmbmV3X2NsaWVudC0+ZGV2LmtvYmosCisJCWlmICgoZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLAogCQkJCQkJJmFkbTEwMzFfZ3JvdXBfb3B0KSkpCiAJCQlnb3RvIGV4aXRfcmVtb3ZlOwogCX0KIAotCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmbmV3X2NsaWVudC0+ZGV2KTsKKwlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKIAlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKIAkJZXJyID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOwogCQlnb3RvIGV4aXRfcmVtb3ZlOwpAQCAtODYyLDEwICs4NDUsMTAgQEAKIAlyZXR1cm4gMDsKIAogZXhpdF9yZW1vdmU6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZuZXdfY2xpZW50LT5kZXYua29iaiwgJmFkbTEwMzFfZ3JvdXApOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmbmV3X2NsaWVudC0+ZGV2LmtvYmosICZhZG0xMDMxX2dyb3VwX29wdCk7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmYWRtMTAzMV9ncm91cCk7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmYWRtMTAzMV9ncm91cF9vcHQpOwogZXhpdF9kZXRhY2g6Ci0JaTJjX2RldGFjaF9jbGllbnQobmV3X2NsaWVudCk7CisJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKIGV4aXRfZnJlZToKIAlrZnJlZShkYXRhKTsKIGV4aXQ6CkBAIC04OTcsNyArODgwLDcgQEAKIAlpZiAoZGF0YS0+Y2hpcF90eXBlID09IGFkbTEwMzEpIHsKIAkJbWFzayB8PSAoQURNMTAzMV9DT05GMl9QV00yX0VOQUJMRSB8CiAJCQlBRE0xMDMxX0NPTkYyX1RBQ0gyX0VOQUJMRSk7Ci0JfSAKKwl9CiAJLyogSW5pdGlhbGl6ZSB0aGUgQURNMTAzMSBjaGlwIChlbmFibGVzIGZhbiBzcGVlZCByZWFkaW5nICkgKi8KIAlyZWFkX3ZhbCA9IGFkbTEwMzFfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMzFfUkVHX0NPTkYyKTsKIAlpZiAoKHJlYWRfdmFsIHwgbWFzaykgIT0gcmVhZF92YWwpIHsKQEAgLTk3Niw3ICs5NTksNyBAQAogCQlpZiAoZGF0YS0+Y2hpcF90eXBlID09IGFkbTEwMzApIHsKIAkJCWRhdGEtPmFsYXJtICY9IDB4YzBmZjsKIAkJfQotCQkKKwogCQlmb3IgKGNoYW49MDsgY2hhbjwoZGF0YS0+Y2hpcF90eXBlID09IGFkbTEwMzAgPyAxIDogMik7IGNoYW4rKykgewogCQkJZGF0YS0+ZmFuX2RpdltjaGFuXSA9CiAJCQkgICAgYWRtMTAzMV9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAzMV9SRUdfRkFOX0RJVihjaGFuKSk7CkBAIC05ODUsNyArOTY4LDcgQEAKIAkJCWRhdGEtPmZhbltjaGFuXSA9CiAJCQkgICAgYWRtMTAzMV9yZWFkX3ZhbHVlKGNsaWVudCwgQURNMTAzMV9SRUdfRkFOX1NQRUVEKGNoYW4pKTsKIAkJCWRhdGEtPnB3bVtjaGFuXSA9Ci0JCQkgICAgMHhmICYgKGFkbTEwMzFfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMzFfUkVHX1BXTSkgPj4gCisJCQkgICAgMHhmICYgKGFkbTEwMzFfcmVhZF92YWx1ZShjbGllbnQsIEFETTEwMzFfUkVHX1BXTSkgPj4KIAkJCQkgICAoNCpjaGFuKSk7CiAJCX0KIAkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYWRtOTI0MC5jIGIvZHJpdmVycy9od21vbi9hZG05MjQwLmMKaW5kZXggYzE3ZDBiNi4uNzY3MWQyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hZG05MjQwLmMKKysrIGIvZHJpdmVycy9od21vbi9hZG05MjQwLmMKQEAgLTE0MSw3ICsxNDEsNiBAQAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gImFkbTkyNDAiLAogCX0sCi0JLmlkCQk9IEkyQ19EUklWRVJJRF9BRE05MjQwLAogCS5hdHRhY2hfYWRhcHRlcgk9IGFkbTkyNDBfYXR0YWNoX2FkYXB0ZXIsCiAJLmRldGFjaF9jbGllbnQJPSBhZG05MjQwX2RldGFjaF9jbGllbnQsCiB9OwpAQCAtNDE1LDYgKzQxNCwyMyBAQAogfQogc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgc2hvd19hbGFybXMsIE5VTEwpOwogCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgYml0bnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXN0cnVjdCBhZG05MjQwX2RhdGEgKmRhdGEgPSBhZG05MjQwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgKGRhdGEtPmFsYXJtcyA+PiBiaXRucikgJiAxKTsKK30KK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4wX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4yX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4zX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW40X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA4KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW41X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA5KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDQpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA2KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgNyk7CisKIC8qIHZpZCAqLwogc3RhdGljIHNzaXplX3Qgc2hvd192aWQoc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQpAQCAtNDY5LDMwICs0ODUsMzkgQEAKIAkmc2Vuc29yX2Rldl9hdHRyX2luMF9pbnB1dC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW4wX21pbi5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW4wX21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4wX2FsYXJtLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luMV9taW4uZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luMV9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9hbGFybS5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW4yX2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjJfbWluLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjJfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luM19pbnB1dC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW4zX21pbi5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW4zX21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4zX2FsYXJtLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjRfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luNF9taW4uZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luNF9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNF9hbGFybS5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW41X2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjVfbWluLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjVfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjVfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAkmZGV2X2F0dHJfdGVtcDFfaW5wdXQuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4X2h5c3QuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2FsYXJtLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2Rpdi5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfZGl2LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9mYW4yX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuMl9hbGFybS5kZXZfYXR0ci5hdHRyLAogCSZkZXZfYXR0cl9hbGFybXMuYXR0ciwKIAkmZGV2X2F0dHJfYW91dF9vdXRwdXQuYXR0ciwKIAkmZGV2X2F0dHJfY2hhc3Npc19jbGVhci5hdHRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZHM3ODI4LmMgYi9kcml2ZXJzL2h3bW9uL2Fkczc4MjguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjhhNzNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9hZHM3ODI4LmMKQEAgLTAsMCArMSwyOTcgQEAKKy8qCisJYWRzNzgyOC5jIC0gbG1fc2Vuc29ycyBkcml2ZXIgZm9yIGFkczc4MjggMTItYml0IDgtY2hhbm5lbCBBREMKKwkoQykgMjAwNyBFQURTIEFzdHJpdW0KKworCVRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHRoZSBsbTc1IGFuZCBvdGhlciBsbV9zZW5zb3JzL2h3bW9uIGRyaXZlcnMKKworCVdyaXR0ZW4gYnkgU3RldmUgSGFyZHkgPHN0ZXZlQGxpbnV4cmVhbHRpbWUuY28udWs+CisKKwlEYXRhc2hlZXQgYXZhaWxhYmxlIGF0OiBodHRwOi8vZm9jdXMudGkuY29tL2xpdC9kcy9zeW1saW5rL2Fkczc4MjgucGRmCisKKwlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKwkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKwlNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCVNlZSB0aGUKKwlHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKwlhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorCisvKiBUaGUgQURTNzgyOCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQURTNzgyOF9OQ0ggOCAvKiA4IGNoYW5uZWxzIG9mIDEyLWJpdCBBLUQgc3VwcG9ydGVkICovCisjZGVmaW5lIEFEUzc4MjhfQ01EX1NEX1NFIDB4ODAgLyogU2luZ2xlIGVuZGVkIGlucHV0cyAqLworI2RlZmluZSBBRFM3ODI4X0NNRF9TRF9ESUZGIDB4MDAgLyogRGlmZmVyZW50aWFsIGlucHV0cyAqLworI2RlZmluZSBBRFM3ODI4X0NNRF9QRDAgMHgwIC8qIFBvd2VyIERvd24gYmV0d2VlbiBBLUQgY29udmVyc2lvbnMgKi8KKyNkZWZpbmUgQURTNzgyOF9DTURfUEQxIDB4MDQgLyogSW50ZXJuYWwgcmVmIE9GRiAmJiBBLUQgT04gKi8KKyNkZWZpbmUgQURTNzgyOF9DTURfUEQyIDB4MDggLyogSW50ZXJuYWwgcmVmIE9OICYmIEEtRCBPRkYgKi8KKyNkZWZpbmUgQURTNzgyOF9DTURfUEQzIDB4MEMgLyogSW50ZXJuYWwgcmVmIE9OICYmIEEtRCBPTiAqLworI2RlZmluZSBBRFM3ODI4X0lOVF9WUkVGX01WIDI1MDAgLyogSW50ZXJuYWwgdnJlZiBpcyAyLjVWLCAyNTAwbVYgKi8KKworLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4NDgsIDB4NDksIDB4NGEsIDB4NGIsCisJSTJDX0NMSUVOVF9FTkQgfTsKKworLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KK0kyQ19DTElFTlRfSU5TTU9EXzEoYWRzNzgyOCk7CisKKy8qIE90aGVyIG1vZHVsZSBwYXJhbWV0ZXJzICovCitzdGF0aWMgaW50IHNlX2lucHV0ID0gMTsgLyogRGVmYXVsdCBpcyBTRSwgMCA9PSBkaWZmICovCitzdGF0aWMgaW50IGludF92cmVmID0gMTsgLyogRGVmYXVsdCBpcyBpbnRlcm5hbCByZWYgT04gKi8KK3N0YXRpYyBpbnQgdnJlZl9tdiA9IEFEUzc4MjhfSU5UX1ZSRUZfTVY7IC8qIHNldCBpZiB2cmVmICE9IDIuNVYgKi8KK21vZHVsZV9wYXJhbShzZV9pbnB1dCwgYm9vbCwgU19JUlVHTyk7Cittb2R1bGVfcGFyYW0oaW50X3ZyZWYsIGJvb2wsIFNfSVJVR08pOworbW9kdWxlX3BhcmFtKHZyZWZfbXYsIGludCwgU19JUlVHTyk7CisKKy8qIEdsb2JhbCBWYXJpYWJsZXMgKi8KK3N0YXRpYyB1OCBhZHM3ODI4X2NtZF9ieXRlOyAvKiBjbWQgYnl0ZSB3aXRob3V0IGNoYW5uZWwgYml0cyAqLworc3RhdGljIHVuc2lnbmVkIGludCBhZHM3ODI4X2xzYl9yZXNvbDsgLyogcmVzb2x1dGlvbiBvZiB0aGUgQURDIHNhbXBsZSBsc2IgKi8KKworLyogRWFjaCBjbGllbnQgaGFzIHRoaXMgYWRkaXRpb25hbCBkYXRhICovCitzdHJ1Y3QgYWRzNzgyOF9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworCXN0cnVjdCBtdXRleCB1cGRhdGVfbG9jazsgLyogbXV0ZXggcHJvdGVjdCB1cGRhdGVzICovCisJY2hhciB2YWxpZDsgLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7IC8qIEluIGppZmZpZXMgKi8KKwl1MTYgYWRjX2lucHV0W0FEUzc4MjhfTkNIXTsgLyogQURTNzgyOF9OQ0ggMTItYml0IHNhbXBsZXMgKi8KK307CisKKy8qIEZ1bmN0aW9uIGRlY2xhcmF0aW9uIC0gbmVjZXNzYXJ5IGR1ZSB0byBmdW5jdGlvbiBkZXBlbmRlbmNpZXMgKi8KK3N0YXRpYyBpbnQgYWRzNzgyOF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOworCisvKiBUaGUgQURTNzgyOCByZXR1cm5zIHRoZSAxMi1iaXQgc2FtcGxlIGluIHR3byBieXRlcywKKwl0aGVzZSBhcmUgcmVhZCBhcyBhIHdvcmQgdGhlbiBieXRlLXN3YXBwZWQgKi8KK3N0YXRpYyB1MTYgYWRzNzgyOF9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlyZXR1cm4gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZykpOworfQorCitzdGF0aWMgaW5saW5lIHU4IGNoYW5uZWxfY21kX2J5dGUoaW50IGNoKQoreworCS8qIGNtZCBieXRlIEMyLEMxLEMwIC0gc2VlIGRhdGFzaGVldCAqLworCXU4IGNtZCA9ICgoKGNoPj4xKSB8IChjaCYweDAxKTw8Mik8PDQpOworCWNtZCB8PSBhZHM3ODI4X2NtZF9ieXRlOworCXJldHVybiBjbWQ7Cit9CisKKy8qIFVwZGF0ZSBkYXRhIGZvciB0aGUgZGV2aWNlIChhbGwgOCBjaGFubmVscykgKi8KK3N0YXRpYyBzdHJ1Y3QgYWRzNzgyOF9kYXRhICphZHM3ODI4X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGFkczc4MjhfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFogKyBIWiAvIDIpCisJCQl8fCAhZGF0YS0+dmFsaWQpIHsKKwkJdW5zaWduZWQgaW50IGNoOworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlN0YXJ0aW5nIGFkczc4MjggdXBkYXRlXG4iKTsKKworCQlmb3IgKGNoID0gMDsgY2ggPCBBRFM3ODI4X05DSDsgY2grKykgeworCQkJdTggY21kID0gY2hhbm5lbF9jbWRfYnl0ZShjaCk7CisJCQlkYXRhLT5hZGNfaW5wdXRbY2hdID0gYWRzNzgyOF9yZWFkX3ZhbHVlKGNsaWVudCwgY21kKTsKKwkJfQorCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCA9IDE7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworLyogc3lzZnMgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfaW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsCisJY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7CisJc3RydWN0IGFkczc4MjhfZGF0YSAqZGF0YSA9IGFkczc4MjhfdXBkYXRlX2RldmljZShkZXYpOworCS8qIFByaW50IHZhbHVlIChpbiBtViBhcyBzcGVjaWZpZWQgaW4gc3lzZnMtaW50ZXJmYWNlIGRvY3VtZW50YXRpb24pICovCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIChkYXRhLT5hZGNfaW5wdXRbYXR0ci0+aW5kZXhdICoKKwkJYWRzNzgyOF9sc2JfcmVzb2wpLzEwMDApOworfQorCisjZGVmaW5lIGluX3JlZyhvZmZzZXQpXAorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sXAorCU5VTEwsIG9mZnNldCkKKworaW5fcmVnKDApOworaW5fcmVnKDEpOworaW5fcmVnKDIpOworaW5fcmVnKDMpOworaW5fcmVnKDQpOworaW5fcmVnKDUpOworaW5fcmVnKDYpOworaW5fcmVnKDcpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRzNzgyOF9hdHRyaWJ1dGVzW10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl9pbjBfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4yX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW41X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjZfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luN19pbnB1dC5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkczc4MjhfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWRzNzgyOF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCBhZHM3ODI4X2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCisJCXJldHVybiAwOworCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgYWRzNzgyOF9kZXRlY3QpOworfQorCitzdGF0aWMgaW50IGFkczc4MjhfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBhZHM3ODI4X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmFkczc4MjhfZ3JvdXApOworCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCXJldHVybiAwOworfQorCisvKiBUaGlzIGlzIHRoZSBkcml2ZXIgdGhhdCB3aWxsIGJlIGluc2VydGVkICovCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWRzNzgyOF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWRzNzgyOCIsCisJfSwKKwkuYXR0YWNoX2FkYXB0ZXIgPSBhZHM3ODI4X2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50ID0gYWRzNzgyOF9kZXRhY2hfY2xpZW50LAorfTsKKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaTJjX3Byb2JlICovCitzdGF0aWMgaW50IGFkczc4MjhfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGFkczc4MjhfZGF0YSAqZGF0YTsKKwlpbnQgZXJyID0gMDsKKwljb25zdCBjaGFyICpuYW1lID0gIiI7CisKKwkvKiBDaGVjayB3ZSBoYXZlIGEgdmFsaWQgY2xpZW50ICovCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19SRUFEX1dPUkRfREFUQSkpCisJCWdvdG8gZXhpdDsKKworCS8qIE9LLiBGb3Igbm93LCB3ZSBwcmVzdW1lIHdlIGhhdmUgYSB2YWxpZCBjbGllbnQuIFdlIG5vdyBjcmVhdGUgdGhlCisJY2xpZW50IHN0cnVjdHVyZSwgZXZlbiB0aG91Z2ggd2UgY2Fubm90IGZpbGwgaXQgY29tcGxldGVseSB5ZXQuCisJQnV0IGl0IGFsbG93cyB1cyB0byBhY2Nlc3MgYWRzNzgyOF9yZWFkX3ZhbHVlLiAqLworCWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWRzNzgyOF9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisKKwljbGllbnQgPSAmZGF0YS0+Y2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOworCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwljbGllbnQtPmRyaXZlciA9ICZhZHM3ODI4X2RyaXZlcjsKKworCS8qIE5vdywgd2UgZG8gdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24uIFRoZXJlIGlzIG5vIGlkZW50aWZpY2F0aW9uCisJZGVkaWNhdGVkIHJlZ2lzdGVyIHNvIGF0dGVtcHQgdG8gc2FuaXR5IGNoZWNrIHVzaW5nIGtub3dsZWRnZSBvZgorCXRoZSBjaGlwCisJLSBSZWFkIGZyb20gdGhlIDggY2hhbm5lbCBhZGRyZXNzZXMKKwktIENoZWNrIHRoZSB0b3AgNCBiaXRzIG9mIGVhY2ggcmVzdWx0IGFyZSBub3Qgc2V0ICgxMiBkYXRhIGJpdHMpCisJKi8KKwlpZiAoa2luZCA8IDApIHsKKwkJaW50IGNoOworCQlmb3IgKGNoID0gMDsgY2ggPCBBRFM3ODI4X05DSDsgY2grKykgeworCQkJdTE2IGluX2RhdGE7CisJCQl1OCBjbWQgPSBjaGFubmVsX2NtZF9ieXRlKGNoKTsKKwkJCWluX2RhdGEgPSBhZHM3ODI4X3JlYWRfdmFsdWUoY2xpZW50LCBjbWQpOworCQkJaWYgKGluX2RhdGEgJiAweEYwMDApIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSIlcyA6IERvZXNuJ3QgbG9vayBsaWtlIGFuIGFkczc4MjggZGV2aWNlXG4iLAorCQkJCV9fRlVOQ1RJT05fXyk7CisJCQkJZ290byBleGl0X2ZyZWU7CisJCQl9CisJCX0KKwl9CisKKwkvKiBEZXRlcm1pbmUgdGhlIGNoaXAgdHlwZSAtIG9ubHkgb25lIGtpbmQgc3VwcG9ydGVkISAqLworCWlmIChraW5kIDw9IDApCisJCWtpbmQgPSBhZHM3ODI4OworCisJaWYgKGtpbmQgPT0gYWRzNzgyOCkKKwkJbmFtZSA9ICJhZHM3ODI4IjsKKworCS8qIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzLCBwdXQgaXQgaW50byB0aGUgZ2xvYmFsIGxpc3QgKi8KKwlzdHJsY3B5KGNsaWVudC0+bmFtZSwgbmFtZSwgSTJDX05BTUVfU0laRSk7CisKKwltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfZnJlZTsKKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmYWRzNzgyOF9ncm91cCk7CisJaWYgKGVycikKKwkJZ290byBleGl0X2RldGFjaDsKKworCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmY2xpZW50LT5kZXYpOworCWlmIChJU19FUlIoZGF0YS0+aHdtb25fZGV2KSkgeworCQllcnIgPSBQVFJfRVJSKGRhdGEtPmh3bW9uX2Rldik7CisJCWdvdG8gZXhpdF9yZW1vdmU7CisJfQorCisJcmV0dXJuIDA7CisKK2V4aXRfcmVtb3ZlOgorCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmFkczc4MjhfZ3JvdXApOworZXhpdF9kZXRhY2g6CisJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKK2V4aXRfZnJlZToKKwlrZnJlZShkYXRhKTsKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2luaXQgc2Vuc29yc19hZHM3ODI4X2luaXQodm9pZCkKK3sKKwkvKiBJbml0aWFsaXplIHRoZSBjb21tYW5kIGJ5dGUgYWNjb3JkaW5nIHRvIG1vZHVsZSBwYXJhbWV0ZXJzICovCisJYWRzNzgyOF9jbWRfYnl0ZSA9IHNlX2lucHV0ID8KKwkJQURTNzgyOF9DTURfU0RfU0UgOiBBRFM3ODI4X0NNRF9TRF9ESUZGOworCWFkczc4MjhfY21kX2J5dGUgfD0gaW50X3ZyZWYgPworCQlBRFM3ODI4X0NNRF9QRDMgOiBBRFM3ODI4X0NNRF9QRDE7CisKKwkvKiBDYWxjdWxhdGUgdGhlIExTQiByZXNvbHV0aW9uICovCisJYWRzNzgyOF9sc2JfcmVzb2wgPSAodnJlZl9tdioxMDAwKS80MDk2OworCisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZhZHM3ODI4X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzZW5zb3JzX2Fkczc4MjhfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZhZHM3ODI4X2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIlN0ZXZlIEhhcmR5IDxzdGV2ZUBsaW51eHJlYWx0aW1lLmNvLnVrPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBRFM3ODI4IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChzZW5zb3JzX2Fkczc4MjhfaW5pdCk7Cittb2R1bGVfZXhpdChzZW5zb3JzX2Fkczc4MjhfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FkdDc0NzAuYyBiL2RyaXZlcnMvaHdtb24vYWR0NzQ3MC5jCmluZGV4IDk4MTBhYWEuLjc0NzY5M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYWR0NzQ3MC5jCisrKyBiL2RyaXZlcnMvaHdtb24vYWR0NzQ3MC5jCkBAIC00OCw3ICs0OCwyMiBAQAogI2RlZmluZSBBRFQ3NDcwX1JFR19DRkcJCQkJMHg0MAogI2RlZmluZQkJQURUNzQ3MF9GU1BEX01BU0sJCTB4MDQKICNkZWZpbmUgQURUNzQ3MF9SRUdfQUxBUk0xCQkJMHg0MQorI2RlZmluZQkJQURUNzQ3MF9SMVRfQUxBUk0JCTB4MDEKKyNkZWZpbmUJCUFEVDc0NzBfUjJUX0FMQVJNCQkweDAyCisjZGVmaW5lCQlBRFQ3NDcwX1IzVF9BTEFSTQkJMHgwNAorI2RlZmluZQkJQURUNzQ3MF9SNFRfQUxBUk0JCTB4MDgKKyNkZWZpbmUJCUFEVDc0NzBfUjVUX0FMQVJNCQkweDEwCisjZGVmaW5lCQlBRFQ3NDcwX1I2VF9BTEFSTQkJMHgyMAorI2RlZmluZQkJQURUNzQ3MF9SN1RfQUxBUk0JCTB4NDAKKyNkZWZpbmUJCUFEVDc0NzBfT09MX0FMQVJNCQkweDgwCiAjZGVmaW5lIEFEVDc0NzBfUkVHX0FMQVJNMgkJCTB4NDIKKyNkZWZpbmUJCUFEVDc0NzBfUjhUX0FMQVJNCQkweDAxCisjZGVmaW5lCQlBRFQ3NDcwX1I5VF9BTEFSTQkJMHgwMgorI2RlZmluZQkJQURUNzQ3MF9SMTBUX0FMQVJNCQkweDA0CisjZGVmaW5lCQlBRFQ3NDcwX0ZBTjFfQUxBUk0JCTB4MTAKKyNkZWZpbmUJCUFEVDc0NzBfRkFOMl9BTEFSTQkJMHgyMAorI2RlZmluZQkJQURUNzQ3MF9GQU4zX0FMQVJNCQkweDQwCisjZGVmaW5lCQlBRFQ3NDcwX0ZBTjRfQUxBUk0JCTB4ODAKICNkZWZpbmUgQURUNzQ3MF9SRUdfVEVNUF9MSU1JVFNfQkFTRV9BRERSCTB4NDQKICNkZWZpbmUgQURUNzQ3MF9SRUdfVEVNUF9MSU1JVFNfTUFYX0FERFIJMHg1NwogI2RlZmluZSBBRFQ3NDcwX1JFR19GQU5fTUlOX0JBU0VfQUREUgkJMHg1OApAQCAtOTcsNiArMTEyLDggQEAKICNkZWZpbmUgQURUNzQ3MF9SRUdfUFdNX0FVVE9fVEVNUCh4KQkoQURUNzQ3MF9SRUdfUFdNX0FVVE9fVEVNUF9CQVNFX0FERFIgKyBcCiAJCQkJCSgoeCkgLyAyKSkKIAorI2RlZmluZSBBTEFSTTIoeCkJCSgoeCkgPDwgOCkKKwogI2RlZmluZSBBRFQ3NDcwX1ZFTkRPUgkJMHg0MQogI2RlZmluZSBBRFQ3NDcwX0RFVklDRQkJMHg3MAogLyogZGF0YXNoZWV0IG9ubHkgbWVudGlvbnMgYSByZXZpc2lvbiAyICovCkBAIC0xMTQsOCArMTMxLDYgQEAKIC8qIHNsZWVwIDFzIHdoaWxlIGdhdGhlcmluZyB0ZW1wZXJhdHVyZSBkYXRhICovCiAjZGVmaW5lIFRFTVBfQ09MTEVDVElPTl9USU1FCTEwMDAKIAotI2RlZmluZSBwb3dlcl9vZl8yKHgpCSgoKHgpICYgKCh4KSAtIDEpKSA9PSAwKQotCiAvKiBkYXRhc2hlZXQgc2F5cyB0byBkaXZpZGUgdGhpcyBudW1iZXIgYnkgdGhlIGZhbiByZWFkaW5nIHRvIGdldCBmYW4gcnBtICovCiAjZGVmaW5lIEZBTl9QRVJJT0RfVE9fUlBNKHgpCSgoOTAwMDAgKiA2MCkgLyAoeCkpCiAjZGVmaW5lIEZBTl9SUE1fVE9fUEVSSU9ECUZBTl9QRVJJT0RfVE9fUlBNCkBAIC0xMzgsNyArMTUzLDggQEAKIAl1MTYJCQlmYW5bQURUNzQ3MF9GQU5fQ09VTlRdOwogCXUxNgkJCWZhbl9taW5bQURUNzQ3MF9GQU5fQ09VTlRdOwogCXUxNgkJCWZhbl9tYXhbQURUNzQ3MF9GQU5fQ09VTlRdOwotCXUxNgkJCWFsYXJtcywgYWxhcm1zX21hc2s7CisJdTE2CQkJYWxhcm07CisJdTE2CQkJYWxhcm1zX21hc2s7CiAJdTgJCQlmb3JjZV9wd21fbWF4OwogCXU4CQkJcHdtW0FEVDc0NzBfUFdNX0NPVU5UXTsKIAl1OAkJCXB3bV9tYXhbQURUNzQ3MF9QV01fQ09VTlRdOwpAQCAtMjYyLDcgKzI3OCwxMCBAQAogCWVsc2UKIAkJZGF0YS0+Zm9yY2VfcHdtX21heCA9IDA7CiAKLQlkYXRhLT5hbGFybXMgPSBhZHQ3NDcwX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfQUxBUk0xKTsKKwlkYXRhLT5hbGFybSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX0FMQVJNMSk7CisJaWYgKGRhdGEtPmFsYXJtICYgQURUNzQ3MF9PT0xfQUxBUk0pCisJCWRhdGEtPmFsYXJtIHw9IEFMQVJNMihpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJCUFEVDc0NzBfUkVHX0FMQVJNMikpOwogCWRhdGEtPmFsYXJtc19tYXNrID0gYWR0NzQ3MF9yZWFkX3dvcmRfZGF0YShjbGllbnQsCiAJCQkJCQkgICBBRFQ3NDcwX1JFR19BTEFSTTFfTUFTSyk7CiAKQEAgLTM3MCwxNyArMzg5LDEzIEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIDEwMDAgKiBkYXRhLT50ZW1wW2F0dHItPmluZGV4XSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm1zKHN0cnVjdCBkZXZpY2UgKmRldiwKK3N0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm1fbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKIAkJCSAgIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CiAJc3RydWN0IGFkdDc0NzBfZGF0YSAqZGF0YSA9IGFkdDc0NzBfdXBkYXRlX2RldmljZShkZXYpOwogCi0JaWYgKGF0dHItPmluZGV4KQotCQlyZXR1cm4gc3ByaW50ZihidWYsICIleFxuIiwgZGF0YS0+YWxhcm1zKTsKLQllbHNlCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV4XG4iLCBkYXRhLT5hbGFybXNfbWFzayk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXhcbiIsIGRhdGEtPmFsYXJtc19tYXNrKTsKIH0KIAogc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTY3Nyw3ICs2OTIsNyBAQAogewogCWlmIChpbnB1dCA9PSBBRFQ3NDcwX1BXTV9BTExfVEVNUFMpCiAJCXJldHVybiAwOwotCWlmIChpbnB1dCA8IDEgfHwgIXBvd2VyX29mXzIoaW5wdXQpKQorCWlmIChpbnB1dCA8IDEgfHwgIWlzX3Bvd2VyX29mXzIoaW5wdXQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4gaWxvZzIoaW5wdXQpICsgMTsKIH0KQEAgLTcxNSw4ICs3MzAsMjAgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoYWxhcm1zLCBTX0lSVUdPLCBzaG93X2FsYXJtcywgTlVMTCwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGFsYXJtX21hc2ssIFNfSVJVR08sIHNob3dfYWxhcm1zLCBOVUxMLCAxKTsKK3N0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCSAgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3QgYWR0NzQ3MF9kYXRhICpkYXRhID0gYWR0NzQ3MF91cGRhdGVfZGV2aWNlKGRldik7CisKKwlpZiAoZGF0YS0+YWxhcm0gJiBhdHRyLT5pbmRleCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiMVxuIik7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGFsYXJtX21hc2ssIFNfSVJVR08sIHNob3dfYWxhcm1fbWFzaywgTlVMTCk7CiAKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wX21heCwKIAkJICAgIHNldF90ZW1wX21heCwgMCk7CkBAIC03NzEsNiArNzk4LDI3IEBACiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA5X2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwsIDgpOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMTBfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcCwgTlVMTCwgOSk7CiAKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsCisJCQkgIEFEVDc0NzBfUjFUX0FMQVJNKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsCisJCQkgIEFEVDc0NzBfUjJUX0FMQVJNKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsCisJCQkgIEFEVDc0NzBfUjNUX0FMQVJNKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDRfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsCisJCQkgIEFEVDc0NzBfUjRUX0FMQVJNKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDVfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsCisJCQkgIEFEVDc0NzBfUjVUX0FMQVJNKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDZfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsCisJCQkgIEFEVDc0NzBfUjZUX0FMQVJNKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDdfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsCisJCQkgIEFEVDc0NzBfUjdUX0FMQVJNKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDhfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsCisJCQkgIEFMQVJNMihBRFQ3NDcwX1I4VF9BTEFSTSkpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wOV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwKKwkJCSAgQUxBUk0yKEFEVDc0NzBfUjlUX0FMQVJNKSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxMF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwKKwkJCSAgQUxBUk0yKEFEVDc0NzBfUjEwVF9BTEFSTSkpOworCiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjFfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19mYW5fbWF4LAogCQkgICAgc2V0X2Zhbl9tYXgsIDApOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4yX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfZmFuX21heCwKQEAgLTc5NCw2ICs4NDIsMTUgQEAKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuM19pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDIpOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW40X2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMyk7CiAKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwKKwkJCSAgQUxBUk0yKEFEVDc0NzBfRkFOMV9BTEFSTSkpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4yX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLAorCQkJICBBTEFSTTIoQURUNzQ3MF9GQU4yX0FMQVJNKSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjNfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsCisJCQkgIEFMQVJNMihBRFQ3NDcwX0ZBTjNfQUxBUk0pKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuNF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwKKwkJCSAgQUxBUk0yKEFEVDc0NzBfRkFONF9BTEFSTSkpOworCiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZvcmNlX3B3bV9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLAogCQkgICAgc2hvd19mb3JjZV9wd21fbWF4LCBzZXRfZm9yY2VfcHdtX21heCwgMCk7CiAKQEAgLTg1OCw4ICs5MTUsNyBAQAogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWR0NzQ3MF9hdHRyW10gPQogewotCSZzZW5zb3JfZGV2X2F0dHJfYWxhcm1zLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9hbGFybV9tYXNrLmRldl9hdHRyLmF0dHIsCisJJmRldl9hdHRyX2FsYXJtX21hc2suYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWF4LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19tYXguZGV2X2F0dHIuYXR0ciwKQEAgLTg5MCw2ICs5NDYsMTYgQEAKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXA4X2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wOV9pbnB1dC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDEwX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wNF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDVfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXA2X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wN19hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXA5X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMTBfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfbWF4LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9mYW4yX21heC5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfZmFuM19tYXguZGV2X2F0dHIuYXR0ciwKQEAgLTkwMiw2ICs5NjgsMTAgQEAKIAkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2ZhbjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2ZhbjRfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjNfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjRfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2ZvcmNlX3B3bV9tYXguZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3B3bTEuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3B3bTIuZGV2X2F0dHIuYXR0ciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYXBwbGVzbWMuYyBiL2RyaXZlcnMvaHdtb24vYXBwbGVzbWMuYwppbmRleCA4NmM2NmMzLi4wYzk0NzcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FwcGxlc21jLmMKKysrIGIvZHJpdmVycy9od21vbi9hcHBsZXNtYy5jCkBAIC05MDUsNyArOTA1LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgYXBwbGVzbWNfYmFja2xpZ2h0ID0gewotCS5uYW1lCQkJPSAic21jOmtiZF9iYWNrbGlnaHQiLAorCS5uYW1lCQkJPSAic21jOjprYmRfYmFja2xpZ2h0IiwKIAkuZGVmYXVsdF90cmlnZ2VyCT0gIm5hbmQtZGlzayIsCiAJLmJyaWdodG5lc3Nfc2V0CQk9IGFwcGxlc21jX2JyaWdodG5lc3Nfc2V0LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYXNiMTAwLmMgYi9kcml2ZXJzL2h3bW9uL2FzYjEwMC5jCmluZGV4IDk0NjBkYmEuLjk1MGNlYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vYXNiMTAwLmMKKysrIGIvZHJpdmVycy9od21vbi9hc2IxMDAuYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaHdtb24tdmlkLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtNDcsMTIgKzQ4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgImxtNzUuaCIKIAotLyoKLQlISVNUT1JZOgotCTIwMDMtMTItMjkJMS4wLjAJUG9ydGVkIGZyb20gbG1fc2Vuc29ycyBwcm9qZWN0IGZvciBrZXJuZWwgMi42Ci0qLwotI2RlZmluZSBBU0IxMDBfVkVSU0lPTiAiMS4wLjAiCi0KIC8qIEkyQyBhZGRyZXNzZXMgdG8gc2NhbiAqLwogc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgyZCwgSTJDX0NMSUVOVF9FTkQgfTsKIApAQCAtMjIxLDE1ICsyMTYsMTYgQEAKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJhc2IxMDAiLAogCX0sCi0JLmlkCQk9IEkyQ19EUklWRVJJRF9BU0IxMDAsCiAJLmF0dGFjaF9hZGFwdGVyCT0gYXNiMTAwX2F0dGFjaF9hZGFwdGVyLAogCS5kZXRhY2hfY2xpZW50CT0gYXNiMTAwX2RldGFjaF9jbGllbnQsCiB9OwogCiAvKiA3IFZvbHRhZ2VzICovCiAjZGVmaW5lIHNob3dfaW5fcmVnKHJlZykgXAotc3RhdGljIHNzaXplX3Qgc2hvd18jI3JlZyAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBcCisJCWNoYXIgKmJ1ZikgXAogeyBcCisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsgXAogCXN0cnVjdCBhc2IxMDBfZGF0YSAqZGF0YSA9IGFzYjEwMF91cGRhdGVfZGV2aWNlKGRldik7IFwKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+cmVnW25yXSkpOyBcCiB9CkBAIC0yMzksOSArMjM1LDEwIEBACiBzaG93X2luX3JlZyhpbl9tYXgpCiAKICNkZWZpbmUgc2V0X2luX3JlZyhSRUcsIHJlZykgXAotc3RhdGljIHNzaXplX3Qgc2V0X2luXyMjcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBcCi0JCXNpemVfdCBjb3VudCwgaW50IG5yKSBcCitzdGF0aWMgc3NpemVfdCBzZXRfaW5fIyNyZWcoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgXAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAogeyBcCisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsgXAogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKIAlzdHJ1Y3QgYXNiMTAwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAogCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7IFwKQEAgLTI1OCwzNyArMjU1LDEyIEBACiBzZXRfaW5fcmVnKE1BWCwgbWF4KQogCiAjZGVmaW5lIHN5c2ZzX2luKG9mZnNldCkgXAotc3RhdGljIHNzaXplX3QgXAotCXNob3dfaW4jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCi17IFwKLQlyZXR1cm4gc2hvd19pbihkZXYsIGJ1Ziwgb2Zmc2V0KTsgXAotfSBcCi1zdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBcCi0JCXNob3dfaW4jI29mZnNldCwgTlVMTCk7IFwKLXN0YXRpYyBzc2l6ZV90IFwKLQlzaG93X2luIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgXAoteyBcCi0JcmV0dXJuIHNob3dfaW5fbWluKGRldiwgYnVmLCBvZmZzZXQpOyBcCi19IFwKLXN0YXRpYyBzc2l6ZV90IFwKLQlzaG93X2luIyNvZmZzZXQjI19tYXggKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgXAoteyBcCi0JcmV0dXJuIHNob3dfaW5fbWF4KGRldiwgYnVmLCBvZmZzZXQpOyBcCi19IFwKLXN0YXRpYyBzc2l6ZV90IHNldF9pbiMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBcCi0JCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCi17IFwKLQlyZXR1cm4gc2V0X2luX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCk7IFwKLX0gXAotc3RhdGljIHNzaXplX3Qgc2V0X2luIyNvZmZzZXQjI19tYXggKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIFwKLQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIFwKLXsgXAotCXJldHVybiBzZXRfaW5fbWF4KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsgXAotfSBcCi1zdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIFwKLQkJc2hvd19pbiMjb2Zmc2V0IyNfbWluLCBzZXRfaW4jI29mZnNldCMjX21pbik7IFwKLXN0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwgXAotCQlzaG93X2luIyNvZmZzZXQjI19tYXgsIHNldF9pbiMjb2Zmc2V0IyNfbWF4KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBcCisJCXNob3dfaW4sIE5VTEwsIG9mZnNldCk7IFwKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJc2hvd19pbl9taW4sIHNldF9pbl9taW4sIG9mZnNldCk7IFwKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21heCwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJc2hvd19pbl9tYXgsIHNldF9pbl9tYXgsIG9mZnNldCkKIAogc3lzZnNfaW4oMCk7CiBzeXNmc19pbigxKTsKQEAgLTI5OSwyOSArMjcxLDM2IEBACiBzeXNmc19pbig2KTsKIAogLyogMyBGYW5zICovCi1zdGF0aWMgc3NpemVfdCBzaG93X2ZhbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQorc3RhdGljIHNzaXplX3Qgc2hvd19mYW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQogeworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CiAJc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhID0gYXNiMTAwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRkFOX0ZST01fUkVHKGRhdGEtPmZhbltucl0sCiAJCURJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpKTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQogeworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CiAJc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhID0gYXNiMTAwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRkFOX0ZST01fUkVHKGRhdGEtPmZhbl9taW5bbnJdLAogCQlESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKQorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKIHsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OwogCXN0cnVjdCBhc2IxMDBfZGF0YSAqZGF0YSA9IGFzYjEwMF91cGRhdGVfZGV2aWNlKGRldik7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOwogfQogCi1zdGF0aWMgc3NpemVfdCBzZXRfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCQlzaXplX3QgY291bnQsIGludCBucikKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogeworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKIAlzdHJ1Y3QgYXNiMTAwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAl1MzIgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CkBAIC0zMzcsMjIgKzMxNiwyMyBAQAogICAgZGV0ZXJtaW5lZCBpbiBwYXJ0IGJ5IHRoZSBmYW4gZGl2aXNvci4gIFRoaXMgZm9sbG93cyB0aGUgcHJpbmNpcGxlIG9mCiAgICBsZWFzdCBzdXJwcmlzZTsgdGhlIHVzZXIgZG9lc24ndCBleHBlY3QgdGhlIGZhbiBtaW5pbXVtIHRvIGNoYW5nZSBqdXN0CiAgICBiZWNhdXNlIHRoZSBkaXZpc29yIGNoYW5nZWQuICovCi1zdGF0aWMgc3NpemVfdCBzZXRfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCQlzaXplX3QgY291bnQsIGludCBucikKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogeworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKIAlzdHJ1Y3QgYXNiMTAwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAl1bnNpZ25lZCBsb25nIG1pbjsKIAl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwogCWludCByZWc7Ci0JCisKIAltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAltaW4gPSBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltucl0sCiAJCQlESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKIAlkYXRhLT5mYW5fZGl2W25yXSA9IERJVl9UT19SRUcodmFsKTsKIAotCXN3aXRjaChucikgeworCXN3aXRjaCAobnIpIHsKIAljYXNlIDA6CS8qIGZhbiAxICovCiAJCXJlZyA9IGFzYjEwMF9yZWFkX3ZhbHVlKGNsaWVudCwgQVNCMTAwX1JFR19WSURfRkFORElWKTsKIAkJcmVnID0gKHJlZyAmIDB4Y2YpIHwgKGRhdGEtPmZhbl9kaXZbMF0gPDwgNCk7CkBAIC0zODIsMzQgKzM2MiwxMiBAQAogfQogCiAjZGVmaW5lIHN5c2ZzX2ZhbihvZmZzZXQpIFwKLXN0YXRpYyBzc2l6ZV90IHNob3dfZmFuIyNvZmZzZXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCi17IFwKLQlyZXR1cm4gc2hvd19mYW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOyBcCi19IFwKLXN0YXRpYyBzc2l6ZV90IHNob3dfZmFuIyNvZmZzZXQjI19taW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCi17IFwKLQlyZXR1cm4gc2hvd19mYW5fbWluKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsgXAotfSBcCi1zdGF0aWMgc3NpemVfdCBzaG93X2ZhbiMjb2Zmc2V0IyNfZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgXAoteyBcCi0JcmV0dXJuIHNob3dfZmFuX2RpdihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7IFwKLX0gXAotc3RhdGljIHNzaXplX3Qgc2V0X2ZhbiMjb2Zmc2V0IyNfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwgXAotCQkJCQlzaXplX3QgY291bnQpIFwKLXsgXAotCXJldHVybiBzZXRfZmFuX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOyBcCi19IFwKLXN0YXRpYyBzc2l6ZV90IHNldF9mYW4jI29mZnNldCMjX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIFwKLQkJCQkJc2l6ZV90IGNvdW50KSBcCi17IFwKLQlyZXR1cm4gc2V0X2Zhbl9kaXYoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsgXAotfSBcCi1zdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgXAotCQlzaG93X2ZhbiMjb2Zmc2V0LCBOVUxMKTsgXAotc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgXAotCQlzaG93X2ZhbiMjb2Zmc2V0IyNfbWluLCBzZXRfZmFuIyNvZmZzZXQjI19taW4pOyBcCi1zdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19kaXYsIFNfSVJVR08gfCBTX0lXVVNSLCBcCi0JCXNob3dfZmFuIyNvZmZzZXQjI19kaXYsIHNldF9mYW4jI29mZnNldCMjX2Rpdik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIFwKKwkJc2hvd19mYW4sIE5VTEwsIG9mZnNldCAtIDEpOyBcCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgXAorCQlzaG93X2Zhbl9taW4sIHNldF9mYW5fbWluLCBvZmZzZXQgLSAxKTsgXAorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2RpdiwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJc2hvd19mYW5fZGl2LCBzZXRfZmFuX2Rpdiwgb2Zmc2V0IC0gMSkKIAogc3lzZnNfZmFuKDEpOwogc3lzZnNfZmFuKDIpOwpAQCAtNDMwLDEwICszODgsMTIgQEAKIAl9CiAJcmV0dXJuIHJldDsKIH0KLQkJIAkKKwogI2RlZmluZSBzaG93X3RlbXBfcmVnKHJlZykgXAotc3RhdGljIHNzaXplX3Qgc2hvd18jI3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSBcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIFwKKwkJY2hhciAqYnVmKSBcCiB7IFwKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OyBcCiAJc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhID0gYXNiMTAwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAogCXJldHVybiBzcHJpbnRmX3RlbXBfZnJvbV9yZWcoZGF0YS0+cmVnW25yXSwgYnVmLCBucik7IFwKIH0KQEAgLTQ0Myw5ICs0MDMsMTAgQEAKIHNob3dfdGVtcF9yZWcodGVtcF9oeXN0KTsKIAogI2RlZmluZSBzZXRfdGVtcF9yZWcoUkVHLCByZWcpIFwKLXN0YXRpYyBzc2l6ZV90IHNldF8jI3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgXAotCQkJc2l6ZV90IGNvdW50LCBpbnQgbnIpIFwKK3N0YXRpYyBzc2l6ZV90IHNldF8jI3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBcCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCiB7IFwKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OyBcCiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAogCXN0cnVjdCBhc2IxMDBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCiAJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyBcCkBAIC00NjksMzMgKzQzMCwxMiBAQAogc2V0X3RlbXBfcmVnKEhZU1QsIHRlbXBfaHlzdCk7CiAKICNkZWZpbmUgc3lzZnNfdGVtcChudW0pIFwKLXN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcCMjbnVtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgXAoteyBcCi0JcmV0dXJuIHNob3dfdGVtcChkZXYsIGJ1ZiwgbnVtLTEpOyBcCi19IFwKLXN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNudW0jI19pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wIyNudW0sIE5VTEwpOyBcCi1zdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfbWF4IyNudW0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCi17IFwKLQlyZXR1cm4gc2hvd190ZW1wX21heChkZXYsIGJ1ZiwgbnVtLTEpOyBcCi19IFwKLXN0YXRpYyBzc2l6ZV90IHNldF90ZW1wX21heCMjbnVtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwgXAotCQkJCQlzaXplX3QgY291bnQpIFwKLXsgXAotCXJldHVybiBzZXRfdGVtcF9tYXgoZGV2LCBidWYsIGNvdW50LCBudW0tMSk7IFwKLX0gXAotc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI251bSMjX21heCwgU19JUlVHTyB8IFNfSVdVU1IsIFwKLQkJc2hvd190ZW1wX21heCMjbnVtLCBzZXRfdGVtcF9tYXgjI251bSk7IFwKLXN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9oeXN0IyNudW0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCi17IFwKLQlyZXR1cm4gc2hvd190ZW1wX2h5c3QoZGV2LCBidWYsIG51bS0xKTsgXAotfSBcCi1zdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9oeXN0IyNudW0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBcCi0JCQkJCXNpemVfdCBjb3VudCkgXAoteyBcCi0JcmV0dXJuIHNldF90ZW1wX2h5c3QoZGV2LCBidWYsIGNvdW50LCBudW0tMSk7IFwKLX0gXAotc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI251bSMjX21heF9oeXN0LCBTX0lSVUdPIHwgU19JV1VTUiwgXAotCQlzaG93X3RlbXBfaHlzdCMjbnVtLCBzZXRfdGVtcF9oeXN0IyNudW0pOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wIyNudW0jI19pbnB1dCwgU19JUlVHTywgXAorCQlzaG93X3RlbXAsIE5VTEwsIG51bSAtIDEpOyBcCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAjI251bSMjX21heCwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJc2hvd190ZW1wX21heCwgc2V0X3RlbXBfbWF4LCBudW0gLSAxKTsgXAorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wIyNudW0jI19tYXhfaHlzdCwgU19JUlVHTyB8IFNfSVdVU1IsIFwKKwkJc2hvd190ZW1wX2h5c3QsIHNldF90ZW1wX2h5c3QsIG51bSAtIDEpCiAKIHN5c2ZzX3RlbXAoMSk7CiBzeXNmc190ZW1wKDIpOwpAQCAtNTAzLDcgKzQ0Myw4IEBACiBzeXNmc190ZW1wKDQpOwogCiAvKiBWSUQgKi8KLXN0YXRpYyBzc2l6ZV90IHNob3dfdmlkKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfdmlkKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgYXNiMTAwX2RhdGEgKmRhdGEgPSBhc2IxMDBfdXBkYXRlX2RldmljZShkZXYpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2aWRfZnJvbV9yZWcoZGF0YS0+dmlkLCBkYXRhLT52cm0pKTsKQEAgLTUxMiwyNSArNDUzLDI2IEBACiBzdGF0aWMgREVWSUNFX0FUVFIoY3B1MF92aWQsIFNfSVJVR08sIHNob3dfdmlkLCBOVUxMKTsKIAogLyogVlJNICovCi1zdGF0aWMgc3NpemVfdCBzaG93X3ZybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X3ZybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCiB7CiAJc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnZybSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNldF92cm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBzZXRfdnJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKLQlkYXRhLT52cm0gPSB2YWw7CisJc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJZGF0YS0+dnJtID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CiAJcmV0dXJuIGNvdW50OwogfQogCiAvKiBBbGFybXMgKi8KIHN0YXRpYyBERVZJQ0VfQVRUUih2cm0sIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3ZybSwgc2V0X3ZybSk7CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm1zKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm1zKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgYXNiMTAwX2RhdGEgKmRhdGEgPSBhc2IxMDBfdXBkYXRlX2RldmljZShkZXYpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT5hbGFybXMpOwpAQCAtNTM4LDE0ICs0ODAsMzUgQEAKIAogc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgc2hvd19hbGFybXMsIE5VTEwpOwogCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgYml0bnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXN0cnVjdCBhc2IxMDBfZGF0YSAqZGF0YSA9IGFzYjEwMF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIChkYXRhLT5hbGFybXMgPj4gYml0bnIpICYgMSk7Cit9CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluM19hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluNF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgOCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjFfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDYpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4yX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA3KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuM19hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgNCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA1KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDEzKTsKKwogLyogMSBQV00gKi8KLXN0YXRpYyBzc2l6ZV90IHNob3dfcHdtMShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X3B3bTEoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQogewogCXN0cnVjdCBhc2IxMDBfZGF0YSAqZGF0YSA9IGFzYjEwMF91cGRhdGVfZGV2aWNlKGRldik7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIEFTQjEwMF9QV01fRlJPTV9SRUcoZGF0YS0+cHdtICYgMHgwZikpOwogfQogCi1zdGF0aWMgc3NpemVfdCBzZXRfcHdtMShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHNldF9wd20xKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CiAJc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CkBAIC01NTksMTQgKzUyMiwxNSBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19wd21fZW5hYmxlMShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X3B3bV9lbmFibGUxKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgYXNiMTAwX2RhdGEgKmRhdGEgPSBhc2IxMDBfdXBkYXRlX2RldmljZShkZXYpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAoZGF0YS0+cHdtICYgMHg4MCkgPyAxIDogMCk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNldF9wd21fZW5hYmxlMShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCi0JCQkJc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3Qgc2V0X3B3bV9lbmFibGUxKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CiAJc3RydWN0IGFzYjEwMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CkBAIC01ODUsNTAgKzU0OSw2MiBAQAogCQlzaG93X3B3bV9lbmFibGUxLCBzZXRfcHdtX2VuYWJsZTEpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYXNiMTAwX2F0dHJpYnV0ZXNbXSA9IHsKLQkmZGV2X2F0dHJfaW4wX2lucHV0LmF0dHIsCi0JJmRldl9hdHRyX2luMF9taW4uYXR0ciwKLQkmZGV2X2F0dHJfaW4wX21heC5hdHRyLAotCSZkZXZfYXR0cl9pbjFfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfaW4xX21pbi5hdHRyLAotCSZkZXZfYXR0cl9pbjFfbWF4LmF0dHIsCi0JJmRldl9hdHRyX2luMl9pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl9pbjJfbWluLmF0dHIsCi0JJmRldl9hdHRyX2luMl9tYXguYXR0ciwKLQkmZGV2X2F0dHJfaW4zX2lucHV0LmF0dHIsCi0JJmRldl9hdHRyX2luM19taW4uYXR0ciwKLQkmZGV2X2F0dHJfaW4zX21heC5hdHRyLAotCSZkZXZfYXR0cl9pbjRfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfaW40X21pbi5hdHRyLAotCSZkZXZfYXR0cl9pbjRfbWF4LmF0dHIsCi0JJmRldl9hdHRyX2luNV9pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl9pbjVfbWluLmF0dHIsCi0JJmRldl9hdHRyX2luNV9tYXguYXR0ciwKLQkmZGV2X2F0dHJfaW42X2lucHV0LmF0dHIsCi0JJmRldl9hdHRyX2luNl9taW4uYXR0ciwKLQkmZGV2X2F0dHJfaW42X21heC5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4wX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjBfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjBfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4yX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4yX21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4zX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjNfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjNfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjRfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNF9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNF9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW41X21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW41X21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW42X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjZfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjZfbWF4LmRldl9hdHRyLmF0dHIsCiAKLQkmZGV2X2F0dHJfZmFuMV9pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl9mYW4xX21pbi5hdHRyLAotCSZkZXZfYXR0cl9mYW4xX2Rpdi5hdHRyLAotCSZkZXZfYXR0cl9mYW4yX2lucHV0LmF0dHIsCi0JJmRldl9hdHRyX2ZhbjJfbWluLmF0dHIsCi0JJmRldl9hdHRyX2ZhbjJfZGl2LmF0dHIsCi0JJmRldl9hdHRyX2ZhbjNfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfZmFuM19taW4uYXR0ciwKLQkmZGV2X2F0dHJfZmFuM19kaXYuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2Rpdi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuMl9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfZGl2LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4zX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4zX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuM19kaXYuZGV2X2F0dHIuYXR0ciwKIAotCSZkZXZfYXR0cl90ZW1wMV9pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl90ZW1wMV9tYXguYXR0ciwKLQkmZGV2X2F0dHJfdGVtcDFfbWF4X2h5c3QuYXR0ciwKLQkmZGV2X2F0dHJfdGVtcDJfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfdGVtcDJfbWF4LmF0dHIsCi0JJmRldl9hdHRyX3RlbXAyX21heF9oeXN0LmF0dHIsCi0JJmRldl9hdHRyX3RlbXAzX2lucHV0LmF0dHIsCi0JJmRldl9hdHRyX3RlbXAzX21heC5hdHRyLAotCSZkZXZfYXR0cl90ZW1wM19tYXhfaHlzdC5hdHRyLAotCSZkZXZfYXR0cl90ZW1wNF9pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl90ZW1wNF9tYXguYXR0ciwKLQkmZGV2X2F0dHJfdGVtcDRfbWF4X2h5c3QuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heF9oeXN0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9tYXhfaHlzdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbWF4X2h5c3QuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXA0X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wNF9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXA0X21heF9oeXN0LmRldl9hdHRyLmF0dHIsCisKKwkmc2Vuc29yX2Rldl9hdHRyX2luMF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luM19hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW40X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4yX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4zX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2FsYXJtLmRldl9hdHRyLmF0dHIsCiAKIAkmZGV2X2F0dHJfY3B1MF92aWQuYXR0ciwKIAkmZGV2X2F0dHJfdnJtLmF0dHIsCkBAIC02NTYsMTAgKzYzMiwxMCBAQAogfQogCiBzdGF0aWMgaW50IGFzYjEwMF9kZXRlY3Rfc3ViY2xpZW50cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLAotCQlpbnQga2luZCwgc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQpCisJCWludCBraW5kLCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCWludCBpLCBpZCwgZXJyOwotCXN0cnVjdCBhc2IxMDBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50KTsKKwlzdHJ1Y3QgYXNiMTAwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAogCWRhdGEtPmxtNzVbMF0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOwogCWlmICghKGRhdGEtPmxtNzVbMF0pKSB7CkBAIC02NzksMjYgKzY1NSwyNiBAQAogCQlmb3IgKGkgPSAyOyBpIDw9IDM7IGkrKykgewogCQkJaWYgKGZvcmNlX3N1YmNsaWVudHNbaV0gPCAweDQ4IHx8CiAJCQkgICAgZm9yY2Vfc3ViY2xpZW50c1tpXSA+IDB4NGYpIHsKLQkJCQlkZXZfZXJyKCZuZXdfY2xpZW50LT5kZXYsICJpbnZhbGlkIHN1YmNsaWVudCAiCisJCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpbnZhbGlkIHN1YmNsaWVudCAiCiAJCQkJCSJhZGRyZXNzICVkOyBtdXN0IGJlIDB4NDgtMHg0ZlxuIiwKIAkJCQkJZm9yY2Vfc3ViY2xpZW50c1tpXSk7CiAJCQkJZXJyID0gLUVOT0RFVjsKIAkJCQlnb3RvIEVSUk9SX1NDXzI7CiAJCQl9CiAJCX0KLQkJYXNiMTAwX3dyaXRlX3ZhbHVlKG5ld19jbGllbnQsIEFTQjEwMF9SRUdfSTJDX1NVQkFERFIsCisJCWFzYjEwMF93cml0ZV92YWx1ZShjbGllbnQsIEFTQjEwMF9SRUdfSTJDX1NVQkFERFIsCiAJCQkJCShmb3JjZV9zdWJjbGllbnRzWzJdICYgMHgwNykgfAotCQkJCQkoKGZvcmNlX3N1YmNsaWVudHNbM10gJiAweDA3KSA8PDQpKTsKKwkJCQkJKChmb3JjZV9zdWJjbGllbnRzWzNdICYgMHgwNykgPDwgNCkpOwogCQlkYXRhLT5sbTc1WzBdLT5hZGRyID0gZm9yY2Vfc3ViY2xpZW50c1syXTsKIAkJZGF0YS0+bG03NVsxXS0+YWRkciA9IGZvcmNlX3N1YmNsaWVudHNbM107CiAJfSBlbHNlIHsKLQkJaW50IHZhbCA9IGFzYjEwMF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEFTQjEwMF9SRUdfSTJDX1NVQkFERFIpOworCQlpbnQgdmFsID0gYXNiMTAwX3JlYWRfdmFsdWUoY2xpZW50LCBBU0IxMDBfUkVHX0kyQ19TVUJBRERSKTsKIAkJZGF0YS0+bG03NVswXS0+YWRkciA9IDB4NDggKyAodmFsICYgMHgwNyk7CiAJCWRhdGEtPmxtNzVbMV0tPmFkZHIgPSAweDQ4ICsgKCh2YWwgPj4gNCkgJiAweDA3KTsKIAl9CiAKLQlpZihkYXRhLT5sbTc1WzBdLT5hZGRyID09IGRhdGEtPmxtNzVbMV0tPmFkZHIpIHsKLQkJZGV2X2VycigmbmV3X2NsaWVudC0+ZGV2LCAiZHVwbGljYXRlIGFkZHJlc3NlcyAweCV4ICIKKwlpZiAoZGF0YS0+bG03NVswXS0+YWRkciA9PSBkYXRhLT5sbTc1WzFdLT5hZGRyKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZHVwbGljYXRlIGFkZHJlc3NlcyAweCV4ICIKIAkJCQkiZm9yIHN1YmNsaWVudHNcbiIsIGRhdGEtPmxtNzVbMF0tPmFkZHIpOwogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIEVSUk9SX1NDXzI7CkBAIC03MDgsMTggKzY4NCwxNyBAQAogCQlpMmNfc2V0X2NsaWVudGRhdGEoZGF0YS0+bG03NVtpXSwgTlVMTCk7CiAJCWRhdGEtPmxtNzVbaV0tPmFkYXB0ZXIgPSBhZGFwdGVyOwogCQlkYXRhLT5sbTc1W2ldLT5kcml2ZXIgPSAmYXNiMTAwX2RyaXZlcjsKLQkJZGF0YS0+bG03NVtpXS0+ZmxhZ3MgPSAwOwogCQlzdHJsY3B5KGRhdGEtPmxtNzVbaV0tPm5hbWUsICJhc2IxMDAgc3ViY2xpZW50IiwgSTJDX05BTUVfU0laRSk7CiAJfQogCiAJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChkYXRhLT5sbTc1WzBdKSkpIHsKLQkJZGV2X2VycigmbmV3X2NsaWVudC0+ZGV2LCAic3ViY2xpZW50ICVkIHJlZ2lzdHJhdGlvbiAiCisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAic3ViY2xpZW50ICVkIHJlZ2lzdHJhdGlvbiAiCiAJCQkiYXQgYWRkcmVzcyAweCV4IGZhaWxlZC5cbiIsIGksIGRhdGEtPmxtNzVbMF0tPmFkZHIpOwogCQlnb3RvIEVSUk9SX1NDXzI7CiAJfQogCiAJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChkYXRhLT5sbTc1WzFdKSkpIHsKLQkJZGV2X2VycigmbmV3X2NsaWVudC0+ZGV2LCAic3ViY2xpZW50ICVkIHJlZ2lzdHJhdGlvbiAiCisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAic3ViY2xpZW50ICVkIHJlZ2lzdHJhdGlvbiAiCiAJCQkiYXQgYWRkcmVzcyAweCV4IGZhaWxlZC5cbiIsIGksIGRhdGEtPmxtNzVbMV0tPmFkZHIpOwogCQlnb3RvIEVSUk9SX1NDXzM7CiAJfQpAQCAtNzQwLDcgKzcxNSw3IEBACiBzdGF0aWMgaW50IGFzYjEwMF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCiB7CiAJaW50IGVycjsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCBhc2IxMDBfZGF0YSAqZGF0YTsKIAogCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgewpAQCAtNzYwLDEzICs3MzUsMTIgQEAKIAkJZ290byBFUlJPUjA7CiAJfQogCi0JbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKIAltdXRleF9pbml0KCZkYXRhLT5sb2NrKTsKLQlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7Ci0JbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7Ci0JbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7Ci0JbmV3X2NsaWVudC0+ZHJpdmVyID0gJmFzYjEwMF9kcml2ZXI7Ci0JbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOworCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwljbGllbnQtPmRyaXZlciA9ICZhc2IxMDBfZHJpdmVyOwogCiAJLyogTm93LCB3ZSBkbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbi4gKi8KIApAQCAtNzc2LDE1ICs3NTAsMTUgQEAKIAkgICBiYW5rLiAqLwogCWlmIChraW5kIDwgMCkgewogCi0JCWludCB2YWwxID0gYXNiMTAwX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgQVNCMTAwX1JFR19CQU5LKTsKLQkJaW50IHZhbDIgPSBhc2IxMDBfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBBU0IxMDBfUkVHX0NISVBNQU4pOworCQlpbnQgdmFsMSA9IGFzYjEwMF9yZWFkX3ZhbHVlKGNsaWVudCwgQVNCMTAwX1JFR19CQU5LKTsKKwkJaW50IHZhbDIgPSBhc2IxMDBfcmVhZF92YWx1ZShjbGllbnQsIEFTQjEwMF9SRUdfQ0hJUE1BTik7CiAKIAkJLyogSWYgd2UncmUgaW4gYmFuayAwICovCi0JCWlmICggKCEodmFsMSAmIDB4MDcpKSAmJgorCQlpZiAoKCEodmFsMSAmIDB4MDcpKSAmJgogCQkJCS8qIENoZWNrIGZvciBBU0IxMDAgSUQgKGxvdyBieXRlKSAqLwotCQkJCSggKCghKHZhbDEgJiAweDgwKSkgJiYgKHZhbDIgIT0gMHg5NCkpIHx8CisJCQkJKCgoISh2YWwxICYgMHg4MCkpICYmICh2YWwyICE9IDB4OTQpKSB8fAogCQkJCS8qIENoZWNrIGZvciBBU0IxMDAgSUQgKGhpZ2ggYnl0ZSApICovCi0JCQkJKCh2YWwxICYgMHg4MCkgJiYgKHZhbDIgIT0gMHgwNikpICkgKSB7CisJCQkJKCh2YWwxICYgMHg4MCkgJiYgKHZhbDIgIT0gMHgwNikpKSkgewogCQkJcHJfZGVidWcoImFzYjEwMC5vOiBkZXRlY3QgZmFpbGVkLCAiCiAJCQkJCSJiYWQgY2hpcCBpZCAweCUwMnghXG4iLCB2YWwyKTsKIAkJCWVyciA9IC1FTk9ERVY7CkBAIC03OTUsMTkgKzc2OSwxOSBAQAogCiAJLyogV2UgaGF2ZSBlaXRoZXIgaGFkIGEgZm9yY2UgcGFyYW1ldGVyLCBvciB3ZSBoYXZlIGFscmVhZHkgZGV0ZWN0ZWQKIAkgICBXaW5ib25kLiBQdXQgaXQgbm93IGludG8gYmFuayAwIGFuZCBWZW5kb3IgSUQgSGlnaCBCeXRlICovCi0JYXNiMTAwX3dyaXRlX3ZhbHVlKG5ld19jbGllbnQsIEFTQjEwMF9SRUdfQkFOSywKLQkJKGFzYjEwMF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEFTQjEwMF9SRUdfQkFOSykgJiAweDc4KSB8IDB4ODApOworCWFzYjEwMF93cml0ZV92YWx1ZShjbGllbnQsIEFTQjEwMF9SRUdfQkFOSywKKwkJKGFzYjEwMF9yZWFkX3ZhbHVlKGNsaWVudCwgQVNCMTAwX1JFR19CQU5LKSAmIDB4NzgpIHwgMHg4MCk7CiAKIAkvKiBEZXRlcm1pbmUgdGhlIGNoaXAgdHlwZS4gKi8KIAlpZiAoa2luZCA8PSAwKSB7Ci0JCWludCB2YWwxID0gYXNiMTAwX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgQVNCMTAwX1JFR19XQ0hJUElEKTsKLQkJaW50IHZhbDIgPSBhc2IxMDBfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBBU0IxMDBfUkVHX0NISVBNQU4pOworCQlpbnQgdmFsMSA9IGFzYjEwMF9yZWFkX3ZhbHVlKGNsaWVudCwgQVNCMTAwX1JFR19XQ0hJUElEKTsKKwkJaW50IHZhbDIgPSBhc2IxMDBfcmVhZF92YWx1ZShjbGllbnQsIEFTQjEwMF9SRUdfQ0hJUE1BTik7CiAKIAkJaWYgKCh2YWwxID09IDB4MzEpICYmICh2YWwyID09IDB4MDYpKQogCQkJa2luZCA9IGFzYjEwMDsKIAkJZWxzZSB7CiAJCQlpZiAoa2luZCA9PSAwKQotCQkJCWRldl93YXJuKCZuZXdfY2xpZW50LT5kZXYsICJpZ25vcmluZyAiCisJCQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiaWdub3JpbmcgIgogCQkJCQkiJ2ZvcmNlJyBwYXJhbWV0ZXIgZm9yIHVua25vd24gY2hpcCAiCiAJCQkJCSJhdCBhZGFwdGVyICVkLCBhZGRyZXNzIDB4JTAyeC5cbiIsCiAJCQkJCWkyY19hZGFwdGVyX2lkKGFkYXB0ZXIpLCBhZGRyZXNzKTsKQEAgLTgxNywzNCArNzkxLDMyIEBACiAJfQogCiAJLyogRmlsbCBpbiByZW1haW5pbmcgY2xpZW50IGZpZWxkcyBhbmQgcHV0IGl0IGludG8gdGhlIGdsb2JhbCBsaXN0ICovCi0Jc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCAiYXNiMTAwIiwgSTJDX05BTUVfU0laRSk7CisJc3RybGNweShjbGllbnQtPm5hbWUsICJhc2IxMDAiLCBJMkNfTkFNRV9TSVpFKTsKIAlkYXRhLT50eXBlID0ga2luZDsKLQotCWRhdGEtPnZhbGlkID0gMDsKIAltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCi0JaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpKSkKIAkJZ290byBFUlJPUjE7CiAKIAkvKiBBdHRhY2ggc2Vjb25kYXJ5IGxtNzUgY2xpZW50cyAqLwogCWlmICgoZXJyID0gYXNiMTAwX2RldGVjdF9zdWJjbGllbnRzKGFkYXB0ZXIsIGFkZHJlc3MsIGtpbmQsCi0JCQluZXdfY2xpZW50KSkpCisJCQljbGllbnQpKSkKIAkJZ290byBFUlJPUjI7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBjaGlwICovCi0JYXNiMTAwX2luaXRfY2xpZW50KG5ld19jbGllbnQpOworCWFzYjEwMF9pbml0X2NsaWVudChjbGllbnQpOwogCiAJLyogQSBmZXcgdmFycyBuZWVkIHRvIGJlIGZpbGxlZCB1cG9uIHN0YXJ0dXAgKi8KLQlkYXRhLT5mYW5fbWluWzBdID0gYXNiMTAwX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgQVNCMTAwX1JFR19GQU5fTUlOKDApKTsKLQlkYXRhLT5mYW5fbWluWzFdID0gYXNiMTAwX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgQVNCMTAwX1JFR19GQU5fTUlOKDEpKTsKLQlkYXRhLT5mYW5fbWluWzJdID0gYXNiMTAwX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgQVNCMTAwX1JFR19GQU5fTUlOKDIpKTsKKwlkYXRhLT5mYW5fbWluWzBdID0gYXNiMTAwX3JlYWRfdmFsdWUoY2xpZW50LCBBU0IxMDBfUkVHX0ZBTl9NSU4oMCkpOworCWRhdGEtPmZhbl9taW5bMV0gPSBhc2IxMDBfcmVhZF92YWx1ZShjbGllbnQsIEFTQjEwMF9SRUdfRkFOX01JTigxKSk7CisJZGF0YS0+ZmFuX21pblsyXSA9IGFzYjEwMF9yZWFkX3ZhbHVlKGNsaWVudCwgQVNCMTAwX1JFR19GQU5fTUlOKDIpKTsKIAogCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCi0JaWYgKChlcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJm5ld19jbGllbnQtPmRldi5rb2JqLCAmYXNiMTAwX2dyb3VwKSkpCisJaWYgKChlcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZhc2IxMDBfZ3JvdXApKSkKIAkJZ290byBFUlJPUjM7CiAKLQlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJm5ld19jbGllbnQtPmRldik7CisJZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZjbGllbnQtPmRldik7CiAJaWYgKElTX0VSUihkYXRhLT5od21vbl9kZXYpKSB7CiAJCWVyciA9IFBUUl9FUlIoZGF0YS0+aHdtb25fZGV2KTsKIAkJZ290byBFUlJPUjQ7CkBAIC04NTMsMTQgKzgyNSwxNCBAQAogCXJldHVybiAwOwogCiBFUlJPUjQ6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZuZXdfY2xpZW50LT5kZXYua29iaiwgJmFzYjEwMF9ncm91cCk7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmYXNiMTAwX2dyb3VwKTsKIEVSUk9SMzoKIAlpMmNfZGV0YWNoX2NsaWVudChkYXRhLT5sbTc1WzFdKTsKIAlpMmNfZGV0YWNoX2NsaWVudChkYXRhLT5sbTc1WzBdKTsKIAlrZnJlZShkYXRhLT5sbTc1WzFdKTsKIAlrZnJlZShkYXRhLT5sbTc1WzBdKTsKIEVSUk9SMjoKLQlpMmNfZGV0YWNoX2NsaWVudChuZXdfY2xpZW50KTsKKwlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOwogRVJST1IxOgogCWtmcmVlKGRhdGEpOwogRVJST1IwOgpAQCAtOTE2LDE3ICs4ODgsMTcgQEAKIAkJLyogY29udmVydCBmcm9tIElTQSB0byBMTTc1IEkyQyBhZGRyZXNzZXMgKi8KIAkJc3dpdGNoIChyZWcgJiAweGZmKSB7CiAJCWNhc2UgMHg1MDogLyogVEVNUCAqLwotCQkJcmVzID0gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YSAoY2wsIDApKTsKKwkJCXJlcyA9IHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2wsIDApKTsKIAkJCWJyZWFrOwogCQljYXNlIDB4NTI6IC8qIENPTkZJRyAqLwogCQkJcmVzID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsLCAxKTsKIAkJCWJyZWFrOwogCQljYXNlIDB4NTM6IC8qIEhZU1QgKi8KLQkJCXJlcyA9IHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEgKGNsLCAyKSk7CisJCQlyZXMgPSBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsLCAyKSk7CiAJCQlicmVhazsKIAkJY2FzZSAweDU1OiAvKiBNQVggKi8KIAkJZGVmYXVsdDoKLQkJCXJlcyA9IHN3YWIxNihpMmNfc21idXNfcmVhZF93b3JkX2RhdGEgKGNsLCAzKSk7CisJCQlyZXMgPSBzd2FiMTYoaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsLCAzKSk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTk4OSw3ICs5NjEsNyBAQAogCXZpZCA9IHZpZF9mcm9tX3JlZyh2aWQsIGRhdGEtPnZybSk7CiAKIAkvKiBTdGFydCBtb25pdG9yaW5nICovCi0JYXNiMTAwX3dyaXRlX3ZhbHVlKGNsaWVudCwgQVNCMTAwX1JFR19DT05GSUcsIAorCWFzYjEwMF93cml0ZV92YWx1ZShjbGllbnQsIEFTQjEwMF9SRUdfQ09ORklHLAogCQkoYXNiMTAwX3JlYWRfdmFsdWUoY2xpZW50LCBBU0IxMDBfUkVHX0NPTkZJRykgJiAweGY3KSB8IDB4MDEpOwogfQogCkBAIC0xMDc4LDQgKzEwNTAsMyBAQAogCiBtb2R1bGVfaW5pdChhc2IxMDBfaW5pdCk7CiBtb2R1bGVfZXhpdChhc2IxMDBfZXhpdCk7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZG1lMTczNy5jIGIvZHJpdmVycy9od21vbi9kbWUxNzM3LmMKaW5kZXggYTg3OGM5OC4uZGRkZGQ5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9kbWUxNzM3LmMKKysrIGIvZHJpdmVycy9od21vbi9kbWUxNzM3LmMKQEAgLTQ0LDYgKzQ0LDEwIEBACiBtb2R1bGVfcGFyYW0oZm9yY2Vfc3RhcnQsIGJvb2wsIDApOwogTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9zdGFydCwgIkZvcmNlIHRoZSBjaGlwIHRvIHN0YXJ0IG1vbml0b3JpbmcgaW5wdXRzIik7CiAKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmb3JjZV9pZDsKK21vZHVsZV9wYXJhbShmb3JjZV9pZCwgdXNob3J0LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfaWQsICJPdmVycmlkZSB0aGUgZGV0ZWN0ZWQgZGV2aWNlIElEIik7CisKIC8qIEFkZHJlc3NlcyB0byBzY2FuICovCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0gezB4MmMsIDB4MmQsIDB4MmUsIEkyQ19DTElFTlRfRU5EfTsKIApAQCAtMjc5LDE0ICsyODMsMjEgQEAKIC8qIEZhbiBpbnB1dCBSUE0gKi8KIHN0YXRpYyBpbmxpbmUgaW50IEZBTl9GUk9NX1JFRyhpbnQgcmVnLCBpbnQgdHBjKQogewotCXJldHVybiAocmVnID09IDAgfHwgcmVnID09IDB4ZmZmZikgPyAwIDoKLQkJKHRwYyA9PSAwKSA/IDkwMDAwICogNjAgLyByZWcgOiB0cGMgKiByZWc7CisJaWYgKHRwYykgeworCQlyZXR1cm4gdHBjICogcmVnOworCX0gZWxzZSB7CisJCXJldHVybiAocmVnID09IDAgfHwgcmVnID09IDB4ZmZmZikgPyAwIDogOTAwMDAgKiA2MCAvIHJlZzsKKwl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IEZBTl9UT19SRUcoaW50IHZhbCwgaW50IHRwYykKIHsKLQlyZXR1cm4gU0VOU09SU19MSU1JVCgodHBjID09IDApID8gOTAwMDAgKiA2MCAvIHZhbCA6IHZhbCAvIHRwYywKLQkJCSAgICAgMCwgMHhmZmZmKTsKKwlpZiAodHBjKSB7CisJCXJldHVybiBTRU5TT1JTX0xJTUlUKHZhbCAvIHRwYywgMCwgMHhmZmZmKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gKHZhbCA8PSAwKSA/IDB4ZmZmZiA6CisJCQlTRU5TT1JTX0xJTUlUKDkwMDAwICogNjAgLyB2YWwsIDAsIDB4ZmZmZSk7CisJfQogfQogCiAvKiBGYW4gVFBDICh0YWNoIHB1bHNlIGNvdW50KQpAQCAtMjAxOSw3ICsyMDMwLDcgQEAKIAogCS8qIENoZWNrIGRldmljZSBJRAogCSAqIFRoZSBETUUxNzM3IGNhbiByZXR1cm4gZWl0aGVyIDB4Nzggb3IgMHg3NyBhcyBpdHMgZGV2aWNlIElELiAqLwotCXJlZyA9IGRtZTE3Mzdfc2lvX2luYihzaW9fY2lwLCAweDIwKTsKKwlyZWcgPSBmb3JjZV9pZCA/IGZvcmNlX2lkIDogZG1lMTczN19zaW9faW5iKHNpb19jaXAsIDB4MjApOwogCWlmICghKHJlZyA9PSAweDc3IHx8IHJlZyA9PSAweDc4KSkgewogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIGV4aXQ7CkBAIC0yMTkxLDcgKzIyMDIsNyBAQAogCS8qIENoZWNrIGRldmljZSBJRAogCSAqIFdlIGN1cnJlbnRseSBrbm93IGFib3V0IFNDSDMxMTIgKDB4N2MpLCBTQ0gzMTE0ICgweDdkKSwgYW5kCiAJICogU0NIMzExNiAoMHg3ZikuICovCi0JcmVnID0gZG1lMTczN19zaW9faW5iKHNpb19jaXAsIDB4MjApOworCXJlZyA9IGZvcmNlX2lkID8gZm9yY2VfaWQgOiBkbWUxNzM3X3Npb19pbmIoc2lvX2NpcCwgMHgyMCk7CiAJaWYgKCEocmVnID09IDB4N2MgfHwgcmVnID09IDB4N2QgfHwgcmVnID09IDB4N2YpKSB7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZXhpdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZHMxNjIxLmMgYi9kcml2ZXJzL2h3bW9uL2RzMTYyMS5jCmluZGV4IGI3YmQwMDAuLjNmNTE2M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vZHMxNjIxLmMKKysrIGIvZHJpdmVycy9od21vbi9kczE2MjEuYwpAQCAtOTQsNyArOTQsNiBAQAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gImRzMTYyMSIsCiAJfSwKLQkuaWQJCT0gSTJDX0RSSVZFUklEX0RTMTYyMSwKIAkuYXR0YWNoX2FkYXB0ZXIJPSBkczE2MjFfYXR0YWNoX2FkYXB0ZXIsCiAJLmRldGFjaF9jbGllbnQJPSBkczE2MjFfZGV0YWNoX2NsaWVudCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2Y3MTgwNWYuYyBiL2RyaXZlcnMvaHdtb24vZjcxODA1Zi5jCmluZGV4IDVkOWQ1Y2MuLjdhMTRhMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vZjcxODA1Zi5jCisrKyBiL2RyaXZlcnMvaHdtb24vZjcxODA1Zi5jCkBAIC00MSw2ICs0MSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZm9yY2VfaWQ7Cittb2R1bGVfcGFyYW0oZm9yY2VfaWQsIHVzaG9ydCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2lkLCAiT3ZlcnJpZGUgdGhlIGRldGVjdGVkIGRldmljZSBJRCIpOworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAogI2RlZmluZSBEUlZOQU1FICJmNzE4MDVmIgpAQCAtMTQ5Nyw3ICsxNTAxLDcgQEAKIAlpZiAoZGV2aWQgIT0gU0lPX0ZJTlRFS19JRCkKIAkJZ290byBleGl0OwogCi0JZGV2aWQgPSBzdXBlcmlvX2ludyhzaW9hZGRyLCBTSU9fUkVHX0RFVklEKTsKKwlkZXZpZCA9IGZvcmNlX2lkID8gZm9yY2VfaWQgOiBzdXBlcmlvX2ludyhzaW9hZGRyLCBTSU9fUkVHX0RFVklEKTsKIAlzd2l0Y2ggKGRldmlkKSB7CiAJY2FzZSBTSU9fRjcxODA1Rl9JRDoKIAkJc2lvX2RhdGEtPmtpbmQgPSBmNzE4MDVmOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9mNzE4ODJmZy5jIGIvZHJpdmVycy9od21vbi9mNzE4ODJmZy5jCmluZGV4IDZkYjc0NDMuLmNiZWI0OTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vZjcxODgyZmcuYworKysgYi9kcml2ZXJzL2h3bW9uL2Y3MTg4MmZnLmMKQEAgLTc0LDYgKzc0LDEwIEBACiAKICNkZWZpbmUgRkFOX01JTl9ERVRFQ1QJCQkzNjYgLyogTG93ZXN0IGRldGVjdGFibGUgZmFuc3BlZWQgKi8KIAorc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvcmNlX2lkOworbW9kdWxlX3BhcmFtKGZvcmNlX2lkLCB1c2hvcnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9pZCwgIk92ZXJyaWRlIHRoZSBkZXRlY3RlZCBkZXZpY2UgSUQiKTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmY3MTg4MmZnX3BkZXYgPSBOVUxMOwogCiAvKiBTdXBlci1JL08gRnVuY3Rpb24gcHJvdG90eXBlcyAqLwpAQCAtODQzLDcgKzg0Nyw3IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKLQlkZXZpZCA9IHN1cGVyaW9faW53KHNpb2FkZHIsIFNJT19SRUdfREVWSUQpOworCWRldmlkID0gZm9yY2VfaWQgPyBmb3JjZV9pZCA6IHN1cGVyaW9faW53KHNpb2FkZHIsIFNJT19SRUdfREVWSUQpOwogCWlmIChkZXZpZCAhPSBTSU9fRjcxODgyX0lEKSB7CiAJCXByaW50ayhLRVJOX0lORk8gRFJWTkFNRSAiOiBVbnN1cHBvcnRlZCBGaW50ZWsgZGV2aWNlXG4iKTsKIAkJZ290byBleGl0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9mc2NoZXIuYyBiL2RyaXZlcnMvaHdtb24vZnNjaGVyLmMKaW5kZXggZTY3YzM2OS4uNzIxYzcwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9mc2NoZXIuYworKysgYi9kcml2ZXJzL2h3bW9uL2ZzY2hlci5jCkBAIC0xMjMsNyArMTIzLDYgQEAKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJmc2NoZXIiLAogCX0sCi0JLmlkCQk9IEkyQ19EUklWRVJJRF9GU0NIRVIsCiAJLmF0dGFjaF9hZGFwdGVyCT0gZnNjaGVyX2F0dGFjaF9hZGFwdGVyLAogCS5kZXRhY2hfY2xpZW50CT0gZnNjaGVyX2RldGFjaF9jbGllbnQsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9mc2NobWQuYyBiL2RyaXZlcnMvaHdtb24vZnNjaG1kLmMKaW5kZXggNjNhNGRmMC4uYjdjOWVlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9mc2NobWQuYworKysgYi9kcml2ZXJzL2h3bW9uL2ZzY2htZC5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogCiAvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLwogc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHg3MywgSTJDX0NMSUVOVF9FTkQgfTsKQEAgLTEzMyw3ICsxMzQsNyBAQAogCXsgMHg3MSwgMHg4MSwgMHg5MSB9LAkJCQkvKiBoZXIgKi8KIAl7IDB4NzEsIDB4ZDEsIDB4ODEsIDB4OTEgfSwJCQkvKiBzY3kgKi8KIAl7IDB4NzEsIDB4ODEsIDB4OTEgfSwJCQkJLyogaHJjICovCi0JeyAweDcxLCAweDgxLCAweDkxLCAweGQxLCAweGUxIH0sCQkvKsKgaG1kICovCisJeyAweDcxLCAweDgxLCAweDkxLCAweGQxLCAweGUxIH0sCQkvKiBobWQgKi8KIH07CiAKIC8qIHRlbXBlcmF0dXJlIGhpZ2ggbGltaXQgcmVnaXN0ZXJzLCBGU0MgZG9lcyBub3QgZG9jdW1lbnQgdGhlc2UuIFByb3ZlbiB0byBiZQpAQCAtMTQ2LDcgKzE0Nyw3IEBACiAJeyAweDc2LCAweDg2LCAweDk2IH0sCQkJCS8qIGhlciAqLwogCXsgMHg3NiwgMHhkNiwgMHg4NiwgMHg5NiB9LAkJCS8qIHNjeSAqLwogCXsgMHg3NiwgMHg4NiwgMHg5NiB9LAkJCQkvKiBocmMgKi8KLQl7IDB4NzYsIDB4ODYsIDB4OTYsIDB4ZDYsIDB4ZTYgfSwJCS8qwqBobWQgKi8KKwl7IDB4NzYsIDB4ODYsIDB4OTYsIDB4ZDYsIDB4ZTYgfSwJCS8qIGhtZCAqLwogfTsKIAogLyogVGhlc2Ugd2VyZSBmb3VuZCB0aHJvdWdoIGV4cGVyaW1lbnRpbmcgd2l0aCBhbiBmc2NoZXIsIGN1cnJlbnRseSB0aGV5IGFyZQpAQCAtMjEwLDYgKzIxMSwxMyBAQAogCXU4IGZhbl9yaXBwbGVbNl07CS8qIGRpdmlkZXIgZm9yIHJwcyAqLwogfTsKIAorLyogR2xvYmFsIHZhcmlhYmxlcyB0byBob2xkIGluZm9ybWF0aW9uIHJlYWQgZnJvbSBzcGVjaWFsIERNSSB0YWJsZXMsIHdoaWNoIGFyZQorICAgYXZhaWxhYmxlIG9uIEZTQyBtYWNoaW5lcyB3aXRoIGFuIGZzY2hlciBvciBsYXRlciBjaGlwLiAqLworc3RhdGljIGludCBkbWlfbXVsdFszXSA9IHsgNDkwLCAyMDAsIDEwMCB9Oworc3RhdGljIGludCBkbWlfb2Zmc2V0WzNdID0geyAwLCAwLCAwIH07CitzdGF0aWMgaW50IGRtaV92cmVmID0gLTE7CisKKwogLyoKICAqIFN5c2ZzIGF0dHIgc2hvdyAvIHN0b3JlIGZ1bmN0aW9ucwogICovCkBAIC0yMjEsOCArMjI5LDEzIEBACiAJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKIAlzdHJ1Y3QgZnNjaG1kX2RhdGEgKmRhdGEgPSBmc2NobWRfdXBkYXRlX2RldmljZShkZXYpOwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIChkYXRhLT52b2x0W2luZGV4XSAqCi0JCW1heF9yZWFkaW5nW2luZGV4XSArIDEyOCkgLyAyNTUpOworCS8qIGZzY2hlciAvIGZzY2hyYyAtIDEgYXMgZGF0YS0+a2luZCBpcyBhbiBhcnJheSBpbmRleCwgbm90IGEgY2hpcHMgKi8KKwlpZiAoZGF0YS0+a2luZCA9PSAoZnNjaGVyIC0gMSkgfHwgZGF0YS0+a2luZCA+PSAoZnNjaHJjIC0gMSkpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAoZGF0YS0+dm9sdFtpbmRleF0gKiBkbWlfdnJlZiAqCisJCQlkbWlfbXVsdFtpbmRleF0pIC8gMjU1ICsgZG1pX29mZnNldFtpbmRleF0pOworCWVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIChkYXRhLT52b2x0W2luZGV4XSAqCisJCQltYXhfcmVhZGluZ1tpbmRleF0gKyAxMjgpIC8gMjU1KTsKIH0KIAogCkBAIC01MjUsNiArNTM4LDY4IEBACiAgKiBSZWFsIGNvZGUKICAqLwogCisvKiBETUkgZGVjb2RlIHJvdXRpbmUgdG8gcmVhZCB2b2x0YWdlIHNjYWxpbmcgZmFjdG9ycyBmcm9tIHNwZWNpYWwgRE1JIHRhYmxlcywKKyAgIHdoaWNoIGFyZSBhdmFpbGFibGUgb24gRlNDIG1hY2hpbmVzIHdpdGggYW4gZnNjaGVyIG9yIGxhdGVyIGNoaXAuICovCitzdGF0aWMgdm9pZCBmc2NobWRfZG1pX2RlY29kZShjb25zdCBzdHJ1Y3QgZG1pX2hlYWRlciAqaGVhZGVyKQoreworCWludCBpLCBtdWx0WzNdID0geyAwIH0sIG9mZnNldFszXSA9IHsgMCB9LCB2cmVmID0gMCwgZm91bmQgPSAwOworCisJLyogZG1pIGNvZGUgdWdsaW5lc3MsIHdlIGdldCBwYXNzZWQgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvbnRlbnRzIG9mCisJICAgYSBjb21wbGV0ZSBETUkgcmVjb3JkLCBidXQgaW4gdGhlIGZvcm0gb2YgYSBkbWlfaGVhZGVyIHBvaW50ZXIsIGluCisJICAgcmVhbGl0eSB0aGlzIGFkZHJlc3MgaG9sZHMgaGVhZGVyLT5sZW5ndGggYnl0ZXMgb2Ygd2hpY2ggdGhlIGhlYWRlcgorCSAgIGFyZSB0aGUgZmlyc3QgNCBieXRlcyAqLworCXU4ICpkbWlfZGF0YSA9ICh1OCAqKWhlYWRlcjsKKworCS8qIFdlIGFyZSBsb29raW5nIGZvciBPRU0tc3BlY2lmaWMgdHlwZSAxODUgKi8KKwlpZiAoaGVhZGVyLT50eXBlICE9IDE4NSkKKwkJcmV0dXJuOworCisJLyogd2UgYXJlIGxvb2tpbmcgZm9yIHdoYXQgU2llbWVucyBjYWxscyAic3VidHlwZSIgMTksIHRoZSBzdWJ0eXBlCisJICAgaXMgc3RvcmVkIGluIGJ5dGUgNSBvZiB0aGUgZG1pIGJsb2NrICovCisJaWYgKGhlYWRlci0+bGVuZ3RoIDwgNSB8fCBkbWlfZGF0YVs0XSAhPSAxOSkKKwkJcmV0dXJuOworCisJLyogQWZ0ZXIgdGhlIHN1YnR5cGUgY29tZXMgMSB1bmtub3duIGJ5dGUgYW5kIHRoZW4gYmxvY2tzIG9mIDUgYnl0ZXMsCisJICAgY29uc2lzdGluZyBvZiB3aGF0IFNpZW1lbnMgY2FsbHMgYW4gIkVudGl0eSIgbnVtYmVyLCBmb2xsb3dlZCBieQorCSAgIDIgMTYtYml0IHdvcmRzIGluIExTQiBmaXJzdCBvcmRlciAqLworCWZvciAoaSA9IDY7IChpICsgNCkgPCBoZWFkZXItPmxlbmd0aDsgaSArPSA1KSB7CisJCS8qIGVudGl0eSAxIC0gMzogdm9sdGFnZSBtdWx0aXBsaWVyIGFuZCBvZmZzZXQgKi8KKwkJaWYgKGRtaV9kYXRhW2ldID49IDEgJiYgZG1pX2RhdGFbaV0gPD0gMykgeworCQkJLyogT3VyIGluIHNlbnNvcnMgb3JkZXIgYW5kIHRoZSBETUkgb3JkZXIgZGlmZmVyICovCisJCQljb25zdCBpbnQgc2h1ZmZsZVszXSA9IHsgMSwgMCwgMiB9OworCQkJaW50IGluID0gc2h1ZmZsZVtkbWlfZGF0YVtpXSAtIDFdOworCisJCQkvKiBDaGVjayBmb3IgdHdpY2UgdGhlIHNhbWUgZW50aXR5ICovCisJCQlpZiAoZm91bmQgJiAoMSA8PCBpbikpCisJCQkJcmV0dXJuOworCisJCQltdWx0W2luXSA9IGRtaV9kYXRhW2kgKyAxXSB8IChkbWlfZGF0YVtpICsgMl0gPDwgOCk7CisJCQlvZmZzZXRbaW5dID0gZG1pX2RhdGFbaSArIDNdIHwgKGRtaV9kYXRhW2kgKyA0XSA8PCA4KTsKKworCQkJZm91bmQgfD0gMSA8PCBpbjsKKwkJfQorCisJCS8qIGVudGl0eSA3OiByZWZlcmVuY2Ugdm9sdGFnZSAqLworCQlpZiAoZG1pX2RhdGFbaV0gPT0gNykgeworCQkJLyogQ2hlY2sgZm9yIHR3aWNlIHRoZSBzYW1lIGVudGl0eSAqLworCQkJaWYgKGZvdW5kICYgMHgwOCkKKwkJCQlyZXR1cm47CisKKwkJCXZyZWYgPSBkbWlfZGF0YVtpICsgMV0gfCAoZG1pX2RhdGFbaSArIDJdIDw8IDgpOworCisJCQlmb3VuZCB8PSAweDA4OworCQl9CisJfQorCisJaWYgKGZvdW5kID09IDB4MEYpIHsKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJZG1pX211bHRbaV0gPSBtdWx0W2ldICogMTA7CisJCQlkbWlfb2Zmc2V0W2ldID0gb2Zmc2V0W2ldICogMTA7CisJCX0KKwkJZG1pX3ZyZWYgPSB2cmVmOworCX0KK30KKwogc3RhdGljIGludCBmc2NobWRfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CkBAIC01ODYsNiArNjYxLDE3IEBACiAJCWRhdGEtPnRlbXBfbWF4WzJdID0gNTAgKyAxMjg7CiAJfQogCisJLyogUmVhZCB0aGUgc3BlY2lhbCBETUkgdGFibGUgZm9yIGZzY2hlciBhbmQgbmV3ZXIgY2hpcHMgKi8KKwlpZiAoa2luZCA9PSBmc2NoZXIgfHwga2luZCA+PSBmc2NocmMpIHsKKwkJZG1pX3dhbGsoZnNjaG1kX2RtaV9kZWNvZGUpOworCQlpZiAoZG1pX3ZyZWYgPT0gLTEpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgRlNDSE1EX05BTUUKKwkJCQkiOiBDb3VsZG4ndCBnZXQgdm9sdGFnZSBzY2FsaW5nIGZhY3RvcnMgZnJvbSAiCisJCQkJIkJJT1MgRE1JIHRhYmxlLCB1c2luZyBidWlsdGluIGRlZmF1bHRzXG4iKTsKKwkJCWRtaV92cmVmID0gMzM7CisJCX0KKwl9CisKIAkvKiBpMmMga2luZCBnb2VzIGZyb20gMS01LCB3ZSB3YW50IGZyb20gMC00IHRvIGFkZHJlc3MgYXJyYXlzICovCiAJZGF0YS0+a2luZCA9IGtpbmQgLSAxOwogCXN0cmxjcHkoY2xpZW50LT5uYW1lLCBjbGllbnRfbmFtZXNbZGF0YS0+a2luZF0sIEkyQ19OQU1FX1NJWkUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9mc2Nwb3MuYyBiL2RyaXZlcnMvaHdtb24vZnNjcG9zLmMKaW5kZXggOTJjOTcwMy4uMmYxMDc1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9mc2Nwb3MuYworKysgYi9kcml2ZXJzL2h3bW9uL2ZzY3Bvcy5jCkBAIC0xMDUsNyArMTA1LDYgQEAKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJmc2Nwb3MiLAogCX0sCi0JLmlkCQk9IEkyQ19EUklWRVJJRF9GU0NQT1MsCiAJLmF0dGFjaF9hZGFwdGVyCT0gZnNjcG9zX2F0dGFjaF9hZGFwdGVyLAogCS5kZXRhY2hfY2xpZW50CT0gZnNjcG9zX2RldGFjaF9jbGllbnQsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9nbDUxOHNtLmMgYi9kcml2ZXJzL2h3bW9uL2dsNTE4c20uYwppbmRleCBiYjU4ZDk4Li4zYjFhYzQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2dsNTE4c20uYworKysgYi9kcml2ZXJzL2h3bW9uL2dsNTE4c20uYwpAQCAtMzAsMTAgKzMwLDYgQEAKICAqIFdlIGRpZCBub3Qga2VlcCB0aGF0IHBhcnQgb2YgdGhlIG9yaWdpbmFsIGRyaXZlciBpbiB0aGUgTGludXggMi42CiAgKiB2ZXJzaW9uLCBzaW5jZSBpdCB3YXMgbWFraW5nIHRoZSBkcml2ZXIgc2lnbmlmaWNhbnRseSBtb3JlIGNvbXBsZXgKICAqIHdpdGggbm8gcmVhbCBiZW5lZml0LgotICoKLSAqIEhpc3Rvcnk6Ci0gKiAyMDA0LTAxLTI4ICBPcmlnaW5hbCBwb3J0LiAoSG9uZy1HdW5uIENoZXcpCi0gKiAyMDA0LTAxLTMxICBDb2RlIHJldmlldyBhbmQgYXBwcm92YWwuIChKZWFuIERlbHZhcmUpCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNDIsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgpAQCAtOTksMTAgKzk2LDEwIEBACiAJbG9uZyBycG1kaXY7CiAJaWYgKHJwbSA9PSAwKQogCQlyZXR1cm4gMDsKLQlycG1kaXYgPSBTRU5TT1JTX0xJTUlUKHJwbSwgMSwgMTkyMDAwMCkgKiBkaXY7Ci0JcmV0dXJuIFNFTlNPUlNfTElNSVQoKDk2MDAwMCArIHJwbWRpdiAvIDIpIC8gcnBtZGl2LCAxLCAyNTUpOworCXJwbWRpdiA9IFNFTlNPUlNfTElNSVQocnBtLCAxLCA5NjAwMDApICogZGl2OworCXJldHVybiBTRU5TT1JTX0xJTUlUKCg0ODAwMDAgKyBycG1kaXYgLyAyKSAvIHJwbWRpdiwgMSwgMjU1KTsKIH0KLSNkZWZpbmUgRkFOX0ZST01fUkVHKHZhbCxkaXYpCSgodmFsKT09MCA/IDAgOiAoOTYwMDAwLygodmFsKSooZGl2KSkpKQorI2RlZmluZSBGQU5fRlJPTV9SRUcodmFsLGRpdikJKCh2YWwpPT0wID8gMCA6ICg0ODAwMDAvKCh2YWwpKihkaXYpKSkpCiAKICNkZWZpbmUgSU5fVE9fUkVHKHZhbCkJCShTRU5TT1JTX0xJTUlUKCgoKHZhbCkrOSkvMTkpLDAsMjU1KSkKICNkZWZpbmUgSU5fRlJPTV9SRUcodmFsKQkoKHZhbCkqMTkpCkBAIC0xMTAsNyArMTA3LDYgQEAKICNkZWZpbmUgVkREX1RPX1JFRyh2YWwpCQkoU0VOU09SU19MSU1JVCgoKCh2YWwpKjQrNDcpLzk1KSwwLDI1NSkpCiAjZGVmaW5lIFZERF9GUk9NX1JFRyh2YWwpCSgoKHZhbCkqOTUrMikvNCkKIAotI2RlZmluZSBESVZfVE9fUkVHKHZhbCkJCSgodmFsKT09ND8yOih2YWwpPT0yPzE6KHZhbCk9PTE/MDozKQogI2RlZmluZSBESVZfRlJPTV9SRUcodmFsKQkoMSA8PCAodmFsKSkKIAogI2RlZmluZSBCRUVQX01BU0tfVE9fUkVHKHZhbCkJKCh2YWwpICYgMHg3ZiAmIGRhdGEtPmFsYXJtX21hc2spCkBAIC0xMjksNyArMTI1LDYgQEAKIAl1OCB2b2x0YWdlX2luWzRdOwkvKiBSZWdpc3RlciB2YWx1ZXM7IFswXSA9IFZERCAqLwogCXU4IHZvbHRhZ2VfbWluWzRdOwkvKiBSZWdpc3RlciB2YWx1ZXM7IFswXSA9IFZERCAqLwogCXU4IHZvbHRhZ2VfbWF4WzRdOwkvKiBSZWdpc3RlciB2YWx1ZXM7IFswXSA9IFZERCAqLwotCXU4IGl0ZXJfdm9sdGFnZV9pbls0XTsJLyogUmVnaXN0ZXIgdmFsdWVzOyBbMF0gPSBWREQgKi8KIAl1OCBmYW5faW5bMl07CiAJdTggZmFuX21pblsyXTsKIAl1OCBmYW5fZGl2WzJdOwkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIHNoaWZ0ZWQgcmlnaHQgKi8KQEAgLTEzOCw3ICsxMzMsNyBAQAogCXU4IHRlbXBfbWF4OwkJLyogUmVnaXN0ZXIgdmFsdWVzICovCiAJdTggdGVtcF9oeXN0OwkJLyogUmVnaXN0ZXIgdmFsdWVzICovCiAJdTggYWxhcm1zOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KLQl1OCBhbGFybV9tYXNrOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBhbGFybV9tYXNrOwogCXU4IGJlZXBfbWFzazsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCiAJdTggYmVlcF9lbmFibGU7CQkvKiBCb29sZWFuICovCiB9OwpAQCAtMTU2LDcgKzE1MSw2IEBACiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJPSAiZ2w1MThzbSIsCiAJfSwKLQkuaWQJCT0gSTJDX0RSSVZFUklEX0dMNTE4LAogCS5hdHRhY2hfYWRhcHRlcgk9IGdsNTE4X2F0dGFjaF9hZGFwdGVyLAogCS5kZXRhY2hfY2xpZW50CT0gZ2w1MThfZGV0YWNoX2NsaWVudCwKIH07CkBAIC0xNzIsMjQgKzE2NiwxMCBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0eXBlIyNfRlJPTV9SRUcoZGF0YS0+dmFsdWUpKTsJXAogfQogCi0jZGVmaW5lIHNob3dfZmFuKHN1ZmZpeCwgdmFsdWUsIGluZGV4KQkJCQkJXAotc3RhdGljIHNzaXplX3Qgc2hvd18jI3N1ZmZpeChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCQlcCi17CQkJCQkJCQkJXAotCXN0cnVjdCBnbDUxOF9kYXRhICpkYXRhID0gZ2w1MThfdXBkYXRlX2RldmljZShkZXYpOwkJXAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+dmFsdWVbaW5kZXhdLAlcCi0JCURJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W2luZGV4XSkpKTsJCQlcCi19Ci0KIHNob3coVEVNUCwgdGVtcF9pbnB1dDEsIHRlbXBfaW4pOwogc2hvdyhURU1QLCB0ZW1wX21heDEsIHRlbXBfbWF4KTsKIHNob3coVEVNUCwgdGVtcF9oeXN0MSwgdGVtcF9oeXN0KTsKIHNob3coQk9PTCwgZmFuX2F1dG8xLCBmYW5fYXV0bzEpOwotc2hvd19mYW4oZmFuX2lucHV0MSwgZmFuX2luLCAwKTsKLXNob3dfZmFuKGZhbl9pbnB1dDIsIGZhbl9pbiwgMSk7Ci1zaG93X2ZhbihmYW5fbWluMSwgZmFuX21pbiwgMCk7Ci1zaG93X2ZhbihmYW5fbWluMiwgZmFuX21pbiwgMSk7Ci1zaG93KERJViwgZmFuX2RpdjEsIGZhbl9kaXZbMF0pOwotc2hvdyhESVYsIGZhbl9kaXYyLCBmYW5fZGl2WzFdKTsKIHNob3coVkRELCBpbl9pbnB1dDAsIHZvbHRhZ2VfaW5bMF0pOwogc2hvdyhJTiwgaW5faW5wdXQxLCB2b2x0YWdlX2luWzFdKTsKIHNob3coSU4sIGluX2lucHV0Miwgdm9sdGFnZV9pblsyXSk7CkBAIC0yMDYsNiArMTg2LDMyIEBACiBzaG93KEJPT0wsIGJlZXBfZW5hYmxlLCBiZWVwX2VuYWJsZSk7CiBzaG93KEJFRVBfTUFTSywgYmVlcF9tYXNrLCBiZWVwX21hc2spOwogCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9pbnB1dChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJc3RydWN0IGdsNTE4X2RhdGEgKmRhdGEgPSBnbDUxOF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5faW5bbnJdLAorCQkJCQlESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXN0cnVjdCBnbDUxOF9kYXRhICpkYXRhID0gZ2w1MThfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltucl0sCisJCQkJCURJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJc3RydWN0IGdsNTE4X2RhdGEgKmRhdGEgPSBnbDUxOF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOworfQorCiAjZGVmaW5lIHNldCh0eXBlLCBzdWZmaXgsIHZhbHVlLCByZWcpCQkJCQlcCiBzdGF0aWMgc3NpemVfdCBzZXRfIyNzdWZmaXgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAlcCiAJc2l6ZV90IGNvdW50KQkJCQkJCQlcCkBAIC0yNDcsOCArMjUzLDYgQEAKIHNldChURU1QLCB0ZW1wX21heDEsIHRlbXBfbWF4LCBHTDUxOF9SRUdfVEVNUF9NQVgpOwogc2V0KFRFTVAsIHRlbXBfaHlzdDEsIHRlbXBfaHlzdCwgR0w1MThfUkVHX1RFTVBfSFlTVCk7CiBzZXRfYml0cyhCT09MLCBmYW5fYXV0bzEsIGZhbl9hdXRvMSwgR0w1MThfUkVHX01JU0MsIDB4MDgsIDMpOwotc2V0X2JpdHMoRElWLCBmYW5fZGl2MSwgZmFuX2RpdlswXSwgR0w1MThfUkVHX01JU0MsIDB4YzAsIDYpOwotc2V0X2JpdHMoRElWLCBmYW5fZGl2MiwgZmFuX2RpdlsxXSwgR0w1MThfUkVHX01JU0MsIDB4MzAsIDQpOwogc2V0X2xvdyhWREQsIGluX21pbjAsIHZvbHRhZ2VfbWluWzBdLCBHTDUxOF9SRUdfVkREX0xJTUlUKTsKIHNldF9sb3coSU4sIGluX21pbjEsIHZvbHRhZ2VfbWluWzFdLCBHTDUxOF9SRUdfVklOMV9MSU1JVCk7CiBzZXRfbG93KElOLCBpbl9taW4yLCB2b2x0YWdlX21pblsyXSwgR0w1MThfUkVHX1ZJTjJfTElNSVQpOwpAQCAtMjYwLDI1ICsyNjQsMjcgQEAKIHNldF9iaXRzKEJPT0wsIGJlZXBfZW5hYmxlLCBiZWVwX2VuYWJsZSwgR0w1MThfUkVHX0NPTkYsIDB4MDQsIDIpOwogc2V0KEJFRVBfTUFTSywgYmVlcF9tYXNrLCBiZWVwX21hc2ssIEdMNTE4X1JFR19BTEFSTSk7CiAKLXN0YXRpYyBzc2l6ZV90IHNldF9mYW5fbWluMShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwogCXN0cnVjdCBnbDUxOF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKIAlpbnQgcmVndmFsdWU7CiAJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlyZWd2YWx1ZSA9IGdsNTE4X3JlYWRfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfRkFOX0xJTUlUKTsKLQlkYXRhLT5mYW5fbWluWzBdID0gRkFOX1RPX1JFRyh2YWwsCi0JCURJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2WzBdKSk7Ci0JcmVndmFsdWUgPSAocmVndmFsdWUgJiAweDAwZmYpIHwgKGRhdGEtPmZhbl9taW5bMF0gPDwgOCk7CisJZGF0YS0+ZmFuX21pbltucl0gPSBGQU5fVE9fUkVHKHZhbCwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7CisJcmVndmFsdWUgPSAocmVndmFsdWUgJiAoMHhmZiA8PCAoOCAqIG5yKSkpCisJCSB8IChkYXRhLT5mYW5fbWluW25yXSA8PCAoOCAqICgxIC0gbnIpKSk7CiAJZ2w1MThfd3JpdGVfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfRkFOX0xJTUlULCByZWd2YWx1ZSk7CiAKIAlkYXRhLT5iZWVwX21hc2sgPSBnbDUxOF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX0FMQVJNKTsKLQlpZiAoZGF0YS0+ZmFuX21pblswXSA9PSAwKQotCQlkYXRhLT5hbGFybV9tYXNrICY9IH4weDIwOworCWlmIChkYXRhLT5mYW5fbWluW25yXSA9PSAwKQorCQlkYXRhLT5hbGFybV9tYXNrICY9IH4oMHgyMCA8PCBucik7CiAJZWxzZQotCQlkYXRhLT5hbGFybV9tYXNrIHw9IDB4MjA7CisJCWRhdGEtPmFsYXJtX21hc2sgfD0gKDB4MjAgPDwgbnIpOwogCWRhdGEtPmJlZXBfbWFzayAmPSBkYXRhLT5hbGFybV9tYXNrOwogCWdsNTE4X3dyaXRlX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX0FMQVJNLCBkYXRhLT5iZWVwX21hc2spOwogCkBAIC0yODYsMjggKzI5MiwzMiBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9taW4yKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CiAJc3RydWN0IGdsNTE4X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OwogCWludCByZWd2YWx1ZTsKIAl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwogCisJc3dpdGNoICh2YWwpIHsKKwljYXNlIDE6IHZhbCA9IDA7IGJyZWFrOworCWNhc2UgMjogdmFsID0gMTsgYnJlYWs7CisJY2FzZSA0OiB2YWwgPSAyOyBicmVhazsKKwljYXNlIDg6IHZhbCA9IDM7IGJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LCAiSW52YWxpZCBmYW4gY2xvY2sgZGl2aWRlciAlbHUsIGNob29zZSBvbmUgIgorCQkJIm9mIDEsIDIsIDQgb3IgOFxuIiwgdmFsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCXJlZ3ZhbHVlID0gZ2w1MThfcmVhZF92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19GQU5fTElNSVQpOwotCWRhdGEtPmZhbl9taW5bMV0gPSBGQU5fVE9fUkVHKHZhbCwKLQkJRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbMV0pKTsKLQlyZWd2YWx1ZSA9IChyZWd2YWx1ZSAmIDB4ZmYwMCkgfCBkYXRhLT5mYW5fbWluWzFdOwotCWdsNTE4X3dyaXRlX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX0ZBTl9MSU1JVCwgcmVndmFsdWUpOwotCi0JZGF0YS0+YmVlcF9tYXNrID0gZ2w1MThfcmVhZF92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19BTEFSTSk7Ci0JaWYgKGRhdGEtPmZhbl9taW5bMV0gPT0gMCkKLQkJZGF0YS0+YWxhcm1fbWFzayAmPSB+MHg0MDsKLQllbHNlCi0JCWRhdGEtPmFsYXJtX21hc2sgfD0gMHg0MDsKLQlkYXRhLT5iZWVwX21hc2sgJj0gZGF0YS0+YWxhcm1fbWFzazsKLQlnbDUxOF93cml0ZV92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19BTEFSTSwgZGF0YS0+YmVlcF9tYXNrKTsKLQorCXJlZ3ZhbHVlID0gZ2w1MThfcmVhZF92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19NSVNDKTsKKwlkYXRhLT5mYW5fZGl2W25yXSA9IHZhbDsKKwlyZWd2YWx1ZSA9IChyZWd2YWx1ZSAmIH4oMHhjMCA+PiAoMiAqIG5yKSkpCisJCSB8IChkYXRhLT5mYW5fZGl2W25yXSA8PCAoNiAtIDIgKiBucikpOworCWdsNTE4X3dyaXRlX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX01JU0MsIHJlZ3ZhbHVlKTsKIAltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0zMTcsMTIgKzMyNywxNiBAQAogc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21heF9oeXN0LCBTX0lXVVNSfFNfSVJVR08sCiAJc2hvd190ZW1wX2h5c3QxLCBzZXRfdGVtcF9oeXN0MSk7CiBzdGF0aWMgREVWSUNFX0FUVFIoZmFuMV9hdXRvLCBTX0lXVVNSfFNfSVJVR08sIHNob3dfZmFuX2F1dG8xLCBzZXRfZmFuX2F1dG8xKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihmYW4xX2lucHV0LCBTX0lSVUdPLCBzaG93X2Zhbl9pbnB1dDEsIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKGZhbjJfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuX2lucHV0MiwgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZmFuMV9taW4sIFNfSVdVU1J8U19JUlVHTywgc2hvd19mYW5fbWluMSwgc2V0X2Zhbl9taW4xKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihmYW4yX21pbiwgU19JV1VTUnxTX0lSVUdPLCBzaG93X2Zhbl9taW4yLCBzZXRfZmFuX21pbjIpOwotc3RhdGljIERFVklDRV9BVFRSKGZhbjFfZGl2LCBTX0lXVVNSfFNfSVJVR08sIHNob3dfZmFuX2RpdjEsIHNldF9mYW5fZGl2MSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZmFuMl9kaXYsIFNfSVdVU1J8U19JUlVHTywgc2hvd19mYW5fZGl2Miwgc2V0X2Zhbl9kaXYyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMV9pbnB1dCwgU19JUlVHTywgc2hvd19mYW5faW5wdXQsIE5VTEwsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X2Zhbl9pbnB1dCwgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjFfbWluLCBTX0lXVVNSfFNfSVJVR08sCisJc2hvd19mYW5fbWluLCBzZXRfZmFuX21pbiwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjJfbWluLCBTX0lXVVNSfFNfSVJVR08sCisJc2hvd19mYW5fbWluLCBzZXRfZmFuX21pbiwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjFfZGl2LCBTX0lXVVNSfFNfSVJVR08sCisJc2hvd19mYW5fZGl2LCBzZXRfZmFuX2RpdiwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjJfZGl2LCBTX0lXVVNSfFNfSVJVR08sCisJc2hvd19mYW5fZGl2LCBzZXRfZmFuX2RpdiwgMSk7CiBzdGF0aWMgREVWSUNFX0FUVFIoaW4wX2lucHV0LCBTX0lSVUdPLCBzaG93X2luX2lucHV0MCwgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoaW4xX2lucHV0LCBTX0lSVUdPLCBzaG93X2luX2lucHV0MSwgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoaW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X2luX2lucHV0MiwgTlVMTCk7CkBAIC0zNDEsMTAgKzM1NSw2MiBAQAogc3RhdGljIERFVklDRV9BVFRSKGJlZXBfbWFzaywgU19JV1VTUnxTX0lSVUdPLAogCXNob3dfYmVlcF9tYXNrLCBzZXRfYmVlcF9tYXNrKTsKIAorc3RhdGljIHNzaXplX3Qgc2hvd19hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICBjaGFyICpidWYpCit7CisJaW50IGJpdG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwlzdHJ1Y3QgZ2w1MThfZGF0YSAqZGF0YSA9IGdsNTE4X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgKGRhdGEtPmFsYXJtcyA+PiBiaXRucikgJiAxKTsKK30KKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjBfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjFfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjNfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDMpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgNCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjFfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDUpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4yX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA2KTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19iZWVwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgIGNoYXIgKmJ1ZikKK3sKKwlpbnQgYml0bnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXN0cnVjdCBnbDUxOF9kYXRhICpkYXRhID0gZ2w1MThfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCAoZGF0YS0+YmVlcF9tYXNrID4+IGJpdG5yKSAmIDEpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfYmVlcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgZ2w1MThfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBiaXRuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJdW5zaWduZWQgbG9uZyBiaXQ7CisKKwliaXQgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlpZiAoYml0ICYgfjEpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmJlZXBfbWFzayA9IGdsNTE4X3JlYWRfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfQUxBUk0pOworCWlmIChiaXQpCisJCWRhdGEtPmJlZXBfbWFzayB8PSAoMSA8PCBiaXRucik7CisJZWxzZQorCQlkYXRhLT5iZWVwX21hc2sgJj0gfigxIDw8IGJpdG5yKTsKKwlnbDUxOF93cml0ZV92YWx1ZShjbGllbnQsIEdMNTE4X1JFR19BTEFSTSwgZGF0YS0+YmVlcF9tYXNrKTsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4wX2JlZXAsIFNfSVJVR098U19JV1VTUiwgc2hvd19iZWVwLCBzZXRfYmVlcCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfYmVlcCwgc2V0X2JlZXAsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfYmVlcCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2JlZXAsIHNldF9iZWVwLCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4zX2JlZXAsIFNfSVJVR098U19JV1VTUiwgc2hvd19iZWVwLCBzZXRfYmVlcCwgMyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2JlZXAsIFNfSVJVR098U19JV1VTUiwgc2hvd19iZWVwLCBzZXRfYmVlcCwgNCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjFfYmVlcCwgU19JUlVHT3xTX0lXVVNSLCBzaG93X2JlZXAsIHNldF9iZWVwLCA1KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMl9iZWVwLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfYmVlcCwgc2V0X2JlZXAsIDYpOworCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZ2w1MThfYXR0cmlidXRlc1tdID0gewotCSZkZXZfYXR0cl9pbjBfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfaW4xX2lucHV0LmF0dHIsCi0JJmRldl9hdHRyX2luMl9pbnB1dC5hdHRyLAogCSZkZXZfYXR0cl9pbjNfaW5wdXQuYXR0ciwKIAkmZGV2X2F0dHJfaW4wX21pbi5hdHRyLAogCSZkZXZfYXR0cl9pbjFfbWluLmF0dHIsCkBAIC0zNTQsMTggKzQyMCwzMiBAQAogCSZkZXZfYXR0cl9pbjFfbWF4LmF0dHIsCiAJJmRldl9hdHRyX2luMl9tYXguYXR0ciwKIAkmZGV2X2F0dHJfaW4zX21heC5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4wX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4zX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjBfYmVlcC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xX2JlZXAuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9iZWVwLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjNfYmVlcC5kZXZfYXR0ci5hdHRyLAogCiAJJmRldl9hdHRyX2ZhbjFfYXV0by5hdHRyLAotCSZkZXZfYXR0cl9mYW4xX2lucHV0LmF0dHIsCi0JJmRldl9hdHRyX2ZhbjJfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfZmFuMV9taW4uYXR0ciwKLQkmZGV2X2F0dHJfZmFuMl9taW4uYXR0ciwKLQkmZGV2X2F0dHJfZmFuMV9kaXYuYXR0ciwKLQkmZGV2X2F0dHJfZmFuMl9kaXYuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4yX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV9kaXYuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfZGl2LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4yX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2JlZXAuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfYmVlcC5kZXZfYXR0ci5hdHRyLAogCiAJJmRldl9hdHRyX3RlbXAxX2lucHV0LmF0dHIsCiAJJmRldl9hdHRyX3RlbXAxX21heC5hdHRyLAogCSZkZXZfYXR0cl90ZW1wMV9tYXhfaHlzdC5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2JlZXAuZGV2X2F0dHIuYXR0ciwKIAogCSZkZXZfYXR0cl9hbGFybXMuYXR0ciwKIAkmZGV2X2F0dHJfYmVlcF9lbmFibGUuYXR0ciwKQEAgLTM3Nyw2ICs0NTcsMTcgQEAKIAkuYXR0cnMgPSBnbDUxOF9hdHRyaWJ1dGVzLAogfTsKIAorc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmdsNTE4X2F0dHJpYnV0ZXNfcjgwW10gPSB7CisJJmRldl9hdHRyX2luMF9pbnB1dC5hdHRyLAorCSZkZXZfYXR0cl9pbjFfaW5wdXQuYXR0ciwKKwkmZGV2X2F0dHJfaW4yX2lucHV0LmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgZ2w1MThfZ3JvdXBfcjgwID0geworCS5hdHRycyA9IGdsNTE4X2F0dHJpYnV0ZXNfcjgwLAorfTsKKwogLyoKICAqIFJlYWwgY29kZQogICovCkBAIC0zOTEsNyArNDgyLDcgQEAKIHN0YXRpYyBpbnQgZ2w1MThfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQogewogCWludCBpOwotCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAJc3RydWN0IGdsNTE4X2RhdGEgKmRhdGE7CiAJaW50IGVyciA9IDA7CiAKQEAgLTQwOCwyNSArNDk5LDI0IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKLQluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKLQlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkYXRhKTsKIAotCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOwotCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOwotCW5ld19jbGllbnQtPmRyaXZlciA9ICZnbDUxOF9kcml2ZXI7Ci0JbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwljbGllbnQtPmRyaXZlciA9ICZnbDUxOF9kcml2ZXI7CiAKIAkvKiBOb3csIHdlIGRvIHRoZSByZW1haW5pbmcgZGV0ZWN0aW9uLiAqLwogCiAJaWYgKGtpbmQgPCAwKSB7Ci0JCWlmICgoZ2w1MThfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBHTDUxOF9SRUdfQ0hJUF9JRCkgIT0gMHg4MCkKLQkJIHx8IChnbDUxOF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEdMNTE4X1JFR19DT05GKSAmIDB4ODApKQorCQlpZiAoKGdsNTE4X3JlYWRfdmFsdWUoY2xpZW50LCBHTDUxOF9SRUdfQ0hJUF9JRCkgIT0gMHg4MCkKKwkJIHx8IChnbDUxOF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX0NPTkYpICYgMHg4MCkpCiAJCQlnb3RvIGV4aXRfZnJlZTsKIAl9CiAKIAkvKiBEZXRlcm1pbmUgdGhlIGNoaXAgdHlwZS4gKi8KIAlpZiAoa2luZCA8PSAwKSB7Ci0JCWkgPSBnbDUxOF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEdMNTE4X1JFR19SRVZJU0lPTik7CisJCWkgPSBnbDUxOF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MThfUkVHX1JFVklTSU9OKTsKIAkJaWYgKGkgPT0gMHgwMCkgewogCQkJa2luZCA9IGdsNTE4c21fcjAwOwogCQl9IGVsc2UgaWYgKGkgPT0gMHg4MCkgewpAQCAtNDQyLDI1ICs1MzIsMjcgQEAKIAl9CiAKIAkvKiBGaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcyAqLwotCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgImdsNTE4c20iLCBJMkNfTkFNRV9TSVpFKTsKKwlzdHJsY3B5KGNsaWVudC0+bmFtZSwgImdsNTE4c20iLCBJMkNfTkFNRV9TSVpFKTsKIAlkYXRhLT50eXBlID0ga2luZDsKLQlkYXRhLT52YWxpZCA9IDA7CiAJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwogCiAJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLwotCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQorCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KSkpCiAJCWdvdG8gZXhpdF9mcmVlOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgR0w1MThTTSBjaGlwICovCiAJZGF0YS0+YWxhcm1fbWFzayA9IDB4ZmY7Ci0JZGF0YS0+dm9sdGFnZV9pblswXT1kYXRhLT52b2x0YWdlX2luWzFdPWRhdGEtPnZvbHRhZ2VfaW5bMl09MDsKLQlnbDUxOF9pbml0X2NsaWVudCgoc3RydWN0IGkyY19jbGllbnQgKikgbmV3X2NsaWVudCk7CisJZ2w1MThfaW5pdF9jbGllbnQoY2xpZW50KTsKIAogCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCi0JaWYgKChlcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJm5ld19jbGllbnQtPmRldi5rb2JqLCAmZ2w1MThfZ3JvdXApKSkKKwlpZiAoKGVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmdsNTE4X2dyb3VwKSkpCiAJCWdvdG8gZXhpdF9kZXRhY2g7CisJaWYgKGRhdGEtPnR5cGUgPT0gZ2w1MThzbV9yODApCisJCWlmICgoZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLAorCQkJCQkgICAgICAmZ2w1MThfZ3JvdXBfcjgwKSkpCisJCQlnb3RvIGV4aXRfcmVtb3ZlX2ZpbGVzOwogCi0JZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZuZXdfY2xpZW50LT5kZXYpOworCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmY2xpZW50LT5kZXYpOwogCWlmIChJU19FUlIoZGF0YS0+aHdtb25fZGV2KSkgewogCQllcnIgPSBQVFJfRVJSKGRhdGEtPmh3bW9uX2Rldik7CiAJCWdvdG8gZXhpdF9yZW1vdmVfZmlsZXM7CkBAIC00NjksOSArNTYxLDExIEBACiAJcmV0dXJuIDA7CiAKIGV4aXRfcmVtb3ZlX2ZpbGVzOgotCXN5c2ZzX3JlbW92ZV9ncm91cCgmbmV3X2NsaWVudC0+ZGV2LmtvYmosICZnbDUxOF9ncm91cCk7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmZ2w1MThfZ3JvdXApOworCWlmIChkYXRhLT50eXBlID09IGdsNTE4c21fcjgwKQorCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZnbDUxOF9ncm91cF9yODApOwogZXhpdF9kZXRhY2g6Ci0JaTJjX2RldGFjaF9jbGllbnQobmV3X2NsaWVudCk7CisJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKIGV4aXRfZnJlZToKIAlrZnJlZShkYXRhKTsKIGV4aXQ6CkBAIC01MDQsNiArNTk4LDggQEAKIAogCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7CiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmZ2w1MThfZ3JvdXApOworCWlmIChkYXRhLT50eXBlID09IGdsNTE4c21fcjgwKQorCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZnbDUxOF9ncm91cF9yODApOwogCiAJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkKIAkJcmV0dXJuIGVycjsKQEAgLTUxMiw5ICs2MDgsOSBAQAogCXJldHVybiAwOwogfQogCi0vKiBSZWdpc3RlcnMgMHgwNyB0byAweDBjIGFyZSB3b3JkLXNpemVkLCBvdGhlcnMgYXJlIGJ5dGUtc2l6ZWQgCisvKiBSZWdpc3RlcnMgMHgwNyB0byAweDBjIGFyZSB3b3JkLXNpemVkLCBvdGhlcnMgYXJlIGJ5dGUtc2l6ZWQKICAgIEdMNTE4IHVzZXMgYSBoaWdoLWJ5dGUgZmlyc3QgY29udmVudGlvbiwgd2hpY2ggaXMgZXhhY3RseSBvcHBvc2l0ZSB0bwotICAgdGhlIHVzdWFsIHByYWN0aWNlLiAqLworICAgdGhlIFNNQnVzIHN0YW5kYXJkLiAqLwogc3RhdGljIGludCBnbDUxOF9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKIHsKIAlpZiAoKHJlZyA+PSAweDA3KSAmJiAocmVnIDw9IDB4MGMpKQpAQCAtNTIzLDkgKzYxOSw2IEBACiAJCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOwogfQogCi0vKiBSZWdpc3RlcnMgMHgwNyB0byAweDBjIGFyZSB3b3JkLXNpemVkLCBvdGhlcnMgYXJlIGJ5dGUtc2l6ZWQgCi0gICBHTDUxOCB1c2VzIGEgaGlnaC1ieXRlIGZpcnN0IGNvbnZlbnRpb24sIHdoaWNoIGlzIGV4YWN0bHkgb3Bwb3NpdGUgdG8KLSAgIHRoZSB1c3VhbCBwcmFjdGljZS4gKi8KIHN0YXRpYyBpbnQgZ2w1MThfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1MTYgdmFsdWUpCiB7CiAJaWYgKChyZWcgPj0gMHgwNykgJiYgKHJlZyA8PSAweDBjKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZ2w1MjBzbS5jIGIvZHJpdmVycy9od21vbi9nbDUyMHNtLmMKaW5kZXggMmQzOWQ4Zi4uMDNlY2RjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9nbDUyMHNtLmMKKysrIGIvZHJpdmVycy9od21vbi9nbDUyMHNtLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXZpZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CkBAIC00Myw5ICs0NCw5IEBACiAvKiBJbnNtb2QgcGFyYW1ldGVycyAqLwogSTJDX0NMSUVOVF9JTlNNT0RfMShnbDUyMHNtKTsKIAotLyogTWFueSBHTDUyMCBjb25zdGFudHMgc3BlY2lmaWVkIGJlbG93IAorLyogTWFueSBHTDUyMCBjb25zdGFudHMgc3BlY2lmaWVkIGJlbG93CiBPbmUgb2YgdGhlIGlucHV0cyBjYW4gYmUgY29uZmlndXJlZCBhcyBlaXRoZXIgdGVtcCBvciB2b2x0YWdlLgotVGhhdCdzIHdoeSBfVEVNUDIgYW5kIF9JTjQgYWNjZXNzIHRoZSBzYW1lIHJlZ2lzdGVyIAorVGhhdCdzIHdoeSBfVEVNUDIgYW5kIF9JTjQgYWNjZXNzIHRoZSBzYW1lIHJlZ2lzdGVyCiAqLwogCiAvKiBUaGUgR0w1MjAgcmVnaXN0ZXJzICovCkBAIC01NiwzNyArNTcsMTQgQEAKIAogI2RlZmluZSBHTDUyMF9SRUdfVklEX0lOUFVUCQkweDAyCiAKLSNkZWZpbmUgR0w1MjBfUkVHX0lOMF9JTlBVVAkJMHgxNQotI2RlZmluZSBHTDUyMF9SRUdfSU4wX0xJTUlUCQkweDBjCi0jZGVmaW5lIEdMNTIwX1JFR19JTjBfTUlOCQlHTDUyMF9SRUdfSU4wX0xJTUlUCi0jZGVmaW5lIEdMNTIwX1JFR19JTjBfTUFYCQlHTDUyMF9SRUdfSU4wX0xJTUlUCitzdGF0aWMgY29uc3QgdTggR0w1MjBfUkVHX0lOX0lOUFVUW10JPSB7IDB4MTUsIDB4MTQsIDB4MTMsIDB4MGQsIDB4MGUgfTsKK3N0YXRpYyBjb25zdCB1OCBHTDUyMF9SRUdfSU5fTElNSVRbXQk9IHsgMHgwYywgMHgwOSwgMHgwYSwgMHgwYiB9Oworc3RhdGljIGNvbnN0IHU4IEdMNTIwX1JFR19JTl9NSU5bXQk9IHsgMHgwYywgMHgwOSwgMHgwYSwgMHgwYiwgMHgxOCB9Oworc3RhdGljIGNvbnN0IHU4IEdMNTIwX1JFR19JTl9NQVhbXQk9IHsgMHgwYywgMHgwOSwgMHgwYSwgMHgwYiwgMHgxNyB9OwogCi0jZGVmaW5lIEdMNTIwX1JFR19JTjFfSU5QVVQJCTB4MTQKLSNkZWZpbmUgR0w1MjBfUkVHX0lOMV9MSU1JVAkJMHgwOQotI2RlZmluZSBHTDUyMF9SRUdfSU4xX01JTgkJR0w1MjBfUkVHX0lOMV9MSU1JVAotI2RlZmluZSBHTDUyMF9SRUdfSU4xX01BWAkJR0w1MjBfUkVHX0lOMV9MSU1JVAotCi0jZGVmaW5lIEdMNTIwX1JFR19JTjJfSU5QVVQJCTB4MTMKLSNkZWZpbmUgR0w1MjBfUkVHX0lOMl9MSU1JVAkJMHgwYQotI2RlZmluZSBHTDUyMF9SRUdfSU4yX01JTgkJR0w1MjBfUkVHX0lOMl9MSU1JVAotI2RlZmluZSBHTDUyMF9SRUdfSU4yX01BWAkJR0w1MjBfUkVHX0lOMl9MSU1JVAotCi0jZGVmaW5lIEdMNTIwX1JFR19JTjNfSU5QVVQJCTB4MGQKLSNkZWZpbmUgR0w1MjBfUkVHX0lOM19MSU1JVAkJMHgwYgotI2RlZmluZSBHTDUyMF9SRUdfSU4zX01JTgkJR0w1MjBfUkVHX0lOM19MSU1JVAotI2RlZmluZSBHTDUyMF9SRUdfSU4zX01BWAkJR0w1MjBfUkVHX0lOM19MSU1JVAotCi0jZGVmaW5lIEdMNTIwX1JFR19JTjRfSU5QVVQJCTB4MGUKLSNkZWZpbmUgR0w1MjBfUkVHX0lONF9NQVgJCTB4MTcKLSNkZWZpbmUgR0w1MjBfUkVHX0lONF9NSU4JCTB4MTgKLQotI2RlZmluZSBHTDUyMF9SRUdfVEVNUDFfSU5QVVQJCTB4MDQKLSNkZWZpbmUgR0w1MjBfUkVHX1RFTVAxX01BWAkJMHgwNQotI2RlZmluZSBHTDUyMF9SRUdfVEVNUDFfTUFYX0hZU1QJMHgwNgotCi0jZGVmaW5lIEdMNTIwX1JFR19URU1QMl9JTlBVVAkJMHgwZQotI2RlZmluZSBHTDUyMF9SRUdfVEVNUDJfTUFYCQkweDE3Ci0jZGVmaW5lIEdMNTIwX1JFR19URU1QMl9NQVhfSFlTVAkweDE4CitzdGF0aWMgY29uc3QgdTggR0w1MjBfUkVHX1RFTVBfSU5QVVRbXQkJPSB7IDB4MDQsIDB4MGUgfTsKK3N0YXRpYyBjb25zdCB1OCBHTDUyMF9SRUdfVEVNUF9NQVhbXQkJPSB7IDB4MDUsIDB4MTcgfTsKK3N0YXRpYyBjb25zdCB1OCBHTDUyMF9SRUdfVEVNUF9NQVhfSFlTVFtdCT0geyAweDA2LCAweDE4IH07CiAKICNkZWZpbmUgR0w1MjBfUkVHX0ZBTl9JTlBVVAkJMHgwNwogI2RlZmluZSBHTDUyMF9SRUdfRkFOX01JTgkJMHgwOApAQCAtMTE0LDcgKzkyLDYgQEAKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJnbDUyMHNtIiwKIAl9LAotCS5pZAkJPSBJMkNfRFJJVkVSSURfR0w1MjAsCiAJLmF0dGFjaF9hZGFwdGVyCT0gZ2w1MjBfYXR0YWNoX2FkYXB0ZXIsCiAJLmRldGFjaF9jbGllbnQJPSBnbDUyMF9kZXRhY2hfY2xpZW50LAogfTsKQEAgLTE1MCw5MyArMTI3LDEzIEBACiAgKiBTeXNmcyBzdHVmZgogICovCiAKLSNkZWZpbmUgc3lzZnNfcih0eXBlLCBuLCBpdGVtLCByZWcpIFwKLXN0YXRpYyBzc2l6ZV90IGdldF8jI3R5cGUjI2l0ZW0gKHN0cnVjdCBnbDUyMF9kYXRhICosIGNoYXIgKiwgaW50KTsgXAotc3RhdGljIHNzaXplX3QgZ2V0XyMjdHlwZSMjbiMjaXRlbSAoc3RydWN0IGRldmljZSAqLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqKTsgXAotc3RhdGljIHNzaXplX3QgZ2V0XyMjdHlwZSMjbiMjaXRlbSAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCi17IFwKLQlzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSA9IGdsNTIwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAotCXJldHVybiBnZXRfIyN0eXBlIyNpdGVtKGRhdGEsIGJ1ZiwgKG4pKTsgXAotfQotCi0jZGVmaW5lIHN5c2ZzX3codHlwZSwgbiwgaXRlbSwgcmVnKSBcCi1zdGF0aWMgc3NpemVfdCBzZXRfIyN0eXBlIyNpdGVtIChzdHJ1Y3QgaTJjX2NsaWVudCAqLCBzdHJ1Y3QgZ2w1MjBfZGF0YSAqLCBjb25zdCBjaGFyICosIHNpemVfdCwgaW50LCBpbnQpOyBcCi1zdGF0aWMgc3NpemVfdCBzZXRfIyN0eXBlIyNuIyNpdGVtIChzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICosIHNpemVfdCk7IFwKLXN0YXRpYyBzc2l6ZV90IHNldF8jI3R5cGUjI24jI2l0ZW0gKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCi17IFwKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCi0Jc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAotCXJldHVybiBzZXRfIyN0eXBlIyNpdGVtKGNsaWVudCwgZGF0YSwgYnVmLCBjb3VudCwgKG4pLCByZWcpOyBcCi19Ci0KLSNkZWZpbmUgc3lzZnNfcndfbih0eXBlLCBuLCBpdGVtLCByZWcpIFwKLXN5c2ZzX3IodHlwZSwgbiwgaXRlbSwgcmVnKSBcCi1zeXNmc193KHR5cGUsIG4sIGl0ZW0sIHJlZykgXAotc3RhdGljIERFVklDRV9BVFRSKHR5cGUjI24jI2l0ZW0sIFNfSVJVR08gfCBTX0lXVVNSLCBnZXRfIyN0eXBlIyNuIyNpdGVtLCBzZXRfIyN0eXBlIyNuIyNpdGVtKTsKLQotI2RlZmluZSBzeXNmc19yb19uKHR5cGUsIG4sIGl0ZW0sIHJlZykgXAotc3lzZnNfcih0eXBlLCBuLCBpdGVtLCByZWcpIFwKLXN0YXRpYyBERVZJQ0VfQVRUUih0eXBlIyNuIyNpdGVtLCBTX0lSVUdPLCBnZXRfIyN0eXBlIyNuIyNpdGVtLCBOVUxMKTsKLQotI2RlZmluZSBzeXNmc19ydyh0eXBlLCBpdGVtLCByZWcpIFwKLXN5c2ZzX3IodHlwZSwgMCwgaXRlbSwgcmVnKSBcCi1zeXNmc193KHR5cGUsIDAsIGl0ZW0sIHJlZykgXAotc3RhdGljIERFVklDRV9BVFRSKHR5cGUjI2l0ZW0sIFNfSVJVR08gfCBTX0lXVVNSLCBnZXRfIyN0eXBlIyMwIyNpdGVtLCBzZXRfIyN0eXBlIyMwIyNpdGVtKTsKLQotI2RlZmluZSBzeXNmc19ybyh0eXBlLCBpdGVtLCByZWcpIFwKLXN5c2ZzX3IodHlwZSwgMCwgaXRlbSwgcmVnKSBcCi1zdGF0aWMgREVWSUNFX0FUVFIodHlwZSMjaXRlbSwgU19JUlVHTywgZ2V0XyMjdHlwZSMjMCMjaXRlbSwgTlVMTCk7Ci0KLQotI2RlZmluZSBzeXNmc192aWQobikgXAotc3lzZnNfcm9fbihjcHUsIG4sIF92aWQsIEdMNTIwX1JFR19WSURfSU5QVVQpCi0KLSNkZWZpbmUgc3lzZnNfaW4obikgXAotc3lzZnNfcm9fbihpbiwgbiwgX2lucHV0LCBHTDUyMF9SRUdfSU4jI24jI0lOUFVUKSBcCi1zeXNmc19yd19uKGluLCBuLCBfbWluLCBHTDUyMF9SRUdfSU4jI24jI19NSU4pIFwKLXN5c2ZzX3J3X24oaW4sIG4sIF9tYXgsIEdMNTIwX1JFR19JTiMjbiMjX01BWCkgXAotCi0jZGVmaW5lIHN5c2ZzX2ZhbihuKSBcCi1zeXNmc19yb19uKGZhbiwgbiwgX2lucHV0LCBHTDUyMF9SRUdfRkFOX0lOUFVUKSBcCi1zeXNmc19yd19uKGZhbiwgbiwgX21pbiwgR0w1MjBfUkVHX0ZBTl9NSU4pIFwKLXN5c2ZzX3J3X24oZmFuLCBuLCBfZGl2LCBHTDUyMF9SRUdfRkFOX0RJVikKLQotI2RlZmluZSBzeXNmc19mYW5fb2ZmKG4pIFwKLXN5c2ZzX3J3X24oZmFuLCBuLCBfb2ZmLCBHTDUyMF9SRUdfRkFOX09GRikgXAotCi0jZGVmaW5lIHN5c2ZzX3RlbXAobikgXAotc3lzZnNfcm9fbih0ZW1wLCBuLCBfaW5wdXQsIEdMNTIwX1JFR19URU1QIyNuIyNfSU5QVVQpIFwKLXN5c2ZzX3J3X24odGVtcCwgbiwgX21heCwgR0w1MjBfUkVHX1RFTVAjI24jI19NQVgpIFwKLXN5c2ZzX3J3X24odGVtcCwgbiwgX21heF9oeXN0LCBHTDUyMF9SRUdfVEVNUCMjbiMjX01BWF9IWVNUKQotCi0jZGVmaW5lIHN5c2ZzX2FsYXJtcygpIFwKLXN5c2ZzX3JvKGFsYXJtcywgLCBHTDUyMF9SRUdfQUxBUk1TKSBcCi1zeXNmc19ydyhiZWVwX2VuYWJsZSwgLCBHTDUyMF9SRUdfQkVFUF9FTkFCTEUpIFwKLXN5c2ZzX3J3KGJlZXBfbWFzaywgLCBHTDUyMF9SRUdfQkVFUF9NQVNLKQotCi0KLXN5c2ZzX3ZpZCgwKQotCi1zeXNmc19pbigwKQotc3lzZnNfaW4oMSkKLXN5c2ZzX2luKDIpCi1zeXNmc19pbigzKQotc3lzZnNfaW4oNCkKLQotc3lzZnNfZmFuKDEpCi1zeXNmc19mYW4oMikKLXN5c2ZzX2Zhbl9vZmYoMSkKLQotc3lzZnNfdGVtcCgxKQotc3lzZnNfdGVtcCgyKQotCi1zeXNmc19hbGFybXMoKQotCi0KLXN0YXRpYyBzc2l6ZV90IGdldF9jcHVfdmlkKHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQorc3RhdGljIHNzaXplX3QgZ2V0X2NwdV92aWQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKIHsKKwlzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSA9IGdsNTIwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdmlkX2Zyb21fcmVnKGRhdGEtPnZpZCwgZGF0YS0+dnJtKSk7CiB9CitzdGF0aWMgREVWSUNFX0FUVFIoY3B1MF92aWQsIFNfSVJVR08sIGdldF9jcHVfdmlkLCBOVUxMKTsKIAogI2RlZmluZSBWRERfRlJPTV9SRUcodmFsKSAoKCh2YWwpKjk1KzIpLzQpCiAjZGVmaW5lIFZERF9UT19SRUcodmFsKSAoU0VOU09SU19MSU1JVCgoKCh2YWwpKjQrNDcpLzk1KSwwLDI1NSkpCkBAIC0yNDQsOCArMTQxLDExIEBACiAjZGVmaW5lIElOX0ZST01fUkVHKHZhbCkgKCh2YWwpKjE5KQogI2RlZmluZSBJTl9UT19SRUcodmFsKSAoU0VOU09SU19MSU1JVCgoKCh2YWwpKzkpLzE5KSwwLDI1NSkpCiAKLXN0YXRpYyBzc2l6ZV90IGdldF9pbl9pbnB1dChzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKK3N0YXRpYyBzc2l6ZV90IGdldF9pbl9pbnB1dChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNoYXIgKmJ1ZikKIHsKKwlpbnQgbiA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEgPSBnbDUyMF91cGRhdGVfZGV2aWNlKGRldik7CiAJdTggciA9IGRhdGEtPmluX2lucHV0W25dOwogCiAJaWYgKG4gPT0gMCkKQEAgLTI1NCw4ICsxNTQsMTEgQEAKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIElOX0ZST01fUkVHKHIpKTsKIH0KIAotc3RhdGljIHNzaXplX3QgZ2V0X2luX21pbihzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKK3N0YXRpYyBzc2l6ZV90IGdldF9pbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgY2hhciAqYnVmKQogeworCWludCBuID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwlzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSA9IGdsNTIwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKIAl1OCByID0gZGF0YS0+aW5fbWluW25dOwogCiAJaWYgKG4gPT0gMCkKQEAgLTI2NCw4ICsxNjcsMTEgQEAKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIElOX0ZST01fUkVHKHIpKTsKIH0KIAotc3RhdGljIHNzaXplX3QgZ2V0X2luX21heChzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKK3N0YXRpYyBzc2l6ZV90IGdldF9pbl9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgY2hhciAqYnVmKQogeworCWludCBuID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwlzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSA9IGdsNTIwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKIAl1OCByID0gZGF0YS0+aW5fbWF4W25dOwogCiAJaWYgKG4gPT0gMCkKQEAgLTI3NCw4ICsxODAsMTIgQEAKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIElOX0ZST01fUkVHKHIpKTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2V0X2luX21pbihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuLCBpbnQgcmVnKQorc3RhdGljIHNzaXplX3Qgc2V0X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBnbDUyMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IG4gPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OwogCWxvbmcgdiA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CiAJdTggcjsKIApAQCAtMjg5LDE2ICsxOTksMjIgQEAKIAlkYXRhLT5pbl9taW5bbl0gPSByOwogCiAJaWYgKG4gPCA0KQotCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgKGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCByZWcpICYgfjB4ZmYpIHwgcik7CisJCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lOX01JTltuXSwKKwkJCQkgIChnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lOX01JTltuXSkKKwkJCQkgICAmIH4weGZmKSB8IHIpOwogCWVsc2UKLQkJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIHIpOworCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19JTl9NSU5bbl0sIHIpOwogCiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBzZXRfaW5fbWF4KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG4sIGludCByZWcpCitzdGF0aWMgc3NpemVfdCBzZXRfaW5fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgbiA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CiAJbG9uZyB2ID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKIAl1OCByOwogCkBAIC0zMTIsNTcgKzIyOCwxMDkgQEAKIAlkYXRhLT5pbl9tYXhbbl0gPSByOwogCiAJaWYgKG4gPCA0KQotCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgKGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCByZWcpICYgfjB4ZmYwMCkgfCAociA8PCA4KSk7CisJCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lOX01BWFtuXSwKKwkJCQkgIChnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lOX01BWFtuXSkKKwkJCQkgICAmIH4weGZmMDApIHwgKHIgPDwgOCkpOwogCWVsc2UKLQkJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIHIpOworCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19JTl9NQVhbbl0sIHIpOwogCiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJcmV0dXJuIGNvdW50OwogfQogCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMF9pbnB1dCwgU19JUlVHTywgZ2V0X2luX2lucHV0LCBOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xX2lucHV0LCBTX0lSVUdPLCBnZXRfaW5faW5wdXQsIE5VTEwsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfaW5wdXQsIFNfSVJVR08sIGdldF9pbl9pbnB1dCwgTlVMTCwgMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluM19pbnB1dCwgU19JUlVHTywgZ2V0X2luX2lucHV0LCBOVUxMLCAzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW40X2lucHV0LCBTX0lSVUdPLCBnZXRfaW5faW5wdXQsIE5VTEwsIDQpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjBfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJZ2V0X2luX21pbiwgc2V0X2luX21pbiwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9taW4sIFNfSVJVR08gfCBTX0lXVVNSLAorCQlnZXRfaW5fbWluLCBzZXRfaW5fbWluLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4yX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWdldF9pbl9taW4sIHNldF9pbl9taW4sIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJZ2V0X2luX21pbiwgc2V0X2luX21pbiwgMyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluNF9taW4sIFNfSVJVR08gfCBTX0lXVVNSLAorCQlnZXRfaW5fbWluLCBzZXRfaW5fbWluLCA0KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4wX21heCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWdldF9pbl9tYXgsIHNldF9pbl9tYXgsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjFfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJZ2V0X2luX21heCwgc2V0X2luX21heCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMl9tYXgsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlnZXRfaW5fbWF4LCBzZXRfaW5fbWF4LCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4zX21heCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWdldF9pbl9tYXgsIHNldF9pbl9tYXgsIDMpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjRfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJZ2V0X2luX21heCwgc2V0X2luX21heCwgNCk7CisKICNkZWZpbmUgRElWX0ZST01fUkVHKHZhbCkgKDEgPDwgKHZhbCkpCiAjZGVmaW5lIEZBTl9GUk9NX1JFRyh2YWwsZGl2KSAoKHZhbCk9PTAgPyAwIDogKDQ4MDAwMC8oKHZhbCkgPDwgKGRpdikpKSkKICNkZWZpbmUgRkFOX1RPX1JFRyh2YWwsZGl2KSAoKHZhbCk8PTA/MDpTRU5TT1JTX0xJTUlUKCg0ODAwMDAgKyAoKHZhbCkgPDwgKChkaXYpLTEpKSkgLyAoKHZhbCkgPDwgKGRpdikpLCAxLCAyNTUpKTsKIAotc3RhdGljIHNzaXplX3QgZ2V0X2Zhbl9pbnB1dChzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKK3N0YXRpYyBzc2l6ZV90IGdldF9mYW5faW5wdXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY2hhciAqYnVmKQogewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX2lucHV0W24gLSAxXSwgZGF0YS0+ZmFuX2RpdltuIC0gMV0pKTsKKwlpbnQgbiA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEgPSBnbDUyMF91cGRhdGVfZGV2aWNlKGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRkFOX0ZST01fUkVHKGRhdGEtPmZhbl9pbnB1dFtuXSwKKwkJCQkJCSBkYXRhLT5mYW5fZGl2W25dKSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGdldF9mYW5fbWluKHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQorc3RhdGljIHNzaXplX3QgZ2V0X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKIHsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRkFOX0ZST01fUkVHKGRhdGEtPmZhbl9taW5bbiAtIDFdLCBkYXRhLT5mYW5fZGl2W24gLSAxXSkpOworCWludCBuID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwlzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSA9IGdsNTIwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltuXSwKKwkJCQkJCSBkYXRhLT5mYW5fZGl2W25dKSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGdldF9mYW5fZGl2KHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQorc3RhdGljIHNzaXplX3QgZ2V0X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKIHsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbiAtIDFdKSk7CisJaW50IG4gPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXN0cnVjdCBnbDUyMF9kYXRhICpkYXRhID0gZ2w1MjBfdXBkYXRlX2RldmljZShkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25dKSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGdldF9mYW5fb2ZmKHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQorc3RhdGljIHNzaXplX3QgZ2V0X2Zhbl9vZmYoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKIHsKKwlzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSA9IGdsNTIwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+ZmFuX29mZik7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNldF9mYW5fbWluKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG4sIGludCByZWcpCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBuID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKIAl1bnNpZ25lZCBsb25nIHYgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKIAl1OCByOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCXIgPSBGQU5fVE9fUkVHKHYsIGRhdGEtPmZhbl9kaXZbbiAtIDFdKTsKLQlkYXRhLT5mYW5fbWluW24gLSAxXSA9IHI7CisJciA9IEZBTl9UT19SRUcodiwgZGF0YS0+ZmFuX2RpdltuXSk7CisJZGF0YS0+ZmFuX21pbltuXSA9IHI7CiAKLQlpZiAobiA9PSAxKQotCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgKGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCByZWcpICYgfjB4ZmYwMCkgfCAociA8PCA4KSk7CisJaWYgKG4gPT0gMCkKKwkJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfRkFOX01JTiwKKwkJCQkgIChnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0ZBTl9NSU4pCisJCQkJICAgJiB+MHhmZjAwKSB8IChyIDw8IDgpKTsKIAllbHNlCi0JCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCAoZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIHJlZykgJiB+MHhmZikgfCByKTsKKwkJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfRkFOX01JTiwKKwkJCQkgIChnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0ZBTl9NSU4pCisJCQkJICAgJiB+MHhmZikgfCByKTsKIAogCWRhdGEtPmJlZXBfbWFzayA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQkVFUF9NQVNLKTsKLQlpZiAoZGF0YS0+ZmFuX21pbltuIC0gMV0gPT0gMCkKLQkJZGF0YS0+YWxhcm1fbWFzayAmPSAobiA9PSAxKSA/IH4weDIwIDogfjB4NDA7CisJaWYgKGRhdGEtPmZhbl9taW5bbl0gPT0gMCkKKwkJZGF0YS0+YWxhcm1fbWFzayAmPSAobiA9PSAwKSA/IH4weDIwIDogfjB4NDA7CiAJZWxzZQotCQlkYXRhLT5hbGFybV9tYXNrIHw9IChuID09IDEpID8gMHgyMCA6IDB4NDA7CisJCWRhdGEtPmFsYXJtX21hc2sgfD0gKG4gPT0gMCkgPyAweDIwIDogMHg0MDsKIAlkYXRhLT5iZWVwX21hc2sgJj0gZGF0YS0+YWxhcm1fbWFzazsKIAlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19CRUVQX01BU0ssIGRhdGEtPmJlZXBfbWFzayk7CiAKQEAgLTM3MCw4ICszMzgsMTIgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNldF9mYW5fZGl2KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG4sIGludCByZWcpCitzdGF0aWMgc3NpemVfdCBzZXRfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBuID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKIAl1bnNpZ25lZCBsb25nIHYgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKIAl1OCByOwogCkBAIC0zODYsMTMzICszNTgsMjgyIEBACiAJfQogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCWRhdGEtPmZhbl9kaXZbbiAtIDFdID0gcjsKKwlkYXRhLT5mYW5fZGl2W25dID0gcjsKIAotCWlmIChuID09IDEpCi0JCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCAoZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIHJlZykgJiB+MHhjMCkgfCAociA8PCA2KSk7CisJaWYgKG4gPT0gMCkKKwkJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfRkFOX0RJViwKKwkJCQkgIChnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0ZBTl9ESVYpCisJCQkJICAgJiB+MHhjMCkgfCAociA8PCA2KSk7CiAJZWxzZQotCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgKGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCByZWcpICYgfjB4MzApIHwgKHIgPDwgNCkpOworCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19GQU5fRElWLAorCQkJCSAgKGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfRkFOX0RJVikKKwkJCQkgICAmIH4weDMwKSB8IChyIDw8IDQpKTsKIAogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9vZmYoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbiwgaW50IHJlZykKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fb2ZmKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBnbDUyMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJdTggciA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApPzE6MDsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlkYXRhLT5mYW5fb2ZmID0gcjsKLQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgKGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCByZWcpICYgfjB4MGMpIHwgKHIgPDwgMikpOworCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0ZBTl9PRkYsCisJCQkgIChnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0ZBTl9PRkYpCisJCQkgICAmIH4weDBjKSB8IChyIDw8IDIpKTsKIAltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMV9pbnB1dCwgU19JUlVHTywgZ2V0X2Zhbl9pbnB1dCwgTlVMTCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjJfaW5wdXQsIFNfSVJVR08sIGdldF9mYW5faW5wdXQsIE5VTEwsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWdldF9mYW5fbWluLCBzZXRfZmFuX21pbiwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjJfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJZ2V0X2Zhbl9taW4sIHNldF9mYW5fbWluLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMV9kaXYsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlnZXRfZmFuX2Rpdiwgc2V0X2Zhbl9kaXYsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4yX2RpdiwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWdldF9mYW5fZGl2LCBzZXRfZmFuX2RpdiwgMSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZmFuMV9vZmYsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlnZXRfZmFuX29mZiwgc2V0X2Zhbl9vZmYpOworCiAjZGVmaW5lIFRFTVBfRlJPTV9SRUcodmFsKSAoKCh2YWwpIC0gMTMwKSAqIDEwMDApCiAjZGVmaW5lIFRFTVBfVE9fUkVHKHZhbCkgKFNFTlNPUlNfTElNSVQoKCgoKHZhbCk8MD8odmFsKS01MDA6KHZhbCkrNTAwKSAvIDEwMDApKzEzMCksMCwyNTUpKQogCi1zdGF0aWMgc3NpemVfdCBnZXRfdGVtcF9pbnB1dChzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKK3N0YXRpYyBzc2l6ZV90IGdldF90ZW1wX2lucHV0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWYpCiB7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9pbnB1dFtuIC0gMV0pKTsKKwlpbnQgbiA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEgPSBnbDUyMF91cGRhdGVfZGV2aWNlKGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX2lucHV0W25dKSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGdldF90ZW1wX21heChzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKK3N0YXRpYyBzc2l6ZV90IGdldF90ZW1wX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNoYXIgKmJ1ZikKIHsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX21heFtuIC0gMV0pKTsKKwlpbnQgbiA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEgPSBnbDUyMF91cGRhdGVfZGV2aWNlKGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX21heFtuXSkpOwogfQogCi1zdGF0aWMgc3NpemVfdCBnZXRfdGVtcF9tYXhfaHlzdChzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKK3N0YXRpYyBzc2l6ZV90IGdldF90ZW1wX21heF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKKwkJCQkgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX21heF9oeXN0W24gLSAxXSkpOworCWludCBuID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwlzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSA9IGdsNTIwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfbWF4X2h5c3Rbbl0pKTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfbWF4KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG4sIGludCByZWcpCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBnbDUyMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IG4gPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OwogCWxvbmcgdiA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CiAKIAltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JZGF0YS0+dGVtcF9tYXhbbiAtIDFdID0gVEVNUF9UT19SRUcodik7Ci0JZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIGRhdGEtPnRlbXBfbWF4W24gLSAxXSk7CisJZGF0YS0+dGVtcF9tYXhbbl0gPSBURU1QX1RPX1JFRyh2KTsKKwlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19URU1QX01BWFtuXSwgZGF0YS0+dGVtcF9tYXhbbl0pOwogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfbWF4X2h5c3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbiwgaW50IHJlZykKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX21heF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKKwkJCQkgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgbiA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CiAJbG9uZyB2ID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlkYXRhLT50ZW1wX21heF9oeXN0W24gLSAxXSA9IFRFTVBfVE9fUkVHKHYpOwotCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCBkYXRhLT50ZW1wX21heF9oeXN0W24gLSAxXSk7CisJZGF0YS0+dGVtcF9tYXhfaHlzdFtuXSA9IFRFTVBfVE9fUkVHKHYpOworCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX1RFTVBfTUFYX0hZU1Rbbl0sCisJCQkgIGRhdGEtPnRlbXBfbWF4X2h5c3Rbbl0pOwogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3QgZ2V0X2FsYXJtcyhzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIGdldF90ZW1wX2lucHV0LCBOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfaW5wdXQsIFNfSVJVR08sIGdldF90ZW1wX2lucHV0LCBOVUxMLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJZ2V0X3RlbXBfbWF4LCBzZXRfdGVtcF9tYXgsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9tYXgsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlnZXRfdGVtcF9tYXgsIHNldF90ZW1wX21heCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heF9oeXN0LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJZ2V0X3RlbXBfbWF4X2h5c3QsIHNldF90ZW1wX21heF9oeXN0LCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfbWF4X2h5c3QsIFNfSVJVR08gfCBTX0lXVVNSLAorCQlnZXRfdGVtcF9tYXhfaHlzdCwgc2V0X3RlbXBfbWF4X2h5c3QsIDEpOworCitzdGF0aWMgc3NpemVfdCBnZXRfYWxhcm1zKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgIGNoYXIgKmJ1ZikKIHsKKwlzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSA9IGdsNTIwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+YWxhcm1zKTsKIH0KIAotc3RhdGljIHNzaXplX3QgZ2V0X2JlZXBfZW5hYmxlKHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQorc3RhdGljIHNzaXplX3QgZ2V0X2JlZXBfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKKwkJCSAgICAgICAqYXR0ciwgY2hhciAqYnVmKQogeworCXN0cnVjdCBnbDUyMF9kYXRhICpkYXRhID0gZ2w1MjBfdXBkYXRlX2RldmljZShkZXYpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5iZWVwX2VuYWJsZSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGdldF9iZWVwX21hc2soc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG4pCitzdGF0aWMgc3NpemVfdCBnZXRfYmVlcF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNoYXIgKmJ1ZikKIHsKKwlzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSA9IGdsNTIwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+YmVlcF9tYXNrKTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2V0X2JlZXBfZW5hYmxlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG4sIGludCByZWcpCitzdGF0aWMgc3NpemVfdCBzZXRfYmVlcF9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQorCQkJICAgICAgICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBnbDUyMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJdTggciA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApPzA6MTsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlkYXRhLT5iZWVwX2VuYWJsZSA9ICFyOwotCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCAoZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIHJlZykgJiB+MHgwNCkgfCAociA8PCAyKSk7CisJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQkVFUF9FTkFCTEUsCisJCQkgIChnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0JFRVBfRU5BQkxFKQorCQkJICAgJiB+MHgwNCkgfCAociA8PCAyKSk7CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBzZXRfYmVlcF9tYXNrKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG4sIGludCByZWcpCitzdGF0aWMgc3NpemVfdCBzZXRfYmVlcF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAl1OCByID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7Ci0JCisKIAltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJciAmPSBkYXRhLT5hbGFybV9tYXNrOwogCWRhdGEtPmJlZXBfbWFzayA9IHI7Ci0JZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIHIpOworCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0JFRVBfTUFTSywgcik7CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJcmV0dXJuIGNvdW50OwogfQogCitzdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1zLCBTX0lSVUdPLCBnZXRfYWxhcm1zLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihiZWVwX2VuYWJsZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCWdldF9iZWVwX2VuYWJsZSwgc2V0X2JlZXBfZW5hYmxlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihiZWVwX21hc2ssIFNfSVJVR08gfCBTX0lXVVNSLAorCQlnZXRfYmVlcF9tYXNrLCBzZXRfYmVlcF9tYXNrKTsKKworc3RhdGljIHNzaXplX3QgZ2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY2hhciAqYnVmKQoreworCWludCBiaXRfbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXN0cnVjdCBnbDUyMF9kYXRhICpkYXRhID0gZ2w1MjBfdXBkYXRlX2RldmljZShkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIChkYXRhLT5hbGFybXMgPj4gYml0X25yKSAmIDEpOworfQorCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMF9hbGFybSwgU19JUlVHTywgZ2V0X2FsYXJtLCBOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xX2FsYXJtLCBTX0lSVUdPLCBnZXRfYWxhcm0sIE5VTEwsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfYWxhcm0sIFNfSVJVR08sIGdldF9hbGFybSwgTlVMTCwgMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluM19hbGFybSwgU19JUlVHTywgZ2V0X2FsYXJtLCBOVUxMLCAzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfYWxhcm0sIFNfSVJVR08sIGdldF9hbGFybSwgTlVMTCwgNCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjFfYWxhcm0sIFNfSVJVR08sIGdldF9hbGFybSwgTlVMTCwgNSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjJfYWxhcm0sIFNfSVJVR08sIGdldF9hbGFybSwgTlVMTCwgNik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2FsYXJtLCBTX0lSVUdPLCBnZXRfYWxhcm0sIE5VTEwsIDcpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjRfYWxhcm0sIFNfSVJVR08sIGdldF9hbGFybSwgTlVMTCwgNyk7CisKK3N0YXRpYyBzc2l6ZV90IGdldF9iZWVwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpCit7CisJaW50IGJpdG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwlzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSA9IGdsNTIwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAoZGF0YS0+YmVlcF9tYXNrID4+IGJpdG5yKSAmIDEpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfYmVlcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBiaXRuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJdW5zaWduZWQgbG9uZyBiaXQ7CisKKwliaXQgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlpZiAoYml0ICYgfjEpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmJlZXBfbWFzayA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQkVFUF9NQVNLKTsKKwlpZiAoYml0KQorCQlkYXRhLT5iZWVwX21hc2sgfD0gKDEgPDwgYml0bnIpOworCWVsc2UKKwkJZGF0YS0+YmVlcF9tYXNrICY9IH4oMSA8PCBiaXRucik7CisJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQkVFUF9NQVNLLCBkYXRhLT5iZWVwX21hc2spOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjBfYmVlcCwgU19JUlVHTyB8IFNfSVdVU1IsIGdldF9iZWVwLCBzZXRfYmVlcCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9iZWVwLCBTX0lSVUdPIHwgU19JV1VTUiwgZ2V0X2JlZXAsIHNldF9iZWVwLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4yX2JlZXAsIFNfSVJVR08gfCBTX0lXVVNSLCBnZXRfYmVlcCwgc2V0X2JlZXAsIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjNfYmVlcCwgU19JUlVHTyB8IFNfSVdVU1IsIGdldF9iZWVwLCBzZXRfYmVlcCwgMyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2JlZXAsIFNfSVJVR08gfCBTX0lXVVNSLCBnZXRfYmVlcCwgc2V0X2JlZXAsIDQpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xX2JlZXAsIFNfSVJVR08gfCBTX0lXVVNSLCBnZXRfYmVlcCwgc2V0X2JlZXAsIDUpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4yX2JlZXAsIFNfSVJVR08gfCBTX0lXVVNSLCBnZXRfYmVlcCwgc2V0X2JlZXAsIDYpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9iZWVwLCBTX0lSVUdPIHwgU19JV1VTUiwgZ2V0X2JlZXAsIHNldF9iZWVwLCA3KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW40X2JlZXAsIFNfSVJVR08gfCBTX0lXVVNSLCBnZXRfYmVlcCwgc2V0X2JlZXAsIDcpOworCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZ2w1MjBfYXR0cmlidXRlc1tdID0gewogCSZkZXZfYXR0cl9jcHUwX3ZpZC5hdHRyLAogCi0JJmRldl9hdHRyX2luMF9pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl9pbjBfbWluLmF0dHIsCi0JJmRldl9hdHRyX2luMF9tYXguYXR0ciwKLQkmZGV2X2F0dHJfaW4xX2lucHV0LmF0dHIsCi0JJmRldl9hdHRyX2luMV9taW4uYXR0ciwKLQkmZGV2X2F0dHJfaW4xX21heC5hdHRyLAotCSZkZXZfYXR0cl9pbjJfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfaW4yX21pbi5hdHRyLAotCSZkZXZfYXR0cl9pbjJfbWF4LmF0dHIsCi0JJmRldl9hdHRyX2luM19pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl9pbjNfbWluLmF0dHIsCi0JJmRldl9hdHRyX2luM19tYXguYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMF9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4wX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4wX21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4wX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjBfYmVlcC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjFfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9iZWVwLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4yX2JlZXAuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luM19pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4zX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4zX21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4zX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjNfYmVlcC5kZXZfYXR0ci5hdHRyLAogCi0JJmRldl9hdHRyX2ZhbjFfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfZmFuMV9taW4uYXR0ciwKLQkmZGV2X2F0dHJfZmFuMV9kaXYuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2Rpdi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV9iZWVwLmRldl9hdHRyLmF0dHIsCiAJJmRldl9hdHRyX2ZhbjFfb2ZmLmF0dHIsCi0JJmRldl9hdHRyX2ZhbjJfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfZmFuMl9taW4uYXR0ciwKLQkmZGV2X2F0dHJfZmFuMl9kaXYuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4yX2Rpdi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuMl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuMl9iZWVwLmRldl9hdHRyLmF0dHIsCiAKLQkmZGV2X2F0dHJfdGVtcDFfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfdGVtcDFfbWF4LmF0dHIsCi0JJmRldl9hdHRyX3RlbXAxX21heF9oeXN0LmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXhfaHlzdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2JlZXAuZGV2X2F0dHIuYXR0ciwKIAogCSZkZXZfYXR0cl9hbGFybXMuYXR0ciwKIAkmZGV2X2F0dHJfYmVlcF9lbmFibGUuYXR0ciwKQEAgLTUyNSwxMyArNjQ2LDE3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZ2w1MjBfYXR0cmlidXRlc19vcHRbXSA9IHsKLQkmZGV2X2F0dHJfaW40X2lucHV0LmF0dHIsCi0JJmRldl9hdHRyX2luNF9taW4uYXR0ciwKLQkmZGV2X2F0dHJfaW40X21heC5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW40X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjRfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjRfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjRfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNF9iZWVwLmRldl9hdHRyLmF0dHIsCiAKLQkmZGV2X2F0dHJfdGVtcDJfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfdGVtcDJfbWF4LmF0dHIsCi0JJmRldl9hdHRyX3RlbXAyX21heF9oeXN0LmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9tYXhfaHlzdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2JlZXAuZGV2X2F0dHIuYXR0ciwKIAlOVUxMCiB9OwogCkBAIC01NTMsNyArNjc4LDcgQEAKIAogc3RhdGljIGludCBnbDUyMF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKIAlzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YTsKIAlpbnQgZXJyID0gMDsKIApAQCAtNTcwLDU5ICs2OTUsNjUgQEAKIAkJZ290byBleGl0OwogCX0KIAotCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OwotCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKLQluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKLQluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKLQluZXdfY2xpZW50LT5kcml2ZXIgPSAmZ2w1MjBfZHJpdmVyOwotCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKwljbGllbnQgPSAmZGF0YS0+Y2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOworCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwljbGllbnQtPmRyaXZlciA9ICZnbDUyMF9kcml2ZXI7CiAKIAkvKiBEZXRlcm1pbmUgdGhlIGNoaXAgdHlwZS4gKi8KIAlpZiAoa2luZCA8IDApIHsKLQkJaWYgKChnbDUyMF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEdMNTIwX1JFR19DSElQX0lEKSAhPSAweDIwKSB8fAotCQkgICAgKChnbDUyMF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEdMNTIwX1JFR19SRVZJU0lPTikgJiAweDdmKSAhPSAweDAwKSB8fAotCQkgICAgKChnbDUyMF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEdMNTIwX1JFR19DT05GKSAmIDB4ODApICE9IDB4MDApKSB7Ci0JCQlkZXZfZGJnKCZuZXdfY2xpZW50LT5kZXYsICJVbmtub3duIGNoaXAgdHlwZSwgc2tpcHBpbmdcbiIpOworCQlpZiAoKGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQ0hJUF9JRCkgIT0gMHgyMCkgfHwKKwkJICAgICgoZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19SRVZJU0lPTikgJiAweDdmKSAhPSAweDAwKSB8fAorCQkgICAgKChnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0NPTkYpICYgMHg4MCkgIT0gMHgwMCkpIHsKKwkJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiVW5rbm93biBjaGlwIHR5cGUsIHNraXBwaW5nXG4iKTsKIAkJCWdvdG8gZXhpdF9mcmVlOwogCQl9CiAJfQogCiAJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgKi8KLQlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsICJnbDUyMHNtIiwgSTJDX05BTUVfU0laRSk7Ci0JZGF0YS0+dmFsaWQgPSAwOworCXN0cmxjcHkoY2xpZW50LT5uYW1lLCAiZ2w1MjBzbSIsIEkyQ19OQU1FX1NJWkUpOwogCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAogCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KLQlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKKwlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KGNsaWVudCkpKQogCQlnb3RvIGV4aXRfZnJlZTsKIAogCS8qIEluaXRpYWxpemUgdGhlIEdMNTIwU00gY2hpcCAqLwotCWdsNTIwX2luaXRfY2xpZW50KG5ld19jbGllbnQpOworCWdsNTIwX2luaXRfY2xpZW50KGNsaWVudCk7CiAKIAkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLwotCWlmICgoZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZuZXdfY2xpZW50LT5kZXYua29iaiwgJmdsNTIwX2dyb3VwKSkpCisJaWYgKChlcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZnbDUyMF9ncm91cCkpKQogCQlnb3RvIGV4aXRfZGV0YWNoOwogCiAJaWYgKGRhdGEtPnR3b190ZW1wcykgewotCQlpZiAoKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAotCQkJCQkgICAgICAmZGV2X2F0dHJfdGVtcDJfaW5wdXQpKQotCQkgfHwgKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAotCQkJCQkgICAgICAmZGV2X2F0dHJfdGVtcDJfbWF4KSkKLQkJIHx8IChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKLQkJCQkJICAgICAgJmRldl9hdHRyX3RlbXAyX21heF9oeXN0KSkpCisJCWlmICgoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwKKwkJCQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2lucHV0LmRldl9hdHRyKSkKKwkJIHx8IChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LAorCQkJCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWF4LmRldl9hdHRyKSkKKwkJIHx8IChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LAorCQkJCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWF4X2h5c3QuZGV2X2F0dHIpKQorCQkgfHwgKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsCisJCQkJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9hbGFybS5kZXZfYXR0cikpCisJCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwKKwkJCQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2JlZXAuZGV2X2F0dHIpKSkKIAkJCWdvdG8gZXhpdF9yZW1vdmVfZmlsZXM7CiAJfSBlbHNlIHsKLQkJaWYgKChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKLQkJCQkJICAgICAgJmRldl9hdHRyX2luNF9pbnB1dCkpCi0JCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsCi0JCQkJCSAgICAgICZkZXZfYXR0cl9pbjRfbWluKSkKLQkJIHx8IChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKLQkJCQkJICAgICAgJmRldl9hdHRyX2luNF9tYXgpKSkKKwkJaWYgKChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LAorCQkJCSZzZW5zb3JfZGV2X2F0dHJfaW40X2lucHV0LmRldl9hdHRyKSkKKwkJIHx8IChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LAorCQkJCSZzZW5zb3JfZGV2X2F0dHJfaW40X21pbi5kZXZfYXR0cikpCisJCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwKKwkJCQkmc2Vuc29yX2Rldl9hdHRyX2luNF9tYXguZGV2X2F0dHIpKQorCQkgfHwgKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsCisJCQkJJnNlbnNvcl9kZXZfYXR0cl9pbjRfYWxhcm0uZGV2X2F0dHIpKQorCQkgfHwgKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsCisJCQkJJnNlbnNvcl9kZXZfYXR0cl9pbjRfYmVlcC5kZXZfYXR0cikpKQogCQkJZ290byBleGl0X3JlbW92ZV9maWxlczsKIAl9CiAKIAotCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmbmV3X2NsaWVudC0+ZGV2KTsKKwlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKIAlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKIAkJZXJyID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOwogCQlnb3RvIGV4aXRfcmVtb3ZlX2ZpbGVzOwpAQCAtNjMxLDEwICs3NjIsMTAgQEAKIAlyZXR1cm4gMDsKIAogZXhpdF9yZW1vdmVfZmlsZXM6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZuZXdfY2xpZW50LT5kZXYua29iaiwgJmdsNTIwX2dyb3VwKTsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJm5ld19jbGllbnQtPmRldi5rb2JqLCAmZ2w1MjBfZ3JvdXBfb3B0KTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZnbDUyMF9ncm91cCk7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmZ2w1MjBfZ3JvdXBfb3B0KTsKIGV4aXRfZGV0YWNoOgotCWkyY19kZXRhY2hfY2xpZW50KG5ld19jbGllbnQpOworCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CiBleGl0X2ZyZWU6CiAJa2ZyZWUoZGF0YSk7CiBleGl0OgpAQCAtNjk3LDcgKzgyOCw3IEBACiB9CiAKIAotLyogUmVnaXN0ZXJzIDB4MDcgdG8gMHgwYyBhcmUgd29yZC1zaXplZCwgb3RoZXJzIGFyZSBieXRlLXNpemVkIAorLyogUmVnaXN0ZXJzIDB4MDcgdG8gMHgwYyBhcmUgd29yZC1zaXplZCwgb3RoZXJzIGFyZSBieXRlLXNpemVkCiAgICBHTDUyMCB1c2VzIGEgaGlnaC1ieXRlIGZpcnN0IGNvbnZlbnRpb24gKi8KIHN0YXRpYyBpbnQgZ2w1MjBfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCiB7CkBAIC03MjAsNyArODUxLDcgQEAKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwogCXN0cnVjdCBnbDUyMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JaW50IHZhbDsKKwlpbnQgdmFsLCBpOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCkBAIC03MzIsMTggKzg2MywxMyBAQAogCQlkYXRhLT5iZWVwX21hc2sgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0JFRVBfTUFTSyk7CiAJCWRhdGEtPnZpZCA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfVklEX0lOUFVUKSAmIDB4MWY7CiAKLQkJdmFsID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19JTjBfTElNSVQpOwotCQlkYXRhLT5pbl9taW5bMF0gPSB2YWwgJiAweGZmOwotCQlkYXRhLT5pbl9tYXhbMF0gPSAodmFsID4+IDgpICYgMHhmZjsKLQkJdmFsID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19JTjFfTElNSVQpOwotCQlkYXRhLT5pbl9taW5bMV0gPSB2YWwgJiAweGZmOwotCQlkYXRhLT5pbl9tYXhbMV0gPSAodmFsID4+IDgpICYgMHhmZjsKLQkJdmFsID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19JTjJfTElNSVQpOwotCQlkYXRhLT5pbl9taW5bMl0gPSB2YWwgJiAweGZmOwotCQlkYXRhLT5pbl9tYXhbMl0gPSAodmFsID4+IDgpICYgMHhmZjsKLQkJdmFsID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19JTjNfTElNSVQpOwotCQlkYXRhLT5pbl9taW5bM10gPSB2YWwgJiAweGZmOwotCQlkYXRhLT5pbl9tYXhbM10gPSAodmFsID4+IDgpICYgMHhmZjsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJZGF0YS0+aW5faW5wdXRbaV0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCQlHTDUyMF9SRUdfSU5fSU5QVVRbaV0pOworCQkJdmFsID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19JTl9MSU1JVFtpXSk7CisJCQlkYXRhLT5pbl9taW5baV0gPSB2YWwgJiAweGZmOworCQkJZGF0YS0+aW5fbWF4W2ldID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJCX0KIAogCQl2YWwgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0ZBTl9JTlBVVCk7CiAJCWRhdGEtPmZhbl9pbnB1dFswXSA9ICh2YWwgPj4gOCkgJiAweGZmOwpAQCAtNzUzLDkgKzg3OSwxMiBAQAogCQlkYXRhLT5mYW5fbWluWzBdID0gKHZhbCA+PiA4KSAmIDB4ZmY7CiAJCWRhdGEtPmZhbl9taW5bMV0gPSB2YWwgJiAweGZmOwogCi0JCWRhdGEtPnRlbXBfaW5wdXRbMF0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX1RFTVAxX0lOUFVUKTsKLQkJZGF0YS0+dGVtcF9tYXhbMF0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX1RFTVAxX01BWCk7Ci0JCWRhdGEtPnRlbXBfbWF4X2h5c3RbMF0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX1RFTVAxX01BWF9IWVNUKTsKKwkJZGF0YS0+dGVtcF9pbnB1dFswXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJR0w1MjBfUkVHX1RFTVBfSU5QVVRbMF0pOworCQlkYXRhLT50ZW1wX21heFswXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJR0w1MjBfUkVHX1RFTVBfTUFYWzBdKTsKKwkJZGF0YS0+dGVtcF9tYXhfaHlzdFswXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJR0w1MjBfUkVHX1RFTVBfTUFYX0hZU1RbMF0pOwogCiAJCXZhbCA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfRkFOX0RJVik7CiAJCWRhdGEtPmZhbl9kaXZbMF0gPSAodmFsID4+IDYpICYgMHgwMzsKQEAgLTc2NywyMCArODk2LDIxIEBACiAJCXZhbCA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQ09ORik7CiAJCWRhdGEtPmJlZXBfZW5hYmxlID0gISgodmFsID4+IDIpICYgMSk7CiAKLQkJZGF0YS0+aW5faW5wdXRbMF0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lOMF9JTlBVVCk7Ci0JCWRhdGEtPmluX2lucHV0WzFdID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19JTjFfSU5QVVQpOwotCQlkYXRhLT5pbl9pbnB1dFsyXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU4yX0lOUFVUKTsKLQkJZGF0YS0+aW5faW5wdXRbM10gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lOM19JTlBVVCk7Ci0KIAkJLyogVGVtcDEgYW5kIFZpbjQgYXJlIHRoZSBzYW1lIGlucHV0ICovCiAJCWlmIChkYXRhLT50d29fdGVtcHMpIHsKLQkJCWRhdGEtPnRlbXBfaW5wdXRbMV0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX1RFTVAyX0lOUFVUKTsKLQkJCWRhdGEtPnRlbXBfbWF4WzFdID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19URU1QMl9NQVgpOwotCQkJZGF0YS0+dGVtcF9tYXhfaHlzdFsxXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfVEVNUDJfTUFYX0hZU1QpOworCQkJZGF0YS0+dGVtcF9pbnB1dFsxXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJR0w1MjBfUkVHX1RFTVBfSU5QVVRbMV0pOworCQkJZGF0YS0+dGVtcF9tYXhbMV0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCUdMNTIwX1JFR19URU1QX01BWFsxXSk7CisJCQlkYXRhLT50ZW1wX21heF9oeXN0WzFdID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQlHTDUyMF9SRUdfVEVNUF9NQVhfSFlTVFsxXSk7CiAJCX0gZWxzZSB7Ci0JCQlkYXRhLT5pbl9pbnB1dFs0XSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU40X0lOUFVUKTsKLQkJCWRhdGEtPmluX21pbls0XSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU40X01JTik7Ci0JCQlkYXRhLT5pbl9tYXhbNF0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lONF9NQVgpOworCQkJZGF0YS0+aW5faW5wdXRbNF0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCUdMNTIwX1JFR19JTl9JTlBVVFs0XSk7CisJCQlkYXRhLT5pbl9taW5bNF0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCUdMNTIwX1JFR19JTl9NSU5bNF0pOworCQkJZGF0YS0+aW5fbWF4WzRdID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQlHTDUyMF9SRUdfSU5fTUFYWzRdKTsKIAkJfQogCiAJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2l0ODcuYyBiL2RyaXZlcnMvaHdtb24vaXQ4Ny5jCmluZGV4IGFkNmM4YTMuLmUxMmMxMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaXQ4Ny5jCisrKyBiL2RyaXZlcnMvaHdtb24vaXQ4Ny5jCkBAIC0xNyw4ICsxNyw4IEBACiAgICAgICAgICAgICAgIElUODcyNkYgIFN1cGVyIEkvTyBjaGlwIHcvTFBDIGludGVyZmFjZQogICAgICAgICAgICAgICBTaXM5NTAgICBBIGNsb25lIG9mIHRoZSBJVDg3MDVGCiAKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDEgQ2hyaXMgR2F1dGhyb24gPGNocmlzZ0AwLWluLmNvbT4gCi0gICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgICAgQ29weXJpZ2h0IChDKSAyMDAxIENocmlzIEdhdXRocm9uCisgICAgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CiAKICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC01Miw2ICs1MiwxMCBAQAogCiBlbnVtIGNoaXBzIHsgaXQ4NywgaXQ4NzEyLCBpdDg3MTYsIGl0ODcxOCB9OwogCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZm9yY2VfaWQ7Cittb2R1bGVfcGFyYW0oZm9yY2VfaWQsIHVzaG9ydCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2lkLCAiT3ZlcnJpZGUgdGhlIGRldGVjdGVkIGRldmljZSBJRCIpOworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAogI2RlZmluZQlSRUcJMHgyZQkvKiBUaGUgcmVnaXN0ZXIgdG8gcmVhZC93cml0ZSAqLwpAQCAtNzc2LDYgKzc4MCwzMCBAQAogfQogc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgc2hvd19hbGFybXMsIE5VTEwpOwogCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlpbnQgYml0bnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXN0cnVjdCBpdDg3X2RhdGEgKmRhdGEgPSBpdDg3X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgKGRhdGEtPmFsYXJtcyA+PiBiaXRucikgJiAxKTsKK30KK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4wX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA4KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA5KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4yX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAxMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluM19hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjRfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDEyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW41X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAxMyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluNl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTQpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjdfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDE1KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjJfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4zX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuNF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjVfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDYpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTYpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTcpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTgpOworCiBzdGF0aWMgc3NpemVfdAogc2hvd192cm1fcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKQEAgLTgzNyw2ICs4NjUsMTQgQEAKIAkmc2Vuc29yX2Rldl9hdHRyX2luNV9tYXguZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luNl9tYXguZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2luN19tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luM19hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW40X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjVfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW43X2FsYXJtLmRldl9hdHRyLmF0dHIsCiAKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9pbnB1dC5kZXZfYXR0ci5hdHRyLApAQCAtODUwLDYgKzg4Niw5IEBACiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV90eXBlLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl90eXBlLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM190eXBlLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2FsYXJtLmRldl9hdHRyLmF0dHIsCiAKIAkmZGV2X2F0dHJfYWxhcm1zLmF0dHIsCiAJJmRldl9hdHRyX25hbWUuYXR0ciwKQEAgLTg4MiwxMiArOTIxLDIxIEBACiAJJnNlbnNvcl9kZXZfYXR0cl9mYW4zX21pbi5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfZmFuM19kaXYuZGV2X2F0dHIuYXR0ciwKIAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuMl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuM19hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuNF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuNV9hbGFybS5kZXZfYXR0ci5hdHRyLAorCiAJJnNlbnNvcl9kZXZfYXR0cl9wd20xX2VuYWJsZS5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfcHdtMl9lbmFibGUuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3B3bTNfZW5hYmxlLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9wd20xLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9wd20yLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9wd20zLmRldl9hdHRyLmF0dHIsCisJJmRldl9hdHRyX3B3bTFfZnJlcS5hdHRyLAorCSZkZXZfYXR0cl9wd20yX2ZyZXEuYXR0ciwKKwkmZGV2X2F0dHJfcHdtM19mcmVxLmF0dHIsCiAKIAkmZGV2X2F0dHJfdnJtLmF0dHIsCiAJJmRldl9hdHRyX2NwdTBfdmlkLmF0dHIsCkBAIC05MDYsNyArOTU0LDcgQEAKIAl1MTYgY2hpcF90eXBlOwogCiAJc3VwZXJpb19lbnRlcigpOwotCWNoaXBfdHlwZSA9IHN1cGVyaW9faW53KERFVklEKTsKKwljaGlwX3R5cGUgPSBmb3JjZV9pZCA/IGZvcmNlX2lkIDogc3VwZXJpb19pbncoREVWSUQpOwogCiAJc3dpdGNoIChjaGlwX3R5cGUpIHsKIAljYXNlIElUODcwNUZfREVWSUQ6CkBAIC0xMDI3LDM1ICsxMDc1LDQ1IEBACiAJCQlpZiAoKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCiAJCQkgICAgICZzZW5zb3JfZGV2X2F0dHJfZmFuMV9pbnB1dDE2LmRldl9hdHRyKSkKIAkJCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKLQkJCSAgICAgJnNlbnNvcl9kZXZfYXR0cl9mYW4xX21pbjE2LmRldl9hdHRyKSkpCisJCQkgICAgICZzZW5zb3JfZGV2X2F0dHJfZmFuMV9taW4xNi5kZXZfYXR0cikpCisJCQkgfHwgKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCisJCQkgICAgICZzZW5zb3JfZGV2X2F0dHJfZmFuMV9hbGFybS5kZXZfYXR0cikpKQogCQkJCWdvdG8gRVJST1I0OwogCQl9CiAJCWlmIChkYXRhLT5oYXNfZmFuICYgKDEgPDwgMSkpIHsKIAkJCWlmICgoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKIAkJCSAgICAgJnNlbnNvcl9kZXZfYXR0cl9mYW4yX2lucHV0MTYuZGV2X2F0dHIpKQogCQkJIHx8IChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LAotCQkJICAgICAmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfbWluMTYuZGV2X2F0dHIpKSkKKwkJCSAgICAgJnNlbnNvcl9kZXZfYXR0cl9mYW4yX21pbjE2LmRldl9hdHRyKSkKKwkJCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKKwkJCSAgICAgJnNlbnNvcl9kZXZfYXR0cl9mYW4yX2FsYXJtLmRldl9hdHRyKSkpCiAJCQkJZ290byBFUlJPUjQ7CiAJCX0KIAkJaWYgKGRhdGEtPmhhc19mYW4gJiAoMSA8PCAyKSkgewogCQkJaWYgKChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LAogCQkJICAgICAmc2Vuc29yX2Rldl9hdHRyX2ZhbjNfaW5wdXQxNi5kZXZfYXR0cikpCiAJCQkgfHwgKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCi0JCQkgICAgICZzZW5zb3JfZGV2X2F0dHJfZmFuM19taW4xNi5kZXZfYXR0cikpKQorCQkJICAgICAmc2Vuc29yX2Rldl9hdHRyX2ZhbjNfbWluMTYuZGV2X2F0dHIpKQorCQkJIHx8IChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LAorCQkJICAgICAmc2Vuc29yX2Rldl9hdHRyX2ZhbjNfYWxhcm0uZGV2X2F0dHIpKSkKIAkJCQlnb3RvIEVSUk9SNDsKIAkJfQogCQlpZiAoZGF0YS0+aGFzX2ZhbiAmICgxIDw8IDMpKSB7CiAJCQlpZiAoKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCiAJCQkgICAgICZzZW5zb3JfZGV2X2F0dHJfZmFuNF9pbnB1dDE2LmRldl9hdHRyKSkKIAkJCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKLQkJCSAgICAgJnNlbnNvcl9kZXZfYXR0cl9mYW40X21pbjE2LmRldl9hdHRyKSkpCisJCQkgICAgICZzZW5zb3JfZGV2X2F0dHJfZmFuNF9taW4xNi5kZXZfYXR0cikpCisJCQkgfHwgKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCisJCQkgICAgICZzZW5zb3JfZGV2X2F0dHJfZmFuNF9hbGFybS5kZXZfYXR0cikpKQogCQkJCWdvdG8gRVJST1I0OwogCQl9CiAJCWlmIChkYXRhLT5oYXNfZmFuICYgKDEgPDwgNCkpIHsKIAkJCWlmICgoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKIAkJCSAgICAgJnNlbnNvcl9kZXZfYXR0cl9mYW41X2lucHV0MTYuZGV2X2F0dHIpKQogCQkJIHx8IChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LAotCQkJICAgICAmc2Vuc29yX2Rldl9hdHRyX2ZhbjVfbWluMTYuZGV2X2F0dHIpKSkKKwkJCSAgICAgJnNlbnNvcl9kZXZfYXR0cl9mYW41X21pbjE2LmRldl9hdHRyKSkKKwkJCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKKwkJCSAgICAgJnNlbnNvcl9kZXZfYXR0cl9mYW41X2FsYXJtLmRldl9hdHRyKSkpCiAJCQkJZ290byBFUlJPUjQ7CiAJCX0KIAl9IGVsc2UgewpAQCAtMTA2Niw3ICsxMTI0LDkgQEAKIAkJCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKIAkJCSAgICAgJnNlbnNvcl9kZXZfYXR0cl9mYW4xX21pbi5kZXZfYXR0cikpCiAJCQkgfHwgKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCi0JCQkgICAgICZzZW5zb3JfZGV2X2F0dHJfZmFuMV9kaXYuZGV2X2F0dHIpKSkKKwkJCSAgICAgJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2Rpdi5kZXZfYXR0cikpCisJCQkgfHwgKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCisJCQkgICAgICZzZW5zb3JfZGV2X2F0dHJfZmFuMV9hbGFybS5kZXZfYXR0cikpKQogCQkJCWdvdG8gRVJST1I0OwogCQl9CiAJCWlmIChkYXRhLT5oYXNfZmFuICYgKDEgPDwgMSkpIHsKQEAgLTEwNzUsNyArMTEzNSw5IEBACiAJCQkgfHwgKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCiAJCQkgICAgICZzZW5zb3JfZGV2X2F0dHJfZmFuMl9taW4uZGV2X2F0dHIpKQogCQkJIHx8IChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LAotCQkJICAgICAmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfZGl2LmRldl9hdHRyKSkpCisJCQkgICAgICZzZW5zb3JfZGV2X2F0dHJfZmFuMl9kaXYuZGV2X2F0dHIpKQorCQkJIHx8IChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LAorCQkJICAgICAmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfYWxhcm0uZGV2X2F0dHIpKSkKIAkJCQlnb3RvIEVSUk9SNDsKIAkJfQogCQlpZiAoZGF0YS0+aGFzX2ZhbiAmICgxIDw8IDIpKSB7CkBAIC0xMDg0LDcgKzExNDYsOSBAQAogCQkJIHx8IChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LAogCQkJICAgICAmc2Vuc29yX2Rldl9hdHRyX2ZhbjNfbWluLmRldl9hdHRyKSkKIAkJCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKLQkJCSAgICAgJnNlbnNvcl9kZXZfYXR0cl9mYW4zX2Rpdi5kZXZfYXR0cikpKQorCQkJICAgICAmc2Vuc29yX2Rldl9hdHRyX2ZhbjNfZGl2LmRldl9hdHRyKSkKKwkJCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKKwkJCSAgICAgJnNlbnNvcl9kZXZfYXR0cl9mYW4zX2FsYXJtLmRldl9hdHRyKSkpCiAJCQkJZ290byBFUlJPUjQ7CiAJCX0KIAl9CkBAIC0xNDg4LDcgKzE1NTIsNyBAQAogfQogCiAKLU1PRFVMRV9BVVRIT1IoIkNocmlzIEdhdXRocm9uIDxjaHJpc2dAMC1pbi5jb20+LCAiCitNT0RVTEVfQVVUSE9SKCJDaHJpcyBHYXV0aHJvbiwgIgogCSAgICAgICJKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiSVQ4NzA1Ri84NzEyRi84NzE2Ri84NzE4Ri84NzI2RiwgU2lTOTUwIGRyaXZlciIpOwogbW9kdWxlX3BhcmFtKHVwZGF0ZV92YmF0LCBib29sLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG03NS5jIGIvZHJpdmVycy9od21vbi9sbTc1LmMKaW5kZXggMzdhOGNjMC4uZTVjMzVhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTc1LmMKKysrIGIvZHJpdmVycy9od21vbi9sbTc1LmMKQEAgLTc0LDcgKzc0LDYgQEAKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJsbTc1IiwKIAl9LAotCS5pZAkJPSBJMkNfRFJJVkVSSURfTE03NSwKIAkuYXR0YWNoX2FkYXB0ZXIJPSBsbTc1X2F0dGFjaF9hZGFwdGVyLAogCS5kZXRhY2hfY2xpZW50CT0gbG03NV9kZXRhY2hfY2xpZW50LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG03Ny5jIGIvZHJpdmVycy9od21vbi9sbTc3LmMKaW5kZXggY2VlNWMyZS4uNDU5YjcwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTc3LmMKKysrIGIvZHJpdmVycy9od21vbi9sbTc3LmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKQEAgLTExMyw3ICsxMTQsNiBAQAogc2hvdyh0ZW1wX2NyaXQpOwogc2hvdyh0ZW1wX21pbik7CiBzaG93KHRlbXBfbWF4KTsKLXNob3coYWxhcm1zKTsKIAogLyogcmVhZCByb3V0aW5lcyBmb3IgaHlzdGVyZXNpcyB2YWx1ZXMgKi8KIHN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9jcml0X2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQpAQCAtMTg2LDYgKzE4NiwxNCBAQAogCXJldHVybiBjb3VudDsKIH0KIAorc3RhdGljIHNzaXplX3Qgc2hvd19hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICBjaGFyICpidWYpCit7CisJaW50IGJpdG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwlzdHJ1Y3QgbG03N19kYXRhICpkYXRhID0gbG03N191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIChkYXRhLT5hbGFybXMgPj4gYml0bnIpICYgMSk7Cit9CisKIHN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywKIAkJICAgc2hvd190ZW1wX2lucHV0LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9jcml0LCBTX0lXVVNSIHwgU19JUlVHTywKQEAgLTIwMiw4ICsyMTAsOSBAQAogc3RhdGljIERFVklDRV9BVFRSKHRlbXAxX21heF9oeXN0LCBTX0lSVUdPLAogCQkgICBzaG93X3RlbXBfbWF4X2h5c3QsIE5VTEwpOwogCi1zdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1zLCBTX0lSVUdPLAotCQkgICBzaG93X2FsYXJtcywgTlVMTCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2NyaXRfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9taW5fYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9tYXhfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDEpOwogCiBzdGF0aWMgaW50IGxtNzdfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQogewpAQCAtMjIwLDggKzIyOSw5IEBACiAJJmRldl9hdHRyX3RlbXAxX2NyaXRfaHlzdC5hdHRyLAogCSZkZXZfYXR0cl90ZW1wMV9taW5faHlzdC5hdHRyLAogCSZkZXZfYXR0cl90ZW1wMV9tYXhfaHlzdC5hdHRyLAotCSZkZXZfYXR0cl9hbGFybXMuYXR0ciwKLQorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAlOVUxMCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtNzguYyBiL2RyaXZlcnMvaHdtb24vbG03OC5jCmluZGV4IDNmNzA1NWUuLjBhOWViMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG03OC5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG03OC5jCkBAIC0zNywxMCArMzcsOCBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAKIC8qIEFkZHJlc3NlcyB0byBzY2FuICovCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LAotCQkJCQkweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LAotCQkJCQkweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLAotCQkJCQkweDJmLCBJMkNfQ0xJRU5UX0VORCB9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwKKwkJCQkgICAgICAgMHgyZSwgMHgyZiwgSTJDX0NMSUVOVF9FTkQgfTsKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBpc2FfYWRkcmVzcyA9IDB4MjkwOwogCiAvKiBJbnNtb2QgcGFyYW1ldGVycyAqLwpAQCAtMTcwLDcgKzE2OCw2IEBACiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJPSAibG03OCIsCiAJfSwKLQkuaWQJCT0gSTJDX0RSSVZFUklEX0xNNzgsCiAJLmF0dGFjaF9hZGFwdGVyCT0gbG03OF9hdHRhY2hfYWRhcHRlciwKIAkuZGV0YWNoX2NsaWVudAk9IGxtNzhfZGV0YWNoX2NsaWVudCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtODAuYyBiL2RyaXZlcnMvaHdtb24vbG04MC5jCmluZGV4IDA2M2NkYmEuLmEyY2EwNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG04MC5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG04MC5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCkBAIC0xMjcsNyArMTI4LDcgQEAKIAl1MTYgYWxhcm1zOwkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIGNvbWJpbmVkICovCiB9OwogCi0vKiAKKy8qCiAgKiBGdW5jdGlvbnMgZGVjbGFyYXRpb24KICAqLwogCkBAIC0xNDcsNyArMTQ4LDYgQEAKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJsbTgwIiwKIAl9LAotCS5pZAkJPSBJMkNfRFJJVkVSSURfTE04MCwKIAkuYXR0YWNoX2FkYXB0ZXIJPSBsbTgwX2F0dGFjaF9hZGFwdGVyLAogCS5kZXRhY2hfY2xpZW50CT0gbG04MF9kZXRhY2hfY2xpZW50LAogfTsKQEAgLTE1OSwxMDUgKzE1OSw3NCBAQAogI2RlZmluZSBzaG93X2luKHN1ZmZpeCwgdmFsdWUpIFwKIHN0YXRpYyBzc2l6ZV90IHNob3dfaW5fIyNzdWZmaXgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCiB7IFwKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OyBcCiAJc3RydWN0IGxtODBfZGF0YSAqZGF0YSA9IGxtODBfdXBkYXRlX2RldmljZShkZXYpOyBcCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIElOX0ZST01fUkVHKGRhdGEtPnZhbHVlKSk7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+dmFsdWVbbnJdKSk7IFwKIH0KLXNob3dfaW4obWluMCwgaW5fbWluWzBdKTsKLXNob3dfaW4obWluMSwgaW5fbWluWzFdKTsKLXNob3dfaW4obWluMiwgaW5fbWluWzJdKTsKLXNob3dfaW4obWluMywgaW5fbWluWzNdKTsKLXNob3dfaW4obWluNCwgaW5fbWluWzRdKTsKLXNob3dfaW4obWluNSwgaW5fbWluWzVdKTsKLXNob3dfaW4obWluNiwgaW5fbWluWzZdKTsKLXNob3dfaW4obWF4MCwgaW5fbWF4WzBdKTsKLXNob3dfaW4obWF4MSwgaW5fbWF4WzFdKTsKLXNob3dfaW4obWF4MiwgaW5fbWF4WzJdKTsKLXNob3dfaW4obWF4MywgaW5fbWF4WzNdKTsKLXNob3dfaW4obWF4NCwgaW5fbWF4WzRdKTsKLXNob3dfaW4obWF4NSwgaW5fbWF4WzVdKTsKLXNob3dfaW4obWF4NiwgaW5fbWF4WzZdKTsKLXNob3dfaW4oaW5wdXQwLCBpblswXSk7Ci1zaG93X2luKGlucHV0MSwgaW5bMV0pOwotc2hvd19pbihpbnB1dDIsIGluWzJdKTsKLXNob3dfaW4oaW5wdXQzLCBpblszXSk7Ci1zaG93X2luKGlucHV0NCwgaW5bNF0pOwotc2hvd19pbihpbnB1dDUsIGluWzVdKTsKLXNob3dfaW4oaW5wdXQ2LCBpbls2XSk7CitzaG93X2luKG1pbiwgaW5fbWluKQorc2hvd19pbihtYXgsIGluX21heCkKK3Nob3dfaW4oaW5wdXQsIGluKQogCiAjZGVmaW5lIHNldF9pbihzdWZmaXgsIHZhbHVlLCByZWcpIFwKIHN0YXRpYyBzc2l6ZV90IHNldF9pbl8jI3N1ZmZpeChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIFwKIAlzaXplX3QgY291bnQpIFwKIHsgXAorCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7IFwKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCiAJc3RydWN0IGxtODBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCiAJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOyBcCiAgXAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTtcCi0JZGF0YS0+dmFsdWUgPSBJTl9UT19SRUcodmFsKTsgXAotCWxtODBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIGRhdGEtPnZhbHVlKTsgXAorCWRhdGEtPnZhbHVlW25yXSA9IElOX1RPX1JFRyh2YWwpOyBcCisJbG04MF93cml0ZV92YWx1ZShjbGllbnQsIHJlZyhuciksIGRhdGEtPnZhbHVlW25yXSk7IFwKIAltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTtcCiAJcmV0dXJuIGNvdW50OyBcCiB9Ci1zZXRfaW4obWluMCwgaW5fbWluWzBdLCBMTTgwX1JFR19JTl9NSU4oMCkpOwotc2V0X2luKG1pbjEsIGluX21pblsxXSwgTE04MF9SRUdfSU5fTUlOKDEpKTsKLXNldF9pbihtaW4yLCBpbl9taW5bMl0sIExNODBfUkVHX0lOX01JTigyKSk7Ci1zZXRfaW4obWluMywgaW5fbWluWzNdLCBMTTgwX1JFR19JTl9NSU4oMykpOwotc2V0X2luKG1pbjQsIGluX21pbls0XSwgTE04MF9SRUdfSU5fTUlOKDQpKTsKLXNldF9pbihtaW41LCBpbl9taW5bNV0sIExNODBfUkVHX0lOX01JTig1KSk7Ci1zZXRfaW4obWluNiwgaW5fbWluWzZdLCBMTTgwX1JFR19JTl9NSU4oNikpOwotc2V0X2luKG1heDAsIGluX21heFswXSwgTE04MF9SRUdfSU5fTUFYKDApKTsKLXNldF9pbihtYXgxLCBpbl9tYXhbMV0sIExNODBfUkVHX0lOX01BWCgxKSk7Ci1zZXRfaW4obWF4MiwgaW5fbWF4WzJdLCBMTTgwX1JFR19JTl9NQVgoMikpOwotc2V0X2luKG1heDMsIGluX21heFszXSwgTE04MF9SRUdfSU5fTUFYKDMpKTsKLXNldF9pbihtYXg0LCBpbl9tYXhbNF0sIExNODBfUkVHX0lOX01BWCg0KSk7Ci1zZXRfaW4obWF4NSwgaW5fbWF4WzVdLCBMTTgwX1JFR19JTl9NQVgoNSkpOwotc2V0X2luKG1heDYsIGluX21heFs2XSwgTE04MF9SRUdfSU5fTUFYKDYpKTsKK3NldF9pbihtaW4sIGluX21pbiwgTE04MF9SRUdfSU5fTUlOKQorc2V0X2luKG1heCwgaW5fbWF4LCBMTTgwX1JFR19JTl9NQVgpCiAKLSNkZWZpbmUgc2hvd19mYW4oc3VmZml4LCB2YWx1ZSwgZGl2KSBcCisjZGVmaW5lIHNob3dfZmFuKHN1ZmZpeCwgdmFsdWUpIFwKIHN0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjc3VmZml4KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgXAogeyBcCisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsgXAogCXN0cnVjdCBsbTgwX2RhdGEgKmRhdGEgPSBsbTgwX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+dmFsdWUsIFwKLQkJICAgICAgIERJVl9GUk9NX1JFRyhkYXRhLT5kaXYpKSk7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRkFOX0ZST01fUkVHKGRhdGEtPnZhbHVlW25yXSwgXAorCQkgICAgICAgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkpOyBcCiB9Ci1zaG93X2ZhbihtaW4xLCBmYW5fbWluWzBdLCBmYW5fZGl2WzBdKTsKLXNob3dfZmFuKG1pbjIsIGZhbl9taW5bMV0sIGZhbl9kaXZbMV0pOwotc2hvd19mYW4oaW5wdXQxLCBmYW5bMF0sIGZhbl9kaXZbMF0pOwotc2hvd19mYW4oaW5wdXQyLCBmYW5bMV0sIGZhbl9kaXZbMV0pOworc2hvd19mYW4obWluLCBmYW5fbWluKQorc2hvd19mYW4oaW5wdXQsIGZhbikKIAotI2RlZmluZSBzaG93X2Zhbl9kaXYoc3VmZml4LCB2YWx1ZSkgXAotc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fZGl2IyNzdWZmaXgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCi17IFwKLQlzdHJ1Y3QgbG04MF9kYXRhICpkYXRhID0gbG04MF91cGRhdGVfZGV2aWNlKGRldik7IFwKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRElWX0ZST01fUkVHKGRhdGEtPnZhbHVlKSk7IFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCWNoYXIgKmJ1ZikKK3sKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXN0cnVjdCBsbTgwX2RhdGEgKmRhdGEgPSBsbTgwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7CiB9Ci1zaG93X2Zhbl9kaXYoMSwgZmFuX2RpdlswXSk7Ci1zaG93X2Zhbl9kaXYoMiwgZmFuX2RpdlsxXSk7CiAKLSNkZWZpbmUgc2V0X2ZhbihzdWZmaXgsIHZhbHVlLCByZWcsIGRpdikgXAotc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl8jI3N1ZmZpeChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIFwKLQlzaXplX3QgY291bnQpIFwKLXsgXAotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKLQlzdHJ1Y3QgbG04MF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKLQlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOyBcCi0gXAotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTtcCi0JZGF0YS0+dmFsdWUgPSBGQU5fVE9fUkVHKHZhbCwgRElWX0ZST01fUkVHKGRhdGEtPmRpdikpOyBcCi0JbG04MF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgZGF0YS0+dmFsdWUpOyBcCi0JbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7XAotCXJldHVybiBjb3VudDsgXAorc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtODBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+ZmFuX21pbltucl0gPSBGQU5fVE9fUkVHKHZhbCwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7CisJbG04MF93cml0ZV92YWx1ZShjbGllbnQsIExNODBfUkVHX0ZBTl9NSU4obnIgKyAxKSwgZGF0YS0+ZmFuX21pbltucl0pOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKIH0KLXNldF9mYW4obWluMSwgZmFuX21pblswXSwgTE04MF9SRUdfRkFOX01JTigxKSwgZmFuX2RpdlswXSk7Ci1zZXRfZmFuKG1pbjIsIGZhbl9taW5bMV0sIExNODBfUkVHX0ZBTl9NSU4oMiksIGZhbl9kaXZbMV0pOwogCiAvKiBOb3RlOiB3ZSBzYXZlIGFuZCByZXN0b3JlIHRoZSBmYW4gbWluaW11bSBoZXJlLCBiZWNhdXNlIGl0cyB2YWx1ZSBpcwogICAgZGV0ZXJtaW5lZCBpbiBwYXJ0IGJ5IHRoZSBmYW4gZGl2aXNvci4gIFRoaXMgZm9sbG93cyB0aGUgcHJpbmNpcGxlIG9mCiAgICBsZWFzdCBzdXJwcmlzZTsgdGhlIHVzZXIgZG9lc24ndCBleHBlY3QgdGhlIGZhbiBtaW5pbXVtIHRvIGNoYW5nZSBqdXN0CiAgICBiZWNhdXNlIHRoZSBkaXZpc29yIGNoYW5nZWQuICovCi1zdGF0aWMgc3NpemVfdCBzZXRfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKLQlzaXplX3QgY291bnQsIGludCBucikKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwogCXN0cnVjdCBsbTgwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAl1bnNpZ25lZCBsb25nIG1pbiwgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CkBAIC0yOTIsMTUgKzI2MSw2IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi0jZGVmaW5lIHNldF9mYW5fZGl2KG51bWJlcikgXAotc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9kaXYjI251bWJlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIFwKLQlzaXplX3QgY291bnQpIFwKLXsgXAotCXJldHVybiBzZXRfZmFuX2RpdihkZXYsIGJ1ZiwgY291bnQsIG51bWJlciAtIDEpOyBcCi19Ci1zZXRfZmFuX2RpdigxKTsKLXNldF9mYW5fZGl2KDIpOwotCiBzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfaW5wdXQxKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgbG04MF9kYXRhICpkYXRhID0gbG04MF91cGRhdGVfZGV2aWNlKGRldik7CkBAIC0zMzcsNDEgKzI5Nyw2NiBAQAogc2V0X3RlbXAob3NfbWF4LCB0ZW1wX29zX21heCwgTE04MF9SRUdfVEVNUF9PU19NQVgpOwogc2V0X3RlbXAob3NfaHlzdCwgdGVtcF9vc19oeXN0LCBMTTgwX1JFR19URU1QX09TX0hZU1QpOwogCi1zdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY2hhciAqYnVmKQogewogCXN0cnVjdCBsbTgwX2RhdGEgKmRhdGEgPSBsbTgwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+YWxhcm1zKTsKIH0KIAotc3RhdGljIERFVklDRV9BVFRSKGluMF9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21pbjAsIHNldF9pbl9taW4wKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihpbjFfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9taW4xLCBzZXRfaW5fbWluMSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoaW4yX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWluMiwgc2V0X2luX21pbjIpOwotc3RhdGljIERFVklDRV9BVFRSKGluM19taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21pbjMsIHNldF9pbl9taW4zKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihpbjRfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9taW40LCBzZXRfaW5fbWluNCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoaW41X21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWluNSwgc2V0X2luX21pbjUpOwotc3RhdGljIERFVklDRV9BVFRSKGluNl9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21pbjYsIHNldF9pbl9taW42KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihpbjBfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9tYXgwLCBzZXRfaW5fbWF4MCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoaW4xX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWF4MSwgc2V0X2luX21heDEpOwotc3RhdGljIERFVklDRV9BVFRSKGluMl9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21heDIsIHNldF9pbl9tYXgyKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihpbjNfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9tYXgzLCBzZXRfaW5fbWF4Myk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoaW40X21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWF4NCwgc2V0X2luX21heDQpOwotc3RhdGljIERFVklDRV9BVFRSKGluNV9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21heDUsIHNldF9pbl9tYXg1KTsKLXN0YXRpYyBERVZJQ0VfQVRUUihpbjZfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9tYXg2LCBzZXRfaW5fbWF4Nik7Ci1zdGF0aWMgREVWSUNFX0FUVFIoaW4wX2lucHV0LCBTX0lSVUdPLCBzaG93X2luX2lucHV0MCwgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoaW4xX2lucHV0LCBTX0lSVUdPLCBzaG93X2luX2lucHV0MSwgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoaW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X2luX2lucHV0MiwgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoaW4zX2lucHV0LCBTX0lSVUdPLCBzaG93X2luX2lucHV0MywgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoaW40X2lucHV0LCBTX0lSVUdPLCBzaG93X2luX2lucHV0NCwgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoaW41X2lucHV0LCBTX0lSVUdPLCBzaG93X2luX2lucHV0NSwgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoaW42X2lucHV0LCBTX0lSVUdPLCBzaG93X2luX2lucHV0NiwgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZmFuMV9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2Zhbl9taW4xLAotICAgIHNldF9mYW5fbWluMSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZmFuMl9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2Zhbl9taW4yLAotICAgIHNldF9mYW5fbWluMik7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZmFuMV9pbnB1dCwgU19JUlVHTywgc2hvd19mYW5faW5wdXQxLCBOVUxMKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihmYW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X2Zhbl9pbnB1dDIsIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKGZhbjFfZGl2LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19mYW5fZGl2MSwgc2V0X2Zhbl9kaXYxKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihmYW4yX2RpdiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfZmFuX2RpdjIsIHNldF9mYW5fZGl2Mik7CitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgIGNoYXIgKmJ1ZikKK3sKKwlpbnQgYml0bnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXN0cnVjdCBsbTgwX2RhdGEgKmRhdGEgPSBsbTgwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgKGRhdGEtPmFsYXJtcyA+PiBiaXRucikgJiAxKTsKK30KKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjBfbWluLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJc2hvd19pbl9taW4sIHNldF9pbl9taW4sIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjFfbWluLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJc2hvd19pbl9taW4sIHNldF9pbl9taW4sIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfbWluLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJc2hvd19pbl9taW4sIHNldF9pbl9taW4sIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjNfbWluLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJc2hvd19pbl9taW4sIHNldF9pbl9taW4sIDMpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjRfbWluLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJc2hvd19pbl9taW4sIHNldF9pbl9taW4sIDQpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjVfbWluLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJc2hvd19pbl9taW4sIHNldF9pbl9taW4sIDUpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjZfbWluLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJc2hvd19pbl9taW4sIHNldF9pbl9taW4sIDYpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjBfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJc2hvd19pbl9tYXgsIHNldF9pbl9tYXgsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjFfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJc2hvd19pbl9tYXgsIHNldF9pbl9tYXgsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJc2hvd19pbl9tYXgsIHNldF9pbl9tYXgsIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjNfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJc2hvd19pbl9tYXgsIHNldF9pbl9tYXgsIDMpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjRfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJc2hvd19pbl9tYXgsIHNldF9pbl9tYXgsIDQpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjVfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJc2hvd19pbl9tYXgsIHNldF9pbl9tYXgsIDUpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjZfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJc2hvd19pbl9tYXgsIHNldF9pbl9tYXgsIDYpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjBfaW5wdXQsIFNfSVJVR08sIHNob3dfaW5faW5wdXQsIE5VTEwsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjFfaW5wdXQsIFNfSVJVR08sIHNob3dfaW5faW5wdXQsIE5VTEwsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfaW5wdXQsIFNfSVJVR08sIHNob3dfaW5faW5wdXQsIE5VTEwsIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjNfaW5wdXQsIFNfSVJVR08sIHNob3dfaW5faW5wdXQsIE5VTEwsIDMpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjRfaW5wdXQsIFNfSVJVR08sIHNob3dfaW5faW5wdXQsIE5VTEwsIDQpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjVfaW5wdXQsIFNfSVJVR08sIHNob3dfaW5faW5wdXQsIE5VTEwsIDUpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjZfaW5wdXQsIFNfSVJVR08sIHNob3dfaW5faW5wdXQsIE5VTEwsIDYpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xX21pbiwgU19JV1VTUiB8IFNfSVJVR08sCisJCXNob3dfZmFuX21pbiwgc2V0X2Zhbl9taW4sIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4yX21pbiwgU19JV1VTUiB8IFNfSVJVR08sCisJCXNob3dfZmFuX21pbiwgc2V0X2Zhbl9taW4sIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xX2lucHV0LCBTX0lSVUdPLCBzaG93X2Zhbl9pbnB1dCwgTlVMTCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjJfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuX2lucHV0LCBOVUxMLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMV9kaXYsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQlzaG93X2Zhbl9kaXYsIHNldF9mYW5fZGl2LCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMl9kaXYsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQlzaG93X2Zhbl9kaXYsIHNldF9mYW5fZGl2LCAxKTsKIHN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wX2lucHV0MSwgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wX2hvdF9tYXgsCiAgICAgc2V0X3RlbXBfaG90X21heCk7CkBAIC0zODIsNiArMzY3LDE3IEBACiBzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfY3JpdF9oeXN0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wX29zX2h5c3QsCiAgICAgc2V0X3RlbXBfb3NfaHlzdCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1zLCBTX0lSVUdPLCBzaG93X2FsYXJtcywgTlVMTCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluM19hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluNF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgNCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluNV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgNSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluNl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgNik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjFfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDEwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9tYXhfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDgpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9jcml0X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAxMyk7CiAKIC8qCiAgKiBSZWFsIGNvZGUKQEAgLTM5NSw0MCArMzkxLDUwIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsbTgwX2F0dHJpYnV0ZXNbXSA9IHsKLQkmZGV2X2F0dHJfaW4wX21pbi5hdHRyLAotCSZkZXZfYXR0cl9pbjFfbWluLmF0dHIsCi0JJmRldl9hdHRyX2luMl9taW4uYXR0ciwKLQkmZGV2X2F0dHJfaW4zX21pbi5hdHRyLAotCSZkZXZfYXR0cl9pbjRfbWluLmF0dHIsCi0JJmRldl9hdHRyX2luNV9taW4uYXR0ciwKLQkmZGV2X2F0dHJfaW42X21pbi5hdHRyLAotCSZkZXZfYXR0cl9pbjBfbWF4LmF0dHIsCi0JJmRldl9hdHRyX2luMV9tYXguYXR0ciwKLQkmZGV2X2F0dHJfaW4yX21heC5hdHRyLAotCSZkZXZfYXR0cl9pbjNfbWF4LmF0dHIsCi0JJmRldl9hdHRyX2luNF9tYXguYXR0ciwKLQkmZGV2X2F0dHJfaW41X21heC5hdHRyLAotCSZkZXZfYXR0cl9pbjZfbWF4LmF0dHIsCi0JJmRldl9hdHRyX2luMF9pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl9pbjFfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfaW4yX2lucHV0LmF0dHIsCi0JJmRldl9hdHRyX2luM19pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl9pbjRfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfaW41X2lucHV0LmF0dHIsCi0JJmRldl9hdHRyX2luNl9pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl9mYW4xX21pbi5hdHRyLAotCSZkZXZfYXR0cl9mYW4yX21pbi5hdHRyLAotCSZkZXZfYXR0cl9mYW4xX2lucHV0LmF0dHIsCi0JJmRldl9hdHRyX2ZhbjJfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfZmFuMV9kaXYuYXR0ciwKLQkmZGV2X2F0dHJfZmFuMl9kaXYuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMF9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luM19taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNF9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNV9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNl9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMF9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMl9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luM19tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNF9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNV9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNl9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMF9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4xX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luM19pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW40X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjVfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNl9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4yX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2Rpdi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuMl9kaXYuZGV2X2F0dHIuYXR0ciwKIAkmZGV2X2F0dHJfdGVtcDFfaW5wdXQuYXR0ciwKIAkmZGV2X2F0dHJfdGVtcDFfbWF4LmF0dHIsCiAJJmRldl9hdHRyX3RlbXAxX21heF9oeXN0LmF0dHIsCiAJJmRldl9hdHRyX3RlbXAxX2NyaXQuYXR0ciwKIAkmZGV2X2F0dHJfdGVtcDFfY3JpdF9oeXN0LmF0dHIsCiAJJmRldl9hdHRyX2FsYXJtcy5hdHRyLAotCisJJnNlbnNvcl9kZXZfYXR0cl9pbjBfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4yX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjNfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW41X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjZfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdF9hbGFybS5kZXZfYXR0ci5hdHRyLAogCU5VTEwKIH07CiAKQEAgLTQzOSw3ICs0NDUsNyBAQAogc3RhdGljIGludCBsbTgwX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKIHsKIAlpbnQgaSwgY3VyOwotCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAJc3RydWN0IGxtODBfZGF0YSAqZGF0YTsKIAlpbnQgZXJyID0gMDsKIAljb25zdCBjaGFyICpuYW1lOwpAQCAtNDU1LDIxICs0NjEsMjAgQEAKIAkJZ290byBleGl0OwogCX0KIAotCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OwotCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKLQluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKLQluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKLQluZXdfY2xpZW50LT5kcml2ZXIgPSAmbG04MF9kcml2ZXI7Ci0JbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCWNsaWVudCA9ICZkYXRhLT5jbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGF0YSk7CisJY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwljbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCWNsaWVudC0+ZHJpdmVyID0gJmxtODBfZHJpdmVyOwogCiAJLyogTm93LCB3ZSBkbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbi4gSXQgaXMgbG91c3kuICovCi0JaWYgKGxtODBfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBMTTgwX1JFR19BTEFSTTIpICYgMHhjMCkKKwlpZiAobG04MF9yZWFkX3ZhbHVlKGNsaWVudCwgTE04MF9SRUdfQUxBUk0yKSAmIDB4YzApCiAJCWdvdG8gZXJyb3JfZnJlZTsKIAlmb3IgKGkgPSAweDJhOyBpIDw9IDB4M2Q7IGkrKykgewotCQljdXIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgaSk7Ci0JCWlmICgoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIGkgKyAweDQwKSAhPSBjdXIpCi0JCSB8fCAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIGkgKyAweDgwKSAhPSBjdXIpCi0JCSB8fCAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIGkgKyAweGMwKSAhPSBjdXIpKQorCQljdXIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBpKTsKKwkJaWYgKChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBpICsgMHg0MCkgIT0gY3VyKQorCQkgfHwgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIGkgKyAweDgwKSAhPSBjdXIpCisJCSB8fCAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgaSArIDB4YzApICE9IGN1cikpCiAJCSAgICBnb3RvIGVycm9yX2ZyZWU7CiAJfQogCkBAIC00NzcsMjcgKzQ4MiwyNiBAQAogCWtpbmQgPSBsbTgwOwogCW5hbWUgPSAibG04MCI7CiAKLQkvKiBGaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcyBhbmQgcHV0IGl0IGludG8gdGhlIGdsb2JhbCBsaXN0ICovCi0Jc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCBuYW1lLCBJMkNfTkFNRV9TSVpFKTsKLQlkYXRhLT52YWxpZCA9IDA7CisJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgKi8KKwlzdHJsY3B5KGNsaWVudC0+bmFtZSwgbmFtZSwgSTJDX05BTUVfU0laRSk7CiAJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwogCiAJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLwotCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQorCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KSkpCiAJCWdvdG8gZXJyb3JfZnJlZTsKIAogCS8qIEluaXRpYWxpemUgdGhlIExNODAgY2hpcCAqLwotCWxtODBfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisJbG04MF9pbml0X2NsaWVudChjbGllbnQpOwogCiAJLyogQSBmZXcgdmFycyBuZWVkIHRvIGJlIGZpbGxlZCB1cG9uIHN0YXJ0dXAgKi8KLQlkYXRhLT5mYW5fbWluWzBdID0gbG04MF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIExNODBfUkVHX0ZBTl9NSU4oMSkpOwotCWRhdGEtPmZhbl9taW5bMV0gPSBsbTgwX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgTE04MF9SRUdfRkFOX01JTigyKSk7CisJZGF0YS0+ZmFuX21pblswXSA9IGxtODBfcmVhZF92YWx1ZShjbGllbnQsIExNODBfUkVHX0ZBTl9NSU4oMSkpOworCWRhdGEtPmZhbl9taW5bMV0gPSBsbTgwX3JlYWRfdmFsdWUoY2xpZW50LCBMTTgwX1JFR19GQU5fTUlOKDIpKTsKIAogCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCi0JaWYgKChlcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJm5ld19jbGllbnQtPmRldi5rb2JqLCAmbG04MF9ncm91cCkpKQorCWlmICgoZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbG04MF9ncm91cCkpKQogCQlnb3RvIGVycm9yX2RldGFjaDsKIAotCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmbmV3X2NsaWVudC0+ZGV2KTsKKwlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKIAlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKIAkJZXJyID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOwogCQlnb3RvIGVycm9yX3JlbW92ZTsKQEAgLTUwNiw5ICs1MTAsOSBAQAogCXJldHVybiAwOwogCiBlcnJvcl9yZW1vdmU6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZuZXdfY2xpZW50LT5kZXYua29iaiwgJmxtODBfZ3JvdXApOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmxtODBfZ3JvdXApOwogZXJyb3JfZGV0YWNoOgotCWkyY19kZXRhY2hfY2xpZW50KG5ld19jbGllbnQpOworCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CiBlcnJvcl9mcmVlOgogCWtmcmVlKGRhdGEpOwogZXhpdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG04My5jIGIvZHJpdmVycy9od21vbi9sbTgzLmMKaW5kZXggMDMzNmI0NS4uNmU4OTAzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTgzLmMKKysrIGIvZHJpdmVycy9od21vbi9sbTgzLmMKQEAgLTEzMyw3ICsxMzMsNiBAQAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gImxtODMiLAogCX0sCi0JLmlkCQk9IEkyQ19EUklWRVJJRF9MTTgzLAogCS5hdHRhY2hfYWRhcHRlcgk9IGxtODNfYXR0YWNoX2FkYXB0ZXIsCiAJLmRldGFjaF9jbGllbnQJPSBsbTgzX2RldGFjaF9jbGllbnQsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTg1LmMgYi9kcml2ZXJzL2h3bW9uL2xtODUuYwppbmRleCBhMDI0ODBiLi40YmIwZjI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtODUuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtODUuYwpAQCAtMzY3LDcgKzM2Nyw2IEBACiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgICA9ICJsbTg1IiwKIAl9LAotCS5pZCAgICAgICAgICAgICA9IEkyQ19EUklWRVJJRF9MTTg1LAogCS5hdHRhY2hfYWRhcHRlciA9IGxtODVfYXR0YWNoX2FkYXB0ZXIsCiAJLmRldGFjaF9jbGllbnQgID0gbG04NV9kZXRhY2hfY2xpZW50LAogfTsKQEAgLTQ0NCwxMiArNDQzLDggQEAKIAogc3RhdGljIHNzaXplX3Qgc3RvcmVfdnJtX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQl1MzIgdmFsOwotCi0JdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7Ci0JZGF0YS0+dnJtID0gdmFsOworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlkYXRhLT52cm0gPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTUxOSwxNyArNTE0LDY0IEBACiB7CiAJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKIAlzdHJ1Y3QgbG04NV9kYXRhICpkYXRhID0gbG04NV91cGRhdGVfZGV2aWNlKGRldik7Ci0JaW50CXB3bV96b25lOworCWludCBwd21fem9uZSwgZW5hYmxlOwogCiAJcHdtX3pvbmUgPSBaT05FX0ZST01fUkVHKGRhdGEtPmF1dG9mYW5bbnJdLmNvbmZpZyk7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgKHB3bV96b25lICE9IDAgJiYgcHdtX3pvbmUgIT0gLTEpICk7CisJc3dpdGNoIChwd21fem9uZSkgeworCWNhc2UgLTE6CS8qIFBXTSBpcyBhbHdheXMgYXQgMTAwJSAqLworCQllbmFibGUgPSAwOworCQlicmVhazsKKwljYXNlIDA6CQkvKiBQV00gaXMgYWx3YXlzIGF0IDAlICovCisJY2FzZSAtMjoJLyogUFdNIHJlc3BvbmRzIHRvIG1hbnVhbCBjb250cm9sICovCisJCWVuYWJsZSA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CS8qIFBXTSBpbiBhdXRvbWF0aWMgbW9kZSAqLworCQllbmFibGUgPSAyOworCX0KKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZW5hYmxlKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X3B3bV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQorCQkqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTg1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJdTggY29uZmlnOworCisJc3dpdGNoICh2YWwpIHsKKwljYXNlIDA6CisJCWNvbmZpZyA9IDM7CisJCWJyZWFrOworCWNhc2UgMToKKwkJY29uZmlnID0gNzsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkvKiBIZXJlIHdlIGhhdmUgdG8gY2hvb3NlIGFyYml0cmFyaWx5IG9uZSBvZiB0aGUgNSBwb3NzaWJsZQorCQkgICBjb25maWd1cmF0aW9uczsgSSBnbyBmb3IgdGhlIHNhZmVzdCAqLworCQljb25maWcgPSA2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+YXV0b2Zhbltucl0uY29uZmlnID0gbG04NV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJTE04NV9SRUdfQUZBTl9DT05GSUcobnIpKTsKKwlkYXRhLT5hdXRvZmFuW25yXS5jb25maWcgPSAoZGF0YS0+YXV0b2Zhbltucl0uY29uZmlnICYgfjB4ZTApCisJCXwgKGNvbmZpZyA8PCA1KTsKKwlsbTg1X3dyaXRlX3ZhbHVlKGNsaWVudCwgTE04NV9SRUdfQUZBTl9DT05GSUcobnIpLAorCQlkYXRhLT5hdXRvZmFuW25yXS5jb25maWcpOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKIH0KIAogI2RlZmluZSBzaG93X3B3bV9yZWcob2Zmc2V0KQkJCQkJCVwKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtIyNvZmZzZXQsIFNfSVJVR08gfCBTX0lXVVNSLAkJXAogCQlzaG93X3B3bSwgc2V0X3B3bSwgb2Zmc2V0IC0gMSk7CQkJCVwKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtIyNvZmZzZXQjI19lbmFibGUsIFNfSVJVR08sCQlcCi0JCXNob3dfcHdtX2VuYWJsZSwgTlVMTCwgb2Zmc2V0IC0gMSkKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtIyNvZmZzZXQjI19lbmFibGUsIFNfSVJVR08gfCBTX0lXVVNSLAlcCisJCXNob3dfcHdtX2VuYWJsZSwgc2V0X3B3bV9lbmFibGUsIG9mZnNldCAtIDEpCiAKIHNob3dfcHdtX3JlZygxKTsKIHNob3dfcHdtX3JlZygyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG04Ny5jIGIvZHJpdmVycy9od21vbi9sbTg3LmMKaW5kZXggMjhjZGZmMC4uOGVlMDdjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTg3LmMKKysrIGIvZHJpdmVycy9od21vbi9sbTg3LmMKQEAgLTUsNyArNSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPgogICogICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZXBoZW4gUm91c3NldCA8c3RlcGhlbi5yb3Vzc2V0QHJvY2tldGxvZ2l4LmNvbT4KICAqICAgICAgICAgICAgICAgICAgICAgICAgICBEYW4gRWF0b24gPGRhbi5lYXRvbkByb2NrZXRsb2dpeC5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgICAgICAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsMjAwNyAgSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CiAgKgogICogT3JpZ2luYWwgcG9ydCB0byBMaW51eCAyLjYgYnkgSmVmZiBPbGl2ZXIuCiAgKgpAQCAtMzcsNiArMzcsMTEgQEAKICAqIGluc3RlYWQuIFRoZSBMTTg3IGlzIHRoZSBvbmx5IGhhcmR3YXJlIG1vbml0b3JpbmcgY2hpcHNldCBJIGtub3cgb2YKICAqIHdoaWNoIHVzZXMgYW1wbGl0dWRlIG1vZHVsYXRpb24uIEJlIGNhcmVmdWwgd2hlbiB1c2luZyB0aGlzIGZlYXR1cmUuCiAgKgorICogVGhpcyBkcml2ZXIgYWxzbyBzdXBwb3J0cyB0aGUgQURNMTAyNCwgYSBzZW5zb3IgY2hpcCBtYWRlIGJ5IEFuYWxvZworICogRGV2aWNlcy4gVGhhdCBjaGlwIGlzIGZ1bGx5IGNvbXBhdGlibGUgd2l0aCB0aGUgTE04Ny4gQ29tcGxldGUKKyAqIGRhdGFzaGVldCBjYW4gYmUgb2J0YWluZWQgZnJvbSBBbmFsb2cncyB3ZWJzaXRlIGF0OgorICogICBodHRwOi8vd3d3LmFuYWxvZy5jb20vZW4vcHJvZC8wLDI4NzcsQURNMTAyNCwwMC5odG1sCisgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgpAQCAtNzQsNyArNzksNyBAQAogICogSW5zbW9kIHBhcmFtZXRlcnMKICAqLwogCi1JMkNfQ0xJRU5UX0lOU01PRF8xKGxtODcpOworSTJDX0NMSUVOVF9JTlNNT0RfMihsbTg3LCBhZG0xMDI0KTsKIAogLyoKICAqIFRoZSBMTTg3IHJlZ2lzdGVycwpAQCAtMTY2LDcgKzE3MSw2IEBACiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJPSAibG04NyIsCiAJfSwKLQkuaWQJCT0gSTJDX0RSSVZFUklEX0xNODcsCiAJLmF0dGFjaF9hZGFwdGVyCT0gbG04N19hdHRhY2hfYWRhcHRlciwKIAkuZGV0YWNoX2NsaWVudAk9IGxtODdfZGV0YWNoX2NsaWVudCwKIH07CkBAIC01MDYsOCArNTEwLDcgQEAKIH0KIHN0YXRpYyBzc2l6ZV90IHNldF92cm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgbG04N19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGxtODdfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWRhdGEtPnZybSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwogCXJldHVybiBjb3VudDsKIH0KQEAgLTY2Miw2ICs2NjUsNyBAQAogCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OwogCXN0cnVjdCBsbTg3X2RhdGEgKmRhdGE7CiAJaW50IGVyciA9IDA7CisJc3RhdGljIGNvbnN0IGNoYXIgKm5hbWVzW10gPSB7ICJsbTg3IiwgImFkbTEwMjQiIH07CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCiAJCWdvdG8gZXhpdDsKQEAgLTY4NiwxMSArNjkwLDE4IEBACiAKIAkvKiBOb3csIHdlIGRvIHRoZSByZW1haW5pbmcgZGV0ZWN0aW9uLiAqLwogCWlmIChraW5kIDwgMCkgeworCQl1OCBjaWQgPSBsbTg3X3JlYWRfdmFsdWUobmV3X2NsaWVudCwgTE04N19SRUdfQ09NUEFOWV9JRCk7CiAJCXU4IHJldiA9IGxtODdfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBMTTg3X1JFR19SRVZJU0lPTik7CiAKLQkJaWYgKHJldiA8IDB4MDEgfHwgcmV2ID4gMHgwOAotCQkgfHwgKGxtODdfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBMTTg3X1JFR19DT05GSUcpICYgMHg4MCkKLQkJIHx8IGxtODdfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBMTTg3X1JFR19DT01QQU5ZX0lEKSAhPSAweDAyKSB7CisJCWlmIChjaWQgPT0gMHgwMgkJCS8qIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgKi8KKwkJICYmIChyZXYgPj0gMHgwMSAmJiByZXYgPD0gMHgwOCkpCisJCQlraW5kID0gbG04NzsKKwkJZWxzZSBpZiAoY2lkID09IDB4NDEJCS8qIEFuYWxvZyBEZXZpY2VzICovCisJCSAgICAgICYmIChyZXYgJiAweGYwKSA9PSAweDEwKQorCQkJa2luZCA9IGFkbTEwMjQ7CisKKwkJaWYgKGtpbmQgPCAwCisJCSB8fCAobG04N19yZWFkX3ZhbHVlKG5ld19jbGllbnQsIExNODdfUkVHX0NPTkZJRykgJiAweDgwKSkgewogCQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LAogCQkJCSJMTTg3IGRldGVjdGlvbiBmYWlsZWQgYXQgMHglMDJ4LlxuIiwKIAkJCQlhZGRyZXNzKTsKQEAgLTY5OSw3ICs3MTAsNyBAQAogCX0KIAogCS8qIFdlIGNhbiBmaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcyAqLwotCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgImxtODciLCBJMkNfTkFNRV9TSVpFKTsKKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsIG5hbWVzW2tpbmQgLSAxXSwgSTJDX05BTUVfU0laRSk7CiAJZGF0YS0+dmFsaWQgPSAwOwogCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTkwLmMgYi9kcml2ZXJzL2h3bW9uL2xtOTAuYwppbmRleCA5NjBkZjlmLi5mN2VjOTViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtOTAuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtOTAuYwpAQCAtMjA0LDcgKzIwNCw2IEBACiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJPSAibG05MCIsCiAJfSwKLQkuaWQJCT0gSTJDX0RSSVZFUklEX0xNOTAsCiAJLmF0dGFjaF9hZGFwdGVyCT0gbG05MF9hdHRhY2hfYWRhcHRlciwKIAkuZGV0YWNoX2NsaWVudAk9IGxtOTBfZGV0YWNoX2NsaWVudCwKIH07CkBAIC01MzEsMjQgKzUzMCwyNCBAQAogCQlraW5kID0gbG05MDsKIAogCWlmIChraW5kIDwgMCkgeyAvKiBkZXRlY3Rpb24gYW5kIGlkZW50aWZpY2F0aW9uICovCi0JCXU4IG1hbl9pZCwgY2hpcF9pZCwgcmVnX2NvbmZpZzEsIHJlZ19jb252cmF0ZTsKKwkJaW50IG1hbl9pZCwgY2hpcF9pZCwgcmVnX2NvbmZpZzEsIHJlZ19jb252cmF0ZTsKIAotCQlpZiAobG05MF9yZWFkX3JlZyhuZXdfY2xpZW50LCBMTTkwX1JFR19SX01BTl9JRCwKLQkJCQkgICZtYW5faWQpIDwgMAotCQkgfHwgbG05MF9yZWFkX3JlZyhuZXdfY2xpZW50LCBMTTkwX1JFR19SX0NISVBfSUQsCi0JCSAJCSAgJmNoaXBfaWQpIDwgMAotCQkgfHwgbG05MF9yZWFkX3JlZyhuZXdfY2xpZW50LCBMTTkwX1JFR19SX0NPTkZJRzEsCi0JCSAJCSAgJnJlZ19jb25maWcxKSA8IDAKLQkJIHx8IGxtOTBfcmVhZF9yZWcobmV3X2NsaWVudCwgTE05MF9SRUdfUl9DT05WUkFURSwKLQkJIAkJICAmcmVnX2NvbnZyYXRlKSA8IDApCisJCWlmICgobWFuX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCisJCQkJCQlMTTkwX1JFR19SX01BTl9JRCkpIDwgMAorCQkgfHwgKGNoaXBfaWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKKwkJCQkJCUxNOTBfUkVHX1JfQ0hJUF9JRCkpIDwgMAorCQkgfHwgKHJlZ19jb25maWcxID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCisJCQkJCQlMTTkwX1JFR19SX0NPTkZJRzEpKSA8IDAKKwkJIHx8IChyZWdfY29udnJhdGUgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwKKwkJCQkJCUxNOTBfUkVHX1JfQ09OVlJBVEUpKSA8IDApCiAJCQlnb3RvIGV4aXRfZnJlZTsKIAkJCiAJCWlmICgoYWRkcmVzcyA9PSAweDRDIHx8IGFkZHJlc3MgPT0gMHg0RCkKIAkJICYmIG1hbl9pZCA9PSAweDAxKSB7IC8qIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgKi8KLQkJCXU4IHJlZ19jb25maWcyOworCQkJaW50IHJlZ19jb25maWcyOwogCi0JCQlpZiAobG05MF9yZWFkX3JlZyhuZXdfY2xpZW50LCBMTTkwX1JFR19SX0NPTkZJRzIsCi0JCQkJCSAgJnJlZ19jb25maWcyKSA8IDApCisJCQlpZiAoKHJlZ19jb25maWcyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCisJCQkJCQlMTTkwX1JFR19SX0NPTkZJRzIpKSA8IDApCiAJCQkJZ290byBleGl0X2ZyZWU7CiAKIAkJCWlmICgocmVnX2NvbmZpZzEgJiAweDJBKSA9PSAweDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtOTIuYyBiL2RyaXZlcnMvaHdtb24vbG05Mi5jCmluZGV4IDYxZDFiZDEuLmFmNWM3N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG05Mi5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG05Mi5jCkBAIC00MjgsNyArNDI4LDYgQEAKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJsbTkyIiwKIAl9LAotCS5pZAkJPSBJMkNfRFJJVkVSSURfTE05MiwKIAkuYXR0YWNoX2FkYXB0ZXIJPSBsbTkyX2F0dGFjaF9hZGFwdGVyLAogCS5kZXRhY2hfY2xpZW50CT0gbG05Ml9kZXRhY2hfY2xpZW50LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vcGM4NzM2MC5jIGIvZHJpdmVycy9od21vbi9wYzg3MzYwLmMKaW5kZXggOWQ2NjAxMy4uOWI0NjJiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9wYzg3MzYwLmMKKysrIGIvZHJpdmVycy9od21vbi9wYzg3MzYwLmMKQEAgLTU5LDYgKzU5LDEwIEBACiAgIiAyOiBGb3JjaWJseSBlbmFibGUgYWxsIHZvbHRhZ2UgYW5kIHRlbXBlcmF0dXJlIGNoYW5uZWxzLCBleGNlcHQgaW45XG4iCiAgIiAzOiBGb3JjaWJseSBlbmFibGUgYWxsIHZvbHRhZ2UgYW5kIHRlbXBlcmF0dXJlIGNoYW5uZWxzLCBpbmNsdWRpbmcgaW45Iik7CiAKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmb3JjZV9pZDsKK21vZHVsZV9wYXJhbShmb3JjZV9pZCwgdXNob3J0LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfaWQsICJPdmVycmlkZSB0aGUgZGV0ZWN0ZWQgZGV2aWNlIElEIik7CisKIC8qCiAgKiBTdXBlci1JL08gcmVnaXN0ZXJzIGFuZCBvcGVyYXRpb25zCiAgKi8KQEAgLTgyNiw3ICs4MzAsNyBAQAogCS8qIE5vIHN1cGVyaW9fZW50ZXIgKi8KIAogCS8qIElkZW50aWZ5IGRldmljZSAqLwotCXZhbCA9IHN1cGVyaW9faW5iKHNpb2FkZHIsIERFVklEKTsKKwl2YWwgPSBmb3JjZV9pZCA/IGZvcmNlX2lkIDogc3VwZXJpb19pbmIoc2lvYWRkciwgREVWSUQpOwogCXN3aXRjaCAodmFsKSB7CiAJY2FzZSAweEUxOiAvKiBQQzg3MzYwICovCiAJY2FzZSAweEU4OiAvKiBQQzg3MzYzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3BjODc0MjcuYyBiL2RyaXZlcnMvaHdtb24vcGM4NzQyNy5jCmluZGV4IGQ0MDUwOWEuLjcyNjVmMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vcGM4NzQyNy5jCisrKyBiL2RyaXZlcnMvaHdtb24vcGM4NzQyNy5jCkBAIC0zNCw2ICszNCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZm9yY2VfaWQ7Cittb2R1bGVfcGFyYW0oZm9yY2VfaWQsIHVzaG9ydCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2lkLCAiT3ZlcnJpZGUgdGhlIGRldGVjdGVkIGRldmljZSBJRCIpOworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAogI2RlZmluZSBEUlZOQU1FICJwYzg3NDI3IgpAQCAtNTU1LDcgKzU1OSw3IEBACiAJaW50IGksIGVyciA9IDA7CiAKIAkvKiBJZGVudGlmeSBkZXZpY2UgKi8KLQl2YWwgPSBzdXBlcmlvX2luYihzaW9hZGRyLCBTSU9SRUdfREVWSUQpOworCXZhbCA9IGZvcmNlX2lkID8gZm9yY2VfaWQgOiBzdXBlcmlvX2luYihzaW9hZGRyLCBTSU9SRUdfREVWSUQpOwogCWlmICh2YWwgIT0gMHhmMikgewkvKiBQQzg3NDI3ICovCiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZXhpdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vc21zYzQ3YjM5Ny5jIGIvZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMKaW5kZXggMGI1N2QyZS4uZjYxZDhmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMKKysrIGIvZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMKQEAgLTM4LDYgKzM4LDEwIEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAorc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvcmNlX2lkOworbW9kdWxlX3BhcmFtKGZvcmNlX2lkLCB1c2hvcnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9pZCwgIk92ZXJyaWRlIHRoZSBkZXRlY3RlZCBkZXZpY2UgSUQiKTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAKICNkZWZpbmUgRFJWTkFNRSAic21zYzQ3YjM5NyIKQEAgLTMzMyw3ICszMzcsNyBAQAogCXU4IGlkLCByZXY7CiAKIAlzdXBlcmlvX2VudGVyKCk7Ci0JaWQgPSBzdXBlcmlvX2luYihTVVBFUklPX1JFR19ERVZJRCk7CisJaWQgPSBmb3JjZV9pZCA/IGZvcmNlX2lkIDogc3VwZXJpb19pbmIoU1VQRVJJT19SRUdfREVWSUQpOwogCiAJaWYgKChpZCAhPSAweDZmKSAmJiAoaWQgIT0gMHg4MSkgJiYgKGlkICE9IDB4ODUpKSB7CiAJCXN1cGVyaW9fZXhpdCgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9zbXNjNDdtMS5jIGIvZHJpdmVycy9od21vbi9zbXNjNDdtMS5jCmluZGV4IGExMGEzODAuLjBkN2YwYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vc21zYzQ3bTEuYworKysgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xLmMKQEAgLTM5LDYgKzM5LDEwIEBACiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAorc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvcmNlX2lkOworbW9kdWxlX3BhcmFtKGZvcmNlX2lkLCB1c2hvcnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9pZCwgIk92ZXJyaWRlIHRoZSBkZXRlY3RlZCBkZXZpY2UgSUQiKTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAKICNkZWZpbmUgRFJWTkFNRSAic21zYzQ3bTEiCkBAIC0zOTksNyArNDAzLDcgQEAKIAl1OCB2YWw7CiAKIAlzdXBlcmlvX2VudGVyKCk7Ci0JdmFsID0gc3VwZXJpb19pbmIoU1VQRVJJT19SRUdfREVWSUQpOworCXZhbCA9IGZvcmNlX2lkID8gZm9yY2VfaWQgOiBzdXBlcmlvX2luYihTVVBFUklPX1JFR19ERVZJRCk7CiAKIAkvKgogCSAqIFNNU0MgTFBDNDdNMTB4L0xQQzQ3TTExMi9MUEM0N00xM3ggKGRldmljZSBpZCAweDU5KSwgTFBDNDdNMTR4CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xOTIuYyBiL2RyaXZlcnMvaHdtb24vc21zYzQ3bTE5Mi5jCmluZGV4IGI4NzU1MjYuLjhiMGMxODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vc21zYzQ3bTE5Mi5jCisrKyBiL2RyaXZlcnMvaHdtb24vc21zYzQ3bTE5Mi5jCkBAIC0zNDEsOCArMzQxLDcgQEAKIHN0YXRpYyBzc2l6ZV90IHNldF92cm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3Qgc21zYzQ3bTE5Ml9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IHNtc2M0N20xOTJfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWRhdGEtPnZybSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwogCXJldHVybiBjb3VudDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdnQxMjExLmMgYi9kcml2ZXJzL2h3bW9uL3Z0MTIxMS5jCmluZGV4IDdkZmNjOGQuLjEyYjQzNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdnQxMjExLmMKKysrIGIvZHJpdmVycy9od21vbi92dDEyMTEuYwpAQCAtNDIsNiArNDIsMTAgQEAKIG1vZHVsZV9wYXJhbShpbnRfbW9kZSwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoaW50X21vZGUsICJGb3JjZSB0aGUgdGVtcGVyYXR1cmUgaW50ZXJydXB0IG1vZGUiKTsKIAorc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvcmNlX2lkOworbW9kdWxlX3BhcmFtKGZvcmNlX2lkLCB1c2hvcnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9pZCwgIk92ZXJyaWRlIHRoZSBkZXRlY3RlZCBkZXZpY2UgSUQiKTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAKICNkZWZpbmUgRFJWTkFNRSAidnQxMjExIgpAQCAtMTI4MCwxMCArMTI4NCwxMiBAQAogc3RhdGljIGludCBfX2luaXQgdnQxMjExX2ZpbmQoaW50IHNpb19jaXAsIHVuc2lnbmVkIHNob3J0ICphZGRyZXNzKQogewogCWludCBlcnIgPSAtRU5PREVWOworCWludCBkZXZpZDsKIAogCXN1cGVyaW9fZW50ZXIoc2lvX2NpcCk7CiAKLQlpZiAoc3VwZXJpb19pbmIoc2lvX2NpcCwgU0lPX1ZUMTIxMV9ERVZJRCkgIT0gU0lPX1ZUMTIxMV9JRCkgeworCWRldmlkID0gZm9yY2VfaWQgPyBmb3JjZV9pZCA6IHN1cGVyaW9faW5iKHNpb19jaXAsIFNJT19WVDEyMTFfREVWSUQpOworCWlmIChkZXZpZCAhPSBTSU9fVlQxMjExX0lEKSB7CiAJCWdvdG8gRVhJVDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdnQ4MjMxLmMgYi9kcml2ZXJzL2h3bW9uL3Z0ODIzMS5jCmluZGV4IDIxOTZhODQuLmY4NzY2MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdnQ4MjMxLmMKKysrIGIvZHJpdmVycy9od21vbi92dDgyMzEuYwpAQCAtNTA0LDcgKzUwNCw3IEBACiAJY2FzZSA0OiBkYXRhLT5mYW5fZGl2W25yXSA9IDI7IGJyZWFrOwogCWNhc2UgODogZGF0YS0+ZmFuX2Rpdltucl0gPSAzOyBicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZXJyKGRldiwgImZhbl9kaXYgdmFsdWUgJWxkIG5vdCBzdXBwb3J0ZWQuIgorCQlkZXZfZXJyKGRldiwgImZhbl9kaXYgdmFsdWUgJWxkIG5vdCBzdXBwb3J0ZWQuICIKIAkJICAgICAgICAiQ2hvb3NlIG9uZSBvZiAxLCAyLCA0IG9yIDghXG4iLCB2YWwpOwogCQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4MzYyN2VoZi5jIGIvZHJpdmVycy9od21vbi93ODM2MjdlaGYuYwppbmRleCBkNWFhMjVjLi4wNzUxNjRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4MzYyN2VoZi5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNjI3ZWhmLmMKQEAgLTU5LDYgKzU5LDEwIEBACiAJInc4MzYyN2RoZyIsCiB9OwogCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZm9yY2VfaWQ7Cittb2R1bGVfcGFyYW0oZm9yY2VfaWQsIHVzaG9ydCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2lkLCAiT3ZlcnJpZGUgdGhlIGRldGVjdGVkIGRldmljZSBJRCIpOworCiAjZGVmaW5lIERSVk5BTUUgInc4MzYyN2VoZiIKIAogLyoKQEAgLTExOTgsOCArMTIwMiw3IEBACiAJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZzZGFfdGVtcFtpXS5kZXZfYXR0cik7CiAKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfbmFtZSk7Ci0JaWYgKGRhdGEtPnZpZCAhPSAweDNmKQotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfY3B1MF92aWQpOworCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9jcHUwX3ZpZCk7CiB9CiAKIC8qIEdldCB0aGUgbW9uaXRvcmluZyBmdW5jdGlvbnMgc3RhcnRlZCAqLwpAQCAtMTI5OSwxMSArMTMwMiwxNiBAQAogCQkJfQogCQl9CiAKLQkJZGF0YS0+dmlkID0gc3VwZXJpb19pbmIoc2lvX2RhdGEtPnNpb3JlZywgU0lPX1JFR19WSURfREFUQSkgJiAweDNmOworCQlkYXRhLT52aWQgPSBzdXBlcmlvX2luYihzaW9fZGF0YS0+c2lvcmVnLCBTSU9fUkVHX1ZJRF9EQVRBKTsKKwkJaWYgKHNpb19kYXRhLT5raW5kID09IHc4MzYyN2VoZikgLyogNiBWSUQgcGlucyBvbmx5ICovCisJCQlkYXRhLT52aWQgJj0gMHgzZjsKKworCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfY3B1MF92aWQpOworCQlpZiAoZXJyKQorCQkJZ290byBleGl0X3JlbGVhc2U7CiAJfSBlbHNlIHsKIAkJZGV2X2luZm8oZGV2LCAiVklEIHBpbnMgaW4gb3V0cHV0IG1vZGUsIENQVSBWSUQgbm90ICIKIAkJCSAiYXZhaWxhYmxlXG4iKTsKLQkJZGF0YS0+dmlkID0gMHgzZjsKIAl9CiAKIAkvKiBmYW40IGFuZCBmYW41IHNoYXJlIHNvbWUgcGlucyB3aXRoIHRoZSBHUElPIGFuZCBzZXJpYWwgZmxhc2ggKi8KQEAgLTEzODYsMTIgKzEzOTQsNiBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXhpdF9yZW1vdmU7CiAKLQlpZiAoZGF0YS0+dmlkICE9IDB4M2YpIHsKLQkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2NwdTBfdmlkKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXhpdF9yZW1vdmU7Ci0JfQotCiAJZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKGRldik7CiAJaWYgKElTX0VSUihkYXRhLT5od21vbl9kZXYpKSB7CiAJCWVyciA9IFBUUl9FUlIoZGF0YS0+aHdtb25fZGV2KTsKQEAgLTE0NDUsOCArMTQ0NywxMSBAQAogCiAJc3VwZXJpb19lbnRlcihzaW9hZGRyKTsKIAotCXZhbCA9IChzdXBlcmlvX2luYihzaW9hZGRyLCBTSU9fUkVHX0RFVklEKSA8PCA4KQotCSAgICB8IHN1cGVyaW9faW5iKHNpb2FkZHIsIFNJT19SRUdfREVWSUQgKyAxKTsKKwlpZiAoZm9yY2VfaWQpCisJCXZhbCA9IGZvcmNlX2lkOworCWVsc2UKKwkJdmFsID0gKHN1cGVyaW9faW5iKHNpb2FkZHIsIFNJT19SRUdfREVWSUQpIDw8IDgpCisJCSAgICB8IHN1cGVyaW9faW5iKHNpb2FkZHIsIFNJT19SRUdfREVWSUQgKyAxKTsKIAlzd2l0Y2ggKHZhbCAmIFNJT19JRF9NQVNLKSB7CiAJY2FzZSBTSU9fVzgzNjI3RUhGX0lEOgogCQlzaW9fZGF0YS0+a2luZCA9IHc4MzYyN2VoZjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdzgzNjI3aGYuYyBiL2RyaXZlcnMvaHdtb24vdzgzNjI3aGYuYwppbmRleCA4NzlkMGE2Li45NTY0ZmIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4MzYyN2hmLmMKKysrIGIvZHJpdmVycy9od21vbi93ODM2MjdoZi5jCkBAIC03NSw2ICs3NSwxMCBAQAogbW9kdWxlX3BhcmFtKGluaXQsIGJvb2wsIDApOwogTU9EVUxFX1BBUk1fREVTQyhpbml0LCAiU2V0IHRvIHplcm8gdG8gYnlwYXNzIGNoaXAgaW5pdGlhbGl6YXRpb24iKTsKIAorc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvcmNlX2lkOworbW9kdWxlX3BhcmFtKGZvcmNlX2lkLCB1c2hvcnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9pZCwgIk92ZXJyaWRlIHRoZSBkZXRlY3RlZCBkZXZpY2UgSUQiKTsKKwogLyogbW9kaWZpZWQgZnJvbSBrZXJuZWwvaW5jbHVkZS90cmFwcy5jICovCiBzdGF0aWMgaW50IFJFRzsJCS8qIFRoZSByZWdpc3RlciB0byByZWFkL3dyaXRlICovCiAjZGVmaW5lCURFVgkweDA3CS8qIFJlZ2lzdGVyOiBMb2dpY2FsIGRldmljZSBzZWxlY3QgKi8KQEAgLTMxOSwxMCArMzIzLDggQEAKIAkJcmV0dXJuICgweDgwIHwgKDE4MDAwMFVMIC8gKHZhbCA8PCA4KSkpOwogfQogCi0jZGVmaW5lIEJFRVBfTUFTS19GUk9NX1JFRyh2YWwpCQkgKHZhbCkKLSNkZWZpbmUgQkVFUF9NQVNLX1RPX1JFRyh2YWwpCQkoKHZhbCkgJiAweGZmZmZmZikKLSNkZWZpbmUgQkVFUF9FTkFCTEVfVE9fUkVHKHZhbCkJCSgodmFsKT8xOjApCi0jZGVmaW5lIEJFRVBfRU5BQkxFX0ZST01fUkVHKHZhbCkJKCh2YWwpPzE6MCkKKyNkZWZpbmUgQkVFUF9NQVNLX0ZST01fUkVHKHZhbCkJCSgodmFsKSAmIDB4ZmY3ZmZmKQorI2RlZmluZSBCRUVQX01BU0tfVE9fUkVHKHZhbCkJCSgodmFsKSAmIDB4ZmY3ZmZmKQogCiAjZGVmaW5lIERJVl9GUk9NX1JFRyh2YWwpICgxIDw8ICh2YWwpKQogCkBAIC0zNjMsNyArMzY1LDYgQEAKIAl1OCB2aWQ7CQkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIGNvbWJpbmVkICovCiAJdTMyIGFsYXJtczsJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLwogCXUzMiBiZWVwX21hc2s7CQkvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KLQl1OCBiZWVwX2VuYWJsZTsJCS8qIEJvb2xlYW4gKi8KIAl1OCBwd21bM107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLwogCXU4IHB3bV9mcmVxWzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KIAl1MTYgc2Vuc1szXTsJCS8qIDEgPSBwZW50aXVtIGRpb2RlOyAyID0gMzkwNCBkaW9kZTsKQEAgLTcxMyw2NSArNzE0LDE1MSBAQAogfQogc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgc2hvd19hbGFybXNfcmVnLCBOVUxMKTsKIAotI2RlZmluZSBzaG93X2JlZXBfcmVnKFJFRywgcmVnKSBcCi1zdGF0aWMgc3NpemVfdCBzaG93X2JlZXBfIyNyZWcgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgXAoteyBcCi0Jc3RydWN0IHc4MzYyN2hmX2RhdGEgKmRhdGEgPSB3ODM2MjdoZl91cGRhdGVfZGV2aWNlKGRldik7IFwKLQlyZXR1cm4gc3ByaW50ZihidWYsIiVsZFxuIiwgXAotCQkgICAgICAobG9uZylCRUVQXyMjUkVHIyNfRlJPTV9SRUcoZGF0YS0+YmVlcF8jI3JlZykpOyBcCitzdGF0aWMgc3NpemVfdAorc2hvd19hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHc4MzYyN2hmX2RhdGEgKmRhdGEgPSB3ODM2MjdoZl91cGRhdGVfZGV2aWNlKGRldik7CisJaW50IGJpdG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgKGRhdGEtPmFsYXJtcyA+PiBiaXRucikgJiAxKTsKIH0KLXNob3dfYmVlcF9yZWcoRU5BQkxFLCBlbmFibGUpCi1zaG93X2JlZXBfcmVnKE1BU0ssIG1hc2spCi0KLSNkZWZpbmUgQkVFUF9FTkFCTEUJCQkwCS8qIFN0b3JlIGJlZXBfZW5hYmxlICovCi0jZGVmaW5lIEJFRVBfTUFTSwkJCTEJLyogU3RvcmUgYmVlcF9tYXNrICovCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluM19hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluNF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgOCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluNV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgOSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluNl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjdfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDE2KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW44X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAxNyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjFfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDYpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4yX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA3KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuM19hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgNCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA1KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDEzKTsKIAogc3RhdGljIHNzaXplX3QKLXN0b3JlX2JlZXBfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCi0JICAgICAgIGludCB1cGRhdGVfbWFzaykKK3Nob3dfYmVlcF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IHc4MzYyN2hmX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsCisJCSAgICAgIChsb25nKUJFRVBfTUFTS19GUk9NX1JFRyhkYXRhLT5iZWVwX21hc2spKTsKK30KKworc3RhdGljIHNzaXplX3QKK3N0b3JlX2JlZXBfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXUzMiB2YWwsIHZhbDI7CisJdW5zaWduZWQgbG9uZyB2YWw7CiAKIAl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAotCWlmICh1cGRhdGVfbWFzayA9PSBCRUVQX01BU0spIHsJLyogV2UgYXJlIHN0b3JpbmcgYmVlcF9tYXNrICovCi0JCWRhdGEtPmJlZXBfbWFzayA9IEJFRVBfTUFTS19UT19SRUcodmFsKTsKLQkJdzgzNjI3aGZfd3JpdGVfdmFsdWUoZGF0YSwgVzgzNzgxRF9SRUdfQkVFUF9JTlRTMSwKLQkJCQkgICAgZGF0YS0+YmVlcF9tYXNrICYgMHhmZik7Ci0JCXc4MzYyN2hmX3dyaXRlX3ZhbHVlKGRhdGEsIFc4Mzc4MURfUkVHX0JFRVBfSU5UUzMsCi0JCQkJICAgICgoZGF0YS0+YmVlcF9tYXNrKSA+PiAxNikgJiAweGZmKTsKLQkJdmFsMiA9IChkYXRhLT5iZWVwX21hc2sgPj4gOCkgJiAweDdmOwotCX0gZWxzZSB7CQkvKiBXZSBhcmUgc3RvcmluZyBiZWVwX2VuYWJsZSAqLwotCQl2YWwyID0KLQkJICAgIHc4MzYyN2hmX3JlYWRfdmFsdWUoZGF0YSwgVzgzNzgxRF9SRUdfQkVFUF9JTlRTMikgJiAweDdmOwotCQlkYXRhLT5iZWVwX2VuYWJsZSA9IEJFRVBfRU5BQkxFX1RPX1JFRyh2YWwpOwotCX0KLQorCS8qIHByZXNlcnZlIGJlZXAgZW5hYmxlICovCisJZGF0YS0+YmVlcF9tYXNrID0gKGRhdGEtPmJlZXBfbWFzayAmIDB4ODAwMCkKKwkJCXwgQkVFUF9NQVNLX1RPX1JFRyh2YWwpOworCXc4MzYyN2hmX3dyaXRlX3ZhbHVlKGRhdGEsIFc4Mzc4MURfUkVHX0JFRVBfSU5UUzEsCisJCQkgICAgZGF0YS0+YmVlcF9tYXNrICYgMHhmZik7CisJdzgzNjI3aGZfd3JpdGVfdmFsdWUoZGF0YSwgVzgzNzgxRF9SRUdfQkVFUF9JTlRTMywKKwkJCSAgICAoKGRhdGEtPmJlZXBfbWFzaykgPj4gMTYpICYgMHhmZik7CiAJdzgzNjI3aGZfd3JpdGVfdmFsdWUoZGF0YSwgVzgzNzgxRF9SRUdfQkVFUF9JTlRTMiwKLQkJCSAgICB2YWwyIHwgZGF0YS0+YmVlcF9lbmFibGUgPDwgNyk7CisJCQkgICAgKGRhdGEtPmJlZXBfbWFzayA+PiA4KSAmIDB4ZmYpOwogCiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJcmV0dXJuIGNvdW50OwogfQogCi0jZGVmaW5lIHN5c2ZzX2JlZXAoUkVHLCByZWcpIFwKLXN0YXRpYyBzc2l6ZV90IHNob3dfcmVnc19iZWVwXyMjcmVnIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIFwKLXsgXAotCXJldHVybiBzaG93X2JlZXBfIyNyZWcoZGV2LCBhdHRyLCBidWYpOyBcCi19IFwKLXN0YXRpYyBzc2l6ZV90IFwKLXN0b3JlX3JlZ3NfYmVlcF8jI3JlZyAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIFwKLXsgXAotCXJldHVybiBzdG9yZV9iZWVwX3JlZyhkZXYsIGJ1ZiwgY291bnQsIEJFRVBfIyNSRUcpOyBcCi19IFwKLXN0YXRpYyBERVZJQ0VfQVRUUihiZWVwXyMjcmVnLCBTX0lSVUdPIHwgU19JV1VTUiwgXAotCQkgIHNob3dfcmVnc19iZWVwXyMjcmVnLCBzdG9yZV9yZWdzX2JlZXBfIyNyZWcpOworc3RhdGljIERFVklDRV9BVFRSKGJlZXBfbWFzaywgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIHNob3dfYmVlcF9tYXNrLCBzdG9yZV9iZWVwX21hc2spOwogCi1zeXNmc19iZWVwKEVOQUJMRSwgZW5hYmxlKTsKLXN5c2ZzX2JlZXAoTUFTSywgbWFzayk7CitzdGF0aWMgc3NpemVfdAorc2hvd19iZWVwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IHc4MzYyN2hmX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQgYml0bnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCAoZGF0YS0+YmVlcF9tYXNrID4+IGJpdG5yKSAmIDEpOworfQorCitzdGF0aWMgc3NpemVfdAorc3RvcmVfYmVlcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgdzgzNjI3aGZfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBiaXRuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJdW5zaWduZWQgbG9uZyBiaXQ7CisJdTggcmVnOworCisJYml0ID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJaWYgKGJpdCAmIH4xKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlpZiAoYml0KQorCQlkYXRhLT5iZWVwX21hc2sgfD0gKDEgPDwgYml0bnIpOworCWVsc2UKKwkJZGF0YS0+YmVlcF9tYXNrICY9IH4oMSA8PCBiaXRucik7CisKKwlpZiAoYml0bnIgPCA4KSB7CisJCXJlZyA9IHc4MzYyN2hmX3JlYWRfdmFsdWUoZGF0YSwgVzgzNzgxRF9SRUdfQkVFUF9JTlRTMSk7CisJCWlmIChiaXQpCisJCQlyZWcgfD0gKDEgPDwgYml0bnIpOworCQllbHNlCisJCQlyZWcgJj0gfigxIDw8IGJpdG5yKTsKKwkJdzgzNjI3aGZfd3JpdGVfdmFsdWUoZGF0YSwgVzgzNzgxRF9SRUdfQkVFUF9JTlRTMSwgcmVnKTsKKwl9IGVsc2UgaWYgKGJpdG5yIDwgMTYpIHsKKwkJcmVnID0gdzgzNjI3aGZfcmVhZF92YWx1ZShkYXRhLCBXODM3ODFEX1JFR19CRUVQX0lOVFMyKTsKKwkJaWYgKGJpdCkKKwkJCXJlZyB8PSAoMSA8PCAoYml0bnIgLSA4KSk7CisJCWVsc2UKKwkJCXJlZyAmPSB+KDEgPDwgKGJpdG5yIC0gOCkpOworCQl3ODM2MjdoZl93cml0ZV92YWx1ZShkYXRhLCBXODM3ODFEX1JFR19CRUVQX0lOVFMyLCByZWcpOworCX0gZWxzZSB7CisJCXJlZyA9IHc4MzYyN2hmX3JlYWRfdmFsdWUoZGF0YSwgVzgzNzgxRF9SRUdfQkVFUF9JTlRTMyk7CisJCWlmIChiaXQpCisJCQlyZWcgfD0gKDEgPDwgKGJpdG5yIC0gMTYpKTsKKwkJZWxzZQorCQkJcmVnICY9IH4oMSA8PCAoYml0bnIgLSAxNikpOworCQl3ODM2MjdoZl93cml0ZV92YWx1ZShkYXRhLCBXODM3ODFEX1JFR19CRUVQX0lOVFMzLCByZWcpOworCX0KKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjBfYmVlcCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQlzaG93X2JlZXAsIHN0b3JlX2JlZXAsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjFfYmVlcCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQlzaG93X2JlZXAsIHN0b3JlX2JlZXAsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfYmVlcCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQlzaG93X2JlZXAsIHN0b3JlX2JlZXAsIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjNfYmVlcCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQlzaG93X2JlZXAsIHN0b3JlX2JlZXAsIDMpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjRfYmVlcCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQlzaG93X2JlZXAsIHN0b3JlX2JlZXAsIDgpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjVfYmVlcCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQlzaG93X2JlZXAsIHN0b3JlX2JlZXAsIDkpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjZfYmVlcCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQlzaG93X2JlZXAsIHN0b3JlX2JlZXAsIDEwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW43X2JlZXAsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkJc2hvd19iZWVwLCBzdG9yZV9iZWVwLCAxNik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluOF9iZWVwLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCXNob3dfYmVlcCwgc3RvcmVfYmVlcCwgMTcpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xX2JlZXAsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkJc2hvd19iZWVwLCBzdG9yZV9iZWVwLCA2KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMl9iZWVwLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCXNob3dfYmVlcCwgc3RvcmVfYmVlcCwgNyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjNfYmVlcCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQlzaG93X2JlZXAsIHN0b3JlX2JlZXAsIDExKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfYmVlcCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQlzaG93X2JlZXAsIHN0b3JlX2JlZXAsIDQpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9iZWVwLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCXNob3dfYmVlcCwgc3RvcmVfYmVlcCwgNSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2JlZXAsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkJc2hvd19iZWVwLCBzdG9yZV9iZWVwLCAxMyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGJlZXBfZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCXNob3dfYmVlcCwgc3RvcmVfYmVlcCwgMTUpOwogCiBzdGF0aWMgc3NpemVfdAogc2hvd19mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKQEAgLTEwMTQsNyArMTEwMSw3IEBACiAJVkFMID0gc2lvYWRkciArIDE7CiAKIAlzdXBlcmlvX2VudGVyKCk7Ci0JdmFsPSBzdXBlcmlvX2luYihERVZJRCk7CisJdmFsID0gZm9yY2VfaWQgPyBmb3JjZV9pZCA6IHN1cGVyaW9faW5iKERFVklEKTsKIAlzd2l0Y2ggKHZhbCkgewogCWNhc2UgVzYyN19ERVZJRDoKIAkJc2lvX2RhdGEtPnR5cGUgPSB3ODM2MjdoZjsKQEAgLTEwNzMsMjMgKzExNjAsMzEgQEAKICNkZWZpbmUgVklOX1VOSVRfQVRUUlMoX1hfKQlcCiAJJnNlbnNvcl9kZXZfYXR0cl9pbiMjX1hfIyNfaW5wdXQuZGV2X2F0dHIuYXR0ciwJCVwKIAkmc2Vuc29yX2Rldl9hdHRyX2luIyNfWF8jI19taW4uZGV2X2F0dHIuYXR0ciwJCVwKLQkmc2Vuc29yX2Rldl9hdHRyX2luIyNfWF8jI19tYXguZGV2X2F0dHIuYXR0cgorCSZzZW5zb3JfZGV2X2F0dHJfaW4jI19YXyMjX21heC5kZXZfYXR0ci5hdHRyLAkJXAorCSZzZW5zb3JfZGV2X2F0dHJfaW4jI19YXyMjX2FsYXJtLmRldl9hdHRyLmF0dHIsCQlcCisJJnNlbnNvcl9kZXZfYXR0cl9pbiMjX1hfIyNfYmVlcC5kZXZfYXR0ci5hdHRyCiAKICNkZWZpbmUgRkFOX1VOSVRfQVRUUlMoX1hfKQlcCiAJJnNlbnNvcl9kZXZfYXR0cl9mYW4jI19YXyMjX2lucHV0LmRldl9hdHRyLmF0dHIsCVwKIAkmc2Vuc29yX2Rldl9hdHRyX2ZhbiMjX1hfIyNfbWluLmRldl9hdHRyLmF0dHIsCQlcCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4jI19YXyMjX2Rpdi5kZXZfYXR0ci5hdHRyCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4jI19YXyMjX2Rpdi5kZXZfYXR0ci5hdHRyLAkJXAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuIyNfWF8jI19hbGFybS5kZXZfYXR0ci5hdHRyLAlcCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4jI19YXyMjX2JlZXAuZGV2X2F0dHIuYXR0cgogCiAjZGVmaW5lIFRFTVBfVU5JVF9BVFRSUyhfWF8pCVwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAjI19YXyMjX2lucHV0LmRldl9hdHRyLmF0dHIsCVwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAjI19YXyMjX21heC5kZXZfYXR0ci5hdHRyLAkJXAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcCMjX1hfIyNfbWF4X2h5c3QuZGV2X2F0dHIuYXR0ciwJXAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcCMjX1hfIyNfdHlwZS5kZXZfYXR0ci5hdHRyCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wIyNfWF8jI190eXBlLmRldl9hdHRyLmF0dHIsCVwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAjI19YXyMjX2FsYXJtLmRldl9hdHRyLmF0dHIsCVwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAjI19YXyMjX2JlZXAuZGV2X2F0dHIuYXR0cgogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdzgzNjI3aGZfYXR0cmlidXRlc1tdID0gewogCSZkZXZfYXR0cl9pbjBfaW5wdXQuYXR0ciwKIAkmZGV2X2F0dHJfaW4wX21pbi5hdHRyLAogCSZkZXZfYXR0cl9pbjBfbWF4LmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjBfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMF9iZWVwLmRldl9hdHRyLmF0dHIsCiAJVklOX1VOSVRfQVRUUlMoMiksCiAJVklOX1VOSVRfQVRUUlMoMyksCiAJVklOX1VOSVRfQVRUUlMoNCksCkBAIC0xMTAzLDcgKzExOTgsNyBAQAogCVRFTVBfVU5JVF9BVFRSUygyKSwKIAogCSZkZXZfYXR0cl9hbGFybXMuYXR0ciwKLQkmZGV2X2F0dHJfYmVlcF9lbmFibGUuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2JlZXBfZW5hYmxlLmRldl9hdHRyLmF0dHIsCiAJJmRldl9hdHRyX2JlZXBfbWFzay5hdHRyLAogCiAJJnNlbnNvcl9kZXZfYXR0cl9wd20xLmRldl9hdHRyLmF0dHIsCkBAIC0xMTkzLDEyICsxMjg4LDIwIEBACiAJCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKIAkJCQkmc2Vuc29yX2Rldl9hdHRyX2luNV9tYXguZGV2X2F0dHIpKQogCQkgfHwgKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCisJCQkJJnNlbnNvcl9kZXZfYXR0cl9pbjVfYWxhcm0uZGV2X2F0dHIpKQorCQkgfHwgKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCisJCQkJJnNlbnNvcl9kZXZfYXR0cl9pbjVfYmVlcC5kZXZfYXR0cikpCisJCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKIAkJCQkmc2Vuc29yX2Rldl9hdHRyX2luNl9pbnB1dC5kZXZfYXR0cikpCiAJCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKIAkJCQkmc2Vuc29yX2Rldl9hdHRyX2luNl9taW4uZGV2X2F0dHIpKQogCQkgfHwgKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCiAJCQkJJnNlbnNvcl9kZXZfYXR0cl9pbjZfbWF4LmRldl9hdHRyKSkKIAkJIHx8IChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LAorCQkJCSZzZW5zb3JfZGV2X2F0dHJfaW42X2FsYXJtLmRldl9hdHRyKSkKKwkJIHx8IChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LAorCQkJCSZzZW5zb3JfZGV2X2F0dHJfaW42X2JlZXAuZGV2X2F0dHIpKQorCQkgfHwgKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCiAJCQkJJnNlbnNvcl9kZXZfYXR0cl9wd20xX2ZyZXEuZGV2X2F0dHIpKQogCQkgfHwgKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCiAJCQkJJnNlbnNvcl9kZXZfYXR0cl9wd20yX2ZyZXEuZGV2X2F0dHIpKSkKQEAgLTEyMTIsMTggKzEzMTUsMzAgQEAKIAkJIHx8IChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LAogCQkJCSZzZW5zb3JfZGV2X2F0dHJfaW4xX21heC5kZXZfYXR0cikpCiAJCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKKwkJCQkmc2Vuc29yX2Rldl9hdHRyX2luMV9hbGFybS5kZXZfYXR0cikpCisJCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKKwkJCQkmc2Vuc29yX2Rldl9hdHRyX2luMV9iZWVwLmRldl9hdHRyKSkKKwkJIHx8IChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LAogCQkJCSZzZW5zb3JfZGV2X2F0dHJfZmFuM19pbnB1dC5kZXZfYXR0cikpCiAJCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKIAkJCQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjNfbWluLmRldl9hdHRyKSkKIAkJIHx8IChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LAogCQkJCSZzZW5zb3JfZGV2X2F0dHJfZmFuM19kaXYuZGV2X2F0dHIpKQogCQkgfHwgKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCisJCQkJJnNlbnNvcl9kZXZfYXR0cl9mYW4zX2FsYXJtLmRldl9hdHRyKSkKKwkJIHx8IChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LAorCQkJCSZzZW5zb3JfZGV2X2F0dHJfZmFuM19iZWVwLmRldl9hdHRyKSkKKwkJIHx8IChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LAogCQkJCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfaW5wdXQuZGV2X2F0dHIpKQogCQkgfHwgKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCiAJCQkJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19tYXguZGV2X2F0dHIpKQogCQkgfHwgKGVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsCiAJCQkJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19tYXhfaHlzdC5kZXZfYXR0cikpCiAJCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKKwkJCQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2FsYXJtLmRldl9hdHRyKSkKKwkJIHx8IChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LAorCQkJCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfYmVlcC5kZXZfYXR0cikpCisJCSB8fCAoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKIAkJCQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX3R5cGUuZGV2X2F0dHIpKSkKIAkJCWdvdG8gRVJST1I0OwogCkBAIC0xNTExLDYgKzE2MjYsMTEgQEAKIAkJCSAgICAodzgzNjI3aGZfcmVhZF92YWx1ZShkYXRhLAogCQkJCQkJVzgzNzgxRF9SRUdfQ09ORklHKSAmIDB4ZjcpCiAJCQkgICAgfCAweDAxKTsKKworCS8qIEVuYWJsZSBWQkFUIG1vbml0b3JpbmcgaWYgbmVlZGVkICovCisJdG1wID0gdzgzNjI3aGZfcmVhZF92YWx1ZShkYXRhLCBXODM3ODFEX1JFR19WQkFUKTsKKwlpZiAoISh0bXAgJiAweDAxKSkKKwkJdzgzNjI3aGZfd3JpdGVfdmFsdWUoZGF0YSwgVzgzNzgxRF9SRUdfVkJBVCwgdG1wIHwgMHgwMSk7CiB9CiAKIHN0YXRpYyB2b2lkIHc4MzYyN2hmX3VwZGF0ZV9mYW5fZGl2KHN0cnVjdCB3ODM2MjdoZl9kYXRhICpkYXRhKQpAQCAtMTYwMyw4ICsxNzIzLDcgQEAKIAkJICAgICh3ODM2MjdoZl9yZWFkX3ZhbHVlKGRhdGEsIFc4Mzc4MURfUkVHX0FMQVJNMikgPDwgOCkgfAogCQkgICAgKHc4MzYyN2hmX3JlYWRfdmFsdWUoZGF0YSwgVzgzNzgxRF9SRUdfQUxBUk0zKSA8PCAxNik7CiAJCWkgPSB3ODM2MjdoZl9yZWFkX3ZhbHVlKGRhdGEsIFc4Mzc4MURfUkVHX0JFRVBfSU5UUzIpOwotCQlkYXRhLT5iZWVwX2VuYWJsZSA9IGkgPj4gNzsKLQkJZGF0YS0+YmVlcF9tYXNrID0gKChpICYgMHg3ZikgPDwgOCkgfAorCQlkYXRhLT5iZWVwX21hc2sgPSAoaSA8PCA4KSB8CiAJCSAgICB3ODM2MjdoZl9yZWFkX3ZhbHVlKGRhdGEsIFc4Mzc4MURfUkVHX0JFRVBfSU5UUzEpIHwKIAkJICAgIHc4MzYyN2hmX3JlYWRfdmFsdWUoZGF0YSwgVzgzNzgxRF9SRUdfQkVFUF9JTlRTMykgPDwgMTY7CiAJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4Mzc4MWQuYyBiL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCmluZGV4IGUwZmE3NTIuLjc0MjFmNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCkBAIC0yOCw3ICsyOCw2IEBACiAgICAgYXM5OTEyN2YJNwkzCTAJMwkweDMxCTB4MTJjMwl5ZXMJbm8KICAgICBhczk5MTI3ZiByZXYuMiAodHlwZV9uYW1lID0gYXM5OTEyN2YpCTB4MzEJMHg1Y2EzCXllcwlubwogICAgIHc4Mzc4MWQJNwkzCTAJMwkweDEwLTEJMHg1Y2EzCXllcwl5ZXMKLSAgICB3ODM2MjdoZgk5CTMJMgkzCTB4MjEJMHg1Y2EzCXllcwl5ZXMoTFBDKQogICAgIHc4Mzc4MmQJOQkzCTItNAkzCTB4MzAJMHg1Y2EzCXllcwl5ZXMKICAgICB3ODM3ODNzCTUtNgkzCTIJMS0yCTB4NDAJMHg1Y2EzCXllcwlubwogCkBAIC01NCwxMyArNTMsMTIgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCiAvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwKLQkJCQkJMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwKLQkJCQkJMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsCisJCQkJICAgICAgIDB4MmUsIDB4MmYsIEkyQ19DTElFTlRfRU5EIH07CiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgaXNhX2FkZHJlc3MgPSAweDI5MDsKIAogLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KLUkyQ19DTElFTlRfSU5TTU9EXzUodzgzNzgxZCwgdzgzNzgyZCwgdzgzNzgzcywgdzgzNjI3aGYsIGFzOTkxMjdmKTsKK0kyQ19DTElFTlRfSU5TTU9EXzQodzgzNzgxZCwgdzgzNzgyZCwgdzgzNzgzcywgYXM5OTEyN2YpOwogSTJDX0NMSUVOVF9NT0RVTEVfUEFSTShmb3JjZV9zdWJjbGllbnRzLCAiTGlzdCBvZiBzdWJjbGllbnQgYWRkcmVzc2VzOiAiCiAJCSAgICAie2J1cywgY2xpZW50YWRkciwgc3ViY2xpZW50YWRkcjEsIHN1YmNsaWVudGFkZHIyfSIpOwogCkBAIC0xMTQsNyArMTEyLDcgQEAKICNkZWZpbmUgVzgzNzgxRF9SRUdfQUxBUk0xCQkweDQxCiAjZGVmaW5lIFc4Mzc4MURfUkVHX0FMQVJNMgkJMHg0MgogCi0vKiBSZWFsLXRpbWUgc3RhdHVzIChXODM3ODJELCBXODM3ODNTLCBXODM2MjdIRikgKi8KKy8qIFJlYWwtdGltZSBzdGF0dXMgKFc4Mzc4MkQsIFc4Mzc4M1MpICovCiAjZGVmaW5lIFc4Mzc4MkRfUkVHX0FMQVJNMQkJMHg0NTkKICNkZWZpbmUgVzgzNzgyRF9SRUdfQUxBUk0yCQkweDQ1QQogI2RlZmluZSBXODM3ODJEX1JFR19BTEFSTTMJCTB4NDVCCkBAIC0xNTMsMTAgKzE1MSw2IEBACiAKICNkZWZpbmUgVzgzNzgxRF9ERUZBVUxUX0JFVEEJCTM0MzUKIAotLyogUlQgVGFibGUgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFc4Mzc4MURfUkVHX1JUX0lEWAkJMHg1MAotI2RlZmluZSBXODM3ODFEX1JFR19SVF9WQUwJCTB4NTEKLQogLyogQ29udmVyc2lvbnMgKi8KICNkZWZpbmUgSU5fVE9fUkVHKHZhbCkJCQlTRU5TT1JTX0xJTUlUKCgodmFsKSArIDgpIC8gMTYsIDAsIDI1NSkKICNkZWZpbmUgSU5fRlJPTV9SRUcodmFsKQkJKCh2YWwpICogMTYpCkBAIC0yNzEsNyArMjY1LDYgQEAKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJ3ODM3ODFkIiwKIAl9LAotCS5pZCA9IEkyQ19EUklWRVJJRF9XODM3ODFELAogCS5hdHRhY2hfYWRhcHRlciA9IHc4Mzc4MWRfYXR0YWNoX2FkYXB0ZXIsCiAJLmRldGFjaF9jbGllbnQgPSB3ODM3ODFkX2RldGFjaF9jbGllbnQsCiB9OwpAQCAtNjk2LDcgKzY4OSw3IEBACiAJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQkKKwogCS8qIFNhdmUgZmFuX21pbiAqLwogCW1pbiA9IEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5fbWluW25yXSwKIAkJCSAgIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOwpAQCAtOTYzLDggKzk1Niw2IEBACiAJCWNsaWVudF9uYW1lID0gInc4Mzc4MmQgc3ViY2xpZW50IjsKIAllbHNlIGlmIChraW5kID09IHc4Mzc4M3MpCiAJCWNsaWVudF9uYW1lID0gInc4Mzc4M3Mgc3ViY2xpZW50IjsKLQllbHNlIGlmIChraW5kID09IHc4MzYyN2hmKQotCQljbGllbnRfbmFtZSA9ICJ3ODM2MjdoZiBzdWJjbGllbnQiOwogCWVsc2UgaWYgKGtpbmQgPT0gYXM5OTEyN2YpCiAJCWNsaWVudF9uYW1lID0gImFzOTkxMjdmIHN1YmNsaWVudCI7CiAKQEAgLTEwMDQsNyArOTk1LDcgQEAKICNkZWZpbmUgSU5fVU5JVF9BVFRSUyhYKQkJCQkJXAogCSZzZW5zb3JfZGV2X2F0dHJfaW4jI1gjI19pbnB1dC5kZXZfYXR0ci5hdHRyLAkJXAogCSZzZW5zb3JfZGV2X2F0dHJfaW4jI1gjI19taW4uZGV2X2F0dHIuYXR0ciwJCVwKLQkmc2Vuc29yX2Rldl9hdHRyX2luIyNYIyNfbWF4LmRldl9hdHRyLmF0dHIsIAkJXAorCSZzZW5zb3JfZGV2X2F0dHJfaW4jI1gjI19tYXguZGV2X2F0dHIuYXR0ciwJCVwKIAkmc2Vuc29yX2Rldl9hdHRyX2luIyNYIyNfYWxhcm0uZGV2X2F0dHIuYXR0ciwJCVwKIAkmc2Vuc29yX2Rldl9hdHRyX2luIyNYIyNfYmVlcC5kZXZfYXR0ci5hdHRyCiAKQEAgLTEyNjgsOSArMTI1OSw3IEBACiAJCQlraW5kID0gdzgzNzgyZDsKIAkJZWxzZSBpZiAodmFsMSA9PSAweDQwICYmIHZlbmRpZCA9PSB3aW5ib25kICYmIGFkZHJlc3MgPT0gMHgyZCkKIAkJCWtpbmQgPSB3ODM3ODNzOwotCQllbHNlIGlmICh2YWwxID09IDB4MjEgJiYgdmVuZGlkID09IHdpbmJvbmQpCi0JCQlraW5kID0gdzgzNjI3aGY7Ci0JCWVsc2UgaWYgKHZhbDEgPT0gMHgzMSAmJiBhZGRyZXNzID49IDB4MjgpCisJCWVsc2UgaWYgKHZhbDEgPT0gMHgzMSkKIAkJCWtpbmQgPSBhczk5MTI3ZjsKIAkJZWxzZSB7CiAJCQlpZiAoa2luZCA9PSAwKQpAQCAtMTI4OCw4ICsxMjc3LDYgQEAKIAkJY2xpZW50X25hbWUgPSAidzgzNzgyZCI7CiAJfSBlbHNlIGlmIChraW5kID09IHc4Mzc4M3MpIHsKIAkJY2xpZW50X25hbWUgPSAidzgzNzgzcyI7Ci0JfSBlbHNlIGlmIChraW5kID09IHc4MzYyN2hmKSB7Ci0JCWNsaWVudF9uYW1lID0gInc4MzYyN2hmIjsKIAl9IGVsc2UgaWYgKGtpbmQgPT0gYXM5OTEyN2YpIHsKIAkJY2xpZW50X25hbWUgPSAiYXM5OTEyN2YiOwogCX0KQEAgLTEzOTYsMTAgKzEzODMsNiBAQAogCiAJcmVnID0gdzgzNzgxZF9yZWFkX3ZhbHVlKGRhdGEsIFc4Mzc4MURfUkVHX1dDSElQSUQpOwogCXN3aXRjaCAocmVnKSB7Ci0JY2FzZSAweDIxOgotCQlkYXRhLT50eXBlID0gdzgzNjI3aGY7Ci0JCW5hbWUgPSAidzgzNjI3aGYiOwotCQlicmVhazsKIAljYXNlIDB4MzA6CiAJCWRhdGEtPnR5cGUgPSB3ODM3ODJkOwogCQluYW1lID0gInc4Mzc4MmQiOwpAQCAtMTQ1Myw5ICsxNDM2LDkgQEAKIH0KIAogLyogVGhlIFNNQnVzIGxvY2tzIGl0c2VsZiwgdXN1YWxseSwgYnV0IG5vdGhpbmcgbWF5IGFjY2VzcyB0aGUgV2luYm9uZCBiZXR3ZWVuCi0gICBiYW5rIHN3aXRjaGVzLiBJU0EgYWNjZXNzIG11c3QgYWx3YXlzIGJlIGxvY2tlZCBleHBsaWNpdGx5ISAKKyAgIGJhbmsgc3dpdGNoZXMuIElTQSBhY2Nlc3MgbXVzdCBhbHdheXMgYmUgbG9ja2VkIGV4cGxpY2l0bHkhCiAgICBXZSBpZ25vcmUgdGhlIFc4Mzc4MUQgQlVTWSBmbGFnIGF0IHRoaXMgbW9tZW50IC0gaXQgY291bGQgbGVhZCB0byBkZWFkbG9ja3MsCi0gICB3b3VsZCBzbG93IGRvd24gdGhlIFc4Mzc4MUQgYWNjZXNzIGFuZCBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeS4gCisgICB3b3VsZCBzbG93IGRvd24gdGhlIFc4Mzc4MUQgYWNjZXNzIGFuZCBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeS4KICAgIFRoZXJlIGFyZSBzb21lIHVnbHkgdHlwZWNhc3RzIGhlcmUsIGJ1dCB0aGUgZ29vZCBuZXdzIGlzIC0gdGhleSBzaG91bGQKICAgIG5vd2hlcmUgZWxzZSBiZSBuZWNlc3NhcnkhICovCiBzdGF0aWMgaW50CkBAIC0xNTk5LDExICsxNTgyLDYgQEAKIAlpbnQgdHlwZSA9IGRhdGEtPnR5cGU7CiAJdTggdG1wOwogCi0JaWYgKHR5cGUgPT0gdzgzNjI3aGYpCi0JCWRldl9pbmZvKGRldiwgIlRoZSBXODM2MjdIRiBjaGlwIGlzIGJldHRlciBzdXBwb3J0ZWQgYnkgdGhlICIKLQkJCSAidzgzNjI3aGYgZHJpdmVyLCBzdXBwb3J0IHdpbGwgYmUgZHJvcHBlZCBmcm9tIHRoZSAiCi0JCQkgInc4Mzc4MWQgZHJpdmVyIHNvb25cbiIpOwotCiAJaWYgKHJlc2V0ICYmIHR5cGUgIT0gYXM5OTEyN2YpIHsgLyogdGhpcyByZXNldHMgcmVnaXN0ZXJzIHdlIGRvbid0IGhhdmUKIAkJCQkJICAgZG9jdW1lbnRhdGlvbiBmb3Igb24gdGhlIGFzOTkxMjdmICovCiAJCS8qIFJlc2V0dGluZyB0aGUgY2hpcCBoYXMgYmVlbiB0aGUgZGVmYXVsdCBmb3IgYSBsb25nIHRpbWUsCkBAIC0xNzE3LDggKzE2OTUsNyBAQAogCQkJICAgIHc4Mzc4MWRfcmVhZF92YWx1ZShkYXRhLCBXODM3ODFEX1JFR19JTl9NSU4oaSkpOwogCQkJZGF0YS0+aW5fbWF4W2ldID0KIAkJCSAgICB3ODM3ODFkX3JlYWRfdmFsdWUoZGF0YSwgVzgzNzgxRF9SRUdfSU5fTUFYKGkpKTsKLQkJCWlmICgoZGF0YS0+dHlwZSAhPSB3ODM3ODJkKQotCQkJICAgICYmIChkYXRhLT50eXBlICE9IHc4MzYyN2hmKSAmJiAoaSA9PSA2KSkKKwkJCWlmICgoZGF0YS0+dHlwZSAhPSB3ODM3ODJkKSAmJiAoaSA9PSA2KSkKIAkJCQlicmVhazsKIAkJfQogCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CkBAIC0xNzc2LDcgKzE3NTMsNyBAQAogCQkJZGF0YS0+ZmFuX2RpdlsxXSB8PSAoaSA+PiA0KSAmIDB4MDQ7CiAJCQlkYXRhLT5mYW5fZGl2WzJdIHw9IChpID4+IDUpICYgMHgwNDsKIAkJfQotCQlpZiAoKGRhdGEtPnR5cGUgPT0gdzgzNzgyZCkgfHwgKGRhdGEtPnR5cGUgPT0gdzgzNjI3aGYpKSB7CisJCWlmIChkYXRhLT50eXBlID09IHc4Mzc4MmQpIHsKIAkJCWRhdGEtPmFsYXJtcyA9IHc4Mzc4MWRfcmVhZF92YWx1ZShkYXRhLAogCQkJCQkJVzgzNzgyRF9SRUdfQUxBUk0xKQogCQkJCSAgICAgfCAodzgzNzgxZF9yZWFkX3ZhbHVlKGRhdGEsCkBAIC0xODg2LDEzICsxODYzLDExIEBACiAJb3V0Yl9wKFc4Mzc4MURfUkVHX1dDSElQSUQsIGFkZHJlc3MgKyBXODM3ODFEX0FERFJfUkVHX09GRlNFVCk7CiAJdmFsID0gaW5iX3AoYWRkcmVzcyArIFc4Mzc4MURfREFUQV9SRUdfT0ZGU0VUKTsKIAlpZiAoKHZhbCAmIDB4ZmUpID09IDB4MTAJLyogVzgzNzgxRCAqLwotCSB8fCB2YWwgPT0gMHgzMAkJCS8qIFc4Mzc4MkQgKi8KLQkgfHwgdmFsID09IDB4MjEpCQkvKiBXODM2MjdIRiAqLworCSB8fCB2YWwgPT0gMHgzMCkJCS8qIFc4Mzc4MkQgKi8KIAkJZm91bmQgPSAxOwogCiAJaWYgKGZvdW5kKQogCQlwcl9pbmZvKCJ3ODM3ODFkOiBGb3VuZCBhICVzIGNoaXAgYXQgJSN4XG4iLAotCQkJdmFsID09IDB4MjEgPyAiVzgzNjI3SEYiIDoKIAkJCXZhbCA9PSAweDMwID8gIlc4Mzc4MkQiIDogIlc4Mzc4MUQiLCAoaW50KWFkZHJlc3MpOwogCiAgcmVsZWFzZToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdzgzNzkxZC5jIGIvZHJpdmVycy9od21vbi93ODM3OTFkLmMKaW5kZXggYTljMDFhNi4uODViZDIxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi93ODM3OTFkLmMKKysrIGIvZHJpdmVycy9od21vbi93ODM3OTFkLmMKQEAgLTg0MCwxNCArODQwLDEyIEBACiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgdzgzNzkxZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlzdHJ1Y3QgdzgzNzkxZF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAkvKiBObyBsb2NrIG5lZWRlZCBhcyB2cm0gaXMgaW50ZXJuYWwgdG8gdGhlIGRyaXZlcgogCSAgIChub3QgcmVhZCBmcm9tIGEgY2hpcCByZWdpc3RlcikgYW5kIHNvIGlzIG5vdAogCSAgIHVwZGF0ZWQgaW4gdzgzNzkxZF91cGRhdGVfZGV2aWNlKCkgKi8KLQlkYXRhLT52cm0gPSB2YWw7CisJZGF0YS0+dnJtID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4Mzc5My5jIGIvZHJpdmVycy9od21vbi93ODM3OTMuYwppbmRleCA0ODU5OWUxLi4zYmExZDZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4Mzc5My5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNzkzLmMKQEAgLTEzMSw2ICsxMzEsNyBAQAogI2RlZmluZSBQV01fRFVUWQkJCTAKICNkZWZpbmUgUFdNX1NUQVJUCQkJMQogI2RlZmluZSBQV01fTk9OU1RPUAkJCTIKKyNkZWZpbmUgUFdNX1NUT1BfVElNRQkJCTMKICNkZWZpbmUgVzgzNzkzX1JFR19QV00oaW5kZXgsIG5yKQkoKChucikgPT0gMCA/IDB4YjMgOiBcCiAJCQkJCSAobnIpID09IDEgPyAweDIyMCA6IDB4MjE4KSArIChpbmRleCkpCiAKQEAgLTI0Miw5ICsyNDMsNyBAQAogc3RhdGljIHNzaXplX3QKIHNob3dfdnJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCB3ODM3OTNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCisJc3RydWN0IHc4Mzc5M19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnZybSk7CiB9CiAKQEAgLTI2Myw5ICsyNjIsNyBAQAogc3RvcmVfdnJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCB3ODM3OTNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCisJc3RydWN0IHc4Mzc5M19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJZGF0YS0+dnJtID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CiAJcmV0dXJuIGNvdW50OwogfQpAQCAtNDA3LDEwICs0MDQsNiBAQAogCXJldHVybiBjb3VudDsKIH0KIAotI2RlZmluZSBQV01fRFVUWQkJCTAKLSNkZWZpbmUgUFdNX1NUQVJUCQkJMQotI2RlZmluZSBQV01fTk9OU1RPUAkJCTIKLSNkZWZpbmUgUFdNX1NUT1BfVElNRQkJCTMKIHN0YXRpYyBzc2l6ZV90CiBzaG93X3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4M2w3ODV0cy5jIGIvZHJpdmVycy9od21vbi93ODNsNzg1dHMuYwppbmRleCBiNWRiMzU0Li4xZDYyNTlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4M2w3ODV0cy5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzbDc4NXRzLmMKQEAgLTk2LDcgKzk2LDYgQEAKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJ3ODNsNzg1dHMiLAogCX0sCi0JLmlkCQk9IEkyQ19EUklWRVJJRF9XODNMNzg1VFMsCiAJLmF0dGFjaF9hZGFwdGVyCT0gdzgzbDc4NXRzX2F0dGFjaF9hZGFwdGVyLAogCS5kZXRhY2hfY2xpZW50CT0gdzgzbDc4NXRzX2RldGFjaF9jbGllbnQsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi93ODNsNzg2bmcuYyBiL2RyaXZlcnMvaHdtb24vdzgzbDc4Nm5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiZWU0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzbDc4Nm5nLmMKQEAgLTAsMCArMSw4MjEgQEAKKy8qCisgICAgdzgzbDc4Nm5nLmMgLSBMaW51eCBrZXJuZWwgZHJpdmVyIGZvciBoYXJkd2FyZSBtb25pdG9yaW5nCisgICAgQ29weXJpZ2h0IChjKSAyMDA3IEtldmluIExvIDxrZXZsb0BrZXZsby5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiAtIHZlcnNpb24gMi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICAgIDAyMTEwLTEzMDEgVVNBLgorKi8KKworLyoKKyAgICBTdXBwb3J0cyBmb2xsb3dpbmcgY2hpcHM6CisKKyAgICBDaGlwCSN2aW4JI2ZhbmluCSNwd20JI3RlbXAJd2NoaXBpZAl2ZW5kaWQJaTJjCUlTQQorICAgIHc4M2w3ODZuZwkzCTIJMgkyCTB4N2IJMHg1Y2EzCXllcwlubworKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi12aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisKKy8qIEFkZHJlc3NlcyB0byBzY2FuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDJlLCAweDJmLCBJMkNfQ0xJRU5UX0VORCB9OworCisvKiBJbnNtb2QgcGFyYW1ldGVycyAqLworSTJDX0NMSUVOVF9JTlNNT0RfMSh3ODNsNzg2bmcpOworCitzdGF0aWMgaW50IHJlc2V0OworbW9kdWxlX3BhcmFtKHJlc2V0LCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocmVzZXQsICJTZXQgdG8gMSB0byByZXNldCBjaGlwLCBub3QgcmVjb21tZW5kZWQiKTsKKworI2RlZmluZSBXODNMNzg2TkdfUkVHX0lOX01JTihucikJKDB4MkMgKyAobnIpICogMikKKyNkZWZpbmUgVzgzTDc4Nk5HX1JFR19JTl9NQVgobnIpCSgweDJCICsgKG5yKSAqIDIpCisjZGVmaW5lIFc4M0w3ODZOR19SRUdfSU4obnIpCQkoKG5yKSArIDB4MjApCisKKyNkZWZpbmUgVzgzTDc4Nk5HX1JFR19GQU4obnIpCQkoKG5yKSArIDB4MjgpCisjZGVmaW5lIFc4M0w3ODZOR19SRUdfRkFOX01JTihucikJKChucikgKyAweDNCKQorCisjZGVmaW5lIFc4M0w3ODZOR19SRUdfQ09ORklHCQkweDQwCisjZGVmaW5lIFc4M0w3ODZOR19SRUdfQUxBUk0xCQkweDQxCisjZGVmaW5lIFc4M0w3ODZOR19SRUdfQUxBUk0yIAkJMHg0MgorI2RlZmluZSBXODNMNzg2TkdfUkVHX0dQSU9fRU4JCTB4NDcKKyNkZWZpbmUgVzgzTDc4Nk5HX1JFR19NQU5fSUQyCQkweDRDCisjZGVmaW5lIFc4M0w3ODZOR19SRUdfTUFOX0lEMQkJMHg0RAorI2RlZmluZSBXODNMNzg2TkdfUkVHX0NISVBfSUQJCTB4NEUKKworI2RlZmluZSBXODNMNzg2TkdfUkVHX0RJT0RFCQkweDUzCisjZGVmaW5lIFc4M0w3ODZOR19SRUdfRkFOX0RJVgkJMHg1NAorI2RlZmluZSBXODNMNzg2TkdfUkVHX0ZBTl9DRkcJCTB4ODAKKworI2RlZmluZSBXODNMNzg2TkdfUkVHX1RPTEVSQU5DRQkJMHg4RAorCitzdGF0aWMgY29uc3QgdTggVzgzTDc4Nk5HX1JFR19URU1QWzJdWzNdID0geworCXsgMHgyNSwJCS8qIFRFTVAgMCBpbiBEYXRhU2hlZXQgKi8KKwkgIDB4MzUsCQkvKiBURU1QIDAgT3ZlciBpbiBEYXRhU2hlZXQgKi8KKwkgIDB4MzYgfSwJLyogVEVNUCAwIEh5c3QgaW4gRGF0YVNoZWV0ICovCisJeyAweDI2LAkJLyogVEVNUCAxIGluIERhdGFTaGVldCAqLworCSAgMHgzNywJCS8qIFRFTVAgMSBPdmVyIGluIERhdGFTaGVldCAqLworCSAgMHgzOCB9CS8qIFRFTVAgMSBIeXN0IGluIERhdGFTaGVldCAqLworfTsKKworc3RhdGljIGNvbnN0IHU4IFc4M0w3ODZOR19QV01fTU9ERV9TSElGVFtdID0gezYsIDd9Oworc3RhdGljIGNvbnN0IHU4IFc4M0w3ODZOR19QV01fRU5BQkxFX1NISUZUW10gPSB7MiwgNH07CisKKy8qIEZBTiBEdXR5IEN5Y2xlLCBiZSB1c2VkIHRvIGNvbnRyb2wgKi8KK3N0YXRpYyBjb25zdCB1OCBXODNMNzg2TkdfUkVHX1BXTVtdID0gezB4ODEsIDB4ODd9OworCisKK3N0YXRpYyBpbmxpbmUgdTgKK0ZBTl9UT19SRUcobG9uZyBycG0sIGludCBkaXYpCit7CisJaWYgKHJwbSA9PSAwKQorCQlyZXR1cm4gMjU1OworCXJwbSA9IFNFTlNPUlNfTElNSVQocnBtLCAxLCAxMDAwMDAwKTsKKwlyZXR1cm4gU0VOU09SU19MSU1JVCgoMTM1MDAwMCArIHJwbSAqIGRpdiAvIDIpIC8gKHJwbSAqIGRpdiksIDEsIDI1NCk7Cit9CisKKyNkZWZpbmUgRkFOX0ZST01fUkVHKHZhbCxkaXYpCSgodmFsKSA9PSAwICAgPyAtMSA6IFwKKwkJCQkoKHZhbCkgPT0gMjU1ID8gMCA6IFwKKwkJCQkxMzUwMDAwIC8gKCh2YWwpICogKGRpdikpKSkKKworLyogZm9yIHRlbXAgKi8KKyNkZWZpbmUgVEVNUF9UT19SRUcodmFsKQkoU0VOU09SU19MSU1JVCgoKHZhbCkgPCAwID8gKHZhbCkrMHgxMDAqMTAwMCBcCisJCQkJICAgIDogKHZhbCkpIC8gMTAwMCwgMCwgMHhmZikpCisjZGVmaW5lIFRFTVBfRlJPTV9SRUcodmFsKQkoKCh2YWwpICYgMHg4MCA/ICh2YWwpLTB4MTAwIDogKHZhbCkpICogMTAwMCkKKworLyogVGhlIGFuYWxvZyB2b2x0YWdlIGlucHV0cyBoYXZlIDhtViBMU0IuIFNpbmNlIHRoZSBzeXNmcyBvdXRwdXQgaXMKKyAgIGluIG1WIGFzIHdvdWxkIGJlIG1lYXN1cmVkIG9uIHRoZSBjaGlwIGlucHV0IHBpbiwgbmVlZCB0byBqdXN0CisgICBtdWx0aXBseS9kaXZpZGUgYnkgOCB0byB0cmFuc2xhdGUgZnJvbS90byByZWdpc3RlciB2YWx1ZXMuICovCisjZGVmaW5lIElOX1RPX1JFRyh2YWwpICAgICAgICAgIChTRU5TT1JTX0xJTUlUKCgoKHZhbCkgKyA0KSAvIDgpLCAwLCAyNTUpKQorI2RlZmluZSBJTl9GUk9NX1JFRyh2YWwpCSgodmFsKSAqIDgpCisKKyNkZWZpbmUgRElWX0ZST01fUkVHKHZhbCkJKDEgPDwgKHZhbCkpCisKK3N0YXRpYyBpbmxpbmUgdTgKK0RJVl9UT19SRUcobG9uZyB2YWwpCit7CisJaW50IGk7CisJdmFsID0gU0VOU09SU19MSU1JVCh2YWwsIDEsIDEyOCkgPj4gMTsKKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCWlmICh2YWwgPT0gMCkKKwkJCWJyZWFrOworCQl2YWwgPj49IDE7CisJfQorCXJldHVybiAoKHU4KSBpKTsKK30KKworc3RydWN0IHc4M2w3ODZuZ19kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworCXN0cnVjdCBtdXRleCB1cGRhdGVfbG9jazsKKwljaGFyIHZhbGlkOwkJCS8qICE9MCBpZiBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOwkvKiBJbiBqaWZmaWVzICovCisJdW5zaWduZWQgbG9uZyBsYXN0X25vbnZvbGF0aWxlOwkvKiBJbiBqaWZmaWVzLCBsYXN0IHRpbWUgd2UgdXBkYXRlIHRoZQorCQkJCQkgICBub252b2xhdGlsZSByZWdpc3RlcnMgKi8KKworCXU4IGluWzNdOworCXU4IGluX21heFszXTsKKwl1OCBpbl9taW5bM107CisJdTggZmFuWzJdOworCXU4IGZhbl9kaXZbMl07CisJdTggZmFuX21pblsyXTsKKwl1OCB0ZW1wX3R5cGVbMl07CisJdTggdGVtcFsyXVszXTsKKwl1OCBwd21bMl07CisJdTggcHdtX21vZGVbMl07CS8qIDAtPkRDIHZhcmlhYmxlIHZvbHRhZ2UKKwkJCSAgIDEtPlBXTSB2YXJpYWJsZSBkdXR5IGN5Y2xlICovCisKKwl1OCBwd21fZW5hYmxlWzJdOyAvKiAxLT5tYW51YWwKKwkJCSAgICAgMi0+dGhlcm1hbCBjcnVpc2UgKGFsc28gY2FsbGVkIFNtYXJ0RmFuIEkpICovCisJdTggdG9sZXJhbmNlWzJdOworfTsKKworc3RhdGljIGludCB3ODNsNzg2bmdfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgdzgzbDc4Nm5nX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCk7CitzdGF0aWMgaW50IHc4M2w3ODZuZ19kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIHZvaWQgdzgzbDc4Nm5nX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIHN0cnVjdCB3ODNsNzg2bmdfZGF0YSAqdzgzbDc4Nm5nX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHc4M2w3ODZuZ19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAidzgzbDc4Nm5nIiwKKwl9LAorCS5hdHRhY2hfYWRhcHRlciA9IHc4M2w3ODZuZ19hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudCA9IHc4M2w3ODZuZ19kZXRhY2hfY2xpZW50LAorfTsKKworc3RhdGljIHU4Cit3ODNsNzg2bmdfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCit7CisJcmV0dXJuIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyk7Cit9CisKK3N0YXRpYyBpbnQKK3c4M2w3ODZuZ193cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbHVlKQoreworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnLCB2YWx1ZSk7Cit9CisKKy8qIGZvbGxvd2luZyBhcmUgdGhlIHN5c2ZzIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLworI2RlZmluZSBzaG93X2luX3JlZyhyZWcpIFwKK3N0YXRpYyBzc2l6ZV90IFwKK3Nob3dfIyNyZWcoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgXAorICAgICAgICAgICBjaGFyICpidWYpIFwKK3sgXAorCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7IFwKKwlzdHJ1Y3QgdzgzbDc4Nm5nX2RhdGEgKmRhdGEgPSB3ODNsNzg2bmdfdXBkYXRlX2RldmljZShkZXYpOyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+cmVnW25yXSkpOyBcCit9CisKK3Nob3dfaW5fcmVnKGluKQorc2hvd19pbl9yZWcoaW5fbWluKQorc2hvd19pbl9yZWcoaW5fbWF4KQorCisjZGVmaW5lIHN0b3JlX2luX3JlZyhSRUcsIHJlZykgXAorc3RhdGljIHNzaXplX3QgXAorc3RvcmVfaW5fIyNyZWcgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIFwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIFwKK3sgXAorCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7IFwKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCisJc3RydWN0IHc4M2w3ODZuZ19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOyBcCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJZGF0YS0+aW5fIyNyZWdbbnJdID0gSU5fVE9fUkVHKHZhbCk7IFwKKwl3ODNsNzg2bmdfd3JpdGVfdmFsdWUoY2xpZW50LCBXODNMNzg2TkdfUkVHX0lOXyMjUkVHKG5yKSwgXAorCQkJICAgICAgZGF0YS0+aW5fIyNyZWdbbnJdKTsgXAorCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJcmV0dXJuIGNvdW50OyBcCit9CisKK3N0b3JlX2luX3JlZyhNSU4sIG1pbikKK3N0b3JlX2luX3JlZyhNQVgsIG1heCkKKworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzZGFfaW5faW5wdXRbXSA9IHsKKwlTRU5TT1JfQVRUUihpbjBfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDApLAorCVNFTlNPUl9BVFRSKGluMV9pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgMSksCisJU0VOU09SX0FUVFIoaW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCAyKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgc2RhX2luX21pbltdID0geworCVNFTlNPUl9BVFRSKGluMF9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21pbiwgc3RvcmVfaW5fbWluLCAwKSwKKwlTRU5TT1JfQVRUUihpbjFfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9taW4sIHN0b3JlX2luX21pbiwgMSksCisJU0VOU09SX0FUVFIoaW4yX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWluLCBzdG9yZV9pbl9taW4sIDIpLAorfTsKKworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzZGFfaW5fbWF4W10gPSB7CisJU0VOU09SX0FUVFIoaW4wX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWF4LCBzdG9yZV9pbl9tYXgsIDApLAorCVNFTlNPUl9BVFRSKGluMV9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21heCwgc3RvcmVfaW5fbWF4LCAxKSwKKwlTRU5TT1JfQVRUUihpbjJfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9tYXgsIHN0b3JlX2luX21heCwgMiksCit9OworCisjZGVmaW5lIHNob3dfZmFuX3JlZyhyZWcpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyNyZWcoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgXAorCQkJICBjaGFyICpidWYpIFwKK3sgXAorCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7IFwKKwlzdHJ1Y3QgdzgzbDc4Nm5nX2RhdGEgKmRhdGEgPSB3ODNsNzg2bmdfdXBkYXRlX2RldmljZShkZXYpOyBcCisgICAgICAgIHJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIFwKKyAgICAgICAgICAgICAgICBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuW25yXSwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkpOyBcCit9CisKK3Nob3dfZmFuX3JlZyhmYW4pOworc2hvd19mYW5fcmVnKGZhbl9taW4pOworCitzdGF0aWMgc3NpemVfdAorc3RvcmVfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzbDc4Nm5nX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1MzIgdmFsOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmZhbl9taW5bbnJdID0gRkFOX1RPX1JFRyh2YWwsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOworCXc4M2w3ODZuZ193cml0ZV92YWx1ZShjbGllbnQsIFc4M0w3ODZOR19SRUdfRkFOX01JTihuciksCisJCQkgICAgICBkYXRhLT5mYW5fbWluW25yXSk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzaG93X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkgICAgIGNoYXIgKmJ1ZikKK3sKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXN0cnVjdCB3ODNsNzg2bmdfZGF0YSAqZGF0YSA9IHc4M2w3ODZuZ191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOworfQorCisvKiBOb3RlOiB3ZSBzYXZlIGFuZCByZXN0b3JlIHRoZSBmYW4gbWluaW11bSBoZXJlLCBiZWNhdXNlIGl0cyB2YWx1ZSBpcworICAgZGV0ZXJtaW5lZCBpbiBwYXJ0IGJ5IHRoZSBmYW4gZGl2aXNvci4gIFRoaXMgZm9sbG93cyB0aGUgcHJpbmNpcGxlIG9mCisgICBsZWFzdCBzdXJwcmlzZTsgdGhlIHVzZXIgZG9lc24ndCBleHBlY3QgdGhlIGZhbiBtaW5pbXVtIHRvIGNoYW5nZSBqdXN0CisgICBiZWNhdXNlIHRoZSBkaXZpc29yIGNoYW5nZWQuICovCitzdGF0aWMgc3NpemVfdAorc3RvcmVfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzbDc4Nm5nX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXVuc2lnbmVkIGxvbmcgbWluOworCXU4IHRtcF9mYW5fZGl2OworCXU4IGZhbl9kaXZfcmVnOworCXU4IGtlZXBfbWFzayA9IDA7CisJdTggbmV3X3NoaWZ0ID0gMDsKKworCS8qIFNhdmUgZmFuX21pbiAqLworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwltaW4gPSBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltucl0sIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOworCisJZGF0YS0+ZmFuX2Rpdltucl0gPSBESVZfVE9fUkVHKHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApKTsKKworCXN3aXRjaCAobnIpIHsKKwljYXNlIDA6CisJCWtlZXBfbWFzayA9IDB4Zjg7CisJCW5ld19zaGlmdCA9IDA7CisJCWJyZWFrOworCWNhc2UgMToKKwkJa2VlcF9tYXNrID0gMHg4ZjsKKwkJbmV3X3NoaWZ0ID0gNDsKKwkJYnJlYWs7CisJfQorCisJZmFuX2Rpdl9yZWcgPSB3ODNsNzg2bmdfcmVhZF92YWx1ZShjbGllbnQsIFc4M0w3ODZOR19SRUdfRkFOX0RJVikKKwkJCQkJICAgJiBrZWVwX21hc2s7CisKKwl0bXBfZmFuX2RpdiA9IChkYXRhLT5mYW5fZGl2W25yXSA8PCBuZXdfc2hpZnQpICYgfmtlZXBfbWFzazsKKworCXc4M2w3ODZuZ193cml0ZV92YWx1ZShjbGllbnQsIFc4M0w3ODZOR19SRUdfRkFOX0RJViwKKwkJCSAgICAgIGZhbl9kaXZfcmVnIHwgdG1wX2Zhbl9kaXYpOworCisJLyogUmVzdG9yZSBmYW5fbWluICovCisJZGF0YS0+ZmFuX21pbltucl0gPSBGQU5fVE9fUkVHKG1pbiwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7CisJdzgzbDc4Nm5nX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzTDc4Nk5HX1JFR19GQU5fTUlOKG5yKSwKKwkJCSAgICAgIGRhdGEtPmZhbl9taW5bbnJdKTsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzZGFfZmFuX2lucHV0W10gPSB7CisJU0VOU09SX0FUVFIoZmFuMV9pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDApLAorCVNFTlNPUl9BVFRSKGZhbjJfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAxKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgc2RhX2Zhbl9taW5bXSA9IHsKKwlTRU5TT1JfQVRUUihmYW4xX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfZmFuX21pbiwKKwkJICAgIHN0b3JlX2Zhbl9taW4sIDApLAorCVNFTlNPUl9BVFRSKGZhbjJfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19mYW5fbWluLAorCQkgICAgc3RvcmVfZmFuX21pbiwgMSksCit9OworCitzdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlIHNkYV9mYW5fZGl2W10gPSB7CisJU0VOU09SX0FUVFIoZmFuMV9kaXYsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2Zhbl9kaXYsCisJCSAgICBzdG9yZV9mYW5fZGl2LCAwKSwKKwlTRU5TT1JfQVRUUihmYW4yX2RpdiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfZmFuX2RpdiwKKwkJICAgIHN0b3JlX2Zhbl9kaXYsIDEpLAorfTsKKworCisvKiByZWFkL3dyaXRlIHRoZSB0ZW1wZXJhdHVyZSwgaW5jbHVkZXMgbWVhc3VyZWQgdmFsdWUgYW5kIGxpbWl0cyAqLworCitzdGF0aWMgc3NpemVfdAorc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqc2Vuc29yX2F0dHIgPQorCSAgICB0b19zZW5zb3JfZGV2X2F0dHJfMihhdHRyKTsKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+bnI7CisJaW50IGluZGV4ID0gc2Vuc29yX2F0dHItPmluZGV4OworCXN0cnVjdCB3ODNsNzg2bmdfZGF0YSAqZGF0YSA9IHc4M2w3ODZuZ191cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcFtucl1baW5kZXhdKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzdG9yZV90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKnNlbnNvcl9hdHRyID0KKwkgICAgdG9fc2Vuc29yX2Rldl9hdHRyXzIoYXR0cik7CisJaW50IG5yID0gc2Vuc29yX2F0dHItPm5yOworCWludCBpbmRleCA9IHNlbnNvcl9hdHRyLT5pbmRleDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODNsNzg2bmdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXMzMiB2YWw7CisKKwl2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wW25yXVtpbmRleF0gPSBURU1QX1RPX1JFRyh2YWwpOworCXc4M2w3ODZuZ193cml0ZV92YWx1ZShjbGllbnQsIFc4M0w3ODZOR19SRUdfVEVNUFtucl1baW5kZXhdLAorCQkJICAgICAgZGF0YS0+dGVtcFtucl1baW5kZXhdKTsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworICAgICAgICByZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiBzZGFfdGVtcF9pbnB1dFtdID0geworCVNFTlNPUl9BVFRSXzIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcCwgTlVMTCwgMCwgMCksCisJU0VOU09SX0FUVFJfMih0ZW1wMl9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCAxLCAwKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiBzZGFfdGVtcF9tYXhbXSA9IHsKKwlTRU5TT1JfQVRUUl8yKHRlbXAxX21heCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgICAgIHNob3dfdGVtcCwgc3RvcmVfdGVtcCwgMCwgMSksCisJU0VOU09SX0FUVFJfMih0ZW1wMl9tYXgsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICAgICBzaG93X3RlbXAsIHN0b3JlX3RlbXAsIDEsIDEpLAorfTsKKworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yIHNkYV90ZW1wX21heF9oeXN0W10gPSB7CisJU0VOU09SX0FUVFJfMih0ZW1wMV9tYXhfaHlzdCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgICAgIHNob3dfdGVtcCwgc3RvcmVfdGVtcCwgMCwgMiksCisJU0VOU09SX0FUVFJfMih0ZW1wMl9tYXhfaHlzdCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgICAgIHNob3dfdGVtcCwgc3RvcmVfdGVtcCwgMSwgMiksCit9OworCisjZGVmaW5lIHNob3dfcHdtX3JlZyhyZWcpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyNyZWcgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIFwKKwkJCSAgIGNoYXIgKmJ1ZikgXAoreyBcCisJc3RydWN0IHc4M2w3ODZuZ19kYXRhICpkYXRhID0gdzgzbDc4Nm5nX3VwZGF0ZV9kZXZpY2UoZGV2KTsgXAorCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+cmVnW25yXSk7IFwKK30KKworc2hvd19wd21fcmVnKHB3bV9tb2RlKQorc2hvd19wd21fcmVnKHB3bV9lbmFibGUpCitzaG93X3B3bV9yZWcocHdtKQorCitzdGF0aWMgc3NpemVfdAorc3RvcmVfcHdtX21vZGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODNsNzg2bmdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXUzMiB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwl1OCByZWc7CisKKwlpZiAodmFsID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnB3bV9tb2RlW25yXSA9IHZhbDsKKwlyZWcgPSB3ODNsNzg2bmdfcmVhZF92YWx1ZShjbGllbnQsIFc4M0w3ODZOR19SRUdfRkFOX0NGRyk7CisJcmVnICY9IH4oMSA8PCBXODNMNzg2TkdfUFdNX01PREVfU0hJRlRbbnJdKTsKKwlpZiAoIXZhbCkKKwkJcmVnIHw9IDEgPDwgVzgzTDc4Nk5HX1BXTV9NT0RFX1NISUZUW25yXTsKKwl3ODNsNzg2bmdfd3JpdGVfdmFsdWUoY2xpZW50LCBXODNMNzg2TkdfUkVHX0ZBTl9DRkcsIHJlZyk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAorc3RvcmVfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgbnIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHc4M2w3ODZuZ19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTMyIHZhbCA9IFNFTlNPUlNfTElNSVQoc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCksIDAsIDI1NSk7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+cHdtW25yXSA9IHZhbDsKKwl3ODNsNzg2bmdfd3JpdGVfdmFsdWUoY2xpZW50LCBXODNMNzg2TkdfUkVHX1BXTVtucl0sIHZhbCk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAorc3RvcmVfcHdtX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODNsNzg2bmdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXUzMiB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCXU4IHJlZzsKKworCWlmICghdmFsIHx8ICh2YWwgPiAyKSkgIC8qIG9ubHkgbW9kZXMgMSBhbmQgMiBhcmUgc3VwcG9ydGVkICovCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJlZyA9IHc4M2w3ODZuZ19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzTDc4Nk5HX1JFR19GQU5fQ0ZHKTsKKwlkYXRhLT5wd21fZW5hYmxlW25yXSA9IHZhbDsKKwlyZWcgJj0gfigweDAyIDw8IFc4M0w3ODZOR19QV01fRU5BQkxFX1NISUZUW25yXSk7CisJcmVnIHw9ICh2YWwgLSAxKSA8PCBXODNMNzg2TkdfUFdNX0VOQUJMRV9TSElGVFtucl07CisJdzgzbDc4Nm5nX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzTDc4Nk5HX1JFR19GQU5fQ0ZHLCByZWcpOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzZGFfcHdtW10gPSB7CisJU0VOU09SX0FUVFIocHdtMSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfcHdtLCBzdG9yZV9wd20sIDApLAorCVNFTlNPUl9BVFRSKHB3bTIsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3B3bSwgc3RvcmVfcHdtLCAxKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgc2RhX3B3bV9tb2RlW10gPSB7CisJU0VOU09SX0FUVFIocHdtMV9tb2RlLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19wd21fbW9kZSwKKwkJICAgIHN0b3JlX3B3bV9tb2RlLCAwKSwKKwlTRU5TT1JfQVRUUihwd20yX21vZGUsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3B3bV9tb2RlLAorCQkgICAgc3RvcmVfcHdtX21vZGUsIDEpLAorfTsKKworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzZGFfcHdtX2VuYWJsZVtdID0geworCVNFTlNPUl9BVFRSKHB3bTFfZW5hYmxlLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19wd21fZW5hYmxlLAorCQkgICAgc3RvcmVfcHdtX2VuYWJsZSwgMCksCisJU0VOU09SX0FUVFIocHdtMl9lbmFibGUsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3B3bV9lbmFibGUsCisJCSAgICBzdG9yZV9wd21fZW5hYmxlLCAxKSwKK307CisKKy8qIEZvciBTbWFydCBGYW4gSS9UaGVybWFsIENydWlzZSBhbmQgU21hcnQgRmFuIElJICovCitzdGF0aWMgc3NpemVfdAorc2hvd190b2xlcmFuY2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJc3RydWN0IHc4M2w3ODZuZ19kYXRhICpkYXRhID0gdzgzbDc4Nm5nX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIChsb25nKWRhdGEtPnRvbGVyYW5jZVtucl0pOworfQorCitzdGF0aWMgc3NpemVfdAorc3RvcmVfdG9sZXJhbmNlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBuciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdzgzbDc4Nm5nX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1MzIgdmFsOworCXU4IHRvbF90bXAsIHRvbF9tYXNrOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJdG9sX21hc2sgPSB3ODNsNzg2bmdfcmVhZF92YWx1ZShjbGllbnQsCisJICAgIFc4M0w3ODZOR19SRUdfVE9MRVJBTkNFKSAmICgobnIgPT0gMSkgPyAweDBmIDogMHhmMCk7CisJdG9sX3RtcCA9IFNFTlNPUlNfTElNSVQodmFsLCAwLCAxNSk7CisJdG9sX3RtcCAmPSAweDBmOworCWRhdGEtPnRvbGVyYW5jZVtucl0gPSB0b2xfdG1wOworCWlmIChuciA9PSAxKSB7CisJCXRvbF90bXAgPDw9IDQ7CisJfQorCisJdzgzbDc4Nm5nX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzTDc4Nk5HX1JFR19UT0xFUkFOQ0UsCisJCQkgICAgICB0b2xfbWFzayB8IHRvbF90bXApOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzZGFfdG9sZXJhbmNlW10gPSB7CisJU0VOU09SX0FUVFIocHdtMV90b2xlcmFuY2UsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkgICAgc2hvd190b2xlcmFuY2UsIHN0b3JlX3RvbGVyYW5jZSwgMCksCisJU0VOU09SX0FUVFIocHdtMl90b2xlcmFuY2UsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkgICAgc2hvd190b2xlcmFuY2UsIHN0b3JlX3RvbGVyYW5jZSwgMSksCit9OworCisKKyNkZWZpbmUgSU5fVU5JVF9BVFRSUyhYKQlcCisJJnNkYV9pbl9pbnB1dFtYXS5kZXZfYXR0ci5hdHRyLAkJXAorCSZzZGFfaW5fbWluW1hdLmRldl9hdHRyLmF0dHIsCQlcCisJJnNkYV9pbl9tYXhbWF0uZGV2X2F0dHIuYXR0cgorCisjZGVmaW5lIEZBTl9VTklUX0FUVFJTKFgpCVwKKwkmc2RhX2Zhbl9pbnB1dFtYXS5kZXZfYXR0ci5hdHRyLAlcCisJJnNkYV9mYW5fbWluW1hdLmRldl9hdHRyLmF0dHIsCQlcCisJJnNkYV9mYW5fZGl2W1hdLmRldl9hdHRyLmF0dHIKKworI2RlZmluZSBURU1QX1VOSVRfQVRUUlMoWCkJXAorCSZzZGFfdGVtcF9pbnB1dFtYXS5kZXZfYXR0ci5hdHRyLAlcCisJJnNkYV90ZW1wX21heFtYXS5kZXZfYXR0ci5hdHRyLAkJXAorCSZzZGFfdGVtcF9tYXhfaHlzdFtYXS5kZXZfYXR0ci5hdHRyCisKKyNkZWZpbmUgUFdNX1VOSVRfQVRUUlMoWCkJXAorCSZzZGFfcHdtW1hdLmRldl9hdHRyLmF0dHIsCQlcCisJJnNkYV9wd21fbW9kZVtYXS5kZXZfYXR0ci5hdHRyLAkJXAorCSZzZGFfcHdtX2VuYWJsZVtYXS5kZXZfYXR0ci5hdHRyCisKKyNkZWZpbmUgVE9MRVJBTkNFX1VOSVRfQVRUUlMoWCkJXAorCSZzZGFfdG9sZXJhbmNlW1hdLmRldl9hdHRyLmF0dHIKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnc4M2w3ODZuZ19hdHRyaWJ1dGVzW10gPSB7CisJSU5fVU5JVF9BVFRSUygwKSwKKwlJTl9VTklUX0FUVFJTKDEpLAorCUlOX1VOSVRfQVRUUlMoMiksCisJRkFOX1VOSVRfQVRUUlMoMCksCisJRkFOX1VOSVRfQVRUUlMoMSksCisJVEVNUF9VTklUX0FUVFJTKDApLAorCVRFTVBfVU5JVF9BVFRSUygxKSwKKwlQV01fVU5JVF9BVFRSUygwKSwKKwlQV01fVU5JVF9BVFRSUygxKSwKKwlUT0xFUkFOQ0VfVU5JVF9BVFRSUygwKSwKKwlUT0xFUkFOQ0VfVU5JVF9BVFRSUygxKSwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB3ODNsNzg2bmdfZ3JvdXAgPSB7CisJLmF0dHJzID0gdzgzbDc4Nm5nX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50Cit3ODNsNzg2bmdfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCB3ODNsNzg2bmdfZGV0ZWN0KTsKK30KKworc3RhdGljIGludAordzgzbDc4Nm5nX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgdzgzbDc4Nm5nX2RhdGEgKmRhdGE7CisJaW50IGksIGVyciA9IDA7CisJdTggcmVnX3RtcDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgeworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogT0suIEZvciBub3csIHdlIHByZXN1bWUgd2UgaGF2ZSBhIHZhbGlkIGNsaWVudC4gV2Ugbm93IGNyZWF0ZSB0aGUKKwkgICBjbGllbnQgc3RydWN0dXJlLCBldmVuIHRob3VnaCB3ZSBjYW5ub3QgZmlsbCBpdCBjb21wbGV0ZWx5IHlldC4KKwkgICBCdXQgaXQgYWxsb3dzIHVzIHRvIGFjY2VzcyB3ODNsNzg2bmdfe3JlYWQsd3JpdGV9X3ZhbHVlLiAqLworCisJaWYgKCEoZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3ODNsNzg2bmdfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCisJY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlkZXYgPSAmY2xpZW50LT5kZXY7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGF0YSk7CisJY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwljbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCWNsaWVudC0+ZHJpdmVyID0gJnc4M2w3ODZuZ19kcml2ZXI7CisKKwkvKgorCSAqIE5vdyB3ZSBkbyB0aGUgcmVtYWluaW5nIGRldGVjdGlvbi4gQSBuZWdhdGl2ZSBraW5kIG1lYW5zIHRoYXQKKwkgKiB0aGUgZHJpdmVyIHdhcyBsb2FkZWQgd2l0aCBubyBmb3JjZSBwYXJhbWV0ZXIgKGRlZmF1bHQpLCBzbyB3ZQorCSAqIG11c3QgYm90aCBkZXRlY3QgYW5kIGlkZW50aWZ5IHRoZSBjaGlwIChhY3R1YWxseSB0aGVyZSBpcyBvbmx5CisJICogb25lIHBvc3NpYmxlIGtpbmQgb2YgY2hpcCBmb3Igbm93LCBXODNMNzg2TkcpLiBBIHplcm8ga2luZCBtZWFucworCSAqIHRoYXQgdGhlIGRyaXZlciB3YXMgbG9hZGVkIHdpdGggdGhlIGZvcmNlIHBhcmFtZXRlciwgdGhlIGRldGVjdGlvbgorCSAqIHN0ZXAgc2hhbGwgYmUgc2tpcHBlZC4gQSBwb3NpdGl2ZSBraW5kIG1lYW5zIHRoYXQgdGhlIGRyaXZlcgorCSAqIHdhcyBsb2FkZWQgd2l0aCB0aGUgZm9yY2UgcGFyYW1ldGVyIGFuZCBhIGdpdmVuIGtpbmQgb2YgY2hpcCBpcworCSAqIHJlcXVlc3RlZCwgc28gYm90aCB0aGUgZGV0ZWN0aW9uIGFuZCB0aGUgaWRlbnRpZmljYXRpb24gc3RlcHMKKwkgKiBhcmUgc2tpcHBlZC4KKwkgKi8KKwlpZiAoa2luZCA8IDApIHsgLyogZGV0ZWN0aW9uICovCisJCWlmICgoKHc4M2w3ODZuZ19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJICAgIFc4M0w3ODZOR19SRUdfQ09ORklHKSAmIDB4ODApICE9IDB4MDApKSB7CisJCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsCisJCQkJIlc4M0w3ODZORyBkZXRlY3Rpb24gZmFpbGVkIGF0IDB4JTAyeC5cbiIsCisJCQkJYWRkcmVzcyk7CisJCQlnb3RvIGV4aXRfZnJlZTsKKwkJfQorCX0KKworCWlmIChraW5kIDw9IDApIHsgLyogaWRlbnRpZmljYXRpb24gKi8KKwkJdTE2IG1hbl9pZDsKKwkJdTggY2hpcF9pZDsKKworCQltYW5faWQgPSAodzgzbDc4Nm5nX3JlYWRfdmFsdWUoY2xpZW50LAorCQkgICAgVzgzTDc4Nk5HX1JFR19NQU5fSUQxKSA8PCA4KSArCisJCSAgICB3ODNsNzg2bmdfcmVhZF92YWx1ZShjbGllbnQsIFc4M0w3ODZOR19SRUdfTUFOX0lEMik7CisJCWNoaXBfaWQgPSB3ODNsNzg2bmdfcmVhZF92YWx1ZShjbGllbnQsIFc4M0w3ODZOR19SRUdfQ0hJUF9JRCk7CisKKwkJaWYgKG1hbl9pZCA9PSAweDVDQTMpIHsgLyogV2luYm9uZCAqLworCQkJaWYgKGNoaXBfaWQgPT0gMHg4MCkgeyAvKiBXODNMNzg2TkcgKi8KKwkJCQlraW5kID0gdzgzbDc4Nm5nOworCQkJfQorCQl9CisKKwkJaWYgKGtpbmQgPD0gMCkgeyAvKiBpZGVudGlmaWNhdGlvbiBmYWlsZWQgKi8KKwkJCWRldl9pbmZvKCZhZGFwdGVyLT5kZXYsCisJCQkgICAgIlVuc3VwcG9ydGVkIGNoaXAgKG1hbl9pZD0weCUwNFgsICIKKwkJCSAgICAiY2hpcF9pZD0weCUwMlgpLlxuIiwgbWFuX2lkLCBjaGlwX2lkKTsKKwkJCWdvdG8gZXhpdF9mcmVlOworCQl9CisJfQorCisJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgYW5kIHB1dCBpbnRvIHRoZSBnbG9iYWwgbGlzdCAqLworCXN0cmxjcHkoY2xpZW50LT5uYW1lLCAidzgzbDc4Nm5nIiwgSTJDX05BTUVfU0laRSk7CisJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KSkpCisJCWdvdG8gZXhpdF9mcmVlOworCisJLyogSW5pdGlhbGl6ZSB0aGUgY2hpcCAqLworCXc4M2w3ODZuZ19pbml0X2NsaWVudChjbGllbnQpOworCisJLyogQSBmZXcgdmFycyBuZWVkIHRvIGJlIGZpbGxlZCB1cG9uIHN0YXJ0dXAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCWRhdGEtPmZhbl9taW5baV0gPSB3ODNsNzg2bmdfcmVhZF92YWx1ZShjbGllbnQsCisJCSAgICBXODNMNzg2TkdfUkVHX0ZBTl9NSU4oaSkpOworCX0KKworCS8qIFVwZGF0ZSB0aGUgZmFuIGRpdmlzb3IgKi8KKwlyZWdfdG1wID0gdzgzbDc4Nm5nX3JlYWRfdmFsdWUoY2xpZW50LCBXODNMNzg2TkdfUkVHX0ZBTl9ESVYpOworCWRhdGEtPmZhbl9kaXZbMF0gPSByZWdfdG1wICYgMHgwNzsKKwlkYXRhLT5mYW5fZGl2WzFdID0gKHJlZ190bXAgPj4gNCkgJiAweDA3OworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlpZiAoKGVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJnc4M2w3ODZuZ19ncm91cCkpKQorCQlnb3RvIGV4aXRfcmVtb3ZlOworCisJZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKGRldik7CisJaWYgKElTX0VSUihkYXRhLT5od21vbl9kZXYpKSB7CisJCWVyciA9IFBUUl9FUlIoZGF0YS0+aHdtb25fZGV2KTsKKwkJZ290byBleGl0X3JlbW92ZTsKKwl9CisKKwlyZXR1cm4gMDsKKworCS8qIFVucmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKworZXhpdF9yZW1vdmU6CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmdzgzbDc4Nm5nX2dyb3VwKTsKKwlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOworZXhpdF9mcmVlOgorCWtmcmVlKGRhdGEpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50Cit3ODNsNzg2bmdfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCB3ODNsNzg2bmdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBlcnI7CisKKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJnc4M2w3ODZuZ19ncm91cCk7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKQorCQlyZXR1cm4gZXJyOworCisJa2ZyZWUoZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3c4M2w3ODZuZ19pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXU4IHRtcDsKKworCWlmIChyZXNldCkKKwkJdzgzbDc4Nm5nX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzTDc4Nk5HX1JFR19DT05GSUcsIDB4ODApOworCisJLyogU3RhcnQgbW9uaXRvcmluZyAqLworCXRtcCA9IHc4M2w3ODZuZ19yZWFkX3ZhbHVlKGNsaWVudCwgVzgzTDc4Nk5HX1JFR19DT05GSUcpOworCWlmICghKHRtcCAmIDB4MDEpKQorCQl3ODNsNzg2bmdfd3JpdGVfdmFsdWUoY2xpZW50LCBXODNMNzg2TkdfUkVHX0NPTkZJRywgdG1wIHwgMHgwMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdzgzbDc4Nm5nX2RhdGEgKnc4M2w3ODZuZ191cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODNsNzg2bmdfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBpLCBqOworCXU4IHJlZ190bXAsIHB3bWNmZzsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWiArIEhaIC8gMikKKwkgICAgfHwgIWRhdGEtPnZhbGlkKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiVXBkYXRpbmcgdzgzbDc4Nm5nIGRhdGEuXG4iKTsKKworCQkvKiBVcGRhdGUgdGhlIHZvbHRhZ2VzIG1lYXN1cmVkIHZhbHVlIGFuZCBsaW1pdHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJZGF0YS0+aW5baV0gPSB3ODNsNzg2bmdfcmVhZF92YWx1ZShjbGllbnQsCisJCQkgICAgVzgzTDc4Nk5HX1JFR19JTihpKSk7CisJCQlkYXRhLT5pbl9taW5baV0gPSB3ODNsNzg2bmdfcmVhZF92YWx1ZShjbGllbnQsCisJCQkgICAgVzgzTDc4Nk5HX1JFR19JTl9NSU4oaSkpOworCQkJZGF0YS0+aW5fbWF4W2ldID0gdzgzbDc4Nm5nX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJICAgIFc4M0w3ODZOR19SRUdfSU5fTUFYKGkpKTsKKwkJfQorCisJCS8qIFVwZGF0ZSB0aGUgZmFuIGNvdW50cyBhbmQgbGltaXRzICovCisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCWRhdGEtPmZhbltpXSA9IHc4M2w3ODZuZ19yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCSAgICBXODNMNzg2TkdfUkVHX0ZBTihpKSk7CisJCQlkYXRhLT5mYW5fbWluW2ldID0gdzgzbDc4Nm5nX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJICAgIFc4M0w3ODZOR19SRUdfRkFOX01JTihpKSk7CisJCX0KKworCQkvKiBVcGRhdGUgdGhlIGZhbiBkaXZpc29yICovCisJCXJlZ190bXAgPSB3ODNsNzg2bmdfcmVhZF92YWx1ZShjbGllbnQsIFc4M0w3ODZOR19SRUdfRkFOX0RJVik7CisJCWRhdGEtPmZhbl9kaXZbMF0gPSByZWdfdG1wICYgMHgwNzsKKwkJZGF0YS0+ZmFuX2RpdlsxXSA9IChyZWdfdG1wID4+IDQpICYgMHgwNzsKKworCQlwd21jZmcgPSB3ODNsNzg2bmdfcmVhZF92YWx1ZShjbGllbnQsIFc4M0w3ODZOR19SRUdfRkFOX0NGRyk7CisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCWRhdGEtPnB3bV9tb2RlW2ldID0KKwkJCSAgICAoKHB3bWNmZyA+PiBXODNMNzg2TkdfUFdNX01PREVfU0hJRlRbaV0pICYgMSkKKwkJCSAgICA/IDAgOiAxOworCQkJZGF0YS0+cHdtX2VuYWJsZVtpXSA9CisJCQkgICAgKChwd21jZmcgPj4gVzgzTDc4Nk5HX1BXTV9FTkFCTEVfU0hJRlRbaV0pICYgMikgKyAxOworCQkJZGF0YS0+cHdtW2ldID0gdzgzbDc4Nm5nX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJICAgIFc4M0w3ODZOR19SRUdfUFdNW2ldKTsKKwkJfQorCisKKwkJLyogVXBkYXRlIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3JzICovCisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCWZvciAoaiA9IDA7IGogPCAzOyBqKyspIHsKKwkJCQlkYXRhLT50ZW1wW2ldW2pdID0gdzgzbDc4Nm5nX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCSAgICBXODNMNzg2TkdfUkVHX1RFTVBbaV1bal0pOworCQkJfQorCQl9CisKKwkJLyogVXBkYXRlIFNtYXJ0IEZhbiBJL0lJIHRvbGVyYW5jZSAqLworCQlyZWdfdG1wID0gdzgzbDc4Nm5nX3JlYWRfdmFsdWUoY2xpZW50LCBXODNMNzg2TkdfUkVHX1RPTEVSQU5DRSk7CisJCWRhdGEtPnRvbGVyYW5jZVswXSA9IHJlZ190bXAgJiAweDBmOworCQlkYXRhLT50b2xlcmFuY2VbMV0gPSAocmVnX3RtcCA+PiA0KSAmIDB4MGY7CisKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCisJfQorCisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBfX2luaXQKK3NlbnNvcnNfdzgzbDc4Nm5nX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnc4M2w3ODZuZ19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3NlbnNvcnNfdzgzbDc4Nm5nX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmdzgzbDc4Nm5nX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIktldmluIExvIik7CitNT0RVTEVfREVTQ1JJUFRJT04oInc4M2w3ODZuZyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoc2Vuc29yc193ODNsNzg2bmdfaW5pdCk7Cittb2R1bGVfZXhpdChzZW5zb3JzX3c4M2w3ODZuZ19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2VlcHJvbS5jIGIvZHJpdmVycy9pMmMvY2hpcHMvZWVwcm9tLmMKaW5kZXggZmRlMjk3YjIuLjdkZWUwMDFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9jaGlwcy9lZXByb20uYworKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9lZXByb20uYwpAQCAtNzEsNyArNzEsNiBAQAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gImVlcHJvbSIsCiAJfSwKLQkuaWQJCT0gSTJDX0RSSVZFUklEX0VFUFJPTSwKIAkuYXR0YWNoX2FkYXB0ZXIJPSBlZXByb21fYXR0YWNoX2FkYXB0ZXIsCiAJLmRldGFjaF9jbGllbnQJPSBlZXByb21fZGV0YWNoX2NsaWVudCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9wY2Y4NTc0LmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9wY2Y4NTc0LmMKaW5kZXggYjNiODMwYy4uZTViMzEzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvY2hpcHMvcGNmODU3NC5jCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL3BjZjg1NzQuYwpAQCAtNjcsNyArNjcsNiBAQAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gInBjZjg1NzQiLAogCX0sCi0JLmlkCQk9IEkyQ19EUklWRVJJRF9QQ0Y4NTc0LAogCS5hdHRhY2hfYWRhcHRlcgk9IHBjZjg1NzRfYXR0YWNoX2FkYXB0ZXIsCiAJLmRldGFjaF9jbGllbnQJPSBwY2Y4NTc0X2RldGFjaF9jbGllbnQsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvcGNmODU5MS5jIGIvZHJpdmVycy9pMmMvY2hpcHMvcGNmODU5MS5jCmluZGV4IDg2NWY0NDAuLjY2YzdjM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL3BjZjg1OTEuYworKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9wY2Y4NTkxLmMKQEAgLTkyLDcgKzkyLDYgQEAKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJwY2Y4NTkxIiwKIAl9LAotCS5pZAkJPSBJMkNfRFJJVkVSSURfUENGODU5MSwKIAkuYXR0YWNoX2FkYXB0ZXIJPSBwY2Y4NTkxX2F0dGFjaF9hZGFwdGVyLAogCS5kZXRhY2hfY2xpZW50CT0gcGNmODU5MV9kZXRhY2hfY2xpZW50LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BwYy9tcGM4eHguYyBiL2RyaXZlcnMvaWRlL3BwYy9tcGM4eHguYwppbmRleCAwNjE5MGIxLi4zOGZiZmI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wcGMvbXBjOHh4LmMKKysrIGIvZHJpdmVycy9pZGUvcHBjL21wYzh4eC5jCkBAIC0xNyw3ICsxNyw2IEBACiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9jcS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvY3EuYwppbmRleCA3OTUwYWE2Li43MzYwYmJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9jcS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L2NxLmMKQEAgLTY0LDEzICs2NCw3IEBACiAKIHN0YXRpYyB2b2lkICpnZXRfY3FlX2Zyb21fYnVmKHN0cnVjdCBtbHg0X2liX2NxX2J1ZiAqYnVmLCBpbnQgbikKIHsKLQlpbnQgb2Zmc2V0ID0gbiAqIHNpemVvZiAoc3RydWN0IG1seDRfY3FlKTsKLQotCWlmIChidWYtPmJ1Zi5uYnVmcyA9PSAxKQotCQlyZXR1cm4gYnVmLT5idWYudS5kaXJlY3QuYnVmICsgb2Zmc2V0OwotCWVsc2UKLQkJcmV0dXJuIGJ1Zi0+YnVmLnUucGFnZV9saXN0W29mZnNldCA+PiBQQUdFX1NISUZUXS5idWYgKwotCQkJKG9mZnNldCAmIChQQUdFX1NJWkUgLSAxKSk7CisJcmV0dXJuIG1seDRfYnVmX29mZnNldCgmYnVmLT5idWYsIG4gKiBzaXplb2YgKHN0cnVjdCBtbHg0X2NxZSkpOwogfQogCiBzdGF0aWMgdm9pZCAqZ2V0X2NxZShzdHJ1Y3QgbWx4NF9pYl9jcSAqY3EsIGludCBuKQpAQCAtMzMyLDYgKzMyNiwxMiBAQAogCWlzX2Vycm9yID0gKGNxZS0+b3duZXJfc3Jfb3Bjb2RlICYgTUxYNF9DUUVfT1BDT0RFX01BU0spID09CiAJCU1MWDRfQ1FFX09QQ09ERV9FUlJPUjsKIAorCWlmICh1bmxpa2VseSgoY3FlLT5vd25lcl9zcl9vcGNvZGUgJiBNTFg0X0NRRV9PUENPREVfTUFTSykgPT0gTUxYNF9PUENPREVfTk9QICYmCisJCSAgICAgaXNfc2VuZCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ29tcGxldGlvbiBmb3IgTk9QIG9wY29kZSBkZXRlY3RlZCFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlpZiAoISpjdXJfcXAgfHwKIAkgICAgKGJlMzJfdG9fY3B1KGNxZS0+bXlfcXBuKSAmIDB4ZmZmZmZmKSAhPSAoKmN1cl9xcCktPm1xcC5xcG4pIHsKIAkJLyoKQEAgLTM1NCw4ICszNTQsMTAgQEAKIAogCWlmIChpc19zZW5kKSB7CiAJCXdxID0gJigqY3VyX3FwKS0+c3E7Ci0JCXdxZV9jdHIgPSBiZTE2X3RvX2NwdShjcWUtPndxZV9pbmRleCk7Ci0JCXdxLT50YWlsICs9ICh1MTYpICh3cWVfY3RyIC0gKHUxNikgd3EtPnRhaWwpOworCQlpZiAoISgqY3VyX3FwKS0+c3Ffc2lnbmFsX2JpdHMpIHsKKwkJCXdxZV9jdHIgPSBiZTE2X3RvX2NwdShjcWUtPndxZV9pbmRleCk7CisJCQl3cS0+dGFpbCArPSAodTE2KSAod3FlX2N0ciAtICh1MTYpIHdxLT50YWlsKTsKKwkJfQogCQl3Yy0+d3JfaWQgPSB3cS0+d3JpZFt3cS0+dGFpbCAmICh3cS0+d3FlX2NudCAtIDEpXTsKIAkJKyt3cS0+dGFpbDsKIAl9IGVsc2UgaWYgKCgqY3VyX3FwKS0+aWJxcC5zcnEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21seDRfaWIuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21seDRfaWIuaAppbmRleCAyODY5NzY1Li4zNzI2ZTQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tbHg0X2liLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWx4NF9pYi5oCkBAIC0xMjAsNiArMTIwLDggQEAKIAogCXUzMgkJCWRvb3JiZWxsX3FwbjsKIAlfX2JlMzIJCQlzcV9zaWduYWxfYml0czsKKwl1bnNpZ25lZAkJc3FfbmV4dF93cWU7CisJaW50CQkJc3FfbWF4X3dxZXNfcGVyX3dyOwogCWludAkJCXNxX3NwYXJlX3dxZXM7CiAJc3RydWN0IG1seDRfaWJfd3EJc3E7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9xcC5jCmluZGV4IDhjYmE5YzUuLjk1OGUyMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvcXAuYwpAQCAtMzAsNiArMzAsOCBAQAogICogU09GVFdBUkUuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KKwogI2luY2x1ZGUgPHJkbWEvaWJfY2FjaGUuaD4KICNpbmNsdWRlIDxyZG1hL2liX3BhY2suaD4KIApAQCAtOTYsMTEgKzk4LDcgQEAKIAogc3RhdGljIHZvaWQgKmdldF93cWUoc3RydWN0IG1seDRfaWJfcXAgKnFwLCBpbnQgb2Zmc2V0KQogewotCWlmIChxcC0+YnVmLm5idWZzID09IDEpCi0JCXJldHVybiBxcC0+YnVmLnUuZGlyZWN0LmJ1ZiArIG9mZnNldDsKLQllbHNlCi0JCXJldHVybiBxcC0+YnVmLnUucGFnZV9saXN0W29mZnNldCA+PiBQQUdFX1NISUZUXS5idWYgKwotCQkJKG9mZnNldCAmIChQQUdFX1NJWkUgLSAxKSk7CisJcmV0dXJuIG1seDRfYnVmX29mZnNldCgmcXAtPmJ1Ziwgb2Zmc2V0KTsKIH0KIAogc3RhdGljIHZvaWQgKmdldF9yZWN2X3dxZShzdHJ1Y3QgbWx4NF9pYl9xcCAqcXAsIGludCBuKQpAQCAtMTE1LDE2ICsxMTMsODcgQEAKIAogLyoKICAqIFN0YW1wIGEgU1EgV1FFIHNvIHRoYXQgaXQgaXMgaW52YWxpZCBpZiBwcmVmZXRjaGVkIGJ5IG1hcmtpbmcgdGhlCi0gKiBmaXJzdCBmb3VyIGJ5dGVzIG9mIGV2ZXJ5IDY0IGJ5dGUgY2h1bmsgd2l0aCAweGZmZmZmZmZmLCBleGNlcHQgZm9yCi0gKiB0aGUgdmVyeSBmaXJzdCBjaHVuayBvZiB0aGUgV1FFLgorICogZmlyc3QgZm91ciBieXRlcyBvZiBldmVyeSA2NCBieXRlIGNodW5rIHdpdGgKKyAqICAgICAweDdGRkZGRkYgfCAoaW52YWxpZF9vd25lcnNoaXBfdmFsdWUgPDwgMzEpLgorICoKKyAqIFdoZW4gdGhlIG1heCB3b3JrIHJlcXVlc3Qgc2l6ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIFdRRQorICogYmFzaWMgYmxvY2sgc2l6ZSwgYXMgYW4gb3B0aW1pemF0aW9uLCB3ZSBjYW4gc3RhbXAgYWxsIFdRRXMgd2l0aAorICogMHhmZmZmZmZmZiwgYW5kIHNraXAgdGhlIHZlcnkgZmlyc3QgY2h1bmsgb2YgZWFjaCBXUUUuCiAgKi8KLXN0YXRpYyB2b2lkIHN0YW1wX3NlbmRfd3FlKHN0cnVjdCBtbHg0X2liX3FwICpxcCwgaW50IG4pCitzdGF0aWMgdm9pZCBzdGFtcF9zZW5kX3dxZShzdHJ1Y3QgbWx4NF9pYl9xcCAqcXAsIGludCBuLCBpbnQgc2l6ZSkKIHsKLQl1MzIgKndxZSA9IGdldF9zZW5kX3dxZShxcCwgbik7CisJdTMyICp3cWU7CiAJaW50IGk7CisJaW50IHM7CisJaW50IGluZDsKKwl2b2lkICpidWY7CisJX19iZTMyIHN0YW1wOwogCi0JZm9yIChpID0gMTY7IGkgPCAxIDw8IChxcC0+c3Eud3FlX3NoaWZ0IC0gMik7IGkgKz0gMTYpCi0JCXdxZVtpXSA9IDB4ZmZmZmZmZmY7CisJcyA9IHJvdW5kdXAoc2l6ZSwgMVUgPDwgcXAtPnNxLndxZV9zaGlmdCk7CisJaWYgKHFwLT5zcV9tYXhfd3Flc19wZXJfd3IgPiAxKSB7CisJCWZvciAoaSA9IDA7IGkgPCBzOyBpICs9IDY0KSB7CisJCQlpbmQgPSAoaSA+PiBxcC0+c3Eud3FlX3NoaWZ0KSArIG47CisJCQlzdGFtcCA9IGluZCAmIHFwLT5zcS53cWVfY250ID8gY3B1X3RvX2JlMzIoMHg3ZmZmZmZmZikgOgorCQkJCQkJICAgICAgIGNwdV90b19iZTMyKDB4ZmZmZmZmZmYpOworCQkJYnVmID0gZ2V0X3NlbmRfd3FlKHFwLCBpbmQgJiAocXAtPnNxLndxZV9jbnQgLSAxKSk7CisJCQl3cWUgPSBidWYgKyAoaSAmICgoMSA8PCBxcC0+c3Eud3FlX3NoaWZ0KSAtIDEpKTsKKwkJCSp3cWUgPSBzdGFtcDsKKwkJfQorCX0gZWxzZSB7CisJCWJ1ZiA9IGdldF9zZW5kX3dxZShxcCwgbiAmIChxcC0+c3Eud3FlX2NudCAtIDEpKTsKKwkJZm9yIChpID0gNjQ7IGkgPCBzOyBpICs9IDY0KSB7CisJCQl3cWUgPSBidWYgKyBpOworCQkJKndxZSA9IDB4ZmZmZmZmZmY7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBvc3Rfbm9wX3dxZShzdHJ1Y3QgbWx4NF9pYl9xcCAqcXAsIGludCBuLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgbWx4NF93cWVfY3RybF9zZWcgKmN0cmw7CisJc3RydWN0IG1seDRfd3FlX2lubGluZV9zZWcgKmlubDsKKwl2b2lkICp3cWU7CisJaW50IHM7CisKKwljdHJsID0gd3FlID0gZ2V0X3NlbmRfd3FlKHFwLCBuICYgKHFwLT5zcS53cWVfY250IC0gMSkpOworCXMgPSBzaXplb2Yoc3RydWN0IG1seDRfd3FlX2N0cmxfc2VnKTsKKworCWlmIChxcC0+aWJxcC5xcF90eXBlID09IElCX1FQVF9VRCkgeworCQlzdHJ1Y3QgbWx4NF93cWVfZGF0YWdyYW1fc2VnICpkZ3JhbSA9IHdxZSArIHNpemVvZiAqY3RybDsKKwkJc3RydWN0IG1seDRfYXYgKmF2ID0gKHN0cnVjdCBtbHg0X2F2ICopZGdyYW0tPmF2OworCQltZW1zZXQoZGdyYW0sIDAsIHNpemVvZiAqZGdyYW0pOworCQlhdi0+cG9ydF9wZCA9IGNwdV90b19iZTMyKChxcC0+cG9ydCA8PCAyNCkgfCB0b19tcGQocXAtPmlicXAucGQpLT5wZG4pOworCQlzICs9IHNpemVvZihzdHJ1Y3QgbWx4NF93cWVfZGF0YWdyYW1fc2VnKTsKKwl9CisKKwkvKiBQYWQgdGhlIHJlbWFpbmRlciBvZiB0aGUgV1FFIHdpdGggYW4gaW5saW5lIGRhdGEgc2VnbWVudC4gKi8KKwlpZiAoc2l6ZSA+IHMpIHsKKwkJaW5sID0gd3FlICsgczsKKwkJaW5sLT5ieXRlX2NvdW50ID0gY3B1X3RvX2JlMzIoMSA8PCAzMSB8IChzaXplIC0gcyAtIHNpemVvZiAqaW5sKSk7CisJfQorCWN0cmwtPnNyY3JiX2ZsYWdzID0gMDsKKwljdHJsLT5mZW5jZV9zaXplID0gc2l6ZSAvIDE2OworCS8qCisJICogTWFrZSBzdXJlIGRlc2NyaXB0b3IgaXMgZnVsbHkgd3JpdHRlbiBiZWZvcmUgc2V0dGluZyBvd25lcnNoaXAgYml0CisJICogKGJlY2F1c2UgSFcgY2FuIHN0YXJ0IGV4ZWN1dGluZyBhcyBzb29uIGFzIHdlIGRvKS4KKwkgKi8KKwl3bWIoKTsKKworCWN0cmwtPm93bmVyX29wY29kZSA9IGNwdV90b19iZTMyKE1MWDRfT1BDT0RFX05PUCB8IE1MWDRfV1FFX0NUUkxfTkVDKSB8CisJCShuICYgcXAtPnNxLndxZV9jbnQgPyBjcHVfdG9fYmUzMigxIDw8IDMxKSA6IDApOworCisJc3RhbXBfc2VuZF93cWUocXAsIG4gKyBxcC0+c3Ffc3BhcmVfd3Flcywgc2l6ZSk7Cit9CisKKy8qIFBvc3QgTk9QIFdRRSB0byBwcmV2ZW50IHdyYXAtYXJvdW5kIGluIHRoZSBtaWRkbGUgb2YgV1IgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgcGFkX3dyYXBhcm91bmQoc3RydWN0IG1seDRfaWJfcXAgKnFwLCBpbnQgaW5kKQoreworCXVuc2lnbmVkIHMgPSBxcC0+c3Eud3FlX2NudCAtIChpbmQgJiAocXAtPnNxLndxZV9jbnQgLSAxKSk7CisJaWYgKHVubGlrZWx5KHMgPCBxcC0+c3FfbWF4X3dxZXNfcGVyX3dyKSkgeworCQlwb3N0X25vcF93cWUocXAsIGluZCwgcyA8PCBxcC0+c3Eud3FlX3NoaWZ0KTsKKwkJaW5kICs9IHM7CisJfQorCXJldHVybiBpbmQ7CiB9CiAKIHN0YXRpYyB2b2lkIG1seDRfaWJfcXBfZXZlbnQoc3RydWN0IG1seDRfcXAgKnFwLCBlbnVtIG1seDRfZXZlbnQgdHlwZSkKQEAgLTI0MSw2ICszMTAsOCBAQAogc3RhdGljIGludCBzZXRfa2VybmVsX3NxX3NpemUoc3RydWN0IG1seDRfaWJfZGV2ICpkZXYsIHN0cnVjdCBpYl9xcF9jYXAgKmNhcCwKIAkJCSAgICAgIGVudW0gaWJfcXBfdHlwZSB0eXBlLCBzdHJ1Y3QgbWx4NF9pYl9xcCAqcXApCiB7CisJaW50IHM7CisKIAkvKiBTYW5pdHkgY2hlY2sgU1Egc2l6ZSBiZWZvcmUgcHJvY2VlZGluZyAqLwogCWlmIChjYXAtPm1heF9zZW5kX3dyCSA+IGRldi0+ZGV2LT5jYXBzLm1heF93cWVzICB8fAogCSAgICBjYXAtPm1heF9zZW5kX3NnZQkgPiBkZXYtPmRldi0+Y2Fwcy5tYXhfc3Ffc2cgfHwKQEAgLTI1NiwyMCArMzI3LDc0IEBACiAJICAgIGNhcC0+bWF4X3NlbmRfc2dlICsgMiA+IGRldi0+ZGV2LT5jYXBzLm1heF9zcV9zZykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlxcC0+c3Eud3FlX3NoaWZ0ID0gaWxvZzIocm91bmR1cF9wb3dfb2ZfdHdvKG1heChjYXAtPm1heF9zZW5kX3NnZSAqCi0JCQkJCQkJc2l6ZW9mIChzdHJ1Y3QgbWx4NF93cWVfZGF0YV9zZWcpLAotCQkJCQkJCWNhcC0+bWF4X2lubGluZV9kYXRhICsKLQkJCQkJCQlzaXplb2YgKHN0cnVjdCBtbHg0X3dxZV9pbmxpbmVfc2VnKSkgKwotCQkJCQkJICAgIHNlbmRfd3FlX292ZXJoZWFkKHR5cGUpKSk7Ci0JcXAtPnNxLm1heF9ncyAgICA9ICgoMSA8PCBxcC0+c3Eud3FlX3NoaWZ0KSAtIHNlbmRfd3FlX292ZXJoZWFkKHR5cGUpKSAvCi0JCXNpemVvZiAoc3RydWN0IG1seDRfd3FlX2RhdGFfc2VnKTsKKwlzID0gbWF4KGNhcC0+bWF4X3NlbmRfc2dlICogc2l6ZW9mIChzdHJ1Y3QgbWx4NF93cWVfZGF0YV9zZWcpLAorCQljYXAtPm1heF9pbmxpbmVfZGF0YSArIHNpemVvZiAoc3RydWN0IG1seDRfd3FlX2lubGluZV9zZWcpKSArCisJCXNlbmRfd3FlX292ZXJoZWFkKHR5cGUpOwogCiAJLyoKLQkgKiBXZSBuZWVkIHRvIGxlYXZlIDIgS0IgKyAxIFdRRSBvZiBoZWFkcm9vbSBpbiB0aGUgU1EgdG8KLQkgKiBhbGxvdyBIVyB0byBwcmVmZXRjaC4KKwkgKiBIZXJtb24gc3VwcG9ydHMgc2hyaW5raW5nIFdRRXMsIHN1Y2ggdGhhdCBhIHNpbmdsZSB3b3JrCisJICogcmVxdWVzdCBjYW4gaW5jbHVkZSBtdWx0aXBsZSB1bml0cyBvZiAxIDw8IHdxZV9zaGlmdC4gIFRoaXMKKwkgKiB3YXksIHdvcmsgcmVxdWVzdHMgY2FuIGRpZmZlciBpbiBzaXplLCBhbmQgZG8gbm90IGhhdmUgdG8KKwkgKiBiZSBhIHBvd2VyIG9mIDIgaW4gc2l6ZSwgc2F2aW5nIG1lbW9yeSBhbmQgc3BlZWRpbmcgdXAgc2VuZAorCSAqIFdSIHBvc3RpbmcuICBVbmZvcnR1bmF0ZWx5LCBpZiB3ZSBkbyB0aGlzIHRoZW4gdGhlCisJICogd3FlX2luZGV4IGZpZWxkIGluIENRRXMgY2FuJ3QgYmUgdXNlZCB0byBsb29rIHVwIHRoZSBXUiBJRAorCSAqIGFueW1vcmUsIHNvIHdlIGRvIHRoaXMgb25seSBpZiBzZWxlY3RpdmUgc2lnbmFsaW5nIGlzIG9mZi4KKwkgKgorCSAqIEZ1cnRoZXIsIG9uIDMyLWJpdCBwbGF0Zm9ybXMsIHdlIGNhbid0IHVzZSB2bWFwKCkgdG8gbWFrZQorCSAqIHRoZSBRUCBidWZmZXIgdmlydHVhbGx5IGNvbnRpZ2lvdXMuICBUaHVzIHdlIGhhdmUgdG8gdXNlCisJICogY29uc3RhbnQtc2l6ZWQgV1JzIHRvIG1ha2Ugc3VyZSBhIFdSIGlzIGFsd2F5cyBmdWxseSB3aXRoaW4KKwkgKiBhIHNpbmdsZSBwYWdlLXNpemVkIGNodW5rLgorCSAqCisJICogRmluYWxseSwgd2UgdXNlIE5PUCB3b3JrIHJlcXVlc3RzIHRvIHBhZCB0aGUgZW5kIG9mIHRoZQorCSAqIHdvcmsgcXVldWUsIHRvIGF2b2lkIHdyYXAtYXJvdW5kIGluIHRoZSBtaWRkbGUgb2YgV1IuICBXZQorCSAqIHNldCBORUMgYml0IHRvIGF2b2lkIGdldHRpbmcgY29tcGxldGlvbnMgd2l0aCBlcnJvciBmb3IKKwkgKiB0aGVzZSBOT1AgV1JzLCBidXQgc2luY2UgTkVDIGlzIG9ubHkgc3VwcG9ydGVkIHN0YXJ0aW5nCisJICogd2l0aCBmaXJtd2FyZSAyLjIuMjMyLCB3ZSB1c2UgY29uc3RhbnQtc2l6ZWQgV1JzIGZvciBvbGRlcgorCSAqIGZpcm13YXJlLgorCSAqCisJICogQW5kLCBzaW5jZSBNTFggUVBzIG9ubHkgc3VwcG9ydCBTRU5ELCB3ZSB1c2UgY29uc3RhbnQtc2l6ZWQKKwkgKiBXUnMgaW4gdGhpcyBjYXNlLgorCSAqCisJICogV2UgbG9vayBmb3IgdGhlIHNtYWxsZXN0IHZhbHVlIG9mIHdxZV9zaGlmdCBzdWNoIHRoYXQgdGhlCisJICogcmVzdWx0aW5nIG51bWJlciBvZiB3cWVzIGRvZXMgbm90IGV4Y2VlZCBkZXZpY2UKKwkgKiBjYXBhYmlsaXRpZXMuCisJICoKKwkgKiBXZSBzZXQgV1FFIHNpemUgdG8gYXQgbGVhc3QgNjQgYnl0ZXMsIHRoaXMgd2F5IHN0YW1waW5nCisJICogaW52YWxpZGF0ZXMgZWFjaCBXUUUuCiAJICovCi0JcXAtPnNxX3NwYXJlX3dxZXMgPSAoMjA0OCA+PiBxcC0+c3Eud3FlX3NoaWZ0KSArIDE7Ci0JcXAtPnNxLndxZV9jbnQgPSByb3VuZHVwX3Bvd19vZl90d28oY2FwLT5tYXhfc2VuZF93ciArIHFwLT5zcV9zcGFyZV93cWVzKTsKKwlpZiAoZGV2LT5kZXYtPmNhcHMuZndfdmVyID49IE1MWDRfRldfVkVSX1dRRV9DVFJMX05FQyAmJgorCSAgICBxcC0+c3Ffc2lnbmFsX2JpdHMgJiYgQklUU19QRVJfTE9ORyA9PSA2NCAmJgorCSAgICB0eXBlICE9IElCX1FQVF9TTUkgJiYgdHlwZSAhPSBJQl9RUFRfR1NJKQorCQlxcC0+c3Eud3FlX3NoaWZ0ID0gaWxvZzIoNjQpOworCWVsc2UKKwkJcXAtPnNxLndxZV9zaGlmdCA9IGlsb2cyKHJvdW5kdXBfcG93X29mX3R3byhzKSk7CisKKwlmb3IgKDs7KSB7CisJCWlmICgxIDw8IHFwLT5zcS53cWVfc2hpZnQgPiBkZXYtPmRldi0+Y2Fwcy5tYXhfc3FfZGVzY19zeikKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXFwLT5zcV9tYXhfd3Flc19wZXJfd3IgPSBESVZfUk9VTkRfVVAocywgMVUgPDwgcXAtPnNxLndxZV9zaGlmdCk7CisKKwkJLyoKKwkJICogV2UgbmVlZCB0byBsZWF2ZSAyIEtCICsgMSBXUiBvZiBoZWFkcm9vbSBpbiB0aGUgU1EgdG8KKwkJICogYWxsb3cgSFcgdG8gcHJlZmV0Y2guCisJCSAqLworCQlxcC0+c3Ffc3BhcmVfd3FlcyA9ICgyMDQ4ID4+IHFwLT5zcS53cWVfc2hpZnQpICsgcXAtPnNxX21heF93cWVzX3Blcl93cjsKKwkJcXAtPnNxLndxZV9jbnQgPSByb3VuZHVwX3Bvd19vZl90d28oY2FwLT5tYXhfc2VuZF93ciAqCisJCQkJCQkgICAgcXAtPnNxX21heF93cWVzX3Blcl93ciArCisJCQkJCQkgICAgcXAtPnNxX3NwYXJlX3dxZXMpOworCisJCWlmIChxcC0+c3Eud3FlX2NudCA8PSBkZXYtPmRldi0+Y2Fwcy5tYXhfd3FlcykKKwkJCWJyZWFrOworCisJCWlmIChxcC0+c3FfbWF4X3dxZXNfcGVyX3dyIDw9IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkrK3FwLT5zcS53cWVfc2hpZnQ7CisJfQorCisJcXAtPnNxLm1heF9ncyA9ICgocXAtPnNxX21heF93cWVzX3Blcl93ciA8PCBxcC0+c3Eud3FlX3NoaWZ0KSAtCisJCQkgc2VuZF93cWVfb3ZlcmhlYWQodHlwZSkpIC8gc2l6ZW9mIChzdHJ1Y3QgbWx4NF93cWVfZGF0YV9zZWcpOwogCiAJcXAtPmJ1Zl9zaXplID0gKHFwLT5ycS53cWVfY250IDw8IHFwLT5ycS53cWVfc2hpZnQpICsKIAkJKHFwLT5zcS53cWVfY250IDw8IHFwLT5zcS53cWVfc2hpZnQpOwpAQCAtMjgxLDcgKzQwNiw4IEBACiAJCXFwLT5zcS5vZmZzZXQgPSAwOwogCX0KIAotCWNhcC0+bWF4X3NlbmRfd3IgID0gcXAtPnNxLm1heF9wb3N0ID0gcXAtPnNxLndxZV9jbnQgLSBxcC0+c3Ffc3BhcmVfd3FlczsKKwljYXAtPm1heF9zZW5kX3dyICA9IHFwLT5zcS5tYXhfcG9zdCA9CisJCShxcC0+c3Eud3FlX2NudCAtIHFwLT5zcV9zcGFyZV93cWVzKSAvIHFwLT5zcV9tYXhfd3Flc19wZXJfd3I7CiAJY2FwLT5tYXhfc2VuZF9zZ2UgPSBxcC0+c3EubWF4X2dzOwogCS8qIFdlIGRvbid0IHN1cHBvcnQgaW5saW5lIHNlbmRzIGZvciBrZXJuZWwgUVBzICh5ZXQpICovCiAJY2FwLT5tYXhfaW5saW5lX2RhdGEgPSAwOwpAQCAtMzI3LDYgKzQ1MywxMiBAQAogCXFwLT5ycS50YWlsCSAgICA9IDA7CiAJcXAtPnNxLmhlYWQJICAgID0gMDsKIAlxcC0+c3EudGFpbAkgICAgPSAwOworCXFwLT5zcV9uZXh0X3dxZSAgICAgPSAwOworCisJaWYgKGluaXRfYXR0ci0+c3Ffc2lnX3R5cGUgPT0gSUJfU0lHTkFMX0FMTF9XUikKKwkJcXAtPnNxX3NpZ25hbF9iaXRzID0gY3B1X3RvX2JlMzIoTUxYNF9XUUVfQ1RSTF9DUV9VUERBVEUpOworCWVsc2UKKwkJcXAtPnNxX3NpZ25hbF9iaXRzID0gMDsKIAogCWVyciA9IHNldF9ycV9zaXplKGRldiwgJmluaXRfYXR0ci0+Y2FwLCAhIXBkLT51b2JqZWN0LCAhIWluaXRfYXR0ci0+c3JxLCBxcCk7CiAJaWYgKGVycikKQEAgLTQxNywxMSArNTQ5LDYgQEAKIAkgKi8KIAlxcC0+ZG9vcmJlbGxfcXBuID0gc3dhYjMyKHFwLT5tcXAucXBuIDw8IDgpOwogCi0JaWYgKGluaXRfYXR0ci0+c3Ffc2lnX3R5cGUgPT0gSUJfU0lHTkFMX0FMTF9XUikKLQkJcXAtPnNxX3NpZ25hbF9iaXRzID0gY3B1X3RvX2JlMzIoTUxYNF9XUUVfQ1RSTF9DUV9VUERBVEUpOwotCWVsc2UKLQkJcXAtPnNxX3NpZ25hbF9iaXRzID0gMDsKLQogCXFwLT5tcXAuZXZlbnQgPSBtbHg0X2liX3FwX2V2ZW50OwogCiAJcmV0dXJuIDA7CkBAIC05MTYsNyArMTA0Myw3IEBACiAJCQljdHJsID0gZ2V0X3NlbmRfd3FlKHFwLCBpKTsKIAkJCWN0cmwtPm93bmVyX29wY29kZSA9IGNwdV90b19iZTMyKDEgPDwgMzEpOwogCi0JCQlzdGFtcF9zZW5kX3dxZShxcCwgaSk7CisJCQlzdGFtcF9zZW5kX3dxZShxcCwgaSwgMSA8PCBxcC0+c3Eud3FlX3NoaWZ0KTsKIAkJfQogCX0KIApAQCAtOTY5LDYgKzEwOTYsNyBAQAogCQlxcC0+cnEudGFpbCA9IDA7CiAJCXFwLT5zcS5oZWFkID0gMDsKIAkJcXAtPnNxLnRhaWwgPSAwOworCQlxcC0+c3FfbmV4dF93cWUgPSAwOwogCQlpZiAoIWlicXAtPnNycSkKIAkJCSpxcC0+ZGIuZGIgID0gMDsKIAl9CkBAIC0xMjc4LDEzICsxNDA2LDE0IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgbnJlcTsKIAlpbnQgZXJyID0gMDsKLQlpbnQgaW5kOwotCWludCBzaXplOworCXVuc2lnbmVkIGluZDsKKwlpbnQgdW5pbml0aWFsaXplZF92YXIoc3RhbXApOworCWludCB1bmluaXRpYWxpemVkX3ZhcihzaXplKTsKIAlpbnQgaTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZxcC0+c3EubG9jaywgZmxhZ3MpOwogCi0JaW5kID0gcXAtPnNxLmhlYWQ7CisJaW5kID0gcXAtPnNxX25leHRfd3FlOwogCiAJZm9yIChucmVxID0gMDsgd3I7ICsrbnJlcSwgd3IgPSB3ci0+bmV4dCkgewogCQlpZiAobWx4NF93cV9vdmVyZmxvdygmcXAtPnNxLCBucmVxLCBxcC0+aWJxcC5zZW5kX2NxKSkgewpAQCAtMTMwMCw3ICsxNDI5LDcgQEAKIAkJfQogCiAJCWN0cmwgPSB3cWUgPSBnZXRfc2VuZF93cWUocXAsIGluZCAmIChxcC0+c3Eud3FlX2NudCAtIDEpKTsKLQkJcXAtPnNxLndyaWRbaW5kICYgKHFwLT5zcS53cWVfY250IC0gMSldID0gd3ItPndyX2lkOworCQlxcC0+c3Eud3JpZFsocXAtPnNxLmhlYWQgKyBucmVxKSAmIChxcC0+c3Eud3FlX2NudCAtIDEpXSA9IHdyLT53cl9pZDsKIAogCQljdHJsLT5zcmNyYl9mbGFncyA9CiAJCQkod3ItPnNlbmRfZmxhZ3MgJiBJQl9TRU5EX1NJR05BTEVEID8KQEAgLTE0MTMsMTYgKzE1NDIsMjMgQEAKIAkJY3RybC0+b3duZXJfb3Bjb2RlID0gbWx4NF9pYl9vcGNvZGVbd3ItPm9wY29kZV0gfAogCQkJKGluZCAmIHFwLT5zcS53cWVfY250ID8gY3B1X3RvX2JlMzIoMSA8PCAzMSkgOiAwKTsKIAorCQlzdGFtcCA9IGluZCArIHFwLT5zcV9zcGFyZV93cWVzOworCQlpbmQgKz0gRElWX1JPVU5EX1VQKHNpemUgKiAxNiwgMVUgPDwgcXAtPnNxLndxZV9zaGlmdCk7CisKIAkJLyoKIAkJICogV2UgY2FuIGltcHJvdmUgbGF0ZW5jeSBieSBub3Qgc3RhbXBpbmcgdGhlIGxhc3QKIAkJICogc2VuZCBxdWV1ZSBXUUUgdW50aWwgYWZ0ZXIgcmluZ2luZyB0aGUgZG9vcmJlbGwsIHNvCiAJCSAqIG9ubHkgc3RhbXAgaGVyZSBpZiB0aGVyZSBhcmUgc3RpbGwgbW9yZSBXUUVzIHRvIHBvc3QuCisJCSAqCisJCSAqIFNhbWUgb3B0aW1pemF0aW9uIGFwcGxpZXMgdG8gcGFkZGluZyB3aXRoIE5PUCB3cWUKKwkJICogaW4gY2FzZSBvZiBXUUUgc2hyaW5raW5nICh1c2VkIHRvIHByZXZlbnQgd3JhcC1hcm91bmQKKwkJICogaW4gdGhlIG1pZGRsZSBvZiBXUikuCiAJCSAqLwotCQlpZiAod3ItPm5leHQpCi0JCQlzdGFtcF9zZW5kX3dxZShxcCwgKGluZCArIHFwLT5zcV9zcGFyZV93cWVzKSAmCi0JCQkJICAgICAgIChxcC0+c3Eud3FlX2NudCAtIDEpKTsKKwkJaWYgKHdyLT5uZXh0KSB7CisJCQlzdGFtcF9zZW5kX3dxZShxcCwgc3RhbXAsIHNpemUgKiAxNik7CisJCQlpbmQgPSBwYWRfd3JhcGFyb3VuZChxcCwgaW5kKTsKKwkJfQogCi0JCSsraW5kOwogCX0KIAogb3V0OgpAQCAtMTQ0NCw4ICsxNTgwLDEwIEBACiAJCSAqLwogCQltbWlvd2IoKTsKIAotCQlzdGFtcF9zZW5kX3dxZShxcCwgKGluZCArIHFwLT5zcV9zcGFyZV93cWVzIC0gMSkgJgotCQkJICAgICAgIChxcC0+c3Eud3FlX2NudCAtIDEpKTsKKwkJc3RhbXBfc2VuZF93cWUocXAsIHN0YW1wLCBzaXplICogMTYpOworCisJCWluZCA9IHBhZF93cmFwYXJvdW5kKHFwLCBpbmQpOworCQlxcC0+c3FfbmV4dF93cWUgPSBpbmQ7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXAtPnNxLmxvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L3NycS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvc3JxLmMKaW5kZXggZTdlOWEzZC4uYmVhYTNiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvc3JxLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvc3JxLmMKQEAgLTM4LDEzICszOCw3IEBACiAKIHN0YXRpYyB2b2lkICpnZXRfd3FlKHN0cnVjdCBtbHg0X2liX3NycSAqc3JxLCBpbnQgbikKIHsKLQlpbnQgb2Zmc2V0ID0gbiA8PCBzcnEtPm1zcnEud3FlX3NoaWZ0OwotCi0JaWYgKHNycS0+YnVmLm5idWZzID09IDEpCi0JCXJldHVybiBzcnEtPmJ1Zi51LmRpcmVjdC5idWYgKyBvZmZzZXQ7Ci0JZWxzZQotCQlyZXR1cm4gc3JxLT5idWYudS5wYWdlX2xpc3Rbb2Zmc2V0ID4+IFBBR0VfU0hJRlRdLmJ1ZiArCi0JCQkob2Zmc2V0ICYgKFBBR0VfU0laRSAtIDEpKTsKKwlyZXR1cm4gbWx4NF9idWZfb2Zmc2V0KCZzcnEtPmJ1ZiwgbiA8PCBzcnEtPm1zcnEud3FlX3NoaWZ0KTsKIH0KIAogc3RhdGljIHZvaWQgbWx4NF9pYl9zcnFfZXZlbnQoc3RydWN0IG1seDRfc3JxICpzcnEsIGVudW0gbWx4NF9ldmVudCB0eXBlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYi5oIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYi5oCmluZGV4IGZlMjUwYzYuLmY5YjdjYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWIuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liLmgKQEAgLTE0Myw3ICsxNDMsNyBAQAogCiBzdHJ1Y3QgaXBvaWJfdHhfYnVmIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXU2NAkJbWFwcGluZzsKKwl1NjQJCW1hcHBpbmdbTUFYX1NLQl9GUkFHUyArIDFdOwogfTsKIAogc3RydWN0IGliX2NtX2lkOwpAQCAtMjk2LDcgKzI5Niw3IEBACiAJc3RydWN0IGlwb2liX3R4X2J1ZiAqdHhfcmluZzsKIAl1bnNpZ25lZAkgICAgIHR4X2hlYWQ7CiAJdW5zaWduZWQJICAgICB0eF90YWlsOwotCXN0cnVjdCBpYl9zZ2UJICAgICB0eF9zZ2U7CisJc3RydWN0IGliX3NnZQkgICAgIHR4X3NnZVtNQVhfU0tCX0ZSQUdTICsgMV07CiAJc3RydWN0IGliX3NlbmRfd3IgICAgdHhfd3I7CiAJdW5zaWduZWQJICAgICB0eF9vdXRzdGFuZGluZzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9jbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9jbS5jCmluZGV4IDE4MThmOTUuLjdkZDJlYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2NtLmMKQEAgLTYzNCw4ICs2MzQsOCBAQAogewogCXN0cnVjdCBpYl9zZW5kX3dyICpiYWRfd3I7CiAKLQlwcml2LT50eF9zZ2UuYWRkcgk9IGFkZHI7Ci0JcHJpdi0+dHhfc2dlLmxlbmd0aAk9IGxlbjsKKwlwcml2LT50eF9zZ2VbMF0uYWRkciAgICAgICAgICA9IGFkZHI7CisJcHJpdi0+dHhfc2dlWzBdLmxlbmd0aCAgICAgICAgPSBsZW47CiAKIAlwcml2LT50eF93ci53cl9pZAk9IHdyX2lkIHwgSVBPSUJfT1BfQ007CiAKQEAgLTY3Niw3ICs2NzYsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JdHhfcmVxLT5tYXBwaW5nID0gYWRkcjsKKwl0eF9yZXEtPm1hcHBpbmdbMF0gPSBhZGRyOwogCiAJaWYgKHVubGlrZWx5KHBvc3Rfc2VuZChwcml2LCB0eCwgdHgtPnR4X2hlYWQgJiAoaXBvaWJfc2VuZHFfc2l6ZSAtIDEpLAogCQkJICAgICAgIGFkZHIsIHNrYi0+bGVuKSkpIHsKQEAgLTcxNSw3ICs3MTUsNyBAQAogCiAJdHhfcmVxID0gJnR4LT50eF9yaW5nW3dyX2lkXTsKIAotCWliX2RtYV91bm1hcF9zaW5nbGUocHJpdi0+Y2EsIHR4X3JlcS0+bWFwcGluZywgdHhfcmVxLT5za2ItPmxlbiwgRE1BX1RPX0RFVklDRSk7CisJaWJfZG1hX3VubWFwX3NpbmdsZShwcml2LT5jYSwgdHhfcmVxLT5tYXBwaW5nWzBdLCB0eF9yZXEtPnNrYi0+bGVuLCBETUFfVE9fREVWSUNFKTsKIAogCS8qIEZJWE1FOiBpcyB0aGlzIHJpZ2h0PyBTaG91bGRuJ3Qgd2Ugb25seSBpbmNyZW1lbnQgb24gc3VjY2Vzcz8gKi8KIAkrK2Rldi0+c3RhdHMudHhfcGFja2V0czsKQEAgLTExMTAsNyArMTExMCw3IEBACiAKIAl3aGlsZSAoKGludCkgcC0+dHhfdGFpbCAtIChpbnQpIHAtPnR4X2hlYWQgPCAwKSB7CiAJCXR4X3JlcSA9ICZwLT50eF9yaW5nW3AtPnR4X3RhaWwgJiAoaXBvaWJfc2VuZHFfc2l6ZSAtIDEpXTsKLQkJaWJfZG1hX3VubWFwX3NpbmdsZShwcml2LT5jYSwgdHhfcmVxLT5tYXBwaW5nLCB0eF9yZXEtPnNrYi0+bGVuLAorCQlpYl9kbWFfdW5tYXBfc2luZ2xlKHByaXYtPmNhLCB0eF9yZXEtPm1hcHBpbmdbMF0sIHR4X3JlcS0+c2tiLT5sZW4sCiAJCQkJICAgIERNQV9UT19ERVZJQ0UpOwogCQlkZXZfa2ZyZWVfc2tiX2FueSh0eF9yZXEtPnNrYik7CiAJCSsrcC0+dHhfdGFpbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfaWIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfaWIuYwppbmRleCA1MmJjMmJkNS4uOWQzZTc3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9pYi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfaWIuYwpAQCAtMjM5LDYgKzIzOSw1NCBAQAogCQkJICAgImZvciBidWYgJWRcbiIsIHdyX2lkKTsKIH0KIAorc3RhdGljIGludCBpcG9pYl9kbWFfbWFwX3R4KHN0cnVjdCBpYl9kZXZpY2UgKmNhLAorCQkJICAgIHN0cnVjdCBpcG9pYl90eF9idWYgKnR4X3JlcSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHhfcmVxLT5za2I7CisJdTY0ICptYXBwaW5nID0gdHhfcmVxLT5tYXBwaW5nOworCWludCBpOworCisJbWFwcGluZ1swXSA9IGliX2RtYV9tYXBfc2luZ2xlKGNhLCBza2ItPmRhdGEsIHNrYl9oZWFkbGVuKHNrYiksCisJCQkJICAgICAgIERNQV9UT19ERVZJQ0UpOworCWlmICh1bmxpa2VseShpYl9kbWFfbWFwcGluZ19lcnJvcihjYSwgbWFwcGluZ1swXSkpKQorCQlyZXR1cm4gLUVJTzsKKworCWZvciAoaSA9IDA7IGkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyArK2kpIHsKKwkJc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCQltYXBwaW5nW2kgKyAxXSA9IGliX2RtYV9tYXBfcGFnZShjYSwgZnJhZy0+cGFnZSwKKwkJCQkJCSBmcmFnLT5wYWdlX29mZnNldCwgZnJhZy0+c2l6ZSwKKwkJCQkJCSBETUFfVE9fREVWSUNFKTsKKwkJaWYgKHVubGlrZWx5KGliX2RtYV9tYXBwaW5nX2Vycm9yKGNhLCBtYXBwaW5nW2kgKyAxXSkpKQorCQkJZ290byBwYXJ0aWFsX2Vycm9yOworCX0KKwlyZXR1cm4gMDsKKworcGFydGlhbF9lcnJvcjoKKwlpYl9kbWFfdW5tYXBfc2luZ2xlKGNhLCBtYXBwaW5nWzBdLCBza2JfaGVhZGxlbihza2IpLCBETUFfVE9fREVWSUNFKTsKKworCWZvciAoOyBpID4gMDsgLS1pKSB7CisJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpIC0gMV07CisJCWliX2RtYV91bm1hcF9wYWdlKGNhLCBtYXBwaW5nW2ldLCBmcmFnLT5zaXplLCBETUFfVE9fREVWSUNFKTsKKwl9CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyB2b2lkIGlwb2liX2RtYV91bm1hcF90eChzdHJ1Y3QgaWJfZGV2aWNlICpjYSwKKwkJCSAgICAgICBzdHJ1Y3QgaXBvaWJfdHhfYnVmICp0eF9yZXEpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4X3JlcS0+c2tiOworCXU2NCAqbWFwcGluZyA9IHR4X3JlcS0+bWFwcGluZzsKKwlpbnQgaTsKKworCWliX2RtYV91bm1hcF9zaW5nbGUoY2EsIG1hcHBpbmdbMF0sIHNrYl9oZWFkbGVuKHNrYiksIERNQV9UT19ERVZJQ0UpOworCisJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7ICsraSkgeworCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisJCWliX2RtYV91bm1hcF9wYWdlKGNhLCBtYXBwaW5nW2kgKyAxXSwgZnJhZy0+c2l6ZSwKKwkJCQkgIERNQV9UT19ERVZJQ0UpOworCX0KK30KKwogc3RhdGljIHZvaWQgaXBvaWJfaWJfaGFuZGxlX3R4X3djKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpYl93YyAqd2MpCiB7CiAJc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTI1Nyw4ICszMDUsNyBAQAogCiAJdHhfcmVxID0gJnByaXYtPnR4X3Jpbmdbd3JfaWRdOwogCi0JaWJfZG1hX3VubWFwX3NpbmdsZShwcml2LT5jYSwgdHhfcmVxLT5tYXBwaW5nLAotCQkJICAgIHR4X3JlcS0+c2tiLT5sZW4sIERNQV9UT19ERVZJQ0UpOworCWlwb2liX2RtYV91bm1hcF90eChwcml2LT5jYSwgdHhfcmVxKTsKIAogCSsrZGV2LT5zdGF0cy50eF9wYWNrZXRzOwogCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gdHhfcmVxLT5za2ItPmxlbjsKQEAgLTM0MSwxNiArMzg4LDIzIEBACiBzdGF0aWMgaW5saW5lIGludCBwb3N0X3NlbmQoc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2LAogCQkJICAgIHVuc2lnbmVkIGludCB3cl9pZCwKIAkJCSAgICBzdHJ1Y3QgaWJfYWggKmFkZHJlc3MsIHUzMiBxcG4sCi0JCQkgICAgdTY0IGFkZHIsIGludCBsZW4pCisJCQkgICAgdTY0ICptYXBwaW5nLCBpbnQgaGVhZGxlbiwKKwkJCSAgICBza2JfZnJhZ190ICpmcmFncywKKwkJCSAgICBpbnQgbnJfZnJhZ3MpCiB7CiAJc3RydWN0IGliX3NlbmRfd3IgKmJhZF93cjsKKwlpbnQgaTsKIAotCXByaXYtPnR4X3NnZS5hZGRyCSAgICAgID0gYWRkcjsKLQlwcml2LT50eF9zZ2UubGVuZ3RoCSAgICAgID0gbGVuOwotCi0JcHJpdi0+dHhfd3Iud3JfaWQJICAgICAgPSB3cl9pZDsKLQlwcml2LT50eF93ci53ci51ZC5yZW1vdGVfcXBuICA9IHFwbjsKLQlwcml2LT50eF93ci53ci51ZC5haAkgICAgICA9IGFkZHJlc3M7CisJcHJpdi0+dHhfc2dlWzBdLmFkZHIJICAgICA9IG1hcHBpbmdbMF07CisJcHJpdi0+dHhfc2dlWzBdLmxlbmd0aCAgICAgICA9IGhlYWRsZW47CisJZm9yIChpID0gMDsgaSA8IG5yX2ZyYWdzOyArK2kpIHsKKwkJcHJpdi0+dHhfc2dlW2kgKyAxXS5hZGRyID0gbWFwcGluZ1tpICsgMV07CisJCXByaXYtPnR4X3NnZVtpICsgMV0ubGVuZ3RoID0gZnJhZ3NbaV0uc2l6ZTsKKwl9CisJcHJpdi0+dHhfd3IubnVtX3NnZQkgICAgID0gbnJfZnJhZ3MgKyAxOworCXByaXYtPnR4X3dyLndyX2lkIAkgICAgID0gd3JfaWQ7CisJcHJpdi0+dHhfd3Iud3IudWQucmVtb3RlX3FwbiA9IHFwbjsKKwlwcml2LT50eF93ci53ci51ZC5haCAJICAgICA9IGFkZHJlc3M7CiAKIAlyZXR1cm4gaWJfcG9zdF9zZW5kKHByaXYtPnFwLCAmcHJpdi0+dHhfd3IsICZiYWRfd3IpOwogfQpAQCAtMzYwLDcgKzQxNCw2IEBACiB7CiAJc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXBvaWJfdHhfYnVmICp0eF9yZXE7Ci0JdTY0IGFkZHI7CiAKIAlpZiAodW5saWtlbHkoc2tiLT5sZW4gPiBwcml2LT5tY2FzdF9tdHUgKyBJUE9JQl9FTkNBUF9MRU4pKSB7CiAJCWlwb2liX3dhcm4ocHJpdiwgInBhY2tldCBsZW4gJWQgKD4gJWQpIHRvbyBsb25nIHRvIHNlbmQsIGRyb3BwaW5nXG4iLApAQCAtMzgzLDIwICs0MzYsMTkgQEAKIAkgKi8KIAl0eF9yZXEgPSAmcHJpdi0+dHhfcmluZ1twcml2LT50eF9oZWFkICYgKGlwb2liX3NlbmRxX3NpemUgLSAxKV07CiAJdHhfcmVxLT5za2IgPSBza2I7Ci0JYWRkciA9IGliX2RtYV9tYXBfc2luZ2xlKHByaXYtPmNhLCBza2ItPmRhdGEsIHNrYi0+bGVuLAotCQkJCSBETUFfVE9fREVWSUNFKTsKLQlpZiAodW5saWtlbHkoaWJfZG1hX21hcHBpbmdfZXJyb3IocHJpdi0+Y2EsIGFkZHIpKSkgeworCWlmICh1bmxpa2VseShpcG9pYl9kbWFfbWFwX3R4KHByaXYtPmNhLCB0eF9yZXEpKSkgewogCQkrK2Rldi0+c3RhdHMudHhfZXJyb3JzOwogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQlyZXR1cm47CiAJfQotCXR4X3JlcS0+bWFwcGluZyA9IGFkZHI7CiAKIAlpZiAodW5saWtlbHkocG9zdF9zZW5kKHByaXYsIHByaXYtPnR4X2hlYWQgJiAoaXBvaWJfc2VuZHFfc2l6ZSAtIDEpLAotCQkJICAgICAgIGFkZHJlc3MtPmFoLCBxcG4sIGFkZHIsIHNrYi0+bGVuKSkpIHsKKwkJCSAgICAgICBhZGRyZXNzLT5haCwgcXBuLAorCQkJICAgICAgIHR4X3JlcS0+bWFwcGluZywgc2tiX2hlYWRsZW4oc2tiKSwKKwkJCSAgICAgICBza2Jfc2hpbmZvKHNrYiktPmZyYWdzLCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKSkpIHsKIAkJaXBvaWJfd2Fybihwcml2LCAicG9zdF9zZW5kIGZhaWxlZFxuIik7CiAJCSsrZGV2LT5zdGF0cy50eF9lcnJvcnM7Ci0JCWliX2RtYV91bm1hcF9zaW5nbGUocHJpdi0+Y2EsIGFkZHIsIHNrYi0+bGVuLCBETUFfVE9fREVWSUNFKTsKKwkJaXBvaWJfZG1hX3VubWFwX3R4KHByaXYtPmNhLCB0eF9yZXEpOwogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCX0gZWxzZSB7CiAJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwpAQCAtNjE1LDEwICs2NjcsNyBAQAogCQkJd2hpbGUgKChpbnQpIHByaXYtPnR4X3RhaWwgLSAoaW50KSBwcml2LT50eF9oZWFkIDwgMCkgewogCQkJCXR4X3JlcSA9ICZwcml2LT50eF9yaW5nW3ByaXYtPnR4X3RhaWwgJgogCQkJCQkJCShpcG9pYl9zZW5kcV9zaXplIC0gMSldOwotCQkJCWliX2RtYV91bm1hcF9zaW5nbGUocHJpdi0+Y2EsCi0JCQkJCQkgICAgdHhfcmVxLT5tYXBwaW5nLAotCQkJCQkJICAgIHR4X3JlcS0+c2tiLT5sZW4sCi0JCQkJCQkgICAgRE1BX1RPX0RFVklDRSk7CisJCQkJaXBvaWJfZG1hX3VubWFwX3R4KHByaXYtPmNhLCB0eF9yZXEpOwogCQkJCWRldl9rZnJlZV9za2JfYW55KHR4X3JlcS0+c2tiKTsKIAkJCQkrK3ByaXYtPnR4X3RhaWw7CiAJCQkJLS1wcml2LT50eF9vdXRzdGFuZGluZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMKaW5kZXggMDlmNTM3MS4uZjk2NDc3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMKQEAgLTk2NSw3ICs5NjUsOSBAQAogCWRldi0+YWRkcl9sZW4JCSA9IElORklOSUJBTkRfQUxFTjsKIAlkZXYtPnR5cGUJCSA9IEFSUEhSRF9JTkZJTklCQU5EOwogCWRldi0+dHhfcXVldWVfbGVuCSA9IGlwb2liX3NlbmRxX3NpemUgKiAyOwotCWRldi0+ZmVhdHVyZXMJCSA9IE5FVElGX0ZfVkxBTl9DSEFMTEVOR0VEIHwgTkVUSUZfRl9MTFRYOworCWRldi0+ZmVhdHVyZXMJCSA9IChORVRJRl9GX1ZMQU5fQ0hBTExFTkdFRAl8CisJCQkJICAgIE5FVElGX0ZfTExUWAkJfAorCQkJCSAgICBORVRJRl9GX0hJR0hETUEpOwogCiAJLyogTVRVIHdpbGwgYmUgcmVzZXQgd2hlbiBtY2FzdCBqb2luIGhhcHBlbnMgKi8KIAlkZXYtPm10dQkJID0gSVBPSUJfUEFDS0VUX1NJWkUgLSBJUE9JQl9FTkNBUF9MRU47CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX3ZlcmJzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX3ZlcmJzLmMKaW5kZXggNDMzZTk5YS4uYTNhZWI5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl92ZXJicy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfdmVyYnMuYwpAQCAtMTU3LDYgKzE1Nyw3IEBACiAJfTsKIAogCWludCByZXQsIHNpemU7CisJaW50IGk7CiAKIAlwcml2LT5wZCA9IGliX2FsbG9jX3BkKHByaXYtPmNhKTsKIAlpZiAoSVNfRVJSKHByaXYtPnBkKSkgewpAQCAtMTkxLDYgKzE5Miw5IEBACiAJaW5pdF9hdHRyLnNlbmRfY3EgPSBwcml2LT5jcTsKIAlpbml0X2F0dHIucmVjdl9jcSA9IHByaXYtPmNxOwogCisJaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1NHKQorCQlpbml0X2F0dHIuY2FwLm1heF9zZW5kX3NnZSA9IE1BWF9TS0JfRlJBR1MgKyAxOworCiAJcHJpdi0+cXAgPSBpYl9jcmVhdGVfcXAocHJpdi0+cGQsICZpbml0X2F0dHIpOwogCWlmIChJU19FUlIocHJpdi0+cXApKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBmYWlsZWQgdG8gY3JlYXRlIFFQXG4iLCBjYS0+bmFtZSk7CkBAIC0yMDEsMTEgKzIwNSwxMSBAQAogCXByaXYtPmRldi0+ZGV2X2FkZHJbMl0gPSAocHJpdi0+cXAtPnFwX251bSA+PiAgOCkgJiAweGZmOwogCXByaXYtPmRldi0+ZGV2X2FkZHJbM10gPSAocHJpdi0+cXAtPnFwX251bSAgICAgICkgJiAweGZmOwogCi0JcHJpdi0+dHhfc2dlLmxrZXkJPSBwcml2LT5tci0+bGtleTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1NLQl9GUkFHUyArIDE7ICsraSkKKwkJcHJpdi0+dHhfc2dlW2ldLmxrZXkgPSBwcml2LT5tci0+bGtleTsKIAogCXByaXYtPnR4X3dyLm9wY29kZQk9IElCX1dSX1NFTkQ7Ci0JcHJpdi0+dHhfd3Iuc2dfbGlzdAk9ICZwcml2LT50eF9zZ2U7Ci0JcHJpdi0+dHhfd3IubnVtX3NnZQk9IDE7CisJcHJpdi0+dHhfd3Iuc2dfbGlzdAk9IHByaXYtPnR4X3NnZTsKIAlwcml2LT50eF93ci5zZW5kX2ZsYWdzCT0gSUJfU0VORF9TSUdOQUxFRDsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9LY29uZmlnIGIvZHJpdmVycy9pbnB1dC9LY29uZmlnCmluZGV4IDYzNTEyZDkuLjlkZWExNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvS2NvbmZpZworKysgYi9kcml2ZXJzL2lucHV0L0tjb25maWcKQEAgLTEzNyw2ICsxMzcsMTggQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGV2YnVnLgogCitjb25maWcgSU5QVVRfQVBNUE9XRVIKKwl0cmlzdGF0ZSAiSW5wdXQgUG93ZXIgRXZlbnQgLT4gQVBNIEJyaWRnZSIgaWYgRU1CRURERUQKKwlkZXBlbmRzIG9uIElOUFVUICYmIEFQTV9FTVVMQVRJT04KKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1c3BlbmQga2V5IGV2ZW50cyB0byB0cmlnZ2VyIGEgdXNlcgorCSAgcmVxdWVzdGVkIHN1c3BlbmQgdGhyb3VnaCBBUE0uIFRoaXMgaXMgdXNlZnVsIG9uIGVtYmVkZGVkCisJICBzeXN0ZW1zIHdoZXJlIHN1Y2ggYmVodmlvdXIgaXMgZGVzaXJlZCB3aXRob3V0IHVzZXJzcGFjZQorCSAgaW50ZXJhY3Rpb24uIElmIHVuc3VyZSwgc2F5IE4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFwbS1wb3dlci4KKwogY29tbWVudCAiSW5wdXQgRGV2aWNlIERyaXZlcnMiCiAKIHNvdXJjZSAiZHJpdmVycy9pbnB1dC9rZXlib2FyZC9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9NYWtlZmlsZSBiL2RyaXZlcnMvaW5wdXQvTWFrZWZpbGUKaW5kZXggOTlhZjkwMy4uMmFlODdiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lucHV0L01ha2VmaWxlCkBAIC0yMiwzICsyMiw0IEBACiBvYmotJChDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4pCSs9IHRvdWNoc2NyZWVuLwogb2JqLSQoQ09ORklHX0lOUFVUX01JU0MpCSs9IG1pc2MvCiAKK29iai0kKENPTkZJR19JTlBVVF9BUE1QT1dFUikJKz0gYXBtLXBvd2VyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvYXBtLXBvd2VyLmMgYi9kcml2ZXJzL2lucHV0L2FwbS1wb3dlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNmQxMTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L2FwbS1wb3dlci5jCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogIElucHV0IFBvd2VyIEV2ZW50IC0+IEFQTSBCcmlkZ2UKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA3IFJpY2hhcmQgUHVyZGllCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvYXBtLWVtdWxhdGlvbi5oPgorCitzdGF0aWMgdm9pZCBzeXN0ZW1fcG93ZXJfZXZlbnQodW5zaWduZWQgaW50IGtleWNvZGUpCit7CisJc3dpdGNoIChrZXljb2RlKSB7CisJY2FzZSBLRVlfU1VTUEVORDoKKwkJYXBtX3F1ZXVlX2V2ZW50KEFQTV9VU0VSX1NVU1BFTkQpOworCisJCXByaW50ayhLRVJOX0lORk8gImFwbS1wb3dlcjogUmVxdWVzdGluZyBzeXN0ZW0gc3VzcGVuZC4uLlxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgYXBtcG93ZXJfZXZlbnQoc3RydWN0IGlucHV0X2hhbmRsZSAqaGFuZGxlLCB1bnNpZ25lZCBpbnQgdHlwZSwKKwkJICAgICAgICB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHZhbHVlKQoreworCS8qIG9ubHkgcmVhY3Qgb24ga2V5IGRvd24gZXZlbnRzICovCisJaWYgKHZhbHVlICE9IDEpCisJCXJldHVybjsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgRVZfUFdSOgorCQlzeXN0ZW1fcG93ZXJfZXZlbnQoY29kZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGFwbXBvd2VyX2Nvbm5lY3Qoc3RydWN0IGlucHV0X2hhbmRsZXIgKmhhbmRsZXIsCisJCQkJCSAgc3RydWN0IGlucHV0X2RldiAqZGV2LAorCQkJCQkgIGNvbnN0IHN0cnVjdCBpbnB1dF9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZTsKKwlpbnQgZXJyb3I7CisKKwloYW5kbGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW5wdXRfaGFuZGxlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoYW5kbGUpCisJCXJldHVybiAtRU5PTUVNOworCisJaGFuZGxlLT5kZXYgPSBkZXY7CisJaGFuZGxlLT5oYW5kbGVyID0gaGFuZGxlcjsKKwloYW5kbGUtPm5hbWUgPSAiYXBtLXBvd2VyIjsKKworCWhhbmRsZXItPnByaXZhdGUgPSBoYW5kbGU7CisKKwllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2hhbmRsZShoYW5kbGUpOworCWlmIChlcnJvcikgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJhcG0tcG93ZXI6IEZhaWxlZCB0byByZWdpc3RlciBpbnB1dCBwb3dlciBoYW5kbGVyLCAiCisJCQkiZXJyb3IgJWRcbiIsIGVycm9yKTsKKwkJa2ZyZWUoaGFuZGxlKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWVycm9yID0gaW5wdXRfb3Blbl9kZXZpY2UoaGFuZGxlKTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiYXBtLXBvd2VyOiBGYWlsZWQgdG8gb3BlbiBpbnB1dCBwb3dlciBkZXZpY2UsICIKKwkJCSJlcnJvciAlZFxuIiwgZXJyb3IpOworCQlpbnB1dF91bnJlZ2lzdGVyX2hhbmRsZShoYW5kbGUpOworCQlrZnJlZShoYW5kbGUpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFwbXBvd2VyX2Rpc2Nvbm5lY3Qoc3RydWN0IGlucHV0X2hhbmRsZSAqaGFuZGxlcikKK3sKKwlzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUgPSBoYW5kbGVyLT5wcml2YXRlOworCisJaW5wdXRfY2xvc2VfZGV2aWNlKGhhbmRsZSk7CisJa2ZyZWUoaGFuZGxlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbnB1dF9kZXZpY2VfaWQgYXBtcG93ZXJfaWRzW10gPSB7CisJeworCQkuZmxhZ3MgPSBJTlBVVF9ERVZJQ0VfSURfTUFUQ0hfRVZCSVQsCisJCS5ldmJpdCA9IHsgQklUX01BU0soRVZfUFdSKSB9LAorCX0sCisJeyB9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShpbnB1dCwgYXBtcG93ZXJfaWRzKTsKKworc3RhdGljIHN0cnVjdCBpbnB1dF9oYW5kbGVyIGFwbXBvd2VyX2hhbmRsZXIgPSB7CisJLmV2ZW50ID0JYXBtcG93ZXJfZXZlbnQsCisJLmNvbm5lY3QgPQlhcG1wb3dlcl9jb25uZWN0LAorCS5kaXNjb25uZWN0ID0JYXBtcG93ZXJfZGlzY29ubmVjdCwKKwkubmFtZSA9CQkiYXBtLXBvd2VyIiwKKwkuaWRfdGFibGUgPQlhcG1wb3dlcl9pZHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhcG1wb3dlcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlucHV0X3JlZ2lzdGVyX2hhbmRsZXIoJmFwbXBvd2VyX2hhbmRsZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXBtcG93ZXJfZXhpdCh2b2lkKQoreworCWlucHV0X3VucmVnaXN0ZXJfaGFuZGxlcigmYXBtcG93ZXJfaGFuZGxlcik7Cit9CisKK21vZHVsZV9pbml0KGFwbXBvd2VyX2luaXQpOworbW9kdWxlX2V4aXQoYXBtcG93ZXJfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlJpY2hhcmQgUHVyZGllIDxycHVyZGllQHJwc3lzLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW5wdXQgUG93ZXIgRXZlbnQgLT4gQVBNIEJyaWRnZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9ldmRldi5jIGIvZHJpdmVycy9pbnB1dC9ldmRldi5jCmluZGV4IGU1YjRlOWIuLjA3MjdiMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvZXZkZXYuYworKysgYi9kcml2ZXJzL2lucHV0L2V2ZGV2LmMKQEAgLTYxNyw3ICs2MTcsNyBAQAogCQlpZiAoZ2V0X3VzZXIodCwgaXApKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkJZXJyb3IgPSBkZXYtPmdldGtleWNvZGUoZGV2LCB0LCAmdik7CisJCWVycm9yID0gaW5wdXRfZ2V0X2tleWNvZGUoZGV2LCB0LCAmdik7CiAJCWlmIChlcnJvcikKIAkJCXJldHVybiBlcnJvcjsKIApAQCAtNjMwLDcgKzYzMCw3IEBACiAJCWlmIChnZXRfdXNlcih0LCBpcCkgfHwgZ2V0X3VzZXIodiwgaXAgKyAxKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCi0JCXJldHVybiBkZXYtPnNldGtleWNvZGUoZGV2LCB0LCB2KTsKKwkJcmV0dXJuIGlucHV0X3NldF9rZXljb2RlKGRldiwgdCwgdik7CiAKIAljYXNlIEVWSU9DU0ZGOgogCQlpZiAoY29weV9mcm9tX3VzZXIoJmVmZmVjdCwgcCwgc2l6ZW9mKGVmZmVjdCkpKQpAQCAtNjgzLDcgKzY4Myw3IEBACiAJCQkJY2FzZSBFVl9GRjogIGJpdHMgPSBkZXYtPmZmYml0OyAgbGVuID0gRkZfTUFYOyAgYnJlYWs7CiAJCQkJY2FzZSBFVl9TVzogIGJpdHMgPSBkZXYtPnN3Yml0OyAgbGVuID0gU1dfTUFYOyAgYnJlYWs7CiAJCQkJZGVmYXVsdDogcmV0dXJuIC1FSU5WQUw7Ci0JCQl9CisJCQkJfQogCQkJCXJldHVybiBiaXRzX3RvX3VzZXIoYml0cywgbGVuLCBfSU9DX1NJWkUoY21kKSwgcCwgY29tcGF0X21vZGUpOwogCQkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2lucHV0LXBvbGxkZXYuYyBiL2RyaXZlcnMvaW5wdXQvaW5wdXQtcG9sbGRldi5jCmluZGV4IDkyYjM1OTguLjQ5MDkxOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvaW5wdXQtcG9sbGRldi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvaW5wdXQtcG9sbGRldi5jCkBAIC02MCwxNyArNjAsMjEgQEAKIHsKIAlzdHJ1Y3QgaW5wdXRfcG9sbGVkX2RldiAqZGV2ID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpbnB1dF9wb2xsZWRfZGV2LCB3b3JrLndvcmspOworCXVuc2lnbmVkIGxvbmcgZGVsYXk7CiAKIAlkZXYtPnBvbGwoZGV2KTsKLQlxdWV1ZV9kZWxheWVkX3dvcmsocG9sbGRldl93cSwgJmRldi0+d29yaywKLQkJCSAgIG1zZWNzX3RvX2ppZmZpZXMoZGV2LT5wb2xsX2ludGVydmFsKSk7CisKKwlkZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMoZGV2LT5wb2xsX2ludGVydmFsKTsKKwlpZiAoZGVsYXkgPj0gSFopCisJCWRlbGF5ID0gcm91bmRfamlmZmllc19yZWxhdGl2ZShkZWxheSk7CisKKwlxdWV1ZV9kZWxheWVkX3dvcmsocG9sbGRldl93cSwgJmRldi0+d29yaywgZGVsYXkpOwogfQogCiBzdGF0aWMgaW50IGlucHV0X29wZW5fcG9sbGVkX2RldmljZShzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCkKIHsKIAlzdHJ1Y3QgaW5wdXRfcG9sbGVkX2RldiAqZGV2ID0gaW5wdXQtPnByaXZhdGU7CiAJaW50IGVycm9yOwotCXVuc2lnbmVkIGxvbmcgdGlja3M7CiAKIAllcnJvciA9IGlucHV0X3BvbGxkZXZfc3RhcnRfd29ya3F1ZXVlKCk7CiAJaWYgKGVycm9yKQpAQCAtNzksMTAgKzgzLDggQEAKIAlpZiAoZGV2LT5mbHVzaCkKIAkJZGV2LT5mbHVzaChkZXYpOwogCi0JdGlja3MgPSBtc2Vjc190b19qaWZmaWVzKGRldi0+cG9sbF9pbnRlcnZhbCk7Ci0JaWYgKHRpY2tzID49IEhaKQotCQl0aWNrcyA9IHJvdW5kX2ppZmZpZXModGlja3MpOwotCXF1ZXVlX2RlbGF5ZWRfd29yayhwb2xsZGV2X3dxLCAmZGV2LT53b3JrLCB0aWNrcyk7CisJcXVldWVfZGVsYXllZF93b3JrKHBvbGxkZXZfd3EsICZkZXYtPndvcmssCisJCQkgICBtc2Vjc190b19qaWZmaWVzKGRldi0+cG9sbF9pbnRlcnZhbCkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05MSw3ICs5Myw3IEBACiB7CiAJc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKmRldiA9IGlucHV0LT5wcml2YXRlOwogCi0JY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29ya3F1ZXVlKHBvbGxkZXZfd3EsICZkZXYtPndvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZGV2LT53b3JrKTsKIAlpbnB1dF9wb2xsZGV2X3N0b3Bfd29ya3F1ZXVlKCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvaW5wdXQuYyBiL2RyaXZlcnMvaW5wdXQvaW5wdXQuYwppbmRleCBhMGJlOTc4Li5mMDJjMjQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2lucHV0LmMKKysrIGIvZHJpdmVycy9pbnB1dC9pbnB1dC5jCkBAIC00OTMsNyArNDkzLDcgQEAKIAlpZiAoaXNfZXZlbnRfc3VwcG9ydGVkKEVWX0tFWSwgZGV2LT5ldmJpdCwgRVZfTUFYKSkgewogCQlmb3IgKGNvZGUgPSAwOyBjb2RlIDw9IEtFWV9NQVg7IGNvZGUrKykgewogCQkJaWYgKGlzX2V2ZW50X3N1cHBvcnRlZChjb2RlLCBkZXYtPmtleWJpdCwgS0VZX01BWCkgJiYKLQkJCSAgICB0ZXN0X2JpdChjb2RlLCBkZXYtPmtleSkpIHsKKwkJCSAgICBfX3Rlc3RfYW5kX2NsZWFyX2JpdChjb2RlLCBkZXYtPmtleSkpIHsKIAkJCQlpbnB1dF9wYXNzX2V2ZW50KGRldiwgRVZfS0VZLCBjb2RlLCAwKTsKIAkJCX0KIAkJfQpAQCAtNTI2LDcgKzUyNiw3IEBACiAJaWYgKCFkZXYtPmtleWNvZGVzaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChzY2FuY29kZSA8IDAgfHwgc2NhbmNvZGUgPj0gZGV2LT5rZXljb2RlbWF4KQorCWlmIChzY2FuY29kZSA+PSBkZXYtPmtleWNvZGVtYXgpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJKmtleWNvZGUgPSBpbnB1dF9mZXRjaF9rZXljb2RlKGRldiwgc2NhbmNvZGUpOwpAQCAtNTQwLDEwICs1NDAsNyBAQAogCWludCBvbGRfa2V5Y29kZTsKIAlpbnQgaTsKIAotCWlmIChzY2FuY29kZSA8IDAgfHwgc2NhbmNvZGUgPj0gZGV2LT5rZXljb2RlbWF4KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChrZXljb2RlIDwgMCB8fCBrZXljb2RlID4gS0VZX01BWCkKKwlpZiAoc2NhbmNvZGUgPj0gZGV2LT5rZXljb2RlbWF4KQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICghZGV2LT5rZXljb2Rlc2l6ZSkKQEAgLTU4Niw2ICs1ODMsNzUgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBpbnB1dF9nZXRfa2V5Y29kZSAtIHJldHJpZXZlIGtleWNvZGUgY3VycmVudGx5IG1hcHBlZCB0byBhIGdpdmVuIHNjYW5jb2RlCisgKiBAZGV2OiBpbnB1dCBkZXZpY2Ugd2hpY2gga2V5bWFwIGlzIGJlaW5nIHF1ZXJpZWQKKyAqIEBzY2FuY29kZTogc2NhbmNvZGUgKG9yIGl0cyBlcXVpdmFsZW50IGZvciBkZXZpY2UgaW4gcXVlc3Rpb24pIGZvciB3aGljaAorICoJa2V5Y29kZSBpcyBuZWVkZWQKKyAqIEBrZXljb2RlOiByZXN1bHQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYnkgYW55b25lIGludGVyZXN0ZWQgaW4gcmV0cmlldmluZyBjdXJyZW50CisgKiBrZXltYXAuIFByZXNlbnRseSBrZXlib2FyZCBhbmQgZXZkZXYgaGFuZGxlcnMgdXNlIGl0LgorICovCitpbnQgaW5wdXRfZ2V0X2tleWNvZGUoc3RydWN0IGlucHV0X2RldiAqZGV2LCBpbnQgc2NhbmNvZGUsIGludCAqa2V5Y29kZSkKK3sKKwlpZiAoc2NhbmNvZGUgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBkZXYtPmdldGtleWNvZGUoZGV2LCBzY2FuY29kZSwga2V5Y29kZSk7Cit9CitFWFBPUlRfU1lNQk9MKGlucHV0X2dldF9rZXljb2RlKTsKKworLyoqCisgKiBpbnB1dF9nZXRfa2V5Y29kZSAtIGFzc2lnbiBuZXcga2V5Y29kZSB0byBhIGdpdmVuIHNjYW5jb2RlCisgKiBAZGV2OiBpbnB1dCBkZXZpY2Ugd2hpY2gga2V5bWFwIGlzIGJlaW5nIHVwZGF0ZWQKKyAqIEBzY2FuY29kZTogc2NhbmNvZGUgKG9yIGl0cyBlcXVpdmFsZW50IGZvciBkZXZpY2UgaW4gcXVlc3Rpb24pCisgKiBAa2V5Y29kZTogbmV3IGtleWNvZGUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIHNjYW5jb2RlCisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJ5IGFueW9uZSBuZWVkaW5nIHRvIHVwZGF0ZSBjdXJyZW50CisgKiBrZXltYXAuIFByZXNlbnRseSBrZXlib2FyZCBhbmQgZXZkZXYgaGFuZGxlcnMgdXNlIGl0LgorICovCitpbnQgaW5wdXRfc2V0X2tleWNvZGUoc3RydWN0IGlucHV0X2RldiAqZGV2LCBpbnQgc2NhbmNvZGUsIGludCBrZXljb2RlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG9sZF9rZXljb2RlOworCWludCByZXR2YWw7CisKKwlpZiAoc2NhbmNvZGUgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChrZXljb2RlIDwgMCB8fCBrZXljb2RlID4gS0VZX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisKKwlyZXR2YWwgPSBkZXYtPmdldGtleWNvZGUoZGV2LCBzY2FuY29kZSwgJm9sZF9rZXljb2RlKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKKworCXJldHZhbCA9IGRldi0+c2V0a2V5Y29kZShkZXYsIHNjYW5jb2RlLCBrZXljb2RlKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKKworCS8qCisJICogU2ltdWxhdGUga2V5dXAgZXZlbnQgaWYga2V5Y29kZSBpcyBub3QgcHJlc2VudAorCSAqIGluIHRoZSBrZXltYXAgYW55bW9yZQorCSAqLworCWlmICh0ZXN0X2JpdChFVl9LRVksIGRldi0+ZXZiaXQpICYmCisJICAgICFpc19ldmVudF9zdXBwb3J0ZWQob2xkX2tleWNvZGUsIGRldi0+a2V5Yml0LCBLRVlfTUFYKSAmJgorCSAgICBfX3Rlc3RfYW5kX2NsZWFyX2JpdChvbGRfa2V5Y29kZSwgZGV2LT5rZXkpKSB7CisKKwkJaW5wdXRfcGFzc19ldmVudChkZXYsIEVWX0tFWSwgb2xkX2tleWNvZGUsIDApOworCQlpZiAoZGV2LT5zeW5jKQorCQkJaW5wdXRfcGFzc19ldmVudChkZXYsIEVWX1NZTiwgU1lOX1JFUE9SVCwgMSk7CisJfQorCisgb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldHZhbDsKK30KK0VYUE9SVF9TWU1CT0woaW5wdXRfc2V0X2tleWNvZGUpOwogCiAjZGVmaW5lIE1BVENIX0JJVChiaXQsIG1heCkgXAogCQlmb3IgKGkgPSAwOyBpIDwgQklUU19UT19MT05HUyhtYXgpOyBpKyspIFwKQEAgLTc1NSw3ICs4MjEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGlucHV0X2RldmljZXNfc2VxX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaW5wdXRfZGV2aWNlc19zZXFfb3BzID0gewogCS5zdGFydAk9IGlucHV0X2RldmljZXNfc2VxX3N0YXJ0LAogCS5uZXh0CT0gaW5wdXRfZGV2aWNlc19zZXFfbmV4dCwKIAkuc3RvcAk9IGlucHV0X2RldmljZXNfc2VxX3N0b3AsCkBAIC04MDgsNyArODc0LDcgQEAKIAogCXJldHVybiAwOwogfQotc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBpbnB1dF9oYW5kbGVyc19zZXFfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBpbnB1dF9oYW5kbGVyc19zZXFfb3BzID0gewogCS5zdGFydAk9IGlucHV0X2hhbmRsZXJzX3NlcV9zdGFydCwKIAkubmV4dAk9IGlucHV0X2hhbmRsZXJzX3NlcV9uZXh0LAogCS5zdG9wCT0gaW5wdXRfaGFuZGxlcnNfc2VxX3N0b3AsCkBAIC0xMzI5LDkgKzEzOTUsNiBAQAogCXNucHJpbnRmKGRldi0+ZGV2LmJ1c19pZCwgc2l6ZW9mKGRldi0+ZGV2LmJ1c19pZCksCiAJCSAiaW5wdXQlbGQiLCAodW5zaWduZWQgbG9uZykgYXRvbWljX2luY19yZXR1cm4oJmlucHV0X25vKSAtIDEpOwogCi0JaWYgKGRldi0+Y2Rldi5kZXYpCi0JCWRldi0+ZGV2LnBhcmVudCA9IGRldi0+Y2Rldi5kZXY7Ci0KIAllcnJvciA9IGRldmljZV9hZGQoJmRldi0+ZGV2KTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYW1pam95LmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FtaWpveS5jCmluZGV4IDVjZjlmMzYuLmRlYjlmODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYW1pam95LmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hbWlqb3kuYwpAQCAtMzIsNyArMzIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYW5hbG9nLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FuYWxvZy5jCmluZGV4IDE1NzM5ODguLjcwOGM1YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYW5hbG9nLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hbmFsb2cuYwpAQCAtMSw2ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IGFuYWxvZy5jLHYgMS42OCAyMDAyLzAxLzIyIDIwOjE4OjMyIHZvanRlY2ggRXhwICQKLSAqCiAgKiAgQ29weXJpZ2h0IChjKSAxOTk2LTIwMDEgVm9qdGVjaCBQYXZsaWsKICAqLwogCkBAIC0zMSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0xNjUsNiArMTYyLDEwIEBACiAjZGVmaW5lIEdFVF9USU1FKHgpCWRvIHsgeCA9IGdldF9jeWNsZXMoKTsgfSB3aGlsZSAoMCkKICNkZWZpbmUgREVMVEEoeCx5KQkoKHkpLSh4KSkKICNkZWZpbmUgVElNRV9OQU1FCSJQQ0MiCisjZWxpZiBkZWZpbmVkKENPTkZJR19NTjEwMzAwKQorI2RlZmluZSBHRVRfVElNRSh4KQlkbyB7IHggPSBnZXRfY3ljbGVzKCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIERFTFRBKHgsIHkpCSgoeCkgLSAoeSkpCisjZGVmaW5lIFRJTUVfTkFNRQkiVFNDIgogI2Vsc2UKICNkZWZpbmUgRkFLRV9USU1FCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBhbmFsb2dfZmFrZXRpbWUgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9kYjkuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZGI5LmMKaW5kZXggYTZjYTlkNS4uOTYwZTUwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9kYjkuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2RiOS5jCkBAIC0zMyw3ICszMyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ2FtZWNvbi5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9nYW1lY29uLmMKaW5kZXggZGYyYTlkMC4uMDdhMzJhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9nYW1lY29uLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9nYW1lY29uLmMKQEAgLTMzLDcgKzMzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pZm9yY2UvaWZvcmNlLW1haW4uYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaWZvcmNlL2lmb3JjZS1tYWluLmMKaW5kZXggNmY4MjZiMy4uYTI1MTdmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pZm9yY2UvaWZvcmNlLW1haW4uYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtbWFpbi5jCkBAIC04NSw3ICs4NSw3IEBACiAKIHN0YXRpYyBpbnQgaWZvcmNlX3BsYXliYWNrKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgaW50IGVmZmVjdF9pZCwgaW50IHZhbHVlKQogewotCXN0cnVjdCBpZm9yY2UqIGlmb3JjZSA9IGRldi0+cHJpdmF0ZTsKKwlzdHJ1Y3QgaWZvcmNlICppZm9yY2UgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBpZm9yY2VfY29yZV9lZmZlY3QgKmNvcmVfZWZmZWN0ID0gJmlmb3JjZS0+Y29yZV9lZmZlY3RzW2VmZmVjdF9pZF07CiAKIAlpZiAodmFsdWUgPiAwKQpAQCAtOTksNyArOTksNyBAQAogCiBzdGF0aWMgdm9pZCBpZm9yY2Vfc2V0X2dhaW4oc3RydWN0IGlucHV0X2RldiAqZGV2LCB1MTYgZ2FpbikKIHsKLQlzdHJ1Y3QgaWZvcmNlKiBpZm9yY2UgPSBkZXYtPnByaXZhdGU7CisJc3RydWN0IGlmb3JjZSAqaWZvcmNlID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKIAl1bnNpZ25lZCBjaGFyIGRhdGFbM107CiAKIAlkYXRhWzBdID0gZ2FpbiA+PiA5OwpAQCAtMTA4LDcgKzEwOCw3IEBACiAKIHN0YXRpYyB2b2lkIGlmb3JjZV9zZXRfYXV0b2NlbnRlcihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHUxNiBtYWduaXR1ZGUpCiB7Ci0Jc3RydWN0IGlmb3JjZSogaWZvcmNlID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBpZm9yY2UgKmlmb3JjZSA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CiAJdW5zaWduZWQgY2hhciBkYXRhWzNdOwogCiAJZGF0YVswXSA9IDB4MDM7CkBAIC0xMjYsNyArMTI2LDcgQEAKICAqLwogc3RhdGljIGludCBpZm9yY2VfdXBsb2FkX2VmZmVjdChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHN0cnVjdCBmZl9lZmZlY3QgKmVmZmVjdCwgc3RydWN0IGZmX2VmZmVjdCAqb2xkKQogewotCXN0cnVjdCBpZm9yY2UqIGlmb3JjZSA9IGRldi0+cHJpdmF0ZTsKKwlzdHJ1Y3QgaWZvcmNlICppZm9yY2UgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBpZm9yY2VfY29yZV9lZmZlY3QgKmNvcmVfZWZmZWN0ID0gJmlmb3JjZS0+Y29yZV9lZmZlY3RzW2VmZmVjdC0+aWRdOwogCWludCByZXQ7CiAKQEAgLTE3Myw3ICsxNzMsNyBAQAogICovCiBzdGF0aWMgaW50IGlmb3JjZV9lcmFzZV9lZmZlY3Qoc3RydWN0IGlucHV0X2RldiAqZGV2LCBpbnQgZWZmZWN0X2lkKQogewotCXN0cnVjdCBpZm9yY2UgKmlmb3JjZSA9IGRldi0+cHJpdmF0ZTsKKwlzdHJ1Y3QgaWZvcmNlICppZm9yY2UgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBpZm9yY2VfY29yZV9lZmZlY3QgKmNvcmVfZWZmZWN0ID0gJmlmb3JjZS0+Y29yZV9lZmZlY3RzW2VmZmVjdF9pZF07CiAJaW50IGVyciA9IDA7CiAKQEAgLTE5MSw3ICsxOTEsNyBAQAogCiBzdGF0aWMgaW50IGlmb3JjZV9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKIHsKLQlzdHJ1Y3QgaWZvcmNlICppZm9yY2UgPSBkZXYtPnByaXZhdGU7CisJc3RydWN0IGlmb3JjZSAqaWZvcmNlID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXN3aXRjaCAoaWZvcmNlLT5idXMpIHsKICNpZmRlZiBDT05GSUdfSk9ZU1RJQ0tfSUZPUkNFX1VTQgpAQCAtMjEzLDcgKzIxMyw3IEBACiAKIHN0YXRpYyB2b2lkIGlmb3JjZV9yZWxlYXNlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKIHsKLQlzdHJ1Y3QgaWZvcmNlICppZm9yY2UgPSBkZXYtPnByaXZhdGU7CisJc3RydWN0IGlmb3JjZSAqaWZvcmNlID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgaTsKIAogCWlmICh0ZXN0X2JpdChFVl9GRiwgZGV2LT5ldmJpdCkpIHsKQEAgLTI5OCw3ICsyOTgsOCBAQAogI2VuZGlmCiAJfQogCi0JaW5wdXRfZGV2LT5wcml2YXRlID0gaWZvcmNlOworCWlucHV0X3NldF9kcnZkYXRhKGlucHV0X2RldiwgaWZvcmNlKTsKKwogCWlucHV0X2Rldi0+bmFtZSA9ICJVbmtub3duIEktRm9yY2UgZGV2aWNlIjsKIAlpbnB1dF9kZXYtPm9wZW4gPSBpZm9yY2Vfb3BlbjsKIAlpbnB1dF9kZXYtPmNsb3NlID0gaWZvcmNlX3JlbGVhc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3R1cmJvZ3JhZnguYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svdHVyYm9ncmFmeC5jCmluZGV4IGJiZWJkNGUuLjk4OTQ4M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svdHVyYm9ncmFmeC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svdHVyYm9ncmFmeC5jCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay94cGFkLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3hwYWQuYwppbmRleCA2ZTlkNzViLi4wMzgwNTk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3hwYWQuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3hwYWQuYwpAQCAtNzUsNyArNzUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC91c2IvaW5wdXQuaD4KIAogI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjAuMC42IgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9LY29uZmlnIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9LY29uZmlnCmluZGV4IDA4NmQ1OGMuLjhlYTcwOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvS2NvbmZpZworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL0tjb25maWcKQEAgLTE1NCw2ICsxNTQsMjcgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNwaXR6a2JkLgogCitjb25maWcgS0VZQk9BUkRfVE9TQQorCXRyaXN0YXRlICJUb3NhIGtleWJvYXJkIgorCWRlcGVuZHMgb24gTUFDSF9UT1NBCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgdGhlIGtleWJvYXJkIG9uIHRoZSBTaGFycCBaYXVydXMgU0wtNjAwMHggKFRvc2EpCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHRvc2FrYmQuCisKK2NvbmZpZyBLRVlCT0FSRF9UT1NBX1VTRV9FWFRfS0VZQ09ERVMKKwlib29sICJUb3NhIGtleWJvYXJkOiB1c2UgZXh0ZW5kZWQga2V5Y29kZXMiCisJZGVwZW5kcyBvbiBLRVlCT0FSRF9UT1NBCisJZGVmYXVsdCBuCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgdGhlIHRvc2Ega2V5Ym9hcmQgZHJpdmVyIHRvIGdlbmVyYXRlIGV4dGVuZGVkCisJICAoPj0gMTI3KSBrZXljb2Rlcy4gQmUgYXdhcmUsIHRoYXQgdGhleSBjYW4ndCBiZSBjb3JyZWN0bHkgaW50ZXJwcmV0ZWQKKwkgIGJ5IGVpdGhlciBjb25zb2xlIGtleWJvYXJkIGRyaXZlciBvciBieSBLZHJpdmUga2V5YmQgZHJpdmVyLgorCisJICBTYXkgWSBvbmx5IGlmIHlvdSBrbm93LCB3aGF0IHlvdSBhcmUgZG9pbmchCisKIGNvbmZpZyBLRVlCT0FSRF9BTUlHQQogCXRyaXN0YXRlICJBbWlnYSBrZXlib2FyZCIKIAlkZXBlbmRzIG9uIEFNSUdBCkBAIC0yMzksMTMgKzI2MCwxMyBAQAogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG9tYXAta2V5cGFkLgogCiBjb25maWcgS0VZQk9BUkRfUFhBMjd4Ci0JdHJpc3RhdGUgIlBYQTI3eCBrZXlib2FyZCBzdXBwb3J0IgotCWRlcGVuZHMgb24gUFhBMjd4CisJdHJpc3RhdGUgIlBYQTI3eC9QWEEzeHgga2V5cGFkIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQWEEyN3ggfHwgUFhBM3h4CiAJaGVscAotCSAgRW5hYmxlIHN1cHBvcnQgZm9yIFBYQTI3eCBtYXRyaXgga2V5Ym9hcmQgY29udHJvbGxlcgorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIFBYQTI3eC9QWEEzeHgga2V5cGFkIGNvbnRyb2xsZXIKIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcHhhMjd4X2tleWJvYXJkLgorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHB4YTI3eF9rZXlwYWQuCiAKIGNvbmZpZyBLRVlCT0FSRF9BQUVEMjAwMAogCXRyaXN0YXRlICJBQUVELTIwMDAga2V5Ym9hcmQiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9NYWtlZmlsZQppbmRleCBlOTc0NTVmLi5lNzQxZjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvTWFrZWZpbGUKQEAgLTE1LDEwICsxNSwxMSBAQAogb2JqLSQoQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZKQkJKz0gc3Rvd2F3YXkubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX0NPUkdJKQkJKz0gY29yZ2lrYmQubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX1NQSVRaKQkJKz0gc3BpdHprYmQubworb2JqLSQoQ09ORklHX0tFWUJPQVJEX1RPU0EpCQkrPSB0b3Nha2JkLm8KIG9iai0kKENPTkZJR19LRVlCT0FSRF9ISUwpCQkrPSBoaWxfa2JkLm8KIG9iai0kKENPTkZJR19LRVlCT0FSRF9ISUxfT0xEKQkJKz0gaGlsa2JkLm8KIG9iai0kKENPTkZJR19LRVlCT0FSRF9PTUFQKQkJKz0gb21hcC1rZXlwYWQubwotb2JqLSQoQ09ORklHX0tFWUJPQVJEX1BYQTI3eCkJCSs9IHB4YTI3eF9rZXlib2FyZC5vCitvYmotJChDT05GSUdfS0VZQk9BUkRfUFhBMjd4KQkJKz0gcHhhMjd4X2tleXBhZC5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfQUFFRDIwMDApCQkrPSBhYWVkMjAwMF9rYmQubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX0dQSU8pCQkrPSBncGlvX2tleXMubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX0hQNlhYKQkJKz0gam9ybmFkYTY4MF9rYmQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jCmluZGV4IGIzOWM1YjMuLjRhOTVhZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYXRrYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMKQEAgLTE5LDcgKzE5LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMjgsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpYnBzMi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAKICNkZWZpbmUgRFJJVkVSX0RFU0MJIkFUIGFuZCBQUy8yIGtleWJvYXJkIGRyaXZlciIKIApAQCAtMjAxLDYgKzIwMSw3IEBACiAKIAl1bnNpZ25lZCBzaG9ydCBpZDsKIAl1bnNpZ25lZCBjaGFyIGtleWNvZGVbNTEyXTsKKwlERUNMQVJFX0JJVE1BUChmb3JjZV9yZWxlYXNlX21hc2ssIDUxMik7CiAJdW5zaWduZWQgY2hhciBzZXQ7CiAJdW5zaWduZWQgY2hhciB0cmFuc2xhdGVkOwogCXVuc2lnbmVkIGNoYXIgZXh0cmE7CkBAIC0yMjUsNiArMjI2LDExIEBACiAJdW5zaWduZWQgbG9uZyBldmVudF9tYXNrOwogfTsKIAorLyoKKyAqIFN5c3RlbS1zcGVjaWZpYyBrZXR5bWFwIGZpeHVwIHJvdXRpbmUKKyAqLworc3RhdGljIHZvaWQgKCphdGtiZF9wbGF0Zm9ybV9maXh1cCkoc3RydWN0IGF0a2JkICopOworCiBzdGF0aWMgc3NpemVfdCBhdGtiZF9hdHRyX3Nob3dfaGVscGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLAogCQkJCXNzaXplX3QgKCpoYW5kbGVyKShzdHJ1Y3QgYXRrYmQgKiwgY2hhciAqKSk7CiBzdGF0aWMgc3NpemVfdCBhdGtiZF9hdHRyX3NldF9oZWxwZXIoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKQEAgLTM0OSw3ICszNTUsNyBAQAogCXN0cnVjdCBhdGtiZCAqYXRrYmQgPSBzZXJpb19nZXRfZHJ2ZGF0YShzZXJpbyk7CiAJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gYXRrYmQtPmRldjsKIAl1bnNpZ25lZCBpbnQgY29kZSA9IGRhdGE7Ci0JaW50IHNjcm9sbCA9IDAsIGhzY3JvbGwgPSAwLCBjbGljayA9IC0xLCBhZGRfcmVsZWFzZV9ldmVudCA9IDA7CisJaW50IHNjcm9sbCA9IDAsIGhzY3JvbGwgPSAwLCBjbGljayA9IC0xOwogCWludCB2YWx1ZTsKIAl1bnNpZ25lZCBjaGFyIGtleWNvZGU7CiAKQEAgLTQxNCwxNCArNDIwLDYgQEAKIAkJCQkgICAgICAgIlNvbWUgcHJvZ3JhbSBtaWdodCBiZSB0cnlpbmcgYWNjZXNzIGhhcmR3YXJlIGRpcmVjdGx5LlxuIiwKIAkJCQkgICAgICAgZGF0YSA9PSBBVEtCRF9SRVRfQUNLID8gIkFDSyIgOiAiTkFLIiwgc2VyaW8tPnBoeXMpOwogCQkJZ290byBvdXQ7Ci0JCWNhc2UgQVRLQkRfUkVUX0hBTkdFVUw6Ci0JCWNhc2UgQVRLQkRfUkVUX0hBTkpBOgotCQkJLyoKLQkJCSAqIFRoZXNlIGtleXMgZG8gbm90IHJlcG9ydCByZWxlYXNlIGFuZCB0aHVzIG5lZWQgdG8gYmUKLQkJCSAqIGZsYWdnZWQgcHJvcGVybHkKLQkJCSAqLwotCQkJYWRkX3JlbGVhc2VfZXZlbnQgPSAxOwotCQkJYnJlYWs7CiAJCWNhc2UgQVRLQkRfUkVUX0VSUjoKIAkJCWF0a2JkLT5lcnJfY291bnQrKzsKICNpZmRlZiBBVEtCRF9ERUJVRwpAQCAtNDkxLDcgKzQ4OSw3IEBACiAJCQlpbnB1dF9ldmVudChkZXYsIEVWX0tFWSwga2V5Y29kZSwgdmFsdWUpOwogCQkJaW5wdXRfc3luYyhkZXYpOwogCi0JCQlpZiAodmFsdWUgJiYgYWRkX3JlbGVhc2VfZXZlbnQpIHsKKwkJCWlmICh2YWx1ZSAmJiB0ZXN0X2JpdChjb2RlLCBhdGtiZC0+Zm9yY2VfcmVsZWFzZV9tYXNrKSkgewogCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBrZXljb2RlLCAwKTsKIAkJCQlpbnB1dF9zeW5jKGRldik7CiAJCQl9CkBAIC04MjQsNyArODIyLDYgQEAKIAlhdGtiZF9kaXNhYmxlKGF0a2JkKTsKIAogCS8qIG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIGEgY29tbWFuZCBpbiBmbGlnaHQgKi8KLQlzeW5jaHJvbml6ZV9zY2hlZCgpOyAgLyogQWxsb3cgYXRrYmRfaW50ZXJydXB0KClzIHRvIGNvbXBsZXRlLiAqLwogCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CiAKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJnNlcmlvLT5kZXYua29iaiwgJmF0a2JkX2F0dHJpYnV0ZV9ncm91cCk7CkBAIC04MzQsNiArODMxLDIyIEBACiAJa2ZyZWUoYXRrYmQpOwogfQogCisvKgorICogTW9zdCBzcGVjaWFsIGtleXMgKEZuK0Y/KSBvbiBEZWxsIExhdGl0dWRlcyBkbyBub3QgZ2VuZXJhdGUgcmVsZWFzZQorICogZXZlbnRzIHNvIHdlIGhhdmUgdG8gZG8gaXQgb3Vyc2VsdmVzLgorICovCitzdGF0aWMgdm9pZCBhdGtiZF9sYXRpdHVkZV9rZXltYXBfZml4dXAoc3RydWN0IGF0a2JkICphdGtiZCkKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQgZm9yY2VkX3JlbGVhc2Vfa2V5c1tdID0geworCQkweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhmLCAweDkzLAorCX07CisJaW50IGk7CisKKwlpZiAoYXRrYmQtPnNldCA9PSAyKQorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmb3JjZWRfcmVsZWFzZV9rZXlzKTsgaSsrKQorCQkJX19zZXRfYml0KGZvcmNlZF9yZWxlYXNlX2tleXNbaV0sCisJCQkJICBhdGtiZC0+Zm9yY2VfcmVsZWFzZV9tYXNrKTsKK30KIAogLyoKICAqIGF0a2JkX3NldF9rZXljb2RlX3RhYmxlKCkgaW5pdGlhbGl6ZXMga2V5Ym9hcmQncyBrZXljb2RlIHRhYmxlCkBAIC04NDIsMTcgKzg1NSwyMCBAQAogCiBzdGF0aWMgdm9pZCBhdGtiZF9zZXRfa2V5Y29kZV90YWJsZShzdHJ1Y3QgYXRrYmQgKmF0a2JkKQogeworCXVuc2lnbmVkIGludCBzY2FuY29kZTsKIAlpbnQgaSwgajsKIAogCW1lbXNldChhdGtiZC0+a2V5Y29kZSwgMCwgc2l6ZW9mKGF0a2JkLT5rZXljb2RlKSk7CisJYml0bWFwX3plcm8oYXRrYmQtPmZvcmNlX3JlbGVhc2VfbWFzaywgNTEyKTsKIAogCWlmIChhdGtiZC0+dHJhbnNsYXRlZCkgewogCQlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKLQkJCWF0a2JkLT5rZXljb2RlW2ldID0gYXRrYmRfc2V0Ml9rZXljb2RlW2F0a2JkX3VueGxhdGVfdGFibGVbaV1dOwotCQkJYXRrYmQtPmtleWNvZGVbaSB8IDB4ODBdID0gYXRrYmRfc2V0Ml9rZXljb2RlW2F0a2JkX3VueGxhdGVfdGFibGVbaV0gfCAweDgwXTsKKwkJCXNjYW5jb2RlID0gYXRrYmRfdW54bGF0ZV90YWJsZVtpXTsKKwkJCWF0a2JkLT5rZXljb2RlW2ldID0gYXRrYmRfc2V0Ml9rZXljb2RlW3NjYW5jb2RlXTsKKwkJCWF0a2JkLT5rZXljb2RlW2kgfCAweDgwXSA9IGF0a2JkX3NldDJfa2V5Y29kZVtzY2FuY29kZSB8IDB4ODBdOwogCQkJaWYgKGF0a2JkLT5zY3JvbGwpCiAJCQkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUoYXRrYmRfc2Nyb2xsX2tleXMpOyBqKyspCi0JCQkJCWlmICgoYXRrYmRfdW54bGF0ZV90YWJsZVtpXSB8IDB4ODApID09IGF0a2JkX3Njcm9sbF9rZXlzW2pdLnNldDIpCisJCQkJCWlmICgoc2NhbmNvZGUgfCAweDgwKSA9PSBhdGtiZF9zY3JvbGxfa2V5c1tqXS5zZXQyKQogCQkJCQkJYXRrYmQtPmtleWNvZGVbaSB8IDB4ODBdID0gYXRrYmRfc2Nyb2xsX2tleXNbal0ua2V5Y29kZTsKIAkJfQogCX0gZWxzZSBpZiAoYXRrYmQtPnNldCA9PSAzKSB7CkBAIC04NjEsMTIgKzg3NywyOSBAQAogCQltZW1jcHkoYXRrYmQtPmtleWNvZGUsIGF0a2JkX3NldDJfa2V5Y29kZSwgc2l6ZW9mKGF0a2JkLT5rZXljb2RlKSk7CiAKIAkJaWYgKGF0a2JkLT5zY3JvbGwpCi0JCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhdGtiZF9zY3JvbGxfa2V5cyk7IGkrKykKLQkJCQlhdGtiZC0+a2V5Y29kZVthdGtiZF9zY3JvbGxfa2V5c1tpXS5zZXQyXSA9IGF0a2JkX3Njcm9sbF9rZXlzW2ldLmtleWNvZGU7CisJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhdGtiZF9zY3JvbGxfa2V5cyk7IGkrKykgeworCQkJCXNjYW5jb2RlID0gYXRrYmRfc2Nyb2xsX2tleXNbaV0uc2V0MjsKKwkJCQlhdGtiZC0+a2V5Y29kZVtzY2FuY29kZV0gPSBhdGtiZF9zY3JvbGxfa2V5c1tpXS5rZXljb2RlOworCQl9CiAJfQogCi0JYXRrYmQtPmtleWNvZGVbYXRrYmRfY29tcGF0X3NjYW5jb2RlKGF0a2JkLCBBVEtCRF9SRVRfSEFOR0VVTCldID0gS0VZX0hBTkdVRUw7Ci0JYXRrYmQtPmtleWNvZGVbYXRrYmRfY29tcGF0X3NjYW5jb2RlKGF0a2JkLCBBVEtCRF9SRVRfSEFOSkEpXSA9IEtFWV9IQU5KQTsKKy8qCisgKiBIQU5HRVVMIGFuZCBIQU5KQSBrZXlzIGRvIG5vdCBzZW5kIHJlbGVhc2UgZXZlbnRzIHNvIHdlIG5lZWQgdG8KKyAqIGdlbmVyYXRlIHN1Y2ggZXZlbnRzIG91cnNlbHZlcworICovCisJc2NhbmNvZGUgPSBhdGtiZF9jb21wYXRfc2NhbmNvZGUoYXRrYmQsIEFUS0JEX1JFVF9IQU5HRVVMKTsKKwlhdGtiZC0+a2V5Y29kZVtzY2FuY29kZV0gPSBLRVlfSEFOR0VVTDsKKwlfX3NldF9iaXQoc2NhbmNvZGUsIGF0a2JkLT5mb3JjZV9yZWxlYXNlX21hc2spOworCisJc2NhbmNvZGUgPSBhdGtiZF9jb21wYXRfc2NhbmNvZGUoYXRrYmQsIEFUS0JEX1JFVF9IQU5KQSk7CisJYXRrYmQtPmtleWNvZGVbc2NhbmNvZGVdID0gS0VZX0hBTkpBOworCV9fc2V0X2JpdChzY2FuY29kZSwgYXRrYmQtPmZvcmNlX3JlbGVhc2VfbWFzayk7CisKKy8qCisgKiBQZXJmb3JtIGFkZGl0aW9uYWwgZml4dXBzCisgKi8KKwlpZiAoYXRrYmRfcGxhdGZvcm1fZml4dXApCisJCWF0a2JkX3BsYXRmb3JtX2ZpeHVwKGF0a2JkKTsKIH0KIAogLyoKQEAgLTE0MDEsOSArMTQzNCwyOSBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgYXRrYmQtPmVycl9jb3VudCk7CiB9CiAKK3N0YXRpYyBpbnQgX19pbml0IGF0a2JkX3NldHVwX2ZpeHVwKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICppZCkKK3sKKwlhdGtiZF9wbGF0Zm9ybV9maXh1cCA9IGlkLT5kcml2ZXJfZGF0YTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIGF0a2JkX2RtaV9xdWlya190YWJsZVtdIF9faW5pdGRhdGEgPSB7CisJeworCQkuaWRlbnQgPSAiRGVsbCBMYXRpdHVkZSBzZXJpZXMiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJMYXRpdHVkZSIpLAorCQl9LAorCQkuY2FsbGJhY2sgPSBhdGtiZF9zZXR1cF9maXh1cCwKKwkJLmRyaXZlcl9kYXRhID0gYXRrYmRfbGF0aXR1ZGVfa2V5bWFwX2ZpeHVwLAorCX0sCisJeyB9Cit9OwogCiBzdGF0aWMgaW50IF9faW5pdCBhdGtiZF9pbml0KHZvaWQpCiB7CisJZG1pX2NoZWNrX3N5c3RlbShhdGtiZF9kbWlfcXVpcmtfdGFibGUpOworCiAJcmV0dXJuIHNlcmlvX3JlZ2lzdGVyX2RyaXZlcigmYXRrYmRfZHJ2KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sa2tiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sa2tiZC5jCmluZGV4IDFiMDhmNGUuLjMyZTJjMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbGtrYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xra2JkLmMKQEAgLTY0LDcgKzY0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9weGEyN3hfa2V5Ym9hcmQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvcHhhMjd4X2tleWJvYXJkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZDY0ZWUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9weGEyN3hfa2V5Ym9hcmQuYworKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKgotICogbGludXgvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9weGEyN3hfa2V5Ym9hcmQuYwotICoKLSAqIERyaXZlciBmb3IgdGhlIHB4YTI3eCBtYXRyaXgga2V5Ym9hcmQgY29udHJvbGxlci4KLSAqCi0gKiBDcmVhdGVkOglGZWIgMjIsIDIwMDcKLSAqIEF1dGhvcjoJUm9kb2xmbyBHaW9tZXR0aSA8Z2lvbWV0dGlAbGludXguaXQ+Ci0gKgotICogQmFzZWQgb24gYSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbnMgYnkgS2V2aW4gTydDb25ub3IKLSAqIDxrZXZpbl9hdF9rb2Nvbm5vci5uZXQ+IGFuZCBBbGV4IE9zYm9ybmUgPGJvYm9mZG9vbUBnbWFpbC5jb20+IGFuZAotICogb24gc29tZSBzdWdnZXN0aW9ucyBieSBOaWNvbGFzIFBpdHJlIDxuaWNvQGNhbS5vcmc+LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLQotI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvcHhhMjd4X2tleWJvYXJkLmg+Ci0KLSNkZWZpbmUgRFJJVkVSX05BTUUJCSJweGEyN3gta2V5Ym9hcmQiCi0KLSNkZWZpbmUgS1BBU01LUChjb2wpCQkoY29sLzIgPT0gMCA/IEtQQVNNS1AwIDogXAotCQkJCSBjb2wvMiA9PSAxID8gS1BBU01LUDEgOiBcCi0JCQkJIGNvbC8yID09IDIgPyBLUEFTTUtQMiA6IEtQQVNNS1AzKQotI2RlZmluZSBLUEFTTUtQeF9NS0Mocm93LCBjb2wpCSgxIDw8IChyb3cgKyAxNiAqIChjb2wgJSAyKSkpCi0KLXN0YXRpYyBzdHJ1Y3QgY2xrICpweGFrYmRfY2xrOwotCi1zdGF0aWMgaXJxcmV0dXJuX3QgcHhha2JkX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gZGV2X2lkOwotCXN0cnVjdCBweGEyN3hfa2V5Ym9hcmRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQl1bnNpZ25lZCBsb25nIGtwYyA9IEtQQzsKLQlpbnQgcCwgcm93LCBjb2wsIHJlbDsKLQotCWlmIChrcGMgJiBLUENfREkpIHsKLQkJdW5zaWduZWQgbG9uZyBrcGRrID0gS1BESzsKLQotCQlpZiAoIShrcGRrICYgS1BES19ES1ApKSB7Ci0JCQkvKiBiZXR0ZXIgbHVjayBuZXh0IHRpbWUgKi8KLQkJfSBlbHNlIGlmIChrcGMgJiBLUENfUkVFMCkgewotCQkJdW5zaWduZWQgbG9uZyBrcHJlYyA9IEtQUkVDOwotCQkJS1BSRUMgPSAweDdmOwotCi0JCQlpZiAoa3ByZWMgJiBLUFJFQ19PRjApCi0JCQkJcmVsID0gKGtwcmVjICYgMHhmZikgKyAweDdmOwotCQkJZWxzZSBpZiAoa3ByZWMgJiBLUFJFQ19VRjApCi0JCQkJcmVsID0gKGtwcmVjICYgMHhmZikgLSAweDdmIC0gMHhmZjsKLQkJCWVsc2UKLQkJCQlyZWwgPSAoa3ByZWMgJiAweGZmKSAtIDB4N2Y7Ci0KLQkJCWlmIChyZWwpIHsKLQkJCQlpbnB1dF9yZXBvcnRfcmVsKGlucHV0X2RldiwgUkVMX1dIRUVMLCByZWwpOwotCQkJCWlucHV0X3N5bmMoaW5wdXRfZGV2KTsKLQkJCX0KLQkJfQotCX0KLQotCWlmIChrcGMgJiBLUENfTUkpIHsKLQkJLyogcmVwb3J0IHRoZSBzdGF0dXMgb2YgZXZlcnkgYnV0dG9uICovCi0JCWZvciAocm93ID0gMDsgcm93IDwgcGRhdGEtPm5yX3Jvd3M7IHJvdysrKSB7Ci0JCQlmb3IgKGNvbCA9IDA7IGNvbCA8IHBkYXRhLT5ucl9jb2xzOyBjb2wrKykgewotCQkJCXAgPSBLUEFTTUtQKGNvbCkgJiBLUEFTTUtQeF9NS0Mocm93LCBjb2wpID8KLQkJCQkJMSA6IDA7Ci0JCQkJcHJfZGVidWcoImtleWNvZGUgJXggLSBwcmVzc2VkICV4XG4iLAotCQkJCQkJcGRhdGEtPmtleWNvZGVzW3Jvd11bY29sXSwgcCk7Ci0JCQkJaW5wdXRfcmVwb3J0X2tleShpbnB1dF9kZXYsCi0JCQkJCQlwZGF0YS0+a2V5Y29kZXNbcm93XVtjb2xdLCBwKTsKLQkJCX0KLQkJfQotCQlpbnB1dF9zeW5jKGlucHV0X2Rldik7Ci0JfQotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaW50IHB4YWtiZF9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKLXsKLQkvKiBTZXQga2V5cGFkIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQlLUEMgfD0gKEtQQ19BU0FDVCB8Ci0JCUtQQ19NU19BTEwgfAotCQkoMiA8PCA2KSB8IEtQQ19SRUUwIHwgS1BDX0RLX0RFQl9TRUwgfAotCQlLUENfTUUgfCBLUENfTUlFIHwgS1BDX0RFIHwgS1BDX0RJRSk7Ci0KLQlLUEMgJj0gfktQQ19BUzsgICAgICAgICAvKiBkaXNhYmxlIGF1dG9tYXRpYyBzY2FuICovCi0JS1BDICY9IH5LUENfSU1LUDsgICAgICAgLyogZG8gbm90IGlnbm9yZSBtdWx0aXBsZSBrZXlwcmVzc2VzICovCi0KLQkvKiBTZXQgcm90YXJ5IGNvdW50IHRvIG1pZC1wb2ludCB2YWx1ZSAqLwotCUtQUkVDID0gMHg3RjsKLQotCS8qIEVuYWJsZSB1bml0IGNsb2NrICovCi0JY2xrX2VuYWJsZShweGFrYmRfY2xrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBweGFrYmRfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQotewotCS8qIERpc2FibGUgY2xvY2sgdW5pdCAqLwotCWNsa19kaXNhYmxlKHB4YWtiZF9jbGspOwotfQotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHB4YWtiZF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzdHJ1Y3QgcHhhMjd4X2tleWJvYXJkX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0KLQkvKiBTYXZlIGNvbnRyb2xsZXIgc3RhdHVzICovCi0JcGRhdGEtPnJlZ19rcGMgPSBLUEM7Ci0JcGRhdGEtPnJlZ19rcHJlYyA9IEtQUkVDOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHhha2JkX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBweGEyN3hfa2V5Ym9hcmRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCW11dGV4X2xvY2soJmlucHV0X2Rldi0+bXV0ZXgpOwotCi0JaWYgKGlucHV0X2Rldi0+dXNlcnMpIHsKLQkJLyogUmVzdG9yZSBjb250cm9sbGVyIHN0YXR1cyAqLwotCQlLUEMgPSBwZGF0YS0+cmVnX2twYzsKLQkJS1BSRUMgPSBwZGF0YS0+cmVnX2twcmVjOwotCi0JCS8qIEVuYWJsZSB1bml0IGNsb2NrICovCi0JCWNsa19kaXNhYmxlKHB4YWtiZF9jbGspOwotCQljbGtfZW5hYmxlKHB4YWtiZF9jbGspOwotCX0KLQotCW11dGV4X3VubG9jaygmaW5wdXRfZGV2LT5tdXRleCk7Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbHNlCi0jZGVmaW5lIHB4YWtiZF9zdXNwZW5kCU5VTEwKLSNkZWZpbmUgcHhha2JkX3Jlc3VtZQlOVUxMCi0jZW5kaWYKLQotc3RhdGljIGludCBfX2RldmluaXQgcHhha2JkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHB4YTI3eF9rZXlib2FyZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKLQlpbnQgaSwgcm93LCBjb2wsIGVycm9yOwotCi0JcHhha2JkX2NsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgIktCRENMSyIpOwotCWlmIChJU19FUlIocHhha2JkX2NsaykpIHsKLQkJZXJyb3IgPSBQVFJfRVJSKHB4YWtiZF9jbGspOwotCQlnb3RvIGVycl9jbGs7Ci0JfQotCi0JLyogQ3JlYXRlIGFuZCByZWdpc3RlciB0aGUgaW5wdXQgZHJpdmVyLiAqLwotCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwotCWlmICghaW5wdXRfZGV2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ2Fubm90IHJlcXVlc3Qga2V5cGFkIGRldmljZVxuIik7Ci0JCWVycm9yID0gLUVOT01FTTsKLQkJZ290byBlcnJfYWxsb2M7Ci0JfQotCi0JaW5wdXRfZGV2LT5uYW1lID0gRFJJVkVSX05BTUU7Ci0JaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7Ci0JaW5wdXRfZGV2LT5vcGVuID0gcHhha2JkX29wZW47Ci0JaW5wdXRfZGV2LT5jbG9zZSA9IHB4YWtiZF9jbG9zZTsKLQlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwotCi0JaW5wdXRfZGV2LT5ldmJpdFswXSA9IEJJVF9NQVNLKEVWX0tFWSkgfCBCSVRfTUFTSyhFVl9SRVApIHwKLQkJQklUX01BU0soRVZfUkVMKTsKLQlpbnB1dF9kZXYtPnJlbGJpdFtCSVRfV09SRChSRUxfV0hFRUwpXSA9IEJJVF9NQVNLKFJFTF9XSEVFTCk7Ci0JZm9yIChyb3cgPSAwOyByb3cgPCBwZGF0YS0+bnJfcm93czsgcm93KyspIHsKLQkJZm9yIChjb2wgPSAwOyBjb2wgPCBwZGF0YS0+bnJfY29sczsgY29sKyspIHsKLQkJCWludCBjb2RlID0gcGRhdGEtPmtleWNvZGVzW3Jvd11bY29sXTsKLQkJCWlmIChjb2RlID4gMCkKLQkJCQlzZXRfYml0KGNvZGUsIGlucHV0X2Rldi0+a2V5Yml0KTsKLQkJfQotCX0KLQotCWVycm9yID0gcmVxdWVzdF9pcnEoSVJRX0tFWVBBRCwgcHhha2JkX2lycV9oYW5kbGVyLCBJUlFGX0RJU0FCTEVELAotCQkJICAgIERSSVZFUl9OQU1FLCBwZGV2KTsKLQlpZiAoZXJyb3IpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDYW5ub3QgcmVxdWVzdCBrZXlwYWQgSVJRXG4iKTsKLQkJZ290byBlcnJfZnJlZV9kZXY7Ci0JfQotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW5wdXRfZGV2KTsKLQotCS8qIFJlZ2lzdGVyIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOwotCWlmIChlcnJvcikKLQkJZ290byBlcnJfZnJlZV9pcnE7Ci0KLQkvKiBTZXR1cCBHUElPcy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm5yX3Jvd3MgKyBwZGF0YS0+bnJfY29sczsgaSsrKQotCQlweGFfZ3Bpb19tb2RlKHBkYXRhLT5ncGlvX21vZGVzW2ldKTsKLQotCS8qCi0JICogU3RvcmUgcm93cy9jb2xzIGluZm8gaW50byBrZXlib2FyZCByZWdpc3RlcnMuCi0JICovCi0KLQlLUEMgfD0gKHBkYXRhLT5ucl9yb3dzIC0gMSkgPDwgMjY7Ci0JS1BDIHw9IChwZGF0YS0+bnJfY29scyAtIDEpIDw8IDIzOwotCi0JZm9yIChjb2wgPSAwOyBjb2wgPCBwZGF0YS0+bnJfY29sczsgY29sKyspCi0JCUtQQyB8PSBLUENfTVMwIDw8IGNvbDsKLQotCXJldHVybiAwOwotCi0gZXJyX2ZyZWVfaXJxOgotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCWZyZWVfaXJxKElSUV9LRVlQQUQsIHBkZXYpOwotIGVycl9mcmVlX2RldjoKLQlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOwotIGVycl9hbGxvYzoKLQljbGtfcHV0KHB4YWtiZF9jbGspOwotIGVycl9jbGs6Ci0JcmV0dXJuIGVycm9yOwotfQotCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBweGFrYmRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0KLQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOwotCWZyZWVfaXJxKElSUV9LRVlQQUQsIHBkZXYpOwotCWNsa19wdXQocHhha2JkX2Nsayk7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcHhha2JkX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gcHhha2JkX3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocHhha2JkX3JlbW92ZSksCi0JLnN1c3BlbmQJPSBweGFrYmRfc3VzcGVuZCwKLQkucmVzdW1lCQk9IHB4YWtiZF9yZXN1bWUsCi0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gRFJJVkVSX05BTUUsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHB4YWtiZF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcHhha2JkX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBweGFrYmRfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZweGFrYmRfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQocHhha2JkX2luaXQpOwotbW9kdWxlX2V4aXQocHhha2JkX2V4aXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIlBYQTI3eCBNYXRyaXggS2V5Ym9hcmQgRHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3B4YTI3eF9rZXlwYWQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvcHhhMjd4X2tleXBhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMjRjMmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3B4YTI3eF9rZXlwYWQuYwpAQCAtMCwwICsxLDU3MiBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvcHhhMjd4X2tleXBhZC5jCisgKgorICogRHJpdmVyIGZvciB0aGUgcHhhMjd4IG1hdHJpeCBrZXlib2FyZCBjb250cm9sbGVyLgorICoKKyAqIENyZWF0ZWQ6CUZlYiAyMiwgMjAwNworICogQXV0aG9yOglSb2RvbGZvIEdpb21ldHRpIDxnaW9tZXR0aUBsaW51eC5pdD4KKyAqCisgKiBCYXNlZCBvbiBhIHByZXZpb3VzIGltcGxlbWVudGF0aW9ucyBieSBLZXZpbiBPJ0Nvbm5vcgorICogPGtldmluX2F0X2tvY29ubm9yLm5ldD4gYW5kIEFsZXggT3Nib3JuZSA8Ym9ib2Zkb29tQGdtYWlsLmNvbT4gYW5kCisgKiBvbiBzb21lIHN1Z2dlc3Rpb25zIGJ5IE5pY29sYXMgUGl0cmUgPG5pY29AY2FtLm9yZz4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9weGEyN3hfa2V5cGFkLmg+CisKKy8qCisgKiBLZXlwYWQgQ29udHJvbGxlciByZWdpc3RlcnMKKyAqLworI2RlZmluZSBLUEMgICAgICAgICAgICAgMHgwMDAwIC8qIEtleXBhZCBDb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIEtQREsgICAgICAgICAgICAweDAwMDggLyogS2V5cGFkIERpcmVjdCBLZXkgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgS1BSRUMgICAgICAgICAgIDB4MDAxMCAvKiBLZXlwYWQgUm90YXJ5IEVuY29kZXIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgS1BNSyAgICAgICAgICAgIDB4MDAxOCAvKiBLZXlwYWQgTWF0cml4IEtleSByZWdpc3RlciAqLworI2RlZmluZSBLUEFTICAgICAgICAgICAgMHgwMDIwIC8qIEtleXBhZCBBdXRvbWF0aWMgU2NhbiByZWdpc3RlciAqLworCisvKiBLZXlwYWQgQXV0b21hdGljIFNjYW4gTXVsdGlwbGUgS2V5IFByZXNzZXIgcmVnaXN0ZXIgMC0zICovCisjZGVmaW5lIEtQQVNNS1AwICAgICAgICAweDAwMjgKKyNkZWZpbmUgS1BBU01LUDEgICAgICAgIDB4MDAzMAorI2RlZmluZSBLUEFTTUtQMiAgICAgICAgMHgwMDM4CisjZGVmaW5lIEtQQVNNS1AzICAgICAgICAweDAwNDAKKyNkZWZpbmUgS1BLREkgICAgICAgICAgIDB4MDA0OAorCisvKiBiaXQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgS1BDX01LUk4obikJKCgoKG4pICYgMHg3KSAtIDEpIDw8IDI2KSAvKiBtYXRyaXgga2V5IHJvdyBudW1iZXIgKi8KKyNkZWZpbmUgS1BDX01LQ04obikJKCgoKG4pICYgMHg3KSAtIDEpIDw8IDIzKSAvKiBtYXRyaXgga2V5IGNvbHVtbiBudW1iZXIgKi8KKyNkZWZpbmUgS1BDX0RLTihuKQkoKCgobikgJiAweDcpIC0gMSkgPDwgNikgIC8qIGRpcmVjdCBrZXkgbnVtYmVyICovCisKKyNkZWZpbmUgS1BDX0FTICAgICAgICAgICgweDEgPDwgMzApICAvKiBBdXRvbWF0aWMgU2NhbiBiaXQgKi8KKyNkZWZpbmUgS1BDX0FTQUNUICAgICAgICgweDEgPDwgMjkpICAvKiBBdXRvbWF0aWMgU2NhbiBvbiBBY3Rpdml0eSAqLworI2RlZmluZSBLUENfTUkgICAgICAgICAgKDB4MSA8PCAyMikgIC8qIE1hdHJpeCBpbnRlcnJ1cHQgYml0ICovCisjZGVmaW5lIEtQQ19JTUtQICAgICAgICAoMHgxIDw8IDIxKSAgLyogSWdub3JlIE11bHRpcGxlIEtleSBQcmVzcyAqLworCisjZGVmaW5lIEtQQ19NUyhuKQkoMHgxIDw8ICgxMyArIChuKSkpCS8qIE1hdHJpeCBzY2FuIGxpbmUgJ24nICovCisjZGVmaW5lIEtQQ19NU19BTEwgICAgICAoMHhmZiA8PCAxMykKKworI2RlZmluZSBLUENfTUUgICAgICAgICAgKDB4MSA8PCAxMikgIC8qIE1hdHJpeCBLZXlwYWQgRW5hYmxlICovCisjZGVmaW5lIEtQQ19NSUUgICAgICAgICAoMHgxIDw8IDExKSAgLyogTWF0cml4IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgS1BDX0RLX0RFQl9TRUwJKDB4MSA8PCAgOSkgIC8qIERpcmVjdCBLZXlwYWQgRGVib3VuY2UgU2VsZWN0ICovCisjZGVmaW5lIEtQQ19ESSAgICAgICAgICAoMHgxIDw8ICA1KSAgLyogRGlyZWN0IGtleSBpbnRlcnJ1cHQgYml0ICovCisjZGVmaW5lIEtQQ19SRV9aRVJPX0RFQiAoMHgxIDw8ICA0KSAgLyogUm90YXJ5IEVuY29kZXIgWmVybyBEZWJvdW5jZSAqLworI2RlZmluZSBLUENfUkVFMSAgICAgICAgKDB4MSA8PCAgMykgIC8qIFJvdGFyeSBFbmNvZGVyMSBFbmFibGUgKi8KKyNkZWZpbmUgS1BDX1JFRTAgICAgICAgICgweDEgPDwgIDIpICAvKiBSb3RhcnkgRW5jb2RlcjAgRW5hYmxlICovCisjZGVmaW5lIEtQQ19ERSAgICAgICAgICAoMHgxIDw8ICAxKSAgLyogRGlyZWN0IEtleXBhZCBFbmFibGUgKi8KKyNkZWZpbmUgS1BDX0RJRSAgICAgICAgICgweDEgPDwgIDApICAvKiBEaXJlY3QgS2V5cGFkIGludGVycnVwdCBFbmFibGUgKi8KKworI2RlZmluZSBLUERLX0RLUCAgICAgICAgKDB4MSA8PCAzMSkKKyNkZWZpbmUgS1BES19ESyhuKQkoKG4pICYgMHhmZikKKworI2RlZmluZSBLUFJFQ19PRjEgICAgICAgKDB4MSA8PCAzMSkKKyNkZWZpbmUga1BSRUNfVUYxICAgICAgICgweDEgPDwgMzApCisjZGVmaW5lIEtQUkVDX09GMCAgICAgICAoMHgxIDw8IDE1KQorI2RlZmluZSBLUFJFQ19VRjAgICAgICAgKDB4MSA8PCAxNCkKKworI2RlZmluZSBLUFJFQ19SRUNPVU5UMChuKQkoKG4pICYgMHhmZikKKyNkZWZpbmUgS1BSRUNfUkVDT1VOVDEobikJKCgobikgPj4gMTYpICYgMHhmZikKKworI2RlZmluZSBLUE1LX01LUCAgICAgICAgKDB4MSA8PCAzMSkKKyNkZWZpbmUgS1BBU19TTyAgICAgICAgICgweDEgPDwgMzEpCisjZGVmaW5lIEtQQVNNS1B4X1NPICAgICAoMHgxIDw8IDMxKQorCisjZGVmaW5lIEtQQVNfTVVLUChuKQkoKChuKSA+PiAyNikgJiAweDFmKQorI2RlZmluZSBLUEFTX1JQKG4pCSgoKG4pID4+IDQpICYgMHhmKQorI2RlZmluZSBLUEFTX0NQKG4pCSgobikgJiAweGYpCisKKyNkZWZpbmUgS1BBU01LUF9NS0NfTUFTSwkoMHhmZikKKworI2RlZmluZSBrZXlwYWRfcmVhZGwob2ZmKQlfX3Jhd19yZWFkbChrZXlwYWQtPm1taW9fYmFzZSArIChvZmYpKQorI2RlZmluZSBrZXlwYWRfd3JpdGVsKG9mZiwgdikJX19yYXdfd3JpdGVsKCh2KSwga2V5cGFkLT5tbWlvX2Jhc2UgKyAob2ZmKSkKKworI2RlZmluZSBNQVhfTUFUUklYX0tFWV9OVU0JKDggKiA4KQorCitzdHJ1Y3QgcHhhMjd4X2tleXBhZCB7CisJc3RydWN0IHB4YTI3eF9rZXlwYWRfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisKKwlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCXZvaWQgX19pb21lbSAqbW1pb19iYXNlOworCisJLyogbWF0cml4IGtleSBjb2RlIG1hcCAqLworCXVuc2lnbmVkIGludCBtYXRyaXhfa2V5Y29kZXNbTUFYX01BVFJJWF9LRVlfTlVNXTsKKworCS8qIHN0YXRlIHJvdyBiaXRzIG9mIGVhY2ggY29sdW1uIHNjYW4gKi8KKwl1aW50MzJfdCBtYXRyaXhfa2V5X3N0YXRlW01BWF9NQVRSSVhfS0VZX0NPTFNdOworCXVpbnQzMl90IGRpcmVjdF9rZXlfc3RhdGU7CisKKwl1bnNpZ25lZCBpbnQgZGlyZWN0X2tleV9tYXNrOworCisJaW50IHJvdGFyeV9yZWxfY29kZVsyXTsKKwlpbnQgcm90YXJ5X3VwX2tleVsyXTsKKwlpbnQgcm90YXJ5X2Rvd25fa2V5WzJdOworfTsKKworc3RhdGljIHZvaWQgcHhhMjd4X2tleXBhZF9idWlsZF9rZXljb2RlKHN0cnVjdCBweGEyN3hfa2V5cGFkICprZXlwYWQpCit7CisJc3RydWN0IHB4YTI3eF9rZXlwYWRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBrZXlwYWQtPnBkYXRhOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldiA9IGtleXBhZC0+aW5wdXRfZGV2OworCXVuc2lnbmVkIGludCAqa2V5OworCWludCBpOworCisJa2V5ID0gJnBkYXRhLT5tYXRyaXhfa2V5X21hcFswXTsKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm1hdHJpeF9rZXlfbWFwX3NpemU7IGkrKywga2V5KyspIHsKKwkJaW50IHJvdyA9ICgoKmtleSkgPj4gMjgpICYgMHhmOworCQlpbnQgY29sID0gKCgqa2V5KSA+PiAyNCkgJiAweGY7CisJCWludCBjb2RlID0gKCprZXkpICYgMHhmZmZmZmY7CisKKwkJa2V5cGFkLT5tYXRyaXhfa2V5Y29kZXNbKHJvdyA8PCAzKSArIGNvbF0gPSBjb2RlOworCQlzZXRfYml0KGNvZGUsIGlucHV0X2Rldi0+a2V5Yml0KTsKKwl9CisKKwlrZXlwYWQtPnJvdGFyeV91cF9rZXlbMF0gPSBwZGF0YS0+cm90YXJ5MF91cF9rZXk7CisJa2V5cGFkLT5yb3RhcnlfdXBfa2V5WzFdID0gcGRhdGEtPnJvdGFyeTFfdXBfa2V5OworCWtleXBhZC0+cm90YXJ5X2Rvd25fa2V5WzBdID0gcGRhdGEtPnJvdGFyeTBfZG93bl9rZXk7CisJa2V5cGFkLT5yb3RhcnlfZG93bl9rZXlbMV0gPSBwZGF0YS0+cm90YXJ5MV9kb3duX2tleTsKKwlrZXlwYWQtPnJvdGFyeV9yZWxfY29kZVswXSA9IHBkYXRhLT5yb3RhcnkwX3JlbF9jb2RlOworCWtleXBhZC0+cm90YXJ5X3JlbF9jb2RlWzFdID0gcGRhdGEtPnJvdGFyeTFfcmVsX2NvZGU7CisKKwlpZiAocGRhdGEtPnJvdGFyeTBfdXBfa2V5ICYmIHBkYXRhLT5yb3RhcnkwX2Rvd25fa2V5KSB7CisJCXNldF9iaXQocGRhdGEtPnJvdGFyeTBfdXBfa2V5LCBpbnB1dF9kZXYtPmtleWJpdCk7CisJCXNldF9iaXQocGRhdGEtPnJvdGFyeTBfZG93bl9rZXksIGlucHV0X2Rldi0+a2V5Yml0KTsKKwl9IGVsc2UKKwkJc2V0X2JpdChwZGF0YS0+cm90YXJ5MF9yZWxfY29kZSwgaW5wdXRfZGV2LT5yZWxiaXQpOworCisJaWYgKHBkYXRhLT5yb3RhcnkxX3VwX2tleSAmJiBwZGF0YS0+cm90YXJ5MV9kb3duX2tleSkgeworCQlzZXRfYml0KHBkYXRhLT5yb3RhcnkxX3VwX2tleSwgaW5wdXRfZGV2LT5rZXliaXQpOworCQlzZXRfYml0KHBkYXRhLT5yb3RhcnkxX2Rvd25fa2V5LCBpbnB1dF9kZXYtPmtleWJpdCk7CisJfSBlbHNlCisJCXNldF9iaXQocGRhdGEtPnJvdGFyeTFfcmVsX2NvZGUsIGlucHV0X2Rldi0+cmVsYml0KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbG9va3VwX21hdHJpeF9rZXljb2RlKAorCQlzdHJ1Y3QgcHhhMjd4X2tleXBhZCAqa2V5cGFkLCBpbnQgcm93LCBpbnQgY29sKQoreworCXJldHVybiBrZXlwYWQtPm1hdHJpeF9rZXljb2Rlc1socm93IDw8IDMpICsgY29sXTsKK30KKworc3RhdGljIHZvaWQgcHhhMjd4X2tleXBhZF9zY2FuX21hdHJpeChzdHJ1Y3QgcHhhMjd4X2tleXBhZCAqa2V5cGFkKQoreworCXN0cnVjdCBweGEyN3hfa2V5cGFkX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0ga2V5cGFkLT5wZGF0YTsKKwlpbnQgcm93LCBjb2wsIG51bV9rZXlzX3ByZXNzZWQgPSAwOworCXVpbnQzMl90IG5ld19zdGF0ZVtNQVhfTUFUUklYX0tFWV9DT0xTXTsKKwl1aW50MzJfdCBrcGFzID0ga2V5cGFkX3JlYWRsKEtQQVMpOworCisJbnVtX2tleXNfcHJlc3NlZCA9IEtQQVNfTVVLUChrcGFzKTsKKworCW1lbXNldChuZXdfc3RhdGUsIDAsIHNpemVvZihuZXdfc3RhdGUpKTsKKworCWlmIChudW1fa2V5c19wcmVzc2VkID09IDApCisJCWdvdG8gc2NhbjsKKworCWlmIChudW1fa2V5c19wcmVzc2VkID09IDEpIHsKKwkJY29sID0gS1BBU19DUChrcGFzKTsKKwkJcm93ID0gS1BBU19SUChrcGFzKTsKKworCQkvKiBpZiBpbnZhbGlkIHJvdy9jb2wsIHRyZWF0IGFzIG5vIGtleSBwcmVzc2VkICovCisJCWlmIChjb2wgPj0gcGRhdGEtPm1hdHJpeF9rZXlfY29scyB8fAorCQkgICAgcm93ID49IHBkYXRhLT5tYXRyaXhfa2V5X3Jvd3MpCisJCQlnb3RvIHNjYW47CisKKwkJbmV3X3N0YXRlW2NvbF0gPSAoMSA8PCByb3cpOworCQlnb3RvIHNjYW47CisJfQorCisJaWYgKG51bV9rZXlzX3ByZXNzZWQgPiAxKSB7CisJCXVpbnQzMl90IGtwYXNta3AwID0ga2V5cGFkX3JlYWRsKEtQQVNNS1AwKTsKKwkJdWludDMyX3Qga3Bhc21rcDEgPSBrZXlwYWRfcmVhZGwoS1BBU01LUDEpOworCQl1aW50MzJfdCBrcGFzbWtwMiA9IGtleXBhZF9yZWFkbChLUEFTTUtQMik7CisJCXVpbnQzMl90IGtwYXNta3AzID0ga2V5cGFkX3JlYWRsKEtQQVNNS1AzKTsKKworCQluZXdfc3RhdGVbMF0gPSBrcGFzbWtwMCAmIEtQQVNNS1BfTUtDX01BU0s7CisJCW5ld19zdGF0ZVsxXSA9IChrcGFzbWtwMCA+PiAxNikgJiBLUEFTTUtQX01LQ19NQVNLOworCQluZXdfc3RhdGVbMl0gPSBrcGFzbWtwMSAmIEtQQVNNS1BfTUtDX01BU0s7CisJCW5ld19zdGF0ZVszXSA9IChrcGFzbWtwMSA+PiAxNikgJiBLUEFTTUtQX01LQ19NQVNLOworCQluZXdfc3RhdGVbNF0gPSBrcGFzbWtwMiAmIEtQQVNNS1BfTUtDX01BU0s7CisJCW5ld19zdGF0ZVs1XSA9IChrcGFzbWtwMiA+PiAxNikgJiBLUEFTTUtQX01LQ19NQVNLOworCQluZXdfc3RhdGVbNl0gPSBrcGFzbWtwMyAmIEtQQVNNS1BfTUtDX01BU0s7CisJCW5ld19zdGF0ZVs3XSA9IChrcGFzbWtwMyA+PiAxNikgJiBLUEFTTUtQX01LQ19NQVNLOworCX0KK3NjYW46CisJZm9yIChjb2wgPSAwOyBjb2wgPCBwZGF0YS0+bWF0cml4X2tleV9jb2xzOyBjb2wrKykgeworCQl1aW50MzJfdCBiaXRzX2NoYW5nZWQ7CisKKwkJYml0c19jaGFuZ2VkID0ga2V5cGFkLT5tYXRyaXhfa2V5X3N0YXRlW2NvbF0gXiBuZXdfc3RhdGVbY29sXTsKKwkJaWYgKGJpdHNfY2hhbmdlZCA9PSAwKQorCQkJY29udGludWU7CisKKwkJZm9yIChyb3cgPSAwOyByb3cgPCBwZGF0YS0+bWF0cml4X2tleV9yb3dzOyByb3crKykgeworCQkJaWYgKChiaXRzX2NoYW5nZWQgJiAoMSA8PCByb3cpKSA9PSAwKQorCQkJCWNvbnRpbnVlOworCisJCQlpbnB1dF9yZXBvcnRfa2V5KGtleXBhZC0+aW5wdXRfZGV2LAorCQkJCWxvb2t1cF9tYXRyaXhfa2V5Y29kZShrZXlwYWQsIHJvdywgY29sKSwKKwkJCQluZXdfc3RhdGVbY29sXSAmICgxIDw8IHJvdykpOworCQl9CisJfQorCWlucHV0X3N5bmMoa2V5cGFkLT5pbnB1dF9kZXYpOworCW1lbWNweShrZXlwYWQtPm1hdHJpeF9rZXlfc3RhdGUsIG5ld19zdGF0ZSwgc2l6ZW9mKG5ld19zdGF0ZSkpOworfQorCisjZGVmaW5lIERFRkFVTFRfS1BSRUMJKDB4MDA3ZjAwN2YpCisKK3N0YXRpYyBpbmxpbmUgaW50IHJvdGFyeV9kZWx0YSh1aW50MzJfdCBrcHJlYykKK3sKKwlpZiAoa3ByZWMgJiBLUFJFQ19PRjApCisJCXJldHVybiAoa3ByZWMgJiAweGZmKSArIDB4N2Y7CisJZWxzZSBpZiAoa3ByZWMgJiBLUFJFQ19VRjApCisJCXJldHVybiAoa3ByZWMgJiAweGZmKSAtIDB4N2YgLSAweGZmOworCWVsc2UKKwkJcmV0dXJuIChrcHJlYyAmIDB4ZmYpIC0gMHg3ZjsKK30KKworc3RhdGljIHZvaWQgcmVwb3J0X3JvdGFyeV9ldmVudChzdHJ1Y3QgcHhhMjd4X2tleXBhZCAqa2V5cGFkLCBpbnQgciwgaW50IGRlbHRhKQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IGtleXBhZC0+aW5wdXRfZGV2OworCisJaWYgKGRlbHRhID09IDApCisJCXJldHVybjsKKworCWlmIChrZXlwYWQtPnJvdGFyeV91cF9rZXlbcl0gJiYga2V5cGFkLT5yb3RhcnlfZG93bl9rZXlbcl0pIHsKKwkJaW50IGtleWNvZGUgPSAoZGVsdGEgPiAwKSA/IGtleXBhZC0+cm90YXJ5X3VwX2tleVtyXSA6CisJCQkJCSAgICBrZXlwYWQtPnJvdGFyeV9kb3duX2tleVtyXTsKKworCQkvKiBzaW11bGF0ZSBhIHByZXNzLW4tcmVsZWFzZSAqLworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwga2V5Y29kZSwgMSk7CisJCWlucHV0X3N5bmMoZGV2KTsKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIGtleWNvZGUsIDApOworCQlpbnB1dF9zeW5jKGRldik7CisJfSBlbHNlIHsKKwkJaW5wdXRfcmVwb3J0X3JlbChkZXYsIGtleXBhZC0+cm90YXJ5X3JlbF9jb2RlW3JdLCBkZWx0YSk7CisJCWlucHV0X3N5bmMoZGV2KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHB4YTI3eF9rZXlwYWRfc2Nhbl9yb3Rhcnkoc3RydWN0IHB4YTI3eF9rZXlwYWQgKmtleXBhZCkKK3sKKwlzdHJ1Y3QgcHhhMjd4X2tleXBhZF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGtleXBhZC0+cGRhdGE7CisJdWludDMyX3Qga3ByZWM7CisKKwkvKiByZWFkIGFuZCByZXNldCB0byBkZWZhdWx0IGNvdW50IHZhbHVlICovCisJa3ByZWMgPSBrZXlwYWRfcmVhZGwoS1BSRUMpOworCWtleXBhZF93cml0ZWwoS1BSRUMsIERFRkFVTFRfS1BSRUMpOworCisJaWYgKHBkYXRhLT5lbmFibGVfcm90YXJ5MCkKKwkJcmVwb3J0X3JvdGFyeV9ldmVudChrZXlwYWQsIDAsIHJvdGFyeV9kZWx0YShrcHJlYykpOworCisJaWYgKHBkYXRhLT5lbmFibGVfcm90YXJ5MSkKKwkJcmVwb3J0X3JvdGFyeV9ldmVudChrZXlwYWQsIDEsIHJvdGFyeV9kZWx0YShrcHJlYyA+PiAxNikpOworfQorCitzdGF0aWMgdm9pZCBweGEyN3hfa2V5cGFkX3NjYW5fZGlyZWN0KHN0cnVjdCBweGEyN3hfa2V5cGFkICprZXlwYWQpCit7CisJc3RydWN0IHB4YTI3eF9rZXlwYWRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBrZXlwYWQtPnBkYXRhOworCXVuc2lnbmVkIGludCBuZXdfc3RhdGU7CisJdWludDMyX3Qga3BkaywgYml0c19jaGFuZ2VkOworCWludCBpOworCisJa3BkayA9IGtleXBhZF9yZWFkbChLUERLKTsKKworCWlmIChwZGF0YS0+ZW5hYmxlX3JvdGFyeTAgfHwgcGRhdGEtPmVuYWJsZV9yb3RhcnkxKQorCQlweGEyN3hfa2V5cGFkX3NjYW5fcm90YXJ5KGtleXBhZCk7CisKKwlpZiAocGRhdGEtPmRpcmVjdF9rZXlfbWFwID09IE5VTEwpCisJCXJldHVybjsKKworCW5ld19zdGF0ZSA9IEtQREtfREsoa3BkaykgJiBrZXlwYWQtPmRpcmVjdF9rZXlfbWFzazsKKwliaXRzX2NoYW5nZWQgPSBrZXlwYWQtPmRpcmVjdF9rZXlfc3RhdGUgXiBuZXdfc3RhdGU7CisKKwlpZiAoYml0c19jaGFuZ2VkID09IDApCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+ZGlyZWN0X2tleV9udW07IGkrKykgeworCQlpZiAoYml0c19jaGFuZ2VkICYgKDEgPDwgaSkpCisJCQlpbnB1dF9yZXBvcnRfa2V5KGtleXBhZC0+aW5wdXRfZGV2LAorCQkJCQlwZGF0YS0+ZGlyZWN0X2tleV9tYXBbaV0sCisJCQkJCShuZXdfc3RhdGUgJiAoMSA8PCBpKSkpOworCX0KKwlpbnB1dF9zeW5jKGtleXBhZC0+aW5wdXRfZGV2KTsKKwlrZXlwYWQtPmRpcmVjdF9rZXlfc3RhdGUgPSBuZXdfc3RhdGU7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBweGEyN3hfa2V5cGFkX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcHhhMjd4X2tleXBhZCAqa2V5cGFkID0gZGV2X2lkOworCXVuc2lnbmVkIGxvbmcga3BjID0ga2V5cGFkX3JlYWRsKEtQQyk7CisKKwlpZiAoa3BjICYgS1BDX0RJKQorCQlweGEyN3hfa2V5cGFkX3NjYW5fZGlyZWN0KGtleXBhZCk7CisKKwlpZiAoa3BjICYgS1BDX01JKQorCQlweGEyN3hfa2V5cGFkX3NjYW5fbWF0cml4KGtleXBhZCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHB4YTI3eF9rZXlwYWRfY29uZmlnKHN0cnVjdCBweGEyN3hfa2V5cGFkICprZXlwYWQpCit7CisJc3RydWN0IHB4YTI3eF9rZXlwYWRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBrZXlwYWQtPnBkYXRhOworCXVuc2lnbmVkIGludCBtYXNrID0gMCwgZGlyZWN0X2tleV9udW0gPSAwOworCXVuc2lnbmVkIGxvbmcga3BjID0gMDsKKworCS8qIGVuYWJsZSBtYXRyaXgga2V5cyB3aXRoIGF1dG9tYXRpYyBzY2FuICovCisJaWYgKHBkYXRhLT5tYXRyaXhfa2V5X3Jvd3MgJiYgcGRhdGEtPm1hdHJpeF9rZXlfY29scykgeworCQlrcGMgfD0gS1BDX0FTQUNUIHwgS1BDX01JRSB8IEtQQ19NRSB8IEtQQ19NU19BTEw7CisJCWtwYyB8PSBLUENfTUtSTihwZGF0YS0+bWF0cml4X2tleV9yb3dzKSB8CisJCSAgICAgICBLUENfTUtDTihwZGF0YS0+bWF0cml4X2tleV9jb2xzKTsKKwl9CisKKwkvKiBlbmFibGUgcm90YXJ5IGtleSwgZGVib3VuY2UgaW50ZXJ2YWwgc2FtZSBhcyBkaXJlY3Qga2V5cyAqLworCWlmIChwZGF0YS0+ZW5hYmxlX3JvdGFyeTApIHsKKwkJbWFzayB8PSAweDAzOworCQlkaXJlY3Rfa2V5X251bSA9IDI7CisJCWtwYyB8PSBLUENfUkVFMDsKKwl9CisKKwlpZiAocGRhdGEtPmVuYWJsZV9yb3RhcnkxKSB7CisJCW1hc2sgfD0gMHgwYzsKKwkJZGlyZWN0X2tleV9udW0gPSA0OworCQlrcGMgfD0gS1BDX1JFRTE7CisJfQorCisJaWYgKHBkYXRhLT5kaXJlY3Rfa2V5X251bSA+IGRpcmVjdF9rZXlfbnVtKQorCQlkaXJlY3Rfa2V5X251bSA9IHBkYXRhLT5kaXJlY3Rfa2V5X251bTsKKworCWtleXBhZC0+ZGlyZWN0X2tleV9tYXNrID0gKCgyIDw8IGRpcmVjdF9rZXlfbnVtKSAtIDEpICYgfm1hc2s7CisKKwkvKiBlbmFibGUgZGlyZWN0IGtleSAqLworCWlmIChkaXJlY3Rfa2V5X251bSkKKwkJa3BjIHw9IEtQQ19ERSB8IEtQQ19ESUUgfCBLUENfREtOKGRpcmVjdF9rZXlfbnVtKTsKKworCWtleXBhZF93cml0ZWwoS1BDLCBrcGMgfCBLUENfUkVfWkVST19ERUIpOworCWtleXBhZF93cml0ZWwoS1BSRUMsIERFRkFVTFRfS1BSRUMpOworCWtleXBhZF93cml0ZWwoS1BLREksIHBkYXRhLT5kZWJvdW5jZV9pbnRlcnZhbCk7Cit9CisKK3N0YXRpYyBpbnQgcHhhMjd4X2tleXBhZF9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcHhhMjd4X2tleXBhZCAqa2V5cGFkID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKworCS8qIEVuYWJsZSB1bml0IGNsb2NrICovCisJY2xrX2VuYWJsZShrZXlwYWQtPmNsayk7CisJcHhhMjd4X2tleXBhZF9jb25maWcoa2V5cGFkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBweGEyN3hfa2V5cGFkX2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcHhhMjd4X2tleXBhZCAqa2V5cGFkID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKworCS8qIERpc2FibGUgY2xvY2sgdW5pdCAqLworCWNsa19kaXNhYmxlKGtleXBhZC0+Y2xrKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBweGEyN3hfa2V5cGFkX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBweGEyN3hfa2V5cGFkICprZXlwYWQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWNsa19kaXNhYmxlKGtleXBhZC0+Y2xrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBweGEyN3hfa2V5cGFkX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBweGEyN3hfa2V5cGFkICprZXlwYWQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYgPSBrZXlwYWQtPmlucHV0X2RldjsKKworCW11dGV4X2xvY2soJmlucHV0X2Rldi0+bXV0ZXgpOworCisJaWYgKGlucHV0X2Rldi0+dXNlcnMpIHsKKwkJLyogRW5hYmxlIHVuaXQgY2xvY2sgKi8KKwkJY2xrX2VuYWJsZShrZXlwYWQtPmNsayk7CisJCXB4YTI3eF9rZXlwYWRfY29uZmlnKGtleXBhZCk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZpbnB1dF9kZXYtPm11dGV4KTsKKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgcHhhMjd4X2tleXBhZF9zdXNwZW5kCU5VTEwKKyNkZWZpbmUgcHhhMjd4X2tleXBhZF9yZXN1bWUJTlVMTAorI2VuZGlmCisKKyNkZWZpbmUgcmVzX3NpemUocmVzKQkoKHJlcyktPmVuZCAtIChyZXMpLT5zdGFydCArIDEpCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHB4YTI3eF9rZXlwYWRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcHhhMjd4X2tleXBhZCAqa2V5cGFkOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgaXJxLCBlcnJvcjsKKworCWtleXBhZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBweGEyN3hfa2V5cGFkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGtleXBhZCA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBkcml2ZXIgZGF0YVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWtleXBhZC0+cGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAoa2V5cGFkLT5wZGF0YSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHBsYXRmb3JtIGRhdGEgZGVmaW5lZFxuIik7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJZ290byBmYWlsZWRfZnJlZTsKKwl9CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQga2V5cGFkIGlycVxuIik7CisJCWVycm9yID0gLUVOWElPOworCQlnb3RvIGZhaWxlZF9mcmVlOworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKHJlcyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgSS9PIG1lbW9yeVxuIik7CisJCWVycm9yID0gLUVOWElPOworCQlnb3RvIGZhaWxlZF9mcmVlOworCX0KKworCXJlcyA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNfc2l6ZShyZXMpLCBwZGV2LT5uYW1lKTsKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgSS9PIG1lbW9yeVxuIik7CisJCWVycm9yID0gLUVCVVNZOworCQlnb3RvIGZhaWxlZF9mcmVlOworCX0KKworCWtleXBhZC0+bW1pb19iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNfc2l6ZShyZXMpKTsKKwlpZiAoa2V5cGFkLT5tbWlvX2Jhc2UgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVtYXAgSS9PIG1lbW9yeVxuIik7CisJCWVycm9yID0gLUVOWElPOworCQlnb3RvIGZhaWxlZF9mcmVlX21lbTsKKwl9CisKKwlrZXlwYWQtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgIktCRENMSyIpOworCWlmIChJU19FUlIoa2V5cGFkLT5jbGspKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQga2V5cGFkIGNsb2NrXG4iKTsKKwkJZXJyb3IgPSBQVFJfRVJSKGtleXBhZC0+Y2xrKTsKKwkJZ290byBmYWlsZWRfZnJlZV9pbzsKKwl9CisKKwkvKiBDcmVhdGUgYW5kIHJlZ2lzdGVyIHRoZSBpbnB1dCBkcml2ZXIuICovCisJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFpbnB1dF9kZXYpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGlucHV0IGRldmljZVxuIik7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBmYWlsZWRfcHV0X2NsazsKKwl9CisKKwlpbnB1dF9kZXYtPm5hbWUgPSBwZGV2LT5uYW1lOworCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOworCWlucHV0X2Rldi0+b3BlbiA9IHB4YTI3eF9rZXlwYWRfb3BlbjsKKwlpbnB1dF9kZXYtPmNsb3NlID0gcHhhMjd4X2tleXBhZF9jbG9zZTsKKwlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCisJa2V5cGFkLT5pbnB1dF9kZXYgPSBpbnB1dF9kZXY7CisJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXRfZGV2LCBrZXlwYWQpOworCisJaW5wdXRfZGV2LT5ldmJpdFswXSA9IEJJVF9NQVNLKEVWX0tFWSkgfCBCSVRfTUFTSyhFVl9SRVApIHwKKwkJQklUX01BU0soRVZfUkVMKTsKKworCXB4YTI3eF9rZXlwYWRfYnVpbGRfa2V5Y29kZShrZXlwYWQpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGtleXBhZCk7CisKKwllcnJvciA9IHJlcXVlc3RfaXJxKGlycSwgcHhhMjd4X2tleXBhZF9pcnFfaGFuZGxlciwgSVJRRl9ESVNBQkxFRCwKKwkJCSAgICBwZGV2LT5uYW1lLCBrZXlwYWQpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBJUlFcbiIpOworCQlnb3RvIGZhaWxlZF9mcmVlX2RldjsKKwl9CisKKwkvKiBSZWdpc3RlciB0aGUgaW5wdXQgZGV2aWNlICovCisJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGlucHV0IGRldmljZVxuIik7CisJCWdvdG8gZmFpbGVkX2ZyZWVfaXJxOworCX0KKworCXJldHVybiAwOworCitmYWlsZWRfZnJlZV9pcnE6CisJZnJlZV9pcnEoaXJxLCBwZGV2KTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKK2ZhaWxlZF9mcmVlX2RldjoKKwlpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworZmFpbGVkX3B1dF9jbGs6CisJY2xrX3B1dChrZXlwYWQtPmNsayk7CitmYWlsZWRfZnJlZV9pbzoKKwlpb3VubWFwKGtleXBhZC0+bW1pb19iYXNlKTsKK2ZhaWxlZF9mcmVlX21lbToKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzX3NpemUocmVzKSk7CitmYWlsZWRfZnJlZToKKwlrZnJlZShrZXlwYWQpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgcHhhMjd4X2tleXBhZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcHhhMjd4X2tleXBhZCAqa2V5cGFkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisKKwlmcmVlX2lycShwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApLCBwZGV2KTsKKworCWNsa19kaXNhYmxlKGtleXBhZC0+Y2xrKTsKKwljbGtfcHV0KGtleXBhZC0+Y2xrKTsKKworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGtleXBhZC0+aW5wdXRfZGV2KTsKKwlpbnB1dF9mcmVlX2RldmljZShrZXlwYWQtPmlucHV0X2Rldik7CisKKwlpb3VubWFwKGtleXBhZC0+bW1pb19iYXNlKTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc19zaXplKHJlcykpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJa2ZyZWUoa2V5cGFkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcHhhMjd4X2tleXBhZF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHB4YTI3eF9rZXlwYWRfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChweGEyN3hfa2V5cGFkX3JlbW92ZSksCisJLnN1c3BlbmQJPSBweGEyN3hfa2V5cGFkX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBweGEyN3hfa2V5cGFkX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicHhhMjd4LWtleXBhZCIsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHB4YTI3eF9rZXlwYWRfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnB4YTI3eF9rZXlwYWRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHB4YTI3eF9rZXlwYWRfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZweGEyN3hfa2V5cGFkX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHB4YTI3eF9rZXlwYWRfaW5pdCk7Cittb2R1bGVfZXhpdChweGEyN3hfa2V5cGFkX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlBYQTI3eCBLZXlwYWQgQ29udHJvbGxlciBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvdG9zYWtiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90b3Nha2JkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg4NGQxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvdG9zYWtiZC5jCkBAIC0wLDAgKzEsNDE1IEBACisvKgorICogIEtleWJvYXJkIGRyaXZlciBmb3IgU2hhcnAgVG9zYSBtb2RlbHMgKFNMLTYwMDB4KQorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUgRGlyayBPcGZlcgorICogIENvcHlyaWdodCAoYykgMjAwNyBEbWl0cnkgQmFyeXNoa292CisgKgorICogIEJhc2VkIG9uIHh0a2JkLmMvbG9jb21rYmQuYy9jb3JnaWtiZC5jCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC90b3NhLmg+CisKKyNkZWZpbmUgS0JfUk9XTUFTSyhyKQkJKDEgPDwgKHIpKQorI2RlZmluZSBTQ0FOQ09ERShyLCBjKQkJKCgocik8PDQpICsgKGMpICsgMSkKKyNkZWZpbmUgTlJfU0NBTkNPREVTCQlTQ0FOQ09ERShUT1NBX0tFWV9TRU5TRV9OVU0gLSAxLCBUT1NBX0tFWV9TVFJPQkVfTlVNIC0gMSkgKyAxCisKKyNkZWZpbmUgU0NBTl9JTlRFUlZBTAkJKEhaLzEwKQorCisjZGVmaW5lIEtCX0RJU0NIQVJHRV9ERUxBWQkxMAorI2RlZmluZSBLQl9BQ1RJVkFURV9ERUxBWQkxMAorCitzdGF0aWMgdW5zaWduZWQgaW50IHRvc2FrYmRfa2V5Y29kZVtOUl9TQ0FOQ09ERVNdID0geworMCwKKzAsIEtFWV9XLCAwLCAwLCAwLCBLRVlfSywgS0VZX0JBQ0tTUEFDRSwgS0VZX1AsCiswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorS0VZX1EsIEtFWV9FLCBLRVlfVCwgS0VZX1ksIDAsIEtFWV9PLCBLRVlfSSwgS0VZX0NPTU1BLAorMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKK0tFWV9BLCBLRVlfRCwgS0VZX0csIEtFWV9VLCAwLCBLRVlfTCwgS0VZX0VOVEVSLCBLRVlfRE9ULAorMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKK0tFWV9aLCBLRVlfQywgS0VZX1YsIEtFWV9KLCBUT1NBX0tFWV9BRERSRVNTQk9PSywgVE9TQV9LRVlfQ0FOQ0VMLCBUT1NBX0tFWV9DRU5URVIsIFRPU0FfS0VZX09LLAorS0VZX0xFRlRTSElGVCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKK0tFWV9TLCBLRVlfUiwgS0VZX0IsIEtFWV9OLCBUT1NBX0tFWV9DQUxFTkRBUiwgVE9TQV9LRVlfSE9NRVBBR0UsIEtFWV9MRUZUQ1RSTCwgVE9TQV9LRVlfTElHSFQsCiswLCBLRVlfUklHSFRTSElGVCwgMCwgMCwgMCwgMCwgMCwgMCwKK0tFWV9UQUIsIEtFWV9TTEFTSCwgS0VZX0gsIEtFWV9NLCBUT1NBX0tFWV9NRU5VLCAwLCBLRVlfVVAsIDAsCiswLCAwLCBUT1NBX0tFWV9GTiwgMCwgMCwgMCwgMCwgMCwKK0tFWV9YLCBLRVlfRiwgS0VZX1NQQUNFLCBLRVlfQVBPU1RST1BIRSwgVE9TQV9LRVlfTUFJTCwgS0VZX0xFRlQsIEtFWV9ET1dOLCBLRVlfUklHSFQsCiswLCAwLCAwLAorfTsKKworc3RydWN0IHRvc2FrYmQgeworCXVuc2lnbmVkIGludCBrZXljb2RlW0FSUkFZX1NJWkUodG9zYWtiZF9rZXljb2RlKV07CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisKKwlzcGlubG9ja190IGxvY2s7IC8qIHByb3RlY3Qga2JkIHNjYW5uaW5nICovCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7Cit9OworCisKKy8qIEhlbHBlciBmdW5jdGlvbnMgZm9yIHJlYWRpbmcgdGhlIGtleWJvYXJkIG1hdHJpeAorICogTm90ZTogV2Ugc2hvdWxkIHJlYWxseSBiZSB1c2luZyBweGFfZ3Bpb19tb2RlIHRvIGFsdGVyIEdQRFIgYnV0IGl0CisgKiAgICAgICByZXF1aXJlcyBhIGZ1bmN0aW9uIGNhbGwgcGVyIEdQSU8gYml0IHdoaWNoIGlzIGV4Y2Vzc2l2ZQorICogICAgICAgd2hlbiB3ZSBuZWVkIHRvIGFjY2VzcyAxMiBiaXRzIGF0IG9uY2UsIG11bHRpcGxlIHRpbWVzLgorICogVGhlc2UgZnVuY3Rpb25zIG11c3QgYmUgY2FsbGVkIHdpdGhpbiBsb2NhbF9pcnFfc2F2ZSgpL2xvY2FsX2lycV9yZXN0b3JlKCkKKyAqIG9yIHNpbWlsYXIuCisgKi8KKyNkZWZpbmUgR0VUX1JPV1NfU1RBVFVTKGMpCSgoR1BMUjIgJiBUT1NBX0dQSU9fQUxMX1NFTlNFX0JJVCkgPj4gVE9TQV9HUElPX0FMTF9TRU5TRV9SU0hJRlQpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0b3Nha2JkX2Rpc2NoYXJnZV9hbGwodm9pZCkKK3sKKwkvKiBTVFJPQkUgQWxsIEhpWiAqLworCUdQQ1IxICA9IFRPU0FfR1BJT19ISUdIX1NUUk9CRV9CSVQ7CisJR1BEUjEgJj0gflRPU0FfR1BJT19ISUdIX1NUUk9CRV9CSVQ7CisJR1BDUjIgID0gVE9TQV9HUElPX0xPV19TVFJPQkVfQklUOworCUdQRFIyICY9IH5UT1NBX0dQSU9fTE9XX1NUUk9CRV9CSVQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0b3Nha2JkX2FjdGl2YXRlX2FsbCh2b2lkKQoreworCS8qIFNUUk9CRSBBTEwgLT4gSGlnaCAqLworCUdQU1IxICA9IFRPU0FfR1BJT19ISUdIX1NUUk9CRV9CSVQ7CisJR1BEUjEgfD0gVE9TQV9HUElPX0hJR0hfU1RST0JFX0JJVDsKKwlHUFNSMiAgPSBUT1NBX0dQSU9fTE9XX1NUUk9CRV9CSVQ7CisJR1BEUjIgfD0gVE9TQV9HUElPX0xPV19TVFJPQkVfQklUOworCisJdWRlbGF5KEtCX0RJU0NIQVJHRV9ERUxBWSk7CisKKwkvKiBTVEFURSBDTEVBUiAqLworCUdFRFIyIHw9IFRPU0FfR1BJT19BTExfU0VOU0VfQklUOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdG9zYWtiZF9hY3RpdmF0ZV9jb2woaW50IGNvbCkKK3sKKwlpZiAoY29sIDw9IDUpIHsKKwkJLyogU1RST0JFIGNvbCAtPiBIaWdoLCBub3QgY29sIC0+IEhpWiAqLworCQlHUFNSMSA9IFRPU0FfR1BJT19TVFJPQkVfQklUKGNvbCk7CisJCUdQRFIxID0gKEdQRFIxICYgflRPU0FfR1BJT19ISUdIX1NUUk9CRV9CSVQpIHwgVE9TQV9HUElPX1NUUk9CRV9CSVQoY29sKTsKKwl9IGVsc2UgeworCQkvKiBTVFJPQkUgY29sIC0+IEhpZ2gsIG5vdCBjb2wgLT4gSGlaICovCisJCUdQU1IyID0gVE9TQV9HUElPX1NUUk9CRV9CSVQoY29sKTsKKwkJR1BEUjIgPSAoR1BEUjIgJiB+VE9TQV9HUElPX0xPV19TVFJPQkVfQklUKSB8IFRPU0FfR1BJT19TVFJPQkVfQklUKGNvbCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdG9zYWtiZF9yZXNldF9jb2woaW50IGNvbCkKK3sKKwlpZiAoY29sIDw9IDUpIHsKKwkJLyogU1RST0JFIGNvbCAtPiBMb3cgKi8KKwkJR1BDUjEgPSBUT1NBX0dQSU9fU1RST0JFX0JJVChjb2wpOworCQkvKiBTVFJPQkUgY29sIC0+IG91dCwgbm90IGNvbCAtPiBIaVogKi8KKwkJR1BEUjEgPSAoR1BEUjEgJiB+VE9TQV9HUElPX0hJR0hfU1RST0JFX0JJVCkgfCBUT1NBX0dQSU9fU1RST0JFX0JJVChjb2wpOworCX0gZWxzZSB7CisJCS8qIFNUUk9CRSBjb2wgLT4gTG93ICovCisJCUdQQ1IyID0gVE9TQV9HUElPX1NUUk9CRV9CSVQoY29sKTsKKwkJLyogU1RST0JFIGNvbCAtPiBvdXQsIG5vdCBjb2wgLT4gSGlaICovCisJCUdQRFIyID0gKEdQRFIyICYgflRPU0FfR1BJT19MT1dfU1RST0JFX0JJVCkgfCBUT1NBX0dQSU9fU1RST0JFX0JJVChjb2wpOworCX0KK30KKy8qCisgKiBUaGUgdG9zYSBrZXlib2FyZCBvbmx5IGdlbmVyYXRlcyBpbnRlcnJ1cHRzIHdoZW4gYSBrZXkgaXMgcHJlc3NlZC4KKyAqIFNvIHdoZW4gYSBrZXkgaXMgcHJlc3NlZCwgd2UgZW5hYmxlIGEgdGltZXIuICBUaGlzIHRpbWVyIHNjYW5zIHRoZQorICoga2V5Ym9hcmQsIGFuZCB0aGlzIGlzIGhvdyB3ZSBkZXRlY3Qgd2hlbiB0aGUga2V5IGlzIHJlbGVhc2VkLgorICovCisKKy8qIFNjYW4gdGhlIGhhcmR3YXJlIGtleWJvYXJkIGFuZCBwdXNoIGFueSBjaGFuZ2VzIHVwIHRocm91Z2ggdGhlIGlucHV0IGxheWVyICovCitzdGF0aWMgdm9pZCB0b3Nha2JkX3NjYW5rZXlib2FyZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRvc2FrYmQgKnRvc2FrYmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGludCByb3csIGNvbCwgcm93ZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBudW1fcHJlc3NlZCA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdG9zYWtiZC0+bG9jaywgZmxhZ3MpOworCisJZm9yIChjb2wgPSAwOyBjb2wgPCBUT1NBX0tFWV9TVFJPQkVfTlVNOyBjb2wrKykgeworCQkvKgorCQkgKiBEaXNjaGFyZ2UgdGhlIG91dHB1dCBkcml2ZXIgY2FwYWNpdGF0YW5jZQorCQkgKiBpbiB0aGUga2V5Ym9hcmQgbWF0cml4LiAoWWVzIGl0IGlzIHNpZ25pZmljYW50Li4pCisJCSAqLworCQl0b3Nha2JkX2Rpc2NoYXJnZV9hbGwoKTsKKwkJdWRlbGF5KEtCX0RJU0NIQVJHRV9ERUxBWSk7CisKKwkJdG9zYWtiZF9hY3RpdmF0ZV9jb2woY29sKTsKKwkJdWRlbGF5KEtCX0FDVElWQVRFX0RFTEFZKTsKKworCQlyb3dkID0gR0VUX1JPV1NfU1RBVFVTKGNvbCk7CisKKwkJZm9yIChyb3cgPSAwOyByb3cgPCBUT1NBX0tFWV9TRU5TRV9OVU07IHJvdysrKSB7CisJCQl1bnNpZ25lZCBpbnQgc2NhbmNvZGUsIHByZXNzZWQ7CisJCQlzY2FuY29kZSA9IFNDQU5DT0RFKHJvdywgY29sKTsKKwkJCXByZXNzZWQgPSByb3dkICYgS0JfUk9XTUFTSyhyb3cpOworCisJCQlpZiAocHJlc3NlZCAmJiAhdG9zYWtiZC0+a2V5Y29kZVtzY2FuY29kZV0pCisJCQkJZGV2X3dhcm4oJmRldi0+ZGV2LAorCQkJCQkJInVuaGFuZGxlZCBzY2FuY29kZTogMHglMDJ4XG4iLAorCQkJCQkJc2NhbmNvZGUpOworCisJCQlpbnB1dF9yZXBvcnRfa2V5KHRvc2FrYmQtPmlucHV0LAorCQkJCQl0b3Nha2JkLT5rZXljb2RlW3NjYW5jb2RlXSwKKwkJCQkJcHJlc3NlZCk7CisJCQlpZiAocHJlc3NlZCkKKwkJCQludW1fcHJlc3NlZCsrOworCQl9CisKKwkJdG9zYWtiZF9yZXNldF9jb2woY29sKTsKKwl9CisKKwl0b3Nha2JkX2FjdGl2YXRlX2FsbCgpOworCisJaW5wdXRfc3luYyh0b3Nha2JkLT5pbnB1dCk7CisKKwkvKiBpZiBhbnkga2V5cyBhcmUgcHJlc3NlZCwgZW5hYmxlIHRoZSB0aW1lciAqLworCWlmIChudW1fcHJlc3NlZCkKKwkJbW9kX3RpbWVyKCZ0b3Nha2JkLT50aW1lciwgamlmZmllcyArIFNDQU5fSU5URVJWQUwpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdG9zYWtiZC0+bG9jaywgZmxhZ3MpOworfQorCisvKgorICogdG9zYSBrZXlib2FyZCBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLworc3RhdGljIGlycXJldHVybl90IHRvc2FrYmRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKl9fZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiA9IF9fZGV2OworCXN0cnVjdCB0b3Nha2JkICp0b3Nha2JkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICghdGltZXJfcGVuZGluZygmdG9zYWtiZC0+dGltZXIpKSB7CisJCS8qKiB3YWl0IGNoYXR0ZXJpbmcgZGVsYXkgKiovCisJCXVkZWxheSgyMCk7CisJCXRvc2FrYmRfc2NhbmtleWJvYXJkKGRldik7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogdG9zYSB0aW1lciBjaGVja2luZyBmb3IgcmVsZWFzZWQga2V5cworICovCitzdGF0aWMgdm9pZCB0b3Nha2JkX3RpbWVyX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgX19kZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKilfX2RldjsKKwl0b3Nha2JkX3NjYW5rZXlib2FyZChkZXYpOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHRvc2FrYmRfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgdG9zYWtiZCAqdG9zYWtiZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisKKwlkZWxfdGltZXJfc3luYygmdG9zYWtiZC0+dGltZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdG9zYWtiZF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXRvc2FrYmRfc2NhbmtleWJvYXJkKGRldik7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIHRvc2FrYmRfc3VzcGVuZAkJTlVMTAorI2RlZmluZSB0b3Nha2JkX3Jlc3VtZQkJTlVMTAorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRvc2FrYmRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikgeworCisJaW50IGk7CisJc3RydWN0IHRvc2FrYmQgKnRvc2FrYmQ7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCWludCBlcnJvcjsKKworCXRvc2FrYmQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdG9zYWtiZCksIEdGUF9LRVJORUwpOworCWlmICghdG9zYWtiZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWlucHV0X2RldikgeworCQlrZnJlZSh0b3Nha2JkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgdG9zYWtiZCk7CisKKwlzcGluX2xvY2tfaW5pdCgmdG9zYWtiZC0+bG9jayk7CisKKwkvKiBJbml0IEtleWJvYXJkIHJlc2NhbiB0aW1lciAqLworCWluaXRfdGltZXIoJnRvc2FrYmQtPnRpbWVyKTsKKwl0b3Nha2JkLT50aW1lci5mdW5jdGlvbiA9IHRvc2FrYmRfdGltZXJfY2FsbGJhY2s7CisJdG9zYWtiZC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBwZGV2OworCisJdG9zYWtiZC0+aW5wdXQgPSBpbnB1dF9kZXY7CisKKwlpbnB1dF9zZXRfZHJ2ZGF0YShpbnB1dF9kZXYsIHRvc2FrYmQpOworCWlucHV0X2Rldi0+bmFtZSA9ICJUb3NhIEtleWJvYXJkIjsKKwlpbnB1dF9kZXYtPnBoeXMgPSAidG9zYWtiZC9pbnB1dDAiOworCWlucHV0X2Rldi0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisKKwlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKKwlpbnB1dF9kZXYtPmlkLnZlbmRvciA9IDB4MDAwMTsKKwlpbnB1dF9kZXYtPmlkLnByb2R1Y3QgPSAweDAwMDE7CisJaW5wdXRfZGV2LT5pZC52ZXJzaW9uID0gMHgwMTAwOworCisJaW5wdXRfZGV2LT5ldmJpdFswXSA9IEJJVChFVl9LRVkpIHwgQklUKEVWX1JFUCk7CisJaW5wdXRfZGV2LT5rZXljb2RlID0gdG9zYWtiZC0+a2V5Y29kZTsKKwlpbnB1dF9kZXYtPmtleWNvZGVzaXplID0gc2l6ZW9mKHVuc2lnbmVkIGludCk7CisJaW5wdXRfZGV2LT5rZXljb2RlbWF4ID0gQVJSQVlfU0laRSh0b3Nha2JkX2tleWNvZGUpOworCisJbWVtY3B5KHRvc2FrYmQtPmtleWNvZGUsIHRvc2FrYmRfa2V5Y29kZSwgc2l6ZW9mKHRvc2FrYmRfa2V5Y29kZSkpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodG9zYWtiZF9rZXljb2RlKTsgaSsrKQorCQlfX3NldF9iaXQodG9zYWtiZC0+a2V5Y29kZVtpXSwgaW5wdXRfZGV2LT5rZXliaXQpOworCWNsZWFyX2JpdCgwLCBpbnB1dF9kZXYtPmtleWJpdCk7CisKKwkvKiBTZXR1cCBzZW5zZSBpbnRlcnJ1cHRzIC0gUmlzaW5nRWRnZSBEZXRlY3QsIHNlbnNlIGxpbmVzIGFzIGlucHV0cyAqLworCWZvciAoaSA9IDA7IGkgPCBUT1NBX0tFWV9TRU5TRV9OVU07IGkrKykgeworCQlpbnQgZ3BpbyA9IFRPU0FfR1BJT19LRVlfU0VOU0UoaSk7CisJCWludCBpcnE7CisJCWVycm9yID0gZ3Bpb19yZXF1ZXN0KGdwaW8sICJ0b3Nha2JkIik7CisJCWlmIChlcnJvciA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAidG9zYWtiZDogZmFpbGVkIHRvIHJlcXVlc3QgR1BJTyAlZCwgIgorCQkJCSIgZXJyb3IgJWRcbiIsIGdwaW8sIGVycm9yKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCWVycm9yID0gZ3Bpb19kaXJlY3Rpb25faW5wdXQoVE9TQV9HUElPX0tFWV9TRU5TRShpKSk7CisJCWlmIChlcnJvciA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAidG9zYWtiZDogZmFpbGVkIHRvIGNvbmZpZ3VyZSBpbnB1dCIKKwkJCQkiIGRpcmVjdGlvbiBmb3IgR1BJTyAlZCwgZXJyb3IgJWRcbiIsCisJCQkJZ3BpbywgZXJyb3IpOworCQkJZ3Bpb19mcmVlKGdwaW8pOworCQkJZ290byBmYWlsOworCQl9CisKKwkJaXJxID0gZ3Bpb190b19pcnEoZ3Bpbyk7CisJCWlmIChpcnEgPCAwKSB7CisJCQllcnJvciA9IGlycTsKKwkJCXByaW50ayhLRVJOX0VSUiAiZ3Bpby1rZXlzOiBVbmFibGUgdG8gZ2V0IGlycSBudW1iZXIiCisJCQkJIiBmb3IgR1BJTyAlZCwgZXJyb3IgJWRcbiIsCisJCQkJZ3BpbywgZXJyb3IpOworCQkJZ3Bpb19mcmVlKGdwaW8pOworCQkJZ290byBmYWlsOworCQl9CisKKwkJZXJyb3IgPSByZXF1ZXN0X2lycShpcnEsIHRvc2FrYmRfaW50ZXJydXB0LAorCQkJCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9UUklHR0VSX1JJU0lORywKKwkJCQkJInRvc2FrYmQiLCBwZGV2KTsKKworCQlpZiAoZXJyb3IpIHsKKwkJCXByaW50aygidG9zYWtiZDogQ2FuJ3QgZ2V0IElSUTogJWQ6IGVycm9yICVkIVxuIiwKKwkJCQkJaXJxLCBlcnJvcik7CisJCQlncGlvX2ZyZWUoZ3Bpbyk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwkvKiBTZXQgU3Ryb2JlIGxpbmVzIGFzIG91dHB1dHMgLSBzZXQgaGlnaCAqLworCWZvciAoaSA9IDA7IGkgPCBUT1NBX0tFWV9TVFJPQkVfTlVNOyBpKyspIHsKKwkJaW50IGdwaW8gPSBUT1NBX0dQSU9fS0VZX1NUUk9CRShpKTsKKwkJZXJyb3IgPSBncGlvX3JlcXVlc3QoZ3BpbywgInRvc2FrYmQiKTsKKwkJaWYgKGVycm9yIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ0b3Nha2JkOiBmYWlsZWQgdG8gcmVxdWVzdCBHUElPICVkLCAiCisJCQkJIiBlcnJvciAlZFxuIiwgZ3BpbywgZXJyb3IpOworCQkJZ290byBmYWlsMjsKKwkJfQorCisJCWVycm9yID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW8sIDEpOworCQlpZiAoZXJyb3IgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInRvc2FrYmQ6IGZhaWxlZCB0byBjb25maWd1cmUgaW5wdXQiCisJCQkJIiBkaXJlY3Rpb24gZm9yIEdQSU8gJWQsIGVycm9yICVkXG4iLAorCQkJCWdwaW8sIGVycm9yKTsKKwkJCWdwaW9fZnJlZShncGlvKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJfQorCisJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXRfZGV2KTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0b3Nha2JkOiBVbmFibGUgdG8gcmVnaXN0ZXIgaW5wdXQgZGV2aWNlLCAiCisJCQkiZXJyb3I6ICVkXG4iLCBlcnJvcik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJpbnB1dDogVG9zYSBLZXlib2FyZCBSZWdpc3RlcmVkXG4iKTsKKworCXJldHVybiAwOworCitmYWlsMjoKKwl3aGlsZSAoLS1pID49IDApCisJCWdwaW9fZnJlZShUT1NBX0dQSU9fS0VZX1NUUk9CRShpKSk7CisKKwlpID0gVE9TQV9LRVlfU0VOU0VfTlVNOworZmFpbDoKKwl3aGlsZSAoLS1pID49IDApIHsKKwkJZnJlZV9pcnEoZ3Bpb190b19pcnEoVE9TQV9HUElPX0tFWV9TRU5TRShpKSksIHBkZXYpOworCQlncGlvX2ZyZWUoVE9TQV9HUElPX0tFWV9TRU5TRShpKSk7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKKwlrZnJlZSh0b3Nha2JkKTsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgdG9zYWtiZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KSB7CisKKwlpbnQgaTsKKwlzdHJ1Y3QgdG9zYWtiZCAqdG9zYWtiZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisKKwlmb3IgKGkgPSAwOyBpIDwgVE9TQV9LRVlfU1RST0JFX05VTTsgaSsrKQorCQlncGlvX2ZyZWUoVE9TQV9HUElPX0tFWV9TVFJPQkUoaSkpOworCisJZm9yIChpID0gMDsgaSA8IFRPU0FfS0VZX1NFTlNFX05VTTsgaSsrKSB7CisJCWZyZWVfaXJxKGdwaW9fdG9faXJxKFRPU0FfR1BJT19LRVlfU0VOU0UoaSkpLCBkZXYpOworCQlncGlvX2ZyZWUoVE9TQV9HUElPX0tFWV9TRU5TRShpKSk7CisJfQorCisJZGVsX3RpbWVyX3N5bmMoJnRvc2FrYmQtPnRpbWVyKTsKKworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHRvc2FrYmQtPmlucHV0KTsKKworCWtmcmVlKHRvc2FrYmQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRvc2FrYmRfZHJpdmVyID0geworCS5wcm9iZQkJPSB0b3Nha2JkX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodG9zYWtiZF9yZW1vdmUpLAorCS5zdXNwZW5kCT0gdG9zYWtiZF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gdG9zYWtiZF9yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInRvc2Eta2V5Ym9hcmQiLAorCX0sCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB0b3Nha2JkX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ0b3Nha2JkX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0b3Nha2JkX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdG9zYWtiZF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh0b3Nha2JkX2luaXQpOworbW9kdWxlX2V4aXQodG9zYWtiZF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiRGlyayBPcGZlciA8RGlya0BPcGZlci1PbmxpbmUuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRvc2EgS2V5Ym9hcmQgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9LY29uZmlnCmluZGV4IDhmNWM3YjkuLjhiMTBkOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9LY29uZmlnCkBAIC00MCw2ICs0MCwyMCBAQAogCXRyaXN0YXRlICJNNjhrIEJlZXBlciBzdXBwb3J0IgogCWRlcGVuZHMgb24gTTY4SwogCitjb25maWcgSU5QVVRfQVBBTkVMCisJdHJpc3RhdGUgIkZ1aml0c3UgTGlmZWJvb2sgQXBwbGljYXRpb24gUGFuZWwgYnV0dG9ucyIKKwlkZXBlbmRzIG9uIFg4NgorCXNlbGVjdCBJMkNfSTgwMQorCXNlbGVjdCBJTlBVVF9QT0xMREVWCisJc2VsZWN0IENIRUNLX1NJR05BVFVSRQorCWhlbHAKKwkgU2F5IFkgaGVyZSBmb3Igc3VwcG9ydCBvZiB0aGUgQXBwbGljYXRpb24gUGFuZWwgYnV0dG9ucywgdXNlZCBvbgorCSBGdWppdHN1IExpZmVib29rLiBUaGVzZSBhcmUgYXR0YWNoZWQgdG8gdGhlIG1haW5ib2FyZCB0aHJvdWdoCisJIGFuIFNNQnVzIGludGVyZmFjZSBtYW5hZ2VkIGJ5IHRoZSBJMkMgSW50ZWwgSUNIIChpODAxKSBkcml2ZXIuCisKKwkgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCisJIGJlIGNhbGxlZCBhcGFuZWwuCisKIGNvbmZpZyBJTlBVVF9JWFA0WFhfQkVFUEVSCiAJdHJpc3RhdGUgIklYUDRYWCBCZWVwZXIgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFSQ0hfSVhQNFhYCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvTWFrZWZpbGUgYi9kcml2ZXJzL2lucHV0L21pc2MvTWFrZWZpbGUKaW5kZXggMzU4NWI1MC4uZWJkMzlmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9NYWtlZmlsZQpAQCAtMTgsMyArMTgsNCBAQAogb2JqLSQoQ09ORklHX0lOUFVUX1lFQUxJTkspCQkrPSB5ZWFsaW5rLm8KIG9iai0kKENPTkZJR19IUF9TRENfUlRDKQkJKz0gaHBfc2RjX3J0Yy5vCiBvYmotJChDT05GSUdfSU5QVVRfVUlOUFVUKQkJKz0gdWlucHV0Lm8KK29iai0kKENPTkZJR19JTlBVVF9BUEFORUwpCQkrPSBhcGFuZWwubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL2FwYW5lbC5jIGIvZHJpdmVycy9pbnB1dC9taXNjL2FwYW5lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MzFkOGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L21pc2MvYXBhbmVsLmMKQEAgLTAsMCArMSwzNzggQEAKKy8qCisgKiAgRnVqaXRzdSBMaWZlYm9vayBBcHBsaWNhdGlvbiBQYW5lbCBidXR0b24gZHJpdmUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IFN0ZXBoZW4gSGVtbWluZ2VyIDxzaGVtbWluZ2VyQGxpbnV4LWZvdW5kYXRpb24ub3JnPgorICogIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIEpvY2hlbiBFaXNpbmdlciA8am9jaGVuQHBlbmd1aW4tYnJlZWRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBNYW55IEZ1aml0c3UgTGlmZWJvb2sgbGFwdG9wcyBoYXZlIGEgc21hbGwgcGFuZWwgb2YgYnV0dG9ucyB0aGF0IGFyZQorICogYWNjZXNzaWJsZSB2aWEgdGhlIGkyYy9zbWJ1cyBpbnRlcmZhY2UuIFRoaXMgZHJpdmVyIHBvbGxzIHRob3NlCisgKiBidXR0b25zIGFuZCBnZW5lcmF0ZXMgaW5wdXQgZXZlbnRzLgorICoKKyAqIEZvciBtb3JlIGRldGFpbHMgc2VlOgorICoJaHR0cDovL2FwYW5lbC5zb3VyY2Vmb3JnZS5uZXQvdGVjaC5waHAKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC1wb2xsZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorCisjZGVmaW5lIEFQQU5FTF9OQU1FCSJGdWppdHN1IEFwcGxpY2F0aW9uIFBhbmVsIgorI2RlZmluZSBBUEFORUxfVkVSU0lPTgkiMS4zLjEiCisjZGVmaW5lIEFQQU5FTAkJImFwYW5lbCIKKworLyogSG93IG9mdGVuIHdlIHBvbGwga2V5cyAtIG1zZWNzICovCisjZGVmaW5lIFBPTExfSU5URVJWQUxfREVGQVVMVAkxMDAwCisKKy8qIE1hZ2ljIGNvbnN0YW50cyBpbiBCSU9TIHRoYXQgdGVsbCBhYm91dCBidXR0b25zICovCitlbnVtIGFwYW5lbF9kZXZpZCB7CisJQVBBTkVMX0RFVl9OT05FCSAgPSAwLAorCUFQQU5FTF9ERVZfQVBQQlROID0gMSwKKwlBUEFORUxfREVWX0NEQlROICA9IDIsCisJQVBBTkVMX0RFVl9MQ0QJICA9IDMsCisJQVBBTkVMX0RFVl9MRUQJICA9IDQsCisKKwlBUEFORUxfREVWX01BWCwKK307CisKK2VudW0gYXBhbmVsX2NoaXAgeworCUNISVBfTk9ORSAgICA9IDAsCisJQ0hJUF9PWjk5MkMgID0gMSwKKwlDSElQX09aMTYzVCAgPSAyLAorCUNISVBfT1o3MTFNMyA9IDQsCit9OworCisvKiBSZXN1bHQgb2YgQklPUyBzbm9vcGluZy9wcm9iaW5nIC0tIHdoYXQgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZCAqLworc3RhdGljIGVudW0gYXBhbmVsX2NoaXAgZGV2aWNlX2NoaXBbQVBBTkVMX0RFVl9NQVhdOworCisjZGVmaW5lIE1BWF9QQU5FTF9LRVlTCTEyCisKK3N0cnVjdCBhcGFuZWwgeworCXN0cnVjdCBpbnB1dF9wb2xsZWRfZGV2ICppcGRldjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJdW5zaWduZWQgc2hvcnQga2V5bWFwW01BWF9QQU5FTF9LRVlTXTsKKwl1MTYgICAgbmtleXM7CisJdTE2ICAgIGxlZF9iaXRzOworCXN0cnVjdCB3b3JrX3N0cnVjdCBsZWRfd29yazsKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2IG1haWxfbGVkOworfTsKKworCitzdGF0aWMgaW50IGFwYW5lbF9wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiwgaW50LCBpbnQpOworCisvKiBmb3Igbm93LCB3ZSBvbmx5IHN1cHBvcnQgb25lIGFkZHJlc3MgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7MCwgSTJDX0NMSUVOVF9FTkR9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IGlnbm9yZSA9IEkyQ19DTElFTlRfRU5EOworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50X2FkZHJlc3NfZGF0YSBhZGRyX2RhdGEgPSB7CisJLm5vcm1hbF9pMmMJPSBub3JtYWxfaTJjLAorCS5wcm9iZQkJPSAmaWdub3JlLAorCS5pZ25vcmUJCT0gJmlnbm9yZSwKK307CisKK3N0YXRpYyB2b2lkIHJlcG9ydF9rZXkoc3RydWN0IGlucHV0X2RldiAqaW5wdXQsIHVuc2lnbmVkIGtleWNvZGUpCit7CisJcHJfZGVidWcoQVBBTkVMICI6IHJlcG9ydCBrZXkgJSN4XG4iLCBrZXljb2RlKTsKKwlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBrZXljb2RlLCAxKTsKKwlpbnB1dF9zeW5jKGlucHV0KTsKKworCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIGtleWNvZGUsIDApOworCWlucHV0X3N5bmMoaW5wdXQpOworfQorCisvKiBQb2xsIGZvciBrZXkgY2hhbmdlcworICoKKyAqIFJlYWQgQXBwbGljYXRpb24ga2V5cyB2aWEgU01JCisgKiAgQSAoMHg0KSwgQiAoMHg4KSwgSW50ZXJuZXQgKDB4MiksIEVtYWlsICgweDEpLgorICoKKyAqIENEIGtleXM6CisgKiBGb3J3YXJkICgweDEwMCksIFJld2luZCAoMHgyMDApLCBTdG9wICgweDQwMCksIFBhdXNlICgweDgwMCkKKyAqLworc3RhdGljIHZvaWQgYXBhbmVsX3BvbGwoc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKmlwZGV2KQoreworCXN0cnVjdCBhcGFuZWwgKmFwID0gaXBkZXYtPnByaXZhdGU7CisJc3RydWN0IGlucHV0X2RldiAqaWRldiA9IGlwZGV2LT5pbnB1dDsKKwl1OCBjbWQgPSBkZXZpY2VfY2hpcFtBUEFORUxfREVWX0FQUEJUTl0gPT0gQ0hJUF9PWjk5MkMgPyAwIDogODsKKwlzMzIgZGF0YTsKKwlpbnQgaTsKKworCWRhdGEgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoJmFwLT5jbGllbnQsIGNtZCk7CisJaWYgKGRhdGEgPCAwKQorCQlyZXR1cm47CS8qIGlnbm9yZSBlcnJvcnMgKGR1ZSB0byBBQ1BJPz8pICovCisKKwkvKiB3cml0ZSBiYWNrIHRvIGNsZWFyIGxhdGNoICovCisJaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YSgmYXAtPmNsaWVudCwgY21kLCAwKTsKKworCWlmICghZGF0YSkKKwkJcmV0dXJuOworCisJZGV2X2RiZygmaWRldi0+ZGV2LCBBUEFORUwgIjogZGF0YSAlI3hcbiIsIGRhdGEpOworCWZvciAoaSA9IDA7IGkgPCBpZGV2LT5rZXljb2RlbWF4OyBpKyspCisJCWlmICgoMXUgPDwgaSkgJiBkYXRhKQorCQkJcmVwb3J0X2tleShpZGV2LCBhcC0+a2V5bWFwW2ldKTsKK30KKworLyogVHJhY2sgc3RhdGUgY2hhbmdlcyBvZiBMRUQgKi8KK3N0YXRpYyB2b2lkIGxlZF91cGRhdGUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhcGFuZWwgKmFwID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhcGFuZWwsIGxlZF93b3JrKTsKKworCWkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoJmFwLT5jbGllbnQsIDB4MTAsIGFwLT5sZWRfYml0cyk7Cit9CisKK3N0YXRpYyB2b2lkIG1haWxfbGVkX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWQsCisJCQkgZW51bSBsZWRfYnJpZ2h0bmVzcyB2YWx1ZSkKK3sKKwlzdHJ1Y3QgYXBhbmVsICphcCA9IGNvbnRhaW5lcl9vZihsZWQsIHN0cnVjdCBhcGFuZWwsIG1haWxfbGVkKTsKKworCWlmICh2YWx1ZSAhPSBMRURfT0ZGKQorCQlhcC0+bGVkX2JpdHMgfD0gMHg4MDAwOworCWVsc2UKKwkJYXAtPmxlZF9iaXRzICY9IH4weDgwMDA7CisKKwlzY2hlZHVsZV93b3JrKCZhcC0+bGVkX3dvcmspOworfQorCitzdGF0aWMgaW50IGFwYW5lbF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGFwYW5lbCAqYXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlmIChkZXZpY2VfY2hpcFtBUEFORUxfREVWX0xFRF0gIT0gQ0hJUF9OT05FKQorCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmYXAtPm1haWxfbGVkKTsKKworCWlucHV0X3VucmVnaXN0ZXJfcG9sbGVkX2RldmljZShhcC0+aXBkZXYpOworCWkyY19kZXRhY2hfY2xpZW50KCZhcC0+Y2xpZW50KTsKKwlpbnB1dF9mcmVlX3BvbGxlZF9kZXZpY2UoYXAtPmlwZGV2KTsKKworCXJldHVybiAwOworfQorCisvKiBGdW5jdGlvbiBpcyBpbnZva2VkIGZvciBldmVyeSBpMmMgYWRhcHRlci4gKi8KK3N0YXRpYyBpbnQgYXBhbmVsX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlkZXZfZGJnKCZhZGFwLT5kZXYsIEFQQU5FTCAiOiBhdHRhY2ggYWRhcHRlciBpZD0lZFxuIiwgYWRhcC0+aWQpOworCisJLyogT3VyIGRldmljZSBpcyBjb25uZWN0ZWQgb25seSB0byBpODAxIG9uIGxhcHRvcCAqLworCWlmIChhZGFwLT5pZCAhPSBJMkNfSFdfU01CVVNfSTgwMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXAsICZhZGRyX2RhdGEsIGFwYW5lbF9wcm9iZSk7Cit9CisKK3N0YXRpYyB2b2lkIGFwYW5lbF9zaHV0ZG93bihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWFwYW5lbF9kZXRhY2hfY2xpZW50KGNsaWVudCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhcGFuZWxfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gQVBBTkVMLAorCX0sCisJLmF0dGFjaF9hZGFwdGVyID0gJmFwYW5lbF9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudCAgPSAmYXBhbmVsX2RldGFjaF9jbGllbnQsCisJLnNodXRkb3duCT0gJmFwYW5lbF9zaHV0ZG93biwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXBhbmVsIGFwYW5lbCA9IHsKKwkuY2xpZW50ID0geworCQkuZHJpdmVyID0gJmFwYW5lbF9kcml2ZXIsCisJCS5uYW1lICAgPSBBUEFORUwsCisJfSwKKwkua2V5bWFwID0geworCQlbMF0gPSBLRVlfTUFJTCwKKwkJWzFdID0gS0VZX1dXVywKKwkJWzJdID0gS0VZX1BST0cyLAorCQlbM10gPSBLRVlfUFJPRzEsCisKKwkJWzhdID0gS0VZX0ZPUldBUkQsCisJCVs5XSA9IEtFWV9SRVdJTkQsCisJCVsxMF0gPSBLRVlfU1RPUENELAorCQlbMTFdID0gS0VZX1BMQVlQQVVTRSwKKworCX0sCisJLm1haWxfbGVkID0geworCQkubmFtZSA9ICJtYWlsOmJsdWUiLAorCQkuYnJpZ2h0bmVzc19zZXQgPSBtYWlsX2xlZF9zZXQsCisJfSwKK307CisKKy8qIE5COiBPbmx5IG9uZSBwYW5lbCBvbiB0aGUgaTJjLiAqLworc3RhdGljIGludCBhcGFuZWxfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICpidXMsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgYXBhbmVsICphcDsKKwlzdHJ1Y3QgaW5wdXRfcG9sbGVkX2RldiAqaXBkZXY7CisJc3RydWN0IGlucHV0X2RldiAqaWRldjsKKwl1OCBjbWQgPSBkZXZpY2VfY2hpcFtBUEFORUxfREVWX0FQUEJUTl0gPT0gQ0hJUF9PWjk5MkMgPyAwIDogODsKKwlpbnQgaSwgZXJyID0gLUVOT01FTTsKKworCWRldl9kYmcoJmJ1cy0+ZGV2LCBBUEFORUwgIjogcHJvYmUgYWRhcHRlciAlcCBhZGRyICVkIGtpbmQgJWRcbiIsCisJCWJ1cywgYWRkcmVzcywga2luZCk7CisKKwlhcCA9ICZhcGFuZWw7CisKKwlpcGRldiA9IGlucHV0X2FsbG9jYXRlX3BvbGxlZF9kZXZpY2UoKTsKKwlpZiAoIWlwZGV2KQorCQlnb3RvIG91dDE7CisKKwlhcC0+aXBkZXYgPSBpcGRldjsKKwlhcC0+Y2xpZW50LmFkYXB0ZXIgPSBidXM7CisJYXAtPmNsaWVudC5hZGRyID0gYWRkcmVzczsKKworCWkyY19zZXRfY2xpZW50ZGF0YSgmYXAtPmNsaWVudCwgYXApOworCisJZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoJmFwLT5jbGllbnQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MjsKKworCWVyciA9IGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoJmFwLT5jbGllbnQsIGNtZCwgMCk7CisJaWYgKGVycikgeworCQlkZXZfd2FybigmYXAtPmNsaWVudC5kZXYsIEFQQU5FTCAiOiBzbWJ1cyB3cml0ZSBlcnJvciAlZFxuIiwKKwkJCSBlcnIpOworCQlnb3RvIG91dDM7CisJfQorCisJaXBkZXYtPnBvbGwgPSBhcGFuZWxfcG9sbDsKKwlpcGRldi0+cG9sbF9pbnRlcnZhbCA9IFBPTExfSU5URVJWQUxfREVGQVVMVDsKKwlpcGRldi0+cHJpdmF0ZSA9IGFwOworCisJaWRldiA9IGlwZGV2LT5pbnB1dDsKKwlpZGV2LT5uYW1lID0gQVBBTkVMX05BTUUgIiBidXR0b25zIjsKKwlpZGV2LT5waHlzID0gImFwYW5lbC9pbnB1dDAiOworCWlkZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKKwlpZGV2LT5kZXYucGFyZW50ID0gJmFwLT5jbGllbnQuZGV2OworCisJc2V0X2JpdChFVl9LRVksIGlkZXYtPmV2Yml0KTsKKworCWlkZXYtPmtleWNvZGUgPSBhcC0+a2V5bWFwOworCWlkZXYtPmtleWNvZGVzaXplID0gc2l6ZW9mKGFwLT5rZXltYXBbMF0pOworCWlkZXYtPmtleWNvZGVtYXggPSAoZGV2aWNlX2NoaXBbQVBBTkVMX0RFVl9DREJUTl0gIT0gQ0hJUF9OT05FKSA/IDEyIDogNDsKKworCWZvciAoaSA9IDA7IGkgPCBpZGV2LT5rZXljb2RlbWF4OyBpKyspCisJCWlmIChhcC0+a2V5bWFwW2ldKQorCQkJc2V0X2JpdChhcC0+a2V5bWFwW2ldLCBpZGV2LT5rZXliaXQpOworCisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfcG9sbGVkX2RldmljZShpcGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQzOworCisJSU5JVF9XT1JLKCZhcC0+bGVkX3dvcmssIGxlZF91cGRhdGUpOworCWlmIChkZXZpY2VfY2hpcFtBUEFORUxfREVWX0xFRF0gIT0gQ0hJUF9OT05FKSB7CisJCWVyciA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmYXAtPmNsaWVudC5kZXYsICZhcC0+bWFpbF9sZWQpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ0OworCX0KKworCXJldHVybiAwOworb3V0NDoKKwlpbnB1dF91bnJlZ2lzdGVyX3BvbGxlZF9kZXZpY2UoaXBkZXYpOworb3V0MzoKKwlpMmNfZGV0YWNoX2NsaWVudCgmYXAtPmNsaWVudCk7CitvdXQyOgorCWlucHV0X2ZyZWVfcG9sbGVkX2RldmljZShpcGRldik7CitvdXQxOgorCXJldHVybiBlcnI7Cit9CisKKy8qIFNjYW4gdGhlIHN5c3RlbSBST00gZm9yIHRoZSBzaWduYXR1cmUgIkZKS0VZSU5GIiAqLworc3RhdGljIF9faW5pdCBjb25zdCB2b2lkIF9faW9tZW0gKmJpb3Nfc2lnbmF0dXJlKGNvbnN0IHZvaWQgX19pb21lbSAqYmlvcykKK3sKKwlzc2l6ZV90IG9mZnNldDsKKwljb25zdCB1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVtdID0gIkZKS0VZSU5GIjsKKworCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgMHgxMDAwMDsgb2Zmc2V0ICs9IDB4MTApIHsKKwkJaWYgKGNoZWNrX3NpZ25hdHVyZShiaW9zICsgb2Zmc2V0LCBzaWduYXR1cmUsCisJCQkJICAgIHNpemVvZihzaWduYXR1cmUpLTEpKQorCQkJcmV0dXJuIGJpb3MgKyBvZmZzZXQ7CisJfQorCXByX25vdGljZShBUEFORUwgIjogRnVqaXRzdSBCSU9TIHNpZ25hdHVyZSAnJXMnIG5vdCBmb3VuZC4uLlxuIiwKKwkJICBzaWduYXR1cmUpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhcGFuZWxfaW5pdCh2b2lkKQoreworCXZvaWQgX19pb21lbSAqYmlvczsKKwljb25zdCB2b2lkIF9faW9tZW0gKnA7CisJdTggZGV2bm87CisJaW50IGZvdW5kID0gMDsKKworCWJpb3MgPSBpb3JlbWFwKDB4RjAwMDAsIDB4MTAwMDApOyAvKiBDYW4ndCBmYWlsICovCisKKwlwID0gYmlvc19zaWduYXR1cmUoYmlvcyk7CisJaWYgKCFwKSB7CisJCWlvdW5tYXAoYmlvcyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIGp1c3QgdXNlIHRoZSBmaXJzdCBhZGRyZXNzICovCisJcCArPSA4OworCW5vcm1hbF9pMmNbMF0gPSByZWFkYihwKzMpID4+IDE7CisKKwlmb3IgKCA7IChkZXZubyA9IHJlYWRiKHApKSAmIDB4N2Y7IHAgKz0gNCkgeworCQl1bnNpZ25lZCBjaGFyIG1ldGhvZCwgc2xhdmUsIGNoaXA7CisKKwkJbWV0aG9kID0gcmVhZGIocCArIDEpOworCQljaGlwID0gcmVhZGIocCArIDIpOworCQlzbGF2ZSA9IHJlYWRiKHAgKyAzKSA+PiAxOworCisJCWlmIChzbGF2ZSAhPSBub3JtYWxfaTJjWzBdKSB7CisJCQlwcl9ub3RpY2UoQVBBTkVMICI6IG9ubHkgb25lIFNNQnVzIHNsYXZlICIKKwkJCQkgICJhZGRyZXNzIHN1cHBvcnRlZCwgc2tpcGluZyBkZXZpY2UuLi5cbiIpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiB0cmFuc2xhdGUgYWx0ZXJuYXRpdmUgZGV2aWNlIG51bWJlcnMgKi8KKwkJc3dpdGNoIChkZXZubykgeworCQljYXNlIDY6CisJCQlkZXZubyA9IEFQQU5FTF9ERVZfQVBQQlROOworCQkJYnJlYWs7CisJCWNhc2UgNzoKKwkJCWRldm5vID0gQVBBTkVMX0RFVl9MRUQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChkZXZubyA+PSBBUEFORUxfREVWX01BWCkKKwkJCXByX25vdGljZShBUEFORUwgIjogdW5rbm93biBkZXZpY2UgJXUgZm91bmRcbiIsIGRldm5vKTsKKwkJZWxzZSBpZiAoZGV2aWNlX2NoaXBbZGV2bm9dICE9IENISVBfTk9ORSkKKwkJCXByX3dhcm5pbmcoQVBBTkVMICI6IGR1cGxpY2F0ZSBlbnRyeSBmb3IgZGV2bm8gJXVcbiIsIGRldm5vKTsKKworCQllbHNlIGlmIChtZXRob2QgIT0gMSAmJiBtZXRob2QgIT0gMiAmJiBtZXRob2QgIT0gNCkgeworCQkJcHJfbm90aWNlKEFQQU5FTCAiOiB1bmtub3duIG1ldGhvZCAldSBmb3IgZGV2bm8gJXVcbiIsCisJCQkJICBtZXRob2QsIGRldm5vKTsKKwkJfSBlbHNlIHsKKwkJCWRldmljZV9jaGlwW2Rldm5vXSA9IChlbnVtIGFwYW5lbF9jaGlwKSBjaGlwOworCQkJKytmb3VuZDsKKwkJfQorCX0KKwlpb3VubWFwKGJpb3MpOworCisJaWYgKGZvdW5kID09IDApIHsKKwkJcHJfaW5mbyhBUEFORUwgIjogbm8gaW5wdXQgZGV2aWNlcyByZXBvcnRlZCBieSBCSU9TXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZhcGFuZWxfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFwYW5lbF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGFwYW5lbF9jbGVhbnVwKHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmFwYW5lbF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYXBhbmVsX2NsZWFudXApOworCitNT0RVTEVfQVVUSE9SKCJTdGVwaGVuIEhlbW1pbmdlciA8c2hlbW1pbmdlckBsaW51eC1mb3VuZGF0aW9uLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTihBUEFORUxfTkFNRSAiIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oQVBBTkVMX1ZFUlNJT04pOworCitNT0RVTEVfQUxJQVMoImRtaToqOnN2bkZVSklUU1U6cG5MaWZlQm9vayo6cHZyKjpydm5GVUpJVFNVOioiKTsKK01PRFVMRV9BTElBUygiZG1pOio6c3ZuRlVKSVRTVTpwbkxpZmVib29rKjpwdnIqOnJ2bkZVSklUU1U6KiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL2F0aV9yZW1vdGUuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9hdGlfcmVtb3RlLmMKaW5kZXggM2E3OTM3NC4uZjNiODZjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL2F0aV9yZW1vdGUuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvYXRpX3JlbW90ZS5jCkBAIC05MCw3ICs5MCw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvYXRsYXNfYnRucy5jIGIvZHJpdmVycy9pbnB1dC9taXNjL2F0bGFzX2J0bnMuYwppbmRleCA0ZTNhZDY1Li4xYjg3MTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvYXRsYXNfYnRucy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9hdGxhc19idG5zLmMKQEAgLTI5LDkgKzI5LDEwIEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgogCi0jZGVmaW5lIEFDUElfQVRMQVNfTkFNRQkJCSJBdGxhcyBBQ1BJIgotI2RlZmluZSBBQ1BJX0FUTEFTX0NMQVNTCQkiQXRsYXMiCisjZGVmaW5lIEFDUElfQVRMQVNfTkFNRQkJIkF0bGFzIEFDUEkiCisjZGVmaW5lIEFDUElfQVRMQVNfQ0xBU1MJIkF0bGFzIgogCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYXRsYXNfa2V5bWFwWzE2XTsKIHN0YXRpYyBzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CiAKIC8qIGJ1dHRvbiBoYW5kbGluZyBjb2RlICovCkBAIC01MCwxMiArNTEsMTUgQEAKIAkJICAgICAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICpyZWdpb25fY29udGV4dCkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JaW50IGtleWNvZGU7CiAKIAlpZiAoZnVuY3Rpb24gPT0gQUNQSV9XUklURSkgewotCQlrZXljb2RlID0gS0VZX0YxICsgKGFkZHJlc3MgJiAweDBGKTsKLQkJaW5wdXRfcmVwb3J0X2tleShpbnB1dF9kZXYsIGtleWNvZGUsICEoYWRkcmVzcyAmIDB4MTApKTsKKwkJaW50IGNvZGUgPSBhZGRyZXNzICYgMHgwZjsKKwkJaW50IGtleV9kb3duID0gIShhZGRyZXNzICYgMHgxMCk7CisKKwkJaW5wdXRfZXZlbnQoaW5wdXRfZGV2LCBFVl9NU0MsIE1TQ19TQ0FOLCBjb2RlKTsKKwkJaW5wdXRfcmVwb3J0X2tleShpbnB1dF9kZXYsIGF0bGFzX2tleW1hcFtjb2RlXSwga2V5X2Rvd24pOwogCQlpbnB1dF9zeW5jKGlucHV0X2Rldik7CisKIAkJc3RhdHVzID0gMDsKIAl9IGVsc2UgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJhdGxhczogc2hydWdnZWQgb24gdW5leHBlY3RlZCBmdW5jdGlvbiIKQEAgLTcwLDYgKzc0LDcgQEAKIHN0YXRpYyBpbnQgYXRsYXNfYWNwaV9idXR0b25fYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlpbnQgaTsKIAlpbnQgZXJyOwogCiAJaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CkBAIC04MSwxNyArODYsMTkgQEAKIAlpbnB1dF9kZXYtPm5hbWUgPSAiQXRsYXMgQUNQSSBidXR0b24gZHJpdmVyIjsKIAlpbnB1dF9kZXYtPnBoeXMgPSAiQVNJTTAwMDAvYXRsYXMvaW5wdXQwIjsKIAlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKLQlpbnB1dF9kZXYtPmV2Yml0W0JJVF9XT1JEKEVWX0tFWSldID0gQklUX01BU0soRVZfS0VZKTsKKwlpbnB1dF9kZXYtPmtleWNvZGUgPSBhdGxhc19rZXltYXA7CisJaW5wdXRfZGV2LT5rZXljb2Rlc2l6ZSA9IHNpemVvZih1bnNpZ25lZCBzaG9ydCk7CisJaW5wdXRfZGV2LT5rZXljb2RlbWF4ID0gQVJSQVlfU0laRShhdGxhc19rZXltYXApOwogCi0Jc2V0X2JpdChLRVlfRjEsIGlucHV0X2Rldi0+a2V5Yml0KTsKLQlzZXRfYml0KEtFWV9GMiwgaW5wdXRfZGV2LT5rZXliaXQpOwotCXNldF9iaXQoS0VZX0YzLCBpbnB1dF9kZXYtPmtleWJpdCk7Ci0Jc2V0X2JpdChLRVlfRjQsIGlucHV0X2Rldi0+a2V5Yml0KTsKLQlzZXRfYml0KEtFWV9GNSwgaW5wdXRfZGV2LT5rZXliaXQpOwotCXNldF9iaXQoS0VZX0Y2LCBpbnB1dF9kZXYtPmtleWJpdCk7Ci0Jc2V0X2JpdChLRVlfRjcsIGlucHV0X2Rldi0+a2V5Yml0KTsKLQlzZXRfYml0KEtFWV9GOCwgaW5wdXRfZGV2LT5rZXliaXQpOwotCXNldF9iaXQoS0VZX0Y5LCBpbnB1dF9kZXYtPmtleWJpdCk7CisJaW5wdXRfc2V0X2NhcGFiaWxpdHkoaW5wdXRfZGV2LCBFVl9NU0MsIE1TQ19TQ0FOKTsKKwlfX3NldF9iaXQoRVZfS0VZLCBpbnB1dF9kZXYtPmV2Yml0KTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhdGxhc19rZXltYXApOyBpKyspIHsKKwkJaWYgKGkgPCA5KSB7CisJCQlhdGxhc19rZXltYXBbaV0gPSBLRVlfRjEgKyBpOworCQkJX19zZXRfYml0KEtFWV9GMSArIGksIGlucHV0X2Rldi0+a2V5Yml0KTsKKwkJfSBlbHNlCisJCQlhdGxhc19rZXltYXBbaV0gPSBLRVlfUkVTRVJWRUQ7CisJfQogCiAJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7CiAJaWYgKGVycikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL2NvYmFsdF9idG5zLmMgYi9kcml2ZXJzL2lucHV0L21pc2MvY29iYWx0X2J0bnMuYwppbmRleCAxYWVmOTdlLi40ODMzYjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvY29iYWx0X2J0bnMuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvY29iYWx0X2J0bnMuYwpAQCAtMjcsNTUgKzI3LDQ4IEBACiAjZGVmaW5lIEJVVFRPTlNfQ09VTlRfVEhSRVNIT0xECTMKICNkZWZpbmUgQlVUVE9OU19TVEFUVVNfTUFTSwkweGZlMDAwMDAwCiAKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBjb2JhbHRfbWFwW10gPSB7CisJS0VZX1JFU0VSVkVELAorCUtFWV9SRVNUQVJULAorCUtFWV9MRUZULAorCUtFWV9VUCwKKwlLRVlfRE9XTiwKKwlLRVlfUklHSFQsCisJS0VZX0VOVEVSLAorCUtFWV9TRUxFQ1QKK307CisKIHN0cnVjdCBidXR0b25zX2RldiB7CiAJc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKnBvbGxfZGV2OworCXVuc2lnbmVkIHNob3J0IGtleW1hcFtBUlJBWV9TSVpFKGNvYmFsdF9tYXApXTsKKwlpbnQgY291bnRbQVJSQVlfU0laRShjb2JhbHRfbWFwKV07CiAJdm9pZCBfX2lvbWVtICpyZWc7CiB9OwogCi1zdHJ1Y3QgYnV0dG9uc19tYXAgewotCXVpbnQzMl90IG1hc2s7Ci0JaW50IGtleWNvZGU7Ci0JaW50IGNvdW50OwotfTsKLQotc3RhdGljIHN0cnVjdCBidXR0b25zX21hcCBidXR0b25zX21hcFtdID0gewotCXsgMHgwMjAwMDAwMCwgS0VZX1JFU1RBUlQsIH0sCi0JeyAweDA0MDAwMDAwLCBLRVlfTEVGVCwgfSwKLQl7IDB4MDgwMDAwMDAsIEtFWV9VUCwgfSwKLQl7IDB4MTAwMDAwMDAsIEtFWV9ET1dOLCB9LAotCXsgMHgyMDAwMDAwMCwgS0VZX1JJR0hULCB9LAotCXsgMHg0MDAwMDAwMCwgS0VZX0VOVEVSLCB9LAotCXsgMHg4MDAwMDAwMCwgS0VZX1NFTEVDVCwgfSwKLX07Ci0KIHN0YXRpYyB2b2lkIGhhbmRsZV9idXR0b25zKHN0cnVjdCBpbnB1dF9wb2xsZWRfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IGJ1dHRvbnNfbWFwICpidXR0b24gPSBidXR0b25zX21hcDsKIAlzdHJ1Y3QgYnV0dG9uc19kZXYgKmJkZXYgPSBkZXYtPnByaXZhdGU7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSBkZXYtPmlucHV0OwogCXVpbnQzMl90IHN0YXR1czsKIAlpbnQgaTsKIAotCXN0YXR1cyA9IHJlYWRsKGJkZXYtPnJlZyk7Ci0Jc3RhdHVzID0gfnN0YXR1cyAmIEJVVFRPTlNfU1RBVFVTX01BU0s7CisJc3RhdHVzID0gfnJlYWRsKGJkZXYtPnJlZykgPj4gMjQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidXR0b25zX21hcCk7IGkrKykgewotCQlpZiAoc3RhdHVzICYgYnV0dG9uLT5tYXNrKSB7Ci0JCQlidXR0b24tPmNvdW50Kys7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoYnV0dG9uLT5jb3VudCA+PSBCVVRUT05TX0NPVU5UX1RIUkVTSE9MRCkgewotCQkJCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIGJ1dHRvbi0+a2V5Y29kZSwgMCk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYmRldi0+a2V5bWFwKTsgaSsrKSB7CisJCWlmIChzdGF0dXMgJiAoMVVMIDw8IGkpKSB7CisJCQlpZiAoKytiZGV2LT5jb3VudFtpXSA9PSBCVVRUT05TX0NPVU5UX1RIUkVTSE9MRCkgeworCQkJCWlucHV0X2V2ZW50KGlucHV0LCBFVl9NU0MsIE1TQ19TQ0FOLCBpKTsKKwkJCQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBiZGV2LT5rZXltYXBbaV0sIDEpOwogCQkJCWlucHV0X3N5bmMoaW5wdXQpOwogCQkJfQotCQkJYnV0dG9uLT5jb3VudCA9IDA7CisJCX0gZWxzZSB7CisJCQlpZiAoYmRldi0+Y291bnRbaV0gPj0gQlVUVE9OU19DT1VOVF9USFJFU0hPTEQpIHsKKwkJCQlpbnB1dF9ldmVudChpbnB1dCwgRVZfTVNDLCBNU0NfU0NBTiwgaSk7CisJCQkJaW5wdXRfcmVwb3J0X2tleShpbnB1dCwgYmRldi0+a2V5bWFwW2ldLCAwKTsKKwkJCQlpbnB1dF9zeW5jKGlucHV0KTsKKwkJCX0KKwkJCWJkZXYtPmNvdW50W2ldID0gMDsKIAkJfQotCi0JCWlmIChidXR0b24tPmNvdW50ID09IEJVVFRPTlNfQ09VTlRfVEhSRVNIT0xEKSB7Ci0JCQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBidXR0b24tPmtleWNvZGUsIDEpOwotCQkJaW5wdXRfc3luYyhpbnB1dCk7Ci0JCX0KLQotCQlidXR0b24rKzsKIAl9CiB9CiAKQEAgLTk0LDYgKzg3LDggQEAKIAkJZ290byBlcnJfZnJlZV9tZW07CiAJfQogCisJbWVtY3B5KGJkZXYtPmtleW1hcCwgY29iYWx0X21hcCwgc2l6ZW9mKGJkZXYtPmtleW1hcCkpOworCiAJcG9sbF9kZXYtPnByaXZhdGUgPSBiZGV2OwogCXBvbGxfZGV2LT5wb2xsID0gaGFuZGxlX2J1dHRvbnM7CiAJcG9sbF9kZXYtPnBvbGxfaW50ZXJ2YWwgPSBCVVRUT05TX1BPTExfSU5URVJWQUw7CkBAIC0xMDQsMTEgKzk5LDE1IEBACiAJaW5wdXQtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKIAlpbnB1dC0+Y2Rldi5kZXYgPSAmcGRldi0+ZGV2OwogCi0JaW5wdXQtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKTsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidXR0b25zX21hcCk7IGkrKykgewotCQlzZXRfYml0KGJ1dHRvbnNfbWFwW2ldLmtleWNvZGUsIGlucHV0LT5rZXliaXQpOwotCQlidXR0b25zX21hcFtpXS5jb3VudCA9IDA7Ci0JfQorCWlucHV0LT5rZXljb2RlID0gcGRldi0+a2V5bWFwOworCWlucHV0LT5rZXljb2RlbWF4ID0gQVJSQVlfU0laRShwZGV2LT5rZXltYXApOworCWlucHV0LT5rZXljb2Rlc2l6ZSA9IHNpemVvZih1bnNpZ25lZCBzaG9ydCk7CisKKwlpbnB1dF9zZXRfY2FwYWJpbGl0eShpbnB1dCwgRVZfTVNDLCBNU0NfU0NBTik7CisJX19zZXRfYml0KEVWX0tFWSwgaW5wdXQtPmV2Yml0KTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidXR0b25zX21hcCk7IGkrKykKKwkJX19zZXRfYml0KGlucHV0LT5rZXljb2RlW2ldLCBpbnB1dC0+a2V5Yml0KTsKKwlfX2NsZWFyX2JpdChLRVlfUkVTRVJWRUQsIGlucHV0LT5rZXliaXQpOwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpZiAoIXJlcykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL2tleXNwYW5fcmVtb3RlLmMgYi9kcml2ZXJzL2lucHV0L21pc2Mva2V5c3Bhbl9yZW1vdGUuYwppbmRleCBmZDc0MzQ3Li45NTI5MzhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2Mva2V5c3Bhbl9yZW1vdGUuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2Mva2V5c3Bhbl9yZW1vdGUuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC91c2IvaW5wdXQuaD4KIAogI2RlZmluZSBEUklWRVJfVkVSU0lPTgkidjAuMSIKQEAgLTQ2LDUzICs0NSwxMiBAQAogCiAjZGVmaW5lIFJFQ1ZfU0laRQk4CS8qIFRoZSBVSUEtMTEgdHlwZSBoYXZlIGEgOCBieXRlIGxpbWl0LiAqLwogCi0vKiB0YWJsZSBvZiBkZXZpY2VzIHRoYXQgd29yayB3aXRoIHRoaXMgZHJpdmVyICovCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQga2V5c3Bhbl90YWJsZVtdID0gewotCXsgVVNCX0RFVklDRShVU0JfS0VZU1BBTl9WRU5ET1JfSUQsIFVTQl9LRVlTUEFOX1BST0RVQ1RfVUlBMTEpIH0sCi0JeyB9CQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwotfTsKLQotLyogU3RydWN0dXJlIHRvIHN0b3JlIGFsbCB0aGUgcmVhbCBzdHVmZiB0aGF0IGEgcmVtb3RlIHNlbmRzIHRvIHVzLiAqLwotc3RydWN0IGtleXNwYW5fbWVzc2FnZSB7Ci0JdTE2CXN5c3RlbTsKLQl1OAlidXR0b247Ci0JdTgJdG9nZ2xlOwotfTsKLQotLyogU3RydWN0dXJlIHVzZWQgZm9yIGFsbCB0aGUgYml0IHRlc3RpbmcgbWFnaWMgbmVlZGVkIHRvIGJlIGRvbmUuICovCi1zdHJ1Y3QgYml0X3Rlc3RlciB7Ci0JdTMyCXRlc3RlcjsKLQlpbnQJbGVuOwotCWludAlwb3M7Ci0JaW50CWJpdHNfbGVmdDsKLQl1OAlidWZmZXJbMzJdOwotfTsKLQotLyogU3RydWN0dXJlIHRvIGhvbGQgYWxsIG9mIG91ciBkcml2ZXIgc3BlY2lmaWMgc3R1ZmYgKi8KLXN0cnVjdCB1c2Jfa2V5c3BhbiB7Ci0JY2hhcgkJCQluYW1lWzEyOF07Ci0JY2hhcgkJCQlwaHlzWzY0XTsKLQlzdHJ1Y3QgdXNiX2RldmljZSoJCXVkZXY7Ci0Jc3RydWN0IGlucHV0X2RldgkJKmlucHV0OwotCXN0cnVjdCB1c2JfaW50ZXJmYWNlKgkJaW50ZXJmYWNlOwotCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciogaW5fZW5kcG9pbnQ7Ci0Jc3RydWN0IHVyYioJCQlpcnFfdXJiOwotCWludAkJCQlvcGVuOwotCWRtYV9hZGRyX3QJCQlpbl9kbWE7Ci0JdW5zaWduZWQgY2hhcioJCQlpbl9idWZmZXI7Ci0KLQkvKiB2YXJpYWJsZXMgdXNlZCB0byBwYXJzZSBtZXNzYWdlcyBmcm9tIHJlbW90ZS4gKi8KLQlzdHJ1Y3QgYml0X3Rlc3RlcgkJZGF0YTsKLQlpbnQJCQkJc3RhZ2U7Ci0JaW50CQkJCXRvZ2dsZTsKLX07Ci0KIC8qCiAgKiBUYWJsZSB0aGF0IG1hcHMgdGhlIDMxIHBvc3NpYmxlIGtleWNvZGVzIHRvIGlucHV0IGtleXMuCiAgKiBDdXJyZW50bHkgdGhlcmUgYXJlIDE1IGFuZCAxNyBidXR0b24gbW9kZWxzIHNvIFJFU0VSVkVEIGNvZGVzCiAgKiBhcmUgYmxhbmsgYXJlYXMgaW4gdGhlIG1hcHBpbmcuCiAgKi8KLXN0YXRpYyBjb25zdCBpbnQga2V5c3Bhbl9rZXlfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBrZXlzcGFuX2tleV90YWJsZVtdID0gewogCUtFWV9SRVNFUlZFRCwJCS8qIDAgaXMganVzdCBhIHBsYWNlIGhvbGRlci4gKi8KIAlLRVlfUkVTRVJWRUQsCiAJS0VZX1NUT1AsCkBAIC0xMjcsNiArODUsNDggQEAKIAlLRVlfTUVOVQogfTsKIAorLyogdGFibGUgb2YgZGV2aWNlcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGRyaXZlciAqLworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGtleXNwYW5fdGFibGVbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoVVNCX0tFWVNQQU5fVkVORE9SX0lELCBVU0JfS0VZU1BBTl9QUk9EVUNUX1VJQTExKSB9LAorCXsgfQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKKy8qIFN0cnVjdHVyZSB0byBzdG9yZSBhbGwgdGhlIHJlYWwgc3R1ZmYgdGhhdCBhIHJlbW90ZSBzZW5kcyB0byB1cy4gKi8KK3N0cnVjdCBrZXlzcGFuX21lc3NhZ2UgeworCXUxNglzeXN0ZW07CisJdTgJYnV0dG9uOworCXU4CXRvZ2dsZTsKK307CisKKy8qIFN0cnVjdHVyZSB1c2VkIGZvciBhbGwgdGhlIGJpdCB0ZXN0aW5nIG1hZ2ljIG5lZWRlZCB0byBiZSBkb25lLiAqLworc3RydWN0IGJpdF90ZXN0ZXIgeworCXUzMgl0ZXN0ZXI7CisJaW50CWxlbjsKKwlpbnQJcG9zOworCWludAliaXRzX2xlZnQ7CisJdTgJYnVmZmVyWzMyXTsKK307CisKKy8qIFN0cnVjdHVyZSB0byBob2xkIGFsbCBvZiBvdXIgZHJpdmVyIHNwZWNpZmljIHN0dWZmICovCitzdHJ1Y3QgdXNiX2tleXNwYW4geworCWNoYXIJCQkJbmFtZVsxMjhdOworCWNoYXIJCQkJcGh5c1s2NF07CisJdW5zaWduZWQgc2hvcnQJCQlrZXltYXBbQVJSQVlfU0laRShrZXlzcGFuX2tleV90YWJsZSldOworCXN0cnVjdCB1c2JfZGV2aWNlCQkqdWRldjsKKwlzdHJ1Y3QgaW5wdXRfZGV2CQkqaW5wdXQ7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UJCSppbnRlcmZhY2U7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCSppbl9lbmRwb2ludDsKKwlzdHJ1Y3QgdXJiKgkJCWlycV91cmI7CisJaW50CQkJCW9wZW47CisJZG1hX2FkZHJfdAkJCWluX2RtYTsKKwl1bnNpZ25lZCBjaGFyCQkJKmluX2J1ZmZlcjsKKworCS8qIHZhcmlhYmxlcyB1c2VkIHRvIHBhcnNlIG1lc3NhZ2VzIGZyb20gcmVtb3RlLiAqLworCXN0cnVjdCBiaXRfdGVzdGVyCQlkYXRhOworCWludAkJCQlzdGFnZTsKKwlpbnQJCQkJdG9nZ2xlOworfTsKKwogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGtleXNwYW5fZHJpdmVyOwogCiAvKgpAQCAtMTczLDYgKzE3MywxNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBrZXlzcGFuX3JlcG9ydF9idXR0b24oc3RydWN0IHVzYl9rZXlzcGFuICpyZW1vdGUsIGludCBidXR0b24sIGludCBwcmVzcykKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCA9IHJlbW90ZS0+aW5wdXQ7CisKKwlpbnB1dF9ldmVudChpbnB1dCwgRVZfTVNDLCBNU0NfU0NBTiwgYnV0dG9uKTsKKwlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCByZW1vdGUtPmtleW1hcFtidXR0b25dLCBwcmVzcyk7CisJaW5wdXRfc3luYyhpbnB1dCk7Cit9CisKIC8qCiAgKiBSb3V0aW5lIHRoYXQgaGFuZGxlcyBhbGwgdGhlIGxvZ2ljIG5lZWRlZCB0byBwYXJzZSBvdXQgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgcmVtb3RlLgogICovCkBAIC0zMTEsOSArMzIwLDggQEAKIAkJCV9fRlVOQ1RJT05fXywgbWVzc2FnZS5zeXN0ZW0sIG1lc3NhZ2UuYnV0dG9uLCBtZXNzYWdlLnRvZ2dsZSk7CiAKIAkJaWYgKG1lc3NhZ2UudG9nZ2xlICE9IHJlbW90ZS0+dG9nZ2xlKSB7Ci0JCQlpbnB1dF9yZXBvcnRfa2V5KHJlbW90ZS0+aW5wdXQsIGtleXNwYW5fa2V5X3RhYmxlW21lc3NhZ2UuYnV0dG9uXSwgMSk7Ci0JCQlpbnB1dF9yZXBvcnRfa2V5KHJlbW90ZS0+aW5wdXQsIGtleXNwYW5fa2V5X3RhYmxlW21lc3NhZ2UuYnV0dG9uXSwgMCk7Ci0JCQlpbnB1dF9zeW5jKHJlbW90ZS0+aW5wdXQpOworCQkJa2V5c3Bhbl9yZXBvcnRfYnV0dG9uKHJlbW90ZSwgbWVzc2FnZS5idXR0b24sIDEpOworCQkJa2V5c3Bhbl9yZXBvcnRfYnV0dG9uKHJlbW90ZSwgbWVzc2FnZS5idXR0b24sIDApOwogCQkJcmVtb3RlLT50b2dnbGUgPSBtZXNzYWdlLnRvZ2dsZTsKIAkJfQogCkBAIC00OTEsMTYgKzQ5OSwyMSBAQAogCiAJdXNiX21ha2VfcGF0aCh1ZGV2LCByZW1vdGUtPnBoeXMsIHNpemVvZihyZW1vdGUtPnBoeXMpKTsKIAlzdHJsY2F0KHJlbW90ZS0+cGh5cywgIi9pbnB1dDAiLCBzaXplb2YocmVtb3RlLT5waHlzKSk7CisJbWVtY3B5KHJlbW90ZS0+a2V5bWFwLCBrZXlzcGFuX2tleV90YWJsZSwgc2l6ZW9mKHJlbW90ZS0+a2V5bWFwKSk7CiAKIAlpbnB1dF9kZXYtPm5hbWUgPSByZW1vdGUtPm5hbWU7CiAJaW5wdXRfZGV2LT5waHlzID0gcmVtb3RlLT5waHlzOwogCXVzYl90b19pbnB1dF9pZCh1ZGV2LCAmaW5wdXRfZGV2LT5pZCk7CiAJaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gJmludGVyZmFjZS0+ZGV2OworCWlucHV0X2Rldi0+a2V5Y29kZSA9IHJlbW90ZS0+a2V5bWFwOworCWlucHV0X2Rldi0+a2V5Y29kZXNpemUgPSBzaXplb2YodW5zaWduZWQgc2hvcnQpOworCWlucHV0X2Rldi0+a2V5Y29kZW1heCA9IEFSUkFZX1NJWkUocmVtb3RlLT5rZXltYXApOwogCi0JaW5wdXRfZGV2LT5ldmJpdFswXSA9IEJJVF9NQVNLKEVWX0tFWSk7CQkvKiBXZSB3aWxsIG9ubHkgcmVwb3J0IEtFWSBldmVudHMuICovCisJaW5wdXRfc2V0X2NhcGFiaWxpdHkoaW5wdXRfZGV2LCBFVl9NU0MsIE1TQ19TQ0FOKTsKKwlfX3NldF9iaXQoRVZfS0VZLCBpbnB1dF9kZXYtPmV2Yml0KTsKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShrZXlzcGFuX2tleV90YWJsZSk7IGkrKykKLQkJaWYgKGtleXNwYW5fa2V5X3RhYmxlW2ldICE9IEtFWV9SRVNFUlZFRCkKLQkJCXNldF9iaXQoa2V5c3Bhbl9rZXlfdGFibGVbaV0sIGlucHV0X2Rldi0+a2V5Yml0KTsKKwkJX19zZXRfYml0KGtleXNwYW5fa2V5X3RhYmxlW2ldLCBpbnB1dF9kZXYtPmtleWJpdCk7CisJX19jbGVhcl9iaXQoS0VZX1JFU0VSVkVELCBpbnB1dF9kZXYtPmtleWJpdCk7CiAKIAlpbnB1dF9zZXRfZHJ2ZGF0YShpbnB1dF9kZXYsIHJlbW90ZSk7CiAKQEAgLTUwOCwxMiArNTIxLDE0IEBACiAJaW5wdXRfZGV2LT5jbG9zZSA9IGtleXNwYW5fY2xvc2U7CiAKIAkvKgotCSAqIEluaXRpYWxpemUgdGhlIFVSQiB0byBhY2Nlc3MgdGhlIGRldmljZS4gVGhlIHVyYiBnZXRzIHNlbnQgdG8gdGhlIGRldmljZSBpbiBrZXlzcGFuX29wZW4oKQorCSAqIEluaXRpYWxpemUgdGhlIFVSQiB0byBhY2Nlc3MgdGhlIGRldmljZS4KKwkgKiBUaGUgdXJiIGdldHMgc2VudCB0byB0aGUgZGV2aWNlIGluIGtleXNwYW5fb3BlbigpCiAJICovCiAJdXNiX2ZpbGxfaW50X3VyYihyZW1vdGUtPmlycV91cmIsCi0JCQkgcmVtb3RlLT51ZGV2LCB1c2JfcmN2aW50cGlwZShyZW1vdGUtPnVkZXYsIHJlbW90ZS0+aW5fZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpLAorCQkJIHJlbW90ZS0+dWRldiwKKwkJCSB1c2JfcmN2aW50cGlwZShyZW1vdGUtPnVkZXYsIGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKSwKIAkJCSByZW1vdGUtPmluX2J1ZmZlciwgUkVDVl9TSVpFLCBrZXlzcGFuX2lycV9yZWN2LCByZW1vdGUsCi0JCQkgcmVtb3RlLT5pbl9lbmRwb2ludC0+YkludGVydmFsKTsKKwkJCSBlbmRwb2ludC0+YkludGVydmFsKTsKIAlyZW1vdGUtPmlycV91cmItPnRyYW5zZmVyX2RtYSA9IHJlbW90ZS0+aW5fZG1hOwogCXJlbW90ZS0+aXJxX3VyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy93aXN0cm9uX2J0bnMuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy93aXN0cm9uX2J0bnMuYwppbmRleCBiNDM4ZDk5Li43MjE3NmYzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL3dpc3Ryb25fYnRucy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy93aXN0cm9uX2J0bnMuYwpAQCAtOTk4LDEyICs5OTgsMTIgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgd2lzdHJvbl9tYWlsX2xlZCA9IHsKLQkubmFtZQkJCT0gIm1haWw6Z3JlZW4iLAorCS5uYW1lCQkJPSAid2lzdHJvbjpncmVlbjptYWlsIiwKIAkuYnJpZ2h0bmVzc19zZXQJCT0gd2lzdHJvbl9tYWlsX2xlZF9zZXQsCiB9OwogCiBzdGF0aWMgc3RydWN0IGxlZF9jbGFzc2RldiB3aXN0cm9uX3dpZmlfbGVkID0gewotCS5uYW1lCQkJPSAid2lmaTpyZWQiLAorCS5uYW1lCQkJPSAid2lzdHJvbjpyZWQ6d2lmaSIsCiAJLmJyaWdodG5lc3Nfc2V0CQk9IHdpc3Ryb25fd2lmaV9sZWRfc2V0LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9pbnBvcnQuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvaW5wb3J0LmMKaW5kZXggMjZlYzA5NS4uMDZjMzVmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9pbnBvcnQuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2lucG9ydC5jCkBAIC0zNSw3ICszNSw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9sb2dpYm0uYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvbG9naWJtLmMKaW5kZXggMzdlN2M3NS4uOWVhODk1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9sb2dpYm0uYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2xvZ2libS5jCkBAIC0zNiw3ICszNiw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UtYmFzZS5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLWJhc2UuYwppbmRleCBiODYyODI1Li5mNWE2YmUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UtYmFzZS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS1iYXNlLmMKQEAgLTEzLDcgKzEzLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvdHJhY2twb2ludC5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS90cmFja3BvaW50LmMKaW5kZXggOWFiNWI1ZS4uMjZiODQ1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS90cmFja3BvaW50LmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS90cmFja3BvaW50LmMKQEAgLTExLDcgKzExLDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpYnBzMi5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2VkZXYuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2VkZXYuYwppbmRleCBiZTgzNTE2Yy4uYmJiZTVlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZWRldi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2VkZXYuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KQEAgLTEwMzMsNyArMTAzMiw3IEBACiAJCS5mbGFncyA9IElOUFVUX0RFVklDRV9JRF9NQVRDSF9FVkJJVCB8CiAJCQlJTlBVVF9ERVZJQ0VfSURfTUFUQ0hfS0VZQklUIHwKIAkJCUlOUFVUX0RFVklDRV9JRF9NQVRDSF9BQlNCSVQsCi0JCS5ldmJpdCA9IHsgQklUKEVWX0tFWSkgfCBCSVQoRVZfQUJTKSB8IEJJVChFVl9TWU4pIH0sCisJCS5ldmJpdCA9IHsgQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX0FCUykgfSwKIAkJLmtleWJpdCA9IHsgW0JJVF9XT1JEKEJUTl9MRUZUKV0gPSBCSVRfTUFTSyhCVE5fTEVGVCkgfSwKIAkJLmFic2JpdCA9IHsgQklUX01BU0soQUJTX1gpIHwgQklUX01BU0soQUJTX1kpIH0sCiAJfSwJLyogTW91c2UtbGlrZSBkZXZpY2Ugd2l0aCBhYnNvbHV0ZSBYIGFuZCBZIGJ1dCBvcmRpbmFyeQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi14ODZpYTY0aW8uaCBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIteDg2aWE2NGlvLmgKaW5kZXggYzVlNjhkYy4uNjYyZTg0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi14ODZpYTY0aW8uaAorKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXg4NmlhNjRpby5oCkBAIC02Myw3ICs2Myw3IEBACiAJb3V0Yih2YWwsIEk4MDQyX0NPTU1BTkRfUkVHKTsKIH0KIAotI2lmIGRlZmluZWQoX19pMzg2X18pCisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQogCiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAKQEAgLTE4Niw2ICsxODYsMTMgQEAKIAkJfSwKIAl9LAogCXsKKwkJLmlkZW50ID0gIkZ1aml0c3UtU2llbWVucyBBbWlsbyBQcm8gMjAxMCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRlVKSVRTVSBTSUVNRU5TIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkFNSUxPIFBybyBWMjAxMCIpLAorCQl9LAorCX0sCisJewogCQkvKgogCQkgKiBObyBkYXRhIGlzIGNvbWluZyBmcm9tIHRoZSB0b3VjaHNjcmVlbiB1bmxlc3MgS0JDCiAJCSAqIGlzIGluIGxlZ2FjeSBtb2RlLgpAQCAtMjc3LDYgKzI4NCw1NyBAQAogCiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19YODYKKworI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorCisvKgorICogU29tZSBXaXN0cm9uIGJhc2VkIGxhcHRvcHMgbmVlZCB1cyB0byBleHBsaWNpdGx5IGVuYWJsZSB0aGUgJ0RyaXRlaworICoga2V5Ym9hcmQgZXh0ZW5zaW9uJyB0byBtYWtlIHRoZWlyIGV4dHJhIGtleXMgc3RhcnQgZ2VuZXJhdGluZyBzY2FuY29kZXMuCisgKiBPcmlnaW5hbGx5LCB0aGlzIHdhcyBqdXN0IGNvbmZpbmVkIHRvIG9sZGVyIGxhcHRvcHMsIGJ1dCBhIGZldyBBY2VyIGxhcHRvcHMKKyAqIGhhdmUgdHVybmVkIHVwIGluIDIwMDcgdGhhdCBhbHNvIG5lZWQgdGhpcyBhZ2Fpbi4KKyAqLworc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGRhdGEgaTgwNDJfZG1pX2RyaXRla190YWJsZVtdID0geworCXsKKwkJLmlkZW50ID0gIkFjZXIgQXNwaXJlIDU2MzAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQXNwaXJlIDU2MzAiKSwKKwkJfSwKKwl9LAorCXsKKwkJLmlkZW50ID0gIkFjZXIgQXNwaXJlIDU2NTAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQXNwaXJlIDU2NTAiKSwKKwkJfSwKKwl9LAorCXsKKwkJLmlkZW50ID0gIkFjZXIgQXNwaXJlIDU2ODAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQXNwaXJlIDU2ODAiKSwKKwkJfSwKKwl9LAorCXsKKwkJLmlkZW50ID0gIkFjZXIgQXNwaXJlIDkxMTAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQXNwaXJlIDkxMTAiKSwKKwkJfSwKKwl9LAorCXsKKwkJLmlkZW50ID0gIkFjZXIgVHJhdmVsTWF0ZSAyNDkwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBY2VyIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlRyYXZlbE1hdGUgMjQ5MCIpLAorCQl9LAorCX0sCisJeyB9Cit9OworCisjZW5kaWYgLyogQ09ORklHX1g4NiAqLworCiAKICNpZmRlZiBDT05GSUdfUE5QCiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CkBAIC01MTIsNyArNTcwLDcgQEAKICAgICAgICAgaTgwNDJfcmVzZXQgPSAxOwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKF9faTM4Nl9fKQorI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKIAlpZiAoZG1pX2NoZWNrX3N5c3RlbShpODA0Ml9kbWlfbm9sb29wX3RhYmxlKSkKIAkJaTgwNDJfbm9sb29wID0gMTsKIApAQCAtNTIwLDYgKzU3OCwxMSBAQAogCQlpODA0Ml9ub211eCA9IDE7CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19YODYKKwlpZiAoZG1pX2NoZWNrX3N5c3RlbShpODA0Ml9kbWlfZHJpdGVrX3RhYmxlKSkKKwkJaTgwNDJfZHJpdGVrID0gMTsKKyNlbmRpZiAvKiBDT05GSUdfWDg2ICovCisKIAlyZXR1cm4gcmV0dmFsOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLmMKaW5kZXggMWEwY2VhMy4uMjc2MzM5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIuYwpAQCAtMTIsNyArMTIsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTY0LDYgKzYzLDEyIEBACiBtb2R1bGVfcGFyYW1fbmFtZWQocGFuaWNibGluaywgaTgwNDJfYmxpbmtfZnJlcXVlbmN5LCB1aW50LCAwNjAwKTsKIE1PRFVMRV9QQVJNX0RFU0MocGFuaWNibGluaywgIkZyZXF1ZW5jeSB3aXRoIHdoaWNoIGtleWJvYXJkIExFRHMgc2hvdWxkIGJsaW5rIHdoZW4ga2VybmVsIHBhbmljcyIpOwogCisjaWZkZWYgQ09ORklHX1g4Ngorc3RhdGljIHVuc2lnbmVkIGludCBpODA0Ml9kcml0ZWs7Cittb2R1bGVfcGFyYW1fbmFtZWQoZHJpdGVrLCBpODA0Ml9kcml0ZWssIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhkcml0ZWssICJGb3JjZSBlbmFibGUgdGhlIERyaXRlayBrZXlib2FyZCBleHRlbnNpb24iKTsKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX1BOUAogc3RhdGljIGludCBpODA0Ml9ub3BucDsKIG1vZHVsZV9wYXJhbV9uYW1lZChub3BucCwgaTgwNDJfbm9wbnAsIGJvb2wsIDApOwpAQCAtMjgwLDcgKzI4NSwxNCBAQAogCXN0cnVjdCBpODA0Ml9wb3J0ICpwb3J0ID0gc2VyaW8tPnBvcnRfZGF0YTsKIAogCXBvcnQtPmV4aXN0cyA9IDA7Ci0Jc3luY2hyb25pemVfc2NoZWQoKTsKKworCS8qCisJICogV2Ugc3luY2hyb25pemUgd2l0aCBib3RoIEFVWCBhbmQgS0JEIElSUXMgYmVjYXVzZSB0aGVyZSBpcworCSAqIGEgKHZlcnkgdW5saWtlbHkpIGNoYW5jZSB0aGF0IEFVWCBJUlEgaXMgcmFpc2VkIGZvciBLQkQgcG9ydAorCSAqIGFuZCB2aWNlIHZlcnNhLgorCSAqLworCXN5bmNocm9uaXplX2lycShJODA0Ml9BVVhfSVJRKTsKKwlzeW5jaHJvbml6ZV9pcnEoSTgwNDJfS0JEX0lSUSk7CiAJcG9ydC0+c2VyaW8gPSBOVUxMOwogfQogCkBAIC0xMTM5LDYgKzExNTEsNyBAQAogc3RhdGljIGludCBfX2RldmluaXQgaTgwNDJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewogCWludCBlcnJvcjsKKwljaGFyIHBhcmFtOwogCiAJZXJyb3IgPSBpODA0Ml9jb250cm9sbGVyX3NlbGZ0ZXN0KCk7CiAJaWYgKGVycm9yKQpAQCAtMTE1OSw3ICsxMTcyLDE0IEBACiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X2ZhaWw7CiAJfQotCisjaWZkZWYgQ09ORklHX1g4NgorCWlmIChpODA0Ml9kcml0ZWspIHsKKwkJcGFyYW0gPSAweDkwOworCQllcnJvciA9IGk4MDQyX2NvbW1hbmQoJnBhcmFtLCAweDEwNTkpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dF9mYWlsOworCX0KKyNlbmRpZgogLyoKICAqIE9rLCBldmVyeXRoaW5nIGlzIHJlYWR5LCBsZXQncyByZWdpc3RlciBhbGwgc2VyaW8gcG9ydHMKICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9saWJwczIuYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vbGlicHMyLmMKaW5kZXggMTBkOWQ3NC4uYjgxOTIzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9saWJwczIuYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2xpYnBzMi5jCkBAIC0xMyw3ICsxMyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jCmluZGV4IGZkOWM1ZDUuLjU4OTM0YTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYwpAQCAtMTE2LDYgKzExNiw3IEBACiAvLyBGSVhNRSByZW1vdmUgImlycV9kaXNhYmxlZCIKIAl1bnNpZ25lZAkJaXJxX2Rpc2FibGVkOjE7CS8qIFA6IGxvY2sgKi8KIAl1bnNpZ25lZAkJZGlzYWJsZWQ6MTsKKwl1bnNpZ25lZAkJaXNfc3VzcGVuZGVkOjE7CiAKIAlpbnQJCQkoKmZpbHRlcikodm9pZCAqZGF0YSwgaW50IGRhdGFfaWR4LCBpbnQgKnZhbCk7CiAJdm9pZAkJCSpmaWx0ZXJfZGF0YTsKQEAgLTIwMyw3ICsyMDQsNyBAQAogc3RhdGljIGludCBkZXZpY2Vfc3VzcGVuZGVkKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYWRzNzg0NiAqdHMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlyZXR1cm4gZGV2LT5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCAhPSBQTV9FVkVOVF9PTiB8fCB0cy0+ZGlzYWJsZWQ7CisJcmV0dXJuIHRzLT5pc19zdXNwZW5kZWQgfHwgdHMtPmRpc2FibGVkOwogfQogCiBzdGF0aWMgaW50IGFkczc4NDZfcmVhZDEyX3NlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNvbW1hbmQpCkBAIC03OTQsNyArNzk1LDcgQEAKIAogCXNwaW5fbG9ja19pcnEoJnRzLT5sb2NrKTsKIAotCXNwaS0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gbWVzc2FnZTsKKwl0cy0+aXNfc3VzcGVuZGVkID0gMTsKIAlhZHM3ODQ2X2Rpc2FibGUodHMpOwogCiAJc3Bpbl91bmxvY2tfaXJxKCZ0cy0+bG9jayk7CkBAIC04MDksNyArODEwLDcgQEAKIAogCXNwaW5fbG9ja19pcnEoJnRzLT5sb2NrKTsKIAotCXNwaS0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKKwl0cy0+aXNfc3VzcGVuZGVkID0gMDsKIAlhZHM3ODQ2X2VuYWJsZSh0cyk7CiAKIAlzcGluX3VubG9ja19pcnEoJnRzLT5sb2NrKTsKQEAgLTg3MSw3ICs4NzIsNiBAQAogCX0KIAogCWRldl9zZXRfZHJ2ZGF0YSgmc3BpLT5kZXYsIHRzKTsKLQlzcGktPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CiAKIAl0cy0+c3BpID0gc3BpOwogCXRzLT5pbnB1dCA9IGlucHV0X2RldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbWs3MTIuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbWs3MTIuYwppbmRleCA4MGE2NTg4Li5lZmQzYWViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL21rNzEyLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9tazcxMi5jCkBAIC0zNiw3ICszNiw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3VjYjE0MDBfdHMuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdWNiMTQwMF90cy5jCmluZGV4IDk4NmE4MzYuLjYwN2Y5OTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdWNiMTQwMF90cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdWNiMTQwMF90cy5jCkBAIC0xNSw3ICsxNSw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2NhcGkvY2FwaWZzLmMgYi9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpZnMuYwppbmRleCAyZGQxYjU3Li42ZDdjNDdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpZnMuYworKysgYi9kcml2ZXJzL2lzZG4vY2FwaS9jYXBpZnMuYwpAQCAtNTIsNiArNTIsNyBAQAogCWdpZF90IGdpZCA9IDA7CiAJdW1vZGVfdCBtb2RlID0gMDYwMDsKIAljaGFyICp0aGlzX2NoYXI7CisJY2hhciAqbmV3X29wdCA9IGtzdHJkdXAoZGF0YSwgR0ZQX0tFUk5FTCk7CiAKIAl0aGlzX2NoYXIgPSBOVUxMOwogCXdoaWxlICgodGhpc19jaGFyID0gc3Ryc2VwKCZkYXRhLCAiLCIpKSAhPSBOVUxMKSB7CkBAIC03MiwxMSArNzMsMTYgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQorCisJa2ZyZWUocy0+c19vcHRpb25zKTsKKwlzLT5zX29wdGlvbnMgPSBuZXdfb3B0OworCiAJY29uZmlnLnNldHVpZCAgPSBzZXR1aWQ7CiAJY29uZmlnLnNldGdpZCAgPSBzZXRnaWQ7CiAJY29uZmlnLnVpZCAgICAgPSB1aWQ7CiAJY29uZmlnLmdpZCAgICAgPSBnaWQ7CiAJY29uZmlnLm1vZGUgICAgPSBtb2RlOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTg0LDYgKzkwLDcgQEAKIHsKIAkuc3RhdGZzCQk9IHNpbXBsZV9zdGF0ZnMsCiAJLnJlbW91bnRfZnMJPSBjYXBpZnNfcmVtb3VudCwKKwkuc2hvd19vcHRpb25zCT0gZ2VuZXJpY19zaG93X29wdGlvbnMsCiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9hbWQ3OTMwX2ZuLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvYW1kNzkzMF9mbi5jCmluZGV4IGMwZDcwMzYuLjM0MWZhZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9hbWQ3OTMwX2ZuLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2FtZDc5MzBfZm4uYwpAQCAtNzQ0LDggKzc0NCw3IEBACiAKIAogCi12b2lkIF9fZGV2aW5pdAotQW1kNzkzMF9pbml0KHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKK3ZvaWQgQW1kNzkzMF9pbml0KHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKIHsKICAgICBXT1JEICpwdHI7CiAgICAgQllURSBjbWQsIGNudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9LY29uZmlnIGIvZHJpdmVycy9sZWRzL0tjb25maWcKaW5kZXggZWM1NjhmYS4uODU5ODE0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL0tjb25maWcKKysrIGIvZHJpdmVycy9sZWRzL0tjb25maWcKQEAgLTE4LDYgKzE4LDEzIEBACiAKIGNvbW1lbnQgIkxFRCBkcml2ZXJzIgogCitjb25maWcgTEVEU19BVE1FTF9QV00KKwl0cmlzdGF0ZSAiTEVEIFN1cHBvcnQgdXNpbmcgQXRtZWwgUFdNIG91dHB1dHMiCisJZGVwZW5kcyBvbiBMRURTX0NMQVNTICYmIEFUTUVMX1BXTQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgTEVEcyBkcml2ZW4gdXNpbmcgb3V0cHV0cworCSAgb2YgdGhlIGRlZGljYXRlZCBQV00gY29udHJvbGxlciBmb3VuZCBvbiBuZXdlciBBdG1lbCBTT0NzLgorCiBjb25maWcgTEVEU19DT1JHSQogCXRyaXN0YXRlICJMRUQgU3VwcG9ydCBmb3IgdGhlIFNoYXJwIFNMLUM3eDAgc2VyaWVzIgogCWRlcGVuZHMgb24gTEVEU19DTEFTUyAmJiBQWEFfU0hBUlBfQzd4eApAQCAtMzksMTUgKzQ2LDYgQEAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIExFRHMgb24gU2hhcnAgWmF1cnVzCiAJICBTTC1DeHgwMCBzZXJpZXMgKEMxMDAwLCBDMzAwMCwgQzMxMDApLgogCi1jb25maWcgTEVEU19JWFA0WFgKLQl0cmlzdGF0ZSAiTEVEIFN1cHBvcnQgZm9yIEdQSU8gY29ubmVjdGVkIExFRHMgb24gSVhQNFhYIHByb2Nlc3NvcnMiCi0JZGVwZW5kcyBvbiBMRURTX0NMQVNTICYmIEFSQ0hfSVhQNFhYCi0JaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgTEVEcyBjb25uZWN0ZWQgdG8gR1BJTwotCSAgb3V0cHV0cyBvZiB0aGUgSW50ZWwgSVhQNFhYIHByb2Nlc3NvcnMuICBUbyBiZSB1c2VmdWwgdGhlCi0JICBwYXJ0aWN1bGFyIGJvYXJkIG11c3QgaGF2ZSBMRURzIGFuZCB0aGV5IG11c3QgYmUgY29ubmVjdGVkCi0JICB0byB0aGUgR1BJTyBsaW5lcy4gIElmIHVuc3VyZSwgc2F5IFkuCi0KIGNvbmZpZyBMRURTX1RPU0EKIAl0cmlzdGF0ZSAiTEVEIFN1cHBvcnQgZm9yIHRoZSBTaGFycCBTTC02MDAwIHNlcmllcyIKIAlkZXBlbmRzIG9uIExFRFNfQ0xBU1MgJiYgUFhBX1NIQVJQU0wKQEAgLTEwMCw2ICs5OCwxMyBAQAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIENvYmFsdCBSYXEgc2VyaWVzIExFRHMuCiAKK2NvbmZpZyBMRURTX0hQNlhYCisJdHJpc3RhdGUgIkxFRCBTdXBwb3J0IGZvciB0aGUgSFAgSm9ybmFkYSA2eHgiCisJZGVwZW5kcyBvbiBMRURTX0NMQVNTICYmIFNIX0hQNlhYCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBsZWQgc3VwcG9ydCBmb3IgdGhlIGhhbmRoZWxkCisJICBIUCBKb3JuYWRhIDYyMC82NjAvNjgwLzY5MC4KKwogY29uZmlnIExFRFNfR1BJTwogCXRyaXN0YXRlICJMRUQgU3VwcG9ydCBmb3IgR1BJTyBjb25uZWN0ZWQgTEVEcyIKIAlkZXBlbmRzIG9uIExFRFNfQ0xBU1MgJiYgR0VORVJJQ19HUElPCkBAIC0xMTQsNiArMTE5LDMyIEBACiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgQ00tWDI3MCBMRURzLgogCitjb25maWcgTEVEU19DTEVWT19NQUlMCisJdHJpc3RhdGUgIk1haWwgTEVEIG9uIENsZXZvIG5vdGVib29rIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gTEVEU19DTEFTUyAmJiBYODYgJiYgU0VSSU9fSTgwNDIgJiYgRE1JICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIG1ha2VzIHRoZSBtYWlsIExFRCBhY2Nlc3NpYmxlIGZyb20gdXNlcnNwYWNlCisJICBwcm9ncmFtcyB0aHJvdWdoIHRoZSBsZWRzIHN1YnN5c3RlbS4gVGhpcyBMRUQgaGF2ZSB0aHJlZQorCSAga25vd24gbW9kZTogb2ZmLCBibGluayBhdCAwLjVIeiBhbmQgYmxpbmsgYXQgMUh6LgorCisJICBUaGUgZHJpdmVyIHN1cHBvcnRzIHR3byBraW5kcyBvZiBpbnRlcmZhY2U6IHVzaW5nIGxlZHRyaWctdGltZXIKKwkgIG9yIHRocm91Z2ggL3N5cy9jbGFzcy9sZWRzL2NsZXZvOjptYWlsL2JyaWdodG5lc3MuIEFzIHRoaXMgTEVECisJICBjYW5ub3QgY2hhbmdlIGl0J3MgYnJpZ2h0bmVzcyBpdCBibGlua3MgaW5zdGVhZC4gVGhlIGJyaWdodG5lc3MKKwkgIHZhbHVlIDAgbWVhbnMgb2ZmLCAxLi4xMjcgbWVhbnMgYmxpbmsgYXQgMC41SHogYW5kIDEyOC4uMjU1IG1lYW5zCisJICBibGluayBhdCAxSHouCisKKwkgIFRoaXMgbW9kdWxlIGNhbiBkcml2ZSB0aGUgbWFpbCBMRUQgZm9yIHRoZSBmb2xsb3dpbmcgbm90ZWJvb2tzOgorCisJICAJQ2xldm8gRDQxMEoKKwkgIAlDbGV2byBENDEwVgorCSAgCUNsZXZvIEQ0MDBWL0Q0NzBWIChub3QgdGVzdGVkLCBidXQgbWlnaHQgd29yaykKKwkgIAlDbGV2byBNNTQwTgorCSAgCUNsZXZvIE01eDBOIChub3QgdGVzdGVkLCBidXQgbWlnaHQgd29yaykKKwkgIAlQb3NpdGl2byBNb2JpbGUgKENsZXZvIE01eDBWKQorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBsZWRzLWNsZXZvLW1haWwuCisKIGNvbW1lbnQgIkxFRCBUcmlnZ2VycyIKIAogY29uZmlnIExFRFNfVFJJR0dFUlMKQEAgLTEyOCw3ICsxNTksMTEgQEAKIAlkZXBlbmRzIG9uIExFRFNfVFJJR0dFUlMKIAloZWxwCiAJICBUaGlzIGFsbG93cyBMRURzIHRvIGJlIGNvbnRyb2xsZWQgYnkgYSBwcm9ncmFtbWFibGUgdGltZXIKLQkgIHZpYSBzeXNmcy4gSWYgdW5zdXJlLCBzYXkgWS4KKwkgIHZpYSBzeXNmcy4gU29tZSBMRUQgaGFyZHdhcmUgY2FuIGJlIHByb2dyYW1tZWQgdG8gc3RhcnQKKwkgIGJsaW5raW5nIHRoZSBMRUQgd2l0aG91dCBhbnkgZnVydGhlciBzb2Z0d2FyZSBpbnRlcmFjdGlvbi4KKwkgIEZvciBtb3JlIGRldGFpbHMgcmVhZCBEb2N1bWVudGF0aW9uL2xlZHMtY2xhc3MudHh0LgorCisJICBJZiB1bnN1cmUsIHNheSBZLgogCiBjb25maWcgTEVEU19UUklHR0VSX0lERV9ESVNLCiAJYm9vbCAiTEVEIElERSBEaXNrIFRyaWdnZXIiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvTWFrZWZpbGUgYi9kcml2ZXJzL2xlZHMvTWFrZWZpbGUKaW5kZXggYTYwZGUxYi4uODRjZWQzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbGVkcy9NYWtlZmlsZQpAQCAtNSwxMCArNSwxMCBAQAogb2JqLSQoQ09ORklHX0xFRFNfVFJJR0dFUlMpCQkrPSBsZWQtdHJpZ2dlcnMubwogCiAjIExFRCBQbGF0Zm9ybSBEcml2ZXJzCitvYmotJChDT05GSUdfTEVEU19BVE1FTF9QV00pCQkrPSBsZWRzLWF0bWVsLXB3bS5vCiBvYmotJChDT05GSUdfTEVEU19DT1JHSSkJCSs9IGxlZHMtY29yZ2kubwogb2JqLSQoQ09ORklHX0xFRFNfTE9DT01PKQkJKz0gbGVkcy1sb2NvbW8ubwogb2JqLSQoQ09ORklHX0xFRFNfU1BJVFopCQkrPSBsZWRzLXNwaXR6Lm8KLW9iai0kKENPTkZJR19MRURTX0lYUDRYWCkJCSs9IGxlZHMtaXhwNHh4LWdwaW8ubwogb2JqLSQoQ09ORklHX0xFRFNfVE9TQSkJCQkrPSBsZWRzLXRvc2Eubwogb2JqLSQoQ09ORklHX0xFRFNfUzNDMjRYWCkJCSs9IGxlZHMtczNjMjR4eC5vCiBvYmotJChDT05GSUdfTEVEU19BTVNfREVMVEEpCQkrPSBsZWRzLWFtcy1kZWx0YS5vCkBAIC0xOSw2ICsxOSw4IEBACiBvYmotJChDT05GSUdfTEVEU19DT0JBTFRfUkFRKQkJKz0gbGVkcy1jb2JhbHQtcmFxLm8KIG9iai0kKENPTkZJR19MRURTX0dQSU8pCQkJKz0gbGVkcy1ncGlvLm8KIG9iai0kKENPTkZJR19MRURTX0NNX1gyNzApICAgICAgICAgICAgICArPSBsZWRzLWNtLXgyNzAubworb2JqLSQoQ09ORklHX0xFRFNfQ0xFVk9fTUFJTCkJCSs9IGxlZHMtY2xldm8tbWFpbC5vCitvYmotJChDT05GSUdfTEVEU19IUDZYWCkJCSs9IGxlZHMtaHA2eHgubwogCiAjIExFRCBUcmlnZ2Vycwogb2JqLSQoQ09ORklHX0xFRFNfVFJJR0dFUl9USU1FUikJKz0gbGVkdHJpZy10aW1lci5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1hbXMtZGVsdGEuYyBiL2RyaXZlcnMvbGVkcy9sZWRzLWFtcy1kZWx0YS5jCmluZGV4IDU5OTg3OGMuLjllMzA3NzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLWFtcy1kZWx0YS5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLWFtcy1kZWx0YS5jCkBAIC0zNyw0MiArMzcsNDIgQEAKIHN0YXRpYyBzdHJ1Y3QgYW1zX2RlbHRhX2xlZCBhbXNfZGVsdGFfbGVkc1tdID0gewogCXsKIAkJLmNkZXYJCT0gewotCQkJLm5hbWUJCT0gImFtcy1kZWx0YTpjYW1lcmEiLAorCQkJLm5hbWUJCT0gImFtcy1kZWx0YTo6Y2FtZXJhIiwKIAkJCS5icmlnaHRuZXNzX3NldCA9IGFtc19kZWx0YV9sZWRfc2V0LAogCQl9LAogCQkuYml0bWFzawk9IEFNU19ERUxUQV9MQVRDSDFfTEVEX0NBTUVSQSwKIAl9LAogCXsKIAkJLmNkZXYJCT0gewotCQkJLm5hbWUJCT0gImFtcy1kZWx0YTphZHZlcnQiLAorCQkJLm5hbWUJCT0gImFtcy1kZWx0YTo6YWR2ZXJ0IiwKIAkJCS5icmlnaHRuZXNzX3NldCA9IGFtc19kZWx0YV9sZWRfc2V0LAogCQl9LAogCQkuYml0bWFzawk9IEFNU19ERUxUQV9MQVRDSDFfTEVEX0FEVkVSVCwKIAl9LAogCXsKIAkJLmNkZXYJCT0gewotCQkJLm5hbWUJCT0gImFtcy1kZWx0YTplbWFpbCIsCisJCQkubmFtZQkJPSAiYW1zLWRlbHRhOjplbWFpbCIsCiAJCQkuYnJpZ2h0bmVzc19zZXQgPSBhbXNfZGVsdGFfbGVkX3NldCwKIAkJfSwKIAkJLmJpdG1hc2sJPSBBTVNfREVMVEFfTEFUQ0gxX0xFRF9FTUFJTCwKIAl9LAogCXsKIAkJLmNkZXYJCT0gewotCQkJLm5hbWUJCT0gImFtcy1kZWx0YTpoYW5kc2ZyZWUiLAorCQkJLm5hbWUJCT0gImFtcy1kZWx0YTo6aGFuZHNmcmVlIiwKIAkJCS5icmlnaHRuZXNzX3NldCA9IGFtc19kZWx0YV9sZWRfc2V0LAogCQl9LAogCQkuYml0bWFzawk9IEFNU19ERUxUQV9MQVRDSDFfTEVEX0hBTkRTRlJFRSwKIAl9LAogCXsKIAkJLmNkZXYJCT0gewotCQkJLm5hbWUJCT0gImFtcy1kZWx0YTp2b2ljZW1haWwiLAorCQkJLm5hbWUJCT0gImFtcy1kZWx0YTo6dm9pY2VtYWlsIiwKIAkJCS5icmlnaHRuZXNzX3NldCA9IGFtc19kZWx0YV9sZWRfc2V0LAogCQl9LAogCQkuYml0bWFzawk9IEFNU19ERUxUQV9MQVRDSDFfTEVEX1ZPSUNFTUFJTCwKIAl9LAogCXsKIAkJLmNkZXYJCT0gewotCQkJLm5hbWUJCT0gImFtcy1kZWx0YTp2b2ljZSIsCisJCQkubmFtZQkJPSAiYW1zLWRlbHRhOjp2b2ljZSIsCiAJCQkuYnJpZ2h0bmVzc19zZXQgPSBhbXNfZGVsdGFfbGVkX3NldCwKIAkJfSwKIAkJLmJpdG1hc2sJPSBBTVNfREVMVEFfTEFUQ0gxX0xFRF9WT0lDRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLWF0bWVsLXB3bS5jIGIvZHJpdmVycy9sZWRzL2xlZHMtYXRtZWwtcHdtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY2MWY1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLWF0bWVsLXB3bS5jCkBAIC0wLDAgKzEsMTU3IEBACisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvYXRtZWxfcHdtLmg+CisKKworc3RydWN0IHB3bWxlZCB7CisJc3RydWN0IGxlZF9jbGFzc2RldgljZGV2OworCXN0cnVjdCBwd21fY2hhbm5lbAlwd21jOworCXN0cnVjdCBncGlvX2xlZAkJKmRlc2M7CisJdTMyCQkJbXVsdDsKKwl1OAkJCWFjdGl2ZV9sb3c7Cit9OworCisKKy8qCisgKiBGb3Igc2ltcGxpY2l0eSwgd2UgdXNlICJicmlnaHRuZXNzIiBhcyBpZiBpdCB3ZXJlIGEgbGluZWFyIGZ1bmN0aW9uCisgKiBvZiBQV00gZHV0eSBjeWNsZS4gIEhvd2V2ZXIsIGEgbG9nYXJpdGhtaWMgZnVuY3Rpb24gb2YgZHV0eSBjeWNsZSBpcworICogcHJvYmFibHkgYSBiZXR0ZXIgbWF0Y2ggZm9yIHBlcmNlaXZlZCBicmlnaHRuZXNzOiB0d28gaXMgaGFsZiBhcyBicmlnaHQKKyAqIGFzIGZvdXIsIGZvdXIgaXMgaGFsZiBhcyBicmlnaHQgYXMgZWlnaHQsIGV0YworICovCitzdGF0aWMgdm9pZCBwd21sZWRfYnJpZ2h0bmVzcyhzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpjZGV2LCBlbnVtIGxlZF9icmlnaHRuZXNzIGIpCit7CisJc3RydWN0IHB3bWxlZAkJICpsZWQ7CisKKwkvKiB1cGRhdGUgdGhlIGR1dHkgY3ljbGUgZm9yIHRoZSAqbmV4dCogcGVyaW9kICovCisJbGVkID0gY29udGFpbmVyX29mKGNkZXYsIHN0cnVjdCBwd21sZWQsIGNkZXYpOworCXB3bV9jaGFubmVsX3dyaXRlbCgmbGVkLT5wd21jLCBQV01fQ1VQRCwgbGVkLT5tdWx0ICogKHVuc2lnbmVkKSBiKTsKK30KKworLyoKKyAqIE5PVEU6ICB3ZSByZXVzZSB0aGUgcGxhdGZvcm1fZGF0YSBzdHJ1Y3R1cmUgb2YgR1BJTyBsZWRzLAorICogYnV0IHJlcHVycG9zZSBpdHMgImdwaW8iIG51bWJlciBhcyBhIFBXTSBjaGFubmVsIG51bWJlci4KKyAqLworc3RhdGljIGludCBfX2luaXQgcHdtbGVkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJY29uc3Qgc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEJKnBkYXRhOworCXN0cnVjdCBwd21sZWQJCQkJKmxlZHM7CisJdW5zaWduZWQJCQkJaTsKKwlpbnQJCQkJCXN0YXR1czsKKworCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKCFwZGF0YSB8fCBwZGF0YS0+bnVtX2xlZHMgPCAxKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWxlZHMgPSBrY2FsbG9jKHBkYXRhLT5udW1fbGVkcywgc2l6ZW9mKCpsZWRzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsZWRzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX2xlZHM7IGkrKykgeworCQlzdHJ1Y3QgcHdtbGVkCQkqbGVkID0gbGVkcyArIGk7CisJCWNvbnN0IHN0cnVjdCBncGlvX2xlZAkqZGF0ID0gcGRhdGEtPmxlZHMgKyBpOworCQl1MzIJCQl0bXA7CisKKwkJbGVkLT5jZGV2Lm5hbWUgPSBkYXQtPm5hbWU7CisJCWxlZC0+Y2Rldi5icmlnaHRuZXNzID0gTEVEX09GRjsKKwkJbGVkLT5jZGV2LmJyaWdodG5lc3Nfc2V0ID0gcHdtbGVkX2JyaWdodG5lc3M7CisJCWxlZC0+Y2Rldi5kZWZhdWx0X3RyaWdnZXIgPSBkYXQtPmRlZmF1bHRfdHJpZ2dlcjsKKworCQlsZWQtPmFjdGl2ZV9sb3cgPSBkYXQtPmFjdGl2ZV9sb3c7CisKKwkJc3RhdHVzID0gcHdtX2NoYW5uZWxfYWxsb2MoZGF0LT5ncGlvLCAmbGVkLT5wd21jKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycjsKKworCQkvKgorCQkgKiBQcmVzY2FsZSBjbG9jayBieSAyXngsIHNvIFBXTSBjb3VudHMgaW4gbG93IE1Iei4KKwkJICogU3RhcnQgZWFjaCBjeWNsZSB3aXRoIHRoZSBMRUQgYWN0aXZlLCBzbyBpbmNyZWFzaW5nCisJCSAqIHRoZSBkdXR5IGN5Y2xlIGdpdmVzIHVzIG1vcmUgdGltZSBvbiAoPT0gYnJpZ2h0ZXIpLgorCQkgKi8KKwkJdG1wID0gNTsKKwkJaWYgKCFsZWQtPmFjdGl2ZV9sb3cpCisJCQl0bXAgfD0gUFdNX0NQUl9DUE9MOworCQlwd21fY2hhbm5lbF93cml0ZWwoJmxlZC0+cHdtYywgUFdNX0NNUiwgdG1wKTsKKworCQkvKgorCQkgKiBQaWNrIGEgcGVyaW9kIHNvIFBXTSBjeWNsZXMgYXQgMTAwKyBIejsgYW5kIGEgbXVsdGlwbGllcgorCQkgKiBmb3Igc2NhbGluZyBkdXR5IGN5Y2xlOiAgYnJpZ2h0bmVzcyAqIG11bHQuCisJCSAqLworCQl0bXAgPSAobGVkLT5wd21jLm1jayAvICgxIDw8IDUpKSAvIDEwMDsKKwkJdG1wIC89IDI1NTsKKwkJbGVkLT5tdWx0ID0gdG1wOworCQlwd21fY2hhbm5lbF93cml0ZWwoJmxlZC0+cHdtYywgUFdNX0NEVFksCisJCQkJbGVkLT5jZGV2LmJyaWdodG5lc3MgKiAyNTUpOworCQlwd21fY2hhbm5lbF93cml0ZWwoJmxlZC0+cHdtYywgUFdNX0NQUkQsCisJCQkJTEVEX0ZVTEwgKiB0bXApOworCisJCXB3bV9jaGFubmVsX2VuYWJsZSgmbGVkLT5wd21jKTsKKworCQkvKiBIYW5kIGl0IG92ZXIgdG8gdGhlIExFRCBmcmFtZXdvcmsgKi8KKwkJc3RhdHVzID0gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZsZWQtPmNkZXYpOworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJcHdtX2NoYW5uZWxfZnJlZSgmbGVkLT5wd21jKTsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbGVkcyk7CisJcmV0dXJuIDA7CisKK2VycjoKKwlpZiAoaSA+IDApIHsKKwkJZm9yIChpID0gaSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmbGVkc1tpXS5jZGV2KTsKKwkJCXB3bV9jaGFubmVsX2ZyZWUoJmxlZHNbaV0ucHdtYyk7CisJCX0KKwl9CisJa2ZyZWUobGVkcyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBwd21sZWRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJY29uc3Qgc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEJKnBkYXRhOworCXN0cnVjdCBwd21sZWQJCQkJKmxlZHM7CisJdW5zaWduZWQJCQkJaTsKKworCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJbGVkcyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fbGVkczsgaSsrKSB7CisJCXN0cnVjdCBwd21sZWQJCSpsZWQgPSBsZWRzICsgaTsKKworCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmbGVkLT5jZGV2KTsKKwkJcHdtX2NoYW5uZWxfZnJlZSgmbGVkLT5wd21jKTsKKwl9CisKKwlrZnJlZShsZWRzKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcHdtbGVkX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9CQkibGVkcy1hdG1lbC1wd20iLAorCQkub3duZXIgPQlUSElTX01PRFVMRSwKKwl9LAorCS8qIFJFVklTSVQgYWRkIHN1c3BlbmQoKSBhbmQgcmVzdW1lKCkgbWV0aG9kcyAqLworCS5yZW1vdmUgPQlfX2V4aXRfcChwd21sZWRfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1vZGluaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZwd21sZWRfZHJpdmVyLCBwd21sZWRfcHJvYmUpOworfQorbW9kdWxlX2luaXQobW9kaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtb2RleGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnB3bWxlZF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQobW9kZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBMRURzIHdpdGggUFdNLWNvbnRyb2xsZWQgYnJpZ2h0bmVzcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtY2xldm8tbWFpbC5jIGIvZHJpdmVycy9sZWRzL2xlZHMtY2xldm8tbWFpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjM2QzM2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1jbGV2by1tYWlsLmMKQEAgLTAsMCArMSwyMTkgQEAKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKworI2luY2x1ZGUgPGxpbnV4L2k4MDQyLmg+CisKKyNkZWZpbmUgQ0xFVk9fTUFJTF9MRURfT0ZGCQkweDAwODQKKyNkZWZpbmUgQ0xFVk9fTUFJTF9MRURfQkxJTktfMUhaCTB4MDA4QQorI2RlZmluZSBDTEVWT19NQUlMX0xFRF9CTElOS18wXzVIWgkweDAwODMKKworTU9EVUxFX0FVVEhPUigiTeFydG9uIE7pbWV0aCA8bm0xMjdAZnJlZW1haWwuaHU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNsZXZvIG1haWwgTEVEIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdGRhdGEgbm9kZXRlY3Q7Cittb2R1bGVfcGFyYW1fbmFtZWQobm9kZXRlY3QsIG5vZGV0ZWN0LCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm9kZXRlY3QsICJTa2lwIERNSSBoYXJkd2FyZSBkZXRlY3Rpb24iKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisKK3N0YXRpYyBpbnQgX19pbml0IGNsZXZvX21haWxfbGVkX2RtaV9jYWxsYmFjayhjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyBLQlVJTERfTU9ETkFNRSAiOiAnJXMnIGZvdW5kXG4iLCBpZC0+aWRlbnQpOworCXJldHVybiAxOworfQorCisvKgorICogc3RydWN0IG1haWxfbGVkX3doaXRlbGlzdCAtIExpc3Qgb2Yga25vd24gZ29vZCBtb2RlbHMKKyAqCisgKiBDb250YWlucyB0aGUga25vd24gZ29vZCBtb2RlbHMgdGhpcyBkcml2ZXIgaXMgY29tcGF0aWJsZSB3aXRoLgorICogV2hlbiBhZGRpbmcgYSBuZXcgbW9kZWwgdHJ5IHRvIGJlIGFzIHN0cmljdCBhcyBwb3NzaWJsZS4gVGhpcworICogbWFrZXMgaXQgcG9zc2libGUgdG8ga2VlcCB0aGUgZmFsc2UgcG9zaXRpdmVzICh0aGUgbW9kZWwgaXMKKyAqIGRldGVjdGVkIGFzIHdvcmtpbmcsIGJ1dCBpbiByZWFsaXR5IGl0IGlzIG5vdCkgYXMgbG93IGFzCisgKiBwb3NzaWJsZS4KKyAqLworc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGRhdGEgbWFpbF9sZWRfd2hpdGVsaXN0W10gPSB7CisJeworCQkuY2FsbGJhY2sgPSBjbGV2b19tYWlsX2xlZF9kbWlfY2FsbGJhY2ssCisJCS5pZGVudCA9ICJDbGV2byBENDEwSiIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiVklBIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIks4TjgwMCIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX1ZFUlNJT04sICJWVDgyMDRCIikKKwkJfQorCX0sCisJeworCQkuY2FsbGJhY2sgPSBjbGV2b19tYWlsX2xlZF9kbWlfY2FsbGJhY2ssCisJCS5pZGVudCA9ICJDbGV2byBNNXgwTiIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQ0xFVk8gQ28uIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk01eDBOIikKKwkJfQorCX0sCisJeworCQkuY2FsbGJhY2sgPSBjbGV2b19tYWlsX2xlZF9kbWlfY2FsbGJhY2ssCisJCS5pZGVudCA9ICJQb3NpdGl2byBNb2JpbGUiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQ0xFVk8gQ28uICIpLAorCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiTTVYMFYgIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlBvc2l0aXZvIE1vYmlsZSIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX1ZFUlNJT04sICJWVDYxOTgiKQorCQl9CisJfSwKKwl7CisJCS5jYWxsYmFjayA9IGNsZXZvX21haWxfbGVkX2RtaV9jYWxsYmFjaywKKwkJLmlkZW50ID0gIkNsZXZvIEQ0MTBWIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkNsZXZvLCBDby4iKSwKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIkQ0MDBWL0Q0NzBWIiksCisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFUlNJT04sICJTUzc4QiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX1ZFUlNJT04sICJSZXYuIEExIikKKwkJfQorCX0sCisJeyB9Cit9OworCitzdGF0aWMgdm9pZCBjbGV2b19tYWlsX2xlZF9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCisJCQkJZW51bSBsZWRfYnJpZ2h0bmVzcyB2YWx1ZSkKK3sKKwlpZiAodmFsdWUgPT0gTEVEX09GRikKKwkJaTgwNDJfY29tbWFuZChOVUxMLCBDTEVWT19NQUlMX0xFRF9PRkYpOworCWVsc2UgaWYgKHZhbHVlIDw9IExFRF9IQUxGKQorCQlpODA0Ml9jb21tYW5kKE5VTEwsIENMRVZPX01BSUxfTEVEX0JMSU5LXzBfNUhaKTsKKwllbHNlCisJCWk4MDQyX2NvbW1hbmQoTlVMTCwgQ0xFVk9fTUFJTF9MRURfQkxJTktfMUhaKTsKKworfQorCitzdGF0aWMgaW50IGNsZXZvX21haWxfbGVkX2JsaW5rKHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAorCQkJCXVuc2lnbmVkIGxvbmcqIGRlbGF5X29uLAorCQkJCXVuc2lnbmVkIGxvbmcqIGRlbGF5X29mZikKK3sKKwlpbnQgc3RhdHVzID0gLUVJTlZBTDsKKworCWlmICgqZGVsYXlfb24gPT0gMCAvKiBtcyAqLyAmJiAqZGVsYXlfb2ZmID09IDAgLyogbXMgKi8pIHsKKwkJLyogU3BlY2lhbCBjYXNlOiB0aGUgbGVkcyBzdWJzeXN0ZW0gcmVxdWVzdGVkIHVzIHRvCisJCSAqIGNob3NlIG9uZSB1c2VyIGZyaWVuZGx5IGJsaW5raW5nIG9mIHRoZSBMRUQsIGFuZAorCQkgKiBzdGFydCBpdC4gTGV0J3MgYmxpbmsgdGhlIGxlZCBzbG93bHkgKDAuNUh6KS4KKwkJICovCisJCSpkZWxheV9vbiA9IDEwMDA7IC8qIG1zICovCisJCSpkZWxheV9vZmYgPSAxMDAwOyAvKiBtcyAqLworCQlpODA0Ml9jb21tYW5kKE5VTEwsIENMRVZPX01BSUxfTEVEX0JMSU5LXzBfNUhaKTsKKwkJc3RhdHVzID0gMDsKKworCX0gZWxzZSBpZiAoKmRlbGF5X29uID09IDUwMCAvKiBtcyAqLyAmJiAqZGVsYXlfb2ZmID09IDUwMCAvKiBtcyAqLykgeworCQkvKiBibGluayB0aGUgbGVkIHdpdGggMUh6ICovCisJCWk4MDQyX2NvbW1hbmQoTlVMTCwgQ0xFVk9fTUFJTF9MRURfQkxJTktfMUhaKTsKKwkJc3RhdHVzID0gMDsKKworCX0gZWxzZSBpZiAoKmRlbGF5X29uID09IDEwMDAgLyogbXMgKi8gJiYgKmRlbGF5X29mZiA9PSAxMDAwIC8qIG1zICovKSB7CisJCS8qIGJsaW5rIHRoZSBsZWQgd2l0aCAwLjVIeiAqLworCQlpODA0Ml9jb21tYW5kKE5VTEwsIENMRVZPX01BSUxfTEVEX0JMSU5LXzBfNUhaKTsKKwkJc3RhdHVzID0gMDsKKworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0RFQlVHIEtCVUlMRF9NT0ROQU1FCisJCSAgICAgICAiOiBjbGV2b19tYWlsX2xlZF9ibGluayguLi4sICVsdSwgJWx1KSwiCisJCSAgICAgICAiIHJldHVybmluZyAtRUlOVkFMICh1bnN1cHBvcnRlZClcbiIsCisJCSAgICAgICAqZGVsYXlfb24sICpkZWxheV9vZmYpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGVkX2NsYXNzZGV2IGNsZXZvX21haWxfbGVkID0geworCS5uYW1lCQkJPSAiY2xldm86Om1haWwiLAorCS5icmlnaHRuZXNzX3NldAkJPSBjbGV2b19tYWlsX2xlZF9zZXQsCisJLmJsaW5rX3NldAkJPSBjbGV2b19tYWlsX2xlZF9ibGluaywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNsZXZvX21haWxfbGVkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmcGRldi0+ZGV2LCAmY2xldm9fbWFpbF9sZWQpOworfQorCitzdGF0aWMgaW50IGNsZXZvX21haWxfbGVkX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZjbGV2b19tYWlsX2xlZCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgY2xldm9fbWFpbF9sZWRfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCisJCQkJICBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJbGVkX2NsYXNzZGV2X3N1c3BlbmQoJmNsZXZvX21haWxfbGVkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjbGV2b19tYWlsX2xlZF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCWxlZF9jbGFzc2Rldl9yZXN1bWUoJmNsZXZvX21haWxfbGVkKTsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIGNsZXZvX21haWxfbGVkX3N1c3BlbmQgICAgTlVMTAorI2RlZmluZSBjbGV2b19tYWlsX2xlZF9yZXN1bWUgICAgIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjbGV2b19tYWlsX2xlZF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGNsZXZvX21haWxfbGVkX3Byb2JlLAorCS5yZW1vdmUJCT0gY2xldm9fbWFpbF9sZWRfcmVtb3ZlLAorCS5zdXNwZW5kCT0gY2xldm9fbWFpbF9sZWRfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGNsZXZvX21haWxfbGVkX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJCT0gS0JVSUxEX01PRE5BTUUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNsZXZvX21haWxfbGVkX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyb3IgPSAwOworCWludCBjb3VudCA9IDA7CisKKwkvKiBDaGVjayB3aXRoIHRoZSBoZWxwIG9mIERNSSBpZiB3ZSBhcmUgcnVubmluZyBvbiBzdXBwb3J0ZWQgaGFyZHdhcmUgKi8KKwlpZiAoIW5vZGV0ZWN0KSB7CisJCWNvdW50ID0gZG1pX2NoZWNrX3N5c3RlbShtYWlsX2xlZF93aGl0ZWxpc3QpOworCX0gZWxzZSB7CisJCWNvdW50ID0gMTsKKwkJcHJpbnRrKEtFUk5fRVJSIEtCVUlMRF9NT0ROQU1FICI6IFNraXBwaW5nIERNSSBkZXRlY3Rpb24uICIKKwkJICAgICAgICJJZiB0aGUgZHJpdmVyIHdvcmtzIG9uIHlvdXIgaGFyZHdhcmUgcGxlYXNlICIKKwkJICAgICAgICJyZXBvcnQgbW9kZWwgYW5kIHRoZSBvdXRwdXQgb2YgZG1pZGVjb2RlIGluIHRyYWNrZXIgIgorCQkgICAgICAgImF0IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvY2xldm8tbWFpbGxlZC9cbiIpOworCX0KKworCWlmICghY291bnQpCisJCXJldHVybiAtRU5PREVWOworCisJcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoS0JVSUxEX01PRE5BTUUsIC0xLCBOVUxMLCAwKTsKKwlpZiAoIUlTX0VSUihwZGV2KSkgeworCQllcnJvciA9IHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmY2xldm9fbWFpbF9sZWRfZHJpdmVyLAorCQkJCQkgICAgICBjbGV2b19tYWlsX2xlZF9wcm9iZSk7CisJCWlmIChlcnJvcikgeworCQkJcHJpbnRrKEtFUk5fRVJSIEtCVUlMRF9NT0ROQU1FCisJCQkgICAgICAgIjogQ2FuJ3QgcHJvYmUgcGxhdGZvcm0gZHJpdmVyXG4iKTsKKwkJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOworCQl9CisJfSBlbHNlCisJCWVycm9yID0gUFRSX0VSUihwZGV2KTsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZXZvX21haWxfbGVkX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmY2xldm9fbWFpbF9sZWRfZHJpdmVyKTsKKworCWNsZXZvX21haWxfbGVkX3NldChOVUxMLCBMRURfT0ZGKTsKK30KKworbW9kdWxlX2luaXQoY2xldm9fbWFpbF9sZWRfaW5pdCk7Cittb2R1bGVfZXhpdChjbGV2b19tYWlsX2xlZF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLWNvcmdpLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1jb3JnaS5jCmluZGV4IGNmMWRjZDcuLmU0NWY2YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLWNvcmdpLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtY29yZ2kuYwpAQCAtMzgsMTMgKzM4LDEzIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbGVkX2NsYXNzZGV2IGNvcmdpX2FtYmVyX2xlZCA9IHsKLQkubmFtZQkJCT0gImNvcmdpOmFtYmVyIiwKKwkubmFtZQkJCT0gImNvcmdpOmFtYmVyOmNoYXJnZSIsCiAJLmRlZmF1bHRfdHJpZ2dlcgk9ICJzaGFycHNsLWNoYXJnZSIsCiAJLmJyaWdodG5lc3Nfc2V0CQk9IGNvcmdpbGVkX2FtYmVyX3NldCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbGVkX2NsYXNzZGV2IGNvcmdpX2dyZWVuX2xlZCA9IHsKLQkubmFtZQkJCT0gImNvcmdpOmdyZWVuIiwKKwkubmFtZQkJCT0gImNvcmdpOmdyZWVuOm1haWwiLAogCS5kZWZhdWx0X3RyaWdnZXIJPSAibmFuZC1kaXNrIiwKIAkuYnJpZ2h0bmVzc19zZXQJCT0gY29yZ2lsZWRfZ3JlZW5fc2V0LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLWdwaW8uYyBiL2RyaXZlcnMvbGVkcy9sZWRzLWdwaW8uYwppbmRleCA5OWJjNTAwLi42YzBhOWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1ncGlvLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtZ3Bpby5jCkBAIC04NSw3ICs4NSw3IEBACiAJCWxlZF9kYXQtPmNhbl9zbGVlcCA9IGdwaW9fY2Fuc2xlZXAoY3VyX2xlZC0+Z3Bpbyk7CiAJCWxlZF9kYXQtPmFjdGl2ZV9sb3cgPSBjdXJfbGVkLT5hY3RpdmVfbG93OwogCQlsZWRfZGF0LT5jZGV2LmJyaWdodG5lc3Nfc2V0ID0gZ3Bpb19sZWRfc2V0OwotCQlsZWRfZGF0LT5jZGV2LmJyaWdodG5lc3MgPSBjdXJfbGVkLT5hY3RpdmVfbG93ID8gTEVEX0ZVTEwgOiBMRURfT0ZGOworCQlsZWRfZGF0LT5jZGV2LmJyaWdodG5lc3MgPSBMRURfT0ZGOwogCiAJCXJldCA9IGdwaW9fcmVxdWVzdChsZWRfZGF0LT5ncGlvLCBsZWRfZGF0LT5jZGV2Lm5hbWUpOwogCQlpZiAocmV0IDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLWhwNnh4LmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1ocDZ4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZDRlYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1ocDZ4eC5jCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogTEVEIFRyaWdnZXJzIENvcmUKKyAqIEZvciB0aGUgSFAgSm9ybmFkYSA2MjAvNjYwLzY4MC82OTAgaGFuZGhlbGRzCisgKgorICogQ29weXJpZ2h0IDIwMDggS3Jpc3RvZmZlciBFcmljc29uIDxrcmlzdG9mZmVyLmVyaWNzb25AZ21haWwuY29tPgorICogICAgIHRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIGxlZHMtc3BpdHouYyBieSBSaWNoYXJkIFB1cmRpZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorI2luY2x1ZGUgPGFzbS9oZDY0NDYxLmg+CisjaW5jbHVkZSA8YXNtL2hwNnh4Lmg+CisKK3N0YXRpYyB2b2lkIGhwNnh4bGVkX2dyZWVuX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwgZW51bSBsZWRfYnJpZ2h0bmVzcyB2YWx1ZSkKK3sKKwl1OCB2ODsKKworCXY4ID0gaW5iKFBLRFIpOworCWlmICh2YWx1ZSkKKwkJb3V0Yih2OCAmICh+UEtEUl9MRURfR1JFRU4pLCBQS0RSKTsKKwllbHNlCisJCW91dGIodjggfCBQS0RSX0xFRF9HUkVFTiwgUEtEUik7Cit9CisKK3N0YXRpYyB2b2lkIGhwNnh4bGVkX3JlZF9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsIGVudW0gbGVkX2JyaWdodG5lc3MgdmFsdWUpCit7CisJdTE2IHYxNjsKKworCXYxNiA9IGludyhIRDY0NDYxX0dQQkRSKTsKKwlpZiAodmFsdWUpCisJCW91dHcodjE2ICYgKH5IRDY0NDYxX0dQQkRSX0xFRF9SRUQpLCBIRDY0NDYxX0dQQkRSKTsKKwllbHNlCisJCW91dHcodjE2IHwgSEQ2NDQ2MV9HUEJEUl9MRURfUkVELCBIRDY0NDYxX0dQQkRSKTsKK30KKworc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgaHA2eHhfcmVkX2xlZCA9IHsKKwkubmFtZQkJCT0gImhwNnh4OnJlZCIsCisJLmRlZmF1bHRfdHJpZ2dlcgk9ICJocDZ4eC1jaGFyZ2UiLAorCS5icmlnaHRuZXNzX3NldAkJPSBocDZ4eGxlZF9yZWRfc2V0LAorfTsKKworc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgaHA2eHhfZ3JlZW5fbGVkID0geworCS5uYW1lCQkJPSAiaHA2eHg6Z3JlZW4iLAorCS5kZWZhdWx0X3RyaWdnZXIJPSAiaWRlLWRpc2siLAorCS5icmlnaHRuZXNzX3NldAkJPSBocDZ4eGxlZF9ncmVlbl9zZXQsCit9OworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGhwNnh4bGVkX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJbGVkX2NsYXNzZGV2X3N1c3BlbmQoJmhwNnh4X3JlZF9sZWQpOworCWxlZF9jbGFzc2Rldl9zdXNwZW5kKCZocDZ4eF9ncmVlbl9sZWQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhwNnh4bGVkX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJbGVkX2NsYXNzZGV2X3Jlc3VtZSgmaHA2eHhfcmVkX2xlZCk7CisJbGVkX2NsYXNzZGV2X3Jlc3VtZSgmaHA2eHhfZ3JlZW5fbGVkKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGhwNnh4bGVkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldDsKKworCXJldCA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmcGRldi0+ZGV2LCAmaHA2eHhfcmVkX2xlZCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmhwNnh4X2dyZWVuX2xlZCk7CisJaWYgKHJldCA8IDApCisJCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZocDZ4eF9yZWRfbGVkKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaHA2eHhsZWRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmhwNnh4X3JlZF9sZWQpOworCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZocDZ4eF9ncmVlbl9sZWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGhwNnh4bGVkX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gaHA2eHhsZWRfcHJvYmUsCisJLnJlbW92ZQkJPSBocDZ4eGxlZF9yZW1vdmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBocDZ4eGxlZF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaHA2eHhsZWRfcmVzdW1lLAorI2VuZGlmCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCQk9ICJocDZ4eC1sZWQiLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBocDZ4eGxlZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmaHA2eHhsZWRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGhwNnh4bGVkX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaHA2eHhsZWRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaHA2eHhsZWRfaW5pdCk7Cittb2R1bGVfZXhpdChocDZ4eGxlZF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiS3Jpc3RvZmZlciBFcmljc29uIDxrcmlzdG9mZmVyLmVyaWNzb25AZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIUCBKb3JuYWRhIDZ4eCBMRUQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1peHA0eHgtZ3Bpby5jIGIvZHJpdmVycy9sZWRzL2xlZHMtaXhwNHh4LWdwaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjZjBiOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1peHA0eHgtZ3Bpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qCi0gKiBJWFA0WFggR1BJTyBkcml2ZXIgTEVEIGRyaXZlcgotICoKLSAqIEF1dGhvcjogSm9obiBCb3dsZXIgPGpib3dsZXJAYWNtLm9yZz4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSm9obiBCb3dsZXIKLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55Ci0gKiBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkCi0gKiBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlCi0gKiBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dAotICogbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKLSAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgotICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKLSAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUKLSAqIGZvbGxvd2luZyBjb25kaXRpb25zOgotICoKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi0gKiBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCi0gKiBvZiB0aGUgU29mdHdhcmUuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YKLSAqIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKLSAqIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQQotICogUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UCi0gKiBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCi0gKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCi0gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCi0gKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9sZWRzLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KLQotZXh0ZXJuIHNwaW5sb2NrX3QgZ3Bpb19sb2NrOwotCi0vKiBVcCB0byAxNiBncGlvIGxpbmVzIGFyZSBwb3NzaWJsZS4gKi8KLSNkZWZpbmUgR1BJT19NQVggMTYKLXN0YXRpYyBzdHJ1Y3QgaXhwNHh4Z3Bpb2xlZF9kZXZpY2UgewotCXN0cnVjdCBsZWRfY2xhc3NkZXYgYW5jZXN0b3I7Ci0JaW50ICAgICAgICAgICAgICAgZmxhZ3M7Ci19IGl4cDR4eGdwaW9sZWRfZGV2aWNlc1tHUElPX01BWF07Ci0KLXZvaWQgaXhwNHh4Z3Bpb2xlZF9icmlnaHRuZXNzX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpwbGVkLAotCQkJCWVudW0gbGVkX2JyaWdodG5lc3MgdmFsdWUpCi17Ci0JY29uc3Qgc3RydWN0IGl4cDR4eGdwaW9sZWRfZGV2aWNlICpjb25zdCBpeHA0eHhfZGV2ID0KLQkJY29udGFpbmVyX29mKHBsZWQsIHN0cnVjdCBpeHA0eHhncGlvbGVkX2RldmljZSwgYW5jZXN0b3IpOwotCWNvbnN0IHUzMiBncGlvX3BpbiA9IGl4cDR4eF9kZXYgLSBpeHA0eHhncGlvbGVkX2RldmljZXM7Ci0KLQlpZiAoZ3Bpb19waW4gPCBHUElPX01BWCAmJiBpeHA0eHhfZGV2LT5hbmNlc3Rvci5uYW1lICE9IDApIHsKLQkJLyogU2V0IG9yIGNsZWFyIHRoZSAnZ3Bpb19waW4nIGJpdCBhY2NvcmRpbmcgdG8gdGhlIHN0eWxlCi0JCSAqIGFuZCB0aGUgcmVxdWlyZWQgc2V0dGluZyAodmFsdWUgPiAwID09IG9uKQotCQkgKi8KLQkJY29uc3QgaW50IGdwaW9fdmFsdWUgPQotCQkJKHZhbHVlID4gMCkgPT0gKGl4cDR4eF9kZXYtPmZsYWdzICE9IElYUDRYWF9HUElPX0xPVykgPwotCQkJCUlYUDRYWF9HUElPX0hJR0ggOiBJWFA0WFhfR1BJT19MT1c7Ci0KLQkJewotCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2xvY2ssIGZsYWdzKTsKLQkJCWdwaW9fbGluZV9zZXQoZ3Bpb19waW4sIGdwaW9fdmFsdWUpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCBmbGFncyk7Ci0JCX0KLQl9Ci19Ci0KLS8qIExFRHMgYXJlIGRlc2NyaWJlZCBpbiByZXNvdXJjZXMsIHRoZSBmb2xsb3dpbmcgaXRlcmF0ZXMgb3ZlciB0aGUgdmFsaWQKLSAqIExFRCByZXNvdXJjZXMuCi0gKi8KLSNkZWZpbmUgZm9yX2FsbF9sZWRzKGksIHBkZXYpIFwKLQlmb3IgKGk9MDsgaTxwZGV2LT5udW1fcmVzb3VyY2VzOyArK2kpIFwKLQkJaWYgKHBkZXYtPnJlc291cmNlW2ldLnN0YXJ0IDwgR1BJT19NQVggJiYgXAotCQkJcGRldi0+cmVzb3VyY2VbaV0ubmFtZSAhPSAwKQotCi0vKiBUaGUgZm9sbG93aW5nIGFwcGxpZXMgJ29wZXJhdGlvbicgdG8gZWFjaCBMRUQgZnJvbSB0aGUgZ2l2ZW4gcGxhdGZvcm0sCi0gKiB0aGUgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgMCB0byBhbGxvdyB0YWlsIGNhbGwgZWxpbWluYXRpb24uCi0gKi8KLXN0YXRpYyBpbnQgYXBwbHlfdG9fYWxsX2xlZHMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQl2b2lkICgqb3BlcmF0aW9uKShzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpwbGVkKSkKLXsKLQlpbnQgaTsKLQotCWZvcl9hbGxfbGVkcyhpLCBwZGV2KQotCQlvcGVyYXRpb24oJml4cDR4eGdwaW9sZWRfZGV2aWNlc1twZGV2LT5yZXNvdXJjZVtpXS5zdGFydF0uYW5jZXN0b3IpOwotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IGl4cDR4eGdwaW9sZWRfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCQkJCXBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlyZXR1cm4gYXBwbHlfdG9fYWxsX2xlZHMocGRldiwgbGVkX2NsYXNzZGV2X3N1c3BlbmQpOwotfQotCi1zdGF0aWMgaW50IGl4cDR4eGdwaW9sZWRfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIGFwcGx5X3RvX2FsbF9sZWRzKHBkZXYsIGxlZF9jbGFzc2Rldl9yZXN1bWUpOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGl4cDR4eGdwaW9sZWRfcmVtb3ZlX29uZV9sZWQoc3RydWN0IGxlZF9jbGFzc2RldiAqcGxlZCkKLXsKLQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcihwbGVkKTsKLQlwbGVkLT5uYW1lID0gMDsKLX0KLQotc3RhdGljIGludCBpeHA0eHhncGlvbGVkX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiBhcHBseV90b19hbGxfbGVkcyhwZGV2LCBpeHA0eHhncGlvbGVkX3JlbW92ZV9vbmVfbGVkKTsKLX0KLQotc3RhdGljIGludCBpeHA0eHhncGlvbGVkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JLyogVGhlIGJvYXJkIGxldmVsIGhhcyB0byB0ZWxsIHRoZSBkcml2ZXIgd2hlcmUgdGhlCi0JICogTEVEcyBhcmUgY29ubmVjdGVkIC0gdGhlcmUgaXMgbm8gd2F5IHRvIGZpbmQgb3V0Ci0JICogZWxlY3RyaWNhbGx5LiAgSXQgbXVzdCBhbHNvIHNheSB3aGV0aGVyIHRoZSBHUElPCi0JICogbGluZXMgYXJlIGFjdGl2ZSBoaWdoIG9yIGFjdGl2ZSBsb3cuCi0JICoKLQkgKiBUbyBkbyB0aGlzIHJlYWQgdGhlIG51bV9yZXNvdXJjZXMgKHRoZSBudW1iZXIgb2YKLQkgKiBMRURzKSBhbmQgdGhlIHN0cnVjdCByZXNvdXJjZSAodGhlIGRhdGEgZm9yIGVhY2gKLQkgKiBMRUQpLiAgVGhlIG5hbWUgY29tZXMgZnJvbSB0aGUgcmVzb3VyY2UsIGFuZCBpdAotCSAqIGlzbid0IGNvcGllZC4KLQkgKi8KLQlpbnQgaTsKLQotCWZvcl9hbGxfbGVkcyhpLCBwZGV2KSB7Ci0JCWNvbnN0IHU4IGdwaW9fcGluID0gcGRldi0+cmVzb3VyY2VbaV0uc3RhcnQ7Ci0JCWludCAgICAgIHJjOwotCi0JCWlmIChpeHA0eHhncGlvbGVkX2RldmljZXNbZ3Bpb19waW5dLmFuY2VzdG9yLm5hbWUgPT0gMCkgewotCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOwotCQkJZ3Bpb19saW5lX2NvbmZpZyhncGlvX3BpbiwgSVhQNFhYX0dQSU9fT1VUKTsKLQkJCS8qIFRoZSBjb25maWcgY2FuLCBhcHBhcmVudGx5LCByZXNldCB0aGUgc3RhdGUsCi0JCQkgKiBJIHN1c3BlY3QgdGhlIGdwaW8gbGluZSBtYXkgYmUgYW4gaW5wdXQgYW5kCi0JCQkgKiB0aGUgY29uZmlnIG1heSBjYXVzZSB0aGUgbGluZSB0byBiZSBsYXRjaGVkLAotCQkJICogc28gdGhlIHNldHRpbmcgZGVwZW5kcyBvbiBob3cgdGhlIExFRCBpcwotCQkJICogY29ubmVjdGVkIHRvIHRoZSBsaW5lICh3aGljaCBhZmZlY3RzIGhvdyBpdAotCQkJICogZmxvYXRzIGlmIG5vdCBkcml2ZW4pLgotCQkJICovCi0JCQlncGlvX2xpbmVfc2V0KGdwaW9fcGluLCBJWFA0WFhfR1BJT19ISUdIKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOwotCi0JCQlpeHA0eHhncGlvbGVkX2RldmljZXNbZ3Bpb19waW5dLmZsYWdzID0KLQkJCQlwZGV2LT5yZXNvdXJjZVtpXS5mbGFncyAmIElPUkVTT1VSQ0VfQklUUzsKLQotCQkJaXhwNHh4Z3Bpb2xlZF9kZXZpY2VzW2dwaW9fcGluXS5hbmNlc3Rvci5uYW1lID0KLQkJCQlwZGV2LT5yZXNvdXJjZVtpXS5uYW1lOwotCi0JCQkvKiBUaGlzIGlzIGhvdyBhIGJvYXJkIG1hbnVmYWN0dXJlciBtYWtlcyB0aGUgTEVECi0JCQkgKiBjb21lIG9uIG9uIHJlc2V0IC0gdGhlIEdQSU8gbGluZSB3aWxsIGJlIGhpZ2gsIHNvCi0JCQkgKiBtYWtlIHRoZSBMRUQgbGlnaHQgd2hlbiB0aGUgbGluZSBpcyBsb3cuLi4KLQkJCSAqLwotCQkJaWYgKGl4cDR4eGdwaW9sZWRfZGV2aWNlc1tncGlvX3Bpbl0uZmxhZ3MgIT0gSVhQNFhYX0dQSU9fTE9XKQotCQkJCWl4cDR4eGdwaW9sZWRfZGV2aWNlc1tncGlvX3Bpbl0uYW5jZXN0b3IuYnJpZ2h0bmVzcyA9IDEwMDsKLQkJCWVsc2UKLQkJCQlpeHA0eHhncGlvbGVkX2RldmljZXNbZ3Bpb19waW5dLmFuY2VzdG9yLmJyaWdodG5lc3MgPSAwOwotCi0JCQlpeHA0eHhncGlvbGVkX2RldmljZXNbZ3Bpb19waW5dLmFuY2VzdG9yLmZsYWdzID0gMDsKLQotCQkJaXhwNHh4Z3Bpb2xlZF9kZXZpY2VzW2dwaW9fcGluXS5hbmNlc3Rvci5icmlnaHRuZXNzX3NldCA9Ci0JCQkJaXhwNHh4Z3Bpb2xlZF9icmlnaHRuZXNzX3NldDsKLQotCQkJaXhwNHh4Z3Bpb2xlZF9kZXZpY2VzW2dwaW9fcGluXS5hbmNlc3Rvci5kZWZhdWx0X3RyaWdnZXIgPSAwOwotCQl9Ci0KLQkJcmMgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnBkZXYtPmRldiwKLQkJCQkmaXhwNHh4Z3Bpb2xlZF9kZXZpY2VzW2dwaW9fcGluXS5hbmNlc3Rvcik7Ci0JCWlmIChyYyA8IDApIHsKLQkJCWl4cDR4eGdwaW9sZWRfZGV2aWNlc1tncGlvX3Bpbl0uYW5jZXN0b3IubmFtZSA9IDA7Ci0JCQlpeHA0eHhncGlvbGVkX3JlbW92ZShwZGV2KTsKLQkJCXJldHVybiByYzsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpeHA0eHhncGlvbGVkX2RyaXZlciA9IHsKLQkucHJvYmUgICA9IGl4cDR4eGdwaW9sZWRfcHJvYmUsCi0JLnJlbW92ZSAgPSBpeHA0eHhncGlvbGVkX3JlbW92ZSwKLSNpZmRlZiBDT05GSUdfUE0KLQkuc3VzcGVuZCA9IGl4cDR4eGdwaW9sZWRfc3VzcGVuZCwKLQkucmVzdW1lICA9IGl4cDR4eGdwaW9sZWRfcmVzdW1lLAotI2VuZGlmCi0JLmRyaXZlciAgPSB7Ci0JCS5uYW1lID0gIklYUDRYWC1HUElPLUxFRCIsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGl4cDR4eGdwaW9sZWRfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJml4cDR4eGdwaW9sZWRfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGl4cDR4eGdwaW9sZWRfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZpeHA0eHhncGlvbGVkX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KGl4cDR4eGdwaW9sZWRfaW5pdCk7Ci1tb2R1bGVfZXhpdChpeHA0eHhncGlvbGVkX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJKb2huIEJvd2xlciA8amJvd2xlckBhY20ub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJJWFA0WFggR1BJTyBMRUQgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiRHVhbCBNSVQvR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1sb2NvbW8uYyBiL2RyaXZlcnMvbGVkcy9sZWRzLWxvY29tby5jCmluZGV4IDIyMDczMzUuLjcyOTVmN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLWxvY29tby5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLWxvY29tby5jCkBAIC00MywxMyArNDMsMTMgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgbG9jb21vX2xlZDAgPSB7Ci0JLm5hbWUJCQk9ICJsb2NvbW86YW1iZXIiLAorCS5uYW1lCQkJPSAibG9jb21vOmFtYmVyOmNoYXJnZSIsCiAJLmRlZmF1bHRfdHJpZ2dlcgk9ICJzaGFycHNsLWNoYXJnZSIsCiAJLmJyaWdodG5lc3Nfc2V0CQk9IGxvY29tb2xlZF9icmlnaHRuZXNzX3NldDAsCiB9OwogCiBzdGF0aWMgc3RydWN0IGxlZF9jbGFzc2RldiBsb2NvbW9fbGVkMSA9IHsKLQkubmFtZQkJCT0gImxvY29tbzpncmVlbiIsCisJLm5hbWUJCQk9ICJsb2NvbW86Z3JlZW46bWFpbCIsCiAJLmRlZmF1bHRfdHJpZ2dlcgk9ICJuYW5kLWRpc2siLAogCS5icmlnaHRuZXNzX3NldAkJPSBsb2NvbW9sZWRfYnJpZ2h0bmVzc19zZXQxLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLW5ldDQ4eHguYyBiL2RyaXZlcnMvbGVkcy9sZWRzLW5ldDQ4eHguYwppbmRleCA0NWJhM2Q0Li4wNTQzNjA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1uZXQ0OHh4LmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtbmV0NDh4eC5jCkBAIC0zMSw3ICszMSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbGVkX2NsYXNzZGV2IG5ldDQ4eHhfZXJyb3JfbGVkID0gewotCS5uYW1lCQk9ICJuZXQ0OHh4OmVycm9yIiwKKwkubmFtZQkJPSAibmV0NDh4eDo6ZXJyb3IiLAogCS5icmlnaHRuZXNzX3NldAk9IG5ldDQ4eHhfZXJyb3JfbGVkX3NldCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLXNwaXR6LmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1zcGl0ei5jCmluZGV4IDEyNmQwOWMuLjkzZTEwMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLXNwaXR6LmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtc3BpdHouYwpAQCAtMzgsMTMgKzM4LDEzIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbGVkX2NsYXNzZGV2IHNwaXR6X2FtYmVyX2xlZCA9IHsKLQkubmFtZQkJCT0gInNwaXR6OmFtYmVyIiwKKwkubmFtZQkJCT0gInNwaXR6OmFtYmVyOmNoYXJnZSIsCiAJLmRlZmF1bHRfdHJpZ2dlcgk9ICJzaGFycHNsLWNoYXJnZSIsCiAJLmJyaWdodG5lc3Nfc2V0CQk9IHNwaXR6bGVkX2FtYmVyX3NldCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbGVkX2NsYXNzZGV2IHNwaXR6X2dyZWVuX2xlZCA9IHsKLQkubmFtZQkJCT0gInNwaXR6OmdyZWVuIiwKKwkubmFtZQkJCT0gInNwaXR6OmdyZWVuOmhkZGFjdGl2aXR5IiwKIAkuZGVmYXVsdF90cmlnZ2VyCT0gImlkZS1kaXNrIiwKIAkuYnJpZ2h0bmVzc19zZXQJCT0gc3BpdHpsZWRfZ3JlZW5fc2V0LAogfTsKQEAgLTcyLDggKzcyLDEwIEBACiB7CiAJaW50IHJldDsKIAotCWlmIChtYWNoaW5lX2lzX2FraXRhKCkpCisJaWYgKG1hY2hpbmVfaXNfYWtpdGEoKSkgeworCQlzcGl0el9ncmVlbl9sZWQubmFtZSA9ICJzcGl0ejpncmVlbjptYWlsIjsKIAkJc3BpdHpfZ3JlZW5fbGVkLmRlZmF1bHRfdHJpZ2dlciA9ICJuYW5kLWRpc2siOworCX0KIAogCXJldCA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmcGRldi0+ZGV2LCAmc3BpdHpfYW1iZXJfbGVkKTsKIAlpZiAocmV0IDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLXRvc2EuYyBiL2RyaXZlcnMvbGVkcy9sZWRzLXRvc2EuYwppbmRleCBmYjI0MTZhLi45ZTBhMTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy10b3NhLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtdG9zYS5jCkBAIC00NSwxMyArNDUsMTMgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgdG9zYV9hbWJlcl9sZWQgPSB7Ci0JLm5hbWUJCQk9ICJ0b3NhOmFtYmVyIiwKKwkubmFtZQkJCT0gInRvc2E6YW1iZXI6Y2hhcmdlIiwKIAkuZGVmYXVsdF90cmlnZ2VyCT0gInNoYXJwc2wtY2hhcmdlIiwKIAkuYnJpZ2h0bmVzc19zZXQJCT0gdG9zYWxlZF9hbWJlcl9zZXQsCiB9OwogCiBzdGF0aWMgc3RydWN0IGxlZF9jbGFzc2RldiB0b3NhX2dyZWVuX2xlZCA9IHsKLQkubmFtZQkJCT0gInRvc2E6Z3JlZW4iLAorCS5uYW1lCQkJPSAidG9zYTpncmVlbjptYWlsIiwKIAkuZGVmYXVsdF90cmlnZ2VyCT0gIm5hbmQtZGlzayIsCiAJLmJyaWdodG5lc3Nfc2V0CQk9IHRvc2FsZWRfZ3JlZW5fc2V0LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLXdyYXAuYyBiL2RyaXZlcnMvbGVkcy9sZWRzLXdyYXAuYwppbmRleCAyN2ZiMmQ4Li43YWM2MWE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy13cmFwLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtd3JhcC5jCkBAIC0xOSwxMSArMTksMjEgQEAKICNpbmNsdWRlIDxsaW51eC9zY3gyMDBfZ3Bpby5oPgogCiAjZGVmaW5lIERSVk5BTUUgIndyYXAtbGVkIgorI2RlZmluZSBXUkFQX1BPV0VSX0xFRF9HUElPCTIKICNkZWZpbmUgV1JBUF9FUlJPUl9MRURfR1BJTwkzCi0jZGVmaW5lCVdSQVBfRVhUUkFfTEVEX0dQSU8JMTgKKyNkZWZpbmUgV1JBUF9FWFRSQV9MRURfR1BJTwkxOAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAorc3RhdGljIHZvaWQgd3JhcF9wb3dlcl9sZWRfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAorCQllbnVtIGxlZF9icmlnaHRuZXNzIHZhbHVlKQoreworCWlmICh2YWx1ZSkKKwkJc2N4MjAwX2dwaW9fc2V0X2xvdyhXUkFQX1BPV0VSX0xFRF9HUElPKTsKKwllbHNlCisJCXNjeDIwMF9ncGlvX3NldF9oaWdoKFdSQVBfUE9XRVJfTEVEX0dQSU8pOworfQorCiBzdGF0aWMgdm9pZCB3cmFwX2Vycm9yX2xlZF9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCiAJCWVudW0gbGVkX2JyaWdodG5lc3MgdmFsdWUpCiB7CkBAIC00MiwxMyArNTIsMTggQEAKIAkJc2N4MjAwX2dwaW9fc2V0X2hpZ2goV1JBUF9FWFRSQV9MRURfR1BJTyk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgbGVkX2NsYXNzZGV2IHdyYXBfcG93ZXJfbGVkID0geworCS5uYW1lCQk9ICJ3cmFwOjpwb3dlciIsCisJLmJyaWdodG5lc3Nfc2V0CT0gd3JhcF9wb3dlcl9sZWRfc2V0LAorfTsKKwogc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgd3JhcF9lcnJvcl9sZWQgPSB7Ci0JLm5hbWUJCT0gIndyYXA6ZXJyb3IiLAorCS5uYW1lCQk9ICJ3cmFwOjplcnJvciIsCiAJLmJyaWdodG5lc3Nfc2V0CT0gd3JhcF9lcnJvcl9sZWRfc2V0LAogfTsKIAogc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgd3JhcF9leHRyYV9sZWQgPSB7Ci0JLm5hbWUgICAgICAgICAgID0gIndyYXA6ZXh0cmEiLAorCS5uYW1lICAgICAgICAgICA9ICJ3cmFwOjpleHRyYSIsCiAJLmJyaWdodG5lc3Nfc2V0ID0gd3JhcF9leHRyYV9sZWRfc2V0LAogfTsKIApAQCAtNTYsNiArNzEsNyBAQAogc3RhdGljIGludCB3cmFwX2xlZF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKIAkJcG1fbWVzc2FnZV90IHN0YXRlKQogeworCWxlZF9jbGFzc2Rldl9zdXNwZW5kKCZ3cmFwX3Bvd2VyX2xlZCk7CiAJbGVkX2NsYXNzZGV2X3N1c3BlbmQoJndyYXBfZXJyb3JfbGVkKTsKIAlsZWRfY2xhc3NkZXZfc3VzcGVuZCgmd3JhcF9leHRyYV9sZWQpOwogCXJldHVybiAwOwpAQCAtNjMsNiArNzksNyBAQAogCiBzdGF0aWMgaW50IHdyYXBfbGVkX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CisJbGVkX2NsYXNzZGV2X3Jlc3VtZSgmd3JhcF9wb3dlcl9sZWQpOwogCWxlZF9jbGFzc2Rldl9yZXN1bWUoJndyYXBfZXJyb3JfbGVkKTsKIAlsZWRfY2xhc3NkZXZfcmVzdW1lKCZ3cmFwX2V4dHJhX2xlZCk7CiAJcmV0dXJuIDA7CkBAIC03NiwxNyArOTMsMzEgQEAKIHsKIAlpbnQgcmV0OwogCisJcmV0ID0gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZ3cmFwX3Bvd2VyX2xlZCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKIAlyZXQgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJndyYXBfZXJyb3JfbGVkKTsKLQlpZiAocmV0ID09IDApIHsKLQkJcmV0ID0gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZ3cmFwX2V4dHJhX2xlZCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJndyYXBfZXJyb3JfbGVkKTsKLQl9CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyMTsKKworCXJldCA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmcGRldi0+ZGV2LCAmd3JhcF9leHRyYV9sZWQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjI7CisKKwlyZXR1cm4gcmV0OworCitlcnIyOgorCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZ3cmFwX2Vycm9yX2xlZCk7CitlcnIxOgorCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZ3cmFwX3Bvd2VyX2xlZCk7CisKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHdyYXBfbGVkX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZ3cmFwX3Bvd2VyX2xlZCk7CiAJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJndyYXBfZXJyb3JfbGVkKTsKIAlsZWRfY2xhc3NkZXZfdW5yZWdpc3Rlcigmd3JhcF9leHRyYV9sZWQpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHRyaWctdGltZXIuYyBiL2RyaXZlcnMvbGVkcy9sZWR0cmlnLXRpbWVyLmMKaW5kZXggZWQ5ZmYwMi4uODJjNTVkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHRyaWctdGltZXIuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkdHJpZy10aW1lci5jCkBAIC03Nyw4ICs3NywyMSBAQAogCQljb3VudCsrOwogCiAJaWYgKGNvdW50ID09IHNpemUpIHsKLQkJdGltZXJfZGF0YS0+ZGVsYXlfb24gPSBzdGF0ZTsKLQkJbW9kX3RpbWVyKCZ0aW1lcl9kYXRhLT50aW1lciwgamlmZmllcyArIDEpOworCQlpZiAodGltZXJfZGF0YS0+ZGVsYXlfb24gIT0gc3RhdGUpIHsKKwkJCS8qIHRoZSBuZXcgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBwcmV2aW91cyAqLworCQkJdGltZXJfZGF0YS0+ZGVsYXlfb24gPSBzdGF0ZTsKKworCQkJLyogZGVhY3RpdmF0ZSBwcmV2aW91cyBzZXR0aW5ncyAqLworCQkJZGVsX3RpbWVyX3N5bmMoJnRpbWVyX2RhdGEtPnRpbWVyKTsKKworCQkJLyogdHJ5IHRvIGFjdGl2YXRlIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiwgaWYgYW55ICovCisJCQlpZiAoIWxlZF9jZGV2LT5ibGlua19zZXQgfHwKKwkJCSAgICBsZWRfY2Rldi0+Ymxpbmtfc2V0KGxlZF9jZGV2LAorCQkJCSZ0aW1lcl9kYXRhLT5kZWxheV9vbiwgJnRpbWVyX2RhdGEtPmRlbGF5X29mZikpIHsKKwkJCQkvKiBubyBoYXJkd2FyZSBhY2NlbGVyYXRpb24sIGJsaW5rIHZpYSB0aW1lciAqLworCQkJCW1vZF90aW1lcigmdGltZXJfZGF0YS0+dGltZXIsIGppZmZpZXMgKyAxKTsKKwkJCX0KKwkJfQogCQlyZXQgPSBjb3VudDsKIAl9CiAKQEAgLTExMCw4ICsxMjMsMjEgQEAKIAkJY291bnQrKzsKIAogCWlmIChjb3VudCA9PSBzaXplKSB7Ci0JCXRpbWVyX2RhdGEtPmRlbGF5X29mZiA9IHN0YXRlOwotCQltb2RfdGltZXIoJnRpbWVyX2RhdGEtPnRpbWVyLCBqaWZmaWVzICsgMSk7CisJCWlmICh0aW1lcl9kYXRhLT5kZWxheV9vZmYgIT0gc3RhdGUpIHsKKwkJCS8qIHRoZSBuZXcgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBwcmV2aW91cyAqLworCQkJdGltZXJfZGF0YS0+ZGVsYXlfb2ZmID0gc3RhdGU7CisKKwkJCS8qIGRlYWN0aXZhdGUgcHJldmlvdXMgc2V0dGluZ3MgKi8KKwkJCWRlbF90aW1lcl9zeW5jKCZ0aW1lcl9kYXRhLT50aW1lcik7CisKKwkJCS8qIHRyeSB0byBhY3RpdmF0ZSBoYXJkd2FyZSBhY2NlbGVyYXRpb24sIGlmIGFueSAqLworCQkJaWYgKCFsZWRfY2Rldi0+Ymxpbmtfc2V0IHx8CisJCQkgICAgbGVkX2NkZXYtPmJsaW5rX3NldChsZWRfY2RldiwKKwkJCQkmdGltZXJfZGF0YS0+ZGVsYXlfb24sICZ0aW1lcl9kYXRhLT5kZWxheV9vZmYpKSB7CisJCQkJLyogbm8gaGFyZHdhcmUgYWNjZWxlcmF0aW9uLCBibGluayB2aWEgdGltZXIgKi8KKwkJCQltb2RfdGltZXIoJnRpbWVyX2RhdGEtPnRpbWVyLCBqaWZmaWVzICsgMSk7CisJCQl9CisJCX0KIAkJcmV0ID0gY291bnQ7CiAJfQogCkBAIC0xNDMsNiArMTY5LDEzIEBACiAJaWYgKHJjKQogCQlnb3RvIGVycl9vdXRfZGVsYXlvbjsKIAorCS8qIElmIHRoZXJlIGlzIGhhcmR3YXJlIHN1cHBvcnQgZm9yIGJsaW5raW5nLCBzdGFydCBvbmUKKwkgKiB1c2VyIGZyaWVuZGx5IGJsaW5rIHJhdGUgY2hvc2VuIGJ5IHRoZSBkcml2ZXIuCisJICovCisJaWYgKGxlZF9jZGV2LT5ibGlua19zZXQpCisJCWxlZF9jZGV2LT5ibGlua19zZXQobGVkX2NkZXYsCisJCQkmdGltZXJfZGF0YS0+ZGVsYXlfb24sICZ0aW1lcl9kYXRhLT5kZWxheV9vZmYpOworCiAJcmV0dXJuOwogCiBlcnJfb3V0X2RlbGF5b246CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfZGV2aWNlLmMgYi9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfZGV2aWNlLmMKaW5kZXggODRmODVlMi4uMWIyZWMwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZ3Vlc3QvbGd1ZXN0X2RldmljZS5jCisrKyBiL2RyaXZlcnMvbGd1ZXN0L2xndWVzdF9kZXZpY2UuYwpAQCAtNDcsNyArNDcsNyBAQAogLyogU2luY2UgdGhlIHZpcnRpbyBpbmZyYXN0cnVjdHVyZSBoYW5kcyB1cyBhIHBvaW50ZXIgdG8gdGhlIHZpcnRpb19kZXZpY2UgYWxsCiAgKiB0aGUgdGltZSwgaXQgaGVscHMgdG8gaGF2ZSBhIGN1cnQgbWFjcm8gdG8gZ2V0IGEgcG9pbnRlciB0byB0aGUgc3RydWN0CiAgKiBsZ3Vlc3RfZGV2aWNlIGl0J3MgZW5jbG9zZWQgaW4uICAqLwotI2RlZmluZSB0b19sZ2Rldih2ZGV2KSBjb250YWluZXJfb2YodmRldiwgc3RydWN0IGxndWVzdF9kZXZpY2UsIHZkZXYpCisjZGVmaW5lIHRvX2xnZGV2KHZkKSBjb250YWluZXJfb2YodmQsIHN0cnVjdCBsZ3Vlc3RfZGV2aWNlLCB2ZGV2KQogCiAvKkQ6MTMwCiAgKiBEZXZpY2UgY29uZmlndXJhdGlvbnMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3NtdS5jIGIvZHJpdmVycy9tYWNpbnRvc2gvc211LmMKaW5kZXggOGJhNDkzOC4uNzdhZDE5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvc211LmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvc211LmMKQEAgLTg1LDYgKzg1LDcgQEAKIAl1MzIJCQljbWRfYnVmX2FiczsJLyogY29tbWFuZCBidWZmZXIgYWJzb2x1dGUgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWNtZF9saXN0OwogCXN0cnVjdCBzbXVfY21kCQkqY21kX2N1cjsJLyogcGVuZGluZyBjb21tYW5kICovCisJaW50CQkJYnJva2VuX25hcDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWNtZF9pMmNfbGlzdDsKIAlzdHJ1Y3Qgc211X2kyY19jbWQJKmNtZF9pMmNfY3VyOwkvKiBwZW5kaW5nIGkyYyBjb21tYW5kICovCiAJc3RydWN0IHRpbWVyX2xpc3QJaTJjX3RpbWVyOwpAQCAtMTM1LDYgKzEzNiwxOSBAQAogCWZlbmQgPSBmYWRkciArIHNtdS0+Y21kX2J1Zi0+bGVuZ3RoICsgMjsKIAlmbHVzaF9pbnZhbF9kY2FjaGVfcmFuZ2UoZmFkZHIsIGZlbmQpOwogCisKKwkvKiBXZSBhbHNvIGRpc2FibGUgTkFQIG1vZGUgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY29tbWFuZAorCSAqIG9uIFUzIGJhc2VkIG1hY2hpbmVzLgorCSAqIFRoaXMgaXMgc2xpZ2h0bHkgcmFjeSBhcyBpdCBjYW4gYmUgd3JpdHRlbiBiYWNrIHRvIDEgYnkgYSBzeXNjdGwKKwkgKiBidXQgdGhhdCBuZXZlciBoYXBwZW5zIGluIHByYWN0aWNlLiBUaGVyZSBzZWVtIHRvIGJlIGFuIGlzc3VlIHdpdGgKKwkgKiBVMyBiYXNlZCBtYWNoaW5lcyBzdWNoIGFzIHRoZSBpTWFjIEc1IHdoZXJlIG5hcHBpbmcgZm9yIHRoZQorCSAqIHdob2xlIGR1cmF0aW9uIG9mIHRoZSBjb21tYW5kIHByZXZlbnRzIHRoZSBTTVUgZnJvbSBmZXRjaGluZyBpdAorCSAqIGZyb20gbWVtb3J5LiBUaGlzIG1pZ2h0IGJlIHJlbGF0ZWQgdG8gdGhlIHN0cmFuZ2UgaTJjIGJhc2VkCisJICogbWVjaGFuaXNtIHRoZSBTTVUgdXNlcyB0byBhY2Nlc3MgbWVtb3J5LgorCSAqLworCWlmIChzbXUtPmJyb2tlbl9uYXApCisJCXBvd2Vyc2F2ZV9uYXAgPSAwOworCiAJLyogVGhpcyBpc24ndCBleGFjdGx5IGEgRE1BIG1hcHBpbmcgaGVyZSwgSSBzdXNwZWN0CiAJICogdGhlIFNNVSBpcyBhY3R1YWxseSBjb21tdW5pY2F0aW5nIHdpdGggdXMgdmlhIGkyYyB0byB0aGUKIAkgKiBub3J0aGJyaWRnZSBvciB0aGUgQ1BVIHRvIGFjY2VzcyBSQU0uCkBAIC0yMTEsNiArMjI1LDEwIEBACiAJbWlzYyA9IGNtZC0+bWlzYzsKIAltYigpOwogCWNtZC0+c3RhdHVzID0gcmM7CisKKwkvKiBSZS1lbmFibGUgTkFQIG1vZGUgKi8KKwlpZiAoc211LT5icm9rZW5fbmFwKQorCQlwb3dlcnNhdmVfbmFwID0gMTsKICBiYWlsOgogCS8qIFN0YXJ0IG5leHQgY29tbWFuZCBpZiBhbnkgKi8KIAlzbXVfc3RhcnRfY21kKCk7CkBAIC00NjEsNyArNDc5LDcgQEAKICAgICAgICAgaWYgKG5wID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiU01VIGRyaXZlciAlcyAlc1xuIiwgVkVSU0lPTiwgQVVUSE9SKTsKKwlwcmludGsoS0VSTl9JTkZPICJTTVU6IERyaXZlciAlcyAlc1xuIiwgVkVSU0lPTiwgQVVUSE9SKTsKIAogCWlmIChzbXVfY21kYnVmX2FicyA9PSAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU01VOiBDb21tYW5kIGJ1ZmZlciBub3QgYWxsb2NhdGVkICFcbiIpOwpAQCAtNTMzLDYgKzU1MSwxMSBAQAogCQlnb3RvIGZhaWw7CiAJfQogCisJLyogVTMgaGFzIGFuIGlzc3VlIHdpdGggTkFQIG1vZGUgd2hlbiBpc3N1aW5nIFNNVSBjb21tYW5kcyAqLworCXNtdS0+YnJva2VuX25hcCA9IHBtYWNfZ2V0X3VuaW5vcnRoX3ZhcmlhbnQoKSA8IDQ7CisJaWYgKHNtdS0+YnJva2VuX25hcCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiU01VOiB1c2luZyBOQVAgbW9kZSB3b3JrYXJvdW5kXG4iKTsKKwogCXN5c19jdHJsZXIgPSBTWVNfQ1RSTEVSX1NNVTsKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9LY29uZmlnIGIvZHJpdmVycy9tZC9LY29uZmlnCmluZGV4IDNmYTdjNzcuLjYxMGFmOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvS2NvbmZpZworKysgYi9kcml2ZXJzL21kL0tjb25maWcKQEAgLTIwNCw3ICsyMDQsNyBAQAogCiBjb25maWcgRE1fREVCVUcKIAlib29sZWFuICJEZXZpY2UgbWFwcGVyIGRlYnVnZ2luZyBzdXBwb3J0IgotCWRlcGVuZHMgb24gQkxLX0RFVl9ETSAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIEJMS19ERVZfRE0KIAktLS1oZWxwLS0tCiAJICBFbmFibGUgdGhpcyBmb3IgbWVzc2FnZXMgdGhhdCBtYXkgaGVscCBkZWJ1ZyBkZXZpY2UtbWFwcGVyIHByb2JsZW1zLgogCkBAIC0yMTIsNyArMjEyLDcgQEAKIAogY29uZmlnIERNX0NSWVBUCiAJdHJpc3RhdGUgIkNyeXB0IHRhcmdldCBzdXBwb3J0IgotCWRlcGVuZHMgb24gQkxLX0RFVl9ETSAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIEJMS19ERVZfRE0KIAlzZWxlY3QgQ1JZUFRPCiAJc2VsZWN0IENSWVBUT19DQkMKIAktLS1oZWxwLS0tCkBAIC0yMzAsMzQgKzIzMCwzNCBAQAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAogY29uZmlnIERNX1NOQVBTSE9UCi0gICAgICAgdHJpc3RhdGUgIlNuYXBzaG90IHRhcmdldCAoRVhQRVJJTUVOVEFMKSIKLSAgICAgICBkZXBlbmRzIG9uIEJMS19ERVZfRE0gJiYgRVhQRVJJTUVOVEFMCisgICAgICAgdHJpc3RhdGUgIlNuYXBzaG90IHRhcmdldCIKKyAgICAgICBkZXBlbmRzIG9uIEJMS19ERVZfRE0KICAgICAgICAtLS1oZWxwLS0tCiAgICAgICAgICBBbGxvdyB2b2x1bWUgbWFuYWdlcnMgdG8gdGFrZSB3cml0YWJsZSBzbmFwc2hvdHMgb2YgYSBkZXZpY2UuCiAKIGNvbmZpZyBETV9NSVJST1IKLSAgICAgICB0cmlzdGF0ZSAiTWlycm9yIHRhcmdldCAoRVhQRVJJTUVOVEFMKSIKLSAgICAgICBkZXBlbmRzIG9uIEJMS19ERVZfRE0gJiYgRVhQRVJJTUVOVEFMCisgICAgICAgdHJpc3RhdGUgIk1pcnJvciB0YXJnZXQiCisgICAgICAgZGVwZW5kcyBvbiBCTEtfREVWX0RNCiAgICAgICAgLS0taGVscC0tLQogICAgICAgICAgQWxsb3cgdm9sdW1lIG1hbmFnZXJzIHRvIG1pcnJvciBsb2dpY2FsIHZvbHVtZXMsIGFsc28KICAgICAgICAgIG5lZWRlZCBmb3IgbGl2ZSBkYXRhIG1pZ3JhdGlvbiB0b29scyBzdWNoIGFzICdwdm1vdmUnLgogCiBjb25maWcgRE1fWkVSTwotCXRyaXN0YXRlICJaZXJvIHRhcmdldCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEJMS19ERVZfRE0gJiYgRVhQRVJJTUVOVEFMCisJdHJpc3RhdGUgIlplcm8gdGFyZ2V0IgorCWRlcGVuZHMgb24gQkxLX0RFVl9ETQogCS0tLWhlbHAtLS0KIAkgIEEgdGFyZ2V0IHRoYXQgZGlzY2FyZHMgd3JpdGVzLCBhbmQgcmV0dXJucyBhbGwgemVyb2VzIGZvcgogCSAgcmVhZHMuICBVc2VmdWwgaW4gc29tZSByZWNvdmVyeSBzaXR1YXRpb25zLgogCiBjb25maWcgRE1fTVVMVElQQVRICi0JdHJpc3RhdGUgIk11bHRpcGF0aCB0YXJnZXQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBCTEtfREVWX0RNICYmIEVYUEVSSU1FTlRBTAorCXRyaXN0YXRlICJNdWx0aXBhdGggdGFyZ2V0IgorCWRlcGVuZHMgb24gQkxLX0RFVl9ETQogCS0tLWhlbHAtLS0KIAkgIEFsbG93IHZvbHVtZSBtYW5hZ2VycyB0byBzdXBwb3J0IG11bHRpcGF0aCBoYXJkd2FyZS4KIAogY29uZmlnIERNX01VTFRJUEFUSF9FTUMKLQl0cmlzdGF0ZSAiRU1DIENYL0FYIG11bHRpcGF0aCBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gRE1fTVVMVElQQVRIICYmIEJMS19ERVZfRE0gJiYgRVhQRVJJTUVOVEFMCisJdHJpc3RhdGUgIkVNQyBDWC9BWCBtdWx0aXBhdGggc3VwcG9ydCIKKwlkZXBlbmRzIG9uIERNX01VTFRJUEFUSCAmJiBCTEtfREVWX0RNCiAJLS0taGVscC0tLQogCSAgTXVsdGlwYXRoIHN1cHBvcnQgZm9yIEVNQyBDWC9BWCBzZXJpZXMgaGFyZHdhcmUuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tY3J5cHQuYyBiL2RyaXZlcnMvbWQvZG0tY3J5cHQuYwppbmRleCA2YjY2ZWU0Li5iMDRmOThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWNyeXB0LmMKKysrIGIvZHJpdmVycy9tZC9kbS1jcnlwdC5jCkBAIC0xLDExICsxLDEyIEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDAzIENocmlzdG9waGUgU2FvdXQgPGNocmlzdG9waGVAc2FvdXQuZGU+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQgQ2xlbWVucyBGcnVod2lydGggPGNsZW1lbnNAZW5kb3JwaGluLm9yZz4KLSAqIENvcHlyaWdodCAoQykgMjAwNiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0yOCwyMCArMjksMTAgQEAKICNkZWZpbmUgTUVTR19TVFIoeCkgeCwgc2l6ZW9mKHgpCiAKIC8qCi0gKiBwZXIgYmlvIHByaXZhdGUgZGF0YQotICovCi1zdHJ1Y3QgZG1fY3J5cHRfaW8gewotCXN0cnVjdCBkbV90YXJnZXQgKnRhcmdldDsKLQlzdHJ1Y3QgYmlvICpiYXNlX2JpbzsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKLQlhdG9taWNfdCBwZW5kaW5nOwotCWludCBlcnJvcjsKLX07Ci0KLS8qCiAgKiBjb250ZXh0IGhvbGRpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBtdWx0aS1wYXJ0IGNvbnZlcnNpb24KICAqLwogc3RydWN0IGNvbnZlcnRfY29udGV4dCB7CisJc3RydWN0IGNvbXBsZXRpb24gcmVzdGFydDsKIAlzdHJ1Y3QgYmlvICpiaW9faW47CiAJc3RydWN0IGJpbyAqYmlvX291dDsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0X2luOwpAQCAtNDksNyArNDAsMjcgQEAKIAl1bnNpZ25lZCBpbnQgaWR4X2luOwogCXVuc2lnbmVkIGludCBpZHhfb3V0OwogCXNlY3Rvcl90IHNlY3RvcjsKLQlpbnQgd3JpdGU7CisJYXRvbWljX3QgcGVuZGluZzsKK307CisKKy8qCisgKiBwZXIgYmlvIHByaXZhdGUgZGF0YQorICovCitzdHJ1Y3QgZG1fY3J5cHRfaW8geworCXN0cnVjdCBkbV90YXJnZXQgKnRhcmdldDsKKwlzdHJ1Y3QgYmlvICpiYXNlX2JpbzsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKworCXN0cnVjdCBjb252ZXJ0X2NvbnRleHQgY3R4OworCisJYXRvbWljX3QgcGVuZGluZzsKKwlpbnQgZXJyb3I7CisJc2VjdG9yX3Qgc2VjdG9yOworfTsKKworc3RydWN0IGRtX2NyeXB0X3JlcXVlc3QgeworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ19pbjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dfb3V0OwogfTsKIAogc3RydWN0IGNyeXB0X2NvbmZpZzsKQEAgLTcyLDEwICs4MywxMSBAQAogCXNlY3Rvcl90IHN0YXJ0OwogCiAJLyoKLQkgKiBwb29sIGZvciBwZXIgYmlvIHByaXZhdGUgZGF0YSBhbmQKLQkgKiBmb3IgZW5jcnlwdGlvbiBidWZmZXIgcGFnZXMKKwkgKiBwb29sIGZvciBwZXIgYmlvIHByaXZhdGUgZGF0YSwgY3J5cHRvIHJlcXVlc3RzIGFuZAorCSAqIGVuY3J5cHRpb24gcmVxdWV1c3RzL2J1ZmZlciBwYWdlcwogCSAqLwogCW1lbXBvb2xfdCAqaW9fcG9vbDsKKwltZW1wb29sX3QgKnJlcV9wb29sOwogCW1lbXBvb2xfdCAqcGFnZV9wb29sOwogCXN0cnVjdCBiaW9fc2V0ICpiczsKIApAQCAtOTMsOSArMTA1LDI1IEBACiAJc2VjdG9yX3QgaXZfb2Zmc2V0OwogCXVuc2lnbmVkIGludCBpdl9zaXplOwogCisJLyoKKwkgKiBMYXlvdXQgb2YgZWFjaCBjcnlwdG8gcmVxdWVzdDoKKwkgKgorCSAqICAgc3RydWN0IGFibGtjaXBoZXJfcmVxdWVzdAorCSAqICAgICAgY29udGV4dAorCSAqICAgICAgcGFkZGluZworCSAqICAgc3RydWN0IGRtX2NyeXB0X3JlcXVlc3QKKwkgKiAgICAgIHBhZGRpbmcKKwkgKiAgIElWCisJICoKKwkgKiBUaGUgcGFkZGluZyBpcyBhZGRlZCBzbyB0aGF0IGRtX2NyeXB0X3JlcXVlc3QgYW5kIHRoZSBJViBhcmUKKwkgKiBjb3JyZWN0bHkgYWxpZ25lZC4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgZG1yZXFfc3RhcnQ7CisJc3RydWN0IGFibGtjaXBoZXJfcmVxdWVzdCAqcmVxOworCiAJY2hhciBjaXBoZXJbQ1JZUFRPX01BWF9BTEdfTkFNRV07CiAJY2hhciBjaGFpbm1vZGVbQ1JZUFRPX01BWF9BTEdfTkFNRV07Ci0Jc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbTsKKwlzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKnRmbTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBrZXlfc2l6ZTsKIAl1OCBrZXlbMF07CkBAIC0xMDgsNiArMTM2LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqX2NyeXB0X2lvX3Bvb2w7CiAKIHN0YXRpYyB2b2lkIGNsb25lX2luaXQoc3RydWN0IGRtX2NyeXB0X2lvICosIHN0cnVjdCBiaW8gKik7CitzdGF0aWMgdm9pZCBrY3J5cHRkX3F1ZXVlX2NyeXB0KHN0cnVjdCBkbV9jcnlwdF9pbyAqaW8pOwogCiAvKgogICogRGlmZmVyZW50IElWIGdlbmVyYXRpb24gYWxnb3JpdGhtczoKQEAgLTE4OCw3ICsyMTcsNyBAQAogCQlyZXR1cm4gUFRSX0VSUihlc3Npdl90Zm0pOwogCX0KIAlpZiAoY3J5cHRvX2NpcGhlcl9ibG9ja3NpemUoZXNzaXZfdGZtKSAhPQotCSAgICBjcnlwdG9fYmxrY2lwaGVyX2l2c2l6ZShjYy0+dGZtKSkgeworCSAgICBjcnlwdG9fYWJsa2NpcGhlcl9pdnNpemUoY2MtPnRmbSkpIHsKIAkJdGktPmVycm9yID0gIkJsb2NrIHNpemUgb2YgRVNTSVYgY2lwaGVyIGRvZXMgIgogCQkJICAgICJub3QgbWF0Y2ggSVYgc2l6ZSBvZiBibG9jayBjaXBoZXIiOwogCQljcnlwdG9fZnJlZV9jaXBoZXIoZXNzaXZfdGZtKTsKQEAgLTIyNSw3ICsyNTQsNyBAQAogc3RhdGljIGludCBjcnlwdF9pdl9iZW5iaV9jdHIoc3RydWN0IGNyeXB0X2NvbmZpZyAqY2MsIHN0cnVjdCBkbV90YXJnZXQgKnRpLAogCQkJICAgICAgY29uc3QgY2hhciAqb3B0cykKIHsKLQl1bnNpZ25lZCBpbnQgYnMgPSBjcnlwdG9fYmxrY2lwaGVyX2Jsb2Nrc2l6ZShjYy0+dGZtKTsKKwl1bnNpZ25lZCBicyA9IGNyeXB0b19hYmxrY2lwaGVyX2Jsb2Nrc2l6ZShjYy0+dGZtKTsKIAlpbnQgbG9nID0gaWxvZzIoYnMpOwogCiAJLyogd2UgbmVlZCB0byBjYWxjdWxhdGUgaG93IGZhciB3ZSBtdXN0IHNoaWZ0IHRoZSBzZWN0b3IgY291bnQKQEAgLTI4OSw0MiArMzE4LDEwIEBACiAJLmdlbmVyYXRvciA9IGNyeXB0X2l2X251bGxfZ2VuCiB9OwogCi1zdGF0aWMgaW50Ci1jcnlwdF9jb252ZXJ0X3NjYXR0ZXJsaXN0KHN0cnVjdCBjcnlwdF9jb25maWcgKmNjLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICppbiwgdW5zaWduZWQgaW50IGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdyaXRlLCBzZWN0b3JfdCBzZWN0b3IpCi17Ci0JdTggaXZbY2MtPml2X3NpemVdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKF9fYWxpZ25vZl9fKHU2NCkpKSk7Ci0Jc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2MgPSB7Ci0JCS50Zm0gPSBjYy0+dGZtLAotCQkuaW5mbyA9IGl2LAotCQkuZmxhZ3MgPSBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVAsCi0JfTsKLQlpbnQgcjsKLQotCWlmIChjYy0+aXZfZ2VuX29wcykgewotCQlyID0gY2MtPml2X2dlbl9vcHMtPmdlbmVyYXRvcihjYywgaXYsIHNlY3Rvcik7Ci0JCWlmIChyIDwgMCkKLQkJCXJldHVybiByOwotCi0JCWlmICh3cml0ZSkKLQkJCXIgPSBjcnlwdG9fYmxrY2lwaGVyX2VuY3J5cHRfaXYoJmRlc2MsIG91dCwgaW4sIGxlbmd0aCk7Ci0JCWVsc2UKLQkJCXIgPSBjcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHRfaXYoJmRlc2MsIG91dCwgaW4sIGxlbmd0aCk7Ci0JfSBlbHNlIHsKLQkJaWYgKHdyaXRlKQotCQkJciA9IGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdCgmZGVzYywgb3V0LCBpbiwgbGVuZ3RoKTsKLQkJZWxzZQotCQkJciA9IGNyeXB0b19ibGtjaXBoZXJfZGVjcnlwdCgmZGVzYywgb3V0LCBpbiwgbGVuZ3RoKTsKLQl9Ci0KLQlyZXR1cm4gcjsKLX0KLQogc3RhdGljIHZvaWQgY3J5cHRfY29udmVydF9pbml0KHN0cnVjdCBjcnlwdF9jb25maWcgKmNjLAogCQkJICAgICAgIHN0cnVjdCBjb252ZXJ0X2NvbnRleHQgKmN0eCwKIAkJCSAgICAgICBzdHJ1Y3QgYmlvICpiaW9fb3V0LCBzdHJ1Y3QgYmlvICpiaW9faW4sCi0JCQkgICAgICAgc2VjdG9yX3Qgc2VjdG9yLCBpbnQgd3JpdGUpCisJCQkgICAgICAgc2VjdG9yX3Qgc2VjdG9yKQogewogCWN0eC0+YmlvX2luID0gYmlvX2luOwogCWN0eC0+YmlvX291dCA9IGJpb19vdXQ7CkBAIC0zMzMsNyArMzMwLDc5IEBACiAJY3R4LT5pZHhfaW4gPSBiaW9faW4gPyBiaW9faW4tPmJpX2lkeCA6IDA7CiAJY3R4LT5pZHhfb3V0ID0gYmlvX291dCA/IGJpb19vdXQtPmJpX2lkeCA6IDA7CiAJY3R4LT5zZWN0b3IgPSBzZWN0b3IgKyBjYy0+aXZfb2Zmc2V0OwotCWN0eC0+d3JpdGUgPSB3cml0ZTsKKwlpbml0X2NvbXBsZXRpb24oJmN0eC0+cmVzdGFydCk7CisJLyoKKwkgKiBDcnlwdG8gb3BlcmF0aW9uIGNhbiBiZSBhc3luY2hyb25vdXMsCisJICogY3R4LT5wZW5kaW5nIGlzIGluY3JlYXNlZCBhZnRlciByZXF1ZXN0IHN1Ym1pc3Npb24uCisJICogV2UgbmVlZCB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCBjYWxsIHRoZSBjcnlwdCBmaW5pc2gKKwkgKiBvcGVyYXRpb24gYmVmb3JlIHBlbmRpbmcgZ290IGluY3JlbWVudGVkCisJICogKGRlcGVuZGVudCBvbiBjcnlwdCBzdWJtaXNzaW9uIHJldHVybiBjb2RlKS4KKwkgKi8KKwlhdG9taWNfc2V0KCZjdHgtPnBlbmRpbmcsIDIpOworfQorCitzdGF0aWMgaW50IGNyeXB0X2NvbnZlcnRfYmxvY2soc3RydWN0IGNyeXB0X2NvbmZpZyAqY2MsCisJCQkgICAgICAgc3RydWN0IGNvbnZlcnRfY29udGV4dCAqY3R4LAorCQkJICAgICAgIHN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgYmlvX3ZlYyAqYnZfaW4gPSBiaW9faW92ZWNfaWR4KGN0eC0+YmlvX2luLCBjdHgtPmlkeF9pbik7CisJc3RydWN0IGJpb192ZWMgKmJ2X291dCA9IGJpb19pb3ZlY19pZHgoY3R4LT5iaW9fb3V0LCBjdHgtPmlkeF9vdXQpOworCXN0cnVjdCBkbV9jcnlwdF9yZXF1ZXN0ICpkbXJlcTsKKwl1OCAqaXY7CisJaW50IHIgPSAwOworCisJZG1yZXEgPSAoc3RydWN0IGRtX2NyeXB0X3JlcXVlc3QgKikoKGNoYXIgKilyZXEgKyBjYy0+ZG1yZXFfc3RhcnQpOworCWl2ID0gKHU4ICopQUxJR04oKHVuc2lnbmVkIGxvbmcpKGRtcmVxICsgMSksCisJCQkgY3J5cHRvX2FibGtjaXBoZXJfYWxpZ25tYXNrKGNjLT50Zm0pICsgMSk7CisKKwlzZ19pbml0X3RhYmxlKCZkbXJlcS0+c2dfaW4sIDEpOworCXNnX3NldF9wYWdlKCZkbXJlcS0+c2dfaW4sIGJ2X2luLT5idl9wYWdlLCAxIDw8IFNFQ1RPUl9TSElGVCwKKwkJICAgIGJ2X2luLT5idl9vZmZzZXQgKyBjdHgtPm9mZnNldF9pbik7CisKKwlzZ19pbml0X3RhYmxlKCZkbXJlcS0+c2dfb3V0LCAxKTsKKwlzZ19zZXRfcGFnZSgmZG1yZXEtPnNnX291dCwgYnZfb3V0LT5idl9wYWdlLCAxIDw8IFNFQ1RPUl9TSElGVCwKKwkJICAgIGJ2X291dC0+YnZfb2Zmc2V0ICsgY3R4LT5vZmZzZXRfb3V0KTsKKworCWN0eC0+b2Zmc2V0X2luICs9IDEgPDwgU0VDVE9SX1NISUZUOworCWlmIChjdHgtPm9mZnNldF9pbiA+PSBidl9pbi0+YnZfbGVuKSB7CisJCWN0eC0+b2Zmc2V0X2luID0gMDsKKwkJY3R4LT5pZHhfaW4rKzsKKwl9CisKKwljdHgtPm9mZnNldF9vdXQgKz0gMSA8PCBTRUNUT1JfU0hJRlQ7CisJaWYgKGN0eC0+b2Zmc2V0X291dCA+PSBidl9vdXQtPmJ2X2xlbikgeworCQljdHgtPm9mZnNldF9vdXQgPSAwOworCQljdHgtPmlkeF9vdXQrKzsKKwl9CisKKwlpZiAoY2MtPml2X2dlbl9vcHMpIHsKKwkJciA9IGNjLT5pdl9nZW5fb3BzLT5nZW5lcmF0b3IoY2MsIGl2LCBjdHgtPnNlY3Rvcik7CisJCWlmIChyIDwgMCkKKwkJCXJldHVybiByOworCX0KKworCWFibGtjaXBoZXJfcmVxdWVzdF9zZXRfY3J5cHQocmVxLCAmZG1yZXEtPnNnX2luLCAmZG1yZXEtPnNnX291dCwKKwkJCQkgICAgIDEgPDwgU0VDVE9SX1NISUZULCBpdik7CisKKwlpZiAoYmlvX2RhdGFfZGlyKGN0eC0+YmlvX2luKSA9PSBXUklURSkKKwkJciA9IGNyeXB0b19hYmxrY2lwaGVyX2VuY3J5cHQocmVxKTsKKwllbHNlCisJCXIgPSBjcnlwdG9fYWJsa2NpcGhlcl9kZWNyeXB0KHJlcSk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQga2NyeXB0ZF9hc3luY19kb25lKHN0cnVjdCBjcnlwdG9fYXN5bmNfcmVxdWVzdCAqYXN5bmNfcmVxLAorCQkJICAgICAgIGludCBlcnJvcik7CitzdGF0aWMgdm9pZCBjcnlwdF9hbGxvY19yZXEoc3RydWN0IGNyeXB0X2NvbmZpZyAqY2MsCisJCQkgICAgc3RydWN0IGNvbnZlcnRfY29udGV4dCAqY3R4KQoreworCWlmICghY2MtPnJlcSkKKwkJY2MtPnJlcSA9IG1lbXBvb2xfYWxsb2MoY2MtPnJlcV9wb29sLCBHRlBfTk9JTyk7CisJYWJsa2NpcGhlcl9yZXF1ZXN0X3NldF90Zm0oY2MtPnJlcSwgY2MtPnRmbSk7CisJYWJsa2NpcGhlcl9yZXF1ZXN0X3NldF9jYWxsYmFjayhjYy0+cmVxLCBDUllQVE9fVEZNX1JFUV9NQVlfQkFDS0xPRyB8CisJCQkJCSAgICAgQ1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQLAorCQkJCQkgICAgIGtjcnlwdGRfYXN5bmNfZG9uZSwgY3R4KTsKIH0KIAogLyoKQEAgLTM0NiwzNiArNDE1LDM4IEBACiAKIAl3aGlsZShjdHgtPmlkeF9pbiA8IGN0eC0+YmlvX2luLT5iaV92Y250ICYmCiAJICAgICAgY3R4LT5pZHhfb3V0IDwgY3R4LT5iaW9fb3V0LT5iaV92Y250KSB7Ci0JCXN0cnVjdCBiaW9fdmVjICpidl9pbiA9IGJpb19pb3ZlY19pZHgoY3R4LT5iaW9faW4sIGN0eC0+aWR4X2luKTsKLQkJc3RydWN0IGJpb192ZWMgKmJ2X291dCA9IGJpb19pb3ZlY19pZHgoY3R4LT5iaW9fb3V0LCBjdHgtPmlkeF9vdXQpOwotCQlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dfaW4sIHNnX291dDsKIAotCQlzZ19pbml0X3RhYmxlKCZzZ19pbiwgMSk7Ci0JCXNnX3NldF9wYWdlKCZzZ19pbiwgYnZfaW4tPmJ2X3BhZ2UsIDEgPDwgU0VDVE9SX1NISUZULCBidl9pbi0+YnZfb2Zmc2V0ICsgY3R4LT5vZmZzZXRfaW4pOworCQljcnlwdF9hbGxvY19yZXEoY2MsIGN0eCk7CiAKLQkJc2dfaW5pdF90YWJsZSgmc2dfb3V0LCAxKTsKLQkJc2dfc2V0X3BhZ2UoJnNnX291dCwgYnZfb3V0LT5idl9wYWdlLCAxIDw8IFNFQ1RPUl9TSElGVCwgYnZfb3V0LT5idl9vZmZzZXQgKyBjdHgtPm9mZnNldF9vdXQpOworCQlyID0gY3J5cHRfY29udmVydF9ibG9jayhjYywgY3R4LCBjYy0+cmVxKTsKIAotCQljdHgtPm9mZnNldF9pbiArPSBzZ19pbi5sZW5ndGg7Ci0JCWlmIChjdHgtPm9mZnNldF9pbiA+PSBidl9pbi0+YnZfbGVuKSB7Ci0JCQljdHgtPm9mZnNldF9pbiA9IDA7Ci0JCQljdHgtPmlkeF9pbisrOworCQlzd2l0Y2ggKHIpIHsKKwkJY2FzZSAtRUJVU1k6CisJCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjdHgtPnJlc3RhcnQpOworCQkJSU5JVF9DT01QTEVUSU9OKGN0eC0+cmVzdGFydCk7CisJCQkvKiBmYWxsIHRocm91Z2gqLworCQljYXNlIC1FSU5QUk9HUkVTUzoKKwkJCWF0b21pY19pbmMoJmN0eC0+cGVuZGluZyk7CisJCQljYy0+cmVxID0gTlVMTDsKKwkJCXIgPSAwOworCQkJLyogZmFsbCB0aHJvdWdoKi8KKwkJY2FzZSAwOgorCQkJY3R4LT5zZWN0b3IrKzsKKwkJCWNvbnRpbnVlOwogCQl9CiAKLQkJY3R4LT5vZmZzZXRfb3V0ICs9IHNnX291dC5sZW5ndGg7Ci0JCWlmIChjdHgtPm9mZnNldF9vdXQgPj0gYnZfb3V0LT5idl9sZW4pIHsKLQkJCWN0eC0+b2Zmc2V0X291dCA9IDA7Ci0JCQljdHgtPmlkeF9vdXQrKzsKLQkJfQotCi0JCXIgPSBjcnlwdF9jb252ZXJ0X3NjYXR0ZXJsaXN0KGNjLCAmc2dfb3V0LCAmc2dfaW4sIHNnX2luLmxlbmd0aCwKLQkJCQkJICAgICAgY3R4LT53cml0ZSwgY3R4LT5zZWN0b3IpOwotCQlpZiAociA8IDApCi0JCQlicmVhazsKLQotCQljdHgtPnNlY3RvcisrOworCQlicmVhazsKIAl9CiAKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBwZW5kaW5nIGNyeXB0byBvcGVyYXRpb24gcnVuIGFzeW5jCisJICogY29kZS4gT3RoZXJ3aXNlIHByb2Nlc3MgcmV0dXJuIGNvZGUgc3luY2hyb25vdXNseS4KKwkgKiBUaGUgc3RlcCBvZiAyIGVuc3VyZXMgdGhhdCBhc3luYyBmaW5pc2ggZG9lc24ndAorCSAqIGNhbGwgY3J5cHRvIGZpbmlzaCB0b28gZWFybHkuCisJICovCisJaWYgKGF0b21pY19zdWJfcmV0dXJuKDIsICZjdHgtPnBlbmRpbmcpKQorCQlyZXR1cm4gLUVJTlBST0dSRVNTOworCiAJcmV0dXJuIHI7CiB9CiAKQEAgLTQ1NSwxOCArNTI2LDE0IEBACiAgKiBPbmUgb2YgdGhlIGJpb3Mgd2FzIGZpbmlzaGVkLiBDaGVjayBmb3IgY29tcGxldGlvbiBvZgogICogdGhlIHdob2xlIHJlcXVlc3QgYW5kIGNvcnJlY3RseSBjbGVhbiB1cCB0aGUgYnVmZmVyLgogICovCi1zdGF0aWMgdm9pZCBjcnlwdF9kZWNfcGVuZGluZyhzdHJ1Y3QgZG1fY3J5cHRfaW8gKmlvLCBpbnQgZXJyb3IpCitzdGF0aWMgdm9pZCBjcnlwdF9kZWNfcGVuZGluZyhzdHJ1Y3QgZG1fY3J5cHRfaW8gKmlvKQogewotCXN0cnVjdCBjcnlwdF9jb25maWcgKmNjID0gKHN0cnVjdCBjcnlwdF9jb25maWcgKikgaW8tPnRhcmdldC0+cHJpdmF0ZTsKLQotCWlmIChlcnJvciA8IDApCi0JCWlvLT5lcnJvciA9IGVycm9yOworCXN0cnVjdCBjcnlwdF9jb25maWcgKmNjID0gaW8tPnRhcmdldC0+cHJpdmF0ZTsKIAogCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmaW8tPnBlbmRpbmcpKQogCQlyZXR1cm47CiAKIAliaW9fZW5kaW8oaW8tPmJhc2VfYmlvLCBpby0+ZXJyb3IpOwotCiAJbWVtcG9vbF9mcmVlKGlvLCBjYy0+aW9fcG9vbCk7CiB9CiAKQEAgLTQ4NCwzMCArNTUxLDExIEBACiAgKiBzdGFydmVkIGJ5IG5ldyByZXF1ZXN0cyB3aGljaCBjYW4gYmxvY2sgaW4gdGhlIGZpcnN0IHN0YWdlcyBkdWUKICAqIHRvIG1lbW9yeSBhbGxvY2F0aW9uLgogICovCi1zdGF0aWMgdm9pZCBrY3J5cHRkX2RvX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLXN0YXRpYyB2b2lkIGtjcnlwdGRfZG9fY3J5cHQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLQotc3RhdGljIHZvaWQga2NyeXB0ZF9xdWV1ZV9pbyhzdHJ1Y3QgZG1fY3J5cHRfaW8gKmlvKQotewotCXN0cnVjdCBjcnlwdF9jb25maWcgKmNjID0gaW8tPnRhcmdldC0+cHJpdmF0ZTsKLQotCUlOSVRfV09SSygmaW8tPndvcmssIGtjcnlwdGRfZG9fd29yayk7Ci0JcXVldWVfd29yayhjYy0+aW9fcXVldWUsICZpby0+d29yayk7Ci19Ci0KLXN0YXRpYyB2b2lkIGtjcnlwdGRfcXVldWVfY3J5cHQoc3RydWN0IGRtX2NyeXB0X2lvICppbykKLXsKLQlzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYyA9IGlvLT50YXJnZXQtPnByaXZhdGU7Ci0KLQlJTklUX1dPUksoJmlvLT53b3JrLCBrY3J5cHRkX2RvX2NyeXB0KTsKLQlxdWV1ZV93b3JrKGNjLT5jcnlwdF9xdWV1ZSwgJmlvLT53b3JrKTsKLX0KLQogc3RhdGljIHZvaWQgY3J5cHRfZW5kaW8oc3RydWN0IGJpbyAqY2xvbmUsIGludCBlcnJvcikKIHsKIAlzdHJ1Y3QgZG1fY3J5cHRfaW8gKmlvID0gY2xvbmUtPmJpX3ByaXZhdGU7CiAJc3RydWN0IGNyeXB0X2NvbmZpZyAqY2MgPSBpby0+dGFyZ2V0LT5wcml2YXRlOwotCXVuc2lnbmVkIHJlYWRfaW8gPSBiaW9fZGF0YV9kaXIoY2xvbmUpID09IFJFQUQ7CisJdW5zaWduZWQgcncgPSBiaW9fZGF0YV9kaXIoY2xvbmUpOwogCiAJaWYgKHVubGlrZWx5KCFiaW9fZmxhZ2dlZChjbG9uZSwgQklPX1VQVE9EQVRFKSAmJiAhZXJyb3IpKQogCQllcnJvciA9IC1FSU87CkBAIC01MTUsMjEgKzU2MywyMCBAQAogCS8qCiAJICogZnJlZSB0aGUgcHJvY2Vzc2VkIHBhZ2VzCiAJICovCi0JaWYgKCFyZWFkX2lvKSB7CisJaWYgKHJ3ID09IFdSSVRFKQogCQljcnlwdF9mcmVlX2J1ZmZlcl9wYWdlcyhjYywgY2xvbmUpOwotCQlnb3RvIG91dDsKKworCWJpb19wdXQoY2xvbmUpOworCisJaWYgKHJ3ID09IFJFQUQgJiYgIWVycm9yKSB7CisJCWtjcnlwdGRfcXVldWVfY3J5cHQoaW8pOworCQlyZXR1cm47CiAJfQogCiAJaWYgKHVubGlrZWx5KGVycm9yKSkKLQkJZ290byBvdXQ7CisJCWlvLT5lcnJvciA9IGVycm9yOwogCi0JYmlvX3B1dChjbG9uZSk7Ci0Ja2NyeXB0ZF9xdWV1ZV9jcnlwdChpbyk7Ci0JcmV0dXJuOwotCi1vdXQ6Ci0JYmlvX3B1dChjbG9uZSk7Ci0JY3J5cHRfZGVjX3BlbmRpbmcoaW8sIGVycm9yKTsKKwljcnlwdF9kZWNfcGVuZGluZyhpbyk7CiB9CiAKIHN0YXRpYyB2b2lkIGNsb25lX2luaXQoc3RydWN0IGRtX2NyeXB0X2lvICppbywgc3RydWN0IGJpbyAqY2xvbmUpCkBAIC01NDMsMTIgKzU5MCwxMSBAQAogCWNsb25lLT5iaV9kZXN0cnVjdG9yID0gZG1fY3J5cHRfYmlvX2Rlc3RydWN0b3I7CiB9CiAKLXN0YXRpYyB2b2lkIHByb2Nlc3NfcmVhZChzdHJ1Y3QgZG1fY3J5cHRfaW8gKmlvKQorc3RhdGljIHZvaWQga2NyeXB0ZF9pb19yZWFkKHN0cnVjdCBkbV9jcnlwdF9pbyAqaW8pCiB7CiAJc3RydWN0IGNyeXB0X2NvbmZpZyAqY2MgPSBpby0+dGFyZ2V0LT5wcml2YXRlOwogCXN0cnVjdCBiaW8gKmJhc2VfYmlvID0gaW8tPmJhc2VfYmlvOwogCXN0cnVjdCBiaW8gKmNsb25lOwotCXNlY3Rvcl90IHNlY3RvciA9IGJhc2VfYmlvLT5iaV9zZWN0b3IgLSBpby0+dGFyZ2V0LT5iZWdpbjsKIAogCWF0b21pY19pbmMoJmlvLT5wZW5kaW5nKTsKIApAQCAtNTU5LDcgKzYwNSw4IEBACiAJICovCiAJY2xvbmUgPSBiaW9fYWxsb2NfYmlvc2V0KEdGUF9OT0lPLCBiaW9fc2VnbWVudHMoYmFzZV9iaW8pLCBjYy0+YnMpOwogCWlmICh1bmxpa2VseSghY2xvbmUpKSB7Ci0JCWNyeXB0X2RlY19wZW5kaW5nKGlvLCAtRU5PTUVNKTsKKwkJaW8tPmVycm9yID0gLUVOT01FTTsKKwkJY3J5cHRfZGVjX3BlbmRpbmcoaW8pOwogCQlyZXR1cm47CiAJfQogCkBAIC01NjcsMjUgKzYxNCw3MSBAQAogCWNsb25lLT5iaV9pZHggPSAwOwogCWNsb25lLT5iaV92Y250ID0gYmlvX3NlZ21lbnRzKGJhc2VfYmlvKTsKIAljbG9uZS0+Ymlfc2l6ZSA9IGJhc2VfYmlvLT5iaV9zaXplOwotCWNsb25lLT5iaV9zZWN0b3IgPSBjYy0+c3RhcnQgKyBzZWN0b3I7CisJY2xvbmUtPmJpX3NlY3RvciA9IGNjLT5zdGFydCArIGlvLT5zZWN0b3I7CiAJbWVtY3B5KGNsb25lLT5iaV9pb192ZWMsIGJpb19pb3ZlYyhiYXNlX2JpbyksCiAJICAgICAgIHNpemVvZihzdHJ1Y3QgYmlvX3ZlYykgKiBjbG9uZS0+YmlfdmNudCk7CiAKIAlnZW5lcmljX21ha2VfcmVxdWVzdChjbG9uZSk7CiB9CiAKLXN0YXRpYyB2b2lkIHByb2Nlc3Nfd3JpdGUoc3RydWN0IGRtX2NyeXB0X2lvICppbykKK3N0YXRpYyB2b2lkIGtjcnlwdGRfaW9fd3JpdGUoc3RydWN0IGRtX2NyeXB0X2lvICppbykKK3sKKwlzdHJ1Y3QgYmlvICpjbG9uZSA9IGlvLT5jdHguYmlvX291dDsKKworCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KGNsb25lKTsKK30KKworc3RhdGljIHZvaWQga2NyeXB0ZF9pbyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRtX2NyeXB0X2lvICppbyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZG1fY3J5cHRfaW8sIHdvcmspOworCisJaWYgKGJpb19kYXRhX2Rpcihpby0+YmFzZV9iaW8pID09IFJFQUQpCisJCWtjcnlwdGRfaW9fcmVhZChpbyk7CisJZWxzZQorCQlrY3J5cHRkX2lvX3dyaXRlKGlvKTsKK30KKworc3RhdGljIHZvaWQga2NyeXB0ZF9xdWV1ZV9pbyhzdHJ1Y3QgZG1fY3J5cHRfaW8gKmlvKQogewogCXN0cnVjdCBjcnlwdF9jb25maWcgKmNjID0gaW8tPnRhcmdldC0+cHJpdmF0ZTsKLQlzdHJ1Y3QgYmlvICpiYXNlX2JpbyA9IGlvLT5iYXNlX2JpbzsKKworCUlOSVRfV09SSygmaW8tPndvcmssIGtjcnlwdGRfaW8pOworCXF1ZXVlX3dvcmsoY2MtPmlvX3F1ZXVlLCAmaW8tPndvcmspOworfQorCitzdGF0aWMgdm9pZCBrY3J5cHRkX2NyeXB0X3dyaXRlX2lvX3N1Ym1pdChzdHJ1Y3QgZG1fY3J5cHRfaW8gKmlvLAorCQkJCQkgIGludCBlcnJvciwgaW50IGFzeW5jKQoreworCXN0cnVjdCBiaW8gKmNsb25lID0gaW8tPmN0eC5iaW9fb3V0OworCXN0cnVjdCBjcnlwdF9jb25maWcgKmNjID0gaW8tPnRhcmdldC0+cHJpdmF0ZTsKKworCWlmICh1bmxpa2VseShlcnJvciA8IDApKSB7CisJCWNyeXB0X2ZyZWVfYnVmZmVyX3BhZ2VzKGNjLCBjbG9uZSk7CisJCWJpb19wdXQoY2xvbmUpOworCQlpby0+ZXJyb3IgPSAtRUlPOworCQlyZXR1cm47CisJfQorCisJLyogY3J5cHRfY29udmVydCBzaG91bGQgaGF2ZSBmaWxsZWQgdGhlIGNsb25lIGJpbyAqLworCUJVR19PTihpby0+Y3R4LmlkeF9vdXQgPCBjbG9uZS0+YmlfdmNudCk7CisKKwljbG9uZS0+Ymlfc2VjdG9yID0gY2MtPnN0YXJ0ICsgaW8tPnNlY3RvcjsKKwlpby0+c2VjdG9yICs9IGJpb19zZWN0b3JzKGNsb25lKTsKKworCWlmIChhc3luYykKKwkJa2NyeXB0ZF9xdWV1ZV9pbyhpbyk7CisJZWxzZSB7CisJCWF0b21pY19pbmMoJmlvLT5wZW5kaW5nKTsKKwkJZ2VuZXJpY19tYWtlX3JlcXVlc3QoY2xvbmUpOworCX0KK30KKworc3RhdGljIHZvaWQga2NyeXB0ZF9jcnlwdF93cml0ZV9jb252ZXJ0X2xvb3Aoc3RydWN0IGRtX2NyeXB0X2lvICppbykKK3sKKwlzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYyA9IGlvLT50YXJnZXQtPnByaXZhdGU7CiAJc3RydWN0IGJpbyAqY2xvbmU7Ci0Jc3RydWN0IGNvbnZlcnRfY29udGV4dCBjdHg7Ci0JdW5zaWduZWQgcmVtYWluaW5nID0gYmFzZV9iaW8tPmJpX3NpemU7Ci0Jc2VjdG9yX3Qgc2VjdG9yID0gYmFzZV9iaW8tPmJpX3NlY3RvciAtIGlvLT50YXJnZXQtPmJlZ2luOwotCi0JYXRvbWljX2luYygmaW8tPnBlbmRpbmcpOwotCi0JY3J5cHRfY29udmVydF9pbml0KGNjLCAmY3R4LCBOVUxMLCBiYXNlX2Jpbywgc2VjdG9yLCAxKTsKKwl1bnNpZ25lZCByZW1haW5pbmcgPSBpby0+YmFzZV9iaW8tPmJpX3NpemU7CisJaW50IHI7CiAKIAkvKgogCSAqIFRoZSBhbGxvY2F0ZWQgYnVmZmVycyBjYW4gYmUgc21hbGxlciB0aGFuIHRoZSB3aG9sZSBiaW8sCkBAIC01OTQsNzAgKzY4NywxMTAgQEAKIAl3aGlsZSAocmVtYWluaW5nKSB7CiAJCWNsb25lID0gY3J5cHRfYWxsb2NfYnVmZmVyKGlvLCByZW1haW5pbmcpOwogCQlpZiAodW5saWtlbHkoIWNsb25lKSkgewotCQkJY3J5cHRfZGVjX3BlbmRpbmcoaW8sIC1FTk9NRU0pOworCQkJaW8tPmVycm9yID0gLUVOT01FTTsKIAkJCXJldHVybjsKIAkJfQogCi0JCWN0eC5iaW9fb3V0ID0gY2xvbmU7Ci0JCWN0eC5pZHhfb3V0ID0gMDsKKwkJaW8tPmN0eC5iaW9fb3V0ID0gY2xvbmU7CisJCWlvLT5jdHguaWR4X291dCA9IDA7CiAKLQkJaWYgKHVubGlrZWx5KGNyeXB0X2NvbnZlcnQoY2MsICZjdHgpIDwgMCkpIHsKLQkJCWNyeXB0X2ZyZWVfYnVmZmVyX3BhZ2VzKGNjLCBjbG9uZSk7Ci0JCQliaW9fcHV0KGNsb25lKTsKLQkJCWNyeXB0X2RlY19wZW5kaW5nKGlvLCAtRUlPKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qIGNyeXB0X2NvbnZlcnQgc2hvdWxkIGhhdmUgZmlsbGVkIHRoZSBjbG9uZSBiaW8gKi8KLQkJQlVHX09OKGN0eC5pZHhfb3V0IDwgY2xvbmUtPmJpX3ZjbnQpOwotCi0JCWNsb25lLT5iaV9zZWN0b3IgPSBjYy0+c3RhcnQgKyBzZWN0b3I7CiAJCXJlbWFpbmluZyAtPSBjbG9uZS0+Ymlfc2l6ZTsKLQkJc2VjdG9yICs9IGJpb19zZWN0b3JzKGNsb25lKTsKIAotCQkvKiBHcmFiIGFub3RoZXIgcmVmZXJlbmNlIHRvIHRoZSBpbyBzdHJ1Y3QKLQkJICogYmVmb3JlIHdlIGtpY2sgb2ZmIHRoZSByZXF1ZXN0ICovCi0JCWlmIChyZW1haW5pbmcpCisJCXIgPSBjcnlwdF9jb252ZXJ0KGNjLCAmaW8tPmN0eCk7CisKKwkJaWYgKHIgIT0gLUVJTlBST0dSRVNTKSB7CisJCQlrY3J5cHRkX2NyeXB0X3dyaXRlX2lvX3N1Ym1pdChpbywgciwgMCk7CisJCQlpZiAodW5saWtlbHkociA8IDApKQorCQkJCXJldHVybjsKKwkJfSBlbHNlCiAJCQlhdG9taWNfaW5jKCZpby0+cGVuZGluZyk7CiAKLQkJZ2VuZXJpY19tYWtlX3JlcXVlc3QoY2xvbmUpOwotCi0JCS8qIERvIG5vdCByZWZlcmVuY2UgY2xvbmUgYWZ0ZXIgdGhpcyAtIGl0Ci0JCSAqIG1heSBiZSBnb25lIGFscmVhZHkuICovCi0KIAkJLyogb3V0IG9mIG1lbW9yeSAtPiBydW4gcXVldWVzICovCi0JCWlmIChyZW1haW5pbmcpCisJCWlmICh1bmxpa2VseShyZW1haW5pbmcpKQogCQkJY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi8xMDApOwogCX0KIH0KIAotc3RhdGljIHZvaWQgcHJvY2Vzc19yZWFkX2VuZGlvKHN0cnVjdCBkbV9jcnlwdF9pbyAqaW8pCitzdGF0aWMgdm9pZCBrY3J5cHRkX2NyeXB0X3dyaXRlX2NvbnZlcnQoc3RydWN0IGRtX2NyeXB0X2lvICppbykKIHsKIAlzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYyA9IGlvLT50YXJnZXQtPnByaXZhdGU7Ci0Jc3RydWN0IGNvbnZlcnRfY29udGV4dCBjdHg7CiAKLQljcnlwdF9jb252ZXJ0X2luaXQoY2MsICZjdHgsIGlvLT5iYXNlX2JpbywgaW8tPmJhc2VfYmlvLAotCQkJICAgaW8tPmJhc2VfYmlvLT5iaV9zZWN0b3IgLSBpby0+dGFyZ2V0LT5iZWdpbiwgMCk7CisJLyoKKwkgKiBQcmV2ZW50IGlvIGZyb20gZGlzYXBwZWFyaW5nIHVudGlsIHRoaXMgZnVuY3Rpb24gY29tcGxldGVzLgorCSAqLworCWF0b21pY19pbmMoJmlvLT5wZW5kaW5nKTsKIAotCWNyeXB0X2RlY19wZW5kaW5nKGlvLCBjcnlwdF9jb252ZXJ0KGNjLCAmY3R4KSk7CisJY3J5cHRfY29udmVydF9pbml0KGNjLCAmaW8tPmN0eCwgTlVMTCwgaW8tPmJhc2VfYmlvLCBpby0+c2VjdG9yKTsKKwlrY3J5cHRkX2NyeXB0X3dyaXRlX2NvbnZlcnRfbG9vcChpbyk7CisKKwljcnlwdF9kZWNfcGVuZGluZyhpbyk7CiB9CiAKLXN0YXRpYyB2b2lkIGtjcnlwdGRfZG9fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCBrY3J5cHRkX2NyeXB0X3JlYWRfZG9uZShzdHJ1Y3QgZG1fY3J5cHRfaW8gKmlvLCBpbnQgZXJyb3IpCiB7Ci0Jc3RydWN0IGRtX2NyeXB0X2lvICppbyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZG1fY3J5cHRfaW8sIHdvcmspOworCWlmICh1bmxpa2VseShlcnJvciA8IDApKQorCQlpby0+ZXJyb3IgPSAtRUlPOwogCi0JaWYgKGJpb19kYXRhX2Rpcihpby0+YmFzZV9iaW8pID09IFJFQUQpCi0JCXByb2Nlc3NfcmVhZChpbyk7CisJY3J5cHRfZGVjX3BlbmRpbmcoaW8pOwogfQogCi1zdGF0aWMgdm9pZCBrY3J5cHRkX2RvX2NyeXB0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyB2b2lkIGtjcnlwdGRfY3J5cHRfcmVhZF9jb252ZXJ0KHN0cnVjdCBkbV9jcnlwdF9pbyAqaW8pCiB7Ci0Jc3RydWN0IGRtX2NyeXB0X2lvICppbyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZG1fY3J5cHRfaW8sIHdvcmspOworCXN0cnVjdCBjcnlwdF9jb25maWcgKmNjID0gaW8tPnRhcmdldC0+cHJpdmF0ZTsKKwlpbnQgciA9IDA7CisKKwlhdG9taWNfaW5jKCZpby0+cGVuZGluZyk7CisKKwljcnlwdF9jb252ZXJ0X2luaXQoY2MsICZpby0+Y3R4LCBpby0+YmFzZV9iaW8sIGlvLT5iYXNlX2JpbywKKwkJCSAgIGlvLT5zZWN0b3IpOworCisJciA9IGNyeXB0X2NvbnZlcnQoY2MsICZpby0+Y3R4KTsKKworCWlmIChyICE9IC1FSU5QUk9HUkVTUykKKwkJa2NyeXB0ZF9jcnlwdF9yZWFkX2RvbmUoaW8sIHIpOworCisJY3J5cHRfZGVjX3BlbmRpbmcoaW8pOworfQorCitzdGF0aWMgdm9pZCBrY3J5cHRkX2FzeW5jX2RvbmUoc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICphc3luY19yZXEsCisJCQkgICAgICAgaW50IGVycm9yKQoreworCXN0cnVjdCBjb252ZXJ0X2NvbnRleHQgKmN0eCA9IGFzeW5jX3JlcS0+ZGF0YTsKKwlzdHJ1Y3QgZG1fY3J5cHRfaW8gKmlvID0gY29udGFpbmVyX29mKGN0eCwgc3RydWN0IGRtX2NyeXB0X2lvLCBjdHgpOworCXN0cnVjdCBjcnlwdF9jb25maWcgKmNjID0gaW8tPnRhcmdldC0+cHJpdmF0ZTsKKworCWlmIChlcnJvciA9PSAtRUlOUFJPR1JFU1MpIHsKKwkJY29tcGxldGUoJmN0eC0+cmVzdGFydCk7CisJCXJldHVybjsKKwl9CisKKwltZW1wb29sX2ZyZWUoYWJsa2NpcGhlcl9yZXF1ZXN0X2Nhc3QoYXN5bmNfcmVxKSwgY2MtPnJlcV9wb29sKTsKKworCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmY3R4LT5wZW5kaW5nKSkKKwkJcmV0dXJuOwogCiAJaWYgKGJpb19kYXRhX2Rpcihpby0+YmFzZV9iaW8pID09IFJFQUQpCi0JCXByb2Nlc3NfcmVhZF9lbmRpbyhpbyk7CisJCWtjcnlwdGRfY3J5cHRfcmVhZF9kb25lKGlvLCBlcnJvcik7CiAJZWxzZQotCQlwcm9jZXNzX3dyaXRlKGlvKTsKKwkJa2NyeXB0ZF9jcnlwdF93cml0ZV9pb19zdWJtaXQoaW8sIGVycm9yLCAxKTsKK30KKworc3RhdGljIHZvaWQga2NyeXB0ZF9jcnlwdChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRtX2NyeXB0X2lvICppbyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZG1fY3J5cHRfaW8sIHdvcmspOworCisJaWYgKGJpb19kYXRhX2Rpcihpby0+YmFzZV9iaW8pID09IFJFQUQpCisJCWtjcnlwdGRfY3J5cHRfcmVhZF9jb252ZXJ0KGlvKTsKKwllbHNlCisJCWtjcnlwdGRfY3J5cHRfd3JpdGVfY29udmVydChpbyk7Cit9CisKK3N0YXRpYyB2b2lkIGtjcnlwdGRfcXVldWVfY3J5cHQoc3RydWN0IGRtX2NyeXB0X2lvICppbykKK3sKKwlzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYyA9IGlvLT50YXJnZXQtPnByaXZhdGU7CisKKwlJTklUX1dPUksoJmlvLT53b3JrLCBrY3J5cHRkX2NyeXB0KTsKKwlxdWV1ZV93b3JrKGNjLT5jcnlwdF9xdWV1ZSwgJmlvLT53b3JrKTsKIH0KIAogLyoKQEAgLTczMyw3ICs4NjYsNyBAQAogc3RhdGljIGludCBjcnlwdF9jdHIoc3RydWN0IGRtX3RhcmdldCAqdGksIHVuc2lnbmVkIGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKIAlzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYzsKLQlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtOworCXN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlciAqdGZtOwogCWNoYXIgKnRtcDsKIAljaGFyICpjaXBoZXI7CiAJY2hhciAqY2hhaW5tb2RlOwpAQCAtNzg3LDcgKzkyMCw3IEBACiAJCWdvdG8gYmFkX2NpcGhlcjsKIAl9CiAKLQl0Zm0gPSBjcnlwdG9fYWxsb2NfYmxrY2lwaGVyKGNjLT5jaXBoZXIsIDAsIENSWVBUT19BTEdfQVNZTkMpOworCXRmbSA9IGNyeXB0b19hbGxvY19hYmxrY2lwaGVyKGNjLT5jaXBoZXIsIDAsIDApOwogCWlmIChJU19FUlIodGZtKSkgewogCQl0aS0+ZXJyb3IgPSAiRXJyb3IgYWxsb2NhdGluZyBjcnlwdG8gdGZtIjsKIAkJZ290byBiYWRfY2lwaGVyOwpAQCAtODIxLDcgKzk1NCw3IEBACiAJICAgIGNjLT5pdl9nZW5fb3BzLT5jdHIoY2MsIHRpLCBpdm9wdHMpIDwgMCkKIAkJZ290byBiYWRfaXZtb2RlOwogCi0JY2MtPml2X3NpemUgPSBjcnlwdG9fYmxrY2lwaGVyX2l2c2l6ZSh0Zm0pOworCWNjLT5pdl9zaXplID0gY3J5cHRvX2FibGtjaXBoZXJfaXZzaXplKHRmbSk7CiAJaWYgKGNjLT5pdl9zaXplKQogCQkvKiBhdCBsZWFzdCBhIDY0IGJpdCBzZWN0b3IgbnVtYmVyIHNob3VsZCBmaXQgaW4gb3VyIGJ1ZmZlciAqLwogCQljYy0+aXZfc2l6ZSA9IG1heChjYy0+aXZfc2l6ZSwKQEAgLTg0MSw2ICs5NzQsMjAgQEAKIAkJZ290byBiYWRfc2xhYl9wb29sOwogCX0KIAorCWNjLT5kbXJlcV9zdGFydCA9IHNpemVvZihzdHJ1Y3QgYWJsa2NpcGhlcl9yZXF1ZXN0KTsKKwljYy0+ZG1yZXFfc3RhcnQgKz0gY3J5cHRvX2FibGtjaXBoZXJfcmVxc2l6ZSh0Zm0pOworCWNjLT5kbXJlcV9zdGFydCA9IEFMSUdOKGNjLT5kbXJlcV9zdGFydCwgY3J5cHRvX3RmbV9jdHhfYWxpZ25tZW50KCkpOworCWNjLT5kbXJlcV9zdGFydCArPSBjcnlwdG9fYWJsa2NpcGhlcl9hbGlnbm1hc2sodGZtKSAmCisJCQkgICB+KGNyeXB0b190Zm1fY3R4X2FsaWdubWVudCgpIC0gMSk7CisKKwljYy0+cmVxX3Bvb2wgPSBtZW1wb29sX2NyZWF0ZV9rbWFsbG9jX3Bvb2woTUlOX0lPUywgY2MtPmRtcmVxX3N0YXJ0ICsKKwkJCXNpemVvZihzdHJ1Y3QgZG1fY3J5cHRfcmVxdWVzdCkgKyBjYy0+aXZfc2l6ZSk7CisJaWYgKCFjYy0+cmVxX3Bvb2wpIHsKKwkJdGktPmVycm9yID0gIkNhbm5vdCBhbGxvY2F0ZSBjcnlwdCByZXF1ZXN0IG1lbXBvb2wiOworCQlnb3RvIGJhZF9yZXFfcG9vbDsKKwl9CisJY2MtPnJlcSA9IE5VTEw7CisKIAljYy0+cGFnZV9wb29sID0gbWVtcG9vbF9jcmVhdGVfcGFnZV9wb29sKE1JTl9QT09MX1BBR0VTLCAwKTsKIAlpZiAoIWNjLT5wYWdlX3Bvb2wpIHsKIAkJdGktPmVycm9yID0gIkNhbm5vdCBhbGxvY2F0ZSBwYWdlIG1lbXBvb2wiOwpAQCAtODUzLDcgKzEwMDAsNyBAQAogCQlnb3RvIGJhZF9iczsKIAl9CiAKLQlpZiAoY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkodGZtLCBjYy0+a2V5LCBrZXlfc2l6ZSkgPCAwKSB7CisJaWYgKGNyeXB0b19hYmxrY2lwaGVyX3NldGtleSh0Zm0sIGNjLT5rZXksIGtleV9zaXplKSA8IDApIHsKIAkJdGktPmVycm9yID0gIkVycm9yIHNldHRpbmcga2V5IjsKIAkJZ290byBiYWRfZGV2aWNlOwogCX0KQEAgLTkxNCwxMiArMTA2MSwxNCBAQAogYmFkX2JzOgogCW1lbXBvb2xfZGVzdHJveShjYy0+cGFnZV9wb29sKTsKIGJhZF9wYWdlX3Bvb2w6CisJbWVtcG9vbF9kZXN0cm95KGNjLT5yZXFfcG9vbCk7CitiYWRfcmVxX3Bvb2w6CiAJbWVtcG9vbF9kZXN0cm95KGNjLT5pb19wb29sKTsKIGJhZF9zbGFiX3Bvb2w6CiAJaWYgKGNjLT5pdl9nZW5fb3BzICYmIGNjLT5pdl9nZW5fb3BzLT5kdHIpCiAJCWNjLT5pdl9nZW5fb3BzLT5kdHIoY2MpOwogYmFkX2l2bW9kZToKLQljcnlwdG9fZnJlZV9ibGtjaXBoZXIodGZtKTsKKwljcnlwdG9fZnJlZV9hYmxrY2lwaGVyKHRmbSk7CiBiYWRfY2lwaGVyOgogCS8qIE11c3QgemVybyBrZXkgbWF0ZXJpYWwgYmVmb3JlIGZyZWVpbmcgKi8KIAltZW1zZXQoY2MsIDAsIHNpemVvZigqY2MpICsgY2MtPmtleV9zaXplICogc2l6ZW9mKHU4KSk7CkBAIC05MzQsMTQgKzEwODMsMTggQEAKIAlkZXN0cm95X3dvcmtxdWV1ZShjYy0+aW9fcXVldWUpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKGNjLT5jcnlwdF9xdWV1ZSk7CiAKKwlpZiAoY2MtPnJlcSkKKwkJbWVtcG9vbF9mcmVlKGNjLT5yZXEsIGNjLT5yZXFfcG9vbCk7CisKIAliaW9zZXRfZnJlZShjYy0+YnMpOwogCW1lbXBvb2xfZGVzdHJveShjYy0+cGFnZV9wb29sKTsKKwltZW1wb29sX2Rlc3Ryb3koY2MtPnJlcV9wb29sKTsKIAltZW1wb29sX2Rlc3Ryb3koY2MtPmlvX3Bvb2wpOwogCiAJa2ZyZWUoY2MtPml2X21vZGUpOwogCWlmIChjYy0+aXZfZ2VuX29wcyAmJiBjYy0+aXZfZ2VuX29wcy0+ZHRyKQogCQljYy0+aXZfZ2VuX29wcy0+ZHRyKGNjKTsKLQljcnlwdG9fZnJlZV9ibGtjaXBoZXIoY2MtPnRmbSk7CisJY3J5cHRvX2ZyZWVfYWJsa2NpcGhlcihjYy0+dGZtKTsKIAlkbV9wdXRfZGV2aWNlKHRpLCBjYy0+ZGV2KTsKIAogCS8qIE11c3QgemVybyBrZXkgbWF0ZXJpYWwgYmVmb3JlIGZyZWVpbmcgKi8KQEAgLTk1OCw2ICsxMTExLDcgQEAKIAlpbyA9IG1lbXBvb2xfYWxsb2MoY2MtPmlvX3Bvb2wsIEdGUF9OT0lPKTsKIAlpby0+dGFyZ2V0ID0gdGk7CiAJaW8tPmJhc2VfYmlvID0gYmlvOworCWlvLT5zZWN0b3IgPSBiaW8tPmJpX3NlY3RvciAtIHRpLT5iZWdpbjsKIAlpby0+ZXJyb3IgPSAwOwogCWF0b21pY19zZXQoJmlvLT5wZW5kaW5nLCAwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1leGNlcHRpb24tc3RvcmUuYyBiL2RyaXZlcnMvbWQvZG0tZXhjZXB0aW9uLXN0b3JlLmMKaW5kZXggOGZlODFlMS4uNWJiY2UyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1leGNlcHRpb24tc3RvcmUuYworKysgYi9kcml2ZXJzL21kL2RtLWV4Y2VwdGlvbi1zdG9yZS5jCkBAIC00NDksNyArNDQ5LDcgQEAKIAogc3RhdGljIGludCBwZXJzaXN0ZW50X3JlYWRfbWV0YWRhdGEoc3RydWN0IGV4Y2VwdGlvbl9zdG9yZSAqc3RvcmUpCiB7Ci0JaW50IHIsIG5ld19zbmFwc2hvdDsKKwlpbnQgciwgdW5pbml0aWFsaXplZF92YXIobmV3X3NuYXBzaG90KTsKIAlzdHJ1Y3QgcHN0b3JlICpwcyA9IGdldF9pbmZvKHN0b3JlKTsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWlvY3RsLmMgYi9kcml2ZXJzL21kL2RtLWlvY3RsLmMKaW5kZXggOTYyN2ZhMC4uYjI2MmMwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1pb2N0bC5jCisrKyBiL2RyaXZlcnMvbWQvZG0taW9jdGwuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kbS1pb2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC03MDIsNyArNzAzLDcgQEAKIAlpbnQgcjsKIAljaGFyICpuZXdfbmFtZSA9IChjaGFyICopIHBhcmFtICsgcGFyYW0tPmRhdGFfc3RhcnQ7CiAKLQlpZiAobmV3X25hbWUgPCAoY2hhciAqKSBwYXJhbS0+ZGF0YSB8fAorCWlmIChuZXdfbmFtZSA8IHBhcmFtLT5kYXRhIHx8CiAJICAgIGludmFsaWRfc3RyKG5ld19uYW1lLCAodm9pZCAqKSBwYXJhbSArIHBhcmFtX3NpemUpKSB7CiAJCURNV0FSTigiSW52YWxpZCBuZXcgbG9naWNhbCB2b2x1bWUgbmFtZSBzdXBwbGllZC4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC03MjgsNyArNzI5LDcgQEAKIAlpZiAoIW1kKQogCQlyZXR1cm4gLUVOWElPOwogCi0JaWYgKGdlb3N0ciA8IChjaGFyICopIHBhcmFtLT5kYXRhIHx8CisJaWYgKGdlb3N0ciA8IHBhcmFtLT5kYXRhIHx8CiAJICAgIGludmFsaWRfc3RyKGdlb3N0ciwgKHZvaWQgKikgcGFyYW0gKyBwYXJhbV9zaXplKSkgewogCQlETVdBUk4oIkludmFsaWQgZ2VvbWV0cnkgc3VwcGxpZWQuIik7CiAJCWdvdG8gb3V0OwpAQCAtMTM1MCwxMCArMTM1MSwxMCBAQAogewogCXN0cnVjdCBkbV9pb2N0bCB0bXAsICpkbWk7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJnRtcCwgdXNlciwgc2l6ZW9mKHRtcCkpKQorCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wLCB1c2VyLCBzaXplb2YodG1wKSAtIHNpemVvZih0bXAuZGF0YSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWlmICh0bXAuZGF0YV9zaXplIDwgc2l6ZW9mKHRtcCkpCisJaWYgKHRtcC5kYXRhX3NpemUgPCAoc2l6ZW9mKHRtcCkgLSBzaXplb2YodG1wLmRhdGEpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlkbWkgPSB2bWFsbG9jKHRtcC5kYXRhX3NpemUpOwpAQCAtMTM5NywxMyArMTM5OCwxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGN0bF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJICAgICB1aW50IGNvbW1hbmQsIHVsb25nIHUpCitzdGF0aWMgaW50IGN0bF9pb2N0bCh1aW50IGNvbW1hbmQsIHN0cnVjdCBkbV9pb2N0bCBfX3VzZXIgKnVzZXIpCiB7CiAJaW50IHIgPSAwOwogCXVuc2lnbmVkIGludCBjbWQ7Ci0Jc3RydWN0IGRtX2lvY3RsICpwYXJhbTsKLQlzdHJ1Y3QgZG1faW9jdGwgX191c2VyICp1c2VyID0gKHN0cnVjdCBkbV9pb2N0bCBfX3VzZXIgKikgdTsKKwlzdHJ1Y3QgZG1faW9jdGwgKnVuaW5pdGlhbGl6ZWRfdmFyKHBhcmFtKTsKIAlpb2N0bF9mbiBmbiA9IE5VTEw7CiAJc2l6ZV90IHBhcmFtX3NpemU7CiAKQEAgLTE0NzEsOCArMTQ3MCwyMyBAQAogCXJldHVybiByOwogfQogCitzdGF0aWMgbG9uZyBkbV9jdGxfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVpbnQgY29tbWFuZCwgdWxvbmcgdSkKK3sKKwlyZXR1cm4gKGxvbmcpY3RsX2lvY3RsKGNvbW1hbmQsIChzdHJ1Y3QgZG1faW9jdGwgX191c2VyICopdSk7Cit9CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgbG9uZyBkbV9jb21wYXRfY3RsX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1aW50IGNvbW1hbmQsIHVsb25nIHUpCit7CisJcmV0dXJuIChsb25nKWRtX2N0bF9pb2N0bChmaWxlLCBjb21tYW5kLCAodWxvbmcpIGNvbXBhdF9wdHIodSkpOworfQorI2Vsc2UKKyNkZWZpbmUgZG1fY29tcGF0X2N0bF9pb2N0bCBOVUxMCisjZW5kaWYKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgX2N0bF9mb3BzID0gewotCS5pb2N0bAkgPSBjdGxfaW9jdGwsCisJLnVubG9ja2VkX2lvY3RsCSA9IGRtX2N0bF9pb2N0bCwKKwkuY29tcGF0X2lvY3RsID0gZG1fY29tcGF0X2N0bF9pb2N0bCwKIAkub3duZXIJID0gVEhJU19NT0RVTEUsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWxvZy5jIGIvZHJpdmVycy9tZC9kbS1sb2cuYwppbmRleCAwNzJlZTQzLi4yYTc0YjIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWxvZy5jCisrKyBiL2RyaXZlcnMvbWQvZG0tbG9nLmMKQEAgLTQxLDcgKzQxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBkaXJ0eV9sb2dfdHlwZSAqZ2V0X3R5cGUoY29uc3QgY2hhciAqdHlwZV9uYW1lKQorc3RhdGljIHN0cnVjdCBkaXJ0eV9sb2dfdHlwZSAqX2dldF90eXBlKGNvbnN0IGNoYXIgKnR5cGVfbmFtZSkKIHsKIAlzdHJ1Y3QgZGlydHlfbG9nX3R5cGUgKnR5cGU7CiAKQEAgLTYxLDYgKzYxLDU1IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKKy8qCisgKiBnZXRfdHlwZQorICogQHR5cGVfbmFtZQorICoKKyAqIEF0dGVtcHQgdG8gcmV0cmlldmUgdGhlIGRpcnR5X2xvZ190eXBlIGJ5IG5hbWUuICBJZiBub3QgYWxyZWFkeQorICogYXZhaWxhYmxlLCBhdHRlbXB0IHRvIGxvYWQgdGhlIGFwcHJvcHJpYXRlIG1vZHVsZS4KKyAqCisgKiBMb2cgbW9kdWxlcyBhcmUgbmFtZWQgImRtLWxvZy0iIGZvbGxvd2VkIGJ5IHRoZSAndHlwZV9uYW1lJy4KKyAqIE1vZHVsZXMgbWF5IGNvbnRhaW4gbXVsdGlwbGUgdHlwZXMuCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZmlyc3QgdHJ5IHRoZSBtb2R1bGUgImRtLWxvZy08dHlwZV9uYW1lPiIsCisgKiB0aGVuIHRydW5jYXRlICd0eXBlX25hbWUnIG9uIHRoZSBsYXN0ICctJyBhbmQgdHJ5IGFnYWluLgorICoKKyAqIEZvciBleGFtcGxlLCBpZiB0eXBlX25hbWUgd2FzICJjbHVzdGVyZWQtZGlzayIsIGl0IHdvdWxkIHNlYXJjaAorICogJ2RtLWxvZy1jbHVzdGVyZWQtZGlzaycgdGhlbiAnZG0tbG9nLWNsdXN0ZXJlZCcuCisgKgorICogUmV0dXJuczogZGlydHlfbG9nX3R5cGUqIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZQorICovCitzdGF0aWMgc3RydWN0IGRpcnR5X2xvZ190eXBlICpnZXRfdHlwZShjb25zdCBjaGFyICp0eXBlX25hbWUpCit7CisJY2hhciAqcCwgKnR5cGVfbmFtZV9kdXA7CisJc3RydWN0IGRpcnR5X2xvZ190eXBlICp0eXBlOworCisJdHlwZSA9IF9nZXRfdHlwZSh0eXBlX25hbWUpOworCWlmICh0eXBlKQorCQlyZXR1cm4gdHlwZTsKKworCXR5cGVfbmFtZV9kdXAgPSBrc3RyZHVwKHR5cGVfbmFtZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0eXBlX25hbWVfZHVwKSB7CisJCURNV0FSTigiTm8gbWVtb3J5IGxlZnQgdG8gYXR0ZW1wdCBsb2cgbW9kdWxlIGxvYWQgZm9yIFwiJXNcIiIsCisJCSAgICAgICB0eXBlX25hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl3aGlsZSAocmVxdWVzdF9tb2R1bGUoImRtLWxvZy0lcyIsIHR5cGVfbmFtZV9kdXApIHx8CisJICAgICAgICEodHlwZSA9IF9nZXRfdHlwZSh0eXBlX25hbWUpKSkgeworCQlwID0gc3RycmNocih0eXBlX25hbWVfZHVwLCAnLScpOworCQlpZiAoIXApCisJCQlicmVhazsKKwkJcFswXSA9ICdcMCc7CisJfQorCisJaWYgKCF0eXBlKQorCQlETVdBUk4oIk1vZHVsZSBmb3IgbG9nZ2luZyB0eXBlIFwiJXNcIiBub3QgZm91bmQuIiwgdHlwZV9uYW1lKTsKKworCWtmcmVlKHR5cGVfbmFtZV9kdXApOworCisJcmV0dXJuIHR5cGU7Cit9CisKIHN0YXRpYyB2b2lkIHB1dF90eXBlKHN0cnVjdCBkaXJ0eV9sb2dfdHlwZSAqdHlwZSkKIHsKIAlzcGluX2xvY2soJl9sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tbXBhdGguYyBiL2RyaXZlcnMvbWQvZG0tbXBhdGguYwppbmRleCAyNGIyYjFlLi5lN2VlNTllIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLW1wYXRoLmMKKysrIGIvZHJpdmVycy9tZC9kbS1tcGF0aC5jCkBAIC0xMDYsNyArMTA2LDcgQEAKIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpfbXBpb19jYWNoZTsKIAotc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmttdWx0aXBhdGhkOworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICprbXVsdGlwYXRoZDsKIHN0YXRpYyB2b2lkIHByb2Nlc3NfcXVldWVkX2lvcyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIHZvaWQgdHJpZ2dlcl9ldmVudChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXJhaWQxLmMgYi9kcml2ZXJzL21kL2RtLXJhaWQxLmMKaW5kZXggMzExMjNkNGEuLmVkYzA1N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tcmFpZDEuYworKysgYi9kcml2ZXJzL21kL2RtLXJhaWQxLmMKQEAgLTYsNiArNiw3IEBACiAKICNpbmNsdWRlICJkbS5oIgogI2luY2x1ZGUgImRtLWJpby1saXN0LmgiCisjaW5jbHVkZSAiZG0tYmlvLXJlY29yZC5oIgogI2luY2x1ZGUgImRtLWlvLmgiCiAjaW5jbHVkZSAiZG0tbG9nLmgiCiAjaW5jbHVkZSAia2NvcHlkLmgiCkBAIC0yMCw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAKICNkZWZpbmUgRE1fTVNHX1BSRUZJWCAicmFpZDEiCiAjZGVmaW5lIERNX0lPX1BBR0VTIDY0CkBAIC0xMTMsOSArMTE1LDE2IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBNaXJyb3Igc2V0IHN0cnVjdHVyZXMuCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlbnVtIGRtX3JhaWQxX2Vycm9yIHsKKwlETV9SQUlEMV9XUklURV9FUlJPUiwKKwlETV9SQUlEMV9TWU5DX0VSUk9SLAorCURNX1JBSUQxX1JFQURfRVJST1IKK307CisKIHN0cnVjdCBtaXJyb3IgewogCXN0cnVjdCBtaXJyb3Jfc2V0ICptczsKIAlhdG9taWNfdCBlcnJvcl9jb3VudDsKKwl1aW50MzJfdCBlcnJvcl90eXBlOwogCXN0cnVjdCBkbV9kZXYgKmRldjsKIAlzZWN0b3JfdCBvZmZzZXQ7CiB9OwpAQCAtMTI3LDIxICsxMzYsMjUgQEAKIAlzdHJ1Y3Qga2NvcHlkX2NsaWVudCAqa2NvcHlkX2NsaWVudDsKIAl1aW50NjRfdCBmZWF0dXJlczsKIAotCXNwaW5sb2NrX3QgbG9jazsJLyogcHJvdGVjdHMgdGhlIG5leHQgdHdvIGxpc3RzICovCisJc3BpbmxvY2tfdCBsb2NrOwkvKiBwcm90ZWN0cyB0aGUgbGlzdHMgKi8KIAlzdHJ1Y3QgYmlvX2xpc3QgcmVhZHM7CiAJc3RydWN0IGJpb19saXN0IHdyaXRlczsKKwlzdHJ1Y3QgYmlvX2xpc3QgZmFpbHVyZXM7CiAKIAlzdHJ1Y3QgZG1faW9fY2xpZW50ICppb19jbGllbnQ7CisJbWVtcG9vbF90ICpyZWFkX3JlY29yZF9wb29sOwogCiAJLyogcmVjb3ZlcnkgKi8KIAlyZWdpb25fdCBucl9yZWdpb25zOwogCWludCBpbl9zeW5jOwogCWludCBsb2dfZmFpbHVyZTsKKwlhdG9taWNfdCBzdXNwZW5kOwogCi0Jc3RydWN0IG1pcnJvciAqZGVmYXVsdF9taXJyb3I7CS8qIERlZmF1bHQgbWlycm9yICovCisJYXRvbWljX3QgZGVmYXVsdF9taXJyb3I7CS8qIERlZmF1bHQgbWlycm9yICovCiAKIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqa21pcnJvcmRfd3E7CiAJc3RydWN0IHdvcmtfc3RydWN0IGttaXJyb3JkX3dvcms7CisJc3RydWN0IHdvcmtfc3RydWN0IHRyaWdnZXJfZXZlbnQ7CiAKIAl1bnNpZ25lZCBpbnQgbnJfbWlycm9yczsKIAlzdHJ1Y3QgbWlycm9yIG1pcnJvclswXTsKQEAgLTM2Miw2ICszNzUsMTYgQEAKIAlzdHJ1Y3QgcmVnaW9uX2hhc2ggKnJoID0gcmVnLT5yaDsKIAogCXJoLT5sb2ctPnR5cGUtPnNldF9yZWdpb25fc3luYyhyaC0+bG9nLCByZWctPmtleSwgc3VjY2Vzcyk7CisKKwkvKgorCSAqIERpc3BhdGNoIHRoZSBiaW9zIGJlZm9yZSB3ZSBjYWxsICd3YWtlX3VwX2FsbCcuCisJICogVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBpZiB3ZSBhcmUgc3VzcGVuZGluZywKKwkgKiB3ZSB3YW50IHRvIGtub3cgdGhhdCByZWNvdmVyeSBpcyBjb21wbGV0ZSBhbmQKKwkgKiB0aGUgd29yayBxdWV1ZSBpcyBmbHVzaGVkLiAgSWYgd2Ugd2FrZV91cF9hbGwKKwkgKiBiZWZvcmUgd2UgZGlzcGF0Y2hfYmlvcyAocXVldWUgYmlvcyBhbmQgY2FsbCB3YWtlKCkpLAorCSAqIHRoZW4gd2UgcmlzayBzdXNwZW5kaW5nIGJlZm9yZSB0aGUgd29yayBxdWV1ZQorCSAqIGhhcyBiZWVuIHByb3Blcmx5IGZsdXNoZWQuCisJICovCiAJZGlzcGF0Y2hfYmlvcyhyaC0+bXMsICZyZWctPmRlbGF5ZWRfYmlvcyk7CiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnJoLT5yZWNvdmVyeV9pbl9mbGlnaHQpKQogCQl3YWtlX3VwX2FsbCgmX2ttaXJyb3JkX3JlY292ZXJ5X3N0b3BwZWQpOwpAQCAtNjI2LDI0ICs2NDksMTAxIEBACiAJd2FrZShyaC0+bXMpOwogfQogCisjZGVmaW5lIE1JTl9SRUFEX1JFQ09SRFMgMjAKK3N0cnVjdCBkbV9yYWlkMV9yZWFkX3JlY29yZCB7CisJc3RydWN0IG1pcnJvciAqbTsKKwlzdHJ1Y3QgZG1fYmlvX2RldGFpbHMgZGV0YWlsczsKK307CisKIC8qCiAgKiBFdmVyeSBtaXJyb3Igc2hvdWxkIGxvb2sgbGlrZSB0aGlzIG9uZS4KICAqLwogI2RlZmluZSBERUZBVUxUX01JUlJPUiAwCiAKIC8qCi0gKiBUaGlzIGlzIHl1Y2t5LiAgV2Ugc3F1aXJyZWwgdGhlIG1pcnJvcl9zZXQgc3RydWN0IGF3YXkgaW5zaWRlCi0gKiBiaV9uZXh0IGZvciB3cml0ZSBidWZmZXJzLiAgVGhpcyBpcyBzYWZlIHNpbmNlIHRoZSBiaAorICogVGhpcyBpcyB5dWNreS4gIFdlIHNxdWlycmVsIHRoZSBtaXJyb3Igc3RydWN0IGF3YXkgaW5zaWRlCisgKiBiaV9uZXh0IGZvciByZWFkL3dyaXRlIGJ1ZmZlcnMuICBUaGlzIGlzIHNhZmUgc2luY2UgdGhlIGJoCiAgKiBkb2Vzbid0IGdldCBzdWJtaXR0ZWQgdG8gdGhlIGxvd2VyIGxldmVscyBvZiBibG9jayBsYXllci4KICAqLwotc3RhdGljIHN0cnVjdCBtaXJyb3Jfc2V0ICpiaW9fZ2V0X21zKHN0cnVjdCBiaW8gKmJpbykKK3N0YXRpYyBzdHJ1Y3QgbWlycm9yICpiaW9fZ2V0X20oc3RydWN0IGJpbyAqYmlvKQogewotCXJldHVybiAoc3RydWN0IG1pcnJvcl9zZXQgKikgYmlvLT5iaV9uZXh0OworCXJldHVybiAoc3RydWN0IG1pcnJvciAqKSBiaW8tPmJpX25leHQ7CiB9CiAKLXN0YXRpYyB2b2lkIGJpb19zZXRfbXMoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgbWlycm9yX3NldCAqbXMpCitzdGF0aWMgdm9pZCBiaW9fc2V0X20oc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgbWlycm9yICptKQogewotCWJpby0+YmlfbmV4dCA9IChzdHJ1Y3QgYmlvICopIG1zOworCWJpby0+YmlfbmV4dCA9IChzdHJ1Y3QgYmlvICopIG07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWlycm9yICpnZXRfZGVmYXVsdF9taXJyb3Ioc3RydWN0IG1pcnJvcl9zZXQgKm1zKQoreworCXJldHVybiAmbXMtPm1pcnJvclthdG9taWNfcmVhZCgmbXMtPmRlZmF1bHRfbWlycm9yKV07Cit9CisKK3N0YXRpYyB2b2lkIHNldF9kZWZhdWx0X21pcnJvcihzdHJ1Y3QgbWlycm9yICptKQoreworCXN0cnVjdCBtaXJyb3Jfc2V0ICptcyA9IG0tPm1zOworCXN0cnVjdCBtaXJyb3IgKm0wID0gJihtcy0+bWlycm9yWzBdKTsKKworCWF0b21pY19zZXQoJm1zLT5kZWZhdWx0X21pcnJvciwgbSAtIG0wKTsKK30KKworLyogZmFpbF9taXJyb3IKKyAqIEBtOiBtaXJyb3IgZGV2aWNlIHRvIGZhaWwKKyAqIEBlcnJvcl90eXBlOiBvbmUgb2YgdGhlIGVudW0ncywgRE1fUkFJRDFfKl9FUlJPUgorICoKKyAqIElmIGVycm9ycyBhcmUgYmVpbmcgaGFuZGxlZCwgcmVjb3JkIHRoZSB0eXBlIG9mCisgKiBlcnJvciBlbmNvdW50ZXJlZCBmb3IgdGhpcyBkZXZpY2UuICBJZiB0aGlzIHR5cGUKKyAqIG9mIGVycm9yIGhhcyBhbHJlYWR5IGJlZW4gcmVjb3JkZWQsIHdlIGNhbiByZXR1cm47CisgKiBvdGhlcndpc2UsIHdlIG11c3Qgc2lnbmFsIHVzZXJzcGFjZSBieSB0cmlnZ2VyaW5nCisgKiBhbiBldmVudC4gIEFkZGl0aW9uYWxseSwgaWYgdGhlIGRldmljZSBpcyB0aGUKKyAqIHByaW1hcnkgZGV2aWNlLCB3ZSBtdXN0IGNob29zZSBhIG5ldyBwcmltYXJ5LCBidXQKKyAqIG9ubHkgaWYgdGhlIG1pcnJvciBpcyBpbi1zeW5jLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmxvY2suCisgKi8KK3N0YXRpYyB2b2lkIGZhaWxfbWlycm9yKHN0cnVjdCBtaXJyb3IgKm0sIGVudW0gZG1fcmFpZDFfZXJyb3IgZXJyb3JfdHlwZSkKK3sKKwlzdHJ1Y3QgbWlycm9yX3NldCAqbXMgPSBtLT5tczsKKwlzdHJ1Y3QgbWlycm9yICpuZXc7CisKKwlpZiAoIWVycm9yc19oYW5kbGVkKG1zKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBlcnJvcl9jb3VudCBpcyB1c2VkIGZvciBub3RoaW5nIG1vcmUgdGhhbiBhCisJICogc2ltcGxlIHdheSB0byB0ZWxsIGlmIGEgZGV2aWNlIGhhcyBlbmNvdW50ZXJlZAorCSAqIGVycm9ycy4KKwkgKi8KKwlhdG9taWNfaW5jKCZtLT5lcnJvcl9jb3VudCk7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChlcnJvcl90eXBlLCAmbS0+ZXJyb3JfdHlwZSkpCisJCXJldHVybjsKKworCWlmIChtICE9IGdldF9kZWZhdWx0X21pcnJvcihtcykpCisJCWdvdG8gb3V0OworCisJaWYgKCFtcy0+aW5fc3luYykgeworCQkvKgorCQkgKiBCZXR0ZXIgdG8gaXNzdWUgcmVxdWVzdHMgdG8gc2FtZSBmYWlsaW5nIGRldmljZQorCQkgKiB0aGFuIHRvIHJpc2sgcmV0dXJuaW5nIGNvcnJ1cHQgZGF0YS4KKwkJICovCisJCURNRVJSKCJQcmltYXJ5IG1pcnJvciAoJXMpIGZhaWxlZCB3aGlsZSBvdXQtb2Ytc3luYzogIgorCQkgICAgICAiUmVhZHMgbWF5IGZhaWwuIiwgbS0+ZGV2LT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yIChuZXcgPSBtcy0+bWlycm9yOyBuZXcgPCBtcy0+bWlycm9yICsgbXMtPm5yX21pcnJvcnM7IG5ldysrKQorCQlpZiAoIWF0b21pY19yZWFkKCZuZXctPmVycm9yX2NvdW50KSkgeworCQkJc2V0X2RlZmF1bHRfbWlycm9yKG5ldyk7CisJCQlicmVhazsKKwkJfQorCisJaWYgKHVubGlrZWx5KG5ldyA9PSBtcy0+bWlycm9yICsgbXMtPm5yX21pcnJvcnMpKQorCQlETVdBUk4oIkFsbCBzaWRlcyBvZiBtaXJyb3IgaGF2ZSBmYWlsZWQuIik7CisKK291dDoKKwlzY2hlZHVsZV93b3JrKCZtcy0+dHJpZ2dlcl9ldmVudCk7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTY1NiwxNSArNzU2LDMyIEBACiBzdGF0aWMgdm9pZCByZWNvdmVyeV9jb21wbGV0ZShpbnQgcmVhZF9lcnIsIHVuc2lnbmVkIGludCB3cml0ZV9lcnIsCiAJCQkgICAgICB2b2lkICpjb250ZXh0KQogewotCXN0cnVjdCByZWdpb24gKnJlZyA9IChzdHJ1Y3QgcmVnaW9uICopIGNvbnRleHQ7CisJc3RydWN0IHJlZ2lvbiAqcmVnID0gKHN0cnVjdCByZWdpb24gKiljb250ZXh0OworCXN0cnVjdCBtaXJyb3Jfc2V0ICptcyA9IHJlZy0+cmgtPm1zOworCWludCBtLCBiaXQgPSAwOwogCi0JaWYgKHJlYWRfZXJyKQorCWlmIChyZWFkX2VycikgewogCQkvKiBSZWFkIGVycm9yIG1lYW5zIHRoZSBmYWlsdXJlIG9mIGRlZmF1bHQgbWlycm9yLiAqLwogCQlETUVSUl9MSU1JVCgiVW5hYmxlIHRvIHJlYWQgcHJpbWFyeSBtaXJyb3IgZHVyaW5nIHJlY292ZXJ5Iik7CisJCWZhaWxfbWlycm9yKGdldF9kZWZhdWx0X21pcnJvcihtcyksIERNX1JBSUQxX1NZTkNfRVJST1IpOworCX0KIAotCWlmICh3cml0ZV9lcnIpCisJaWYgKHdyaXRlX2VycikgewogCQlETUVSUl9MSU1JVCgiV3JpdGUgZXJyb3IgZHVyaW5nIHJlY292ZXJ5IChlcnJvciA9IDB4JXgpIiwKIAkJCSAgICB3cml0ZV9lcnIpOworCQkvKgorCQkgKiBCaXRzIGNvcnJlc3BvbmQgdG8gZGV2aWNlcyAoZXhjbHVkaW5nIGRlZmF1bHQgbWlycm9yKS4KKwkJICogVGhlIGRlZmF1bHQgbWlycm9yIGNhbm5vdCBjaGFuZ2UgZHVyaW5nIHJlY292ZXJ5LgorCQkgKi8KKwkJZm9yIChtID0gMDsgbSA8IG1zLT5ucl9taXJyb3JzOyBtKyspIHsKKwkJCWlmICgmbXMtPm1pcnJvclttXSA9PSBnZXRfZGVmYXVsdF9taXJyb3IobXMpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHRlc3RfYml0KGJpdCwgJndyaXRlX2VycikpCisJCQkJZmFpbF9taXJyb3IobXMtPm1pcnJvciArIG0sCisJCQkJCSAgICBETV9SQUlEMV9TWU5DX0VSUk9SKTsKKwkJCWJpdCsrOworCQl9CisJfQogCiAJcmhfcmVjb3ZlcnlfZW5kKHJlZywgIShyZWFkX2VyciB8fCB3cml0ZV9lcnIpKTsKIH0KQEAgLTY3OCw3ICs3OTUsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwogCiAJLyogZmlsbCBpbiB0aGUgc291cmNlICovCi0JbSA9IG1zLT5kZWZhdWx0X21pcnJvcjsKKwltID0gZ2V0X2RlZmF1bHRfbWlycm9yKG1zKTsKIAlmcm9tLmJkZXYgPSBtLT5kZXYtPmJkZXY7CiAJZnJvbS5zZWN0b3IgPSBtLT5vZmZzZXQgKyByZWdpb25fdG9fc2VjdG9yKHJlZy0+cmgsIHJlZy0+a2V5KTsKIAlpZiAocmVnLT5rZXkgPT0gKG1zLT5ucl9yZWdpb25zIC0gMSkpIHsKQEAgLTY5NCw3ICs4MTEsNyBAQAogCiAJLyogZmlsbCBpbiB0aGUgZGVzdGluYXRpb25zICovCiAJZm9yIChpID0gMCwgZGVzdCA9IHRvOyBpIDwgbXMtPm5yX21pcnJvcnM7IGkrKykgewotCQlpZiAoJm1zLT5taXJyb3JbaV0gPT0gbXMtPmRlZmF1bHRfbWlycm9yKQorCQlpZiAoJm1zLT5taXJyb3JbaV0gPT0gZ2V0X2RlZmF1bHRfbWlycm9yKG1zKSkKIAkJCWNvbnRpbnVlOwogCiAJCW0gPSBtcy0+bWlycm9yICsgaTsKQEAgLTc0OCwxNyArODY1LDEwNSBAQAogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIHN0cnVjdCBtaXJyb3IgKmNob29zZV9taXJyb3Ioc3RydWN0IG1pcnJvcl9zZXQgKm1zLCBzZWN0b3JfdCBzZWN0b3IpCiB7Ci0JLyogRklYTUU6IGFkZCByZWFkIGJhbGFuY2luZyAqLwotCXJldHVybiBtcy0+ZGVmYXVsdF9taXJyb3I7CisJc3RydWN0IG1pcnJvciAqbSA9IGdldF9kZWZhdWx0X21pcnJvcihtcyk7CisKKwlkbyB7CisJCWlmIChsaWtlbHkoIWF0b21pY19yZWFkKCZtLT5lcnJvcl9jb3VudCkpKQorCQkJcmV0dXJuIG07CisKKwkJaWYgKG0tLSA9PSBtcy0+bWlycm9yKQorCQkJbSArPSBtcy0+bnJfbWlycm9yczsKKwl9IHdoaWxlIChtICE9IGdldF9kZWZhdWx0X21pcnJvcihtcykpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZGVmYXVsdF9vayhzdHJ1Y3QgbWlycm9yICptKQoreworCXN0cnVjdCBtaXJyb3IgKmRlZmF1bHRfbWlycm9yID0gZ2V0X2RlZmF1bHRfbWlycm9yKG0tPm1zKTsKKworCXJldHVybiAhYXRvbWljX3JlYWQoJmRlZmF1bHRfbWlycm9yLT5lcnJvcl9jb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgbWlycm9yX2F2YWlsYWJsZShzdHJ1Y3QgbWlycm9yX3NldCAqbXMsIHN0cnVjdCBiaW8gKmJpbykKK3sKKwlyZWdpb25fdCByZWdpb24gPSBiaW9fdG9fcmVnaW9uKCZtcy0+cmgsIGJpbyk7CisKKwlpZiAobXMtPnJoLmxvZy0+dHlwZS0+aW5fc3luYyhtcy0+cmgubG9nLCByZWdpb24sIDApKQorCQlyZXR1cm4gY2hvb3NlX21pcnJvcihtcywgIGJpby0+Ymlfc2VjdG9yKSA/IDEgOiAwOworCisJcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiByZW1hcCBhIGJ1ZmZlciB0byBhIHBhcnRpY3VsYXIgbWlycm9yLgogICovCi1zdGF0aWMgdm9pZCBtYXBfYmlvKHN0cnVjdCBtaXJyb3Jfc2V0ICptcywgc3RydWN0IG1pcnJvciAqbSwgc3RydWN0IGJpbyAqYmlvKQorc3RhdGljIHNlY3Rvcl90IG1hcF9zZWN0b3Ioc3RydWN0IG1pcnJvciAqbSwgc3RydWN0IGJpbyAqYmlvKQoreworCXJldHVybiBtLT5vZmZzZXQgKyAoYmlvLT5iaV9zZWN0b3IgLSBtLT5tcy0+dGktPmJlZ2luKTsKK30KKworc3RhdGljIHZvaWQgbWFwX2JpbyhzdHJ1Y3QgbWlycm9yICptLCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJYmlvLT5iaV9iZGV2ID0gbS0+ZGV2LT5iZGV2OwotCWJpby0+Ymlfc2VjdG9yID0gbS0+b2Zmc2V0ICsgKGJpby0+Ymlfc2VjdG9yIC0gbXMtPnRpLT5iZWdpbik7CisJYmlvLT5iaV9zZWN0b3IgPSBtYXBfc2VjdG9yKG0sIGJpbyk7Cit9CisKK3N0YXRpYyB2b2lkIG1hcF9yZWdpb24oc3RydWN0IGlvX3JlZ2lvbiAqaW8sIHN0cnVjdCBtaXJyb3IgKm0sCisJCSAgICAgICBzdHJ1Y3QgYmlvICpiaW8pCit7CisJaW8tPmJkZXYgPSBtLT5kZXYtPmJkZXY7CisJaW8tPnNlY3RvciA9IG1hcF9zZWN0b3IobSwgYmlvKTsKKwlpby0+Y291bnQgPSBiaW8tPmJpX3NpemUgPj4gOTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVhZHMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIHJlYWRfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBlcnJvciwgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgYmlvICpiaW8gPSBjb250ZXh0OworCXN0cnVjdCBtaXJyb3IgKm07CisKKwltID0gYmlvX2dldF9tKGJpbyk7CisJYmlvX3NldF9tKGJpbywgTlVMTCk7CisKKwlpZiAobGlrZWx5KCFlcnJvcikpIHsKKwkJYmlvX2VuZGlvKGJpbywgMCk7CisJCXJldHVybjsKKwl9CisKKwlmYWlsX21pcnJvcihtLCBETV9SQUlEMV9SRUFEX0VSUk9SKTsKKworCWlmIChsaWtlbHkoZGVmYXVsdF9vayhtKSkgfHwgbWlycm9yX2F2YWlsYWJsZShtLT5tcywgYmlvKSkgeworCQlETVdBUk5fTElNSVQoIlJlYWQgZmFpbHVyZSBvbiBtaXJyb3IgZGV2aWNlICVzLiAgIgorCQkJICAgICAiVHJ5aW5nIGFsdGVybmF0aXZlIGRldmljZS4iLAorCQkJICAgICBtLT5kZXYtPm5hbWUpOworCQlxdWV1ZV9iaW8obS0+bXMsIGJpbywgYmlvX3J3KGJpbykpOworCQlyZXR1cm47CisJfQorCisJRE1FUlJfTElNSVQoIlJlYWQgZmFpbHVyZSBvbiBtaXJyb3IgZGV2aWNlICVzLiAgRmFpbGluZyBJL08uIiwKKwkJICAgIG0tPmRldi0+bmFtZSk7CisJYmlvX2VuZGlvKGJpbywgLUVJTyk7Cit9CisKKy8qIEFzeW5jaHJvbm91cyByZWFkLiAqLworc3RhdGljIHZvaWQgcmVhZF9hc3luY19iaW8oc3RydWN0IG1pcnJvciAqbSwgc3RydWN0IGJpbyAqYmlvKQoreworCXN0cnVjdCBpb19yZWdpb24gaW87CisJc3RydWN0IGRtX2lvX3JlcXVlc3QgaW9fcmVxID0geworCQkuYmlfcncgPSBSRUFELAorCQkubWVtLnR5cGUgPSBETV9JT19CVkVDLAorCQkubWVtLnB0ci5idmVjID0gYmlvLT5iaV9pb192ZWMgKyBiaW8tPmJpX2lkeCwKKwkJLm5vdGlmeS5mbiA9IHJlYWRfY2FsbGJhY2ssCisJCS5ub3RpZnkuY29udGV4dCA9IGJpbywKKwkJLmNsaWVudCA9IG0tPm1zLT5pb19jbGllbnQsCisJfTsKKworCW1hcF9yZWdpb24oJmlvLCBtLCBiaW8pOworCWJpb19zZXRfbShiaW8sIG0pOworCSh2b2lkKSBkbV9pbygmaW9fcmVxLCAxLCAmaW8sIE5VTEwpOwogfQogCiBzdGF0aWMgdm9pZCBkb19yZWFkcyhzdHJ1Y3QgbWlycm9yX3NldCAqbXMsIHN0cnVjdCBiaW9fbGlzdCAqcmVhZHMpCkBAIC03NjksMTcgKzk3NCwyMCBAQAogCiAJd2hpbGUgKChiaW8gPSBiaW9fbGlzdF9wb3AocmVhZHMpKSkgewogCQlyZWdpb24gPSBiaW9fdG9fcmVnaW9uKCZtcy0+cmgsIGJpbyk7CisJCW0gPSBnZXRfZGVmYXVsdF9taXJyb3IobXMpOwogCiAJCS8qCiAJCSAqIFdlIGNhbiBvbmx5IHJlYWQgYmFsYW5jZSBpZiB0aGUgcmVnaW9uIGlzIGluIHN5bmMuCiAJCSAqLwotCQlpZiAocmhfaW5fc3luYygmbXMtPnJoLCByZWdpb24sIDEpKQorCQlpZiAobGlrZWx5KHJoX2luX3N5bmMoJm1zLT5yaCwgcmVnaW9uLCAxKSkpCiAJCQltID0gY2hvb3NlX21pcnJvcihtcywgYmlvLT5iaV9zZWN0b3IpOwotCQllbHNlCi0JCQltID0gbXMtPmRlZmF1bHRfbWlycm9yOworCQllbHNlIGlmIChtICYmIGF0b21pY19yZWFkKCZtLT5lcnJvcl9jb3VudCkpCisJCQltID0gTlVMTDsKIAotCQltYXBfYmlvKG1zLCBtLCBiaW8pOwotCQlnZW5lcmljX21ha2VfcmVxdWVzdChiaW8pOworCQlpZiAobGlrZWx5KG0pKQorCQkJcmVhZF9hc3luY19iaW8obSwgYmlvKTsKKwkJZWxzZQorCQkJYmlvX2VuZGlvKGJpbywgLUVJTyk7CiAJfQogfQogCkBAIC03OTMsMTUgKzEwMDEsNzAgQEAKICAqIFJFQ09WRVJJTkc6CWRlbGF5IHRoZSBpbyB1bnRpbCByZWNvdmVyeSBjb21wbGV0ZXMKICAqIE5PU1lOQzoJaW5jcmVtZW50IHBlbmRpbmcsIGp1c3Qgd3JpdGUgdG8gdGhlIGRlZmF1bHQgbWlycm9yCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIF9fYmlvX21hcmtfbm9zeW5jCisgKiBAbXMKKyAqIEBiaW8KKyAqIEBkb25lCisgKiBAZXJyb3IKKyAqCisgKiBUaGUgYmlvIHdhcyB3cml0dGVuIG9uIHNvbWUgbWlycm9yKHMpIGJ1dCBmYWlsZWQgb24gb3RoZXIgbWlycm9yKHMpLgorICogV2UgY2FuIHN1Y2Nlc3NmdWxseSBlbmRpbyB0aGUgYmlvIGJ1dCBzaG91bGQgYXZvaWQgdGhlIHJlZ2lvbiBiZWluZworICogbWFya2VkIGNsZWFuIGJ5IHNldHRpbmcgdGhlIHN0YXRlIFJIX05PU1lOQy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIF9ub3RfIHNhZmUgaW4gaW50ZXJydXB0IGNvbnRleHQhCisgKi8KK3N0YXRpYyB2b2lkIF9fYmlvX21hcmtfbm9zeW5jKHN0cnVjdCBtaXJyb3Jfc2V0ICptcywKKwkJCSAgICAgIHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgZG9uZSwgaW50IGVycm9yKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHJlZ2lvbl9oYXNoICpyaCA9ICZtcy0+cmg7CisJc3RydWN0IGRpcnR5X2xvZyAqbG9nID0gbXMtPnJoLmxvZzsKKwlzdHJ1Y3QgcmVnaW9uICpyZWc7CisJcmVnaW9uX3QgcmVnaW9uID0gYmlvX3RvX3JlZ2lvbihyaCwgYmlvKTsKKwlpbnQgcmVjb3ZlcmluZyA9IDA7CisKKwkvKiBXZSBtdXN0IGluZm9ybSB0aGUgbG9nIHRoYXQgdGhlIHN5bmMgY291bnQgaGFzIGNoYW5nZWQuICovCisJbG9nLT50eXBlLT5zZXRfcmVnaW9uX3N5bmMobG9nLCByZWdpb24sIDApOworCW1zLT5pbl9zeW5jID0gMDsKKworCXJlYWRfbG9jaygmcmgtPmhhc2hfbG9jayk7CisJcmVnID0gX19yaF9maW5kKHJoLCByZWdpb24pOworCXJlYWRfdW5sb2NrKCZyaC0+aGFzaF9sb2NrKTsKKworCS8qIHJlZ2lvbiBoYXNoIGVudHJ5IHNob3VsZCBleGlzdCBiZWNhdXNlIHdyaXRlIHdhcyBpbi1mbGlnaHQgKi8KKwlCVUdfT04oIXJlZyk7CisJQlVHX09OKCFsaXN0X2VtcHR5KCZyZWctPmxpc3QpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyaC0+cmVnaW9uX2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqIFBvc3NpYmxlIGNhc2VzOgorCSAqICAgMSkgUkhfRElSVFkKKwkgKiAgIDIpIFJIX05PU1lOQzogd2FzIGRpcnR5LCBvdGhlciBwcmVjZWVkaW5nIHdyaXRlcyBmYWlsZWQKKwkgKiAgIDMpIFJIX1JFQ09WRVJJTkc6IGZsdXNoaW5nIHBlbmRpbmcgd3JpdGVzCisJICogRWl0aGVyIGNhc2UsIHRoZSByZWdpb24gc2hvdWxkIGhhdmUgbm90IGJlZW4gY29ubmVjdGVkIHRvIGxpc3QuCisJICovCisJcmVjb3ZlcmluZyA9IChyZWctPnN0YXRlID09IFJIX1JFQ09WRVJJTkcpOworCXJlZy0+c3RhdGUgPSBSSF9OT1NZTkM7CisJQlVHX09OKCFsaXN0X2VtcHR5KCZyZWctPmxpc3QpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyaC0+cmVnaW9uX2xvY2ssIGZsYWdzKTsKKworCWJpb19lbmRpbyhiaW8sIGVycm9yKTsKKwlpZiAocmVjb3ZlcmluZykKKwkJY29tcGxldGVfcmVzeW5jX3dvcmsocmVnLCAwKTsKK30KKwogc3RhdGljIHZvaWQgd3JpdGVfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBlcnJvciwgdm9pZCAqY29udGV4dCkKIHsKLQl1bnNpZ25lZCBpbnQgaTsKLQlpbnQgdXB0b2RhdGUgPSAxOworCXVuc2lnbmVkIGksIHJldCA9IDA7CiAJc3RydWN0IGJpbyAqYmlvID0gKHN0cnVjdCBiaW8gKikgY29udGV4dDsKIAlzdHJ1Y3QgbWlycm9yX3NldCAqbXM7CisJaW50IHVwdG9kYXRlID0gMDsKKwlpbnQgc2hvdWxkX3dha2UgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQltcyA9IGJpb19nZXRfbXMoYmlvKTsKLQliaW9fc2V0X21zKGJpbywgTlVMTCk7CisJbXMgPSBiaW9fZ2V0X20oYmlvKS0+bXM7CisJYmlvX3NldF9tKGJpbywgTlVMTCk7CiAKIAkvKgogCSAqIE5PVEU6IFdlIGRvbid0IGRlY3JlbWVudCB0aGUgcGVuZGluZyBjb3VudCBoZXJlLApAQCAtODA5LDI2ICsxMDcyLDQyIEBACiAJICogVGhpcyB3YXkgd2UgaGFuZGxlIGJvdGggd3JpdGVzIHRvIFNZTkMgYW5kIE5PU1lOQwogCSAqIHJlZ2lvbnMgd2l0aCB0aGUgc2FtZSBjb2RlLgogCSAqLworCWlmIChsaWtlbHkoIWVycm9yKSkKKwkJZ290byBvdXQ7CiAKLQlpZiAoZXJyb3IpIHsKKwlmb3IgKGkgPSAwOyBpIDwgbXMtPm5yX21pcnJvcnM7IGkrKykKKwkJaWYgKHRlc3RfYml0KGksICZlcnJvcikpCisJCQlmYWlsX21pcnJvcihtcy0+bWlycm9yICsgaSwgRE1fUkFJRDFfV1JJVEVfRVJST1IpOworCQllbHNlCisJCQl1cHRvZGF0ZSA9IDE7CisKKwlpZiAodW5saWtlbHkoIXVwdG9kYXRlKSkgeworCQlETUVSUigiQWxsIHJlcGxpY2F0ZWQgdm9sdW1lcyBkZWFkLCBmYWlsaW5nIEkvTyIpOworCQkvKiBOb25lIG9mIHRoZSB3cml0ZXMgc3VjY2VlZGVkLCBmYWlsIHRoZSBJL08uICovCisJCXJldCA9IC1FSU87CisJfSBlbHNlIGlmIChlcnJvcnNfaGFuZGxlZChtcykpIHsKIAkJLyoKLQkJICogb25seSBlcnJvciB0aGUgaW8gaWYgYWxsIG1pcnJvcnMgZmFpbGVkLgotCQkgKiBGSVhNRTogYm9ndXMKKwkJICogTmVlZCB0byByYWlzZSBldmVudC4gIFNpbmNlIHJhaXNpbmcKKwkJICogZXZlbnRzIGNhbiBibG9jaywgd2UgbmVlZCB0byBkbyBpdCBpbgorCQkgKiB0aGUgbWFpbiB0aHJlYWQuCiAJCSAqLwotCQl1cHRvZGF0ZSA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCBtcy0+bnJfbWlycm9yczsgaSsrKQotCQkJaWYgKCF0ZXN0X2JpdChpLCAmZXJyb3IpKSB7Ci0JCQkJdXB0b2RhdGUgPSAxOwotCQkJCWJyZWFrOwotCQkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKCFtcy0+ZmFpbHVyZXMuaGVhZCkKKwkJCXNob3VsZF93YWtlID0gMTsKKwkJYmlvX2xpc3RfYWRkKCZtcy0+ZmFpbHVyZXMsIGJpbyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zLT5sb2NrLCBmbGFncyk7CisJCWlmIChzaG91bGRfd2FrZSkKKwkJCXdha2UobXMpOworCQlyZXR1cm47CiAJfQotCWJpb19lbmRpbyhiaW8sIDApOworb3V0OgorCWJpb19lbmRpbyhiaW8sIHJldCk7CiB9CiAKIHN0YXRpYyB2b2lkIGRvX3dyaXRlKHN0cnVjdCBtaXJyb3Jfc2V0ICptcywgc3RydWN0IGJpbyAqYmlvKQogewogCXVuc2lnbmVkIGludCBpOwotCXN0cnVjdCBpb19yZWdpb24gaW9bS0NPUFlEX01BWF9SRUdJT05TKzFdOworCXN0cnVjdCBpb19yZWdpb24gaW9bbXMtPm5yX21pcnJvcnNdLCAqZGVzdCA9IGlvOwogCXN0cnVjdCBtaXJyb3IgKm07CiAJc3RydWN0IGRtX2lvX3JlcXVlc3QgaW9fcmVxID0gewogCQkuYmlfcncgPSBXUklURSwKQEAgLTgzOSwxNSArMTExOCwxNCBAQAogCQkuY2xpZW50ID0gbXMtPmlvX2NsaWVudCwKIAl9OwogCi0JZm9yIChpID0gMDsgaSA8IG1zLT5ucl9taXJyb3JzOyBpKyspIHsKLQkJbSA9IG1zLT5taXJyb3IgKyBpOworCWZvciAoaSA9IDAsIG0gPSBtcy0+bWlycm9yOyBpIDwgbXMtPm5yX21pcnJvcnM7IGkrKywgbSsrKQorCQltYXBfcmVnaW9uKGRlc3QrKywgbSwgYmlvKTsKIAotCQlpb1tpXS5iZGV2ID0gbS0+ZGV2LT5iZGV2OwotCQlpb1tpXS5zZWN0b3IgPSBtLT5vZmZzZXQgKyAoYmlvLT5iaV9zZWN0b3IgLSBtcy0+dGktPmJlZ2luKTsKLQkJaW9baV0uY291bnQgPSBiaW8tPmJpX3NpemUgPj4gOTsKLQl9Ci0KLQliaW9fc2V0X21zKGJpbywgbXMpOworCS8qCisJICogVXNlIGRlZmF1bHQgbWlycm9yIGJlY2F1c2Ugd2Ugb25seSBuZWVkIGl0IHRvIHJldHJpZXZlIHRoZSByZWZlcmVuY2UKKwkgKiB0byB0aGUgbWlycm9yIHNldCBpbiB3cml0ZV9jYWxsYmFjaygpLgorCSAqLworCWJpb19zZXRfbShiaW8sIGdldF9kZWZhdWx0X21pcnJvcihtcykpOwogCiAJKHZvaWQpIGRtX2lvKCZpb19yZXEsIG1zLT5ucl9taXJyb3JzLCBpbywgTlVMTCk7CiB9CkBAIC05MDAsNDMgKzExNzgsMTI1IEBACiAJLyoKIAkgKiBEaXNwYXRjaCBpby4KIAkgKi8KLQlpZiAodW5saWtlbHkobXMtPmxvZ19mYWlsdXJlKSkKKwlpZiAodW5saWtlbHkobXMtPmxvZ19mYWlsdXJlKSkgeworCQlzcGluX2xvY2tfaXJxKCZtcy0+bG9jayk7CisJCWJpb19saXN0X21lcmdlKCZtcy0+ZmFpbHVyZXMsICZzeW5jKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZtcy0+bG9jayk7CisJfSBlbHNlCiAJCXdoaWxlICgoYmlvID0gYmlvX2xpc3RfcG9wKCZzeW5jKSkpCi0JCQliaW9fZW5kaW8oYmlvLCAtRUlPKTsKLQllbHNlIHdoaWxlICgoYmlvID0gYmlvX2xpc3RfcG9wKCZzeW5jKSkpCi0JCWRvX3dyaXRlKG1zLCBiaW8pOworCQkJZG9fd3JpdGUobXMsIGJpbyk7CiAKIAl3aGlsZSAoKGJpbyA9IGJpb19saXN0X3BvcCgmcmVjb3ZlcikpKQogCQlyaF9kZWxheSgmbXMtPnJoLCBiaW8pOwogCiAJd2hpbGUgKChiaW8gPSBiaW9fbGlzdF9wb3AoJm5vc3luYykpKSB7Ci0JCW1hcF9iaW8obXMsIG1zLT5kZWZhdWx0X21pcnJvciwgYmlvKTsKKwkJbWFwX2JpbyhnZXRfZGVmYXVsdF9taXJyb3IobXMpLCBiaW8pOwogCQlnZW5lcmljX21ha2VfcmVxdWVzdChiaW8pOwogCX0KIH0KIAorc3RhdGljIHZvaWQgZG9fZmFpbHVyZXMoc3RydWN0IG1pcnJvcl9zZXQgKm1zLCBzdHJ1Y3QgYmlvX2xpc3QgKmZhaWx1cmVzKQoreworCXN0cnVjdCBiaW8gKmJpbzsKKworCWlmICghZmFpbHVyZXMtPmhlYWQpCisJCXJldHVybjsKKworCWlmICghbXMtPmxvZ19mYWlsdXJlKSB7CisJCXdoaWxlICgoYmlvID0gYmlvX2xpc3RfcG9wKGZhaWx1cmVzKSkpCisJCQlfX2Jpb19tYXJrX25vc3luYyhtcywgYmlvLCBiaW8tPmJpX3NpemUsIDApOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBJZiB0aGUgbG9nIGhhcyBmYWlsZWQsIHVuYXR0ZW1wdGVkIHdyaXRlcyBhcmUgYmVpbmcKKwkgKiBwdXQgb24gdGhlIGZhaWx1cmVzIGxpc3QuICBXZSBjYW4ndCBpc3N1ZSB0aG9zZSB3cml0ZXMKKwkgKiB1bnRpbCBhIGxvZyBoYXMgYmVlbiBtYXJrZWQsIHNvIHdlIG11c3Qgc3RvcmUgdGhlbS4KKwkgKgorCSAqIElmIGEgJ25vZmx1c2gnIHN1c3BlbmQgaXMgaW4gcHJvZ3Jlc3MsIHdlIGNhbiByZXF1ZXVlCisJICogdGhlIEkvTydzIHRvIHRoZSBjb3JlLiAgVGhpcyBnaXZlIHVzZXJzcGFjZSBhIGNoYW5jZQorCSAqIHRvIHJlY29uZmlndXJlIHRoZSBtaXJyb3IsIGF0IHdoaWNoIHBvaW50IHRoZSBjb3JlCisJICogd2lsbCByZWlzc3VlIHRoZSB3cml0ZXMuICBJZiB0aGUgJ25vZmx1c2gnIGZsYWcgaXMKKwkgKiBub3Qgc2V0LCB3ZSBoYXZlIG5vIGNob2ljZSBidXQgdG8gcmV0dXJuIGVycm9ycy4KKwkgKgorCSAqIFNvbWUgd3JpdGVzIG9uIHRoZSBmYWlsdXJlcyBsaXN0IG1heSBoYXZlIGJlZW4KKwkgKiBzdWJtaXR0ZWQgYmVmb3JlIHRoZSBsb2cgZmFpbHVyZSBhbmQgcmVwcmVzZW50IGEKKwkgKiBmYWlsdXJlIHRvIHdyaXRlIHRvIG9uZSBvZiB0aGUgZGV2aWNlcy4gIEl0IGlzIG9rCisJICogZm9yIHVzIHRvIHRyZWF0IHRoZW0gdGhlIHNhbWUgYW5kIHJlcXVldWUgdGhlbQorCSAqIGFzIHdlbGwuCisJICovCisJaWYgKGRtX25vZmx1c2hfc3VzcGVuZGluZyhtcy0+dGkpKSB7CisJCXdoaWxlICgoYmlvID0gYmlvX2xpc3RfcG9wKGZhaWx1cmVzKSkpCisJCQliaW9fZW5kaW8oYmlvLCBETV9FTkRJT19SRVFVRVVFKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChhdG9taWNfcmVhZCgmbXMtPnN1c3BlbmQpKSB7CisJCXdoaWxlICgoYmlvID0gYmlvX2xpc3RfcG9wKGZhaWx1cmVzKSkpCisJCQliaW9fZW5kaW8oYmlvLCAtRUlPKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnEoJm1zLT5sb2NrKTsKKwliaW9fbGlzdF9tZXJnZSgmbXMtPmZhaWx1cmVzLCBmYWlsdXJlcyk7CisJc3Bpbl91bmxvY2tfaXJxKCZtcy0+bG9jayk7CisKKwl3YWtlKG1zKTsKK30KKworc3RhdGljIHZvaWQgdHJpZ2dlcl9ldmVudChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IG1pcnJvcl9zZXQgKm1zID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBtaXJyb3Jfc2V0LCB0cmlnZ2VyX2V2ZW50KTsKKworCWRtX3RhYmxlX2V2ZW50KG1zLT50aS0+dGFibGUpOworfQorCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBrbWlycm9yZAogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgZG9fbWlycm9yKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyBpbnQgX2RvX21pcnJvcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IG1pcnJvcl9zZXQgKm1zID1jb250YWluZXJfb2Yod29yaywgc3RydWN0IG1pcnJvcl9zZXQsCiAJCQkJCSAgICBrbWlycm9yZF93b3JrKTsKLQlzdHJ1Y3QgYmlvX2xpc3QgcmVhZHMsIHdyaXRlczsKKwlzdHJ1Y3QgYmlvX2xpc3QgcmVhZHMsIHdyaXRlcywgZmFpbHVyZXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9jaygmbXMtPmxvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZtcy0+bG9jaywgZmxhZ3MpOwogCXJlYWRzID0gbXMtPnJlYWRzOwogCXdyaXRlcyA9IG1zLT53cml0ZXM7CisJZmFpbHVyZXMgPSBtcy0+ZmFpbHVyZXM7CiAJYmlvX2xpc3RfaW5pdCgmbXMtPnJlYWRzKTsKIAliaW9fbGlzdF9pbml0KCZtcy0+d3JpdGVzKTsKLQlzcGluX3VubG9jaygmbXMtPmxvY2spOworCWJpb19saXN0X2luaXQoJm1zLT5mYWlsdXJlcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXMtPmxvY2ssIGZsYWdzKTsKIAogCXJoX3VwZGF0ZV9zdGF0ZXMoJm1zLT5yaCk7CiAJZG9fcmVjb3ZlcnkobXMpOwogCWRvX3JlYWRzKG1zLCAmcmVhZHMpOwogCWRvX3dyaXRlcyhtcywgJndyaXRlcyk7CisJZG9fZmFpbHVyZXMobXMsICZmYWlsdXJlcyk7CisKKwlyZXR1cm4gKG1zLT5mYWlsdXJlcy5oZWFkKSA/IDEgOiAwOwogfQogCitzdGF0aWMgdm9pZCBkb19taXJyb3Ioc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCS8qCisJICogSWYgX2RvX21pcnJvciByZXR1cm5zIDEsIHdlIGdpdmUgaXQKKwkgKiBhbm90aGVyIHNob3QuICBUaGlzIGhlbHBzIGZvciBjYXNlcyBsaWtlCisJICogJ3N1c3BlbmQnIHdoZXJlIHdlIGNhbGwgZmx1c2hfd29ya3F1ZXVlCisJICogYW5kIGV4cGVjdCBhbGwgd29yayB0byBiZSBmaW5pc2hlZC4gIElmCisJICogYSBmYWlsdXJlIGhhcHBlbnMgZHVyaW5nIGEgc3VzcGVuZCwgd2UKKwkgKiBjb3VsZG4ndCBpc3N1ZSBhICd3YWtlJyBiZWNhdXNlIGl0IHdvdWxkCisJICogbm90IGJlIGhvbm9yZWQuICBUaGVyZWZvcmUsIHdlIHJldHVybiAnMScKKwkgKiBmcm9tIF9kb19taXJyb3IsIGFuZCByZXRyeSBoZXJlLgorCSAqLworCXdoaWxlIChfZG9fbWlycm9yKHdvcmspKQorCQlzY2hlZHVsZSgpOworfQorCisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIFRhcmdldCBmdW5jdGlvbnMKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTk2NSwxMSArMTMyNSwyMyBAQAogCW1zLT5ucl9taXJyb3JzID0gbnJfbWlycm9yczsKIAltcy0+bnJfcmVnaW9ucyA9IGRtX3NlY3Rvcl9kaXZfdXAodGktPmxlbiwgcmVnaW9uX3NpemUpOwogCW1zLT5pbl9zeW5jID0gMDsKLQltcy0+ZGVmYXVsdF9taXJyb3IgPSAmbXMtPm1pcnJvcltERUZBVUxUX01JUlJPUl07CisJbXMtPmxvZ19mYWlsdXJlID0gMDsKKwlhdG9taWNfc2V0KCZtcy0+c3VzcGVuZCwgMCk7CisJYXRvbWljX3NldCgmbXMtPmRlZmF1bHRfbWlycm9yLCBERUZBVUxUX01JUlJPUik7CisKKwlsZW4gPSBzaXplb2Yoc3RydWN0IGRtX3JhaWQxX3JlYWRfcmVjb3JkKTsKKwltcy0+cmVhZF9yZWNvcmRfcG9vbCA9IG1lbXBvb2xfY3JlYXRlX2ttYWxsb2NfcG9vbChNSU5fUkVBRF9SRUNPUkRTLAorCQkJCQkJCSAgIGxlbik7CisJaWYgKCFtcy0+cmVhZF9yZWNvcmRfcG9vbCkgeworCQl0aS0+ZXJyb3IgPSAiRXJyb3IgY3JlYXRpbmcgbWlycm9yIHJlYWRfcmVjb3JkX3Bvb2wiOworCQlrZnJlZShtcyk7CisJCXJldHVybiBOVUxMOworCX0KIAogCW1zLT5pb19jbGllbnQgPSBkbV9pb19jbGllbnRfY3JlYXRlKERNX0lPX1BBR0VTKTsKIAlpZiAoSVNfRVJSKG1zLT5pb19jbGllbnQpKSB7CiAJCXRpLT5lcnJvciA9ICJFcnJvciBjcmVhdGluZyBkbV9pbyBjbGllbnQiOworCQltZW1wb29sX2Rlc3Ryb3kobXMtPnJlYWRfcmVjb3JkX3Bvb2wpOwogCQlrZnJlZShtcyk7CiAgCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC05NzcsNiArMTM0OSw3IEBACiAJaWYgKHJoX2luaXQoJm1zLT5yaCwgbXMsIGRsLCByZWdpb25fc2l6ZSwgbXMtPm5yX3JlZ2lvbnMpKSB7CiAJCXRpLT5lcnJvciA9ICJFcnJvciBjcmVhdGluZyBkaXJ0eSByZWdpb24gaGFzaCI7CiAJCWRtX2lvX2NsaWVudF9kZXN0cm95KG1zLT5pb19jbGllbnQpOworCQltZW1wb29sX2Rlc3Ryb3kobXMtPnJlYWRfcmVjb3JkX3Bvb2wpOwogCQlrZnJlZShtcyk7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTk5Miw2ICsxMzY1LDcgQEAKIAogCWRtX2lvX2NsaWVudF9kZXN0cm95KG1zLT5pb19jbGllbnQpOwogCXJoX2V4aXQoJm1zLT5yaCk7CisJbWVtcG9vbF9kZXN0cm95KG1zLT5yZWFkX3JlY29yZF9wb29sKTsKIAlrZnJlZShtcyk7CiB9CiAKQEAgLTEwMTksNiArMTM5Myw4IEBACiAJfQogCiAJbXMtPm1pcnJvclttaXJyb3JdLm1zID0gbXM7CisJYXRvbWljX3NldCgmKG1zLT5taXJyb3JbbWlycm9yXS5lcnJvcl9jb3VudCksIDApOworCW1zLT5taXJyb3JbbWlycm9yXS5lcnJvcl90eXBlID0gMDsKIAltcy0+bWlycm9yW21pcnJvcl0ub2Zmc2V0ID0gb2Zmc2V0OwogCiAJcmV0dXJuIDA7CkBAIC0xMTcxLDYgKzE1NDcsNyBAQAogCQlnb3RvIGVycl9mcmVlX2NvbnRleHQ7CiAJfQogCUlOSVRfV09SSygmbXMtPmttaXJyb3JkX3dvcmssIGRvX21pcnJvcik7CisJSU5JVF9XT1JLKCZtcy0+dHJpZ2dlcl9ldmVudCwgdHJpZ2dlcl9ldmVudCk7CiAKIAlyID0gcGFyc2VfZmVhdHVyZXMobXMsIGFyZ2MsIGFyZ3YsICZhcmdzX3VzZWQpOwogCWlmIChyKQpAQCAtMTIyMCwxNCArMTU5NywxNSBAQAogCiBzdGF0aWMgdm9pZCBxdWV1ZV9iaW8oc3RydWN0IG1pcnJvcl9zZXQgKm1zLCBzdHJ1Y3QgYmlvICpiaW8sIGludCBydykKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBzaG91bGRfd2FrZSA9IDA7CiAJc3RydWN0IGJpb19saXN0ICpibDsKIAogCWJsID0gKHJ3ID09IFdSSVRFKSA/ICZtcy0+d3JpdGVzIDogJm1zLT5yZWFkczsKLQlzcGluX2xvY2soJm1zLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXMtPmxvY2ssIGZsYWdzKTsKIAlzaG91bGRfd2FrZSA9ICEoYmwtPmhlYWQpOwogCWJpb19saXN0X2FkZChibCwgYmlvKTsKLQlzcGluX3VubG9jaygmbXMtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zLT5sb2NrLCBmbGFncyk7CiAKIAlpZiAoc2hvdWxkX3dha2UpCiAJCXdha2UobXMpOwpAQCAtMTI0MiwxMCArMTYyMCwxMSBAQAogCWludCByLCBydyA9IGJpb19ydyhiaW8pOwogCXN0cnVjdCBtaXJyb3IgKm07CiAJc3RydWN0IG1pcnJvcl9zZXQgKm1zID0gdGktPnByaXZhdGU7Ci0KLQltYXBfY29udGV4dC0+bGwgPSBiaW9fdG9fcmVnaW9uKCZtcy0+cmgsIGJpbyk7CisJc3RydWN0IGRtX3JhaWQxX3JlYWRfcmVjb3JkICpyZWFkX3JlY29yZCA9IE5VTEw7CiAKIAlpZiAocncgPT0gV1JJVEUpIHsKKwkJLyogU2F2ZSByZWdpb24gZm9yIG1pcnJvcl9lbmRfaW8oKSBoYW5kbGVyICovCisJCW1hcF9jb250ZXh0LT5sbCA9IGJpb190b19yZWdpb24oJm1zLT5yaCwgYmlvKTsKIAkJcXVldWVfYmlvKG1zLCBiaW8sIHJ3KTsKIAkJcmV0dXJuIERNX01BUElPX1NVQk1JVFRFRDsKIAl9CkBAIC0xMjU1LDI4ICsxNjM0LDM0IEBACiAJaWYgKHIgPCAwICYmIHIgIT0gLUVXT1VMREJMT0NLKQogCQlyZXR1cm4gcjsKIAotCWlmIChyID09IC1FV09VTERCTE9DSykJLyogRklYTUU6IHVnbHkgKi8KLQkJciA9IERNX01BUElPX1NVQk1JVFRFRDsKLQogCS8qCi0JICogV2UgZG9uJ3Qgd2FudCB0byBmYXN0IHRyYWNrIGEgcmVjb3ZlcnkganVzdCBmb3IgYSByZWFkCi0JICogYWhlYWQuICBTbyB3ZSBqdXN0IGxldCBpdCBzaWxlbnRseSBmYWlsLgotCSAqIEZJWE1FOiBnZXQgcmlkIG9mIHRoaXMuCisJICogSWYgcmVnaW9uIGlzIG5vdCBpbi1zeW5jIHF1ZXVlIHRoZSBiaW8uCiAJICovCi0JaWYgKCFyICYmIHJ3ID09IFJFQURBKQotCQlyZXR1cm4gLUVJTzsKKwlpZiAoIXIgfHwgKHIgPT0gLUVXT1VMREJMT0NLKSkgeworCQlpZiAocncgPT0gUkVBREEpCisJCQlyZXR1cm4gLUVXT1VMREJMT0NLOwogCi0JaWYgKCFyKSB7Ci0JCS8qIFBhc3MgdGhpcyBpbyBvdmVyIHRvIHRoZSBkYWVtb24gKi8KIAkJcXVldWVfYmlvKG1zLCBiaW8sIHJ3KTsKIAkJcmV0dXJuIERNX01BUElPX1NVQk1JVFRFRDsKIAl9CiAKKwkvKgorCSAqIFRoZSByZWdpb24gaXMgaW4tc3luYyBhbmQgd2UgY2FuIHBlcmZvcm0gcmVhZHMgZGlyZWN0bHkuCisJICogU3RvcmUgZW5vdWdoIGluZm9ybWF0aW9uIHNvIHdlIGNhbiByZXRyeSBpZiBpdCBmYWlscy4KKwkgKi8KIAltID0gY2hvb3NlX21pcnJvcihtcywgYmlvLT5iaV9zZWN0b3IpOwotCWlmICghbSkKKwlpZiAodW5saWtlbHkoIW0pKQogCQlyZXR1cm4gLUVJTzsKIAotCW1hcF9iaW8obXMsIG0sIGJpbyk7CisJcmVhZF9yZWNvcmQgPSBtZW1wb29sX2FsbG9jKG1zLT5yZWFkX3JlY29yZF9wb29sLCBHRlBfTk9JTyk7CisJaWYgKGxpa2VseShyZWFkX3JlY29yZCkpIHsKKwkJZG1fYmlvX3JlY29yZCgmcmVhZF9yZWNvcmQtPmRldGFpbHMsIGJpbyk7CisJCW1hcF9jb250ZXh0LT5wdHIgPSByZWFkX3JlY29yZDsKKwkJcmVhZF9yZWNvcmQtPm0gPSBtOworCX0KKworCW1hcF9iaW8obSwgYmlvKTsKKwogCXJldHVybiBETV9NQVBJT19SRU1BUFBFRDsKIH0KIApAQCAtMTI4NSw3MSArMTY3MCwxNzMgQEAKIHsKIAlpbnQgcncgPSBiaW9fcncoYmlvKTsKIAlzdHJ1Y3QgbWlycm9yX3NldCAqbXMgPSAoc3RydWN0IG1pcnJvcl9zZXQgKikgdGktPnByaXZhdGU7Ci0JcmVnaW9uX3QgcmVnaW9uID0gbWFwX2NvbnRleHQtPmxsOworCXN0cnVjdCBtaXJyb3IgKm0gPSBOVUxMOworCXN0cnVjdCBkbV9iaW9fZGV0YWlscyAqYmQgPSBOVUxMOworCXN0cnVjdCBkbV9yYWlkMV9yZWFkX3JlY29yZCAqcmVhZF9yZWNvcmQgPSBtYXBfY29udGV4dC0+cHRyOwogCiAJLyoKIAkgKiBXZSBuZWVkIHRvIGRlYyBwZW5kaW5nIGlmIHRoaXMgd2FzIGEgd3JpdGUuCiAJICovCi0JaWYgKHJ3ID09IFdSSVRFKQotCQlyaF9kZWMoJm1zLT5yaCwgcmVnaW9uKTsKKwlpZiAocncgPT0gV1JJVEUpIHsKKwkJcmhfZGVjKCZtcy0+cmgsIG1hcF9jb250ZXh0LT5sbCk7CisJCXJldHVybiBlcnJvcjsKKwl9CiAKLQlyZXR1cm4gMDsKKwlpZiAoZXJyb3IgPT0gLUVPUE5PVFNVUFApCisJCWdvdG8gb3V0OworCisJaWYgKChlcnJvciA9PSAtRVdPVUxEQkxPQ0spICYmIGJpb19yd19haGVhZChiaW8pKQorCQlnb3RvIG91dDsKKworCWlmICh1bmxpa2VseShlcnJvcikpIHsKKwkJaWYgKCFyZWFkX3JlY29yZCkgeworCQkJLyoKKwkJCSAqIFRoZXJlIHdhc24ndCBlbm91Z2ggbWVtb3J5IHRvIHJlY29yZCBuZWNlc3NhcnkKKwkJCSAqIGluZm9ybWF0aW9uIGZvciBhIHJldHJ5IG9yIHRoZXJlIHdhcyBubyBvdGhlcgorCQkJICogbWlycm9yIGluLXN5bmMuCisJCQkgKi8KKwkJCURNRVJSX0xJTUlUKCJNaXJyb3IgcmVhZCBmYWlsZWQgZnJvbSAlcy4iLAorCQkJCSAgICBtLT5kZXYtPm5hbWUpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJRE1FUlIoIk1pcnJvciByZWFkIGZhaWxlZCBmcm9tICVzLiBUcnlpbmcgYWx0ZXJuYXRpdmUgZGV2aWNlLiIsCisJCSAgICAgIG0tPmRldi0+bmFtZSk7CisKKwkJbSA9IHJlYWRfcmVjb3JkLT5tOworCQlmYWlsX21pcnJvcihtLCBETV9SQUlEMV9SRUFEX0VSUk9SKTsKKworCQkvKgorCQkgKiBBIGZhaWxlZCByZWFkIGlzIHJlcXVldWVkIGZvciBhbm90aGVyIGF0dGVtcHQgdXNpbmcgYW4gaW50YWN0CisJCSAqIG1pcnJvci4KKwkJICovCisJCWlmIChkZWZhdWx0X29rKG0pIHx8IG1pcnJvcl9hdmFpbGFibGUobXMsIGJpbykpIHsKKwkJCWJkID0gJnJlYWRfcmVjb3JkLT5kZXRhaWxzOworCisJCQlkbV9iaW9fcmVzdG9yZShiZCwgYmlvKTsKKwkJCW1lbXBvb2xfZnJlZShyZWFkX3JlY29yZCwgbXMtPnJlYWRfcmVjb3JkX3Bvb2wpOworCQkJbWFwX2NvbnRleHQtPnB0ciA9IE5VTEw7CisJCQlxdWV1ZV9iaW8obXMsIGJpbywgcncpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJRE1FUlIoIkFsbCByZXBsaWNhdGVkIHZvbHVtZXMgZGVhZCwgZmFpbGluZyBJL08iKTsKKwl9CisKK291dDoKKwlpZiAocmVhZF9yZWNvcmQpIHsKKwkJbWVtcG9vbF9mcmVlKHJlYWRfcmVjb3JkLCBtcy0+cmVhZF9yZWNvcmRfcG9vbCk7CisJCW1hcF9jb250ZXh0LT5wdHIgPSBOVUxMOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgbWlycm9yX3ByZXN1c3BlbmQoc3RydWN0IGRtX3RhcmdldCAqdGkpCit7CisJc3RydWN0IG1pcnJvcl9zZXQgKm1zID0gKHN0cnVjdCBtaXJyb3Jfc2V0ICopIHRpLT5wcml2YXRlOworCXN0cnVjdCBkaXJ0eV9sb2cgKmxvZyA9IG1zLT5yaC5sb2c7CisKKwlhdG9taWNfc2V0KCZtcy0+c3VzcGVuZCwgMSk7CisKKwkvKgorCSAqIFdlIG11c3QgZmluaXNoIHVwIGFsbCB0aGUgd29yayB0aGF0IHdlJ3ZlCisJICogZ2VuZXJhdGVkIChpLmUuIHJlY292ZXJ5IHdvcmspLgorCSAqLworCXJoX3N0b3BfcmVjb3ZlcnkoJm1zLT5yaCk7CisKKwl3YWl0X2V2ZW50KF9rbWlycm9yZF9yZWNvdmVyeV9zdG9wcGVkLAorCQkgICAhYXRvbWljX3JlYWQoJm1zLT5yaC5yZWNvdmVyeV9pbl9mbGlnaHQpKTsKKworCWlmIChsb2ctPnR5cGUtPnByZXN1c3BlbmQgJiYgbG9nLT50eXBlLT5wcmVzdXNwZW5kKGxvZykpCisJCS8qIEZJWE1FOiBuZWVkIGJldHRlciBlcnJvciBoYW5kbGluZyAqLworCQlETVdBUk4oImxvZyBwcmVzdXNwZW5kIGZhaWxlZCIpOworCisJLyoKKwkgKiBOb3cgdGhhdCByZWNvdmVyeSBpcyBjb21wbGV0ZS9zdG9wcGVkIGFuZCB0aGUKKwkgKiBkZWxheWVkIGJpb3MgYXJlIHF1ZXVlZCwgd2UgbmVlZCB0byB3YWl0IGZvcgorCSAqIHRoZSB3b3JrZXIgdGhyZWFkIHRvIGNvbXBsZXRlLiAgVGhpcyB3YXksCisJICogd2Uga25vdyB0aGF0IGFsbCBvZiBvdXIgSS9PIGhhcyBiZWVuIHB1c2hlZC4KKwkgKi8KKwlmbHVzaF93b3JrcXVldWUobXMtPmttaXJyb3JkX3dxKTsKIH0KIAogc3RhdGljIHZvaWQgbWlycm9yX3Bvc3RzdXNwZW5kKHN0cnVjdCBkbV90YXJnZXQgKnRpKQogewotCXN0cnVjdCBtaXJyb3Jfc2V0ICptcyA9IChzdHJ1Y3QgbWlycm9yX3NldCAqKSB0aS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgbWlycm9yX3NldCAqbXMgPSB0aS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgZGlydHlfbG9nICpsb2cgPSBtcy0+cmgubG9nOwogCi0Jcmhfc3RvcF9yZWNvdmVyeSgmbXMtPnJoKTsKLQotCS8qIFdhaXQgZm9yIGFsbCBJL08gd2UgZ2VuZXJhdGVkIHRvIGNvbXBsZXRlICovCi0Jd2FpdF9ldmVudChfa21pcnJvcmRfcmVjb3Zlcnlfc3RvcHBlZCwKLQkJICAgIWF0b21pY19yZWFkKCZtcy0+cmgucmVjb3ZlcnlfaW5fZmxpZ2h0KSk7Ci0KIAlpZiAobG9nLT50eXBlLT5wb3N0c3VzcGVuZCAmJiBsb2ctPnR5cGUtPnBvc3RzdXNwZW5kKGxvZykpCiAJCS8qIEZJWE1FOiBuZWVkIGJldHRlciBlcnJvciBoYW5kbGluZyAqLwotCQlETVdBUk4oImxvZyBzdXNwZW5kIGZhaWxlZCIpOworCQlETVdBUk4oImxvZyBwb3N0c3VzcGVuZCBmYWlsZWQiKTsKIH0KIAogc3RhdGljIHZvaWQgbWlycm9yX3Jlc3VtZShzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKIHsKLQlzdHJ1Y3QgbWlycm9yX3NldCAqbXMgPSAoc3RydWN0IG1pcnJvcl9zZXQgKikgdGktPnByaXZhdGU7CisJc3RydWN0IG1pcnJvcl9zZXQgKm1zID0gdGktPnByaXZhdGU7CiAJc3RydWN0IGRpcnR5X2xvZyAqbG9nID0gbXMtPnJoLmxvZzsKKworCWF0b21pY19zZXQoJm1zLT5zdXNwZW5kLCAwKTsKIAlpZiAobG9nLT50eXBlLT5yZXN1bWUgJiYgbG9nLT50eXBlLT5yZXN1bWUobG9nKSkKIAkJLyogRklYTUU6IG5lZWQgYmV0dGVyIGVycm9yIGhhbmRsaW5nICovCiAJCURNV0FSTigibG9nIHJlc3VtZSBmYWlsZWQiKTsKIAlyaF9zdGFydF9yZWNvdmVyeSgmbXMtPnJoKTsKIH0KIAorLyoKKyAqIGRldmljZV9zdGF0dXNfY2hhcgorICogQG06IG1pcnJvciBkZXZpY2UvbGVnIHdlIHdhbnQgdGhlIHN0YXR1cyBvZgorICoKKyAqIFdlIHJldHVybiBvbmUgY2hhcmFjdGVyIHJlcHJlc2VudGluZyB0aGUgbW9zdCBzZXZlcmUgZXJyb3IKKyAqIHdlIGhhdmUgZW5jb3VudGVyZWQuCisgKiAgICBBID0+IEFsaXZlIC0gTm8gZmFpbHVyZXMKKyAqICAgIEQgPT4gRGVhZCAtIEEgd3JpdGUgZmFpbHVyZSBvY2N1cnJlZCBsZWF2aW5nIG1pcnJvciBvdXQtb2Ytc3luYworICogICAgUyA9PiBTeW5jIC0gQSBzeWNocm9uaXphdGlvbiBmYWlsdXJlIG9jY3VycmVkLCBtaXJyb3Igb3V0LW9mLXN5bmMKKyAqICAgIFIgPT4gUmVhZCAtIEEgcmVhZCBmYWlsdXJlIG9jY3VycmVkLCBtaXJyb3IgZGF0YSB1bmFmZmVjdGVkCisgKgorICogUmV0dXJuczogPGNoYXI+CisgKi8KK3N0YXRpYyBjaGFyIGRldmljZV9zdGF0dXNfY2hhcihzdHJ1Y3QgbWlycm9yICptKQoreworCWlmICghYXRvbWljX3JlYWQoJihtLT5lcnJvcl9jb3VudCkpKQorCQlyZXR1cm4gJ0EnOworCisJcmV0dXJuICh0ZXN0X2JpdChETV9SQUlEMV9XUklURV9FUlJPUiwgJihtLT5lcnJvcl90eXBlKSkpID8gJ0QnIDoKKwkJKHRlc3RfYml0KERNX1JBSUQxX1NZTkNfRVJST1IsICYobS0+ZXJyb3JfdHlwZSkpKSA/ICdTJyA6CisJCSh0ZXN0X2JpdChETV9SQUlEMV9SRUFEX0VSUk9SLCAmKG0tPmVycm9yX3R5cGUpKSkgPyAnUicgOiAnVSc7Cit9CisKKwogc3RhdGljIGludCBtaXJyb3Jfc3RhdHVzKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdGF0dXNfdHlwZV90IHR5cGUsCiAJCQkgY2hhciAqcmVzdWx0LCB1bnNpZ25lZCBpbnQgbWF4bGVuKQogewogCXVuc2lnbmVkIGludCBtLCBzeiA9IDA7CiAJc3RydWN0IG1pcnJvcl9zZXQgKm1zID0gKHN0cnVjdCBtaXJyb3Jfc2V0ICopIHRpLT5wcml2YXRlOworCXN0cnVjdCBkaXJ0eV9sb2cgKmxvZyA9IG1zLT5yaC5sb2c7CisJY2hhciBidWZmZXJbbXMtPm5yX21pcnJvcnMgKyAxXTsKIAogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgU1RBVFVTVFlQRV9JTkZPOgogCQlETUVNSVQoIiVkICIsIG1zLT5ucl9taXJyb3JzKTsKLQkJZm9yIChtID0gMDsgbSA8IG1zLT5ucl9taXJyb3JzOyBtKyspCisJCWZvciAobSA9IDA7IG0gPCBtcy0+bnJfbWlycm9yczsgbSsrKSB7CiAJCQlETUVNSVQoIiVzICIsIG1zLT5taXJyb3JbbV0uZGV2LT5uYW1lKTsKKwkJCWJ1ZmZlclttXSA9IGRldmljZV9zdGF0dXNfY2hhcigmKG1zLT5taXJyb3JbbV0pKTsKKwkJfQorCQlidWZmZXJbbV0gPSAnXDAnOwogCi0JCURNRU1JVCgiJWxsdS8lbGx1IDAgIiwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbXMtPnJoLmxvZy0+dHlwZS0+Ci0JCQkJZ2V0X3N5bmNfY291bnQobXMtPnJoLmxvZyksCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKW1zLT5ucl9yZWdpb25zKTsKKwkJRE1FTUlUKCIlbGx1LyVsbHUgMSAlcyAiLAorCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxvZy0+dHlwZS0+Z2V0X3N5bmNfY291bnQobXMtPnJoLmxvZyksCisJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbXMtPm5yX3JlZ2lvbnMsIGJ1ZmZlcik7CiAKLQkJc3ogKz0gbXMtPnJoLmxvZy0+dHlwZS0+c3RhdHVzKG1zLT5yaC5sb2csIHR5cGUsIHJlc3VsdCtzeiwgbWF4bGVuLXN6KTsKKwkJc3ogKz0gbG9nLT50eXBlLT5zdGF0dXMobXMtPnJoLmxvZywgdHlwZSwgcmVzdWx0K3N6LCBtYXhsZW4tc3opOwogCiAJCWJyZWFrOwogCiAJY2FzZSBTVEFUVVNUWVBFX1RBQkxFOgotCQlzeiA9IG1zLT5yaC5sb2ctPnR5cGUtPnN0YXR1cyhtcy0+cmgubG9nLCB0eXBlLCByZXN1bHQsIG1heGxlbik7CisJCXN6ID0gbG9nLT50eXBlLT5zdGF0dXMobXMtPnJoLmxvZywgdHlwZSwgcmVzdWx0LCBtYXhsZW4pOwogCiAJCURNRU1JVCgiJWQiLCBtcy0+bnJfbWlycm9ycyk7CiAJCWZvciAobSA9IDA7IG0gPCBtcy0+bnJfbWlycm9yczsgbSsrKQogCQkJRE1FTUlUKCIgJXMgJWxsdSIsIG1zLT5taXJyb3JbbV0uZGV2LT5uYW1lLAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbXMtPm1pcnJvclttXS5vZmZzZXQpOworCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbXMtPm1pcnJvclttXS5vZmZzZXQpOwogCiAJCWlmIChtcy0+ZmVhdHVyZXMgJiBETV9SQUlEMV9IQU5ETEVfRVJST1JTKQogCQkJRE1FTUlUKCIgMSBoYW5kbGVfZXJyb3JzIik7CkBAIC0xMzYwLDEyICsxODQ3LDEzIEBACiAKIHN0YXRpYyBzdHJ1Y3QgdGFyZ2V0X3R5cGUgbWlycm9yX3RhcmdldCA9IHsKIAkubmFtZQkgPSAibWlycm9yIiwKLQkudmVyc2lvbiA9IHsxLCAwLCAzfSwKKwkudmVyc2lvbiA9IHsxLCAwLCAyMH0sCiAJLm1vZHVsZQkgPSBUSElTX01PRFVMRSwKIAkuY3RyCSA9IG1pcnJvcl9jdHIsCiAJLmR0cgkgPSBtaXJyb3JfZHRyLAogCS5tYXAJID0gbWlycm9yX21hcCwKIAkuZW5kX2lvCSA9IG1pcnJvcl9lbmRfaW8sCisJLnByZXN1c3BlbmQgPSBtaXJyb3JfcHJlc3VzcGVuZCwKIAkucG9zdHN1c3BlbmQgPSBtaXJyb3JfcG9zdHN1c3BlbmQsCiAJLnJlc3VtZQkgPSBtaXJyb3JfcmVzdW1lLAogCS5zdGF0dXMJID0gbWlycm9yX3N0YXR1cywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tc25hcC5jIGIvZHJpdmVycy9tZC9kbS1zbmFwLmMKaW5kZXggY2VlMTZmYS4uYWUyNGVhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1zbmFwLmMKKysrIGIvZHJpdmVycy9tZC9kbS1zbmFwLmMKQEAgLTIxMywxMSArMjEzLDE1IEBACiAKIC8qCiAgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXhjZXB0aW9uIGhhc2ggdGFibGVzLgorICogVGhlIGxvd2VzdCBoYXNoX3NoaWZ0IGJpdHMgb2YgdGhlIGNodW5rIG51bWJlciBhcmUgaWdub3JlZCwgYWxsb3dpbmcKKyAqIHNvbWUgY29uc2VjdXRpdmUgY2h1bmtzIHRvIGJlIGdyb3VwZWQgdG9nZXRoZXIuCiAgKi8KLXN0YXRpYyBpbnQgaW5pdF9leGNlcHRpb25fdGFibGUoc3RydWN0IGV4Y2VwdGlvbl90YWJsZSAqZXQsIHVpbnQzMl90IHNpemUpCitzdGF0aWMgaW50IGluaXRfZXhjZXB0aW9uX3RhYmxlKHN0cnVjdCBleGNlcHRpb25fdGFibGUgKmV0LCB1aW50MzJfdCBzaXplLAorCQkJCXVuc2lnbmVkIGhhc2hfc2hpZnQpCiB7CiAJdW5zaWduZWQgaW50IGk7CiAKKwlldC0+aGFzaF9zaGlmdCA9IGhhc2hfc2hpZnQ7CiAJZXQtPmhhc2hfbWFzayA9IHNpemUgLSAxOwogCWV0LT50YWJsZSA9IGRtX3ZjYWxsb2Moc2l6ZSwgc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpKTsKIAlpZiAoIWV0LT50YWJsZSkKQEAgLTI0OCw3ICsyNTIsNyBAQAogCiBzdGF0aWMgdWludDMyX3QgZXhjZXB0aW9uX2hhc2goc3RydWN0IGV4Y2VwdGlvbl90YWJsZSAqZXQsIGNodW5rX3QgY2h1bmspCiB7Ci0JcmV0dXJuIGNodW5rICYgZXQtPmhhc2hfbWFzazsKKwlyZXR1cm4gKGNodW5rID4+IGV0LT5oYXNoX3NoaWZ0KSAmIGV0LT5oYXNoX21hc2s7CiB9CiAKIHN0YXRpYyB2b2lkIGluc2VydF9leGNlcHRpb24oc3RydWN0IGV4Y2VwdGlvbl90YWJsZSAqZWgsCkBAIC0yNzUsNyArMjc5LDggQEAKIAogCXNsb3QgPSAmZXQtPnRhYmxlW2V4Y2VwdGlvbl9oYXNoKGV0LCBjaHVuayldOwogCWxpc3RfZm9yX2VhY2hfZW50cnkgKGUsIHNsb3QsIGhhc2hfbGlzdCkKLQkJaWYgKGUtPm9sZF9jaHVuayA9PSBjaHVuaykKKwkJaWYgKGNodW5rID49IGUtPm9sZF9jaHVuayAmJgorCQkgICAgY2h1bmsgPD0gZS0+b2xkX2NodW5rICsgZG1fY29uc2VjdXRpdmVfY2h1bmtfY291bnQoZSkpCiAJCQlyZXR1cm4gZTsKIAogCXJldHVybiBOVUxMOwpAQCAtMzA3LDYgKzMxMiw0OSBAQAogCW1lbXBvb2xfZnJlZShwZSwgcGVuZGluZ19wb29sKTsKIH0KIAorc3RhdGljIHZvaWQgaW5zZXJ0X2NvbXBsZXRlZF9leGNlcHRpb24oc3RydWN0IGRtX3NuYXBzaG90ICpzLAorCQkJCSAgICAgICBzdHJ1Y3QgZG1fc25hcF9leGNlcHRpb24gKm5ld19lKQoreworCXN0cnVjdCBleGNlcHRpb25fdGFibGUgKmVoID0gJnMtPmNvbXBsZXRlOworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJc3RydWN0IGRtX3NuYXBfZXhjZXB0aW9uICplID0gTlVMTDsKKworCWwgPSAmZWgtPnRhYmxlW2V4Y2VwdGlvbl9oYXNoKGVoLCBuZXdfZS0+b2xkX2NodW5rKV07CisKKwkvKiBBZGQgaW1tZWRpYXRlbHkgaWYgdGhpcyB0YWJsZSBkb2Vzbid0IHN1cHBvcnQgY29uc2VjdXRpdmUgY2h1bmtzICovCisJaWYgKCFlaC0+aGFzaF9zaGlmdCkKKwkJZ290byBvdXQ7CisKKwkvKiBMaXN0IGlzIG9yZGVyZWQgYnkgb2xkX2NodW5rICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGUsIGwsIGhhc2hfbGlzdCkgeworCQkvKiBJbnNlcnQgYWZ0ZXIgYW4gZXhpc3RpbmcgY2h1bms/ICovCisJCWlmIChuZXdfZS0+b2xkX2NodW5rID09IChlLT5vbGRfY2h1bmsgKworCQkJCQkgZG1fY29uc2VjdXRpdmVfY2h1bmtfY291bnQoZSkgKyAxKSAmJgorCQkgICAgbmV3X2UtPm5ld19jaHVuayA9PSAoZG1fY2h1bmtfbnVtYmVyKGUtPm5ld19jaHVuaykgKworCQkJCQkgZG1fY29uc2VjdXRpdmVfY2h1bmtfY291bnQoZSkgKyAxKSkgeworCQkJZG1fY29uc2VjdXRpdmVfY2h1bmtfY291bnRfaW5jKGUpOworCQkJZnJlZV9leGNlcHRpb24obmV3X2UpOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogSW5zZXJ0IGJlZm9yZSBhbiBleGlzdGluZyBjaHVuaz8gKi8KKwkJaWYgKG5ld19lLT5vbGRfY2h1bmsgPT0gKGUtPm9sZF9jaHVuayAtIDEpICYmCisJCSAgICBuZXdfZS0+bmV3X2NodW5rID09IChkbV9jaHVua19udW1iZXIoZS0+bmV3X2NodW5rKSAtIDEpKSB7CisJCQlkbV9jb25zZWN1dGl2ZV9jaHVua19jb3VudF9pbmMoZSk7CisJCQllLT5vbGRfY2h1bmstLTsKKwkJCWUtPm5ld19jaHVuay0tOworCQkJZnJlZV9leGNlcHRpb24obmV3X2UpOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKG5ld19lLT5vbGRfY2h1bmsgPiBlLT5vbGRfY2h1bmspCisJCQlicmVhazsKKwl9CisKK291dDoKKwlsaXN0X2FkZCgmbmV3X2UtPmhhc2hfbGlzdCwgZSA/ICZlLT5oYXNoX2xpc3QgOiBsKTsKK30KKwogaW50IGRtX2FkZF9leGNlcHRpb24oc3RydWN0IGRtX3NuYXBzaG90ICpzLCBjaHVua190IG9sZCwgY2h1bmtfdCBuZXcpCiB7CiAJc3RydWN0IGRtX3NuYXBfZXhjZXB0aW9uICplOwpAQCAtMzE2LDggKzM2NCwxMiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWUtPm9sZF9jaHVuayA9IG9sZDsKKworCS8qIENvbnNlY3V0aXZlX2NvdW50IGlzIGltcGxpY2l0bHkgaW5pdGlhbGlzZWQgdG8gemVybyAqLwogCWUtPm5ld19jaHVuayA9IG5ldzsKLQlpbnNlcnRfZXhjZXB0aW9uKCZzLT5jb21wbGV0ZSwgZSk7CisKKwlpbnNlcnRfY29tcGxldGVkX2V4Y2VwdGlvbihzLCBlKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0zMzQsMTYgKzM4Niw2IEBACiB9CiAKIC8qCi0gKiBSb3VuZHMgYSBudW1iZXIgZG93biB0byBhIHBvd2VyIG9mIDIuCi0gKi8KLXN0YXRpYyB1aW50MzJfdCByb3VuZF9kb3duKHVpbnQzMl90IG4pCi17Ci0Jd2hpbGUgKG4gJiAobiAtIDEpKQotCQluICY9IChuIC0gMSk7Ci0JcmV0dXJuIG47Ci19Ci0KLS8qCiAgKiBBbGxvY2F0ZSByb29tIGZvciBhIHN1aXRhYmxlIGhhc2ggdGFibGUuCiAgKi8KIHN0YXRpYyBpbnQgaW5pdF9oYXNoX3RhYmxlcyhzdHJ1Y3QgZG1fc25hcHNob3QgKnMpCkBAIC0zNjEsOSArNDAzLDkgQEAKIAloYXNoX3NpemUgPSBtaW4ob3JpZ2luX2Rldl9zaXplLCBjb3dfZGV2X3NpemUpID4+IHMtPmNodW5rX3NoaWZ0OwogCWhhc2hfc2l6ZSA9IG1pbihoYXNoX3NpemUsIG1heF9idWNrZXRzKTsKIAotCS8qIFJvdW5kIGl0IGRvd24gdG8gYSBwb3dlciBvZiAyICovCi0JaGFzaF9zaXplID0gcm91bmRfZG93bihoYXNoX3NpemUpOwotCWlmIChpbml0X2V4Y2VwdGlvbl90YWJsZSgmcy0+Y29tcGxldGUsIGhhc2hfc2l6ZSkpCisJaGFzaF9zaXplID0gcm91bmRkb3duX3Bvd19vZl90d28oaGFzaF9zaXplKTsKKwlpZiAoaW5pdF9leGNlcHRpb25fdGFibGUoJnMtPmNvbXBsZXRlLCBoYXNoX3NpemUsCisJCQkJIERNX0NIVU5LX0NPTlNFQ1VUSVZFX0JJVFMpKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qCkBAIC0zNzQsNyArNDE2LDcgQEAKIAlpZiAoaGFzaF9zaXplIDwgNjQpCiAJCWhhc2hfc2l6ZSA9IDY0OwogCi0JaWYgKGluaXRfZXhjZXB0aW9uX3RhYmxlKCZzLT5wZW5kaW5nLCBoYXNoX3NpemUpKSB7CisJaWYgKGluaXRfZXhjZXB0aW9uX3RhYmxlKCZzLT5wZW5kaW5nLCBoYXNoX3NpemUsIDApKSB7CiAJCWV4aXRfZXhjZXB0aW9uX3RhYmxlKCZzLT5jb21wbGV0ZSwgZXhjZXB0aW9uX2NhY2hlKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtNzMzLDcgKzc3NSw3IEBACiAJICogQWRkIGEgcHJvcGVyIGV4Y2VwdGlvbiwgYW5kIHJlbW92ZSB0aGUKIAkgKiBpbi1mbGlnaHQgZXhjZXB0aW9uIGZyb20gdGhlIGxpc3QuCiAJICovCi0JaW5zZXJ0X2V4Y2VwdGlvbigmcy0+Y29tcGxldGUsIGUpOworCWluc2VydF9jb21wbGV0ZWRfZXhjZXB0aW9uKHMsIGUpOwogCiAgb3V0OgogCXJlbW92ZV9leGNlcHRpb24oJnBlLT5lKTsKQEAgLTg2NywxMSArOTA5LDEyIEBACiB9CiAKIHN0YXRpYyB2b2lkIHJlbWFwX2V4Y2VwdGlvbihzdHJ1Y3QgZG1fc25hcHNob3QgKnMsIHN0cnVjdCBkbV9zbmFwX2V4Y2VwdGlvbiAqZSwKLQkJCSAgICBzdHJ1Y3QgYmlvICpiaW8pCisJCQkgICAgc3RydWN0IGJpbyAqYmlvLCBjaHVua190IGNodW5rKQogewogCWJpby0+YmlfYmRldiA9IHMtPmNvdy0+YmRldjsKLQliaW8tPmJpX3NlY3RvciA9IGNodW5rX3RvX3NlY3RvcihzLCBlLT5uZXdfY2h1bmspICsKLQkJKGJpby0+Ymlfc2VjdG9yICYgcy0+Y2h1bmtfbWFzayk7CisJYmlvLT5iaV9zZWN0b3IgPSBjaHVua190b19zZWN0b3IocywgZG1fY2h1bmtfbnVtYmVyKGUtPm5ld19jaHVuaykgKworCQkJIChjaHVuayAtIGUtPm9sZF9jaHVuaykpICsKKwkJCSAoYmlvLT5iaV9zZWN0b3IgJiBzLT5jaHVua19tYXNrKTsKIH0KIAogc3RhdGljIGludCBzbmFwc2hvdF9tYXAoc3RydWN0IGRtX3RhcmdldCAqdGksIHN0cnVjdCBiaW8gKmJpbywKQEAgLTkwMiw3ICs5NDUsNyBAQAogCS8qIElmIHRoZSBibG9jayBpcyBhbHJlYWR5IHJlbWFwcGVkIC0gdXNlIHRoYXQsIGVsc2UgcmVtYXAgaXQgKi8KIAllID0gbG9va3VwX2V4Y2VwdGlvbigmcy0+Y29tcGxldGUsIGNodW5rKTsKIAlpZiAoZSkgewotCQlyZW1hcF9leGNlcHRpb24ocywgZSwgYmlvKTsKKwkJcmVtYXBfZXhjZXB0aW9uKHMsIGUsIGJpbywgY2h1bmspOwogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCkBAIC05MTksNyArOTYyLDcgQEAKIAkJCWdvdG8gb3V0X3VubG9jazsKIAkJfQogCi0JCXJlbWFwX2V4Y2VwdGlvbihzLCAmcGUtPmUsIGJpbyk7CisJCXJlbWFwX2V4Y2VwdGlvbihzLCAmcGUtPmUsIGJpbywgY2h1bmspOwogCQliaW9fbGlzdF9hZGQoJnBlLT5zbmFwc2hvdF9iaW9zLCBiaW8pOwogCiAJCXIgPSBETV9NQVBJT19TVUJNSVRURUQ7CkBAIC0xMjA3LDcgKzEyNTAsNyBAQAogCiBzdGF0aWMgc3RydWN0IHRhcmdldF90eXBlIG9yaWdpbl90YXJnZXQgPSB7CiAJLm5hbWUgICAgPSAic25hcHNob3Qtb3JpZ2luIiwKLQkudmVyc2lvbiA9IHsxLCA1LCAwfSwKKwkudmVyc2lvbiA9IHsxLCA2LCAwfSwKIAkubW9kdWxlICA9IFRISVNfTU9EVUxFLAogCS5jdHIgICAgID0gb3JpZ2luX2N0ciwKIAkuZHRyICAgICA9IG9yaWdpbl9kdHIsCkBAIC0xMjE4LDcgKzEyNjEsNyBAQAogCiBzdGF0aWMgc3RydWN0IHRhcmdldF90eXBlIHNuYXBzaG90X3RhcmdldCA9IHsKIAkubmFtZSAgICA9ICJzbmFwc2hvdCIsCi0JLnZlcnNpb24gPSB7MSwgNSwgMH0sCisJLnZlcnNpb24gPSB7MSwgNiwgMH0sCiAJLm1vZHVsZSAgPSBUSElTX01PRFVMRSwKIAkuY3RyICAgICA9IHNuYXBzaG90X2N0ciwKIAkuZHRyICAgICA9IHNuYXBzaG90X2R0ciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tc25hcC5oIGIvZHJpdmVycy9tZC9kbS1zbmFwLmgKaW5kZXggNjUwZTBmMS4uOTNiY2U1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1zbmFwLmgKKysrIGIvZHJpdmVycy9tZC9kbS1zbmFwLmgKQEAgLTE2LDE5ICsxNiwyMiBAQAogCiBzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlIHsKIAl1aW50MzJfdCBoYXNoX21hc2s7CisJdW5zaWduZWQgaGFzaF9zaGlmdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0YWJsZTsKIH07CiAKIC8qCiAgKiBUaGUgc25hcHNob3QgY29kZSBkZWFscyB3aXRoIGxhcmdpc2ggY2h1bmtzIG9mIHRoZSBkaXNrIGF0IGEKLSAqIHRpbWUuIFR5cGljYWxseSA2NGsgLSAyNTZrLgorICogdGltZS4gVHlwaWNhbGx5IDMyayAtIDUxMmsuCiAgKi8KLS8qIEZJWE1FOiBjYW4gd2UgZ2V0IGF3YXkgd2l0aCBsaW1pdGluZyB0aGVzZSB0byBhIHVpbnQzMl90ID8gKi8KIHR5cGVkZWYgc2VjdG9yX3QgY2h1bmtfdDsKIAogLyoKICAqIEFuIGV4Y2VwdGlvbiBpcyB1c2VkIHdoZXJlIGFuIG9sZCBjaHVuayBvZiBkYXRhIGhhcyBiZWVuCiAgKiByZXBsYWNlZCBieSBhIG5ldyBvbmUuCisgKiBJZiBjaHVua190IGlzIDY0IGJpdHMgaW4gc2l6ZSwgdGhlIHRvcCA4IGJpdHMgb2YgbmV3X2NodW5rIGhvbGQgdGhlIG51bWJlcgorICogb2YgY2h1bmtzIHRoYXQgZm9sbG93IGNvbnRpZ3VvdXNseS4gIFJlbWFpbmluZyBiaXRzIGhvbGQgdGhlIG51bWJlciBvZiB0aGUKKyAqIGNodW5rIHdpdGhpbiB0aGUgZGV2aWNlLgogICovCiBzdHJ1Y3QgZG1fc25hcF9leGNlcHRpb24gewogCXN0cnVjdCBsaXN0X2hlYWQgaGFzaF9saXN0OwpAQCAtMzgsNiArNDEsNDkgQEAKIH07CiAKIC8qCisgKiBGdW50aW9ucyB0byBtYW5pcHVsYXRlIGNvbnNlY3V0aXZlIGNodW5rcworICovCisjICBpZiBkZWZpbmVkKENPTkZJR19MQkQpIHx8IChCSVRTX1BFUl9MT05HID09IDY0KQorIyAgICBkZWZpbmUgRE1fQ0hVTktfQ09OU0VDVVRJVkVfQklUUyA4CisjICAgIGRlZmluZSBETV9DSFVOS19OVU1CRVJfQklUUyA1NgorCitzdGF0aWMgaW5saW5lIGNodW5rX3QgZG1fY2h1bmtfbnVtYmVyKGNodW5rX3QgY2h1bmspCit7CisJcmV0dXJuIGNodW5rICYgKGNodW5rX3QpKCgxVUxMIDw8IERNX0NIVU5LX05VTUJFUl9CSVRTKSAtIDFVTEwpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGRtX2NvbnNlY3V0aXZlX2NodW5rX2NvdW50KHN0cnVjdCBkbV9zbmFwX2V4Y2VwdGlvbiAqZSkKK3sKKwlyZXR1cm4gZS0+bmV3X2NodW5rID4+IERNX0NIVU5LX05VTUJFUl9CSVRTOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZG1fY29uc2VjdXRpdmVfY2h1bmtfY291bnRfaW5jKHN0cnVjdCBkbV9zbmFwX2V4Y2VwdGlvbiAqZSkKK3sKKwllLT5uZXdfY2h1bmsgKz0gKDFVTEwgPDwgRE1fQ0hVTktfTlVNQkVSX0JJVFMpOworCisJQlVHX09OKCFkbV9jb25zZWN1dGl2ZV9jaHVua19jb3VudChlKSk7Cit9CisKKyMgIGVsc2UKKyMgICAgZGVmaW5lIERNX0NIVU5LX0NPTlNFQ1VUSVZFX0JJVFMgMAorCitzdGF0aWMgaW5saW5lIGNodW5rX3QgZG1fY2h1bmtfbnVtYmVyKGNodW5rX3QgY2h1bmspCit7CisJcmV0dXJuIGNodW5rOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGRtX2NvbnNlY3V0aXZlX2NodW5rX2NvdW50KHN0cnVjdCBkbV9zbmFwX2V4Y2VwdGlvbiAqZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRtX2NvbnNlY3V0aXZlX2NodW5rX2NvdW50X2luYyhzdHJ1Y3QgZG1fc25hcF9leGNlcHRpb24gKmUpCit7Cit9CisKKyMgIGVuZGlmCisKKy8qCiAgKiBBYnN0cmFjdGlvbiB0byBoYW5kbGUgdGhlIG1ldGEvbGF5b3V0IG9mIGV4Y2VwdGlvbiBzdG9yZXMgKHRoZQogICogQ09XIGRldmljZSkuCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tc3RyaXBlLmMgYi9kcml2ZXJzL21kL2RtLXN0cmlwZS5jCmluZGV4IDk2OTk0NGEuLjRkZTkwYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tc3RyaXBlLmMKKysrIGIvZHJpdmVycy9tZC9kbS1zdHJpcGUuYwpAQCAtMTQsMTAgKzE0LDEzIEBACiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogCiAjZGVmaW5lIERNX01TR19QUkVGSVggInN0cmlwZWQiCisjZGVmaW5lIERNX0lPX0VSUk9SX1RIUkVTSE9MRCAxNQogCiBzdHJ1Y3Qgc3RyaXBlIHsKIAlzdHJ1Y3QgZG1fZGV2ICpkZXY7CiAJc2VjdG9yX3QgcGh5c2ljYWxfc3RhcnQ7CisKKwlhdG9taWNfdCBlcnJvcl9jb3VudDsKIH07CiAKIHN0cnVjdCBzdHJpcGVfYyB7CkBAIC0zMCw5ICszMywyOSBAQAogCXVpbnQzMl90IGNodW5rX3NoaWZ0OwogCXNlY3Rvcl90IGNodW5rX21hc2s7CiAKKwkvKiBOZWVkZWQgZm9yIGhhbmRsaW5nIGV2ZW50cyAqLworCXN0cnVjdCBkbV90YXJnZXQgKnRpOworCisJLyogV29yayBzdHJ1Y3QgdXNlZCBmb3IgdHJpZ2dlcmluZyBldmVudHMqLworCXN0cnVjdCB3b3JrX3N0cnVjdCBrc3RyaXBlZF93czsKKwogCXN0cnVjdCBzdHJpcGUgc3RyaXBlWzBdOwogfTsKIAorc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICprc3RyaXBlZDsKKworLyoKKyAqIEFuIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuZXZlciBhIGRyaXZlCisgKiBkcm9wcyBvdXQgb2YgYSBzdHJpcGUgdm9sdW1lLgorICovCitzdGF0aWMgdm9pZCB0cmlnZ2VyX2V2ZW50KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgc3RyaXBlX2MgKnNjID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzdHJpcGVfYywga3N0cmlwZWRfd3MpOworCisJZG1fdGFibGVfZXZlbnQoc2MtPnRpLT50YWJsZSk7CisKK30KKwogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3RyaXBlX2MgKmFsbG9jX2NvbnRleHQodW5zaWduZWQgaW50IHN0cmlwZXMpCiB7CiAJc2l6ZV90IGxlbjsKQEAgLTYzLDYgKzg2LDcgQEAKIAkJcmV0dXJuIC1FTlhJTzsKIAogCXNjLT5zdHJpcGVbc3RyaXBlXS5waHlzaWNhbF9zdGFydCA9IHN0YXJ0OworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzNSw2ICsxNTksMTEgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJSU5JVF9XT1JLKCZzYy0+a3N0cmlwZWRfd3MsIHRyaWdnZXJfZXZlbnQpOworCisJLyogU2V0IHBvaW50ZXIgdG8gZG0gdGFyZ2V0OyB1c2VkIGluIHRyaWdnZXJfZXZlbnQgKi8KKwlzYy0+dGkgPSB0aTsKKwogCXNjLT5zdHJpcGVzID0gc3RyaXBlczsKIAlzYy0+c3RyaXBlX3dpZHRoID0gd2lkdGg7CiAJdGktPnNwbGl0X2lvID0gY2h1bmtfc2l6ZTsKQEAgLTE1OCw5ICsxODcsMTEgQEAKIAkJCWtmcmVlKHNjKTsKIAkJCXJldHVybiByOwogCQl9CisJCWF0b21pY19zZXQoJihzYy0+c3RyaXBlW2ldLmVycm9yX2NvdW50KSwgMCk7CiAJfQogCiAJdGktPnByaXZhdGUgPSBzYzsKKwogCXJldHVybiAwOwogfQogCkBAIC0xNzIsNiArMjAzLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgc2MtPnN0cmlwZXM7IGkrKykKIAkJZG1fcHV0X2RldmljZSh0aSwgc2MtPnN0cmlwZVtpXS5kZXYpOwogCisJZmx1c2hfd29ya3F1ZXVlKGtzdHJpcGVkKTsKIAlrZnJlZShzYyk7CiB9CiAKQEAgLTE5MCwxNiArMjIyLDM3IEBACiAJcmV0dXJuIERNX01BUElPX1JFTUFQUEVEOwogfQogCisvKgorICogU3RyaXBlIHN0YXR1czoKKyAqCisgKiBJTkZPCisgKiAjc3RyaXBlcyBbc3RyaXBlX25hbWUgPHN0cmlwZV9uYW1lPl0gW2dyb3VwIHdvcmQgY291bnRdCisgKiBbZXJyb3IgY291bnQgJ0F8RCcgPGVycm9yIGNvdW50ICdBfEQnPl0KKyAqCisgKiBUQUJMRQorICogI3N0cmlwZXMgW3N0cmlwZSBjaHVuayBzaXplXQorICogW3N0cmlwZV9uYW1lIHBoeXNpY2FsX3N0YXJ0IDxzdHJpcGVfbmFtZSBwaHlzaWNhbF9zdGFydD5dCisgKgorICovCisKIHN0YXRpYyBpbnQgc3RyaXBlX3N0YXR1cyhzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwKIAkJCSBzdGF0dXNfdHlwZV90IHR5cGUsIGNoYXIgKnJlc3VsdCwgdW5zaWduZWQgaW50IG1heGxlbikKIHsKIAlzdHJ1Y3Qgc3RyaXBlX2MgKnNjID0gKHN0cnVjdCBzdHJpcGVfYyAqKSB0aS0+cHJpdmF0ZTsKKwljaGFyIGJ1ZmZlcltzYy0+c3RyaXBlcyArIDFdOwogCXVuc2lnbmVkIGludCBzeiA9IDA7CiAJdW5zaWduZWQgaW50IGk7CiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIFNUQVRVU1RZUEVfSU5GTzoKLQkJcmVzdWx0WzBdID0gJ1wwJzsKKwkJRE1FTUlUKCIlZCAiLCBzYy0+c3RyaXBlcyk7CisJCWZvciAoaSA9IDA7IGkgPCBzYy0+c3RyaXBlczsgaSsrKSAgeworCQkJRE1FTUlUKCIlcyAiLCBzYy0+c3RyaXBlW2ldLmRldi0+bmFtZSk7CisJCQlidWZmZXJbaV0gPSBhdG9taWNfcmVhZCgmKHNjLT5zdHJpcGVbaV0uZXJyb3JfY291bnQpKSA/CisJCQkJJ0QnIDogJ0EnOworCQl9CisJCWJ1ZmZlcltpXSA9ICdcMCc7CisJCURNRU1JVCgiMSAlcyIsIGJ1ZmZlcik7CiAJCWJyZWFrOwogCiAJY2FzZSBTVEFUVVNUWVBFX1RBQkxFOgpAQCAtMjEzLDEzICsyNjYsNTIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzdHJpcGVfZW5kX2lvKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3QgYmlvICpiaW8sCisJCQkgaW50IGVycm9yLCB1bmlvbiBtYXBfaW5mbyAqbWFwX2NvbnRleHQpCit7CisJdW5zaWduZWQgaTsKKwljaGFyIG1ham9yX21pbm9yWzE2XTsKKwlzdHJ1Y3Qgc3RyaXBlX2MgKnNjID0gdGktPnByaXZhdGU7CisKKwlpZiAoIWVycm9yKQorCQlyZXR1cm4gMDsgLyogSS9PIGNvbXBsZXRlICovCisKKwlpZiAoKGVycm9yID09IC1FV09VTERCTE9DSykgJiYgYmlvX3J3X2FoZWFkKGJpbykpCisJCXJldHVybiBlcnJvcjsKKworCWlmIChlcnJvciA9PSAtRU9QTk9UU1VQUCkKKwkJcmV0dXJuIGVycm9yOworCisJbWVtc2V0KG1ham9yX21pbm9yLCAwLCBzaXplb2YobWFqb3JfbWlub3IpKTsKKwlzcHJpbnRmKG1ham9yX21pbm9yLCAiJWQ6JWQiLAorCQliaW8tPmJpX2JkZXYtPmJkX2Rpc2stPm1ham9yLAorCQliaW8tPmJpX2JkZXYtPmJkX2Rpc2stPmZpcnN0X21pbm9yKTsKKworCS8qCisJICogVGVzdCB0byBzZWUgd2hpY2ggc3RyaXBlIGRyaXZlIHRyaWdnZXJlZCB0aGUgZXZlbnQKKwkgKiBhbmQgaW5jcmVtZW50IGVycm9yIGNvdW50IGZvciBhbGwgc3RyaXBlcyBvbiB0aGF0IGRldmljZS4KKwkgKiBJZiB0aGUgZXJyb3IgY291bnQgZm9yIGEgZ2l2ZW4gZGV2aWNlIGV4Y2VlZHMgdGhlIHRocmVzaG9sZAorCSAqIHZhbHVlIHdlIHdpbGwgbm8gbG9uZ2VyIHRyaWdnZXIgYW55IGZ1cnRoZXIgZXZlbnRzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBzYy0+c3RyaXBlczsgaSsrKQorCQlpZiAoIXN0cmNtcChzYy0+c3RyaXBlW2ldLmRldi0+bmFtZSwgbWFqb3JfbWlub3IpKSB7CisJCQlhdG9taWNfaW5jKCYoc2MtPnN0cmlwZVtpXS5lcnJvcl9jb3VudCkpOworCQkJaWYgKGF0b21pY19yZWFkKCYoc2MtPnN0cmlwZVtpXS5lcnJvcl9jb3VudCkpIDwKKwkJCSAgICBETV9JT19FUlJPUl9USFJFU0hPTEQpCisJCQkJcXVldWVfd29yayhrc3RyaXBlZCwgJnNjLT5rc3RyaXBlZF93cyk7CisJCX0KKworCXJldHVybiBlcnJvcjsKK30KKwogc3RhdGljIHN0cnVjdCB0YXJnZXRfdHlwZSBzdHJpcGVfdGFyZ2V0ID0gewogCS5uYW1lICAgPSAic3RyaXBlZCIsCi0JLnZlcnNpb249IHsxLCAwLCAyfSwKKwkudmVyc2lvbiA9IHsxLCAxLCAwfSwKIAkubW9kdWxlID0gVEhJU19NT0RVTEUsCiAJLmN0ciAgICA9IHN0cmlwZV9jdHIsCiAJLmR0ciAgICA9IHN0cmlwZV9kdHIsCiAJLm1hcCAgICA9IHN0cmlwZV9tYXAsCisJLmVuZF9pbyA9IHN0cmlwZV9lbmRfaW8sCiAJLnN0YXR1cyA9IHN0cmlwZV9zdGF0dXMsCiB9OwogCkBAIC0yMzEsNiArMzIzLDEzIEBACiAJaWYgKHIgPCAwKQogCQlETVdBUk4oInRhcmdldCByZWdpc3RyYXRpb24gZmFpbGVkIik7CiAKKwlrc3RyaXBlZCA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJrc3RyaXBlZCIpOworCWlmICgha3N0cmlwZWQpIHsKKwkJRE1FUlIoImZhaWxlZCB0byBjcmVhdGUgd29ya3F1ZXVlIGtzdHJpcGVkIik7CisJCWRtX3VucmVnaXN0ZXJfdGFyZ2V0KCZzdHJpcGVfdGFyZ2V0KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCiAJcmV0dXJuIHI7CiB9CiAKQEAgLTIzOSw1ICszMzgsNyBAQAogCWlmIChkbV91bnJlZ2lzdGVyX3RhcmdldCgmc3RyaXBlX3RhcmdldCkpCiAJCURNV0FSTigidGFyZ2V0IHVucmVnaXN0cmF0aW9uIGZhaWxlZCIpOwogCisJZGVzdHJveV93b3JrcXVldWUoa3N0cmlwZWQpOworCiAJcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS10YWJsZS5jIGIvZHJpdmVycy9tZC9kbS10YWJsZS5jCmluZGV4IDQ3ODE4ZDguLmYxNjA2MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tdGFibGUuYworKysgYi9kcml2ZXJzL21kL2RtLXRhYmxlLmMKQEAgLTI4Nyw5ICsyODcsOCBAQAogewogCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCwgKm5leHQ7CiAKLQlmb3IgKHRtcCA9IGRldmljZXMtPm5leHQ7IHRtcCAhPSBkZXZpY2VzOyB0bXAgPSBuZXh0KSB7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHRtcCwgbmV4dCwgZGV2aWNlcykgewogCQlzdHJ1Y3QgZG1fZGV2ICpkZCA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgZG1fZGV2LCBsaXN0KTsKLQkJbmV4dCA9IHRtcC0+bmV4dDsKIAkJa2ZyZWUoZGQpOwogCX0KIH0KQEAgLTQ3Niw3ICs0NzUsNyBAQAogCQkJICAgICAgaW50IG1vZGUsIHN0cnVjdCBkbV9kZXYgKipyZXN1bHQpCiB7CiAJaW50IHI7Ci0JZGV2X3QgZGV2OworCWRldl90IHVuaW5pdGlhbGl6ZWRfdmFyKGRldik7CiAJc3RydWN0IGRtX2RldiAqZGQ7CiAJdW5zaWduZWQgaW50IG1ham9yLCBtaW5vcjsKIApAQCAtODA1LDcgKzgwNCw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJLyogc2V0IHVwIGludGVybmFsIG5vZGVzLCBib3R0b20tdXAgKi8KLQlmb3IgKGkgPSB0LT5kZXB0aCAtIDIsIHRvdGFsID0gMDsgaSA+PSAwOyBpLS0pIHsKKwlmb3IgKGkgPSB0LT5kZXB0aCAtIDI7IGkgPj0gMDsgaS0tKSB7CiAJCXQtPmluZGV4W2ldID0gaW5kZXhlczsKIAkJaW5kZXhlcyArPSAoS0VZU19QRVJfTk9ERSAqIHQtPmNvdW50c1tpXSk7CiAJCXNldHVwX2J0cmVlX2luZGV4KGksIHQpOwpAQCAtOTkzLDEyICs5OTIsMTEgQEAKIAogaW50IGRtX3RhYmxlX2FueV9jb25nZXN0ZWQoc3RydWN0IGRtX3RhYmxlICp0LCBpbnQgYmRpX2JpdHMpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZCwgKmRldmljZXM7CisJc3RydWN0IGRtX2RldiAqZGQ7CisJc3RydWN0IGxpc3RfaGVhZCAqZGV2aWNlcyA9IGRtX3RhYmxlX2dldF9kZXZpY2VzKHQpOwogCWludCByID0gMDsKIAotCWRldmljZXMgPSBkbV90YWJsZV9nZXRfZGV2aWNlcyh0KTsKLQlmb3IgKGQgPSBkZXZpY2VzLT5uZXh0OyBkICE9IGRldmljZXM7IGQgPSBkLT5uZXh0KSB7Ci0JCXN0cnVjdCBkbV9kZXYgKmRkID0gbGlzdF9lbnRyeShkLCBzdHJ1Y3QgZG1fZGV2LCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRkLCBkZXZpY2VzLCBsaXN0KSB7CiAJCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmRldl9nZXRfcXVldWUoZGQtPmJkZXYpOwogCQlyIHw9IGJkaV9jb25nZXN0ZWQoJnEtPmJhY2tpbmdfZGV2X2luZm8sIGJkaV9iaXRzKTsKIAl9CkBAIC0xMDA4LDEwICsxMDA2LDEwIEBACiAKIHZvaWQgZG1fdGFibGVfdW5wbHVnX2FsbChzdHJ1Y3QgZG1fdGFibGUgKnQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZCwgKmRldmljZXMgPSBkbV90YWJsZV9nZXRfZGV2aWNlcyh0KTsKKwlzdHJ1Y3QgZG1fZGV2ICpkZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpkZXZpY2VzID0gZG1fdGFibGVfZ2V0X2RldmljZXModCk7CiAKLQlmb3IgKGQgPSBkZXZpY2VzLT5uZXh0OyBkICE9IGRldmljZXM7IGQgPSBkLT5uZXh0KSB7Ci0JCXN0cnVjdCBkbV9kZXYgKmRkID0gbGlzdF9lbnRyeShkLCBzdHJ1Y3QgZG1fZGV2LCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRkLCBkZXZpY2VzLCBsaXN0KSB7CiAJCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmRldl9nZXRfcXVldWUoZGQtPmJkZXYpOwogCiAJCWJsa191bnBsdWcocSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLmMgYi9kcml2ZXJzL21kL2RtLmMKaW5kZXggZjJkMjRlYi4uNjYxN2NlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS5jCisrKyBiL2RyaXZlcnMvbWQvZG0uYwpAQCAtNzEsOSArNzEsMjIgQEAKICNkZWZpbmUgRE1GX0RFTEVUSU5HIDQKICNkZWZpbmUgRE1GX05PRkxVU0hfU1VTUEVORElORyA1CiAKKy8qCisgKiBXb3JrIHByb2Nlc3NlZCBieSBwZXItZGV2aWNlIHdvcmtxdWV1ZS4KKyAqLworc3RydWN0IGRtX3dxX3JlcSB7CisJZW51bSB7CisJCURNX1dRX0ZMVVNIX0FMTCwKKwkJRE1fV1FfRkxVU0hfREVGRVJSRUQsCisJfSB0eXBlOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXN0cnVjdCBtYXBwZWRfZGV2aWNlICptZDsKKwl2b2lkICpjb250ZXh0OworfTsKKwogc3RydWN0IG1hcHBlZF9kZXZpY2UgewogCXN0cnVjdCByd19zZW1hcGhvcmUgaW9fbG9jazsKLQlzdHJ1Y3Qgc2VtYXBob3JlIHN1c3BlbmRfbG9jazsKKwlzdHJ1Y3QgbXV0ZXggc3VzcGVuZF9sb2NrOwogCXNwaW5sb2NrX3QgcHVzaGJhY2tfbG9jazsKIAlyd2xvY2tfdCBtYXBfbG9jazsKIAlhdG9taWNfdCBob2xkZXJzOwpAQCAtOTYsNiArMTA5LDExIEBACiAJc3RydWN0IGJpb19saXN0IHB1c2hiYWNrOwogCiAJLyoKKwkgKiBQcm9jZXNzaW5nIHF1ZXVlIChmbHVzaC9iYXJyaWVycykKKwkgKi8KKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7CisKKwkvKgogCSAqIFRoZSBjdXJyZW50IG1hcHBpbmcuCiAJICovCiAJc3RydWN0IGRtX3RhYmxlICptYXA7CkBAIC0xODEsNyArMTk5LDcgQEAKIAlETUlORk8oImNsZWFuZWQgdXAiKTsKIH0KIAotaW50ICgqX2luaXRzW10pKHZvaWQpIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgaW50ICgqX2luaXRzW10pKHZvaWQpIF9faW5pdGRhdGEgPSB7CiAJbG9jYWxfaW5pdCwKIAlkbV90YXJnZXRfaW5pdCwKIAlkbV9saW5lYXJfaW5pdCwKQEAgLTE4OSw3ICsyMDcsNyBAQAogCWRtX2ludGVyZmFjZV9pbml0LAogfTsKIAotdm9pZCAoKl9leGl0c1tdKSh2b2lkKSA9IHsKK3N0YXRpYyB2b2lkICgqX2V4aXRzW10pKHZvaWQpID0gewogCWxvY2FsX2V4aXQsCiAJZG1fdGFyZ2V0X2V4aXQsCiAJZG1fbGluZWFyX2V4aXQsCkBAIC05ODIsNyArMTAwMCw3IEBACiAJfQogCiAJaWYgKCF0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSkpCi0JCWdvdG8gYmFkMDsKKwkJZ290byBiYWRfbW9kdWxlX2dldDsKIAogCS8qIGdldCBhIG1pbm9yIG51bWJlciBmb3IgdGhlIGRldiAqLwogCWlmIChtaW5vciA9PSBETV9BTllfTUlOT1IpCkBAIC05OTAsMTEgKzEwMDgsMTEgQEAKIAllbHNlCiAJCXIgPSBzcGVjaWZpY19taW5vcihtZCwgbWlub3IpOwogCWlmIChyIDwgMCkKLQkJZ290byBiYWQxOworCQlnb3RvIGJhZF9taW5vcjsKIAogCW1lbXNldChtZCwgMCwgc2l6ZW9mKCptZCkpOwogCWluaXRfcndzZW0oJm1kLT5pb19sb2NrKTsKLQlpbml0X01VVEVYKCZtZC0+c3VzcGVuZF9sb2NrKTsKKwltdXRleF9pbml0KCZtZC0+c3VzcGVuZF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmbWQtPnB1c2hiYWNrX2xvY2spOwogCXJ3bG9ja19pbml0KCZtZC0+bWFwX2xvY2spOwogCWF0b21pY19zZXQoJm1kLT5ob2xkZXJzLCAxKTsKQEAgLTEwMDYsNyArMTAyNCw3IEBACiAKIAltZC0+cXVldWUgPSBibGtfYWxsb2NfcXVldWUoR0ZQX0tFUk5FTCk7CiAJaWYgKCFtZC0+cXVldWUpCi0JCWdvdG8gYmFkMV9mcmVlX21pbm9yOworCQlnb3RvIGJhZF9xdWV1ZTsKIAogCW1kLT5xdWV1ZS0+cXVldWVkYXRhID0gbWQ7CiAJbWQtPnF1ZXVlLT5iYWNraW5nX2Rldl9pbmZvLmNvbmdlc3RlZF9mbiA9IGRtX2FueV9jb25nZXN0ZWQ7CkBAIC0xMDE3LDExICsxMDM1LDExIEBACiAKIAltZC0+aW9fcG9vbCA9IG1lbXBvb2xfY3JlYXRlX3NsYWJfcG9vbChNSU5fSU9TLCBfaW9fY2FjaGUpOwogCWlmICghbWQtPmlvX3Bvb2wpCi0JCWdvdG8gYmFkMjsKKwkJZ290byBiYWRfaW9fcG9vbDsKIAogCW1kLT50aW9fcG9vbCA9IG1lbXBvb2xfY3JlYXRlX3NsYWJfcG9vbChNSU5fSU9TLCBfdGlvX2NhY2hlKTsKIAlpZiAoIW1kLT50aW9fcG9vbCkKLQkJZ290byBiYWQzOworCQlnb3RvIGJhZF90aW9fcG9vbDsKIAogCW1kLT5icyA9IGJpb3NldF9jcmVhdGUoMTYsIDE2KTsKIAlpZiAoIW1kLT5icykKQEAgLTEwMjksNyArMTA0Nyw3IEBACiAKIAltZC0+ZGlzayA9IGFsbG9jX2Rpc2soMSk7CiAJaWYgKCFtZC0+ZGlzaykKLQkJZ290byBiYWQ0OworCQlnb3RvIGJhZF9kaXNrOwogCiAJYXRvbWljX3NldCgmbWQtPnBlbmRpbmcsIDApOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1kLT53YWl0KTsKQEAgLTEwNDQsNiArMTA2MiwxMCBAQAogCWFkZF9kaXNrKG1kLT5kaXNrKTsKIAlmb3JtYXRfZGV2X3QobWQtPm5hbWUsIE1LREVWKF9tYWpvciwgbWlub3IpKTsKIAorCW1kLT53cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJrZG1mbHVzaCIpOworCWlmICghbWQtPndxKQorCQlnb3RvIGJhZF90aHJlYWQ7CisKIAkvKiBQb3B1bGF0ZSB0aGUgbWFwcGluZywgbm9ib2R5IGtub3dzIHdlIGV4aXN0IHlldCAqLwogCXNwaW5fbG9jaygmX21pbm9yX2xvY2spOwogCW9sZF9tZCA9IGlkcl9yZXBsYWNlKCZfbWlub3JfaWRyLCBtZCwgbWlub3IpOwpAQCAtMTA1MywxOSArMTA3NSwyMSBAQAogCiAJcmV0dXJuIG1kOwogCi0gYmFkNDoKK2JhZF90aHJlYWQ6CisJcHV0X2Rpc2sobWQtPmRpc2spOworYmFkX2Rpc2s6CiAJYmlvc2V0X2ZyZWUobWQtPmJzKTsKLSBiYWRfbm9fYmlvc2V0OgorYmFkX25vX2Jpb3NldDoKIAltZW1wb29sX2Rlc3Ryb3kobWQtPnRpb19wb29sKTsKLSBiYWQzOgorYmFkX3Rpb19wb29sOgogCW1lbXBvb2xfZGVzdHJveShtZC0+aW9fcG9vbCk7Ci0gYmFkMjoKK2JhZF9pb19wb29sOgogCWJsa19jbGVhbnVwX3F1ZXVlKG1kLT5xdWV1ZSk7Ci0gYmFkMV9mcmVlX21pbm9yOgorYmFkX3F1ZXVlOgogCWZyZWVfbWlub3IobWlub3IpOwotIGJhZDE6CitiYWRfbWlub3I6CiAJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Ci0gYmFkMDoKK2JhZF9tb2R1bGVfZ2V0OgogCWtmcmVlKG1kKTsKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTEwODAsNiArMTEwNCw3IEBACiAJCXVubG9ja19mcyhtZCk7CiAJCWJkcHV0KG1kLT5zdXNwZW5kZWRfYmRldik7CiAJfQorCWRlc3Ryb3lfd29ya3F1ZXVlKG1kLT53cSk7CiAJbWVtcG9vbF9kZXN0cm95KG1kLT50aW9fcG9vbCk7CiAJbWVtcG9vbF9kZXN0cm95KG1kLT5pb19wb29sKTsKIAliaW9zZXRfZnJlZShtZC0+YnMpOwpAQCAtMTI1OSwyMCArMTI4NCw5MSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZG1fcHV0KTsKIAorc3RhdGljIGludCBkbV93YWl0X2Zvcl9jb21wbGV0aW9uKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCkKK3sKKwlpbnQgciA9IDA7CisKKwl3aGlsZSAoMSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCisJCXNtcF9tYigpOworCQlpZiAoIWF0b21pY19yZWFkKCZtZC0+cGVuZGluZykpCisJCQlicmVhazsKKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXIgPSAtRUlOVFI7CisJCQlicmVhazsKKwkJfQorCisJCWlvX3NjaGVkdWxlKCk7CisJfQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisKKwlyZXR1cm4gcjsKK30KKwogLyoKICAqIFByb2Nlc3MgdGhlIGRlZmVycmVkIGJpb3MKICAqLwotc3RhdGljIHZvaWQgX19mbHVzaF9kZWZlcnJlZF9pbyhzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQsIHN0cnVjdCBiaW8gKmMpCitzdGF0aWMgdm9pZCBfX2ZsdXNoX2RlZmVycmVkX2lvKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCkKIHsKLQlzdHJ1Y3QgYmlvICpuOworCXN0cnVjdCBiaW8gKmM7CiAKLQl3aGlsZSAoYykgewotCQluID0gYy0+YmlfbmV4dDsKLQkJYy0+YmlfbmV4dCA9IE5VTEw7CisJd2hpbGUgKChjID0gYmlvX2xpc3RfcG9wKCZtZC0+ZGVmZXJyZWQpKSkgewogCQlpZiAoX19zcGxpdF9iaW8obWQsIGMpKQogCQkJYmlvX2lvX2Vycm9yKGMpOwotCQljID0gbjsKIAl9CisKKwljbGVhcl9iaXQoRE1GX0JMT0NLX0lPLCAmbWQtPmZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgX19tZXJnZV9wdXNoYmFja19saXN0KHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1kLT5wdXNoYmFja19sb2NrLCBmbGFncyk7CisJY2xlYXJfYml0KERNRl9OT0ZMVVNIX1NVU1BFTkRJTkcsICZtZC0+ZmxhZ3MpOworCWJpb19saXN0X21lcmdlX2hlYWQoJm1kLT5kZWZlcnJlZCwgJm1kLT5wdXNoYmFjayk7CisJYmlvX2xpc3RfaW5pdCgmbWQtPnB1c2hiYWNrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZC0+cHVzaGJhY2tfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBkbV93cV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZG1fd3FfcmVxICpyZXEgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRtX3dxX3JlcSwgd29yayk7CisJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kID0gcmVxLT5tZDsKKworCWRvd25fd3JpdGUoJm1kLT5pb19sb2NrKTsKKwlzd2l0Y2ggKHJlcS0+dHlwZSkgeworCWNhc2UgRE1fV1FfRkxVU0hfQUxMOgorCQlfX21lcmdlX3B1c2hiYWNrX2xpc3QobWQpOworCQkvKiBwYXNzIHRocm91Z2ggKi8KKwljYXNlIERNX1dRX0ZMVVNIX0RFRkVSUkVEOgorCQlfX2ZsdXNoX2RlZmVycmVkX2lvKG1kKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRE1FUlIoImRtX3dxX3dvcms6IHVucmVjb2duaXNlZCB3b3JrIHR5cGUgJWQiLCByZXEtPnR5cGUpOworCQlCVUcoKTsKKwl9CisJdXBfd3JpdGUoJm1kLT5pb19sb2NrKTsKK30KKworc3RhdGljIHZvaWQgZG1fd3FfcXVldWUoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kLCBpbnQgdHlwZSwgdm9pZCAqY29udGV4dCwKKwkJCXN0cnVjdCBkbV93cV9yZXEgKnJlcSkKK3sKKwlyZXEtPnR5cGUgPSB0eXBlOworCXJlcS0+bWQgPSBtZDsKKwlyZXEtPmNvbnRleHQgPSBjb250ZXh0OworCUlOSVRfV09SSygmcmVxLT53b3JrLCBkbV93cV93b3JrKTsKKwlxdWV1ZV93b3JrKG1kLT53cSwgJnJlcS0+d29yayk7Cit9CisKK3N0YXRpYyB2b2lkIGRtX3F1ZXVlX2ZsdXNoKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCwgaW50IHR5cGUsIHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IGRtX3dxX3JlcSByZXE7CisKKwlkbV93cV9xdWV1ZShtZCwgdHlwZSwgY29udGV4dCwgJnJlcSk7CisJZmx1c2hfd29ya3F1ZXVlKG1kLT53cSk7CiB9CiAKIC8qCkBAIC0xMjgyLDcgKzEzNzgsNyBAQAogewogCWludCByID0gLUVJTlZBTDsKIAotCWRvd24oJm1kLT5zdXNwZW5kX2xvY2spOworCW11dGV4X2xvY2soJm1kLT5zdXNwZW5kX2xvY2spOwogCiAJLyogZGV2aWNlIG11c3QgYmUgc3VzcGVuZGVkICovCiAJaWYgKCFkbV9zdXNwZW5kZWQobWQpKQpAQCAtMTI5Nyw3ICsxMzkzLDcgQEAKIAlyID0gX19iaW5kKG1kLCB0YWJsZSk7CiAKIG91dDoKLQl1cCgmbWQtPnN1c3BlbmRfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZtZC0+c3VzcGVuZF9sb2NrKTsKIAlyZXR1cm4gcjsKIH0KIApAQCAtMTM0NiwxNyArMTQ0MiwxNyBAQAogaW50IGRtX3N1c3BlbmQoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kLCB1bnNpZ25lZCBzdXNwZW5kX2ZsYWdzKQogewogCXN0cnVjdCBkbV90YWJsZSAqbWFwID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCXN0cnVjdCBiaW8gKmRlZjsKLQlpbnQgciA9IC1FSU5WQUw7CisJaW50IHIgPSAwOwogCWludCBkb19sb2NrZnMgPSBzdXNwZW5kX2ZsYWdzICYgRE1fU1VTUEVORF9MT0NLRlNfRkxBRyA/IDEgOiAwOwogCWludCBub2ZsdXNoID0gc3VzcGVuZF9mbGFncyAmIERNX1NVU1BFTkRfTk9GTFVTSF9GTEFHID8gMSA6IDA7CiAKLQlkb3duKCZtZC0+c3VzcGVuZF9sb2NrKTsKKwltdXRleF9sb2NrKCZtZC0+c3VzcGVuZF9sb2NrKTsKIAotCWlmIChkbV9zdXNwZW5kZWQobWQpKQorCWlmIChkbV9zdXNwZW5kZWQobWQpKSB7CisJCXIgPSAtRUlOVkFMOwogCQlnb3RvIG91dF91bmxvY2s7CisJfQogCiAJbWFwID0gZG1fZ2V0X3RhYmxlKG1kKTsKIApAQCAtMTM3OCwxNiArMTQ3NCwxNiBAQAogCQkJciA9IC1FTk9NRU07CiAJCQlnb3RvIGZsdXNoX2FuZF9vdXQ7CiAJCX0KLQl9CiAKLQkvKgotCSAqIEZsdXNoIEkvTyB0byB0aGUgZGV2aWNlLgotCSAqIG5vZmx1c2ggc3VwZXJzZWRlcyBkb19sb2NrZnMsIGJlY2F1c2UgbG9ja19mcygpIG5lZWRzIHRvIGZsdXNoIEkvT3MuCi0JICovCi0JaWYgKGRvX2xvY2tmcyAmJiAhbm9mbHVzaCkgewotCQlyID0gbG9ja19mcyhtZCk7Ci0JCWlmIChyKQotCQkJZ290byBvdXQ7CisJCS8qCisJCSAqIEZsdXNoIEkvTyB0byB0aGUgZGV2aWNlLiBub2ZsdXNoIHN1cGVyc2VkZXMgZG9fbG9ja2ZzLAorCQkgKiBiZWNhdXNlIGxvY2tfZnMoKSBuZWVkcyB0byBmbHVzaCBJL09zLgorCQkgKi8KKwkJaWYgKGRvX2xvY2tmcykgeworCQkJciA9IGxvY2tfZnMobWQpOworCQkJaWYgKHIpCisJCQkJZ290byBvdXQ7CisJCX0KIAl9CiAKIAkvKgpAQCAtMTQwNCw2NiArMTUwMCwzNiBAQAogCQlkbV90YWJsZV91bnBsdWdfYWxsKG1hcCk7CiAKIAkvKgotCSAqIFRoZW4gd2Ugd2FpdCBmb3IgdGhlIGFscmVhZHkgbWFwcGVkIGlvcyB0bwotCSAqIGNvbXBsZXRlLgorCSAqIFdhaXQgZm9yIHRoZSBhbHJlYWR5LW1hcHBlZCBpb3MgdG8gY29tcGxldGUuCiAJICovCi0Jd2hpbGUgKDEpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQotCQlpZiAoIWF0b21pY19yZWFkKCZtZC0+cGVuZGluZykgfHwgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlicmVhazsKLQotCQlpb19zY2hlZHVsZSgpOwotCX0KLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXIgPSBkbV93YWl0X2Zvcl9jb21wbGV0aW9uKG1kKTsKIAogCWRvd25fd3JpdGUoJm1kLT5pb19sb2NrKTsKIAlyZW1vdmVfd2FpdF9xdWV1ZSgmbWQtPndhaXQsICZ3YWl0KTsKIAotCWlmIChub2ZsdXNoKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZtZC0+cHVzaGJhY2tfbG9jaywgZmxhZ3MpOwotCQljbGVhcl9iaXQoRE1GX05PRkxVU0hfU1VTUEVORElORywgJm1kLT5mbGFncyk7Ci0JCWJpb19saXN0X21lcmdlX2hlYWQoJm1kLT5kZWZlcnJlZCwgJm1kLT5wdXNoYmFjayk7Ci0JCWJpb19saXN0X2luaXQoJm1kLT5wdXNoYmFjayk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kLT5wdXNoYmFja19sb2NrLCBmbGFncyk7Ci0JfQorCWlmIChub2ZsdXNoKQorCQlfX21lcmdlX3B1c2hiYWNrX2xpc3QobWQpOworCXVwX3dyaXRlKCZtZC0+aW9fbG9jayk7CiAKIAkvKiB3ZXJlIHdlIGludGVycnVwdGVkID8gKi8KLQlyID0gLUVJTlRSOwotCWlmIChhdG9taWNfcmVhZCgmbWQtPnBlbmRpbmcpKSB7Ci0JCWNsZWFyX2JpdChETUZfQkxPQ0tfSU8sICZtZC0+ZmxhZ3MpOwotCQlkZWYgPSBiaW9fbGlzdF9nZXQoJm1kLT5kZWZlcnJlZCk7Ci0JCV9fZmx1c2hfZGVmZXJyZWRfaW8obWQsIGRlZik7Ci0JCXVwX3dyaXRlKCZtZC0+aW9fbG9jayk7CisJaWYgKHIgPCAwKSB7CisJCWRtX3F1ZXVlX2ZsdXNoKG1kLCBETV9XUV9GTFVTSF9ERUZFUlJFRCwgTlVMTCk7CisKIAkJdW5sb2NrX2ZzKG1kKTsKIAkJZ290byBvdXQ7IC8qIHB1c2hiYWNrIGxpc3QgaXMgYWxyZWFkeSBmbHVzaGVkLCBzbyBza2lwIGZsdXNoICovCiAJfQotCXVwX3dyaXRlKCZtZC0+aW9fbG9jayk7CiAKIAlkbV90YWJsZV9wb3N0c3VzcGVuZF90YXJnZXRzKG1hcCk7CiAKIAlzZXRfYml0KERNRl9TVVNQRU5ERUQsICZtZC0+ZmxhZ3MpOwogCi0JciA9IDA7Ci0KIGZsdXNoX2FuZF9vdXQ6Ci0JaWYgKHIgJiYgbm9mbHVzaCkgeworCWlmIChyICYmIG5vZmx1c2gpCiAJCS8qCiAJCSAqIEJlY2F1c2UgdGhlcmUgbWF5IGJlIGFscmVhZHkgSS9PcyBpbiB0aGUgcHVzaGJhY2sgbGlzdCwKIAkJICogZmx1c2ggdGhlbSBiZWZvcmUgcmV0dXJuLgogCQkgKi8KLQkJZG93bl93cml0ZSgmbWQtPmlvX2xvY2spOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZtZC0+cHVzaGJhY2tfbG9jaywgZmxhZ3MpOwotCQljbGVhcl9iaXQoRE1GX05PRkxVU0hfU1VTUEVORElORywgJm1kLT5mbGFncyk7Ci0JCWJpb19saXN0X21lcmdlX2hlYWQoJm1kLT5kZWZlcnJlZCwgJm1kLT5wdXNoYmFjayk7Ci0JCWJpb19saXN0X2luaXQoJm1kLT5wdXNoYmFjayk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kLT5wdXNoYmFja19sb2NrLCBmbGFncyk7Ci0KLQkJZGVmID0gYmlvX2xpc3RfZ2V0KCZtZC0+ZGVmZXJyZWQpOwotCQlfX2ZsdXNoX2RlZmVycmVkX2lvKG1kLCBkZWYpOwotCQl1cF93cml0ZSgmbWQtPmlvX2xvY2spOwotCX0KKwkJZG1fcXVldWVfZmx1c2gobWQsIERNX1dRX0ZMVVNIX0FMTCwgTlVMTCk7CiAKIG91dDoKIAlpZiAociAmJiBtZC0+c3VzcGVuZGVkX2JkZXYpIHsKQEAgLTE0NzQsMTcgKzE1NDAsMTYgQEAKIAlkbV90YWJsZV9wdXQobWFwKTsKIAogb3V0X3VubG9jazoKLQl1cCgmbWQtPnN1c3BlbmRfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZtZC0+c3VzcGVuZF9sb2NrKTsKIAlyZXR1cm4gcjsKIH0KIAogaW50IGRtX3Jlc3VtZShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpCiB7CiAJaW50IHIgPSAtRUlOVkFMOwotCXN0cnVjdCBiaW8gKmRlZjsKIAlzdHJ1Y3QgZG1fdGFibGUgKm1hcCA9IE5VTEw7CiAKLQlkb3duKCZtZC0+c3VzcGVuZF9sb2NrKTsKKwltdXRleF9sb2NrKCZtZC0+c3VzcGVuZF9sb2NrKTsKIAlpZiAoIWRtX3N1c3BlbmRlZChtZCkpCiAJCWdvdG8gb3V0OwogCkBAIC0xNDk2LDEyICsxNTYxLDcgQEAKIAlpZiAocikKIAkJZ290byBvdXQ7CiAKLQlkb3duX3dyaXRlKCZtZC0+aW9fbG9jayk7Ci0JY2xlYXJfYml0KERNRl9CTE9DS19JTywgJm1kLT5mbGFncyk7Ci0KLQlkZWYgPSBiaW9fbGlzdF9nZXQoJm1kLT5kZWZlcnJlZCk7Ci0JX19mbHVzaF9kZWZlcnJlZF9pbyhtZCwgZGVmKTsKLQl1cF93cml0ZSgmbWQtPmlvX2xvY2spOworCWRtX3F1ZXVlX2ZsdXNoKG1kLCBETV9XUV9GTFVTSF9ERUZFUlJFRCwgTlVMTCk7CiAKIAl1bmxvY2tfZnMobWQpOwogCkBAIC0xNTIwLDcgKzE1ODAsNyBAQAogCiBvdXQ6CiAJZG1fdGFibGVfcHV0KG1hcCk7Ci0JdXAoJm1kLT5zdXNwZW5kX2xvY2spOworCW11dGV4X3VubG9jaygmbWQtPnN1c3BlbmRfbG9jayk7CiAKIAlyZXR1cm4gcjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8va29uaWNhd2MuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8va29uaWNhd2MuYwppbmRleCAzZTkzZjgwLi43MTliMTdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL2tvbmljYXdjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9rb25pY2F3Yy5jCkBAIC0yNDEsOCArMjQxLDYgQEAKIAlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKTsKIAlpbnB1dF9kZXYtPmtleWJpdFtCSVRfV09SRChCVE5fMCldID0gQklUX01BU0soQlROXzApOwogCi0JaW5wdXRfZGV2LT5wcml2YXRlID0gY2FtOwotCiAJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoY2FtLT5pbnB1dCk7CiAJaWYgKGVycm9yKSB7CiAJCXdhcm4oIkZhaWxlZCB0byByZWdpc3RlciBjYW1lcmEncyBpbnB1dCBkZXZpY2UsIGVycjogJWRcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3F1aWNrY2FtX21lc3Nlbmdlci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9xdWlja2NhbV9tZXNzZW5nZXIuYwppbmRleCA1ZTdiNzk1Li5hMmFjYmEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3F1aWNrY2FtX21lc3Nlbmdlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vcXVpY2tjYW1fbWVzc2VuZ2VyLmMKQEAgLTEwNSw4ICsxMDUsNiBAQAogCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVRfTUFTSyhFVl9LRVkpOwogCWlucHV0X2Rldi0+a2V5Yml0W0JJVF9XT1JEKEJUTl8wKV0gPSBCSVRfTUFTSyhCVE5fMCk7CiAKLQlpbnB1dF9kZXYtPnByaXZhdGUgPSBjYW07Ci0KIAllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShjYW0tPmlucHV0KTsKIAlpZiAoZXJyb3IpIHsKIAkJd2FybigiRmFpbGVkIHRvIHJlZ2lzdGVyIGNhbWVyYSdzIGlucHV0IGRldmljZSwgZXJyOiAlZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVtc3RpY2svS2NvbmZpZyBiL2RyaXZlcnMvbWVtc3RpY2svS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDkzZmRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZW1zdGljay9LY29uZmlnCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgTWVtb3J5U3RpY2sgc3Vic3lzdGVtIGNvbmZpZ3VyYXRpb24KKyMKKworbWVudWNvbmZpZyBNRU1TVElDSworCXRyaXN0YXRlICJTb255IE1lbW9yeVN0aWNrIGNhcmQgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwloZWxwCisJICBTb255IE1lbW9yeVN0aWNrIGlzIGEgcHJvcHJpZXRhcnkgc3RvcmFnZS9leHRlbnNpb24gY2FyZCBwcm90b2NvbC4KKworCSAgSWYgeW91IHdhbnQgTWVtb3J5U3RpY2sgc3VwcG9ydCwgeW91IHNob3VsZCBzYXkgWSBoZXJlIGFuZCBhbHNvCisJICB0byB0aGUgc3BlY2lmaWMgZHJpdmVyIGZvciB5b3VyIE1NQyBpbnRlcmZhY2UuCisKK2lmIE1FTVNUSUNLCisKK2NvbmZpZyBNRU1TVElDS19ERUJVRworCWJvb2wgIk1lbW9yeVN0aWNrIGRlYnVnZ2luZyIKKwloZWxwCisJICBUaGlzIGlzIGFuIG9wdGlvbiBmb3IgdXNlIGJ5IGRldmVsb3BlcnM7IG1vc3QgcGVvcGxlIHNob3VsZAorCSAgc2F5IE4gaGVyZS4gIFRoaXMgZW5hYmxlcyBNZW1vcnlTdGljayBjb3JlIGFuZCBkcml2ZXIgZGVidWdnaW5nLgorCisKK3NvdXJjZSAiZHJpdmVycy9tZW1zdGljay9jb3JlL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9tZW1zdGljay9ob3N0L0tjb25maWciCisKK2VuZGlmICMgTUVNU1RJQ0sKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVtc3RpY2svTWFrZWZpbGUgYi9kcml2ZXJzL21lbXN0aWNrL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMTYwZmI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZW1zdGljay9NYWtlZmlsZQpAQCAtMCwwICsxLDExIEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUga2VybmVsIE1lbW9yeVN0aWNrIGRldmljZSBkcml2ZXJzLgorIworCitpZmVxICgkKENPTkZJR19NRU1TVElDS19ERUJVRykseSkKKwlFWFRSQV9DRkxBR1MJCSs9IC1EREVCVUcKK2VuZGlmCisKK29iai0kKENPTkZJR19NRU1TVElDSykJCSs9IGNvcmUvCitvYmotJChDT05GSUdfTUVNU1RJQ0spCQkrPSBob3N0LworCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lbXN0aWNrL2NvcmUvS2NvbmZpZyBiL2RyaXZlcnMvbWVtc3RpY2svY29yZS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZjE4MTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lbXN0aWNrL2NvcmUvS2NvbmZpZwpAQCAtMCwwICsxLDI2IEBACisjCisjIE1lbW9yeVN0aWNrIGNvcmUgY29uZmlndXJhdGlvbgorIworCitjb21tZW50ICJNZW1vcnlTdGljayBkcml2ZXJzIgorCitjb25maWcgTUVNU1RJQ0tfVU5TQUZFX1JFU1VNRQorICAgICAgICBib29sICJBbGxvdyB1bnNhZmUgcmVzdW1lIChEQU5HRVJPVVMpIgorICAgICAgICBoZWxwCisgICAgICAgICAgSWYgeW91IHNheSBZIGhlcmUsIHRoZSBNZW1vcnlTdGljayBsYXllciB3aWxsIGFzc3VtZSB0aGF0IGFsbAorICAgICAgICAgIGNhcmRzIHN0YXllZCBpbiB0aGVpciByZXNwZWN0aXZlIHNsb3RzIGR1cmluZyB0aGUgc3VzcGVuZC4gVGhlCisgICAgICAgICAgbm9ybWFsIGJlaGF2aW91ciBpcyB0byByZW1vdmUgdGhlbSBhdCBzdXNwZW5kIGFuZAorICAgICAgICAgIHJlZGV0ZWN0aW5nIHRoZW0gYXQgcmVzdW1lLiBCcmVha2luZyB0aGlzIGFzc3VtcHRpb24gd2lsbAorICAgICAgICAgIGluIG1vc3QgY2FzZXMgcmVzdWx0IGluIGRhdGEgY29ycnVwdGlvbi4KKworICAgICAgICAgIFRoaXMgb3B0aW9uIGlzIHVzdWFsbHkganVzdCBmb3IgZW1iZWRkZWQgc3lzdGVtcyB3aGljaCB1c2UKKyAgICAgICAgICBhIE1lbW9yeVN0aWNrIGNhcmQgZm9yIHJvb3Rmcy4gTW9zdCBwZW9wbGUgc2hvdWxkIHNheSBOIGhlcmUuCisKK2NvbmZpZyBNU1BST19CTE9DSworCXRyaXN0YXRlICJNZW1vcnlTdGljayBQcm8gYmxvY2sgZGV2aWNlIGRyaXZlciIKKwlkZXBlbmRzIG9uIEJMT0NLCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgdGhlIE1lbW9yeVN0aWNrIFBybyBibG9jayBkZXZpY2UgZHJpdmVyCisJICBzdXBwb3J0LiBUaGlzIHByb3ZpZGVzIGEgYmxvY2sgZGV2aWNlIGRyaXZlciwgd2hpY2ggeW91IGNhbiB1c2UKKwkgIHRvIG1vdW50IHRoZSBmaWxlc3lzdGVtLiBBbG1vc3QgZXZlcnlvbmUgd2lzaGluZyBNZW1vcnlTdGljaworCSAgc3VwcG9ydCBzaG91bGQgc2F5IFkgb3IgTSBoZXJlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZW1zdGljay9jb3JlL01ha2VmaWxlIGIvZHJpdmVycy9tZW1zdGljay9jb3JlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMmI1MjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lbXN0aWNrL2NvcmUvTWFrZWZpbGUKQEAgLTAsMCArMSwxMSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGtlcm5lbCBNZW1vcnlTdGljayBjb3JlLgorIworCitpZmVxICgkKENPTkZJR19NRU1TVElDS19ERUJVRykseSkKKwlFWFRSQV9DRkxBR1MJCSs9IC1EREVCVUcKK2VuZGlmCisKK29iai0kKENPTkZJR19NRU1TVElDSykJCSs9IG1lbXN0aWNrLm8KKworb2JqLSQoQ09ORklHX01TUFJPX0JMT0NLKQkrPSBtc3Byb19ibG9jay5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbWVtc3RpY2suYyBiL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tZW1zdGljay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYTQ2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lbXN0aWNrL2NvcmUvbWVtc3RpY2suYwpAQCAtMCwwICsxLDYxNCBAQAorLyoKKyAqICBTb255IE1lbW9yeVN0aWNrIHN1cHBvcnQKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IEFsZXggRHVib3YgPG9ha2FkQHlhaG9vLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFNwZWNpYWwgdGhhbmtzIHRvIENhcmxvcyBDb3JiYWNobyBmb3IgcHJvdmlkaW5nIHZhcmlvdXMgTWVtb3J5U3RpY2sgY2FyZHMKKyAqIHRoYXQgbWFkZSB0aGlzIGRyaXZlciBwb3NzaWJsZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21lbXN0aWNrLmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjZGVmaW5lIERSSVZFUl9OQU1FICJtZW1zdGljayIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuMiIKKworc3RhdGljIHVuc2lnbmVkIGludCBjbWRfcmV0cmllcyA9IDM7Cittb2R1bGVfcGFyYW0oY21kX3JldHJpZXMsIHVpbnQsIDA2NDQpOworCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZTsKK3N0YXRpYyBERUZJTkVfSURSKG1lbXN0aWNrX2hvc3RfaWRyKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWVtc3RpY2tfaG9zdF9sb2NrKTsKKworc3RhdGljIGludCBtZW1zdGlja19kZXZfbWF0Y2goc3RydWN0IG1lbXN0aWNrX2RldiAqY2FyZCwKKwkJCSAgICAgIHN0cnVjdCBtZW1zdGlja19kZXZpY2VfaWQgKmlkKQoreworCWlmIChpZC0+bWF0Y2hfZmxhZ3MgJiBNRU1TVElDS19NQVRDSF9BTEwpIHsKKwkJaWYgKChpZC0+dHlwZSA9PSBjYXJkLT5pZC50eXBlKQorCQkgICAgJiYgKGlkLT5jYXRlZ29yeSA9PSBjYXJkLT5pZC5jYXRlZ29yeSkKKwkJICAgICYmIChpZC0+Y2xhc3MgPT0gY2FyZC0+aWQuY2xhc3MpKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWVtc3RpY2tfYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3sKKwlzdHJ1Y3QgbWVtc3RpY2tfZGV2ICpjYXJkID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IG1lbXN0aWNrX2RldiwKKwkJCQkJCSBkZXYpOworCXN0cnVjdCBtZW1zdGlja19kcml2ZXIgKm1zX2RydiA9IGNvbnRhaW5lcl9vZihkcnYsCisJCQkJCQkgICAgICBzdHJ1Y3QgbWVtc3RpY2tfZHJpdmVyLAorCQkJCQkJICAgICAgZHJpdmVyKTsKKwlzdHJ1Y3QgbWVtc3RpY2tfZGV2aWNlX2lkICppZHMgPSBtc19kcnYtPmlkX3RhYmxlOworCisJaWYgKGlkcykgeworCQl3aGlsZSAoaWRzLT5tYXRjaF9mbGFncykgeworCQkJaWYgKG1lbXN0aWNrX2Rldl9tYXRjaChjYXJkLCBpZHMpKQorCQkJCXJldHVybiAxOworCQkJKytpZHM7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWVtc3RpY2tfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQoreworCXN0cnVjdCBtZW1zdGlja19kZXYgKmNhcmQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgbWVtc3RpY2tfZGV2LAorCQkJCQkJICBkZXYpOworCisJaWYgKGFkZF91ZXZlbnRfdmFyKGVudiwgIk1FTVNUSUNLX1RZUEU9JTAyWCIsIGNhcmQtPmlkLnR5cGUpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJNRU1TVElDS19DQVRFR09SWT0lMDJYIiwgY2FyZC0+aWQuY2F0ZWdvcnkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJNRU1TVElDS19DTEFTUz0lMDJYIiwgY2FyZC0+aWQuY2xhc3MpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1lbXN0aWNrX2RldmljZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1lbXN0aWNrX2RldiAqY2FyZCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBtZW1zdGlja19kZXYsCisJCQkJCQkgZGV2KTsKKwlzdHJ1Y3QgbWVtc3RpY2tfZHJpdmVyICpkcnYgPSBjb250YWluZXJfb2YoZGV2LT5kcml2ZXIsCisJCQkJCQkgICBzdHJ1Y3QgbWVtc3RpY2tfZHJpdmVyLAorCQkJCQkJICAgZHJpdmVyKTsKKwlpbnQgcmMgPSAtRU5PREVWOworCisJaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+cHJvYmUpIHsKKwkJcmMgPSBkcnYtPnByb2JlKGNhcmQpOworCQlpZiAoIXJjKQorCQkJZ2V0X2RldmljZShkZXYpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbWVtc3RpY2tfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1lbXN0aWNrX2RldiAqY2FyZCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBtZW1zdGlja19kZXYsCisJCQkJCQkgIGRldik7CisJc3RydWN0IG1lbXN0aWNrX2RyaXZlciAqZHJ2ID0gY29udGFpbmVyX29mKGRldi0+ZHJpdmVyLAorCQkJCQkJICAgc3RydWN0IG1lbXN0aWNrX2RyaXZlciwKKwkJCQkJCSAgIGRyaXZlcik7CisKKwlpZiAoZGV2LT5kcml2ZXIgJiYgZHJ2LT5yZW1vdmUpIHsKKwkJZHJ2LT5yZW1vdmUoY2FyZCk7CisJCWNhcmQtPmRldi5kcml2ZXIgPSBOVUxMOworCX0KKworCXB1dF9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IG1lbXN0aWNrX2RldmljZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBtZW1zdGlja19kZXYgKmNhcmQgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgbWVtc3RpY2tfZGV2LAorCQkJCQkJICBkZXYpOworCXN0cnVjdCBtZW1zdGlja19kcml2ZXIgKmRydiA9IGNvbnRhaW5lcl9vZihkZXYtPmRyaXZlciwKKwkJCQkJCSAgIHN0cnVjdCBtZW1zdGlja19kcml2ZXIsCisJCQkJCQkgICBkcml2ZXIpOworCisJaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+c3VzcGVuZCkKKwkJcmV0dXJuIGRydi0+c3VzcGVuZChjYXJkLCBzdGF0ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWVtc3RpY2tfZGV2aWNlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1lbXN0aWNrX2RldiAqY2FyZCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBtZW1zdGlja19kZXYsCisJCQkJCQkgIGRldik7CisJc3RydWN0IG1lbXN0aWNrX2RyaXZlciAqZHJ2ID0gY29udGFpbmVyX29mKGRldi0+ZHJpdmVyLAorCQkJCQkJICAgc3RydWN0IG1lbXN0aWNrX2RyaXZlciwKKwkJCQkJCSAgIGRyaXZlcik7CisKKwlpZiAoZGV2LT5kcml2ZXIgJiYgZHJ2LT5yZXN1bWUpCisJCXJldHVybiBkcnYtPnJlc3VtZShjYXJkKTsKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKworI2RlZmluZSBtZW1zdGlja19kZXZpY2Vfc3VzcGVuZCBOVUxMCisjZGVmaW5lIG1lbXN0aWNrX2RldmljZV9yZXN1bWUgTlVMTAorCisjZW5kaWYgLyogQ09ORklHX1BNICovCisKKyNkZWZpbmUgTUVNU1RJQ0tfQVRUUihuYW1lLCBmb3JtYXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IG5hbWUjI19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIFwKKwkJCSAgICBjaGFyICpidWYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlzdHJ1Y3QgbWVtc3RpY2tfZGV2ICpjYXJkID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IG1lbXN0aWNrX2RldiwgICAgXAorCQkJCQkJIGRldik7ICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgZm9ybWF0LCBjYXJkLT5pZC5uYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK01FTVNUSUNLX0FUVFIodHlwZSwgIiUwMlgiKTsKK01FTVNUSUNLX0FUVFIoY2F0ZWdvcnksICIlMDJYIik7CitNRU1TVElDS19BVFRSKGNsYXNzLCAiJTAyWCIpOworCisjZGVmaW5lIE1FTVNUSUNLX0FUVFJfUk8obmFtZSkgX19BVFRSKG5hbWUsIFNfSVJVR08sIG5hbWUjI19zaG93LCBOVUxMKQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgbWVtc3RpY2tfZGV2X2F0dHJzW10gPSB7CisJTUVNU1RJQ0tfQVRUUl9STyh0eXBlKSwKKwlNRU1TVElDS19BVFRSX1JPKGNhdGVnb3J5KSwKKwlNRU1TVElDS19BVFRSX1JPKGNsYXNzKSwKKwlfX0FUVFJfTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBidXNfdHlwZSBtZW1zdGlja19idXNfdHlwZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAibWVtc3RpY2siLAorCS5kZXZfYXR0cnMgICAgICA9IG1lbXN0aWNrX2Rldl9hdHRycywKKwkubWF0Y2ggICAgICAgICAgPSBtZW1zdGlja19idXNfbWF0Y2gsCisJLnVldmVudCAgICAgICAgID0gbWVtc3RpY2tfdWV2ZW50LAorCS5wcm9iZSAgICAgICAgICA9IG1lbXN0aWNrX2RldmljZV9wcm9iZSwKKwkucmVtb3ZlICAgICAgICAgPSBtZW1zdGlja19kZXZpY2VfcmVtb3ZlLAorCS5zdXNwZW5kICAgICAgICA9IG1lbXN0aWNrX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUgICAgICAgICA9IG1lbXN0aWNrX2RldmljZV9yZXN1bWUKK307CisKK3N0YXRpYyB2b2lkIG1lbXN0aWNrX2ZyZWUoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldikKK3sKKwlzdHJ1Y3QgbWVtc3RpY2tfaG9zdCAqaG9zdCA9IGNvbnRhaW5lcl9vZihjZGV2LCBzdHJ1Y3QgbWVtc3RpY2tfaG9zdCwKKwkJCQkJCSAgY2Rldik7CisJa2ZyZWUoaG9zdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgbWVtc3RpY2tfaG9zdF9jbGFzcyA9IHsKKwkubmFtZSAgICAgICA9ICJtZW1zdGlja19ob3N0IiwKKwkucmVsZWFzZSAgICA9IG1lbXN0aWNrX2ZyZWUKK307CisKK3N0YXRpYyB2b2lkIG1lbXN0aWNrX2ZyZWVfY2FyZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1lbXN0aWNrX2RldiAqY2FyZCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBtZW1zdGlja19kZXYsCisJCQkJCQkgZGV2KTsKKwlrZnJlZShjYXJkKTsKK30KKworc3RhdGljIGludCBtZW1zdGlja19kdW1teV9jaGVjayhzdHJ1Y3QgbWVtc3RpY2tfZGV2ICpjYXJkKQoreworCXJldHVybiAwOworfQorCisvKioKKyAqIG1lbXN0aWNrX2RldGVjdF9jaGFuZ2UgLSBzY2hlZHVsZSBtZWRpYSBkZXRlY3Rpb24gb24gbWVtc3RpY2sgaG9zdAorICogQGhvc3QgLSBob3N0IHRvIHVzZQorICovCit2b2lkIG1lbXN0aWNrX2RldGVjdF9jaGFuZ2Uoc3RydWN0IG1lbXN0aWNrX2hvc3QgKmhvc3QpCit7CisJcXVldWVfd29yayh3b3JrcXVldWUsICZob3N0LT5tZWRpYV9jaGVja2VyKTsKK30KK0VYUE9SVF9TWU1CT0wobWVtc3RpY2tfZGV0ZWN0X2NoYW5nZSk7CisKKy8qKgorICogbWVtc3RpY2tfbmV4dF9yZXEgLSBjYWxsZWQgYnkgaG9zdCBkcml2ZXIgdG8gb2J0YWluIG5leHQgcmVxdWVzdCB0byBwcm9jZXNzCisgKiBAaG9zdCAtIGhvc3QgdG8gdXNlCisgKiBAbXJxIC0gcG9pbnRlciB0byBzdGljayB0aGUgcmVxdWVzdCB0bworICoKKyAqIEhvc3QgY2FsbHMgdGhpcyBmdW5jdGlvbiBmcm9tIGlkbGUgc3RhdGUgKCptcnEgPT0gTlVMTCkgb3IgYWZ0ZXIgZmluaXNoaW5nCisgKiBwcmV2aW91cyByZXF1ZXN0ICgqbXJxIHNob3VsZCBwb2ludCB0byBpdCkuIElmIHByZXZpb3VzIHJlcXVlc3Qgd2FzCisgKiB1bnN1Y2Nlc3NmdWwsIGl0IGlzIHJldHJpZWQgZm9yIHByZWRldGVybWluZWQgbnVtYmVyIG9mIHRpbWVzLiBSZXR1cm4gdmFsdWUKKyAqIG9mIDAgbWVhbnMgdGhhdCBuZXcgcmVxdWVzdCB3YXMgYXNzaWduZWQgdG8gdGhlIGhvc3QuCisgKi8KK2ludCBtZW1zdGlja19uZXh0X3JlcShzdHJ1Y3QgbWVtc3RpY2tfaG9zdCAqaG9zdCwgc3RydWN0IG1lbXN0aWNrX3JlcXVlc3QgKiptcnEpCit7CisJaW50IHJjID0gLUVOWElPOworCisJaWYgKCgqbXJxKSAmJiAoKm1ycSktPmVycm9yICYmIGhvc3QtPnJldHJpZXMpIHsKKwkJKCptcnEpLT5lcnJvciA9IHJjOworCQlob3N0LT5yZXRyaWVzLS07CisJCXJldHVybiAwOworCX0KKworCWlmIChob3N0LT5jYXJkICYmIGhvc3QtPmNhcmQtPm5leHRfcmVxdWVzdCkKKwkJcmMgPSBob3N0LT5jYXJkLT5uZXh0X3JlcXVlc3QoaG9zdC0+Y2FyZCwgbXJxKTsKKworCWlmICghcmMpCisJCWhvc3QtPnJldHJpZXMgPSBjbWRfcmV0cmllczsKKwllbHNlCisJCSptcnEgPSBOVUxMOworCisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChtZW1zdGlja19uZXh0X3JlcSk7CisKKy8qKgorICogbWVtc3RpY2tfbmV3X3JlcSAtIG5vdGlmeSB0aGUgaG9zdCB0aGF0IHNvbWUgcmVxdWVzdHMgYXJlIHBlbmRpbmcKKyAqIEBob3N0IC0gaG9zdCB0byB1c2UKKyAqLwordm9pZCBtZW1zdGlja19uZXdfcmVxKHN0cnVjdCBtZW1zdGlja19ob3N0ICpob3N0KQoreworCWhvc3QtPnJldHJpZXMgPSBjbWRfcmV0cmllczsKKwlob3N0LT5yZXF1ZXN0KGhvc3QpOworfQorRVhQT1JUX1NZTUJPTChtZW1zdGlja19uZXdfcmVxKTsKKworLyoqCisgKiBtZW1zdGlja19pbml0X3JlcV9zZyAtIHNldCByZXF1ZXN0IGZpZWxkcyBuZWVkZWQgZm9yIGJ1bGsgZGF0YSB0cmFuc2ZlcgorICogQG1ycSAtIHJlcXVlc3QgdG8gdXNlCisgKiBAdHBjIC0gbWVtc3RpY2sgVHJhbnNwb3J0IFByb3RvY29sIENvbW1hbmQKKyAqIEBzZyAtIFRQQyBhcmd1bWVudAorICovCit2b2lkIG1lbXN0aWNrX2luaXRfcmVxX3NnKHN0cnVjdCBtZW1zdGlja19yZXF1ZXN0ICptcnEsIHVuc2lnbmVkIGNoYXIgdHBjLAorCQkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnKQoreworCW1ycS0+dHBjID0gdHBjOworCWlmICh0cGMgJiA4KQorCQltcnEtPmRhdGFfZGlyID0gV1JJVEU7CisJZWxzZQorCQltcnEtPmRhdGFfZGlyID0gUkVBRDsKKworCW1ycS0+c2cgPSAqc2c7CisJbXJxLT5pb190eXBlID0gTUVNU1RJQ0tfSU9fU0c7CisKKwlpZiAodHBjID09IE1TX1RQQ19TRVRfQ01EIHx8IHRwYyA9PSBNU19UUENfRVhfU0VUX0NNRCkKKwkJbXJxLT5uZWVkX2NhcmRfaW50ID0gMTsKKwllbHNlCisJCW1ycS0+bmVlZF9jYXJkX2ludCA9IDA7CisKKwltcnEtPmdldF9pbnRfcmVnID0gMDsKK30KK0VYUE9SVF9TWU1CT0wobWVtc3RpY2tfaW5pdF9yZXFfc2cpOworCisvKioKKyAqIG1lbXN0aWNrX2luaXRfcmVxIC0gc2V0IHJlcXVlc3QgZmllbGRzIG5lZWRlZCBmb3Igc2hvcnQgZGF0YSB0cmFuc2ZlcgorICogQG1ycSAtIHJlcXVlc3QgdG8gdXNlCisgKiBAdHBjIC0gbWVtc3RpY2sgVHJhbnNwb3J0IFByb3RvY29sIENvbW1hbmQKKyAqIEBidWYgLSBUUEMgYXJndW1lbnQgYnVmZmVyCisgKiBAbGVuZ3RoIC0gVFBDIGFyZ3VtZW50IHNpemUKKyAqCisgKiBUaGUgaW50ZW5kZWQgdXNlIG9mIHRoaXMgZnVuY3Rpb24gKHRyYW5zZmVyIG9mIGRhdGEgaXRlbXMgc2V2ZXJhbCBieXRlcworICogaW4gc2l6ZSkgYWxsb3dzIHVzIHRvIGp1c3QgY29weSB0aGUgdmFsdWUgYmV0d2VlbiByZXF1ZXN0IHN0cnVjdHVyZSBhbmQKKyAqIHVzZXIgc3VwcGxpZWQgYnVmZmVyLgorICovCit2b2lkIG1lbXN0aWNrX2luaXRfcmVxKHN0cnVjdCBtZW1zdGlja19yZXF1ZXN0ICptcnEsIHVuc2lnbmVkIGNoYXIgdHBjLAorCQkgICAgICAgdm9pZCAqYnVmLCBzaXplX3QgbGVuZ3RoKQoreworCW1ycS0+dHBjID0gdHBjOworCWlmICh0cGMgJiA4KQorCQltcnEtPmRhdGFfZGlyID0gV1JJVEU7CisJZWxzZQorCQltcnEtPmRhdGFfZGlyID0gUkVBRDsKKworCW1ycS0+ZGF0YV9sZW4gPSBsZW5ndGggPiBzaXplb2YobXJxLT5kYXRhKSA/IHNpemVvZihtcnEtPmRhdGEpIDogbGVuZ3RoOworCWlmIChtcnEtPmRhdGFfZGlyID09IFdSSVRFKQorCQltZW1jcHkobXJxLT5kYXRhLCBidWYsIG1ycS0+ZGF0YV9sZW4pOworCisJbXJxLT5pb190eXBlID0gTUVNU1RJQ0tfSU9fVkFMOworCisJaWYgKHRwYyA9PSBNU19UUENfU0VUX0NNRCB8fCB0cGMgPT0gTVNfVFBDX0VYX1NFVF9DTUQpCisJCW1ycS0+bmVlZF9jYXJkX2ludCA9IDE7CisJZWxzZQorCQltcnEtPm5lZWRfY2FyZF9pbnQgPSAwOworCisJbXJxLT5nZXRfaW50X3JlZyA9IDA7Cit9CitFWFBPUlRfU1lNQk9MKG1lbXN0aWNrX2luaXRfcmVxKTsKKworLyoKKyAqIEZ1bmN0aW9ucyBwcmVmaXhlZCB3aXRoICJoXyIgYXJlIHByb3RvY29sIGNhbGxiYWNrcy4gVGhleSBjYW4gYmUgY2FsbGVkIGZyb20KKyAqIGludGVycnVwdCBjb250ZXh0LiBSZXR1cm4gdmFsdWUgb2YgMCBtZWFucyB0aGF0IHJlcXVlc3QgcHJvY2Vzc2luZyBpcyBzdGlsbAorICogb25nb2luZywgd2hpbGUgc3BlY2lhbCBlcnJvciB2YWx1ZSBvZiAtRUFHQUlOIG1lYW5zIHRoYXQgY3VycmVudCByZXF1ZXN0IGlzCisgKiBmaW5pc2hlZCAoYW5kIHJlcXVlc3QgcHJvY2Vzc29yIHNob3VsZCBjb21lIGJhY2sgc29tZSB0aW1lIGxhdGVyKS4KKyAqLworCitzdGF0aWMgaW50IGhfbWVtc3RpY2tfcmVhZF9kZXZfaWQoc3RydWN0IG1lbXN0aWNrX2RldiAqY2FyZCwKKwkJCQkgIHN0cnVjdCBtZW1zdGlja19yZXF1ZXN0ICoqbXJxKQoreworCXN0cnVjdCBtc19pZF9yZWdpc3RlciBpZF9yZWc7CisKKwlpZiAoISgqbXJxKSkgeworCQltZW1zdGlja19pbml0X3JlcSgmY2FyZC0+Y3VycmVudF9tcnEsIE1TX1RQQ19SRUFEX1JFRywgTlVMTCwKKwkJCQkgIHNpemVvZihzdHJ1Y3QgbXNfaWRfcmVnaXN0ZXIpKTsKKwkJKm1ycSA9ICZjYXJkLT5jdXJyZW50X21ycTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJaWYgKCEoKm1ycSktPmVycm9yKSB7CisJCQltZW1jcHkoJmlkX3JlZywgKCptcnEpLT5kYXRhLCBzaXplb2YoaWRfcmVnKSk7CisJCQljYXJkLT5pZC5tYXRjaF9mbGFncyA9IE1FTVNUSUNLX01BVENIX0FMTDsKKwkJCWNhcmQtPmlkLnR5cGUgPSBpZF9yZWcudHlwZTsKKwkJCWNhcmQtPmlkLmNhdGVnb3J5ID0gaWRfcmVnLmNhdGVnb3J5OworCQkJY2FyZC0+aWQuY2xhc3MgPSBpZF9yZWcuY2xhc3M7CisJCX0KKwkJY29tcGxldGUoJmNhcmQtPm1ycV9jb21wbGV0ZSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KK30KKworc3RhdGljIGludCBoX21lbXN0aWNrX3NldF9yd19hZGRyKHN0cnVjdCBtZW1zdGlja19kZXYgKmNhcmQsCisJCQkJICBzdHJ1Y3QgbWVtc3RpY2tfcmVxdWVzdCAqKm1ycSkKK3sKKwlpZiAoISgqbXJxKSkgeworCQltZW1zdGlja19pbml0X3JlcSgmY2FyZC0+Y3VycmVudF9tcnEsIE1TX1RQQ19TRVRfUldfUkVHX0FEUlMsCisJCQkJICAoY2hhciAqKSZjYXJkLT5yZWdfYWRkciwKKwkJCQkgIHNpemVvZihjYXJkLT5yZWdfYWRkcikpOworCQkqbXJxID0gJmNhcmQtPmN1cnJlbnRfbXJxOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQljb21wbGV0ZSgmY2FyZC0+bXJxX2NvbXBsZXRlKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorfQorCisvKioKKyAqIG1lbXN0aWNrX3NldF9yd19hZGRyIC0gaXNzdWUgU0VUX1JXX1JFR19BRERSIHJlcXVlc3QgYW5kIHdhaXQgZm9yIGl0IHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlCisgKiBAY2FyZCAtIG1lZGlhIGRldmljZSB0byB1c2UKKyAqLworaW50IG1lbXN0aWNrX3NldF9yd19hZGRyKHN0cnVjdCBtZW1zdGlja19kZXYgKmNhcmQpCit7CisJY2FyZC0+bmV4dF9yZXF1ZXN0ID0gaF9tZW1zdGlja19zZXRfcndfYWRkcjsKKwltZW1zdGlja19uZXdfcmVxKGNhcmQtPmhvc3QpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNhcmQtPm1ycV9jb21wbGV0ZSk7CisKKwlyZXR1cm4gY2FyZC0+Y3VycmVudF9tcnEuZXJyb3I7Cit9CitFWFBPUlRfU1lNQk9MKG1lbXN0aWNrX3NldF9yd19hZGRyKTsKKworc3RhdGljIHN0cnVjdCBtZW1zdGlja19kZXYgKm1lbXN0aWNrX2FsbG9jX2NhcmQoc3RydWN0IG1lbXN0aWNrX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IG1lbXN0aWNrX2RldiAqY2FyZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtZW1zdGlja19kZXYpLAorCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisJc3RydWN0IG1lbXN0aWNrX2RldiAqb2xkX2NhcmQgPSBob3N0LT5jYXJkOworCXN0cnVjdCBtc19pZF9yZWdpc3RlciBpZF9yZWc7CisKKwlpZiAoY2FyZCkgeworCQljYXJkLT5ob3N0ID0gaG9zdDsKKwkJc25wcmludGYoY2FyZC0+ZGV2LmJ1c19pZCwgc2l6ZW9mKGNhcmQtPmRldi5idXNfaWQpLAorCQkJICIlcyIsIGhvc3QtPmNkZXYuY2xhc3NfaWQpOworCQljYXJkLT5kZXYucGFyZW50ID0gaG9zdC0+Y2Rldi5kZXY7CisJCWNhcmQtPmRldi5idXMgPSAmbWVtc3RpY2tfYnVzX3R5cGU7CisJCWNhcmQtPmRldi5yZWxlYXNlID0gbWVtc3RpY2tfZnJlZV9jYXJkOworCQljYXJkLT5jaGVjayA9IG1lbXN0aWNrX2R1bW15X2NoZWNrOworCisJCWNhcmQtPnJlZ19hZGRyLnJfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IG1zX3JlZ2lzdGVyLCBpZCk7CisJCWNhcmQtPnJlZ19hZGRyLnJfbGVuZ3RoID0gc2l6ZW9mKGlkX3JlZyk7CisJCWNhcmQtPnJlZ19hZGRyLndfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IG1zX3JlZ2lzdGVyLCBpZCk7CisJCWNhcmQtPnJlZ19hZGRyLndfbGVuZ3RoID0gc2l6ZW9mKGlkX3JlZyk7CisKKwkJaW5pdF9jb21wbGV0aW9uKCZjYXJkLT5tcnFfY29tcGxldGUpOworCisJCWhvc3QtPmNhcmQgPSBjYXJkOworCQlpZiAobWVtc3RpY2tfc2V0X3J3X2FkZHIoY2FyZCkpCisJCQlnb3RvIGVycl9vdXQ7CisKKwkJY2FyZC0+bmV4dF9yZXF1ZXN0ID0gaF9tZW1zdGlja19yZWFkX2Rldl9pZDsKKwkJbWVtc3RpY2tfbmV3X3JlcShob3N0KTsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmY2FyZC0+bXJxX2NvbXBsZXRlKTsKKworCQlpZiAoY2FyZC0+Y3VycmVudF9tcnEuZXJyb3IpCisJCQlnb3RvIGVycl9vdXQ7CisJfQorCWhvc3QtPmNhcmQgPSBvbGRfY2FyZDsKKwlyZXR1cm4gY2FyZDsKK2Vycl9vdXQ6CisJaG9zdC0+Y2FyZCA9IG9sZF9jYXJkOworCWtmcmVlKGNhcmQpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBtZW1zdGlja19wb3dlcl9vbihzdHJ1Y3QgbWVtc3RpY2tfaG9zdCAqaG9zdCkKK3sKKwlob3N0LT5zZXRfcGFyYW0oaG9zdCwgTUVNU1RJQ0tfUE9XRVIsIE1FTVNUSUNLX1BPV0VSX09OKTsKKwlob3N0LT5zZXRfcGFyYW0oaG9zdCwgTUVNU1RJQ0tfSU5URVJGQUNFLCBNRU1TVElDS19TRVJJQUwpOworCW1zbGVlcCgxKTsKK30KKworc3RhdGljIHZvaWQgbWVtc3RpY2tfY2hlY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBtZW1zdGlja19ob3N0ICpob3N0ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBtZW1zdGlja19ob3N0LAorCQkJCQkJICBtZWRpYV9jaGVja2VyKTsKKwlzdHJ1Y3QgbWVtc3RpY2tfZGV2ICpjYXJkOworCisJZGV2X2RiZyhob3N0LT5jZGV2LmRldiwgIm1lbXN0aWNrX2NoZWNrIHN0YXJ0ZWRcbiIpOworCW11dGV4X2xvY2soJmhvc3QtPmxvY2spOworCWlmICghaG9zdC0+Y2FyZCkKKwkJbWVtc3RpY2tfcG93ZXJfb24oaG9zdCk7CisKKwljYXJkID0gbWVtc3RpY2tfYWxsb2NfY2FyZChob3N0KTsKKworCWlmICghY2FyZCkgeworCQlpZiAoaG9zdC0+Y2FyZCkgeworCQkJZGV2aWNlX3VucmVnaXN0ZXIoJmhvc3QtPmNhcmQtPmRldik7CisJCQlob3N0LT5jYXJkID0gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCWRldl9kYmcoaG9zdC0+Y2Rldi5kZXYsICJuZXcgY2FyZCAlMDJ4LCAlMDJ4LCAlMDJ4XG4iLAorCQkJY2FyZC0+aWQudHlwZSwgY2FyZC0+aWQuY2F0ZWdvcnksIGNhcmQtPmlkLmNsYXNzKTsKKwkJaWYgKGhvc3QtPmNhcmQpIHsKKwkJCWlmIChtZW1zdGlja19zZXRfcndfYWRkcihob3N0LT5jYXJkKQorCQkJICAgIHx8ICFtZW1zdGlja19kZXZfbWF0Y2goaG9zdC0+Y2FyZCwgJmNhcmQtPmlkKQorCQkJICAgIHx8ICEoaG9zdC0+Y2FyZC0+Y2hlY2soaG9zdC0+Y2FyZCkpKSB7CisJCQkJZGV2aWNlX3VucmVnaXN0ZXIoJmhvc3QtPmNhcmQtPmRldik7CisJCQkJaG9zdC0+Y2FyZCA9IE5VTEw7CisJCQl9CisJCX0KKworCQlpZiAoIWhvc3QtPmNhcmQpIHsKKwkJCWhvc3QtPmNhcmQgPSBjYXJkOworCQkJaWYgKGRldmljZV9yZWdpc3RlcigmY2FyZC0+ZGV2KSkgeworCQkJCWtmcmVlKGhvc3QtPmNhcmQpOworCQkJCWhvc3QtPmNhcmQgPSBOVUxMOworCQkJfQorCQl9IGVsc2UKKwkJCWtmcmVlKGNhcmQpOworCX0KKworCWlmICghaG9zdC0+Y2FyZCkKKwkJaG9zdC0+c2V0X3BhcmFtKGhvc3QsIE1FTVNUSUNLX1BPV0VSLCBNRU1TVElDS19QT1dFUl9PRkYpOworCisJbXV0ZXhfdW5sb2NrKCZob3N0LT5sb2NrKTsKKwlkZXZfZGJnKGhvc3QtPmNkZXYuZGV2LCAibWVtc3RpY2tfY2hlY2sgZmluaXNoZWRcbiIpOworfQorCisvKioKKyAqIG1lbXN0aWNrX2FsbG9jX2hvc3QgLSBhbGxvY2F0ZSBhIG1lbXN0aWNrX2hvc3Qgc3RydWN0dXJlCisgKiBAZXh0cmE6IHNpemUgb2YgdGhlIHVzZXIgcHJpdmF0ZSBkYXRhIHRvIGFsbG9jYXRlCisgKiBAZGV2OiBwYXJlbnQgZGV2aWNlIG9mIHRoZSBob3N0CisgKi8KK3N0cnVjdCBtZW1zdGlja19ob3N0ICptZW1zdGlja19hbGxvY19ob3N0KHVuc2lnbmVkIGludCBleHRyYSwKKwkJCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1lbXN0aWNrX2hvc3QgKmhvc3Q7CisKKwlob3N0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1lbXN0aWNrX2hvc3QpICsgZXh0cmEsIEdGUF9LRVJORUwpOworCWlmIChob3N0KSB7CisJCW11dGV4X2luaXQoJmhvc3QtPmxvY2spOworCQlJTklUX1dPUksoJmhvc3QtPm1lZGlhX2NoZWNrZXIsIG1lbXN0aWNrX2NoZWNrKTsKKwkJaG9zdC0+Y2Rldi5jbGFzcyA9ICZtZW1zdGlja19ob3N0X2NsYXNzOworCQlob3N0LT5jZGV2LmRldiA9IGRldjsKKwkJY2xhc3NfZGV2aWNlX2luaXRpYWxpemUoJmhvc3QtPmNkZXYpOworCX0KKwlyZXR1cm4gaG9zdDsKK30KK0VYUE9SVF9TWU1CT0wobWVtc3RpY2tfYWxsb2NfaG9zdCk7CisKKy8qKgorICogbWVtc3RpY2tfYWRkX2hvc3QgLSBzdGFydCByZXF1ZXN0IHByb2Nlc3Npbmcgb24gbWVtc3RpY2sgaG9zdAorICogQGhvc3QgLSBob3N0IHRvIHVzZQorICovCitpbnQgbWVtc3RpY2tfYWRkX2hvc3Qoc3RydWN0IG1lbXN0aWNrX2hvc3QgKmhvc3QpCit7CisJaW50IHJjOworCisJaWYgKCFpZHJfcHJlX2dldCgmbWVtc3RpY2tfaG9zdF9pZHIsIEdGUF9LRVJORUwpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9jaygmbWVtc3RpY2tfaG9zdF9sb2NrKTsKKwlyYyA9IGlkcl9nZXRfbmV3KCZtZW1zdGlja19ob3N0X2lkciwgaG9zdCwgJmhvc3QtPmlkKTsKKwlzcGluX3VubG9jaygmbWVtc3RpY2tfaG9zdF9sb2NrKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXNucHJpbnRmKGhvc3QtPmNkZXYuY2xhc3NfaWQsIEJVU19JRF9TSVpFLAorCQkgIm1lbXN0aWNrJXUiLCBob3N0LT5pZCk7CisKKwlyYyA9IGNsYXNzX2RldmljZV9hZGQoJmhvc3QtPmNkZXYpOworCWlmIChyYykgeworCQlzcGluX2xvY2soJm1lbXN0aWNrX2hvc3RfbG9jayk7CisJCWlkcl9yZW1vdmUoJm1lbXN0aWNrX2hvc3RfaWRyLCBob3N0LT5pZCk7CisJCXNwaW5fdW5sb2NrKCZtZW1zdGlja19ob3N0X2xvY2spOworCQlyZXR1cm4gcmM7CisJfQorCisJaG9zdC0+c2V0X3BhcmFtKGhvc3QsIE1FTVNUSUNLX1BPV0VSLCBNRU1TVElDS19QT1dFUl9PRkYpOworCW1lbXN0aWNrX2RldGVjdF9jaGFuZ2UoaG9zdCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKG1lbXN0aWNrX2FkZF9ob3N0KTsKKworLyoqCisgKiBtZW1zdGlja19yZW1vdmVfaG9zdCAtIHN0b3AgcmVxdWVzdCBwcm9jZXNzaW5nIG9uIG1lbXN0aWNrIGhvc3QKKyAqIEBob3N0IC0gaG9zdCB0byB1c2UKKyAqLwordm9pZCBtZW1zdGlja19yZW1vdmVfaG9zdChzdHJ1Y3QgbWVtc3RpY2tfaG9zdCAqaG9zdCkKK3sKKwlmbHVzaF93b3JrcXVldWUod29ya3F1ZXVlKTsKKwltdXRleF9sb2NrKCZob3N0LT5sb2NrKTsKKwlpZiAoaG9zdC0+Y2FyZCkKKwkJZGV2aWNlX3VucmVnaXN0ZXIoJmhvc3QtPmNhcmQtPmRldik7CisJaG9zdC0+Y2FyZCA9IE5VTEw7CisJaG9zdC0+c2V0X3BhcmFtKGhvc3QsIE1FTVNUSUNLX1BPV0VSLCBNRU1TVElDS19QT1dFUl9PRkYpOworCW11dGV4X3VubG9jaygmaG9zdC0+bG9jayk7CisKKwlzcGluX2xvY2soJm1lbXN0aWNrX2hvc3RfbG9jayk7CisJaWRyX3JlbW92ZSgmbWVtc3RpY2tfaG9zdF9pZHIsIGhvc3QtPmlkKTsKKwlzcGluX3VubG9jaygmbWVtc3RpY2tfaG9zdF9sb2NrKTsKKwljbGFzc19kZXZpY2VfZGVsKCZob3N0LT5jZGV2KTsKK30KK0VYUE9SVF9TWU1CT0wobWVtc3RpY2tfcmVtb3ZlX2hvc3QpOworCisvKioKKyAqIG1lbXN0aWNrX2ZyZWVfaG9zdCAtIGZyZWUgbWVtc3RpY2sgaG9zdAorICogQGhvc3QgLSBob3N0IHRvIHVzZQorICovCit2b2lkIG1lbXN0aWNrX2ZyZWVfaG9zdChzdHJ1Y3QgbWVtc3RpY2tfaG9zdCAqaG9zdCkKK3sKKwltdXRleF9kZXN0cm95KCZob3N0LT5sb2NrKTsKKwljbGFzc19kZXZpY2VfcHV0KCZob3N0LT5jZGV2KTsKK30KK0VYUE9SVF9TWU1CT0wobWVtc3RpY2tfZnJlZV9ob3N0KTsKKworaW50IG1lbXN0aWNrX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgbWVtc3RpY2tfZHJpdmVyICpkcnYpCit7CisJZHJ2LT5kcml2ZXIuYnVzID0gJm1lbXN0aWNrX2J1c190eXBlOworCisJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOworfQorRVhQT1JUX1NZTUJPTChtZW1zdGlja19yZWdpc3Rlcl9kcml2ZXIpOworCit2b2lkIG1lbXN0aWNrX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBtZW1zdGlja19kcml2ZXIgKmRydikKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOworfQorRVhQT1JUX1NZTUJPTChtZW1zdGlja191bnJlZ2lzdGVyX2RyaXZlcik7CisKKworc3RhdGljIGludCBfX2luaXQgbWVtc3RpY2tfaW5pdCh2b2lkKQoreworCWludCByYzsKKworCXdvcmtxdWV1ZSA9IGNyZWF0ZV9mcmVlemVhYmxlX3dvcmtxdWV1ZSgia21lbXN0aWNrIik7CisJaWYgKCF3b3JrcXVldWUpCisJCXJldHVybiAtRU5PTUVNOworCisJcmMgPSBidXNfcmVnaXN0ZXIoJm1lbXN0aWNrX2J1c190eXBlKTsKKwlpZiAoIXJjKQorCQlyYyA9IGNsYXNzX3JlZ2lzdGVyKCZtZW1zdGlja19ob3N0X2NsYXNzKTsKKworCWlmICghcmMpCisJCXJldHVybiAwOworCisJYnVzX3VucmVnaXN0ZXIoJm1lbXN0aWNrX2J1c190eXBlKTsKKwlkZXN0cm95X3dvcmtxdWV1ZSh3b3JrcXVldWUpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWVtc3RpY2tfZXhpdCh2b2lkKQoreworCWNsYXNzX3VucmVnaXN0ZXIoJm1lbXN0aWNrX2hvc3RfY2xhc3MpOworCWJ1c191bnJlZ2lzdGVyKCZtZW1zdGlja19idXNfdHlwZSk7CisJZGVzdHJveV93b3JrcXVldWUod29ya3F1ZXVlKTsKKwlpZHJfZGVzdHJveSgmbWVtc3RpY2tfaG9zdF9pZHIpOworfQorCittb2R1bGVfaW5pdChtZW1zdGlja19pbml0KTsKK21vZHVsZV9leGl0KG1lbXN0aWNrX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJBbGV4IER1Ym92Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNvbnkgTWVtb3J5U3RpY2sgY29yZSBkcml2ZXIiKTsKK01PRFVMRV9WRVJTSU9OKERSSVZFUl9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tc3Byb19ibG9jay5jIGIvZHJpdmVycy9tZW1zdGljay9jb3JlL21zcHJvX2Jsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIzYWQ4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tc3Byb19ibG9jay5jCkBAIC0wLDAgKzEsMTM1MSBAQAorLyoKKyAqICBTb255IE1lbW9yeVN0aWNrIFBybyBzdG9yYWdlIHN1cHBvcnQKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IEFsZXggRHVib3YgPG9ha2FkQHlhaG9vLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFNwZWNpYWwgdGhhbmtzIHRvIENhcmxvcyBDb3JiYWNobyBmb3IgcHJvdmlkaW5nIHZhcmlvdXMgTWVtb3J5U3RpY2sgY2FyZHMKKyAqIHRoYXQgbWFkZSB0aGlzIGRyaXZlciBwb3NzaWJsZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L21lbXN0aWNrLmg+CisKKyNkZWZpbmUgRFJJVkVSX05BTUUgIm1zcHJvX2Jsb2NrIgorI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMC4yIgorCitzdGF0aWMgaW50IG1ham9yOworbW9kdWxlX3BhcmFtKG1ham9yLCBpbnQsIDA2NDQpOworCisjZGVmaW5lIE1TUFJPX0JMT0NLX01BWF9TRUdTICAzMgorI2RlZmluZSBNU1BST19CTE9DS19NQVhfUEFHRVMgKCgyIDw8IDE2KSAtIDEpCisKKyNkZWZpbmUgTVNQUk9fQkxPQ0tfU0lHTkFUVVJFICAgICAgICAweGE1YzMKKyNkZWZpbmUgTVNQUk9fQkxPQ0tfTUFYX0FUVFJJQlVURVMgICA0MQorCitlbnVtIHsKKwlNU1BST19CTE9DS19JRF9TWVNJTkZPICAgICAgICAgPSAweDEwLAorCU1TUFJPX0JMT0NLX0lEX01PREVMTkFNRSAgICAgICA9IDB4MTUsCisJTVNQUk9fQkxPQ0tfSURfTUJSICAgICAgICAgICAgID0gMHgyMCwKKwlNU1BST19CTE9DS19JRF9QQlIxNiAgICAgICAgICAgPSAweDIxLAorCU1TUFJPX0JMT0NLX0lEX1BCUjMyICAgICAgICAgICA9IDB4MjIsCisJTVNQUk9fQkxPQ0tfSURfU1BFQ0ZJTEVWQUxVRVMxID0gMHgyNSwKKwlNU1BST19CTE9DS19JRF9TUEVDRklMRVZBTFVFUzIgPSAweDI2LAorCU1TUFJPX0JMT0NLX0lEX0RFVklORk8gICAgICAgICA9IDB4MzAKK307CisKK3N0cnVjdCBtc3Byb19zeXNfYXR0ciB7CisJc2l6ZV90ICAgICAgICAgICAgICAgICAgc2l6ZTsKKwl2b2lkICAgICAgICAgICAgICAgICAgICAqZGF0YTsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICBpZDsKKwljaGFyICAgICAgICAgICAgICAgICAgICBuYW1lWzMyXTsKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cjsKK307CisKK3N0cnVjdCBtc3Byb19hdHRyX2VudHJ5IHsKKwl1bnNpZ25lZCBpbnQgIGFkZHJlc3M7CisJdW5zaWduZWQgaW50ICBzaXplOworCXVuc2lnbmVkIGNoYXIgaWQ7CisJdW5zaWduZWQgY2hhciByZXNlcnZlZFszXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBtc3Byb19hdHRyaWJ1dGUgeworCXVuc2lnbmVkIHNob3J0ICAgICAgICAgIHNpZ25hdHVyZTsKKwl1bnNpZ25lZCBzaG9ydCAgICAgICAgICB2ZXJzaW9uOworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgIGNvdW50OworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgIHJlc2VydmVkWzExXTsKKwlzdHJ1Y3QgbXNwcm9fYXR0cl9lbnRyeSBlbnRyaWVzW107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgbXNwcm9fc3lzX2luZm8geworCXVuc2lnbmVkIGNoYXIgIGNsYXNzOworCXVuc2lnbmVkIGNoYXIgIHJlc2VydmVkMDsKKwl1bnNpZ25lZCBzaG9ydCBibG9ja19zaXplOworCXVuc2lnbmVkIHNob3J0IGJsb2NrX2NvdW50OworCXVuc2lnbmVkIHNob3J0IHVzZXJfYmxvY2tfY291bnQ7CisJdW5zaWduZWQgc2hvcnQgcGFnZV9zaXplOworCXVuc2lnbmVkIGNoYXIgIHJlc2VydmVkMVsyXTsKKwl1bnNpZ25lZCBjaGFyICBhc3NlbWJseV9kYXRlWzhdOworCXVuc2lnbmVkIGludCAgIHNlcmlhbF9udW1iZXI7CisJdW5zaWduZWQgY2hhciAgYXNzZW1ibHlfbWFrZXJfY29kZTsKKwl1bnNpZ25lZCBjaGFyICBhc3NlbWJseV9tb2RlbF9jb2RlWzNdOworCXVuc2lnbmVkIHNob3J0IG1lbW9yeV9tYWtlcl9jb2RlOworCXVuc2lnbmVkIHNob3J0IG1lbW9yeV9tb2RlbF9jb2RlOworCXVuc2lnbmVkIGNoYXIgIHJlc2VydmVkMls0XTsKKwl1bnNpZ25lZCBjaGFyICB2Y2M7CisJdW5zaWduZWQgY2hhciAgdnBwOworCXVuc2lnbmVkIHNob3J0IGNvbnRyb2xsZXJfbnVtYmVyOworCXVuc2lnbmVkIHNob3J0IGNvbnRyb2xsZXJfZnVuY3Rpb247CisJdW5zaWduZWQgc2hvcnQgc3RhcnRfc2VjdG9yOworCXVuc2lnbmVkIHNob3J0IHVuaXRfc2l6ZTsKKwl1bnNpZ25lZCBjaGFyICBtc19zdWJfY2xhc3M7CisJdW5zaWduZWQgY2hhciAgcmVzZXJ2ZWQzWzRdOworCXVuc2lnbmVkIGNoYXIgIGludGVyZmFjZV90eXBlOworCXVuc2lnbmVkIHNob3J0IGNvbnRyb2xsZXJfY29kZTsKKwl1bnNpZ25lZCBjaGFyICBmb3JtYXRfdHlwZTsKKwl1bnNpZ25lZCBjaGFyICByZXNlcnZlZDQ7CisJdW5zaWduZWQgY2hhciAgZGV2aWNlX3R5cGU7CisJdW5zaWduZWQgY2hhciAgcmVzZXJ2ZWQ1WzddOworCXVuc2lnbmVkIGNoYXIgIG1zcHJvX2lkWzE2XTsKKwl1bnNpZ25lZCBjaGFyICByZXNlcnZlZDZbMTZdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IG1zcHJvX21iciB7CisJdW5zaWduZWQgY2hhciBib290X3BhcnRpdGlvbjsKKwl1bnNpZ25lZCBjaGFyIHN0YXJ0X2hlYWQ7CisJdW5zaWduZWQgY2hhciBzdGFydF9zZWN0b3I7CisJdW5zaWduZWQgY2hhciBzdGFydF9jeWxpbmRlcjsKKwl1bnNpZ25lZCBjaGFyIHBhcnRpdGlvbl90eXBlOworCXVuc2lnbmVkIGNoYXIgZW5kX2hlYWQ7CisJdW5zaWduZWQgY2hhciBlbmRfc2VjdG9yOworCXVuc2lnbmVkIGNoYXIgZW5kX2N5bGluZGVyOworCXVuc2lnbmVkIGludCAgc3RhcnRfc2VjdG9yczsKKwl1bnNpZ25lZCBpbnQgIHNlY3RvcnNfcGVyX3BhcnRpdGlvbjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBtc3Byb19kZXZpbmZvIHsKKwl1bnNpZ25lZCBzaG9ydCBjeWxpbmRlcnM7CisJdW5zaWduZWQgc2hvcnQgaGVhZHM7CisJdW5zaWduZWQgc2hvcnQgYnl0ZXNfcGVyX3RyYWNrOworCXVuc2lnbmVkIHNob3J0IGJ5dGVzX3Blcl9zZWN0b3I7CisJdW5zaWduZWQgc2hvcnQgc2VjdG9yc19wZXJfdHJhY2s7CisJdW5zaWduZWQgY2hhciAgcmVzZXJ2ZWRbNl07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgbXNwcm9fYmxvY2tfZGF0YSB7CisJc3RydWN0IG1lbXN0aWNrX2RldiAgICpjYXJkOworCXVuc2lnbmVkIGludCAgICAgICAgICB1c2FnZV9jb3VudDsKKwlzdHJ1Y3QgZ2VuZGlzayAgICAgICAgKmRpc2s7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgICpxdWV1ZTsKKwlzcGlubG9ja190ICAgICAgICAgICAgcV9sb2NrOworCXdhaXRfcXVldWVfaGVhZF90ICAgICBxX3dhaXQ7CisJc3RydWN0IHRhc2tfc3RydWN0ICAgICpxX3RocmVhZDsKKworCXVuc2lnbmVkIHNob3J0ICAgICAgICBwYWdlX3NpemU7CisJdW5zaWduZWQgc2hvcnQgICAgICAgIGN5bGluZGVyczsKKwl1bnNpZ25lZCBzaG9ydCAgICAgICAgaGVhZHM7CisJdW5zaWduZWQgc2hvcnQgICAgICAgIHNlY3RvcnNfcGVyX3RyYWNrOworCisJdW5zaWduZWQgY2hhciAgICAgICAgIHN5c3RlbTsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgcmVhZF9vbmx5OjEsCisJCQkgICAgICBhY3RpdmU6MSwKKwkJCSAgICAgIGhhc19yZXF1ZXN0OjEsCisJCQkgICAgICBkYXRhX2RpcjoxOworCXVuc2lnbmVkIGNoYXIgICAgICAgICB0cmFuc2Zlcl9jbWQ7CisKKwlpbnQgICAgICAgICAgICAgICAgICAgKCptcnFfaGFuZGxlcikoc3RydWN0IG1lbXN0aWNrX2RldiAqY2FyZCwKKwkJCQkJICAgICBzdHJ1Y3QgbWVtc3RpY2tfcmVxdWVzdCAqKm1ycSk7CisKKwlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGF0dHJfZ3JvdXA7CisKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgICAgcmVxX3NnW01TUFJPX0JMT0NLX01BWF9TRUdTXTsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgc2VnX2NvdW50OworCXVuc2lnbmVkIGludCAgICAgICAgICBjdXJyZW50X3NlZzsKKwl1bnNpZ25lZCBzaG9ydCAgICAgICAgY3VycmVudF9wYWdlOworfTsKKworc3RhdGljIERFRklORV9JRFIobXNwcm9fYmxvY2tfZGlza19pZHIpOworc3RhdGljIERFRklORV9NVVRFWChtc3Byb19ibG9ja19kaXNrX2xvY2spOworCisvKioqIEJsb2NrIGRldmljZSAqKiovCisKK3N0YXRpYyBpbnQgbXNwcm9fYmxvY2tfYmRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2s7CisJc3RydWN0IG1zcHJvX2Jsb2NrX2RhdGEgKm1zYiA9IGRpc2stPnByaXZhdGVfZGF0YTsKKwlpbnQgcmMgPSAtRU5YSU87CisKKwltdXRleF9sb2NrKCZtc3Byb19ibG9ja19kaXNrX2xvY2spOworCisJaWYgKG1zYiAmJiBtc2ItPmNhcmQpIHsKKwkJbXNiLT51c2FnZV9jb3VudCsrOworCQlpZiAoKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiBtc2ItPnJlYWRfb25seSkKKwkJCXJjID0gLUVST0ZTOworCQllbHNlCisJCQlyYyA9IDA7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZtc3Byb19ibG9ja19kaXNrX2xvY2spOworCisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBpbnQgbXNwcm9fYmxvY2tfZGlza19yZWxlYXNlKHN0cnVjdCBnZW5kaXNrICpkaXNrKQoreworCXN0cnVjdCBtc3Byb19ibG9ja19kYXRhICptc2IgPSBkaXNrLT5wcml2YXRlX2RhdGE7CisJaW50IGRpc2tfaWQgPSBkaXNrLT5maXJzdF9taW5vciA+PiBNRU1TVElDS19QQVJUX1NISUZUOworCisJbXV0ZXhfbG9jaygmbXNwcm9fYmxvY2tfZGlza19sb2NrKTsKKworCWlmIChtc2ItPnVzYWdlX2NvdW50KSB7CisJCW1zYi0+dXNhZ2VfY291bnQtLTsKKwkJaWYgKCFtc2ItPnVzYWdlX2NvdW50KSB7CisJCQlrZnJlZShtc2IpOworCQkJZGlzay0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwkJCWlkcl9yZW1vdmUoJm1zcHJvX2Jsb2NrX2Rpc2tfaWRyLCBkaXNrX2lkKTsKKwkJCXB1dF9kaXNrKGRpc2spOworCQl9CisJfQorCisJbXV0ZXhfdW5sb2NrKCZtc3Byb19ibG9ja19kaXNrX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNwcm9fYmxvY2tfYmRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2s7CisJcmV0dXJuIG1zcHJvX2Jsb2NrX2Rpc2tfcmVsZWFzZShkaXNrKTsKK30KKworc3RhdGljIGludCBtc3Byb19ibG9ja19iZF9nZXRnZW8oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJCQkgc3RydWN0IGhkX2dlb21ldHJ5ICpnZW8pCit7CisJc3RydWN0IG1zcHJvX2Jsb2NrX2RhdGEgKm1zYiA9IGJkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKKworCWdlby0+aGVhZHMgPSBtc2ItPmhlYWRzOworCWdlby0+c2VjdG9ycyA9IG1zYi0+c2VjdG9yc19wZXJfdHJhY2s7CisJZ2VvLT5jeWxpbmRlcnMgPSBtc2ItPmN5bGluZGVyczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIG1zX2Jsb2NrX2Jkb3BzID0geworCS5vcGVuICAgID0gbXNwcm9fYmxvY2tfYmRfb3BlbiwKKwkucmVsZWFzZSA9IG1zcHJvX2Jsb2NrX2JkX3JlbGVhc2UsCisJLmdldGdlbyAgPSBtc3Byb19ibG9ja19iZF9nZXRnZW8sCisJLm93bmVyICAgPSBUSElTX01PRFVMRQorfTsKKworLyoqKiBJbmZvcm1hdGlvbiAqKiovCisKK3N0YXRpYyBzdHJ1Y3QgbXNwcm9fc3lzX2F0dHIgKm1zcHJvX2Zyb21fc3lzZnNfYXR0cihzdHJ1Y3QgYXR0cmlidXRlICphdHRyKQoreworCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZfYXR0cgorCQk9IGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSwgYXR0cik7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkZXZfYXR0ciwgc3RydWN0IG1zcHJvX3N5c19hdHRyLCBkZXZfYXR0cik7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICptc3Byb19ibG9ja19hdHRyX25hbWUodW5zaWduZWQgY2hhciB0YWcpCit7CisJc3dpdGNoICh0YWcpIHsKKwljYXNlIE1TUFJPX0JMT0NLX0lEX1NZU0lORk86CisJCXJldHVybiAiYXR0cl9zeXNpbmZvIjsKKwljYXNlIE1TUFJPX0JMT0NLX0lEX01PREVMTkFNRToKKwkJcmV0dXJuICJhdHRyX21vZGVsbmFtZSI7CisJY2FzZSBNU1BST19CTE9DS19JRF9NQlI6CisJCXJldHVybiAiYXR0cl9tYnIiOworCWNhc2UgTVNQUk9fQkxPQ0tfSURfUEJSMTY6CisJCXJldHVybiAiYXR0cl9wYnIxNiI7CisJY2FzZSBNU1BST19CTE9DS19JRF9QQlIzMjoKKwkJcmV0dXJuICJhdHRyX3BicjMyIjsKKwljYXNlIE1TUFJPX0JMT0NLX0lEX1NQRUNGSUxFVkFMVUVTMToKKwkJcmV0dXJuICJhdHRyX3NwZWNmaWxldmFsdWVzMSI7CisJY2FzZSBNU1BST19CTE9DS19JRF9TUEVDRklMRVZBTFVFUzI6CisJCXJldHVybiAiYXR0cl9zcGVjZmlsZXZhbHVlczIiOworCWNhc2UgTVNQUk9fQkxPQ0tfSURfREVWSU5GTzoKKwkJcmV0dXJuICJhdHRyX2RldmluZm8iOworCWRlZmF1bHQ6CisJCXJldHVybiBOVUxMOworCX07Cit9CisKK3R5cGVkZWYgc3NpemVfdCAoKnN5c2ZzX3Nob3dfdCkoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNoYXIgKmJ1ZmZlcik7CisKK3N0YXRpYyBzc2l6ZV90IG1zcHJvX2Jsb2NrX2F0dHJfc2hvd19kZWZhdWx0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICAgICBjaGFyICpidWZmZXIpCit7CisJc3RydWN0IG1zcHJvX3N5c19hdHRyICpzX2F0dHIgPSBjb250YWluZXJfb2YoYXR0ciwKKwkJCQkJCSAgICAgc3RydWN0IG1zcHJvX3N5c19hdHRyLAorCQkJCQkJICAgICBkZXZfYXR0cik7CisKKwlzc2l6ZV90IGNudCwgcmMgPSAwOworCisJZm9yIChjbnQgPSAwOyBjbnQgPCBzX2F0dHItPnNpemU7IGNudCsrKSB7CisJCWlmIChjbnQgJiYgIShjbnQgJSAxNikpIHsKKwkJCWlmIChQQUdFX1NJWkUgLSByYykKKwkJCQlidWZmZXJbcmMrK10gPSAnXG4nOworCQl9CisKKwkJcmMgKz0gc2NucHJpbnRmKGJ1ZmZlciArIHJjLCBQQUdFX1NJWkUgLSByYywgIiUwMnggIiwKKwkJCQkoKHVuc2lnbmVkIGNoYXIgKilzX2F0dHItPmRhdGEpW2NudF0pOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1zcHJvX2Jsb2NrX2F0dHJfc2hvd19zeXNpbmZvKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICAgICBjaGFyICpidWZmZXIpCit7CisJc3RydWN0IG1zcHJvX3N5c19hdHRyICp4X2F0dHIgPSBjb250YWluZXJfb2YoYXR0ciwKKwkJCQkJCSAgICAgc3RydWN0IG1zcHJvX3N5c19hdHRyLAorCQkJCQkJICAgICBkZXZfYXR0cik7CisJc3RydWN0IG1zcHJvX3N5c19pbmZvICp4X3N5cyA9IHhfYXR0ci0+ZGF0YTsKKwlzc2l6ZV90IHJjID0gMDsKKworCXJjICs9IHNjbnByaW50ZihidWZmZXIgKyByYywgUEFHRV9TSVpFIC0gcmMsICJjbGFzczogJXhcbiIsCisJCQl4X3N5cy0+Y2xhc3MpOworCXJjICs9IHNjbnByaW50ZihidWZmZXIgKyByYywgUEFHRV9TSVpFIC0gcmMsICJibG9jayBzaXplOiAleFxuIiwKKwkJCWJlMTZfdG9fY3B1KHhfc3lzLT5ibG9ja19zaXplKSk7CisJcmMgKz0gc2NucHJpbnRmKGJ1ZmZlciArIHJjLCBQQUdFX1NJWkUgLSByYywgImJsb2NrIGNvdW50OiAleFxuIiwKKwkJCWJlMTZfdG9fY3B1KHhfc3lzLT5ibG9ja19jb3VudCkpOworCXJjICs9IHNjbnByaW50ZihidWZmZXIgKyByYywgUEFHRV9TSVpFIC0gcmMsICJ1c2VyIGJsb2NrIGNvdW50OiAleFxuIiwKKwkJCWJlMTZfdG9fY3B1KHhfc3lzLT51c2VyX2Jsb2NrX2NvdW50KSk7CisJcmMgKz0gc2NucHJpbnRmKGJ1ZmZlciArIHJjLCBQQUdFX1NJWkUgLSByYywgInBhZ2Ugc2l6ZTogJXhcbiIsCisJCQliZTE2X3RvX2NwdSh4X3N5cy0+cGFnZV9zaXplKSk7CisJcmMgKz0gc2NucHJpbnRmKGJ1ZmZlciArIHJjLCBQQUdFX1NJWkUgLSByYywgImFzc2VtYmx5IGRhdGU6ICIKKwkJCSIlZCAlMDR1LSUwMnUtJTAydSAlMDJ1OiUwMnU6JTAydVxuIiwKKwkJCXhfc3lzLT5hc3NlbWJseV9kYXRlWzBdLAorCQkJYmUxNl90b19jcHUoKih1bnNpZ25lZCBzaG9ydCAqKQorCQkJCSAgICAmeF9zeXMtPmFzc2VtYmx5X2RhdGVbMV0pLAorCQkJeF9zeXMtPmFzc2VtYmx5X2RhdGVbM10sIHhfc3lzLT5hc3NlbWJseV9kYXRlWzRdLAorCQkJeF9zeXMtPmFzc2VtYmx5X2RhdGVbNV0sIHhfc3lzLT5hc3NlbWJseV9kYXRlWzZdLAorCQkJeF9zeXMtPmFzc2VtYmx5X2RhdGVbN10pOworCXJjICs9IHNjbnByaW50ZihidWZmZXIgKyByYywgUEFHRV9TSVpFIC0gcmMsICJzZXJpYWwgbnVtYmVyOiAleFxuIiwKKwkJCWJlMzJfdG9fY3B1KHhfc3lzLT5zZXJpYWxfbnVtYmVyKSk7CisJcmMgKz0gc2NucHJpbnRmKGJ1ZmZlciArIHJjLCBQQUdFX1NJWkUgLSByYywKKwkJCSJhc3NlbWJseSBtYWtlciBjb2RlOiAleFxuIiwKKwkJCXhfc3lzLT5hc3NlbWJseV9tYWtlcl9jb2RlKTsKKwlyYyArPSBzY25wcmludGYoYnVmZmVyICsgcmMsIFBBR0VfU0laRSAtIHJjLCAiYXNzZW1ibHkgbW9kZWwgY29kZTogIgorCQkJIiUwMnglMDJ4JTAyeFxuIiwgeF9zeXMtPmFzc2VtYmx5X21vZGVsX2NvZGVbMF0sCisJCQl4X3N5cy0+YXNzZW1ibHlfbW9kZWxfY29kZVsxXSwKKwkJCXhfc3lzLT5hc3NlbWJseV9tb2RlbF9jb2RlWzJdKTsKKwlyYyArPSBzY25wcmludGYoYnVmZmVyICsgcmMsIFBBR0VfU0laRSAtIHJjLCAibWVtb3J5IG1ha2VyIGNvZGU6ICV4XG4iLAorCQkJYmUxNl90b19jcHUoeF9zeXMtPm1lbW9yeV9tYWtlcl9jb2RlKSk7CisJcmMgKz0gc2NucHJpbnRmKGJ1ZmZlciArIHJjLCBQQUdFX1NJWkUgLSByYywgIm1lbW9yeSBtb2RlbCBjb2RlOiAleFxuIiwKKwkJCWJlMTZfdG9fY3B1KHhfc3lzLT5tZW1vcnlfbW9kZWxfY29kZSkpOworCXJjICs9IHNjbnByaW50ZihidWZmZXIgKyByYywgUEFHRV9TSVpFIC0gcmMsICJ2Y2M6ICV4XG4iLAorCQkJeF9zeXMtPnZjYyk7CisJcmMgKz0gc2NucHJpbnRmKGJ1ZmZlciArIHJjLCBQQUdFX1NJWkUgLSByYywgInZwcDogJXhcbiIsCisJCQl4X3N5cy0+dnBwKTsKKwlyYyArPSBzY25wcmludGYoYnVmZmVyICsgcmMsIFBBR0VfU0laRSAtIHJjLCAiY29udHJvbGxlciBudW1iZXI6ICV4XG4iLAorCQkJYmUxNl90b19jcHUoeF9zeXMtPmNvbnRyb2xsZXJfbnVtYmVyKSk7CisJcmMgKz0gc2NucHJpbnRmKGJ1ZmZlciArIHJjLCBQQUdFX1NJWkUgLSByYywKKwkJCSJjb250cm9sbGVyIGZ1bmN0aW9uOiAleFxuIiwKKwkJCWJlMTZfdG9fY3B1KHhfc3lzLT5jb250cm9sbGVyX2Z1bmN0aW9uKSk7CisJcmMgKz0gc2NucHJpbnRmKGJ1ZmZlciArIHJjLCBQQUdFX1NJWkUgLSByYywgInN0YXJ0IHNlY3RvcjogJXhcbiIsCisJCQliZTE2X3RvX2NwdSh4X3N5cy0+c3RhcnRfc2VjdG9yKSk7CisJcmMgKz0gc2NucHJpbnRmKGJ1ZmZlciArIHJjLCBQQUdFX1NJWkUgLSByYywgInVuaXQgc2l6ZTogJXhcbiIsCisJCQliZTE2X3RvX2NwdSh4X3N5cy0+dW5pdF9zaXplKSk7CisJcmMgKz0gc2NucHJpbnRmKGJ1ZmZlciArIHJjLCBQQUdFX1NJWkUgLSByYywgInN1YiBjbGFzczogJXhcbiIsCisJCQl4X3N5cy0+bXNfc3ViX2NsYXNzKTsKKwlyYyArPSBzY25wcmludGYoYnVmZmVyICsgcmMsIFBBR0VfU0laRSAtIHJjLCAiaW50ZXJmYWNlIHR5cGU6ICV4XG4iLAorCQkJeF9zeXMtPmludGVyZmFjZV90eXBlKTsKKwlyYyArPSBzY25wcmludGYoYnVmZmVyICsgcmMsIFBBR0VfU0laRSAtIHJjLCAiY29udHJvbGxlciBjb2RlOiAleFxuIiwKKwkJCWJlMTZfdG9fY3B1KHhfc3lzLT5jb250cm9sbGVyX2NvZGUpKTsKKwlyYyArPSBzY25wcmludGYoYnVmZmVyICsgcmMsIFBBR0VfU0laRSAtIHJjLCAiZm9ybWF0IHR5cGU6ICV4XG4iLAorCQkJeF9zeXMtPmZvcm1hdF90eXBlKTsKKwlyYyArPSBzY25wcmludGYoYnVmZmVyICsgcmMsIFBBR0VfU0laRSAtIHJjLCAiZGV2aWNlIHR5cGU6ICV4XG4iLAorCQkJeF9zeXMtPmRldmljZV90eXBlKTsKKwlyYyArPSBzY25wcmludGYoYnVmZmVyICsgcmMsIFBBR0VfU0laRSAtIHJjLCAibXNwcm8gaWQ6ICVzXG4iLAorCQkJeF9zeXMtPm1zcHJvX2lkKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1zcHJvX2Jsb2NrX2F0dHJfc2hvd19tb2RlbG5hbWUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgICAgICBjaGFyICpidWZmZXIpCit7CisJc3RydWN0IG1zcHJvX3N5c19hdHRyICpzX2F0dHIgPSBjb250YWluZXJfb2YoYXR0ciwKKwkJCQkJCSAgICAgc3RydWN0IG1zcHJvX3N5c19hdHRyLAorCQkJCQkJICAgICBkZXZfYXR0cik7CisKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZmZlciwgUEFHRV9TSVpFLCAiJXMiLCAoY2hhciAqKXNfYXR0ci0+ZGF0YSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1zcHJvX2Jsb2NrX2F0dHJfc2hvd19tYnIoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjaGFyICpidWZmZXIpCit7CisJc3RydWN0IG1zcHJvX3N5c19hdHRyICp4X2F0dHIgPSBjb250YWluZXJfb2YoYXR0ciwKKwkJCQkJCSAgICAgc3RydWN0IG1zcHJvX3N5c19hdHRyLAorCQkJCQkJICAgICBkZXZfYXR0cik7CisJc3RydWN0IG1zcHJvX21iciAqeF9tYnIgPSB4X2F0dHItPmRhdGE7CisJc3NpemVfdCByYyA9IDA7CisKKwlyYyArPSBzY25wcmludGYoYnVmZmVyICsgcmMsIFBBR0VfU0laRSAtIHJjLCAiYm9vdCBwYXJ0aXRpb246ICV4XG4iLAorCQkJeF9tYnItPmJvb3RfcGFydGl0aW9uKTsKKwlyYyArPSBzY25wcmludGYoYnVmZmVyICsgcmMsIFBBR0VfU0laRSAtIHJjLCAic3RhcnQgaGVhZDogJXhcbiIsCisJCQl4X21ici0+c3RhcnRfaGVhZCk7CisJcmMgKz0gc2NucHJpbnRmKGJ1ZmZlciArIHJjLCBQQUdFX1NJWkUgLSByYywgInN0YXJ0IHNlY3RvcjogJXhcbiIsCisJCQl4X21ici0+c3RhcnRfc2VjdG9yKTsKKwlyYyArPSBzY25wcmludGYoYnVmZmVyICsgcmMsIFBBR0VfU0laRSAtIHJjLCAic3RhcnQgY3lsaW5kZXI6ICV4XG4iLAorCQkJeF9tYnItPnN0YXJ0X2N5bGluZGVyKTsKKwlyYyArPSBzY25wcmludGYoYnVmZmVyICsgcmMsIFBBR0VfU0laRSAtIHJjLCAicGFydGl0aW9uIHR5cGU6ICV4XG4iLAorCQkJeF9tYnItPnBhcnRpdGlvbl90eXBlKTsKKwlyYyArPSBzY25wcmludGYoYnVmZmVyICsgcmMsIFBBR0VfU0laRSAtIHJjLCAiZW5kIGhlYWQ6ICV4XG4iLAorCQkJeF9tYnItPmVuZF9oZWFkKTsKKwlyYyArPSBzY25wcmludGYoYnVmZmVyICsgcmMsIFBBR0VfU0laRSAtIHJjLCAiZW5kIHNlY3RvcjogJXhcbiIsCisJCQl4X21ici0+ZW5kX3NlY3Rvcik7CisJcmMgKz0gc2NucHJpbnRmKGJ1ZmZlciArIHJjLCBQQUdFX1NJWkUgLSByYywgImVuZCBjeWxpbmRlcjogJXhcbiIsCisJCQl4X21ici0+ZW5kX2N5bGluZGVyKTsKKwlyYyArPSBzY25wcmludGYoYnVmZmVyICsgcmMsIFBBR0VfU0laRSAtIHJjLCAic3RhcnQgc2VjdG9yczogJXhcbiIsCisJCQl4X21ici0+c3RhcnRfc2VjdG9ycyk7CisJcmMgKz0gc2NucHJpbnRmKGJ1ZmZlciArIHJjLCBQQUdFX1NJWkUgLSByYywKKwkJCSJzZWN0b3JzIHBlciBwYXJ0aXRpb246ICV4XG4iLAorCQkJeF9tYnItPnNlY3RvcnNfcGVyX3BhcnRpdGlvbik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3NpemVfdCBtc3Byb19ibG9ja19hdHRyX3Nob3dfZGV2aW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgICAgY2hhciAqYnVmZmVyKQoreworCXN0cnVjdCBtc3Byb19zeXNfYXR0ciAqeF9hdHRyID0gY29udGFpbmVyX29mKGF0dHIsCisJCQkJCQkgICAgIHN0cnVjdCBtc3Byb19zeXNfYXR0ciwKKwkJCQkJCSAgICAgZGV2X2F0dHIpOworCXN0cnVjdCBtc3Byb19kZXZpbmZvICp4X2RldmluZm8gPSB4X2F0dHItPmRhdGE7CisJc3NpemVfdCByYyA9IDA7CisKKwlyYyArPSBzY25wcmludGYoYnVmZmVyICsgcmMsIFBBR0VfU0laRSAtIHJjLCAiY3lsaW5kZXJzOiAleFxuIiwKKwkJCWJlMTZfdG9fY3B1KHhfZGV2aW5mby0+Y3lsaW5kZXJzKSk7CisJcmMgKz0gc2NucHJpbnRmKGJ1ZmZlciArIHJjLCBQQUdFX1NJWkUgLSByYywgImhlYWRzOiAleFxuIiwKKwkJCWJlMTZfdG9fY3B1KHhfZGV2aW5mby0+aGVhZHMpKTsKKwlyYyArPSBzY25wcmludGYoYnVmZmVyICsgcmMsIFBBR0VfU0laRSAtIHJjLCAiYnl0ZXMgcGVyIHRyYWNrOiAleFxuIiwKKwkJCWJlMTZfdG9fY3B1KHhfZGV2aW5mby0+Ynl0ZXNfcGVyX3RyYWNrKSk7CisJcmMgKz0gc2NucHJpbnRmKGJ1ZmZlciArIHJjLCBQQUdFX1NJWkUgLSByYywgImJ5dGVzIHBlciBzZWN0b3I6ICV4XG4iLAorCQkJYmUxNl90b19jcHUoeF9kZXZpbmZvLT5ieXRlc19wZXJfc2VjdG9yKSk7CisJcmMgKz0gc2NucHJpbnRmKGJ1ZmZlciArIHJjLCBQQUdFX1NJWkUgLSByYywgInNlY3RvcnMgcGVyIHRyYWNrOiAleFxuIiwKKwkJCWJlMTZfdG9fY3B1KHhfZGV2aW5mby0+c2VjdG9yc19wZXJfdHJhY2spKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzeXNmc19zaG93X3QgbXNwcm9fYmxvY2tfYXR0cl9zaG93KHVuc2lnbmVkIGNoYXIgdGFnKQoreworCXN3aXRjaCAodGFnKSB7CisJY2FzZSBNU1BST19CTE9DS19JRF9TWVNJTkZPOgorCQlyZXR1cm4gbXNwcm9fYmxvY2tfYXR0cl9zaG93X3N5c2luZm87CisJY2FzZSBNU1BST19CTE9DS19JRF9NT0RFTE5BTUU6CisJCXJldHVybiBtc3Byb19ibG9ja19hdHRyX3Nob3dfbW9kZWxuYW1lOworCWNhc2UgTVNQUk9fQkxPQ0tfSURfTUJSOgorCQlyZXR1cm4gbXNwcm9fYmxvY2tfYXR0cl9zaG93X21icjsKKwljYXNlIE1TUFJPX0JMT0NLX0lEX0RFVklORk86CisJCXJldHVybiBtc3Byb19ibG9ja19hdHRyX3Nob3dfZGV2aW5mbzsKKwlkZWZhdWx0OgorCQlyZXR1cm4gbXNwcm9fYmxvY2tfYXR0cl9zaG93X2RlZmF1bHQ7CisJfQorfQorCisvKioqIFByb3RvY29sIGhhbmRsZXJzICoqKi8KKworLyoKKyAqIEZ1bmN0aW9ucyBwcmVmaXhlZCB3aXRoICJoXyIgYXJlIHByb3RvY29sIGNhbGxiYWNrcy4gVGhleSBjYW4gYmUgY2FsbGVkIGZyb20KKyAqIGludGVycnVwdCBjb250ZXh0LiBSZXR1cm4gdmFsdWUgb2YgMCBtZWFucyB0aGF0IHJlcXVlc3QgcHJvY2Vzc2luZyBpcyBzdGlsbAorICogb25nb2luZywgd2hpbGUgc3BlY2lhbCBlcnJvciB2YWx1ZSBvZiAtRUFHQUlOIG1lYW5zIHRoYXQgY3VycmVudCByZXF1ZXN0IGlzCisgKiBmaW5pc2hlZCAoYW5kIHJlcXVlc3QgcHJvY2Vzc29yIHNob3VsZCBjb21lIGJhY2sgc29tZSB0aW1lIGxhdGVyKS4KKyAqLworCitzdGF0aWMgaW50IGhfbXNwcm9fYmxvY2tfcmVxX2luaXQoc3RydWN0IG1lbXN0aWNrX2RldiAqY2FyZCwKKwkJCQkgIHN0cnVjdCBtZW1zdGlja19yZXF1ZXN0ICoqbXJxKQoreworCXN0cnVjdCBtc3Byb19ibG9ja19kYXRhICptc2IgPSBtZW1zdGlja19nZXRfZHJ2ZGF0YShjYXJkKTsKKworCSptcnEgPSAmY2FyZC0+Y3VycmVudF9tcnE7CisJY2FyZC0+bmV4dF9yZXF1ZXN0ID0gbXNiLT5tcnFfaGFuZGxlcjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoX21zcHJvX2Jsb2NrX2RlZmF1bHQoc3RydWN0IG1lbXN0aWNrX2RldiAqY2FyZCwKKwkJCQkgc3RydWN0IG1lbXN0aWNrX3JlcXVlc3QgKiptcnEpCit7CisJY29tcGxldGUoJmNhcmQtPm1ycV9jb21wbGV0ZSk7CisJaWYgKCEoKm1ycSktPmVycm9yKQorCQlyZXR1cm4gLUVBR0FJTjsKKwllbHNlCisJCXJldHVybiAoKm1ycSktPmVycm9yOworfQorCitzdGF0aWMgaW50IGhfbXNwcm9fYmxvY2tfZ2V0X3JvKHN0cnVjdCBtZW1zdGlja19kZXYgKmNhcmQsCisJCQkJc3RydWN0IG1lbXN0aWNrX3JlcXVlc3QgKiptcnEpCit7CisJc3RydWN0IG1zcHJvX2Jsb2NrX2RhdGEgKm1zYiA9IG1lbXN0aWNrX2dldF9kcnZkYXRhKGNhcmQpOworCisJaWYgKCgqbXJxKS0+ZXJyb3IpIHsKKwkJY29tcGxldGUoJmNhcmQtPm1ycV9jb21wbGV0ZSk7CisJCXJldHVybiAoKm1ycSktPmVycm9yOworCX0KKworCWlmICgoKm1ycSktPmRhdGFbb2Zmc2V0b2Yoc3RydWN0IG1zX3N0YXR1c19yZWdpc3Rlciwgc3RhdHVzMCldCisJICAgICYgTUVNU1RJQ0tfU1RBVFVTMF9XUCkKKwkJbXNiLT5yZWFkX29ubHkgPSAxOworCWVsc2UKKwkJbXNiLT5yZWFkX29ubHkgPSAwOworCisJY29tcGxldGUoJmNhcmQtPm1ycV9jb21wbGV0ZSk7CisJcmV0dXJuIC1FQUdBSU47Cit9CisKK3N0YXRpYyBpbnQgaF9tc3Byb19ibG9ja193YWl0X2Zvcl9jZWQoc3RydWN0IG1lbXN0aWNrX2RldiAqY2FyZCwKKwkJCQkgICAgICBzdHJ1Y3QgbWVtc3RpY2tfcmVxdWVzdCAqKm1ycSkKK3sKKwlpZiAoKCptcnEpLT5lcnJvcikgeworCQljb21wbGV0ZSgmY2FyZC0+bXJxX2NvbXBsZXRlKTsKKwkJcmV0dXJuICgqbXJxKS0+ZXJyb3I7CisJfQorCisJZGV2X2RiZygmY2FyZC0+ZGV2LCAid2FpdCBmb3IgY2VkOiB2YWx1ZSAleFxuIiwgKCptcnEpLT5kYXRhWzBdKTsKKworCWlmICgoKm1ycSktPmRhdGFbMF0gJiAoTUVNU1RJQ0tfSU5UX0NNRE5BSyB8IE1FTVNUSUNLX0lOVF9FUlIpKSB7CisJCWNhcmQtPmN1cnJlbnRfbXJxLmVycm9yID0gLUVGQVVMVDsKKwkJY29tcGxldGUoJmNhcmQtPm1ycV9jb21wbGV0ZSk7CisJCXJldHVybiBjYXJkLT5jdXJyZW50X21ycS5lcnJvcjsKKwl9CisKKwlpZiAoISgoKm1ycSktPmRhdGFbMF0gJiBNRU1TVElDS19JTlRfQ0VEKSkKKwkJcmV0dXJuIDA7CisJZWxzZSB7CisJCWNhcmQtPmN1cnJlbnRfbXJxLmVycm9yID0gMDsKKwkJY29tcGxldGUoJmNhcmQtPm1ycV9jb21wbGV0ZSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KK30KKworc3RhdGljIGludCBoX21zcHJvX2Jsb2NrX3RyYW5zZmVyX2RhdGEoc3RydWN0IG1lbXN0aWNrX2RldiAqY2FyZCwKKwkJCQkgICAgICAgc3RydWN0IG1lbXN0aWNrX3JlcXVlc3QgKiptcnEpCit7CisJc3RydWN0IG1lbXN0aWNrX2hvc3QgKmhvc3QgPSBjYXJkLT5ob3N0OworCXN0cnVjdCBtc3Byb19ibG9ja19kYXRhICptc2IgPSBtZW1zdGlja19nZXRfZHJ2ZGF0YShjYXJkKTsKKwl1bnNpZ25lZCBjaGFyIHRfdmFsID0gMDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgdF9zZyA9IHsgMCB9OworCXNpemVfdCB0X29mZnNldDsKKworCWlmICgoKm1ycSktPmVycm9yKSB7CisJCWNvbXBsZXRlKCZjYXJkLT5tcnFfY29tcGxldGUpOworCQlyZXR1cm4gKCptcnEpLT5lcnJvcjsKKwl9CisKKwlzd2l0Y2ggKCgqbXJxKS0+dHBjKSB7CisJY2FzZSBNU19UUENfV1JJVEVfUkVHOgorCQltZW1zdGlja19pbml0X3JlcSgqbXJxLCBNU19UUENfU0VUX0NNRCwgJm1zYi0+dHJhbnNmZXJfY21kLCAxKTsKKwkJKCptcnEpLT5nZXRfaW50X3JlZyA9IDE7CisJCXJldHVybiAwOworCWNhc2UgTVNfVFBDX1NFVF9DTUQ6CisJCXRfdmFsID0gKCptcnEpLT5pbnRfcmVnOworCQltZW1zdGlja19pbml0X3JlcSgqbXJxLCBNU19UUENfR0VUX0lOVCwgTlVMTCwgMSk7CisJCWlmIChob3N0LT5jYXBzICYgTUVNU1RJQ0tfQ0FQX0FVVE9fR0VUX0lOVCkKKwkJCWdvdG8gaGFzX2ludF9yZWc7CisJCXJldHVybiAwOworCWNhc2UgTVNfVFBDX0dFVF9JTlQ6CisJCXRfdmFsID0gKCptcnEpLT5kYXRhWzBdOworaGFzX2ludF9yZWc6CisJCWlmICh0X3ZhbCAmIChNRU1TVElDS19JTlRfQ01ETkFLIHwgTUVNU1RJQ0tfSU5UX0VSUikpIHsKKwkJCXRfdmFsID0gTVNQUk9fQ01EX1NUT1A7CisJCQltZW1zdGlja19pbml0X3JlcSgqbXJxLCBNU19UUENfU0VUX0NNRCwgJnRfdmFsLCAxKTsKKwkJCWNhcmQtPm5leHRfcmVxdWVzdCA9IGhfbXNwcm9fYmxvY2tfZGVmYXVsdDsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKG1zYi0+Y3VycmVudF9wYWdlCisJCSAgICA9PSAobXNiLT5yZXFfc2dbbXNiLT5jdXJyZW50X3NlZ10ubGVuZ3RoCisJCQkvIG1zYi0+cGFnZV9zaXplKSkgeworCQkJbXNiLT5jdXJyZW50X3BhZ2UgPSAwOworCQkJbXNiLT5jdXJyZW50X3NlZysrOworCisJCQlpZiAobXNiLT5jdXJyZW50X3NlZyA9PSBtc2ItPnNlZ19jb3VudCkgeworCQkJCWlmICh0X3ZhbCAmIE1FTVNUSUNLX0lOVF9DRUQpIHsKKwkJCQkJY29tcGxldGUoJmNhcmQtPm1ycV9jb21wbGV0ZSk7CisJCQkJCXJldHVybiAtRUFHQUlOOworCQkJCX0gZWxzZSB7CisJCQkJCWNhcmQtPm5leHRfcmVxdWVzdAorCQkJCQkJPSBoX21zcHJvX2Jsb2NrX3dhaXRfZm9yX2NlZDsKKwkJCQkJbWVtc3RpY2tfaW5pdF9yZXEoKm1ycSwgTVNfVFBDX0dFVF9JTlQsCisJCQkJCQkJICBOVUxMLCAxKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKCEodF92YWwgJiBNRU1TVElDS19JTlRfQlJFUSkpIHsKKwkJCW1lbXN0aWNrX2luaXRfcmVxKCptcnEsIE1TX1RQQ19HRVRfSU5ULCBOVUxMLCAxKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJdF9vZmZzZXQgPSBtc2ItPnJlcV9zZ1ttc2ItPmN1cnJlbnRfc2VnXS5vZmZzZXQ7CisJCXRfb2Zmc2V0ICs9IG1zYi0+Y3VycmVudF9wYWdlICogbXNiLT5wYWdlX3NpemU7CisKKwkJc2dfc2V0X3BhZ2UoJnRfc2csCisJCQkgICAgbnRoX3BhZ2Uoc2dfcGFnZSgmKG1zYi0+cmVxX3NnW21zYi0+Y3VycmVudF9zZWddKSksCisJCQkJICAgICB0X29mZnNldCA+PiBQQUdFX1NISUZUKSwKKwkJCSAgICBtc2ItPnBhZ2Vfc2l6ZSwgb2Zmc2V0X2luX3BhZ2UodF9vZmZzZXQpKTsKKworCQltZW1zdGlja19pbml0X3JlcV9zZygqbXJxLCBtc2ItPmRhdGFfZGlyID09IFJFQUQKKwkJCQkJICAgPyBNU19UUENfUkVBRF9MT05HX0RBVEEKKwkJCQkJICAgOiBNU19UUENfV1JJVEVfTE9OR19EQVRBLAorCQkJCSAgICAgJnRfc2cpOworCQkoKm1ycSktPmdldF9pbnRfcmVnID0gMTsKKwkJcmV0dXJuIDA7CisJY2FzZSBNU19UUENfUkVBRF9MT05HX0RBVEE6CisJY2FzZSBNU19UUENfV1JJVEVfTE9OR19EQVRBOgorCQltc2ItPmN1cnJlbnRfcGFnZSsrOworCQlpZiAoaG9zdC0+Y2FwcyAmIE1FTVNUSUNLX0NBUF9BVVRPX0dFVF9JTlQpIHsKKwkJCXRfdmFsID0gKCptcnEpLT5pbnRfcmVnOworCQkJZ290byBoYXNfaW50X3JlZzsKKwkJfSBlbHNlIHsKKwkJCW1lbXN0aWNrX2luaXRfcmVxKCptcnEsIE1TX1RQQ19HRVRfSU5ULCBOVUxMLCAxKTsKKwkJCXJldHVybiAwOworCQl9CisKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9Cit9CisKKy8qKiogRGF0YSB0cmFuc2ZlciAqKiovCisKK3N0YXRpYyB2b2lkIG1zcHJvX2Jsb2NrX3Byb2Nlc3NfcmVxdWVzdChzdHJ1Y3QgbWVtc3RpY2tfZGV2ICpjYXJkLAorCQkJCQlzdHJ1Y3QgcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBtc3Byb19ibG9ja19kYXRhICptc2IgPSBtZW1zdGlja19nZXRfZHJ2ZGF0YShjYXJkKTsKKwlzdHJ1Y3QgbXNwcm9fcGFyYW1fcmVnaXN0ZXIgcGFyYW07CisJaW50IHJjLCBjaHVuaywgY250OworCXVuc2lnbmVkIHNob3J0IHBhZ2VfY291bnQ7CisJc2VjdG9yX3QgdF9zZWM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRvIHsKKwkJcGFnZV9jb3VudCA9IDA7CisJCW1zYi0+Y3VycmVudF9zZWcgPSAwOworCQltc2ItPnNlZ19jb3VudCA9IGJsa19ycV9tYXBfc2cocmVxLT5xLCByZXEsIG1zYi0+cmVxX3NnKTsKKworCQlpZiAobXNiLT5zZWdfY291bnQpIHsKKwkJCW1zYi0+Y3VycmVudF9wYWdlID0gMDsKKwkJCWZvciAocmMgPSAwOyByYyA8IG1zYi0+c2VnX2NvdW50OyByYysrKQorCQkJCXBhZ2VfY291bnQgKz0gbXNiLT5yZXFfc2dbcmNdLmxlbmd0aAorCQkJCQkgICAgICAvIG1zYi0+cGFnZV9zaXplOworCisJCQl0X3NlYyA9IHJlcS0+c2VjdG9yOworCQkJc2VjdG9yX2Rpdih0X3NlYywgbXNiLT5wYWdlX3NpemUgPj4gOSk7CisJCQlwYXJhbS5zeXN0ZW0gPSBtc2ItPnN5c3RlbTsKKwkJCXBhcmFtLmRhdGFfY291bnQgPSBjcHVfdG9fYmUxNihwYWdlX2NvdW50KTsKKwkJCXBhcmFtLmRhdGFfYWRkcmVzcyA9IGNwdV90b19iZTMyKCh1aW50MzJfdCl0X3NlYyk7CisJCQlwYXJhbS5jbWRfcGFyYW0gPSAwOworCisJCQltc2ItPmRhdGFfZGlyID0gcnFfZGF0YV9kaXIocmVxKTsKKwkJCW1zYi0+dHJhbnNmZXJfY21kID0gbXNiLT5kYXRhX2RpciA9PSBSRUFECisJCQkJCSAgICA/IE1TUFJPX0NNRF9SRUFEX0RBVEEKKwkJCQkJICAgIDogTVNQUk9fQ01EX1dSSVRFX0RBVEE7CisKKwkJCWRldl9kYmcoJmNhcmQtPmRldiwgImRhdGEgdHJhbnNmZXI6IGNtZCAleCwgIgorCQkJCSJsYmEgJXgsIGNvdW50ICV4XG4iLCBtc2ItPnRyYW5zZmVyX2NtZCwKKwkJCQliZTMyX3RvX2NwdShwYXJhbS5kYXRhX2FkZHJlc3MpLAorCQkJCXBhZ2VfY291bnQpOworCisJCQljYXJkLT5uZXh0X3JlcXVlc3QgPSBoX21zcHJvX2Jsb2NrX3JlcV9pbml0OworCQkJbXNiLT5tcnFfaGFuZGxlciA9IGhfbXNwcm9fYmxvY2tfdHJhbnNmZXJfZGF0YTsKKwkJCW1lbXN0aWNrX2luaXRfcmVxKCZjYXJkLT5jdXJyZW50X21ycSwgTVNfVFBDX1dSSVRFX1JFRywKKwkJCQkJICAmcGFyYW0sIHNpemVvZihwYXJhbSkpOworCQkJbWVtc3RpY2tfbmV3X3JlcShjYXJkLT5ob3N0KTsKKwkJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNhcmQtPm1ycV9jb21wbGV0ZSk7CisJCQlyYyA9IGNhcmQtPmN1cnJlbnRfbXJxLmVycm9yOworCisJCQlpZiAocmMgfHwgKGNhcmQtPmN1cnJlbnRfbXJxLnRwYyA9PSBNU1BST19DTURfU1RPUCkpIHsKKwkJCQlmb3IgKGNudCA9IDA7IGNudCA8IG1zYi0+Y3VycmVudF9zZWc7IGNudCsrKQorCQkJCQlwYWdlX2NvdW50ICs9IG1zYi0+cmVxX3NnW2NudF0ubGVuZ3RoCisJCQkJCQkgICAgICAvIG1zYi0+cGFnZV9zaXplOworCisJCQkJaWYgKG1zYi0+Y3VycmVudF9wYWdlKQorCQkJCQlwYWdlX2NvdW50ICs9IG1zYi0+Y3VycmVudF9wYWdlIC0gMTsKKworCQkJCWlmIChwYWdlX2NvdW50ICYmIChtc2ItPmRhdGFfZGlyID09IFJFQUQpKQorCQkJCQlyYyA9IG1zYi0+cGFnZV9zaXplICogcGFnZV9jb3VudDsKKwkJCQllbHNlCisJCQkJCXJjID0gLUVJTzsKKwkJCX0gZWxzZQorCQkJCXJjID0gbXNiLT5wYWdlX3NpemUgKiBwYWdlX2NvdW50OworCQl9IGVsc2UKKwkJCXJjID0gLUVGQVVMVDsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXNiLT5xX2xvY2ssIGZsYWdzKTsKKwkJaWYgKHJjID49IDApCisJCQljaHVuayA9IF9fYmxrX2VuZF9yZXF1ZXN0KHJlcSwgMCwgcmMpOworCQllbHNlCisJCQljaHVuayA9IF9fYmxrX2VuZF9yZXF1ZXN0KHJlcSwgcmMsIDApOworCisJCWRldl9kYmcoJmNhcmQtPmRldiwgImVuZCBjaHVuayAlZCwgJWRcbiIsIHJjLCBjaHVuayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zYi0+cV9sb2NrLCBmbGFncyk7CisJfSB3aGlsZSAoY2h1bmspOworfQorCitzdGF0aWMgaW50IG1zcHJvX2Jsb2NrX2hhc19yZXF1ZXN0KHN0cnVjdCBtc3Byb19ibG9ja19kYXRhICptc2IpCit7CisJaW50IHJjID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1zYi0+cV9sb2NrLCBmbGFncyk7CisJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSB8fCBtc2ItPmhhc19yZXF1ZXN0KQorCQlyYyA9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNiLT5xX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNwcm9fYmxvY2tfcXVldWVfdGhyZWFkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG1lbXN0aWNrX2RldiAqY2FyZCA9IGRhdGE7CisJc3RydWN0IG1lbXN0aWNrX2hvc3QgKmhvc3QgPSBjYXJkLT5ob3N0OworCXN0cnVjdCBtc3Byb19ibG9ja19kYXRhICptc2IgPSBtZW1zdGlja19nZXRfZHJ2ZGF0YShjYXJkKTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl3aGlsZSAoMSkgeworCQl3YWl0X2V2ZW50KG1zYi0+cV93YWl0LCBtc3Byb19ibG9ja19oYXNfcmVxdWVzdChtc2IpKTsKKwkJZGV2X2RiZygmY2FyZC0+ZGV2LCAidGhyZWFkIGl0ZXJcbiIpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZtc2ItPnFfbG9jaywgZmxhZ3MpOworCQlyZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KG1zYi0+cXVldWUpOworCQlkZXZfZGJnKCZjYXJkLT5kZXYsICJuZXh0IHJlcSAlcFxuIiwgcmVxKTsKKwkJaWYgKCFyZXEpIHsKKwkJCW1zYi0+aGFzX3JlcXVlc3QgPSAwOworCQkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zYi0+cV9sb2NrLCBmbGFncyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZQorCQkJbXNiLT5oYXNfcmVxdWVzdCA9IDE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zYi0+cV9sb2NrLCBmbGFncyk7CisKKwkJaWYgKHJlcSkgeworCQkJbXV0ZXhfbG9jaygmaG9zdC0+bG9jayk7CisJCQltc3Byb19ibG9ja19wcm9jZXNzX3JlcXVlc3QoY2FyZCwgcmVxKTsKKwkJCW11dGV4X3VubG9jaygmaG9zdC0+bG9jayk7CisJCX0KKwl9CisJZGV2X2RiZygmY2FyZC0+ZGV2LCAidGhyZWFkIGZpbmlzaGVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXNwcm9fYmxvY2tfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKK3sKKwlzdHJ1Y3QgbWVtc3RpY2tfZGV2ICpjYXJkID0gcS0+cXVldWVkYXRhOworCXN0cnVjdCBtc3Byb19ibG9ja19kYXRhICptc2IgPSBtZW1zdGlja19nZXRfZHJ2ZGF0YShjYXJkKTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxID0gTlVMTDsKKworCWlmIChtc2ItPnFfdGhyZWFkKSB7CisJCW1zYi0+aGFzX3JlcXVlc3QgPSAxOworCQl3YWtlX3VwX2FsbCgmbXNiLT5xX3dhaXQpOworCX0gZWxzZSB7CisJCXdoaWxlICgocmVxID0gZWx2X25leHRfcmVxdWVzdChxKSkgIT0gTlVMTCkKKwkJCWVuZF9xdWV1ZWRfcmVxdWVzdChyZXEsIC1FTk9ERVYpOworCX0KK30KKworLyoqKiBJbml0aWFsaXphdGlvbiAqKiovCisKK3N0YXRpYyBpbnQgbXNwcm9fYmxvY2tfd2FpdF9mb3JfY2VkKHN0cnVjdCBtZW1zdGlja19kZXYgKmNhcmQpCit7CisJc3RydWN0IG1zcHJvX2Jsb2NrX2RhdGEgKm1zYiA9IG1lbXN0aWNrX2dldF9kcnZkYXRhKGNhcmQpOworCisJY2FyZC0+bmV4dF9yZXF1ZXN0ID0gaF9tc3Byb19ibG9ja19yZXFfaW5pdDsKKwltc2ItPm1ycV9oYW5kbGVyID0gaF9tc3Byb19ibG9ja193YWl0X2Zvcl9jZWQ7CisJbWVtc3RpY2tfaW5pdF9yZXEoJmNhcmQtPmN1cnJlbnRfbXJxLCBNU19UUENfR0VUX0lOVCwgTlVMTCwgMSk7CisJbWVtc3RpY2tfbmV3X3JlcShjYXJkLT5ob3N0KTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjYXJkLT5tcnFfY29tcGxldGUpOworCXJldHVybiBjYXJkLT5jdXJyZW50X21ycS5lcnJvcjsKK30KKworc3RhdGljIGludCBtc3Byb19ibG9ja19zd2l0Y2hfdG9fcGFyYWxsZWwoc3RydWN0IG1lbXN0aWNrX2RldiAqY2FyZCkKK3sKKwlzdHJ1Y3QgbWVtc3RpY2tfaG9zdCAqaG9zdCA9IGNhcmQtPmhvc3Q7CisJc3RydWN0IG1zcHJvX2Jsb2NrX2RhdGEgKm1zYiA9IG1lbXN0aWNrX2dldF9kcnZkYXRhKGNhcmQpOworCXN0cnVjdCBtc3Byb19wYXJhbV9yZWdpc3RlciBwYXJhbSA9IHsKKwkJLnN5c3RlbSA9IDAsCisJCS5kYXRhX2NvdW50ID0gMCwKKwkJLmRhdGFfYWRkcmVzcyA9IDAsCisJCS5jbWRfcGFyYW0gPSAwCisJfTsKKworCWNhcmQtPm5leHRfcmVxdWVzdCA9IGhfbXNwcm9fYmxvY2tfcmVxX2luaXQ7CisJbXNiLT5tcnFfaGFuZGxlciA9IGhfbXNwcm9fYmxvY2tfZGVmYXVsdDsKKwltZW1zdGlja19pbml0X3JlcSgmY2FyZC0+Y3VycmVudF9tcnEsIE1TX1RQQ19XUklURV9SRUcsICZwYXJhbSwKKwkJCSAgc2l6ZW9mKHBhcmFtKSk7CisJbWVtc3RpY2tfbmV3X3JlcShob3N0KTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjYXJkLT5tcnFfY29tcGxldGUpOworCWlmIChjYXJkLT5jdXJyZW50X21ycS5lcnJvcikKKwkJcmV0dXJuIGNhcmQtPmN1cnJlbnRfbXJxLmVycm9yOworCisJbXNiLT5zeXN0ZW0gPSAwOworCWhvc3QtPnNldF9wYXJhbShob3N0LCBNRU1TVElDS19JTlRFUkZBQ0UsIE1FTVNUSUNLX1BBUkFMTEVMKTsKKworCWNhcmQtPm5leHRfcmVxdWVzdCA9IGhfbXNwcm9fYmxvY2tfcmVxX2luaXQ7CisJbXNiLT5tcnFfaGFuZGxlciA9IGhfbXNwcm9fYmxvY2tfZGVmYXVsdDsKKwltZW1zdGlja19pbml0X3JlcSgmY2FyZC0+Y3VycmVudF9tcnEsIE1TX1RQQ19HRVRfSU5ULCBOVUxMLCAxKTsKKwltZW1zdGlja19uZXdfcmVxKGNhcmQtPmhvc3QpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNhcmQtPm1ycV9jb21wbGV0ZSk7CisKKwlpZiAoY2FyZC0+Y3VycmVudF9tcnEuZXJyb3IpIHsKKwkJbXNiLT5zeXN0ZW0gPSAweDgwOworCQlob3N0LT5zZXRfcGFyYW0oaG9zdCwgTUVNU1RJQ0tfSU5URVJGQUNFLCBNRU1TVElDS19TRVJJQUwpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogTWVtb3J5IGFsbG9jYXRlZCBmb3IgYXR0cmlidXRlcyBieSB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBmcmVlZCBieQorICogbXNwcm9fYmxvY2tfZGF0YV9jbGVhciwgbm8gbWF0dGVyIGlmIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHN1Y2NlZGVkCisgKiBvciBmYWlsZWQuCisgKi8KK3N0YXRpYyBpbnQgbXNwcm9fYmxvY2tfcmVhZF9hdHRyaWJ1dGVzKHN0cnVjdCBtZW1zdGlja19kZXYgKmNhcmQpCit7CisJc3RydWN0IG1zcHJvX2Jsb2NrX2RhdGEgKm1zYiA9IG1lbXN0aWNrX2dldF9kcnZkYXRhKGNhcmQpOworCXN0cnVjdCBtc3Byb19wYXJhbV9yZWdpc3RlciBwYXJhbSA9IHsKKwkJLnN5c3RlbSA9IG1zYi0+c3lzdGVtLAorCQkuZGF0YV9jb3VudCA9IGNwdV90b19iZTE2KDEpLAorCQkuZGF0YV9hZGRyZXNzID0gMCwKKwkJLmNtZF9wYXJhbSA9IDAKKwl9OworCXN0cnVjdCBtc3Byb19hdHRyaWJ1dGUgKmF0dHIgPSBOVUxMOworCXN0cnVjdCBtc3Byb19zeXNfYXR0ciAqc19hdHRyID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXIgPSBOVUxMOworCWludCBjbnQsIHJjLCBhdHRyX2NvdW50OworCXVuc2lnbmVkIGludCBhZGRyOworCXVuc2lnbmVkIHNob3J0IHBhZ2VfY291bnQ7CisKKwlhdHRyID0ga21hbGxvYyhtc2ItPnBhZ2Vfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhdHRyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNnX2luaXRfb25lKCZtc2ItPnJlcV9zZ1swXSwgYXR0ciwgbXNiLT5wYWdlX3NpemUpOworCW1zYi0+c2VnX2NvdW50ID0gMTsKKwltc2ItPmN1cnJlbnRfc2VnID0gMDsKKwltc2ItPmN1cnJlbnRfcGFnZSA9IDA7CisJbXNiLT5kYXRhX2RpciA9IFJFQUQ7CisJbXNiLT50cmFuc2Zlcl9jbWQgPSBNU1BST19DTURfUkVBRF9BVFJCOworCisJY2FyZC0+bmV4dF9yZXF1ZXN0ID0gaF9tc3Byb19ibG9ja19yZXFfaW5pdDsKKwltc2ItPm1ycV9oYW5kbGVyID0gaF9tc3Byb19ibG9ja190cmFuc2Zlcl9kYXRhOworCW1lbXN0aWNrX2luaXRfcmVxKCZjYXJkLT5jdXJyZW50X21ycSwgTVNfVFBDX1dSSVRFX1JFRywgJnBhcmFtLAorCQkJICBzaXplb2YocGFyYW0pKTsKKwltZW1zdGlja19uZXdfcmVxKGNhcmQtPmhvc3QpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNhcmQtPm1ycV9jb21wbGV0ZSk7CisJaWYgKGNhcmQtPmN1cnJlbnRfbXJxLmVycm9yKSB7CisJCXJjID0gY2FyZC0+Y3VycmVudF9tcnEuZXJyb3I7CisJCWdvdG8gb3V0X2ZyZWVfYXR0cjsKKwl9CisKKwlpZiAoYmUxNl90b19jcHUoYXR0ci0+c2lnbmF0dXJlKSAhPSBNU1BST19CTE9DS19TSUdOQVRVUkUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5yZWNvZ25pemVkIGRldmljZSBzaWduYXR1cmUgJXhcbiIsCisJCSAgICAgICBjYXJkLT5kZXYuYnVzX2lkLCBiZTE2X3RvX2NwdShhdHRyLT5zaWduYXR1cmUpKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIG91dF9mcmVlX2F0dHI7CisJfQorCisJaWYgKGF0dHItPmNvdW50ID4gTVNQUk9fQkxPQ0tfTUFYX0FUVFJJQlVURVMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHdheSB0b28gbWFueSBhdHRyaWJ1dGUgZW50cmllc1xuIiwKKwkJICAgICAgIGNhcmQtPmRldi5idXNfaWQpOworCQlhdHRyX2NvdW50ID0gTVNQUk9fQkxPQ0tfTUFYX0FUVFJJQlVURVM7CisJfSBlbHNlCisJCWF0dHJfY291bnQgPSBhdHRyLT5jb3VudDsKKworCW1zYi0+YXR0cl9ncm91cC5hdHRycyA9IGt6YWxsb2MoKGF0dHJfY291bnQgKyAxKQorCQkJCQkqIHNpemVvZihzdHJ1Y3QgYXR0cmlidXRlKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFtc2ItPmF0dHJfZ3JvdXAuYXR0cnMpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX2F0dHI7CisJfQorCW1zYi0+YXR0cl9ncm91cC5uYW1lID0gIm1lZGlhX2F0dHJpYnV0ZXMiOworCisJYnVmZmVyID0ga21hbGxvYyhtc2ItPnBhZ2Vfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWZmZXIpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX2F0dHI7CisJfQorCW1lbWNweShidWZmZXIsIChjaGFyICopYXR0ciwgbXNiLT5wYWdlX3NpemUpOworCXBhZ2VfY291bnQgPSAxOworCisJZm9yIChjbnQgPSAwOyBjbnQgPCBhdHRyX2NvdW50OyArK2NudCkgeworCQlzX2F0dHIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNwcm9fc3lzX2F0dHIpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFzX2F0dHIpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X2ZyZWVfYnVmZmVyOworCQl9CisKKwkJbXNiLT5hdHRyX2dyb3VwLmF0dHJzW2NudF0gPSAmc19hdHRyLT5kZXZfYXR0ci5hdHRyOworCQlhZGRyID0gYmUzMl90b19jcHUoYXR0ci0+ZW50cmllc1tjbnRdLmFkZHJlc3MpOworCQlyYyA9IGJlMzJfdG9fY3B1KGF0dHItPmVudHJpZXNbY250XS5zaXplKTsKKwkJZGV2X2RiZygmY2FyZC0+ZGV2LCAiYWRkaW5nIGF0dHJpYnV0ZSAlZDogaWQgJXgsIGFkZHJlc3MgJXgsICIKKwkJCSJzaXplICV4XG4iLCBjbnQsIGF0dHItPmVudHJpZXNbY250XS5pZCwgYWRkciwgcmMpOworCQlzX2F0dHItPmlkID0gYXR0ci0+ZW50cmllc1tjbnRdLmlkOworCQlpZiAobXNwcm9fYmxvY2tfYXR0cl9uYW1lKHNfYXR0ci0+aWQpKQorCQkJc25wcmludGYoc19hdHRyLT5uYW1lLCBzaXplb2Yoc19hdHRyLT5uYW1lKSwgIiVzIiwKKwkJCQkgbXNwcm9fYmxvY2tfYXR0cl9uYW1lKGF0dHItPmVudHJpZXNbY250XS5pZCkpOworCQllbHNlCisJCQlzbnByaW50ZihzX2F0dHItPm5hbWUsIHNpemVvZihzX2F0dHItPm5hbWUpLAorCQkJCSAiYXR0cl94JTAyeCIsIGF0dHItPmVudHJpZXNbY250XS5pZCk7CisKKwkJc19hdHRyLT5kZXZfYXR0ci5hdHRyLm5hbWUgPSBzX2F0dHItPm5hbWU7CisJCXNfYXR0ci0+ZGV2X2F0dHIuYXR0ci5tb2RlID0gU19JUlVHTzsKKwkJc19hdHRyLT5kZXZfYXR0ci5hdHRyLm93bmVyID0gVEhJU19NT0RVTEU7CisJCXNfYXR0ci0+ZGV2X2F0dHIuc2hvdyA9IG1zcHJvX2Jsb2NrX2F0dHJfc2hvdyhzX2F0dHItPmlkKTsKKworCQlpZiAoIXJjKQorCQkJY29udGludWU7CisKKwkJc19hdHRyLT5zaXplID0gcmM7CisJCXNfYXR0ci0+ZGF0YSA9IGttYWxsb2MocmMsIEdGUF9LRVJORUwpOworCQlpZiAoIXNfYXR0ci0+ZGF0YSkgeworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBvdXRfZnJlZV9idWZmZXI7CisJCX0KKworCQlpZiAoKChhZGRyIC8gbXNiLT5wYWdlX3NpemUpCisJCSAgICAgPT0gYmUzMl90b19jcHUocGFyYW0uZGF0YV9hZGRyZXNzKSkKKwkJICAgICYmICgoKGFkZHIgKyByYyAtIDEpIC8gbXNiLT5wYWdlX3NpemUpCisJCQk9PSBiZTMyX3RvX2NwdShwYXJhbS5kYXRhX2FkZHJlc3MpKSkgeworCQkJbWVtY3B5KHNfYXR0ci0+ZGF0YSwgYnVmZmVyICsgYWRkciAlIG1zYi0+cGFnZV9zaXplLAorCQkJICAgICAgIHJjKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHBhZ2VfY291bnQgPD0gKHJjIC8gbXNiLT5wYWdlX3NpemUpKSB7CisJCQlrZnJlZShidWZmZXIpOworCQkJcGFnZV9jb3VudCA9IChyYyAvIG1zYi0+cGFnZV9zaXplKSArIDE7CisJCQlidWZmZXIgPSBrbWFsbG9jKHBhZ2VfY291bnQgKiBtc2ItPnBhZ2Vfc2l6ZSwKKwkJCQkJIEdGUF9LRVJORUwpOworCQkJaWYgKCFidWZmZXIpIHsKKwkJCQlyYyA9IC1FTk9NRU07CisJCQkJZ290byBvdXRfZnJlZV9hdHRyOworCQkJfQorCQl9CisKKwkJcGFyYW0uc3lzdGVtID0gbXNiLT5zeXN0ZW07CisJCXBhcmFtLmRhdGFfY291bnQgPSBjcHVfdG9fYmUxNigocmMgLyBtc2ItPnBhZ2Vfc2l6ZSkgKyAxKTsKKwkJcGFyYW0uZGF0YV9hZGRyZXNzID0gY3B1X3RvX2JlMzIoYWRkciAvIG1zYi0+cGFnZV9zaXplKTsKKwkJcGFyYW0uY21kX3BhcmFtID0gMDsKKworCQlzZ19pbml0X29uZSgmbXNiLT5yZXFfc2dbMF0sIGJ1ZmZlciwKKwkJCSAgICBiZTE2X3RvX2NwdShwYXJhbS5kYXRhX2NvdW50KSAqIG1zYi0+cGFnZV9zaXplKTsKKwkJbXNiLT5zZWdfY291bnQgPSAxOworCQltc2ItPmN1cnJlbnRfc2VnID0gMDsKKwkJbXNiLT5jdXJyZW50X3BhZ2UgPSAwOworCQltc2ItPmRhdGFfZGlyID0gUkVBRDsKKwkJbXNiLT50cmFuc2Zlcl9jbWQgPSBNU1BST19DTURfUkVBRF9BVFJCOworCisJCWRldl9kYmcoJmNhcmQtPmRldiwgInJlYWRpbmcgYXR0cmlidXRlIHBhZ2VzICV4LCAleFxuIiwKKwkJCWJlMzJfdG9fY3B1KHBhcmFtLmRhdGFfYWRkcmVzcyksCisJCQliZTE2X3RvX2NwdShwYXJhbS5kYXRhX2NvdW50KSk7CisKKwkJY2FyZC0+bmV4dF9yZXF1ZXN0ID0gaF9tc3Byb19ibG9ja19yZXFfaW5pdDsKKwkJbXNiLT5tcnFfaGFuZGxlciA9IGhfbXNwcm9fYmxvY2tfdHJhbnNmZXJfZGF0YTsKKwkJbWVtc3RpY2tfaW5pdF9yZXEoJmNhcmQtPmN1cnJlbnRfbXJxLCBNU19UUENfV1JJVEVfUkVHLAorCQkJCSAgKGNoYXIgKikmcGFyYW0sIHNpemVvZihwYXJhbSkpOworCQltZW1zdGlja19uZXdfcmVxKGNhcmQtPmhvc3QpOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjYXJkLT5tcnFfY29tcGxldGUpOworCQlpZiAoY2FyZC0+Y3VycmVudF9tcnEuZXJyb3IpIHsKKwkJCXJjID0gY2FyZC0+Y3VycmVudF9tcnEuZXJyb3I7CisJCQlnb3RvIG91dF9mcmVlX2J1ZmZlcjsKKwkJfQorCisJCW1lbWNweShzX2F0dHItPmRhdGEsIGJ1ZmZlciArIGFkZHIgJSBtc2ItPnBhZ2Vfc2l6ZSwgcmMpOworCX0KKworCXJjID0gMDsKK291dF9mcmVlX2J1ZmZlcjoKKwlrZnJlZShidWZmZXIpOworb3V0X2ZyZWVfYXR0cjoKKwlrZnJlZShhdHRyKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXNwcm9fYmxvY2tfaW5pdF9jYXJkKHN0cnVjdCBtZW1zdGlja19kZXYgKmNhcmQpCit7CisJc3RydWN0IG1zcHJvX2Jsb2NrX2RhdGEgKm1zYiA9IG1lbXN0aWNrX2dldF9kcnZkYXRhKGNhcmQpOworCXN0cnVjdCBtZW1zdGlja19ob3N0ICpob3N0ID0gY2FyZC0+aG9zdDsKKwlpbnQgcmMgPSAwOworCisJbXNiLT5zeXN0ZW0gPSAweDgwOworCWNhcmQtPnJlZ19hZGRyLnJfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IG1zcHJvX3JlZ2lzdGVyLCBzdGF0dXMpOworCWNhcmQtPnJlZ19hZGRyLnJfbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBtc19zdGF0dXNfcmVnaXN0ZXIpOworCWNhcmQtPnJlZ19hZGRyLndfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IG1zcHJvX3JlZ2lzdGVyLCBwYXJhbSk7CisJY2FyZC0+cmVnX2FkZHIud19sZW5ndGggPSBzaXplb2Yoc3RydWN0IG1zcHJvX3BhcmFtX3JlZ2lzdGVyKTsKKworCWlmIChtZW1zdGlja19zZXRfcndfYWRkcihjYXJkKSkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoaG9zdC0+Y2FwcyAmIE1FTVNUSUNLX0NBUF9QQVJBTExFTCkgeworCQlpZiAobXNwcm9fYmxvY2tfc3dpdGNoX3RvX3BhcmFsbGVsKGNhcmQpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNvdWxkIG5vdCBzd2l0Y2ggdG8gIgorCQkJICAgICAgICJwYXJhbGxlbCBpbnRlcmZhY2VcbiIsIGNhcmQtPmRldi5idXNfaWQpOworCX0KKworCXJjID0gbXNwcm9fYmxvY2tfd2FpdF9mb3JfY2VkKGNhcmQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCWRldl9kYmcoJmNhcmQtPmRldiwgImNhcmQgYWN0aXZhdGVkXG4iKTsKKworCWNhcmQtPm5leHRfcmVxdWVzdCA9IGhfbXNwcm9fYmxvY2tfcmVxX2luaXQ7CisJbXNiLT5tcnFfaGFuZGxlciA9IGhfbXNwcm9fYmxvY2tfZ2V0X3JvOworCW1lbXN0aWNrX2luaXRfcmVxKCZjYXJkLT5jdXJyZW50X21ycSwgTVNfVFBDX1JFQURfUkVHLCBOVUxMLAorCQkJICBzaXplb2Yoc3RydWN0IG1zX3N0YXR1c19yZWdpc3RlcikpOworCW1lbXN0aWNrX25ld19yZXEoY2FyZC0+aG9zdCk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmY2FyZC0+bXJxX2NvbXBsZXRlKTsKKwlpZiAoY2FyZC0+Y3VycmVudF9tcnEuZXJyb3IpCisJCXJldHVybiBjYXJkLT5jdXJyZW50X21ycS5lcnJvcjsKKworCWRldl9kYmcoJmNhcmQtPmRldiwgImNhcmQgci93IHN0YXR1cyAlZFxuIiwgbXNiLT5yZWFkX29ubHkgPyAwIDogMSk7CisKKwltc2ItPnBhZ2Vfc2l6ZSA9IDUxMjsKKwlyYyA9IG1zcHJvX2Jsb2NrX3JlYWRfYXR0cmlidXRlcyhjYXJkKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWRldl9kYmcoJmNhcmQtPmRldiwgImF0dHJpYnV0ZXMgbG9hZGVkXG4iKTsKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IG1zcHJvX2Jsb2NrX2luaXRfZGlzayhzdHJ1Y3QgbWVtc3RpY2tfZGV2ICpjYXJkKQoreworCXN0cnVjdCBtc3Byb19ibG9ja19kYXRhICptc2IgPSBtZW1zdGlja19nZXRfZHJ2ZGF0YShjYXJkKTsKKwlzdHJ1Y3QgbWVtc3RpY2tfaG9zdCAqaG9zdCA9IGNhcmQtPmhvc3Q7CisJc3RydWN0IG1zcHJvX2RldmluZm8gKmRldl9pbmZvID0gTlVMTDsKKwlzdHJ1Y3QgbXNwcm9fc3lzX2luZm8gKnN5c19pbmZvID0gTlVMTDsKKwlzdHJ1Y3QgbXNwcm9fc3lzX2F0dHIgKnNfYXR0ciA9IE5VTEw7CisJaW50IHJjLCBkaXNrX2lkOworCXU2NCBsaW1pdCA9IEJMS19CT1VOQ0VfSElHSDsKKwl1bnNpZ25lZCBsb25nIGNhcGFjaXR5OworCisJaWYgKGhvc3QtPmNkZXYuZGV2LT5kbWFfbWFzayAmJiAqKGhvc3QtPmNkZXYuZGV2LT5kbWFfbWFzaykpCisJCWxpbWl0ID0gKihob3N0LT5jZGV2LmRldi0+ZG1hX21hc2spOworCisJZm9yIChyYyA9IDA7IG1zYi0+YXR0cl9ncm91cC5hdHRyc1tyY107ICsrcmMpIHsKKwkJc19hdHRyID0gbXNwcm9fZnJvbV9zeXNmc19hdHRyKG1zYi0+YXR0cl9ncm91cC5hdHRyc1tyY10pOworCisJCWlmIChzX2F0dHItPmlkID09IE1TUFJPX0JMT0NLX0lEX0RFVklORk8pCisJCQlkZXZfaW5mbyA9IHNfYXR0ci0+ZGF0YTsKKwkJZWxzZSBpZiAoc19hdHRyLT5pZCA9PSBNU1BST19CTE9DS19JRF9TWVNJTkZPKQorCQkJc3lzX2luZm8gPSBzX2F0dHItPmRhdGE7CisJfQorCisJaWYgKCFkZXZfaW5mbyB8fCAhc3lzX2luZm8pCisJCXJldHVybiAtRU5PREVWOworCisJbXNiLT5jeWxpbmRlcnMgPSBiZTE2X3RvX2NwdShkZXZfaW5mby0+Y3lsaW5kZXJzKTsKKwltc2ItPmhlYWRzID0gYmUxNl90b19jcHUoZGV2X2luZm8tPmhlYWRzKTsKKwltc2ItPnNlY3RvcnNfcGVyX3RyYWNrID0gYmUxNl90b19jcHUoZGV2X2luZm8tPnNlY3RvcnNfcGVyX3RyYWNrKTsKKworCW1zYi0+cGFnZV9zaXplID0gYmUxNl90b19jcHUoc3lzX2luZm8tPnVuaXRfc2l6ZSk7CisKKwlpZiAoIWlkcl9wcmVfZ2V0KCZtc3Byb19ibG9ja19kaXNrX2lkciwgR0ZQX0tFUk5FTCkpCisJCXJldHVybiAtRU5PTUVNOworCisJbXV0ZXhfbG9jaygmbXNwcm9fYmxvY2tfZGlza19sb2NrKTsKKwlyYyA9IGlkcl9nZXRfbmV3KCZtc3Byb19ibG9ja19kaXNrX2lkciwgY2FyZCwgJmRpc2tfaWQpOworCW11dGV4X3VubG9jaygmbXNwcm9fYmxvY2tfZGlza19sb2NrKTsKKworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKChkaXNrX2lkIDw8IE1FTVNUSUNLX1BBUlRfU0hJRlQpID4gMjU1KSB7CisJCXJjID0gLUVOT1NQQzsKKwkJZ290byBvdXRfcmVsZWFzZV9pZDsKKwl9CisKKwltc2ItPmRpc2sgPSBhbGxvY19kaXNrKDEgPDwgTUVNU1RJQ0tfUEFSVF9TSElGVCk7CisJaWYgKCFtc2ItPmRpc2spIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dF9yZWxlYXNlX2lkOworCX0KKworCXNwaW5fbG9ja19pbml0KCZtc2ItPnFfbG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbXNiLT5xX3dhaXQpOworCisJbXNiLT5xdWV1ZSA9IGJsa19pbml0X3F1ZXVlKG1zcHJvX2Jsb2NrX3JlcXVlc3QsICZtc2ItPnFfbG9jayk7CisJaWYgKCFtc2ItPnF1ZXVlKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXRfcHV0X2Rpc2s7CisJfQorCisJbXNiLT5xdWV1ZS0+cXVldWVkYXRhID0gY2FyZDsKKworCWJsa19xdWV1ZV9ib3VuY2VfbGltaXQobXNiLT5xdWV1ZSwgbGltaXQpOworCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhtc2ItPnF1ZXVlLCBNU1BST19CTE9DS19NQVhfUEFHRVMpOworCWJsa19xdWV1ZV9tYXhfcGh5c19zZWdtZW50cyhtc2ItPnF1ZXVlLCBNU1BST19CTE9DS19NQVhfU0VHUyk7CisJYmxrX3F1ZXVlX21heF9od19zZWdtZW50cyhtc2ItPnF1ZXVlLCBNU1BST19CTE9DS19NQVhfU0VHUyk7CisJYmxrX3F1ZXVlX21heF9zZWdtZW50X3NpemUobXNiLT5xdWV1ZSwKKwkJCQkgICBNU1BST19CTE9DS19NQVhfUEFHRVMgKiBtc2ItPnBhZ2Vfc2l6ZSk7CisKKwltc2ItPmRpc2stPm1ham9yID0gbWFqb3I7CisJbXNiLT5kaXNrLT5maXJzdF9taW5vciA9IGRpc2tfaWQgPDwgTUVNU1RJQ0tfUEFSVF9TSElGVDsKKwltc2ItPmRpc2stPmZvcHMgPSAmbXNfYmxvY2tfYmRvcHM7CisJbXNiLT51c2FnZV9jb3VudCA9IDE7CisJbXNiLT5kaXNrLT5wcml2YXRlX2RhdGEgPSBtc2I7CisJbXNiLT5kaXNrLT5xdWV1ZSA9IG1zYi0+cXVldWU7CisJbXNiLT5kaXNrLT5kcml2ZXJmc19kZXYgPSAmY2FyZC0+ZGV2OworCisJc3ByaW50Zihtc2ItPmRpc2stPmRpc2tfbmFtZSwgIm1zcGJsayVkIiwgZGlza19pZCk7CisKKwlibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZShtc2ItPnF1ZXVlLCBtc2ItPnBhZ2Vfc2l6ZSk7CisKKwljYXBhY2l0eSA9IGJlMTZfdG9fY3B1KHN5c19pbmZvLT51c2VyX2Jsb2NrX2NvdW50KTsKKwljYXBhY2l0eSAqPSBiZTE2X3RvX2NwdShzeXNfaW5mby0+YmxvY2tfc2l6ZSk7CisJY2FwYWNpdHkgKj0gbXNiLT5wYWdlX3NpemUgPj4gOTsKKwlzZXRfY2FwYWNpdHkobXNiLT5kaXNrLCBjYXBhY2l0eSk7CisJZGV2X2RiZygmY2FyZC0+ZGV2LCAiY2FwYWNpdHkgc2V0ICVsZFxuIiwgY2FwYWNpdHkpOworCW1zYi0+cV90aHJlYWQgPSBrdGhyZWFkX3J1bihtc3Byb19ibG9ja19xdWV1ZV90aHJlYWQsIGNhcmQsCisJCQkJICAgIERSSVZFUl9OQU1FImQiKTsKKwlpZiAoSVNfRVJSKG1zYi0+cV90aHJlYWQpKQorCQlnb3RvIG91dF9wdXRfZGlzazsKKworCW11dGV4X3VubG9jaygmaG9zdC0+bG9jayk7CisJYWRkX2Rpc2sobXNiLT5kaXNrKTsKKwltdXRleF9sb2NrKCZob3N0LT5sb2NrKTsKKwltc2ItPmFjdGl2ZSA9IDE7CisJcmV0dXJuIDA7CisKK291dF9wdXRfZGlzazoKKwlwdXRfZGlzayhtc2ItPmRpc2spOworb3V0X3JlbGVhc2VfaWQ6CisJbXV0ZXhfbG9jaygmbXNwcm9fYmxvY2tfZGlza19sb2NrKTsKKwlpZHJfcmVtb3ZlKCZtc3Byb19ibG9ja19kaXNrX2lkciwgZGlza19pZCk7CisJbXV0ZXhfdW5sb2NrKCZtc3Byb19ibG9ja19kaXNrX2xvY2spOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgbXNwcm9fYmxvY2tfZGF0YV9jbGVhcihzdHJ1Y3QgbXNwcm9fYmxvY2tfZGF0YSAqbXNiKQoreworCWludCBjbnQ7CisJc3RydWN0IG1zcHJvX3N5c19hdHRyICpzX2F0dHI7CisKKwlpZiAobXNiLT5hdHRyX2dyb3VwLmF0dHJzKSB7CisJCWZvciAoY250ID0gMDsgbXNiLT5hdHRyX2dyb3VwLmF0dHJzW2NudF07ICsrY250KSB7CisJCQlzX2F0dHIgPSBtc3Byb19mcm9tX3N5c2ZzX2F0dHIobXNiLT5hdHRyX2dyb3VwCisJCQkJCQkJICAgLmF0dHJzW2NudF0pOworCQkJa2ZyZWUoc19hdHRyLT5kYXRhKTsKKwkJCWtmcmVlKHNfYXR0cik7CisJCX0KKwkJa2ZyZWUobXNiLT5hdHRyX2dyb3VwLmF0dHJzKTsKKwl9CisKKwltc2ItPmNhcmQgPSBOVUxMOworfQorCitzdGF0aWMgaW50IG1zcHJvX2Jsb2NrX2NoZWNrX2NhcmQoc3RydWN0IG1lbXN0aWNrX2RldiAqY2FyZCkKK3sKKwlzdHJ1Y3QgbXNwcm9fYmxvY2tfZGF0YSAqbXNiID0gbWVtc3RpY2tfZ2V0X2RydmRhdGEoY2FyZCk7CisKKwlyZXR1cm4gKG1zYi0+YWN0aXZlID09IDEpOworfQorCitzdGF0aWMgaW50IG1zcHJvX2Jsb2NrX3Byb2JlKHN0cnVjdCBtZW1zdGlja19kZXYgKmNhcmQpCit7CisJc3RydWN0IG1zcHJvX2Jsb2NrX2RhdGEgKm1zYjsKKwlpbnQgcmMgPSAwOworCisJbXNiID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zcHJvX2Jsb2NrX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zYikKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc3RpY2tfc2V0X2RydmRhdGEoY2FyZCwgbXNiKTsKKwltc2ItPmNhcmQgPSBjYXJkOworCisJcmMgPSBtc3Byb19ibG9ja19pbml0X2NhcmQoY2FyZCk7CisKKwlpZiAocmMpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlyYyA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2FyZC0+ZGV2LmtvYmosICZtc2ItPmF0dHJfZ3JvdXApOworCWlmIChyYykKKwkJZ290byBvdXRfZnJlZTsKKworCXJjID0gbXNwcm9fYmxvY2tfaW5pdF9kaXNrKGNhcmQpOworCWlmICghcmMpIHsKKwkJY2FyZC0+Y2hlY2sgPSBtc3Byb19ibG9ja19jaGVja19jYXJkOworCQlyZXR1cm4gMDsKKwl9CisKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmNhcmQtPmRldi5rb2JqLCAmbXNiLT5hdHRyX2dyb3VwKTsKK291dF9mcmVlOgorCW1lbXN0aWNrX3NldF9kcnZkYXRhKGNhcmQsIE5VTEwpOworCW1zcHJvX2Jsb2NrX2RhdGFfY2xlYXIobXNiKTsKKwlrZnJlZShtc2IpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgbXNwcm9fYmxvY2tfcmVtb3ZlKHN0cnVjdCBtZW1zdGlja19kZXYgKmNhcmQpCit7CisJc3RydWN0IG1zcHJvX2Jsb2NrX2RhdGEgKm1zYiA9IG1lbXN0aWNrX2dldF9kcnZkYXRhKGNhcmQpOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcV90aHJlYWQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkZWxfZ2VuZGlzayhtc2ItPmRpc2spOworCWRldl9kYmcoJmNhcmQtPmRldiwgIm1zcHJvIGJsb2NrIHJlbW92ZVxuIik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm1zYi0+cV9sb2NrLCBmbGFncyk7CisJcV90aHJlYWQgPSBtc2ItPnFfdGhyZWFkOworCW1zYi0+cV90aHJlYWQgPSBOVUxMOworCW1zYi0+YWN0aXZlID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc2ItPnFfbG9jaywgZmxhZ3MpOworCisJaWYgKHFfdGhyZWFkKSB7CisJCW11dGV4X3VubG9jaygmY2FyZC0+aG9zdC0+bG9jayk7CisJCWt0aHJlYWRfc3RvcChxX3RocmVhZCk7CisJCW11dGV4X2xvY2soJmNhcmQtPmhvc3QtPmxvY2spOworCX0KKworCWRldl9kYmcoJmNhcmQtPmRldiwgInF1ZXVlIHRocmVhZCBzdG9wcGVkXG4iKTsKKworCWJsa19jbGVhbnVwX3F1ZXVlKG1zYi0+cXVldWUpOworCisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjYXJkLT5kZXYua29iaiwgJm1zYi0+YXR0cl9ncm91cCk7CisKKwltdXRleF9sb2NrKCZtc3Byb19ibG9ja19kaXNrX2xvY2spOworCW1zcHJvX2Jsb2NrX2RhdGFfY2xlYXIobXNiKTsKKwltdXRleF91bmxvY2soJm1zcHJvX2Jsb2NrX2Rpc2tfbG9jayk7CisKKwltc3Byb19ibG9ja19kaXNrX3JlbGVhc2UobXNiLT5kaXNrKTsKKwltZW1zdGlja19zZXRfZHJ2ZGF0YShjYXJkLCBOVUxMKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IG1zcHJvX2Jsb2NrX3N1c3BlbmQoc3RydWN0IG1lbXN0aWNrX2RldiAqY2FyZCwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBtc3Byb19ibG9ja19kYXRhICptc2IgPSBtZW1zdGlja19nZXRfZHJ2ZGF0YShjYXJkKTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnFfdGhyZWFkID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1zYi0+cV9sb2NrLCBmbGFncyk7CisJcV90aHJlYWQgPSBtc2ItPnFfdGhyZWFkOworCW1zYi0+cV90aHJlYWQgPSBOVUxMOworCW1zYi0+YWN0aXZlID0gMDsKKwlibGtfc3RvcF9xdWV1ZShtc2ItPnF1ZXVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc2ItPnFfbG9jaywgZmxhZ3MpOworCisJaWYgKHFfdGhyZWFkKQorCQlrdGhyZWFkX3N0b3AocV90aHJlYWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNwcm9fYmxvY2tfcmVzdW1lKHN0cnVjdCBtZW1zdGlja19kZXYgKmNhcmQpCit7CisJc3RydWN0IG1zcHJvX2Jsb2NrX2RhdGEgKm1zYiA9IG1lbXN0aWNrX2dldF9kcnZkYXRhKGNhcmQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gMDsKKworI2lmZGVmIENPTkZJR19NRU1TVElDS19VTlNBRkVfUkVTVU1FCisKKwlzdHJ1Y3QgbXNwcm9fYmxvY2tfZGF0YSAqbmV3X21zYjsKKwlzdHJ1Y3QgbWVtc3RpY2tfaG9zdCAqaG9zdCA9IGNhcmQtPmhvc3Q7CisJc3RydWN0IG1zcHJvX3N5c19hdHRyICpzX2F0dHIsICpyX2F0dHI7CisJdW5zaWduZWQgY2hhciBjbnQ7CisKKwltdXRleF9sb2NrKCZob3N0LT5sb2NrKTsKKwluZXdfbXNiID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zcHJvX2Jsb2NrX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5ld19tc2IpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJbmV3X21zYi0+Y2FyZCA9IGNhcmQ7CisJbWVtc3RpY2tfc2V0X2RydmRhdGEoY2FyZCwgbmV3X21zYik7CisJaWYgKG1zcHJvX2Jsb2NrX2luaXRfY2FyZChjYXJkKSkKKwkJZ290byBvdXRfZnJlZTsKKworCWZvciAoY250ID0gMDsgbmV3X21zYi0+YXR0cl9ncm91cC5hdHRyc1tjbnRdCisJCSAgICAgICYmIG1zYi0+YXR0cl9ncm91cC5hdHRyc1tjbnRdOyArK2NudCkgeworCQlzX2F0dHIgPSBtc3Byb19mcm9tX3N5c2ZzX2F0dHIobmV3X21zYi0+YXR0cl9ncm91cC5hdHRyc1tjbnRdKTsKKwkJcl9hdHRyID0gbXNwcm9fZnJvbV9zeXNmc19hdHRyKG1zYi0+YXR0cl9ncm91cC5hdHRyc1tjbnRdKTsKKworCQlpZiAoc19hdHRyLT5pZCA9PSBNU1BST19CTE9DS19JRF9TWVNJTkZPCisJCSAgICAmJiByX2F0dHItPmlkID09IHNfYXR0ci0+aWQpIHsKKwkJCWlmIChtZW1jbXAoc19hdHRyLT5kYXRhLCByX2F0dHItPmRhdGEsIHNfYXR0ci0+c2l6ZSkpCisJCQkJYnJlYWs7CisKKwkJCW1lbXN0aWNrX3NldF9kcnZkYXRhKGNhcmQsIG1zYik7CisJCQltc2ItPnFfdGhyZWFkID0ga3RocmVhZF9ydW4obXNwcm9fYmxvY2tfcXVldWVfdGhyZWFkLAorCQkJCQkJICAgIGNhcmQsIERSSVZFUl9OQU1FImQiKTsKKwkJCWlmIChJU19FUlIobXNiLT5xX3RocmVhZCkpCisJCQkJbXNiLT5xX3RocmVhZCA9IE5VTEw7CisJCQllbHNlCisJCQkJbXNiLT5hY3RpdmUgPSAxOworCisJCQlicmVhazsKKwkJfQorCX0KKworb3V0X2ZyZWU6CisJbWVtc3RpY2tfc2V0X2RydmRhdGEoY2FyZCwgbXNiKTsKKwltc3Byb19ibG9ja19kYXRhX2NsZWFyKG5ld19tc2IpOworCWtmcmVlKG5ld19tc2IpOworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJmhvc3QtPmxvY2spOworCisjZW5kaWYgLyogQ09ORklHX01FTVNUSUNLX1VOU0FGRV9SRVNVTUUgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZtc2ItPnFfbG9jaywgZmxhZ3MpOworCWJsa19zdGFydF9xdWV1ZShtc2ItPnF1ZXVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc2ItPnFfbG9jaywgZmxhZ3MpOworCXJldHVybiByYzsKK30KKworI2Vsc2UKKworI2RlZmluZSBtc3Byb19ibG9ja19zdXNwZW5kIE5VTEwKKyNkZWZpbmUgbXNwcm9fYmxvY2tfcmVzdW1lIE5VTEwKKworI2VuZGlmIC8qIENPTkZJR19QTSAqLworCitzdGF0aWMgc3RydWN0IG1lbXN0aWNrX2RldmljZV9pZCBtc3Byb19ibG9ja19pZF90YmxbXSA9IHsKKwl7TUVNU1RJQ0tfTUFUQ0hfQUxMLCBNRU1TVElDS19UWVBFX1BSTywgTUVNU1RJQ0tfQ0FURUdPUllfU1RPUkFHRV9EVU8sCisJIE1FTVNUSUNLX0NMQVNTX0dFTkVSSUNfRFVPfSwKKwl7fQorfTsKKworCitzdGF0aWMgc3RydWN0IG1lbXN0aWNrX2RyaXZlciBtc3Byb19ibG9ja19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgID0gRFJJVkVSX05BTUUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFCisJfSwKKwkuaWRfdGFibGUgPSBtc3Byb19ibG9ja19pZF90YmwsCisJLnByb2JlICAgID0gbXNwcm9fYmxvY2tfcHJvYmUsCisJLnJlbW92ZSAgID0gbXNwcm9fYmxvY2tfcmVtb3ZlLAorCS5zdXNwZW5kICA9IG1zcHJvX2Jsb2NrX3N1c3BlbmQsCisJLnJlc3VtZSAgID0gbXNwcm9fYmxvY2tfcmVzdW1lCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtc3Byb19ibG9ja19pbml0KHZvaWQpCit7CisJaW50IHJjID0gLUVOT01FTTsKKworCXJjID0gcmVnaXN0ZXJfYmxrZGV2KG1ham9yLCBEUklWRVJfTkFNRSk7CisJaWYgKHJjIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgRFJJVkVSX05BTUUgIjogZmFpbGVkIHRvIHJlZ2lzdGVyICIKKwkJICAgICAgICJtYWpvciAlZCwgZXJyb3IgJWRcbiIsIG1ham9yLCByYyk7CisJCXJldHVybiByYzsKKwl9CisJaWYgKCFtYWpvcikKKwkJbWFqb3IgPSByYzsKKworCXJjID0gbWVtc3RpY2tfcmVnaXN0ZXJfZHJpdmVyKCZtc3Byb19ibG9ja19kcml2ZXIpOworCWlmIChyYykKKwkJdW5yZWdpc3Rlcl9ibGtkZXYobWFqb3IsIERSSVZFUl9OQU1FKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtc3Byb19ibG9ja19leGl0KHZvaWQpCit7CisJbWVtc3RpY2tfdW5yZWdpc3Rlcl9kcml2ZXIoJm1zcHJvX2Jsb2NrX2RyaXZlcik7CisJdW5yZWdpc3Rlcl9ibGtkZXYobWFqb3IsIERSSVZFUl9OQU1FKTsKKwlpZHJfZGVzdHJveSgmbXNwcm9fYmxvY2tfZGlza19pZHIpOworfQorCittb2R1bGVfaW5pdChtc3Byb19ibG9ja19pbml0KTsKK21vZHVsZV9leGl0KG1zcHJvX2Jsb2NrX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJBbGV4IER1Ym92Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNvbnkgTWVtb3J5U3RpY2tQcm8gYmxvY2sgZGV2aWNlIGRyaXZlciIpOworTU9EVUxFX0RFVklDRV9UQUJMRShtZW1zdGljaywgbXNwcm9fYmxvY2tfaWRfdGJsKTsKK01PRFVMRV9WRVJTSU9OKERSSVZFUl9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVtc3RpY2svaG9zdC9LY29uZmlnIGIvZHJpdmVycy9tZW1zdGljay9ob3N0L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwMmZjYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVtc3RpY2svaG9zdC9LY29uZmlnCkBAIC0wLDAgKzEsMjIgQEAKKyMKKyMgTWVtb3J5U3RpY2sgaG9zdCBjb250cm9sbGVyIGRyaXZlcnMKKyMKKworY29tbWVudCAiTWVtb3J5U3RpY2sgSG9zdCBDb250cm9sbGVyIERyaXZlcnMiCisKK2NvbmZpZyBNRU1TVElDS19USUZNX01TCisJdHJpc3RhdGUgIlRJIEZsYXNoIE1lZGlhIE1lbW9yeVN0aWNrIEludGVyZmFjZSBzdXBwb3J0ICAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBQQ0kKKwlzZWxlY3QgVElGTV9DT1JFCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIGFjY2VzcyBNZW1vcnlTdGljayBjYXJkcyB3aXRoCisJICB0aGUgVGV4YXMgSW5zdHJ1bWVudHMoUikgRmxhc2ggTWVkaWEgY2FyZCByZWFkZXIsIGZvdW5kIGluIG1hbnkKKwkgIGxhcHRvcHMuCisJICBUaGlzIG9wdGlvbiAnc2VsZWN0cycgKHR1cm5zIG9uLCBlbmFibGVzKSAnVElGTV9DT1JFJywgYnV0IHlvdQorCSAgcHJvYmFibHkgYWxzbyBuZWVkIGFwcHJvcHJpYXRlIGNhcmQgcmVhZGVyIGhvc3QgYWRhcHRlciwgc3VjaCBhcworCSAgJ01pc2MgZGV2aWNlczogVEkgRmxhc2ggTWVkaWEgUENJNzR4eC9QQ0k3Nnh4IGhvc3QgYWRhcHRlciBzdXBwb3J0CisJICAoVElGTV83WFgxKScuCisKKyAgICAgICAgICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB0aWZtX21zLgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lbXN0aWNrL2hvc3QvTWFrZWZpbGUgYi9kcml2ZXJzL21lbXN0aWNrL2hvc3QvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU2NjYzOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVtc3RpY2svaG9zdC9NYWtlZmlsZQpAQCAtMCwwICsxLDEwIEBACisjCisjIE1ha2VmaWxlIGZvciBNZW1vcnlTdGljayBob3N0IGNvbnRyb2xsZXIgZHJpdmVycworIworCitpZmVxICgkKENPTkZJR19NRU1TVElDS19ERUJVRykseSkKKwlFWFRSQV9DRkxBR1MJCSs9IC1EREVCVUcKK2VuZGlmCisKK29iai0kKENPTkZJR19NRU1TVElDS19USUZNX01TKQkrPSB0aWZtX21zLm8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZW1zdGljay9ob3N0L3RpZm1fbXMuYyBiL2RyaXZlcnMvbWVtc3RpY2svaG9zdC90aWZtX21zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU1YjcxYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVtc3RpY2svaG9zdC90aWZtX21zLmMKQEAgLTAsMCArMSw2ODUgQEAKKy8qCisgKiAgVEkgRmxhc2hNZWRpYSBkcml2ZXIKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IEFsZXggRHVib3YgPG9ha2FkQHlhaG9vLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFNwZWNpYWwgdGhhbmtzIHRvIENhcmxvcyBDb3JiYWNobyBmb3IgcHJvdmlkaW5nIHZhcmlvdXMgTWVtb3J5U3RpY2sgY2FyZHMKKyAqIHRoYXQgbWFkZSB0aGlzIGRyaXZlciBwb3NzaWJsZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3RpZm0uaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1zdGljay5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBEUklWRVJfTkFNRSAidGlmbV9tcyIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuMSIKKworc3RhdGljIGludCBub19kbWE7Cittb2R1bGVfcGFyYW0obm9fZG1hLCBib29sLCAwNjQ0KTsKKworI2RlZmluZSBUSUZNX01TX1RJTUVPVVQgICAgICAweDAwMTAwCisjZGVmaW5lIFRJRk1fTVNfQkFEQ1JDICAgICAgIDB4MDAyMDAKKyNkZWZpbmUgVElGTV9NU19FT1RQQyAgICAgICAgMHgwMTAwMAorI2RlZmluZSBUSUZNX01TX0lOVCAgICAgICAgICAweDAyMDAwCisKKy8qIFRoZSBtZWFuaW5nIG9mIHRoZSBiaXQgbWFqb3JpdHkgaW4gdGhpcyBjb25zdGFudCBpcyB1bmtub3duLiAqLworI2RlZmluZSBUSUZNX01TX1NFUklBTCAgICAgICAweDA0MDEwCisKKyNkZWZpbmUgVElGTV9NU19TWVNfTEFUQ0ggICAgMHgwMDEwMAorI2RlZmluZSBUSUZNX01TX1NZU19OT1RfUkRZICAweDAwODAwCisjZGVmaW5lIFRJRk1fTVNfU1lTX0RBVEEgICAgIDB4MTAwMDAKKworLyogSGFyZHdhcmUgZmxhZ3MgKi8KK2VudW0geworCUNNRF9SRUFEWSAgPSAweDAwMDEsCisJRklGT19SRUFEWSA9IDB4MDAwMiwKKwlDQVJEX1JFQURZID0gMHgwMDA0LAorCURBVEFfQ0FSUlkgPSAweDAwMDgKK307CisKK3N0cnVjdCB0aWZtX21zIHsKKwlzdHJ1Y3QgdGlmbV9kZXYgICAgICAgICAqZGV2OworCXVuc2lnbmVkIHNob3J0ICAgICAgICAgIGVqZWN0OjEsCisJCQkJbm9fZG1hOjE7CisJdW5zaWduZWQgc2hvcnQgICAgICAgICAgY21kX2ZsYWdzOworCXVuc2lnbmVkIGludCAgICAgICAgICAgIG1vZGVfbWFzazsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBibG9ja19wb3M7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgdGltZW91dF9qaWZmaWVzOworCisJc3RydWN0IHRpbWVyX2xpc3QgICAgICAgdGltZXI7CisJc3RydWN0IG1lbXN0aWNrX3JlcXVlc3QgKnJlcTsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBpb193b3JkOworfTsKKworc3RhdGljIHZvaWQgdGlmbV9tc19yZWFkX2ZpZm8oc3RydWN0IHRpZm1fbXMgKmhvc3QsIHVuc2lnbmVkIGludCBmaWZvX29mZnNldCwKKwkJCSAgICAgIHN0cnVjdCBwYWdlICpwZywgdW5zaWduZWQgaW50IHBhZ2Vfb2ZmLAorCQkJICAgICAgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgdGlmbV9kZXYgKnNvY2sgPSBob3N0LT5kZXY7CisJdW5zaWduZWQgaW50IGNudCA9IDAsIG9mZiA9IDA7CisJdW5zaWduZWQgY2hhciAqYnVmID0ga21hcF9hdG9taWMocGcsIEtNX0JJT19EU1RfSVJRKSArIHBhZ2Vfb2ZmOworCisJaWYgKGhvc3QtPmNtZF9mbGFncyAmIERBVEFfQ0FSUlkpIHsKKwkJd2hpbGUgKChmaWZvX29mZnNldCAmIDMpICYmIGxlbmd0aCkgeworCQkJYnVmW29mZisrXSA9IGhvc3QtPmlvX3dvcmQgJiAweGZmOworCQkJaG9zdC0+aW9fd29yZCA+Pj0gODsKKwkJCWxlbmd0aC0tOworCQkJZmlmb19vZmZzZXQrKzsKKwkJfQorCQlpZiAoIShmaWZvX29mZnNldCAmIDMpKQorCQkJaG9zdC0+Y21kX2ZsYWdzICY9IH5EQVRBX0NBUlJZOworCQlpZiAoIWxlbmd0aCkKKwkJCXJldHVybjsKKwl9CisKKwlkbyB7CisJCWhvc3QtPmlvX3dvcmQgPSByZWFkbChzb2NrLT5hZGRyICsgU09DS19GSUZPX0FDQ0VTUworCQkJCSAgICAgICsgZmlmb19vZmZzZXQpOworCQljbnQgPSA0OworCQl3aGlsZSAobGVuZ3RoICYmIGNudCkgeworCQkJYnVmW29mZisrXSA9IChob3N0LT5pb193b3JkID4+IDgpICYgMHhmZjsKKwkJCWNudC0tOworCQkJbGVuZ3RoLS07CisJCX0KKwkJZmlmb19vZmZzZXQgKz0gNCAtIGNudDsKKwl9IHdoaWxlIChsZW5ndGgpOworCisJaWYgKGNudCkKKwkJaG9zdC0+Y21kX2ZsYWdzIHw9IERBVEFfQ0FSUlk7CisKKwlrdW5tYXBfYXRvbWljKGJ1ZiAtIHBhZ2Vfb2ZmLCBLTV9CSU9fRFNUX0lSUSk7Cit9CisKK3N0YXRpYyB2b2lkIHRpZm1fbXNfd3JpdGVfZmlmbyhzdHJ1Y3QgdGlmbV9tcyAqaG9zdCwgdW5zaWduZWQgaW50IGZpZm9fb2Zmc2V0LAorCQkJICAgICAgIHN0cnVjdCBwYWdlICpwZywgdW5zaWduZWQgaW50IHBhZ2Vfb2ZmLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisJc3RydWN0IHRpZm1fZGV2ICpzb2NrID0gaG9zdC0+ZGV2OworCXVuc2lnbmVkIGludCBjbnQgPSAwLCBvZmYgPSAwOworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IGttYXBfYXRvbWljKHBnLCBLTV9CSU9fU1JDX0lSUSkgKyBwYWdlX29mZjsKKworCWlmIChob3N0LT5jbWRfZmxhZ3MgJiBEQVRBX0NBUlJZKSB7CisJCXdoaWxlIChmaWZvX29mZnNldCAmIDMpIHsKKwkJCWhvc3QtPmlvX3dvcmQgfD0gYnVmW29mZisrXSA8PCAoOCAqIChmaWZvX29mZnNldCAmIDMpKTsKKwkJCWxlbmd0aC0tOworCQkJZmlmb19vZmZzZXQrKzsKKwkJfQorCQlpZiAoIShmaWZvX29mZnNldCAmIDMpKSB7CisJCQl3cml0ZWwoaG9zdC0+aW9fd29yZCwgc29jay0+YWRkciArIFNPQ0tfRklGT19BQ0NFU1MKKwkJCSAgICAgICArIGZpZm9fb2Zmc2V0IC0gNCk7CisKKwkJCWhvc3QtPmNtZF9mbGFncyAmPSB+REFUQV9DQVJSWTsKKwkJfQorCQlpZiAoIWxlbmd0aCkKKwkJCXJldHVybjsKKwl9CisKKwlkbyB7CisJCWNudCA9IDQ7CisJCWhvc3QtPmlvX3dvcmQgPSAwOworCQl3aGlsZSAobGVuZ3RoICYmIGNudCkgeworCQkJaG9zdC0+aW9fd29yZCB8PSBidWZbb2ZmKytdIDw8ICg0IC0gY250KTsKKwkJCWNudC0tOworCQkJbGVuZ3RoLS07CisJCX0KKwkJZmlmb19vZmZzZXQgKz0gNCAtIGNudDsKKwkJaWYgKCFjbnQpCisJCQl3cml0ZWwoaG9zdC0+aW9fd29yZCwgc29jay0+YWRkciArIFNPQ0tfRklGT19BQ0NFU1MKKwkJCQkJICAgICAgKyBmaWZvX29mZnNldCAtIDQpOworCisJfSB3aGlsZSAobGVuZ3RoKTsKKworCWlmIChjbnQpCisJCWhvc3QtPmNtZF9mbGFncyB8PSBEQVRBX0NBUlJZOworCisJa3VubWFwX2F0b21pYyhidWYgLSBwYWdlX29mZiwgS01fQklPX1NSQ19JUlEpOworfQorCitzdGF0aWMgdm9pZCB0aWZtX21zX21vdmVfYmxvY2soc3RydWN0IHRpZm1fbXMgKmhvc3QsIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisJdW5zaWduZWQgaW50IHRfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgb2ZmID0gaG9zdC0+cmVxLT5zZy5vZmZzZXQgKyBob3N0LT5ibG9ja19wb3M7CisJdW5zaWduZWQgaW50IHBfb2ZmLCBwX2NudDsKKwlzdHJ1Y3QgcGFnZSAqcGc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRldl9kYmcoJmhvc3QtPmRldi0+ZGV2LCAibW92aW5nIGJsb2NrXG4iKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJdF9zaXplID0gbGVuZ3RoOworCXdoaWxlICh0X3NpemUpIHsKKwkJcGcgPSBudGhfcGFnZShzZ19wYWdlKCZob3N0LT5yZXEtPnNnKSwgb2ZmID4+IFBBR0VfU0hJRlQpOworCQlwX29mZiA9IG9mZnNldF9pbl9wYWdlKG9mZik7CisJCXBfY250ID0gUEFHRV9TSVpFIC0gcF9vZmY7CisJCXBfY250ID0gbWluKHBfY250LCB0X3NpemUpOworCisJCWlmIChob3N0LT5yZXEtPmRhdGFfZGlyID09IFdSSVRFKQorCQkJdGlmbV9tc193cml0ZV9maWZvKGhvc3QsIGxlbmd0aCAtIHRfc2l6ZSwKKwkJCQkJICAgcGcsIHBfb2ZmLCBwX2NudCk7CisJCWVsc2UKKwkJCXRpZm1fbXNfcmVhZF9maWZvKGhvc3QsIGxlbmd0aCAtIHRfc2l6ZSwKKwkJCQkJICBwZywgcF9vZmYsIHBfY250KTsKKworCQl0X3NpemUgLT0gcF9jbnQ7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIGludCB0aWZtX21zX3RyYW5zZmVyX2RhdGEoc3RydWN0IHRpZm1fbXMgKmhvc3QsIGludCBza2lwKQoreworCXN0cnVjdCB0aWZtX2RldiAqc29jayA9IGhvc3QtPmRldjsKKwl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gaG9zdC0+cmVxLT5zZy5sZW5ndGggLSBob3N0LT5ibG9ja19wb3M7CisKKwlpZiAoIWxlbmd0aCkKKwkJcmV0dXJuIDE7CisKKwlpZiAobGVuZ3RoID4gVElGTV9GSUZPX1NJWkUpCisJCWxlbmd0aCA9IFRJRk1fRklGT19TSVpFOworCisJaWYgKCFza2lwKSB7CisJCXRpZm1fbXNfbW92ZV9ibG9jayhob3N0LCBsZW5ndGgpOworCQlob3N0LT5ibG9ja19wb3MgKz0gbGVuZ3RoOworCX0KKworCWlmICgoaG9zdC0+cmVxLT5kYXRhX2RpciA9PSBSRUFEKQorCSAgICAmJiAoaG9zdC0+YmxvY2tfcG9zID09IGhvc3QtPnJlcS0+c2cubGVuZ3RoKSkKKwkJcmV0dXJuIDE7CisKKwl3cml0ZWwoaWxvZzIobGVuZ3RoKSAtIDIsIHNvY2stPmFkZHIgKyBTT0NLX0ZJRk9fUEFHRV9TSVpFKTsKKwlpZiAoaG9zdC0+cmVxLT5kYXRhX2RpciA9PSBXUklURSkKKwkJd3JpdGVsKCgxIDw8IDgpIHwgVElGTV9ETUFfVFgsIHNvY2stPmFkZHIgKyBTT0NLX0RNQV9DT05UUk9MKTsKKwllbHNlCisJCXdyaXRlbCgoMSA8PCA4KSwgc29jay0+YWRkciArIFNPQ0tfRE1BX0NPTlRST0wpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGlmbV9tc19pc3N1ZV9jbWQoc3RydWN0IHRpZm1fbXMgKmhvc3QpCit7CisJc3RydWN0IHRpZm1fZGV2ICpzb2NrID0gaG9zdC0+ZGV2OworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJdW5zaWduZWQgaW50IGRhdGFfbGVuID0gMCwgY21kID0gMCwgY21kX21hc2sgPSAwLCBjbnQsIHR2YWwgPSAwOworCisJaG9zdC0+Y21kX2ZsYWdzID0gMDsKKworCWlmIChob3N0LT5yZXEtPmlvX3R5cGUgPT0gTUVNU1RJQ0tfSU9fU0cpIHsKKwkJaWYgKCFob3N0LT5ub19kbWEpIHsKKwkJCWlmICgxICE9IHRpZm1fbWFwX3NnKHNvY2ssICZob3N0LT5yZXEtPnNnLCAxLAorCQkJCQkgICAgIGhvc3QtPnJlcS0+ZGF0YV9kaXIgPT0gUkVBRAorCQkJCQkgICAgID8gUENJX0RNQV9GUk9NREVWSUNFCisJCQkJCSAgICAgOiBQQ0lfRE1BX1RPREVWSUNFKSkgeworCQkJCWhvc3QtPnJlcS0+ZXJyb3IgPSAtRU5PTUVNOworCQkJCXJldHVybiBob3N0LT5yZXEtPmVycm9yOworCQkJfQorCQkJZGF0YV9sZW4gPSBzZ19kbWFfbGVuKCZob3N0LT5yZXEtPnNnKTsKKwkJfSBlbHNlCisJCQlkYXRhX2xlbiA9IGhvc3QtPnJlcS0+c2cubGVuZ3RoOworCisJCXdyaXRlbChUSUZNX0ZJRk9fSU5UX1NFVEFMTCwKKwkJICAgICAgIHNvY2stPmFkZHIgKyBTT0NLX0RNQV9GSUZPX0lOVF9FTkFCTEVfQ0xFQVIpOworCQl3cml0ZWwoVElGTV9GSUZPX0VOQUJMRSwKKwkJICAgICAgIHNvY2stPmFkZHIgKyBTT0NLX0ZJRk9fQ09OVFJPTCk7CisJCXdyaXRlbChUSUZNX0ZJRk9fSU5UTUFTSywKKwkJICAgICAgIHNvY2stPmFkZHIgKyBTT0NLX0RNQV9GSUZPX0lOVF9FTkFCTEVfU0VUKTsKKworCQlpZiAoIWhvc3QtPm5vX2RtYSkgeworCQkJd3JpdGVsKGlsb2cyKGRhdGFfbGVuKSAtIDIsCisJCQkgICAgICAgc29jay0+YWRkciArIFNPQ0tfRklGT19QQUdFX1NJWkUpOworCQkJd3JpdGVsKHNnX2RtYV9hZGRyZXNzKCZob3N0LT5yZXEtPnNnKSwKKwkJCSAgICAgICBzb2NrLT5hZGRyICsgU09DS19ETUFfQUREUkVTUyk7CisJCQlpZiAoaG9zdC0+cmVxLT5kYXRhX2RpciA9PSBXUklURSkKKwkJCQl3cml0ZWwoKDEgPDwgOCkgfCBUSUZNX0RNQV9UWCB8IFRJRk1fRE1BX0VOLAorCQkJCSAgICAgICBzb2NrLT5hZGRyICsgU09DS19ETUFfQ09OVFJPTCk7CisJCQllbHNlCisJCQkJd3JpdGVsKCgxIDw8IDgpIHwgVElGTV9ETUFfRU4sCisJCQkJICAgICAgIHNvY2stPmFkZHIgKyBTT0NLX0RNQV9DT05UUk9MKTsKKwkJfSBlbHNlIHsKKwkJCXRpZm1fbXNfdHJhbnNmZXJfZGF0YShob3N0LAorCQkJCQkgICAgICBob3N0LT5yZXEtPmRhdGFfZGlyID09IFJFQUQpOworCQl9CisKKwkJY21kX21hc2sgPSByZWFkbChzb2NrLT5hZGRyICsgU09DS19NU19TWVNURU0pOworCQljbWRfbWFzayB8PSBUSUZNX01TX1NZU19EQVRBIHwgVElGTV9NU19TWVNfTk9UX1JEWTsKKwkJd3JpdGVsKGNtZF9tYXNrLCBzb2NrLT5hZGRyICsgU09DS19NU19TWVNURU0pOworCX0gZWxzZSBpZiAoaG9zdC0+cmVxLT5pb190eXBlID09IE1FTVNUSUNLX0lPX1ZBTCkgeworCQlkYXRhID0gaG9zdC0+cmVxLT5kYXRhOworCQlkYXRhX2xlbiA9IGhvc3QtPnJlcS0+ZGF0YV9sZW47CisKKwkJY21kX21hc2sgPSBob3N0LT5tb2RlX21hc2sgfCAweDI2MDc7IC8qIHVua25vd24gY29uc3RhbnQgKi8KKworCQlpZiAoaG9zdC0+cmVxLT5kYXRhX2RpciA9PSBXUklURSkgeworCQkJY21kX21hc2sgfD0gVElGTV9NU19TWVNfTEFUQ0g7CisJCQl3cml0ZWwoY21kX21hc2ssIHNvY2stPmFkZHIgKyBTT0NLX01TX1NZU1RFTSk7CisJCQlmb3IgKGNudCA9IDA7IChkYXRhX2xlbiAtIGNudCkgPj0gNDsgY250ICs9IDQpIHsKKwkJCQl3cml0ZWwoVElGTV9NU19TWVNfTEFUQ0gKKwkJCQkgICAgICAgfCByZWFkbChzb2NrLT5hZGRyICsgU09DS19NU19TWVNURU0pLAorCQkJCSAgICAgICBzb2NrLT5hZGRyICsgU09DS19NU19TWVNURU0pOworCQkJCV9fcmF3X3dyaXRlbCgqKHVuc2lnbmVkIGludCAqKShkYXRhICsgY250KSwKKwkJCQkJICAgICBzb2NrLT5hZGRyICsgU09DS19NU19EQVRBKTsKKwkJCQlkZXZfZGJnKCZzb2NrLT5kZXYsICJ3cml0aW5nICV4XG4iLAorCQkJCQkqKGludCAqKShkYXRhICsgY250KSk7CisJCQl9CisJCQlzd2l0Y2ggKGRhdGFfbGVuIC0gY250KSB7CisJCQljYXNlIDM6CisJCQkJdHZhbCB8PSBkYXRhW2NudCArIDJdIDw8IDE2OworCQkJY2FzZSAyOgorCQkJCXR2YWwgfD0gZGF0YVtjbnQgKyAxXSA8PCA4OworCQkJY2FzZSAxOgorCQkJCXR2YWwgfD0gZGF0YVtjbnRdOworCQkJCXdyaXRlbChUSUZNX01TX1NZU19MQVRDSAorCQkJCSAgICAgICB8IHJlYWRsKHNvY2stPmFkZHIgKyBTT0NLX01TX1NZU1RFTSksCisJCQkJICAgICAgIHNvY2stPmFkZHIgKyBTT0NLX01TX1NZU1RFTSk7CisJCQkJd3JpdGVsKHR2YWwsIHNvY2stPmFkZHIgKyBTT0NLX01TX0RBVEEpOworCQkJCWRldl9kYmcoJnNvY2stPmRldiwgIndyaXRpbmcgJXhcbiIsIHR2YWwpOworCQkJfQorCisJCQl3cml0ZWwoVElGTV9NU19TWVNfTEFUQ0gKKwkJCSAgICAgICB8IHJlYWRsKHNvY2stPmFkZHIgKyBTT0NLX01TX1NZU1RFTSksCisJCQkgICAgICAgc29jayArIFNPQ0tfTVNfU1lTVEVNKTsKKwkJCXdyaXRlbCgwLCBzb2NrLT5hZGRyICsgU09DS19NU19EQVRBKTsKKwkJCWRldl9kYmcoJnNvY2stPmRldiwgIndyaXRpbmcgJXhcbiIsIDApOworCisJCX0gZWxzZQorCQkJd3JpdGVsKGNtZF9tYXNrLCBzb2NrLT5hZGRyICsgU09DS19NU19TWVNURU0pOworCisJCWNtZF9tYXNrID0gcmVhZGwoc29jay0+YWRkciArIFNPQ0tfTVNfU1lTVEVNKTsKKwkJY21kX21hc2sgJj0gflRJRk1fTVNfU1lTX0RBVEE7CisJCWNtZF9tYXNrIHw9IFRJRk1fTVNfU1lTX05PVF9SRFk7CisJCWRldl9kYmcoJnNvY2stPmRldiwgIm1hc2sgJXhcbiIsIGNtZF9tYXNrKTsKKwkJd3JpdGVsKGNtZF9tYXNrLCBzb2NrLT5hZGRyICsgU09DS19NU19TWVNURU0pOworCX0gZWxzZQorCQlCVUcoKTsKKworCW1vZF90aW1lcigmaG9zdC0+dGltZXIsIGppZmZpZXMgKyBob3N0LT50aW1lb3V0X2ppZmZpZXMpOworCXdyaXRlbChUSUZNX0NUUkxfTEVEIHwgcmVhZGwoc29jay0+YWRkciArIFNPQ0tfQ09OVFJPTCksCisJICAgICAgIHNvY2stPmFkZHIgKyBTT0NLX0NPTlRST0wpOworCWhvc3QtPnJlcS0+ZXJyb3IgPSAwOworCisJY21kID0gKGhvc3QtPnJlcS0+dHBjICYgMHhmKSA8PCAxMjsKKwljbWQgfD0gZGF0YV9sZW47CisJd3JpdGVsKGNtZCwgc29jay0+YWRkciArIFNPQ0tfTVNfQ09NTUFORCk7CisKKwlkZXZfZGJnKCZzb2NrLT5kZXYsICJleGVjdXRpbmcgVFBDICV4LCAleFxuIiwgY21kLCBjbWRfbWFzayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRpZm1fbXNfY29tcGxldGVfY21kKHN0cnVjdCB0aWZtX21zICpob3N0KQoreworCXN0cnVjdCB0aWZtX2RldiAqc29jayA9IGhvc3QtPmRldjsKKwlzdHJ1Y3QgbWVtc3RpY2tfaG9zdCAqbXNoID0gdGlmbV9nZXRfZHJ2ZGF0YShzb2NrKTsKKwl1bnNpZ25lZCBpbnQgdHZhbCA9IDAsIGRhdGFfbGVuOworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJaW50IHJjOworCisJZGVsX3RpbWVyKCZob3N0LT50aW1lcik7CisJaWYgKGhvc3QtPnJlcS0+aW9fdHlwZSA9PSBNRU1TVElDS19JT19TRykgeworCQlpZiAoIWhvc3QtPm5vX2RtYSkKKwkJCXRpZm1fdW5tYXBfc2coc29jaywgJmhvc3QtPnJlcS0+c2csIDEsCisJCQkJICAgICAgaG9zdC0+cmVxLT5kYXRhX2RpciA9PSBSRUFECisJCQkJICAgICAgPyBQQ0lfRE1BX0ZST01ERVZJQ0UKKwkJCQkgICAgICA6IFBDSV9ETUFfVE9ERVZJQ0UpOworCX0gZWxzZSBpZiAoaG9zdC0+cmVxLT5pb190eXBlID09IE1FTVNUSUNLX0lPX1ZBTCkgeworCQl3cml0ZWwoflRJRk1fTVNfU1lTX0RBVEEgJiByZWFkbChzb2NrLT5hZGRyICsgU09DS19NU19TWVNURU0pLAorCQkgICAgICAgc29jay0+YWRkciArIFNPQ0tfTVNfU1lTVEVNKTsKKworCQlkYXRhID0gaG9zdC0+cmVxLT5kYXRhOworCQlkYXRhX2xlbiA9IGhvc3QtPnJlcS0+ZGF0YV9sZW47CisKKwkJaWYgKGhvc3QtPnJlcS0+ZGF0YV9kaXIgPT0gUkVBRCkgeworCQkJZm9yIChyYyA9IDA7IChkYXRhX2xlbiAtIHJjKSA+PSA0OyByYyArPSA0KQorCQkJCSooaW50ICopKGRhdGEgKyByYykKKwkJCQkJPSBfX3Jhd19yZWFkbChzb2NrLT5hZGRyCisJCQkJCQkgICAgICArIFNPQ0tfTVNfREFUQSk7CisKKwkJCWlmIChkYXRhX2xlbiAtIHJjKQorCQkJCXR2YWwgPSByZWFkbChzb2NrLT5hZGRyICsgU09DS19NU19EQVRBKTsKKwkJCXN3aXRjaCAoZGF0YV9sZW4gLSByYykgeworCQkJY2FzZSAzOgorCQkJCWRhdGFbcmMgKyAyXSA9ICh0dmFsID4+IDE2KSAmIDB4ZmY7CisJCQljYXNlIDI6CisJCQkJZGF0YVtyYyArIDFdID0gKHR2YWwgPj4gOCkgJiAweGZmOworCQkJY2FzZSAxOgorCQkJCWRhdGFbcmNdID0gdHZhbCAmIDB4ZmY7CisJCQl9CisJCQlyZWFkbChzb2NrLT5hZGRyICsgU09DS19NU19EQVRBKTsKKwkJfQorCX0KKworCXdyaXRlbCgoflRJRk1fQ1RSTF9MRUQpICYgcmVhZGwoc29jay0+YWRkciArIFNPQ0tfQ09OVFJPTCksCisJICAgICAgIHNvY2stPmFkZHIgKyBTT0NLX0NPTlRST0wpOworCisJZG8geworCQlyYyA9IG1lbXN0aWNrX25leHRfcmVxKG1zaCwgJmhvc3QtPnJlcSk7CisJfSB3aGlsZSAoIXJjICYmIHRpZm1fbXNfaXNzdWVfY21kKGhvc3QpKTsKK30KKworc3RhdGljIGludCB0aWZtX21zX2NoZWNrX3N0YXR1cyhzdHJ1Y3QgdGlmbV9tcyAqaG9zdCkKK3sKKwlpZiAoIWhvc3QtPnJlcS0+ZXJyb3IpIHsKKwkJaWYgKCEoaG9zdC0+Y21kX2ZsYWdzICYgQ01EX1JFQURZKSkKKwkJCXJldHVybiAxOworCQlpZiAoKGhvc3QtPnJlcS0+aW9fdHlwZSA9PSBNRU1TVElDS19JT19TRykKKwkJICAgICYmICEoaG9zdC0+Y21kX2ZsYWdzICYgRklGT19SRUFEWSkpCisJCQlyZXR1cm4gMTsKKwkJaWYgKGhvc3QtPnJlcS0+bmVlZF9jYXJkX2ludAorCQkgICAgJiYgIShob3N0LT5jbWRfZmxhZ3MgJiBDQVJEX1JFQURZKSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVkIGZyb20gaW50ZXJydXB0IGhhbmRsZXIgKi8KK3N0YXRpYyB2b2lkIHRpZm1fbXNfZGF0YV9ldmVudChzdHJ1Y3QgdGlmbV9kZXYgKnNvY2spCit7CisJc3RydWN0IHRpZm1fbXMgKmhvc3Q7CisJdW5zaWduZWQgaW50IGZpZm9fc3RhdHVzID0gMDsKKwlpbnQgcmMgPSAxOworCisJc3Bpbl9sb2NrKCZzb2NrLT5sb2NrKTsKKwlob3N0ID0gbWVtc3RpY2tfcHJpdigoc3RydWN0IG1lbXN0aWNrX2hvc3QgKil0aWZtX2dldF9kcnZkYXRhKHNvY2spKTsKKwlmaWZvX3N0YXR1cyA9IHJlYWRsKHNvY2stPmFkZHIgKyBTT0NLX0RNQV9GSUZPX1NUQVRVUyk7CisJZGV2X2RiZygmc29jay0+ZGV2LCAiZGF0YSBldmVudDogZmlmb19zdGF0dXMgJXgsIGZsYWdzICV4XG4iLAorCQlmaWZvX3N0YXR1cywgaG9zdC0+Y21kX2ZsYWdzKTsKKworCWlmIChob3N0LT5yZXEpIHsKKwkJaWYgKGZpZm9fc3RhdHVzICYgVElGTV9GSUZPX1JFQURZKSB7CisJCQlpZiAoIWhvc3QtPm5vX2RtYSB8fCB0aWZtX21zX3RyYW5zZmVyX2RhdGEoaG9zdCwgMCkpIHsKKwkJCQlob3N0LT5jbWRfZmxhZ3MgfD0gRklGT19SRUFEWTsKKwkJCQlyYyA9IHRpZm1fbXNfY2hlY2tfc3RhdHVzKGhvc3QpOworCQkJfQorCQl9CisJfQorCisJd3JpdGVsKGZpZm9fc3RhdHVzLCBzb2NrLT5hZGRyICsgU09DS19ETUFfRklGT19TVEFUVVMpOworCWlmICghcmMpCisJCXRpZm1fbXNfY29tcGxldGVfY21kKGhvc3QpOworCisJc3Bpbl91bmxvY2soJnNvY2stPmxvY2spOworfQorCisKKy8qIENhbGxlZCBmcm9tIGludGVycnVwdCBoYW5kbGVyICovCitzdGF0aWMgdm9pZCB0aWZtX21zX2NhcmRfZXZlbnQoc3RydWN0IHRpZm1fZGV2ICpzb2NrKQoreworCXN0cnVjdCB0aWZtX21zICpob3N0OworCXVuc2lnbmVkIGludCBob3N0X3N0YXR1cyA9IDA7CisJaW50IHJjID0gMTsKKworCXNwaW5fbG9jaygmc29jay0+bG9jayk7CisJaG9zdCA9IG1lbXN0aWNrX3ByaXYoKHN0cnVjdCBtZW1zdGlja19ob3N0ICopdGlmbV9nZXRfZHJ2ZGF0YShzb2NrKSk7CisJaG9zdF9zdGF0dXMgPSByZWFkbChzb2NrLT5hZGRyICsgU09DS19NU19TVEFUVVMpOworCWRldl9kYmcoJnNvY2stPmRldiwgImhvc3QgZXZlbnQ6IGhvc3Rfc3RhdHVzICV4LCBmbGFncyAleFxuIiwKKwkJaG9zdF9zdGF0dXMsIGhvc3QtPmNtZF9mbGFncyk7CisKKwlpZiAoaG9zdC0+cmVxKSB7CisJCWlmIChob3N0X3N0YXR1cyAmIFRJRk1fTVNfVElNRU9VVCkKKwkJCWhvc3QtPnJlcS0+ZXJyb3IgPSAtRVRJTUU7CisJCWVsc2UgaWYgKGhvc3Rfc3RhdHVzICYgVElGTV9NU19CQURDUkMpCisJCQlob3N0LT5yZXEtPmVycm9yID0gLUVJTFNFUTsKKworCQlpZiAoaG9zdC0+cmVxLT5lcnJvcikgeworCQkJd3JpdGVsKFRJRk1fRklGT19JTlRfU0VUQUxMLAorCQkJICAgICAgIHNvY2stPmFkZHIgKyBTT0NLX0RNQV9GSUZPX0lOVF9FTkFCTEVfQ0xFQVIpOworCQkJd3JpdGVsKFRJRk1fRE1BX1JFU0VULCBzb2NrLT5hZGRyICsgU09DS19ETUFfQ09OVFJPTCk7CisJCX0KKworCQlpZiAoaG9zdF9zdGF0dXMgJiBUSUZNX01TX0VPVFBDKQorCQkJaG9zdC0+Y21kX2ZsYWdzIHw9IENNRF9SRUFEWTsKKwkJaWYgKGhvc3Rfc3RhdHVzICYgVElGTV9NU19JTlQpCisJCQlob3N0LT5jbWRfZmxhZ3MgfD0gQ0FSRF9SRUFEWTsKKworCQlyYyA9IHRpZm1fbXNfY2hlY2tfc3RhdHVzKGhvc3QpOworCisJfQorCisJd3JpdGVsKFRJRk1fTVNfU1lTX05PVF9SRFkgfCByZWFkbChzb2NrLT5hZGRyICsgU09DS19NU19TWVNURU0pLAorCSAgICAgICBzb2NrLT5hZGRyICsgU09DS19NU19TWVNURU0pOworCXdyaXRlbCgoflRJRk1fTVNfU1lTX0RBVEEpICYgcmVhZGwoc29jay0+YWRkciArIFNPQ0tfTVNfU1lTVEVNKSwKKwkgICAgICAgc29jay0+YWRkciArIFNPQ0tfTVNfU1lTVEVNKTsKKworCWlmICghcmMpCisJCXRpZm1fbXNfY29tcGxldGVfY21kKGhvc3QpOworCisJc3Bpbl91bmxvY2soJnNvY2stPmxvY2spOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgdGlmbV9tc19yZXF1ZXN0KHN0cnVjdCBtZW1zdGlja19ob3N0ICptc2gpCit7CisJc3RydWN0IHRpZm1fbXMgKmhvc3QgPSBtZW1zdGlja19wcml2KG1zaCk7CisJc3RydWN0IHRpZm1fZGV2ICpzb2NrID0gaG9zdC0+ZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNvY2stPmxvY2ssIGZsYWdzKTsKKwlpZiAoaG9zdC0+cmVxKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXMgOiB1bmZpbmlzaGVkIHJlcXVlc3QgZGV0ZWN0ZWRcbiIsCisJCSAgICAgICBzb2NrLT5kZXYuYnVzX2lkKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc29jay0+bG9jaywgZmxhZ3MpOworCQl0aWZtX2VqZWN0KGhvc3QtPmRldik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaG9zdC0+ZWplY3QpIHsKKwkJZG8geworCQkJcmMgPSBtZW1zdGlja19uZXh0X3JlcShtc2gsICZob3N0LT5yZXEpOworCQkJaWYgKCFyYykKKwkJCQlob3N0LT5yZXEtPmVycm9yID0gLUVUSU1FOworCQl9IHdoaWxlICghcmMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzb2NrLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlkbyB7CisJCXJjID0gbWVtc3RpY2tfbmV4dF9yZXEobXNoLCAmaG9zdC0+cmVxKTsKKwl9IHdoaWxlICghcmMgJiYgdGlmbV9tc19pc3N1ZV9jbWQoaG9zdCkpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc29jay0+bG9jaywgZmxhZ3MpOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgdGlmbV9tc19zZXRfcGFyYW0oc3RydWN0IG1lbXN0aWNrX2hvc3QgKm1zaCwKKwkJCSAgICAgIGVudW0gbWVtc3RpY2tfcGFyYW0gcGFyYW0sCisJCQkgICAgICBpbnQgdmFsdWUpCit7CisJc3RydWN0IHRpZm1fbXMgKmhvc3QgPSBtZW1zdGlja19wcml2KG1zaCk7CisJc3RydWN0IHRpZm1fZGV2ICpzb2NrID0gaG9zdC0+ZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc29jay0+bG9jaywgZmxhZ3MpOworCisJc3dpdGNoIChwYXJhbSkgeworCWNhc2UgTUVNU1RJQ0tfUE9XRVI6CisJCS8qIHRoaXMgaXMgc2V0IGJ5IGNhcmQgZGV0ZWN0aW9uIG1lY2hhbmlzbSAqLworCQlicmVhazsKKwljYXNlIE1FTVNUSUNLX0lOVEVSRkFDRToKKwkJaWYgKHZhbHVlID09IE1FTVNUSUNLX1NFUklBTCkgeworCQkJaG9zdC0+bW9kZV9tYXNrID0gVElGTV9NU19TRVJJQUw7CisJCQl3cml0ZWwoKH5USUZNX0NUUkxfRkFTVF9DTEspCisJCQkgICAgICAgJiByZWFkbChzb2NrLT5hZGRyICsgU09DS19DT05UUk9MKSwKKwkJCSAgICAgICBzb2NrLT5hZGRyICsgU09DS19DT05UUk9MKTsKKwkJfSBlbHNlIGlmICh2YWx1ZSA9PSBNRU1TVElDS19QQVJBTExFTCkgeworCQkJaG9zdC0+bW9kZV9tYXNrID0gMDsKKwkJCXdyaXRlbChUSUZNX0NUUkxfRkFTVF9DTEsKKwkJCSAgICAgICB8IHJlYWRsKHNvY2stPmFkZHIgKyBTT0NLX0NPTlRST0wpLAorCQkJICAgICAgIHNvY2stPmFkZHIgKyBTT0NLX0NPTlRST0wpOworCQl9CisJCWJyZWFrOworCX07CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzb2NrLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHRpZm1fbXNfYWJvcnQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCB0aWZtX21zICpob3N0ID0gKHN0cnVjdCB0aWZtX21zICopZGF0YTsKKworCWRldl9kYmcoJmhvc3QtPmRldi0+ZGV2LCAic3RhdHVzICV4XG4iLAorCQlyZWFkbChob3N0LT5kZXYtPmFkZHIgKyBTT0NLX01TX1NUQVRVUykpOworCXByaW50ayhLRVJOX0VSUgorCSAgICAgICAiJXMgOiBjYXJkIGZhaWxlZCB0byByZXNwb25kIGZvciBhIGxvbmcgcGVyaW9kIG9mIHRpbWUgIgorCSAgICAgICAiKCV4LCAleClcbiIsCisJICAgICAgIGhvc3QtPmRldi0+ZGV2LmJ1c19pZCwgaG9zdC0+cmVxID8gaG9zdC0+cmVxLT50cGMgOiAwLAorCSAgICAgICBob3N0LT5jbWRfZmxhZ3MpOworCisJdGlmbV9lamVjdChob3N0LT5kZXYpOworfQorCitzdGF0aWMgaW50IHRpZm1fbXNfaW5pdGlhbGl6ZV9ob3N0KHN0cnVjdCB0aWZtX21zICpob3N0KQoreworCXN0cnVjdCB0aWZtX2RldiAqc29jayA9IGhvc3QtPmRldjsKKwlzdHJ1Y3QgbWVtc3RpY2tfaG9zdCAqbXNoID0gdGlmbV9nZXRfZHJ2ZGF0YShzb2NrKTsKKworCWhvc3QtPm1vZGVfbWFzayA9IFRJRk1fTVNfU0VSSUFMOworCXdyaXRlbCgweDgwMDAsIHNvY2stPmFkZHIgKyBTT0NLX01TX1NZU1RFTSk7CisJd3JpdGVsKDB4MDIwMCB8IFRJRk1fTVNfU1lTX05PVF9SRFksIHNvY2stPmFkZHIgKyBTT0NLX01TX1NZU1RFTSk7CisJd3JpdGVsKDB4ZmZmZmZmZmYsIHNvY2stPmFkZHIgKyBTT0NLX01TX1NUQVRVUyk7CisJaWYgKHRpZm1faGFzX21zX3BpZihzb2NrKSkKKwkJbXNoLT5jYXBzIHw9IE1FTVNUSUNLX0NBUF9QQVJBTExFTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRpZm1fbXNfcHJvYmUoc3RydWN0IHRpZm1fZGV2ICpzb2NrKQoreworCXN0cnVjdCBtZW1zdGlja19ob3N0ICptc2g7CisJc3RydWN0IHRpZm1fbXMgKmhvc3Q7CisJaW50IHJjID0gLUVJTzsKKworCWlmICghKFRJRk1fU09DS19TVEFURV9PQ0NVUElFRAorCSAgICAgICYgcmVhZGwoc29jay0+YWRkciArIFNPQ0tfUFJFU0VOVF9TVEFURSkpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIDogY2FyZCBnb25lLCB1bmV4cGVjdGVkbHlcbiIsCisJCSAgICAgICBzb2NrLT5kZXYuYnVzX2lkKTsKKwkJcmV0dXJuIHJjOworCX0KKworCW1zaCA9IG1lbXN0aWNrX2FsbG9jX2hvc3Qoc2l6ZW9mKHN0cnVjdCB0aWZtX21zKSwgJnNvY2stPmRldik7CisJaWYgKCFtc2gpCisJCXJldHVybiAtRU5PTUVNOworCisJaG9zdCA9IG1lbXN0aWNrX3ByaXYobXNoKTsKKwl0aWZtX3NldF9kcnZkYXRhKHNvY2ssIG1zaCk7CisJaG9zdC0+ZGV2ID0gc29jazsKKwlob3N0LT50aW1lb3V0X2ppZmZpZXMgPSBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCWhvc3QtPm5vX2RtYSA9IG5vX2RtYTsKKworCXNldHVwX3RpbWVyKCZob3N0LT50aW1lciwgdGlmbV9tc19hYm9ydCwgKHVuc2lnbmVkIGxvbmcpaG9zdCk7CisKKwltc2gtPnJlcXVlc3QgPSB0aWZtX21zX3JlcXVlc3Q7CisJbXNoLT5zZXRfcGFyYW0gPSB0aWZtX21zX3NldF9wYXJhbTsKKwlzb2NrLT5jYXJkX2V2ZW50ID0gdGlmbV9tc19jYXJkX2V2ZW50OworCXNvY2stPmRhdGFfZXZlbnQgPSB0aWZtX21zX2RhdGFfZXZlbnQ7CisJcmMgPSB0aWZtX21zX2luaXRpYWxpemVfaG9zdChob3N0KTsKKworCWlmICghcmMpCisJCXJjID0gbWVtc3RpY2tfYWRkX2hvc3QobXNoKTsKKwlpZiAoIXJjKQorCQlyZXR1cm4gMDsKKworCW1lbXN0aWNrX2ZyZWVfaG9zdChtc2gpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgdGlmbV9tc19yZW1vdmUoc3RydWN0IHRpZm1fZGV2ICpzb2NrKQoreworCXN0cnVjdCBtZW1zdGlja19ob3N0ICptc2ggPSB0aWZtX2dldF9kcnZkYXRhKHNvY2spOworCXN0cnVjdCB0aWZtX21zICpob3N0ID0gbWVtc3RpY2tfcHJpdihtc2gpOworCWludCByYyA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzb2NrLT5sb2NrLCBmbGFncyk7CisJaG9zdC0+ZWplY3QgPSAxOworCWlmIChob3N0LT5yZXEpIHsKKwkJZGVsX3RpbWVyKCZob3N0LT50aW1lcik7CisJCXdyaXRlbChUSUZNX0ZJRk9fSU5UX1NFVEFMTCwKKwkJICAgICAgIHNvY2stPmFkZHIgKyBTT0NLX0RNQV9GSUZPX0lOVF9FTkFCTEVfQ0xFQVIpOworCQl3cml0ZWwoVElGTV9ETUFfUkVTRVQsIHNvY2stPmFkZHIgKyBTT0NLX0RNQV9DT05UUk9MKTsKKwkJaWYgKChob3N0LT5yZXEtPmlvX3R5cGUgPT0gTUVNU1RJQ0tfSU9fU0cpICYmICFob3N0LT5ub19kbWEpCisJCQl0aWZtX3VubWFwX3NnKHNvY2ssICZob3N0LT5yZXEtPnNnLCAxLAorCQkJCSAgICAgIGhvc3QtPnJlcS0+ZGF0YV9kaXIgPT0gUkVBRAorCQkJCSAgICAgID8gUENJX0RNQV9UT0RFVklDRQorCQkJCSAgICAgIDogUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJaG9zdC0+cmVxLT5lcnJvciA9IC1FVElNRTsKKworCQlkbyB7CisJCQlyYyA9IG1lbXN0aWNrX25leHRfcmVxKG1zaCwgJmhvc3QtPnJlcSk7CisJCQlpZiAoIXJjKQorCQkJCWhvc3QtPnJlcS0+ZXJyb3IgPSAtRVRJTUU7CisJCX0gd2hpbGUgKCFyYyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNvY2stPmxvY2ssIGZsYWdzKTsKKworCW1lbXN0aWNrX3JlbW92ZV9ob3N0KG1zaCk7CisKKwl3cml0ZWwoMHgwMjAwIHwgVElGTV9NU19TWVNfTk9UX1JEWSwgc29jay0+YWRkciArIFNPQ0tfTVNfU1lTVEVNKTsKKwl3cml0ZWwoMHhmZmZmZmZmZiwgc29jay0+YWRkciArIFNPQ0tfTVNfU1RBVFVTKTsKKworCW1lbXN0aWNrX2ZyZWVfaG9zdChtc2gpOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgdGlmbV9tc19zdXNwZW5kKHN0cnVjdCB0aWZtX2RldiAqc29jaywgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRpZm1fbXNfcmVzdW1lKHN0cnVjdCB0aWZtX2RldiAqc29jaykKK3sKKwlzdHJ1Y3QgbWVtc3RpY2tfaG9zdCAqbXNoID0gdGlmbV9nZXRfZHJ2ZGF0YShzb2NrKTsKKwlzdHJ1Y3QgdGlmbV9tcyAqaG9zdCA9IG1lbXN0aWNrX3ByaXYobXNoKTsKKworCXRpZm1fbXNfaW5pdGlhbGl6ZV9ob3N0KGhvc3QpOworCW1lbXN0aWNrX2RldGVjdF9jaGFuZ2UobXNoKTsKKworCXJldHVybiAwOworfQorCisjZWxzZQorCisjZGVmaW5lIHRpZm1fbXNfc3VzcGVuZCBOVUxMCisjZGVmaW5lIHRpZm1fbXNfcmVzdW1lIE5VTEwKKworI2VuZGlmIC8qIENPTkZJR19QTSAqLworCitzdGF0aWMgc3RydWN0IHRpZm1fZGV2aWNlX2lkIHRpZm1fbXNfaWRfdGJsW10gPSB7CisJeyBUSUZNX1RZUEVfTVMgfSwgeyAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdGlmbV9kcml2ZXIgdGlmbV9tc19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgID0gRFJJVkVSX05BTUUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFCisJfSwKKwkuaWRfdGFibGUgPSB0aWZtX21zX2lkX3RibCwKKwkucHJvYmUgICAgPSB0aWZtX21zX3Byb2JlLAorCS5yZW1vdmUgICA9IHRpZm1fbXNfcmVtb3ZlLAorCS5zdXNwZW5kICA9IHRpZm1fbXNfc3VzcGVuZCwKKwkucmVzdW1lICAgPSB0aWZtX21zX3Jlc3VtZQorfTsKKworc3RhdGljIGludCBfX2luaXQgdGlmbV9tc19pbml0KHZvaWQpCit7CisJcmV0dXJuIHRpZm1fcmVnaXN0ZXJfZHJpdmVyKCZ0aWZtX21zX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0aWZtX21zX2V4aXQodm9pZCkKK3sKKwl0aWZtX3VucmVnaXN0ZXJfZHJpdmVyKCZ0aWZtX21zX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkFsZXggRHVib3YiKTsKK01PRFVMRV9ERVNDUklQVElPTigiVEkgRmxhc2hNZWRpYSBNZW1vcnlTdGljayBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodGlmbSwgdGlmbV9tc19pZF90YmwpOworTU9EVUxFX1ZFUlNJT04oRFJJVkVSX1ZFUlNJT04pOworCittb2R1bGVfaW5pdCh0aWZtX21zX2luaXQpOworbW9kdWxlX2V4aXQodGlmbV9tc19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL0tjb25maWcgYi9kcml2ZXJzL21mZC9LY29uZmlnCmluZGV4IDI1NzE2MTkuLjBjODg2YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL0tjb25maWcKKysrIGIvZHJpdmVycy9tZmQvS2NvbmZpZwpAQCAtMTUsNiArMTUsMTMgQEAKIAkgIGludGVyZmFjZS4gVGhlIGRldmljZSBtYXkgYmUgY29ubmVjdGVkIGJ5IFBDSSBvciBsb2NhbCBidXMgd2l0aAogCSAgdmFyeWluZyBmdW5jdGlvbnMgZW5hYmxlZC4KIAorY29uZmlnIE1GRF9BU0lDMworCWJvb2wgIlN1cHBvcnQgZm9yIENvbXBhcSBBU0lDMyIKKwlkZXBlbmRzIG9uIEdFTkVSSUNfSEFSRElSUVMgJiYgQVJNCisJIC0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBBU0lDMyBtdWx0aWZ1bmN0aW9uIGNoaXAgZm91bmQgb24gbWFueQorCSAgUERBcyAobWFpbmx5IGlQQVEgYW5kIEhUQyBiYXNlZCBvbmVzKQorCiBlbmRtZW51CiAKIG1lbnUgIk11bHRpbWVkaWEgQ2FwYWJpbGl0aWVzIFBvcnQgZHJpdmVycyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL01ha2VmaWxlIGIvZHJpdmVycy9tZmQvTWFrZWZpbGUKaW5kZXggNTE0MzIwOS4uNTIxY2Q1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZmQvTWFrZWZpbGUKQEAgLTMsNiArMyw3IEBACiAjCiAKIG9iai0kKENPTkZJR19NRkRfU001MDEpCQkrPSBzbTUwMS5vCitvYmotJChDT05GSUdfTUZEX0FTSUMzKQkJKz0gYXNpYzMubwogCiBvYmotJChDT05GSUdfTUNQKQkJKz0gbWNwLWNvcmUubwogb2JqLSQoQ09ORklHX01DUF9TQTExWDApCSs9IG1jcC1zYTExeDAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYXNpYzMuYyBiL2RyaXZlcnMvbWZkL2FzaWMzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmYjFmZjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC9hc2ljMy5jCkBAIC0wLDAgKzEsNTg4IEBACisvKgorICogZHJpdmVyL21mZC9hc2ljMy5jCisgKgorICogQ29tcGFxIEFTSUMzIHN1cHBvcnQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMSBDb21wYXEgQ29tcHV0ZXIgQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IFBoaWwgQmx1bmRlbGwKKyAqIENvcHlyaWdodCAyMDA3IE9wZW5lZEhhbmQgTHRkLgorICoKKyAqIEF1dGhvcnM6IFBoaWwgQmx1bmRlbGwgPHBiQGhhbmRoZWxkcy5vcmc+LAorICoJICAgIFNhbXVlbCBPcnRpeiA8c2FtZW9Ab3BlbmVkaGFuZC5jb20+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8bGludXgvbWZkL2FzaWMzLmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhc2ljM193cml0ZV9yZWdpc3RlcihzdHJ1Y3QgYXNpYzMgKmFzaWMsCisJCQkJIHVuc2lnbmVkIGludCByZWcsIHUzMiB2YWx1ZSkKK3sKKwlpb3dyaXRlMTYodmFsdWUsICh1bnNpZ25lZCBsb25nKWFzaWMtPm1hcHBpbmcgKworCQkgIChyZWcgPj4gYXNpYy0+YnVzX3NoaWZ0KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGFzaWMzX3JlYWRfcmVnaXN0ZXIoc3RydWN0IGFzaWMzICphc2ljLAorCQkJICAgICAgIHVuc2lnbmVkIGludCByZWcpCit7CisJcmV0dXJuIGlvcmVhZDE2KCh1bnNpZ25lZCBsb25nKWFzaWMtPm1hcHBpbmcgKworCQkJKHJlZyA+PiBhc2ljLT5idXNfc2hpZnQpKTsKK30KKworLyogSVJRcyAqLworI2RlZmluZSBNQVhfQVNJQ19JU1JfTE9PUFMgICAgMjAKKyNkZWZpbmUgQVNJQzNfR1BJT19CYXNlX0lOQ1IgXAorCShBU0lDM19HUElPX0JfQmFzZSAtIEFTSUMzX0dQSU9fQV9CYXNlKQorCitzdGF0aWMgdm9pZCBhc2ljM19pcnFfZmxpcF9lZGdlKHN0cnVjdCBhc2ljMyAqYXNpYywKKwkJCQl1MzIgYmFzZSwgaW50IGJpdCkKK3sKKwl1MTYgZWRnZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFzaWMtPmxvY2ssIGZsYWdzKTsKKwllZGdlID0gYXNpYzNfcmVhZF9yZWdpc3Rlcihhc2ljLAorCQkJCSAgIGJhc2UgKyBBU0lDM19HUElPX0VkZ2VUcmlnZ2VyKTsKKwllZGdlIF49IGJpdDsKKwlhc2ljM193cml0ZV9yZWdpc3Rlcihhc2ljLAorCQkJICAgICBiYXNlICsgQVNJQzNfR1BJT19FZGdlVHJpZ2dlciwgZWRnZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXNpYy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhc2ljM19pcnFfZGVtdXgodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCWludCBpdGVyLCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGFzaWMzICphc2ljOworCisJZGVzYy0+Y2hpcC0+YWNrKGlycSk7CisKKwlhc2ljID0gZGVzYy0+aGFuZGxlcl9kYXRhOworCisJZm9yIChpdGVyID0gMCA7IGl0ZXIgPCBNQVhfQVNJQ19JU1JfTE9PUFM7IGl0ZXIrKykgeworCQl1MzIgc3RhdHVzOworCQlpbnQgYmFuazsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXNpYy0+bG9jaywgZmxhZ3MpOworCQlzdGF0dXMgPSBhc2ljM19yZWFkX3JlZ2lzdGVyKGFzaWMsCisJCQkJCSAgICAgQVNJQzNfT0ZGU0VUKElOVFIsIFBJbnRTdGF0KSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFzaWMtPmxvY2ssIGZsYWdzKTsKKworCQkvKiBDaGVjayBhbGwgdGVuIHJlZ2lzdGVyIGJpdHMgKi8KKwkJaWYgKChzdGF0dXMgJiAweDNmZikgPT0gMCkKKwkJCWJyZWFrOworCisJCS8qIEhhbmRsZSBHUElPIElSUXMgKi8KKwkJZm9yIChiYW5rID0gMDsgYmFuayA8IEFTSUMzX05VTV9HUElPX0JBTktTOyBiYW5rKyspIHsKKwkJCWlmIChzdGF0dXMgJiAoMSA8PCBiYW5rKSkgeworCQkJCXVuc2lnbmVkIGxvbmcgYmFzZSwgaXN0YXQ7CisKKwkJCQliYXNlID0gQVNJQzNfR1BJT19BX0Jhc2UKKwkJCQkgICAgICAgKyBiYW5rICogQVNJQzNfR1BJT19CYXNlX0lOQ1I7CisKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXNpYy0+bG9jaywgZmxhZ3MpOworCQkJCWlzdGF0ID0gYXNpYzNfcmVhZF9yZWdpc3Rlcihhc2ljLAorCQkJCQkJCSAgICBiYXNlICsKKwkJCQkJCQkgICAgQVNJQzNfR1BJT19JbnRTdGF0dXMpOworCQkJCS8qIENsZWFyaW5nIEludFN0YXR1cyAqLworCQkJCWFzaWMzX3dyaXRlX3JlZ2lzdGVyKGFzaWMsCisJCQkJCQkgICAgIGJhc2UgKworCQkJCQkJICAgICBBU0lDM19HUElPX0ludFN0YXR1cywgMCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXNpYy0+bG9jaywgZmxhZ3MpOworCisJCQkJZm9yIChpID0gMDsgaSA8IEFTSUMzX0dQSU9TX1BFUl9CQU5LOyBpKyspIHsKKwkJCQkJaW50IGJpdCA9ICgxIDw8IGkpOworCQkJCQl1bnNpZ25lZCBpbnQgaXJxbnI7CisKKwkJCQkJaWYgKCEoaXN0YXQgJiBiaXQpKQorCQkJCQkJY29udGludWU7CisKKwkJCQkJaXJxbnIgPSBhc2ljLT5pcnFfYmFzZSArCisJCQkJCQkoQVNJQzNfR1BJT1NfUEVSX0JBTksgKiBiYW5rKQorCQkJCQkJKyBpOworCQkJCQlkZXNjID0gaXJxX2Rlc2MgKyBpcnFucjsKKwkJCQkJZGVzYy0+aGFuZGxlX2lycShpcnFuciwgZGVzYyk7CisJCQkJCWlmIChhc2ljLT5pcnFfYm90aGVkZ2VbYmFua10gJiBiaXQpCisJCQkJCQlhc2ljM19pcnFfZmxpcF9lZGdlKGFzaWMsIGJhc2UsCisJCQkJCQkJCSAgICBiaXQpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qIEhhbmRsZSByZW1haW5pbmcgSVJRcyBpbiB0aGUgc3RhdHVzIHJlZ2lzdGVyICovCisJCWZvciAoaSA9IEFTSUMzX05VTV9HUElPUzsgaSA8IEFTSUMzX05SX0lSUVM7IGkrKykgeworCQkJLyogVGhleSBzdGFydCBhdCBiaXQgNCBhbmQgZ28gdXAgKi8KKwkJCWlmIChzdGF0dXMgJiAoMSA8PCAoaSAtIEFTSUMzX05VTV9HUElPUyArIDQpKSkgeworCQkJCWRlc2MgPSBpcnFfZGVzYyArICArIGk7CisJCQkJZGVzYy0+aGFuZGxlX2lycShhc2ljLT5pcnFfYmFzZSArIGksCisJCQkJCQkgZGVzYyk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoaXRlciA+PSBNQVhfQVNJQ19JU1JfTE9PUFMpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGludGVycnVwdCBwcm9jZXNzaW5nIG92ZXJydW5cbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18pOworfQorCitzdGF0aWMgaW5saW5lIGludCBhc2ljM19pcnFfdG9fYmFuayhzdHJ1Y3QgYXNpYzMgKmFzaWMsIGludCBpcnEpCit7CisJaW50IG47CisKKwluID0gKGlycSAtIGFzaWMtPmlycV9iYXNlKSA+PiA0OworCisJcmV0dXJuIChuICogKEFTSUMzX0dQSU9fQl9CYXNlIC0gQVNJQzNfR1BJT19BX0Jhc2UpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXNpYzNfaXJxX3RvX2luZGV4KHN0cnVjdCBhc2ljMyAqYXNpYywgaW50IGlycSkKK3sKKwlyZXR1cm4gKGlycSAtIGFzaWMtPmlycV9iYXNlKSAmIDB4ZjsKK30KKworc3RhdGljIHZvaWQgYXNpYzNfbWFza19ncGlvX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0cnVjdCBhc2ljMyAqYXNpYyA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJdTMyIHZhbCwgYmFuaywgaW5kZXg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWJhbmsgPSBhc2ljM19pcnFfdG9fYmFuayhhc2ljLCBpcnEpOworCWluZGV4ID0gYXNpYzNfaXJxX3RvX2luZGV4KGFzaWMsIGlycSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXNpYy0+bG9jaywgZmxhZ3MpOworCXZhbCA9IGFzaWMzX3JlYWRfcmVnaXN0ZXIoYXNpYywgYmFuayArIEFTSUMzX0dQSU9fTWFzayk7CisJdmFsIHw9IDEgPDwgaW5kZXg7CisJYXNpYzNfd3JpdGVfcmVnaXN0ZXIoYXNpYywgYmFuayArIEFTSUMzX0dQSU9fTWFzaywgdmFsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhc2ljLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFzaWMzX21hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJc3RydWN0IGFzaWMzICphc2ljID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKKwlpbnQgcmVndmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXNpYy0+bG9jaywgZmxhZ3MpOworCXJlZ3ZhbCA9IGFzaWMzX3JlYWRfcmVnaXN0ZXIoYXNpYywKKwkJCQkgICAgIEFTSUMzX0lOVFJfQmFzZSArCisJCQkJICAgICBBU0lDM19JTlRSX0ludE1hc2spOworCisJcmVndmFsICY9IH4oQVNJQzNfSU5UTUFTS19NQVNLMCA8PAorCQkgICAgKGlycSAtIChhc2ljLT5pcnFfYmFzZSArIEFTSUMzX05VTV9HUElPUykpKTsKKworCWFzaWMzX3dyaXRlX3JlZ2lzdGVyKGFzaWMsCisJCQkgICAgIEFTSUMzX0lOVFJfQmFzZSArCisJCQkgICAgIEFTSUMzX0lOVFJfSW50TWFzaywKKwkJCSAgICAgcmVndmFsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhc2ljLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFzaWMzX3VubWFza19ncGlvX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0cnVjdCBhc2ljMyAqYXNpYyA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisJdTMyIHZhbCwgYmFuaywgaW5kZXg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWJhbmsgPSBhc2ljM19pcnFfdG9fYmFuayhhc2ljLCBpcnEpOworCWluZGV4ID0gYXNpYzNfaXJxX3RvX2luZGV4KGFzaWMsIGlycSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYXNpYy0+bG9jaywgZmxhZ3MpOworCXZhbCA9IGFzaWMzX3JlYWRfcmVnaXN0ZXIoYXNpYywgYmFuayArIEFTSUMzX0dQSU9fTWFzayk7CisJdmFsICY9IH4oMSA8PCBpbmRleCk7CisJYXNpYzNfd3JpdGVfcmVnaXN0ZXIoYXNpYywgYmFuayArIEFTSUMzX0dQSU9fTWFzaywgdmFsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhc2ljLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFzaWMzX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgYXNpYzMgKmFzaWMgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCWludCByZWd2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhc2ljLT5sb2NrLCBmbGFncyk7CisJcmVndmFsID0gYXNpYzNfcmVhZF9yZWdpc3Rlcihhc2ljLAorCQkJCSAgICAgQVNJQzNfSU5UUl9CYXNlICsKKwkJCQkgICAgIEFTSUMzX0lOVFJfSW50TWFzayk7CisKKwlyZWd2YWwgfD0gKEFTSUMzX0lOVE1BU0tfTUFTSzAgPDwKKwkJICAgKGlycSAtIChhc2ljLT5pcnFfYmFzZSArIEFTSUMzX05VTV9HUElPUykpKTsKKworCWFzaWMzX3dyaXRlX3JlZ2lzdGVyKGFzaWMsCisJCQkgICAgIEFTSUMzX0lOVFJfQmFzZSArCisJCQkgICAgIEFTSUMzX0lOVFJfSW50TWFzaywKKwkJCSAgICAgcmVndmFsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhc2ljLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgYXNpYzNfZ3Bpb19pcnFfdHlwZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgYXNpYzMgKmFzaWMgPSBnZXRfaXJxX2NoaXBfZGF0YShpcnEpOworCXUzMiBiYW5rLCBpbmRleDsKKwl1MTYgdHJpZ2dlciwgbGV2ZWwsIGVkZ2UsIGJpdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJYmFuayA9IGFzaWMzX2lycV90b19iYW5rKGFzaWMsIGlycSk7CisJaW5kZXggPSBhc2ljM19pcnFfdG9faW5kZXgoYXNpYywgaXJxKTsKKwliaXQgPSAxPDxpbmRleDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhc2ljLT5sb2NrLCBmbGFncyk7CisJbGV2ZWwgPSBhc2ljM19yZWFkX3JlZ2lzdGVyKGFzaWMsCisJCQkJICAgIGJhbmsgKyBBU0lDM19HUElPX0xldmVsVHJpZ2dlcik7CisJZWRnZSA9IGFzaWMzX3JlYWRfcmVnaXN0ZXIoYXNpYywKKwkJCQkgICBiYW5rICsgQVNJQzNfR1BJT19FZGdlVHJpZ2dlcik7CisJdHJpZ2dlciA9IGFzaWMzX3JlYWRfcmVnaXN0ZXIoYXNpYywKKwkJCQkgICAgICBiYW5rICsgQVNJQzNfR1BJT19UcmlnZ2VyVHlwZSk7CisJYXNpYy0+aXJxX2JvdGhlZGdlWyhpcnEgLSBhc2ljLT5pcnFfYmFzZSkgPj4gNF0gJj0gfmJpdDsKKworCWlmICh0eXBlID09IElSUVRfUklTSU5HKSB7CisJCXRyaWdnZXIgfD0gYml0OworCQllZGdlIHw9IGJpdDsKKwl9IGVsc2UgaWYgKHR5cGUgPT0gSVJRVF9GQUxMSU5HKSB7CisJCXRyaWdnZXIgfD0gYml0OworCQllZGdlICY9IH5iaXQ7CisJfSBlbHNlIGlmICh0eXBlID09IElSUVRfQk9USEVER0UpIHsKKwkJdHJpZ2dlciB8PSBiaXQ7CisJCWlmIChhc2ljM19ncGlvX2dldF92YWx1ZShhc2ljLCBpcnEgLSBhc2ljLT5pcnFfYmFzZSkpCisJCQllZGdlICY9IH5iaXQ7CisJCWVsc2UKKwkJCWVkZ2UgfD0gYml0OworCQlhc2ljLT5pcnFfYm90aGVkZ2VbKGlycSAtIGFzaWMtPmlycV9iYXNlKSA+PiA0XSB8PSBiaXQ7CisJfSBlbHNlIGlmICh0eXBlID09IElSUVRfTE9XKSB7CisJCXRyaWdnZXIgJj0gfmJpdDsKKwkJbGV2ZWwgJj0gfmJpdDsKKwl9IGVsc2UgaWYgKHR5cGUgPT0gSVJRVF9ISUdIKSB7CisJCXRyaWdnZXIgJj0gfmJpdDsKKwkJbGV2ZWwgfD0gYml0OworCX0gZWxzZSB7CisJCS8qCisJCSAqIGlmIHR5cGUgPT0gSVJRVF9OT0VER0UsIHdlIHNob3VsZCBtYXNrIGludGVycnVwdHMsIGJ1dAorCQkgKiBiZSBjYXJlZnVsIHRvIG5vdCB1bm1hc2sgdGhlbSBpZiBtYXNrIHdhcyBhbHNvIGNhbGxlZC4KKwkJICogUHJvYmFibHkgbmVlZCBpbnRlcm5hbCBzdGF0ZSBmb3IgbWFzay4KKwkJICovCisJCXByaW50ayhLRVJOX05PVElDRSAiYXNpYzM6IGlycSB0eXBlIG5vdCBjaGFuZ2VkLlxuIik7CisJfQorCWFzaWMzX3dyaXRlX3JlZ2lzdGVyKGFzaWMsIGJhbmsgKyBBU0lDM19HUElPX0xldmVsVHJpZ2dlciwKKwkJCSAgICAgbGV2ZWwpOworCWFzaWMzX3dyaXRlX3JlZ2lzdGVyKGFzaWMsIGJhbmsgKyBBU0lDM19HUElPX0VkZ2VUcmlnZ2VyLAorCQkJICAgICBlZGdlKTsKKwlhc2ljM193cml0ZV9yZWdpc3Rlcihhc2ljLCBiYW5rICsgQVNJQzNfR1BJT19UcmlnZ2VyVHlwZSwKKwkJCSAgICAgdHJpZ2dlcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXNpYy0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGFzaWMzX2dwaW9faXJxX2NoaXAgPSB7CisJLm5hbWUJCT0gIkFTSUMzLUdQSU8iLAorCS5hY2sJCT0gYXNpYzNfbWFza19ncGlvX2lycSwKKwkubWFzawkJPSBhc2ljM19tYXNrX2dwaW9faXJxLAorCS51bm1hc2sJCT0gYXNpYzNfdW5tYXNrX2dwaW9faXJxLAorCS5zZXRfdHlwZQk9IGFzaWMzX2dwaW9faXJxX3R5cGUsCit9OworCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGFzaWMzX2lycV9jaGlwID0geworCS5uYW1lCQk9ICJBU0lDMyIsCisJLmFjawkJPSBhc2ljM19tYXNrX2lycSwKKwkubWFzawkJPSBhc2ljM19tYXNrX2lycSwKKwkudW5tYXNrCQk9IGFzaWMzX3VubWFza19pcnEsCit9OworCitzdGF0aWMgaW50IGFzaWMzX2lycV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhc2ljMyAqYXNpYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgY2xrc2VsID0gMDsKKwl1bnNpZ25lZCBpbnQgaXJxLCBpcnFfYmFzZTsKKworCWFzaWMtPmlycV9uciA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGFzaWMtPmlycV9uciA8IDApCisJCXJldHVybiBhc2ljLT5pcnFfbnI7CisKKwkvKiB0dXJuIG9uIGNsb2NrIHRvIElSUSBjb250cm9sbGVyICovCisJY2xrc2VsIHw9IENMT0NLX1NFTF9DWDsKKwlhc2ljM193cml0ZV9yZWdpc3Rlcihhc2ljLCBBU0lDM19PRkZTRVQoQ0xPQ0ssIFNFTCksCisJCQkgICAgIGNsa3NlbCk7CisKKwlpcnFfYmFzZSA9IGFzaWMtPmlycV9iYXNlOworCisJZm9yIChpcnEgPSBpcnFfYmFzZTsgaXJxIDwgaXJxX2Jhc2UgKyBBU0lDM19OUl9JUlFTOyBpcnErKykgeworCQlpZiAoaXJxIDwgYXNpYy0+aXJxX2Jhc2UgKyBBU0lDM19OVU1fR1BJT1MpCisJCQlzZXRfaXJxX2NoaXAoaXJxLCAmYXNpYzNfZ3Bpb19pcnFfY2hpcCk7CisJCWVsc2UKKwkJCXNldF9pcnFfY2hpcChpcnEsICZhc2ljM19pcnFfY2hpcCk7CisKKwkJc2V0X2lycV9jaGlwX2RhdGEoaXJxLCBhc2ljKTsKKwkJc2V0X2lycV9oYW5kbGVyKGlycSwgaGFuZGxlX2xldmVsX2lycSk7CisJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEIHwgSVJRRl9QUk9CRSk7CisJfQorCisJYXNpYzNfd3JpdGVfcmVnaXN0ZXIoYXNpYywgQVNJQzNfT0ZGU0VUKElOVFIsIEludE1hc2spLAorCQkJICAgICBBU0lDM19JTlRNQVNLX0dJTlRNQVNLKTsKKworCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKGFzaWMtPmlycV9uciwgYXNpYzNfaXJxX2RlbXV4KTsKKwlzZXRfaXJxX3R5cGUoYXNpYy0+aXJxX25yLCBJUlFUX1JJU0lORyk7CisJc2V0X2lycV9kYXRhKGFzaWMtPmlycV9uciwgYXNpYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXNpYzNfaXJxX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhc2ljMyAqYXNpYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGludCBpcnEsIGlycV9iYXNlOworCisJaXJxX2Jhc2UgPSBhc2ljLT5pcnFfYmFzZTsKKworCWZvciAoaXJxID0gaXJxX2Jhc2U7IGlycSA8IGlycV9iYXNlICsgQVNJQzNfTlJfSVJRUzsgaXJxKyspIHsKKwkJc2V0X2lycV9mbGFncyhpcnEsIDApOworCQlzZXRfaXJxX2hhbmRsZXIoaXJxLCBOVUxMKTsKKwkJc2V0X2lycV9jaGlwKGlycSwgTlVMTCk7CisJCXNldF9pcnFfY2hpcF9kYXRhKGlycSwgTlVMTCk7CisJfQorCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKGFzaWMtPmlycV9uciwgTlVMTCk7Cit9CisKKy8qIEdQSU9zICovCitzdGF0aWMgaW5saW5lIHUzMiBhc2ljM19nZXRfZ3BpbyhzdHJ1Y3QgYXNpYzMgKmFzaWMsIHVuc2lnbmVkIGludCBiYXNlLAorCQkJCSB1bnNpZ25lZCBpbnQgZnVuY3Rpb24pCit7CisJcmV0dXJuIGFzaWMzX3JlYWRfcmVnaXN0ZXIoYXNpYywgYmFzZSArIGZ1bmN0aW9uKTsKK30KKworc3RhdGljIHZvaWQgYXNpYzNfc2V0X2dwaW8oc3RydWN0IGFzaWMzICphc2ljLCB1bnNpZ25lZCBpbnQgYmFzZSwKKwkJCSAgIHVuc2lnbmVkIGludCBmdW5jdGlvbiwgdTMyIGJpdHMsIHUzMiB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhc2ljLT5sb2NrLCBmbGFncyk7CisJdmFsIHw9IChhc2ljM19yZWFkX3JlZ2lzdGVyKGFzaWMsIGJhc2UgKyBmdW5jdGlvbikgJiB+Yml0cyk7CisKKwlhc2ljM193cml0ZV9yZWdpc3Rlcihhc2ljLCBiYXNlICsgZnVuY3Rpb24sIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXNpYy0+bG9jaywgZmxhZ3MpOworfQorCisjZGVmaW5lIGFzaWMzX2dldF9ncGlvX2EoYXNpYywgZm4pIFwKKwlhc2ljM19nZXRfZ3Bpbyhhc2ljLCBBU0lDM19HUElPX0FfQmFzZSwgQVNJQzNfR1BJT18jI2ZuKQorI2RlZmluZSBhc2ljM19nZXRfZ3Bpb19iKGFzaWMsIGZuKSBcCisJYXNpYzNfZ2V0X2dwaW8oYXNpYywgQVNJQzNfR1BJT19CX0Jhc2UsIEFTSUMzX0dQSU9fIyNmbikKKyNkZWZpbmUgYXNpYzNfZ2V0X2dwaW9fYyhhc2ljLCBmbikgXAorCWFzaWMzX2dldF9ncGlvKGFzaWMsIEFTSUMzX0dQSU9fQ19CYXNlLCBBU0lDM19HUElPXyMjZm4pCisjZGVmaW5lIGFzaWMzX2dldF9ncGlvX2QoYXNpYywgZm4pIFwKKwlhc2ljM19nZXRfZ3Bpbyhhc2ljLCBBU0lDM19HUElPX0RfQmFzZSwgQVNJQzNfR1BJT18jI2ZuKQorCisjZGVmaW5lIGFzaWMzX3NldF9ncGlvX2EoYXNpYywgZm4sIGJpdHMsIHZhbCkgXAorCWFzaWMzX3NldF9ncGlvKGFzaWMsIEFTSUMzX0dQSU9fQV9CYXNlLCBBU0lDM19HUElPXyMjZm4sIGJpdHMsIHZhbCkKKyNkZWZpbmUgYXNpYzNfc2V0X2dwaW9fYihhc2ljLCBmbiwgYml0cywgdmFsKSBcCisJYXNpYzNfc2V0X2dwaW8oYXNpYywgQVNJQzNfR1BJT19CX0Jhc2UsIEFTSUMzX0dQSU9fIyNmbiwgYml0cywgdmFsKQorI2RlZmluZSBhc2ljM19zZXRfZ3Bpb19jKGFzaWMsIGZuLCBiaXRzLCB2YWwpIFwKKwlhc2ljM19zZXRfZ3Bpbyhhc2ljLCBBU0lDM19HUElPX0NfQmFzZSwgQVNJQzNfR1BJT18jI2ZuLCBiaXRzLCB2YWwpCisjZGVmaW5lIGFzaWMzX3NldF9ncGlvX2QoYXNpYywgZm4sIGJpdHMsIHZhbCkgXAorCWFzaWMzX3NldF9ncGlvKGFzaWMsIEFTSUMzX0dQSU9fRF9CYXNlLCBBU0lDM19HUElPXyMjZm4sIGJpdHMsIHZhbCkKKworI2RlZmluZSBhc2ljM19zZXRfZ3Bpb19iYW5rcyhhc2ljLCBmbiwgYml0cywgcGRhdGEsIGZpZWxkKSAJCSAgXAorCWRvIHsJCQkJCQkJCSAgXAorCSAgICAgYXNpYzNfc2V0X2dwaW9fYSgoYXNpYyksIGZuLCAoYml0cyksIChwZGF0YSktPmdwaW9fYS5maWVsZCk7IFwKKwkgICAgIGFzaWMzX3NldF9ncGlvX2IoKGFzaWMpLCBmbiwgKGJpdHMpLCAocGRhdGEpLT5ncGlvX2IuZmllbGQpOyBcCisJICAgICBhc2ljM19zZXRfZ3Bpb19jKChhc2ljKSwgZm4sIChiaXRzKSwgKHBkYXRhKS0+Z3Bpb19jLmZpZWxkKTsgXAorCSAgICAgYXNpYzNfc2V0X2dwaW9fZCgoYXNpYyksIGZuLCAoYml0cyksIChwZGF0YSktPmdwaW9fZC5maWVsZCk7IFwKKwl9IHdoaWxlICgwKQorCitpbnQgYXNpYzNfZ3Bpb19nZXRfdmFsdWUoc3RydWN0IGFzaWMzICphc2ljLCB1bnNpZ25lZCBncGlvKQoreworCXUzMiBtYXNrID0gQVNJQzNfR1BJT19iaXQoZ3Bpbyk7CisKKwlzd2l0Y2ggKGdwaW8gPj4gNCkgeworCWNhc2UgQVNJQzNfR1BJT19CQU5LX0E6CisJCXJldHVybiBhc2ljM19nZXRfZ3Bpb19hKGFzaWMsIFN0YXR1cykgJiBtYXNrOworCWNhc2UgQVNJQzNfR1BJT19CQU5LX0I6CisJCXJldHVybiBhc2ljM19nZXRfZ3Bpb19iKGFzaWMsIFN0YXR1cykgJiBtYXNrOworCWNhc2UgQVNJQzNfR1BJT19CQU5LX0M6CisJCXJldHVybiBhc2ljM19nZXRfZ3Bpb19jKGFzaWMsIFN0YXR1cykgJiBtYXNrOworCWNhc2UgQVNJQzNfR1BJT19CQU5LX0Q6CisJCXJldHVybiBhc2ljM19nZXRfZ3Bpb19kKGFzaWMsIFN0YXR1cykgJiBtYXNrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGludmFsaWQgR1BJTyB2YWx1ZSAweCV4IiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgZ3Bpbyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KK0VYUE9SVF9TWU1CT0woYXNpYzNfZ3Bpb19nZXRfdmFsdWUpOworCit2b2lkIGFzaWMzX2dwaW9fc2V0X3ZhbHVlKHN0cnVjdCBhc2ljMyAqYXNpYywgdW5zaWduZWQgZ3BpbywgaW50IHZhbCkKK3sKKwl1MzIgbWFzayA9IEFTSUMzX0dQSU9fYml0KGdwaW8pOworCXUzMiBiaXR2YWwgPSAwOworCWlmICh2YWwpCisJCWJpdHZhbCA9IG1hc2s7CisKKwlzd2l0Y2ggKGdwaW8gPj4gNCkgeworCWNhc2UgQVNJQzNfR1BJT19CQU5LX0E6CisJCWFzaWMzX3NldF9ncGlvX2EoYXNpYywgT3V0LCBtYXNrLCBiaXR2YWwpOworCQlyZXR1cm47CisJY2FzZSBBU0lDM19HUElPX0JBTktfQjoKKwkJYXNpYzNfc2V0X2dwaW9fYihhc2ljLCBPdXQsIG1hc2ssIGJpdHZhbCk7CisJCXJldHVybjsKKwljYXNlIEFTSUMzX0dQSU9fQkFOS19DOgorCQlhc2ljM19zZXRfZ3Bpb19jKGFzaWMsIE91dCwgbWFzaywgYml0dmFsKTsKKwkJcmV0dXJuOworCWNhc2UgQVNJQzNfR1BJT19CQU5LX0Q6CisJCWFzaWMzX3NldF9ncGlvX2QoYXNpYywgT3V0LCBtYXNrLCBiaXR2YWwpOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaW52YWxpZCBHUElPIHZhbHVlIDB4JXgiLAorCQkgICAgICAgX19GVU5DVElPTl9fLCBncGlvKTsKKwkJcmV0dXJuOworCX0KK30KK0VYUE9SVF9TWU1CT0woYXNpYzNfZ3Bpb19zZXRfdmFsdWUpOworCitzdGF0aWMgaW50IGFzaWMzX2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYXNpYzNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgYXNpYzMgKmFzaWMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWFzaWMzX3dyaXRlX3JlZ2lzdGVyKGFzaWMsIEFTSUMzX0dQSU9fT0ZGU0VUKEEsIE1hc2spLCAweGZmZmYpOworCWFzaWMzX3dyaXRlX3JlZ2lzdGVyKGFzaWMsIEFTSUMzX0dQSU9fT0ZGU0VUKEIsIE1hc2spLCAweGZmZmYpOworCWFzaWMzX3dyaXRlX3JlZ2lzdGVyKGFzaWMsIEFTSUMzX0dQSU9fT0ZGU0VUKEMsIE1hc2spLCAweGZmZmYpOworCWFzaWMzX3dyaXRlX3JlZ2lzdGVyKGFzaWMsIEFTSUMzX0dQSU9fT0ZGU0VUKEQsIE1hc2spLCAweGZmZmYpOworCisJYXNpYzNfc2V0X2dwaW9fYShhc2ljLCBTbGVlcE1hc2ssIDB4ZmZmZiwgMHhmZmZmKTsKKwlhc2ljM19zZXRfZ3Bpb19iKGFzaWMsIFNsZWVwTWFzaywgMHhmZmZmLCAweGZmZmYpOworCWFzaWMzX3NldF9ncGlvX2MoYXNpYywgU2xlZXBNYXNrLCAweGZmZmYsIDB4ZmZmZik7CisJYXNpYzNfc2V0X2dwaW9fZChhc2ljLCBTbGVlcE1hc2ssIDB4ZmZmZiwgMHhmZmZmKTsKKworCWlmIChwZGF0YSkgeworCQlhc2ljM19zZXRfZ3Bpb19iYW5rcyhhc2ljLCBPdXQsIDB4ZmZmZiwgcGRhdGEsIGluaXQpOworCQlhc2ljM19zZXRfZ3Bpb19iYW5rcyhhc2ljLCBEaXJlY3Rpb24sIDB4ZmZmZiwgcGRhdGEsIGRpcik7CisJCWFzaWMzX3NldF9ncGlvX2JhbmtzKGFzaWMsIFNsZWVwTWFzaywgMHhmZmZmLCBwZGF0YSwKKwkJCQkgICAgIHNsZWVwX21hc2spOworCQlhc2ljM19zZXRfZ3Bpb19iYW5rcyhhc2ljLCBTbGVlcE91dCwgMHhmZmZmLCBwZGF0YSwgc2xlZXBfb3V0KTsKKwkJYXNpYzNfc2V0X2dwaW9fYmFua3MoYXNpYywgQmF0dEZhdWx0T3V0LCAweGZmZmYsIHBkYXRhLAorCQkJCSAgICAgYmF0dF9mYXVsdF9vdXQpOworCQlhc2ljM19zZXRfZ3Bpb19iYW5rcyhhc2ljLCBTbGVlcENvbmYsIDB4ZmZmZiwgcGRhdGEsCisJCQkJICAgICBzbGVlcF9jb25mKTsKKwkJYXNpYzNfc2V0X2dwaW9fYmFua3MoYXNpYywgQWx0RnVuY3Rpb24sIDB4ZmZmZiwgcGRhdGEsCisJCQkJICAgICBhbHRfZnVuY3Rpb24pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhc2ljM19ncGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybjsKK30KKworCisvKiBDb3JlICovCitzdGF0aWMgaW50IGFzaWMzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFzaWMzX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGFzaWMzICphc2ljOworCXN0cnVjdCByZXNvdXJjZSAqbWVtOworCXVuc2lnbmVkIGxvbmcgY2xrc2VsOworCWludCByZXQ7CisKKwlhc2ljID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFzaWMzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhc2ljKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pbml0KCZhc2ljLT5sb2NrKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBhc2ljKTsKKwlhc2ljLT5kZXYgPSAmcGRldi0+ZGV2OworCisJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIW1lbSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlwcmludGsoS0VSTl9FUlIgImFzaWMzOiBubyBNRU0gcmVzb3VyY2VcbiIpOworCQlnb3RvIGVycl9vdXRfMTsKKwl9CisKKwlhc2ljLT5tYXBwaW5nID0gaW9yZW1hcChtZW0tPnN0YXJ0LCBQQUdFX1NJWkUpOworCWlmICghYXNpYy0+bWFwcGluZykgeworCQlyZXQgPSAtRU5PTUVNOworCQlwcmludGsoS0VSTl9FUlIgImFzaWMzOiBjb3VsZG4ndCBpb3JlbWFwXG4iKTsKKwkJZ290byBlcnJfb3V0XzE7CisJfQorCisJYXNpYy0+aXJxX2Jhc2UgPSBwZGF0YS0+aXJxX2Jhc2U7CisKKwlpZiAocGRhdGEgJiYgcGRhdGEtPmJ1c19zaGlmdCkKKwkJYXNpYy0+YnVzX3NoaWZ0ID0gMiAtIHBkYXRhLT5idXNfc2hpZnQ7CisJZWxzZQorCQlhc2ljLT5idXNfc2hpZnQgPSAwOworCisJY2xrc2VsID0gMDsKKwlhc2ljM193cml0ZV9yZWdpc3Rlcihhc2ljLCBBU0lDM19PRkZTRVQoQ0xPQ0ssIFNFTCksIGNsa3NlbCk7CisKKwlyZXQgPSBhc2ljM19pcnFfcHJvYmUocGRldik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhc2ljMzogY291bGRuJ3QgcHJvYmUgSVJRc1xuIik7CisJCWdvdG8gZXJyX291dF8yOworCX0KKwlhc2ljM19ncGlvX3Byb2JlKHBkZXYpOworCisJaWYgKHBkYXRhLT5jaGlsZHJlbikgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5uX2NoaWxkcmVuOyBpKyspIHsKKwkJCXBkYXRhLT5jaGlsZHJlbltpXS0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJCQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIocGRhdGEtPmNoaWxkcmVuW2ldKTsKKwkJfQorCX0KKworCXByaW50ayhLRVJOX0lORk8gIkFTSUMzIENvcmUgZHJpdmVyXG4iKTsKKworCXJldHVybiAwOworCisgZXJyX291dF8yOgorCWlvdW5tYXAoYXNpYy0+bWFwcGluZyk7CisgZXJyX291dF8xOgorCWtmcmVlKGFzaWMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhc2ljM19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYXNpYzMgKmFzaWMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWFzaWMzX2dwaW9fcmVtb3ZlKHBkZXYpOworCWFzaWMzX2lycV9yZW1vdmUocGRldik7CisKKwlhc2ljM193cml0ZV9yZWdpc3Rlcihhc2ljLCBBU0lDM19PRkZTRVQoQ0xPQ0ssIFNFTCksIDApOworCisJaW91bm1hcChhc2ljLT5tYXBwaW5nKTsKKworCWtmcmVlKGFzaWMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFzaWMzX3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFzaWMzX2RldmljZV9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImFzaWMzIiwKKwl9LAorCS5wcm9iZQkJPSBhc2ljM19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFzaWMzX3JlbW92ZSksCisJLnNodXRkb3duCT0gYXNpYzNfc2h1dGRvd24sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhc2ljM19pbml0KHZvaWQpCit7CisJaW50IHJldHZhbCA9IDA7CisJcmV0dmFsID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhc2ljM19kZXZpY2VfZHJpdmVyKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdWJzeXNfaW5pdGNhbGwoYXNpYzNfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCmluZGV4IGI1ZTY3YzAuLmMxNDNhODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCkBAIC0xMyw2ICsxMywxNSBAQAogCiBpZiBNSVNDX0RFVklDRVMKIAorY29uZmlnIEFUTUVMX1BXTQorCXRyaXN0YXRlICJBdG1lbCBBVDMyL0FUOTEgUFdNIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBVlIzMiB8fCBBUkNIX0FUOTEKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGRldmljZSBkcml2ZXIgc3VwcG9ydCBmb3IgdGhlIFBXTSBjaGFubmVscworCSAgb24gY2VydGFpbiBBdG1lbCBwcmNvZXNzb3JzLiAgUHVsc2UgV2lkdGggTW9kdWxhdGlvbiBpcyB1c2VkIGZvcgorCSAgcHVycG9zZXMgaW5jbHVkaW5nIHNvZnR3YXJlIGNvbnRyb2xsZWQgcG93ZXItZWZmaWNlbnQgYmFja2xpZ2h0cworCSAgb24gTENEIGRpc3BsYXlzLCBtb3RvciBjb250cm9sLCBhbmQgd2F2ZWZvcm0gZ2VuZXJhdGlvbi4KKwogY29uZmlnIElCTV9BU00KIAl0cmlzdGF0ZSAiRGV2aWNlIGRyaXZlciBmb3IgSUJNIFJTQSBzZXJ2aWNlIHByb2Nlc3NvciIKIAlkZXBlbmRzIG9uIFg4NiAmJiBQQ0kgJiYgSU5QVVQgJiYgRVhQRVJJTUVOVEFMCkBAIC05Miw2ICsxMDEsMjIgQEAKICAgICAgICAgICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKIAkgIGJlIGNhbGxlZCB0aWZtXzd4eDEuCiAKK2NvbmZpZyBBQ0VSX1dNSQorICAgICAgICB0cmlzdGF0ZSAiQWNlciBXTUkgTGFwdG9wIEV4dHJhcyAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFg4NgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBBQ1BJCisJZGVwZW5kcyBvbiBMRURTX0NMQVNTCisJZGVwZW5kcyBvbiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCisJc2VsZWN0IEFDUElfV01JCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgbmV3ZXIgQWNlciAoYW5kIFdpc3Ryb24pIGxhcHRvcHMuIEl0IGFkZHMKKwkgIHdpcmVsZXNzIHJhZGlvIGFuZCBibHVldG9vdGggY29udHJvbCwgYW5kIG9uIHNvbWUgbGFwdG9wcywKKwkgIGV4cG9zZXMgdGhlIG1haWwgTEVEIGFuZCBMQ0QgYmFja2xpZ2h0LgorCisJICBJZiB5b3UgaGF2ZSBhbiBBQ1BJLVdNSSBjb21wYXRpYmxlIEFjZXIvIFdpc3Ryb24gbGFwdG9wLCBzYXkgWSBvciBNCisJICBoZXJlLgorCiBjb25maWcgQVNVU19MQVBUT1AKICAgICAgICAgdHJpc3RhdGUgIkFzdXMgTGFwdG9wIEV4dHJhcyAoRVhQRVJJTUVOVEFMKSIKICAgICAgICAgZGVwZW5kcyBvbiBYODYKQEAgLTEyNiw2ICsxNTEsMTUgQEAKIAogCSAgSWYgeW91IGhhdmUgYSBGdWppdHN1IGxhcHRvcCwgc2F5IFkgb3IgTSBoZXJlLgogCitjb25maWcgVEMxMTAwX1dNSQorCXRyaXN0YXRlICJIUCBDb21wYXEgVEMxMTAwIFRhYmxldCBXTUkgRXh0cmFzIgorCWRlcGVuZHMgb24gWDg2ICYmICFYODZfNjQKKwlkZXBlbmRzIG9uIEFDUEkKKwlzZWxlY3QgQUNQSV9XTUkKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgV01JIGV4dGVuc2lvbnMgKHdpcmVsZXNzIGFuZCBibHVldG9vdGggcG93ZXIKKwkgIGNvbnRyb2wpIG9mIHRoZSBIUCBDb21wYXEgVEMxMTAwIHRhYmxldC4KKwogY29uZmlnIE1TSV9MQVBUT1AKICAgICAgICAgdHJpc3RhdGUgIk1TSSBMYXB0b3AgRXh0cmFzIgogICAgICAgICBkZXBlbmRzIG9uIFg4NgpAQCAtMjE5LDYgKzI1MywyNSBAQAogCiAJICBJZiB5b3UgYXJlIG5vdCBzdXJlLCBzYXkgWSBoZXJlLgogCitjb25maWcgVEhJTktQQURfQUNQSV9IT1RLRVlfUE9MTAorCWJvb2wgIlN1cG9ydCBOVlJBTSBwb2xsaW5nIGZvciBob3Qga2V5cyIKKwlkZXBlbmRzIG9uIFRISU5LUEFEX0FDUEkKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBTb21lIHRoaW5rcGFkIG1vZGVscyBiZW5lZml0IGZyb20gTlZSQU0gcG9sbGluZyB0byBkZXRlY3QgYSBmZXcgb2YKKwkgIHRoZSBob3Qga2V5IHByZXNzIGV2ZW50cy4gIElmIHlvdSBrbm93IHlvdXIgVGhpbmtQYWQgbW9kZWwgZG9lcyBub3QKKwkgIG5lZWQgdG8gZG8gTlZSQU0gcG9sbGluZyB0byBzdXBwb3J0IGFueSBvZiB0aGUgaG90IGtleXMgeW91IHVzZSwKKwkgIHVuc2VsZWN0aW5nIHRoaXMgb3B0aW9uIHdpbGwgc2F2ZSBhYm91dCAxa0Igb2YgbWVtb3J5LgorCisJICBUaGlua1BhZHMgVDQwIGFuZCBuZXdlciwgUjUyIGFuZCBuZXdlciwgYW5kIFgzMSBhbmQgbmV3ZXIgYXJlCisJICB1bmxpa2VseSB0byBuZWVkIE5WUkFNIHBvbGxpbmcgaW4gdGhlaXIgbGF0ZXN0IEJJT1MgdmVyc2lvbnMuCisKKwkgIE5WUkFNIHBvbGxpbmcgY2FuIGRldGVjdCBhdCBtb3N0IHRoZSBmb2xsb3dpbmcga2V5czogVGhpbmtQYWQvQWNjZXNzCisJICBJQk0sIFpvb20sIFN3aXRjaCBEaXNwbGF5IChmbitGNyksIFRoaW5rTGlnaHQsIFZvbHVtZSB1cC9kb3duL211dGUsCisJICBCcmlnaHRuZXNzIHVwL2Rvd24sIERpc3BsYXkgRXhwYW5kIChmbitGOCksIEhpYmVybmF0ZSAoZm4rRjEyKS4KKworCSAgSWYgeW91IGFyZSBub3Qgc3VyZSwgc2F5IFkgaGVyZS4gIFRoZSBkcml2ZXIgZW5hYmxlcyBwb2xsaW5nIG9ubHkgaWYKKwkgIGl0IGlzIHN0cmljdGx5IG5lY2Vzc2FyeSB0byBkbyBzby4KIAogY29uZmlnIEFUTUVMX1NTQwogCXRyaXN0YXRlICJEZXZpY2UgZHJpdmVyIGZvciBBdG1lbCBTU0MgcGVyaXBoZXJhbCIKQEAgLTIzMiw0ICsyODUsMjMgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIElOVEVMX01FTkxPVworCXRyaXN0YXRlICJUaGVybWFsIE1hbmFnZW1lbnQgZHJpdmVyIGZvciBJbnRlbCBtZW5sb3cgcGxhdGZvcm0iCisJZGVwZW5kcyBvbiBBQ1BJX1RIRVJNQUwKKwlkZXBlbmRzIG9uIFg4NgorCS0tLWhlbHAtLS0KKwkgIEFDUEkgdGhlcm1hbCBtYW5hZ2VtZW50IGVuaGFuY2VtZW50IGRyaXZlciBvbgorCSAgSW50ZWwgTWVubG93IHBsYXRmb3JtLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgRU5DTE9TVVJFX1NFUlZJQ0VTCisJdHJpc3RhdGUgIkVuY2xvc3VyZSBTZXJ2aWNlcyIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBQcm92aWRlcyBzdXBwb3J0IGZvciBpbnRlbGxpZ2VudCBlbmNsb3N1cmVzIChiYXlzIHdoaWNoCisJICBjb250YWluIHN0b3JhZ2UgZGV2aWNlcykuICBZb3UgYWxzbyBuZWVkIGVpdGhlciBhIGhvc3QKKwkgIGRyaXZlciAoU0NTSS9BVEEpIHdoaWNoIHN1cHBvcnRzIGVuY2xvc3VyZXMKKwkgIG9yIGEgU0NTSSBlbmNsb3N1cmUgZGV2aWNlIChTRVMpIHRvIHVzZSB0aGVzZSBzZXJ2aWNlcy4KKwogZW5kaWYgIyBNSVNDX0RFVklDRVMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9NYWtlZmlsZSBiL2RyaXZlcnMvbWlzYy9NYWtlZmlsZQppbmRleCA4N2YyNjg1Li4zYjEyZjVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9taXNjL01ha2VmaWxlCkBAIC02LDggKzYsMTEgQEAKIG9iai0kKENPTkZJR19JQk1fQVNNKQkJKz0gaWJtYXNtLwogb2JqLSQoQ09ORklHX0hEUFVfRkVBVFVSRVMpCSs9IGhkcHVmdHJzLwogb2JqLSQoQ09ORklHX01TSV9MQVBUT1ApICAgICArPSBtc2ktbGFwdG9wLm8KK29iai0kKENPTkZJR19BQ0VSX1dNSSkgICAgICs9IGFjZXItd21pLm8KIG9iai0kKENPTkZJR19BU1VTX0xBUFRPUCkgICAgICs9IGFzdXMtbGFwdG9wLm8KK29iai0kKENPTkZJR19BVE1FTF9QV00pCQkrPSBhdG1lbF9wd20ubwogb2JqLSQoQ09ORklHX0FUTUVMX1NTQykJCSs9IGF0bWVsLXNzYy5vCitvYmotJChDT05GSUdfVEMxMTAwX1dNSSkJKz0gdGMxMTAwLXdtaS5vCiBvYmotJChDT05GSUdfTEtEVE0pCQkrPSBsa2R0bS5vCiBvYmotJChDT05GSUdfVElGTV9DT1JFKSAgICAgICAJKz0gdGlmbV9jb3JlLm8KIG9iai0kKENPTkZJR19USUZNXzdYWDEpICAgICAgIAkrPSB0aWZtXzd4eDEubwpAQCAtMTcsMyArMjAsNSBAQAogb2JqLSQoQ09ORklHX1RISU5LUEFEX0FDUEkpCSs9IHRoaW5rcGFkX2FjcGkubwogb2JqLSQoQ09ORklHX0ZVSklUU1VfTEFQVE9QKQkrPSBmdWppdHN1LWxhcHRvcC5vCiBvYmotJChDT05GSUdfRUVQUk9NXzkzQ1g2KQkrPSBlZXByb21fOTNjeDYubworb2JqLSQoQ09ORklHX0lOVEVMX01FTkxPVykJKz0gaW50ZWxfbWVubG93Lm8KK29iai0kKENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMpICs9IGVuY2xvc3VyZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvYWNlci13bWkuYyBiL2RyaXZlcnMvbWlzYy9hY2VyLXdtaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZDY3NzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvYWNlci13bWkuYwpAQCAtMCwwICsxLDExMDkgQEAKKy8qCisgKiAgQWNlciBXTUkgTGFwdG9wIEV4dHJhcworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOAlDYXJsb3MgQ29yYmFjaG8gPGNhcmxvc0BzdHJhbmdld29ybGRzLmNvLnVrPgorICoKKyAqICBCYXNlZCBvbiBhY2VyX2FjcGk6CisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNwlFLk0uIFNtaXRoCisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOAlDYXJsb3MgQ29yYmFjaG8gPGNhdGhlY3RpY0BnbWFpbC5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2RlZmluZSBBQ0VSX1dNSV9WRVJTSU9OCSIwLjEiCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2k4MDQyLmg+CisKKyNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgorCitNT0RVTEVfQVVUSE9SKCJDYXJsb3MgQ29yYmFjaG8iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQWNlciBMYXB0b3AgV01JIEV4dHJhcyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBBQ0VSX0xPR1BSRUZJWCAiYWNlci13bWk6ICIKKyNkZWZpbmUgQUNFUl9FUlIgS0VSTl9FUlIgQUNFUl9MT0dQUkVGSVgKKyNkZWZpbmUgQUNFUl9OT1RJQ0UgS0VSTl9OT1RJQ0UgQUNFUl9MT0dQUkVGSVgKKyNkZWZpbmUgQUNFUl9JTkZPIEtFUk5fSU5GTyBBQ0VSX0xPR1BSRUZJWAorCisvKgorICogVGhlIGZvbGxvd2luZyBkZWZpbmVzIHF1aXJrcyB0byBnZXQgc29tZSBzcGVjaWZpYyBmdW5jdGlvbnMgdG8gd29yaworICogd2hpY2ggYXJlIGtub3duIHRvIG5vdCBiZSBzdXBwb3J0ZWQgb3ZlciBBQ1BJLVdNSSAoc3VjaCBhcyB0aGUgbWFpbCBMRUQKKyAqIG9uIFdNSUQgYmFzZWQgQWNlcidzKQorICovCitzdHJ1Y3QgYWNlcl9xdWlya3MgeworCWNvbnN0IGNoYXIgKnZlbmRvcjsKKwljb25zdCBjaGFyICptb2RlbDsKKwl1MTYgcXVpcmtzOworfTsKKworLyoKKyAqIE1hZ2ljIE51bWJlcgorICogTWVhbmluZyBpcyB1bmtub3duIC0gdGhpcyBudW1iZXIgaXMgcmVxdWlyZWQgZm9yIHdyaXRpbmcgdG8gQUNQSSBmb3IgQU1XMAorICogKGl0J3MgYWxzbyB1c2VkIGluIGFjZXJoayB3aGVuIGRpcmVjdGx5IGFjY2Vzc2luZyB0aGUgQklPUykKKyAqLworI2RlZmluZSBBQ0VSX0FNVzBfV1JJVEUJMHg5NjEwCisKKy8qCisgKiBCaXQgbWFza3MgZm9yIHRoZSBBTVcwIGludGVyZmFjZQorICovCisjZGVmaW5lIEFDRVJfQU1XMF9XSVJFTEVTU19NQVNLICAweDM1CisjZGVmaW5lIEFDRVJfQU1XMF9CTFVFVE9PVEhfTUFTSyAweDM0CisjZGVmaW5lIEFDRVJfQU1XMF9NQUlMTEVEX01BU0sgICAweDMxCisKKy8qCisgKiBNZXRob2QgSURzIGZvciBXTUlEIGludGVyZmFjZQorICovCisjZGVmaW5lIEFDRVJfV01JRF9HRVRfV0lSRUxFU1NfTUVUSE9ESUQJCTEKKyNkZWZpbmUgQUNFUl9XTUlEX0dFVF9CTFVFVE9PVEhfTUVUSE9ESUQJMgorI2RlZmluZSBBQ0VSX1dNSURfR0VUX0JSSUdIVE5FU1NfTUVUSE9ESUQJMworI2RlZmluZSBBQ0VSX1dNSURfU0VUX1dJUkVMRVNTX01FVEhPRElECQk0CisjZGVmaW5lIEFDRVJfV01JRF9TRVRfQkxVRVRPT1RIX01FVEhPRElECTUKKyNkZWZpbmUgQUNFUl9XTUlEX1NFVF9CUklHSFRORVNTX01FVEhPRElECTYKKyNkZWZpbmUgQUNFUl9XTUlEX0dFVF9USFJFRUdfTUVUSE9ESUQJCTEwCisjZGVmaW5lIEFDRVJfV01JRF9TRVRfVEhSRUVHX01FVEhPRElECQkxMQorCisvKgorICogQWNlciBBQ1BJIG1ldGhvZCBHVUlEcworICovCisjZGVmaW5lIEFNVzBfR1VJRDEJCSI2N0MzMzcxRC05NUEzLTRDMzctQkI2MS1ERDQ3QjQ5MURBQUIiCisjZGVmaW5lIFdNSURfR1VJRDEJCSI2QUY0RjI1OC1CNDAxLTQyZmQtQkU5MS0zRDRBQzJEN0MwRDMiCisjZGVmaW5lIFdNSURfR1VJRDIJCSI5NTc2NEUwOS1GQjU2LTRlODMtQjMxQS0zNzc2MUY2MDk5NEEiCisKK01PRFVMRV9BTElBUygid21pOjY3QzMzNzFELTk1QTMtNEMzNy1CQjYxLURENDdCNDkxREFBQiIpOworTU9EVUxFX0FMSUFTKCJ3bWk6NkFGNEYyNTgtQjQwMS00MmZkLUJFOTEtM0Q0QUMyRDdDMEQzIik7CisKKy8qIFRlbXBvcmFyeSB3b3JrYXJvdW5kIHVudGlsIHRoZSBXTUkgc3lzZnMgaW50ZXJmYWNlIGdvZXMgaW4gKi8KK01PRFVMRV9BTElBUygiZG1pOio6KkFjZXIqOio6Iik7CisKKy8qCisgKiBJbnRlcmZhY2UgY2FwYWJpbGl0eSBmbGFncworICovCisjZGVmaW5lIEFDRVJfQ0FQX01BSUxMRUQJCSgxPDwwKQorI2RlZmluZSBBQ0VSX0NBUF9XSVJFTEVTUwkJKDE8PDEpCisjZGVmaW5lIEFDRVJfQ0FQX0JMVUVUT09USAkJKDE8PDIpCisjZGVmaW5lIEFDRVJfQ0FQX0JSSUdIVE5FU1MJCSgxPDwzKQorI2RlZmluZSBBQ0VSX0NBUF9USFJFRUcJCQkoMTw8NCkKKyNkZWZpbmUgQUNFUl9DQVBfQU5ZCQkJKDB4RkZGRkZGRkYpCisKKy8qCisgKiBJbnRlcmZhY2UgdHlwZSBmbGFncworICovCitlbnVtIGludGVyZmFjZV9mbGFncyB7CisJQUNFUl9BTVcwLAorCUFDRVJfQU1XMF9WMiwKKwlBQ0VSX1dNSUQsCit9OworCisjZGVmaW5lIEFDRVJfREVGQVVMVF9XSVJFTEVTUyAgMAorI2RlZmluZSBBQ0VSX0RFRkFVTFRfQkxVRVRPT1RIIDAKKyNkZWZpbmUgQUNFUl9ERUZBVUxUX01BSUxMRUQgICAwCisjZGVmaW5lIEFDRVJfREVGQVVMVF9USFJFRUcgICAgMAorCitzdGF0aWMgaW50IG1heF9icmlnaHRuZXNzID0gMHhGOworCitzdGF0aWMgaW50IHdpcmVsZXNzID0gLTE7CitzdGF0aWMgaW50IGJsdWV0b290aCA9IC0xOworc3RhdGljIGludCBtYWlsbGVkID0gLTE7CitzdGF0aWMgaW50IGJyaWdodG5lc3MgPSAtMTsKK3N0YXRpYyBpbnQgdGhyZWVnID0gLTE7CitzdGF0aWMgaW50IGZvcmNlX3NlcmllczsKKworbW9kdWxlX3BhcmFtKG1haWxsZWQsIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0od2lyZWxlc3MsIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0oYmx1ZXRvb3RoLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKGJyaWdodG5lc3MsIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0odGhyZWVnLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKGZvcmNlX3NlcmllcywgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0Mod2lyZWxlc3MsICJTZXQgaW5pdGlhbCBzdGF0ZSBvZiBXaXJlbGVzcyBoYXJkd2FyZSIpOworTU9EVUxFX1BBUk1fREVTQyhibHVldG9vdGgsICJTZXQgaW5pdGlhbCBzdGF0ZSBvZiBCbHVldG9vdGggaGFyZHdhcmUiKTsKK01PRFVMRV9QQVJNX0RFU0MobWFpbGxlZCwgIlNldCBpbml0aWFsIHN0YXRlIG9mIE1haWwgTEVEIik7CitNT0RVTEVfUEFSTV9ERVNDKGJyaWdodG5lc3MsICJTZXQgaW5pdGlhbCBMQ0QgYmFja2xpZ2h0IGJyaWdodG5lc3MiKTsKK01PRFVMRV9QQVJNX0RFU0ModGhyZWVnLCAiU2V0IGluaXRpYWwgc3RhdGUgb2YgM0cgaGFyZHdhcmUiKTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2Vfc2VyaWVzLCAiRm9yY2UgYSBkaWZmZXJlbnQgbGFwdG9wIHNlcmllcyIpOworCitzdHJ1Y3QgYWNlcl9kYXRhIHsKKwlpbnQgbWFpbGxlZDsKKwlpbnQgd2lyZWxlc3M7CisJaW50IGJsdWV0b290aDsKKwlpbnQgdGhyZWVnOworCWludCBicmlnaHRuZXNzOworfTsKKworLyogRWFjaCBsb3ctbGV2ZWwgaW50ZXJmYWNlIG11c3QgZGVmaW5lIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGZvbGxvd2luZyAqLworc3RydWN0IHdtaV9pbnRlcmZhY2UgeworCS8qIFRoZSBXTUkgZGV2aWNlIHR5cGUgKi8KKwl1MzIgdHlwZTsKKworCS8qIFRoZSBjYXBhYmlsaXRpZXMgdGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgKi8KKwl1MzIgY2FwYWJpbGl0eTsKKworCS8qIFByaXZhdGUgZGF0YSBmb3IgdGhlIGN1cnJlbnQgaW50ZXJmYWNlICovCisJc3RydWN0IGFjZXJfZGF0YSBkYXRhOworfTsKKworLyogVGhlIHN0YXRpYyBpbnRlcmZhY2UgcG9pbnRlciwgcG9pbnRzIHRvIHRoZSBjdXJyZW50bHkgZGV0ZWN0ZWQgaW50ZXJmYWNlICovCitzdGF0aWMgc3RydWN0IHdtaV9pbnRlcmZhY2UgKmludGVyZmFjZTsKKworLyoKKyAqIEVtYmVkZGVkIENvbnRyb2xsZXIgcXVpcmtzCisgKiBTb21lIGxhcHRvcHMgcmVxdWlyZSB1cyB0byBkaXJlY3RseSBhY2Nlc3MgdGhlIEVDIHRvIGVpdGhlciBlbmFibGUgb3IgcXVlcnkKKyAqIGZlYXR1cmVzIHRoYXQgYXJlIG5vdCBhdmFpbGFibGUgdGhyb3VnaCBXTUkuCisgKi8KKworc3RydWN0IHF1aXJrX2VudHJ5IHsKKwl1OCB3aXJlbGVzczsKKwl1OCBtYWlsbGVkOworCXU4IGJyaWdodG5lc3M7CisJdTggYmx1ZXRvb3RoOworfTsKKworc3RhdGljIHN0cnVjdCBxdWlya19lbnRyeSAqcXVpcmtzOworCitzdGF0aWMgdm9pZCBzZXRfcXVpcmtzKHZvaWQpCit7CisJaWYgKHF1aXJrcy0+bWFpbGxlZCkKKwkJaW50ZXJmYWNlLT5jYXBhYmlsaXR5IHw9IEFDRVJfQ0FQX01BSUxMRUQ7CisKKwlpZiAocXVpcmtzLT5icmlnaHRuZXNzKQorCQlpbnRlcmZhY2UtPmNhcGFiaWxpdHkgfD0gQUNFUl9DQVBfQlJJR0hUTkVTUzsKK30KKworc3RhdGljIGludCBkbWlfbWF0Y2hlZChjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZG1pKQoreworCXF1aXJrcyA9IGRtaS0+ZHJpdmVyX2RhdGE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcXVpcmtfZW50cnkgcXVpcmtfdW5rbm93biA9IHsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcXVpcmtfZW50cnkgcXVpcmtfYWNlcl90cmF2ZWxtYXRlXzI0OTAgPSB7CisJLm1haWxsZWQgPSAxLAorfTsKKworLyogVGhpcyBBTVcwIGxhcHRvcCBoYXMgbm8gYmx1ZXRvb3RoICovCitzdGF0aWMgc3RydWN0IHF1aXJrX2VudHJ5IHF1aXJrX21lZGlvbl9tZF85ODMwMCA9IHsKKwkud2lyZWxlc3MgPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIGFjZXJfcXVpcmtzW10gPSB7CisJeworCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKKwkJLmlkZW50ID0gIkFjZXIgQXNwaXJlIDMxMDAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQXNwaXJlIDMxMDAiKSwKKwkJfSwKKwkJLmRyaXZlcl9kYXRhID0gJnF1aXJrX2FjZXJfdHJhdmVsbWF0ZV8yNDkwLAorCX0sCisJeworCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKKwkJLmlkZW50ID0gIkFjZXIgQXNwaXJlIDUxMDAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQXNwaXJlIDUxMDAiKSwKKwkJfSwKKwkJLmRyaXZlcl9kYXRhID0gJnF1aXJrX2FjZXJfdHJhdmVsbWF0ZV8yNDkwLAorCX0sCisJeworCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKKwkJLmlkZW50ID0gIkFjZXIgQXNwaXJlIDU2MzAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQXNwaXJlIDU2MzAiKSwKKwkJfSwKKwkJLmRyaXZlcl9kYXRhID0gJnF1aXJrX2FjZXJfdHJhdmVsbWF0ZV8yNDkwLAorCX0sCisJeworCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKKwkJLmlkZW50ID0gIkFjZXIgQXNwaXJlIDU2NTAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQXNwaXJlIDU2NTAiKSwKKwkJfSwKKwkJLmRyaXZlcl9kYXRhID0gJnF1aXJrX2FjZXJfdHJhdmVsbWF0ZV8yNDkwLAorCX0sCisJeworCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKKwkJLmlkZW50ID0gIkFjZXIgQXNwaXJlIDU2ODAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQXNwaXJlIDU2ODAiKSwKKwkJfSwKKwkJLmRyaXZlcl9kYXRhID0gJnF1aXJrX2FjZXJfdHJhdmVsbWF0ZV8yNDkwLAorCX0sCisJeworCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKKwkJLmlkZW50ID0gIkFjZXIgQXNwaXJlIDkxMTAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiQXNwaXJlIDkxMTAiKSwKKwkJfSwKKwkJLmRyaXZlcl9kYXRhID0gJnF1aXJrX2FjZXJfdHJhdmVsbWF0ZV8yNDkwLAorCX0sCisJeworCQkuY2FsbGJhY2sgPSBkbWlfbWF0Y2hlZCwKKwkJLmlkZW50ID0gIkFjZXIgVHJhdmVsTWF0ZSAyNDkwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBY2VyIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlRyYXZlbE1hdGUgMjQ5MCIpLAorCQl9LAorCQkuZHJpdmVyX2RhdGEgPSAmcXVpcmtfYWNlcl90cmF2ZWxtYXRlXzI0OTAsCisJfSwKKwl7CisJCS5jYWxsYmFjayA9IGRtaV9tYXRjaGVkLAorCQkuaWRlbnQgPSAiTWVkaW9uIE1EIDk4MzAwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJNRURJT04iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiV0FNMjAzMCIpLAorCQl9LAorCQkuZHJpdmVyX2RhdGEgPSAmcXVpcmtfbWVkaW9uX21kXzk4MzAwLAorCX0sCisJe30KK307CisKKy8qIEZpbmQgd2hpY2ggcXVpcmtzIGFyZSBuZWVkZWQgZm9yIGEgcGFydGljdWxhciB2ZW5kb3IvIG1vZGVsIHBhaXIgKi8KK3N0YXRpYyB2b2lkIGZpbmRfcXVpcmtzKHZvaWQpCit7CisJaWYgKCFmb3JjZV9zZXJpZXMpIHsKKwkJZG1pX2NoZWNrX3N5c3RlbShhY2VyX3F1aXJrcyk7CisJfSBlbHNlIGlmIChmb3JjZV9zZXJpZXMgPT0gMjQ5MCkgeworCQlxdWlya3MgPSAmcXVpcmtfYWNlcl90cmF2ZWxtYXRlXzI0OTA7CisJfQorCisJaWYgKHF1aXJrcyA9PSBOVUxMKQorCQlxdWlya3MgPSAmcXVpcmtfdW5rbm93bjsKKworCXNldF9xdWlya3MoKTsKK30KKworLyoKKyAqIEdlbmVyYWwgaW50ZXJmYWNlIGNvbnZlbmllbmNlIG1ldGhvZHMKKyAqLworCitzdGF0aWMgYm9vbCBoYXNfY2FwKHUzMiBjYXApCit7CisJaWYgKChpbnRlcmZhY2UtPmNhcGFiaWxpdHkgJiBjYXApICE9IDApCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBTVcwIChWMSkgaW50ZXJmYWNlCisgKi8KK3N0cnVjdCB3bWFiX2FyZ3MgeworCXUzMiBlYXg7CisJdTMyIGVieDsKKwl1MzIgZWN4OworCXUzMiBlZHg7Cit9OworCitzdHJ1Y3Qgd21hYl9yZXQgeworCXUzMiBlYXg7CisJdTMyIGVieDsKKwl1MzIgZWN4OworCXUzMiBlZHg7CisJdTMyIGVleDsKK307CisKK3N0YXRpYyBhY3BpX3N0YXR1cyB3bWFiX2V4ZWN1dGUoc3RydWN0IHdtYWJfYXJncyAqcmVnYnVmLAorc3RydWN0IGFjcGlfYnVmZmVyICpyZXN1bHQpCit7CisJc3RydWN0IGFjcGlfYnVmZmVyIGlucHV0OworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlpbnB1dC5sZW5ndGggPSBzaXplb2Yoc3RydWN0IHdtYWJfYXJncyk7CisJaW5wdXQucG9pbnRlciA9ICh1OCAqKXJlZ2J1ZjsKKworCXN0YXR1cyA9IHdtaV9ldmFsdWF0ZV9tZXRob2QoQU1XMF9HVUlEMSwgMSwgMSwgJmlucHV0LCByZXN1bHQpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIEFNVzBfZ2V0X3UzMih1MzIgKnZhbHVlLCB1MzIgY2FwLAorc3RydWN0IHdtaV9pbnRlcmZhY2UgKmlmYWNlKQoreworCWludCBlcnI7CisJdTggcmVzdWx0OworCisJc3dpdGNoIChjYXApIHsKKwljYXNlIEFDRVJfQ0FQX01BSUxMRUQ6CisJCXN3aXRjaCAocXVpcmtzLT5tYWlsbGVkKSB7CisJCWRlZmF1bHQ6CisJCQllcnIgPSBlY19yZWFkKDB4QSwgJnJlc3VsdCk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBBRV9FUlJPUjsKKwkJCSp2YWx1ZSA9IChyZXN1bHQgPj4gNykgJiAweDE7CisJCQlyZXR1cm4gQUVfT0s7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBQ0VSX0NBUF9XSVJFTEVTUzoKKwkJc3dpdGNoIChxdWlya3MtPndpcmVsZXNzKSB7CisJCWNhc2UgMToKKwkJCWVyciA9IGVjX3JlYWQoMHg3QiwgJnJlc3VsdCk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBBRV9FUlJPUjsKKwkJCSp2YWx1ZSA9IHJlc3VsdCAmIDB4MTsKKwkJCXJldHVybiBBRV9PSzsKKwkJZGVmYXVsdDoKKwkJCWVyciA9IGVjX3JlYWQoMHhBLCAmcmVzdWx0KTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIEFFX0VSUk9SOworCQkJKnZhbHVlID0gKHJlc3VsdCA+PiAyKSAmIDB4MTsKKwkJCXJldHVybiBBRV9PSzsKKwkJfQorCQlicmVhazsKKwljYXNlIEFDRVJfQ0FQX0JMVUVUT09USDoKKwkJc3dpdGNoIChxdWlya3MtPmJsdWV0b290aCkgeworCQlkZWZhdWx0OgorCQkJZXJyID0gZWNfcmVhZCgweEEsICZyZXN1bHQpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gQUVfRVJST1I7CisJCQkqdmFsdWUgPSAocmVzdWx0ID4+IDQpICYgMHgxOworCQkJcmV0dXJuIEFFX09LOworCQl9CisJCWJyZWFrOworCWNhc2UgQUNFUl9DQVBfQlJJR0hUTkVTUzoKKwkJc3dpdGNoIChxdWlya3MtPmJyaWdodG5lc3MpIHsKKwkJZGVmYXVsdDoKKwkJCWVyciA9IGVjX3JlYWQoMHg4MywgJnJlc3VsdCk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBBRV9FUlJPUjsKKwkJCSp2YWx1ZSA9IHJlc3VsdDsKKwkJCXJldHVybiBBRV9PSzsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gQUVfQkFEX0FERFJFU1M7CisJfQorCXJldHVybiBBRV9PSzsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIEFNVzBfc2V0X3UzMih1MzIgdmFsdWUsIHUzMiBjYXAsIHN0cnVjdCB3bWlfaW50ZXJmYWNlICppZmFjZSkKK3sKKwlzdHJ1Y3Qgd21hYl9hcmdzIGFyZ3M7CisKKwlhcmdzLmVheCA9IEFDRVJfQU1XMF9XUklURTsKKwlhcmdzLmVieCA9IHZhbHVlID8gKDE8PDgpIDogMDsKKwlhcmdzLmVjeCA9IGFyZ3MuZWR4ID0gMDsKKworCXN3aXRjaCAoY2FwKSB7CisJY2FzZSBBQ0VSX0NBUF9NQUlMTEVEOgorCQlpZiAodmFsdWUgPiAxKQorCQkJcmV0dXJuIEFFX0JBRF9QQVJBTUVURVI7CisJCWFyZ3MuZWJ4IHw9IEFDRVJfQU1XMF9NQUlMTEVEX01BU0s7CisJCWJyZWFrOworCWNhc2UgQUNFUl9DQVBfV0lSRUxFU1M6CisJCWlmICh2YWx1ZSA+IDEpCisJCQlyZXR1cm4gQUVfQkFEX1BBUkFNRVRFUjsKKwkJYXJncy5lYnggfD0gQUNFUl9BTVcwX1dJUkVMRVNTX01BU0s7CisJCWJyZWFrOworCWNhc2UgQUNFUl9DQVBfQkxVRVRPT1RIOgorCQlpZiAodmFsdWUgPiAxKQorCQkJcmV0dXJuIEFFX0JBRF9QQVJBTUVURVI7CisJCWFyZ3MuZWJ4IHw9IEFDRVJfQU1XMF9CTFVFVE9PVEhfTUFTSzsKKwkJYnJlYWs7CisJY2FzZSBBQ0VSX0NBUF9CUklHSFRORVNTOgorCQlpZiAodmFsdWUgPiBtYXhfYnJpZ2h0bmVzcykKKwkJCXJldHVybiBBRV9CQURfUEFSQU1FVEVSOworCQlzd2l0Y2ggKHF1aXJrcy0+YnJpZ2h0bmVzcykgeworCQljYXNlIDE6CisJCQlyZXR1cm4gZWNfd3JpdGUoMHg4MywgdmFsdWUpOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIEFFX0JBRF9BRERSRVNTOworCQlicmVhazsKKwkJfQorCWRlZmF1bHQ6CisJCXJldHVybiBBRV9CQURfQUREUkVTUzsKKwl9CisKKwkvKiBBY3R1YWxseSBkbyB0aGUgc2V0ICovCisJcmV0dXJuIHdtYWJfZXhlY3V0ZSgmYXJncywgTlVMTCk7Cit9CisKK3N0YXRpYyBhY3BpX3N0YXR1cyBBTVcwX2ZpbmRfbWFpbGxlZCh2b2lkKQoreworCXN0cnVjdCB3bWFiX2FyZ3MgYXJnczsKKwlzdHJ1Y3Qgd21hYl9yZXQgcmV0OworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXQgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKKworCWFyZ3MuZWF4ID0gMHg4NjsKKwlhcmdzLmVieCA9IGFyZ3MuZWN4ID0gYXJncy5lZHggPSAwOworCisJc3RhdHVzID0gd21hYl9leGVjdXRlKCZhcmdzLCAmb3V0KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiBzdGF0dXM7CisKKwlvYmogPSAodW5pb24gYWNwaV9vYmplY3QgKikgb3V0LnBvaW50ZXI7CisJaWYgKG9iaiAmJiBvYmotPnR5cGUgPT0gQUNQSV9UWVBFX0JVRkZFUiAmJgorCW9iai0+YnVmZmVyLmxlbmd0aCA9PSBzaXplb2Yoc3RydWN0IHdtYWJfcmV0KSkgeworCQlyZXQgPSAqKChzdHJ1Y3Qgd21hYl9yZXQgKikgb2JqLT5idWZmZXIucG9pbnRlcik7CisJfSBlbHNlIHsKKwkJcmV0dXJuIEFFX0VSUk9SOworCX0KKworCWlmIChyZXQuZWV4ICYgMHgxKQorCQlpbnRlcmZhY2UtPmNhcGFiaWxpdHkgfD0gQUNFUl9DQVBfTUFJTExFRDsKKworCWtmcmVlKG91dC5wb2ludGVyKTsKKworCXJldHVybiBBRV9PSzsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIEFNVzBfc2V0X2NhcGFiaWxpdGllcyh2b2lkKQoreworCXN0cnVjdCB3bWFiX2FyZ3MgYXJnczsKKwlzdHJ1Y3Qgd21hYl9yZXQgcmV0OworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXQgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKKworCWFyZ3MuZWF4ID0gQUNFUl9BTVcwX1dSSVRFOworCWFyZ3MuZWN4ID0gYXJncy5lZHggPSAwOworCisJYXJncy5lYnggPSAweGEyIDw8IDg7CisJYXJncy5lYnggfD0gQUNFUl9BTVcwX1dJUkVMRVNTX01BU0s7CisKKwlzdGF0dXMgPSB3bWFiX2V4ZWN1dGUoJmFyZ3MsICZvdXQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKworCW9iaiA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSBvdXQucG9pbnRlcjsKKwlpZiAob2JqICYmIG9iai0+dHlwZSA9PSBBQ1BJX1RZUEVfQlVGRkVSICYmCisJb2JqLT5idWZmZXIubGVuZ3RoID09IHNpemVvZihzdHJ1Y3Qgd21hYl9yZXQpKSB7CisJCXJldCA9ICooKHN0cnVjdCB3bWFiX3JldCAqKSBvYmotPmJ1ZmZlci5wb2ludGVyKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gQUVfRVJST1I7CisJfQorCisJaWYgKHJldC5lYXggJiAweDEpCisJCWludGVyZmFjZS0+Y2FwYWJpbGl0eSB8PSBBQ0VSX0NBUF9XSVJFTEVTUzsKKworCWFyZ3MuZWJ4ID0gMiA8PCA4OworCWFyZ3MuZWJ4IHw9IEFDRVJfQU1XMF9CTFVFVE9PVEhfTUFTSzsKKworCXN0YXR1cyA9IHdtYWJfZXhlY3V0ZSgmYXJncywgJm91dCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gc3RhdHVzOworCisJb2JqID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopIG91dC5wb2ludGVyOworCWlmIChvYmogJiYgb2JqLT50eXBlID09IEFDUElfVFlQRV9CVUZGRVIKKwkmJiBvYmotPmJ1ZmZlci5sZW5ndGggPT0gc2l6ZW9mKHN0cnVjdCB3bWFiX3JldCkpIHsKKwkJcmV0ID0gKigoc3RydWN0IHdtYWJfcmV0ICopIG9iai0+YnVmZmVyLnBvaW50ZXIpOworCX0gZWxzZSB7CisJCXJldHVybiBBRV9FUlJPUjsKKwl9CisKKwlpZiAocmV0LmVheCAmIDB4MSkKKwkJaW50ZXJmYWNlLT5jYXBhYmlsaXR5IHw9IEFDRVJfQ0FQX0JMVUVUT09USDsKKworCWtmcmVlKG91dC5wb2ludGVyKTsKKworCS8qCisJICogVGhpcyBhcHBlYXJzIHRvIGJlIHNhZmUgdG8gZW5hYmxlLCBzaW5jZSBhbGwgV2lzdHJvbiBiYXNlZCBsYXB0b3BzCisJICogYXBwZWFyIHRvIHVzZSB0aGUgc2FtZSBFQyByZWdpc3RlciBmb3IgYnJpZ2h0bmVzcywgZXZlbiBpZiB0aGV5CisJICogZGlmZmVyIGZvciB3aXJlbGVzcywgZXRjCisJICovCisJaW50ZXJmYWNlLT5jYXBhYmlsaXR5IHw9IEFDRVJfQ0FQX0JSSUdIVE5FU1M7CisKKwlyZXR1cm4gQUVfT0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgd21pX2ludGVyZmFjZSBBTVcwX2ludGVyZmFjZSA9IHsKKwkudHlwZSA9IEFDRVJfQU1XMCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgd21pX2ludGVyZmFjZSBBTVcwX1YyX2ludGVyZmFjZSA9IHsKKwkudHlwZSA9IEFDRVJfQU1XMF9WMiwKK307CisKKy8qCisgKiBOZXcgaW50ZXJmYWNlIChUaGUgV01JRCBpbnRlcmZhY2UpCisgKi8KK3N0YXRpYyBhY3BpX3N0YXR1cworV01JX2V4ZWN1dGVfdTMyKHUzMiBtZXRob2RfaWQsIHUzMiBpbiwgdTMyICpvdXQpCit7CisJc3RydWN0IGFjcGlfYnVmZmVyIGlucHV0ID0geyAoYWNwaV9zaXplKSBzaXplb2YodTMyKSwgKHZvaWQgKikoJmluKSB9OworCXN0cnVjdCBhY3BpX2J1ZmZlciByZXN1bHQgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKKwl1MzIgdG1wOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IHdtaV9ldmFsdWF0ZV9tZXRob2QoV01JRF9HVUlEMSwgMSwgbWV0aG9kX2lkLCAmaW5wdXQsICZyZXN1bHQpOworCisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gc3RhdHVzOworCisJb2JqID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopIHJlc3VsdC5wb2ludGVyOworCWlmIChvYmogJiYgb2JqLT50eXBlID09IEFDUElfVFlQRV9CVUZGRVIgJiYKKwkJb2JqLT5idWZmZXIubGVuZ3RoID09IHNpemVvZih1MzIpKSB7CisJCXRtcCA9ICooKHUzMiAqKSBvYmotPmJ1ZmZlci5wb2ludGVyKTsKKwl9IGVsc2UgeworCQl0bXAgPSAwOworCX0KKworCWlmIChvdXQpCisJCSpvdXQgPSB0bXA7CisKKwlrZnJlZShyZXN1bHQucG9pbnRlcik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgYWNwaV9zdGF0dXMgV01JRF9nZXRfdTMyKHUzMiAqdmFsdWUsIHUzMiBjYXAsCitzdHJ1Y3Qgd21pX2ludGVyZmFjZSAqaWZhY2UpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXU4IHRtcDsKKwl1MzIgcmVzdWx0LCBtZXRob2RfaWQgPSAwOworCisJc3dpdGNoIChjYXApIHsKKwljYXNlIEFDRVJfQ0FQX1dJUkVMRVNTOgorCQltZXRob2RfaWQgPSBBQ0VSX1dNSURfR0VUX1dJUkVMRVNTX01FVEhPRElEOworCQlicmVhazsKKwljYXNlIEFDRVJfQ0FQX0JMVUVUT09USDoKKwkJbWV0aG9kX2lkID0gQUNFUl9XTUlEX0dFVF9CTFVFVE9PVEhfTUVUSE9ESUQ7CisJCWJyZWFrOworCWNhc2UgQUNFUl9DQVBfQlJJR0hUTkVTUzoKKwkJbWV0aG9kX2lkID0gQUNFUl9XTUlEX0dFVF9CUklHSFRORVNTX01FVEhPRElEOworCQlicmVhazsKKwljYXNlIEFDRVJfQ0FQX1RIUkVFRzoKKwkJbWV0aG9kX2lkID0gQUNFUl9XTUlEX0dFVF9USFJFRUdfTUVUSE9ESUQ7CisJCWJyZWFrOworCWNhc2UgQUNFUl9DQVBfTUFJTExFRDoKKwkJaWYgKHF1aXJrcy0+bWFpbGxlZCA9PSAxKSB7CisJCQllY19yZWFkKDB4OWYsICZ0bXApOworCQkJKnZhbHVlID0gdG1wICYgMHgxOworCQkJcmV0dXJuIDA7CisJCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gQUVfQkFEX0FERFJFU1M7CisJfQorCXN0YXR1cyA9IFdNSV9leGVjdXRlX3UzMihtZXRob2RfaWQsIDAsICZyZXN1bHQpOworCisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQorCQkqdmFsdWUgPSAodTgpcmVzdWx0OworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIFdNSURfc2V0X3UzMih1MzIgdmFsdWUsIHUzMiBjYXAsIHN0cnVjdCB3bWlfaW50ZXJmYWNlICppZmFjZSkKK3sKKwl1MzIgbWV0aG9kX2lkID0gMDsKKwljaGFyIHBhcmFtOworCisJc3dpdGNoIChjYXApIHsKKwljYXNlIEFDRVJfQ0FQX0JSSUdIVE5FU1M6CisJCWlmICh2YWx1ZSA+IG1heF9icmlnaHRuZXNzKQorCQkJcmV0dXJuIEFFX0JBRF9QQVJBTUVURVI7CisJCW1ldGhvZF9pZCA9IEFDRVJfV01JRF9TRVRfQlJJR0hUTkVTU19NRVRIT0RJRDsKKwkJYnJlYWs7CisJY2FzZSBBQ0VSX0NBUF9XSVJFTEVTUzoKKwkJaWYgKHZhbHVlID4gMSkKKwkJCXJldHVybiBBRV9CQURfUEFSQU1FVEVSOworCQltZXRob2RfaWQgPSBBQ0VSX1dNSURfU0VUX1dJUkVMRVNTX01FVEhPRElEOworCQlicmVhazsKKwljYXNlIEFDRVJfQ0FQX0JMVUVUT09USDoKKwkJaWYgKHZhbHVlID4gMSkKKwkJCXJldHVybiBBRV9CQURfUEFSQU1FVEVSOworCQltZXRob2RfaWQgPSBBQ0VSX1dNSURfU0VUX0JMVUVUT09USF9NRVRIT0RJRDsKKwkJYnJlYWs7CisJY2FzZSBBQ0VSX0NBUF9USFJFRUc6CisJCWlmICh2YWx1ZSA+IDEpCisJCQlyZXR1cm4gQUVfQkFEX1BBUkFNRVRFUjsKKwkJbWV0aG9kX2lkID0gQUNFUl9XTUlEX1NFVF9USFJFRUdfTUVUSE9ESUQ7CisJCWJyZWFrOworCWNhc2UgQUNFUl9DQVBfTUFJTExFRDoKKwkJaWYgKHZhbHVlID4gMSkKKwkJCXJldHVybiBBRV9CQURfUEFSQU1FVEVSOworCQlpZiAocXVpcmtzLT5tYWlsbGVkID09IDEpIHsKKwkJCXBhcmFtID0gdmFsdWUgPyAweDkyIDogMHg5MzsKKwkJCWk4MDQyX2NvbW1hbmQoJnBhcmFtLCAweDEwNTkpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIEFFX0JBRF9BRERSRVNTOworCX0KKwlyZXR1cm4gV01JX2V4ZWN1dGVfdTMyKG1ldGhvZF9pZCwgKHUzMil2YWx1ZSwgTlVMTCk7Cit9CisKK3N0YXRpYyBhY3BpX3N0YXR1cyBXTUlEX3NldF9jYXBhYmlsaXRpZXModm9pZCkKK3sKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgb3V0ID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MzIgZGV2aWNlczsKKworCXN0YXR1cyA9IHdtaV9xdWVyeV9ibG9jayhXTUlEX0dVSUQyLCAxLCAmb3V0KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiBzdGF0dXM7CisKKwlvYmogPSAodW5pb24gYWNwaV9vYmplY3QgKikgb3V0LnBvaW50ZXI7CisJaWYgKG9iaiAmJiBvYmotPnR5cGUgPT0gQUNQSV9UWVBFX0JVRkZFUiAmJgorCQlvYmotPmJ1ZmZlci5sZW5ndGggPT0gc2l6ZW9mKHUzMikpIHsKKwkJZGV2aWNlcyA9ICooKHUzMiAqKSBvYmotPmJ1ZmZlci5wb2ludGVyKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gQUVfRVJST1I7CisJfQorCisJLyogTm90IHN1cmUgb24gdGhlIG1lYW5pbmcgb2YgdGhlIHJlbGV2YW50IGJpdHMgeWV0IHRvIGRldGVjdCB0aGVzZSAqLworCWludGVyZmFjZS0+Y2FwYWJpbGl0eSB8PSBBQ0VSX0NBUF9XSVJFTEVTUzsKKwlpbnRlcmZhY2UtPmNhcGFiaWxpdHkgfD0gQUNFUl9DQVBfVEhSRUVHOworCisJLyogV01JRCBhbHdheXMgcHJvdmlkZXMgYnJpZ2h0bmVzcyBtZXRob2RzICovCisJaW50ZXJmYWNlLT5jYXBhYmlsaXR5IHw9IEFDRVJfQ0FQX0JSSUdIVE5FU1M7CisKKwlpZiAoZGV2aWNlcyAmIDB4MTApCisJCWludGVyZmFjZS0+Y2FwYWJpbGl0eSB8PSBBQ0VSX0NBUF9CTFVFVE9PVEg7CisKKwlpZiAoIShkZXZpY2VzICYgMHgyMCkpCisJCW1heF9icmlnaHRuZXNzID0gMHg5OworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHN0cnVjdCB3bWlfaW50ZXJmYWNlIHdtaWRfaW50ZXJmYWNlID0geworCS50eXBlID0gQUNFUl9XTUlELAorfTsKKworLyoKKyAqIEdlbmVyaWMgRGV2aWNlIChpbnRlcmZhY2UtaW5kZXBlbmRlbnQpCisgKi8KKworc3RhdGljIGFjcGlfc3RhdHVzIGdldF91MzIodTMyICp2YWx1ZSwgdTMyIGNhcCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9CQURfQUREUkVTUzsKKworCXN3aXRjaCAoaW50ZXJmYWNlLT50eXBlKSB7CisJY2FzZSBBQ0VSX0FNVzA6CisJCXN0YXR1cyA9IEFNVzBfZ2V0X3UzMih2YWx1ZSwgY2FwLCBpbnRlcmZhY2UpOworCQlicmVhazsKKwljYXNlIEFDRVJfQU1XMF9WMjoKKwkJaWYgKGNhcCA9PSBBQ0VSX0NBUF9NQUlMTEVEKSB7CisJCQlzdGF0dXMgPSBBTVcwX2dldF91MzIodmFsdWUsIGNhcCwgaW50ZXJmYWNlKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBBQ0VSX1dNSUQ6CisJCXN0YXR1cyA9IFdNSURfZ2V0X3UzMih2YWx1ZSwgY2FwLCBpbnRlcmZhY2UpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgYWNwaV9zdGF0dXMgc2V0X3UzMih1MzIgdmFsdWUsIHUzMiBjYXApCit7CisJaWYgKGludGVyZmFjZS0+Y2FwYWJpbGl0eSAmIGNhcCkgeworCQlzd2l0Y2ggKGludGVyZmFjZS0+dHlwZSkgeworCQljYXNlIEFDRVJfQU1XMDoKKwkJCXJldHVybiBBTVcwX3NldF91MzIodmFsdWUsIGNhcCwgaW50ZXJmYWNlKTsKKwkJY2FzZSBBQ0VSX0FNVzBfVjI6CisJCWNhc2UgQUNFUl9XTUlEOgorCQkJcmV0dXJuIFdNSURfc2V0X3UzMih2YWx1ZSwgY2FwLCBpbnRlcmZhY2UpOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIEFFX0JBRF9QQVJBTUVURVI7CisJCX0KKwl9CisJcmV0dXJuIEFFX0JBRF9QQVJBTUVURVI7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBhY2VyX2NvbW1hbmRsaW5lX2luaXQodm9pZCkKK3sKKwkvKgorCSAqIFRoZXNlIHdpbGwgYWxsIGZhaWwgc2lsZW50bHkgaWYgdGhlIHZhbHVlIGdpdmVuIGlzIGludmFsaWQsIG9yIHRoZQorCSAqIGNhcGFiaWxpdHkgaXNuJ3QgYXZhaWxhYmxlIG9uIHRoZSBnaXZlbiBpbnRlcmZhY2UKKwkgKi8KKwlzZXRfdTMyKG1haWxsZWQsIEFDRVJfQ0FQX01BSUxMRUQpOworCXNldF91MzIod2lyZWxlc3MsIEFDRVJfQ0FQX1dJUkVMRVNTKTsKKwlzZXRfdTMyKGJsdWV0b290aCwgQUNFUl9DQVBfQkxVRVRPT1RIKTsKKwlzZXRfdTMyKHRocmVlZywgQUNFUl9DQVBfVEhSRUVHKTsKKwlzZXRfdTMyKGJyaWdodG5lc3MsIEFDRVJfQ0FQX0JSSUdIVE5FU1MpOworfQorCisvKgorICogTEVEIGRldmljZSAoTWFpbCBMRUQgb25seSwgbm8gb3RoZXIgTEVEcyBrbm93biB5ZXQpCisgKi8KK3N0YXRpYyB2b2lkIG1haWxfbGVkX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKK2VudW0gbGVkX2JyaWdodG5lc3MgdmFsdWUpCit7CisJc2V0X3UzMih2YWx1ZSwgQUNFUl9DQVBfTUFJTExFRCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGVkX2NsYXNzZGV2IG1haWxfbGVkID0geworCS5uYW1lID0gImFjZXItbWFpbDpncmVlbiIsCisJLmJyaWdodG5lc3Nfc2V0ID0gbWFpbF9sZWRfc2V0LAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWNlcl9sZWRfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGxlZF9jbGFzc2Rldl9yZWdpc3RlcihkZXYsICZtYWlsX2xlZCk7Cit9CisKK3N0YXRpYyB2b2lkIGFjZXJfbGVkX2V4aXQodm9pZCkKK3sKKwlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmbWFpbF9sZWQpOworfQorCisvKgorICogQmFja2xpZ2h0IGRldmljZQorICovCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmFjZXJfYmFja2xpZ2h0X2RldmljZTsKKworc3RhdGljIGludCByZWFkX2JyaWdodG5lc3Moc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXUzMiB2YWx1ZTsKKwlnZXRfdTMyKCZ2YWx1ZSwgQUNFUl9DQVBfQlJJR0hUTkVTUyk7CisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgaW50IHVwZGF0ZV9ibF9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXNldF91MzIoYmQtPnByb3BzLmJyaWdodG5lc3MsIEFDRVJfQ0FQX0JSSUdIVE5FU1MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgYWNlcl9ibF9vcHMgPSB7CisJLmdldF9icmlnaHRuZXNzID0gcmVhZF9icmlnaHRuZXNzLAorCS51cGRhdGVfc3RhdHVzID0gdXBkYXRlX2JsX3N0YXR1cywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFjZXJfYmFja2xpZ2h0X2luaXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZDsKKworCWJkID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcigiYWNlci13bWkiLCBkZXYsIE5VTEwsICZhY2VyX2JsX29wcyk7CisJaWYgKElTX0VSUihiZCkpIHsKKwkJcHJpbnRrKEFDRVJfRVJSICJDb3VsZCBub3QgcmVnaXN0ZXIgQWNlciBiYWNrbGlnaHQgZGV2aWNlXG4iKTsKKwkJYWNlcl9iYWNrbGlnaHRfZGV2aWNlID0gTlVMTDsKKwkJcmV0dXJuIFBUUl9FUlIoYmQpOworCX0KKworCWFjZXJfYmFja2xpZ2h0X2RldmljZSA9IGJkOworCisJYmQtPnByb3BzLm1heF9icmlnaHRuZXNzID0gbWF4X2JyaWdodG5lc3M7CisJYmQtPnByb3BzLmJyaWdodG5lc3MgPSByZWFkX2JyaWdodG5lc3MoTlVMTCk7CisJYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoYmQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWNlcl9iYWNrbGlnaHRfZXhpdCh2b2lkKQoreworCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihhY2VyX2JhY2tsaWdodF9kZXZpY2UpOworfQorCisvKgorICogUmVhZC8gd3JpdGUgYm9vbCBzeXNmcyBtYWNybworICovCisjZGVmaW5lIHNob3dfc2V0X2Jvb2wodmFsdWUsIGNhcCkgXAorc3RhdGljIHNzaXplX3QgXAorc2hvd19ib29sXyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgXAorCWNoYXIgKmJ1ZikgXAoreyBcCisJdTMyIHJlc3VsdDsgXAorCWFjcGlfc3RhdHVzIHN0YXR1cyA9IGdldF91MzIoJnJlc3VsdCwgY2FwKTsgXAorCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgXAorCQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgcmVzdWx0KTsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIlJlYWQgZXJyb3JcbiIpOyBcCit9IFwKK1wKK3N0YXRpYyBzc2l6ZV90IFwKK3NldF9ib29sXyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCit7IFwKKwl1MzIgdG1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7IFwKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBzZXRfdTMyKHRtcCwgY2FwKTsgXAorCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIFwKKwkJCXJldHVybiAtRUlOVkFMOyBcCisJcmV0dXJuIGNvdW50OyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUih2YWx1ZSwgU19JV1VHTyB8IFNfSVJVR08gfCBTX0lXVVNSLCBcCisJc2hvd19ib29sXyMjdmFsdWUsIHNldF9ib29sXyMjdmFsdWUpOworCitzaG93X3NldF9ib29sKHdpcmVsZXNzLCBBQ0VSX0NBUF9XSVJFTEVTUyk7CitzaG93X3NldF9ib29sKGJsdWV0b290aCwgQUNFUl9DQVBfQkxVRVRPT1RIKTsKK3Nob3dfc2V0X2Jvb2wodGhyZWVnLCBBQ0VSX0NBUF9USFJFRUcpOworCisvKgorICogUmVhZCBpbnRlcmZhY2Ugc3lzZnMgbWFjcm8KKyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19pbnRlcmZhY2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwljaGFyICpidWYpCit7CisJc3dpdGNoIChpbnRlcmZhY2UtPnR5cGUpIHsKKwljYXNlIEFDRVJfQU1XMDoKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiQU1XMFxuIik7CisJY2FzZSBBQ0VSX0FNVzBfVjI6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIkFNVzAgdjJcbiIpOworCWNhc2UgQUNFUl9XTUlEOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJXTUlEXG4iKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJFcnJvciFcbiIpOworCX0KK30KKworc3RhdGljIERFVklDRV9BVFRSKGludGVyZmFjZSwgU19JV1VHTyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCXNob3dfaW50ZXJmYWNlLCBOVUxMKTsKKworLyoKKyAqIFBsYXRmb3JtIGRldmljZQorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhY2VyX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZSkKK3sKKwlpbnQgZXJyOworCisJaWYgKGhhc19jYXAoQUNFUl9DQVBfTUFJTExFRCkpIHsKKwkJZXJyID0gYWNlcl9sZWRfaW5pdCgmZGV2aWNlLT5kZXYpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJvcl9tYWlsbGVkOworCX0KKworCWlmIChoYXNfY2FwKEFDRVJfQ0FQX0JSSUdIVE5FU1MpKSB7CisJCWVyciA9IGFjZXJfYmFja2xpZ2h0X2luaXQoJmRldmljZS0+ZGV2KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyb3JfYnJpZ2h0bmVzczsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyb3JfYnJpZ2h0bmVzczoKKwlhY2VyX2xlZF9leGl0KCk7CitlcnJvcl9tYWlsbGVkOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYWNlcl9wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlKQoreworCWlmIChoYXNfY2FwKEFDRVJfQ0FQX01BSUxMRUQpKQorCQlhY2VyX2xlZF9leGl0KCk7CisJaWYgKGhhc19jYXAoQUNFUl9DQVBfQlJJR0hUTkVTUykpCisJCWFjZXJfYmFja2xpZ2h0X2V4aXQoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhY2VyX3BsYXRmb3JtX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LAorcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXUzMiB2YWx1ZTsKKwlzdHJ1Y3QgYWNlcl9kYXRhICpkYXRhID0gJmludGVyZmFjZS0+ZGF0YTsKKworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoaGFzX2NhcChBQ0VSX0NBUF9XSVJFTEVTUykpIHsKKwkJZ2V0X3UzMigmdmFsdWUsIEFDRVJfQ0FQX1dJUkVMRVNTKTsKKwkJZGF0YS0+d2lyZWxlc3MgPSB2YWx1ZTsKKwl9CisKKwlpZiAoaGFzX2NhcChBQ0VSX0NBUF9CTFVFVE9PVEgpKSB7CisJCWdldF91MzIoJnZhbHVlLCBBQ0VSX0NBUF9CTFVFVE9PVEgpOworCQlkYXRhLT5ibHVldG9vdGggPSB2YWx1ZTsKKwl9CisKKwlpZiAoaGFzX2NhcChBQ0VSX0NBUF9NQUlMTEVEKSkgeworCQlnZXRfdTMyKCZ2YWx1ZSwgQUNFUl9DQVBfTUFJTExFRCk7CisJCWRhdGEtPm1haWxsZWQgPSB2YWx1ZTsKKwl9CisKKwlpZiAoaGFzX2NhcChBQ0VSX0NBUF9CUklHSFRORVNTKSkgeworCQlnZXRfdTMyKCZ2YWx1ZSwgQUNFUl9DQVBfQlJJR0hUTkVTUyk7CisJCWRhdGEtPmJyaWdodG5lc3MgPSB2YWx1ZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhY2VyX3BsYXRmb3JtX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGFjZXJfZGF0YSAqZGF0YSA9ICZpbnRlcmZhY2UtPmRhdGE7CisKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGhhc19jYXAoQUNFUl9DQVBfV0lSRUxFU1MpKQorCQlzZXRfdTMyKGRhdGEtPndpcmVsZXNzLCBBQ0VSX0NBUF9XSVJFTEVTUyk7CisKKwlpZiAoaGFzX2NhcChBQ0VSX0NBUF9CTFVFVE9PVEgpKQorCQlzZXRfdTMyKGRhdGEtPmJsdWV0b290aCwgQUNFUl9DQVBfQkxVRVRPT1RIKTsKKworCWlmIChoYXNfY2FwKEFDRVJfQ0FQX1RIUkVFRykpCisJCXNldF91MzIoZGF0YS0+dGhyZWVnLCBBQ0VSX0NBUF9USFJFRUcpOworCisJaWYgKGhhc19jYXAoQUNFUl9DQVBfTUFJTExFRCkpCisJCXNldF91MzIoZGF0YS0+bWFpbGxlZCwgQUNFUl9DQVBfTUFJTExFRCk7CisKKwlpZiAoaGFzX2NhcChBQ0VSX0NBUF9CUklHSFRORVNTKSkKKwkJc2V0X3UzMihkYXRhLT5icmlnaHRuZXNzLCBBQ0VSX0NBUF9CUklHSFRORVNTKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhY2VyX3BsYXRmb3JtX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhY2VyLXdtaSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWNlcl9wbGF0Zm9ybV9wcm9iZSwKKwkucmVtb3ZlID0gYWNlcl9wbGF0Zm9ybV9yZW1vdmUsCisJLnN1c3BlbmQgPSBhY2VyX3BsYXRmb3JtX3N1c3BlbmQsCisJLnJlc3VtZSA9IGFjZXJfcGxhdGZvcm1fcmVzdW1lLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmFjZXJfcGxhdGZvcm1fZGV2aWNlOworCitzdGF0aWMgaW50IHJlbW92ZV9zeXNmcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UpCit7CisJaWYgKGhhc19jYXAoQUNFUl9DQVBfV0lSRUxFU1MpKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldmljZS0+ZGV2LCAmZGV2X2F0dHJfd2lyZWxlc3MpOworCisJaWYgKGhhc19jYXAoQUNFUl9DQVBfQkxVRVRPT1RIKSkKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXZpY2UtPmRldiwgJmRldl9hdHRyX2JsdWV0b290aCk7CisKKwlpZiAoaGFzX2NhcChBQ0VSX0NBUF9USFJFRUcpKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldmljZS0+ZGV2LCAmZGV2X2F0dHJfdGhyZWVnKTsKKworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2aWNlLT5kZXYsICZkZXZfYXR0cl9pbnRlcmZhY2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX3N5c2ZzKHZvaWQpCit7CisJaW50IHJldHZhbCA9IC1FTk9NRU07CisKKwlpZiAoaGFzX2NhcChBQ0VSX0NBUF9XSVJFTEVTUykpIHsKKwkJcmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZhY2VyX3BsYXRmb3JtX2RldmljZS0+ZGV2LAorCQkJJmRldl9hdHRyX3dpcmVsZXNzKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZXJyb3Jfc3lzZnM7CisJfQorCisJaWYgKGhhc19jYXAoQUNFUl9DQVBfQkxVRVRPT1RIKSkgeworCQlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmFjZXJfcGxhdGZvcm1fZGV2aWNlLT5kZXYsCisJCQkmZGV2X2F0dHJfYmx1ZXRvb3RoKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZXJyb3Jfc3lzZnM7CisJfQorCisJaWYgKGhhc19jYXAoQUNFUl9DQVBfVEhSRUVHKSkgeworCQlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmFjZXJfcGxhdGZvcm1fZGV2aWNlLT5kZXYsCisJCQkmZGV2X2F0dHJfdGhyZWVnKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZXJyb3Jfc3lzZnM7CisJfQorCisJcmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZhY2VyX3BsYXRmb3JtX2RldmljZS0+ZGV2LAorCQkmZGV2X2F0dHJfaW50ZXJmYWNlKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm9yX3N5c2ZzOworCisJcmV0dXJuIDA7CisKK2Vycm9yX3N5c2ZzOgorCQlyZW1vdmVfc3lzZnMoYWNlcl9wbGF0Zm9ybV9kZXZpY2UpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFjZXJfd21pX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJcHJpbnRrKEFDRVJfSU5GTyAiQWNlciBMYXB0b3AgQUNQSS1XTUkgRXh0cmFzIHZlcnNpb24gJXNcbiIsCisJCQlBQ0VSX1dNSV9WRVJTSU9OKTsKKworCS8qCisJICogRGV0ZWN0IHdoaWNoIEFDUEktV01JIGludGVyZmFjZSB3ZSdyZSB1c2luZy4KKwkgKi8KKwlpZiAod21pX2hhc19ndWlkKEFNVzBfR1VJRDEpICYmIHdtaV9oYXNfZ3VpZChXTUlEX0dVSUQxKSkKKwkJaW50ZXJmYWNlID0gJkFNVzBfVjJfaW50ZXJmYWNlOworCisJaWYgKCF3bWlfaGFzX2d1aWQoQU1XMF9HVUlEMSkgJiYgd21pX2hhc19ndWlkKFdNSURfR1VJRDEpKQorCQlpbnRlcmZhY2UgPSAmd21pZF9pbnRlcmZhY2U7CisKKwlpZiAod21pX2hhc19ndWlkKFdNSURfR1VJRDIpICYmIGludGVyZmFjZSkgeworCQlpZiAoQUNQSV9GQUlMVVJFKFdNSURfc2V0X2NhcGFiaWxpdGllcygpKSkgeworCQkJcHJpbnRrKEFDRVJfRVJSICJVbmFibGUgdG8gZGV0ZWN0IGF2YWlsYWJsZSBkZXZpY2VzXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfSBlbHNlIGlmICghd21pX2hhc19ndWlkKFdNSURfR1VJRDIpICYmIGludGVyZmFjZSkgeworCQlwcmludGsoQUNFUl9FUlIgIlVuYWJsZSB0byBkZXRlY3QgYXZhaWxhYmxlIGRldmljZXNcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAod21pX2hhc19ndWlkKEFNVzBfR1VJRDEpICYmICF3bWlfaGFzX2d1aWQoV01JRF9HVUlEMSkpIHsKKwkJaW50ZXJmYWNlID0gJkFNVzBfaW50ZXJmYWNlOworCisJCWlmIChBQ1BJX0ZBSUxVUkUoQU1XMF9zZXRfY2FwYWJpbGl0aWVzKCkpKSB7CisJCQlwcmludGsoQUNFUl9FUlIgIlVuYWJsZSB0byBkZXRlY3QgYXZhaWxhYmxlIGRldmljZXNcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwlpZiAod21pX2hhc19ndWlkKEFNVzBfR1VJRDEpKSB7CisJCWlmIChBQ1BJX0ZBSUxVUkUoQU1XMF9maW5kX21haWxsZWQoKSkpCisJCQlwcmludGsoQUNFUl9FUlIgIlVuYWJsZSB0byBkZXRlY3QgbWFpbCBMRURcbiIpOworCX0KKworCWZpbmRfcXVpcmtzKCk7CisKKwlpZiAoIWludGVyZmFjZSkgeworCQlwcmludGsoQUNFUl9FUlIgIk5vIG9yIHVuc3VwcG9ydGVkIFdNSSBpbnRlcmZhY2UsIHVuYWJsZSB0byAiKTsKKwkJcHJpbnRrKEtFUk5fQ09OVCAibG9hZC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAocGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhY2VyX3BsYXRmb3JtX2RyaXZlcikpIHsKKwkJcHJpbnRrKEFDRVJfRVJSICJVbmFibGUgdG8gcmVnaXN0ZXIgcGxhdGZvcm0gZHJpdmVyLlxuIik7CisJCWdvdG8gZXJyb3JfcGxhdGZvcm1fcmVnaXN0ZXI7CisJfQorCWFjZXJfcGxhdGZvcm1fZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJhY2VyLXdtaSIsIC0xKTsKKwlwbGF0Zm9ybV9kZXZpY2VfYWRkKGFjZXJfcGxhdGZvcm1fZGV2aWNlKTsKKworCWVyciA9IGNyZWF0ZV9zeXNmcygpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBPdmVycmlkZSBhbnkgaW5pdGlhbCBzZXR0aW5ncyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBjb21tYW5kbGluZSAqLworCWFjZXJfY29tbWFuZGxpbmVfaW5pdCgpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX3BsYXRmb3JtX3JlZ2lzdGVyOgorCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWNlcl93bWlfZXhpdCh2b2lkKQoreworCXJlbW92ZV9zeXNmcyhhY2VyX3BsYXRmb3JtX2RldmljZSk7CisJcGxhdGZvcm1fZGV2aWNlX2RlbChhY2VyX3BsYXRmb3JtX2RldmljZSk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFjZXJfcGxhdGZvcm1fZHJpdmVyKTsKKworCXByaW50ayhBQ0VSX0lORk8gIkFjZXIgTGFwdG9wIFdNSSBFeHRyYXMgdW5sb2FkZWRcbiIpOworCXJldHVybjsKK30KKworbW9kdWxlX2luaXQoYWNlcl93bWlfaW5pdCk7Cittb2R1bGVfZXhpdChhY2VyX3dtaV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9hc3VzLWxhcHRvcC5jIGIvZHJpdmVycy9taXNjL2FzdXMtbGFwdG9wLmMKaW5kZXggMDg0NmMzMy4uN2M2ZGZkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2FzdXMtbGFwdG9wLmMKKysrIGIvZHJpdmVycy9taXNjL2FzdXMtbGFwdG9wLmMKQEAgLTIzOSw3ICsyMzksNyBAQAogCXN0YXRpYyBpbnQgb2JqZWN0IyNfbGVkX3drOwkJCQkJXAogCXN0YXRpYyBERUNMQVJFX1dPUksob2JqZWN0IyNfbGVkX3dvcmssIG9iamVjdCMjX2xlZF91cGRhdGUpOwlcCiAJc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgb2JqZWN0IyNfbGVkID0gewkJCVwKLQkJLm5hbWUgICAgICAgICAgID0gImFzdXM6IiBsZWRuYW1lLAkJCVwKKwkJLm5hbWUgICAgICAgICAgID0gImFzdXM6OiIgbGVkbmFtZSwJCQlcCiAJCS5icmlnaHRuZXNzX3NldCA9IG9iamVjdCMjX2xlZF9zZXQsCQkJXAogCX0KIApAQCAtMjU0LDcgKzI1NCw3IEBACiAgKiBtZXRob2QgaXMgc2VhcmNoZWQgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgaGFuZGxlLCBjYW4gYmUgTlVMTC4gVGhlIG91dHB1dAogICogb2YgdGhlIG1ldGhvZCBpcyB3cml0dGVuIGlzIG91dHB1dCwgd2hpY2ggY2FuIGFsc28gYmUgTlVMTAogICoKLSAqIHJldHVybnMgMSBpZiB3cml0ZSBpcyBzdWNjZXNzZnVsLCAwIGVsc2UuCisgKiByZXR1cm5zIDAgaWYgd3JpdGUgaXMgc3VjY2Vzc2Z1bCwgLTEgZWxzZS4KICAqLwogc3RhdGljIGludCB3cml0ZV9hY3BpX2ludChhY3BpX2hhbmRsZSBoYW5kbGUsIGNvbnN0IGNoYXIgKm1ldGhvZCwgaW50IHZhbCwKIAkJCSAgc3RydWN0IGFjcGlfYnVmZmVyICpvdXRwdXQpCkBAIC0yNjMsMTMgKzI2MywxOSBAQAogCXVuaW9uIGFjcGlfb2JqZWN0IGluX29iajsJLy90aGUgb25seSBwYXJhbSB3ZSB1c2UKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwlpZiAoIWhhbmRsZSkKKwkJcmV0dXJuIDA7CisKIAlwYXJhbXMuY291bnQgPSAxOwogCXBhcmFtcy5wb2ludGVyID0gJmluX29iajsKIAlpbl9vYmoudHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOwogCWluX29iai5pbnRlZ2VyLnZhbHVlID0gdmFsOwogCiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCAoY2hhciAqKW1ldGhvZCwgJnBhcmFtcywgb3V0cHV0KTsKLQlyZXR1cm4gKHN0YXR1cyA9PSBBRV9PSyk7CisJaWYgKHN0YXR1cyA9PSBBRV9PSykKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyBpbnQgcmVhZF93aXJlbGVzc19zdGF0dXMoaW50IG1hc2spCkBAIC0zMjEsNyArMzI3LDcgQEAKIAogCXN3aXRjaCAobWFzaykgewogCWNhc2UgTUxFRF9PTjoKLQkJb3V0ID0gIW91dCAmIDB4MTsKKwkJb3V0ID0gIShvdXQgJiAweDEpOwogCQlicmVhazsKIAljYXNlIEdMRURfT046CiAJCW91dCA9IChvdXQgJiAweDEpICsgMTsKQEAgLTMzNSw3ICszNDEsNyBAQAogCQlicmVhazsKIAl9CiAKLQlpZiAoaGFuZGxlICYmICF3cml0ZV9hY3BpX2ludChoYW5kbGUsIE5VTEwsIG91dCwgTlVMTCkpCisJaWYgKHdyaXRlX2FjcGlfaW50KGhhbmRsZSwgTlVMTCwgb3V0LCBOVUxMKSkKIAkJcHJpbnRrKEFTVVNfV0FSTklORyAiIHdyaXRlIGZhaWxlZCAleFxuIiwgbWFzayk7CiB9CiAKQEAgLTQxNSw3ICs0MjEsNyBAQAogCXZhbHVlID0gKDAgPCB2YWx1ZSkgPyAoKDE1IDwgdmFsdWUpID8gMTUgOiB2YWx1ZSkgOiAwOwogCS8qIDAgPD0gdmFsdWUgPD0gMTUgKi8KIAotCWlmICghd3JpdGVfYWNwaV9pbnQoYnJpZ2h0bmVzc19zZXRfaGFuZGxlLCBOVUxMLCB2YWx1ZSwgTlVMTCkpIHsKKwlpZiAod3JpdGVfYWNwaV9pbnQoYnJpZ2h0bmVzc19zZXRfaGFuZGxlLCBOVUxMLCB2YWx1ZSwgTlVMTCkpIHsKIAkJcHJpbnRrKEFTVVNfV0FSTklORyAiRXJyb3IgY2hhbmdpbmcgYnJpZ2h0bmVzc1xuIik7CiAJCXJldCA9IC1FSU87CiAJfQpAQCAtNTQ1LDcgKzU1MSw3IEBACiAKIAlydiA9IHBhcnNlX2FyZyhidWYsIGNvdW50LCAmdmFsdWUpOwogCWlmIChydiA+IDApIHsKLQkJaWYgKCF3cml0ZV9hY3BpX2ludChsZWRkX3NldF9oYW5kbGUsIE5VTEwsIHZhbHVlLCBOVUxMKSkKKwkJaWYgKHdyaXRlX2FjcGlfaW50KGxlZGRfc2V0X2hhbmRsZSwgTlVMTCwgdmFsdWUsIE5VTEwpKQogCQkJcHJpbnRrKEFTVVNfV0FSTklORyAiTEVEIGRpc3BsYXkgd3JpdGUgZmFpbGVkXG4iKTsKIAkJZWxzZQogCQkJaG90ay0+bGVkZF9zdGF0dXMgPSAodTMyKSB2YWx1ZTsKQEAgLTU5MCw3ICs1OTYsNyBAQAogc3RhdGljIHZvaWQgc2V0X2Rpc3BsYXkoaW50IHZhbHVlKQogewogCS8qIG5vIHNhbml0eSBjaGVjayBuZWVkZWQgZm9yIG5vdyAqLwotCWlmICghd3JpdGVfYWNwaV9pbnQoZGlzcGxheV9zZXRfaGFuZGxlLCBOVUxMLCB2YWx1ZSwgTlVMTCkpCisJaWYgKHdyaXRlX2FjcGlfaW50KGRpc3BsYXlfc2V0X2hhbmRsZSwgTlVMTCwgdmFsdWUsIE5VTEwpKQogCQlwcmludGsoQVNVU19XQVJOSU5HICJFcnJvciBzZXR0aW5nIGRpc3BsYXlcbiIpOwogCXJldHVybjsKIH0KQEAgLTY0Nyw3ICs2NTMsNyBAQAogICovCiBzdGF0aWMgdm9pZCBzZXRfbGlnaHRfc2Vuc19zd2l0Y2goaW50IHZhbHVlKQogewotCWlmICghd3JpdGVfYWNwaV9pbnQobHNfc3dpdGNoX2hhbmRsZSwgTlVMTCwgdmFsdWUsIE5VTEwpKQorCWlmICh3cml0ZV9hY3BpX2ludChsc19zd2l0Y2hfaGFuZGxlLCBOVUxMLCB2YWx1ZSwgTlVMTCkpCiAJCXByaW50ayhBU1VTX1dBUk5JTkcgIkVycm9yIHNldHRpbmcgbGlnaHQgc2Vuc29yIHN3aXRjaFxuIik7CiAJaG90ay0+bGlnaHRfc3dpdGNoID0gdmFsdWU7CiB9CkBAIC02NzIsNyArNjc4LDcgQEAKIAogc3RhdGljIHZvaWQgc2V0X2xpZ2h0X3NlbnNfbGV2ZWwoaW50IHZhbHVlKQogewotCWlmICghd3JpdGVfYWNwaV9pbnQobHNfbGV2ZWxfaGFuZGxlLCBOVUxMLCB2YWx1ZSwgTlVMTCkpCisJaWYgKHdyaXRlX2FjcGlfaW50KGxzX2xldmVsX2hhbmRsZSwgTlVMTCwgdmFsdWUsIE5VTEwpKQogCQlwcmludGsoQVNVU19XQVJOSU5HICJFcnJvciBzZXR0aW5nIGxpZ2h0IHNlbnNvciBsZXZlbFxuIik7CiAJaG90ay0+bGlnaHRfbGV2ZWwgPSB2YWx1ZTsKIH0KQEAgLTg2MCw3ICs4NjYsNyBAQAogCQlwcmludGsoQVNVU19XQVJOSU5HICJDb3VsZG4ndCBnZXQgdGhlIERTRFQgdGFibGUgaGVhZGVyXG4iKTsKIAogCS8qIFdlIGhhdmUgdG8gd3JpdGUgMCBvbiBpbml0IHRoaXMgZmFyIGZvciBhbGwgQVNVUyBtb2RlbHMgKi8KLQlpZiAoIXdyaXRlX2FjcGlfaW50KGhvdGstPmhhbmRsZSwgIklOSVQiLCAwLCAmYnVmZmVyKSkgeworCWlmICh3cml0ZV9hY3BpX2ludChob3RrLT5oYW5kbGUsICJJTklUIiwgMCwgJmJ1ZmZlcikpIHsKIAkJcHJpbnRrKEFTVVNfRVJSICJIb3RrZXkgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2F0bWVsX3B3bS5jIGIvZHJpdmVycy9taXNjL2F0bWVsX3B3bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZDNiOWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvYXRtZWxfcHdtLmMKQEAgLTAsMCArMSw0MDkgQEAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0bWVsX3B3bS5oPgorCisKKy8qCisgKiBUaGlzIGlzIGEgc2ltcGxlIGRyaXZlciBmb3IgdGhlIFBXTSBjb250cm9sbGVyIGZvdW5kIGluIHZhcmlvdXMgbmV3ZXIKKyAqIEF0bWVsIFNPQ3MsIGluY2x1ZGluZyB0aGUgQVZSMzIgc2VyaWVzIGFuZCB0aGUgQVQ5MXNhbTkyNjMuCisgKgorICogQ2hpcHMgd2l0aCBjdXJyZW50IExpbnV4IHBvcnRzIGhhdmUgb25seSA0IFBXTSBjaGFubmVscywgb3V0IG9mIG1heCAzMi4KKyAqIEFUMzJVQzNBIGFuZCBBVDMyVUMzQiBjaGlwcyBoYXZlIDcgY2hhbm5lbHMgKGJ1dCBjdXJyZW50bHkgbm8gTGludXgpLgorICogRG9jcyBhcmUgaW5jb25zaXN0ZW50IGFib3V0IHRoZSB3aWR0aCBvZiB0aGUgY2hhbm5lbCBjb3VudGVyIHJlZ2lzdGVyczsKKyAqIGl0J3MgYXQgbGVhc3QgMTYgYml0cywgYnV0IHNldmVyYWwgcGxhY2VzIHNheSAyMCBiaXRzLgorICovCisjZGVmaW5lCVBXTV9OQ0hBTgk0CQkvKiBtYXggMzIgKi8KKworc3RydWN0IHB3bSB7CisJc3BpbmxvY2tfdAkJbG9jazsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2OworCXUzMgkJCW1hc2s7CisJaW50CQkJaXJxOworCXZvaWQgX19pb21lbQkJKmJhc2U7CisJc3RydWN0IGNsawkJKmNsazsKKwlzdHJ1Y3QgcHdtX2NoYW5uZWwJKmNoYW5uZWxbUFdNX05DSEFOXTsKKwl2b2lkCQkJKCpoYW5kbGVyW1BXTV9OQ0hBTl0pKHN0cnVjdCBwd21fY2hhbm5lbCAqKTsKK307CisKKworLyogZ2xvYmFsIFBXTSBjb250cm9sbGVyIHJlZ2lzdGVycyAqLworI2RlZmluZSBQV01fTVIJCTB4MDAKKyNkZWZpbmUgUFdNX0VOQQkJMHgwNAorI2RlZmluZSBQV01fRElTCQkweDA4CisjZGVmaW5lIFBXTV9TUgkJMHgwYworI2RlZmluZSBQV01fSUVSCQkweDEwCisjZGVmaW5lIFBXTV9JRFIJCTB4MTQKKyNkZWZpbmUgUFdNX0lNUgkJMHgxOAorI2RlZmluZSBQV01fSVNSCQkweDFjCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwd21fd3JpdGVsKGNvbnN0IHN0cnVjdCBwd20gKnAsIHVuc2lnbmVkIG9mZnNldCwgdTMyIHZhbCkKK3sKKwlfX3Jhd193cml0ZWwodmFsLCBwLT5iYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgcHdtX3JlYWRsKGNvbnN0IHN0cnVjdCBwd20gKnAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGwocC0+YmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpwd21jX3JlZ3MoY29uc3Qgc3RydWN0IHB3bSAqcCwgaW50IGluZGV4KQoreworCXJldHVybiBwLT5iYXNlICsgMHgyMDAgKyBpbmRleCAqIDB4MjA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHdtICpwd207CisKK3N0YXRpYyB2b2lkIHB3bV9kdW1wcmVncyhzdHJ1Y3QgcHdtX2NoYW5uZWwgKmNoLCBjaGFyICp0YWcpCit7CisJc3RydWN0IGRldmljZQkqZGV2ID0gJnB3bS0+cGRldi0+ZGV2OworCisJZGV2X2RiZyhkZXYsICIlczogbXIgJTA4eCwgc3IgJTA4eCwgaW1yICUwOHhcbiIsCisJCXRhZywKKwkJcHdtX3JlYWRsKHB3bSwgUFdNX01SKSwKKwkJcHdtX3JlYWRsKHB3bSwgUFdNX1NSKSwKKwkJcHdtX3JlYWRsKHB3bSwgUFdNX0lNUikpOworCWRldl9kYmcoZGV2LAorCQkicHdtIGNoJWQgLSBtciAlMDh4LCBkdHkgJXUsIHByZCAldSwgY250ICV1XG4iLAorCQljaC0+aW5kZXgsCisJCXB3bV9jaGFubmVsX3JlYWRsKGNoLCBQV01fQ01SKSwKKwkJcHdtX2NoYW5uZWxfcmVhZGwoY2gsIFBXTV9DRFRZKSwKKwkJcHdtX2NoYW5uZWxfcmVhZGwoY2gsIFBXTV9DUFJEKSwKKwkJcHdtX2NoYW5uZWxfcmVhZGwoY2gsIFBXTV9DQ05UKSk7Cit9CisKKworLyoqCisgKiBwd21fY2hhbm5lbF9hbGxvYyAtIGFsbG9jYXRlIGFuIHVudXNlZCBQV00gY2hhbm5lbAorICogQGluZGV4OiBpZGVudGlmaWVzIHRoZSBjaGFubmVsCisgKiBAY2g6IHN0cnVjdHVyZSB0byBiZSBpbml0aWFsaXplZAorICoKKyAqIERyaXZlcnMgYWxsb2NhdGUgUFdNIGNoYW5uZWxzIGFjY29yZGluZyB0byB0aGUgYm9hcmQncyB3aXJpbmcsIGFuZAorICogbWF0Y2hpbmcgYm9hcmQtc3BlY2lmaWMgc2V0dXAgY29kZS4gIFJldHVybnMgemVybyBvciBuZWdhdGl2ZSBlcnJuby4KKyAqLworaW50IHB3bV9jaGFubmVsX2FsbG9jKGludCBpbmRleCwgc3RydWN0IHB3bV9jaGFubmVsICpjaCkKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCWludAkJc3RhdHVzID0gMDsKKworCS8qIGluc2lzdCBvbiBQV00gaW5pdCwgd2l0aCB0aGlzIHNpZ25hbCBwaW5uZWQgb3V0ICovCisJaWYgKCFwd20gfHwgIShwd20tPm1hc2sgJiAxIDw8IGluZGV4KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IFBXTV9OQ0hBTiB8fCAhY2gpCisJCXJldHVybiAtRUlOVkFMOworCW1lbXNldChjaCwgMCwgc2l6ZW9mICpjaCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHdtLT5sb2NrLCBmbGFncyk7CisJaWYgKHB3bS0+Y2hhbm5lbFtpbmRleF0pCisJCXN0YXR1cyA9IC1FQlVTWTsKKwllbHNlIHsKKwkJY2xrX2VuYWJsZShwd20tPmNsayk7CisKKwkJY2gtPnJlZ3MgPSBwd21jX3JlZ3MocHdtLCBpbmRleCk7CisJCWNoLT5pbmRleCA9IGluZGV4OworCisJCS8qIFJFVklTSVQ6IGFwNzAwMCBzZWVtcyB0byBnbyAyeCBhcyBmYXN0IGFzIHdlIGV4cGVjdCEhICovCisJCWNoLT5tY2sgPSBjbGtfZ2V0X3JhdGUocHdtLT5jbGspOworCisJCXB3bS0+Y2hhbm5lbFtpbmRleF0gPSBjaDsKKwkJcHdtLT5oYW5kbGVyW2luZGV4XSA9IE5VTEw7CisKKwkJLyogY2hhbm5lbCBhbmQgaXJxIGFyZSBhbHdheXMgZGlzYWJsZWQgd2hlbiB3ZSByZXR1cm4gKi8KKwkJcHdtX3dyaXRlbChwd20sIFBXTV9ESVMsIDEgPDwgaW5kZXgpOworCQlwd21fd3JpdGVsKHB3bSwgUFdNX0lEUiwgMSA8PCBpbmRleCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnB3bS0+bG9jaywgZmxhZ3MpOworCXJldHVybiBzdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MKHB3bV9jaGFubmVsX2FsbG9jKTsKKworc3RhdGljIGludCBwd21jaGVjayhzdHJ1Y3QgcHdtX2NoYW5uZWwgKmNoKQoreworCWludAkJaW5kZXg7CisKKwlpZiAoIXB3bSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFjaCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaW5kZXggPSBjaC0+aW5kZXg7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBQV01fTkNIQU4gfHwgcHdtLT5jaGFubmVsW2luZGV4XSAhPSBjaCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gaW5kZXg7Cit9CisKKy8qKgorICogcHdtX2NoYW5uZWxfZnJlZSAtIHJlbGVhc2UgYSBwcmV2aW91c2x5IGFsbG9jYXRlZCBjaGFubmVsCisgKiBAY2g6IHRoZSBjaGFubmVsIGJlaW5nIHJlbGVhc2VkCisgKgorICogVGhlIGNoYW5uZWwgaXMgY29tcGxldGVseSBzaHV0IGRvd24gKGNvdW50ZXIgYW5kIElSUSBkaXNhYmxlZCksCisgKiBhbmQgbWFkZSBhdmFpbGFibGUgZm9yIHJlLXVzZS4gIFJldHVybnMgemVybywgb3IgbmVnYXRpdmUgZXJybm8uCisgKi8KK2ludCBwd21fY2hhbm5lbF9mcmVlKHN0cnVjdCBwd21fY2hhbm5lbCAqY2gpCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlpbnQJCXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHdtLT5sb2NrLCBmbGFncyk7CisJdCA9IHB3bWNoZWNrKGNoKTsKKwlpZiAodCA+PSAwKSB7CisJCXB3bS0+Y2hhbm5lbFt0XSA9IE5VTEw7CisJCXB3bS0+aGFuZGxlclt0XSA9IE5VTEw7CisKKwkJLyogY2hhbm5lbCBhbmQgaXJxIGFyZSBhbHdheXMgZGlzYWJsZWQgd2hlbiB3ZSByZXR1cm4gKi8KKwkJcHdtX3dyaXRlbChwd20sIFBXTV9ESVMsIDEgPDwgdCk7CisJCXB3bV93cml0ZWwocHdtLCBQV01fSURSLCAxIDw8IHQpOworCisJCWNsa19kaXNhYmxlKHB3bS0+Y2xrKTsKKwkJdCA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnB3bS0+bG9jaywgZmxhZ3MpOworCXJldHVybiB0OworfQorRVhQT1JUX1NZTUJPTChwd21fY2hhbm5lbF9mcmVlKTsKKworaW50IF9fcHdtX2NoYW5uZWxfb25vZmYoc3RydWN0IHB3bV9jaGFubmVsICpjaCwgaW50IGVuYWJsZWQpCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlpbnQJCXQ7CisKKwkvKiBPTUlUVEVEIEZVTkNUSU9OQUxJVFk6ICBzdGFydGluZyBzZXZlcmFsIGNoYW5uZWxzIGluIHN5bmNoICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHdtLT5sb2NrLCBmbGFncyk7CisJdCA9IHB3bWNoZWNrKGNoKTsKKwlpZiAodCA+PSAwKSB7CisJCXB3bV93cml0ZWwocHdtLCBlbmFibGVkID8gUFdNX0VOQSA6IFBXTV9ESVMsIDEgPDwgdCk7CisJCXQgPSAwOworCQlwd21fZHVtcHJlZ3MoY2gsIGVuYWJsZWQgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnB3bS0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHQ7Cit9CitFWFBPUlRfU1lNQk9MKF9fcHdtX2NoYW5uZWxfb25vZmYpOworCisvKioKKyAqIHB3bV9jbGtfYWxsb2MgLSBhbGxvY2F0ZSBhbmQgY29uZmlndXJlIENMS0Egb3IgQ0xLQgorICogQHByZXNjYWxlOiBmcm9tIDAuLjEwLCB0aGUgcG93ZXIgb2YgdHdvIHVzZWQgdG8gZGl2aWRlIE1DSworICogQGRpdjogZnJvbSAxLi4yNTUsIHRoZSBsaW5lYXIgZGl2aXNvciB0byB1c2UKKyAqCisgKiBSZXR1cm5zIFBXTV9DUFJfQ0xLQSwgUFdNX0NQUl9DTEtCLCBvciBuZWdhdGl2ZSBlcnJuby4gIFRoZSBhbGxvY2F0ZWQKKyAqIGNsb2NrIHdpbGwgcnVuIHdpdGggYSBwZXJpb2Qgb2YgKDJecHJlc2NhbGUgKiBkaXYpIC8gTUNLLCBvciB0d2ljZSBhcworICogbG9uZyBpZiBjZW50ZXIgYWxpZ25lZCBQV00gb3V0cHV0IGlzIHVzZWQuICBUaGUgY2xvY2sgbXVzdCBsYXRlciBiZQorICogZGVjb25maWd1cmVkIHVzaW5nIHB3bV9jbGtfZnJlZSgpLgorICovCitpbnQgcHdtX2Nsa19hbGxvYyh1bnNpZ25lZCBwcmVzY2FsZSwgdW5zaWduZWQgZGl2KQoreworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJdTMyCQltcjsKKwl1MzIJCXZhbCA9IChwcmVzY2FsZSA8PCA4KSB8IGRpdjsKKwlpbnQJCXJldCA9IC1FQlVTWTsKKworCWlmIChwcmVzY2FsZSA+PSAxMCB8fCBkaXYgPT0gMCB8fCBkaXYgPiAyNTUpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnB3bS0+bG9jaywgZmxhZ3MpOworCW1yID0gcHdtX3JlYWRsKHB3bSwgUFdNX01SKTsKKwlpZiAoKG1yICYgMHhmZmZmKSA9PSAwKSB7CisJCW1yIHw9IHZhbDsKKwkJcmV0ID0gUFdNX0NQUl9DTEtBOworCX0KKwlpZiAoKG1yICYgKDB4ZmZmZiA8PCAxNikpID09IDApIHsKKwkJbXIgfD0gdmFsIDw8IDE2OworCQlyZXQgPSBQV01fQ1BSX0NMS0I7CisJfQorCWlmIChyZXQgPiAwKQorCQlwd21fd3JpdGVsKHB3bSwgUFdNX01SLCBtcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHdtLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wocHdtX2Nsa19hbGxvYyk7CisKKy8qKgorICogcHdtX2Nsa19mcmVlIC0gZGVjb25maWd1cmUgYW5kIHJlbGVhc2UgQ0xLQSBvciBDTEtCCisgKgorICogUmV2ZXJzZXMgdGhlIGVmZmVjdCBvZiBwd21fY2xrX2FsbG9jKCkuCisgKi8KK3ZvaWQgcHdtX2Nsa19mcmVlKHVuc2lnbmVkIGNsaykKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXUzMgkJbXI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHdtLT5sb2NrLCBmbGFncyk7CisJbXIgPSBwd21fcmVhZGwocHdtLCBQV01fTVIpOworCWlmIChjbGsgPT0gUFdNX0NQUl9DTEtBKQorCQlwd21fd3JpdGVsKHB3bSwgUFdNX01SLCBtciAmIH4oMHhmZmZmIDw8IDApKTsKKwlpZiAoY2xrID09IFBXTV9DUFJfQ0xLQikKKwkJcHdtX3dyaXRlbChwd20sIFBXTV9NUiwgbXIgJiB+KDB4ZmZmZiA8PCAxNikpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnB3bS0+bG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChwd21fY2xrX2ZyZWUpOworCisvKioKKyAqIHB3bV9jaGFubmVsX2hhbmRsZXIgLSBtYW5hZ2UgY2hhbm5lbCdzIElSUSBoYW5kbGVyCisgKiBAY2g6IHRoZSBjaGFubmVsCisgKiBAaGFuZGxlcjogdGhlIGhhbmRsZXIgdG8gdXNlLCBwb3NzaWJseSBOVUxMCisgKgorICogSWYgdGhlIGhhbmRsZXIgaXMgbm9uLW51bGwsIHRoZSBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGV2ZXJ5CisgKiBwZXJpb2Qgb2YgdGhpcyBQV00gY2hhbm5lbC4gIElmIHRoZSBoYW5kbGVyIGlzIG51bGwsIHRoaXMgY2hhbm5lbAorICogd29uJ3QgZ2VuZXJhdGUgYW4gSVJRLgorICovCitpbnQgcHdtX2NoYW5uZWxfaGFuZGxlcihzdHJ1Y3QgcHdtX2NoYW5uZWwgKmNoLAorCQl2b2lkICgqaGFuZGxlcikoc3RydWN0IHB3bV9jaGFubmVsICpjaCkpCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlpbnQJCXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHdtLT5sb2NrLCBmbGFncyk7CisJdCA9IHB3bWNoZWNrKGNoKTsKKwlpZiAodCA+PSAwKSB7CisJCXB3bS0+aGFuZGxlclt0XSA9IGhhbmRsZXI7CisJCXB3bV93cml0ZWwocHdtLCBoYW5kbGVyID8gUFdNX0lFUiA6IFBXTV9JRFIsIDEgPDwgdCk7CisJCXQgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwd20tPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiB0OworfQorRVhQT1JUX1NZTUJPTChwd21fY2hhbm5lbF9oYW5kbGVyKTsKKworc3RhdGljIGlycXJldHVybl90IHB3bV9pcnEoaW50IGlkLCB2b2lkICpfcHdtKQoreworCXN0cnVjdCBwd20JKnAgPSBfcHdtOworCWlycXJldHVybl90CWhhbmRsZWQgPSBJUlFfTk9ORTsKKwl1MzIJCWlycXN0YXQ7CisJaW50CQlpbmRleDsKKworCXNwaW5fbG9jaygmcC0+bG9jayk7CisKKwkvKiBhY2sgaXJxcywgdGhlbiBoYW5kbGUgdGhlbSAqLworCWlycXN0YXQgPSBwd21fcmVhZGwocHdtLCBQV01fSVNSKTsKKworCXdoaWxlIChpcnFzdGF0KSB7CisJCXN0cnVjdCBwd21fY2hhbm5lbCAqY2g7CisJCXZvaWQgKCpoYW5kbGVyKShzdHJ1Y3QgcHdtX2NoYW5uZWwgKmNoKTsKKworCQlpbmRleCA9IGZmcyhpcnFzdGF0KSAtIDE7CisJCWlycXN0YXQgJj0gfigxIDw8IGluZGV4KTsKKwkJY2ggPSBwd20tPmNoYW5uZWxbaW5kZXhdOworCQloYW5kbGVyID0gcHdtLT5oYW5kbGVyW2luZGV4XTsKKwkJaWYgKGhhbmRsZXIgJiYgY2gpIHsKKwkJCXNwaW5fdW5sb2NrKCZwLT5sb2NrKTsKKwkJCWhhbmRsZXIoY2gpOworCQkJc3Bpbl9sb2NrKCZwLT5sb2NrKTsKKwkJCWhhbmRsZWQgPSBJUlFfSEFORExFRDsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrKCZwLT5sb2NrKTsKKwlyZXR1cm4gaGFuZGxlZDsKK30KKworc3RhdGljIGludCBfX2luaXQgcHdtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpbnQgaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwl1MzIgKm1wID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHB3bSAqcDsKKwlpbnQgc3RhdHVzID0gLUVJTzsKKworCWlmIChwd20pCisJCXJldHVybiAtRUJVU1k7CisJaWYgKCFyIHx8IGlycSA8IDAgfHwgIW1wIHx8ICEqbXApCisJCXJldHVybiAtRU5PREVWOworCWlmICgqbXAgJiB+KCgxPDxQV01fTkNIQU4pLTEpKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJtYXNrIDB4JXggLi4uIG1vcmUgdGhhbiAlZCBjaGFubmVsc1xuIiwKKwkJCSptcCwgUFdNX05DSEFOKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcCA9IGt6YWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pbml0KCZwLT5sb2NrKTsKKwlwLT5wZGV2ID0gcGRldjsKKwlwLT5tYXNrID0gKm1wOworCXAtPmlycSA9IGlycTsKKwlwLT5iYXNlID0gaW9yZW1hcChyLT5zdGFydCwgci0+ZW5kIC0gci0+c3RhcnQgKyAxKTsKKwlpZiAoIXAtPmJhc2UpCisJCWdvdG8gZmFpbDsKKwlwLT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJtY2siKTsKKwlpZiAoSVNfRVJSKHAtPmNsaykpIHsKKwkJc3RhdHVzID0gUFRSX0VSUihwLT5jbGspOworCQlwLT5jbGsgPSBOVUxMOworCQlnb3RvIGZhaWw7CisJfQorCisJc3RhdHVzID0gcmVxdWVzdF9pcnEoaXJxLCBwd21faXJxLCAwLCBwZGV2LT5uYW1lLCBwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBmYWlsOworCisJcHdtID0gcDsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwKTsKKworCXJldHVybiAwOworCitmYWlsOgorCWlmIChwLT5jbGspCisJCWNsa19wdXQocC0+Y2xrKTsKKwlpZiAocC0+YmFzZSkKKwkJaW91bm1hcChwLT5iYXNlKTsKKworCWtmcmVlKHApOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IHB3bV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcHdtICpwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAocCAhPSBwd20pCisJCXJldHVybiAtRUlOVkFMOworCisJY2xrX2VuYWJsZShwd20tPmNsayk7CisJcHdtX3dyaXRlbChwd20sIFBXTV9ESVMsICgxIDw8IFBXTV9OQ0hBTikgLSAxKTsKKwlwd21fd3JpdGVsKHB3bSwgUFdNX0lEUiwgKDEgPDwgUFdNX05DSEFOKSAtIDEpOworCWNsa19kaXNhYmxlKHB3bS0+Y2xrKTsKKworCXB3bSA9IE5VTEw7CisKKwlmcmVlX2lycShwLT5pcnEsIHApOworCWNsa19wdXQocC0+Y2xrKTsKKwlpb3VubWFwKHAtPmJhc2UpOworCWtmcmVlKHApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGF0bWVsX3B3bV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYXRtZWxfcHdtIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucmVtb3ZlID0gX19leGl0X3AocHdtX3JlbW92ZSksCisKKwkvKiBOT1RFOiBQV00gY2FuIGtlZXAgcnVubmluZyBpbiBBVlIzMiAiaWRsZSIgYW5kICJmcm96ZW4iIHN0YXRlczsKKwkgKiBhbmQgYWxsIEFUOTFzYW05MjYzIHN0YXRlcywgYWxiZWl0IGF0IHJlZHVjZWQgY2xvY2sgcmF0ZSBpZgorCSAqIE1DSyBiZWNvbWVzIHRoZSBzbG93IGNsb2NrIChpLmUuIHdoYXQgTGludXggbGFiZWxzIFNUUikuCisJICovCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwd21faW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmF0bWVsX3B3bV9kcml2ZXIsIHB3bV9wcm9iZSk7Cit9Cittb2R1bGVfaW5pdChwd21faW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwd21fZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhdG1lbF9wd21fZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHB3bV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIEFUMzIvQVQ5MSBQV00gbW9kdWxlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvZW5jbG9zdXJlLmMgYi9kcml2ZXJzL21pc2MvZW5jbG9zdXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjYjBlOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWlzYy9lbmNsb3N1cmUuYwpAQCAtMCwwICsxLDQ4NCBAQAorLyoKKyAqIEVuY2xvc3VyZSBTZXJ2aWNlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBKYW1lcyBCb3R0b21sZXkgPEphbWVzLkJvdHRvbWxleUBIYW5zZW5QYXJ0bmVyc2hpcC5jb20+CisgKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioKKyoqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoqICB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqKgorKiogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqKgorKiogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyoqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2VuY2xvc3VyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorCitzdGF0aWMgTElTVF9IRUFEKGNvbnRhaW5lcl9saXN0KTsKK3N0YXRpYyBERUZJTkVfTVVURVgoY29udGFpbmVyX2xpc3RfbG9jayk7CitzdGF0aWMgc3RydWN0IGNsYXNzIGVuY2xvc3VyZV9jbGFzczsKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgZW5jbG9zdXJlX2NvbXBvbmVudF9jbGFzczsKKworLyoqCisgKiBlbmNsb3N1cmVfZmluZCAtIGZpbmQgYW4gZW5jbG9zdXJlIGdpdmVuIGEgZGV2aWNlCisgKiBAZGV2Ogl0aGUgZGV2aWNlIHRvIGZpbmQgZm9yCisgKgorICogTG9va3MgdGhyb3VnaCB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIGVuY2xvc3VyZXMgdG8gc2VlCisgKiBpZiBpdCBjYW4gZmluZCBhIG1hdGNoIGZvciBhIGRldmljZS4gIFJldHVybnMgTlVMTCBpZiBubworICogZW5jbG9zdXJlIGlzIGZvdW5kLiBPYnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBlbmNsb3N1cmUgY2xhc3MKKyAqIGRldmljZSB3aGljaCBtdXN0IGJlIHJlbGVhc2VkIHdpdGggY2xhc3NfZGV2aWNlX3B1dCgpLgorICovCitzdHJ1Y3QgZW5jbG9zdXJlX2RldmljZSAqZW5jbG9zdXJlX2ZpbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICplZGV2ID0gTlVMTDsKKworCW11dGV4X2xvY2soJmNvbnRhaW5lcl9saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZWRldiwgJmNvbnRhaW5lcl9saXN0LCBub2RlKSB7CisJCWlmIChlZGV2LT5jZGV2LmRldiA9PSBkZXYpIHsKKwkJCWNsYXNzX2RldmljZV9nZXQoJmVkZXYtPmNkZXYpOworCQkJbXV0ZXhfdW5sb2NrKCZjb250YWluZXJfbGlzdF9sb2NrKTsKKwkJCXJldHVybiBlZGV2OworCQl9CisJfQorCW11dGV4X3VubG9jaygmY29udGFpbmVyX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGVuY2xvc3VyZV9maW5kKTsKKworLyoqCisgKiBlbmNsb3N1cmVfZm9yX2VhY2hfZGV2aWNlIC0gY2FsbHMgYSBmdW5jdGlvbiBmb3IgZWFjaCBlbmNsb3N1cmUKKyAqIEBmbjoJCXRoZSBmdW5jdGlvbiB0byBjYWxsCisgKiBAZGF0YToJdGhlIGRhdGEgdG8gcGFzcyB0byBlYWNoIGNhbGwKKyAqCisgKiBMb29wcyBvdmVyIGFsbCB0aGUgZW5jbG9zdXJlcyBjYWxsaW5nIHRoZSBmdW5jdGlvbi4KKyAqCisgKiBOb3RlLCB0aGlzIGZ1bmN0aW9uIHVzZXMgYSBtdXRleCB3aGljaCB3aWxsIGJlIGhlbGQgYWNyb3NzIGNhbGxzIHRvCisgKiBAZm4sIHNvIGl0IG11c3QgaGF2ZSBub24gYXRvbWljIGNvbnRleHQsIGFuZCBAZm4gbWF5IChhbHRob3VnaCBpdAorICogc2hvdWxkIG5vdCkgc2xlZXAgb3Igb3RoZXJ3aXNlIGNhdXNlIHRoZSBtdXRleCB0byBiZSBoZWxkIGZvcgorICogaW5kZWZpbml0ZSBwZXJpb2RzCisgKi8KK2ludCBlbmNsb3N1cmVfZm9yX2VhY2hfZGV2aWNlKGludCAoKmZuKShzdHJ1Y3QgZW5jbG9zdXJlX2RldmljZSAqLCB2b2lkICopLAorCQkJICAgICAgdm9pZCAqZGF0YSkKK3sKKwlpbnQgZXJyb3IgPSAwOworCXN0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICplZGV2OworCisJbXV0ZXhfbG9jaygmY29udGFpbmVyX2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlZGV2LCAmY29udGFpbmVyX2xpc3QsIG5vZGUpIHsKKwkJZXJyb3IgPSBmbihlZGV2LCBkYXRhKTsKKwkJaWYgKGVycm9yKQorCQkJYnJlYWs7CisJfQorCW11dGV4X3VubG9jaygmY29udGFpbmVyX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChlbmNsb3N1cmVfZm9yX2VhY2hfZGV2aWNlKTsKKworLyoqCisgKiBlbmNsb3N1cmVfcmVnaXN0ZXIgLSByZWdpc3RlciBkZXZpY2UgYXMgYW4gZW5jbG9zdXJlCisgKgorICogQGRldjoJZGV2aWNlIGNvbnRhaW5pbmcgdGhlIGVuY2xvc3VyZQorICogQGNvbXBvbmVudHM6CW51bWJlciBvZiBjb21wb25lbnRzIGluIHRoZSBlbmNsb3N1cmUKKyAqCisgKiBUaGlzIHNldHMgdXAgdGhlIGRldmljZSBmb3IgYmVpbmcgYW4gZW5jbG9zdXJlLiAgTm90ZSB0aGF0IEBkZXYgZG9lcworICogbm90IGhhdmUgdG8gYmUgYSBkZWRpY2F0ZWQgZW5jbG9zdXJlIGRldmljZS4gIEl0IG1heSBiZSBzb21lIG90aGVyIHR5cGUKKyAqIG9mIGRldmljZSB0aGF0IGFkZGl0aW9uYWxseSByZXNwb25kcyB0byBlbmNsb3N1cmUgc2VydmljZXMKKyAqLworc3RydWN0IGVuY2xvc3VyZV9kZXZpY2UgKgorZW5jbG9zdXJlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSwgaW50IGNvbXBvbmVudHMsCisJCSAgIHN0cnVjdCBlbmNsb3N1cmVfY29tcG9uZW50X2NhbGxiYWNrcyAqY2IpCit7CisJc3RydWN0IGVuY2xvc3VyZV9kZXZpY2UgKmVkZXYgPQorCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgZW5jbG9zdXJlX2RldmljZSkgKworCQkJc2l6ZW9mKHN0cnVjdCBlbmNsb3N1cmVfY29tcG9uZW50KSpjb21wb25lbnRzLAorCQkJR0ZQX0tFUk5FTCk7CisJaW50IGVyciwgaTsKKworCUJVR19PTighY2IpOworCisJaWYgKCFlZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWVkZXYtPmNvbXBvbmVudHMgPSBjb21wb25lbnRzOworCisJZWRldi0+Y2Rldi5jbGFzcyA9ICZlbmNsb3N1cmVfY2xhc3M7CisJZWRldi0+Y2Rldi5kZXYgPSBnZXRfZGV2aWNlKGRldik7CisJZWRldi0+Y2IgPSBjYjsKKwlzbnByaW50ZihlZGV2LT5jZGV2LmNsYXNzX2lkLCBCVVNfSURfU0laRSwgIiVzIiwgbmFtZSk7CisJZXJyID0gY2xhc3NfZGV2aWNlX3JlZ2lzdGVyKCZlZGV2LT5jZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCBjb21wb25lbnRzOyBpKyspCisJCWVkZXYtPmNvbXBvbmVudFtpXS5udW1iZXIgPSAtMTsKKworCW11dGV4X2xvY2soJmNvbnRhaW5lcl9saXN0X2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmVkZXYtPm5vZGUsICZjb250YWluZXJfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZjb250YWluZXJfbGlzdF9sb2NrKTsKKworCXJldHVybiBlZGV2OworCisgZXJyOgorCXB1dF9kZXZpY2UoZWRldi0+Y2Rldi5kZXYpOworCWtmcmVlKGVkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChlbmNsb3N1cmVfcmVnaXN0ZXIpOworCitzdGF0aWMgc3RydWN0IGVuY2xvc3VyZV9jb21wb25lbnRfY2FsbGJhY2tzIGVuY2xvc3VyZV9udWxsX2NhbGxiYWNrczsKKworLyoqCisgKiBlbmNsb3N1cmVfdW5yZWdpc3RlciAtIHJlbW92ZSBhbiBlbmNsb3N1cmUKKyAqCisgKiBAZWRldjoJdGhlIHJlZ2lzdGVyZWQgZW5jbG9zdXJlIHRvIHJlbW92ZTsKKyAqLwordm9pZCBlbmNsb3N1cmVfdW5yZWdpc3RlcihzdHJ1Y3QgZW5jbG9zdXJlX2RldmljZSAqZWRldikKK3sKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJmNvbnRhaW5lcl9saXN0X2xvY2spOworCWxpc3RfZGVsKCZlZGV2LT5ub2RlKTsKKwltdXRleF91bmxvY2soJmNvbnRhaW5lcl9saXN0X2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IGVkZXYtPmNvbXBvbmVudHM7IGkrKykKKwkJaWYgKGVkZXYtPmNvbXBvbmVudFtpXS5udW1iZXIgIT0gLTEpCisJCQljbGFzc19kZXZpY2VfdW5yZWdpc3RlcigmZWRldi0+Y29tcG9uZW50W2ldLmNkZXYpOworCisJLyogcHJldmVudCBhbnkgY2FsbGJhY2tzIGludG8gc2VydmljZSB1c2VyICovCisJZWRldi0+Y2IgPSAmZW5jbG9zdXJlX251bGxfY2FsbGJhY2tzOworCWNsYXNzX2RldmljZV91bnJlZ2lzdGVyKCZlZGV2LT5jZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGVuY2xvc3VyZV91bnJlZ2lzdGVyKTsKKworc3RhdGljIHZvaWQgZW5jbG9zdXJlX3JlbGVhc2Uoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldikKK3sKKwlzdHJ1Y3QgZW5jbG9zdXJlX2RldmljZSAqZWRldiA9IHRvX2VuY2xvc3VyZV9kZXZpY2UoY2Rldik7CisKKwlwdXRfZGV2aWNlKGNkZXYtPmRldik7CisJa2ZyZWUoZWRldik7Cit9CisKK3N0YXRpYyB2b2lkIGVuY2xvc3VyZV9jb21wb25lbnRfcmVsZWFzZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2KQoreworCWlmIChjZGV2LT5kZXYpCisJCXB1dF9kZXZpY2UoY2Rldi0+ZGV2KTsKKwljbGFzc19kZXZpY2VfcHV0KGNkZXYtPnBhcmVudCk7Cit9CisKKy8qKgorICogZW5jbG9zdXJlX2NvbXBvbmVudF9yZWdpc3RlciAtIGFkZCBhIHBhcnRpY3VsYXIgY29tcG9uZW50IHRvIGFuIGVuY2xvc3VyZQorICogQGVkZXY6CXRoZSBlbmNsb3N1cmUgdG8gYWRkIHRoZSBjb21wb25lbnQKKyAqIEBudW06CXRoZSBkZXZpY2UgbnVtYmVyCisgKiBAdHlwZToJdGhlIHR5cGUgb2YgY29tcG9uZW50IGJlaW5nIGFkZGVkCisgKiBAbmFtZToJYW4gb3B0aW9uYWwgbmFtZSB0byBhcHBlYXIgaW4gc3lzZnMgKGxlYXZlIE5VTEwgaWYgbm9uZSkKKyAqCisgKiBSZWdpc3RlcnMgdGhlIGNvbXBvbmVudC4gIFRoZSBuYW1lIGlzIG9wdGlvbmFsIGZvciBlbmNsb3N1cmVzIHRoYXQKKyAqIGdpdmUgdGhlaXIgY29tcG9uZW50cyBhIHVuaXF1ZSBuYW1lLiAgSWYgbm90LCBsZWF2ZSB0aGUgZmllbGQgTlVMTAorICogYW5kIGEgbmFtZSB3aWxsIGJlIGFzc2lnbmVkLgorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBlbmNsb3N1cmUgY29tcG9uZW50IG9yIGFuIGVycm9yLgorICovCitzdHJ1Y3QgZW5jbG9zdXJlX2NvbXBvbmVudCAqCitlbmNsb3N1cmVfY29tcG9uZW50X3JlZ2lzdGVyKHN0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICplZGV2LAorCQkJICAgICB1bnNpZ25lZCBpbnQgbnVtYmVyLAorCQkJICAgICBlbnVtIGVuY2xvc3VyZV9jb21wb25lbnRfdHlwZSB0eXBlLAorCQkJICAgICBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBlbmNsb3N1cmVfY29tcG9uZW50ICplY29tcDsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2OworCWludCBlcnI7CisKKwlpZiAobnVtYmVyID49IGVkZXYtPmNvbXBvbmVudHMpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJZWNvbXAgPSAmZWRldi0+Y29tcG9uZW50W251bWJlcl07CisKKwlpZiAoZWNvbXAtPm51bWJlciAhPSAtMSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwllY29tcC0+dHlwZSA9IHR5cGU7CisJZWNvbXAtPm51bWJlciA9IG51bWJlcjsKKwljZGV2ID0gJmVjb21wLT5jZGV2OworCWNkZXYtPnBhcmVudCA9IGNsYXNzX2RldmljZV9nZXQoJmVkZXYtPmNkZXYpOworCWNkZXYtPmNsYXNzID0gJmVuY2xvc3VyZV9jb21wb25lbnRfY2xhc3M7CisJaWYgKG5hbWUpCisJCXNucHJpbnRmKGNkZXYtPmNsYXNzX2lkLCBCVVNfSURfU0laRSwgIiVzIiwgbmFtZSk7CisJZWxzZQorCQlzbnByaW50ZihjZGV2LT5jbGFzc19pZCwgQlVTX0lEX1NJWkUsICIldSIsIG51bWJlcik7CisKKwllcnIgPSBjbGFzc19kZXZpY2VfcmVnaXN0ZXIoY2Rldik7CisJaWYgKGVycikKKwkJRVJSX1BUUihlcnIpOworCisJcmV0dXJuIGVjb21wOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZW5jbG9zdXJlX2NvbXBvbmVudF9yZWdpc3Rlcik7CisKKy8qKgorICogZW5jbG9zdXJlX2FkZF9kZXZpY2UgLSBhZGQgYSBkZXZpY2UgYXMgYmVpbmcgcGFydCBvZiBhbiBlbmNsb3N1cmUKKyAqIEBlZGV2Ogl0aGUgZW5jbG9zdXJlIGRldmljZSBiZWluZyBhZGRlZCB0by4KKyAqIEBudW06CXRoZSBudW1iZXIgb2YgdGhlIGNvbXBvbmVudAorICogQGRldjoJdGhlIGRldmljZSBiZWluZyBhZGRlZAorICoKKyAqIERlY2xhcmVzIGEgcmVhbCBkZXZpY2UgdG8gcmVzaWRlIGluIHNsb3QgKG9yIGlkZW50aWZpZXIpIEBudW0gb2YgYW4KKyAqIGVuY2xvc3VyZS4gIFRoaXMgd2lsbCBjYXVzZSB0aGUgcmVsZXZhbnQgc3lzZnMgbGlua3MgdG8gYXBwZWFyLgorICogVGhpcyBmdW5jdGlvbiBtYXkgYWxzbyBiZSB1c2VkIHRvIGNoYW5nZSBhIGRldmljZSBhc3NvY2lhdGVkIHdpdGgKKyAqIGFuIGVuY2xvc3VyZSB3aXRob3V0IGhhdmluZyB0byBjYWxsIGVuY2xvc3VyZV9yZW1vdmVfZGV2aWNlKCkgaW4KKyAqIGJldHdlZW4uCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYW4gZXJyb3IuCisgKi8KK2ludCBlbmNsb3N1cmVfYWRkX2RldmljZShzdHJ1Y3QgZW5jbG9zdXJlX2RldmljZSAqZWRldiwgaW50IGNvbXBvbmVudCwKKwkJCSBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2RldjsKKworCWlmICghZWRldiB8fCBjb21wb25lbnQgPj0gZWRldi0+Y29tcG9uZW50cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljZGV2ID0gJmVkZXYtPmNvbXBvbmVudFtjb21wb25lbnRdLmNkZXY7CisKKwljbGFzc19kZXZpY2VfZGVsKGNkZXYpOworCWlmIChjZGV2LT5kZXYpCisJCXB1dF9kZXZpY2UoY2Rldi0+ZGV2KTsKKwljZGV2LT5kZXYgPSBnZXRfZGV2aWNlKGRldik7CisJcmV0dXJuIGNsYXNzX2RldmljZV9hZGQoY2Rldik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChlbmNsb3N1cmVfYWRkX2RldmljZSk7CisKKy8qKgorICogZW5jbG9zdXJlX3JlbW92ZV9kZXZpY2UgLSByZW1vdmUgYSBkZXZpY2UgZnJvbSBhbiBlbmNsb3N1cmUKKyAqIEBlZGV2Ogl0aGUgZW5jbG9zdXJlIGRldmljZQorICogQG51bToJdGhlIG51bWJlciBvZiB0aGUgY29tcG9uZW50IHRvIHJlbW92ZQorICoKKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzIG9yIGFuIGVycm9yLgorICoKKyAqLworaW50IGVuY2xvc3VyZV9yZW1vdmVfZGV2aWNlKHN0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICplZGV2LCBpbnQgY29tcG9uZW50KQoreworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXY7CisKKwlpZiAoIWVkZXYgfHwgY29tcG9uZW50ID49IGVkZXYtPmNvbXBvbmVudHMpCisJCXJldHVybiAtRUlOVkFMOworCisJY2RldiA9ICZlZGV2LT5jb21wb25lbnRbY29tcG9uZW50XS5jZGV2OworCisJY2xhc3NfZGV2aWNlX2RlbChjZGV2KTsKKwlpZiAoY2Rldi0+ZGV2KQorCQlwdXRfZGV2aWNlKGNkZXYtPmRldik7CisJY2Rldi0+ZGV2ID0gTlVMTDsKKwlyZXR1cm4gY2xhc3NfZGV2aWNlX2FkZChjZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGVuY2xvc3VyZV9yZW1vdmVfZGV2aWNlKTsKKworLyoKKyAqIHN5c2ZzIHBpZWNlcyBiZWxvdworICovCisKK3N0YXRpYyBzc2l6ZV90IGVuY2xvc3VyZV9zaG93X2NvbXBvbmVudHMoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICplZGV2ID0gdG9fZW5jbG9zdXJlX2RldmljZShjZGV2KTsKKworCXJldHVybiBzbnByaW50ZihidWYsIDQwLCAiJWRcbiIsIGVkZXYtPmNvbXBvbmVudHMpOworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgZW5jbG9zdXJlX2F0dHJzW10gPSB7CisJX19BVFRSKGNvbXBvbmVudHMsIFNfSVJVR08sIGVuY2xvc3VyZV9zaG93X2NvbXBvbmVudHMsIE5VTEwpLAorCV9fQVRUUl9OVUxMCit9OworCitzdGF0aWMgc3RydWN0IGNsYXNzIGVuY2xvc3VyZV9jbGFzcyA9IHsKKwkubmFtZQkJCT0gImVuY2xvc3VyZSIsCisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkucmVsZWFzZQkJPSBlbmNsb3N1cmVfcmVsZWFzZSwKKwkuY2xhc3NfZGV2X2F0dHJzCT0gZW5jbG9zdXJlX2F0dHJzLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGVuY2xvc3VyZV9zdGF0dXMgW10gPSB7CisJW0VOQ0xPU1VSRV9TVEFUVVNfVU5TVVBQT1JURURdID0gInVuc3VwcG9ydGVkIiwKKwlbRU5DTE9TVVJFX1NUQVRVU19PS10gPSAiT0siLAorCVtFTkNMT1NVUkVfU1RBVFVTX0NSSVRJQ0FMXSA9ICJjcml0aWNhbCIsCisJW0VOQ0xPU1VSRV9TVEFUVVNfTk9OX0NSSVRJQ0FMXSA9ICJub24tY3JpdGljYWwiLAorCVtFTkNMT1NVUkVfU1RBVFVTX1VOUkVDT1ZFUkFCTEVdID0gInVucmVjb3ZlcmFibGUiLAorCVtFTkNMT1NVUkVfU1RBVFVTX05PVF9JTlNUQUxMRURdID0gIm5vdCBpbnN0YWxsZWQiLAorCVtFTkNMT1NVUkVfU1RBVFVTX1VOS05PV05dID0gInVua25vd24iLAorCVtFTkNMT1NVUkVfU1RBVFVTX1VOQVZBSUxBQkxFXSA9ICJ1bmF2YWlsYWJsZSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZW5jbG9zdXJlX3R5cGUgW10gPSB7CisJW0VOQ0xPU1VSRV9DT01QT05FTlRfREVWSUNFXSA9ICJkZXZpY2UiLAorCVtFTkNMT1NVUkVfQ09NUE9ORU5UX0FSUkFZX0RFVklDRV0gPSAiYXJyYXkgZGV2aWNlIiwKK307CisKK3N0YXRpYyBzc2l6ZV90IGdldF9jb21wb25lbnRfZmF1bHQoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICplZGV2ID0gdG9fZW5jbG9zdXJlX2RldmljZShjZGV2LT5wYXJlbnQpOworCXN0cnVjdCBlbmNsb3N1cmVfY29tcG9uZW50ICplY29tcCA9IHRvX2VuY2xvc3VyZV9jb21wb25lbnQoY2Rldik7CisKKwlpZiAoZWRldi0+Y2ItPmdldF9mYXVsdCkKKwkJZWRldi0+Y2ItPmdldF9mYXVsdChlZGV2LCBlY29tcCk7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgNDAsICIlZFxuIiwgZWNvbXAtPmZhdWx0KTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2NvbXBvbmVudF9mYXVsdChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjb25zdCBjaGFyICpidWYsCisJCQkJICAgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICplZGV2ID0gdG9fZW5jbG9zdXJlX2RldmljZShjZGV2LT5wYXJlbnQpOworCXN0cnVjdCBlbmNsb3N1cmVfY29tcG9uZW50ICplY29tcCA9IHRvX2VuY2xvc3VyZV9jb21wb25lbnQoY2Rldik7CisJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CisKKwlpZiAoZWRldi0+Y2ItPnNldF9mYXVsdCkKKwkJZWRldi0+Y2ItPnNldF9mYXVsdChlZGV2LCBlY29tcCwgdmFsKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdldF9jb21wb25lbnRfc3RhdHVzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZW5jbG9zdXJlX2RldmljZSAqZWRldiA9IHRvX2VuY2xvc3VyZV9kZXZpY2UoY2Rldi0+cGFyZW50KTsKKwlzdHJ1Y3QgZW5jbG9zdXJlX2NvbXBvbmVudCAqZWNvbXAgPSB0b19lbmNsb3N1cmVfY29tcG9uZW50KGNkZXYpOworCisJaWYgKGVkZXYtPmNiLT5nZXRfc3RhdHVzKQorCQllZGV2LT5jYi0+Z2V0X3N0YXR1cyhlZGV2LCBlY29tcCk7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgNDAsICIlc1xuIiwgZW5jbG9zdXJlX3N0YXR1c1tlY29tcC0+c3RhdHVzXSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9jb21wb25lbnRfc3RhdHVzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkgICBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGVuY2xvc3VyZV9kZXZpY2UgKmVkZXYgPSB0b19lbmNsb3N1cmVfZGV2aWNlKGNkZXYtPnBhcmVudCk7CisJc3RydWN0IGVuY2xvc3VyZV9jb21wb25lbnQgKmVjb21wID0gdG9fZW5jbG9zdXJlX2NvbXBvbmVudChjZGV2KTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGVuY2xvc3VyZV9zdGF0dXNbaV07IGkrKykgeworCQlpZiAoc3RybmNtcChidWYsIGVuY2xvc3VyZV9zdGF0dXNbaV0sCisJCQkgICAgc3RybGVuKGVuY2xvc3VyZV9zdGF0dXNbaV0pKSA9PSAwICYmCisJCSAgICAoYnVmW3N0cmxlbihlbmNsb3N1cmVfc3RhdHVzW2ldKV0gPT0gJ1xuJyB8fAorCQkgICAgIGJ1ZltzdHJsZW4oZW5jbG9zdXJlX3N0YXR1c1tpXSldID09ICdcMCcpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGVuY2xvc3VyZV9zdGF0dXNbaV0gJiYgZWRldi0+Y2ItPnNldF9zdGF0dXMpIHsKKwkJZWRldi0+Y2ItPnNldF9zdGF0dXMoZWRldiwgZWNvbXAsIGkpOworCQlyZXR1cm4gY291bnQ7CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3NpemVfdCBnZXRfY29tcG9uZW50X2FjdGl2ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGVuY2xvc3VyZV9kZXZpY2UgKmVkZXYgPSB0b19lbmNsb3N1cmVfZGV2aWNlKGNkZXYtPnBhcmVudCk7CisJc3RydWN0IGVuY2xvc3VyZV9jb21wb25lbnQgKmVjb21wID0gdG9fZW5jbG9zdXJlX2NvbXBvbmVudChjZGV2KTsKKworCWlmIChlZGV2LT5jYi0+Z2V0X2FjdGl2ZSkKKwkJZWRldi0+Y2ItPmdldF9hY3RpdmUoZWRldiwgZWNvbXApOworCXJldHVybiBzbnByaW50ZihidWYsIDQwLCAiJWRcbiIsIGVjb21wLT5hY3RpdmUpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfY29tcG9uZW50X2FjdGl2ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjb25zdCBjaGFyICpidWYsCisJCQkJICAgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICplZGV2ID0gdG9fZW5jbG9zdXJlX2RldmljZShjZGV2LT5wYXJlbnQpOworCXN0cnVjdCBlbmNsb3N1cmVfY29tcG9uZW50ICplY29tcCA9IHRvX2VuY2xvc3VyZV9jb21wb25lbnQoY2Rldik7CisJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CisKKwlpZiAoZWRldi0+Y2ItPnNldF9hY3RpdmUpCisJCWVkZXYtPmNiLT5zZXRfYWN0aXZlKGVkZXYsIGVjb21wLCB2YWwpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgZ2V0X2NvbXBvbmVudF9sb2NhdGUoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICplZGV2ID0gdG9fZW5jbG9zdXJlX2RldmljZShjZGV2LT5wYXJlbnQpOworCXN0cnVjdCBlbmNsb3N1cmVfY29tcG9uZW50ICplY29tcCA9IHRvX2VuY2xvc3VyZV9jb21wb25lbnQoY2Rldik7CisKKwlpZiAoZWRldi0+Y2ItPmdldF9sb2NhdGUpCisJCWVkZXYtPmNiLT5nZXRfbG9jYXRlKGVkZXYsIGVjb21wKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCA0MCwgIiVkXG4iLCBlY29tcC0+bG9jYXRlKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2NvbXBvbmVudF9sb2NhdGUoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY29uc3QgY2hhciAqYnVmLAorCQkJCSAgIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZW5jbG9zdXJlX2RldmljZSAqZWRldiA9IHRvX2VuY2xvc3VyZV9kZXZpY2UoY2Rldi0+cGFyZW50KTsKKwlzdHJ1Y3QgZW5jbG9zdXJlX2NvbXBvbmVudCAqZWNvbXAgPSB0b19lbmNsb3N1cmVfY29tcG9uZW50KGNkZXYpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDApOworCisJaWYgKGVkZXYtPmNiLT5zZXRfbG9jYXRlKQorCQllZGV2LT5jYi0+c2V0X2xvY2F0ZShlZGV2LCBlY29tcCwgdmFsKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdldF9jb21wb25lbnRfdHlwZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGVuY2xvc3VyZV9jb21wb25lbnQgKmVjb21wID0gdG9fZW5jbG9zdXJlX2NvbXBvbmVudChjZGV2KTsKKworCXJldHVybiBzbnByaW50ZihidWYsIDQwLCAiJXNcbiIsIGVuY2xvc3VyZV90eXBlW2Vjb21wLT50eXBlXSk7Cit9CisKKworc3RhdGljIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlIGVuY2xvc3VyZV9jb21wb25lbnRfYXR0cnNbXSA9IHsKKwlfX0FUVFIoZmF1bHQsIFNfSVJVR08gfCBTX0lXVVNSLCBnZXRfY29tcG9uZW50X2ZhdWx0LAorCSAgICAgICBzZXRfY29tcG9uZW50X2ZhdWx0KSwKKwlfX0FUVFIoc3RhdHVzLCBTX0lSVUdPIHwgU19JV1VTUiwgZ2V0X2NvbXBvbmVudF9zdGF0dXMsCisJICAgICAgIHNldF9jb21wb25lbnRfc3RhdHVzKSwKKwlfX0FUVFIoYWN0aXZlLCBTX0lSVUdPIHwgU19JV1VTUiwgZ2V0X2NvbXBvbmVudF9hY3RpdmUsCisJICAgICAgIHNldF9jb21wb25lbnRfYWN0aXZlKSwKKwlfX0FUVFIobG9jYXRlLCBTX0lSVUdPIHwgU19JV1VTUiwgZ2V0X2NvbXBvbmVudF9sb2NhdGUsCisJICAgICAgIHNldF9jb21wb25lbnRfbG9jYXRlKSwKKwlfX0FUVFIodHlwZSwgU19JUlVHTywgZ2V0X2NvbXBvbmVudF90eXBlLCBOVUxMKSwKKwlfX0FUVFJfTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBjbGFzcyBlbmNsb3N1cmVfY29tcG9uZW50X2NsYXNzID0gIHsKKwkubmFtZQkJCT0gImVuY2xvc3VyZV9jb21wb25lbnQiLAorCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmNsYXNzX2Rldl9hdHRycwk9IGVuY2xvc3VyZV9jb21wb25lbnRfYXR0cnMsCisJLnJlbGVhc2UJCT0gZW5jbG9zdXJlX2NvbXBvbmVudF9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZW5jbG9zdXJlX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gY2xhc3NfcmVnaXN0ZXIoJmVuY2xvc3VyZV9jbGFzcyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBjbGFzc19yZWdpc3RlcigmZW5jbG9zdXJlX2NvbXBvbmVudF9jbGFzcyk7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0OworCisJcmV0dXJuIDA7CisgZXJyX291dDoKKwljbGFzc191bnJlZ2lzdGVyKCZlbmNsb3N1cmVfY2xhc3MpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGVuY2xvc3VyZV9leGl0KHZvaWQpCit7CisJY2xhc3NfdW5yZWdpc3RlcigmZW5jbG9zdXJlX2NvbXBvbmVudF9jbGFzcyk7CisJY2xhc3NfdW5yZWdpc3RlcigmZW5jbG9zdXJlX2NsYXNzKTsKK30KKworbW9kdWxlX2luaXQoZW5jbG9zdXJlX2luaXQpOworbW9kdWxlX2V4aXQoZW5jbG9zdXJlX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJKYW1lcyBCb3R0b21sZXkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRW5jbG9zdXJlIFNlcnZpY2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvaW50ZWxfbWVubG93LmMgYi9kcml2ZXJzL21pc2MvaW50ZWxfbWVubG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcwOTg0YWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2MvaW50ZWxfbWVubG93LmMKQEAgLTAsMCArMSw1MjYgQEAKKy8qCisgKiAgaW50ZWxfbWVubG93LmMgLSBJbnRlbCBtZW5sb3cgRHJpdmVyIGZvciB0aGVybWFsIG1hbmFnZW1lbnQgZXh0ZW5zaW9uCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOCBJbnRlbCBDb3JwCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IFN1aml0aCBUaG9tYXMgPHN1aml0aC50aG9tYXNAaW50ZWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwOCBaaGFuZyBSdWkgPHJ1aS56aGFuZ0BpbnRlbC5jb20+CisgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogIFRoaXMgZHJpdmVyIGNyZWF0ZXMgdGhlIHN5cyBJL0YgZm9yIHByb2dyYW1taW5nIHRoZSBzZW5zb3JzLgorICogIEl0IGFsc28gaW1wbGVtZW50cyB0aGUgZHJpdmVyIGZvciBpbnRlbCBtZW5sb3cgbWVtb3J5IGNvbnRyb2xsZXIgKGhhcmR3YXJlCisgKiAgaWQgaXMgSU5UMDAwMikgd2hpY2ggbWFrZXMgdXNlIG9mIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBBQ1BJIG1ldGhvZHMKKyAqICB0byBnZXQvc2V0IGJhbmR3aWR0aC4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKworI2luY2x1ZGUgPGxpbnV4L3RoZXJtYWwuaD4KKyNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KKworTU9EVUxFX0FVVEhPUigiVGhvbWFzIFN1aml0aCIpOworTU9EVUxFX0FVVEhPUigiWmhhbmcgUnVpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIE1lbmxvdyBwbGF0Zm9ybSBzcGVjaWZpYyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIE1lbW9yeSBjb250cm9sbGVyIGRldmljZSBjb250cm9sCisgKi8KKworI2RlZmluZSBNRU1PUllfR0VUX0JBTkRXSURUSCAiR1RIUyIKKyNkZWZpbmUgTUVNT1JZX1NFVF9CQU5EV0lEVEggIlNUSFMiCisjZGVmaW5lIE1FTU9SWV9BUkdfQ1VSX0JBTkRXSURUSCAxCisjZGVmaW5lIE1FTU9SWV9BUkdfTUFYX0JBTkRXSURUSCAwCisKK3N0YXRpYyBpbnQgbWVtb3J5X2dldF9pbnRfbWF4X2JhbmR3aWR0aChzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldiwKKwkJCQkJdW5zaWduZWQgbG9uZyAqbWF4X3N0YXRlKQoreworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gY2Rldi0+ZGV2ZGF0YTsKKwlhY3BpX2hhbmRsZSBoYW5kbGUgPSBkZXZpY2UtPmhhbmRsZTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ19saXN0OworCXVuaW9uIGFjcGlfb2JqZWN0IGFyZzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKworCWFyZ19saXN0LmNvdW50ID0gMTsKKwlhcmdfbGlzdC5wb2ludGVyID0gJmFyZzsKKwlhcmcudHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOworCWFyZy5pbnRlZ2VyLnZhbHVlID0gTUVNT1JZX0FSR19NQVhfQkFORFdJRFRIOworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsIE1FTU9SWV9HRVRfQkFORFdJRFRILAorCQkJCSAgICAgICAmYXJnX2xpc3QsICZ2YWx1ZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCSptYXhfc3RhdGUgPSB2YWx1ZSAtIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWVtb3J5X2dldF9tYXhfYmFuZHdpZHRoKHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2LAorCQkJCSAgICBjaGFyICpidWYpCit7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwlpZiAobWVtb3J5X2dldF9pbnRfbWF4X2JhbmR3aWR0aChjZGV2LCAmdmFsdWUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgdmFsdWUpOworfQorCitzdGF0aWMgaW50IG1lbW9yeV9nZXRfY3VyX2JhbmR3aWR0aChzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldiwKKwkJCQkgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gY2Rldi0+ZGV2ZGF0YTsKKwlhY3BpX2hhbmRsZSBoYW5kbGUgPSBkZXZpY2UtPmhhbmRsZTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ19saXN0OworCXVuaW9uIGFjcGlfb2JqZWN0IGFyZzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKworCWFyZ19saXN0LmNvdW50ID0gMTsKKwlhcmdfbGlzdC5wb2ludGVyID0gJmFyZzsKKwlhcmcudHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOworCWFyZy5pbnRlZ2VyLnZhbHVlID0gTUVNT1JZX0FSR19DVVJfQkFORFdJRFRIOworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsIE1FTU9SWV9HRVRfQkFORFdJRFRILAorCQkJCSAgICAgICAmYXJnX2xpc3QsICZ2YWx1ZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgdmFsdWUpOworfQorCitzdGF0aWMgaW50IG1lbW9yeV9zZXRfY3VyX2JhbmR3aWR0aChzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldiwKKwkJCQkgICAgdW5zaWduZWQgaW50IHN0YXRlKQoreworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gY2Rldi0+ZGV2ZGF0YTsKKwlhY3BpX2hhbmRsZSBoYW5kbGUgPSBkZXZpY2UtPmhhbmRsZTsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBhcmdfbGlzdDsKKwl1bmlvbiBhY3BpX29iamVjdCBhcmc7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWludCB0ZW1wOworCXVuc2lnbmVkIGxvbmcgbWF4X3N0YXRlOworCisJaWYgKG1lbW9yeV9nZXRfaW50X21heF9iYW5kd2lkdGgoY2RldiwgJm1heF9zdGF0ZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKG1heF9zdGF0ZSA8IDAgfHwgc3RhdGUgPiBtYXhfc3RhdGUpCisJCXJldHVybiAtRUlOVkFMOworCisJYXJnX2xpc3QuY291bnQgPSAxOworCWFyZ19saXN0LnBvaW50ZXIgPSAmYXJnOworCWFyZy50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVI7CisJYXJnLmludGVnZXIudmFsdWUgPSBzdGF0ZTsKKworCXN0YXR1cyA9CisJICAgIGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsIE1FTU9SWV9TRVRfQkFORFdJRFRILCAmYXJnX2xpc3QsCisJCQkJICAodW5zaWduZWQgbG9uZyAqKSZ0ZW1wKTsKKworCXByaW50ayhLRVJOX0lORk8KKwkgICAgICAgIkJhbmR3aWR0aCB2YWx1ZSB3YXMgJWQ6IHN0YXR1cyBpcyAlZFxuIiwgc3RhdGUsIHN0YXR1cyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzIG1lbW9yeV9jb29saW5nX29wcyA9IHsKKwkuZ2V0X21heF9zdGF0ZSA9IG1lbW9yeV9nZXRfbWF4X2JhbmR3aWR0aCwKKwkuZ2V0X2N1cl9zdGF0ZSA9IG1lbW9yeV9nZXRfY3VyX2JhbmR3aWR0aCwKKwkuc2V0X2N1cl9zdGF0ZSA9IG1lbW9yeV9zZXRfY3VyX2JhbmR3aWR0aCwKK307CisKKy8qCisgKiBNZW1vcnkgRGV2aWNlIE1hbmFnZW1lbnQKKyAqLworc3RhdGljIGludCBpbnRlbF9tZW5sb3dfbWVtb3J5X2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3sKKwlpbnQgcmVzdWx0ID0gLUVOT0RFVjsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX2hhbmRsZSBkdW1teTsKKwlzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldjsKKworCWlmICghZGV2aWNlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgTUVNT1JZX0dFVF9CQU5EV0lEVEgsICZkdW1teSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlnb3RvIGVuZDsKKworCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgTUVNT1JZX1NFVF9CQU5EV0lEVEgsICZkdW1teSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlnb3RvIGVuZDsKKworCWNkZXYgPSB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX3JlZ2lzdGVyKCJNZW1vcnkgY29udHJvbGxlciIsIGRldmljZSwKKwkJCQkJICAgICAgICZtZW1vcnlfY29vbGluZ19vcHMpOworCWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSA9IGNkZXY7CisJaWYgKCFjZGV2KQorCQlyZXN1bHQgPSAtRU5PREVWOworCWVsc2UgeworCQlyZXN1bHQgPSBzeXNmc19jcmVhdGVfbGluaygmZGV2aWNlLT5kZXYua29iaiwKKwkJCQkJJmNkZXYtPmRldmljZS5rb2JqLCAidGhlcm1hbF9jb29saW5nIik7CisJCWlmIChyZXN1bHQpCisJCQlnb3RvIHVucmVnaXN0ZXI7CisKKwkJcmVzdWx0ID0gc3lzZnNfY3JlYXRlX2xpbmsoJmNkZXYtPmRldmljZS5rb2JqLAorCQkJCQkmZGV2aWNlLT5kZXYua29iaiwgImRldmljZSIpOworCQlpZiAocmVzdWx0KSB7CisJCQlzeXNmc19yZW1vdmVfbGluaygmZGV2aWNlLT5kZXYua29iaiwgInRoZXJtYWxfY29vbGluZyIpOworCQkJZ290byB1bnJlZ2lzdGVyOworCQl9CisJfQorCisgZW5kOgorCXJldHVybiByZXN1bHQ7CisKKyB1bnJlZ2lzdGVyOgorCXRoZXJtYWxfY29vbGluZ19kZXZpY2VfdW5yZWdpc3RlcihjZGV2KTsKKwlyZXR1cm4gcmVzdWx0OworCit9CisKK3N0YXRpYyBpbnQgaW50ZWxfbWVubG93X21lbW9yeV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQoreworCXN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2ID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOworCisJaWYgKCFkZXZpY2UgfHwgIWNkZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldmljZS0+ZGV2LmtvYmosICJ0aGVybWFsX2Nvb2xpbmciKTsKKwlzeXNmc19yZW1vdmVfbGluaygmY2Rldi0+ZGV2aWNlLmtvYmosICJkZXZpY2UiKTsKKwl0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX3VucmVnaXN0ZXIoY2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworY29uc3Qgc3RhdGljIHN0cnVjdCBhY3BpX2RldmljZV9pZCBpbnRlbF9tZW5sb3dfbWVtb3J5X2lkc1tdID0geworCXsiSU5UMDAwMiIsIDB9LAorCXsiIiwgMH0sCit9OworCitzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGludGVsX21lbmxvd19tZW1vcnlfZHJpdmVyID0geworCS5uYW1lID0gImludGVsX21lbmxvd190aGVybWFsX2NvbnRyb2wiLAorCS5pZHMgPSBpbnRlbF9tZW5sb3dfbWVtb3J5X2lkcywKKwkub3BzID0geworCQkuYWRkID0gaW50ZWxfbWVubG93X21lbW9yeV9hZGQsCisJCS5yZW1vdmUgPSBpbnRlbF9tZW5sb3dfbWVtb3J5X3JlbW92ZSwKKwkJfSwKK307CisKKy8qCisgKiBTZW5zb3IgY29udHJvbCBvbiBtZW5sb3cgcGxhdGZvcm0KKyAqLworCisjZGVmaW5lIFRIRVJNQUxfQVVYMCAwCisjZGVmaW5lIFRIRVJNQUxfQVVYMSAxCisjZGVmaW5lIEdFVF9BVVgwICJHQVgwIgorI2RlZmluZSBHRVRfQVVYMSAiR0FYMSIKKyNkZWZpbmUgU0VUX0FVWDAgIlNBWDAiCisjZGVmaW5lIFNFVF9BVVgxICJTQVgxIgorCitzdHJ1Y3QgaW50ZWxfbWVubG93X2F0dHJpYnV0ZSB7CisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgYXR0cjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXZpY2U7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKK307CisKK3N0YXRpYyBMSVNUX0hFQUQoaW50ZWxfbWVubG93X2F0dHJfbGlzdCk7CitzdGF0aWMgREVGSU5FX01VVEVYKGludGVsX21lbmxvd19hdHRyX2xvY2spOworCisvKgorICogc2Vuc29yX2dldF9hdXh0cmlwIC0gZ2V0IHRoZSBjdXJyZW50IGF1eHRyaXAgdmFsdWUgZnJvbSBzZW5zb3IKKyAqIEBuYW1lOiBUaGVybWFsem9uZSBuYW1lCisgKiBAYXV4dHlwZSA6IEFVWDAvQVVYMQorICogQGJ1Zjogc3lmcyBidWZmZXIKKyAqLworc3RhdGljIGludCBzZW5zb3JfZ2V0X2F1eHRyaXAoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgaW5kZXgsIGludCAqdmFsdWUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJaWYgKChpbmRleCAhPSAwICYmIGluZGV4ICE9IDEpIHx8ICF2YWx1ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCBpbmRleCA/IEdFVF9BVVgxIDogR0VUX0FVWDAsCisJCQkJICAgICAgIE5VTEwsICh1bnNpZ25lZCBsb25nICopdmFsdWUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNlbnNvcl9zZXRfYXV4dHJpcCAtIHNldCB0aGUgbmV3IGF1eHRyaXAgdmFsdWUgdG8gc2Vuc29yCisgKiBAbmFtZTogVGhlcm1hbHpvbmUgbmFtZQorICogQGF1eHR5cGUgOiBBVVgwL0FVWDEKKyAqIEBidWY6IHN5ZnMgYnVmZmVyCisgKi8KK3N0YXRpYyBpbnQgc2Vuc29yX3NldF9hdXh0cmlwKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IGluZGV4LCBpbnQgdmFsdWUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfb2JqZWN0IGFyZyA9IHsKKwkJQUNQSV9UWVBFX0lOVEVHRVIKKwl9OworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ3MgPSB7CisJCTEsICZhcmcKKwl9OworCWludCB0ZW1wOworCisJaWYgKGluZGV4ICE9IDAgJiYgaW5kZXggIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCBpbmRleCA/IEdFVF9BVVgwIDogR0VUX0FVWDEsCisJCQkJICAgICAgIE5VTEwsICh1bnNpZ25lZCBsb25nICopJnRlbXApOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKChpbmRleCAmJiB2YWx1ZSA8IHRlbXApIHx8ICghaW5kZXggJiYgdmFsdWUgPiB0ZW1wKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhcmcuaW50ZWdlci52YWx1ZSA9IHZhbHVlOworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsIGluZGV4ID8gU0VUX0FVWDEgOiBTRVRfQVVYMCwKKwkJCQkgICAgICAgJmFyZ3MsICh1bnNpZ25lZCBsb25nICopJnRlbXApOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBkbyB3ZSBuZWVkIHRvIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgU0FYMC9TQVgxID8gKi8KKworCXJldHVybiAwOworfQorCisjZGVmaW5lIHRvX2ludGVsX21lbmxvd19hdHRyKF9hdHRyKQlcCisJY29udGFpbmVyX29mKF9hdHRyLCBzdHJ1Y3QgaW50ZWxfbWVubG93X2F0dHJpYnV0ZSwgYXR0cikKKworc3RhdGljIHNzaXplX3QgYXV4MF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2X2F0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaW50ZWxfbWVubG93X2F0dHJpYnV0ZSAqYXR0ciA9IHRvX2ludGVsX21lbmxvd19hdHRyKGRldl9hdHRyKTsKKwlpbnQgdmFsdWU7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IHNlbnNvcl9nZXRfYXV4dHJpcChhdHRyLT5oYW5kbGUsIDAsICZ2YWx1ZSk7CisKKwlyZXR1cm4gcmVzdWx0ID8gcmVzdWx0IDogc3ByaW50ZihidWYsICIlbHUiLCBLRUxWSU5fVE9fQ0VMU0lVUyh2YWx1ZSkpOworfQorCitzdGF0aWMgc3NpemVfdCBhdXgxX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZfYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpbnRlbF9tZW5sb3dfYXR0cmlidXRlICphdHRyID0gdG9faW50ZWxfbWVubG93X2F0dHIoZGV2X2F0dHIpOworCWludCB2YWx1ZTsKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gc2Vuc29yX2dldF9hdXh0cmlwKGF0dHItPmhhbmRsZSwgMSwgJnZhbHVlKTsKKworCXJldHVybiByZXN1bHQgPyByZXN1bHQgOiBzcHJpbnRmKGJ1ZiwgIiVsdSIsIEtFTFZJTl9UT19DRUxTSVVTKHZhbHVlKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGF1eDBfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2X2F0dHIsCisJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpbnRlbF9tZW5sb3dfYXR0cmlidXRlICphdHRyID0gdG9faW50ZWxfbWVubG93X2F0dHIoZGV2X2F0dHIpOworCWludCB2YWx1ZTsKKwlpbnQgcmVzdWx0OworCisJLypTYW5pdHkgY2hlY2s7IHNob3VsZCBiZSBhIHBvc2l0aXZlIGludGVnZXIgKi8KKwlpZiAoIXNzY2FuZihidWYsICIlZCIsICZ2YWx1ZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZhbHVlIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXN1bHQgPSBzZW5zb3Jfc2V0X2F1eHRyaXAoYXR0ci0+aGFuZGxlLCAwLCBDRUxTSVVTX1RPX0tFTFZJTih2YWx1ZSkpOworCXJldHVybiByZXN1bHQgPyByZXN1bHQgOiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgYXV4MV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZfYXR0ciwKKwkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGludGVsX21lbmxvd19hdHRyaWJ1dGUgKmF0dHIgPSB0b19pbnRlbF9tZW5sb3dfYXR0cihkZXZfYXR0cik7CisJaW50IHZhbHVlOworCWludCByZXN1bHQ7CisKKwkvKlNhbml0eSBjaGVjazsgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlciAqLworCWlmICghc3NjYW5mKGJ1ZiwgIiVkIiwgJnZhbHVlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodmFsdWUgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlc3VsdCA9IHNlbnNvcl9zZXRfYXV4dHJpcChhdHRyLT5oYW5kbGUsIDEsIENFTFNJVVNfVE9fS0VMVklOKHZhbHVlKSk7CisJcmV0dXJuIHJlc3VsdCA/IHJlc3VsdCA6IGNvdW50OworfQorCisvKiBCSU9TIGNhbiBlbmFibGUvZGlzYWJsZSB0aGUgdGhlcm1hbCB1c2VyIGFwcGxpY2F0aW9uIGluIGRhYm5leSBwbGF0Zm9ybSAqLworI2RlZmluZSBCSU9TX0VOQUJMRUQgIlxcX1RaLkdTVFMiCitzdGF0aWMgc3NpemVfdCBiaW9zX2VuYWJsZWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgYmlvc19lbmFibGVkOworCisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKE5VTEwsIEJJT1NfRU5BQkxFRCwgTlVMTCwgJmJpb3NfZW5hYmxlZCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBiaW9zX2VuYWJsZWQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKK30KKworc3RhdGljIGludCBpbnRlbF9tZW5sb3dfYWRkX29uZV9hdHRyaWJ1dGUoY2hhciAqbmFtZSwgaW50IG1vZGUsIHZvaWQgKnNob3csCisJCQkJCSAgdm9pZCAqc3RvcmUsIHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICBhY3BpX2hhbmRsZSBoYW5kbGUpCit7CisJc3RydWN0IGludGVsX21lbmxvd19hdHRyaWJ1dGUgKmF0dHI7CisJaW50IHJlc3VsdDsKKworCWF0dHIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW50ZWxfbWVubG93X2F0dHJpYnV0ZSksIEdGUF9LRVJORUwpOworCWlmICghYXR0cikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhdHRyLT5hdHRyLmF0dHIubmFtZSA9IG5hbWU7CisJYXR0ci0+YXR0ci5hdHRyLm1vZGUgPSBtb2RlOworCWF0dHItPmF0dHIuc2hvdyA9IHNob3c7CisJYXR0ci0+YXR0ci5zdG9yZSA9IHN0b3JlOworCWF0dHItPmRldmljZSA9IGRldjsKKwlhdHRyLT5oYW5kbGUgPSBoYW5kbGU7CisKKwlyZXN1bHQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmYXR0ci0+YXR0cik7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCW11dGV4X2xvY2soJmludGVsX21lbmxvd19hdHRyX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmF0dHItPm5vZGUsICZpbnRlbF9tZW5sb3dfYXR0cl9saXN0KTsKKwltdXRleF91bmxvY2soJmludGVsX21lbmxvd19hdHRyX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhY3BpX3N0YXR1cyBpbnRlbF9tZW5sb3dfcmVnaXN0ZXJfc2Vuc29yKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGx2bCwKKwkJCQkJCXZvaWQgKmNvbnRleHQsIHZvaWQgKipydikKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9oYW5kbGUgZHVtbXk7CisJc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnRoZXJtYWw7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IGFjcGlfYnVzX2dldF9wcml2YXRlX2RhdGEoaGFuZGxlLCAodm9pZCAqKikmdGhlcm1hbCk7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIDA7CisKKwkvKiBfVFogbXVzdCBoYXZlIHRoZSBBVVgwLzEgbWV0aG9kcyAqLworCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShoYW5kbGUsIEdFVF9BVVgwLCAmZHVtbXkpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJZ290byBub3RfZm91bmQ7CisKKwlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCBTRVRfQVVYMCwgJmR1bW15KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCWdvdG8gbm90X2ZvdW5kOworCisJcmVzdWx0ID0gaW50ZWxfbWVubG93X2FkZF9vbmVfYXR0cmlidXRlKCJhdXgwIiwgMDY0NCwKKwkJCQkJCWF1eDBfc2hvdywgYXV4MF9zdG9yZSwKKwkJCQkJCSZ0aGVybWFsLT5kZXZpY2UsIGhhbmRsZSk7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIEFFX0VSUk9SOworCisJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGhhbmRsZSwgR0VUX0FVWDEsICZkdW1teSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlnb3RvIG5vdF9mb3VuZDsKKworCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShoYW5kbGUsIFNFVF9BVVgxLCAmZHVtbXkpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJZ290byBub3RfZm91bmQ7CisKKwlyZXN1bHQgPSBpbnRlbF9tZW5sb3dfYWRkX29uZV9hdHRyaWJ1dGUoImF1eDEiLCAwNjQ0LAorCQkJCQkJYXV4MV9zaG93LCBhdXgxX3N0b3JlLAorCQkJCQkJJnRoZXJtYWwtPmRldmljZSwgaGFuZGxlKTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gQUVfRVJST1I7CisKKwkvKgorCSAqIGNyZWF0ZSB0aGUgImRhYm5leV9lbmFibGVkIiBhdHRyaWJ1dGUgd2hpY2ggbWVhbnMgdGhlIHVzZXIgYXBwCisJICogc2hvdWxkIGJlIGxvYWRlZCBvciBub3QKKwkgKi8KKworCXJlc3VsdCA9IGludGVsX21lbmxvd19hZGRfb25lX2F0dHJpYnV0ZSgiYmlvc19lbmFibGVkIiwgMDQ0NCwKKwkJCQkJCWJpb3NfZW5hYmxlZF9zaG93LCBOVUxMLAorCQkJCQkJJnRoZXJtYWwtPmRldmljZSwgaGFuZGxlKTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gQUVfRVJST1I7CisKKyBub3RfZm91bmQ6CisJaWYgKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpCisJCXJldHVybiBBRV9PSzsKKwllbHNlCisJCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX21lbmxvd191bnJlZ2lzdGVyX3NlbnNvcih2b2lkKQoreworCXN0cnVjdCBpbnRlbF9tZW5sb3dfYXR0cmlidXRlICpwb3MsICpuZXh0OworCisJbXV0ZXhfbG9jaygmaW50ZWxfbWVubG93X2F0dHJfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcywgbmV4dCwgJmludGVsX21lbmxvd19hdHRyX2xpc3QsIG5vZGUpIHsKKwkJbGlzdF9kZWwoJnBvcy0+bm9kZSk7CisJCWRldmljZV9yZW1vdmVfZmlsZShwb3MtPmRldmljZSwgJnBvcy0+YXR0cik7CisJCWtmcmVlKHBvcyk7CisJfQorCW11dGV4X3VubG9jaygmaW50ZWxfbWVubG93X2F0dHJfbG9jayk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGludGVsX21lbmxvd19tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCByZXN1bHQgPSAtRU5PREVWOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGVuYWJsZTsKKworCWlmIChhY3BpX2Rpc2FibGVkKQorCQlyZXR1cm4gcmVzdWx0OworCisJLyogTG9va2luZyBmb3IgdGhlIFxfVFouR1NUUyBtZXRob2QgKi8KKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoTlVMTCwgQklPU19FTkFCTEVELCBOVUxMLCAmZW5hYmxlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgfHwgIWVuYWJsZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBMb29raW5nIGZvciBBQ1BJIGRldmljZSBNRU0wIHdpdGggaGFyZHdhcmUgaWQgSU5UMDAwMiAqLworCXJlc3VsdCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmaW50ZWxfbWVubG93X21lbW9yeV9kcml2ZXIpOworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisKKwkvKiBMb29raW5nIGZvciBzZW5zb3JzIGluIGVhY2ggQUNQSSB0aGVybWFsIHpvbmUgKi8KKwlzdGF0dXMgPSBhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9USEVSTUFMLCBBQ1BJX1JPT1RfT0JKRUNULAorCQkJCSAgICAgQUNQSV9VSU5UMzJfTUFYLAorCQkJCSAgICAgaW50ZWxfbWVubG93X3JlZ2lzdGVyX3NlbnNvciwgTlVMTCwgTlVMTCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaW50ZWxfbWVubG93X21vZHVsZV9leGl0KHZvaWQpCit7CisJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmludGVsX21lbmxvd19tZW1vcnlfZHJpdmVyKTsKKwlpbnRlbF9tZW5sb3dfdW5yZWdpc3Rlcl9zZW5zb3IoKTsKK30KKworbW9kdWxlX2luaXQoaW50ZWxfbWVubG93X21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KGludGVsX21lbmxvd19tb2R1bGVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2Mvc29ueS1sYXB0b3AuYyBiL2RyaXZlcnMvbWlzYy9zb255LWxhcHRvcC5jCmluZGV4IGIwZjY4MDMuLjg5OWUzZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9zb255LWxhcHRvcC5jCisrKyBiL2RyaXZlcnMvbWlzYy9zb255LWxhcHRvcC5jCkBAIC03Myw3ICs3Myw3IEBACiAJaWYgKGRlYnVnKSBwcmludGsoS0VSTl9XQVJOSU5HIERSVl9QRlggIG1zZyk7CVwKIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgU09OWV9MQVBUT1BfRFJJVkVSX1ZFUlNJT04JIjAuNSIKKyNkZWZpbmUgU09OWV9MQVBUT1BfRFJJVkVSX1ZFUlNJT04JIjAuNiIKIAogI2RlZmluZSBTT05ZX05DX0NMQVNTCQkic29ueS1uYyIKICNkZWZpbmUgU09OWV9OQ19ISUQJCSJTTlk1MDAxIgpAQCAtMTQ2LDY4ICsxNDYsNzAgQEAKICAqIGFuZCBpbnB1dCBsYXllciBpbmRleGVzIGluIHRoZSBrZXltYXAKICAqLwogc3RhdGljIGludCBzb255X2xhcHRvcF9pbnB1dF9pbmRleFtdID0gewotCS0xLAkvKiBubyBldmVudCAqLwotCS0xLAkvKiBTT05ZUElfRVZFTlRfSk9HRElBTF9ET1dOICovCi0JLTEsCS8qIFNPTllQSV9FVkVOVF9KT0dESUFMX1VQICovCi0JLTEsCS8qIFNPTllQSV9FVkVOVF9KT0dESUFMX0RPV05fUFJFU1NFRCAqLwotCS0xLAkvKiBTT05ZUElfRVZFTlRfSk9HRElBTF9VUF9QUkVTU0VEICovCi0JLTEsCS8qIFNPTllQSV9FVkVOVF9KT0dESUFMX1BSRVNTRUQgKi8KLQktMSwJLyogU09OWVBJX0VWRU5UX0pPR0RJQUxfUkVMRUFTRUQgKi8KLQkgMCwJLyogU09OWVBJX0VWRU5UX0NBUFRVUkVfUFJFU1NFRCAqLwotCSAxLAkvKiBTT05ZUElfRVZFTlRfQ0FQVFVSRV9SRUxFQVNFRCAqLwotCSAyLAkvKiBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QQVJUSUFMUFJFU1NFRCAqLwotCSAzLAkvKiBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QQVJUSUFMUkVMRUFTRUQgKi8KLQkgNCwJLyogU09OWVBJX0VWRU5UX0ZOS0VZX0VTQyAqLwotCSA1LAkvKiBTT05ZUElfRVZFTlRfRk5LRVlfRjEgKi8KLQkgNiwJLyogU09OWVBJX0VWRU5UX0ZOS0VZX0YyICovCi0JIDcsCS8qIFNPTllQSV9FVkVOVF9GTktFWV9GMyAqLwotCSA4LAkvKiBTT05ZUElfRVZFTlRfRk5LRVlfRjQgKi8KLQkgOSwJLyogU09OWVBJX0VWRU5UX0ZOS0VZX0Y1ICovCi0JMTAsCS8qIFNPTllQSV9FVkVOVF9GTktFWV9GNiAqLwotCTExLAkvKiBTT05ZUElfRVZFTlRfRk5LRVlfRjcgKi8KLQkxMiwJLyogU09OWVBJX0VWRU5UX0ZOS0VZX0Y4ICovCi0JMTMsCS8qIFNPTllQSV9FVkVOVF9GTktFWV9GOSAqLwotCTE0LAkvKiBTT05ZUElfRVZFTlRfRk5LRVlfRjEwICovCi0JMTUsCS8qIFNPTllQSV9FVkVOVF9GTktFWV9GMTEgKi8KLQkxNiwJLyogU09OWVBJX0VWRU5UX0ZOS0VZX0YxMiAqLwotCTE3LAkvKiBTT05ZUElfRVZFTlRfRk5LRVlfMSAqLwotCTE4LAkvKiBTT05ZUElfRVZFTlRfRk5LRVlfMiAqLwotCTE5LAkvKiBTT05ZUElfRVZFTlRfRk5LRVlfRCAqLwotCTIwLAkvKiBTT05ZUElfRVZFTlRfRk5LRVlfRSAqLwotCTIxLAkvKiBTT05ZUElfRVZFTlRfRk5LRVlfRiAqLwotCTIyLAkvKiBTT05ZUElfRVZFTlRfRk5LRVlfUyAqLwotCTIzLAkvKiBTT05ZUElfRVZFTlRfRk5LRVlfQiAqLwotCTI0LAkvKiBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX1BSRVNTRUQgKi8KLQkyNSwJLyogU09OWVBJX0VWRU5UX1BLRVlfUDEgKi8KLQkyNiwJLyogU09OWVBJX0VWRU5UX1BLRVlfUDIgKi8KLQkyNywJLyogU09OWVBJX0VWRU5UX1BLRVlfUDMgKi8KLQkyOCwJLyogU09OWVBJX0VWRU5UX0JBQ0tfUFJFU1NFRCAqLwotCS0xLAkvKiBTT05ZUElfRVZFTlRfTElEX0NMT1NFRCAqLwotCS0xLAkvKiBTT05ZUElfRVZFTlRfTElEX09QRU5FRCAqLwotCTI5LAkvKiBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX09OICovCi0JMzAsCS8qIFNPTllQSV9FVkVOVF9CTFVFVE9PVEhfT0ZGICovCi0JMzEsCS8qIFNPTllQSV9FVkVOVF9IRUxQX1BSRVNTRUQgKi8KLQkzMiwJLyogU09OWVBJX0VWRU5UX0ZOS0VZX09OTFkgKi8KLQkzMywJLyogU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9ET1dOICovCi0JMzQsCS8qIFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfVVAgKi8KLQkzNSwJLyogU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9ET1dOX1BSRVNTRUQgKi8KLQkzNiwJLyogU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9VUF9QUkVTU0VEICovCi0JMzcsCS8qIFNPTllQSV9FVkVOVF9KT0dESUFMX1ZGQVNUX0RPV04gKi8KLQkzOCwJLyogU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfVVAgKi8KLQkzOSwJLyogU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfRE9XTl9QUkVTU0VEICovCi0JNDAsCS8qIFNPTllQSV9FVkVOVF9KT0dESUFMX1ZGQVNUX1VQX1BSRVNTRUQgKi8KLQk0MSwJLyogU09OWVBJX0VWRU5UX1pPT01fUFJFU1NFRCAqLwotCTQyLAkvKiBTT05ZUElfRVZFTlRfVEhVTUJQSFJBU0VfUFJFU1NFRCAqLwotCTQzLAkvKiBTT05ZUElfRVZFTlRfTUVZRV9GQUNFICovCi0JNDQsCS8qIFNPTllQSV9FVkVOVF9NRVlFX09QUE9TSVRFICovCi0JNDUsCS8qIFNPTllQSV9FVkVOVF9NRU1PUllTVElDS19JTlNFUlQgKi8KLQk0NiwJLyogU09OWVBJX0VWRU5UX01FTU9SWVNUSUNLX0VKRUNUICovCi0JLTEsCS8qIFNPTllQSV9FVkVOVF9BTllCVVRUT05fUkVMRUFTRUQgKi8KLQktMSwJLyogU09OWVBJX0VWRU5UX0JBVFRFUllfSU5TRVJUICovCi0JLTEsCS8qIFNPTllQSV9FVkVOVF9CQVRURVJZX1JFTU9WRSAqLwotCS0xLAkvKiBTT05ZUElfRVZFTlRfRk5LRVlfUkVMRUFTRUQgKi8KLQk0NywJLyogU09OWVBJX0VWRU5UX1dJUkVMRVNTX09OICovCi0JNDgsCS8qIFNPTllQSV9FVkVOVF9XSVJFTEVTU19PRkYgKi8KKwktMSwJLyogIDAgbm8gZXZlbnQgKi8KKwktMSwJLyogIDEgU09OWVBJX0VWRU5UX0pPR0RJQUxfRE9XTiAqLworCS0xLAkvKiAgMiBTT05ZUElfRVZFTlRfSk9HRElBTF9VUCAqLworCS0xLAkvKiAgMyBTT05ZUElfRVZFTlRfSk9HRElBTF9ET1dOX1BSRVNTRUQgKi8KKwktMSwJLyogIDQgU09OWVBJX0VWRU5UX0pPR0RJQUxfVVBfUFJFU1NFRCAqLworCS0xLAkvKiAgNSBTT05ZUElfRVZFTlRfSk9HRElBTF9QUkVTU0VEICovCisJLTEsCS8qICA2IFNPTllQSV9FVkVOVF9KT0dESUFMX1JFTEVBU0VEICovCisJIDAsCS8qICA3IFNPTllQSV9FVkVOVF9DQVBUVVJFX1BSRVNTRUQgKi8KKwkgMSwJLyogIDggU09OWVBJX0VWRU5UX0NBUFRVUkVfUkVMRUFTRUQgKi8KKwkgMiwJLyogIDkgU09OWVBJX0VWRU5UX0NBUFRVUkVfUEFSVElBTFBSRVNTRUQgKi8KKwkgMywJLyogMTAgU09OWVBJX0VWRU5UX0NBUFRVUkVfUEFSVElBTFJFTEVBU0VEICovCisJIDQsCS8qIDExIFNPTllQSV9FVkVOVF9GTktFWV9FU0MgKi8KKwkgNSwJLyogMTIgU09OWVBJX0VWRU5UX0ZOS0VZX0YxICovCisJIDYsCS8qIDEzIFNPTllQSV9FVkVOVF9GTktFWV9GMiAqLworCSA3LAkvKiAxNCBTT05ZUElfRVZFTlRfRk5LRVlfRjMgKi8KKwkgOCwJLyogMTUgU09OWVBJX0VWRU5UX0ZOS0VZX0Y0ICovCisJIDksCS8qIDE2IFNPTllQSV9FVkVOVF9GTktFWV9GNSAqLworCTEwLAkvKiAxNyBTT05ZUElfRVZFTlRfRk5LRVlfRjYgKi8KKwkxMSwJLyogMTggU09OWVBJX0VWRU5UX0ZOS0VZX0Y3ICovCisJMTIsCS8qIDE5IFNPTllQSV9FVkVOVF9GTktFWV9GOCAqLworCTEzLAkvKiAyMCBTT05ZUElfRVZFTlRfRk5LRVlfRjkgKi8KKwkxNCwJLyogMjEgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMCAqLworCTE1LAkvKiAyMiBTT05ZUElfRVZFTlRfRk5LRVlfRjExICovCisJMTYsCS8qIDIzIFNPTllQSV9FVkVOVF9GTktFWV9GMTIgKi8KKwkxNywJLyogMjQgU09OWVBJX0VWRU5UX0ZOS0VZXzEgKi8KKwkxOCwJLyogMjUgU09OWVBJX0VWRU5UX0ZOS0VZXzIgKi8KKwkxOSwJLyogMjYgU09OWVBJX0VWRU5UX0ZOS0VZX0QgKi8KKwkyMCwJLyogMjcgU09OWVBJX0VWRU5UX0ZOS0VZX0UgKi8KKwkyMSwJLyogMjggU09OWVBJX0VWRU5UX0ZOS0VZX0YgKi8KKwkyMiwJLyogMjkgU09OWVBJX0VWRU5UX0ZOS0VZX1MgKi8KKwkyMywJLyogMzAgU09OWVBJX0VWRU5UX0ZOS0VZX0IgKi8KKwkyNCwJLyogMzEgU09OWVBJX0VWRU5UX0JMVUVUT09USF9QUkVTU0VEICovCisJMjUsCS8qIDMyIFNPTllQSV9FVkVOVF9QS0VZX1AxICovCisJMjYsCS8qIDMzIFNPTllQSV9FVkVOVF9QS0VZX1AyICovCisJMjcsCS8qIDM0IFNPTllQSV9FVkVOVF9QS0VZX1AzICovCisJMjgsCS8qIDM1IFNPTllQSV9FVkVOVF9CQUNLX1BSRVNTRUQgKi8KKwktMSwJLyogMzYgU09OWVBJX0VWRU5UX0xJRF9DTE9TRUQgKi8KKwktMSwJLyogMzcgU09OWVBJX0VWRU5UX0xJRF9PUEVORUQgKi8KKwkyOSwJLyogMzggU09OWVBJX0VWRU5UX0JMVUVUT09USF9PTiAqLworCTMwLAkvKiAzOSBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX09GRiAqLworCTMxLAkvKiA0MCBTT05ZUElfRVZFTlRfSEVMUF9QUkVTU0VEICovCisJMzIsCS8qIDQxIFNPTllQSV9FVkVOVF9GTktFWV9PTkxZICovCisJMzMsCS8qIDQyIFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfRE9XTiAqLworCTM0LAkvKiA0MyBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX1VQICovCisJMzUsCS8qIDQ0IFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfRE9XTl9QUkVTU0VEICovCisJMzYsCS8qIDQ1IFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfVVBfUFJFU1NFRCAqLworCTM3LAkvKiA0NiBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9ET1dOICovCisJMzgsCS8qIDQ3IFNPTllQSV9FVkVOVF9KT0dESUFMX1ZGQVNUX1VQICovCisJMzksCS8qIDQ4IFNPTllQSV9FVkVOVF9KT0dESUFMX1ZGQVNUX0RPV05fUFJFU1NFRCAqLworCTQwLAkvKiA0OSBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9VUF9QUkVTU0VEICovCisJNDEsCS8qIDUwIFNPTllQSV9FVkVOVF9aT09NX1BSRVNTRUQgKi8KKwk0MiwJLyogNTEgU09OWVBJX0VWRU5UX1RIVU1CUEhSQVNFX1BSRVNTRUQgKi8KKwk0MywJLyogNTIgU09OWVBJX0VWRU5UX01FWUVfRkFDRSAqLworCTQ0LAkvKiA1MyBTT05ZUElfRVZFTlRfTUVZRV9PUFBPU0lURSAqLworCTQ1LAkvKiA1NCBTT05ZUElfRVZFTlRfTUVNT1JZU1RJQ0tfSU5TRVJUICovCisJNDYsCS8qIDU1IFNPTllQSV9FVkVOVF9NRU1PUllTVElDS19FSkVDVCAqLworCS0xLAkvKiA1NiBTT05ZUElfRVZFTlRfQU5ZQlVUVE9OX1JFTEVBU0VEICovCisJLTEsCS8qIDU3IFNPTllQSV9FVkVOVF9CQVRURVJZX0lOU0VSVCAqLworCS0xLAkvKiA1OCBTT05ZUElfRVZFTlRfQkFUVEVSWV9SRU1PVkUgKi8KKwktMSwJLyogNTkgU09OWVBJX0VWRU5UX0ZOS0VZX1JFTEVBU0VEICovCisJNDcsCS8qIDYwIFNPTllQSV9FVkVOVF9XSVJFTEVTU19PTiAqLworCTQ4LAkvKiA2MSBTT05ZUElfRVZFTlRfV0lSRUxFU1NfT0ZGICovCisJNDksCS8qIDYyIFNPTllQSV9FVkVOVF9aT09NX0lOX1BSRVNTRUQgKi8KKwk1MCwJLyogNjMgU09OWVBJX0VWRU5UX1pPT01fT1VUX1BSRVNTRUQgKi8KIH07CiAKIHN0YXRpYyBpbnQgc29ueV9sYXB0b3BfaW5wdXRfa2V5Y29kZV9tYXBbXSA9IHsKQEAgLTI2MCw2ICsyNjIsOCBAQAogCUtFWV9SRVNFUlZFRCwJLyogNDYgU09OWVBJX0VWRU5UX01FTU9SWVNUSUNLX0VKRUNUICovCiAJS0VZX1dMQU4sCS8qIDQ3IFNPTllQSV9FVkVOVF9XSVJFTEVTU19PTiAqLwogCUtFWV9XTEFOLAkvKiA0OCBTT05ZUElfRVZFTlRfV0lSRUxFU1NfT0ZGICovCisJS0VZX1pPT01JTiwJLyogNDkgU09OWVBJX0VWRU5UX1pPT01fSU5fUFJFU1NFRCAqLworCUtFWV9aT09NT1VUCS8qIDUwIFNPTllQSV9FVkVOVF9aT09NX09VVF9QUkVTU0VEICovCiB9OwogCiAvKiByZWxlYXNlIGJ1dHRvbnMgYWZ0ZXIgYSBzaG9ydCBkZWxheSBpZiBwcmVzc2VkICovCkBAIC0zMTEsNyArMzE1LDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlpZiAoZXZlbnQgPiBBUlJBWV9TSVpFIChzb255X2xhcHRvcF9pbnB1dF9rZXljb2RlX21hcCkpIHsKKwkJaWYgKGV2ZW50ID4gQVJSQVlfU0laRShzb255X2xhcHRvcF9pbnB1dF9pbmRleCkpIHsKIAkJCWRwcmludGsoInNvbnlfbGFwdG9wX3JlcG9ydF9pbnB1dF9ldmVudCwgZXZlbnQgbm90IGtub3duOiAlZFxuIiwgZXZlbnQpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTg3NSw2ICs4NzksMTUgQEAKIAkJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlZHTi1DIiksCiAJCQl9LAogCQl9LAorCQl7CisJCQkuaWRlbnQgPSAiU29ueSBWYWlvIE4gU2VyaWVzIiwKKwkJCS5jYWxsYmFjayA9IHNvbnlfbmNfQ19lbmFibGUsCisJCQkuZHJpdmVyX2RhdGEgPSBzb255X0NfZXZlbnRzLAorCQkJLm1hdGNoZXMgPSB7CisJCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiU29ueSBDb3Jwb3JhdGlvbiIpLAorCQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVkdOLU4iKSwKKwkJCX0sCisJCX0sCiAJCXsgfQogfTsKIApAQCAtMTE2OSwxMCArMTE4MiwxMiBAQAogI2RlZmluZSBTT05ZUElfREVWSUNFX1RZUEUxCTB4MDAwMDAwMDEKICNkZWZpbmUgU09OWVBJX0RFVklDRV9UWVBFMgkweDAwMDAwMDAyCiAjZGVmaW5lIFNPTllQSV9ERVZJQ0VfVFlQRTMJMHgwMDAwMDAwNAorI2RlZmluZSBTT05ZUElfREVWSUNFX1RZUEU0CTB4MDAwMDAwMDgKIAogI2RlZmluZSBTT05ZUElfVFlQRTFfT0ZGU0VUCTB4MDQKICNkZWZpbmUgU09OWVBJX1RZUEUyX09GRlNFVAkweDEyCiAjZGVmaW5lIFNPTllQSV9UWVBFM19PRkZTRVQJMHgxMgorI2RlZmluZSBTT05ZUElfVFlQRTRfT0ZGU0VUCTB4MTIKIAogc3RydWN0IHNvbnlfcGljX2lvcG9ydCB7CiAJc3RydWN0IGFjcGlfcmVzb3VyY2VfaW8JaW8xOwpAQCAtMTE4NSwxOCArMTIwMCwzMyBAQAogCXN0cnVjdCBsaXN0X2hlYWQJCWxpc3Q7CiB9OwogCitzdHJ1Y3Qgc29ueXBpX2V2ZW50dHlwZXMgeworCXU4CQkJZGF0YTsKKwl1bnNpZ25lZCBsb25nCQltYXNrOworCXN0cnVjdCBzb255cGlfZXZlbnQJKmV2ZW50czsKK307CisKK3N0cnVjdCBkZXZpY2VfY3RybCB7CisJaW50CQkJCW1vZGVsOworCWludAkJCQkoKmhhbmRsZV9pcnEpKGNvbnN0IHU4LCBjb25zdCB1OCk7CisJdTE2CQkJCWV2cG9ydF9vZmZzZXQ7CisJdTgJCQkJaGFzX2NhbWVyYTsKKwl1OAkJCQloYXNfYmx1ZXRvb3RoOworCXU4CQkJCWhhc193d2FuOworCXN0cnVjdCBzb255cGlfZXZlbnR0eXBlcwkqZXZlbnRfdHlwZXM7Cit9OworCiBzdHJ1Y3Qgc29ueV9waWNfZGV2IHsKLQlpbnQJCQltb2RlbDsKLQl1MTYJCQlldnBvcnRfb2Zmc2V0OwotCXU4CQkJY2FtZXJhX3Bvd2VyOwotCXU4CQkJYmx1ZXRvb3RoX3Bvd2VyOwotCXU4CQkJd3dhbl9wb3dlcjsKKwlzdHJ1Y3QgZGV2aWNlX2N0cmwJKmNvbnRyb2w7CiAJc3RydWN0IGFjcGlfZGV2aWNlCSphY3BpX2RldjsKIAlzdHJ1Y3Qgc29ueV9waWNfaXJxCSpjdXJfaXJxOwogCXN0cnVjdCBzb255X3BpY19pb3BvcnQJKmN1cl9pb3BvcnQ7CiAJc3RydWN0IGxpc3RfaGVhZAlpbnRlcnJ1cHRzOwogCXN0cnVjdCBsaXN0X2hlYWQJaW9wb3J0czsKIAlzdHJ1Y3QgbXV0ZXgJCWxvY2s7CisJdTgJCQljYW1lcmFfcG93ZXI7CisJdTgJCQlibHVldG9vdGhfcG93ZXI7CisJdTgJCQl3d2FuX3Bvd2VyOwogfTsKIAogc3RhdGljIHN0cnVjdCBzb255X3BpY19kZXYgc3BpY19kZXYgPSB7CkBAIC0xMjUzLDYgKzEyODMsNyBAQAogc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2NhcHR1cmVldltdID0gewogCXsgMHgwNSwgU09OWVBJX0VWRU5UX0NBUFRVUkVfUEFSVElBTFBSRVNTRUQgfSwKIAl7IDB4MDcsIFNPTllQSV9FVkVOVF9DQVBUVVJFX1BSRVNTRUQgfSwKKwl7IDB4NDAsIFNPTllQSV9FVkVOVF9DQVBUVVJFX1BSRVNTRUQgfSwKIAl7IDB4MDEsIFNPTllQSV9FVkVOVF9DQVBUVVJFX1BBUlRJQUxSRUxFQVNFRCB9LAogCXsgMCwgMCB9CiB9OwpAQCAtMTI4OSw3ICsxMzIwLDYgQEAKIAl7IDB4MDEsIFNPTllQSV9FVkVOVF9QS0VZX1AxIH0sCiAJeyAweDAyLCBTT05ZUElfRVZFTlRfUEtFWV9QMiB9LAogCXsgMHgwNCwgU09OWVBJX0VWRU5UX1BLRVlfUDMgfSwKLQl7IDB4NWMsIFNPTllQSV9FVkVOVF9QS0VZX1AxIH0sCiAJeyAwLCAwIH0KIH07CiAKQEAgLTEzMzEsNiArMTM2MSw4IEBACiAvKiBUaGUgc2V0IG9mIHBvc3NpYmxlIHpvb20gZXZlbnRzICovCiBzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfem9vbWV2W10gPSB7CiAJeyAweDM5LCBTT05ZUElfRVZFTlRfWk9PTV9QUkVTU0VEIH0sCisJeyAweDEwLCBTT05ZUElfRVZFTlRfWk9PTV9JTl9QUkVTU0VEIH0sCisJeyAweDIwLCBTT05ZUElfRVZFTlRfWk9PTV9PVVRfUFJFU1NFRCB9LAogCXsgMCwgMCB9CiB9OwogCkBAIC0xMzYxLDc2ICsxMzkzLDU4IEBACiAJeyAwLCAwIH0KIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50dHlwZXMgewotCWludAkJCW1vZGVsOwotCXU4CQkJZGF0YTsKLQl1bnNpZ25lZCBsb25nCQltYXNrOwotCXN0cnVjdCBzb255cGlfZXZlbnQgKglldmVudHM7Ci19IHNvbnlfcGljX2V2ZW50dHlwZXNbXSA9IHsKLQl7IFNPTllQSV9ERVZJQ0VfVFlQRTEsIDAsIDB4ZmZmZmZmZmYsIHNvbnlwaV9yZWxlYXNlZXYgfSwKLQl7IFNPTllQSV9ERVZJQ0VfVFlQRTEsIDB4NzAsIFNPTllQSV9NRVlFX01BU0ssIHNvbnlwaV9tZXllZXYgfSwKLQl7IFNPTllQSV9ERVZJQ0VfVFlQRTEsIDB4MzAsIFNPTllQSV9MSURfTUFTSywgc29ueXBpX2xpZGV2IH0sCi0JeyBTT05ZUElfREVWSUNFX1RZUEUxLCAweDYwLCBTT05ZUElfQ0FQVFVSRV9NQVNLLCBzb255cGlfY2FwdHVyZWV2IH0sCi0JeyBTT05ZUElfREVWSUNFX1RZUEUxLCAweDEwLCBTT05ZUElfSk9HR0VSX01BU0ssIHNvbnlwaV9qb2dnZXJldiB9LAotCXsgU09OWVBJX0RFVklDRV9UWVBFMSwgMHgyMCwgU09OWVBJX0ZOS0VZX01BU0ssIHNvbnlwaV9mbmtleWV2IH0sCi0JeyBTT05ZUElfREVWSUNFX1RZUEUxLCAweDMwLCBTT05ZUElfQkxVRVRPT1RIX01BU0ssIHNvbnlwaV9ibHVlZXYgfSwKLQl7IFNPTllQSV9ERVZJQ0VfVFlQRTEsIDB4NDAsIFNPTllQSV9QS0VZX01BU0ssIHNvbnlwaV9wa2V5ZXYgfSwKLQl7IFNPTllQSV9ERVZJQ0VfVFlQRTEsIDB4MzAsIFNPTllQSV9NRU1PUllTVElDS19NQVNLLCBzb255cGlfbWVtb3J5c3RpY2tldiB9LAotCXsgU09OWVBJX0RFVklDRV9UWVBFMSwgMHg0MCwgU09OWVBJX0JBVFRFUllfTUFTSywgc29ueXBpX2JhdHRlcnlldiB9LAotCi0JeyBTT05ZUElfREVWSUNFX1RZUEUyLCAwLCAweGZmZmZmZmZmLCBzb255cGlfcmVsZWFzZWV2IH0sCi0JeyBTT05ZUElfREVWSUNFX1RZUEUyLCAweDM4LCBTT05ZUElfTElEX01BU0ssIHNvbnlwaV9saWRldiB9LAotCXsgU09OWVBJX0RFVklDRV9UWVBFMiwgMHgxMSwgU09OWVBJX0pPR0dFUl9NQVNLLCBzb255cGlfam9nZ2VyZXYgfSwKLQl7IFNPTllQSV9ERVZJQ0VfVFlQRTIsIDB4NjEsIFNPTllQSV9DQVBUVVJFX01BU0ssIHNvbnlwaV9jYXB0dXJlZXYgfSwKLQl7IFNPTllQSV9ERVZJQ0VfVFlQRTIsIDB4MjEsIFNPTllQSV9GTktFWV9NQVNLLCBzb255cGlfZm5rZXlldiB9LAotCXsgU09OWVBJX0RFVklDRV9UWVBFMiwgMHgzMSwgU09OWVBJX0JMVUVUT09USF9NQVNLLCBzb255cGlfYmx1ZWV2IH0sCi0JeyBTT05ZUElfREVWSUNFX1RZUEUyLCAweDA4LCBTT05ZUElfUEtFWV9NQVNLLCBzb255cGlfcGtleWV2IH0sCi0JeyBTT05ZUElfREVWSUNFX1RZUEUyLCAweDExLCBTT05ZUElfQkFDS19NQVNLLCBzb255cGlfYmFja2V2IH0sCi0JeyBTT05ZUElfREVWSUNFX1RZUEUyLCAweDIxLCBTT05ZUElfSEVMUF9NQVNLLCBzb255cGlfaGVscGV2IH0sCi0JeyBTT05ZUElfREVWSUNFX1RZUEUyLCAweDIxLCBTT05ZUElfWk9PTV9NQVNLLCBzb255cGlfem9vbWV2IH0sCi0JeyBTT05ZUElfREVWSUNFX1RZUEUyLCAweDIwLCBTT05ZUElfVEhVTUJQSFJBU0VfTUFTSywgc29ueXBpX3RodW1icGhyYXNlZXYgfSwKLQl7IFNPTllQSV9ERVZJQ0VfVFlQRTIsIDB4MzEsIFNPTllQSV9NRU1PUllTVElDS19NQVNLLCBzb255cGlfbWVtb3J5c3RpY2tldiB9LAotCXsgU09OWVBJX0RFVklDRV9UWVBFMiwgMHg0MSwgU09OWVBJX0JBVFRFUllfTUFTSywgc29ueXBpX2JhdHRlcnlldiB9LAotCXsgU09OWVBJX0RFVklDRV9UWVBFMiwgMHgzMSwgU09OWVBJX1BLRVlfTUFTSywgc29ueXBpX3BrZXlldiB9LAotCi0JeyBTT05ZUElfREVWSUNFX1RZUEUzLCAwLCAweGZmZmZmZmZmLCBzb255cGlfcmVsZWFzZWV2IH0sCi0JeyBTT05ZUElfREVWSUNFX1RZUEUzLCAweDIxLCBTT05ZUElfRk5LRVlfTUFTSywgc29ueXBpX2Zua2V5ZXYgfSwKLQl7IFNPTllQSV9ERVZJQ0VfVFlQRTMsIDB4MzEsIFNPTllQSV9XSVJFTEVTU19NQVNLLCBzb255cGlfd2xlc3NldiB9LAotCXsgU09OWVBJX0RFVklDRV9UWVBFMywgMHgzMSwgU09OWVBJX01FTU9SWVNUSUNLX01BU0ssIHNvbnlwaV9tZW1vcnlzdGlja2V2IH0sCi0JeyBTT05ZUElfREVWSUNFX1RZUEUzLCAweDQxLCBTT05ZUElfQkFUVEVSWV9NQVNLLCBzb255cGlfYmF0dGVyeWV2IH0sCi0JeyBTT05ZUElfREVWSUNFX1RZUEUzLCAweDMxLCBTT05ZUElfUEtFWV9NQVNLLCBzb255cGlfcGtleWV2IH0sCi0JeyAwIH0KK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50dHlwZXMgdHlwZTFfZXZlbnRzW10gPSB7CisJeyAwLCAweGZmZmZmZmZmLCBzb255cGlfcmVsZWFzZWV2IH0sCisJeyAweDcwLCBTT05ZUElfTUVZRV9NQVNLLCBzb255cGlfbWV5ZWV2IH0sCisJeyAweDMwLCBTT05ZUElfTElEX01BU0ssIHNvbnlwaV9saWRldiB9LAorCXsgMHg2MCwgU09OWVBJX0NBUFRVUkVfTUFTSywgc29ueXBpX2NhcHR1cmVldiB9LAorCXsgMHgxMCwgU09OWVBJX0pPR0dFUl9NQVNLLCBzb255cGlfam9nZ2VyZXYgfSwKKwl7IDB4MjAsIFNPTllQSV9GTktFWV9NQVNLLCBzb255cGlfZm5rZXlldiB9LAorCXsgMHgzMCwgU09OWVBJX0JMVUVUT09USF9NQVNLLCBzb255cGlfYmx1ZWV2IH0sCisJeyAweDQwLCBTT05ZUElfUEtFWV9NQVNLLCBzb255cGlfcGtleWV2IH0sCisJeyAweDMwLCBTT05ZUElfTUVNT1JZU1RJQ0tfTUFTSywgc29ueXBpX21lbW9yeXN0aWNrZXYgfSwKKwl7IDB4NDAsIFNPTllQSV9CQVRURVJZX01BU0ssIHNvbnlwaV9iYXR0ZXJ5ZXYgfSwKKwl7IDAgfSwKK307CitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudHR5cGVzIHR5cGUyX2V2ZW50c1tdID0geworCXsgMCwgMHhmZmZmZmZmZiwgc29ueXBpX3JlbGVhc2VldiB9LAorCXsgMHgzOCwgU09OWVBJX0xJRF9NQVNLLCBzb255cGlfbGlkZXYgfSwKKwl7IDB4MTEsIFNPTllQSV9KT0dHRVJfTUFTSywgc29ueXBpX2pvZ2dlcmV2IH0sCisJeyAweDYxLCBTT05ZUElfQ0FQVFVSRV9NQVNLLCBzb255cGlfY2FwdHVyZWV2IH0sCisJeyAweDIxLCBTT05ZUElfRk5LRVlfTUFTSywgc29ueXBpX2Zua2V5ZXYgfSwKKwl7IDB4MzEsIFNPTllQSV9CTFVFVE9PVEhfTUFTSywgc29ueXBpX2JsdWVldiB9LAorCXsgMHgwOCwgU09OWVBJX1BLRVlfTUFTSywgc29ueXBpX3BrZXlldiB9LAorCXsgMHgxMSwgU09OWVBJX0JBQ0tfTUFTSywgc29ueXBpX2JhY2tldiB9LAorCXsgMHgyMSwgU09OWVBJX0hFTFBfTUFTSywgc29ueXBpX2hlbHBldiB9LAorCXsgMHgyMSwgU09OWVBJX1pPT01fTUFTSywgc29ueXBpX3pvb21ldiB9LAorCXsgMHgyMCwgU09OWVBJX1RIVU1CUEhSQVNFX01BU0ssIHNvbnlwaV90aHVtYnBocmFzZWV2IH0sCisJeyAweDMxLCBTT05ZUElfTUVNT1JZU1RJQ0tfTUFTSywgc29ueXBpX21lbW9yeXN0aWNrZXYgfSwKKwl7IDB4NDEsIFNPTllQSV9CQVRURVJZX01BU0ssIHNvbnlwaV9iYXR0ZXJ5ZXYgfSwKKwl7IDB4MzEsIFNPTllQSV9QS0VZX01BU0ssIHNvbnlwaV9wa2V5ZXYgfSwKKwl7IDAgfSwKK307CitzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudHR5cGVzIHR5cGUzX2V2ZW50c1tdID0geworCXsgMCwgMHhmZmZmZmZmZiwgc29ueXBpX3JlbGVhc2VldiB9LAorCXsgMHgyMSwgU09OWVBJX0ZOS0VZX01BU0ssIHNvbnlwaV9mbmtleWV2IH0sCisJeyAweDMxLCBTT05ZUElfV0lSRUxFU1NfTUFTSywgc29ueXBpX3dsZXNzZXYgfSwKKwl7IDB4MzEsIFNPTllQSV9NRU1PUllTVElDS19NQVNLLCBzb255cGlfbWVtb3J5c3RpY2tldiB9LAorCXsgMHg0MSwgU09OWVBJX0JBVFRFUllfTUFTSywgc29ueXBpX2JhdHRlcnlldiB9LAorCXsgMHgzMSwgU09OWVBJX1BLRVlfTUFTSywgc29ueXBpX3BrZXlldiB9LAorCXsgMCB9LAorfTsKK3N0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50dHlwZXMgdHlwZTRfZXZlbnRzW10gPSB7CisJeyAwLCAweGZmZmZmZmZmLCBzb255cGlfcmVsZWFzZWV2IH0sCisJeyAweDIxLCBTT05ZUElfRk5LRVlfTUFTSywgc29ueXBpX2Zua2V5ZXYgfSwKKwl7IDB4MzEsIFNPTllQSV9XSVJFTEVTU19NQVNLLCBzb255cGlfd2xlc3NldiB9LAorCXsgMHgzMSwgU09OWVBJX01FTU9SWVNUSUNLX01BU0ssIHNvbnlwaV9tZW1vcnlzdGlja2V2IH0sCisJeyAweDQxLCBTT05ZUElfQkFUVEVSWV9NQVNLLCBzb255cGlfYmF0dGVyeWV2IH0sCisJeyAweDA1LCBTT05ZUElfUEtFWV9NQVNLLCBzb255cGlfcGtleWV2IH0sCisJeyAweDA1LCBTT05ZUElfWk9PTV9NQVNLLCBzb255cGlfem9vbWV2IH0sCisJeyAweDA1LCBTT05ZUElfQ0FQVFVSRV9NQVNLLCBzb255cGlfY2FwdHVyZWV2IH0sCisJeyAwIH0sCiB9OwogCi1zdGF0aWMgaW50IHNvbnlfcGljX2RldGVjdF9kZXZpY2VfdHlwZSh2b2lkKQotewotCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7Ci0JaW50IG1vZGVsID0gMDsKLQotCWlmICgocGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkJCQkgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQl8zLCBOVUxMKSkpCi0JCW1vZGVsID0gU09OWVBJX0RFVklDRV9UWVBFMTsKLQotCWVsc2UgaWYgKChwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAotCQkJCQkgIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8xLCBOVUxMKSkpCi0JCW1vZGVsID0gU09OWVBJX0RFVklDRV9UWVBFMzsKLQotCWVsc2UgaWYgKChwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAotCQkJCQkgIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIN18xLCBOVUxMKSkpCi0JCW1vZGVsID0gU09OWVBJX0RFVklDRV9UWVBFMzsKLQotCWVsc2UKLQkJbW9kZWwgPSBTT05ZUElfREVWSUNFX1RZUEUyOwotCi0JaWYgKHBjaWRldikKLQkJcGNpX2Rldl9wdXQocGNpZGV2KTsKLQotCXByaW50ayhLRVJOX0lORk8gRFJWX1BGWCAiZGV0ZWN0ZWQgVHlwZSVkIG1vZGVsXG4iLAotCQkJbW9kZWwgPT0gU09OWVBJX0RFVklDRV9UWVBFMSA/IDEgOgotCQkJbW9kZWwgPT0gU09OWVBJX0RFVklDRV9UWVBFMiA/IDIgOiAzKTsKLQlyZXR1cm4gbW9kZWw7Ci19Ci0KKy8qIGxvdyBsZXZlbCBzcGljIGNhbGxzICovCiAjZGVmaW5lIElURVJBVElPTlNfTE9ORwkJMTAwMDAKICNkZWZpbmUgSVRFUkFUSU9OU19TSE9SVAkxMAogI2RlZmluZSB3YWl0X29uX2NvbW1hbmQoY29tbWFuZCwgaXRlcmF0aW9ucykgewkJCQlcCkBAIC0xNDUxLDcgKzE0NjUsNyBAQAogCW91dGIoZGV2LCBzcGljX2Rldi5jdXJfaW9wb3J0LT5pbzEubWluaW11bSArIDQpOwogCXYxID0gaW5iX3Aoc3BpY19kZXYuY3VyX2lvcG9ydC0+aW8xLm1pbmltdW0gKyA0KTsKIAl2MiA9IGluYl9wKHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvMS5taW5pbXVtKTsKLQlkcHJpbnRrKCJzb255X3BpY19jYWxsMTogMHglLjR4XG4iLCAodjIgPDwgOCkgfCB2MSk7CisJZHByaW50aygic29ueV9waWNfY2FsbDEoMHglLjJ4KTogMHglLjR4XG4iLCBkZXYsICh2MiA8PCA4KSB8IHYxKTsKIAlyZXR1cm4gdjI7CiB9CiAKQEAgLTE0NjYsNyArMTQ4MCw3IEBACiAJCQlJVEVSQVRJT05TX0xPTkcpOwogCW91dGIoZm4sIHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvMS5taW5pbXVtKTsKIAl2MSA9IGluYl9wKHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvMS5taW5pbXVtKTsKLQlkcHJpbnRrKCJzb255X3BpY19jYWxsMjogMHglLjR4XG4iLCB2MSk7CisJZHByaW50aygic29ueV9waWNfY2FsbDIoMHglLjJ4IC0gMHglLjJ4KTogMHglLjR4XG4iLCBkZXYsIGZuLCB2MSk7CiAJcmV0dXJuIHYxOwogfQogCkBAIC0xNDgxLDEwICsxNDk1LDEwNSBAQAogCXdhaXRfb25fY29tbWFuZChpbmJfcChzcGljX2Rldi5jdXJfaW9wb3J0LT5pbzEubWluaW11bSArIDQpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKIAlvdXRiKHYsIHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvMS5taW5pbXVtKTsKIAl2MSA9IGluYl9wKHNwaWNfZGV2LmN1cl9pb3BvcnQtPmlvMS5taW5pbXVtKTsKLQlkcHJpbnRrKCJzb255X3BpY19jYWxsMzogMHglLjR4XG4iLCB2MSk7CisJZHByaW50aygic29ueV9waWNfY2FsbDMoMHglLjJ4IC0gMHglLjJ4IC0gMHglLjJ4KTogMHglLjR4XG4iLAorCQkJZGV2LCBmbiwgdiwgdjEpOwogCXJldHVybiB2MTsKIH0KIAorLyoKKyAqIG1pbmlkcml2ZXJzIGZvciBTUElDIG1vZGVscworICovCitzdGF0aWMgaW50IHR5cGU0X2hhbmRsZV9pcnEoY29uc3QgdTggZGF0YV9tYXNrLCBjb25zdCB1OCBldikKK3sKKwkvKgorCSAqIDB4MzEgY291bGQgbWVhbiB3ZSBoYXZlIHRvIHRha2Ugc29tZSBleHRyYSBhY3Rpb24gYW5kIHdhaXQgZm9yCisJICogdGhlIG5leHQgaXJxIGZvciBzb21lIFR5cGU0IG1vZGVscywgaXQgd2lsbCBnZW5lcmF0ZSBhIG5ldworCSAqIGlycSBhbmQgd2UgY2FuIHJlYWQgbmV3IGRhdGEgZnJvbSB0aGUgZGV2aWNlOgorCSAqICAtIDB4NWMgYW5kIDB4NWYgcmVxdWlyZXMgMHhBMAorCSAqICAtIDB4NjEgcmVxdWlyZXMgMHhCMworCSAqLworCWlmIChkYXRhX21hc2sgPT0gMHgzMSkgeworCQlpZiAoZXYgPT0gMHg1YyB8fCBldiA9PSAweDVmKQorCQkJc29ueV9waWNfY2FsbDEoMHhBMCk7CisJCWVsc2UgaWYgKGV2ID09IDB4NjEpCisJCQlzb255X3BpY19jYWxsMSgweEIzKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9jdHJsIHNwaWNfdHlwZXNbXSA9IHsKKwl7CisJCS5tb2RlbCA9IFNPTllQSV9ERVZJQ0VfVFlQRTEsCisJCS5oYW5kbGVfaXJxID0gTlVMTCwKKwkJLmV2cG9ydF9vZmZzZXQgPSBTT05ZUElfVFlQRTFfT0ZGU0VULAorCQkuZXZlbnRfdHlwZXMgPSB0eXBlMV9ldmVudHMsCisJfSwKKwl7CisJCS5tb2RlbCA9IFNPTllQSV9ERVZJQ0VfVFlQRTIsCisJCS5oYW5kbGVfaXJxID0gTlVMTCwKKwkJLmV2cG9ydF9vZmZzZXQgPSBTT05ZUElfVFlQRTJfT0ZGU0VULAorCQkuZXZlbnRfdHlwZXMgPSB0eXBlMl9ldmVudHMsCisJfSwKKwl7CisJCS5tb2RlbCA9IFNPTllQSV9ERVZJQ0VfVFlQRTMsCisJCS5oYW5kbGVfaXJxID0gTlVMTCwKKwkJLmV2cG9ydF9vZmZzZXQgPSBTT05ZUElfVFlQRTNfT0ZGU0VULAorCQkuZXZlbnRfdHlwZXMgPSB0eXBlM19ldmVudHMsCisJfSwKKwl7CisJCS5tb2RlbCA9IFNPTllQSV9ERVZJQ0VfVFlQRTQsCisJCS5oYW5kbGVfaXJxID0gdHlwZTRfaGFuZGxlX2lycSwKKwkJLmV2cG9ydF9vZmZzZXQgPSBTT05ZUElfVFlQRTRfT0ZGU0VULAorCQkuZXZlbnRfdHlwZXMgPSB0eXBlNF9ldmVudHMsCisJfSwKK307CisKK3N0YXRpYyB2b2lkIHNvbnlfcGljX2RldGVjdF9kZXZpY2VfdHlwZShzdHJ1Y3Qgc29ueV9waWNfZGV2ICpkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaWRldjsKKworCXBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCisJCQlQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMywgTlVMTCk7CisJaWYgKHBjaWRldikgeworCQlkZXYtPmNvbnRyb2wgPSAmc3BpY190eXBlc1swXTsKKwkJZ290byBvdXQ7CisJfQorCisJcGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCVBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8xLCBOVUxMKTsKKwlpZiAocGNpZGV2KSB7CisJCWRldi0+Y29udHJvbCA9ICZzcGljX3R5cGVzWzJdOworCQlnb3RvIG91dDsKKwl9CisKKwlwY2lkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkJUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzEsIE5VTEwpOworCWlmIChwY2lkZXYpIHsKKwkJZGV2LT5jb250cm9sID0gJnNwaWNfdHlwZXNbM107CisJCWdvdG8gb3V0OworCX0KKworCXBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCisJCQlQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfNCwgTlVMTCk7CisJaWYgKHBjaWRldikgeworCQlkZXYtPmNvbnRyb2wgPSAmc3BpY190eXBlc1szXTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogZGVmYXVsdCAqLworCWRldi0+Y29udHJvbCA9ICZzcGljX3R5cGVzWzFdOworCitvdXQ6CisJaWYgKHBjaWRldikKKwkJcGNpX2Rldl9wdXQocGNpZGV2KTsKKworCXByaW50ayhLRVJOX0lORk8gRFJWX1BGWCAiZGV0ZWN0ZWQgVHlwZSVkIG1vZGVsXG4iLAorCQkJZGV2LT5jb250cm9sLT5tb2RlbCA9PSBTT05ZUElfREVWSUNFX1RZUEUxID8gMSA6CisJCQlkZXYtPmNvbnRyb2wtPm1vZGVsID09IFNPTllQSV9ERVZJQ0VfVFlQRTIgPyAyIDoKKwkJCWRldi0+Y29udHJvbC0+bW9kZWwgPT0gU09OWVBJX0RFVklDRV9UWVBFMyA/IDMgOiA0KTsKK30KKwogLyogY2FtZXJhIHRlc3RzIGFuZCBwb3dlcm9uL3Bvd2Vyb2ZmICovCiAjZGVmaW5lIFNPTllQSV9DQU1FUkFfUElDVFVSRQkJNQogI2RlZmluZSBTT05ZUElfQ0FNRVJBX0NPTlRST0wJCTB4MTAKQEAgLTIyNTMsNyArMjM2Miw3IEBACiAJYnVmZmVyLnBvaW50ZXIgPSByZXNvdXJjZTsKIAogCS8qIHNldHVwIFR5cGUgMSByZXNvdXJjZXMgKi8KLQlpZiAoc3BpY19kZXYubW9kZWwgPT0gU09OWVBJX0RFVklDRV9UWVBFMSkgeworCWlmIChzcGljX2Rldi5jb250cm9sLT5tb2RlbCA9PSBTT05ZUElfREVWSUNFX1RZUEUxKSB7CiAKIAkJLyogc2V0dXAgaW8gcmVzb3VyY2VzICovCiAJCXJlc291cmNlLT5yZXMxLnR5cGUgPSBBQ1BJX1JFU09VUkNFX1RZUEVfSU87CkBAIC0yMzM1LDM5ICsyNDQ0LDQ5IEBACiAJaWYgKGRldi0+Y3VyX2lvcG9ydC0+aW8yLm1pbmltdW0pCiAJCWRhdGFfbWFzayA9IGluYl9wKGRldi0+Y3VyX2lvcG9ydC0+aW8yLm1pbmltdW0pOwogCWVsc2UKLQkJZGF0YV9tYXNrID0gaW5iX3AoZGV2LT5jdXJfaW9wb3J0LT5pbzEubWluaW11bSArIGRldi0+ZXZwb3J0X29mZnNldCk7CisJCWRhdGFfbWFzayA9IGluYl9wKGRldi0+Y3VyX2lvcG9ydC0+aW8xLm1pbmltdW0gKworCQkJCWRldi0+Y29udHJvbC0+ZXZwb3J0X29mZnNldCk7CiAKIAlkcHJpbnRrKCJldmVudCAoWyUuMnhdIFslLjJ4XSkgYXQgcG9ydCAweCUuNHgoKzB4JS4yeClcbiIsCi0JCQlldiwgZGF0YV9tYXNrLCBkZXYtPmN1cl9pb3BvcnQtPmlvMS5taW5pbXVtLCBkZXYtPmV2cG9ydF9vZmZzZXQpOworCQkJZXYsIGRhdGFfbWFzaywgZGV2LT5jdXJfaW9wb3J0LT5pbzEubWluaW11bSwKKwkJCWRldi0+Y29udHJvbC0+ZXZwb3J0X29mZnNldCk7CiAKIAlpZiAoZXYgPT0gMHgwMCB8fCBldiA9PSAweGZmKQogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAKLQlmb3IgKGkgPSAwOyBzb255X3BpY19ldmVudHR5cGVzW2ldLm1vZGVsOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBkZXYtPmNvbnRyb2wtPmV2ZW50X3R5cGVzW2ldLm1hc2s7IGkrKykgewogCi0JCWlmIChzcGljX2Rldi5tb2RlbCAhPSBzb255X3BpY19ldmVudHR5cGVzW2ldLm1vZGVsKQorCQlpZiAoKGRhdGFfbWFzayAmIGRldi0+Y29udHJvbC0+ZXZlbnRfdHlwZXNbaV0uZGF0YSkgIT0KKwkJICAgIGRldi0+Y29udHJvbC0+ZXZlbnRfdHlwZXNbaV0uZGF0YSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmICgoZGF0YV9tYXNrICYgc29ueV9waWNfZXZlbnR0eXBlc1tpXS5kYXRhKSAhPQotCQkgICAgc29ueV9waWNfZXZlbnR0eXBlc1tpXS5kYXRhKQorCQlpZiAoIShtYXNrICYgZGV2LT5jb250cm9sLT5ldmVudF90eXBlc1tpXS5tYXNrKSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmICghKG1hc2sgJiBzb255X3BpY19ldmVudHR5cGVzW2ldLm1hc2spKQotCQkJY29udGludWU7Ci0KLQkJZm9yIChqID0gMDsgc29ueV9waWNfZXZlbnR0eXBlc1tpXS5ldmVudHNbal0uZXZlbnQ7IGorKykgewotCQkJaWYgKGV2ID09IHNvbnlfcGljX2V2ZW50dHlwZXNbaV0uZXZlbnRzW2pdLmRhdGEpIHsKKwkJZm9yIChqID0gMDsgZGV2LT5jb250cm9sLT5ldmVudF90eXBlc1tpXS5ldmVudHNbal0uZXZlbnQ7IGorKykgeworCQkJaWYgKGV2ID09IGRldi0+Y29udHJvbC0+ZXZlbnRfdHlwZXNbaV0uZXZlbnRzW2pdLmRhdGEpIHsKIAkJCQlkZXZpY2VfZXZlbnQgPQotCQkJCQlzb255X3BpY19ldmVudHR5cGVzW2ldLmV2ZW50c1tqXS5ldmVudDsKKwkJCQkJZGV2LT5jb250cm9sLT4KKwkJCQkJCWV2ZW50X3R5cGVzW2ldLmV2ZW50c1tqXS5ldmVudDsKIAkJCQlnb3RvIGZvdW5kOwogCQkJfQogCQl9CiAJfQorCS8qIFN0aWxsIG5vdCBhYmxlIHRvIGRlY29kZSB0aGUgZXZlbnQgdHJ5IHRvIHBhc3MKKwkgKiBpdCBvdmVyIHRvIHRoZSBtaW5pZHJpdmVyCisJICovCisJaWYgKGRldi0+Y29udHJvbC0+aGFuZGxlX2lycSAmJgorCQkJZGV2LT5jb250cm9sLT5oYW5kbGVfaXJxKGRhdGFfbWFzaywgZXYpID09IDApCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCWRwcmludGsoInVua25vd24gZXZlbnQgKFslLjJ4XSBbJS4yeF0pIGF0IHBvcnQgMHglLjR4KCsweCUuMngpXG4iLAorCQkJZXYsIGRhdGFfbWFzaywgZGV2LT5jdXJfaW9wb3J0LT5pbzEubWluaW11bSwKKwkJCWRldi0+Y29udHJvbC0+ZXZwb3J0X29mZnNldCk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogCiBmb3VuZDoKIAlzb255X2xhcHRvcF9yZXBvcnRfaW5wdXRfZXZlbnQoZGV2aWNlX2V2ZW50KTsKLQlhY3BpX2J1c19nZW5lcmF0ZV9wcm9jX2V2ZW50KHNwaWNfZGV2LmFjcGlfZGV2LCAxLCBkZXZpY2VfZXZlbnQpOworCWFjcGlfYnVzX2dlbmVyYXRlX3Byb2NfZXZlbnQoZGV2LT5hY3BpX2RldiwgMSwgZGV2aWNlX2V2ZW50KTsKIAlzb255cGlfY29tcGF0X3JlcG9ydF9ldmVudChkZXZpY2VfZXZlbnQpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtMjQyOSwyMyArMjU0OCw5IEBACiAKIAlzcGljX2Rldi5hY3BpX2RldiA9IGRldmljZTsKIAlzdHJjcHkoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgInNvbnkvaG90a2V5Iik7Ci0Jc3BpY19kZXYubW9kZWwgPSBzb255X3BpY19kZXRlY3RfZGV2aWNlX3R5cGUoKTsKKwlzb255X3BpY19kZXRlY3RfZGV2aWNlX3R5cGUoJnNwaWNfZGV2KTsKIAltdXRleF9pbml0KCZzcGljX2Rldi5sb2NrKTsKIAotCS8qIG1vZGVsIHNwZWNpZmljIGNoYXJhY3RlcmlzdGljcyAqLwotCXN3aXRjaChzcGljX2Rldi5tb2RlbCkgewotCQljYXNlIFNPTllQSV9ERVZJQ0VfVFlQRTE6Ci0JCQlzcGljX2Rldi5ldnBvcnRfb2Zmc2V0ID0gU09OWVBJX1RZUEUxX09GRlNFVDsKLQkJCWJyZWFrOwotCQljYXNlIFNPTllQSV9ERVZJQ0VfVFlQRTM6Ci0JCQlzcGljX2Rldi5ldnBvcnRfb2Zmc2V0ID0gU09OWVBJX1RZUEUzX09GRlNFVDsKLQkJCWJyZWFrOwotCQljYXNlIFNPTllQSV9ERVZJQ0VfVFlQRTI6Ci0JCWRlZmF1bHQ6Ci0JCQlzcGljX2Rldi5ldnBvcnRfb2Zmc2V0ID0gU09OWVBJX1RZUEUyX09GRlNFVDsKLQkJCWJyZWFrOwotCX0KLQogCS8qIHJlYWQgX1BSUyByZXNvdXJjZXMgKi8KIAlyZXN1bHQgPSBzb255X3BpY19wb3NzaWJsZV9yZXNvdXJjZXMoZGV2aWNlKTsKIAlpZiAocmVzdWx0KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvdGMxMTAwLXdtaS5jIGIvZHJpdmVycy9taXNjL3RjMTEwMC13bWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjVlNGM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9taXNjL3RjMTEwMC13bWkuYwpAQCAtMCwwICsxLDI5MCBAQAorLyoKKyAqICBIUCBDb21wYXEgVEMxMTAwIFRhYmxldCBXTUkgRXh0cmFzIERyaXZlcgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgQ2FybG9zIENvcmJhY2hvIDxjYXJsb3NAc3RyYW5nZXdvcmxkcy5jby51az4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgSmFtZXkgSGlja3MgPGphbWV5LmhpY2tzQGhwLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgQW5keSBHcm92ZXIgPGFuZHJldy5ncm92ZXJAaW50ZWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBQYXVsIERpZWZlbmJhdWdoIDxwYXVsLnMuZGllZmVuYmF1Z2hAaW50ZWwuY29tPgorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlIDxhY3BpL2FjdHlwZXMuaD4KKyNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2RlZmluZSBHVUlEICJDMzY0QUM3MS0zNkRCLTQ5NUEtODQ5NC1CNDM5RDQ3MkE1MDUiCisKKyNkZWZpbmUgVEMxMTAwX0lOU1RBTkNFX1dJUkVMRVNTCQkxCisjZGVmaW5lIFRDMTEwMF9JTlNUQU5DRV9KT0dESUFMCQkyCisKKyNkZWZpbmUgVEMxMTAwX0xPR1BSRUZJWCAidGMxMTAwLXdtaTogIgorI2RlZmluZSBUQzExMDBfSU5GTyBLRVJOX0lORk8gVEMxMTAwX0xPR1BSRUZJWAorCitNT0RVTEVfQVVUSE9SKCJKYW1leSBIaWNrcywgQ2FybG9zIENvcmJhY2hvIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhQIENvbXBhcSBUQzExMDAgVGFibGV0IFdNSSBFeHRyYXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygid21pOkMzNjRBQzcxLTM2REItNDk1QS04NDk0LUI0MzlENDcyQTUwNSIpOworCitzdGF0aWMgaW50IHRjMTEwMF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UpOworc3RhdGljIGludCB0YzExMDBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZSk7CitzdGF0aWMgaW50IHRjMTEwMF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZSwgcG1fbWVzc2FnZV90IHN0YXRlKTsKK3N0YXRpYyBpbnQgdGMxMTAwX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0YzExMDBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInRjMTEwMC13bWkiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IHRjMTEwMF9wcm9iZSwKKwkucmVtb3ZlID0gdGMxMTAwX3JlbW92ZSwKKwkuc3VzcGVuZCA9IHRjMTEwMF9zdXNwZW5kLAorCS5yZXN1bWUgPSB0YzExMDBfcmVzdW1lLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnRjMTEwMF9kZXZpY2U7CisKK3N0cnVjdCB0YzExMDBfZGF0YSB7CisJdTMyIHdpcmVsZXNzOworCXUzMiBqb2dkaWFsOworfTsKKworc3RhdGljIHN0cnVjdCB0YzExMDBfZGF0YSBzdXNwZW5kX2RhdGE7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJRGV2aWNlIE1hbmFnZW1lbnQKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgZ2V0X3N0YXRlKHUzMiAqb3V0LCB1OCBpbnN0YW5jZSkKK3sKKwl1MzIgdG1wOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgcmVzdWx0ID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7CisKKwlpZiAoIW91dCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaW5zdGFuY2UgPiAyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN0YXR1cyA9IHdtaV9xdWVyeV9ibG9jayhHVUlELCBpbnN0YW5jZSwgJnJlc3VsdCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW9iaiA9ICh1bmlvbiBhY3BpX29iamVjdCAqKSByZXN1bHQucG9pbnRlcjsKKwlpZiAob2JqICYmIG9iai0+dHlwZSA9PSBBQ1BJX1RZUEVfQlVGRkVSICYmCisJCW9iai0+YnVmZmVyLmxlbmd0aCA9PSBzaXplb2YodTMyKSkgeworCQl0bXAgPSAqKCh1MzIgKikgb2JqLT5idWZmZXIucG9pbnRlcik7CisJfSBlbHNlIHsKKwkJdG1wID0gMDsKKwl9CisKKwlpZiAocmVzdWx0Lmxlbmd0aCA+IDAgJiYgcmVzdWx0LnBvaW50ZXIpCisJCWtmcmVlKHJlc3VsdC5wb2ludGVyKTsKKworCXN3aXRjaCAoaW5zdGFuY2UpIHsKKwljYXNlIFRDMTEwMF9JTlNUQU5DRV9XSVJFTEVTUzoKKwkJKm91dCA9ICh0bXAgPT0gMykgPyAxIDogMDsKKwkJcmV0dXJuIDA7CisJY2FzZSBUQzExMDBfSU5TVEFOQ0VfSk9HRElBTDoKKwkJKm91dCA9ICh0bXAgPT0gMSkgPyAxIDogMDsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorfQorCitzdGF0aWMgaW50IHNldF9zdGF0ZSh1MzIgKmluLCB1OCBpbnN0YW5jZSkKK3sKKwl1MzIgdmFsdWU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX2J1ZmZlciBpbnB1dDsKKworCWlmICghaW4pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGluc3RhbmNlID4gMikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzd2l0Y2ggKGluc3RhbmNlKSB7CisJY2FzZSBUQzExMDBfSU5TVEFOQ0VfV0lSRUxFU1M6CisJCXZhbHVlID0gKCppbikgPyAxIDogMjsKKwkJYnJlYWs7CisJY2FzZSBUQzExMDBfSU5TVEFOQ0VfSk9HRElBTDoKKwkJdmFsdWUgPSAoKmluKSA/IDAgOiAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpbnB1dC5sZW5ndGggPSBzaXplb2YodTMyKTsKKwlpbnB1dC5wb2ludGVyID0gJnZhbHVlOworCisJc3RhdHVzID0gd21pX3NldF9ibG9jayhHVUlELCBpbnN0YW5jZSwgJmlucHV0KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJRlMgSW50ZXJmYWNlICgvc3lzKQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFJlYWQvIHdyaXRlIGJvb2wgc3lzZnMgbWFjcm8KKyAqLworI2RlZmluZSBzaG93X3NldF9ib29sKHZhbHVlLCBpbnN0YW5jZSkgXAorc3RhdGljIHNzaXplX3QgXAorc2hvd19ib29sXyMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgXAorCWNoYXIgKmJ1ZikgXAoreyBcCisJdTMyIHJlc3VsdDsgXAorCWFjcGlfc3RhdHVzIHN0YXR1cyA9IGdldF9zdGF0ZSgmcmVzdWx0LCBpbnN0YW5jZSk7IFwKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIFwKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJlc3VsdCk7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICJSZWFkIGVycm9yXG4iKTsgXAorfSBcCitcCitzdGF0aWMgc3NpemVfdCBcCitzZXRfYm9vbF8jI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIFwKKwljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAoreyBcCisJdTMyIHRtcCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOyBcCisJYWNwaV9zdGF0dXMgc3RhdHVzID0gc2V0X3N0YXRlKCZ0bXAsIGluc3RhbmNlKTsgXAorCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIFwKKwkJCXJldHVybiAtRUlOVkFMOyBcCisJcmV0dXJuIGNvdW50OyBcCit9IFwKK3N0YXRpYyBERVZJQ0VfQVRUUih2YWx1ZSwgU19JV1VHTyB8IFNfSVJVR08gfCBTX0lXVVNSLCBcCisJc2hvd19ib29sXyMjdmFsdWUsIHNldF9ib29sXyMjdmFsdWUpOworCitzaG93X3NldF9ib29sKHdpcmVsZXNzLCBUQzExMDBfSU5TVEFOQ0VfV0lSRUxFU1MpOworc2hvd19zZXRfYm9vbChqb2dkaWFsLCBUQzExMDBfSU5TVEFOQ0VfSk9HRElBTCk7CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9mcyh2b2lkKQoreworCWRldmljZV9yZW1vdmVfZmlsZSgmdGMxMTAwX2RldmljZS0+ZGV2LCAmZGV2X2F0dHJfd2lyZWxlc3MpOworCWRldmljZV9yZW1vdmVfZmlsZSgmdGMxMTAwX2RldmljZS0+ZGV2LCAmZGV2X2F0dHJfam9nZGlhbCk7Cit9CisKK3N0YXRpYyBpbnQgYWRkX2ZzKHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmdGMxMTAwX2RldmljZS0+ZGV2LCAmZGV2X2F0dHJfd2lyZWxlc3MpOworCWlmIChyZXQpCisJCWdvdG8gYWRkX3N5c2ZzX2Vycm9yOworCisJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ0YzExMDBfZGV2aWNlLT5kZXYsICZkZXZfYXR0cl9qb2dkaWFsKTsKKwlpZiAocmV0KQorCQlnb3RvIGFkZF9zeXNmc19lcnJvcjsKKworCXJldHVybiByZXQ7CisKK2FkZF9zeXNmc19lcnJvcjoKKwlyZW1vdmVfZnMoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCURyaXZlciBNb2RlbAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCB0YzExMDBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlKQoreworCWludCByZXN1bHQgPSAwOworCisJcmVzdWx0ID0gYWRkX2ZzKCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgaW50IHRjMTEwMF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlKQoreworCXJlbW92ZV9mcygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRjMTEwMF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCWludCByZXQ7CisKKwlyZXQgPSBnZXRfc3RhdGUoJnN1c3BlbmRfZGF0YS53aXJlbGVzcywgVEMxMTAwX0lOU1RBTkNFX1dJUkVMRVNTKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZ2V0X3N0YXRlKCZzdXNwZW5kX2RhdGEuam9nZGlhbCwgVEMxMTAwX0lOU1RBTkNFX0pPR0RJQUwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRjMTEwMF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCWludCByZXQ7CisKKwlyZXQgPSBzZXRfc3RhdGUoJnN1c3BlbmRfZGF0YS53aXJlbGVzcywgVEMxMTAwX0lOU1RBTkNFX1dJUkVMRVNTKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc2V0X3N0YXRlKCZzdXNwZW5kX2RhdGEuam9nZGlhbCwgVEMxMTAwX0lOU1RBTkNFX0pPR0RJQUwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9faW5pdCB0YzExMDBfaW5pdCh2b2lkKQoreworCWludCByZXN1bHQgPSAwOworCisJaWYgKCF3bWlfaGFzX2d1aWQoR1VJRCkpCisJCXJldHVybiAtRU5PREVWOworCisJcmVzdWx0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ0YzExMDBfZHJpdmVyKTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gcmVzdWx0OworCisJdGMxMTAwX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygidGMxMTAwLXdtaSIsIC0xKTsKKwlwbGF0Zm9ybV9kZXZpY2VfYWRkKHRjMTEwMF9kZXZpY2UpOworCisJcHJpbnRrKFRDMTEwMF9JTkZPICJIUCBDb21wYXEgVEMxMTAwIFRhYmxldCBXTUkgRXh0cmFzIGxvYWRlZFxuIik7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdGMxMTAwX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfZGVsKHRjMTEwMF9kZXZpY2UpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0YzExMDBfZHJpdmVyKTsKKworCXByaW50ayhUQzExMDBfSU5GTyAiSFAgQ29tcGFxIFRDMTEwMCBUYWJsZXQgV01JIEV4dHJhcyB1bmxvYWRlZFxuIik7Cit9CisKK21vZHVsZV9pbml0KHRjMTEwMF9pbml0KTsKK21vZHVsZV9leGl0KHRjMTEwMF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy90aGlua3BhZF9hY3BpLmMgYi9kcml2ZXJzL21pc2MvdGhpbmtwYWRfYWNwaS5jCmluZGV4IGNmNTY2NDcuLjdiYTFhY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy90aGlua3BhZF9hY3BpLmMKKysrIGIvZHJpdmVycy9taXNjL3RoaW5rcGFkX2FjcGkuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEJvcmlzbGF2IERlaWFub3YgPGJvcmlzbGF2QHVzZXJzLnNmLm5ldD4KLSAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBIZW5yaXF1ZSBkZSBNb3JhZXMgSG9sc2NodWggPGhtaEBobWguZW5nLmJyPgorICogIENvcHlyaWdodCAoQykgMjAwNi0yMDA4IEhlbnJpcXVlIGRlIE1vcmFlcyBIb2xzY2h1aCA8aG1oQGhtaC5lbmcuYnI+CiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTIxLDExICsyMSwxMyBAQAogICogIDAyMTEwLTEzMDEsIFVTQS4KICAqLwogCi0jZGVmaW5lIElCTV9WRVJTSU9OICIwLjE3IgotI2RlZmluZSBUUEFDUElfU1lTRlNfVkVSU0lPTiAweDAyMDAwMAorI2RlZmluZSBUUEFDUElfVkVSU0lPTiAiMC4xOSIKKyNkZWZpbmUgVFBBQ1BJX1NZU0ZTX1ZFUlNJT04gMHgwMjAyMDAKIAogLyoKICAqICBDaGFuZ2Vsb2c6CisgKiAgMjAwNy0xMC0yMAkJY2hhbmdlbG9nIHRyaW1tZWQgZG93bgorICoKICAqICAyMDA3LTAzLTI3ICAwLjE0CXJlbmFtZWQgdG8gdGhpbmtwYWRfYWNwaSBhbmQgbW92ZWQgdG8KICAqICAJCQlkcml2ZXJzL21pc2MuCiAgKgpAQCAtMzMsODkgKzM1LDIxOSBAQAogICogIAkJCWNoYW5nZWxvZyBub3cgbGl2ZXMgaW4gZ2l0IGNvbW1pdCBoaXN0b3J5LCBhbmQgd2lsbAogICogIAkJCW5vdCBiZSB1cGRhdGVkIGZ1cnRoZXIgaW4tZmlsZS4KICAqCi0gKiAgMjAwNS0wOC0xNyAgMC4xMglmaXggY29tcGlsYXRpb24gb24gMi42LjEzLXJjIGtlcm5lbHMKICAqICAyMDA1LTAzLTE3CTAuMTEJc3VwcG9ydCBmb3IgNjAwZSwgNzcweAogICoJCQkgICAgdGhhbmtzIHRvIEphbWllIExlbnRpbiA8bGVudGluakBkaWFsLnBpcGV4LmNvbT4KLSAqCQkJc3VwcG9ydCBmb3IgNzcwZSwgRzQxCi0gKgkJCUc0MCBhbmQgRzQxIGRvbid0IGhhdmUgYSB0aGlua2xpZ2h0Ci0gKgkJCXRlbXBlcmF0dXJlcyBubyBsb25nZXIgZXhwZXJpbWVudGFsCi0gKgkJCWV4cGVyaW1lbnRhbCBicmlnaHRuZXNzIGNvbnRyb2wKLSAqCQkJZXhwZXJpbWVudGFsIHZvbHVtZSBjb250cm9sCi0gKgkJCWV4cGVyaW1lbnRhbCBmYW4gZW5hYmxlL2Rpc2FibGUKLSAqICAyMDA1LTAxLTE2CTAuMTAJZml4IG1vZHVsZSBsb2FkaW5nIG9uIFIzMCwgUjMxCi0gKiAgMjAwNS0wMS0xNgkwLjkJc3VwcG9ydCBmb3IgNTcwLCBSMzAsIFIzMQotICoJCQl1bHRyYWJheSBzdXBwb3J0IG9uIEEyMnAsIEEzeAotICoJCQlsaW1pdCBhcmcgZm9yIGNtb3MsIGxlZCwgYmVlcCwgZHJvcCBleHBlcmltZW50YWwgc3RhdHVzCi0gKgkJCW1vcmUgY2FwYWJsZSBsZWQgY29udHJvbCBvbiBBMjFlLCBBMjJwLCBUMjAtMjIsIFgyMAotICoJCQlleHBlcmltZW50YWwgdGVtcGVyYXR1cmVzIGFuZCBmYW4gc3BlZWQKLSAqCQkJZXhwZXJpbWVudGFsIGVtYmVkZGVkIGNvbnRyb2xsZXIgcmVnaXN0ZXIgZHVtcAotICoJCQltYXJrIG1vcmUgZnVuY3Rpb25zIGFzIF9faW5pdCwgZHJvcCBpbmNvcnJlY3QgX19leGl0Ci0gKgkJCXVzZSBNT0RVTEVfVkVSU0lPTgorICoKKyAqICAyMDA1LTAxLTE2CTAuOQl1c2UgTU9EVUxFX1ZFUlNJT04KICAqCQkJICAgIHRoYW5rcyB0byBIZW5yaWsgQnJpeCBBbmRlcnNlbiA8YnJpeEBnZW50b28ub3JnPgogICoJCQlmaXggcGFyYW1ldGVyIHBhc3Npbmcgb24gbW9kdWxlIGxvYWRpbmcKICAqCQkJICAgIHRoYW5rcyB0byBSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+CiAgKgkJCSAgICB0aGFua3MgdG8gSmltIFJhZGZvcmQgPHJhZGZvcmRAYmxhY2tiZWFuLm9yZz4KICAqICAyMDA0LTExLTA4CTAuOAlmaXggaW5pdCBlcnJvciBjYXNlLCBkb24ndCByZXR1cm4gZnJvbSBhIG1hY3JvCiAgKgkJCSAgICB0aGFua3MgdG8gQ2hyaXMgV3JpZ2h0IDxjaHJpc3dAb3NkbC5vcmc+Ci0gKiAgMjAwNC0xMC0yMwkwLjcJZml4IG1vZHVsZSBsb2FkaW5nIG9uIEEyMWUsIEEyMnAsIFQyMCwgVDIxLCBYMjAKLSAqCQkJZml4IGxlZCBjb250cm9sIG9uIEEyMWUKLSAqICAyMDA0LTEwLTE5CTAuNgl1c2UgYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCkgdG8gY2xhaW0gSEtFWSBkZXZpY2UKLSAqICAyMDA0LTEwLTE4CTAuNQl0aGlua2xpZ2h0IHN1cHBvcnQgb24gQTIxZSwgRzQwLCBSMzIsIFQyMCwgVDIxLCBYMjAKLSAqCQkJcHJvYyBmaWxlIGZvcm1hdCBjaGFuZ2VkCi0gKgkJCXZpZGVvX3N3aXRjaCBjb21tYW5kCi0gKgkJCWV4cGVyaW1lbnRhbCBjbW9zIGNvbnRyb2wKLSAqCQkJZXhwZXJpbWVudGFsIGxlZCBjb250cm9sCi0gKgkJCWV4cGVyaW1lbnRhbCBhY3BpIHNvdW5kcwotICogIDIwMDQtMDktMTYJMC40CXN1cHBvcnQgZm9yIG1vZHVsZSBwYXJhbWV0ZXJzCi0gKgkJCWhvdGtleSBtYXNrIGNhbiBiZSBwcmVmaXhlZCBieSAweAotICoJCQl2aWRlbyBvdXRwdXQgc3dpdGNoaW5nCi0gKgkJCXZpZGVvIGV4cGFuc2lvbiBjb250cm9sCi0gKgkJCXVsdHJhYmF5IGVqZWN0IHN1cHBvcnQKLSAqCQkJcmVtb3ZlZCBsY2QgYnJpZ2h0bmVzcy9vbi9vZmYgY29udHJvbCwgZGlkbid0IHdvcmsKLSAqICAyMDA0LTA4LTE3CTAuMwlzdXBwb3J0IGZvciBSNDAKLSAqCQkJbGNkIG9mZiwgYnJpZ2h0bmVzcyBjb250cm9sCi0gKgkJCXRoaW5rbGlnaHQgb24vb2ZmCi0gKiAgMjAwNC0wOC0xNAkwLjIJc3VwcG9ydCBmb3IgVCBzZXJpZXMsIFgyMAotICoJCQlibHVldG9vdGggZW5hYmxlL2Rpc2FibGUKLSAqCQkJaG90a2V5IGV2ZW50cyBkaXNhYmxlZCBieSBkZWZhdWx0Ci0gKgkJCXJlbW92ZWQgZmFuIGNvbnRyb2wsIGN1cnJlbnRseSB1c2VsZXNzCi0gKiAgMjAwNC0wOC0wOQkwLjEJaW5pdGlhbCByZWxlYXNlLCBzdXBwb3J0IGZvciBYIHNlcmllcwogICovCiAKLSNpbmNsdWRlICJ0aGlua3BhZF9hY3BpLmgiCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCi1NT0RVTEVfQVVUSE9SKCJCb3Jpc2xhdiBEZWlhbm92LCBIZW5yaXF1ZSBkZSBNb3JhZXMgSG9sc2NodWgiKTsKLU1PRFVMRV9ERVNDUklQVElPTihJQk1fREVTQyk7Ci1NT0RVTEVfVkVSU0lPTihJQk1fVkVSU0lPTik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CisjaW5jbHVkZSA8bGludXgvbnZyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLS8qIFBsZWFzZSByZW1vdmUgdGhpcyBpbiB5ZWFyIDIwMDkgKi8KLU1PRFVMRV9BTElBUygiaWJtX2FjcGkiKTsKKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKLS8qCi0gKiBETUkgbWF0Y2hpbmcgZm9yIG1vZHVsZSBhdXRvbG9hZGluZwotICoKLSAqIFNlZSBodHRwOi8vdGhpbmt3aWtpLm9yZy93aWtpL0xpc3Rfb2ZfRE1JX0lEcwotICogU2VlIGh0dHA6Ly90aGlua3dpa2kub3JnL3dpa2kvQklPU19VcGdyYWRlX0Rvd25sb2FkcwotICoKLSAqIE9ubHkgbW9kZWxzIGxpc3RlZCBpbiB0aGlua3dpa2kgd2lsbCBiZSBzdXBwb3J0ZWQsIHNvIGFkZCB5b3VycwotICogaWYgaXQgaXMgbm90IHRoZXJlIHlldC4KKyNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgorI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KKworCisvKiBUaGlua1BhZCBDTU9TIGNvbW1hbmRzICovCisjZGVmaW5lIFRQX0NNT1NfVk9MVU1FX0RPV04JMAorI2RlZmluZSBUUF9DTU9TX1ZPTFVNRV9VUAkxCisjZGVmaW5lIFRQX0NNT1NfVk9MVU1FX01VVEUJMgorI2RlZmluZSBUUF9DTU9TX0JSSUdIVE5FU1NfVVAJNAorI2RlZmluZSBUUF9DTU9TX0JSSUdIVE5FU1NfRE9XTgk1CisKKy8qIE5WUkFNIEFkZHJlc3NlcyAqLworZW51bSB0cF9udnJhbV9hZGRyIHsKKwlUUF9OVlJBTV9BRERSX0hLMgkJPSAweDU3LAorCVRQX05WUkFNX0FERFJfVEhJTktMSUdIVAk9IDB4NTgsCisJVFBfTlZSQU1fQUREUl9WSURFTwkJPSAweDU5LAorCVRQX05WUkFNX0FERFJfQlJJR0hUTkVTUwk9IDB4NWUsCisJVFBfTlZSQU1fQUREUl9NSVhFUgkJPSAweDYwLAorfTsKKworLyogTlZSQU0gYml0IG1hc2tzICovCitlbnVtIHsKKwlUUF9OVlJBTV9NQVNLX0hLVF9USElOS1BBRAk9IDB4MDgsCisJVFBfTlZSQU1fTUFTS19IS1RfWk9PTQkJPSAweDIwLAorCVRQX05WUkFNX01BU0tfSEtUX0RJU1BMQVkJPSAweDQwLAorCVRQX05WUkFNX01BU0tfSEtUX0hJQkVSTkFURQk9IDB4ODAsCisJVFBfTlZSQU1fTUFTS19USElOS0xJR0hUCT0gMHgxMCwKKwlUUF9OVlJBTV9NQVNLX0hLVF9ESVNQRVhQTkQJPSAweDMwLAorCVRQX05WUkFNX01BU0tfSEtUX0JSSUdIVE5FU1MJPSAweDIwLAorCVRQX05WUkFNX01BU0tfTEVWRUxfQlJJR0hUTkVTUwk9IDB4MGYsCisJVFBfTlZSQU1fUE9TX0xFVkVMX0JSSUdIVE5FU1MJPSAwLAorCVRQX05WUkFNX01BU0tfTVVURQkJPSAweDQwLAorCVRQX05WUkFNX01BU0tfSEtUX1ZPTFVNRQk9IDB4ODAsCisJVFBfTlZSQU1fTUFTS19MRVZFTF9WT0xVTUUJPSAweDBmLAorCVRQX05WUkFNX1BPU19MRVZFTF9WT0xVTUUJPSAwLAorfTsKKworLyogQUNQSSBISURzICovCisjZGVmaW5lIFRQQUNQSV9BQ1BJX0hLRVlfSElECQkiSUJNMDA2OCIKKworLyogSW5wdXQgSURzICovCisjZGVmaW5lIFRQQUNQSV9IS0VZX0lOUFVUX1BST0RVQ1QJMHg1MDU0IC8qICJUUCIgKi8KKyNkZWZpbmUgVFBBQ1BJX0hLRVlfSU5QVVRfVkVSU0lPTgkweDQxMDEKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWFpbiBkcml2ZXIKICAqLwotI2RlZmluZSBJQk1fQklPU19NT0RVTEVfQUxJQVMoX190eXBlKSBcCi0JTU9EVUxFX0FMSUFTKCJkbWk6YnZuSUJNOmJ2ciIgX190eXBlICJFVD8/V1ciKQogCi0vKiBOb24tYW5jaWVudCB0aGlua3BhZHMgKi8KLU1PRFVMRV9BTElBUygiZG1pOmJ2bklCTToqOnN2bklCTToqOnB2clRoaW5rUGFkKjpydm5JQk06KiIpOwotTU9EVUxFX0FMSUFTKCJkbWk6YnZuTEVOT1ZPOio6c3ZuTEVOT1ZPOio6cHZyVGhpbmtQYWQqOnJ2bkxFTk9WTzoqIik7CisjZGVmaW5lIFRQQUNQSV9OQU1FICJ0aGlua3BhZCIKKyNkZWZpbmUgVFBBQ1BJX0RFU0MgIlRoaW5rUGFkIEFDUEkgRXh0cmFzIgorI2RlZmluZSBUUEFDUElfRklMRSBUUEFDUElfTkFNRSAiX2FjcGkiCisjZGVmaW5lIFRQQUNQSV9VUkwgImh0dHA6Ly9pYm0tYWNwaS5zZi5uZXQvIgorI2RlZmluZSBUUEFDUElfTUFJTCAiaWJtLWFjcGktZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0IgogCi0vKiBBbmNpZW50IHRoaW5rcGFkIEJJT1NlcyBoYXZlIHRvIGJlIGlkZW50aWZpZWQgYnkKLSAqIEJJT1MgdHlwZSBvciBtb2RlbCBudW1iZXIsIGFuZCB0aGVyZSBhcmUgZmFyIGxlc3MKLSAqIEJJT1MgdHlwZXMgdGhhbiBtb2RlbCBudW1iZXJzLi4uICovCi1JQk1fQklPU19NT0RVTEVfQUxJQVMoIklbQixELEgsSSxNLE4sTyxULFcsVixZLFpdIik7Ci1JQk1fQklPU19NT0RVTEVfQUxJQVMoIjFbMCwzLDYsOCxBLUcsSSxLLE0tUCxTLFRdIik7Ci1JQk1fQklPU19NT0RVTEVfQUxJQVMoIktbVSxYLVpdIik7CisjZGVmaW5lIFRQQUNQSV9QUk9DX0RJUiAiaWJtIgorI2RlZmluZSBUUEFDUElfQUNQSV9FVkVOVF9QUkVGSVggImlibSIKKyNkZWZpbmUgVFBBQ1BJX0RSVlJfTkFNRSBUUEFDUElfRklMRQorI2RlZmluZSBUUEFDUElfSFdNT05fRFJWUl9OQU1FIFRQQUNQSV9OQU1FICJfaHdtb24iCiAKLSNkZWZpbmUgX191bnVzZWQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpCisjZGVmaW5lIFRQQUNQSV9NQVhfQUNQSV9BUkdTIDMKKworLyogRGVidWdnaW5nICovCisjZGVmaW5lIFRQQUNQSV9MT0cgVFBBQ1BJX0ZJTEUgIjogIgorI2RlZmluZSBUUEFDUElfRVJSCSAgIEtFUk5fRVJSICAgIFRQQUNQSV9MT0cKKyNkZWZpbmUgVFBBQ1BJX05PVElDRSBLRVJOX05PVElDRSBUUEFDUElfTE9HCisjZGVmaW5lIFRQQUNQSV9JTkZPICAgS0VSTl9JTkZPICAgVFBBQ1BJX0xPRworI2RlZmluZSBUUEFDUElfREVCVUcgIEtFUk5fREVCVUcgIFRQQUNQSV9MT0cKKworI2RlZmluZSBUUEFDUElfREJHX0FMTAkJMHhmZmZmCisjZGVmaW5lIFRQQUNQSV9EQkdfQUxMCQkweGZmZmYKKyNkZWZpbmUgVFBBQ1BJX0RCR19JTklUCQkweDAwMDEKKyNkZWZpbmUgVFBBQ1BJX0RCR19FWElUCQkweDAwMDIKKyNkZWZpbmUgZGJnX3ByaW50ayhhX2RiZ19sZXZlbCwgZm9ybWF0LCBhcmcuLi4pIFwKKwlkbyB7IGlmIChkYmdfbGV2ZWwgJiBhX2RiZ19sZXZlbCkgXAorCQlwcmludGsoVFBBQ1BJX0RFQlVHICIlczogIiBmb3JtYXQsIF9fZnVuY19fICwgIyMgYXJnKTsgXAorCX0gd2hpbGUgKDApCisjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfREVCVUcKKyNkZWZpbmUgdmRiZ19wcmludGsoYV9kYmdfbGV2ZWwsIGZvcm1hdCwgYXJnLi4uKSBcCisJZGJnX3ByaW50ayhhX2RiZ19sZXZlbCwgZm9ybWF0LCAjIyBhcmcpCitzdGF0aWMgY29uc3QgY2hhciAqc3RyX3N1cHBvcnRlZChpbnQgaXNfc3VwcG9ydGVkKTsKKyNlbHNlCisjZGVmaW5lIHZkYmdfcHJpbnRrKGFfZGJnX2xldmVsLCBmb3JtYXQsIGFyZy4uLikKKyNlbmRpZgorCisjZGVmaW5lIG9ub2ZmKHN0YXR1cywgYml0KSAoKHN0YXR1cykgJiAoMSA8PCAoYml0KSkgPyAib24iIDogIm9mZiIpCisjZGVmaW5lIGVuYWJsZWQoc3RhdHVzLCBiaXQpICgoc3RhdHVzKSAmICgxIDw8IChiaXQpKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpCisjZGVmaW5lIHN0cmxlbmNtcChhLCBiKSAoc3RybmNtcCgoYSksIChiKSwgc3RybGVuKGIpKSkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRHJpdmVyLXdpZGUgc3RydWN0cyBhbmQgbWlzYy4gdmFyaWFibGVzCisgKi8KKworc3RydWN0IGlibV9zdHJ1Y3Q7CisKK3N0cnVjdCB0cF9hY3BpX2Rydl9zdHJ1Y3QgeworCWNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCAqaGlkOworCXN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyOworCisJdm9pZCAoKm5vdGlmeSkgKHN0cnVjdCBpYm1fc3RydWN0ICosIHUzMik7CisJYWNwaV9oYW5kbGUgKmhhbmRsZTsKKwl1MzIgdHlwZTsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZTsKK307CisKK3N0cnVjdCBpYm1fc3RydWN0IHsKKwljaGFyICpuYW1lOworCisJaW50ICgqcmVhZCkgKGNoYXIgKik7CisJaW50ICgqd3JpdGUpIChjaGFyICopOworCXZvaWQgKCpleGl0KSAodm9pZCk7CisJdm9pZCAoKnJlc3VtZSkgKHZvaWQpOworCXZvaWQgKCpzdXNwZW5kKSAocG1fbWVzc2FnZV90IHN0YXRlKTsKKworCXN0cnVjdCBsaXN0X2hlYWQgYWxsX2RyaXZlcnM7CisKKwlzdHJ1Y3QgdHBfYWNwaV9kcnZfc3RydWN0ICphY3BpOworCisJc3RydWN0IHsKKwkJdTggYWNwaV9kcml2ZXJfcmVnaXN0ZXJlZDoxOworCQl1OCBhY3BpX25vdGlmeV9pbnN0YWxsZWQ6MTsKKwkJdTggcHJvY19jcmVhdGVkOjE7CisJCXU4IGluaXRfY2FsbGVkOjE7CisJCXU4IGV4cGVyaW1lbnRhbDoxOworCX0gZmxhZ3M7Cit9OworCitzdHJ1Y3QgaWJtX2luaXRfc3RydWN0IHsKKwljaGFyIHBhcmFtWzMyXTsKKworCWludCAoKmluaXQpIChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICopOworCXN0cnVjdCBpYm1fc3RydWN0ICpkYXRhOworfTsKKworc3RhdGljIHN0cnVjdCB7CisjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfQkFZCisJdTMyIGJheV9zdGF0dXM6MTsKKwl1MzIgYmF5X2VqZWN0OjE7CisJdTMyIGJheV9zdGF0dXMyOjE7CisJdTMyIGJheV9lamVjdDI6MTsKKyNlbmRpZgorCXUzMiBibHVldG9vdGg6MTsKKwl1MzIgaG90a2V5OjE7CisJdTMyIGhvdGtleV9tYXNrOjE7CisJdTMyIGhvdGtleV93bHN3OjE7CisJdTMyIGxpZ2h0OjE7CisJdTMyIGxpZ2h0X3N0YXR1czoxOworCXUzMiBicmlnaHRfMTZsZXZlbHM6MTsKKwl1MzIgd2FuOjE7CisJdTMyIGZhbl9jdHJsX3N0YXR1c191bmRlZjoxOworCXUzMiBpbnB1dF9kZXZpY2VfcmVnaXN0ZXJlZDoxOworCXUzMiBwbGF0Zm9ybV9kcnZfcmVnaXN0ZXJlZDoxOworCXUzMiBwbGF0Zm9ybV9kcnZfYXR0cnNfcmVnaXN0ZXJlZDoxOworCXUzMiBzZW5zb3JzX3BkcnZfcmVnaXN0ZXJlZDoxOworCXUzMiBzZW5zb3JzX3BkcnZfYXR0cnNfcmVnaXN0ZXJlZDoxOworCXUzMiBzZW5zb3JzX3BkZXZfYXR0cnNfcmVnaXN0ZXJlZDoxOworCXUzMiBob3RrZXlfcG9sbF9hY3RpdmU6MTsKK30gdHBfZmVhdHVyZXM7CisKK3N0cnVjdCB0aGlua3BhZF9pZF9kYXRhIHsKKwl1bnNpZ25lZCBpbnQgdmVuZG9yOwkvKiBUaGlua1BhZCB2ZW5kb3I6CisJCQkJICogUENJX1ZFTkRPUl9JRF9JQk0vUENJX1ZFTkRPUl9JRF9MRU5PVk8gKi8KKworCWNoYXIgKmJpb3NfdmVyc2lvbl9zdHI7CS8qIFNvbWV0aGluZyBsaWtlIDFaRVQ1MVdXICgxLjAzeikgKi8KKwljaGFyICplY192ZXJzaW9uX3N0cjsJLyogU29tZXRoaW5nIGxpa2UgMVpIVDUxV1ctMS4wNGEgKi8KKworCXUxNiBiaW9zX21vZGVsOwkJLyogQmlnIEVuZGlhbiwgVFAtMVkgPSAweDU5MzEsIDAgPSB1bmtub3duICovCisJdTE2IGVjX21vZGVsOworCisJY2hhciAqbW9kZWxfc3RyOworfTsKK3N0YXRpYyBzdHJ1Y3QgdGhpbmtwYWRfaWRfZGF0YSB0aGlua3BhZF9pZDsKIAogc3RhdGljIGVudW0gewogCVRQQUNQSV9MSUZFX0lOSVQgPSAwLApAQCAtMTIzLDYgKzI1NSw5IEBACiAJVFBBQ1BJX0xJRkVfRVhJVElORywKIH0gdHBhY3BpX2xpZmVjeWNsZTsKIAorc3RhdGljIGludCBleHBlcmltZW50YWw7CitzdGF0aWMgdTMyIGRiZ19sZXZlbDsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTM3LDEzICsyNzIsMTMgQEAKIAogc3RhdGljIGFjcGlfaGFuZGxlIHJvb3RfaGFuZGxlOwogCi0jZGVmaW5lIElCTV9IQU5ETEUob2JqZWN0LCBwYXJlbnQsIHBhdGhzLi4uKQkJCVwKKyNkZWZpbmUgVFBBQ1BJX0hBTkRMRShvYmplY3QsIHBhcmVudCwgcGF0aHMuLi4pCQkJXAogCXN0YXRpYyBhY3BpX2hhbmRsZSAgb2JqZWN0IyNfaGFuZGxlOwkJCVwKIAlzdGF0aWMgYWNwaV9oYW5kbGUgKm9iamVjdCMjX3BhcmVudCA9ICZwYXJlbnQjI19oYW5kbGU7CVwKIAlzdGF0aWMgY2hhciAgICAgICAgKm9iamVjdCMjX3BhdGg7CQkJXAogCXN0YXRpYyBjaGFyICAgICAgICAqb2JqZWN0IyNfcGF0aHNbXSA9IHsgcGF0aHMgfQogCi1JQk1fSEFORExFKGVjLCByb290LCAiXFxfU0IuUENJMC5JU0EuRUMwIiwJLyogMjQwLCAyNDB4ICovCitUUEFDUElfSEFORExFKGVjLCByb290LCAiXFxfU0IuUENJMC5JU0EuRUMwIiwJLyogMjQwLCAyNDB4ICovCiAJICAgIlxcX1NCLlBDSS5JU0EuRUMiLAkvKiA1NzAgKi8KIAkgICAiXFxfU0IuUENJMC5JU0EwLkVDMCIsCS8qIDYwMGUveCwgNzcwZSwgNzcweCAqLwogCSAgICJcXF9TQi5QQ0kwLklTQS5FQyIsCS8qIEEyMWUsIEEyeG0vcCwgVDIwLTIyLCBYMjAtMjEgKi8KQEAgLTE1MiwyMCArMjg3LDE2IEBACiAJICAgIlxcX1NCLlBDSTAuTFBDLkVDIiwJLyogYWxsIG90aGVycyAqLwogCSAgICk7CiAKLUlCTV9IQU5ETEUoZWNyZCwgZWMsICJFQ1JEIik7CS8qIDU3MCAqLwotSUJNX0hBTkRMRShlY3dyLCBlYywgIkVDV1IiKTsJLyogNTcwICovCitUUEFDUElfSEFORExFKGVjcmQsIGVjLCAiRUNSRCIpOwkvKiA1NzAgKi8KK1RQQUNQSV9IQU5ETEUoZWN3ciwgZWMsICJFQ1dSIik7CS8qIDU3MCAqLwogCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNaXNjIEFDUEkgaGFuZGxlcwotICovCi0KLUlCTV9IQU5ETEUoY21vcywgcm9vdCwgIlxcVUNNUyIsCS8qIFI1MCwgUjUwZSwgUjUwcCwgUjUxLCBUNHgsIFgzMSwgWDQwICovCitUUEFDUElfSEFORExFKGNtb3MsIHJvb3QsICJcXFVDTVMiLAkvKiBSNTAsIFI1MGUsIFI1MHAsIFI1MSwgKi8KKwkJCQkJLyogVDR4LCBYMzEsIFg0MCAqLwogCSAgICJcXENNT1MiLAkJLyogQTN4LCBHNHgsIFIzMiwgVDIzLCBUMzAsIFgyMi0yNCwgWDMwICovCiAJICAgIlxcQ01TIiwJCS8qIFI0MCwgUjQwZSAqLwogCSAgICk7CQkJLyogYWxsIG90aGVycyAqLwogCi1JQk1fSEFORExFKGhrZXksIGVjLCAiXFxfU0IuSEtFWSIsCS8qIDYwMGUveCwgNzcwZSwgNzcweCAqLworVFBBQ1BJX0hBTkRMRShoa2V5LCBlYywgIlxcX1NCLkhLRVkiLAkvKiA2MDBlL3gsIDc3MGUsIDc3MHggKi8KIAkgICAiXkhLRVkiLAkJLyogUjMwLCBSMzEgKi8KIAkgICAiSEtFWSIsCQkvKiBhbGwgb3RoZXJzICovCiAJICAgKTsJCQkvKiA1NzAgKi8KQEAgLTE4MCw3ICszMTEsNyBAQAogewogCWNoYXIgKmZtdDAgPSBmbXQ7CiAJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgcGFyYW1zOwotCXVuaW9uIGFjcGlfb2JqZWN0IGluX29ianNbSUJNX01BWF9BQ1BJX0FSR1NdOworCXVuaW9uIGFjcGlfb2JqZWN0IGluX29ianNbVFBBQ1BJX01BWF9BQ1BJX0FSR1NdOwogCXN0cnVjdCBhY3BpX2J1ZmZlciByZXN1bHQsICpyZXN1bHRwOwogCXVuaW9uIGFjcGlfb2JqZWN0IG91dF9vYmo7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwpAQCAtMTkwLDcgKzMyMSw3IEBACiAJaW50IHF1aWV0OwogCiAJaWYgKCEqZm10KSB7Ci0JCXByaW50ayhJQk1fRVJSICJhY3BpX2V2YWxmKCkgY2FsbGVkIHdpdGggZW1wdHkgZm9ybWF0XG4iKTsKKwkJcHJpbnRrKFRQQUNQSV9FUlIgImFjcGlfZXZhbGYoKSBjYWxsZWQgd2l0aCBlbXB0eSBmb3JtYXRcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTIxNSw3ICszNDYsNyBAQAogCQkJYnJlYWs7CiAJCQkvKiBhZGQgbW9yZSB0eXBlcyBhcyBuZWVkZWQgKi8KIAkJZGVmYXVsdDoKLQkJCXByaW50ayhJQk1fRVJSICJhY3BpX2V2YWxmKCkgY2FsbGVkICIKKwkJCXByaW50ayhUUEFDUElfRVJSICJhY3BpX2V2YWxmKCkgY2FsbGVkICIKIAkJCSAgICAgICAid2l0aCBpbnZhbGlkIGZvcm1hdCBjaGFyYWN0ZXIgJyVjJ1xuIiwgYyk7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMjQyLDI5ICszNzMsMTkgQEAKIAkJYnJlYWs7CiAJCS8qIGFkZCBtb3JlIHR5cGVzIGFzIG5lZWRlZCAqLwogCWRlZmF1bHQ6Ci0JCXByaW50ayhJQk1fRVJSICJhY3BpX2V2YWxmKCkgY2FsbGVkICIKKwkJcHJpbnRrKFRQQUNQSV9FUlIgImFjcGlfZXZhbGYoKSBjYWxsZWQgIgogCQkgICAgICAgIndpdGggaW52YWxpZCBmb3JtYXQgY2hhcmFjdGVyICclYydcbiIsIHJlc190eXBlKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKCFzdWNjZXNzICYmICFxdWlldCkKLQkJcHJpbnRrKElCTV9FUlIgImFjcGlfZXZhbGYoJXMsICVzLCAuLi4pIGZhaWxlZDogJWRcbiIsCisJCXByaW50ayhUUEFDUElfRVJSICJhY3BpX2V2YWxmKCVzLCAlcywgLi4uKSBmYWlsZWQ6ICVkXG4iLAogCQkgICAgICAgbWV0aG9kLCBmbXQwLCBzdGF0dXMpOwogCiAJcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKLXN0YXRpYyB2b2lkIF9fdW51c2VkIGFjcGlfcHJpbnRfaW50KGFjcGlfaGFuZGxlIGhhbmRsZSwgY2hhciAqbWV0aG9kKQotewotCWludCBpOwotCi0JaWYgKGFjcGlfZXZhbGYoaGFuZGxlLCAmaSwgbWV0aG9kLCAiZCIpKQotCQlwcmludGsoSUJNX0lORk8gIiVzID0gMHgleFxuIiwgbWV0aG9kLCBpKTsKLQllbHNlCi0JCXByaW50ayhJQk1fRVJSICJlcnJvciBjYWxsaW5nICVzXG4iLCBtZXRob2QpOwotfQotCi1zdGF0aWMgaW50IGFjcGlfZWNfcmVhZChpbnQgaSwgdTggKiBwKQorc3RhdGljIGludCBhY3BpX2VjX3JlYWQoaW50IGksIHU4ICpwKQogewogCWludCB2OwogCkBAIC0yOTMsNiArNDE0LDcgQEAKIAlyZXR1cm4gMTsKIH0KIAorI2lmIGRlZmluZWQoQ09ORklHX1RISU5LUEFEX0FDUElfRE9DSykgfHwgZGVmaW5lZChDT05GSUdfVEhJTktQQURfQUNQSV9CQVkpCiBzdGF0aWMgaW50IF9zdGEoYWNwaV9oYW5kbGUgaGFuZGxlKQogewogCWludCBzdGF0dXM7CkBAIC0zMDIsNiArNDI0LDcgQEAKIAogCXJldHVybiBzdGF0dXM7CiB9CisjZW5kaWYKIAogc3RhdGljIGludCBpc3N1ZV90aGlua3BhZF9jbW9zX2NvbW1hbmQoaW50IGNtb3NfY21kKQogewpAQCAtMzE4LDYgKzQ0MSwxMCBAQAogICogQUNQSSBkZXZpY2UgbW9kZWwKICAqLwogCisjZGVmaW5lIFRQQUNQSV9BQ1BJSEFORExFX0lOSVQob2JqZWN0KSBcCisJZHJ2X2FjcGlfaGFuZGxlX2luaXQoI29iamVjdCwgJm9iamVjdCMjX2hhbmRsZSwgKm9iamVjdCMjX3BhcmVudCwgXAorCQlvYmplY3QjI19wYXRocywgQVJSQVlfU0laRShvYmplY3QjI19wYXRocyksICZvYmplY3QjI19wYXRoKQorCiBzdGF0aWMgdm9pZCBkcnZfYWNwaV9oYW5kbGVfaW5pdChjaGFyICpuYW1lLAogCQkJICAgYWNwaV9oYW5kbGUgKmhhbmRsZSwgYWNwaV9oYW5kbGUgcGFyZW50LAogCQkJICAgY2hhciAqKnBhdGhzLCBpbnQgbnVtX3BhdGhzLCBjaGFyICoqcGF0aCkKQEAgLTM3MiwyNSArNDk5LDI3IEBACiAKIAlyYyA9IGFjcGlfYnVzX2dldF9kZXZpY2UoKmlibS0+YWNwaS0+aGFuZGxlLCAmaWJtLT5hY3BpLT5kZXZpY2UpOwogCWlmIChyYyA8IDApIHsKLQkJcHJpbnRrKElCTV9FUlIgImFjcGlfYnVzX2dldF9kZXZpY2UoJXMpIGZhaWxlZDogJWRcbiIsCisJCXByaW50ayhUUEFDUElfRVJSICJhY3BpX2J1c19nZXRfZGV2aWNlKCVzKSBmYWlsZWQ6ICVkXG4iLAogCQkJaWJtLT5uYW1lLCByYyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWFjcGlfZHJpdmVyX2RhdGEoaWJtLT5hY3BpLT5kZXZpY2UpID0gaWJtOwogCXNwcmludGYoYWNwaV9kZXZpY2VfY2xhc3MoaWJtLT5hY3BpLT5kZXZpY2UpLCAiJXMvJXMiLAotCQlJQk1fQUNQSV9FVkVOVF9QUkVGSVgsCisJCVRQQUNQSV9BQ1BJX0VWRU5UX1BSRUZJWCwKIAkJaWJtLT5uYW1lKTsKIAogCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcigqaWJtLT5hY3BpLT5oYW5kbGUsCiAJCQlpYm0tPmFjcGktPnR5cGUsIGRpc3BhdGNoX2FjcGlfbm90aWZ5LCBpYm0pOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlpZiAoc3RhdHVzID09IEFFX0FMUkVBRFlfRVhJU1RTKSB7Ci0JCQlwcmludGsoSUJNX05PVElDRSAiYW5vdGhlciBkZXZpY2UgZHJpdmVyIGlzIGFscmVhZHkgaGFuZGxpbmcgJXMgZXZlbnRzXG4iLAotCQkJCWlibS0+bmFtZSk7CisJCQlwcmludGsoVFBBQ1BJX05PVElDRQorCQkJICAgICAgICJhbm90aGVyIGRldmljZSBkcml2ZXIgaXMgYWxyZWFkeSAiCisJCQkgICAgICAgImhhbmRsaW5nICVzIGV2ZW50c1xuIiwgaWJtLT5uYW1lKTsKIAkJfSBlbHNlIHsKLQkJCXByaW50ayhJQk1fRVJSICJhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoJXMpIGZhaWxlZDogJWRcbiIsCi0JCQkJaWJtLT5uYW1lLCBzdGF0dXMpOworCQkJcHJpbnRrKFRQQUNQSV9FUlIKKwkJCSAgICAgICAiYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKCVzKSBmYWlsZWQ6ICVkXG4iLAorCQkJICAgICAgIGlibS0+bmFtZSwgc3RhdHVzKTsKIAkJfQogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC00MTQsMTggKzU0MywxOCBAQAogCiAJaWJtLT5hY3BpLT5kcml2ZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWNwaV9kcml2ZXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWlibS0+YWNwaS0+ZHJpdmVyKSB7Ci0JCXByaW50ayhJQk1fRVJSICJremFsbG9jKGlibS0+ZHJpdmVyKSBmYWlsZWRcbiIpOworCQlwcmludGsoVFBBQ1BJX0VSUiAia3phbGxvYyhpYm0tPmRyaXZlcikgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0Jc3ByaW50ZihpYm0tPmFjcGktPmRyaXZlci0+bmFtZSwgIiVzXyVzIiwgSUJNX05BTUUsIGlibS0+bmFtZSk7CisJc3ByaW50ZihpYm0tPmFjcGktPmRyaXZlci0+bmFtZSwgIiVzXyVzIiwgVFBBQ1BJX05BTUUsIGlibS0+bmFtZSk7CiAJaWJtLT5hY3BpLT5kcml2ZXItPmlkcyA9IGlibS0+YWNwaS0+aGlkOwogCiAJaWJtLT5hY3BpLT5kcml2ZXItPm9wcy5hZGQgPSAmdHBhY3BpX2RldmljZV9hZGQ7CiAKIAlyYyA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcihpYm0tPmFjcGktPmRyaXZlcik7CiAJaWYgKHJjIDwgMCkgewotCQlwcmludGsoSUJNX0VSUiAiYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCVzKSBmYWlsZWQ6ICVkXG4iLAorCQlwcmludGsoVFBBQ1BJX0VSUiAiYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCVzKSBmYWlsZWQ6ICVkXG4iLAogCQkgICAgICAgaWJtLT5uYW1lLCByYyk7CiAJCWtmcmVlKGlibS0+YWNwaS0+ZHJpdmVyKTsKIAkJaWJtLT5hY3BpLT5kcml2ZXIgPSBOVUxMOwpAQCAtNDcwLDcgKzU5OSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZGlzcGF0Y2hfcHJvY2ZzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJY29uc3QgY2hhciBfX3VzZXIgKiB1c2VyYnVmLAorCQkJY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsCiAJCQl1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBpYm1fc3RydWN0ICppYm0gPSBkYXRhOwpAQCAtNTMwLDcgKzY1OSwyMiBAQAogc3RhdGljIHN0cnVjdCBkZXZpY2UgKnRwYWNwaV9od21vbjsKIHN0YXRpYyBzdHJ1Y3QgaW5wdXRfZGV2ICp0cGFjcGlfaW5wdXRkZXY7CiBzdGF0aWMgc3RydWN0IG11dGV4IHRwYWNwaV9pbnB1dGRldl9zZW5kX211dGV4Oworc3RhdGljIExJU1RfSEVBRCh0cGFjcGlfYWxsX2RyaXZlcnMpOwogCitzdGF0aWMgaW50IHRwYWNwaV9zdXNwZW5kX2hhbmRsZXIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCAqaXRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpYm0sIGl0bXAsCisJCQkJICZ0cGFjcGlfYWxsX2RyaXZlcnMsCisJCQkJIGFsbF9kcml2ZXJzKSB7CisJCWlmIChpYm0tPnN1c3BlbmQpCisJCQkoaWJtLT5zdXNwZW5kKShzdGF0ZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyBpbnQgdHBhY3BpX3Jlc3VtZV9oYW5kbGVyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CkBAIC01NDgsMjAgKzY5MiwxMTQgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdHBhY3BpX3Bkcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBJQk1fRFJWUl9OQU1FLAorCQkubmFtZSA9IFRQQUNQSV9EUlZSX05BTUUsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAogCX0sCisJLnN1c3BlbmQgPSB0cGFjcGlfc3VzcGVuZF9oYW5kbGVyLAogCS5yZXN1bWUgPSB0cGFjcGlfcmVzdW1lX2hhbmRsZXIsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0cGFjcGlfaHdtb25fcGRyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkubmFtZSA9IElCTV9IV01PTl9EUlZSX05BTUUsCisJCS5uYW1lID0gVFBBQ1BJX0hXTU9OX0RSVlJfTkFNRSwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJfSwKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzeXNmcyBzdXBwb3J0IGhlbHBlcnMKKyAqLworCitzdHJ1Y3QgYXR0cmlidXRlX3NldCB7CisJdW5zaWduZWQgaW50IG1lbWJlcnMsIG1heF9tZW1iZXJzOworCXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgZ3JvdXA7Cit9OworCitzdHJ1Y3QgYXR0cmlidXRlX3NldF9vYmogeworCXN0cnVjdCBhdHRyaWJ1dGVfc2V0IHM7CisJc3RydWN0IGF0dHJpYnV0ZSAqYTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX3NldCAqY3JlYXRlX2F0dHJfc2V0KHVuc2lnbmVkIGludCBtYXhfbWVtYmVycywKKwkJCQkJCWNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGF0dHJpYnV0ZV9zZXRfb2JqICpzb2JqOworCisJaWYgKG1heF9tZW1iZXJzID09IDApCisJCXJldHVybiBOVUxMOworCisJLyogQWxsb2NhdGVzIHNwYWNlIGZvciBpbXBsaWNpdCBOVUxMIGF0IHRoZSBlbmQgdG9vICovCisJc29iaiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdHRyaWJ1dGVfc2V0X29iaikgKworCQkgICAgbWF4X21lbWJlcnMgKiBzaXplb2Yoc3RydWN0IGF0dHJpYnV0ZSAqKSwKKwkJICAgIEdGUF9LRVJORUwpOworCWlmICghc29iaikKKwkJcmV0dXJuIE5VTEw7CisJc29iai0+cy5tYXhfbWVtYmVycyA9IG1heF9tZW1iZXJzOworCXNvYmotPnMuZ3JvdXAuYXR0cnMgPSAmc29iai0+YTsKKwlzb2JqLT5zLmdyb3VwLm5hbWUgPSBuYW1lOworCisJcmV0dXJuICZzb2JqLT5zOworfQorCisjZGVmaW5lIGRlc3Ryb3lfYXR0cl9zZXQoX3NldCkgXAorCWtmcmVlKF9zZXQpOworCisvKiBub3QgbXVsdGktdGhyZWFkZWQgc2FmZSwgdXNlIGl0IGluIGEgc2luZ2xlIHRocmVhZCBwZXIgc2V0ICovCitzdGF0aWMgaW50IGFkZF90b19hdHRyX3NldChzdHJ1Y3QgYXR0cmlidXRlX3NldCAqcywgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cikKK3sKKwlpZiAoIXMgfHwgIWF0dHIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHMtPm1lbWJlcnMgPj0gcy0+bWF4X21lbWJlcnMpCisJCXJldHVybiAtRU5PTUVNOworCisJcy0+Z3JvdXAuYXR0cnNbcy0+bWVtYmVyc10gPSBhdHRyOworCXMtPm1lbWJlcnMrKzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZF9tYW55X3RvX2F0dHJfc2V0KHN0cnVjdCBhdHRyaWJ1dGVfc2V0ICpzLAorCQkJc3RydWN0IGF0dHJpYnV0ZSAqKmF0dHIsCisJCQl1bnNpZ25lZCBpbnQgY291bnQpCit7CisJaW50IGksIHJlczsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXJlcyA9IGFkZF90b19hdHRyX3NldChzLCBhdHRyW2ldKTsKKwkJaWYgKHJlcykKKwkJCXJldHVybiByZXM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlbGV0ZV9hdHRyX3NldChzdHJ1Y3QgYXR0cmlidXRlX3NldCAqcywgc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKGtvYmosICZzLT5ncm91cCk7CisJZGVzdHJveV9hdHRyX3NldChzKTsKK30KKworI2RlZmluZSByZWdpc3Rlcl9hdHRyX3NldF93aXRoX3N5c2ZzKF9hdHRyX3NldCwgX2tvYmopIFwKKwlzeXNmc19jcmVhdGVfZ3JvdXAoX2tvYmosICZfYXR0cl9zZXQtPmdyb3VwKQorCitzdGF0aWMgaW50IHBhcnNlX3N0cnRvdWwoY29uc3QgY2hhciAqYnVmLAorCQl1bnNpZ25lZCBsb25nIG1heCwgdW5zaWduZWQgbG9uZyAqdmFsdWUpCit7CisJY2hhciAqZW5kcDsKKworCXdoaWxlICgqYnVmICYmIGlzc3BhY2UoKmJ1ZikpCisJCWJ1ZisrOworCSp2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmVuZHAsIDApOworCXdoaWxlICgqZW5kcCAmJiBpc3NwYWNlKCplbmRwKSkKKwkJZW5kcCsrOworCWlmICgqZW5kcCB8fCAqdmFsdWUgPiBtYXgpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiB0aGlua3BhZC1hY3BpIGRyaXZlciBhdHRyaWJ1dGVzCiAgKi8KIApAQCAtNjAzLDcgKzg0MSw4IEBACiBzdGF0aWMgc3NpemVfdCB0cGFjcGlfZHJpdmVyX3ZlcnNpb25fc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2LAogCQkJCQkJY2hhciAqYnVmKQogewotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzIHYlc1xuIiwgSUJNX0RFU0MsIElCTV9WRVJTSU9OKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlcyB2JXNcbiIsCisJCQlUUEFDUElfREVTQywgVFBBQ1BJX1ZFUlNJT04pOwogfQogCiBzdGF0aWMgRFJJVkVSX0FUVFIodmVyc2lvbiwgU19JUlVHTywKQEAgLTYxMSw3ICs4NTAsNyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIHN0cnVjdCBkcml2ZXJfYXR0cmlidXRlKiB0cGFjcGlfZHJpdmVyX2F0dHJpYnV0ZXNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZHJpdmVyX2F0dHJpYnV0ZSAqdHBhY3BpX2RyaXZlcl9hdHRyaWJ1dGVzW10gPSB7CiAJJmRyaXZlcl9hdHRyX2RlYnVnX2xldmVsLCAmZHJpdmVyX2F0dHJfdmVyc2lvbiwKIAkmZHJpdmVyX2F0dHJfaW50ZXJmYWNlX3ZlcnNpb24sCiB9OwpAQCAtNjM0LDkyICs4NzMsMTAgQEAKIHsKIAlpbnQgaTsKIAotCWZvcihpID0gMDsgaSA8IEFSUkFZX1NJWkUodHBhY3BpX2RyaXZlcl9hdHRyaWJ1dGVzKTsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRwYWNwaV9kcml2ZXJfYXR0cmlidXRlcyk7IGkrKykKIAkJZHJpdmVyX3JlbW92ZV9maWxlKGRydiwgdHBhY3BpX2RyaXZlcl9hdHRyaWJ1dGVzW2ldKTsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHN5c2ZzIHN1cHBvcnQgaGVscGVycwotICovCi0KLXN0cnVjdCBhdHRyaWJ1dGVfc2V0X29iaiB7Ci0Jc3RydWN0IGF0dHJpYnV0ZV9zZXQgczsKLQlzdHJ1Y3QgYXR0cmlidXRlICphOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfc2V0ICpjcmVhdGVfYXR0cl9zZXQodW5zaWduZWQgaW50IG1heF9tZW1iZXJzLAotCQkJCQkJY29uc3QgY2hhciogbmFtZSkKLXsKLQlzdHJ1Y3QgYXR0cmlidXRlX3NldF9vYmogKnNvYmo7Ci0KLQlpZiAobWF4X21lbWJlcnMgPT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKiBBbGxvY2F0ZXMgc3BhY2UgZm9yIGltcGxpY2l0IE5VTEwgYXQgdGhlIGVuZCB0b28gKi8KLQlzb2JqID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGF0dHJpYnV0ZV9zZXRfb2JqKSArCi0JCSAgICBtYXhfbWVtYmVycyAqIHNpemVvZihzdHJ1Y3QgYXR0cmlidXRlICopLAotCQkgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzb2JqKQotCQlyZXR1cm4gTlVMTDsKLQlzb2JqLT5zLm1heF9tZW1iZXJzID0gbWF4X21lbWJlcnM7Ci0Jc29iai0+cy5ncm91cC5hdHRycyA9ICZzb2JqLT5hOwotCXNvYmotPnMuZ3JvdXAubmFtZSA9IG5hbWU7Ci0KLQlyZXR1cm4gJnNvYmotPnM7Ci19Ci0KLS8qIG5vdCBtdWx0aS10aHJlYWRlZCBzYWZlLCB1c2UgaXQgaW4gYSBzaW5nbGUgdGhyZWFkIHBlciBzZXQgKi8KLXN0YXRpYyBpbnQgYWRkX3RvX2F0dHJfc2V0KHN0cnVjdCBhdHRyaWJ1dGVfc2V0KiBzLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyKQotewotCWlmICghcyB8fCAhYXR0cikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAocy0+bWVtYmVycyA+PSBzLT5tYXhfbWVtYmVycykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzLT5ncm91cC5hdHRyc1tzLT5tZW1iZXJzXSA9IGF0dHI7Ci0Jcy0+bWVtYmVycysrOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWRkX21hbnlfdG9fYXR0cl9zZXQoc3RydWN0IGF0dHJpYnV0ZV9zZXQqIHMsCi0JCQlzdHJ1Y3QgYXR0cmlidXRlICoqYXR0ciwKLQkJCXVuc2lnbmVkIGludCBjb3VudCkKLXsKLQlpbnQgaSwgcmVzOwotCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJcmVzID0gYWRkX3RvX2F0dHJfc2V0KHMsIGF0dHJbaV0pOwotCQlpZiAocmVzKQotCQkJcmV0dXJuIHJlczsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZGVsZXRlX2F0dHJfc2V0KHN0cnVjdCBhdHRyaWJ1dGVfc2V0KiBzLCBzdHJ1Y3Qga29iamVjdCAqa29iaikKLXsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoa29iaiwgJnMtPmdyb3VwKTsKLQlkZXN0cm95X2F0dHJfc2V0KHMpOwotfQotCi1zdGF0aWMgaW50IHBhcnNlX3N0cnRvdWwoY29uc3QgY2hhciAqYnVmLAotCQl1bnNpZ25lZCBsb25nIG1heCwgdW5zaWduZWQgbG9uZyAqdmFsdWUpCi17Ci0JY2hhciAqZW5kcDsKLQotCXdoaWxlICgqYnVmICYmIGlzc3BhY2UoKmJ1ZikpCi0JCWJ1ZisrOwotCSp2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmVuZHAsIDApOwotCXdoaWxlICgqZW5kcCAmJiBpc3NwYWNlKCplbmRwKSkKLQkJZW5kcCsrOwotCWlmICgqZW5kcCB8fCAqdmFsdWUgPiBtYXgpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIDA7Ci19Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTczNCwxNyArODkxLDE3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHRoaW5rcGFkX2FjcGlfZHJpdmVyX2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSkKIHsKLQlwcmludGsoSUJNX0lORk8gIiVzIHYlc1xuIiwgSUJNX0RFU0MsIElCTV9WRVJTSU9OKTsKLQlwcmludGsoSUJNX0lORk8gIiVzXG4iLCBJQk1fVVJMKTsKKwlwcmludGsoVFBBQ1BJX0lORk8gIiVzIHYlc1xuIiwgVFBBQ1BJX0RFU0MsIFRQQUNQSV9WRVJTSU9OKTsKKwlwcmludGsoVFBBQ1BJX0lORk8gIiVzXG4iLCBUUEFDUElfVVJMKTsKIAotCXByaW50ayhJQk1fSU5GTyAiVGhpbmtQYWQgQklPUyAlcywgRUMgJXNcbiIsCisJcHJpbnRrKFRQQUNQSV9JTkZPICJUaGlua1BhZCBCSU9TICVzLCBFQyAlc1xuIiwKIAkJKHRoaW5rcGFkX2lkLmJpb3NfdmVyc2lvbl9zdHIpID8KIAkJCXRoaW5rcGFkX2lkLmJpb3NfdmVyc2lvbl9zdHIgOiAidW5rbm93biIsCiAJCSh0aGlua3BhZF9pZC5lY192ZXJzaW9uX3N0cikgPwogCQkJdGhpbmtwYWRfaWQuZWNfdmVyc2lvbl9zdHIgOiAidW5rbm93biIpOwogCiAJaWYgKHRoaW5rcGFkX2lkLnZlbmRvciAmJiB0aGlua3BhZF9pZC5tb2RlbF9zdHIpCi0JCXByaW50ayhJQk1fSU5GTyAiJXMgJXNcbiIsCisJCXByaW50ayhUUEFDUElfSU5GTyAiJXMgJXNcbiIsCiAJCQkodGhpbmtwYWRfaWQudmVuZG9yID09IFBDSV9WRU5ET1JfSURfSUJNKSA/CiAJCQkJIklCTSIgOiAoKHRoaW5rcGFkX2lkLnZlbmRvciA9PQogCQkJCQkJUENJX1ZFTkRPUl9JRF9MRU5PVk8pID8KQEAgLTc1OCw4ICs5MTUsOCBAQAogewogCWludCBsZW4gPSAwOwogCi0JbGVuICs9IHNwcmludGYocCArIGxlbiwgImRyaXZlcjpcdFx0JXNcbiIsIElCTV9ERVNDKTsKLQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAidmVyc2lvbjpcdCVzXG4iLCBJQk1fVkVSU0lPTik7CisJbGVuICs9IHNwcmludGYocCArIGxlbiwgImRyaXZlcjpcdFx0JXNcbiIsIFRQQUNQSV9ERVNDKTsKKwlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAidmVyc2lvbjpcdCVzXG4iLCBUUEFDUElfVkVSU0lPTik7CiAKIAlyZXR1cm4gbGVuOwogfQpAQCAtNzczLDE1ICs5MzAsMTI5IEBACiAgKiBIb3RrZXkgc3ViZHJpdmVyCiAgKi8KIAorZW51bSB7CS8qIGhvdCBrZXkgc2NhbiBjb2RlcyAoZGVyaXZlZCBmcm9tIEFDUEkgRFNEVCkgKi8KKwlUUF9BQ1BJX0hPVEtFWVNDQU5fRk5GMQkJPSAwLAorCVRQX0FDUElfSE9US0VZU0NBTl9GTkYyLAorCVRQX0FDUElfSE9US0VZU0NBTl9GTkYzLAorCVRQX0FDUElfSE9US0VZU0NBTl9GTkY0LAorCVRQX0FDUElfSE9US0VZU0NBTl9GTkY1LAorCVRQX0FDUElfSE9US0VZU0NBTl9GTkY2LAorCVRQX0FDUElfSE9US0VZU0NBTl9GTkY3LAorCVRQX0FDUElfSE9US0VZU0NBTl9GTkY4LAorCVRQX0FDUElfSE9US0VZU0NBTl9GTkY5LAorCVRQX0FDUElfSE9US0VZU0NBTl9GTkYxMCwKKwlUUF9BQ1BJX0hPVEtFWVNDQU5fRk5GMTEsCisJVFBfQUNQSV9IT1RLRVlTQ0FOX0ZORjEyLAorCVRQX0FDUElfSE9US0VZU0NBTl9GTkJBQ0tTUEFDRSwKKwlUUF9BQ1BJX0hPVEtFWVNDQU5fRk5JTlNFUlQsCisJVFBfQUNQSV9IT1RLRVlTQ0FOX0ZOREVMRVRFLAorCVRQX0FDUElfSE9US0VZU0NBTl9GTkhPTUUsCisJVFBfQUNQSV9IT1RLRVlTQ0FOX0ZORU5ELAorCVRQX0FDUElfSE9US0VZU0NBTl9GTlBBR0VVUCwKKwlUUF9BQ1BJX0hPVEtFWVNDQU5fRk5QQUdFRE9XTiwKKwlUUF9BQ1BJX0hPVEtFWVNDQU5fRk5TUEFDRSwKKwlUUF9BQ1BJX0hPVEtFWVNDQU5fVk9MVU1FVVAsCisJVFBfQUNQSV9IT1RLRVlTQ0FOX1ZPTFVNRURPV04sCisJVFBfQUNQSV9IT1RLRVlTQ0FOX01VVEUsCisJVFBfQUNQSV9IT1RLRVlTQ0FOX1RISU5LUEFELAorfTsKKworZW51bSB7CS8qIEtleXMgYXZhaWxhYmxlIHRocm91Z2ggTlZSQU0gcG9sbGluZyAqLworCVRQQUNQSV9IS0VZX05WUkFNX0tOT1dOX01BU0sgPSAweDAwZmI4OGMwVSwKKwlUUEFDUElfSEtFWV9OVlJBTV9HT09EX01BU0sgID0gMHgwMGZiODAwMFUsCit9OworCitlbnVtIHsJLyogUG9zaXRpb25zIG9mIHNvbWUgb2YgdGhlIGtleXMgaW4gaG90a2V5IG1hc2tzICovCisJVFBfQUNQSV9IS0VZX0RJU1BTV1RDSF9NQVNLCT0gMSA8PCBUUF9BQ1BJX0hPVEtFWVNDQU5fRk5GNywKKwlUUF9BQ1BJX0hLRVlfRElTUFhQQU5EX01BU0sJPSAxIDw8IFRQX0FDUElfSE9US0VZU0NBTl9GTkY4LAorCVRQX0FDUElfSEtFWV9ISUJFUk5BVEVfTUFTSwk9IDEgPDwgVFBfQUNQSV9IT1RLRVlTQ0FOX0ZORjEyLAorCVRQX0FDUElfSEtFWV9CUkdIVFVQX01BU0sJPSAxIDw8IFRQX0FDUElfSE9US0VZU0NBTl9GTkhPTUUsCisJVFBfQUNQSV9IS0VZX0JSR0hURFdOX01BU0sJPSAxIDw8IFRQX0FDUElfSE9US0VZU0NBTl9GTkVORCwKKwlUUF9BQ1BJX0hLRVlfVEhOS0xHSFRfTUFTSwk9IDEgPDwgVFBfQUNQSV9IT1RLRVlTQ0FOX0ZOUEFHRVVQLAorCVRQX0FDUElfSEtFWV9aT09NX01BU0sJCT0gMSA8PCBUUF9BQ1BJX0hPVEtFWVNDQU5fRk5TUEFDRSwKKwlUUF9BQ1BJX0hLRVlfVk9MVVBfTUFTSwkJPSAxIDw8IFRQX0FDUElfSE9US0VZU0NBTl9WT0xVTUVVUCwKKwlUUF9BQ1BJX0hLRVlfVk9MRFdOX01BU0sJPSAxIDw8IFRQX0FDUElfSE9US0VZU0NBTl9WT0xVTUVET1dOLAorCVRQX0FDUElfSEtFWV9NVVRFX01BU0sJCT0gMSA8PCBUUF9BQ1BJX0hPVEtFWVNDQU5fTVVURSwKKwlUUF9BQ1BJX0hLRVlfVEhJTktQQURfTUFTSwk9IDEgPDwgVFBfQUNQSV9IT1RLRVlTQ0FOX1RISU5LUEFELAorfTsKKworZW51bSB7CS8qIE5WUkFNIHRvIEFDUEkgSEtFWSBncm91cCBtYXAgKi8KKwlUUF9OVlJBTV9IS0VZX0dST1VQX0hLMgkJPSBUUF9BQ1BJX0hLRVlfVEhJTktQQURfTUFTSyB8CisJCQkJCSAgVFBfQUNQSV9IS0VZX1pPT01fTUFTSyB8CisJCQkJCSAgVFBfQUNQSV9IS0VZX0RJU1BTV1RDSF9NQVNLIHwKKwkJCQkJICBUUF9BQ1BJX0hLRVlfSElCRVJOQVRFX01BU0ssCisJVFBfTlZSQU1fSEtFWV9HUk9VUF9CUklHSFRORVNTCT0gVFBfQUNQSV9IS0VZX0JSR0hUVVBfTUFTSyB8CisJCQkJCSAgVFBfQUNQSV9IS0VZX0JSR0hURFdOX01BU0ssCisJVFBfTlZSQU1fSEtFWV9HUk9VUF9WT0xVTUUJPSBUUF9BQ1BJX0hLRVlfVk9MVVBfTUFTSyB8CisJCQkJCSAgVFBfQUNQSV9IS0VZX1ZPTERXTl9NQVNLIHwKKwkJCQkJICBUUF9BQ1BJX0hLRVlfTVVURV9NQVNLLAorfTsKKworI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMCitzdHJ1Y3QgdHBfbnZyYW1fc3RhdGUgeworICAgICAgIHUxNiB0aGlua3BhZF90b2dnbGU6MTsKKyAgICAgICB1MTYgem9vbV90b2dnbGU6MTsKKyAgICAgICB1MTYgZGlzcGxheV90b2dnbGU6MTsKKyAgICAgICB1MTYgdGhpbmtsaWdodF90b2dnbGU6MTsKKyAgICAgICB1MTYgaGliZXJuYXRlX3RvZ2dsZToxOworICAgICAgIHUxNiBkaXNwbGF5ZXhwX3RvZ2dsZToxOworICAgICAgIHUxNiBkaXNwbGF5X3N0YXRlOjE7CisgICAgICAgdTE2IGJyaWdodG5lc3NfdG9nZ2xlOjE7CisgICAgICAgdTE2IHZvbHVtZV90b2dnbGU6MTsKKyAgICAgICB1MTYgbXV0ZToxOworCisgICAgICAgdTggYnJpZ2h0bmVzc19sZXZlbDsKKyAgICAgICB1OCB2b2x1bWVfbGV2ZWw7Cit9OworCitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICp0cGFjcGlfaG90a2V5X3Rhc2s7CitzdGF0aWMgdTMyIGhvdGtleV9zb3VyY2VfbWFzazsJCS8qIGJpdCBtYXNrIDA9QUNQSSwxPU5WUkFNICovCitzdGF0aWMgaW50IGhvdGtleV9wb2xsX2ZyZXEgPSAxMDsJLyogSHogKi8KK3N0YXRpYyBzdHJ1Y3QgbXV0ZXggaG90a2V5X3RocmVhZF9tdXRleDsKK3N0YXRpYyBzdHJ1Y3QgbXV0ZXggaG90a2V5X3RocmVhZF9kYXRhX211dGV4Oworc3RhdGljIHVuc2lnbmVkIGludCBob3RrZXlfY29uZmlnX2NoYW5nZTsKKworI2Vsc2UgLyogQ09ORklHX1RISU5LUEFEX0FDUElfSE9US0VZX1BPTEwgKi8KKworI2RlZmluZSBob3RrZXlfc291cmNlX21hc2sgMFUKKworI2VuZGlmIC8qIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMICovCisKK3N0YXRpYyBzdHJ1Y3QgbXV0ZXggaG90a2V5X211dGV4OworCitzdGF0aWMgZW51bSB7CS8qIFJlYXNvbnMgZm9yIHdha2luZyB1cCAqLworCVRQX0FDUElfV0FLRVVQX05PTkUgPSAwLAkvKiBOb25lIG9yIHVua25vd24gKi8KKwlUUF9BQ1BJX1dBS0VVUF9CQVlFSiwJCS8qIEJheSBlamVjdGlvbiByZXF1ZXN0ICovCisJVFBfQUNQSV9XQUtFVVBfVU5ET0NLLAkJLyogVW5kb2NrIHJlcXVlc3QgKi8KK30gaG90a2V5X3dha2V1cF9yZWFzb247CisKK3N0YXRpYyBpbnQgaG90a2V5X2F1dG9zbGVlcF9hY2s7CisKIHN0YXRpYyBpbnQgaG90a2V5X29yaWdfc3RhdHVzOwogc3RhdGljIHUzMiBob3RrZXlfb3JpZ19tYXNrOwogc3RhdGljIHUzMiBob3RrZXlfYWxsX21hc2s7CiBzdGF0aWMgdTMyIGhvdGtleV9yZXNlcnZlZF9tYXNrOworc3RhdGljIHUzMiBob3RrZXlfbWFzazsKKworc3RhdGljIHVuc2lnbmVkIGludCBob3RrZXlfcmVwb3J0X21vZGU7CiAKIHN0YXRpYyB1MTYgKmhvdGtleV9rZXljb2RlX21hcDsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfc2V0ICpob3RrZXlfZGV2X2F0dHJpYnV0ZXM7CiAKKyNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9IT1RLRVlfUE9MTAorI2RlZmluZSBIT1RLRVlfQ09ORklHX0NSSVRJQ0FMX1NUQVJUIFwKKwlkbyB7IFwKKwkJbXV0ZXhfbG9jaygmaG90a2V5X3RocmVhZF9kYXRhX211dGV4KTsgXAorCQlob3RrZXlfY29uZmlnX2NoYW5nZSsrOyBcCisJfSB3aGlsZSAoMCk7CisjZGVmaW5lIEhPVEtFWV9DT05GSUdfQ1JJVElDQUxfRU5EIFwKKwltdXRleF91bmxvY2soJmhvdGtleV90aHJlYWRfZGF0YV9tdXRleCk7CisjZWxzZQorI2RlZmluZSBIT1RLRVlfQ09ORklHX0NSSVRJQ0FMX1NUQVJUCisjZGVmaW5lIEhPVEtFWV9DT05GSUdfQ1JJVElDQUxfRU5ECisjZW5kaWYgLyogQ09ORklHX1RISU5LUEFEX0FDUElfSE9US0VZX1BPTEwgKi8KKwogc3RhdGljIGludCBob3RrZXlfZ2V0X3dsc3coaW50ICpzdGF0dXMpCiB7CiAJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCBzdGF0dXMsICJXTFNXIiwgImQiKSkKQEAgLTc4OSwxNSArMTA2MCw0MDAgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIENhbGwgd2l0aCBob3RrZXlfbXV0ZXggaGVsZAorICovCitzdGF0aWMgaW50IGhvdGtleV9tYXNrX2dldCh2b2lkKQoreworCXUzMiBtID0gMDsKKworCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfbWFzaykgeworCQlpZiAoIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsICZtLCAiREhLTiIsICJkIikpCisJCQlyZXR1cm4gLUVJTzsKKwl9CisJaG90a2V5X21hc2sgPSBtIHwgKGhvdGtleV9zb3VyY2VfbWFzayAmIGhvdGtleV9tYXNrKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQ2FsbCB3aXRoIGhvdGtleV9tdXRleCBoZWxkCisgKi8KK3N0YXRpYyBpbnQgaG90a2V5X21hc2tfc2V0KHUzMiBtYXNrKQoreworCWludCBpOworCWludCByYyA9IDA7CisKKwlpZiAodHBfZmVhdHVyZXMuaG90a2V5X21hc2spIHsKKwkJSE9US0VZX0NPTkZJR19DUklUSUNBTF9TVEFSVAorCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQkJdTMyIG0gPSAxIDw8IGk7CisJCQkvKiBlbmFibGUgaW4gZmlybXdhcmUgbWFzayBvbmx5IGtleXMgbm90IGluIE5WUkFNCisJCQkgKiBtb2RlLCBidXQgZW5hYmxlIHRoZSBrZXkgaW4gdGhlIGNhY2hlZCBob3RrZXlfbWFzaworCQkJICogcmVnYXJkbGVzcyBvZiBtb2RlLCBvciB0aGUga2V5IHdpbGwgZW5kIHVwCisJCQkgKiBkaXNhYmxlZCBieSBob3RrZXlfbWFza19nZXQoKSAqLworCQkJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLAorCQkJCQlOVUxMLCAiTUhLTSIsICJ2ZGQiLCBpICsgMSwKKwkJCQkJISEoKG1hc2sgJiB+aG90a2V5X3NvdXJjZV9tYXNrKSAmIG0pKSkgeworCQkJCXJjID0gLUVJTzsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJaG90a2V5X21hc2sgPSAoaG90a2V5X21hc2sgJiB+bSkgfCAobWFzayAmIG0pOworCQkJfQorCQl9CisJCUhPVEtFWV9DT05GSUdfQ1JJVElDQUxfRU5ECisKKwkJLyogaG90a2V5X21hc2tfZ2V0IG11c3QgYmUgY2FsbGVkIHVuY29uZGl0aW9uYWxseSBiZWxvdyAqLworCQlpZiAoIWhvdGtleV9tYXNrX2dldCgpICYmICFyYyAmJgorCQkgICAgKGhvdGtleV9tYXNrICYgfmhvdGtleV9zb3VyY2VfbWFzaykgIT0KKwkJICAgICAobWFzayAmIH5ob3RrZXlfc291cmNlX21hc2spKSB7CisJCQlwcmludGsoVFBBQ1BJX05PVElDRQorCQkJICAgICAgICJyZXF1ZXN0ZWQgaG90IGtleSBtYXNrIDB4JTA4eCwgYnV0ICIKKwkJCSAgICAgICAiZmlybXdhcmUgZm9yY2VkIGl0IHRvIDB4JTA4eFxuIiwKKwkJCSAgICAgICBtYXNrLCBob3RrZXlfbWFzayk7CisJCX0KKwl9IGVsc2UgeworI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMCisJCUhPVEtFWV9DT05GSUdfQ1JJVElDQUxfU1RBUlQKKwkJaG90a2V5X21hc2sgPSBtYXNrICYgaG90a2V5X3NvdXJjZV9tYXNrOworCQlIT1RLRVlfQ09ORklHX0NSSVRJQ0FMX0VORAorCQlob3RrZXlfbWFza19nZXQoKTsKKwkJaWYgKGhvdGtleV9tYXNrICE9IG1hc2spIHsKKwkJCXByaW50ayhUUEFDUElfTk9USUNFCisJCQkgICAgICAgInJlcXVlc3RlZCBob3Qga2V5IG1hc2sgMHglMDh4LCAiCisJCQkgICAgICAgImZvcmNlZCB0byAweCUwOHggKE5WUkFNIHBvbGwgbWFzayBpcyAiCisJCQkgICAgICAgIjB4JTA4eCk6IG5vIGZpcm13YXJlIG1hc2sgc3VwcG9ydFxuIiwKKwkJCSAgICAgICBtYXNrLCBob3RrZXlfbWFzaywgaG90a2V5X3NvdXJjZV9tYXNrKTsKKwkJfQorI2Vsc2UKKwkJaG90a2V5X21hc2tfZ2V0KCk7CisJCXJjID0gLUVOWElPOworI2VuZGlmIC8qIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMICovCisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGhvdGtleV9zdGF0dXNfZ2V0KGludCAqc3RhdHVzKQoreworCWlmICghYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgc3RhdHVzLCAiREhLQyIsICJkIikpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaG90a2V5X3N0YXR1c19zZXQoaW50IHN0YXR1cykKK3sKKwlpZiAoIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsIE5VTEwsICJNSEtDIiwgInZkIiwgc3RhdHVzKSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdHBhY3BpX2lucHV0X3NlbmRfcmFkaW9zdyh2b2lkKQoreworCWludCB3bHN3OworCisJbXV0ZXhfbG9jaygmdHBhY3BpX2lucHV0ZGV2X3NlbmRfbXV0ZXgpOworCisJaWYgKHRwX2ZlYXR1cmVzLmhvdGtleV93bHN3ICYmICFob3RrZXlfZ2V0X3dsc3coJndsc3cpKSB7CisJCWlucHV0X3JlcG9ydF9zd2l0Y2godHBhY3BpX2lucHV0ZGV2LAorCQkJCSAgICBTV19SQURJTywgISF3bHN3KTsKKwkJaW5wdXRfc3luYyh0cGFjcGlfaW5wdXRkZXYpOworCX0KKworCW11dGV4X3VubG9jaygmdHBhY3BpX2lucHV0ZGV2X3NlbmRfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCB0cGFjcGlfaW5wdXRfc2VuZF9rZXkodW5zaWduZWQgaW50IHNjYW5jb2RlKQoreworCXVuc2lnbmVkIGludCBrZXljb2RlOworCisJa2V5Y29kZSA9IGhvdGtleV9rZXljb2RlX21hcFtzY2FuY29kZV07CisKKwlpZiAoa2V5Y29kZSAhPSBLRVlfUkVTRVJWRUQpIHsKKwkJbXV0ZXhfbG9jaygmdHBhY3BpX2lucHV0ZGV2X3NlbmRfbXV0ZXgpOworCisJCWlucHV0X3JlcG9ydF9rZXkodHBhY3BpX2lucHV0ZGV2LCBrZXljb2RlLCAxKTsKKwkJaWYgKGtleWNvZGUgPT0gS0VZX1VOS05PV04pCisJCQlpbnB1dF9ldmVudCh0cGFjcGlfaW5wdXRkZXYsIEVWX01TQywgTVNDX1NDQU4sCisJCQkJICAgIHNjYW5jb2RlKTsKKwkJaW5wdXRfc3luYyh0cGFjcGlfaW5wdXRkZXYpOworCisJCWlucHV0X3JlcG9ydF9rZXkodHBhY3BpX2lucHV0ZGV2LCBrZXljb2RlLCAwKTsKKwkJaWYgKGtleWNvZGUgPT0gS0VZX1VOS05PV04pCisJCQlpbnB1dF9ldmVudCh0cGFjcGlfaW5wdXRkZXYsIEVWX01TQywgTVNDX1NDQU4sCisJCQkJICAgIHNjYW5jb2RlKTsKKwkJaW5wdXRfc3luYyh0cGFjcGlfaW5wdXRkZXYpOworCisJCW11dGV4X3VubG9jaygmdHBhY3BpX2lucHV0ZGV2X3NlbmRfbXV0ZXgpOworCX0KK30KKworI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMCitzdGF0aWMgc3RydWN0IHRwX2FjcGlfZHJ2X3N0cnVjdCBpYm1faG90a2V5X2FjcGlkcml2ZXI7CisKK3N0YXRpYyB2b2lkIHRwYWNwaV9ob3RrZXlfc2VuZF9rZXkodW5zaWduZWQgaW50IHNjYW5jb2RlKQoreworCXRwYWNwaV9pbnB1dF9zZW5kX2tleShzY2FuY29kZSk7CisJaWYgKGhvdGtleV9yZXBvcnRfbW9kZSA8IDIpIHsKKwkJYWNwaV9idXNfZ2VuZXJhdGVfcHJvY19ldmVudChpYm1faG90a2V5X2FjcGlkcml2ZXIuZGV2aWNlLAorCQkJCQkJMHg4MCwgMHgxMDAxICsgc2NhbmNvZGUpOworCX0KK30KKworc3RhdGljIHZvaWQgaG90a2V5X3JlYWRfbnZyYW0oc3RydWN0IHRwX252cmFtX3N0YXRlICpuLCB1MzIgbSkKK3sKKwl1OCBkOworCisJaWYgKG0gJiBUUF9OVlJBTV9IS0VZX0dST1VQX0hLMikgeworCQlkID0gbnZyYW1fcmVhZF9ieXRlKFRQX05WUkFNX0FERFJfSEsyKTsKKwkJbi0+dGhpbmtwYWRfdG9nZ2xlID0gISEoZCAmIFRQX05WUkFNX01BU0tfSEtUX1RISU5LUEFEKTsKKwkJbi0+em9vbV90b2dnbGUgPSAhIShkICYgVFBfTlZSQU1fTUFTS19IS1RfWk9PTSk7CisJCW4tPmRpc3BsYXlfdG9nZ2xlID0gISEoZCAmIFRQX05WUkFNX01BU0tfSEtUX0RJU1BMQVkpOworCQluLT5oaWJlcm5hdGVfdG9nZ2xlID0gISEoZCAmIFRQX05WUkFNX01BU0tfSEtUX0hJQkVSTkFURSk7CisJfQorCWlmIChtICYgVFBfQUNQSV9IS0VZX1RITktMR0hUX01BU0spIHsKKwkJZCA9IG52cmFtX3JlYWRfYnl0ZShUUF9OVlJBTV9BRERSX1RISU5LTElHSFQpOworCQluLT50aGlua2xpZ2h0X3RvZ2dsZSA9ICEhKGQgJiBUUF9OVlJBTV9NQVNLX1RISU5LTElHSFQpOworCX0KKwlpZiAobSAmIFRQX0FDUElfSEtFWV9ESVNQWFBBTkRfTUFTSykgeworCQlkID0gbnZyYW1fcmVhZF9ieXRlKFRQX05WUkFNX0FERFJfVklERU8pOworCQluLT5kaXNwbGF5ZXhwX3RvZ2dsZSA9CisJCQkJISEoZCAmIFRQX05WUkFNX01BU0tfSEtUX0RJU1BFWFBORCk7CisJfQorCWlmIChtICYgVFBfTlZSQU1fSEtFWV9HUk9VUF9CUklHSFRORVNTKSB7CisJCWQgPSBudnJhbV9yZWFkX2J5dGUoVFBfTlZSQU1fQUREUl9CUklHSFRORVNTKTsKKwkJbi0+YnJpZ2h0bmVzc19sZXZlbCA9IChkICYgVFBfTlZSQU1fTUFTS19MRVZFTF9CUklHSFRORVNTKQorCQkJCT4+IFRQX05WUkFNX1BPU19MRVZFTF9CUklHSFRORVNTOworCQluLT5icmlnaHRuZXNzX3RvZ2dsZSA9CisJCQkJISEoZCAmIFRQX05WUkFNX01BU0tfSEtUX0JSSUdIVE5FU1MpOworCX0KKwlpZiAobSAmIFRQX05WUkFNX0hLRVlfR1JPVVBfVk9MVU1FKSB7CisJCWQgPSBudnJhbV9yZWFkX2J5dGUoVFBfTlZSQU1fQUREUl9NSVhFUik7CisJCW4tPnZvbHVtZV9sZXZlbCA9IChkICYgVFBfTlZSQU1fTUFTS19MRVZFTF9WT0xVTUUpCisJCQkJPj4gVFBfTlZSQU1fUE9TX0xFVkVMX1ZPTFVNRTsKKwkJbi0+bXV0ZSA9ICEhKGQgJiBUUF9OVlJBTV9NQVNLX01VVEUpOworCQluLT52b2x1bWVfdG9nZ2xlID0gISEoZCAmIFRQX05WUkFNX01BU0tfSEtUX1ZPTFVNRSk7CisJfQorfQorCisjZGVmaW5lIFRQQUNQSV9DT01QQVJFX0tFWShfX3NjYW5jb2RlLCBfX21lbWJlcikgXAorCWRvIHsgXAorCQlpZiAoKG1hc2sgJiAoMSA8PCBfX3NjYW5jb2RlKSkgJiYgXAorCQkgICAgb2xkbi0+X19tZW1iZXIgIT0gbmV3bi0+X19tZW1iZXIpIFwKKwkJdHBhY3BpX2hvdGtleV9zZW5kX2tleShfX3NjYW5jb2RlKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgVFBBQ1BJX01BWV9TRU5EX0tFWShfX3NjYW5jb2RlKSBcCisJZG8geyBpZiAobWFzayAmICgxIDw8IF9fc2NhbmNvZGUpKSBcCisJCXRwYWNwaV9ob3RrZXlfc2VuZF9rZXkoX19zY2FuY29kZSk7IH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIGhvdGtleV9jb21wYXJlX2FuZF9pc3N1ZV9ldmVudChzdHJ1Y3QgdHBfbnZyYW1fc3RhdGUgKm9sZG4sCisJCQkJCSAgIHN0cnVjdCB0cF9udnJhbV9zdGF0ZSAqbmV3biwKKwkJCQkJICAgdTMyIG1hc2spCit7CisJVFBBQ1BJX0NPTVBBUkVfS0VZKFRQX0FDUElfSE9US0VZU0NBTl9USElOS1BBRCwgdGhpbmtwYWRfdG9nZ2xlKTsKKwlUUEFDUElfQ09NUEFSRV9LRVkoVFBfQUNQSV9IT1RLRVlTQ0FOX0ZOU1BBQ0UsIHpvb21fdG9nZ2xlKTsKKwlUUEFDUElfQ09NUEFSRV9LRVkoVFBfQUNQSV9IT1RLRVlTQ0FOX0ZORjcsIGRpc3BsYXlfdG9nZ2xlKTsKKwlUUEFDUElfQ09NUEFSRV9LRVkoVFBfQUNQSV9IT1RLRVlTQ0FOX0ZORjEyLCBoaWJlcm5hdGVfdG9nZ2xlKTsKKworCVRQQUNQSV9DT01QQVJFX0tFWShUUF9BQ1BJX0hPVEtFWVNDQU5fRk5QQUdFVVAsIHRoaW5rbGlnaHRfdG9nZ2xlKTsKKworCVRQQUNQSV9DT01QQVJFX0tFWShUUF9BQ1BJX0hPVEtFWVNDQU5fRk5GOCwgZGlzcGxheWV4cF90b2dnbGUpOworCisJLyogaGFuZGxlIHZvbHVtZSAqLworCWlmIChvbGRuLT52b2x1bWVfdG9nZ2xlICE9IG5ld24tPnZvbHVtZV90b2dnbGUpIHsKKwkJaWYgKG9sZG4tPm11dGUgIT0gbmV3bi0+bXV0ZSkgeworCQkJVFBBQ1BJX01BWV9TRU5EX0tFWShUUF9BQ1BJX0hPVEtFWVNDQU5fTVVURSk7CisJCX0KKwkJaWYgKG9sZG4tPnZvbHVtZV9sZXZlbCA+IG5ld24tPnZvbHVtZV9sZXZlbCkgeworCQkJVFBBQ1BJX01BWV9TRU5EX0tFWShUUF9BQ1BJX0hPVEtFWVNDQU5fVk9MVU1FRE9XTik7CisJCX0gZWxzZSBpZiAob2xkbi0+dm9sdW1lX2xldmVsIDwgbmV3bi0+dm9sdW1lX2xldmVsKSB7CisJCQlUUEFDUElfTUFZX1NFTkRfS0VZKFRQX0FDUElfSE9US0VZU0NBTl9WT0xVTUVVUCk7CisJCX0gZWxzZSBpZiAob2xkbi0+bXV0ZSA9PSBuZXduLT5tdXRlKSB7CisJCQkvKiByZXBlYXRlZCBrZXkgcHJlc3NlcyB0aGF0IGRpZG4ndCBjaGFuZ2Ugc3RhdGUgKi8KKwkJCWlmIChuZXduLT5tdXRlKSB7CisJCQkJVFBBQ1BJX01BWV9TRU5EX0tFWShUUF9BQ1BJX0hPVEtFWVNDQU5fTVVURSk7CisJCQl9IGVsc2UgaWYgKG5ld24tPnZvbHVtZV9sZXZlbCAhPSAwKSB7CisJCQkJVFBBQ1BJX01BWV9TRU5EX0tFWShUUF9BQ1BJX0hPVEtFWVNDQU5fVk9MVU1FVVApOworCQkJfSBlbHNlIHsKKwkJCQlUUEFDUElfTUFZX1NFTkRfS0VZKFRQX0FDUElfSE9US0VZU0NBTl9WT0xVTUVET1dOKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIGhhbmRsZSBicmlnaHRuZXNzICovCisJaWYgKG9sZG4tPmJyaWdodG5lc3NfdG9nZ2xlICE9IG5ld24tPmJyaWdodG5lc3NfdG9nZ2xlKSB7CisJCWlmIChvbGRuLT5icmlnaHRuZXNzX2xldmVsIDwgbmV3bi0+YnJpZ2h0bmVzc19sZXZlbCkgeworCQkJVFBBQ1BJX01BWV9TRU5EX0tFWShUUF9BQ1BJX0hPVEtFWVNDQU5fRk5IT01FKTsKKwkJfSBlbHNlIGlmIChvbGRuLT5icmlnaHRuZXNzX2xldmVsID4gbmV3bi0+YnJpZ2h0bmVzc19sZXZlbCkgeworCQkJVFBBQ1BJX01BWV9TRU5EX0tFWShUUF9BQ1BJX0hPVEtFWVNDQU5fRk5FTkQpOworCQl9IGVsc2UgeworCQkJLyogcmVwZWF0ZWQga2V5IHByZXNzZXMgdGhhdCBkaWRuJ3QgY2hhbmdlIHN0YXRlICovCisJCQlpZiAobmV3bi0+YnJpZ2h0bmVzc19sZXZlbCAhPSAwKSB7CisJCQkJVFBBQ1BJX01BWV9TRU5EX0tFWShUUF9BQ1BJX0hPVEtFWVNDQU5fRk5IT01FKTsKKwkJCX0gZWxzZSB7CisJCQkJVFBBQ1BJX01BWV9TRU5EX0tFWShUUF9BQ1BJX0hPVEtFWVNDQU5fRk5FTkQpOworCQkJfQorCQl9CisJfQorfQorCisjdW5kZWYgVFBBQ1BJX0NPTVBBUkVfS0VZCisjdW5kZWYgVFBBQ1BJX01BWV9TRU5EX0tFWQorCitzdGF0aWMgaW50IGhvdGtleV9rdGhyZWFkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHRwX252cmFtX3N0YXRlIHNbMl07CisJdTMyIG1hc2s7CisJdW5zaWduZWQgaW50IHNpLCBzbzsKKwl1bnNpZ25lZCBsb25nIHQ7CisJdW5zaWduZWQgaW50IGNoYW5nZV9kZXRlY3RvciwgbXVzdF9yZXNldDsKKworCW11dGV4X2xvY2soJmhvdGtleV90aHJlYWRfbXV0ZXgpOworCisJaWYgKHRwYWNwaV9saWZlY3ljbGUgPT0gVFBBQ1BJX0xJRkVfRVhJVElORykKKwkJZ290byBleGl0OworCisJc2V0X2ZyZWV6YWJsZSgpOworCisJc28gPSAwOworCXNpID0gMTsKKwl0ID0gMDsKKworCS8qIEluaXRpYWwgc3RhdGUgZm9yIGNvbXBhcmVzICovCisJbXV0ZXhfbG9jaygmaG90a2V5X3RocmVhZF9kYXRhX211dGV4KTsKKwljaGFuZ2VfZGV0ZWN0b3IgPSBob3RrZXlfY29uZmlnX2NoYW5nZTsKKwltYXNrID0gaG90a2V5X3NvdXJjZV9tYXNrICYgaG90a2V5X21hc2s7CisJbXV0ZXhfdW5sb2NrKCZob3RrZXlfdGhyZWFkX2RhdGFfbXV0ZXgpOworCWhvdGtleV9yZWFkX252cmFtKCZzW3NvXSwgbWFzayk7CisKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiBob3RrZXlfcG9sbF9mcmVxKSB7CisJCWlmICh0ID09IDApCisJCQl0ID0gMTAwMC9ob3RrZXlfcG9sbF9mcmVxOworCQl0ID0gbXNsZWVwX2ludGVycnVwdGlibGUodCk7CisJCWlmICh1bmxpa2VseShrdGhyZWFkX3Nob3VsZF9zdG9wKCkpKQorCQkJYnJlYWs7CisJCW11c3RfcmVzZXQgPSB0cnlfdG9fZnJlZXplKCk7CisJCWlmICh0ID4gMCAmJiAhbXVzdF9yZXNldCkKKwkJCWNvbnRpbnVlOworCisJCW11dGV4X2xvY2soJmhvdGtleV90aHJlYWRfZGF0YV9tdXRleCk7CisJCWlmIChtdXN0X3Jlc2V0IHx8IGhvdGtleV9jb25maWdfY2hhbmdlICE9IGNoYW5nZV9kZXRlY3RvcikgeworCQkJLyogZm9yZ2V0IG9sZCBzdGF0ZSBvbiB0aGF3IG9yIGNvbmZpZyBjaGFuZ2UgKi8KKwkJCXNpID0gc287CisJCQl0ID0gMDsKKwkJCWNoYW5nZV9kZXRlY3RvciA9IGhvdGtleV9jb25maWdfY2hhbmdlOworCQl9CisJCW1hc2sgPSBob3RrZXlfc291cmNlX21hc2sgJiBob3RrZXlfbWFzazsKKwkJbXV0ZXhfdW5sb2NrKCZob3RrZXlfdGhyZWFkX2RhdGFfbXV0ZXgpOworCisJCWlmIChsaWtlbHkobWFzaykpIHsKKwkJCWhvdGtleV9yZWFkX252cmFtKCZzW3NpXSwgbWFzayk7CisJCQlpZiAobGlrZWx5KHNpICE9IHNvKSkgeworCQkJCWhvdGtleV9jb21wYXJlX2FuZF9pc3N1ZV9ldmVudCgmc1tzb10sICZzW3NpXSwKKwkJCQkJCQkJbWFzayk7CisJCQl9CisJCX0KKworCQlzbyA9IHNpOworCQlzaSBePSAxOworCX0KKworZXhpdDoKKwltdXRleF91bmxvY2soJmhvdGtleV90aHJlYWRfbXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBob3RrZXlfcG9sbF9zdG9wX3N5bmModm9pZCkKK3sKKwlpZiAodHBhY3BpX2hvdGtleV90YXNrKSB7CisJCWlmIChmcm96ZW4odHBhY3BpX2hvdGtleV90YXNrKSB8fAorCQkgICAgZnJlZXppbmcodHBhY3BpX2hvdGtleV90YXNrKSkKKwkJCXRoYXdfcHJvY2Vzcyh0cGFjcGlfaG90a2V5X3Rhc2spOworCisJCWt0aHJlYWRfc3RvcCh0cGFjcGlfaG90a2V5X3Rhc2spOworCQl0cGFjcGlfaG90a2V5X3Rhc2sgPSBOVUxMOworCQltdXRleF9sb2NrKCZob3RrZXlfdGhyZWFkX211dGV4KTsKKwkJLyogYXQgdGhpcyBwb2ludCwgdGhlIHRocmVhZCBkaWQgZXhpdCAqLworCQltdXRleF91bmxvY2soJmhvdGtleV90aHJlYWRfbXV0ZXgpOworCX0KK30KKworLyogY2FsbCB3aXRoIGhvdGtleV9tdXRleCBoZWxkICovCitzdGF0aWMgdm9pZCBob3RrZXlfcG9sbF9zZXR1cChpbnQgbWF5X3dhcm4pCit7CisJaWYgKChob3RrZXlfc291cmNlX21hc2sgJiBob3RrZXlfbWFzaykgIT0gMCAmJgorCSAgICBob3RrZXlfcG9sbF9mcmVxID4gMCAmJgorCSAgICAodHBhY3BpX2lucHV0ZGV2LT51c2VycyA+IDAgfHwgaG90a2V5X3JlcG9ydF9tb2RlIDwgMikpIHsKKwkJaWYgKCF0cGFjcGlfaG90a2V5X3Rhc2spIHsKKwkJCXRwYWNwaV9ob3RrZXlfdGFzayA9IGt0aHJlYWRfcnVuKGhvdGtleV9rdGhyZWFkLAorCQkJCQkJCSBOVUxMLAorCQkJCQkJCSBUUEFDUElfRklMRSAiZCIpOworCQkJaWYgKElTX0VSUih0cGFjcGlfaG90a2V5X3Rhc2spKSB7CisJCQkJdHBhY3BpX2hvdGtleV90YXNrID0gTlVMTDsKKwkJCQlwcmludGsoVFBBQ1BJX0VSUgorCQkJCSAgICAgICAiY291bGQgbm90IGNyZWF0ZSBrZXJuZWwgdGhyZWFkICIKKwkJCQkgICAgICAgImZvciBob3RrZXkgcG9sbGluZ1xuIik7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlob3RrZXlfcG9sbF9zdG9wX3N5bmMoKTsKKwkJaWYgKG1heV93YXJuICYmCisJCSAgICBob3RrZXlfc291cmNlX21hc2sgIT0gMCAmJiBob3RrZXlfcG9sbF9mcmVxID09IDApIHsKKwkJCXByaW50ayhUUEFDUElfTk9USUNFCisJCQkJImhvdCBrZXlzIDB4JTA4eCByZXF1aXJlIHBvbGxpbmcsICIKKwkJCQkid2hpY2ggaXMgY3VycmVudGx5IGRpc2FibGVkXG4iLAorCQkJCWhvdGtleV9zb3VyY2VfbWFzayk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhvdGtleV9wb2xsX3NldHVwX3NhZmUoaW50IG1heV93YXJuKQoreworCW11dGV4X2xvY2soJmhvdGtleV9tdXRleCk7CisJaG90a2V5X3BvbGxfc2V0dXAobWF5X3dhcm4pOworCW11dGV4X3VubG9jaygmaG90a2V5X211dGV4KTsKK30KKworc3RhdGljIGludCBob3RrZXlfaW5wdXRkZXZfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJc3dpdGNoICh0cGFjcGlfbGlmZWN5Y2xlKSB7CisJY2FzZSBUUEFDUElfTElGRV9JTklUOgorCQkvKgorCQkgKiBob3RrZXlfaW5pdCB3aWxsIGNhbGwgaG90a2V5X3BvbGxfc2V0dXBfc2FmZQorCQkgKiBhdCB0aGUgYXBwcm9wcmlhdGUgbW9tZW50CisJCSAqLworCQlyZXR1cm4gMDsKKwljYXNlIFRQQUNQSV9MSUZFX0VYSVRJTkc6CisJCXJldHVybiAtRUJVU1k7CisJY2FzZSBUUEFDUElfTElGRV9SVU5OSU5HOgorCQlob3RrZXlfcG9sbF9zZXR1cF9zYWZlKDApOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBTaG91bGQgb25seSBoYXBwZW4gaWYgdHBhY3BpX2xpZmVjeWNsZSBpcyBjb3JydXB0ICovCisJQlVHKCk7CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIHZvaWQgaG90a2V5X2lucHV0ZGV2X2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwkvKiBkaXNhYmxlIGhvdGtleSBwb2xsaW5nIHdoZW4gcG9zc2libGUgKi8KKwlpZiAodHBhY3BpX2xpZmVjeWNsZSA9PSBUUEFDUElfTElGRV9SVU5OSU5HKQorCQlob3RrZXlfcG9sbF9zZXR1cF9zYWZlKDApOworfQorI2VuZGlmIC8qIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMICovCisKIC8qIHN5c2ZzIGhvdGtleSBlbmFibGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogc3RhdGljIHNzaXplX3QgaG90a2V5X2VuYWJsZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJICAgY2hhciAqYnVmKQogewogCWludCByZXMsIHN0YXR1czsKLQl1MzIgbWFzazsKIAotCXJlcyA9IGhvdGtleV9nZXQoJnN0YXR1cywgJm1hc2spOworCXJlcyA9IGhvdGtleV9zdGF0dXNfZ2V0KCZzdGF0dXMpOwogCWlmIChyZXMpCiAJCXJldHVybiByZXM7CiAKQEAgLTgwOSwxNSArMTQ2NSwxMiBAQAogCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXVuc2lnbmVkIGxvbmcgdDsKLQlpbnQgcmVzLCBzdGF0dXM7Ci0JdTMyIG1hc2s7CisJaW50IHJlczsKIAogCWlmIChwYXJzZV9zdHJ0b3VsKGJ1ZiwgMSwgJnQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJlcyA9IGhvdGtleV9nZXQoJnN0YXR1cywgJm1hc2spOwotCWlmICghcmVzKQotCQlyZXMgPSBob3RrZXlfc2V0KHQsIG1hc2spOworCXJlcyA9IGhvdGtleV9zdGF0dXNfc2V0KHQpOwogCiAJcmV0dXJuIChyZXMpID8gcmVzIDogY291bnQ7CiB9CkBAIC04MzEsMTQgKzE0ODQsMTUgQEAKIAkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJICAgY2hhciAqYnVmKQogewotCWludCByZXMsIHN0YXR1czsKLQl1MzIgbWFzazsKKwlpbnQgcmVzOwogCi0JcmVzID0gaG90a2V5X2dldCgmc3RhdHVzLCAmbWFzayk7Ci0JaWYgKHJlcykKLQkJcmV0dXJuIHJlczsKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZob3RrZXlfbXV0ZXgpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCXJlcyA9IGhvdGtleV9tYXNrX2dldCgpOworCW11dGV4X3VubG9jaygmaG90a2V5X211dGV4KTsKIAotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjB4JTA4eFxuIiwgbWFzayk7CisJcmV0dXJuIChyZXMpPworCQlyZXMgOiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjB4JTA4eFxuIiwgaG90a2V5X21hc2spOwogfQogCiBzdGF0aWMgc3NpemVfdCBob3RrZXlfbWFza19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC04NDYsMTUgKzE1MDAsMjEgQEAKIAkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAl1bnNpZ25lZCBsb25nIHQ7Ci0JaW50IHJlcywgc3RhdHVzOwotCXUzMiBtYXNrOworCWludCByZXM7CiAKIAlpZiAocGFyc2Vfc3RydG91bChidWYsIDB4ZmZmZmZmZmZVTCwgJnQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJlcyA9IGhvdGtleV9nZXQoJnN0YXR1cywgJm1hc2spOwotCWlmICghcmVzKQotCQlob3RrZXlfc2V0KHN0YXR1cywgdCk7CisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmaG90a2V5X211dGV4KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCXJlcyA9IGhvdGtleV9tYXNrX3NldCh0KTsKKworI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMCisJaG90a2V5X3BvbGxfc2V0dXAoMSk7CisjZW5kaWYKKworCW11dGV4X3VubG9jaygmaG90a2V5X211dGV4KTsKIAogCXJldHVybiAocmVzKSA/IHJlcyA6IGNvdW50OwogfQpAQCAtODkwLDcgKzE1NTAsOCBAQAogCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgICBjaGFyICpidWYpCiB7Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHglMDh4XG4iLCBob3RrZXlfYWxsX21hc2spOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjB4JTA4eFxuIiwKKwkJCQlob3RrZXlfYWxsX21hc2sgfCBob3RrZXlfc291cmNlX21hc2spOwogfQogCiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfaG90a2V5X2FsbF9tYXNrID0KQEAgLTkwMiwxNCArMTU2Myw4NyBAQAogCQkJCQkgICAgY2hhciAqYnVmKQogewogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjB4JTA4eFxuIiwKLQkJCWhvdGtleV9hbGxfbWFzayAmIH5ob3RrZXlfcmVzZXJ2ZWRfbWFzayk7CisJCQkoaG90a2V5X2FsbF9tYXNrIHwgaG90a2V5X3NvdXJjZV9tYXNrKQorCQkJJiB+aG90a2V5X3Jlc2VydmVkX21hc2spOwogfQogCiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfaG90a2V5X3JlY29tbWVuZGVkX21hc2sgPQogCV9fQVRUUihob3RrZXlfcmVjb21tZW5kZWRfbWFzaywgU19JUlVHTywKIAkJaG90a2V5X3JlY29tbWVuZGVkX21hc2tfc2hvdywgTlVMTCk7CiAKLS8qIHN5c2ZzIGhvdGtleSByYWRpb19zdyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMCisKKy8qIHN5c2ZzIGhvdGtleSBob3RrZXlfc291cmNlX21hc2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHNzaXplX3QgaG90a2V5X3NvdXJjZV9tYXNrX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHglMDh4XG4iLCBob3RrZXlfc291cmNlX21hc2spOworfQorCitzdGF0aWMgc3NpemVfdCBob3RrZXlfc291cmNlX21hc2tfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgdDsKKworCWlmIChwYXJzZV9zdHJ0b3VsKGJ1ZiwgMHhmZmZmZmZmZlVMLCAmdCkgfHwKKwkJKCh0ICYgflRQQUNQSV9IS0VZX05WUkFNX0tOT1dOX01BU0spICE9IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmhvdGtleV9tdXRleCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlIT1RLRVlfQ09ORklHX0NSSVRJQ0FMX1NUQVJUCisJaG90a2V5X3NvdXJjZV9tYXNrID0gdDsKKwlIT1RLRVlfQ09ORklHX0NSSVRJQ0FMX0VORAorCisJaG90a2V5X3BvbGxfc2V0dXAoMSk7CisKKwltdXRleF91bmxvY2soJmhvdGtleV9tdXRleCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9ob3RrZXlfc291cmNlX21hc2sgPQorCV9fQVRUUihob3RrZXlfc291cmNlX21hc2ssIFNfSVdVU1IgfCBTX0lSVUdPLAorCQlob3RrZXlfc291cmNlX21hc2tfc2hvdywgaG90a2V5X3NvdXJjZV9tYXNrX3N0b3JlKTsKKworLyogc3lzZnMgaG90a2V5IGhvdGtleV9wb2xsX2ZyZXEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgc3NpemVfdCBob3RrZXlfcG9sbF9mcmVxX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGhvdGtleV9wb2xsX2ZyZXEpOworfQorCitzdGF0aWMgc3NpemVfdCBob3RrZXlfcG9sbF9mcmVxX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIHQ7CisKKwlpZiAocGFyc2Vfc3RydG91bChidWYsIDI1LCAmdCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmaG90a2V5X211dGV4KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWhvdGtleV9wb2xsX2ZyZXEgPSB0OworCisJaG90a2V5X3BvbGxfc2V0dXAoMSk7CisJbXV0ZXhfdW5sb2NrKCZob3RrZXlfbXV0ZXgpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfaG90a2V5X3BvbGxfZnJlcSA9CisJX19BVFRSKGhvdGtleV9wb2xsX2ZyZXEsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQlob3RrZXlfcG9sbF9mcmVxX3Nob3csIGhvdGtleV9wb2xsX2ZyZXFfc3RvcmUpOworCisjZW5kaWYgLyogQ09ORklHX1RISU5LUEFEX0FDUElfSE9US0VZX1BPTEwgKi8KKworLyogc3lzZnMgaG90a2V5IHJhZGlvX3N3IChwb2xsYWJsZSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdGF0aWMgc3NpemVfdCBob3RrZXlfcmFkaW9fc3dfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCSAgIGNoYXIgKmJ1ZikKQEAgLTkyNSw2ICsxNjU5LDEzIEBACiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfaG90a2V5X3JhZGlvX3N3ID0KIAlfX0FUVFIoaG90a2V5X3JhZGlvX3N3LCBTX0lSVUdPLCBob3RrZXlfcmFkaW9fc3dfc2hvdywgTlVMTCk7CiAKK3N0YXRpYyB2b2lkIGhvdGtleV9yYWRpb19zd19ub3RpZnlfY2hhbmdlKHZvaWQpCit7CisJaWYgKHRwX2ZlYXR1cmVzLmhvdGtleV93bHN3KQorCQlzeXNmc19ub3RpZnkoJnRwYWNwaV9wZGV2LT5kZXYua29iaiwgTlVMTCwKKwkJCSAgICAgImhvdGtleV9yYWRpb19zdyIpOworfQorCiAvKiBzeXNmcyBob3RrZXkgcmVwb3J0X21vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBzc2l6ZV90IGhvdGtleV9yZXBvcnRfbW9kZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLApAQCAtOTM3LDQzICsxNjc4LDEzMiBAQAogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2hvdGtleV9yZXBvcnRfbW9kZSA9CiAJX19BVFRSKGhvdGtleV9yZXBvcnRfbW9kZSwgU19JUlVHTywgaG90a2V5X3JlcG9ydF9tb2RlX3Nob3csIE5VTEwpOwogCisvKiBzeXNmcyB3YWtldXAgcmVhc29uIChwb2xsYWJsZSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBzc2l6ZV90IGhvdGtleV93YWtldXBfcmVhc29uX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGhvdGtleV93YWtldXBfcmVhc29uKTsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2hvdGtleV93YWtldXBfcmVhc29uID0KKwlfX0FUVFIod2FrZXVwX3JlYXNvbiwgU19JUlVHTywgaG90a2V5X3dha2V1cF9yZWFzb25fc2hvdywgTlVMTCk7CisKK3ZvaWQgaG90a2V5X3dha2V1cF9yZWFzb25fbm90aWZ5X2NoYW5nZSh2b2lkKQoreworCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfbWFzaykKKwkJc3lzZnNfbm90aWZ5KCZ0cGFjcGlfcGRldi0+ZGV2LmtvYmosIE5VTEwsCisJCQkgICAgICJ3YWtldXBfcmVhc29uIik7Cit9CisKKy8qIHN5c2ZzIHdha2V1cCBob3R1bnBsdWdfY29tcGxldGUgKHBvbGxhYmxlKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHNzaXplX3QgaG90a2V5X3dha2V1cF9ob3R1bnBsdWdfY29tcGxldGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgaG90a2V5X2F1dG9zbGVlcF9hY2spOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfaG90a2V5X3dha2V1cF9ob3R1bnBsdWdfY29tcGxldGUgPQorCV9fQVRUUih3YWtldXBfaG90dW5wbHVnX2NvbXBsZXRlLCBTX0lSVUdPLAorCSAgICAgICBob3RrZXlfd2FrZXVwX2hvdHVucGx1Z19jb21wbGV0ZV9zaG93LCBOVUxMKTsKKwordm9pZCBob3RrZXlfd2FrZXVwX2hvdHVucGx1Z19jb21wbGV0ZV9ub3RpZnlfY2hhbmdlKHZvaWQpCit7CisJaWYgKHRwX2ZlYXR1cmVzLmhvdGtleV9tYXNrKQorCQlzeXNmc19ub3RpZnkoJnRwYWNwaV9wZGV2LT5kZXYua29iaiwgTlVMTCwKKwkJCSAgICAgIndha2V1cF9ob3R1bnBsdWdfY29tcGxldGUiKTsKK30KKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpob3RrZXlfYXR0cmlidXRlc1tdIF9faW5pdGRhdGEgPSB7CiAJJmRldl9hdHRyX2hvdGtleV9lbmFibGUuYXR0ciwKKwkmZGV2X2F0dHJfaG90a2V5X2Jpb3NfZW5hYmxlZC5hdHRyLAogCSZkZXZfYXR0cl9ob3RrZXlfcmVwb3J0X21vZGUuYXR0ciwKKyNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9IT1RLRVlfUE9MTAorCSZkZXZfYXR0cl9ob3RrZXlfbWFzay5hdHRyLAorCSZkZXZfYXR0cl9ob3RrZXlfYWxsX21hc2suYXR0ciwKKwkmZGV2X2F0dHJfaG90a2V5X3JlY29tbWVuZGVkX21hc2suYXR0ciwKKwkmZGV2X2F0dHJfaG90a2V5X3NvdXJjZV9tYXNrLmF0dHIsCisJJmRldl9hdHRyX2hvdGtleV9wb2xsX2ZyZXEuYXR0ciwKKyNlbmRpZgogfTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmhvdGtleV9tYXNrX2F0dHJpYnV0ZXNbXSBfX2luaXRkYXRhID0gewotCSZkZXZfYXR0cl9ob3RrZXlfbWFzay5hdHRyLAotCSZkZXZfYXR0cl9ob3RrZXlfYmlvc19lbmFibGVkLmF0dHIsCiAJJmRldl9hdHRyX2hvdGtleV9iaW9zX21hc2suYXR0ciwKKyNpZm5kZWYgQ09ORklHX1RISU5LUEFEX0FDUElfSE9US0VZX1BPTEwKKwkmZGV2X2F0dHJfaG90a2V5X21hc2suYXR0ciwKIAkmZGV2X2F0dHJfaG90a2V5X2FsbF9tYXNrLmF0dHIsCiAJJmRldl9hdHRyX2hvdGtleV9yZWNvbW1lbmRlZF9tYXNrLmF0dHIsCisjZW5kaWYKKwkmZGV2X2F0dHJfaG90a2V5X3dha2V1cF9yZWFzb24uYXR0ciwKKwkmZGV2X2F0dHJfaG90a2V5X3dha2V1cF9ob3R1bnBsdWdfY29tcGxldGUuYXR0ciwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGhvdGtleV9pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pCiB7Ci0KKwkvKiBSZXF1aXJlbWVudHMgZm9yIGNoYW5naW5nIHRoZSBkZWZhdWx0IGtleW1hcHM6CisJICoKKwkgKiAxLiBNYW55IG9mIHRoZSBrZXlzIGFyZSBtYXBwZWQgdG8gS0VZX1JFU0VSVkVEIGZvciB2ZXJ5CisJICogICAgZ29vZCByZWFzb25zLiAgRG8gbm90IGNoYW5nZSB0aGVtIHVubGVzcyB5b3UgaGF2ZSBkZWVwCisJICogICAga25vd2xlZGdlIG9uIHRoZSBJQk0gYW5kIExlbm92byBUaGlua1BhZCBmaXJtd2FyZSBmb3IKKwkgKiAgICB0aGUgdmFyaW91cyBUaGlua1BhZCBtb2RlbHMuICBUaGUgZHJpdmVyIGJlaGF2ZXMKKwkgKiAgICBkaWZmZXJlbnRseSBmb3IgS0VZX1JFU0VSVkVEOiBzdWNoIGtleXMgaGF2ZSB0aGVpcgorCSAqICAgIGhvdCBrZXkgbWFzayAqdW5zZXQqIGluIG1hc2tfcmVjb21tZW5kZWQsIGFuZCBhbHNvCisJICogICAgaW4gdGhlIGluaXRpYWwgaG90IGtleSBtYXNrIHByb2dyYW1tZWQgaW50byB0aGUKKwkgKiAgICBmaXJtd2FyZSBhdCBkcml2ZXIgbG9hZCB0aW1lLCB3aGljaCBtZWFucyB0aGUgZmlybS0KKwkgKiAgICB3YXJlIG1heSByZWFjdCB2ZXJ5IGRpZmZlcmVudGx5IGlmIHlvdSBjaGFuZ2UgdGhlbSB0bworCSAqICAgIHNvbWV0aGluZyBlbHNlOworCSAqCisJICogMi4gWW91IG11c3QgYmUgc3Vic2NyaWJlZCB0byB0aGUgbGludXgtdGhpbmtwYWQgYW5kCisJICogICAgaWJtLWFjcGktZGV2ZWwgbWFpbGluZyBsaXN0cywgYW5kIHlvdSBzaG91bGQgcmVhZCB0aGUKKwkgKiAgICBsaXN0IGFyY2hpdmVzIHNpbmNlIDIwMDcgaWYgeW91IHdhbnQgdG8gY2hhbmdlIHRoZQorCSAqICAgIGtleW1hcHMuICBUaGlzIHJlcXVpcmVtZW50IGV4aXN0cyBzbyB0aGF0IHlvdSB3aWxsCisJICogICAga25vdyB0aGUgcGFzdCBoaXN0b3J5IG9mIHByb2JsZW1zIHdpdGggdGhlIHRoaW5rcGFkLQorCSAqICAgIGFjcGkgZHJpdmVyIGtleW1hcHMsIGFuZCBhbHNvIHRoYXQgeW91IHdpbGwgYmUKKwkgKiAgICBsaXN0ZW5pbmcgdG8gYW55IGJ1ZyByZXBvcnRzOworCSAqCisJICogMy4gRG8gbm90IHNlbmQgdGhpbmtwYWQtYWNwaSBzcGVjaWZpYyBwYXRjaGVzIGRpcmVjdGx5IHRvCisJICogICAgZm9yIG1lcmdpbmcsICpldmVyKi4gIFNlbmQgdGhlbSB0byB0aGUgbGludXgtYWNwaQorCSAqICAgIG1haWxpbmdsaXN0IGZvciBjb21tZW50cy4gIE1lcmdpbmcgaXMgdG8gYmUgZG9uZSBvbmx5CisJICogICAgdGhyb3VnaCBhY3BpLXRlc3QgYW5kIHRoZSBBQ1BJIG1haW50YWluZXIuCisJICoKKwkgKiBJZiB0aGUgYWJvdmUgaXMgdG9vIG11Y2ggdG8gYXNrLCBkb24ndCBjaGFuZ2UgdGhlIGtleW1hcC4KKwkgKiBBc2sgdGhlIHRoaW5rcGFkLWFjcGkgbWFpbnRhaW5lciB0byBkbyBpdCwgaW5zdGVhZC4KKwkgKi8KIAlzdGF0aWMgdTE2IGlibV9rZXljb2RlX21hcFtdIF9faW5pdGRhdGEgPSB7CiAJCS8qIFNjYW4gQ29kZXMgMHgwMCB0byAweDBCOiBBQ1BJIEhLRVkgRk4rRjEuLkYxMiAqLwogCQlLRVlfRk5fRjEsCUtFWV9GTl9GMiwJS0VZX0NPRkZFRSwJS0VZX1NMRUVQLAogCQlLRVlfV0xBTiwJS0VZX0ZOX0Y2LCBLRVlfU1dJVENIVklERU9NT0RFLCBLRVlfRk5fRjgsCiAJCUtFWV9GTl9GOSwJS0VZX0ZOX0YxMCwJS0VZX0ZOX0YxMSwJS0VZX1NVU1BFTkQsCi0JCS8qIFNjYW4gY29kZXMgMHgwQyB0byAweDBGOiBPdGhlciBBQ1BJIEhLRVkgaG90IGtleXMgKi8KKworCQkvKiBTY2FuIGNvZGVzIDB4MEMgdG8gMHgxRjogT3RoZXIgQUNQSSBIS0VZIGhvdCBrZXlzICovCiAJCUtFWV9VTktOT1dOLAkvKiAweDBDOiBGTitCQUNLU1BBQ0UgKi8KIAkJS0VZX1VOS05PV04sCS8qIDB4MEQ6IEZOK0lOU0VSVCAqLwogCQlLRVlfVU5LTk9XTiwJLyogMHgwRTogRk4rREVMRVRFICovCisKKwkJLyogYnJpZ2h0bmVzczogZmlybXdhcmUgYWx3YXlzIHJlYWN0cyB0byB0aGVtLCB1bmxlc3MKKwkJICogWC5vcmcgZGlkIHNvbWUgdHJpY2tzIGluIHRoZSByYWRlb24gQklPUyBzY3JhdGNoCisJCSAqIHJlZ2lzdGVycyBvZiAqc29tZSogbW9kZWxzICovCiAJCUtFWV9SRVNFUlZFRCwJLyogMHgwRjogRk4rSE9NRSAoYnJpZ2h0bmVzcyB1cCkgKi8KLQkJLyogU2NhbiBjb2RlcyAweDEwIHRvIDB4MUY6IEV4dGVuZGVkIEFDUEkgSEtFWSBob3Qga2V5cyAqLwogCQlLRVlfUkVTRVJWRUQsCS8qIDB4MTA6IEZOK0VORCAoYnJpZ2h0bmVzcyBkb3duKSAqLworCisJCS8qIFRoaW5rbGlnaHQ6IGZpcm13YXJlIGFsd2F5cyByZWFjdCB0byBpdCAqLwogCQlLRVlfUkVTRVJWRUQsCS8qIDB4MTE6IEZOK1BHVVAgKHRoaW5rbGlnaHQgdG9nZ2xlKSAqLworCiAJCUtFWV9VTktOT1dOLAkvKiAweDEyOiBGTitQR0RPV04gKi8KIAkJS0VZX1pPT00sCS8qIDB4MTM6IEZOK1NQQUNFICh6b29tKSAqLworCisJCS8qIFZvbHVtZTogZmlybXdhcmUgYWx3YXlzIHJlYWN0IHRvIGl0IGFuZCByZXByb2dyYW1zCisJCSAqIHRoZSBidWlsdC1pbiAqZXh0cmEqIG1peGVyLiAgTmV2ZXIgbWFwIGl0IHRvIGNvbnRyb2wKKwkJICogYW5vdGhlciBtaXhlciBieSBkZWZhdWx0LiAqLwogCQlLRVlfUkVTRVJWRUQsCS8qIDB4MTQ6IFZPTFVNRSBVUCAqLwogCQlLRVlfUkVTRVJWRUQsCS8qIDB4MTU6IFZPTFVNRSBET1dOICovCiAJCUtFWV9SRVNFUlZFRCwJLyogMHgxNjogTVVURSAqLworCiAJCUtFWV9WRU5ET1IsCS8qIDB4MTc6IFRoaW5rcGFkL0FjY2Vzc0lCTS9MZW5vdm8gKi8KKwogCQkvKiAoYXNzaWdubWVudHMgdW5rbm93biwgcGxlYXNlIHJlcG9ydCBpZiBmb3VuZCkgKi8KIAkJS0VZX1VOS05PV04sIEtFWV9VTktOT1dOLCBLRVlfVU5LTk9XTiwgS0VZX1VOS05PV04sCiAJCUtFWV9VTktOT1dOLCBLRVlfVU5LTk9XTiwgS0VZX1VOS05PV04sIEtFWV9VTktOT1dOLApAQCAtOTgzLDIwICsxODEzLDM3IEBACiAJCUtFWV9GTl9GMSwJS0VZX0NPRkZFRSwJS0VZX0JBVFRFUlksCUtFWV9TTEVFUCwKIAkJS0VZX1dMQU4sCUtFWV9GTl9GNiwgS0VZX1NXSVRDSFZJREVPTU9ERSwgS0VZX0ZOX0Y4LAogCQlLRVlfRk5fRjksCUtFWV9GTl9GMTAsCUtFWV9GTl9GMTEsCUtFWV9TVVNQRU5ELAotCQkvKiBTY2FuIGNvZGVzIDB4MEMgdG8gMHgwRjogT3RoZXIgQUNQSSBIS0VZIGhvdCBrZXlzICovCisKKwkJLyogU2NhbiBjb2RlcyAweDBDIHRvIDB4MUY6IE90aGVyIEFDUEkgSEtFWSBob3Qga2V5cyAqLwogCQlLRVlfVU5LTk9XTiwJLyogMHgwQzogRk4rQkFDS1NQQUNFICovCiAJCUtFWV9VTktOT1dOLAkvKiAweDBEOiBGTitJTlNFUlQgKi8KIAkJS0VZX1VOS05PV04sCS8qIDB4MEU6IEZOK0RFTEVURSAqLworCiAJCUtFWV9SRVNFUlZFRCwJLyogMHgwRjogRk4rSE9NRSAoYnJpZ2h0bmVzcyB1cCkgKi8KLQkJLyogU2NhbiBjb2RlcyAweDEwIHRvIDB4MUY6IEV4dGVuZGVkIEFDUEkgSEtFWSBob3Qga2V5cyAqLwogCQlLRVlfUkVTRVJWRUQsCS8qIDB4MTA6IEZOK0VORCAoYnJpZ2h0bmVzcyBkb3duKSAqLworCiAJCUtFWV9SRVNFUlZFRCwJLyogMHgxMTogRk4rUEdVUCAodGhpbmtsaWdodCB0b2dnbGUpICovCisKIAkJS0VZX1VOS05PV04sCS8qIDB4MTI6IEZOK1BHRE9XTiAqLwogCQlLRVlfWk9PTSwJLyogMHgxMzogRk4rU1BBQ0UgKHpvb20pICovCisKKwkJLyogVm9sdW1lOiB6NjAvejYxLCBUNjAgKEJJT1MgdmVyc2lvbj8pOiBmaXJtd2FyZSBhbHdheXMKKwkJICogcmVhY3QgdG8gaXQgYW5kIHJlcHJvZ3JhbXMgdGhlIGJ1aWx0LWluICpleHRyYSogbWl4ZXIuCisJCSAqIE5ldmVyIG1hcCBpdCB0byBjb250cm9sIGFub3RoZXIgbWl4ZXIgYnkgZGVmYXVsdC4KKwkJICoKKwkJICogVDYwPywgVDYxLCBSNjA/LCBSNjE6IGZpcm13YXJlIGFuZCBFQyB0cmllcyB0byBzZW5kCisJCSAqIHRoZXNlIG92ZXIgdGhlIHJlZ3VsYXIga2V5Ym9hcmQsIHNvIHRoZXNlIGFyZSBuby1vcHMsCisJCSAqIGJ1dCB0aGVyZSBhcmUgc3RpbGwgd2VpcmQgYnVncyByZS4gTVVURSwgc28gZG8gbm90CisJCSAqIGNoYW5nZSB1bmxlc3MgeW91IGdldCB0ZXN0IHJlcG9ydHMgZnJvbSBhbGwgTGVub3ZvCisJCSAqIG1vZGVscy4gIE1heSBjYXVzZSB0aGUgQklPUyB0byBpbnRlcmZlcmUgd2l0aCB0aGUKKwkJICogSERBIG1peGVyLgorCQkgKi8KIAkJS0VZX1JFU0VSVkVELAkvKiAweDE0OiBWT0xVTUUgVVAgKi8KIAkJS0VZX1JFU0VSVkVELAkvKiAweDE1OiBWT0xVTUUgRE9XTiAqLwogCQlLRVlfUkVTRVJWRUQsCS8qIDB4MTY6IE1VVEUgKi8KKwogCQlLRVlfVkVORE9SLAkvKiAweDE3OiBUaGlua3BhZC9BY2Nlc3NJQk0vTGVub3ZvICovCisKIAkJLyogKGFzc2lnbm1lbnRzIHVua25vd24sIHBsZWFzZSByZXBvcnQgaWYgZm91bmQpICovCiAJCUtFWV9VTktOT1dOLCBLRVlfVU5LTk9XTiwgS0VZX1VOS05PV04sIEtFWV9VTktOT1dOLAogCQlLRVlfVU5LTk9XTiwgS0VZX1VOS05PV04sIEtFWV9VTktOT1dOLCBLRVlfVU5LTk9XTiwKQEAgLTEwMTMsMTAgKzE4NjAsMTcgQEAKIAl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJpbml0aWFsaXppbmcgaG90a2V5IHN1YmRyaXZlclxuIik7CiAKIAlCVUdfT04oIXRwYWNwaV9pbnB1dGRldik7CisJQlVHX09OKHRwYWNwaV9pbnB1dGRldi0+b3BlbiAhPSBOVUxMIHx8CisJICAgICAgIHRwYWNwaV9pbnB1dGRldi0+Y2xvc2UgIT0gTlVMTCk7CiAKLQlJQk1fQUNQSUhBTkRMRV9JTklUKGhrZXkpOworCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQoaGtleSk7CiAJbXV0ZXhfaW5pdCgmaG90a2V5X211dGV4KTsKIAorI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMCisJbXV0ZXhfaW5pdCgmaG90a2V5X3RocmVhZF9tdXRleCk7CisJbXV0ZXhfaW5pdCgmaG90a2V5X3RocmVhZF9kYXRhX211dGV4KTsKKyNlbmRpZgorCiAJLyogaG90a2V5IG5vdCBzdXBwb3J0ZWQgb24gNTcwICovCiAJdHBfZmVhdHVyZXMuaG90a2V5ID0gaGtleV9oYW5kbGUgIT0gTlVMTDsKIApAQCAtMTAyNCw3ICsxODc4LDcgQEAKIAkJc3RyX3N1cHBvcnRlZCh0cF9mZWF0dXJlcy5ob3RrZXkpKTsKIAogCWlmICh0cF9mZWF0dXJlcy5ob3RrZXkpIHsKLQkJaG90a2V5X2Rldl9hdHRyaWJ1dGVzID0gY3JlYXRlX2F0dHJfc2V0KDgsIE5VTEwpOworCQlob3RrZXlfZGV2X2F0dHJpYnV0ZXMgPSBjcmVhdGVfYXR0cl9zZXQoMTIsIE5VTEwpOwogCQlpZiAoIWhvdGtleV9kZXZfYXR0cmlidXRlcykKIAkJCXJldHVybiAtRU5PTUVNOwogCQlyZXMgPSBhZGRfbWFueV90b19hdHRyX3NldChob3RrZXlfZGV2X2F0dHJpYnV0ZXMsCkBAIC0xMDM4LDE1ICsxODkyLDE1IEBACiAJCSAgIGZvciBIS0VZIGludGVyZmFjZSB2ZXJzaW9uIDB4MTAwICovCiAJCWlmIChhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCAmaGtleXYsICJNSEtWIiwgInFkIikpIHsKIAkJCWlmICgoaGtleXYgPj4gOCkgIT0gMSkgewotCQkJCXByaW50ayhJQk1fRVJSICJ1bmtub3duIHZlcnNpb24gb2YgdGhlICIKKwkJCQlwcmludGsoVFBBQ1BJX0VSUiAidW5rbm93biB2ZXJzaW9uIG9mIHRoZSAiCiAJCQkJICAgICAgICJIS0VZIGludGVyZmFjZTogMHgleFxuIiwgaGtleXYpOwotCQkJCXByaW50ayhJQk1fRVJSICJwbGVhc2UgcmVwb3J0IHRoaXMgdG8gJXNcbiIsCi0JCQkJICAgICAgIElCTV9NQUlMKTsKKwkJCQlwcmludGsoVFBBQ1BJX0VSUiAicGxlYXNlIHJlcG9ydCB0aGlzIHRvICVzXG4iLAorCQkJCSAgICAgICBUUEFDUElfTUFJTCk7CiAJCQl9IGVsc2UgewogCQkJCS8qCiAJCQkJICogTUhLViAweDEwMCBpbiBBMzEsIFI0MCwgUjQwZSwKIAkJCQkgKiBUNHgsIFgzMSwgYW5kIGxhdGVyCi0JCQkJICogKi8KKwkJCQkgKi8KIAkJCQl0cF9mZWF0dXJlcy5ob3RrZXlfbWFzayA9IDE7CiAJCQl9CiAJCX0KQEAgLTEwNTcsMjUgKzE5MTEsNDYgQEAKIAkJaWYgKHRwX2ZlYXR1cmVzLmhvdGtleV9tYXNrKSB7CiAJCQlpZiAoIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsICZob3RrZXlfYWxsX21hc2ssCiAJCQkJCSJNSEtBIiwgInFkIikpIHsKLQkJCQlwcmludGsoSUJNX0VSUgorCQkJCXByaW50ayhUUEFDUElfRVJSCiAJCQkJICAgICAgICJtaXNzaW5nIE1IS0EgaGFuZGxlciwgIgogCQkJCSAgICAgICAicGxlYXNlIHJlcG9ydCB0aGlzIHRvICVzXG4iLAotCQkJCSAgICAgICBJQk1fTUFJTCk7Ci0JCQkJaG90a2V5X2FsbF9tYXNrID0gMHgwODBjVTsgLyogRk4rRjEyLCBGTitGNCwgRk4rRjMgKi8KKwkJCQkgICAgICAgVFBBQ1BJX01BSUwpOworCQkJCS8qIEZOK0YxMiwgRk4rRjQsIEZOK0YzICovCisJCQkJaG90a2V5X2FsbF9tYXNrID0gMHgwODBjVTsKIAkJCX0KIAkJfQogCi0JCXJlcyA9IGhvdGtleV9nZXQoJmhvdGtleV9vcmlnX3N0YXR1cywgJmhvdGtleV9vcmlnX21hc2spOworCQkvKiBob3RrZXlfc291cmNlX21hc2sgKm11c3QqIGJlIHplcm8gZm9yCisJCSAqIHRoZSBmaXJzdCBob3RrZXlfbWFza19nZXQgKi8KKwkJcmVzID0gaG90a2V5X3N0YXR1c19nZXQoJmhvdGtleV9vcmlnX3N0YXR1cyk7CiAJCWlmICghcmVzICYmIHRwX2ZlYXR1cmVzLmhvdGtleV9tYXNrKSB7Ci0JCQlyZXMgPSBhZGRfbWFueV90b19hdHRyX3NldChob3RrZXlfZGV2X2F0dHJpYnV0ZXMsCi0JCQkJaG90a2V5X21hc2tfYXR0cmlidXRlcywKLQkJCQlBUlJBWV9TSVpFKGhvdGtleV9tYXNrX2F0dHJpYnV0ZXMpKTsKKwkJCXJlcyA9IGhvdGtleV9tYXNrX2dldCgpOworCQkJaG90a2V5X29yaWdfbWFzayA9IGhvdGtleV9tYXNrOworCQkJaWYgKCFyZXMpIHsKKwkJCQlyZXMgPSBhZGRfbWFueV90b19hdHRyX3NldCgKKwkJCQkJaG90a2V5X2Rldl9hdHRyaWJ1dGVzLAorCQkJCQlob3RrZXlfbWFza19hdHRyaWJ1dGVzLAorCQkJCQlBUlJBWV9TSVpFKGhvdGtleV9tYXNrX2F0dHJpYnV0ZXMpKTsKKwkJCX0KIAkJfQogCisjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfSE9US0VZX1BPTEwKKwkJaWYgKHRwX2ZlYXR1cmVzLmhvdGtleV9tYXNrKSB7CisJCQlob3RrZXlfc291cmNlX21hc2sgPSBUUEFDUElfSEtFWV9OVlJBTV9HT09EX01BU0sKKwkJCQkJCSYgfmhvdGtleV9hbGxfbWFzazsKKwkJfSBlbHNlIHsKKwkJCWhvdGtleV9zb3VyY2VfbWFzayA9IFRQQUNQSV9IS0VZX05WUkFNX0dPT0RfTUFTSzsKKwkJfQorCisJCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKKwkJCSAgICAiaG90a2V5IHNvdXJjZSBtYXNrIDB4JTA4eCwgcG9sbGluZyBmcmVxICVkXG4iLAorCQkJICAgIGhvdGtleV9zb3VyY2VfbWFzaywgaG90a2V5X3BvbGxfZnJlcSk7CisjZW5kaWYKKwogCQkvKiBOb3QgYWxsIHRoaW5rcGFkcyBoYXZlIGEgaGFyZHdhcmUgcmFkaW8gc3dpdGNoICovCiAJCWlmICghcmVzICYmIGFjcGlfZXZhbGYoaGtleV9oYW5kbGUsICZzdGF0dXMsICJXTFNXIiwgInFkIikpIHsKIAkJCXRwX2ZlYXR1cmVzLmhvdGtleV93bHN3ID0gMTsKLQkJCXByaW50ayhJQk1fSU5GTworCQkJcHJpbnRrKFRQQUNQSV9JTkZPCiAJCQkJInJhZGlvIHN3aXRjaCBmb3VuZDsgcmFkaW9zIGFyZSAlc1xuIiwKIAkJCQllbmFibGVkKHN0YXR1cywgMCkpOwogCQkJcmVzID0gYWRkX3RvX2F0dHJfc2V0KGhvdGtleV9kZXZfYXR0cmlidXRlcywKQEAgLTEwOTQsNyArMTk2OSw4IEBACiAJCWhvdGtleV9rZXljb2RlX21hcCA9IGttYWxsb2MoVFBBQ1BJX0hPVEtFWV9NQVBfU0laRSwKIAkJCQkJCUdGUF9LRVJORUwpOwogCQlpZiAoIWhvdGtleV9rZXljb2RlX21hcCkgewotCQkJcHJpbnRrKElCTV9FUlIgImZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGtleSBtYXBcbiIpOworCQkJcHJpbnRrKFRQQUNQSV9FUlIKKwkJCQkiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Iga2V5IG1hcFxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCkBAIC0xMTMzLDE1ICsyMDA5LDI2IEBACiAKIAkJZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsCiAJCQkJImVuYWJsaW5nIGhvdCBrZXkgaGFuZGxpbmdcbiIpOwotCQlyZXMgPSBob3RrZXlfc2V0KDEsIChob3RrZXlfYWxsX21hc2sgJiB+aG90a2V5X3Jlc2VydmVkX21hc2spCi0JCQkJCXwgaG90a2V5X29yaWdfbWFzayk7CisJCXJlcyA9IGhvdGtleV9zdGF0dXNfc2V0KDEpOwogCQlpZiAocmVzKQogCQkJcmV0dXJuIHJlczsKKwkJcmVzID0gaG90a2V5X21hc2tfc2V0KCgoaG90a2V5X2FsbF9tYXNrIHwgaG90a2V5X3NvdXJjZV9tYXNrKQorCQkJCQkmIH5ob3RrZXlfcmVzZXJ2ZWRfbWFzaykKKwkJCQkJfCBob3RrZXlfb3JpZ19tYXNrKTsKKwkJaWYgKHJlcyA8IDAgJiYgcmVzICE9IC1FTlhJTykKKwkJCXJldHVybiByZXM7CiAKIAkJZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsCiAJCQkJImxlZ2FjeSBob3Qga2V5IHJlcG9ydGluZyBvdmVyIHByb2NmcyAlc1xuIiwKIAkJCQkoaG90a2V5X3JlcG9ydF9tb2RlIDwgMikgPwogCQkJCQkiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKworI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMCisJCXRwYWNwaV9pbnB1dGRldi0+b3BlbiA9ICZob3RrZXlfaW5wdXRkZXZfb3BlbjsKKwkJdHBhY3BpX2lucHV0ZGV2LT5jbG9zZSA9ICZob3RrZXlfaW5wdXRkZXZfY2xvc2U7CisKKwkJaG90a2V5X3BvbGxfc2V0dXBfc2FmZSgxKTsKKyNlbmRpZgogCX0KIAogCXJldHVybiAodHBfZmVhdHVyZXMuaG90a2V5KT8gMCA6IDE7CkBAIC0xMTQ5LDEzICsyMDM2LDE5IEBACiAKIHN0YXRpYyB2b2lkIGhvdGtleV9leGl0KHZvaWQpCiB7Ci0JaW50IHJlczsKKyNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9IT1RLRVlfUE9MTAorCWhvdGtleV9wb2xsX3N0b3Bfc3luYygpOworI2VuZGlmCiAKIAlpZiAodHBfZmVhdHVyZXMuaG90a2V5KSB7Ci0JCWRiZ19wcmludGsoVFBBQ1BJX0RCR19FWElULCAicmVzdG9yaW5nIG9yaWdpbmFsIGhvdGtleSBtYXNrXG4iKTsKLQkJcmVzID0gaG90a2V5X3NldChob3RrZXlfb3JpZ19zdGF0dXMsIGhvdGtleV9vcmlnX21hc2spOwotCQlpZiAocmVzKQotCQkJcHJpbnRrKElCTV9FUlIgImZhaWxlZCB0byByZXN0b3JlIGhvdGtleSB0byBCSU9TIGRlZmF1bHRzXG4iKTsKKwkJZGJnX3ByaW50ayhUUEFDUElfREJHX0VYSVQsCisJCQkgICAicmVzdG9yaW5nIG9yaWdpbmFsIGhvdCBrZXkgbWFza1xuIik7CisJCS8qIG5vIHNob3J0LWNpcmN1aXQgYm9vbGVhbiBvcGVyYXRvciBiZWxvdyEgKi8KKwkJaWYgKChob3RrZXlfbWFza19zZXQoaG90a2V5X29yaWdfbWFzaykgfAorCQkgICAgIGhvdGtleV9zdGF0dXNfc2V0KGhvdGtleV9vcmlnX3N0YXR1cykpICE9IDApCisJCQlwcmludGsoVFBBQ1BJX0VSUgorCQkJICAgICAgICJmYWlsZWQgdG8gcmVzdG9yZSBob3Qga2V5IG1hc2sgIgorCQkJICAgICAgICJ0byBCSU9TIGRlZmF1bHRzXG4iKTsKIAl9CiAKIAlpZiAoaG90a2V5X2Rldl9hdHRyaWJ1dGVzKSB7CkBAIC0xMTY0LDYyICsyMDU3LDI4IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCB0cGFjcGlfaW5wdXRfc2VuZF9rZXkodW5zaWduZWQgaW50IHNjYW5jb2RlLAotCQkJCSAgdW5zaWduZWQgaW50IGtleWNvZGUpCi17Ci0JaWYgKGtleWNvZGUgIT0gS0VZX1JFU0VSVkVEKSB7Ci0JCW11dGV4X2xvY2soJnRwYWNwaV9pbnB1dGRldl9zZW5kX211dGV4KTsKLQotCQlpbnB1dF9yZXBvcnRfa2V5KHRwYWNwaV9pbnB1dGRldiwga2V5Y29kZSwgMSk7Ci0JCWlmIChrZXljb2RlID09IEtFWV9VTktOT1dOKQotCQkJaW5wdXRfZXZlbnQodHBhY3BpX2lucHV0ZGV2LCBFVl9NU0MsIE1TQ19TQ0FOLAotCQkJCSAgICBzY2FuY29kZSk7Ci0JCWlucHV0X3N5bmModHBhY3BpX2lucHV0ZGV2KTsKLQotCQlpbnB1dF9yZXBvcnRfa2V5KHRwYWNwaV9pbnB1dGRldiwga2V5Y29kZSwgMCk7Ci0JCWlmIChrZXljb2RlID09IEtFWV9VTktOT1dOKQotCQkJaW5wdXRfZXZlbnQodHBhY3BpX2lucHV0ZGV2LCBFVl9NU0MsIE1TQ19TQ0FOLAotCQkJCSAgICBzY2FuY29kZSk7Ci0JCWlucHV0X3N5bmModHBhY3BpX2lucHV0ZGV2KTsKLQotCQltdXRleF91bmxvY2soJnRwYWNwaV9pbnB1dGRldl9zZW5kX211dGV4KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHRwYWNwaV9pbnB1dF9zZW5kX3JhZGlvc3codm9pZCkKLXsKLQlpbnQgd2xzdzsKLQotCW11dGV4X2xvY2soJnRwYWNwaV9pbnB1dGRldl9zZW5kX211dGV4KTsKLQotCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfd2xzdyAmJiAhaG90a2V5X2dldF93bHN3KCZ3bHN3KSkgewotCQlpbnB1dF9yZXBvcnRfc3dpdGNoKHRwYWNwaV9pbnB1dGRldiwKLQkJCQkgICAgU1dfUkFESU8sICEhd2xzdyk7Ci0JCWlucHV0X3N5bmModHBhY3BpX2lucHV0ZGV2KTsKLQl9Ci0KLQltdXRleF91bmxvY2soJnRwYWNwaV9pbnB1dGRldl9zZW5kX211dGV4KTsKLX0KLQogc3RhdGljIHZvaWQgaG90a2V5X25vdGlmeShzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCB1MzIgZXZlbnQpCiB7CiAJdTMyIGhrZXk7Ci0JdW5zaWduZWQgaW50IGtleWNvZGUsIHNjYW5jb2RlOworCXVuc2lnbmVkIGludCBzY2FuY29kZTsKIAlpbnQgc2VuZF9hY3BpX2V2OwogCWludCBpZ25vcmVfYWNwaV9ldjsKKwlpbnQgdW5rX2V2OwogCiAJaWYgKGV2ZW50ICE9IDB4ODApIHsKLQkJcHJpbnRrKElCTV9FUlIgInVua25vd24gSEtFWSBub3RpZmljYXRpb24gZXZlbnQgJWRcbiIsIGV2ZW50KTsKKwkJcHJpbnRrKFRQQUNQSV9FUlIKKwkJICAgICAgICJ1bmtub3duIEhLRVkgbm90aWZpY2F0aW9uIGV2ZW50ICVkXG4iLCBldmVudCk7CiAJCS8qIGZvcndhcmQgaXQgdG8gdXNlcnNwYWNlLCBtYXliZSBpdCBrbm93cyBob3cgdG8gaGFuZGxlIGl0ICovCi0JCWFjcGlfYnVzX2dlbmVyYXRlX25ldGxpbmtfZXZlbnQoaWJtLT5hY3BpLT5kZXZpY2UtPnBucC5kZXZpY2VfY2xhc3MsCi0JCQkJCQlpYm0tPmFjcGktPmRldmljZS0+ZGV2LmJ1c19pZCwKLQkJCQkJCWV2ZW50LCAwKTsKKwkJYWNwaV9idXNfZ2VuZXJhdGVfbmV0bGlua19ldmVudCgKKwkJCQkJaWJtLT5hY3BpLT5kZXZpY2UtPnBucC5kZXZpY2VfY2xhc3MsCisJCQkJCWlibS0+YWNwaS0+ZGV2aWNlLT5kZXYuYnVzX2lkLAorCQkJCQlldmVudCwgMCk7CiAJCXJldHVybjsKIAl9CiAKIAl3aGlsZSAoMSkgewogCQlpZiAoIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsICZoa2V5LCAiTUhLUCIsICJkIikpIHsKLQkJCXByaW50ayhJQk1fRVJSICJmYWlsZWQgdG8gcmV0cmlldmUgSEtFWSBldmVudFxuIik7CisJCQlwcmludGsoVFBBQ1BJX0VSUiAiZmFpbGVkIHRvIHJldHJpZXZlIEhLRVkgZXZlbnRcbiIpOwogCQkJcmV0dXJuOwogCQl9CiAKQEAgLTEyMjgsOCArMjA4Nyw5IEBACiAJCQlyZXR1cm47CiAJCX0KIAotCQlzZW5kX2FjcGlfZXYgPSAwOworCQlzZW5kX2FjcGlfZXYgPSAxOwogCQlpZ25vcmVfYWNwaV9ldiA9IDA7CisJCXVua19ldiA9IDA7CiAKIAkJc3dpdGNoIChoa2V5ID4+IDEyKSB7CiAJCWNhc2UgMToKQEAgLTEyMzcsMTA0ICsyMDk3LDEzOSBAQAogCQkJc2NhbmNvZGUgPSBoa2V5ICYgMHhmZmY7CiAJCQlpZiAoc2NhbmNvZGUgPiAwICYmIHNjYW5jb2RlIDwgMHgyMSkgewogCQkJCXNjYW5jb2RlLS07Ci0JCQkJa2V5Y29kZSA9IGhvdGtleV9rZXljb2RlX21hcFtzY2FuY29kZV07Ci0JCQkJdHBhY3BpX2lucHV0X3NlbmRfa2V5KHNjYW5jb2RlLCBrZXljb2RlKTsKKwkJCQlpZiAoIShob3RrZXlfc291cmNlX21hc2sgJiAoMSA8PCBzY2FuY29kZSkpKSB7CisJCQkJCXRwYWNwaV9pbnB1dF9zZW5kX2tleShzY2FuY29kZSk7CisJCQkJCXNlbmRfYWNwaV9ldiA9IDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWdub3JlX2FjcGlfZXYgPSAxOworCQkJCX0KIAkJCX0gZWxzZSB7Ci0JCQkJcHJpbnRrKElCTV9FUlIKLQkJCQkgICAgICAgImhvdGtleSAweCUwNHggb3V0IG9mIHJhbmdlIGZvciBrZXlib2FyZCBtYXBcbiIsCi0JCQkJICAgICAgIGhrZXkpOwotCQkJCXNlbmRfYWNwaV9ldiA9IDE7CisJCQkJdW5rX2V2ID0gMTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQkvKiBXYWtldXAgcmVhc29uICovCisJCQlzd2l0Y2ggKGhrZXkpIHsKKwkJCWNhc2UgMHgyMzA0OiAvKiBzdXNwZW5kLCB1bmRvY2sgKi8KKwkJCWNhc2UgMHgyNDA0OiAvKiBoaWJlcm5hdGlvbiwgdW5kb2NrICovCisJCQkJaG90a2V5X3dha2V1cF9yZWFzb24gPSBUUF9BQ1BJX1dBS0VVUF9VTkRPQ0s7CisJCQkJaWdub3JlX2FjcGlfZXYgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAweDIzMDU6IC8qIHN1c3BlbmQsIGJheSBlamVjdCAqLworCQkJY2FzZSAweDI0MDU6IC8qIGhpYmVybmF0aW9uLCBiYXkgZWplY3QgKi8KKwkJCQlob3RrZXlfd2FrZXVwX3JlYXNvbiA9IFRQX0FDUElfV0FLRVVQX0JBWUVKOworCQkJCWlnbm9yZV9hY3BpX2V2ID0gMTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdW5rX2V2ID0gMTsKKwkJCX0KKwkJCWlmIChob3RrZXlfd2FrZXVwX3JlYXNvbiAhPSBUUF9BQ1BJX1dBS0VVUF9OT05FKSB7CisJCQkJcHJpbnRrKFRQQUNQSV9JTkZPCisJCQkJICAgICAgICJ3b2tlIHVwIGR1ZSB0byBhIGhvdC11bnBsdWcgIgorCQkJCSAgICAgICAicmVxdWVzdC4uLlxuIik7CisJCQkJaG90a2V5X3dha2V1cF9yZWFzb25fbm90aWZ5X2NoYW5nZSgpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCS8qIGJheS1yZWxhdGVkIHdha2V1cHMgKi8KKwkJCWlmIChoa2V5ID09IDB4MzAwMykgeworCQkJCWhvdGtleV9hdXRvc2xlZXBfYWNrID0gMTsKKwkJCQlwcmludGsoVFBBQ1BJX0lORk8KKwkJCQkgICAgICAgImJheSBlamVjdGVkXG4iKTsKKwkJCQlob3RrZXlfd2FrZXVwX2hvdHVucGx1Z19jb21wbGV0ZV9ub3RpZnlfY2hhbmdlKCk7CisJCQl9IGVsc2UgeworCQkJCXVua19ldiA9IDE7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJLyogZG9jay1yZWxhdGVkIHdha2V1cHMgKi8KKwkJCWlmIChoa2V5ID09IDB4NDAwMykgeworCQkJCWhvdGtleV9hdXRvc2xlZXBfYWNrID0gMTsKKwkJCQlwcmludGsoVFBBQ1BJX0lORk8KKwkJCQkgICAgICAgInVuZG9ja2VkXG4iKTsKKwkJCQlob3RrZXlfd2FrZXVwX2hvdHVucGx1Z19jb21wbGV0ZV9ub3RpZnlfY2hhbmdlKCk7CisJCQl9IGVsc2UgeworCQkJCXVua19ldiA9IDE7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSA1OgotCQkJLyogMHg1MDAwLTB4NUZGRjogTElEICovCi0JCQkvKiB3ZSBkb24ndCBoYW5kbGUgaXQgdGhyb3VnaCB0aGlzIHBhdGgsIGp1c3QKLQkJCSAqIGVhdCB1cCBrbm93biBMSUQgZXZlbnRzICovCi0JCQlpZiAoaGtleSAhPSAweDUwMDEgJiYgaGtleSAhPSAweDUwMDIpIHsKLQkJCQlwcmludGsoSUJNX0VSUgotCQkJCSAgICAgICAidW5rbm93biBMSUQtcmVsYXRlZCBIS0VZIGV2ZW50OiAweCUwNHhcbiIsCi0JCQkJICAgICAgIGhrZXkpOwotCQkJCXNlbmRfYWNwaV9ldiA9IDE7Ci0JCQl9IGVsc2UgeworCQkJLyogMHg1MDAwLTB4NUZGRjogaHVtYW4gaW50ZXJmYWNlIGhlbHBlcnMgKi8KKwkJCXN3aXRjaCAoaGtleSkgeworCQkJY2FzZSAweDUwMTA6IC8qIExlbm92byBuZXcgQklPUzogYnJpZ2h0bmVzcyBjaGFuZ2VkICovCisJCQljYXNlIDB4NTAwOTogLyogWDYxdDogc3dpdmVsIHVwICh0YWJsZXQgbW9kZSkgKi8KKwkJCWNhc2UgMHg1MDBhOiAvKiBYNjF0OiBzd2l2ZWwgZG93biAobm9ybWFsIG1vZGUpICovCisJCQljYXNlIDB4NTAwYjogLyogWDYxdDogdGFibGV0IHBlbiBpbnNlcnRlZCBpbnRvIGJheSAqLworCQkJY2FzZSAweDUwMGM6IC8qIFg2MXQ6IHRhYmxldCBwZW4gcmVtb3ZlZCBmcm9tIGJheSAqLworCQkJCWJyZWFrOworCQkJY2FzZSAweDUwMDE6CisJCQljYXNlIDB4NTAwMjoKKwkJCQkvKiBMSUQgc3dpdGNoIGV2ZW50cy4gIERvIG5vdCBwcm9wYWdhdGUgKi8KIAkJCQlpZ25vcmVfYWNwaV9ldiA9IDE7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXVua19ldiA9IDE7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSA3OgogCQkJLyogMHg3MDAwLTB4N0ZGRjogbWlzYyAqLwogCQkJaWYgKHRwX2ZlYXR1cmVzLmhvdGtleV93bHN3ICYmIGhrZXkgPT0gMHg3MDAwKSB7CiAJCQkJdHBhY3BpX2lucHV0X3NlbmRfcmFkaW9zdygpOworCQkJCWhvdGtleV9yYWRpb19zd19ub3RpZnlfY2hhbmdlKCk7CisJCQkJc2VuZF9hY3BpX2V2ID0gMDsKIAkJCQlicmVhazsKIAkJCX0KIAkJCS8qIGZhbGx0aHJvdWdoIHRvIGRlZmF1bHQgKi8KIAkJZGVmYXVsdDoKLQkJCS8qIGNhc2UgMjogZG9jay1yZWxhdGVkICovCi0JCQkvKgkweDIzMDUgLSBUNDMgd2FraW5nIHVwIGR1ZSB0byBiYXkgbGV2ZXIgZWplY3Qgd2hpbGUgYXNsZXB0ICovCi0JCQkvKiBjYXNlIDM6IHVsdHJhLWJheSByZWxhdGVkLiBtYXliZSBiYXkgaW4gZG9jaz8gKi8KLQkJCS8qCTB4MzAwMyAtIFQ0MyBhZnRlciB3YWtlIHVwIGJ5IGJheSBsZXZlciBlamVjdCAoMHgyMzA1KSAqLwotCQkJcHJpbnRrKElCTV9OT1RJQ0UgInVuaGFuZGxlZCBIS0VZIGV2ZW50IDB4JTA0eFxuIiwgaGtleSk7Ci0JCQlzZW5kX2FjcGlfZXYgPSAxOworCQkJdW5rX2V2ID0gMTsKKwkJfQorCQlpZiAodW5rX2V2KSB7CisJCQlwcmludGsoVFBBQ1BJX05PVElDRQorCQkJICAgICAgICJ1bmhhbmRsZWQgSEtFWSBldmVudCAweCUwNHhcbiIsIGhrZXkpOwogCQl9CiAKIAkJLyogTGVnYWN5IGV2ZW50cyAqLwotCQlpZiAoIWlnbm9yZV9hY3BpX2V2ICYmIChzZW5kX2FjcGlfZXYgfHwgaG90a2V5X3JlcG9ydF9tb2RlIDwgMikpIHsKLQkJCWFjcGlfYnVzX2dlbmVyYXRlX3Byb2NfZXZlbnQoaWJtLT5hY3BpLT5kZXZpY2UsIGV2ZW50LCBoa2V5KTsKKwkJaWYgKCFpZ25vcmVfYWNwaV9ldiAmJgorCQkgICAgKHNlbmRfYWNwaV9ldiB8fCBob3RrZXlfcmVwb3J0X21vZGUgPCAyKSkgeworCQkJYWNwaV9idXNfZ2VuZXJhdGVfcHJvY19ldmVudChpYm0tPmFjcGktPmRldmljZSwKKwkJCQkJCSAgICAgZXZlbnQsIGhrZXkpOwogCQl9CiAKIAkJLyogbmV0bGluayBldmVudHMgKi8KIAkJaWYgKCFpZ25vcmVfYWNwaV9ldiAmJiBzZW5kX2FjcGlfZXYpIHsKLQkJCWFjcGlfYnVzX2dlbmVyYXRlX25ldGxpbmtfZXZlbnQoaWJtLT5hY3BpLT5kZXZpY2UtPnBucC5kZXZpY2VfY2xhc3MsCi0JCQkJCQkJaWJtLT5hY3BpLT5kZXZpY2UtPmRldi5idXNfaWQsCi0JCQkJCQkJZXZlbnQsIGhrZXkpOworCQkJYWNwaV9idXNfZ2VuZXJhdGVfbmV0bGlua19ldmVudCgKKwkJCQkJaWJtLT5hY3BpLT5kZXZpY2UtPnBucC5kZXZpY2VfY2xhc3MsCisJCQkJCWlibS0+YWNwaS0+ZGV2aWNlLT5kZXYuYnVzX2lkLAorCQkJCQlldmVudCwgaGtleSk7CiAJCX0KIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGhvdGtleV9zdXNwZW5kKHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwkvKiBEbyB0aGVzZSBvbiBzdXNwZW5kLCB3ZSBnZXQgdGhlIGV2ZW50cyBvbiBlYXJseSByZXN1bWUhICovCisJaG90a2V5X3dha2V1cF9yZWFzb24gPSBUUF9BQ1BJX1dBS0VVUF9OT05FOworCWhvdGtleV9hdXRvc2xlZXBfYWNrID0gMDsKK30KKwogc3RhdGljIHZvaWQgaG90a2V5X3Jlc3VtZSh2b2lkKQogeworCWlmIChob3RrZXlfbWFza19nZXQoKSkKKwkJcHJpbnRrKFRQQUNQSV9FUlIKKwkJICAgICAgICJlcnJvciB3aGlsZSB0cnlpbmcgdG8gcmVhZCBob3Qga2V5IG1hc2sgIgorCQkgICAgICAgImZyb20gZmlybXdhcmVcbiIpOwogCXRwYWNwaV9pbnB1dF9zZW5kX3JhZGlvc3coKTsKLX0KLQotLyoKLSAqIENhbGwgd2l0aCBob3RrZXlfbXV0ZXggaGVsZAotICovCi1zdGF0aWMgaW50IGhvdGtleV9nZXQoaW50ICpzdGF0dXMsIHUzMiAqbWFzaykKLXsKLQlpZiAoIWFjcGlfZXZhbGYoaGtleV9oYW5kbGUsIHN0YXR1cywgIkRIS0MiLCAiZCIpKQotCQlyZXR1cm4gLUVJTzsKLQotCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfbWFzaykKLQkJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCBtYXNrLCAiREhLTiIsICJkIikpCi0JCQlyZXR1cm4gLUVJTzsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogQ2FsbCB3aXRoIGhvdGtleV9tdXRleCBoZWxkCi0gKi8KLXN0YXRpYyBpbnQgaG90a2V5X3NldChpbnQgc3RhdHVzLCB1MzIgbWFzaykKLXsKLQlpbnQgaTsKLQotCWlmICghYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgTlVMTCwgIk1IS0MiLCAidmQiLCBzdGF0dXMpKQotCQlyZXR1cm4gLUVJTzsKLQotCWlmICh0cF9mZWF0dXJlcy5ob3RrZXlfbWFzaykKLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkJCWludCBiaXQgPSAoKDEgPDwgaSkgJiBtYXNrKSAhPSAwOwotCQkJaWYgKCFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLAotCQkJCQlOVUxMLCAiTUhLTSIsICJ2ZGQiLCBpICsgMSwgYml0KSkKLQkJCQlyZXR1cm4gLUVJTzsKLQkJfQotCi0JcmV0dXJuIDA7CisJaG90a2V5X3JhZGlvX3N3X25vdGlmeV9jaGFuZ2UoKTsKKwlob3RrZXlfd2FrZXVwX3JlYXNvbl9ub3RpZnlfY2hhbmdlKCk7CisJaG90a2V5X3dha2V1cF9ob3R1bnBsdWdfY29tcGxldGVfbm90aWZ5X2NoYW5nZSgpOworI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0hPVEtFWV9QT0xMCisJaG90a2V5X3BvbGxfc2V0dXBfc2FmZSgwKTsKKyNlbmRpZgogfQogCiAvKiBwcm9jZnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBpbnQgaG90a2V5X3JlYWQoY2hhciAqcCkKIHsKIAlpbnQgcmVzLCBzdGF0dXM7Ci0JdTMyIG1hc2s7CiAJaW50IGxlbiA9IDA7CiAKIAlpZiAoIXRwX2ZlYXR1cmVzLmhvdGtleSkgewpAQCAtMTM0NCwxNCArMjIzOSwxNiBAQAogCiAJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmaG90a2V5X211dGV4KSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQlyZXMgPSBob3RrZXlfZ2V0KCZzdGF0dXMsICZtYXNrKTsKKwlyZXMgPSBob3RrZXlfc3RhdHVzX2dldCgmc3RhdHVzKTsKKwlpZiAoIXJlcykKKwkJcmVzID0gaG90a2V5X21hc2tfZ2V0KCk7CiAJbXV0ZXhfdW5sb2NrKCZob3RrZXlfbXV0ZXgpOwogCWlmIChyZXMpCiAJCXJldHVybiByZXM7CiAKIAlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHQlc1xuIiwgZW5hYmxlZChzdGF0dXMsIDApKTsKIAlpZiAodHBfZmVhdHVyZXMuaG90a2V5X21hc2spIHsKLQkJbGVuICs9IHNwcmludGYocCArIGxlbiwgIm1hc2s6XHRcdDB4JTA4eFxuIiwgbWFzayk7CisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJtYXNrOlx0XHQweCUwOHhcbiIsIGhvdGtleV9tYXNrKTsKIAkJbGVuICs9IHNwcmludGYocCArIGxlbiwKIAkJCSAgICAgICAiY29tbWFuZHM6XHRlbmFibGUsIGRpc2FibGUsIHJlc2V0LCA8bWFzaz5cbiIpOwogCX0gZWxzZSB7CkBAIC0xMzY3LDcgKzIyNjQsNiBAQAogCWludCByZXMsIHN0YXR1czsKIAl1MzIgbWFzazsKIAljaGFyICpjbWQ7Ci0JaW50IGRvX2NtZCA9IDA7CiAKIAlpZiAoIXRwX2ZlYXR1cmVzLmhvdGtleSkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0xMzc1LDkgKzIyNzEsOCBAQAogCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmhvdGtleV9tdXRleCkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKLQlyZXMgPSBob3RrZXlfZ2V0KCZzdGF0dXMsICZtYXNrKTsKLQlpZiAocmVzKQotCQlnb3RvIGVycmV4aXQ7CisJc3RhdHVzID0gLTE7CisJbWFzayA9IGhvdGtleV9tYXNrOwogCiAJcmVzID0gMDsKIAl3aGlsZSAoKGNtZCA9IG5leHRfY21kKCZidWYpKSkgewpAQCAtMTM5NiwxMSArMjI5MSwxMiBAQAogCQkJcmVzID0gLUVJTlZBTDsKIAkJCWdvdG8gZXJyZXhpdDsKIAkJfQotCQlkb19jbWQgPSAxOwogCX0KKwlpZiAoc3RhdHVzICE9IC0xKQorCQlyZXMgPSBob3RrZXlfc3RhdHVzX3NldChzdGF0dXMpOwogCi0JaWYgKGRvX2NtZCkKLQkJcmVzID0gaG90a2V5X3NldChzdGF0dXMsIG1hc2spOworCWlmICghcmVzICYmIG1hc2sgIT0gaG90a2V5X21hc2spCisJCXJlcyA9IGhvdGtleV9tYXNrX3NldChtYXNrKTsKIAogZXJyZXhpdDoKIAltdXRleF91bmxvY2soJmhvdGtleV9tdXRleCk7CkBAIC0xNDA4LDcgKzIzMDQsNyBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGlibV9odGtfZGV2aWNlX2lkc1tdID0gewotCXtJQk1fSEtFWV9ISUQsIDB9LAorCXtUUEFDUElfQUNQSV9IS0VZX0hJRCwgMH0sCiAJeyIiLCAwfSwKIH07CiAKQEAgLTE0MjUsNiArMjMyMSw3IEBACiAJLndyaXRlID0gaG90a2V5X3dyaXRlLAogCS5leGl0ID0gaG90a2V5X2V4aXQsCiAJLnJlc3VtZSA9IGhvdGtleV9yZXN1bWUsCisJLnN1c3BlbmQgPSBob3RrZXlfc3VzcGVuZCwKIAkuYWNwaSA9ICZpYm1faG90a2V5X2FjcGlkcml2ZXIsCiB9OwogCkBAIC0xNDMyLDYgKzIzMjksMTYgQEAKICAqIEJsdWV0b290aCBzdWJkcml2ZXIKICAqLwogCitlbnVtIHsKKwkvKiBBQ1BJIEdCREMvU0JEQyBiaXRzICovCisJVFBfQUNQSV9CTFVFVE9PVEhfSFdQUkVTRU5UCT0gMHgwMSwJLyogQmx1ZXRvb3RoIGh3IGF2YWlsYWJsZSAqLworCVRQX0FDUElfQkxVRVRPT1RIX1JBRElPU1NXCT0gMHgwMiwJLyogQmx1ZXRvb3RoIHJhZGlvIGVuYWJsZWQgKi8KKwlUUF9BQ1BJX0JMVUVUT09USF9VTksJCT0gMHgwNCwJLyogdW5rbm93biBmdW5jdGlvbiAqLworfTsKKworc3RhdGljIGludCBibHVldG9vdGhfZ2V0X3JhZGlvc3codm9pZCk7CitzdGF0aWMgaW50IGJsdWV0b290aF9zZXRfcmFkaW9zdyhpbnQgcmFkaW9fb24pOworCiAvKiBzeXNmcyBibHVldG9vdGggZW5hYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBzc2l6ZV90IGJsdWV0b290aF9lbmFibGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKQEAgLTE0ODMsNyArMjM5MCw3IEBACiAKIAl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJpbml0aWFsaXppbmcgYmx1ZXRvb3RoIHN1YmRyaXZlclxuIik7CiAKLQlJQk1fQUNQSUhBTkRMRV9JTklUKGhrZXkpOworCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQoaGtleSk7CiAKIAkvKiBibHVldG9vdGggbm90IHN1cHBvcnRlZCBvbiA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCwgQTIxZSwgQTJ4bS9wLAogCSAgIEc0eCwgUjMwLCBSMzEsIFI0MGUsIFI1MGUsIFQyMC0yMiwgWDIwLTIxICovCkBAIC0xNTk2LDYgKzI1MDMsMTYgQEAKICAqIFdhbiBzdWJkcml2ZXIKICAqLwogCitlbnVtIHsKKwkvKiBBQ1BJIEdXQU4vU1dBTiBiaXRzICovCisJVFBfQUNQSV9XQU5DQVJEX0hXUFJFU0VOVAk9IDB4MDEsCS8qIFdhbiBodyBhdmFpbGFibGUgKi8KKwlUUF9BQ1BJX1dBTkNBUkRfUkFESU9TU1cJPSAweDAyLAkvKiBXYW4gcmFkaW8gZW5hYmxlZCAqLworCVRQX0FDUElfV0FOQ0FSRF9VTksJCT0gMHgwNCwJLyogdW5rbm93biBmdW5jdGlvbiAqLworfTsKKworc3RhdGljIGludCB3YW5fZ2V0X3JhZGlvc3codm9pZCk7CitzdGF0aWMgaW50IHdhbl9zZXRfcmFkaW9zdyhpbnQgcmFkaW9fb24pOworCiAvKiBzeXNmcyB3YW4gZW5hYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBzc2l6ZV90IHdhbl9lbmFibGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKQEAgLTE2NDcsNyArMjU2NCw3IEBACiAKIAl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJpbml0aWFsaXppbmcgd2FuIHN1YmRyaXZlclxuIik7CiAKLQlJQk1fQUNQSUhBTkRMRV9JTklUKGhrZXkpOworCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQoaGtleSk7CiAKIAl0cF9mZWF0dXJlcy53YW4gPSBoa2V5X2hhbmRsZSAmJgogCSAgICBhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCAmc3RhdHVzLCAiR1dBTiIsICJxZCIpOwpAQCAtMTc1OSwxNyArMjY3Niw0MSBAQAogICogVmlkZW8gc3ViZHJpdmVyCiAgKi8KIAorZW51bSB2aWRlb19hY2Nlc3NfbW9kZSB7CisJVFBBQ1BJX1ZJREVPX05PTkUgPSAwLAorCVRQQUNQSV9WSURFT181NzAsCS8qIDU3MCAqLworCVRQQUNQSV9WSURFT183NzAsCS8qIDYwMGUveCwgNzcwZSwgNzcweCAqLworCVRQQUNQSV9WSURFT19ORVcsCS8qIGFsbCBvdGhlcnMgKi8KK307CisKK2VudW0gewkvKiB2aWRlbyBzdGF0dXMgZmxhZ3MsIGJhc2VkIG9uIFZJREVPXzU3MCAqLworCVRQX0FDUElfVklERU9fU19MQ0QgPSAweDAxLAkvKiBMQ0Qgb3V0cHV0IGVuYWJsZWQgKi8KKwlUUF9BQ1BJX1ZJREVPX1NfQ1JUID0gMHgwMiwJLyogQ1JUIG91dHB1dCBlbmFibGVkICovCisJVFBfQUNQSV9WSURFT19TX0RWSSA9IDB4MDgsCS8qIERWSSBvdXRwdXQgZW5hYmxlZCAqLworfTsKKworZW51bSB7ICAvKiBUUEFDUElfVklERU9fNTcwIGNvbnN0YW50cyAqLworCVRQX0FDUElfVklERU9fNTcwX1BIU0NNRCA9IDB4ODcsCS8qIHVua25vd24gbWFnaWMgY29uc3RhbnQgOiggKi8KKwlUUF9BQ1BJX1ZJREVPXzU3MF9QSFNNQVNLID0gMHgwMywJLyogUEhTIGJpdHMgdGhhdCBtYXAgdG8KKwkJCQkJCSAqIHZpZGVvX3N0YXR1c19mbGFncyAqLworCVRQX0FDUElfVklERU9fNTcwX1BIUzJDTUQgPSAweDhiLAkvKiB1bmtub3duIG1hZ2ljIGNvbnN0YW50IDooICovCisJVFBfQUNQSV9WSURFT181NzBfUEhTMlNFVCA9IDB4ODAsCS8qIHVua25vd24gbWFnaWMgY29uc3RhbnQgOiggKi8KK307CisKIHN0YXRpYyBlbnVtIHZpZGVvX2FjY2Vzc19tb2RlIHZpZGVvX3N1cHBvcnRlZDsKIHN0YXRpYyBpbnQgdmlkZW9fb3JpZ19hdXRvc3c7CiAKLUlCTV9IQU5ETEUodmlkLCByb290LCAiXFxfU0IuUENJLkFHUC5WR0EiLAkvKiA1NzAgKi8KK3N0YXRpYyBpbnQgdmlkZW9fYXV0b3N3X2dldCh2b2lkKTsKK3N0YXRpYyBpbnQgdmlkZW9fYXV0b3N3X3NldChpbnQgZW5hYmxlKTsKKworVFBBQ1BJX0hBTkRMRSh2aWQsIHJvb3QsICJcXF9TQi5QQ0kuQUdQLlZHQSIsCS8qIDU3MCAqLwogCSAgICJcXF9TQi5QQ0kwLkFHUDAuVklEMCIsCS8qIDYwMGUveCwgNzcweCAqLwogCSAgICJcXF9TQi5QQ0kwLlZJRDAiLAkvKiA3NzBlICovCiAJICAgIlxcX1NCLlBDSTAuVklEIiwJLyogQTIxZSwgRzR4LCBSNTBlLCBYMzAsIFg0MCAqLwogCSAgICJcXF9TQi5QQ0kwLkFHUC5WSUQiLAkvKiBhbGwgb3RoZXJzICovCiAJICAgKTsJCQkJLyogUjMwLCBSMzEgKi8KIAotSUJNX0hBTkRMRSh2aWQyLCByb290LCAiXFxfU0IuUENJMC5BR1BCLlZJRCIpOwkvKiBHNDEgKi8KK1RQQUNQSV9IQU5ETEUodmlkMiwgcm9vdCwgIlxcX1NCLlBDSTAuQUdQQi5WSUQiKTsJLyogRzQxICovCiAKIHN0YXRpYyBpbnQgX19pbml0IHZpZGVvX2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSkKIHsKQEAgLTE3NzcsOCArMjcxOCw4IEBACiAKIAl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJpbml0aWFsaXppbmcgdmlkZW8gc3ViZHJpdmVyXG4iKTsKIAotCUlCTV9BQ1BJSEFORExFX0lOSVQodmlkKTsKLQlJQk1fQUNQSUhBTkRMRV9JTklUKHZpZDIpOworCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQodmlkKTsKKwlUUEFDUElfQUNQSUhBTkRMRV9JTklUKHZpZDIpOwogCiAJaWYgKHZpZDJfaGFuZGxlICYmIGFjcGlfZXZhbGYoTlVMTCwgJml2Z2EsICJcXElWR0EiLCAiZCIpICYmIGl2Z2EpCiAJCS8qIEc0MSwgYXNzdW1lIElWR0EgZG9lc24ndCBjaGFuZ2UgKi8KQEAgLTE4MDksNyArMjc1MCw3IEBACiAJZGJnX3ByaW50ayhUUEFDUElfREJHX0VYSVQsCiAJCSAgICJyZXN0b3Jpbmcgb3JpZ2luYWwgdmlkZW8gYXV0b3N3aXRjaCBtb2RlXG4iKTsKIAlpZiAodmlkZW9fYXV0b3N3X3NldCh2aWRlb19vcmlnX2F1dG9zdykpCi0JCXByaW50ayhJQk1fRVJSICJlcnJvciB3aGlsZSB0cnlpbmcgdG8gcmVzdG9yZSBvcmlnaW5hbCAiCisJCXByaW50ayhUUEFDUElfRVJSICJlcnJvciB3aGlsZSB0cnlpbmcgdG8gcmVzdG9yZSBvcmlnaW5hbCAiCiAJCQkidmlkZW8gYXV0b3N3aXRjaCBtb2RlXG4iKTsKIH0KIApAQCAtMTg4MiwxMyArMjgyMywxNCBAQAogCQlyZXMgPSBhY3BpX2V2YWxmKHZpZF9oYW5kbGUsIE5VTEwsCiAJCQkJICJBU1dUIiwgInZkZCIsIHN0YXR1cyAqIDB4MTAwLCAwKTsKIAkJaWYgKCFhdXRvc3cgJiYgdmlkZW9fYXV0b3N3X3NldChhdXRvc3cpKSB7Ci0JCQlwcmludGsoSUJNX0VSUiAidmlkZW8gYXV0by1zd2l0Y2ggbGVmdCBlbmFibGVkIGR1ZSB0byBlcnJvclxuIik7CisJCQlwcmludGsoVFBBQ1BJX0VSUgorCQkJICAgICAgICJ2aWRlbyBhdXRvLXN3aXRjaCBsZWZ0IGVuYWJsZWQgZHVlIHRvIGVycm9yXG4iKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgVFBBQ1BJX1ZJREVPX05FVzoKIAkJcmVzID0gYWNwaV9ldmFsZihOVUxMLCBOVUxMLCAiXFxWVVBTIiwgInZkIiwgMHg4MCkgJiYKLQkJCWFjcGlfZXZhbGYoTlVMTCwgTlVMTCwgIlxcVlNEUyIsICJ2ZGQiLCBzdGF0dXMsIDEpOworCQkgICAgICBhY3BpX2V2YWxmKE5VTEwsIE5VTEwsICJcXFZTRFMiLCAidmRkIiwgc3RhdHVzLCAxKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9TWVM7CkBAIC0xOTUxLDcgKzI4OTMsOCBAQAogCQlyZXR1cm4gLUVOT1NZUzsKIAl9CiAJaWYgKCFhdXRvc3cgJiYgdmlkZW9fYXV0b3N3X3NldChhdXRvc3cpKSB7Ci0JCXByaW50ayhJQk1fRVJSICJ2aWRlbyBhdXRvLXN3aXRjaCBsZWZ0IGVuYWJsZWQgZHVlIHRvIGVycm9yXG4iKTsKKwkJcHJpbnRrKFRQQUNQSV9FUlIKKwkJICAgICAgICJ2aWRlbyBhdXRvLXN3aXRjaCBsZWZ0IGVuYWJsZWQgZHVlIHRvIGVycm9yXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0yMDgwLDE2ICszMDIzLDE2IEBACiAgKiBMaWdodCAodGhpbmtsaWdodCkgc3ViZHJpdmVyCiAgKi8KIAotSUJNX0hBTkRMRShsZ2h0LCByb290LCAiXFxMR0hUIik7CS8qIEEyMWUsIEEyeG0vcCwgVDIwLTIyLCBYMjAtMjEgKi8KLUlCTV9IQU5ETEUobGVkYiwgZWMsICJMRURCIik7CQkvKiBHNHggKi8KK1RQQUNQSV9IQU5ETEUobGdodCwgcm9vdCwgIlxcTEdIVCIpOwkvKiBBMjFlLCBBMnhtL3AsIFQyMC0yMiwgWDIwLTIxICovCitUUEFDUElfSEFORExFKGxlZGIsIGVjLCAiTEVEQiIpOwkJLyogRzR4ICovCiAKIHN0YXRpYyBpbnQgX19pbml0IGxpZ2h0X2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSkKIHsKIAl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJpbml0aWFsaXppbmcgbGlnaHQgc3ViZHJpdmVyXG4iKTsKIAotCUlCTV9BQ1BJSEFORExFX0lOSVQobGVkYik7Ci0JSUJNX0FDUElIQU5ETEVfSU5JVChsZ2h0KTsKLQlJQk1fQUNQSUhBTkRMRV9JTklUKGNtb3MpOworCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQobGVkYik7CisJVFBBQ1BJX0FDUElIQU5ETEVfSU5JVChsZ2h0KTsKKwlUUEFDUElfQUNQSUhBTkRMRV9JTklUKGNtb3MpOwogCiAJLyogbGlnaHQgbm90IHN1cHBvcnRlZCBvbiA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCwgRzR4LCBSMzAsIFIzMSAqLwogCXRwX2ZlYXR1cmVzLmxpZ2h0ID0gKGNtb3NfaGFuZGxlIHx8IGxnaHRfaGFuZGxlKSAmJiAhbGVkYl9oYW5kbGU7CkBAIC0yMTY3LDE0ICszMTEwLDE4IEBACiAKICNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9ET0NLCiAKLUlCTV9IQU5ETEUoZG9jaywgcm9vdCwgIlxcX1NCLkdEQ0siLAkvKiBYMzAsIFgzMSwgWDQwICovCitzdGF0aWMgdm9pZCBkb2NrX25vdGlmeShzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCB1MzIgZXZlbnQpOworc3RhdGljIGludCBkb2NrX3JlYWQoY2hhciAqcCk7CitzdGF0aWMgaW50IGRvY2tfd3JpdGUoY2hhciAqYnVmKTsKKworVFBBQ1BJX0hBTkRMRShkb2NrLCByb290LCAiXFxfU0IuR0RDSyIsCS8qIFgzMCwgWDMxLCBYNDAgKi8KIAkgICAiXFxfU0IuUENJMC5ET0NLIiwJLyogNjAwZS94LDc3MGUsNzcweCxBMnhtL3AsVDIwLTIyLFgyMC0yMSAqLwogCSAgICJcXF9TQi5QQ0kwLlBDSTEuRE9DSyIsCS8qIGFsbCBvdGhlcnMgKi8KIAkgICAiXFxfU0IuUENJLklTQS5TTENFIiwJLyogNTcwICovCiAgICAgKTsJCQkJLyogQTIxZSxHNHgsUjMwLFIzMSxSMzIsUjQwLFI0MGUsUjUwZSAqLwogCiAvKiBkb24ndCBsaXN0IG90aGVyIGFsdGVybmF0aXZlcyBhcyB3ZSBpbnN0YWxsIGEgbm90aWZ5IGhhbmRsZXIgb24gdGhlIDU3MCAqLwotSUJNX0hBTkRMRShwY2ksIHJvb3QsICJcXF9TQi5QQ0kiKTsJLyogNTcwICovCitUUEFDUElfSEFORExFKHBjaSwgcm9vdCwgIlxcX1NCLlBDSSIpOwkvKiA1NzAgKi8KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCBpYm1fcGNpX2RldmljZV9pZHNbXSA9IHsKIAl7UENJX1JPT1RfSElEX1NUUklORywgMH0sCkBAIC0yMjE3LDcgKzMxNjQsNyBAQAogewogCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgImluaXRpYWxpemluZyBkb2NrIHN1YmRyaXZlclxuIik7CiAKLQlJQk1fQUNQSUhBTkRMRV9JTklUKGRvY2spOworCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQoZG9jayk7CiAKIAl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJkb2NrIGlzICVzXG4iLAogCQlzdHJfc3VwcG9ydGVkKGRvY2tfaGFuZGxlICE9IE5VTEwpKTsKQEAgLTIyMzMsNyArMzE4MCw3IEBACiAKIAlpZiAoZG9ja19kcml2ZXJfZGF0YVswXS5mbGFncy5hY3BpX2RyaXZlcl9yZWdpc3RlcmVkICYmCiAJICAgIGRvY2tfZHJpdmVyX2RhdGFbMF0uZmxhZ3MuYWNwaV9ub3RpZnlfaW5zdGFsbGVkKSB7Ci0JCUlCTV9BQ1BJSEFORExFX0lOSVQocGNpKTsKKwkJVFBBQ1BJX0FDUElIQU5ETEVfSU5JVChwY2kpOwogCQlkb2NrMl9uZWVkZWQgPSAocGNpX2hhbmRsZSAhPSBOVUxMKTsKIAkJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULAogCQkJICAgICJkb2NrIFBDSSBoYW5kbGVyIGZvciB0aGUgVFAgNTcwIGlzICVzXG4iLApAQCAtMjI2NSw3ICszMjEyLDcgQEAKIAllbHNlIGlmIChldmVudCA9PSAwICYmIGRvY2tlZCkKIAkJZGF0YSA9IDM7CS8qIGRvY2sgKi8KIAllbHNlIHsKLQkJcHJpbnRrKElCTV9FUlIgInVua25vd24gZG9jayBldmVudCAlZCwgc3RhdHVzICVkXG4iLAorCQlwcmludGsoVFBBQ1BJX0VSUiAidW5rbm93biBkb2NrIGV2ZW50ICVkLCBzdGF0dXMgJWRcbiIsCiAJCSAgICAgICBldmVudCwgX3N0YShkb2NrX2hhbmRsZSkpOwogCQlkYXRhID0gMDsJLyogdW5rbm93biAqLwogCX0KQEAgLTIzMjEsMTggKzMyNjgsMTkgQEAKICAqLwogCiAjaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfQkFZCi1JQk1fSEFORExFKGJheSwgcm9vdCwgIlxcX1NCLlBDSS5JREUuU0VDTi5NQVNUIiwJLyogNTcwICovCisKK1RQQUNQSV9IQU5ETEUoYmF5LCByb290LCAiXFxfU0IuUENJLklERS5TRUNOLk1BU1QiLAkvKiA1NzAgKi8KIAkgICAiXFxfU0IuUENJMC5JREUwLklERVMuSURTTSIsCS8qIDYwMGUveCwgNzcwZSwgNzcweCAqLwogCSAgICJcXF9TQi5QQ0kwLlNBVEEuU0NORC5NU1RSIiwJLyogVDYwLCBYNjAsIFo2MCAqLwogCSAgICJcXF9TQi5QQ0kwLklERTAuU0NORC5NU1RSIiwJLyogYWxsIG90aGVycyAqLwogCSAgICk7CQkJCS8qIEEyMWUsIFIzMCwgUjMxICovCi1JQk1fSEFORExFKGJheV9laiwgYmF5LCAiX0VKMyIsCS8qIDYwMGUveCwgQTJ4bS9wLCBBM3ggKi8KK1RQQUNQSV9IQU5ETEUoYmF5X2VqLCBiYXksICJfRUozIiwJLyogNjAwZS94LCBBMnhtL3AsIEEzeCAqLwogCSAgICJfRUowIiwJCS8qIGFsbCBvdGhlcnMgKi8KIAkgICApOwkJCS8qIDU3MCxBMjFlLEc0eCxSMzAsUjMxLFIzMixSNDBlLFI1MGUgKi8KLUlCTV9IQU5ETEUoYmF5Miwgcm9vdCwgIlxcX1NCLlBDSTAuSURFMC5QUklNLlNMQVYiLAkvKiBBM3gsIFIzMiAqLworVFBBQ1BJX0hBTkRMRShiYXkyLCByb290LCAiXFxfU0IuUENJMC5JREUwLlBSSU0uU0xBViIsCS8qIEEzeCwgUjMyICovCiAJICAgIlxcX1NCLlBDSTAuSURFMC5JREVQLklEUFMiLAkvKiA2MDBlL3gsIDc3MGUsIDc3MHggKi8KIAkgICApOwkJCQkvKiBhbGwgb3RoZXJzICovCi1JQk1fSEFORExFKGJheTJfZWosIGJheTIsICJfRUozIiwJLyogNjAwZS94LCA3NzBlLCBBM3ggKi8KK1RQQUNQSV9IQU5ETEUoYmF5Ml9laiwgYmF5MiwgIl9FSjMiLAkvKiA2MDBlL3gsIDc3MGUsIEEzeCAqLwogCSAgICJfRUowIiwJCQkvKiA3NzB4ICovCiAJICAgKTsJCQkJLyogYWxsIG90aGVycyAqLwogCkBAIC0yMzQwLDEyICszMjg4LDEyIEBACiB7CiAJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiaW5pdGlhbGl6aW5nIGJheSBzdWJkcml2ZXJcbiIpOwogCi0JSUJNX0FDUElIQU5ETEVfSU5JVChiYXkpOworCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQoYmF5KTsKIAlpZiAoYmF5X2hhbmRsZSkKLQkJSUJNX0FDUElIQU5ETEVfSU5JVChiYXlfZWopOwotCUlCTV9BQ1BJSEFORExFX0lOSVQoYmF5Mik7CisJCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQoYmF5X2VqKTsKKwlUUEFDUElfQUNQSUhBTkRMRV9JTklUKGJheTIpOwogCWlmIChiYXkyX2hhbmRsZSkKLQkJSUJNX0FDUElIQU5ETEVfSU5JVChiYXkyX2VqKTsKKwkJVFBBQ1BJX0FDUElIQU5ETEVfSU5JVChiYXkyX2VqKTsKIAogCXRwX2ZlYXR1cmVzLmJheV9zdGF0dXMgPSBiYXlfaGFuZGxlICYmCiAJCWFjcGlfZXZhbGYoYmF5X2hhbmRsZSwgTlVMTCwgIl9TVEEiLCAicXYiKTsKQEAgLTI0NzQsNyArMzQyMiw3IEBACiAJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULAogCQkiaW5pdGlhbGl6aW5nIGNtb3MgY29tbWFuZHMgc3ViZHJpdmVyXG4iKTsKIAotCUlCTV9BQ1BJSEFORExFX0lOSVQoY21vcyk7CisJVFBBQ1BJX0FDUElIQU5ETEVfSU5JVChjbW9zKTsKIAogCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgImNtb3MgY29tbWFuZHMgYXJlICVzXG4iLAogCQlzdHJfc3VwcG9ydGVkKGNtb3NfaGFuZGxlICE9IE5VTEwpKTsKQEAgLTI1MzgsMTAgKzM0ODYsMjQgQEAKICAqIExFRCBzdWJkcml2ZXIKICAqLwogCitlbnVtIGxlZF9hY2Nlc3NfbW9kZSB7CisJVFBBQ1BJX0xFRF9OT05FID0gMCwKKwlUUEFDUElfTEVEXzU3MCwJLyogNTcwICovCisJVFBBQ1BJX0xFRF9PTEQsCS8qIDYwMGUveCwgNzcwZSwgNzcweCwgQTIxZSwgQTJ4bS9wLCBUMjAtMjIsIFgyMC0yMSAqLworCVRQQUNQSV9MRURfTkVXLAkvKiBhbGwgb3RoZXJzICovCit9OworCitlbnVtIHsJLyogRm9yIFRQQUNQSV9MRURfT0xEICovCisJVFBBQ1BJX0xFRF9FQ19ITENMID0gMHgwYywJLyogRUMgcmVnIHRvIGdldCBsZWQgdG8gcG93ZXIgb24gKi8KKwlUUEFDUElfTEVEX0VDX0hMQkwgPSAweDBkLAkvKiBFQyByZWcgdG8gYmxpbmsgYSBsaXQgbGVkICovCisJVFBBQ1BJX0xFRF9FQ19ITE1TID0gMHgwZSwJLyogRUMgcmVnIHRvIHNlbGVjdCBsZWQgdG8gY29tbWFuZCAqLworfTsKKwogc3RhdGljIGVudW0gbGVkX2FjY2Vzc19tb2RlIGxlZF9zdXBwb3J0ZWQ7CiAKLUlCTV9IQU5ETEUobGVkLCBlYywgIlNMRUQiLAkvKiA1NzAgKi8KLQkgICAiU1lTTCIsCQkvKiA2MDBlL3gsIDc3MGUsIDc3MHgsIEEyMWUsIEEyeG0vcCwgVDIwLTIyLCBYMjAtMjEgKi8KK1RQQUNQSV9IQU5ETEUobGVkLCBlYywgIlNMRUQiLAkvKiA1NzAgKi8KKwkgICAiU1lTTCIsCQkvKiA2MDBlL3gsIDc3MGUsIDc3MHgsIEEyMWUsIEEyeG0vcCwgKi8KKwkJCQkvKiBUMjAtMjIsIFgyMC0yMSAqLwogCSAgICJMRUQiLAkJLyogYWxsIG90aGVycyAqLwogCSAgICk7CQkJLyogUjMwLCBSMzEgKi8KIApAQCAtMjU0OSw3ICszNTExLDcgQEAKIHsKIAl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJpbml0aWFsaXppbmcgTEVEIHN1YmRyaXZlclxuIik7CiAKLQlJQk1fQUNQSUhBTkRMRV9JTklUKGxlZCk7CisJVFBBQ1BJX0FDUElIQU5ETEVfSU5JVChsZWQpOwogCiAJaWYgKCFsZWRfaGFuZGxlKQogCQkvKiBsZWQgbm90IHN1cHBvcnRlZCBvbiBSMzAsIFIzMSAqLwpAQCAtMjYzOCwxMyArMzYwMCwxMSBAQAogCQkJbGVkID0gMSA8PCBsZWQ7CiAJCQlyZXQgPSBlY193cml0ZShUUEFDUElfTEVEX0VDX0hMTVMsIGxlZCk7CiAJCQlpZiAocmV0ID49IDApCi0JCQkJcmV0ID0KLQkJCQkgICAgZWNfd3JpdGUoVFBBQ1BJX0xFRF9FQ19ITEJMLAotCQkJCSAgICAJICAgICBsZWQgKiBsZWRfZXhwX2hsYmxbaW5kXSk7CisJCQkJcmV0ID0gZWNfd3JpdGUoVFBBQ1BJX0xFRF9FQ19ITEJMLAorCQkJCQkJbGVkICogbGVkX2V4cF9obGJsW2luZF0pOwogCQkJaWYgKHJldCA+PSAwKQotCQkJCXJldCA9Ci0JCQkJICAgIGVjX3dyaXRlKFRQQUNQSV9MRURfRUNfSExDTCwKLQkJCQkgICAgCSAgICAgbGVkICogbGVkX2V4cF9obGNsW2luZF0pOworCQkJCXJldCA9IGVjX3dyaXRlKFRQQUNQSV9MRURfRUNfSExDTCwKKwkJCQkJCWxlZCAqIGxlZF9leHBfaGxjbFtpbmRdKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCXJldHVybiByZXQ7CiAJCX0gZWxzZSB7CkBAIC0yNjY4LDEzICszNjI4LDEzIEBACiAgKiBCZWVwIHN1YmRyaXZlcgogICovCiAKLUlCTV9IQU5ETEUoYmVlcCwgZWMsICJCRUVQIik7CS8qIGFsbCBleGNlcHQgUjMwLCBSMzEgKi8KK1RQQUNQSV9IQU5ETEUoYmVlcCwgZWMsICJCRUVQIik7CS8qIGFsbCBleGNlcHQgUjMwLCBSMzEgKi8KIAogc3RhdGljIGludCBfX2luaXQgYmVlcF9pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pCiB7CiAJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiaW5pdGlhbGl6aW5nIGJlZXAgc3ViZHJpdmVyXG4iKTsKIAotCUlCTV9BQ1BJSEFORExFX0lOSVQoYmVlcCk7CisJVFBBQ1BJX0FDUElIQU5ETEVfSU5JVChiZWVwKTsKIAogCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgImJlZXAgaXMgJXNcbiIsCiAJCXN0cl9zdXBwb3J0ZWQoYmVlcF9oYW5kbGUgIT0gTlVMTCkpOwpAQCAtMjcyNyw4ICszNjg3LDEwOSBAQAogICogVGhlcm1hbCBzdWJkcml2ZXIKICAqLwogCitlbnVtIHRoZXJtYWxfYWNjZXNzX21vZGUgeworCVRQQUNQSV9USEVSTUFMX05PTkUgPSAwLAkvKiBObyB0aGVybWFsIHN1cHBvcnQgKi8KKwlUUEFDUElfVEhFUk1BTF9BQ1BJX1RNUDA3LAkvKiBVc2UgQUNQSSBUTVAwLTcgKi8KKwlUUEFDUElfVEhFUk1BTF9BQ1BJX1VQRFQsCS8qIFVzZSBBQ1BJIFRNUDAtNyB3aXRoIFVQRFQgKi8KKwlUUEFDUElfVEhFUk1BTF9UUEVDXzgsCQkvKiBVc2UgQUNQSSBFQyByZWdzLCA4IHNlbnNvcnMgKi8KKwlUUEFDUElfVEhFUk1BTF9UUEVDXzE2LAkJLyogVXNlIEFDUEkgRUMgcmVncywgMTYgc2Vuc29ycyAqLworfTsKKworZW51bSB7IC8qIFRQQUNQSV9USEVSTUFMX1RQRUNfKiAqLworCVRQX0VDX1RIRVJNQUxfVE1QMCA9IDB4NzgsCS8qIEFDUEkgRUMgcmVncyBUTVAgMC4uNyAqLworCVRQX0VDX1RIRVJNQUxfVE1QOCA9IDB4QzAsCS8qIEFDUEkgRUMgcmVncyBUTVAgOC4uMTUgKi8KKwlUUF9FQ19USEVSTUFMX1RNUF9OQSA9IC0xMjgsCS8qIEFDUEkgRUMgc2Vuc29yIG5vdCBhdmFpbGFibGUgKi8KK307CisKKyNkZWZpbmUgVFBBQ1BJX01BWF9USEVSTUFMX1NFTlNPUlMgMTYJLyogTWF4IHRoZXJtYWwgc2Vuc29ycyBzdXBwb3J0ZWQgKi8KK3N0cnVjdCBpYm1fdGhlcm1hbF9zZW5zb3JzX3N0cnVjdCB7CisJczMyIHRlbXBbVFBBQ1BJX01BWF9USEVSTUFMX1NFTlNPUlNdOworfTsKKwogc3RhdGljIGVudW0gdGhlcm1hbF9hY2Nlc3NfbW9kZSB0aGVybWFsX3JlYWRfbW9kZTsKIAorLyogaWR4IGlzIHplcm8tYmFzZWQgKi8KK3N0YXRpYyBpbnQgdGhlcm1hbF9nZXRfc2Vuc29yKGludCBpZHgsIHMzMiAqdmFsdWUpCit7CisJaW50IHQ7CisJczggdG1wOworCWNoYXIgdG1waVs1XTsKKworCXQgPSBUUF9FQ19USEVSTUFMX1RNUDA7CisKKwlzd2l0Y2ggKHRoZXJtYWxfcmVhZF9tb2RlKSB7CisjaWYgVFBBQ1BJX01BWF9USEVSTUFMX1NFTlNPUlMgPj0gMTYKKwljYXNlIFRQQUNQSV9USEVSTUFMX1RQRUNfMTY6CisJCWlmIChpZHggPj0gOCAmJiBpZHggPD0gMTUpIHsKKwkJCXQgPSBUUF9FQ19USEVSTUFMX1RNUDg7CisJCQlpZHggLT0gODsKKwkJfQorCQkvKiBmYWxsdGhyb3VnaCAqLworI2VuZGlmCisJY2FzZSBUUEFDUElfVEhFUk1BTF9UUEVDXzg6CisJCWlmIChpZHggPD0gNykgeworCQkJaWYgKCFhY3BpX2VjX3JlYWQodCArIGlkeCwgJnRtcCkpCisJCQkJcmV0dXJuIC1FSU87CisJCQkqdmFsdWUgPSB0bXAgKiAxMDAwOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFRQQUNQSV9USEVSTUFMX0FDUElfVVBEVDoKKwkJaWYgKGlkeCA8PSA3KSB7CisJCQlzbnByaW50Zih0bXBpLCBzaXplb2YodG1waSksICJUTVAlYyIsICcwJyArIGlkeCk7CisJCQlpZiAoIWFjcGlfZXZhbGYoZWNfaGFuZGxlLCBOVUxMLCAiVVBEVCIsICJ2IikpCisJCQkJcmV0dXJuIC1FSU87CisJCQlpZiAoIWFjcGlfZXZhbGYoZWNfaGFuZGxlLCAmdCwgdG1waSwgImQiKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCSp2YWx1ZSA9ICh0IC0gMjczMikgKiAxMDA7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgVFBBQ1BJX1RIRVJNQUxfQUNQSV9UTVAwNzoKKwkJaWYgKGlkeCA8PSA3KSB7CisJCQlzbnByaW50Zih0bXBpLCBzaXplb2YodG1waSksICJUTVAlYyIsICcwJyArIGlkeCk7CisJCQlpZiAoIWFjcGlfZXZhbGYoZWNfaGFuZGxlLCAmdCwgdG1waSwgImQiKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCWlmICh0ID4gMTI3IHx8IHQgPCAtMTI3KQorCQkJCXQgPSBUUF9FQ19USEVSTUFMX1RNUF9OQTsKKwkJCSp2YWx1ZSA9IHQgKiAxMDAwOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFRQQUNQSV9USEVSTUFMX05PTkU6CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdGhlcm1hbF9nZXRfc2Vuc29ycyhzdHJ1Y3QgaWJtX3RoZXJtYWxfc2Vuc29yc19zdHJ1Y3QgKnMpCit7CisJaW50IHJlcywgaTsKKwlpbnQgbjsKKworCW4gPSA4OworCWkgPSAwOworCisJaWYgKCFzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh0aGVybWFsX3JlYWRfbW9kZSA9PSBUUEFDUElfVEhFUk1BTF9UUEVDXzE2KQorCQluID0gMTY7CisKKwlmb3IgKGkgPSAwIDsgaSA8IG47IGkrKykgeworCQlyZXMgPSB0aGVybWFsX2dldF9zZW5zb3IoaSwgJnMtPnRlbXBbaV0pOworCQlpZiAocmVzKQorCQkJcmV0dXJuIHJlczsKKwl9CisKKwlyZXR1cm4gbjsKK30KKwogLyogc3lzZnMgdGVtcCMjX2lucHV0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0YXRpYyBzc2l6ZV90IHRoZXJtYWxfdGVtcF9pbnB1dF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTI3NTEsNyArMzgxMiw4IEBACiB9CiAKICNkZWZpbmUgVEhFUk1BTF9TRU5TT1JfQVRUUl9URU1QKF9pZHhBLCBfaWR4QikgXAotCSBTRU5TT1JfQVRUUih0ZW1wIyNfaWR4QSMjX2lucHV0LCBTX0lSVUdPLCB0aGVybWFsX3RlbXBfaW5wdXRfc2hvdywgTlVMTCwgX2lkeEIpCisJIFNFTlNPUl9BVFRSKHRlbXAjI19pZHhBIyNfaW5wdXQsIFNfSVJVR08sIFwKKwkJICAgICB0aGVybWFsX3RlbXBfaW5wdXRfc2hvdywgTlVMTCwgX2lkeEIpCiAKIHN0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgc2Vuc29yX2Rldl9hdHRyX3RoZXJtYWxfdGVtcF9pbnB1dFtdID0gewogCVRIRVJNQUxfU0VOU09SX0FUVFJfVEVNUCgxLCAwKSwKQEAgLTI4NDUsMTIgKzM5MDcsMTMgQEAKIAkJaWYgKHRhMSA9PSAwKSB7CiAJCQkvKiBUaGlzIGlzIHNoZWVyIHBhcmFub2lhLCBidXQgd2UgaGFuZGxlIGl0IGFueXdheSAqLwogCQkJaWYgKGFjcGlfdG1wNykgewotCQkJCXByaW50ayhJQk1fRVJSCisJCQkJcHJpbnRrKFRQQUNQSV9FUlIKIAkJCQkgICAgICAgIlRoaW5rUGFkIEFDUEkgRUMgYWNjZXNzIG1pc2JlaGF2aW5nLCAiCi0JCQkJICAgICAgICJmYWxsaW5nIGJhY2sgdG8gQUNQSSBUTVB4IGFjY2VzcyBtb2RlXG4iKTsKKwkJCQkgICAgICAgImZhbGxpbmcgYmFjayB0byBBQ1BJIFRNUHggYWNjZXNzICIKKwkJCQkgICAgICAgIm1vZGVcbiIpOwogCQkJCXRoZXJtYWxfcmVhZF9tb2RlID0gVFBBQ1BJX1RIRVJNQUxfQUNQSV9UTVAwNzsKIAkJCX0gZWxzZSB7Ci0JCQkJcHJpbnRrKElCTV9FUlIKKwkJCQlwcmludGsoVFBBQ1BJX0VSUgogCQkJCSAgICAgICAiVGhpbmtQYWQgQUNQSSBFQyBhY2Nlc3MgbWlzYmVoYXZpbmcsICIKIAkJCQkgICAgICAgImRpc2FibGluZyB0aGVybWFsIHNlbnNvcnMgYWNjZXNzXG4iKTsKIAkJCQl0aGVybWFsX3JlYWRfbW9kZSA9IFRQQUNQSV9USEVSTUFMX05PTkU7CkBAIC0yODc3LDcgKzM5NDAsNyBAQAogCQlzdHJfc3VwcG9ydGVkKHRoZXJtYWxfcmVhZF9tb2RlICE9IFRQQUNQSV9USEVSTUFMX05PTkUpLAogCQl0aGVybWFsX3JlYWRfbW9kZSk7CiAKLQlzd2l0Y2godGhlcm1hbF9yZWFkX21vZGUpIHsKKwlzd2l0Y2ggKHRoZXJtYWxfcmVhZF9tb2RlKSB7CiAJY2FzZSBUUEFDUElfVEhFUk1BTF9UUEVDXzE2OgogCQlyZXMgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnRwYWNwaV9zZW5zb3JzX3BkZXYtPmRldi5rb2JqLAogCQkJCSZ0aGVybWFsX3RlbXBfaW5wdXQxNl9ncm91cCk7CkBAIC0yOTAyLDEwMyArMzk2NSwyMSBAQAogCiBzdGF0aWMgdm9pZCB0aGVybWFsX2V4aXQodm9pZCkKIHsKLQlzd2l0Y2godGhlcm1hbF9yZWFkX21vZGUpIHsKLQljYXNlIFRQQUNQSV9USEVSTUFMX1RQRUNfMTY6Ci0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmdHBhY3BpX3NlbnNvcnNfcGRldi0+ZGV2LmtvYmosCi0JCQkJICAgJnRoZXJtYWxfdGVtcF9pbnB1dDE2X2dyb3VwKTsKLQkJYnJlYWs7Ci0JY2FzZSBUUEFDUElfVEhFUk1BTF9UUEVDXzg6Ci0JY2FzZSBUUEFDUElfVEhFUk1BTF9BQ1BJX1RNUDA3OgotCWNhc2UgVFBBQ1BJX1RIRVJNQUxfQUNQSV9VUERUOgotCQlzeXNmc19yZW1vdmVfZ3JvdXAoJnRwYWNwaV9zZW5zb3JzX3BkZXYtPmRldi5rb2JqLAotCQkJCSAgICZ0aGVybWFsX3RlbXBfaW5wdXQxNl9ncm91cCk7Ci0JCWJyZWFrOwotCWNhc2UgVFBBQ1BJX1RIRVJNQUxfTk9ORToKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci19Ci0KLS8qIGlkeCBpcyB6ZXJvLWJhc2VkICovCi1zdGF0aWMgaW50IHRoZXJtYWxfZ2V0X3NlbnNvcihpbnQgaWR4LCBzMzIgKnZhbHVlKQotewotCWludCB0OwotCXM4IHRtcDsKLQljaGFyIHRtcGlbNV07Ci0KLQl0ID0gVFBfRUNfVEhFUk1BTF9UTVAwOwotCiAJc3dpdGNoICh0aGVybWFsX3JlYWRfbW9kZSkgewotI2lmIFRQQUNQSV9NQVhfVEhFUk1BTF9TRU5TT1JTID49IDE2CiAJY2FzZSBUUEFDUElfVEhFUk1BTF9UUEVDXzE2OgotCQlpZiAoaWR4ID49IDggJiYgaWR4IDw9IDE1KSB7Ci0JCQl0ID0gVFBfRUNfVEhFUk1BTF9UTVA4OwotCQkJaWR4IC09IDg7Ci0JCX0KLQkJLyogZmFsbHRocm91Z2ggKi8KLSNlbmRpZgorCQlzeXNmc19yZW1vdmVfZ3JvdXAoJnRwYWNwaV9zZW5zb3JzX3BkZXYtPmRldi5rb2JqLAorCQkJCSAgICZ0aGVybWFsX3RlbXBfaW5wdXQxNl9ncm91cCk7CisJCWJyZWFrOwogCWNhc2UgVFBBQ1BJX1RIRVJNQUxfVFBFQ184OgotCQlpZiAoaWR4IDw9IDcpIHsKLQkJCWlmICghYWNwaV9lY19yZWFkKHQgKyBpZHgsICZ0bXApKQotCQkJCXJldHVybiAtRUlPOwotCQkJKnZhbHVlID0gdG1wICogMTAwMDsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBUUEFDUElfVEhFUk1BTF9BQ1BJX1VQRFQ6Ci0JCWlmIChpZHggPD0gNykgewotCQkJc25wcmludGYodG1waSwgc2l6ZW9mKHRtcGkpLCAiVE1QJWMiLCAnMCcgKyBpZHgpOwotCQkJaWYgKCFhY3BpX2V2YWxmKGVjX2hhbmRsZSwgTlVMTCwgIlVQRFQiLCAidiIpKQotCQkJCXJldHVybiAtRUlPOwotCQkJaWYgKCFhY3BpX2V2YWxmKGVjX2hhbmRsZSwgJnQsIHRtcGksICJkIikpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCQkqdmFsdWUgPSAodCAtIDI3MzIpICogMTAwOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJYnJlYWs7Ci0KIAljYXNlIFRQQUNQSV9USEVSTUFMX0FDUElfVE1QMDc6Ci0JCWlmIChpZHggPD0gNykgewotCQkJc25wcmludGYodG1waSwgc2l6ZW9mKHRtcGkpLCAiVE1QJWMiLCAnMCcgKyBpZHgpOwotCQkJaWYgKCFhY3BpX2V2YWxmKGVjX2hhbmRsZSwgJnQsIHRtcGksICJkIikpCi0JCQkJcmV0dXJuIC1FSU87Ci0JCQlpZiAodCA+IDEyNyB8fCB0IDwgLTEyNykKLQkJCQl0ID0gVFBfRUNfVEhFUk1BTF9UTVBfTkE7Ci0JCQkqdmFsdWUgPSB0ICogMTAwMDsKLQkJCXJldHVybiAwOwotCQl9CisJY2FzZSBUUEFDUElfVEhFUk1BTF9BQ1BJX1VQRFQ6CisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmdHBhY3BpX3NlbnNvcnNfcGRldi0+ZGV2LmtvYmosCisJCQkJICAgJnRoZXJtYWxfdGVtcF9pbnB1dDE2X2dyb3VwKTsKIAkJYnJlYWs7Ci0KIAljYXNlIFRQQUNQSV9USEVSTUFMX05PTkU6CiAJZGVmYXVsdDoKLQkJcmV0dXJuIC1FTk9TWVM7CisJCWJyZWFrOwogCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IHRoZXJtYWxfZ2V0X3NlbnNvcnMoc3RydWN0IGlibV90aGVybWFsX3NlbnNvcnNfc3RydWN0ICpzKQotewotCWludCByZXMsIGk7Ci0JaW50IG47Ci0KLQluID0gODsKLQlpID0gMDsKLQotCWlmICghcykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAodGhlcm1hbF9yZWFkX21vZGUgPT0gVFBBQ1BJX1RIRVJNQUxfVFBFQ18xNikKLQkJbiA9IDE2OwotCi0JZm9yKGkgPSAwIDsgaSA8IG47IGkrKykgewotCQlyZXMgPSB0aGVybWFsX2dldF9zZW5zb3IoaSwgJnMtPnRlbXBbaV0pOwotCQlpZiAocmVzKQotCQkJcmV0dXJuIHJlczsKLQl9Ci0KLQlyZXR1cm4gbjsKIH0KIAogc3RhdGljIGludCB0aGVybWFsX3JlYWQoY2hhciAqcCkKQEAgLTMxMDMsMTg5ICs0MDg0LDE1IEBACiAgKiBCYWNrbGlnaHQvYnJpZ2h0bmVzcyBzdWJkcml2ZXIKICAqLwogCi1zdGF0aWMgc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmlibV9iYWNrbGlnaHRfZGV2aWNlOworI2RlZmluZSBUUEFDUElfQkFDS0xJR0hUX0RFVl9OQU1FICJ0aGlua3BhZF9zY3JlZW4iCiAKLXN0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBpYm1fYmFja2xpZ2h0X2RhdGEgPSB7Ci0gICAgICAgIC5nZXRfYnJpZ2h0bmVzcyA9IGJyaWdodG5lc3NfZ2V0LAotICAgICAgICAudXBkYXRlX3N0YXR1cyAgPSBicmlnaHRuZXNzX3VwZGF0ZV9zdGF0dXMsCi19Oworc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICppYm1fYmFja2xpZ2h0X2RldmljZTsKK3N0YXRpYyBpbnQgYnJpZ2h0bmVzc19vZmZzZXQgPSAweDMxOworc3RhdGljIGludCBicmlnaHRuZXNzX21vZGU7CitzdGF0aWMgdW5zaWduZWQgaW50IGJyaWdodG5lc3NfZW5hYmxlID0gMjsgLyogMiA9IGF1dG8sIDAgPSBubywgMSA9IHllcyAqLwogCiBzdGF0aWMgc3RydWN0IG11dGV4IGJyaWdodG5lc3NfbXV0ZXg7CiAKLXN0YXRpYyBpbnQgX19pbml0IHRwYWNwaV9xdWVyeV9iY2xsX2xldmVscyhhY3BpX2hhbmRsZSBoYW5kbGUpCi17Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKLQl1bmlvbiBhY3BpX29iamVjdCAqb2JqOwotCWludCByYzsKLQotCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCBOVUxMLCBOVUxMLCAmYnVmZmVyKSkpIHsKLQkJb2JqID0gKHVuaW9uIGFjcGlfb2JqZWN0ICopYnVmZmVyLnBvaW50ZXI7Ci0JCWlmICghb2JqIHx8IChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpKSB7Ci0JCQlwcmludGsoSUJNX0VSUiAiVW5rbm93biBCQ0xMIGRhdGEsICIKLQkJCSAgICAgICAicGxlYXNlIHJlcG9ydCB0aGlzIHRvICVzXG4iLCBJQk1fTUFJTCk7Ci0JCQlyYyA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlyYyA9IG9iai0+cGFja2FnZS5jb3VudDsKLQkJfQotCX0gZWxzZSB7Ci0JCXJldHVybiAwOwotCX0KLQotCWtmcmVlKGJ1ZmZlci5wb2ludGVyKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cyBfX2luaXQgYnJpZ2h0bmVzc19maW5kX2JjbGwoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbHZsLAotCQkJCQl2b2lkICpjb250ZXh0LCB2b2lkICoqcnYpCi17Ci0JY2hhciBuYW1lW0FDUElfUEFUSF9TRUdNRU5UX0xFTkdUSF07Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgc2l6ZW9mKG5hbWUpLCAmbmFtZSB9OwotCi0JaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9uYW1lKGhhbmRsZSwgQUNQSV9TSU5HTEVfTkFNRSwgJmJ1ZmZlcikpICYmCi0JICAgICFzdHJuY21wKCJCQ0xMIiwgbmFtZSwgc2l6ZW9mKG5hbWUpIC0gMSkpIHsKLQkJaWYgKHRwYWNwaV9xdWVyeV9iY2xsX2xldmVscyhoYW5kbGUpID09IDE2KSB7Ci0JCQkqcnYgPSBoYW5kbGU7Ci0JCQlyZXR1cm4gQUVfQ1RSTF9URVJNSU5BVEU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gQUVfT0s7Ci0JCX0KLQl9IGVsc2UgewotCQlyZXR1cm4gQUVfT0s7Ci0JfQotfQotCi1zdGF0aWMgaW50IF9faW5pdCBicmlnaHRuZXNzX2NoZWNrX2xldmVscyh2b2lkKQotewotCWludCBzdGF0dXM7Ci0Jdm9pZCAqZm91bmRfbm9kZSA9IE5VTEw7Ci0KLQlpZiAoIXZpZF9oYW5kbGUpIHsKLQkJSUJNX0FDUElIQU5ETEVfSU5JVCh2aWQpOwotCX0KLQlpZiAoIXZpZF9oYW5kbGUpCi0JCXJldHVybiAwOwotCi0JLyogU2VhcmNoIGZvciBhIEJDTEwgcGFja2FnZSB3aXRoIDE2IGxldmVscyAqLwotCXN0YXR1cyA9IGFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX1BBQ0tBR0UsIHZpZF9oYW5kbGUsIDMsCi0JCQkJCWJyaWdodG5lc3NfZmluZF9iY2xsLCBOVUxMLCAmZm91bmRfbm9kZSk7Ci0KLQlyZXR1cm4gKEFDUElfU1VDQ0VTUyhzdGF0dXMpICYmIGZvdW5kX25vZGUgIT0gTlVMTCk7Ci19Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cyBfX2luaXQgYnJpZ2h0bmVzc19maW5kX2JjbChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsdmwsCi0JCQkJCXZvaWQgKmNvbnRleHQsIHZvaWQgKipydikKLXsKLQljaGFyIG5hbWVbQUNQSV9QQVRIX1NFR01FTlRfTEVOR1RIXTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBzaXplb2YobmFtZSksICZuYW1lIH07Ci0KLQlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X25hbWUoaGFuZGxlLCBBQ1BJX1NJTkdMRV9OQU1FLCAmYnVmZmVyKSkgJiYKLQkgICAgIXN0cm5jbXAoIl9CQ0wiLCBuYW1lLCBzaXplb2YobmFtZSkgLSAxKSkgewotCQkqcnYgPSBoYW5kbGU7Ci0JCXJldHVybiBBRV9DVFJMX1RFUk1JTkFURTsKLQl9IGVsc2UgewotCQlyZXR1cm4gQUVfT0s7Ci0JfQotfQotCi1zdGF0aWMgaW50IF9faW5pdCBicmlnaHRuZXNzX2NoZWNrX3N0ZF9hY3BpX3N1cHBvcnQodm9pZCkKLXsKLQlpbnQgc3RhdHVzOwotCXZvaWQgKmZvdW5kX25vZGUgPSBOVUxMOwotCi0JaWYgKCF2aWRfaGFuZGxlKSB7Ci0JCUlCTV9BQ1BJSEFORExFX0lOSVQodmlkKTsKLQl9Ci0JaWYgKCF2aWRfaGFuZGxlKQotCQlyZXR1cm4gMDsKLQotCS8qIFNlYXJjaCBmb3IgYSBfQkNMIG1ldGhvZCwgYnV0IGRvbid0IGV4ZWN1dGUgaXQgKi8KLQlzdGF0dXMgPSBhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9NRVRIT0QsIHZpZF9oYW5kbGUsIDMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzX2ZpbmRfYmNsLCBOVUxMLCAmZm91bmRfbm9kZSk7Ci0KLQlyZXR1cm4gKEFDUElfU1VDQ0VTUyhzdGF0dXMpICYmIGZvdW5kX25vZGUgIT0gTlVMTCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGJyaWdodG5lc3NfaW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKQotewotCWludCBiOwotCi0JdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiaW5pdGlhbGl6aW5nIGJyaWdodG5lc3Mgc3ViZHJpdmVyXG4iKTsKLQotCW11dGV4X2luaXQoJmJyaWdodG5lc3NfbXV0ZXgpOwotCi0JaWYgKCFicmlnaHRuZXNzX2VuYWJsZSkgewotCQlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKLQkJICAgICAgICAgICAiYnJpZ2h0bmVzcyBzdXBwb3J0IGRpc2FibGVkIGJ5IG1vZHVsZSBwYXJhbWV0ZXJcbiIpOwotCQlyZXR1cm4gMTsKLQl9IGVsc2UgaWYgKGJyaWdodG5lc3NfZW5hYmxlID4gMSkgewotCQlpZiAoYnJpZ2h0bmVzc19jaGVja19zdGRfYWNwaV9zdXBwb3J0KCkpIHsKLQkJCXByaW50ayhJQk1fTk9USUNFCi0JCQkgICAgICAgInN0YW5kYXJkIEFDUEkgYmFja2xpZ2h0IGludGVyZmFjZSBhdmFpbGFibGUsIG5vdCBsb2FkaW5nIG5hdGl2ZSBvbmUuLi5cbiIpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0KLQlpZiAoIWJyaWdodG5lc3NfbW9kZSkgewotCQlpZiAodGhpbmtwYWRfaWQudmVuZG9yID09IFBDSV9WRU5ET1JfSURfTEVOT1ZPKQotCQkJYnJpZ2h0bmVzc19tb2RlID0gMjsKLQkJZWxzZQotCQkJYnJpZ2h0bmVzc19tb2RlID0gMzsKLQotCQlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwgInNlbGVjdGVkIGJyaWdodG5lc3NfbW9kZT0lZFxuIiwKLQkJCWJyaWdodG5lc3NfbW9kZSk7Ci0JfQotCi0JaWYgKGJyaWdodG5lc3NfbW9kZSA+IDMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdHBfZmVhdHVyZXMuYnJpZ2h0XzE2bGV2ZWxzID0KLQkJCXRoaW5rcGFkX2lkLnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0xFTk9WTyAmJgotCQkJYnJpZ2h0bmVzc19jaGVja19sZXZlbHMoKTsKLQotCWIgPSBicmlnaHRuZXNzX2dldChOVUxMKTsKLQlpZiAoYiA8IDApCi0JCXJldHVybiAxOwotCi0JaWYgKHRwX2ZlYXR1cmVzLmJyaWdodF8xNmxldmVscykKLQkJcHJpbnRrKElCTV9JTkZPICJkZXRlY3RlZCBhIDE2LWxldmVsIGJyaWdodG5lc3MgY2FwYWJsZSBUaGlua1BhZFxuIik7Ci0KLQlpYm1fYmFja2xpZ2h0X2RldmljZSA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoCi0JCQkJCVRQQUNQSV9CQUNLTElHSFRfREVWX05BTUUsIE5VTEwsIE5VTEwsCi0JCQkJCSZpYm1fYmFja2xpZ2h0X2RhdGEpOwotCWlmIChJU19FUlIoaWJtX2JhY2tsaWdodF9kZXZpY2UpKSB7Ci0JCXByaW50ayhJQk1fRVJSICJDb3VsZCBub3QgcmVnaXN0ZXIgYmFja2xpZ2h0IGRldmljZVxuIik7Ci0JCXJldHVybiBQVFJfRVJSKGlibV9iYWNrbGlnaHRfZGV2aWNlKTsKLQl9Ci0JdmRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiYnJpZ2h0bmVzcyBpcyBzdXBwb3J0ZWRcbiIpOwotCi0JaWJtX2JhY2tsaWdodF9kZXZpY2UtPnByb3BzLm1heF9icmlnaHRuZXNzID0KLQkJCQkodHBfZmVhdHVyZXMuYnJpZ2h0XzE2bGV2ZWxzKT8gMTUgOiA3OwotCWlibV9iYWNrbGlnaHRfZGV2aWNlLT5wcm9wcy5icmlnaHRuZXNzID0gYjsKLQliYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyhpYm1fYmFja2xpZ2h0X2RldmljZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYnJpZ2h0bmVzc19leGl0KHZvaWQpCi17Ci0JaWYgKGlibV9iYWNrbGlnaHRfZGV2aWNlKSB7Ci0JCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfRVhJVCwKLQkJCSAgICAiY2FsbGluZyBiYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoKVxuIik7Ci0JCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihpYm1fYmFja2xpZ2h0X2RldmljZSk7Ci0JCWlibV9iYWNrbGlnaHRfZGV2aWNlID0gTlVMTDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgYnJpZ2h0bmVzc191cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKLXsKLQkvKiBpdCBpcyB0aGUgYmFja2xpZ2h0IGNsYXNzJ3Mgam9iIChjYWxsZXIpIHRvIGhhbmRsZQotCSAqIEVJTlRSIGFuZCBvdGhlciBlcnJvcnMgcHJvcGVybHkgKi8KLQlyZXR1cm4gYnJpZ2h0bmVzc19zZXQoCi0JCShiZC0+cHJvcHMuZmJfYmxhbmsgPT0gRkJfQkxBTktfVU5CTEFOSyAmJgotCQkgYmQtPnByb3BzLnBvd2VyID09IEZCX0JMQU5LX1VOQkxBTkspID8KLQkJCQliZC0+cHJvcHMuYnJpZ2h0bmVzcyA6IDApOwotfQotCiAvKgogICogVGhpbmtQYWRzIGNhbiByZWFkIGJyaWdodG5lc3MgZnJvbSB0d28gcGxhY2VzOiBFQyAweDMxLCBvcgogICogQ01PUyBOVlJBTSBieXRlIDB4NUUsIGJpdHMgMC0zLgpAQCAtMzMwOSw3ICs0MTE2LDcgQEAKIAl9CiAKIAlpZiAoYnJpZ2h0bmVzc19tb2RlID09IDMgJiYgbGVjICE9IGxjbW9zKSB7Ci0JCXByaW50ayhJQk1fRVJSCisJCXByaW50ayhUUEFDUElfRVJSCiAJCQkiQ01PUyBOVlJBTSAoJXUpIGFuZCBFQyAoJXUpIGRvIG5vdCBhZ3JlZSAiCiAJCQkib24gZGlzcGxheSBicmlnaHRuZXNzIGxldmVsXG4iLAogCQkJKHVuc2lnbmVkIGludCkgbGNtb3MsCkBAIC0zMzYzLDEyICs0MTcwLDIwMCBAQAogCXJldHVybiByZXM7CiB9CiAKKy8qIHN5c2ZzIGJhY2tsaWdodCBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGJyaWdodG5lc3NfdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJLyogaXQgaXMgdGhlIGJhY2tsaWdodCBjbGFzcydzIGpvYiAoY2FsbGVyKSB0byBoYW5kbGUKKwkgKiBFSU5UUiBhbmQgb3RoZXIgZXJyb3JzIHByb3Blcmx5ICovCisJcmV0dXJuIGJyaWdodG5lc3Nfc2V0KAorCQkoYmQtPnByb3BzLmZiX2JsYW5rID09IEZCX0JMQU5LX1VOQkxBTksgJiYKKwkJIGJkLT5wcm9wcy5wb3dlciA9PSBGQl9CTEFOS19VTkJMQU5LKSA/CisJCQkJYmQtPnByb3BzLmJyaWdodG5lc3MgOiAwKTsKK30KKworc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfb3BzIGlibV9iYWNrbGlnaHRfZGF0YSA9IHsKKwkuZ2V0X2JyaWdodG5lc3MgPSBicmlnaHRuZXNzX2dldCwKKwkudXBkYXRlX3N0YXR1cyAgPSBicmlnaHRuZXNzX3VwZGF0ZV9zdGF0dXMsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBfX2luaXQgdHBhY3BpX3F1ZXJ5X2JjbGxfbGV2ZWxzKGFjcGlfaGFuZGxlIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7CisJaW50IHJjOworCisJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIE5VTEwsIE5VTEwsICZidWZmZXIpKSkgeworCQlvYmogPSAodW5pb24gYWNwaV9vYmplY3QgKilidWZmZXIucG9pbnRlcjsKKwkJaWYgKCFvYmogfHwgKG9iai0+dHlwZSAhPSBBQ1BJX1RZUEVfUEFDS0FHRSkpIHsKKwkJCXByaW50ayhUUEFDUElfRVJSICJVbmtub3duIEJDTEwgZGF0YSwgIgorCQkJICAgICAgICJwbGVhc2UgcmVwb3J0IHRoaXMgdG8gJXNcbiIsIFRQQUNQSV9NQUlMKTsKKwkJCXJjID0gMDsKKwkJfSBlbHNlIHsKKwkJCXJjID0gb2JqLT5wYWNrYWdlLmNvdW50OworCQl9CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorCisJa2ZyZWUoYnVmZmVyLnBvaW50ZXIpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIF9faW5pdCBicmlnaHRuZXNzX2ZpbmRfYmNsbChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsdmwsCisJCQkJCXZvaWQgKmNvbnRleHQsIHZvaWQgKipydikKK3sKKwljaGFyIG5hbWVbQUNQSV9QQVRIX1NFR01FTlRfTEVOR1RIXTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBzaXplb2YobmFtZSksICZuYW1lIH07CisKKwlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X25hbWUoaGFuZGxlLCBBQ1BJX1NJTkdMRV9OQU1FLCAmYnVmZmVyKSkgJiYKKwkgICAgIXN0cm5jbXAoIkJDTEwiLCBuYW1lLCBzaXplb2YobmFtZSkgLSAxKSkgeworCQlpZiAodHBhY3BpX3F1ZXJ5X2JjbGxfbGV2ZWxzKGhhbmRsZSkgPT0gMTYpIHsKKwkJCSpydiA9IGhhbmRsZTsKKwkJCXJldHVybiBBRV9DVFJMX1RFUk1JTkFURTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBBRV9PSzsKKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiBBRV9PSzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGJyaWdodG5lc3NfY2hlY2tfbGV2ZWxzKHZvaWQpCit7CisJaW50IHN0YXR1czsKKwl2b2lkICpmb3VuZF9ub2RlID0gTlVMTDsKKworCWlmICghdmlkX2hhbmRsZSkgeworCQlUUEFDUElfQUNQSUhBTkRMRV9JTklUKHZpZCk7CisJfQorCWlmICghdmlkX2hhbmRsZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBTZWFyY2ggZm9yIGEgQkNMTCBwYWNrYWdlIHdpdGggMTYgbGV2ZWxzICovCisJc3RhdHVzID0gYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfUEFDS0FHRSwgdmlkX2hhbmRsZSwgMywKKwkJCQkJYnJpZ2h0bmVzc19maW5kX2JjbGwsIE5VTEwsCisJCQkJCSZmb3VuZF9ub2RlKTsKKworCXJldHVybiAoQUNQSV9TVUNDRVNTKHN0YXR1cykgJiYgZm91bmRfbm9kZSAhPSBOVUxMKTsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIF9faW5pdCBicmlnaHRuZXNzX2ZpbmRfYmNsKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGx2bCwKKwkJCQkJdm9pZCAqY29udGV4dCwgdm9pZCAqKnJ2KQoreworCWNoYXIgbmFtZVtBQ1BJX1BBVEhfU0VHTUVOVF9MRU5HVEhdOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IHNpemVvZihuYW1lKSwgJm5hbWUgfTsKKworCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfbmFtZShoYW5kbGUsIEFDUElfU0lOR0xFX05BTUUsICZidWZmZXIpKSAmJgorCSAgICAhc3RybmNtcCgiX0JDTCIsIG5hbWUsIHNpemVvZihuYW1lKSAtIDEpKSB7CisJCSpydiA9IGhhbmRsZTsKKwkJcmV0dXJuIEFFX0NUUkxfVEVSTUlOQVRFOworCX0gZWxzZSB7CisJCXJldHVybiBBRV9PSzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGJyaWdodG5lc3NfY2hlY2tfc3RkX2FjcGlfc3VwcG9ydCh2b2lkKQoreworCWludCBzdGF0dXM7CisJdm9pZCAqZm91bmRfbm9kZSA9IE5VTEw7CisKKwlpZiAoIXZpZF9oYW5kbGUpIHsKKwkJVFBBQ1BJX0FDUElIQU5ETEVfSU5JVCh2aWQpOworCX0KKwlpZiAoIXZpZF9oYW5kbGUpCisJCXJldHVybiAwOworCisJLyogU2VhcmNoIGZvciBhIF9CQ0wgbWV0aG9kLCBidXQgZG9uJ3QgZXhlY3V0ZSBpdCAqLworCXN0YXR1cyA9IGFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX01FVEhPRCwgdmlkX2hhbmRsZSwgMywKKwkJCQkgICAgIGJyaWdodG5lc3NfZmluZF9iY2wsIE5VTEwsICZmb3VuZF9ub2RlKTsKKworCXJldHVybiAoQUNQSV9TVUNDRVNTKHN0YXR1cykgJiYgZm91bmRfbm9kZSAhPSBOVUxMKTsKK30KKworc3RhdGljIGludCBfX2luaXQgYnJpZ2h0bmVzc19pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pCit7CisJaW50IGI7CisKKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJpbml0aWFsaXppbmcgYnJpZ2h0bmVzcyBzdWJkcml2ZXJcbiIpOworCisJbXV0ZXhfaW5pdCgmYnJpZ2h0bmVzc19tdXRleCk7CisKKwlpZiAoIWJyaWdodG5lc3NfZW5hYmxlKSB7CisJCWRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULAorCQkJICAgImJyaWdodG5lc3Mgc3VwcG9ydCBkaXNhYmxlZCBieSAiCisJCQkgICAibW9kdWxlIHBhcmFtZXRlclxuIik7CisJCXJldHVybiAxOworCX0gZWxzZSBpZiAoYnJpZ2h0bmVzc19lbmFibGUgPiAxKSB7CisJCWlmIChicmlnaHRuZXNzX2NoZWNrX3N0ZF9hY3BpX3N1cHBvcnQoKSkgeworCQkJcHJpbnRrKFRQQUNQSV9OT1RJQ0UKKwkJCSAgICAgICAic3RhbmRhcmQgQUNQSSBiYWNrbGlnaHQgaW50ZXJmYWNlICIKKwkJCSAgICAgICAiYXZhaWxhYmxlLCBub3QgbG9hZGluZyBuYXRpdmUgb25lLi4uXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKCFicmlnaHRuZXNzX21vZGUpIHsKKwkJaWYgKHRoaW5rcGFkX2lkLnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0xFTk9WTykKKwkJCWJyaWdodG5lc3NfbW9kZSA9IDI7CisJCWVsc2UKKwkJCWJyaWdodG5lc3NfbW9kZSA9IDM7CisKKwkJZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJzZWxlY3RlZCBicmlnaHRuZXNzX21vZGU9JWRcbiIsCisJCQlicmlnaHRuZXNzX21vZGUpOworCX0KKworCWlmIChicmlnaHRuZXNzX21vZGUgPiAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRwX2ZlYXR1cmVzLmJyaWdodF8xNmxldmVscyA9CisJCQl0aGlua3BhZF9pZC52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9MRU5PVk8gJiYKKwkJCWJyaWdodG5lc3NfY2hlY2tfbGV2ZWxzKCk7CisKKwliID0gYnJpZ2h0bmVzc19nZXQoTlVMTCk7CisJaWYgKGIgPCAwKQorCQlyZXR1cm4gMTsKKworCWlmICh0cF9mZWF0dXJlcy5icmlnaHRfMTZsZXZlbHMpCisJCXByaW50ayhUUEFDUElfSU5GTworCQkgICAgICAgImRldGVjdGVkIGEgMTYtbGV2ZWwgYnJpZ2h0bmVzcyBjYXBhYmxlIFRoaW5rUGFkXG4iKTsKKworCWlibV9iYWNrbGlnaHRfZGV2aWNlID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcigKKwkJCQkJVFBBQ1BJX0JBQ0tMSUdIVF9ERVZfTkFNRSwgTlVMTCwgTlVMTCwKKwkJCQkJJmlibV9iYWNrbGlnaHRfZGF0YSk7CisJaWYgKElTX0VSUihpYm1fYmFja2xpZ2h0X2RldmljZSkpIHsKKwkJcHJpbnRrKFRQQUNQSV9FUlIgIkNvdWxkIG5vdCByZWdpc3RlciBiYWNrbGlnaHQgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoaWJtX2JhY2tsaWdodF9kZXZpY2UpOworCX0KKwl2ZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsICJicmlnaHRuZXNzIGlzIHN1cHBvcnRlZFxuIik7CisKKwlpYm1fYmFja2xpZ2h0X2RldmljZS0+cHJvcHMubWF4X2JyaWdodG5lc3MgPQorCQkJCSh0cF9mZWF0dXJlcy5icmlnaHRfMTZsZXZlbHMpPyAxNSA6IDc7CisJaWJtX2JhY2tsaWdodF9kZXZpY2UtPnByb3BzLmJyaWdodG5lc3MgPSBiOworCWJhY2tsaWdodF91cGRhdGVfc3RhdHVzKGlibV9iYWNrbGlnaHRfZGV2aWNlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBicmlnaHRuZXNzX2V4aXQodm9pZCkKK3sKKwlpZiAoaWJtX2JhY2tsaWdodF9kZXZpY2UpIHsKKwkJdmRiZ19wcmludGsoVFBBQ1BJX0RCR19FWElULAorCQkJICAgICJjYWxsaW5nIGJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcigpXG4iKTsKKwkJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKGlibV9iYWNrbGlnaHRfZGV2aWNlKTsKKwkJaWJtX2JhY2tsaWdodF9kZXZpY2UgPSBOVUxMOworCX0KK30KKwogc3RhdGljIGludCBicmlnaHRuZXNzX3JlYWQoY2hhciAqcCkKIHsKIAlpbnQgbGVuID0gMDsKIAlpbnQgbGV2ZWw7CiAKLQlpZiAoKGxldmVsID0gYnJpZ2h0bmVzc19nZXQoTlVMTCkpIDwgMCkgeworCWxldmVsID0gYnJpZ2h0bmVzc19nZXQoTlVMTCk7CisJaWYgKGxldmVsIDwgMCkgewogCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAibGV2ZWw6XHRcdHVucmVhZGFibGVcbiIpOwogCX0gZWxzZSB7CiAJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJsZXZlbDpcdFx0JWRcbiIsIGxldmVsKTsKQEAgLTM0MjUsNiArNDQyMCw4IEBACiAgKiBWb2x1bWUgc3ViZHJpdmVyCiAgKi8KIAorc3RhdGljIGludCB2b2x1bWVfb2Zmc2V0ID0gMHgzMDsKKwogc3RhdGljIGludCB2b2x1bWVfcmVhZChjaGFyICpwKQogewogCWludCBsZW4gPSAwOwpAQCAtMzQ3NCw4ICs0NDcxLDExIEBACiAJCX0gZWxzZQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJaWYgKG5ld19sZXZlbCAhPSBsZXZlbCkgewkvKiBtdXRlIGRvZXNuJ3QgY2hhbmdlICovCi0JCQljbW9zX2NtZCA9IG5ld19sZXZlbCA+IGxldmVsID8gVFBfQ01PU19WT0xVTUVfVVAgOiBUUF9DTU9TX1ZPTFVNRV9ET1dOOworCQlpZiAobmV3X2xldmVsICE9IGxldmVsKSB7CisJCQkvKiBtdXRlIGRvZXNuJ3QgY2hhbmdlICovCisKKwkJCWNtb3NfY21kID0gKG5ld19sZXZlbCA+IGxldmVsKSA/CisJCQkJCVRQX0NNT1NfVk9MVU1FX1VQIDogVFBfQ01PU19WT0xVTUVfRE9XTjsKIAkJCWluYyA9IG5ld19sZXZlbCA+IGxldmVsID8gMSA6IC0xOwogCiAJCQlpZiAobXV0ZSAmJiAoaXNzdWVfdGhpbmtwYWRfY21vc19jb21tYW5kKGNtb3NfY21kKSB8fApAQCAtMzQ4NywxNCArNDQ4NywxOCBAQAogCQkJCSAgICAhYWNwaV9lY193cml0ZSh2b2x1bWVfb2Zmc2V0LCBpICsgaW5jKSkKIAkJCQkJcmV0dXJuIC1FSU87CiAKLQkJCWlmIChtdXRlICYmIChpc3N1ZV90aGlua3BhZF9jbW9zX2NvbW1hbmQoVFBfQ01PU19WT0xVTUVfTVVURSkgfHwKLQkJCQkgICAgICFhY3BpX2VjX3dyaXRlKHZvbHVtZV9vZmZzZXQsCi0JCQkJCQkgICAgbmV3X2xldmVsICsgbXV0ZSkpKQorCQkJaWYgKG11dGUgJiYKKwkJCSAgICAoaXNzdWVfdGhpbmtwYWRfY21vc19jb21tYW5kKFRQX0NNT1NfVk9MVU1FX01VVEUpIHx8CisJCQkgICAgICFhY3BpX2VjX3dyaXRlKHZvbHVtZV9vZmZzZXQsIG5ld19sZXZlbCArIG11dGUpKSkgewogCQkJCXJldHVybiAtRUlPOworCQkJfQogCQl9CiAKLQkJaWYgKG5ld19tdXRlICE9IG11dGUpIHsJLyogbGV2ZWwgZG9lc24ndCBjaGFuZ2UgKi8KLQkJCWNtb3NfY21kID0gbmV3X211dGUgPyBUUF9DTU9TX1ZPTFVNRV9NVVRFIDogVFBfQ01PU19WT0xVTUVfVVA7CisJCWlmIChuZXdfbXV0ZSAhPSBtdXRlKSB7CisJCQkvKiBsZXZlbCBkb2Vzbid0IGNoYW5nZSAqLworCisJCQljbW9zX2NtZCA9IChuZXdfbXV0ZSkgPworCQkJCSAgIFRQX0NNT1NfVk9MVU1FX01VVEUgOiBUUF9DTU9TX1ZPTFVNRV9VUDsKIAogCQkJaWYgKGlzc3VlX3RoaW5rcGFkX2Ntb3NfY29tbWFuZChjbW9zX2NtZCkgfHwKIAkJCSAgICAhYWNwaV9lY193cml0ZSh2b2x1bWVfb2Zmc2V0LCBsZXZlbCArIG5ld19tdXRlKSkKQEAgLTM2MTYsMjYgKzQ2MjAsMzc3IEBACiAgKiAJYnV0IHRoZSBBQ1BJIHRhYmxlcyBqdXN0IG1lbnRpb24gbGV2ZWwgNy4KICAqLwogCitlbnVtIHsJCQkJCS8qIEZhbiBjb250cm9sIGNvbnN0YW50cyAqLworCWZhbl9zdGF0dXNfb2Zmc2V0ID0gMHgyZiwJLyogRUMgcmVnaXN0ZXIgMHgyZiAqLworCWZhbl9ycG1fb2Zmc2V0ID0gMHg4NCwJCS8qIEVDIHJlZ2lzdGVyIDB4ODQ6IExTQiwgMHg4NSBNU0IgKFJQTSkKKwkJCQkJICogMHg4NCBtdXN0IGJlIHJlYWQgYmVmb3JlIDB4ODUgKi8KKworCVRQX0VDX0ZBTl9GVUxMU1BFRUQgPSAweDQwLAkvKiBFQyBmYW4gbW9kZTogZnVsbCBzcGVlZCAqLworCVRQX0VDX0ZBTl9BVVRPCSAgICA9IDB4ODAsCS8qIEVDIGZhbiBtb2RlOiBhdXRvIGZhbiBjb250cm9sICovCisKKwlUUEFDUElfRkFOX0xBU1RfTEVWRUwgPSAweDEwMCwJLyogVXNlIGNhY2hlZCBsYXN0LXNlZW4gZmFuIGxldmVsICovCit9OworCitlbnVtIGZhbl9zdGF0dXNfYWNjZXNzX21vZGUgeworCVRQQUNQSV9GQU5fTk9ORSA9IDAsCQkvKiBObyBmYW4gc3RhdHVzIG9yIGNvbnRyb2wgKi8KKwlUUEFDUElfRkFOX1JEX0FDUElfR0ZBTiwJLyogVXNlIEFDUEkgR0ZBTiAqLworCVRQQUNQSV9GQU5fUkRfVFBFQywJCS8qIFVzZSBBQ1BJIEVDIHJlZ3MgMHgyZiwgMHg4NC0weDg1ICovCit9OworCitlbnVtIGZhbl9jb250cm9sX2FjY2Vzc19tb2RlIHsKKwlUUEFDUElfRkFOX1dSX05PTkUgPSAwLAkJLyogTm8gZmFuIGNvbnRyb2wgKi8KKwlUUEFDUElfRkFOX1dSX0FDUElfU0ZBTiwJLyogVXNlIEFDUEkgU0ZBTiAqLworCVRQQUNQSV9GQU5fV1JfVFBFQywJCS8qIFVzZSBBQ1BJIEVDIHJlZyAweDJmICovCisJVFBBQ1BJX0ZBTl9XUl9BQ1BJX0ZBTlMsCS8qIFVzZSBBQ1BJIEZBTlMgYW5kIEVDIHJlZyAweDJmICovCit9OworCitlbnVtIGZhbl9jb250cm9sX2NvbW1hbmRzIHsKKwlUUEFDUElfRkFOX0NNRF9TUEVFRCAJPSAweDAwMDEsCS8qIHNwZWVkIGNvbW1hbmQgKi8KKwlUUEFDUElfRkFOX0NNRF9MRVZFTCAJPSAweDAwMDIsCS8qIGxldmVsIGNvbW1hbmQgICovCisJVFBBQ1BJX0ZBTl9DTURfRU5BQkxFCT0gMHgwMDA0LAkvKiBlbmFibGUvZGlzYWJsZSBjbWQsCisJCQkJCQkgKiBhbmQgYWxzbyB3YXRjaGRvZyBjbWQgKi8KK307CisKK3N0YXRpYyBpbnQgZmFuX2NvbnRyb2xfYWxsb3dlZDsKKwogc3RhdGljIGVudW0gZmFuX3N0YXR1c19hY2Nlc3NfbW9kZSBmYW5fc3RhdHVzX2FjY2Vzc19tb2RlOwogc3RhdGljIGVudW0gZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUgZmFuX2NvbnRyb2xfYWNjZXNzX21vZGU7CiBzdGF0aWMgZW51bSBmYW5fY29udHJvbF9jb21tYW5kcyBmYW5fY29udHJvbF9jb21tYW5kczsKIAogc3RhdGljIHU4IGZhbl9jb250cm9sX2luaXRpYWxfc3RhdHVzOwogc3RhdGljIHU4IGZhbl9jb250cm9sX2Rlc2lyZWRfbGV2ZWw7CitzdGF0aWMgaW50IGZhbl93YXRjaGRvZ19tYXhpbnRlcnZhbDsKKworc3RhdGljIHN0cnVjdCBtdXRleCBmYW5fbXV0ZXg7CiAKIHN0YXRpYyB2b2lkIGZhbl93YXRjaGRvZ19maXJlKHN0cnVjdCB3b3JrX3N0cnVjdCAqaWdub3JlZCk7Ci1zdGF0aWMgaW50IGZhbl93YXRjaGRvZ19tYXhpbnRlcnZhbDsKIHN0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhmYW5fd2F0Y2hkb2dfdGFzaywgZmFuX3dhdGNoZG9nX2ZpcmUpOwogCi1JQk1fSEFORExFKGZhbnMsIGVjLCAiRkFOUyIpOwkvKiBYMzEsIFg0MCwgWDQxICovCi1JQk1fSEFORExFKGdmYW4sIGVjLCAiR0ZBTiIsCS8qIDU3MCAqLworVFBBQ1BJX0hBTkRMRShmYW5zLCBlYywgIkZBTlMiKTsJLyogWDMxLCBYNDAsIFg0MSAqLworVFBBQ1BJX0hBTkRMRShnZmFuLCBlYywgIkdGQU4iLAkvKiA1NzAgKi8KIAkgICAiXFxGU1BEIiwJCS8qIDYwMGUveCwgNzcwZSwgNzcweCAqLwogCSAgICk7CQkJLyogYWxsIG90aGVycyAqLwotSUJNX0hBTkRMRShzZmFuLCBlYywgIlNGQU4iLAkvKiA1NzAgKi8KK1RQQUNQSV9IQU5ETEUoc2ZhbiwgZWMsICJTRkFOIiwJLyogNTcwICovCiAJICAgIkpGTlMiLAkJLyogNzcweC1KTCAqLwogCSAgICk7CQkJLyogYWxsIG90aGVycyAqLwogCiAvKgorICogQ2FsbCB3aXRoIGZhbl9tdXRleCBoZWxkCisgKi8KK3N0YXRpYyB2b2lkIGZhbl91cGRhdGVfZGVzaXJlZF9sZXZlbCh1OCBzdGF0dXMpCit7CisJaWYgKChzdGF0dXMgJgorCSAgICAgKFRQX0VDX0ZBTl9BVVRPIHwgVFBfRUNfRkFOX0ZVTExTUEVFRCkpID09IDApIHsKKwkJaWYgKHN0YXR1cyA+IDcpCisJCQlmYW5fY29udHJvbF9kZXNpcmVkX2xldmVsID0gNzsKKwkJZWxzZQorCQkJZmFuX2NvbnRyb2xfZGVzaXJlZF9sZXZlbCA9IHN0YXR1czsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZmFuX2dldF9zdGF0dXModTggKnN0YXR1cykKK3sKKwl1OCBzOworCisJLyogVE9ETzoKKwkgKiBBZGQgVFBBQ1BJX0ZBTl9SRF9BQ1BJX0ZBTlMgPyAqLworCisJc3dpdGNoIChmYW5fc3RhdHVzX2FjY2Vzc19tb2RlKSB7CisJY2FzZSBUUEFDUElfRkFOX1JEX0FDUElfR0ZBTjoKKwkJLyogNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHggKi8KKworCQlpZiAodW5saWtlbHkoIWFjcGlfZXZhbGYoZ2Zhbl9oYW5kbGUsICZzLCBOVUxMLCAiZCIpKSkKKwkJCXJldHVybiAtRUlPOworCisJCWlmIChsaWtlbHkoc3RhdHVzKSkKKwkJCSpzdGF0dXMgPSBzICYgMHgwNzsKKworCQlicmVhazsKKworCWNhc2UgVFBBQ1BJX0ZBTl9SRF9UUEVDOgorCQkvKiBhbGwgZXhjZXB0IDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4ICovCisJCWlmICh1bmxpa2VseSghYWNwaV9lY19yZWFkKGZhbl9zdGF0dXNfb2Zmc2V0LCAmcykpKQorCQkJcmV0dXJuIC1FSU87CisKKwkJaWYgKGxpa2VseShzdGF0dXMpKQorCQkJKnN0YXR1cyA9IHM7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOWElPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZhbl9nZXRfc3RhdHVzX3NhZmUodTggKnN0YXR1cykKK3sKKwlpbnQgcmM7CisJdTggczsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmZhbl9tdXRleCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJcmMgPSBmYW5fZ2V0X3N0YXR1cygmcyk7CisJaWYgKCFyYykKKwkJZmFuX3VwZGF0ZV9kZXNpcmVkX2xldmVsKHMpOworCW11dGV4X3VubG9jaygmZmFuX211dGV4KTsKKworCWlmIChzdGF0dXMpCisJCSpzdGF0dXMgPSBzOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGZhbl9nZXRfc3BlZWQodW5zaWduZWQgaW50ICpzcGVlZCkKK3sKKwl1OCBoaSwgbG87CisKKwlzd2l0Y2ggKGZhbl9zdGF0dXNfYWNjZXNzX21vZGUpIHsKKwljYXNlIFRQQUNQSV9GQU5fUkRfVFBFQzoKKwkJLyogYWxsIGV4Y2VwdCA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCAqLworCQlpZiAodW5saWtlbHkoIWFjcGlfZWNfcmVhZChmYW5fcnBtX29mZnNldCwgJmxvKSB8fAorCQkJICAgICAhYWNwaV9lY19yZWFkKGZhbl9ycG1fb2Zmc2V0ICsgMSwgJmhpKSkpCisJCQlyZXR1cm4gLUVJTzsKKworCQlpZiAobGlrZWx5KHNwZWVkKSkKKwkJCSpzcGVlZCA9IChoaSA8PCA4KSB8IGxvOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmYW5fc2V0X2xldmVsKGludCBsZXZlbCkKK3sKKwlpZiAoIWZhbl9jb250cm9sX2FsbG93ZWQpCisJCXJldHVybiAtRVBFUk07CisKKwlzd2l0Y2ggKGZhbl9jb250cm9sX2FjY2Vzc19tb2RlKSB7CisJY2FzZSBUUEFDUElfRkFOX1dSX0FDUElfU0ZBTjoKKwkJaWYgKGxldmVsID49IDAgJiYgbGV2ZWwgPD0gNykgeworCQkJaWYgKCFhY3BpX2V2YWxmKHNmYW5faGFuZGxlLCBOVUxMLCBOVUxMLCAidmQiLCBsZXZlbCkpCisJCQkJcmV0dXJuIC1FSU87CisJCX0gZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCisJY2FzZSBUUEFDUElfRkFOX1dSX0FDUElfRkFOUzoKKwljYXNlIFRQQUNQSV9GQU5fV1JfVFBFQzoKKwkJaWYgKChsZXZlbCAhPSBUUF9FQ19GQU5fQVVUTykgJiYKKwkJICAgIChsZXZlbCAhPSBUUF9FQ19GQU5fRlVMTFNQRUVEKSAmJgorCQkgICAgKChsZXZlbCA8IDApIHx8IChsZXZlbCA+IDcpKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qIHNhZmV0eSBuZXQgc2hvdWxkIHRoZSBFQyBub3Qgc3VwcG9ydCBBVVRPCisJCSAqIG9yIEZVTExTUEVFRCBtb2RlIGJpdHMgYW5kIGp1c3QgaWdub3JlIHRoZW0gKi8KKwkJaWYgKGxldmVsICYgVFBfRUNfRkFOX0ZVTExTUEVFRCkKKwkJCWxldmVsIHw9IDc7CS8qIHNhZmV0eSBtaW4gc3BlZWQgNyAqLworCQllbHNlIGlmIChsZXZlbCAmIFRQX0VDX0ZBTl9BVVRPKQorCQkJbGV2ZWwgfD0gNDsJLyogc2FmZXR5IG1pbiBzcGVlZCA0ICovCisKKwkJaWYgKCFhY3BpX2VjX3dyaXRlKGZhbl9zdGF0dXNfb2Zmc2V0LCBsZXZlbCkpCisJCQlyZXR1cm4gLUVJTzsKKwkJZWxzZQorCQkJdHBfZmVhdHVyZXMuZmFuX2N0cmxfc3RhdHVzX3VuZGVmID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOWElPOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmYW5fc2V0X2xldmVsX3NhZmUoaW50IGxldmVsKQoreworCWludCByYzsKKworCWlmICghZmFuX2NvbnRyb2xfYWxsb3dlZCkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmZhbl9tdXRleCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlpZiAobGV2ZWwgPT0gVFBBQ1BJX0ZBTl9MQVNUX0xFVkVMKQorCQlsZXZlbCA9IGZhbl9jb250cm9sX2Rlc2lyZWRfbGV2ZWw7CisKKwlyYyA9IGZhbl9zZXRfbGV2ZWwobGV2ZWwpOworCWlmICghcmMpCisJCWZhbl91cGRhdGVfZGVzaXJlZF9sZXZlbChsZXZlbCk7CisKKwltdXRleF91bmxvY2soJmZhbl9tdXRleCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGZhbl9zZXRfZW5hYmxlKHZvaWQpCit7CisJdTggczsKKwlpbnQgcmM7CisKKwlpZiAoIWZhbl9jb250cm9sX2FsbG93ZWQpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZmYW5fbXV0ZXgpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJc3dpdGNoIChmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSkgeworCWNhc2UgVFBBQ1BJX0ZBTl9XUl9BQ1BJX0ZBTlM6CisJY2FzZSBUUEFDUElfRkFOX1dSX1RQRUM6CisJCXJjID0gZmFuX2dldF9zdGF0dXMoJnMpOworCQlpZiAocmMgPCAwKQorCQkJYnJlYWs7CisKKwkJLyogRG9uJ3QgZ28gb3V0IG9mIGVtZXJnZW5jeSBmYW4gbW9kZSAqLworCQlpZiAocyAhPSA3KSB7CisJCQlzICY9IDB4MDc7CisJCQlzIHw9IFRQX0VDX0ZBTl9BVVRPIHwgNDsgLyogbWluIGZhbiBzcGVlZCA0ICovCisJCX0KKworCQlpZiAoIWFjcGlfZWNfd3JpdGUoZmFuX3N0YXR1c19vZmZzZXQsIHMpKQorCQkJcmMgPSAtRUlPOworCQllbHNlIHsKKwkJCXRwX2ZlYXR1cmVzLmZhbl9jdHJsX3N0YXR1c191bmRlZiA9IDA7CisJCQlyYyA9IDA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFRQQUNQSV9GQU5fV1JfQUNQSV9TRkFOOgorCQlyYyA9IGZhbl9nZXRfc3RhdHVzKCZzKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWJyZWFrOworCisJCXMgJj0gMHgwNzsKKworCQkvKiBTZXQgZmFuIHRvIGF0IGxlYXN0IGxldmVsIDQgKi8KKwkJcyB8PSA0OworCisJCWlmICghYWNwaV9ldmFsZihzZmFuX2hhbmRsZSwgTlVMTCwgTlVMTCwgInZkIiwgcykpCisJCQlyYyA9IC1FSU87CisJCWVsc2UKKwkJCXJjID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyYyA9IC1FTlhJTzsKKwl9CisKKwltdXRleF91bmxvY2soJmZhbl9tdXRleCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGZhbl9zZXRfZGlzYWJsZSh2b2lkKQoreworCWludCByYzsKKworCWlmICghZmFuX2NvbnRyb2xfYWxsb3dlZCkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmZhbl9tdXRleCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlyYyA9IDA7CisJc3dpdGNoIChmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSkgeworCWNhc2UgVFBBQ1BJX0ZBTl9XUl9BQ1BJX0ZBTlM6CisJY2FzZSBUUEFDUElfRkFOX1dSX1RQRUM6CisJCWlmICghYWNwaV9lY193cml0ZShmYW5fc3RhdHVzX29mZnNldCwgMHgwMCkpCisJCQlyYyA9IC1FSU87CisJCWVsc2UgeworCQkJZmFuX2NvbnRyb2xfZGVzaXJlZF9sZXZlbCA9IDA7CisJCQl0cF9mZWF0dXJlcy5mYW5fY3RybF9zdGF0dXNfdW5kZWYgPSAwOworCQl9CisJCWJyZWFrOworCisJY2FzZSBUUEFDUElfRkFOX1dSX0FDUElfU0ZBTjoKKwkJaWYgKCFhY3BpX2V2YWxmKHNmYW5faGFuZGxlLCBOVUxMLCBOVUxMLCAidmQiLCAweDAwKSkKKwkJCXJjID0gLUVJTzsKKwkJZWxzZQorCQkJZmFuX2NvbnRyb2xfZGVzaXJlZF9sZXZlbCA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmMgPSAtRU5YSU87CisJfQorCisKKwltdXRleF91bmxvY2soJmZhbl9tdXRleCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGZhbl9zZXRfc3BlZWQoaW50IHNwZWVkKQoreworCWludCByYzsKKworCWlmICghZmFuX2NvbnRyb2xfYWxsb3dlZCkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmZhbl9tdXRleCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlyYyA9IDA7CisJc3dpdGNoIChmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSkgeworCWNhc2UgVFBBQ1BJX0ZBTl9XUl9BQ1BJX0ZBTlM6CisJCWlmIChzcGVlZCA+PSAwICYmIHNwZWVkIDw9IDY1NTM1KSB7CisJCQlpZiAoIWFjcGlfZXZhbGYoZmFuc19oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZGRkIiwKKwkJCQkJc3BlZWQsIHNwZWVkLCBzcGVlZCkpCisJCQkJcmMgPSAtRUlPOworCQl9IGVsc2UKKwkJCXJjID0gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyYyA9IC1FTlhJTzsKKwl9CisKKwltdXRleF91bmxvY2soJmZhbl9tdXRleCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBmYW5fd2F0Y2hkb2dfcmVzZXQodm9pZCkKK3sKKwlzdGF0aWMgaW50IGZhbl93YXRjaGRvZ19hY3RpdmU7CisKKwlpZiAoZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUgPT0gVFBBQ1BJX0ZBTl9XUl9OT05FKQorCQlyZXR1cm47CisKKwlpZiAoZmFuX3dhdGNoZG9nX2FjdGl2ZSkKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmZmFuX3dhdGNoZG9nX3Rhc2spOworCisJaWYgKGZhbl93YXRjaGRvZ19tYXhpbnRlcnZhbCA+IDAgJiYKKwkgICAgdHBhY3BpX2xpZmVjeWNsZSAhPSBUUEFDUElfTElGRV9FWElUSU5HKSB7CisJCWZhbl93YXRjaGRvZ19hY3RpdmUgPSAxOworCQlpZiAoIXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZmFuX3dhdGNoZG9nX3Rhc2ssCisJCQkJbXNlY3NfdG9famlmZmllcyhmYW5fd2F0Y2hkb2dfbWF4aW50ZXJ2YWwKKwkJCQkJCSAqIDEwMDApKSkgeworCQkJcHJpbnRrKFRQQUNQSV9FUlIKKwkJCSAgICAgICAiZmFpbGVkIHRvIHNjaGVkdWxlIHRoZSBmYW4gd2F0Y2hkb2csICIKKwkJCSAgICAgICAid2F0Y2hkb2cgd2lsbCBub3QgdHJpZ2dlclxuIik7CisJCX0KKwl9IGVsc2UKKwkJZmFuX3dhdGNoZG9nX2FjdGl2ZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGZhbl93YXRjaGRvZ19maXJlKHN0cnVjdCB3b3JrX3N0cnVjdCAqaWdub3JlZCkKK3sKKwlpbnQgcmM7CisKKwlpZiAodHBhY3BpX2xpZmVjeWNsZSAhPSBUUEFDUElfTElGRV9SVU5OSU5HKQorCQlyZXR1cm47CisKKwlwcmludGsoVFBBQ1BJX05PVElDRSAiZmFuIHdhdGNoZG9nOiBlbmFibGluZyBmYW5cbiIpOworCXJjID0gZmFuX3NldF9lbmFibGUoKTsKKwlpZiAocmMgPCAwKSB7CisJCXByaW50ayhUUEFDUElfRVJSICJmYW4gd2F0Y2hkb2c6IGVycm9yICVkIHdoaWxlIGVuYWJsaW5nIGZhbiwgIgorCQkJIndpbGwgdHJ5IGFnYWluIGxhdGVyLi4uXG4iLCAtcmMpOworCQkvKiByZXNjaGVkdWxlIGZvciBsYXRlciAqLworCQlmYW5fd2F0Y2hkb2dfcmVzZXQoKTsKKwl9Cit9CisKKy8qCiAgKiBTWVNGUyBmYW4gbGF5b3V0OiBod21vbiBjb21wYXRpYmxlIChkZXZpY2UpCiAgKgogICogcHdtKl9lbmFibGU6CkBAIC0zODY4LDkgKzUyMjMsOSBAQAogCXRwX2ZlYXR1cmVzLmZhbl9jdHJsX3N0YXR1c191bmRlZiA9IDA7CiAJZmFuX2NvbnRyb2xfZGVzaXJlZF9sZXZlbCA9IDc7CiAKLQlJQk1fQUNQSUhBTkRMRV9JTklUKGZhbnMpOwotCUlCTV9BQ1BJSEFORExFX0lOSVQoZ2Zhbik7Ci0JSUJNX0FDUElIQU5ETEVfSU5JVChzZmFuKTsKKwlUUEFDUElfQUNQSUhBTkRMRV9JTklUKGZhbnMpOworCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQoZ2Zhbik7CisJVFBBQ1BJX0FDUElIQU5ETEVfSU5JVChzZmFuKTsKIAogCWlmIChnZmFuX2hhbmRsZSkgewogCQkvKiA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCAqLwpAQCAtMzg5NiwxNiArNTI1MSwxNiBAQAogCQkJCWNhc2UgMHgzODM3OiAvKiBUUC03OCAqLwogCQkJCWNhc2UgMHgzNjM3OiAvKiBUUC03NiAqLwogCQkJCWNhc2UgMHgzMDM3OiAvKiBUUC03MCAqLwotCQkJCQlwcmludGsoSUJNX05PVElDRQotCQkJCQkgICAgICAgImZhbl9pbml0OiBpbml0aWFsIGZhbiBzdGF0dXMgaXMgIgotCQkJCQkgICAgICAgInVua25vd24sIGFzc3VtaW5nIGl0IGlzIGluIGF1dG8gIgotCQkJCQkgICAgICAgIm1vZGVcbiIpOworCQkJCQlwcmludGsoVFBBQ1BJX05PVElDRQorCQkJCQkgICAgICAgImZhbl9pbml0OiBpbml0aWFsIGZhbiBzdGF0dXMgIgorCQkJCQkgICAgICAgImlzIHVua25vd24sIGFzc3VtaW5nIGl0IGlzICIKKwkJCQkJICAgICAgICJpbiBhdXRvIG1vZGVcbiIpOwogCQkJCQl0cF9mZWF0dXJlcy5mYW5fY3RybF9zdGF0dXNfdW5kZWYgPSAxOwogCQkJCQk7OwogCQkJCX0KIAkJCX0KIAkJfSBlbHNlIHsKLQkJCXByaW50ayhJQk1fRVJSCisJCQlwcmludGsoVFBBQ1BJX0VSUgogCQkJICAgICAgICJUaGlua1BhZCBBQ1BJIEVDIGFjY2VzcyBtaXNiZWhhdmluZywgIgogCQkJICAgICAgICJmYW4gc3RhdHVzIGFuZCBjb250cm9sIHVuYXZhaWxhYmxlXG4iKTsKIAkJCXJldHVybiAxOwpAQCAtMzk3MCwzMzMgKzUzMjUsMjAgQEAKIAkJcmV0dXJuIDE7CiB9CiAKLS8qCi0gKiBDYWxsIHdpdGggZmFuX211dGV4IGhlbGQKLSAqLwotc3RhdGljIHZvaWQgZmFuX3VwZGF0ZV9kZXNpcmVkX2xldmVsKHU4IHN0YXR1cykKLXsKLQlpZiAoKHN0YXR1cyAmCi0JICAgICAoVFBfRUNfRkFOX0FVVE8gfCBUUF9FQ19GQU5fRlVMTFNQRUVEKSkgPT0gMCkgewotCQlpZiAoc3RhdHVzID4gNykKLQkJCWZhbl9jb250cm9sX2Rlc2lyZWRfbGV2ZWwgPSA3OwotCQllbHNlCi0JCQlmYW5fY29udHJvbF9kZXNpcmVkX2xldmVsID0gc3RhdHVzOwotCX0KLX0KLQotc3RhdGljIGludCBmYW5fZ2V0X3N0YXR1cyh1OCAqc3RhdHVzKQotewotCXU4IHM7Ci0KLQkvKiBUT0RPOgotCSAqIEFkZCBUUEFDUElfRkFOX1JEX0FDUElfRkFOUyA/ICovCi0KLQlzd2l0Y2ggKGZhbl9zdGF0dXNfYWNjZXNzX21vZGUpIHsKLQljYXNlIFRQQUNQSV9GQU5fUkRfQUNQSV9HRkFOOgotCQkvKiA1NzAsIDYwMGUveCwgNzcwZSwgNzcweCAqLwotCi0JCWlmICh1bmxpa2VseSghYWNwaV9ldmFsZihnZmFuX2hhbmRsZSwgJnMsIE5VTEwsICJkIikpKQotCQkJcmV0dXJuIC1FSU87Ci0KLQkJaWYgKGxpa2VseShzdGF0dXMpKQotCQkJKnN0YXR1cyA9IHMgJiAweDA3OwotCi0JCWJyZWFrOwotCi0JY2FzZSBUUEFDUElfRkFOX1JEX1RQRUM6Ci0JCS8qIGFsbCBleGNlcHQgNTcwLCA2MDBlL3gsIDc3MGUsIDc3MHggKi8KLQkJaWYgKHVubGlrZWx5KCFhY3BpX2VjX3JlYWQoZmFuX3N0YXR1c19vZmZzZXQsICZzKSkpCi0JCQlyZXR1cm4gLUVJTzsKLQotCQlpZiAobGlrZWx5KHN0YXR1cykpCi0JCQkqc3RhdHVzID0gczsKLQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZmFuX2dldF9zdGF0dXNfc2FmZSh1OCAqc3RhdHVzKQotewotCWludCByYzsKLQl1OCBzOwotCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZmFuX211dGV4KSkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQlyYyA9IGZhbl9nZXRfc3RhdHVzKCZzKTsKLQlpZiAoIXJjKQotCQlmYW5fdXBkYXRlX2Rlc2lyZWRfbGV2ZWwocyk7Ci0JbXV0ZXhfdW5sb2NrKCZmYW5fbXV0ZXgpOwotCi0JaWYgKHN0YXR1cykKLQkJKnN0YXR1cyA9IHM7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KIHN0YXRpYyB2b2lkIGZhbl9leGl0KHZvaWQpCiB7Ci0JdmRiZ19wcmludGsoVFBBQ1BJX0RCR19FWElULCAiY2FuY2VsbGluZyBhbnkgcGVuZGluZyBmYW4gd2F0Y2hkb2cgdGFza3NcbiIpOworCXZkYmdfcHJpbnRrKFRQQUNQSV9EQkdfRVhJVCwKKwkJICAgICJjYW5jZWxsaW5nIGFueSBwZW5kaW5nIGZhbiB3YXRjaGRvZyB0YXNrc1xuIik7CiAKIAkvKiBGSVhNRTogY2FuIHdlIHJlYWxseSBkbyB0aGlzIHVuY29uZGl0aW9uYWxseT8gKi8KIAlzeXNmc19yZW1vdmVfZ3JvdXAoJnRwYWNwaV9zZW5zb3JzX3BkZXYtPmRldi5rb2JqLCAmZmFuX2F0dHJfZ3JvdXApOwotCWRyaXZlcl9yZW1vdmVfZmlsZSgmdHBhY3BpX2h3bW9uX3Bkcml2ZXIuZHJpdmVyLCAmZHJpdmVyX2F0dHJfZmFuX3dhdGNoZG9nKTsKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJnRwYWNwaV9od21vbl9wZHJpdmVyLmRyaXZlciwKKwkJCSAgICZkcml2ZXJfYXR0cl9mYW5fd2F0Y2hkb2cpOwogCiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmZmFuX3dhdGNoZG9nX3Rhc2spOwogCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CiB9CiAKLXN0YXRpYyBpbnQgZmFuX2dldF9zcGVlZCh1bnNpZ25lZCBpbnQgKnNwZWVkKQotewotCXU4IGhpLCBsbzsKLQotCXN3aXRjaCAoZmFuX3N0YXR1c19hY2Nlc3NfbW9kZSkgewotCWNhc2UgVFBBQ1BJX0ZBTl9SRF9UUEVDOgotCQkvKiBhbGwgZXhjZXB0IDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4ICovCi0JCWlmICh1bmxpa2VseSghYWNwaV9lY19yZWFkKGZhbl9ycG1fb2Zmc2V0LCAmbG8pIHx8Ci0JCQkgICAgICFhY3BpX2VjX3JlYWQoZmFuX3JwbV9vZmZzZXQgKyAxLCAmaGkpKSkKLQkJCXJldHVybiAtRUlPOwotCi0JCWlmIChsaWtlbHkoc3BlZWQpKQotCQkJKnNwZWVkID0gKGhpIDw8IDgpIHwgbG87Ci0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBmYW5fd2F0Y2hkb2dfZmlyZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmlnbm9yZWQpCi17Ci0JaW50IHJjOwotCi0JaWYgKHRwYWNwaV9saWZlY3ljbGUgIT0gVFBBQ1BJX0xJRkVfUlVOTklORykKLQkJcmV0dXJuOwotCi0JcHJpbnRrKElCTV9OT1RJQ0UgImZhbiB3YXRjaGRvZzogZW5hYmxpbmcgZmFuXG4iKTsKLQlyYyA9IGZhbl9zZXRfZW5hYmxlKCk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcmludGsoSUJNX0VSUiAiZmFuIHdhdGNoZG9nOiBlcnJvciAlZCB3aGlsZSBlbmFibGluZyBmYW4sICIKLQkJCSJ3aWxsIHRyeSBhZ2FpbiBsYXRlci4uLlxuIiwgLXJjKTsKLQkJLyogcmVzY2hlZHVsZSBmb3IgbGF0ZXIgKi8KLQkJZmFuX3dhdGNoZG9nX3Jlc2V0KCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBmYW5fd2F0Y2hkb2dfcmVzZXQodm9pZCkKLXsKLQlzdGF0aWMgaW50IGZhbl93YXRjaGRvZ19hY3RpdmU7Ci0KLQlpZiAoZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUgPT0gVFBBQ1BJX0ZBTl9XUl9OT05FKQotCQlyZXR1cm47Ci0KLQlpZiAoZmFuX3dhdGNoZG9nX2FjdGl2ZSkKLQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmZmFuX3dhdGNoZG9nX3Rhc2spOwotCi0JaWYgKGZhbl93YXRjaGRvZ19tYXhpbnRlcnZhbCA+IDAgJiYKLQkgICAgdHBhY3BpX2xpZmVjeWNsZSAhPSBUUEFDUElfTElGRV9FWElUSU5HKSB7Ci0JCWZhbl93YXRjaGRvZ19hY3RpdmUgPSAxOwotCQlpZiAoIXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZmFuX3dhdGNoZG9nX3Rhc2ssCi0JCQkJbXNlY3NfdG9famlmZmllcyhmYW5fd2F0Y2hkb2dfbWF4aW50ZXJ2YWwKLQkJCQkJCSAqIDEwMDApKSkgewotCQkJcHJpbnRrKElCTV9FUlIgImZhaWxlZCB0byBzY2hlZHVsZSB0aGUgZmFuIHdhdGNoZG9nLCAiCi0JCQkgICAgICAgIndhdGNoZG9nIHdpbGwgbm90IHRyaWdnZXJcbiIpOwotCQl9Ci0JfSBlbHNlCi0JCWZhbl93YXRjaGRvZ19hY3RpdmUgPSAwOwotfQotCi1zdGF0aWMgaW50IGZhbl9zZXRfbGV2ZWwoaW50IGxldmVsKQotewotCWlmICghZmFuX2NvbnRyb2xfYWxsb3dlZCkKLQkJcmV0dXJuIC1FUEVSTTsKLQotCXN3aXRjaCAoZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUpIHsKLQljYXNlIFRQQUNQSV9GQU5fV1JfQUNQSV9TRkFOOgotCQlpZiAobGV2ZWwgPj0gMCAmJiBsZXZlbCA8PSA3KSB7Ci0JCQlpZiAoIWFjcGlfZXZhbGYoc2Zhbl9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZCIsIGxldmVsKSkKLQkJCQlyZXR1cm4gLUVJTzsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJYnJlYWs7Ci0KLQljYXNlIFRQQUNQSV9GQU5fV1JfQUNQSV9GQU5TOgotCWNhc2UgVFBBQ1BJX0ZBTl9XUl9UUEVDOgotCQlpZiAoKGxldmVsICE9IFRQX0VDX0ZBTl9BVVRPKSAmJgotCQkgICAgKGxldmVsICE9IFRQX0VDX0ZBTl9GVUxMU1BFRUQpICYmCi0JCSAgICAoKGxldmVsIDwgMCkgfHwgKGxldmVsID4gNykpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJLyogc2FmZXR5IG5ldCBzaG91bGQgdGhlIEVDIG5vdCBzdXBwb3J0IEFVVE8KLQkJICogb3IgRlVMTFNQRUVEIG1vZGUgYml0cyBhbmQganVzdCBpZ25vcmUgdGhlbSAqLwotCQlpZiAobGV2ZWwgJiBUUF9FQ19GQU5fRlVMTFNQRUVEKQotCQkJbGV2ZWwgfD0gNzsJLyogc2FmZXR5IG1pbiBzcGVlZCA3ICovCi0JCWVsc2UgaWYgKGxldmVsICYgVFBfRUNfRkFOX0ZVTExTUEVFRCkKLQkJCWxldmVsIHw9IDQ7CS8qIHNhZmV0eSBtaW4gc3BlZWQgNCAqLwotCi0JCWlmICghYWNwaV9lY193cml0ZShmYW5fc3RhdHVzX29mZnNldCwgbGV2ZWwpKQotCQkJcmV0dXJuIC1FSU87Ci0JCWVsc2UKLQkJCXRwX2ZlYXR1cmVzLmZhbl9jdHJsX3N0YXR1c191bmRlZiA9IDA7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZmFuX3NldF9sZXZlbF9zYWZlKGludCBsZXZlbCkKLXsKLQlpbnQgcmM7Ci0KLQlpZiAoIWZhbl9jb250cm9sX2FsbG93ZWQpCi0JCXJldHVybiAtRVBFUk07Ci0KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZmYW5fbXV0ZXgpKQotCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCi0JaWYgKGxldmVsID09IFRQQUNQSV9GQU5fTEFTVF9MRVZFTCkKLQkJbGV2ZWwgPSBmYW5fY29udHJvbF9kZXNpcmVkX2xldmVsOwotCi0JcmMgPSBmYW5fc2V0X2xldmVsKGxldmVsKTsKLQlpZiAoIXJjKQotCQlmYW5fdXBkYXRlX2Rlc2lyZWRfbGV2ZWwobGV2ZWwpOwotCi0JbXV0ZXhfdW5sb2NrKCZmYW5fbXV0ZXgpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBmYW5fc2V0X2VuYWJsZSh2b2lkKQotewotCXU4IHM7Ci0JaW50IHJjOwotCi0JaWYgKCFmYW5fY29udHJvbF9hbGxvd2VkKQotCQlyZXR1cm4gLUVQRVJNOwotCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZmFuX211dGV4KSkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQotCXN3aXRjaCAoZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUpIHsKLQljYXNlIFRQQUNQSV9GQU5fV1JfQUNQSV9GQU5TOgotCWNhc2UgVFBBQ1BJX0ZBTl9XUl9UUEVDOgotCQlyYyA9IGZhbl9nZXRfc3RhdHVzKCZzKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWJyZWFrOwotCi0JCS8qIERvbid0IGdvIG91dCBvZiBlbWVyZ2VuY3kgZmFuIG1vZGUgKi8KLQkJaWYgKHMgIT0gNykgewotCQkJcyAmPSAweDA3OwotCQkJcyB8PSBUUF9FQ19GQU5fQVVUTyB8IDQ7IC8qIG1pbiBmYW4gc3BlZWQgNCAqLwotCQl9Ci0KLQkJaWYgKCFhY3BpX2VjX3dyaXRlKGZhbl9zdGF0dXNfb2Zmc2V0LCBzKSkKLQkJCXJjID0gLUVJTzsKLQkJZWxzZSB7Ci0JCQl0cF9mZWF0dXJlcy5mYW5fY3RybF9zdGF0dXNfdW5kZWYgPSAwOwotCQkJcmMgPSAwOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBUUEFDUElfRkFOX1dSX0FDUElfU0ZBTjoKLQkJcmMgPSBmYW5fZ2V0X3N0YXR1cygmcyk7Ci0JCWlmIChyYyA8IDApCi0JCQlicmVhazsKLQotCQlzICY9IDB4MDc7Ci0KLQkJLyogU2V0IGZhbiB0byBhdCBsZWFzdCBsZXZlbCA0ICovCi0JCXMgfD0gNDsKLQotCQlpZiAoIWFjcGlfZXZhbGYoc2Zhbl9oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZCIsIHMpKQotCQkJcmM9IC1FSU87Ci0JCWVsc2UKLQkJCXJjID0gMDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyYyA9IC1FTlhJTzsKLQl9Ci0KLQltdXRleF91bmxvY2soJmZhbl9tdXRleCk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGZhbl9zZXRfZGlzYWJsZSh2b2lkKQotewotCWludCByYzsKLQotCWlmICghZmFuX2NvbnRyb2xfYWxsb3dlZCkKLQkJcmV0dXJuIC1FUEVSTTsKLQotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmZhbl9tdXRleCkpCi0JCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0KLQlyYyA9IDA7Ci0Jc3dpdGNoIChmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSkgewotCWNhc2UgVFBBQ1BJX0ZBTl9XUl9BQ1BJX0ZBTlM6Ci0JY2FzZSBUUEFDUElfRkFOX1dSX1RQRUM6Ci0JCWlmICghYWNwaV9lY193cml0ZShmYW5fc3RhdHVzX29mZnNldCwgMHgwMCkpCi0JCQlyYyA9IC1FSU87Ci0JCWVsc2UgewotCQkJZmFuX2NvbnRyb2xfZGVzaXJlZF9sZXZlbCA9IDA7Ci0JCQl0cF9mZWF0dXJlcy5mYW5fY3RybF9zdGF0dXNfdW5kZWYgPSAwOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBUUEFDUElfRkFOX1dSX0FDUElfU0ZBTjoKLQkJaWYgKCFhY3BpX2V2YWxmKHNmYW5faGFuZGxlLCBOVUxMLCBOVUxMLCAidmQiLCAweDAwKSkKLQkJCXJjID0gLUVJTzsKLQkJZWxzZQotCQkJZmFuX2NvbnRyb2xfZGVzaXJlZF9sZXZlbCA9IDA7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmMgPSAtRU5YSU87Ci0JfQotCi0KLQltdXRleF91bmxvY2soJmZhbl9tdXRleCk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGZhbl9zZXRfc3BlZWQoaW50IHNwZWVkKQotewotCWludCByYzsKLQotCWlmICghZmFuX2NvbnRyb2xfYWxsb3dlZCkKLQkJcmV0dXJuIC1FUEVSTTsKLQotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmZhbl9tdXRleCkpCi0JCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0KLQlyYyA9IDA7Ci0Jc3dpdGNoIChmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSkgewotCWNhc2UgVFBBQ1BJX0ZBTl9XUl9BQ1BJX0ZBTlM6Ci0JCWlmIChzcGVlZCA+PSAwICYmIHNwZWVkIDw9IDY1NTM1KSB7Ci0JCQlpZiAoIWFjcGlfZXZhbGYoZmFuc19oYW5kbGUsIE5VTEwsIE5VTEwsICJ2ZGRkIiwKLQkJCQkJc3BlZWQsIHNwZWVkLCBzcGVlZCkpCi0JCQkJcmMgPSAtRUlPOwotCQl9IGVsc2UKLQkJCXJjID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyYyA9IC1FTlhJTzsKLQl9Ci0KLQltdXRleF91bmxvY2soJmZhbl9tdXRleCk7Ci0JcmV0dXJuIHJjOwotfQotCiBzdGF0aWMgaW50IGZhbl9yZWFkKGNoYXIgKnApCiB7CiAJaW50IGxlbiA9IDA7CkBAIC00MzA3LDcgKzUzNDksOCBAQAogCXN3aXRjaCAoZmFuX3N0YXR1c19hY2Nlc3NfbW9kZSkgewogCWNhc2UgVFBBQ1BJX0ZBTl9SRF9BQ1BJX0dGQU46CiAJCS8qIDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4ICovCi0JCWlmICgocmMgPSBmYW5fZ2V0X3N0YXR1c19zYWZlKCZzdGF0dXMpKSA8IDApCisJCXJjID0gZmFuX2dldF9zdGF0dXNfc2FmZSgmc3RhdHVzKTsKKwkJaWYgKHJjIDwgMCkKIAkJCXJldHVybiByYzsKIAogCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHQlc1xuIgpAQCAtNDMxNyw3ICs1MzYwLDggQEAKIAogCWNhc2UgVFBBQ1BJX0ZBTl9SRF9UUEVDOgogCQkvKiBhbGwgZXhjZXB0IDU3MCwgNjAwZS94LCA3NzBlLCA3NzB4ICovCi0JCWlmICgocmMgPSBmYW5fZ2V0X3N0YXR1c19zYWZlKCZzdGF0dXMpKSA8IDApCisJCXJjID0gZmFuX2dldF9zdGF0dXNfc2FmZSgmc3RhdHVzKTsKKwkJaWYgKHJjIDwgMCkKIAkJCXJldHVybiByYzsKIAogCQlpZiAodW5saWtlbHkodHBfZmVhdHVyZXMuZmFuX2N0cmxfc3RhdHVzX3VuZGVmKSkgewpAQCAtNDMzMiw3ICs1Mzc2LDggQEAKIAkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInN0YXR1czpcdFx0JXNcbiIsCiAJCQkgICAgICAgKHN0YXR1cyAhPSAwKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwogCi0JCWlmICgocmMgPSBmYW5fZ2V0X3NwZWVkKCZzcGVlZCkpIDwgMCkKKwkJcmMgPSBmYW5fZ2V0X3NwZWVkKCZzcGVlZCk7CisJCWlmIChyYyA8IDApCiAJCQlyZXR1cm4gcmM7CiAKIAkJbGVuICs9IHNwcmludGYocCArIGxlbiwgInNwZWVkOlx0XHQlZFxuIiwgc3BlZWQpOwpAQCAtNDM2OCw4ICs1NDEzLDggQEAKIAogCWlmIChmYW5fY29udHJvbF9jb21tYW5kcyAmIFRQQUNQSV9GQU5fQ01EX0VOQUJMRSkKIAkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0ZW5hYmxlLCBkaXNhYmxlXG4iCi0JCQkgICAgICAgImNvbW1hbmRzOlx0d2F0Y2hkb2cgPHRpbWVvdXQ+ICg8dGltZW91dD4gaXMgMCAob2ZmKSwgIgotCQkJICAgICAgICIxLTEyMCAoc2Vjb25kcykpXG4iKTsKKwkJCSAgICAgICAiY29tbWFuZHM6XHR3YXRjaGRvZyA8dGltZW91dD4gKDx0aW1lb3V0PiAiCisJCQkgICAgICAgImlzIDAgKG9mZiksIDEtMTIwIChzZWNvbmRzKSlcbiIpOwogCiAJaWYgKGZhbl9jb250cm9sX2NvbW1hbmRzICYgVFBBQ1BJX0ZBTl9DTURfU1BFRUQpCiAJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJjb21tYW5kczpcdHNwZWVkIDxzcGVlZD4iCkBAIC00Mzg1LDEzICs1NDMwLDE0IEBACiAJaWYgKHN0cmxlbmNtcChjbWQsICJsZXZlbCBhdXRvIikgPT0gMCkKIAkJbGV2ZWwgPSBUUF9FQ19GQU5fQVVUTzsKIAllbHNlIGlmICgoc3RybGVuY21wKGNtZCwgImxldmVsIGRpc2VuZ2FnZWQiKSA9PSAwKSB8Ci0JICAgICAgICAgKHN0cmxlbmNtcChjbWQsICJsZXZlbCBmdWxsLXNwZWVkIikgPT0gMCkpCisJCQkoc3RybGVuY21wKGNtZCwgImxldmVsIGZ1bGwtc3BlZWQiKSA9PSAwKSkKIAkJbGV2ZWwgPSBUUF9FQ19GQU5fRlVMTFNQRUVEOwogCWVsc2UgaWYgKHNzY2FuZihjbWQsICJsZXZlbCAlZCIsICZsZXZlbCkgIT0gMSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoKCpyYyA9IGZhbl9zZXRfbGV2ZWxfc2FmZShsZXZlbCkpID09IC1FTlhJTykKLQkJcHJpbnRrKElCTV9FUlIgImxldmVsIGNvbW1hbmQgYWNjZXB0ZWQgZm9yIHVuc3VwcG9ydGVkICIKKwkqcmMgPSBmYW5fc2V0X2xldmVsX3NhZmUobGV2ZWwpOworCWlmICgqcmMgPT0gLUVOWElPKQorCQlwcmludGsoVFBBQ1BJX0VSUiAibGV2ZWwgY29tbWFuZCBhY2NlcHRlZCBmb3IgdW5zdXBwb3J0ZWQgIgogCQkgICAgICAgImFjY2VzcyBtb2RlICVkIiwgZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUpOwogCiAJcmV0dXJuIDE7CkBAIC00NDAyLDggKzU0NDgsOSBAQAogCWlmIChzdHJsZW5jbXAoY21kLCAiZW5hYmxlIikgIT0gMCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoKCpyYyA9IGZhbl9zZXRfZW5hYmxlKCkpID09IC1FTlhJTykKLQkJcHJpbnRrKElCTV9FUlIgImVuYWJsZSBjb21tYW5kIGFjY2VwdGVkIGZvciB1bnN1cHBvcnRlZCAiCisJKnJjID0gZmFuX3NldF9lbmFibGUoKTsKKwlpZiAoKnJjID09IC1FTlhJTykKKwkJcHJpbnRrKFRQQUNQSV9FUlIgImVuYWJsZSBjb21tYW5kIGFjY2VwdGVkIGZvciB1bnN1cHBvcnRlZCAiCiAJCSAgICAgICAiYWNjZXNzIG1vZGUgJWQiLCBmYW5fY29udHJvbF9hY2Nlc3NfbW9kZSk7CiAKIAlyZXR1cm4gMTsKQEAgLTQ0MTQsOCArNTQ2MSw5IEBACiAJaWYgKHN0cmxlbmNtcChjbWQsICJkaXNhYmxlIikgIT0gMCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoKCpyYyA9IGZhbl9zZXRfZGlzYWJsZSgpKSA9PSAtRU5YSU8pCi0JCXByaW50ayhJQk1fRVJSICJkaXNhYmxlIGNvbW1hbmQgYWNjZXB0ZWQgZm9yIHVuc3VwcG9ydGVkICIKKwkqcmMgPSBmYW5fc2V0X2Rpc2FibGUoKTsKKwlpZiAoKnJjID09IC1FTlhJTykKKwkJcHJpbnRrKFRQQUNQSV9FUlIgImRpc2FibGUgY29tbWFuZCBhY2NlcHRlZCBmb3IgdW5zdXBwb3J0ZWQgIgogCQkgICAgICAgImFjY2VzcyBtb2RlICVkIiwgZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUpOwogCiAJcmV0dXJuIDE7CkBAIC00NDMxLDggKzU0NzksOSBAQAogCWlmIChzc2NhbmYoY21kLCAic3BlZWQgJWQiLCAmc3BlZWQpICE9IDEpCiAJCXJldHVybiAwOwogCi0JaWYgKCgqcmMgPSBmYW5fc2V0X3NwZWVkKHNwZWVkKSkgPT0gLUVOWElPKQotCQlwcmludGsoSUJNX0VSUiAic3BlZWQgY29tbWFuZCBhY2NlcHRlZCBmb3IgdW5zdXBwb3J0ZWQgIgorCSpyYyA9IGZhbl9zZXRfc3BlZWQoc3BlZWQpOworCWlmICgqcmMgPT0gLUVOWElPKQorCQlwcmludGsoVFBBQ1BJX0VSUiAic3BlZWQgY29tbWFuZCBhY2NlcHRlZCBmb3IgdW5zdXBwb3J0ZWQgIgogCQkgICAgICAgImFjY2VzcyBtb2RlICVkIiwgZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUpOwogCiAJcmV0dXJuIDE7CkBAIC00NDk2LDcgKzU1NDUsNyBAQAogCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgICBjaGFyICpidWYpCiB7Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIElCTV9OQU1FKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgVFBBQ1BJX05BTUUpOwogfQogCiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfdGhpbmtwYWRfYWNwaV9wZGV2X25hbWUgPQpAQCAtNDUwNywxNCArNTU1NiwxMiBAQAogLyogL3Byb2Mgc3VwcG9ydCAqLwogc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19kaXI7CiAKLS8qIFN1YmRyaXZlciByZWdpc3RyeSAqLwotc3RhdGljIExJU1RfSEVBRCh0cGFjcGlfYWxsX2RyaXZlcnMpOwotCi0KIC8qCiAgKiBNb2R1bGUgYW5kIGluZnJhc3RydWN0dXJlIHByb2JsZSwgaW5pdCBhbmQgZXhpdCBoYW5kbGluZwogICovCiAKK3N0YXRpYyBpbnQgZm9yY2VfbG9hZDsKKwogI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0RFQlVHCiBzdGF0aWMgY29uc3QgY2hhciAqIF9faW5pdCBzdHJfc3VwcG9ydGVkKGludCBpc19zdXBwb3J0ZWQpCiB7CkBAIC00NTI0LDg2ICs1NTcxLDYgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfVEhJTktQQURfQUNQSV9ERUJVRyAqLwogCi1zdGF0aWMgaW50IF9faW5pdCBpYm1faW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKQotewotCWludCByZXQ7Ci0Jc3RydWN0IGlibV9zdHJ1Y3QgKmlibSA9IGlpYm0tPmRhdGE7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKLQotCUJVR19PTihpYm0gPT0gTlVMTCk7Ci0KLQlJTklUX0xJU1RfSEVBRCgmaWJtLT5hbGxfZHJpdmVycyk7Ci0KLQlpZiAoaWJtLT5mbGFncy5leHBlcmltZW50YWwgJiYgIWV4cGVyaW1lbnRhbCkKLQkJcmV0dXJuIDA7Ci0KLQlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKLQkJInByb2JpbmcgZm9yICVzXG4iLCBpYm0tPm5hbWUpOwotCi0JaWYgKGlpYm0tPmluaXQpIHsKLQkJcmV0ID0gaWlibS0+aW5pdChpaWJtKTsKLQkJaWYgKHJldCA+IDApCi0JCQlyZXR1cm4gMDsJLyogcHJvYmUgZmFpbGVkICovCi0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCi0JCWlibS0+ZmxhZ3MuaW5pdF9jYWxsZWQgPSAxOwotCX0KLQotCWlmIChpYm0tPmFjcGkpIHsKLQkJaWYgKGlibS0+YWNwaS0+aGlkKSB7Ci0JCQlyZXQgPSByZWdpc3Rlcl90cGFjcGlfc3ViZHJpdmVyKGlibSk7Ci0JCQlpZiAocmV0KQotCQkJCWdvdG8gZXJyX291dDsKLQkJfQotCi0JCWlmIChpYm0tPmFjcGktPm5vdGlmeSkgewotCQkJcmV0ID0gc2V0dXBfYWNwaV9ub3RpZnkoaWJtKTsKLQkJCWlmIChyZXQgPT0gLUVOT0RFVikgewotCQkJCXByaW50ayhJQk1fTk9USUNFICJkaXNhYmxpbmcgc3ViZHJpdmVyICVzXG4iLAotCQkJCQlpYm0tPm5hbWUpOwotCQkJCXJldCA9IDA7Ci0JCQkJZ290byBlcnJfb3V0OwotCQkJfQotCQkJaWYgKHJldCA8IDApCi0JCQkJZ290byBlcnJfb3V0OwotCQl9Ci0JfQotCi0JZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsCi0JCSIlcyBpbnN0YWxsZWRcbiIsIGlibS0+bmFtZSk7Ci0KLQlpZiAoaWJtLT5yZWFkKSB7Ci0JCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoaWJtLT5uYW1lLAotCQkJCQkgIFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJCQkJICBwcm9jX2Rpcik7Ci0JCWlmICghZW50cnkpIHsKLQkJCXByaW50ayhJQk1fRVJSICJ1bmFibGUgdG8gY3JlYXRlIHByb2MgZW50cnkgJXNcbiIsCi0JCQkgICAgICAgaWJtLT5uYW1lKTsKLQkJCXJldCA9IC1FTk9ERVY7Ci0JCQlnb3RvIGVycl9vdXQ7Ci0JCX0KLQkJZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7Ci0JCWVudHJ5LT5kYXRhID0gaWJtOwotCQllbnRyeS0+cmVhZF9wcm9jID0gJmRpc3BhdGNoX3Byb2Nmc19yZWFkOwotCQlpZiAoaWJtLT53cml0ZSkKLQkJCWVudHJ5LT53cml0ZV9wcm9jID0gJmRpc3BhdGNoX3Byb2Nmc193cml0ZTsKLQkJaWJtLT5mbGFncy5wcm9jX2NyZWF0ZWQgPSAxOwotCX0KLQotCWxpc3RfYWRkX3RhaWwoJmlibS0+YWxsX2RyaXZlcnMsICZ0cGFjcGlfYWxsX2RyaXZlcnMpOwotCi0JcmV0dXJuIDA7Ci0KLWVycl9vdXQ6Ci0JZGJnX3ByaW50ayhUUEFDUElfREJHX0lOSVQsCi0JCSIlczogYXQgZXJyb3IgZXhpdCBwYXRoIHdpdGggcmVzdWx0ICVkXG4iLAotCQlpYm0tPm5hbWUsIHJldCk7Ci0KLQlpYm1fZXhpdChpYm0pOwotCXJldHVybiAocmV0IDwgMCk/IHJldCA6IDA7Ci19Ci0KIHN0YXRpYyB2b2lkIGlibV9leGl0KHN0cnVjdCBpYm1fc3RydWN0ICppYm0pCiB7CiAJZGJnX3ByaW50ayhUUEFDUElfREJHX0VYSVQsICJyZW1vdmluZyAlc1xuIiwgaWJtLT5uYW1lKTsKQEAgLTQ2NDYsNiArNTYxMyw4NiBAQAogCWRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULCAiZmluaXNoZWQgcmVtb3ZpbmcgJXNcbiIsIGlibS0+bmFtZSk7CiB9CiAKK3N0YXRpYyBpbnQgX19pbml0IGlibV9pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtID0gaWlibS0+ZGF0YTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OworCisJQlVHX09OKGlibSA9PSBOVUxMKTsKKworCUlOSVRfTElTVF9IRUFEKCZpYm0tPmFsbF9kcml2ZXJzKTsKKworCWlmIChpYm0tPmZsYWdzLmV4cGVyaW1lbnRhbCAmJiAhZXhwZXJpbWVudGFsKQorCQlyZXR1cm4gMDsKKworCWRiZ19wcmludGsoVFBBQ1BJX0RCR19JTklULAorCQkicHJvYmluZyBmb3IgJXNcbiIsIGlibS0+bmFtZSk7CisKKwlpZiAoaWlibS0+aW5pdCkgeworCQlyZXQgPSBpaWJtLT5pbml0KGlpYm0pOworCQlpZiAocmV0ID4gMCkKKwkJCXJldHVybiAwOwkvKiBwcm9iZSBmYWlsZWQgKi8KKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWJtLT5mbGFncy5pbml0X2NhbGxlZCA9IDE7CisJfQorCisJaWYgKGlibS0+YWNwaSkgeworCQlpZiAoaWJtLT5hY3BpLT5oaWQpIHsKKwkJCXJldCA9IHJlZ2lzdGVyX3RwYWNwaV9zdWJkcml2ZXIoaWJtKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBlcnJfb3V0OworCQl9CisKKwkJaWYgKGlibS0+YWNwaS0+bm90aWZ5KSB7CisJCQlyZXQgPSBzZXR1cF9hY3BpX25vdGlmeShpYm0pOworCQkJaWYgKHJldCA9PSAtRU5PREVWKSB7CisJCQkJcHJpbnRrKFRQQUNQSV9OT1RJQ0UgImRpc2FibGluZyBzdWJkcml2ZXIgJXNcbiIsCisJCQkJCWlibS0+bmFtZSk7CisJCQkJcmV0ID0gMDsKKwkJCQlnb3RvIGVycl9vdXQ7CisJCQl9CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwl9CisKKwlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKKwkJIiVzIGluc3RhbGxlZFxuIiwgaWJtLT5uYW1lKTsKKworCWlmIChpYm0tPnJlYWQpIHsKKwkJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShpYm0tPm5hbWUsCisJCQkJCSAgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJCQkgIHByb2NfZGlyKTsKKwkJaWYgKCFlbnRyeSkgeworCQkJcHJpbnRrKFRQQUNQSV9FUlIgInVuYWJsZSB0byBjcmVhdGUgcHJvYyBlbnRyeSAlc1xuIiwKKwkJCSAgICAgICBpYm0tPm5hbWUpOworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQllbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwkJZW50cnktPmRhdGEgPSBpYm07CisJCWVudHJ5LT5yZWFkX3Byb2MgPSAmZGlzcGF0Y2hfcHJvY2ZzX3JlYWQ7CisJCWlmIChpYm0tPndyaXRlKQorCQkJZW50cnktPndyaXRlX3Byb2MgPSAmZGlzcGF0Y2hfcHJvY2ZzX3dyaXRlOworCQlpYm0tPmZsYWdzLnByb2NfY3JlYXRlZCA9IDE7CisJfQorCisJbGlzdF9hZGRfdGFpbCgmaWJtLT5hbGxfZHJpdmVycywgJnRwYWNwaV9hbGxfZHJpdmVycyk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwlkYmdfcHJpbnRrKFRQQUNQSV9EQkdfSU5JVCwKKwkJIiVzOiBhdCBlcnJvciBleGl0IHBhdGggd2l0aCByZXN1bHQgJWRcbiIsCisJCWlibS0+bmFtZSwgcmV0KTsKKworCWlibV9leGl0KGlibSk7CisJcmV0dXJuIChyZXQgPCAwKT8gcmV0IDogMDsKK30KKwogLyogUHJvYmluZyAqLwogCiBzdGF0aWMgdm9pZCBfX2luaXQgZ2V0X3RoaW5rcGFkX21vZGVsX2RhdGEoc3RydWN0IHRoaW5rcGFkX2lkX2RhdGEgKnRwKQpAQCAtNDcxNSwxMCArNTc2MiwxMCBAQAogCWlzX3RoaW5rcGFkID0gKHRoaW5rcGFkX2lkLm1vZGVsX3N0ciAhPSBOVUxMKTsKIAogCS8qIGVjIGlzIHJlcXVpcmVkIGJlY2F1c2UgbWFueSBvdGhlciBoYW5kbGVzIGFyZSByZWxhdGl2ZSB0byBpdCAqLwotCUlCTV9BQ1BJSEFORExFX0lOSVQoZWMpOworCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQoZWMpOwogCWlmICghZWNfaGFuZGxlKSB7CiAJCWlmIChpc190aGlua3BhZCkKLQkJCXByaW50ayhJQk1fRVJSCisJCQlwcmludGsoVFBBQ1BJX0VSUgogCQkJCSJOb3QgeWV0IHN1cHBvcnRlZCBUaGlua1BhZCBkZXRlY3RlZCFcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC00ODM5LDE4NCArNTg4Niw1OCBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgaW50IGV4cGVyaW1lbnRhbDsKIG1vZHVsZV9wYXJhbShleHBlcmltZW50YWwsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGV4cGVyaW1lbnRhbCwKKwkJICJFbmFibGVzIGV4cGVyaW1lbnRhbCBmZWF0dXJlcyB3aGVuIG5vbi16ZXJvIik7CiAKLXN0YXRpYyB1MzIgZGJnX2xldmVsOwogbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBkYmdfbGV2ZWwsIHVpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlNldHMgZGVidWcgbGV2ZWwgYml0LW1hc2siKTsKIAotc3RhdGljIGludCBmb3JjZV9sb2FkOwogbW9kdWxlX3BhcmFtKGZvcmNlX2xvYWQsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9sb2FkLAorCQkgIkF0dGVtcHRzIHRvIGxvYWQgdGhlIGRyaXZlciBldmVuIG9uIGEgIgorCQkgIm1pcy1pZGVudGlmaWVkIFRoaW5rUGFkIHdoZW4gdHJ1ZSIpOwogCi1zdGF0aWMgaW50IGZhbl9jb250cm9sX2FsbG93ZWQ7CiBtb2R1bGVfcGFyYW1fbmFtZWQoZmFuX2NvbnRyb2wsIGZhbl9jb250cm9sX2FsbG93ZWQsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhmYW5fY29udHJvbCwKKwkJICJFbmFibGVzIHNldHRpbmcgZmFuIHBhcmFtZXRlcnMgZmVhdHVyZXMgd2hlbiB0cnVlIik7CiAKLXN0YXRpYyBpbnQgYnJpZ2h0bmVzc19tb2RlOwogbW9kdWxlX3BhcmFtX25hbWVkKGJyaWdodG5lc3NfbW9kZSwgYnJpZ2h0bmVzc19tb2RlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhicmlnaHRuZXNzX21vZGUsCisJCSAiU2VsZWN0cyBicmlnaHRuZXNzIGNvbnRyb2wgc3RyYXRlZ3k6ICIKKwkJICIwPWF1dG8sIDE9RUMsIDI9Q01PUywgMz1ib3RoIik7CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgYnJpZ2h0bmVzc19lbmFibGUgPSAyOyAvKiAyID0gYXV0bywgMCA9IG5vLCAxID0geWVzICovCiBtb2R1bGVfcGFyYW0oYnJpZ2h0bmVzc19lbmFibGUsIHVpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhicmlnaHRuZXNzX2VuYWJsZSwKKwkJICJFbmFibGVzIGJhY2tsaWdodCBjb250cm9sIHdoZW4gMSwgZGlzYWJsZXMgd2hlbiAwIik7CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaG90a2V5X3JlcG9ydF9tb2RlOwogbW9kdWxlX3BhcmFtKGhvdGtleV9yZXBvcnRfbW9kZSwgdWludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGhvdGtleV9yZXBvcnRfbW9kZSwKKwkJICJ1c2VkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIHVzZXJzcGFjZSwgIgorCQkgInNlZSBkb2N1bWVudGF0aW9uIik7CiAKLSNkZWZpbmUgSUJNX1BBUkFNKGZlYXR1cmUpIFwKLQltb2R1bGVfcGFyYW1fY2FsbChmZWF0dXJlLCBzZXRfaWJtX3BhcmFtLCBOVUxMLCBOVUxMLCAwKQorI2RlZmluZSBUUEFDUElfUEFSQU0oZmVhdHVyZSkgXAorCW1vZHVsZV9wYXJhbV9jYWxsKGZlYXR1cmUsIHNldF9pYm1fcGFyYW0sIE5VTEwsIE5VTEwsIDApOyBcCisJTU9EVUxFX1BBUk1fREVTQyhmZWF0dXJlLCAiU2ltdWxhdGVzIHRoaW5rcGFkLWFjaSBwcm9jZnMgY29tbWFuZCAiIFwKKwkJCSAiYXQgbW9kdWxlIGxvYWQsIHNlZSBkb2N1bWVudGF0aW9uIikKIAotSUJNX1BBUkFNKGhvdGtleSk7Ci1JQk1fUEFSQU0oYmx1ZXRvb3RoKTsKLUlCTV9QQVJBTSh2aWRlbyk7Ci1JQk1fUEFSQU0obGlnaHQpOworVFBBQ1BJX1BBUkFNKGhvdGtleSk7CitUUEFDUElfUEFSQU0oYmx1ZXRvb3RoKTsKK1RQQUNQSV9QQVJBTSh2aWRlbyk7CitUUEFDUElfUEFSQU0obGlnaHQpOwogI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0RPQ0sKLUlCTV9QQVJBTShkb2NrKTsKK1RQQUNQSV9QQVJBTShkb2NrKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0JBWQotSUJNX1BBUkFNKGJheSk7CitUUEFDUElfUEFSQU0oYmF5KTsKICNlbmRpZiAvKiBDT05GSUdfVEhJTktQQURfQUNQSV9CQVkgKi8KLUlCTV9QQVJBTShjbW9zKTsKLUlCTV9QQVJBTShsZWQpOwotSUJNX1BBUkFNKGJlZXApOwotSUJNX1BBUkFNKGVjZHVtcCk7Ci1JQk1fUEFSQU0oYnJpZ2h0bmVzcyk7Ci1JQk1fUEFSQU0odm9sdW1lKTsKLUlCTV9QQVJBTShmYW4pOwotCi1zdGF0aWMgaW50IF9faW5pdCB0aGlua3BhZF9hY3BpX21vZHVsZV9pbml0KHZvaWQpCi17Ci0JaW50IHJldCwgaTsKLQotCXRwYWNwaV9saWZlY3ljbGUgPSBUUEFDUElfTElGRV9JTklUOwotCi0JLyogUGFyYW1ldGVyIGNoZWNraW5nICovCi0JaWYgKGhvdGtleV9yZXBvcnRfbW9kZSA+IDIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogRHJpdmVyLWxldmVsIHByb2JlICovCi0KLQlnZXRfdGhpbmtwYWRfbW9kZWxfZGF0YSgmdGhpbmtwYWRfaWQpOwotCXJldCA9IHByb2JlX2Zvcl90aGlua3BhZCgpOwotCWlmIChyZXQpIHsKLQkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qIERyaXZlciBpbml0aWFsaXphdGlvbiAqLwotCi0JSUJNX0FDUElIQU5ETEVfSU5JVChlY3JkKTsKLQlJQk1fQUNQSUhBTkRMRV9JTklUKGVjd3IpOwotCi0JcHJvY19kaXIgPSBwcm9jX21rZGlyKElCTV9QUk9DX0RJUiwgYWNwaV9yb290X2Rpcik7Ci0JaWYgKCFwcm9jX2RpcikgewotCQlwcmludGsoSUJNX0VSUiAidW5hYmxlIHRvIGNyZWF0ZSBwcm9jIGRpciAiIElCTV9QUk9DX0RJUik7Ci0JCXRoaW5rcGFkX2FjcGlfbW9kdWxlX2V4aXQoKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXByb2NfZGlyLT5vd25lciA9IFRISVNfTU9EVUxFOwotCi0JcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ0cGFjcGlfcGRyaXZlcik7Ci0JaWYgKHJldCkgewotCQlwcmludGsoSUJNX0VSUiAidW5hYmxlIHRvIHJlZ2lzdGVyIG1haW4gcGxhdGZvcm0gZHJpdmVyXG4iKTsKLQkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOwotCQlyZXR1cm4gcmV0OwotCX0KLQl0cF9mZWF0dXJlcy5wbGF0Zm9ybV9kcnZfcmVnaXN0ZXJlZCA9IDE7Ci0KLQlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRwYWNwaV9od21vbl9wZHJpdmVyKTsKLQlpZiAocmV0KSB7Ci0JCXByaW50ayhJQk1fRVJSICJ1bmFibGUgdG8gcmVnaXN0ZXIgaHdtb24gcGxhdGZvcm0gZHJpdmVyXG4iKTsKLQkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOwotCQlyZXR1cm4gcmV0OwotCX0KLQl0cF9mZWF0dXJlcy5zZW5zb3JzX3BkcnZfcmVnaXN0ZXJlZCA9IDE7Ci0KLQlyZXQgPSB0cGFjcGlfY3JlYXRlX2RyaXZlcl9hdHRyaWJ1dGVzKCZ0cGFjcGlfcGRyaXZlci5kcml2ZXIpOwotCWlmICghcmV0KSB7Ci0JCXRwX2ZlYXR1cmVzLnBsYXRmb3JtX2Rydl9hdHRyc19yZWdpc3RlcmVkID0gMTsKLQkJcmV0ID0gdHBhY3BpX2NyZWF0ZV9kcml2ZXJfYXR0cmlidXRlcygmdHBhY3BpX2h3bW9uX3Bkcml2ZXIuZHJpdmVyKTsKLQl9Ci0JaWYgKHJldCkgewotCQlwcmludGsoSUJNX0VSUiAidW5hYmxlIHRvIGNyZWF0ZSBzeXNmcyBkcml2ZXIgYXR0cmlidXRlc1xuIik7Ci0JCXRoaW5rcGFkX2FjcGlfbW9kdWxlX2V4aXQoKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JdHBfZmVhdHVyZXMuc2Vuc29yc19wZHJ2X2F0dHJzX3JlZ2lzdGVyZWQgPSAxOwotCi0KLQkvKiBEZXZpY2UgaW5pdGlhbGl6YXRpb24gKi8KLQl0cGFjcGlfcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoSUJNX0RSVlJfTkFNRSwgLTEsCi0JCQkJCQkJTlVMTCwgMCk7Ci0JaWYgKElTX0VSUih0cGFjcGlfcGRldikpIHsKLQkJcmV0ID0gUFRSX0VSUih0cGFjcGlfcGRldik7Ci0JCXRwYWNwaV9wZGV2ID0gTlVMTDsKLQkJcHJpbnRrKElCTV9FUlIgInVuYWJsZSB0byByZWdpc3RlciBwbGF0Zm9ybSBkZXZpY2VcbiIpOwotCQl0aGlua3BhZF9hY3BpX21vZHVsZV9leGl0KCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXRwYWNwaV9zZW5zb3JzX3BkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKAotCQkJCQkJCUlCTV9IV01PTl9EUlZSX05BTUUsCi0JCQkJCQkJLTEsIE5VTEwsIDApOwotCWlmIChJU19FUlIodHBhY3BpX3NlbnNvcnNfcGRldikpIHsKLQkJcmV0ID0gUFRSX0VSUih0cGFjcGlfc2Vuc29yc19wZGV2KTsKLQkJdHBhY3BpX3NlbnNvcnNfcGRldiA9IE5VTEw7Ci0JCXByaW50ayhJQk1fRVJSICJ1bmFibGUgdG8gcmVnaXN0ZXIgaHdtb24gcGxhdGZvcm0gZGV2aWNlXG4iKTsKLQkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnRwYWNwaV9zZW5zb3JzX3BkZXYtPmRldiwKLQkJCQkgJmRldl9hdHRyX3RoaW5rcGFkX2FjcGlfcGRldl9uYW1lKTsKLQlpZiAocmV0KSB7Ci0JCXByaW50ayhJQk1fRVJSCi0JCQkidW5hYmxlIHRvIGNyZWF0ZSBzeXNmcyBod21vbiBkZXZpY2UgYXR0cmlidXRlc1xuIik7Ci0JCXRoaW5rcGFkX2FjcGlfbW9kdWxlX2V4aXQoKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JdHBfZmVhdHVyZXMuc2Vuc29yc19wZGV2X2F0dHJzX3JlZ2lzdGVyZWQgPSAxOwotCXRwYWNwaV9od21vbiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmdHBhY3BpX3NlbnNvcnNfcGRldi0+ZGV2KTsKLQlpZiAoSVNfRVJSKHRwYWNwaV9od21vbikpIHsKLQkJcmV0ID0gUFRSX0VSUih0cGFjcGlfaHdtb24pOwotCQl0cGFjcGlfaHdtb24gPSBOVUxMOwotCQlwcmludGsoSUJNX0VSUiAidW5hYmxlIHRvIHJlZ2lzdGVyIGh3bW9uIGRldmljZVxuIik7Ci0JCXRoaW5rcGFkX2FjcGlfbW9kdWxlX2V4aXQoKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JbXV0ZXhfaW5pdCgmdHBhY3BpX2lucHV0ZGV2X3NlbmRfbXV0ZXgpOwotCXRwYWNwaV9pbnB1dGRldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwotCWlmICghdHBhY3BpX2lucHV0ZGV2KSB7Ci0JCXByaW50ayhJQk1fRVJSICJ1bmFibGUgdG8gYWxsb2NhdGUgaW5wdXQgZGV2aWNlXG4iKTsKLQkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9IGVsc2UgewotCQkvKiBQcmVwYXJlIGlucHV0IGRldmljZSwgYnV0IGRvbid0IHJlZ2lzdGVyICovCi0JCXRwYWNwaV9pbnB1dGRldi0+bmFtZSA9ICJUaGlua1BhZCBFeHRyYSBCdXR0b25zIjsKLQkJdHBhY3BpX2lucHV0ZGV2LT5waHlzID0gSUJNX0RSVlJfTkFNRSAiL2lucHV0MCI7Ci0JCXRwYWNwaV9pbnB1dGRldi0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOwotCQl0cGFjcGlfaW5wdXRkZXYtPmlkLnZlbmRvciA9ICh0aGlua3BhZF9pZC52ZW5kb3IpID8KLQkJCQkJCXRoaW5rcGFkX2lkLnZlbmRvciA6Ci0JCQkJCQlQQ0lfVkVORE9SX0lEX0lCTTsKLQkJdHBhY3BpX2lucHV0ZGV2LT5pZC5wcm9kdWN0ID0gVFBBQ1BJX0hLRVlfSU5QVVRfUFJPRFVDVDsKLQkJdHBhY3BpX2lucHV0ZGV2LT5pZC52ZXJzaW9uID0gVFBBQ1BJX0hLRVlfSU5QVVRfVkVSU0lPTjsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaWJtc19pbml0KTsgaSsrKSB7Ci0JCXJldCA9IGlibV9pbml0KCZpYm1zX2luaXRbaV0pOwotCQlpZiAocmV0ID49IDAgJiYgKmlibXNfaW5pdFtpXS5wYXJhbSkKLQkJCXJldCA9IGlibXNfaW5pdFtpXS5kYXRhLT53cml0ZShpYm1zX2luaXRbaV0ucGFyYW0pOwotCQlpZiAocmV0IDwgMCkgewotCQkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQlyZXQgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UodHBhY3BpX2lucHV0ZGV2KTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoSUJNX0VSUiAidW5hYmxlIHRvIHJlZ2lzdGVyIGlucHV0IGRldmljZVxuIik7Ci0JCXRoaW5rcGFkX2FjcGlfbW9kdWxlX2V4aXQoKTsKLQkJcmV0dXJuIHJldDsKLQl9IGVsc2UgewotCQl0cF9mZWF0dXJlcy5pbnB1dF9kZXZpY2VfcmVnaXN0ZXJlZCA9IDE7Ci0JfQotCi0JdHBhY3BpX2xpZmVjeWNsZSA9IFRQQUNQSV9MSUZFX1JVTk5JTkc7Ci0JcmV0dXJuIDA7Ci19CitUUEFDUElfUEFSQU0oY21vcyk7CitUUEFDUElfUEFSQU0obGVkKTsKK1RQQUNQSV9QQVJBTShiZWVwKTsKK1RQQUNQSV9QQVJBTShlY2R1bXApOworVFBBQ1BJX1BBUkFNKGJyaWdodG5lc3MpOworVFBBQ1BJX1BBUkFNKHZvbHVtZSk7CitUUEFDUElfUEFSQU0oZmFuKTsKIAogc3RhdGljIHZvaWQgdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCh2b2lkKQogewpAQCAtNTA2MiwxMiArNTk4MywxODcgQEAKIAkJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnRwYWNwaV9wZHJpdmVyKTsKIAogCWlmIChwcm9jX2RpcikKLQkJcmVtb3ZlX3Byb2NfZW50cnkoSUJNX1BST0NfRElSLCBhY3BpX3Jvb3RfZGlyKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoVFBBQ1BJX1BST0NfRElSLCBhY3BpX3Jvb3RfZGlyKTsKIAogCWtmcmVlKHRoaW5rcGFkX2lkLmJpb3NfdmVyc2lvbl9zdHIpOwogCWtmcmVlKHRoaW5rcGFkX2lkLmVjX3ZlcnNpb25fc3RyKTsKIAlrZnJlZSh0aGlua3BhZF9pZC5tb2RlbF9zdHIpOwogfQogCisKK3N0YXRpYyBpbnQgX19pbml0IHRoaW5rcGFkX2FjcGlfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0LCBpOworCisJdHBhY3BpX2xpZmVjeWNsZSA9IFRQQUNQSV9MSUZFX0lOSVQ7CisKKwkvKiBQYXJhbWV0ZXIgY2hlY2tpbmcgKi8KKwlpZiAoaG90a2V5X3JlcG9ydF9tb2RlID4gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBEcml2ZXItbGV2ZWwgcHJvYmUgKi8KKworCWdldF90aGlua3BhZF9tb2RlbF9kYXRhKCZ0aGlua3BhZF9pZCk7CisJcmV0ID0gcHJvYmVfZm9yX3RoaW5rcGFkKCk7CisJaWYgKHJldCkgeworCQl0aGlua3BhZF9hY3BpX21vZHVsZV9leGl0KCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogRHJpdmVyIGluaXRpYWxpemF0aW9uICovCisKKwlUUEFDUElfQUNQSUhBTkRMRV9JTklUKGVjcmQpOworCVRQQUNQSV9BQ1BJSEFORExFX0lOSVQoZWN3cik7CisKKwlwcm9jX2RpciA9IHByb2NfbWtkaXIoVFBBQ1BJX1BST0NfRElSLCBhY3BpX3Jvb3RfZGlyKTsKKwlpZiAoIXByb2NfZGlyKSB7CisJCXByaW50ayhUUEFDUElfRVJSCisJCSAgICAgICAidW5hYmxlIHRvIGNyZWF0ZSBwcm9jIGRpciAiIFRQQUNQSV9QUk9DX0RJUik7CisJCXRoaW5rcGFkX2FjcGlfbW9kdWxlX2V4aXQoKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXByb2NfZGlyLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ0cGFjcGlfcGRyaXZlcik7CisJaWYgKHJldCkgeworCQlwcmludGsoVFBBQ1BJX0VSUgorCQkgICAgICAgInVuYWJsZSB0byByZWdpc3RlciBtYWluIHBsYXRmb3JtIGRyaXZlclxuIik7CisJCXRoaW5rcGFkX2FjcGlfbW9kdWxlX2V4aXQoKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJdHBfZmVhdHVyZXMucGxhdGZvcm1fZHJ2X3JlZ2lzdGVyZWQgPSAxOworCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ0cGFjcGlfaHdtb25fcGRyaXZlcik7CisJaWYgKHJldCkgeworCQlwcmludGsoVFBBQ1BJX0VSUgorCQkgICAgICAgInVuYWJsZSB0byByZWdpc3RlciBod21vbiBwbGF0Zm9ybSBkcml2ZXJcbiIpOworCQl0aGlua3BhZF9hY3BpX21vZHVsZV9leGl0KCk7CisJCXJldHVybiByZXQ7CisJfQorCXRwX2ZlYXR1cmVzLnNlbnNvcnNfcGRydl9yZWdpc3RlcmVkID0gMTsKKworCXJldCA9IHRwYWNwaV9jcmVhdGVfZHJpdmVyX2F0dHJpYnV0ZXMoJnRwYWNwaV9wZHJpdmVyLmRyaXZlcik7CisJaWYgKCFyZXQpIHsKKwkJdHBfZmVhdHVyZXMucGxhdGZvcm1fZHJ2X2F0dHJzX3JlZ2lzdGVyZWQgPSAxOworCQlyZXQgPSB0cGFjcGlfY3JlYXRlX2RyaXZlcl9hdHRyaWJ1dGVzKAorCQkJCQkmdHBhY3BpX2h3bW9uX3Bkcml2ZXIuZHJpdmVyKTsKKwl9CisJaWYgKHJldCkgeworCQlwcmludGsoVFBBQ1BJX0VSUgorCQkgICAgICAgInVuYWJsZSB0byBjcmVhdGUgc3lzZnMgZHJpdmVyIGF0dHJpYnV0ZXNcbiIpOworCQl0aGlua3BhZF9hY3BpX21vZHVsZV9leGl0KCk7CisJCXJldHVybiByZXQ7CisJfQorCXRwX2ZlYXR1cmVzLnNlbnNvcnNfcGRydl9hdHRyc19yZWdpc3RlcmVkID0gMTsKKworCisJLyogRGV2aWNlIGluaXRpYWxpemF0aW9uICovCisJdHBhY3BpX3BkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKFRQQUNQSV9EUlZSX05BTUUsIC0xLAorCQkJCQkJCU5VTEwsIDApOworCWlmIChJU19FUlIodHBhY3BpX3BkZXYpKSB7CisJCXJldCA9IFBUUl9FUlIodHBhY3BpX3BkZXYpOworCQl0cGFjcGlfcGRldiA9IE5VTEw7CisJCXByaW50ayhUUEFDUElfRVJSICJ1bmFibGUgdG8gcmVnaXN0ZXIgcGxhdGZvcm0gZGV2aWNlXG4iKTsKKwkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOworCQlyZXR1cm4gcmV0OworCX0KKwl0cGFjcGlfc2Vuc29yc19wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgKKwkJCQkJCVRQQUNQSV9IV01PTl9EUlZSX05BTUUsCisJCQkJCQktMSwgTlVMTCwgMCk7CisJaWYgKElTX0VSUih0cGFjcGlfc2Vuc29yc19wZGV2KSkgeworCQlyZXQgPSBQVFJfRVJSKHRwYWNwaV9zZW5zb3JzX3BkZXYpOworCQl0cGFjcGlfc2Vuc29yc19wZGV2ID0gTlVMTDsKKwkJcHJpbnRrKFRQQUNQSV9FUlIKKwkJICAgICAgICJ1bmFibGUgdG8gcmVnaXN0ZXIgaHdtb24gcGxhdGZvcm0gZGV2aWNlXG4iKTsKKwkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnRwYWNwaV9zZW5zb3JzX3BkZXYtPmRldiwKKwkJCQkgJmRldl9hdHRyX3RoaW5rcGFkX2FjcGlfcGRldl9uYW1lKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhUUEFDUElfRVJSCisJCSAgICAgICAidW5hYmxlIHRvIGNyZWF0ZSBzeXNmcyBod21vbiBkZXZpY2UgYXR0cmlidXRlc1xuIik7CisJCXRoaW5rcGFkX2FjcGlfbW9kdWxlX2V4aXQoKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJdHBfZmVhdHVyZXMuc2Vuc29yc19wZGV2X2F0dHJzX3JlZ2lzdGVyZWQgPSAxOworCXRwYWNwaV9od21vbiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmdHBhY3BpX3NlbnNvcnNfcGRldi0+ZGV2KTsKKwlpZiAoSVNfRVJSKHRwYWNwaV9od21vbikpIHsKKwkJcmV0ID0gUFRSX0VSUih0cGFjcGlfaHdtb24pOworCQl0cGFjcGlfaHdtb24gPSBOVUxMOworCQlwcmludGsoVFBBQ1BJX0VSUiAidW5hYmxlIHRvIHJlZ2lzdGVyIGh3bW9uIGRldmljZVxuIik7CisJCXRoaW5rcGFkX2FjcGlfbW9kdWxlX2V4aXQoKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJbXV0ZXhfaW5pdCgmdHBhY3BpX2lucHV0ZGV2X3NlbmRfbXV0ZXgpOworCXRwYWNwaV9pbnB1dGRldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghdHBhY3BpX2lucHV0ZGV2KSB7CisJCXByaW50ayhUUEFDUElfRVJSICJ1bmFibGUgdG8gYWxsb2NhdGUgaW5wdXQgZGV2aWNlXG4iKTsKKwkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9IGVsc2UgeworCQkvKiBQcmVwYXJlIGlucHV0IGRldmljZSwgYnV0IGRvbid0IHJlZ2lzdGVyICovCisJCXRwYWNwaV9pbnB1dGRldi0+bmFtZSA9ICJUaGlua1BhZCBFeHRyYSBCdXR0b25zIjsKKwkJdHBhY3BpX2lucHV0ZGV2LT5waHlzID0gVFBBQ1BJX0RSVlJfTkFNRSAiL2lucHV0MCI7CisJCXRwYWNwaV9pbnB1dGRldi0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOworCQl0cGFjcGlfaW5wdXRkZXYtPmlkLnZlbmRvciA9ICh0aGlua3BhZF9pZC52ZW5kb3IpID8KKwkJCQkJCXRoaW5rcGFkX2lkLnZlbmRvciA6CisJCQkJCQlQQ0lfVkVORE9SX0lEX0lCTTsKKwkJdHBhY3BpX2lucHV0ZGV2LT5pZC5wcm9kdWN0ID0gVFBBQ1BJX0hLRVlfSU5QVVRfUFJPRFVDVDsKKwkJdHBhY3BpX2lucHV0ZGV2LT5pZC52ZXJzaW9uID0gVFBBQ1BJX0hLRVlfSU5QVVRfVkVSU0lPTjsKKwl9CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaWJtc19pbml0KTsgaSsrKSB7CisJCXJldCA9IGlibV9pbml0KCZpYm1zX2luaXRbaV0pOworCQlpZiAocmV0ID49IDAgJiYgKmlibXNfaW5pdFtpXS5wYXJhbSkKKwkJCXJldCA9IGlibXNfaW5pdFtpXS5kYXRhLT53cml0ZShpYm1zX2luaXRbaV0ucGFyYW0pOworCQlpZiAocmV0IDwgMCkgeworCQkJdGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCgpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwlyZXQgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UodHBhY3BpX2lucHV0ZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoVFBBQ1BJX0VSUiAidW5hYmxlIHRvIHJlZ2lzdGVyIGlucHV0IGRldmljZVxuIik7CisJCXRoaW5rcGFkX2FjcGlfbW9kdWxlX2V4aXQoKTsKKwkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQl0cF9mZWF0dXJlcy5pbnB1dF9kZXZpY2VfcmVnaXN0ZXJlZCA9IDE7CisJfQorCisJdHBhY3BpX2xpZmVjeWNsZSA9IFRQQUNQSV9MSUZFX1JVTk5JTkc7CisJcmV0dXJuIDA7Cit9CisKKy8qIFBsZWFzZSByZW1vdmUgdGhpcyBpbiB5ZWFyIDIwMDkgKi8KK01PRFVMRV9BTElBUygiaWJtX2FjcGkiKTsKKworLyoKKyAqIERNSSBtYXRjaGluZyBmb3IgbW9kdWxlIGF1dG9sb2FkaW5nCisgKgorICogU2VlIGh0dHA6Ly90aGlua3dpa2kub3JnL3dpa2kvTGlzdF9vZl9ETUlfSURzCisgKiBTZWUgaHR0cDovL3RoaW5rd2lraS5vcmcvd2lraS9CSU9TX1VwZ3JhZGVfRG93bmxvYWRzCisgKgorICogT25seSBtb2RlbHMgbGlzdGVkIGluIHRoaW5rd2lraSB3aWxsIGJlIHN1cHBvcnRlZCwgc28gYWRkIHlvdXJzCisgKiBpZiBpdCBpcyBub3QgdGhlcmUgeWV0LgorICovCisjZGVmaW5lIElCTV9CSU9TX01PRFVMRV9BTElBUyhfX3R5cGUpIFwKKwlNT0RVTEVfQUxJQVMoImRtaTpidm5JQk06YnZyIiBfX3R5cGUgIkVUPz9XVyIpCisKKy8qIE5vbi1hbmNpZW50IHRoaW5rcGFkcyAqLworTU9EVUxFX0FMSUFTKCJkbWk6YnZuSUJNOio6c3ZuSUJNOio6cHZyVGhpbmtQYWQqOnJ2bklCTToqIik7CitNT0RVTEVfQUxJQVMoImRtaTpidm5MRU5PVk86Kjpzdm5MRU5PVk86KjpwdnJUaGlua1BhZCo6cnZuTEVOT1ZPOioiKTsKKworLyogQW5jaWVudCB0aGlua3BhZCBCSU9TZXMgaGF2ZSB0byBiZSBpZGVudGlmaWVkIGJ5CisgKiBCSU9TIHR5cGUgb3IgbW9kZWwgbnVtYmVyLCBhbmQgdGhlcmUgYXJlIGZhciBsZXNzCisgKiBCSU9TIHR5cGVzIHRoYW4gbW9kZWwgbnVtYmVycy4uLiAqLworSUJNX0JJT1NfTU9EVUxFX0FMSUFTKCJJW0IsRCxILEksTSxOLE8sVCxXLFYsWSxaXSIpOworSUJNX0JJT1NfTU9EVUxFX0FMSUFTKCIxWzAsMyw2LDgsQS1HLEksSyxNLVAsUyxUXSIpOworSUJNX0JJT1NfTU9EVUxFX0FMSUFTKCJLW1UsWC1aXSIpOworCitNT0RVTEVfQVVUSE9SKCJCb3Jpc2xhdiBEZWlhbm92LCBIZW5yaXF1ZSBkZSBNb3JhZXMgSG9sc2NodWgiKTsKK01PRFVMRV9ERVNDUklQVElPTihUUEFDUElfREVTQyk7CitNT0RVTEVfVkVSU0lPTihUUEFDUElfVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKIG1vZHVsZV9pbml0KHRoaW5rcGFkX2FjcGlfbW9kdWxlX2luaXQpOwogbW9kdWxlX2V4aXQodGhpbmtwYWRfYWNwaV9tb2R1bGVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvdGhpbmtwYWRfYWNwaS5oIGIvZHJpdmVycy9taXNjL3RoaW5rcGFkX2FjcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiYTJiYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21pc2MvdGhpbmtwYWRfYWNwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjA2ICswLDAgQEAKLS8qCi0gKiAgdGhpbmtwYWRfYWNwaS5oIC0gVGhpbmtQYWQgQUNQSSBFeHRyYXMKLSAqCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEJvcmlzbGF2IERlaWFub3YgPGJvcmlzbGF2QHVzZXJzLnNmLm5ldD4KLSAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBIZW5yaXF1ZSBkZSBNb3JhZXMgSG9sc2NodWggPGhtaEBobWguZW5nLmJyPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQotICogIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0jaWZuZGVmIF9fVEhJTktQQURfQUNQSV9IX18KLSNkZWZpbmUgX19USElOS1BBRF9BQ1BJX0hfXwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9udnJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgotI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZiLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaHdtb24uaD4KLSNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgotI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgotI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLQotI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgotCi0jaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTWFpbiBkcml2ZXIKLSAqLwotCi0jZGVmaW5lIElCTV9OQU1FICJ0aGlua3BhZCIKLSNkZWZpbmUgSUJNX0RFU0MgIlRoaW5rUGFkIEFDUEkgRXh0cmFzIgotI2RlZmluZSBJQk1fRklMRSBJQk1fTkFNRSAiX2FjcGkiCi0jZGVmaW5lIElCTV9VUkwgImh0dHA6Ly9pYm0tYWNwaS5zZi5uZXQvIgotI2RlZmluZSBJQk1fTUFJTCAiaWJtLWFjcGktZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0IgotCi0jZGVmaW5lIElCTV9QUk9DX0RJUiAiaWJtIgotI2RlZmluZSBJQk1fQUNQSV9FVkVOVF9QUkVGSVggImlibSIKLSNkZWZpbmUgSUJNX0RSVlJfTkFNRSBJQk1fRklMRQotI2RlZmluZSBJQk1fSFdNT05fRFJWUl9OQU1FIElCTV9OQU1FICJfaHdtb24iCi0KLSNkZWZpbmUgSUJNX0xPRyBJQk1fRklMRSAiOiAiCi0jZGVmaW5lIElCTV9FUlIJICAgS0VSTl9FUlIgICAgSUJNX0xPRwotI2RlZmluZSBJQk1fTk9USUNFIEtFUk5fTk9USUNFIElCTV9MT0cKLSNkZWZpbmUgSUJNX0lORk8gICBLRVJOX0lORk8gICBJQk1fTE9HCi0jZGVmaW5lIElCTV9ERUJVRyAgS0VSTl9ERUJVRyAgSUJNX0xPRwotCi0jZGVmaW5lIElCTV9NQVhfQUNQSV9BUkdTIDMKLQotLyogVGhpbmtQYWQgQ01PUyBjb21tYW5kcyAqLwotI2RlZmluZSBUUF9DTU9TX1ZPTFVNRV9ET1dOCTAKLSNkZWZpbmUgVFBfQ01PU19WT0xVTUVfVVAJMQotI2RlZmluZSBUUF9DTU9TX1ZPTFVNRV9NVVRFCTIKLSNkZWZpbmUgVFBfQ01PU19CUklHSFRORVNTX1VQCTQKLSNkZWZpbmUgVFBfQ01PU19CUklHSFRORVNTX0RPV04JNQotCi0vKiBUaGlua1BhZCBDTU9TIE5WUkFNIGNvbnN0YW50cyAqLwotI2RlZmluZSBUUF9OVlJBTV9BRERSX0JSSUdIVE5FU1MgICAgICAgMHg1ZQotI2RlZmluZSBUUF9OVlJBTV9NQVNLX0xFVkVMX0JSSUdIVE5FU1MgMHgwZgotI2RlZmluZSBUUF9OVlJBTV9QT1NfTEVWRUxfQlJJR0hUTkVTUyAwCi0KLSNkZWZpbmUgb25vZmYoc3RhdHVzLGJpdCkgKChzdGF0dXMpICYgKDEgPDwgKGJpdCkpID8gIm9uIiA6ICJvZmYiKQotI2RlZmluZSBlbmFibGVkKHN0YXR1cyxiaXQpICgoc3RhdHVzKSAmICgxIDw8IChiaXQpKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpCi0jZGVmaW5lIHN0cmxlbmNtcChhLGIpIChzdHJuY21wKChhKSwgKGIpLCBzdHJsZW4oYikpKQotCi0vKiBEZWJ1Z2dpbmcgKi8KLSNkZWZpbmUgVFBBQ1BJX0RCR19BTEwJCTB4ZmZmZgotI2RlZmluZSBUUEFDUElfREJHX0FMTAkJMHhmZmZmCi0jZGVmaW5lIFRQQUNQSV9EQkdfSU5JVAkJMHgwMDAxCi0jZGVmaW5lIFRQQUNQSV9EQkdfRVhJVAkJMHgwMDAyCi0jZGVmaW5lIGRiZ19wcmludGsoYV9kYmdfbGV2ZWwsIGZvcm1hdCwgYXJnLi4uKSBcCi0JZG8geyBpZiAoZGJnX2xldmVsICYgYV9kYmdfbGV2ZWwpIFwKLQkJcHJpbnRrKElCTV9ERUJVRyAiJXM6ICIgZm9ybWF0LCBfX2Z1bmNfXyAsICMjIGFyZyk7IH0gd2hpbGUgKDApCi0jaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfREVCVUcKLSNkZWZpbmUgdmRiZ19wcmludGsoYV9kYmdfbGV2ZWwsIGZvcm1hdCwgYXJnLi4uKSBcCi0JZGJnX3ByaW50ayhhX2RiZ19sZXZlbCwgZm9ybWF0LCAjIyBhcmcpCi1zdGF0aWMgY29uc3QgY2hhciAqc3RyX3N1cHBvcnRlZChpbnQgaXNfc3VwcG9ydGVkKTsKLSNlbHNlCi0jZGVmaW5lIHZkYmdfcHJpbnRrKGFfZGJnX2xldmVsLCBmb3JtYXQsIGFyZy4uLikKLSNlbmRpZgotCi0vKiBJbnB1dCBJRHMgKi8KLSNkZWZpbmUgVFBBQ1BJX0hLRVlfSU5QVVRfVkVORE9SCVBDSV9WRU5ET1JfSURfSUJNCi0jZGVmaW5lIFRQQUNQSV9IS0VZX0lOUFVUX1BST0RVQ1QJMHg1MDU0IC8qICJUUCIgKi8KLSNkZWZpbmUgVFBBQ1BJX0hLRVlfSU5QVVRfVkVSU0lPTgkweDQxMDEKLQotLyogQUNQSSBISURzICovCi0jZGVmaW5lIElCTV9IS0VZX0hJRCAgICAiSUJNMDA2OCIKLQotLyogQUNQSSBoZWxwZXJzICovCi1zdGF0aWMgaW50IF9fbXVzdF9jaGVjayBhY3BpX2V2YWxmKGFjcGlfaGFuZGxlIGhhbmRsZSwKLQkJICAgICAgdm9pZCAqcmVzLCBjaGFyICptZXRob2QsIGNoYXIgKmZtdCwgLi4uKTsKLXN0YXRpYyBpbnQgX19tdXN0X2NoZWNrIGFjcGlfZWNfcmVhZChpbnQgaSwgdTggKiBwKTsKLXN0YXRpYyBpbnQgX19tdXN0X2NoZWNrIGFjcGlfZWNfd3JpdGUoaW50IGksIHU4IHYpOwotc3RhdGljIGludCBfX211c3RfY2hlY2sgX3N0YShhY3BpX2hhbmRsZSBoYW5kbGUpOwotCi0vKiBBQ1BJIGhhbmRsZXMgKi8KLXN0YXRpYyBhY3BpX2hhbmRsZSByb290X2hhbmRsZTsJCQkvKiByb290IG5hbWVzcGFjZSAqLwotc3RhdGljIGFjcGlfaGFuZGxlIGVjX2hhbmRsZTsJCQkvKiBFQyAqLwotc3RhdGljIGFjcGlfaGFuZGxlIGVjcmRfaGFuZGxlLCBlY3dyX2hhbmRsZTsJLyogNTcwIEVDIGFjY2VzcyAqLwotc3RhdGljIGFjcGlfaGFuZGxlIGNtb3NfaGFuZGxlLCBoa2V5X2hhbmRsZTsJLyogYmFzaWMgdGhpbmtwYWQgaGFuZGxlcyAqLwotCi1zdGF0aWMgdm9pZCBkcnZfYWNwaV9oYW5kbGVfaW5pdChjaGFyICpuYW1lLAotCQkgICBhY3BpX2hhbmRsZSAqaGFuZGxlLCBhY3BpX2hhbmRsZSBwYXJlbnQsCi0JCSAgIGNoYXIgKipwYXRocywgaW50IG51bV9wYXRocywgY2hhciAqKnBhdGgpOwotI2RlZmluZSBJQk1fQUNQSUhBTkRMRV9JTklUKG9iamVjdCkJCQkJCQlcCi0JZHJ2X2FjcGlfaGFuZGxlX2luaXQoI29iamVjdCwgJm9iamVjdCMjX2hhbmRsZSwgKm9iamVjdCMjX3BhcmVudCwJXAotCQlvYmplY3QjI19wYXRocywgQVJSQVlfU0laRShvYmplY3QjI19wYXRocyksICZvYmplY3QjI19wYXRoKQotCi0vKiBUaGlua1BhZCBBQ1BJIGhlbHBlcnMgKi8KLXN0YXRpYyBpbnQgaXNzdWVfdGhpbmtwYWRfY21vc19jb21tYW5kKGludCBjbW9zX2NtZCk7Ci0KLS8qIHByb2NmcyBzdXBwb3J0ICovCi1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2RpcjsKLQotLyogcHJvY2ZzIGhlbHBlcnMgKi8KLXN0YXRpYyBpbnQgZGlzcGF0Y2hfcHJvY2ZzX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCi0JCWludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotc3RhdGljIGludCBkaXNwYXRjaF9wcm9jZnNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCWNvbnN0IGNoYXIgX191c2VyICogdXNlcmJ1ZiwKLQkJdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSk7Ci1zdGF0aWMgY2hhciAqbmV4dF9jbWQoY2hhciAqKmNtZHMpOwotCi0vKiBzeXNmcyBzdXBwb3J0ICovCi1zdHJ1Y3QgYXR0cmlidXRlX3NldCB7Ci0JdW5zaWduZWQgaW50IG1lbWJlcnMsIG1heF9tZW1iZXJzOwotCXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgZ3JvdXA7Ci19OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9zZXQgKmNyZWF0ZV9hdHRyX3NldCh1bnNpZ25lZCBpbnQgbWF4X21lbWJlcnMsCi0JCQkJCQljb25zdCBjaGFyKiBuYW1lKTsKLSNkZWZpbmUgZGVzdHJveV9hdHRyX3NldChfc2V0KSBcCi0Ja2ZyZWUoX3NldCk7Ci1zdGF0aWMgaW50IGFkZF90b19hdHRyX3NldChzdHJ1Y3QgYXR0cmlidXRlX3NldCogcywgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cik7Ci1zdGF0aWMgaW50IGFkZF9tYW55X3RvX2F0dHJfc2V0KHN0cnVjdCBhdHRyaWJ1dGVfc2V0KiBzLAotCQkJc3RydWN0IGF0dHJpYnV0ZSAqKmF0dHIsCi0JCQl1bnNpZ25lZCBpbnQgY291bnQpOwotI2RlZmluZSByZWdpc3Rlcl9hdHRyX3NldF93aXRoX3N5c2ZzKF9hdHRyX3NldCwgX2tvYmopIFwKLQlzeXNmc19jcmVhdGVfZ3JvdXAoX2tvYmosICZfYXR0cl9zZXQtPmdyb3VwKQotc3RhdGljIHZvaWQgZGVsZXRlX2F0dHJfc2V0KHN0cnVjdCBhdHRyaWJ1dGVfc2V0KiBzLCBzdHJ1Y3Qga29iamVjdCAqa29iaik7Ci0KLXN0YXRpYyBpbnQgcGFyc2Vfc3RydG91bChjb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbWF4LAotCQkJdW5zaWduZWQgbG9uZyAqdmFsdWUpOwotCi0vKiBEZXZpY2UgbW9kZWwgKi8KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp0cGFjcGlfcGRldjsKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp0cGFjcGlfc2Vuc29yc19wZGV2Owotc3RhdGljIHN0cnVjdCBkZXZpY2UgKnRwYWNwaV9od21vbjsKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRwYWNwaV9wZHJpdmVyOwotc3RhdGljIHN0cnVjdCBpbnB1dF9kZXYgKnRwYWNwaV9pbnB1dGRldjsKLXN0YXRpYyBpbnQgdHBhY3BpX2NyZWF0ZV9kcml2ZXJfYXR0cmlidXRlcyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KTsKLXN0YXRpYyB2b2lkIHRwYWNwaV9yZW1vdmVfZHJpdmVyX2F0dHJpYnV0ZXMoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydik7Ci0KLS8qIE1vZHVsZSAqLwotc3RhdGljIGludCBleHBlcmltZW50YWw7Ci1zdGF0aWMgdTMyIGRiZ19sZXZlbDsKLXN0YXRpYyBpbnQgZm9yY2VfbG9hZDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaG90a2V5X3JlcG9ydF9tb2RlOwotCi1zdGF0aWMgaW50IHRoaW5rcGFkX2FjcGlfbW9kdWxlX2luaXQodm9pZCk7Ci1zdGF0aWMgdm9pZCB0aGlua3BhZF9hY3BpX21vZHVsZV9leGl0KHZvaWQpOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTdWJkcml2ZXJzCi0gKi8KLQotc3RydWN0IGlibV9zdHJ1Y3Q7Ci0KLXN0cnVjdCB0cF9hY3BpX2Rydl9zdHJ1Y3QgewotCWNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCAqaGlkOwotCXN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyOwotCi0Jdm9pZCAoKm5vdGlmeSkgKHN0cnVjdCBpYm1fc3RydWN0ICosIHUzMik7Ci0JYWNwaV9oYW5kbGUgKmhhbmRsZTsKLQl1MzIgdHlwZTsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZTsKLX07Ci0KLXN0cnVjdCBpYm1fc3RydWN0IHsKLQljaGFyICpuYW1lOwotCi0JaW50ICgqcmVhZCkgKGNoYXIgKik7Ci0JaW50ICgqd3JpdGUpIChjaGFyICopOwotCXZvaWQgKCpleGl0KSAodm9pZCk7Ci0Jdm9pZCAoKnJlc3VtZSkgKHZvaWQpOwotCi0Jc3RydWN0IGxpc3RfaGVhZCBhbGxfZHJpdmVyczsKLQotCXN0cnVjdCB0cF9hY3BpX2Rydl9zdHJ1Y3QgKmFjcGk7Ci0KLQlzdHJ1Y3QgewotCQl1OCBhY3BpX2RyaXZlcl9yZWdpc3RlcmVkOjE7Ci0JCXU4IGFjcGlfbm90aWZ5X2luc3RhbGxlZDoxOwotCQl1OCBwcm9jX2NyZWF0ZWQ6MTsKLQkJdTggaW5pdF9jYWxsZWQ6MTsKLQkJdTggZXhwZXJpbWVudGFsOjE7Ci0JfSBmbGFnczsKLX07Ci0KLXN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgewotCWNoYXIgcGFyYW1bMzJdOwotCi0JaW50ICgqaW5pdCkgKHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKik7Ci0Jc3RydWN0IGlibV9zdHJ1Y3QgKmRhdGE7Ci19OwotCi1zdGF0aWMgc3RydWN0IHsKLSNpZmRlZiBDT05GSUdfVEhJTktQQURfQUNQSV9CQVkKLQl1MzIgYmF5X3N0YXR1czoxOwotCXUzMiBiYXlfZWplY3Q6MTsKLQl1MzIgYmF5X3N0YXR1czI6MTsKLQl1MzIgYmF5X2VqZWN0MjoxOwotI2VuZGlmCi0JdTMyIGJsdWV0b290aDoxOwotCXUzMiBob3RrZXk6MTsKLQl1MzIgaG90a2V5X21hc2s6MTsKLQl1MzIgaG90a2V5X3dsc3c6MTsKLQl1MzIgbGlnaHQ6MTsKLQl1MzIgbGlnaHRfc3RhdHVzOjE7Ci0JdTMyIGJyaWdodF8xNmxldmVsczoxOwotCXUzMiB3YW46MTsKLQl1MzIgZmFuX2N0cmxfc3RhdHVzX3VuZGVmOjE7Ci0JdTMyIGlucHV0X2RldmljZV9yZWdpc3RlcmVkOjE7Ci0JdTMyIHBsYXRmb3JtX2Rydl9yZWdpc3RlcmVkOjE7Ci0JdTMyIHBsYXRmb3JtX2Rydl9hdHRyc19yZWdpc3RlcmVkOjE7Ci0JdTMyIHNlbnNvcnNfcGRydl9yZWdpc3RlcmVkOjE7Ci0JdTMyIHNlbnNvcnNfcGRydl9hdHRyc19yZWdpc3RlcmVkOjE7Ci0JdTMyIHNlbnNvcnNfcGRldl9hdHRyc19yZWdpc3RlcmVkOjE7Ci19IHRwX2ZlYXR1cmVzOwotCi1zdHJ1Y3QgdGhpbmtwYWRfaWRfZGF0YSB7Ci0JdW5zaWduZWQgaW50IHZlbmRvcjsJLyogVGhpbmtQYWQgdmVuZG9yOgotCQkJCSAqIFBDSV9WRU5ET1JfSURfSUJNL1BDSV9WRU5ET1JfSURfTEVOT1ZPICovCi0KLQljaGFyICpiaW9zX3ZlcnNpb25fc3RyOwkvKiBTb21ldGhpbmcgbGlrZSAxWkVUNTFXVyAoMS4wM3opICovCi0JY2hhciAqZWNfdmVyc2lvbl9zdHI7CS8qIFNvbWV0aGluZyBsaWtlIDFaSFQ1MVdXLTEuMDRhICovCi0KLQl1MTYgYmlvc19tb2RlbDsJCS8qIEJpZyBFbmRpYW4sIFRQLTFZID0gMHg1OTMxLCAwID0gdW5rbm93biAqLwotCXUxNiBlY19tb2RlbDsKLQotCWNoYXIgKm1vZGVsX3N0cjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdGhpbmtwYWRfaWRfZGF0YSB0aGlua3BhZF9pZDsKLQotc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgdHBhY3BpX2FsbF9kcml2ZXJzOwotCi1zdGF0aWMgc3RydWN0IGlibV9pbml0X3N0cnVjdCBpYm1zX2luaXRbXTsKLXN0YXRpYyBpbnQgc2V0X2libV9wYXJhbShjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKTsKLXN0YXRpYyBpbnQgaWJtX2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSk7Ci1zdGF0aWMgdm9pZCBpYm1fZXhpdChzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtKTsKLQotCi0vKgotICogcHJvY2ZzIG1hc3RlciBzdWJkcml2ZXIKLSAqLwotc3RhdGljIGludCB0aGlua3BhZF9hY3BpX2RyaXZlcl9pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pOwotc3RhdGljIGludCB0aGlua3BhZF9hY3BpX2RyaXZlcl9yZWFkKGNoYXIgKnApOwotCi0KLS8qCi0gKiBCYXkgc3ViZHJpdmVyCi0gKi8KLQotI2lmZGVmIENPTkZJR19USElOS1BBRF9BQ1BJX0JBWQotc3RhdGljIGFjcGlfaGFuZGxlIGJheV9oYW5kbGUsIGJheV9lal9oYW5kbGU7Ci1zdGF0aWMgYWNwaV9oYW5kbGUgYmF5Ml9oYW5kbGUsIGJheTJfZWpfaGFuZGxlOwotCi1zdGF0aWMgaW50IGJheV9pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pOwotc3RhdGljIHZvaWQgYmF5X25vdGlmeShzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCB1MzIgZXZlbnQpOwotc3RhdGljIGludCBiYXlfcmVhZChjaGFyICpwKTsKLXN0YXRpYyBpbnQgYmF5X3dyaXRlKGNoYXIgKmJ1Zik7Ci0jZW5kaWYgLyogQ09ORklHX1RISU5LUEFEX0FDUElfQkFZICovCi0KLQotLyoKLSAqIEJlZXAgc3ViZHJpdmVyCi0gKi8KLQotc3RhdGljIGFjcGlfaGFuZGxlIGJlZXBfaGFuZGxlOwotCi1zdGF0aWMgaW50IGJlZXBfcmVhZChjaGFyICpwKTsKLXN0YXRpYyBpbnQgYmVlcF93cml0ZShjaGFyICpidWYpOwotCi0KLS8qCi0gKiBCbHVldG9vdGggc3ViZHJpdmVyCi0gKi8KLQotZW51bSB7Ci0JLyogQUNQSSBHQkRDL1NCREMgYml0cyAqLwotCVRQX0FDUElfQkxVRVRPT1RIX0hXUFJFU0VOVAk9IDB4MDEsCS8qIEJsdWV0b290aCBodyBhdmFpbGFibGUgKi8KLQlUUF9BQ1BJX0JMVUVUT09USF9SQURJT1NTVwk9IDB4MDIsCS8qIEJsdWV0b290aCByYWRpbyBlbmFibGVkICovCi0JVFBfQUNQSV9CTFVFVE9PVEhfVU5LCQk9IDB4MDQsCS8qIHVua25vd24gZnVuY3Rpb24gKi8KLX07Ci0KLXN0YXRpYyBpbnQgYmx1ZXRvb3RoX2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSk7Ci1zdGF0aWMgaW50IGJsdWV0b290aF9nZXRfcmFkaW9zdyh2b2lkKTsKLXN0YXRpYyBpbnQgYmx1ZXRvb3RoX3NldF9yYWRpb3N3KGludCByYWRpb19vbik7Ci1zdGF0aWMgaW50IGJsdWV0b290aF9yZWFkKGNoYXIgKnApOwotc3RhdGljIGludCBibHVldG9vdGhfd3JpdGUoY2hhciAqYnVmKTsKLQotCi0vKgotICogQnJpZ2h0bmVzcyAoYmFja2xpZ2h0KSBzdWJkcml2ZXIKLSAqLwotCi0jZGVmaW5lIFRQQUNQSV9CQUNLTElHSFRfREVWX05BTUUgInRoaW5rcGFkX3NjcmVlbiIKLQotc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICppYm1fYmFja2xpZ2h0X2RldmljZTsKLXN0YXRpYyBpbnQgYnJpZ2h0bmVzc19vZmZzZXQgPSAweDMxOwotc3RhdGljIGludCBicmlnaHRuZXNzX21vZGU7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGJyaWdodG5lc3NfZW5hYmxlOwkvKiAwID0gbm8sIDEgPSB5ZXMsIDIgPSBhdXRvICovCi0KLXN0YXRpYyBpbnQgYnJpZ2h0bmVzc19pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pOwotc3RhdGljIHZvaWQgYnJpZ2h0bmVzc19leGl0KHZvaWQpOwotc3RhdGljIGludCBicmlnaHRuZXNzX2dldChzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpOwotc3RhdGljIGludCBicmlnaHRuZXNzX3NldChpbnQgdmFsdWUpOwotc3RhdGljIGludCBicmlnaHRuZXNzX3VwZGF0ZV9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKTsKLXN0YXRpYyBpbnQgYnJpZ2h0bmVzc19yZWFkKGNoYXIgKnApOwotc3RhdGljIGludCBicmlnaHRuZXNzX3dyaXRlKGNoYXIgKmJ1Zik7Ci0KLQotLyoKLSAqIENNT1Mgc3ViZHJpdmVyCi0gKi8KLQotc3RhdGljIGludCBjbW9zX3JlYWQoY2hhciAqcCk7Ci1zdGF0aWMgaW50IGNtb3Nfd3JpdGUoY2hhciAqYnVmKTsKLQotCi0vKgotICogRG9jayBzdWJkcml2ZXIKLSAqLwotCi0jaWZkZWYgQ09ORklHX1RISU5LUEFEX0FDUElfRE9DSwotc3RhdGljIGFjcGlfaGFuZGxlIHBjaV9oYW5kbGU7Ci1zdGF0aWMgYWNwaV9oYW5kbGUgZG9ja19oYW5kbGU7Ci0KLXN0YXRpYyB2b2lkIGRvY2tfbm90aWZ5KHN0cnVjdCBpYm1fc3RydWN0ICppYm0sIHUzMiBldmVudCk7Ci1zdGF0aWMgaW50IGRvY2tfcmVhZChjaGFyICpwKTsKLXN0YXRpYyBpbnQgZG9ja193cml0ZShjaGFyICpidWYpOwotI2VuZGlmIC8qIENPTkZJR19USElOS1BBRF9BQ1BJX0RPQ0sgKi8KLQotCi0vKgotICogRUMgZHVtcCBzdWJkcml2ZXIKLSAqLwotCi1zdGF0aWMgaW50IGVjZHVtcF9yZWFkKGNoYXIgKnApIDsKLXN0YXRpYyBpbnQgZWNkdW1wX3dyaXRlKGNoYXIgKmJ1Zik7Ci0KLQotLyoKLSAqIEZhbiBzdWJkcml2ZXIKLSAqLwotCi1lbnVtIHsJCQkJCS8qIEZhbiBjb250cm9sIGNvbnN0YW50cyAqLwotCWZhbl9zdGF0dXNfb2Zmc2V0ID0gMHgyZiwJLyogRUMgcmVnaXN0ZXIgMHgyZiAqLwotCWZhbl9ycG1fb2Zmc2V0ID0gMHg4NCwJCS8qIEVDIHJlZ2lzdGVyIDB4ODQ6IExTQiwgMHg4NSBNU0IgKFJQTSkKLQkJCQkJICogMHg4NCBtdXN0IGJlIHJlYWQgYmVmb3JlIDB4ODUgKi8KLQotCVRQX0VDX0ZBTl9GVUxMU1BFRUQgPSAweDQwLAkvKiBFQyBmYW4gbW9kZTogZnVsbCBzcGVlZCAqLwotCVRQX0VDX0ZBTl9BVVRPCSAgICA9IDB4ODAsCS8qIEVDIGZhbiBtb2RlOiBhdXRvIGZhbiBjb250cm9sICovCi0KLQlUUEFDUElfRkFOX0xBU1RfTEVWRUwgPSAweDEwMCwJLyogVXNlIGNhY2hlZCBsYXN0LXNlZW4gZmFuIGxldmVsICovCi19OwotCi1lbnVtIGZhbl9zdGF0dXNfYWNjZXNzX21vZGUgewotCVRQQUNQSV9GQU5fTk9ORSA9IDAsCQkvKiBObyBmYW4gc3RhdHVzIG9yIGNvbnRyb2wgKi8KLQlUUEFDUElfRkFOX1JEX0FDUElfR0ZBTiwJLyogVXNlIEFDUEkgR0ZBTiAqLwotCVRQQUNQSV9GQU5fUkRfVFBFQywJCS8qIFVzZSBBQ1BJIEVDIHJlZ3MgMHgyZiwgMHg4NC0weDg1ICovCi19OwotCi1lbnVtIGZhbl9jb250cm9sX2FjY2Vzc19tb2RlIHsKLQlUUEFDUElfRkFOX1dSX05PTkUgPSAwLAkJLyogTm8gZmFuIGNvbnRyb2wgKi8KLQlUUEFDUElfRkFOX1dSX0FDUElfU0ZBTiwJLyogVXNlIEFDUEkgU0ZBTiAqLwotCVRQQUNQSV9GQU5fV1JfVFBFQywJCS8qIFVzZSBBQ1BJIEVDIHJlZyAweDJmICovCi0JVFBBQ1BJX0ZBTl9XUl9BQ1BJX0ZBTlMsCS8qIFVzZSBBQ1BJIEZBTlMgYW5kIEVDIHJlZyAweDJmICovCi19OwotCi1lbnVtIGZhbl9jb250cm9sX2NvbW1hbmRzIHsKLQlUUEFDUElfRkFOX0NNRF9TUEVFRCAJPSAweDAwMDEsCS8qIHNwZWVkIGNvbW1hbmQgKi8KLQlUUEFDUElfRkFOX0NNRF9MRVZFTCAJPSAweDAwMDIsCS8qIGxldmVsIGNvbW1hbmQgICovCi0JVFBBQ1BJX0ZBTl9DTURfRU5BQkxFCT0gMHgwMDA0LAkvKiBlbmFibGUvZGlzYWJsZSBjbWQsCi0JCQkJCQkgKiBhbmQgYWxzbyB3YXRjaGRvZyBjbWQgKi8KLX07Ci0KLXN0YXRpYyBpbnQgZmFuX2NvbnRyb2xfYWxsb3dlZDsKLQotc3RhdGljIGVudW0gZmFuX3N0YXR1c19hY2Nlc3NfbW9kZSBmYW5fc3RhdHVzX2FjY2Vzc19tb2RlOwotc3RhdGljIGVudW0gZmFuX2NvbnRyb2xfYWNjZXNzX21vZGUgZmFuX2NvbnRyb2xfYWNjZXNzX21vZGU7Ci1zdGF0aWMgZW51bSBmYW5fY29udHJvbF9jb21tYW5kcyBmYW5fY29udHJvbF9jb21tYW5kczsKLXN0YXRpYyB1OCBmYW5fY29udHJvbF9pbml0aWFsX3N0YXR1czsKLXN0YXRpYyB1OCBmYW5fY29udHJvbF9kZXNpcmVkX2xldmVsOwotc3RhdGljIGludCBmYW5fd2F0Y2hkb2dfbWF4aW50ZXJ2YWw7Ci0KLXN0YXRpYyBzdHJ1Y3QgbXV0ZXggZmFuX211dGV4OwotCi1zdGF0aWMgYWNwaV9oYW5kbGUgZmFuc19oYW5kbGUsIGdmYW5faGFuZGxlLCBzZmFuX2hhbmRsZTsKLQotc3RhdGljIGludCBmYW5faW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKTsKLXN0YXRpYyB2b2lkIGZhbl9leGl0KHZvaWQpOwotc3RhdGljIGludCBmYW5fZ2V0X3N0YXR1cyh1OCAqc3RhdHVzKTsKLXN0YXRpYyBpbnQgZmFuX2dldF9zdGF0dXNfc2FmZSh1OCAqc3RhdHVzKTsKLXN0YXRpYyBpbnQgZmFuX2dldF9zcGVlZCh1bnNpZ25lZCBpbnQgKnNwZWVkKTsKLXN0YXRpYyB2b2lkIGZhbl91cGRhdGVfZGVzaXJlZF9sZXZlbCh1OCBzdGF0dXMpOwotc3RhdGljIHZvaWQgZmFuX3dhdGNoZG9nX2ZpcmUoc3RydWN0IHdvcmtfc3RydWN0ICppZ25vcmVkKTsKLXN0YXRpYyB2b2lkIGZhbl93YXRjaGRvZ19yZXNldCh2b2lkKTsKLXN0YXRpYyBpbnQgZmFuX3NldF9sZXZlbChpbnQgbGV2ZWwpOwotc3RhdGljIGludCBmYW5fc2V0X2xldmVsX3NhZmUoaW50IGxldmVsKTsKLXN0YXRpYyBpbnQgZmFuX3NldF9lbmFibGUodm9pZCk7Ci1zdGF0aWMgaW50IGZhbl9zZXRfZGlzYWJsZSh2b2lkKTsKLXN0YXRpYyBpbnQgZmFuX3NldF9zcGVlZChpbnQgc3BlZWQpOwotc3RhdGljIGludCBmYW5fcmVhZChjaGFyICpwKTsKLXN0YXRpYyBpbnQgZmFuX3dyaXRlKGNoYXIgKmJ1Zik7Ci1zdGF0aWMgaW50IGZhbl93cml0ZV9jbWRfbGV2ZWwoY29uc3QgY2hhciAqY21kLCBpbnQgKnJjKTsKLXN0YXRpYyBpbnQgZmFuX3dyaXRlX2NtZF9lbmFibGUoY29uc3QgY2hhciAqY21kLCBpbnQgKnJjKTsKLXN0YXRpYyBpbnQgZmFuX3dyaXRlX2NtZF9kaXNhYmxlKGNvbnN0IGNoYXIgKmNtZCwgaW50ICpyYyk7Ci1zdGF0aWMgaW50IGZhbl93cml0ZV9jbWRfc3BlZWQoY29uc3QgY2hhciAqY21kLCBpbnQgKnJjKTsKLXN0YXRpYyBpbnQgZmFuX3dyaXRlX2NtZF93YXRjaGRvZyhjb25zdCBjaGFyICpjbWQsIGludCAqcmMpOwotCi0KLS8qCi0gKiBIb3RrZXkgc3ViZHJpdmVyCi0gKi8KLQotc3RhdGljIGludCBob3RrZXlfb3JpZ19zdGF0dXM7Ci1zdGF0aWMgdTMyIGhvdGtleV9vcmlnX21hc2s7Ci0KLXN0YXRpYyBzdHJ1Y3QgbXV0ZXggaG90a2V5X211dGV4OwotCi1zdGF0aWMgaW50IGhvdGtleV9pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pOwotc3RhdGljIHZvaWQgaG90a2V5X2V4aXQodm9pZCk7Ci1zdGF0aWMgaW50IGhvdGtleV9nZXQoaW50ICpzdGF0dXMsIHUzMiAqbWFzayk7Ci1zdGF0aWMgaW50IGhvdGtleV9zZXQoaW50IHN0YXR1cywgdTMyIG1hc2spOwotc3RhdGljIHZvaWQgaG90a2V5X25vdGlmeShzdHJ1Y3QgaWJtX3N0cnVjdCAqaWJtLCB1MzIgZXZlbnQpOwotc3RhdGljIGludCBob3RrZXlfcmVhZChjaGFyICpwKTsKLXN0YXRpYyBpbnQgaG90a2V5X3dyaXRlKGNoYXIgKmJ1Zik7Ci0KLQotLyoKLSAqIExFRCBzdWJkcml2ZXIKLSAqLwotCi1lbnVtIGxlZF9hY2Nlc3NfbW9kZSB7Ci0JVFBBQ1BJX0xFRF9OT05FID0gMCwKLQlUUEFDUElfTEVEXzU3MCwJLyogNTcwICovCi0JVFBBQ1BJX0xFRF9PTEQsCS8qIDYwMGUveCwgNzcwZSwgNzcweCwgQTIxZSwgQTJ4bS9wLCBUMjAtMjIsIFgyMC0yMSAqLwotCVRQQUNQSV9MRURfTkVXLAkvKiBhbGwgb3RoZXJzICovCi19OwotCi1lbnVtIHsJLyogRm9yIFRQQUNQSV9MRURfT0xEICovCi0JVFBBQ1BJX0xFRF9FQ19ITENMID0gMHgwYywJLyogRUMgcmVnIHRvIGdldCBsZWQgdG8gcG93ZXIgb24gKi8KLQlUUEFDUElfTEVEX0VDX0hMQkwgPSAweDBkLAkvKiBFQyByZWcgdG8gYmxpbmsgYSBsaXQgbGVkICovCi0JVFBBQ1BJX0xFRF9FQ19ITE1TID0gMHgwZSwJLyogRUMgcmVnIHRvIHNlbGVjdCBsZWQgdG8gY29tbWFuZCAqLwotfTsKLQotc3RhdGljIGVudW0gbGVkX2FjY2Vzc19tb2RlIGxlZF9zdXBwb3J0ZWQ7Ci1zdGF0aWMgYWNwaV9oYW5kbGUgbGVkX2hhbmRsZTsKLQotc3RhdGljIGludCBsZWRfaW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKTsKLXN0YXRpYyBpbnQgbGVkX3JlYWQoY2hhciAqcCk7Ci1zdGF0aWMgaW50IGxlZF93cml0ZShjaGFyICpidWYpOwotCi0vKgotICogTGlnaHQgKHRoaW5rbGlnaHQpIHN1YmRyaXZlcgotICovCi0KLXN0YXRpYyBhY3BpX2hhbmRsZSBsZ2h0X2hhbmRsZSwgbGVkYl9oYW5kbGU7Ci0KLXN0YXRpYyBpbnQgbGlnaHRfaW5pdChzdHJ1Y3QgaWJtX2luaXRfc3RydWN0ICppaWJtKTsKLXN0YXRpYyBpbnQgbGlnaHRfcmVhZChjaGFyICpwKTsKLXN0YXRpYyBpbnQgbGlnaHRfd3JpdGUoY2hhciAqYnVmKTsKLQotCi0vKgotICogVGhlcm1hbCBzdWJkcml2ZXIKLSAqLwotCi1lbnVtIHRoZXJtYWxfYWNjZXNzX21vZGUgewotCVRQQUNQSV9USEVSTUFMX05PTkUgPSAwLAkvKiBObyB0aGVybWFsIHN1cHBvcnQgKi8KLQlUUEFDUElfVEhFUk1BTF9BQ1BJX1RNUDA3LAkvKiBVc2UgQUNQSSBUTVAwLTcgKi8KLQlUUEFDUElfVEhFUk1BTF9BQ1BJX1VQRFQsCS8qIFVzZSBBQ1BJIFRNUDAtNyB3aXRoIFVQRFQgKi8KLQlUUEFDUElfVEhFUk1BTF9UUEVDXzgsCQkvKiBVc2UgQUNQSSBFQyByZWdzLCA4IHNlbnNvcnMgKi8KLQlUUEFDUElfVEhFUk1BTF9UUEVDXzE2LAkJLyogVXNlIEFDUEkgRUMgcmVncywgMTYgc2Vuc29ycyAqLwotfTsKLQotZW51bSB7IC8qIFRQQUNQSV9USEVSTUFMX1RQRUNfKiAqLwotCVRQX0VDX1RIRVJNQUxfVE1QMCA9IDB4NzgsCS8qIEFDUEkgRUMgcmVncyBUTVAgMC4uNyAqLwotCVRQX0VDX1RIRVJNQUxfVE1QOCA9IDB4QzAsCS8qIEFDUEkgRUMgcmVncyBUTVAgOC4uMTUgKi8KLQlUUF9FQ19USEVSTUFMX1RNUF9OQSA9IC0xMjgsCS8qIEFDUEkgRUMgc2Vuc29yIG5vdCBhdmFpbGFibGUgKi8KLX07Ci0KLSNkZWZpbmUgVFBBQ1BJX01BWF9USEVSTUFMX1NFTlNPUlMgMTYJLyogTWF4IHRoZXJtYWwgc2Vuc29ycyBzdXBwb3J0ZWQgKi8KLXN0cnVjdCBpYm1fdGhlcm1hbF9zZW5zb3JzX3N0cnVjdCB7Ci0JczMyIHRlbXBbVFBBQ1BJX01BWF9USEVSTUFMX1NFTlNPUlNdOwotfTsKLQotc3RhdGljIGVudW0gdGhlcm1hbF9hY2Nlc3NfbW9kZSB0aGVybWFsX3JlYWRfbW9kZTsKLQotc3RhdGljIGludCB0aGVybWFsX2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSk7Ci1zdGF0aWMgaW50IHRoZXJtYWxfZ2V0X3NlbnNvcihpbnQgaWR4LCBzMzIgKnZhbHVlKTsKLXN0YXRpYyBpbnQgdGhlcm1hbF9nZXRfc2Vuc29ycyhzdHJ1Y3QgaWJtX3RoZXJtYWxfc2Vuc29yc19zdHJ1Y3QgKnMpOwotc3RhdGljIGludCB0aGVybWFsX3JlYWQoY2hhciAqcCk7Ci0KLQotLyoKLSAqIFZpZGVvIHN1YmRyaXZlcgotICovCi0KLWVudW0gdmlkZW9fYWNjZXNzX21vZGUgewotCVRQQUNQSV9WSURFT19OT05FID0gMCwKLQlUUEFDUElfVklERU9fNTcwLAkvKiA1NzAgKi8KLQlUUEFDUElfVklERU9fNzcwLAkvKiA2MDBlL3gsIDc3MGUsIDc3MHggKi8KLQlUUEFDUElfVklERU9fTkVXLAkvKiBhbGwgb3RoZXJzICovCi19OwotCi1lbnVtIHsJLyogdmlkZW8gc3RhdHVzIGZsYWdzLCBiYXNlZCBvbiBWSURFT181NzAgKi8KLQlUUF9BQ1BJX1ZJREVPX1NfTENEID0gMHgwMSwJLyogTENEIG91dHB1dCBlbmFibGVkICovCi0JVFBfQUNQSV9WSURFT19TX0NSVCA9IDB4MDIsCS8qIENSVCBvdXRwdXQgZW5hYmxlZCAqLwotCVRQX0FDUElfVklERU9fU19EVkkgPSAweDA4LAkvKiBEVkkgb3V0cHV0IGVuYWJsZWQgKi8KLX07Ci0KLWVudW0geyAgLyogVFBBQ1BJX1ZJREVPXzU3MCBjb25zdGFudHMgKi8KLQlUUF9BQ1BJX1ZJREVPXzU3MF9QSFNDTUQgPSAweDg3LAkvKiB1bmtub3duIG1hZ2ljIGNvbnN0YW50IDooICovCi0JVFBfQUNQSV9WSURFT181NzBfUEhTTUFTSyA9IDB4MDMsCS8qIFBIUyBiaXRzIHRoYXQgbWFwIHRvCi0JCQkJCQkgKiB2aWRlb19zdGF0dXNfZmxhZ3MgKi8KLQlUUF9BQ1BJX1ZJREVPXzU3MF9QSFMyQ01EID0gMHg4YiwJLyogdW5rbm93biBtYWdpYyBjb25zdGFudCA6KCAqLwotCVRQX0FDUElfVklERU9fNTcwX1BIUzJTRVQgPSAweDgwLAkvKiB1bmtub3duIG1hZ2ljIGNvbnN0YW50IDooICovCi19OwotCi1zdGF0aWMgZW51bSB2aWRlb19hY2Nlc3NfbW9kZSB2aWRlb19zdXBwb3J0ZWQ7Ci1zdGF0aWMgaW50IHZpZGVvX29yaWdfYXV0b3N3Owotc3RhdGljIGFjcGlfaGFuZGxlIHZpZF9oYW5kbGUsIHZpZDJfaGFuZGxlOwotCi1zdGF0aWMgaW50IHZpZGVvX2luaXQoc3RydWN0IGlibV9pbml0X3N0cnVjdCAqaWlibSk7Ci1zdGF0aWMgdm9pZCB2aWRlb19leGl0KHZvaWQpOwotc3RhdGljIGludCB2aWRlb19vdXRwdXRzd19nZXQodm9pZCk7Ci1zdGF0aWMgaW50IHZpZGVvX291dHB1dHN3X3NldChpbnQgc3RhdHVzKTsKLXN0YXRpYyBpbnQgdmlkZW9fYXV0b3N3X2dldCh2b2lkKTsKLXN0YXRpYyBpbnQgdmlkZW9fYXV0b3N3X3NldChpbnQgZW5hYmxlKTsKLXN0YXRpYyBpbnQgdmlkZW9fb3V0cHV0c3dfY3ljbGUodm9pZCk7Ci1zdGF0aWMgaW50IHZpZGVvX2V4cGFuZF90b2dnbGUodm9pZCk7Ci1zdGF0aWMgaW50IHZpZGVvX3JlYWQoY2hhciAqcCk7Ci1zdGF0aWMgaW50IHZpZGVvX3dyaXRlKGNoYXIgKmJ1Zik7Ci0KLQotLyoKLSAqIFZvbHVtZSBzdWJkcml2ZXIKLSAqLwotCi1zdGF0aWMgaW50IHZvbHVtZV9vZmZzZXQgPSAweDMwOwotCi1zdGF0aWMgaW50IHZvbHVtZV9yZWFkKGNoYXIgKnApOwotc3RhdGljIGludCB2b2x1bWVfd3JpdGUoY2hhciAqYnVmKTsKLQotCi0vKgotICogV2FuIHN1YmRyaXZlcgotICovCi0KLWVudW0gewotCS8qIEFDUEkgR1dBTi9TV0FOIGJpdHMgKi8KLQlUUF9BQ1BJX1dBTkNBUkRfSFdQUkVTRU5UCT0gMHgwMSwJLyogV2FuIGh3IGF2YWlsYWJsZSAqLwotCVRQX0FDUElfV0FOQ0FSRF9SQURJT1NTVwk9IDB4MDIsCS8qIFdhbiByYWRpbyBlbmFibGVkICovCi0JVFBfQUNQSV9XQU5DQVJEX1VOSwkJPSAweDA0LAkvKiB1bmtub3duIGZ1bmN0aW9uICovCi19OwotCi1zdGF0aWMgaW50IHdhbl9pbml0KHN0cnVjdCBpYm1faW5pdF9zdHJ1Y3QgKmlpYm0pOwotc3RhdGljIGludCB3YW5fZ2V0X3JhZGlvc3codm9pZCk7Ci1zdGF0aWMgaW50IHdhbl9zZXRfcmFkaW9zdyhpbnQgcmFkaW9fb24pOwotc3RhdGljIGludCB3YW5fcmVhZChjaGFyICpwKTsKLXN0YXRpYyBpbnQgd2FuX3dyaXRlKGNoYXIgKmJ1Zik7Ci0KLQotI2VuZGlmIC8qIF9fVEhJTktQQURfQUNQSV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvdGlmbV83eHgxLmMgYi9kcml2ZXJzL21pc2MvdGlmbV83eHgxLmMKaW5kZXggNTQzODBkYS4uNjNhMDg5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3RpZm1fN3h4MS5jCisrKyBiL2RyaXZlcnMvbWlzYy90aWZtXzd4eDEuYwpAQCAtMzAyLDYgKzMwMiwyMSBAQAogCiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKK3N0YXRpYyBpbnQgdGlmbV83eHgxX2R1bW15X2hhc19tc19waWYoc3RydWN0IHRpZm1fYWRhcHRlciAqZm0sCisJCQkJICAgICAgc3RydWN0IHRpZm1fZGV2ICpzb2NrKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRpZm1fN3h4MV9oYXNfbXNfcGlmKHN0cnVjdCB0aWZtX2FkYXB0ZXIgKmZtLCBzdHJ1Y3QgdGlmbV9kZXYgKnNvY2spCit7CisJaWYgKCgoZm0tPm51bV9zb2NrZXRzID09IDQpICYmIChzb2NrLT5zb2NrZXRfaWQgPT0gMikpCisJICAgIHx8ICgoZm0tPm51bV9zb2NrZXRzID09IDIpICYmIChzb2NrLT5zb2NrZXRfaWQgPT0gMCkpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHRpZm1fN3h4MV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAogCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmRldl9pZCkKIHsKQEAgLTMzNiw2ICszNTEsNyBAQAogCiAJSU5JVF9XT1JLKCZmbS0+bWVkaWFfc3dpdGNoZXIsIHRpZm1fN3h4MV9zd2l0Y2hfbWVkaWEpOwogCWZtLT5lamVjdCA9IHRpZm1fN3h4MV9lamVjdDsKKwlmbS0+aGFzX21zX3BpZiA9IHRpZm1fN3h4MV9oYXNfbXNfcGlmOwogCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIGZtKTsKIAogCWZtLT5hZGRyID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKSwKQEAgLTM3Nyw2ICszOTMsNyBAQAogCWludCBjbnQ7CiAKIAlmbS0+ZWplY3QgPSB0aWZtXzd4eDFfZHVtbXlfZWplY3Q7CisJZm0tPmhhc19tc19waWYgPSB0aWZtXzd4eDFfZHVtbXlfaGFzX21zX3BpZjsKIAl3cml0ZWwoVElGTV9JUlFfU0VUQUxMLCBmbS0+YWRkciArIEZNX0NMRUFSX0lOVEVSUlVQVF9FTkFCTEUpOwogCW1taW93YigpOwogCWZyZWVfaXJxKGRldi0+aXJxLCBmbSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvdGlmbV9jb3JlLmMgYi9kcml2ZXJzL21pc2MvdGlmbV9jb3JlLmMKaW5kZXggOTc1NDQwNS4uODJkYzcyYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy90aWZtX2NvcmUuYworKysgYi9kcml2ZXJzL21pc2MvdGlmbV9jb3JlLmMKQEAgLTI4NCw2ICsyODQsMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0wodGlmbV9lamVjdCk7CiAKK2ludCB0aWZtX2hhc19tc19waWYoc3RydWN0IHRpZm1fZGV2ICpzb2NrKQoreworCXN0cnVjdCB0aWZtX2FkYXB0ZXIgKmZtID0gZGV2X2dldF9kcnZkYXRhKHNvY2stPmRldi5wYXJlbnQpOworCXJldHVybiBmbS0+aGFzX21zX3BpZihmbSwgc29jayk7Cit9CitFWFBPUlRfU1lNQk9MKHRpZm1faGFzX21zX3BpZik7CisKIGludCB0aWZtX21hcF9zZyhzdHJ1Y3QgdGlmbV9kZXYgKnNvY2ssIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKIAkJaW50IGRpcmVjdGlvbikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL0tjb25maWcgYi9kcml2ZXJzL210ZC9LY29uZmlnCmluZGV4IDg4NDhlOGEuLmU4NTAzMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvS2NvbmZpZwpAQCAtMTUwLDYgKzE1MCwxNCBAQAogCSAgZm9yIHlvdXIgcGFydGljdWxhciBkZXZpY2UuIEl0IHdvbid0IGhhcHBlbiBhdXRvbWF0aWNhbGx5LiBUaGUKIAkgICdhcm1mbGFzaCcgbWFwIGRyaXZlciAoQ09ORklHX01URF9BUk1GTEFTSCkgZG9lcyB0aGlzLCBmb3IgZXhhbXBsZS4KIAorY29uZmlnIE1URF9PRl9QQVJUUworCXRyaXN0YXRlICJGbGFzaCBwYXJ0aXRpb24gbWFwIGJhc2VkIG9uIE9GIGRlc2NyaXB0aW9uIgorCWRlcGVuZHMgb24gUFBDX09GICYmIE1URF9QQVJUSVRJT05TCisJaGVscAorCSAgVGhpcyBwcm92aWRlcyBhIHBhcnRpdGlvbiBwYXJzaW5nIGZ1bmN0aW9uIHdoaWNoIGRlcml2ZXMKKwkgIHRoZSBwYXJ0aXRpb24gbWFwIGZyb20gdGhlIGNoaWxkcmVuIG9mIHRoZSBmbGFzaCBub2RlLAorCSAgYXMgZGVzY3JpYmVkIGluIERvY3VtZW50YXRpb24vcG93ZXJwYy9ib290aW5nLXdpdGhvdXQtb2YudHh0LgorCiBjb21tZW50ICJVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycyIKIAogY29uZmlnIE1URF9DSEFSCkBAIC0yODYsNiArMjk0LDkgQEAKIAkgIGJ1ZmZlciBpbiBhIGZsYXNoIHBhcnRpdGlvbiB3aGVyZSBpdCBjYW4gYmUgcmVhZCBiYWNrIGF0IHNvbWUKIAkgIGxhdGVyIHBvaW50LgogCisJICBUbyB1c2UsIGFkZCBjb25zb2xlPXR0eU1URHggdG8gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUsCisJICB3aGVyZSB4IGlzIHRoZSBNVEQgZGV2aWNlIG51bWJlciB0byB1c2UuCisKIHNvdXJjZSAiZHJpdmVycy9tdGQvY2hpcHMvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL210ZC9tYXBzL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9NYWtlZmlsZSBiL2RyaXZlcnMvbXRkL01ha2VmaWxlCmluZGV4IDdmMGIwNGIuLjUzOGUzM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbXRkL01ha2VmaWxlCkBAIC0xMSw2ICsxMSw3IEBACiBvYmotJChDT05GSUdfTVREX1JFREJPT1RfUEFSVFMpICs9IHJlZGJvb3Qubwogb2JqLSQoQ09ORklHX01URF9DTURMSU5FX1BBUlRTKSArPSBjbWRsaW5lcGFydC5vCiBvYmotJChDT05GSUdfTVREX0FGU19QQVJUUykJKz0gYWZzLm8KK29iai0kKENPTkZJR19NVERfT0ZfUEFSVFMpICAgICAgKz0gb2ZwYXJ0Lm8KIAogIyAnVXNlcnMnIC0gY29kZSB3aGljaCBwcmVzZW50cyBmdW5jdGlvbmFsaXR5IHRvIHVzZXJzcGFjZS4KIG9iai0kKENPTkZJR19NVERfQ0hBUikJCSs9IG10ZGNoYXIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAxLmMgYi9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMDEuYwppbmRleCAxNzA3Zjk4Li40Nzc5NGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMDEuYworKysgYi9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMDEuYwpAQCAtNTAsNiArNTAsNyBAQAogI2RlZmluZSBJODI4MDJBQwkweDAwYWMKICNkZWZpbmUgTUFOVUZBQ1RVUkVSX1NUICAgICAgICAgMHgwMDIwCiAjZGVmaW5lIE01MExQVzA4MCAgICAgICAweDAwMkYKKyNkZWZpbmUgQVQ0OUJWNjQwRAkweDAyZGUKIAogc3RhdGljIGludCBjZmlfaW50ZWxleHRfcmVhZCAoc3RydWN0IG10ZF9pbmZvICosIGxvZmZfdCwgc2l6ZV90LCBzaXplX3QgKiwgdV9jaGFyICopOwogc3RhdGljIGludCBjZmlfaW50ZWxleHRfd3JpdGVfd29yZHMoc3RydWN0IG10ZF9pbmZvICosIGxvZmZfdCwgc2l6ZV90LCBzaXplX3QgKiwgY29uc3QgdV9jaGFyICopOwpAQCAtMTU3LDYgKzE1OCw0NyBAQAogfQogI2VuZGlmCiAKKy8qIEF0bWVsIGNoaXBzIGRvbid0IHVzZSB0aGUgc2FtZSBQUkkgZm9ybWF0IGFzIEludGVsIGNoaXBzICovCitzdGF0aWMgdm9pZCBmaXh1cF9jb252ZXJ0X2F0bWVsX3ByaShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdm9pZCAqcGFyYW0pCit7CisJc3RydWN0IG1hcF9pbmZvICptYXAgPSBtdGQtPnByaXY7CisJc3RydWN0IGNmaV9wcml2YXRlICpjZmkgPSBtYXAtPmZsZHJ2X3ByaXY7CisJc3RydWN0IGNmaV9wcmlfaW50ZWxleHQgKmV4dHAgPSBjZmktPmNtZHNldF9wcml2OworCXN0cnVjdCBjZmlfcHJpX2F0bWVsIGF0bWVsX3ByaTsKKwl1aW50MzJfdCBmZWF0dXJlcyA9IDA7CisKKwkvKiBSZXZlcnNlIGJ5dGVzd2FwcGluZyAqLworCWV4dHAtPkZlYXR1cmVTdXBwb3J0ID0gY3B1X3RvX2xlMzIoZXh0cC0+RmVhdHVyZVN1cHBvcnQpOworCWV4dHAtPkJsa1N0YXR1c1JlZ01hc2sgPSBjcHVfdG9fbGUxNihleHRwLT5CbGtTdGF0dXNSZWdNYXNrKTsKKwlleHRwLT5Qcm90UmVnQWRkciA9IGNwdV90b19sZTE2KGV4dHAtPlByb3RSZWdBZGRyKTsKKworCW1lbWNweSgmYXRtZWxfcHJpLCBleHRwLCBzaXplb2YoYXRtZWxfcHJpKSk7CisJbWVtc2V0KChjaGFyICopZXh0cCArIDUsIDAsIHNpemVvZigqZXh0cCkgLSA1KTsKKworCXByaW50ayhLRVJOX0VSUiAiYXRtZWwgRmVhdHVyZXM6ICUwMnhcbiIsIGF0bWVsX3ByaS5GZWF0dXJlcyk7CisKKwlpZiAoYXRtZWxfcHJpLkZlYXR1cmVzICYgMHgwMSkgLyogY2hpcCBlcmFzZSBzdXBwb3J0ZWQgKi8KKwkJZmVhdHVyZXMgfD0gKDE8PDApOworCWlmIChhdG1lbF9wcmkuRmVhdHVyZXMgJiAweDAyKSAvKiBlcmFzZSBzdXNwZW5kIHN1cHBvcnRlZCAqLworCQlmZWF0dXJlcyB8PSAoMTw8MSk7CisJaWYgKGF0bWVsX3ByaS5GZWF0dXJlcyAmIDB4MDQpIC8qIHByb2dyYW0gc3VzcGVuZCBzdXBwb3J0ZWQgKi8KKwkJZmVhdHVyZXMgfD0gKDE8PDIpOworCWlmIChhdG1lbF9wcmkuRmVhdHVyZXMgJiAweDA4KSAvKiBzaW11bHRhbmVvdXMgb3BlcmF0aW9ucyBzdXBwb3J0ZWQgKi8KKwkJZmVhdHVyZXMgfD0gKDE8PDkpOworCWlmIChhdG1lbF9wcmkuRmVhdHVyZXMgJiAweDIwKSAvKiBwYWdlIG1vZGUgcmVhZCBzdXBwb3J0ZWQgKi8KKwkJZmVhdHVyZXMgfD0gKDE8PDcpOworCWlmIChhdG1lbF9wcmkuRmVhdHVyZXMgJiAweDQwKSAvKiBxdWV1ZWQgZXJhc2Ugc3VwcG9ydGVkICovCisJCWZlYXR1cmVzIHw9ICgxPDw0KTsKKwlpZiAoYXRtZWxfcHJpLkZlYXR1cmVzICYgMHg4MCkgLyogUHJvdGVjdGlvbiBiaXRzIHN1cHBvcnRlZCAqLworCQlmZWF0dXJlcyB8PSAoMTw8Nik7CisKKwlleHRwLT5GZWF0dXJlU3VwcG9ydCA9IGZlYXR1cmVzOworCisJLyogYnVyc3Qgd3JpdGUgbW9kZSBub3Qgc3VwcG9ydGVkICovCisJY2ZpLT5jZmlxLT5CdWZXcml0ZVRpbWVvdXRUeXAgPSAwOworCWNmaS0+Y2ZpcS0+QnVmV3JpdGVUaW1lb3V0TWF4ID0gMDsKK30KKwogI2lmZGVmIENNRFNFVDAwMDFfRElTQUJMRV9FUkFTRV9TVVNQRU5EX09OX1dSSVRFCiAvKiBTb21lIEludGVsIFN0cmF0YSBGbGFzaCBwcmlvciB0byBGUE8gcmV2aXNpb24gQyBoYXMgYnVncyBpbiB0aGlzIGFyZWEgKi8KIHN0YXRpYyB2b2lkIGZpeHVwX2ludGVsX3N0cmF0YWZsYXNoKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB2b2lkKiBwYXJhbSkKQEAgLTIyNywxMyArMjY5LDIwIEBACiAvKgogICogU29tZSBjaGlwcyBwb3dlci11cCB3aXRoIGFsbCBzZWN0b3JzIGxvY2tlZCBieSBkZWZhdWx0LgogICovCi1zdGF0aWMgdm9pZCBmaXh1cF91c2VfcG93ZXJ1cF9sb2NrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB2b2lkICpwYXJhbSkKK3N0YXRpYyB2b2lkIGZpeHVwX3VubG9ja19wb3dlcnVwX2xvY2soc3RydWN0IG10ZF9pbmZvICptdGQsIHZvaWQgKnBhcmFtKQogewotCXByaW50ayhLRVJOX0lORk8gIlVzaW5nIGF1dG8tdW5sb2NrIG9uIHBvd2VyLXVwL3Jlc3VtZVxuIiApOwotCW10ZC0+ZmxhZ3MgfD0gTVREX1NUVVBJRF9MT0NLOworCXN0cnVjdCBtYXBfaW5mbyAqbWFwID0gbXRkLT5wcml2OworCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpID0gbWFwLT5mbGRydl9wcml2OworCXN0cnVjdCBjZmlfcHJpX2ludGVsZXh0ICpjZmlwID0gY2ZpLT5jbWRzZXRfcHJpdjsKKworCWlmIChjZmlwLT5GZWF0dXJlU3VwcG9ydCYzMikgeworCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBhdXRvLXVubG9jayBvbiBwb3dlci11cC9yZXN1bWVcbiIgKTsKKwkJbXRkLT5mbGFncyB8PSBNVERfUE9XRVJVUF9MT0NLOworCX0KIH0KIAogc3RhdGljIHN0cnVjdCBjZmlfZml4dXAgY2ZpX2ZpeHVwX3RhYmxlW10gPSB7CisJeyBDRklfTUZSX0FUTUVMLCBDRklfSURfQU5ZLCBmaXh1cF9jb252ZXJ0X2F0bWVsX3ByaSwgTlVMTCB9LAogI2lmZGVmIENNRFNFVDAwMDFfRElTQUJMRV9FUkFTRV9TVVNQRU5EX09OX1dSSVRFCiAJeyBDRklfTUZSX0FOWSwgQ0ZJX0lEX0FOWSwgZml4dXBfaW50ZWxfc3RyYXRhZmxhc2gsIE5VTEwgfSwKICNlbmRpZgpAQCAtMjQ1LDcgKzI5NCw3IEBACiAjZW5kaWYKIAl7IENGSV9NRlJfU1QsIDB4MDBiYSwgLyogTTI4VzMyMENUICovIGZpeHVwX3N0X20yOHczMjBjdCwgTlVMTCB9LAogCXsgQ0ZJX01GUl9TVCwgMHgwMGJiLCAvKiBNMjhXMzIwQ0IgKi8gZml4dXBfc3RfbTI4dzMyMGNiLCBOVUxMIH0sCi0JeyBNQU5VRkFDVFVSRVJfSU5URUwsIDB4ODkxYywJICAgICAgZml4dXBfdXNlX3Bvd2VydXBfbG9jaywgTlVMTCwgfSwKKwl7IE1BTlVGQUNUVVJFUl9JTlRFTCwgQ0ZJX0lEX0FOWSwgZml4dXBfdW5sb2NrX3Bvd2VydXBfbG9jaywgTlVMTCwgfSwKIAl7IDAsIDAsIE5VTEwsIE5VTEwgfQogfTsKIApAQCAtMjc3LDcgKzMyNiw3IEBACiAJCXJldHVybiBOVUxMOwogCiAJaWYgKGV4dHAtPk1ham9yVmVyc2lvbiAhPSAnMScgfHwKLQkgICAgKGV4dHAtPk1pbm9yVmVyc2lvbiA8ICcwJyB8fCBleHRwLT5NaW5vclZlcnNpb24gPiAnNCcpKSB7CisJICAgIChleHRwLT5NaW5vclZlcnNpb24gPCAnMCcgfHwgZXh0cC0+TWlub3JWZXJzaW9uID4gJzUnKSkgewogCQlwcmludGsoS0VSTl9FUlIgIiAgVW5rbm93biBJbnRlbC9TaGFycCBFeHRlbmRlZCBRdWVyeSAiCiAJCSAgICAgICAidmVyc2lvbiAlYy4lYy5cbiIsICBleHRwLT5NYWpvclZlcnNpb24sCiAJCSAgICAgICBleHRwLT5NaW5vclZlcnNpb24pOwpAQCAtNzUyLDYgKzgwMSw3IEBACiBzdGF0aWMgaW50IGdldF9jaGlwKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBzdHJ1Y3QgZmxjaGlwICpjaGlwLCB1bnNpZ25lZCBsb25nIGFkciwgaW50IG1vZGUpCiB7CiAJaW50IHJldDsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAogIHJldHJ5OgogCWlmIChjaGlwLT5wcml2ICYmIChtb2RlID09IEZMX1dSSVRJTkcgfHwgbW9kZSA9PSBGTF9FUkFTSU5HCkBAIC04MDgsNiArODU4LDIwIEBACiAJCQlzcGluX3VubG9jayhjb250ZW5kZXItPm11dGV4KTsKIAkJfQogCisJCS8qIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBzdXNwZW5kZWQgZXJhc2UKKwkJICogb24gdGhpcyBjaGlwLiBTbGVlcC4gKi8KKwkJaWYgKG1vZGUgPT0gRkxfRVJBU0lORyAmJiBzaGFyZWQtPmVyYXNpbmcKKwkJICAgICYmIHNoYXJlZC0+ZXJhc2luZy0+b2xkc3RhdGUgPT0gRkxfRVJBU0lORykgeworCQkJc3Bpbl91bmxvY2soJnNoYXJlZC0+bG9jayk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlhZGRfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKKwkJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJCXNjaGVkdWxlKCk7CisJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKKwkJCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJCQlnb3RvIHJldHJ5OworCQl9CisKIAkJLyogV2Ugbm93IG93biBpdCAqLwogCQlzaGFyZWQtPndyaXRpbmcgPSBjaGlwOwogCQlpZiAobW9kZSA9PSBGTF9FUkFTSU5HKQpAQCAtMjI5NCw3ICsyMzU4LDcgQEAKIAlzdHJ1Y3QgZmxjaGlwICpjaGlwOwogCWludCByZXQgPSAwOwogCi0JaWYgKChtdGQtPmZsYWdzICYgTVREX1NUVVBJRF9MT0NLKQorCWlmICgobXRkLT5mbGFncyAmIE1URF9QT1dFUlVQX0xPQ0spCiAJICAgICYmIGV4dHAgJiYgKGV4dHAtPkZlYXR1cmVTdXBwb3J0ICYgKDEgPDwgNSkpKQogCQljZmlfaW50ZWxleHRfc2F2ZV9sb2NrcyhtdGQpOwogCkBAIC0yNDA1LDcgKzI0NjksNyBAQAogCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJfQogCi0JaWYgKChtdGQtPmZsYWdzICYgTVREX1NUVVBJRF9MT0NLKQorCWlmICgobXRkLT5mbGFncyAmIE1URF9QT1dFUlVQX0xPQ0spCiAJICAgICYmIGV4dHAgJiYgKGV4dHAtPkZlYXR1cmVTdXBwb3J0ICYgKDEgPDwgNSkpKQogCQljZmlfaW50ZWxleHRfcmVzdG9yZV9sb2NrcyhtdGQpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAyLmMgYi9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMDIuYwppbmRleCAzODlhY2M2Li5kMDcyZTg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMDIuYworKysgYi9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMDIuYwpAQCAtMTg1LDYgKzE4NSwxMCBAQAogCQlleHRwLT5Ub3BCb3R0b20gPSAyOwogCWVsc2UKIAkJZXh0cC0+VG9wQm90dG9tID0gMzsKKworCS8qIGJ1cnN0IHdyaXRlIG1vZGUgbm90IHN1cHBvcnRlZCAqLworCWNmaS0+Y2ZpcS0+QnVmV3JpdGVUaW1lb3V0VHlwID0gMDsKKwljZmktPmNmaXEtPkJ1ZldyaXRlVGltZW91dE1heCA9IDA7CiB9CiAKIHN0YXRpYyB2b2lkIGZpeHVwX3VzZV9zZWNzaShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdm9pZCAqcGFyYW0pCkBAIC0yMTMsMTAgKzIxNywxMSBAQAogewogCW10ZC0+bG9jayA9IGNmaV9hdG1lbF9sb2NrOwogCW10ZC0+dW5sb2NrID0gY2ZpX2F0bWVsX3VubG9jazsKLQltdGQtPmZsYWdzIHw9IE1URF9TVFVQSURfTE9DSzsKKwltdGQtPmZsYWdzIHw9IE1URF9QT1dFUlVQX0xPQ0s7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2ZpX2ZpeHVwIGNmaV9maXh1cF90YWJsZVtdID0geworCXsgQ0ZJX01GUl9BVE1FTCwgQ0ZJX0lEX0FOWSwgZml4dXBfY29udmVydF9hdG1lbF9wcmksIE5VTEwgfSwKICNpZmRlZiBBTURfQk9PVExPQ19CVUcKIAl7IENGSV9NRlJfQU1ELCBDRklfSURfQU5ZLCBmaXh1cF9hbWRfYm9vdGJsb2NrLCBOVUxMIH0sCiAjZW5kaWYKQEAgLTIyOSw3ICsyMzQsNiBAQAogI2lmICFGT1JDRV9XT1JEX1dSSVRFCiAJeyBDRklfTUZSX0FOWSwgQ0ZJX0lEX0FOWSwgZml4dXBfdXNlX3dyaXRlX2J1ZmZlcnMsIE5VTEwsIH0sCiAjZW5kaWYKLQl7IENGSV9NRlJfQVRNRUwsIENGSV9JRF9BTlksIGZpeHVwX2NvbnZlcnRfYXRtZWxfcHJpLCBOVUxMIH0sCiAJeyAwLCAwLCBOVUxMLCBOVUxMIH0KIH07CiBzdGF0aWMgc3RydWN0IGNmaV9maXh1cCBqZWRlY19maXh1cF90YWJsZVtdID0gewpAQCAtMzM4LDEwICszNDIsMTIgQEAKIAkJLyogTW9kaWZ5IHRoZSB1bmxvY2sgYWRkcmVzcyBpZiB3ZSBhcmUgaW4gY29tcGF0aWJpbGl0eSBtb2RlICovCiAJCWlmICgJLyogeDE2IGluIHg4IG1vZGUgKi8KIAkJCSgoY2ZpLT5kZXZpY2VfdHlwZSA9PSBDRklfREVWSUNFVFlQRV9YOCkgJiYKLQkJCQkoY2ZpLT5jZmlxLT5JbnRlcmZhY2VEZXNjID09IDIpKSB8fAorCQkJCShjZmktPmNmaXEtPkludGVyZmFjZURlc2MgPT0KKwkJCQkJQ0ZJX0lOVEVSRkFDRV9YOF9CWV9YMTZfQVNZTkMpKSB8fAogCQkJLyogeDMyIGluIHgxNiBtb2RlICovCiAJCQkoKGNmaS0+ZGV2aWNlX3R5cGUgPT0gQ0ZJX0RFVklDRVRZUEVfWDE2KSAmJgotCQkJCShjZmktPmNmaXEtPkludGVyZmFjZURlc2MgPT0gNCkpKQorCQkJCShjZmktPmNmaXEtPkludGVyZmFjZURlc2MgPT0KKwkJCQkJQ0ZJX0lOVEVSRkFDRV9YMTZfQllfWDMyX0FTWU5DKSkpCiAJCXsKIAkJCWNmaS0+YWRkcl91bmxvY2sxID0gMHhhYWE7CiAJCQljZmktPmFkZHJfdW5sb2NrMiA9IDB4NTU1OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX3Byb2JlLmMgYi9kcml2ZXJzL210ZC9jaGlwcy9jZmlfcHJvYmUuYwppbmRleCA2MGUxMWEwLi5mNjUxYjZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9jaGlwcy9jZmlfcHJvYmUuYworKysgYi9kcml2ZXJzL210ZC9jaGlwcy9jZmlfcHJvYmUuYwpAQCAtMzcwLDI3ICszNzAsMjcgQEAKIAlwcmludGsoIkRldmljZSBzaXplOiAweCVYIGJ5dGVzICglZCBNaUIpXG4iLCAxIDw8IGNmaXAtPkRldlNpemUsIDE8PCAoY2ZpcC0+RGV2U2l6ZSAtIDIwKSk7CiAJcHJpbnRrKCJGbGFzaCBEZXZpY2UgSW50ZXJmYWNlIGRlc2NyaXB0aW9uOiAweCU0LjRYXG4iLCBjZmlwLT5JbnRlcmZhY2VEZXNjKTsKIAlzd2l0Y2goY2ZpcC0+SW50ZXJmYWNlRGVzYykgewotCWNhc2UgMDoKKwljYXNlIENGSV9JTlRFUkZBQ0VfWDhfQVNZTkM6CiAJCXByaW50aygiICAtIHg4LW9ubHkgYXN5bmNocm9ub3VzIGludGVyZmFjZVxuIik7CiAJCWJyZWFrOwogCi0JY2FzZSAxOgorCWNhc2UgQ0ZJX0lOVEVSRkFDRV9YMTZfQVNZTkM6CiAJCXByaW50aygiICAtIHgxNi1vbmx5IGFzeW5jaHJvbm91cyBpbnRlcmZhY2VcbiIpOwogCQlicmVhazsKIAotCWNhc2UgMjoKKwljYXNlIENGSV9JTlRFUkZBQ0VfWDhfQllfWDE2X0FTWU5DOgogCQlwcmludGsoIiAgLSBzdXBwb3J0cyB4OCBhbmQgeDE2IHZpYSBCWVRFIyB3aXRoIGFzeW5jaHJvbm91cyBpbnRlcmZhY2VcbiIpOwogCQlicmVhazsKIAotCWNhc2UgMzoKKwljYXNlIENGSV9JTlRFUkZBQ0VfWDMyX0FTWU5DOgogCQlwcmludGsoIiAgLSB4MzItb25seSBhc3luY2hyb25vdXMgaW50ZXJmYWNlXG4iKTsKIAkJYnJlYWs7CiAKLQljYXNlIDQ6CisJY2FzZSBDRklfSU5URVJGQUNFX1gxNl9CWV9YMzJfQVNZTkM6CiAJCXByaW50aygiICAtIHN1cHBvcnRzIHgxNiBhbmQgeDMyIHZpYSBXb3JkIyB3aXRoIGFzeW5jaHJvbm91cyBpbnRlcmZhY2VcbiIpOwogCQlicmVhazsKIAotCWNhc2UgNjU1MzU6CisJY2FzZSBDRklfSU5URVJGQUNFX05PVF9BTExPV0VEOgogCQlwcmludGsoIiAgLSBOb3QgQWxsb3dlZCAvIFJlc2VydmVkXG4iKTsKIAkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2NoaXBzL2dlbl9wcm9iZS5jIGIvZHJpdmVycy9tdGQvY2hpcHMvZ2VuX3Byb2JlLmMKaW5kZXggMmViNjk2ZC4uZDMzOGI4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvY2hpcHMvZ2VuX3Byb2JlLmMKKysrIGIvZHJpdmVycy9tdGQvY2hpcHMvZ2VuX3Byb2JlLmMKQEAgLTExMiw3ICsxMTIsNyBAQAogCQltYXhfY2hpcHMgPSAxOwogCX0KIAotCW1hcHNpemUgPSAobWF4X2NoaXBzICsgQklUU19QRVJfTE9ORy0xKSAvIEJJVFNfUEVSX0xPTkc7CisJbWFwc2l6ZSA9IHNpemVvZihsb25nKSAqICggKG1heF9jaGlwcyArIEJJVFNfUEVSX0xPTkctMSkgLyBCSVRTX1BFUl9MT05HICk7CiAJY2hpcF9tYXAgPSBremFsbG9jKG1hcHNpemUsIEdGUF9LRVJORUwpOwogCWlmICghY2hpcF9tYXApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGttYWxsb2MgZmFpbGVkIGZvciBDRkkgY2hpcCBtYXBcbiIsIG1hcC0+bmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9jaGlwcy9qZWRlY19wcm9iZS5jIGIvZHJpdmVycy9tdGQvY2hpcHMvamVkZWNfcHJvYmUuYwppbmRleCBhNjdiMjNiLi40YmU1MWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9jaGlwcy9qZWRlY19wcm9iZS5jCisrKyBiL2RyaXZlcnMvbXRkL2NoaXBzL2plZGVjX3Byb2JlLmMKQEAgLTE5NCw4ICsxOTQsOCBAQAogCiAKIHN0cnVjdCB1bmxvY2tfYWRkciB7Ci0JdTMyIGFkZHIxOwotCXUzMiBhZGRyMjsKKwl1aW50MzJfdCBhZGRyMTsKKwl1aW50MzJfdCBhZGRyMjsKIH07CiAKIApAQCAtMjQ2LDE2ICsyNDYsMTYgQEAKIAl9CiB9OwogCi0KIHN0cnVjdCBhbWRfZmxhc2hfaW5mbyB7Ci0JY29uc3QgX191MTYgbWZyX2lkOwotCWNvbnN0IF9fdTE2IGRldl9pZDsKIAljb25zdCBjaGFyICpuYW1lOwotCWNvbnN0IGludCBEZXZTaXplOwotCWNvbnN0IGludCBOdW1FcmFzZVJlZ2lvbnM7Ci0JY29uc3QgaW50IENtZFNldDsKLQljb25zdCBfX3U4IHVhZGRyWzRdOwkJLyogdW5sb2NrIGFkZHJzIGZvciA4LCAxNiwgMzIsIDY0ICovCi0JY29uc3QgdWxvbmcgcmVnaW9uc1s2XTsKKwljb25zdCB1aW50MTZfdCBtZnJfaWQ7CisJY29uc3QgdWludDE2X3QgZGV2X2lkOworCWNvbnN0IHVpbnQ4X3QgZGV2X3NpemU7CisJY29uc3QgdWludDhfdCBucl9yZWdpb25zOworCWNvbnN0IHVpbnQxNl90IGNtZF9zZXQ7CisJY29uc3QgdWludDMyX3QgcmVnaW9uc1s2XTsKKwljb25zdCB1aW50OF90IGRldnR5cGVzOwkJLyogQml0bWFzayBmb3IgeDgsIHgxNiBldGMuICovCisJY29uc3QgdWludDhfdCB1YWRkcjsJCS8qIHVubG9jayBhZGRycyBmb3IgOCwgMTYsIDMyLCA2NCAqLwogfTsKIAogI2RlZmluZSBFUkFTRUlORk8oc2l6ZSxibG9ja3MpIChzaXplPDw4KXwoYmxvY2tzLTEpCkBAIC0yODAsMTIgKzI4MCwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9BTUQsCiAJCS5kZXZfaWQJCT0gQU0yOUYwMzJCLAogCQkubmFtZQkJPSAiQU1EIEFNMjlGMDMyQiIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfMHgwNTU1XzB4MDJBQSAvKiB4OCAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfNE1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDEsCisJCS51YWRkcgkJPSBNVERfVUFERFJfMHgwNTU1XzB4MDJBQSwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDgsCisJCS5kZXZfc2l6ZQk9IFNJWkVfNE1pQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gMSwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgxMDAwMCw2NCkKIAkJfQpAQCAtMjkzLDEzICsyOTIsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfQU1ELAogCQkuZGV2X2lkCQk9IEFNMjlMVjE2MERULAogCQkubmFtZQkJPSAiQU1EIEFNMjlMVjE2MERUIiwKLQkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDBBQUFfMHgwNTU1LCAgLyogeDggKi8KLQkJCVsxXSA9IE1URF9VQUREUl8weDA1NTVfMHgwMkFBICAgLyogeDE2ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV8yTWlCLAotCQkuQ21kU2V0CQk9IFBfSURfQU1EX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gNCwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDE2fENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4MEFBQV8weDA1NTUsCisJCS5kZXZfc2l6ZQk9IFNJWkVfMk1pQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gNCwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgxMDAwMCwzMSksCiAJCQlFUkFTRUlORk8oMHgwODAwMCwxKSwKQEAgLTMxMCwxMyArMzA3LDExIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX0FNRCwKIAkJLmRldl9pZAkJPSBBTTI5TFYxNjBEQiwKIAkJLm5hbWUJCT0gIkFNRCBBTTI5TFYxNjBEQiIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfMHgwQUFBXzB4MDU1NSwgIC8qIHg4ICovCi0JCQlbMV0gPSBNVERfVUFERFJfMHgwNTU1XzB4MDJBQSAgIC8qIHgxNiAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfMk1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDQsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1gxNnxDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDBBQUFfMHgwNTU1LAorCQkuZGV2X3NpemUJPSBTSVpFXzJNaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9BTURfU1RELAorCQkubnJfcmVnaW9ucwk9IDQsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MDQwMDAsMSksCiAJCQlFUkFTRUlORk8oMHgwMjAwMCwyKSwKQEAgLTMyNywxMyArMzIyLDExIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX0FNRCwKIAkJLmRldl9pZAkJPSBBTTI5TFY0MDBCQiwKIAkJLm5hbWUJCT0gIkFNRCBBTTI5TFY0MDBCQiIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfMHgwQUFBXzB4MDU1NSwgIC8qIHg4ICovCi0JCQlbMV0gPSBNVERfVUFERFJfMHgwNTU1XzB4MDJBQSwgIC8qIHgxNiAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfNTEyS2lCLAotCQkuQ21kU2V0CQk9IFBfSURfQU1EX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gNCwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDE2fENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4MEFBQV8weDA1NTUsCisJCS5kZXZfc2l6ZQk9IFNJWkVfNTEyS2lCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSA0LAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDA0MDAwLDEpLAogCQkJRVJBU0VJTkZPKDB4MDIwMDAsMiksCkBAIC0zNDQsMTMgKzMzNywxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9BTUQsCiAJCS5kZXZfaWQJCT0gQU0yOUxWNDAwQlQsCiAJCS5uYW1lCQk9ICJBTUQgQU0yOUxWNDAwQlQiLAotCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSXzB4MEFBQV8weDA1NTUsICAvKiB4OCAqLwotCQkJWzFdID0gTVREX1VBRERSXzB4MDU1NV8weDAyQUEsICAvKiB4MTYgKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzUxMktpQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDQsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1gxNnxDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDBBQUFfMHgwNTU1LAorCQkuZGV2X3NpemUJPSBTSVpFXzUxMktpQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gNCwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgxMDAwMCw3KSwKIAkJCUVSQVNFSU5GTygweDA4MDAwLDEpLApAQCAtMzYxLDEzICszNTIsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfQU1ELAogCQkuZGV2X2lkCQk9IEFNMjlMVjgwMEJCLAogCQkubmFtZQkJPSAiQU1EIEFNMjlMVjgwMEJCIiwKLQkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDBBQUFfMHgwNTU1LCAgLyogeDggKi8KLQkJCVsxXSA9IE1URF9VQUREUl8weDA1NTVfMHgwMkFBLCAgLyogeDE2ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV8xTWlCLAotCQkuQ21kU2V0CQk9IFBfSURfQU1EX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gNCwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDE2fENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4MEFBQV8weDA1NTUsCisJCS5kZXZfc2l6ZQk9IFNJWkVfMU1pQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gNCwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgwNDAwMCwxKSwKIAkJCUVSQVNFSU5GTygweDAyMDAwLDIpLApAQCAtMzc5LDEzICszNjgsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfQU1ELAogCQkuZGV2X2lkCQk9IEFNMjlETDgwMEJCLAogCQkubmFtZQkJPSAiQU1EIEFNMjlETDgwMEJCIiwKLQkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDBBQUFfMHgwNTU1LCAgLyogeDggKi8KLQkJCVsxXSA9IE1URF9VQUREUl8weDA1NTVfMHgwMkFBLCAgLyogeDE2ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV8xTWlCLAotCQkuQ21kU2V0CQk9IFBfSURfQU1EX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gNiwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDE2fENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4MEFBQV8weDA1NTUsCisJCS5kZXZfc2l6ZQk9IFNJWkVfMU1pQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gNiwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgwNDAwMCwxKSwKIAkJCUVSQVNFSU5GTygweDA4MDAwLDEpLApAQCAtMzk4LDEzICszODUsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfQU1ELAogCQkuZGV2X2lkCQk9IEFNMjlETDgwMEJULAogCQkubmFtZQkJPSAiQU1EIEFNMjlETDgwMEJUIiwKLQkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDBBQUFfMHgwNTU1LCAgLyogeDggKi8KLQkJCVsxXSA9IE1URF9VQUREUl8weDA1NTVfMHgwMkFBLCAgLyogeDE2ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV8xTWlCLAotCQkuQ21kU2V0CQk9IFBfSURfQU1EX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gNiwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDE2fENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4MEFBQV8weDA1NTUsCisJCS5kZXZfc2l6ZQk9IFNJWkVfMU1pQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gNiwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgxMDAwMCwxNCksCiAJCQlFUkFTRUlORk8oMHgwNDAwMCwxKSwKQEAgLTQxNywxMyArNDAyLDExIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX0FNRCwKIAkJLmRldl9pZAkJPSBBTTI5RjgwMEJCLAogCQkubmFtZQkJPSAiQU1EIEFNMjlGODAwQkIiLAotCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSXzB4MEFBQV8weDA1NTUsICAvKiB4OCAqLwotCQkJWzFdID0gTVREX1VBRERSXzB4MDU1NV8weDAyQUEsICAvKiB4MTYgKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzFNaUIsCi0JCS5DbWRTZXQJCT0gUF9JRF9BTURfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSA0LAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YMTZ8Q0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfMHgwQUFBXzB4MDU1NSwKKwkJLmRldl9zaXplCT0gU0laRV8xTWlCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSA0LAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDA0MDAwLDEpLAogCQkJRVJBU0VJTkZPKDB4MDIwMDAsMiksCkBAIC00MzQsMTMgKzQxNywxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9BTUQsCiAJCS5kZXZfaWQJCT0gQU0yOUxWODAwQlQsCiAJCS5uYW1lCQk9ICJBTUQgQU0yOUxWODAwQlQiLAotCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSXzB4MEFBQV8weDA1NTUsICAvKiB4OCAqLwotCQkJWzFdID0gTVREX1VBRERSXzB4MDU1NV8weDAyQUEsICAvKiB4MTYgKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzFNaUIsCi0JCS5DbWRTZXQJCT0gUF9JRF9BTURfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSA0LAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YMTZ8Q0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfMHgwQUFBXzB4MDU1NSwKKwkJLmRldl9zaXplCT0gU0laRV8xTWlCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSA0LAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDEwMDAwLDE1KSwKIAkJCUVSQVNFSU5GTygweDA4MDAwLDEpLApAQCAtNDUxLDEzICs0MzIsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfQU1ELAogCQkuZGV2X2lkCQk9IEFNMjlGODAwQlQsCiAJCS5uYW1lCQk9ICJBTUQgQU0yOUY4MDBCVCIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfMHgwQUFBXzB4MDU1NSwgIC8qIHg4ICovCi0JCQlbMV0gPSBNVERfVUFERFJfMHgwNTU1XzB4MDJBQSwgIC8qIHgxNiAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfMU1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDQsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1gxNnxDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDBBQUFfMHgwNTU1LAorCQkuZGV2X3NpemUJPSBTSVpFXzFNaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9BTURfU1RELAorCQkubnJfcmVnaW9ucwk9IDQsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MTAwMDAsMTUpLAogCQkJRVJBU0VJTkZPKDB4MDgwMDAsMSksCkBAIC00NjgsMTIgKzQ0NywxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9BTUQsCiAJCS5kZXZfaWQJCT0gQU0yOUYwMTdELAogCQkubmFtZQkJPSAiQU1EIEFNMjlGMDE3RCIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfRE9OVF9DQVJFICAgICAvKiB4OCAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfMk1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDEsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSX0RPTlRfQ0FSRSwKKwkJLmRldl9zaXplCT0gU0laRV8yTWlCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSAxLAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDEwMDAwLDMyKSwKIAkJfQpAQCAtNDgxLDEyICs0NTksMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfQU1ELAogCQkuZGV2X2lkCQk9IEFNMjlGMDE2RCwKIAkJLm5hbWUJCT0gIkFNRCBBTTI5RjAxNkQiLAotCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSXzB4MDU1NV8weDAyQUEgLyogeDggKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzJNaUIsCi0JCS5DbWRTZXQJCT0gUF9JRF9BTURfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSAxLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDA1NTVfMHgwMkFBLAorCQkuZGV2X3NpemUJPSBTSVpFXzJNaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9BTURfU1RELAorCQkubnJfcmVnaW9ucwk9IDEsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MTAwMDAsMzIpLAogCQl9CkBAIC00OTQsMTIgKzQ3MSwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9BTUQsCiAJCS5kZXZfaWQJCT0gQU0yOUYwODAsCiAJCS5uYW1lCQk9ICJBTUQgQU0yOUYwODAiLAotCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSXzB4MDU1NV8weDAyQUEgLyogeDggKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzFNaUIsCi0JCS5DbWRTZXQJCT0gUF9JRF9BTURfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSAxLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDA1NTVfMHgwMkFBLAorCQkuZGV2X3NpemUJPSBTSVpFXzFNaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9BTURfU1RELAorCQkubnJfcmVnaW9ucwk9IDEsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MTAwMDAsMTYpLAogCQl9CkBAIC01MDcsMTIgKzQ4MywxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9BTUQsCiAJCS5kZXZfaWQJCT0gQU0yOUYwNDAsCiAJCS5uYW1lCQk9ICJBTUQgQU0yOUYwNDAiLAotCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSXzB4MDU1NV8weDAyQUEgLyogeDggKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzUxMktpQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDEsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4MDU1NV8weDAyQUEsCisJCS5kZXZfc2l6ZQk9IFNJWkVfNTEyS2lCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSAxLAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDEwMDAwLDgpLAogCQl9CkBAIC01MjAsMTIgKzQ5NSwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9BTUQsCiAJCS5kZXZfaWQJCT0gQU0yOUxWMDQwQiwKIAkJLm5hbWUJCT0gIkFNRCBBTTI5TFYwNDBCIiwKLQkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDA1NTVfMHgwMkFBIC8qIHg4ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV81MTJLaUIsCi0JCS5DbWRTZXQJCT0gUF9JRF9BTURfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSAxLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDA1NTVfMHgwMkFBLAorCQkuZGV2X3NpemUJPSBTSVpFXzUxMktpQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gMSwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgxMDAwMCw4KSwKIAkJfQpAQCAtNTMzLDEyICs1MDcsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfQU1ELAogCQkuZGV2X2lkCQk9IEFNMjlGMDAyVCwKIAkJLm5hbWUJCT0gIkFNRCBBTTI5RjAwMlQiLAotCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSXzB4MDU1NV8weDAyQUEgLyogeDggKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzI1NktpQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDQsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4MDU1NV8weDAyQUEsCisJCS5kZXZfc2l6ZQk9IFNJWkVfMjU2S2lCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSA0LAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDEwMDAwLDMpLAogCQkJRVJBU0VJTkZPKDB4MDgwMDAsMSksCkBAIC01NDksMTIgKzUyMiwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9BVE1FTCwKIAkJLmRldl9pZAkJPSBBVDQ5QlY1MTIsCiAJCS5uYW1lCQk9ICJBdG1lbCBBVDQ5QlY1MTIiLAotCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSXzB4NTU1NV8weDJBQUEgLyogeDggKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzY0S2lCLAotCQkuQ21kU2V0CQk9IFBfSURfQU1EX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gMSwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfMHg1NTU1XzB4MkFBQSwKKwkJLmRldl9zaXplCT0gU0laRV82NEtpQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gMSwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgxMDAwMCwxKQogCQl9CkBAIC01NjIsMTIgKzUzNCwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9BVE1FTCwKIAkJLmRldl9pZAkJPSBBVDI5TFY1MTIsCiAJCS5uYW1lCQk9ICJBdG1lbCBBVDI5TFY1MTIiLAotCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSXzB4NTU1NV8weDJBQUEgLyogeDggKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzY0S2lCLAotCQkuQ21kU2V0CQk9IFBfSURfQU1EX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gMSwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfMHg1NTU1XzB4MkFBQSwKKwkJLmRldl9zaXplCT0gU0laRV82NEtpQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gMSwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHg4MCwyNTYpLAogCQkJRVJBU0VJTkZPKDB4ODAsMjU2KQpAQCAtNTc2LDEzICs1NDcsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfQVRNRUwsCiAJCS5kZXZfaWQJCT0gQVQ0OUJWMTZYLAogCQkubmFtZQkJPSAiQXRtZWwgQVQ0OUJWMTZYIiwKLQkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDA1NTVfMHgwQUFBLCAgLyogeDggKi8KLQkJCVsxXSA9IE1URF9VQUREUl8weDA1NTVfMHgwQUFBICAgLyogeDE2ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV8yTWlCLAotCQkuQ21kU2V0CQk9IFBfSURfQU1EX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gMiwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDE2fENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4MDU1NV8weDBBQUEsCS8qID8/Pz8gKi8KKwkJLmRldl9zaXplCT0gU0laRV8yTWlCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSAyLAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDAyMDAwLDgpLAogCQkJRVJBU0VJTkZPKDB4MTAwMDAsMzEpCkBAIC01OTEsMTMgKzU2MCwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9BVE1FTCwKIAkJLmRldl9pZAkJPSBBVDQ5QlYxNlhULAogCQkubmFtZQkJPSAiQXRtZWwgQVQ0OUJWMTZYVCIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfMHgwNTU1XzB4MEFBQSwgIC8qIHg4ICovCi0JCQlbMV0gPSBNVERfVUFERFJfMHgwNTU1XzB4MEFBQSAgIC8qIHgxNiAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfMk1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDIsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1gxNnxDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDA1NTVfMHgwQUFBLAkvKiA/Pz8/ICovCisJCS5kZXZfc2l6ZQk9IFNJWkVfMk1pQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gMiwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgxMDAwMCwzMSksCiAJCQlFUkFTRUlORk8oMHgwMjAwMCw4KQpAQCAtNjA2LDEzICs1NzMsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfQVRNRUwsCiAJCS5kZXZfaWQJCT0gQVQ0OUJWMzJYLAogCQkubmFtZQkJPSAiQXRtZWwgQVQ0OUJWMzJYIiwKLQkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDA1NTVfMHgwQUFBLCAgLyogeDggKi8KLQkJCVsxXSA9IE1URF9VQUREUl8weDA1NTVfMHgwQUFBICAgLyogeDE2ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV80TWlCLAotCQkuQ21kU2V0CQk9IFBfSURfQU1EX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gMiwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDE2fENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4MDU1NV8weDBBQUEsCS8qID8/Pz8gKi8KKwkJLmRldl9zaXplCT0gU0laRV80TWlCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSAyLAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDAyMDAwLDgpLAogCQkJRVJBU0VJTkZPKDB4MTAwMDAsNjMpCkBAIC02MjEsMTMgKzU4NiwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9BVE1FTCwKIAkJLmRldl9pZAkJPSBBVDQ5QlYzMlhULAogCQkubmFtZQkJPSAiQXRtZWwgQVQ0OUJWMzJYVCIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfMHgwNTU1XzB4MEFBQSwgIC8qIHg4ICovCi0JCQlbMV0gPSBNVERfVUFERFJfMHgwNTU1XzB4MEFBQSAgIC8qIHgxNiAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfNE1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDIsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1gxNnxDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDA1NTVfMHgwQUFBLAkvKiA/Pz8/ICovCisJCS5kZXZfc2l6ZQk9IFNJWkVfNE1pQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gMiwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgxMDAwMCw2MyksCiAJCQlFUkFTRUlORk8oMHgwMjAwMCw4KQpAQCAtNjM2LDEyICs1OTksMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfRlVKSVRTVSwKIAkJLmRldl9pZAkJPSBNQk0yOUYwNDBDLAogCQkubmFtZQkJPSAiRnVqaXRzdSBNQk0yOUYwNDBDIiwKLQkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDBBQUFfMHgwNTU1LCAvKiB4OCAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfNTEyS2lCLAotCQkuQ21kU2V0CQk9IFBfSURfQU1EX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gMSwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfMHgwQUFBXzB4MDU1NSwKKwkJLmRldl9zaXplCT0gU0laRV81MTJLaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9BTURfU1RELAorCQkubnJfcmVnaW9ucwk9IDEsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MTAwMDAsOCkKIAkJfQpAQCAtNjQ5LDEzICs2MTEsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfRlVKSVRTVSwKIAkJLmRldl9pZAkJPSBNQk0yOUY4MDBCQSwKIAkJLm5hbWUJCT0gIkZ1aml0c3UgTUJNMjlGODAwQkEiLAotCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSXzB4MEFBQV8weDA1NTUsICAvKiB4OCAqLwotCQkJWzFdID0gTVREX1VBRERSXzB4MDU1NV8weDAyQUEsICAvKiB4MTYgKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzFNaUIsCi0JCS5DbWRTZXQJCT0gUF9JRF9BTURfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSA0LAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YMTZ8Q0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfMHgwQUFBXzB4MDU1NSwKKwkJLmRldl9zaXplCT0gU0laRV8xTWlCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSA0LAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDA0MDAwLDEpLAogCQkJRVJBU0VJTkZPKDB4MDIwMDAsMiksCkBAIC02NjYsMTIgKzYyNiwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9GVUpJVFNVLAogCQkuZGV2X2lkCQk9IE1CTTI5TFY2NTBVRSwKIAkJLm5hbWUJCT0gIkZ1aml0c3UgTUJNMjlMVjY1MFVFIiwKLQkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl9ET05UX0NBUkUgICAgIC8qIHgxNiAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfOE1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDEsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSX0RPTlRfQ0FSRSwKKwkJLmRldl9zaXplCT0gU0laRV84TWlCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSAxLAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDEwMDAwLDEyOCkKIAkJfQpAQCAtNjc5LDEzICs2MzgsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfRlVKSVRTVSwKIAkJLmRldl9pZAkJPSBNQk0yOUxWMzIwVEUsCiAJCS5uYW1lCQk9ICJGdWppdHN1IE1CTTI5TFYzMjBURSIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfMHgwQUFBXzB4MDU1NSwgIC8qIHg4ICovCi0JCQlbMV0gPSBNVERfVUFERFJfMHgwNTU1XzB4MDJBQSwgIC8qIHgxNiAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfNE1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDIsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1gxNnxDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDBBQUFfMHgwNTU1LAorCQkuZGV2X3NpemUJPSBTSVpFXzRNaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9BTURfU1RELAorCQkubnJfcmVnaW9ucwk9IDIsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MTAwMDAsNjMpLAogCQkJRVJBU0VJTkZPKDB4MDIwMDAsOCkKQEAgLTY5NCwxMyArNjUxLDExIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX0ZVSklUU1UsCiAJCS5kZXZfaWQJCT0gTUJNMjlMVjMyMEJFLAogCQkubmFtZQkJPSAiRnVqaXRzdSBNQk0yOUxWMzIwQkUiLAotCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSXzB4MEFBQV8weDA1NTUsICAvKiB4OCAqLwotCQkJWzFdID0gTVREX1VBRERSXzB4MDU1NV8weDAyQUEsICAvKiB4MTYgKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzRNaUIsCi0JCS5DbWRTZXQJCT0gUF9JRF9BTURfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSAyLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YMTZ8Q0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfMHgwQUFBXzB4MDU1NSwKKwkJLmRldl9zaXplCT0gU0laRV80TWlCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSAyLAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDAyMDAwLDgpLAogCQkJRVJBU0VJTkZPKDB4MTAwMDAsNjMpCkBAIC03MDksMTMgKzY2NCwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9GVUpJVFNVLAogCQkuZGV2X2lkCQk9IE1CTTI5TFYxNjBURSwKIAkJLm5hbWUJCT0gIkZ1aml0c3UgTUJNMjlMVjE2MFRFIiwKLQkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDBBQUFfMHgwNTU1LCAgLyogeDggKi8KLQkJCVsxXSA9IE1URF9VQUREUl8weDA1NTVfMHgwMkFBLCAgLyogeDE2ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV8yTWlCLAotCQkuQ21kU2V0CQk9IFBfSURfQU1EX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gNCwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDE2fENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4MEFBQV8weDA1NTUsCisJCS5kZXZfc2l6ZQk9IFNJWkVfMk1pQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gNCwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgxMDAwMCwzMSksCiAJCQlFUkFTRUlORk8oMHgwODAwMCwxKSwKQEAgLTcyNiwxMyArNjc5LDExIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX0ZVSklUU1UsCiAJCS5kZXZfaWQJCT0gTUJNMjlMVjE2MEJFLAogCQkubmFtZQkJPSAiRnVqaXRzdSBNQk0yOUxWMTYwQkUiLAotCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSXzB4MEFBQV8weDA1NTUsICAvKiB4OCAqLwotCQkJWzFdID0gTVREX1VBRERSXzB4MDU1NV8weDAyQUEsICAvKiB4MTYgKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzJNaUIsCi0JCS5DbWRTZXQJCT0gUF9JRF9BTURfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSA0LAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YMTZ8Q0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfMHgwQUFBXzB4MDU1NSwKKwkJLmRldl9zaXplCT0gU0laRV8yTWlCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSA0LAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDA0MDAwLDEpLAogCQkJRVJBU0VJTkZPKDB4MDIwMDAsMiksCkBAIC03NDMsMTMgKzY5NCwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9GVUpJVFNVLAogCQkuZGV2X2lkCQk9IE1CTTI5TFY4MDBCQSwKIAkJLm5hbWUJCT0gIkZ1aml0c3UgTUJNMjlMVjgwMEJBIiwKLQkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDBBQUFfMHgwNTU1LCAgLyogeDggKi8KLQkJCVsxXSA9IE1URF9VQUREUl8weDA1NTVfMHgwMkFBLCAgLyogeDE2ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV8xTWlCLAotCQkuQ21kU2V0CQk9IFBfSURfQU1EX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gNCwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDE2fENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4MEFBQV8weDA1NTUsCisJCS5kZXZfc2l6ZQk9IFNJWkVfMU1pQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gNCwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgwNDAwMCwxKSwKIAkJCUVSQVNFSU5GTygweDAyMDAwLDIpLApAQCAtNzYwLDEzICs3MDksMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfRlVKSVRTVSwKIAkJLmRldl9pZAkJPSBNQk0yOUxWODAwVEEsCiAJCS5uYW1lCQk9ICJGdWppdHN1IE1CTTI5TFY4MDBUQSIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfMHgwQUFBXzB4MDU1NSwgIC8qIHg4ICovCi0JCQlbMV0gPSBNVERfVUFERFJfMHgwNTU1XzB4MDJBQSwgIC8qIHgxNiAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfMU1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDQsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1gxNnxDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDBBQUFfMHgwNTU1LAorCQkuZGV2X3NpemUJPSBTSVpFXzFNaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9BTURfU1RELAorCQkubnJfcmVnaW9ucwk9IDQsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MTAwMDAsMTUpLAogCQkJRVJBU0VJTkZPKDB4MDgwMDAsMSksCkBAIC03NzcsMTMgKzcyNCwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9GVUpJVFNVLAogCQkuZGV2X2lkCQk9IE1CTTI5TFY0MDBCQywKIAkJLm5hbWUJCT0gIkZ1aml0c3UgTUJNMjlMVjQwMEJDIiwKLQkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDBBQUFfMHgwNTU1LCAgLyogeDggKi8KLQkJCVsxXSA9IE1URF9VQUREUl8weDA1NTVfMHgwMkFBLCAgLyogeDE2ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV81MTJLaUIsCi0JCS5DbWRTZXQJCT0gUF9JRF9BTURfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSA0LAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YMTZ8Q0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfMHgwQUFBXzB4MDU1NSwKKwkJLmRldl9zaXplCT0gU0laRV81MTJLaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9BTURfU1RELAorCQkubnJfcmVnaW9ucwk9IDQsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MDQwMDAsMSksCiAJCQlFUkFTRUlORk8oMHgwMjAwMCwyKSwKQEAgLTc5NCwxMyArNzM5LDExIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX0ZVSklUU1UsCiAJCS5kZXZfaWQJCT0gTUJNMjlMVjQwMFRDLAogCQkubmFtZQkJPSAiRnVqaXRzdSBNQk0yOUxWNDAwVEMiLAotCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSXzB4MEFBQV8weDA1NTUsICAvKiB4OCAqLwotCQkJWzFdID0gTVREX1VBRERSXzB4MDU1NV8weDAyQUEsICAvKiB4MTYgKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzUxMktpQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDQsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1gxNnxDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDBBQUFfMHgwNTU1LAorCQkuZGV2X3NpemUJPSBTSVpFXzUxMktpQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gNCwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgxMDAwMCw3KSwKIAkJCUVSQVNFSU5GTygweDA4MDAwLDEpLApAQCAtODExLDEyICs3NTQsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfSFlVTkRBSSwKIAkJLmRldl9pZAkJPSBIWTI5RjAwMlQsCiAJCS5uYW1lCQk9ICJIeXVuZGFpIEhZMjlGMDAyVCIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfMHgwNTU1XzB4MDJBQSAvKiB4OCAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfMjU2S2lCLAotCQkuQ21kU2V0CQk9IFBfSURfQU1EX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gNCwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfMHgwNTU1XzB4MDJBQSwKKwkJLmRldl9zaXplCT0gU0laRV8yNTZLaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9BTURfU1RELAorCQkubnJfcmVnaW9ucwk9IDQsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MTAwMDAsMyksCiAJCQlFUkFTRUlORk8oMHgwODAwMCwxKSwKQEAgLTgyNywxMiArNzY5LDExIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX0lOVEVMLAogCQkuZGV2X2lkCQk9IEkyOEYwMDRCM0IsCiAJCS5uYW1lCQk9ICJJbnRlbCAyOEYwMDRCM0IiLAotCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSX1VOTkVDRVNTQVJZLCAgICAvKiB4OCAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfNTEyS2lCLAotCQkuQ21kU2V0CQk9IFBfSURfSU5URUxfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSAyLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl9VTk5FQ0VTU0FSWSwKKwkJLmRldl9zaXplCT0gU0laRV81MTJLaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9JTlRFTF9TVEQsCisJCS5ucl9yZWdpb25zCT0gMiwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgwMjAwMCwgOCksCiAJCQlFUkFTRUlORk8oMHgxMDAwMCwgNyksCkBAIC04NDEsMTIgKzc4MiwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9JTlRFTCwKIAkJLmRldl9pZAkJPSBJMjhGMDA0QjNULAogCQkubmFtZQkJPSAiSW50ZWwgMjhGMDA0QjNUIiwKLQkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl9VTk5FQ0VTU0FSWSwgICAgLyogeDggKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzUxMktpQiwKLQkJLkNtZFNldAkJPSBQX0lEX0lOVEVMX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gMiwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfVU5ORUNFU1NBUlksCisJCS5kZXZfc2l6ZQk9IFNJWkVfNTEyS2lCLAorCQkuY21kX3NldAk9IFBfSURfSU5URUxfU1RELAorCQkubnJfcmVnaW9ucwk9IDIsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MTAwMDAsIDcpLAogCQkJRVJBU0VJTkZPKDB4MDIwMDAsIDgpLApAQCAtODU1LDEzICs3OTUsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfSU5URUwsCiAJCS5kZXZfaWQJCT0gSTI4RjQwMEIzQiwKIAkJLm5hbWUJCT0gIkludGVsIDI4RjQwMEIzQiIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfVU5ORUNFU1NBUlksICAgIC8qIHg4ICovCi0JCQlbMV0gPSBNVERfVUFERFJfVU5ORUNFU1NBUlksICAgIC8qIHgxNiAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfNTEyS2lCLAotCQkuQ21kU2V0CQk9IFBfSURfSU5URUxfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSAyLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YMTZ8Q0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfVU5ORUNFU1NBUlksCisJCS5kZXZfc2l6ZQk9IFNJWkVfNTEyS2lCLAorCQkuY21kX3NldAk9IFBfSURfSU5URUxfU1RELAorCQkubnJfcmVnaW9ucwk9IDIsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MDIwMDAsIDgpLAogCQkJRVJBU0VJTkZPKDB4MTAwMDAsIDcpLApAQCAtODcwLDEzICs4MDgsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfSU5URUwsCiAJCS5kZXZfaWQJCT0gSTI4RjQwMEIzVCwKIAkJLm5hbWUJCT0gIkludGVsIDI4RjQwMEIzVCIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfVU5ORUNFU1NBUlksICAgIC8qIHg4ICovCi0JCQlbMV0gPSBNVERfVUFERFJfVU5ORUNFU1NBUlksICAgIC8qIHgxNiAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfNTEyS2lCLAotCQkuQ21kU2V0CQk9IFBfSURfSU5URUxfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSAyLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YMTZ8Q0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfVU5ORUNFU1NBUlksCisJCS5kZXZfc2l6ZQk9IFNJWkVfNTEyS2lCLAorCQkuY21kX3NldAk9IFBfSURfSU5URUxfU1RELAorCQkubnJfcmVnaW9ucwk9IDIsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MTAwMDAsIDcpLAogCQkJRVJBU0VJTkZPKDB4MDIwMDAsIDgpLApAQCAtODg1LDEyICs4MjEsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfSU5URUwsCiAJCS5kZXZfaWQJCT0gSTI4RjAwOEIzQiwKIAkJLm5hbWUJCT0gIkludGVsIDI4RjAwOEIzQiIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfVU5ORUNFU1NBUlksICAgIC8qIHg4ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV8xTWlCLAotCQkuQ21kU2V0CQk9IFBfSURfSU5URUxfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSAyLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl9VTk5FQ0VTU0FSWSwKKwkJLmRldl9zaXplCT0gU0laRV8xTWlCLAorCQkuY21kX3NldAk9IFBfSURfSU5URUxfU1RELAorCQkubnJfcmVnaW9ucwk9IDIsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MDIwMDAsIDgpLAogCQkJRVJBU0VJTkZPKDB4MTAwMDAsIDE1KSwKQEAgLTg5OSwxMiArODM0LDExIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX0lOVEVMLAogCQkuZGV2X2lkCQk9IEkyOEYwMDhCM1QsCiAJCS5uYW1lCQk9ICJJbnRlbCAyOEYwMDhCM1QiLAotCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSX1VOTkVDRVNTQVJZLCAgICAvKiB4OCAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfMU1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0lOVEVMX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gMiwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfVU5ORUNFU1NBUlksCisJCS5kZXZfc2l6ZQk9IFNJWkVfMU1pQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0lOVEVMX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSAyLAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDEwMDAwLCAxNSksCiAJCQlFUkFTRUlORk8oMHgwMjAwMCwgOCksCkBAIC05MTMsMTIgKzg0NywxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9JTlRFTCwKIAkJLmRldl9pZAkJPSBJMjhGMDA4UzUsCiAJCS5uYW1lCQk9ICJJbnRlbCAyOEYwMDhTNSIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfVU5ORUNFU1NBUlksICAgIC8qIHg4ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV8xTWlCLAotCQkuQ21kU2V0CQk9IFBfSURfSU5URUxfRVhULAotCQkuTnVtRXJhc2VSZWdpb25zPSAxLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl9VTk5FQ0VTU0FSWSwKKwkJLmRldl9zaXplCT0gU0laRV8xTWlCLAorCQkuY21kX3NldAk9IFBfSURfSU5URUxfRVhULAorCQkubnJfcmVnaW9ucwk9IDEsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MTAwMDAsMTYpLAogCQl9CkBAIC05MjYsMTIgKzg1OSwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9JTlRFTCwKIAkJLmRldl9pZAkJPSBJMjhGMDE2UzUsCiAJCS5uYW1lCQk9ICJJbnRlbCAyOEYwMTZTNSIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfVU5ORUNFU1NBUlksICAgIC8qIHg4ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV8yTWlCLAotCQkuQ21kU2V0CQk9IFBfSURfSU5URUxfRVhULAotCQkuTnVtRXJhc2VSZWdpb25zPSAxLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl9VTk5FQ0VTU0FSWSwKKwkJLmRldl9zaXplCT0gU0laRV8yTWlCLAorCQkuY21kX3NldAk9IFBfSURfSU5URUxfRVhULAorCQkubnJfcmVnaW9ucwk9IDEsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MTAwMDAsMzIpLAogCQl9CkBAIC05MzksMTIgKzg3MSwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9JTlRFTCwKIAkJLmRldl9pZAkJPSBJMjhGMDA4U0EsCiAJCS5uYW1lCQk9ICJJbnRlbCAyOEYwMDhTQSIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfVU5ORUNFU1NBUlksICAgIC8qIHg4ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV8xTWlCLAotCQkuQ21kU2V0CQk9IFBfSURfSU5URUxfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSAxLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl9VTk5FQ0VTU0FSWSwKKwkJLmRldl9zaXplCT0gU0laRV8xTWlCLAorCQkuY21kX3NldAk9IFBfSURfSU5URUxfU1RELAorCQkubnJfcmVnaW9ucwk9IDEsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MTAwMDAsIDE2KSwKIAkJfQpAQCAtOTUyLDEyICs4ODMsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfSU5URUwsCiAJCS5kZXZfaWQJCT0gSTI4RjgwMEIzQiwKIAkJLm5hbWUJCT0gIkludGVsIDI4RjgwMEIzQiIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMV0gPSBNVERfVUFERFJfVU5ORUNFU1NBUlksICAgIC8qIHgxNiAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfMU1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0lOVEVMX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gMiwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDE2LAorCQkudWFkZHIJCT0gTVREX1VBRERSX1VOTkVDRVNTQVJZLAorCQkuZGV2X3NpemUJPSBTSVpFXzFNaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9JTlRFTF9TVEQsCisJCS5ucl9yZWdpb25zCT0gMiwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgwMjAwMCwgOCksCiAJCQlFUkFTRUlORk8oMHgxMDAwMCwgMTUpLApAQCAtOTY2LDEyICs4OTYsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfSU5URUwsCiAJCS5kZXZfaWQJCT0gSTI4RjgwMEIzVCwKIAkJLm5hbWUJCT0gIkludGVsIDI4RjgwMEIzVCIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMV0gPSBNVERfVUFERFJfVU5ORUNFU1NBUlksICAgIC8qIHgxNiAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfMU1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0lOVEVMX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gMiwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDE2LAorCQkudWFkZHIJCT0gTVREX1VBRERSX1VOTkVDRVNTQVJZLAorCQkuZGV2X3NpemUJPSBTSVpFXzFNaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9JTlRFTF9TVEQsCisJCS5ucl9yZWdpb25zCT0gMiwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgxMDAwMCwgMTUpLAogCQkJRVJBU0VJTkZPKDB4MDIwMDAsIDgpLApAQCAtOTgwLDEyICs5MDksMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfSU5URUwsCiAJCS5kZXZfaWQJCT0gSTI4RjAxNkIzQiwKIAkJLm5hbWUJCT0gIkludGVsIDI4RjAxNkIzQiIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfVU5ORUNFU1NBUlksICAgIC8qIHg4ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV8yTWlCLAotCQkuQ21kU2V0CQk9IFBfSURfSU5URUxfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSAyLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl9VTk5FQ0VTU0FSWSwKKwkJLmRldl9zaXplCT0gU0laRV8yTWlCLAorCQkuY21kX3NldAk9IFBfSURfSU5URUxfU1RELAorCQkubnJfcmVnaW9ucwk9IDIsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MDIwMDAsIDgpLAogCQkJRVJBU0VJTkZPKDB4MTAwMDAsIDMxKSwKQEAgLTk5NCwxMiArOTIyLDExIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX0lOVEVMLAogCQkuZGV2X2lkCQk9IEkyOEYwMTZTMywKIAkJLm5hbWUJCT0gIkludGVsIEkyOEYwMTZTMyIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfVU5ORUNFU1NBUlksICAgIC8qIHg4ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV8yTWlCLAotCQkuQ21kU2V0CQk9IFBfSURfSU5URUxfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSAxLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl9VTk5FQ0VTU0FSWSwKKwkJLmRldl9zaXplCT0gU0laRV8yTWlCLAorCQkuY21kX3NldAk9IFBfSURfSU5URUxfU1RELAorCQkubnJfcmVnaW9ucwk9IDEsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MTAwMDAsIDMyKSwKIAkJfQpAQCAtMTAwNywxMiArOTM0LDExIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX0lOVEVMLAogCQkuZGV2X2lkCQk9IEkyOEYwMTZCM1QsCiAJCS5uYW1lCQk9ICJJbnRlbCAyOEYwMTZCM1QiLAotCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSX1VOTkVDRVNTQVJZLCAgICAvKiB4OCAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfMk1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0lOVEVMX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gMiwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfVU5ORUNFU1NBUlksCisJCS5kZXZfc2l6ZQk9IFNJWkVfMk1pQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0lOVEVMX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSAyLAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDEwMDAwLCAzMSksCiAJCQlFUkFTRUlORk8oMHgwMjAwMCwgOCksCkBAIC0xMDIxLDEyICs5NDcsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfSU5URUwsCiAJCS5kZXZfaWQJCT0gSTI4RjE2MEIzQiwKIAkJLm5hbWUJCT0gIkludGVsIDI4RjE2MEIzQiIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMV0gPSBNVERfVUFERFJfVU5ORUNFU1NBUlksICAgIC8qIHgxNiAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfMk1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0lOVEVMX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gMiwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDE2LAorCQkudWFkZHIJCT0gTVREX1VBRERSX1VOTkVDRVNTQVJZLAorCQkuZGV2X3NpemUJPSBTSVpFXzJNaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9JTlRFTF9TVEQsCisJCS5ucl9yZWdpb25zCT0gMiwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgwMjAwMCwgOCksCiAJCQlFUkFTRUlORk8oMHgxMDAwMCwgMzEpLApAQCAtMTAzNSwxMiArOTYwLDExIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX0lOVEVMLAogCQkuZGV2X2lkCQk9IEkyOEYxNjBCM1QsCiAJCS5uYW1lCQk9ICJJbnRlbCAyOEYxNjBCM1QiLAotCQkudWFkZHIJCT0gewotCQkJWzFdID0gTVREX1VBRERSX1VOTkVDRVNTQVJZLCAgICAvKiB4MTYgKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzJNaUIsCi0JCS5DbWRTZXQJCT0gUF9JRF9JTlRFTF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDIsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1gxNiwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl9VTk5FQ0VTU0FSWSwKKwkJLmRldl9zaXplCT0gU0laRV8yTWlCLAorCQkuY21kX3NldAk9IFBfSURfSU5URUxfU1RELAorCQkubnJfcmVnaW9ucwk9IDIsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MTAwMDAsIDMxKSwKIAkJCUVSQVNFSU5GTygweDAyMDAwLCA4KSwKQEAgLTEwNDksMTIgKzk3MywxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9JTlRFTCwKIAkJLmRldl9pZAkJPSBJMjhGMzIwQjNCLAogCQkubmFtZQkJPSAiSW50ZWwgMjhGMzIwQjNCIiwKLQkJLnVhZGRyCQk9IHsKLQkJCVsxXSA9IE1URF9VQUREUl9VTk5FQ0VTU0FSWSwgICAgLyogeDE2ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV80TWlCLAotCQkuQ21kU2V0CQk9IFBfSURfSU5URUxfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSAyLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YMTYsCisJCS51YWRkcgkJPSBNVERfVUFERFJfVU5ORUNFU1NBUlksCisJCS5kZXZfc2l6ZQk9IFNJWkVfNE1pQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0lOVEVMX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSAyLAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDAyMDAwLCA4KSwKIAkJCUVSQVNFSU5GTygweDEwMDAwLCA2MyksCkBAIC0xMDYzLDEyICs5ODYsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfSU5URUwsCiAJCS5kZXZfaWQJCT0gSTI4RjMyMEIzVCwKIAkJLm5hbWUJCT0gIkludGVsIDI4RjMyMEIzVCIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMV0gPSBNVERfVUFERFJfVU5ORUNFU1NBUlksICAgIC8qIHgxNiAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfNE1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0lOVEVMX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gMiwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDE2LAorCQkudWFkZHIJCT0gTVREX1VBRERSX1VOTkVDRVNTQVJZLAorCQkuZGV2X3NpemUJPSBTSVpFXzRNaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9JTlRFTF9TVEQsCisJCS5ucl9yZWdpb25zCT0gMiwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgxMDAwMCwgNjMpLAogCQkJRVJBU0VJTkZPKDB4MDIwMDAsIDgpLApAQCAtMTA3NywxMiArOTk5LDExIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX0lOVEVMLAogCQkuZGV2X2lkCQk9IEkyOEY2NDBCM0IsCiAJCS5uYW1lCQk9ICJJbnRlbCAyOEY2NDBCM0IiLAotCQkudWFkZHIJCT0gewotCQkJWzFdID0gTVREX1VBRERSX1VOTkVDRVNTQVJZLCAgICAvKiB4MTYgKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzhNaUIsCi0JCS5DbWRTZXQJCT0gUF9JRF9JTlRFTF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDIsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1gxNiwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl9VTk5FQ0VTU0FSWSwKKwkJLmRldl9zaXplCT0gU0laRV84TWlCLAorCQkuY21kX3NldAk9IFBfSURfSU5URUxfU1RELAorCQkubnJfcmVnaW9ucwk9IDIsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MDIwMDAsIDgpLAogCQkJRVJBU0VJTkZPKDB4MTAwMDAsIDEyNyksCkBAIC0xMDkxLDEyICsxMDEyLDExIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX0lOVEVMLAogCQkuZGV2X2lkCQk9IEkyOEY2NDBCM1QsCiAJCS5uYW1lCQk9ICJJbnRlbCAyOEY2NDBCM1QiLAotCQkudWFkZHIJCT0gewotCQkJWzFdID0gTVREX1VBRERSX1VOTkVDRVNTQVJZLCAgICAvKiB4MTYgKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzhNaUIsCi0JCS5DbWRTZXQJCT0gUF9JRF9JTlRFTF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDIsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1gxNiwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl9VTk5FQ0VTU0FSWSwKKwkJLmRldl9zaXplCT0gU0laRV84TWlCLAorCQkuY21kX3NldAk9IFBfSURfSU5URUxfU1RELAorCQkubnJfcmVnaW9ucwk9IDIsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MTAwMDAsIDEyNyksCiAJCQlFUkFTRUlORk8oMHgwMjAwMCwgOCksCkBAIC0xMTA1LDEyICsxMDI1LDExIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX0lOVEVMLAogCQkuZGV2X2lkCQk9IEk4MjgwMkFCLAogCQkubmFtZQkJPSAiSW50ZWwgODI4MDJBQiIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfVU5ORUNFU1NBUlksICAgIC8qIHg4ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV81MTJLaUIsCi0JCS5DbWRTZXQJCT0gUF9JRF9JTlRFTF9FWFQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDEsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSX1VOTkVDRVNTQVJZLAorCQkuZGV2X3NpemUJPSBTSVpFXzUxMktpQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0lOVEVMX0VYVCwKKwkJLm5yX3JlZ2lvbnMJPSAxLAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDEwMDAwLDgpLAogCQl9CkBAIC0xMTE4LDEyICsxMDM3LDExIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX0lOVEVMLAogCQkuZGV2X2lkCQk9IEk4MjgwMkFDLAogCQkubmFtZQkJPSAiSW50ZWwgODI4MDJBQyIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfVU5ORUNFU1NBUlksICAgIC8qIHg4ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV8xTWlCLAotCQkuQ21kU2V0CQk9IFBfSURfSU5URUxfRVhULAotCQkuTnVtRXJhc2VSZWdpb25zPSAxLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl9VTk5FQ0VTU0FSWSwKKwkJLmRldl9zaXplCT0gU0laRV8xTWlCLAorCQkuY21kX3NldAk9IFBfSURfSU5URUxfRVhULAorCQkubnJfcmVnaW9ucwk9IDEsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MTAwMDAsMTYpLAogCQl9CkBAIC0xMTMxLDEyICsxMDQ5LDExIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX01BQ1JPTklYLAogCQkuZGV2X2lkCQk9IE1YMjlMVjA0MEMsCiAJCS5uYW1lCQk9ICJNYWNyb25peCBNWDI5TFYwNDBDIiwKLQkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDA1NTVfMHgwMkFBLCAgLyogeDggKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzUxMktpQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDEsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4MDU1NV8weDAyQUEsCisJCS5kZXZfc2l6ZQk9IFNJWkVfNTEyS2lCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSAxLAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDEwMDAwLDgpLAogCQl9CkBAIC0xMTQ0LDEzICsxMDYxLDExIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX01BQ1JPTklYLAogCQkuZGV2X2lkCQk9IE1YMjlMVjE2MFQsCiAJCS5uYW1lCQk9ICJNWElDIE1YMjlMVjE2MFQiLAotCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSXzB4MEFBQV8weDA1NTUsICAvKiB4OCAqLwotCQkJWzFdID0gTVREX1VBRERSXzB4MDU1NV8weDAyQUEsICAvKiB4MTYgKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzJNaUIsCi0JCS5DbWRTZXQJCT0gUF9JRF9BTURfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSA0LAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YMTZ8Q0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfMHgwQUFBXzB4MDU1NSwKKwkJLmRldl9zaXplCT0gU0laRV8yTWlCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSA0LAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDEwMDAwLDMxKSwKIAkJCUVSQVNFSU5GTygweDA4MDAwLDEpLApAQCAtMTE2MSwxMyArMTA3NiwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9ORUMsCiAJCS5kZXZfaWQJCT0gVVBEMjlGMDY0MTE1LAogCQkubmFtZQkJPSAiTkVDIHVQRDI5RjA2NDExNSIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfMHgwNTU1XzB4MDJBQSwgIC8qIHg4ICovCi0JCQlbMV0gPSBNVERfVUFERFJfMHgwNTU1XzB4MDJBQSwgIC8qIHgxNiAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfOE1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDMsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1gxNnxDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDA1NTVfMHgwMkFBLAkvKiA/Pz8/ICovCisJCS5kZXZfc2l6ZQk9IFNJWkVfOE1pQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gMywKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgyMDAwLDgpLAogCQkJRVJBU0VJTkZPKDB4MTAwMDAsMTI2KSwKQEAgLTExNzcsMTMgKzEwOTAsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfTUFDUk9OSVgsCiAJCS5kZXZfaWQJCT0gTVgyOUxWMTYwQiwKIAkJLm5hbWUJCT0gIk1YSUMgTVgyOUxWMTYwQiIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfMHgwQUFBXzB4MDU1NSwgIC8qIHg4ICovCi0JCQlbMV0gPSBNVERfVUFERFJfMHgwNTU1XzB4MDJBQSwgIC8qIHgxNiAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfMk1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDQsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1gxNnxDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDBBQUFfMHgwNTU1LAorCQkuZGV2X3NpemUJPSBTSVpFXzJNaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9BTURfU1RELAorCQkubnJfcmVnaW9ucwk9IDQsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MDQwMDAsMSksCiAJCQlFUkFTRUlORk8oMHgwMjAwMCwyKSwKQEAgLTExOTQsMTIgKzExMDUsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfTUFDUk9OSVgsCiAJCS5kZXZfaWQJCT0gTVgyOUYwNDAsCiAJCS5uYW1lCQk9ICJNYWNyb25peCBNWDI5RjA0MCIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfMHgwNTU1XzB4MDJBQSAvKiB4OCAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfNTEyS2lCLAotCQkuQ21kU2V0CQk9IFBfSURfQU1EX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gMSwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfMHgwNTU1XzB4MDJBQSwKKwkJLmRldl9zaXplCT0gU0laRV81MTJLaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9BTURfU1RELAorCQkubnJfcmVnaW9ucwk9IDEsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MTAwMDAsOCksCiAJCX0KQEAgLTEyMDcsMTIgKzExMTcsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfTUFDUk9OSVgsCiAJCS5kZXZfaWQJCT0gTVgyOUYwMTYsCiAJCS5uYW1lCQk9ICJNYWNyb25peCBNWDI5RjAxNiIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfMHgwNTU1XzB4MDJBQSAvKiB4OCAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfMk1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDEsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4MDU1NV8weDAyQUEsCisJCS5kZXZfc2l6ZQk9IFNJWkVfMk1pQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gMSwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgxMDAwMCwzMiksCiAJCX0KQEAgLTEyMjAsMTIgKzExMjksMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfTUFDUk9OSVgsCiAJCS5kZXZfaWQJCT0gTVgyOUYwMDRULAogCQkubmFtZQkJPSAiTWFjcm9uaXggTVgyOUYwMDRUIiwKLQkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDA1NTVfMHgwMkFBIC8qIHg4ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV81MTJLaUIsCi0JCS5DbWRTZXQJCT0gUF9JRF9BTURfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSA0LAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDA1NTVfMHgwMkFBLAorCQkuZGV2X3NpemUJPSBTSVpFXzUxMktpQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gNCwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgxMDAwMCw3KSwKIAkJCUVSQVNFSU5GTygweDA4MDAwLDEpLApAQCAtMTIzNiwxMiArMTE0NCwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9NQUNST05JWCwKIAkJLmRldl9pZAkJPSBNWDI5RjAwNEIsCiAJCS5uYW1lCQk9ICJNYWNyb25peCBNWDI5RjAwNEIiLAotCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSXzB4MDU1NV8weDAyQUEgLyogeDggKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzUxMktpQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDQsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4MDU1NV8weDAyQUEsCisJCS5kZXZfc2l6ZQk9IFNJWkVfNTEyS2lCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSA0LAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDA0MDAwLDEpLAogCQkJRVJBU0VJTkZPKDB4MDIwMDAsMiksCkBAIC0xMjUyLDEyICsxMTU5LDExIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX01BQ1JPTklYLAogCQkuZGV2X2lkCQk9IE1YMjlGMDAyVCwKIAkJLm5hbWUJCT0gIk1hY3Jvbml4IE1YMjlGMDAyVCIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfMHgwNTU1XzB4MDJBQSAvKiB4OCAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfMjU2S2lCLAotCQkuQ21kU2V0CQk9IFBfSURfQU1EX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gNCwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfMHgwNTU1XzB4MDJBQSwKKwkJLmRldl9zaXplCT0gU0laRV8yNTZLaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9BTURfU1RELAorCQkubnJfcmVnaW9ucwk9IDQsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MTAwMDAsMyksCiAJCQlFUkFTRUlORk8oMHgwODAwMCwxKSwKQEAgLTEyNjgsMTIgKzExNzQsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfUE1DLAogCQkuZGV2X2lkCQk9IFBNNDlGTDAwMiwKIAkJLm5hbWUJCT0gIlBNQyBQbTQ5RkwwMDIiLAotIAkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDU1NTVfMHgyQUFBIC8qIHg4ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV8yNTZLaUIsCi0JCS5DbWRTZXQJCT0gUF9JRF9BTURfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSAxLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDU1NTVfMHgyQUFBLAorCQkuZGV2X3NpemUJPSBTSVpFXzI1NktpQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gMSwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oIDB4MDEwMDAsIDY0ICkKIAkJfQpAQCAtMTI4MSwxMiArMTE4NiwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9QTUMsCiAJCS5kZXZfaWQJCT0gUE00OUZMMDA0LAogCQkubmFtZQkJPSAiUE1DIFBtNDlGTDAwNCIsCi0gCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSXzB4NTU1NV8weDJBQUEgLyogeDggKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzUxMktpQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDEsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4NTU1NV8weDJBQUEsCisJCS5kZXZfc2l6ZQk9IFNJWkVfNTEyS2lCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSAxLAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTyggMHgwMTAwMCwgMTI4ICkKIAkJfQpAQCAtMTI5NCwxMiArMTE5OCwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9QTUMsCiAJCS5kZXZfaWQJCT0gUE00OUZMMDA4LAogCQkubmFtZQkJPSAiUE1DIFBtNDlGTDAwOCIsCi0gCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSXzB4NTU1NV8weDJBQUEgLyogeDggKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzFNaUIsCi0JCS5DbWRTZXQJCT0gUF9JRF9BTURfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSAxLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDU1NTVfMHgyQUFBLAorCQkuZGV2X3NpemUJPSBTSVpFXzFNaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9BTURfU1RELAorCQkubnJfcmVnaW9ucwk9IDEsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKCAweDAxMDAwLCAyNTYgKQogCQl9CkBAIC0xMzA3LDI1ICsxMjEwLDIzIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX1NIQVJQLAogCQkuZGV2X2lkCQk9IExIMjhGNjQwQkYsCiAJCS5uYW1lCQk9ICJMSDI4RjY0MEJGIiwKLQkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl9VTk5FQ0VTU0FSWSwgICAgLyogeDggKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzRNaUIsCi0JCS5DbWRTZXQgICAgICAgICA9IFBfSURfSU5URUxfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSAxLAotCQkucmVnaW9ucyAgICAgICAgPSB7CisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSX1VOTkVDRVNTQVJZLAorCQkuZGV2X3NpemUJPSBTSVpFXzRNaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9JTlRFTF9TVEQsCisJCS5ucl9yZWdpb25zCT0gMSwKKwkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHg0MDAwMCwxNiksCiAJCX0KICAgICAgICAgfSwgewogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9TU1QsCiAJCS5kZXZfaWQJCT0gU1NUMzlMRjUxMiwKIAkJLm5hbWUJCT0gIlNTVCAzOUxGNTEyIiwKLSAJCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfMHg1NTU1XzB4MkFBQSAvKiB4OCAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfNjRLaUIsCi0JCS5DbWRTZXQJCT0gUF9JRF9BTURfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSAxLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDU1NTVfMHgyQUFBLAorCQkuZGV2X3NpemUJPSBTSVpFXzY0S2lCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSAxLAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDAxMDAwLDE2KSwKIAkJfQpAQCAtMTMzMywxMiArMTIzNCwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9TU1QsCiAJCS5kZXZfaWQJCT0gU1NUMzlMRjAxMCwKIAkJLm5hbWUJCT0gIlNTVCAzOUxGMDEwIiwKLSAJCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfMHg1NTU1XzB4MkFBQSAvKiB4OCAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfMTI4S2lCLAotCQkuQ21kU2V0CQk9IFBfSURfQU1EX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gMSwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfMHg1NTU1XzB4MkFBQSwKKwkJLmRldl9zaXplCT0gU0laRV8xMjhLaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9BTURfU1RELAorCQkubnJfcmVnaW9ucwk9IDEsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MDEwMDAsMzIpLAogCQl9CkBAIC0xMzQ2LDM2ICsxMjQ2LDMzIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX1NTVCwKICAJCS5kZXZfaWQgCT0gU1NUMjlFRTAyMCwKIAkJLm5hbWUJCT0gIlNTVCAyOUVFMDIwIiwKLSAJCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfMHg1NTU1XzB4MkFBQSAvKiB4OCAqLwotCQl9LAotIAkJLkRldlNpemUJPSBTSVpFXzI1NktpQiwKLSAJCS5DbWRTZXQJCT0gUF9JRF9TU1RfUEFHRSwKLSAJCS5OdW1FcmFzZVJlZ2lvbnM9IDEsCi0gCQkucmVnaW9ucyA9IHtFUkFTRUlORk8oMHgwMTAwMCw2NCksCi0gCQl9Ci0gICAgICAgICB9LCB7CisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4NTU1NV8weDJBQUEsCisJCS5kZXZfc2l6ZQk9IFNJWkVfMjU2S2lCLAorCQkuY21kX3NldAk9IFBfSURfU1NUX1BBR0UsCisJCS5ucl9yZWdpb25zCT0gMSwKKwkJLnJlZ2lvbnMgPSB7RVJBU0VJTkZPKDB4MDEwMDAsNjQpLAorCQl9CisJfSwgewogIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfU1NULAogCQkuZGV2X2lkCQk9IFNTVDI5TEUwMjAsCiAgCQkubmFtZQkJPSAiU1NUIDI5TEUwMjAiLAotIAkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDU1NTVfMHgyQUFBIC8qIHg4ICovCi0JCX0sCi0gCQkuRGV2U2l6ZQk9IFNJWkVfMjU2S2lCLAotIAkJLkNtZFNldAkJPSBQX0lEX1NTVF9QQUdFLAotIAkJLk51bUVyYXNlUmVnaW9ucz0gMSwKLSAJCS5yZWdpb25zID0ge0VSQVNFSU5GTygweDAxMDAwLDY0KSwKLSAJCX0KKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfMHg1NTU1XzB4MkFBQSwKKwkJLmRldl9zaXplCT0gU0laRV8yNTZLaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9TU1RfUEFHRSwKKwkJLm5yX3JlZ2lvbnMJPSAxLAorCQkucmVnaW9ucyA9IHtFUkFTRUlORk8oMHgwMTAwMCw2NCksCisJCX0KIAl9LCB7CiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX1NTVCwKIAkJLmRldl9pZAkJPSBTU1QzOUxGMDIwLAogCQkubmFtZQkJPSAiU1NUIDM5TEYwMjAiLAotIAkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDU1NTVfMHgyQUFBIC8qIHg4ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV8yNTZLaUIsCi0JCS5DbWRTZXQJCT0gUF9JRF9BTURfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSAxLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDU1NTVfMHgyQUFBLAorCQkuZGV2X3NpemUJPSBTSVpFXzI1NktpQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gMSwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgwMTAwMCw2NCksCiAJCX0KQEAgLTEzODMsMTIgKzEyODAsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfU1NULAogCQkuZGV2X2lkCQk9IFNTVDM5TEYwNDAsCiAJCS5uYW1lCQk9ICJTU1QgMzlMRjA0MCIsCi0gCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSXzB4NTU1NV8weDJBQUEgLyogeDggKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzUxMktpQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDEsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4NTU1NV8weDJBQUEsCisJCS5kZXZfc2l6ZQk9IFNJWkVfNTEyS2lCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSAxLAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDAxMDAwLDEyOCksCiAJCX0KQEAgLTEzOTYsMTIgKzEyOTIsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfU1NULAogCQkuZGV2X2lkCQk9IFNTVDM5U0YwMTBBLAogCQkubmFtZQkJPSAiU1NUIDM5U0YwMTBBIiwKLSAJCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfMHg1NTU1XzB4MkFBQSAvKiB4OCAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfMTI4S2lCLAotCQkuQ21kU2V0CQk9IFBfSURfQU1EX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gMSwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfMHg1NTU1XzB4MkFBQSwKKwkJLmRldl9zaXplCT0gU0laRV8xMjhLaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9BTURfU1RELAorCQkubnJfcmVnaW9ucwk9IDEsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MDEwMDAsMzIpLAogCQl9CkBAIC0xNDA5LDI2ICsxMzA0LDI0IEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX1NTVCwKIAkJLmRldl9pZAkJPSBTU1QzOVNGMDIwQSwKIAkJLm5hbWUJCT0gIlNTVCAzOVNGMDIwQSIsCi0gCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSXzB4NTU1NV8weDJBQUEgLyogeDggKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzI1NktpQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDEsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4NTU1NV8weDJBQUEsCisJCS5kZXZfc2l6ZQk9IFNJWkVfMjU2S2lCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSAxLAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDAxMDAwLDY0KSwKIAkJfQogCX0sIHsKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfU1NULAotCQkuZGV2X2lkICAgICAgICAgPSBTU1Q0OUxGMDQwQiwKLQkJLm5hbWUgICAgICAgICAgID0gIlNTVCA0OUxGMDQwQiIsCi0JCS51YWRkciAgICAgICAgICA9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDU1NTVfMHgyQUFBIC8qIHg4ICovCi0JCX0sCi0JCS5EZXZTaXplICAgICAgICA9IFNJWkVfNTEyS2lCLAotCQkuQ21kU2V0ICAgICAgICAgPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDEsCi0JCS5yZWdpb25zICAgICAgICA9IHsKKwkJLmRldl9pZAkJPSBTU1Q0OUxGMDQwQiwKKwkJLm5hbWUJCT0gIlNTVCA0OUxGMDQwQiIsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4NTU1NV8weDJBQUEsCisJCS5kZXZfc2l6ZQk9IFNJWkVfNTEyS2lCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSAxLAorCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDAxMDAwLDEyOCksCiAJCX0KIAl9LCB7CkBAIC0xNDM2LDEyICsxMzI5LDExIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX1NTVCwKIAkJLmRldl9pZAkJPSBTU1Q0OUxGMDA0QiwKIAkJLm5hbWUJCT0gIlNTVCA0OUxGMDA0QiIsCi0gCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSXzB4NTU1NV8weDJBQUEgLyogeDggKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzUxMktpQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDEsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4NTU1NV8weDJBQUEsCisJCS5kZXZfc2l6ZQk9IFNJWkVfNTEyS2lCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSAxLAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDAxMDAwLDEyOCksCiAJCX0KQEAgLTE0NDksMTIgKzEzNDEsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfU1NULAogCQkuZGV2X2lkCQk9IFNTVDQ5TEYwMDhBLAogCQkubmFtZQkJPSAiU1NUIDQ5TEYwMDhBIiwKLSAJCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfMHg1NTU1XzB4MkFBQSAvKiB4OCAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfMU1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDEsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4NTU1NV8weDJBQUEsCisJCS5kZXZfc2l6ZQk9IFNJWkVfMU1pQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gMSwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgwMTAwMCwyNTYpLAogCQl9CkBAIC0xNDYyLDEyICsxMzUzLDExIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX1NTVCwKIAkJLmRldl9pZAkJPSBTU1Q0OUxGMDMwQSwKIAkJLm5hbWUJCT0gIlNTVCA0OUxGMDMwQSIsCi0gCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSXzB4NTU1NV8weDJBQUEgLyogeDggKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzUxMktpQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDEsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4NTU1NV8weDJBQUEsCisJCS5kZXZfc2l6ZQk9IFNJWkVfNTEyS2lCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSAxLAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDAxMDAwLDk2KSwKIAkJfQpAQCAtMTQ3NSwxMiArMTM2NSwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9TU1QsCiAJCS5kZXZfaWQJCT0gU1NUNDlMRjA0MEEsCiAJCS5uYW1lCQk9ICJTU1QgNDlMRjA0MEEiLAotIAkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDU1NTVfMHgyQUFBIC8qIHg4ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV81MTJLaUIsCi0JCS5DbWRTZXQJCT0gUF9JRF9BTURfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSAxLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDU1NTVfMHgyQUFBLAorCQkuZGV2X3NpemUJPSBTSVpFXzUxMktpQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gMSwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgwMTAwMCwxMjgpLAogCQl9CkBAIC0xNDg4LDU3ICsxMzc3LDQ5IEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX1NTVCwKIAkJLmRldl9pZAkJPSBTU1Q0OUxGMDgwQSwKIAkJLm5hbWUJCT0gIlNTVCA0OUxGMDgwQSIsCi0gCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSXzB4NTU1NV8weDJBQUEgLyogeDggKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzFNaUIsCi0JCS5DbWRTZXQJCT0gUF9JRF9BTURfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSAxLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDU1NTVfMHgyQUFBLAorCQkuZGV2X3NpemUJPSBTSVpFXzFNaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9BTURfU1RELAorCQkubnJfcmVnaW9ucwk9IDEsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MDEwMDAsMjU2KSwKIAkJfQogCX0sIHsKLSAgICAgICAgICAgICAgIC5tZnJfaWQgICAgICAgICA9IE1BTlVGQUNUVVJFUl9TU1QsICAgICAvKiBzaG91bGQgYmUgQ0ZJICovCi0gICAgICAgICAgICAgICAuZGV2X2lkICAgICAgICAgPSBTU1QzOUxGMTYwLAotICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIlNTVCAzOUxGMTYwIiwKLSAgICAgICAgICAgICAgIC51YWRkciAgICAgICAgICA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgWzBdID0gTVREX1VBRERSXzB4NTU1NV8weDJBQUEsICAvKiB4OCAqLwotICAgICAgICAgICAgICAgICAgICAgICBbMV0gPSBNVERfVUFERFJfMHg1NTU1XzB4MkFBQSAgIC8qIHgxNiAqLwotICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgIC5EZXZTaXplICAgICAgICA9IFNJWkVfMk1pQiwKLSAgICAgICAgICAgICAgIC5DbWRTZXQgICAgICAgICA9IFBfSURfQU1EX1NURCwKLSAgICAgICAgICAgICAgIC5OdW1FcmFzZVJlZ2lvbnM9IDIsCi0gICAgICAgICAgICAgICAucmVnaW9ucyAgICAgICAgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIEVSQVNFSU5GTygweDEwMDAsMjU2KSwKLSAgICAgICAgICAgICAgICAgICAgICAgRVJBU0VJTkZPKDB4MTAwMCwyNTYpCi0gICAgICAgICAgICAgICB9CisJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX1NTVCwgICAgIC8qIHNob3VsZCBiZSBDRkkgKi8KKwkJLmRldl9pZAkJPSBTU1QzOUxGMTYwLAorCQkubmFtZQkJPSAiU1NUIDM5TEYxNjAiLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YMTZ8Q0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfMHg1NTU1XzB4MkFBQSwJLyogPz8/PyAqLworCQkuZGV2X3NpemUJPSBTSVpFXzJNaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9BTURfU1RELAorCQkubnJfcmVnaW9ucwk9IDIsCisJCS5yZWdpb25zCT0geworCQkJRVJBU0VJTkZPKDB4MTAwMCwyNTYpLAorCQkJRVJBU0VJTkZPKDB4MTAwMCwyNTYpCisJCX0KIAl9LCB7Ci0gICAgICAgICAgICAgICAubWZyX2lkICAgICAgICAgPSBNQU5VRkFDVFVSRVJfU1NULCAgICAgLyogc2hvdWxkIGJlIENGSSAqLwotICAgICAgICAgICAgICAgLmRldl9pZCAgICAgICAgID0gU1NUMzlWRjE2MDEsCi0gICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiU1NUIDM5VkYxNjAxIiwKLSAgICAgICAgICAgICAgIC51YWRkciAgICAgICAgICA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgWzBdID0gTVREX1VBRERSXzB4NTU1NV8weDJBQUEsICAvKiB4OCAqLwotICAgICAgICAgICAgICAgICAgICAgICBbMV0gPSBNVERfVUFERFJfMHg1NTU1XzB4MkFBQSAgIC8qIHgxNiAqLwotICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgIC5EZXZTaXplICAgICAgICA9IFNJWkVfMk1pQiwKLSAgICAgICAgICAgICAgIC5DbWRTZXQgICAgICAgICA9IFBfSURfQU1EX1NURCwKLSAgICAgICAgICAgICAgIC5OdW1FcmFzZVJlZ2lvbnM9IDIsCi0gICAgICAgICAgICAgICAucmVnaW9ucyAgICAgICAgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIEVSQVNFSU5GTygweDEwMDAsMjU2KSwKLSAgICAgICAgICAgICAgICAgICAgICAgRVJBU0VJTkZPKDB4MTAwMCwyNTYpCi0gICAgICAgICAgICAgICB9Ci0KKwkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfU1NULCAgICAgLyogc2hvdWxkIGJlIENGSSAqLworCQkuZGV2X2lkCQk9IFNTVDM5VkYxNjAxLAorCQkubmFtZQkJPSAiU1NUIDM5VkYxNjAxIiwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDE2fENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4NTU1NV8weDJBQUEsCS8qID8/Pz8gKi8KKwkJLmRldl9zaXplCT0gU0laRV8yTWlCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSAyLAorCQkucmVnaW9ucwk9IHsKKwkJCUVSQVNFSU5GTygweDEwMDAsMjU2KSwKKwkJCUVSQVNFSU5GTygweDEwMDAsMjU2KQorCQl9CiAJfSwgewogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9TVCwKIAkJLmRldl9pZAkJPSBNMjlGODAwQUIsCiAJCS5uYW1lCQk9ICJTVCBNMjlGODAwQUIiLAotCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSXzB4MEFBQV8weDA1NTUsICAvKiB4OCAqLwotCQkJWzFdID0gTVREX1VBRERSXzB4MDU1NV8weDAyQUEsICAvKiB4MTYgKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzFNaUIsCi0JCS5DbWRTZXQJCT0gUF9JRF9BTURfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSA0LAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YMTZ8Q0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfMHgwQUFBXzB4MDU1NSwKKwkJLmRldl9zaXplCT0gU0laRV8xTWlCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSA0LAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDA0MDAwLDEpLAogCQkJRVJBU0VJTkZPKDB4MDIwMDAsMiksCkBAIC0xNTQ5LDEzICsxNDMwLDExIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX1NULAkvKiBGSVhNRSAtIENGSSBkZXZpY2U/ICovCiAJCS5kZXZfaWQJCT0gTTI5VzgwMERULAogCQkubmFtZQkJPSAiU1QgTTI5VzgwMERUIiwKLSAJCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfMHg1NTU1XzB4MkFBQSwgIC8qIHg4ICovCi0JCQlbMV0gPSBNVERfVUFERFJfMHg1NTU1XzB4MkFBQSAgIC8qIHgxNiAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfMU1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDQsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1gxNnxDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDU1NTVfMHgyQUFBLAkvKiA/Pz8/ICovCisJCS5kZXZfc2l6ZQk9IFNJWkVfMU1pQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gNCwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgxMDAwMCwxNSksCiAJCQlFUkFTRUlORk8oMHgwODAwMCwxKSwKQEAgLTE1NjYsMTMgKzE0NDUsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfU1QsCS8qIEZJWE1FIC0gQ0ZJIGRldmljZT8gKi8KIAkJLmRldl9pZAkJPSBNMjlXODAwREIsCiAJCS5uYW1lCQk9ICJTVCBNMjlXODAwREIiLAotIAkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDU1NTVfMHgyQUFBLCAgLyogeDggKi8KLQkJCVsxXSA9IE1URF9VQUREUl8weDU1NTVfMHgyQUFBICAgLyogeDE2ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV8xTWlCLAotCQkuQ21kU2V0CQk9IFBfSURfQU1EX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gNCwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDE2fENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4NTU1NV8weDJBQUEsCS8qID8/Pz8gKi8KKwkJLmRldl9zaXplCT0gU0laRV8xTWlCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSA0LAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDA0MDAwLDEpLAogCQkJRVJBU0VJTkZPKDB4MDIwMDAsMiksCkBAIC0xNTgzLDEzICsxNDYwLDExIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX1NULAkvKiBGSVhNRSAtIENGSSBkZXZpY2U/ICovCiAJCS5kZXZfaWQJCT0gTTI5VzE2MERULAogCQkubmFtZQkJPSAiU1QgTTI5VzE2MERUIiwKLQkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDA1NTVfMHgwMkFBLCAgLyogeDggKi8KLQkJCVsxXSA9IE1URF9VQUREUl8weDA1NTVfMHgwMkFBLCAgLyogeDE2ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV8yTWlCLAotCQkuQ21kU2V0CQk9IFBfSURfQU1EX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gNCwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDE2fENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4MDU1NV8weDAyQUEsCS8qID8/Pz8gKi8KKwkJLmRldl9zaXplCT0gU0laRV8yTWlCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSA0LAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDEwMDAwLDMxKSwKIAkJCUVSQVNFSU5GTygweDA4MDAwLDEpLApAQCAtMTYwMCwxMyArMTQ3NSwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9TVCwJLyogRklYTUUgLSBDRkkgZGV2aWNlPyAqLwogCQkuZGV2X2lkCQk9IE0yOVcxNjBEQiwKIAkJLm5hbWUJCT0gIlNUIE0yOVcxNjBEQiIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfMHgwNTU1XzB4MDJBQSwgIC8qIHg4ICovCi0JCQlbMV0gPSBNVERfVUFERFJfMHgwNTU1XzB4MDJBQSwgIC8qIHgxNiAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfMk1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDQsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1gxNnxDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDA1NTVfMHgwMkFBLAkvKiA/Pz8/ICovCisJCS5kZXZfc2l6ZQk9IFNJWkVfMk1pQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gNCwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgwNDAwMCwxKSwKIAkJCUVSQVNFSU5GTygweDAyMDAwLDIpLApAQCAtMTYxNywxMiArMTQ5MCwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9TVCwKIAkJLmRldl9pZAkJPSBNMjlXMDQwQiwKIAkJLm5hbWUJCT0gIlNUIE0yOVcwNDBCIiwKLQkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDA1NTVfMHgwMkFBIC8qIHg4ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV81MTJLaUIsCi0JCS5DbWRTZXQJCT0gUF9JRF9BTURfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSAxLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDA1NTVfMHgwMkFBLAorCQkuZGV2X3NpemUJPSBTSVpFXzUxMktpQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gMSwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgxMDAwMCw4KSwKIAkJfQpAQCAtMTYzMCwxMiArMTUwMiwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9TVCwKIAkJLmRldl9pZAkJPSBNNTBGVzA0MCwKIAkJLm5hbWUJCT0gIlNUIE01MEZXMDQwIiwKLQkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl9VTk5FQ0VTU0FSWSwgICAgLyogeDggKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzUxMktpQiwKLQkJLkNtZFNldAkJPSBQX0lEX0lOVEVMX0VYVCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gMSwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfVU5ORUNFU1NBUlksCisJCS5kZXZfc2l6ZQk9IFNJWkVfNTEyS2lCLAorCQkuY21kX3NldAk9IFBfSURfSU5URUxfRVhULAorCQkubnJfcmVnaW9ucwk9IDEsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MTAwMDAsOCksCiAJCX0KQEAgLTE2NDMsMTIgKzE1MTQsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfU1QsCiAJCS5kZXZfaWQJCT0gTTUwRlcwODAsCiAJCS5uYW1lCQk9ICJTVCBNNTBGVzA4MCIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfVU5ORUNFU1NBUlksICAgIC8qIHg4ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV8xTWlCLAotCQkuQ21kU2V0CQk9IFBfSURfSU5URUxfRVhULAotCQkuTnVtRXJhc2VSZWdpb25zPSAxLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl9VTk5FQ0VTU0FSWSwKKwkJLmRldl9zaXplCT0gU0laRV8xTWlCLAorCQkuY21kX3NldAk9IFBfSURfSU5URUxfRVhULAorCQkubnJfcmVnaW9ucwk9IDEsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MTAwMDAsMTYpLAogCQl9CkBAIC0xNjU2LDEyICsxNTI2LDExIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX1NULAogCQkuZGV2X2lkCQk9IE01MEZXMDE2LAogCQkubmFtZQkJPSAiU1QgTTUwRlcwMTYiLAotCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSX1VOTkVDRVNTQVJZLCAgICAvKiB4OCAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfMk1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0lOVEVMX0VYVCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gMSwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfVU5ORUNFU1NBUlksCisJCS5kZXZfc2l6ZQk9IFNJWkVfMk1pQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0lOVEVMX0VYVCwKKwkJLm5yX3JlZ2lvbnMJPSAxLAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDEwMDAwLDMyKSwKIAkJfQpAQCAtMTY2OSwxMiArMTUzOCwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9TVCwKIAkJLmRldl9pZAkJPSBNNTBMUFcwODAsCiAJCS5uYW1lCQk9ICJTVCBNNTBMUFcwODAiLAotCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSX1VOTkVDRVNTQVJZLCAgICAvKiB4OCAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfMU1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0lOVEVMX0VYVCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gMSwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfVU5ORUNFU1NBUlksCisJCS5kZXZfc2l6ZQk9IFNJWkVfMU1pQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0lOVEVMX0VYVCwKKwkJLm5yX3JlZ2lvbnMJPSAxLAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDEwMDAwLDE2KSwKIAkJfQpAQCAtMTY4MiwxMyArMTU1MCwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9UT1NISUJBLAogCQkuZGV2X2lkCQk9IFRDNThGVlQxNjAsCiAJCS5uYW1lCQk9ICJUb3NoaWJhIFRDNThGVlQxNjAiLAotCQkudWFkZHIJCT0gewotCQkJWzBdID0gTVREX1VBRERSXzB4MEFBQV8weDA1NTUsIC8qIHg4ICovCi0JCQlbMV0gPSBNVERfVUFERFJfMHgwNTU1XzB4MDJBQSAgLyogeDE2ICovCi0JCX0sCi0JCS5EZXZTaXplCT0gU0laRV8yTWlCLAotCQkuQ21kU2V0CQk9IFBfSURfQU1EX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gNCwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDE2fENGSV9ERVZJQ0VUWVBFX1g4LAorCQkudWFkZHIJCT0gTVREX1VBRERSXzB4MEFBQV8weDA1NTUsCisJCS5kZXZfc2l6ZQk9IFNJWkVfMk1pQiwKKwkJLmNtZF9zZXQJPSBQX0lEX0FNRF9TVEQsCisJCS5ucl9yZWdpb25zCT0gNCwKIAkJLnJlZ2lvbnMJPSB7CiAJCQlFUkFTRUlORk8oMHgxMDAwMCwzMSksCiAJCQlFUkFTRUlORk8oMHgwODAwMCwxKSwKQEAgLTE2OTksMTMgKzE1NjUsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfVE9TSElCQSwKIAkJLmRldl9pZAkJPSBUQzU4RlZCMTYwLAogCQkubmFtZQkJPSAiVG9zaGliYSBUQzU4RlZCMTYwIiwKLQkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDBBQUFfMHgwNTU1LCAvKiB4OCAqLwotCQkJWzFdID0gTVREX1VBRERSXzB4MDU1NV8weDAyQUEgIC8qIHgxNiAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfMk1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDQsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1gxNnxDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDBBQUFfMHgwNTU1LAorCQkuZGV2X3NpemUJPSBTSVpFXzJNaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9BTURfU1RELAorCQkubnJfcmVnaW9ucwk9IDQsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MDQwMDAsMSksCiAJCQlFUkFTRUlORk8oMHgwMjAwMCwyKSwKQEAgLTE3MTYsMTMgKzE1ODAsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfVE9TSElCQSwKIAkJLmRldl9pZAkJPSBUQzU4RlZCMzIxLAogCQkubmFtZQkJPSAiVG9zaGliYSBUQzU4RlZCMzIxIiwKLQkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDBBQUFfMHgwNTU1LCAvKiB4OCAqLwotCQkJWzFdID0gTVREX1VBRERSXzB4MDU1NV8weDAyQUEgIC8qIHgxNiAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfNE1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDIsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1gxNnxDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDBBQUFfMHgwNTU1LAorCQkuZGV2X3NpemUJPSBTSVpFXzRNaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9BTURfU1RELAorCQkubnJfcmVnaW9ucwk9IDIsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MDIwMDAsOCksCiAJCQlFUkFTRUlORk8oMHgxMDAwMCw2MykKQEAgLTE3MzEsMTMgKzE1OTMsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfVE9TSElCQSwKIAkJLmRldl9pZAkJPSBUQzU4RlZUMzIxLAogCQkubmFtZQkJPSAiVG9zaGliYSBUQzU4RlZUMzIxIiwKLQkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDBBQUFfMHgwNTU1LCAvKiB4OCAqLwotCQkJWzFdID0gTVREX1VBRERSXzB4MDU1NV8weDAyQUEgIC8qIHgxNiAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfNE1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDIsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1gxNnxDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDBBQUFfMHgwNTU1LAorCQkuZGV2X3NpemUJPSBTSVpFXzRNaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9BTURfU1RELAorCQkubnJfcmVnaW9ucwk9IDIsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MTAwMDAsNjMpLAogCQkJRVJBU0VJTkZPKDB4MDIwMDAsOCkKQEAgLTE3NDYsMTMgKzE2MDYsMTEgQEAKIAkJLm1mcl9pZAkJPSBNQU5VRkFDVFVSRVJfVE9TSElCQSwKIAkJLmRldl9pZAkJPSBUQzU4RlZCNjQxLAogCQkubmFtZQkJPSAiVG9zaGliYSBUQzU4RlZCNjQxIiwKLQkJLnVhZGRyCQk9IHsKLQkJCVswXSA9IE1URF9VQUREUl8weDBBQUFfMHgwNTU1LCAvKiB4OCAqLwotCQkJWzFdID0gTVREX1VBRERSXzB4MDU1NV8weDAyQUEsIC8qIHgxNiAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfOE1pQiwKLQkJLkNtZFNldAkJPSBQX0lEX0FNRF9TVEQsCi0JCS5OdW1FcmFzZVJlZ2lvbnM9IDIsCisJCS5kZXZ0eXBlcwk9IENGSV9ERVZJQ0VUWVBFX1gxNnxDRklfREVWSUNFVFlQRV9YOCwKKwkJLnVhZGRyCQk9IE1URF9VQUREUl8weDBBQUFfMHgwNTU1LAorCQkuZGV2X3NpemUJPSBTSVpFXzhNaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9BTURfU1RELAorCQkubnJfcmVnaW9ucwk9IDIsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MDIwMDAsOCksCiAJCQlFUkFTRUlORk8oMHgxMDAwMCwxMjcpCkBAIC0xNzYxLDEzICsxNjE5LDExIEBACiAJCS5tZnJfaWQJCT0gTUFOVUZBQ1RVUkVSX1RPU0hJQkEsCiAJCS5kZXZfaWQJCT0gVEM1OEZWVDY0MSwKIAkJLm5hbWUJCT0gIlRvc2hpYmEgVEM1OEZWVDY0MSIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfMHgwQUFBXzB4MDU1NSwgLyogeDggKi8KLQkJCVsxXSA9IE1URF9VQUREUl8weDA1NTVfMHgwMkFBLCAvKiB4MTYgKi8KLQkJfSwKLQkJLkRldlNpemUJPSBTSVpFXzhNaUIsCi0JCS5DbWRTZXQJCT0gUF9JRF9BTURfU1RELAotCQkuTnVtRXJhc2VSZWdpb25zPSAyLAorCQkuZGV2dHlwZXMJPSBDRklfREVWSUNFVFlQRV9YMTZ8Q0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfMHgwQUFBXzB4MDU1NSwKKwkJLmRldl9zaXplCT0gU0laRV84TWlCLAorCQkuY21kX3NldAk9IFBfSURfQU1EX1NURCwKKwkJLm5yX3JlZ2lvbnMJPSAyLAogCQkucmVnaW9ucwk9IHsKIAkJCUVSQVNFSU5GTygweDEwMDAwLDEyNyksCiAJCQlFUkFTRUlORk8oMHgwMjAwMCw4KQpAQCAtMTc3NiwxMiArMTYzMiwxMSBAQAogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9XSU5CT05ELAogCQkuZGV2X2lkCQk9IFc0OVYwMDJBLAogCQkubmFtZQkJPSAiV2luYm9uZCBXNDlWMDAyQSIsCi0JCS51YWRkcgkJPSB7Ci0JCQlbMF0gPSBNVERfVUFERFJfMHg1NTU1XzB4MkFBQSAvKiB4OCAqLwotCQl9LAotCQkuRGV2U2l6ZQk9IFNJWkVfMjU2S2lCLAotCQkuQ21kU2V0CQk9IFBfSURfQU1EX1NURCwKLQkJLk51bUVyYXNlUmVnaW9ucz0gNCwKKwkJLmRldnR5cGVzCT0gQ0ZJX0RFVklDRVRZUEVfWDgsCisJCS51YWRkcgkJPSBNVERfVUFERFJfMHg1NTU1XzB4MkFBQSwKKwkJLmRldl9zaXplCT0gU0laRV8yNTZLaUIsCisJCS5jbWRfc2V0CT0gUF9JRF9BTURfU1RELAorCQkubnJfcmVnaW9ucwk9IDQsCiAJCS5yZWdpb25zCT0gewogCQkJRVJBU0VJTkZPKDB4MTAwMDAsIDMpLAogCQkJRVJBU0VJTkZPKDB4MDgwMDAsIDEpLApAQCAtMTc5MSwxNSArMTY0Niw3IEBACiAJfQogfTsKIAotCi1zdGF0aWMgaW50IGNmaV9qZWRlY19zZXR1cChzdHJ1Y3QgY2ZpX3ByaXZhdGUgKnBfY2ZpLCBpbnQgaW5kZXgpOwotCi1zdGF0aWMgaW50IGplZGVjX3Byb2JlX2NoaXAoc3RydWN0IG1hcF9pbmZvICptYXAsIF9fdTMyIGJhc2UsCi0JCQkgICAgdW5zaWduZWQgbG9uZyAqY2hpcF9tYXAsIHN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpKTsKLQotc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqamVkZWNfcHJvYmUoc3RydWN0IG1hcF9pbmZvICptYXApOwotCi1zdGF0aWMgaW5saW5lIHUzMiBqZWRlY19yZWFkX21mcihzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgX191MzIgYmFzZSwKK3N0YXRpYyBpbmxpbmUgdTMyIGplZGVjX3JlYWRfbWZyKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCB1aW50MzJfdCBiYXNlLAogCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpKQogewogCW1hcF93b3JkIHJlc3VsdDsKQEAgLTE4MTAsNyArMTY1Nyw3IEBACiAJcmV0dXJuIHJlc3VsdC54WzBdICYgbWFzazsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgamVkZWNfcmVhZF9pZChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgX191MzIgYmFzZSwKK3N0YXRpYyBpbmxpbmUgdTMyIGplZGVjX3JlYWRfaWQoc3RydWN0IG1hcF9pbmZvICptYXAsIHVpbnQzMl90IGJhc2UsCiAJc3RydWN0IGNmaV9wcml2YXRlICpjZmkpCiB7CiAJbWFwX3dvcmQgcmVzdWx0OwpAQCAtMTgyMSw4ICsxNjY4LDcgQEAKIAlyZXR1cm4gcmVzdWx0LnhbMF0gJiBtYXNrOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgamVkZWNfcmVzZXQodTMyIGJhc2UsIHN0cnVjdCBtYXBfaW5mbyAqbWFwLAotCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpKQorc3RhdGljIHZvaWQgamVkZWNfcmVzZXQodTMyIGJhc2UsIHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSkKIHsKIAkvKiBSZXNldCAqLwogCkBAIC0xODMyLDcgKzE2NzgsNyBAQAogCSAqIDB4MmFhYSwgMHhGMCBhdCAweDU1NTUgdGhpcyB3aWxsIG5vdCBhZmZlY3QgdGhlIEFNRCBjaGlwcwogCSAqIGFzIHRoZXkgd2lsbCBpZ25vcmUgdGhlIHdyaXRlcyBhbmQgZG9udCBjYXJlIHdoYXQgYWRkcmVzcwogCSAqIHRoZSBGMCBpcyB3cml0dGVuIHRvICovCi0JaWYoY2ZpLT5hZGRyX3VubG9jazEpIHsKKwlpZiAoY2ZpLT5hZGRyX3VubG9jazEpIHsKIAkJREVCVUcoIE1URF9ERUJVR19MRVZFTDMsCiAJCSAgICAgICAicmVzZXQgdW5sb2NrIGNhbGxlZCAleCAleCBcbiIsCiAJCSAgICAgICBjZmktPmFkZHJfdW5sb2NrMSxjZmktPmFkZHJfdW5sb2NrMik7CkBAIC0xODQxLDcgKzE2ODcsNyBAQAogCX0KIAogCWNmaV9zZW5kX2dlbl9jbWQoMHhGMCwgY2ZpLT5hZGRyX3VubG9jazEsIGJhc2UsIG1hcCwgY2ZpLCBjZmktPmRldmljZV90eXBlLCBOVUxMKTsKLQkvKiBTb21lIG1pc2Rlc2lnbmVkIGludGVsIGNoaXBzIGRvIG5vdCByZXNwb25kIGZvciAweEYwIGZvciBhIHJlc2V0LAorCS8qIFNvbWUgbWlzZGVzaWduZWQgSW50ZWwgY2hpcHMgZG8gbm90IHJlc3BvbmQgZm9yIDB4RjAgZm9yIGEgcmVzZXQsCiAJICogc28gZW5zdXJlIHdlJ3JlIGluIHJlYWQgbW9kZS4gIFNlbmQgYm90aCB0aGUgSW50ZWwgYW5kIHRoZSBBTUQgY29tbWFuZAogCSAqIGZvciB0aGlzLiAgSW50ZWwgdXNlcyAweGZmIGZvciB0aGlzLCBBTUQgdXNlcyAweGZmIGZvciBOT1AsIHNvCiAJICogdGhpcyBzaG91bGQgYmUgc2FmZS4KQEAgLTE4NTEsNDIgKzE2OTcsMjAgQEAKIH0KIAogCi1zdGF0aWMgaW5saW5lIF9fdTggZmluZm9fdWFkZHIoY29uc3Qgc3RydWN0IGFtZF9mbGFzaF9pbmZvICpmaW5mbywgaW50IGRldmljZV90eXBlKQotewotCWludCB1YWRkcl9pZHg7Ci0JX191OCB1YWRkciA9IE1URF9VQUREUl9OT1RfU1VQUE9SVEVEOwotCi0Jc3dpdGNoICggZGV2aWNlX3R5cGUgKSB7Ci0JY2FzZSBDRklfREVWSUNFVFlQRV9YODogIHVhZGRyX2lkeCA9IDA7IGJyZWFrOwotCWNhc2UgQ0ZJX0RFVklDRVRZUEVfWDE2OiB1YWRkcl9pZHggPSAxOyBicmVhazsKLQljYXNlIENGSV9ERVZJQ0VUWVBFX1gzMjogdWFkZHJfaWR4ID0gMjsgYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJNVEQ6ICVzKCk6IHVua25vd24gZGV2aWNlX3R5cGUgJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgZGV2aWNlX3R5cGUpOwotCQlnb3RvIHVhZGRyX2RvbmU7Ci0JfQotCi0JdWFkZHIgPSBmaW5mby0+dWFkZHJbdWFkZHJfaWR4XTsKLQotCWlmICh1YWRkciAhPSBNVERfVUFERFJfTk9UX1NVUFBPUlRFRCApIHsKLQkJLyogQVNTRVJUKCJUaGUgdW5sb2NrIGFkZHJlc3NlcyBmb3Igbm9uLTgtYml0IG1vZGUKLQkJICAgYXJlIGJvbGxvY2tzLiBXZSBkb24ndCByZWFsbHkgbmVlZCBhbiBhcnJheS4iKTsgKi8KLQkJdWFkZHIgPSBmaW5mby0+dWFkZHJbMF07Ci0JfQotCi0gdWFkZHJfZG9uZToKLQlyZXR1cm4gdWFkZHI7Ci19Ci0KLQogc3RhdGljIGludCBjZmlfamVkZWNfc2V0dXAoc3RydWN0IGNmaV9wcml2YXRlICpwX2NmaSwgaW50IGluZGV4KQogewogCWludCBpLG51bV9lcmFzZV9yZWdpb25zOwotCV9fdTggdWFkZHI7CisJdWludDhfdCB1YWRkcjsKIAotCXByaW50aygiRm91bmQ6ICVzXG4iLGplZGVjX3RhYmxlW2luZGV4XS5uYW1lKTsKKwlpZiAoISAoamVkZWNfdGFibGVbaW5kZXhdLmRldnR5cGVzICYgcF9jZmktPmRldmljZV90eXBlKSkgeworCQlERUJVRyhNVERfREVCVUdfTEVWRUwxLCAiUmVqZWN0aW5nIHBvdGVudGlhbCAlcyB3aXRoIGluY29tcGF0aWJsZSAlZC1iaXQgZGV2aWNlIHR5cGVcbiIsCisJCSAgICAgIGplZGVjX3RhYmxlW2luZGV4XS5uYW1lLCA0ICogKDE8PHBfY2ZpLT5kZXZpY2VfdHlwZSkpOworCQlyZXR1cm4gMDsKKwl9CiAKLQludW1fZXJhc2VfcmVnaW9ucyA9IGplZGVjX3RhYmxlW2luZGV4XS5OdW1FcmFzZVJlZ2lvbnM7CisJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQ6ICVzXG4iLGplZGVjX3RhYmxlW2luZGV4XS5uYW1lKTsKKworCW51bV9lcmFzZV9yZWdpb25zID0gamVkZWNfdGFibGVbaW5kZXhdLm5yX3JlZ2lvbnM7CiAKIAlwX2NmaS0+Y2ZpcSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjZmlfaWRlbnQpICsgbnVtX2VyYXNlX3JlZ2lvbnMgKiA0LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBfY2ZpLT5jZmlxKSB7CkBAIC0xODk2LDkgKzE3MjAsOSBAQAogCiAJbWVtc2V0KHBfY2ZpLT5jZmlxLDAsc2l6ZW9mKHN0cnVjdCBjZmlfaWRlbnQpKTsKIAotCXBfY2ZpLT5jZmlxLT5QX0lEID0gamVkZWNfdGFibGVbaW5kZXhdLkNtZFNldDsKLQlwX2NmaS0+Y2ZpcS0+TnVtRXJhc2VSZWdpb25zID0gamVkZWNfdGFibGVbaW5kZXhdLk51bUVyYXNlUmVnaW9uczsKLQlwX2NmaS0+Y2ZpcS0+RGV2U2l6ZSA9IGplZGVjX3RhYmxlW2luZGV4XS5EZXZTaXplOworCXBfY2ZpLT5jZmlxLT5QX0lEID0gamVkZWNfdGFibGVbaW5kZXhdLmNtZF9zZXQ7CisJcF9jZmktPmNmaXEtPk51bUVyYXNlUmVnaW9ucyA9IGplZGVjX3RhYmxlW2luZGV4XS5ucl9yZWdpb25zOworCXBfY2ZpLT5jZmlxLT5EZXZTaXplID0gamVkZWNfdGFibGVbaW5kZXhdLmRldl9zaXplOwogCXBfY2ZpLT5jZmlfbW9kZSA9IENGSV9NT0RFX0pFREVDOwogCiAJZm9yIChpPTA7IGk8bnVtX2VyYXNlX3JlZ2lvbnM7IGkrKyl7CkBAIC0xOTEwLDE0ICsxNzM0LDE0IEBACiAJcF9jZmktPm1mciA9IGplZGVjX3RhYmxlW2luZGV4XS5tZnJfaWQ7CiAJcF9jZmktPmlkID0gamVkZWNfdGFibGVbaW5kZXhdLmRldl9pZDsKIAotCXVhZGRyID0gZmluZm9fdWFkZHIoJmplZGVjX3RhYmxlW2luZGV4XSwgcF9jZmktPmRldmljZV90eXBlKTsKLQlpZiAoIHVhZGRyID09IE1URF9VQUREUl9OT1RfU1VQUE9SVEVEICkgewotCQlrZnJlZSggcF9jZmktPmNmaXEgKTsKLQkJcmV0dXJuIDA7Ci0JfQorCXVhZGRyID0gamVkZWNfdGFibGVbaW5kZXhdLnVhZGRyOwogCi0JcF9jZmktPmFkZHJfdW5sb2NrMSA9IHVubG9ja19hZGRyc1t1YWRkcl0uYWRkcjE7Ci0JcF9jZmktPmFkZHJfdW5sb2NrMiA9IHVubG9ja19hZGRyc1t1YWRkcl0uYWRkcjI7CisJLyogVGhlIHRhYmxlIGhhcyB1bmxvY2sgYWRkcmVzc2VzIGluIF9ieXRlc18sIGFuZCB3ZSB0cnkgbm90IHRvIGxldAorCSAgIG91ciBicmFpbnMgZXhwbG9kZSB3aGVuIHdlIHNlZSB0aGUgZGF0YXNoZWV0cyB0YWxraW5nIGFib3V0IGFkZHJlc3MKKwkgICBsaW5lcyBudW1iZXJlZCBmcm9tIEEtMSB0byBBMTguIFRoZSBDRkkgdGFibGUgaGFzIHVubG9jayBhZGRyZXNzZXMKKwkgICBpbiBkZXZpY2Utd29yZHMgYWNjb3JkaW5nIHRvIHRoZSBtb2RlIHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIGluICovCisJcF9jZmktPmFkZHJfdW5sb2NrMSA9IHVubG9ja19hZGRyc1t1YWRkcl0uYWRkcjEgLyBwX2NmaS0+ZGV2aWNlX3R5cGU7CisJcF9jZmktPmFkZHJfdW5sb2NrMiA9IHVubG9ja19hZGRyc1t1YWRkcl0uYWRkcjIgLyBwX2NmaS0+ZGV2aWNlX3R5cGU7CiAKIAlyZXR1cm4gMTsgCS8qIG9rICovCiB9CkBAIC0xOTMwLDE0ICsxNzU0LDE0IEBACiAgKiBiZSBwZXJmZWN0IC0gY29uc2VxdWVudGx5IHRoZXJlIHNob3VsZCBiZSBzb21lIG1vZHVsZSBwYXJhbWV0ZXJzIHRoYXQKICAqIGNvdWxkIGJlIG1hbnVhbGx5IHNwZWNpZmllZCB0byBmb3JjZSB0aGUgY2hpcCBpbmZvLgogICovCi1zdGF0aWMgaW5saW5lIGludCBqZWRlY19tYXRjaCggX191MzIgYmFzZSwKK3N0YXRpYyBpbmxpbmUgaW50IGplZGVjX21hdGNoKCB1aW50MzJfdCBiYXNlLAogCQkJICAgICAgIHN0cnVjdCBtYXBfaW5mbyAqbWFwLAogCQkJICAgICAgIHN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBhbWRfZmxhc2hfaW5mbyAqZmluZm8gKQogewogCWludCByYyA9IDA7ICAgICAgICAgICAvKiBmYWlsdXJlIHVudGlsIGFsbCB0ZXN0cyBwYXNzICovCiAJdTMyIG1mciwgaWQ7Ci0JX191OCB1YWRkcjsKKwl1aW50OF90IHVhZGRyOwogCiAJLyoKIAkgKiBUaGUgSURzIG11c3QgbWF0Y2guICBGb3IgWDE2IGFuZCBYMzIgZGV2aWNlcyBvcGVyYXRpbmcgaW4KQEAgLTE5NTAsOCArMTc3NCw4IEBACiAJICovCiAJc3dpdGNoIChjZmktPmRldmljZV90eXBlKSB7CiAJY2FzZSBDRklfREVWSUNFVFlQRV9YODoKLQkJbWZyID0gKF9fdTgpZmluZm8tPm1mcl9pZDsKLQkJaWQgPSAoX191OClmaW5mby0+ZGV2X2lkOworCQltZnIgPSAodWludDhfdClmaW5mby0+bWZyX2lkOworCQlpZCA9ICh1aW50OF90KWZpbmZvLT5kZXZfaWQ7CiAKIAkJLyogYmpkOiBpdCBzZWVtcyB0aGF0IGlmIHdlIGRvIHRoaXMsIHdlIGNhbiBlbmQgdXAKIAkJICogZGV0ZWN0aW5nIDE2Yml0IGZsYXNoZXMgYXMgYW4gOGJpdCBkZXZpY2UsIGV2ZW4gdGhvdWdoCkBAIC0xOTY0LDEyICsxNzg4LDEyIEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBDRklfREVWSUNFVFlQRV9YMTY6Ci0JCW1mciA9IChfX3UxNilmaW5mby0+bWZyX2lkOwotCQlpZCA9IChfX3UxNilmaW5mby0+ZGV2X2lkOworCQltZnIgPSAodWludDE2X3QpZmluZm8tPm1mcl9pZDsKKwkJaWQgPSAodWludDE2X3QpZmluZm8tPmRldl9pZDsKIAkJYnJlYWs7CiAJY2FzZSBDRklfREVWSUNFVFlQRV9YMzI6Ci0JCW1mciA9IChfX3UxNilmaW5mby0+bWZyX2lkOwotCQlpZCA9IChfX3UzMilmaW5mby0+ZGV2X2lkOworCQltZnIgPSAodWludDE2X3QpZmluZm8tPm1mcl9pZDsKKwkJaWQgPSAodWludDMyX3QpZmluZm8tPmRldl9pZDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fV0FSTklORwpAQCAtMTk4NCwyNSArMTgwOCwyNSBAQAogCS8qIHRoZSBwYXJ0IHNpemUgbXVzdCBmaXQgaW4gdGhlIG1lbW9yeSB3aW5kb3cgKi8KIAlERUJVRyggTVREX0RFQlVHX0xFVkVMMywKIAkgICAgICAgIk1URCAlcygpOiBDaGVjayBmaXQgMHglLjh4ICsgMHglLjh4ID0gMHglLjh4XG4iLAotCSAgICAgICBfX2Z1bmNfXywgYmFzZSwgMSA8PCBmaW5mby0+RGV2U2l6ZSwgYmFzZSArICgxIDw8IGZpbmZvLT5EZXZTaXplKSApOwotCWlmICggYmFzZSArIGNmaV9pbnRlcmxlYXZlKGNmaSkgKiAoIDEgPDwgZmluZm8tPkRldlNpemUgKSA+IG1hcC0+c2l6ZSApIHsKKwkgICAgICAgX19mdW5jX18sIGJhc2UsIDEgPDwgZmluZm8tPmRldl9zaXplLCBiYXNlICsgKDEgPDwgZmluZm8tPmRldl9zaXplKSApOworCWlmICggYmFzZSArIGNmaV9pbnRlcmxlYXZlKGNmaSkgKiAoIDEgPDwgZmluZm8tPmRldl9zaXplICkgPiBtYXAtPnNpemUgKSB7CiAJCURFQlVHKCBNVERfREVCVUdfTEVWRUwzLAogCQkgICAgICAgIk1URCAlcygpOiAweCUuNHggMHglLjR4ICVkS2lCIGRvZXNuJ3QgZml0XG4iLAogCQkgICAgICAgX19mdW5jX18sIGZpbmZvLT5tZnJfaWQsIGZpbmZvLT5kZXZfaWQsCi0JCSAgICAgICAxIDw8IGZpbmZvLT5EZXZTaXplICk7CisJCSAgICAgICAxIDw8IGZpbmZvLT5kZXZfc2l6ZSApOwogCQlnb3RvIG1hdGNoX2RvbmU7CiAJfQogCi0JdWFkZHIgPSBmaW5mb191YWRkcihmaW5mbywgY2ZpLT5kZXZpY2VfdHlwZSk7Ci0JaWYgKCB1YWRkciA9PSBNVERfVUFERFJfTk9UX1NVUFBPUlRFRCApIHsKKwlpZiAoISAoZmluZm8tPmRldnR5cGVzICYgY2ZpLT5kZXZpY2VfdHlwZSkpCiAJCWdvdG8gbWF0Y2hfZG9uZTsKLQl9CisKKwl1YWRkciA9IGZpbmZvLT51YWRkcjsKIAogCURFQlVHKCBNVERfREVCVUdfTEVWRUwzLCAiTVREICVzKCk6IGNoZWNrIHVubG9jayBhZGRycyAweCUuNHggMHglLjR4XG4iLAogCSAgICAgICBfX2Z1bmNfXywgY2ZpLT5hZGRyX3VubG9jazEsIGNmaS0+YWRkcl91bmxvY2syICk7CiAJaWYgKCBNVERfVUFERFJfVU5ORUNFU1NBUlkgIT0gdWFkZHIgJiYgTVREX1VBRERSX0RPTlRfQ0FSRSAhPSB1YWRkcgotCSAgICAgJiYgKCB1bmxvY2tfYWRkcnNbdWFkZHJdLmFkZHIxICE9IGNmaS0+YWRkcl91bmxvY2sxIHx8Ci0JCSAgdW5sb2NrX2FkZHJzW3VhZGRyXS5hZGRyMiAhPSBjZmktPmFkZHJfdW5sb2NrMiApICkgeworCSAgICAgJiYgKCB1bmxvY2tfYWRkcnNbdWFkZHJdLmFkZHIxIC8gY2ZpLT5kZXZpY2VfdHlwZSAhPSBjZmktPmFkZHJfdW5sb2NrMSB8fAorCQkgIHVubG9ja19hZGRyc1t1YWRkcl0uYWRkcjIgLyBjZmktPmRldmljZV90eXBlICE9IGNmaS0+YWRkcl91bmxvY2syICkgKSB7CiAJCURFQlVHKCBNVERfREVCVUdfTEVWRUwzLAogCQkJIk1URCAlcygpOiAweCUuNHggMHglLjR4IGRpZCBub3QgbWF0Y2hcbiIsCiAJCQlfX2Z1bmNfXywKQEAgLTIwNDIsNyArMTg2Niw3IEBACiAJICogd2VyZSB0cnVseSBmcm9iYmluZyBhIHJlYWwgZGV2aWNlLgogCSAqLwogCURFQlVHKCBNVERfREVCVUdfTEVWRUwzLCAiTVREICVzKCk6IHJldHVybiB0byBJRCBtb2RlXG4iLCBfX2Z1bmNfXyApOwotCWlmKGNmaS0+YWRkcl91bmxvY2sxKSB7CisJaWYgKGNmaS0+YWRkcl91bmxvY2sxKSB7CiAJCWNmaV9zZW5kX2dlbl9jbWQoMHhhYSwgY2ZpLT5hZGRyX3VubG9jazEsIGJhc2UsIG1hcCwgY2ZpLCBjZmktPmRldmljZV90eXBlLCBOVUxMKTsKIAkJY2ZpX3NlbmRfZ2VuX2NtZCgweDU1LCBjZmktPmFkZHJfdW5sb2NrMiwgYmFzZSwgbWFwLCBjZmksIGNmaS0+ZGV2aWNlX3R5cGUsIE5VTEwpOwogCX0KQEAgLTIwNjgsOCArMTg5Miw4IEBACiAJCWlmIChNVERfVUFERFJfVU5ORUNFU1NBUlkgPT0gdWFkZHJfaWR4KQogCQkJcmV0dXJuIDA7CiAKLQkJY2ZpLT5hZGRyX3VubG9jazEgPSB1bmxvY2tfYWRkcnNbdWFkZHJfaWR4XS5hZGRyMTsKLQkJY2ZpLT5hZGRyX3VubG9jazIgPSB1bmxvY2tfYWRkcnNbdWFkZHJfaWR4XS5hZGRyMjsKKwkJY2ZpLT5hZGRyX3VubG9jazEgPSB1bmxvY2tfYWRkcnNbdWFkZHJfaWR4XS5hZGRyMSAvIGNmaS0+ZGV2aWNlX3R5cGU7CisJCWNmaS0+YWRkcl91bmxvY2syID0gdW5sb2NrX2FkZHJzW3VhZGRyX2lkeF0uYWRkcjIgLyBjZmktPmRldmljZV90eXBlOwogCX0KIAogCS8qIE1ha2UgY2VydGFpbiB3ZSBhcmVuJ3QgcHJvYmluZyBwYXN0IHRoZSBlbmQgb2YgbWFwICovCkBAIC0yMDgxLDE5ICsxOTA1LDExIEBACiAKIAl9CiAJLyogRW5zdXJlIHRoZSB1bmxvY2sgYWRkcmVzc2VzIHdlIHRyeSBzdGF5IGluc2lkZSB0aGUgbWFwICovCi0JcHJvYmVfb2Zmc2V0MSA9IGNmaV9idWlsZF9jbWRfYWRkcigKLQkJY2ZpLT5hZGRyX3VubG9jazEsCi0JCWNmaV9pbnRlcmxlYXZlKGNmaSksCi0JCWNmaS0+ZGV2aWNlX3R5cGUpOwotCXByb2JlX29mZnNldDIgPSBjZmlfYnVpbGRfY21kX2FkZHIoCi0JCWNmaS0+YWRkcl91bmxvY2sxLAotCQljZmlfaW50ZXJsZWF2ZShjZmkpLAotCQljZmktPmRldmljZV90eXBlKTsKKwlwcm9iZV9vZmZzZXQxID0gY2ZpX2J1aWxkX2NtZF9hZGRyKGNmaS0+YWRkcl91bmxvY2sxLCBjZmlfaW50ZXJsZWF2ZShjZmkpLCBjZmktPmRldmljZV90eXBlKTsKKwlwcm9iZV9vZmZzZXQyID0gY2ZpX2J1aWxkX2NtZF9hZGRyKGNmaS0+YWRkcl91bmxvY2syLCBjZmlfaW50ZXJsZWF2ZShjZmkpLCBjZmktPmRldmljZV90eXBlKTsKIAlpZiAoCSgoYmFzZSArIHByb2JlX29mZnNldDEgKyBtYXBfYmFua3dpZHRoKG1hcCkpID49IG1hcC0+c2l6ZSkgfHwKIAkJKChiYXNlICsgcHJvYmVfb2Zmc2V0MiArIG1hcF9iYW5rd2lkdGgobWFwKSkgPj0gbWFwLT5zaXplKSkKLQl7CiAJCWdvdG8gcmV0cnk7Ci0JfQogCiAJLyogUmVzZXQgKi8KIAlqZWRlY19yZXNldChiYXNlLCBtYXAsIGNmaSk7CkBAIC0yMTI4LDggKzE5NDQsOCBAQAogCQl9CiAJCWdvdG8gcmV0cnk7CiAJfSBlbHNlIHsKLQkJX191MTYgbWZyOwotCQlfX3UxNiBpZDsKKwkJdWludDE2X3QgbWZyOworCQl1aW50MTZfdCBpZDsKIAogCQkvKiBNYWtlIHN1cmUgaXQgaXMgYSBjaGlwIG9mIHRoZSBzYW1lIG1hbnVmYWN0dXJlciBhbmQgaWQgKi8KIAkJbWZyID0gamVkZWNfcmVhZF9tZnIobWFwLCBiYXNlLCBjZmkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvY21kbGluZXBhcnQuYyBiL2RyaXZlcnMvbXRkL2NtZGxpbmVwYXJ0LmMKaW5kZXggMjNmYWIxNC4uYjQ0MjkyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvY21kbGluZXBhcnQuYworKysgYi9kcml2ZXJzL210ZC9jbWRsaW5lcGFydC5jCkBAIC05LDcgKzksNyBAQAogICoKICAqIG10ZHBhcnRzPTxtdGRkZWY+Wzs8bXRkZGVmXQogICogPG10ZGRlZj4gIDo9IDxtdGQtaWQ+OjxwYXJ0ZGVmPlssPHBhcnRkZWY+XQotICogPHBhcnRkZWY+IDo9IDxzaXplPltAb2Zmc2V0XVs8bmFtZT5dW3JvXQorICogPHBhcnRkZWY+IDo9IDxzaXplPltAb2Zmc2V0XVs8bmFtZT5dW3JvXVtsa10KICAqIDxtdGQtaWQ+ICA6PSB1bmlxdWUgbmFtZSB1c2VkIGluIG1hcHBpbmcgZHJpdmVyL2RldmljZSAobXRkLT5uYW1lKQogICogPHNpemU+ICAgIDo9IHN0YW5kYXJkIGxpbnV4IG1lbXNpemUgT1IgIi0iIHRvIGRlbm90ZSBhbGwgcmVtYWluaW5nIHNwYWNlCiAgKiA8bmFtZT4gICAgOj0gJygnIE5BTUUgJyknCkBAIC0xNDMsNiArMTQzLDEzIEBACiAJCXMgKz0gMjsKICAgICAgICAgfQogCisgICAgICAgIC8qIGlmIGxrIGlzIGZvdW5kIGRvIE5PVCB1bmxvY2sgdGhlIE1URCBwYXJ0aXRpb24qLworICAgICAgICBpZiAoc3RybmNtcChzLCAibGsiLCAyKSA9PSAwKQorCXsKKwkJbWFza19mbGFncyB8PSBNVERfUE9XRVJVUF9MT0NLOworCQlzICs9IDI7CisgICAgICAgIH0KKwogCS8qIHRlc3QgaWYgbW9yZSBwYXJ0aXRpb25zIGFyZSBmb2xsb3dpbmcgKi8KIAlpZiAoKnMgPT0gJywnKQogCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jMjAwMC5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2MyMDAwLmMKaW5kZXggOTBhY2Y1Ny4uODQ2OTg5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2MyMDAwLmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2MyMDAwLmMKQEAgLTYzMiw3ICs2MzIsNyBAQAogCQkJbGVuID0gKChmcm9tIHwgMHgxZmYpICsgMSkgLSBmcm9tOwogCiAJCS8qIFRoZSBFQ0Mgd2lsbCBub3QgYmUgY2FsY3VsYXRlZCBjb3JyZWN0bHkgaWYgbGVzcyB0aGFuIDUxMiBpcyByZWFkICovCi0JCWlmIChsZW4gIT0gMHgyMDAgJiYgZWNjYnVmKQorCQlpZiAobGVuICE9IDB4MjAwKQogCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJICAgICAgICJFQ0MgbmVlZHMgYSBmdWxsIHNlY3RvciByZWFkIChhZHI6ICVseCBzaXplICVseClcbiIsCiAJCQkgICAgICAgKGxvbmcpIGZyb20sIChsb25nKSBsZW4pOwpAQCAtODk2LDcgKzg5Niw3IEBACiAJCS8qIExldCB0aGUgY2FsbGVyIGtub3cgd2UgY29tcGxldGVkIGl0ICovCiAJCSpyZXRsZW4gKz0gbGVuOwogCi0JCWlmIChlY2NidWYpIHsKKwkJewogCQkJdW5zaWduZWQgY2hhciB4WzhdOwogCQkJc2l6ZV90IGR1bW15OwogCQkJaW50IHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jMjAwMXBsdXMuYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvZG9jMjAwMXBsdXMuYwppbmRleCAyYjMwYjU4Li44M2JlMzQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL2RvYzIwMDFwbHVzLmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9kb2MyMDAxcGx1cy5jCkBAIC03NDgsNyArNzQ4LDcgQEAKIAlXcml0ZURPQyhEb0NfR2V0RGF0YU9mZnNldChtdGQsICZmdG8pLCBkb2NwdHIsIE1wbHVzX0ZsYXNoQ21kKTsKIAogCS8qIE9uIGludGVybGVhdmVkIGRldmljZXMgdGhlIGZsYWdzIGZvciAybmQgaGFsZiA1MTIgYXJlIGJlZm9yZSBkYXRhICovCi0JaWYgKGVjY2J1ZiAmJiBiZWZvcmUpCisJaWYgKGJlZm9yZSkKIAkJZnRvIC09IDI7CiAKIAkvKiBpc3N1ZSB0aGUgU2VyaWFsIERhdGEgSW4gY29tbWFuZCB0byBpbml0aWFsIHRoZSBQYWdlIFByb2dyYW0gcHJvY2VzcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9sYXJ0LmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL2xhcnQuYwppbmRleCA0ZWE1MGExLi45OWZkMjEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL2xhcnQuYworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL2xhcnQuYwpAQCAtMzIzLDcgKzMyMyw3IEBACiAgICAvKiBwdXQgdGhlIGZsYXNoIGJhY2sgaW50byBjb21tYW5kIG1vZGUgKi8KICAgIHdyaXRlMzIgKERBVEFfVE9fRkxBU0ggKFJFQURfQVJSQVkpLDB4MDAwMDAwMDApOwogCi0gICByZXR1cm4gKG1hbnVmYWN0dXJlciA9PSBGTEFTSF9NQU5VRkFDVFVSRVIgJiYgKGRldnR5cGUgPT0gRkxBU0hfREVWSUNFXzE2bWJpdF9UT1AgfHwgRkxBU0hfREVWSUNFXzE2bWJpdF9CT1RUT00pKTsKKyAgIHJldHVybiAobWFudWZhY3R1cmVyID09IEZMQVNIX01BTlVGQUNUVVJFUiAmJiAoZGV2dHlwZSA9PSBGTEFTSF9ERVZJQ0VfMTZtYml0X1RPUCB8fCBkZXZ0eXBlID09IEZMQVNIX0RFVklDRV8xNm1iaXRfQk9UVE9NKSk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL210ZF9kYXRhZmxhc2guYyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkX2RhdGFmbGFzaC5jCmluZGV4IGE1ZWQ2ZDIuLmIzNWU0ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkX2RhdGFmbGFzaC5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkX2RhdGFmbGFzaC5jCkBAIC00MjAsNyArNDIwLDcgQEAKIAkJc3RhdHVzID0gZGF0YWZsYXNoX3dhaXRyZWFkeShwcml2LT5zcGkpOwogCiAJCS8qIENoZWNrIHJlc3VsdCBvZiB0aGUgY29tcGFyZSBvcGVyYXRpb24gKi8KLQkJaWYgKChzdGF0dXMgJiAoMSA8PCA2KSkgPT0gMSkgeworCQlpZiAoc3RhdHVzICYgKDEgPDwgNikpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvbXBhcmUgcGFnZSAldSwgZXJyICVkXG4iLAogCQkJCXNwaS0+ZGV2LmJ1c19pZCwgcGFnZWFkZHIsIHN0YXR1cyk7CiAJCQlyZW1haW5pbmcgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnIGIvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCmluZGV4IGE1OTJmYzAuLjEyYzI1MzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZworKysgYi9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcKQEAgLTExMCwxMyArMTEwLDYgQEAKIAkgIFN1biBNaWNyb3N5c3RlbXMgYm9hcmRzZXRzLiAgVGhpcyBkcml2ZXIgd2lsbCByZXF1aXJlIENGSSBzdXBwb3J0CiAJICBpbiB0aGUga2VybmVsLCBzbyBpZiB5b3UgZGlkIG5vdCBlbmFibGUgQ0ZJIHByZXZpb3VzbHksIGRvIHRoYXQgbm93LgogCi1jb25maWcgTVREX1BOQzIwMDAKLQl0cmlzdGF0ZSAiQ0ZJIEZsYXNoIGRldmljZSBtYXBwZWQgb24gUGhvdHJvbiBQTkMtMjAwMCIKLQlkZXBlbmRzIG9uIFg4NiAmJiBNVERfQ0ZJICYmIE1URF9QQVJUSVRJT05TCi0JaGVscAotCSAgUE5DLTIwMDAgaXMgdGhlIG5hbWUgb2YgTmV0d29yayBDYW1lcmEgcHJvZHVjdCBmcm9tIFBIT1RST04KLQkgIEx0ZC4gaW4gSmFwYW4uIEl0IHVzZXMgQ0ZJLWNvbXBsaWFudCBmbGFzaC4KLQogY29uZmlnIE1URF9TQzUyMENEUAogCXRyaXN0YXRlICJDRkkgRmxhc2ggZGV2aWNlIG1hcHBlZCBvbiBBTUQgU0M1MjAgQ0RQIgogCWRlcGVuZHMgb24gWDg2ICYmIE1URF9DRkkgJiYgTVREX0NPTkNBVApAQCAtNTc2LDcgKzU2OSw3IEBACiAJZGVmYXVsdCAiNCIKIAogY29uZmlnIE1URF9TSEFSUF9TTAotCWJvb2wgIlJPTSBtYXBwZWQgb24gU2hhcnAgU0wgU2VyaWVzIgorCXRyaXN0YXRlICJST00gbWFwcGVkIG9uIFNoYXJwIFNMIFNlcmllcyIKIAlkZXBlbmRzIG9uIEFSQ0hfUFhBCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIGFjY2VzcyB0byB0aGUgZmxhc2ggY2hpcCBvbiB0aGUgU2hhcnAgU0wgU2VyaWVzIG9mIFBEQXMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL01ha2VmaWxlIGIvZHJpdmVycy9tdGQvbWFwcy9NYWtlZmlsZQppbmRleCAzMTYzODJhLi5hOWNiZTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvTWFrZWZpbGUKQEAgLTI4LDcgKzI4LDYgQEAKIG9iai0kKENPTkZJR19NVERfUEhZU01BUF9PRikJKz0gcGh5c21hcF9vZi5vCiBvYmotJChDT05GSUdfTVREX1BNQ19NU1BfRVZNKSAgICs9IHBtY21zcC1mbGFzaC5vCiBvYmotJChDT05GSUdfTVREX1BNQ19NU1BfUkFNUk9PVCkrPSBwbWNtc3AtcmFtcm9vdC5vCi1vYmotJChDT05GSUdfTVREX1BOQzIwMDApCSs9IHBuYzIwMDAubwogb2JqLSQoQ09ORklHX01URF9QQ01DSUEpCSs9IHBjbWNpYW10ZC5vCiBvYmotJChDT05GSUdfTVREX1JQWExJVEUpCSs9IHJweGxpdGUubwogb2JqLSQoQ09ORklHX01URF9UUU04WFhMKQkrPSB0cW04eHhsLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvcGh5c21hcC5jIGIvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwLmMKaW5kZXggMjhjNWZmZC4uZjAwZTA0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwLmMKQEAgLTIwLDExICsyMCwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL2NvbmNhdC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCisjZGVmaW5lIE1BWF9SRVNPVVJDRVMJCTQKKwogc3RydWN0IHBoeXNtYXBfZmxhc2hfaW5mbyB7Ci0Jc3RydWN0IG10ZF9pbmZvCQkqbXRkOwotCXN0cnVjdCBtYXBfaW5mbwkJbWFwOworCXN0cnVjdCBtdGRfaW5mbwkJKm10ZFtNQVhfUkVTT1VSQ0VTXTsKKwlzdHJ1Y3QgbXRkX2luZm8JCSpjbXRkOworCXN0cnVjdCBtYXBfaW5mbwkJbWFwW01BWF9SRVNPVVJDRVNdOwogCXN0cnVjdCByZXNvdXJjZQkJKnJlczsKICNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKIAlpbnQJCQlucl9wYXJ0czsKQEAgLTMyLDExICszNiwxMSBAQAogI2VuZGlmCiB9OwogCi0KIHN0YXRpYyBpbnQgcGh5c21hcF9mbGFzaF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBwaHlzbWFwX2ZsYXNoX2luZm8gKmluZm87CiAJc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSAqcGh5c21hcF9kYXRhOworCWludCBpOwogCiAJaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CiAJaWYgKGluZm8gPT0gTlVMTCkKQEAgLTQ1LDI0ICs0OSwzMyBAQAogCiAJcGh5c21hcF9kYXRhID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAotCWlmIChpbmZvLT5tdGQgIT0gTlVMTCkgewotI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUwotCQlpZiAoaW5mby0+bnJfcGFydHMpIHsKLQkJCWRlbF9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGQpOwotCQkJa2ZyZWUoaW5mby0+cGFydHMpOwotCQl9IGVsc2UgaWYgKHBoeXNtYXBfZGF0YS0+bnJfcGFydHMpIHsKLQkJCWRlbF9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGQpOwotCQl9IGVsc2UgewotCQkJZGVsX210ZF9kZXZpY2UoaW5mby0+bXRkKTsKLQkJfQotI2Vsc2UKLQkJZGVsX210ZF9kZXZpY2UoaW5mby0+bXRkKTsKLSNlbmRpZgotCQltYXBfZGVzdHJveShpbmZvLT5tdGQpOworI2lmZGVmIENPTkZJR19NVERfQ09OQ0FUCisJaWYgKGluZm8tPmNtdGQgIT0gaW5mby0+bXRkWzBdKSB7CisJCWRlbF9tdGRfZGV2aWNlKGluZm8tPmNtdGQpOworCQltdGRfY29uY2F0X2Rlc3Ryb3koaW5mby0+Y210ZCk7CiAJfQorI2VuZGlmCiAKLQlpZiAoaW5mby0+bWFwLnZpcnQgIT0gTlVMTCkKLQkJaW91bm1hcChpbmZvLT5tYXAudmlydCk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9SRVNPVVJDRVM7IGkrKykgeworCQlpZiAoaW5mby0+bXRkW2ldICE9IE5VTEwpIHsKKyNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKKwkJCWlmIChpbmZvLT5ucl9wYXJ0cykgeworCQkJCWRlbF9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGRbaV0pOworCQkJCWtmcmVlKGluZm8tPnBhcnRzKTsKKwkJCX0gZWxzZSBpZiAocGh5c21hcF9kYXRhLT5ucl9wYXJ0cykgeworCQkJCWRlbF9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGRbaV0pOworCQkJfSBlbHNlIHsKKwkJCQlkZWxfbXRkX2RldmljZShpbmZvLT5tdGRbaV0pOworCQkJfQorI2Vsc2UKKwkJCWRlbF9tdGRfZGV2aWNlKGluZm8tPm10ZFtpXSk7CisjZW5kaWYKKwkJCW1hcF9kZXN0cm95KGluZm8tPm10ZFtpXSk7CisJCX0KKworCQlpZiAoaW5mby0+bWFwW2ldLnZpcnQgIT0gTlVMTCkKKwkJCWlvdW5tYXAoaW5mby0+bWFwW2ldLnZpcnQpOworCX0KIAogCWlmIChpbmZvLT5yZXMgIT0gTlVMTCkgewogCQlyZWxlYXNlX3Jlc291cmNlKGluZm8tPnJlcyk7CkBAIC04MiwxNiArOTUsMTQgQEAKIAlzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhICpwaHlzbWFwX2RhdGE7CiAJc3RydWN0IHBoeXNtYXBfZmxhc2hfaW5mbyAqaW5mbzsKIAljb25zdCBjaGFyICoqcHJvYmVfdHlwZTsKLQlpbnQgZXJyOworCWludCBlcnIgPSAwOworCWludCBpOworCWludCBkZXZpY2VzX2ZvdW5kID0gMDsKIAogCXBoeXNtYXBfZGF0YSA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJaWYgKHBoeXNtYXBfZGF0YSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotICAgICAgIAlwcmludGsoS0VSTl9OT1RJQ0UgInBoeXNtYXAgcGxhdGZvcm0gZmxhc2ggZGV2aWNlOiAlLjhsbHggYXQgJS44bGx4XG4iLAotCSAgICAodW5zaWduZWQgbG9uZyBsb25nKShkZXYtPnJlc291cmNlLT5lbmQgLSBkZXYtPnJlc291cmNlLT5zdGFydCArIDEpLAotCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWRldi0+cmVzb3VyY2UtPnN0YXJ0KTsKLQogCWluZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGh5c21hcF9mbGFzaF9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGluZm8gPT0gTlVMTCkgewogCQllcnIgPSAtRU5PTUVNOwpAQCAtMTAwLDU2ICsxMTEsODMgQEAKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgaW5mbyk7CiAKLQlpbmZvLT5yZXMgPSByZXF1ZXN0X21lbV9yZWdpb24oZGV2LT5yZXNvdXJjZS0+c3RhcnQsCi0JCQlkZXYtPnJlc291cmNlLT5lbmQgLSBkZXYtPnJlc291cmNlLT5zdGFydCArIDEsCi0JCQlkZXYtPmRldi5idXNfaWQpOwotCWlmIChpbmZvLT5yZXMgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZkZXYtPmRldiwgIkNvdWxkIG5vdCByZXNlcnZlIG1lbW9yeSByZWdpb25cbiIpOwotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9vdXQ7CisJZm9yIChpID0gMDsgaSA8IGRldi0+bnVtX3Jlc291cmNlczsgaSsrKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAicGh5c21hcCBwbGF0Zm9ybSBmbGFzaCBkZXZpY2U6ICUuOGxseCBhdCAlLjhsbHhcbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKShkZXYtPnJlc291cmNlW2ldLmVuZCAtIGRldi0+cmVzb3VyY2VbaV0uc3RhcnQgKyAxKSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGV2LT5yZXNvdXJjZVtpXS5zdGFydCk7CisKKwkJaW5mby0+cmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKGRldi0+cmVzb3VyY2VbaV0uc3RhcnQsCisJCQkJCSAgICAgICBkZXYtPnJlc291cmNlW2ldLmVuZCAtIGRldi0+cmVzb3VyY2VbaV0uc3RhcnQgKyAxLAorCQkJCQkgICAgICAgZGV2LT5kZXYuYnVzX2lkKTsKKwkJaWYgKGluZm8tPnJlcyA9PSBOVUxMKSB7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwgIkNvdWxkIG5vdCByZXNlcnZlIG1lbW9yeSByZWdpb25cbiIpOworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCisJCWluZm8tPm1hcFtpXS5uYW1lID0gZGV2LT5kZXYuYnVzX2lkOworCQlpbmZvLT5tYXBbaV0ucGh5cyA9IGRldi0+cmVzb3VyY2VbaV0uc3RhcnQ7CisJCWluZm8tPm1hcFtpXS5zaXplID0gZGV2LT5yZXNvdXJjZVtpXS5lbmQgLSBkZXYtPnJlc291cmNlW2ldLnN0YXJ0ICsgMTsKKwkJaW5mby0+bWFwW2ldLmJhbmt3aWR0aCA9IHBoeXNtYXBfZGF0YS0+d2lkdGg7CisJCWluZm8tPm1hcFtpXS5zZXRfdnBwID0gcGh5c21hcF9kYXRhLT5zZXRfdnBwOworCisJCWluZm8tPm1hcFtpXS52aXJ0ID0gaW9yZW1hcChpbmZvLT5tYXBbaV0ucGh5cywgaW5mby0+bWFwW2ldLnNpemUpOworCQlpZiAoaW5mby0+bWFwW2ldLnZpcnQgPT0gTlVMTCkgeworCQkJZGV2X2VycigmZGV2LT5kZXYsICJGYWlsZWQgdG8gaW9yZW1hcCBmbGFzaCByZWdpb25cbiIpOworCQkJZXJyID0gRUlPOworCQkJZ290byBlcnJfb3V0OworCQl9CisKKwkJc2ltcGxlX21hcF9pbml0KCZpbmZvLT5tYXBbaV0pOworCisJCXByb2JlX3R5cGUgPSByb21fcHJvYmVfdHlwZXM7CisJCWZvciAoOyBpbmZvLT5tdGRbaV0gPT0gTlVMTCAmJiAqcHJvYmVfdHlwZSAhPSBOVUxMOyBwcm9iZV90eXBlKyspCisJCQlpbmZvLT5tdGRbaV0gPSBkb19tYXBfcHJvYmUoKnByb2JlX3R5cGUsICZpbmZvLT5tYXBbaV0pOworCQlpZiAoaW5mby0+bXRkW2ldID09IE5VTEwpIHsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAibWFwX3Byb2JlIGZhaWxlZFxuIik7CisJCQllcnIgPSAtRU5YSU87CisJCQlnb3RvIGVycl9vdXQ7CisJCX0gZWxzZSB7CisJCQlkZXZpY2VzX2ZvdW5kKys7CisJCX0KKwkJaW5mby0+bXRkW2ldLT5vd25lciA9IFRISVNfTU9EVUxFOwogCX0KIAotCWluZm8tPm1hcC5uYW1lID0gZGV2LT5kZXYuYnVzX2lkOwotCWluZm8tPm1hcC5waHlzID0gZGV2LT5yZXNvdXJjZS0+c3RhcnQ7Ci0JaW5mby0+bWFwLnNpemUgPSBkZXYtPnJlc291cmNlLT5lbmQgLSBkZXYtPnJlc291cmNlLT5zdGFydCArIDE7Ci0JaW5mby0+bWFwLmJhbmt3aWR0aCA9IHBoeXNtYXBfZGF0YS0+d2lkdGg7Ci0JaW5mby0+bWFwLnNldF92cHAgPSBwaHlzbWFwX2RhdGEtPnNldF92cHA7Ci0KLQlpbmZvLT5tYXAudmlydCA9IGlvcmVtYXAoaW5mby0+bWFwLnBoeXMsIGluZm8tPm1hcC5zaXplKTsKLQlpZiAoaW5mby0+bWFwLnZpcnQgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZkZXYtPmRldiwgIkZhaWxlZCB0byBpb3JlbWFwIGZsYXNoIHJlZ2lvblxuIik7Ci0JCWVyciA9IEVJTzsKLQkJZ290byBlcnJfb3V0OwotCX0KLQotCXNpbXBsZV9tYXBfaW5pdCgmaW5mby0+bWFwKTsKLQotCXByb2JlX3R5cGUgPSByb21fcHJvYmVfdHlwZXM7Ci0JZm9yICg7IGluZm8tPm10ZCA9PSBOVUxMICYmICpwcm9iZV90eXBlICE9IE5VTEw7IHByb2JlX3R5cGUrKykKLQkJaW5mby0+bXRkID0gZG9fbWFwX3Byb2JlKCpwcm9iZV90eXBlLCAmaW5mby0+bWFwKTsKLQlpZiAoaW5mby0+bXRkID09IE5VTEwpIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsICJtYXBfcHJvYmUgZmFpbGVkXG4iKTsKKwlpZiAoZGV2aWNlc19mb3VuZCA9PSAxKSB7CisJCWluZm8tPmNtdGQgPSBpbmZvLT5tdGRbMF07CisJfSBlbHNlIGlmIChkZXZpY2VzX2ZvdW5kID4gMSkgeworCQkvKgorCQkgKiBXZSBkZXRlY3RlZCBtdWx0aXBsZSBkZXZpY2VzLiBDb25jYXRlbmF0ZSB0aGVtIHRvZ2V0aGVyLgorCQkgKi8KKyNpZmRlZiBDT05GSUdfTVREX0NPTkNBVAorCQlpbmZvLT5jbXRkID0gbXRkX2NvbmNhdF9jcmVhdGUoaW5mby0+bXRkLCBkZXZpY2VzX2ZvdW5kLCBkZXYtPmRldi5idXNfaWQpOworCQlpZiAoaW5mby0+Y210ZCA9PSBOVUxMKQorCQkJZXJyID0gLUVOWElPOworI2Vsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJwaHlzbWFwLWZsYXNoOiBtdWx0aXBsZSBkZXZpY2VzICIKKwkJICAgICAgICJmb3VuZCBidXQgTVREIGNvbmNhdCBzdXBwb3J0IGRpc2FibGVkLlxuIik7CiAJCWVyciA9IC1FTlhJTzsKLQkJZ290byBlcnJfb3V0OworI2VuZGlmCiAJfQotCWluZm8tPm10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXQ7CiAKICNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKLQllcnIgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGQsIHBhcnRfcHJvYmVfdHlwZXMsICZpbmZvLT5wYXJ0cywgMCk7CisJZXJyID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoaW5mby0+Y210ZCwgcGFydF9wcm9iZV90eXBlcywgJmluZm8tPnBhcnRzLCAwKTsKIAlpZiAoZXJyID4gMCkgewotCQlhZGRfbXRkX3BhcnRpdGlvbnMoaW5mby0+bXRkLCBpbmZvLT5wYXJ0cywgZXJyKTsKKwkJYWRkX210ZF9wYXJ0aXRpb25zKGluZm8tPmNtdGQsIGluZm8tPnBhcnRzLCBlcnIpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAocGh5c21hcF9kYXRhLT5ucl9wYXJ0cykgewogCQlwcmludGsoS0VSTl9OT1RJQ0UgIlVzaW5nIHBoeXNtYXAgcGFydGl0aW9uIGluZm9ybWF0aW9uXG4iKTsKLQkJYWRkX210ZF9wYXJ0aXRpb25zKGluZm8tPm10ZCwgcGh5c21hcF9kYXRhLT5wYXJ0cywKLQkJCQkJCXBoeXNtYXBfZGF0YS0+bnJfcGFydHMpOworCQlhZGRfbXRkX3BhcnRpdGlvbnMoaW5mby0+Y210ZCwgcGh5c21hcF9kYXRhLT5wYXJ0cywKKwkJCQkgICBwaHlzbWFwX2RhdGEtPm5yX3BhcnRzKTsKIAkJcmV0dXJuIDA7CiAJfQogI2VuZGlmCiAKLQlhZGRfbXRkX2RldmljZShpbmZvLT5tdGQpOworCWFkZF9tdGRfZGV2aWNlKGluZm8tPmNtdGQpOwogCXJldHVybiAwOwogCiBlcnJfb3V0OgpAQCAtMTYyLDkgKzIwMCwxMSBAQAogewogCXN0cnVjdCBwaHlzbWFwX2ZsYXNoX2luZm8gKmluZm8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCByZXQgPSAwOworCWludCBpOwogCiAJaWYgKGluZm8pCi0JCXJldCA9IGluZm8tPm10ZC0+c3VzcGVuZChpbmZvLT5tdGQpOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFU09VUkNFUzsgaSsrKQorCQkJcmV0IHw9IGluZm8tPm10ZFtpXS0+c3VzcGVuZChpbmZvLT5tdGRbaV0pOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE3MiwyNyArMjEyLDM1IEBACiBzdGF0aWMgaW50IHBoeXNtYXBfZmxhc2hfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGh5c21hcF9mbGFzaF9pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgaTsKKwogCWlmIChpbmZvKQotCQlpbmZvLT5tdGQtPnJlc3VtZShpbmZvLT5tdGQpOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFU09VUkNFUzsgaSsrKQorCQkJaW5mby0+bXRkW2ldLT5yZXN1bWUoaW5mby0+bXRkW2ldKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgcGh5c21hcF9mbGFzaF9zaHV0ZG93bihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBoeXNtYXBfZmxhc2hfaW5mbyAqaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7Ci0JaWYgKGluZm8gJiYgaW5mby0+bXRkLT5zdXNwZW5kKGluZm8tPm10ZCkgPT0gMCkKLQkJaW5mby0+bXRkLT5yZXN1bWUoaW5mby0+bXRkKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfUkVTT1VSQ0VTOyBpKyspCisJCWlmIChpbmZvICYmIGluZm8tPm10ZFtpXS0+c3VzcGVuZChpbmZvLT5tdGRbaV0pID09IDApCisJCQlpbmZvLT5tdGRbaV0tPnJlc3VtZShpbmZvLT5tdGRbaV0pOwogfQorI2Vsc2UKKyNkZWZpbmUgcGh5c21hcF9mbGFzaF9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgcGh5c21hcF9mbGFzaF9yZXN1bWUgTlVMTAorI2RlZmluZSBwaHlzbWFwX2ZsYXNoX3NodXRkb3duIE5VTEwKICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwaHlzbWFwX2ZsYXNoX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gcGh5c21hcF9mbGFzaF9wcm9iZSwKIAkucmVtb3ZlCQk9IHBoeXNtYXBfZmxhc2hfcmVtb3ZlLAotI2lmZGVmIENPTkZJR19QTQogCS5zdXNwZW5kCT0gcGh5c21hcF9mbGFzaF9zdXNwZW5kLAogCS5yZXN1bWUJCT0gcGh5c21hcF9mbGFzaF9yZXN1bWUsCiAJLnNodXRkb3duCT0gcGh5c21hcF9mbGFzaF9zaHV0ZG93biwKLSNlbmRpZgogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJwaHlzbWFwLWZsYXNoIiwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9waHlzbWFwX29mLmMgYi9kcml2ZXJzL210ZC9tYXBzL3BoeXNtYXBfb2YuYwppbmRleCBhZWVkOWVhLi40OWFjZDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL3BoeXNtYXBfb2YuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3BoeXNtYXBfb2YuYwpAQCAtODAsNjQgKzgwLDYgQEAKIAogCXJldHVybiBucl9wYXJ0czsKIH0KLQotc3RhdGljIGludCBfX2RldmluaXQgcGFyc2VfcGFydGl0aW9ucyhzdHJ1Y3Qgb2ZfZmxhc2ggKmluZm8sCi0JCQkJICAgICAgc3RydWN0IG9mX2RldmljZSAqZGV2KQotewotCWNvbnN0IGNoYXIgKnBhcnRuYW1lOwotCXN0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2JlX3R5cGVzW10KLQkJPSB7ICJjbWRsaW5lcGFydCIsICJSZWRCb290IiwgTlVMTCB9OwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBkZXYtPm5vZGUsICpwcDsKLQlpbnQgbnJfcGFydHMsIGk7Ci0KLQkvKiBGaXJzdCBsb29rIGZvciBSZWRCb290IHRhYmxlIG9yIHBhcnRpdGlvbnMgb24gdGhlIGNvbW1hbmQKLQkgKiBsaW5lLCB0aGVzZSB0YWtlIHByZWNlZGVuY2Ugb3ZlciBkZXZpY2UgdHJlZSBpbmZvcm1hdGlvbiAqLwotCW5yX3BhcnRzID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoaW5mby0+bXRkLCBwYXJ0X3Byb2JlX3R5cGVzLAotCQkJCQkmaW5mby0+cGFydHMsIDApOwotCWlmIChucl9wYXJ0cyA+IDApIHsKLQkJYWRkX210ZF9wYXJ0aXRpb25zKGluZm8tPm10ZCwgaW5mby0+cGFydHMsIG5yX3BhcnRzKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogRmlyc3QgY291bnQgdGhlIHN1Ym5vZGVzICovCi0JbnJfcGFydHMgPSAwOwotCWZvciAocHAgPSBkcC0+Y2hpbGQ7IHBwOyBwcCA9IHBwLT5zaWJsaW5nKQotCQlucl9wYXJ0cysrOwotCi0JaWYgKG5yX3BhcnRzID09IDApCi0JCXJldHVybiBwYXJzZV9vYnNvbGV0ZV9wYXJ0aXRpb25zKGRldiwgaW5mbywgZHApOwotCi0JaW5mby0+cGFydHMgPSBremFsbG9jKG5yX3BhcnRzICogc2l6ZW9mKCppbmZvLT5wYXJ0cyksCi0JCQkgICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIWluZm8tPnBhcnRzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZvciAocHAgPSBkcC0+Y2hpbGQsIGkgPSAwOyBwcDsgcHAgPSBwcC0+c2libGluZywgaSsrKSB7Ci0JCWNvbnN0IHUzMiAqcmVnOwotCQlpbnQgbGVuOwotCi0JCXJlZyA9IG9mX2dldF9wcm9wZXJ0eShwcCwgInJlZyIsICZsZW4pOwotCQlpZiAoIXJlZyB8fCAobGVuICE9IDIqc2l6ZW9mKHUzMikpKSB7Ci0JCQlkZXZfZXJyKCZkZXYtPmRldiwgIkludmFsaWQgJ3JlZycgb24gJXNcbiIsCi0JCQkJZHAtPmZ1bGxfbmFtZSk7Ci0JCQlrZnJlZShpbmZvLT5wYXJ0cyk7Ci0JCQlpbmZvLT5wYXJ0cyA9IE5VTEw7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlpbmZvLT5wYXJ0c1tpXS5vZmZzZXQgPSByZWdbMF07Ci0JCWluZm8tPnBhcnRzW2ldLnNpemUgPSByZWdbMV07Ci0KLQkJcGFydG5hbWUgPSBvZl9nZXRfcHJvcGVydHkocHAsICJsYWJlbCIsICZsZW4pOwotCQlpZiAoIXBhcnRuYW1lKQotCQkJcGFydG5hbWUgPSBvZl9nZXRfcHJvcGVydHkocHAsICJuYW1lIiwgJmxlbik7Ci0JCWluZm8tPnBhcnRzW2ldLm5hbWUgPSAoY2hhciAqKXBhcnRuYW1lOwotCi0JCWlmIChvZl9nZXRfcHJvcGVydHkocHAsICJyZWFkLW9ubHkiLCAmbGVuKSkKLQkJCWluZm8tPnBhcnRzW2ldLm1hc2tfZmxhZ3MgPSBNVERfV1JJVEVBQkxFOwotCX0KLQotCXJldHVybiBucl9wYXJ0czsKLX0KICNlbHNlIC8qIE1URF9QQVJUSVRJT05TICovCiAjZGVmaW5lCU9GX0ZMQVNIX1BBUlRTKGluZm8pCQkoMCkKICNkZWZpbmUgcGFyc2VfcGFydGl0aW9ucyhpbmZvLCBkZXYpCSgwKQpAQCAtMjEyLDYgKzE1NCwxMCBAQAogc3RhdGljIGludCBfX2RldmluaXQgb2ZfZmxhc2hfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqZGV2LAogCQkJCSAgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKKyNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKKwlzdGF0aWMgY29uc3QgY2hhciAqcGFydF9wcm9iZV90eXBlc1tdCisJCT0geyAiY21kbGluZXBhcnQiLCAiUmVkQm9vdCIsIE5VTEwgfTsKKyNlbmRpZgogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBkZXYtPm5vZGU7CiAJc3RydWN0IHJlc291cmNlIHJlczsKIAlzdHJ1Y3Qgb2ZfZmxhc2ggKmluZm87CkBAIC0yNzQsMTMgKzIyMCwzMyBAQAogCX0KIAlpbmZvLT5tdGQtPm93bmVyID0gVEhJU19NT0RVTEU7CiAKLQllcnIgPSBwYXJzZV9wYXJ0aXRpb25zKGluZm8sIGRldik7CisjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCisJLyogRmlyc3QgbG9vayBmb3IgUmVkQm9vdCB0YWJsZSBvciBwYXJ0aXRpb25zIG9uIHRoZSBjb21tYW5kCisJICogbGluZSwgdGhlc2UgdGFrZSBwcmVjZWRlbmNlIG92ZXIgZGV2aWNlIHRyZWUgaW5mb3JtYXRpb24gKi8KKwllcnIgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGQsIHBhcnRfcHJvYmVfdHlwZXMsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8tPnBhcnRzLCAwKTsKIAlpZiAoZXJyIDwgMCkKLQkJZ290byBlcnJfb3V0OworCQlyZXR1cm4gZXJyOworCisjaWZkZWYgQ09ORklHX01URF9PRl9QQVJUUworCWlmIChlcnIgPT0gMCkgeworCQllcnIgPSBvZl9tdGRfcGFyc2VfcGFydGl0aW9ucygmZGV2LT5kZXYsIGluZm8tPm10ZCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHAsICZpbmZvLT5wYXJ0cyk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisjZW5kaWYKKworCWlmIChlcnIgPT0gMCkgeworCQllcnIgPSBwYXJzZV9vYnNvbGV0ZV9wYXJ0aXRpb25zKGRldiwgaW5mbywgZHApOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQogCiAJaWYgKGVyciA+IDApCi0JCWFkZF9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGQsIE9GX0ZMQVNIX1BBUlRTKGluZm8pLCBlcnIpOworCQlhZGRfbXRkX3BhcnRpdGlvbnMoaW5mby0+bXRkLCBpbmZvLT5wYXJ0cywgZXJyKTsKIAllbHNlCisjZW5kaWYKIAkJYWRkX210ZF9kZXZpY2UoaW5mby0+bXRkKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9wbmMyMDAwLmMgYi9kcml2ZXJzL210ZC9tYXBzL3BuYzIwMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdlMTZjMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL3BuYzIwMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKglwbmMyMDAwLmMgLSBtYXBwZXIgZm9yIFBob3Ryb24gUE5DLTIwMDAgYm9hcmQuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwIENyb3NzbmV0IENvLiA8aW5mb0Bjcm9zc25ldC5jby5qcD4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgR1BMCi0gKgotICogJElkOiBwbmMyMDAwLmMsdiAxLjE4IDIwMDUvMTEvMDcgMTE6MTQ6MjggZ2xlaXhuZXIgRXhwICQKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+Ci0KLQotI2RlZmluZSBXSU5ET1dfQUREUiAweGJmMDAwMDAwCi0jZGVmaW5lIFdJTkRPV19TSVpFIDB4MDA0MDAwMDAKLQotLyoKLSAqIE1BUCBEUklWRVIgU1RVRkYKLSAqLwotCi0KLXN0YXRpYyBzdHJ1Y3QgbWFwX2luZm8gcG5jX21hcCA9IHsKLQkubmFtZSA9ICJQTkMtMjAwMCIsCi0JLnNpemUgPSBXSU5ET1dfU0laRSwKLQkuYmFua3dpZHRoID0gNCwKLQkucGh5cyA9IDB4RkZGRkZGRkYsCi0JLnZpcnQgPSAodm9pZCBfX2lvbWVtICopV0lORE9XX0FERFIsCi19OwotCi0KLS8qCi0gKiBNVEQgJ1BBUlRJVElPTklORycgU1RVRkYKLSAqLwotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHBuY19wYXJ0aXRpb25zWzNdID0gewotCXsKLQkJLm5hbWUgPSAiUE5DLTIwMDAgYm9vdCBmaXJtd2FyZSIsCi0JCS5zaXplID0gMHgyMDAwMCwKLQkJLm9mZnNldCA9IDAKLQl9LAotCXsKLQkJLm5hbWUgPSAiUE5DLTIwMDAga2VybmVsIiwKLQkJLnNpemUgPSAweDFhMDAwMCwKLQkJLm9mZnNldCA9IDB4MjAwMDAKLQl9LAotCXsKLQkJLm5hbWUgPSAiUE5DLTIwMDAgZmlsZXN5c3RlbSIsCi0JCS5zaXplID0gMHgyNDAwMDAsCi0JCS5vZmZzZXQgPSAweDFjMDAwMAotCX0KLX07Ci0KLS8qCi0gKiBUaGlzIGlzIHRoZSBtYXN0ZXIgTVREIGRldmljZSBmb3Igd2hpY2ggYWxsIHRoZSBvdGhlcnMgYXJlIGp1c3QKLSAqIGF1dG8tcmVsb2NhdGluZyBhbGlhc2VzLgotICovCi1zdGF0aWMgc3RydWN0IG10ZF9pbmZvICpteW10ZDsKLQotc3RhdGljIGludCBfX2luaXQgaW5pdF9wbmMyMDAwKHZvaWQpCi17Ci0JcHJpbnRrKEtFUk5fTk9USUNFICJQaG90cm9uIFBOQy0yMDAwIGZsYXNoIG1hcHBpbmc6ICV4IGF0ICV4XG4iLCBXSU5ET1dfU0laRSwgV0lORE9XX0FERFIpOwotCi0Jc2ltcGxlX21hcF9pbml0KCZwbmNfbWFwKTsKLQotCW15bXRkID0gZG9fbWFwX3Byb2JlKCJjZmlfcHJvYmUiLCAmcG5jX21hcCk7Ci0JaWYgKG15bXRkKSB7Ci0JCW15bXRkLT5vd25lciA9IFRISVNfTU9EVUxFOwotCQlyZXR1cm4gYWRkX210ZF9wYXJ0aXRpb25zKG15bXRkLCBwbmNfcGFydGl0aW9ucywgMyk7Ci0JfQotCi0JcmV0dXJuIC1FTlhJTzsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfcG5jMjAwMCh2b2lkKQotewotCWlmIChteW10ZCkgewotCQlkZWxfbXRkX3BhcnRpdGlvbnMobXltdGQpOwotCQltYXBfZGVzdHJveShteW10ZCk7Ci0JfQotfQotCi1tb2R1bGVfaW5pdChpbml0X3BuYzIwMDApOwotbW9kdWxlX2V4aXQoY2xlYW51cF9wbmMyMDAwKTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiQ3Jvc3NuZXQgQ28uIDxpbmZvQGNyb3NzbmV0LmNvLmpwPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJNVEQgbWFwIGRyaXZlciBmb3IgUGhvdHJvbiBQTkMtMjAwMCBib2FyZCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9zY2IyX2ZsYXNoLmMgYi9kcml2ZXJzL210ZC9tYXBzL3NjYjJfZmxhc2guYwppbmRleCBkY2ZiODU4Li4wZmM1NTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL3NjYjJfZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3NjYjJfZmxhc2guYwpAQCAtNzksNyArNzksNyBAQAogCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpID0gbWFwLT5mbGRydl9wcml2OwogCiAJLyogYmFyZiBpZiB0aGlzIGRvZXNuJ3QgbG9vayByaWdodCAqLwotCWlmIChjZmktPmNmaXEtPkludGVyZmFjZURlc2MgIT0gMSkgeworCWlmIChjZmktPmNmaXEtPkludGVyZmFjZURlc2MgIT0gQ0ZJX0lOVEVSRkFDRV9YMTZfQVNZTkMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIE1PRE5BTUUgIjogdW5zdXBwb3J0ZWQgSW50ZXJmYWNlRGVzYzogJSN4XG4iLAogCQkgICAgY2ZpLT5jZmlxLT5JbnRlcmZhY2VEZXNjKTsKIAkJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbXRkX2Jsa2RldnMuYyBiL2RyaXZlcnMvbXRkL210ZF9ibGtkZXZzLmMKaW5kZXggNzRkOWQzMC4uODM5ZWVkODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL210ZF9ibGtkZXZzLmMKKysrIGIvZHJpdmVycy9tdGQvbXRkX2Jsa2RldnMuYwpAQCAtMjQ4LDkgKzI0OCw5IEBACiAJCXJldHVybiAtRUJVU1k7CiAJfQogCi0JbXV0ZXhfaW5pdCgmbmV3LT5sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZuZXctPmxpc3QsICZ0ci0+ZGV2cyk7CiAgYWRkZWQ6CisJbXV0ZXhfaW5pdCgmbmV3LT5sb2NrKTsKIAlpZiAoIXRyLT53cml0ZXNlY3QpCiAJCW5ldy0+cmVhZG9ubHkgPSAxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tdGRjaGFyLmMgYi9kcml2ZXJzL210ZC9tdGRjaGFyLmMKaW5kZXggYTBjZWU4Ni4uNWQzYWM1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkY2hhci5jCisrKyBiL2RyaXZlcnMvbXRkL210ZGNoYXIuYwpAQCAtNDgxLDYgKzQ4MSw3IEBACiAJewogCQlzdHJ1Y3QgbXRkX29vYl9idWYgYnVmOwogCQlzdHJ1Y3QgbXRkX29vYl9vcHMgb3BzOworCSAgICAgICAgdWludDMyX3QgcmV0bGVuOwogCiAJCWlmKCEoZmlsZS0+Zl9tb2RlICYgMikpCiAJCQlyZXR1cm4gLUVQRVJNOwpAQCAtNTIwLDggKzUyMSwxMSBAQAogCQlidWYuc3RhcnQgJj0gfihtdGQtPm9vYnNpemUgLSAxKTsKIAkJcmV0ID0gbXRkLT53cml0ZV9vb2IobXRkLCBidWYuc3RhcnQsICZvcHMpOwogCi0JCWlmIChjb3B5X3RvX3VzZXIoYXJncCArIHNpemVvZih1aW50MzJfdCksICZvcHMub29icmV0bGVuLAotCQkJCSBzaXplb2YodWludDMyX3QpKSkKKwkJaWYgKG9wcy5vb2JyZXRsZW4gPiAweEZGRkZGRkZGVSkKKwkJCXJldCA9IC1FT1ZFUkZMT1c7CisJCXJldGxlbiA9IG9wcy5vb2JyZXRsZW47CisJCWlmIChjb3B5X3RvX3VzZXIoJigoc3RydWN0IG10ZF9vb2JfYnVmICopYXJncCktPmxlbmd0aCwKKwkJCQkgJnJldGxlbiwgc2l6ZW9mKGJ1Zi5sZW5ndGgpKSkKIAkJCXJldCA9IC1FRkFVTFQ7CiAKIAkJa2ZyZWUob3BzLm9vYmJ1Zik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tdGRjb3JlLmMgYi9kcml2ZXJzL210ZC9tdGRjb3JlLmMKaW5kZXggNmMyNjQ1ZS4uZjdlNzg5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkY29yZS5jCisrKyBiL2RyaXZlcnMvbXRkL210ZGNvcmUuYwpAQCAtNjEsNyArNjEsNyBAQAogCiAJCQkvKiBTb21lIGNoaXBzIGFsd2F5cyBwb3dlciB1cCBsb2NrZWQuIFVubG9jayB0aGVtIG5vdyAqLwogCQkJaWYgKChtdGQtPmZsYWdzICYgTVREX1dSSVRFQUJMRSkKLQkJCSAgICAmJiAobXRkLT5mbGFncyAmIE1URF9TVFVQSURfTE9DSykgJiYgbXRkLT51bmxvY2spIHsKKwkJCSAgICAmJiAobXRkLT5mbGFncyAmIE1URF9QT1dFUlVQX0xPQ0spICYmIG10ZC0+dW5sb2NrKSB7CiAJCQkJaWYgKG10ZC0+dW5sb2NrKG10ZCwgMCwgbXRkLT5zaXplKSkKIAkJCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJCQkgICAgICAgIiVzOiB1bmxvY2sgZmFpbGVkLCAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tdGRvb3BzLmMgYi9kcml2ZXJzL210ZC9tdGRvb3BzLmMKaW5kZXggZjhhZjYyNy4uZDNjZjA1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkb29wcy5jCisrKyBiL2RyaXZlcnMvbXRkL210ZG9vcHMuYwpAQCAtMjgsMTkgKzI4LDI2IEBACiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KIAogI2RlZmluZSBPT1BTX1BBR0VfU0laRSA0MDk2CiAKLXN0YXRpYyBzdHJ1Y3QgbXRkb29wc19jb250ZXh0IHsKK3N0cnVjdCBtdGRvb3BzX2NvbnRleHQgewogCWludCBtdGRfaW5kZXg7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcmtfZXJhc2U7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcmtfd3JpdGU7CiAJc3RydWN0IG10ZF9pbmZvICptdGQ7CiAJaW50IG9vcHNfcGFnZXM7CiAJaW50IG5leHRwYWdlOwogCWludCBuZXh0Y291bnQ7CiAKIAl2b2lkICpvb3BzX2J1ZjsKKworCS8qIHdyaXRlY291bnQgYW5kIGRpc2FibGluZyByZWFkeSBhcmUgc3BpbiBsb2NrIHByb3RlY3RlZCAqLworCXNwaW5sb2NrX3Qgd3JpdGVjb3VudF9sb2NrOwogCWludCByZWFkeTsKIAlpbnQgd3JpdGVjb3VudDsKIH0gb29wc19jeHQ7CkBAIC02MiwxMCArNjksNyBAQAogCWVyYXNlLm10ZCA9IG10ZDsKIAllcmFzZS5jYWxsYmFjayA9IG10ZG9vcHNfZXJhc2VfY2FsbGJhY2s7CiAJZXJhc2UuYWRkciA9IG9mZnNldDsKLQlpZiAobXRkLT5lcmFzZXNpemUgPCBPT1BTX1BBR0VfU0laRSkKLQkJZXJhc2UubGVuID0gT09QU19QQUdFX1NJWkU7Ci0JZWxzZQotCQllcmFzZS5sZW4gPSBtdGQtPmVyYXNlc2l6ZTsKKwllcmFzZS5sZW4gPSBtdGQtPmVyYXNlc2l6ZTsKIAllcmFzZS5wcml2ID0gKHVfbG9uZykmd2FpdF9xOwogCiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKQEAgLTg3LDcgKzkxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtdGRvb3BzX2luY19jb3VudGVyKHN0cnVjdCBtdGRvb3BzX2NvbnRleHQgKmN4dCkKK3N0YXRpYyB2b2lkIG10ZG9vcHNfaW5jX2NvdW50ZXIoc3RydWN0IG10ZG9vcHNfY29udGV4dCAqY3h0KQogewogCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gY3h0LT5tdGQ7CiAJc2l6ZV90IHJldGxlbjsKQEAgLTEwMywyNSArMTA3LDMwIEBACiAKIAlyZXQgPSBtdGQtPnJlYWQobXRkLCBjeHQtPm5leHRwYWdlICogT09QU19QQUdFX1NJWkUsIDQsCiAJCQkmcmV0bGVuLCAodV9jaGFyICopICZjb3VudCk7Ci0JaWYgKChyZXRsZW4gIT0gNCkgfHwgKHJldCA8IDApKSB7CisJaWYgKChyZXRsZW4gIT0gNCkgfHwgKChyZXQgPCAwKSAmJiAocmV0ICE9IC1FVUNMRUFOKSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJtdGRvb3BzOiBSZWFkIGZhaWx1cmUgYXQgJWQgKCV0ZCBvZiA0IHJlYWQpIgogCQkJCSIsIGVyciAlZC5cbiIsIGN4dC0+bmV4dHBhZ2UgKiBPT1BTX1BBR0VfU0laRSwKIAkJCQlyZXRsZW4sIHJldCk7Ci0JCXJldHVybiAxOworCQlzY2hlZHVsZV93b3JrKCZjeHQtPndvcmtfZXJhc2UpOworCQlyZXR1cm47CiAJfQogCiAJLyogU2VlIGlmIHdlIG5lZWQgdG8gZXJhc2UgdGhlIG5leHQgYmxvY2sgKi8KLQlpZiAoY291bnQgIT0gMHhmZmZmZmZmZikKLQkJcmV0dXJuIDE7CisJaWYgKGNvdW50ICE9IDB4ZmZmZmZmZmYpIHsKKwkJc2NoZWR1bGVfd29yaygmY3h0LT53b3JrX2VyYXNlKTsKKwkJcmV0dXJuOworCX0KIAogCXByaW50ayhLRVJOX0RFQlVHICJtdGRvb3BzOiBSZWFkeSAlZCwgJWQgKG5vIGVyYXNlKVxuIiwKIAkJCWN4dC0+bmV4dHBhZ2UsIGN4dC0+bmV4dGNvdW50KTsKIAljeHQtPnJlYWR5ID0gMTsKLQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbXRkb29wc19wcmVwYXJlKHN0cnVjdCBtdGRvb3BzX2NvbnRleHQgKmN4dCkKKy8qIFNjaGVkdWxlZCB3b3JrIC0gd2hlbiB3ZSBjYW4ndCBwcm9jZWVkIHdpdGhvdXQgZXJhc2luZyBhIGJsb2NrICovCitzdGF0aWMgdm9pZCBtdGRvb3BzX3dvcmtmdW5jX2VyYXNlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKKwlzdHJ1Y3QgbXRkb29wc19jb250ZXh0ICpjeHQgPQorCQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBtdGRvb3BzX2NvbnRleHQsIHdvcmtfZXJhc2UpOwogCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gY3h0LT5tdGQ7CiAJaW50IGkgPSAwLCBqLCByZXQsIG1vZDsKIApAQCAtMTM2LDggKzE0NSwxNCBAQAogCQkJY3h0LT5uZXh0cGFnZSA9IDA7CiAJfQogCi0Jd2hpbGUgKG10ZC0+YmxvY2tfaXNiYWQgJiYKLQkJCW10ZC0+YmxvY2tfaXNiYWQobXRkLCBjeHQtPm5leHRwYWdlICogT09QU19QQUdFX1NJWkUpKSB7CisJd2hpbGUgKG10ZC0+YmxvY2tfaXNiYWQpIHsKKwkJcmV0ID0gbXRkLT5ibG9ja19pc2JhZChtdGQsIGN4dC0+bmV4dHBhZ2UgKiBPT1BTX1BBR0VfU0laRSk7CisJCWlmICghcmV0KQorCQkJYnJlYWs7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIm10ZG9vcHM6IGJsb2NrX2lzYmFkIGZhaWxlZCwgYWJvcnRpbmcuXG4iKTsKKwkJCXJldHVybjsKKwkJfQogYmFkYmxvY2s6CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIm10ZG9vcHM6IEJhZCBibG9jayBhdCAlMDh4XG4iLAogCQkJCWN4dC0+bmV4dHBhZ2UgKiBPT1BTX1BBR0VfU0laRSk7CkBAIC0xNTQsMzQgKzE2OSw3MiBAQAogCWZvciAoaiA9IDAsIHJldCA9IC0xOyAoaiA8IDMpICYmIChyZXQgPCAwKTsgaisrKQogCQlyZXQgPSBtdGRvb3BzX2VyYXNlX2Jsb2NrKG10ZCwgY3h0LT5uZXh0cGFnZSAqIE9PUFNfUEFHRV9TSVpFKTsKIAotCWlmIChyZXQgPCAwKSB7Ci0JCWlmIChtdGQtPmJsb2NrX21hcmtiYWQpCi0JCQltdGQtPmJsb2NrX21hcmtiYWQobXRkLCBjeHQtPm5leHRwYWdlICogT09QU19QQUdFX1NJWkUpOwotCQlnb3RvIGJhZGJsb2NrOworCWlmIChyZXQgPj0gMCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAibXRkb29wczogUmVhZHkgJWQsICVkIFxuIiwgY3h0LT5uZXh0cGFnZSwgY3h0LT5uZXh0Y291bnQpOworCQljeHQtPnJlYWR5ID0gMTsKKwkJcmV0dXJuOwogCX0KIAotCXByaW50ayhLRVJOX0RFQlVHICJtdGRvb3BzOiBSZWFkeSAlZCwgJWQgXG4iLCBjeHQtPm5leHRwYWdlLCBjeHQtPm5leHRjb3VudCk7Ci0KLQljeHQtPnJlYWR5ID0gMTsKKwlpZiAobXRkLT5ibG9ja19tYXJrYmFkICYmIChyZXQgPT0gLUVJTykpIHsKKwkJcmV0ID0gbXRkLT5ibG9ja19tYXJrYmFkKG10ZCwgY3h0LT5uZXh0cGFnZSAqIE9PUFNfUEFHRV9TSVpFKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAibXRkb29wczogYmxvY2tfbWFya2JhZCBmYWlsZWQsIGFib3J0aW5nLlxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisJZ290byBiYWRibG9jazsKIH0KIAotc3RhdGljIHZvaWQgbXRkb29wc193b3JrZnVuYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IG10ZG9vcHNfY29udGV4dCAqY3h0ID0KLQkJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbXRkb29wc19jb250ZXh0LCB3b3JrKTsKLQotCW10ZG9vcHNfcHJlcGFyZShjeHQpOwotfQotCi1zdGF0aWMgaW50IGZpbmRfbmV4dF9wb3NpdGlvbihzdHJ1Y3QgbXRkb29wc19jb250ZXh0ICpjeHQpCitzdGF0aWMgdm9pZCBtdGRvb3BzX3dyaXRlKHN0cnVjdCBtdGRvb3BzX2NvbnRleHQgKmN4dCwgaW50IHBhbmljKQogewogCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gY3h0LT5tdGQ7Ci0JaW50IHBhZ2UsIG1heHBvcyA9IDA7CisJc2l6ZV90IHJldGxlbjsKKwlpbnQgcmV0OworCisJaWYgKGN4dC0+d3JpdGVjb3VudCA8IE9PUFNfUEFHRV9TSVpFKQorCQltZW1zZXQoY3h0LT5vb3BzX2J1ZiArIGN4dC0+d3JpdGVjb3VudCwgMHhmZiwKKwkJCQkJT09QU19QQUdFX1NJWkUgLSBjeHQtPndyaXRlY291bnQpOworCisJaWYgKHBhbmljKQorCQlyZXQgPSBtdGQtPnBhbmljX3dyaXRlKG10ZCwgY3h0LT5uZXh0cGFnZSAqIE9PUFNfUEFHRV9TSVpFLAorCQkJCQlPT1BTX1BBR0VfU0laRSwgJnJldGxlbiwgY3h0LT5vb3BzX2J1Zik7CisJZWxzZQorCQlyZXQgPSBtdGQtPndyaXRlKG10ZCwgY3h0LT5uZXh0cGFnZSAqIE9PUFNfUEFHRV9TSVpFLAorCQkJCQlPT1BTX1BBR0VfU0laRSwgJnJldGxlbiwgY3h0LT5vb3BzX2J1Zik7CisKKwljeHQtPndyaXRlY291bnQgPSAwOworCisJaWYgKChyZXRsZW4gIT0gT09QU19QQUdFX1NJWkUpIHx8IChyZXQgPCAwKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJtdGRvb3BzOiBXcml0ZSBmYWlsdXJlIGF0ICVkICgldGQgb2YgJWQgd3JpdHRlbiksIGVyciAlZC5cbiIsCisJCQljeHQtPm5leHRwYWdlICogT09QU19QQUdFX1NJWkUsIHJldGxlbiwJT09QU19QQUdFX1NJWkUsIHJldCk7CisKKwltdGRvb3BzX2luY19jb3VudGVyKGN4dCk7Cit9CisKKworc3RhdGljIHZvaWQgbXRkb29wc193b3JrZnVuY193cml0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IG10ZG9vcHNfY29udGV4dCAqY3h0ID0KKwkJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbXRkb29wc19jb250ZXh0LCB3b3JrX3dyaXRlKTsKKworCW10ZG9vcHNfd3JpdGUoY3h0LCAwKTsKK30JCQkJCQorCitzdGF0aWMgdm9pZCBmaW5kX25leHRfcG9zaXRpb24oc3RydWN0IG10ZG9vcHNfY29udGV4dCAqY3h0KQoreworCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gY3h0LT5tdGQ7CisJaW50IHJldCwgcGFnZSwgbWF4cG9zID0gMDsKIAl1MzIgY291bnQsIG1heGNvdW50ID0gMHhmZmZmZmZmZjsKIAlzaXplX3QgcmV0bGVuOwogCiAJZm9yIChwYWdlID0gMDsgcGFnZSA8IGN4dC0+b29wc19wYWdlczsgcGFnZSsrKSB7Ci0JCW10ZC0+cmVhZChtdGQsIHBhZ2UgKiBPT1BTX1BBR0VfU0laRSwgNCwgJnJldGxlbiwgKHVfY2hhciAqKSAmY291bnQpOworCQlyZXQgPSBtdGQtPnJlYWQobXRkLCBwYWdlICogT09QU19QQUdFX1NJWkUsIDQsICZyZXRsZW4sICh1X2NoYXIgKikgJmNvdW50KTsKKwkJaWYgKChyZXRsZW4gIT0gNCkgfHwgKChyZXQgPCAwKSAmJiAocmV0ICE9IC1FVUNMRUFOKSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAibXRkb29wczogUmVhZCBmYWlsdXJlIGF0ICVkICgldGQgb2YgNCByZWFkKSIKKwkJCQkiLCBlcnIgJWQuXG4iLCBwYWdlICogT09QU19QQUdFX1NJWkUsIHJldGxlbiwgcmV0KTsKKwkJCWNvbnRpbnVlOworCQl9CisKIAkJaWYgKGNvdW50ID09IDB4ZmZmZmZmZmYpCiAJCQljb250aW51ZTsKIAkJaWYgKG1heGNvdW50ID09IDB4ZmZmZmZmZmYpIHsKQEAgLTIwNSwyMCArMjU4LDE5IEBACiAJCWN4dC0+cmVhZHkgPSAxOwogCQlwcmludGsoS0VSTl9ERUJVRyAibXRkb29wczogUmVhZHkgJWQsICVkIChmaXJzdCBpbml0KVxuIiwKIAkJCQljeHQtPm5leHRwYWdlLCBjeHQtPm5leHRjb3VudCk7Ci0JCXJldHVybiAwOworCQlyZXR1cm47CiAJfQogCiAJY3h0LT5uZXh0cGFnZSA9IG1heHBvczsKIAljeHQtPm5leHRjb3VudCA9IG1heGNvdW50OwogCi0JcmV0dXJuIG10ZG9vcHNfaW5jX2NvdW50ZXIoY3h0KTsKKwltdGRvb3BzX2luY19jb3VudGVyKGN4dCk7CiB9CiAKIAogc3RhdGljIHZvaWQgbXRkb29wc19ub3RpZnlfYWRkKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQogewogCXN0cnVjdCBtdGRvb3BzX2NvbnRleHQgKmN4dCA9ICZvb3BzX2N4dDsKLQlpbnQgcmV0OwogCiAJaWYgKChtdGQtPmluZGV4ICE9IGN4dC0+bXRkX2luZGV4KSB8fCBjeHQtPm10ZF9pbmRleCA8IDApCiAJCXJldHVybjsKQEAgLTIyOSwxNCArMjgxLDE4IEBACiAJCXJldHVybjsKIAl9CiAKKwlpZiAobXRkLT5lcmFzZXNpemUgPCBPT1BTX1BBR0VfU0laRSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVyYXNlYmxvY2sgc2l6ZSBvZiBNVEQgcGFydGl0aW9uICVkIHRvbyBzbWFsbFxuIiwKKwkJCQltdGQtPmluZGV4KTsKKwkJcmV0dXJuOworCX0KKwogCWN4dC0+bXRkID0gbXRkOwogCWN4dC0+b29wc19wYWdlcyA9IG10ZC0+c2l6ZSAvIE9PUFNfUEFHRV9TSVpFOwogCi0JcmV0ID0gZmluZF9uZXh0X3Bvc2l0aW9uKGN4dCk7Ci0JaWYgKHJldCA9PSAxKQotCQltdGRvb3BzX3ByZXBhcmUoY3h0KTsKKwlmaW5kX25leHRfcG9zaXRpb24oY3h0KTsKIAotCXByaW50ayhLRVJOX0RFQlVHICJtdGRvb3BzOiBBdHRhY2hlZCB0byBNVEQgZGV2aWNlICVkXG4iLCBtdGQtPmluZGV4KTsKKwlwcmludGsoS0VSTl9JTkZPICJtdGRvb3BzOiBBdHRhY2hlZCB0byBNVEQgZGV2aWNlICVkXG4iLCBtdGQtPmluZGV4KTsKIH0KIAogc3RhdGljIHZvaWQgbXRkb29wc19ub3RpZnlfcmVtb3ZlKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQpAQCAtMjU0LDMxICszMTAsMjggQEAKIHsKIAlzdHJ1Y3QgbXRkb29wc19jb250ZXh0ICpjeHQgPSAmb29wc19jeHQ7CiAJc3RydWN0IG10ZF9pbmZvICptdGQgPSBjeHQtPm10ZDsKLQlzaXplX3QgcmV0bGVuOwotCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICghY3h0LT5yZWFkeSB8fCAhbXRkKQorCWlmICghY3h0LT5yZWFkeSB8fCAhbXRkIHx8IGN4dC0+d3JpdGVjb3VudCA9PSAwKQogCQlyZXR1cm47CiAKLQlpZiAoY3h0LT53cml0ZWNvdW50ID09IDApCisJLyogCisJICogIE9uY2UgcmVhZHkgaXMgMCBhbmQgd2UndmUgaGVsZCB0aGUgbG9jayBubyBmdXJ0aGVyIHdyaXRlcyB0byB0aGUgCisJICogIGJ1ZmZlciB3aWxsIGhhcHBlbgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjeHQtPndyaXRlY291bnRfbG9jaywgZmxhZ3MpOworCWlmICghY3h0LT5yZWFkeSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjeHQtPndyaXRlY291bnRfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm47Ci0KLQlpZiAoY3h0LT53cml0ZWNvdW50IDwgT09QU19QQUdFX1NJWkUpCi0JCW1lbXNldChjeHQtPm9vcHNfYnVmICsgY3h0LT53cml0ZWNvdW50LCAweGZmLAotCQkJCQlPT1BTX1BBR0VfU0laRSAtIGN4dC0+d3JpdGVjb3VudCk7Ci0KLQlyZXQgPSBtdGQtPndyaXRlKG10ZCwgY3h0LT5uZXh0cGFnZSAqIE9PUFNfUEFHRV9TSVpFLAotCQkJCQlPT1BTX1BBR0VfU0laRSwgJnJldGxlbiwgY3h0LT5vb3BzX2J1Zik7CisJfQogCWN4dC0+cmVhZHkgPSAwOwotCWN4dC0+d3JpdGVjb3VudCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3h0LT53cml0ZWNvdW50X2xvY2ssIGZsYWdzKTsKIAotCWlmICgocmV0bGVuICE9IE9PUFNfUEFHRV9TSVpFKSB8fCAocmV0IDwgMCkpCi0JCXByaW50ayhLRVJOX0VSUiAibXRkb29wczogV3JpdGUgZmFpbHVyZSBhdCAlZCAoJXRkIG9mICVkIHdyaXR0ZW4pLCBlcnIgJWQuXG4iLAotCQkJY3h0LT5uZXh0cGFnZSAqIE9PUFNfUEFHRV9TSVpFLCByZXRsZW4sCU9PUFNfUEFHRV9TSVpFLCByZXQpOwotCi0JcmV0ID0gbXRkb29wc19pbmNfY291bnRlcihjeHQpOwotCWlmIChyZXQgPT0gMSkKLQkJc2NoZWR1bGVfd29yaygmY3h0LT53b3JrKTsKKwlpZiAobXRkLT5wYW5pY193cml0ZSAmJiBpbl9pbnRlcnJ1cHQoKSkKKwkJLyogSW50ZXJydXB0IGNvbnRleHQsIHdlJ3JlIGdvaW5nIHRvIHBhbmljIHNvIHRyeSBhbmQgbG9nICovCisJCW10ZG9vcHNfd3JpdGUoY3h0LCAxKTsKKwllbHNlCisJCXNjaGVkdWxlX3dvcmsoJmN4dC0+d29ya193cml0ZSk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0yODYsNyArMzM5LDcgQEAKIHsKIAlzdHJ1Y3QgbXRkb29wc19jb250ZXh0ICpjeHQgPSBjby0+ZGF0YTsKIAlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IGN4dC0+bXRkOwotCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoIW9vcHNfaW5fcHJvZ3Jlc3MpIHsKIAkJbXRkb29wc19jb25zb2xlX3N5bmMoKTsKQEAgLTI5Niw2ICszNDksMTMgQEAKIAlpZiAoIWN4dC0+cmVhZHkgfHwgIW10ZCkKIAkJcmV0dXJuOwogCisJLyogTG9ja2luZyBvbiB3cml0ZWNvdW50IGVuc3VyZXMgc2VxdWVudGlhbCB3cml0ZXMgdG8gdGhlIGJ1ZmZlciAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjeHQtPndyaXRlY291bnRfbG9jaywgZmxhZ3MpOworCisJLyogQ2hlY2sgcmVhZHkgc3RhdHVzIGRpZG4ndCBjaGFuZ2Ugd2hpbHN0IHdhaXRpbmcgZm9yIHRoZSBsb2NrICovCisJaWYgKCFjeHQtPnJlYWR5KQorCQlyZXR1cm47CisKIAlpZiAoY3h0LT53cml0ZWNvdW50ID09IDApIHsKIAkJdTMyICpzdGFtcCA9IGN4dC0+b29wc19idWY7CiAJCSpzdGFtcCA9IGN4dC0+bmV4dGNvdW50OwpAQCAtMzA1LDEwICszNjUsMTMgQEAKIAlpZiAoKGNvdW50ICsgY3h0LT53cml0ZWNvdW50KSA+IE9PUFNfUEFHRV9TSVpFKQogCQljb3VudCA9IE9PUFNfUEFHRV9TSVpFIC0gY3h0LT53cml0ZWNvdW50OwogCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHMrKykKLQkJKigoY2hhciAqKShjeHQtPm9vcHNfYnVmKSArIGN4dC0+d3JpdGVjb3VudCArIGkpID0gKnM7CisJbWVtY3B5KGN4dC0+b29wc19idWYgKyBjeHQtPndyaXRlY291bnQsIHMsIGNvdW50KTsKKwljeHQtPndyaXRlY291bnQgKz0gY291bnQ7CiAKLQljeHQtPndyaXRlY291bnQgPSBjeHQtPndyaXRlY291bnQgKyBjb3VudDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjeHQtPndyaXRlY291bnRfbG9jaywgZmxhZ3MpOworCisJaWYgKGN4dC0+d3JpdGVjb3VudCA9PSBPT1BTX1BBR0VfU0laRSkKKwkJbXRkb29wc19jb25zb2xlX3N5bmMoKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgbXRkb29wc19jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjbywgY2hhciAqb3B0aW9ucykKQEAgLTMzNCw3ICszOTcsNiBAQAogCS53cml0ZQkJPSBtdGRvb3BzX2NvbnNvbGVfd3JpdGUsCiAJLnNldHVwCQk9IG10ZG9vcHNfY29uc29sZV9zZXR1cCwKIAkudW5ibGFuawk9IG10ZG9vcHNfY29uc29sZV9zeW5jLAotCS5mbGFncwkJPSBDT05fUFJJTlRCVUZGRVIsCiAJLmluZGV4CQk9IC0xLAogCS5kYXRhCQk9ICZvb3BzX2N4dCwKIH07CkBAIC0zNDcsMTEgKzQwOSwxMiBAQAogCWN4dC0+b29wc19idWYgPSB2bWFsbG9jKE9PUFNfUEFHRV9TSVpFKTsKIAogCWlmICghY3h0LT5vb3BzX2J1ZikgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBhbGxvY2F0ZSBvb3BzIGJ1ZmZlciB3b3Jrc3BhY2VcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBhbGxvY2F0ZSBtdGRvb3BzIGJ1ZmZlciB3b3Jrc3BhY2VcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlJTklUX1dPUksoJmN4dC0+d29yaywgbXRkb29wc193b3JrZnVuYyk7CisJSU5JVF9XT1JLKCZjeHQtPndvcmtfZXJhc2UsIG10ZG9vcHNfd29ya2Z1bmNfZXJhc2UpOworCUlOSVRfV09SSygmY3h0LT53b3JrX3dyaXRlLCBtdGRvb3BzX3dvcmtmdW5jX3dyaXRlKTsKIAogCXJlZ2lzdGVyX2NvbnNvbGUoJm10ZG9vcHNfY29uc29sZSk7CiAJcmVnaXN0ZXJfbXRkX3VzZXIoJm10ZG9vcHNfbm90aWZpZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbXRkcGFydC5jIGIvZHJpdmVycy9tdGQvbXRkcGFydC5jCmluZGV4IDYxNzRhOTcuLmM2NjkwMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL210ZHBhcnQuYworKysgYi9kcml2ZXJzL210ZC9tdGRwYXJ0LmMKQEAgLTE1MSw2ICsxNTEsMjAgQEAKIAkJCQkgICAgbGVuLCByZXRsZW4sIGJ1Zik7CiB9CiAKK3N0YXRpYyBpbnQgcGFydF9wYW5pY193cml0ZSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCB0bywgc2l6ZV90IGxlbiwKKwkJCXNpemVfdCAqcmV0bGVuLCBjb25zdCB1X2NoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbXRkX3BhcnQgKnBhcnQgPSBQQVJUKG10ZCk7CisJaWYgKCEobXRkLT5mbGFncyAmIE1URF9XUklURUFCTEUpKQorCQlyZXR1cm4gLUVST0ZTOworCWlmICh0byA+PSBtdGQtPnNpemUpCisJCWxlbiA9IDA7CisJZWxzZSBpZiAodG8gKyBsZW4gPiBtdGQtPnNpemUpCisJCWxlbiA9IG10ZC0+c2l6ZSAtIHRvOworCXJldHVybiBwYXJ0LT5tYXN0ZXItPnBhbmljX3dyaXRlIChwYXJ0LT5tYXN0ZXIsIHRvICsgcGFydC0+b2Zmc2V0LAorCQkJCSAgICBsZW4sIHJldGxlbiwgYnVmKTsKK30KKwogc3RhdGljIGludCBwYXJ0X3dyaXRlX29vYihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHRvLAogCQkJIHN0cnVjdCBtdGRfb29iX29wcyAqb3BzKQogewpAQCAtMzUyLDYgKzM2Niw5IEBACiAJCXNsYXZlLT5tdGQucmVhZCA9IHBhcnRfcmVhZDsKIAkJc2xhdmUtPm10ZC53cml0ZSA9IHBhcnRfd3JpdGU7CiAKKwkJaWYgKG1hc3Rlci0+cGFuaWNfd3JpdGUpCisJCQlzbGF2ZS0+bXRkLnBhbmljX3dyaXRlID0gcGFydF9wYW5pY193cml0ZTsKKwogCQlpZihtYXN0ZXItPnBvaW50ICYmIG1hc3Rlci0+dW5wb2ludCl7CiAJCQlzbGF2ZS0+bXRkLnBvaW50ID0gcGFydF9wb2ludDsKIAkJCXNsYXZlLT5tdGQudW5wb2ludCA9IHBhcnRfdW5wb2ludDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvS2NvbmZpZyBiL2RyaXZlcnMvbXRkL25hbmQvS2NvbmZpZwppbmRleCAyNDZkNDUxLi40YTNjNjc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnCkBAIC05Myw3ICs5Myw3IEBACiAKIGNvbmZpZyBNVERfTkFORF9CRjVYWAogCXRyaXN0YXRlICJCbGFja2ZpbiBvbi1jaGlwIE5BTkQgRmxhc2ggQ29udHJvbGxlciBkcml2ZXIiCi0JZGVwZW5kcyBvbiBCRjU0eCAmJiBNVERfTkFORAorCWRlcGVuZHMgb24gKEJGNTR4IHx8IEJGNTJ4KSAmJiBNVERfTkFORAogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyB0aGUgQmxhY2tmaW4gb24tY2hpcCBOQU5EIGZsYXNoIGNvbnRyb2xsZXIKIApAQCAtMjgzLDYgKzI4MywxMiBAQAogCXRyaXN0YXRlICJTdXBwb3J0IGZvciBOQU5EIEZsYXNoIG9uIENNLVgyNzAgbW9kdWxlcyIKIAlkZXBlbmRzIG9uIE1URF9OQU5EICYmIE1BQ0hfQVJNQ09SRQogCitjb25maWcgTVREX05BTkRfUEFTRU1JCisJdHJpc3RhdGUgIk5BTkQgc3VwcG9ydCBmb3IgUEEgU2VtaSBQV1JmaWNpZW50IgorCWRlcGVuZHMgb24gTVREX05BTkQgJiYgUFBDX1BBU0VNSQorCWhlbHAKKwkgIEVuYWJsZXMgc3VwcG9ydCBmb3IgTkFORCBGbGFzaCBpbnRlcmZhY2Ugb24gUEEgU2VtaSBQV1JmaWNpZW50CisJICBiYXNlZCBib2FyZHMKIAogY29uZmlnIE1URF9OQU5EX05BTkRTSU0KIAl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgTkFORCBGbGFzaCBTaW11bGF0b3IiCkBAIC0zMDYsNCArMzEyLDIyIEBACiAJICBUaGVzZSB0d28gKGFuZCBwb3NzaWJseSBvdGhlcikgQWxhdWRhLWJhc2VkIGNhcmRyZWFkZXJzIGZvcgogCSAgU21hcnRNZWRpYSBhbmQgeEQgYWxsb3cgcmF3IGZsYXNoIGFjY2Vzcy4KIAorY29uZmlnIE1URF9OQU5EX09SSU9OCisJdHJpc3RhdGUgIk5BTkQgRmxhc2ggc3VwcG9ydCBmb3IgTWFydmVsbCBPcmlvbiBTb0MiCisJZGVwZW5kcyBvbiBBUkNIX09SSU9OICYmIE1URF9OQU5ECisJaGVscAorCSAgVGhpcyBlbmFibGVzIHRoZSBOQU5EIGZsYXNoIGNvbnRyb2xsZXIgb24gT3Jpb24gbWFjaGluZXMuCisKKwkgIE5vIGJvYXJkIHNwZWNpZmljIHN1cHBvcnQgaXMgZG9uZSBieSB0aGlzIGRyaXZlciwgZWFjaCBib2FyZAorCSAgbXVzdCBhZHZlcnRpc2UgYSBwbGF0Zm9ybV9kZXZpY2UgZm9yIHRoZSBkcml2ZXIgdG8gYXR0YWNoLgorCitjb25maWcgTVREX05BTkRfRlNMX0VMQkMKKwl0cmlzdGF0ZSAiTkFORCBzdXBwb3J0IGZvciBGcmVlc2NhbGUgZUxCQyBjb250cm9sbGVycyIKKwlkZXBlbmRzIG9uIE1URF9OQU5EICYmIFBQQ19PRgorCWhlbHAKKwkgIFZhcmlvdXMgRnJlZXNjYWxlIGNoaXBzLCBpbmNsdWRpbmcgdGhlIDgzMTMsIGluY2x1ZGUgYSBOQU5EIEZsYXNoCisJICBDb250cm9sbGVyIE1vZHVsZSB3aXRoIGJ1aWx0LWluIGhhcmR3YXJlIEVDQyBjYXBhYmlsaXRpZXMuCisJICBFbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIGVuYWJsZSB5b3UgdG8gdXNlIHRoaXMgdG8gY29udHJvbAorCSAgZXh0ZXJuYWwgTkFORCBkZXZpY2VzLgorCiBlbmRpZiAjIE1URF9OQU5ECmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL01ha2VmaWxlIGIvZHJpdmVycy9tdGQvbmFuZC9NYWtlZmlsZQppbmRleCAzYWQ2YzAxLi44MGQ1NzVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvTWFrZWZpbGUKQEAgLTI5LDUgKzI5LDggQEAKIG9iai0kKENPTkZJR19NVERfTkFORF9CQVNMRVJfRVhDSVRFKQkrPSBleGNpdGVfbmFuZGZsYXNoLm8KIG9iai0kKENPTkZJR19NVERfTkFORF9QTEFURk9STSkJCSs9IHBsYXRfbmFuZC5vCiBvYmotJChDT05GSUdfTVREX0FMQVVEQSkJCSs9IGFsYXVkYS5vCitvYmotJChDT05GSUdfTVREX05BTkRfUEFTRU1JKQkJKz0gcGFzZW1pX25hbmQubworb2JqLSQoQ09ORklHX01URF9OQU5EX09SSU9OKQkJKz0gb3Jpb25fbmFuZC5vCitvYmotJChDT05GSUdfTVREX05BTkRfRlNMX0VMQkMpCQkrPSBmc2xfZWxiY19uYW5kLm8KIAogbmFuZC1vYmpzIDo9IG5hbmRfYmFzZS5vIG5hbmRfYmJ0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvYXQ5MV9uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL2F0OTFfbmFuZC5jCmluZGV4IGIyYTU2NzIuLmM5ZmIyYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvYXQ5MV9uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9hdDkxX25hbmQuYwpAQCAtMTU2LDE0ICsxNTYsMTQgQEAKIAl9CiAKICNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKLQlpZiAoaG9zdC0+Ym9hcmQtPnBhcnRpdGlvbl9pbmZvKQotCQlwYXJ0aXRpb25zID0gaG9zdC0+Ym9hcmQtPnBhcnRpdGlvbl9pbmZvKG10ZC0+c2l6ZSwgJm51bV9wYXJ0aXRpb25zKTsKICNpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMKLQllbHNlIHsKLQkJbXRkLT5uYW1lID0gImF0OTFfbmFuZCI7Ci0JCW51bV9wYXJ0aXRpb25zID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMobXRkLCBwYXJ0X3Byb2JlcywgJnBhcnRpdGlvbnMsIDApOwotCX0KKwltdGQtPm5hbWUgPSAiYXQ5MV9uYW5kIjsKKwludW1fcGFydGl0aW9ucyA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKG10ZCwgcGFydF9wcm9iZXMsCisJCQkJCSAgICAgICZwYXJ0aXRpb25zLCAwKTsKICNlbmRpZgorCWlmIChudW1fcGFydGl0aW9ucyA8PSAwICYmIGhvc3QtPmJvYXJkLT5wYXJ0aXRpb25faW5mbykKKwkJcGFydGl0aW9ucyA9IGhvc3QtPmJvYXJkLT5wYXJ0aXRpb25faW5mbyhtdGQtPnNpemUsCisJCQkJCQkJICZudW1fcGFydGl0aW9ucyk7CiAKIAlpZiAoKCFwYXJ0aXRpb25zKSB8fCAobnVtX3BhcnRpdGlvbnMgPT0gMCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJhdDkxX25hbmQ6IE5vIHBhcml0aXRpb25zIGRlZmluZWQsIG9yIHVuc3VwcG9ydGVkIGRldmljZS5cbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9iZjV4eF9uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL2JmNXh4X25hbmQuYwppbmRleCBhNTJmM2E3Li43NDcwNDJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2JmNXh4X25hbmQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2JmNXh4X25hbmQuYwpAQCAtNzQsNyArNzQsMjIgQEAKIHN0YXRpYyBpbnQgaGFyZHdhcmVfZWNjOwogI2VuZGlmCiAKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBiZmluX25mY19waW5fcmVxW10gPSB7UF9OQU5EX0NFLCBQX05BTkRfUkIsIDB9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IGJmaW5fbmZjX3Bpbl9yZXFbXSA9CisJe1BfTkFORF9DRSwKKwkgUF9OQU5EX1JCLAorCSBQX05BTkRfRDAsCisJIFBfTkFORF9EMSwKKwkgUF9OQU5EX0QyLAorCSBQX05BTkRfRDMsCisJIFBfTkFORF9ENCwKKwkgUF9OQU5EX0Q1LAorCSBQX05BTkRfRDYsCisJIFBfTkFORF9ENywKKwkgUF9OQU5EX1dFLAorCSBQX05BTkRfUkUsCisJIFBfTkFORF9DTEUsCisJIFBfTkFORF9BTEUsCisJIDB9OwogCiAvKgogICogRGF0YSBzdHJ1Y3R1cmVzIGZvciBiZjV4eCBuYW5kIGZsYXNoIGNvbnRyb2xsZXIgZHJpdmVyCkBAIC0yNzgsNyArMjkzLDYgQEAKIAl1MTYgZWNjMCwgZWNjMTsKIAl1MzIgY29kZVsyXTsKIAl1OCAqcDsKLQlpbnQgYnl0ZXMgPSAzLCBpOwogCiAJLyogZmlyc3QgNCBieXRlcyBFQ0MgY29kZSBmb3IgMjU2IHBhZ2Ugc2l6ZSAqLwogCWVjYzAgPSBiZmluX3JlYWRfTkZDX0VDQzAoKTsKQEAgLTI4OCwxOSArMzAyLDI0IEBACiAKIAlkZXZfZGJnKGluZm8tPmRldmljZSwgInJldHVybmluZyBlY2MgMHglMDh4XG4iLCBjb2RlWzBdKTsKIAorCS8qIGZpcnN0IDMgYnl0ZXMgaW4gZWNjX2NvZGUgZm9yIDI1NiBwYWdlIHNpemUgKi8KKwlwID0gKHU4ICopIGNvZGU7CisJbWVtY3B5KGVjY19jb2RlLCBwLCAzKTsKKwogCS8qIHNlY29uZCA0IGJ5dGVzIEVDQyBjb2RlIGZvciA1MTIgcGFnZSBzaXplICovCiAJaWYgKHBhZ2Vfc2l6ZSA9PSA1MTIpIHsKIAkJZWNjMCA9IGJmaW5fcmVhZF9ORkNfRUNDMigpOwogCQllY2MxID0gYmZpbl9yZWFkX05GQ19FQ0MzKCk7CiAJCWNvZGVbMV0gPSAoZWNjMCAmIDB4M0ZGKSB8ICgoZWNjMSAmIDB4M0ZGKSA8PCAxMSk7Ci0JCWJ5dGVzID0gNjsKKworCQkvKiBzZWNvbmQgMyBieXRlcyBpbiBlY2NfY29kZSBmb3Igc2Vjb25kIDI1NgorCQkgKiBieXRlcyBvZiA1MTIgcGFnZSBzaXplCisJCSAqLworCQlwID0gKHU4ICopIChjb2RlICsgMSk7CisJCW1lbWNweSgoZWNjX2NvZGUgKyAzKSwgcCwgMyk7CiAJCWRldl9kYmcoaW5mby0+ZGV2aWNlLCAicmV0dXJuaW5nIGVjYyAweCUwOHhcbiIsIGNvZGVbMV0pOwogCX0KIAotCXAgPSAodTggKiljb2RlOwotCWZvciAoaSA9IDA7IGkgPCBieXRlczsgaSsrKQotCQllY2NfY29kZVtpXSA9IHBbaV07Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNTA3LDEyICs1MjYsMTMgQEAKIAogCWluaXRfY29tcGxldGlvbigmaW5mby0+ZG1hX2NvbXBsZXRpb24pOwogCisjaWZkZWYgQ09ORklHX0JGNTR4CiAJLyogU2V0dXAgRE1BQzEgY2hhbm5lbCBtdXggZm9yIE5GQyB3aGljaCBzaGFyZWQgd2l0aCBTREggKi8KIAl2YWwgPSBiZmluX3JlYWRfRE1BQzFfUEVSSU1VWCgpOwogCXZhbCAmPSAweEZGRkU7CiAJYmZpbl93cml0ZV9ETUFDMV9QRVJJTVVYKHZhbCk7CiAJU1NZTkMoKTsKLQorI2VuZGlmCiAJLyogUmVxdWVzdCBORkMgRE1BIGNoYW5uZWwgKi8KIAlyZXQgPSByZXF1ZXN0X2RtYShDSF9ORkMsICJCRjVYWCBORkMgZHJpdmVyIik7CiAJaWYgKHJldCA8IDApIHsKQEAgLTc0NCw5ICs3NjQsNiBAQAogewogCXN0cnVjdCBiZjV4eF9uYW5kX2luZm8gKmluZm8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JaWYgKGluZm8pCi0JCWJmNXh4X25hbmRfaHdfaW5pdChpbmZvKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2NhZmVfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9jYWZlX25hbmQuYwppbmRleCAxZTgxMTcxLi5kYTZjZWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2NhZmVfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvY2FmZV9uYW5kLmMKQEAgLTExLDYgKzExLDcgQEAKICN1bmRlZiBERUJVRwogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CiAjaW5jbHVkZSA8bGludXgvcnNsaWIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtNTIsNiArNTMsNyBAQAogCiBzdHJ1Y3QgY2FmZV9wcml2IHsKIAlzdHJ1Y3QgbmFuZF9jaGlwIG5hbmQ7CisJc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnRzOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCXZvaWQgX19pb21lbSAqbW1pbzsKIAlzdHJ1Y3QgcnNfY29udHJvbCAqcnM7CkBAIC04NCw2ICs4NiwxMCBAQAogc3RhdGljIGludCB0aW1pbmdbM107CiBtb2R1bGVfcGFyYW1fYXJyYXkodGltaW5nLCBpbnQsICZudW10aW1pbmdzLCAwNjQ0KTsKIAorI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUworc3RhdGljIGNvbnN0IGNoYXIgKnBhcnRfcHJvYmVzW10gPSB7ICJSZWRCb290IiwgTlVMTCB9OworI2VuZGlmCisKIC8qIEhybS4gV2h5IGlzbid0IHRoaXMgYWxyZWFkeSBjb25kaXRpb25hbCBvbiBzb21ldGhpbmcgaW4gdGhlIHN0cnVjdCBkZXZpY2U/ICovCiAjZGVmaW5lIGNhZmVfZGV2X2RiZyhkZXYsIGFyZ3MuLi4pIGRvIHsgaWYgKGRlYnVnKSBkZXZfZGJnKGRldiwgIyNhcmdzKTsgfSB3aGlsZSgwKQogCkBAIC02MjAsNyArNjI2LDkgQEAKIHsKIAlzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKIAlzdHJ1Y3QgY2FmZV9wcml2ICpjYWZlOworCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0czsKIAl1aW50MzJfdCBjdHJsOworCWludCBucl9wYXJ0czsKIAlpbnQgZXJyID0gMDsKIAogCS8qIFZlcnkgb2xkIHZlcnNpb25zIHNoYXJlZCB0aGUgc2FtZSBQQ0kgaWRlbnQgZm9yIGFsbCB0aHJlZQpAQCAtNzg3LDcgKzc5NSwxOCBAQAogCQlnb3RvIG91dF9pcnE7CiAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgbXRkKTsKKworCS8qIFdlIHJlZ2lzdGVyIHRoZSB3aG9sZSBkZXZpY2UgZmlyc3QsIHNlcGFyYXRlIGZyb20gdGhlIHBhcnRpdGlvbnMgKi8KIAlhZGRfbXRkX2RldmljZShtdGQpOworCisjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCisJbnJfcGFydHMgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhtdGQsIHBhcnRfcHJvYmVzLCAmcGFydHMsIDApOworCWlmIChucl9wYXJ0cyA+IDApIHsKKwkJY2FmZS0+cGFydHMgPSBwYXJ0czsKKwkJZGV2X2luZm8oJmNhZmUtPnBkZXYtPmRldiwgIiVkIFJlZEJvb3QgcGFydGl0aW9ucyBmb3VuZFxuIiwgbnJfcGFydHMpOworCQlhZGRfbXRkX3BhcnRpdGlvbnMobXRkLCBwYXJ0cywgbnJfcGFydHMpOworCX0KKyNlbmRpZgogCWdvdG8gb3V0OwogCiAgb3V0X2lycToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvY3M1NTN4X25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvY3M1NTN4X25hbmQuYwppbmRleCAxOWUxNTk0Li44ZGFiNjk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2NzNTUzeF9uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9jczU1M3hfbmFuZC5jCkBAIC0xMyw5ICsxMywxMiBAQAogICogIE92ZXJ2aWV3OgogICogICBUaGlzIGlzIGEgZGV2aWNlIGRyaXZlciBmb3IgdGhlIE5BTkQgZmxhc2ggY29udHJvbGxlciBmb3VuZCBvbgogICogICB0aGUgQU1EIENTNTUzNS9DUzU1MzYgY29tcGFuaW9uIGNoaXBzZXRzIGZvciB0aGUgR2VvZGUgcHJvY2Vzc29yLgorICogICBtdGQtaWQgZm9yIGNvbW1hbmQgbGluZSBwYXJ0aXRpb25pbmcgaXMgY3M1NTN4X25hbmRfY3NbMC0zXQorICogICB3aGVyZSAwLTMgcmVmbGVjdHMgdGhlIGNoaXAgc2VsZWN0IGZvciBOQU5ELgogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTI0NCw2ICsyNDcsOCBAQAogCQlnb3RvIG91dF9pb3I7CiAJfQogCisJbmV3X210ZC0+bmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiY3M1NTN4X25hbmRfY3MlZCIsIGNzKTsKKwogCWNzNTUzeF9tdGRbY3NdID0gbmV3X210ZDsKIAlnb3RvIG91dDsKIApAQCAtMjcyLDEyICsyNzcsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorCisjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCitjb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMIH07CisjZW5kaWYKKworCiBzdGF0aWMgaW50IF9faW5pdCBjczU1M3hfaW5pdCh2b2lkKQogewogCWludCBlcnIgPSAtRU5YSU87CiAJaW50IGk7CiAJdWludDY0X3QgdmFsOwogCisJaW50IG10ZF9wYXJ0c19uYiA9IDA7CisJc3RydWN0IG10ZF9wYXJ0aXRpb24gKm10ZF9wYXJ0cyA9IE5VTEw7CisKIAkvKiBJZiB0aGUgQ1BVIGlzbid0IGEgR2VvZGUgR1ggb3IgTFgsIGFib3J0ICovCiAJaWYgKCFpc19nZW9kZSgpKQogCQlyZXR1cm4gLUVOWElPOwpAQCAtMjkwLDcgKzMwNCw3IEBACiAKIAkvKiBJZiBpdCBkb2Vzbid0IGhhdmUgdGhlIE5BTkQgY29udHJvbGxlciBlbmFibGVkLCBhYm9ydCAqLwogCXJkbXNybChNU1JfRElWSUxfQkFMTF9PUFRTLCB2YWwpOwotCWlmICh2YWwgJiAxKSB7CisJaWYgKHZhbCAmIFBJTl9PUFRfSURFKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIkNTNTUzeCBOQU5EIGNvbnRyb2xsZXI6IEZsYXNoIEkvTyBub3QgZW5hYmxlZCBpbiBNU1JfRElWSUxfQkFMTF9PUFRTLlxuIik7CiAJCXJldHVybiAtRU5YSU87CiAJfQpAQCAtMzA2LDkgKzMyMCwxOSBAQAogCSAgIGRvIG10ZGNvbmNhdCBldGMuIGlmIHdlIHdhbnQgdG8uICovCiAJZm9yIChpID0gMDsgaSA8IE5SX0NTNTUzWF9DT05UUk9MTEVSUzsgaSsrKSB7CiAJCWlmIChjczU1M3hfbXRkW2ldKSB7Ci0JCQlhZGRfbXRkX2RldmljZShjczU1M3hfbXRkW2ldKTsKIAogCQkJLyogSWYgYW55IGRldmljZXMgcmVnaXN0ZXJlZCwgcmV0dXJuIHN1Y2Nlc3MuIEVsc2UgdGhlIGxhc3QgZXJyb3IuICovCisjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCisJCQltdGRfcGFydHNfbmIgPSBwYXJzZV9tdGRfcGFydGl0aW9ucyhjczU1M3hfbXRkW2ldLCBwYXJ0X3Byb2JlcywgJm10ZF9wYXJ0cywgMCk7CisJCQlpZiAobXRkX3BhcnRzX25iID4gMCkgeworCQkJCXByaW50ayhLRVJOX05PVElDRSAiVXNpbmcgY29tbWFuZCBsaW5lIHBhcnRpdGlvbiBkZWZpbml0aW9uXG4iKTsKKwkJCQlhZGRfbXRkX3BhcnRpdGlvbnMoY3M1NTN4X210ZFtpXSwgbXRkX3BhcnRzLCBtdGRfcGFydHNfbmIpOworCQkJfSBlbHNlIHsKKwkJCQlhZGRfbXRkX2RldmljZShjczU1M3hfbXRkW2ldKTsKKwkJCX0KKyNlbHNlCisJCQlhZGRfbXRkX2RldmljZShjczU1M3hfbXRkW2ldKTsKKyNlbmRpZgogCQkJZXJyID0gMDsKIAkJfQogCX0KQEAgLTMyOCwxMyArMzUyLDE0IEBACiAJCXZvaWQgX19pb21lbSAqbW1pb19iYXNlOwogCiAJCWlmICghbXRkKQotCQkJYnJlYWs7CisJCQljb250aW51ZTsKIAogCQl0aGlzID0gY3M1NTN4X210ZFtpXS0+cHJpdjsKIAkJbW1pb19iYXNlID0gdGhpcy0+SU9fQUREUl9SOwogCiAJCS8qIFJlbGVhc2UgcmVzb3VyY2VzLCB1bnJlZ2lzdGVyIGRldmljZSAqLwogCQluYW5kX3JlbGVhc2UoY3M1NTN4X210ZFtpXSk7CisJCWtmcmVlKGNzNTUzeF9tdGRbaV0tPm5hbWUpOwogCQljczU1M3hfbXRkW2ldID0gTlVMTDsKIAogCQkvKiB1bm1hcCBwaHlzaWNhbCBhZGRyZXNzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL2ZzbF9lbGJjX25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvZnNsX2VsYmNfbmFuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMjVkZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC9uYW5kL2ZzbF9lbGJjX25hbmQuYwpAQCAtMCwwICsxLDEyNDQgQEAKKy8qIEZyZWVzY2FsZSBFbmhhbmNlZCBMb2NhbCBCdXMgQ29udHJvbGxlciBOQU5EIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yCisgKgorICogQXV0aG9yczogTmljayBTcGVuY2UgPG5pY2suc3BlbmNlQGZyZWVzY2FsZS5jb20+LAorICogICAgICAgICAgU2NvdHQgV29vZCA8c2NvdHR3b29kQGZyZWVzY2FsZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kX2VjYy5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworCisjZGVmaW5lIE1BWF9CQU5LUyA4CisjZGVmaW5lIEVSUl9CWVRFIDB4RkYgLyogVmFsdWUgcmV0dXJuZWQgZm9yIHJlYWQgYnl0ZXMgd2hlbiByZWFkIGZhaWxlZCAqLworI2RlZmluZSBGQ01fVElNRU9VVF9NU0VDUyA1MDAgLyogTWF4aW11bSBudW1iZXIgb2YgbVNlY3MgdG8gd2FpdCBmb3IgRkNNICovCisKK3N0cnVjdCBlbGJjX2JhbmsgeworCV9fYmUzMiBicjsgICAgICAgICAgICAgLyoqPCBCYXNlIFJlZ2lzdGVyICAqLworI2RlZmluZSBCUl9CQSAgICAgICAgICAgMHhGRkZGODAwMAorI2RlZmluZSBCUl9CQV9TSElGVCAgICAgICAgICAgICAxNQorI2RlZmluZSBCUl9QUyAgICAgICAgICAgMHgwMDAwMTgwMAorI2RlZmluZSBCUl9QU19TSElGVCAgICAgICAgICAgICAxMQorI2RlZmluZSBCUl9QU184ICAgICAgICAgMHgwMDAwMDgwMCAgLyogUG9ydCBTaXplIDggYml0ICovCisjZGVmaW5lIEJSX1BTXzE2ICAgICAgICAweDAwMDAxMDAwICAvKiBQb3J0IFNpemUgMTYgYml0ICovCisjZGVmaW5lIEJSX1BTXzMyICAgICAgICAweDAwMDAxODAwICAvKiBQb3J0IFNpemUgMzIgYml0ICovCisjZGVmaW5lIEJSX0RFQ0MgICAgICAgICAweDAwMDAwNjAwCisjZGVmaW5lIEJSX0RFQ0NfU0hJRlQgICAgICAgICAgICA5CisjZGVmaW5lIEJSX0RFQ0NfT0ZGICAgICAweDAwMDAwMDAwICAvKiBIVyBFQ0MgY2hlY2tpbmcgYW5kIGdlbmVyYXRpb24gb2ZmICovCisjZGVmaW5lIEJSX0RFQ0NfQ0hLICAgICAweDAwMDAwMjAwICAvKiBIVyBFQ0MgY2hlY2tpbmcgb24sIGdlbmVyYXRpb24gb2ZmICovCisjZGVmaW5lIEJSX0RFQ0NfQ0hLX0dFTiAweDAwMDAwNDAwICAvKiBIVyBFQ0MgY2hlY2tpbmcgYW5kIGdlbmVyYXRpb24gb24gKi8KKyNkZWZpbmUgQlJfV1AgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgQlJfV1BfU0hJRlQgICAgICAgICAgICAgIDgKKyNkZWZpbmUgQlJfTVNFTCAgICAgICAgIDB4MDAwMDAwRTAKKyNkZWZpbmUgQlJfTVNFTF9TSElGVCAgICAgICAgICAgIDUKKyNkZWZpbmUgQlJfTVNfR1BDTSAgICAgIDB4MDAwMDAwMDAgIC8qIEdQQ00gKi8KKyNkZWZpbmUgQlJfTVNfRkNNICAgICAgIDB4MDAwMDAwMjAgIC8qIEZDTSAqLworI2RlZmluZSBCUl9NU19TRFJBTSAgICAgMHgwMDAwMDA2MCAgLyogU0RSQU0gKi8KKyNkZWZpbmUgQlJfTVNfVVBNQSAgICAgIDB4MDAwMDAwODAgIC8qIFVQTUEgKi8KKyNkZWZpbmUgQlJfTVNfVVBNQiAgICAgIDB4MDAwMDAwQTAgIC8qIFVQTUIgKi8KKyNkZWZpbmUgQlJfTVNfVVBNQyAgICAgIDB4MDAwMDAwQzAgIC8qIFVQTUMgKi8KKyNkZWZpbmUgQlJfViAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQlJfVl9TSElGVCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQlJfUkVTICAgICAgICAgIH4oQlJfQkF8QlJfUFN8QlJfREVDQ3xCUl9XUHxCUl9NU0VMfEJSX1YpCisKKwlfX2JlMzIgb3I7ICAgICAgICAgICAgIC8qKjwgQmFzZSBSZWdpc3RlciAgKi8KKyNkZWZpbmUgT1IwIDB4NTAwNAorI2RlZmluZSBPUjEgMHg1MDBDCisjZGVmaW5lIE9SMiAweDUwMTQKKyNkZWZpbmUgT1IzIDB4NTAxQworI2RlZmluZSBPUjQgMHg1MDI0CisjZGVmaW5lIE9SNSAweDUwMkMKKyNkZWZpbmUgT1I2IDB4NTAzNAorI2RlZmluZSBPUjcgMHg1MDNDCisKKyNkZWZpbmUgT1JfRkNNX0FNICAgICAgICAgICAgICAgMHhGRkZGODAwMAorI2RlZmluZSBPUl9GQ01fQU1fU0hJRlQgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIE9SX0ZDTV9CQ1RMRCAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgT1JfRkNNX0JDVExEX1NISUZUICAgICAgICAgICAgICAxMgorI2RlZmluZSBPUl9GQ01fUEdTICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIE9SX0ZDTV9QR1NfU0hJRlQgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgT1JfRkNNX0NTQ1QgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBPUl9GQ01fQ1NDVF9TSElGVCAgICAgICAgICAgICAgICA5CisjZGVmaW5lIE9SX0ZDTV9DU1QgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgT1JfRkNNX0NTVF9TSElGVCAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBPUl9GQ01fQ0hUICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIE9SX0ZDTV9DSFRfU0hJRlQgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgT1JfRkNNX1NDWSAgICAgICAgICAgICAgMHgwMDAwMDA3MAorI2RlZmluZSBPUl9GQ01fU0NZX1NISUZUICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE9SX0ZDTV9TQ1lfMSAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgT1JfRkNNX1NDWV8yICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBPUl9GQ01fU0NZXzMgICAgICAgICAgICAweDAwMDAwMDMwCisjZGVmaW5lIE9SX0ZDTV9TQ1lfNCAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgT1JfRkNNX1NDWV81ICAgICAgICAgICAgMHgwMDAwMDA1MAorI2RlZmluZSBPUl9GQ01fU0NZXzYgICAgICAgICAgICAweDAwMDAwMDYwCisjZGVmaW5lIE9SX0ZDTV9TQ1lfNyAgICAgICAgICAgIDB4MDAwMDAwNzAKKyNkZWZpbmUgT1JfRkNNX1JTVCAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBPUl9GQ01fUlNUX1NISUZUICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIE9SX0ZDTV9UUkxYICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgT1JfRkNNX1RSTFhfU0hJRlQgICAgICAgICAgICAgICAgMgorI2RlZmluZSBPUl9GQ01fRUhUUiAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIE9SX0ZDTV9FSFRSX1NISUZUICAgICAgICAgICAgICAgIDEKK307CisKK3N0cnVjdCBlbGJjX3JlZ3MgeworCXN0cnVjdCBlbGJjX2JhbmsgYmFua1s4XTsKKwl1OCByZXMwWzB4MjhdOworCV9fYmUzMiBtYXI7ICAgICAgICAgICAgIC8qKjwgVVBNIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwl1OCByZXMxWzB4NF07CisJX19iZTMyIG1hbXI7ICAgICAgICAgICAgLyoqPCBVUE1BIE1vZGUgUmVnaXN0ZXIgKi8KKwlfX2JlMzIgbWJtcjsgICAgICAgICAgICAvKio8IFVQTUIgTW9kZSBSZWdpc3RlciAqLworCV9fYmUzMiBtY21yOyAgICAgICAgICAgIC8qKjwgVVBNQyBNb2RlIFJlZ2lzdGVyICovCisJdTggcmVzMlsweDhdOworCV9fYmUzMiBtcnRwcjsgICAgICAgICAgIC8qKjwgTWVtb3J5IFJlZnJlc2ggVGltZXIgUHJlc2NhbGVyIFJlZ2lzdGVyICovCisJX19iZTMyIG1kcjsgICAgICAgICAgICAgLyoqPCBVUE0gRGF0YSBSZWdpc3RlciAqLworCXU4IHJlczNbMHg0XTsKKwlfX2JlMzIgbHNvcjsgICAgICAgICAgICAvKio8IFNwZWNpYWwgT3BlcmF0aW9uIEluaXRpYXRpb24gUmVnaXN0ZXIgKi8KKwlfX2JlMzIgbHNkbXI7ICAgICAgICAgICAvKio8IFNEUkFNIE1vZGUgUmVnaXN0ZXIgKi8KKwl1OCByZXM0WzB4OF07CisJX19iZTMyIGx1cnQ7ICAgICAgICAgICAgLyoqPCBVUE0gUmVmcmVzaCBUaW1lciAqLworCV9fYmUzMiBsc3J0OyAgICAgICAgICAgIC8qKjwgU0RSQU0gUmVmcmVzaCBUaW1lciAqLworCXU4IHJlczVbMHg4XTsKKwlfX2JlMzIgbHRlc3I7ICAgICAgICAgICAvKio8IFRyYW5zZmVyIEVycm9yIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBMVEVTUl9CTSAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgTFRFU1JfRkNUICAweDQwMDAwMDAwCisjZGVmaW5lIExURVNSX1BBUiAgMHgyMDAwMDAwMAorI2RlZmluZSBMVEVTUl9XUCAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgTFRFU1JfQVRNVyAweDAwODAwMDAwCisjZGVmaW5lIExURVNSX0FUTVIgMHgwMDQwMDAwMAorI2RlZmluZSBMVEVTUl9DUyAgIDB4MDAwODAwMDAKKyNkZWZpbmUgTFRFU1JfQ0MgICAweDAwMDAwMDAxCisjZGVmaW5lIExURVNSX05BTkRfTUFTSyAoTFRFU1JfRkNUIHwgTFRFU1JfUEFSIHwgTFRFU1JfQ0MpCisJX19iZTMyIGx0ZWRyOyAgICAgICAgICAgLyoqPCBUcmFuc2ZlciBFcnJvciBEaXNhYmxlIFJlZ2lzdGVyICovCisJX19iZTMyIGx0ZWlyOyAgICAgICAgICAgLyoqPCBUcmFuc2ZlciBFcnJvciBJbnRlcnJ1cHQgUmVnaXN0ZXIgKi8KKwlfX2JlMzIgbHRlYXRyOyAgICAgICAgICAvKio8IFRyYW5zZmVyIEVycm9yIEF0dHJpYnV0ZXMgUmVnaXN0ZXIgKi8KKwlfX2JlMzIgbHRlYXI7ICAgICAgICAgICAvKio8IFRyYW5zZmVyIEVycm9yIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwl1OCByZXM2WzB4Q107CisJX19iZTMyIGxiY3I7ICAgICAgICAgICAgLyoqPCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIExCQ1JfTERJUyAgMHg4MDAwMDAwMAorI2RlZmluZSBMQkNSX0xESVNfU0hJRlQgICAgMzEKKyNkZWZpbmUgTEJDUl9CQ1RMQyAweDAwQzAwMDAwCisjZGVmaW5lIExCQ1JfQkNUTENfU0hJRlQgICAyMgorI2RlZmluZSBMQkNSX0FIRCAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgTEJDUl9MUEJTRSAweDAwMDIwMDAwCisjZGVmaW5lIExCQ1JfTFBCU0VfU0hJRlQgICAxNworI2RlZmluZSBMQkNSX0VQQVIgIDB4MDAwMTAwMDAKKyNkZWZpbmUgTEJDUl9FUEFSX1NISUZUICAgIDE2CisjZGVmaW5lIExCQ1JfQk1UICAgMHgwMDAwRkYwMAorI2RlZmluZSBMQkNSX0JNVF9TSElGVCAgICAgIDgKKyNkZWZpbmUgTEJDUl9JTklUICAweDAwMDQwMDAwCisJX19iZTMyIGxjcnI7ICAgICAgICAgICAgLyoqPCBDbG9jayBSYXRpbyBSZWdpc3RlciAqLworI2RlZmluZSBMQ1JSX0RCWVAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBMQ1JSX0RCWVBfU0hJRlQgICAgICAzMQorI2RlZmluZSBMQ1JSX0JVRkNNREMgMHgzMDAwMDAwMAorI2RlZmluZSBMQ1JSX0JVRkNNRENfU0hJRlQgICAyOAorI2RlZmluZSBMQ1JSX0VDTCAgICAgMHgwMzAwMDAwMAorI2RlZmluZSBMQ1JSX0VDTF9TSElGVCAgICAgICAyNAorI2RlZmluZSBMQ1JSX0VBREMgICAgMHgwMDAzMDAwMAorI2RlZmluZSBMQ1JSX0VBRENfU0hJRlQgICAgICAxNgorI2RlZmluZSBMQ1JSX0NMS0RJViAgMHgwMDAwMDAwRgorI2RlZmluZSBMQ1JSX0NMS0RJVl9TSElGVCAgICAgMAorCXU4IHJlczdbMHg4XTsKKwlfX2JlMzIgZm1yOyAgICAgICAgICAgICAvKio8IEZsYXNoIE1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRk1SX0NXVE8gICAgIDB4MDAwMEYwMDAKKyNkZWZpbmUgRk1SX0NXVE9fU0hJRlQgICAgICAgMTIKKyNkZWZpbmUgRk1SX0JPT1QgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgRk1SX0VDQ00gICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgRk1SX0FMICAgICAgIDB4MDAwMDAwMzAKKyNkZWZpbmUgRk1SX0FMX1NISUZUICAgICAgICAgIDQKKyNkZWZpbmUgRk1SX09QICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgRk1SX09QX1NISUZUICAgICAgICAgIDAKKwlfX2JlMzIgZmlyOyAgICAgICAgICAgICAvKio8IEZsYXNoIEluc3RydWN0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIEZJUl9PUDAgICAgICAweEYwMDAwMDAwCisjZGVmaW5lIEZJUl9PUDBfU0hJRlQgICAgICAgIDI4CisjZGVmaW5lIEZJUl9PUDEgICAgICAweDBGMDAwMDAwCisjZGVmaW5lIEZJUl9PUDFfU0hJRlQgICAgICAgIDI0CisjZGVmaW5lIEZJUl9PUDIgICAgICAweDAwRjAwMDAwCisjZGVmaW5lIEZJUl9PUDJfU0hJRlQgICAgICAgIDIwCisjZGVmaW5lIEZJUl9PUDMgICAgICAweDAwMEYwMDAwCisjZGVmaW5lIEZJUl9PUDNfU0hJRlQgICAgICAgIDE2CisjZGVmaW5lIEZJUl9PUDQgICAgICAweDAwMDBGMDAwCisjZGVmaW5lIEZJUl9PUDRfU0hJRlQgICAgICAgIDEyCisjZGVmaW5lIEZJUl9PUDUgICAgICAweDAwMDAwRjAwCisjZGVmaW5lIEZJUl9PUDVfU0hJRlQgICAgICAgICA4CisjZGVmaW5lIEZJUl9PUDYgICAgICAweDAwMDAwMEYwCisjZGVmaW5lIEZJUl9PUDZfU0hJRlQgICAgICAgICA0CisjZGVmaW5lIEZJUl9PUDcgICAgICAweDAwMDAwMDBGCisjZGVmaW5lIEZJUl9PUDdfU0hJRlQgICAgICAgICAwCisjZGVmaW5lIEZJUl9PUF9OT1AgICAweDAJLyogTm8gb3BlcmF0aW9uIGFuZCBlbmQgb2Ygc2VxdWVuY2UgKi8KKyNkZWZpbmUgRklSX09QX0NBICAgIDB4MSAgICAgICAgLyogSXNzdWUgY3VycmVudCBjb2x1bW4gYWRkcmVzcyAqLworI2RlZmluZSBGSVJfT1BfUEEgICAgMHgyICAgICAgICAvKiBJc3N1ZSBjdXJyZW50IGJsb2NrK3BhZ2UgYWRkcmVzcyAqLworI2RlZmluZSBGSVJfT1BfVUEgICAgMHgzICAgICAgICAvKiBJc3N1ZSB1c2VyIGRlZmluZWQgYWRkcmVzcyAqLworI2RlZmluZSBGSVJfT1BfQ00wICAgMHg0ICAgICAgICAvKiBJc3N1ZSBjb21tYW5kIGZyb20gRkNSW0NNRDBdICovCisjZGVmaW5lIEZJUl9PUF9DTTEgICAweDUgICAgICAgIC8qIElzc3VlIGNvbW1hbmQgZnJvbSBGQ1JbQ01EMV0gKi8KKyNkZWZpbmUgRklSX09QX0NNMiAgIDB4NiAgICAgICAgLyogSXNzdWUgY29tbWFuZCBmcm9tIEZDUltDTUQyXSAqLworI2RlZmluZSBGSVJfT1BfQ00zICAgMHg3ICAgICAgICAvKiBJc3N1ZSBjb21tYW5kIGZyb20gRkNSW0NNRDNdICovCisjZGVmaW5lIEZJUl9PUF9XQiAgICAweDggICAgICAgIC8qIFdyaXRlIEZCQ1IgYnl0ZXMgZnJvbSBGQ00gYnVmZmVyICovCisjZGVmaW5lIEZJUl9PUF9XUyAgICAweDkgICAgICAgIC8qIFdyaXRlIDEgb3IgMiBieXRlcyBmcm9tIE1EUltBU10gKi8KKyNkZWZpbmUgRklSX09QX1JCICAgIDB4QSAgICAgICAgLyogUmVhZCBGQkNSIGJ5dGVzIHRvIEZDTSBidWZmZXIgKi8KKyNkZWZpbmUgRklSX09QX1JTICAgIDB4QiAgICAgICAgLyogUmVhZCAxIG9yIDIgYnl0ZXMgdG8gTURSW0FTXSAqLworI2RlZmluZSBGSVJfT1BfQ1cwICAgMHhDICAgICAgICAvKiBXYWl0IHRoZW4gaXNzdWUgRkNSW0NNRDBdICovCisjZGVmaW5lIEZJUl9PUF9DVzEgICAweEQgICAgICAgIC8qIFdhaXQgdGhlbiBpc3N1ZSBGQ1JbQ01EMV0gKi8KKyNkZWZpbmUgRklSX09QX1JCVyAgIDB4RSAgICAgICAgLyogV2FpdCB0aGVuIHJlYWQgRkJDUiBieXRlcyAqLworI2RlZmluZSBGSVJfT1BfUlNXICAgMHhFICAgICAgICAvKiBXYWl0IHRoZW4gcmVhZCAxIG9yIDIgYnl0ZXMgKi8KKwlfX2JlMzIgZmNyOyAgICAgICAgICAgICAvKio8IEZsYXNoIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRkNSX0NNRDAgICAgIDB4RkYwMDAwMDAKKyNkZWZpbmUgRkNSX0NNRDBfU0hJRlQgICAgICAgMjQKKyNkZWZpbmUgRkNSX0NNRDEgICAgIDB4MDBGRjAwMDAKKyNkZWZpbmUgRkNSX0NNRDFfU0hJRlQgICAgICAgMTYKKyNkZWZpbmUgRkNSX0NNRDIgICAgIDB4MDAwMEZGMDAKKyNkZWZpbmUgRkNSX0NNRDJfU0hJRlQgICAgICAgIDgKKyNkZWZpbmUgRkNSX0NNRDMgICAgIDB4MDAwMDAwRkYKKyNkZWZpbmUgRkNSX0NNRDNfU0hJRlQgICAgICAgIDAKKwlfX2JlMzIgZmJhcjsgICAgICAgICAgICAvKio8IEZsYXNoIEJsb2NrIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRkJBUl9CTEsgICAgIDB4MDBGRkZGRkYKKwlfX2JlMzIgZnBhcjsgICAgICAgICAgICAvKio8IEZsYXNoIFBhZ2UgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZSBGUEFSX1NQX1BJICAgMHgwMDAwN0MwMAorI2RlZmluZSBGUEFSX1NQX1BJX1NISUZUICAgICAxMAorI2RlZmluZSBGUEFSX1NQX01TICAgMHgwMDAwMDIwMAorI2RlZmluZSBGUEFSX1NQX0NJICAgMHgwMDAwMDFGRgorI2RlZmluZSBGUEFSX1NQX0NJX1NISUZUICAgICAgMAorI2RlZmluZSBGUEFSX0xQX1BJICAgMHgwMDAzRjAwMAorI2RlZmluZSBGUEFSX0xQX1BJX1NISUZUICAgICAxMgorI2RlZmluZSBGUEFSX0xQX01TICAgMHgwMDAwMDgwMAorI2RlZmluZSBGUEFSX0xQX0NJICAgMHgwMDAwMDdGRgorI2RlZmluZSBGUEFSX0xQX0NJX1NISUZUICAgICAgMAorCV9fYmUzMiBmYmNyOyAgICAgICAgICAgIC8qKjwgRmxhc2ggQnl0ZSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZSBGQkNSX0JDICAgICAgMHgwMDAwMEZGRgorCXU4IHJlczExWzB4OF07CisJdTggcmVzOFsweEYwMF07Cit9OworCitzdHJ1Y3QgZnNsX2VsYmNfY3RybDsKKworLyogbXRkIGluZm9ybWF0aW9uIHBlciBzZXQgKi8KKworc3RydWN0IGZzbF9lbGJjX210ZCB7CisJc3RydWN0IG10ZF9pbmZvIG10ZDsKKwlzdHJ1Y3QgbmFuZF9jaGlwIGNoaXA7CisJc3RydWN0IGZzbF9lbGJjX2N0cmwgKmN0cmw7CisKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJaW50IGJhbms7ICAgICAgICAgICAgICAgLyogQ2hpcCBzZWxlY3QgYmFuayBudW1iZXIgICAgICAgICAgICovCisJdTggX19pb21lbSAqdmJhc2U7ICAgICAgLyogQ2hpcCBzZWxlY3QgYmFzZSB2aXJ0dWFsIGFkZHJlc3MgICovCisJaW50IHBhZ2Vfc2l6ZTsgICAgICAgICAgLyogTkFORCBwYWdlIHNpemUgKDA9NTEyLCAxPTIwNDgpICAgICovCisJdW5zaWduZWQgaW50IGZtcjsgICAgICAgLyogRkNNIEZsYXNoIE1vZGUgUmVnaXN0ZXIgdmFsdWUgICAgICovCit9OworCisvKiBvdmVydmlldyBvZiB0aGUgZnNsIGVsYmMgY29udHJvbGxlciAqLworCitzdHJ1Y3QgZnNsX2VsYmNfY3RybCB7CisJc3RydWN0IG5hbmRfaHdfY29udHJvbCBjb250cm9sbGVyOworCXN0cnVjdCBmc2xfZWxiY19tdGQgKmNoaXBzW01BWF9CQU5LU107CisKKwkvKiBkZXZpY2UgaW5mbyAqLworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZWxiY19yZWdzIF9faW9tZW0gKnJlZ3M7CisJaW50IGlycTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBpcnFfd2FpdDsKKwl1bnNpZ25lZCBpbnQgaXJxX3N0YXR1czsgLyogc3RhdHVzIHJlYWQgZnJvbSBMVEVTUiBieSBpcnEgaGFuZGxlciAqLworCXU4IF9faW9tZW0gKmFkZHI7ICAgICAgICAvKiBBZGRyZXNzIG9mIGFzc2lnbmVkIEZDTSBidWZmZXIgICAgICAgICovCisJdW5zaWduZWQgaW50IHBhZ2U7ICAgICAgIC8qIExhc3QgcGFnZSB3cml0dGVuIHRvIC8gcmVhZCBmcm9tICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgcmVhZF9ieXRlczsgLyogTnVtYmVyIG9mIGJ5dGVzIHJlYWQgZHVyaW5nIGNvbW1hbmQgICAqLworCXVuc2lnbmVkIGludCBjb2x1bW47ICAgICAvKiBTYXZlZCBjb2x1bW4gZnJvbSBTRVFJTiAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgaW50IGluZGV4OyAgICAgIC8qIFBvaW50ZXIgdG8gbmV4dCBieXRlIHRvICdyZWFkJyAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgc3RhdHVzOyAgICAgLyogc3RhdHVzIHJlYWQgZnJvbSBMVEVTUiBhZnRlciBsYXN0IG9wICAqLworCXVuc2lnbmVkIGludCBtZHI7ICAgICAgICAvKiBVUE0vRkNNIERhdGEgUmVnaXN0ZXIgdmFsdWUgICAgICAgICAgICovCisJdW5zaWduZWQgaW50IHVzZV9tZHI7ICAgIC8qIE5vbiB6ZXJvIGlmIHRoZSBNRFIgaXMgdG8gYmUgc2V0ICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgb29iOyAgICAgICAgLyogTm9uIHplcm8gaWYgb3BlcmF0aW5nIG9uIE9PQiBkYXRhICAgICAqLworCWNoYXIgKm9vYl9wb2k7ICAgICAgICAgICAvKiBQbGFjZSB0byB3cml0ZSBFQ0MgYWZ0ZXIgcmVhZCBiYWNrICAgICovCit9OworCisvKiBUaGVzZSBtYXAgdG8gdGhlIHBvc2l0aW9ucyB1c2VkIGJ5IHRoZSBGQ00gaGFyZHdhcmUgRUNDIGdlbmVyYXRvciAqLworCisvKiBTbWFsbCBQYWdlIEZMQVNIIHdpdGggRk1SW0VDQ01dID0gMCAqLworc3RhdGljIHN0cnVjdCBuYW5kX2VjY2xheW91dCBmc2xfZWxiY19vb2Jfc3BfZWNjbTAgPSB7CisJLmVjY2J5dGVzID0gMywKKwkuZWNjcG9zID0gezYsIDcsIDh9LAorCS5vb2JmcmVlID0geyB7MCwgNX0sIHs5LCA3fSB9LAorCS5vb2JhdmFpbCA9IDEyLAorfTsKKworLyogU21hbGwgUGFnZSBGTEFTSCB3aXRoIEZNUltFQ0NNXSA9IDEgKi8KK3N0YXRpYyBzdHJ1Y3QgbmFuZF9lY2NsYXlvdXQgZnNsX2VsYmNfb29iX3NwX2VjY20xID0geworCS5lY2NieXRlcyA9IDMsCisJLmVjY3BvcyA9IHs4LCA5LCAxMH0sCisJLm9vYmZyZWUgPSB7IHswLCA1fSwgezYsIDJ9LCB7MTEsIDV9IH0sCisJLm9vYmF2YWlsID0gMTIsCit9OworCisvKiBMYXJnZSBQYWdlIEZMQVNIIHdpdGggRk1SW0VDQ01dID0gMCAqLworc3RhdGljIHN0cnVjdCBuYW5kX2VjY2xheW91dCBmc2xfZWxiY19vb2JfbHBfZWNjbTAgPSB7CisJLmVjY2J5dGVzID0gMTIsCisJLmVjY3BvcyA9IHs2LCA3LCA4LCAyMiwgMjMsIDI0LCAzOCwgMzksIDQwLCA1NCwgNTUsIDU2fSwKKwkub29iZnJlZSA9IHsgezEsIDV9LCB7OSwgMTN9LCB7MjUsIDEzfSwgezQxLCAxM30sIHs1NywgN30gfSwKKwkub29iYXZhaWwgPSA0OCwKK307CisKKy8qIExhcmdlIFBhZ2UgRkxBU0ggd2l0aCBGTVJbRUNDTV0gPSAxICovCitzdGF0aWMgc3RydWN0IG5hbmRfZWNjbGF5b3V0IGZzbF9lbGJjX29vYl9scF9lY2NtMSA9IHsKKwkuZWNjYnl0ZXMgPSAxMiwKKwkuZWNjcG9zID0gezgsIDksIDEwLCAyNCwgMjUsIDI2LCA0MCwgNDEsIDQyLCA1NiwgNTcsIDU4fSwKKwkub29iZnJlZSA9IHsgezEsIDd9LCB7MTEsIDEzfSwgezI3LCAxM30sIHs0MywgMTN9LCB7NTksIDV9IH0sCisJLm9vYmF2YWlsID0gNDgsCit9OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBTZXQgdXAgdGhlIEZDTSBoYXJkd2FyZSBibG9jayBhbmQgcGFnZSBhZGRyZXNzIGZpZWxkcywgYW5kIHRoZSBmY20KKyAqIHN0cnVjdHVyZSBhZGRyIGZpZWxkIHRvIHBvaW50IHRvIHRoZSBjb3JyZWN0IEZDTSBidWZmZXIgaW4gbWVtb3J5CisgKi8KK3N0YXRpYyB2b2lkIHNldF9hZGRyKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY29sdW1uLCBpbnQgcGFnZV9hZGRyLCBpbnQgb29iKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7CisJc3RydWN0IGZzbF9lbGJjX210ZCAqcHJpdiA9IGNoaXAtPnByaXY7CisJc3RydWN0IGZzbF9lbGJjX2N0cmwgKmN0cmwgPSBwcml2LT5jdHJsOworCXN0cnVjdCBlbGJjX3JlZ3MgX19pb21lbSAqbGJjID0gY3RybC0+cmVnczsKKwlpbnQgYnVmX251bTsKKworCWN0cmwtPnBhZ2UgPSBwYWdlX2FkZHI7CisKKwlvdXRfYmUzMigmbGJjLT5mYmFyLAorCSAgICAgICAgIHBhZ2VfYWRkciA+PiAoY2hpcC0+cGh5c19lcmFzZV9zaGlmdCAtIGNoaXAtPnBhZ2Vfc2hpZnQpKTsKKworCWlmIChwcml2LT5wYWdlX3NpemUpIHsKKwkJb3V0X2JlMzIoJmxiYy0+ZnBhciwKKwkJICAgICAgICAgKChwYWdlX2FkZHIgPDwgRlBBUl9MUF9QSV9TSElGVCkgJiBGUEFSX0xQX1BJKSB8CisJCSAgICAgICAgIChvb2IgPyBGUEFSX0xQX01TIDogMCkgfCBjb2x1bW4pOworCQlidWZfbnVtID0gKHBhZ2VfYWRkciAmIDEpIDw8IDI7CisJfSBlbHNlIHsKKwkJb3V0X2JlMzIoJmxiYy0+ZnBhciwKKwkJICAgICAgICAgKChwYWdlX2FkZHIgPDwgRlBBUl9TUF9QSV9TSElGVCkgJiBGUEFSX1NQX1BJKSB8CisJCSAgICAgICAgIChvb2IgPyBGUEFSX1NQX01TIDogMCkgfCBjb2x1bW4pOworCQlidWZfbnVtID0gcGFnZV9hZGRyICYgNzsKKwl9CisKKwljdHJsLT5hZGRyID0gcHJpdi0+dmJhc2UgKyBidWZfbnVtICogMTAyNDsKKwljdHJsLT5pbmRleCA9IGNvbHVtbjsKKworCS8qIGZvciBPT0IgZGF0YSBwb2ludCB0byB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIGJ1ZmZlciAqLworCWlmIChvb2IpCisJCWN0cmwtPmluZGV4ICs9IHByaXYtPnBhZ2Vfc2l6ZSA/IDIwNDggOiA1MTI7CisKKwlkZXZfdmRiZyhjdHJsLT5kZXYsICJzZXRfYWRkcjogYmFuaz0lZCwgY3RybC0+YWRkcj0weCVwICgweCVwKSwgIgorCSAgICAgICAgICAgICAgICAgICAgImluZGV4ICV4LCBwZXMgJWQgcHMgJWRcbiIsCisJICAgICAgICAgYnVmX251bSwgY3RybC0+YWRkciwgcHJpdi0+dmJhc2UsIGN0cmwtPmluZGV4LAorCSAgICAgICAgIGNoaXAtPnBoeXNfZXJhc2Vfc2hpZnQsIGNoaXAtPnBhZ2Vfc2hpZnQpOworfQorCisvKgorICogZXhlY3V0ZSBGQ00gY29tbWFuZCBhbmQgd2FpdCBmb3IgaXQgdG8gY29tcGxldGUKKyAqLworc3RhdGljIGludCBmc2xfZWxiY19ydW5fY29tbWFuZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OworCXN0cnVjdCBmc2xfZWxiY19tdGQgKnByaXYgPSBjaGlwLT5wcml2OworCXN0cnVjdCBmc2xfZWxiY19jdHJsICpjdHJsID0gcHJpdi0+Y3RybDsKKwlzdHJ1Y3QgZWxiY19yZWdzIF9faW9tZW0gKmxiYyA9IGN0cmwtPnJlZ3M7CisKKwkvKiBTZXR1cCB0aGUgRk1SW09QXSB0byBleGVjdXRlIHdpdGhvdXQgd3JpdGUgcHJvdGVjdGlvbiAqLworCW91dF9iZTMyKCZsYmMtPmZtciwgcHJpdi0+Zm1yIHwgMyk7CisJaWYgKGN0cmwtPnVzZV9tZHIpCisJCW91dF9iZTMyKCZsYmMtPm1kciwgY3RybC0+bWRyKTsKKworCWRldl92ZGJnKGN0cmwtPmRldiwKKwkgICAgICAgICAiZnNsX2VsYmNfcnVuX2NvbW1hbmQ6IGZtcj0lMDh4IGZpcj0lMDh4IGZjcj0lMDh4XG4iLAorCSAgICAgICAgIGluX2JlMzIoJmxiYy0+Zm1yKSwgaW5fYmUzMigmbGJjLT5maXIpLCBpbl9iZTMyKCZsYmMtPmZjcikpOworCWRldl92ZGJnKGN0cmwtPmRldiwKKwkgICAgICAgICAiZnNsX2VsYmNfcnVuX2NvbW1hbmQ6IGZiYXI9JTA4eCBmcGFyPSUwOHggIgorCSAgICAgICAgICJmYmNyPSUwOHggYmFuaz0lZFxuIiwKKwkgICAgICAgICBpbl9iZTMyKCZsYmMtPmZiYXIpLCBpbl9iZTMyKCZsYmMtPmZwYXIpLAorCSAgICAgICAgIGluX2JlMzIoJmxiYy0+ZmJjciksIHByaXYtPmJhbmspOworCisJLyogZXhlY3V0ZSBzcGVjaWFsIG9wZXJhdGlvbiAqLworCW91dF9iZTMyKCZsYmMtPmxzb3IsIHByaXYtPmJhbmspOworCisJLyogd2FpdCBmb3IgRkNNIGNvbXBsZXRlIGZsYWcgb3IgdGltZW91dCAqLworCWN0cmwtPmlycV9zdGF0dXMgPSAwOworCXdhaXRfZXZlbnRfdGltZW91dChjdHJsLT5pcnFfd2FpdCwgY3RybC0+aXJxX3N0YXR1cywKKwkgICAgICAgICAgICAgICAgICAgRkNNX1RJTUVPVVRfTVNFQ1MgKiBIWi8xMDAwKTsKKwljdHJsLT5zdGF0dXMgPSBjdHJsLT5pcnFfc3RhdHVzOworCisJLyogc3RvcmUgbWRyIHZhbHVlIGluIGNhc2UgaXQgd2FzIG5lZWRlZCAqLworCWlmIChjdHJsLT51c2VfbWRyKQorCQljdHJsLT5tZHIgPSBpbl9iZTMyKCZsYmMtPm1kcik7CisKKwljdHJsLT51c2VfbWRyID0gMDsKKworCWRldl92ZGJnKGN0cmwtPmRldiwKKwkgICAgICAgICAiZnNsX2VsYmNfcnVuX2NvbW1hbmQ6IHN0YXQ9JTA4eCBtZHI9JTA4eCBmbXI9JTA4eFxuIiwKKwkgICAgICAgICBjdHJsLT5zdGF0dXMsIGN0cmwtPm1kciwgaW5fYmUzMigmbGJjLT5mbXIpKTsKKworCS8qIHJldHVybnMgMCBvbiBzdWNjZXNzIG90aGVyd2lzZSBub24temVybykgKi8KKwlyZXR1cm4gY3RybC0+c3RhdHVzID09IExURVNSX0NDID8gMCA6IC1FSU87Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9lbGJjX2RvX3JlYWQoc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgaW50IG9vYikKK3sKKwlzdHJ1Y3QgZnNsX2VsYmNfbXRkICpwcml2ID0gY2hpcC0+cHJpdjsKKwlzdHJ1Y3QgZnNsX2VsYmNfY3RybCAqY3RybCA9IHByaXYtPmN0cmw7CisJc3RydWN0IGVsYmNfcmVncyBfX2lvbWVtICpsYmMgPSBjdHJsLT5yZWdzOworCisJaWYgKHByaXYtPnBhZ2Vfc2l6ZSkgeworCQlvdXRfYmUzMigmbGJjLT5maXIsCisJCSAgICAgICAgIChGSVJfT1BfQ1cwIDw8IEZJUl9PUDBfU0hJRlQpIHwKKwkJICAgICAgICAgKEZJUl9PUF9DQSAgPDwgRklSX09QMV9TSElGVCkgfAorCQkgICAgICAgICAoRklSX09QX1BBICA8PCBGSVJfT1AyX1NISUZUKSB8CisJCSAgICAgICAgIChGSVJfT1BfQ1cxIDw8IEZJUl9PUDNfU0hJRlQpIHwKKwkJICAgICAgICAgKEZJUl9PUF9SQlcgPDwgRklSX09QNF9TSElGVCkpOworCisJCW91dF9iZTMyKCZsYmMtPmZjciwgKE5BTkRfQ01EX1JFQUQwIDw8IEZDUl9DTUQwX1NISUZUKSB8CisJCSAgICAgICAgICAgICAgICAgICAgKE5BTkRfQ01EX1JFQURTVEFSVCA8PCBGQ1JfQ01EMV9TSElGVCkpOworCX0gZWxzZSB7CisJCW91dF9iZTMyKCZsYmMtPmZpciwKKwkJICAgICAgICAgKEZJUl9PUF9DVzAgPDwgRklSX09QMF9TSElGVCkgfAorCQkgICAgICAgICAoRklSX09QX0NBICA8PCBGSVJfT1AxX1NISUZUKSB8CisJCSAgICAgICAgIChGSVJfT1BfUEEgIDw8IEZJUl9PUDJfU0hJRlQpIHwKKwkJICAgICAgICAgKEZJUl9PUF9SQlcgPDwgRklSX09QM19TSElGVCkpOworCisJCWlmIChvb2IpCisJCQlvdXRfYmUzMigmbGJjLT5mY3IsIE5BTkRfQ01EX1JFQURPT0IgPDwgRkNSX0NNRDBfU0hJRlQpOworCQllbHNlCisJCQlvdXRfYmUzMigmbGJjLT5mY3IsIE5BTkRfQ01EX1JFQUQwIDw8IEZDUl9DTUQwX1NISUZUKTsKKwl9Cit9CisKKy8qIGNtZGZ1bmMgc2VuZCBjb21tYW5kcyB0byB0aGUgRkNNICovCitzdGF0aWMgdm9pZCBmc2xfZWxiY19jbWRmdW5jKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1bnNpZ25lZCBpbnQgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbHVtbiwgaW50IHBhZ2VfYWRkcikKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OworCXN0cnVjdCBmc2xfZWxiY19tdGQgKnByaXYgPSBjaGlwLT5wcml2OworCXN0cnVjdCBmc2xfZWxiY19jdHJsICpjdHJsID0gcHJpdi0+Y3RybDsKKwlzdHJ1Y3QgZWxiY19yZWdzIF9faW9tZW0gKmxiYyA9IGN0cmwtPnJlZ3M7CisKKwljdHJsLT51c2VfbWRyID0gMDsKKworCS8qIGNsZWFyIHRoZSByZWFkIGJ1ZmZlciAqLworCWN0cmwtPnJlYWRfYnl0ZXMgPSAwOworCWlmIChjb21tYW5kICE9IE5BTkRfQ01EX1BBR0VQUk9HKQorCQljdHJsLT5pbmRleCA9IDA7CisKKwlzd2l0Y2ggKGNvbW1hbmQpIHsKKwkvKiBSRUFEMCBhbmQgUkVBRDEgcmVhZCB0aGUgZW50aXJlIGJ1ZmZlciB0byB1c2UgaGFyZHdhcmUgRUNDLiAqLworCWNhc2UgTkFORF9DTURfUkVBRDE6CisJCWNvbHVtbiArPSAyNTY7CisKKwkvKiBmYWxsLXRocm91Z2ggKi8KKwljYXNlIE5BTkRfQ01EX1JFQUQwOgorCQlkZXZfZGJnKGN0cmwtPmRldiwKKwkJICAgICAgICAiZnNsX2VsYmNfY21kZnVuYzogTkFORF9DTURfUkVBRDAsIHBhZ2VfYWRkcjoiCisJCSAgICAgICAgIiAweCV4LCBjb2x1bW46IDB4JXguXG4iLCBwYWdlX2FkZHIsIGNvbHVtbik7CisKKworCQlvdXRfYmUzMigmbGJjLT5mYmNyLCAwKTsgLyogcmVhZCBlbnRpcmUgcGFnZSB0byBlbmFibGUgRUNDICovCisJCXNldF9hZGRyKG10ZCwgMCwgcGFnZV9hZGRyLCAwKTsKKworCQljdHJsLT5yZWFkX2J5dGVzID0gbXRkLT53cml0ZXNpemUgKyBtdGQtPm9vYnNpemU7CisJCWN0cmwtPmluZGV4ICs9IGNvbHVtbjsKKworCQlmc2xfZWxiY19kb19yZWFkKGNoaXAsIDApOworCQlmc2xfZWxiY19ydW5fY29tbWFuZChtdGQpOworCQlyZXR1cm47CisKKwkvKiBSRUFET09CIHJlYWRzIG9ubHkgdGhlIE9PQiBiZWNhdXNlIG5vIEVDQyBpcyBwZXJmb3JtZWQuICovCisJY2FzZSBOQU5EX0NNRF9SRUFET09COgorCQlkZXZfdmRiZyhjdHJsLT5kZXYsCisJCSAgICAgICAgICJmc2xfZWxiY19jbWRmdW5jOiBOQU5EX0NNRF9SRUFET09CLCBwYWdlX2FkZHI6IgorCQkJICIgMHgleCwgY29sdW1uOiAweCV4LlxuIiwgcGFnZV9hZGRyLCBjb2x1bW4pOworCisJCW91dF9iZTMyKCZsYmMtPmZiY3IsIG10ZC0+b29ic2l6ZSAtIGNvbHVtbik7CisJCXNldF9hZGRyKG10ZCwgY29sdW1uLCBwYWdlX2FkZHIsIDEpOworCisJCWN0cmwtPnJlYWRfYnl0ZXMgPSBtdGQtPndyaXRlc2l6ZSArIG10ZC0+b29ic2l6ZTsKKworCQlmc2xfZWxiY19kb19yZWFkKGNoaXAsIDEpOworCQlmc2xfZWxiY19ydW5fY29tbWFuZChtdGQpOworCQlyZXR1cm47CisKKwkvKiBSRUFESUQgbXVzdCByZWFkIGFsbCA1IHBvc3NpYmxlIGJ5dGVzIHdoaWxlIENFQiBpcyBhY3RpdmUgKi8KKwljYXNlIE5BTkRfQ01EX1JFQURJRDoKKwkJZGV2X3ZkYmcoY3RybC0+ZGV2LCAiZnNsX2VsYmNfY21kZnVuYzogTkFORF9DTURfUkVBRElELlxuIik7CisKKwkJb3V0X2JlMzIoJmxiYy0+ZmlyLCAoRklSX09QX0NXMCA8PCBGSVJfT1AwX1NISUZUKSB8CisJCSAgICAgICAgICAgICAgICAgICAgKEZJUl9PUF9VQSAgPDwgRklSX09QMV9TSElGVCkgfAorCQkgICAgICAgICAgICAgICAgICAgIChGSVJfT1BfUkJXIDw8IEZJUl9PUDJfU0hJRlQpKTsKKwkJb3V0X2JlMzIoJmxiYy0+ZmNyLCBOQU5EX0NNRF9SRUFESUQgPDwgRkNSX0NNRDBfU0hJRlQpOworCQkvKiA1IGJ5dGVzIGZvciBtYW51ZiwgZGV2aWNlIGFuZCBleHRzICovCisJCW91dF9iZTMyKCZsYmMtPmZiY3IsIDUpOworCQljdHJsLT5yZWFkX2J5dGVzID0gNTsKKwkJY3RybC0+dXNlX21kciA9IDE7CisJCWN0cmwtPm1kciA9IDA7CisKKwkJc2V0X2FkZHIobXRkLCAwLCAwLCAwKTsKKwkJZnNsX2VsYmNfcnVuX2NvbW1hbmQobXRkKTsKKwkJcmV0dXJuOworCisJLyogRVJBU0UxIHN0b3JlcyB0aGUgYmxvY2sgYW5kIHBhZ2UgYWRkcmVzcyAqLworCWNhc2UgTkFORF9DTURfRVJBU0UxOgorCQlkZXZfdmRiZyhjdHJsLT5kZXYsCisJCSAgICAgICAgICJmc2xfZWxiY19jbWRmdW5jOiBOQU5EX0NNRF9FUkFTRTEsICIKKwkJICAgICAgICAgInBhZ2VfYWRkcjogMHgleC5cbiIsIHBhZ2VfYWRkcik7CisJCXNldF9hZGRyKG10ZCwgMCwgcGFnZV9hZGRyLCAwKTsKKwkJcmV0dXJuOworCisJLyogRVJBU0UyIHVzZXMgdGhlIGJsb2NrIGFuZCBwYWdlIGFkZHJlc3MgZnJvbSBFUkFTRTEgKi8KKwljYXNlIE5BTkRfQ01EX0VSQVNFMjoKKwkJZGV2X3ZkYmcoY3RybC0+ZGV2LCAiZnNsX2VsYmNfY21kZnVuYzogTkFORF9DTURfRVJBU0UyLlxuIik7CisKKwkJb3V0X2JlMzIoJmxiYy0+ZmlyLAorCQkgICAgICAgICAoRklSX09QX0NXMCA8PCBGSVJfT1AwX1NISUZUKSB8CisJCSAgICAgICAgIChGSVJfT1BfUEEgIDw8IEZJUl9PUDFfU0hJRlQpIHwKKwkJICAgICAgICAgKEZJUl9PUF9DTTEgPDwgRklSX09QMl9TSElGVCkpOworCisJCW91dF9iZTMyKCZsYmMtPmZjciwKKwkJICAgICAgICAgKE5BTkRfQ01EX0VSQVNFMSA8PCBGQ1JfQ01EMF9TSElGVCkgfAorCQkgICAgICAgICAoTkFORF9DTURfRVJBU0UyIDw8IEZDUl9DTUQxX1NISUZUKSk7CisKKwkJb3V0X2JlMzIoJmxiYy0+ZmJjciwgMCk7CisJCWN0cmwtPnJlYWRfYnl0ZXMgPSAwOworCisJCWZzbF9lbGJjX3J1bl9jb21tYW5kKG10ZCk7CisJCXJldHVybjsKKworCS8qIFNFUUlOIHNldHMgdXAgdGhlIGFkZHIgYnVmZmVyIGFuZCBhbGwgcmVnaXN0ZXJzIGV4Y2VwdCB0aGUgbGVuZ3RoICovCisJY2FzZSBOQU5EX0NNRF9TRVFJTjogeworCQlfX2JlMzIgZmNyOworCQlkZXZfdmRiZyhjdHJsLT5kZXYsCisJCSAgICAgICAgICJmc2xfZWxiY19jbWRmdW5jOiBOQU5EX0NNRF9TRVFJTi9QQUdFX1BST0csICIKKwkJICAgICAgICAgInBhZ2VfYWRkcjogMHgleCwgY29sdW1uOiAweCV4LlxuIiwKKwkJICAgICAgICAgcGFnZV9hZGRyLCBjb2x1bW4pOworCisJCWN0cmwtPmNvbHVtbiA9IGNvbHVtbjsKKwkJY3RybC0+b29iID0gMDsKKworCQlmY3IgPSAoTkFORF9DTURfUEFHRVBST0cgPDwgRkNSX0NNRDFfU0hJRlQpIHwKKwkJICAgICAgKE5BTkRfQ01EX1NFUUlOIDw8IEZDUl9DTUQyX1NISUZUKTsKKworCQlpZiAocHJpdi0+cGFnZV9zaXplKSB7CisJCQlvdXRfYmUzMigmbGJjLT5maXIsCisJCQkgICAgICAgICAoRklSX09QX0NXMCA8PCBGSVJfT1AwX1NISUZUKSB8CisJCQkgICAgICAgICAoRklSX09QX0NBICA8PCBGSVJfT1AxX1NISUZUKSB8CisJCQkgICAgICAgICAoRklSX09QX1BBICA8PCBGSVJfT1AyX1NISUZUKSB8CisJCQkgICAgICAgICAoRklSX09QX1dCICA8PCBGSVJfT1AzX1NISUZUKSB8CisJCQkgICAgICAgICAoRklSX09QX0NXMSA8PCBGSVJfT1A0X1NISUZUKSk7CisKKwkJCWZjciB8PSBOQU5EX0NNRF9SRUFEMCA8PCBGQ1JfQ01EMF9TSElGVDsKKwkJfSBlbHNlIHsKKwkJCW91dF9iZTMyKCZsYmMtPmZpciwKKwkJCSAgICAgICAgIChGSVJfT1BfQ1cwIDw8IEZJUl9PUDBfU0hJRlQpIHwKKwkJCSAgICAgICAgIChGSVJfT1BfQ00yIDw8IEZJUl9PUDFfU0hJRlQpIHwKKwkJCSAgICAgICAgIChGSVJfT1BfQ0EgIDw8IEZJUl9PUDJfU0hJRlQpIHwKKwkJCSAgICAgICAgIChGSVJfT1BfUEEgIDw8IEZJUl9PUDNfU0hJRlQpIHwKKwkJCSAgICAgICAgIChGSVJfT1BfV0IgIDw8IEZJUl9PUDRfU0hJRlQpIHwKKwkJCSAgICAgICAgIChGSVJfT1BfQ1cxIDw8IEZJUl9PUDVfU0hJRlQpKTsKKworCQkJaWYgKGNvbHVtbiA+PSBtdGQtPndyaXRlc2l6ZSkgeworCQkJCS8qIE9PQiBhcmVhIC0tPiBSRUFET09CICovCisJCQkJY29sdW1uIC09IG10ZC0+d3JpdGVzaXplOworCQkJCWZjciB8PSBOQU5EX0NNRF9SRUFET09CIDw8IEZDUl9DTUQwX1NISUZUOworCQkJCWN0cmwtPm9vYiA9IDE7CisJCQl9IGVsc2UgaWYgKGNvbHVtbiA8IDI1NikgeworCQkJCS8qIEZpcnN0IDI1NiBieXRlcyAtLT4gUkVBRDAgKi8KKwkJCQlmY3IgfD0gTkFORF9DTURfUkVBRDAgPDwgRkNSX0NNRDBfU0hJRlQ7CisJCQl9IGVsc2UgeworCQkJCS8qIFNlY29uZCAyNTYgYnl0ZXMgLS0+IFJFQUQxICovCisJCQkJZmNyIHw9IE5BTkRfQ01EX1JFQUQxIDw8IEZDUl9DTUQwX1NISUZUOworCQkJfQorCQl9CisKKwkJb3V0X2JlMzIoJmxiYy0+ZmNyLCBmY3IpOworCQlzZXRfYWRkcihtdGQsIGNvbHVtbiwgcGFnZV9hZGRyLCBjdHJsLT5vb2IpOworCQlyZXR1cm47CisJfQorCisJLyogUEFHRVBST0cgcmV1c2VzIGFsbCBvZiB0aGUgc2V0dXAgZnJvbSBTRVFJTiBhbmQgYWRkcyB0aGUgbGVuZ3RoICovCisJY2FzZSBOQU5EX0NNRF9QQUdFUFJPRzogeworCQlpbnQgZnVsbF9wYWdlOworCQlkZXZfdmRiZyhjdHJsLT5kZXYsCisJCSAgICAgICAgICJmc2xfZWxiY19jbWRmdW5jOiBOQU5EX0NNRF9QQUdFUFJPRyAiCisJCSAgICAgICAgICJ3cml0aW5nICVkIGJ5dGVzLlxuIiwgY3RybC0+aW5kZXgpOworCisJCS8qIGlmIHRoZSB3cml0ZSBkaWQgbm90IHN0YXJ0IGF0IDAgb3IgaXMgbm90IGEgZnVsbCBwYWdlCisJCSAqIHRoZW4gc2V0IHRoZSBleGFjdCBsZW5ndGgsIG90aGVyd2lzZSB1c2UgYSBmdWxsIHBhZ2UKKwkJICogd3JpdGUgc28gdGhlIEhXIGdlbmVyYXRlcyB0aGUgRUNDLgorCQkgKi8KKwkJaWYgKGN0cmwtPm9vYiB8fCBjdHJsLT5jb2x1bW4gIT0gMCB8fAorCQkgICAgY3RybC0+aW5kZXggIT0gbXRkLT53cml0ZXNpemUgKyBtdGQtPm9vYnNpemUpIHsKKwkJCW91dF9iZTMyKCZsYmMtPmZiY3IsIGN0cmwtPmluZGV4KTsKKwkJCWZ1bGxfcGFnZSA9IDA7CisJCX0gZWxzZSB7CisJCQlvdXRfYmUzMigmbGJjLT5mYmNyLCAwKTsKKwkJCWZ1bGxfcGFnZSA9IDE7CisJCX0KKworCQlmc2xfZWxiY19ydW5fY29tbWFuZChtdGQpOworCisJCS8qIFJlYWQgYmFjayB0aGUgcGFnZSBpbiBvcmRlciB0byBmaWxsIGluIHRoZSBFQ0MgZm9yIHRoZQorCQkgKiBjYWxsZXIuICBJcyB0aGlzIHJlYWxseSBuZWVkZWQ/CisJCSAqLworCQlpZiAoZnVsbF9wYWdlICYmIGN0cmwtPm9vYl9wb2kpIHsKKwkJCW91dF9iZTMyKCZsYmMtPmZiY3IsIDMpOworCQkJc2V0X2FkZHIobXRkLCA2LCBwYWdlX2FkZHIsIDEpOworCisJCQljdHJsLT5yZWFkX2J5dGVzID0gbXRkLT53cml0ZXNpemUgKyA5OworCisJCQlmc2xfZWxiY19kb19yZWFkKGNoaXAsIDEpOworCQkJZnNsX2VsYmNfcnVuX2NvbW1hbmQobXRkKTsKKworCQkJbWVtY3B5X2Zyb21pbyhjdHJsLT5vb2JfcG9pICsgNiwKKwkJCSAgICAgICAgICAgICAgJmN0cmwtPmFkZHJbY3RybC0+aW5kZXhdLCAzKTsKKwkJCWN0cmwtPmluZGV4ICs9IDM7CisJCX0KKworCQljdHJsLT5vb2JfcG9pID0gTlVMTDsKKwkJcmV0dXJuOworCX0KKworCS8qIENNRF9TVEFUVVMgbXVzdCByZWFkIHRoZSBzdGF0dXMgYnl0ZSB3aGlsZSBDRUIgaXMgYWN0aXZlICovCisJLyogTm90ZSAtIGl0IGRvZXMgbm90IHdhaXQgZm9yIHRoZSByZWFkeSBsaW5lICovCisJY2FzZSBOQU5EX0NNRF9TVEFUVVM6CisJCW91dF9iZTMyKCZsYmMtPmZpciwKKwkJICAgICAgICAgKEZJUl9PUF9DTTAgPDwgRklSX09QMF9TSElGVCkgfAorCQkgICAgICAgICAoRklSX09QX1JCVyA8PCBGSVJfT1AxX1NISUZUKSk7CisJCW91dF9iZTMyKCZsYmMtPmZjciwgTkFORF9DTURfU1RBVFVTIDw8IEZDUl9DTUQwX1NISUZUKTsKKwkJb3V0X2JlMzIoJmxiYy0+ZmJjciwgMSk7CisJCXNldF9hZGRyKG10ZCwgMCwgMCwgMCk7CisJCWN0cmwtPnJlYWRfYnl0ZXMgPSAxOworCisJCWZzbF9lbGJjX3J1bl9jb21tYW5kKG10ZCk7CisKKwkJLyogVGhlIGNoaXAgYWx3YXlzIHNlZW1zIHRvIHJlcG9ydCB0aGF0IGl0IGlzCisJCSAqIHdyaXRlLXByb3RlY3RlZCwgZXZlbiB3aGVuIGl0IGlzIG5vdC4KKwkJICovCisJCXNldGJpdHM4KGN0cmwtPmFkZHIsIE5BTkRfU1RBVFVTX1dQKTsKKwkJcmV0dXJuOworCisJLyogUkVTRVQgd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgcmVhZHkgbGluZSAqLworCWNhc2UgTkFORF9DTURfUkVTRVQ6CisJCWRldl9kYmcoY3RybC0+ZGV2LCAiZnNsX2VsYmNfY21kZnVuYzogTkFORF9DTURfUkVTRVQuXG4iKTsKKwkJb3V0X2JlMzIoJmxiYy0+ZmlyLCBGSVJfT1BfQ00wIDw8IEZJUl9PUDBfU0hJRlQpOworCQlvdXRfYmUzMigmbGJjLT5mY3IsIE5BTkRfQ01EX1JFU0VUIDw8IEZDUl9DTUQwX1NISUZUKTsKKwkJZnNsX2VsYmNfcnVuX2NvbW1hbmQobXRkKTsKKwkJcmV0dXJuOworCisJZGVmYXVsdDoKKwkJZGV2X2VycihjdHJsLT5kZXYsCisJCSAgICAgICAgImZzbF9lbGJjX2NtZGZ1bmM6IGVycm9yLCB1bnN1cHBvcnRlZCBjb21tYW5kIDB4JXguXG4iLAorCQkgICAgICAgIGNvbW1hbmQpOworCX0KK30KKworc3RhdGljIHZvaWQgZnNsX2VsYmNfc2VsZWN0X2NoaXAoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBjaGlwKQoreworCS8qIFRoZSBoYXJkd2FyZSBkb2VzIG5vdCBzZWVtIHRvIHN1cHBvcnQgbXVsdGlwbGUKKwkgKiBjaGlwcyBwZXIgYmFuay4KKwkgKi8KK30KKworLyoKKyAqIFdyaXRlIGJ1ZiB0byB0aGUgRkNNIENvbnRyb2xsZXIgRGF0YSBCdWZmZXIKKyAqLworc3RhdGljIHZvaWQgZnNsX2VsYmNfd3JpdGVfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCB1OCAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7CisJc3RydWN0IGZzbF9lbGJjX210ZCAqcHJpdiA9IGNoaXAtPnByaXY7CisJc3RydWN0IGZzbF9lbGJjX2N0cmwgKmN0cmwgPSBwcml2LT5jdHJsOworCXVuc2lnbmVkIGludCBidWZzaXplID0gbXRkLT53cml0ZXNpemUgKyBtdGQtPm9vYnNpemU7CisKKwlpZiAobGVuIDwgMCkgeworCQlkZXZfZXJyKGN0cmwtPmRldiwgIndyaXRlX2J1ZiBvZiAlZCBieXRlcyIsIGxlbik7CisJCWN0cmwtPnN0YXR1cyA9IDA7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKHVuc2lnbmVkIGludClsZW4gPiBidWZzaXplIC0gY3RybC0+aW5kZXgpIHsKKwkJZGV2X2VycihjdHJsLT5kZXYsCisJCSAgICAgICAgIndyaXRlX2J1ZiBiZXlvbmQgZW5kIG9mIGJ1ZmZlciAiCisJCSAgICAgICAgIiglZCByZXF1ZXN0ZWQsICV1IGF2YWlsYWJsZSlcbiIsCisJCSAgICAgICAgbGVuLCBidWZzaXplIC0gY3RybC0+aW5kZXgpOworCQlsZW4gPSBidWZzaXplIC0gY3RybC0+aW5kZXg7CisJfQorCisJbWVtY3B5X3RvaW8oJmN0cmwtPmFkZHJbY3RybC0+aW5kZXhdLCBidWYsIGxlbik7CisJY3RybC0+aW5kZXggKz0gbGVuOworfQorCisvKgorICogcmVhZCBhIGJ5dGUgZnJvbSBlaXRoZXIgdGhlIEZDTSBoYXJkd2FyZSBidWZmZXIgaWYgaXQgaGFzIGFueSBkYXRhIGxlZnQKKyAqIG90aGVyd2lzZSBpc3N1ZSBhIGNvbW1hbmQgdG8gcmVhZCBhIHNpbmdsZSBieXRlLgorICovCitzdGF0aWMgdTggZnNsX2VsYmNfcmVhZF9ieXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7CisJc3RydWN0IGZzbF9lbGJjX210ZCAqcHJpdiA9IGNoaXAtPnByaXY7CisJc3RydWN0IGZzbF9lbGJjX2N0cmwgKmN0cmwgPSBwcml2LT5jdHJsOworCisJLyogSWYgdGhlcmUgYXJlIHN0aWxsIGJ5dGVzIGluIHRoZSBGQ00sIHRoZW4gdXNlIHRoZSBuZXh0IGJ5dGUuICovCisJaWYgKGN0cmwtPmluZGV4IDwgY3RybC0+cmVhZF9ieXRlcykKKwkJcmV0dXJuIGluXzgoJmN0cmwtPmFkZHJbY3RybC0+aW5kZXgrK10pOworCisJZGV2X2VycihjdHJsLT5kZXYsICJyZWFkX2J5dGUgYmV5b25kIGVuZCBvZiBidWZmZXJcbiIpOworCXJldHVybiBFUlJfQllURTsKK30KKworLyoKKyAqIFJlYWQgZnJvbSB0aGUgRkNNIENvbnRyb2xsZXIgRGF0YSBCdWZmZXIKKyAqLworc3RhdGljIHZvaWQgZnNsX2VsYmNfcmVhZF9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsIHU4ICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgZnNsX2VsYmNfbXRkICpwcml2ID0gY2hpcC0+cHJpdjsKKwlzdHJ1Y3QgZnNsX2VsYmNfY3RybCAqY3RybCA9IHByaXYtPmN0cmw7CisJaW50IGF2YWlsOworCisJaWYgKGxlbiA8IDApCisJCXJldHVybjsKKworCWF2YWlsID0gbWluKCh1bnNpZ25lZCBpbnQpbGVuLCBjdHJsLT5yZWFkX2J5dGVzIC0gY3RybC0+aW5kZXgpOworCW1lbWNweV9mcm9taW8oYnVmLCAmY3RybC0+YWRkcltjdHJsLT5pbmRleF0sIGF2YWlsKTsKKwljdHJsLT5pbmRleCArPSBhdmFpbDsKKworCWlmIChsZW4gPiBhdmFpbCkKKwkJZGV2X2VycihjdHJsLT5kZXYsCisJCSAgICAgICAgInJlYWRfYnVmIGJleW9uZCBlbmQgb2YgYnVmZmVyICIKKwkJICAgICAgICAiKCVkIHJlcXVlc3RlZCwgJWQgYXZhaWxhYmxlKVxuIiwKKwkJICAgICAgICBsZW4sIGF2YWlsKTsKK30KKworLyoKKyAqIFZlcmlmeSBidWZmZXIgYWdhaW5zdCB0aGUgRkNNIENvbnRyb2xsZXIgRGF0YSBCdWZmZXIKKyAqLworc3RhdGljIGludCBmc2xfZWxiY192ZXJpZnlfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCB1X2NoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OworCXN0cnVjdCBmc2xfZWxiY19tdGQgKnByaXYgPSBjaGlwLT5wcml2OworCXN0cnVjdCBmc2xfZWxiY19jdHJsICpjdHJsID0gcHJpdi0+Y3RybDsKKwlpbnQgaTsKKworCWlmIChsZW4gPCAwKSB7CisJCWRldl9lcnIoY3RybC0+ZGV2LCAid3JpdGVfYnVmIG9mICVkIGJ5dGVzIiwgbGVuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCh1bnNpZ25lZCBpbnQpbGVuID4gY3RybC0+cmVhZF9ieXRlcyAtIGN0cmwtPmluZGV4KSB7CisJCWRldl9lcnIoY3RybC0+ZGV2LAorCQkgICAgICAgICJ2ZXJpZnlfYnVmIGJleW9uZCBlbmQgb2YgYnVmZmVyICIKKwkJICAgICAgICAiKCVkIHJlcXVlc3RlZCwgJXUgYXZhaWxhYmxlKVxuIiwKKwkJICAgICAgICBsZW4sIGN0cmwtPnJlYWRfYnl0ZXMgLSBjdHJsLT5pbmRleCk7CisKKwkJY3RybC0+aW5kZXggPSBjdHJsLT5yZWFkX2J5dGVzOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCWlmIChpbl84KCZjdHJsLT5hZGRyW2N0cmwtPmluZGV4ICsgaV0pICE9IGJ1ZltpXSkKKwkJCWJyZWFrOworCisJY3RybC0+aW5kZXggKz0gbGVuOworCXJldHVybiBpID09IGxlbiAmJiBjdHJsLT5zdGF0dXMgPT0gTFRFU1JfQ0MgPyAwIDogLUVJTzsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgUHJvZ3JhbSBhbmQgRXJhc2UgT3BlcmF0aW9ucyB0bworICogY2hlY2sgZm9yIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBmc2xfZWxiY193YWl0KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBmc2xfZWxiY19tdGQgKnByaXYgPSBjaGlwLT5wcml2OworCXN0cnVjdCBmc2xfZWxiY19jdHJsICpjdHJsID0gcHJpdi0+Y3RybDsKKwlzdHJ1Y3QgZWxiY19yZWdzIF9faW9tZW0gKmxiYyA9IGN0cmwtPnJlZ3M7CisKKwlpZiAoY3RybC0+c3RhdHVzICE9IExURVNSX0NDKQorCQlyZXR1cm4gTkFORF9TVEFUVVNfRkFJTDsKKworCS8qIFVzZSBSRUFEX1NUQVRVUyBjb21tYW5kLCBidXQgd2FpdCBmb3IgdGhlIGRldmljZSB0byBiZSByZWFkeSAqLworCWN0cmwtPnVzZV9tZHIgPSAwOworCW91dF9iZTMyKCZsYmMtPmZpciwKKwkgICAgICAgICAoRklSX09QX0NXMCA8PCBGSVJfT1AwX1NISUZUKSB8CisJICAgICAgICAgKEZJUl9PUF9SQlcgPDwgRklSX09QMV9TSElGVCkpOworCW91dF9iZTMyKCZsYmMtPmZjciwgTkFORF9DTURfU1RBVFVTIDw8IEZDUl9DTUQwX1NISUZUKTsKKwlvdXRfYmUzMigmbGJjLT5mYmNyLCAxKTsKKwlzZXRfYWRkcihtdGQsIDAsIDAsIDApOworCWN0cmwtPnJlYWRfYnl0ZXMgPSAxOworCisJZnNsX2VsYmNfcnVuX2NvbW1hbmQobXRkKTsKKworCWlmIChjdHJsLT5zdGF0dXMgIT0gTFRFU1JfQ0MpCisJCXJldHVybiBOQU5EX1NUQVRVU19GQUlMOworCisJLyogVGhlIGNoaXAgYWx3YXlzIHNlZW1zIHRvIHJlcG9ydCB0aGF0IGl0IGlzCisJICogd3JpdGUtcHJvdGVjdGVkLCBldmVuIHdoZW4gaXQgaXMgbm90LgorCSAqLworCXNldGJpdHM4KGN0cmwtPmFkZHIsIE5BTkRfU1RBVFVTX1dQKTsKKwlyZXR1cm4gZnNsX2VsYmNfcmVhZF9ieXRlKG10ZCk7Cit9CisKK3N0YXRpYyBpbnQgZnNsX2VsYmNfY2hpcF9pbml0X3RhaWwoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgZnNsX2VsYmNfbXRkICpwcml2ID0gY2hpcC0+cHJpdjsKKwlzdHJ1Y3QgZnNsX2VsYmNfY3RybCAqY3RybCA9IHByaXYtPmN0cmw7CisJc3RydWN0IGVsYmNfcmVncyBfX2lvbWVtICpsYmMgPSBjdHJsLT5yZWdzOworCXVuc2lnbmVkIGludCBhbDsKKworCS8qIGNhbGN1bGF0ZSBGTVIgQWRkcmVzcyBMZW5ndGggZmllbGQgKi8KKwlhbCA9IDA7CisJaWYgKGNoaXAtPnBhZ2VtYXNrICYgMHhmZmZmMDAwMCkKKwkJYWwrKzsKKwlpZiAoY2hpcC0+cGFnZW1hc2sgJiAweGZmMDAwMDAwKQorCQlhbCsrOworCisJLyogYWRkIHRvIEVDQ00gbW9kZSBzZXQgaW4gZnNsX2VsYmNfaW5pdCAqLworCXByaXYtPmZtciB8PSAoMTIgPDwgRk1SX0NXVE9fU0hJRlQpIHwgIC8qIFRpbWVvdXQgPiAxMiBtcyAqLworCSAgICAgICAgICAgICAoYWwgPDwgRk1SX0FMX1NISUZUKTsKKworCWRldl9kYmcoY3RybC0+ZGV2LCAiZnNsX2VsYmNfaW5pdDogbmFuZC0+bnVtY2hpcHMgPSAlZFxuIiwKKwkgICAgICAgIGNoaXAtPm51bWNoaXBzKTsKKwlkZXZfZGJnKGN0cmwtPmRldiwgImZzbF9lbGJjX2luaXQ6IG5hbmQtPmNoaXBzaXplID0gJWxkXG4iLAorCSAgICAgICAgY2hpcC0+Y2hpcHNpemUpOworCWRldl9kYmcoY3RybC0+ZGV2LCAiZnNsX2VsYmNfaW5pdDogbmFuZC0+cGFnZW1hc2sgPSAlOHhcbiIsCisJICAgICAgICBjaGlwLT5wYWdlbWFzayk7CisJZGV2X2RiZyhjdHJsLT5kZXYsICJmc2xfZWxiY19pbml0OiBuYW5kLT5jaGlwX2RlbGF5ID0gJWRcbiIsCisJICAgICAgICBjaGlwLT5jaGlwX2RlbGF5KTsKKwlkZXZfZGJnKGN0cmwtPmRldiwgImZzbF9lbGJjX2luaXQ6IG5hbmQtPmJhZGJsb2NrcG9zID0gJWRcbiIsCisJICAgICAgICBjaGlwLT5iYWRibG9ja3Bvcyk7CisJZGV2X2RiZyhjdHJsLT5kZXYsICJmc2xfZWxiY19pbml0OiBuYW5kLT5jaGlwX3NoaWZ0ID0gJWRcbiIsCisJICAgICAgICBjaGlwLT5jaGlwX3NoaWZ0KTsKKwlkZXZfZGJnKGN0cmwtPmRldiwgImZzbF9lbGJjX2luaXQ6IG5hbmQtPnBhZ2Vfc2hpZnQgPSAlZFxuIiwKKwkgICAgICAgIGNoaXAtPnBhZ2Vfc2hpZnQpOworCWRldl9kYmcoY3RybC0+ZGV2LCAiZnNsX2VsYmNfaW5pdDogbmFuZC0+cGh5c19lcmFzZV9zaGlmdCA9ICVkXG4iLAorCSAgICAgICAgY2hpcC0+cGh5c19lcmFzZV9zaGlmdCk7CisJZGV2X2RiZyhjdHJsLT5kZXYsICJmc2xfZWxiY19pbml0OiBuYW5kLT5lY2NsYXlvdXQgPSAlcFxuIiwKKwkgICAgICAgIGNoaXAtPmVjY2xheW91dCk7CisJZGV2X2RiZyhjdHJsLT5kZXYsICJmc2xfZWxiY19pbml0OiBuYW5kLT5lY2MubW9kZSA9ICVkXG4iLAorCSAgICAgICAgY2hpcC0+ZWNjLm1vZGUpOworCWRldl9kYmcoY3RybC0+ZGV2LCAiZnNsX2VsYmNfaW5pdDogbmFuZC0+ZWNjLnN0ZXBzID0gJWRcbiIsCisJICAgICAgICBjaGlwLT5lY2Muc3RlcHMpOworCWRldl9kYmcoY3RybC0+ZGV2LCAiZnNsX2VsYmNfaW5pdDogbmFuZC0+ZWNjLmJ5dGVzID0gJWRcbiIsCisJICAgICAgICBjaGlwLT5lY2MuYnl0ZXMpOworCWRldl9kYmcoY3RybC0+ZGV2LCAiZnNsX2VsYmNfaW5pdDogbmFuZC0+ZWNjLnRvdGFsID0gJWRcbiIsCisJICAgICAgICBjaGlwLT5lY2MudG90YWwpOworCWRldl9kYmcoY3RybC0+ZGV2LCAiZnNsX2VsYmNfaW5pdDogbmFuZC0+ZWNjLmxheW91dCA9ICVwXG4iLAorCSAgICAgICAgY2hpcC0+ZWNjLmxheW91dCk7CisJZGV2X2RiZyhjdHJsLT5kZXYsICJmc2xfZWxiY19pbml0OiBtdGQtPmZsYWdzID0gJTA4eFxuIiwgbXRkLT5mbGFncyk7CisJZGV2X2RiZyhjdHJsLT5kZXYsICJmc2xfZWxiY19pbml0OiBtdGQtPnNpemUgPSAlZFxuIiwgbXRkLT5zaXplKTsKKwlkZXZfZGJnKGN0cmwtPmRldiwgImZzbF9lbGJjX2luaXQ6IG10ZC0+ZXJhc2VzaXplID0gJWRcbiIsCisJICAgICAgICBtdGQtPmVyYXNlc2l6ZSk7CisJZGV2X2RiZyhjdHJsLT5kZXYsICJmc2xfZWxiY19pbml0OiBtdGQtPndyaXRlc2l6ZSA9ICVkXG4iLAorCSAgICAgICAgbXRkLT53cml0ZXNpemUpOworCWRldl9kYmcoY3RybC0+ZGV2LCAiZnNsX2VsYmNfaW5pdDogbXRkLT5vb2JzaXplID0gJWRcbiIsCisJICAgICAgICBtdGQtPm9vYnNpemUpOworCisJLyogYWRqdXN0IE9wdGlvbiBSZWdpc3RlciBhbmQgRUNDIHRvIG1hdGNoIEZsYXNoIHBhZ2Ugc2l6ZSAqLworCWlmIChtdGQtPndyaXRlc2l6ZSA9PSA1MTIpIHsKKwkJcHJpdi0+cGFnZV9zaXplID0gMDsKKwkJY2xyYml0czMyKCZsYmMtPmJhbmtbcHJpdi0+YmFua10ub3IsIH5PUl9GQ01fUEdTKTsKKwl9IGVsc2UgaWYgKG10ZC0+d3JpdGVzaXplID09IDIwNDgpIHsKKwkJcHJpdi0+cGFnZV9zaXplID0gMTsKKwkJc2V0Yml0czMyKCZsYmMtPmJhbmtbcHJpdi0+YmFua10ub3IsIE9SX0ZDTV9QR1MpOworCQkvKiBhZGp1c3QgZWNjIHNldHVwIGlmIG5lZWRlZCAqLworCQlpZiAoKGluX2JlMzIoJmxiYy0+YmFua1twcml2LT5iYW5rXS5icikgJiBCUl9ERUNDKSA9PQorCQkgICAgQlJfREVDQ19DSEtfR0VOKSB7CisJCQljaGlwLT5lY2Muc2l6ZSA9IDUxMjsKKwkJCWNoaXAtPmVjYy5sYXlvdXQgPSAocHJpdi0+Zm1yICYgRk1SX0VDQ00pID8KKwkJCSAgICAgICAgICAgICAgICAgICAmZnNsX2VsYmNfb29iX2xwX2VjY20xIDoKKwkJCSAgICAgICAgICAgICAgICAgICAmZnNsX2VsYmNfb29iX2xwX2VjY20wOworCQkJbXRkLT5lY2NsYXlvdXQgPSBjaGlwLT5lY2MubGF5b3V0OworCQkJbXRkLT5vb2JhdmFpbCA9IGNoaXAtPmVjYy5sYXlvdXQtPm9vYmF2YWlsOworCQl9CisJfSBlbHNlIHsKKwkJZGV2X2VycihjdHJsLT5kZXYsCisJCSAgICAgICAgImZzbF9lbGJjX2luaXQ6IHBhZ2Ugc2l6ZSAlZCBpcyBub3Qgc3VwcG9ydGVkXG4iLAorCQkgICAgICAgIG10ZC0+d3JpdGVzaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFRoZSBkZWZhdWx0IHUtYm9vdCBjb25maWd1cmF0aW9uIG9uIE1QQzgzMTNFUkRCIGNhdXNlcyBlcnJvcnM7CisJICogbW9yZSBkZWxheSBpcyBuZWVkZWQuICBUaGlzIHNob3VsZCBiZSBzYWZlIGZvciBvdGhlciBib2FyZHMKKwkgKiBhcyB3ZWxsLgorCSAqLworCXNldGJpdHMzMigmbGJjLT5iYW5rW3ByaXYtPmJhbmtdLm9yLCAweDcwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmc2xfZWxiY19yZWFkX3BhZ2Uoc3RydWN0IG10ZF9pbmZvICptdGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYnVmKQoreworCWZzbF9lbGJjX3JlYWRfYnVmKG10ZCwgYnVmLCBtdGQtPndyaXRlc2l6ZSk7CisJZnNsX2VsYmNfcmVhZF9idWYobXRkLCBjaGlwLT5vb2JfcG9pLCBtdGQtPm9vYnNpemUpOworCisJaWYgKGZzbF9lbGJjX3dhaXQobXRkLCBjaGlwKSAmIE5BTkRfU1RBVFVTX0ZBSUwpCisJCW10ZC0+ZWNjX3N0YXRzLmZhaWxlZCsrOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEVDQyB3aWxsIGJlIGNhbGN1bGF0ZWQgYXV0b21hdGljYWxseSwgYW5kIGVycm9ycyB3aWxsIGJlIGRldGVjdGVkIGluCisgKiB3YWl0ZnVuYy4KKyAqLworc3RhdGljIHZvaWQgZnNsX2VsYmNfd3JpdGVfcGFnZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmKQoreworCXN0cnVjdCBmc2xfZWxiY19tdGQgKnByaXYgPSBjaGlwLT5wcml2OworCXN0cnVjdCBmc2xfZWxiY19jdHJsICpjdHJsID0gcHJpdi0+Y3RybDsKKworCWZzbF9lbGJjX3dyaXRlX2J1ZihtdGQsIGJ1ZiwgbXRkLT53cml0ZXNpemUpOworCWZzbF9lbGJjX3dyaXRlX2J1ZihtdGQsIGNoaXAtPm9vYl9wb2ksIG10ZC0+b29ic2l6ZSk7CisKKwljdHJsLT5vb2JfcG9pID0gY2hpcC0+b29iX3BvaTsKK30KKworc3RhdGljIGludCBmc2xfZWxiY19jaGlwX2luaXQoc3RydWN0IGZzbF9lbGJjX210ZCAqcHJpdikKK3sKKwlzdHJ1Y3QgZnNsX2VsYmNfY3RybCAqY3RybCA9IHByaXYtPmN0cmw7CisJc3RydWN0IGVsYmNfcmVncyBfX2lvbWVtICpsYmMgPSBjdHJsLT5yZWdzOworCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSAmcHJpdi0+Y2hpcDsKKworCWRldl9kYmcocHJpdi0+ZGV2LCAiZUxCQyBTZXQgSW5mb3JtYXRpb24gZm9yIGJhbmsgJWRcbiIsIHByaXYtPmJhbmspOworCisJLyogRmlsbCBpbiBmc2xfZWxiY19tdGQgc3RydWN0dXJlICovCisJcHJpdi0+bXRkLnByaXYgPSBjaGlwOworCXByaXYtPm10ZC5vd25lciA9IFRISVNfTU9EVUxFOworCXByaXYtPmZtciA9IDA7IC8qIHJlc3QgZmlsbGVkIGluIGxhdGVyICovCisKKwkvKiBmaWxsIGluIG5hbmRfY2hpcCBzdHJ1Y3R1cmUgKi8KKwkvKiBzZXQgdXAgZnVuY3Rpb24gY2FsbCB0YWJsZSAqLworCWNoaXAtPnJlYWRfYnl0ZSA9IGZzbF9lbGJjX3JlYWRfYnl0ZTsKKwljaGlwLT53cml0ZV9idWYgPSBmc2xfZWxiY193cml0ZV9idWY7CisJY2hpcC0+cmVhZF9idWYgPSBmc2xfZWxiY19yZWFkX2J1ZjsKKwljaGlwLT52ZXJpZnlfYnVmID0gZnNsX2VsYmNfdmVyaWZ5X2J1ZjsKKwljaGlwLT5zZWxlY3RfY2hpcCA9IGZzbF9lbGJjX3NlbGVjdF9jaGlwOworCWNoaXAtPmNtZGZ1bmMgPSBmc2xfZWxiY19jbWRmdW5jOworCWNoaXAtPndhaXRmdW5jID0gZnNsX2VsYmNfd2FpdDsKKworCS8qIHNldCB1cCBuYW5kIG9wdGlvbnMgKi8KKwljaGlwLT5vcHRpb25zID0gTkFORF9OT19SRUFEUkRZIHwgTkFORF9OT19BVVRPSU5DUjsKKworCWNoaXAtPmNvbnRyb2xsZXIgPSAmY3RybC0+Y29udHJvbGxlcjsKKwljaGlwLT5wcml2ID0gcHJpdjsKKworCWNoaXAtPmVjYy5yZWFkX3BhZ2UgPSBmc2xfZWxiY19yZWFkX3BhZ2U7CisJY2hpcC0+ZWNjLndyaXRlX3BhZ2UgPSBmc2xfZWxiY193cml0ZV9wYWdlOworCisJLyogSWYgQ1MgQmFzZSBSZWdpc3RlciBzZWxlY3RzIGZ1bGwgaGFyZHdhcmUgRUNDIHRoZW4gdXNlIGl0ICovCisJaWYgKChpbl9iZTMyKCZsYmMtPmJhbmtbcHJpdi0+YmFua10uYnIpICYgQlJfREVDQykgPT0KKwkgICAgQlJfREVDQ19DSEtfR0VOKSB7CisJCWNoaXAtPmVjYy5tb2RlID0gTkFORF9FQ0NfSFc7CisJCS8qIHB1dCBpbiBzbWFsbCBwYWdlIHNldHRpbmdzIGFuZCBhZGp1c3QgbGF0ZXIgaWYgbmVlZGVkICovCisJCWNoaXAtPmVjYy5sYXlvdXQgPSAocHJpdi0+Zm1yICYgRk1SX0VDQ00pID8KKwkJCQkmZnNsX2VsYmNfb29iX3NwX2VjY20xIDogJmZzbF9lbGJjX29vYl9zcF9lY2NtMDsKKwkJY2hpcC0+ZWNjLnNpemUgPSA1MTI7CisJCWNoaXAtPmVjYy5ieXRlcyA9IDM7CisJfSBlbHNlIHsKKwkJLyogb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBkZWZhdWx0IHNvZnR3YXJlIEVDQyAqLworCQljaGlwLT5lY2MubW9kZSA9IE5BTkRfRUNDX1NPRlQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnNsX2VsYmNfY2hpcF9yZW1vdmUoc3RydWN0IGZzbF9lbGJjX210ZCAqcHJpdikKK3sKKwlzdHJ1Y3QgZnNsX2VsYmNfY3RybCAqY3RybCA9IHByaXYtPmN0cmw7CisKKwluYW5kX3JlbGVhc2UoJnByaXYtPm10ZCk7CisKKwlpZiAocHJpdi0+dmJhc2UpCisJCWlvdW5tYXAocHJpdi0+dmJhc2UpOworCisJY3RybC0+Y2hpcHNbcHJpdi0+YmFua10gPSBOVUxMOworCWtmcmVlKHByaXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnNsX2VsYmNfY2hpcF9wcm9iZShzdHJ1Y3QgZnNsX2VsYmNfY3RybCAqY3RybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCit7CisJc3RydWN0IGVsYmNfcmVncyBfX2lvbWVtICpsYmMgPSBjdHJsLT5yZWdzOworCXN0cnVjdCBmc2xfZWxiY19tdGQgKnByaXY7CisJc3RydWN0IHJlc291cmNlIHJlczsKKyNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKKwlzdGF0aWMgY29uc3QgY2hhciAqcGFydF9wcm9iZV90eXBlc1tdCisJCT0geyAiY21kbGluZXBhcnQiLCAiUmVkQm9vdCIsIE5VTEwgfTsKKwlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7CisjZW5kaWYKKwlpbnQgcmV0OworCWludCBiYW5rOworCisJLyogZ2V0LCBhbGxvY2F0ZSBhbmQgbWFwIHRoZSBtZW1vcnkgcmVzb3VyY2UgKi8KKwlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5vZGUsIDAsICZyZXMpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihjdHJsLT5kZXYsICJmYWlsZWQgdG8gZ2V0IHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBmaW5kIHdoaWNoIGNoaXAgc2VsZWN0IGl0IGlzIGNvbm5lY3RlZCB0byAqLworCWZvciAoYmFuayA9IDA7IGJhbmsgPCBNQVhfQkFOS1M7IGJhbmsrKykKKwkJaWYgKChpbl9iZTMyKCZsYmMtPmJhbmtbYmFua10uYnIpICYgQlJfVikgJiYKKwkJICAgIChpbl9iZTMyKCZsYmMtPmJhbmtbYmFua10uYnIpICYgQlJfTVNFTCkgPT0gQlJfTVNfRkNNICYmCisJCSAgICAoaW5fYmUzMigmbGJjLT5iYW5rW2JhbmtdLmJyKSAmCisJCSAgICAgaW5fYmUzMigmbGJjLT5iYW5rW2JhbmtdLm9yKSAmIEJSX0JBKQorCQkgICAgID09IHJlcy5zdGFydCkKKwkJCWJyZWFrOworCisJaWYgKGJhbmsgPj0gTUFYX0JBTktTKSB7CisJCWRldl9lcnIoY3RybC0+ZGV2LCAiYWRkcmVzcyBkaWQgbm90IG1hdGNoIGFueSBjaGlwIHNlbGVjdHNcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwcml2ID0ga3phbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJY3RybC0+Y2hpcHNbYmFua10gPSBwcml2OworCXByaXYtPmJhbmsgPSBiYW5rOworCXByaXYtPmN0cmwgPSBjdHJsOworCXByaXYtPmRldiA9IGN0cmwtPmRldjsKKworCXByaXYtPnZiYXNlID0gaW9yZW1hcChyZXMuc3RhcnQsIHJlcy5lbmQgLSByZXMuc3RhcnQgKyAxKTsKKwlpZiAoIXByaXYtPnZiYXNlKSB7CisJCWRldl9lcnIoY3RybC0+ZGV2LCAiZmFpbGVkIHRvIG1hcCBjaGlwIHJlZ2lvblxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IGZzbF9lbGJjX2NoaXBfaW5pdChwcml2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IG5hbmRfc2Nhbl9pZGVudCgmcHJpdi0+bXRkLCAxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IGZzbF9lbGJjX2NoaXBfaW5pdF90YWlsKCZwcml2LT5tdGQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0gbmFuZF9zY2FuX3RhaWwoJnByaXYtPm10ZCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKyNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKKwkvKiBGaXJzdCBsb29rIGZvciBSZWRCb290IHRhYmxlIG9yIHBhcnRpdGlvbnMgb24gdGhlIGNvbW1hbmQKKwkgKiBsaW5lLCB0aGVzZSB0YWtlIHByZWNlZGVuY2Ugb3ZlciBkZXZpY2UgdHJlZSBpbmZvcm1hdGlvbiAqLworCXJldCA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKCZwcml2LT5tdGQsIHBhcnRfcHJvYmVfdHlwZXMsICZwYXJ0cywgMCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyOworCisjaWZkZWYgQ09ORklHX01URF9PRl9QQVJUUworCWlmIChyZXQgPT0gMCkgeworCQlyZXQgPSBvZl9tdGRfcGFyc2VfcGFydGl0aW9ucyhwcml2LT5kZXYsICZwcml2LT5tdGQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUsICZwYXJ0cyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnI7CisJfQorI2VuZGlmCisKKwlpZiAocmV0ID4gMCkKKwkJYWRkX210ZF9wYXJ0aXRpb25zKCZwcml2LT5tdGQsIHBhcnRzLCByZXQpOworCWVsc2UKKyNlbmRpZgorCQlhZGRfbXRkX2RldmljZSgmcHJpdi0+bXRkKTsKKworCXByaW50ayhLRVJOX0lORk8gImVMQkMgTkFORCBkZXZpY2UgYXQgMHglengsIGJhbmsgJWRcbiIsCisJICAgICAgIHJlcy5zdGFydCwgcHJpdi0+YmFuayk7CisJcmV0dXJuIDA7CisKK2VycjoKKwlmc2xfZWxiY19jaGlwX3JlbW92ZShwcml2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBmc2xfZWxiY19jdHJsX2luaXQoc3RydWN0IGZzbF9lbGJjX2N0cmwgKmN0cmwpCit7CisJc3RydWN0IGVsYmNfcmVncyBfX2lvbWVtICpsYmMgPSBjdHJsLT5yZWdzOworCisJLyogY2xlYXIgZXZlbnQgcmVnaXN0ZXJzICovCisJc2V0Yml0czMyKCZsYmMtPmx0ZXNyLCBMVEVTUl9OQU5EX01BU0spOworCW91dF9iZTMyKCZsYmMtPmx0ZWF0ciwgMCk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBmb3IgYW55IGRldGVjdGVkIGV2ZW50cyAqLworCW91dF9iZTMyKCZsYmMtPmx0ZWlyLCBMVEVTUl9OQU5EX01BU0spOworCisJY3RybC0+cmVhZF9ieXRlcyA9IDA7CisJY3RybC0+aW5kZXggPSAwOworCWN0cmwtPmFkZHIgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGZzbF9lbGJjX2N0cmxfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2KQoreworCXN0cnVjdCBmc2xfZWxiY19jdHJsICpjdHJsID0gZGV2X2dldF9kcnZkYXRhKCZvZmRldi0+ZGV2KTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQkFOS1M7IGkrKykKKwkJaWYgKGN0cmwtPmNoaXBzW2ldKQorCQkJZnNsX2VsYmNfY2hpcF9yZW1vdmUoY3RybC0+Y2hpcHNbaV0pOworCisJaWYgKGN0cmwtPmlycSkKKwkJZnJlZV9pcnEoY3RybC0+aXJxLCBjdHJsKTsKKworCWlmIChjdHJsLT5yZWdzKQorCQlpb3VubWFwKGN0cmwtPnJlZ3MpOworCisJZGV2X3NldF9kcnZkYXRhKCZvZmRldi0+ZGV2LCBOVUxMKTsKKwlrZnJlZShjdHJsKTsKKwlyZXR1cm4gMDsKK30KKworLyogTk9URTogVGhpcyBpbnRlcnJ1cHQgaXMgYWxzbyB1c2VkIHRvIHJlcG9ydCBvdGhlciBsb2NhbGJ1cyBldmVudHMsCisgKiBzdWNoIGFzIHRyYW5zYWN0aW9uIGVycm9ycyBvbiBvdGhlciBjaGlwc2VsZWN0cy4gIElmIHdlIHdhbnQgdG8KKyAqIGNhcHR1cmUgdGhvc2UsIHdlJ2xsIG5lZWQgdG8gbW92ZSB0aGUgSVJRIGNvZGUgaW50byBhIHNoYXJlZAorICogTEJDIGRyaXZlci4KKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgZnNsX2VsYmNfY3RybF9pcnEoaW50IGlycW5vLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBmc2xfZWxiY19jdHJsICpjdHJsID0gZGF0YTsKKwlzdHJ1Y3QgZWxiY19yZWdzIF9faW9tZW0gKmxiYyA9IGN0cmwtPnJlZ3M7CisJX19iZTMyIHN0YXR1cyA9IGluX2JlMzIoJmxiYy0+bHRlc3IpICYgTFRFU1JfTkFORF9NQVNLOworCisJaWYgKHN0YXR1cykgeworCQlvdXRfYmUzMigmbGJjLT5sdGVzciwgc3RhdHVzKTsKKwkJb3V0X2JlMzIoJmxiYy0+bHRlYXRyLCAwKTsKKworCQljdHJsLT5pcnFfc3RhdHVzID0gc3RhdHVzOworCQlzbXBfd21iKCk7CisJCXdha2VfdXAoJmN0cmwtPmlycV93YWl0KTsKKworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJcmV0dXJuIElSUV9OT05FOworfQorCisvKiBmc2xfZWxiY19jdHJsX3Byb2JlCisgKgorICogY2FsbGVkIGJ5IGRldmljZSBsYXllciB3aGVuIGl0IGZpbmRzIGEgZGV2aWNlIG1hdGNoaW5nCisgKiBvbmUgb3VyIGRyaXZlciBjYW4gaGFuZGxlZC4gVGhpcyBjb2RlIGFsbG9jYXRlcyBhbGwgb2YKKyAqIHRoZSByZXNvdXJjZXMgbmVlZGVkIGZvciB0aGUgY29udHJvbGxlciBvbmx5LiAgVGhlCisgKiByZXNvdXJjZXMgZm9yIHRoZSBOQU5EIGJhbmtzIHRoZW1zZWx2ZXMgYXJlIGFsbG9jYXRlZAorICogaW4gdGhlIGNoaXAgcHJvYmUgZnVuY3Rpb24uCisqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBmc2xfZWxiY19jdHJsX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkOworCXN0cnVjdCBmc2xfZWxiY19jdHJsICpjdHJsOworCWludCByZXQ7CisKKwljdHJsID0ga3phbGxvYyhzaXplb2YoKmN0cmwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWN0cmwpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2X3NldF9kcnZkYXRhKCZvZmRldi0+ZGV2LCBjdHJsKTsKKworCXNwaW5fbG9ja19pbml0KCZjdHJsLT5jb250cm9sbGVyLmxvY2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmN0cmwtPmNvbnRyb2xsZXIud3EpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmN0cmwtPmlycV93YWl0KTsKKworCWN0cmwtPnJlZ3MgPSBvZl9pb21hcChvZmRldi0+bm9kZSwgMCk7CisJaWYgKCFjdHJsLT5yZWdzKSB7CisJCWRldl9lcnIoJm9mZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IG1lbW9yeSByZWdpb25cbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycjsKKwl9CisKKwljdHJsLT5pcnEgPSBvZl9pcnFfdG9fcmVzb3VyY2Uob2ZkZXYtPm5vZGUsIDAsIE5VTEwpOworCWlmIChjdHJsLT5pcnEgPT0gTk9fSVJRKSB7CisJCWRldl9lcnIoJm9mZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGlycSByZXNvdXJjZVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyOworCX0KKworCWN0cmwtPmRldiA9ICZvZmRldi0+ZGV2OworCisJcmV0ID0gZnNsX2VsYmNfY3RybF9pbml0KGN0cmwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjsKKworCXJldCA9IHJlcXVlc3RfaXJxKGN0cmwtPmlycSwgZnNsX2VsYmNfY3RybF9pcnEsIDAsICJmc2wtZWxiYyIsIGN0cmwpOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKCZvZmRldi0+ZGV2LCAiZmFpbGVkIHRvIGluc3RhbGwgaXJxICglZClcbiIsCisJCSAgICAgICAgY3RybC0+aXJxKTsKKwkJcmV0ID0gY3RybC0+aXJxOworCQlnb3RvIGVycjsKKwl9CisKKwlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKG9mZGV2LT5ub2RlLCBjaGlsZCkKKwkJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKGNoaWxkLCAiZnNsLGVsYmMtZmNtLW5hbmQiKSkKKwkJCWZzbF9lbGJjX2NoaXBfcHJvYmUoY3RybCwgY2hpbGQpOworCisJcmV0dXJuIDA7CisKK2VycjoKKwlmc2xfZWxiY19jdHJsX3JlbW92ZShvZmRldik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZnNsX2VsYmNfbWF0Y2hbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gImZzbCxlbGJjIiwKKwl9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBmc2xfZWxiY19jdHJsX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJmc2wtZWxiYyIsCisJfSwKKwkubWF0Y2hfdGFibGUgPSBmc2xfZWxiY19tYXRjaCwKKwkucHJvYmUgPSBmc2xfZWxiY19jdHJsX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChmc2xfZWxiY19jdHJsX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBmc2xfZWxiY19pbml0KHZvaWQpCit7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmZnNsX2VsYmNfY3RybF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZnNsX2VsYmNfZXhpdCh2b2lkKQoreworCW9mX3VucmVnaXN0ZXJfcGxhdGZvcm1fZHJpdmVyKCZmc2xfZWxiY19jdHJsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGZzbF9lbGJjX2luaXQpOworbW9kdWxlX2V4aXQoZnNsX2VsYmNfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkZyZWVzY2FsZSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJGcmVlc2NhbGUgRW5oYW5jZWQgTG9jYWwgQnVzIENvbnRyb2xsZXIgTVREIE5BTkQgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmFzZS5jIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2Jhc2UuYwppbmRleCBkZGQ0ZmMwLi43YWNiMWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmFzZS5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMKQEAgLTI0NjksOCArMjQ2OSwxMiBAQAogCQkJY2hpcC0+ZWNjLndyaXRlX29vYiA9IG5hbmRfd3JpdGVfb29iX3N0ZDsKIAogCWNhc2UgTkFORF9FQ0NfSFdfU1lORFJPTUU6Ci0JCWlmICghY2hpcC0+ZWNjLmNhbGN1bGF0ZSB8fCAhY2hpcC0+ZWNjLmNvcnJlY3QgfHwKLQkJICAgICFjaGlwLT5lY2MuaHdjdGwpIHsKKwkJaWYgKCghY2hpcC0+ZWNjLmNhbGN1bGF0ZSB8fCAhY2hpcC0+ZWNjLmNvcnJlY3QgfHwKKwkJICAgICAhY2hpcC0+ZWNjLmh3Y3RsKSAmJgorCQkgICAgKCFjaGlwLT5lY2MucmVhZF9wYWdlIHx8CisJCSAgICAgY2hpcC0+ZWNjLnJlYWRfcGFnZSA9PSBuYW5kX3JlYWRfcGFnZV9od2VjYyB8fAorCQkgICAgICFjaGlwLT5lY2Mud3JpdGVfcGFnZSB8fAorCQkgICAgIGNoaXAtPmVjYy53cml0ZV9wYWdlID09IG5hbmRfd3JpdGVfcGFnZV9od2VjYykpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5vIEVDQyBmdW5jdGlvbnMgc3VwcGxpZWQsICIKIAkJCSAgICAgICAiSGFyZHdhcmUgRUNDIG5vdCBwb3NzaWJsZVxuIik7CiAJCQlCVUcoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvb3Jpb25fbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9vcmlvbl9uYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE2MmNjYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvb3Jpb25fbmFuZC5jCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogZHJpdmVycy9tdGQvbmFuZC9vcmlvbl9uYW5kLmMKKyAqCisgKiBOQU5EIHN1cHBvcnQgZm9yIE1hcnZlbGwgT3Jpb24gU29DIHBsYXRmb3JtcworICoKKyAqIFR6YWNoaSBQZXJlbHN0ZWluIDx0emFjaGlAbWFydmVsbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zaXplcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KKworI2lmZGVmIENPTkZJR19NVERfQ01ETElORV9QQVJUUworc3RhdGljIGNvbnN0IGNoYXIgKnBhcnRfcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBvcmlvbl9uYW5kX2NtZF9jdHJsKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY21kLCB1bnNpZ25lZCBpbnQgY3RybCkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICpuYyA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3Qgb3Jpb25fbmFuZF9kYXRhICpib2FyZCA9IG5jLT5wcml2OworCXUzMiBvZmZzOworCisJaWYgKGNtZCA9PSBOQU5EX0NNRF9OT05FKQorCQlyZXR1cm47CisKKwlpZiAoY3RybCAmIE5BTkRfQ0xFKQorCQlvZmZzID0gKDEgPDwgYm9hcmQtPmNsZSk7CisJZWxzZSBpZiAoY3RybCAmIE5BTkRfQUxFKQorCQlvZmZzID0gKDEgPDwgYm9hcmQtPmFsZSk7CisJZWxzZQorCQlyZXR1cm47CisKKwlpZiAobmMtPm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2KQorCQlvZmZzIDw8PSAxOworCisJd3JpdGViKGNtZCwgbmMtPklPX0FERFJfVyArIG9mZnMpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBvcmlvbl9uYW5kX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG10ZF9pbmZvICptdGQ7CisJc3RydWN0IG5hbmRfY2hpcCAqbmM7CisJc3RydWN0IG9yaW9uX25hbmRfZGF0YSAqYm9hcmQ7CisJdm9pZCBfX2lvbWVtICppb19iYXNlOworCWludCByZXQgPSAwOworI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUworCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0aXRpb25zID0gTlVMTDsKKwlpbnQgbnVtX3BhcnQgPSAwOworI2VuZGlmCisKKwluYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuYW5kX2NoaXApICsgc2l6ZW9mKHN0cnVjdCBtdGRfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghbmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJvcmlvbl9uYW5kOiBmYWlsZWQgdG8gYWxsb2NhdGUgZGV2aWNlIHN0cnVjdHVyZS5cbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG5vX3JlczsKKwl9CisJbXRkID0gKHN0cnVjdCBtdGRfaW5mbyAqKShuYyArIDEpOworCisJaW9fYmFzZSA9IGlvcmVtYXAocGRldi0+cmVzb3VyY2VbMF0uc3RhcnQsCisJCQlwZGV2LT5yZXNvdXJjZVswXS5lbmQgLSBwZGV2LT5yZXNvdXJjZVswXS5zdGFydCArIDEpOworCWlmICghaW9fYmFzZSkgeworCQlwcmludGsoS0VSTl9FUlIgIm9yaW9uX25hbmQ6IGlvcmVtYXAgZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBub19yZXM7CisJfQorCisJYm9hcmQgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCW10ZC0+cHJpdiA9IG5jOworCW10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCW5jLT5wcml2ID0gYm9hcmQ7CisJbmMtPklPX0FERFJfUiA9IG5jLT5JT19BRERSX1cgPSBpb19iYXNlOworCW5jLT5jbWRfY3RybCA9IG9yaW9uX25hbmRfY21kX2N0cmw7CisJbmMtPmVjYy5tb2RlID0gTkFORF9FQ0NfU09GVDsKKworCWlmIChib2FyZC0+d2lkdGggPT0gMTYpCisJCW5jLT5vcHRpb25zIHw9IE5BTkRfQlVTV0lEVEhfMTY7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtdGQpOworCisJaWYgKG5hbmRfc2NhbihtdGQsIDEpKSB7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBub19kZXY7CisJfQorCisjaWZkZWYgQ09ORklHX01URF9QQVJUSVRJT05TCisjaWZkZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTCisJbXRkLT5uYW1lID0gIm9yaW9uX25hbmQiOworCW51bV9wYXJ0ID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMobXRkLCBwYXJ0X3Byb2JlcywgJnBhcnRpdGlvbnMsIDApOworI2VuZGlmCisJLyogSWYgY21kbGluZSBwYXJ0aXRpb25zIGhhdmUgYmVlbiBwYXNzZWQsIGxldCB0aGVtIGJlIHVzZWQgKi8KKwlpZiAobnVtX3BhcnQgPD0gMCkgeworCQludW1fcGFydCA9IGJvYXJkLT5ucl9wYXJ0czsKKwkJcGFydGl0aW9ucyA9IGJvYXJkLT5wYXJ0czsKKwl9CisKKwlpZiAocGFydGl0aW9ucyAmJiBudW1fcGFydCA+IDApCisJCXJldCA9IGFkZF9tdGRfcGFydGl0aW9ucyhtdGQsIHBhcnRpdGlvbnMsIG51bV9wYXJ0KTsKKwllbHNlCisJCXJldCA9IGFkZF9tdGRfZGV2aWNlKG10ZCk7CisjZWxzZQorCXJldCA9IGFkZF9tdGRfZGV2aWNlKG10ZCk7CisjZW5kaWYKKworCWlmIChyZXQpIHsKKwkJbmFuZF9yZWxlYXNlKG10ZCk7CisJCWdvdG8gbm9fZGV2OworCX0KKworCXJldHVybiAwOworCitub19kZXY6CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJaW91bm1hcChpb19iYXNlKTsKK25vX3JlczoKKwlrZnJlZShuYyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBvcmlvbl9uYW5kX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IG5hbmRfY2hpcCAqbmMgPSBtdGQtPnByaXY7CisKKwluYW5kX3JlbGVhc2UobXRkKTsKKworCWlvdW5tYXAobmMtPklPX0FERFJfVyk7CisKKwlrZnJlZShuYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb3Jpb25fbmFuZF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IG9yaW9uX25hbmRfcHJvYmUsCisJLnJlbW92ZQkJPSBvcmlvbl9uYW5kX3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAib3Jpb25fbmFuZCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBvcmlvbl9uYW5kX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZvcmlvbl9uYW5kX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvcmlvbl9uYW5kX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb3Jpb25fbmFuZF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChvcmlvbl9uYW5kX2luaXQpOworbW9kdWxlX2V4aXQob3Jpb25fbmFuZF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiVHphY2hpIFBlcmVsc3RlaW4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTkFORCBnbHVlIGZvciBPcmlvbiBwbGF0Zm9ybXMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvcGFzZW1pX25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvcGFzZW1pX25hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWM4OTkwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9wYXNlbWlfbmFuZC5jCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgUEEgU2VtaSwgSW5jCisgKgorICogQXV0aG9yOiBFZ29yIE1hcnRvdmV0c2t5IDxlZ29yQHBhc2VtaS5jb20+CisgKiBNYWludGFpbmVkIGJ5OiBPbG9mIEpvaGFuc3NvbiA8b2xvZkBsaXhvbS5uZXQ+CisgKgorICogRHJpdmVyIGZvciB0aGUgUFdSZmljaWVudCBvbmNoaXAgTkFORCBmbGFzaCBpbnRlcmZhY2UKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL25hbmRfZWNjLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVmaW5lIExCSUNUUkxfTFBDQ1RMX05SCQkweDAwMDA0MDAwCisjZGVmaW5lIENMRV9QSU5fQ1RMCQkJMTUKKyNkZWZpbmUgQUxFX1BJTl9DVEwJCQkxNAorCitzdGF0aWMgdW5zaWduZWQgaW50IGxwY2N0bDsKK3N0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKnBhc2VtaV9uYW5kX210ZDsKK3N0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9uYW1lW10gPSAicGFzZW1pLW5hbmQiOworCitzdGF0aWMgdm9pZCBwYXNlbWlfcmVhZF9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsIHVfY2hhciAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7CisKKwl3aGlsZSAobGVuID4gMHg4MDApIHsKKwkJbWVtY3B5X2Zyb21pbyhidWYsIGNoaXAtPklPX0FERFJfUiwgMHg4MDApOworCQlidWYgKz0gMHg4MDA7CisJCWxlbiAtPSAweDgwMDsKKwl9CisJbWVtY3B5X2Zyb21pbyhidWYsIGNoaXAtPklPX0FERFJfUiwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgcGFzZW1pX3dyaXRlX2J1ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdV9jaGFyICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJpdjsKKworCXdoaWxlIChsZW4gPiAweDgwMCkgeworCQltZW1jcHlfdG9pbyhjaGlwLT5JT19BRERSX1IsIGJ1ZiwgMHg4MDApOworCQlidWYgKz0gMHg4MDA7CisJCWxlbiAtPSAweDgwMDsKKwl9CisJbWVtY3B5X3RvaW8oY2hpcC0+SU9fQUREUl9SLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIHBhc2VtaV9od2NvbnRyb2woc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBjbWQsCisJCQkgICAgIHVuc2lnbmVkIGludCBjdHJsKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnByaXY7CisKKwlpZiAoY21kID09IE5BTkRfQ01EX05PTkUpCisJCXJldHVybjsKKworCWlmIChjdHJsICYgTkFORF9DTEUpCisJCW91dF84KGNoaXAtPklPX0FERFJfVyArICgxIDw8IENMRV9QSU5fQ1RMKSwgY21kKTsKKwllbHNlCisJCW91dF84KGNoaXAtPklPX0FERFJfVyArICgxIDw8IEFMRV9QSU5fQ1RMKSwgY21kKTsKKworCS8qIFB1c2ggb3V0IHBvc3RlZCB3cml0ZXMgKi8KKwllaWVpbygpOworCWlubChscGNjdGwpOworfQorCitpbnQgcGFzZW1pX2RldmljZV9yZWFkeShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlyZXR1cm4gISEoaW5sKGxwY2N0bCkgJiBMQklDVFJMX0xQQ0NUTF9OUik7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBhc2VtaV9uYW5kX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2LAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBvZmRldi0+bm9kZTsKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzOworCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXA7CisJaW50IGVyciA9IDA7CisKKwllcnIgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcmVzKTsKKworCWlmIChlcnIpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogV2Ugb25seSBzdXBwb3J0IG9uZSBkZXZpY2UgYXQgdGhlIG1vbWVudCAqLworCWlmIChwYXNlbWlfbmFuZF9tdGQpCisJCXJldHVybiAtRU5PREVWOworCisJcHJfZGVidWcoInBhc2VtaV9uYW5kIGF0ICVseC0lbHhcbiIsIHJlcy5zdGFydCwgcmVzLmVuZCk7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIE1URCBkZXZpY2Ugc3RydWN0dXJlIGFuZCBwcml2YXRlIGRhdGEgKi8KKwlwYXNlbWlfbmFuZF9tdGQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXRkX2luZm8pICsKKwkJCQkgIHNpemVvZihzdHJ1Y3QgbmFuZF9jaGlwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYXNlbWlfbmFuZF9tdGQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBQQVNFTUkgTkFORCBNVEQgZGV2aWNlIHN0cnVjdHVyZVxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCS8qIEdldCBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSAqLworCWNoaXAgPSAoc3RydWN0IG5hbmRfY2hpcCAqKSZwYXNlbWlfbmFuZF9tdGRbMV07CisKKwkvKiBMaW5rIHRoZSBwcml2YXRlIGRhdGEgd2l0aCB0aGUgTVREIHN0cnVjdHVyZSAqLworCXBhc2VtaV9uYW5kX210ZC0+cHJpdiA9IGNoaXA7CisJcGFzZW1pX25hbmRfbXRkLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJY2hpcC0+SU9fQUREUl9SID0gb2ZfaW9tYXAobnAsIDApOworCWNoaXAtPklPX0FERFJfVyA9IGNoaXAtPklPX0FERFJfUjsKKworCWlmICghY2hpcC0+SU9fQUREUl9SKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0X210ZDsKKwl9CisKKwlwZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9QQVNFTUksIDB4YTAwOCwgTlVMTCk7CisJaWYgKCFwZGV2KSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2lvcjsKKwl9CisKKwlscGNjdGwgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGxwY2N0bCwgNCwgZHJpdmVyX25hbWUpKSB7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBvdXRfaW9yOworCX0KKworCWNoaXAtPmNtZF9jdHJsID0gcGFzZW1pX2h3Y29udHJvbDsKKwljaGlwLT5kZXZfcmVhZHkgPSBwYXNlbWlfZGV2aWNlX3JlYWR5OworCWNoaXAtPnJlYWRfYnVmID0gcGFzZW1pX3JlYWRfYnVmOworCWNoaXAtPndyaXRlX2J1ZiA9IHBhc2VtaV93cml0ZV9idWY7CisJY2hpcC0+Y2hpcF9kZWxheSA9IDA7CisJY2hpcC0+ZWNjLm1vZGUgPSBOQU5EX0VDQ19TT0ZUOworCisJLyogRW5hYmxlIHRoZSBmb2xsb3dpbmcgZm9yIGEgZmxhc2ggYmFzZWQgYmFkIGJsb2NrIHRhYmxlICovCisJY2hpcC0+b3B0aW9ucyA9IE5BTkRfVVNFX0ZMQVNIX0JCVCB8IE5BTkRfTk9fQVVUT0lOQ1I7CisKKwkvKiBTY2FuIHRvIGZpbmQgZXhpc3RhbmNlIG9mIHRoZSBkZXZpY2UgKi8KKwlpZiAobmFuZF9zY2FuKHBhc2VtaV9uYW5kX210ZCwgMSkpIHsKKwkJZXJyID0gLUVOWElPOworCQlnb3RvIG91dF9scGM7CisJfQorCisJaWYgKGFkZF9tdGRfZGV2aWNlKHBhc2VtaV9uYW5kX210ZCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJwYXNlbWlfbmFuZDogVW5hYmxlIHRvIHJlZ2lzdGVyIE1URCBkZXZpY2VcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dF9scGM7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiUEEgU2VtaSBOQU5EIGZsYXNoIGF0ICUwOGx4LCBjb250cm9sIGF0IEkvTyAleFxuIiwKKwkgICAgICAgcmVzLnN0YXJ0LCBscGNjdGwpOworCisJcmV0dXJuIDA7CisKKyBvdXRfbHBjOgorCXJlbGVhc2VfcmVnaW9uKGxwY2N0bCwgNCk7Cisgb3V0X2lvcjoKKwlpb3VubWFwKGNoaXAtPklPX0FERFJfUik7Cisgb3V0X210ZDoKKwlrZnJlZShwYXNlbWlfbmFuZF9tdGQpOworIG91dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBwYXNlbWlfbmFuZF9yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqY2hpcDsKKworCWlmICghcGFzZW1pX25hbmRfbXRkKQorCQlyZXR1cm4gMDsKKworCWNoaXAgPSBwYXNlbWlfbmFuZF9tdGQtPnByaXY7CisKKwkvKiBSZWxlYXNlIHJlc291cmNlcywgdW5yZWdpc3RlciBkZXZpY2UgKi8KKwluYW5kX3JlbGVhc2UocGFzZW1pX25hbmRfbXRkKTsKKworCXJlbGVhc2VfcmVnaW9uKGxwY2N0bCwgNCk7CisKKwlpb3VubWFwKGNoaXAtPklPX0FERFJfUik7CisKKwkvKiBGcmVlIHRoZSBNVEQgZGV2aWNlIHN0cnVjdHVyZSAqLworCWtmcmVlKHBhc2VtaV9uYW5kX210ZCk7CisKKwlwYXNlbWlfbmFuZF9tdGQgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBhc2VtaV9uYW5kX21hdGNoW10gPQoreworCXsKKwkJLmNvbXBhdGlibGUgICA9ICJwYXNlbWksbG9jYWxidXMtbmFuZCIsCisJfSwKKwl7fSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHBhc2VtaV9uYW5kX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgcGFzZW1pX25hbmRfZHJpdmVyID0KK3sKKwkubmFtZQkJPSAoY2hhciopZHJpdmVyX25hbWUsCisJLm1hdGNoX3RhYmxlCT0gcGFzZW1pX25hbmRfbWF0Y2gsCisJLnByb2JlCQk9IHBhc2VtaV9uYW5kX3Byb2JlLAorCS5yZW1vdmUJCT0gcGFzZW1pX25hbmRfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcGFzZW1pX25hbmRfaW5pdCh2b2lkKQoreworCXJldHVybiBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJnBhc2VtaV9uYW5kX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChwYXNlbWlfbmFuZF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHBhc2VtaV9uYW5kX2V4aXQodm9pZCkKK3sKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmcGFzZW1pX25hbmRfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHBhc2VtaV9uYW5kX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJFZ29yIE1hcnRvdmV0c2t5IDxlZ29yQHBhc2VtaS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5BTkQgZmxhc2ggaW50ZXJmYWNlIGRyaXZlciBmb3IgUEEgU2VtaSBQV1JmaWNpZW50Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3BsYXRfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9wbGF0X25hbmQuYwppbmRleCBjZDcyNWZjLi5mNmQ1YzJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL3BsYXRfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvcGxhdF9uYW5kLmMKQEAgLTExMCw3ICsxMTAsOSBAQAogc3RhdGljIGludCBfX2RldmV4aXQgcGxhdF9uYW5kX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBwbGF0X25hbmRfZGF0YSAqZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUwogCXN0cnVjdCBwbGF0Zm9ybV9uYW5kX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisjZW5kaWYKIAogCW5hbmRfcmVsZWFzZSgmZGF0YS0+bXRkKTsKICNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvczNjMjQxMC5jIGIvZHJpdmVycy9tdGQvbmFuZC9zM2MyNDEwLmMKaW5kZXggMmJkMDczNy4uOTI2MGFkOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvczNjMjQxMC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvczNjMjQxMC5jCkBAIC0xMjAsNiArMTIwLDggQEAKIAlpbnQJCQkJc2VsX2JpdDsKIAlpbnQJCQkJbXRkX2NvdW50OwogCisJdW5zaWduZWQgbG9uZwkJCXNhdmVfbmZjb25mOworCiAJZW51bSBzM2NfY3B1X3R5cGUJCWNwdV90eXBlOwogfTsKIApAQCAtMzY0LDIzICszNjYsMjEgQEAKIAkgICAgKChkaWZmMiBeIChkaWZmMiA+PiAxKSkgJiAweDU1KSA9PSAweDU1KSB7CiAJCS8qIGNhbGN1bGF0ZSB0aGUgYml0IHBvc2l0aW9uIG9mIHRoZSBlcnJvciAqLwogCi0JCWJpdCAgPSAoZGlmZjIgPj4gMikgJiAxOwotCQliaXQgfD0gKGRpZmYyID4+IDMpICYgMjsKLQkJYml0IHw9IChkaWZmMiA+PiA0KSAmIDQ7CisJCWJpdCAgPSAoKGRpZmYyID4+IDMpICYgMSkgfAorCQkgICAgICAgKChkaWZmMiA+PiA0KSAmIDIpIHwKKwkJICAgICAgICgoZGlmZjIgPj4gNSkgJiA0KTsKIAogCQkvKiBjYWxjdWxhdGUgdGhlIGJ5dGUgcG9zaXRpb24gb2YgdGhlIGVycm9yICovCiAKLQkJYnl0ZSAgPSAoZGlmZjEgPDwgMSkgJiAweDgwOwotCQlieXRlIHw9IChkaWZmMSA8PCAyKSAmIDB4NDA7Ci0JCWJ5dGUgfD0gKGRpZmYxIDw8IDMpICYgMHgyMDsKLQkJYnl0ZSB8PSAoZGlmZjEgPDwgNCkgJiAweDEwOwotCi0JCWJ5dGUgfD0gKGRpZmYwID4+IDMpICYgMHgwODsKLQkJYnl0ZSB8PSAoZGlmZjAgPj4gMikgJiAweDA0OwotCQlieXRlIHw9IChkaWZmMCA+PiAxKSAmIDB4MDI7Ci0JCWJ5dGUgfD0gKGRpZmYwID4+IDApICYgMHgwMTsKLQotCQlieXRlIHw9IChkaWZmMiA8PCA4KSAmIDB4MTAwOworCQlieXRlID0gKChkaWZmMiA8PCA3KSAmIDB4MTAwKSB8CisJCSAgICAgICAoKGRpZmYxIDw8IDApICYgMHg4MCkgIHwKKwkJICAgICAgICgoZGlmZjEgPDwgMSkgJiAweDQwKSAgfAorCQkgICAgICAgKChkaWZmMSA8PCAyKSAmIDB4MjApICB8CisJCSAgICAgICAoKGRpZmYxIDw8IDMpICYgMHgxMCkgIHwKKwkJICAgICAgICgoZGlmZjAgPj4gNCkgJiAweDA4KSAgfAorCQkgICAgICAgKChkaWZmMCA+PiAzKSAmIDB4MDQpICB8CisJCSAgICAgICAoKGRpZmYwID4+IDIpICYgMHgwMikgIHwKKwkJICAgICAgICgoZGlmZjAgPj4gMSkgJiAweDAxKTsKIAogCQlkZXZfZGJnKGluZm8tPmRldmljZSwgImNvcnJlY3RpbmcgZXJyb3IgYml0ICVkLCBieXRlICVkXG4iLAogCQkJYml0LCBieXRlKTsKQEAgLTM5OSw3ICszOTksNyBAQAogCWlmICgoZGlmZjAgJiB+KDE8PGZscyhkaWZmMCkpKSA9PSAwKQogCQlyZXR1cm4gMTsKIAotCXJldHVybiAwOworCXJldHVybiAtMTsKIH0KIAogLyogRUNDIGZ1bmN0aW9ucwpAQCAtODEwLDYgKzgxMCwxNiBAQAogCXN0cnVjdCBzM2MyNDEwX25hbmRfaW5mbyAqaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CiAKIAlpZiAoaW5mbykgeworCQlpbmZvLT5zYXZlX25mY29uZiA9IHJlYWRsKGluZm8tPnJlZ3MgKyBTM0MyNDEwX05GQ09ORik7CisKKwkJLyogRm9yIHRoZSBtb21lbnQsIHdlIG11c3QgZW5zdXJlIG5GQ0UgaXMgaGlnaCBkdXJpbmcKKwkJICogdGhlIHRpbWUgd2UgYXJlIHN1c3BlbmRlZC4gVGhpcyByZWFsbHkgc2hvdWxkIGJlCisJCSAqIGhhbmRsZWQgYnkgc3VzcGVuZGluZyB0aGUgTVREcyB3ZSBhcmUgdXNpbmcsIGJ1dAorCQkgKiB0aGF0IGlzIGN1cnJlbnRseSBub3QgdGhlIGNhc2UuICovCisKKwkJd3JpdGVsKGluZm8tPnNhdmVfbmZjb25mIHwgaW5mby0+c2VsX2JpdCwKKwkJICAgICAgIGluZm8tPnJlZ3MgKyBTM0MyNDEwX05GQ09ORik7CisKIAkJaWYgKCFhbGxvd19jbGtfc3RvcChpbmZvKSkKIAkJCWNsa19kaXNhYmxlKGluZm8tPmNsayk7CiAJfQpAQCAtODIwLDExICs4MzAsMTkgQEAKIHN0YXRpYyBpbnQgczNjMjR4eF9uYW5kX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHMzYzI0MTBfbmFuZF9pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nIG5mY29uZjsKIAogCWlmIChpbmZvKSB7CiAJCWNsa19lbmFibGUoaW5mby0+Y2xrKTsKIAkJczNjMjQxMF9uYW5kX2luaXRodyhpbmZvLCBkZXYpOwogCisJCS8qIFJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBuRkNFIGxpbmUuICovCisKKwkJbmZjb25mID0gcmVhZGwoaW5mby0+cmVncyArIFMzQzI0MTBfTkZDT05GKTsKKwkJbmZjb25mICY9IH5pbmZvLT5zZWxfYml0OworCQluZmNvbmYgfD0gaW5mby0+c2F2ZV9uZmNvbmYgJiBpbmZvLT5zZWxfYml0OworCQl3cml0ZWwobmZjb25mLCBpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkNPTkYpOworCiAJCWlmIChhbGxvd19jbGtfc3RvcChpbmZvKSkKIAkJCWNsa19kaXNhYmxlKGluZm8tPmNsayk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvb2ZwYXJ0LmMgYi9kcml2ZXJzL210ZC9vZnBhcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODZlMDY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvb2ZwYXJ0LmMKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIEZsYXNoIHBhcnRpdGlvbnMgZGVzY3JpYmVkIGJ5IHRoZSBPRiAob3IgZmxhdHRlbmVkKSBkZXZpY2UgdHJlZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqIEF1dGhvcjogVml0YWx5IFdvb2wgPHZ3b29sQHJ1Lm12aXN0YS5jb20+CisgKgorICogUmV2aXNlZCB0byBoYW5kbGUgbmV3ZXIgc3R5bGUgZmxhc2ggYmluZGluZyBieToKKyAqICAgQ29weXJpZ2h0IChDKSAyMDA3IERhdmlkIEdpYnNvbiwgSUJNIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorCitpbnQgX19kZXZpbml0IG9mX210ZF9wYXJzZV9wYXJ0aXRpb25zKHN0cnVjdCBkZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG10ZF9pbmZvICptdGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG10ZF9wYXJ0aXRpb24gKipwcGFydHMpCit7CisJY29uc3QgY2hhciAqcGFydG5hbWU7CisJc3RydWN0IGRldmljZV9ub2RlICpwcDsKKwlpbnQgbnJfcGFydHMsIGk7CisKKwkvKiBGaXJzdCBjb3VudCB0aGUgc3Vibm9kZXMgKi8KKwlwcCA9IE5VTEw7CisJbnJfcGFydHMgPSAwOworCXdoaWxlICgocHAgPSBvZl9nZXRfbmV4dF9jaGlsZChub2RlLCBwcCkpKQorCQlucl9wYXJ0cysrOworCisJaWYgKG5yX3BhcnRzID09IDApCisJCXJldHVybiAwOworCisJKnBwYXJ0cyA9IGt6YWxsb2MobnJfcGFydHMgKiBzaXplb2YoKipwcGFydHMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoISpwcGFydHMpCisJCXJldHVybiAtRU5PTUVNOworCisJcHAgPSBOVUxMOworCWkgPSAwOworCXdoaWxlICgocHAgPSBvZl9nZXRfbmV4dF9jaGlsZChub2RlLCBwcCkpKSB7CisJCWNvbnN0IHUzMiAqcmVnOworCQlpbnQgbGVuOworCisJCXJlZyA9IG9mX2dldF9wcm9wZXJ0eShwcCwgInJlZyIsICZsZW4pOworCQlpZiAoIXJlZyB8fCAobGVuICE9IDIgKiBzaXplb2YodTMyKSkpIHsKKwkJCW9mX25vZGVfcHV0KHBwKTsKKwkJCWRldl9lcnIoZGV2LCAiSW52YWxpZCAncmVnJyBvbiAlc1xuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKwkJCWtmcmVlKCpwcGFydHMpOworCQkJKnBwYXJ0cyA9IE5VTEw7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkoKnBwYXJ0cylbaV0ub2Zmc2V0ID0gcmVnWzBdOworCQkoKnBwYXJ0cylbaV0uc2l6ZSA9IHJlZ1sxXTsKKworCQlwYXJ0bmFtZSA9IG9mX2dldF9wcm9wZXJ0eShwcCwgImxhYmVsIiwgJmxlbik7CisJCWlmICghcGFydG5hbWUpCisJCQlwYXJ0bmFtZSA9IG9mX2dldF9wcm9wZXJ0eShwcCwgIm5hbWUiLCAmbGVuKTsKKwkJKCpwcGFydHMpW2ldLm5hbWUgPSAoY2hhciAqKXBhcnRuYW1lOworCisJCWlmIChvZl9nZXRfcHJvcGVydHkocHAsICJyZWFkLW9ubHkiLCAmbGVuKSkKKwkJCSgqcHBhcnRzKVtpXS5tYXNrX2ZsYWdzID0gTVREX1dSSVRFQUJMRTsKKworCQlpKys7CisJfQorCisJcmV0dXJuIG5yX3BhcnRzOworfQorRVhQT1JUX1NZTUJPTChvZl9tdGRfcGFyc2VfcGFydGl0aW9ucyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmRfYmFzZS5jIGIvZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kX2Jhc2UuYwppbmRleCAxYjBiMzIwLi44ZDdkMjFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmRfYmFzZS5jCisrKyBiL2RyaXZlcnMvbXRkL29uZW5hbmQvb25lbmFuZF9iYXNlLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CkBAIC0xNzAsNiArMTcxLDE4IEBACiB9CiAKIC8qKgorICogb25lbmFuZF9nZXRfZGVuc2l0eSAtIFtERUZBVUxUXSBHZXQgT25lTkFORCBkZW5zaXR5CisgKiBAcGFyYW0gZGV2X2lkCU9uZU5BTkQgZGV2aWNlIElECisgKgorICogR2V0IE9uZU5BTkQgZGVuc2l0eSBmcm9tIGRldmljZSBJRAorICovCitzdGF0aWMgaW5saW5lIGludCBvbmVuYW5kX2dldF9kZW5zaXR5KGludCBkZXZfaWQpCit7CisJaW50IGRlbnNpdHkgPSBkZXZfaWQgPj4gT05FTkFORF9ERVZJQ0VfREVOU0lUWV9TSElGVDsKKwlyZXR1cm4gKGRlbnNpdHkgJiBPTkVOQU5EX0RFVklDRV9ERU5TSVRZX01BU0spOworfQorCisvKioKICAqIG9uZW5hbmRfY29tbWFuZCAtIFtERUZBVUxUXSBTZW5kIGNvbW1hbmQgdG8gT25lTkFORCBkZXZpY2UKICAqIEBwYXJhbSBtdGQJCU1URCBkZXZpY2Ugc3RydWN0dXJlCiAgKiBAcGFyYW0gY21kCQl0aGUgY29tbWFuZCB0byBiZSBzZW50CkBAIC0xODIsOCArMTk1LDcgQEAKIHN0YXRpYyBpbnQgb25lbmFuZF9jb21tYW5kKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY21kLCBsb2ZmX3QgYWRkciwgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3Qgb25lbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwotCWludCB2YWx1ZSwgcmVhZGNtZCA9IDAsIGJsb2NrX2NtZCA9IDA7Ci0JaW50IGJsb2NrLCBwYWdlOworCWludCB2YWx1ZSwgYmxvY2ssIHBhZ2U7CiAKIAkvKiBBZGRyZXNzIHRyYW5zbGF0aW9uICovCiAJc3dpdGNoIChjbWQpIHsKQEAgLTE5OCw3ICsyMTAsNiBAQAogCWNhc2UgT05FTkFORF9DTURfRVJBU0U6CiAJY2FzZSBPTkVOQU5EX0NNRF9CVUZGRVJSQU06CiAJY2FzZSBPTkVOQU5EX0NNRF9PVFBfQUNDRVNTOgotCQlibG9ja19jbWQgPSAxOwogCQlibG9jayA9IChpbnQpIChhZGRyID4+IHRoaXMtPmVyYXNlX3NoaWZ0KTsKIAkJcGFnZSA9IC0xOwogCQlicmVhazsKQEAgLTI0MCwxMSArMjUxLDkgQEAKIAkJdmFsdWUgPSBvbmVuYW5kX2Jsb2NrX2FkZHJlc3ModGhpcywgYmxvY2spOwogCQl0aGlzLT53cml0ZV93b3JkKHZhbHVlLCB0aGlzLT5iYXNlICsgT05FTkFORF9SRUdfU1RBUlRfQUREUkVTUzEpOwogCi0JCWlmIChibG9ja19jbWQpIHsKLQkJCS8qIFNlbGVjdCBEYXRhUkFNIGZvciBERFAgKi8KLQkJCXZhbHVlID0gb25lbmFuZF9idWZmZXJyYW1fYWRkcmVzcyh0aGlzLCBibG9jayk7Ci0JCQl0aGlzLT53cml0ZV93b3JkKHZhbHVlLCB0aGlzLT5iYXNlICsgT05FTkFORF9SRUdfU1RBUlRfQUREUkVTUzIpOwotCQl9CisJCS8qIFNlbGVjdCBEYXRhUkFNIGZvciBERFAgKi8KKwkJdmFsdWUgPSBvbmVuYW5kX2J1ZmZlcnJhbV9hZGRyZXNzKHRoaXMsIGJsb2NrKTsKKwkJdGhpcy0+d3JpdGVfd29yZCh2YWx1ZSwgdGhpcy0+YmFzZSArIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1MyKTsKIAl9CiAKIAlpZiAocGFnZSAhPSAtMSkgewpAQCAtMjU2LDcgKzI2NSw2IEBACiAJCWNhc2UgT05FTkFORF9DTURfUkVBRDoKIAkJY2FzZSBPTkVOQU5EX0NNRF9SRUFET09COgogCQkJZGF0YXJhbSA9IE9ORU5BTkRfU0VUX05FWFRfQlVGRkVSUkFNKHRoaXMpOwotCQkJcmVhZGNtZCA9IDE7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgpAQCAtMjczLDEyICsyODEsNiBAQAogCQkvKiBXcml0ZSAnQlNBLCBCU0MnIG9mIERhdGFSQU0gKi8KIAkJdmFsdWUgPSBvbmVuYW5kX2J1ZmZlcl9hZGRyZXNzKGRhdGFyYW0sIHNlY3RvcnMsIGNvdW50KTsKIAkJdGhpcy0+d3JpdGVfd29yZCh2YWx1ZSwgdGhpcy0+YmFzZSArIE9ORU5BTkRfUkVHX1NUQVJUX0JVRkZFUik7Ci0KLQkJaWYgKHJlYWRjbWQpIHsKLQkJCS8qIFNlbGVjdCBEYXRhUkFNIGZvciBERFAgKi8KLQkJCXZhbHVlID0gb25lbmFuZF9idWZmZXJyYW1fYWRkcmVzcyh0aGlzLCBibG9jayk7Ci0JCQl0aGlzLT53cml0ZV93b3JkKHZhbHVlLCB0aGlzLT5iYXNlICsgT05FTkFORF9SRUdfU1RBUlRfQUREUkVTUzIpOwotCQl9CiAJfQogCiAJLyogSW50ZXJydXB0IGNsZWFyICovCkBAIC04NTUsNiArODU3LDggQEAKIAkJCXRoaXMtPmNvbW1hbmQobXRkLCBPTkVOQU5EX0NNRF9SRUFELCBmcm9tLCB3cml0ZXNpemUpOwogIAkJCXJldCA9IHRoaXMtPndhaXQobXRkLCBGTF9SRUFESU5HKTsKICAJCQlvbmVuYW5kX3VwZGF0ZV9idWZmZXJyYW0obXRkLCBmcm9tLCAhcmV0KTsKKwkJCWlmIChyZXQgPT0gLUVCQURNU0cpCisJCQkJcmV0ID0gMDsKICAJCX0KICAJfQogCkBAIC05MTMsNiArOTE3LDggQEAKICAJCS8qIE5vdyB3YWl0IGZvciBsb2FkICovCiAgCQlyZXQgPSB0aGlzLT53YWl0KG10ZCwgRkxfUkVBRElORyk7CiAgCQlvbmVuYW5kX3VwZGF0ZV9idWZmZXJyYW0obXRkLCBmcm9tLCAhcmV0KTsKKwkJaWYgKHJldCA9PSAtRUJBRE1TRykKKwkJCXJldCA9IDA7CiAgCX0KIAogCS8qCkBAIC05MjMsMTIgKzkyOSwxMiBAQAogCW9wcy0+cmV0bGVuID0gcmVhZDsKIAlvcHMtPm9vYnJldGxlbiA9IG9vYnJlYWQ7CiAKLQlpZiAobXRkLT5lY2Nfc3RhdHMuZmFpbGVkIC0gc3RhdHMuZmFpbGVkKQotCQlyZXR1cm4gLUVCQURNU0c7Ci0KIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJaWYgKG10ZC0+ZWNjX3N0YXRzLmZhaWxlZCAtIHN0YXRzLmZhaWxlZCkKKwkJcmV0dXJuIC1FQkFETVNHOworCiAJcmV0dXJuIG10ZC0+ZWNjX3N0YXRzLmNvcnJlY3RlZCAtIHN0YXRzLmNvcnJlY3RlZCA/IC1FVUNMRUFOIDogMDsKIH0KIApAQCAtOTQ0LDYgKzk1MCw3IEBACiAJCQlzdHJ1Y3QgbXRkX29vYl9vcHMgKm9wcykKIHsKIAlzdHJ1Y3Qgb25lbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCXN0cnVjdCBtdGRfZWNjX3N0YXRzIHN0YXRzOwogCWludCByZWFkID0gMCwgdGhpc2xlbiwgY29sdW1uLCBvb2JzaXplOwogCXNpemVfdCBsZW4gPSBvcHMtPm9vYmxlbjsKIAltdGRfb29iX21vZGVfdCBtb2RlID0gb3BzLT5tb2RlOwpAQCAtOTc3LDYgKzk4NCw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCXN0YXRzID0gbXRkLT5lY2Nfc3RhdHM7CisKIAl3aGlsZSAocmVhZCA8IGxlbikgewogCQljb25kX3Jlc2NoZWQoKTsKIApAQCAtOTg4LDE4ICs5OTcsMTYgQEAKIAkJb25lbmFuZF91cGRhdGVfYnVmZmVycmFtKG10ZCwgZnJvbSwgMCk7CiAKIAkJcmV0ID0gdGhpcy0+d2FpdChtdGQsIEZMX1JFQURJTkcpOwotCQkvKiBGaXJzdCBjb3B5IGRhdGEgYW5kIGNoZWNrIHJldHVybiB2YWx1ZSBmb3IgRUNDIGhhbmRsaW5nICovCisJCWlmIChyZXQgJiYgcmV0ICE9IC1FQkFETVNHKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIm9uZW5hbmRfcmVhZF9vb2Jfbm9sb2NrOiByZWFkIGZhaWxlZCA9IDB4JXhcbiIsIHJldCk7CisJCQlicmVhazsKKwkJfQogCiAJCWlmIChtb2RlID09IE1URF9PT0JfQVVUTykKIAkJCW9uZW5hbmRfdHJhbnNmZXJfYXV0b19vb2IobXRkLCBidWYsIGNvbHVtbiwgdGhpc2xlbik7CiAJCWVsc2UKIAkJCXRoaXMtPnJlYWRfYnVmZmVycmFtKG10ZCwgT05FTkFORF9TUEFSRVJBTSwgYnVmLCBjb2x1bW4sIHRoaXNsZW4pOwogCi0JCWlmIChyZXQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAib25lbmFuZF9yZWFkX29vYl9ub2xvY2s6IHJlYWQgZmFpbGVkID0gMHgleFxuIiwgcmV0KTsKLQkJCWJyZWFrOwotCQl9Ci0KIAkJcmVhZCArPSB0aGlzbGVuOwogCiAJCWlmIChyZWFkID09IGxlbikKQEAgLTEwMTYsNyArMTAyMywxNCBAQAogCX0KIAogCW9wcy0+b29icmV0bGVuID0gcmVhZDsKLQlyZXR1cm4gcmV0OworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChtdGQtPmVjY19zdGF0cy5mYWlsZWQgLSBzdGF0cy5mYWlsZWQpCisJCXJldHVybiAtRUJBRE1TRzsKKworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTExMDYsMTIgKzExMjAsMTAgQEAKIAlpbnRlcnJ1cHQgPSB0aGlzLT5yZWFkX3dvcmQodGhpcy0+YmFzZSArIE9ORU5BTkRfUkVHX0lOVEVSUlVQVCk7CiAJY3RybCA9IHRoaXMtPnJlYWRfd29yZCh0aGlzLT5iYXNlICsgT05FTkFORF9SRUdfQ1RSTF9TVEFUVVMpOwogCisJLyogSW5pdGlhbCBiYWQgYmxvY2sgY2FzZTogMHgyNDAwIG9yIDB4MDQwMCAqLwogCWlmIChjdHJsICYgT05FTkFORF9DVFJMX0VSUk9SKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICJvbmVuYW5kX2JidF93YWl0OiBjb250cm9sbGVyIGVycm9yID0gMHglMDR4XG4iLCBjdHJsKTsKLQkJLyogSW5pdGlhbCBiYWQgYmxvY2sgY2FzZSAqLwotCQlpZiAoY3RybCAmIE9ORU5BTkRfQ1RSTF9MT0FEKQotCQkJcmV0dXJuIE9ORU5BTkRfQkJUX1JFQURfRVJST1I7Ci0JCXJldHVybiBPTkVOQU5EX0JCVF9SRUFEX0ZBVEFMX0VSUk9SOworCQlyZXR1cm4gT05FTkFORF9CQlRfUkVBRF9FUlJPUjsKIAl9CiAKIAlpZiAoaW50ZXJydXB0ICYgT05FTkFORF9JTlRfUkVBRCkgewpAQCAtMTIwNiw3ICsxMjE4LDcgQEAKIHN0YXRpYyBpbnQgb25lbmFuZF92ZXJpZnlfb29iKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCB1X2NoYXIgKmJ1ZiwgbG9mZl90IHRvKQogewogCXN0cnVjdCBvbmVuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7Ci0JY2hhciBvb2JidWZbNjRdOworCXVfY2hhciAqb29iX2J1ZiA9IHRoaXMtPm9vYl9idWY7CiAJaW50IHN0YXR1cywgaTsKIAogCXRoaXMtPmNvbW1hbmQobXRkLCBPTkVOQU5EX0NNRF9SRUFET09CLCB0bywgbXRkLT5vb2JzaXplKTsKQEAgLTEyMTUsOSArMTIyNyw5IEBACiAJaWYgKHN0YXR1cykKIAkJcmV0dXJuIHN0YXR1czsKIAotCXRoaXMtPnJlYWRfYnVmZmVycmFtKG10ZCwgT05FTkFORF9TUEFSRVJBTSwgb29iYnVmLCAwLCBtdGQtPm9vYnNpemUpOworCXRoaXMtPnJlYWRfYnVmZmVycmFtKG10ZCwgT05FTkFORF9TUEFSRVJBTSwgb29iX2J1ZiwgMCwgbXRkLT5vb2JzaXplKTsKIAlmb3IgKGkgPSAwOyBpIDwgbXRkLT5vb2JzaXplOyBpKyspCi0JCWlmIChidWZbaV0gIT0gMHhGRiAmJiBidWZbaV0gIT0gb29iYnVmW2ldKQorCQlpZiAoYnVmW2ldICE9IDB4RkYgJiYgYnVmW2ldICE9IG9vYl9idWZbaV0pCiAJCQlyZXR1cm4gLUVCQURNU0c7CiAKIAlyZXR1cm4gMDsKQEAgLTEyNzMsNiArMTI4NSwxMTIgQEAKIAogI2RlZmluZSBOT1RBTElHTkVEKHgpCSgoeCAmICh0aGlzLT5zdWJwYWdlc2l6ZSAtIDEpKSAhPSAwKQogCitzdGF0aWMgdm9pZCBvbmVuYW5kX3BhbmljX3dhaXQoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJc3RydWN0IG9uZW5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwl1bnNpZ25lZCBpbnQgaW50ZXJydXB0OworCWludCBpOworCQorCWZvciAoaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKKwkJaW50ZXJydXB0ID0gdGhpcy0+cmVhZF93b3JkKHRoaXMtPmJhc2UgKyBPTkVOQU5EX1JFR19JTlRFUlJVUFQpOworCQlpZiAoaW50ZXJydXB0ICYgT05FTkFORF9JTlRfTUFTVEVSKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorfQorCisvKioKKyAqIG9uZW5hbmRfcGFuaWNfd3JpdGUgLSBbTVREIEludGVyZmFjZV0gd3JpdGUgYnVmZmVyIHRvIEZMQVNIIGluIGEgcGFuaWMgY29udGV4dAorICogQHBhcmFtIG10ZAkJTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSB0bwkJb2Zmc2V0IHRvIHdyaXRlIHRvCisgKiBAcGFyYW0gbGVuCQludW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyAqIEBwYXJhbSByZXRsZW4JcG9pbnRlciB0byB2YXJpYWJsZSB0byBzdG9yZSB0aGUgbnVtYmVyIG9mIHdyaXR0ZW4gYnl0ZXMKKyAqIEBwYXJhbSBidWYJCXRoZSBkYXRhIHRvIHdyaXRlCisgKgorICogV3JpdGUgd2l0aCBFQ0MKKyAqLworc3RhdGljIGludCBvbmVuYW5kX3BhbmljX3dyaXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgdG8sIHNpemVfdCBsZW4sCisJCQkgc2l6ZV90ICpyZXRsZW4sIGNvbnN0IHVfY2hhciAqYnVmKQoreworCXN0cnVjdCBvbmVuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJaW50IGNvbHVtbiwgc3VicGFnZTsKKwlpbnQgd3JpdHRlbiA9IDA7CisJaW50IHJldCA9IDA7CisKKwlpZiAodGhpcy0+c3RhdGUgPT0gRkxfUE1fU1VTUEVOREVEKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogV2FpdCBmb3IgYW55IGV4aXN0aW5nIG9wZXJhdGlvbiB0byBjbGVhciAqLworCW9uZW5hbmRfcGFuaWNfd2FpdChtdGQpOworCisJREVCVUcoTVREX0RFQlVHX0xFVkVMMywgIm9uZW5hbmRfcGFuaWNfd3JpdGU6IHRvID0gMHglMDh4LCBsZW4gPSAlaVxuIiwKKwkgICAgICAodW5zaWduZWQgaW50KSB0bywgKGludCkgbGVuKTsKKworCS8qIEluaXRpYWxpemUgcmV0bGVuLCBpbiBjYXNlIG9mIGVhcmx5IGV4aXQgKi8KKwkqcmV0bGVuID0gMDsKKworCS8qIERvIG5vdCBhbGxvdyB3cml0ZXMgcGFzdCBlbmQgb2YgZGV2aWNlICovCisJaWYgKHVubGlrZWx5KCh0byArIGxlbikgPiBtdGQtPnNpemUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAib25lbmFuZF9wYW5pY193cml0ZTogQXR0ZW1wdCB3cml0ZSB0byBwYXN0IGVuZCBvZiBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBSZWplY3Qgd3JpdGVzLCB3aGljaCBhcmUgbm90IHBhZ2UgYWxpZ25lZCAqLworICAgICAgICBpZiAodW5saWtlbHkoTk9UQUxJR05FRCh0bykpIHx8IHVubGlrZWx5KE5PVEFMSUdORUQobGVuKSkpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIm9uZW5hbmRfcGFuaWNfd3JpdGU6IEF0dGVtcHQgdG8gd3JpdGUgbm90IHBhZ2UgYWxpZ25lZCBkYXRhXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisJY29sdW1uID0gdG8gJiAobXRkLT53cml0ZXNpemUgLSAxKTsKKworCS8qIExvb3AgdW50aWwgYWxsIGRhdGEgd3JpdGUgKi8KKwl3aGlsZSAod3JpdHRlbiA8IGxlbikgeworCQlpbnQgdGhpc2xlbiA9IG1pbl90KGludCwgbXRkLT53cml0ZXNpemUgLSBjb2x1bW4sIGxlbiAtIHdyaXR0ZW4pOworCQl1X2NoYXIgKndidWYgPSAodV9jaGFyICopIGJ1ZjsKKworCQl0aGlzLT5jb21tYW5kKG10ZCwgT05FTkFORF9DTURfQlVGRkVSUkFNLCB0bywgdGhpc2xlbik7CisKKwkJLyogUGFydGlhbCBwYWdlIHdyaXRlICovCisJCXN1YnBhZ2UgPSB0aGlzbGVuIDwgbXRkLT53cml0ZXNpemU7CisJCWlmIChzdWJwYWdlKSB7CisJCQltZW1zZXQodGhpcy0+cGFnZV9idWYsIDB4ZmYsIG10ZC0+d3JpdGVzaXplKTsKKwkJCW1lbWNweSh0aGlzLT5wYWdlX2J1ZiArIGNvbHVtbiwgYnVmLCB0aGlzbGVuKTsKKwkJCXdidWYgPSB0aGlzLT5wYWdlX2J1ZjsKKwkJfQorCisJCXRoaXMtPndyaXRlX2J1ZmZlcnJhbShtdGQsIE9ORU5BTkRfREFUQVJBTSwgd2J1ZiwgMCwgbXRkLT53cml0ZXNpemUpOworCQl0aGlzLT53cml0ZV9idWZmZXJyYW0obXRkLCBPTkVOQU5EX1NQQVJFUkFNLCBmZmNoYXJzLCAwLCBtdGQtPm9vYnNpemUpOworCisJCXRoaXMtPmNvbW1hbmQobXRkLCBPTkVOQU5EX0NNRF9QUk9HLCB0bywgbXRkLT53cml0ZXNpemUpOworCisJCW9uZW5hbmRfcGFuaWNfd2FpdChtdGQpOworCisJCS8qIEluIHBhcnRpYWwgcGFnZSB3cml0ZSB3ZSBkb24ndCB1cGRhdGUgYnVmZmVycmFtICovCisJCW9uZW5hbmRfdXBkYXRlX2J1ZmZlcnJhbShtdGQsIHRvLCAhcmV0ICYmICFzdWJwYWdlKTsKKwkJaWYgKE9ORU5BTkRfSVNfMlBMQU5FKHRoaXMpKSB7CisJCQlPTkVOQU5EX1NFVF9CVUZGRVJSQU0xKHRoaXMpOworCQkJb25lbmFuZF91cGRhdGVfYnVmZmVycmFtKG10ZCwgdG8gKyB0aGlzLT53cml0ZXNpemUsICFyZXQgJiYgIXN1YnBhZ2UpOworCQl9CisKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJvbmVuYW5kX3BhbmljX3dyaXRlOiB3cml0ZSBmYWlsZWQgJWRcbiIsIHJldCk7CisJCQlicmVhazsKKwkJfQorCisJCXdyaXR0ZW4gKz0gdGhpc2xlbjsKKworCQlpZiAod3JpdHRlbiA9PSBsZW4pCisJCQlicmVhazsKKworCQljb2x1bW4gPSAwOworCQl0byArPSB0aGlzbGVuOworCQlidWYgKz0gdGhpc2xlbjsKKwl9CisKKwkqcmV0bGVuID0gd3JpdHRlbjsKKwlyZXR1cm4gcmV0OworfQorCiAvKioKICAqIG9uZW5hbmRfZmlsbF9hdXRvX29vYiAtIFtJbnRlcm5hbF0gb29iIGF1dG8tcGxhY2VtZW50IHRyYW5zZmVyCiAgKiBAcGFyYW0gbXRkCQlNVEQgZGV2aWNlIHN0cnVjdHVyZQpAQCAtMTQxOSw3ICsxNTM3LDcgQEAKIAkJfQogCiAJCS8qIE9ubHkgY2hlY2sgdmVyaWZ5IHdyaXRlIHR1cm4gb24gKi8KLQkJcmV0ID0gb25lbmFuZF92ZXJpZnkobXRkLCAodV9jaGFyICopIHdidWYsIHRvLCB0aGlzbGVuKTsKKwkJcmV0ID0gb25lbmFuZF92ZXJpZnkobXRkLCBidWYsIHRvLCB0aGlzbGVuKTsKIAkJaWYgKHJldCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJvbmVuYW5kX3dyaXRlX29wc19ub2xvY2s6IHZlcmlmeSBmYWlsZWQgJWRcbiIsIHJldCk7CiAJCQlicmVhazsKQEAgLTE0MzUsOSArMTU1Myw2IEBACiAJCWJ1ZiArPSB0aGlzbGVuOwogCX0KIAotCS8qIERlc2VsZWN0IGFuZCB3YWtlIHVwIGFueW9uZSB3YWl0aW5nIG9uIHRoZSBkZXZpY2UgKi8KLQlvbmVuYW5kX3JlbGVhc2VfZGV2aWNlKG10ZCk7Ci0KIAlvcHMtPnJldGxlbiA9IHdyaXR0ZW47CiAKIAlyZXR1cm4gcmV0OwpAQCAtMjE0OCw3ICsyMjYzLDcgQEAKIAogCSpyZXRsZW4gPSAwOwogCi0JZGVuc2l0eSA9IHRoaXMtPmRldmljZV9pZCA+PiBPTkVOQU5EX0RFVklDRV9ERU5TSVRZX1NISUZUOworCWRlbnNpdHkgPSBvbmVuYW5kX2dldF9kZW5zaXR5KHRoaXMtPmRldmljZV9pZCk7CiAJaWYgKGRlbnNpdHkgPCBPTkVOQU5EX0RFVklDRV9ERU5TSVRZXzUxMk1iKQogCQlvdHBfcGFnZXMgPSAyMDsKIAllbHNlCkBAIC0yMjk5LDcgKzI0MTQsOCBAQAogc3RhdGljIGludCBvbmVuYW5kX2xvY2tfdXNlcl9wcm90X3JlZyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sCiAJCQlzaXplX3QgbGVuKQogewotCXVuc2lnbmVkIGNoYXIgb29iX2J1Zls2NF07CisJc3RydWN0IG9uZW5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwl1X2NoYXIgKm9vYl9idWYgPSB0aGlzLT5vb2JfYnVmOwogCXNpemVfdCByZXRsZW47CiAJaW50IHJldDsKIApAQCAtMjMzOSw3ICsyNDU1LDcgQEAKIAl1bnNpZ25lZCBpbnQgZGVuc2l0eSwgcHJvY2VzczsKIAogCS8qIExvY2sgc2NoZW1lIGRlcGVuZHMgb24gZGVuc2l0eSBhbmQgcHJvY2VzcyAqLwotCWRlbnNpdHkgPSB0aGlzLT5kZXZpY2VfaWQgPj4gT05FTkFORF9ERVZJQ0VfREVOU0lUWV9TSElGVDsKKwlkZW5zaXR5ID0gb25lbmFuZF9nZXRfZGVuc2l0eSh0aGlzLT5kZXZpY2VfaWQpOwogCXByb2Nlc3MgPSB0aGlzLT52ZXJzaW9uX2lkID4+IE9ORU5BTkRfVkVSU0lPTl9QUk9DRVNTX1NISUZUOwogCiAJLyogTG9jayBzY2hlbWUgKi8KQEAgLTIzODgsNyArMjUwNCw3IEBACiAgICAgICAgIHZjYyA9IGRldmljZSAmIE9ORU5BTkRfREVWSUNFX1ZDQ19NQVNLOwogICAgICAgICBkZW11eGVkID0gZGV2aWNlICYgT05FTkFORF9ERVZJQ0VfSVNfREVNVVg7CiAgICAgICAgIGRkcCA9IGRldmljZSAmIE9ORU5BTkRfREVWSUNFX0lTX0REUDsKLSAgICAgICAgZGVuc2l0eSA9IGRldmljZSA+PiBPTkVOQU5EX0RFVklDRV9ERU5TSVRZX1NISUZUOworICAgICAgICBkZW5zaXR5ID0gb25lbmFuZF9nZXRfZGVuc2l0eShkZXZpY2UpOwogICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlc09uZU5BTkQlcyAlZE1CICVzViAxNi1iaXQgKDB4JTAyeClcbiIsCiAgICAgICAgICAgICAgICAgZGVtdXhlZCA/ICIiIDogIk11eGVkICIsCiAgICAgICAgICAgICAgICAgZGRwID8gIihERFApIiA6ICIiLApAQCAtMjQ4MCw3ICsyNTk2LDcgQEAKIAl0aGlzLT5kZXZpY2VfaWQgPSBkZXZfaWQ7CiAJdGhpcy0+dmVyc2lvbl9pZCA9IHZlcl9pZDsKIAotCWRlbnNpdHkgPSBkZXZfaWQgPj4gT05FTkFORF9ERVZJQ0VfREVOU0lUWV9TSElGVDsKKwlkZW5zaXR5ID0gb25lbmFuZF9nZXRfZGVuc2l0eShkZXZfaWQpOwogCXRoaXMtPmNoaXBzaXplID0gKDE2IDw8IGRlbnNpdHkpIDw8IDIwOwogCS8qIFNldCBkZW5zaXR5IG1hc2suIGl0IGlzIHVzZWQgZm9yIEREUCAqLwogCWlmIChPTkVOQU5EX0lTX0REUCh0aGlzKSkKQEAgLTI2NjQsNiArMjc4MCw3IEBACiAJbXRkLT53cml0ZSA9IG9uZW5hbmRfd3JpdGU7CiAJbXRkLT5yZWFkX29vYiA9IG9uZW5hbmRfcmVhZF9vb2I7CiAJbXRkLT53cml0ZV9vb2IgPSBvbmVuYW5kX3dyaXRlX29vYjsKKwltdGQtPnBhbmljX3dyaXRlID0gb25lbmFuZF9wYW5pY193cml0ZTsKICNpZmRlZiBDT05GSUdfTVREX09ORU5BTkRfT1RQCiAJbXRkLT5nZXRfZmFjdF9wcm90X2luZm8gPSBvbmVuYW5kX2dldF9mYWN0X3Byb3RfaW5mbzsKIAltdGQtPnJlYWRfZmFjdF9wcm90X3JlZyA9IG9uZW5hbmRfcmVhZF9mYWN0X3Byb3RfcmVnOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvcmVkYm9vdC5jIGIvZHJpdmVycy9tdGQvcmVkYm9vdC5jCmluZGV4IGE2MTM1MWYuLjQ3NDc0OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3JlZGJvb3QuYworKysgYi9kcml2ZXJzL210ZC9yZWRib290LmMKQEAgLTU5LDE2ICs1OSwzMSBAQAogCXN0YXRpYyBjaGFyIG51bGxzdHJpbmdbXSA9ICJ1bmFsbG9jYXRlZCI7CiAjZW5kaWYKIAorCWlmICggZGlyZWN0b3J5IDwgMCApIHsKKwkJb2Zmc2V0ID0gbWFzdGVyLT5zaXplICsgZGlyZWN0b3J5ICogbWFzdGVyLT5lcmFzZXNpemU7CisJCXdoaWxlIChtYXN0ZXItPmJsb2NrX2lzYmFkICYmIAorCQkgICAgICAgbWFzdGVyLT5ibG9ja19pc2JhZChtYXN0ZXIsIG9mZnNldCkpIHsKKwkJCWlmICghb2Zmc2V0KSB7CisJCQlub2dvb2Q6CisJCQkJcHJpbnRrKEtFUk5fTk9USUNFICJGYWlsZWQgdG8gZmluZCBhIG5vbi1iYWQgYmxvY2sgdG8gY2hlY2sgZm9yIFJlZEJvb3QgcGFydGl0aW9uIHRhYmxlXG4iKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCW9mZnNldCAtPSBtYXN0ZXItPmVyYXNlc2l6ZTsKKwkJfQorCX0gZWxzZSB7CisJCW9mZnNldCA9IGRpcmVjdG9yeSAqIG1hc3Rlci0+ZXJhc2VzaXplOworCQl3aGlsZSAobWFzdGVyLT5ibG9ja19pc2JhZCAmJiAKKwkJICAgICAgIG1hc3Rlci0+YmxvY2tfaXNiYWQobWFzdGVyLCBvZmZzZXQpKSB7CisJCQlvZmZzZXQgKz0gbWFzdGVyLT5lcmFzZXNpemU7CisJCQlpZiAob2Zmc2V0ID09IG1hc3Rlci0+c2l6ZSkKKwkJCQlnb3RvIG5vZ29vZDsKKwkJfQorCX0KIAlidWYgPSB2bWFsbG9jKG1hc3Rlci0+ZXJhc2VzaXplKTsKIAogCWlmICghYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmICggZGlyZWN0b3J5IDwgMCApCi0JCW9mZnNldCA9IG1hc3Rlci0+c2l6ZSArIGRpcmVjdG9yeSptYXN0ZXItPmVyYXNlc2l6ZTsKLQllbHNlCi0JCW9mZnNldCA9IGRpcmVjdG9yeSptYXN0ZXItPmVyYXNlc2l6ZTsKLQogCXByaW50ayhLRVJOX05PVElDRSAiU2VhcmNoaW5nIGZvciBSZWRCb290IHBhcnRpdGlvbiB0YWJsZSBpbiAlcyBhdCBvZmZzZXQgMHglbHhcbiIsCiAJICAgICAgIG1hc3Rlci0+bmFtZSwgb2Zmc2V0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL2J1aWxkLmMgYi9kcml2ZXJzL210ZC91YmkvYnVpbGQuYwppbmRleCAwMjM2NTM5Li42YWM4MWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvYnVpbGQuYworKysgYi9kcml2ZXJzL210ZC91YmkvYnVpbGQuYwpAQCAtMjEsMTEgKzIxLDE2IEBACiAgKi8KIAogLyoKLSAqIFRoaXMgZmlsZSBpbmNsdWRlcyBVQkkgaW5pdGlhbGl6YXRpb24gYW5kIGJ1aWxkaW5nIG9mIFVCSSBkZXZpY2VzLiBBdCB0aGUKLSAqIG1vbWVudCBVQkkgZGV2aWNlcyBtYXkgb25seSBiZSBhZGRlZCB3aGlsZSBVQkkgaXMgaW5pdGlhbGl6ZWQsIGJ1dCBkeW5hbWljCi0gKiBkZXZpY2UgYWRkL3JlbW92ZSBmdW5jdGlvbmFsaXR5IGlzIHBsYW5uZWQuIEFsc28sIGF0IHRoZSBtb21lbnQgd2Ugb25seQotICogYXR0YWNoIFVCSSBkZXZpY2VzIGJ5IHNjYW5uaW5nLCB3aGljaCB3aWxsIGJlY29tZSBhIGJvdHRsZW5lY2sgd2hlbiBmbGFzaGVzCi0gKiByZWFjaCBjZXJ0YWluIGxhcmdlIHNpemUuIFRoZW4gb25lIG1heSBpbXByb3ZlIFVCSSBhbmQgYWRkIG90aGVyIG1ldGhvZHMuCisgKiBUaGlzIGZpbGUgaW5jbHVkZXMgVUJJIGluaXRpYWxpemF0aW9uIGFuZCBidWlsZGluZyBvZiBVQkkgZGV2aWNlcy4KKyAqCisgKiBXaGVuIFVCSSBpcyBpbml0aWFsaXplZCwgaXQgYXR0YWNoZXMgYWxsIHRoZSBNVEQgZGV2aWNlcyBzcGVjaWZpZWQgYXMgdGhlCisgKiBtb2R1bGUgbG9hZCBwYXJhbWV0ZXJzIG9yIHRoZSBrZXJuZWwgYm9vdCBwYXJhbWV0ZXJzLiBJZiBNVEQgZGV2aWNlcyB3ZXJlCisgKiBzcGVjaWZpZWQsIFVCSSBkb2VzIG5vdCBhdHRhY2ggYW55IE1URCBkZXZpY2UsIGJ1dCBpdCBpcyBwb3NzaWJsZSB0byBkbworICogbGF0ZXIgdXNpbmcgdGhlICJVQkkgY29udHJvbCBkZXZpY2UiLgorICoKKyAqIEF0IHRoZSBtb21lbnQgd2Ugb25seSBhdHRhY2ggVUJJIGRldmljZXMgYnkgc2Nhbm5pbmcsIHdoaWNoIHdpbGwgYmVjb21lIGEKKyAqIGJvdHRsZW5lY2sgd2hlbiBmbGFzaGVzIHJlYWNoIGNlcnRhaW4gbGFyZ2Ugc2l6ZS4gVGhlbiBvbmUgbWF5IGltcHJvdmUgVUJJCisgKiBhbmQgYWRkIG90aGVyIG1ldGhvZHMsIGFsdGhvdWdoIGl0IGRvZXMgbm90IHNlZW0gdG8gYmUgZWFzeSB0byBkby4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CkBAIC0zMyw3ICszOCw5IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSAidWJpLmgiCiAKIC8qIE1heGltdW0gbGVuZ3RoIG9mIHRoZSAnbXRkPScgcGFyYW1ldGVyICovCkBAIC00MywxMyArNTAsMTEgQEAKICAqIHN0cnVjdCBtdGRfZGV2X3BhcmFtIC0gTVREIGRldmljZSBwYXJhbWV0ZXIgZGVzY3JpcHRpb24gZGF0YSBzdHJ1Y3R1cmUuCiAgKiBAbmFtZTogTVREIGRldmljZSBuYW1lIG9yIG51bWJlciBzdHJpbmcKICAqIEB2aWRfaGRyX29mZnM6IFZJRCBoZWFkZXIgb2Zmc2V0Ci0gKiBAZGF0YV9vZmZzOiBkYXRhIG9mZnNldAogICovCiBzdHJ1Y3QgbXRkX2Rldl9wYXJhbQogewogCWNoYXIgbmFtZVtNVERfUEFSQU1fTEVOX01BWF07CiAJaW50IHZpZF9oZHJfb2ZmczsKLQlpbnQgZGF0YV9vZmZzOwogfTsKIAogLyogTnVtYmVycyBvZiBlbGVtZW50cyBzZXQgaW4gdGhlIEBtdGRfZGV2X3BhcmFtIGFycmF5ICovCkBAIC01OCwxNSArNjMsMjggQEAKIC8qIE1URCBkZXZpY2VzIHNwZWNpZmljYXRpb24gcGFyYW1ldGVycyAqLwogc3RhdGljIHN0cnVjdCBtdGRfZGV2X3BhcmFtIG10ZF9kZXZfcGFyYW1bVUJJX01BWF9ERVZJQ0VTXTsKIAotLyogTnVtYmVyIG9mIFVCSSBkZXZpY2VzIGluIHN5c3RlbSAqLwotaW50IHViaV9kZXZpY2VzX2NudDsKLQotLyogQWxsIFVCSSBkZXZpY2VzIGluIHN5c3RlbSAqLwotc3RydWN0IHViaV9kZXZpY2UgKnViaV9kZXZpY2VzW1VCSV9NQVhfREVWSUNFU107Ci0KIC8qIFJvb3QgVUJJICJjbGFzcyIgb2JqZWN0IChjb3JyZXNwb25kcyB0byAnLzxzeXNmcz4vY2xhc3MvdWJpLycpICovCiBzdHJ1Y3QgY2xhc3MgKnViaV9jbGFzczsKIAorLyogU2xhYiBjYWNoZSBmb3Igd2Vhci1sZXZlbGluZyBlbnRyaWVzICovCitzdHJ1Y3Qga21lbV9jYWNoZSAqdWJpX3dsX2VudHJ5X3NsYWI7CisKKy8qIFVCSSBjb250cm9sIGNoYXJhY3RlciBkZXZpY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSB1YmlfY3RybF9jZGV2ID0geworCS5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUiwKKwkubmFtZSA9ICJ1YmlfY3RybCIsCisJLmZvcHMgPSAmdWJpX2N0cmxfY2Rldl9vcGVyYXRpb25zLAorfTsKKworLyogQWxsIFVCSSBkZXZpY2VzIGluIHN5c3RlbSAqLworc3RhdGljIHN0cnVjdCB1YmlfZGV2aWNlICp1YmlfZGV2aWNlc1tVQklfTUFYX0RFVklDRVNdOworCisvKiBTZXJpYWxpemVzIFVCSSBkZXZpY2VzIGNyZWF0aW9ucyBhbmQgcmVtb3ZhbHMgKi8KK0RFRklORV9NVVRFWCh1YmlfZGV2aWNlc19tdXRleCk7CisKKy8qIFByb3RlY3RzIEB1YmlfZGV2aWNlcyBhbmQgQHViaS0+cmVmX2NvdW50ICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHViaV9kZXZpY2VzX2xvY2spOworCiAvKiAiU2hvdyIgbWV0aG9kIGZvciBmaWxlcyBpbiAnLzxzeXNmcz4vY2xhc3MvdWJpLycgKi8KIHN0YXRpYyBzc2l6ZV90IHViaV92ZXJzaW9uX3Nob3coc3RydWN0IGNsYXNzICpjbGFzcywgY2hhciAqYnVmKQogewpAQCAtMTAxLDM4ICsxMTksMTUwIEBACiAJX19BVFRSKG1pbl9pb19zaXplLCBTX0lSVUdPLCBkZXZfYXR0cmlidXRlX3Nob3csIE5VTEwpOwogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9iZ3RfZW5hYmxlZCA9CiAJX19BVFRSKGJndF9lbmFibGVkLCBTX0lSVUdPLCBkZXZfYXR0cmlidXRlX3Nob3csIE5VTEwpOworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9tdGRfbnVtID0KKwlfX0FUVFIobXRkX251bSwgU19JUlVHTywgZGV2X2F0dHJpYnV0ZV9zaG93LCBOVUxMKTsKKworLyoqCisgKiB1YmlfZ2V0X2RldmljZSAtIGdldCBVQkkgZGV2aWNlLgorICogQHViaV9udW06IFVCSSBkZXZpY2UgbnVtYmVyCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0IGZvciBVQkkgZGV2aWNlIG51bWJlcgorICogQHViaV9udW0sIG9yICVOVUxMIGlmIHRoZSBkZXZpY2UgZG9lcyBub3QgZXhpc3QuIFRoaXMgZnVuY3Rpb24gaW5jcmVhc2VzIHRoZQorICogZGV2aWNlIHJlZmVyZW5jZSBjb3VudCB0byBwcmV2ZW50IHJlbW92YWwgb2YgdGhlIGRldmljZS4gSW4gb3RoZXIgd29yZHMsIHRoZQorICogZGV2aWNlIGNhbm5vdCBiZSByZW1vdmVkIGlmIGl0cyByZWZlcmVuY2UgY291bnQgaXMgbm90IHplcm8uCisgKi8KK3N0cnVjdCB1YmlfZGV2aWNlICp1YmlfZ2V0X2RldmljZShpbnQgdWJpX251bSkKK3sKKwlzdHJ1Y3QgdWJpX2RldmljZSAqdWJpOworCisJc3Bpbl9sb2NrKCZ1YmlfZGV2aWNlc19sb2NrKTsKKwl1YmkgPSB1YmlfZGV2aWNlc1t1YmlfbnVtXTsKKwlpZiAodWJpKSB7CisJCXViaV9hc3NlcnQodWJpLT5yZWZfY291bnQgPj0gMCk7CisJCXViaS0+cmVmX2NvdW50ICs9IDE7CisJCWdldF9kZXZpY2UoJnViaS0+ZGV2KTsKKwl9CisJc3Bpbl91bmxvY2soJnViaV9kZXZpY2VzX2xvY2spOworCisJcmV0dXJuIHViaTsKK30KKworLyoqCisgKiB1YmlfcHV0X2RldmljZSAtIGRyb3AgYW4gVUJJIGRldmljZSByZWZlcmVuY2UuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICovCit2b2lkIHViaV9wdXRfZGV2aWNlKHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpCit7CisJc3Bpbl9sb2NrKCZ1YmlfZGV2aWNlc19sb2NrKTsKKwl1YmktPnJlZl9jb3VudCAtPSAxOworCXB1dF9kZXZpY2UoJnViaS0+ZGV2KTsKKwlzcGluX3VubG9jaygmdWJpX2RldmljZXNfbG9jayk7Cit9CisKKy8qKgorICogdWJpX2dldF9ieV9tYWpvciAtIGdldCBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdCBieSBjaGFyYWN0ZXIgZGV2aWNlCisgKiAgICAgICAgICAgICAgICAgICAgbWFqb3IgbnVtYmVyLgorICogQG1ham9yOiBtYWpvciBudW1iZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gJ3ViaV9nZXRfZGV2aWNlKCknLCBidXQgaXQgc2VhcmNoZXMgdGhlIGRldmljZQorICogYnkgaXRzIG1ham9yIG51bWJlci4KKyAqLworc3RydWN0IHViaV9kZXZpY2UgKnViaV9nZXRfYnlfbWFqb3IoaW50IG1ham9yKQoreworCWludCBpOworCXN0cnVjdCB1YmlfZGV2aWNlICp1Ymk7CisKKwlzcGluX2xvY2soJnViaV9kZXZpY2VzX2xvY2spOworCWZvciAoaSA9IDA7IGkgPCBVQklfTUFYX0RFVklDRVM7IGkrKykgeworCQl1YmkgPSB1YmlfZGV2aWNlc1tpXTsKKwkJaWYgKHViaSAmJiBNQUpPUih1YmktPmNkZXYuZGV2KSA9PSBtYWpvcikgeworCQkJdWJpX2Fzc2VydCh1YmktPnJlZl9jb3VudCA+PSAwKTsKKwkJCXViaS0+cmVmX2NvdW50ICs9IDE7CisJCQlnZXRfZGV2aWNlKCZ1YmktPmRldik7CisJCQlzcGluX3VubG9jaygmdWJpX2RldmljZXNfbG9jayk7CisJCQlyZXR1cm4gdWJpOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZ1YmlfZGV2aWNlc19sb2NrKTsKKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIHViaV9tYWpvcjJudW0gLSBnZXQgVUJJIGRldmljZSBudW1iZXIgYnkgY2hhcmFjdGVyIGRldmljZSBtYWpvciBudW1iZXIuCisgKiBAbWFqb3I6IG1ham9yIG51bWJlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgVUJJIGRldmljZSBudW1iZXIgb2JqZWN0IGJ5IGl0cyBtYWpvciBudW1iZXIuIElmIFVCSQorICogZGV2aWNlIHdhcyBub3QgZm91bmQsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAtRU5PREVWLCBvdGhlcndpc2UgdGhlIFVCSSBkZXZpY2UKKyAqIG51bWJlciBpcyByZXR1cm5lZC4KKyAqLworaW50IHViaV9tYWpvcjJudW0oaW50IG1ham9yKQoreworCWludCBpLCB1YmlfbnVtID0gLUVOT0RFVjsKKworCXNwaW5fbG9jaygmdWJpX2RldmljZXNfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IFVCSV9NQVhfREVWSUNFUzsgaSsrKSB7CisJCXN0cnVjdCB1YmlfZGV2aWNlICp1YmkgPSB1YmlfZGV2aWNlc1tpXTsKKworCQlpZiAodWJpICYmIE1BSk9SKHViaS0+Y2Rldi5kZXYpID09IG1ham9yKSB7CisJCQl1YmlfbnVtID0gdWJpLT51YmlfbnVtOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJnViaV9kZXZpY2VzX2xvY2spOworCisJcmV0dXJuIHViaV9udW07Cit9CiAKIC8qICJTaG93IiBtZXRob2QgZm9yIGZpbGVzIGluICcvPHN5c2ZzPi9jbGFzcy91YmkvdWJpWC8nICovCiBzdGF0aWMgc3NpemVfdCBkZXZfYXR0cmlidXRlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQljb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpOworCXNzaXplX3QgcmV0OworCXN0cnVjdCB1YmlfZGV2aWNlICp1Ymk7CiAKKwkvKgorCSAqIFRoZSBiZWxvdyBjb2RlIGxvb2tzIHdlaXJkLCBidXQgaXQgYWN0dWFsbHkgbWFrZXMgc2Vuc2UuIFdlIGdldCB0aGUKKwkgKiBVQkkgZGV2aWNlIHJlZmVyZW5jZSBmcm9tIHRoZSBjb250YWluZWQgJ3N0cnVjdCB1YmlfZGV2aWNlJy4gQnV0IGl0CisJICogaXMgdW5jbGVhciBpZiB0aGUgZGV2aWNlIHdhcyByZW1vdmVkIG9yIG5vdCB5ZXQuIEluZGVlZCwgaWYgdGhlCisJICogZGV2aWNlIHdhcyByZW1vdmVkIGJlZm9yZSB3ZSBpbmNyZWFzZWQgaXRzIHJlZmVyZW5jZSBjb3VudCwKKwkgKiAndWJpX2dldF9kZXZpY2UoKScgd2lsbCByZXR1cm4gLUVOT0RFViBhbmQgd2UgZmFpbC4KKwkgKgorCSAqIFJlbWVtYmVyLCAnc3RydWN0IHViaV9kZXZpY2UnIGlzIGZyZWVkIGluIHRoZSByZWxlYXNlIGZ1bmN0aW9uLCBzbworCSAqIHdlIHN0aWxsIGNhbiB1c2UgJ3ViaS0+dWJpX251bScuCisJICovCiAJdWJpID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHViaV9kZXZpY2UsIGRldik7Ci0JaWYgKGF0dHIgPT0gJmRldl9lcmFzZWJsb2NrX3NpemUpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB1YmktPmxlYl9zaXplKTsKLQllbHNlIGlmIChhdHRyID09ICZkZXZfYXZhaWxfZXJhc2VibG9ja3MpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB1YmktPmF2YWlsX3BlYnMpOwotCWVsc2UgaWYgKGF0dHIgPT0gJmRldl90b3RhbF9lcmFzZWJsb2NrcykKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHViaS0+Z29vZF9wZWJfY291bnQpOwotCWVsc2UgaWYgKGF0dHIgPT0gJmRldl92b2x1bWVzX2NvdW50KQotCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdWJpLT52b2xfY291bnQpOwotCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9tYXhfZWMpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB1YmktPm1heF9lYyk7Ci0JZWxzZSBpZiAoYXR0ciA9PSAmZGV2X3Jlc2VydmVkX2Zvcl9iYWQpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB1YmktPmJlYl9yc3ZkX3BlYnMpOwotCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9iYWRfcGViX2NvdW50KQotCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdWJpLT5iYWRfcGViX2NvdW50KTsKLQllbHNlIGlmIChhdHRyID09ICZkZXZfbWF4X3ZvbF9jb3VudCkKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHViaS0+dnRibF9zbG90cyk7Ci0JZWxzZSBpZiAoYXR0ciA9PSAmZGV2X21pbl9pb19zaXplKQotCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdWJpLT5taW5faW9fc2l6ZSk7Ci0JZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2JndF9lbmFibGVkKQotCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdWJpLT50aHJlYWRfZW5hYmxlZCk7Ci0JZWxzZQotCQlCVUcoKTsKKwl1YmkgPSB1YmlfZ2V0X2RldmljZSh1YmktPnViaV9udW0pOworCWlmICghdWJpKQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJldHVybiAwOworCWlmIChhdHRyID09ICZkZXZfZXJhc2VibG9ja19zaXplKQorCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB1YmktPmxlYl9zaXplKTsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfYXZhaWxfZXJhc2VibG9ja3MpCisJCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHViaS0+YXZhaWxfcGVicyk7CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X3RvdGFsX2VyYXNlYmxvY2tzKQorCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB1YmktPmdvb2RfcGViX2NvdW50KTsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfdm9sdW1lc19jb3VudCkKKwkJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgdWJpLT52b2xfY291bnQgLSBVQklfSU5UX1ZPTF9DT1VOVCk7CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X21heF9lYykKKwkJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgdWJpLT5tYXhfZWMpOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9yZXNlcnZlZF9mb3JfYmFkKQorCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB1YmktPmJlYl9yc3ZkX3BlYnMpOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9iYWRfcGViX2NvdW50KQorCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB1YmktPmJhZF9wZWJfY291bnQpOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9tYXhfdm9sX2NvdW50KQorCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB1YmktPnZ0Ymxfc2xvdHMpOworCWVsc2UgaWYgKGF0dHIgPT0gJmRldl9taW5faW9fc2l6ZSkKKwkJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgdWJpLT5taW5faW9fc2l6ZSk7CisJZWxzZSBpZiAoYXR0ciA9PSAmZGV2X2JndF9lbmFibGVkKQorCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB1YmktPnRocmVhZF9lbmFibGVkKTsKKwllbHNlIGlmIChhdHRyID09ICZkZXZfbXRkX251bSkKKwkJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgdWJpLT5tdGQtPmluZGV4KTsKKwllbHNlCisJCXJldCA9IC1FSU5WQUw7CisKKwl1YmlfcHV0X2RldmljZSh1YmkpOworCXJldHVybiByZXQ7CiB9CiAKIC8qIEZha2UgInJlbGVhc2UiIG1ldGhvZCBmb3IgVUJJIGRldmljZXMgKi8KQEAgLTE1MCw2OCArMjgwLDQ0IEBACiAJaW50IGVycjsKIAogCXViaS0+ZGV2LnJlbGVhc2UgPSBkZXZfcmVsZWFzZTsKLQl1YmktPmRldi5kZXZ0ID0gTUtERVYodWJpLT5tYWpvciwgMCk7CisJdWJpLT5kZXYuZGV2dCA9IHViaS0+Y2Rldi5kZXY7CiAJdWJpLT5kZXYuY2xhc3MgPSB1YmlfY2xhc3M7CiAJc3ByaW50ZigmdWJpLT5kZXYuYnVzX2lkWzBdLCBVQklfTkFNRV9TVFIiJWQiLCB1YmktPnViaV9udW0pOwogCWVyciA9IGRldmljZV9yZWdpc3RlcigmdWJpLT5kZXYpOwogCWlmIChlcnIpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gZXJyOwogCiAJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ1YmktPmRldiwgJmRldl9lcmFzZWJsb2NrX3NpemUpOwogCWlmIChlcnIpCi0JCWdvdG8gb3V0X3VucmVnaXN0ZXI7CisJCXJldHVybiBlcnI7CiAJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ1YmktPmRldiwgJmRldl9hdmFpbF9lcmFzZWJsb2Nrcyk7CiAJaWYgKGVycikKLQkJZ290byBvdXRfZXJhc2VibG9ja19zaXplOworCQlyZXR1cm4gZXJyOwogCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmdWJpLT5kZXYsICZkZXZfdG90YWxfZXJhc2VibG9ja3MpOwogCWlmIChlcnIpCi0JCWdvdG8gb3V0X2F2YWlsX2VyYXNlYmxvY2tzOworCQlyZXR1cm4gZXJyOwogCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmdWJpLT5kZXYsICZkZXZfdm9sdW1lc19jb3VudCk7CiAJaWYgKGVycikKLQkJZ290byBvdXRfdG90YWxfZXJhc2VibG9ja3M7CisJCXJldHVybiBlcnI7CiAJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ1YmktPmRldiwgJmRldl9tYXhfZWMpOwogCWlmIChlcnIpCi0JCWdvdG8gb3V0X3ZvbHVtZXNfY291bnQ7CisJCXJldHVybiBlcnI7CiAJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ1YmktPmRldiwgJmRldl9yZXNlcnZlZF9mb3JfYmFkKTsKIAlpZiAoZXJyKQotCQlnb3RvIG91dF92b2x1bWVzX21heF9lYzsKKwkJcmV0dXJuIGVycjsKIAllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnViaS0+ZGV2LCAmZGV2X2JhZF9wZWJfY291bnQpOwogCWlmIChlcnIpCi0JCWdvdG8gb3V0X3Jlc2VydmVkX2Zvcl9iYWQ7CisJCXJldHVybiBlcnI7CiAJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ1YmktPmRldiwgJmRldl9tYXhfdm9sX2NvdW50KTsKIAlpZiAoZXJyKQotCQlnb3RvIG91dF9iYWRfcGViX2NvdW50OworCQlyZXR1cm4gZXJyOwogCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmdWJpLT5kZXYsICZkZXZfbWluX2lvX3NpemUpOwogCWlmIChlcnIpCi0JCWdvdG8gb3V0X21heF92b2xfY291bnQ7CisJCXJldHVybiBlcnI7CiAJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ1YmktPmRldiwgJmRldl9iZ3RfZW5hYmxlZCk7CiAJaWYgKGVycikKLQkJZ290byBvdXRfbWluX2lvX3NpemU7Ci0KLQlyZXR1cm4gMDsKLQotb3V0X21pbl9pb19zaXplOgotCWRldmljZV9yZW1vdmVfZmlsZSgmdWJpLT5kZXYsICZkZXZfbWluX2lvX3NpemUpOwotb3V0X21heF92b2xfY291bnQ6Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZ1YmktPmRldiwgJmRldl9tYXhfdm9sX2NvdW50KTsKLW91dF9iYWRfcGViX2NvdW50OgotCWRldmljZV9yZW1vdmVfZmlsZSgmdWJpLT5kZXYsICZkZXZfYmFkX3BlYl9jb3VudCk7Ci1vdXRfcmVzZXJ2ZWRfZm9yX2JhZDoKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnViaS0+ZGV2LCAmZGV2X3Jlc2VydmVkX2Zvcl9iYWQpOwotb3V0X3ZvbHVtZXNfbWF4X2VjOgotCWRldmljZV9yZW1vdmVfZmlsZSgmdWJpLT5kZXYsICZkZXZfbWF4X2VjKTsKLW91dF92b2x1bWVzX2NvdW50OgotCWRldmljZV9yZW1vdmVfZmlsZSgmdWJpLT5kZXYsICZkZXZfdm9sdW1lc19jb3VudCk7Ci1vdXRfdG90YWxfZXJhc2VibG9ja3M6Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZ1YmktPmRldiwgJmRldl90b3RhbF9lcmFzZWJsb2Nrcyk7Ci1vdXRfYXZhaWxfZXJhc2VibG9ja3M6Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZ1YmktPmRldiwgJmRldl9hdmFpbF9lcmFzZWJsb2Nrcyk7Ci1vdXRfZXJhc2VibG9ja19zaXplOgotCWRldmljZV9yZW1vdmVfZmlsZSgmdWJpLT5kZXYsICZkZXZfZXJhc2VibG9ja19zaXplKTsKLW91dF91bnJlZ2lzdGVyOgotCWRldmljZV91bnJlZ2lzdGVyKCZ1YmktPmRldik7Ci1vdXQ6Ci0JdWJpX2VycigiZmFpbGVkIHRvIGluaXRpYWxpemUgc3lzZnMgZm9yICVzIiwgdWJpLT51YmlfbmFtZSk7CisJCXJldHVybiBlcnI7CisJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ1YmktPmRldiwgJmRldl9tdGRfbnVtKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yMjEsNiArMzI3LDcgQEAKICAqLwogc3RhdGljIHZvaWQgdWJpX3N5c2ZzX2Nsb3NlKHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpCiB7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZ1YmktPmRldiwgJmRldl9tdGRfbnVtKTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnViaS0+ZGV2LCAmZGV2X2JndF9lbmFibGVkKTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnViaS0+ZGV2LCAmZGV2X21pbl9pb19zaXplKTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnViaS0+ZGV2LCAmZGV2X21heF92b2xfY291bnQpOwpAQCAtMjQ0LDcgKzM1MSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgdWJpLT52dGJsX3Nsb3RzOyBpKyspCiAJCWlmICh1YmktPnZvbHVtZXNbaV0pCi0JCQl1YmlfZnJlZV92b2x1bWUodWJpLCBpKTsKKwkJCXViaV9mcmVlX3ZvbHVtZSh1YmksIHViaS0+dm9sdW1lc1tpXSk7CiB9CiAKIC8qKgpAQCAtMjU5LDkgKzM2Niw2IEBACiAJaW50IGksIGVycjsKIAlkZXZfdCBkZXY7CiAKLQltdXRleF9pbml0KCZ1YmktPnZ0YmxfbXV0ZXgpOwotCXNwaW5fbG9ja19pbml0KCZ1YmktPnZvbHVtZXNfbG9jayk7Ci0KIAlzcHJpbnRmKHViaS0+dWJpX25hbWUsIFVCSV9OQU1FX1NUUiAiJWQiLCB1YmktPnViaV9udW0pOwogCiAJLyoKQEAgLTI3OCwzOSArMzgyLDQwIEBACiAJCXJldHVybiBlcnI7CiAJfQogCisJdWJpX2Fzc2VydChNSU5PUihkZXYpID09IDApOwogCWNkZXZfaW5pdCgmdWJpLT5jZGV2LCAmdWJpX2NkZXZfb3BlcmF0aW9ucyk7Ci0JdWJpLT5tYWpvciA9IE1BSk9SKGRldik7Ci0JZGJnX21zZygiJXMgbWFqb3IgaXMgJXUiLCB1YmktPnViaV9uYW1lLCB1YmktPm1ham9yKTsKKwlkYmdfbXNnKCIlcyBtYWpvciBpcyAldSIsIHViaS0+dWJpX25hbWUsIE1BSk9SKGRldikpOwogCXViaS0+Y2Rldi5vd25lciA9IFRISVNfTU9EVUxFOwogCi0JZGV2ID0gTUtERVYodWJpLT5tYWpvciwgMCk7CiAJZXJyID0gY2Rldl9hZGQoJnViaS0+Y2RldiwgZGV2LCAxKTsKIAlpZiAoZXJyKSB7Ci0JCXViaV9lcnIoImNhbm5vdCBhZGQgY2hhcmFjdGVyIGRldmljZSAlcyIsIHViaS0+dWJpX25hbWUpOworCQl1YmlfZXJyKCJjYW5ub3QgYWRkIGNoYXJhY3RlciBkZXZpY2UiKTsKIAkJZ290byBvdXRfdW5yZWc7CiAJfQogCiAJZXJyID0gdWJpX3N5c2ZzX2luaXQodWJpKTsKIAlpZiAoZXJyKQotCQlnb3RvIG91dF9jZGV2OworCQlnb3RvIG91dF9zeXNmczsKIAogCWZvciAoaSA9IDA7IGkgPCB1YmktPnZ0Ymxfc2xvdHM7IGkrKykKIAkJaWYgKHViaS0+dm9sdW1lc1tpXSkgewotCQkJZXJyID0gdWJpX2FkZF92b2x1bWUodWJpLCBpKTsKLQkJCWlmIChlcnIpCisJCQllcnIgPSB1YmlfYWRkX3ZvbHVtZSh1YmksIHViaS0+dm9sdW1lc1tpXSk7CisJCQlpZiAoZXJyKSB7CisJCQkJdWJpX2VycigiY2Fubm90IGFkZCB2b2x1bWUgJWQiLCBpKTsKIAkJCQlnb3RvIG91dF92b2x1bWVzOworCQkJfQogCQl9CiAKIAlyZXR1cm4gMDsKIAogb3V0X3ZvbHVtZXM6CiAJa2lsbF92b2x1bWVzKHViaSk7CitvdXRfc3lzZnM6CiAJdWJpX3N5c2ZzX2Nsb3NlKHViaSk7Ci1vdXRfY2RldjoKIAljZGV2X2RlbCgmdWJpLT5jZGV2KTsKIG91dF91bnJlZzoKLQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYodWJpLT5tYWpvciwgMCksCi0JCQkJIHViaS0+dnRibF9zbG90cyArIDEpOworCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbih1YmktPmNkZXYuZGV2LCB1YmktPnZ0Ymxfc2xvdHMgKyAxKTsKKwl1YmlfZXJyKCJjYW5ub3QgaW5pdGlhbGl6ZSBVQkkgJXMsIGVycm9yICVkIiwgdWJpLT51YmlfbmFtZSwgZXJyKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0zMjMsNyArNDI4LDcgQEAKIAlraWxsX3ZvbHVtZXModWJpKTsKIAl1Ymlfc3lzZnNfY2xvc2UodWJpKTsKIAljZGV2X2RlbCgmdWJpLT5jZGV2KTsKLQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYodWJpLT5tYWpvciwgMCksIHViaS0+dnRibF9zbG90cyArIDEpOworCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbih1YmktPmNkZXYuZGV2LCB1YmktPnZ0Ymxfc2xvdHMgKyAxKTsKIH0KIAogLyoqCkBAIC0zODQsOSArNDg5LDkgQEAKICAqIGFzc3VtZWQ6CiAgKiAgIG8gRUMgaGVhZGVyIGlzIGFsd2F5cyBhdCBvZmZzZXQgemVybyAtIHRoaXMgY2Fubm90IGJlIGNoYW5nZWQ7CiAgKiAgIG8gVklEIGhlYWRlciBzdGFydHMganVzdCBhZnRlciB0aGUgRUMgaGVhZGVyIGF0IHRoZSBjbG9zZXN0IGFkZHJlc3MKLSAqICAgYWxpZ25lZCB0byBAaW8tPkBoZHJzX21pbl9pb19zaXplOworICogICAgIGFsaWduZWQgdG8gQGlvLT5oZHJzX21pbl9pb19zaXplOwogICogICBvIGRhdGEgc3RhcnRzIGp1c3QgYWZ0ZXIgdGhlIFZJRCBoZWFkZXIgYXQgdGhlIGNsb3Nlc3QgYWRkcmVzcyBhbGlnbmVkIHRvCi0gKiAgICAgQGlvLT5AbWluX2lvX3NpemUKKyAqICAgICBAaW8tPm1pbl9pb19zaXplCiAgKgogICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4KICAqIGNhc2Ugb2YgZmFpbHVyZS4KQEAgLTQwNyw2ICs1MTIsOSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAodWJpLT52aWRfaGRyX29mZnNldCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCiAJLyoKIAkgKiBOb3RlLCBpbiB0aGlzIGltcGxlbWVudGF0aW9uIHdlIHN1cHBvcnQgTVREIGRldmljZXMgd2l0aCAweDdGRkZGRkZGCiAJICogcGh5c2ljYWwgZXJhc2VibG9ja3MgbWF4aW11bS4KQEAgLTQyNCw3ICs1MzIsOCBAQAogCiAJLyogTWFrZSBzdXJlIG1pbmltYWwgSS9PIHVuaXQgaXMgcG93ZXIgb2YgMiAqLwogCWlmICghaXNfcG93ZXJfb2ZfMih1YmktPm1pbl9pb19zaXplKSkgewotCQl1YmlfZXJyKCJiYWQgbWluLiBJL08gdW5pdCIpOworCQl1YmlfZXJyKCJtaW4uIEkvTyB1bml0ICglZCkgaXMgbm90IHBvd2VyIG9mIDIiLAorCQkJdWJpLT5taW5faW9fc2l6ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNDUzLDEwICs1NjIsOCBAQAogCX0KIAogCS8qIFNpbWlsYXIgZm9yIHRoZSBkYXRhIG9mZnNldCAqLwotCWlmICh1YmktPmxlYl9zdGFydCA9PSAwKSB7Ci0JCXViaS0+bGViX3N0YXJ0ID0gdWJpLT52aWRfaGRyX29mZnNldCArIHViaS0+dmlkX2hkcl9hbHNpemU7Ci0JCXViaS0+bGViX3N0YXJ0ID0gQUxJR04odWJpLT5sZWJfc3RhcnQsIHViaS0+bWluX2lvX3NpemUpOwotCX0KKwl1YmktPmxlYl9zdGFydCA9IHViaS0+dmlkX2hkcl9vZmZzZXQgKyBVQklfRUNfSERSX1NJWkU7CisJdWJpLT5sZWJfc3RhcnQgPSBBTElHTih1YmktPmxlYl9zdGFydCwgdWJpLT5taW5faW9fc2l6ZSk7CiAKIAlkYmdfbXNnKCJ2aWRfaGRyX29mZnNldCAgICVkIiwgdWJpLT52aWRfaGRyX29mZnNldCk7CiAJZGJnX21zZygidmlkX2hkcl9hbG9mZnNldCAlZCIsIHViaS0+dmlkX2hkcl9hbG9mZnNldCk7CkBAIC01MTQsNzYgKzYyMSwxNDcgQEAKIH0KIAogLyoqCi0gKiBhdHRhY2hfbXRkX2RldiAtIGF0dGFjaCBhbiBNVEQgZGV2aWNlLgotICogQG10ZF9kZXY6IE1URCBkZXZpY2UgbmFtZSBvciBudW1iZXIgc3RyaW5nCi0gKiBAdmlkX2hkcl9vZmZzZXQ6IFZJRCBoZWFkZXIgb2Zmc2V0Ci0gKiBAZGF0YV9vZmZzZXQ6IGRhdGEgb2Zmc2V0CisgKiBhdXRvcmVzaXplIC0gcmUtc2l6ZSB0aGUgdm9sdW1lIHdoaWNoIGhhcyB0aGUgImF1dG8tcmVzaXplIiBmbGFnIHNldC4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAdm9sX2lkOiBJRCBvZiB0aGUgdm9sdW1lIHRvIHJlLXNpemUKICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGF0dGFjaGVzIGFuIE1URCBkZXZpY2UgdG8gVUJJLiBJdCBmaXJzdCB0cmVhdHMgQG10ZF9kZXYgYXMgdGhlCi0gKiBNVEQgZGV2aWNlIG5hbWUsIGFuZCB0cmllcyB0byBvcGVuIGl0IGJ5IHRoaXMgbmFtZS4gSWYgaXQgaXMgdW5hYmxlIHRvIG9wZW4sCi0gKiBpdCB0cmllcyB0byBjb252ZXJ0IEBtdGRfZGV2IHRvIGFuIGludGVnZXIgYW5kIG9wZW4gdGhlIE1URCBkZXZpY2UgYnkgaXRzCi0gKiBudW1iZXIuIFJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mCi0gKiBmYWlsdXJlLgorICogVGhpcyBmdW5jdGlvbiByZS1zaXplcyB0aGUgdm9sdW1lIG1hcmtlZCBieSB0aGUgQFVCSV9WVEJMX0FVVE9SRVNJWkVfRkxHIGluCisgKiB0aGUgdm9sdW1lIHRhYmxlIHRvIHRoZSBsYXJnZXN0IHBvc3NpYmxlIHNpemUuIFNlZSBjb21tZW50cyBpbiB1YmktaGVhZGVyLmgKKyAqIGZvciBtb3JlIGRlc2NyaXB0aW9uIG9mIHRoZSBmbGFnLiBSZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhCisgKiBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4KICAqLwotc3RhdGljIGludCBhdHRhY2hfbXRkX2Rldihjb25zdCBjaGFyICptdGRfZGV2LCBpbnQgdmlkX2hkcl9vZmZzZXQsCi0JCQkgIGludCBkYXRhX29mZnNldCkKK3N0YXRpYyBpbnQgYXV0b3Jlc2l6ZShzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgdm9sX2lkKQogewotCXN0cnVjdCB1YmlfZGV2aWNlICp1Ymk7Ci0Jc3RydWN0IG10ZF9pbmZvICptdGQ7Ci0JaW50IGksIGVycjsKKwlzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjIGRlc2M7CisJc3RydWN0IHViaV92b2x1bWUgKnZvbCA9IHViaS0+dm9sdW1lc1t2b2xfaWRdOworCWludCBlcnIsIG9sZF9yZXNlcnZlZF9wZWJzID0gdm9sLT5yZXNlcnZlZF9wZWJzOwogCi0JbXRkID0gZ2V0X210ZF9kZXZpY2Vfbm0obXRkX2Rldik7Ci0JaWYgKElTX0VSUihtdGQpKSB7Ci0JCWludCBtdGRfbnVtOwotCQljaGFyICplbmRwOworCS8qCisJICogQ2xlYXIgdGhlIGF1dG8tcmVzaXplIGZsYWcgaW4gdGhlIHZvbHVtZSBpbi1tZW1vcnkgY29weSBvZiB0aGUKKwkgKiB2b2x1bWUgdGFibGUsIGFuZCAndWJpX3Jlc2l6ZV92b2x1bWUoKScgd2lsbCBwcm9wb2dhdGUgdGhpcyBjaGFuZ2UKKwkgKiB0byB0aGUgZmxhc2guCisJICovCisJdWJpLT52dGJsW3ZvbF9pZF0uZmxhZ3MgJj0gflVCSV9WVEJMX0FVVE9SRVNJWkVfRkxHOwogCi0JCWlmIChQVFJfRVJSKG10ZCkgIT0gLUVOT0RFVikKLQkJCXJldHVybiBQVFJfRVJSKG10ZCk7CisJaWYgKHViaS0+YXZhaWxfcGVicyA9PSAwKSB7CisJCXN0cnVjdCB1YmlfdnRibF9yZWNvcmQgdnRibF9yZWM7CiAKIAkJLyoKLQkJICogUHJvYmFibHkgdGhpcyBpcyBub3QgTVREIGRldmljZSBuYW1lIGJ1dCBNVEQgZGV2aWNlIG51bWJlciAtCi0JCSAqIGNoZWNrIHRoaXMgb3V0LgorCQkgKiBObyBhdmFsaWxhYmxlIFBFQnMgdG8gcmUtc2l6ZSB0aGUgdm9sdW1lLCBjbGVhciB0aGUgZmxhZyBvbgorCQkgKiBmbGFzaCBhbmQgZXhpdC4KIAkJICovCi0JCW10ZF9udW0gPSBzaW1wbGVfc3RydG91bChtdGRfZGV2LCAmZW5kcCwgMCk7Ci0JCWlmICgqZW5kcCAhPSAnXDAnIHx8IG10ZF9kZXYgPT0gZW5kcCkgewotCQkJdWJpX2VycigiaW5jb3JyZWN0IE1URCBkZXZpY2U6IFwiJXNcIiIsIG10ZF9kZXYpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQotCQltdGQgPSBnZXRfbXRkX2RldmljZShOVUxMLCBtdGRfbnVtKTsKLQkJaWYgKElTX0VSUihtdGQpKQotCQkJcmV0dXJuIFBUUl9FUlIobXRkKTsKKwkJbWVtY3B5KCZ2dGJsX3JlYywgJnViaS0+dnRibFt2b2xfaWRdLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB1YmlfdnRibF9yZWNvcmQpKTsKKwkJZXJyID0gdWJpX2NoYW5nZV92dGJsX3JlY29yZCh1YmksIHZvbF9pZCwgJnZ0YmxfcmVjKTsKKwkJaWYgKGVycikKKwkJCXViaV9lcnIoImNhbm5vdCBjbGVhbiBhdXRvLXJlc2l6ZSBmbGFnIGZvciB2b2x1bWUgJWQiLAorCQkJCXZvbF9pZCk7CisJfSBlbHNlIHsKKwkJZGVzYy52b2wgPSB2b2w7CisJCWVyciA9IHViaV9yZXNpemVfdm9sdW1lKCZkZXNjLAorCQkJCQlvbGRfcmVzZXJ2ZWRfcGVicyArIHViaS0+YXZhaWxfcGVicyk7CisJCWlmIChlcnIpCisJCQl1YmlfZXJyKCJjYW5ub3QgYXV0by1yZXNpemUgdm9sdW1lICVkIiwgdm9sX2lkKTsKIAl9CiAKLQkvKiBDaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIHNhbWUgTVREIGRldmljZSBhdHRhY2hlZCAqLwotCWZvciAoaSA9IDA7IGkgPCB1YmlfZGV2aWNlc19jbnQ7IGkrKykKLQkJaWYgKHViaV9kZXZpY2VzW2ldLT5tdGQtPmluZGV4ID09IG10ZC0+aW5kZXgpIHsKLQkJCXViaV9lcnIoIm10ZCVkIGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gdWJpJWQiLAorCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwl1YmlfbXNnKCJ2b2x1bWUgJWQgKFwiJXNcIikgcmUtc2l6ZWQgZnJvbSAlZCB0byAlZCBMRUJzIiwgdm9sX2lkLAorCQl2b2wtPm5hbWUsIG9sZF9yZXNlcnZlZF9wZWJzLCB2b2wtPnJlc2VydmVkX3BlYnMpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHViaV9hdHRhY2hfbXRkX2RldiAtIGF0dGFjaCBhbiBNVEQgZGV2aWNlLgorICogQG10ZF9kZXY6IE1URCBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAdWJpX251bTogbnVtYmVyIHRvIGFzc2lnbiB0byB0aGUgbmV3IFVCSSBkZXZpY2UKKyAqIEB2aWRfaGRyX29mZnNldDogVklEIGhlYWRlciBvZmZzZXQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGF0dGFjaGVzIE1URCBkZXZpY2UgQG10ZF9kZXYgdG8gVUJJIGFuZCBhc3NpZ24gQHViaV9udW0gbnVtYmVyCisgKiB0byB0aGUgbmV3bHkgY3JlYXRlZCBVQkkgZGV2aWNlLCB1bmxlc3MgQHViaV9udW0gaXMgJVVCSV9ERVZfTlVNX0FVVE8sIGluCisgKiB3aGljaCBjYXNlIHRoaXMgZnVuY3Rpb24gZmluZHMgYSB2YWNhbnQgZGV2aWNlIG51YmVydCBhbmQgYXNzaW5ncyBpdAorICogYXV0b21hdGljYWxseS4gUmV0dXJucyB0aGUgbmV3IFVCSSBkZXZpY2UgbnVtYmVyIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYQorICogbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKgorICogTm90ZSwgdGhlIGludm9jYXRpb25zIG9mIHRoaXMgZnVuY3Rpb24gaGFzIHRvIGJlIHNlcmlhbGl6ZWQgYnkgdGhlCisgKiBAdWJpX2RldmljZXNfbXV0ZXguCisgKi8KK2ludCB1YmlfYXR0YWNoX210ZF9kZXYoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCB1YmlfbnVtLCBpbnQgdmlkX2hkcl9vZmZzZXQpCit7CisJc3RydWN0IHViaV9kZXZpY2UgKnViaTsKKwlpbnQgaSwgZXJyOworCisJLyoKKwkgKiBDaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIHNhbWUgTVREIGRldmljZSBhdHRhY2hlZC4KKwkgKgorCSAqIE5vdGUsIHRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IFVCSSBkZXZpY2VzIGNyZWF0aW9ucyBhbmQgZGVsZXRpb25zCisJICogYXJlIHNlcmlhbGl6ZWQsIHNvIGl0IGRvZXMgbm90IHRha2UgdGhlICZ1YmlfZGV2aWNlc19sb2NrLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBVQklfTUFYX0RFVklDRVM7IGkrKykgeworCQl1YmkgPSB1YmlfZGV2aWNlc1tpXTsKKwkJaWYgKHViaSAmJiBtdGQtPmluZGV4ID09IHViaS0+bXRkLT5pbmRleCkgeworCQkJZGJnX2VycigibXRkJWQgaXMgYWxyZWFkeSBhdHRhY2hlZCB0byB1YmklZCIsCiAJCQkJbXRkLT5pbmRleCwgaSk7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBvdXRfbXRkOworCQkJcmV0dXJuIC1FRVhJU1Q7CiAJCX0KLQotCXViaSA9IHViaV9kZXZpY2VzW3ViaV9kZXZpY2VzX2NudF0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdWJpX2RldmljZSksCi0JCQkJCQkgICAgIEdGUF9LRVJORUwpOwotCWlmICghdWJpKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X210ZDsKIAl9CiAKLQl1YmktPnViaV9udW0gPSB1YmlfZGV2aWNlc19jbnQ7CisJLyoKKwkgKiBNYWtlIHN1cmUgdGhpcyBNVEQgZGV2aWNlIGlzIG5vdCBlbXVsYXRlZCBvbiB0b3Agb2YgYW4gVUJJIHZvbHVtZQorCSAqIGFscmVhZHkuIFdlbGwsIGdlbmVyYWxseSB0aGlzIHJlY3Vyc2lvbiB3b3JrcyBmaW5lLCBidXQgdGhlcmUgYXJlCisJICogZGlmZmVyZW50IHByb2JsZW1zIGxpa2UgdGhlIFVCSSBtb2R1bGUgdGFrZXMgYSByZWZlcmVuY2UgdG8gaXRzZWxmCisJICogYnkgYXR0YWNoaW5nIChhbmQgdGh1cywgb3BlbmluZykgdGhlIGVtdWxhdGVkIE1URCBkZXZpY2UuIFRoaXMKKwkgKiByZXN1bHRzIGluIGluYWJpbGl0eSB0byB1bmxvYWQgdGhlIG1vZHVsZS4gQW5kIGluIGdlbmVyYWwgaXQgbWFrZXMKKwkgKiBubyBzZW5zZSB0byBhdHRhY2ggZW11bGF0ZWQgTVREIGRldmljZXMsIHNvIHdlIHByb2hpYml0IHRoaXMuCisJICovCisJaWYgKG10ZC0+dHlwZSA9PSBNVERfVUJJVk9MVU1FKSB7CisJCXViaV9lcnIoInJlZnVzZSBhdHRhY2hpbmcgbXRkJWQgLSBpdCBpcyBhbHJlYWR5IGVtdWxhdGVkIG9uICIKKwkJCSJ0b3Agb2YgVUJJIiwgbXRkLT5pbmRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh1YmlfbnVtID09IFVCSV9ERVZfTlVNX0FVVE8pIHsKKwkJLyogU2VhcmNoIGZvciBhbiBlbXB0eSBzbG90IGluIHRoZSBAdWJpX2RldmljZXMgYXJyYXkgKi8KKwkJZm9yICh1YmlfbnVtID0gMDsgdWJpX251bSA8IFVCSV9NQVhfREVWSUNFUzsgdWJpX251bSsrKQorCQkJaWYgKCF1YmlfZGV2aWNlc1t1YmlfbnVtXSkKKwkJCQlicmVhazsKKwkJaWYgKHViaV9udW0gPT0gVUJJX01BWF9ERVZJQ0VTKSB7CisJCQlkYmdfZXJyKCJvbmx5ICVkIFVCSSBkZXZpY2VzIG1heSBiZSBjcmVhdGVkIiwgVUJJX01BWF9ERVZJQ0VTKTsKKwkJCXJldHVybiAtRU5GSUxFOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHViaV9udW0gPj0gVUJJX01BWF9ERVZJQ0VTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogTWFrZSBzdXJlIHViaV9udW0gaXMgbm90IGJ1c3kgKi8KKwkJaWYgKHViaV9kZXZpY2VzW3ViaV9udW1dKSB7CisJCQlkYmdfZXJyKCJ1YmklZCBhbHJlYWR5IGV4aXN0cyIsIHViaV9udW0pOworCQkJcmV0dXJuIC1FRVhJU1Q7CisJCX0KKwl9CisKKwl1YmkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdWJpX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghdWJpKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXViaS0+bXRkID0gbXRkOwotCi0JZGJnX21zZygiYXR0YWNoaW5nIG10ZCVkIHRvIHViaSVkOiBWSUQgaGVhZGVyIG9mZnNldCAlZCBkYXRhIG9mZnNldCAlZCIsCi0JCXViaS0+bXRkLT5pbmRleCwgdWJpX2RldmljZXNfY250LCB2aWRfaGRyX29mZnNldCwgZGF0YV9vZmZzZXQpOwotCisJdWJpLT51YmlfbnVtID0gdWJpX251bTsKIAl1YmktPnZpZF9oZHJfb2Zmc2V0ID0gdmlkX2hkcl9vZmZzZXQ7Ci0JdWJpLT5sZWJfc3RhcnQgPSBkYXRhX29mZnNldDsKKwl1YmktPmF1dG9yZXNpemVfdm9sX2lkID0gLTE7CisKKwltdXRleF9pbml0KCZ1YmktPmJ1Zl9tdXRleCk7CisJbXV0ZXhfaW5pdCgmdWJpLT5ja3ZvbF9tdXRleCk7CisJbXV0ZXhfaW5pdCgmdWJpLT52b2x1bWVzX211dGV4KTsKKwlzcGluX2xvY2tfaW5pdCgmdWJpLT52b2x1bWVzX2xvY2spOworCisJZGJnX21zZygiYXR0YWNoaW5nIG10ZCVkIHRvIHViaSVkOiBWSUQgaGVhZGVyIG9mZnNldCAlZCIsCisJCW10ZC0+aW5kZXgsIHViaV9udW0sIHZpZF9oZHJfb2Zmc2V0KTsKKwogCWVyciA9IGlvX2luaXQodWJpKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9mcmVlOwogCi0JbXV0ZXhfaW5pdCgmdWJpLT5idWZfbXV0ZXgpOwogCXViaS0+cGViX2J1ZjEgPSB2bWFsbG9jKHViaS0+cGViX3NpemUpOwogCWlmICghdWJpLT5wZWJfYnVmMSkKIAkJZ290byBvdXRfZnJlZTsKQEAgLTYwNSwxMiArNzgzLDI2IEBACiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCisJaWYgKHViaS0+YXV0b3Jlc2l6ZV92b2xfaWQgIT0gLTEpIHsKKwkJZXJyID0gYXV0b3Jlc2l6ZSh1YmksIHViaS0+YXV0b3Jlc2l6ZV92b2xfaWQpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfZGV0YWNoOworCX0KKwogCWVyciA9IHVpZl9pbml0KHViaSk7CiAJaWYgKGVycikKIAkJZ290byBvdXRfZGV0YWNoOwogCi0JdWJpX21zZygiYXR0YWNoZWQgbXRkJWQgdG8gdWJpJWQiLCB1YmktPm10ZC0+aW5kZXgsIHViaV9kZXZpY2VzX2NudCk7Ci0JdWJpX21zZygiTVREIGRldmljZSBuYW1lOiAgICAgICAgICAgIFwiJXNcIiIsIHViaS0+bXRkLT5uYW1lKTsKKwl1YmktPmJndF90aHJlYWQgPSBrdGhyZWFkX2NyZWF0ZSh1YmlfdGhyZWFkLCB1YmksIHViaS0+Ymd0X25hbWUpOworCWlmIChJU19FUlIodWJpLT5iZ3RfdGhyZWFkKSkgeworCQllcnIgPSBQVFJfRVJSKHViaS0+Ymd0X3RocmVhZCk7CisJCXViaV9lcnIoImNhbm5vdCBzcGF3biBcIiVzXCIsIGVycm9yICVkIiwgdWJpLT5iZ3RfbmFtZSwKKwkJCWVycik7CisJCWdvdG8gb3V0X3VpZjsKKwl9CisKKwl1YmlfbXNnKCJhdHRhY2hlZCBtdGQlZCB0byB1YmklZCIsIG10ZC0+aW5kZXgsIHViaV9udW0pOworCXViaV9tc2coIk1URCBkZXZpY2UgbmFtZTogICAgICAgICAgICBcIiVzXCIiLCBtdGQtPm5hbWUpOwogCXViaV9tc2coIk1URCBkZXZpY2Ugc2l6ZTogICAgICAgICAgICAlbGx1IE1pQiIsIHViaS0+Zmxhc2hfc2l6ZSA+PiAyMCk7CiAJdWJpX21zZygicGh5c2ljYWwgZXJhc2VibG9jayBzaXplOiAgICVkIGJ5dGVzICglZCBLaUIpIiwKIAkJdWJpLT5wZWJfc2l6ZSwgdWJpLT5wZWJfc2l6ZSA+PiAxMCk7CkBAIC02MzgsOSArODMwLDExIEBACiAJCXdha2VfdXBfcHJvY2Vzcyh1YmktPmJndF90aHJlYWQpOwogCX0KIAotCXViaV9kZXZpY2VzX2NudCArPSAxOwotCXJldHVybiAwOworCXViaV9kZXZpY2VzW3ViaV9udW1dID0gdWJpOworCXJldHVybiB1YmlfbnVtOwogCitvdXRfdWlmOgorCXVpZl9jbG9zZSh1YmkpOwogb3V0X2RldGFjaDoKIAl1YmlfZWJhX2Nsb3NlKHViaSk7CiAJdWJpX3dsX2Nsb3NlKHViaSk7CkBAIC02NTIsMjEgKzg0Niw1OCBAQAogCXZmcmVlKHViaS0+ZGJnX3BlYl9idWYpOwogI2VuZGlmCiAJa2ZyZWUodWJpKTsKLW91dF9tdGQ6Ci0JcHV0X210ZF9kZXZpY2UobXRkKTsKLQl1YmlfZGV2aWNlc1t1YmlfZGV2aWNlc19jbnRdID0gTlVMTDsKIAlyZXR1cm4gZXJyOwogfQogCiAvKioKLSAqIGRldGFjaF9tdGRfZGV2IC0gZGV0YWNoIGFuIE1URCBkZXZpY2UuCi0gKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogdWJpX2RldGFjaF9tdGRfZGV2IC0gZGV0YWNoIGFuIE1URCBkZXZpY2UuCisgKiBAdWJpX251bTogVUJJIGRldmljZSBudW1iZXIgdG8gZGV0YWNoIGZyb20KKyAqIEBhbnl3YXk6IGRldGFjaCBNVEQgZXZlbiBpZiBkZXZpY2UgcmVmZXJlbmNlIGNvdW50IGlzIG5vdCB6ZXJvCisgKgorICogVGhpcyBmdW5jdGlvbiBkZXN0cm95cyBhbiBVQkkgZGV2aWNlIG51bWJlciBAdWJpX251bSBhbmQgZGV0YWNoZXMgdGhlCisgKiB1bmRlcmx5aW5nIE1URCBkZXZpY2UuIFJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kICUtRUJVU1kgaWYgdGhlCisgKiBVQkkgZGV2aWNlIGlzIGJ1c3kgYW5kIGNhbm5vdCBiZSBkZXN0cm95ZWQsIGFuZCAlLUVJTlZBTCBpZiBpdCBkb2VzIG5vdAorICogZXhpc3QuCisgKgorICogTm90ZSwgdGhlIGludm9jYXRpb25zIG9mIHRoaXMgZnVuY3Rpb24gaGFzIHRvIGJlIHNlcmlhbGl6ZWQgYnkgdGhlCisgKiBAdWJpX2RldmljZXNfbXV0ZXguCiAgKi8KLXN0YXRpYyB2b2lkIGRldGFjaF9tdGRfZGV2KHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpCitpbnQgdWJpX2RldGFjaF9tdGRfZGV2KGludCB1YmlfbnVtLCBpbnQgYW55d2F5KQogewotCWludCB1YmlfbnVtID0gdWJpLT51YmlfbnVtLCBtdGRfbnVtID0gdWJpLT5tdGQtPmluZGV4OworCXN0cnVjdCB1YmlfZGV2aWNlICp1Ymk7CiAKKwlpZiAodWJpX251bSA8IDAgfHwgdWJpX251bSA+PSBVQklfTUFYX0RFVklDRVMpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrKCZ1YmlfZGV2aWNlc19sb2NrKTsKKwl1YmkgPSB1YmlfZGV2aWNlc1t1YmlfbnVtXTsKKwlpZiAoIXViaSkgeworCQlzcGluX3VubG9jaygmdWJpX2RldmljZXNfbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh1YmktPnJlZl9jb3VudCkgeworCQlpZiAoIWFueXdheSkgeworCQkJc3Bpbl91bmxvY2soJnViaV9kZXZpY2VzX2xvY2spOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQkvKiBUaGlzIG1heSBvbmx5IGhhcHBlbiBpZiB0aGVyZSBpcyBhIGJ1ZyAqLworCQl1YmlfZXJyKCIlcyByZWZlcmVuY2UgY291bnQgJWQsIGRlc3Ryb3kgYW55d2F5IiwKKwkJCXViaS0+dWJpX25hbWUsIHViaS0+cmVmX2NvdW50KTsKKwl9CisJdWJpX2RldmljZXNbdWJpX251bV0gPSBOVUxMOworCXNwaW5fdW5sb2NrKCZ1YmlfZGV2aWNlc19sb2NrKTsKKworCXViaV9hc3NlcnQodWJpX251bSA9PSB1YmktPnViaV9udW0pOwogCWRiZ19tc2coImRldGFjaGluZyBtdGQlZCBmcm9tIHViaSVkIiwgdWJpLT5tdGQtPmluZGV4LCB1YmlfbnVtKTsKKworCS8qCisJICogQmVmb3JlIGZyZWVpbmcgYW55dGhpbmcsIHdlIGhhdmUgdG8gc3RvcCB0aGUgYmFja2dyb3VuZCB0aHJlYWQgdG8KKwkgKiBwcmV2ZW50IGl0IGZyb20gZG9pbmcgYW55dGhpbmcgb24gdGhpcyBkZXZpY2Ugd2hpbGUgd2UgYXJlIGZyZWVpbmcuCisJICovCisJaWYgKHViaS0+Ymd0X3RocmVhZCkKKwkJa3RocmVhZF9zdG9wKHViaS0+Ymd0X3RocmVhZCk7CisKIAl1aWZfY2xvc2UodWJpKTsKIAl1YmlfZWJhX2Nsb3NlKHViaSk7CiAJdWJpX3dsX2Nsb3NlKHViaSk7CkBAIC02NzcsMTEgKzkwOCwzNyBAQAogI2lmZGVmIENPTkZJR19NVERfVUJJX0RFQlVHCiAJdmZyZWUodWJpLT5kYmdfcGViX2J1Zik7CiAjZW5kaWYKLQlrZnJlZSh1YmlfZGV2aWNlc1t1YmlfbnVtXSk7Ci0JdWJpX2RldmljZXNbdWJpX251bV0gPSBOVUxMOwotCXViaV9kZXZpY2VzX2NudCAtPSAxOwotCXViaV9hc3NlcnQodWJpX2RldmljZXNfY250ID49IDApOwotCXViaV9tc2coIm10ZCVkIGlzIGRldGFjaGVkIGZyb20gdWJpJWQiLCBtdGRfbnVtLCB1YmlfbnVtKTsKKwl1YmlfbXNnKCJtdGQlZCBpcyBkZXRhY2hlZCBmcm9tIHViaSVkIiwgdWJpLT5tdGQtPmluZGV4LCB1YmktPnViaV9udW0pOworCWtmcmVlKHViaSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZmluZF9tdGRfZGV2aWNlIC0gb3BlbiBhbiBNVEQgZGV2aWNlIGJ5IGl0cyBuYW1lIG9yIG51bWJlci4KKyAqIEBtdGRfZGV2OiBuYW1lIG9yIG51bWJlciBvZiB0aGUgZGV2aWNlCisgKgorICogVGhpcyBmdW5jdGlvbiB0cmllcyB0byBvcGVuIGFuZCBNVEQgZGV2aWNlIGRlc2NyaWJlZCBieSBAbXRkX2RldiBzdHJpbmcsCisgKiB3aGljaCBpcyBmaXJzdCB0cmVhdGVkIGFzIGFuIEFTQ0lJIG51bWJlciwgYW5kIGlmIGl0IGlzIG5vdCB0cnVlLCBpdCBpcworICogdHJlYXRlZCBhcyBNVEQgZGV2aWNlIG5hbWUuIFJldHVybnMgTVREIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QgaW4gY2FzZSBvZgorICogc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqIF9faW5pdCBvcGVuX210ZF9kZXZpY2UoY29uc3QgY2hhciAqbXRkX2RldikKK3sKKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKKwlpbnQgbXRkX251bTsKKwljaGFyICplbmRwOworCisJbXRkX251bSA9IHNpbXBsZV9zdHJ0b3VsKG10ZF9kZXYsICZlbmRwLCAwKTsKKwlpZiAoKmVuZHAgIT0gJ1wwJyB8fCBtdGRfZGV2ID09IGVuZHApIHsKKwkJLyoKKwkJICogVGhpcyBkb2VzIG5vdCBsb29rIGxpa2UgYW4gQVNDSUkgaW50ZWdlciwgcHJvYmFibHkgdGhpcyBpcworCQkgKiBNVEQgZGV2aWNlIG5hbWUuCisJCSAqLworCQltdGQgPSBnZXRfbXRkX2RldmljZV9ubShtdGRfZGV2KTsKKwl9IGVsc2UKKwkJbXRkID0gZ2V0X210ZF9kZXZpY2UoTlVMTCwgbXRkX251bSk7CisKKwlyZXR1cm4gbXRkOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCB1YmlfaW5pdCh2b2lkKQpAQCAtNjkzLDQ3ICs5NTAsOTYgQEAKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCB1YmlfdmlkX2hkcikgIT0gNjQpOwogCiAJaWYgKG10ZF9kZXZzID4gVUJJX01BWF9ERVZJQ0VTKSB7Ci0JCXByaW50aygiVUJJIGVycm9yOiB0b28gbWFueSBNVEQgZGV2aWNlcywgbWF4aW11bSBpcyAlZFxuIiwKLQkJICAgICAgIFVCSV9NQVhfREVWSUNFUyk7CisJCXByaW50ayhLRVJOX0VSUiAiVUJJIGVycm9yOiB0b28gbWFueSBNVEQgZGV2aWNlcywgIgorCQkgICAgICAgIm1heGltdW0gaXMgJWRcbiIsIFVCSV9NQVhfREVWSUNFUyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCS8qIENyZWF0ZSBiYXNlIHN5c2ZzIGRpcmVjdG9yeSBhbmQgc3lzZnMgZmlsZXMgKi8KIAl1YmlfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsIFVCSV9OQU1FX1NUUik7Ci0JaWYgKElTX0VSUih1YmlfY2xhc3MpKQotCQlyZXR1cm4gUFRSX0VSUih1YmlfY2xhc3MpOworCWlmIChJU19FUlIodWJpX2NsYXNzKSkgeworCQllcnIgPSBQVFJfRVJSKHViaV9jbGFzcyk7CisJCXByaW50ayhLRVJOX0VSUiAiVUJJIGVycm9yOiBjYW5ub3QgY3JlYXRlIFVCSSBjbGFzc1xuIik7CisJCWdvdG8gb3V0OworCX0KIAogCWVyciA9IGNsYXNzX2NyZWF0ZV9maWxlKHViaV9jbGFzcywgJnViaV92ZXJzaW9uKTsKLQlpZiAoZXJyKQorCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJVQkkgZXJyb3I6IGNhbm5vdCBjcmVhdGUgc3lzZnMgZmlsZVxuIik7CiAJCWdvdG8gb3V0X2NsYXNzOworCX0KKworCWVyciA9IG1pc2NfcmVnaXN0ZXIoJnViaV9jdHJsX2NkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJVQkkgZXJyb3I6IGNhbm5vdCByZWdpc3RlciBkZXZpY2VcbiIpOworCQlnb3RvIG91dF92ZXJzaW9uOworCX0KKworCXViaV93bF9lbnRyeV9zbGFiID0ga21lbV9jYWNoZV9jcmVhdGUoInViaV93bF9lbnRyeV9zbGFiIiwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgdWJpX3dsX2VudHJ5KSwKKwkJCQkJCTAsIDAsIE5VTEwpOworCWlmICghdWJpX3dsX2VudHJ5X3NsYWIpCisJCWdvdG8gb3V0X2Rldl91bnJlZzsKIAogCS8qIEF0dGFjaCBNVEQgZGV2aWNlcyAqLwogCWZvciAoaSA9IDA7IGkgPCBtdGRfZGV2czsgaSsrKSB7CiAJCXN0cnVjdCBtdGRfZGV2X3BhcmFtICpwID0gJm10ZF9kZXZfcGFyYW1baV07CisJCXN0cnVjdCBtdGRfaW5mbyAqbXRkOwogCiAJCWNvbmRfcmVzY2hlZCgpOwotCQllcnIgPSBhdHRhY2hfbXRkX2RldihwLT5uYW1lLCBwLT52aWRfaGRyX29mZnMsIHAtPmRhdGFfb2Zmcyk7Ci0JCWlmIChlcnIpCisKKwkJbXRkID0gb3Blbl9tdGRfZGV2aWNlKHAtPm5hbWUpOworCQlpZiAoSVNfRVJSKG10ZCkpIHsKKwkJCWVyciA9IFBUUl9FUlIobXRkKTsKIAkJCWdvdG8gb3V0X2RldGFjaDsKKwkJfQorCisJCW11dGV4X2xvY2soJnViaV9kZXZpY2VzX211dGV4KTsKKwkJZXJyID0gdWJpX2F0dGFjaF9tdGRfZGV2KG10ZCwgVUJJX0RFVl9OVU1fQVVUTywKKwkJCQkJIHAtPnZpZF9oZHJfb2Zmcyk7CisJCW11dGV4X3VubG9jaygmdWJpX2RldmljZXNfbXV0ZXgpOworCQlpZiAoZXJyIDwgMCkgeworCQkJcHV0X210ZF9kZXZpY2UobXRkKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiVUJJIGVycm9yOiBjYW5ub3QgYXR0YWNoICVzXG4iLAorCQkJICAgICAgIHAtPm5hbWUpOworCQkJZ290byBvdXRfZGV0YWNoOworCQl9CiAJfQogCiAJcmV0dXJuIDA7CiAKIG91dF9kZXRhY2g6CiAJZm9yIChrID0gMDsgayA8IGk7IGsrKykKLQkJZGV0YWNoX210ZF9kZXYodWJpX2RldmljZXNba10pOworCQlpZiAodWJpX2RldmljZXNba10pIHsKKwkJCW11dGV4X2xvY2soJnViaV9kZXZpY2VzX211dGV4KTsKKwkJCXViaV9kZXRhY2hfbXRkX2Rldih1YmlfZGV2aWNlc1trXS0+dWJpX251bSwgMSk7CisJCQltdXRleF91bmxvY2soJnViaV9kZXZpY2VzX211dGV4KTsKKwkJfQorCWttZW1fY2FjaGVfZGVzdHJveSh1Ymlfd2xfZW50cnlfc2xhYik7CitvdXRfZGV2X3VucmVnOgorCW1pc2NfZGVyZWdpc3RlcigmdWJpX2N0cmxfY2Rldik7CitvdXRfdmVyc2lvbjoKIAljbGFzc19yZW1vdmVfZmlsZSh1YmlfY2xhc3MsICZ1YmlfdmVyc2lvbik7CiBvdXRfY2xhc3M6CiAJY2xhc3NfZGVzdHJveSh1YmlfY2xhc3MpOworb3V0OgorCXByaW50ayhLRVJOX0VSUiAiVUJJIGVycm9yOiBjYW5ub3QgaW5pdGlhbGl6ZSBVQkksIGVycm9yICVkXG4iLCBlcnIpOwogCXJldHVybiBlcnI7CiB9CiBtb2R1bGVfaW5pdCh1YmlfaW5pdCk7CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB1YmlfZXhpdCh2b2lkKQogewotCWludCBpLCBuID0gdWJpX2RldmljZXNfY250OworCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IG47IGkrKykKLQkJZGV0YWNoX210ZF9kZXYodWJpX2RldmljZXNbaV0pOworCWZvciAoaSA9IDA7IGkgPCBVQklfTUFYX0RFVklDRVM7IGkrKykKKwkJaWYgKHViaV9kZXZpY2VzW2ldKSB7CisJCQltdXRleF9sb2NrKCZ1YmlfZGV2aWNlc19tdXRleCk7CisJCQl1YmlfZGV0YWNoX210ZF9kZXYodWJpX2RldmljZXNbaV0tPnViaV9udW0sIDEpOworCQkJbXV0ZXhfdW5sb2NrKCZ1YmlfZGV2aWNlc19tdXRleCk7CisJCX0KKwlrbWVtX2NhY2hlX2Rlc3Ryb3kodWJpX3dsX2VudHJ5X3NsYWIpOworCW1pc2NfZGVyZWdpc3RlcigmdWJpX2N0cmxfY2Rldik7CiAJY2xhc3NfcmVtb3ZlX2ZpbGUodWJpX2NsYXNzLCAmdWJpX3ZlcnNpb24pOwogCWNsYXNzX2Rlc3Ryb3kodWJpX2NsYXNzKTsKIH0KQEAgLTc1NCw3ICsxMDYwLDggQEAKIAogCXJlc3VsdCA9IHNpbXBsZV9zdHJ0b3VsKHN0ciwgJmVuZHAsIDApOwogCWlmIChzdHIgPT0gZW5kcCB8fCByZXN1bHQgPCAwKSB7Ci0JCXByaW50aygiVUJJIGVycm9yOiBpbmNvcnJlY3QgYnl0ZXMgY291bnQ6IFwiJXNcIlxuIiwgc3RyKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJVQkkgZXJyb3I6IGluY29ycmVjdCBieXRlcyBjb3VudDogXCIlc1wiXG4iLAorCQkgICAgICAgc3RyKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC03NjQsMTUgKzEwNzEsMTQgQEAKIAljYXNlICdNJzoKIAkJcmVzdWx0ICo9IDEwMjQ7CiAJY2FzZSAnSyc6Ci0JY2FzZSAnayc6CiAJCXJlc3VsdCAqPSAxMDI0OwotCQlpZiAoZW5kcFsxXSA9PSAnaScgJiYgKGVuZHBbMl0gPT0gJ1wwJyB8fAotCQkJICBlbmRwWzJdID09ICdCJyAgfHwgZW5kcFsyXSA9PSAnYicpKQorCQlpZiAoZW5kcFsxXSA9PSAnaScgJiYgZW5kcFsyXSA9PSAnQicpCiAJCQllbmRwICs9IDI7CiAJY2FzZSAnXDAnOgogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoIlVCSSBlcnJvcjogaW5jb3JyZWN0IGJ5dGVzIGNvdW50OiBcIiVzXCJcbiIsIHN0cik7CisJCXByaW50ayhLRVJOX0VSUiAiVUJJIGVycm9yOiBpbmNvcnJlY3QgYnl0ZXMgY291bnQ6IFwiJXNcIlxuIiwKKwkJICAgICAgIHN0cik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNzkzLDIzICsxMDk5LDI3IEBACiAJc3RydWN0IG10ZF9kZXZfcGFyYW0gKnA7CiAJY2hhciBidWZbTVREX1BBUkFNX0xFTl9NQVhdOwogCWNoYXIgKnBidWYgPSAmYnVmWzBdOwotCWNoYXIgKnRva2Vuc1szXSA9IHtOVUxMLCBOVUxMLCBOVUxMfTsKKwljaGFyICp0b2tlbnNbMl0gPSB7TlVMTCwgTlVMTH07CisKKwlpZiAoIXZhbCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAobXRkX2RldnMgPT0gVUJJX01BWF9ERVZJQ0VTKSB7Ci0JCXByaW50aygiVUJJIGVycm9yOiB0b28gbWFueSBwYXJhbWV0ZXJzLCBtYXguIGlzICVkXG4iLAorCQlwcmludGsoS0VSTl9FUlIgIlVCSSBlcnJvcjogdG9vIG1hbnkgcGFyYW1ldGVycywgbWF4LiBpcyAlZFxuIiwKIAkJICAgICAgIFVCSV9NQVhfREVWSUNFUyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWxlbiA9IHN0cm5sZW4odmFsLCBNVERfUEFSQU1fTEVOX01BWCk7CiAJaWYgKGxlbiA9PSBNVERfUEFSQU1fTEVOX01BWCkgewotCQlwcmludGsoIlVCSSBlcnJvcjogcGFyYW1ldGVyIFwiJXNcIiBpcyB0b28gbG9uZywgbWF4LiBpcyAlZFxuIiwKLQkJICAgICAgIHZhbCwgTVREX1BBUkFNX0xFTl9NQVgpOworCQlwcmludGsoS0VSTl9FUlIgIlVCSSBlcnJvcjogcGFyYW1ldGVyIFwiJXNcIiBpcyB0b28gbG9uZywgIgorCQkgICAgICAgIm1heC4gaXMgJWRcbiIsIHZhbCwgTVREX1BBUkFNX0xFTl9NQVgpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAobGVuID09IDApIHsKLQkJcHJpbnRrKCJVQkkgd2FybmluZzogZW1wdHkgJ210ZD0nIHBhcmFtZXRlciAtIGlnbm9yZWRcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJVQkkgd2FybmluZzogZW1wdHkgJ210ZD0nIHBhcmFtZXRlciAtICIKKwkJICAgICAgICJpZ25vcmVkXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC04MTksMTEgKzExMjksMTIgQEAKIAlpZiAoYnVmW2xlbiAtIDFdID09ICdcbicpCiAJCWJ1ZltsZW4gLSAxXSA9ICdcMCc7CiAKLQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCiAJCXRva2Vuc1tpXSA9IHN0cnNlcCgmcGJ1ZiwgIiwiKTsKIAogCWlmIChwYnVmKSB7Ci0JCXByaW50aygiVUJJIGVycm9yOiB0b28gbWFueSBhcmd1bWVudHMgYXQgXCIlc1wiXG4iLCB2YWwpOworCQlwcmludGsoS0VSTl9FUlIgIlVCSSBlcnJvcjogdG9vIG1hbnkgYXJndW1lbnRzIGF0IFwiJXNcIlxuIiwKKwkJICAgICAgIHZhbCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtODMyLDEzICsxMTQzLDkgQEAKIAogCWlmICh0b2tlbnNbMV0pCiAJCXAtPnZpZF9oZHJfb2ZmcyA9IGJ5dGVzX3N0cl90b19pbnQodG9rZW5zWzFdKTsKLQlpZiAodG9rZW5zWzJdKQotCQlwLT5kYXRhX29mZnMgPSBieXRlc19zdHJfdG9faW50KHRva2Vuc1syXSk7CiAKIAlpZiAocC0+dmlkX2hkcl9vZmZzIDwgMCkKIAkJcmV0dXJuIHAtPnZpZF9oZHJfb2ZmczsKLQlpZiAocC0+ZGF0YV9vZmZzIDwgMCkKLQkJcmV0dXJuIHAtPmRhdGFfb2ZmczsKIAogCW10ZF9kZXZzICs9IDE7CiAJcmV0dXJuIDA7CkBAIC04NDYsMTYgKzExNTMsMTUgQEAKIAogbW9kdWxlX3BhcmFtX2NhbGwobXRkLCB1YmlfbXRkX3BhcmFtX3BhcnNlLCBOVUxMLCBOVUxMLCAwMDApOwogTU9EVUxFX1BBUk1fREVTQyhtdGQsICJNVEQgZGV2aWNlcyB0byBhdHRhY2guIFBhcmFtZXRlciBmb3JtYXQ6ICIKLQkJICAgICAgIm10ZD08bmFtZXxudW0+Wyw8dmlkX2hkcl9vZmZzPiw8ZGF0YV9vZmZzPl0uICIKKwkJICAgICAgIm10ZD08bmFtZXxudW0+Wyw8dmlkX2hkcl9vZmZzPl0uXG4iCiAJCSAgICAgICJNdWx0aXBsZSBcIm10ZFwiIHBhcmFtZXRlcnMgbWF5IGJlIHNwZWNpZmllZC5cbiIKLQkJICAgICAgIk1URCBkZXZpY2VzIG1heSBiZSBzcGVjaWZpZWQgYnkgdGhlaXIgbnVtYmVyIG9yIG5hbWUuICIKLQkJICAgICAgIk9wdGlvbmFsIFwidmlkX2hkcl9vZmZzXCIgYW5kIFwiZGF0YV9vZmZzXCIgcGFyYW1ldGVycyAiCi0JCSAgICAgICJzcGVjaWZ5IFVCSSBWSUQgaGVhZGVyIHBvc2l0aW9uIGFuZCBkYXRhIHN0YXJ0aW5nICIKLQkJICAgICAgInBvc2l0aW9uIHRvIGJlIHVzZWQgYnkgVUJJLlxuIgotCQkgICAgICAiRXhhbXBsZTogbXRkPWNvbnRlbnQsMTk4NCwyMDQ4IG10ZD00IC0gYXR0YWNoIE1URCBkZXZpY2UiCi0JCSAgICAgICJ3aXRoIG5hbWUgY29udGVudCB1c2luZyBWSUQgaGVhZGVyIG9mZnNldCAxOTg0IGFuZCBkYXRhICIKLQkJICAgICAgInN0YXJ0IDIwNDgsIGFuZCBNVEQgZGV2aWNlIG51bWJlciA0IHVzaW5nIGRlZmF1bHQgIgotCQkgICAgICAib2Zmc2V0cyIpOworCQkgICAgICAiTVREIGRldmljZXMgbWF5IGJlIHNwZWNpZmllZCBieSB0aGVpciBudW1iZXIgb3IgbmFtZS5cbiIKKwkJICAgICAgIk9wdGlvbmFsIFwidmlkX2hkcl9vZmZzXCIgcGFyYW1ldGVyIHNwZWNpZmllcyBVQkkgVklEICIKKwkJICAgICAgImhlYWRlciBwb3NpdGlvbiBhbmQgZGF0YSBzdGFydGluZyBwb3NpdGlvbiB0byBiZSB1c2VkICIKKwkJICAgICAgImJ5IFVCSS5cbiIKKwkJICAgICAgIkV4YW1wbGU6IG10ZD1jb250ZW50LDE5ODQgbXRkPTQgLSBhdHRhY2ggTVREIGRldmljZSIKKwkJICAgICAgIndpdGggbmFtZSBcImNvbnRlbnRcIiB1c2luZyBWSUQgaGVhZGVyIG9mZnNldCAxOTg0LCBhbmQgIgorCQkgICAgICAiTVREIGRldmljZSBudW1iZXIgNCB3aXRoIGRlZmF1bHQgVklEIGhlYWRlciBvZmZzZXQuIik7CiAKIE1PRFVMRV9WRVJTSU9OKF9fc3RyaW5naWZ5KFVCSV9WRVJTSU9OKSk7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlVCSSAtIFVuc29ydGVkIEJsb2NrIEltYWdlcyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL2NkZXYuYyBiL2RyaXZlcnMvbXRkL3ViaS9jZGV2LmMKaW5kZXggZmU0ZGExZS4uOWQ2YWFlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL2NkZXYuYworKysgYi9kcml2ZXJzL210ZC91YmkvY2Rldi5jCkBAIC0yOCw2ICsyOCwxMSBAQAogICoKICAqIE1ham9yIGFuZCBtaW5vciBudW1iZXJzIGFyZSBhc3NpZ25lZCBkeW5hbWljYWxseSB0byBib3RoIFVCSSBhbmQgdm9sdW1lCiAgKiBjaGFyYWN0ZXIgZGV2aWNlcy4KKyAqCisgKiBXZWxsLCB0aGVyZSBpcyB0aGUgdGhpcmQga2luZCBvZiBjaGFyYWN0ZXIgZGV2aWNlcyAtIHRoZSBVQkkgY29udHJvbAorICogY2hhcmFjdGVyIGRldmljZSwgd2hpY2ggYWxsb3dzIHRvIG1hbmlwdWxhdGUgYnkgVUJJIGRldmljZXMgLSBjcmVhdGUgYW5kCisgKiBkZWxldGUgdGhlbS4gSW4gb3RoZXIgd29yZHMsIGl0IGlzIHVzZWQgZm9yIGF0dGFjaGluZyBhbmQgZGV0YWNoaW5nIE1URAorICogZGV2aWNlcy4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0zOSwzNCArNDQsNiBAQAogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgInViaS5oIgogCi0vKgotICogTWF4aW11bSBzZXF1ZW5jZSBudW1iZXJzIG9mIFVCSSBhbmQgdm9sdW1lIGNoYXJhY3RlciBkZXZpY2UgSU9DVExzIChkaXJlY3QKLSAqIGxvZ2ljYWwgZXJhc2VibG9jayBlcmFzZSBpcyBhIGRlYnVnLW9ubHkgZmVhdHVyZSkuCi0gKi8KLSNkZWZpbmUgVUJJX0NERVZfSU9DX01BWF9TRVEgMgotI2lmbmRlZiBDT05GSUdfTVREX1VCSV9ERUJVR19VU0VSU1BBQ0VfSU8KLSNkZWZpbmUgVk9MX0NERVZfSU9DX01BWF9TRVEgMQotI2Vsc2UKLSNkZWZpbmUgVk9MX0NERVZfSU9DX01BWF9TRVEgMgotI2VuZGlmCi0KLS8qKgotICogbWFqb3JfdG9fZGV2aWNlIC0gZ2V0IFVCSSBkZXZpY2Ugb2JqZWN0IGJ5IGNoYXJhY3RlciBkZXZpY2UgbWFqb3IgbnVtYmVyLgotICogQG1ham9yOiBtYWpvciBudW1iZXIKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBVQkkgZGV2aWNlIG9iamVjdC4KLSAqLwotc3RhdGljIHN0cnVjdCB1YmlfZGV2aWNlICptYWpvcl90b19kZXZpY2UoaW50IG1ham9yKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IHViaV9kZXZpY2VzX2NudDsgaSsrKQotCQlpZiAodWJpX2RldmljZXNbaV0gJiYgdWJpX2RldmljZXNbaV0tPm1ham9yID09IG1ham9yKQotCQkJcmV0dXJuIHViaV9kZXZpY2VzW2ldOwotCUJVRygpOwotCXJldHVybiBOVUxMOwotfQotCiAvKioKICAqIGdldF9leGNsdXNpdmUgLSBnZXQgZXhjbHVzaXZlIGFjY2VzcyB0byBhbiBVQkkgdm9sdW1lLgogICogQGRlc2M6IHZvbHVtZSBkZXNjcmlwdG9yCkBAIC0xMjQsOSArMTAxLDExIEBACiBzdGF0aWMgaW50IHZvbF9jZGV2X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYzsKLQljb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpID0gbWFqb3JfdG9fZGV2aWNlKGltYWpvcihpbm9kZSkpOwotCWludCB2b2xfaWQgPSBpbWlub3IoaW5vZGUpIC0gMTsKLQlpbnQgbW9kZTsKKwlpbnQgdm9sX2lkID0gaW1pbm9yKGlub2RlKSAtIDEsIG1vZGUsIHViaV9udW07CisKKwl1YmlfbnVtID0gdWJpX21ham9yMm51bShpbWFqb3IoaW5vZGUpKTsKKwlpZiAodWJpX251bSA8IDApCisJCXJldHVybiB1YmlfbnVtOwogCiAJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQogCQltb2RlID0gVUJJX1JFQURXUklURTsKQEAgLTEzNSw3ICsxMTQsNyBAQAogCiAJZGJnX21zZygib3BlbiB2b2x1bWUgJWQsIG1vZGUgJWQiLCB2b2xfaWQsIG1vZGUpOwogCi0JZGVzYyA9IHViaV9vcGVuX3ZvbHVtZSh1YmktPnViaV9udW0sIHZvbF9pZCwgbW9kZSk7CisJZGVzYyA9IHViaV9vcGVuX3ZvbHVtZSh1YmlfbnVtLCB2b2xfaWQsIG1vZGUpOwogCWlmIChJU19FUlIoZGVzYykpCiAJCXJldHVybiBQVFJfRVJSKGRlc2MpOwogCkBAIC0xNTMsOCArMTMyLDE1IEBACiAJaWYgKHZvbC0+dXBkYXRpbmcpIHsKIAkJdWJpX3dhcm4oInVwZGF0ZSBvZiB2b2x1bWUgJWQgbm90IGZpbmlzaGVkLCB2b2x1bWUgaXMgZGFtYWdlZCIsCiAJCQkgdm9sLT52b2xfaWQpOworCQl1YmlfYXNzZXJ0KCF2b2wtPmNoYW5naW5nX2xlYik7CiAJCXZvbC0+dXBkYXRpbmcgPSAwOwogCQl2ZnJlZSh2b2wtPnVwZF9idWYpOworCX0gZWxzZSBpZiAodm9sLT5jaGFuZ2luZ19sZWIpIHsKKwkJZGJnX21zZygib25seSAlbGxkIG9mICVsbGQgYnl0ZXMgcmVjZWl2ZWQgZm9yIGF0b21pYyBMRUIgY2hhbmdlIgorCQkJIiBmb3Igdm9sdW1lICVkOiVkLCBjYW5jZWwiLCB2b2wtPnVwZF9yZWNlaXZlZCwKKwkJCXZvbC0+dXBkX2J5dGVzLCB2b2wtPnViaS0+dWJpX251bSwgdm9sLT52b2xfaWQpOworCQl2b2wtPmNoYW5naW5nX2xlYiA9IDA7CisJCXZmcmVlKHZvbC0+dXBkX2J1Zik7CiAJfQogCiAJdWJpX2Nsb3NlX3ZvbHVtZShkZXNjKTsKQEAgLTIwNSwxMyArMTkxLDEzIEBACiAJc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sID0gZGVzYy0+dm9sOwogCXN0cnVjdCB1YmlfZGV2aWNlICp1YmkgPSB2b2wtPnViaTsKLQlpbnQgZXJyLCBsbnVtLCBvZmYsIGxlbiwgIHZvbF9pZCA9IGRlc2MtPnZvbC0+dm9sX2lkLCB0YnVmX3NpemU7CisJaW50IGVyciwgbG51bSwgb2ZmLCBsZW4sICB0YnVmX3NpemU7CiAJc2l6ZV90IGNvdW50X3NhdmUgPSBjb3VudDsKIAl2b2lkICp0YnVmOwogCXVpbnQ2NF90IHRtcDsKIAogCWRiZ19tc2coInJlYWQgJXpkIGJ5dGVzIGZyb20gb2Zmc2V0ICVsbGQgb2Ygdm9sdW1lICVkIiwKLQkJY291bnQsICpvZmZwLCB2b2xfaWQpOworCQljb3VudCwgKm9mZnAsIHZvbC0+dm9sX2lkKTsKIAogCWlmICh2b2wtPnVwZGF0aW5nKSB7CiAJCWRiZ19lcnIoInVwZGF0aW5nIik7CkBAIC0yMjUsNyArMjExLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAodm9sLT5jb3JydXB0ZWQpCi0JCWRiZ19tc2coInJlYWQgZnJvbSBjb3JydXB0ZWQgdm9sdW1lICVkIiwgdm9sX2lkKTsKKwkJZGJnX21zZygicmVhZCBmcm9tIGNvcnJ1cHRlZCB2b2x1bWUgJWQiLCB2b2wtPnZvbF9pZCk7CiAKIAlpZiAoKm9mZnAgKyBjb3VudCA+IHZvbC0+dXNlZF9ieXRlcykKIAkJY291bnRfc2F2ZSA9IGNvdW50ID0gdm9sLT51c2VkX2J5dGVzIC0gKm9mZnA7CkBAIC0yNDksNyArMjM1LDcgQEAKIAkJaWYgKG9mZiArIGxlbiA+PSB2b2wtPnVzYWJsZV9sZWJfc2l6ZSkKIAkJCWxlbiA9IHZvbC0+dXNhYmxlX2xlYl9zaXplIC0gb2ZmOwogCi0JCWVyciA9IHViaV9lYmFfcmVhZF9sZWIodWJpLCB2b2xfaWQsIGxudW0sIHRidWYsIG9mZiwgbGVuLCAwKTsKKwkJZXJyID0gdWJpX2ViYV9yZWFkX2xlYih1YmksIHZvbCwgbG51bSwgdGJ1Ziwgb2ZmLCBsZW4sIDApOwogCQlpZiAoZXJyKQogCQkJYnJlYWs7CiAKQEAgLTI4OSwxMyArMjc1LDEzIEBACiAJc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sID0gZGVzYy0+dm9sOwogCXN0cnVjdCB1YmlfZGV2aWNlICp1YmkgPSB2b2wtPnViaTsKLQlpbnQgbG51bSwgb2ZmLCBsZW4sIHRidWZfc2l6ZSwgdm9sX2lkID0gdm9sLT52b2xfaWQsIGVyciA9IDA7CisJaW50IGxudW0sIG9mZiwgbGVuLCB0YnVmX3NpemUsIGVyciA9IDA7CiAJc2l6ZV90IGNvdW50X3NhdmUgPSBjb3VudDsKIAljaGFyICp0YnVmOwogCXVpbnQ2NF90IHRtcDsKIAogCWRiZ19tc2coInJlcXVlc3RlZDogd3JpdGUgJXpkIGJ5dGVzIHRvIG9mZnNldCAlbGxkIG9mIHZvbHVtZSAldSIsCi0JCWNvdW50LCAqb2ZmcCwgZGVzYy0+dm9sLT52b2xfaWQpOworCQljb3VudCwgKm9mZnAsIHZvbC0+dm9sX2lkKTsKIAogCWlmICh2b2wtPnZvbF90eXBlID09IFVCSV9TVEFUSUNfVk9MVU1FKQogCQlyZXR1cm4gLUVST0ZTOwpAQCAtMzM5LDcgKzMyNSw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCWVyciA9IHViaV9lYmFfd3JpdGVfbGViKHViaSwgdm9sX2lkLCBsbnVtLCB0YnVmLCBvZmYsIGxlbiwKKwkJZXJyID0gdWJpX2ViYV93cml0ZV9sZWIodWJpLCB2b2wsIGxudW0sIHRidWYsIG9mZiwgbGVuLAogCQkJCQlVQklfVU5LTk9XTik7CiAJCWlmIChlcnIpCiAJCQlicmVhazsKQEAgLTM3MiwyMiArMzU4LDMyIEBACiAJc3RydWN0IHViaV92b2x1bWUgKnZvbCA9IGRlc2MtPnZvbDsKIAlzdHJ1Y3QgdWJpX2RldmljZSAqdWJpID0gdm9sLT51Ymk7CiAKLQlpZiAoIXZvbC0+dXBkYXRpbmcpCisJaWYgKCF2b2wtPnVwZGF0aW5nICYmICF2b2wtPmNoYW5naW5nX2xlYikKIAkJcmV0dXJuIHZvbF9jZGV2X2RpcmVjdF93cml0ZShmaWxlLCBidWYsIGNvdW50LCBvZmZwKTsKIAotCWVyciA9IHViaV9tb3JlX3VwZGF0ZV9kYXRhKHViaSwgdm9sLT52b2xfaWQsIGJ1ZiwgY291bnQpOworCWlmICh2b2wtPnVwZGF0aW5nKQorCQllcnIgPSB1YmlfbW9yZV91cGRhdGVfZGF0YSh1YmksIHZvbCwgYnVmLCBjb3VudCk7CisJZWxzZQorCQllcnIgPSB1YmlfbW9yZV9sZWJfY2hhbmdlX2RhdGEodWJpLCB2b2wsIGJ1ZiwgY291bnQpOworCiAJaWYgKGVyciA8IDApIHsKLQkJdWJpX2VycigiY2Fubm90IHdyaXRlICV6ZCBieXRlcyBvZiB1cGRhdGUgZGF0YSIsIGNvdW50KTsKKwkJdWJpX2VycigiY2Fubm90IGFjY2VwdCBtb3JlICV6ZCBieXRlcyBvZiBkYXRhLCBlcnJvciAlZCIsCisJCQljb3VudCwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKIAlpZiAoZXJyKSB7CiAJCS8qCi0JCSAqIFVwZGF0ZSBpcyBmaW5pc2hlZCwgQGVyciBjb250YWlucyBudW1iZXIgb2YgYWN0dWFsbHkgd3JpdHRlbgotCQkgKiBieXRlcyBub3cuCisJCSAqIFRoZSBvcGVyYXRpb24gaXMgZmluaXNoZWQsIEBlcnIgY29udGFpbnMgbnVtYmVyIG9mIGFjdHVhbGx5CisJCSAqIHdyaXR0ZW4gYnl0ZXMuCiAJCSAqLwogCQljb3VudCA9IGVycjsKIAorCQlpZiAodm9sLT5jaGFuZ2luZ19sZWIpIHsKKwkJCXJldm9rZV9leGNsdXNpdmUoZGVzYywgVUJJX1JFQURXUklURSk7CisJCQlyZXR1cm4gY291bnQ7CisJCX0KKwogCQllcnIgPSB1YmlfY2hlY2tfdm9sdW1lKHViaSwgdm9sLT52b2xfaWQpOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CkBAIC00MDIsNyArMzk4LDYgQEAKIAkJcmV2b2tlX2V4Y2x1c2l2ZShkZXNjLCBVQklfUkVBRFdSSVRFKTsKIAl9CiAKLQkqb2ZmcCArPSBjb3VudDsKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTQ0NywxMSArNDQyLDQ2IEBACiAJCWlmIChlcnIgPCAwKQogCQkJYnJlYWs7CiAKLQkJZXJyID0gdWJpX3N0YXJ0X3VwZGF0ZSh1YmksIHZvbC0+dm9sX2lkLCBieXRlcyk7CisJCWVyciA9IHViaV9zdGFydF91cGRhdGUodWJpLCB2b2wsIGJ5dGVzKTsKIAkJaWYgKGJ5dGVzID09IDApCiAJCQlyZXZva2VfZXhjbHVzaXZlKGRlc2MsIFVCSV9SRUFEV1JJVEUpOworCQlicmVhazsKKwl9CiAKLQkJZmlsZS0+Zl9wb3MgPSAwOworCS8qIEF0b21pYyBsb2dpY2FsIGVyYXNlYmxvY2sgY2hhbmdlIGNvbW1hbmQgKi8KKwljYXNlIFVCSV9JT0NFQkNIOgorCXsKKwkJc3RydWN0IHViaV9sZWJfY2hhbmdlX3JlcSByZXE7CisKKwkJZXJyID0gY29weV9mcm9tX3VzZXIoJnJlcSwgYXJncCwKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QgdWJpX2xlYl9jaGFuZ2VfcmVxKSk7CisJCWlmIChlcnIpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChkZXNjLT5tb2RlID09IFVCSV9SRUFET05MWSB8fAorCQkgICAgdm9sLT52b2xfdHlwZSA9PSBVQklfU1RBVElDX1ZPTFVNRSkgeworCQkJZXJyID0gLUVST0ZTOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBWYWxpZGF0ZSB0aGUgcmVxdWVzdCAqLworCQllcnIgPSAtRUlOVkFMOworCQlpZiAocmVxLmxudW0gPCAwIHx8IHJlcS5sbnVtID49IHZvbC0+cmVzZXJ2ZWRfcGVicyB8fAorCQkgICAgcmVxLmJ5dGVzIDwgMCB8fCByZXEubG51bSA+PSB2b2wtPnVzYWJsZV9sZWJfc2l6ZSkKKwkJCWJyZWFrOworCQlpZiAocmVxLmR0eXBlICE9IFVCSV9MT05HVEVSTSAmJiByZXEuZHR5cGUgIT0gVUJJX1NIT1JUVEVSTSAmJgorCQkgICAgcmVxLmR0eXBlICE9IFVCSV9VTktOT1dOKQorCQkJYnJlYWs7CisKKwkJZXJyID0gZ2V0X2V4Y2x1c2l2ZShkZXNjKTsKKwkJaWYgKGVyciA8IDApCisJCQlicmVhazsKKworCQllcnIgPSB1Ymlfc3RhcnRfbGViX2NoYW5nZSh1YmksIHZvbCwgJnJlcSk7CisJCWlmIChyZXEuYnl0ZXMgPT0gMCkKKwkJCXJldm9rZV9leGNsdXNpdmUoZGVzYywgVUJJX1JFQURXUklURSk7CiAJCWJyZWFrOwogCX0KIApAQCAtNDY3LDcgKzQ5Nyw4IEBACiAJCQlicmVhazsKIAkJfQogCi0JCWlmIChkZXNjLT5tb2RlID09IFVCSV9SRUFET05MWSkgeworCQlpZiAoZGVzYy0+bW9kZSA9PSBVQklfUkVBRE9OTFkgfHwKKwkJICAgIHZvbC0+dm9sX3R5cGUgPT0gVUJJX1NUQVRJQ19WT0xVTUUpIHsKIAkJCWVyciA9IC1FUk9GUzsKIAkJCWJyZWFrOwogCQl9CkBAIC00NzcsMTMgKzUwOCw4IEBACiAJCQlicmVhazsKIAkJfQogCi0JCWlmICh2b2wtPnZvbF90eXBlICE9IFVCSV9EWU5BTUlDX1ZPTFVNRSkgewotCQkJZXJyID0gLUVST0ZTOwotCQkJYnJlYWs7Ci0JCX0KLQogCQlkYmdfbXNnKCJlcmFzZSBMRUIgJWQ6JWQiLCB2b2wtPnZvbF9pZCwgbG51bSk7Ci0JCWVyciA9IHViaV9lYmFfdW5tYXBfbGViKHViaSwgdm9sLT52b2xfaWQsIGxudW0pOworCQllcnIgPSB1YmlfZWJhX3VubWFwX2xlYih1YmksIHZvbCwgbG51bSk7CiAJCWlmIChlcnIpCiAJCQlicmVhazsKIApAQCAtNTgwLDkgKzYwNiw5IEBACiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JdWJpID0gbWFqb3JfdG9fZGV2aWNlKGltYWpvcihpbm9kZSkpOwotCWlmIChJU19FUlIodWJpKSkKLQkJcmV0dXJuIFBUUl9FUlIodWJpKTsKKwl1YmkgPSB1YmlfZ2V0X2J5X21ham9yKGltYWpvcihpbm9kZSkpOworCWlmICghdWJpKQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCXN3aXRjaCAoY21kKSB7CiAJLyogQ3JlYXRlIHZvbHVtZSBjb21tYW5kICovCkBAIC01OTEsOCArNjE3LDcgQEAKIAkJc3RydWN0IHViaV9ta3ZvbF9yZXEgcmVxOwogCiAJCWRiZ19tc2coImNyZWF0ZSB2b2x1bWUiKTsKLQkJZXJyID0gY29weV9mcm9tX3VzZXIoJnJlcSwgYXJncCwKLQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB1YmlfbWt2b2xfcmVxKSk7CisJCWVyciA9IGNvcHlfZnJvbV91c2VyKCZyZXEsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgdWJpX21rdm9sX3JlcSkpOwogCQlpZiAoZXJyKSB7CiAJCQllcnIgPSAtRUZBVUxUOwogCQkJYnJlYWs7CkBAIC02MDQsNyArNjI5LDkgQEAKIAogCQlyZXEubmFtZVtyZXEubmFtZV9sZW5dID0gJ1wwJzsKIAorCQltdXRleF9sb2NrKCZ1YmktPnZvbHVtZXNfbXV0ZXgpOwogCQllcnIgPSB1YmlfY3JlYXRlX3ZvbHVtZSh1YmksICZyZXEpOworCQltdXRleF91bmxvY2soJnViaS0+dm9sdW1lc19tdXRleCk7CiAJCWlmIChlcnIpCiAJCQlicmVhazsKIApAQCAtNjMzLDEwICs2NjAsMTYgQEAKIAkJCWJyZWFrOwogCQl9CiAKKwkJbXV0ZXhfbG9jaygmdWJpLT52b2x1bWVzX211dGV4KTsKIAkJZXJyID0gdWJpX3JlbW92ZV92b2x1bWUoZGVzYyk7Ci0JCWlmIChlcnIpCi0JCQl1YmlfY2xvc2Vfdm9sdW1lKGRlc2MpOworCQltdXRleF91bmxvY2soJnViaS0+dm9sdW1lc19tdXRleCk7CiAKKwkJLyoKKwkJICogVGhlIHZvbHVtZSBpcyBkZWxldGVkICh1bmxlc3MgYW4gZXJyb3Igb2NjdXJyZWQpLCBhbmQgdGhlCisJCSAqICdzdHJ1Y3QgdWJpX3ZvbHVtZScgb2JqZWN0IHdpbGwgYmUgZnJlZWQgd2hlbgorCQkgKiAndWJpX2Nsb3NlX3ZvbHVtZSgpJyB3aWxsIGNhbGwgJ3B1dF9kZXZpY2UoKScuCisJCSAqLworCQl1YmlfY2xvc2Vfdm9sdW1lKGRlc2MpOwogCQlicmVhazsKIAl9CiAKQEAgLTY0OCw4ICs2ODEsNyBAQAogCQlzdHJ1Y3QgdWJpX3Jzdm9sX3JlcSByZXE7CiAKIAkJZGJnX21zZygicmUtc2l6ZSB2b2x1bWUiKTsKLQkJZXJyID0gY29weV9mcm9tX3VzZXIoJnJlcSwgYXJncCwKLQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB1YmlfcnN2b2xfcmVxKSk7CisJCWVyciA9IGNvcHlfZnJvbV91c2VyKCZyZXEsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgdWJpX3Jzdm9sX3JlcSkpOwogCQlpZiAoZXJyKSB7CiAJCQllcnIgPSAtRUZBVUxUOwogCQkJYnJlYWs7CkBAIC02NjksNyArNzAxLDkgQEAKIAkJcGVicyA9ICEhZG9fZGl2KHRtcCwgZGVzYy0+dm9sLT51c2FibGVfbGViX3NpemUpOwogCQlwZWJzICs9IHRtcDsKIAorCQltdXRleF9sb2NrKCZ1YmktPnZvbHVtZXNfbXV0ZXgpOwogCQllcnIgPSB1YmlfcmVzaXplX3ZvbHVtZShkZXNjLCBwZWJzKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1YmktPnZvbHVtZXNfbXV0ZXgpOwogCQl1YmlfY2xvc2Vfdm9sdW1lKGRlc2MpOwogCQlicmVhazsKIAl9CkBAIC02NzksOSArNzEzLDkzIEBACiAJCWJyZWFrOwogCX0KIAorCXViaV9wdXRfZGV2aWNlKHViaSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBjdHJsX2NkZXZfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgZXJyID0gMDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXN3aXRjaCAoY21kKSB7CisJLyogQXR0YWNoIGFuIE1URCBkZXZpY2UgY29tbWFuZCAqLworCWNhc2UgVUJJX0lPQ0FUVDoKKwl7CisJCXN0cnVjdCB1YmlfYXR0YWNoX3JlcSByZXE7CisJCXN0cnVjdCBtdGRfaW5mbyAqbXRkOworCisJCWRiZ19tc2coImF0dGFjaCBNVEQgZGV2aWNlIik7CisJCWVyciA9IGNvcHlfZnJvbV91c2VyKCZyZXEsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgdWJpX2F0dGFjaF9yZXEpKTsKKwkJaWYgKGVycikgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHJlcS5tdGRfbnVtIDwgMCB8fAorCQkgICAgKHJlcS51YmlfbnVtIDwgMCAmJiByZXEudWJpX251bSAhPSBVQklfREVWX05VTV9BVVRPKSkgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJbXRkID0gZ2V0X210ZF9kZXZpY2UoTlVMTCwgcmVxLm10ZF9udW0pOworCQlpZiAoSVNfRVJSKG10ZCkpIHsKKwkJCWVyciA9IFBUUl9FUlIobXRkKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogTm90ZSwgZnVydGhlciByZXF1ZXN0IHZlcmlmaWNhdGlvbiBpcyBkb25lIGJ5CisJCSAqICd1YmlfYXR0YWNoX210ZF9kZXYoKScuCisJCSAqLworCQltdXRleF9sb2NrKCZ1YmlfZGV2aWNlc19tdXRleCk7CisJCWVyciA9IHViaV9hdHRhY2hfbXRkX2RldihtdGQsIHJlcS51YmlfbnVtLCByZXEudmlkX2hkcl9vZmZzZXQpOworCQltdXRleF91bmxvY2soJnViaV9kZXZpY2VzX211dGV4KTsKKwkJaWYgKGVyciA8IDApCisJCQlwdXRfbXRkX2RldmljZShtdGQpOworCQllbHNlCisJCQkvKiBAZXJyIGNvbnRhaW5zIFVCSSBkZXZpY2UgbnVtYmVyICovCisJCQllcnIgPSBwdXRfdXNlcihlcnIsIChfX3VzZXIgaW50MzJfdCAqKWFyZ3ApOworCisJCWJyZWFrOworCX0KKworCS8qIERldGFjaCBhbiBNVEQgZGV2aWNlIGNvbW1hbmQgKi8KKwljYXNlIFVCSV9JT0NERVQ6CisJeworCQlpbnQgdWJpX251bTsKKworCQlkYmdfbXNnKCJkZXR0YWNoIE1URCBkZXZpY2UiKTsKKwkJZXJyID0gZ2V0X3VzZXIodWJpX251bSwgKF9fdXNlciBpbnQzMl90ICopYXJncCk7CisJCWlmIChlcnIpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCW11dGV4X2xvY2soJnViaV9kZXZpY2VzX211dGV4KTsKKwkJZXJyID0gdWJpX2RldGFjaF9tdGRfZGV2KHViaV9udW0sIDApOworCQltdXRleF91bmxvY2soJnViaV9kZXZpY2VzX211dGV4KTsKKwkJYnJlYWs7CisJfQorCisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT1RUWTsKKwkJYnJlYWs7CisJfQorCiAJcmV0dXJuIGVycjsKIH0KIAorLyogVUJJIGNvbnRyb2wgY2hhcmFjdGVyIGRldmljZSBvcGVyYXRpb25zICovCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHViaV9jdHJsX2NkZXZfb3BlcmF0aW9ucyA9IHsKKwkuaW9jdGwgPSBjdHJsX2NkZXZfaW9jdGwsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworCiAvKiBVQkkgY2hhcmFjdGVyIGRldmljZSBvcGVyYXRpb25zICovCiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHViaV9jZGV2X29wZXJhdGlvbnMgPSB7CiAJLm93bmVyID0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvZGVidWcuaCBiL2RyaXZlcnMvbXRkL3ViaS9kZWJ1Zy5oCmluZGV4IDQ2NzcyMmUuLjUxYzQwYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9kZWJ1Zy5oCkBAIC0zOSw4ICszOSw5IEBACiAKICNpZmRlZiBDT05GSUdfTVREX1VCSV9ERUJVR19NU0cKIC8qIEdlbmVyaWMgZGVidWdnaW5nIG1lc3NhZ2UgKi8KLSNkZWZpbmUgZGJnX21zZyhmbXQsIC4uLikgXAotCXByaW50ayhLRVJOX0RFQlVHICJVQkkgREJHOiAlczogIiBmbXQgIlxuIiwgX19GVU5DVElPTl9fLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBkYmdfbXNnKGZtdCwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlwcmludGsoS0VSTl9ERUJVRyAiVUJJIERCRyAocGlkICVkKTogJXM6ICIgZm10ICJcbiIsIFwKKwkgICAgICAgY3VycmVudC0+cGlkLCBfX0ZVTkNUSU9OX18sICMjX19WQV9BUkdTX18pCiAKICNkZWZpbmUgdWJpX2RiZ19kdW1wX3N0YWNrKCkgZHVtcF9zdGFjaygpCiAKQEAgLTc2LDM2ICs3NywyOCBAQAogCiAjaWZkZWYgQ09ORklHX01URF9VQklfREVCVUdfTVNHX0VCQQogLyogTWVzc2FnZXMgZnJvbSB0aGUgZXJhc2VibG9jayBhc3NvY2lhdGlvbiB1bml0ICovCi0jZGVmaW5lIGRiZ19lYmEoZm10LCAuLi4pIFwKLQlwcmludGsoS0VSTl9ERUJVRyAiVUJJIERCRyBlYmE6ICVzOiAiIGZtdCAiXG4iLCBfX0ZVTkNUSU9OX18sIFwKLQkgICAgICAgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgZGJnX2ViYShmbXQsIC4uLikgZGJnX21zZyhmbXQsICMjX19WQV9BUkdTX18pCiAjZWxzZQogI2RlZmluZSBkYmdfZWJhKGZtdCwgLi4uKSAoe30pCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19NVERfVUJJX0RFQlVHX01TR19XTAogLyogTWVzc2FnZXMgZnJvbSB0aGUgd2Vhci1sZXZlbGluZyB1bml0ICovCi0jZGVmaW5lIGRiZ193bChmbXQsIC4uLikgXAotCXByaW50ayhLRVJOX0RFQlVHICJVQkkgREJHIHdsOiAlczogIiBmbXQgIlxuIiwgX19GVU5DVElPTl9fLCBcCi0JICAgICAgICMjX19WQV9BUkdTX18pCisjZGVmaW5lIGRiZ193bChmbXQsIC4uLikgZGJnX21zZyhmbXQsICMjX19WQV9BUkdTX18pCiAjZWxzZQogI2RlZmluZSBkYmdfd2woZm10LCAuLi4pICh7fSkKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX01URF9VQklfREVCVUdfTVNHX0lPCiAvKiBNZXNzYWdlcyBmcm9tIHRoZSBpbnB1dC9vdXRwdXQgdW5pdCAqLwotI2RlZmluZSBkYmdfaW8oZm10LCAuLi4pIFwKLQlwcmludGsoS0VSTl9ERUJVRyAiVUJJIERCRyBpbzogJXM6ICIgZm10ICJcbiIsIF9fRlVOQ1RJT05fXywgXAotCSAgICAgICAjI19fVkFfQVJHU19fKQorI2RlZmluZSBkYmdfaW8oZm10LCAuLi4pIGRiZ19tc2coZm10LCAjI19fVkFfQVJHU19fKQogI2Vsc2UKICNkZWZpbmUgZGJnX2lvKGZtdCwgLi4uKSAoe30pCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19NVERfVUJJX0RFQlVHX01TR19CTEQKIC8qIEluaXRpYWxpemF0aW9uIGFuZCBidWlsZCBtZXNzYWdlcyAqLwotI2RlZmluZSBkYmdfYmxkKGZtdCwgLi4uKSBcCi0JcHJpbnRrKEtFUk5fREVCVUcgIlVCSSBEQkcgYmxkOiAlczogIiBmbXQgIlxuIiwgX19GVU5DVElPTl9fLCBcCi0JICAgICAgICMjX19WQV9BUkdTX18pCisjZGVmaW5lIGRiZ19ibGQoZm10LCAuLi4pIGRiZ19tc2coZm10LCAjI19fVkFfQVJHU19fKQogI2Vsc2UKICNkZWZpbmUgZGJnX2JsZChmbXQsIC4uLikgKHt9KQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvZWJhLmMgYi9kcml2ZXJzL210ZC91YmkvZWJhLmMKaW5kZXggODgwZmEzNi4uN2NlOTFjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL2ViYS5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9lYmEuYwpAQCAtMzEsNyArMzEsNyBAQAogICogbG9naWNhbCBlcmFzZWJsb2NrIGl0IGlzIGxvY2tlZCBmb3IgcmVhZGluZyBvciB3cml0aW5nLiBUaGUgcGVyLWxvZ2ljYWwKICAqIGVyYXNlYmxvY2sgbG9ja2luZyBpcyBpbXBsZW1lbnRlZCBieSBtZWFucyBvZiB0aGUgbG9jayB0cmVlLiBUaGUgbG9jayB0cmVlCiAgKiBpcyBhbiBSQi10cmVlIHdoaWNoIHJlZmVycyBhbGwgdGhlIGN1cnJlbnRseSBsb2NrZWQgbG9naWNhbCBlcmFzZWJsb2Nrcy4gVGhlCi0gKiBsb2NrIHRyZWUgZWxlbWVudHMgYXJlICZzdHJ1Y3QgbHRyZWVfZW50cnkgb2JqZWN0cy4gVGhleSBhcmUgaW5kZXhlZCBieQorICogbG9jayB0cmVlIGVsZW1lbnRzIGFyZSAmc3RydWN0IHViaV9sdHJlZV9lbnRyeSBvYmplY3RzLiBUaGV5IGFyZSBpbmRleGVkIGJ5CiAgKiAoQHZvbF9pZCwgQGxudW0pIHBhaXJzLgogICoKICAqIEVCQSBhbHNvIG1haW50YWlucyB0aGUgZ2xvYmFsIHNlcXVlbmNlIGNvdW50ZXIgd2hpY2ggaXMgaW5jcmVtZW50ZWQgZWFjaApAQCAtNTAsMjkgKzUwLDYgQEAKICNkZWZpbmUgRUJBX1JFU0VSVkVEX1BFQlMgMQogCiAvKioKLSAqIHN0cnVjdCBsdHJlZV9lbnRyeSAtIGFuIGVudHJ5IGluIHRoZSBsb2NrIHRyZWUuCi0gKiBAcmI6IGxpbmtzIFJCLXRyZWUgbm9kZXMKLSAqIEB2b2xfaWQ6IHZvbHVtZSBJRCBvZiB0aGUgbG9ja2VkIGxvZ2ljYWwgZXJhc2VibG9jawotICogQGxudW06IGxvY2tlZCBsb2dpY2FsIGVyYXNlYmxvY2sgbnVtYmVyCi0gKiBAdXNlcnM6IGhvdyBtYW55IHRhc2tzIGFyZSB1c2luZyB0aGlzIGxvZ2ljYWwgZXJhc2VibG9jayBvciB3YWl0IGZvciBpdAotICogQG11dGV4OiByZWFkL3dyaXRlIG11dGV4IHRvIGltcGxlbWVudCByZWFkL3dyaXRlIGFjY2VzcyBzZXJpYWxpemF0aW9uIHRvCi0gKiB0aGUgKEB2b2xfaWQsIEBsbnVtKSBsb2dpY2FsIGVyYXNlYmxvY2sKLSAqCi0gKiBXaGVuIGEgbG9naWNhbCBlcmFzZWJsb2NrIGlzIGJlaW5nIGxvY2tlZCAtIGNvcnJlc3BvbmRpbmcgJnN0cnVjdCBsdHJlZV9lbnRyeQotICogb2JqZWN0IGlzIGluc2VydGVkIHRvIHRoZSBsb2NrIHRyZWUgKEB1YmktPmx0cmVlKS4KLSAqLwotc3RydWN0IGx0cmVlX2VudHJ5IHsKLQlzdHJ1Y3QgcmJfbm9kZSByYjsKLQlpbnQgdm9sX2lkOwotCWludCBsbnVtOwotCWludCB1c2VyczsKLQlzdHJ1Y3Qgcndfc2VtYXBob3JlIG11dGV4OwotfTsKLQotLyogU2xhYiBjYWNoZSBmb3IgbG9jay10cmVlIGVudHJpZXMgKi8KLXN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqbHRyZWVfc2xhYjsKLQotLyoqCiAgKiBuZXh0X3NxbnVtIC0gZ2V0IG5leHQgc2VxdWVuY2UgbnVtYmVyLgogICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKICAqCkBAIC0xMDEsNyArNzgsNyBAQAogICovCiBzdGF0aWMgaW50IHViaV9nZXRfY29tcGF0KGNvbnN0IHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCB2b2xfaWQpCiB7Ci0JaWYgKHZvbF9pZCA9PSBVQklfTEFZT1VUX1ZPTF9JRCkKKwlpZiAodm9sX2lkID09IFVCSV9MQVlPVVRfVk9MVU1FX0lEKQogCQlyZXR1cm4gVUJJX0xBWU9VVF9WT0xVTUVfQ09NUEFUOwogCXJldHVybiAwOwogfQpAQCAtMTEyLDIwICs4OSwyMCBAQAogICogQHZvbF9pZDogdm9sdW1lIElECiAgKiBAbG51bTogbG9naWNhbCBlcmFzZWJsb2NrIG51bWJlcgogICoKLSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgJnN0cnVjdCBsdHJlZV9lbnRyeQorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY29ycmVzcG9uZGluZyAmc3RydWN0IHViaV9sdHJlZV9lbnRyeQogICogb2JqZWN0IGlmIHRoZSBsb2dpY2FsIGVyYXNlYmxvY2sgaXMgbG9ja2VkIGFuZCAlTlVMTCBpZiBpdCBpcyBub3QuCiAgKiBAdWJpLT5sdHJlZV9sb2NrIGhhcyB0byBiZSBsb2NrZWQuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgbHRyZWVfZW50cnkgKmx0cmVlX2xvb2t1cChzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgdm9sX2lkLAotCQkJCQlpbnQgbG51bSkKK3N0YXRpYyBzdHJ1Y3QgdWJpX2x0cmVlX2VudHJ5ICpsdHJlZV9sb29rdXAoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHZvbF9pZCwKKwkJCQkJICAgIGludCBsbnVtKQogewogCXN0cnVjdCByYl9ub2RlICpwOwogCiAJcCA9IHViaS0+bHRyZWUucmJfbm9kZTsKIAl3aGlsZSAocCkgewotCQlzdHJ1Y3QgbHRyZWVfZW50cnkgKmxlOworCQlzdHJ1Y3QgdWJpX2x0cmVlX2VudHJ5ICpsZTsKIAotCQlsZSA9IHJiX2VudHJ5KHAsIHN0cnVjdCBsdHJlZV9lbnRyeSwgcmIpOworCQlsZSA9IHJiX2VudHJ5KHAsIHN0cnVjdCB1YmlfbHRyZWVfZW50cnksIHJiKTsKIAogCQlpZiAodm9sX2lkIDwgbGUtPnZvbF9pZCkKIAkJCXAgPSBwLT5yYl9sZWZ0OwpAQCAtMTU1LDE1ICsxMzIsMTcgQEAKICAqIFJldHVybnMgcG9pbnRlciB0byB0aGUgbG9jayB0cmVlIGVudHJ5IG9yICUtRU5PTUVNIGlmIG1lbW9yeSBhbGxvY2F0aW9uCiAgKiBmYWlsZWQuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgbHRyZWVfZW50cnkgKmx0cmVlX2FkZF9lbnRyeShzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgdm9sX2lkLAotCQkJCQkgICBpbnQgbG51bSkKK3N0YXRpYyBzdHJ1Y3QgdWJpX2x0cmVlX2VudHJ5ICpsdHJlZV9hZGRfZW50cnkoc3RydWN0IHViaV9kZXZpY2UgKnViaSwKKwkJCQkJICAgICAgIGludCB2b2xfaWQsIGludCBsbnVtKQogewotCXN0cnVjdCBsdHJlZV9lbnRyeSAqbGUsICpsZTEsICpsZV9mcmVlOworCXN0cnVjdCB1YmlfbHRyZWVfZW50cnkgKmxlLCAqbGUxLCAqbGVfZnJlZTsKIAotCWxlID0ga21lbV9jYWNoZV9hbGxvYyhsdHJlZV9zbGFiLCBHRlBfTk9GUyk7CisJbGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdWJpX2x0cmVlX2VudHJ5KSwgR0ZQX05PRlMpOwogCWlmICghbGUpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCisJbGUtPnVzZXJzID0gMDsKKwlpbml0X3J3c2VtKCZsZS0+bXV0ZXgpOwogCWxlLT52b2xfaWQgPSB2b2xfaWQ7CiAJbGUtPmxudW0gPSBsbnVtOwogCkBAIC0xODksNyArMTY4LDcgQEAKIAkJcCA9ICZ1YmktPmx0cmVlLnJiX25vZGU7CiAJCXdoaWxlICgqcCkgewogCQkJcGFyZW50ID0gKnA7Ci0JCQlsZTEgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBsdHJlZV9lbnRyeSwgcmIpOworCQkJbGUxID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgdWJpX2x0cmVlX2VudHJ5LCByYik7CiAKIAkJCWlmICh2b2xfaWQgPCBsZTEtPnZvbF9pZCkKIAkJCQlwID0gJigqcCktPnJiX2xlZnQ7CkBAIC0yMTEsNyArMTkwLDcgQEAKIAlzcGluX3VubG9jaygmdWJpLT5sdHJlZV9sb2NrKTsKIAogCWlmIChsZV9mcmVlKQotCQlrbWVtX2NhY2hlX2ZyZWUobHRyZWVfc2xhYiwgbGVfZnJlZSk7CisJCWtmcmVlKGxlX2ZyZWUpOwogCiAJcmV0dXJuIGxlOwogfQpAQCAtMjI3LDcgKzIwNiw3IEBACiAgKi8KIHN0YXRpYyBpbnQgbGViX3JlYWRfbG9jayhzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgdm9sX2lkLCBpbnQgbG51bSkKIHsKLQlzdHJ1Y3QgbHRyZWVfZW50cnkgKmxlOworCXN0cnVjdCB1YmlfbHRyZWVfZW50cnkgKmxlOwogCiAJbGUgPSBsdHJlZV9hZGRfZW50cnkodWJpLCB2b2xfaWQsIGxudW0pOwogCWlmIChJU19FUlIobGUpKQpAQCAtMjQ1LDcgKzIyNCw3IEBACiBzdGF0aWMgdm9pZCBsZWJfcmVhZF91bmxvY2soc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHZvbF9pZCwgaW50IGxudW0pCiB7CiAJaW50IGZyZWUgPSAwOwotCXN0cnVjdCBsdHJlZV9lbnRyeSAqbGU7CisJc3RydWN0IHViaV9sdHJlZV9lbnRyeSAqbGU7CiAKIAlzcGluX2xvY2soJnViaS0+bHRyZWVfbG9jayk7CiAJbGUgPSBsdHJlZV9sb29rdXAodWJpLCB2b2xfaWQsIGxudW0pOwpAQCAtMjU5LDcgKzIzOCw3IEBACiAKIAl1cF9yZWFkKCZsZS0+bXV0ZXgpOwogCWlmIChmcmVlKQotCQlrbWVtX2NhY2hlX2ZyZWUobHRyZWVfc2xhYiwgbGUpOworCQlrZnJlZShsZSk7CiB9CiAKIC8qKgpAQCAtMjczLDcgKzI1Miw3IEBACiAgKi8KIHN0YXRpYyBpbnQgbGViX3dyaXRlX2xvY2soc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHZvbF9pZCwgaW50IGxudW0pCiB7Ci0Jc3RydWN0IGx0cmVlX2VudHJ5ICpsZTsKKwlzdHJ1Y3QgdWJpX2x0cmVlX2VudHJ5ICpsZTsKIAogCWxlID0gbHRyZWVfYWRkX2VudHJ5KHViaSwgdm9sX2lkLCBsbnVtKTsKIAlpZiAoSVNfRVJSKGxlKSkKQEAgLTI4Myw2ICsyNjIsNDQgQEAKIH0KIAogLyoqCisgKiBsZWJfd3JpdGVfbG9jayAtIGxvY2sgbG9naWNhbCBlcmFzZWJsb2NrIGZvciB3cml0aW5nLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEB2b2xfaWQ6IHZvbHVtZSBJRAorICogQGxudW06IGxvZ2ljYWwgZXJhc2VibG9jayBudW1iZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGxvY2tzIGEgbG9naWNhbCBlcmFzZWJsb2NrIGZvciB3cml0aW5nIGlmIHRoZXJlIGlzIG5vCisgKiBjb250ZW50aW9uIGFuZCBkb2VzIG5vdGhpbmcgaWYgdGhlcmUgaXMgY29udGVudGlvbi4gUmV0dXJucyAlMCBpbiBjYXNlIG9mCisgKiBzdWNjZXNzLCAlMSBpbiBjYXNlIG9mIGNvbnRlbnRpb24sIGFuZCBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YKKyAqIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgbGViX3dyaXRlX3RyeWxvY2soc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHZvbF9pZCwgaW50IGxudW0pCit7CisJaW50IGZyZWU7CisJc3RydWN0IHViaV9sdHJlZV9lbnRyeSAqbGU7CisKKwlsZSA9IGx0cmVlX2FkZF9lbnRyeSh1YmksIHZvbF9pZCwgbG51bSk7CisJaWYgKElTX0VSUihsZSkpCisJCXJldHVybiBQVFJfRVJSKGxlKTsKKwlpZiAoZG93bl93cml0ZV90cnlsb2NrKCZsZS0+bXV0ZXgpKQorCQlyZXR1cm4gMDsKKworCS8qIENvbnRlbnRpb24sIGNhbmNlbCAqLworCXNwaW5fbG9jaygmdWJpLT5sdHJlZV9sb2NrKTsKKwlsZS0+dXNlcnMgLT0gMTsKKwl1YmlfYXNzZXJ0KGxlLT51c2VycyA+PSAwKTsKKwlpZiAobGUtPnVzZXJzID09IDApIHsKKwkJcmJfZXJhc2UoJmxlLT5yYiwgJnViaS0+bHRyZWUpOworCQlmcmVlID0gMTsKKwl9IGVsc2UKKwkJZnJlZSA9IDA7CisJc3Bpbl91bmxvY2soJnViaS0+bHRyZWVfbG9jayk7CisJaWYgKGZyZWUpCisJCWtmcmVlKGxlKTsKKworCXJldHVybiAxOworfQorCisvKioKICAqIGxlYl93cml0ZV91bmxvY2sgLSB1bmxvY2sgbG9naWNhbCBlcmFzZWJsb2NrLgogICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKICAqIEB2b2xfaWQ6IHZvbHVtZSBJRApAQCAtMjkxLDcgKzMwOCw3IEBACiBzdGF0aWMgdm9pZCBsZWJfd3JpdGVfdW5sb2NrKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCB2b2xfaWQsIGludCBsbnVtKQogewogCWludCBmcmVlOwotCXN0cnVjdCBsdHJlZV9lbnRyeSAqbGU7CisJc3RydWN0IHViaV9sdHJlZV9lbnRyeSAqbGU7CiAKIAlzcGluX2xvY2soJnViaS0+bHRyZWVfbG9jayk7CiAJbGUgPSBsdHJlZV9sb29rdXAodWJpLCB2b2xfaWQsIGxudW0pOwpAQCAtMzA2LDIzICszMjMsMjMgQEAKIAogCXVwX3dyaXRlKCZsZS0+bXV0ZXgpOwogCWlmIChmcmVlKQotCQlrbWVtX2NhY2hlX2ZyZWUobHRyZWVfc2xhYiwgbGUpOworCQlrZnJlZShsZSk7CiB9CiAKIC8qKgogICogdWJpX2ViYV91bm1hcF9sZWIgLSB1bi1tYXAgbG9naWNhbCBlcmFzZWJsb2NrLgogICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKLSAqIEB2b2xfaWQ6IHZvbHVtZSBJRAorICogQHZvbDogdm9sdW1lIGRlc2NyaXB0aW9uIG9iamVjdAogICogQGxudW06IGxvZ2ljYWwgZXJhc2VibG9jayBudW1iZXIKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHVuLW1hcHMgbG9naWNhbCBlcmFzZWJsb2NrIEBsbnVtIGFuZCBzY2hlZHVsZXMgY29ycmVzcG9uZGluZwogICogcGh5c2ljYWwgZXJhc2VibG9jayBmb3IgZXJhc3VyZS4gUmV0dXJucyB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYQogICogbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUuCiAgKi8KLWludCB1YmlfZWJhX3VubWFwX2xlYihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgdm9sX2lkLCBpbnQgbG51bSkKK2ludCB1YmlfZWJhX3VubWFwX2xlYihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sLAorCQkgICAgICBpbnQgbG51bSkKIHsKLQlpbnQgaWR4ID0gdm9sX2lkMmlkeCh1YmksIHZvbF9pZCksIGVyciwgcG51bTsKLQlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sID0gdWJpLT52b2x1bWVzW2lkeF07CisJaW50IGVyciwgcG51bSwgdm9sX2lkID0gdm9sLT52b2xfaWQ7CiAKIAlpZiAodWJpLT5yb19tb2RlKQogCQlyZXR1cm4gLUVST0ZTOwpAQCAtMzQ5LDcgKzM2Niw3IEBACiAvKioKICAqIHViaV9lYmFfcmVhZF9sZWIgLSByZWFkIGRhdGEuCiAgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAotICogQHZvbF9pZDogdm9sdW1lIElECisgKiBAdm9sOiB2b2x1bWUgZGVzY3JpcHRpb24gb2JqZWN0CiAgKiBAbG51bTogbG9naWNhbCBlcmFzZWJsb2NrIG51bWJlcgogICogQGJ1ZjogYnVmZmVyIHRvIHN0b3JlIHRoZSByZWFkIGRhdGEKICAqIEBvZmZzZXQ6IG9mZnNldCBmcm9tIHdoZXJlIHRvIHJlYWQKQEAgLTM2NSwxMiArMzgyLDExIEBACiAgKiByZXR1cm5lZCBmb3IgYW55IHZvbHVtZSB0eXBlIGlmIGFuIEVDQyBlcnJvciB3YXMgZGV0ZWN0ZWQgYnkgdGhlIE1URCBkZXZpY2UKICAqIGRyaXZlci4gT3RoZXIgbmVnYXRpdmUgZXJyb3IgY29yZWQgbWF5IGJlIHJldHVybmVkIGluIGNhc2Ugb2Ygb3RoZXIgZXJyb3JzLgogICovCi1pbnQgdWJpX2ViYV9yZWFkX2xlYihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgdm9sX2lkLCBpbnQgbG51bSwgdm9pZCAqYnVmLAotCQkgICAgIGludCBvZmZzZXQsIGludCBsZW4sIGludCBjaGVjaykKK2ludCB1YmlfZWJhX3JlYWRfbGViKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIHN0cnVjdCB1Ymlfdm9sdW1lICp2b2wsIGludCBsbnVtLAorCQkgICAgIHZvaWQgKmJ1ZiwgaW50IG9mZnNldCwgaW50IGxlbiwgaW50IGNoZWNrKQogewotCWludCBlcnIsIHBudW0sIHNjcnViID0gMCwgaWR4ID0gdm9sX2lkMmlkeCh1YmksIHZvbF9pZCk7CisJaW50IGVyciwgcG51bSwgc2NydWIgPSAwLCB2b2xfaWQgPSB2b2wtPnZvbF9pZDsKIAlzdHJ1Y3QgdWJpX3ZpZF9oZHIgKnZpZF9oZHI7Ci0Jc3RydWN0IHViaV92b2x1bWUgKnZvbCA9IHViaS0+dm9sdW1lc1tpZHhdOwogCXVpbnQzMl90IHVuaW5pdGlhbGl6ZWRfdmFyKGNyYyk7CiAKIAllcnIgPSBsZWJfcmVhZF9sb2NrKHViaSwgdm9sX2lkLCBsbnVtKTsKQEAgLTU3OCw3ICs1OTQsNyBAQAogLyoqCiAgKiB1YmlfZWJhX3dyaXRlX2xlYiAtIHdyaXRlIGRhdGEgdG8gZHluYW1pYyB2b2x1bWUuCiAgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAotICogQHZvbF9pZDogdm9sdW1lIElECisgKiBAdm9sOiB2b2x1bWUgZGVzY3JpcHRpb24gb2JqZWN0CiAgKiBAbG51bTogbG9naWNhbCBlcmFzZWJsb2NrIG51bWJlcgogICogQGJ1ZjogdGhlIGRhdGEgdG8gd3JpdGUKICAqIEBvZmZzZXQ6IG9mZnNldCB3aXRoaW4gdGhlIGxvZ2ljYWwgZXJhc2VibG9jayB3aGVyZSB0byB3cml0ZQpAQCAtNTg2LDE1ICs2MDIsMTQgQEAKICAqIEBkdHlwZTogZGF0YSB0eXBlCiAgKgogICogVGhpcyBmdW5jdGlvbiB3cml0ZXMgZGF0YSB0byBsb2dpY2FsIGVyYXNlYmxvY2sgQGxudW0gb2YgYSBkeW5hbWljIHZvbHVtZQotICogQHZvbF9pZC4gUmV0dXJucyB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2UKKyAqIEB2b2wuIFJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlCiAgKiBvZiBmYWlsdXJlLiBJbiBjYXNlIG9mIGVycm9yLCBpdCBpcyBwb3NzaWJsZSB0aGF0IHNvbWV0aGluZyB3YXMgc3RpbGwKICAqIHdyaXR0ZW4gdG8gdGhlIGZsYXNoIG1lZGlhLCBidXQgbWF5IGJlIHNvbWUgZ2FyYmFnZS4KICAqLwotaW50IHViaV9lYmFfd3JpdGVfbGViKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCB2b2xfaWQsIGludCBsbnVtLAoraW50IHViaV9lYmFfd3JpdGVfbGViKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIHN0cnVjdCB1Ymlfdm9sdW1lICp2b2wsIGludCBsbnVtLAogCQkgICAgICBjb25zdCB2b2lkICpidWYsIGludCBvZmZzZXQsIGludCBsZW4sIGludCBkdHlwZSkKIHsKLQlpbnQgaWR4ID0gdm9sX2lkMmlkeCh1YmksIHZvbF9pZCksIGVyciwgcG51bSwgdHJpZXMgPSAwOwotCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2wgPSB1YmktPnZvbHVtZXNbaWR4XTsKKwlpbnQgZXJyLCBwbnVtLCB0cmllcyA9IDAsIHZvbF9pZCA9IHZvbC0+dm9sX2lkOwogCXN0cnVjdCB1YmlfdmlkX2hkciAqdmlkX2hkcjsKIAogCWlmICh1YmktPnJvX21vZGUpCkBAIC02MTMsNyArNjI4LDggQEAKIAkJaWYgKGVycikgewogCQkJdWJpX3dhcm4oImZhaWxlZCB0byB3cml0ZSBkYXRhIHRvIFBFQiAlZCIsIHBudW0pOwogCQkJaWYgKGVyciA9PSAtRUlPICYmIHViaS0+YmFkX2FsbG93ZWQpCi0JCQkJZXJyID0gcmVjb3Zlcl9wZWIodWJpLCBwbnVtLCB2b2xfaWQsIGxudW0sIGJ1Ziwgb2Zmc2V0LCBsZW4pOworCQkJCWVyciA9IHJlY292ZXJfcGViKHViaSwgcG51bSwgdm9sX2lkLCBsbnVtLCBidWYsCisJCQkJCQkgIG9mZnNldCwgbGVuKTsKIAkJCWlmIChlcnIpCiAJCQkJdWJpX3JvX21vZGUodWJpKTsKIAkJfQpAQCAtNjU2LDExICs2NzIsMTQgQEAKIAkJZ290byB3cml0ZV9lcnJvcjsKIAl9CiAKLQllcnIgPSB1YmlfaW9fd3JpdGVfZGF0YSh1YmksIGJ1ZiwgcG51bSwgb2Zmc2V0LCBsZW4pOwotCWlmIChlcnIpIHsKLQkJdWJpX3dhcm4oImZhaWxlZCB0byB3cml0ZSAlZCBieXRlcyBhdCBvZmZzZXQgJWQgb2YgTEVCICVkOiVkLCAiCi0JCQkgIlBFQiAlZCIsIGxlbiwgb2Zmc2V0LCB2b2xfaWQsIGxudW0sIHBudW0pOwotCQlnb3RvIHdyaXRlX2Vycm9yOworCWlmIChsZW4pIHsKKwkJZXJyID0gdWJpX2lvX3dyaXRlX2RhdGEodWJpLCBidWYsIHBudW0sIG9mZnNldCwgbGVuKTsKKwkJaWYgKGVycikgeworCQkJdWJpX3dhcm4oImZhaWxlZCB0byB3cml0ZSAlZCBieXRlcyBhdCBvZmZzZXQgJWQgb2YgIgorCQkJCSAiTEVCICVkOiVkLCBQRUIgJWQiLCBsZW4sIG9mZnNldCwgdm9sX2lkLAorCQkJCSBsbnVtLCBwbnVtKTsKKwkJCWdvdG8gd3JpdGVfZXJyb3I7CisJCX0KIAl9CiAKIAl2b2wtPmViYV90YmxbbG51bV0gPSBwbnVtOwpAQCAtNjk4LDcgKzcxNyw3IEBACiAvKioKICAqIHViaV9lYmFfd3JpdGVfbGViX3N0IC0gd3JpdGUgZGF0YSB0byBzdGF0aWMgdm9sdW1lLgogICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKLSAqIEB2b2xfaWQ6IHZvbHVtZSBJRAorICogQHZvbDogdm9sdW1lIGRlc2NyaXB0aW9uIG9iamVjdAogICogQGxudW06IGxvZ2ljYWwgZXJhc2VibG9jayBudW1iZXIKICAqIEBidWY6IGRhdGEgdG8gd3JpdGUKICAqIEBsZW46IGhvdyBtYW55IGJ5dGVzIHRvIHdyaXRlCkBAIC03MDYsNyArNzI1LDcgQEAKICAqIEB1c2VkX2ViczogaG93IG1hbnkgbG9naWNhbCBlcmFzZWJsb2NrcyB3aWxsIHRoaXMgdm9sdW1lIGNvbnRhaW4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBkYXRhIHRvIGxvZ2ljYWwgZXJhc2VibG9jayBAbG51bSBvZiBzdGF0aWMgdm9sdW1lCi0gKiBAdm9sX2lkLiBUaGUgQHVzZWRfZWJzIGFyZ3VtZW50IHNob3VsZCBjb250YWluIHRvdGFsIG51bWJlciBvZiBsb2dpY2FsCisgKiBAdm9sLiBUaGUgQHVzZWRfZWJzIGFyZ3VtZW50IHNob3VsZCBjb250YWluIHRvdGFsIG51bWJlciBvZiBsb2dpY2FsCiAgKiBlcmFzZWJsb2NrIGluIHRoaXMgc3RhdGljIHZvbHVtZS4KICAqCiAgKiBXaGVuIHdyaXRpbmcgdG8gdGhlIGxhc3QgbG9naWNhbCBlcmFzZWJsb2NrLCB0aGUgQGxlbiBhcmd1bWVudCBkb2Vzbid0IGhhdmUKQEAgLTcxOCwxMiArNzM3LDExIEBACiAgKiB2b2x1bWVzLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IKICAqIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlLgogICovCi1pbnQgdWJpX2ViYV93cml0ZV9sZWJfc3Qoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHZvbF9pZCwgaW50IGxudW0sCi0JCQkgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuLCBpbnQgZHR5cGUsIGludCB1c2VkX2VicykKK2ludCB1YmlfZWJhX3dyaXRlX2xlYl9zdChzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sLAorCQkJIGludCBsbnVtLCBjb25zdCB2b2lkICpidWYsIGludCBsZW4sIGludCBkdHlwZSwKKwkJCSBpbnQgdXNlZF9lYnMpCiB7Ci0JaW50IGVyciwgcG51bSwgdHJpZXMgPSAwLCBkYXRhX3NpemUgPSBsZW47Ci0JaW50IGlkeCA9IHZvbF9pZDJpZHgodWJpLCB2b2xfaWQpOwotCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2wgPSB1YmktPnZvbHVtZXNbaWR4XTsKKwlpbnQgZXJyLCBwbnVtLCB0cmllcyA9IDAsIGRhdGFfc2l6ZSA9IGxlbiwgdm9sX2lkID0gdm9sLT52b2xfaWQ7CiAJc3RydWN0IHViaV92aWRfaGRyICp2aWRfaGRyOwogCXVpbnQzMl90IGNyYzsKIApAQCAtODE5LDcgKzgzNyw3IEBACiAvKgogICogdWJpX2ViYV9hdG9taWNfbGViX2NoYW5nZSAtIGNoYW5nZSBsb2dpY2FsIGVyYXNlYmxvY2sgYXRvbWljYWxseS4KICAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0Ci0gKiBAdm9sX2lkOiB2b2x1bWUgSUQKKyAqIEB2b2w6IHZvbHVtZSBkZXNjcmlwdGlvbiBvYmplY3QKICAqIEBsbnVtOiBsb2dpY2FsIGVyYXNlYmxvY2sgbnVtYmVyCiAgKiBAYnVmOiBkYXRhIHRvIHdyaXRlCiAgKiBAbGVuOiBob3cgbWFueSBieXRlcyB0byB3cml0ZQpAQCAtODM0LDE3ICs4NTIsMjcgQEAKICAqIFVCSSByZXNlcnZlcyBvbmUgTEVCIGZvciB0aGUgImF0b21pYyBMRUIgY2hhbmdlIiBvcGVyYXRpb24sIHNvIG9ubHkgb25lCiAgKiBMRUIgY2hhbmdlIG1heSBiZSBkb25lIGF0IGEgdGltZS4gVGhpcyBpcyBlbnN1cmVkIGJ5IEB1YmktPmFsY19tdXRleC4KICAqLwotaW50IHViaV9lYmFfYXRvbWljX2xlYl9jaGFuZ2Uoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHZvbF9pZCwgaW50IGxudW0sCi0JCQkgICAgICBjb25zdCB2b2lkICpidWYsIGludCBsZW4sIGludCBkdHlwZSkKK2ludCB1YmlfZWJhX2F0b21pY19sZWJfY2hhbmdlKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIHN0cnVjdCB1Ymlfdm9sdW1lICp2b2wsCisJCQkgICAgICBpbnQgbG51bSwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuLCBpbnQgZHR5cGUpCiB7Ci0JaW50IGVyciwgcG51bSwgdHJpZXMgPSAwLCBpZHggPSB2b2xfaWQyaWR4KHViaSwgdm9sX2lkKTsKLQlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sID0gdWJpLT52b2x1bWVzW2lkeF07CisJaW50IGVyciwgcG51bSwgdHJpZXMgPSAwLCB2b2xfaWQgPSB2b2wtPnZvbF9pZDsKIAlzdHJ1Y3QgdWJpX3ZpZF9oZHIgKnZpZF9oZHI7CiAJdWludDMyX3QgY3JjOwogCiAJaWYgKHViaS0+cm9fbW9kZSkKIAkJcmV0dXJuIC1FUk9GUzsKIAorCWlmIChsZW4gPT0gMCkgeworCQkvKgorCQkgKiBTcGVjaWFsIGNhc2Ugd2hlbiBkYXRhIGxlbmd0aCBpcyB6ZXJvLiBJbiB0aGlzIGNhc2UgdGhlIExFQgorCQkgKiBoYXMgdG8gYmUgdW5tYXBwZWQgYW5kIG1hcHBlZCBzb21ld2hlcmUgZWxzZS4KKwkJICovCisJCWVyciA9IHViaV9lYmFfdW5tYXBfbGViKHViaSwgdm9sLCBsbnVtKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCXJldHVybiB1YmlfZWJhX3dyaXRlX2xlYih1YmksIHZvbCwgbG51bSwgTlVMTCwgMCwgMCwgZHR5cGUpOworCX0KKwogCXZpZF9oZHIgPSB1YmlfemFsbG9jX3ZpZF9oZHIodWJpLCBHRlBfTk9GUyk7CiAJaWYgKCF2aWRfaGRyKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTkyOCwyMCArOTU2LDYgQEAKIH0KIAogLyoqCi0gKiBsdHJlZV9lbnRyeV9jdG9yIC0gbG9jayB0cmVlIGVudHJpZXMgc2xhYiBjYWNoZSBjb25zdHJ1Y3Rvci4KLSAqIEBvYmo6IHRoZSBsb2NrLXRyZWUgZW50cnkgdG8gY29uc3RydWN0Ci0gKiBAY2FjaGU6IHRoZSBsb2NrIHRyZWUgZW50cnkgc2xhYiBjYWNoZQotICogQGZsYWdzOiBjb25zdHJ1Y3RvciBmbGFncwotICovCi1zdGF0aWMgdm9pZCBsdHJlZV9lbnRyeV9jdG9yKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZSwgdm9pZCAqb2JqKQotewotCXN0cnVjdCBsdHJlZV9lbnRyeSAqbGUgPSBvYmo7Ci0KLQlsZS0+dXNlcnMgPSAwOwotCWluaXRfcndzZW0oJmxlLT5tdXRleCk7Ci19Ci0KLS8qKgogICogdWJpX2ViYV9jb3B5X2xlYiAtIGNvcHkgbG9naWNhbCBlcmFzZWJsb2NrLgogICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKICAqIEBmcm9tOiBwaHlzaWNhbCBlcmFzZWJsb2NrIG51bWJlciBmcm9tIHdoZXJlIHRvIGNvcHkKQEAgLTk1MCwxNCArOTY0LDE2IEBACiAgKgogICogVGhpcyBmdW5jdGlvbiBjb3BpZXMgbG9naWNhbCBlcmFzZWJsb2NrIGZyb20gcGh5c2ljYWwgZXJhc2VibG9jayBAZnJvbSB0bwogICogcGh5c2ljYWwgZXJhc2VibG9jayBAdG8uIFRoZSBAdmlkX2hkciBidWZmZXIgbWF5IGJlIGNoYW5nZWQgYnkgdGhpcwotICogZnVuY3Rpb24uIFJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MsICVVQklfSU9fQklURkxJUFMgaWYgdGhlIG9wZXJhdGlvbgotICogd2FzIGNhbmNlbGVkIGJlY2F1c2UgYml0LWZsaXBzIHdlcmUgZGV0ZWN0ZWQgYXQgdGhlIHRhcmdldCBQRUIsIGFuZCBhCi0gKiBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqIGZ1bmN0aW9uLiBSZXR1cm5zOgorICogICBvICUwICBpbiBjYXNlIG9mIHN1Y2Nlc3M7CisgKiAgIG8gJTEgaWYgdGhlIG9wZXJhdGlvbiB3YXMgY2FuY2VsZWQgYW5kIHNob3VsZCBiZSB0cmllZCBsYXRlciAoZS5nLiwKKyAqICAgICBiZWNhdXNlIGEgYml0LWZsaXAgd2FzIGRldGVjdGVkIGF0IHRoZSB0YXJnZXQgUEVCKTsKKyAqICAgbyAlMiBpZiB0aGUgdm9sdW1lIGlzIGJlaW5nIGRlbGV0ZWQgYW5kIHRoaXMgTEVCIHNob3VsZCBub3QgYmUgbW92ZWQuCiAgKi8KIGludCB1YmlfZWJhX2NvcHlfbGViKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBmcm9tLCBpbnQgdG8sCiAJCSAgICAgc3RydWN0IHViaV92aWRfaGRyICp2aWRfaGRyKQogewotCWludCBlcnIsIHZvbF9pZCwgbG51bSwgZGF0YV9zaXplLCBhbGRhdGFfc2l6ZSwgcG51bSwgaWR4OworCWludCBlcnIsIHZvbF9pZCwgbG51bSwgZGF0YV9zaXplLCBhbGRhdGFfc2l6ZSwgaWR4OwogCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2w7CiAJdWludDMyX3QgY3JjOwogCkBAIC05NzMsNTEgKzk4OSw2NyBAQAogCQlkYXRhX3NpemUgPSBhbGRhdGFfc2l6ZSA9CiAJCQkgICAgdWJpLT5sZWJfc2l6ZSAtIGJlMzJfdG9fY3B1KHZpZF9oZHItPmRhdGFfcGFkKTsKIAotCS8qCi0JICogV2UgZG8gbm90IHdhbnQgYW55Ym9keSB0byB3cml0ZSB0byB0aGlzIGxvZ2ljYWwgZXJhc2VibG9jayB3aGlsZSB3ZQotCSAqIGFyZSBtb3ZpbmcgaXQsIHNvIHdlIGxvY2sgaXQuCi0JICovCi0JZXJyID0gbGViX3dyaXRlX2xvY2sodWJpLCB2b2xfaWQsIGxudW0pOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQltdXRleF9sb2NrKCZ1YmktPmJ1Zl9tdXRleCk7Ci0KLQkvKgotCSAqIEJ1dCB0aGUgbG9naWNhbCBlcmFzZWJsb2NrIG1pZ2h0IGhhdmUgYmVlbiBwdXQgYnkgdGhpcyB0aW1lLgotCSAqIENhbmNlbCBpZiBpdCBpcyB0cnVlLgotCSAqLwogCWlkeCA9IHZvbF9pZDJpZHgodWJpLCB2b2xfaWQpOwotCi0JLyoKLQkgKiBXZSBtYXkgcmFjZSB3aXRoIHZvbHVtZSBkZWxldGlvbi9yZS1zaXplLCBzbyB3ZSBoYXZlIHRvIGhvbGQKLQkgKiBAdWJpLT52b2x1bWVzX2xvY2suCi0JICovCiAJc3Bpbl9sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7CisJLyoKKwkgKiBOb3RlLCB3ZSBtYXkgcmFjZSB3aXRoIHZvbHVtZSBkZWxldGlvbiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdm9sdW1lCisJICogdGhpcyBsb2dpY2FsIGVyYXNlYmxvY2sgYmVsb25ncyB0byBtaWdodCBiZSBiZWluZyBkZWxldGVkLiBTaW5jZSB0aGUKKwkgKiB2b2x1bWUgZGVsZXRpb24gdW5tYXBzIGFsbCB0aGUgdm9sdW1lJ3MgbG9naWNhbCBlcmFzZWJsb2NrcywgaXQgd2lsbAorCSAqIGJlIGxvY2tlZCBpbiAndWJpX3dsX3B1dF9wZWIoKScgYW5kIHdhaXQgZm9yIHRoZSBXTCB3b3JrZXIgdG8gZmluaXNoLgorCSAqLwogCXZvbCA9IHViaS0+dm9sdW1lc1tpZHhdOwogCWlmICghdm9sKSB7Ci0JCWRiZ19lYmEoInZvbHVtZSAlZCB3YXMgcmVtb3ZlZCBtZWFud2hpbGUiLCB2b2xfaWQpOworCQkvKiBObyBuZWVkIHRvIGRvIGZ1cnRoZXIgd29yaywgY2FuY2VsICovCisJCWRiZ19lYmEoInZvbHVtZSAlZCBpcyBiZWluZyByZW1vdmVkLCBjYW5jZWwiLCB2b2xfaWQpOwogCQlzcGluX3VubG9jaygmdWJpLT52b2x1bWVzX2xvY2spOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0JcG51bSA9IHZvbC0+ZWJhX3RibFtsbnVtXTsKLQlpZiAocG51bSAhPSBmcm9tKSB7Ci0JCWRiZ19lYmEoIkxFQiAlZDolZCBpcyBubyBsb25nZXIgbWFwcGVkIHRvIFBFQiAlZCwgbWFwcGVkIHRvICIKLQkJCSJQRUIgJWQsIGNhbmNlbCIsIHZvbF9pZCwgbG51bSwgZnJvbSwgcG51bSk7Ci0JCXNwaW5fdW5sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7Ci0JCWdvdG8gb3V0X3VubG9jazsKKwkJcmV0dXJuIDI7CiAJfQogCXNwaW5fdW5sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7CiAKLQkvKiBPSywgbm93IHRoZSBMRUIgaXMgbG9ja2VkIGFuZCB3ZSBjYW4gc2FmZWx5IHN0YXJ0IG1vdmluZyBpdCAqLworCS8qCisJICogV2UgZG8gbm90IHdhbnQgYW55Ym9keSB0byB3cml0ZSB0byB0aGlzIGxvZ2ljYWwgZXJhc2VibG9jayB3aGlsZSB3ZQorCSAqIGFyZSBtb3ZpbmcgaXQsIHNvIGxvY2sgaXQuCisJICoKKwkgKiBOb3RlLCB3ZSBhcmUgdXNpbmcgbm9uLXdhaXRpbmcgbG9ja2luZyBoZXJlLCBiZWNhdXNlIHdlIGNhbm5vdCBzbGVlcAorCSAqIG9uIHRoZSBMRUIsIHNpbmNlIGl0IG1heSBjYXVzZSBkZWFkbG9ja3MuIEluZGVlZCwgaW1hZ2luZSBhIHRhc2sgaXMKKwkgKiB1bm1hcHBpbmcgdGhlIExFQiB3aGljaCBpcyBtYXBwZWQgdG8gdGhlIFBFQiB3ZSBhcmUgZ29pbmcgdG8gbW92ZQorCSAqIChAZnJvbSkuIFRoaXMgdGFzayBsb2NrcyB0aGUgTEVCIGFuZCBnb2VzIHNsZWVwIGluIHRoZQorCSAqICd1Ymlfd2xfcHV0X3BlYigpJyBmdW5jdGlvbiBvbiB0aGUgQHViaS0+bW92ZV9tdXRleC4gSW4gdHVybiwgd2UgYXJlCisJICogaG9sZGluZyBAdWJpLT5tb3ZlX211dGV4IGFuZCBnbyBzbGVlcCBvbiB0aGUgTEVCIGxvY2suIFNvLCBpZiB0aGUKKwkgKiBMRUIgaXMgYWxyZWFkeSBsb2NrZWQsIHdlIGp1c3QgZG8gbm90IG1vdmUgaXQgYW5kIHJldHVybiAlMS4KKwkgKi8KKwllcnIgPSBsZWJfd3JpdGVfdHJ5bG9jayh1YmksIHZvbF9pZCwgbG51bSk7CisJaWYgKGVycikgeworCQlkYmdfZWJhKCJjb250ZW50aW9uIG9uIExFQiAlZDolZCwgY2FuY2VsIiwgdm9sX2lkLCBsbnVtKTsKKwkJcmV0dXJuIGVycjsKKwl9CiAKKwkvKgorCSAqIFRoZSBMRUIgbWlnaHQgaGF2ZSBiZWVuIHB1dCBtZWFud2hpbGUsIGFuZCB0aGUgdGFzayB3aGljaCBwdXQgaXQgaXMKKwkgKiBwcm9iYWJseSB3YWl0aW5nIG9uIEB1YmktPm1vdmVfbXV0ZXguIE5vIG5lZWQgdG8gY29udGludWUgdGhlIHdvcmssCisJICogY2FuY2VsIGl0LgorCSAqLworCWlmICh2b2wtPmViYV90YmxbbG51bV0gIT0gZnJvbSkgeworCQlkYmdfZWJhKCJMRUIgJWQ6JWQgaXMgbm8gbG9uZ2VyIG1hcHBlZCB0byBQRUIgJWQsIG1hcHBlZCB0byAiCisJCQkiUEVCICVkLCBjYW5jZWwiLCB2b2xfaWQsIGxudW0sIGZyb20sCisJCQl2b2wtPmViYV90YmxbbG51bV0pOworCQllcnIgPSAxOworCQlnb3RvIG91dF91bmxvY2tfbGViOworCX0KKworCS8qCisJICogT0ssIG5vdyB0aGUgTEVCIGlzIGxvY2tlZCBhbmQgd2UgY2FuIHNhZmVseSBzdGFydCBtb3ZpbmcgaXkuIFNpbmNlCisJICogdGhpcyBmdW5jdGlvbiB1dGlsaXplcyB0aGllIEB1YmktPnBlYjFfYnVmIGJ1ZmZlciB3aGljaCBpcyBzaGFyZWQKKwkgKiB3aXRoIHNvbWUgb3RoZXIgZnVuY3Rpb25zLCBzbyBsb2NrIHRoZSBidWZmZXIgYnkgdGFraW5nIHRoZQorCSAqIEB1YmktPmJ1Zl9tdXRleC4KKwkgKi8KKwltdXRleF9sb2NrKCZ1YmktPmJ1Zl9tdXRleCk7CiAJZGJnX2ViYSgicmVhZCAlZCBieXRlcyBvZiBkYXRhIiwgYWxkYXRhX3NpemUpOwogCWVyciA9IHViaV9pb19yZWFkX2RhdGEodWJpLCB1YmktPnBlYl9idWYxLCBmcm9tLCAwLCBhbGRhdGFfc2l6ZSk7CiAJaWYgKGVyciAmJiBlcnIgIT0gVUJJX0lPX0JJVEZMSVBTKSB7CiAJCXViaV93YXJuKCJlcnJvciAlZCB3aGlsZSByZWFkaW5nIGRhdGEgZnJvbSBQRUIgJWQiLAogCQkJIGVyciwgZnJvbSk7Ci0JCWdvdG8gb3V0X3VubG9jazsKKwkJZ290byBvdXRfdW5sb2NrX2J1ZjsKIAl9CiAKIAkvKgpAQCAtMTA1Myw3ICsxMDg1LDcgQEAKIAogCWVyciA9IHViaV9pb193cml0ZV92aWRfaGRyKHViaSwgdG8sIHZpZF9oZHIpOwogCWlmIChlcnIpCi0JCWdvdG8gb3V0X3VubG9jazsKKwkJZ290byBvdXRfdW5sb2NrX2J1ZjsKIAogCWNvbmRfcmVzY2hlZCgpOwogCkBAIC0xMDYyLDEzICsxMDk0LDE1IEBACiAJaWYgKGVycikgewogCQlpZiAoZXJyICE9IFVCSV9JT19CSVRGTElQUykKIAkJCXViaV93YXJuKCJjYW5ub3QgcmVhZCBWSUQgaGVhZGVyIGJhY2sgZnJvbSBQRUIgJWQiLCB0byk7Ci0JCWdvdG8gb3V0X3VubG9jazsKKwkJZWxzZQorCQkJZXJyID0gMTsKKwkJZ290byBvdXRfdW5sb2NrX2J1ZjsKIAl9CiAKIAlpZiAoZGF0YV9zaXplID4gMCkgewogCQllcnIgPSB1YmlfaW9fd3JpdGVfZGF0YSh1YmksIHViaS0+cGViX2J1ZjEsIHRvLCAwLCBhbGRhdGFfc2l6ZSk7CiAJCWlmIChlcnIpCi0JCQlnb3RvIG91dF91bmxvY2s7CisJCQlnb3RvIG91dF91bmxvY2tfYnVmOwogCiAJCWNvbmRfcmVzY2hlZCgpOwogCkBAIC0xMDgyLDcgKzExMTYsOSBAQAogCQkJaWYgKGVyciAhPSBVQklfSU9fQklURkxJUFMpCiAJCQkJdWJpX3dhcm4oImNhbm5vdCByZWFkIGRhdGEgYmFjayBmcm9tIFBFQiAlZCIsCiAJCQkJCSB0byk7Ci0JCQlnb3RvIG91dF91bmxvY2s7CisJCQllbHNlCisJCQkJZXJyID0gMTsKKwkJCWdvdG8gb3V0X3VubG9ja19idWY7CiAJCX0KIAogCQljb25kX3Jlc2NoZWQoKTsKQEAgLTEwOTAsMTUgKzExMjYsMTYgQEAKIAkJaWYgKG1lbWNtcCh1YmktPnBlYl9idWYxLCB1YmktPnBlYl9idWYyLCBhbGRhdGFfc2l6ZSkpIHsKIAkJCXViaV93YXJuKCJyZWFkIGRhdGEgYmFjayBmcm9tIFBFQiAlZCAtIGl0IGlzIGRpZmZlcmVudCIsCiAJCQkJIHRvKTsKLQkJCWdvdG8gb3V0X3VubG9jazsKKwkJCWdvdG8gb3V0X3VubG9ja19idWY7CiAJCX0KIAl9CiAKIAl1YmlfYXNzZXJ0KHZvbC0+ZWJhX3RibFtsbnVtXSA9PSBmcm9tKTsKIAl2b2wtPmViYV90YmxbbG51bV0gPSB0bzsKIAotb3V0X3VubG9jazoKK291dF91bmxvY2tfYnVmOgogCW11dGV4X3VubG9jaygmdWJpLT5idWZfbXV0ZXgpOworb3V0X3VubG9ja19sZWI6CiAJbGViX3dyaXRlX3VubG9jayh1YmksIHZvbF9pZCwgbG51bSk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTExMjUsMTQgKzExNjIsNiBAQAogCW11dGV4X2luaXQoJnViaS0+YWxjX211dGV4KTsKIAl1YmktPmx0cmVlID0gUkJfUk9PVDsKIAotCWlmICh1YmlfZGV2aWNlc19jbnQgPT0gMCkgewotCQlsdHJlZV9zbGFiID0ga21lbV9jYWNoZV9jcmVhdGUoInViaV9sdHJlZV9zbGFiIiwKLQkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbHRyZWVfZW50cnkpLCAwLAotCQkJCQkgICAgICAgMCwgJmx0cmVlX2VudHJ5X2N0b3IpOwotCQlpZiAoIWx0cmVlX3NsYWIpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KIAl1YmktPmdsb2JhbF9zcW51bSA9IHNpLT5tYXhfc3FudW0gKyAxOwogCW51bV92b2x1bWVzID0gdWJpLT52dGJsX3Nsb3RzICsgVUJJX0lOVF9WT0xfQ09VTlQ7CiAKQEAgLTExNjgsNiArMTE5NywxNSBAQAogCQl9CiAJfQogCisJaWYgKHViaS0+YXZhaWxfcGVicyA8IEVCQV9SRVNFUlZFRF9QRUJTKSB7CisJCXViaV9lcnIoIm5vIGVub3VnaCBwaHlzaWNhbCBlcmFzZWJsb2NrcyAoJWQsIG5lZWQgJWQpIiwKKwkJCXViaS0+YXZhaWxfcGVicywgRUJBX1JFU0VSVkVEX1BFQlMpOworCQllcnIgPSAtRU5PU1BDOworCQlnb3RvIG91dF9mcmVlOworCX0KKwl1YmktPmF2YWlsX3BlYnMgLT0gRUJBX1JFU0VSVkVEX1BFQlM7CisJdWJpLT5yc3ZkX3BlYnMgKz0gRUJBX1JFU0VSVkVEX1BFQlM7CisKIAlpZiAodWJpLT5iYWRfYWxsb3dlZCkgewogCQl1YmlfY2FsY3VsYXRlX3Jlc2VydmVkKHViaSk7CiAKQEAgLTExODQsMTUgKzEyMjIsNiBAQAogCQl1YmktPnJzdmRfcGVicyAgKz0gdWJpLT5iZWJfcnN2ZF9wZWJzOwogCX0KIAotCWlmICh1YmktPmF2YWlsX3BlYnMgPCBFQkFfUkVTRVJWRURfUEVCUykgewotCQl1YmlfZXJyKCJubyBlbm91Z2ggcGh5c2ljYWwgZXJhc2VibG9ja3MgKCVkLCBuZWVkICVkKSIsCi0JCQl1YmktPmF2YWlsX3BlYnMsIEVCQV9SRVNFUlZFRF9QRUJTKTsKLQkJZXJyID0gLUVOT1NQQzsKLQkJZ290byBvdXRfZnJlZTsKLQl9Ci0JdWJpLT5hdmFpbF9wZWJzIC09IEVCQV9SRVNFUlZFRF9QRUJTOwotCXViaS0+cnN2ZF9wZWJzICs9IEVCQV9SRVNFUlZFRF9QRUJTOwotCiAJZGJnX2ViYSgiRUJBIHVuaXQgaXMgaW5pdGlhbGl6ZWQiKTsKIAlyZXR1cm4gMDsKIApAQCAtMTIwMiw4ICsxMjMxLDYgQEAKIAkJCWNvbnRpbnVlOwogCQlrZnJlZSh1YmktPnZvbHVtZXNbaV0tPmViYV90YmwpOwogCX0KLQlpZiAodWJpX2RldmljZXNfY250ID09IDApCi0JCWttZW1fY2FjaGVfZGVzdHJveShsdHJlZV9zbGFiKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xMjIyLDYgKzEyNDksNCBAQAogCQkJY29udGludWU7CiAJCWtmcmVlKHViaS0+dm9sdW1lc1tpXS0+ZWJhX3RibCk7CiAJfQotCWlmICh1YmlfZGV2aWNlc19jbnQgPT0gMSkKLQkJa21lbV9jYWNoZV9kZXN0cm95KGx0cmVlX3NsYWIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL2dsdWViaS5jIGIvZHJpdmVycy9tdGQvdWJpL2dsdWViaS5jCmluZGV4IDQxZmY3NGMuLmQzOTcyMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9nbHVlYmkuYworKysgYi9kcml2ZXJzL210ZC91YmkvZ2x1ZWJpLmMKQEAgLTEyOSw4ICsxMjksNyBAQAogCQlpZiAodG9fcmVhZCA+IHRvdGFsX3JlYWQpCiAJCQl0b19yZWFkID0gdG90YWxfcmVhZDsKIAotCQllcnIgPSB1YmlfZWJhX3JlYWRfbGViKHViaSwgdm9sLT52b2xfaWQsIGxudW0sIGJ1Ziwgb2ZmcywKLQkJCQkgICAgICAgdG9fcmVhZCwgMCk7CisJCWVyciA9IHViaV9lYmFfcmVhZF9sZWIodWJpLCB2b2wsIGxudW0sIGJ1Ziwgb2ZmcywgdG9fcmVhZCwgMCk7CiAJCWlmIChlcnIpCiAJCQlicmVhazsKIApAQCAtMTg3LDggKzE4Niw4IEBACiAJCWlmICh0b193cml0ZSA+IHRvdGFsX3dyaXR0ZW4pCiAJCQl0b193cml0ZSA9IHRvdGFsX3dyaXR0ZW47CiAKLQkJZXJyID0gdWJpX2ViYV93cml0ZV9sZWIodWJpLCB2b2wtPnZvbF9pZCwgbG51bSwgYnVmLCBvZmZzLAotCQkJCQl0b193cml0ZSwgVUJJX1VOS05PV04pOworCQllcnIgPSB1YmlfZWJhX3dyaXRlX2xlYih1YmksIHZvbCwgbG51bSwgYnVmLCBvZmZzLCB0b193cml0ZSwKKwkJCQkJVUJJX1VOS05PV04pOwogCQlpZiAoZXJyKQogCQkJYnJlYWs7CiAKQEAgLTIzNyw3ICsyMzYsNyBAQAogCQlyZXR1cm4gLUVST0ZTOwogCiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJZXJyID0gdWJpX2ViYV91bm1hcF9sZWIodWJpLCB2b2wtPnZvbF9pZCwgbG51bSArIGkpOworCQllcnIgPSB1YmlfZWJhX3VubWFwX2xlYih1YmksIHZvbCwgbG51bSArIGkpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXRfZXJyOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9pby5jIGIvZHJpdmVycy9tdGQvdWJpL2lvLmMKaW5kZXggN2MzMDRlZWMuLmRiM2VmZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9pby5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9pby5jCkBAIC0xNzMsNiArMTczLDE2IEBACiAJCXViaV9lcnIoImVycm9yICVkIHdoaWxlIHJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBQRUIgJWQ6JWQsICIKIAkJCSJyZWFkICV6ZCBieXRlcyIsIGVyciwgbGVuLCBwbnVtLCBvZmZzZXQsIHJlYWQpOwogCQl1YmlfZGJnX2R1bXBfc3RhY2soKTsKKworCQkvKgorCQkgKiBUaGUgZHJpdmVyIHNob3VsZCBuZXZlciByZXR1cm4gLUVCQURNU0cgaWYgaXQgZmFpbGVkIHRvIHJlYWQKKwkJICogYWxsIHRoZSByZXF1ZXN0ZWQgZGF0YS4gQnV0IHNvbWUgYnVnZ3kgZHJpdmVycyBtaWdodCBkbworCQkgKiB0aGlzLCBzbyB3ZSBjaGFuZ2UgaXQgdG8gLUVJTy4KKwkJICovCisJCWlmIChyZWFkICE9IGxlbiAmJiBlcnIgPT0gLUVCQURNU0cpIHsKKwkJCXViaV9hc3NlcnQoMCk7CisJCQllcnIgPSAtRUlPOworCQl9CiAJfSBlbHNlIHsKIAkJdWJpX2Fzc2VydChsZW4gPT0gcmVhZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9rYXBpLmMgYi9kcml2ZXJzL210ZC91Ymkva2FwaS5jCmluZGV4IDAzYzc3NGYuLmE3MGQ1ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9rYXBpLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL2thcGkuYwpAQCAtMzAsMjMgKzMwLDI3IEBACiAgKiBAdWJpX251bTogVUJJIGRldmljZSBudW1iZXIKICAqIEBkaTogdGhlIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBoZXJlCiAgKgotICogVGhpcyBmdW5jdGlvbiByZXR1cm5zICUwIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYSAlLUVOT0RFViBpZiB0aGVyZSBpcyBubwotICogc3VjaCBVQkkgZGV2aWNlLgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zICUwIGluIGNhc2Ugb2Ygc3VjY2VzcywgJS1FSU5WQUwgaWYgdGhlIFVCSSBkZXZpY2UKKyAqIG51bWJlciBpcyBpbnZhbGlkLCBhbmQgJS1FTk9ERVYgaWYgdGhlcmUgaXMgbm8gc3VjaCBVQkkgZGV2aWNlLgogICovCiBpbnQgdWJpX2dldF9kZXZpY2VfaW5mbyhpbnQgdWJpX251bSwgc3RydWN0IHViaV9kZXZpY2VfaW5mbyAqZGkpCiB7Ci0JY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaTsKKwlzdHJ1Y3QgdWJpX2RldmljZSAqdWJpOwogCi0JaWYgKHViaV9udW0gPCAwIHx8IHViaV9udW0gPj0gVUJJX01BWF9ERVZJQ0VTIHx8Ci0JICAgICF1YmlfZGV2aWNlc1t1YmlfbnVtXSkKKwlpZiAodWJpX251bSA8IDAgfHwgdWJpX251bSA+PSBVQklfTUFYX0RFVklDRVMpCisJCXJldHVybiAtRUlOVkFMOworCisJdWJpID0gdWJpX2dldF9kZXZpY2UodWJpX251bSk7CisJaWYgKCF1YmkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JdWJpID0gdWJpX2RldmljZXNbdWJpX251bV07CiAJZGktPnViaV9udW0gPSB1YmktPnViaV9udW07CiAJZGktPmxlYl9zaXplID0gdWJpLT5sZWJfc2l6ZTsKIAlkaS0+bWluX2lvX3NpemUgPSB1YmktPm1pbl9pb19zaXplOwogCWRpLT5yb19tb2RlID0gdWJpLT5yb19tb2RlOwotCWRpLT5jZGV2ID0gTUtERVYodWJpLT5tYWpvciwgMCk7CisJZGktPmNkZXYgPSB1YmktPmNkZXYuZGV2OworCisJdWJpX3B1dF9kZXZpY2UodWJpKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHViaV9nZXRfZGV2aWNlX2luZm8pOwpAQCAtNzMsNyArNzcsNyBAQAogCXZpLT51c2FibGVfbGViX3NpemUgPSB2b2wtPnVzYWJsZV9sZWJfc2l6ZTsKIAl2aS0+bmFtZV9sZW4gPSB2b2wtPm5hbWVfbGVuOwogCXZpLT5uYW1lID0gdm9sLT5uYW1lOwotCXZpLT5jZGV2ID0gTUtERVYodWJpLT5tYWpvciwgdmktPnZvbF9pZCArIDEpOworCXZpLT5jZGV2ID0gdm9sLT5jZGV2LmRldjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHViaV9nZXRfdm9sdW1lX2luZm8pOwogCkBAIC0xMDQsMzcgKzEwOCwzOSBAQAogCiAJZGJnX21zZygib3BlbiBkZXZpY2UgJWQgdm9sdW1lICVkLCBtb2RlICVkIiwgdWJpX251bSwgdm9sX2lkLCBtb2RlKTsKIAotCWVyciA9IC1FTk9ERVY7Ci0JaWYgKHViaV9udW0gPCAwKQotCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCWlmICh1YmlfbnVtIDwgMCB8fCB1YmlfbnVtID49IFVCSV9NQVhfREVWSUNFUykKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKLQl1YmkgPSB1YmlfZGV2aWNlc1t1YmlfbnVtXTsKLQotCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKQotCQlyZXR1cm4gRVJSX1BUUihlcnIpOwotCi0JaWYgKHViaV9udW0gPj0gVUJJX01BWF9ERVZJQ0VTIHx8ICF1YmkpCi0JCWdvdG8gb3V0X3B1dDsKLQotCWVyciA9IC1FSU5WQUw7Ci0JaWYgKHZvbF9pZCA8IDAgfHwgdm9sX2lkID49IHViaS0+dnRibF9zbG90cykKLQkJZ290byBvdXRfcHV0OwogCWlmIChtb2RlICE9IFVCSV9SRUFET05MWSAmJiBtb2RlICE9IFVCSV9SRUFEV1JJVEUgJiYKIAkgICAgbW9kZSAhPSBVQklfRVhDTFVTSVZFKQotCQlnb3RvIG91dF9wdXQ7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJLyoKKwkgKiBGaXJzdCBvZiBhbGwsIHdlIGhhdmUgdG8gZ2V0IHRoZSBVQkkgZGV2aWNlIHRvIHByZXZlbnQgaXRzIHJlbW92YWwuCisJICovCisJdWJpID0gdWJpX2dldF9kZXZpY2UodWJpX251bSk7CisJaWYgKCF1YmkpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCisJaWYgKHZvbF9pZCA8IDAgfHwgdm9sX2lkID49IHViaS0+dnRibF9zbG90cykgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dF9wdXRfdWJpOworCX0KIAogCWRlc2MgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkZXNjKSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X3B1dDsKKwkJZ290byBvdXRfcHV0X3ViaTsKIAl9CiAKKwllcnIgPSAtRU5PREVWOworCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKQorCQlnb3RvIG91dF9mcmVlOworCiAJc3Bpbl9sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7CiAJdm9sID0gdWJpLT52b2x1bWVzW3ZvbF9pZF07Ci0JaWYgKCF2b2wpIHsKLQkJZXJyID0gLUVOT0RFVjsKKwlpZiAoIXZvbCkKIAkJZ290byBvdXRfdW5sb2NrOwotCX0KIAogCWVyciA9IC1FQlVTWTsKIAlzd2l0Y2ggKG1vZGUpIHsKQEAgLTE1NiwyMSArMTYyLDE5IEBACiAJCXZvbC0+ZXhjbHVzaXZlID0gMTsKIAkJYnJlYWs7CiAJfQorCWdldF9kZXZpY2UoJnZvbC0+ZGV2KTsKKwl2b2wtPnJlZl9jb3VudCArPSAxOwogCXNwaW5fdW5sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7CiAKIAlkZXNjLT52b2wgPSB2b2w7CiAJZGVzYy0+bW9kZSA9IG1vZGU7CiAKLQkvKgotCSAqIFRvIHByZXZlbnQgc2ltdWx0YW5lb3VzIGNoZWNrcyBvZiB0aGUgc2FtZSB2b2x1bWUgd2UgdXNlIEB2dGJsX211dGV4LAotCSAqIGFsdGhvdWdoIGl0IGlzIG5vdCB0aGUgcHVycG9zZSBpdCB3YXMgaW50cm9kdWNlZCBmb3IuCi0JICovCi0JbXV0ZXhfbG9jaygmdWJpLT52dGJsX211dGV4KTsKKwltdXRleF9sb2NrKCZ1YmktPmNrdm9sX211dGV4KTsKIAlpZiAoIXZvbC0+Y2hlY2tlZCkgewogCQkvKiBUaGlzIGlzIHRoZSBmaXJzdCBvcGVuIC0gY2hlY2sgdGhlIHZvbHVtZSAqLwogCQllcnIgPSB1YmlfY2hlY2tfdm9sdW1lKHViaSwgdm9sX2lkKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCW11dGV4X3VubG9jaygmdWJpLT52dGJsX211dGV4KTsKKwkJCW11dGV4X3VubG9jaygmdWJpLT5ja3ZvbF9tdXRleCk7CiAJCQl1YmlfY2xvc2Vfdm9sdW1lKGRlc2MpOwogCQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIAkJfQpAQCAtMTgxLDE0ICsxODUsMTcgQEAKIAkJfQogCQl2b2wtPmNoZWNrZWQgPSAxOwogCX0KLQltdXRleF91bmxvY2soJnViaS0+dnRibF9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZ1YmktPmNrdm9sX211dGV4KTsKKwogCXJldHVybiBkZXNjOwogCiBvdXRfdW5sb2NrOgogCXNwaW5fdW5sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7Ci0Ja2ZyZWUoZGVzYyk7Ci1vdXRfcHV0OgogCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworb3V0X2ZyZWU6CisJa2ZyZWUoZGVzYyk7CitvdXRfcHV0X3ViaToKKwl1YmlfcHV0X2RldmljZSh1YmkpOwogCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1Ymlfb3Blbl92b2x1bWUpOwpAQCAtMjA1LDggKzIxMiw4IEBACiAJCQkJCSAgIGludCBtb2RlKQogewogCWludCBpLCB2b2xfaWQgPSAtMSwgbGVuOwotCXN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKnJldDsKIAlzdHJ1Y3QgdWJpX2RldmljZSAqdWJpOworCXN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKnJldDsKIAogCWRiZ19tc2coIm9wZW4gdm9sdW1lICVzLCBtb2RlICVkIiwgbmFtZSwgbW9kZSk7CiAKQEAgLTIxNywxNCArMjI0LDEyIEBACiAJaWYgKGxlbiA+IFVCSV9WT0xfTkFNRV9NQVgpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCi0JcmV0ID0gRVJSX1BUUigtRU5PREVWKTsKLQlpZiAoIXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkKLQkJcmV0dXJuIHJldDsKKwlpZiAodWJpX251bSA8IDAgfHwgdWJpX251bSA+PSBVQklfTUFYX0RFVklDRVMpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCi0JaWYgKHViaV9udW0gPCAwIHx8IHViaV9udW0gPj0gVUJJX01BWF9ERVZJQ0VTIHx8ICF1YmlfZGV2aWNlc1t1YmlfbnVtXSkKLQkJZ290byBvdXRfcHV0OwotCi0JdWJpID0gdWJpX2RldmljZXNbdWJpX251bV07CisJdWJpID0gdWJpX2dldF9kZXZpY2UodWJpX251bSk7CisJaWYgKCF1YmkpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwogCiAJc3Bpbl9sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7CiAJLyogV2FsayBhbGwgdm9sdW1lcyBvZiB0aGlzIFVCSSBkZXZpY2UgKi8KQEAgLTIzOCwxMyArMjQzLDE2IEBACiAJfQogCXNwaW5fdW5sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7CiAKLQlpZiAodm9sX2lkIDwgMCkKLQkJZ290byBvdXRfcHV0OworCWlmICh2b2xfaWQgPj0gMCkKKwkJcmV0ID0gdWJpX29wZW5fdm9sdW1lKHViaV9udW0sIHZvbF9pZCwgbW9kZSk7CisJZWxzZQorCQlyZXQgPSBFUlJfUFRSKC1FTk9ERVYpOwogCi0JcmV0ID0gdWJpX29wZW5fdm9sdW1lKHViaV9udW0sIHZvbF9pZCwgbW9kZSk7Ci0KLW91dF9wdXQ6Ci0JbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJLyoKKwkgKiBXZSBzaG91bGQgcHV0IHRoZSBVQkkgZGV2aWNlIGV2ZW4gaW4gY2FzZSBvZiBzdWNjZXNzLCBiZWNhdXNlCisJICogJ3ViaV9vcGVuX3ZvbHVtZSgpJyB0b29rIGEgcmVmZXJlbmNlIGFzIHdlbGwuCisJICovCisJdWJpX3B1dF9kZXZpY2UodWJpKTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwodWJpX29wZW5fdm9sdW1lX25tKTsKQEAgLTI1NiwxMCArMjY0LDExIEBACiB2b2lkIHViaV9jbG9zZV92b2x1bWUoc3RydWN0IHViaV92b2x1bWVfZGVzYyAqZGVzYykKIHsKIAlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sID0gZGVzYy0+dm9sOworCXN0cnVjdCB1YmlfZGV2aWNlICp1YmkgPSB2b2wtPnViaTsKIAogCWRiZ19tc2coImNsb3NlIHZvbHVtZSAlZCwgbW9kZSAlZCIsIHZvbC0+dm9sX2lkLCBkZXNjLT5tb2RlKTsKIAotCXNwaW5fbG9jaygmdm9sLT51YmktPnZvbHVtZXNfbG9jayk7CisJc3Bpbl9sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7CiAJc3dpdGNoIChkZXNjLT5tb2RlKSB7CiAJY2FzZSBVQklfUkVBRE9OTFk6CiAJCXZvbC0+cmVhZGVycyAtPSAxOwpAQCAtMjcwLDkgKzI3OSwxMiBAQAogCWNhc2UgVUJJX0VYQ0xVU0lWRToKIAkJdm9sLT5leGNsdXNpdmUgPSAwOwogCX0KLQlzcGluX3VubG9jaygmdm9sLT51YmktPnZvbHVtZXNfbG9jayk7CisJdm9sLT5yZWZfY291bnQgLT0gMTsKKwlzcGluX3VubG9jaygmdWJpLT52b2x1bWVzX2xvY2spOwogCiAJa2ZyZWUoZGVzYyk7CisJcHV0X2RldmljZSgmdm9sLT5kZXYpOworCXViaV9wdXRfZGV2aWNlKHViaSk7CiAJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1YmlfY2xvc2Vfdm9sdW1lKTsKQEAgLTMzMiw3ICszNDQsNyBAQAogCWlmIChsZW4gPT0gMCkKIAkJcmV0dXJuIDA7CiAKLQllcnIgPSB1YmlfZWJhX3JlYWRfbGViKHViaSwgdm9sX2lkLCBsbnVtLCBidWYsIG9mZnNldCwgbGVuLCBjaGVjayk7CisJZXJyID0gdWJpX2ViYV9yZWFkX2xlYih1YmksIHZvbCwgbG51bSwgYnVmLCBvZmZzZXQsIGxlbiwgY2hlY2spOwogCWlmIChlcnIgJiYgZXJyID09IC1FQkFETVNHICYmIHZvbC0+dm9sX3R5cGUgPT0gVUJJX1NUQVRJQ19WT0xVTUUpIHsKIAkJdWJpX3dhcm4oIm1hcmsgdm9sdW1lICVkIGFzIGNvcnJ1cHRlZCIsIHZvbF9pZCk7CiAJCXZvbC0+Y29ycnVwdGVkID0gMTsKQEAgLTM5OSw3ICs0MTEsNyBAQAogCWlmIChsZW4gPT0gMCkKIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gdWJpX2ViYV93cml0ZV9sZWIodWJpLCB2b2xfaWQsIGxudW0sIGJ1Ziwgb2Zmc2V0LCBsZW4sIGR0eXBlKTsKKwlyZXR1cm4gdWJpX2ViYV93cml0ZV9sZWIodWJpLCB2b2wsIGxudW0sIGJ1Ziwgb2Zmc2V0LCBsZW4sIGR0eXBlKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHViaV9sZWJfd3JpdGUpOwogCkBAIC00NDgsNyArNDYwLDcgQEAKIAlpZiAobGVuID09IDApCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIHViaV9lYmFfYXRvbWljX2xlYl9jaGFuZ2UodWJpLCB2b2xfaWQsIGxudW0sIGJ1ZiwgbGVuLCBkdHlwZSk7CisJcmV0dXJuIHViaV9lYmFfYXRvbWljX2xlYl9jaGFuZ2UodWJpLCB2b2wsIGxudW0sIGJ1ZiwgbGVuLCBkdHlwZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1YmlfbGViX2NoYW5nZSk7CiAKQEAgLTQ2OCw5ICs0ODAsOSBAQAogewogCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2wgPSBkZXNjLT52b2w7CiAJc3RydWN0IHViaV9kZXZpY2UgKnViaSA9IHZvbC0+dWJpOwotCWludCBlcnIsIHZvbF9pZCA9IHZvbC0+dm9sX2lkOworCWludCBlcnI7CiAKLQlkYmdfbXNnKCJlcmFzZSBMRUIgJWQ6JWQiLCB2b2xfaWQsIGxudW0pOworCWRiZ19tc2coImVyYXNlIExFQiAlZDolZCIsIHZvbC0+dm9sX2lkLCBsbnVtKTsKIAogCWlmIChkZXNjLT5tb2RlID09IFVCSV9SRUFET05MWSB8fCB2b2wtPnZvbF90eXBlID09IFVCSV9TVEFUSUNfVk9MVU1FKQogCQlyZXR1cm4gLUVST0ZTOwpAQCAtNDgxLDcgKzQ5Myw3IEBACiAJaWYgKHZvbC0+dXBkX21hcmtlcikKIAkJcmV0dXJuIC1FQkFERjsKIAotCWVyciA9IHViaV9lYmFfdW5tYXBfbGViKHViaSwgdm9sX2lkLCBsbnVtKTsKKwllcnIgPSB1YmlfZWJhX3VubWFwX2xlYih1YmksIHZvbCwgbG51bSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtNTI5LDkgKzU0MSw4IEBACiB7CiAJc3RydWN0IHViaV92b2x1bWUgKnZvbCA9IGRlc2MtPnZvbDsKIAlzdHJ1Y3QgdWJpX2RldmljZSAqdWJpID0gdm9sLT51Ymk7Ci0JaW50IHZvbF9pZCA9IHZvbC0+dm9sX2lkOwogCi0JZGJnX21zZygidW5tYXAgTEVCICVkOiVkIiwgdm9sX2lkLCBsbnVtKTsKKwlkYmdfbXNnKCJ1bm1hcCBMRUIgJWQ6JWQiLCB2b2wtPnZvbF9pZCwgbG51bSk7CiAKIAlpZiAoZGVzYy0+bW9kZSA9PSBVQklfUkVBRE9OTFkgfHwgdm9sLT52b2xfdHlwZSA9PSBVQklfU1RBVElDX1ZPTFVNRSkKIAkJcmV0dXJuIC1FUk9GUzsKQEAgLTU0MiwxMSArNTUzLDU1IEBACiAJaWYgKHZvbC0+dXBkX21hcmtlcikKIAkJcmV0dXJuIC1FQkFERjsKIAotCXJldHVybiB1YmlfZWJhX3VubWFwX2xlYih1YmksIHZvbF9pZCwgbG51bSk7CisJcmV0dXJuIHViaV9lYmFfdW5tYXBfbGViKHViaSwgdm9sLCBsbnVtKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHViaV9sZWJfdW5tYXApOwogCiAvKioKKyAqIHViaV9sZWJfbWFwIC0gbWFwIGxvZ2ljYWwgZXJhc2Jsb2NrIHRvIGEgcGh5c2ljYWwgZXJhc2VibG9jay4KKyAqIEBkZXNjOiB2b2x1bWUgZGVzY3JpcHRvcgorICogQGxudW06IGxvZ2ljYWwgZXJhc2VibG9jayBudW1iZXIKKyAqIEBkdHlwZTogZXhwZWN0ZWQgZGF0YSB0eXBlCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXBzIGFuIHVuLW1hcHBlZCBsb2dpY2FsIGVyYXNlYmxvY2sgQGxudW0gdG8gYSBwaHlzaWNhbAorICogZXJhc2VibG9jay4gVGhpcyBtZWFucywgdGhhdCBhZnRlciBhIHN1Y2Nlc3NmdWxsIGludm9jYXRpb24gb2YgdGhpcworICogZnVuY3Rpb24gdGhlIGxvZ2ljYWwgZXJhc2VibG9jayBAbG51bSB3aWxsIGJlIGVtcHR5IChjb250YWluIG9ubHkgJTB4RkYKKyAqIGJ5dGVzKSBhbmQgYmUgbWFwcGVkIHRvIGEgcGh5c2ljYWwgZXJhc2VibG9jaywgZXZlbiBpZiBhbiB1bmNsZWFuIHJlYm9vdAorICogaGFwcGVucy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MsICUtRUJBREYgaWYgdGhlIHZvbHVtZSBpcworICogZGFtYWdlZCBiZWNhdXNlIG9mIGFuIGludGVycnVwdGVkIHVwZGF0ZSwgJS1FQkFETVNHIGlmIHRoZSBsb2dpY2FsCisgKiBlcmFzZWJsb2NrIGlzIGFscmVhZHkgbWFwcGVkLCBhbmQgb3RoZXIgbmVnYXRpdmUgZXJyb3IgY29kZXMgaW4gY2FzZSBvZgorICogb3RoZXIgZmFpbHVyZXMuCisgKi8KK2ludCB1YmlfbGViX21hcChzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpkZXNjLCBpbnQgbG51bSwgaW50IGR0eXBlKQoreworCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2wgPSBkZXNjLT52b2w7CisJc3RydWN0IHViaV9kZXZpY2UgKnViaSA9IHZvbC0+dWJpOworCisJZGJnX21zZygidW5tYXAgTEVCICVkOiVkIiwgdm9sLT52b2xfaWQsIGxudW0pOworCisJaWYgKGRlc2MtPm1vZGUgPT0gVUJJX1JFQURPTkxZIHx8IHZvbC0+dm9sX3R5cGUgPT0gVUJJX1NUQVRJQ19WT0xVTUUpCisJCXJldHVybiAtRVJPRlM7CisKKwlpZiAobG51bSA8IDAgfHwgbG51bSA+PSB2b2wtPnJlc2VydmVkX3BlYnMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGR0eXBlICE9IFVCSV9MT05HVEVSTSAmJiBkdHlwZSAhPSBVQklfU0hPUlRURVJNICYmCisJICAgIGR0eXBlICE9IFVCSV9VTktOT1dOKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh2b2wtPnVwZF9tYXJrZXIpCisJCXJldHVybiAtRUJBREY7CisKKwlpZiAodm9sLT5lYmFfdGJsW2xudW1dID49IDApCisJCXJldHVybiAtRUJBRE1TRzsKKworCXJldHVybiB1YmlfZWJhX3dyaXRlX2xlYih1YmksIHZvbCwgbG51bSwgTlVMTCwgMCwgMCwgZHR5cGUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWJpX2xlYl9tYXApOworCisvKioKICAqIHViaV9pc19tYXBwZWQgLSBjaGVjayBpZiBsb2dpY2FsIGVyYXNlYmxvY2sgaXMgbWFwcGVkLgogICogQGRlc2M6IHZvbHVtZSBkZXNjcmlwdG9yCiAgKiBAbG51bTogbG9naWNhbCBlcmFzZWJsb2NrIG51bWJlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL21pc2MuYyBiL2RyaXZlcnMvbXRkL3ViaS9taXNjLmMKaW5kZXggOWUyMzM4Yy4uOTNlMDUyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL21pc2MuYworKysgYi9kcml2ZXJzL210ZC91YmkvbWlzYy5jCkBAIC03OSw3ICs3OSw3IEBACiAJCWVsc2UKIAkJCXNpemUgPSB2b2wtPnVzYWJsZV9sZWJfc2l6ZTsKIAotCQllcnIgPSB1YmlfZWJhX3JlYWRfbGViKHViaSwgdm9sX2lkLCBpLCBidWYsIDAsIHNpemUsIDEpOworCQllcnIgPSB1YmlfZWJhX3JlYWRfbGViKHViaSwgdm9sLCBpLCBidWYsIDAsIHNpemUsIDEpOwogCQlpZiAoZXJyKSB7CiAJCQlpZiAoZXJyID09IC1FQkFETVNHKQogCQkJCWVyciA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91Ymkvc2Nhbi5jIGIvZHJpdmVycy9tdGQvdWJpL3NjYW4uYwppbmRleCBjN2IwYWZjLi4wNWFhM2U3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91Ymkvc2Nhbi5jCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9zY2FuLmMKQEAgLTI4Niw5ICsyODYsMTQgQEAKIAkJICogRklYTUU6IGJ1dCB0aGlzIGlzIGFueXdheSBvYnNvbGV0ZSBhbmQgd2lsbCBiZSByZW1vdmVkIGF0CiAJCSAqIHNvbWUgcG9pbnQuCiAJCSAqLwotCiAJCWRiZ19ibGQoInVzaW5nIG9sZCBjcmFwcHkgbGViX3ZlciBzdHVmZiIpOwogCisJCWlmICh2MSA9PSB2MikgeworCQkJdWJpX2VycigiUEVCICVkIGFuZCBQRUIgJWQgaGF2ZSB0aGUgc2FtZSB2ZXJzaW9uICVsbGQiLAorCQkJCXNlYi0+cG51bSwgcG51bSwgdjEpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwogCQlhYnMgPSB2MSAtIHYyOwogCQlpZiAoYWJzIDwgMCkKIAkJCWFicyA9IC1hYnM7CkBAIC0zOTAsNyArMzk1LDYgQEAKIAl2ZnJlZShidWYpOwogb3V0X2ZyZWVfdmlkaDoKIAl1YmlfZnJlZV92aWRfaGRyKHViaSwgdmgpOwotCXViaV9hc3NlcnQoZXJyIDwgMCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNzY5LDcgKzc3Myw3IEBACiAgKi8KIHN0YXRpYyBpbnQgcHJvY2Vzc19lYihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBzdHJ1Y3QgdWJpX3NjYW5faW5mbyAqc2ksIGludCBwbnVtKQogewotCWxvbmcgbG9uZyBlYzsKKwlsb25nIGxvbmcgdW5pbml0aWFsaXplZF92YXIoZWMpOwogCWludCBlcnIsIGJpdGZsaXBzID0gMCwgdm9sX2lkLCBlY19jb3JyID0gMDsKIAogCWRiZ19ibGQoInNjYW4gUEVCICVkIiwgcG51bSk7CkBAIC04NTQsNyArODU4LDcgQEAKIAl9CiAKIAl2b2xfaWQgPSBiZTMyX3RvX2NwdSh2aWRoLT52b2xfaWQpOwotCWlmICh2b2xfaWQgPiBVQklfTUFYX1ZPTFVNRVMgJiYgdm9sX2lkICE9IFVCSV9MQVlPVVRfVk9MX0lEKSB7CisJaWYgKHZvbF9pZCA+IFVCSV9NQVhfVk9MVU1FUyAmJiB2b2xfaWQgIT0gVUJJX0xBWU9VVF9WT0xVTUVfSUQpIHsKIAkJaW50IGxudW0gPSBiZTMyX3RvX2NwdSh2aWRoLT5sbnVtKTsKIAogCQkvKiBVbnN1cHBvcnRlZCBpbnRlcm5hbCB2b2x1bWUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS91YmkuaCBiL2RyaXZlcnMvbXRkL3ViaS91YmkuaAppbmRleCA1ZTk0MWE2Li40NTc3MTA2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL3ViaS5oCisrKyBiL2RyaXZlcnMvbXRkL3ViaS91YmkuaApAQCAtOTQsOCArOTQsNDMgQEAKIAlVQklfSU9fQklURkxJUFMKIH07CiAKLWV4dGVybiBpbnQgdWJpX2RldmljZXNfY250OwotZXh0ZXJuIHN0cnVjdCB1YmlfZGV2aWNlICp1YmlfZGV2aWNlc1tdOworLyoqCisgKiBzdHJ1Y3QgdWJpX3dsX2VudHJ5IC0gd2Vhci1sZXZlbGluZyBlbnRyeS4KKyAqIEByYjogbGluayBpbiB0aGUgY29ycmVzcG9uZGluZyBSQi10cmVlCisgKiBAZWM6IGVyYXNlIGNvdW50ZXIKKyAqIEBwbnVtOiBwaHlzaWNhbCBlcmFzZWJsb2NrIG51bWJlcgorICoKKyAqIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZCBpbiB0aGUgV0wgdW5pdC4gRWFjaCBwaHlzaWNhbCBlcmFzZWJsb2NrIGhhcyBhCisgKiBjb3JyZXNwb25kaW5nICZzdHJ1Y3Qgd2xfZW50cnkgb2JqZWN0IHdoaWNoIG1heSBiZSBrZXB0IGluIGRpZmZlcmVudAorICogUkItdHJlZXMuIFNlZSBXTCB1bml0IGZvciBkZXRhaWxzLgorICovCitzdHJ1Y3QgdWJpX3dsX2VudHJ5IHsKKwlzdHJ1Y3QgcmJfbm9kZSByYjsKKwlpbnQgZWM7CisJaW50IHBudW07Cit9OworCisvKioKKyAqIHN0cnVjdCB1YmlfbHRyZWVfZW50cnkgLSBhbiBlbnRyeSBpbiB0aGUgbG9jayB0cmVlLgorICogQHJiOiBsaW5rcyBSQi10cmVlIG5vZGVzCisgKiBAdm9sX2lkOiB2b2x1bWUgSUQgb2YgdGhlIGxvY2tlZCBsb2dpY2FsIGVyYXNlYmxvY2sKKyAqIEBsbnVtOiBsb2NrZWQgbG9naWNhbCBlcmFzZWJsb2NrIG51bWJlcgorICogQHVzZXJzOiBob3cgbWFueSB0YXNrcyBhcmUgdXNpbmcgdGhpcyBsb2dpY2FsIGVyYXNlYmxvY2sgb3Igd2FpdCBmb3IgaXQKKyAqIEBtdXRleDogcmVhZC93cml0ZSBtdXRleCB0byBpbXBsZW1lbnQgcmVhZC93cml0ZSBhY2Nlc3Mgc2VyaWFsaXphdGlvbiB0bworICogICAgICAgICB0aGUgKEB2b2xfaWQsIEBsbnVtKSBsb2dpY2FsIGVyYXNlYmxvY2sKKyAqCisgKiBUaGlzIGRhdGEgc3RydWN0dXJlIGlzIHVzZWQgaW4gdGhlIEVCQSB1bml0IHRvIGltcGxlbWVudCBwZXItTEVCIGxvY2tpbmcuCisgKiBXaGVuIGEgbG9naWNhbCBlcmFzZWJsb2NrIGlzIGJlaW5nIGxvY2tlZCAtIGNvcnJlc3BvbmRpbmcKKyAqICZzdHJ1Y3QgdWJpX2x0cmVlX2VudHJ5IG9iamVjdCBpcyBpbnNlcnRlZCB0byB0aGUgbG9jayB0cmVlIChAdWJpLT5sdHJlZSkuCisgKiBTZWUgRUJBIHVuaXQgZm9yIGRldGFpbHMuCisgKi8KK3N0cnVjdCB1YmlfbHRyZWVfZW50cnkgeworCXN0cnVjdCByYl9ub2RlIHJiOworCWludCB2b2xfaWQ7CisJaW50IGxudW07CisJaW50IHVzZXJzOworCXN0cnVjdCByd19zZW1hcGhvcmUgbXV0ZXg7Cit9OwogCiBzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjOwogCkBAIC0xMDUsMTEgKzE0MCwxMCBAQAogICogQGNkZXY6IGNoYXJhY3RlciBkZXZpY2Ugb2JqZWN0IHRvIGNyZWF0ZSBjaGFyYWN0ZXIgZGV2aWNlCiAgKiBAdWJpOiByZWZlcmVuY2UgdG8gdGhlIFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CiAgKiBAdm9sX2lkOiB2b2x1bWUgSUQKKyAqIEByZWZfY291bnQ6IHZvbHVtZSByZWZlcmVuY2UgY291bnQKICAqIEByZWFkZXJzOiBudW1iZXIgb2YgdXNlcnMgaG9sZGluZyB0aGlzIHZvbHVtZSBpbiByZWFkLW9ubHkgbW9kZQogICogQHdyaXRlcnM6IG51bWJlciBvZiB1c2VycyBob2xkaW5nIHRoaXMgdm9sdW1lIGluIHJlYWQtd3JpdGUgbW9kZQogICogQGV4Y2x1c2l2ZTogd2hldGhlciBzb21lYm9keSBob2xkcyB0aGlzIHZvbHVtZSBpbiBleGNsdXNpdmUgbW9kZQotICogQHJlbW92ZWQ6IGlmIHRoZSB2b2x1bWUgd2FzIHJlbW92ZWQKLSAqIEBjaGVja2VkOiBpZiB0aGlzIHN0YXRpYyB2b2x1bWUgd2FzIGNoZWNrZWQKICAqCiAgKiBAcmVzZXJ2ZWRfcGViczogaG93IG1hbnkgcGh5c2ljYWwgZXJhc2VibG9ja3MgYXJlIHJlc2VydmVkIGZvciB0aGlzIHZvbHVtZQogICogQHZvbF90eXBlOiB2b2x1bWUgdHlwZSAoJVVCSV9EWU5BTUlDX1ZPTFVNRSBvciAlVUJJX1NUQVRJQ19WT0xVTUUpCkBAIC0xMTcsMjEgKzE1MSwzMCBAQAogICogQHVzZWRfZWJzOiBob3cgbWFueSBsb2dpY2FsIGVyYXNlYmxvY2tzIGluIHRoaXMgdm9sdW1lIGNvbnRhaW4gZGF0YQogICogQGxhc3RfZWJfYnl0ZXM6IGhvdyBtYW55IGJ5dGVzIGFyZSBzdG9yZWQgaW4gdGhlIGxhc3QgbG9naWNhbCBlcmFzZWJsb2NrCiAgKiBAdXNlZF9ieXRlczogaG93IG1hbnkgYnl0ZXMgb2YgZGF0YSB0aGlzIHZvbHVtZSBjb250YWlucwotICogQHVwZF9tYXJrZXI6IG5vbi16ZXJvIGlmIHRoZSB1cGRhdGUgbWFya2VyIGlzIHNldCBmb3IgdGhpcyB2b2x1bWUKLSAqIEBjb3JydXB0ZWQ6IG5vbi16ZXJvIGlmIHRoZSB2b2x1bWUgaXMgY29ycnVwdGVkIChzdGF0aWMgdm9sdW1lcyBvbmx5KQogICogQGFsaWdubWVudDogdm9sdW1lIGFsaWdubWVudAogICogQGRhdGFfcGFkOiBob3cgbWFueSBieXRlcyBhcmUgbm90IHVzZWQgYXQgdGhlIGVuZCBvZiBwaHlzaWNhbCBlcmFzZWJsb2NrcyB0bwotICogc2F0aXNmeSB0aGUgcmVxdWVzdGVkIGFsaWdubWVudAorICogICAgICAgICAgICBzYXRpc2Z5IHRoZSByZXF1ZXN0ZWQgYWxpZ25tZW50CiAgKiBAbmFtZV9sZW46IHZvbHVtZSBuYW1lIGxlbmd0aAogICogQG5hbWU6IHZvbHVtZSBuYW1lCiAgKgotICogQHVwZGF0aW5nOiB3aGV0aGVyIHRoZSB2b2x1bWUgaXMgYmVpbmcgdXBkYXRlZAogICogQHVwZF9lYnM6IGhvdyBtYW55IGVyYXNlYmxvY2tzIGFyZSBleHBlY3RlZCB0byBiZSB1cGRhdGVkCi0gKiBAdXBkX2J5dGVzOiBob3cgbWFueSBieXRlcyBhcmUgZXhwZWN0ZWQgdG8gYmUgcmVjZWl2ZWQKLSAqIEB1cGRfcmVjZWl2ZWQ6IGhvdyBtYW55IHVwZGF0ZSBieXRlcyB3ZXJlIGFscmVhZHkgcmVjZWl2ZWQKLSAqIEB1cGRfYnVmOiB1cGRhdGUgYnVmZmVyIHdoaWNoIGlzIHVzZWQgdG8gY29sbGVjdCB1cGRhdGUgZGF0YQorICogQGNoX2xudW06IExFQiBudW1iZXIgd2hpY2ggaXMgYmVpbmcgY2hhbmdpbmcgYnkgdGhlIGF0b21pYyBMRUIgY2hhbmdlCisgKiAgICAgICAgICAgb3BlcmF0aW9uCisgKiBAY2hfZHR5cGU6IGRhdGEgcGVyc2lzdGVuY3kgdHlwZSB3aGljaCBpcyBiZWluZyBjaGFuZ2luZyBieSB0aGUgYXRvbWljIExFQgorICogICAgICAgICAgICBjaGFuZ2Ugb3BlcmF0aW9uCisgKiBAdXBkX2J5dGVzOiBob3cgbWFueSBieXRlcyBhcmUgZXhwZWN0ZWQgdG8gYmUgcmVjZWl2ZWQgZm9yIHZvbHVtZSB1cGRhdGUgb3IKKyAqICAgICAgICAgICAgIGF0b21pYyBMRUIgY2hhbmdlCisgKiBAdXBkX3JlY2VpdmVkOiBob3cgbWFueSBieXRlcyB3ZXJlIGFscmVhZHkgcmVjZWl2ZWQgZm9yIHZvbHVtZSB1cGRhdGUgb3IKKyAqICAgICAgICAgICAgICAgIGF0b21pYyBMRUIgY2hhbmdlCisgKiBAdXBkX2J1ZjogdXBkYXRlIGJ1ZmZlciB3aGljaCBpcyB1c2VkIHRvIGNvbGxlY3QgdXBkYXRlIGRhdGEgb3IgZGF0YSBmb3IKKyAqICAgICAgICAgICBhdG9taWMgTEVCIGNoYW5nZQogICoKICAqIEBlYmFfdGJsOiBFQkEgdGFibGUgb2YgdGhpcyB2b2x1bWUgKExFQi0+UEVCIG1hcHBpbmcpCisgKiBAY2hlY2tlZDogJTEgaWYgdGhpcyBzdGF0aWMgdm9sdW1lIHdhcyBjaGVja2VkCisgKiBAY29ycnVwdGVkOiAlMSBpZiB0aGUgdm9sdW1lIGlzIGNvcnJ1cHRlZCAoc3RhdGljIHZvbHVtZXMgb25seSkKKyAqIEB1cGRfbWFya2VyOiAlMSBpZiB0aGUgdXBkYXRlIG1hcmtlciBpcyBzZXQgZm9yIHRoaXMgdm9sdW1lCisgKiBAdXBkYXRpbmc6ICUxIGlmIHRoZSB2b2x1bWUgaXMgYmVpbmcgdXBkYXRlZAorICogQGNoYW5naW5nX2xlYjogJTEgaWYgdGhlIGF0b21pYyBMRUIgY2hhbmdlIGlvY3RsIGNvbW1hbmQgaXMgaW4gcHJvZ3Jlc3MKICAqCiAgKiBAZ2x1ZWJpX2Rlc2M6IGdsdWViaSBVQkkgdm9sdW1lIGRlc2NyaXB0b3IKICAqIEBnbHVlYmlfcmVmY291bnQ6IHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgZ2x1ZWJpIE1URCBkZXZpY2UKQEAgLTE1MCwxMSArMTkzLDEwIEBACiAJc3RydWN0IGNkZXYgY2RldjsKIAlzdHJ1Y3QgdWJpX2RldmljZSAqdWJpOwogCWludCB2b2xfaWQ7CisJaW50IHJlZl9jb3VudDsKIAlpbnQgcmVhZGVyczsKIAlpbnQgd3JpdGVyczsKIAlpbnQgZXhjbHVzaXZlOwotCWludCByZW1vdmVkOwotCWludCBjaGVja2VkOwogCiAJaW50IHJlc2VydmVkX3BlYnM7CiAJaW50IHZvbF90eXBlOwpAQCAtMTYyLDIzICsyMDQsMzEgQEAKIAlpbnQgdXNlZF9lYnM7CiAJaW50IGxhc3RfZWJfYnl0ZXM7CiAJbG9uZyBsb25nIHVzZWRfYnl0ZXM7Ci0JaW50IHVwZF9tYXJrZXI7Ci0JaW50IGNvcnJ1cHRlZDsKIAlpbnQgYWxpZ25tZW50OwogCWludCBkYXRhX3BhZDsKIAlpbnQgbmFtZV9sZW47CiAJY2hhciBuYW1lW1VCSV9WT0xfTkFNRV9NQVgrMV07CiAKLQlpbnQgdXBkYXRpbmc7CiAJaW50IHVwZF9lYnM7CisJaW50IGNoX2xudW07CisJaW50IGNoX2R0eXBlOwogCWxvbmcgbG9uZyB1cGRfYnl0ZXM7CiAJbG9uZyBsb25nIHVwZF9yZWNlaXZlZDsKIAl2b2lkICp1cGRfYnVmOwogCiAJaW50ICplYmFfdGJsOworCWludCBjaGVja2VkOjE7CisJaW50IGNvcnJ1cHRlZDoxOworCWludCB1cGRfbWFya2VyOjE7CisJaW50IHVwZGF0aW5nOjE7CisJaW50IGNoYW5naW5nX2xlYjoxOwogCiAjaWZkZWYgQ09ORklHX01URF9VQklfR0xVRUJJCi0JLyogR2x1ZWJpLXJlbGF0ZWQgc3R1ZmYgbWF5IGJlIGNvbXBpbGVkIG91dCAqLworCS8qCisJICogR2x1ZWJpLXJlbGF0ZWQgc3R1ZmYgbWF5IGJlIGNvbXBpbGVkIG91dC4KKwkgKiBUT0RPOiB0aGlzIHNob3VsZCBub3QgYmUgYnVpbHQgaW50byBVQkkgYnV0IHNob3VsZCBiZSBhIHNlcGFyYXRlCisJICogdWJpbXRkIGRyaXZlciB3aGljaCB3b3JrcyBvbiB0b3Agb2YgVUJJIGFuZCBlbXVsYXRlcyBNVEQgZGV2aWNlcy4KKwkgKi8KIAlzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpnbHVlYmlfZGVzYzsKIAlpbnQgZ2x1ZWJpX3JlZmNvdW50OwogCXN0cnVjdCBtdGRfaW5mbyBnbHVlYmlfbXRkOwpAQCAtMjAwLDI4ICsyNTAsMzEgQEAKIAogLyoqCiAgKiBzdHJ1Y3QgdWJpX2RldmljZSAtIFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gc3RydWN0dXJlCi0gKiBAZGV2OiBjbGFzcyBkZXZpY2Ugb2JqZWN0IHRvIHVzZSB0aGUgdGhlIExpbnV4IGRldmljZSBtb2RlbAorICogQGRldjogVUJJIGRldmljZSBvYmplY3QgdG8gdXNlIHRoZSB0aGUgTGludXggZGV2aWNlIG1vZGVsCiAgKiBAY2RldjogY2hhcmFjdGVyIGRldmljZSBvYmplY3QgdG8gY3JlYXRlIGNoYXJhY3RlciBkZXZpY2UKICAqIEB1YmlfbnVtOiBVQkkgZGV2aWNlIG51bWJlcgogICogQHViaV9uYW1lOiBVQkkgZGV2aWNlIG5hbWUKLSAqIEBtYWpvcjogY2hhcmFjdGVyIGRldmljZSBtYWpvciBudW1iZXIKICAqIEB2b2xfY291bnQ6IG51bWJlciBvZiB2b2x1bWVzIGluIHRoaXMgVUJJIGRldmljZQogICogQHZvbHVtZXM6IHZvbHVtZXMgb2YgdGhpcyBVQkkgZGV2aWNlCiAgKiBAdm9sdW1lc19sb2NrOiBwcm90ZWN0cyBAdm9sdW1lcywgQHJzdmRfcGVicywgQGF2YWlsX3BlYnMsIGJlYl9yc3ZkX3BlYnMsCi0gKiBAYmViX3JzdmRfbGV2ZWwsIEBiYWRfcGViX2NvdW50LCBAZ29vZF9wZWJfY291bnQsIEB2b2xfY291bnQsIEB2b2wtPnJlYWRlcnMsCi0gKiBAdm9sLT53cml0ZXJzLCBAdm9sLT5leGNsdXNpdmUsIEB2b2wtPnJlbW92ZWQsIEB2b2wtPm1hcHBpbmcgYW5kCi0gKiBAdm9sLT5lYmFfdGJsLgorICogICAgICAgICAgICAgICAgQGJlYl9yc3ZkX2xldmVsLCBAYmFkX3BlYl9jb3VudCwgQGdvb2RfcGViX2NvdW50LCBAdm9sX2NvdW50LAorICogICAgICAgICAgICAgICAgQHZvbC0+cmVhZGVycywgQHZvbC0+d3JpdGVycywgQHZvbC0+ZXhjbHVzaXZlLAorICogICAgICAgICAgICAgICAgQHZvbC0+cmVmX2NvdW50LCBAdm9sLT5tYXBwaW5nIGFuZCBAdm9sLT5lYmFfdGJsLgorICogQHJlZl9jb3VudDogY291bnQgb2YgcmVmZXJlbmNlcyBvbiB0aGUgVUJJIGRldmljZQogICoKICAqIEByc3ZkX3BlYnM6IGNvdW50IG9mIHJlc2VydmVkIHBoeXNpY2FsIGVyYXNlYmxvY2tzCiAgKiBAYXZhaWxfcGViczogY291bnQgb2YgYXZhaWxhYmxlIHBoeXNpY2FsIGVyYXNlYmxvY2tzCiAgKiBAYmViX3JzdmRfcGViczogaG93IG1hbnkgcGh5c2ljYWwgZXJhc2VibG9ja3MgYXJlIHJlc2VydmVkIGZvciBiYWQgUEVCCi0gKiBoYW5kbGluZworICogICAgICAgICAgICAgICAgIGhhbmRsaW5nCiAgKiBAYmViX3JzdmRfbGV2ZWw6IG5vcm1hbCBsZXZlbCBvZiBQRUJzIHJlc2VydmVkIGZvciBiYWQgUEVCIGhhbmRsaW5nCiAgKgorICogQGF1dG9yZXNpemVfdm9sX2lkOiBJRCBvZiB0aGUgdm9sdW1lIHdoaWNoIGhhcyB0byBiZSBhdXRvLXJlc2l6ZWQgYXQgdGhlIGVuZAorICogICAgICAgICAgICAgICAgICAgICBvZiBVQkkgaXRpdGlhbGl6ZXRpb24KICAqIEB2dGJsX3Nsb3RzOiBob3cgbWFueSBzbG90cyBhcmUgYXZhaWxhYmxlIGluIHRoZSB2b2x1bWUgdGFibGUKICAqIEB2dGJsX3NpemU6IHNpemUgb2YgdGhlIHZvbHVtZSB0YWJsZSBpbiBieXRlcwogICogQHZ0Ymw6IGluLVJBTSB2b2x1bWUgdGFibGUgY29weQotICogQHZ0YmxfbXV0ZXg6IHByb3RlY3RzIG9uLWZsYXNoIHZvbHVtZSB0YWJsZQorICogQHZvbHVtZXNfbXV0ZXg6IHByb3RlY3RzIG9uLWZsYXNoIHZvbHVtZSB0YWJsZSBhbmQgc2VyaWFsaXplcyB2b2x1bWUKKyAqICAgICAgICAgICAgICAgICBjaGFuZ2VzLCBsaWtlIGNyZWF0aW9uLCBkZWxldGlvbiwgdXBkYXRlLCByZXNpemUKICAqCiAgKiBAbWF4X2VjOiBjdXJyZW50IGhpZ2hlc3QgZXJhc2UgY291bnRlciB2YWx1ZQogICogQG1lYW5fZWM6IGN1cnJlbnQgbWVhbiBlcmFzZSBjb3VudGVyIHZhbHVlCkBAIC0yMzgsMTUgKzI5MSwxNSBAQAogICogQHByb3QucG51bTogcHJvdGVjdGlvbiB0cmVlIGluZGV4ZWQgYnkgcGh5c2ljYWwgZXJhc2VibG9jayBudW1iZXJzCiAgKiBAcHJvdC5hZWM6IHByb3RlY3Rpb24gdHJlZSBpbmRleGVkIGJ5IGFic29sdXRlIGVyYXNlIGNvdW50ZXIgdmFsdWUKICAqIEB3bF9sb2NrOiBwcm90ZWN0cyB0aGUgQHVzZWQsIEBmcmVlLCBAcHJvdCwgQGxvb2t1cHRibCwgQGFic19lYywgQG1vdmVfZnJvbSwKLSAqIEBtb3ZlX3RvLCBAbW92ZV90b19wdXQgQGVyYXNlX3BlbmRpbmcsIEB3bF9zY2hlZHVsZWQsIGFuZCBAd29ya3MKLSAqIGZpZWxkcworICogICAgICAgICAgIEBtb3ZlX3RvLCBAbW92ZV90b19wdXQgQGVyYXNlX3BlbmRpbmcsIEB3bF9zY2hlZHVsZWQsIGFuZCBAd29ya3MKKyAqICAgICAgICAgICBmaWVsZHMKKyAqIEBtb3ZlX211dGV4OiBzZXJpYWxpemVzIGVyYXNlYmxvY2sgbW92ZXMKICAqIEB3bF9zY2hlZHVsZWQ6IG5vbi16ZXJvIGlmIHRoZSB3ZWFyLWxldmVsaW5nIHdhcyBzY2hlZHVsZWQKICAqIEBsb29rdXB0Ymw6IGEgdGFibGUgdG8gcXVpY2tseSBmaW5kIGEgJnN0cnVjdCB1Ymlfd2xfZW50cnkgb2JqZWN0IGZvciBhbnkKLSAqIHBoeXNpY2FsIGVyYXNlYmxvY2sKKyAqICAgICAgICAgICAgIHBoeXNpY2FsIGVyYXNlYmxvY2sKICAqIEBhYnNfZWM6IGFic29sdXRlIGVyYXNlIGNvdW50ZXIKICAqIEBtb3ZlX2Zyb206IHBoeXNpY2FsIGVyYXNlYmxvY2sgZnJvbSB3aGVyZSB0aGUgZGF0YSBpcyBiZWluZyBtb3ZlZAogICogQG1vdmVfdG86IHBoeXNpY2FsIGVyYXNlYmxvY2sgd2hlcmUgdGhlIGRhdGEgaXMgYmVpbmcgbW92ZWQgdG8KLSAqIEBtb3ZlX2Zyb21fcHV0OiBpZiB0aGUgImZyb20iIFBFQiB3YXMgcHV0CiAgKiBAbW92ZV90b19wdXQ6IGlmIHRoZSAidG8iIFBFQiB3YXMgcHV0CiAgKiBAd29ya3M6IGxpc3Qgb2YgcGVuZGluZyB3b3JrcwogICogQHdvcmtzX2NvdW50OiBjb3VudCBvZiBwZW5kaW5nIHdvcmtzCkBAIC0yNzMsMTMgKzMyNiwxMyBAQAogICogQGhkcnNfbWluX2lvX3NpemUKICAqIEB2aWRfaGRyX3NoaWZ0OiBjb250YWlucyBAdmlkX2hkcl9vZmZzZXQgLSBAdmlkX2hkcl9hbG9mZnNldAogICogQGJhZF9hbGxvd2VkOiB3aGV0aGVyIHRoZSBNVEQgZGV2aWNlIGFkbWl0cyBvZiBiYWQgcGh5c2ljYWwgZXJhc2VibG9ja3Mgb3IKLSAqIG5vdAorICogICAgICAgICAgICAgICBub3QKICAqIEBtdGQ6IE1URCBkZXZpY2UgZGVzY3JpcHRvcgogICoKICAqIEBwZWJfYnVmMTogYSBidWZmZXIgb2YgUEVCIHNpemUgdXNlZCBmb3IgZGlmZmVyZW50IHB1cnBvc2VzCiAgKiBAcGViX2J1ZjI6IGFub3RoZXIgYnVmZmVyIG9mIFBFQiBzaXplIHVzZWQgZm9yIGRpZmZlcmVudCBwdXJwb3NlcwogICogQGJ1Zl9tdXRleDogcHJvcHRlY3RzIEBwZWJfYnVmMSBhbmQgQHBlYl9idWYyCi0gKiBAZGJnX3BlYl9idWY6ICBidWZmZXIgb2YgUEVCIHNpemUgdXNlZCBmb3IgZGVidWdnaW5nCisgKiBAZGJnX3BlYl9idWY6IGJ1ZmZlciBvZiBQRUIgc2l6ZSB1c2VkIGZvciBkZWJ1Z2dpbmcKICAqIEBkYmdfYnVmX211dGV4OiBwcm9wdGVjdHMgQGRiZ19wZWJfYnVmCiAgKi8KIHN0cnVjdCB1YmlfZGV2aWNlIHsKQEAgLTI4NywyMiArMzQwLDI0IEBACiAJc3RydWN0IGRldmljZSBkZXY7CiAJaW50IHViaV9udW07CiAJY2hhciB1YmlfbmFtZVtzaXplb2YoVUJJX05BTUVfU1RSKSs1XTsKLQlpbnQgbWFqb3I7CiAJaW50IHZvbF9jb3VudDsKIAlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sdW1lc1tVQklfTUFYX1ZPTFVNRVMrVUJJX0lOVF9WT0xfQ09VTlRdOwogCXNwaW5sb2NrX3Qgdm9sdW1lc19sb2NrOworCWludCByZWZfY291bnQ7CiAKIAlpbnQgcnN2ZF9wZWJzOwogCWludCBhdmFpbF9wZWJzOwogCWludCBiZWJfcnN2ZF9wZWJzOwogCWludCBiZWJfcnN2ZF9sZXZlbDsKIAorCWludCBhdXRvcmVzaXplX3ZvbF9pZDsKIAlpbnQgdnRibF9zbG90czsKIAlpbnQgdnRibF9zaXplOwogCXN0cnVjdCB1YmlfdnRibF9yZWNvcmQgKnZ0Ymw7Ci0Jc3RydWN0IG11dGV4IHZ0YmxfbXV0ZXg7CisJc3RydWN0IG11dGV4IHZvbHVtZXNfbXV0ZXg7CiAKIAlpbnQgbWF4X2VjOworCS8qIFRPRE86IG1lYW5fZWMgaXMgbm90IHVwZGF0ZWQgcnVuLXRpbWUsIGZpeCAqLwogCWludCBtZWFuX2VjOwogCiAJLyogRUJBIHVuaXQncyBzdHVmZiAqLwpAQCAtMzIwLDEyICszNzUsMTMgQEAKIAkJc3RydWN0IHJiX3Jvb3QgYWVjOwogCX0gcHJvdDsKIAlzcGlubG9ja190IHdsX2xvY2s7CisJc3RydWN0IG11dGV4IG1vdmVfbXV0ZXg7CisJc3RydWN0IHJ3X3NlbWFwaG9yZSB3b3JrX3NlbTsKIAlpbnQgd2xfc2NoZWR1bGVkOwogCXN0cnVjdCB1Ymlfd2xfZW50cnkgKipsb29rdXB0Ymw7CiAJdW5zaWduZWQgbG9uZyBsb25nIGFic19lYzsKIAlzdHJ1Y3QgdWJpX3dsX2VudHJ5ICptb3ZlX2Zyb207CiAJc3RydWN0IHViaV93bF9lbnRyeSAqbW92ZV90bzsKLQlpbnQgbW92ZV9mcm9tX3B1dDsKIAlpbnQgbW92ZV90b19wdXQ7CiAJc3RydWN0IGxpc3RfaGVhZCB3b3JrczsKIAlpbnQgd29ya3NfY291bnQ7CkBAIC0zNTUsMTUgKzQxMSwxOSBAQAogCXZvaWQgKnBlYl9idWYxOwogCXZvaWQgKnBlYl9idWYyOwogCXN0cnVjdCBtdXRleCBidWZfbXV0ZXg7CisJc3RydWN0IG11dGV4IGNrdm9sX211dGV4OwogI2lmZGVmIENPTkZJR19NVERfVUJJX0RFQlVHCiAJdm9pZCAqZGJnX3BlYl9idWY7CiAJc3RydWN0IG11dGV4IGRiZ19idWZfbXV0ZXg7CiAjZW5kaWYKIH07CiAKK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqdWJpX3dsX2VudHJ5X3NsYWI7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1YmlfY3RybF9jZGV2X29wZXJhdGlvbnM7CiBleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1YmlfY2Rldl9vcGVyYXRpb25zOwogZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdWJpX3ZvbF9jZGV2X29wZXJhdGlvbnM7CiBleHRlcm4gc3RydWN0IGNsYXNzICp1YmlfY2xhc3M7CitleHRlcm4gc3RydWN0IG11dGV4IHViaV9kZXZpY2VzX211dGV4OwogCiAvKiB2dGJsLmMgKi8KIGludCB1YmlfY2hhbmdlX3Z0YmxfcmVjb3JkKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBpZHgsCkBAIC0zNzQsMTMgKzQzNCwxOCBAQAogaW50IHViaV9jcmVhdGVfdm9sdW1lKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIHN0cnVjdCB1YmlfbWt2b2xfcmVxICpyZXEpOwogaW50IHViaV9yZW1vdmVfdm9sdW1lKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MpOwogaW50IHViaV9yZXNpemVfdm9sdW1lKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MsIGludCByZXNlcnZlZF9wZWJzKTsKLWludCB1YmlfYWRkX3ZvbHVtZShzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgdm9sX2lkKTsKLXZvaWQgdWJpX2ZyZWVfdm9sdW1lKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCB2b2xfaWQpOworaW50IHViaV9hZGRfdm9sdW1lKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIHN0cnVjdCB1Ymlfdm9sdW1lICp2b2wpOwordm9pZCB1YmlfZnJlZV92b2x1bWUoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV92b2x1bWUgKnZvbCk7CiAKIC8qIHVwZC5jICovCi1pbnQgdWJpX3N0YXJ0X3VwZGF0ZShzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgdm9sX2lkLCBsb25nIGxvbmcgYnl0ZXMpOwotaW50IHViaV9tb3JlX3VwZGF0ZV9kYXRhKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCB2b2xfaWQsCitpbnQgdWJpX3N0YXJ0X3VwZGF0ZShzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sLAorCQkgICAgIGxvbmcgbG9uZyBieXRlcyk7CitpbnQgdWJpX21vcmVfdXBkYXRlX2RhdGEoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV92b2x1bWUgKnZvbCwKIAkJCSBjb25zdCB2b2lkIF9fdXNlciAqYnVmLCBpbnQgY291bnQpOworaW50IHViaV9zdGFydF9sZWJfY2hhbmdlKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIHN0cnVjdCB1Ymlfdm9sdW1lICp2b2wsCisJCQkgY29uc3Qgc3RydWN0IHViaV9sZWJfY2hhbmdlX3JlcSAqcmVxKTsKK2ludCB1YmlfbW9yZV9sZWJfY2hhbmdlX2RhdGEoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV92b2x1bWUgKnZvbCwKKwkJCSAgICAgY29uc3Qgdm9pZCBfX3VzZXIgKmJ1ZiwgaW50IGNvdW50KTsKIAogLyogbWlzYy5jICovCiBpbnQgdWJpX2NhbGNfZGF0YV9sZW4oY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuZ3RoKTsKQEAgLTM5OSwxNiArNDY0LDE3IEBACiAjZW5kaWYKIAogLyogZWJhLmMgKi8KLWludCB1YmlfZWJhX3VubWFwX2xlYihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgdm9sX2lkLCBpbnQgbG51bSk7Ci1pbnQgdWJpX2ViYV9yZWFkX2xlYihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgdm9sX2lkLCBpbnQgbG51bSwgdm9pZCAqYnVmLAotCQkgICAgIGludCBvZmZzZXQsIGludCBsZW4sIGludCBjaGVjayk7Ci1pbnQgdWJpX2ViYV93cml0ZV9sZWIoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHZvbF9pZCwgaW50IGxudW0sCitpbnQgdWJpX2ViYV91bm1hcF9sZWIoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV92b2x1bWUgKnZvbCwKKwkJICAgICAgaW50IGxudW0pOworaW50IHViaV9lYmFfcmVhZF9sZWIoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV92b2x1bWUgKnZvbCwgaW50IGxudW0sCisJCSAgICAgdm9pZCAqYnVmLCBpbnQgb2Zmc2V0LCBpbnQgbGVuLCBpbnQgY2hlY2spOworaW50IHViaV9lYmFfd3JpdGVfbGViKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIHN0cnVjdCB1Ymlfdm9sdW1lICp2b2wsIGludCBsbnVtLAogCQkgICAgICBjb25zdCB2b2lkICpidWYsIGludCBvZmZzZXQsIGludCBsZW4sIGludCBkdHlwZSk7Ci1pbnQgdWJpX2ViYV93cml0ZV9sZWJfc3Qoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHZvbF9pZCwgaW50IGxudW0sCi0JCQkgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuLCBpbnQgZHR5cGUsCitpbnQgdWJpX2ViYV93cml0ZV9sZWJfc3Qoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV92b2x1bWUgKnZvbCwKKwkJCSBpbnQgbG51bSwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuLCBpbnQgZHR5cGUsCiAJCQkgaW50IHVzZWRfZWJzKTsKLWludCB1YmlfZWJhX2F0b21pY19sZWJfY2hhbmdlKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCB2b2xfaWQsIGludCBsbnVtLAotCQkJICAgICAgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuLCBpbnQgZHR5cGUpOworaW50IHViaV9lYmFfYXRvbWljX2xlYl9jaGFuZ2Uoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV92b2x1bWUgKnZvbCwKKwkJCSAgICAgIGludCBsbnVtLCBjb25zdCB2b2lkICpidWYsIGludCBsZW4sIGludCBkdHlwZSk7CiBpbnQgdWJpX2ViYV9jb3B5X2xlYihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgZnJvbSwgaW50IHRvLAogCQkgICAgIHN0cnVjdCB1YmlfdmlkX2hkciAqdmlkX2hkcik7CiBpbnQgdWJpX2ViYV9pbml0X3NjYW4oc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV9zY2FuX2luZm8gKnNpKTsKQEAgLTQyMSw2ICs0ODcsNyBAQAogaW50IHViaV93bF9zY3J1Yl9wZWIoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHBudW0pOwogaW50IHViaV93bF9pbml0X3NjYW4oc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV9zY2FuX2luZm8gKnNpKTsKIHZvaWQgdWJpX3dsX2Nsb3NlKHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpOworaW50IHViaV90aHJlYWQodm9pZCAqdSk7CiAKIC8qIGlvLmMgKi8KIGludCB1YmlfaW9fcmVhZChjb25zdCBzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCB2b2lkICpidWYsIGludCBwbnVtLCBpbnQgb2Zmc2V0LApAQCAtNDM5LDYgKzUwNiwxNCBAQAogaW50IHViaV9pb193cml0ZV92aWRfaGRyKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBwbnVtLAogCQkJIHN0cnVjdCB1YmlfdmlkX2hkciAqdmlkX2hkcik7CiAKKy8qIGJ1aWxkLmMgKi8KK2ludCB1YmlfYXR0YWNoX210ZF9kZXYoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCB1YmlfbnVtLCBpbnQgdmlkX2hkcl9vZmZzZXQpOworaW50IHViaV9kZXRhY2hfbXRkX2RldihpbnQgdWJpX251bSwgaW50IGFueXdheSk7CitzdHJ1Y3QgdWJpX2RldmljZSAqdWJpX2dldF9kZXZpY2UoaW50IHViaV9udW0pOwordm9pZCB1YmlfcHV0X2RldmljZShzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKTsKK3N0cnVjdCB1YmlfZGV2aWNlICp1YmlfZ2V0X2J5X21ham9yKGludCBtYWpvcik7CitpbnQgdWJpX21ham9yMm51bShpbnQgbWFqb3IpOworCiAvKgogICogdWJpX3JiX2Zvcl9lYWNoX2VudHJ5IC0gd2FsayBhbiBSQi10cmVlLgogICogQHJiOiBhIHBvaW50ZXIgdG8gdHlwZSAnc3RydWN0IHJiX25vZGUnIHRvIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlcgpAQCAtNTIzLDggKzU5OCwxMCBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgdWJpX3JvX21vZGUoc3RydWN0IHViaV9kZXZpY2UgKnViaSkKIHsKLQl1YmktPnJvX21vZGUgPSAxOwotCXViaV93YXJuKCJzd2l0Y2ggdG8gcmVhZC1vbmx5IG1vZGUiKTsKKwlpZiAoIXViaS0+cm9fbW9kZSkgeworCQl1YmktPnJvX21vZGUgPSAxOworCQl1Ymlfd2Fybigic3dpdGNoIHRvIHJlYWQtb25seSBtb2RlIik7CisJfQogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS91cGQuYyBiL2RyaXZlcnMvbXRkL3ViaS91cGQuYwppbmRleCAwZWZjNTg2Li5kZGFhMWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvdXBkLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL3VwZC5jCkBAIC0yMiw3ICsyMiw4IEBACiAgKi8KIAogLyoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdm9sdW1lIHVwZGF0ZSBmdW5jdGlvbmFsaXR5LgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGltcGxlbWVudGF0aW9uIG9mIHRoZSB2b2x1bWUgdXBkYXRlIGFuZCBhdG9taWMgTEVCIGNoYW5nZQorICogZnVuY3Rpb25hbGl0eS4KICAqCiAgKiBUaGUgdXBkYXRlIG9wZXJhdGlvbiBpcyBiYXNlZCBvbiB0aGUgcGVyLXZvbHVtZSB1cGRhdGUgbWFya2VyIHdoaWNoIGlzCiAgKiBzdG9yZWQgaW4gdGhlIHZvbHVtZSB0YWJsZS4gVGhlIHVwZGF0ZSBtYXJrZXIgaXMgc2V0IGJlZm9yZSB0aGUgdXBkYXRlCkBAIC00NSwyOSArNDYsMzEgQEAKIC8qKgogICogc2V0X3VwZGF0ZV9tYXJrZXIgLSBzZXQgdXBkYXRlIG1hcmtlci4KICAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0Ci0gKiBAdm9sX2lkOiB2b2x1bWUgSUQKKyAqIEB2b2w6IHZvbHVtZSBkZXNjcmlwdGlvbiBvYmplY3QKICAqCi0gKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHVwZGF0ZSBtYXJrZXIgZmxhZyBmb3Igdm9sdW1lIEB2b2xfaWQuIFJldHVybnMgemVybworICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSB1cGRhdGUgbWFya2VyIGZsYWcgZm9yIHZvbHVtZSBAdm9sLiBSZXR1cm5zIHplcm8KICAqIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4KICAqLwotc3RhdGljIGludCBzZXRfdXBkYXRlX21hcmtlcihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgdm9sX2lkKQorc3RhdGljIGludCBzZXRfdXBkYXRlX21hcmtlcihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sKQogewogCWludCBlcnI7CiAJc3RydWN0IHViaV92dGJsX3JlY29yZCB2dGJsX3JlYzsKLQlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sID0gdWJpLT52b2x1bWVzW3ZvbF9pZF07CiAKLQlkYmdfbXNnKCJzZXQgdXBkYXRlIG1hcmtlciBmb3Igdm9sdW1lICVkIiwgdm9sX2lkKTsKKwlkYmdfbXNnKCJzZXQgdXBkYXRlIG1hcmtlciBmb3Igdm9sdW1lICVkIiwgdm9sLT52b2xfaWQpOwogCiAJaWYgKHZvbC0+dXBkX21hcmtlcikgewotCQl1YmlfYXNzZXJ0KHViaS0+dnRibFt2b2xfaWRdLnVwZF9tYXJrZXIpOworCQl1YmlfYXNzZXJ0KHViaS0+dnRibFt2b2wtPnZvbF9pZF0udXBkX21hcmtlcik7CiAJCWRiZ19tc2coImFscmVhZHkgc2V0Iik7CiAJCXJldHVybiAwOwogCX0KIAotCW1lbWNweSgmdnRibF9yZWMsICZ1YmktPnZ0Ymxbdm9sX2lkXSwgc2l6ZW9mKHN0cnVjdCB1YmlfdnRibF9yZWNvcmQpKTsKKwltZW1jcHkoJnZ0YmxfcmVjLCAmdWJpLT52dGJsW3ZvbC0+dm9sX2lkXSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCB1YmlfdnRibF9yZWNvcmQpKTsKIAl2dGJsX3JlYy51cGRfbWFya2VyID0gMTsKIAotCWVyciA9IHViaV9jaGFuZ2VfdnRibF9yZWNvcmQodWJpLCB2b2xfaWQsICZ2dGJsX3JlYyk7CisJbXV0ZXhfbG9jaygmdWJpLT52b2x1bWVzX211dGV4KTsKKwllcnIgPSB1YmlfY2hhbmdlX3Z0YmxfcmVjb3JkKHViaSwgdm9sLT52b2xfaWQsICZ2dGJsX3JlYyk7CisJbXV0ZXhfdW5sb2NrKCZ1YmktPnZvbHVtZXNfbXV0ZXgpOwogCXZvbC0+dXBkX21hcmtlciA9IDE7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTc1LDIzICs3OCwyNCBAQAogLyoqCiAgKiBjbGVhcl91cGRhdGVfbWFya2VyIC0gY2xlYXIgdXBkYXRlIG1hcmtlci4KICAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0Ci0gKiBAdm9sX2lkOiB2b2x1bWUgSUQKKyAqIEB2b2w6IHZvbHVtZSBkZXNjcmlwdGlvbiBvYmplY3QKICAqIEBieXRlczogbmV3IGRhdGEgc2l6ZSBpbiBieXRlcwogICoKLSAqIFRoaXMgZnVuY3Rpb24gY2xlYXJzIHRoZSB1cGRhdGUgbWFya2VyIGZvciB2b2x1bWUgQHZvbF9pZCwgc2V0cyBuZXcgdm9sdW1lCisgKiBUaGlzIGZ1bmN0aW9uIGNsZWFycyB0aGUgdXBkYXRlIG1hcmtlciBmb3Igdm9sdW1lIEB2b2wsIHNldHMgbmV3IHZvbHVtZQogICogZGF0YSBzaXplIGFuZCBjbGVhcnMgdGhlICJjb3JydXB0ZWQiIGZsYWcgKHN0YXRpYyB2b2x1bWVzIG9ubHkpLiBSZXR1cm5zCiAgKiB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4KICAqLwotc3RhdGljIGludCBjbGVhcl91cGRhdGVfbWFya2VyKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCB2b2xfaWQsIGxvbmcgbG9uZyBieXRlcykKK3N0YXRpYyBpbnQgY2xlYXJfdXBkYXRlX21hcmtlcihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sLAorCQkJICAgICAgIGxvbmcgbG9uZyBieXRlcykKIHsKIAlpbnQgZXJyOwogCXVpbnQ2NF90IHRtcDsKIAlzdHJ1Y3QgdWJpX3Z0YmxfcmVjb3JkIHZ0YmxfcmVjOwotCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2wgPSB1YmktPnZvbHVtZXNbdm9sX2lkXTsKIAotCWRiZ19tc2coImNsZWFyIHVwZGF0ZSBtYXJrZXIgZm9yIHZvbHVtZSAlZCIsIHZvbF9pZCk7CisJZGJnX21zZygiY2xlYXIgdXBkYXRlIG1hcmtlciBmb3Igdm9sdW1lICVkIiwgdm9sLT52b2xfaWQpOwogCi0JbWVtY3B5KCZ2dGJsX3JlYywgJnViaS0+dnRibFt2b2xfaWRdLCBzaXplb2Yoc3RydWN0IHViaV92dGJsX3JlY29yZCkpOworCW1lbWNweSgmdnRibF9yZWMsICZ1YmktPnZ0Ymxbdm9sLT52b2xfaWRdLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHViaV92dGJsX3JlY29yZCkpOwogCXViaV9hc3NlcnQodm9sLT51cGRfbWFya2VyICYmIHZ0YmxfcmVjLnVwZF9tYXJrZXIpOwogCXZ0YmxfcmVjLnVwZF9tYXJrZXIgPSAwOwogCkBAIC0xMDYsNyArMTEwLDkgQEAKIAkJCXZvbC0+bGFzdF9lYl9ieXRlcyA9IHZvbC0+dXNhYmxlX2xlYl9zaXplOwogCX0KIAotCWVyciA9IHViaV9jaGFuZ2VfdnRibF9yZWNvcmQodWJpLCB2b2xfaWQsICZ2dGJsX3JlYyk7CisJbXV0ZXhfbG9jaygmdWJpLT52b2x1bWVzX211dGV4KTsKKwllcnIgPSB1YmlfY2hhbmdlX3Z0YmxfcmVjb3JkKHViaSwgdm9sLT52b2xfaWQsICZ2dGJsX3JlYyk7CisJbXV0ZXhfdW5sb2NrKCZ1YmktPnZvbHVtZXNfbXV0ZXgpOwogCXZvbC0+dXBkX21hcmtlciA9IDA7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTExNCwzNSArMTIwLDM2IEBACiAvKioKICAqIHViaV9zdGFydF91cGRhdGUgLSBzdGFydCB2b2x1bWUgdXBkYXRlLgogICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKLSAqIEB2b2xfaWQ6IHZvbHVtZSBJRAorICogQHZvbDogdm9sdW1lIGRlc2NyaXB0aW9uIG9iamVjdAogICogQGJ5dGVzOiB1cGRhdGUgYnl0ZXMKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyB2b2x1bWUgdXBkYXRlIG9wZXJhdGlvbi4gSWYgQGJ5dGVzIGlzIHplcm8sIHRoZSB2b2x1bWUKICAqIGlzIGp1c3Qgd2lwZWQgb3V0LiBSZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKICAqIGluIGNhc2Ugb2YgZmFpbHVyZS4KICAqLwotaW50IHViaV9zdGFydF91cGRhdGUoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHZvbF9pZCwgbG9uZyBsb25nIGJ5dGVzKQoraW50IHViaV9zdGFydF91cGRhdGUoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV92b2x1bWUgKnZvbCwKKwkJICAgICBsb25nIGxvbmcgYnl0ZXMpCiB7CiAJaW50IGksIGVycjsKIAl1aW50NjRfdCB0bXA7Ci0Jc3RydWN0IHViaV92b2x1bWUgKnZvbCA9IHViaS0+dm9sdW1lc1t2b2xfaWRdOwogCi0JZGJnX21zZygic3RhcnQgdXBkYXRlIG9mIHZvbHVtZSAlZCwgJWxsdSBieXRlcyIsIHZvbF9pZCwgYnl0ZXMpOworCWRiZ19tc2coInN0YXJ0IHVwZGF0ZSBvZiB2b2x1bWUgJWQsICVsbHUgYnl0ZXMiLCB2b2wtPnZvbF9pZCwgYnl0ZXMpOworCXViaV9hc3NlcnQoIXZvbC0+dXBkYXRpbmcgJiYgIXZvbC0+Y2hhbmdpbmdfbGViKTsKIAl2b2wtPnVwZGF0aW5nID0gMTsKIAotCWVyciA9IHNldF91cGRhdGVfbWFya2VyKHViaSwgdm9sX2lkKTsKKwllcnIgPSBzZXRfdXBkYXRlX21hcmtlcih1YmksIHZvbCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAogCS8qIEJlZm9yZSB1cGRhdGluZyAtIHdpcGUgb3V0IHRoZSB2b2x1bWUgKi8KIAlmb3IgKGkgPSAwOyBpIDwgdm9sLT5yZXNlcnZlZF9wZWJzOyBpKyspIHsKLQkJZXJyID0gdWJpX2ViYV91bm1hcF9sZWIodWJpLCB2b2xfaWQsIGkpOworCQllcnIgPSB1YmlfZWJhX3VubWFwX2xlYih1YmksIHZvbCwgaSk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwogCX0KIAogCWlmIChieXRlcyA9PSAwKSB7Ci0JCWVyciA9IGNsZWFyX3VwZGF0ZV9tYXJrZXIodWJpLCB2b2xfaWQsIDApOworCQllcnIgPSBjbGVhcl91cGRhdGVfbWFya2VyKHViaSwgdm9sLCAwKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CiAJCWVyciA9IHViaV93bF9mbHVzaCh1YmkpOwpAQCAtMTYzLDkgKzE3MCw0MiBAQAogfQogCiAvKioKKyAqIHViaV9zdGFydF9sZWJfY2hhbmdlIC0gc3RhcnQgYXRvbWljIExFQiBjaGFuZ2UuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHZvbDogdm9sdW1lIGRlc2NyaXB0aW9uIG9iamVjdAorICogQHJlcTogb3BlcmF0aW9uIHJlcXVlc3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyBhdG9taWMgTEVCIGNoYW5nZSBvcGVyYXRpb24uIFJldHVybnMgemVybyBpbiBjYXNlIG9mCisgKiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitpbnQgdWJpX3N0YXJ0X2xlYl9jaGFuZ2Uoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV92b2x1bWUgKnZvbCwKKwkJCSBjb25zdCBzdHJ1Y3QgdWJpX2xlYl9jaGFuZ2VfcmVxICpyZXEpCit7CisJdWJpX2Fzc2VydCghdm9sLT51cGRhdGluZyAmJiAhdm9sLT5jaGFuZ2luZ19sZWIpOworCisJZGJnX21zZygic3RhcnQgY2hhbmdpbmcgTEVCICVkOiVkLCAldSBieXRlcyIsCisJCXZvbC0+dm9sX2lkLCByZXEtPmxudW0sIHJlcS0+Ynl0ZXMpOworCWlmIChyZXEtPmJ5dGVzID09IDApCisJCXJldHVybiB1YmlfZWJhX2F0b21pY19sZWJfY2hhbmdlKHViaSwgdm9sLCByZXEtPmxudW0sIE5VTEwsIDAsCisJCQkJCQkgcmVxLT5kdHlwZSk7CisKKwl2b2wtPnVwZF9ieXRlcyA9IHJlcS0+Ynl0ZXM7CisJdm9sLT51cGRfcmVjZWl2ZWQgPSAwOworCXZvbC0+Y2hhbmdpbmdfbGViID0gMTsKKwl2b2wtPmNoX2xudW0gPSByZXEtPmxudW07CisJdm9sLT5jaF9kdHlwZSA9IHJlcS0+ZHR5cGU7CisKKwl2b2wtPnVwZF9idWYgPSB2bWFsbG9jKHJlcS0+Ynl0ZXMpOworCWlmICghdm9sLT51cGRfYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCisvKioKICAqIHdyaXRlX2xlYiAtIHdyaXRlIHVwZGF0ZSBkYXRhLgogICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKLSAqIEB2b2xfaWQ6IHZvbHVtZSBJRAorICogQHZvbDogdm9sdW1lIGRlc2NyaXB0aW9uIG9iamVjdAogICogQGxudW06IGxvZ2ljYWwgZXJhc2VibG9jayBudW1iZXIKICAqIEBidWY6IGRhdGEgdG8gd3JpdGUKICAqIEBsZW46IGRhdGEgc2l6ZQpAQCAtMTkxLDI2ICsyMzEsMjIgQEAKICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluCiAgKiBjYXNlIG9mIGZhaWx1cmUuCiAgKi8KLXN0YXRpYyBpbnQgd3JpdGVfbGViKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCB2b2xfaWQsIGludCBsbnVtLCB2b2lkICpidWYsCi0JCSAgICAgaW50IGxlbiwgaW50IHVzZWRfZWJzKQorc3RhdGljIGludCB3cml0ZV9sZWIoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV92b2x1bWUgKnZvbCwgaW50IGxudW0sCisJCSAgICAgdm9pZCAqYnVmLCBpbnQgbGVuLCBpbnQgdXNlZF9lYnMpCiB7Ci0JaW50IGVyciwgbDsKLQlzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sID0gdWJpLT52b2x1bWVzW3ZvbF9pZF07CisJaW50IGVycjsKIAogCWlmICh2b2wtPnZvbF90eXBlID09IFVCSV9EWU5BTUlDX1ZPTFVNRSkgewotCQlsID0gQUxJR04obGVuLCB1YmktPm1pbl9pb19zaXplKTsKLQkJbWVtc2V0KGJ1ZiArIGxlbiwgMHhGRiwgbCAtIGxlbik7CisJCWxlbiA9IEFMSUdOKGxlbiwgdWJpLT5taW5faW9fc2l6ZSk7CisJCW1lbXNldChidWYgKyBsZW4sIDB4RkYsIGxlbiAtIGxlbik7CiAKLQkJbCA9IHViaV9jYWxjX2RhdGFfbGVuKHViaSwgYnVmLCBsKTsKLQkJaWYgKGwgPT0gMCkgeworCQlsZW4gPSB1YmlfY2FsY19kYXRhX2xlbih1YmksIGJ1ZiwgbGVuKTsKKwkJaWYgKGxlbiA9PSAwKSB7CiAJCQlkYmdfbXNnKCJhbGwgJWQgYnl0ZXMgY29udGFpbiAweEZGIC0gc2tpcCIsIGxlbik7CiAJCQlyZXR1cm4gMDsKIAkJfQotCQlpZiAobGVuICE9IGwpCi0JCQlkYmdfbXNnKCJza2lwIGxhc3QgJWQgYnl0ZXMgKDB4RkYpIiwgbGVuIC0gbCk7CiAKLQkJZXJyID0gdWJpX2ViYV93cml0ZV9sZWIodWJpLCB2b2xfaWQsIGxudW0sIGJ1ZiwgMCwgbCwKLQkJCQkJVUJJX1VOS05PV04pOworCQllcnIgPSB1YmlfZWJhX3dyaXRlX2xlYih1YmksIHZvbCwgbG51bSwgYnVmLCAwLCBsZW4sIFVCSV9VTktOT1dOKTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBXaGVuIHdyaXRpbmcgc3RhdGljIHZvbHVtZSwgYW5kIHRoaXMgaXMgdGhlIGxhc3QgbG9naWNhbApAQCAtMjIyLDcgKzI1OCw3IEBACiAJCSAqIGNvbnRhaW4gemVyb3MsIG5vdCByYW5kb20gdHJhc2guCiAJCSAqLwogCQltZW1zZXQoYnVmICsgbGVuLCAwLCB2b2wtPnVzYWJsZV9sZWJfc2l6ZSAtIGxlbik7Ci0JCWVyciA9IHViaV9lYmFfd3JpdGVfbGViX3N0KHViaSwgdm9sX2lkLCBsbnVtLCBidWYsIGxlbiwKKwkJZXJyID0gdWJpX2ViYV93cml0ZV9sZWJfc3QodWJpLCB2b2wsIGxudW0sIGJ1ZiwgbGVuLAogCQkJCQkgICBVQklfVU5LTk9XTiwgdXNlZF9lYnMpOwogCX0KIApAQCAtMjM2LDE2ICsyNzIsMTUgQEAKICAqIEBjb3VudDogaG93IG11Y2ggYnl0ZXMgdG8gd3JpdGUKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBtb3JlIGRhdGEgdG8gdGhlIHZvbHVtZSB3aGljaCBpcyBiZWluZyB1cGRhdGVkLiBJdCBtYXkKLSAqIGJlIGNhbGxlZCBhcmJpdHJhcnkgbnVtYmVyIG9mIHRpbWVzIHVudGlsIGFsbCBvZiB0aGUgdXBkYXRlIGRhdGEgYXJyaXZlLgotICogVGhpcyBmdW5jdGlvbiByZXR1cm5zICUwIGluIGNhc2Ugb2Ygc3VjY2VzcywgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gZHVyaW5nCi0gKiB0aGUgbGFzdCBjYWxsIGlmIHRoZSB3aG9sZSB2b2x1bWUgdXBkYXRlIHdhcyBzdWNjZXNzZnVsbHkgZmluaXNoZWQsIGFuZCBhCisgKiBiZSBjYWxsZWQgYXJiaXRyYXJ5IG51bWJlciBvZiB0aW1lcyB1bnRpbCBhbGwgdGhlIHVwZGF0ZSBkYXRhIGFycml2ZWlzLiBUaGlzCisgKiBmdW5jdGlvbiByZXR1cm5zICUwIGluIGNhc2Ugb2Ygc3VjY2VzcywgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gZHVyaW5nIHRoZQorICogbGFzdCBjYWxsIGlmIHRoZSB3aG9sZSB2b2x1bWUgdXBkYXRlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCwgYW5kIGEKICAqIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlLgogICovCi1pbnQgdWJpX21vcmVfdXBkYXRlX2RhdGEoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHZvbF9pZCwKK2ludCB1YmlfbW9yZV91cGRhdGVfZGF0YShzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sLAogCQkJIGNvbnN0IHZvaWQgX191c2VyICpidWYsIGludCBjb3VudCkKIHsKIAl1aW50NjRfdCB0bXA7Ci0Jc3RydWN0IHViaV92b2x1bWUgKnZvbCA9IHViaS0+dm9sdW1lc1t2b2xfaWRdOwogCWludCBsbnVtLCBvZmZzLCBlcnIgPSAwLCBsZW4sIHRvX3dyaXRlID0gY291bnQ7CiAKIAlkYmdfbXNnKCJ3cml0ZSAlZCBvZiAlbGxkIGJ5dGVzLCAlbGxkIGFscmVhZHkgcGFzc2VkIiwKQEAgLTI5MCw4ICszMjUsOCBAQAogCQkJICogaXMgdGhlIGxhc3QgY2h1bmssIGl0J3MgdGltZSB0byBmbHVzaCB0aGUgYnVmZmVyLgogCQkJICovCiAJCQl1YmlfYXNzZXJ0KGZsdXNoX2xlbiA8PSB2b2wtPnVzYWJsZV9sZWJfc2l6ZSk7Ci0JCQllcnIgPSB3cml0ZV9sZWIodWJpLCB2b2xfaWQsIGxudW0sIHZvbC0+dXBkX2J1ZiwKLQkJCQkJZmx1c2hfbGVuLCB2b2wtPnVwZF9lYnMpOworCQkJZXJyID0gd3JpdGVfbGViKHViaSwgdm9sLCBsbnVtLCB2b2wtPnVwZF9idWYsIGZsdXNoX2xlbiwKKwkJCQkJdm9sLT51cGRfZWJzKTsKIAkJCWlmIChlcnIpCiAJCQkJcmV0dXJuIGVycjsKIAkJfQpAQCAtMzE4LDggKzM1Myw4IEBACiAKIAkJaWYgKGxlbiA9PSB2b2wtPnVzYWJsZV9sZWJfc2l6ZSB8fAogCQkgICAgdm9sLT51cGRfcmVjZWl2ZWQgKyBsZW4gPT0gdm9sLT51cGRfYnl0ZXMpIHsKLQkJCWVyciA9IHdyaXRlX2xlYih1YmksIHZvbF9pZCwgbG51bSwgdm9sLT51cGRfYnVmLCBsZW4sCi0JCQkJCXZvbC0+dXBkX2Vicyk7CisJCQllcnIgPSB3cml0ZV9sZWIodWJpLCB2b2wsIGxudW0sIHZvbC0+dXBkX2J1ZiwKKwkJCQkJbGVuLCB2b2wtPnVwZF9lYnMpOwogCQkJaWYgKGVycikKIAkJCQlicmVhazsKIAkJfQpAQCAtMzMzLDE2ICszNjgsNzAgQEAKIAl1YmlfYXNzZXJ0KHZvbC0+dXBkX3JlY2VpdmVkIDw9IHZvbC0+dXBkX2J5dGVzKTsKIAlpZiAodm9sLT51cGRfcmVjZWl2ZWQgPT0gdm9sLT51cGRfYnl0ZXMpIHsKIAkJLyogVGhlIHVwZGF0ZSBpcyBmaW5pc2hlZCwgY2xlYXIgdGhlIHVwZGF0ZSBtYXJrZXIgKi8KLQkJZXJyID0gY2xlYXJfdXBkYXRlX21hcmtlcih1YmksIHZvbF9pZCwgdm9sLT51cGRfYnl0ZXMpOworCQllcnIgPSBjbGVhcl91cGRhdGVfbWFya2VyKHViaSwgdm9sLCB2b2wtPnVwZF9ieXRlcyk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwogCQllcnIgPSB1Ymlfd2xfZmx1c2godWJpKTsKIAkJaWYgKGVyciA9PSAwKSB7CisJCQl2b2wtPnVwZGF0aW5nID0gMDsKIAkJCWVyciA9IHRvX3dyaXRlOwogCQkJdmZyZWUodm9sLT51cGRfYnVmKTsKLQkJCXZvbC0+dXBkYXRpbmcgPSAwOwogCQl9CiAJfQogCiAJcmV0dXJuIGVycjsKIH0KKworLyoqCisgKiB1YmlfbW9yZV9sZWJfY2hhbmdlX2RhdGEgLSBhY2NlcHQgbW9yZSBkYXRhIGZvciBhdG9taWMgTEVCIGNoYW5nZS4KKyAqIEB2b2w6IHZvbHVtZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEBidWY6IHdyaXRlIGRhdGEgKHVzZXItc3BhY2UgbWVtb3J5IGJ1ZmZlcikKKyAqIEBjb3VudDogaG93IG11Y2ggYnl0ZXMgdG8gd3JpdGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFjY2VwdHMgbW9yZSBkYXRhIHRvIHRoZSB2b2x1bWUgd2hpY2ggaXMgYmVpbmcgdW5kZXIgdGhlCisgKiAiYXRvbWljIExFQiBjaGFuZ2UiIG9wZXJhdGlvbi4gSXQgbWF5IGJlIGNhbGxlZCBhcmJpdHJhcnkgbnVtYmVyIG9mIHRpbWVzCisgKiB1bnRpbCBhbGwgZGF0YSBhcnJpdmVzLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgJTAgaW4gY2FzZSBvZiBzdWNjZXNzLCBudW1iZXIKKyAqIG9mIGJ5dGVzIHdyaXR0ZW4gZHVyaW5nIHRoZSBsYXN0IGNhbGwgaWYgdGhlIHdob2xlICJhdG9taWMgTEVCIGNoYW5nZSIKKyAqIG9wZXJhdGlvbiBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZmluaXNoZWQsIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZQorICogb2YgZmFpbHVyZS4KKyAqLworaW50IHViaV9tb3JlX2xlYl9jaGFuZ2VfZGF0YShzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sLAorCQkJICAgICBjb25zdCB2b2lkIF9fdXNlciAqYnVmLCBpbnQgY291bnQpCit7CisJaW50IGVycjsKKworCWRiZ19tc2coIndyaXRlICVkIG9mICVsbGQgYnl0ZXMsICVsbGQgYWxyZWFkeSBwYXNzZWQiLAorCQljb3VudCwgdm9sLT51cGRfYnl0ZXMsIHZvbC0+dXBkX3JlY2VpdmVkKTsKKworCWlmICh1YmktPnJvX21vZGUpCisJCXJldHVybiAtRVJPRlM7CisKKwlpZiAodm9sLT51cGRfcmVjZWl2ZWQgKyBjb3VudCA+IHZvbC0+dXBkX2J5dGVzKQorCQljb3VudCA9IHZvbC0+dXBkX2J5dGVzIC0gdm9sLT51cGRfcmVjZWl2ZWQ7CisKKwllcnIgPSBjb3B5X2Zyb21fdXNlcih2b2wtPnVwZF9idWYgKyB2b2wtPnVwZF9yZWNlaXZlZCwgYnVmLCBjb3VudCk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl2b2wtPnVwZF9yZWNlaXZlZCArPSBjb3VudDsKKworCWlmICh2b2wtPnVwZF9yZWNlaXZlZCA9PSB2b2wtPnVwZF9ieXRlcykgeworCQlpbnQgbGVuID0gQUxJR04oKGludCl2b2wtPnVwZF9ieXRlcywgdWJpLT5taW5faW9fc2l6ZSk7CisKKwkJbWVtc2V0KHZvbC0+dXBkX2J1ZiArIHZvbC0+dXBkX2J5dGVzLCAweEZGLCBsZW4gLSB2b2wtPnVwZF9ieXRlcyk7CisJCWxlbiA9IHViaV9jYWxjX2RhdGFfbGVuKHViaSwgdm9sLT51cGRfYnVmLCBsZW4pOworCQllcnIgPSB1YmlfZWJhX2F0b21pY19sZWJfY2hhbmdlKHViaSwgdm9sLCB2b2wtPmNoX2xudW0sCisJCQkJCQl2b2wtPnVwZF9idWYsIGxlbiwgVUJJX1VOS05PV04pOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwl1YmlfYXNzZXJ0KHZvbC0+dXBkX3JlY2VpdmVkIDw9IHZvbC0+dXBkX2J5dGVzKTsKKwlpZiAodm9sLT51cGRfcmVjZWl2ZWQgPT0gdm9sLT51cGRfYnl0ZXMpIHsKKwkJdm9sLT5jaGFuZ2luZ19sZWIgPSAwOworCQllcnIgPSBjb3VudDsKKwkJdmZyZWUodm9sLT51cGRfYnVmKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL3ZtdC5jIGIvZHJpdmVycy9tdGQvdWJpL3ZtdC5jCmluZGV4IDg4NjI5YTMuLmEzY2EyMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS92bXQuYworKysgYi9kcml2ZXJzL210ZC91Ymkvdm10LmMKQEAgLTYzLDIxICs2MywzMCBAQAogICogQi4gcHJvY2VzcyAyIHJlbW92ZXMgdm9sdW1lIFk7CiAgKiBDLiBwcm9jZXNzIDEgc3RhcnRzIHJlYWRpbmcgdGhlIC88c3lzZnM+L2NsYXNzL3ViaS91YmlYX1kvcmVzZXJ2ZWRfZWJzIGZpbGU7CiAgKgotICogV2hhdCB3ZSB3YW50IHRvIGRvIGluIGEgc2l0dWF0aW9uIGxpa2UgdGhhdCBpcyB0byByZXR1cm4gZXJyb3Igd2hlbiB0aGUgZmlsZQotICogaXMgcmVhZC4gVGhpcyBpcyBkb25lIGJ5IG1lYW5zIG9mIHRoZSAncmVtb3ZlZCcgZmxhZyBhbmQgdGhlICd2b2xfbG9jaycgb2YKLSAqIHRoZSBVQkkgdm9sdW1lIGRlc2NyaXB0aW9uIG9iamVjdC4KKyAqIEluIHRoaXMgc2l0dWF0aW9uLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuICUtRU5PREVWIGJlY2F1c2UgaXQgd2lsbCBmaW5kCisgKiBvdXQgdGhhdCB0aGUgdm9sdW1lIHdhcyByZW1vdmVkIGZyb20gdGhlIEB1YmktPnZvbHVtZXMgYXJyYXkuCiAgKi8KIHN0YXRpYyBzc2l6ZV90IHZvbF9hdHRyaWJ1dGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCWludCByZXQ7CiAJc3RydWN0IHViaV92b2x1bWUgKnZvbCA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB1Ymlfdm9sdW1lLCBkZXYpOworCXN0cnVjdCB1YmlfZGV2aWNlICp1Ymk7CiAKLQlzcGluX2xvY2soJnZvbC0+dWJpLT52b2x1bWVzX2xvY2spOwotCWlmICh2b2wtPnJlbW92ZWQpIHsKLQkJc3Bpbl91bmxvY2soJnZvbC0+dWJpLT52b2x1bWVzX2xvY2spOworCXViaSA9IHViaV9nZXRfZGV2aWNlKHZvbC0+dWJpLT51YmlfbnVtKTsKKwlpZiAoIXViaSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzcGluX2xvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKKwlpZiAoIXViaS0+dm9sdW1lc1t2b2wtPnZvbF9pZF0pIHsKKwkJc3Bpbl91bmxvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKKwkJdWJpX3B1dF9kZXZpY2UodWJpKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQorCS8qIFRha2UgYSByZWZlcmVuY2UgdG8gcHJldmVudCB2b2x1bWUgcmVtb3ZhbCAqLworCXZvbC0+cmVmX2NvdW50ICs9IDE7CisJc3Bpbl91bmxvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKKwogCWlmIChhdHRyID09ICZhdHRyX3ZvbF9yZXNlcnZlZF9lYnMpCiAJCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHZvbC0+cmVzZXJ2ZWRfcGVicyk7CiAJZWxzZSBpZiAoYXR0ciA9PSAmYXR0cl92b2xfdHlwZSkgewpAQCAtOTQsMTUgKzEwMywyMiBAQAogCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2b2wtPmNvcnJ1cHRlZCk7CiAJZWxzZSBpZiAoYXR0ciA9PSAmYXR0cl92b2xfYWxpZ25tZW50KQogCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2b2wtPmFsaWdubWVudCk7Ci0JZWxzZSBpZiAoYXR0ciA9PSAmYXR0cl92b2xfdXNhYmxlX2ViX3NpemUpIHsKKwllbHNlIGlmIChhdHRyID09ICZhdHRyX3ZvbF91c2FibGVfZWJfc2l6ZSkKIAkJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgdm9sLT51c2FibGVfbGViX3NpemUpOwotCX0gZWxzZSBpZiAoYXR0ciA9PSAmYXR0cl92b2xfZGF0YV9ieXRlcykKKwllbHNlIGlmIChhdHRyID09ICZhdHRyX3ZvbF9kYXRhX2J5dGVzKQogCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVsbGRcbiIsIHZvbC0+dXNlZF9ieXRlcyk7CiAJZWxzZSBpZiAoYXR0ciA9PSAmYXR0cl92b2xfdXBkX21hcmtlcikKIAkJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgdm9sLT51cGRfbWFya2VyKTsKIAllbHNlCi0JCUJVRygpOwotCXNwaW5fdW5sb2NrKCZ2b2wtPnViaS0+dm9sdW1lc19sb2NrKTsKKwkJLyogVGhpcyBtdXN0IGJlIGEgYnVnICovCisJCXJldCA9IC1FSU5WQUw7CisKKwkvKiBXZSd2ZSBkb25lIHRoZSBvcGVyYXRpb24sIGRyb3Agdm9sdW1lIGFuZCBVQkkgZGV2aWNlIHJlZmVyZW5jZXMgKi8KKwlzcGluX2xvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKKwl2b2wtPnJlZl9jb3VudCAtPSAxOworCXViaV9hc3NlcnQodm9sLT5yZWZfY291bnQgPj0gMCk7CisJc3Bpbl91bmxvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKKwl1YmlfcHV0X2RldmljZSh1YmkpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTExMCw3ICsxMjYsNyBAQAogc3RhdGljIHZvaWQgdm9sX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2wgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgdWJpX3ZvbHVtZSwgZGV2KTsKLQl1YmlfYXNzZXJ0KHZvbC0+cmVtb3ZlZCk7CisKIAlrZnJlZSh2b2wpOwogfQogCkBAIC0xNTIsOSArMTY4LDcgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmdm9sLT5kZXYsICZhdHRyX3ZvbF91cGRfbWFya2VyKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCXJldHVybiAwOworCXJldHVybiBlcnI7CiB9CiAKIC8qKgpAQCAtMTgwLDE2ICsxOTQsMTggQEAKICAqIEByZXE6IHZvbHVtZSBjcmVhdGlvbiByZXF1ZXN0CiAgKgogICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIHZvbHVtZSBkZXNjcmliZWQgYnkgQHJlcS4gSWYgQHJlcS0+dm9sX2lkIGlkCi0gKiAlVUJJX1ZPTF9OVU1fQVVUTywgdGhpcyBmdW5jdGlvbiBhdXRvbWF0aWNhbGx5IGFzc2lnbmUgSUQgdG8gdGhlIG5ldyB2b2x1bWUKKyAqICVVQklfVk9MX05VTV9BVVRPLCB0aGlzIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgYXNzaWduIElEIHRvIHRoZSBuZXcgdm9sdW1lCiAgKiBhbmQgc2F2ZXMgaXQgaW4gQHJlcS0+dm9sX2lkLiBSZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlCi0gKiBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlLiBOb3RlLCB0aGUgY2FsbGVyIGhhcyB0byBoYXZlIHRoZQorICogQHViaS0+dm9sdW1lc19tdXRleCBsb2NrZWQuCiAgKi8KIGludCB1YmlfY3JlYXRlX3ZvbHVtZShzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBzdHJ1Y3QgdWJpX21rdm9sX3JlcSAqcmVxKQogewotCWludCBpLCBlcnIsIHZvbF9pZCA9IHJlcS0+dm9sX2lkOworCWludCBpLCBlcnIsIHZvbF9pZCA9IHJlcS0+dm9sX2lkLCBkb250X2ZyZWUgPSAwOwogCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2w7CiAJc3RydWN0IHViaV92dGJsX3JlY29yZCB2dGJsX3JlYzsKIAl1aW50NjRfdCBieXRlczsKKwlkZXZfdCBkZXY7CiAKIAlpZiAodWJpLT5yb19tb2RlKQogCQlyZXR1cm4gLUVST0ZTOwpAQCAtMTk5LDcgKzIxNSw2IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJc3Bpbl9sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7Ci0KIAlpZiAodm9sX2lkID09IFVCSV9WT0xfTlVNX0FVVE8pIHsKIAkJLyogRmluZCB1bnVzZWQgdm9sdW1lIElEICovCiAJCWRiZ19tc2coInNlYXJjaCBmb3IgdmFjYW50IHZvbHVtZSBJRCIpOwpAQCAtMjUyLDYgKzI2Nyw3IEBACiAJfQogCXViaS0+YXZhaWxfcGVicyAtPSB2b2wtPnJlc2VydmVkX3BlYnM7CiAJdWJpLT5yc3ZkX3BlYnMgKz0gdm9sLT5yZXNlcnZlZF9wZWJzOworCXNwaW5fdW5sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7CiAKIAl2b2wtPnZvbF9pZCAgICA9IHZvbF9pZDsKIAl2b2wtPmFsaWdubWVudCA9IHJlcS0+YWxpZ25tZW50OwpAQCAtMjU5LDEwICsyNzUsNyBAQAogCXZvbC0+dm9sX3R5cGUgID0gcmVxLT52b2xfdHlwZTsKIAl2b2wtPm5hbWVfbGVuICA9IHJlcS0+bmFtZV9sZW47CiAJbWVtY3B5KHZvbC0+bmFtZSwgcmVxLT5uYW1lLCB2b2wtPm5hbWVfbGVuICsgMSk7Ci0Jdm9sLT5leGNsdXNpdmUgPSAxOwogCXZvbC0+dWJpID0gdWJpOwotCXViaS0+dm9sdW1lc1t2b2xfaWRdID0gdm9sOwotCXNwaW5fdW5sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7CiAKIAkvKgogCSAqIEZpbmlzaCBhbGwgcGVuZGluZyBlcmFzZXMgYmVjYXVzZSB0aGVyZSBtYXkgYmUgc29tZSBMRUJzIGJlbG9uZ2luZwpAQCAtMjk5LDkgKzMxMiwxMCBAQAogCS8qIFJlZ2lzdGVyIGNoYXJhY3RlciBkZXZpY2UgZm9yIHRoZSB2b2x1bWUgKi8KIAljZGV2X2luaXQoJnZvbC0+Y2RldiwgJnViaV92b2xfY2Rldl9vcGVyYXRpb25zKTsKIAl2b2wtPmNkZXYub3duZXIgPSBUSElTX01PRFVMRTsKLQllcnIgPSBjZGV2X2FkZCgmdm9sLT5jZGV2LCBNS0RFVih1YmktPm1ham9yLCB2b2xfaWQgKyAxKSwgMSk7CisJZGV2ID0gTUtERVYoTUFKT1IodWJpLT5jZGV2LmRldiksIHZvbF9pZCArIDEpOworCWVyciA9IGNkZXZfYWRkKCZ2b2wtPmNkZXYsIGRldiwgMSk7CiAJaWYgKGVycikgewotCQl1YmlfZXJyKCJjYW5ub3QgYWRkIGNoYXJhY3RlciBkZXZpY2UgZm9yIHZvbHVtZSAlZCIsIHZvbF9pZCk7CisJCXViaV9lcnIoImNhbm5vdCBhZGQgY2hhcmFjdGVyIGRldmljZSIpOwogCQlnb3RvIG91dF9tYXBwaW5nOwogCX0KIApAQCAtMzExLDEyICszMjUsMTUgQEAKIAogCXZvbC0+ZGV2LnJlbGVhc2UgPSB2b2xfcmVsZWFzZTsKIAl2b2wtPmRldi5wYXJlbnQgPSAmdWJpLT5kZXY7Ci0Jdm9sLT5kZXYuZGV2dCA9IE1LREVWKHViaS0+bWFqb3IsIHZvbC0+dm9sX2lkICsgMSk7CisJdm9sLT5kZXYuZGV2dCA9IGRldjsKIAl2b2wtPmRldi5jbGFzcyA9IHViaV9jbGFzczsKKwogCXNwcmludGYoJnZvbC0+ZGV2LmJ1c19pZFswXSwgIiVzXyVkIiwgdWJpLT51YmlfbmFtZSwgdm9sLT52b2xfaWQpOwogCWVyciA9IGRldmljZV9yZWdpc3Rlcigmdm9sLT5kZXYpOwotCWlmIChlcnIpCisJaWYgKGVycikgeworCQl1YmlfZXJyKCJjYW5ub3QgcmVnaXN0ZXIgZGV2aWNlIik7CiAJCWdvdG8gb3V0X2dsdWViaTsKKwl9CiAKIAllcnIgPSB2b2x1bWVfc3lzZnNfaW5pdCh1YmksIHZvbCk7CiAJaWYgKGVycikKQEAgLTMzOSwxNSArMzU2LDI3IEBACiAJCWdvdG8gb3V0X3N5c2ZzOwogCiAJc3Bpbl9sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7CisJdWJpLT52b2x1bWVzW3ZvbF9pZF0gPSB2b2w7CiAJdWJpLT52b2xfY291bnQgKz0gMTsKLQl2b2wtPmV4Y2x1c2l2ZSA9IDA7CiAJc3Bpbl91bmxvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKIAogCXBhcmFub2lkX2NoZWNrX3ZvbHVtZXModWJpKTsKIAlyZXR1cm4gMDsKIAorb3V0X3N5c2ZzOgorCS8qCisJICogV2UgaGF2ZSByZWdpc3RlcmVkIG91ciBkZXZpY2UsIHdlIHNob3VsZCBub3QgZnJlZSB0aGUgdm9sdW1lKgorCSAqIGRlc2NyaXB0aW9uIG9iamVjdCBpbiB0aGlzIGZ1bmN0aW9uIGluIGNhc2Ugb2YgYW4gZXJyb3IgLSBpdCBpcworCSAqIGZyZWVkIGJ5IHRoZSByZWxlYXNlIGZ1bmN0aW9uLgorCSAqCisJICogR2V0IGRldmljZSByZWZlcmVuY2UgdG8gcHJldmVudCB0aGUgcmVsZWFzZSBmdW5jdGlvbiBmcm9tIGJlaW5nCisJICogY2FsbGVkIGp1c3QgYWZ0ZXIgc3lzZnMgaGFzIGJlZW4gY2xvc2VkLgorCSAqLworCWRvbnRfZnJlZSA9IDE7CisJZ2V0X2RldmljZSgmdm9sLT5kZXYpOworCXZvbHVtZV9zeXNmc19jbG9zZSh2b2wpOwogb3V0X2dsdWViaToKLQllcnIgPSB1YmlfZGVzdHJveV9nbHVlYmkodm9sKTsKKwl1YmlfZGVzdHJveV9nbHVlYmkodm9sKTsKIG91dF9jZGV2OgogCWNkZXZfZGVsKCZ2b2wtPmNkZXYpOwogb3V0X21hcHBpbmc6CkBAIC0zNTYsMjYgKzM4NSwxMyBAQAogCXNwaW5fbG9jaygmdWJpLT52b2x1bWVzX2xvY2spOwogCXViaS0+cnN2ZF9wZWJzIC09IHZvbC0+cmVzZXJ2ZWRfcGViczsKIAl1YmktPmF2YWlsX3BlYnMgKz0gdm9sLT5yZXNlcnZlZF9wZWJzOwotCXViaS0+dm9sdW1lc1t2b2xfaWRdID0gTlVMTDsKIG91dF91bmxvY2s6CiAJc3Bpbl91bmxvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKLQlrZnJlZSh2b2wpOwotCXJldHVybiBlcnI7Ci0KLQkvKgotCSAqIFdlIGFyZSByZWdpc3RlcmVkLCBzbyBAdm9sIGlzIGRlc3Ryb3llZCBpbiB0aGUgcmVsZWFzZSBmdW5jdGlvbiBhbmQKLQkgKiB3ZSBoYXZlIHRvIGRlLWluaXRpYWxpemUgZGlmZmVyZW50bHkuCi0JICovCi1vdXRfc3lzZnM6Ci0JZXJyID0gdWJpX2Rlc3Ryb3lfZ2x1ZWJpKHZvbCk7Ci0JY2Rldl9kZWwoJnZvbC0+Y2Rldik7Ci0Ja2ZyZWUodm9sLT5lYmFfdGJsKTsKLQlzcGluX2xvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKLQl1YmktPnJzdmRfcGVicyAtPSB2b2wtPnJlc2VydmVkX3BlYnM7Ci0JdWJpLT5hdmFpbF9wZWJzICs9IHZvbC0+cmVzZXJ2ZWRfcGViczsKLQl1YmktPnZvbHVtZXNbdm9sX2lkXSA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKLQl2b2x1bWVfc3lzZnNfY2xvc2Uodm9sKTsKKwlpZiAoZG9udF9mcmVlKQorCQlwdXRfZGV2aWNlKCZ2b2wtPmRldik7CisJZWxzZQorCQlrZnJlZSh2b2wpOworCXViaV9lcnIoImNhbm5vdCBjcmVhdGUgdm9sdW1lICVkLCBlcnJvciAlZCIsIHZvbF9pZCwgZXJyKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0zODUsNyArNDAxLDggQEAKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgdm9sdW1lIGRlc2NyaWJlZCBieSBAZGVzYy4gVGhlIHZvbHVtZSBoYXMgdG8gYmUgb3BlbmVkCiAgKiBpbiAiZXhjbHVzaXZlIiBtb2RlLiBSZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yCi0gKiBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlLiBUaGUgY2FsbGVyIGhhcyB0byBoYXZlIHRoZSBAdWJpLT52b2x1bWVzX211dGV4CisgKiBsb2NrZWQuCiAgKi8KIGludCB1YmlfcmVtb3ZlX3ZvbHVtZShzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpkZXNjKQogewpAQCAtNDAwLDMwICs0MTcsMzYgQEAKIAlpZiAodWJpLT5yb19tb2RlKQogCQlyZXR1cm4gLUVST0ZTOwogCisJc3Bpbl9sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7CisJaWYgKHZvbC0+cmVmX2NvdW50ID4gMSkgeworCQkvKgorCQkgKiBUaGUgdm9sdW1lIGlzIGJ1c3ksIHByb2JhYmx5IHNvbWVvbmUgaXMgcmVhZGluZyBvbmUgb2YgaXRzCisJCSAqIHN5c2ZzIGZpbGVzLgorCQkgKi8KKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXViaS0+dm9sdW1lc1t2b2xfaWRdID0gTlVMTDsKKwlzcGluX3VubG9jaygmdWJpLT52b2x1bWVzX2xvY2spOworCiAJZXJyID0gdWJpX2Rlc3Ryb3lfZ2x1ZWJpKHZvbCk7CiAJaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwkJZ290byBvdXRfZXJyOwogCiAJZXJyID0gdWJpX2NoYW5nZV92dGJsX3JlY29yZCh1YmksIHZvbF9pZCwgTlVMTCk7CiAJaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwkJZ290byBvdXRfZXJyOwogCiAJZm9yIChpID0gMDsgaSA8IHZvbC0+cmVzZXJ2ZWRfcGViczsgaSsrKSB7Ci0JCWVyciA9IHViaV9lYmFfdW5tYXBfbGViKHViaSwgdm9sX2lkLCBpKTsKKwkJZXJyID0gdWJpX2ViYV91bm1hcF9sZWIodWJpLCB2b2wsIGkpOwogCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKKwkJCWdvdG8gb3V0X2VycjsKIAl9CiAKLQlzcGluX2xvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKLQl2b2wtPnJlbW92ZWQgPSAxOwotCXViaS0+dm9sdW1lc1t2b2xfaWRdID0gTlVMTDsKLQlzcGluX3VubG9jaygmdWJpLT52b2x1bWVzX2xvY2spOwotCiAJa2ZyZWUodm9sLT5lYmFfdGJsKTsKIAl2b2wtPmViYV90YmwgPSBOVUxMOwogCWNkZXZfZGVsKCZ2b2wtPmNkZXYpOwogCXZvbHVtZV9zeXNmc19jbG9zZSh2b2wpOwotCWtmcmVlKGRlc2MpOwogCiAJc3Bpbl9sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7CiAJdWJpLT5yc3ZkX3BlYnMgLT0gcmVzZXJ2ZWRfcGViczsKQEAgLTQ0MSw4ICs0NjQsMTUgQEAKIAlzcGluX3VubG9jaygmdWJpLT52b2x1bWVzX2xvY2spOwogCiAJcGFyYW5vaWRfY2hlY2tfdm9sdW1lcyh1YmkpOwotCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwogCXJldHVybiAwOworCitvdXRfZXJyOgorCXViaV9lcnIoImNhbm5vdCByZW1vdmUgdm9sdW1lICVkLCBlcnJvciAlZCIsIHZvbF9pZCwgZXJyKTsKKwlzcGluX2xvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKKwl1YmktPnZvbHVtZXNbdm9sX2lkXSA9IHZvbDsKK291dF91bmxvY2s6CisJc3Bpbl91bmxvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKKwlyZXR1cm4gZXJyOwogfQogCiAvKioKQEAgLTQ1MCw4ICs0ODAsOSBAQAogICogQGRlc2M6IHZvbHVtZSBkZXNjcmlwdG9yCiAgKiBAcmVzZXJ2ZWRfcGViczogbmV3IHNpemUgaW4gcGh5c2ljYWwgZXJhc2VibG9ja3MKICAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4KLSAqIGNhc2Ugb2YgZmFpbHVyZS4KKyAqIFRoaXMgZnVuY3Rpb24gcmUtc2l6ZXMgdGhlIHZvbHVtZSBhbmQgcmV0dXJucyB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2VzcywgYW5kIGEKKyAqIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlLiBUaGUgY2FsbGVyIGhhcyB0byBoYXZlIHRoZQorICogQHViaS0+dm9sdW1lc19tdXRleCBsb2NrZWQuCiAgKi8KIGludCB1YmlfcmVzaXplX3ZvbHVtZShzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpkZXNjLCBpbnQgcmVzZXJ2ZWRfcGVicykKIHsKQEAgLTQ2Niw4ICs0OTcsNiBAQAogCiAJZGJnX21zZygicmUtc2l6ZSB2b2x1bWUgJWQgdG8gZnJvbSAlZCB0byAlZCBQRUJzIiwKIAkJdm9sX2lkLCB2b2wtPnJlc2VydmVkX3BlYnMsIHJlc2VydmVkX3BlYnMpOwotCXViaV9hc3NlcnQoZGVzYy0+bW9kZSA9PSBVQklfRVhDTFVTSVZFKTsKLQl1YmlfYXNzZXJ0KHZvbCA9PSB1YmktPnZvbHVtZXNbdm9sX2lkXSk7CiAKIAlpZiAodm9sLT52b2xfdHlwZSA9PSBVQklfU1RBVElDX1ZPTFVNRSAmJgogCSAgICByZXNlcnZlZF9wZWJzIDwgdm9sLT51c2VkX2VicykgewpAQCAtNDg3LDYgKzUxNiwxNCBAQAogCWZvciAoaSA9IDA7IGkgPCByZXNlcnZlZF9wZWJzOyBpKyspCiAJCW5ld19tYXBwaW5nW2ldID0gVUJJX0xFQl9VTk1BUFBFRDsKIAorCXNwaW5fbG9jaygmdWJpLT52b2x1bWVzX2xvY2spOworCWlmICh2b2wtPnJlZl9jb3VudCA+IDEpIHsKKwkJc3Bpbl91bmxvY2soJnViaS0+dm9sdW1lc19sb2NrKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dF9mcmVlOworCX0KKwlzcGluX3VubG9jaygmdWJpLT52b2x1bWVzX2xvY2spOworCiAJLyogUmVzZXJ2ZSBwaHlzaWNhbCBlcmFzZWJsb2NrcyAqLwogCXBlYnMgPSByZXNlcnZlZF9wZWJzIC0gdm9sLT5yZXNlcnZlZF9wZWJzOwogCWlmIChwZWJzID4gMCkgewpAQCAtNTE2LDcgKzU1Myw3IEBACiAKIAlpZiAocGVicyA8IDApIHsKIAkJZm9yIChpID0gMDsgaSA8IC1wZWJzOyBpKyspIHsKLQkJCWVyciA9IHViaV9lYmFfdW5tYXBfbGViKHViaSwgdm9sX2lkLCByZXNlcnZlZF9wZWJzICsgaSk7CisJCQllcnIgPSB1YmlfZWJhX3VubWFwX2xlYih1YmksIHZvbCwgcmVzZXJ2ZWRfcGVicyArIGkpOwogCQkJaWYgKGVycikKIAkJCQlnb3RvIG91dF9hY2M7CiAJCX0KQEAgLTU2NSwyNyArNjAyLDI4IEBACiAvKioKICAqIHViaV9hZGRfdm9sdW1lIC0gYWRkIHZvbHVtZS4KICAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0Ci0gKiBAdm9sX2lkOiB2b2x1bWUgSUQKKyAqIEB2b2w6IHZvbHVtZSBkZXNjcmlwdGlvbiBvYmplY3QKICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGFkZHMgYW4gZXhpc3RpbiB2b2x1bWUgYW5kIGluaXRpYWxpemVzIGFsbCBpdHMgZGF0YQotICogc3RydWN0dXJlcy4gUmV0dXJuZXMgemVybyBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbgorICogVGhpcyBmdW5jdGlvbiBhZGRzIGFuIGV4aXN0aW5nIHZvbHVtZSBhbmQgaW5pdGlhbGl6ZXMgYWxsIGl0cyBkYXRhCisgKiBzdHJ1Y3R1cmVzLiBSZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4KICAqIGNhc2Ugb2YgZmFpbHVyZS4KICAqLwotaW50IHViaV9hZGRfdm9sdW1lKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCB2b2xfaWQpCitpbnQgdWJpX2FkZF92b2x1bWUoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV92b2x1bWUgKnZvbCkKIHsKLQlpbnQgZXJyOwotCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2wgPSB1YmktPnZvbHVtZXNbdm9sX2lkXTsKKwlpbnQgZXJyLCB2b2xfaWQgPSB2b2wtPnZvbF9pZDsKKwlkZXZfdCBkZXY7CiAKIAlkYmdfbXNnKCJhZGQgdm9sdW1lICVkIiwgdm9sX2lkKTsKIAl1YmlfZGJnX2R1bXBfdm9sX2luZm8odm9sKTsKLQl1YmlfYXNzZXJ0KHZvbCk7CiAKIAkvKiBSZWdpc3RlciBjaGFyYWN0ZXIgZGV2aWNlIGZvciB0aGUgdm9sdW1lICovCiAJY2Rldl9pbml0KCZ2b2wtPmNkZXYsICZ1Ymlfdm9sX2NkZXZfb3BlcmF0aW9ucyk7CiAJdm9sLT5jZGV2Lm93bmVyID0gVEhJU19NT0RVTEU7Ci0JZXJyID0gY2Rldl9hZGQoJnZvbC0+Y2RldiwgTUtERVYodWJpLT5tYWpvciwgdm9sLT52b2xfaWQgKyAxKSwgMSk7CisJZGV2ID0gTUtERVYoTUFKT1IodWJpLT5jZGV2LmRldiksIHZvbC0+dm9sX2lkICsgMSk7CisJZXJyID0gY2Rldl9hZGQoJnZvbC0+Y2RldiwgZGV2LCAxKTsKIAlpZiAoZXJyKSB7Ci0JCXViaV9lcnIoImNhbm5vdCBhZGQgY2hhcmFjdGVyIGRldmljZSBmb3Igdm9sdW1lICVkIiwgdm9sX2lkKTsKKwkJdWJpX2VycigiY2Fubm90IGFkZCBjaGFyYWN0ZXIgZGV2aWNlIGZvciB2b2x1bWUgJWQsIGVycm9yICVkIiwKKwkJCXZvbF9pZCwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTU5NSw3ICs2MzMsNyBAQAogCiAJdm9sLT5kZXYucmVsZWFzZSA9IHZvbF9yZWxlYXNlOwogCXZvbC0+ZGV2LnBhcmVudCA9ICZ1YmktPmRldjsKLQl2b2wtPmRldi5kZXZ0ID0gTUtERVYodWJpLT5tYWpvciwgdm9sLT52b2xfaWQgKyAxKTsKKwl2b2wtPmRldi5kZXZ0ID0gZGV2OwogCXZvbC0+ZGV2LmNsYXNzID0gdWJpX2NsYXNzOwogCXNwcmludGYoJnZvbC0+ZGV2LmJ1c19pZFswXSwgIiVzXyVkIiwgdWJpLT51YmlfbmFtZSwgdm9sLT52b2xfaWQpOwogCWVyciA9IGRldmljZV9yZWdpc3Rlcigmdm9sLT5kZXYpOwpAQCAtNjIzLDIyICs2NjEsMTkgQEAKIC8qKgogICogdWJpX2ZyZWVfdm9sdW1lIC0gZnJlZSB2b2x1bWUuCiAgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAotICogQHZvbF9pZDogdm9sdW1lIElECisgKiBAdm9sOiB2b2x1bWUgZGVzY3JpcHRpb24gb2JqZWN0CiAgKgotICogVGhpcyBmdW5jdGlvbiBmcmVlcyBhbGwgcmVzb3VyY2VzIGZvciB2b2x1bWUgQHZvbF9pZCBidXQgZG9lcyBub3QgcmVtb3ZlIGl0LgorICogVGhpcyBmdW5jdGlvbiBmcmVlcyBhbGwgcmVzb3VyY2VzIGZvciB2b2x1bWUgQHZvbCBidXQgZG9lcyBub3QgcmVtb3ZlIGl0LgogICogVXNlZCBvbmx5IHdoZW4gdGhlIFVCSSBkZXZpY2UgaXMgZGV0YWNoZWQuCiAgKi8KLXZvaWQgdWJpX2ZyZWVfdm9sdW1lKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCB2b2xfaWQpCit2b2lkIHViaV9mcmVlX3ZvbHVtZShzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBzdHJ1Y3QgdWJpX3ZvbHVtZSAqdm9sKQogewogCWludCBlcnI7Ci0Jc3RydWN0IHViaV92b2x1bWUgKnZvbCA9IHViaS0+dm9sdW1lc1t2b2xfaWRdOwogCi0JZGJnX21zZygiZnJlZSB2b2x1bWUgJWQiLCB2b2xfaWQpOwotCXViaV9hc3NlcnQodm9sKTsKKwlkYmdfbXNnKCJmcmVlIHZvbHVtZSAlZCIsIHZvbC0+dm9sX2lkKTsKIAotCXZvbC0+cmVtb3ZlZCA9IDE7CisJdWJpLT52b2x1bWVzW3ZvbC0+dm9sX2lkXSA9IE5VTEw7CiAJZXJyID0gdWJpX2Rlc3Ryb3lfZ2x1ZWJpKHZvbCk7Ci0JdWJpLT52b2x1bWVzW3ZvbF9pZF0gPSBOVUxMOwogCWNkZXZfZGVsKCZ2b2wtPmNkZXYpOwogCXZvbHVtZV9zeXNmc19jbG9zZSh2b2wpOwogfQpAQCAtNzA4LDExICs3NDMsNiBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JaWYgKHZvbC0+dXBkX21hcmtlciAhPSAwICYmIHZvbC0+dXBkX21hcmtlciAhPSAxKSB7Ci0JCXViaV9lcnIoImJhZCB1cGRfbWFya2VyIik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KIAlpZiAodm9sLT51cGRfbWFya2VyICYmIHZvbC0+Y29ycnVwdGVkKSB7CiAJCWRiZ19lcnIoInVwZGF0ZSBtYXJrZXIgYW5kIGNvcnJ1cHRlZCBzaW11bHRhbmVvdXNseSIpOwogCQlnb3RvIGZhaWw7CkBAIC03NDcsNyArNzc3LDcgQEAKIAogCW4gPSAobG9uZyBsb25nKXZvbC0+dXNlZF9lYnMgKiB2b2wtPnVzYWJsZV9sZWJfc2l6ZTsKIAlpZiAodm9sLT52b2xfdHlwZSA9PSBVQklfRFlOQU1JQ19WT0xVTUUpIHsKLQkJaWYgKHZvbC0+Y29ycnVwdGVkICE9IDApIHsKKwkJaWYgKHZvbC0+Y29ycnVwdGVkKSB7CiAJCQl1YmlfZXJyKCJjb3JydXB0ZWQgZHluYW1pYyB2b2x1bWUiKTsKIAkJCWdvdG8gZmFpbDsKIAkJfQpAQCAtNzY0LDEwICs3OTQsNiBAQAogCQkJZ290byBmYWlsOwogCQl9CiAJfSBlbHNlIHsKLQkJaWYgKHZvbC0+Y29ycnVwdGVkICE9IDAgJiYgdm9sLT5jb3JydXB0ZWQgIT0gMSkgewotCQkJdWJpX2VycigiYmFkIGNvcnJ1cHRlZCIpOwotCQkJZ290byBmYWlsOwotCQl9CiAJCWlmICh2b2wtPnVzZWRfZWJzIDwgMCB8fCB2b2wtPnVzZWRfZWJzID4gdm9sLT5yZXNlcnZlZF9wZWJzKSB7CiAJCQl1YmlfZXJyKCJiYWQgdXNlZF9lYnMiKTsKIAkJCWdvdG8gZmFpbDsKQEAgLTgyMCw5ICs4NDYsNyBAQAogewogCWludCBpOwogCi0JbXV0ZXhfbG9jaygmdWJpLT52dGJsX211dGV4KTsKIAlmb3IgKGkgPSAwOyBpIDwgdWJpLT52dGJsX3Nsb3RzOyBpKyspCiAJCXBhcmFub2lkX2NoZWNrX3ZvbHVtZSh1YmksIGkpOwotCW11dGV4X3VubG9jaygmdWJpLT52dGJsX211dGV4KTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL3Z0YmwuYyBiL2RyaXZlcnMvbXRkL3ViaS92dGJsLmMKaW5kZXggMjViM2JkNi4uNTZmYzNmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL3Z0YmwuYworKysgYi9kcml2ZXJzL210ZC91YmkvdnRibC5jCkBAIC04Niw4ICs4NiwxMCBAQAogewogCWludCBpLCBlcnI7CiAJdWludDMyX3QgY3JjOworCXN0cnVjdCB1Ymlfdm9sdW1lICpsYXlvdXRfdm9sOwogCiAJdWJpX2Fzc2VydChpZHggPj0gMCAmJiBpZHggPCB1YmktPnZ0Ymxfc2xvdHMpOworCWxheW91dF92b2wgPSB1YmktPnZvbHVtZXNbdm9sX2lkMmlkeCh1YmksIFVCSV9MQVlPVVRfVk9MVU1FX0lEKV07CiAKIAlpZiAoIXZ0YmxfcmVjKQogCQl2dGJsX3JlYyA9ICZlbXB0eV92dGJsX3JlY29yZDsKQEAgLTk2LDMxICs5OCwyNSBAQAogCQl2dGJsX3JlYy0+Y3JjID0gY3B1X3RvX2JlMzIoY3JjKTsKIAl9CiAKLQltdXRleF9sb2NrKCZ1YmktPnZ0YmxfbXV0ZXgpOwogCW1lbWNweSgmdWJpLT52dGJsW2lkeF0sIHZ0YmxfcmVjLCBzaXplb2Yoc3RydWN0IHViaV92dGJsX3JlY29yZCkpOwogCWZvciAoaSA9IDA7IGkgPCBVQklfTEFZT1VUX1ZPTFVNRV9FQlM7IGkrKykgewotCQllcnIgPSB1YmlfZWJhX3VubWFwX2xlYih1YmksIFVCSV9MQVlPVVRfVk9MX0lELCBpKTsKLQkJaWYgKGVycikgewotCQkJbXV0ZXhfdW5sb2NrKCZ1YmktPnZ0YmxfbXV0ZXgpOworCQllcnIgPSB1YmlfZWJhX3VubWFwX2xlYih1YmksIGxheW91dF92b2wsIGkpOworCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKLQkJfQotCQllcnIgPSB1YmlfZWJhX3dyaXRlX2xlYih1YmksIFVCSV9MQVlPVVRfVk9MX0lELCBpLCB1YmktPnZ0YmwsIDAsCisKKwkJZXJyID0gdWJpX2ViYV93cml0ZV9sZWIodWJpLCBsYXlvdXRfdm9sLCBpLCB1YmktPnZ0YmwsIDAsCiAJCQkJCXViaS0+dnRibF9zaXplLCBVQklfTE9OR1RFUk0pOwotCQlpZiAoZXJyKSB7Ci0JCQltdXRleF91bmxvY2soJnViaS0+dnRibF9tdXRleCk7CisJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwotCQl9CiAJfQogCiAJcGFyYW5vaWRfdnRibF9jaGVjayh1YmkpOwotCW11dGV4X3VubG9jaygmdWJpLT52dGJsX211dGV4KTsKLQlyZXR1cm4gdWJpX3dsX2ZsdXNoKHViaSk7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgotICogdm9sX3RpbF9jaGVjayAtIGNoZWNrIGlmIHZvbHVtZSB0YWJsZSBpcyBub3QgY29ycnVwdGVkIGFuZCBjb250YWlucyBzZW5zaWJsZQotICogZGF0YS4KLSAqCisgKiB2dGJsX2NoZWNrIC0gY2hlY2sgaWYgdm9sdW1lIHRhYmxlIGlzIG5vdCBjb3JydXB0ZWQgYW5kIGNvbnRhaW5zIHNlbnNpYmxlCisgKiAgICAgICAgICAgICAgZGF0YS4KICAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CiAgKiBAdnRibDogdm9sdW1lIHRhYmxlCiAgKgpAQCAtMjczLDcgKzI2OSw3IEBACiAJICogdGhpcyB2b2x1bWUgdGFibGUgY29weSB3YXMgZm91bmQgZHVyaW5nIHNjYW5uaW5nLiBJdCBoYXMgdG8gYmUgd2lwZWQKIAkgKiBvdXQuCiAJICovCi0Jc3YgPSB1Ymlfc2Nhbl9maW5kX3N2KHNpLCBVQklfTEFZT1VUX1ZPTF9JRCk7CisJc3YgPSB1Ymlfc2Nhbl9maW5kX3N2KHNpLCBVQklfTEFZT1VUX1ZPTFVNRV9JRCk7CiAJaWYgKHN2KQogCQlvbGRfc2ViID0gdWJpX3NjYW5fZmluZF9zZWIoc3YsIGNvcHkpOwogCkBAIC0yODUsNyArMjgxLDcgQEAKIAl9CiAKIAl2aWRfaGRyLT52b2xfdHlwZSA9IFVCSV9WSURfRFlOQU1JQzsKLQl2aWRfaGRyLT52b2xfaWQgPSBjcHVfdG9fYmUzMihVQklfTEFZT1VUX1ZPTF9JRCk7CisJdmlkX2hkci0+dm9sX2lkID0gY3B1X3RvX2JlMzIoVUJJX0xBWU9VVF9WT0xVTUVfSUQpOwogCXZpZF9oZHItPmNvbXBhdCA9IFVCSV9MQVlPVVRfVk9MVU1FX0NPTVBBVDsKIAl2aWRfaGRyLT5kYXRhX3NpemUgPSB2aWRfaGRyLT51c2VkX2VicyA9CiAJCQkgICAgIHZpZF9oZHItPmRhdGFfcGFkID0gY3B1X3RvX2JlMzIoMCk7CkBAIC01MTgsNiArNTE0LDE3IEBACiAJCXZvbC0+bmFtZVt2b2wtPm5hbWVfbGVuXSA9ICdcMCc7CiAJCXZvbC0+dm9sX2lkID0gaTsKIAorCQlpZiAodnRibFtpXS5mbGFncyAmIFVCSV9WVEJMX0FVVE9SRVNJWkVfRkxHKSB7CisJCQkvKiBBdXRvIHJlLXNpemUgZmxhZyBtYXkgYmUgc2V0IG9ubHkgZm9yIG9uZSB2b2x1bWUgKi8KKwkJCWlmICh1YmktPmF1dG9yZXNpemVfdm9sX2lkICE9IC0xKSB7CisJCQkJdWJpX2VycigibW9yZSB0aGVuIG9uZSBhdXRvLXJlc2l6ZSB2b2x1bWUgKCVkICIKKwkJCQkJImFuZCAlZCkiLCB1YmktPmF1dG9yZXNpemVfdm9sX2lkLCBpKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJdWJpLT5hdXRvcmVzaXplX3ZvbF9pZCA9IGk7CisJCX0KKwogCQl1YmlfYXNzZXJ0KCF1YmktPnZvbHVtZXNbaV0pOwogCQl1YmktPnZvbHVtZXNbaV0gPSB2b2w7CiAJCXViaS0+dm9sX2NvdW50ICs9IDE7CkBAIC01NjgsNiArNTc1LDcgQEAKIAkJdm9sLT5sYXN0X2ViX2J5dGVzID0gc3YtPmxhc3RfZGF0YV9zaXplOwogCX0KIAorCS8qIEFuZCBhZGQgdGhlIGxheW91dCB2b2x1bWUgKi8KIAl2b2wgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdWJpX3ZvbHVtZSksIEdGUF9LRVJORUwpOwogCWlmICghdm9sKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTU4Miw3ICs1OTAsOCBAQAogCXZvbC0+bGFzdF9lYl9ieXRlcyA9IHZvbC0+cmVzZXJ2ZWRfcGViczsKIAl2b2wtPnVzZWRfYnl0ZXMgPQogCQkobG9uZyBsb25nKXZvbC0+dXNlZF9lYnMgKiAodWJpLT5sZWJfc2l6ZSAtIHZvbC0+ZGF0YV9wYWQpOwotCXZvbC0+dm9sX2lkID0gVUJJX0xBWU9VVF9WT0xfSUQ7CisJdm9sLT52b2xfaWQgPSBVQklfTEFZT1VUX1ZPTFVNRV9JRDsKKwl2b2wtPnJlZl9jb3VudCA9IDE7CiAKIAl1YmlfYXNzZXJ0KCF1YmktPnZvbHVtZXNbaV0pOwogCXViaS0+dm9sdW1lc1t2b2xfaWQyaWR4KHViaSwgdm9sLT52b2xfaWQpXSA9IHZvbDsKQEAgLTczNCw3ICs3NDMsNyBAQAogCXViaS0+dnRibF9zaXplID0gdWJpLT52dGJsX3Nsb3RzICogVUJJX1ZUQkxfUkVDT1JEX1NJWkU7CiAJdWJpLT52dGJsX3NpemUgPSBBTElHTih1YmktPnZ0Ymxfc2l6ZSwgdWJpLT5taW5faW9fc2l6ZSk7CiAKLQlzdiA9IHViaV9zY2FuX2ZpbmRfc3Yoc2ksIFVCSV9MQVlPVVRfVk9MX0lEKTsKKwlzdiA9IHViaV9zY2FuX2ZpbmRfc3Yoc2ksIFVCSV9MQVlPVVRfVk9MVU1FX0lEKTsKIAlpZiAoIXN2KSB7CiAJCS8qCiAJCSAqIE5vIGxvZ2ljYWwgZXJhc2VibG9ja3MgYmVsb25naW5nIHRvIHRoZSBsYXlvdXQgdm9sdW1lIHdlcmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS93bC5jIGIvZHJpdmVycy9tdGQvdWJpL3dsLmMKaW5kZXggNjMzMGM4Yy4uYTQ3MWE0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL3dsLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL3dsLmMKQEAgLTExNywyMSArMTE3LDYgQEAKICNkZWZpbmUgV0xfTUFYX0ZBSUxVUkVTIDMyCiAKIC8qKgotICogc3RydWN0IHViaV93bF9lbnRyeSAtIHdlYXItbGV2ZWxpbmcgZW50cnkuCi0gKiBAcmI6IGxpbmsgaW4gdGhlIGNvcnJlc3BvbmRpbmcgUkItdHJlZQotICogQGVjOiBlcmFzZSBjb3VudGVyCi0gKiBAcG51bTogcGh5c2ljYWwgZXJhc2VibG9jayBudW1iZXIKLSAqCi0gKiBFYWNoIHBoeXNpY2FsIGVyYXNlYmxvY2sgaGFzIGEgY29ycmVzcG9uZGluZyAmc3RydWN0IHdsX2VudHJ5IG9iamVjdCB3aGljaAotICogbWF5IGJlIGtlcHQgaW4gZGlmZmVyZW50IFJCLXRyZWVzLgotICovCi1zdHJ1Y3QgdWJpX3dsX2VudHJ5IHsKLQlzdHJ1Y3QgcmJfbm9kZSByYjsKLQlpbnQgZWM7Ci0JaW50IHBudW07Ci19OwotCi0vKioKICAqIHN0cnVjdCB1Ymlfd2xfcHJvdF9lbnRyeSAtIFBFQiBwcm90ZWN0aW9uIGVudHJ5LgogICogQHJiX3BudW06IGxpbmsgaW4gdGhlIEB3bC0+cHJvdC5wbnVtIFJCLXRyZWUKICAqIEByYl9hZWM6IGxpbmsgaW4gdGhlIEB3bC0+cHJvdC5hZWMgUkItdHJlZQpAQCAtMjE2LDkgKzIwMSw2IEBACiAjZGVmaW5lIHBhcmFub2lkX2NoZWNrX2luX3dsX3RyZWUoZSwgcm9vdCkKICNlbmRpZgogCi0vKiBTbGFiIGNhY2hlIGZvciB3ZWFyLWxldmVsaW5nIGVudHJpZXMgKi8KLXN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqd2xfZW50cmllc19zbGFiOwotCiAvKioKICAqIHdsX3RyZWVfYWRkIC0gYWRkIGEgd2Vhci1sZXZlbGluZyBlbnRyeSB0byBhIFdMIFJCLXRyZWUuCiAgKiBAZTogdGhlIHdlYXItbGV2ZWxpbmcgZW50cnkgdG8gYWRkCkBAIC0yNjcsMTUgKzI0OSwyNiBAQAogCWludCBlcnI7CiAJc3RydWN0IHViaV93b3JrICp3cms7CiAKLQlzcGluX2xvY2soJnViaS0+d2xfbG9jayk7CisJY29uZF9yZXNjaGVkKCk7CiAKKwkvKgorCSAqIEB1YmktPndvcmtfc2VtIGlzIHVzZWQgdG8gc3luY2hyb25pemUgd2l0aCB0aGUgd29ya2Vycy4gV29ya2VycyB0YWtlCisJICogaXQgaW4gcmVhZCBtb2RlLCBzbyBtYW55IG9mIHRoZW0gbWF5IGJlIGRvaW5nIHdvcmtzIGF0IGEgdGltZS4gQnV0CisJICogdGhlIHF1ZXVlIGZsdXNoIGNvZGUgaGFzIHRvIGJlIHN1cmUgdGhlIHdob2xlIHF1ZXVlIG9mIHdvcmtzIGlzCisJICogZG9uZSwgYW5kIGl0IHRha2VzIHRoZSBtdXRleCBpbiB3cml0ZSBtb2RlLgorCSAqLworCWRvd25fcmVhZCgmdWJpLT53b3JrX3NlbSk7CisJc3Bpbl9sb2NrKCZ1YmktPndsX2xvY2spOwogCWlmIChsaXN0X2VtcHR5KCZ1YmktPndvcmtzKSkgewogCQlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKKwkJdXBfcmVhZCgmdWJpLT53b3JrX3NlbSk7CiAJCXJldHVybiAwOwogCX0KIAogCXdyayA9IGxpc3RfZW50cnkodWJpLT53b3Jrcy5uZXh0LCBzdHJ1Y3QgdWJpX3dvcmssIGxpc3QpOwogCWxpc3RfZGVsKCZ3cmstPmxpc3QpOworCXViaS0+d29ya3NfY291bnQgLT0gMTsKKwl1YmlfYXNzZXJ0KHViaS0+d29ya3NfY291bnQgPj0gMCk7CiAJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CiAKIAkvKgpAQCAtMjg2LDExICsyNzksOCBAQAogCWVyciA9IHdyay0+ZnVuYyh1YmksIHdyaywgMCk7CiAJaWYgKGVycikKIAkJdWJpX2Vycigid29yayBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVkIiwgZXJyKTsKKwl1cF9yZWFkKCZ1YmktPndvcmtfc2VtKTsKIAotCXNwaW5fbG9jaygmdWJpLT53bF9sb2NrKTsKLQl1YmktPndvcmtzX2NvdW50IC09IDE7Ci0JdWJpX2Fzc2VydCh1YmktPndvcmtzX2NvdW50ID49IDApOwotCXNwaW5fdW5sb2NrKCZ1YmktPndsX2xvY2spOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTU0OSw4ICs1MzksMTIgQEAKICAqIHByb3RfdHJlZV9kZWwgLSByZW1vdmUgYSBwaHlzaWNhbCBlcmFzZWJsb2NrIGZyb20gdGhlIHByb3RlY3Rpb24gdHJlZXMKICAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CiAgKiBAcG51bTogdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgdG8gcmVtb3ZlCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIFBFQiBAcG51bSBmcm9tIHRoZSBwcm90ZWN0aW9uIHRyZWVzIGFuZCByZXR1cm5zIHplcm8KKyAqIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgJS1FTk9ERVYgaWYgdGhlIFBFQiB3YXMgbm90IGZvdW5kIGluIHRoZSBwcm90ZWN0aW9uCisgKiB0cmVlcy4KICAqLwotc3RhdGljIHZvaWQgcHJvdF90cmVlX2RlbChzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgcG51bSkKK3N0YXRpYyBpbnQgcHJvdF90cmVlX2RlbChzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgcG51bSkKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqcDsKIAlzdHJ1Y3QgdWJpX3dsX3Byb3RfZW50cnkgKnBlID0gTlVMTDsKQEAgLTU2MSw3ICs1NTUsNyBAQAogCQlwZSA9IHJiX2VudHJ5KHAsIHN0cnVjdCB1Ymlfd2xfcHJvdF9lbnRyeSwgcmJfcG51bSk7CiAKIAkJaWYgKHBudW0gPT0gcGUtPmUtPnBudW0pCi0JCQlicmVhazsKKwkJCWdvdG8gZm91bmQ7CiAKIAkJaWYgKHBudW0gPCBwZS0+ZS0+cG51bSkKIAkJCXAgPSBwLT5yYl9sZWZ0OwpAQCAtNTY5LDEwICs1NjMsMTQgQEAKIAkJCXAgPSBwLT5yYl9yaWdodDsKIAl9CiAKKwlyZXR1cm4gLUVOT0RFVjsKKworZm91bmQ6CiAJdWJpX2Fzc2VydChwZS0+ZS0+cG51bSA9PSBwbnVtKTsKIAlyYl9lcmFzZSgmcGUtPnJiX2FlYywgJnViaS0+cHJvdC5hZWMpOwogCXJiX2VyYXNlKCZwZS0+cmJfcG51bSwgJnViaS0+cHJvdC5wbnVtKTsKIAlrZnJlZShwZSk7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtNzQ0LDcgKzc0Miw4IEBACiBzdGF0aWMgaW50IHdlYXJfbGV2ZWxpbmdfd29ya2VyKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIHN0cnVjdCB1Ymlfd29yayAqd3JrLAogCQkJCWludCBjYW5jZWwpCiB7Ci0JaW50IGVyciwgcHV0ID0gMDsKKwlpbnQgZXJyLCBwdXQgPSAwLCBzY3J1YmJpbmcgPSAwLCBwcm90ZWN0ID0gMDsKKwlzdHJ1Y3QgdWJpX3dsX3Byb3RfZW50cnkgKnVuaW5pdGlhbGl6ZWRfdmFyKHBlKTsKIAlzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplMSwgKmUyOwogCXN0cnVjdCB1YmlfdmlkX2hkciAqdmlkX2hkcjsKIApAQCAtNzU3LDIxICs3NTYsMTcgQEAKIAlpZiAoIXZpZF9oZHIpCiAJCXJldHVybiAtRU5PTUVNOwogCisJbXV0ZXhfbG9jaygmdWJpLT5tb3ZlX211dGV4KTsKIAlzcGluX2xvY2soJnViaS0+d2xfbG9jayk7CisJdWJpX2Fzc2VydCghdWJpLT5tb3ZlX2Zyb20gJiYgIXViaS0+bW92ZV90byk7CisJdWJpX2Fzc2VydCghdWJpLT5tb3ZlX3RvX3B1dCk7CiAKLQkvKgotCSAqIE9ubHkgb25lIFdMIHdvcmtlciBhdCBhIHRpbWUgaXMgc3VwcG9ydGVkIGF0IHRoaXMgaW1wbGVtZW50YXRpb24sIHNvCi0JICogbWFrZSBzdXJlIGEgUEVCIGlzIG5vdCBiZWluZyBtb3ZlZCBhbHJlYWR5LgotCSAqLwotCWlmICh1YmktPm1vdmVfdG8gfHwgIXViaS0+ZnJlZS5yYl9ub2RlIHx8CisJaWYgKCF1YmktPmZyZWUucmJfbm9kZSB8fAogCSAgICAoIXViaS0+dXNlZC5yYl9ub2RlICYmICF1YmktPnNjcnViLnJiX25vZGUpKSB7CiAJCS8qCi0JCSAqIE9ubHkgb25lIFdMIHdvcmtlciBhdCBhIHRpbWUgaXMgc3VwcG9ydGVkIGF0IHRoaXMKLQkJICogaW1wbGVtZW50YXRpb24sIHNvIGlmIGEgTEVCIGlzIGFscmVhZHkgYmVpbmcgbW92ZWQsIGNhbmNlbC4KLQkJICoKLQkJICogTm8gZnJlZSBwaHlzaWNhbCBlcmFzZWJsb2Nrcz8gV2VsbCwgd2UgY2FuY2VsIHdlYXItbGV2ZWxpbmcKLQkJICogdGhlbi4gSXQgd2lsbCBiZSB0cmlnZ2VyZWQgYWdhaW4gd2hlbiBhIGZyZWUgcGh5c2ljYWwKLQkJICogZXJhc2VibG9jayBhcHBlYXJzLgorCQkgKiBObyBmcmVlIHBoeXNpY2FsIGVyYXNlYmxvY2tzPyBXZWxsLCB0aGV5IG11c3QgYmUgd2FpdGluZyBpbgorCQkgKiB0aGUgcXVldWUgdG8gYmUgZXJhc2VkLiBDYW5jZWwgbW92ZW1lbnQgLSBpdCB3aWxsIGJlCisJCSAqIHRyaWdnZXJlZCBhZ2FpbiB3aGVuIGEgZnJlZSBwaHlzaWNhbCBlcmFzZWJsb2NrIGFwcGVhcnMuCiAJCSAqCiAJCSAqIE5vIHVzZWQgcGh5c2ljYWwgZXJhc2VibG9ja3M/IFRoZXkgbXVzdCBiZSB0ZW1wb3JhcmlseQogCQkgKiBwcm90ZWN0ZWQgZnJvbSBiZWluZyBtb3ZlZC4gVGhleSB3aWxsIGJlIG1vdmVkIHRvIHRoZQpAQCAtNzgwLDEwICs3NzUsNyBAQAogCQkgKi8KIAkJZGJnX3dsKCJjYW5jZWwgV0wsIGEgbGlzdCBpcyBlbXB0eTogZnJlZSAlZCwgdXNlZCAlZCIsCiAJCSAgICAgICAhdWJpLT5mcmVlLnJiX25vZGUsICF1YmktPnVzZWQucmJfbm9kZSk7Ci0JCXViaS0+d2xfc2NoZWR1bGVkID0gMDsKLQkJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7Ci0JCXViaV9mcmVlX3ZpZF9oZHIodWJpLCB2aWRfaGRyKTsKLQkJcmV0dXJuIDA7CisJCWdvdG8gb3V0X2NhbmNlbDsKIAl9CiAKIAlpZiAoIXViaS0+c2NydWIucmJfbm9kZSkgewpAQCAtNzk4LDI3ICs3OTAsMjQgQEAKIAkJaWYgKCEoZTItPmVjIC0gZTEtPmVjID49IFVCSV9XTF9USFJFU0hPTEQpKSB7CiAJCQlkYmdfd2woIm5vIFdMIG5lZWRlZDogbWluIHVzZWQgRUMgJWQsIG1heCBmcmVlIEVDICVkIiwKIAkJCSAgICAgICBlMS0+ZWMsIGUyLT5lYyk7Ci0JCQl1YmktPndsX3NjaGVkdWxlZCA9IDA7Ci0JCQlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKLQkJCXViaV9mcmVlX3ZpZF9oZHIodWJpLCB2aWRfaGRyKTsKLQkJCXJldHVybiAwOworCQkJZ290byBvdXRfY2FuY2VsOwogCQl9CiAJCXBhcmFub2lkX2NoZWNrX2luX3dsX3RyZWUoZTEsICZ1YmktPnVzZWQpOwogCQlyYl9lcmFzZSgmZTEtPnJiLCAmdWJpLT51c2VkKTsKIAkJZGJnX3dsKCJtb3ZlIFBFQiAlZCBFQyAlZCB0byBQRUIgJWQgRUMgJWQiLAogCQkgICAgICAgZTEtPnBudW0sIGUxLT5lYywgZTItPnBudW0sIGUyLT5lYyk7CiAJfSBlbHNlIHsKKwkJLyogUGVyZm9ybSBzY3J1YmJpbmcgKi8KKwkJc2NydWJiaW5nID0gMTsKIAkJZTEgPSByYl9lbnRyeShyYl9maXJzdCgmdWJpLT5zY3J1YiksIHN0cnVjdCB1Ymlfd2xfZW50cnksIHJiKTsKIAkJZTIgPSBmaW5kX3dsX2VudHJ5KCZ1YmktPmZyZWUsIFdMX0ZSRUVfTUFYX0RJRkYpOwogCQlwYXJhbm9pZF9jaGVja19pbl93bF90cmVlKGUxLCAmdWJpLT5zY3J1Yik7Ci0JcmJfZXJhc2UoJmUxLT5yYiwgJnViaS0+c2NydWIpOworCQlyYl9lcmFzZSgmZTEtPnJiLCAmdWJpLT5zY3J1Yik7CiAJCWRiZ193bCgic2NydWIgUEVCICVkIHRvIFBFQiAlZCIsIGUxLT5wbnVtLCBlMi0+cG51bSk7CiAJfQogCiAJcGFyYW5vaWRfY2hlY2tfaW5fd2xfdHJlZShlMiwgJnViaS0+ZnJlZSk7CiAJcmJfZXJhc2UoJmUyLT5yYiwgJnViaS0+ZnJlZSk7Ci0JdWJpX2Fzc2VydCghdWJpLT5tb3ZlX2Zyb20gJiYgIXViaS0+bW92ZV90byk7Ci0JdWJpX2Fzc2VydCghdWJpLT5tb3ZlX3RvX3B1dCAmJiAhdWJpLT5tb3ZlX2Zyb21fcHV0KTsKIAl1YmktPm1vdmVfZnJvbSA9IGUxOwogCXViaS0+bW92ZV90byA9IGUyOwogCXNwaW5fdW5sb2NrKCZ1YmktPndsX2xvY2spOwpAQCAtODI4LDYgKzgxNywxMCBAQAogCSAqIFdlIHNvIGZhciBkbyBub3Qga25vdyB3aGljaCBsb2dpY2FsIGVyYXNlYmxvY2sgb3VyIHBoeXNpY2FsCiAJICogZXJhc2VibG9jayAoQGUxKSBiZWxvbmdzIHRvLiBXZSBoYXZlIHRvIHJlYWQgdGhlIHZvbHVtZSBpZGVudGlmaWVyCiAJICogaGVhZGVyIGZpcnN0LgorCSAqCisJICogTm90ZSwgd2UgYXJlIHByb3RlY3RlZCBmcm9tIHRoaXMgUEVCIGJlaW5nIHVubWFwcGVkIGFuZCBlcmFzZWQuIFRoZQorCSAqICd1Ymlfd2xfcHV0X3BlYigpJyB3b3VsZCB3YWl0IGZvciBtb3ZpbmcgdG8gYmUgZmluaXNoZWQgaWYgdGhlIFBFQgorCSAqIHdoaWNoIGlzIGJlaW5nIG1vdmVkIHdhcyB1bm1hcHBlZC4KIAkgKi8KIAogCWVyciA9IHViaV9pb19yZWFkX3ZpZF9oZHIodWJpLCBlMS0+cG51bSwgdmlkX2hkciwgMCk7CkBAIC04NDIsMzIgKzgzNSw1MSBAQAogCQkJICogbGlrZWx5IGhhdmUgdGhlIFZJRCBoZWFkZXIgaW4gcGxhY2UuCiAJCQkgKi8KIAkJCWRiZ193bCgiUEVCICVkIGhhcyBubyBWSUQgaGVhZGVyIiwgZTEtPnBudW0pOwotCQkJZXJyID0gMDsKLQkJfSBlbHNlIHsKLQkJCXViaV9lcnIoImVycm9yICVkIHdoaWxlIHJlYWRpbmcgVklEIGhlYWRlciBmcm9tIFBFQiAlZCIsCi0JCQkJZXJyLCBlMS0+cG51bSk7Ci0JCQlpZiAoZXJyID4gMCkKLQkJCQllcnIgPSAtRUlPOworCQkJZ290byBvdXRfbm90X21vdmVkOwogCQl9Ci0JCWdvdG8gZXJyb3I7CisKKwkJdWJpX2VycigiZXJyb3IgJWQgd2hpbGUgcmVhZGluZyBWSUQgaGVhZGVyIGZyb20gUEVCICVkIiwKKwkJCWVyciwgZTEtPnBudW0pOworCQlpZiAoZXJyID4gMCkKKwkJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0X2Vycm9yOwogCX0KIAogCWVyciA9IHViaV9lYmFfY29weV9sZWIodWJpLCBlMS0+cG51bSwgZTItPnBudW0sIHZpZF9oZHIpOwogCWlmIChlcnIpIHsKLQkJaWYgKGVyciA9PSBVQklfSU9fQklURkxJUFMpCi0JCQllcnIgPSAwOwotCQlnb3RvIGVycm9yOworCisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXRfZXJyb3I7CisJCWlmIChlcnIgPT0gMSkKKwkJCWdvdG8gb3V0X25vdF9tb3ZlZDsKKworCQkvKgorCQkgKiBGb3Igc29tZSByZWFzb24gdGhlIExFQiB3YXMgbm90IG1vdmVkIC0gaXQgbWlnaHQgYmUgYmVjYXVzZQorCQkgKiB0aGUgdm9sdW1lIGlzIGJlaW5nIGRlbGV0ZWQuIFdlIHNob3VsZCBwcmV2ZW50IHRoaXMgUEVCIGZyb20KKwkJICogYmVpbmcgc2VsZWN0ZWQgZm9yIHdlYXItbGV2ZWxsaW5nIG1vdmVtZW50IGZvciBzb21lICJ0aW1lIiwKKwkJICogc28gcHV0IGl0IHRvIHRoZSBwcm90ZWN0aW9uIHRyZWUuCisJCSAqLworCisJCWRiZ193bCgiY2FuY2VsbGVkIG1vdmluZyBQRUIgJWQiLCBlMS0+cG51bSk7CisJCXBlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHViaV93bF9wcm90X2VudHJ5KSwgR0ZQX05PRlMpOworCQlpZiAoIXBlKSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBvdXRfZXJyb3I7CisJCX0KKworCQlwcm90ZWN0ID0gMTsKIAl9CiAKIAl1YmlfZnJlZV92aWRfaGRyKHViaSwgdmlkX2hkcik7CiAJc3Bpbl9sb2NrKCZ1YmktPndsX2xvY2spOworCWlmIChwcm90ZWN0KQorCQlwcm90X3RyZWVfYWRkKHViaSwgZTEsIHBlLCBwcm90ZWN0KTsKIAlpZiAoIXViaS0+bW92ZV90b19wdXQpCiAJCXdsX3RyZWVfYWRkKGUyLCAmdWJpLT51c2VkKTsKIAllbHNlCiAJCXB1dCA9IDE7CiAJdWJpLT5tb3ZlX2Zyb20gPSB1YmktPm1vdmVfdG8gPSBOVUxMOwotCXViaS0+bW92ZV9mcm9tX3B1dCA9IHViaS0+bW92ZV90b19wdXQgPSAwOwotCXViaS0+d2xfc2NoZWR1bGVkID0gMDsKKwl1YmktPm1vdmVfdG9fcHV0ID0gdWJpLT53bF9zY2hlZHVsZWQgPSAwOwogCXNwaW5fdW5sb2NrKCZ1YmktPndsX2xvY2spOwogCiAJaWYgKHB1dCkgewpAQCAtODc3LDYyICs4ODksNjcgQEAKIAkJICovCiAJCWRiZ193bCgiUEVCICVkIHdhcyBwdXQgbWVhbndoaWxlLCBlcmFzZSIsIGUyLT5wbnVtKTsKIAkJZXJyID0gc2NoZWR1bGVfZXJhc2UodWJpLCBlMiwgMCk7Ci0JCWlmIChlcnIpIHsKLQkJCWttZW1fY2FjaGVfZnJlZSh3bF9lbnRyaWVzX3NsYWIsIGUyKTsKLQkJCXViaV9yb19tb2RlKHViaSk7Ci0JCX0KKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2Vycm9yOwogCX0KIAotCWVyciA9IHNjaGVkdWxlX2VyYXNlKHViaSwgZTEsIDApOwotCWlmIChlcnIpIHsKLQkJa21lbV9jYWNoZV9mcmVlKHdsX2VudHJpZXNfc2xhYiwgZTEpOwotCQl1Ymlfcm9fbW9kZSh1YmkpOworCWlmICghcHJvdGVjdCkgeworCQllcnIgPSBzY2hlZHVsZV9lcmFzZSh1YmksIGUxLCAwKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2Vycm9yOwogCX0KIAorCiAJZGJnX3dsKCJkb25lIik7Ci0JcmV0dXJuIGVycjsKKwltdXRleF91bmxvY2soJnViaS0+bW92ZV9tdXRleCk7CisJcmV0dXJuIDA7CiAKIAkvKgotCSAqIFNvbWUgZXJyb3Igb2NjdXJyZWQuIEBlMSB3YXMgbm90IGNoYW5nZWQsIHNvIHJldHVybiBpdCBiYWNrLiBAZTIKLQkgKiBtaWdodCBiZSBjaGFuZ2VkLCBzY2hlZHVsZSBpdCBmb3IgZXJhc3VyZS4KKwkgKiBGb3Igc29tZSByZWFzb25zIHRoZSBMRUIgd2FzIG5vdCBtb3ZlZCwgbWlnaHQgYmUgYW4gZXJyb3IsIG1pZ2h0IGJlCisJICogc29tZXRoaW5nIGVsc2UuIEBlMSB3YXMgbm90IGNoYW5nZWQsIHNvIHJldHVybiBpdCBiYWNrLiBAZTIgbWlnaHQKKwkgKiBiZSBjaGFuZ2VkLCBzY2hlZHVsZSBpdCBmb3IgZXJhc3VyZS4KIAkgKi8KLWVycm9yOgotCWlmIChlcnIpCi0JCWRiZ193bCgiZXJyb3IgJWQgb2NjdXJyZWQsIGNhbmNlbCBvcGVyYXRpb24iLCBlcnIpOwotCXViaV9hc3NlcnQoZXJyIDw9IDApOwotCitvdXRfbm90X21vdmVkOgogCXViaV9mcmVlX3ZpZF9oZHIodWJpLCB2aWRfaGRyKTsKIAlzcGluX2xvY2soJnViaS0+d2xfbG9jayk7Ci0JdWJpLT53bF9zY2hlZHVsZWQgPSAwOwotCWlmICh1YmktPm1vdmVfZnJvbV9wdXQpCi0JCXB1dCA9IDE7CisJaWYgKHNjcnViYmluZykKKwkJd2xfdHJlZV9hZGQoZTEsICZ1YmktPnNjcnViKTsKIAllbHNlCiAJCXdsX3RyZWVfYWRkKGUxLCAmdWJpLT51c2VkKTsKIAl1YmktPm1vdmVfZnJvbSA9IHViaS0+bW92ZV90byA9IE5VTEw7Ci0JdWJpLT5tb3ZlX2Zyb21fcHV0ID0gdWJpLT5tb3ZlX3RvX3B1dCA9IDA7CisJdWJpLT5tb3ZlX3RvX3B1dCA9IHViaS0+d2xfc2NoZWR1bGVkID0gMDsKIAlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKIAotCWlmIChwdXQpIHsKLQkJLyoKLQkJICogV2VsbCwgdGhlIHRhcmdldCBQRUIgd2FzIHB1dCBtZWFud2hpbGUsIHNjaGVkdWxlIGl0IGZvcgotCQkgKiBlcmFzdXJlLgotCQkgKi8KLQkJZGJnX3dsKCJQRUIgJWQgd2FzIHB1dCBtZWFud2hpbGUsIGVyYXNlIiwgZTEtPnBudW0pOwotCQllcnIgPSBzY2hlZHVsZV9lcmFzZSh1YmksIGUxLCAwKTsKLQkJaWYgKGVycikgewotCQkJa21lbV9jYWNoZV9mcmVlKHdsX2VudHJpZXNfc2xhYiwgZTEpOwotCQkJdWJpX3JvX21vZGUodWJpKTsKLQkJfQotCX0KLQogCWVyciA9IHNjaGVkdWxlX2VyYXNlKHViaSwgZTIsIDApOwotCWlmIChlcnIpIHsKLQkJa21lbV9jYWNoZV9mcmVlKHdsX2VudHJpZXNfc2xhYiwgZTIpOwotCQl1Ymlfcm9fbW9kZSh1YmkpOwotCX0KKwlpZiAoZXJyKQorCQlnb3RvIG91dF9lcnJvcjsKIAotCXlpZWxkKCk7CisJbXV0ZXhfdW5sb2NrKCZ1YmktPm1vdmVfbXV0ZXgpOworCXJldHVybiAwOworCitvdXRfZXJyb3I6CisJdWJpX2VycigiZXJyb3IgJWQgd2hpbGUgbW92aW5nIFBFQiAlZCB0byBQRUIgJWQiLAorCQllcnIsIGUxLT5wbnVtLCBlMi0+cG51bSk7CisKKwl1YmlfZnJlZV92aWRfaGRyKHViaSwgdmlkX2hkcik7CisJc3Bpbl9sb2NrKCZ1YmktPndsX2xvY2spOworCXViaS0+bW92ZV9mcm9tID0gdWJpLT5tb3ZlX3RvID0gTlVMTDsKKwl1YmktPm1vdmVfdG9fcHV0ID0gdWJpLT53bF9zY2hlZHVsZWQgPSAwOworCXNwaW5fdW5sb2NrKCZ1YmktPndsX2xvY2spOworCisJa21lbV9jYWNoZV9mcmVlKHViaV93bF9lbnRyeV9zbGFiLCBlMSk7CisJa21lbV9jYWNoZV9mcmVlKHViaV93bF9lbnRyeV9zbGFiLCBlMik7CisJdWJpX3JvX21vZGUodWJpKTsKKworCW11dGV4X3VubG9jaygmdWJpLT5tb3ZlX211dGV4KTsKIAlyZXR1cm4gZXJyOworCitvdXRfY2FuY2VsOgorCXViaS0+d2xfc2NoZWR1bGVkID0gMDsKKwlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKKwltdXRleF91bmxvY2soJnViaS0+bW92ZV9tdXRleCk7CisJdWJpX2ZyZWVfdmlkX2hkcih1YmksIHZpZF9oZHIpOworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTEwMjAsNyArMTAzNyw3IEBACiAJaWYgKGNhbmNlbCkgewogCQlkYmdfd2woImNhbmNlbCBlcmFzdXJlIG9mIFBFQiAlZCBFQyAlZCIsIHBudW0sIGUtPmVjKTsKIAkJa2ZyZWUod2xfd3JrKTsKLQkJa21lbV9jYWNoZV9mcmVlKHdsX2VudHJpZXNfc2xhYiwgZSk7CisJCWttZW1fY2FjaGVfZnJlZSh1Ymlfd2xfZW50cnlfc2xhYiwgZSk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTA0OSw3ICsxMDY2LDcgQEAKIAogCXViaV9lcnIoImZhaWxlZCB0byBlcmFzZSBQRUIgJWQsIGVycm9yICVkIiwgcG51bSwgZXJyKTsKIAlrZnJlZSh3bF93cmspOwotCWttZW1fY2FjaGVfZnJlZSh3bF9lbnRyaWVzX3NsYWIsIGUpOworCWttZW1fY2FjaGVfZnJlZSh1Ymlfd2xfZW50cnlfc2xhYiwgZSk7CiAKIAlpZiAoZXJyID09IC1FSU5UUiB8fCBlcnIgPT0gLUVOT01FTSB8fCBlcnIgPT0gLUVBR0FJTiB8fAogCSAgICBlcnIgPT0gLUVCVVNZKSB7CkBAIC0xMTE5LDggKzExMzYsNyBAQAogfQogCiAvKioKLSAqIHViaV93bF9wdXRfcGViIC0gcmV0dXJuIGEgcGh5c2ljYWwgZXJhc2VibG9jayB0byB0aGUgd2Vhci1sZXZlbGluZwotICogdW5pdC4KKyAqIHViaV93bF9wdXRfcGViIC0gcmV0dXJuIGEgcGh5c2ljYWwgZXJhc2VibG9jayB0byB0aGUgd2Vhci1sZXZlbGluZyB1bml0LgogICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKICAqIEBwbnVtOiBwaHlzaWNhbCBlcmFzZWJsb2NrIHRvIHJldHVybgogICogQHRvcnR1cmU6IGlmIHRoaXMgcGh5c2ljYWwgZXJhc2VibG9jayBoYXMgdG8gYmUgdG9ydHVyZWQKQEAgLTExMjgsNyArMTE0NCw3IEBACiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZXR1cm4gcGh5c2ljYWwgZXJhc2VibG9jayBAcG51bSB0byB0aGUgcG9vbCBvZgogICogZnJlZSBwaHlzaWNhbCBlcmFzZWJsb2Nrcy4gVGhlIEB0b3J0dXJlIGZsYWcgaGFzIHRvIGJlIHNldCBpZiBhbiBJL08gZXJyb3IKICAqIG9jY3VycmVkIHRvIHRoaXMgQHBudW0gYW5kIGl0IGhhcyB0byBiZSB0ZXN0ZWQuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvCi0gKiBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKiBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlLgogICovCiBpbnQgdWJpX3dsX3B1dF9wZWIoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgaW50IHBudW0sIGludCB0b3J0dXJlKQogewpAQCAtMTEzOSw4ICsxMTU1LDggQEAKIAl1YmlfYXNzZXJ0KHBudW0gPj0gMCk7CiAJdWJpX2Fzc2VydChwbnVtIDwgdWJpLT5wZWJfY291bnQpOwogCityZXRyeToKIAlzcGluX2xvY2soJnViaS0+d2xfbG9jayk7Ci0KIAllID0gdWJpLT5sb29rdXB0YmxbcG51bV07CiAJaWYgKGUgPT0gdWJpLT5tb3ZlX2Zyb20pIHsKIAkJLyoKQEAgLTExNDgsMTcgKzExNjQsMjIgQEAKIAkJICogYmUgbW92ZWQuIEl0IHdpbGwgYmUgc2NoZWR1bGVkIGZvciBlcmFzdXJlIGluIHRoZQogCQkgKiB3ZWFyLWxldmVsaW5nIHdvcmtlci4KIAkJICovCi0JCWRiZ193bCgiUEVCICVkIGlzIGJlaW5nIG1vdmVkIiwgcG51bSk7Ci0JCXViaV9hc3NlcnQoIXViaS0+bW92ZV9mcm9tX3B1dCk7Ci0JCXViaS0+bW92ZV9mcm9tX3B1dCA9IDE7CisJCWRiZ193bCgiUEVCICVkIGlzIGJlaW5nIG1vdmVkLCB3YWl0IiwgcG51bSk7CiAJCXNwaW5fdW5sb2NrKCZ1YmktPndsX2xvY2spOwotCQlyZXR1cm4gMDsKKworCQkvKiBXYWl0IGZvciB0aGUgV0wgd29ya2VyIGJ5IHRha2luZyB0aGUgQHViaS0+bW92ZV9tdXRleCAqLworCQltdXRleF9sb2NrKCZ1YmktPm1vdmVfbXV0ZXgpOworCQltdXRleF91bmxvY2soJnViaS0+bW92ZV9tdXRleCk7CisJCWdvdG8gcmV0cnk7CiAJfSBlbHNlIGlmIChlID09IHViaS0+bW92ZV90bykgewogCQkvKgogCQkgKiBVc2VyIGlzIHB1dHRpbmcgdGhlIHBoeXNpY2FsIGVyYXNlYmxvY2sgd2hpY2ggd2FzIHNlbGVjdGVkCiAJCSAqIGFzIHRoZSB0YXJnZXQgdGhlIGRhdGEgaXMgbW92ZWQgdG8uIEl0IG1heSBoYXBwZW4gaWYgdGhlIEVCQQotCQkgKiB1bml0IGFscmVhZHkgcmUtbWFwcGVkIHRoZSBMRUIgYnV0IHRoZSBXTCB1bml0IGRpZCBoYXMgbm90Ci0JCSAqIHB1dCB0aGUgUEVCIHRvIHRoZSAidXNlZCIgdHJlZS4KKwkJICogdW5pdCBhbHJlYWR5IHJlLW1hcHBlZCB0aGUgTEVCIGluICd1YmlfZWJhX2NvcHlfbGViKCknIGJ1dAorCQkgKiB0aGUgV0wgdW5pdCBoYXMgbm90IHB1dCB0aGUgUEVCIHRvIHRoZSAidXNlZCIgdHJlZSB5ZXQsIGJ1dAorCQkgKiBpdCBpcyBhYm91dCB0byBkbyB0aGlzLiBTbyB3ZSBqdXN0IHNldCBhIGZsYWcgd2hpY2ggd2lsbAorCQkgKiB0ZWxsIHRoZSBXTCB3b3JrZXIgdGhhdCB0aGUgUEVCIGlzIG5vdCBuZWVkZWQgYW55bW9yZSBhbmQKKwkJICogc2hvdWxkIGJlIHNjaGVkdWxlZCBmb3IgZXJhc3VyZS4KIAkJICovCiAJCWRiZ193bCgiUEVCICVkIGlzIHRoZSB0YXJnZXQgb2YgZGF0YSBtb3ZpbmciLCBwbnVtKTsKIAkJdWJpX2Fzc2VydCghdWJpLT5tb3ZlX3RvX3B1dCk7CkBAIC0xMTcyLDggKzExOTMsMTUgQEAKIAkJfSBlbHNlIGlmIChpbl93bF90cmVlKGUsICZ1YmktPnNjcnViKSkgewogCQkJcGFyYW5vaWRfY2hlY2tfaW5fd2xfdHJlZShlLCAmdWJpLT5zY3J1Yik7CiAJCQlyYl9lcmFzZSgmZS0+cmIsICZ1YmktPnNjcnViKTsKLQkJfSBlbHNlCi0JCQlwcm90X3RyZWVfZGVsKHViaSwgZS0+cG51bSk7CisJCX0gZWxzZSB7CisJCQllcnIgPSBwcm90X3RyZWVfZGVsKHViaSwgZS0+cG51bSk7CisJCQlpZiAoZXJyKSB7CisJCQkJdWJpX2VycigiUEVCICVkIG5vdCBmb3VuZCIsIHBudW0pOworCQkJCXViaV9yb19tb2RlKHViaSk7CisJCQkJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJfQogCX0KIAlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKIApAQCAtMTIyNyw4ICsxMjU1LDE3IEBACiAJaWYgKGluX3dsX3RyZWUoZSwgJnViaS0+dXNlZCkpIHsKIAkJcGFyYW5vaWRfY2hlY2tfaW5fd2xfdHJlZShlLCAmdWJpLT51c2VkKTsKIAkJcmJfZXJhc2UoJmUtPnJiLCAmdWJpLT51c2VkKTsKLQl9IGVsc2UKLQkJcHJvdF90cmVlX2RlbCh1YmksIHBudW0pOworCX0gZWxzZSB7CisJCWludCBlcnI7CisKKwkJZXJyID0gcHJvdF90cmVlX2RlbCh1YmksIGUtPnBudW0pOworCQlpZiAoZXJyKSB7CisJCQl1YmlfZXJyKCJQRUIgJWQgbm90IGZvdW5kIiwgcG51bSk7CisJCQl1Ymlfcm9fbW9kZSh1YmkpOworCQkJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQogCiAJd2xfdHJlZV9hZGQoZSwgJnViaS0+c2NydWIpOwogCXNwaW5fdW5sb2NrKCZ1YmktPndsX2xvY2spOwpAQCAtMTI0OSwxNyArMTI4NiwzMiBAQAogICovCiBpbnQgdWJpX3dsX2ZsdXNoKHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpCiB7Ci0JaW50IGVyciwgcGVuZGluZ19jb3VudDsKLQotCXBlbmRpbmdfY291bnQgPSB1YmktPndvcmtzX2NvdW50OwotCi0JZGJnX3dsKCJmbHVzaCAoJWQgcGVuZGluZyB3b3JrcykiLCBwZW5kaW5nX2NvdW50KTsKKwlpbnQgZXJyOwogCiAJLyoKIAkgKiBFcmFzZSB3aGlsZSB0aGUgcGVuZGluZyB3b3JrcyBxdWV1ZSBpcyBub3QgZW1wdHksIGJ1dCBub3QgbW9yZSB0aGVuCiAJICogdGhlIG51bWJlciBvZiBjdXJyZW50bHkgcGVuZGluZyB3b3Jrcy4KIAkgKi8KLQl3aGlsZSAocGVuZGluZ19jb3VudC0tID4gMCkgeworCWRiZ193bCgiZmx1c2ggKCVkIHBlbmRpbmcgd29ya3MpIiwgdWJpLT53b3Jrc19jb3VudCk7CisJd2hpbGUgKHViaS0+d29ya3NfY291bnQpIHsKKwkJZXJyID0gZG9fd29yayh1YmkpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwkvKgorCSAqIE1ha2Ugc3VyZSBhbGwgdGhlIHdvcmtzIHdoaWNoIGhhdmUgYmVlbiBkb25lIGluIHBhcmFsbGVsIGFyZQorCSAqIGZpbmlzaGVkLgorCSAqLworCWRvd25fd3JpdGUoJnViaS0+d29ya19zZW0pOworCXVwX3dyaXRlKCZ1YmktPndvcmtfc2VtKTsKKworCS8qCisJICogQW5kIGluIGNhc2UgbGFzdCB3YXMgdGhlIFdMIHdvcmtlciBhbmQgaXQgY2FuY2VsbGVkIHRoZSBMRUIKKwkgKiBtb3ZlbWVudCwgZmx1c2ggYWdhaW4uCisJICovCisJd2hpbGUgKHViaS0+d29ya3NfY291bnQpIHsKKwkJZGJnX3dsKCJmbHVzaCBtb3JlICglZCBwZW5kaW5nIHdvcmtzKSIsIHViaS0+d29ya3NfY291bnQpOwogCQllcnIgPSBkb193b3JrKHViaSk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwpAQCAtMTI5NCw3ICsxMzQ2LDcgQEAKIAkJCQkJcmItPnJiX3JpZ2h0ID0gTlVMTDsKIAkJCX0KIAotCQkJa21lbV9jYWNoZV9mcmVlKHdsX2VudHJpZXNfc2xhYiwgZSk7CisJCQlrbWVtX2NhY2hlX2ZyZWUodWJpX3dsX2VudHJ5X3NsYWIsIGUpOwogCQl9CiAJfQogfQpAQCAtMTMwMyw3ICsxMzU1LDcgQEAKICAqIHViaV90aHJlYWQgLSBVQkkgYmFja2dyb3VuZCB0aHJlYWQuCiAgKiBAdTogdGhlIFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0IHBvaW50ZXIKICAqLwotc3RhdGljIGludCB1YmlfdGhyZWFkKHZvaWQgKnUpCitpbnQgdWJpX3RocmVhZCh2b2lkICp1KQogewogCWludCBmYWlsdXJlcyA9IDA7CiAJc3RydWN0IHViaV9kZXZpY2UgKnViaSA9IHU7CkBAIC0xMzk0LDM2ICsxNDQ2LDIyIEBACiAJdWJpLT51c2VkID0gdWJpLT5mcmVlID0gdWJpLT5zY3J1YiA9IFJCX1JPT1Q7CiAJdWJpLT5wcm90LnBudW0gPSB1YmktPnByb3QuYWVjID0gUkJfUk9PVDsKIAlzcGluX2xvY2tfaW5pdCgmdWJpLT53bF9sb2NrKTsKKwltdXRleF9pbml0KCZ1YmktPm1vdmVfbXV0ZXgpOworCWluaXRfcndzZW0oJnViaS0+d29ya19zZW0pOwogCXViaS0+bWF4X2VjID0gc2ktPm1heF9lYzsKIAlJTklUX0xJU1RfSEVBRCgmdWJpLT53b3Jrcyk7CiAKIAlzcHJpbnRmKHViaS0+Ymd0X25hbWUsIFVCSV9CR1RfTkFNRV9QQVRURVJOLCB1YmktPnViaV9udW0pOwogCi0JdWJpLT5iZ3RfdGhyZWFkID0ga3RocmVhZF9jcmVhdGUodWJpX3RocmVhZCwgdWJpLCB1YmktPmJndF9uYW1lKTsKLQlpZiAoSVNfRVJSKHViaS0+Ymd0X3RocmVhZCkpIHsKLQkJZXJyID0gUFRSX0VSUih1YmktPmJndF90aHJlYWQpOwotCQl1YmlfZXJyKCJjYW5ub3Qgc3Bhd24gXCIlc1wiLCBlcnJvciAlZCIsIHViaS0+Ymd0X25hbWUsCi0JCQllcnIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmICh1YmlfZGV2aWNlc19jbnQgPT0gMCkgewotCQl3bF9lbnRyaWVzX3NsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZSgidWJpX3dsX2VudHJ5X3NsYWIiLAotCQkJCQkJICAgIHNpemVvZihzdHJ1Y3QgdWJpX3dsX2VudHJ5KSwKLQkJCQkJCSAgICAwLCAwLCBOVUxMKTsKLQkJaWYgKCF3bF9lbnRyaWVzX3NsYWIpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KIAllcnIgPSAtRU5PTUVNOwogCXViaS0+bG9va3VwdGJsID0ga3phbGxvYyh1YmktPnBlYl9jb3VudCAqIHNpemVvZih2b2lkICopLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXViaS0+bG9va3VwdGJsKQotCQlnb3RvIG91dF9mcmVlOworCQlyZXR1cm4gZXJyOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNlYiwgdG1wLCAmc2ktPmVyYXNlLCB1Lmxpc3QpIHsKIAkJY29uZF9yZXNjaGVkKCk7CiAKLQkJZSA9IGttZW1fY2FjaGVfYWxsb2Mod2xfZW50cmllc19zbGFiLCBHRlBfS0VSTkVMKTsKKwkJZSA9IGttZW1fY2FjaGVfYWxsb2ModWJpX3dsX2VudHJ5X3NsYWIsIEdGUF9LRVJORUwpOwogCQlpZiAoIWUpCiAJCQlnb3RvIG91dF9mcmVlOwogCkBAIC0xNDMxLDcgKzE0NjksNyBAQAogCQllLT5lYyA9IHNlYi0+ZWM7CiAJCXViaS0+bG9va3VwdGJsW2UtPnBudW1dID0gZTsKIAkJaWYgKHNjaGVkdWxlX2VyYXNlKHViaSwgZSwgMCkpIHsKLQkJCWttZW1fY2FjaGVfZnJlZSh3bF9lbnRyaWVzX3NsYWIsIGUpOworCQkJa21lbV9jYWNoZV9mcmVlKHViaV93bF9lbnRyeV9zbGFiLCBlKTsKIAkJCWdvdG8gb3V0X2ZyZWU7CiAJCX0KIAl9CkBAIC0xNDM5LDcgKzE0NzcsNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoc2ViLCAmc2ktPmZyZWUsIHUubGlzdCkgewogCQljb25kX3Jlc2NoZWQoKTsKIAotCQllID0ga21lbV9jYWNoZV9hbGxvYyh3bF9lbnRyaWVzX3NsYWIsIEdGUF9LRVJORUwpOworCQllID0ga21lbV9jYWNoZV9hbGxvYyh1Ymlfd2xfZW50cnlfc2xhYiwgR0ZQX0tFUk5FTCk7CiAJCWlmICghZSkKIAkJCWdvdG8gb3V0X2ZyZWU7CiAKQEAgLTE0NTMsNyArMTQ5MSw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzZWIsICZzaS0+Y29yciwgdS5saXN0KSB7CiAJCWNvbmRfcmVzY2hlZCgpOwogCi0JCWUgPSBrbWVtX2NhY2hlX2FsbG9jKHdsX2VudHJpZXNfc2xhYiwgR0ZQX0tFUk5FTCk7CisJCWUgPSBrbWVtX2NhY2hlX2FsbG9jKHViaV93bF9lbnRyeV9zbGFiLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFlKQogCQkJZ290byBvdXRfZnJlZTsKIApAQCAtMTQ2MSw3ICsxNDk5LDcgQEAKIAkJZS0+ZWMgPSBzZWItPmVjOwogCQl1YmktPmxvb2t1cHRibFtlLT5wbnVtXSA9IGU7CiAJCWlmIChzY2hlZHVsZV9lcmFzZSh1YmksIGUsIDApKSB7Ci0JCQlrbWVtX2NhY2hlX2ZyZWUod2xfZW50cmllc19zbGFiLCBlKTsKKwkJCWttZW1fY2FjaGVfZnJlZSh1Ymlfd2xfZW50cnlfc2xhYiwgZSk7CiAJCQlnb3RvIG91dF9mcmVlOwogCQl9CiAJfQpAQCAtMTQ3MCw3ICsxNTA4LDcgQEAKIAkJdWJpX3JiX2Zvcl9lYWNoX2VudHJ5KHJiMiwgc2ViLCAmc3YtPnJvb3QsIHUucmIpIHsKIAkJCWNvbmRfcmVzY2hlZCgpOwogCi0JCQllID0ga21lbV9jYWNoZV9hbGxvYyh3bF9lbnRyaWVzX3NsYWIsIEdGUF9LRVJORUwpOworCQkJZSA9IGttZW1fY2FjaGVfYWxsb2ModWJpX3dsX2VudHJ5X3NsYWIsIEdGUF9LRVJORUwpOwogCQkJaWYgKCFlKQogCQkJCWdvdG8gb3V0X2ZyZWU7CiAKQEAgLTE1MTAsOCArMTU0OCw2IEBACiAJdHJlZV9kZXN0cm95KCZ1YmktPmZyZWUpOwogCXRyZWVfZGVzdHJveSgmdWJpLT5zY3J1Yik7CiAJa2ZyZWUodWJpLT5sb29rdXB0YmwpOwotCWlmICh1YmlfZGV2aWNlc19jbnQgPT0gMCkKLQkJa21lbV9jYWNoZV9kZXN0cm95KHdsX2VudHJpZXNfc2xhYik7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTU0MSw3ICsxNTc3LDcgQEAKIAkJCQkJcmItPnJiX3JpZ2h0ID0gTlVMTDsKIAkJCX0KIAotCQkJa21lbV9jYWNoZV9mcmVlKHdsX2VudHJpZXNfc2xhYiwgcGUtPmUpOworCQkJa21lbV9jYWNoZV9mcmVlKHViaV93bF9lbnRyeV9zbGFiLCBwZS0+ZSk7CiAJCQlrZnJlZShwZSk7CiAJCX0KIAl9CkBAIC0xNTUzLDEwICsxNTg5LDYgQEAKICAqLwogdm9pZCB1Ymlfd2xfY2xvc2Uoc3RydWN0IHViaV9kZXZpY2UgKnViaSkKIHsKLQlkYmdfd2woImRpc2FibGUgXCIlc1wiIiwgdWJpLT5iZ3RfbmFtZSk7Ci0JaWYgKHViaS0+Ymd0X3RocmVhZCkKLQkJa3RocmVhZF9zdG9wKHViaS0+Ymd0X3RocmVhZCk7Ci0KIAlkYmdfd2woImNsb3NlIHRoZSBVQkkgd2Vhci1sZXZlbGluZyB1bml0Iik7CiAKIAljYW5jZWxfcGVuZGluZyh1YmkpOwpAQCAtMTU2NSw4ICsxNTk3LDYgQEAKIAl0cmVlX2Rlc3Ryb3koJnViaS0+ZnJlZSk7CiAJdHJlZV9kZXN0cm95KCZ1YmktPnNjcnViKTsKIAlrZnJlZSh1YmktPmxvb2t1cHRibCk7Ci0JaWYgKHViaV9kZXZpY2VzX2NudCA9PSAxKQotCQlrbWVtX2NhY2hlX2Rlc3Ryb3kod2xfZW50cmllc19zbGFiKTsKIH0KIAogI2lmZGVmIENPTkZJR19NVERfVUJJX0RFQlVHX1BBUkFOT0lECmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9LY29uZmlnIGIvZHJpdmVycy9uZXQvS2NvbmZpZwppbmRleCA3ZDE3MGNkLi41MGMyYjYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L0tjb25maWcKQEAgLTg3OSw3ICs4NzksOCBAQAogCXRyaXN0YXRlICJTTUMgOTFDOXgvOTFDMXh4eCBzdXBwb3J0IgogCXNlbGVjdCBDUkMzMgogCXNlbGVjdCBNSUkKLQlkZXBlbmRzIG9uIEFSTSB8fCBSRURXT09EXzUgfHwgUkVEV09PRF82IHx8IE0zMlIgfHwgU1VQRVJIIHx8IFNPQ19BVTFYMDAgfHwgQkxBQ0tGSU4KKwlkZXBlbmRzIG9uIEFSTSB8fCBSRURXT09EXzUgfHwgUkVEV09PRF82IHx8IE0zMlIgfHwgU1VQRVJIIHx8IFwKKwkJU09DX0FVMVgwMCB8fCBCTEFDS0ZJTiB8fCBNTjEwMzAwCiAJaGVscAogCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgU01DJ3MgOTF4IHNlcmllcyBvZiBFdGhlcm5ldCBjaGlwc2V0cywKIAkgIGluY2x1ZGluZyB0aGUgU01DOTFDOTQgYW5kIHRoZSBTTUM5MUMxMTEuIFNheSBZIGlmIHlvdSB3YW50IGl0CkBAIC0xNzM3LDEwICsxNzM4LDggQEAKIAogY29uZmlnIENQTUFDCiAJdHJpc3RhdGUgIlRJIEFSNyBDUE1BQyBFdGhlcm5ldCBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIEVYUEVSSU1FTlRBTCAmJiBBUjcKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBFWFBFUklNRU5UQUwgJiYgQVI3ICYmIEJST0tFTgogCXNlbGVjdCBQSFlMSUIKLQlzZWxlY3QgRklYRURfUEhZCi0Jc2VsZWN0IEZJWEVEX01JSV8xMDBfRkRYCiAJaGVscAogCSAgVEkgQVI3IENQTUFDIEV0aGVybmV0IHN1cHBvcnQKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3BtYWMuYyBiL2RyaXZlcnMvbmV0L2NwbWFjLmMKaW5kZXggNmNjZWJiOC4uYzg1MTk0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3BtYWMuYworKysgYi9kcml2ZXJzL25ldC9jcG1hYy5jCkBAIC04NDUsMTUgKzg0NSw2IEBACiAJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOwogfQogCi1zdGF0aWMgaW50IGNwbWFjX2xpbmtfdXBkYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgIHN0cnVjdCBmaXhlZF9waHlfc3RhdHVzICpzdGF0dXMpCi17Ci0Jc3RhdHVzLT5saW5rID0gMTsKLQlzdGF0dXMtPnNwZWVkID0gMTAwOwotCXN0YXR1cy0+ZHVwbGV4ID0gMTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBjcG1hY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJaW50IGksIHNpemUsIHJlczsKQEAgLTk5NiwxMSArOTg3LDExIEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBjcG1hY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCWludCByYywgcGh5X2lkLCBpOworCWludCBtZGlvX2J1c19pZCA9IGNwbWFjX21paS5pZDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKIAlzdHJ1Y3QgY3BtYWNfcHJpdiAqcHJpdjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXN0cnVjdCBwbGF0X2NwbWFjX2RhdGEgKnBkYXRhOwotCXN0cnVjdCBmaXhlZF9pbmZvICpmaXhlZF9waHk7CiAJREVDTEFSRV9NQUNfQlVGKG1hYyk7CiAKIAlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwpAQCAtMTAxNCw5ICsxMDA1LDIzIEBACiAJfQogCiAJaWYgKHBoeV9pZCA9PSBQSFlfTUFYX0FERFIpIHsKLQkJaWYgKGV4dGVybmFsX3N3aXRjaCB8fCBkdW1iX3N3aXRjaCkKKwkJaWYgKGV4dGVybmFsX3N3aXRjaCB8fCBkdW1iX3N3aXRjaCkgeworCQkJc3RydWN0IGZpeGVkX3BoeV9zdGF0dXMgc3RhdHVzID0ge307CisKKwkJCW1kaW9fYnVzX2lkID0gMDsKKworCQkJLyoKKwkJCSAqIEZJWE1FOiB0aGlzIHNob3VsZCBiZSBpbiB0aGUgcGxhdGZvcm0gY29kZSEKKwkJCSAqIFNpbmNlIHRoZXJlIGlzIG5vdCBwbGF0Zm9ybSBjb2RlIGF0IGFsbCAodGhhdCBpcywKKwkJCSAqIG5vIG1haW5saW5lIHVzZXJzIG9mIHRoYXQgZHJpdmVyKSwgcGxhY2UgaXQgaGVyZQorCQkJICogZm9yIG5vdy4KKwkJCSAqLwogCQkJcGh5X2lkID0gMDsKLQkJZWxzZSB7CisJCQlzdGF0dXMubGluayA9IDE7CisJCQlzdGF0dXMuZHVwbGV4ID0gMTsKKwkJCXN0YXR1cy5zcGVlZCA9IDEwMDsKKwkJCWZpeGVkX3BoeV9hZGQoUEhZX1BPTEwsIHBoeV9pZCwgJnN0YXR1cyk7CisJCX0gZWxzZSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImNwbWFjOiBubyBQSFkgcHJlc2VudFxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQpAQCAtMTA2MCwzMiArMTA2NSw4IEBACiAJcHJpdi0+bXNnX2VuYWJsZSA9IG5ldGlmX21zZ19pbml0KGRlYnVnX2xldmVsLCAweGZmKTsKIAltZW1jcHkoZGV2LT5kZXZfYWRkciwgcGRhdGEtPmRldl9hZGRyLCBzaXplb2YoZGV2LT5kZXZfYWRkcikpOwogCi0JaWYgKHBoeV9pZCA9PSAzMSkgewotCQlzbnByaW50Zihwcml2LT5waHlfbmFtZSwgQlVTX0lEX1NJWkUsIFBIWV9JRF9GTVQsIGNwbWFjX21paS5pZCwKLQkJCSBwaHlfaWQpOwotCX0gZWxzZSB7Ci0JCS8qIExldCdzIHRyeSB0byBnZXQgYSBmcmVlIGZpeGVkIHBoeS4uLiAqLwotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1BIWV9BTU5UOyBpKyspIHsKLQkJCWZpeGVkX3BoeSA9IGZpeGVkX21kaW9fZ2V0X3BoeWRldihpKTsKLQkJCWlmICghZml4ZWRfcGh5KQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKCFmaXhlZF9waHktPnBoeWRldi0+YXR0YWNoZWRfZGV2KSB7Ci0JCQkJc3RybmNweShwcml2LT5waHlfbmFtZSwKLQkJCQkJZml4ZWRfcGh5LT5waHlkZXYtPmRldi5idXNfaWQsCi0JCQkJCUJVU19JRF9TSVpFKTsKLQkJCQlmaXhlZF9tZGlvX3NldF9saW5rX3VwZGF0ZShmaXhlZF9waHktPnBoeWRldiwKLQkJCQkJCQkgICAmY3BtYWNfbGlua191cGRhdGUpOwotCQkJCWdvdG8gcGh5X2ZvdW5kOwotCQkJfQotCQl9Ci0JCWlmIChuZXRpZl9tc2dfZHJ2KHByaXYpKQotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ291bGQgbm90IGZpbmQgZml4ZWQgUEhZXG4iLAotCQkJICAgICAgIGRldi0+bmFtZSk7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBmYWlsOwotCX0KKwlzbnByaW50Zihwcml2LT5waHlfbmFtZSwgQlVTX0lEX1NJWkUsIFBIWV9JRF9GTVQsIG1kaW9fYnVzX2lkLCBwaHlfaWQpOwogCi1waHlfZm91bmQ6CiAJcHJpdi0+cGh5ID0gcGh5X2Nvbm5lY3QoZGV2LCBwcml2LT5waHlfbmFtZSwgJmNwbWFjX2FkanVzdF9saW5rLCAwLAogCQkJCVBIWV9JTlRFUkZBQ0VfTU9ERV9NSUkpOwogCWlmIChJU19FUlIocHJpdi0+cGh5KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3Jpcy9ldGhfdjEwLmMgYi9kcml2ZXJzL25ldC9jcmlzL2V0aF92MTAuYwppbmRleCA5MTdiN2I0Li42NWQwYTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jcmlzL2V0aF92MTAuYworKysgYi9kcml2ZXJzL25ldC9jcmlzL2V0aF92MTAuYwpAQCAtMSwyMjEgKzEsMTAgQEAKLS8qICRJZDogZXRoZXJuZXQuYyx2IDEuMzEgMjAwNC8xMC8xOCAxNDo0OTowMyBzdGFydmlrIEV4cCAkCi0gKgorLyoKICAqIGUxMDBuZXQuYzogQSBuZXR3b3JrIGRyaXZlciBmb3IgdGhlIEVUUkFYIDEwMExYIG5ldHdvcmsgY29udHJvbGxlci4KICAqCiAgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMiBBeGlzIENvbW11bmljYXRpb25zIEFCLgogICoKICAqIFRoZSBvdXRsaW5lIG9mIHRoaXMgZHJpdmVyIGNvbWVzIGZyb20gc2tlbGV0b24uYy4KICAqCi0gKiAkTG9nOiBldGhlcm5ldC5jLHYgJAotICogUmV2aXNpb24gMS4zMSAgMjAwNC8xMC8xOCAxNDo0OTowMyAgc3RhcnZpawotICogVXNlIFJYIGludGVycnVwdCBhcyByYW5kb20gc291cmNlCi0gKgotICogUmV2aXNpb24gMS4zMCAgMjAwNC8wOS8yOSAxMDo0NDowNCAgc3RhcnZpawotICogRW5hYmVkIE1BQy1hZGRyZXNzIG91dHB1dCBhZ2FpbgotICoKLSAqIFJldmlzaW9uIDEuMjkgIDIwMDQvMDgvMjQgMDc6MTQ6MDUgIHN0YXJ2aWsKLSAqIE1ha2UgdXNlIG9mIGdlbmVyaWMgTURJTyBpbnRlcmZhY2UgYW5kIGNvbnN0YW50cy4KLSAqCi0gKiBSZXZpc2lvbiAxLjI4ICAyMDA0LzA4LzIwIDA5OjM3OjExICBzdGFydmlrCi0gKiBBZGRlZCBzdXBwb3J0IGZvciBJbnRlbCBMWFQ5NzJBLiBDcmVkcyB0byBSYW5keSBTY2FyYm9yb3VnaC4KLSAqCi0gKiBSZXZpc2lvbiAxLjI3ICAyMDA0LzA4LzE2IDEyOjM3OjIyICBzdGFydmlrCi0gKiBNZXJnZSBvZiBMaW51eCAyLjYuOAotICoKLSAqIFJldmlzaW9uIDEuMjUgIDIwMDQvMDYvMjEgMTA6Mjk6NTcgIHN0YXJ2aWsKLSAqIE1lcmdlIG9mIExpbnV4IDIuNi43Ci0gKgotICogUmV2aXNpb24gMS4yMyAgMjAwNC8wNi8wOSAwNToyOToyMiAgc3RhcnZpawotICogQXZvaWQgYW55IHJhY2Ugd2hlcmUgUl9ETUFfQ0gxX0ZJUlNUIGlzIE5VTEwgKG1heSB0cmlnZ2VyIGNhY2hlIGJ1ZykuCi0gKgotICogUmV2aXNpb24gMS4yMiAgMjAwNC8wNS8xNCAwNzo1ODowMyAgc3RhcnZpawotICogTWVyZ2Ugb2YgY2hhbmdlcyBmcm9tIDIuNAotICoKLSAqIFJldmlzaW9uIDEuMjAgIDIwMDQvMDMvMTEgMTE6Mzg6NDAgIHN0YXJ2aWsKLSAqIE1lcmdlIG9mIExpbnV4IDIuNi40Ci0gKgotICogUmV2aXNpb24gMS4xOCAgMjAwMy8xMi8wMyAxMzo0NTo0NiAgc3RhcnZpawotICogVXNlIGhhcmR3YXJlIHBhZCBmb3Igc2hvcnQgcGFja2V0cyB0byBwcmV2ZW50IGluZm9ybWF0aW9uIGxlYWthZ2UuCi0gKgotICogUmV2aXNpb24gMS4xNyAgMjAwMy8wNy8wNCAwODoyNzozNyAgc3RhcnZpawotICogTWVyZ2Ugb2YgTGludXggMi41Ljc0Ci0gKgotICogUmV2aXNpb24gMS4xNiAgMjAwMy8wNC8yNCAwODoyODoyMiAgc3RhcnZpawotICogTmV3IExFRCBiZWhhdmlvdXI6IExFRCBvZmYgd2hlbiBubyBsaW5rCi0gKgotICogUmV2aXNpb24gMS4xNSAgMjAwMy8wNC8wOSAwNToyMDo0NyAgc3RhcnZpawotICogTWVyZ2Ugb2YgTGludXggMi41LjY3Ci0gKgotICogUmV2aXNpb24gMS4xMyAgMjAwMy8wMy8wNiAxNjoxMTowMSAgaGVucmlrZW4KLSAqIE9mZiBieSBvbmUgZXJyb3IgaW4gZ3JvdXAgYWRkcmVzcyByZWdpc3RlciBzZXR0aW5nLgotICoKLSAqIFJldmlzaW9uIDEuMTIgIDIwMDMvMDIvMjcgMTc6MjQ6MTkgIHN0YXJ2aWsKLSAqIENvcnJlY3RlZCBSZXYgdG8gUmV2aXNpb24KLSAqCi0gKiBSZXZpc2lvbiAxLjExICAyMDAzLzAxLzI0IDA5OjUzOjIxICBzdGFydmlrCi0gKiBPb3BzLiBJbml0aWFsaXplIEdBIHRvIDAsIG5vdCB0byAxCi0gKgotICogUmV2aXNpb24gMS4xMCAgMjAwMy8wMS8yNCAwOTo1MDo1NSAgc3RhcnZpawotICogSW5pdGlhbGl6ZSBHQV8wIGFuZCBHQV8xIHRvIDAgdG8gYXZvaWQgbWF0Y2hpbmcgb2YgdW53YW50ZWQgcGFja2V0cwotICoKLSAqIFJldmlzaW9uIDEuOSAgMjAwMi8xMi8xMyAwNzo0MDo1OCAgc3RhcnZpawotICogQWRkZWQgYmFzaWMgZXRodG9vbCBpbnRlcmZhY2UKLSAqIEhhbmRsZWQgb3V0IG9mIG1lbW9yeSB3aGVuIGFsbG9jYXRpbmcgbmV3IGJ1ZmZlcnMKLSAqCi0gKiBSZXZpc2lvbiAxLjggIDIwMDIvMTIvMTEgMTM6MTM6NTcgIHN0YXJ2aWsKLSAqIEFkZGVkIGFyY2gvIHRvIHYxMCBzcGVjaWZpYyBpbmNsdWRlcwotICogQWRkZWQgZml4IGZyb20gTGludXggMi40IGluIHNlcmlhbC5jIChmbHVzaF90b19mbGlwX2J1ZmZlcikKLSAqCi0gKiBSZXZpc2lvbiAxLjcgIDIwMDIvMTEvMjYgMDk6NDE6NDIgIHN0YXJ2aWsKLSAqIEFkZGVkIGUxMDBfc2V0X2NvbmZpZyAoc3RhbmRhcmQgaW50ZXJmYWNlIHRvIHNldCBtZWRpYSB0eXBlKQotICogQWRkZWQgcHJvdGVjdGlvbiBhZ2FpbnN0IHByZWVtcHRpdmUgc2NoZWR1bGluZwotICogQWRkZWQgc3RhbmRhcmQgTUlJIGlvY3RscwotICoKLSAqIFJldmlzaW9uIDEuNiAgMjAwMi8xMS8yMSAwNzoxODoxOCAgc3RhcnZpawotICogVGltZXJzIG11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gMi41LjQ4Ci0gKgotICogUmV2aXNpb24gMS41ICAyMDAyLzExLzIwIDExOjU2OjExICBzdGFydmlrCi0gKiBNZXJnZSBvZiBMaW51eCAyLjUuNDgKLSAqCi0gKiBSZXZpc2lvbiAxLjQgIDIwMDIvMTEvMTggMDc6MjY6NDYgIHN0YXJ2aWsKLSAqIExpbnV4IDIuNSBwb3J0IG9mIGxhdGVzdCBMaW51eCAyLjQgZXRoZXJuZXQgZHJpdmVyCi0gKgotICogUmV2aXNpb24gMS4zMyAgMjAwMi8xMC8wMiAyMDoxNjoxNyAgaHAKLSAqIFNFVEYsIFNFVFM6IFVzZSB1bmRlcnNjb3JlZCBJT194XyBtYWNyb3MgcmF0aGVyIHRoYW4gaW5jb3JyZWN0IHRva2VuIGNvbmNhdGVuYXRpb24KLSAqCi0gKiBSZXZpc2lvbiAxLjMyICAyMDAyLzA5LzE2IDA2OjA1OjU4ICBzdGFydmlrCi0gKiBBbGlnbiBtZW1vcnkgcmV0dXJuZWQgYnkgZGV2X2FsbG9jX3NrYgotICogTW92ZWQgaGFuZGxpbmcgb2Ygc2VudCBwYWNrZXRzIHRvIGludGVycnVwdCB0byBhdm9pZCByZWZlcmVuY2UgY291bnRpbmcgcHJvYmxlbQotICoKLSAqIFJldmlzaW9uIDEuMzEgIDIwMDIvMDkvMTAgMTM6Mjg6MjMgIGxhcnN2Ci0gKiBSZXR1cm4gLUVJTlZBTCBmb3IgdW5rbm93biBpb2N0bHMgdG8gYXZvaWQgY29uZnVzaW5nIHRvb2xzIHRoYXQgdGVzdHMKLSAqIGZvciBzdXBwb3J0ZWQgZnVuY3Rpb25hbGl0eSBieSBpc3N1aW5nIHNwZWNpYWwgaW9jdGxzLCBpLmUuIHdpcmVsZXNzCi0gKiBleHRlbnNpb25zLgotICoKLSAqIFJldmlzaW9uIDEuMzAgIDIwMDIvMDUvMDcgMTg6NTA6MDggIGpvaGFuYQotICogQ29ycmVjdCBzcGVsbGluZyBpbiBjb21tZW50cy4KLSAqCi0gKiBSZXZpc2lvbiAxLjI5ICAyMDAyLzA1LzA2IDA1OjM4OjQ5ICBzdGFydmlrCi0gKiBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudHM6Ci0gKiAgICBMYXJnZSBwYWNrZXRzIGFyZSBub3QgY29waWVkIChicmVha3BvaW50IHNldCB0byAyNTYgYnl0ZXMpCi0gKiAgICBUaGUgY2FjaGUgYnVnIHdvcmthcm91bmQgaXMgZGVsYXllZCB1bnRpbCBoYWxmIG9mIHRoZSByZWNlaXZlIGxpc3QKLSAqICAgICAgaGFzIGJlZW4gdXNlZAotICogICAgQWRkZWQgdHJhbnNtaXQgbGlzdAotICogICAgVHJhbnNtaXQgaW50ZXJydXB0cyBhcmUgb25seSBlbmFibGVkIHdoZW4gdHJhbnNtaXQgcXVldWUgaXMgZnVsbAotICoKLSAqIFJldmlzaW9uIDEuMjguMi4xICAyMDAyLzA0LzMwIDA4OjE1OjUxICBzdGFydmlrCi0gKiBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudHM6Ci0gKiAgIExhcmdlIHBhY2tldHMgYXJlIG5vdCBjb3BpZWQgKGJyZWFrcG9pbnQgc2V0IHRvIDI1NiBieXRlcykKLSAqICAgVGhlIGNhY2hlIGJ1ZyB3b3JrYXJvdW5kIGlzIGRlbGF5ZWQgdW50aWwgaGFsZiBvZiB0aGUgcmVjZWl2ZSBsaXN0Ci0gKiAgICAgaGFzIGJlZW4gdXNlZC4KLSAqICAgQWRkZWQgdHJhbnNtaXQgbGlzdAotICogICBUcmFuc21pdCBpbnRlcnJ1cHRzIGFyZSBvbmx5IGVuYWJsZWQgd2hlbiB0cmFuc21pdCBxdWV1ZSBpcyBmdWxsCi0gKgotICogUmV2aXNpb24gMS4yOCAgMjAwMi8wNC8yMiAxMTo0NzoyMSAgam9oYW5hCi0gKiBGaXggYWNjb3JkaW5nIHRvIDIuNC4xOS1wcmU3LiB0aW1lX2FmdGVyL3RpbWVfYmVmb3JlIGFuZAotICogbWlzc2luZyBlbmQgb2YgY29tbWVudC4KLSAqIFRoZSBwYXRjaCBoYXMgYSB0eXBvIGZvciBldGhlcm5ldC5jIGluIGUxMDBfY2xlYXJfbmV0d29ya19sZWRzKCksCi0gKiAgdGhhdCBpcyBmaXhlZCBoZXJlLgotICoKLSAqIFJldmlzaW9uIDEuMjcgIDIwMDIvMDQvMTIgMTE6NTU6MTEgIGJqb3JudwotICogQWRkZWQgVE9ETwotICoKLSAqIFJldmlzaW9uIDEuMjYgIDIwMDIvMDMvMTUgMTc6MTE6MDIgIGJqb3JudwotICogVXNlIHByZXBhcmVfcnhfZGVzY3JpcHRvciBhZnRlciB0aGUgQ1BVIGhhcyB0b3VjaGVkIHRoZSByZWNlaXZpbmcgZGVzY3MKLSAqCi0gKiBSZXZpc2lvbiAxLjI1ICAyMDAyLzAzLzA4IDEzOjA3OjUzICBiam9ybncKLSAqIFVubmVjZXNzYXJ5IHNwaW5sb2NrIHJlbW92ZWQKLSAqCi0gKiBSZXZpc2lvbiAxLjI0ICAyMDAyLzAyLzIwIDEyOjU3OjQzICBmcmVkcmlrcwotICogUmVwbGFjZWQgTUlOKCkgd2l0aCBtaW4oKS4KLSAqCi0gKiBSZXZpc2lvbiAxLjIzICAyMDAyLzAyLzIwIDEwOjU4OjE0ICBmcmVkcmlrcwotICogU3RyaXAgdGhlIEV0aGVybmV0IGNoZWNrc3VtICg0IGJ5dGVzKSBiZWZvcmUgZm9yd2FyZGluZyBhIGZyYW1lIHRvIHVwcGVyIGxheWVycy4KLSAqCi0gKiBSZXZpc2lvbiAxLjIyICAyMDAyLzAxLzMwIDA3OjQ4OjIyICBtYXRzZmcKLSAqIEluaXRpYXRlIFJfTkVUV09SS19UUl9DVFJMCi0gKgotICogUmV2aXNpb24gMS4yMSAgMjAwMS8xMS8yMyAxMTo1NDo0OSAgc3RhcnZpawotICogQWRkZWQgSUZGX1BST01JU0MgYW5kIElGRl9BTExNVUxUSSBoYW5kbGluZyBpbiBzZXRfbXVsdGljYXN0X2xpc3QKLSAqIFJlbW92ZWQgY29tcGlsZXIgd2FybmluZ3MKLSAqCi0gKiBSZXZpc2lvbiAxLjIwICAyMDAxLzExLzEyIDE5OjI2OjAwICBwa2oKLSAqICogQ29ycmVjdGVkIGUxMDBfbmVnb3RpYXRlKCkgdG8gbm90IGFzc2lnbiBoYWxmIHRvIGN1cnJlbnRfZHVwbGV4IHdoZW4KLSAqICAgaXQgd2FzIHN1cHBvc2VkIHRvIGNvbXBhcmUgdGhlbS4uLgotICogKiBDbGVhbmVkIHVwIGZhaWx1cmUgaGFuZGxpbmcgaW4gZTEwMF9vcGVuKCkuCi0gKiAqIEZpeGVkIGNvbXBpbGVyIHdhcm5pbmdzLgotICoKLSAqIFJldmlzaW9uIDEuMTkgIDIwMDEvMTEvMDkgMDc6NDM6MDkgIHN0YXJ2aWsKLSAqIEFkZGVkIGZ1bGwgZHVwbGV4IHN1cHBvcnQKLSAqIEFkZGVkIGlvY3RsIHRvIHNldCBzcGVlZCBhbmQgZHVwbGV4Ci0gKiBDbGVhciBMRUQgdGltZXIgb25seSBydW5zIHdoZW4gTEVEIGlzIGxpdAotICoKLSAqIFJldmlzaW9uIDEuMTggIDIwMDEvMTAvMDMgMTQ6NDA6NDMgIGpvbmFzaGcKLSAqIFVwZGF0ZSByeF9ieXRlcyBjb3VudGVyLgotICoKLSAqIFJldmlzaW9uIDEuMTcgIDIwMDEvMDYvMTEgMTI6NDM6NDYgIG9sb2YKLSAqIE1vZGlmaWVkIGRlZmluZXMgZm9yIG5ldHdvcmsgTEVEIGJlaGF2aW9yCi0gKgotICogUmV2aXNpb24gMS4xNiAgMjAwMS8wNS8zMCAwNjoxMjo0NiAgbWFya3VzbAotICogVHhEZXNjLm5leHQgc2hvdWxkIG5vdCBiZSBzZXQgdG8gTlVMTAotICoKLSAqIFJldmlzaW9uIDEuMTUgIDIwMDEvMDUvMjkgMTA6Mjc6MDQgIG1hcmt1c2wKLSAqIFVwZGF0ZWQgYWZ0ZXIgcmV2aWV3IHJlbWFya3M6Ci0gKiArVXNlIElPX0VYVFJBQ1QKLSAqICtIYW5kbGUgdW5kZXJydW4KLSAqCi0gKiBSZXZpc2lvbiAxLjE0ICAyMDAxLzA1LzI5IDA5OjIwOjE0ICBqb25hc2hnCi0gKiBVc2UgZHJpdmVyIG5hbWUgb24gcHJpbnRrIG91dHB1dCBzbyBvbmUgY2FuIHRlbGwgd2hpY2ggZHJpdmVyIHRoYXQgY29tcGxhaW5zLgotICoKLSAqIFJldmlzaW9uIDEuMTMgIDIwMDEvMDUvMDkgMTI6MzU6NTkgIGpvaGFuYQotICogVXNlIERNQV9OQlIgYW5kIElSUV9OQlIgZGVmaW5lcyBmcm9tIGRtYS5oIGFuZCBpcnEuaAotICoKLSAqIFJldmlzaW9uIDEuMTIgIDIwMDEvMDQvMDUgMTE6NDM6MTEgIHRvYmlhc2EKLSAqIENoZWNrIGRldiBiZWZvcmUgcGFuaWMuCi0gKgotICogUmV2aXNpb24gMS4xMSAgMjAwMS8wNC8wNCAxMToyMTowNSAgbWFya3VzbAotICogVXBkYXRlZCBhY2NvcmRpbmcgdG8gcmV2aWV3IHJlbWFya3MKLSAqCi0gKiBSZXZpc2lvbiAxLjEwICAyMDAxLzAzLzI2IDE2OjAzOjA2ICBiam9ybncKLSAqIE5lZWRzIGxpbnV4L2NvbmZpZy5oCi0gKgotICogUmV2aXNpb24gMS45ICAyMDAxLzAzLzE5IDE0OjQ3OjQ4ICBwa2oKLSAqICogTWFrZSBzdXJlIHRoZXJlIGlzIGFsd2F5cyBhIHBhdXNlIGFmdGVyIHRoZSBuZXR3b3JrIExFRHMgYXJlCi0gKiAgIGNoYW5nZWQgc28gdGhleSB3aWxsIG5vdCBsb29rIGNvbnN0YW50bHkgbGl0IGR1cmluZyBoZWF2eSB0cmFmZmljLgotICogKiBBbHdheXMgdXNlIEhaIHdoZW4gc2V0dGluZyB0aW1lcyByZWxhdGl2ZSB0byBqaWZmaWVzLgotICogKiBVc2UgTEVEX05FVFdPUktfU0VUKCkgd2hlbiBzZXR0aW5nIHRoZSBuZXR3b3JrIExFRHMuCi0gKgotICogUmV2aXNpb24gMS44ICAyMDAxLzAyLzI3IDEzOjUyOjQ4ICBiam9ybncKLSAqIG1hbGxvYy5oIC0+IHNsYWIuaAotICoKLSAqIFJldmlzaW9uIDEuNyAgMjAwMS8wMi8yMyAxMzo0NjozOCAgYmpvcm53Ci0gKiBTcGVsbGxpbmcgY2hlY2sKLSAqCi0gKiBSZXZpc2lvbiAxLjYgIDIwMDEvMDEvMjYgMTU6MjE6MDQgIHN0YXJ2aWsKLSAqIERvbid0IGRpc2FibGUgaW50ZXJydXB0cyB3aGlsZSByZWFkaW5nIE1ESU8gcmVnaXN0ZXJzIChNRElPIGlzIHNsb3cpCi0gKiBDb3JyZWN0ZWQgcHJvbWlzY3VvdXMgbW9kZQotICogSW1wcm92ZWQgZGVhbGxvY2F0aW9uIG9mIElSUXMgKCJpZmNvbmZpZyBldGgwIGRvd24iIG5vdyB3b3JrcykKLSAqCi0gKiBSZXZpc2lvbiAxLjUgIDIwMDAvMTEvMjkgMTc6MjI6MjIgIGJqb3JudwotICogR2V0IHJpZCBvZiB0aGUgdWR3b3JkIHR5cGVzIGxlZ2FjeSBzdHVmZgotICoKLSAqIFJldmlzaW9uIDEuNCAgMjAwMC8xMS8yMiAxNjozNjowOSAgYmpvcm53Ci0gKiBQbGVhc2UgbWFya2V0aW5nIGJ5IHVzaW5nIHRoZSBjb3JyZWN0IGNhc2Ugd2hlbiBzcGVsbGluZyBFdHJheC4KLSAqCi0gKiBSZXZpc2lvbiAxLjMgIDIwMDAvMTEvMjEgMTY6NDM6MDQgIGJqb3JudwotICogTWlub3Igc2hvcnQtPmludCBjaGFuZ2UKLSAqCi0gKiBSZXZpc2lvbiAxLjIgIDIwMDAvMTEvMDggMTQ6Mjc6NTcgIGJqb3JudwotICogMi40IHBvcnQKLSAqCi0gKiBSZXZpc2lvbiAxLjEgIDIwMDAvMTEvMDYgMTM6NTY6MDAgIGJqb3JudwotICogVmVyYmF0aW0gY29weSBvZiB0aGUgMS4yNCB2ZXJzaW9uIG9mIGUxMDBuZXQuYyBmcm9tIGVsaW51eAotICoKLSAqIFJldmlzaW9uIDEuMjQgIDIwMDAvMTAvMDQgMTU6NTU6MjMgIGJqb3JudwotICogKiBVc2UgdmlydF90b19waHlzIGV0Yy4gZm9yIERNQSBhZGRyZXNzZXMKLSAqICogUmVtb3ZlZCBib2d1cyBDSEVDS1NVTV9VTk5FQ0VTU0FSWQotICoKLSAqCiAgKi8KIAogCkBAIC0yNDQsNyArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KIAogI2luY2x1ZGUgPGFzbS9hcmNoL3N2aW50by5oPi8qIERNQSBhbmQgcmVnaXN0ZXIgZGVzY3JpcHRpb25zICovCi0jaW5jbHVkZSA8YXNtL2lvLmg+ICAgICAgICAgLyogTEVEXyogSS9PIGZ1bmN0aW9ucyAqLworI2luY2x1ZGUgPGFzbS9pby5oPiAgICAgICAgIC8qIENSSVNfTEVEXyogSS9PIGZ1bmN0aW9ucyAqLwogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtMTg5OSwxOCArMTY4OCwxOCBAQAogCWlmICghY3VycmVudF9zcGVlZCkgewogCQkvKiBNYWtlIExFRCByZWQsIGxpbmsgaXMgZG93biAqLwogI2lmIGRlZmluZWQoQ09ORklHX0VUUkFYX05FVFdPUktfUkVEX09OX05PX0NPTk5FQ1RJT04pCi0JCUxFRF9ORVRXT1JLX1NFVChMRURfUkVEKTsKKwkJQ1JJU19MRURfTkVUV09SS19TRVQoQ1JJU19MRURfUkVEKTsKICNlbHNlCi0JCUxFRF9ORVRXT1JLX1NFVChMRURfT0ZGKTsKKwkJQ1JJU19MRURfTkVUV09SS19TRVQoQ1JJU19MRURfT0ZGKTsKICNlbmRpZgogCX0gZWxzZSBpZiAobGlnaHRfbGVkcykgewogCQlpZiAoY3VycmVudF9zcGVlZCA9PSAxMCkgewotCQkJTEVEX05FVFdPUktfU0VUKExFRF9PUkFOR0UpOworCQkJQ1JJU19MRURfTkVUV09SS19TRVQoQ1JJU19MRURfT1JBTkdFKTsKIAkJfSBlbHNlIHsKLQkJCUxFRF9ORVRXT1JLX1NFVChMRURfR1JFRU4pOworCQkJQ1JJU19MRURfTkVUV09SS19TRVQoQ1JJU19MRURfR1JFRU4pOwogCQl9CiAJfSBlbHNlIHsKLQkJTEVEX05FVFdPUktfU0VUKExFRF9PRkYpOworCQlDUklTX0xFRF9ORVRXT1JLX1NFVChDUklTX0xFRF9PRkYpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWx4NC9hbGxvYy5jIGIvZHJpdmVycy9uZXQvbWx4NC9hbGxvYy5jCmluZGV4IGIyMjZlMDEuLjUyMWRjMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21seDQvYWxsb2MuYworKysgYi9kcml2ZXJzL25ldC9tbHg0L2FsbG9jLmMKQEAgLTExNiw0MCArMTE2LDUzIEBACiAJCWJ1Zi0+bmJ1ZnMgICAgICAgID0gMTsKIAkJYnVmLT5ucGFnZXMgICAgICAgPSAxOwogCQlidWYtPnBhZ2Vfc2hpZnQgICA9IGdldF9vcmRlcihzaXplKSArIFBBR0VfU0hJRlQ7Ci0JCWJ1Zi0+dS5kaXJlY3QuYnVmID0gZG1hX2FsbG9jX2NvaGVyZW50KCZkZXYtPnBkZXYtPmRldiwKKwkJYnVmLT5kaXJlY3QuYnVmICAgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmRldi0+cGRldi0+ZGV2LAogCQkJCQkJICAgICAgIHNpemUsICZ0LCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFidWYtPnUuZGlyZWN0LmJ1ZikKKwkJaWYgKCFidWYtPmRpcmVjdC5idWYpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAotCQlidWYtPnUuZGlyZWN0Lm1hcCA9IHQ7CisJCWJ1Zi0+ZGlyZWN0Lm1hcCA9IHQ7CiAKIAkJd2hpbGUgKHQgJiAoKDEgPDwgYnVmLT5wYWdlX3NoaWZ0KSAtIDEpKSB7CiAJCQktLWJ1Zi0+cGFnZV9zaGlmdDsKIAkJCWJ1Zi0+bnBhZ2VzICo9IDI7CiAJCX0KIAotCQltZW1zZXQoYnVmLT51LmRpcmVjdC5idWYsIDAsIHNpemUpOworCQltZW1zZXQoYnVmLT5kaXJlY3QuYnVmLCAwLCBzaXplKTsKIAl9IGVsc2UgewogCQlpbnQgaTsKIAogCQlidWYtPm5idWZzICAgICAgID0gKHNpemUgKyBQQUdFX1NJWkUgLSAxKSAvIFBBR0VfU0laRTsKIAkJYnVmLT5ucGFnZXMgICAgICA9IGJ1Zi0+bmJ1ZnM7CiAJCWJ1Zi0+cGFnZV9zaGlmdCAgPSBQQUdFX1NISUZUOwotCQlidWYtPnUucGFnZV9saXN0ID0ga3phbGxvYyhidWYtPm5idWZzICogc2l6ZW9mICpidWYtPnUucGFnZV9saXN0LAorCQlidWYtPnBhZ2VfbGlzdCAgID0ga3phbGxvYyhidWYtPm5idWZzICogc2l6ZW9mICpidWYtPnBhZ2VfbGlzdCwKIAkJCQkJICAgR0ZQX0tFUk5FTCk7Ci0JCWlmICghYnVmLT51LnBhZ2VfbGlzdCkKKwkJaWYgKCFidWYtPnBhZ2VfbGlzdCkKIAkJCXJldHVybiAtRU5PTUVNOwogCiAJCWZvciAoaSA9IDA7IGkgPCBidWYtPm5idWZzOyArK2kpIHsKLQkJCWJ1Zi0+dS5wYWdlX2xpc3RbaV0uYnVmID0KKwkJCWJ1Zi0+cGFnZV9saXN0W2ldLmJ1ZiA9CiAJCQkJZG1hX2FsbG9jX2NvaGVyZW50KCZkZXYtPnBkZXYtPmRldiwgUEFHRV9TSVpFLAogCQkJCQkJICAgJnQsIEdGUF9LRVJORUwpOwotCQkJaWYgKCFidWYtPnUucGFnZV9saXN0W2ldLmJ1ZikKKwkJCWlmICghYnVmLT5wYWdlX2xpc3RbaV0uYnVmKQogCQkJCWdvdG8gZXJyX2ZyZWU7CiAKLQkJCWJ1Zi0+dS5wYWdlX2xpc3RbaV0ubWFwID0gdDsKKwkJCWJ1Zi0+cGFnZV9saXN0W2ldLm1hcCA9IHQ7CiAKLQkJCW1lbXNldChidWYtPnUucGFnZV9saXN0W2ldLmJ1ZiwgMCwgUEFHRV9TSVpFKTsKKwkJCW1lbXNldChidWYtPnBhZ2VfbGlzdFtpXS5idWYsIDAsIFBBR0VfU0laRSk7CisJCX0KKworCQlpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkgeworCQkJc3RydWN0IHBhZ2UgKipwYWdlczsKKwkJCXBhZ2VzID0ga21hbGxvYyhzaXplb2YgKnBhZ2VzICogYnVmLT5uYnVmcywgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXBhZ2VzKQorCQkJCWdvdG8gZXJyX2ZyZWU7CisJCQlmb3IgKGkgPSAwOyBpIDwgYnVmLT5uYnVmczsgKytpKQorCQkJCXBhZ2VzW2ldID0gdmlydF90b19wYWdlKGJ1Zi0+cGFnZV9saXN0W2ldLmJ1Zik7CisJCQlidWYtPmRpcmVjdC5idWYgPSB2bWFwKHBhZ2VzLCBidWYtPm5idWZzLCBWTV9NQVAsIFBBR0VfS0VSTkVMKTsKKwkJCWtmcmVlKHBhZ2VzKTsKKwkJCWlmICghYnVmLT5kaXJlY3QuYnVmKQorCQkJCWdvdG8gZXJyX2ZyZWU7CiAJCX0KIAl9CiAKQEAgLTE2NywxNSArMTgwLDE4IEBACiAJaW50IGk7CiAKIAlpZiAoYnVmLT5uYnVmcyA9PSAxKQotCQlkbWFfZnJlZV9jb2hlcmVudCgmZGV2LT5wZGV2LT5kZXYsIHNpemUsIGJ1Zi0+dS5kaXJlY3QuYnVmLAotCQkJCSAgYnVmLT51LmRpcmVjdC5tYXApOworCQlkbWFfZnJlZV9jb2hlcmVudCgmZGV2LT5wZGV2LT5kZXYsIHNpemUsIGJ1Zi0+ZGlyZWN0LmJ1ZiwKKwkJCQkgIGJ1Zi0+ZGlyZWN0Lm1hcCk7CiAJZWxzZSB7CisJCWlmIChCSVRTX1BFUl9MT05HID09IDY0KQorCQkJdnVubWFwKGJ1Zi0+ZGlyZWN0LmJ1Zik7CisKIAkJZm9yIChpID0gMDsgaSA8IGJ1Zi0+bmJ1ZnM7ICsraSkKLQkJCWlmIChidWYtPnUucGFnZV9saXN0W2ldLmJ1ZikKKwkJCWlmIChidWYtPnBhZ2VfbGlzdFtpXS5idWYpCiAJCQkJZG1hX2ZyZWVfY29oZXJlbnQoJmRldi0+cGRldi0+ZGV2LCBQQUdFX1NJWkUsCi0JCQkJCQkgIGJ1Zi0+dS5wYWdlX2xpc3RbaV0uYnVmLAotCQkJCQkJICBidWYtPnUucGFnZV9saXN0W2ldLm1hcCk7Ci0JCWtmcmVlKGJ1Zi0+dS5wYWdlX2xpc3QpOworCQkJCQkJICBidWYtPnBhZ2VfbGlzdFtpXS5idWYsCisJCQkJCQkgIGJ1Zi0+cGFnZV9saXN0W2ldLm1hcCk7CisJCWtmcmVlKGJ1Zi0+cGFnZV9saXN0KTsKIAl9CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtbHg0X2J1Zl9mcmVlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21seDQvbXIuYyBiL2RyaXZlcnMvbmV0L21seDQvbXIuYwppbmRleCA5YzllMzA4Li42NzlkZmRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tbHg0L21yLmMKKysrIGIvZHJpdmVycy9uZXQvbWx4NC9tci5jCkBAIC00MTksOSArNDE5LDkgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBidWYtPm5wYWdlczsgKytpKQogCQlpZiAoYnVmLT5uYnVmcyA9PSAxKQotCQkJcGFnZV9saXN0W2ldID0gYnVmLT51LmRpcmVjdC5tYXAgKyAoaSA8PCBidWYtPnBhZ2Vfc2hpZnQpOworCQkJcGFnZV9saXN0W2ldID0gYnVmLT5kaXJlY3QubWFwICsgKGkgPDwgYnVmLT5wYWdlX3NoaWZ0KTsKIAkJZWxzZQotCQkJcGFnZV9saXN0W2ldID0gYnVmLT51LnBhZ2VfbGlzdFtpXS5tYXA7CisJCQlwYWdlX2xpc3RbaV0gPSBidWYtPnBhZ2VfbGlzdFtpXS5tYXA7CiAKIAllcnIgPSBtbHg0X3dyaXRlX210dChkZXYsIG10dCwgMCwgYnVmLT5ucGFnZXMsIHBhZ2VfbGlzdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYzkxeC5oIGIvZHJpdmVycy9uZXQvc21jOTF4LmgKaW5kZXggMjcxYzI4ZC4uNTFkNDEzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21jOTF4LmgKKysrIGIvZHJpdmVycy9uZXQvc21jOTF4LmgKQEAgLTQ1MCw4ICs0NTAsMjAgQEAKICNkZWZpbmUgU01DX291dHNsKGEsIHIsIHAsIGwpCXdyaXRlc2woKGEpICsgKHIpLCBwLCBsKQogI2RlZmluZSBTTUNfSVJRX0ZMQUdTCQkoLTEpCS8qIGZyb20gcmVzb3VyY2UgKi8KIAorI2VsaWYgZGVmaW5lZChDT05GSUdfTU4xMDMwMCkKKworLyoKKyAqIE1OMTAzMDAvQU0zMyBjb25maWd1cmF0aW9uCisgKi8KKworI2luY2x1ZGUgPGFzbS91bml0L3NtYzkxMTExLmg+CisKICNlbHNlCiAKKy8qCisgKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAqLworCiAjZGVmaW5lIFNNQ19DQU5fVVNFXzhCSVQJMQogI2RlZmluZSBTTUNfQ0FOX1VTRV8xNkJJVAkxCiAjZGVmaW5lIFNNQ19DQU5fVVNFXzMyQklUCTEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi94MjVfYXN5LmMgYi9kcml2ZXJzL25ldC93YW4veDI1X2FzeS5jCmluZGV4IDFlODlkNGQuLjVlMmQ3NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi94MjVfYXN5LmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3gyNV9hc3kuYwpAQCAtNTU0LDYgKzU1NCw3IEBACiBzdGF0aWMgaW50IHgyNV9hc3lfb3Blbl90dHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKIAlzdHJ1Y3QgeDI1X2FzeSAqc2wgPSAoc3RydWN0IHgyNV9hc3kgKikgdHR5LT5kaXNjX2RhdGE7CisJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CiAJaW50IGVycjsKIAogCS8qIEZpcnN0IG1ha2Ugc3VyZSB3ZSdyZSBub3QgYWxyZWFkeSBjb25uZWN0ZWQuICovCkBAIC01NzIsOSArNTczLDcgQEAKIAlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikgIHsKIAkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOwogCX0KLQlpZiAodHR5LT5sZGlzYy5mbHVzaF9idWZmZXIpICB7Ci0JCXR0eS0+bGRpc2MuZmx1c2hfYnVmZmVyKHR0eSk7Ci0JfQorCXR0eV9sZGlzY19mbHVzaCh0dHkpOwogCiAJLyogUmVzdG9yZSBkZWZhdWx0IHNldHRpbmdzICovCiAJc2wtPmRldi0+dHlwZSA9IEFSUEhSRF9YMjU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbGVkcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2xlZHMuYwppbmRleCAwOTA4MzM1Li4wYWFjMWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbGVkcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9sZWRzLmMKQEAgLTE0NywxMiArMTQ3LDEyIEBACiAJY2FzZSBCNDNfTEVEX1RSQU5TRkVSOgogCWNhc2UgQjQzX0xFRF9BUFRSQU5TRkVSOgogCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksCi0JCQkgImI0My0lczp0eCIsIHdpcGh5X25hbWUoaHctPndpcGh5KSk7CisJCQkgImI0My0lczo6dHgiLCB3aXBoeV9uYW1lKGh3LT53aXBoeSkpOwogCQliNDNfcmVnaXN0ZXJfbGVkKGRldiwgJmRldi0+bGVkX3R4LCBuYW1lLAogCQkJCSBpZWVlODAyMTFfZ2V0X3R4X2xlZF9uYW1lKGh3KSwKIAkJCQkgbGVkX2luZGV4LCBhY3RpdmVsb3cpOwogCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksCi0JCQkgImI0My0lczpyeCIsIHdpcGh5X25hbWUoaHctPndpcGh5KSk7CisJCQkgImI0My0lczo6cngiLCB3aXBoeV9uYW1lKGh3LT53aXBoeSkpOwogCQliNDNfcmVnaXN0ZXJfbGVkKGRldiwgJmRldi0+bGVkX3J4LCBuYW1lLAogCQkJCSBpZWVlODAyMTFfZ2V0X3J4X2xlZF9uYW1lKGh3KSwKIAkJCQkgbGVkX2luZGV4LCBhY3RpdmVsb3cpOwpAQCAtMTYyLDcgKzE2Miw3IEBACiAJY2FzZSBCNDNfTEVEX1JBRElPX0I6CiAJY2FzZSBCNDNfTEVEX01PREVfQkc6CiAJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwKLQkJCSAiYjQzLSVzOnJhZGlvIiwgd2lwaHlfbmFtZShody0+d2lwaHkpKTsKKwkJCSAiYjQzLSVzOjpyYWRpbyIsIHdpcGh5X25hbWUoaHctPndpcGh5KSk7CiAJCWI0M19yZWdpc3Rlcl9sZWQoZGV2LCAmZGV2LT5sZWRfcmFkaW8sIG5hbWUsCiAJCQkJIGI0M19yZmtpbGxfbGVkX25hbWUoZGV2KSwKIAkJCQkgbGVkX2luZGV4LCBhY3RpdmVsb3cpOwpAQCAtMTczLDcgKzE3Myw3IEBACiAJY2FzZSBCNDNfTEVEX1dFSVJEOgogCWNhc2UgQjQzX0xFRF9BU1NPQzoKIAkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLAotCQkJICJiNDMtJXM6YXNzb2MiLCB3aXBoeV9uYW1lKGh3LT53aXBoeSkpOworCQkJICJiNDMtJXM6OmFzc29jIiwgd2lwaHlfbmFtZShody0+d2lwaHkpKTsKIAkJYjQzX3JlZ2lzdGVyX2xlZChkZXYsICZkZXYtPmxlZF9hc3NvYywgbmFtZSwKIAkJCQkgaWVlZTgwMjExX2dldF9hc3NvY19sZWRfbmFtZShodyksCiAJCQkJIGxlZF9pbmRleCwgYWN0aXZlbG93KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvYmFzZS5jIGIvZHJpdmVycy9vZi9iYXNlLmMKaW5kZXggYjMwNmZlZi4uODBjOWRlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9iYXNlLmMKKysrIGIvZHJpdmVycy9vZi9iYXNlLmMKQEAgLTEzOCw2ICsxMzgsMzEgQEAKIEVYUE9SVF9TWU1CT0wob2ZfZ2V0X3BhcmVudCk7CiAKIC8qKgorICoJb2ZfZ2V0X25leHRfcGFyZW50IC0gSXRlcmF0ZSB0byBhIG5vZGUncyBwYXJlbnQKKyAqCUBub2RlOglOb2RlIHRvIGdldCBwYXJlbnQgb2YKKyAqCisgKiAJVGhpcyBpcyBsaWtlIG9mX2dldF9wYXJlbnQoKSBleGNlcHQgdGhhdCBpdCBkcm9wcyB0aGUKKyAqIAlyZWZjb3VudCBvbiB0aGUgcGFzc2VkIG5vZGUsIG1ha2luZyBpdCBzdWl0YWJsZSBmb3IgaXRlcmF0aW5nCisgKiAJdGhyb3VnaCBhIG5vZGUncyBwYXJlbnRzLgorICoKKyAqCVJldHVybnMgYSBub2RlIHBvaW50ZXIgd2l0aCByZWZjb3VudCBpbmNyZW1lbnRlZCwgdXNlCisgKglvZl9ub2RlX3B1dCgpIG9uIGl0IHdoZW4gZG9uZS4KKyAqLworc3RydWN0IGRldmljZV9ub2RlICpvZl9nZXRfbmV4dF9wYXJlbnQoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50OworCisJaWYgKCFub2RlKQorCQlyZXR1cm4gTlVMTDsKKworCXJlYWRfbG9jaygmZGV2dHJlZV9sb2NrKTsKKwlwYXJlbnQgPSBvZl9ub2RlX2dldChub2RlLT5wYXJlbnQpOworCW9mX25vZGVfcHV0KG5vZGUpOworCXJlYWRfdW5sb2NrKCZkZXZ0cmVlX2xvY2spOworCXJldHVybiBwYXJlbnQ7Cit9CisKKy8qKgogICoJb2ZfZ2V0X25leHRfY2hpbGQgLSBJdGVyYXRlIGEgbm9kZSBjaGlsZHMKICAqCUBub2RlOglwYXJlbnQgbm9kZQogICoJQHByZXY6CXByZXZpb3VzIGNoaWxkIG9mIHRoZSBwYXJlbnQgbm9kZSwgb3IgTlVMTCB0byBnZXQgZmlyc3QKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvcGxhdGZvcm0uYyBiL2RyaXZlcnMvb2YvcGxhdGZvcm0uYwppbmRleCBiNDdiYjJkLi5jYTA5YTYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9vZi9wbGF0Zm9ybS5jCkBAIC04NSw2ICs4NSwxNSBAQAogCXJldHVybiBlcnJvcjsKIH0KIAorc3RhdGljIHZvaWQgb2ZfcGxhdGZvcm1fZGV2aWNlX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICpkcnYgPSB0b19vZl9wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCisJaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+c2h1dGRvd24pCisJCWRydi0+c2h1dGRvd24ob2ZfZGV2KTsKK30KKwogaW50IG9mX2J1c190eXBlX2luaXQoc3RydWN0IGJ1c190eXBlICpidXMsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJYnVzLT5uYW1lID0gbmFtZTsKQEAgLTkzLDYgKzEwMiw3IEBACiAJYnVzLT5yZW1vdmUgPSBvZl9wbGF0Zm9ybV9kZXZpY2VfcmVtb3ZlOwogCWJ1cy0+c3VzcGVuZCA9IG9mX3BsYXRmb3JtX2RldmljZV9zdXNwZW5kOwogCWJ1cy0+cmVzdW1lID0gb2ZfcGxhdGZvcm1fZGV2aWNlX3Jlc3VtZTsKKwlidXMtPnNodXRkb3duID0gb2ZfcGxhdGZvcm1fZGV2aWNlX3NodXRkb3duOwogCXJldHVybiBidXNfcmVnaXN0ZXIoYnVzKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L0tjb25maWcgYi9kcml2ZXJzL3BhcnBvcnQvS2NvbmZpZwppbmRleCBkNDQ5YjE1Li5iN2JjZGNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcnBvcnQvS2NvbmZpZworKysgYi9kcml2ZXJzL3BhcnBvcnQvS2NvbmZpZwpAQCAtMzUsNyArMzUsOCBAQAogCiBjb25maWcgUEFSUE9SVF9QQwogCXRyaXN0YXRlICJQQy1zdHlsZSBoYXJkd2FyZSIKLQlkZXBlbmRzIG9uICghU1BBUkM2NCB8fCBQQ0kpICYmICFTUEFSQzMyICYmICFNMzJSICYmICFGUlYgJiYgKCFNNjhLIHx8IElTQSkKKwlkZXBlbmRzIG9uICghU1BBUkM2NCB8fCBQQ0kpICYmICFTUEFSQzMyICYmICFNMzJSICYmICFGUlYgJiYgXAorCQkoIU02OEsgfHwgSVNBKSAmJiAhTU4xMDMwMAogCS0tLWhlbHAtLS0KIAkgIFlvdSBzaG91bGQgc2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFBDLXN0eWxlIHBhcmFsbGVsIHBvcnQuIEFsbAogCSAgSUJNIFBDIGNvbXBhdGlibGUgY29tcHV0ZXJzIGFuZCBzb21lIEFscGhhcyBoYXZlIFBDLXN0eWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcnBvcnQvaWVlZTEyODRfb3BzLmMgYi9kcml2ZXJzL3BhcnBvcnQvaWVlZTEyODRfb3BzLmMKaW5kZXggNTI1MzEyZi4uMmUyMWFmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJwb3J0L2llZWUxMjg0X29wcy5jCisrKyBiL2RyaXZlcnMvcGFycG9ydC9pZWVlMTI4NF9vcHMuYwpAQCAtODg4LDcgKzg4OCw3IEBACiAKIAkJLyogRXZlbnQgNTk6IHNldCBuU2VsZWN0SW4gKG5BU3RyYikgaGlnaCAqLwogCQlwYXJwb3J0X2Zyb2JfY29udHJvbCAocG9ydCwgUEFSUE9SVF9DT05UUk9MX1NFTEVDVCwKLQkJCQkgICAgICBQQVJQT1JUX0NPTlRST0xfU0VMRUNUKTsKKwkJCQkgICAgICAwKTsKIAogCQkvKiBFdmVudCA2MDogd2FpdCBmb3IgQnVzeSB0byBnbyBsb3cgKi8KIAkJaWYgKHBhcnBvcnRfcG9sbF9wZXJpcGhlcmFsIChwb3J0LCBQQVJQT1JUX1NUQVRVU19CVVNZLCAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL01ha2VmaWxlIGIvZHJpdmVycy9wY2kvTWFrZWZpbGUKaW5kZXggOWYwNGQxNy4uNGQxY2UyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wY2kvTWFrZWZpbGUKQEAgLTM4LDYgKzM4LDcgQEAKIG9iai0kKENPTkZJR19QUEMpICs9IHNldHVwLWJ1cy5vCiBvYmotJChDT05GSUdfTUlQUykgKz0gc2V0dXAtYnVzLm8gc2V0dXAtaXJxLm8KIG9iai0kKENPTkZJR19YODZfVklTV1MpICs9IHNldHVwLWlycS5vCitvYmotJChDT05GSUdfTU4xMDMwMCkgKz0gc2V0dXAtYnVzLm8KIAogIwogIyBBQ1BJIFJlbGF0ZWQgUENJIEZXIEZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaW50ZWwtaW9tbXUuYyBiL2RyaXZlcnMvcGNpL2ludGVsLWlvbW11LmMKaW5kZXggMzFmYTZjOS4uYTRjMzA4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaW50ZWwtaW9tbXUuYworKysgYi9kcml2ZXJzL3BjaS9pbnRlbC1pb21tdS5jCkBAIC02OTIsNiArNjkyLDIzIEBACiAJCURNQV9UTEJfUFNJX0ZMVVNILCBub25fcHJlc2VudF9lbnRyeV9mbHVzaCk7CiB9CiAKK3N0YXRpYyB2b2lkIGlvbW11X2Rpc2FibGVfcHJvdGVjdF9tZW1fcmVnaW9ucyhzdHJ1Y3QgaW50ZWxfaW9tbXUgKmlvbW11KQoreworCXUzMiBwbWVuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKKwlwbWVuID0gcmVhZGwoaW9tbXUtPnJlZyArIERNQVJfUE1FTl9SRUcpOworCXBtZW4gJj0gfkRNQV9QTUVOX0VQTTsKKwl3cml0ZWwocG1lbiwgaW9tbXUtPnJlZyArIERNQVJfUE1FTl9SRUcpOworCisJLyogd2FpdCBmb3IgdGhlIHByb3RlY3RlZCByZWdpb24gc3RhdHVzIGJpdCB0byBjbGVhciAqLworCUlPTU1VX1dBSVRfT1AoaW9tbXUsIERNQVJfUE1FTl9SRUcsCisJCXJlYWRsLCAhKHBtZW4gJiBETUFfUE1FTl9QUlMpLCBwbWVuKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7Cit9CisKIHN0YXRpYyBpbnQgaW9tbXVfZW5hYmxlX3RyYW5zbGF0aW9uKHN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXUpCiB7CiAJdTMyIHN0czsKQEAgLTcyOCw3ICs3NDUsNyBAQAogCiAvKiBpb21tdSBpbnRlcnJ1cHQgaGFuZGxpbmcuIE1vc3Qgc3R1ZmYgYXJlIE1TSS1saWtlLiAqLwogCi1zdGF0aWMgY2hhciAqZmF1bHRfcmVhc29uX3N0cmluZ3NbXSA9CitzdGF0aWMgY29uc3QgY2hhciAqZmF1bHRfcmVhc29uX3N0cmluZ3NbXSA9CiB7CiAJIlNvZnR3YXJlIiwKIAkiUHJlc2VudCBiaXQgaW4gcm9vdCBlbnRyeSBpcyBjbGVhciIsCkBAIC03NDMsMTQgKzc2MCwxMyBAQAogCSJub24temVybyByZXNlcnZlZCBmaWVsZHMgaW4gUlRQIiwKIAkibm9uLXplcm8gcmVzZXJ2ZWQgZmllbGRzIGluIENUUCIsCiAJIm5vbi16ZXJvIHJlc2VydmVkIGZpZWxkcyBpbiBQVEUiLAotCSJVbmtub3duIgogfTsKLSNkZWZpbmUgTUFYX0ZBVUxUX1JFQVNPTl9JRFggCUFSUkFZX1NJWkUoZmF1bHRfcmVhc29uX3N0cmluZ3MpIC0gMQorI2RlZmluZSBNQVhfRkFVTFRfUkVBU09OX0lEWCAJKEFSUkFZX1NJWkUoZmF1bHRfcmVhc29uX3N0cmluZ3MpIC0gMSkKIAotY2hhciAqZG1hcl9nZXRfZmF1bHRfcmVhc29uKHU4IGZhdWx0X3JlYXNvbikKK2NvbnN0IGNoYXIgKmRtYXJfZ2V0X2ZhdWx0X3JlYXNvbih1OCBmYXVsdF9yZWFzb24pCiB7Ci0JaWYgKGZhdWx0X3JlYXNvbiA+PSBNQVhfRkFVTFRfUkVBU09OX0lEWCkKLQkJcmV0dXJuIGZhdWx0X3JlYXNvbl9zdHJpbmdzW01BWF9GQVVMVF9SRUFTT05fSURYIC0gMV07CisJaWYgKGZhdWx0X3JlYXNvbiA+IE1BWF9GQVVMVF9SRUFTT05fSURYKQorCQlyZXR1cm4gIlVua25vd24iOwogCWVsc2UKIAkJcmV0dXJuIGZhdWx0X3JlYXNvbl9zdHJpbmdzW2ZhdWx0X3JlYXNvbl07CiB9CkBAIC04MDgsNyArODI0LDcgQEAKIHN0YXRpYyBpbnQgaW9tbXVfcGFnZV9mYXVsdF9kb19vbmUoc3RydWN0IGludGVsX2lvbW11ICppb21tdSwgaW50IHR5cGUsCiAJCXU4IGZhdWx0X3JlYXNvbiwgdTE2IHNvdXJjZV9pZCwgdTY0IGFkZHIpCiB7Ci0JY2hhciAqcmVhc29uOworCWNvbnN0IGNoYXIgKnJlYXNvbjsKIAogCXJlYXNvbiA9IGRtYXJfZ2V0X2ZhdWx0X3JlYXNvbihmYXVsdF9yZWFzb24pOwogCkBAIC0xNzMwLDYgKzE3NDYsOCBAQAogCQlpb21tdV9mbHVzaF9jb250ZXh0X2dsb2JhbChpb21tdSwgMCk7CiAJCWlvbW11X2ZsdXNoX2lvdGxiX2dsb2JhbChpb21tdSwgMCk7CiAKKwkJaW9tbXVfZGlzYWJsZV9wcm90ZWN0X21lbV9yZWdpb25zKGlvbW11KTsKKwogCQlyZXQgPSBpb21tdV9lbmFibGVfdHJhbnNsYXRpb24oaW9tbXUpOwogCQlpZiAocmV0KQogCQkJZ290byBlcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2ludGVsLWlvbW11LmggYi9kcml2ZXJzL3BjaS9pbnRlbC1pb21tdS5oCmluZGV4IDBlNDg2MjYuLjA3ZjVmNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2ludGVsLWlvbW11LmgKKysrIGIvZHJpdmVycy9wY2kvaW50ZWwtaW9tbXUuaApAQCAtMTQwLDYgKzE0MCwxMCBAQAogI2RlZmluZSBETUFfVExCX0lIX05PTkxFQUYgKCgodTY0KTEpIDw8IDYpCiAjZGVmaW5lIERNQV9UTEJfTUFYX1NJWkUgKDB4M2YpCiAKKy8qIFBNRU5fUkVHICovCisjZGVmaW5lIERNQV9QTUVOX0VQTSAoKCh1MzIpMSk8PDMxKQorI2RlZmluZSBETUFfUE1FTl9QUlMgKCgodTMyKTEpPDwwKQorCiAvKiBHQ01EX1JFRyAqLwogI2RlZmluZSBETUFfR0NNRF9URSAoKCh1MzIpMSkgPDwgMzEpCiAjZGVmaW5lIERNQV9HQ01EX1NSVFAgKCgodTMyKTEpIDw8IDMwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvcG5wYWNwaS9jb3JlLmMgYi9kcml2ZXJzL3BucC9wbnBhY3BpL2NvcmUuYwppbmRleCBkYWRhODk5Li42NjJiNGMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9wbnBhY3BpL2NvcmUuYworKysgYi9kcml2ZXJzL3BucC9wbnBhY3BpL2NvcmUuYwpAQCAtMTgzLDcgKzE4Myw3IEBACiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQogCQlkZXYtPmNhcGFiaWxpdGllcyB8PSBQTlBfQ09ORklHVVJBQkxFOwogCWRldi0+Y2FwYWJpbGl0aWVzIHw9IFBOUF9SRUFEOwotCWlmIChkZXZpY2UtPmZsYWdzLmR5bmFtaWNfc3RhdHVzKQorCWlmIChkZXZpY2UtPmZsYWdzLmR5bmFtaWNfc3RhdHVzICYmIChkZXYtPmNhcGFiaWxpdGllcyAmIFBOUF9DT05GSUdVUkFCTEUpKQogCQlkZXYtPmNhcGFiaWxpdGllcyB8PSBQTlBfV1JJVEU7CiAJaWYgKGRldmljZS0+ZmxhZ3MucmVtb3ZhYmxlKQogCQlkZXYtPmNhcGFiaWxpdGllcyB8PSBQTlBfUkVNT1ZBQkxFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9wb3dlcl9zdXBwbHlfc3lzZnMuYyBiL2RyaXZlcnMvcG93ZXIvcG93ZXJfc3VwcGx5X3N5c2ZzLmMKaW5kZXggZDQ4MjQ4NC4uYzQ0NGQ2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9wb3dlcl9zdXBwbHlfc3lzZnMuYworKysgYi9kcml2ZXJzL3Bvd2VyL3Bvd2VyX3N1cHBseV9zeXNmcy5jCkBAIC0xMDYsNyArMTA2LDYgQEAKIAlQT1dFUl9TVVBQTFlfQVRUUihlbmVyZ3lfbm93KSwKIAlQT1dFUl9TVVBQTFlfQVRUUihlbmVyZ3lfYXZnKSwKIAlQT1dFUl9TVVBQTFlfQVRUUihjYXBhY2l0eSksCi0JUE9XRVJfU1VQUExZX0FUVFIoY2FwYWNpdHlfbGV2ZWwpLAogCVBPV0VSX1NVUFBMWV9BVFRSKHRlbXApLAogCVBPV0VSX1NVUFBMWV9BVFRSKHRlbXBfYW1iaWVudCksCiAJUE9XRVJfU1VQUExZX0FUVFIodGltZV90b19lbXB0eV9ub3cpLApAQCAtMTE2LDYgKzExNSw3IEBACiAJLyogUHJvcGVydGllcyBvZiB0eXBlIGBjb25zdCBjaGFyIConICovCiAJUE9XRVJfU1VQUExZX0FUVFIobW9kZWxfbmFtZSksCiAJUE9XRVJfU1VQUExZX0FUVFIobWFudWZhY3R1cmVyKSwKKwlQT1dFUl9TVVBQTFlfQVRUUihzZXJpYWxfbnVtYmVyKSwKIH07CiAKIHN0YXRpYyBzc2l6ZV90IHBvd2VyX3N1cHBseV9zaG93X3N0YXRpY19hdHRycyhzdHJ1Y3QgZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvS2NvbmZpZyBiL2RyaXZlcnMvc2NzaS9LY29uZmlnCmluZGV4IDE0ZmM3ZjMuLmE1ZjBhYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc2NzaS9LY29uZmlnCkBAIC0xNzksNyArMTc5LDE1IEBACiAJICBzYXkgTSBoZXJlIGFuZCByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24va2J1aWxkL21vZHVsZXMudHh0PiBhbmQKIAkgIDxmaWxlOkRvY3VtZW50YXRpb24vc2NzaS9zY3NpLnR4dD4uIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY2guby4KIAkgIElmIHVuc3VyZSwgc2F5IE4uCi0JCisKK2NvbmZpZyBTQ1NJX0VOQ0xPU1VSRQorCXRyaXN0YXRlICJTQ1NJIEVuY2xvc3VyZSBTdXBwb3J0IgorCWRlcGVuZHMgb24gU0NTSSAmJiBFTkNMT1NVUkVfU0VSVklDRVMKKwloZWxwCisJICBFbmNsb3N1cmVzIGFyZSBkZXZpY2VzIHNpdHRpbmcgb24gb3IgaW4gU0NTSSBiYWNrcGxhbmVzIHRoYXQKKwkgIG1hbmFnZSBkZXZpY2VzLiAgSWYgeW91IGhhdmUgYSBkaXNrIGNhZ2UsIHRoZSBjaGFuY2VzIGFyZSB0aGF0CisJICBpdCBoYXMgYW4gZW5jbG9zdXJlIGRldmljZS4gIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIGp1c3QgYWxsb3cKKwkgIGNlcnRhaW4gZW5jbG9zdXJlIGNvbmRpdGlvbnMgdG8gYmUgcmVwb3J0ZWQgYW5kIGlzIG5vdCByZXF1aXJlZC4KIAogY29tbWVudCAiU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zIgogCWRlcGVuZHMgb24gU0NTSQpAQCAtMzUwLDE3ICszNTgsNiBAQAogCSAgSWYgeW91IGhhdmUgYSBXZXN0ZXJuIERpZ2l0YWwgV0Q5MyBTQ1NJIGNvbnRyb2xsZXIgb24KIAkgIGFuIFNHSSBNSVBTIHN5c3RlbSwgc2F5IFkuICBPdGhlcndpc2UsIHNheSBOLgogCi1jb25maWcgU0NTSV9ERUNOQ1IKLQl0cmlzdGF0ZSAiREVDIE5DUjUzQzk0IFNjc2kgRHJpdmVyIgotCWRlcGVuZHMgb24gTUFDSF9ERUNTVEFUSU9OICYmIFNDU0kgJiYgVEMKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIE5DUjUzQzk0IFNDU0kgY29udHJvbGxlciBjaGlwcyBvbiBJT0FTSUMKLQkgIGJhc2VkIFRVUkJPY2hhbm5lbCBERUNzdGF0aW9ucyBhbmQgVFVSQk9jaGFubmVsIFBNQVotQSBjYXJkcy4KLQotY29uZmlnIFNDU0lfREVDU0lJCi0JdHJpc3RhdGUgIkRFQyBTSUkgU2NzaSBEcml2ZXIiCi0JZGVwZW5kcyBvbiBNQUNIX0RFQ1NUQVRJT04gJiYgU0NTSSAmJiAzMkJJVAotCiBjb25maWcgQkxLX0RFVl8zV19YWFhYX1JBSUQKIAl0cmlzdGF0ZSAiM3dhcmUgNS82LzcvOHh4eCBBVEEtUkFJRCBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENJICYmIFNDU0kKQEAgLTEyNjMsMTcgKzEyNjAsNiBAQAogCSAgbm90IGFsbG93IHRhcmdldHMgdG8gZGlzY29ubmVjdCBpcyBub3QgcmVhc29uYWJsZSBpZiB0aGVyZSBpcyBtb3JlCiAJICB0aGFuIDEgZGV2aWNlIG9uIGEgU0NTSSBidXMuIFRoZSBub3JtYWwgYW5zd2VyIHRoZXJlZm9yZSBpcyBOLgogCi1jb25maWcgU0NTSV9NQ0FfNTNDOVgKLQl0cmlzdGF0ZSAiTkNSIE1DQSA1M0M5eCBTQ1NJIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNQ0FfTEVHQUNZICYmIFNDU0kgJiYgQlJPS0VOX09OX1NNUAotCWhlbHAKLQkgIFNvbWUgTWljcm9DaGFubmVsIG1hY2hpbmVzLCBub3RhYmx5IHRoZSBOQ1IgMzV4eCBsaW5lLCB1c2UgYSBTQ1NJCi0JICBjb250cm9sbGVyIGJhc2VkIG9uIHRoZSBOQ1IgNTNDOTQuICBUaGlzIGRyaXZlciB3aWxsIGFsbG93IHVzZSBvZgotCSAgdGhlIGNvbnRyb2xsZXIgb24gdGhlIDM1NTAsIGFuZCB2ZXJ5IHBvc3NpYmx5IG90aGVycy4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbWNhXzUzYzl4LgotCiBjb25maWcgU0NTSV9QQVMxNgogCXRyaXN0YXRlICJQQVMxNiBTQ1NJIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJU0EgJiYgU0NTSQpAQCAtMTYwMCw0NSArMTU4Niw2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBndnAxMS4KIAotY29uZmlnIENZQkVSU1RPUk1fU0NTSQotCXRyaXN0YXRlICJDeWJlclN0b3JtIFNDU0kgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFpPUlJPICYmIFNDU0kKLQloZWxwCi0JICBJZiB5b3UgaGF2ZSBhbiBBbWlnYSB3aXRoIGFuIG9yaWdpbmFsIChNa0kpIFBoYXNlNSBDeWJlcnN0b3JtCi0JICBhY2NlbGVyYXRvciBib2FyZCBhbmQgdGhlIG9wdGlvbmFsIEN5YmVyc3Rvcm0gU0NTSSBjb250cm9sbGVyLAotCSAgYW5zd2VyIFkuIE90aGVyd2lzZSwgc2F5IE4uCi0KLWNvbmZpZyBDWUJFUlNUT1JNSUlfU0NTSQotCXRyaXN0YXRlICJDeWJlclN0b3JtIE1rIElJIFNDU0kgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFpPUlJPICYmIFNDU0kKLQloZWxwCi0JICBJZiB5b3UgaGF2ZSBhbiBBbWlnYSB3aXRoIGEgUGhhc2U1IEN5YmVyc3Rvcm0gTWtJSSBhY2NlbGVyYXRvciBib2FyZAotCSAgYW5kIHRoZSBvcHRpb25hbCBDeWJlcnN0b3JtIFNDU0kgY29udHJvbGxlciwgc2F5IFkuIE90aGVyd2lzZSwKLQkgIGFuc3dlciBOLgotCi1jb25maWcgQkxaMjA2MF9TQ1NJCi0JdHJpc3RhdGUgIkJsaXp6YXJkIDIwNjAgU0NTSSBzdXBwb3J0IgotCWRlcGVuZHMgb24gWk9SUk8gJiYgU0NTSQotCWhlbHAKLQkgIElmIHlvdSBoYXZlIGFuIEFtaWdhIHdpdGggYSBQaGFzZTUgQmxpenphcmQgMjA2MCBhY2NlbGVyYXRvciBib2FyZAotCSAgYW5kIHdhbnQgdG8gdXNlIHRoZSBvbmJvYXJkIFNDU0kgY29udHJvbGxlciwgc2F5IFkuIE90aGVyd2lzZSwKLQkgIGFuc3dlciBOLgotCi1jb25maWcgQkxaMTIzMF9TQ1NJCi0JdHJpc3RhdGUgIkJsaXp6YXJkIDEyMzBJVi8xMjYwIFNDU0kgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFpPUlJPICYmIFNDU0kKLQloZWxwCi0JICBJZiB5b3UgaGF2ZSBhbiBBbWlnYSAxMjAwIHdpdGggYSBQaGFzZTUgQmxpenphcmQgMTIzMElWIG9yIEJsaXp6YXJkCi0JICAxMjYwIGFjY2VsZXJhdG9yLCBhbmQgdGhlIG9wdGlvbmFsIFNDU0kgbW9kdWxlLCBzYXkgWS4gT3RoZXJ3aXNlLAotCSAgc2F5IE4uCi0KLWNvbmZpZyBGQVNUTEFORV9TQ1NJCi0JdHJpc3RhdGUgIkZhc3RsYW5lIFNDU0kgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFpPUlJPICYmIFNDU0kKLQloZWxwCi0JICBJZiB5b3UgaGF2ZSB0aGUgUGhhc2U1IEZhc3RsYW5lIFozIFNDU0kgY29udHJvbGxlciwgb3IgcGxhbiB0byB1c2UKLQkgIG9uZSBpbiB0aGUgbmVhciBmdXR1cmUsIHNheSBZIHRvIHRoaXMgcXVlc3Rpb24uIE90aGVyd2lzZSwgc2F5IE4uCi0KIGNvbmZpZyBTQ1NJX0E0MDAwVAogCXRyaXN0YXRlICJBNDAwMFQgTkNSNTNjNzEwIFNDU0kgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIEFNSUdBICYmIFNDU0kgJiYgRVhQRVJJTUVOVEFMCkBAIC0xNjY2LDE1ICsxNjEzLDYgQEAKIAkgICAgICBhY2NlbGVyYXRvciBjYXJkIGZvciB0aGUgQW1pZ2EgMTIwMCwKIAkgICAgLSB0aGUgU0NTSSBjb250cm9sbGVyIG9uIHRoZSBHVlAgVHVyYm8gMDQwLzA2MCBhY2NlbGVyYXRvci4KIAotY29uZmlnIE9LVEFHT05fU0NTSQotCXRyaXN0YXRlICJCU0MgT2t0YWdvbiBTQ1NJIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBaT1JSTyAmJiBTQ1NJICYmIEVYUEVSSU1FTlRBTAotCWhlbHAKLQkgIElmIHlvdSBoYXZlIHRoZSBCU0MgT2t0YWdvbiBTQ1NJIGRpc2sgY29udHJvbGxlciBmb3IgdGhlIEFtaWdhLCBzYXkKLQkgIFkgdG8gdGhpcyBxdWVzdGlvbi4gIElmIHlvdSdyZSBpbiBkb3VidCBhYm91dCB3aGV0aGVyIHlvdSBoYXZlIG9uZSwKLQkgIHNlZSB0aGUgcGljdHVyZSBhdAotCSAgPGh0dHA6Ly9hbWlnYS5yZXNvdXJjZS5jeC9leHAvc2VhcmNoLnBsP3Byb2R1Y3Q9b2t0YWdvbj4uCi0KIGNvbmZpZyBBVEFSSV9TQ1NJCiAJdHJpc3RhdGUgIkF0YXJpIG5hdGl2ZSBTQ1NJIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBBVEFSSSAmJiBTQ1NJCkBAIC0xNzI3LDE4ICsxNjY1LDYgQEAKIAkgIFNDU0ktSE9XVE8sIGF2YWlsYWJsZSBmcm9tCiAJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgogCi1jb25maWcgU0NTSV9NQUNfRVNQCi0JdHJpc3RhdGUgIk1hY2ludG9zaCBOQ1I1M2M5WzQ2XSBTQ1NJIgotCWRlcGVuZHMgb24gTUFDICYmIFNDU0kKLQloZWxwCi0JICBUaGlzIGlzIHRoZSBOQ1IgNTNjOXggU0NTSSBjb250cm9sbGVyIGZvdW5kIG9uIG1vc3Qgb2YgdGhlIDY4MDQwCi0JICBiYXNlZCBNYWNpbnRvc2hlcy4gIElmIHlvdSBoYXZlIG9uZSBvZiB0aGVzZSBzYXkgWSBhbmQgcmVhZCB0aGUKLQkgIFNDU0ktSE9XVE8sIGF2YWlsYWJsZSBmcm9tCi0JICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtYWNfZXNwLgotCiBjb25maWcgTVZNRTE0N19TQ1NJCiAJYm9vbCAiV0QzM0M5MyBTQ1NJIGRyaXZlciBmb3IgTVZNRTE0NyIKIAlkZXBlbmRzIG9uIE1WTUUxNDcgJiYgU0NTST15CkBAIC0xNzc5LDYgKzE3MDUsNyBAQAogY29uZmlnIFNVTjNYX0VTUAogCWJvb2wgIlN1bjN4IEVTUCBTQ1NJIgogCWRlcGVuZHMgb24gU1VOM1ggJiYgU0NTST15CisJc2VsZWN0IFNDU0lfU1BJX0FUVFJTCiAJaGVscAogCSAgVGhlIEVTUCB3YXMgYW4gb24tYm9hcmQgU0NTSSBjb250cm9sbGVyIHVzZWQgb24gU3VuIDMvODAKIAkgIG1hY2hpbmVzLiAgU2F5IFkgaGVyZSB0byBjb21waWxlIGluIHN1cHBvcnQgZm9yIGl0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL01ha2VmaWxlCmluZGV4IDkzZTE0MjguLjkyNWMyNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3Njc2kvTWFrZWZpbGUKQEAgLTQ0LDE1ICs0NCw4IEBACiBvYmotJChDT05GSUdfR1ZQMTFfU0NTSSkJKz0gZ3ZwMTEubwl3ZDMzYzkzLm8KIG9iai0kKENPTkZJR19NVk1FMTQ3X1NDU0kpCSs9IG12bWUxNDcubwl3ZDMzYzkzLm8KIG9iai0kKENPTkZJR19TR0lXRDkzX1NDU0kpCSs9IHNnaXdkOTMubwl3ZDMzYzkzLm8KLW9iai0kKENPTkZJR19DWUJFUlNUT1JNX1NDU0kpCSs9IE5DUjUzQzl4Lm8JY3liZXJzdG9ybS5vCi1vYmotJChDT05GSUdfQ1lCRVJTVE9STUlJX1NDU0kpCSs9IE5DUjUzQzl4Lm8JY3liZXJzdG9ybUlJLm8KLW9iai0kKENPTkZJR19CTFoyMDYwX1NDU0kpCSs9IE5DUjUzQzl4Lm8JYmx6MjA2MC5vCi1vYmotJChDT05GSUdfQkxaMTIzMF9TQ1NJKQkrPSBOQ1I1M0M5eC5vCWJsejEyMzAubwotb2JqLSQoQ09ORklHX0ZBU1RMQU5FX1NDU0kpCSs9IE5DUjUzQzl4Lm8JZmFzdGxhbmUubwotb2JqLSQoQ09ORklHX09LVEFHT05fU0NTSSkJKz0gTkNSNTNDOXgubwlva3RhZ29uX2VzcF9tb2Qubwogb2JqLSQoQ09ORklHX0FUQVJJX1NDU0kpCSs9IGF0YXJpX3Njc2kubwogb2JqLSQoQ09ORklHX01BQ19TQ1NJKQkJKz0gbWFjX3Njc2kubwotb2JqLSQoQ09ORklHX1NDU0lfTUFDX0VTUCkJKz0gbWFjX2VzcC5vCU5DUjUzQzl4Lm8KIG9iai0kKENPTkZJR19TVU4zX1NDU0kpCQkrPSBzdW4zX3Njc2kubyAgc3VuM19zY3NpX3ZtZS5vCiBvYmotJChDT05GSUdfTVZNRTE2eF9TQ1NJKQkrPSA1M2M3MDAubwltdm1lMTZ4X3Njc2kubwogb2JqLSQoQ09ORklHX0JWTUU2MDAwX1NDU0kpCSs9IDUzYzcwMC5vCWJ2bWU2MDAwX3Njc2kubwpAQCAtOTUsNyArODgsNiBAQAogb2JqLSQoQ09ORklHX1NDU0lfWkFMT04pCSs9IHphbG9uN3h4Lm8KIG9iai0kKENPTkZJR19TQ1NJX0VBVEFfUElPKQkrPSBlYXRhX3Bpby5vCiBvYmotJChDT05GSUdfU0NTSV83MDAwRkFTU1QpCSs9IHdkNzAwMC5vCi1vYmotJChDT05GSUdfU0NTSV9NQ0FfNTNDOVgpCSs9IE5DUjUzQzl4Lm8JbWNhXzUzYzl4Lm8KIG9iai0kKENPTkZJR19TQ1NJX0lCTU1DQSkJKz0gaWJtbWNhLm8KIG9iai0kKENPTkZJR19TQ1NJX0VBVEEpCQkrPSBlYXRhLm8KIG9iai0kKENPTkZJR19TQ1NJX0RDMzk1eCkJKz0gZGMzOTV4Lm8KQEAgLTExMiwxMyArMTA0LDEyIEBACiBvYmotJChDT05GSUdfQkxLX0RFVl9JREVTQ1NJKQkrPSBpZGUtc2NzaS5vCiBvYmotJChDT05GSUdfU0NTSV9NRVNIKQkJKz0gbWVzaC5vCiBvYmotJChDT05GSUdfU0NTSV9NQUM1M0M5NCkJKz0gbWFjNTNjOTQubwotb2JqLSQoQ09ORklHX1NDU0lfREVDTkNSKQkrPSBOQ1I1M0M5eC5vCWRlY19lc3Aubwogb2JqLSQoQ09ORklHX0JMS19ERVZfM1dfWFhYWF9SQUlEKSArPSAzdy14eHh4Lm8KIG9iai0kKENPTkZJR19TQ1NJXzNXXzlYWFgpCSs9IDN3LTl4eHgubwogb2JqLSQoQ09ORklHX1NDU0lfUFBBKQkJKz0gcHBhLm8KIG9iai0kKENPTkZJR19TQ1NJX0lNTSkJCSs9IGltbS5vCiBvYmotJChDT05GSUdfSkFaWl9FU1ApCQkrPSBlc3Bfc2NzaS5vCWphenpfZXNwLm8KLW9iai0kKENPTkZJR19TVU4zWF9FU1ApCQkrPSBOQ1I1M0M5eC5vCXN1bjN4X2VzcC5vCitvYmotJChDT05GSUdfU1VOM1hfRVNQKQkJKz0gZXNwX3Njc2kubwlzdW4zeF9lc3Aubwogb2JqLSQoQ09ORklHX1NDU0lfTEFTSTcwMCkJKz0gNTNjNzAwLm8gbGFzaTcwMC5vCiBvYmotJChDT05GSUdfU0NTSV9TTklfNTNDNzEwKQkrPSA1M2M3MDAubyBzbmlfNTNjNzEwLm8KIG9iai0kKENPTkZJR19TQ1NJX05TUDMyKQkrPSBuc3AzMi5vCkBAIC0xMzgsNiArMTI5LDcgQEAKIG9iai0kKENPTkZJR19CTEtfREVWX1NSKQkrPSBzcl9tb2Qubwogb2JqLSQoQ09ORklHX0NIUl9ERVZfU0cpCSs9IHNnLm8KIG9iai0kKENPTkZJR19DSFJfREVWX1NDSCkJKz0gY2gubworb2JqLSQoQ09ORklHX1NDU0lfRU5DTE9TVVJFKQkrPSBzZXMubwogCiAjIFRoaXMgZ29lcyBsYXN0LCBzbyB0aGF0ICJyZWFsIiBzY3NpIGRldmljZXMgcHJvYmUgZWFybGllcgogb2JqLSQoQ09ORklHX1NDU0lfREVCVUcpCSs9IHNjc2lfZGVidWcubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL05DUjUzQzl4LmMgYi9kcml2ZXJzL3Njc2kvTkNSNTNDOXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIwZWZjOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Njc2kvTkNSNTNDOXguYworKysgL2Rldi9udWxsCkBAIC0xLDM2NTQgKzAsMCBAQAotLyogTkNSNTNDOXguYzogIEdlbmVyaWMgU0NTSSBkcml2ZXIgY29kZSBmb3IgTkNSNTNDOXggY2hpcHMuCi0gKgotICogT3JpZ2luYWxseSBlc3AuYyA6IEVuaGFuY2VkU2NzaVByb2Nlc3NvciBTdW4gU0NTSSBkcml2ZXIgY29kZS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTggRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQotICoKLSAqIE1vc3QgRE1BIGRlcGVuZGVuY2llcyBwdXQgaW4gZHJpdmVyIHNwZWNpZmljIGZpbGVzIGJ5IAotICogSmVzcGVyIFNrb3YgKGpza292QGN5Z251cy5jby51aykKLSAqCi0gKiBTZXQgdXAgdG8gdXNlIGVzcF9yZWFkL2VzcF93cml0ZSAocHJlcHJvY2Vzc29yIG1hY3JvcyBpbiBOQ1I1M2M5eC5oKSBieQotICogVHltbSBUd2lsbG1hbiAodHltbUBjb2UubWlzc291cmkuZWR1KQotICovCi0KLS8qIFRPRE86Ci0gKgotICogMSkgTWF5YmUgZGlzYWJsZSBwYXJpdHkgY2hlY2tpbmcgaW4gY29uZmlnIHJlZ2lzdGVyIG9uZSBmb3IgU0NTSTEKLSAqICAgIHRhcmdldHMuICAoR2lsbW9yZSBzYXlzIHBhcml0eSBlcnJvciBvbiB0aGUgU0J1cyBjYW4gbG9jayB1cAotICogICAgb2xkIHN1bjRjJ3MpCi0gKiAyKSBBZGQgc3VwcG9ydCBmb3IgRE1BMiBwaXBlbGluaW5nLgotICogMykgQWRkIHRhZ2dlZCBxdWV1ZWluZy4KLSAqIDQpIE1heWJlIGNoYW5nZSB1c2Ugb2YgImVzcCIgdG8gc29tZXRoaW5nIG1vcmUgIk5DUiInaXNoLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlICJzY3NpLmgiCi0jaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KLSNpbmNsdWRlICJOQ1I1M0M5eC5oIgotCi0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLQotLyogQ29tbWFuZCBwaGFzZSBlbnVtZXJhdGlvbi4gKi8KLWVudW0gewotCW5vdF9pc3N1ZWQgICAgPSAweDAwLCAgLyogU3RpbGwgaW4gdGhlIGlzc3VlX1NDIHF1ZXVlLiAgICAgICAgICAqLwotCi0JLyogVmFyaW91cyBmb3JtcyBvZiBzZWxlY3RpbmcgYSB0YXJnZXQuICovCi0jZGVmaW5lIGluX3NsY3RfbWFzayAgICAweDEwCi0JaW5fc2xjdF9ub3JtICA9IDB4MTAsICAvKiBFU1AgaXMgYXJiaXRyYXRpbmcsIG5vcm1hbCBzZWxlY3Rpb24gICovCi0JaW5fc2xjdF9zdG9wICA9IDB4MTEsICAvKiBFU1Agd2lsbCBzZWxlY3QsIHRoZW4gc3RvcCB3aXRoIElSUSAgICovCi0JaW5fc2xjdF9tc2cgICA9IDB4MTIsICAvKiBzZWxlY3QsIHRoZW4gc2VuZCBhIG1lc3NhZ2UgICAgICAgICAgICovCi0JaW5fc2xjdF90YWcgICA9IDB4MTMsICAvKiBzZWxlY3QgYW5kIHNlbmQgdGFnZ2VkIHF1ZXVlIG1zZyAgICAgICovCi0JaW5fc2xjdF9zbmVnICA9IDB4MTQsICAvKiBzZWxlY3QgYW5kIGFjcXVpcmUgc3luYyBjYXBhYmlsaXRpZXMgICovCi0KLQkvKiBBbnkgcG9zdCBzZWxlY3Rpb24gYWN0aXZpdHkuICovCi0jZGVmaW5lIGluX3BoYXNlc19tYXNrICAweDIwCi0JaW5fZGF0YWluICAgICA9IDB4MjAsICAvKiBEYXRhIGlzIHRyYW5zZmVycmluZyBmcm9tIHRoZSBidXMgICAgICovCi0JaW5fZGF0YW91dCAgICA9IDB4MjEsICAvKiBEYXRhIGlzIHRyYW5zZmVycmluZyB0byB0aGUgYnVzICAgICAgICovCi0JaW5fZGF0YV9kb25lICA9IDB4MjIsICAvKiBMYXN0IERNQSBkYXRhIG9wZXJhdGlvbiBkb25lIChtYXliZSkgICovCi0JaW5fbXNnaW4gICAgICA9IDB4MjMsICAvKiBFYXRpbmcgbWVzc2FnZSBmcm9tIHRhcmdldCAgICAgICAgICAgICovCi0JaW5fbXNnaW5jb250ICA9IDB4MjQsICAvKiBFYXRpbmcgbW9yZSBtc2cgYnl0ZXMgZnJvbSB0YXJnZXQgICAgICovCi0JaW5fbXNnaW5kb25lICA9IDB4MjUsICAvKiBEZWNpZGUgd2hhdCB0byBkbyB3aXRoIHdoYXQgd2UgZ290ICAgICovCi0JaW5fbXNnb3V0ICAgICA9IDB4MjYsICAvKiBTZW5kaW5nIG1lc3NhZ2UgdG8gdGFyZ2V0ICAgICAgICAgICAgICovCi0JaW5fbXNnb3V0ZG9uZSA9IDB4MjcsICAvKiBEb25lIHNlbmRpbmcgbXNnIG91dCAgICAgICAgICAgICAgICAgICovCi0JaW5fY21kYmVnaW4gICA9IDB4MjgsICAvKiBTZW5kaW5nIGNtZCBhZnRlciBhYm5vcm1hbCBzZWxlY3Rpb24gICovCi0JaW5fY21kZW5kICAgICA9IDB4MjksICAvKiBEb25lIHNlbmRpbmcgc2xvdyBjbWQgICAgICAgICAgICAgICAgICovCi0JaW5fc3RhdHVzICAgICA9IDB4MmEsICAvKiBXYXMgaW4gc3RhdHVzIHBoYXNlLCBmaW5pc2hpbmcgY21kICAgICovCi0JaW5fZnJlZWluZyAgICA9IDB4MmIsICAvKiBmcmVlaW5nIHRoZSBidXMgZm9yIGNtZCBjbXBsdCBvciBkaXNjICovCi0JaW5fdGhlX2RhcmsgICA9IDB4MmMsICAvKiBEb24ndCBrbm93IHdoYXQgYnVzIHBoYXNlIHdlIGFyZSBpbiAgICovCi0KLQkvKiBTcGVjaWFsIHN0YXRlcywgaWUuIG5vdCBub3JtYWwgYnVzIHRyYW5zaXRpb25zLi4uICovCi0jZGVmaW5lIGluX3NwZWNfbWFzayAgICAweDgwCi0JaW5fYWJvcnRvbmUgICA9IDB4ODAsICAvKiBBYm9ydGluZyBvbmUgY29tbWFuZCBjdXJyZW50bHkgICAgICAgICovCi0JaW5fYWJvcnRhbGwgICA9IDB4ODEsICAvKiBCbG93aW5nIGF3YXkgYWxsIGNvbW1hbmRzIHdlIGhhdmUgICAgICovCi0JaW5fcmVzZXRkZXYgICA9IDB4ODIsICAvKiBTQ1NJIHRhcmdldCByZXNldCBpbiBwcm9ncmVzcyAgICAgICAgICovCi0JaW5fcmVzZXRidXMgICA9IDB4ODMsICAvKiBTQ1NJIGJ1cyByZXNldCBpbiBwcm9ncmVzcyAgICAgICAgICAgICovCi0JaW5fdGd0ZXJyb3IgICA9IDB4ODQsICAvKiBUYXJnZXQgZGlkIHNvbWV0aGluZyBzdHVwaWQgICAgICAgICAgICovCi19OwotCi1lbnVtIHsKLQkvKiBaZXJvIGhhcyBzcGVjaWFsIG1lYW5pbmcsIHNlZSBza2lwYWhlYWRbMTJdLiAqLwotLyowKi8JZG9fbmV2ZXIsCi0KLS8qMSovCWRvX3BoYXNlX2RldGVybWluZSwKLS8qMiovCWRvX3Jlc2V0X2J1cywKLS8qMyovCWRvX3Jlc2V0X2NvbXBsZXRlLAotLyo0Ki8JZG9fd29ya19idXMsCi0vKjUqLwlkb19pbnRyX2VuZAotfTsKLQotLyogVGhlIG1hc3RlciByaW5nIG9mIGFsbCBlc3AgaG9zdHMgd2UgYXJlIG1hbmFnaW5nIGluIHRoaXMgZHJpdmVyLiAqLwotc3RhdGljIHN0cnVjdCBOQ1JfRVNQICplc3BjaGFpbjsKLWludCBuZXNwcyA9IDAsIGVzcHNfaW5fdXNlID0gMCwgZXNwc19ydW5uaW5nID0gMDsKLUVYUE9SVF9TWU1CT0wobmVzcHMpOwotRVhQT1JUX1NZTUJPTChlc3BzX3J1bm5pbmcpOwotCi1pcnFyZXR1cm5fdCBlc3BfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwotCi0vKiBEZWJ1Z2dpbmcgcm91dGluZXMgKi8KLXN0YXRpYyBzdHJ1Y3QgZXNwX2NtZHN0cmluZ3MgewotCXVuY2hhciBjbWRjaGFyOwotCWNoYXIgKnRleHQ7Ci19IGVzcF9jbWRfc3RyaW5nc1tdID0gewotCS8qIE1pc2NlbGxhbmVvdXMgKi8KLQl7IEVTUF9DTURfTlVMTCwgIkVTUF9OT1AiLCB9LAotCXsgRVNQX0NNRF9GTFVTSCwgIkZJRk9fRkxVU0giLCB9LAotCXsgRVNQX0NNRF9SQywgIlJTVEVTUCIsIH0sCi0JeyBFU1BfQ01EX1JTLCAiUlNUU0NTSSIsIH0sCi0JLyogRGlzY29ubmVjdGVkIFN0YXRlIEdyb3VwICovCi0JeyBFU1BfQ01EX1JTRUwsICJSRVNMQ1RTRVEiLCB9LAotCXsgRVNQX0NNRF9TRUwsICJTTENUTkFUTiIsIH0sCi0JeyBFU1BfQ01EX1NFTEEsICJTTENUQVROIiwgfSwKLQl7IEVTUF9DTURfU0VMQVMsICJTTENUQVROU1RPUCIsIH0sCi0JeyBFU1BfQ01EX0VTRUwsICJFTlNMQ1RSRVNFTCIsIH0sCi0JeyBFU1BfQ01EX0RTRUwsICJESVNTRUxSRVNFTCIsIH0sCi0JeyBFU1BfQ01EX1NBMywgIlNMQ1RBVE4zIiwgfSwKLQl7IEVTUF9DTURfUlNFTDMsICJSRVNMQ1RTRVEiLCB9LAotCS8qIFRhcmdldCBTdGF0ZSBHcm91cCAqLwotCXsgRVNQX0NNRF9TTVNHLCAiU05ETVNHIiwgfSwKLQl7IEVTUF9DTURfU1NUQVQsICJTTkRTVEFUVVMiLCB9LAotCXsgRVNQX0NNRF9TREFUQSwgIlNORERBVEEiLCB9LAotCXsgRVNQX0NNRF9EU0VRLCAiRElTQ1NFUSIsIH0sCi0JeyBFU1BfQ01EX1RTRVEsICJURVJNU0VRIiwgfSwKLQl7IEVTUF9DTURfVENDU0VRLCAiVFJHVENNRENPTVBTRVEiLCB9LAotCXsgRVNQX0NNRF9EQ05DVCwgIkRJU0MiLCB9LAotCXsgRVNQX0NNRF9STVNHLCAiUkNWTVNHIiwgfSwKLQl7IEVTUF9DTURfUkNNRCwgIlJDVkNNRCIsIH0sCi0JeyBFU1BfQ01EX1JEQVRBLCAiUkNWREFUQSIsIH0sCi0JeyBFU1BfQ01EX1JDU0VRLCAiUkNWQ01EU0VRIiwgfSwKLQkvKiBJbml0aWF0b3IgU3RhdGUgR3JvdXAgKi8KLQl7IEVTUF9DTURfVEksICJUUkFOU0lORk8iLCB9LAotCXsgRVNQX0NNRF9JQ0NTRVEsICJJTklDTURTRVFDT01QIiwgfSwKLQl7IEVTUF9DTURfTU9LLCAiTVNHQUNDRVBURUQiLCB9LAotCXsgRVNQX0NNRF9UUEFELCAiVFBBRCIsIH0sCi0JeyBFU1BfQ01EX1NBVE4sICJTQVROIiwgfSwKLQl7IEVTUF9DTURfUkFUTiwgIlJBVE4iLCB9LAotfTsKLSNkZWZpbmUgTlVNX0VTUF9DT01NQU5EUyAgKChzaXplb2YoZXNwX2NtZF9zdHJpbmdzKSkgLyAoc2l6ZW9mKHN0cnVjdCBlc3BfY21kc3RyaW5ncykpKQotCi0vKiBQcmludCB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIGFuIEVTUCBjb21tYW5kICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZXNwX3ByaW50X2NtZCh1bmNoYXIgZXNwY21kKQotewotCXVuY2hhciBkbWFfYml0ID0gZXNwY21kICYgRVNQX0NNRF9ETUE7Ci0JaW50IGk7Ci0KLQllc3BjbWQgJj0gfmRtYV9iaXQ7Ci0JZm9yKGk9MDsgaTxOVU1fRVNQX0NPTU1BTkRTOyBpKyspCi0JCWlmKGVzcF9jbWRfc3RyaW5nc1tpXS5jbWRjaGFyID09IGVzcGNtZCkKLQkJCWJyZWFrOwotCWlmKGk9PU5VTV9FU1BfQ09NTUFORFMpCi0JCXByaW50aygiRVNQX1Vua25vd24iKTsKLQllbHNlCi0JCXByaW50aygiJXMlcyIsIGVzcF9jbWRfc3RyaW5nc1tpXS50ZXh0LAotCQkgICAgICAgKChkbWFfYml0KSA/ICIrRE1BIiA6ICIiKSk7Ci19Ci0KLS8qIFByaW50IHRoZSBzdGF0dXMgcmVnaXN0ZXIncyB2YWx1ZSAqLwotc3RhdGljIGlubGluZSB2b2lkIGVzcF9wcmludF9zdGF0cmVnKHVuY2hhciBzdGF0cmVnKQotewotCXVuY2hhciBwaGFzZTsKLQotCXByaW50aygiU1RBVFVTPCIpOwotCXBoYXNlID0gc3RhdHJlZyAmIEVTUF9TVEFUX1BNQVNLOwotCXByaW50aygiJXMsIiwgKHBoYXNlID09IEVTUF9ET1AgPyAiREFUQS1PVVQiIDoKLQkJICAgICAgIChwaGFzZSA9PSBFU1BfRElQID8gIkRBVEEtSU4iIDoKLQkJCShwaGFzZSA9PSBFU1BfQ01EUCA/ICJDT01NQU5EIiA6Ci0JCQkgKHBoYXNlID09IEVTUF9TVEFUUCA/ICJTVEFUVVMiIDoKLQkJCSAgKHBoYXNlID09IEVTUF9NT1AgPyAiTVNHLU9VVCIgOgotCQkJICAgKHBoYXNlID09IEVTUF9NSVAgPyAiTVNHX0lOIiA6Ci0JCQkgICAgInVua25vd24iKSkpKSkpKTsKLQlpZihzdGF0cmVnICYgRVNQX1NUQVRfVERPTkUpCi0JCXByaW50aygiVFJBTlNfRE9ORSwiKTsKLQlpZihzdGF0cmVnICYgRVNQX1NUQVRfVENOVCkKLQkJcHJpbnRrKCJUQ09VTlRfWkVSTywiKTsKLQlpZihzdGF0cmVnICYgRVNQX1NUQVRfUEVSUikKLQkJcHJpbnRrKCJQX0VSUk9SLCIpOwotCWlmKHN0YXRyZWcgJiBFU1BfU1RBVF9TUEFNKQotCQlwcmludGsoIlNQQU0sIik7Ci0JaWYoc3RhdHJlZyAmIEVTUF9TVEFUX0lOVFIpCi0JCXByaW50aygiSVJRLCIpOwotCXByaW50aygiPiIpOwotfQotCi0vKiBQcmludCB0aGUgaW50ZXJydXB0IHJlZ2lzdGVyJ3MgdmFsdWUgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBlc3BfcHJpbnRfaXJlZyh1bmNoYXIgaW50cmVnKQotewotCXByaW50aygiSU5UUkVHPCAiKTsKLQlpZihpbnRyZWcgJiBFU1BfSU5UUl9TKQotCQlwcmludGsoIlNMQ1RfTkFUTiAiKTsKLQlpZihpbnRyZWcgJiBFU1BfSU5UUl9TQVROKQotCQlwcmludGsoIlNMQ1RfQVROICIpOwotCWlmKGludHJlZyAmIEVTUF9JTlRSX1JTRUwpCi0JCXByaW50aygiUlNMQ1QgIik7Ci0JaWYoaW50cmVnICYgRVNQX0lOVFJfRkRPTkUpCi0JCXByaW50aygiRkRPTkUgIik7Ci0JaWYoaW50cmVnICYgRVNQX0lOVFJfQlNFUlYpCi0JCXByaW50aygiQlNFUlYgIik7Ci0JaWYoaW50cmVnICYgRVNQX0lOVFJfREMpCi0JCXByaW50aygiRElTQ05DVCAiKTsKLQlpZihpbnRyZWcgJiBFU1BfSU5UUl9JQykKLQkJcHJpbnRrKCJJTExfQ01EICIpOwotCWlmKGludHJlZyAmIEVTUF9JTlRSX1NSKQotCQlwcmludGsoIlNDU0lfQlVTX1JFU0VUICIpOwotCXByaW50aygiPiIpOwotfQotCi0vKiBQcmludCB0aGUgc2VxdWVuY2Ugc3RlcCByZWdpc3RlcnMgY29udGVudHMgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBlc3BfcHJpbnRfc2VxcmVnKHVuY2hhciBzdGVwcmVnKQotewotCXN0ZXByZWcgJj0gRVNQX1NURVBfVkJJVFM7Ci0JcHJpbnRrKCJTVEVQPCVzPiIsCi0JICAgICAgIChzdGVwcmVnID09IEVTUF9TVEVQX0FTRUwgPyAiU0xDVF9BUkJfQ01QTFQiIDoKLQkJKHN0ZXByZWcgPT0gRVNQX1NURVBfU0lEID8gIjFCWVRFX01TR19TRU5UIiA6Ci0JCSAoc3RlcHJlZyA9PSBFU1BfU1RFUF9OQ01EID8gIk5PVF9JTl9DTURfUEhBU0UiIDoKLQkJICAoc3RlcHJlZyA9PSBFU1BfU1RFUF9QUEMgPyAiQ01EX0JZVEVTX0xPU1QiIDoKLQkJICAgKHN0ZXByZWcgPT0gRVNQX1NURVBfRklOSTQgPyAiQ01EX1NFTlRfT0siIDoKLQkJICAgICJVTktOT1dOIikpKSkpKTsKLX0KLQotc3RhdGljIGNoYXIgKnBoYXNlX3N0cmluZyhpbnQgcGhhc2UpCi17Ci0Jc3dpdGNoKHBoYXNlKSB7Ci0JY2FzZSBub3RfaXNzdWVkOgotCQlyZXR1cm4gIlVOSVNTVUVEIjsKLQljYXNlIGluX3NsY3Rfbm9ybToKLQkJcmV0dXJuICJTTENUTk9STSI7Ci0JY2FzZSBpbl9zbGN0X3N0b3A6Ci0JCXJldHVybiAiU0xDVFNUT1AiOwotCWNhc2UgaW5fc2xjdF9tc2c6Ci0JCXJldHVybiAiU0xDVE1TRyI7Ci0JY2FzZSBpbl9zbGN0X3RhZzoKLQkJcmV0dXJuICJTTENUVEFHIjsKLQljYXNlIGluX3NsY3Rfc25lZzoKLQkJcmV0dXJuICJTTENUU05FRyI7Ci0JY2FzZSBpbl9kYXRhaW46Ci0JCXJldHVybiAiREFUQUlOIjsKLQljYXNlIGluX2RhdGFvdXQ6Ci0JCXJldHVybiAiREFUQU9VVCI7Ci0JY2FzZSBpbl9kYXRhX2RvbmU6Ci0JCXJldHVybiAiREFUQURPTkUiOwotCWNhc2UgaW5fbXNnaW46Ci0JCXJldHVybiAiTVNHSU4iOwotCWNhc2UgaW5fbXNnaW5jb250OgotCQlyZXR1cm4gIk1TR0lOQ09OVCI7Ci0JY2FzZSBpbl9tc2dpbmRvbmU6Ci0JCXJldHVybiAiTVNHSU5ET05FIjsKLQljYXNlIGluX21zZ291dDoKLQkJcmV0dXJuICJNU0dPVVQiOwotCWNhc2UgaW5fbXNnb3V0ZG9uZToKLQkJcmV0dXJuICJNU0dPVVRET05FIjsKLQljYXNlIGluX2NtZGJlZ2luOgotCQlyZXR1cm4gIkNNREJFR0lOIjsKLQljYXNlIGluX2NtZGVuZDoKLQkJcmV0dXJuICJDTURFTkQiOwotCWNhc2UgaW5fc3RhdHVzOgotCQlyZXR1cm4gIlNUQVRVUyI7Ci0JY2FzZSBpbl9mcmVlaW5nOgotCQlyZXR1cm4gIkZSRUVJTkciOwotCWNhc2UgaW5fdGhlX2Rhcms6Ci0JCXJldHVybiAiQ0xVRUxFU1MiOwotCWNhc2UgaW5fYWJvcnRvbmU6Ci0JCXJldHVybiAiQUJPUlRPTkUiOwotCWNhc2UgaW5fYWJvcnRhbGw6Ci0JCXJldHVybiAiQUJPUlRBTEwiOwotCWNhc2UgaW5fcmVzZXRkZXY6Ci0JCXJldHVybiAiUkVTRVRERVYiOwotCWNhc2UgaW5fcmVzZXRidXM6Ci0JCXJldHVybiAiUkVTRVRCVVMiOwotCWNhc2UgaW5fdGd0ZXJyb3I6Ci0JCXJldHVybiAiVEdURVJST1IiOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAiVU5LTk9XTiI7Ci0JfTsKLX0KLQotI2lmZGVmIERFQlVHX1NUQVRFX01BQ0hJTkUKLXN0YXRpYyBpbmxpbmUgdm9pZCBlc3BfYWR2YW5jZV9waGFzZShTY3NpX0NtbmQgKnMsIGludCBuZXdwaGFzZSkKLXsKLQlFU1BMT0coKCI8JXM+IiwgcGhhc2Vfc3RyaW5nKG5ld3BoYXNlKSkpOwotCXMtPlNDcC5zZW50X2NvbW1hbmQgPSBzLT5TQ3AucGhhc2U7Ci0Jcy0+U0NwLnBoYXNlID0gbmV3cGhhc2U7Ci19Ci0jZWxzZQotI2RlZmluZSBlc3BfYWR2YW5jZV9waGFzZShfX3MsIF9fbmV3cGhhc2UpIFwKLQkoX19zKS0+U0NwLnNlbnRfY29tbWFuZCA9IChfX3MpLT5TQ3AucGhhc2U7IFwKLQkoX19zKS0+U0NwLnBoYXNlID0gKF9fbmV3cGhhc2UpOwotI2VuZGlmCi0KLSNpZmRlZiBERUJVR19FU1BfQ01EUwotc3RhdGljIGlubGluZSB2b2lkIGVzcF9jbWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IEVTUF9yZWdzICplcmVncywKLQkJCSAgIHVuY2hhciBjbWQpCi17Ci0JZXNwLT5lc3BjbWRsb2dbZXNwLT5lc3BjbWRlbnRdID0gY21kOwotCWVzcC0+ZXNwY21kZW50ID0gKGVzcC0+ZXNwY21kZW50ICsgMSkgJiAzMTsKLQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9jbW5kLCBjbWQpOwotfQotI2Vsc2UKLSNkZWZpbmUgZXNwX2NtZChfX2VzcCwgX19lcmVncywgX19jbWQpCWVzcF93cml0ZSgoX19lcmVncyktPmVzcF9jbW5kLCAoX19jbWQpKQotI2VuZGlmCi0KLS8qIEhvdyB3ZSB1c2UgdGhlIHZhcmlvdXMgTGludXggU0NTSSBkYXRhIHN0cnVjdHVyZXMgZm9yIG9wZXJhdGlvbi4KLSAqCi0gKiBzdHJ1Y3Qgc2NzaV9jbW5kOgotICoKLSAqICAgV2Uga2VlcCB0cmFjayBvZiB0aGUgc3luY3Jvbm91cyBjYXBhYmlsaXRpZXMgb2YgYSB0YXJnZXQKLSAqICAgaW4gdGhlIGRldmljZSBtZW1iZXIsIHVzaW5nIHN5bmNfbWluX3BlcmlvZCBhbmQKLSAqICAgc3luY19tYXhfb2Zmc2V0LiAgVGhlc2UgYXJlIHRoZSB2YWx1ZXMgd2UgZGlyZWN0bHkgd3JpdGUKLSAqICAgaW50byB0aGUgRVNQIHJlZ2lzdGVycyB3aGlsZSBydW5uaW5nIGEgY29tbWFuZC4gIElmIG9mZnNldAotICogICBpcyB6ZXJvIHRoZSBFU1Agd2lsbCB1c2UgYXN5bmNocm9ub3VzIHRyYW5zZmVycy4KLSAqICAgSWYgdGhlIGJvcmtlbiBmbGFnIGlzIHNldCB3ZSBhc3N1bWUgd2Ugc2hvdWxkbid0IGV2ZW4gYm90aGVyCi0gKiAgIHRyeWluZyB0byBuZWdvdGlhdGUgZm9yIHN5bmNocm9ub3VzIHRyYW5zZmVyIGFzIHRoaXMgdGFyZ2V0Ci0gKiAgIGlzIHJlYWxseSBzdHVwaWQuICBJZiB3ZSBub3RpY2UgdGhlIHRhcmdldCBpcyBkcm9wcGluZyB0aGUKLSAqICAgYnVzLCBhbmQgd2UgaGF2ZSBiZWVuIGFsbG93aW5nIGl0IHRvIGRpc2Nvbm5lY3QsIHdlIGNsZWFyCi0gKiAgIHRoZSBkaXNjb25uZWN0IGZsYWcuCi0gKi8KLQotLyogTWFuaXB1bGF0aW9uIG9mIHRoZSBFU1AgY29tbWFuZCBxdWV1ZXMuICBUaGFua3MgdG8gdGhlIGFoYTE1MnggZHJpdmVyCi0gKiBhbmQgaXRzIGF1dGhvciwgSnVlcmdlbiBFLiBGaXNjaGVyLCBmb3IgdGhlIG1ldGhvZHMgdXNlZCBoZXJlLgotICogTm90ZSB0aGF0IHRoZXNlIGFyZSBwZXItRVNQIHF1ZXVlcywgbm90IGdsb2JhbCBxdWV1ZXMgbGlrZQotICogdGhlIGFoYTE1MnggZHJpdmVyIHVzZXMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBhcHBlbmRfU0MoU2NzaV9DbW5kICoqU0MsIFNjc2lfQ21uZCAqbmV3X1NDKQotewotCVNjc2lfQ21uZCAqZW5kOwotCi0JbmV3X1NDLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKikgTlVMTDsKLQlpZighKlNDKQotCQkqU0MgPSBuZXdfU0M7Ci0JZWxzZSB7Ci0JCWZvcihlbmQ9KlNDO2VuZC0+aG9zdF9zY3JpYmJsZTtlbmQ9KFNjc2lfQ21uZCAqKWVuZC0+aG9zdF9zY3JpYmJsZSkKLQkJCTsKLQkJZW5kLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKikgbmV3X1NDOwotCX0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHByZXBlbmRfU0MoU2NzaV9DbW5kICoqU0MsIFNjc2lfQ21uZCAqbmV3X1NDKQotewotCW5ld19TQy0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopICpTQzsKLQkqU0MgPSBuZXdfU0M7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgU2NzaV9DbW5kICpyZW1vdmVfZmlyc3RfU0MoU2NzaV9DbW5kICoqU0MpCi17Ci0JU2NzaV9DbW5kICpwdHI7Ci0KLQlwdHIgPSAqU0M7Ci0JaWYocHRyKQotCQkqU0MgPSAoU2NzaV9DbW5kICopICgqU0MpLT5ob3N0X3NjcmliYmxlOwotCXJldHVybiBwdHI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgU2NzaV9DbW5kICpyZW1vdmVfU0MoU2NzaV9DbW5kICoqU0MsIGludCB0YXJnZXQsIGludCBsdW4pCi17Ci0JU2NzaV9DbW5kICpwdHIsICpwcmV2OwotCi0JZm9yKHB0ciA9ICpTQywgcHJldiA9IE5VTEw7Ci0JICAgIHB0ciAmJiAoKHB0ci0+ZGV2aWNlLT5pZCAhPSB0YXJnZXQpIHx8IChwdHItPmRldmljZS0+bHVuICE9IGx1bikpOwotCSAgICBwcmV2ID0gcHRyLCBwdHIgPSAoU2NzaV9DbW5kICopIHB0ci0+aG9zdF9zY3JpYmJsZSkKLQkJOwotCWlmKHB0cikgewotCQlpZihwcmV2KQotCQkJcHJldi0+aG9zdF9zY3JpYmJsZT1wdHItPmhvc3Rfc2NyaWJibGU7Ci0JCWVsc2UKLQkJCSpTQz0oU2NzaV9DbW5kICopcHRyLT5ob3N0X3NjcmliYmxlOwotCX0KLQlyZXR1cm4gcHRyOwotfQotCi0vKiBSZXNldHRpbmcgdmFyaW91cyBwaWVjZXMgb2YgdGhlIEVTUCBzY3NpIGRyaXZlciBjaGlwc2V0ICovCi0KLS8qIFJlc2V0IHRoZSBFU1AgY2hpcCwgX25vdF8gdGhlIFNDU0kgYnVzLiAqLwotc3RhdGljIHZvaWQgZXNwX3Jlc2V0X2VzcChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQotewotCWludCBmYW1pbHlfY29kZSwgdmVyc2lvbiwgaTsKLQl2b2xhdGlsZSBpbnQgdHJhc2g7Ci0KLQkvKiBOb3cgcmVzZXQgdGhlIEVTUCBjaGlwICovCi0JZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX1JDKTsKLQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfTlVMTCB8IEVTUF9DTURfRE1BKTsKLQlpZihlc3AtPmVyZXYgPT0gZmFzdCkKLQkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZnMiwgRVNQX0NPTkZJRzJfRkVOQUIpOwotCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9OVUxMIHwgRVNQX0NNRF9ETUEpOwotCi0JLyogVGhpcyBpcyB0aGUgb25seSBwb2ludCBhdCB3aGljaCBpdCBpcyByZWxpYWJsZSB0byByZWFkCi0JICogdGhlIElELWNvZGUgZm9yIGEgZmFzdCBFU1AgY2hpcCB2YXJpYW50LgotCSAqLwotCWVzcC0+bWF4X3BlcmlvZCA9ICgoMzUgKiBlc3AtPmNjeWNsZSkgLyAxMDAwKTsKLQlpZihlc3AtPmVyZXYgPT0gZmFzdCkgewotCQljaGFyICplcmV2MnN0cmluZ1tdID0gewotCQkJIkVtdWxleCBGQVMyMzYiLAotCQkJIkVtdWxleCBGUEVTUDEwMEEiLAotCQkJImZhc3QiLAotCQkJIlFMb2dpYyBGQVMzNjYiLAotCQkJIkVtdWxleCBGQVMyMTYiLAotCQkJIlN5bWJpb3MgTG9naWMgNTNDRjl4LTIiLAotCQkJInVua25vd24hIgotCQl9OwotCQkJCi0JCXZlcnNpb24gPSBlc3BfcmVhZChlcmVncy0+ZXNwX3VpZCk7Ci0JCWZhbWlseV9jb2RlID0gKHZlcnNpb24gJiAweGY4KSA+PiAzOwotCQlpZihmYW1pbHlfY29kZSA9PSAweDAyKSB7Ci0JCSAgICAgICAgaWYgKCh2ZXJzaW9uICYgNykgPT0gMikKLQkJCSAgICAgICAgZXNwLT5lcmV2ID0gZmFzMjE2OwkKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLQkJCSAgICAgICAgZXNwLT5lcmV2ID0gZmFzMjM2OwotCQl9IGVsc2UgaWYoZmFtaWx5X2NvZGUgPT0gMHgwYSkKLQkJCWVzcC0+ZXJldiA9IGZhczM2NjsgLyogVmVyc2lvbiBpcyB1c3VhbGx5ICc1Jy4gKi8KLQkJZWxzZSBpZihmYW1pbHlfY29kZSA9PSAweDAwKSB7Ci0JCQlpZiAoKHZlcnNpb24gJiA3KSA9PSAyKQotCQkJCWVzcC0+ZXJldiA9IGZhczEwMGE7IC8qIE5DUjUzQzlYICovCi0JCQllbHNlCi0JCQkJZXNwLT5lcmV2ID0gZXNwdW5rbm93bjsKLQkJfSBlbHNlIGlmKGZhbWlseV9jb2RlID09IDB4MTQpIHsKLQkJCWlmICgodmVyc2lvbiAmIDcpID09IDIpCi0JCQkJZXNwLT5lcmV2ID0gZnNjOwotCQkgICAgICAgIGVsc2UKLQkJCQllc3AtPmVyZXYgPSBlc3B1bmtub3duOwotCQl9IGVsc2UgaWYoZmFtaWx5X2NvZGUgPT0gMHgwMCkgewotCQkJaWYgKCh2ZXJzaW9uICYgNykgPT0gMikKLQkJCQllc3AtPmVyZXYgPSBmYXMxMDBhOyAvKiBOQ1I1M0M5WCAqLwotCQkJZWxzZQotCQkJCWVzcC0+ZXJldiA9IGVzcHVua25vd247Ci0JCX0gZWxzZQotCQkJZXNwLT5lcmV2ID0gZXNwdW5rbm93bjsKLQkJRVNQTE9HKCgiZXNwJWQ6IEZBU1QgY2hpcCBpcyAlcyAoZmFtaWx5PSVkLCB2ZXJzaW9uPSVkKVxuIiwKLQkJCWVzcC0+ZXNwX2lkLCBlcmV2MnN0cmluZ1tlc3AtPmVyZXYgLSBmYXMyMzZdLAotCQkJZmFtaWx5X2NvZGUsICh2ZXJzaW9uICYgNykpKTsKLQotCQllc3AtPm1pbl9wZXJpb2QgPSAoKDQgKiBlc3AtPmNjeWNsZSkgLyAxMDAwKTsKLQl9IGVsc2UgewotCQllc3AtPm1pbl9wZXJpb2QgPSAoKDUgKiBlc3AtPmNjeWNsZSkgLyAxMDAwKTsKLQl9Ci0KLQkvKiBSZWxvYWQgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCi0JZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZhY3QsIGVzcC0+Y2ZhY3QpOwotCWVzcC0+cHJldl9zdHAgPSAwOwotCWVzcF93cml0ZShlcmVncy0+ZXNwX3N0cCwgMCk7Ci0JZXNwLT5wcmV2X3NvZmYgPSAwOwotCWVzcF93cml0ZShlcmVncy0+ZXNwX3NvZmYsIDApOwotCWVzcF93cml0ZShlcmVncy0+ZXNwX3RpbWVvLCBlc3AtPm5lZ19kZWZwKTsKLQllc3AtPm1heF9wZXJpb2QgPSAoZXNwLT5tYXhfcGVyaW9kICsgMyk+PjI7Ci0JZXNwLT5taW5fcGVyaW9kID0gKGVzcC0+bWluX3BlcmlvZCArIDMpPj4yOwotCi0JZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZnMSwgZXNwLT5jb25maWcxKTsKLQlzd2l0Y2goZXNwLT5lcmV2KSB7Ci0JY2FzZSBlc3AxMDA6Ci0JCS8qIG5vdGhpbmcgdG8gZG8gKi8KLQkJYnJlYWs7Ci0JY2FzZSBlc3AxMDBhOgotCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9jZmcyLCBlc3AtPmNvbmZpZzIpOwotCQlicmVhazsKLQljYXNlIGVzcDIzNjoKLQkJLyogU2xvdyAyMzYgKi8KLQkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZnMiwgZXNwLT5jb25maWcyKTsKLQkJZXNwLT5wcmV2X2NmZzMgPSBlc3AtPmNvbmZpZzNbMF07Ci0JCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmZzMsIGVzcC0+cHJldl9jZmczKTsKLQkJYnJlYWs7Ci0JY2FzZSBmYXMzNjY6Ci0JCXBhbmljKCJlc3A6IEZBUzM2NiBzdXBwb3J0IG5vdCBwcmVzZW50LCBwbGVhc2Ugbm90aWZ5ICIKLQkJICAgICAgImpvbmdrQGNzLnV0d2VudGUubmwiKTsKLQkJYnJlYWs7Ci0JY2FzZSBmYXMyMTY6Ci0JY2FzZSBmYXMyMzY6Ci0JY2FzZSBmc2M6Ci0JCS8qIEZhc3QgRVNQIHZhcmlhbnRzICovCi0JCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmZzIsIGVzcC0+Y29uZmlnMik7Ci0JCWZvcihpPTA7IGk8ODsgaSsrKQotCQkJZXNwLT5jb25maWczW2ldIHw9IEVTUF9DT05GSUczX0ZDTEs7Ci0JCWVzcC0+cHJldl9jZmczID0gZXNwLT5jb25maWczWzBdOwotCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9jZmczLCBlc3AtPnByZXZfY2ZnMyk7Ci0JCWlmKGVzcC0+ZGlmZikKLQkJCWVzcC0+cmFkZWxheSA9IDA7Ci0JCWVsc2UKLQkJCWVzcC0+cmFkZWxheSA9IDE2OwotCQkvKiBEaWZmZXJlbnQgdGltZW91dCBjb25zdGFudCBmb3IgdGhlc2UgY2hpcHMgKi8KLQkJZXNwLT5uZWdfZGVmcCA9Ci0JCQlGU0NfTkVHX0RFRlAoZXNwLT5jZnJlcSwKLQkJCQkgICAgIChlc3AtPmNmYWN0ID09IEVTUF9DQ0ZfRjAgPwotCQkJCSAgICAgIEVTUF9DQ0ZfRjcgKyAxIDogZXNwLT5jZmFjdCkpOwotCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF90aW1lbywgZXNwLT5uZWdfZGVmcCk7Ci0JCS8qIEVuYWJsZSBBY3RpdmUgTmVnb3RpYXRpb24gaWYgcG9zc2libGUgKi8KLQkJaWYoKGVzcC0+ZXJldiA9PSBmc2MpICYmICFlc3AtPmRpZmYpCi0JCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9jZmc0LCBFU1BfQ09ORklHNF9FQU4pOwotCQlicmVhazsKLQljYXNlIGZhczEwMGE6Ci0JCS8qIEZhc3QgMTAwYSAqLwotCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9jZmcyLCBlc3AtPmNvbmZpZzIpOwotCQlmb3IoaT0wOyBpPDg7IGkrKykKLQkJCWVzcC0+Y29uZmlnM1tpXSB8PSBFU1BfQ09ORklHM19GQ0xPQ0s7Ci0JCWVzcC0+cHJldl9jZmczID0gZXNwLT5jb25maWczWzBdOwotCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9jZmczLCBlc3AtPnByZXZfY2ZnMyk7Ci0JCWVzcC0+cmFkZWxheSA9IDMyOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwYW5pYygiZXNwOiB3aGF0IGNvdWxkIGl0IGJlLi4uIEkgd29uZGVyLi4uIik7Ci0JCWJyZWFrOwotCX07Ci0KLQkvKiBFYXQgYW55IGJpdHJvdCBpbiB0aGUgY2hpcCAqLwotCXRyYXNoID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9pbnRycHQpOwotCXVkZWxheSgxMDApOwotfQotCi0vKiBUaGlzIHBsYWNlcyB0aGUgRVNQIGludG8gYSBrbm93biBzdGF0ZSBhdCBib290IHRpbWUuICovCi12b2lkIGVzcF9ib290dXBfcmVzZXQoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IEVTUF9yZWdzICplcmVncykKLXsKLQl2b2xhdGlsZSB1bmNoYXIgdHJhc2g7Ci0KLQkvKiBSZXNldCB0aGUgRE1BICovCi0JaWYoZXNwLT5kbWFfcmVzZXQpCi0JCWVzcC0+ZG1hX3Jlc2V0KGVzcCk7Ci0KLQkvKiBSZXNldCB0aGUgRVNQICovCi0JZXNwX3Jlc2V0X2VzcChlc3AsIGVyZWdzKTsKLQotCS8qIFJlc2V0IHRoZSBTQ1NJIGJ1cywgYnV0IHRlbGwgRVNQIG5vdCB0byBnZW5lcmF0ZSBhbiBpcnEgKi8KLQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9jZmcxLCAoZXNwX3JlYWQoZXJlZ3MtPmVzcF9jZmcxKSB8IEVTUF9DT05GSUcxX1NSUkRJU0FCKSk7Ci0JZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX1JTKTsKLQl1ZGVsYXkoNDAwKTsKLQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9jZmcxLCBlc3AtPmNvbmZpZzEpOwotCi0JLyogRWF0IGFueSBiaXRyb3QgaW4gdGhlIGNoaXAgYW5kIHdlIGFyZSBkb25lLi4uICovCi0JdHJhc2ggPSBlc3BfcmVhZChlcmVncy0+ZXNwX2ludHJwdCk7Ci19Ci1FWFBPUlRfU1lNQk9MKGVzcF9ib290dXBfcmVzZXQpOwotCi0vKiBBbGxvY2F0ZSBzdHJ1Y3R1cmUgYW5kIGluc2VydCBiYXNpYyBkYXRhIHN1Y2ggYXMgU0NTSSBjaGlwIGZyZXF1ZW5jeQotICogZGF0YSBhbmQgYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UKLSAqLwotc3RydWN0IE5DUl9FU1AqIGVzcF9hbGxvY2F0ZShzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICp0cG50LCB2b2lkICplc3BfZGV2LAotCQkJICAgICBpbnQgaG90cGx1ZykKLXsKLQlzdHJ1Y3QgTkNSX0VTUCAqZXNwLCAqZWxpbms7Ci0Jc3RydWN0IFNjc2lfSG9zdCAqZXNwX2hvc3Q7Ci0KLQlpZiAoaG90cGx1ZykKLQkJZXNwX2hvc3QgPSBzY3NpX2hvc3RfYWxsb2ModHBudCwgc2l6ZW9mKHN0cnVjdCBOQ1JfRVNQKSk7Ci0JZWxzZQotCQllc3BfaG9zdCA9IHNjc2lfcmVnaXN0ZXIodHBudCwgc2l6ZW9mKHN0cnVjdCBOQ1JfRVNQKSk7Ci0JaWYoIWVzcF9ob3N0KQotCQlwYW5pYygiQ2Fubm90IHJlZ2lzdGVyIEVTUCBTQ1NJIGhvc3QiKTsKLQllc3AgPSAoc3RydWN0IE5DUl9FU1AgKikgZXNwX2hvc3QtPmhvc3RkYXRhOwotCWlmKCFlc3ApCi0JCXBhbmljKCJObyBlc3AgaW4gaG9zdGRhdGEiKTsKLQllc3AtPmVob3N0ID0gZXNwX2hvc3Q7Ci0JZXNwLT5lZGV2ID0gZXNwX2RldjsKLQllc3AtPmVzcF9pZCA9IG5lc3BzKys7Ci0KLQkvKiBTZXQgYml0c2hpZnQgdmFsdWUgKG9ubHkgdXNlZCBvbiBBbWlnYSB3aXRoIG11bHRpcGxlIEVTUHMpICovCi0JZXNwLT5zaGlmdCA9IDI7Ci0KLQkvKiBQdXQgaW50byB0aGUgY2hhaW4gb2YgZXNwIGNoaXBzIGRldGVjdGVkICovCi0JaWYoZXNwY2hhaW4pIHsKLQkJZWxpbmsgPSBlc3BjaGFpbjsKLQkJd2hpbGUoZWxpbmstPm5leHQpIGVsaW5rID0gZWxpbmstPm5leHQ7Ci0JCWVsaW5rLT5uZXh0ID0gZXNwOwotCX0gZWxzZSB7Ci0JCWVzcGNoYWluID0gZXNwOwotCX0KLQllc3AtPm5leHQgPSBOVUxMOwotCi0JcmV0dXJuIGVzcDsKLX0KLQotdm9pZCBlc3BfZGVhbGxvY2F0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotCXN0cnVjdCBOQ1JfRVNQICplbGluazsKLQotCWlmKGVzcGNoYWluID09IGVzcCkgewotCQllc3BjaGFpbiA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJZm9yKGVsaW5rID0gZXNwY2hhaW47IGVsaW5rICYmIChlbGluay0+bmV4dCAhPSBlc3ApOyBlbGluayA9IGVsaW5rLT5uZXh0KTsKLQkJaWYoZWxpbmspIAotCQkJZWxpbmstPm5leHQgPSBlc3AtPm5leHQ7Ci0JfQotCW5lc3BzLS07Ci19Ci0KLS8qIENvbXBsZXRlIGluaXRpYWxpemF0aW9uIG9mIEVTUCBzdHJ1Y3R1cmUgYW5kIGRldmljZQotICogQ2FsbGVyIG11c3QgaGF2ZSBpbml0aWFsaXplZCBhcHByb3ByaWF0ZSBwYXJ0cyBvZiB0aGUgRVNQIHN0cnVjdHVyZQotICogYmV0d2VlbiB0aGUgY2FsbCB0byBlc3BfYWxsb2NhdGUgYW5kIHRoaXMgZnVuY3Rpb24uCi0gKi8KLXZvaWQgZXNwX2luaXRpYWxpemUoc3RydWN0IE5DUl9FU1AgKmVzcCkKLXsKLQlzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzID0gZXNwLT5lcmVnczsKLQl1bnNpZ25lZCBpbnQgZm1oejsKLQl1bmNoYXIgY2NmOwotCWludCBpOwotCQotCS8qIENoZWNrIG91dCB0aGUgY2xvY2sgcHJvcGVydGllcyBvZiB0aGUgY2hpcC4gKi8KLQotCS8qIFRoaXMgaXMgZ2V0dGluZyBtZXNzeSBidXQgaXQgaGFzIHRvIGJlIGRvbmUKLQkgKiBjb3JyZWN0bHkgb3IgZWxzZSB5b3UgZ2V0IHdlaXJkIGJlaGF2aW9yIGFsbAotCSAqIG92ZXIgdGhlIHBsYWNlLiAgV2UgYXJlIHRyeWluZyB0byBiYXNpY2FsbHkKLQkgKiBmaWd1cmUgb3V0IHRocmVlIHBpZWNlcyBvZiBpbmZvcm1hdGlvbi4KLQkgKgotCSAqIGEpIENsb2NrIENvbnZlcnNpb24gRmFjdG9yCi0JICoKLQkgKiAgICBUaGlzIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlucHV0Ci0JICogICAgY3J5c3RhbCBjbG9jayBmcmVxdWVuY3kgZ29pbmcgaW50byB0aGUKLQkgKiAgICBFU1Agb24gdGhpcyBtYWNoaW5lLiAgQW55IG9wZXJhdGlvbiB3aG9zZQotCSAqICAgIHRpbWluZyBpcyBsb25nZXIgdGhhbiA0MDBucyBkZXBlbmRzIG9uIHRoaXMKLQkgKiAgICB2YWx1ZSBiZWluZyBjb3JyZWN0LiAgRm9yIGV4YW1wbGUsIHlvdSdsbAotCSAqICAgIGdldCBibGlwcyBmb3IgYXJiaXRyYXRpb24vc2VsZWN0aW9uIGR1cmluZwotCSAqICAgIGhpZ2ggbG9hZCBvciB3aXRoIG11bHRpcGxlIHRhcmdldHMgaWYgdGhpcwotCSAqICAgIGlzIG5vdCBzZXQgY29ycmVjdGx5LgotCSAqCi0JICogYikgU2VsZWN0aW9uIFRpbWUtT3V0Ci0JICoKLQkgKiAgICBUaGUgRVNQIGlzbid0IHZlcnkgYnJpZ2h0IGFuZCB3aWxsIGFyYml0cmF0ZQotCSAqICAgIGZvciB0aGUgYnVzIGFuZCB0cnkgdG8gc2VsZWN0IGEgdGFyZ2V0Ci0JICogICAgZm9yZXZlciBpZiB5b3UgbGV0IGl0LiAgVGhpcyB2YWx1ZSB0ZWxscwotCSAqICAgIHRoZSBFU1Agd2hlbiBpdCBoYXMgdGFrZW4gdG9vIGxvbmcgdG8KLQkgKiAgICBuZWdvdGlhdGUgYW5kIHRoYXQgaXQgc2hvdWxkIGludGVycnVwdAotCSAqICAgIHRoZSBDUFUgc28gd2UgY2FuIHNlZSB3aGF0IGhhcHBlbmVkLgotCSAqICAgIFRoZSB2YWx1ZSBpcyBjb21wdXRlZCBhcyBmb2xsb3dzIChmcm9tCi0JICogICAgTkNSL1N5bWJpb3MgY2hpcCBkb2NzKS4KLQkgKgotCSAqICAgICAgICAgIChUaW1lIE91dCBQZXJpb2QpICogIChJbnB1dCBDbG9jaykKLQkgKiAgICBTVE8gPSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JICogICAgICAgICAgKDgxOTIpICogKENsb2NrIENvbnZlcnNpb24gRmFjdG9yKQotCSAqCi0JICogICAgWW91IHVzdWFsbHkgd2FudCB0aGUgdGltZSBvdXQgcGVyaW9kIHRvIGJlCi0JICogICAgYXJvdW5kIDI1MG1zLCBJIHRoaW5rIHdlJ2xsIHNldCBpdCBhIGxpdHRsZQotCSAqICAgIGJpdCBoaWdoZXIgdG8gYWNjb3VudCBmb3IgZnVsbHkgbG9hZGVkIFNDU0kKLQkgKiAgICBidXMncyBhbmQgc2xvdyBkZXZpY2VzIHRoYXQgZG9uJ3QgcmVzcG9uZCBzbwotCSAqICAgIHF1aWNrbHkgdG8gc2VsZWN0aW9uIGF0dGVtcHRzLiAoeWVhaCwgSSBrbm93Ci0JICogICAgdGhpcyBpcyBvdXQgb2Ygc3BlYy4gYnV0IHRoZXJlIGlzIGEgbG90IG9mCi0JICogICAgYnVnZ3kgcGllY2VzIG9mIGZpcm13YXJlIG91dCB0aGVyZSBzbyBiaXRlIG1lKQotCSAqCi0JICogYykgSW1wZXJpY2FsIGNvbnN0YW50cyBmb3Igc3luY2hyb25vdXMgb2Zmc2V0Ci0JICogICAgYW5kIHRyYW5zZmVyIHBlcmlvZCByZWdpc3RlciB2YWx1ZXMKLQkgKgotCSAqICAgIFRoaXMgZW50YWlscyB0aGUgc21hbGxlc3QgYW5kIGxhcmdlc3Qgc3luYwotCSAqICAgIHBlcmlvZCB3ZSBjb3VsZCBldmVyIGhhbmRsZSBvbiB0aGlzIEVTUC4KLQkgKi8KLQkKLQlmbWh6ID0gZXNwLT5jZnJlcTsKLQotCWlmKGZtaHogPD0gKDUwMDAwMDApKQotCQljY2YgPSAwOwotCWVsc2UKLQkJY2NmID0gKCgoNTAwMDAwMCAtIDEpICsgKGZtaHopKS8oNTAwMDAwMCkpOwotCWlmKCFjY2YgfHwgY2NmID4gOCkgewotCQkvKiBJZiB3ZSBjYW4ndCBmaW5kIGFueXRoaW5nIHJlYXNvbmFibGUsCi0JCSAqIGp1c3QgYXNzdW1lIDIwTUhaLiAgVGhpcyBpcyB0aGUgY2xvY2sKLQkJICogZnJlcXVlbmN5IG9mIHRoZSBvbGRlciBzdW40YydzIHdoZXJlIEkndmUKLQkJICogYmVlbiB1bmFibGUgdG8gZmluZCB0aGUgY2xvY2stZnJlcXVlbmN5Ci0JCSAqIFBST00gcHJvcGVydHkuICBBbGwgb3RoZXIgbWFjaGluZXMgcHJvdmlkZQotCQkgKiB1c2VmdWwgdmFsdWVzIGl0IHNlZW1zLgotCQkgKi8KLQkJY2NmID0gRVNQX0NDRl9GNDsKLQkJZm1oeiA9ICgyMDAwMDAwMCk7Ci0JfQotCWlmKGNjZj09KEVTUF9DQ0ZfRjcrMSkpCi0JCWVzcC0+Y2ZhY3QgPSBFU1BfQ0NGX0YwOwotCWVsc2UgaWYoY2NmID09IEVTUF9DQ0ZfTkVWRVIpCi0JCWVzcC0+Y2ZhY3QgPSBFU1BfQ0NGX0YyOwotCWVsc2UKLQkJZXNwLT5jZmFjdCA9IGNjZjsKLQllc3AtPmNmcmVxID0gZm1oejsKLQllc3AtPmNjeWNsZSA9IEVTUF9NSFpfVE9fQ1lDTEUoZm1oeik7Ci0JZXNwLT5jdGljayA9IEVTUF9USUNLKGNjZiwgZXNwLT5jY3ljbGUpOwotCWVzcC0+bmVnX2RlZnAgPSBFU1BfTkVHX0RFRlAoZm1oeiwgY2NmKTsKLQllc3AtPnN5bmNfZGVmcCA9IFNZTkNfREVGUF9TTE9XOwotCi0JcHJpbnRrKCJTQ1NJIElEICVkIENsayAlZE1IeiBDQ0Y9JWQgVE91dCAlZCAiLAotCSAgICAgICBlc3AtPnNjc2lfaWQsIChlc3AtPmNmcmVxIC8gMTAwMDAwMCksCi0JICAgICAgIGNjZiwgKGludCkgZXNwLT5uZWdfZGVmcCk7Ci0KLQkvKiBGaWxsIGluIGVob3N0IGRhdGEgKi8KLQllc3AtPmVob3N0LT5iYXNlID0gKHVuc2lnbmVkIGxvbmcpZXJlZ3M7Ci0JZXNwLT5laG9zdC0+dGhpc19pZCA9IGVzcC0+c2NzaV9pZDsKLQllc3AtPmVob3N0LT5pcnEgPSBlc3AtPmlycTsKLQotCS8qIFNDU0kgaWQgbWFzayAqLwotCWVzcC0+c2NzaV9pZF9tYXNrID0gKDEgPDwgZXNwLT5zY3NpX2lkKTsKLQotCS8qIFByb2JlIHRoZSByZXZpc2lvbiBvZiB0aGlzIGVzcCAqLwotCWVzcC0+Y29uZmlnMSA9IChFU1BfQ09ORklHMV9QRU5BQkxFIHwgKGVzcC0+c2NzaV9pZCAmIDcpKTsKLQllc3AtPmNvbmZpZzIgPSAoRVNQX0NPTkZJRzJfU0NTSTJFTkFCIHwgRVNQX0NPTkZJRzJfUkVHUEFSSVRZKTsKLQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9jZmcyLCBlc3AtPmNvbmZpZzIpOwotCWlmKChlc3BfcmVhZChlcmVncy0+ZXNwX2NmZzIpICYgfihFU1BfQ09ORklHMl9NQUdJQykpICE9Ci0JICAgKEVTUF9DT05GSUcyX1NDU0kyRU5BQiB8IEVTUF9DT05GSUcyX1JFR1BBUklUWSkpIHsKLQkJcHJpbnRrKCJOQ1I1M0M5MChlc3AxMDApXG4iKTsKLQkJZXNwLT5lcmV2ID0gZXNwMTAwOwotCX0gZWxzZSB7Ci0JCWVzcC0+Y29uZmlnMiA9IDA7Ci0JCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmZzIsIDApOwotCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9jZmczLCA1KTsKLQkJaWYoZXNwX3JlYWQoZXJlZ3MtPmVzcF9jZmczKSAhPSA1KSB7Ci0JCQlwcmludGsoIk5DUjUzQzkwQShlc3AxMDBhKVxuIik7Ci0JCQllc3AtPmVyZXYgPSBlc3AxMDBhOwotCQl9IGVsc2UgewotCQkJaW50IHRhcmdldDsKLQotCQkJZm9yKHRhcmdldD0wOyB0YXJnZXQ8ODsgdGFyZ2V0KyspCi0JCQkJZXNwLT5jb25maWczW3RhcmdldF0gPSAwOwotCQkJZXNwLT5wcmV2X2NmZzMgPSAwOwotCQkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZnMywgMCk7Ci0JCQlpZihjY2YgPiBFU1BfQ0NGX0Y1KSB7Ci0JCQkJcHJpbnRrKCJOQ1I1M0M5WEYoZXNwZmFzdClcbiIpOwotCQkJCWVzcC0+ZXJldiA9IGZhc3Q7Ci0JCQkJZXNwLT5zeW5jX2RlZnAgPSBTWU5DX0RFRlBfRkFTVDsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJpbnRrKCJOQ1I1M0M5eChlc3AyMzYpXG4iKTsKLQkJCQllc3AtPmVyZXYgPSBlc3AyMzY7Ci0JCQl9Ci0JCX0KLQl9CQkJCQotCi0JLyogSW5pdGlhbGl6ZSB0aGUgY29tbWFuZCBxdWV1ZXMgKi8KLQllc3AtPmN1cnJlbnRfU0MgPSBOVUxMOwotCWVzcC0+ZGlzY29ubmVjdGVkX1NDID0gTlVMTDsKLQllc3AtPmlzc3VlX1NDID0gTlVMTDsKLQotCS8qIENsZWFyIHRoZSBzdGF0ZSBtYWNoaW5lcy4gKi8KLQllc3AtPnRhcmdldHNfcHJlc2VudCA9IDA7Ci0JZXNwLT5yZXNldHRpbmdfYnVzID0gMDsKLQllc3AtPnNuaXAgPSAwOwotCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmZXNwLT5yZXNldF9xdWV1ZSk7Ci0KLQllc3AtPmZhc19wcmVtYXR1cmVfaW50cl93b3JrYXJvdW5kID0gMDsKLQlmb3IoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQllc3AtPmVzcGNtZGxvZ1tpXSA9IDA7Ci0JZXNwLT5lc3BjbWRlbnQgPSAwOwotCWZvcihpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJZXNwLT5jdXJfbXNnb3V0W2ldID0gMDsKLQkJZXNwLT5jdXJfbXNnaW5baV0gPSAwOwotCX0KLQllc3AtPnByZXZtc2dvdXQgPSBlc3AtPnByZXZtc2dpbiA9IDA7Ci0JZXNwLT5tc2dvdXRfbGVuID0gZXNwLT5tc2dpbl9sZW4gPSAwOwotCi0JLyogQ2xlYXIgdGhlIG9uZSBiZWhpbmQgY2FjaGVzIHRvIGhvbGQgdW5tYXRjaGFibGUgdmFsdWVzLiAqLwotCWVzcC0+cHJldl9zb2ZmID0gZXNwLT5wcmV2X3N0cCA9IGVzcC0+cHJldl9jZmczID0gMHhmZjsKLQotCS8qIFJlc2V0IHRoZSB0aGluZyBiZWZvcmUgd2UgdHJ5IGFueXRoaW5nLi4uICovCi0JZXNwX2Jvb3R1cF9yZXNldChlc3AsIGVyZWdzKTsKLQotCWVzcHNfaW5fdXNlKys7Ci19Ci0KLS8qIFRoZSBpbmZvIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHdoYXRldmVyIHVzZWZ1bAotICogaW5mb3JtYXRpb24gdGhlIGRldmVsb3BlciBzZWVzIGZpdC4gIElmIG5vdCBwcm92aWRlZCwgdGhlbgotICogdGhlIG5hbWUgZmllbGQgd2lsbCBiZSB1c2VkIGluc3RlYWQuCi0gKi8KLWNvbnN0IGNoYXIgKmVzcF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCi17Ci0Jc3RydWN0IE5DUl9FU1AgKmVzcDsKLQotCWVzcCA9IChzdHJ1Y3QgTkNSX0VTUCAqKSBob3N0LT5ob3N0ZGF0YTsKLQlzd2l0Y2goZXNwLT5lcmV2KSB7Ci0JY2FzZSBlc3AxMDA6Ci0JCXJldHVybiAiRVNQMTAwIChOQ1I1M0M5MCkiOwotCWNhc2UgZXNwMTAwYToKLQkJcmV0dXJuICJFU1AxMDBBIChOQ1I1M0M5MEEpIjsKLQljYXNlIGVzcDIzNjoKLQkJcmV0dXJuICJFU1AyMzYgKE5DUjUzQzl4KSI7Ci0JY2FzZSBmYXMyMTY6Ci0JCXJldHVybiAiRW11bGV4IEZBUzIxNiI7Ci0JY2FzZSBmYXMyMzY6Ci0JCXJldHVybiAiRW11bGV4IEZBUzIzNiI7Ci0JY2FzZSBmYXMzNjY6Ci0JCXJldHVybiAiUUxvZ2ljIEZBUzM2NiI7Ci0JY2FzZSBmYXMxMDBhOgotCQlyZXR1cm4gIkZQRVNQMTAwQSI7Ci0JY2FzZSBmc2M6Ci0JCXJldHVybiAiU3ltYmlvcyBMb2dpYyA1M0NGOXgtMiI7Ci0JZGVmYXVsdDoKLQkJcGFuaWMoIkJvZ29uIEVTUCByZXZpc2lvbiIpOwotCX07Ci19Ci1FWFBPUlRfU1lNQk9MKGVzcF9pbmZvKTsKLQotLyogRnJvbSBXb2xmZ2FuZyBTdGFuZ2xtZWllcidzIE5DUiBzY3NpIGRyaXZlci4gKi8KLXN0cnVjdCBpbmZvX3N0cgotewotCWNoYXIgKmJ1ZmZlcjsKLQlpbnQgbGVuZ3RoOwotCWludCBvZmZzZXQ7Ci0JaW50IHBvczsKLX07Ci0KLXN0YXRpYyB2b2lkIGNvcHlfbWVtX2luZm8oc3RydWN0IGluZm9fc3RyICppbmZvLCBjaGFyICpkYXRhLCBpbnQgbGVuKQotewotCWlmIChpbmZvLT5wb3MgKyBsZW4gPiBpbmZvLT5sZW5ndGgpCi0JCWxlbiA9IGluZm8tPmxlbmd0aCAtIGluZm8tPnBvczsKLQotCWlmIChpbmZvLT5wb3MgKyBsZW4gPCBpbmZvLT5vZmZzZXQpIHsKLQkJaW5mby0+cG9zICs9IGxlbjsKLQkJcmV0dXJuOwotCX0KLQlpZiAoaW5mby0+cG9zIDwgaW5mby0+b2Zmc2V0KSB7Ci0JCWRhdGEgKz0gKGluZm8tPm9mZnNldCAtIGluZm8tPnBvcyk7Ci0JCWxlbiAgLT0gKGluZm8tPm9mZnNldCAtIGluZm8tPnBvcyk7Ci0JfQotCi0JaWYgKGxlbiA+IDApIHsKLQkJbWVtY3B5KGluZm8tPmJ1ZmZlciArIGluZm8tPnBvcywgZGF0YSwgbGVuKTsKLQkJaW5mby0+cG9zICs9IGxlbjsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgY29weV9pbmZvKHN0cnVjdCBpbmZvX3N0ciAqaW5mbywgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdCBhcmdzOwotCWNoYXIgYnVmWzgxXTsKLQlpbnQgbGVuOwotCi0JdmFfc3RhcnQoYXJncywgZm10KTsKLQlsZW4gPSB2c3ByaW50ZihidWYsIGZtdCwgYXJncyk7Ci0JdmFfZW5kKGFyZ3MpOwotCi0JY29weV9tZW1faW5mbyhpbmZvLCBidWYsIGxlbik7Ci0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIGludCBlc3BfaG9zdF9pbmZvKHN0cnVjdCBOQ1JfRVNQICplc3AsIGNoYXIgKnB0ciwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuKQotewotCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKLQlzdHJ1Y3QgaW5mb19zdHIgaW5mbzsKLQlpbnQgaTsKLQotCWluZm8uYnVmZmVyCT0gcHRyOwotCWluZm8ubGVuZ3RoCT0gbGVuOwotCWluZm8ub2Zmc2V0CT0gb2Zmc2V0OwotCWluZm8ucG9zCT0gMDsKLQotCWNvcHlfaW5mbygmaW5mbywgIkVTUCBIb3N0IEFkYXB0ZXI6XG4iKTsKLQljb3B5X2luZm8oJmluZm8sICJcdEVTUCBNb2RlbFx0XHQiKTsKLQlzd2l0Y2goZXNwLT5lcmV2KSB7Ci0JY2FzZSBlc3AxMDA6Ci0JCWNvcHlfaW5mbygmaW5mbywgIkVTUDEwMCAoTkNSNTNDOTApXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBlc3AxMDBhOgotCQljb3B5X2luZm8oJmluZm8sICJFU1AxMDBBIChOQ1I1M0M5MEEpXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBlc3AyMzY6Ci0JCWNvcHlfaW5mbygmaW5mbywgIkVTUDIzNiAoTkNSNTNDOXgpXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBmYXMyMTY6Ci0JCWNvcHlfaW5mbygmaW5mbywgIkVtdWxleCBGQVMyMTZcbiIpOwotCQlicmVhazsKLQljYXNlIGZhczIzNjoKLQkJY29weV9pbmZvKCZpbmZvLCAiRW11bGV4IEZBUzIzNlxuIik7Ci0JCWJyZWFrOwotCWNhc2UgZmFzMTAwYToKLQkJY29weV9pbmZvKCZpbmZvLCAiRlBFU1AxMDBBXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBmYXN0OgotCQljb3B5X2luZm8oJmluZm8sICJHZW5lcmljIEZBU1RcbiIpOwotCQlicmVhazsKLQljYXNlIGZhczM2NjoKLQkJY29weV9pbmZvKCZpbmZvLCAiUUxvZ2ljIEZBUzM2NlxuIik7Ci0JCWJyZWFrOwotCWNhc2UgZnNjOgotCQljb3B5X2luZm8oJmluZm8sICJTeW1iaW9zIExvZ2ljIDUzQzl4LTJcbiIpOwotCQlicmVhazsKLQljYXNlIGVzcHVua25vd246Ci0JZGVmYXVsdDoKLQkJY29weV9pbmZvKCZpbmZvLCAiVW5rbm93biFcbiIpOwotCQlicmVhazsKLQl9OwotCWNvcHlfaW5mbygmaW5mbywgIlx0TGl2ZSBUYXJnZXRzXHRcdFsgIik7Ci0JZm9yKGkgPSAwOyBpIDwgMTU7IGkrKykgewotCQlpZihlc3AtPnRhcmdldHNfcHJlc2VudCAmICgxIDw8IGkpKQotCQkJY29weV9pbmZvKCZpbmZvLCAiJWQgIiwgaSk7Ci0JfQotCWNvcHlfaW5mbygmaW5mbywgIl1cblxuIik7Ci0JCi0JLyogTm93IGRlc2NyaWJlIHRoZSBzdGF0ZSBvZiBlYWNoIGV4aXN0aW5nIHRhcmdldC4gKi8KLQljb3B5X2luZm8oJmluZm8sICJUYXJnZXQgI1x0Y29uZmlnM1x0XHRTeW5jIENhcGFiaWxpdGllc1x0RGlzY29ubmVjdFxuIik7Ci0KLQlzaG9zdF9mb3JfZWFjaF9kZXZpY2Uoc2RldiwgZXNwLT5laG9zdCkgewotCQlzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldiA9IHNkZXYtPmhvc3RkYXRhOwotCQl1aW50IGlkID0gc2Rldi0+aWQ7Ci0KLQkJaWYgKCEoZXNwLT50YXJnZXRzX3ByZXNlbnQgJiAoMSA8PCBpZCkpKQotCQkJY29udGludWU7Ci0KLQkJY29weV9pbmZvKCZpbmZvLCAiJWRcdFx0IiwgaWQpOwotCQljb3B5X2luZm8oJmluZm8sICIlMDhseFx0IiwgZXNwLT5jb25maWczW2lkXSk7Ci0JCWNvcHlfaW5mbygmaW5mbywgIlslMDJseCwlMDJseF1cdFx0XHQiLAotCQkJZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0LAotCQkJZXNwX2Rldi0+c3luY19taW5fcGVyaW9kKTsKLQkJY29weV9pbmZvKCZpbmZvLCAiJXNcbiIsIGVzcF9kZXYtPmRpc2Nvbm5lY3QgPyAieWVzIiA6ICJubyIpOwotCX0KLQotCXJldHVybiBpbmZvLnBvcyA+IGluZm8ub2Zmc2V0PyBpbmZvLnBvcyAtIGluZm8ub2Zmc2V0IDogMDsKLX0KLQotLyogRVNQIHByb2MgZmlsZXN5c3RlbSBjb2RlLiAqLwotaW50IGVzcF9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsCi0JCSAgaW50IGlub3V0KQotewotCXN0cnVjdCBOQ1JfRVNQICplc3AgPSAoc3RydWN0IE5DUl9FU1AgKilzaG9zdC0+aG9zdGRhdGE7Ci0KLQlpZihpbm91dCkKLQkJcmV0dXJuIC1FSU5WQUw7IC8qIG5vdCB5ZXQgKi8KLQlpZihzdGFydCkKLQkJKnN0YXJ0ID0gYnVmZmVyOwotCXJldHVybiBlc3BfaG9zdF9pbmZvKGVzcCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7Ci19Ci1FWFBPUlRfU1lNQk9MKGVzcF9wcm9jX2luZm8pOwotCi1zdGF0aWMgdm9pZCBlc3BfZ2V0X2RtYWJ1ZnMoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCkKLXsKLQlpZihzcC0+dXNlX3NnID09IDApIHsKLQkJc3AtPlNDcC50aGlzX3Jlc2lkdWFsID0gc3AtPnJlcXVlc3RfYnVmZmxlbjsKLQkJc3AtPlNDcC5idWZmZXIgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIHNwLT5yZXF1ZXN0X2J1ZmZlcjsKLQkJc3AtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gMDsKLQkJaWYgKGVzcC0+ZG1hX21tdV9nZXRfc2NzaV9vbmUpCi0JCQllc3AtPmRtYV9tbXVfZ2V0X3Njc2lfb25lKGVzcCwgc3ApOwotCQllbHNlCi0JCQlzcC0+U0NwLnB0ciA9Ci0JCQkJKGNoYXIgKikgdmlydF90b19waHlzKHNwLT5yZXF1ZXN0X2J1ZmZlcik7Ci0JfSBlbHNlIHsKLQkJc3AtPlNDcC5idWZmZXIgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopIHNwLT5yZXF1ZXN0X2J1ZmZlcjsKLQkJc3AtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gc3AtPnVzZV9zZyAtIDE7Ci0JCXNwLT5TQ3AudGhpc19yZXNpZHVhbCA9IHNwLT5TQ3AuYnVmZmVyLT5sZW5ndGg7Ci0JCWlmIChlc3AtPmRtYV9tbXVfZ2V0X3Njc2lfc2dsKQotCQkJZXNwLT5kbWFfbW11X2dldF9zY3NpX3NnbChlc3AsIHNwKTsKLQkJZWxzZQotCQkJc3AtPlNDcC5wdHIgPQotCQkJCShjaGFyICopIHZpcnRfdG9fcGh5cyhzZ192aXJ0KHNwLT5TQ3AuYnVmZmVyKSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBlc3BfcmVsZWFzZV9kbWFidWZzKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCi17Ci0JaWYoc3AtPnVzZV9zZyA9PSAwKSB7Ci0JCWlmIChlc3AtPmRtYV9tbXVfcmVsZWFzZV9zY3NpX29uZSkKLQkJCWVzcC0+ZG1hX21tdV9yZWxlYXNlX3Njc2lfb25lKGVzcCwgc3ApOwotCX0gZWxzZSB7Ci0JCWlmIChlc3AtPmRtYV9tbXVfcmVsZWFzZV9zY3NpX3NnbCkKLQkJCWVzcC0+ZG1hX21tdV9yZWxlYXNlX3Njc2lfc2dsKGVzcCwgc3ApOwotCX0KLX0KLQotc3RhdGljIHZvaWQgZXNwX3Jlc3RvcmVfcG9pbnRlcnMoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCkKLXsKLQlzdHJ1Y3QgZXNwX3BvaW50ZXJzICplcCA9ICZlc3AtPmRhdGFfcG9pbnRlcnNbc2NtZF9pZChzcCldOwotCi0Jc3AtPlNDcC5wdHIgPSBlcC0+c2F2ZWRfcHRyOwotCXNwLT5TQ3AuYnVmZmVyID0gZXAtPnNhdmVkX2J1ZmZlcjsKLQlzcC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBlcC0+c2F2ZWRfdGhpc19yZXNpZHVhbDsKLQlzcC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSBlcC0+c2F2ZWRfYnVmZmVyc19yZXNpZHVhbDsKLX0KLQotc3RhdGljIHZvaWQgZXNwX3NhdmVfcG9pbnRlcnMoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCkKLXsKLQlzdHJ1Y3QgZXNwX3BvaW50ZXJzICplcCA9ICZlc3AtPmRhdGFfcG9pbnRlcnNbc2NtZF9pZChzcCldOwotCi0JZXAtPnNhdmVkX3B0ciA9IHNwLT5TQ3AucHRyOwotCWVwLT5zYXZlZF9idWZmZXIgPSBzcC0+U0NwLmJ1ZmZlcjsKLQllcC0+c2F2ZWRfdGhpc19yZXNpZHVhbCA9IHNwLT5TQ3AudGhpc19yZXNpZHVhbDsKLQllcC0+c2F2ZWRfYnVmZmVyc19yZXNpZHVhbCA9IHNwLT5TQ3AuYnVmZmVyc19yZXNpZHVhbDsKLX0KLQotLyogU29tZSBydWxlczoKLSAqCi0gKiAgIDEpIE5ldmVyIGV2ZXIgcGFuaWMgd2hpbGUgc29tZXRoaW5nIGlzIGxpdmUgb24gdGhlIGJ1cy4KLSAqICAgICAgSWYgdGhlcmUgaXMgdG8gYmUgYW55IGNoYW5jZSBvZiBzeW5jaW5nIHRoZSBkaXNrcyB0aGlzCi0gKiAgICAgIHJ1bGUgaXMgdG8gYmUgb2JleWVkLgotICoKLSAqICAgMikgQW55IHRhcmdldCB0aGF0IGNhdXNlcyBhIGZvdWwgY29uZGl0aW9uIHdpbGwgbm8gbG9uZ2VyCi0gKiAgICAgIGhhdmUgc3luY2hyb25vdXMgdHJhbnNmZXJzIGRvbmUgdG8gaXQsIG5vIHF1ZXN0aW9ucwotICogICAgICBhc2tlZC4KLSAqCi0gKiAgIDMpIEtlZXAgcmVnaXN0ZXIgYWNjZXNzZXMgdG8gYSBtaW5pbXVtLiAgVGhpbmsgYWJvdXQgc29tZQotICogICAgICBkYXkgd2hlbiB3ZSBoYXZlIFhidXMgbWFjaGluZXMgdGhpcyBpcyBydW5uaW5nIG9uIGFuZAotICogICAgICB0aGUgRVNQIGNoaXAgaXMgb24gdGhlIG90aGVyIGVuZCBvZiB0aGUgbWFjaGluZSBvbiBhCi0gKiAgICAgIGRpZmZlcmVudCBib2FyZCBmcm9tIHRoZSBjcHUgd2hlcmUgdGhpcyBpcyBydW5uaW5nLgotICovCi0KLS8qIEZpcmUgb2ZmIGEgY29tbWFuZC4gIFdlIGFzc3VtZSB0aGUgYnVzIGlzIGZyZWUgYW5kIHRoYXQgdGhlIG9ubHkKLSAqIGNhc2Ugd2hlcmUgd2UgY291bGQgc2VlIGFuIGludGVycnVwdCBpcyB3aGVyZSB3ZSBoYXZlIGRpc2Nvbm5lY3RlZAotICogY29tbWFuZHMgYWN0aXZlIGFuZCB0aGV5IGFyZSB0cnlpbmcgdG8gcmVzZWxlY3QgdXMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBlc3BfY2hlY2tfY21kKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCi17Ci0Jc3dpdGNoKHNwLT5jbWRfbGVuKSB7Ci0JY2FzZSA2OgotCWNhc2UgMTA6Ci0JY2FzZSAxMjoKLQkJZXNwLT5lc3Bfc2xvd2NtZCA9IDA7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZXNwLT5lc3Bfc2xvd2NtZCA9IDE7Ci0JCWVzcC0+ZXNwX3NjbWRsZWZ0ID0gc3AtPmNtZF9sZW47Ci0JCWVzcC0+ZXNwX3NjbWRwID0gJnNwLT5jbW5kWzBdOwotCQlicmVhazsKLQl9OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYnVpbGRfc3luY19uZWdvX21zZyhzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBpbnQgcGVyaW9kLCBpbnQgb2Zmc2V0KQotewotCWVzcC0+Y3VyX21zZ291dFswXSA9IEVYVEVOREVEX01FU1NBR0U7Ci0JZXNwLT5jdXJfbXNnb3V0WzFdID0gMzsKLQllc3AtPmN1cl9tc2dvdXRbMl0gPSBFWFRFTkRFRF9TRFRSOwotCWVzcC0+Y3VyX21zZ291dFszXSA9IHBlcmlvZDsKLQllc3AtPmN1cl9tc2dvdXRbNF0gPSBvZmZzZXQ7Ci0JZXNwLT5tc2dvdXRfbGVuID0gNTsKLX0KLQotc3RhdGljIHZvaWQgZXNwX2V4ZWNfY21kKHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci0Jc3RydWN0IEVTUF9yZWdzICplcmVncyA9IGVzcC0+ZXJlZ3M7Ci0Jc3RydWN0IGVzcF9kZXZpY2UgKmVzcF9kZXY7Ci0JU2NzaV9DbW5kICpTQ3B0cjsKLQlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKlNEcHRyOwotCXZvbGF0aWxlIHVuY2hhciAqY21kcCA9IGVzcC0+ZXNwX2NvbW1hbmQ7Ci0JdW5zaWduZWQgY2hhciB0aGVfZXNwX2NvbW1hbmQ7Ci0JaW50IGx1biwgdGFyZ2V0OwotCWludCBpOwotCi0JLyogSG9sZCBvZmYgaWYgd2UgaGF2ZSBkaXNjb25uZWN0ZWQgY29tbWFuZHMgYW5kCi0JICogYW4gSVJRIGlzIHNob3dpbmcuLi4KLQkgKi8KLQlpZihlc3AtPmRpc2Nvbm5lY3RlZF9TQyAmJiBlc3AtPmRtYV9pcnFfcChlc3ApKQotCQlyZXR1cm47Ci0KLQkvKiBHcmFiIGZpcnN0IG1lbWJlciBvZiB0aGUgaXNzdWUgcXVldWUuICovCi0JU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0MgPSByZW1vdmVfZmlyc3RfU0MoJmVzcC0+aXNzdWVfU0MpOwotCi0JLyogU2FmZSB0byBwYW5pYyBoZXJlIGJlY2F1c2UgY3VycmVudF9TQyBpcyBudWxsLiAqLwotCWlmKCFTQ3B0cikKLQkJcGFuaWMoImVzcDogZXNwX2V4ZWNfY21kIGFuZCBpc3N1ZSBxdWV1ZSBpcyBOVUxMIik7Ci0KLQlTRHB0ciA9IFNDcHRyLT5kZXZpY2U7Ci0JZXNwX2RldiA9IFNEcHRyLT5ob3N0ZGF0YTsKLQlsdW4gPSBTQ3B0ci0+ZGV2aWNlLT5sdW47Ci0JdGFyZ2V0ID0gU0NwdHItPmRldmljZS0+aWQ7Ci0KLQllc3AtPnNuaXAgPSAwOwotCWVzcC0+bXNnb3V0X2xlbiA9IDA7Ci0KLQkvKiBTZW5kIGl0IG91dCB3aG9sZSwgb3IgcGllY2UgYnkgcGllY2U/ICAgVGhlIEVTUAotCSAqIG9ubHkga25vd3MgaG93IHRvIGF1dG9tYXRpY2FsbHkgc2VuZCBvdXQgNiwgMTAsCi0JICogYW5kIDEyIGJ5dGUgY29tbWFuZHMuICBJIHVzZWQgdG8gdGhpbmsgdGhhdCB0aGUKLQkgKiBMaW51eCBTQ1NJIGNvZGUgd291bGQgbmV2ZXIgdGhyb3cgYW55dGhpbmcgb3RoZXIKLQkgKiB0aGFuIHRoYXQgdG8gdXMsIGJ1dCB0aGVuIGFnYWluIHRoZXJlIGlzIHRoZQotCSAqIFNDU0kgZ2VuZXJpYyBkcml2ZXIgd2hpY2ggY2FuIHNlbmQgdXMgYW55dGhpbmcuCi0JICovCi0JZXNwX2NoZWNrX2NtZChlc3AsIFNDcHRyKTsKLQotCS8qIElmIGFyYml0cmF0aW9uL3NlbGVjdGlvbiBpcyBzdWNjZXNzZnVsLCB0aGUgRVNQIHdpbGwgbGVhdmUKLQkgKiBBVE4gYXNzZXJ0ZWQsIGNhdXNpbmcgdGhlIHRhcmdldCB0byBnbyBpbnRvIG1lc3NhZ2Ugb3V0Ci0JICogcGhhc2UuICBUaGUgRVNQIHdpbGwgZmVlZCB0aGUgdGFyZ2V0IHRoZSBpZGVudGlmeSBhbmQgdGhlbgotCSAqIHRoZSB0YXJnZXQgY2FuIG9ubHkgbGVnYWxseSBnbyB0byBvbmUgb2YgY29tbWFuZCwKLQkgKiBkYXRhaW4vb3V0LCBzdGF0dXMsIG9yIG1lc3NhZ2UgaW4gcGhhc2UsIG9yIHN0YXkgaW4gbWVzc2FnZQotCSAqIG91dCBwaGFzZSAoc2hvdWxkIHdlIGJlIHRyeWluZyB0byBzZW5kIGEgc3luYyBuZWdvdGlhdGlvbgotCSAqIG1lc3NhZ2UgYWZ0ZXIgdGhlIGlkZW50aWZ5KS4gIEl0IGlzIG5vdCBhbGxvd2VkIHRvIGRyb3AKLQkgKiBCU1ksIGJ1dCBzb21lIGJ1Z2d5IHRhcmdldHMgZG8gYW5kIHdlIGNoZWNrIGZvciB0aGlzCi0JICogY29uZGl0aW9uIGluIHRoZSBzZWxlY3Rpb24gY29tcGxldGUgY29kZS4gIE1vc3Qgb2YgdGhlIHRpbWUKLQkgKiB3ZSdsbCBtYWtlIHRoZSBjb21tYW5kIGJ5dGVzIGF2YWlsYWJsZSB0byB0aGUgRVNQIGFuZCBpdAotCSAqIHdpbGwgbm90IGludGVycnVwdCB1cyB1bnRpbCBpdCBmaW5pc2hlcyBjb21tYW5kIHBoYXNlLCB3ZQotCSAqIGNhbm5vdCBkbyB0aGlzIGZvciBjb21tYW5kIHNpemVzIHRoZSBFU1AgZG9lcyBub3QKLQkgKiB1bmRlcnN0YW5kIGFuZCBpbiB0aGlzIGNhc2Ugd2UnbGwgZ2V0IGludGVycnVwdGVkIHJpZ2h0Ci0JICogd2hlbiB0aGUgdGFyZ2V0IGdvZXMgaW50byBjb21tYW5kIHBoYXNlLgotCSAqCi0JICogSXQgaXMgYWJzb2x1dGVseSBfaWxsZWdhbF8gaW4gdGhlIHByZXNlbmNlIG9mIFNDU0ktMiBkZXZpY2VzCi0JICogdG8gdXNlIHRoZSBFU1Agc2VsZWN0IHcvbyBBVE4gY29tbWFuZC4gIFdoZW4gU0NTSS0yIGRldmljZXMgYXJlCi0JICogcHJlc2VudCBvbiB0aGUgYnVzIHdlIF9tdXN0XyBhbHdheXMgZ28gc3RyYWlnaHQgdG8gbWVzc2FnZSBvdXQKLQkgKiBwaGFzZSB3aXRoIGFuIGlkZW50aWZ5IG1lc3NhZ2UgZm9yIHRoZSB0YXJnZXQuICBCZWluZyB0aGF0Ci0JICogc2VsZWN0aW9uIGF0dGVtcHRzIGluIFNDU0ktMSB3L28gQVROIHdhcyBhbiBvcHRpb24sIGRvaW5nIFNDU0ktMgotCSAqIHNlbGVjdGlvbnMgc2hvdWxkIG5vdCBjb25mdXNlIFNDU0ktMSB3ZSBob3BlLgotCSAqLwotCi0JaWYoZXNwX2Rldi0+c3luYykgewotCQkvKiB0aGlzIHRhcmdldHMgc3luYyBpcyBrbm93biAqLwotI2lmZGVmIENPTkZJR19TQ1NJX01BQ19FU1AKLWRvX3N5bmNfa25vd246Ci0jZW5kaWYKLQkJaWYoZXNwX2Rldi0+ZGlzY29ubmVjdCkKLQkJCSpjbWRwKysgPSBJREVOVElGWSgxLCBsdW4pOwotCQllbHNlCi0JCQkqY21kcCsrID0gSURFTlRJRlkoMCwgbHVuKTsKLQotCQlpZihlc3AtPmVzcF9zbG93Y21kKSB7Ci0JCQl0aGVfZXNwX2NvbW1hbmQgPSAoRVNQX0NNRF9TRUxBUyB8IEVTUF9DTURfRE1BKTsKLQkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9zbGN0X3N0b3ApOwotCQl9IGVsc2UgewotCQkJdGhlX2VzcF9jb21tYW5kID0gKEVTUF9DTURfU0VMQSB8IEVTUF9DTURfRE1BKTsKLQkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9zbGN0X25vcm0pOwotCQl9Ci0JfSBlbHNlIGlmKCEoZXNwLT50YXJnZXRzX3ByZXNlbnQgJiAoMTw8dGFyZ2V0KSkgfHwgIShlc3BfZGV2LT5kaXNjb25uZWN0KSkgewotCQkvKiBBZnRlciB0aGUgYm9vdHVwIFNDU0kgY29kZSBzZW5kcyBib3RoIHRoZQotCQkgKiBURVNUX1VOSVRfUkVBRFkgYW5kIElOUVVJUlkgY29tbWFuZHMgd2Ugd2FudAotCQkgKiB0byBhdCBsZWFzdCBhdHRlbXB0IGFsbG93aW5nIHRoZSBkZXZpY2UgdG8KLQkJICogZGlzY29ubmVjdC4KLQkJICovCi0JCUVTUE1JU0MoKCJlc3A6IFNlbGVjdGluZyBkZXZpY2UgZm9yIGZpcnN0IHRpbWUuIHRhcmdldD0lZCAiCi0JCQkgImx1bj0lZFxuIiwgdGFyZ2V0LCBTQ3B0ci0+ZGV2aWNlLT5sdW4pKTsKLQkJaWYoIVNEcHRyLT5ib3JrZW4gJiYgIWVzcF9kZXYtPmRpc2Nvbm5lY3QpCi0JCQllc3BfZGV2LT5kaXNjb25uZWN0ID0gMTsKLQotCQkqY21kcCsrID0gSURFTlRJRlkoMCwgbHVuKTsKLQkJZXNwLT5wcmV2bXNnb3V0ID0gTk9QOwotCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fc2xjdF9ub3JtKTsKLQkJdGhlX2VzcF9jb21tYW5kID0gKEVTUF9DTURfU0VMQSB8IEVTUF9DTURfRE1BKTsKLQotCQkvKiBUYWtlIG5vIGNoYW5jZXMuLi4gKi8KLQkJZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0ID0gMDsKLQkJZXNwX2Rldi0+c3luY19taW5fcGVyaW9kID0gMDsKLQl9IGVsc2UgewotCQlpbnQgdG9zaGliYV9jZHJvbV9od2J1Z193a2Fyb3VuZCA9IDA7Ci0KLSNpZmRlZiBDT05GSUdfU0NTSV9NQUNfRVNQCi0JCS8qIE5ldmVyIGFsbG93IHN5bmNocm9ub3VzIHRyYW5zZmVycyAoZGlzY29ubmVjdCBPSykgb24KLQkJICogTWFjaW50b3NoLiBXZWxsLCBtYXliZSBsYXRlciB3aGVuIHdlIGZpZ3VyZWQgb3V0IGhvdyB0byAKLQkJICogZG8gRE1BIG9uIHRoZSBtYWNoaW5lcyB0aGF0IHN1cHBvcnQgaXQgLi4uCi0JCSAqLwotCQllc3BfZGV2LT5kaXNjb25uZWN0ID0gMTsKLQkJZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0ID0gMDsKLQkJZXNwX2Rldi0+c3luY19taW5fcGVyaW9kID0gMDsKLQkJZXNwX2Rldi0+c3luYyA9IDE7Ci0JCWVzcC0+c25pcCA9IDA7Ci0JCWdvdG8gZG9fc3luY19rbm93bjsKLSNlbmRpZgotCQkvKiBXZSd2ZSB0YWxrZWQgdG8gdGhpcyBndXkgYmVmb3JlLAotCQkgKiBidXQgbmV2ZXIgbmVnb3RpYXRlZC4gIExldCdzIHRyeQotCQkgKiBzeW5jIG5lZ290aWF0aW9uLgotCQkgKi8KLQkJaWYoIVNEcHRyLT5ib3JrZW4pIHsKLQkJCWlmKChTRHB0ci0+dHlwZSA9PSBUWVBFX1JPTSkgJiYKLQkJCSAgICghc3RybmNtcChTRHB0ci0+dmVuZG9yLCAiVE9TSElCQSIsIDcpKSkgewotCQkJCS8qIE5pY2UgdHJ5IHN1Y2tlci4uLiAqLwotCQkJCUVTUE1JU0MoKCJlc3AlZDogRGlzYWJsaW5nIHN5bmMgZm9yIGJ1Z2d5ICIKLQkJCQkJICJUb3NoaWJhIENEUk9NLlxuIiwgZXNwLT5lc3BfaWQpKTsKLQkJCQl0b3NoaWJhX2Nkcm9tX2h3YnVnX3drYXJvdW5kID0gMTsKLQkJCQlidWlsZF9zeW5jX25lZ29fbXNnKGVzcCwgMCwgMCk7Ci0JCQl9IGVsc2UgewotCQkJCWJ1aWxkX3N5bmNfbmVnb19tc2coZXNwLCBlc3AtPnN5bmNfZGVmcCwgMTUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJYnVpbGRfc3luY19uZWdvX21zZyhlc3AsIDAsIDApOwotCQl9Ci0JCWVzcF9kZXYtPnN5bmMgPSAxOwotCQllc3AtPnNuaXAgPSAxOwotCi0JCS8qIEEgZml4IGZvciBicm9rZW4gU0NTSTEgdGFyZ2V0cywgd2hlbiB0aGV5IGRpc2Nvbm5lY3QKLQkJICogdGhleSBsb2NrIHVwIHRoZSBidXMgYW5kIGNvbmZ1c2UgRVNQLiAgU28gZGlzYWxsb3cKLQkJICogZGlzY29ubmVjdHMgZm9yIFNDU0kxIHRhcmdldHMgZm9yIG5vdyB1bnRpbCB3ZQotCQkgKiBmaW5kIGEgYmV0dGVyIGZpeC4KLQkJICoKLQkJICogQWRkZW5kdW06IFRoaXMgaXMgZnVubnksIEkgZmlndXJlZCBvdXQgd2hhdCB3YXMgZ29pbmcKLQkJICogICAgICAgICAgIG9uLiAgVGhlIGJsb3R6ZWQgU0NTSTEgdGFyZ2V0IHdvdWxkIGRpc2Nvbm5lY3QsCi0JCSAqICAgICAgICAgICBvbmUgb2YgdGhlIG90aGVyIFNDU0kyIHRhcmdldHMgb3IgYm90aCB3b3VsZCBiZQotCQkgKiAgICAgICAgICAgZGlzY29ubmVjdGVkIGFzIHdlbGwuICBUaGUgU0NTSTEgdGFyZ2V0IHdvdWxkCi0JCSAqICAgICAgICAgICBzdGF5IGRpc2Nvbm5lY3RlZCBsb25nIGVub3VnaCB0aGF0IHdlIHN0YXJ0Ci0JCSAqICAgICAgICAgICB1cCBhIGNvbW1hbmQgb24gb25lIG9mIHRoZSBTQ1NJMiB0YXJnZXRzLiAgQXMKLQkJICogICAgICAgICAgIHRoZSBFU1AgaXMgYXJiaXRyYXRpbmcgZm9yIHRoZSBidXMgdGhlIFNDU0kxCi0JCSAqICAgICAgICAgICB0YXJnZXQgYmVnaW5zIHRvIGFyYml0cmF0ZSBhcyB3ZWxsIHRvIHJlc2VsZWN0Ci0JCSAqICAgICAgICAgICB0aGUgRVNQLiAgVGhlIFNDU0kxIHRhcmdldCByZWZ1c2VzIHRvIGRyb3AgaXQncwotCQkgKiAgICAgICAgICAgSUQgYml0IG9uIHRoZSBkYXRhIGJ1cyBldmVuIHRob3VnaCB0aGUgRVNQIGlzCi0JCSAqICAgICAgICAgICBhdCBJRCA3IGFuZCBpcyB0aGUgb2J2aW91cyB3aW5uZXIgZm9yIGFueQotCQkgKiAgICAgICAgICAgYXJiaXRyYXRpb24uICBUaGUgRVNQIGlzIGEgcG9vciBzcG9ydCBhbmQgcmVmdXNlcwotCQkgKiAgICAgICAgICAgdG8gbG9zZSBhcmJpdHJhdGlvbiwgaXQgd2lsbCBjb250aW51ZSBpbmRlZmluaXRlbHkKLQkJICogICAgICAgICAgIHRyeWluZyB0byBhcmJpdHJhdGUgZm9yIHRoZSBidXMgYW5kIGNhbiBvbmx5IGJlCi0JCSAqICAgICAgICAgICBzdG9wcGVkIHZpYSBhIGNoaXAgcmVzZXQgb3IgU0NTSSBidXMgcmVzZXQuCi0JCSAqICAgICAgICAgICBUaGVyZWZvcmUgX25vXyBkaXNjb25uZWN0cyBmb3IgU0NTSTEgdGFyZ2V0cwotCQkgKiAgICAgICAgICAgdGhhbmsgeW91IHZlcnkgbXVjaC4gOy0pCi0JCSAqLwotCQlpZigoKFNEcHRyLT5zY3NpX2xldmVsIDwgMykgJiYgKFNEcHRyLT50eXBlICE9IFRZUEVfVEFQRSkpIHx8Ci0JCSAgIHRvc2hpYmFfY2Ryb21faHdidWdfd2thcm91bmQgfHwgU0RwdHItPmJvcmtlbikgewotCQkJRVNQTUlTQygoS0VSTl9JTkZPICJlc3AlZDogRGlzYWJsaW5nIERJU0NPTk5FQ1QgZm9yIHRhcmdldCAlZCAiCi0JCQkJICJsdW4gJWRcbiIsIGVzcC0+ZXNwX2lkLCBTQ3B0ci0+ZGV2aWNlLT5pZCwgU0NwdHItPmRldmljZS0+bHVuKSk7Ci0JCQllc3BfZGV2LT5kaXNjb25uZWN0ID0gMDsKLQkJCSpjbWRwKysgPSBJREVOVElGWSgwLCBsdW4pOwotCQl9IGVsc2UgewotCQkJKmNtZHArKyA9IElERU5USUZZKDEsIGx1bik7Ci0JCX0KLQotCQkvKiBFU1AgZmlmbyBpcyBvbmx5IHNvIGJpZy4uLgotCQkgKiBNYWtlIHRoaXMgbG9vayBsaWtlIGEgc2xvdyBjb21tYW5kLgotCQkgKi8KLQkJZXNwLT5lc3Bfc2xvd2NtZCA9IDE7Ci0JCWVzcC0+ZXNwX3NjbWRsZWZ0ID0gU0NwdHItPmNtZF9sZW47Ci0JCWVzcC0+ZXNwX3NjbWRwID0gJlNDcHRyLT5jbW5kWzBdOwotCi0JCXRoZV9lc3BfY29tbWFuZCA9IChFU1BfQ01EX1NFTEFTIHwgRVNQX0NNRF9ETUEpOwotCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fc2xjdF9tc2cpOwotCX0KLQotCWlmKCFlc3AtPmVzcF9zbG93Y21kKQotCQlmb3IoaSA9IDA7IGkgPCBTQ3B0ci0+Y21kX2xlbjsgaSsrKQotCQkJKmNtZHArKyA9IFNDcHRyLT5jbW5kW2ldOwotCi0JZXNwX3dyaXRlKGVyZWdzLT5lc3BfYnVzaWQsICh0YXJnZXQgJiA3KSk7Ci0JaWYgKGVzcC0+cHJldl9zb2ZmICE9IGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCB8fAotCSAgICBlc3AtPnByZXZfc3RwICAhPSBlc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QgfHwKLQkgICAgKGVzcC0+ZXJldiA+IGVzcDEwMGEgJiYKLQkgICAgIGVzcC0+cHJldl9jZmczICE9IGVzcC0+Y29uZmlnM1t0YXJnZXRdKSkgewotCQllc3AtPnByZXZfc29mZiA9IGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldDsKLQkJZXNwX3dyaXRlKGVyZWdzLT5lc3Bfc29mZiwgZXNwLT5wcmV2X3NvZmYpOwotCQllc3AtPnByZXZfc3RwID0gZXNwX2Rldi0+c3luY19taW5fcGVyaW9kOwotCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9zdHAsIGVzcC0+cHJldl9zdHApOyAKLQkJaWYoZXNwLT5lcmV2ID4gZXNwMTAwYSkgewotCQkJZXNwLT5wcmV2X2NmZzMgPSBlc3AtPmNvbmZpZzNbdGFyZ2V0XTsKLQkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmZzMsIGVzcC0+cHJldl9jZmczKTsKLQkJfQotCX0KLQlpID0gKGNtZHAgLSBlc3AtPmVzcF9jb21tYW5kKTsKLQotCS8qIFNldCB1cCB0aGUgRE1BIGFuZCBFU1AgY291bnRlcnMgKi8KLQlpZihlc3AtPmRvX3Bpb19jbWRzKXsKLQkJaW50IGogPSAwOwotCi0JCS8qIAotCQkgKiBYWFggTVNjaDoKLQkJICoKLQkJICogSXQgc2VlbXMgdGhpcyBpcyByZXF1aXJlZCwgYXQgbGVhc3QgdG8gY2xlYW4gdXAKLQkJICogYWZ0ZXIgZmFpbGVkIGNvbW1hbmRzIHdoZW4gdXNpbmcgUElPIG1vZGUgLi4uCi0JCSAqLwotCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfRkxVU0gpOwotCi0JCWZvcig7ajxpO2orKykKLQkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2ZkYXRhLCBlc3AtPmVzcF9jb21tYW5kW2pdKTsKLQkJdGhlX2VzcF9jb21tYW5kICY9IH5FU1BfQ01EX0RNQTsKLQotCQkvKiBUZWxsIEVTUCB0byAiZ28iLiAqLwotCQllc3BfY21kKGVzcCwgZXJlZ3MsIHRoZV9lc3BfY29tbWFuZCk7Ci0JfSBlbHNlIHsKLQkJLyogU2V0IHVwIHRoZSBFU1AgY291bnRlcnMgKi8KLQkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfdGNsb3csIGkpOwotCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF90Y21lZCwgMCk7Ci0JCWVzcC0+ZG1hX2luaXRfd3JpdGUoZXNwLCBlc3AtPmVzcF9jb21tYW5kX2R2bWEsIGkpOwotCi0JCS8qIFRlbGwgRVNQIHRvICJnbyIuICovCi0JCWVzcF9jbWQoZXNwLCBlcmVncywgdGhlX2VzcF9jb21tYW5kKTsKLQl9Ci19Ci0KLS8qIFF1ZXVlIGEgU0NTSSBjb21tYW5kIGRlbGl2ZXJlZCBmcm9tIHRoZSBtaWQtbGV2ZWwgTGludXggU0NTSSBjb2RlLiAqLwotaW50IGVzcF9xdWV1ZShTY3NpX0NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKQotewotCXN0cnVjdCBOQ1JfRVNQICplc3A7Ci0KLQkvKiBTZXQgdXAgZnVuYyBwdHIgYW5kIGluaXRpYWwgZHJpdmVyIGNtZC1waGFzZS4gKi8KLQlTQ3BudC0+c2NzaV9kb25lID0gZG9uZTsKLQlTQ3BudC0+U0NwLnBoYXNlID0gbm90X2lzc3VlZDsKLQotCWVzcCA9IChzdHJ1Y3QgTkNSX0VTUCAqKSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKLQotCWlmKGVzcC0+ZG1hX2xlZF9vbikKLQkJZXNwLT5kbWFfbGVkX29uKGVzcCk7Ci0KLQkvKiBXZSB1c2UgdGhlIHNjcmF0Y2ggYXJlYS4gKi8KLQlFU1BRVUVVRSgoImVzcF9xdWV1ZTogdGFyZ2V0PSVkIGx1bj0lZCAiLCBTQ3BudC0+ZGV2aWNlLT5pZCwgU0NwbnQtPmx1bikpOwotCUVTUERJU0MoKCJOPCUwMngsJTAyeD4iLCBTQ3BudC0+ZGV2aWNlLT5pZCwgU0NwbnQtPmx1bikpOwotCi0JZXNwX2dldF9kbWFidWZzKGVzcCwgU0NwbnQpOwotCWVzcF9zYXZlX3BvaW50ZXJzKGVzcCwgU0NwbnQpOyAvKiBGSVhNRSBmb3IgdGFnIHF1ZXVlaW5nICovCi0KLQlTQ3BudC0+U0NwLlN0YXR1cyAgICAgICAgICAgPSBDSEVDS19DT05ESVRJT047Ci0JU0NwbnQtPlNDcC5NZXNzYWdlICAgICAgICAgID0gMHhmZjsKLQlTQ3BudC0+U0NwLnNlbnRfY29tbWFuZCAgICAgPSAwOwotCi0JLyogUGxhY2UgaW50byBvdXIgcXVldWUuICovCi0JaWYoU0NwbnQtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSkgewotCQlFU1BRVUVVRSgoIlJRU0VOU0VcbiIpKTsKLQkJcHJlcGVuZF9TQygmZXNwLT5pc3N1ZV9TQywgU0NwbnQpOwotCX0gZWxzZSB7Ci0JCUVTUFFVRVVFKCgiXG4iKSk7Ci0JCWFwcGVuZF9TQygmZXNwLT5pc3N1ZV9TQywgU0NwbnQpOwotCX0KLQotCS8qIFJ1biBpdCBub3cgaWYgd2UgY2FuLiAqLwotCWlmKCFlc3AtPmN1cnJlbnRfU0MgJiYgIWVzcC0+cmVzZXR0aW5nX2J1cykKLQkJZXNwX2V4ZWNfY21kKGVzcCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogRHVtcCBkcml2ZXIgc3RhdGUuICovCi1zdGF0aWMgdm9pZCBlc3BfZHVtcF9jbWQoU2NzaV9DbW5kICpTQ3B0cikKLXsKLQlFU1BMT0coKCJbdGd0PCUwMng+IGx1bjwlMDJ4PiAiCi0JCSJwcGhhc2U8JXM+IGNwaGFzZTwlcz5dIiwKLQkJU0NwdHItPmRldmljZS0+aWQsIFNDcHRyLT5kZXZpY2UtPmx1biwKLQkJcGhhc2Vfc3RyaW5nKFNDcHRyLT5TQ3Auc2VudF9jb21tYW5kKSwKLQkJcGhhc2Vfc3RyaW5nKFNDcHRyLT5TQ3AucGhhc2UpKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVzcF9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIAotCQkJICAgc3RydWN0IEVTUF9yZWdzICplcmVncykKLXsKLQlTY3NpX0NtbmQgKlNDcHRyID0gZXNwLT5jdXJyZW50X1NDOwotI2lmZGVmIERFQlVHX0VTUF9DTURTCi0JaW50IGk7Ci0jZW5kaWYKLQotCUVTUExPRygoImVzcCVkOiBkdW1waW5nIHN0YXRlXG4iLCBlc3AtPmVzcF9pZCkpOwotCQotCS8qIFByaW50IERNQSBzdGF0dXMgKi8KLQllc3AtPmRtYV9kdW1wX3N0YXRlKGVzcCk7Ci0KLQlFU1BMT0coKCJlc3AlZDogU1cgW3NyZWc8JTAyeD4gc3N0ZXA8JTAyeD4gaXJlZzwlMDJ4Pl1cbiIsCi0JCWVzcC0+ZXNwX2lkLCBlc3AtPnNyZWcsIGVzcC0+c2VxcmVnLCBlc3AtPmlyZWcpKTsKLQlFU1BMT0coKCJlc3AlZDogSFcgcmVyZWFkIFtzcmVnPCUwMng+IHNzdGVwPCUwMng+IGlyZWc8JTAyeD5dXG4iLAotCQllc3AtPmVzcF9pZCwgZXNwX3JlYWQoZXJlZ3MtPmVzcF9zdGF0dXMpLCBlc3BfcmVhZChlcmVncy0+ZXNwX3NzdGVwKSwKLQkJZXNwX3JlYWQoZXJlZ3MtPmVzcF9pbnRycHQpKSk7Ci0jaWZkZWYgREVCVUdfRVNQX0NNRFMKLQlwcmludGsoImVzcCVkOiBsYXN0IEVTUCBjbWRzIFsiLCBlc3AtPmVzcF9pZCk7Ci0JaSA9IChlc3AtPmVzcGNtZGVudCAtIDEpICYgMzE7Ci0JcHJpbnRrKCI8Iik7Ci0JZXNwX3ByaW50X2NtZChlc3AtPmVzcGNtZGxvZ1tpXSk7Ci0JcHJpbnRrKCI+Iik7Ci0JaSA9IChpIC0gMSkgJiAzMTsKLQlwcmludGsoIjwiKTsKLQllc3BfcHJpbnRfY21kKGVzcC0+ZXNwY21kbG9nW2ldKTsKLQlwcmludGsoIj4iKTsKLQlpID0gKGkgLSAxKSAmIDMxOwotCXByaW50aygiPCIpOwotCWVzcF9wcmludF9jbWQoZXNwLT5lc3BjbWRsb2dbaV0pOwotCXByaW50aygiPiIpOwotCWkgPSAoaSAtIDEpICYgMzE7Ci0JcHJpbnRrKCI8Iik7Ci0JZXNwX3ByaW50X2NtZChlc3AtPmVzcGNtZGxvZ1tpXSk7Ci0JcHJpbnRrKCI+Iik7Ci0JcHJpbnRrKCJdXG4iKTsKLSNlbmRpZiAvKiAoREVCVUdfRVNQX0NNRFMpICovCi0KLQlpZihTQ3B0cikgewotCQlFU1BMT0coKCJlc3AlZDogY3VycmVudCBjb21tYW5kICIsIGVzcC0+ZXNwX2lkKSk7Ci0JCWVzcF9kdW1wX2NtZChTQ3B0cik7Ci0JfQotCUVTUExPRygoIlxuIikpOwotCVNDcHRyID0gZXNwLT5kaXNjb25uZWN0ZWRfU0M7Ci0JRVNQTE9HKCgiZXNwJWQ6IGRpc2Nvbm5lY3RlZCAiLCBlc3AtPmVzcF9pZCkpOwotCXdoaWxlKFNDcHRyKSB7Ci0JCWVzcF9kdW1wX2NtZChTQ3B0cik7Ci0JCVNDcHRyID0gKFNjc2lfQ21uZCAqKSBTQ3B0ci0+aG9zdF9zY3JpYmJsZTsKLQl9Ci0JRVNQTE9HKCgiXG4iKSk7Ci19Ci0KLS8qIEFib3J0IGEgY29tbWFuZC4gIFRoZSBob3N0X2xvY2sgaXMgYWNxdWlyZWQgYnkgY2FsbGVyLiAqLwotaW50IGVzcF9hYm9ydChTY3NpX0NtbmQgKlNDcHRyKQotewotCXN0cnVjdCBOQ1JfRVNQICplc3AgPSAoc3RydWN0IE5DUl9FU1AgKikgU0NwdHItPmRldmljZS0+aG9zdC0+aG9zdGRhdGE7Ci0Jc3RydWN0IEVTUF9yZWdzICplcmVncyA9IGVzcC0+ZXJlZ3M7Ci0JaW50IGRvbjsKLQotCUVTUExPRygoImVzcCVkOiBBYm9ydGluZyBjb21tYW5kXG4iLCBlc3AtPmVzcF9pZCkpOwotCWVzcF9kdW1wX3N0YXRlKGVzcCwgZXJlZ3MpOwotCi0JLyogV2hlZWUsIGlmIHRoaXMgaXMgdGhlIGN1cnJlbnQgY29tbWFuZCBvbiB0aGUgYnVzLCB0aGUKLQkgKiBiZXN0IHdlIGNhbiBkbyBpcyBhc3NlcnQgQVROIGFuZCB3YWl0IGZvciBtc2dvdXQgcGhhc2UuCi0JICogVGhpcyBzaG91bGQgZXZlbiBmaXggYSBodW5nIFNDU0kgYnVzIHdoZW4gd2UgbG9zZSBzdGF0ZQotCSAqIGluIHRoZSBkcml2ZXIgYW5kIHRpbWVvdXQgYmVjYXVzZSB0aGUgZXZlbnR1YWwgcGhhc2UgY2hhbmdlCi0JICogd2lsbCBjYXVzZSB0aGUgRVNQIHRvIChldmVudHVhbGx5KSBnaXZlIGFuIGludGVycnVwdC4KLQkgKi8KLQlpZihlc3AtPmN1cnJlbnRfU0MgPT0gU0NwdHIpIHsKLQkJZXNwLT5jdXJfbXNnb3V0WzBdID0gQUJPUlQ7Ci0JCWVzcC0+bXNnb3V0X2xlbiA9IDE7Ci0JCWVzcC0+bXNnb3V0X2N0ciA9IDA7Ci0JCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9TQVROKTsKLQkJcmV0dXJuIFNVQ0NFU1M7Ci0JfQotCi0JLyogSWYgaXQgaXMgc3RpbGwgaW4gdGhlIGlzc3VlIHF1ZXVlIHRoZW4gd2UgY2FuIHNhZmVseQotCSAqIGNhbGwgdGhlIGNvbXBsZXRpb24gcm91dGluZSBhbmQgcmVwb3J0IGFib3J0IHN1Y2Nlc3MuCi0JICovCi0JZG9uID0gZXNwLT5kbWFfcG9ydHNfcChlc3ApOwotCWlmKGRvbikgewotCQllc3AtPmRtYV9pbnRzX29mZihlc3ApOwotCQlzeW5jaHJvbml6ZV9pcnEoZXNwLT5pcnEpOwotCX0KLQlpZihlc3AtPmlzc3VlX1NDKSB7Ci0JCVNjc2lfQ21uZCAqKnByZXYsICp0aGlzOwotCQlmb3IocHJldiA9ICgmZXNwLT5pc3N1ZV9TQyksIHRoaXMgPSBlc3AtPmlzc3VlX1NDOwotCQkgICAgdGhpczsKLQkJICAgIHByZXYgPSAoU2NzaV9DbW5kICoqKSAmKHRoaXMtPmhvc3Rfc2NyaWJibGUpLAotCQkgICAgdGhpcyA9IChTY3NpX0NtbmQgKikgdGhpcy0+aG9zdF9zY3JpYmJsZSkgewotCQkJaWYodGhpcyA9PSBTQ3B0cikgewotCQkJCSpwcmV2ID0gKFNjc2lfQ21uZCAqKSB0aGlzLT5ob3N0X3NjcmliYmxlOwotCQkJCXRoaXMtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOwotCQkJCWVzcF9yZWxlYXNlX2RtYWJ1ZnMoZXNwLCB0aGlzKTsKLQkJCQl0aGlzLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7Ci0JCQkJdGhpcy0+c2NzaV9kb25lKHRoaXMpOwotCQkJCWlmKGRvbikKLQkJCQkJZXNwLT5kbWFfaW50c19vbihlc3ApOwotCQkJCXJldHVybiBTVUNDRVNTOwotCQkJfQotCQl9Ci0JfQotCi0JLyogWXVjaywgdGhlIGNvbW1hbmQgdG8gYWJvcnQgaXMgZGlzY29ubmVjdGVkLCBpdCBpcyBub3QKLQkgKiB3b3J0aCB0cnlpbmcgdG8gYWJvcnQgaXQgbm93IGlmIHNvbWV0aGluZyBlbHNlIGlzIGxpdmUKLQkgKiBvbiB0aGUgYnVzIGF0IHRoaXMgdGltZS4gIFNvLCB3ZSBsZXQgdGhlIFNDU0kgY29kZSB3YWl0Ci0JICogYSBsaXR0bGUgYml0IGFuZCB0cnkgYWdhaW4gbGF0ZXIuCi0JICovCi0JaWYoZXNwLT5jdXJyZW50X1NDKSB7Ci0JCWlmKGRvbikKLQkJCWVzcC0+ZG1hX2ludHNfb24oZXNwKTsKLQkJcmV0dXJuIEZBSUxFRDsKLQl9Ci0KLQkvKiBJdCdzIGRpc2Nvbm5lY3RlZCwgd2UgaGF2ZSB0byByZWNvbm5lY3QgdG8gcmUtZXN0YWJsaXNoCi0JICogdGhlIG5leHVzIGFuZCB0ZWxsIHRoZSBkZXZpY2UgdG8gYWJvcnQuICBIb3dldmVyLCB3ZSByZWFsbHkKLQkgKiBjYW5ub3QgJ3JlY29ubmVjdCcgcGVyIHNlLiAgRG9uJ3QgdHJ5IHRvIGJlIGZhbmN5LCBqdXN0Ci0JICogaW5kaWNhdGUgZmFpbHVyZSwgd2hpY2ggY2F1c2VzIG91ciBjYWxsZXIgdG8gcmVzZXQgdGhlIHdob2xlCi0JICogYnVzLgotCSAqLwotCi0JaWYoZG9uKQotCQllc3AtPmRtYV9pbnRzX29uKGVzcCk7Ci0JcmV0dXJuIEZBSUxFRDsKLX0KLQotLyogV2UndmUgc2VudCBFU1BfQ01EX1JTIHRvIHRoZSBFU1AsIHRoZSBpbnRlcnJ1cHQgaGFkIGp1c3QKLSAqIGFycml2ZWQgaW5kaWNhdGluZyB0aGUgZW5kIG9mIHRoZSBTQ1NJIGJ1cyByZXNldC4gIE91ciBqb2IKLSAqIGlzIHRvIGNsZWFuIG91dCB0aGUgY29tbWFuZCBxdWV1ZXMgYW5kIGJlZ2luIHJlLWV4ZWN1dGlvbgotICogb2YgU0NTSSBjb21tYW5kcyBvbmNlIG1vcmUuCi0gKi8KLXN0YXRpYyBpbnQgZXNwX2ZpbmlzaF9yZXNldChzdHJ1Y3QgTkNSX0VTUCAqZXNwLAotCQkJICAgIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCi17Ci0JU2NzaV9DbW5kICpzcCA9IGVzcC0+Y3VycmVudF9TQzsKLQotCS8qIENsZWFuIHVwIGN1cnJlbnRseSBleGVjdXRpbmcgY29tbWFuZCwgaWYgYW55LiAqLwotCWlmIChzcCAhPSBOVUxMKSB7Ci0JCWVzcF9yZWxlYXNlX2RtYWJ1ZnMoZXNwLCBzcCk7Ci0JCXNwLT5yZXN1bHQgPSAoRElEX1JFU0VUIDw8IDE2KTsKLQkJc3AtPnNjc2lfZG9uZShzcCk7Ci0JCWVzcC0+Y3VycmVudF9TQyA9IE5VTEw7Ci0JfQotCi0JLyogQ2xlYW4gdXAgZGlzY29ubmVjdGVkIHF1ZXVlLCB0aGV5IGhhdmUgYmVlbiBpbnZhbGlkYXRlZAotCSAqIGJ5IHRoZSBidXMgcmVzZXQuCi0JICovCi0JaWYgKGVzcC0+ZGlzY29ubmVjdGVkX1NDKSB7Ci0JCXdoaWxlKChzcCA9IHJlbW92ZV9maXJzdF9TQygmZXNwLT5kaXNjb25uZWN0ZWRfU0MpKSAhPSBOVUxMKSB7Ci0JCQllc3BfcmVsZWFzZV9kbWFidWZzKGVzcCwgc3ApOwotCQkJc3AtPnJlc3VsdCA9IChESURfUkVTRVQgPDwgMTYpOwotCQkJc3AtPnNjc2lfZG9uZShzcCk7Ci0JCX0KLQl9Ci0KLQkvKiBTQ1NJIGJ1cyByZXNldCBpcyBjb21wbGV0ZS4gKi8KLQllc3AtPnJlc2V0dGluZ19idXMgPSAwOwotCXdha2VfdXAoJmVzcC0+cmVzZXRfcXVldWUpOwotCi0JLyogT2ssIG5vdyBpdCBpcyBzYWZlIHRvIGdldCBjb21tYW5kcyBnb2luZyBvbmNlIG1vcmUuICovCi0JaWYoZXNwLT5pc3N1ZV9TQykKLQkJZXNwX2V4ZWNfY21kKGVzcCk7Ci0KLQlyZXR1cm4gZG9faW50cl9lbmQ7Ci19Ci0KLXN0YXRpYyBpbnQgZXNwX2RvX3Jlc2V0YnVzKHN0cnVjdCBOQ1JfRVNQICplc3AsCi0JCQkgICBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQotewotCUVTUExPRygoImVzcCVkOiBSZXNldHRpbmcgc2NzaSBidXNcbiIsIGVzcC0+ZXNwX2lkKSk7Ci0JZXNwLT5yZXNldHRpbmdfYnVzID0gMTsKLQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfUlMpOwotCi0JcmV0dXJuIGRvX2ludHJfZW5kOwotfQotCi0vKiBSZXNldCBFU1AgY2hpcCwgcmVzZXQgaGFuZ2luZyBidXMsIHRoZW4ga2lsbCBhY3RpdmUgYW5kCi0gKiBkaXNjb25uZWN0ZWQgY29tbWFuZHMgZm9yIHRhcmdldHMgd2l0aG91dCBzb2Z0IHJlc2V0LgotICoKLSAqIFRoZSBob3N0X2xvY2sgaXMgYWNxdWlyZWQgYnkgY2FsbGVyLgotICovCi1pbnQgZXNwX3Jlc2V0KFNjc2lfQ21uZCAqU0NwdHIpCi17Ci0Jc3RydWN0IE5DUl9FU1AgKmVzcCA9IChzdHJ1Y3QgTkNSX0VTUCAqKSBTQ3B0ci0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKLQotCXNwaW5fbG9ja19pcnEoZXNwLT5laG9zdC0+aG9zdF9sb2NrKTsKLQkodm9pZCkgZXNwX2RvX3Jlc2V0YnVzKGVzcCwgZXNwLT5lcmVncyk7Ci0Jc3Bpbl91bmxvY2tfaXJxKGVzcC0+ZWhvc3QtPmhvc3RfbG9jayk7Ci0KLQl3YWl0X2V2ZW50KGVzcC0+cmVzZXRfcXVldWUsIChlc3AtPnJlc2V0dGluZ19idXMgPT0gMCkpOwotCi0JcmV0dXJuIFNVQ0NFU1M7Ci19Ci0KLS8qIEludGVybmFsIEVTUCBkb25lIGZ1bmN0aW9uLiAqLwotc3RhdGljIHZvaWQgZXNwX2RvbmUoc3RydWN0IE5DUl9FU1AgKmVzcCwgaW50IGVycm9yKQotewotCVNjc2lfQ21uZCAqZG9uZV9TQzsKLQotCWlmKGVzcC0+Y3VycmVudF9TQykgewotCQlkb25lX1NDID0gZXNwLT5jdXJyZW50X1NDOwotCQllc3AtPmN1cnJlbnRfU0MgPSBOVUxMOwotCQllc3BfcmVsZWFzZV9kbWFidWZzKGVzcCwgZG9uZV9TQyk7Ci0JCWRvbmVfU0MtPnJlc3VsdCA9IGVycm9yOwotCQlkb25lX1NDLT5zY3NpX2RvbmUoZG9uZV9TQyk7Ci0KLQkJLyogQnVzIGlzIGZyZWUsIGlzc3VlIGFueSBjb21tYW5kcyBpbiB0aGUgcXVldWUuICovCi0JCWlmKGVzcC0+aXNzdWVfU0MgJiYgIWVzcC0+Y3VycmVudF9TQykKLQkJCWVzcF9leGVjX2NtZChlc3ApOwotCX0gZWxzZSB7Ci0JCS8qIFBhbmljIGlzIHNhZmUgYXMgY3VycmVudF9TQyBpcyBudWxsIHNvIHdlIG1heSBzdGlsbAotCQkgKiBiZSBhYmxlIHRvIGFjY2VwdCBtb3JlIGNvbW1hbmRzIHRvIHN5bmMgZGlzayBidWZmZXJzLgotCQkgKi8KLQkJRVNQTE9HKCgicGFuaWNpbmdcbiIpKTsKLQkJcGFuaWMoImVzcDogZG9uZSgpIGNhbGxlZCB3aXRoIE5VTEwgZXNwLT5jdXJyZW50X1NDIik7Ci0JfQotfQotCi0vKiBXaGVlZSwgRVNQIGludGVycnVwdCBlbmdpbmUuICovICAKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMuICovCi1zdGF0aWMgaW50IGVzcF9kb19waGFzZV9kZXRlcm1pbmUoc3RydWN0IE5DUl9FU1AgKmVzcCwgCi0JCQkJICBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKTsKLXN0YXRpYyBpbnQgZXNwX2RvX2RhdGFfZmluYWxlKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpOwotc3RhdGljIGludCBlc3Bfc2VsZWN0X2NvbXBsZXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpOwotc3RhdGljIGludCBlc3BfZG9fc3RhdHVzKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpOwotc3RhdGljIGludCBlc3BfZG9fbXNnaW4oc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IEVTUF9yZWdzICplcmVncyk7Ci1zdGF0aWMgaW50IGVzcF9kb19tc2dpbmRvbmUoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IEVTUF9yZWdzICplcmVncyk7Ci1zdGF0aWMgaW50IGVzcF9kb19tc2dvdXQoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IEVTUF9yZWdzICplcmVncyk7Ci1zdGF0aWMgaW50IGVzcF9kb19jbWRiZWdpbihzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKTsKLQotI2RlZmluZSBzcmVnX2RhdGFpbnAoX19zcmVnKSAgKCgoX19zcmVnKSAmIEVTUF9TVEFUX1BNQVNLKSA9PSBFU1BfRElQKQotI2RlZmluZSBzcmVnX2RhdGFvdXRwKF9fc3JlZykgKCgoX19zcmVnKSAmIEVTUF9TVEFUX1BNQVNLKSA9PSBFU1BfRE9QKQotCi0vKiBXZSB0cnkgdG8gYXZvaWQgc29tZSBpbnRlcnJ1cHRzIGJ5IGp1bXBpbmcgYWhlYWQgYW5kIHNlZSBpZiB0aGUgRVNQCi0gKiBoYXMgZ290dGVuIGZhciBlbm91Z2ggeWV0LiAgSGVuY2UgdGhlIGZvbGxvd2luZy4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgc2tpcGFoZWFkMShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzLAotCQkJICAgICBTY3NpX0NtbmQgKnNjcCwgaW50IHByZXZfcGhhc2UsIGludCBuZXdfcGhhc2UpCi17Ci0JaWYoc2NwLT5TQ3Auc2VudF9jb21tYW5kICE9IHByZXZfcGhhc2UpCi0JCXJldHVybiAwOwotCi0JaWYoZXNwLT5kbWFfaXJxX3AoZXNwKSkgewotCQkvKiBZZXMsIHdlIGFyZSBhYmxlIHRvIHNhdmUgYW4gaW50ZXJydXB0LiAqLwotCQllc3AtPnNyZWcgPSAoZXNwX3JlYWQoZXJlZ3MtPmVzcF9zdGF0dXMpICYgfihFU1BfU1RBVF9JTlRSKSk7Ci0JCWVzcC0+aXJlZyA9IGVzcF9yZWFkKGVyZWdzLT5lc3BfaW50cnB0KTsKLQkJaWYoIShlc3AtPmlyZWcgJiBFU1BfSU5UUl9TUikpCi0JCQlyZXR1cm4gMDsKLQkJZWxzZQotCQkJcmV0dXJuIGRvX3Jlc2V0X2NvbXBsZXRlOwotCX0KLQkvKiBIbyBodW0sIHRhcmdldCBpcyB0YWtpbmcgZm9yZXZlci4uLiAqLwotCXNjcC0+U0NwLnNlbnRfY29tbWFuZCA9IG5ld19waGFzZTsgLyogc28gd2UgZG9uJ3QgcmVjdXJzZS4uLiAqLwotCXJldHVybiBkb19pbnRyX2VuZDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgc2tpcGFoZWFkMihzdHJ1Y3QgTkNSX0VTUCAqZXNwLAotCQkJICAgICBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzLAotCQkJICAgICBTY3NpX0NtbmQgKnNjcCwgaW50IHByZXZfcGhhc2UxLCBpbnQgcHJldl9waGFzZTIsCi0JCQkgICAgIGludCBuZXdfcGhhc2UpCi17Ci0JaWYoc2NwLT5TQ3Auc2VudF9jb21tYW5kICE9IHByZXZfcGhhc2UxICYmCi0JICAgc2NwLT5TQ3Auc2VudF9jb21tYW5kICE9IHByZXZfcGhhc2UyKQotCQlyZXR1cm4gMDsKLQlpZihlc3AtPmRtYV9pcnFfcChlc3ApKSB7Ci0JCS8qIFllcywgd2UgYXJlIGFibGUgdG8gc2F2ZSBhbiBpbnRlcnJ1cHQuICovCi0JCWVzcC0+c3JlZyA9IChlc3BfcmVhZChlcmVncy0+ZXNwX3N0YXR1cykgJiB+KEVTUF9TVEFUX0lOVFIpKTsKLQkJZXNwLT5pcmVnID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9pbnRycHQpOwotCQlpZighKGVzcC0+aXJlZyAmIEVTUF9JTlRSX1NSKSkKLQkJCXJldHVybiAwOwotCQllbHNlCi0JCQlyZXR1cm4gZG9fcmVzZXRfY29tcGxldGU7Ci0JfQotCS8qIEhvIGh1bSwgdGFyZ2V0IGlzIHRha2luZyBmb3JldmVyLi4uICovCi0Jc2NwLT5TQ3Auc2VudF9jb21tYW5kID0gbmV3X3BoYXNlOyAvKiBzbyB3ZSBkb24ndCByZWN1cnNlLi4uICovCi0JcmV0dXJuIGRvX2ludHJfZW5kOwotfQotCi0vKiBNaXNjLiBlc3AgaGVscGVyIG1hY3Jvcy4gKi8KLSNkZWZpbmUgZXNwX3NldGNvdW50KF9fZXJlZ3MsIF9fY250KSBcCi0JZXNwX3dyaXRlKChfX2VyZWdzKS0+ZXNwX3RjbG93LCAoKF9fY250KSAmIDB4ZmYpKTsgXAotCWVzcF93cml0ZSgoX19lcmVncyktPmVzcF90Y21lZCwgKCgoX19jbnQpID4+IDgpICYgMHhmZikpCi0KLSNkZWZpbmUgZXNwX2dldGNvdW50KF9fZXJlZ3MpIFwKLQkoKGVzcF9yZWFkKChfX2VyZWdzKS0+ZXNwX3RjbG93KSYweGZmKSB8IFwKLQkgKChlc3BfcmVhZCgoX19lcmVncyktPmVzcF90Y21lZCkmMHhmZikgPDwgOCkpCi0KLSNkZWZpbmUgZmNvdW50KF9fZXNwLCBfX2VyZWdzKSBcCi0JKGVzcF9yZWFkKChfX2VyZWdzKS0+ZXNwX2ZmbGFncykgJiBFU1BfRkZfRkJZVEVTKQotCi0jZGVmaW5lIGZuemVybyhfX2VzcCwgX19lcmVncykgXAotCShlc3BfcmVhZCgoX19lcmVncyktPmVzcF9mZmxhZ3MpICYgRVNQX0ZGX09OT1RaRVJPKQotCi0vKiBYWFggc3BlY3VsYXRpdmUgbm9wcyB1bm5lY2Vzc2FyeSB3aGVuIGNvbnRpbnVpbmcgYW1pZHN0IGEgZGF0YSBwaGFzZQotICogWFhYIGV2ZW4gb24gZXNwMTAwISEhICBhbm90aGVyIGNhc2Ugb2YgZmxvb2RpbmcgdGhlIGJ1cyB3aXRoIEkvTyByZWcKLSAqIFhYWCB3cml0ZXMuLi4KLSAqLwotI2RlZmluZSBlc3BfbWF5YmVfbm9wKF9fZXNwLCBfX2VyZWdzKSBcCi0JaWYoKF9fZXNwKS0+ZXJldiA9PSBlc3AxMDApIFwKLQkJZXNwX2NtZCgoX19lc3ApLCAoX19lcmVncyksIEVTUF9DTURfTlVMTCkKLQotI2RlZmluZSBzcmVnX3RvX2RhdGFwaGFzZShfX3NyZWcpIFwKLQkoKCgoX19zcmVnKSAmIEVTUF9TVEFUX1BNQVNLKSA9PSBFU1BfRE9QKSA/IGluX2RhdGFvdXQgOiBpbl9kYXRhaW4pCi0KLS8qIFRoZSBFU1AxMDAgd2hlbiBpbiBzeW5jaHJvbm91cyBkYXRhIHBoYXNlLCBjYW4gbWlzdGFrZSBhIGxvbmcgZmluYWwKLSAqIFJFUSBwdWxzZSBmcm9tIHRoZSB0YXJnZXQgYXMgYW4gZXh0cmEgYnl0ZSwgaXQgcGxhY2VzIHdoYXRldmVyIGlzIG9uCi0gKiB0aGUgZGF0YSBsaW5lcyBpbnRvIHRoZSBmaWZvLiAgRm9yIG5vdywgd2Ugd2lsbCBhc3N1bWUgd2hlbiB0aGlzCi0gKiBoYXBwZW5zIHRoYXQgdGhlIHRhcmdldCBpcyBhIGJpdCBxdWlya3kgYW5kIHdlIGRvbid0IHdhbnQgdG8KLSAqIGJlIHRhbGtpbmcgc3luY2hyb25vdXNseSB0byBpdCBhbnl3YXlzLiAgUmVnYXJkbGVzcywgd2UgbmVlZCB0bwotICogdGVsbCB0aGUgRVNQIHRvIGVhdCB0aGUgZXh0cmFuZW91cyBieXRlIHNvIHRoYXQgd2UgY2FuIHByb2NlZWQKLSAqIHRvIHRoZSBuZXh0IHBoYXNlLgotICovCi1zdGF0aWMgaW5saW5lIGludCBlc3AxMDBfc3luY19od2J1ZyhzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzLAotCQkJCSAgICBTY3NpX0NtbmQgKnNwLCBpbnQgZmlmb2NudCkKLXsKLQkvKiBEbyBub3QgdG91Y2ggdGhpcyBwaWVjZSBvZiBjb2RlLiAqLwotCWlmKCghKGVzcC0+ZXJldiA9PSBlc3AxMDApKSB8fAotCSAgICghKHNyZWdfZGF0YWlucCgoZXNwLT5zcmVnID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9zdGF0dXMpKSkgJiYgIWZpZm9jbnQpICYmCi0JICAgICEoc3JlZ19kYXRhb3V0cChlc3AtPnNyZWcpICYmICFmbnplcm8oZXNwLCBlcmVncykpKSkgewotCQlpZihzcC0+U0NwLnBoYXNlID09IGluX2RhdGFvdXQpCi0JCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfRkxVU0gpOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQkvKiBBc3luYyBtb2RlIGZvciB0aGlzIGd1eS4gKi8KLQkJYnVpbGRfc3luY19uZWdvX21zZyhlc3AsIDAsIDApOwotCi0JCS8qIEFjayB0aGUgYm9ndXMgYnl0ZSwgYnV0IHNldCBBVE4gZmlyc3QuICovCi0JCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9TQVROKTsKLQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX01PSyk7Ci0JCXJldHVybiAxOwotCX0KLX0KLQotLyogVGhpcyBjbG9zZXMgdGhlIHdpbmRvdyBkdXJpbmcgYSBzZWxlY3Rpb24gd2l0aCBhIHJlc2VsZWN0IHBlbmRpbmcsIGJlY2F1c2UKLSAqIHdlIHVzZSBETUEgZm9yIHRoZSBzZWxlY3Rpb24gcHJvY2VzcyB0aGUgRklGTyBzaG91bGQgaG9sZCB0aGUgY29ycmVjdAotICogY29udGVudHMgaWYgd2UgZ2V0IHJlc2VsZWN0ZWQgZHVyaW5nIHRoaXMgcHJvY2Vzcy4gIFNvIHdlIGp1c3QgbmVlZCB0bwotICogYWNrIHRoZSBwb3NzaWJsZSBpbGxlZ2FsIGNtZCBpbnRlcnJ1cHQgcGVuZGluZyBvbiB0aGUgZXNwMTAwLgotICovCi1zdGF0aWMgaW5saW5lIGludCBlc3AxMDBfcmVjb25uZWN0X2h3YnVnKHN0cnVjdCBOQ1JfRVNQICplc3AsCi0JCQkJCSBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQotewotCXZvbGF0aWxlIHVuY2hhciBqdW5rOwotCi0JaWYoZXNwLT5lcmV2ICE9IGVzcDEwMCkKLQkJcmV0dXJuIDA7Ci0JanVuayA9IGVzcF9yZWFkKGVyZWdzLT5lc3BfaW50cnB0KTsKLQotCWlmKGp1bmsgJiBFU1BfSU5UUl9TUikKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgdmVyaWZpZXMgdGhlIEJVU0lEIGJpdHMgZHVyaW5nIGEgcmVzZWxlY3Rpb24gc28gdGhhdCB3ZSBrbm93IHdoaWNoCi0gKiB0YXJnZXQgaXMgdGFsa2luZyB0byB1cy4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgcmVjb25uZWN0X3RhcmdldChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQotewotCWludCBpdCwgbWUgPSBlc3AtPnNjc2lfaWRfbWFzaywgdGFyZyA9IDA7Ci0KLQlpZigyICE9IGZjb3VudChlc3AsIGVyZWdzKSkKLQkJcmV0dXJuIC0xOwotCWl0ID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9mZGF0YSk7Ci0JaWYoIShpdCAmIG1lKSkKLQkJcmV0dXJuIC0xOwotCWl0ICY9IH5tZTsKLQlpZihpdCAmIChpdCAtIDEpKQotCQlyZXR1cm4gLTE7Ci0Jd2hpbGUoIShpdCAmIDEpKQotCQl0YXJnKyssIGl0ID4+PSAxOwotCXJldHVybiB0YXJnOwotfQotCi0vKiBUaGlzIHZlcmlmaWVzIHRoZSBpZGVudGlmeSBmcm9tIHRoZSB0YXJnZXQgc28gdGhhdCB3ZSBrbm93IHdoaWNoIGx1biBpcwotICogYmVpbmcgcmVjb25uZWN0ZWQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHJlY29ubmVjdF9sdW4oc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IEVTUF9yZWdzICplcmVncykKLXsKLQlpbnQgbHVuOwotCi0JaWYoKGVzcC0+c3JlZyAmIEVTUF9TVEFUX1BNQVNLKSAhPSBFU1BfTUlQKQotCQlyZXR1cm4gLTE7Ci0JbHVuID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9mZGF0YSk7Ci0KLQkvKiBZZXMsIHlvdSByZWFkIHRoaXMgY29ycmVjdGx5LiAgV2UgcmVwb3J0IGx1biBvZiB6ZXJvCi0JICogaWYgd2Ugc2VlIHBhcml0eSBlcnJvci4gIEVTUCByZXBvcnRzIHBhcml0eSBlcnJvciBmb3IKLQkgKiB0aGUgbHVuIGJ5dGUsIGFuZCB0aGlzIGlzIHRoZSBvbmx5IHdheSB0byBob3BlIHRvIHJlY292ZXIKLQkgKiBiZWNhdXNlIHRoZSB0YXJnZXQgaXMgY29ubmVjdGVkLgotCSAqLwotCWlmKGVzcC0+c3JlZyAmIEVTUF9TVEFUX1BFUlIpCi0JCXJldHVybiAwOwotCi0JLyogQ2hlY2sgZm9yIGlsbGVnYWwgYml0cyBiZWluZyBzZXQgaW4gdGhlIGx1bi4gKi8KLQlpZigobHVuICYgMHg0MCkgfHwgIShsdW4gJiAweDgwKSkKLQkJcmV0dXJuIC0xOwotCi0JcmV0dXJuIGx1biAmIDc7Ci19Ci0KLS8qIFRoaXMgcHV0cyB0aGUgZHJpdmVyIGluIGEgc3RhdGUgd2hlcmUgaXQgY2FuIHJldml0YWxpemUgYSBjb21tYW5kIHRoYXQKLSAqIGlzIGJlaW5nIGNvbnRpbnVlZCBkdWUgdG8gcmVzZWxlY3Rpb24uCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBlc3BfY29ubmVjdChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzLAotCQkJICAgICAgIFNjc2lfQ21uZCAqc3ApCi17Ci0Jc3RydWN0IHNjc2lfZGV2aWNlICpkcCA9IHNwLT5kZXZpY2U7Ci0Jc3RydWN0IGVzcF9kZXZpY2UgKmVzcF9kZXYgPSBkcC0+aG9zdGRhdGE7Ci0KLQlpZihlc3AtPnByZXZfc29mZiAgIT0gZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0IHx8Ci0JICAgZXNwLT5wcmV2X3N0cCAgICE9IGVzcF9kZXYtPnN5bmNfbWluX3BlcmlvZCB8fAotCSAgIChlc3AtPmVyZXYgPiBlc3AxMDBhICYmCi0JICAgIGVzcC0+cHJldl9jZmczICE9IGVzcC0+Y29uZmlnM1tzY21kX2lkKHNwKV0pKSB7Ci0JCWVzcC0+cHJldl9zb2ZmID0gZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0OwotCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9zb2ZmLCBlc3AtPnByZXZfc29mZik7Ci0JCWVzcC0+cHJldl9zdHAgPSBlc3BfZGV2LT5zeW5jX21pbl9wZXJpb2Q7Ci0JCWVzcF93cml0ZShlcmVncy0+ZXNwX3N0cCwgZXNwLT5wcmV2X3N0cCk7Ci0JCWlmKGVzcC0+ZXJldiA+IGVzcDEwMGEpIHsKLQkJCWVzcC0+cHJldl9jZmczID0gZXNwLT5jb25maWczW3NjbWRfaWQoc3ApXTsKLQkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmZzMsIGVzcC0+cHJldl9jZmczKTsKLQkJfSAKLQl9Ci0JZXNwLT5jdXJyZW50X1NDID0gc3A7Ci19Ci0KLS8qIFRoaXMgd2lsbCBwbGFjZSB0aGUgY3VycmVudCB3b3JraW5nIGNvbW1hbmQgYmFjayBpbnRvIHRoZSBpc3N1ZSBxdWV1ZQotICogaWYgd2UgYXJlIHRvIHJlY2VpdmUgYSByZXNlbGVjdGlvbiBhbWlkc3QgYSBzZWxlY3Rpb24gYXR0ZW1wdC4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGVzcF9yZWNvbm5lY3Qoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCkKLXsKLQlpZighZXNwLT5kaXNjb25uZWN0ZWRfU0MpCi0JCUVTUExPRygoImVzcCVkOiBXZWlyZCwgYmVpbmcgcmVzZWxlY3RlZCBidXQgZGlzY29ubmVjdGVkICIKLQkJCSJjb21tYW5kIHF1ZXVlIGlzIGVtcHR5LlxuIiwgZXNwLT5lc3BfaWQpKTsKLQllc3AtPnNuaXAgPSAwOwotCWVzcC0+Y3VycmVudF9TQyA9IE5VTEw7Ci0Jc3AtPlNDcC5waGFzZSA9IG5vdF9pc3N1ZWQ7Ci0JYXBwZW5kX1NDKCZlc3AtPmlzc3VlX1NDLCBzcCk7Ci19Ci0KLS8qIEJlZ2luIG1lc3NhZ2UgaW4gcGhhc2UuICovCi1zdGF0aWMgaW50IGVzcF9kb19tc2dpbihzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQotewotCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9GTFVTSCk7Ci0JZXNwX21heWJlX25vcChlc3AsIGVyZWdzKTsKLQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfVEkpOwotCWVzcC0+bXNnaW5fbGVuID0gMTsKLQllc3AtPm1zZ2luX2N0ciA9IDA7Ci0JZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl9tc2dpbmRvbmUpOwotCXJldHVybiBkb193b3JrX2J1czsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGFkdmFuY2Vfc2coc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCkKLXsKLQkrK3NwLT5TQ3AuYnVmZmVyOwotCS0tc3AtPlNDcC5idWZmZXJzX3Jlc2lkdWFsOwotCXNwLT5TQ3AudGhpc19yZXNpZHVhbCA9IHNwLT5TQ3AuYnVmZmVyLT5sZW5ndGg7Ci0JaWYgKGVzcC0+ZG1hX2FkdmFuY2Vfc2cpCi0JCWVzcC0+ZG1hX2FkdmFuY2Vfc2cgKHNwKTsKLQllbHNlCi0JCXNwLT5TQ3AucHRyID0gKGNoYXIgKikgdmlydF90b19waHlzKHNnX3ZpcnQoc3AtPlNDcC5idWZmZXIpKTsKLQotfQotCi0vKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSB3YXkgSSd2ZSBjb2RlZCB0aGVzZSByb3V0aW5lcyBpcyB0aGF0IEkgX2Fsd2F5c18KLSAqIGNoZWNrIGZvciBhIGRpc2Nvbm5lY3QgZHVyaW5nIGFueSBhbmQgYWxsIGluZm9ybWF0aW9uIHRyYW5zZmVyCi0gKiBwaGFzZXMuICBUaGUgU0NTSSBzdGFuZGFyZCBzdGF0ZXMgdGhhdCB0aGUgdGFyZ2V0IF9jYW5fIGNhdXNlIGEgQlVTCi0gKiBGUkVFIGNvbmRpdGlvbiBieSBkcm9wcGluZyBhbGwgTVNHL0NEL0lPL0JTWSBzaWduYWxzLiAgQWxzbyBub3RlCi0gKiB0aGF0IGR1cmluZyBpbmZvcm1hdGlvbiB0cmFuc2ZlciBwaGFzZXMgdGhlIHRhcmdldCBjb250cm9scyBldmVyeQotICogY2hhbmdlIGluIHBoYXNlLCB0aGUgb25seSB0aGluZyB0aGUgaW5pdGlhdG9yIGNhbiBkbyBpcyAiYXNrIiBmb3IKLSAqIGEgbWVzc2FnZSBvdXQgcGhhc2UgYnkgZHJpdmluZyBBVE4gdHJ1ZS4gIFRoZSB0YXJnZXQgY2FuLCBhbmQgc29tZXRpbWVzCi0gKiB3aWxsLCBjb21wbGV0ZWx5IGlnbm9yZSB0aGlzIHJlcXVlc3Qgc28gd2UgY2Fubm90IGFzc3VtZSBhbnl0aGluZyB3aGVuCi0gKiB3ZSB0cnkgdG8gZm9yY2UgYSBtZXNzYWdlIG91dCBwaGFzZSB0byBhYm9ydC9yZXNldCBhIHRhcmdldC4gIE1vc3Qgb2YKLSAqIHRoZSB0aW1lIHRoZSB0YXJnZXQgd2lsbCBldmVudHVhbGx5IGJlIG5pY2UgYW5kIGdvIHRvIG1lc3NhZ2Ugb3V0LCBzbwotICogd2UgbWF5IGhhdmUgdG8gaG9sZCBvbiB0byBvdXIgc3RhdGUgYWJvdXQgd2hhdCB3ZSB3YW50IHRvIHRlbGwgdGhlIHRhcmdldAotICogZm9yIHNvbWUgcGVyaW9kIG9mIHRpbWUuCi0gKi8KLQotLyogSSB0aGluayBJIGhhdmUgdGhpbmdzIHdvcmtpbmcgaGVyZSBjb3JyZWN0bHkuICBFdmVuIHBhcnRpYWwgdHJhbnNmZXJzCi0gKiB3aXRoaW4gYSBidWZmZXIgb3Igc3ViLWJ1ZmZlciBzaG91bGQgbm90IHVwc2V0IHVzIGF0IGFsbCBubyBtYXR0ZXIKLSAqIGhvdyBiYWQgdGhlIHRhcmdldCBhbmQvb3IgRVNQIGZ1Y2tzIHRoaW5ncyB1cC4KLSAqLwotc3RhdGljIGludCBlc3BfZG9fZGF0YShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQotewotCVNjc2lfQ21uZCAqU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0M7Ci0JaW50IHRoaXNwaGFzZSwgaG11Y2g7Ci0KLQlFU1BEQVRBKCgiZXNwX2RvX2RhdGE6ICIpKTsKLQllc3BfbWF5YmVfbm9wKGVzcCwgZXJlZ3MpOwotCXRoaXNwaGFzZSA9IHNyZWdfdG9fZGF0YXBoYXNlKGVzcC0+c3JlZyk7Ci0JZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIHRoaXNwaGFzZSk7Ci0JRVNQREFUQSgoIm5ld3BoYXNlPCVzPiAiLCAodGhpc3BoYXNlID09IGluX2RhdGFpbikgPyAiREFUQUlOIiA6ICJEQVRBT1VUIikpOwotCWhtdWNoID0gZXNwLT5kbWFfY2FuX3RyYW5zZmVyKGVzcCwgU0NwdHIpOwotCi0JLyoKLQkgKiBYWFggTVNjaDogY2F0ZXIgZm9yIFBJTyB0cmFuc2ZlciBoZXJlOyBQSU8gdXNlZCBpZiBobXVjaCA9PSAwCi0JICovCi0JaWYgKGhtdWNoKSB7CS8qIERNQSAqLwotCQkvKgotCQkgKiBETUEKLQkJICovCi0JCUVTUERBVEEoKCJobXVjaDwlZD4gIiwgaG11Y2gpKTsKLQkJZXNwLT5jdXJyZW50X3RyYW5zZmVyX3NpemUgPSBobXVjaDsKLQkJZXNwX3NldGNvdW50KGVyZWdzLCAoZXNwLT5mYXNfcHJlbWF0dXJlX2ludHJfd29ya2Fyb3VuZCA/Ci0JCQkJICAgICAoaG11Y2ggKyAweDQwKSA6IGhtdWNoKSk7Ci0JCWVzcC0+ZG1hX3NldHVwKGVzcCwgKF9fdTMyKSgodW5zaWduZWQgbG9uZylTQ3B0ci0+U0NwLnB0ciksIAotCQkJICAgICAgIGhtdWNoLCAodGhpc3BoYXNlID09IGluX2RhdGFpbikpOwotCQlFU1BEQVRBKCgiRE1BfFRJIC0tPiBkb19pbnRyX2VuZFxuIikpOwotCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfRE1BIHwgRVNQX0NNRF9USSk7Ci0JCXJldHVybiBkb19pbnRyX2VuZDsKLQkJLyoKLQkJICogZW5kIERNQQotCQkgKi8KLQl9IGVsc2UgewotCQkvKgotCQkgKiBQSU8KLQkJICovCi0JCWludCBvbGRwaGFzZSwgaSA9IDA7IC8qIG9yIHdoZXJlIHdlIGxlZnQgb2ZmIGxhc3QgdGltZSA/PyBlc3AtPmN1cnJlbnRfZGF0YSA/PyAqLwotCQlpbnQgZmlmb2NudCA9IDA7Ci0JCXVuc2lnbmVkIGNoYXIgKnAgPSBwaHlzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpU0NwdHItPlNDcC5wdHIpOwotCi0JCW9sZHBoYXNlID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9zdGF0dXMpICYgRVNQX1NUQVRfUE1BU0s7Ci0KLQkJLyoKLQkJICogcG9sbGVkIHRyYW5zZmVyOyB1Z2x5LCBjYW4gd2UgbWFrZSB0aGlzIGhhcHBlbiBpbiBhIERSUSAKLQkJICogaW50ZXJydXB0IGhhbmRsZXIgPz8KLQkJICogcmVxdWlyZXMga2VlcGluZyB0cmFjayBvZiBzdGF0ZSBpbmZvcm1hdGlvbiBpbiBob3N0IG9yIAotCQkgKiBjb21tYW5kIHN0cnVjdCEKLQkJICogUHJvYmxlbTogSSd2ZSBuZXZlciBzZWVuIGEgRFJRIGhhcHBlbiBvbiBNYWMsIG5vdCBldmVuCi0JCSAqIHdpdGggRVNQX0NNRF9ETUEgLi4uCi0JCSAqLwotCi0JCS8qIGZpZ3VyZSBvdXQgaG93IG11Y2ggbmVlZHMgdG8gYmUgdHJhbnNmZXJyZWQgKi8KLQkJaG11Y2ggPSBTQ3B0ci0+U0NwLnRoaXNfcmVzaWR1YWw7Ci0JCUVTUERBVEEoKCJobXVjaDwlZD4gcGlvICIsIGhtdWNoKSk7Ci0JCWVzcC0+Y3VycmVudF90cmFuc2Zlcl9zaXplID0gaG11Y2g7Ci0KLQkJLyogdGVsbCB0aGUgRVNQIC4uLiAqLwotCQllc3Bfc2V0Y291bnQoZXJlZ3MsIGhtdWNoKTsKLQotCQkvKiBsb29wICovCi0JCXdoaWxlIChobXVjaCkgewotCQkJaW50IGosIGZpZm9fc3R1Y2sgPSAwLCBuZXdwaGFzZTsKLQkJCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKLSNpZiAwCi0JCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotI2VuZGlmCi0jaWYgMAotCQkJaWYgKCBpICUgMTAgKQotCQkJCUVTUERBVEEoKCJcciIpKTsKLQkJCWVsc2UKLQkJCQlFU1BEQVRBKCggLyoiXG4iKi8gIlxyIikpOwotI2VuZGlmCi0jaWYgMAotCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotI2VuZGlmCi0JCQlpZih0aGlzcGhhc2UgPT0gaW5fZGF0YWluKSB7Ci0JCQkJLyogJ2dvJyAuLi4gKi8gCi0JCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX1RJKTsKLQotCQkJCS8qIHdhaXQgZm9yIGRhdGEgKi8KLQkJCQl0aW1lb3V0ID0gMTAwMDAwMDsKLQkJCQl3aGlsZSAoISgoZXNwLT5zcmVnPWVzcF9yZWFkKGVyZWdzLT5lc3Bfc3RhdHVzKSkgJiBFU1BfU1RBVF9JTlRSKSAmJiAtLXRpbWVvdXQpCi0JCQkJCXVkZWxheSgyKTsKLQkJCQlpZiAodGltZW91dCA9PSAwKQotCQkJCQlwcmludGsoIkRSUSBkYXRhaW4gdGltZW91dCEgXG4iKTsKLQotCQkJCW5ld3BoYXNlID0gZXNwLT5zcmVnICYgRVNQX1NUQVRfUE1BU0s7Ci0KLQkJCQkvKiBzZWUgaG93IG11Y2ggd2UgZ290IC4uLiAqLwotCQkJCWZpZm9jbnQgPSAoZXNwX3JlYWQoZXJlZ3MtPmVzcF9mZmxhZ3MpICYgRVNQX0ZGX0ZCWVRFUyk7Ci0KLQkJCQlpZiAoIWZpZm9jbnQpCi0JCQkJCWZpZm9fc3R1Y2srKzsKLQkJCQllbHNlCi0JCQkJCWZpZm9fc3R1Y2sgPSAwOwotCi0JCQkJRVNQREFUQSgoIlxyZ290ICVkIHN0ICV4IHBoICV4IiwgZmlmb2NudCwgZXNwLT5zcmVnLCBuZXdwaGFzZSkpOwotCi0JCQkJLyogcmVhZCBmaWZvICovCi0JCQkJZm9yKGo9MDtqPGZpZm9jbnQ7aisrKQotCQkJCQlwW2krK10gPSBlc3BfcmVhZChlcmVncy0+ZXNwX2ZkYXRhKTsKLQotCQkJCUVTUERBVEEoKCIoJWQpICIsIGkpKTsKLQotCQkJCS8qIGhvdyBtYW55IHRvIGdvID8/ICovCi0JCQkJaG11Y2ggLT0gZmlmb2NudDsKLQotCQkJCS8qIGJyZWFrIGlmIHN0YXR1cyBwaGFzZSAhISAqLwotCQkJCWlmKG5ld3BoYXNlID09IEVTUF9TVEFUUCkgewotCQkJCQkvKiBjbGVhciBpbnQuICovCi0JCQkJCWVzcC0+aXJlZyA9IGVzcF9yZWFkKGVyZWdzLT5lc3BfaW50cnB0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLSNkZWZpbmUgTUFYX0ZJRk8gOAotCQkJCS8qIGhvdyBtdWNoIHdpbGwgZml0ID8gKi8KLQkJCQlpbnQgdGhpc19jb3VudCA9IE1BWF9GSUZPIC0gZmlmb2NudDsKLQkJCQlpZiAodGhpc19jb3VudCA+IGhtdWNoKQotCQkJCQl0aGlzX2NvdW50ID0gaG11Y2g7Ci0KLQkJCQkvKiBmaWxsIGZpZm8gKi8KLQkJCQlmb3Ioaj0wO2o8dGhpc19jb3VudDtqKyspCi0JCQkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2ZkYXRhLCBwW2krK10pOwotCi0JCQkJLyogaG93IG1hbnkgbGVmdCBpZiB0aGlzIGdvZXMgb3V0ID8/ICovCi0JCQkJaG11Y2ggLT0gdGhpc19jb3VudDsKLQotCQkJCS8qICdnbycgLi4uICovIAotCQkJCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9USSk7Ci0KLQkJCQkvKiB3YWl0IGZvciAnZ290IGl0JyAqLwotCQkJCXRpbWVvdXQgPSAxMDAwMDAwOwotCQkJCXdoaWxlICghKChlc3AtPnNyZWc9ZXNwX3JlYWQoZXJlZ3MtPmVzcF9zdGF0dXMpKSAmIEVTUF9TVEFUX0lOVFIpICYmIC0tdGltZW91dCkKLQkJCQkJdWRlbGF5KDIpOwotCQkJCWlmICh0aW1lb3V0ID09IDApCi0JCQkJCXByaW50aygiRFJRIGRhdGFvdXQgdGltZW91dCEgIFxuIik7Ci0KLQkJCQluZXdwaGFzZSA9IGVzcC0+c3JlZyAmIEVTUF9TVEFUX1BNQVNLOwotCi0JCQkJLyogbmVlZCB0byBjaGVjayBob3cgbXVjaCB3YXMgc2VudCA/PyAqLwotCQkJCWZpZm9jbnQgPSAoZXNwX3JlYWQoZXJlZ3MtPmVzcF9mZmxhZ3MpICYgRVNQX0ZGX0ZCWVRFUyk7Ci0KLQkJCQlFU1BEQVRBKCgiXHJzZW50ICVkIHN0ICV4IHBoICV4IiwgdGhpc19jb3VudCAtIGZpZm9jbnQsIGVzcC0+c3JlZywgbmV3cGhhc2UpKTsKLQotCQkJCUVTUERBVEEoKCIoJWQpICIsIGkpKTsKLQotCQkJCS8qIGJyZWFrIGlmIHN0YXR1cyBwaGFzZSAhISAqLwotCQkJCWlmKG5ld3BoYXNlID09IEVTUF9TVEFUUCkgewotCQkJCQkvKiBjbGVhciBpbnQuICovCi0JCQkJCWVzcC0+aXJlZyA9IGVzcF9yZWFkKGVyZWdzLT5lc3BfaW50cnB0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQl9Ci0KLQkJCS8qIGNsZWFyIGludC4gKi8KLQkJCWVzcC0+aXJlZyA9IGVzcF9yZWFkKGVyZWdzLT5lc3BfaW50cnB0KTsKLQotCQkJRVNQREFUQSgoImlyICV4IC4uLiAiLCBlc3AtPmlyZWcpKTsKLQotCQkJaWYgKGhtdWNoID09IDApCi0JCQkJRVNQREFUQSgoImRvbmUhIFxuIikpOwotCi0jaWYgMAotCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotI2VuZGlmCi0KLQkJCS8qIGNoZWNrIG5ldyBidXMgcGhhc2UgKi8KLQkJCWlmIChuZXdwaGFzZSAhPSBvbGRwaGFzZSAmJiBpIDwgZXNwLT5jdXJyZW50X3RyYW5zZmVyX3NpemUpIHsKLQkJCQkvKiBzb21ldGhpbmcgaGFwcGVuZWQ7IGRpc2Nvbm5lY3QgPz8gKi8KLQkJCQlFU1BEQVRBKCgicGhhc2UgY2hhbmdlLCBkcm9wcGVkIG91dCB3aXRoICVkIGRvbmUgLi4uICIsIGkpKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogY2hlY2sgaW50LiBzdGF0dXMgKi8KLQkJCWlmIChlc3AtPmlyZWcgJiBFU1BfSU5UUl9EQykgewotCQkJCS8qIGRpc2Nvbm5lY3QgKi8KLQkJCQlFU1BEQVRBKCgiZGlzY29ubmVjdDsgJWQgdHJhbnNmZXJyZWQgLi4uICIsIGkpKTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAoZXNwLT5pcmVnICYgRVNQX0lOVFJfRkRPTkUpIHsKLQkJCQkvKiBmdW5jdGlvbiBkb25lICovCi0JCQkJRVNQREFUQSgoImZ1bmN0aW9uIGRvbmU7ICVkIHRyYW5zZmVycmVkIC4uLiAiLCBpKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qIFhYWCBmaXhtZTogYmFpbCBvdXQgb24gc3RhbGwgKi8KLQkJCWlmIChmaWZvX3N0dWNrID4gMTApIHsKLQkJCQkvKiB3ZSdyZSBzdHVjayAqLwotCQkJCUVTUERBVEEoKCJmaWZvIHN0YWxsOyAlZCB0cmFuc2ZlcnJlZCAuLi4gIiwgaSkpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJRVNQREFUQSgoIlxuIikpOwotCQkvKiBjaGVjayBzdWNjZXNzZnVsIGNvbXBsZXRpb24gPz8gKi8KLQotCQlpZiAodGhpc3BoYXNlID09IGluX2RhdGFvdXQpCi0JCQlobXVjaCArPSBmaWZvY250OyAvKiBzdHVjaz8/IGFkanVzdCBkYXRhIHBvaW50ZXIgLi4uKi8KLQotCQkvKiB0ZWxsIGRvX2RhdGFfZmluYWxlIGhvdyBtdWNoIHdhcyB0cmFuc2ZlcnJlZCAqLwotCQllc3AtPmN1cnJlbnRfdHJhbnNmZXJfc2l6ZSAtPSBobXVjaDsKLQotCQkvKiBzdGlsbCBub3QgY29tcGxldGVseSBzdXJlIG9uIHRoaXMgb25lIC4uLiAqLwkJCi0JCXJldHVybiAvKmRvX2ludHJfZW5kKi8gZG9fd29ya19idXMgLypkb19waGFzZV9kZXRlcm1pbmUqLyA7Ci0KLQkJLyoKLQkJICogZW5kIFBJTwotCQkgKi8KLQl9Ci0JcmV0dXJuIGRvX2ludHJfZW5kOwotfQotCi0vKiBTZWUgaG93IHN1Y2Nlc3NmdWwgdGhlIGRhdGEgdHJhbnNmZXIgd2FzLiAqLwotc3RhdGljIGludCBlc3BfZG9fZGF0YV9maW5hbGUoc3RydWN0IE5DUl9FU1AgKmVzcCwKLQkJCSAgICAgIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCi17Ci0JU2NzaV9DbW5kICpTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQzsKLQlzdHJ1Y3QgZXNwX2RldmljZSAqZXNwX2RldiA9IFNDcHRyLT5kZXZpY2UtPmhvc3RkYXRhOwotCWludCBib2d1c19kYXRhID0gMCwgYnl0ZXNfc2VudCA9IDAsIGZpZm9jbnQsIGVjb3VudCA9IDA7Ci0KLQlpZihlc3AtPmRtYV9sZWRfb2ZmKQotCQllc3AtPmRtYV9sZWRfb2ZmKGVzcCk7Ci0KLQlFU1BEQVRBKCgiZXNwX2RvX2RhdGFfZmluYWxlOiAiKSk7Ci0KLQlpZihTQ3B0ci0+U0NwLnBoYXNlID09IGluX2RhdGFpbikgewotCQlpZihlc3AtPnNyZWcgJiBFU1BfU1RBVF9QRVJSKSB7Ci0JCQkvKiBZdWNrLCBwYXJpdHkgZXJyb3IuICBUaGUgRVNQIGFzc2VydHMgQVROCi0JCQkgKiBzbyB0aGF0IHdlIGNhbiBnbyB0byBtZXNzYWdlIG91dCBwaGFzZQotCQkJICogaW1tZWRpYXRlbHkgYW5kIGluZm9ybSB0aGUgdGFyZ2V0IHRoYXQKLQkJCSAqIHNvbWV0aGluZyBiYWQgaGFwcGVuZWQuCi0JCQkgKi8KLQkJCUVTUExPRygoImVzcCVkOiBkYXRhIGJhZCBwYXJpdHkgZGV0ZWN0ZWQuXG4iLAotCQkJCWVzcC0+ZXNwX2lkKSk7Ci0JCQllc3AtPmN1cl9tc2dvdXRbMF0gPSBJTklUSUFUT1JfRVJST1I7Ci0JCQllc3AtPm1zZ291dF9sZW4gPSAxOwotCQl9Ci0JCWlmKGVzcC0+ZG1hX2RyYWluKQotCQkJZXNwLT5kbWFfZHJhaW4oZXNwKTsKLQl9Ci0JaWYoZXNwLT5kbWFfaW52YWxpZGF0ZSkKLQkJZXNwLT5kbWFfaW52YWxpZGF0ZShlc3ApOwotCi0JLyogVGhpcyBjb3VsZCBoYXBwZW4gZm9yIHRoZSBhYm92ZSBwYXJpdHkgZXJyb3IgY2FzZS4gKi8KLQlpZighKGVzcC0+aXJlZyA9PSBFU1BfSU5UUl9CU0VSVikpIHsKLQkJLyogUGxlYXNlIGdvIHRvIG1zZ291dCBwaGFzZSwgcGxlYXNlIHBsZWFzZSBwbGVhc2UuLi4gKi8KLQkJRVNQTE9HKCgiZXNwJWQ6ICFCU0VSViBhZnRlciBkYXRhLCBwcm9iYWJseSB0byBtc2dvdXRcbiIsCi0JCQllc3AtPmVzcF9pZCkpOwotCQlyZXR1cm4gZXNwX2RvX3BoYXNlX2RldGVybWluZShlc3AsIGVyZWdzKTsKLQl9CQotCi0JLyogQ2hlY2sgZm9yIHBhcnRpYWwgdHJhbnNmZXJzIGFuZCBvdGhlciBob3JyaWJsZSBldmVudHMuICovCi0JZmlmb2NudCA9IChlc3BfcmVhZChlcmVncy0+ZXNwX2ZmbGFncykgJiBFU1BfRkZfRkJZVEVTKTsKLQllY291bnQgPSBlc3BfZ2V0Y291bnQoZXJlZ3MpOwotCWlmKGVzcC0+ZmFzX3ByZW1hdHVyZV9pbnRyX3dvcmthcm91bmQpCi0JCWVjb3VudCAtPSAweDQwOwotCWJ5dGVzX3NlbnQgPSBlc3AtPmN1cnJlbnRfdHJhbnNmZXJfc2l6ZTsKLQotCUVTUERBVEEoKCJ0cmFuc19zej0lZCwgIiwgYnl0ZXNfc2VudCkpOwotCWlmKCEoZXNwLT5zcmVnICYgRVNQX1NUQVRfVENOVCkpCi0JCWJ5dGVzX3NlbnQgLT0gZWNvdW50OwotCWlmKFNDcHRyLT5TQ3AucGhhc2UgPT0gaW5fZGF0YW91dCkKLQkJYnl0ZXNfc2VudCAtPSBmaWZvY250OwotCi0JRVNQREFUQSgoImJ5dGVzX3NlbnQ9JWQgKGVjb3VudD0lZCwgZmlmb2NudD0lZCksICIsIGJ5dGVzX3NlbnQsCi0JCSBlY291bnQsIGZpZm9jbnQpKTsKLQotCS8qIElmIHdlIHdlcmUgaW4gc3luY2hyb25vdXMgbW9kZSwgY2hlY2sgZm9yIHBlY3VsaWFyaXRpZXMuICovCi0JaWYoZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0KQotCQlib2d1c19kYXRhID0gZXNwMTAwX3N5bmNfaHdidWcoZXNwLCBlcmVncywgU0NwdHIsIGZpZm9jbnQpOwotCWVsc2UKLQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX0ZMVVNIKTsKLQotCS8qIFVudGlsIHdlIGFyZSBzdXJlIG9mIHdoYXQgaGFzIGhhcHBlbmVkLCB3ZSBhcmUgY2VydGFpbmx5Ci0JICogaW4gdGhlIGRhcmsuCi0JICovCi0JZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX3RoZV9kYXJrKTsKLQotCS8qIENoZWNrIGZvciBwcmVtYXR1cmUgaW50ZXJydXB0IGNvbmRpdGlvbi4gQ2FuIGhhcHBlbiBvbiBGQVMyeDYKLQkgKiBjaGlwcy4gUUxvZ2ljIHJlY29tbWVuZHMgYSB3b3JrYXJvdW5kIGJ5IG92ZXJwcm9ncmFtbWluZyB0aGUKLQkgKiB0cmFuc2ZlciBjb3VudGVycywgYnV0IHRoaXMgbWFrZXMgZG9pbmcgc2NhdHRlci1nYXRoZXIgaW1wb3NzaWJsZS4KLQkgKiBVbnRpbCB0aGVyZSBpcyBhIHdheSB0byBkaXNhYmxlIHNjYXR0ZXItZ2F0aGVyIGZvciBhIHNpbmdsZSB0YXJnZXQsCi0JICogYW5kIG5vdCBvbmx5IGZvciB0aGUgZW50aXJlIGhvc3QgYWRhcHRlciBhcyBpdCBpcyBub3csIHRoZSB3b3JrYXJvdW5kCi0JICogaXMgd2F5IHRvIGV4cGVuc2l2ZSBwZXJmb3JtYW5jZSB3aXNlLgotCSAqIEluc3RlYWQsIGl0IHR1cm5zIG91dCB0aGF0IHdoZW4gdGhpcyBoYXBwZW5zIHRoZSB0YXJnZXQgaGFzIGRpc2Nvbm5lY3RlZAotCSAqIGFscmVhZHkgYnV0IGl0IGRvZXNuJ3Qgc2hvdyBpbiB0aGUgaW50ZXJydXB0IHJlZ2lzdGVyLiBDb21wZW5zYXRlIGZvcgotCSAqIHRoYXQgaGVyZSB0byB0cnkgYW5kIGF2b2lkIGEgU0NTSSBidXMgcmVzZXQuCi0JICovCi0JaWYoIWVzcC0+ZmFzX3ByZW1hdHVyZV9pbnRyX3dvcmthcm91bmQgJiYgKGZpZm9jbnQgPT0gMSkgJiYKLQkgICBzcmVnX2RhdGFvdXRwKGVzcC0+c3JlZykpIHsKLQkJRVNQTE9HKCgiZXNwJWQ6IFByZW1hdHVyZSBpbnRlcnJ1cHQsIGVuYWJsaW5nIHdvcmthcm91bmRcbiIsCi0JCQllc3AtPmVzcF9pZCkpOwotI2lmIDAKLQkJLyogRGlzYWJsZSBzY2F0dGVyLWdhdGhlciBvcGVyYXRpb25zLCB0aGV5IGFyZSBub3QgcG9zc2libGUKLQkJICogd2hlbiB1c2luZyB0aGlzIHdvcmthcm91bmQuCi0JCSAqLwotCQllc3AtPmVob3N0LT5zZ190YWJsZXNpemUgPSAwOwotCQllc3AtPmVob3N0LT51c2VfY2x1c3RlcmluZyA9IEVOQUJMRV9DTFVTVEVSSU5HOwotCQllc3AtPmZhc19wcmVtYXR1cmVfaW50cl93b3JrYXJvdW5kID0gMTsKLQkJYnl0ZXNfc2VudCA9IDA7Ci0JCWlmKFNDcHRyLT51c2Vfc2cpIHsKLQkJCUVTUExPRygoImVzcCVkOiBBYm9ydGluZyBzY2F0dGVyLWdhdGhlciBvcGVyYXRpb25cbiIsCi0JCQkJZXNwLT5lc3BfaWQpKTsKLQkJCWVzcC0+Y3VyX21zZ291dFswXSA9IEFCT1JUOwotCQkJZXNwLT5tc2dvdXRfbGVuID0gMTsKLQkJCWVzcC0+bXNnb3V0X2N0ciA9IDA7Ci0JCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfU0FUTik7Ci0JCQllc3Bfc2V0Y291bnQoZXJlZ3MsIDB4ZmZmZik7Ci0JCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfTlVMTCk7Ci0JCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfVFBBRCB8IEVTUF9DTURfRE1BKTsKLQkJCXJldHVybiBkb19pbnRyX2VuZDsKLQkJfQotI2Vsc2UKLQkJLyogSnVzdCBzZXQgdGhlIGRpc2Nvbm5lY3RlZCBiaXQuIFRoYXQncyB3aGF0IGFwcGVhcnMgdG8KLQkJICogaGFwcGVuIGFueXdheS4gVGhlIHN0YXRlIG1hY2hpbmUgd2lsbCBwaWNrIGl0IHVwIHdoZW4KLQkJICogd2UgcmV0dXJuLgotCQkgKi8KLQkJZXNwLT5pcmVnIHw9IEVTUF9JTlRSX0RDOwotI2VuZGlmCi0gICAgICAgIH0KLQotCWlmKGJ5dGVzX3NlbnQgPCAwKSB7Ci0JCS8qIEkndmUgc2VlbiB0aGlzIGhhcHBlbiBkdWUgdG8gbG9zdCBzdGF0ZSBpbiB0aGlzCi0JCSAqIGRyaXZlci4gIE5vIGlkZWEgd2h5IGl0IGhhcHBlbmVkLCBidXQgYWxsb3dpbmcKLQkJICogdGhpcyB2YWx1ZSB0byBiZSBuZWdhdGl2ZSBjYXVzZWQgdGhpbmdzIHRvCi0JCSAqIGxvY2sgdXAuICBUaGlzIGFsbG93cyBncmVhdGVyIGNoYW5jZSBvZiByZWNvdmVyeS4KLQkJICogSW4gZmFjdCBldmVyeSB0aW1lIEkndmUgc2VlbiB0aGlzLCBpdCBoYXMgYmVlbgotCQkgKiBhIGRyaXZlciBidWcgd2l0aG91dCBxdWVzdGlvbi4KLQkJICovCi0JCUVTUExPRygoImVzcCVkOiB5aWVlZSwgYnl0ZXNfc2VudCA8IDAhXG4iLCBlc3AtPmVzcF9pZCkpOwotCQlFU1BMT0coKCJlc3AlZDogY3N6PSVkIGZpZm9jb3VudD0lZCBlY291bnQ9JWRcbiIsCi0JCQllc3AtPmVzcF9pZCwKLQkJCWVzcC0+Y3VycmVudF90cmFuc2Zlcl9zaXplLCBmaWZvY250LCBlY291bnQpKTsKLQkJRVNQTE9HKCgiZXNwJWQ6IHVzZV9zZz0lZCBwdHI9JXAgdGhpc19yZXNpZHVhbD0lZFxuIiwKLQkJCWVzcC0+ZXNwX2lkLAotCQkJU0NwdHItPnVzZV9zZywgU0NwdHItPlNDcC5wdHIsIFNDcHRyLT5TQ3AudGhpc19yZXNpZHVhbCkpOwotCQlFU1BMT0coKCJlc3AlZDogRm9yY2luZyBhc3luYyBmb3IgdGFyZ2V0ICVkXG4iLCBlc3AtPmVzcF9pZCwgCi0JCQlTQ3B0ci0+ZGV2aWNlLT5pZCkpOwotCQlTQ3B0ci0+ZGV2aWNlLT5ib3JrZW4gPSAxOwotCQllc3BfZGV2LT5zeW5jID0gMDsKLQkJYnl0ZXNfc2VudCA9IDA7Ci0JfQotCi0JLyogVXBkYXRlIHRoZSBzdGF0ZSBvZiBvdXIgdHJhbnNmZXIuICovCi0JU0NwdHItPlNDcC5wdHIgKz0gYnl0ZXNfc2VudDsKLQlTQ3B0ci0+U0NwLnRoaXNfcmVzaWR1YWwgLT0gYnl0ZXNfc2VudDsKLQlpZihTQ3B0ci0+U0NwLnRoaXNfcmVzaWR1YWwgPCAwKSB7Ci0JCS8qIHNoaXQgKi8KLQkJRVNQTE9HKCgiZXNwJWQ6IERhdGEgdHJhbnNmZXIgb3ZlcnJ1bi5cbiIsIGVzcC0+ZXNwX2lkKSk7Ci0JCVNDcHRyLT5TQ3AudGhpc19yZXNpZHVhbCA9IDA7Ci0JfQotCi0JLyogTWF5YmUgY29udGludWUuICovCi0JaWYoIWJvZ3VzX2RhdGEpIHsKLQkJRVNQREFUQSgoIiFib2d1c19kYXRhLCAiKSk7Ci0JCS8qIE5PIE1BVFRFUiBXSEFULCB3ZSBhZHZhbmNlIHRoZSBzY2F0dGVybGlzdCwKLQkJICogaWYgdGhlIHRhcmdldCBzaG91bGQgZGVjaWRlIHRvIGRpc2Nvbm5lY3QKLQkJICogaW4gYmV0d2VlbiBzY2F0dGVyIGNodW5rcyAod2hpY2ggaXMgY29tbW9uKQotCQkgKiB3ZSBjb3VsZCBkaWUgaG9ycmlibHkhICBJIHVzZWQgdG8gaGF2ZSB0aGUgc2cKLQkJICogYWR2YW5jZSBvY2N1ciBvbmx5IGlmIHdlIGFyZSBnb2luZyBiYWNrIGludG8KLQkJICogKG9yIGFyZSBzdGF5aW5nIGluKSBhIGRhdGEgcGhhc2UsIHlvdSBjYW4KLQkJICogaW1hZ2luZSB0aGUgaGVsbCBJIHdlbnQgdGhyb3VnaCB0cnlpbmcgdG8KLQkJICogZmlndXJlIHRoaXMgb3V0LgotCQkgKi8KLQkJaWYoIVNDcHRyLT5TQ3AudGhpc19yZXNpZHVhbCAmJiBTQ3B0ci0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwpCi0JCQlhZHZhbmNlX3NnKGVzcCwgU0NwdHIpOwotI2lmZGVmIERFQlVHX0VTUF9EQVRBCi0JCWlmKHNyZWdfZGF0YWlucChlc3AtPnNyZWcpIHx8IHNyZWdfZGF0YW91dHAoZXNwLT5zcmVnKSkgewotCQkJRVNQREFUQSgoInRvIG1vcmUgZGF0YVxuIikpOwotCQl9IGVsc2UgewotCQkJRVNQREFUQSgoInRvIG5ldyBwaGFzZVxuIikpOwotCQl9Ci0jZW5kaWYKLQkJcmV0dXJuIGVzcF9kb19waGFzZV9kZXRlcm1pbmUoZXNwLCBlcmVncyk7Ci0JfQotCS8qIEJvZ3VzIGRhdGEsIGp1c3Qgd2FpdCBmb3IgbmV4dCBpbnRlcnJ1cHQuICovCi0JRVNQTE9HKCgiZXNwJWQ6IGJvZ3VzX2RhdGEgZHVyaW5nIGVuZCBvZiBkYXRhIHBoYXNlXG4iLAotCQllc3AtPmVzcF9pZCkpOwotCXJldHVybiBkb19pbnRyX2VuZDsKLX0KLQotLyogV2UgcmVjZWl2ZWQgYSBub24tZ29vZCBzdGF0dXMgcmV0dXJuIGF0IHRoZSBlbmQgb2YKLSAqIHJ1bm5pbmcgYSBTQ1NJIGNvbW1hbmQuICBUaGlzIGlzIHVzZWQgdG8gZGVjaWRlIGlmCi0gKiB3ZSBzaG91bGQgY2xlYXIgb3VyIHN5bmNocm9ub3VzIHRyYW5zZmVyIHN0YXRlIGZvcgotICogc3VjaCBhIGRldmljZSB3aGVuIHRoYXQgaGFwcGVucy4KLSAqCi0gKiBUaGUgaWRlYSBpcyB0aGF0IHdoZW4gc3Bpbm5pbmcgdXAgYSBkaXNrIG9yIHJld2luZGluZwotICogYSB0YXBlLCB3ZSBkb24ndCB3YW50IHRvIGdvIGludG8gYSBsb29wIHJlLW5lZ290aWF0aW5nCi0gKiBzeW5jaHJvbm91cyBjYXBhYmlsaXRpZXMgb3ZlciBhbmQgb3Zlci4KLSAqLwotc3RhdGljIGludCBlc3Bfc2hvdWxkX2NsZWFyX3N5bmMoU2NzaV9DbW5kICpzcCkKLXsKLQl1bmNoYXIgY21kID0gc3AtPmNtbmRbMF07Ci0KLQkvKiBUaGVzZSBjYXNlcyBhcmUgZm9yIHNwaW5uaW5nIHVwIGEgZGlzayBhbmQKLQkgKiB3YWl0aW5nIGZvciB0aGF0IHNwaW51cCB0byBjb21wbGV0ZS4KLQkgKi8KLQlpZihjbWQgPT0gU1RBUlRfU1RPUCkKLQkJcmV0dXJuIDA7Ci0KLQlpZihjbWQgPT0gVEVTVF9VTklUX1JFQURZKQotCQlyZXR1cm4gMDsKLQotCS8qIE9uZSBtb3JlIHNwZWNpYWwgY2FzZSBmb3IgU0NTSSB0YXBlIGRyaXZlcywKLQkgKiB0aGlzIGlzIHdoYXQgaXMgdXNlZCB0byBwcm9iZSB0aGUgZGV2aWNlIGZvcgotCSAqIGNvbXBsZXRpb24gb2YgYSByZXdpbmQgb3IgdGFwZSBsb2FkIG9wZXJhdGlvbi4KLQkgKi8KLQlpZihzcC0+ZGV2aWNlLT50eXBlID09IFRZUEVfVEFQRSAmJiBjbWQgPT0gTU9ERV9TRU5TRSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotLyogRWl0aGVyIGEgY29tbWFuZCBpcyBjb21wbGV0aW5nIG9yIGEgdGFyZ2V0IGlzIGRyb3BwaW5nIG9mZiB0aGUgYnVzCi0gKiB0byBjb250aW51ZSB0aGUgY29tbWFuZCBpbiB0aGUgYmFja2dyb3VuZCBzbyB3ZSBjYW4gZG8gb3RoZXIgd29yay4KLSAqLwotc3RhdGljIGludCBlc3BfZG9fZnJlZWJ1cyhzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQotewotCVNjc2lfQ21uZCAqU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0M7Ci0JaW50IHJ2YWw7Ci0KLQlydmFsID0gc2tpcGFoZWFkMihlc3AsIGVyZWdzLCBTQ3B0ciwgaW5fc3RhdHVzLCBpbl9tc2dpbmRvbmUsIGluX2ZyZWVpbmcpOwotCWlmKHJ2YWwpCi0JCXJldHVybiBydmFsOwotCi0JaWYoZXNwLT5pcmVnICE9IEVTUF9JTlRSX0RDKSB7Ci0JCUVTUExPRygoImVzcCVkOiBUYXJnZXQgd2lsbCBub3QgZGlzY29ubmVjdFxuIiwgZXNwLT5lc3BfaWQpKTsKLQkJcmV0dXJuIGRvX3Jlc2V0X2J1czsgLyogdGFyZ2V0IHdpbGwgbm90IGRyb3AgQlNZLi4uICovCi0JfQotCWVzcC0+bXNnb3V0X2xlbiA9IDA7Ci0JZXNwLT5wcmV2bXNnb3V0ID0gTk9QOwotCWlmKGVzcC0+cHJldm1zZ2luID09IENPTU1BTkRfQ09NUExFVEUpIHsKLQkJc3RydWN0IGVzcF9kZXZpY2UgKmVzcF9kZXYgPSBTQ3B0ci0+ZGV2aWNlLT5ob3N0ZGF0YTsKLQkJLyogTm9ybWFsIGVuZCBvZiBuZXh1cy4gKi8KLQkJaWYoZXNwLT5kaXNjb25uZWN0ZWRfU0MpCi0JCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfRVNFTCk7Ci0KLQkJaWYoU0NwdHItPlNDcC5TdGF0dXMgIT0gR09PRCAmJgotCQkgICBTQ3B0ci0+U0NwLlN0YXR1cyAhPSBDT05ESVRJT05fR09PRCAmJgotCQkgICAoKDE8PHNjbWRfaWQoU0NwdHIpKSAmIGVzcC0+dGFyZ2V0c19wcmVzZW50KSAmJgotCQkgICBlc3BfZGV2LT5zeW5jICYmIGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCkgewotCQkJLyogU0NTSSBzdGFuZGFyZCBzYXlzIHRoYXQgdGhlIHN5bmNocm9ub3VzIGNhcGFiaWxpdGllcwotCQkJICogc2hvdWxkIGJlIHJlbmVnb3RpYXRlZCBhdCB0aGlzIHBvaW50LiAgTW9zdCBsaWtlbHkKLQkJCSAqIHdlIGFyZSBhYm91dCB0byByZXF1ZXN0IHNlbnNlIGZyb20gdGhpcyB0YXJnZXQKLQkJCSAqIGluIHdoaWNoIGNhc2Ugd2Ugd2FudCB0byBhdm9pZCB1c2luZyBzeW5jCi0JCQkgKiB0cmFuc2ZlcnMgdW50aWwgd2UgYXJlIHN1cmUgb2YgdGhlIGN1cnJlbnQgdGFyZ2V0Ci0JCQkgKiBzdGF0ZS4KLQkJCSAqLwotCQkJRVNQTUlTQygoImVzcDogU3RhdHVzIDwlZD4gZm9yIHRhcmdldCAlZCBsdW4gJWRcbiIsCi0JCQkJIFNDcHRyLT5TQ3AuU3RhdHVzLCBTQ3B0ci0+ZGV2aWNlLT5pZCwgU0NwdHItPmRldmljZS0+bHVuKSk7Ci0KLQkJCS8qIEJ1dCBkb24ndCBkbyB0aGlzIHdoZW4gc3Bpbm5pbmcgdXAgYSBkaXNrIGF0Ci0JCQkgKiBib290IHRpbWUgd2hpbGUgd2UgcG9sbCBmb3IgY29tcGxldGlvbiBhcyBpdAotCQkJICogZmlsbHMgdXAgdGhlIGNvbnNvbGUgd2l0aCBtZXNzYWdlcy4gIEFsc28sIHRhcGVzCi0JCQkgKiBjYW4gcmVwb3J0IG5vdCByZWFkeSBtYW55IHRpbWVzIHJpZ2h0IGFmdGVyCi0JCQkgKiBsb2FkaW5nIHVwIGEgdGFwZS4KLQkJCSAqLwotCQkJaWYoZXNwX3Nob3VsZF9jbGVhcl9zeW5jKFNDcHRyKSAhPSAwKQotCQkJCWVzcF9kZXYtPnN5bmMgPSAwOwotCQl9Ci0JCUVTUERJU0MoKCJGPCUwMngsJTAyeD4iLCBTQ3B0ci0+ZGV2aWNlLT5pZCwgU0NwdHItPmRldmljZS0+bHVuKSk7Ci0JCWVzcF9kb25lKGVzcCwgKChTQ3B0ci0+U0NwLlN0YXR1cyAmIDB4ZmYpIHwKLQkJCSAgICAgICAoKFNDcHRyLT5TQ3AuTWVzc2FnZSAmIDB4ZmYpPDw4KSB8Ci0JCQkgICAgICAgKERJRF9PSyA8PCAxNikpKTsKLQl9IGVsc2UgaWYoZXNwLT5wcmV2bXNnaW4gPT0gRElTQ09OTkVDVCkgewotCQkvKiBOb3JtYWwgZGlzY29ubmVjdC4gKi8KLQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX0VTRUwpOwotCQlFU1BESVNDKCgiRDwlMDJ4LCUwMng+IiwgU0NwdHItPmRldmljZS0+aWQsIFNDcHRyLT5kZXZpY2UtPmx1bikpOwotCQlhcHBlbmRfU0MoJmVzcC0+ZGlzY29ubmVjdGVkX1NDLCBTQ3B0cik7Ci0JCWVzcC0+Y3VycmVudF9TQyA9IE5VTEw7Ci0JCWlmKGVzcC0+aXNzdWVfU0MpCi0JCQllc3BfZXhlY19jbWQoZXNwKTsKLQl9IGVsc2UgewotCQkvKiBEcml2ZXIgYnVnLCB3ZSBkbyBub3QgZXhwZWN0IGEgZGlzY29ubmVjdCBoZXJlCi0JCSAqIGFuZCBzaG91bGQgbm90IGhhdmUgYWR2YW5jZWQgdGhlIHN0YXRlIGVuZ2luZQotCQkgKiB0byBpbl9mcmVlaW5nLgotCQkgKi8KLQkJRVNQTE9HKCgiZXNwJWQ6IGxhc3QgbXNnIG5vdCBkaXNjIGFuZCBub3QgY21kIGNtcGx0LlxuIiwKLQkJCWVzcC0+ZXNwX2lkKSk7Ci0JCXJldHVybiBkb19yZXNldF9idXM7Ci0JfQotCXJldHVybiBkb19pbnRyX2VuZDsKLX0KLQotLyogV2hlbiBhIHJlc2VsZWN0IG9jY3VycywgYW5kIHdlIGNhbm5vdCBmaW5kIHRoZSBjb21tYW5kIHRvCi0gKiByZWNvbm5lY3QgdG8gaW4gb3VyIHF1ZXVlcywgd2UgZG8gdGhpcy4KLSAqLwotc3RhdGljIGludCBlc3BfYmFkX3JlY29ubmVjdChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotCVNjc2lfQ21uZCAqc3A7Ci0KLQlFU1BMT0coKCJlc3AlZDogRWllZWVlLCByZWNvbm5lY3RpbmcgdW5rbm93biBjb21tYW5kIVxuIiwKLQkJZXNwLT5lc3BfaWQpKTsKLQlFU1BMT0coKCJRVUVVRSBEVU1QXG4iKSk7Ci0Jc3AgPSBlc3AtPmlzc3VlX1NDOwotCUVTUExPRygoImVzcCVkOiBpc3N1ZV9TQ1siLCBlc3AtPmVzcF9pZCkpOwotCXdoaWxlKHNwKSB7Ci0JCUVTUExPRygoIjwlMDJ4LCUwMng+Iiwgc3AtPmRldmljZS0+aWQsIHNwLT5kZXZpY2UtPmx1bikpOwotCQlzcCA9IChTY3NpX0NtbmQgKikgc3AtPmhvc3Rfc2NyaWJibGU7Ci0JfQotCUVTUExPRygoIl1cbiIpKTsKLQlzcCA9IGVzcC0+Y3VycmVudF9TQzsKLQlFU1BMT0coKCJlc3AlZDogY3VycmVudF9TQ1siLCBlc3AtPmVzcF9pZCkpOwotCXdoaWxlKHNwKSB7Ci0JCUVTUExPRygoIjwlMDJ4LCUwMng+Iiwgc3AtPmRldmljZS0+aWQsIHNwLT5kZXZpY2UtPmx1bikpOwotCQlzcCA9IChTY3NpX0NtbmQgKikgc3AtPmhvc3Rfc2NyaWJibGU7Ci0JfQotCUVTUExPRygoIl1cbiIpKTsKLQlzcCA9IGVzcC0+ZGlzY29ubmVjdGVkX1NDOwotCUVTUExPRygoImVzcCVkOiBkaXNjb25uZWN0ZWRfU0NbIiwgZXNwLT5lc3BfaWQpKTsKLQl3aGlsZShzcCkgewotCQlFU1BMT0coKCI8JTAyeCwlMDJ4PiIsIHNwLT5kZXZpY2UtPmlkLCBzcC0+ZGV2aWNlLT5sdW4pKTsKLQkJc3AgPSAoU2NzaV9DbW5kICopIHNwLT5ob3N0X3NjcmliYmxlOwotCX0KLQlFU1BMT0coKCJdXG4iKSk7Ci0JcmV0dXJuIGRvX3Jlc2V0X2J1czsKLX0KLQotLyogRG8gdGhlIG5lZWR5IHdoZW4gYSB0YXJnZXQgdHJpZXMgdG8gcmVjb25uZWN0IHRvIHVzLiAqLwotc3RhdGljIGludCBlc3BfZG9fcmVjb25uZWN0KHN0cnVjdCBOQ1JfRVNQICplc3AsIAotCQkJICAgIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCi17Ci0JaW50IGx1biwgdGFyZ2V0OwotCVNjc2lfQ21uZCAqU0NwdHI7Ci0KLQkvKiBDaGVjayBmb3IgYWxsIGJvZ3VzIGNvbmRpdGlvbnMgZmlyc3QuICovCi0JdGFyZ2V0ID0gcmVjb25uZWN0X3RhcmdldChlc3AsIGVyZWdzKTsKLQlpZih0YXJnZXQgPCAwKSB7Ci0JCUVTUERJU0MoKCJiYWQgYnVzIGJpdHNcbiIpKTsKLQkJcmV0dXJuIGRvX3Jlc2V0X2J1czsKLQl9Ci0JbHVuID0gcmVjb25uZWN0X2x1bihlc3AsIGVyZWdzKTsKLQlpZihsdW4gPCAwKSB7Ci0JCUVTUERJU0MoKCJ0YXJnZXQ9JTJ4LCBiYWQgaWRlbnRpZnkgbXNnXG4iLCB0YXJnZXQpKTsKLQkJcmV0dXJuIGRvX3Jlc2V0X2J1czsKLQl9Ci0KLQkvKiBUaGluZ3MgbG9vayBvay4uLiAqLwotCUVTUERJU0MoKCJSPCUwMngsJTAyeD4iLCB0YXJnZXQsIGx1bikpOwotCi0JZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX0ZMVVNIKTsKLQlpZihlc3AxMDBfcmVjb25uZWN0X2h3YnVnKGVzcCwgZXJlZ3MpKQotCQlyZXR1cm4gZG9fcmVzZXRfYnVzOwotCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9OVUxMKTsKLQotCVNDcHRyID0gcmVtb3ZlX1NDKCZlc3AtPmRpc2Nvbm5lY3RlZF9TQywgKHVuY2hhcikgdGFyZ2V0LCAodW5jaGFyKSBsdW4pOwotCWlmKCFTQ3B0cikKLQkJcmV0dXJuIGVzcF9iYWRfcmVjb25uZWN0KGVzcCk7Ci0KLQllc3BfY29ubmVjdChlc3AsIGVyZWdzLCBTQ3B0cik7Ci0JZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX01PSyk7Ci0KLQkvKiBSZWNvbm5lY3QgaW1wbGllcyBhIHJlc3RvcmUgcG9pbnRlcnMgb3BlcmF0aW9uLiAqLwotCWVzcF9yZXN0b3JlX3BvaW50ZXJzKGVzcCwgU0NwdHIpOwotCi0JZXNwLT5zbmlwID0gMDsKLQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fdGhlX2RhcmspOwotCXJldHVybiBkb19pbnRyX2VuZDsKLX0KLQotLyogRW5kIG9mIE5FWFVTIChob3BlZnVsbHkpLCBwaWNrIHVwIHN0YXR1cyArIG1lc3NhZ2UgYnl0ZSB0aGVuIGxlYXZlIGlmCi0gKiBhbGwgZ29lcyB3ZWxsLgotICovCi1zdGF0aWMgaW50IGVzcF9kb19zdGF0dXMoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IEVTUF9yZWdzICplcmVncykKLXsKLQlTY3NpX0NtbmQgKlNDcHRyID0gZXNwLT5jdXJyZW50X1NDOwotCWludCBpbnRyLCBydmFsOwotCi0JcnZhbCA9IHNraXBhaGVhZDEoZXNwLCBlcmVncywgU0NwdHIsIGluX3RoZV9kYXJrLCBpbl9zdGF0dXMpOwotCWlmKHJ2YWwpCi0JCXJldHVybiBydmFsOwotCi0JaW50ciA9IGVzcC0+aXJlZzsKLQlFU1BTVEFUKCgiZXNwX2RvX3N0YXR1czogIikpOwotCWlmKGludHIgIT0gRVNQX0lOVFJfREMpIHsKLQkJaW50IG1lc3NhZ2Vfb3V0ID0gMDsgLyogZm9yIHBhcml0eSBwcm9ibGVtcyAqLwotCi0JCS8qIEFjayB0aGUgbWVzc2FnZS4gKi8KLQkJRVNQU1RBVCgoImFjayBtc2csICIpKTsKLQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX01PSyk7Ci0KLQkJaWYoZXNwLT5kbWFfcG9sbCkKLQkJCWVzcC0+ZG1hX3BvbGwoZXNwLCAodW5zaWduZWQgY2hhciAqKSBlc3AtPmVzcF9jb21tYW5kKTsKLQotCQlFU1BTVEFUKCgiZ290IHNvbWV0aGluZywgIikpOwotCQkvKiBFU1AgY2hpbWVzIGluIHdpdGggb25lIG9mCi0JCSAqCi0JCSAqIDEpIGZ1bmN0aW9uIGRvbmUgaW50ZXJydXB0OgotCQkgKglib3RoIHN0YXR1cyBhbmQgbWVzc2FnZSBpbiBieXRlcwotCQkgKglhcmUgYXZhaWxhYmxlCi0JCSAqCi0JCSAqIDIpIGJ1cyBzZXJ2aWNlIGludGVycnVwdDoKLQkJICoJb25seSBzdGF0dXMgYnl0ZSB3YXMgYWNxdWlyZWQKLQkJICoKLQkJICogMykgQW55dGhpbmcgZWxzZToKLQkJICoJY2FuJ3QgaGFwcGVuLCBidXQgd2UgdGVzdCBmb3IgaXQKLQkJICoJYW55d2F5cwotCQkgKgotCQkgKiBBTFNPOiBJZiBiYWQgcGFyaXR5IHdhcyBkZXRlY3RlZCBvbiBlaXRoZXIKLQkJICogICAgICAgdGhlIHN0YXR1cyBfb3JfIHRoZSBtZXNzYWdlIGJ5dGUgdGhlbgotCQkgKiAgICAgICB0aGUgRVNQIGhhcyBhc3NlcnRlZCBBVE4gb24gdGhlIGJ1cwotCQkgKiAgICAgICBhbmQgd2UgbXVzdCB0aGVyZWZvcmUgd2FpdCBmb3IgdGhlCi0JCSAqICAgICAgIG5leHQgcGhhc2UgY2hhbmdlLgotCQkgKi8KLQkJaWYoaW50ciAmIEVTUF9JTlRSX0ZET05FKSB7Ci0JCQkvKiBXZSBnb3QgaXQgYWxsLCBoYWxsZWp1bGlhLiAqLwotCQkJRVNQU1RBVCgoImdvdCBib3RoLCAiKSk7Ci0JCQlTQ3B0ci0+U0NwLlN0YXR1cyA9IGVzcC0+ZXNwX2NvbW1hbmRbMF07Ci0JCQlTQ3B0ci0+U0NwLk1lc3NhZ2UgPSBlc3AtPmVzcF9jb21tYW5kWzFdOwotCQkJZXNwLT5wcmV2bXNnaW4gPSBTQ3B0ci0+U0NwLk1lc3NhZ2U7Ci0JCQllc3AtPmN1cl9tc2dpblswXSA9IFNDcHRyLT5TQ3AuTWVzc2FnZTsKLQkJCWlmKGVzcC0+c3JlZyAmIEVTUF9TVEFUX1BFUlIpIHsKLQkJCQkvKiBUaGVyZSB3YXMgYmFkIHBhcml0eSBmb3IgdGhlCi0JCQkJICogbWVzc2FnZSBieXRlLCB0aGUgc3RhdHVzIGJ5dGUKLQkJCQkgKiB3YXMgb2suCi0JCQkJICovCi0JCQkJbWVzc2FnZV9vdXQgPSBNU0dfUEFSSVRZX0VSUk9SOwotCQkJfQotCQl9IGVsc2UgaWYoaW50ciA9PSBFU1BfSU5UUl9CU0VSVikgewotCQkJLyogT25seSBnb3Qgc3RhdHVzIGJ5dGUuICovCi0JCQlFU1BMT0coKCJlc3AlZDogZ290IHN0YXR1cyBvbmx5LCAiLCBlc3AtPmVzcF9pZCkpOwotCQkJaWYoIShlc3AtPnNyZWcgJiBFU1BfU1RBVF9QRVJSKSkgewotCQkJCVNDcHRyLT5TQ3AuU3RhdHVzID0gZXNwLT5lc3BfY29tbWFuZFswXTsKLQkJCQlTQ3B0ci0+U0NwLk1lc3NhZ2UgPSAweGZmOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBUaGUgc3RhdHVzIGJ5dGUgaGFkIGJhZCBwYXJpdHkuCi0JCQkJICogd2UgbGVhdmUgdGhlIHNjc2lfcG9pbnRlciBTdGF0dXMKLQkJCQkgKiBmaWVsZCBhbG9uZSBhcyB3ZSBzZXQgaXQgdG8gYSBkZWZhdWx0Ci0JCQkJICogb2YgQ0hFQ0tfQ09ORElUSU9OIGluIGVzcF9xdWV1ZS4KLQkJCQkgKi8KLQkJCQltZXNzYWdlX291dCA9IElOSVRJQVRPUl9FUlJPUjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBldmVyLiAqLwotCQkJRVNQU1RBVCgoImdvdCBib2xpeGVkXG4iKSk7Ci0JCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fdGhlX2RhcmspOwotCQkJcmV0dXJuIGVzcF9kb19waGFzZV9kZXRlcm1pbmUoZXNwLCBlcmVncyk7Ci0JCX0KLQotCQlpZighbWVzc2FnZV9vdXQpIHsKLQkJCUVTUFNUQVQoKCJzdGF0dXM9JTJ4IG1zZz0lMngsICIsIFNDcHRyLT5TQ3AuU3RhdHVzLAotCQkJCVNDcHRyLT5TQ3AuTWVzc2FnZSkpOwotCQkJaWYoU0NwdHItPlNDcC5NZXNzYWdlID09IENPTU1BTkRfQ09NUExFVEUpIHsKLQkJCQlFU1BTVEFUKCgiYW5kIHdhcyBDT01NQU5EX0NPTVBMRVRFXG4iKSk7Ci0JCQkJZXNwX2FkdmFuY2VfcGhhc2UoU0NwdHIsIGluX2ZyZWVpbmcpOwotCQkJCXJldHVybiBlc3BfZG9fZnJlZWJ1cyhlc3AsIGVyZWdzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJRVNQTE9HKCgiZXNwJWQ6IGFuZCBfbm90XyBDT01NQU5EX0NPTVBMRVRFXG4iLAotCQkJCQllc3AtPmVzcF9pZCkpOwotCQkJCWVzcC0+bXNnaW5fbGVuID0gZXNwLT5tc2dpbl9jdHIgPSAxOwotCQkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9tc2dpbmRvbmUpOwotCQkJCXJldHVybiBlc3BfZG9fbXNnaW5kb25lKGVzcCwgZXJlZ3MpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyogV2l0aCBsdWNrIHdlJ2xsIGJlIGFibGUgdG8gbGV0IHRoZSB0YXJnZXQKLQkJCSAqIGtub3cgdGhhdCBiYWQgcGFyaXR5IGhhcHBlbmVkLCBpdCB3aWxsIGtub3cKLQkJCSAqIHdoaWNoIGJ5dGUgY2F1c2VkIHRoZSBwcm9ibGVtcyBhbmQgc2VuZCBpdAotCQkJICogYWdhaW4uICBGb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHN0YXR1cyBieXRlCi0JCQkgKiByZWNlaXZlcyBiYWQgcGFyaXR5LCBJIGRvIG5vdCBiZWxpZXZlIG1vc3QKLQkJCSAqIHRhcmdldHMgcmVjb3ZlciB2ZXJ5IHdlbGwuICBXZSdsbCBzZWUuCi0JCQkgKi8KLQkJCUVTUExPRygoImVzcCVkOiBiYWQgcGFyaXR5IHNvbWV3aGVyZSBtb3V0PSUyeFxuIiwKLQkJCQllc3AtPmVzcF9pZCwgbWVzc2FnZV9vdXQpKTsKLQkJCWVzcC0+Y3VyX21zZ291dFswXSA9IG1lc3NhZ2Vfb3V0OwotCQkJZXNwLT5tc2dvdXRfbGVuID0gZXNwLT5tc2dvdXRfY3RyID0gMTsKLQkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7Ci0JCQlyZXR1cm4gZXNwX2RvX3BoYXNlX2RldGVybWluZShlc3AsIGVyZWdzKTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIElmIHdlIGRpc2Nvbm5lY3Qgbm93LCBhbGwgaGVsbCBicmVha3MgbG9vc2UuICovCi0JCUVTUExPRygoImVzcCVkOiB3aG9vcHMsIGRpc2Nvbm5lY3RcbiIsIGVzcC0+ZXNwX2lkKSk7Ci0JCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7Ci0JCXJldHVybiBlc3BfZG9fcGhhc2VfZGV0ZXJtaW5lKGVzcCwgZXJlZ3MpOwotCX0KLX0KLQotc3RhdGljIGludCBlc3BfZW50ZXJfc3RhdHVzKHN0cnVjdCBOQ1JfRVNQICplc3AsCi0JCQkgICAgc3RydWN0IEVTUF9yZWdzICplcmVncykKLXsKLQl1bmNoYXIgdGhlY21kID0gRVNQX0NNRF9JQ0NTRVE7Ci0KLQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfRkxVU0gpOwotCi0JaWYoZXNwLT5kb19waW9fY21kcykgewotCQllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX3N0YXR1cyk7Ci0JCWVzcF9jbWQoZXNwLCBlcmVncywgdGhlY21kKTsKLQkJd2hpbGUoIShlc3BfcmVhZChlc3AtPmVyZWdzLT5lc3Bfc3RhdHVzKSAmIEVTUF9TVEFUX0lOVFIpKTsKLQkJZXNwLT5lc3BfY29tbWFuZFswXSA9IGVzcF9yZWFkKGVyZWdzLT5lc3BfZmRhdGEpOwotICAgICAgICAgICAgICAgIHdoaWxlKCEoZXNwX3JlYWQoZXNwLT5lcmVncy0+ZXNwX3N0YXR1cykgJiBFU1BfU1RBVF9JTlRSKSk7Ci0gICAgICAgICAgICAgICAgZXNwLT5lc3BfY29tbWFuZFsxXSA9IGVzcF9yZWFkKGVyZWdzLT5lc3BfZmRhdGEpOwotCX0gZWxzZSB7Ci0JCWVzcC0+ZXNwX2NvbW1hbmRbMF0gPSBlc3AtPmVzcF9jb21tYW5kWzFdID0gMHhmZjsKLQkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfdGNsb3csIDIpOwotCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF90Y21lZCwgMCk7Ci0JCWVzcC0+ZG1hX2luaXRfcmVhZChlc3AsIGVzcC0+ZXNwX2NvbW1hbmRfZHZtYSwgMik7Ci0JCXRoZWNtZCB8PSBFU1BfQ01EX0RNQTsKLQkJZXNwX2NtZChlc3AsIGVyZWdzLCB0aGVjbWQpOwotCQllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX3N0YXR1cyk7Ci0JfQotCi0JcmV0dXJuIGVzcF9kb19zdGF0dXMoZXNwLCBlcmVncyk7Ci19Ci0KLXN0YXRpYyBpbnQgZXNwX2Rpc2Nvbm5lY3RfYW1pZHN0X3BoYXNlcyhzdHJ1Y3QgTkNSX0VTUCAqZXNwLAotCQkJCQlzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQotewotCVNjc2lfQ21uZCAqc3AgPSBlc3AtPmN1cnJlbnRfU0M7Ci0Jc3RydWN0IGVzcF9kZXZpY2UgKmVzcF9kZXYgPSBzcC0+ZGV2aWNlLT5ob3N0ZGF0YTsKLQotCS8qIFRoaXMgbWVhbnMgcmVhbCBwcm9ibGVtcyBpZiB3ZSBzZWUgdGhpcwotCSAqIGhlcmUuICBVbmxlc3Mgd2Ugd2VyZSBhY3R1YWxseSB0cnlpbmcKLQkgKiB0byBmb3JjZSB0aGUgZGV2aWNlIHRvIGFib3J0L3Jlc2V0LgotCSAqLwotCUVTUExPRygoImVzcCVkOiBEaXNjb25uZWN0IGFtaWRzdCBwaGFzZXMsICIsIGVzcC0+ZXNwX2lkKSk7Ci0JRVNQTE9HKCgicHBoYXNlPCVzPiBjcGhhc2U8JXM+LCAiLAotCQlwaGFzZV9zdHJpbmcoc3AtPlNDcC5waGFzZSksCi0JCXBoYXNlX3N0cmluZyhzcC0+U0NwLnNlbnRfY29tbWFuZCkpKTsKLQotCWlmKGVzcC0+ZGlzY29ubmVjdGVkX1NDKQotCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfRVNFTCk7Ci0KLQlzd2l0Y2goZXNwLT5jdXJfbXNnb3V0WzBdKSB7Ci0JZGVmYXVsdDoKLQkJLyogV2UgZGlkbid0IGV4cGVjdCB0aGlzIHRvIGhhcHBlbiBhdCBhbGwuICovCi0JCUVTUExPRygoImRldmljZSBpcyBib2xpeGVkXG4iKSk7Ci0JCWVzcF9hZHZhbmNlX3BoYXNlKHNwLCBpbl90Z3RlcnJvcik7Ci0JCWVzcF9kb25lKGVzcCwgKERJRF9FUlJPUiA8PCAxNikpOwotCQlicmVhazsKLQotCWNhc2UgQlVTX0RFVklDRV9SRVNFVDoKLQkJRVNQTE9HKCgiZGV2aWNlIHJlc2V0IHN1Y2Nlc3NmdWxcbiIpKTsKLQkJZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0ID0gMDsKLQkJZXNwX2Rldi0+c3luY19taW5fcGVyaW9kID0gMDsKLQkJZXNwX2Rldi0+c3luYyA9IDA7Ci0JCWVzcF9hZHZhbmNlX3BoYXNlKHNwLCBpbl9yZXNldGRldik7Ci0JCWVzcF9kb25lKGVzcCwgKERJRF9SRVNFVCA8PCAxNikpOwotCQlicmVhazsKLQotCWNhc2UgQUJPUlQ6Ci0JCUVTUExPRygoImRldmljZSBhYm9ydCBzdWNjZXNzZnVsXG4iKSk7Ci0JCWVzcF9hZHZhbmNlX3BoYXNlKHNwLCBpbl9hYm9ydG9uZSk7Ci0JCWVzcF9kb25lKGVzcCwgKERJRF9BQk9SVCA8PCAxNikpOwotCQlicmVhazsKLQotCX07Ci0JcmV0dXJuIGRvX2ludHJfZW5kOwotfQotCi1zdGF0aWMgaW50IGVzcF9lbnRlcl9tc2dvdXQoc3RydWN0IE5DUl9FU1AgKmVzcCwKLQkJCSAgICBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQotewotCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fbXNnb3V0KTsKLQlyZXR1cm4gZXNwX2RvX21zZ291dChlc3AsIGVyZWdzKTsKLX0KLQotc3RhdGljIGludCBlc3BfZW50ZXJfbXNnaW4oc3RydWN0IE5DUl9FU1AgKmVzcCwKLQkJCSAgIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCi17Ci0JZXNwX2FkdmFuY2VfcGhhc2UoZXNwLT5jdXJyZW50X1NDLCBpbl9tc2dpbik7Ci0JcmV0dXJuIGVzcF9kb19tc2dpbihlc3AsIGVyZWdzKTsKLX0KLQotc3RhdGljIGludCBlc3BfZW50ZXJfY21kKHN0cnVjdCBOQ1JfRVNQICplc3AsCi0JCQkgc3RydWN0IEVTUF9yZWdzICplcmVncykKLXsKLQllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX2NtZGJlZ2luKTsKLQlyZXR1cm4gZXNwX2RvX2NtZGJlZ2luKGVzcCwgZXJlZ3MpOwotfQotCi1zdGF0aWMgaW50IGVzcF9lbnRlcl9iYWRwaGFzZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLAotCQkJICAgICAgc3RydWN0IEVTUF9yZWdzICplcmVncykKLXsKLQlFU1BMT0coKCJlc3AlZDogQml6YXJyZSBidXMgcGhhc2UgJTJ4LlxuIiwgZXNwLT5lc3BfaWQsCi0JCWVzcC0+c3JlZyAmIEVTUF9TVEFUX1BNQVNLKSk7Ci0JcmV0dXJuIGRvX3Jlc2V0X2J1czsKLX0KLQotdHlwZWRlZiBpbnQgKCplc3BmdW5jX3QpKHN0cnVjdCBOQ1JfRVNQICosCi0JCQkgc3RydWN0IEVTUF9yZWdzICopOwotCi1zdGF0aWMgZXNwZnVuY190IHBoYXNlX3ZlY3RvcltdID0gewotCWVzcF9kb19kYXRhLAkJLyogRVNQX0RPUCAqLwotCWVzcF9kb19kYXRhLAkJLyogRVNQX0RJUCAqLwotCWVzcF9lbnRlcl9jbWQsCQkvKiBFU1BfQ01EUCAqLwotCWVzcF9lbnRlcl9zdGF0dXMsCS8qIEVTUF9TVEFUUCAqLwotCWVzcF9lbnRlcl9iYWRwaGFzZSwJLyogRVNQX1NUQVRfUE1TRyAqLwotCWVzcF9lbnRlcl9iYWRwaGFzZSwJLyogRVNQX1NUQVRfUE1TRyB8IEVTUF9TVEFUX1BJTyAqLwotCWVzcF9lbnRlcl9tc2dvdXQsCS8qIEVTUF9NT1AgKi8KLQllc3BfZW50ZXJfbXNnaW4sCS8qIEVTUF9NSVAgKi8KLX07Ci0KLS8qIFRoZSB0YXJnZXQgaGFzIGNvbnRyb2wgb2YgdGhlIGJ1cyBhbmQgd2UgaGF2ZSB0byBzZWUgd2hlcmUgaXQgaGFzCi0gKiB0YWtlbiB1cy4KLSAqLwotc3RhdGljIGludCBlc3BfZG9fcGhhc2VfZGV0ZXJtaW5lKHN0cnVjdCBOQ1JfRVNQICplc3AsCi0JCQkJICBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQotewotCWlmICgoZXNwLT5pcmVnICYgRVNQX0lOVFJfREMpICE9IDApCi0JCXJldHVybiBlc3BfZGlzY29ubmVjdF9hbWlkc3RfcGhhc2VzKGVzcCwgZXJlZ3MpOwotCXJldHVybiBwaGFzZV92ZWN0b3JbZXNwLT5zcmVnICYgRVNQX1NUQVRfUE1BU0tdKGVzcCwgZXJlZ3MpOwotfQotCi0vKiBGaXJzdCBpbnRlcnJ1cHQgYWZ0ZXIgZXhlYydpbmcgYSBjbWQgY29tZXMgaGVyZS4gKi8KLXN0YXRpYyBpbnQgZXNwX3NlbGVjdF9jb21wbGV0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQotewotCVNjc2lfQ21uZCAqU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0M7Ci0Jc3RydWN0IGVzcF9kZXZpY2UgKmVzcF9kZXYgPSBTQ3B0ci0+ZGV2aWNlLT5ob3N0ZGF0YTsKLQlpbnQgY21kX2J5dGVzX3NlbnQsIGZjbnQ7Ci0KLQlmY250ID0gKGVzcF9yZWFkKGVyZWdzLT5lc3BfZmZsYWdzKSAmIEVTUF9GRl9GQllURVMpOwotCWNtZF9ieXRlc19zZW50ID0gZXNwLT5kbWFfYnl0ZXNfc2VudChlc3AsIGZjbnQpOwotCWlmKGVzcC0+ZG1hX2ludmFsaWRhdGUpCi0JCWVzcC0+ZG1hX2ludmFsaWRhdGUoZXNwKTsKLQotCS8qIExldCdzIGNoZWNrIHRvIHNlZSBpZiBhIHJlc2VsZWN0IGhhcHBlbmVkCi0JICogd2hpbGUgd2Ugd2UncmUgdHJ5aW5nIHRvIHNlbGVjdC4gIFRoaXMgbXVzdAotCSAqIGJlIGNoZWNrZWQgZmlyc3QuCi0JICovCi0JaWYoZXNwLT5pcmVnID09IChFU1BfSU5UUl9SU0VMIHwgRVNQX0lOVFJfRkRPTkUpKSB7Ci0JCWVzcF9yZWNvbm5lY3QoZXNwLCBTQ3B0cik7Ci0JCXJldHVybiBlc3BfZG9fcmVjb25uZWN0KGVzcCwgZXJlZ3MpOwotCX0KLQotCS8qIExvb2tzIGxpa2UgdGhpbmdzIHdvcmtlZCwgd2Ugc2hvdWxkIHNlZSBhIGJ1cyBzZXJ2aWNlICYKLQkgKiBhIGZ1bmN0aW9uIGNvbXBsZXRlIGludGVycnVwdCBhdCB0aGlzIHBvaW50LiAgTm90ZSB3ZQotCSAqIGFyZSBkb2luZyBhIGRpcmVjdCBjb21wYXJpc29uIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0bwotCSAqIGJlIGZvb2xlZCBpbnRvIHRoaW5raW5nIHNlbGVjdGlvbiB3YXMgc3VjY2Vzc2Z1bCBpZgotCSAqIEVTUF9JTlRSX0RDIGlzIHNldCwgc2VlIGJlbG93LgotCSAqLwotCWlmKGVzcC0+aXJlZyA9PSAoRVNQX0lOVFJfRkRPTkUgfCBFU1BfSU5UUl9CU0VSVikpIHsKLQkJLyogdGFyZ2V0IHNwZWFrcy4uLiAqLwotCQllc3AtPnRhcmdldHNfcHJlc2VudCB8PSAoMTw8c2NtZF9pZChTQ3B0cikpOwotCi0JCS8qIFdoYXQgaWYgdGhlIHRhcmdldCBpZ25vcmVzIHRoZSBzZHRyPyAqLwotCQlpZihlc3AtPnNuaXApCi0JCQllc3BfZGV2LT5zeW5jID0gMTsKLQotCQkvKiBTZWUgaG93IGZhciwgaWYgYXQgYWxsLCB3ZSBnb3QgaW4gZ2V0dGluZwotCQkgKiB0aGUgaW5mb3JtYXRpb24gb3V0IHRvIHRoZSB0YXJnZXQuCi0JCSAqLwotCQlzd2l0Y2goZXNwLT5zZXFyZWcpIHsKLQkJZGVmYXVsdDoKLQotCQljYXNlIEVTUF9TVEVQX0FTRUw6Ci0JCQkvKiBBcmJpdHJhdGlvbiB3b24sIHRhcmdldCBzZWxlY3RlZCwgYnV0Ci0JCQkgKiB3ZSBhcmUgaW4gc29tZSBwaGFzZSB3aGljaCBpcyBub3QgY29tbWFuZAotCQkJICogcGhhc2Ugbm9yIGlzIGl0IG1lc3NhZ2Ugb3V0IHBoYXNlLgotCQkJICoKLQkJCSAqIFhYWCBXZSd2ZSBjb25mdXNlZCB0aGUgdGFyZ2V0LCBvYnZpb3VzbHkuCi0JCQkgKiBYWFggU28gY2xlYXIgaXQncyBzdGF0ZSwgYnV0IHdlIGFsc28gZW5kCi0JCQkgKiBYWFggdXAgY2xlYXJpbmcgZXZlcnlvbmUgZWxzZXMuICBUaGF0IGlzbid0Ci0JCQkgKiBYWFggc28gbmljZS4gIEknZCBsaWtlIHRvIGp1c3QgcmVzZXQgdGhpcwotCQkJICogWFhYIHRhcmdldCwgYnV0IGlmIEkgY2Fubm90IGV2ZW4gZ2V0IGl0J3MKLQkJCSAqIFhYWCBhdHRlbnRpb24gYW5kIGZpbmlzaCBzZWxlY3Rpb24gdG8gdGFsawotCQkJICogWFhYIHRvIGl0LCB0aGVyZSBpcyBub3QgbXVjaCBtb3JlIEkgY2FuIGRvLgotCQkJICogWFhYIElmIHdlIGhhdmUgYSBsb2FkZWQgYnVzIHdlJ3JlIGdvaW5nIHRvCi0JCQkgKiBYWFggc3BlbmQgdGhlIG5leHQgc2Vjb25kIG9yIHNvIHJlbmVnb3RpYXRpbmcKLQkJCSAqIFhYWCBmb3Igc3luY2hyb25vdXMgdHJhbnNmZXJzLgotCQkJICovCi0JCQlFU1BMT0coKCJlc3AlZDogU1RFUF9BU0VMIGZvciB0Z3QgJWRcbiIsCi0JCQkJZXNwLT5lc3BfaWQsIFNDcHRyLT5kZXZpY2UtPmlkKSk7Ci0KLQkJY2FzZSBFU1BfU1RFUF9TSUQ6Ci0JCQkvKiBBcmJpdHJhdGlvbiB3b24sIHRhcmdldCBzZWxlY3RlZCwgd2VudAotCQkJICogdG8gbWVzc2FnZSBvdXQgcGhhc2UsIHNlbnQgb25lIG1lc3NhZ2UKLQkJCSAqIGJ5dGUsIHRoZW4gd2Ugc3RvcHBlZC4gIEFUTiBpcyBhc3NlcnRlZAotCQkJICogb24gdGhlIFNDU0kgYnVzIGFuZCB0aGUgdGFyZ2V0IGlzIHN0aWxsCi0JCQkgKiB0aGVyZSBoYW5naW5nIG9uLiAgVGhpcyBpcyBhIGxlZ2FsCi0JCQkgKiBzZXF1ZW5jZSBzdGVwIGlmIHdlIGdhdmUgdGhlIEVTUCBhIHNlbGVjdAotCQkJICogYW5kIHN0b3AgY29tbWFuZC4KLQkJCSAqCi0JCQkgKiBYWFggU2VlIGFib3ZlLCBJIGNvdWxkIHNldCB0aGUgYm9ya2VuIGZsYWcKLQkJCSAqIFhYWCBpbiB0aGUgZGV2aWNlIHN0cnVjdCBhbmQgcmV0cnkgdGhlCi0JCQkgKiBYWFggY29tbWFuZC4gIEJ1dCB3b3VsZCB0aGF0IGhlbHAgZm9yCi0JCQkgKiBYWFggdGFnZ2VkIGNhcGFibGUgdGFyZ2V0cz8KLQkJCSAqLwotCi0JCWNhc2UgRVNQX1NURVBfTkNNRDoKLQkJCS8qIEFyYml0cmF0aW9uIHdvbiwgdGFyZ2V0IHNlbGVjdGVkLCBtYXliZQotCQkJICogc2VudCB0aGUgb25lIG1lc3NhZ2UgYnl0ZSBpbiBtZXNzYWdlIG91dAotCQkJICogcGhhc2UsIGJ1dCB3ZSBkaWQgbm90IGdvIHRvIGNvbW1hbmQgcGhhc2UKLQkJCSAqIGluIHRoZSBlbmQuICBBY3R1YWxseSwgd2UgY291bGQgaGF2ZSBzZW50Ci0JCQkgKiBvbmx5IHNvbWUgb2YgdGhlIG1lc3NhZ2UgYnl0ZXMgaWYgd2UgdHJpZWQKLQkJCSAqIHRvIHNlbmQgb3V0IHRoZSBlbnRpcmUgaWRlbnRpZnkgYW5kIHRhZwotCQkJICogbWVzc2FnZSB1c2luZyBFU1BfQ01EX1NBMy4KLQkJCSAqLwotCQkJY21kX2J5dGVzX3NlbnQgPSAwOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBFU1BfU1RFUF9QUEM6Ci0JCQkvKiBObywgbm90IHRoZSBwb3dlclBDIHBpbmhlYWQuICBBcmJpdHJhdGlvbgotCQkJICogd29uLCBhbGwgbWVzc2FnZSBieXRlcyBzZW50IGlmIHdlIHdlbnQgdG8KLQkJCSAqIG1lc3NhZ2Ugb3V0IHBoYXNlLCB3ZW50IHRvIGNvbW1hbmQgcGhhc2UKLQkJCSAqIGJ1dCBvbmx5IHBhcnQgb2YgdGhlIGNvbW1hbmQgd2FzIHNlbnQuCi0JCQkgKgotCQkJICogWFhYIEkndmUgc2VlbiB0aGlzLCBidXQgdXN1YWxseSBpbiBjb25qdW5jdGlvbgotCQkJICogWFhYIHdpdGggYSBncm9zcyBlcnJvciB3aGljaCBhcHBlYXJzIHRvIGhhdmUKLQkJCSAqIFhYWCBvY2N1cnJlZCBiZXR3ZWVuIHRoZSB0aW1lIEkgdG9sZCB0aGUKLQkJCSAqIFhYWCBFU1AgdG8gYXJiaXRyYXRlIGFuZCB3aGVuIEkgZ290IHRoZQotCQkJICogWFhYIGludGVycnVwdC4gIENvdWxkIEkgaGF2ZSBtaXNsb2FkZWQgdGhlCi0JCQkgKiBYWFggY29tbWFuZCBieXRlcyBpbnRvIHRoZSBmaWZvPyAgQWN0dWFsbHksCi0JCQkgKiBYWFggSSBtb3N0IGxpa2VseSBtaXNzZWQgYSBwaGFzZSwgYW5kIHRoZXJlZm9yZQotCQkJICogWFhYIHdlbnQgaW50byBuZXZlciBuZXZlciBsYW5kIGFuZCBkaWRuJ3QgZXZlbgotCQkJICogWFhYIGtub3cgaXQuICBUaGF0IHdhcyB0aGUgb2xkIGRyaXZlciB0aG91Z2guCi0JCQkgKiBYWFggV2hhdCBpcyBldmVuIG1vcmUgcGVjdWxpYXIgaXMgdGhhdCB0aGUgRVNQCi0JCQkgKiBYWFggc2hvd2VkIHRoZSBwcm9wZXIgZnVuY3Rpb24gY29tcGxldGUgYW5kCi0JCQkgKiBYWFggYnVzIHNlcnZpY2UgYml0cyBpbiB0aGUgaW50ZXJydXB0IHJlZ2lzdGVyLgotCQkJICovCi0KLQkJY2FzZSBFU1BfU1RFUF9GSU5JNDoKLQkJY2FzZSBFU1BfU1RFUF9GSU5JNToKLQkJY2FzZSBFU1BfU1RFUF9GSU5JNjoKLQkJY2FzZSBFU1BfU1RFUF9GSU5JNzoKLQkJCS8qIEFjY291bnQgZm9yIHRoZSBpZGVudGlmeSBtZXNzYWdlICovCi0JCQlpZihTQ3B0ci0+U0NwLnBoYXNlID09IGluX3NsY3Rfbm9ybSkKLQkJCQljbWRfYnl0ZXNfc2VudCAtPSAxOwotCQl9OwotCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfTlVMTCk7Ci0KLQkJLyogQmUgY2FyZWZ1bCwgd2UgY291bGQgcmVhbGx5IGdldCBmdWNrZWQgZHVyaW5nIHN5bmNocm9ub3VzCi0JCSAqIGRhdGEgdHJhbnNmZXJzIGlmIHdlIHRyeSB0byBmbHVzaCB0aGUgZmlmbyBub3cuCi0JCSAqLwotCQlpZighZmNudCAmJiAvKiBGaWZvIGlzIGVtcHR5IGFuZC4uLiAqLwotCQkgICAvKiBlaXRoZXIgd2UgYXJlIG5vdCBkb2luZyBzeW5jaHJvbm91cyB0cmFuc2ZlcnMgb3IuLi4gKi8KLQkJICAgKCFlc3BfZGV2LT5zeW5jX21heF9vZmZzZXQgfHwKLQkJICAgIC8qIFdlIGFyZSBub3QgZ29pbmcgaW50byBkYXRhIGluIHBoYXNlLiAqLwotCQkgICAgKChlc3AtPnNyZWcgJiBFU1BfU1RBVF9QTUFTSykgIT0gRVNQX0RJUCkpKQotCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX0ZMVVNIKTsgLyogZmx1c2ggaXMgc2FmZSAqLwotCi0JCS8qIFNlZSBob3cgZmFyIHdlIGdvdCBpZiB0aGlzIGlzIG5vdCBhIHNsb3cgY29tbWFuZC4gKi8KLQkJaWYoIWVzcC0+ZXNwX3Nsb3djbWQpIHsKLQkJCWlmKGNtZF9ieXRlc19zZW50IDwgMCkKLQkJCQljbWRfYnl0ZXNfc2VudCA9IDA7Ci0JCQlpZihjbWRfYnl0ZXNfc2VudCAhPSBTQ3B0ci0+Y21kX2xlbikgewotCQkJCS8qIENyYXBvbGEsIG1hcmsgaXQgYXMgYSBzbG93Y21kCi0JCQkJICogc28gdGhhdCB3ZSBoYXZlIHNvbWUgY2hhbmNlIG9mCi0JCQkJICoga2VlcGluZyB0aGUgY29tbWFuZCBhbGl2ZSB3aXRoCi0JCQkJICogZ29vZCBsdWNrLgotCQkJCSAqCi0JCQkJICogWFhYIEFjdHVhbGx5LCBpZiB3ZSBkaWRuJ3Qgc2VuZCBpdCBhbGwKLQkJCQkgKiBYWFggdGhpcyBtZWFucyBlaXRoZXIgd2UgZGlkbid0IHNldCB0aGluZ3MKLQkJCQkgKiBYWFggdXAgcHJvcGVybHkgKGRyaXZlciBidWcpIG9yIHRoZSB0YXJnZXQKLQkJCQkgKiBYWFggb3IgdGhlIEVTUCBkZXRlY3RlZCBwYXJpdHkgb24gb25lIG9mCi0JCQkJICogWFhYIHRoZSBjb21tYW5kIGJ5dGVzLiAgVGhpcyBtYWtlcyBtdWNoCi0JCQkJICogWFhYIG1vcmUgc2Vuc2UsIGFuZCB0aGVyZWZvcmUgdGhpcyBjb2RlCi0JCQkJICogWFhYIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHNlbmQgb3V0IGEKLQkJCQkgKiBYWFggcGFyaXR5IGVycm9yIG1lc3NhZ2Ugb3IgaWYgdGhlIHN0YXR1cwotCQkJCSAqIFhYWCByZWdpc3RlciBzaG93cyBubyBwYXJpdHkgZXJyb3IgdGhlbgotCQkJCSAqIFhYWCBqdXN0IGV4cGVjdCB0aGUgdGFyZ2V0IHRvIGJyaW5nIHRoZQotCQkJCSAqIFhYWCBidXMgaW50byBtZXNzYWdlIGluIHBoYXNlIHNvIHRoYXQgaXQKLQkJCQkgKiBYWFggY2FuIHNlbmQgdXMgdGhlIHBhcml0eSBlcnJvciBtZXNzYWdlLgotCQkJCSAqIFhYWCBTQ1NJIHN1Y2tzLi4uCi0JCQkJICovCi0JCQkJZXNwLT5lc3Bfc2xvd2NtZCA9IDE7Ci0JCQkJZXNwLT5lc3Bfc2NtZHAgPSAmKFNDcHRyLT5jbW5kW2NtZF9ieXRlc19zZW50XSk7Ci0JCQkJZXNwLT5lc3Bfc2NtZGxlZnQgPSAoU0NwdHItPmNtZF9sZW4gLSBjbWRfYnl0ZXNfc2VudCk7Ci0JCQl9Ci0JCX0KLQotCQkvKiBOb3cgZmlndXJlIG91dCB3aGVyZSB3ZSB3ZW50LiAqLwotCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fdGhlX2RhcmspOwotCQlyZXR1cm4gZXNwX2RvX3BoYXNlX2RldGVybWluZShlc3AsIGVyZWdzKTsKLQl9Ci0KLQkvKiBEaWQgdGhlIHRhcmdldCBldmVuIG1ha2UgaXQ/ICovCi0JaWYoZXNwLT5pcmVnID09IEVTUF9JTlRSX0RDKSB7Ci0JCS8qIHdoZWVlLi4uIG5vYm9keSB0aGVyZSBvciB0aGV5IGRpZG4ndCBsaWtlCi0JCSAqIHdoYXQgd2UgdG9sZCBpdCB0byBkbywgY2xlYW4gdXAuCi0JCSAqLwotCi0JCS8qIElmIGFueW9uZSBpcyBvZmYgdGhlIGJ1cywgYnV0IHdvcmtpbmcgb24KLQkJICogYSBjb21tYW5kIGluIHRoZSBiYWNrZ3JvdW5kIGZvciB1cywgdGVsbAotCQkgKiB0aGUgRVNQIHRvIGxpc3RlbiBmb3IgdGhlbS4KLQkJICovCi0JCWlmKGVzcC0+ZGlzY29ubmVjdGVkX1NDKQotCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX0VTRUwpOwotCi0JCWlmKCgoMTw8U0NwdHItPmRldmljZS0+aWQpICYgZXNwLT50YXJnZXRzX3ByZXNlbnQpICYmCi0JCSAgIGVzcC0+c2VxcmVnICYmIGVzcC0+Y3VyX21zZ291dFswXSA9PSBFWFRFTkRFRF9NRVNTQUdFICYmCi0JCSAgIChTQ3B0ci0+U0NwLnBoYXNlID09IGluX3NsY3RfbXNnIHx8Ci0JCSAgICBTQ3B0ci0+U0NwLnBoYXNlID09IGluX3NsY3Rfc3RvcCkpIHsKLQkJCS8qIHNoaXQgKi8KLQkJCWVzcC0+c25pcCA9IDA7Ci0JCQlFU1BMT0coKCJlc3AlZDogRmFpbGVkIHN5bmNocm9ub3VzIG5lZ290aWF0aW9uIGZvciB0YXJnZXQgJWQgIgotCQkJCSJsdW4gJWRcbiIsIGVzcC0+ZXNwX2lkLCBTQ3B0ci0+ZGV2aWNlLT5pZCwgU0NwdHItPmRldmljZS0+bHVuKSk7Ci0JCQllc3BfZGV2LT5zeW5jX21heF9vZmZzZXQgPSAwOwotCQkJZXNwX2Rldi0+c3luY19taW5fcGVyaW9kID0gMDsKLQkJCWVzcF9kZXYtPnN5bmMgPSAxOyAvKiBzbyB3ZSBkb24ndCBuZWdvdGlhdGUgYWdhaW4gKi8KLQotCQkJLyogUnVuIHRoZSBjb21tYW5kIGFnYWluLCB0aGlzIHRpbWUgdGhvdWdoIHdlCi0JCQkgKiB3b24ndCB0cnkgdG8gbmVnb3RpYXRlIGZvciBzeW5jaHJvbm91cyB0cmFuc2ZlcnMuCi0JCQkgKgotCQkJICogWFhYIEknZCBsaWtlIHRvIGRvIHNvbWV0aGluZyBsaWtlIHNlbmQgYW4KLQkJCSAqIFhYWCBJTklUSUFUT1JfRVJST1Igb3IgQUJPUlQgbWVzc2FnZSB0byB0aGUKLQkJCSAqIFhYWCB0YXJnZXQgdG8gdGVsbCBpdCwgIlNvcnJ5IEkgY29uZnVzZWQgeW91LAotCQkJICogWFhYIHBsZWFzZSBjb21lIGJhY2sgYW5kIEkgd2lsbCBiZSBuaWNlciBuZXh0Ci0JCQkgKiBYWFggdGltZSIuICBCdXQgdGhhdCByZXF1aXJlcyBoYXZpbmcgdGhlIHRhcmdldAotCQkJICogWFhYIG9uIHRoZSBidXMsIGFuZCBpdCBoYXMgZHJvcHBlZCBCU1kgb24gdXMuCi0JCQkgKi8KLQkJCWVzcC0+Y3VycmVudF9TQyA9IE5VTEw7Ci0JCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgbm90X2lzc3VlZCk7Ci0JCQlwcmVwZW5kX1NDKCZlc3AtPmlzc3VlX1NDLCBTQ3B0cik7Ci0JCQllc3BfZXhlY19jbWQoZXNwKTsKLQkJCXJldHVybiBkb19pbnRyX2VuZDsKLQkJfQotCi0JCS8qIE9rLCB0aGlzIGlzIG5vcm1hbCwgdGhpcyBpcyB3aGF0IHdlIHNlZSBkdXJpbmcgYm9vdAotCQkgKiBvciB3aGVuZXZlciB3aGVuIHdlIGFyZSBzY2FubmluZyB0aGUgYnVzIGZvciB0YXJnZXRzLgotCQkgKiBCdXQgZmlyc3QgbWFrZSBzdXJlIHRoYXQgaXMgcmVhbGx5IHdoYXQgaXMgaGFwcGVuaW5nLgotCQkgKi8KLQkJaWYoKCgxPDxTQ3B0ci0+ZGV2aWNlLT5pZCkgJiBlc3AtPnRhcmdldHNfcHJlc2VudCkpIHsKLQkJCUVTUExPRygoImVzcCVkOiBXYXJuaW5nLCBsaXZlIHRhcmdldCAlZCBub3QgcmVzcG9uZGluZyB0byAiCi0JCQkJInNlbGVjdGlvbi5cbiIsIGVzcC0+ZXNwX2lkLCBTQ3B0ci0+ZGV2aWNlLT5pZCkpOwotCi0JCQkvKiBUaGlzIF9DQU5fIGhhcHBlbi4gIFRoZSBTQ1NJIHN0YW5kYXJkIHN0YXRlcyB0aGF0Ci0JCQkgKiB0aGUgdGFyZ2V0IGlzIHRvIF9ub3RfIHJlc3BvbmQgdG8gc2VsZWN0aW9uIGlmCi0JCQkgKiBfaXRfIGRldGVjdHMgYmFkIHBhcml0eSBvbiB0aGUgYnVzIGZvciBhbnkgcmVhc29uLgotCQkJICogVGhlcmVmb3JlLCB3ZSBhc3N1bWUgdGhhdCBpZiB3ZSd2ZSB0YWxrZWQgc3VjY2Vzc2Z1bGx5Ci0JCQkgKiB0byB0aGlzIHRhcmdldCBiZWZvcmUsIGJhZCBwYXJpdHkgaXMgdGhlIHByb2JsZW0uCi0JCQkgKi8KLQkJCWVzcF9kb25lKGVzcCwgKERJRF9QQVJJVFkgPDwgMTYpKTsKLQkJfSBlbHNlIHsKLQkJCS8qIEVsc2UsIHRoZXJlIHJlYWxseSBpc24ndCBhbnlvbmUgdGhlcmUuICovCi0JCQlFU1BNSVNDKCgiZXNwOiBzZWxlY3Rpb24gZmFpbHVyZSwgbWF5YmUgbm9ib2R5IHRoZXJlP1xuIikpOwotCQkJRVNQTUlTQygoImVzcDogdGFyZ2V0ICVkIGx1biAlZFxuIiwKLQkJCQkgU0NwdHItPmRldmljZS0+aWQsIFNDcHRyLT5kZXZpY2UtPmx1bikpOwotCQkJZXNwX2RvbmUoZXNwLCAoRElEX0JBRF9UQVJHRVQgPDwgMTYpKTsKLQkJfQotCQlyZXR1cm4gZG9faW50cl9lbmQ7Ci0JfQotCi0KLQlFU1BMT0coKCJlc3AlZDogU2VsZWN0aW9uIGZhaWx1cmUuXG4iLCBlc3AtPmVzcF9pZCkpOwotCXByaW50aygiZXNwJWQ6IEN1cnJlbnRseSAtLSAiLCBlc3AtPmVzcF9pZCk7Ci0JZXNwX3ByaW50X2lyZWcoZXNwLT5pcmVnKTsKLQlwcmludGsoIiAiKTsKLQllc3BfcHJpbnRfc3RhdHJlZyhlc3AtPnNyZWcpOwotCXByaW50aygiICIpOwotCWVzcF9wcmludF9zZXFyZWcoZXNwLT5zZXFyZWcpOwotCXByaW50aygiXG4iKTsKLQlwcmludGsoImVzcCVkOiBOZXcgLS0gIiwgZXNwLT5lc3BfaWQpOwotCWVzcC0+c3JlZyA9IGVzcF9yZWFkKGVyZWdzLT5lc3Bfc3RhdHVzKTsKLQllc3AtPnNlcXJlZyA9IGVzcF9yZWFkKGVyZWdzLT5lc3Bfc3N0ZXApOwotCWVzcC0+aXJlZyA9IGVzcF9yZWFkKGVyZWdzLT5lc3BfaW50cnB0KTsKLQllc3BfcHJpbnRfaXJlZyhlc3AtPmlyZWcpOwotCXByaW50aygiICIpOwotCWVzcF9wcmludF9zdGF0cmVnKGVzcC0+c3JlZyk7Ci0JcHJpbnRrKCIgIik7Ci0JZXNwX3ByaW50X3NlcXJlZyhlc3AtPnNlcXJlZyk7Ci0JcHJpbnRrKCJcbiIpOwotCUVTUExPRygoImVzcCVkOiByZXNldHRpbmcgYnVzXG4iLCBlc3AtPmVzcF9pZCkpOwotCXJldHVybiBkb19yZXNldF9idXM7IC8qIHVnaC4uLiAqLwotfQotCi0vKiBDb250aW51ZSByZWFkaW5nIGJ5dGVzIGZvciBtc2dpbiBwaGFzZS4gKi8KLXN0YXRpYyBpbnQgZXNwX2RvX21zZ2luY29udChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQotewotCWlmKGVzcC0+aXJlZyAmIEVTUF9JTlRSX0JTRVJWKSB7Ci0JCS8qIGluIHRoZSByaWdodCBwaGFzZSB0b28/ICovCi0JCWlmKChlc3AtPnNyZWcgJiBFU1BfU1RBVF9QTUFTSykgPT0gRVNQX01JUCkgewotCQkJLyogcGhldy4uLiAqLwotCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX1RJKTsKLQkJCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fbXNnaW5kb25lKTsKLQkJCXJldHVybiBkb19pbnRyX2VuZDsKLQkJfQotCi0JCS8qIFdlIGNoYW5nZWQgcGhhc2UgYnV0IEVTUCBzaG93cyBidXMgc2VydmljZSwKLQkJICogaW4gdGhpcyBjYXNlIGl0IGlzIG1vc3QgbGlrZWx5IHRoYXQgd2UsIHRoZQotCQkgKiBoYWNrZXIgd2hvIGhhcyBiZWVuIHVwIGZvciAyMGhycyBzdHJhaWdodAotCQkgKiBzdGFyaW5nIGF0IHRoZSBzY3JlZW4sIGRyb3duZWQgaW4gY29mZmVlCi0JCSAqIHNtZWxsaW5nIGxpa2UgcmV0Y2hlZCBjaWdhcmV0dGUgYXNoZXMKLQkJICogaGF2ZSBtaXNjb2RlZCBzb21ldGhpbmcuLi4uLiBzbywgdHJ5IHRvCi0JCSAqIHJlY292ZXIgYXMgYmVzdCB3ZSBjYW4uCi0JCSAqLwotCQlFU1BMT0coKCJlc3AlZDogbWVzc2FnZSBpbiBtaXMtY2FycmlhZ2UuXG4iLCBlc3AtPmVzcF9pZCkpOwotCX0KLQllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX3RoZV9kYXJrKTsKLQlyZXR1cm4gZG9fcGhhc2VfZGV0ZXJtaW5lOwotfQotCi1zdGF0aWMgaW50IGNoZWNrX3NpbmdsZWJ5dGVfbXNnKHN0cnVjdCBOQ1JfRVNQICplc3AsCi0JCQkJc3RydWN0IEVTUF9yZWdzICplcmVncykKLXsKLQllc3AtPnByZXZtc2dpbiA9IGVzcC0+Y3VyX21zZ2luWzBdOwotCWlmKGVzcC0+Y3VyX21zZ2luWzBdICYgMHg4MCkgewotCQkvKiB3aGVlZS4uLiAqLwotCQlFU1BMT0coKCJlc3AlZDogdGFyZ2V0IHNlbmRzIGlkZW50aWZ5IGFtaWRzdCBwaGFzZXNcbiIsCi0JCQllc3AtPmVzcF9pZCkpOwotCQllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX3RoZV9kYXJrKTsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIGlmKCgoZXNwLT5jdXJfbXNnaW5bMF0gJiAweGYwKSA9PSAweDIwKSB8fAotCQkgIChlc3AtPmN1cl9tc2dpblswXSA9PSBFWFRFTkRFRF9NRVNTQUdFKSkgewotCQllc3AtPm1zZ2luX2xlbiA9IDI7Ci0JCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fbXNnaW5jb250KTsKLQkJcmV0dXJuIDA7Ci0JfQotCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fdGhlX2RhcmspOwotCXN3aXRjaChlc3AtPmN1cl9tc2dpblswXSkgewotCWRlZmF1bHQ6Ci0JCS8qIFdlIGRvbid0IHdhbnQgdG8gaGVhciBhYm91dCBpdC4gKi8KLQkJRVNQTE9HKCgiZXNwJWQ6IG1zZyAlMDJ4IHdoaWNoIHdlIGRvbid0IGtub3cgYWJvdXRcbiIsIGVzcC0+ZXNwX2lkLAotCQkJZXNwLT5jdXJfbXNnaW5bMF0pKTsKLQkJcmV0dXJuIE1FU1NBR0VfUkVKRUNUOwotCi0JY2FzZSBOT1A6Ci0JCUVTUExPRygoImVzcCVkOiB0YXJnZXQgJWQgc2VuZHMgYSBub3BcbiIsIGVzcC0+ZXNwX2lkLAotCQkJZXNwLT5jdXJyZW50X1NDLT5kZXZpY2UtPmlkKSk7Ci0JCXJldHVybiAwOwotCi0JY2FzZSBSRVNUT1JFX1BPSU5URVJTOgotCQkvKiBJbiB0aGlzIGNhc2Ugd2UgbWlnaHQgYWxzbyBoYXZlIHRvIGJhY2t1cCB0aGUKLQkJICogInNsb3cgY29tbWFuZCIgcG9pbnRlci4gIEl0IGlzIHJhcmUgdG8gZ2V0IHN1Y2gKLQkJICogYSBzYXZlL3Jlc3RvcmUgcG9pbnRlciBzZXF1ZW5jZSBzbyBlYXJseSBpbiB0aGUKLQkJICogYnVzIHRyYW5zaXRpb24gc2VxdWVuY2VzLCBidXQgY292ZXIgaXQuCi0JCSAqLwotCQlpZihlc3AtPmVzcF9zbG93Y21kKSB7Ci0JCQllc3AtPmVzcF9zY21kbGVmdCA9IGVzcC0+Y3VycmVudF9TQy0+Y21kX2xlbjsKLQkJCWVzcC0+ZXNwX3NjbWRwID0gJmVzcC0+Y3VycmVudF9TQy0+Y21uZFswXTsKLQkJfQotCQllc3BfcmVzdG9yZV9wb2ludGVycyhlc3AsIGVzcC0+Y3VycmVudF9TQyk7Ci0JCXJldHVybiAwOwotCi0JY2FzZSBTQVZFX1BPSU5URVJTOgotCQllc3Bfc2F2ZV9wb2ludGVycyhlc3AsIGVzcC0+Y3VycmVudF9TQyk7Ci0JCXJldHVybiAwOwotCi0JY2FzZSBDT01NQU5EX0NPTVBMRVRFOgotCWNhc2UgRElTQ09OTkVDVDoKLQkJLyogRnJlZWluZyB0aGUgYnVzLCBsZXQgaXQgZ28uICovCi0JCWVzcC0+Y3VycmVudF9TQy0+U0NwLnBoYXNlID0gaW5fZnJlZWluZzsKLQkJcmV0dXJuIDA7Ci0KLQljYXNlIE1FU1NBR0VfUkVKRUNUOgotCQlFU1BNSVNDKCgibXNnIHJlamVjdCwgIikpOwotCQlpZihlc3AtPnByZXZtc2dvdXQgPT0gRVhURU5ERURfTUVTU0FHRSkgewotCQkJc3RydWN0IGVzcF9kZXZpY2UgKmVzcF9kZXYgPSBlc3AtPmN1cnJlbnRfU0MtPmRldmljZS0+aG9zdGRhdGE7Ci0KLQkJCS8qIERvZXNuJ3QgbG9vayBsaWtlIHRoaXMgdGFyZ2V0IGNhbgotCQkJICogZG8gc3luY2hyb25vdXMgb3IgV0lERSB0cmFuc2ZlcnMuCi0JCQkgKi8KLQkJCUVTUFNEVFIoKCJnb3QgcmVqZWN0LCB3YXMgdHJ5aW5nIG5lZ28sIGNsZWFyaW5nIHN5bmMvV0lERVxuIikpOwotCQkJZXNwX2Rldi0+c3luYyA9IDE7Ci0JCQllc3BfZGV2LT53aWRlID0gMTsKLQkJCWVzcF9kZXYtPnN5bmNfbWluX3BlcmlvZCA9IDA7Ci0JCQllc3BfZGV2LT5zeW5jX21heF9vZmZzZXQgPSAwOwotCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSB7Ci0JCQlFU1BNSVNDKCgibm90IHN5bmMgbmVnbywgc2VuZGluZyBBQk9SVFxuIikpOwotCQkJcmV0dXJuIEFCT1JUOwotCQl9Ci0JfTsKLX0KLQotLyogVGFyZ2V0IG5lZ290aWF0ZXMgZm9yIHN5bmNocm9ub3VzIHRyYW5zZmVycyBiZWZvcmUgd2UgZG8sIHRoaXMKLSAqIGlzIGxlZ2FsIGFsdGhvdWdoIHZlcnkgc3RyYW5nZS4gIFdoYXQgaXMgZXZlbiBmdW5uaWVyIGlzIHRoYXQKLSAqIHRoZSBTQ1NJMiBzdGFuZGFyZCBzcGVjaWZpY2FsbHkgcmVjb21tZW5kcyBhZ2FpbnN0IHRhcmdldHMgZG9pbmcKLSAqIHRoaXMgYmVjYXVzZSBzbyBtYW55IGluaXRpYXRvcnMgY2Fubm90IGNvcGUgd2l0aCB0aGlzIG9jY3VycmluZy4KLSAqLwotc3RhdGljIGludCB0YXJnZXRfd2l0aF9hbnRzX2luX3BhbnRzKHN0cnVjdCBOQ1JfRVNQICplc3AsCi0JCQkJICAgICBTY3NpX0NtbmQgKlNDcHRyLAotCQkJCSAgICAgc3RydWN0IGVzcF9kZXZpY2UgKmVzcF9kZXYpCi17Ci0JaWYoZXNwX2Rldi0+c3luYyB8fCBTQ3B0ci0+ZGV2aWNlLT5ib3JrZW4pIHsKLQkJLyogc29ycnksIG5vIGNhbiBkbyAqLwotCQlFU1BTRFRSKCgiZm9yY2luZyB0byBhc3luYywgIikpOwotCQlidWlsZF9zeW5jX25lZ29fbXNnKGVzcCwgMCwgMCk7Ci0JCWVzcF9kZXYtPnN5bmMgPSAxOwotCQllc3AtPnNuaXAgPSAxOwotCQlFU1BMT0coKCJlc3AlZDogaG9waW5nIGZvciBtc2dvdXRcbiIsIGVzcC0+ZXNwX2lkKSk7Ci0JCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7Ci0JCXJldHVybiBFWFRFTkRFRF9NRVNTQUdFOwotCX0KLQotCS8qIE9rLCB3ZSdsbCBjaGVjayB0aGVtIG91dC4uLiAqLwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzeW5jX3JlcG9ydChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotCWludCBtc2czLCBtc2c0OwotCWNoYXIgKnR5cGU7Ci0KLQltc2czID0gZXNwLT5jdXJfbXNnaW5bM107Ci0JbXNnNCA9IGVzcC0+Y3VyX21zZ2luWzRdOwotCWlmKG1zZzQpIHsKLQkJaW50IGh6ID0gMTAwMDAwMDAwMCAvIChtc2czICogNCk7Ci0JCWludCBpbnRlZ2VyID0gaHogLyAxMDAwMDAwOwotCQlpbnQgZnJhY3Rpb24gPSAoaHogLSAoaW50ZWdlciAqIDEwMDAwMDApKSAvIDEwMDAwOwotCQlpZigobXNnMyAqIDQpIDwgMjAwKSB7Ci0JCQl0eXBlID0gIkZBU1QiOwotCQl9IGVsc2UgewotCQkJdHlwZSA9ICJzeW5jaHJvbm91cyI7Ci0JCX0KLQotCQkvKiBEbyBub3QgdHJhbnNmb3JtIHRoaXMgYmFjayBpbnRvIG9uZSBiaWcgcHJpbnRrCi0JCSAqIGFnYWluLCBpdCB0cmlnZ2VycyBhIGJ1ZyBpbiBvdXIgc3BhcmM2NC1nY2MyNzIKLQkJICogc2libGluZyBjYWxsIG9wdGltaXphdGlvbi4gIC1EYXZlTQotCQkgKi8KLQkJRVNQTE9HKChLRVJOX0lORk8gImVzcCVkOiB0YXJnZXQgJWQgIiwKLQkJCWVzcC0+ZXNwX2lkLCBlc3AtPmN1cnJlbnRfU0MtPmRldmljZS0+aWQpKTsKLQkJRVNQTE9HKCgiW3BlcmlvZCAlZG5zIG9mZnNldCAlZCAlZC4lMDJkTUh6ICIsCi0JCQkoaW50KSBtc2czICogNCwgKGludCkgbXNnNCwKLQkJCWludGVnZXIsIGZyYWN0aW9uKSk7Ci0JCUVTUExPRygoIiVzIFNDU0klc11cbiIsIHR5cGUsCi0JCQkoKChtc2czICogNCkgPCAyMDApID8gIi1JSSIgOiAiIikpKTsKLQl9IGVsc2UgewotCQlFU1BMT0coKEtFUk5fSU5GTyAiZXNwJWQ6IHRhcmdldCAlZCBhc3luY2hyb25vdXNcbiIsCi0JCQllc3AtPmVzcF9pZCwgZXNwLT5jdXJyZW50X1NDLT5kZXZpY2UtPmlkKSk7Ci0JfQotfQotCi1zdGF0aWMgaW50IGNoZWNrX211bHRpYnl0ZV9tc2coc3RydWN0IE5DUl9FU1AgKmVzcCwKLQkJCSAgICAgICBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQotewotCVNjc2lfQ21uZCAqU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0M7Ci0Jc3RydWN0IGVzcF9kZXZpY2UgKmVzcF9kZXYgPSBTQ3B0ci0+ZGV2aWNlLT5ob3N0ZGF0YTsKLQl1bmNoYXIgcmVndmFsID0gMDsKLQlpbnQgbWVzc2FnZV9vdXQgPSAwOwotCi0JRVNQU0RUUigoImNoayBtdWx0aWJ5dGUgbXNnOiAiKSk7Ci0JaWYoZXNwLT5jdXJfbXNnaW5bMl0gPT0gRVhURU5ERURfU0RUUikgewotCQlpbnQgcGVyaW9kID0gZXNwLT5jdXJfbXNnaW5bM107Ci0JCWludCBvZmZzZXQgPSBlc3AtPmN1cl9tc2dpbls0XTsKLQotCQlFU1BTRFRSKCgiaXMgc3luYyBuZWdvIHJlc3BvbnNlLCAiKSk7Ci0JCWlmKCFlc3AtPnNuaXApIHsKLQkJCWludCBydmFsOwotCi0JCQkvKiBUYXJnZXQgbmVnb3RpYXRlcyBmaXJzdCEgKi8KLQkJCUVTUFNEVFIoKCJ0YXJnZXQganVtcHMgdGhlIGd1biwgIikpOwotCQkJbWVzc2FnZV9vdXQgPSBFWFRFTkRFRF9NRVNTQUdFOyAvKiB3ZSBtdXN0IHJlc3BvbmQgKi8KLQkJCXJ2YWwgPSB0YXJnZXRfd2l0aF9hbnRzX2luX3BhbnRzKGVzcCwgU0NwdHIsIGVzcF9kZXYpOwotCQkJaWYocnZhbCkKLQkJCQlyZXR1cm4gcnZhbDsKLQkJfQotCi0JCUVTUFNEVFIoKCJleGFtaW5pbmcgc2R0ciwgIikpOwotCi0JCS8qIE9mZnNldCBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gRVNQIGZpZm8gc2l6ZS4gKi8KLQkJaWYob2Zmc2V0ID4gMTUpIHsKLQkJCUVTUFNEVFIoKCJvZmZzZXQgdG9vIGJpZyAlMngsICIsIG9mZnNldCkpOwotCQkJb2Zmc2V0ID0gMTU7Ci0JCQlFU1BTRFRSKCgic2VuZGluZyBiYWNrIG5ldyBvZmZzZXRcbiIpKTsKLQkJCWJ1aWxkX3N5bmNfbmVnb19tc2coZXNwLCBwZXJpb2QsIG9mZnNldCk7Ci0JCQlyZXR1cm4gRVhURU5ERURfTUVTU0FHRTsKLQkJfQotCi0JCWlmKG9mZnNldCAmJiBwZXJpb2QgPiBlc3AtPm1heF9wZXJpb2QpIHsKLQkJCS8qIFllZWUsIGFzeW5jIGZvciB0aGlzIHNsb3cgZGV2aWNlLiAqLwotCQkJRVNQU0RUUigoInBlcmlvZCB0b28gbG9uZyAlMngsICIsIHBlcmlvZCkpOwotCQkJYnVpbGRfc3luY19uZWdvX21zZyhlc3AsIDAsIDApOwotCQkJRVNQU0RUUigoImhvcGluZyBmb3IgbXNnb3V0XG4iKSk7Ci0JCQllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX3RoZV9kYXJrKTsKLQkJCXJldHVybiBFWFRFTkRFRF9NRVNTQUdFOwotCQl9IGVsc2UgaWYgKG9mZnNldCAmJiBwZXJpb2QgPCBlc3AtPm1pbl9wZXJpb2QpIHsKLQkJCUVTUFNEVFIoKCJwZXJpb2QgdG9vIHNob3J0ICUyeCwgIiwgcGVyaW9kKSk7Ci0JCQlwZXJpb2QgPSBlc3AtPm1pbl9wZXJpb2Q7Ci0JCQlpZihlc3AtPmVyZXYgPiBlc3AyMzYpCi0JCQkJcmVndmFsID0gNDsKLQkJCWVsc2UKLQkJCQlyZWd2YWwgPSA1OwotCQl9IGVsc2UgaWYob2Zmc2V0KSB7Ci0JCQlpbnQgdG1wOwotCi0JCQlFU1BTRFRSKCgicGVyaW9kIGlzIG9rLCAiKSk7Ci0JCQl0bXAgPSBlc3AtPmNjeWNsZSAvIDEwMDA7Ci0JCQlyZWd2YWwgPSAoKChwZXJpb2QgPDwgMikgKyB0bXAgLSAxKSAvIHRtcCk7Ci0JCQlpZihyZWd2YWwgJiYgKGVzcC0+ZXJldiA+IGVzcDIzNikpIHsKLQkJCQlpZihwZXJpb2QgPj0gNTApCi0JCQkJCXJlZ3ZhbC0tOwotCQkJfQotCQl9Ci0KLQkJaWYob2Zmc2V0KSB7Ci0JCQl1bmNoYXIgYml0OwotCi0JCQllc3BfZGV2LT5zeW5jX21pbl9wZXJpb2QgPSAocmVndmFsICYgMHgxZik7Ci0JCQllc3BfZGV2LT5zeW5jX21heF9vZmZzZXQgPSAob2Zmc2V0IHwgZXNwLT5yYWRlbGF5KTsKLQkJCWlmKGVzcC0+ZXJldiA+IGVzcDIzNikgewotCQkJCWlmKGVzcC0+ZXJldiA9PSBmYXMxMDBhKQotCQkJCQliaXQgPSBFU1BfQ09ORklHM19GQVNUOwotCQkJCWVsc2UKLQkJCQkJYml0ID0gRVNQX0NPTkZJRzNfRlNDU0k7Ci0JCQkJaWYocGVyaW9kIDwgNTApCi0JCQkJCWVzcC0+Y29uZmlnM1tTQ3B0ci0+ZGV2aWNlLT5pZF0gfD0gYml0OwotCQkJCWVsc2UKLQkJCQkJZXNwLT5jb25maWczW1NDcHRyLT5kZXZpY2UtPmlkXSAmPSB+Yml0OwotCQkJCWVzcC0+cHJldl9jZmczID0gZXNwLT5jb25maWczW1NDcHRyLT5kZXZpY2UtPmlkXTsKLQkJCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9jZmczLCBlc3AtPnByZXZfY2ZnMyk7Ci0JCQl9Ci0JCQllc3AtPnByZXZfc29mZiA9IGVzcF9kZXYtPnN5bmNfbWluX3BlcmlvZDsKLQkJCWVzcF93cml0ZShlcmVncy0+ZXNwX3NvZmYsIGVzcC0+cHJldl9zb2ZmKTsKLQkJCWVzcC0+cHJldl9zdHAgPSBlc3BfZGV2LT5zeW5jX21heF9vZmZzZXQ7Ci0JCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9zdHAsIGVzcC0+cHJldl9zdHApOwotCi0JCQlFU1BTRFRSKCgic29mZj0lMnggc3RwPSUyeCBjZmczPSUyeFxuIiwKLQkJCQllc3BfZGV2LT5zeW5jX21heF9vZmZzZXQsCi0JCQkJZXNwX2Rldi0+c3luY19taW5fcGVyaW9kLAotCQkJCWVzcC0+Y29uZmlnM1tzY21kX2lkKFNDcHRyKV0pKTsKLQotCQkJZXNwLT5zbmlwID0gMDsKLQkJfSBlbHNlIGlmKGVzcF9kZXYtPnN5bmNfbWF4X29mZnNldCkgewotCQkJdW5jaGFyIGJpdDsKLQotCQkJLyogYmFjayB0byBhc3luYyBtb2RlICovCi0JCQlFU1BTRFRSKCgidW5hY2NhcHRhYmxlIHN5bmMgbmVnbywgZm9yY2luZyBhc3luY1xuIikpOwotCQkJZXNwX2Rldi0+c3luY19tYXhfb2Zmc2V0ID0gMDsKLQkJCWVzcF9kZXYtPnN5bmNfbWluX3BlcmlvZCA9IDA7Ci0JCQllc3AtPnByZXZfc29mZiA9IDA7Ci0JCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9zb2ZmLCAwKTsKLQkJCWVzcC0+cHJldl9zdHAgPSAwOwotCQkJZXNwX3dyaXRlKGVyZWdzLT5lc3Bfc3RwLCAwKTsKLQkJCWlmKGVzcC0+ZXJldiA+IGVzcDIzNikgewotCQkJCWlmKGVzcC0+ZXJldiA9PSBmYXMxMDBhKQotCQkJCQliaXQgPSBFU1BfQ09ORklHM19GQVNUOwotCQkJCWVsc2UKLQkJCQkJYml0ID0gRVNQX0NPTkZJRzNfRlNDU0k7Ci0JCQkJZXNwLT5jb25maWczW1NDcHRyLT5kZXZpY2UtPmlkXSAmPSB+Yml0OwotCQkJCWVzcC0+cHJldl9jZmczID0gZXNwLT5jb25maWczW1NDcHRyLT5kZXZpY2UtPmlkXTsKLQkJCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9jZmczLCBlc3AtPnByZXZfY2ZnMyk7Ci0JCQl9Ci0JCX0KLQotCQlzeW5jX3JlcG9ydChlc3ApOwotCi0JCUVTUFNEVFIoKCJjaGsgbXVsdGlieXRlIG1zZzogc3luYyBpcyBrbm93biwgIikpOwotCQllc3BfZGV2LT5zeW5jID0gMTsKLQotCQlpZihtZXNzYWdlX291dCkgewotCQkJRVNQTE9HKCgiZXNwJWQ6IHNlbmRpbmcgc2R0ciBiYWNrLCBob3BpbmcgZm9yIG1zZ291dFxuIiwKLQkJCQllc3AtPmVzcF9pZCkpOwotCQkJYnVpbGRfc3luY19uZWdvX21zZyhlc3AsIHBlcmlvZCwgb2Zmc2V0KTsKLQkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl90aGVfZGFyayk7Ci0JCQlyZXR1cm4gRVhURU5ERURfTUVTU0FHRTsKLQkJfQotCi0JCUVTUFNEVFIoKCJyZXR1cm5pbmcgemVyb1xuIikpOwotCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fdGhlX2RhcmspOyAvKiAuLi5vciBlbHNlISAqLwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgaWYoZXNwLT5jdXJfbXNnaW5bMl0gPT0gRVhURU5ERURfV0RUUikgewotCQlFU1BMT0coKCJlc3AlZDogQUlFRUUgd2lkZSBtc2cgcmVjZWl2ZWRcbiIsIGVzcC0+ZXNwX2lkKSk7Ci0JCW1lc3NhZ2Vfb3V0ID0gTUVTU0FHRV9SRUpFQ1Q7Ci0JfSBlbHNlIGlmKGVzcC0+Y3VyX21zZ2luWzJdID09IEVYVEVOREVEX01PRElGWV9EQVRBX1BPSU5URVIpIHsKLQkJRVNQTE9HKCgiZXNwJWQ6IHJlamVjdGluZyBtb2RpZnkgZGF0YSBwdHIgbXNnXG4iLCBlc3AtPmVzcF9pZCkpOwotCQltZXNzYWdlX291dCA9IE1FU1NBR0VfUkVKRUNUOwotCX0KLQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fdGhlX2RhcmspOwotCXJldHVybiBtZXNzYWdlX291dDsKLX0KLQotc3RhdGljIGludCBlc3BfZG9fbXNnaW5kb25lKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCi17Ci0JU2NzaV9DbW5kICpTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQzsKLQlpbnQgbWVzc2FnZV9vdXQgPSAwLCBpdCA9IDAsIHJ2YWw7Ci0KLQlydmFsID0gc2tpcGFoZWFkMShlc3AsIGVyZWdzLCBTQ3B0ciwgaW5fbXNnaW4sIGluX21zZ2luZG9uZSk7Ci0JaWYocnZhbCkKLQkJcmV0dXJuIHJ2YWw7Ci0JaWYoU0NwdHItPlNDcC5zZW50X2NvbW1hbmQgIT0gaW5fc3RhdHVzKSB7Ci0JCWlmKCEoZXNwLT5pcmVnICYgRVNQX0lOVFJfREMpKSB7Ci0JCQlpZihlc3AtPm1zZ2luX2xlbiAmJiAoZXNwLT5zcmVnICYgRVNQX1NUQVRfUEVSUikpIHsKLQkJCQltZXNzYWdlX291dCA9IE1TR19QQVJJVFlfRVJST1I7Ci0JCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX0ZMVVNIKTsKLQkJCX0gZWxzZSBpZigoaXQgPSAoZXNwX3JlYWQoZXJlZ3MtPmVzcF9mZmxhZ3MpICYgRVNQX0ZGX0ZCWVRFUykpIT0xKSB7Ci0JCQkJLyogV2UgY2VydGFpbmx5IGRyb3BwZWQgdGhlIGJhbGwgc29tZXdoZXJlLiAqLwotCQkJCW1lc3NhZ2Vfb3V0ID0gSU5JVElBVE9SX0VSUk9SOwotCQkJCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9GTFVTSCk7Ci0JCQl9IGVsc2UgaWYoIWVzcC0+bXNnaW5fbGVuKSB7Ci0JCQkJaXQgPSBlc3BfcmVhZChlcmVncy0+ZXNwX2ZkYXRhKTsKLQkJCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fbXNnaW5jb250KTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogaXQgaXMgb2sgYW5kIHdlIHdhbnQgaXQgKi8KLQkJCQlpdCA9IGVzcC0+Y3VyX21zZ2luW2VzcC0+bXNnaW5fY3RyXSA9Ci0JCQkJCWVzcF9yZWFkKGVyZWdzLT5lc3BfZmRhdGEpOwotCQkJCWVzcC0+bXNnaW5fY3RyKys7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fdGhlX2RhcmspOwotCQkJcmV0dXJuIGRvX3dvcmtfYnVzOwotCQl9Ci0JfSBlbHNlIHsKLQkJaXQgPSBlc3AtPmN1cl9tc2dpblswXTsKLQl9Ci0JaWYoIW1lc3NhZ2Vfb3V0ICYmIGVzcC0+bXNnaW5fbGVuKSB7Ci0JCWlmKGVzcC0+bXNnaW5fY3RyIDwgZXNwLT5tc2dpbl9sZW4pIHsKLQkJCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9tc2dpbmNvbnQpOwotCQl9IGVsc2UgaWYoZXNwLT5tc2dpbl9sZW4gPT0gMSkgewotCQkJbWVzc2FnZV9vdXQgPSBjaGVja19zaW5nbGVieXRlX21zZyhlc3AsIGVyZWdzKTsKLQkJfSBlbHNlIGlmKGVzcC0+bXNnaW5fbGVuID09IDIpIHsKLQkJCWlmKGVzcC0+Y3VyX21zZ2luWzBdID09IEVYVEVOREVEX01FU1NBR0UpIHsKLQkJCQlpZigoaXQrMikgPj0gMTUpIHsKLQkJCQkJbWVzc2FnZV9vdXQgPSBNRVNTQUdFX1JFSkVDVDsKLQkJCQl9IGVsc2UgewotCQkJCQllc3AtPm1zZ2luX2xlbiA9IChpdCArIDIpOwotCQkJCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fbXNnaW5jb250KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCW1lc3NhZ2Vfb3V0ID0gTUVTU0FHRV9SRUpFQ1Q7IC8qIGZvbyBvbiB5b3UgKi8KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW1lc3NhZ2Vfb3V0ID0gY2hlY2tfbXVsdGlieXRlX21zZyhlc3AsIGVyZWdzKTsKLQkJfQotCX0KLQlpZihtZXNzYWdlX291dCA8IDApIHsKLQkJcmV0dXJuIC1tZXNzYWdlX291dDsKLQl9IGVsc2UgaWYobWVzc2FnZV9vdXQpIHsKLQkJaWYoKChtZXNzYWdlX291dCAhPSAxKSAmJgotCQkgICAgKChtZXNzYWdlX291dCA8IDB4MjApIHx8IChtZXNzYWdlX291dCAmIDB4ODApKSkpCi0JCQllc3AtPm1zZ291dF9sZW4gPSAxOwotCQllc3AtPmN1cl9tc2dvdXRbMF0gPSBtZXNzYWdlX291dDsKLQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX1NBVE4pOwotCQllc3BfYWR2YW5jZV9waGFzZShTQ3B0ciwgaW5fdGhlX2RhcmspOwotCQllc3AtPm1zZ2luX2xlbiA9IDA7Ci0JfQotCWVzcC0+c3JlZyA9IGVzcF9yZWFkKGVyZWdzLT5lc3Bfc3RhdHVzKTsKLQllc3AtPnNyZWcgJj0gfihFU1BfU1RBVF9JTlRSKTsKLQlpZigoZXNwLT5zcmVnICYgKEVTUF9TVEFUX1BNU0d8RVNQX1NUQVRfUENEKSkgPT0gKEVTUF9TVEFUX1BNU0d8RVNQX1NUQVRfUENEKSkKLQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX01PSyk7Ci0JaWYoKFNDcHRyLT5TQ3Auc2VudF9jb21tYW5kID09IGluX21zZ2luZG9uZSkgJiYKLQkgICAgKFNDcHRyLT5TQ3AucGhhc2UgPT0gaW5fZnJlZWluZykpCi0JCXJldHVybiBlc3BfZG9fZnJlZWJ1cyhlc3AsIGVyZWdzKTsKLQlyZXR1cm4gZG9faW50cl9lbmQ7Ci19Ci0KLXN0YXRpYyBpbnQgZXNwX2RvX2NtZGJlZ2luKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3MpCi17Ci0JdW5zaWduZWQgY2hhciB0bXA7Ci0JU2NzaV9DbW5kICpTQ3B0ciA9IGVzcC0+Y3VycmVudF9TQzsKLQotCWVzcF9hZHZhbmNlX3BoYXNlKFNDcHRyLCBpbl9jbWRlbmQpOwotCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9GTFVTSCk7Ci0JdG1wID0gKmVzcC0+ZXNwX3NjbWRwKys7Ci0JZXNwLT5lc3Bfc2NtZGxlZnQtLTsKLQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9mZGF0YSwgdG1wKTsKLQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfVEkpOwotCXJldHVybiBkb19pbnRyX2VuZDsKLX0KLQotc3RhdGljIGludCBlc3BfZG9fY21kZG9uZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQotewotCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9OVUxMKTsKLQlpZihlc3AtPmlyZWcgJiBFU1BfSU5UUl9CU0VSVikgewotCQllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX3RoZV9kYXJrKTsKLQkJcmV0dXJuIGVzcF9kb19waGFzZV9kZXRlcm1pbmUoZXNwLCBlcmVncyk7Ci0JfQotCUVTUExPRygoImVzcCVkOiBpbiBkb19jbWRkb25lKCkgYnV0IGRpZG4ndCBnZXQgQlNFUlYgaW50ZXJydXB0LlxuIiwKLQkJZXNwLT5lc3BfaWQpKTsKLQlyZXR1cm4gZG9fcmVzZXRfYnVzOwotfQotCi1zdGF0aWMgaW50IGVzcF9kb19tc2dvdXQoc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IEVTUF9yZWdzICplcmVncykKLXsKLQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfRkxVU0gpOwotCXN3aXRjaChlc3AtPm1zZ291dF9sZW4pIHsKLQljYXNlIDE6Ci0JCWVzcF93cml0ZShlcmVncy0+ZXNwX2ZkYXRhLCBlc3AtPmN1cl9tc2dvdXRbMF0pOwotCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfVEkpOwotCQlicmVhazsKLQotCWNhc2UgMjoKLQkJaWYoZXNwLT5kb19waW9fY21kcyl7Ci0JCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9mZGF0YSwgZXNwLT5jdXJfbXNnb3V0WzBdKTsKLQkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2ZkYXRhLCBlc3AtPmN1cl9tc2dvdXRbMV0pOwotCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX1RJKTsKLQkJfSBlbHNlIHsKLQkJCWVzcC0+ZXNwX2NvbW1hbmRbMF0gPSBlc3AtPmN1cl9tc2dvdXRbMF07Ci0JCQllc3AtPmVzcF9jb21tYW5kWzFdID0gZXNwLT5jdXJfbXNnb3V0WzFdOwotCQkJZXNwLT5kbWFfc2V0dXAoZXNwLCBlc3AtPmVzcF9jb21tYW5kX2R2bWEsIDIsIDApOwotCQkJZXNwX3NldGNvdW50KGVyZWdzLCAyKTsKLQkJCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9ETUEgfCBFU1BfQ01EX1RJKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgNDoKLQkJZXNwLT5zbmlwID0gMTsKLQkJaWYoZXNwLT5kb19waW9fY21kcyl7Ci0JCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9mZGF0YSwgZXNwLT5jdXJfbXNnb3V0WzBdKTsKLQkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2ZkYXRhLCBlc3AtPmN1cl9tc2dvdXRbMV0pOwotCQkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfZmRhdGEsIGVzcC0+Y3VyX21zZ291dFsyXSk7Ci0JCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9mZGF0YSwgZXNwLT5jdXJfbXNnb3V0WzNdKTsKLQkJCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9USSk7Ci0JCX0gZWxzZSB7Ci0JCQllc3AtPmVzcF9jb21tYW5kWzBdID0gZXNwLT5jdXJfbXNnb3V0WzBdOwotCQkJZXNwLT5lc3BfY29tbWFuZFsxXSA9IGVzcC0+Y3VyX21zZ291dFsxXTsKLQkJCWVzcC0+ZXNwX2NvbW1hbmRbMl0gPSBlc3AtPmN1cl9tc2dvdXRbMl07Ci0JCQllc3AtPmVzcF9jb21tYW5kWzNdID0gZXNwLT5jdXJfbXNnb3V0WzNdOwotCQkJZXNwLT5kbWFfc2V0dXAoZXNwLCBlc3AtPmVzcF9jb21tYW5kX2R2bWEsIDQsIDApOwotCQkJZXNwX3NldGNvdW50KGVyZWdzLCA0KTsKLQkJCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9ETUEgfCBFU1BfQ01EX1RJKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgNToKLQkJZXNwLT5zbmlwID0gMTsKLQkJaWYoZXNwLT5kb19waW9fY21kcyl7Ci0JCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9mZGF0YSwgZXNwLT5jdXJfbXNnb3V0WzBdKTsKLQkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2ZkYXRhLCBlc3AtPmN1cl9tc2dvdXRbMV0pOwotCQkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfZmRhdGEsIGVzcC0+Y3VyX21zZ291dFsyXSk7Ci0JCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9mZGF0YSwgZXNwLT5jdXJfbXNnb3V0WzNdKTsKLQkJCWVzcF93cml0ZShlcmVncy0+ZXNwX2ZkYXRhLCBlc3AtPmN1cl9tc2dvdXRbNF0pOwotCQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX1RJKTsKLQkJfSBlbHNlIHsKLQkJCWVzcC0+ZXNwX2NvbW1hbmRbMF0gPSBlc3AtPmN1cl9tc2dvdXRbMF07Ci0JCQllc3AtPmVzcF9jb21tYW5kWzFdID0gZXNwLT5jdXJfbXNnb3V0WzFdOwotCQkJZXNwLT5lc3BfY29tbWFuZFsyXSA9IGVzcC0+Y3VyX21zZ291dFsyXTsKLQkJCWVzcC0+ZXNwX2NvbW1hbmRbM10gPSBlc3AtPmN1cl9tc2dvdXRbM107Ci0JCQllc3AtPmVzcF9jb21tYW5kWzRdID0gZXNwLT5jdXJfbXNnb3V0WzRdOwotCQkJZXNwLT5kbWFfc2V0dXAoZXNwLCBlc3AtPmVzcF9jb21tYW5kX2R2bWEsIDUsIDApOwotCQkJZXNwX3NldGNvdW50KGVyZWdzLCA1KTsKLQkJCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9ETUEgfCBFU1BfQ01EX1RJKTsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCS8qIHdob29wcyAqLwotCQlFU1BNSVNDKCgiYm9ndXMgbXNnb3V0IHNlbmRpbmcgTk9QXG4iKSk7Ci0JCWVzcC0+Y3VyX21zZ291dFswXSA9IE5PUDsKLQkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfZmRhdGEsIGVzcC0+Y3VyX21zZ291dFswXSk7Ci0JCWVzcC0+bXNnb3V0X2xlbiA9IDE7Ci0JCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9USSk7Ci0JCWJyZWFrOwotCX0KLQllc3BfYWR2YW5jZV9waGFzZShlc3AtPmN1cnJlbnRfU0MsIGluX21zZ291dGRvbmUpOwotCXJldHVybiBkb19pbnRyX2VuZDsKLX0KLQotc3RhdGljIGludCBlc3BfZG9fbXNnb3V0ZG9uZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCAKLQkJCSAgICAgc3RydWN0IEVTUF9yZWdzICplcmVncykKLXsKLQlpZigoZXNwLT5tc2dvdXRfbGVuID4gMSkgJiYgZXNwLT5kbWFfYmFycmllcikKLQkJZXNwLT5kbWFfYmFycmllcihlc3ApOwotCi0JaWYoIShlc3AtPmlyZWcgJiBFU1BfSU5UUl9EQykpIHsKLQkJZXNwX2NtZChlc3AsIGVyZWdzLCBFU1BfQ01EX05VTEwpOwotCQlzd2l0Y2goZXNwLT5zcmVnICYgRVNQX1NUQVRfUE1BU0spIHsKLQkJY2FzZSBFU1BfTU9QOgotCQkJLyogd2hvb3BzLCBwYXJpdHkgZXJyb3IgKi8KLQkJCUVTUExPRygoImVzcCVkOiBzdGlsbCBpbiBtc2dvdXQsIHBhcml0eSBlcnJvciBhc3N1bWVkXG4iLAotCQkJCWVzcC0+ZXNwX2lkKSk7Ci0JCQlpZihlc3AtPm1zZ291dF9sZW4gPiAxKQotCQkJCWVzcF9jbWQoZXNwLCBlcmVncywgRVNQX0NNRF9TQVROKTsKLQkJCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fbXNnb3V0KTsKLQkJCXJldHVybiBkb193b3JrX2J1czsKLQotCQljYXNlIEVTUF9ESVA6Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJaWYoIWZjb3VudChlc3AsIGVyZWdzKSAmJgotCQkJICAgISgoKHN0cnVjdCBlc3BfZGV2aWNlICopZXNwLT5jdXJyZW50X1NDLT5kZXZpY2UtPmhvc3RkYXRhKS0+c3luY19tYXhfb2Zmc2V0KSkKLQkJCQllc3BfY21kKGVzcCwgZXJlZ3MsIEVTUF9DTURfRkxVU0gpOwotCQkJYnJlYWs7Ci0KLQkJfTsKLQl9Ci0KLQkvKiBJZiB3ZSBzZW50IG91dCBhIHN5bmNocm9ub3VzIG5lZ290aWF0aW9uIG1lc3NhZ2UsIHVwZGF0ZQotCSAqIG91ciBzdGF0ZS4KLQkgKi8KLQlpZihlc3AtPmN1cl9tc2dvdXRbMl0gPT0gRVhURU5ERURfTUVTU0FHRSAmJgotCSAgIGVzcC0+Y3VyX21zZ291dFs0XSA9PSBFWFRFTkRFRF9TRFRSKSB7Ci0JCWVzcC0+c25pcCA9IDE7IC8qIGFuYWwgcmV0ZW50aXZlbmVzcy4uLiAqLwotCX0KLQotCWVzcC0+cHJldm1zZ291dCA9IGVzcC0+Y3VyX21zZ291dFswXTsKLQllc3AtPm1zZ291dF9sZW4gPSAwOwotCWVzcF9hZHZhbmNlX3BoYXNlKGVzcC0+Y3VycmVudF9TQywgaW5fdGhlX2RhcmspOwotCXJldHVybiBlc3BfZG9fcGhhc2VfZGV0ZXJtaW5lKGVzcCwgZXJlZ3MpOwotfQotCi1zdGF0aWMgaW50IGVzcF9idXNfdW5leHBlY3RlZChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQotewotCUVTUExPRygoImVzcCVkOiBjb21tYW5kIGluIHdlaXJkIHN0YXRlICUyeFxuIiwKLQkJZXNwLT5lc3BfaWQsIGVzcC0+Y3VycmVudF9TQy0+U0NwLnBoYXNlKSk7Ci0JcmV0dXJuIGRvX3Jlc2V0X2J1czsKLX0KLQotc3RhdGljIGVzcGZ1bmNfdCBidXNfdmVjdG9yW10gPSB7Ci0JZXNwX2RvX2RhdGFfZmluYWxlLAotCWVzcF9kb19kYXRhX2ZpbmFsZSwKLQllc3BfYnVzX3VuZXhwZWN0ZWQsCi0JZXNwX2RvX21zZ2luLAotCWVzcF9kb19tc2dpbmNvbnQsCi0JZXNwX2RvX21zZ2luZG9uZSwKLQllc3BfZG9fbXNnb3V0LAotCWVzcF9kb19tc2dvdXRkb25lLAotCWVzcF9kb19jbWRiZWdpbiwKLQllc3BfZG9fY21kZG9uZSwKLQllc3BfZG9fc3RhdHVzLAotCWVzcF9kb19mcmVlYnVzLAotCWVzcF9kb19waGFzZV9kZXRlcm1pbmUsCi0JZXNwX2J1c191bmV4cGVjdGVkLAotCWVzcF9idXNfdW5leHBlY3RlZCwKLQllc3BfYnVzX3VuZXhwZWN0ZWQsCi19OwotCi0vKiBUaGlzIGlzIHRoZSBzZWNvbmQgdGllciBpbiBvdXIgZHVhbC1sZXZlbCBTQ1NJIHN0YXRlIG1hY2hpbmUuICovCi1zdGF0aWMgaW50IGVzcF93b3JrX2J1cyhzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKQotewotCVNjc2lfQ21uZCAqU0NwdHIgPSBlc3AtPmN1cnJlbnRfU0M7Ci0JdW5zaWduZWQgaW50IHBoYXNlOwotCi0JRVNQQlVTKCgiZXNwX3dvcmtfYnVzOiAiKSk7Ci0JaWYoIVNDcHRyKSB7Ci0JCUVTUEJVUygoInJlY29ubmVjdFxuIikpOwotCQlyZXR1cm4gZXNwX2RvX3JlY29ubmVjdChlc3AsIGVyZWdzKTsKLQl9Ci0JcGhhc2UgPSBTQ3B0ci0+U0NwLnBoYXNlOwotCWlmICgocGhhc2UgJiAweGYwKSA9PSBpbl9waGFzZXNfbWFzaykKLQkJcmV0dXJuIGJ1c192ZWN0b3JbKHBoYXNlICYgMHgwZildKGVzcCwgZXJlZ3MpOwotCWVsc2UgaWYoKHBoYXNlICYgMHhmMCkgPT0gaW5fc2xjdF9tYXNrKQotCQlyZXR1cm4gZXNwX3NlbGVjdF9jb21wbGV0ZShlc3AsIGVyZWdzKTsKLQllbHNlCi0JCXJldHVybiBlc3BfYnVzX3VuZXhwZWN0ZWQoZXNwLCBlcmVncyk7Ci19Ci0KLXN0YXRpYyBlc3BmdW5jX3QgaXN2Y192ZWN0b3JbXSA9IHsKLQlOVUxMLAotCWVzcF9kb19waGFzZV9kZXRlcm1pbmUsCi0JZXNwX2RvX3Jlc2V0YnVzLAotCWVzcF9maW5pc2hfcmVzZXQsCi0JZXNwX3dvcmtfYnVzCi19OwotCi0vKiBNYWluIGludGVycnVwdCBoYW5kbGVyIGZvciBhbiBlc3AgYWRhcHRlci4gKi8KLXZvaWQgZXNwX2hhbmRsZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotCXN0cnVjdCBFU1BfcmVncyAqZXJlZ3M7Ci0JU2NzaV9DbW5kICpTQ3B0cjsKLQlpbnQgd2hhdF9uZXh0ID0gZG9faW50cl9lbmQ7Ci0JZXJlZ3MgPSBlc3AtPmVyZWdzOwotCVNDcHRyID0gZXNwLT5jdXJyZW50X1NDOwotCi0JaWYoZXNwLT5kbWFfaXJxX2VudHJ5KQotCQllc3AtPmRtYV9pcnFfZW50cnkoZXNwKTsKLQotCS8qIENoZWNrIGZvciBlcnJvcnMuICovCi0JZXNwLT5zcmVnID0gZXNwX3JlYWQoZXJlZ3MtPmVzcF9zdGF0dXMpOwotCWVzcC0+c3JlZyAmPSAofkVTUF9TVEFUX0lOVFIpOwotCWVzcC0+c2VxcmVnID0gKGVzcF9yZWFkKGVyZWdzLT5lc3Bfc3N0ZXApICYgRVNQX1NURVBfVkJJVFMpOwotCWVzcC0+aXJlZyA9IGVzcF9yZWFkKGVyZWdzLT5lc3BfaW50cnB0KTsgICAvKiBVbmxhdGNoIGludHIgYW5kIHN0YXQgcmVncyAqLwotCUVTUElSUSgoImhhbmRsZV9pcnE6IFtzcmVnPCUwMng+IHNzdGVwPCUwMng+IGlyZWc8JTAyeD5dXG4iLAotCQllc3AtPnNyZWcsIGVzcC0+c2VxcmVnLCBlc3AtPmlyZWcpKTsKLQlpZihlc3AtPnNyZWcgJiAoRVNQX1NUQVRfU1BBTSkpIHsKLQkJLyogR3Jvc3MgZXJyb3IsIGNvdWxkIGJlIGR1ZSB0byBvbmUgb2Y6Ci0JCSAqCi0JCSAqIC0gdG9wIG9mIGZpZm8gb3ZlcndyaXR0ZW4sIGNvdWxkIGJlIGJlY2F1c2UKLQkJICogICB3ZSB0cmllZCB0byBkbyBhIHN5bmNocm9ub3VzIHRyYW5zZmVyIHdpdGgKLQkJICogICBhbiBvZmZzZXQgZ3JlYXRlciB0aGFuIEVTUCBmaWZvIHNpemUKLQkJICoKLQkJICogLSB0b3Agb2YgY29tbWFuZCByZWdpc3RlciBvdmVyd3JpdHRlbgotCQkgKgotCQkgKiAtIERNQSBzZXR1cCB0byBnbyBpbiBvbmUgZGlyZWN0aW9uLCBTQ1NJCi0JCSAqICAgYnVzIHBvaW50cyBpbiB0aGUgb3RoZXIsIHdob29wcwotCQkgKgotCQkgKiAtIHdlaXJkIHBoYXNlIGNoYW5nZSBkdXJpbmcgYXN5bmNocm9ub3VzCi0JCSAqICAgZGF0YSBwaGFzZSB3aGlsZSB3ZSBhcmUgaW5pdGlhdG9yCi0JCSAqLwotCQlFU1BMT0coKCJlc3AlZDogR3Jvc3MgZXJyb3Igc3JlZz0lMnhcbiIsIGVzcC0+ZXNwX2lkLCBlc3AtPnNyZWcpKTsKLQotCQkvKiBJZiBhIGNvbW1hbmQgaXMgbGl2ZSBvbiB0aGUgYnVzIHdlIGNhbm5vdCBzYWZlbHkKLQkJICogcmVzZXQgdGhlIGJ1cywgc28gd2UnbGwganVzdCBsZXQgdGhlIHBpZWNlcyBmYWxsCi0JCSAqIHdoZXJlIHRoZXkgbWF5LiAgSGVyZSB3ZSBhcmUgaG9waW5nIHRoYXQgdGhlCi0JCSAqIHRhcmdldCB3aWxsIGJlIGFibGUgdG8gY2xlYW5seSBnbyBhd2F5IHNvb24KLQkJICogc28gd2UgY2FuIHNhZmVseSByZXNldCB0aGluZ3MuCi0JCSAqLwotCQlpZighU0NwdHIpIHsKLQkJCUVTUExPRygoImVzcCVkOiBObyBjdXJyZW50IGNtZCBkdXJpbmcgZ3Jvc3MgZXJyb3IsICIKLQkJCQkicmVzZXR0aW5nIGJ1c1xuIiwgZXNwLT5lc3BfaWQpKTsKLQkJCXdoYXRfbmV4dCA9IGRvX3Jlc2V0X2J1czsKLQkJCWdvdG8gc3RhdGVfbWFjaGluZTsKLQkJfQotCX0KLQotCS8qIE5vIGN1cnJlbnQgY21kIGlzIG9ubHkgdmFsaWQgYXQgdGhpcyBwb2ludCB3aGVuIHRoZXJlIGFyZQotCSAqIGNvbW1hbmRzIG9mZiB0aGUgYnVzIG9yIHdlIGFyZSB0cnlpbmcgYSByZXNldC4KLQkgKi8KLQlpZighU0NwdHIgJiYgIWVzcC0+ZGlzY29ubmVjdGVkX1NDICYmICEoZXNwLT5pcmVnICYgRVNQX0lOVFJfU1IpKSB7Ci0JCS8qIFBhbmljIGlzIHNhZmUsIHNpbmNlIGN1cnJlbnRfU0MgaXMgbnVsbC4gKi8KLQkJRVNQTE9HKCgiZXNwJWQ6IG5vIGNvbW1hbmQgaW4gZXNwX2hhbmRsZSgpXG4iLCBlc3AtPmVzcF9pZCkpOwotCQlwYW5pYygiZXNwX2hhbmRsZTogY3VycmVudF9TQyA9PSBwZW5ndWluIHdpdGhpbiBpbnRlcnJ1cHQhIik7Ci0JfQotCi0JaWYoZXNwLT5pcmVnICYgKEVTUF9JTlRSX0lDKSkgewotCQkvKiBJbGxlZ2FsIGNvbW1hbmQgZmVkIHRvIEVTUC4gIE91dHNpZGUgb2Ygb2J2aW91cwotCQkgKiBzb2Z0d2FyZSBidWdzIHRoYXQgY291bGQgY2F1c2UgdGhpcywgdGhlcmUgaXMKLQkJICogYSBjb25kaXRpb24gd2l0aCBFU1AxMDAgd2hlcmUgd2UgY2FuIGNvbmZ1c2UgdGhlCi0JCSAqIEVTUCBpbnRvIGFuIGVycm9uZW91cyBpbGxlZ2FsIGNvbW1hbmQgaW50ZXJydXB0Ci0JCSAqIGJlY2F1c2UgaXQgZG9lcyBub3Qgc2NyYXBlIHRoZSBGSUZPIHByb3Blcmx5Ci0JCSAqIGZvciByZXNlbGVjdGlvbi4gIFNlZSBlc3AxMDBfcmVjb25uZWN0X2h3YnVnKCkKLQkJICogdG8gc2VlIGhvdyB3ZSB0cnkgdmVyeSBoYXJkIHRvIGF2b2lkIHRoaXMuCi0JCSAqLwotCQlFU1BMT0coKCJlc3AlZDogaW52YWxpZCBjb21tYW5kXG4iLCBlc3AtPmVzcF9pZCkpOwotCi0JCWVzcF9kdW1wX3N0YXRlKGVzcCwgZXJlZ3MpOwotCi0JCWlmKFNDcHRyKSB7Ci0JCQkvKiBEZXZpY2VzIHdpdGggdmVyeSBidWdneSBmaXJtd2FyZSBjYW4gZHJvcCBCU1kKLQkJCSAqIGR1cmluZyBhIHNjYXR0ZXIgbGlzdCBpbnRlcnJ1cHQgd2hlbiB1c2luZyBzeW5jCi0JCQkgKiBtb2RlIHRyYW5zZmVycy4gIFdlIGNvbnRpbnVlIHRoZSB0cmFuc2ZlciBhcwotCQkJICogZXhwZWN0ZWQsIHRoZSB0YXJnZXQgZHJvcHMgdGhlIGJ1cywgdGhlIEVTUAotCQkJICogZ2V0cyBjb25mdXNlZCwgYW5kIHdlIGdldCBhIGlsbGVnYWwgY29tbWFuZAotCQkJICogaW50ZXJydXB0IGJlY2F1c2UgdGhlIGJ1cyBpcyBpbiB0aGUgZGlzY29ubmVjdGVkCi0JCQkgKiBzdGF0ZSBub3cgYW5kIEVTUF9DTURfVEkgaXMgb25seSBhbGxvd2VkIHdoZW4KLQkJCSAqIGEgbmV4dXMgaXMgYWxpdmUgb24gdGhlIGJ1cy4KLQkJCSAqLwotCQkJRVNQTE9HKCgiZXNwJWQ6IEZvcmNpbmcgYXN5bmMgYW5kIGRpc2FibGluZyBkaXNjb25uZWN0IGZvciAiCi0JCQkJInRhcmdldCAlZFxuIiwgZXNwLT5lc3BfaWQsIFNDcHRyLT5kZXZpY2UtPmlkKSk7Ci0JCQlTQ3B0ci0+ZGV2aWNlLT5ib3JrZW4gPSAxOyAvKiBmb28gb24geW91ICovCi0JCX0KLQotCQl3aGF0X25leHQgPSBkb19yZXNldF9idXM7Ci0JfSBlbHNlIGlmKCEoZXNwLT5pcmVnICYgfihFU1BfSU5UUl9GRE9ORSB8IEVTUF9JTlRSX0JTRVJWIHwgRVNQX0lOVFJfREMpKSkgewotCQlpbnQgcGhhc2U7Ci0KLQkJaWYoU0NwdHIpIHsKLQkJCXBoYXNlID0gU0NwdHItPlNDcC5waGFzZTsKLQkJCWlmKHBoYXNlICYgaW5fcGhhc2VzX21hc2spIHsKLQkJCQl3aGF0X25leHQgPSBlc3Bfd29ya19idXMoZXNwLCBlcmVncyk7Ci0JCQl9IGVsc2UgaWYocGhhc2UgJiBpbl9zbGN0X21hc2spIHsKLQkJCQl3aGF0X25leHQgPSBlc3Bfc2VsZWN0X2NvbXBsZXRlKGVzcCwgZXJlZ3MpOwotCQkJfSBlbHNlIHsKLQkJCQlFU1BMT0coKCJlc3AlZDogaW50ZXJydXB0IGZvciBubyBnb29kIHJlYXNvbi4uLlxuIiwKLQkJCQkJZXNwLT5lc3BfaWQpKTsKLQkJCQl3aGF0X25leHQgPSBkb19pbnRyX2VuZDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUVTUExPRygoImVzcCVkOiBCU0VSViBvciBGRE9ORSBvciBEQyB3aGlsZSBTQ3B0cj09TlVMTFxuIiwKLQkJCQllc3AtPmVzcF9pZCkpOwotCQkJd2hhdF9uZXh0ID0gZG9fcmVzZXRfYnVzOwotCQl9Ci0JfSBlbHNlIGlmKGVzcC0+aXJlZyAmIEVTUF9JTlRSX1NSKSB7Ci0JCUVTUExPRygoImVzcCVkOiBTQ1NJIGJ1cyByZXNldCBpbnRlcnJ1cHRcbiIsIGVzcC0+ZXNwX2lkKSk7Ci0JCXdoYXRfbmV4dCA9IGRvX3Jlc2V0X2NvbXBsZXRlOwotCX0gZWxzZSBpZihlc3AtPmlyZWcgJiAoRVNQX0lOVFJfUyB8IEVTUF9JTlRSX1NBVE4pKSB7Ci0JCUVTUExPRygoImVzcCVkOiBBSUVFRSB3ZSBoYXZlIGJlZW4gc2VsZWN0ZWQgYnkgYW5vdGhlciBpbml0aWF0b3IhXG4iLAotCQkJZXNwLT5lc3BfaWQpKTsKLQkJd2hhdF9uZXh0ID0gZG9fcmVzZXRfYnVzOwotCX0gZWxzZSBpZihlc3AtPmlyZWcgJiBFU1BfSU5UUl9SU0VMKSB7Ci0JCWlmKCFTQ3B0cikgewotCQkJLyogVGhpcyBpcyBvay4gKi8KLQkJCXdoYXRfbmV4dCA9IGVzcF9kb19yZWNvbm5lY3QoZXNwLCBlcmVncyk7Ci0JCX0gZWxzZSBpZihTQ3B0ci0+U0NwLnBoYXNlICYgaW5fc2xjdF9tYXNrKSB7Ci0JCQkvKiBPbmx5IHNlbGVjdGlvbiBjb2RlIGtub3dzIGhvdyB0byBjbGVhbgotCQkJICogdXAgcHJvcGVybHkuCi0JCQkgKi8KLQkJCUVTUERJU0MoKCJSZXNlbGVjdGVkIGR1cmluZyBzZWxlY3Rpb24gYXR0ZW1wdFxuIikpOwotCQkJd2hhdF9uZXh0ID0gZXNwX3NlbGVjdF9jb21wbGV0ZShlc3AsIGVyZWdzKTsKLQkJfSBlbHNlIHsKLQkJCUVTUExPRygoImVzcCVkOiBSZXNlbGVjdGVkIHdoaWxlIGJ1cyBpcyBidXN5XG4iLAotCQkJCWVzcC0+ZXNwX2lkKSk7Ci0JCQl3aGF0X25leHQgPSBkb19yZXNldF9idXM7Ci0JCX0KLQl9Ci0KLQkvKiBUaGlzIGlzIHRpZXItb25lIGluIG91ciBkdWFsIGxldmVsIFNDU0kgc3RhdGUgbWFjaGluZS4gKi8KLXN0YXRlX21hY2hpbmU6Ci0Jd2hpbGUod2hhdF9uZXh0ICE9IGRvX2ludHJfZW5kKSB7Ci0JCWlmICh3aGF0X25leHQgPj0gZG9fcGhhc2VfZGV0ZXJtaW5lICYmCi0JCSAgICB3aGF0X25leHQgPCBkb19pbnRyX2VuZCkKLQkJCXdoYXRfbmV4dCA9IGlzdmNfdmVjdG9yW3doYXRfbmV4dF0oZXNwLCBlcmVncyk7Ci0JCWVsc2UgewotCQkJLyogc3RhdGUgaXMgY29tcGxldGVseSBsb3N0IDstKCAqLwotCQkJRVNQTE9HKCgiZXNwJWQ6IGludGVycnVwdCBlbmdpbmUgbG9zZXMgc3RhdGUsIHJlc2V0dGluZyBidXNcbiIsCi0JCQkJZXNwLT5lc3BfaWQpKTsKLQkJCXdoYXRfbmV4dCA9IGRvX3Jlc2V0X2J1czsKLQkJfQotCX0KLQlpZihlc3AtPmRtYV9pcnFfZXhpdCkKLQkJZXNwLT5kbWFfaXJxX2V4aXQoZXNwKTsKLX0KLUVYUE9SVF9TWU1CT0woZXNwX2hhbmRsZSk7Ci0KLSNpZm5kZWYgQ09ORklHX1NNUAotaXJxcmV0dXJuX3QgZXNwX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXN0cnVjdCBOQ1JfRVNQICplc3A7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgYWdhaW47Ci0Jc3RydWN0IFNjc2lfSG9zdCAqZGV2ID0gZGV2X2lkOwotCi0JLyogSGFuZGxlIGFsbCBFU1AgaW50ZXJydXB0cyBzaG93aW5nIGF0IHRoaXMgSVJRIGxldmVsLiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7Ci1yZXBlYXQ6Ci0JYWdhaW4gPSAwOwotCWZvcl9lYWNoX2VzcChlc3ApIHsKLSNpZm5kZWYgX19taXBzX18JICAgIAotCQlpZigoKGVzcCktPmlycSAmIDB4ZmYpID09IGlycSkgewotI2VuZGlmCQkgICAgCi0JCQlpZihlc3AtPmRtYV9pcnFfcChlc3ApKSB7Ci0JCQkJYWdhaW4gPSAxOwotCi0JCQkJZXNwLT5kbWFfaW50c19vZmYoZXNwKTsKLQotCQkJCUVTUElSUSgoIkklZCgiLCBlc3AtPmVzcF9pZCkpOwotCQkJCWVzcF9oYW5kbGUoZXNwKTsKLQkJCQlFU1BJUlEoKCIpIikpOwotCi0JCQkJZXNwLT5kbWFfaW50c19vbihlc3ApOwotCQkJfQotI2lmbmRlZiBfX21pcHNfXwkJICAgIAotCQl9Ci0jZW5kaWYJICAgIAotCX0KLQlpZihhZ2FpbikKLQkJZ290byByZXBlYXQ7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLSNlbHNlCi0vKiBGb3IgU01QIHdlIG9ubHkgc2VydmljZSBvbmUgRVNQIG9uIHRoZSBsaXN0IGxpc3QgYXQgb3VyIElSUSBsZXZlbCEgKi8KLWlycXJldHVybl90IGVzcF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgTkNSX0VTUCAqZXNwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IFNjc2lfSG9zdCAqZGV2ID0gZGV2X2lkOwotCQotCS8qIEhhbmRsZSBhbGwgRVNQIGludGVycnVwdHMgc2hvd2luZyBhdCB0aGlzIElSUSBsZXZlbC4gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOwotCWZvcl9lYWNoX2VzcChlc3ApIHsKLQkJaWYoKChlc3ApLT5pcnEgJiAweGYpID09IGlycSkgewotCQkJaWYoZXNwLT5kbWFfaXJxX3AoZXNwKSkgewotCQkJCWVzcC0+ZG1hX2ludHNfb2ZmKGVzcCk7Ci0KLQkJCQlFU1BJUlEoKCJJWyVkOiVkXSgiLAotCQkJCQlzbXBfcHJvY2Vzc29yX2lkKCksIGVzcC0+ZXNwX2lkKSk7Ci0JCQkJZXNwX2hhbmRsZShlc3ApOwotCQkJCUVTUElSUSgoIikiKSk7Ci0KLQkJCQllc3AtPmRtYV9pbnRzX29uKGVzcCk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCX0KLQl9Ci1vdXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLSNlbmRpZgotCi1pbnQgZXNwX3NsYXZlX2FsbG9jKHN0cnVjdCBzY3NpX2RldmljZSAqU0RwdHIpCi17Ci0Jc3RydWN0IGVzcF9kZXZpY2UgKmVzcF9kZXYgPQotCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgZXNwX2RldmljZSksIEdGUF9BVE9NSUMpOwotCi0JaWYgKCFlc3BfZGV2KQotCQlyZXR1cm4gLUVOT01FTTsKLQlTRHB0ci0+aG9zdGRhdGEgPSBlc3BfZGV2OwotCXJldHVybiAwOwotfQotCi12b2lkIGVzcF9zbGF2ZV9kZXN0cm95KHN0cnVjdCBzY3NpX2RldmljZSAqU0RwdHIpCi17Ci0Jc3RydWN0IE5DUl9FU1AgKmVzcCA9IChzdHJ1Y3QgTkNSX0VTUCAqKSBTRHB0ci0+aG9zdC0+aG9zdGRhdGE7Ci0KLQllc3AtPnRhcmdldHNfcHJlc2VudCAmPSB+KDEgPDwgc2Rldl9pZChTRHB0cikpOwotCWtmcmVlKFNEcHRyLT5ob3N0ZGF0YSk7Ci0JU0RwdHItPmhvc3RkYXRhID0gTlVMTDsKLX0KLQotI2lmZGVmIE1PRFVMRQotaW50IGluaXRfbW9kdWxlKHZvaWQpIHsgcmV0dXJuIDA7IH0KLXZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkge30KLXZvaWQgZXNwX3JlbGVhc2Uodm9pZCkKLXsKLQllc3BzX2luX3VzZS0tOwotCWVzcHNfcnVubmluZyA9IGVzcHNfaW5fdXNlOwotfQotRVhQT1JUX1NZTUJPTChlc3BfcmVsZWFzZSk7Ci0jZW5kaWYKLQotRVhQT1JUX1NZTUJPTChlc3BfYWJvcnQpOwotRVhQT1JUX1NZTUJPTChlc3BfYWxsb2NhdGUpOwotRVhQT1JUX1NZTUJPTChlc3BfZGVhbGxvY2F0ZSk7Ci1FWFBPUlRfU1lNQk9MKGVzcF9pbml0aWFsaXplKTsKLUVYUE9SVF9TWU1CT0woZXNwX2ludHIpOwotRVhQT1JUX1NZTUJPTChlc3BfcXVldWUpOwotRVhQT1JUX1NZTUJPTChlc3BfcmVzZXQpOwotRVhQT1JUX1NZTUJPTChlc3Bfc2xhdmVfYWxsb2MpOwotRVhQT1JUX1NZTUJPTChlc3Bfc2xhdmVfZGVzdHJveSk7Ci1FWFBPUlRfU1lNQk9MKGVzcHNfaW5fdXNlKTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL05DUjUzQzl4LmggYi9kcml2ZXJzL3Njc2kvTkNSNTNDOXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhMGJhMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Njc2kvTkNSNTNDOXguaAorKysgL2Rldi9udWxsCkBAIC0xLDY2OCArMCwwIEBACi0vKiBOQ1I1M0M5eC5jOiAgRGVmaW5lcyBhbmQgc3RydWN0dXJlcyBmb3IgdGhlIE5DUjUzQzl4IGdlbmVyaWMgZHJpdmVyLgotICoKLSAqIE9yaWdpbmFsbHkgZXNwLmg6ICBEZWZpbmVzIGFuZCBzdHJ1Y3R1cmVzIGZvciB0aGUgU3BhcmMgRVNQIAotICogICAgICAgICAgICAgICAgICAgKEVuaGFuY2VkIFNDU0kgUHJvY2Vzc29yKSBkcml2ZXIgdW5kZXIgTGludXguCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKLSAqCi0gKiBHZW5lcmFsaXphdGlvbiBieSBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKQotICoKLSAqIE1vcmUgZ2VuZXJhbGl6YXRpb24gKGZvciBpMzg2IHN0dWZmKSBieSBUeW1tIFR3aWxsbWFuICh0eW1tQGNvbXB1dGVyLm9yZykKLSAqLwotCi0jaWZuZGVmIE5DUjUzQzlYX0gKLSNkZWZpbmUgTkNSNTNDOVhfSAotCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KLS8qIGRqd2VpcyBmb3IgbWFjIGRyaXZlciAqLwotI2lmIGRlZmluZWQoQ09ORklHX01BQykKLSNkZWZpbmUgUEFEX1NJWkUgMTUKLSNlbHNlCi0jZGVmaW5lIFBBRF9TSVpFIDMKLSNlbmRpZgotCi0vKiBIYW5kbGUgbXVsdGlwbGUgaG9zdGFkYXB0ZXJzIG9uIEFtaWdhCi0gKiBnZW5lcmFsbHkgUEFEX1NJWkUgPSAzCi0gKiBidXQgdGhlcmUgaXMgb25lIGV4Y2VwdGlvbjogT2t0YWdvbiAoUEFEX1NJWkUgPSAxKSAqLwotI2lmIGRlZmluZWQoQ09ORklHX09LVEFHT05fU0NTSSkgfHwgZGVmaW5lZChDT05GSUdfT0tUQUdPTl9TQ1NJX01PRFVMRSkKLSN1bmRlZiBQQURfU0laRQotI2lmIGRlZmluZWQoQ09ORklHX0JMWjEyMzBfU0NTSSkgfHwgZGVmaW5lZChDT05GSUdfQkxaMTIzMF9TQ1NJX01PRFVMRSkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0JMWjIwNjBfU0NTSSkgfHwgZGVmaW5lZChDT05GSUdfQkxaMjA2MF9TQ1NJX01PRFVMRSkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NZQkVSU1RPUk1fU0NTSSkgfHwgZGVmaW5lZChDT05GSUdfQ1lCRVJTVE9STV9TQ1NJX01PRFVMRSkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NZQkVSU1RPUk1JSV9TQ1NJKSB8fCBkZWZpbmVkKENPTkZJR19DWUJFUlNUT1JNSUlfU0NTSV9NT0RVTEUpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19GQVNUTEFORV9TQ1NJKSB8fCBkZWZpbmVkKENPTkZJR19GQVNUTEFORV9TQ1NJX01PRFVMRSkKLSNkZWZpbmUgTVVMVElQTEVfUEFEX1NJWkVTCi0jZWxzZQotI2RlZmluZSBQQURfU0laRSAxCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBNYWNyb3MgZm9yIGRlYnVnZ2luZyBtZXNzYWdlcyAqLwotCi0jZGVmaW5lIERFQlVHX0VTUAotLyogI2RlZmluZSBERUJVR19FU1BfREFUQSAqLwotLyogI2RlZmluZSBERUJVR19FU1BfUVVFVUUgKi8KLS8qICNkZWZpbmUgREVCVUdfRVNQX0RJU0NPTk5FQ1QgKi8KLS8qICNkZWZpbmUgREVCVUdfRVNQX1NUQVRVUyAqLwotLyogI2RlZmluZSBERUJVR19FU1BfUEhBU0VTICovCi0vKiAjZGVmaW5lIERFQlVHX0VTUF9XT1JLQlVTICovCi0vKiAjZGVmaW5lIERFQlVHX1NUQVRFX01BQ0hJTkUgKi8KLS8qICNkZWZpbmUgREVCVUdfRVNQX0NNRFMgKi8KLS8qICNkZWZpbmUgREVCVUdfRVNQX0lSUVMgKi8KLS8qICNkZWZpbmUgREVCVUdfU0RUUiAqLwotLyogI2RlZmluZSBERUJVR19FU1BfU0cgKi8KLQotLyogVXNlIHRoZSBmb2xsb3dpbmcgdG8gc3ByaW5rbGUgZGVidWdnaW5nIG1lc3NhZ2VzIGluIGEgd2F5IHdoaWNoCi0gKiBzdWl0cyB5b3UgaWYgY29tYmluYXRpb25zIG9mIHRoZSBhYm92ZSBiZWNvbWUgdG9vIHZlcmJvc2Ugd2hlbgotICogdHJ5aW5nIHRvIHRyYWNrIGRvd24gYSBzcGVjaWZpYyBwcm9ibGVtLgotICovCi0vKiAjZGVmaW5lIERFQlVHX0VTUF9NSVNDICovCi0KLSNpZiBkZWZpbmVkKERFQlVHX0VTUCkKLSNkZWZpbmUgRVNQTE9HKGZvbykgIHByaW50ayBmb28KLSNlbHNlCi0jZGVmaW5lIEVTUExPRyhmb28pCi0jZW5kaWYgLyogKERFQlVHX0VTUCkgKi8KLQotI2lmIGRlZmluZWQoREVCVUdfRVNQX0RBVEEpCi0jZGVmaW5lIEVTUERBVEEoZm9vKSAgcHJpbnRrIGZvbwotI2Vsc2UKLSNkZWZpbmUgRVNQREFUQShmb28pCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoREVCVUdfRVNQX1FVRVVFKQotI2RlZmluZSBFU1BRVUVVRShmb28pICBwcmludGsgZm9vCi0jZWxzZQotI2RlZmluZSBFU1BRVUVVRShmb28pCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoREVCVUdfRVNQX0RJU0NPTk5FQ1QpCi0jZGVmaW5lIEVTUERJU0MoZm9vKSAgcHJpbnRrIGZvbwotI2Vsc2UKLSNkZWZpbmUgRVNQRElTQyhmb28pCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoREVCVUdfRVNQX1NUQVRVUykKLSNkZWZpbmUgRVNQU1RBVChmb28pICBwcmludGsgZm9vCi0jZWxzZQotI2RlZmluZSBFU1BTVEFUKGZvbykKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChERUJVR19FU1BfUEhBU0VTKQotI2RlZmluZSBFU1BQSEFTRShmb28pICBwcmludGsgZm9vCi0jZWxzZQotI2RlZmluZSBFU1BQSEFTRShmb28pCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoREVCVUdfRVNQX1dPUktCVVMpCi0jZGVmaW5lIEVTUEJVUyhmb28pICBwcmludGsgZm9vCi0jZWxzZQotI2RlZmluZSBFU1BCVVMoZm9vKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKERFQlVHX0VTUF9JUlFTKQotI2RlZmluZSBFU1BJUlEoZm9vKSAgcHJpbnRrIGZvbwotI2Vsc2UKLSNkZWZpbmUgRVNQSVJRKGZvbykKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChERUJVR19TRFRSKQotI2RlZmluZSBFU1BTRFRSKGZvbykgIHByaW50ayBmb28KLSNlbHNlCi0jZGVmaW5lIEVTUFNEVFIoZm9vKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKERFQlVHX0VTUF9NSVNDKQotI2RlZmluZSBFU1BNSVNDKGZvbykgIHByaW50ayBmb28KLSNlbHNlCi0jZGVmaW5lIEVTUE1JU0MoZm9vKQotI2VuZGlmCi0KLS8qCi0gKiBwYWRkaW5nIGZvciByZWdpc3RlciBzdHJ1Y3R1cmUKLSAqLwotI2lmZGVmIENPTkZJR19KQVpaX0VTUAotI2RlZmluZSBFUkVHU19QQUQobikKLSNlbHNlCi0jaWZuZGVmIE1VTFRJUExFX1BBRF9TSVpFUwotI2RlZmluZSBFUkVHU19QQUQobikgICAgdW5jaGFyIG5bUEFEX1NJWkVdOwotI2VuZGlmCi0jZW5kaWYKLQotLyogVGhlIEVTUCBTQ1NJIGNvbnRyb2xsZXJzIGhhdmUgdGhlaXIgcmVnaXN0ZXIgc2V0cyBpbiB0aHJlZQotICogImNsYXNzZXMiOgotICoKLSAqIDEpIFJlZ2lzdGVycyB3aGljaCBhcmUgYm90aCByZWFkIGFuZCB3cml0ZS4KLSAqIDIpIFJlZ2lzdGVycyB3aGljaCBhcmUgcmVhZCBvbmx5LgotICogMykgUmVnaXN0ZXJzIHdoaWNoIGFyZSB3cml0ZSBvbmx5LgotICoKLSAqIFlldCwgdGhleSBhbGwgbGl2ZSB3aXRoaW4gdGhlIHNhbWUgSU8gc3BhY2UuCi0gKi8KLQotI2lmICFkZWZpbmVkKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChfX3g4Nl82NF9fKQotCi0jaWZuZGVmIE1VTFRJUExFX1BBRF9TSVpFUwotCi0jaWZkZWYgQ09ORklHX0NQVV9IQVNfV0IKLSNpbmNsdWRlIDxhc20vd2JmbHVzaC5oPgotI2RlZmluZSBlc3Bfd3JpdGUoX19yZWcsIF9fdmFsKSBkb3soX19yZWcpID0gKF9fdmFsKTsgd2JmbHVzaCgpO30gd2hpbGUoMCkKLSNlbHNlCi0jZGVmaW5lIGVzcF93cml0ZShfX3JlZywgX192YWwpICgoX19yZWcpID0gKF9fdmFsKSkKLSNlbmRpZgotI2RlZmluZSBlc3BfcmVhZChfX3JlZykgKF9fcmVnKQotCi1zdHJ1Y3QgRVNQX3JlZ3MgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBY2Nlc3MgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgIE9mZnNldCAqLwotICAgIHZvbGF0aWxlIHVuY2hhciBlc3BfdGNsb3c7ICAvKiBydyAgTG93IGJpdHMgb2YgdGhlIHRyYW5zZmVyIGNvdW50IDB4MDAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUkVHU19QQUQodGxwYWQxKTsKLSAgICB2b2xhdGlsZSB1bmNoYXIgZXNwX3RjbWVkOyAgLyogcncgIE1pZCBiaXRzIG9mIHRoZSB0cmFuc2ZlciBjb3VudCAweDA0ICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJFR1NfUEFEKGZkcGFkKTsKLSAgICB2b2xhdGlsZSB1bmNoYXIgZXNwX2ZkYXRhOyAgLyogcncgIEZJRk8gZGF0YSBiaXRzICAgICAgICAgICAgICAgICAweDA4ICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJFR1NfUEFEKGNicGFkKTsKLSAgICB2b2xhdGlsZSB1bmNoYXIgZXNwX2NtbmQ7ICAgLyogcncgIFNDU0kgY29tbWFuZCBiaXRzICAgICAgICAgICAgICAweDBjICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJFR1NfUEFEKHN0cGFkKTsKLSAgICB2b2xhdGlsZSB1bmNoYXIgZXNwX3N0YXR1czsgLyogcm8gIEVTUCBzdGF0dXMgcmVnaXN0ZXIgICAgICAgICAgICAweDEwICAgKi8KLSNkZWZpbmUgZXNwX2J1c2lkICAgZXNwX3N0YXR1cyAgLyogd28gIEJ1cyBJRCBmb3Igc2VsZWN0L3Jlc2VsZWN0ICAgICAweDEwICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJFR1NfUEFEKGlycXBkKTsKLSAgICB2b2xhdGlsZSB1bmNoYXIgZXNwX2ludHJwdDsgLyogcm8gIEtpbmQgb2YgaW50ZXJydXB0ICAgICAgICAgICAgICAweDE0ICAgKi8KLSNkZWZpbmUgZXNwX3RpbWVvICAgZXNwX2ludHJwdCAgLyogd28gIFRpbWVvdXQgdmFsdWUgZm9yIHNlbGVjdC9yZXNlbCAweDE0ICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJFR1NfUEFEKHNzcGFkKTsKLSAgICB2b2xhdGlsZSB1bmNoYXIgZXNwX3NzdGVwOyAgLyogcm8gIFNlcXVlbmNlIHN0ZXAgcmVnaXN0ZXIgICAgICAgICAweDE4ICAgKi8KLSNkZWZpbmUgZXNwX3N0cCAgICAgZXNwX3NzdGVwICAgLyogd28gIFRyYW5zZmVyIHBlcmlvZCBwZXIgc3luYyAgICAgICAweDE4ICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJFR1NfUEFEKGZmcGFkKTsKLSAgICB2b2xhdGlsZSB1bmNoYXIgZXNwX2ZmbGFnczsgLyogcm8gIEJpdHMgb2YgY3VycmVudCBGSUZPIGluZm8gICAgICAweDFjICAgKi8KLSNkZWZpbmUgZXNwX3NvZmYgICAgZXNwX2ZmbGFncyAgLyogd28gIFN5bmMgb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAweDFjICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJFR1NfUEFEKGNmMXBkKTsKLSAgICB2b2xhdGlsZSB1bmNoYXIgZXNwX2NmZzE7ICAgLyogcncgIEZpcnN0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgICAweDIwICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJFR1NfUEFEKGNmcGFkKTsKLSAgICB2b2xhdGlsZSB1bmNoYXIgZXNwX2NmYWN0OyAgLyogd28gIENsb2NrIGNvbnZlcnNpb24gZmFjdG9yICAgICAgICAweDI0ICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJFR1NfUEFEKGN0cGFkKTsKLSAgICB2b2xhdGlsZSB1bmNoYXIgZXNwX2N0ZXN0OyAgLyogd28gIENoaXAgdGVzdCByZWdpc3RlciAgICAgICAgICAgICAweDI4ICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJFR1NfUEFEKGNmMnBkKTsKLSAgICB2b2xhdGlsZSB1bmNoYXIgZXNwX2NmZzI7ICAgLyogcncgIFNlY29uZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICAweDJjICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJFR1NfUEFEKGNmM3BkKTsKLQotICAgIC8qIFRoZSBmb2xsb3dpbmcgaXMgb25seSBmb3VuZCBvbiB0aGUgNTNDOVggc2VyaWVzIFNDU0kgY2hpcHMgKi8KLSAgICB2b2xhdGlsZSB1bmNoYXIgZXNwX2NmZzM7ICAgLyogcncgIFRoaXJkIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgICAweDMwICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUkVHU19QQUQoY2Y0cGQpOwotICAgIHZvbGF0aWxlIHVuY2hhciBlc3BfY2ZnNDsgICAvKiBydyAgRm91cnRoIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgIDB4MzQgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSRUdTX1BBRCh0aHBkKTsKLSAgICAvKiBUaGUgZm9sbG93aW5nIGlzIGZvdW5kIG9uIGFsbCBjaGlwcyBleGNlcHQgdGhlIE5DUjUzQzkwIChFU1AxMDApICovCi0gICAgdm9sYXRpbGUgdW5jaGFyIGVzcF90Y2hpOyAgIC8qIHJ3ICBIaWdoIGJpdHMgb2YgdHJhbnNmZXIgY291bnQgICAgMHgzOCAgKi8KLSNkZWZpbmUgZXNwX3VpZCAgICAgZXNwX3RjaGkgICAgLyogcm8gIFVuaXF1ZSBJRCBjb2RlICAgICAgICAgICAgICAgICAweDM4ICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUkVHU19QQUQoZmdwYWQpOyAgICAKLSAgICB2b2xhdGlsZSB1bmNoYXIgZXNwX2Zncm5kOyAgLyogcncgIERhdGEgYmFzZSBmb3IgZmlmbyAgICAgICAgICAgICAweDNjICAqLwotfTsKLQotI2Vsc2UgLyogTVVMVElQTEVfUEFEX1NJWkVTICovCi0KLSNkZWZpbmUgZXNwX3dyaXRlKF9fcmVnLCBfX3ZhbCkgKCooX19yZWcpID0gKF9fdmFsKSkKLSNkZWZpbmUgZXNwX3JlYWQoX19yZWcpICgqKF9fcmVnKSkKLQotc3RydWN0IEVTUF9yZWdzIHsKLSAgICB1bnNpZ25lZCBjaGFyIGlvX2FkZHJbNjRdOyAvKiBkdW1teSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFjY2VzcyAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgT2Zmc2V0ICovCi0jZGVmaW5lIGVzcF90Y2xvdyAgIGlvX2FkZHIgICAgICAgICAgICAgICAgICAgICAgLyogcncgIExvdyBiaXRzIG9mIHRoZSB0cmFuc2ZlciBjb3VudCAweDAwICAgKi8KLSNkZWZpbmUgZXNwX3RjbWVkICAgaW9fYWRkciArICgxPDwoZXNwLT5zaGlmdCkpICAvKiBydyAgTWlkIGJpdHMgb2YgdGhlIHRyYW5zZmVyIGNvdW50IDB4MDQgICAqLwotI2RlZmluZSBlc3BfZmRhdGEgICBpb19hZGRyICsgKDI8PChlc3AtPnNoaWZ0KSkgIC8qIHJ3ICBGSUZPIGRhdGEgYml0cyAgICAgICAgICAgICAgICAgMHgwOCAgICovCi0jZGVmaW5lIGVzcF9jbW5kICAgIGlvX2FkZHIgKyAoMzw8KGVzcC0+c2hpZnQpKSAgLyogcncgIFNDU0kgY29tbWFuZCBiaXRzICAgICAgICAgICAgICAweDBjICAgKi8KLSNkZWZpbmUgZXNwX3N0YXR1cyAgaW9fYWRkciArICg0PDwoZXNwLT5zaGlmdCkpICAvKiBybyAgRVNQIHN0YXR1cyByZWdpc3RlciAgICAgICAgICAgIDB4MTAgICAqLwotI2RlZmluZSBlc3BfYnVzaWQgICBlc3Bfc3RhdHVzICAgICAgICAgICAgICAgICAgIC8qIHdvICBCdXMgSUQgZm9yIHNlbGVjdC9yZXNlbGVjdCAgICAgMHgxMCAgICovCi0jZGVmaW5lIGVzcF9pbnRycHQgIGlvX2FkZHIgKyAoNTw8KGVzcC0+c2hpZnQpKSAgLyogcm8gIEtpbmQgb2YgaW50ZXJydXB0ICAgICAgICAgICAgICAweDE0ICAgKi8KLSNkZWZpbmUgZXNwX3RpbWVvICAgZXNwX2ludHJwdCAgICAgICAgICAgICAgICAgICAvKiB3byAgVGltZW91dCB2YWx1ZSBmb3Igc2VsZWN0L3Jlc2VsIDB4MTQgICAqLwotI2RlZmluZSBlc3Bfc3N0ZXAgICBpb19hZGRyICsgKDY8PChlc3AtPnNoaWZ0KSkgIC8qIHJvICBTZXF1ZW5jZSBzdGVwIHJlZ2lzdGVyICAgICAgICAgMHgxOCAgICovCi0jZGVmaW5lIGVzcF9zdHAgICAgIGVzcF9zc3RlcCAgICAgICAgICAgICAgICAgICAgLyogd28gIFRyYW5zZmVyIHBlcmlvZCBwZXIgc3luYyAgICAgICAweDE4ICAgKi8KLSNkZWZpbmUgZXNwX2ZmbGFncyAgaW9fYWRkciArICg3PDwoZXNwLT5zaGlmdCkpICAvKiBybyAgQml0cyBvZiBjdXJyZW50IEZJRk8gaW5mbyAgICAgIDB4MWMgICAqLwotI2RlZmluZSBlc3Bfc29mZiAgICBlc3BfZmZsYWdzICAgICAgICAgICAgICAgICAgIC8qIHdvICBTeW5jIG9mZnNldCAgICAgICAgICAgICAgICAgICAgMHgxYyAgICovCi0jZGVmaW5lIGVzcF9jZmcxICAgIGlvX2FkZHIgKyAoODw8KGVzcC0+c2hpZnQpKSAgLyogcncgIEZpcnN0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgICAweDIwICAgKi8KLSNkZWZpbmUgZXNwX2NmYWN0ICAgaW9fYWRkciArICg5PDwoZXNwLT5zaGlmdCkpICAvKiB3byAgQ2xvY2sgY29udmVyc2lvbiBmYWN0b3IgICAgICAgIDB4MjQgICAqLwotI2RlZmluZSBlc3BfY3Rlc3QgICBpb19hZGRyICsgKDEwPDwoZXNwLT5zaGlmdCkpIC8qIHdvICBDaGlwIHRlc3QgcmVnaXN0ZXIgICAgICAgICAgICAgMHgyOCAgICovCi0jZGVmaW5lIGVzcF9jZmcyICAgIGlvX2FkZHIgKyAoMTE8PChlc3AtPnNoaWZ0KSkgLyogcncgIFNlY29uZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICAweDJjICAgKi8KLQotICAgIC8qIFRoZSBmb2xsb3dpbmcgaXMgb25seSBmb3VuZCBvbiB0aGUgNTNDOVggc2VyaWVzIFNDU0kgY2hpcHMgKi8KLSNkZWZpbmUgZXNwX2NmZzMgICAgaW9fYWRkciArICgxMjw8KGVzcC0+c2hpZnQpKSAvKiBydyAgVGhpcmQgY29uZmlndXJhdGlvbiByZWdpc3RlciAgIDB4MzAgICovCi0jZGVmaW5lIGVzcF9jZmc0ICAgIGlvX2FkZHIgKyAoMTM8PChlc3AtPnNoaWZ0KSkgLyogcncgIEZvdXJ0aCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICAweDM0ICAqLwotCi0gICAgLyogVGhlIGZvbGxvd2luZyBpcyBmb3VuZCBvbiBhbGwgY2hpcHMgZXhjZXB0IHRoZSBOQ1I1M0M5MCAoRVNQMTAwKSAqLwotI2RlZmluZSBlc3BfdGNoaSAgICBpb19hZGRyICsgKDE0PDwoZXNwLT5zaGlmdCkpIC8qIHJ3ICBIaWdoIGJpdHMgb2YgdHJhbnNmZXIgY291bnQgICAgMHgzOCAgKi8KLSNkZWZpbmUgZXNwX3VpZCAgICAgZXNwX3RjaGkgICAgICAgICAgICAgICAgICAgICAvKiBybyAgVW5pcXVlIElEIGNvZGUgICAgICAgICAgICAgICAgIDB4MzggICovCi0jZGVmaW5lIGVzcF9mZ3JuZCAgIGlvX2FkZHIgKyAoMTU8PChlc3AtPnNoaWZ0KSkgLyogcncgIERhdGEgYmFzZSBmb3IgZmlmbyAgICAgICAgICAgICAweDNjICAqLwotfTsKLQotI2VuZGlmCi0KLSNlbHNlIC8qICFkZWZpbmVkKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChfX3g4Nl82NF9fKSAqLwotCi0jZGVmaW5lIGVzcF93cml0ZShfX3JlZywgX192YWwpIG91dGIoKF9fdmFsKSwgKF9fcmVnKSkKLSNkZWZpbmUgZXNwX3JlYWQoX19yZWcpIGluYigoX19yZWcpKQotCi1zdHJ1Y3QgRVNQX3JlZ3MgewotICAgIHVuc2lnbmVkIGludCBpb19hZGRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWNjZXNzICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICBPZmZzZXQgKi8KLSNkZWZpbmUgZXNwX3RjbG93ICAgaW9fYWRkciAgICAgIC8qIHJ3ICBMb3cgYml0cyBvZiB0aGUgdHJhbnNmZXIgY291bnQgMHgwMCAgICovCi0jZGVmaW5lIGVzcF90Y21lZCAgIGlvX2FkZHIgKyAxICAvKiBydyAgTWlkIGJpdHMgb2YgdGhlIHRyYW5zZmVyIGNvdW50IDB4MDQgICAqLwotI2RlZmluZSBlc3BfZmRhdGEgICBpb19hZGRyICsgMiAgLyogcncgIEZJRk8gZGF0YSBiaXRzICAgICAgICAgICAgICAgICAweDA4ICAgKi8KLSNkZWZpbmUgZXNwX2NtbmQgICAgaW9fYWRkciArIDMgIC8qIHJ3ICBTQ1NJIGNvbW1hbmQgYml0cyAgICAgICAgICAgICAgMHgwYyAgICovCi0jZGVmaW5lIGVzcF9zdGF0dXMgIGlvX2FkZHIgKyA0ICAvKiBybyAgRVNQIHN0YXR1cyByZWdpc3RlciAgICAgICAgICAgIDB4MTAgICAqLwotI2RlZmluZSBlc3BfYnVzaWQgICBlc3Bfc3RhdHVzICAgLyogd28gIEJ1cyBJRCBmb3Igc2VsZWN0L3Jlc2VsZWN0ICAgICAweDEwICAgKi8KLSNkZWZpbmUgZXNwX2ludHJwdCAgaW9fYWRkciArIDUgIC8qIHJvICBLaW5kIG9mIGludGVycnVwdCAgICAgICAgICAgICAgMHgxNCAgICovCi0jZGVmaW5lIGVzcF90aW1lbyAgIGVzcF9pbnRycHQgICAvKiB3byAgVGltZW91dCB2YWx1ZSBmb3Igc2VsZWN0L3Jlc2VsIDB4MTQgICAqLwotI2RlZmluZSBlc3Bfc3N0ZXAgICBpb19hZGRyICsgNiAgLyogcm8gIFNlcXVlbmNlIHN0ZXAgcmVnaXN0ZXIgICAgICAgICAweDE4ICAgKi8KLSNkZWZpbmUgZXNwX3N0cCAgICAgZXNwX3NzdGVwICAgIC8qIHdvICBUcmFuc2ZlciBwZXJpb2QgcGVyIHN5bmMgICAgICAgMHgxOCAgICovCi0jZGVmaW5lIGVzcF9mZmxhZ3MgIGlvX2FkZHIgKyA3ICAvKiBybyAgQml0cyBvZiBjdXJyZW50IEZJRk8gaW5mbyAgICAgIDB4MWMgICAqLwotI2RlZmluZSBlc3Bfc29mZiAgICBlc3BfZmZsYWdzICAgLyogd28gIFN5bmMgb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAweDFjICAgKi8KLSNkZWZpbmUgZXNwX2NmZzEgICAgaW9fYWRkciArIDggIC8qIHJ3ICBGaXJzdCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICAgMHgyMCAgICovCi0jZGVmaW5lIGVzcF9jZmFjdCAgIGlvX2FkZHIgKyA5ICAvKiB3byAgQ2xvY2sgY29udmVyc2lvbiBmYWN0b3IgICAgICAgIDB4MjQgICAqLwotI2RlZmluZSBlc3BfY3Rlc3QgICBpb19hZGRyICsgMTAgLyogd28gIENoaXAgdGVzdCByZWdpc3RlciAgICAgICAgICAgICAweDI4ICAgKi8KLSNkZWZpbmUgZXNwX2NmZzIgICAgaW9fYWRkciArIDExIC8qIHJ3ICBTZWNvbmQgY29uZmlndXJhdGlvbiByZWdpc3RlciAgMHgyYyAgICovCi0KLSAgICAvKiBUaGUgZm9sbG93aW5nIGlzIG9ubHkgZm91bmQgb24gdGhlIDUzQzlYIHNlcmllcyBTQ1NJIGNoaXBzICovCi0jZGVmaW5lIGVzcF9jZmczICAgIGlvX2FkZHIgKyAxMiAvKiBydyAgVGhpcmQgY29uZmlndXJhdGlvbiByZWdpc3RlciAgIDB4MzAgICovCi0jZGVmaW5lIGVzcF9jZmc0ICAgIGlvX2FkZHIgKyAxMyAvKiBydyAgRm91cnRoIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgIDB4MzQgICovCi0KLSAgICAvKiBUaGUgZm9sbG93aW5nIGlzIGZvdW5kIG9uIGFsbCBjaGlwcyBleGNlcHQgdGhlIE5DUjUzQzkwIChFU1AxMDApICovCi0jZGVmaW5lIGVzcF90Y2hpICAgIGlvX2FkZHIgKyAxNCAvKiBydyAgSGlnaCBiaXRzIG9mIHRyYW5zZmVyIGNvdW50ICAgIDB4MzggICovCi0jZGVmaW5lIGVzcF91aWQgICAgIGVzcF90Y2hpICAgICAvKiBybyAgVW5pcXVlIElEIGNvZGUgICAgICAgICAgICAgICAgIDB4MzggICovCi0jZGVmaW5lIGVzcF9mZ3JuZCAgIGlvX2FkZHIgKyAxNSAvKiBydyAgRGF0YSBiYXNlIGZvciBmaWZvICAgICAgICAgICAgIDB4M2MgICovCi19OwotCi0jZW5kaWYgLyogIWRlZmluZWQoX19pMzg2X18pICYmICFkZWZpbmVkKF9feDg2XzY0X18pICovCi0KLS8qIFZhcmlvdXMgcmV2aXNpb25zIG9mIHRoZSBFU1AgYm9hcmQuICovCi1lbnVtIGVzcF9yZXYgewotICBlc3AxMDAgICAgID0gMHgwMCwgIC8qIE5DUjUzQzkwIC0gdmVyeSBicm9rZW4gKi8KLSAgZXNwMTAwYSAgICA9IDB4MDEsICAvKiBOQ1I1M0M5MEEgKi8KLSAgZXNwMjM2ICAgICA9IDB4MDIsCi0gIGZhczIzNiAgICAgPSAweDAzLAotICBmYXMxMDBhICAgID0gMHgwNCwKLSAgZmFzdCAgICAgICA9IDB4MDUsCi0gIGZhczM2NiAgICAgPSAweDA2LAotICBmYXMyMTYgICAgID0gMHgwNywKLSAgZnNjICAgICAgICA9IDB4MDgsICAvKiBTWU01M0M5NC0yICovCi0gIGVzcHVua25vd24gPSAweDA5Ci19OwotCi0vKiBXZSBhbGxvY2F0ZSBvbmUgb2YgdGhlc2UgZm9yIGVhY2ggc2NzaSBkZXZpY2UgYW5kIGF0dGFjaCBpdCB0bwotICogU0RwdHItPmhvc3RkYXRhIGZvciB1c2UgaW4gdGhlIGRyaXZlcgotICovCi1zdHJ1Y3QgZXNwX2RldmljZSB7Ci0gIHVuc2lnbmVkIGNoYXIgc3luY19taW5fcGVyaW9kOwotICB1bnNpZ25lZCBjaGFyIHN5bmNfbWF4X29mZnNldDsKLSAgdW5zaWduZWQgc3luYzoxOwotICB1bnNpZ25lZCB3aWRlOjE7Ci0gIHVuc2lnbmVkIGRpc2Nvbm5lY3Q6MTsKLX07Ci0KLS8qIFdlIGdldCBvbmUgb2YgdGhlc2UgZm9yIGVhY2ggRVNQIHByb2JlZC4gKi8KLXN0cnVjdCBOQ1JfRVNQIHsKLSAgc3RydWN0IE5DUl9FU1AgKm5leHQ7ICAgICAgICAgICAgICAgICAgIC8qIE5leHQgRVNQIG9uIHByb2JlZCBvciBOVUxMICovCi0gIHN0cnVjdCBFU1BfcmVncyAqZXJlZ3M7CSAgICAgICAgICAvKiBBbGwgZXNwIHJlZ2lzdGVycyAqLwotICBpbnQgZG1hOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2hvIEkgZG8gdHJhbnNmZXJzIHdpdGguICovCi0gIHZvaWQgKmRyZWdzOwkJICAJCSAgLyogQW5kIGhpcyByZWdpc3RlcnMuICovCi0gIHN0cnVjdCBTY3NpX0hvc3QgKmVob3N0OyAgICAgICAgICAgICAgICAvKiBCYWNrcG9pbnRlciB0byBTQ1NJIEhvc3QgKi8KLQotICB2b2lkICplZGV2OyAgICAgICAgCQkgICAgICAgICAgLyogUG9pbnRlciB0byBjb250cm9sbGVyIGJhc2UvU0J1cyAqLwotICBpbnQgZXNwX2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVW5pcXVlIHBlci1FU1AgSUQgbnVtYmVyICovCi0KLSAgLyogRVNQIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXJzICovCi0gIHVuc2lnbmVkIGNoYXIgY29uZmlnMTsgICAgICAgICAgICAgICAgICAvKiBDb3B5IG9mIHRoZSAxc3QgY29uZmlnIHJlZ2lzdGVyICovCi0gIHVuc2lnbmVkIGNoYXIgY29uZmlnMjsgICAgICAgICAgICAgICAgICAvKiBDb3B5IG9mIHRoZSAybmQgY29uZmlnIHJlZ2lzdGVyICovCi0gIHVuc2lnbmVkIGNoYXIgY29uZmlnM1sxNl07ICAgICAgICAgICAgICAvKiBDb3B5IG9mIHRoZSAzcmQgY29uZmlnIHJlZ2lzdGVyICovCi0KLSAgLyogVGhlIGN1cnJlbnQgY29tbWFuZCB3ZSBhcmUgc2VuZGluZyB0byB0aGUgRVNQIGNoaXAuICBUaGlzIGVzcF9jb21tYW5kCi0gICAqIHB0ciBuZWVkcyB0byBiZSBtYXBwZWQgaW4gRFZNQSBhcmVhIHNvIHdlIGNhbiBzZW5kIGNvbW1hbmRzIGFuZCByZWFkCi0gICAqIGZyb20gdGhlIEVTUCBmaWZvIHdpdGhvdXQgYnVybmluZyBwcmVjaW91cyBDUFUgY3ljbGVzLiAgUHJvZ3JhbW1lZCBJL08KLSAgICogc3Vja3Mgd2hlbiB3ZSBoYXZlIHRoZSBEVk1BIHRvIGRvIGl0IGZvciB1cy4gIFRoZSBFU1AgaXMgc3R1cGlkIGFuZCB3aWxsCi0gICAqIG9ubHkgc2VuZCBvdXQgNiwgMTAsIGFuZCAxMiBieXRlIFNDU0kgY29tbWFuZHMsIG90aGVycyB3ZSBuZWVkIHRvIHNlbmQKLSAgICogb25lIGJ5dGUgYXQgYSB0aW1lLiAgZXNwX3Nsb3djbWQgYmVpbmcgc2V0IHNheXMgdGhhdCB3ZSBhcmUgZG9pbmcgb25lCi0gICAqIG9mIHRoZSBjb21tYW5kIHR5cGVzIEVTUCBkb2Vzbid0IHVuZGVyc3RhbmQsIGVzcF9zY21kcCBrZWVwcyB0cmFjayBvZgotICAgKiB3aGljaCBieXRlIHdlIGFyZSBzZW5kaW5nLCBlc3Bfc2NtZGxlZnQgc2F5cyBob3cgbWFueSBieXRlcyB0byBnby4KLSAgICovCi0gIHZvbGF0aWxlIHVuY2hhciAqZXNwX2NvbW1hbmQ7ICAgICAgICAgICAvKiBMb2NhdGlvbiBvZiBjb21tYW5kIChDUFUgdmlldykgICovCi0gIF9fdTMyICAgICAgICAgICAgZXNwX2NvbW1hbmRfZHZtYTsgICAgICAvKiBMb2NhdGlvbiBvZiBjb21tYW5kIChEVk1BIHZpZXcpICovCi0gIHVuc2lnbmVkIGNoYXIgZXNwX2NsZW47ICAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgdGhpcyBjb21tYW5kICovCi0gIHVuc2lnbmVkIGNoYXIgZXNwX3Nsb3djbWQ7Ci0gIHVuc2lnbmVkIGNoYXIgKmVzcF9zY21kcDsKLSAgdW5zaWduZWQgY2hhciBlc3Bfc2NtZGxlZnQ7Ci0KLSAgLyogVGhlIGZvbGxvd2luZyBhcmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNhdXNlIG9mIGFuIElSUS4gVXBvbiBldmVyeQotICAgKiBJUlEgZW50cnkgd2Ugc3luY2hyb25pemUgdGhlc2Ugd2l0aCB0aGUgaGFyZHdhcmUgcmVnaXN0ZXJzLgotICAgKi8KLSAgdW5jaGFyIGlyZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgb2YgRVNQIGludGVycnVwdCByZWdpc3RlciAqLwotICB1bmNoYXIgc3JlZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtZSBmb3IgRVNQIHN0YXR1cyByZWdpc3RlciAqLwotICB1bmNoYXIgc2VxcmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIEVTUCBzZXF1ZW5jZSByZWdpc3RlciAqLwotCi0gIC8qIFRoZSBmb2xsb3dpbmcgaXMgc2V0IHdoZW4gYSBwcmVtYXR1cmUgaW50ZXJydXB0IGNvbmRpdGlvbiBpcyBkZXRlY3RlZAotICAgKiBpbiBzb21lIEZBUyByZXZpc2lvbnMuCi0gICAqLwotICB1bmNoYXIgZmFzX3ByZW1hdHVyZV9pbnRyX3dvcmthcm91bmQ7Ci0KLSAgLyogVG8gc2F2ZSByZWdpc3RlciB3cml0ZXMgdG8gdGhlIEVTUCwgd2hpY2ggY2FuIGJlIGV4cGVuc2l2ZSwgd2UKLSAgICoga2VlcCB0cmFjayBvZiB0aGUgcHJldmlvdXMgdmFsdWUgdGhhdCB2YXJpb3VzIHJlZ2lzdGVycyBoYWQgZm9yCi0gICAqIHRoZSBsYXN0IHRhcmdldCB3ZSBjb25uZWN0ZWQgdG8uICBJZiB0aGV5IGFyZSB0aGUgc2FtZSBmb3IgdGhlCi0gICAqIGN1cnJlbnQgdGFyZ2V0LCB3ZSBza2lwIHRoZSByZWdpc3RlciB3cml0ZXMgYXMgdGhleSBhcmUgbm90IG5lZWRlZC4KLSAgICovCi0gIHVuY2hhciBwcmV2X3NvZmYsIHByZXZfc3RwLCBwcmV2X2NmZzM7Ci0KLSAgLyogRm9yIGVhY2ggdGFyZ2V0IHdlIGtlZXAgdHJhY2sgb2Ygc2F2ZS9yZXN0b3JlIGRhdGEKLSAgICogcG9pbnRlciBpbmZvcm1hdGlvbi4gIFRoaXMgbmVlZHMgdG8gYmUgdXBkYXRlZCBtYWpvcmx5Ci0gICAqIHdoZW4gd2UgYWRkIHN1cHBvcnQgZm9yIHRhZ2dlZCBxdWV1ZWluZy4gIC1EYXZlTQotICAgKi8KLSAgc3RydWN0IGVzcF9wb2ludGVycyB7Ci0JICBjaGFyICpzYXZlZF9wdHI7Ci0JICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNhdmVkX2J1ZmZlcjsKLQkgIGludCBzYXZlZF90aGlzX3Jlc2lkdWFsOwotCSAgaW50IHNhdmVkX2J1ZmZlcnNfcmVzaWR1YWw7Ci0gIH0gZGF0YV9wb2ludGVyc1sxNl0gLypYWFggW01BWF9UQUdTX1BFUl9UQVJHRVRdKi87Ci0KLSAgLyogQ2xvY2sgcGVyaW9kcywgZnJlcXVlbmNpZXMsIHN5bmNocm9uaXphdGlvbiwgZXRjLiAqLwotICB1bnNpZ25lZCBpbnQgY2ZyZXE7ICAgICAgICAgICAgICAgICAgICAvKiBDbG9jayBmcmVxdWVuY3kgaW4gSFogKi8KLSAgdW5zaWduZWQgaW50IGNmYWN0OyAgICAgICAgICAgICAgICAgICAgLyogQ2xvY2sgY29udmVyc2lvbiBmYWN0b3IgKi8KLSAgdW5zaWduZWQgaW50IGNjeWNsZTsgICAgICAgICAgICAgICAgICAgLyogT25lIEVTUCBjbG9jayBjeWNsZSAqLwotICB1bnNpZ25lZCBpbnQgY3RpY2s7ICAgICAgICAgICAgICAgICAgICAvKiBPbmUgRVNQIGNsb2NrIHRpbWUgKi8KLSAgdW5zaWduZWQgaW50IHJhZGVsYXk7ICAgICAgICAgICAgICAgICAgLyogRkFTVCBjaGlwIHJlcS9hY2sgZGVsYXkgKi8KLSAgdW5zaWduZWQgaW50IG5lZ19kZWZwOyAgICAgICAgICAgICAgICAgLyogRGVmYXVsdCBuZWdvdGlhdGlvbiBwZXJpb2QgKi8KLSAgdW5zaWduZWQgaW50IHN5bmNfZGVmcDsgICAgICAgICAgICAgICAgLyogRGVmYXVsdCBzeW5jIHRyYW5zZmVyIHBlcmlvZCAqLwotICB1bnNpZ25lZCBpbnQgbWF4X3BlcmlvZDsgICAgICAgICAgICAgICAvKiBsb25nZXN0IG91ciBwZXJpb2QgY2FuIGJlICovCi0gIHVuc2lnbmVkIGludCBtaW5fcGVyaW9kOyAgICAgICAgICAgICAgIC8qIHNob3J0ZXN0IHBlcmlvZCB3ZSBjYW4gd2l0aHN0YW5kICovCi0gIC8qIEZvciBzbG93IHRvIG1lZGl1bSBzcGVlZCBpbnB1dCBjbG9jayByYXRlcyB3ZSBzaG9vdCBmb3IgNW1iL3MsCi0gICAqIGJ1dCBmb3IgaGlnaCBpbnB1dCBjbG9jayByYXRlcyB3ZSB0cnkgdG8gZG8gMTBtYi9zIGFsdGhvdWdoIEkKLSAgICogZG9uJ3QgdGhpbmsgYSB0cmFuc2ZlciBjYW4gZXZlbiBydW4gdGhhdCBmYXN0IHdpdGggYW4gRVNQIGV2ZW4KLSAgICogd2l0aCBETUEyIHNjYXR0ZXIgZ2F0aGVyIHBpcGVsaW5pbmcuCi0gICAqLwotI2RlZmluZSBTWU5DX0RFRlBfU0xPVyAgICAgICAgICAgIDB4MzIgICAvKiA1bWIvcyAgKi8KLSNkZWZpbmUgU1lOQ19ERUZQX0ZBU1QgICAgICAgICAgICAweDE5ICAgLyogMTBtYi9zICovCi0KLSAgdW5zaWduZWQgaW50IHNuaXA7ICAgICAgICAgICAgICAgICAgICAgIC8qIFN5bmMuIG5lZ290aWF0aW9uIGluIHByb2dyZXNzICovCi0gIHVuc2lnbmVkIGludCB3bmlwOyAgICAgICAgICAgICAgICAgICAgICAvKiBXSURFIG5lZ290aWF0aW9uIGluIHByb2dyZXNzICovCi0gIHVuc2lnbmVkIGludCB0YXJnZXRzX3ByZXNlbnQ7ICAgICAgICAgICAvKiB0YXJnZXRzIHNwb2tlbiB0byBiZWZvcmUgKi8KLQotICBpbnQgY3VycmVudF90cmFuc2Zlcl9zaXplOyAgICAgICAgICAgICAgLyogU2V0IGF0IGJlZ2lubmluZyBvZiBkYXRhIGRtYSAqLwotCi0gIHVuY2hhciBlc3BjbWRsb2dbMzJdOyAgICAgICAgICAgICAgICAgICAvKiBMb2cgb2YgY3VycmVudCBlc3AgY21kcyBzZW50LiAqLwotICB1bmNoYXIgZXNwY21kZW50OyAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBlbnRyeSBpbiBlc3AgY21kIGxvZy4gKi8KLQotICAvKiBNaXNjLiBpbmZvIGFib3V0IHRoaXMgRVNQICovCi0gIGVudW0gZXNwX3JldiBlcmV2OyAgICAgICAgICAgICAgICAgICAgICAvKiBFU1AgcmV2aXNpb24gKi8KLSAgaW50IGlycTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElSUSBmb3IgdGhpcyBFU1AgKi8KLSAgaW50IHNjc2lfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdobyBhbSBJIGFzIGluaXRpYXRvcj8gKi8KLSAgaW50IHNjc2lfaWRfbWFzazsgICAgICAgICAgICAgICAgICAgICAgIC8qIEJpdG1hc2sgb2YgJ21lJy4gKi8KLSAgaW50IGRpZmY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpZmZlcmVudGlhbCBTQ1NJIGJ1cz8gKi8KLSAgaW50IHNsb3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNsb3QgdGhlIGFkYXB0ZXIgb2NjdXBpZXMgKi8KLQotICAvKiBPdXIgY29tbWFuZCBxdWV1ZXMsIG9ubHkgb25lIGNtZCBsaXZlcyBpbiB0aGUgY3VycmVudF9TQyBxdWV1ZS4gKi8KLSAgU2NzaV9DbW5kICppc3N1ZV9TQzsgICAgICAgICAgIC8qIENvbW1hbmRzIHRvIGJlIGlzc3VlZCAqLwotICBTY3NpX0NtbmQgKmN1cnJlbnRfU0M7ICAgICAgICAgLyogV2hvIGlzIGN1cnJlbnRseSB3b3JraW5nIHRoZSBidXMgKi8KLSAgU2NzaV9DbW5kICpkaXNjb25uZWN0ZWRfU0M7ICAgIC8qIENvbW1hbmRzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBidXMgKi8KLQotICAvKiBNZXNzYWdlIGdvbyAqLwotICB1bmNoYXIgY3VyX21zZ291dFsxNl07Ci0gIHVuY2hhciBjdXJfbXNnaW5bMTZdOwotICB1bmNoYXIgcHJldm1zZ291dCwgcHJldm1zZ2luOwotICB1bmNoYXIgbXNnb3V0X2xlbiwgbXNnaW5fbGVuOwotICB1bmNoYXIgbXNnb3V0X2N0ciwgbXNnaW5fY3RyOwotCi0gIC8qIFN0YXRlcyB0aGF0IHdlIGNhbm5vdCBrZWVwIGluIHRoZSBwZXIgY21kIHN0cnVjdHVyZSBiZWNhdXNlIHRoZXkKLSAgICogY2Fubm90IGJlIGFzc29zY2lhdGVkIHdpdGggYW55IHNwZWNpZmljIGNvbW1hbmQuCi0gICAqLwotICB1bmNoYXIgcmVzZXR0aW5nX2J1czsKLSAgd2FpdF9xdWV1ZV9oZWFkX3QgcmVzZXRfcXVldWU7Ci0KLSAgdW5jaGFyIGRvX3Bpb19jbWRzOwkJLyogRG8gY29tbWFuZCB0cmFuc2ZlciB3aXRoIHBpbyAqLwotCi0gIC8qIEhvdyBtdWNoIGJpdHMgZG8gd2UgaGF2ZSB0byBzaGlmdCB0aGUgcmVnaXN0ZXJzICovCi0gIHVuc2lnbmVkIGNoYXIgc2hpZnQ7Ci0KLSAgLyogRnVuY3Rpb25zIGhhbmRsaW5nIERNQQotICAgKi8gCi0gIC8qIFJlcXVpcmVkIGZ1bmN0aW9ucyAqLwotICBpbnQgICgqZG1hX2J5dGVzX3NlbnQpKHN0cnVjdCBOQ1JfRVNQICosIGludCk7Ci0gIGludCAgKCpkbWFfY2FuX3RyYW5zZmVyKShzdHJ1Y3QgTkNSX0VTUCAqLCBTY3NpX0NtbmQgKik7Ci0gIHZvaWQgKCpkbWFfZHVtcF9zdGF0ZSkoc3RydWN0IE5DUl9FU1AgKik7Ci0gIHZvaWQgKCpkbWFfaW5pdF9yZWFkKShzdHJ1Y3QgTkNSX0VTUCAqLCBfX3UzMiwgaW50KTsKLSAgdm9pZCAoKmRtYV9pbml0X3dyaXRlKShzdHJ1Y3QgTkNSX0VTUCAqLCBfX3UzMiwgaW50KTsKLSAgdm9pZCAoKmRtYV9pbnRzX29mZikoc3RydWN0IE5DUl9FU1AgKik7Ci0gIHZvaWQgKCpkbWFfaW50c19vbikoc3RydWN0IE5DUl9FU1AgKik7Ci0gIGludCAgKCpkbWFfaXJxX3ApKHN0cnVjdCBOQ1JfRVNQICopOwotICBpbnQgICgqZG1hX3BvcnRzX3ApKHN0cnVjdCBOQ1JfRVNQICopOwotICB2b2lkICgqZG1hX3NldHVwKShzdHJ1Y3QgTkNSX0VTUCAqLCBfX3UzMiwgaW50LCBpbnQpOwotCi0gIC8qIE9wdGlvbmFsIGZ1bmN0aW9ucyAoaS5lLiBtYXkgYmUgaW5pdGlhbGl6ZWQgdG8gMCkgKi8KLSAgdm9pZCAoKmRtYV9iYXJyaWVyKShzdHJ1Y3QgTkNSX0VTUCAqKTsKLSAgdm9pZCAoKmRtYV9kcmFpbikoc3RydWN0IE5DUl9FU1AgKik7Ci0gIHZvaWQgKCpkbWFfaW52YWxpZGF0ZSkoc3RydWN0IE5DUl9FU1AgKik7Ci0gIHZvaWQgKCpkbWFfaXJxX2VudHJ5KShzdHJ1Y3QgTkNSX0VTUCAqKTsKLSAgdm9pZCAoKmRtYV9pcnFfZXhpdCkoc3RydWN0IE5DUl9FU1AgKik7Ci0gIHZvaWQgKCpkbWFfbGVkX29mZikoc3RydWN0IE5DUl9FU1AgKik7Ci0gIHZvaWQgKCpkbWFfbGVkX29uKShzdHJ1Y3QgTkNSX0VTUCAqKTsKLSAgdm9pZCAoKmRtYV9wb2xsKShzdHJ1Y3QgTkNSX0VTUCAqLCB1bnNpZ25lZCBjaGFyICopOwotICB2b2lkICgqZG1hX3Jlc2V0KShzdHJ1Y3QgTkNSX0VTUCAqKTsKLSAgICAKLSAgLyogT3B0aW9uYWwgdmlydHVhbCBETUEgZnVuY3Rpb25zICovCi0gIHZvaWQgKCpkbWFfbW11X2dldF9zY3NpX29uZSkoc3RydWN0IE5DUl9FU1AgKiwgU2NzaV9DbW5kICopOwotICB2b2lkICgqZG1hX21tdV9nZXRfc2NzaV9zZ2wpKHN0cnVjdCBOQ1JfRVNQICosIFNjc2lfQ21uZCAqKTsKLSAgdm9pZCAoKmRtYV9tbXVfcmVsZWFzZV9zY3NpX29uZSkoc3RydWN0IE5DUl9FU1AgKiwgU2NzaV9DbW5kICopOwotICB2b2lkICgqZG1hX21tdV9yZWxlYXNlX3Njc2lfc2dsKShzdHJ1Y3QgTkNSX0VTUCAqLCBTY3NpX0NtbmQgKik7Ci0gIHZvaWQgKCpkbWFfYWR2YW5jZV9zZykoU2NzaV9DbW5kICopOwotfTsKLQotLyogQml0ZmllbGQgbWVhbmluZ3MgZm9yIHRoZSBhYm92ZSByZWdpc3RlcnMuICovCi0KLS8qIEVTUCBjb25maWcgcmVnIDEsIHJlYWQtd3JpdGUsIGZvdW5kIG9uIGFsbCBFU1AgY2hpcHMgKi8KLSNkZWZpbmUgRVNQX0NPTkZJRzFfSUQgICAgICAgIDB4MDcgICAgICAgICAgICAgLyogTXkgQlVTIElEIGJpdHMgKi8KLSNkZWZpbmUgRVNQX0NPTkZJRzFfQ0hURVNUICAgIDB4MDggICAgICAgICAgICAgLyogRW5hYmxlIEVTUCBjaGlwIHRlc3RzICovCi0jZGVmaW5lIEVTUF9DT05GSUcxX1BFTkFCTEUgICAweDEwICAgICAgICAgICAgIC8qIEVuYWJsZSBwYXJpdHkgY2hlY2tzICovCi0jZGVmaW5lIEVTUF9DT05GSUcxX1BBUlRFU1QgICAweDIwICAgICAgICAgICAgIC8qIFBhcml0eSB0ZXN0IG1vZGUgZW5hYmxlZD8gKi8KLSNkZWZpbmUgRVNQX0NPTkZJRzFfU1JSRElTQUIgIDB4NDAgICAgICAgICAgICAgLyogRGlzYWJsZSBTQ1NJIHJlc2V0IHJlcG9ydHMgKi8KLSNkZWZpbmUgRVNQX0NPTkZJRzFfU0xDQUJMRSAgIDB4ODAgICAgICAgICAgICAgLyogRW5hYmxlIHNsb3cgY2FibGUgbW9kZSAqLwotCi0vKiBFU1AgY29uZmlnIHJlZyAyLCByZWFkLXdyaXRlLCBmb3VuZCBvbmx5IG9uIGVzcDEwMGErZXNwMjAwK2VzcDIzNitmc2MgY2hpcHMgKi8KLSNkZWZpbmUgRVNQX0NPTkZJRzJfRE1BUEFSSVRZIDB4MDEgICAgICAgICAgICAgLyogZW5hYmxlIERNQSBQYXJpdHkgKDIwMCwyMzYsZnNjKSAqLwotI2RlZmluZSBFU1BfQ09ORklHMl9SRUdQQVJJVFkgMHgwMiAgICAgICAgICAgICAvKiBlbmFibGUgcmVnIFBhcml0eSAoMjAwLDIzNixmc2MpICovCi0jZGVmaW5lIEVTUF9DT05GSUcyX0JBRFBBUklUWSAweDA0ICAgICAgICAgICAgIC8qIEJhZCBwYXJpdHkgdGFyZ2V0IGFib3J0ICAqLwotI2RlZmluZSBFU1BfQ09ORklHMl9TQ1NJMkVOQUIgMHgwOCAgICAgICAgICAgICAvKiBFbmFibGUgU0NTSS0yIGZlYXR1cmVzICh0bW9kZSBvbmx5KSAqLwotI2RlZmluZSBFU1BfQ09ORklHMl9ISSAgICAgICAgMHgxMCAgICAgICAgICAgICAvKiBIaWdoIEltcGVkYW5jZSBEUkVRID8/PyAgKi8KLSNkZWZpbmUgRVNQX0NPTkZJRzJfSE1FRkVOQUIgIDB4MTAgICAgICAgICAgICAgLyogSE1FIGZlYXR1cmVzIGVuYWJsZSAqLwotI2RlZmluZSBFU1BfQ09ORklHMl9CQ00gICAgICAgMHgyMCAgICAgICAgICAgICAvKiBFbmFibGUgYnl0ZS1jdHJsICgyMzYsZnNjKSAgICovCi0jZGVmaW5lIEVTUF9DT05GSUcyX0ZFTkFCICAgICAweDQwICAgICAgICAgICAgIC8qIEVuYWJsZSBmZWF0dXJlcyAoZmFzMTAwLGVzcDIxNixmc2MpICAgICAgKi8KLSNkZWZpbmUgRVNQX0NPTkZJRzJfU1BMICAgICAgIDB4NDAgICAgICAgICAgICAgLyogRW5hYmxlIHN0YXR1cy1waGFzZSBsYXRjaCAoZXNwMjM2KSAgICovCi0jZGVmaW5lIEVTUF9DT05GSUcyX1JGQiAgICAgICAweDgwICAgICAgICAgICAgIC8qIFJlc2VydmUgRklGTyBieXRlIChmc2MpICovCi0jZGVmaW5lIEVTUF9DT05GSUcyX01BR0lDICAgICAweGUwICAgICAgICAgICAgIC8qIEludmFsaWQgYml0cy4uLiAqLwotCi0vKiBFU1AgY29uZmlnIHJlZ2lzdGVyIDMgcmVhZC13cml0ZSwgZm91bmQgb25seSBlc3AyMzYrZmFzMjM2K2ZhczEwMGErZnNjIGNoaXBzICovCi0jZGVmaW5lIEVTUF9DT05GSUczX0ZDTE9DSyAgICAweDAxICAgICAgICAgICAgIC8qIEZBU1QgU0NTSSBjbG9jayByYXRlIChlc3AxMDBhL2ZhczM2NikgKi8KLSNkZWZpbmUgRVNQX0NPTkZJRzNfVEVNICAgICAgIDB4MDEgICAgICAgICAgICAgLyogRW5hYmxlIHRocmVzaC04IG1vZGUgKGVzcC9mYXMyMzYvZnNjKSAgKi8KLSNkZWZpbmUgRVNQX0NPTkZJRzNfRkFTVCAgICAgIDB4MDIgICAgICAgICAgICAgLyogRW5hYmxlIEZBU1QgU0NTSSAgICAgKGVzcDEwMGEpICovCi0jZGVmaW5lIEVTUF9DT05GSUczX0FETUEgICAgICAweDAyICAgICAgICAgICAgIC8qIEVuYWJsZSBhbHRlcm5hdGUtZG1hIChlc3AvZmFzMjM2L2ZzYykgICovCi0jZGVmaW5lIEVTUF9DT05GSUczX1RFTkIgICAgICAweDA0ICAgICAgICAgICAgIC8qIGdyb3VwMiBTQ1NJMiBzdXBwb3J0IChlc3AxMDBhKSAqLwotI2RlZmluZSBFU1BfQ09ORklHM19TUkIgICAgICAgMHgwNCAgICAgICAgICAgICAvKiBTYXZlIHJlc2lkdWFsIGJ5dGUgICAoZXNwL2ZhczIzNi9mc2MpICAqLwotI2RlZmluZSBFU1BfQ09ORklHM19UTVMgICAgICAgMHgwOCAgICAgICAgICAgICAvKiBUaHJlZS1ieXRlIG1zZydzIG9rICAoZXNwMTAwYSkgKi8KLSNkZWZpbmUgRVNQX0NPTkZJRzNfRkNMSyAgICAgIDB4MDggICAgICAgICAgICAgLyogRmFzdCBTQ1NJIGNsb2NrIHJhdGUgKGVzcC9mYXMyMzYvZnNjKSAgKi8KLSNkZWZpbmUgRVNQX0NPTkZJRzNfSURNU0cgICAgIDB4MTAgICAgICAgICAgICAgLyogSUQgbWVzc2FnZSBjaGVja2luZyAgKGVzcDEwMGEpICovCi0jZGVmaW5lIEVTUF9DT05GSUczX0ZTQ1NJICAgICAweDEwICAgICAgICAgICAgIC8qIEVuYWJsZSBGQVNUIFNDU0kgICAgIChlc3AvZmFzMjM2L2ZzYykgICovCi0jZGVmaW5lIEVTUF9DT05GSUczX0dUTSAgICAgICAweDIwICAgICAgICAgICAgIC8qIGdyb3VwMiBTQ1NJMiBzdXBwb3J0IChlc3AvZmFzMjM2L2ZzYykgICovCi0jZGVmaW5lIEVTUF9DT05GSUczX1RCTVMgICAgICAweDQwICAgICAgICAgICAgIC8qIFRocmVlLWJ5dGUgbXNnJ3Mgb2sgIChlc3AvZmFzMjM2L2ZzYykgICovCi0jZGVmaW5lIEVTUF9DT05GSUczX0lNUyAgICAgICAweDgwICAgICAgICAgICAgIC8qIElEIG1zZyBjaGsnbmcgICAgICAgIChlc3AvZmFzMjM2L2ZzYykgICovCi0KLS8qIEVTUCBjb25maWcgcmVnaXN0ZXIgNCByZWFkLXdyaXRlLCBmb3VuZCBvbmx5IG9uIGZzYyBjaGlwcyAqLwotI2RlZmluZSBFU1BfQ09ORklHNF9CQlRFICAgICAgMHgwMSAgICAgICAgICAgICAvKiBCYWNrLXRvLUJhY2sgdHJhbnNmZXIgZW5hYmxlICovCi0jZGVmaW5lIEVTUF9DT05GSUc0X1RFU1QgICAgICAweDAyICAgICAgICAgICAgIC8qIFRyYW5zZmVyIGNvdW50ZXIgdGVzdCBtb2RlICovCi0jZGVmaW5lIEVTUF9DT05GSUc0X0VBTiAgICAgICAweDA0ICAgICAgICAgICAgIC8qIEVuYWJsZSBBY3RpdmUgTmVnb3RpYXRpb24gKi8KLQotLyogRVNQIGNvbW1hbmQgcmVnaXN0ZXIgcmVhZC13cml0ZSAqLwotLyogR3JvdXAgMSBjb21tYW5kczogIFRoZXNlIG1heSBiZSBzZW50IGF0IGFueSBwb2ludCBpbiB0aW1lIHRvIHRoZSBFU1AKLSAqICAgICAgICAgICAgICAgICAgICBjaGlwLiAgTm9uZSBvZiB0aGVtIGNhbiBnZW5lcmF0ZSBpbnRlcnJ1cHRzICdjZXB0Ci0gKiAgICAgICAgICAgICAgICAgICAgdGhlICJTQ1NJIGJ1cyByZXNldCIgY29tbWFuZCBpZiB5b3UgaGF2ZSBub3QgZGlzYWJsZWQKLSAqICAgICAgICAgICAgICAgICAgICBTQ1NJIHJlc2V0IGludGVycnVwdHMgaW4gdGhlIGNvbmZpZzEgRVNQIHJlZ2lzdGVyLgotICovCi0jZGVmaW5lIEVTUF9DTURfTlVMTCAgICAgICAgICAweDAwICAgICAgICAgICAgIC8qIE51bGwgY29tbWFuZCwgaWUuIGEgbm9wICovCi0jZGVmaW5lIEVTUF9DTURfRkxVU0ggICAgICAgICAweDAxICAgICAgICAgICAgIC8qIEZJRk8gRmx1c2ggKi8KLSNkZWZpbmUgRVNQX0NNRF9SQyAgICAgICAgICAgIDB4MDIgICAgICAgICAgICAgLyogQ2hpcCByZXNldCAqLwotI2RlZmluZSBFU1BfQ01EX1JTICAgICAgICAgICAgMHgwMyAgICAgICAgICAgICAvKiBTQ1NJIGJ1cyByZXNldCAqLwotCi0vKiBHcm91cCAyIGNvbW1hbmRzOiAgRVNQIG11c3QgYmUgYW4gaW5pdGlhdG9yIGFuZCBjb25uZWN0ZWQgdG8gYSB0YXJnZXQKLSAqICAgICAgICAgICAgICAgICAgICBmb3IgdGhlc2UgY29tbWFuZHMgdG8gd29yay4KLSAqLwotI2RlZmluZSBFU1BfQ01EX1RJICAgICAgICAgICAgMHgxMCAgICAgICAgICAgICAvKiBUcmFuc2ZlciBJbmZvcm1hdGlvbiAqLwotI2RlZmluZSBFU1BfQ01EX0lDQ1NFUSAgICAgICAgMHgxMSAgICAgICAgICAgICAvKiBJbml0aWF0b3IgY21kIGNvbXBsZXRlIHNlcXVlbmNlICovCi0jZGVmaW5lIEVTUF9DTURfTU9LICAgICAgICAgICAweDEyICAgICAgICAgICAgIC8qIE1lc3NhZ2Ugb2tpZS1kb2tpZSAqLwotI2RlZmluZSBFU1BfQ01EX1RQQUQgICAgICAgICAgMHgxOCAgICAgICAgICAgICAvKiBUcmFuc2ZlciBQYWQgKi8KLSNkZWZpbmUgRVNQX0NNRF9TQVROICAgICAgICAgIDB4MWEgICAgICAgICAgICAgLyogU2V0IEFUTiAqLwotI2RlZmluZSBFU1BfQ01EX1JBVE4gICAgICAgICAgMHgxYiAgICAgICAgICAgICAvKiBEZS1hc3NlcnQgQVROICovCi0KLS8qIEdyb3VwIDMgY29tbWFuZHM6ICBFU1AgbXVzdCBiZSBpbiB0aGUgTVNHT1VUIG9yIE1TR0lOIHN0YXRlIGFuZCBiZSBjb25uZWN0ZWQKLSAqICAgICAgICAgICAgICAgICAgICB0byBhIHRhcmdldCBhcyB0aGUgaW5pdGlhdG9yIGZvciB0aGVzZSBjb21tYW5kcyB0byB3b3JrLgotICovCi0jZGVmaW5lIEVTUF9DTURfU01TRyAgICAgICAgICAweDIwICAgICAgICAgICAgIC8qIFNlbmQgbWVzc2FnZSAqLwotI2RlZmluZSBFU1BfQ01EX1NTVEFUICAgICAgICAgMHgyMSAgICAgICAgICAgICAvKiBTZW5kIHN0YXR1cyAqLwotI2RlZmluZSBFU1BfQ01EX1NEQVRBICAgICAgICAgMHgyMiAgICAgICAgICAgICAvKiBTZW5kIGRhdGEgKi8KLSNkZWZpbmUgRVNQX0NNRF9EU0VRICAgICAgICAgIDB4MjMgICAgICAgICAgICAgLyogRGlzY29udGludWUgU2VxdWVuY2UgKi8KLSNkZWZpbmUgRVNQX0NNRF9UU0VRICAgICAgICAgIDB4MjQgICAgICAgICAgICAgLyogVGVybWluYXRlIFNlcXVlbmNlICovCi0jZGVmaW5lIEVTUF9DTURfVENDU0VRICAgICAgICAweDI1ICAgICAgICAgICAgIC8qIFRhcmdldCBjbWQgY21wbHQgc2VxdWVuY2UgKi8KLSNkZWZpbmUgRVNQX0NNRF9EQ05DVCAgICAgICAgIDB4MjcgICAgICAgICAgICAgLyogRGlzY29ubmVjdCAqLwotI2RlZmluZSBFU1BfQ01EX1JNU0cgICAgICAgICAgMHgyOCAgICAgICAgICAgICAvKiBSZWNlaXZlIE1lc3NhZ2UgKi8KLSNkZWZpbmUgRVNQX0NNRF9SQ01EICAgICAgICAgIDB4MjkgICAgICAgICAgICAgLyogUmVjZWl2ZSBDb21tYW5kICovCi0jZGVmaW5lIEVTUF9DTURfUkRBVEEgICAgICAgICAweDJhICAgICAgICAgICAgIC8qIFJlY2VpdmUgRGF0YSAqLwotI2RlZmluZSBFU1BfQ01EX1JDU0VRICAgICAgICAgMHgyYiAgICAgICAgICAgICAvKiBSZWNlaXZlIGNtZCBzZXF1ZW5jZSAqLwotCi0vKiBHcm91cCA0IGNvbW1hbmRzOiAgVGhlIEVTUCBtdXN0IGJlIGluIHRoZSBkaXNjb25uZWN0ZWQgc3RhdGUgYW5kIG11c3QKLSAqICAgICAgICAgICAgICAgICAgICBub3QgYmUgY29ubmVjdGVkIHRvIGFueSB0YXJnZXRzIGFzIGluaXRpYXRvciBmb3IKLSAqICAgICAgICAgICAgICAgICAgICB0aGVzZSBjb21tYW5kcyB0byB3b3JrLgotICovCi0jZGVmaW5lIEVTUF9DTURfUlNFTCAgICAgICAgICAweDQwICAgICAgICAgICAgIC8qIFJlc2VsZWN0ICovCi0jZGVmaW5lIEVTUF9DTURfU0VMICAgICAgICAgICAweDQxICAgICAgICAgICAgIC8qIFNlbGVjdCB3L28gQVROICovCi0jZGVmaW5lIEVTUF9DTURfU0VMQSAgICAgICAgICAweDQyICAgICAgICAgICAgIC8qIFNlbGVjdCB3L0FUTiAqLwotI2RlZmluZSBFU1BfQ01EX1NFTEFTICAgICAgICAgMHg0MyAgICAgICAgICAgICAvKiBTZWxlY3Qgdy9BVE4gJiBTVE9QICovCi0jZGVmaW5lIEVTUF9DTURfRVNFTCAgICAgICAgICAweDQ0ICAgICAgICAgICAgIC8qIEVuYWJsZSBzZWxlY3Rpb24gKi8KLSNkZWZpbmUgRVNQX0NNRF9EU0VMICAgICAgICAgIDB4NDUgICAgICAgICAgICAgLyogRGlzYWJsZSBzZWxlY3Rpb25zICovCi0jZGVmaW5lIEVTUF9DTURfU0EzICAgICAgICAgICAweDQ2ICAgICAgICAgICAgIC8qIFNlbGVjdCB3L0FUTjMgKi8KLSNkZWZpbmUgRVNQX0NNRF9SU0VMMyAgICAgICAgIDB4NDcgICAgICAgICAgICAgLyogUmVzZWxlY3QzICovCi0KLS8qIFRoaXMgYml0IGVuYWJsZXMgdGhlIEVTUCdzIERNQSAqLwotI2RlZmluZSBFU1BfQ01EX0RNQSAgICAgICAgICAgMHg4MCAgICAgICAgICAgICAvKiBEbyBETUE/ICovCi0KLS8qIEVTUCBzdGF0dXMgcmVnaXN0ZXIgcmVhZC1vbmx5ICovCi0jZGVmaW5lIEVTUF9TVEFUX1BJTyAgICAgICAgICAweDAxICAgICAgICAgICAgIC8qIElPIHBoYXNlIGJpdCAqLwotI2RlZmluZSBFU1BfU1RBVF9QQ0QgICAgICAgICAgMHgwMiAgICAgICAgICAgICAvKiBDRCBwaGFzZSBiaXQgKi8KLSNkZWZpbmUgRVNQX1NUQVRfUE1TRyAgICAgICAgIDB4MDQgICAgICAgICAgICAgLyogTVNHIHBoYXNlIGJpdCAqLwotI2RlZmluZSBFU1BfU1RBVF9QTUFTSyAgICAgICAgMHgwNyAgICAgICAgICAgICAvKiBNYXNrIG9mIHBoYXNlIGJpdHMgKi8KLSNkZWZpbmUgRVNQX1NUQVRfVERPTkUgICAgICAgIDB4MDggICAgICAgICAgICAgLyogVHJhbnNmZXIgQ29tcGxldGVkICovCi0jZGVmaW5lIEVTUF9TVEFUX1RDTlQgICAgICAgICAweDEwICAgICAgICAgICAgIC8qIFRyYW5zZmVyIENvdW50ZXIgSXMgWmVybyAqLwotI2RlZmluZSBFU1BfU1RBVF9QRVJSICAgICAgICAgMHgyMCAgICAgICAgICAgICAvKiBQYXJpdHkgZXJyb3IgKi8KLSNkZWZpbmUgRVNQX1NUQVRfU1BBTSAgICAgICAgIDB4NDAgICAgICAgICAgICAgLyogUmVhbCBiYWQgZXJyb3IgKi8KLS8qIFRoaXMgaW5kaWNhdGVzIHRoZSAnaW50ZXJydXB0IHBlbmRpbmcnIGNvbmRpdGlvbiwgaXQgaXMgYSByZXNlcnZlZAotICogYml0IG9uIG9sZCByZXZzIG9mIHRoZSBFU1AgKEVTUDEwMCwgRVNQMTAwQSwgRkFTMTAwQSkuCi0gKi8KLSNkZWZpbmUgRVNQX1NUQVRfSU5UUiAgICAgICAgIDB4ODAgICAgICAgICAgICAgLyogSW50ZXJydXB0ICovCi0KLS8qIFRoZSBzdGF0dXMgcmVnaXN0ZXIgY2FuIGJlIG1hc2tlZCB3aXRoIEVTUF9TVEFUX1BNQVNLIGFuZCBjb21wYXJlZAotICogd2l0aCB0aGUgZm9sbG93aW5nIHZhbHVlcyB0byBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgcGhhc2UgdGhlIEVTUAotICogKGF0IGxlYXN0IHRoaW5rcyBpdCkgaXMgaW4uICBGb3Igb3VyIHB1cnBvc2VzIHdlIGFsc28gYWRkIG91ciBvd24KLSAqIHNvZnR3YXJlICdkb25lJyBiaXQgZm9yIG91ciBwaGFzZSBtYW5hZ2VtZW50IGVuZ2luZS4KLSAqLwotI2RlZmluZSBFU1BfRE9QICAgKDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGF0YSBPdXQgICovCi0jZGVmaW5lIEVTUF9ESVAgICAoRVNQX1NUQVRfUElPKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEYXRhIEluICAgKi8KLSNkZWZpbmUgRVNQX0NNRFAgIChFU1BfU1RBVF9QQ0QpICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgICAqLwotI2RlZmluZSBFU1BfU1RBVFAgKEVTUF9TVEFUX1BDRHxFU1BfU1RBVF9QSU8pICAgICAgICAgICAgICAgLyogU3RhdHVzICAgICovCi0jZGVmaW5lIEVTUF9NT1AgICAoRVNQX1NUQVRfUE1TR3xFU1BfU1RBVF9QQ0QpICAgICAgICAgICAgICAvKiBNZXNzYWdlIE91dCAqLwotI2RlZmluZSBFU1BfTUlQICAgKEVTUF9TVEFUX1BNU0d8RVNQX1NUQVRfUENEfEVTUF9TVEFUX1BJTykgLyogTWVzc2FnZSBJbiAqLwotCi0vKiBFU1AgaW50ZXJydXB0IHJlZ2lzdGVyIHJlYWQtb25seSAqLwotI2RlZmluZSBFU1BfSU5UUl9TICAgICAgICAgICAgMHgwMSAgICAgICAgICAgICAvKiBTZWxlY3Qgdy9vIEFUTiAqLwotI2RlZmluZSBFU1BfSU5UUl9TQVROICAgICAgICAgMHgwMiAgICAgICAgICAgICAvKiBTZWxlY3Qgdy9BVE4gKi8KLSNkZWZpbmUgRVNQX0lOVFJfUlNFTCAgICAgICAgIDB4MDQgICAgICAgICAgICAgLyogUmVzZWxlY3RlZCAqLwotI2RlZmluZSBFU1BfSU5UUl9GRE9ORSAgICAgICAgMHgwOCAgICAgICAgICAgICAvKiBGdW5jdGlvbiBkb25lICovCi0jZGVmaW5lIEVTUF9JTlRSX0JTRVJWICAgICAgICAweDEwICAgICAgICAgICAgIC8qIEJ1cyBzZXJ2aWNlICovCi0jZGVmaW5lIEVTUF9JTlRSX0RDICAgICAgICAgICAweDIwICAgICAgICAgICAgIC8qIERpc2Nvbm5lY3QgKi8KLSNkZWZpbmUgRVNQX0lOVFJfSUMgICAgICAgICAgIDB4NDAgICAgICAgICAgICAgLyogSWxsZWdhbCBjb21tYW5kIGdpdmVuICovCi0jZGVmaW5lIEVTUF9JTlRSX1NSICAgICAgICAgICAweDgwICAgICAgICAgICAgIC8qIFNDU0kgYnVzIHJlc2V0IGRldGVjdGVkICovCi0KLS8qIEludGVycnVwdCBzdGF0dXMgbWFjcm9zICovCi0jZGVmaW5lIEVTUF9TUkVTRVRfSVJRKGVzcCkgICgoZXNwKS0+aW50cmVnICYgKEVTUF9JTlRSX1NSKSkKLSNkZWZpbmUgRVNQX0lMTENNRF9JUlEoZXNwKSAgKChlc3ApLT5pbnRyZWcgJiAoRVNQX0lOVFJfSUMpKQotI2RlZmluZSBFU1BfU0VMRUNUX1dJVEhfQVROX0lSUShlc3ApICAgICAoKGVzcCktPmludHJlZyAmIChFU1BfSU5UUl9TQVROKSkKLSNkZWZpbmUgRVNQX1NFTEVDVF9XSVRIT1VUX0FUTl9JUlEoZXNwKSAgKChlc3ApLT5pbnRyZWcgJiAoRVNQX0lOVFJfUykpCi0jZGVmaW5lIEVTUF9TRUxFQ1RJT05fSVJRKGVzcCkgICgoRVNQX1NFTEVDVF9XSVRIX0FUTl9JUlEoZXNwKSkgfHwgICAgICAgICBcCi0JCQkJIChFU1BfU0VMRUNUX1dJVEhPVVRfQVROX0lSUShlc3ApKSkKLSNkZWZpbmUgRVNQX1JFU0VMRUNUSU9OX0lSUShlc3ApICAgICAgICAgKChlc3ApLT5pbnRyZWcgJiAoRVNQX0lOVFJfUlNFTCkpCi0KLS8qIEVTUCBzZXF1ZW5jZSBzdGVwIHJlZ2lzdGVyIHJlYWQtb25seSAqLwotI2RlZmluZSBFU1BfU1RFUF9WQklUUyAgICAgICAgMHgwNyAgICAgICAgICAgICAvKiBWYWxpZCBiaXRzICovCi0jZGVmaW5lIEVTUF9TVEVQX0FTRUwgICAgICAgICAweDAwICAgICAgICAgICAgIC8qIFNlbGVjdGlvbiZBcmJpdHJhdGUgY21wbHQgKi8KLSNkZWZpbmUgRVNQX1NURVBfU0lEICAgICAgICAgIDB4MDEgICAgICAgICAgICAgLyogT25lIG1zZyBieXRlIHNlbnQgKi8KLSNkZWZpbmUgRVNQX1NURVBfTkNNRCAgICAgICAgIDB4MDIgICAgICAgICAgICAgLyogV2FzIG5vdCBpbiBjb21tYW5kIHBoYXNlICovCi0jZGVmaW5lIEVTUF9TVEVQX1BQQyAgICAgICAgICAweDAzICAgICAgICAgICAgIC8qIEVhcmx5IHBoYXNlIGNoZyBjYXVzZWQgY21uZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBieXRlcyB0byBiZSBsb3N0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBFU1BfU1RFUF9GSU5JNCAgICAgICAgMHgwNCAgICAgICAgICAgICAvKiBDb21tYW5kIHdhcyBzZW50IG9rICovCi0KLS8qIEhvIGh1bSwgc29tZSBFU1AncyBzZXQgdGhlIHN0ZXAgcmVnaXN0ZXIgdG8gdGhpcyBhcyB3ZWxsLi4uICovCi0jZGVmaW5lIEVTUF9TVEVQX0ZJTkk1ICAgICAgICAweDA1Ci0jZGVmaW5lIEVTUF9TVEVQX0ZJTkk2ICAgICAgICAweDA2Ci0jZGVmaW5lIEVTUF9TVEVQX0ZJTkk3ICAgICAgICAweDA3Ci0jZGVmaW5lIEVTUF9TVEVQX1NPTSAgICAgICAgICAweDA4ICAgICAgICAgICAgIC8qIFN5bmNocm9ub3VzIE9mZnNldCBNYXggKi8KLQotLyogRVNQIGNoaXAtdGVzdCByZWdpc3RlciByZWFkLXdyaXRlICovCi0jZGVmaW5lIEVTUF9URVNUX1RBUkcgICAgICAgICAweDAxICAgICAgICAgICAgIC8qIFRhcmdldCB0ZXN0IG1vZGUgKi8KLSNkZWZpbmUgRVNQX1RFU1RfSU5JICAgICAgICAgIDB4MDIgICAgICAgICAgICAgLyogSW5pdGlhdG9yIHRlc3QgbW9kZSAqLwotI2RlZmluZSBFU1BfVEVTVF9UUyAgICAgICAgICAgMHgwNCAgICAgICAgICAgICAvKiBUcmlzdGF0ZSB0ZXN0IG1vZGUgKi8KLQotLyogRVNQIHVuaXF1ZSBJRCByZWdpc3RlciByZWFkLW9ubHksIGZvdW5kIG9uIGZhczIzNitmYXMxMDBhK2ZzYyBvbmx5ICovCi0jZGVmaW5lIEVTUF9VSURfRjEwMEEgICAgICAgICAweDAwICAgICAgICAgICAgIC8qIEZBUzEwMEEgICovCi0jZGVmaW5lIEVTUF9VSURfRjIzNiAgICAgICAgICAweDAyICAgICAgICAgICAgIC8qIEZBUzIzNiAgICovCi0jZGVmaW5lIEVTUF9VSURfRlNDICAgICAgICAgICAweGEyICAgICAgICAgICAgIC8qIE5DUjUzQ0Y5eC0yICAqLwotI2RlZmluZSBFU1BfVUlEX1JFViAgICAgICAgICAgMHgwNyAgICAgICAgICAgICAvKiBFU1AgcmV2aXNpb24gKi8KLSNkZWZpbmUgRVNQX1VJRF9GQU0gICAgICAgICAgIDB4ZjggICAgICAgICAgICAgLyogRVNQIGZhbWlseSAgICovCi0KLS8qIEVTUCBmaWZvIGZsYWdzIHJlZ2lzdGVyIHJlYWQtb25seSAqLwotLyogTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgaW1wbGllcyBhIDE2IGJ5dGUgRklGTyBvbiB0aGUgRVNQLiAqLwotI2RlZmluZSBFU1BfRkZfRkJZVEVTICAgICAgICAgMHgxZiAgICAgICAgICAgICAvKiBOdW0gYnl0ZXMgaW4gRklGTyAqLwotI2RlZmluZSBFU1BfRkZfT05PVFpFUk8gICAgICAgMHgyMCAgICAgICAgICAgICAvKiBvZmZzZXQgY3RyIG5vdCB6ZXJvIChlc3AxMDAsZnNjKSAqLwotI2RlZmluZSBFU1BfRkZfU1NURVAgICAgICAgICAgMHhlMCAgICAgICAgICAgICAvKiBTZXF1ZW5jZSBzdGVwICovCi0KLS8qIEVTUCBjbG9jayBjb252ZXJzaW9uIGZhY3RvciByZWdpc3RlciB3cml0ZS1vbmx5ICovCi0jZGVmaW5lIEVTUF9DQ0ZfRjAgICAgICAgICAgICAweDAwICAgICAgICAgICAgIC8qIDM1LjAxTUh6IC0gNDBNSHogKi8KLSNkZWZpbmUgRVNQX0NDRl9ORVZFUiAgICAgICAgIDB4MDEgICAgICAgICAgICAgLyogU2V0IGl0IHRvIHRoaXMgYW5kIGRpZSAqLwotI2RlZmluZSBFU1BfQ0NGX0YyICAgICAgICAgICAgMHgwMiAgICAgICAgICAgICAvKiAxME1IeiAqLwotI2RlZmluZSBFU1BfQ0NGX0YzICAgICAgICAgICAgMHgwMyAgICAgICAgICAgICAvKiAxMC4wMU1IeiAtIDE1TUh6ICovCi0jZGVmaW5lIEVTUF9DQ0ZfRjQgICAgICAgICAgICAweDA0ICAgICAgICAgICAgIC8qIDE1LjAxTUh6IC0gMjBNSHogKi8KLSNkZWZpbmUgRVNQX0NDRl9GNSAgICAgICAgICAgIDB4MDUgICAgICAgICAgICAgLyogMjAuMDFNSHogLSAyNU1IeiAqLwotI2RlZmluZSBFU1BfQ0NGX0Y2ICAgICAgICAgICAgMHgwNiAgICAgICAgICAgICAvKiAyNS4wMU1IeiAtIDMwTUh6ICovCi0jZGVmaW5lIEVTUF9DQ0ZfRjcgICAgICAgICAgICAweDA3ICAgICAgICAgICAgIC8qIDMwLjAxTUh6IC0gMzVNSHogKi8KLQotI2RlZmluZSBFU1BfQlVTX1RJTUVPVVQgICAgICAgIDI3NSAgICAgICAgICAgICAvKiBJbiBtaWxsaS1zZWNvbmRzICovCi0jZGVmaW5lIEVTUF9USU1FT19DT05TVCAgICAgICA4MTkyCi0jZGVmaW5lIEZTQ19USU1FT19DT05TVCAgICAgICA3NjY4Ci0jZGVmaW5lIEVTUF9ORUdfREVGUChtaHosIGNmYWN0KSBcCi0gICAgICAgICgoRVNQX0JVU19USU1FT1VUICogKChtaHopIC8gMTAwMCkpIC8gKDgxOTIgKiAoY2ZhY3QpKSkKLSNkZWZpbmUgRlNDX05FR19ERUZQKG1oeiwgY2ZhY3QpIFwKLSAgICAgICAgKChFU1BfQlVTX1RJTUVPVVQgKiAoKG1oeikgLyAxMDAwKSkgLyAoNzY2OCAqIChjZmFjdCkpKQotI2RlZmluZSBFU1BfTUhaX1RPX0NZQ0xFKG1oZXJ0eikgICgoMTAwMDAwMDAwMCkgLyAoKG1oZXJ0eikgLyAxMDAwKSkKLSNkZWZpbmUgRVNQX1RJQ0soY2NmLCBjeWNsZSkgICgoNzY4MiAqIChjY2YpICogKGN5Y2xlKSAvIDEwMDApKQotCi0KLS8qIFVHTFksIFVHTFksIFVHTFkhICovCi1leHRlcm4gaW50IG5lc3BzLCBlc3BzX2luX3VzZSwgZXNwc19ydW5uaW5nOwotCi0vKiBGb3Igb3VyIGludGVycnVwdCBlbmdpbmUuICovCi0jZGVmaW5lIGZvcl9lYWNoX2VzcChlc3ApIFwKLSAgICAgICAgZm9yKChlc3ApID0gZXNwY2hhaW47IChlc3ApOyAoZXNwKSA9IChlc3ApLT5uZXh0KQotCi0KLS8qIEV4dGVybmFsIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHZvaWQgZXNwX2Jvb3R1cF9yZXNldChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3QgRVNQX3JlZ3MgKmVyZWdzKTsKLWV4dGVybiBzdHJ1Y3QgTkNSX0VTUCAqZXNwX2FsbG9jYXRlKHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKiwgdm9pZCAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgZXNwX2RlYWxsb2NhdGUoc3RydWN0IE5DUl9FU1AgKik7Ci1leHRlcm4gdm9pZCBlc3BfcmVsZWFzZSh2b2lkKTsKLWV4dGVybiB2b2lkIGVzcF9pbml0aWFsaXplKHN0cnVjdCBOQ1JfRVNQICopOwotZXh0ZXJuIGlycXJldHVybl90IGVzcF9pbnRyKGludCwgdm9pZCAqKTsKLWV4dGVybiBjb25zdCBjaGFyICplc3BfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICopOwotZXh0ZXJuIGludCBlc3BfcXVldWUoU2NzaV9DbW5kICosIHZvaWQgKCpkb25lKShTY3NpX0NtbmQgKikpOwotZXh0ZXJuIGludCBlc3BfYWJvcnQoU2NzaV9DbW5kICopOwotZXh0ZXJuIGludCBlc3BfcmVzZXQoU2NzaV9DbW5kICopOwotZXh0ZXJuIGludCBlc3BfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLAotCQkJIGludCBpbm91dCk7Ci1leHRlcm4gaW50IGVzcF9zbGF2ZV9hbGxvYyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7Ci1leHRlcm4gdm9pZCBlc3Bfc2xhdmVfZGVzdHJveShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7Ci0jZW5kaWYgLyogIShOQ1I1M0M5WF9IKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvYWFjaGJhLmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNoYmEuYwppbmRleCBkNzIzNWY0Li5iZmQwZTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNoYmEuYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNoYmEuYwpAQCAtODU5LDQ0ICs4NTksMzEgQEAKIAkJCWxlMzJfdG9fY3B1KGRldi0+YWRhcHRlcl9pbmZvLnNlcmlhbFswXSksIGNpZCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNldF9zZW5zZSh1OCAqc2Vuc2VfYnVmLCB1OCBzZW5zZV9rZXksIHU4IHNlbnNlX2NvZGUsCi0JCSAgICAgIHU4IGFfc2Vuc2VfY29kZSwgdTggaW5jb3JyZWN0X2xlbmd0aCwKLQkJICAgICAgdTggYml0X3BvaW50ZXIsIHUxNiBmaWVsZF9wb2ludGVyLAotCQkgICAgICB1MzIgcmVzaWR1ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfc2Vuc2Uoc3RydWN0IHNlbnNlX2RhdGEgKnNlbnNlX2RhdGEsIHU4IHNlbnNlX2tleSwKKwl1OCBzZW5zZV9jb2RlLCB1OCBhX3NlbnNlX2NvZGUsIHU4IGJpdF9wb2ludGVyLCB1MTYgZmllbGRfcG9pbnRlcikKIHsKLQlzZW5zZV9idWZbMF0gPSAweEYwOwkvKiBTZW5zZSBkYXRhIHZhbGlkLCBlcnIgY29kZSA3MGggKGN1cnJlbnQgZXJyb3IpICovCisJdTggKnNlbnNlX2J1ZiA9ICh1OCAqKXNlbnNlX2RhdGE7CisJLyogU2Vuc2UgZGF0YSB2YWxpZCwgZXJyIGNvZGUgNzBoICovCisJc2Vuc2VfYnVmWzBdID0gMHg3MDsgLyogTm8gaW5mbyBmaWVsZCAqLwogCXNlbnNlX2J1ZlsxXSA9IDA7CS8qIFNlZ21lbnQgbnVtYmVyLCBhbHdheXMgemVybyAqLwogCi0JaWYgKGluY29ycmVjdF9sZW5ndGgpIHsKLQkJc2Vuc2VfYnVmWzJdID0gc2Vuc2Vfa2V5IHwgMHgyMDsvKiBTZXQgSUxJIGJpdCB8IHNlbnNlIGtleSAqLwotCQlzZW5zZV9idWZbM10gPSBCWVRFMyhyZXNpZHVlKTsKLQkJc2Vuc2VfYnVmWzRdID0gQllURTIocmVzaWR1ZSk7Ci0JCXNlbnNlX2J1Zls1XSA9IEJZVEUxKHJlc2lkdWUpOwotCQlzZW5zZV9idWZbNl0gPSBCWVRFMChyZXNpZHVlKTsKLQl9IGVsc2UKLQkJc2Vuc2VfYnVmWzJdID0gc2Vuc2Vfa2V5OwkvKiBTZW5zZSBrZXkgKi8KLQotCWlmIChzZW5zZV9rZXkgPT0gSUxMRUdBTF9SRVFVRVNUKQotCQlzZW5zZV9idWZbN10gPSAxMDsJLyogQWRkaXRpb25hbCBzZW5zZSBsZW5ndGggKi8KLQllbHNlCi0JCXNlbnNlX2J1Zls3XSA9IDY7CS8qIEFkZGl0aW9uYWwgc2Vuc2UgbGVuZ3RoICovCisJc2Vuc2VfYnVmWzJdID0gc2Vuc2Vfa2V5OwkvKiBTZW5zZSBrZXkgKi8KIAogCXNlbnNlX2J1ZlsxMl0gPSBzZW5zZV9jb2RlOwkvKiBBZGRpdGlvbmFsIHNlbnNlIGNvZGUgKi8KIAlzZW5zZV9idWZbMTNdID0gYV9zZW5zZV9jb2RlOwkvKiBBZGRpdGlvbmFsIHNlbnNlIGNvZGUgcXVhbGlmaWVyICovCisKIAlpZiAoc2Vuc2Vfa2V5ID09IElMTEVHQUxfUkVRVUVTVCkgewotCQlzZW5zZV9idWZbMTVdID0gMDsKKwkJc2Vuc2VfYnVmWzddID0gMTA7CS8qIEFkZGl0aW9uYWwgc2Vuc2UgbGVuZ3RoICovCiAKLQkJaWYgKHNlbnNlX2NvZGUgPT0gU0VOQ09ERV9JTlZBTElEX1BBUkFNX0ZJRUxEKQotCQkJc2Vuc2VfYnVmWzE1XSA9IDB4ODA7LyogU3RkIHNlbnNlIGtleSBzcGVjaWZpYyBmaWVsZCAqLworCQlzZW5zZV9idWZbMTVdID0gYml0X3BvaW50ZXI7CiAJCS8qIElsbGVnYWwgcGFyYW1ldGVyIGlzIGluIHRoZSBwYXJhbWV0ZXIgYmxvY2sgKi8KLQogCQlpZiAoc2Vuc2VfY29kZSA9PSBTRU5DT0RFX0lOVkFMSURfQ0RCX0ZJRUxEKQotCQkJc2Vuc2VfYnVmWzE1XSA9IDB4YzA7LyogU3RkIHNlbnNlIGtleSBzcGVjaWZpYyBmaWVsZCAqLworCQkJc2Vuc2VfYnVmWzE1XSB8PSAweGMwOy8qIFN0ZCBzZW5zZSBrZXkgc3BlY2lmaWMgZmllbGQgKi8KIAkJLyogSWxsZWdhbCBwYXJhbWV0ZXIgaXMgaW4gdGhlIENEQiBibG9jayAqLwotCQlzZW5zZV9idWZbMTVdIHw9IGJpdF9wb2ludGVyOwogCQlzZW5zZV9idWZbMTZdID0gZmllbGRfcG9pbnRlciA+PiA4OwkvKiBNU0IgKi8KIAkJc2Vuc2VfYnVmWzE3XSA9IGZpZWxkX3BvaW50ZXI7CQkvKiBMU0IgKi8KLQl9CisJfSBlbHNlCisJCXNlbnNlX2J1Zls3XSA9IDY7CS8qIEFkZGl0aW9uYWwgc2Vuc2UgbGVuZ3RoICovCiB9CiAKIHN0YXRpYyBpbnQgYWFjX2JvdW5kc18zMihzdHJ1Y3QgYWFjX2RldiAqIGRldiwgc3RydWN0IHNjc2lfY21uZCAqIGNtZCwgdTY0IGxiYSkKQEAgLTkwNiwxMSArODkzLDkgQEAKIAkJZHByaW50aygoS0VSTl9ERUJVRyAiYWFjcmFpZDogSWxsZWdhbCBsYmFcbiIpKTsKIAkJY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfCBDT01NQU5EX0NPTVBMRVRFIDw8IDggfAogCQkJU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOwotCQlzZXRfc2Vuc2UoKHU4ICopICZkZXYtPmZzYV9kZXZbY2lkXS5zZW5zZV9kYXRhLAotCQkJICAgIEhBUkRXQVJFX0VSUk9SLAotCQkJICAgIFNFTkNPREVfSU5URVJOQUxfVEFSR0VUX0ZBSUxVUkUsCi0JCQkgICAgQVNFTkNPREVfSU5URVJOQUxfVEFSR0VUX0ZBSUxVUkUsIDAsIDAsCi0JCQkgICAgMCwgMCk7CisJCXNldF9zZW5zZSgmZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSwKKwkJICBIQVJEV0FSRV9FUlJPUiwgU0VOQ09ERV9JTlRFUk5BTF9UQVJHRVRfRkFJTFVSRSwKKwkJICBBU0VOQ09ERV9JTlRFUk5BTF9UQVJHRVRfRkFJTFVSRSwgMCwgMCk7CiAJCW1lbWNweShjbWQtPnNlbnNlX2J1ZmZlciwgJmRldi0+ZnNhX2RldltjaWRdLnNlbnNlX2RhdGEsCiAJCSAgICAgICBtaW5fdChzaXplX3QsIHNpemVvZihkZXYtPmZzYV9kZXZbY2lkXS5zZW5zZV9kYXRhKSwKIAkJCSAgICAgU0NTSV9TRU5TRV9CVUZGRVJTSVpFKSk7CkBAIC0xNTIwLDExICsxNTA1LDkgQEAKIAkJICBsZTMyX3RvX2NwdShyZWFkcmVwbHktPnN0YXR1cykpOwogI2VuZGlmCiAJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IENPTU1BTkRfQ09NUExFVEUgPDwgOCB8IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKLQkJc2V0X3NlbnNlKCh1OCAqKSAmZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSwKLQkJCQkgICAgSEFSRFdBUkVfRVJST1IsCi0JCQkJICAgIFNFTkNPREVfSU5URVJOQUxfVEFSR0VUX0ZBSUxVUkUsCi0JCQkJICAgIEFTRU5DT0RFX0lOVEVSTkFMX1RBUkdFVF9GQUlMVVJFLCAwLCAwLAotCQkJCSAgICAwLCAwKTsKKwkJc2V0X3NlbnNlKCZkZXYtPmZzYV9kZXZbY2lkXS5zZW5zZV9kYXRhLAorCQkgIEhBUkRXQVJFX0VSUk9SLCBTRU5DT0RFX0lOVEVSTkFMX1RBUkdFVF9GQUlMVVJFLAorCQkgIEFTRU5DT0RFX0lOVEVSTkFMX1RBUkdFVF9GQUlMVVJFLCAwLCAwKTsKIAkJbWVtY3B5KHNjc2ljbWQtPnNlbnNlX2J1ZmZlciwgJmRldi0+ZnNhX2RldltjaWRdLnNlbnNlX2RhdGEsCiAJCSAgICAgICBtaW5fdChzaXplX3QsIHNpemVvZihkZXYtPmZzYV9kZXZbY2lkXS5zZW5zZV9kYXRhKSwKIAkJCSAgICAgU0NTSV9TRU5TRV9CVUZGRVJTSVpFKSk7CkBAIC0xNzMzLDExICsxNzE2LDkgQEAKIAkJICAgICBsZTMyX3RvX2NwdShzeW5jaHJvbml6ZXJlcGx5LT5zdGF0dXMpKTsKIAkJY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfAogCQkJQ09NTUFORF9DT01QTEVURSA8PCA4IHwgU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOwotCQlzZXRfc2Vuc2UoKHU4ICopJmRldi0+ZnNhX2RldltjaWRdLnNlbnNlX2RhdGEsCi0JCQkJICAgIEhBUkRXQVJFX0VSUk9SLAotCQkJCSAgICBTRU5DT0RFX0lOVEVSTkFMX1RBUkdFVF9GQUlMVVJFLAotCQkJCSAgICBBU0VOQ09ERV9JTlRFUk5BTF9UQVJHRVRfRkFJTFVSRSwgMCwgMCwKLQkJCQkgICAgMCwgMCk7CisJCXNldF9zZW5zZSgmZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSwKKwkJICBIQVJEV0FSRV9FUlJPUiwgU0VOQ09ERV9JTlRFUk5BTF9UQVJHRVRfRkFJTFVSRSwKKwkJICBBU0VOQ09ERV9JTlRFUk5BTF9UQVJHRVRfRkFJTFVSRSwgMCwgMCk7CiAJCW1lbWNweShjbWQtPnNlbnNlX2J1ZmZlciwgJmRldi0+ZnNhX2RldltjaWRdLnNlbnNlX2RhdGEsCiAJCSAgICAgICBtaW5fdChzaXplX3QsIHNpemVvZihkZXYtPmZzYV9kZXZbY2lkXS5zZW5zZV9kYXRhKSwKIAkJCSAgICAgU0NTSV9TRU5TRV9CVUZGRVJTSVpFKSk7CkBAIC0xOTQ1LDEwICsxOTI2LDkgQEAKIAl7CiAJCWRwcmludGsoKEtFUk5fV0FSTklORyAiT25seSBJTlFVSVJZICYgVFVSIGNvbW1hbmQgc3VwcG9ydGVkIGZvciBjb250cm9sbGVyLCByY3ZkID0gMHgleC5cbiIsIHNjc2ljbWQtPmNtbmRbMF0pKTsKIAkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgQ09NTUFORF9DT01QTEVURSA8PCA4IHwgU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOwotCQlzZXRfc2Vuc2UoKHU4ICopICZkZXYtPmZzYV9kZXZbY2lkXS5zZW5zZV9kYXRhLAotCQkJICAgIElMTEVHQUxfUkVRVUVTVCwKLQkJCSAgICBTRU5DT0RFX0lOVkFMSURfQ09NTUFORCwKLQkJCSAgICBBU0VOQ09ERV9JTlZBTElEX0NPTU1BTkQsIDAsIDAsIDAsIDApOworCQlzZXRfc2Vuc2UoJmRldi0+ZnNhX2RldltjaWRdLnNlbnNlX2RhdGEsCisJCSAgSUxMRUdBTF9SRVFVRVNULCBTRU5DT0RFX0lOVkFMSURfQ09NTUFORCwKKwkJICBBU0VOQ09ERV9JTlZBTElEX0NPTU1BTkQsIDAsIDApOwogCQltZW1jcHkoc2NzaWNtZC0+c2Vuc2VfYnVmZmVyLCAmZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSwKIAkJICAgICAgIG1pbl90KHNpemVfdCwgc2l6ZW9mKGRldi0+ZnNhX2RldltjaWRdLnNlbnNlX2RhdGEpLAogCQkJICAgICBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpKTsKQEAgLTE5OTUsMTAgKzE5NzUsOSBAQAogCQkJCXNjc2ljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8CiAJCQkJICBDT01NQU5EX0NPTVBMRVRFIDw8IDggfAogCQkJCSAgU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOwotCQkJCXNldF9zZW5zZSgodTggKikgJmRldi0+ZnNhX2RldltjaWRdLnNlbnNlX2RhdGEsCi0JCQkJICBJTExFR0FMX1JFUVVFU1QsCi0JCQkJICBTRU5DT0RFX0lOVkFMSURfQ0RCX0ZJRUxELAotCQkJCSAgQVNFTkNPREVfTk9fU0VOU0UsIDAsIDcsIDIsIDApOworCQkJCXNldF9zZW5zZSgmZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSwKKwkJCQkgIElMTEVHQUxfUkVRVUVTVCwgU0VOQ09ERV9JTlZBTElEX0NEQl9GSUVMRCwKKwkJCQkgIEFTRU5DT0RFX05PX1NFTlNFLCA3LCAyKTsKIAkJCQltZW1jcHkoc2NzaWNtZC0+c2Vuc2VfYnVmZmVyLAogCQkJCSAgJmRldi0+ZnNhX2RldltjaWRdLnNlbnNlX2RhdGEsCiAJCQkJICBtaW5fdChzaXplX3QsCkBAIC0yMjU0LDkgKzIyMzMsOSBAQAogCQkJICovCiAJCQlkcHJpbnRrKChLRVJOX1dBUk5JTkcgIlVuaGFuZGxlZCBTQ1NJIENvbW1hbmQ6IDB4JXguXG4iLCBzY3NpY21kLT5jbW5kWzBdKSk7CiAJCQlzY3NpY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfCBDT01NQU5EX0NPTVBMRVRFIDw8IDggfCBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047Ci0JCQlzZXRfc2Vuc2UoKHU4ICopICZkZXYtPmZzYV9kZXZbY2lkXS5zZW5zZV9kYXRhLAotCQkJCUlMTEVHQUxfUkVRVUVTVCwgU0VOQ09ERV9JTlZBTElEX0NPTU1BTkQsCi0JCQkJQVNFTkNPREVfSU5WQUxJRF9DT01NQU5ELCAwLCAwLCAwLCAwKTsKKwkJCXNldF9zZW5zZSgmZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSwKKwkJCSAgSUxMRUdBTF9SRVFVRVNULCBTRU5DT0RFX0lOVkFMSURfQ09NTUFORCwKKwkJCSAgQVNFTkNPREVfSU5WQUxJRF9DT01NQU5ELCAwLCAwKTsKIAkJCW1lbWNweShzY3NpY21kLT5zZW5zZV9idWZmZXIsICZkZXYtPmZzYV9kZXZbY2lkXS5zZW5zZV9kYXRhLAogCQkJCW1pbl90KHNpemVfdCwKIAkJCQkgICAgICBzaXplb2YoZGV2LT5mc2FfZGV2W2NpZF0uc2Vuc2VfZGF0YSksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tY3RybC5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWN0cmwuYwppbmRleCBmOGFmYTM1Li5hYmVmMDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tY3RybC5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1jdHJsLmMKQEAgLTI0Myw2ICsyNDMsNyBAQAogCSAqCVNlYXJjaCB0aGUgbGlzdCBvZiBBZGFwdGVyRmliQ29udGV4dCBhZGRyZXNzZXMgb24gdGhlIGFkYXB0ZXIKIAkgKgl0byBiZSBzdXJlIHRoaXMgaXMgYSB2YWxpZCBhZGRyZXNzCiAJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZmliX2xvY2ssIGZsYWdzKTsKIAllbnRyeSA9IGRldi0+ZmliX2xpc3QubmV4dDsKIAlmaWJjdHggPSBOVUxMOwogCkBAIC0yNTEsMjQgKzI1MiwyNSBAQAogCQkvKgogCQkgKglFeHRyYWN0IHRoZSBBZGFwdGVyRmliQ29udGV4dCBmcm9tIHRoZSBJbnB1dCBwYXJhbWV0ZXJzLgogCQkgKi8KLQkJaWYgKGZpYmN0eC0+dW5pcXVlID09IGYuZmliY3R4KSB7ICAgLyogV2UgZm91bmQgYSB3aW5uZXIgKi8KKwkJaWYgKGZpYmN0eC0+dW5pcXVlID09IGYuZmliY3R4KSB7IC8qIFdlIGZvdW5kIGEgd2lubmVyICovCiAJCQlicmVhazsKIAkJfQogCQllbnRyeSA9IGVudHJ5LT5uZXh0OwogCQlmaWJjdHggPSBOVUxMOwogCX0KIAlpZiAoIWZpYmN0eCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmZpYl9sb2NrLCBmbGFncyk7CiAJCWRwcmludGsgKChLRVJOX0lORk8gIkZpYiBDb250ZXh0IG5vdCBmb3VuZFxuIikpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZigoZmliY3R4LT50eXBlICE9IEZTQUZTX05UQ19HRVRfQURBUFRFUl9GSUJfQ09OVEVYVCkgfHwKIAkJIChmaWJjdHgtPnNpemUgIT0gc2l6ZW9mKHN0cnVjdCBhYWNfZmliX2NvbnRleHQpKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmZpYl9sb2NrLCBmbGFncyk7CiAJCWRwcmludGsgKChLRVJOX0lORk8gIkZpYiBDb250ZXh0IGNvcnJ1cHQ/XG4iKSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlzdGF0dXMgPSAwOwotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmZpYl9sb2NrLCBmbGFncyk7CiAJLyoKIAkgKglJZiB0aGVyZSBhcmUgbm8gZmlicyB0byBzZW5kIGJhY2ssIHRoZW4gZWl0aGVyIHdhaXQgb3IgcmV0dXJuCiAJICoJLUVBR0FJTgpAQCAtNDE0LDggKzQxNiw4IEBACiAgKglAYXJnOiBpb2N0bCBhcmd1bWVudHMKICAqCiAgKglUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgZHJpdmVyIHZlcnNpb24uCi0gKiAgICAgIFVuZGVyIExpbnV4LCB0aGVyZSBoYXZlIGJlZW4gbm8gdmVyc2lvbiBpbmNvbXBhdGliaWxpdGllcywgc28gdGhpcyBpcwotICogICAgICBzaW1wbGUhCisgKglVbmRlciBMaW51eCwgdGhlcmUgaGF2ZSBiZWVuIG5vIHZlcnNpb24gaW5jb21wYXRpYmlsaXRpZXMsIHNvIHRoaXMgaXMKKyAqCXNpbXBsZSEKICAqLwogCiBzdGF0aWMgaW50IGNoZWNrX3JldmlzaW9uKHN0cnVjdCBhYWNfZGV2ICpkZXYsIHZvaWQgX191c2VyICphcmcpCkBAIC00NjMsNyArNDY1LDcgQEAKIAl1MzIgZGF0YV9kaXI7CiAJdm9pZCBfX3VzZXIgKnNnX3VzZXJbMzJdOwogCXZvaWQgKnNnX2xpc3RbMzJdOwotCXUzMiAgIHNnX2luZHggPSAwOworCXUzMiBzZ19pbmR4ID0gMDsKIAl1MzIgYnl0ZV9jb3VudCA9IDA7CiAJdTMyIGFjdHVhbF9maWJzaXplNjQsIGFjdHVhbF9maWJzaXplID0gMDsKIAlpbnQgaTsKQEAgLTUxNywxMSArNTE5LDExIEBACiAJLy8gRml4IHVwIHNyYiBmb3IgZW5kaWFuIGFuZCBmb3JjZSBzb21lIHZhbHVlcwogCiAJc3JiY21kLT5mdW5jdGlvbiA9IGNwdV90b19sZTMyKFNSQkZfRXhlY3V0ZVNjc2kpOwkvLyBGb3JjZSB0aGlzCi0Jc3JiY21kLT5jaGFubmVsICA9IGNwdV90b19sZTMyKHVzZXJfc3JiY21kLT5jaGFubmVsKTsKKwlzcmJjbWQtPmNoYW5uZWwJID0gY3B1X3RvX2xlMzIodXNlcl9zcmJjbWQtPmNoYW5uZWwpOwogCXNyYmNtZC0+aWQJID0gY3B1X3RvX2xlMzIodXNlcl9zcmJjbWQtPmlkKTsKLQlzcmJjbWQtPmx1biAgICAgID0gY3B1X3RvX2xlMzIodXNlcl9zcmJjbWQtPmx1bik7Ci0Jc3JiY21kLT50aW1lb3V0ICA9IGNwdV90b19sZTMyKHVzZXJfc3JiY21kLT50aW1lb3V0KTsKLQlzcmJjbWQtPmZsYWdzICAgID0gY3B1X3RvX2xlMzIoZmxhZ3MpOworCXNyYmNtZC0+bHVuCSA9IGNwdV90b19sZTMyKHVzZXJfc3JiY21kLT5sdW4pOworCXNyYmNtZC0+dGltZW91dAkgPSBjcHVfdG9fbGUzMih1c2VyX3NyYmNtZC0+dGltZW91dCk7CisJc3JiY21kLT5mbGFncwkgPSBjcHVfdG9fbGUzMihmbGFncyk7CiAJc3JiY21kLT5yZXRyeV9saW1pdCA9IDA7IC8vIE9ic29sZXRlIHBhcmFtZXRlcgogCXNyYmNtZC0+Y2RiX3NpemUgPSBjcHVfdG9fbGUzMih1c2VyX3NyYmNtZC0+Y2RiX3NpemUpOwogCW1lbWNweShzcmJjbWQtPmNkYiwgdXNlcl9zcmJjbWQtPmNkYiwgc2l6ZW9mKHNyYmNtZC0+Y2RiKSk7CkBAIC03ODYsOSArNzg4LDkgQEAKIAlwY2lfaW5mby5idXMgPSBkZXYtPnBkZXYtPmJ1cy0+bnVtYmVyOwogCXBjaV9pbmZvLnNsb3QgPSBQQ0lfU0xPVChkZXYtPnBkZXYtPmRldmZuKTsKIAotICAgICAgIGlmIChjb3B5X3RvX3VzZXIoYXJnLCAmcGNpX2luZm8sIHNpemVvZihzdHJ1Y3QgYWFjX3BjaV9pbmZvKSkpIHsKLQkgICAgICAgZHByaW50aygoS0VSTl9ERUJVRyAiYWFjcmFpZDogQ291bGQgbm90IGNvcHkgcGNpIGluZm9cbiIpKTsKLQkgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZwY2lfaW5mbywgc2l6ZW9mKHN0cnVjdCBhYWNfcGNpX2luZm8pKSkgeworCQlkcHJpbnRrKChLRVJOX0RFQlVHICJhYWNyYWlkOiBDb3VsZCBub3QgY29weSBwY2kgaW5mb1xuIikpOworCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9saW5pdC5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvbGluaXQuYwppbmRleCBmYjA4ODYxLi5lODBkMmEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9saW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2xpbml0LmMKQEAgLTExMzAsMzEgKzExMzAsMjkgQEAKIAlpZiAoZXJyb3IgPCAwKQogCQlnb3RvIG91dF9kZWluaXQ7CiAKLQlpZiAoIShhYWMtPmFkYXB0ZXJfaW5mby5vcHRpb25zICYgQUFDX09QVF9ORVdfQ09NTSkpIHsKLQkJZXJyb3IgPSBwY2lfc2V0X2RtYV9tYXhfc2VnX3NpemUocGRldiwgNjU1MzYpOwotCQlpZiAoZXJyb3IpCi0JCQlnb3RvIG91dF9kZWluaXQ7Ci0JfQotCiAJLyoKICAJICogTGV0cyBvdmVycmlkZSBuZWdvdGlhdGlvbnMgYW5kIGRyb3AgdGhlIG1heGltdW0gU0cgbGltaXQgdG8gMzQKICAJICovCiAJaWYgKChhYWNfZHJpdmVyc1tpbmRleF0ucXVpcmtzICYgQUFDX1FVSVJLXzM0U0cpICYmCi0JCQkoYWFjLT5zY3NpX2hvc3RfcHRyLT5zZ190YWJsZXNpemUgPiAzNCkpIHsKLSAJCWFhYy0+c2NzaV9ob3N0X3B0ci0+c2dfdGFibGVzaXplID0gMzQ7Ci0gCQlhYWMtPnNjc2lfaG9zdF9wdHItPm1heF9zZWN0b3JzCi0gCQkgID0gKGFhYy0+c2NzaV9ob3N0X3B0ci0+c2dfdGFibGVzaXplICogOCkgKyAxMTI7CisJCQkoc2hvc3QtPnNnX3RhYmxlc2l6ZSA+IDM0KSkgeworCQlzaG9zdC0+c2dfdGFibGVzaXplID0gMzQ7CisJCXNob3N0LT5tYXhfc2VjdG9ycyA9IChzaG9zdC0+c2dfdGFibGVzaXplICogOCkgKyAxMTI7CiAgCX0KIAogIAlpZiAoKGFhY19kcml2ZXJzW2luZGV4XS5xdWlya3MgJiBBQUNfUVVJUktfMTdTRykgJiYKLQkJCShhYWMtPnNjc2lfaG9zdF9wdHItPnNnX3RhYmxlc2l6ZSA+IDE3KSkgewotIAkJYWFjLT5zY3NpX2hvc3RfcHRyLT5zZ190YWJsZXNpemUgPSAxNzsKLSAJCWFhYy0+c2NzaV9ob3N0X3B0ci0+bWF4X3NlY3RvcnMKLSAJCSAgPSAoYWFjLT5zY3NpX2hvc3RfcHRyLT5zZ190YWJsZXNpemUgKiA4KSArIDExMjsKKwkJCShzaG9zdC0+c2dfdGFibGVzaXplID4gMTcpKSB7CisJCXNob3N0LT5zZ190YWJsZXNpemUgPSAxNzsKKwkJc2hvc3QtPm1heF9zZWN0b3JzID0gKHNob3N0LT5zZ190YWJsZXNpemUgKiA4KSArIDExMjsKICAJfQogCisJZXJyb3IgPSBwY2lfc2V0X2RtYV9tYXhfc2VnX3NpemUocGRldiwKKwkJKGFhYy0+YWRhcHRlcl9pbmZvLm9wdGlvbnMgJiBBQUNfT1BUX05FV19DT01NKSA/CisJCQkoc2hvc3QtPm1heF9zZWN0b3JzIDw8IDkpIDogNjU1MzYpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfZGVpbml0OworCiAJLyoKLQkgKiBGaXJ3YXJlIHByaW50ZiB3b3JrcyBvbmx5IHdpdGggb2xkZXIgZmlybXdhcmUuCisJICogRmlybXdhcmUgcHJpbnRmIHdvcmtzIG9ubHkgd2l0aCBvbGRlciBmaXJtd2FyZS4KIAkgKi8KIAlpZiAoYWFjX2RyaXZlcnNbaW5kZXhdLnF1aXJrcyAmIEFBQ19RVUlSS18zNFNHKQogCQlhYWMtPnByaW50Zl9lbmFibGVkID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hZHZhbnN5cy5jIGIvZHJpdmVycy9zY3NpL2FkdmFuc3lzLmMKaW5kZXggMzc0ZWQwMi4uY2NlZjg5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FkdmFuc3lzLmMKKysrIGIvZHJpdmVycy9zY3NpL2FkdmFuc3lzLmMKQEAgLTEyMjYxLDcgKzEyMjYxLDcgQEAKIC8qCiAgKiBXcml0ZSB0aGUgRUVQUk9NIGZyb20gJ2NmZ19idWYnLgogICovCi12b2lkIF9fZGV2aW5pdAorc3RhdGljIHZvaWQgX19kZXZpbml0CiBBZHZTZXQzNTUwRUVQQ29uZmlnKEFkdlBvcnRBZGRyIGlvcF9iYXNlLCBBRFZFRVBfMzU1MF9DT05GSUcgKmNmZ19idWYpCiB7CiAJdXNob3J0ICp3YnVmOwpAQCAtMTIzMjgsNyArMTIzMjgsNyBAQAogLyoKICAqIFdyaXRlIHRoZSBFRVBST00gZnJvbSAnY2ZnX2J1ZicuCiAgKi8KLXZvaWQgX19kZXZpbml0CitzdGF0aWMgdm9pZCBfX2RldmluaXQKIEFkdlNldDM4QzA4MDBFRVBDb25maWcoQWR2UG9ydEFkZHIgaW9wX2Jhc2UsIEFEVkVFUF8zOEMwODAwX0NPTkZJRyAqY2ZnX2J1ZikKIHsKIAl1c2hvcnQgKndidWY7CkBAIC0xMjM5NSw3ICsxMjM5NSw3IEBACiAvKgogICogV3JpdGUgdGhlIEVFUFJPTSBmcm9tICdjZmdfYnVmJy4KICAqLwotdm9pZCBfX2RldmluaXQKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAogQWR2U2V0MzhDMTYwMEVFUENvbmZpZyhBZHZQb3J0QWRkciBpb3BfYmFzZSwgQURWRUVQXzM4QzE2MDBfQ09ORklHICpjZmdfYnVmKQogewogCXVzaG9ydCAqd2J1ZjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hcmNtc3IvYXJjbXNyLmggYi9kcml2ZXJzL3Njc2kvYXJjbXNyL2FyY21zci5oCmluZGV4IGE2N2UyOWYuLjU3Nzg2NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hcmNtc3IvYXJjbXNyLmgKKysrIGIvZHJpdmVycy9zY3NpL2FyY21zci9hcmNtc3IuaApAQCAtNDgsNyArNDgsNyBAQAogLypUaGUgbGltaXQgb2Ygb3V0c3RhbmRpbmcgc2NzaSBjb21tYW5kIHRoYXQgZmlybXdhcmUgY2FuIGhhbmRsZSovCiAjZGVmaW5lIEFSQ01TUl9NQVhfT1VUU1RBTkRJTkdfQ01ECQkJCQkJMjU2CiAjZGVmaW5lIEFSQ01TUl9NQVhfRlJFRUNDQl9OVU0JCQkJCQkJMzIwCi0jZGVmaW5lIEFSQ01TUl9EUklWRVJfVkVSU0lPTgkJICAgICAiRHJpdmVyIFZlcnNpb24gMS4yMC4wMC4xNSAyMDA3LzA4LzMwIgorI2RlZmluZSBBUkNNU1JfRFJJVkVSX1ZFUlNJT04JCSAgICAgIkRyaXZlciBWZXJzaW9uIDEuMjAuMDAuMTUgMjAwNy8xMi8yNCIKICNkZWZpbmUgQVJDTVNSX1NDU0lfSU5JVElBVE9SX0lECQkJCQkJMjU1CiAjZGVmaW5lIEFSQ01TUl9NQVhfWEZFUl9TRUNUT1JTCQkJCQkJCTUxMgogI2RlZmluZSBBUkNNU1JfTUFYX1hGRVJfU0VDVE9SU19CCQkJCQkJNDA5NgpAQCAtMjQ4LDYgKzI0OCw3IEBACiAjZGVmaW5lIEFSQ01TUl9NRVNTQUdFX1NUQVJUX0JHUkIJCSAgICAgIDB4MDAwNjAwMDgKICNkZWZpbmUgQVJDTVNSX01FU1NBR0VfU1RBUlRfRFJJVkVSX01PREUJICAgICAgMHgwMDBFMDAwOAogI2RlZmluZSBBUkNNU1JfTUVTU0FHRV9TRVRfUE9TVF9XSU5ET1cJCSAgICAgIDB4MDAwRjAwMDgKKyNkZWZpbmUgQVJDTVNSX01FU1NBR0VfQUNUSVZFX0VPSV9NT0RFCQkgICAgMHgwMDEwMDAwOAogLyogQVJDTVNSX09VVEJPVU5EX01FU0cxX0ZJUk1XQVJFX09LICovCiAjZGVmaW5lIEFSQ01TUl9NRVNTQUdFX0ZJUk1XQVJFX09LCQkgICAgICAweDgwMDAwMDAwCiAvKiBpb2N0bCB0cmFuc2ZlciAqLwpAQCAtMjU2LDYgKzI1Nyw3IEBACiAjZGVmaW5lIEFSQ01TUl9EUlYySU9QX0RBVEFfUkVBRF9PSyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCiAjZGVmaW5lIEFSQ01TUl9EUlYySU9QX0NEQl9QT1NURUQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CiAjZGVmaW5lIEFSQ01TUl9EUlYySU9QX01FU1NBR0VfQ01EX1BPU1RFRCAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEFSQ01TUl9EUlYySU9QX0VORF9PRl9JTlRFUlJVUFQJCTB4MDAwMDAwMTAKIAogLyogZGF0YSB0dW5uZWwgYnVmZmVyIGJldHdlZW4gdXNlciBzcGFjZSBwcm9ncmFtIGFuZCBpdHMgZmlybXdhcmUgKi8KIC8qIHVzZXIgc3BhY2UgZGF0YSB0byBpb3AgMTI4Ynl0ZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hcmNtc3IvYXJjbXNyX2hiYS5jIGIvZHJpdmVycy9zY3NpL2FyY21zci9hcmNtc3JfaGJhLmMKaW5kZXggZjRhMjAyZS4uNGY5ZmYzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FyY21zci9hcmNtc3JfaGJhLmMKKysrIGIvZHJpdmVycy9zY3NpL2FyY21zci9hcmNtc3JfaGJhLmMKQEAgLTMxNSw5ICszMTUsNiBAQAogCQkJCSgweDIwIC0gKCh1bnNpZ25lZCBsb25nKWRtYV9jb2hlcmVudF9oYW5kbGUgJiAweDFGKSk7CiAJCX0KIAotCQlyZWcgPSAoc3RydWN0IE1lc3NhZ2VVbml0X0IgKikoZG1hX2NvaGVyZW50ICsKLQkJQVJDTVNSX01BWF9GUkVFQ0NCX05VTSAqIHNpemVvZihzdHJ1Y3QgQ29tbWFuZENvbnRyb2xCbG9jaykpOwotCiAJCWRtYV9hZGRyID0gZG1hX2NvaGVyZW50X2hhbmRsZTsKIAkJY2NiX3RtcCA9IChzdHJ1Y3QgQ29tbWFuZENvbnRyb2xCbG9jayAqKWRtYV9jb2hlcmVudDsKIAkJZm9yIChpID0gMDsgaSA8IEFSQ01TUl9NQVhfRlJFRUNDQl9OVU07IGkrKykgewpAQCAtMzcxLDggKzM2OCw4IEBACiAKIG91dDoKIAlkbWFfZnJlZV9jb2hlcmVudCgmYWNiLT5wZGV2LT5kZXYsCi0JCUFSQ01TUl9NQVhfRlJFRUNDQl9OVU0gKiBzaXplb2Yoc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2spICsgMHgyMCwKLQkJYWNiLT5kbWFfY29oZXJlbnQsIGFjYi0+ZG1hX2NvaGVyZW50X2hhbmRsZSk7CisJCShBUkNNU1JfTUFYX0ZSRUVDQ0JfTlVNICogc2l6ZW9mKHN0cnVjdCBDb21tYW5kQ29udHJvbEJsb2NrKSArIDB4MjAgKworCQlzaXplb2Yoc3RydWN0IE1lc3NhZ2VVbml0X0IpKSwgYWNiLT5kbWFfY29oZXJlbnQsIGFjYi0+ZG1hX2NvaGVyZW50X2hhbmRsZSk7CiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKQEAgLTUwOSw2ICs1MDYsNyBAQAogCQkJCSYgQVJDTVNSX0lPUDJEUlZfTUVTU0FHRV9DTURfRE9ORSkgewogCQkJCXdyaXRlbChBUkNNU1JfTUVTU0FHRV9JTlRfQ0xFQVJfUEFUVEVSTgogCQkJCQksIHJlZy0+aW9wMmRydl9kb29yYmVsbF9yZWcpOworCQkJCXdyaXRlbChBUkNNU1JfRFJWMklPUF9FTkRfT0ZfSU5URVJSVVBULCByZWctPmRydjJpb3BfZG9vcmJlbGxfcmVnKTsKIAkJCQlyZXR1cm4gMHgwMDsKIAkJCX0KIAkJCW1zbGVlcCgxMCk7CkBAIC03NDgsNiArNzQ2LDcgQEAKIAkJCQksIGNjYi0+c3RhcnRkb25lCiAJCQkJLCBhdG9taWNfcmVhZCgmYWNiLT5jY2JvdXRzdGFuZGluZ2NvdW50KSk7CiAJCX0KKwllbHNlCiAJYXJjbXNyX3JlcG9ydF9jY2Jfc3RhdGUoYWNiLCBjY2IsIGZsYWdfY2NiKTsKIH0KIApAQCAtODg2LDcgKzg4NSw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBhcmNtc3JfYnVpbGRfY2NiKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IsCitzdGF0aWMgaW50IGFyY21zcl9idWlsZF9jY2Ioc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYiwKIAlzdHJ1Y3QgQ29tbWFuZENvbnRyb2xCbG9jayAqY2NiLCBzdHJ1Y3Qgc2NzaV9jbW5kICpwY21kKQogewogCXN0cnVjdCBBUkNNU1JfQ0RCICphcmNtc3JfY2RiID0gKHN0cnVjdCBBUkNNU1JfQ0RCICopJmNjYi0+YXJjbXNyX2NkYjsKQEAgLTkwNiw2ICs5MDUsOCBAQAogCW1lbWNweShhcmNtc3JfY2RiLT5DZGIsIHBjbWQtPmNtbmQsIHBjbWQtPmNtZF9sZW4pOwogCiAJbnNlZyA9IHNjc2lfZG1hX21hcChwY21kKTsKKwlpZiAobnNlZyA+IEFSQ01TUl9NQVhfU0dfRU5UUklFUykKKwkJcmV0dXJuIEZBSUxFRDsKIAlCVUdfT04obnNlZyA8IDApOwogCiAJaWYgKG5zZWcpIHsKQEAgLTk0Niw2ICs5NDcsNyBAQAogCQlhcmNtc3JfY2RiLT5GbGFncyB8PSBBUkNNU1JfQ0RCX0ZMQUdfV1JJVEU7CiAJCWNjYi0+Y2NiX2ZsYWdzIHw9IENDQl9GTEFHX1dSSVRFOwogCX0KKwlyZXR1cm4gU1VDQ0VTUzsKIH0KIAogc3RhdGljIHZvaWQgYXJjbXNyX3Bvc3RfY2NiKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IsIHN0cnVjdCBDb21tYW5kQ29udHJvbEJsb2NrICpjY2IpCkBAIC0xMDM2LDE4ICsxMDM4LDIyIEBACiAJc3dpdGNoIChhY2ItPmFkYXB0ZXJfdHlwZSkgewogCWNhc2UgQUNCX0FEQVBURVJfVFlQRV9BOiB7CiAJCWlvdW5tYXAoYWNiLT5wbXVBKTsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJmFjYi0+cGRldi0+ZGV2LAorCQlBUkNNU1JfTUFYX0ZSRUVDQ0JfTlVNICogc2l6ZW9mIChzdHJ1Y3QgQ29tbWFuZENvbnRyb2xCbG9jaykgKyAweDIwLAorCQlhY2ItPmRtYV9jb2hlcmVudCwKKwkJYWNiLT5kbWFfY29oZXJlbnRfaGFuZGxlKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgQUNCX0FEQVBURVJfVFlQRV9COiB7CiAJCXN0cnVjdCBNZXNzYWdlVW5pdF9CICpyZWcgPSBhY2ItPnBtdUI7CiAJCWlvdW5tYXAocmVnLT5kcnYyaW9wX2Rvb3JiZWxsX3JlZyAtIEFSQ01TUl9EUlYySU9QX0RPT1JCRUxMKTsKIAkJaW91bm1hcChyZWctPmlvY3RsX3didWZmZXJfcmVnIC0gQVJDTVNSX0lPQ1RMX1dCVUZGRVIpOworCQlkbWFfZnJlZV9jb2hlcmVudCgmYWNiLT5wZGV2LT5kZXYsCisJCShBUkNNU1JfTUFYX0ZSRUVDQ0JfTlVNICogc2l6ZW9mKHN0cnVjdCBDb21tYW5kQ29udHJvbEJsb2NrKSArIDB4MjAgKworCQlzaXplb2Yoc3RydWN0IE1lc3NhZ2VVbml0X0IpKSwgYWNiLT5kbWFfY29oZXJlbnQsIGFjYi0+ZG1hX2NvaGVyZW50X2hhbmRsZSk7CiAJfQogCX0KLQlkbWFfZnJlZV9jb2hlcmVudCgmYWNiLT5wZGV2LT5kZXYsCi0JCUFSQ01TUl9NQVhfRlJFRUNDQl9OVU0gKiBzaXplb2YgKHN0cnVjdCBDb21tYW5kQ29udHJvbEJsb2NrKSArIDB4MjAsCi0JCWFjYi0+ZG1hX2NvaGVyZW50LAotCQlhY2ItPmRtYV9jb2hlcmVudF9oYW5kbGUpOworCiB9CiAKIHZvaWQgYXJjbXNyX2lvcF9tZXNzYWdlX3JlYWQoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYikKQEAgLTEyNzMsNyArMTI3OSw5IEBACiAJCXJldHVybiAxOwogCiAJd3JpdGVsKH5vdXRib3VuZF9kb29yYmVsbCwgcmVnLT5pb3AyZHJ2X2Rvb3JiZWxsX3JlZyk7Ci0KKwkvKmluIGNhc2UgdGhlIGxhc3QgYWN0aW9uIG9mIGRvb3JiZWxsIGludGVycnVwdCBjbGVhcmFuY2UgaXMgY2FjaGVkLCB0aGlzIGFjdGlvbiBjYW4gcHVzaCBIVyB0byB3cml0ZSBkb3duIHRoZSBjbGVhciBiaXQqLworCXJlYWRsKHJlZy0+aW9wMmRydl9kb29yYmVsbF9yZWcpOworCXdyaXRlbChBUkNNU1JfRFJWMklPUF9FTkRfT0ZfSU5URVJSVVBULCByZWctPmRydjJpb3BfZG9vcmJlbGxfcmVnKTsKIAlpZiAob3V0Ym91bmRfZG9vcmJlbGwgJiBBUkNNU1JfSU9QMkRSVl9EQVRBX1dSSVRFX09LKSAJewogCQlhcmNtc3JfaW9wMmRydl9kYXRhX3dyb3RlX2hhbmRsZShhY2IpOwogCX0KQEAgLTEzODAsMTIgKzEzODgsMTMgQEAKIAogCWNhc2UgQVJDTVNSX01FU1NBR0VfUkVBRF9SUUJVRkZFUjogewogCQl1bnNpZ25lZCBsb25nICp2ZXJfYWRkcjsKLQkJZG1hX2FkZHJfdCBidWZfaGFuZGxlOwogCQl1aW50OF90ICpwUWJ1ZmZlciwgKnB0bXBRYnVmZmVyOwogCQlpbnQzMl90IGFsbHhmZXJfbGVuID0gMDsKKwkJdm9pZCAqdG1wOwogCi0JCXZlcl9hZGRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWNiLT5wZGV2LCAxMDMyLCAmYnVmX2hhbmRsZSk7Ci0JCWlmICghdmVyX2FkZHIpIHsKKwkJdG1wID0ga21hbGxvYygxMDMyLCBHRlBfS0VSTkVMfEdGUF9ETUEpOworCQl2ZXJfYWRkciA9ICh1bnNpZ25lZCBsb25nICopdG1wOworCQlpZiAoIXRtcCkgewogCQkJcmV0dmFsdWUgPSBBUkNNU1JfTUVTU0FHRV9GQUlMOwogCQkJZ290byBtZXNzYWdlX291dDsKIAkJfQpAQCAtMTQyMSwxOCArMTQzMCwxOSBAQAogCQltZW1jcHkocGNtZG1lc3NhZ2VmbGQtPm1lc3NhZ2VkYXRhYnVmZmVyLCAodWludDhfdCAqKXZlcl9hZGRyLCBhbGx4ZmVyX2xlbik7CiAJCXBjbWRtZXNzYWdlZmxkLT5jbWRtZXNzYWdlLkxlbmd0aCA9IGFsbHhmZXJfbGVuOwogCQlwY21kbWVzc2FnZWZsZC0+Y21kbWVzc2FnZS5SZXR1cm5Db2RlID0gQVJDTVNSX01FU1NBR0VfUkVUVVJOQ09ERV9PSzsKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChhY2ItPnBkZXYsIDEwMzIsIHZlcl9hZGRyLCBidWZfaGFuZGxlKTsKKwkJa2ZyZWUodG1wKTsKIAkJfQogCQlicmVhazsKIAogCWNhc2UgQVJDTVNSX01FU1NBR0VfV1JJVEVfV1FCVUZGRVI6IHsKIAkJdW5zaWduZWQgbG9uZyAqdmVyX2FkZHI7Ci0JCWRtYV9hZGRyX3QgYnVmX2hhbmRsZTsKIAkJaW50MzJfdCBteV9lbXB0eV9sZW4sIHVzZXJfbGVuLCB3cWJ1Zl9maXJzdGluZGV4LCB3cWJ1Zl9sYXN0aW5kZXg7CiAJCXVpbnQ4X3QgKnBRYnVmZmVyLCAqcHRtcHVzZXJidWZmZXI7CisJCXZvaWQgKnRtcDsKIAotCQl2ZXJfYWRkciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFjYi0+cGRldiwgMTAzMiwgJmJ1Zl9oYW5kbGUpOwotCQlpZiAoIXZlcl9hZGRyKSB7CisJCXRtcCA9IGttYWxsb2MoMTAzMiwgR0ZQX0tFUk5FTHxHRlBfRE1BKTsKKwkJdmVyX2FkZHIgPSAodW5zaWduZWQgbG9uZyAqKXRtcDsKKwkJaWYgKCF0bXApIHsKIAkJCXJldHZhbHVlID0gQVJDTVNSX01FU1NBR0VfRkFJTDsKIAkJCWdvdG8gbWVzc2FnZV9vdXQ7CiAJCX0KQEAgLTE0ODIsNyArMTQ5Miw3IEBACiAJCQkJcmV0dmFsdWUgPSBBUkNNU1JfTUVTU0FHRV9GQUlMOwogCQkJfQogCQkJfQotCQkJcGNpX2ZyZWVfY29uc2lzdGVudChhY2ItPnBkZXYsIDEwMzIsIHZlcl9hZGRyLCBidWZfaGFuZGxlKTsKKwkJCWtmcmVlKHRtcCk7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTE2ODIsOCArMTY5MiwxMSBAQAogCWNjYiA9IGFyY21zcl9nZXRfZnJlZWNjYihhY2IpOwogCWlmICghY2NiKQogCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKLQotCWFyY21zcl9idWlsZF9jY2IoYWNiLCBjY2IsIGNtZCk7CisJaWYgKCBhcmNtc3JfYnVpbGRfY2NiKCBhY2IsIGNjYiwgY21kICkgPT0gRkFJTEVEICkgeworCQljbWQtPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpIHwgKFJFU0VSVkFUSU9OX0NPTkZMSUNUIDw8IDEpOworCQljbWQtPnNjc2lfZG9uZShjbWQpOworCQlyZXR1cm4gMDsKKwl9CiAJYXJjbXNyX3Bvc3RfY2NiKGFjYiwgY2NiKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE4NDQsNyArMTg1Nyw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBhcmNtc3JfcG9sbGluZ19oYmJfY2NiZG9uZShzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiLCBcCitzdGF0aWMgdm9pZCBhcmNtc3JfcG9sbGluZ19oYmJfY2NiZG9uZShzdHJ1Y3QgQWRhcHRlckNvbnRyb2xCbG9jayAqYWNiLAogCQkJCQlzdHJ1Y3QgQ29tbWFuZENvbnRyb2xCbG9jayAqcG9sbF9jY2IpCiB7CiAJCXN0cnVjdCBNZXNzYWdlVW5pdF9CICpyZWcgPSBhY2ItPnBtdUI7CkBAIC0xODc4LDcgKzE4OTEsNyBAQAogICAgICAgKGFjYi0+dmlyMnBoeV9vZmZzZXQgKyAoZmxhZ19jY2IgPDwgNSkpOy8qZnJhbWUgbXVzdCBiZSAzMiBieXRlcyBhbGlnbmVkKi8KIAkJCXBvbGxfY2NiX2RvbmUgPSAoY2NiID09IHBvbGxfY2NiKSA/IDE6MDsKIAkJCWlmICgoY2NiLT5hY2IgIT0gYWNiKSB8fCAoY2NiLT5zdGFydGRvbmUgIT0gQVJDTVNSX0NDQl9TVEFSVCkpIHsKLQkJCQlpZiAoY2NiLT5zdGFydGRvbmUgPT0gQVJDTVNSX0NDQl9BQk9SVEVEKSB7CisJCQkJaWYgKChjY2ItPnN0YXJ0ZG9uZSA9PSBBUkNNU1JfQ0NCX0FCT1JURUQpIHx8IChjY2IgPT0gcG9sbF9jY2IpKSB7CiAJCQkJCXByaW50ayhLRVJOX05PVElDRSAiYXJjbXNyJWQ6IFwKIAkJc2NzaSBpZCA9ICVkIGx1biA9ICVkIGNjYiA9ICcweCVwJyBwb2xsIGNvbW1hbmQgYWJvcnQgc3VjY2Vzc2Z1bGx5IFxuIgogCQkJCQkJLGFjYi0+aG9zdC0+aG9zdF9ubwpAQCAtMTkwMSw3ICsxOTE0LDcgQEAKIAkJfQkvKmRyYWluIHJlcGx5IEZJRk8qLwogfQogCi1zdGF0aWMgdm9pZCBhcmNtc3JfcG9sbGluZ19jY2Jkb25lKHN0cnVjdCBBZGFwdGVyQ29udHJvbEJsb2NrICphY2IsIFwKK3N0YXRpYyB2b2lkIGFyY21zcl9wb2xsaW5nX2NjYmRvbmUoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYiwKIAkJCQkJc3RydWN0IENvbW1hbmRDb250cm9sQmxvY2sgKnBvbGxfY2NiKQogewogCXN3aXRjaCAoYWNiLT5hZGFwdGVyX3R5cGUpIHsKQEAgLTIwMjYsNiArMjAzOSw3IEBACiAJCWRvIHsKIAkJCWZpcm13YXJlX3N0YXRlID0gcmVhZGwocmVnLT5pb3AyZHJ2X2Rvb3JiZWxsX3JlZyk7CiAJCX0gd2hpbGUgKChmaXJtd2FyZV9zdGF0ZSAmIEFSQ01TUl9NRVNTQUdFX0ZJUk1XQVJFX09LKSA9PSAwKTsKKwkJd3JpdGVsKEFSQ01TUl9EUlYySU9QX0VORF9PRl9JTlRFUlJVUFQsIHJlZy0+ZHJ2MmlvcF9kb29yYmVsbF9yZWcpOwogCQl9CiAJCWJyZWFrOwogCX0KQEAgLTIwOTAsMTkgKzIxMDQsMzkgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGFyY21zcl9lbmFibGVfZW9pX21vZGUoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYikKK3sKKwlzd2l0Y2ggKGFjYi0+YWRhcHRlcl90eXBlKSB7CisJY2FzZSBBQ0JfQURBUFRFUl9UWVBFX0E6CisJCXJldHVybjsKKwljYXNlIEFDQl9BREFQVEVSX1RZUEVfQjoKKwkJeworCQkJc3RydWN0IE1lc3NhZ2VVbml0X0IgKnJlZyA9IGFjYi0+cG11QjsKKwkJCXdyaXRlbChBUkNNU1JfTUVTU0FHRV9BQ1RJVkVfRU9JX01PREUsIHJlZy0+ZHJ2MmlvcF9kb29yYmVsbF9yZWcpOworCQkJaWYoYXJjbXNyX2hiYl93YWl0X21zZ2ludF9yZWFkeShhY2IpKSB7CisJCQkJcHJpbnRrKEtFUk5fTk9USUNFICJBUkNNU1IgSU9QIGVuYWJsZXMgRU9JX01PREUgVElNRU9VVCIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuOworfQorCiBzdGF0aWMgdm9pZCBhcmNtc3JfaW9wX2luaXQoc3RydWN0IEFkYXB0ZXJDb250cm9sQmxvY2sgKmFjYikKIHsKIAl1aW50MzJfdCBpbnRtYXNrX29yZzsKIAotCWFyY21zcl93YWl0X2Zpcm13YXJlX3JlYWR5KGFjYik7Ci0JYXJjbXNyX2lvcF9jb25maXJtKGFjYik7CiAgICAgICAgLyogZGlzYWJsZSBhbGwgb3V0Ym91bmQgaW50ZXJydXB0ICovCiAgICAgICAgaW50bWFza19vcmcgPSBhcmNtc3JfZGlzYWJsZV9vdXRib3VuZF9pbnRzKGFjYik7CisJYXJjbXNyX3dhaXRfZmlybXdhcmVfcmVhZHkoYWNiKTsKKwlhcmNtc3JfaW9wX2NvbmZpcm0oYWNiKTsKIAlhcmNtc3JfZ2V0X2Zpcm13YXJlX3NwZWMoYWNiKTsKIAkvKnN0YXJ0IGJhY2tncm91bmQgcmVidWlsZCovCiAJYXJjbXNyX3N0YXJ0X2FkYXB0ZXJfYmdyYihhY2IpOwogCS8qIGVtcHR5IGRvb3JiZWxsIFFidWZmZXIgaWYgZG9vciBiZWxsIHJpbmdlZCAqLwogCWFyY21zcl9jbGVhcl9kb29yYmVsbF9xdWV1ZV9idWZmZXIoYWNiKTsKKwlhcmNtc3JfZW5hYmxlX2VvaV9tb2RlKGFjYik7CiAJLyogZW5hYmxlIG91dGJvdW5kIFBvc3QgUXVldWUsb3V0Ym91bmQgZG9vcmJlbGwgSW50ZXJydXB0ICovCiAJYXJjbXNyX2VuYWJsZV9vdXRib3VuZF9pbnRzKGFjYiwgaW50bWFza19vcmcpOwogCWFjYi0+YWNiX2ZsYWdzIHw9IEFDQl9GX0lPUF9JTklURUQ7CkBAIC0yMjc1LDYgKzIzMDksNyBAQAogCWFyY21zcl9zdGFydF9hZGFwdGVyX2JncmIoYWNiKTsKIAkvKiBlbXB0eSBkb29yYmVsbCBRYnVmZmVyIGlmIGRvb3IgYmVsbCByaW5nZWQgKi8KIAlhcmNtc3JfY2xlYXJfZG9vcmJlbGxfcXVldWVfYnVmZmVyKGFjYik7CisJYXJjbXNyX2VuYWJsZV9lb2lfbW9kZShhY2IpOwogCS8qIGVuYWJsZSBvdXRib3VuZCBQb3N0IFF1ZXVlLG91dGJvdW5kIGRvb3JiZWxsIEludGVycnVwdCAqLwogCWFyY21zcl9lbmFibGVfb3V0Ym91bmRfaW50cyhhY2IsIGludG1hc2tfb3JnKTsKIAlhY2ItPmFjYl9mbGFncyB8PSBBQ0JfRl9JT1BfSU5JVEVEOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FybS9hY29ybnNjc2kuYyBiL2RyaXZlcnMvc2NzaS9hcm0vYWNvcm5zY3NpLmMKaW5kZXggZWNlYWNmNi4uM2JlZGYyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FybS9hY29ybnNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvYXJtL2Fjb3Juc2NzaS5jCkBAIC0xNzkwLDcgKzE3OTAsNyBAQAogCXJldHVybiAwOwogICAgIH0KIAotICAgIHJlc2lkdWFsID0gaG9zdC0+U0NwbnQtPnJlcXVlc3RfYnVmZmxlbiAtIGhvc3QtPnNjc2kuU0NwLnNjc2lfeGZlcnJlZDsKKyAgICByZXNpZHVhbCA9IHNjc2lfYnVmZmxlbihob3N0LT5TQ3BudCkgLSBob3N0LT5zY3NpLlNDcC5zY3NpX3hmZXJyZWQ7CiAKICAgICBzYmljX2FybV93cml0ZShob3N0LT5zY3NpLmlvX3BvcnQsIFNCSUNfU1lOQ0hUUkFOU0ZFUiwgaG9zdC0+ZGV2aWNlW2hvc3QtPlNDcG50LT5kZXZpY2UtPmlkXS5zeW5jX3hmZXIpOwogICAgIHNiaWNfYXJtX3dyaXRlbmV4dChob3N0LT5zY3NpLmlvX3BvcnQsIHJlc2lkdWFsID4+IDE2KTsKQEAgLTIyNzAsNyArMjI3MCw3IEBACiAJY2FzZSAweDRiOgkJCS8qIC0+IFBIQVNFX1NUQVRVU0lOCQkJCSovCiAJY2FzZSAweDhiOgkJCS8qIC0+IFBIQVNFX1NUQVRVU0lOCQkJCSovCiAJICAgIC8qIERBVEEgSU4gLT4gU1RBVFVTICovCi0JICAgIGhvc3QtPnNjc2kuU0NwLnNjc2lfeGZlcnJlZCA9IGhvc3QtPlNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gLQorCSAgICBob3N0LT5zY3NpLlNDcC5zY3NpX3hmZXJyZWQgPSBzY3NpX2J1ZmZsZW4oaG9zdC0+U0NwbnQpIC0KIAkJCQkJICBhY29ybnNjc2lfc2JpY194ZmNvdW50KGhvc3QpOwogCSAgICBhY29ybnNjc2lfZG1hX3N0b3AoaG9zdCk7CiAJICAgIGFjb3Juc2NzaV9yZWFkc3RhdHVzYnl0ZShob3N0KTsKQEAgLTIyODEsNyArMjI4MSw3IEBACiAJY2FzZSAweDRlOgkJCS8qIC0+IFBIQVNFX01TR09VVAkJCQkqLwogCWNhc2UgMHg4ZToJCQkvKiAtPiBQSEFTRV9NU0dPVVQJCQkJKi8KIAkgICAgLyogREFUQSBJTiAtPiBNRVNTQUdFIE9VVCAqLwotCSAgICBob3N0LT5zY3NpLlNDcC5zY3NpX3hmZXJyZWQgPSBob3N0LT5TQ3BudC0+cmVxdWVzdF9idWZmbGVuIC0KKwkgICAgaG9zdC0+c2NzaS5TQ3Auc2NzaV94ZmVycmVkID0gc2NzaV9idWZmbGVuKGhvc3QtPlNDcG50KSAtCiAJCQkJCSAgYWNvcm5zY3NpX3NiaWNfeGZjb3VudChob3N0KTsKIAkgICAgYWNvcm5zY3NpX2RtYV9zdG9wKGhvc3QpOwogCSAgICBhY29ybnNjc2lfc2VuZG1lc3NhZ2UoaG9zdCk7CkBAIC0yMjkxLDcgKzIyOTEsNyBAQAogCWNhc2UgMHg0ZjoJCQkvKiBtZXNzYWdlIGluCQkJCQkqLwogCWNhc2UgMHg4ZjoJCQkvKiBtZXNzYWdlIGluCQkJCQkqLwogCSAgICAvKiBEQVRBIElOIC0+IE1FU1NBR0UgSU4gKi8KLQkgICAgaG9zdC0+c2NzaS5TQ3Auc2NzaV94ZmVycmVkID0gaG9zdC0+U0NwbnQtPnJlcXVlc3RfYnVmZmxlbiAtCisJICAgIGhvc3QtPnNjc2kuU0NwLnNjc2lfeGZlcnJlZCA9IHNjc2lfYnVmZmxlbihob3N0LT5TQ3BudCkgLQogCQkJCQkgIGFjb3Juc2NzaV9zYmljX3hmY291bnQoaG9zdCk7CiAJICAgIGFjb3Juc2NzaV9kbWFfc3RvcChob3N0KTsKIAkgICAgYWNvcm5zY3NpX21lc3NhZ2UoaG9zdCk7CS8qIC0+IFBIQVNFX01TR0lOLCBQSEFTRV9ESVNDT05ORUNUCQkqLwpAQCAtMjMxOSw3ICsyMzE5LDcgQEAKIAljYXNlIDB4NGI6CQkJLyogLT4gUEhBU0VfU1RBVFVTSU4JCQkJKi8KIAljYXNlIDB4OGI6CQkJLyogLT4gUEhBU0VfU1RBVFVTSU4JCQkJKi8KIAkgICAgLyogREFUQSBPVVQgLT4gU1RBVFVTICovCi0JICAgIGhvc3QtPnNjc2kuU0NwLnNjc2lfeGZlcnJlZCA9IGhvc3QtPlNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4gLQorCSAgICBob3N0LT5zY3NpLlNDcC5zY3NpX3hmZXJyZWQgPSBzY3NpX2J1ZmZsZW4oaG9zdC0+U0NwbnQpIC0KIAkJCQkJICBhY29ybnNjc2lfc2JpY194ZmNvdW50KGhvc3QpOwogCSAgICBhY29ybnNjc2lfZG1hX3N0b3AoaG9zdCk7CiAJICAgIGFjb3Juc2NzaV9kbWFfYWRqdXN0KGhvc3QpOwpAQCAtMjMzMSw3ICsyMzMxLDcgQEAKIAljYXNlIDB4NGU6CQkJLyogLT4gUEhBU0VfTVNHT1VUCQkJCSovCiAJY2FzZSAweDhlOgkJCS8qIC0+IFBIQVNFX01TR09VVAkJCQkqLwogCSAgICAvKiBEQVRBIE9VVCAtPiBNRVNTQUdFIE9VVCAqLwotCSAgICBob3N0LT5zY3NpLlNDcC5zY3NpX3hmZXJyZWQgPSBob3N0LT5TQ3BudC0+cmVxdWVzdF9idWZmbGVuIC0KKwkgICAgaG9zdC0+c2NzaS5TQ3Auc2NzaV94ZmVycmVkID0gc2NzaV9idWZmbGVuKGhvc3QtPlNDcG50KSAtCiAJCQkJCSAgYWNvcm5zY3NpX3NiaWNfeGZjb3VudChob3N0KTsKIAkgICAgYWNvcm5zY3NpX2RtYV9zdG9wKGhvc3QpOwogCSAgICBhY29ybnNjc2lfZG1hX2FkanVzdChob3N0KTsKQEAgLTIzNDIsNyArMjM0Miw3IEBACiAJY2FzZSAweDRmOgkJCS8qIG1lc3NhZ2UgaW4JCQkJCSovCiAJY2FzZSAweDhmOgkJCS8qIG1lc3NhZ2UgaW4JCQkJCSovCiAJICAgIC8qIERBVEEgT1VUIC0+IE1FU1NBR0UgSU4gKi8KLQkgICAgaG9zdC0+c2NzaS5TQ3Auc2NzaV94ZmVycmVkID0gaG9zdC0+U0NwbnQtPnJlcXVlc3RfYnVmZmxlbiAtCisJICAgIGhvc3QtPnNjc2kuU0NwLnNjc2lfeGZlcnJlZCA9IHNjc2lfYnVmZmxlbihob3N0LT5TQ3BudCkgLQogCQkJCQkgIGFjb3Juc2NzaV9zYmljX3hmY291bnQoaG9zdCk7CiAJICAgIGFjb3Juc2NzaV9kbWFfc3RvcChob3N0KTsKIAkgICAgYWNvcm5zY3NpX2RtYV9hZGp1c3QoaG9zdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJtL3Njc2kuaCBiL2RyaXZlcnMvc2NzaS9hcm0vc2NzaS5oCmluZGV4IGJiNjU1MGUuLjEzOGE1MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hcm0vc2NzaS5oCisrKyBiL2RyaXZlcnMvc2NzaS9hcm0vc2NzaS5oCkBAIC0xOCwxNyArMTgsMzIgQEAKICAqIFRoZSBzY2F0dGVyLWdhdGhlciBsaXN0IGhhbmRsaW5nLiAgVGhpcyBjb250YWlucyBhbGwKICAqIHRoZSB5dWNreSBzdHVmZiB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkIHByb3Blcmx5LgogICovCisKKy8qCisgKiBjb3B5X1NDcF90b19zZygpIEFzc3VtZXMgY29udGlndW91cyBhbGxvY2F0aW9uIGF0IEBzZyBvZiBhdC1tb3N0IEBtYXgKKyAqIGVudHJpZXMgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuIFNDcCBpcyBmcm9tIHNjc2ktbWwgYW5kIGhhcyBhIHZhbGlkCisgKiAocG9zc2libHkgY2hhaW5lZCkgc2ctbGlzdAorICovCiBzdGF0aWMgaW5saW5lIGludCBjb3B5X1NDcF90b19zZyhzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBzdHJ1Y3Qgc2NzaV9wb2ludGVyICpTQ3AsIGludCBtYXgpCiB7CiAJaW50IGJ1ZnMgPSBTQ3AtPmJ1ZmZlcnNfcmVzaWR1YWw7CiAKKwkvKiBGSVhNRTogSXQgc2hvdWxkIGJlIGVhc3kgZm9yIGRyaXZlcnMgdG8gbG9vcCBvbiBjb3B5X1NDcF90b19zZygpLgorCSAqIGFuZCB0byByZW1vdmUgdGhpcyBCVUdfT04uIFVzZSBtaW4oKSBpbi1pdHMtcGxhY2UKKwkgKi8KIAlCVUdfT04oYnVmcyArIDEgPiBtYXgpOwogCiAJc2dfc2V0X2J1ZihzZywgU0NwLT5wdHIsIFNDcC0+dGhpc19yZXNpZHVhbCk7CiAKLQlpZiAoYnVmcykKLQkJbWVtY3B5KHNnICsgMSwgU0NwLT5idWZmZXIgKyAxLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCkgKiBidWZzKTsKKwlpZiAoYnVmcykgeworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyY19zZzsKKwkJdW5zaWduZWQgaTsKKworCQlmb3JfZWFjaF9zZyhzZ19uZXh0KFNDcC0+YnVmZmVyKSwgc3JjX3NnLCBidWZzLCBpKQorCQkJKigrK3NnKSA9ICpzcmNfc2c7CisJCXNnX21hcmtfZW5kKHNnKTsKKwl9CisKIAlyZXR1cm4gYnVmcyArIDE7CiB9CiAKQEAgLTM2LDcgKzUxLDcgQEAKIHsKIAlpbnQgcmV0ID0gU0NwLT5idWZmZXJzX3Jlc2lkdWFsOwogCWlmIChyZXQpIHsKLQkJU0NwLT5idWZmZXIrKzsKKwkJU0NwLT5idWZmZXIgPSBzZ19uZXh0KFNDcC0+YnVmZmVyKTsKIAkJU0NwLT5idWZmZXJzX3Jlc2lkdWFsLS07CiAJCVNDcC0+cHRyID0gc2dfdmlydChTQ3AtPmJ1ZmZlcik7CiAJCVNDcC0+dGhpc19yZXNpZHVhbCA9IFNDcC0+YnVmZmVyLT5sZW5ndGg7CkBAIC02OCw0NiArODMsNDYgQEAKIHsKIAltZW1zZXQoJlNDcG50LT5TQ3AsIDAsIHNpemVvZihzdHJ1Y3Qgc2NzaV9wb2ludGVyKSk7CiAKLQlpZiAoU0NwbnQtPnVzZV9zZykgeworCWlmIChzY3NpX2J1ZmZsZW4oU0NwbnQpKSB7CiAJCXVuc2lnbmVkIGxvbmcgbGVuID0gMDsKLQkJaW50IGJ1ZjsKIAotCQlTQ3BudC0+U0NwLmJ1ZmZlciA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgU0NwbnQtPnJlcXVlc3RfYnVmZmVyOwotCQlTQ3BudC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSBTQ3BudC0+dXNlX3NnIC0gMTsKKwkJU0NwbnQtPlNDcC5idWZmZXIgPSBzY3NpX3NnbGlzdChTQ3BudCk7CisJCVNDcG50LT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IHNjc2lfc2dfY291bnQoU0NwbnQpIC0gMTsKIAkJU0NwbnQtPlNDcC5wdHIgPSBzZ192aXJ0KFNDcG50LT5TQ3AuYnVmZmVyKTsKIAkJU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsID0gU0NwbnQtPlNDcC5idWZmZXItPmxlbmd0aDsKLQkJU0NwbnQtPlNDcC5waGFzZSA9IFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW47CisJCVNDcG50LT5TQ3AucGhhc2UgPSBzY3NpX2J1ZmZsZW4oU0NwbnQpOwogCiAjaWZkZWYgQkVMVF9BTkRfQlJBQ0VTCi0JCS8qCi0JCSAqIENhbGN1bGF0ZSBjb3JyZWN0IGJ1ZmZlciBsZW5ndGguICBTb21lIGNvbW1hbmRzCi0JCSAqIGNvbWUgaW4gd2l0aCB0aGUgd3JvbmcgcmVxdWVzdF9idWZmbGVuLgotCQkgKi8KLQkJZm9yIChidWYgPSAwOyBidWYgPD0gU0NwbnQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsOyBidWYrKykKLQkJCWxlbiArPSBTQ3BudC0+U0NwLmJ1ZmZlcltidWZdLmxlbmd0aDsKKwkJewkvKgorCQkJICogQ2FsY3VsYXRlIGNvcnJlY3QgYnVmZmVyIGxlbmd0aC4gIFNvbWUgY29tbWFuZHMKKwkJCSAqIGNvbWUgaW4gd2l0aCB0aGUgd3Jvbmcgc2NzaV9idWZmbGVuLgorCQkJICovCisJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCQkJdW5zaWduZWQgaSwgc2dfY291bnQgPSBzY3NpX3NnX2NvdW50KFNDcG50KTsKIAotCQlpZiAoU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiAhPSBsZW4pCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQuJWM6IGJhZCByZXF1ZXN0IGJ1ZmZlciAiCi0JCQkgICAgICAgImxlbmd0aCAlZCwgc2hvdWxkIGJlICVsZFxuIiwgU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdF9ubywKLQkJCSAgICAgICAnMCcgKyBTQ3BudC0+ZGV2aWNlLT5pZCwgU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiwgbGVuKTsKLQkJU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiA9IGxlbjsKKwkJCXNjc2lfZm9yX2VhY2hfc2coU0NwbnQsIHNnLCBzZ19jb3VudCwgaSkKKwkJCQlsZW4gKz0gc2ctPmxlbmd0aDsKKworCQkJaWYgKHNjc2lfYnVmZmxlbihTQ3BudCkgIT0gbGVuKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSAgICAgICAic2NzaSVkLiVjOiBiYWQgcmVxdWVzdCBidWZmZXIgIgorCQkJCSAgICAgICAibGVuZ3RoICVkLCBzaG91bGQgYmUgJWxkXG4iLAorCQkJCQlTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vLAorCQkJCQknMCcgKyBTQ3BudC0+ZGV2aWNlLT5pZCwKKwkJCQkJc2NzaV9idWZmbGVuKFNDcG50KSwgbGVuKTsKKwkJCQkvKgorCQkJCSAqIEZJWE1FOiBUb3RhbHkgbmFpdmUgZml4dXAuIFdlIHNob3VsZCBhYm9ydAorCQkJCSAqIHdpdGggZXJyb3IKKwkJCQkgKi8KKwkJCQlTQ3BudC0+U0NwLnBoYXNlID0KKwkJCQkJbWluX3QodW5zaWduZWQgbG9uZywgbGVuLAorCQkJCQkgICAgICBzY3NpX2J1ZmZsZW4oU0NwbnQpKTsKKwkJCX0KKwkJfQogI2VuZGlmCiAJfSBlbHNlIHsKLQkJU0NwbnQtPlNDcC5wdHIgPSAodW5zaWduZWQgY2hhciAqKVNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKLQkJU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsID0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbjsKLQkJU0NwbnQtPlNDcC5waGFzZSA9IFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW47Ci0JfQotCi0JLyoKLQkgKiBJZiB0aGUgdXBwZXIgU0NTSSBsYXllcnMgcGFzcyBhIGJ1ZmZlciwgYnV0IHplcm8gbGVuZ3RoLAotCSAqIHdlIGFyZW4ndCBpbnRlcmVzdGVkIGluIHRoZSBidWZmZXIgcG9pbnRlci4KLQkgKi8KLQlpZiAoU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsID09IDAgJiYgU0NwbnQtPlNDcC5wdHIpIHsKLSNpZiAwIC8vZGVmIEJFTFRfQU5EX0JSQUNFUwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQuJWM6IHplcm8gbGVuZ3RoIGJ1ZmZlciBwYXNzZWQgZm9yICIKLQkJICAgICAgICJjb21tYW5kICIsIFNDcG50LT5ob3N0LT5ob3N0X25vLCAnMCcgKyBTQ3BudC0+dGFyZ2V0KTsKLQkJX19zY3NpX3ByaW50X2NvbW1hbmQoU0NwbnQtPmNtbmQpOwotI2VuZGlmCiAJCVNDcG50LT5TQ3AucHRyID0gTlVMTDsKKwkJU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsID0gMDsKKwkJU0NwbnQtPlNDcC5waGFzZSA9IDA7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JsejEyMzAuYyBiL2RyaXZlcnMvc2NzaS9ibHoxMjMwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZjdjMjQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zY3NpL2JsejEyMzAuYworKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKiBibHoxMjMwLmM6IERyaXZlciBmb3IgQmxpenphcmQgMTIzMCBTQ1NJIElWIENvbnRyb2xsZXIuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk2IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspCi0gKgotICogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gdGhlIEN5YmVyU3Rvcm0gZHJpdmVyLCBoZW5jZSB0aGUgb2NjYXNpb25hbAotICogcmVmZXJlbmNlIHRvIEN5YmVyU3Rvcm0uCi0gKi8KLQotLyogVE9ETzoKLSAqCi0gKiAxKSBGaWd1cmUgb3V0IGhvdyB0byBtYWtlIGEgY2xlYW5lciBtZXJnZSB3aXRoIHRoZSBzcGFyYyBkcml2ZXIgd2l0aCByZWdhcmQKLSAqICAgIHRvIHRoZSBjYWNoZXMgYW5kIHRoZSBTcGFyYyBNTVUgbWFwcGluZy4KLSAqIDIpIE1ha2UgYXMgZmV3IHJvdXRpbmVzIHJlcXVpcmVkIG91dHNpZGUgdGhlIGdlbmVyaWMgZHJpdmVyLiBBIGxvdCBvZiB0aGUKLSAqICAgIHJvdXRpbmVzIGluIHRoaXMgZmlsZSB1c2VkIHRvIGJlIGlubGluZSEKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotCi0jaW5jbHVkZSAic2NzaS5oIgotI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+Ci0jaW5jbHVkZSAiTkNSNTNDOXguaCIKLQotI2luY2x1ZGUgPGxpbnV4L3pvcnJvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KLSNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgotCi0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLQotI2RlZmluZSBNS0lWIDEKLQotLyogVGhlIGNvbnRyb2xsZXIgcmVnaXN0ZXJzIGNhbiBiZSBmb3VuZCBpbiB0aGUgWjIgY29uZmlnIGFyZWEgYXQgdGhlc2UKLSAqIG9mZnNldHM6Ci0gKi8KLSNkZWZpbmUgQkxaMTIzMF9FU1BfQUREUiAweDgwMDAKLSNkZWZpbmUgQkxaMTIzMF9ETUFfQUREUiAweDEwMDAwCi0jZGVmaW5lIEJMWjEyMzBJSV9FU1BfQUREUiAweDEwMDAwCi0jZGVmaW5lIEJMWjEyMzBJSV9ETUFfQUREUiAweDEwMDIxCi0KLQotLyogVGhlIEJsaXp6YXJkIDEyMzAgRE1BIGludGVyZmFjZQotICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICogT25seSB0d28gdGhpbmdzIGNhbiBiZSBwcm9ncmFtbWVkIGluIHRoZSBCbGl6emFyZCBETUE6Ci0gKiAgMSkgVGhlIGRhdGEgZGlyZWN0aW9uIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHN0YXR1cyBvZiBiaXQgMzEgKDEgPSB3cml0ZSkKLSAqICAyKSBUaGUgc291cmNlL2Rlc3QgYWRkcmVzcyAod29yZCBhbGlnbmVkLCBzaGlmdGVkIG9uZSByaWdodCkgaW4gYml0cyAzMC0wCi0gKgotICogUHJvZ3JhbSBETUEgYnkgZmlyc3QgbGF0Y2hpbmcgdGhlIGhpZ2hlc3QgYnl0ZSBvZiB0aGUgYWRkcmVzcy9kaXJlY3Rpb24KLSAqIChpLmUuIGJpdHMgMzEtMjQgb2YgdGhlIGxvbmcgd29yZCBjb25zdHJ1Y3RlZCBhcyBkZXNjcmliZWQgaW4gc3RlcHMgMSsyCi0gKiBhYm92ZSkuIFRoZW4gd3JpdGUgZWFjaCBieXRlIG9mIHRoZSBhZGRyZXNzL2RpcmVjdGlvbiAoc3RhcnRpbmcgd2l0aCB0aGUKLSAqIHRvcCBieXRlLCB3b3JraW5nIGRvd24pIHRvIHRoZSBETUEgYWRkcmVzcyByZWdpc3Rlci4KLSAqCi0gKiBGaWd1cmUgb3V0IGludGVycnVwdCBzdGF0dXMgYnkgcmVhZGluZyB0aGUgRVNQIHN0YXR1cyBieXRlLgotICovCi1zdHJ1Y3QgYmx6MTIzMF9kbWFfcmVnaXN0ZXJzIHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGRtYV9hZGRyOyAJLyogRE1BIGFkZHJlc3MgICAgICBbMHgwMDAwXSAqLwotCXVuc2lnbmVkIGNoYXIgZG1hcGFkMlsweDdmZmZdOwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZG1hX2xhdGNoOyAJLyogRE1BIGxhdGNoICAgICAgICBbMHg4MDAwXSAqLwotfTsKLQotc3RydWN0IGJsejEyMzBJSV9kbWFfcmVnaXN0ZXJzIHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGRtYV9hZGRyOyAJLyogRE1BIGFkZHJlc3MgICAgICBbMHgwMDAwXSAqLwotCXVuc2lnbmVkIGNoYXIgZG1hcGFkMlsweGZdOwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZG1hX2xhdGNoOyAJLyogRE1BIGxhdGNoICAgICAgICBbMHgwMDEwXSAqLwotfTsKLQotI2RlZmluZSBCTFoxMjMwX0RNQV9XUklURSAweDgwMDAwMDAwCi0KLXN0YXRpYyBpbnQgIGRtYV9ieXRlc19zZW50KHN0cnVjdCBOQ1JfRVNQICplc3AsIGludCBmaWZvX2NvdW50KTsKLXN0YXRpYyBpbnQgIGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCk7Ci1zdGF0aWMgdm9pZCBkbWFfZHVtcF9zdGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCk7Ci1zdGF0aWMgdm9pZCBkbWFfaW5pdF93cml0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgbGVuZ3RoKTsKLXN0YXRpYyB2b2lkIGRtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApOwotc3RhdGljIGludCAgZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICplc3ApOwotc3RhdGljIGludCAgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCk7Ci1zdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpOwotCi1zdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBjbWRfYnVmZmVyWzE2XTsKLQkJCQkvKiBUaGlzIGlzIHdoZXJlIGFsbCBjb21tYW5kcyBhcmUgcHV0Ci0JCQkJICogYmVmb3JlIHRoZXkgYXJlIHRyYW5zZmVycmVkIHRvIHRoZSBFU1AgY2hpcAotCQkJCSAqIHZpYSBQSU8uCi0JCQkJICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEZXRlY3Rpb24gKi8KLWludCBfX2luaXQgYmx6MTIzMF9lc3BfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQpCi17Ci0Jc3RydWN0IE5DUl9FU1AgKmVzcDsKLQlzdHJ1Y3Qgem9ycm9fZGV2ICp6ID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGFkZHJlc3M7Ci0Jc3RydWN0IEVTUF9yZWdzICplcmVnczsKLQl1bnNpZ25lZCBsb25nIGJvYXJkOwotCi0jaWYgTUtJVgotI2RlZmluZSBSRUFMX0JMWjEyMzBfSUQJCVpPUlJPX1BST0RfUEhBU0U1X0JMSVpaQVJEXzEyMzBfSVZfMTI2MAotI2RlZmluZSBSRUFMX0JMWjEyMzBfRVNQX0FERFIJQkxaMTIzMF9FU1BfQUREUgotI2RlZmluZSBSRUFMX0JMWjEyMzBfRE1BX0FERFIJQkxaMTIzMF9ETUFfQUREUgotI2Vsc2UKLSNkZWZpbmUgUkVBTF9CTFoxMjMwX0lECQlaT1JST19QUk9EX1BIQVNFNV9CTElaWkFSRF8xMjMwX0lJX0ZBU1RMQU5FX1ozX0NZQkVSU0NTSV9DWUJFUlNUT1JNMDYwCi0jZGVmaW5lIFJFQUxfQkxaMTIzMF9FU1BfQUREUglCTFoxMjMwSUlfRVNQX0FERFIKLSNkZWZpbmUgUkVBTF9CTFoxMjMwX0RNQV9BRERSCUJMWjEyMzBJSV9ETUFfQUREUgotI2VuZGlmCi0KLQlpZiAoKHogPSB6b3Jyb19maW5kX2RldmljZShSRUFMX0JMWjEyMzBfSUQsIHopKSkgewotCSAgICBib2FyZCA9IHotPnJlc291cmNlLnN0YXJ0OwotCSAgICBpZiAocmVxdWVzdF9tZW1fcmVnaW9uKGJvYXJkK1JFQUxfQkxaMTIzMF9FU1BfQUREUiwKLQkJCQkgICBzaXplb2Yoc3RydWN0IEVTUF9yZWdzKSwgIk5DUjUzQzl4IikpIHsKLQkJLyogRG8gc29tZSBtYWdpYyB0byBmaWd1cmUgb3V0IGlmIHRoZSBibGl6emFyZCBpcwotCQkgKiBlcXVpcHBlZCB3aXRoIGEgU0NTSSBjb250cm9sbGVyCi0JCSAqLwotCQlhZGRyZXNzID0gWlRXT19WQUREUihib2FyZCk7Ci0JCWVyZWdzID0gKHN0cnVjdCBFU1BfcmVncyAqKShhZGRyZXNzICsgUkVBTF9CTFoxMjMwX0VTUF9BRERSKTsKLQkJZXNwID0gZXNwX2FsbG9jYXRlKHRwbnQsICh2b2lkICopYm9hcmQgKyBSRUFMX0JMWjEyMzBfRVNQX0FERFIsCi0JCQkJICAgMCk7Ci0KLQkJZXNwX3dyaXRlKGVyZWdzLT5lc3BfY2ZnMSwgKEVTUF9DT05GSUcxX1BFTkFCTEUgfCA3KSk7Ci0JCXVkZWxheSg1KTsKLQkJaWYoZXNwX3JlYWQoZXJlZ3MtPmVzcF9jZmcxKSAhPSAoRVNQX0NPTkZJRzFfUEVOQUJMRSB8IDcpKQotCQkJZ290byBlcnJfb3V0OwotCi0JCS8qIERvIGNvbW1hbmQgdHJhbnNmZXIgd2l0aCBwcm9ncmFtbWVkIEkvTyAqLwotCQllc3AtPmRvX3Bpb19jbWRzID0gMTsKLQotCQkvKiBSZXF1aXJlZCBmdW5jdGlvbnMgKi8KLQkJZXNwLT5kbWFfYnl0ZXNfc2VudCA9ICZkbWFfYnl0ZXNfc2VudDsKLQkJZXNwLT5kbWFfY2FuX3RyYW5zZmVyID0gJmRtYV9jYW5fdHJhbnNmZXI7Ci0JCWVzcC0+ZG1hX2R1bXBfc3RhdGUgPSAmZG1hX2R1bXBfc3RhdGU7Ci0JCWVzcC0+ZG1hX2luaXRfcmVhZCA9ICZkbWFfaW5pdF9yZWFkOwotCQllc3AtPmRtYV9pbml0X3dyaXRlID0gJmRtYV9pbml0X3dyaXRlOwotCQllc3AtPmRtYV9pbnRzX29mZiA9ICZkbWFfaW50c19vZmY7Ci0JCWVzcC0+ZG1hX2ludHNfb24gPSAmZG1hX2ludHNfb247Ci0JCWVzcC0+ZG1hX2lycV9wID0gJmRtYV9pcnFfcDsKLQkJZXNwLT5kbWFfcG9ydHNfcCA9ICZkbWFfcG9ydHNfcDsKLQkJZXNwLT5kbWFfc2V0dXAgPSAmZG1hX3NldHVwOwotCi0JCS8qIE9wdGlvbmFsIGZ1bmN0aW9ucyAqLwotCQllc3AtPmRtYV9iYXJyaWVyID0gMDsKLQkJZXNwLT5kbWFfZHJhaW4gPSAwOwotCQllc3AtPmRtYV9pbnZhbGlkYXRlID0gMDsKLQkJZXNwLT5kbWFfaXJxX2VudHJ5ID0gMDsKLQkJZXNwLT5kbWFfaXJxX2V4aXQgPSAwOwotCQllc3AtPmRtYV9sZWRfb24gPSAwOwotCQllc3AtPmRtYV9sZWRfb2ZmID0gMDsKLQkJZXNwLT5kbWFfcG9sbCA9IDA7Ci0JCWVzcC0+ZG1hX3Jlc2V0ID0gMDsKLQotCQkvKiBTQ1NJIGNoaXAgc3BlZWQgKi8KLQkJZXNwLT5jZnJlcSA9IDQwMDAwMDAwOwotCi0JCS8qIFRoZSBETUEgcmVnaXN0ZXJzIG9uIHRoZSBCbGl6emFyZCBhcmUgbWFwcGVkCi0JCSAqIHJlbGF0aXZlIHRvIHRoZSBkZXZpY2UgKGkuZS4gaW4gdGhlIHNhbWUgWm9ycm8KLQkJICogSS9PIGJsb2NrKS4KLQkJICovCi0JCWVzcC0+ZHJlZ3MgPSAodm9pZCAqKShhZGRyZXNzICsgUkVBTF9CTFoxMjMwX0RNQV9BRERSKTsKLQkKLQkJLyogRVNQIHJlZ2lzdGVyIGJhc2UgKi8KLQkJZXNwLT5lcmVncyA9IGVyZWdzOwotCi0JCS8qIFNldCB0aGUgY29tbWFuZCBidWZmZXIgKi8KLQkJZXNwLT5lc3BfY29tbWFuZCA9IGNtZF9idWZmZXI7Ci0JCWVzcC0+ZXNwX2NvbW1hbmRfZHZtYSA9IHZpcnRfdG9fYnVzKCh2b2lkICopY21kX2J1ZmZlcik7Ci0KLQkJZXNwLT5pcnEgPSBJUlFfQU1JR0FfUE9SVFM7Ci0JCWVzcC0+c2xvdCA9IGJvYXJkK1JFQUxfQkxaMTIzMF9FU1BfQUREUjsKLQkJaWYgKHJlcXVlc3RfaXJxKElSUV9BTUlHQV9QT1JUUywgZXNwX2ludHIsIElSUUZfU0hBUkVELAotCQkJCSAiQmxpenphcmQgMTIzMCBTQ1NJIElWIiwgZXNwLT5laG9zdCkpCi0JCQlnb3RvIGVycl9vdXQ7Ci0KLQkJLyogRmlndXJlIG91dCBvdXIgc2NzaSBJRCBvbiB0aGUgYnVzICovCi0JCWVzcC0+c2NzaV9pZCA9IDc7Ci0JCQotCQkvKiBXZSBkb24ndCBoYXZlIGEgZGlmZmVyZW50aWFsIFNDU0ktYnVzLiAqLwotCQllc3AtPmRpZmYgPSAwOwotCi0JCWVzcF9pbml0aWFsaXplKGVzcCk7Ci0KLQkJcHJpbnRrKCJFU1A6IFRvdGFsIG9mICVkIEVTUCBob3N0cyBmb3VuZCwgJWQgYWN0dWFsbHkgaW4gdXNlLlxuIiwgbmVzcHMsIGVzcHNfaW5fdXNlKTsKLQkJZXNwc19ydW5uaW5nID0gZXNwc19pbl91c2U7Ci0JCXJldHVybiBlc3BzX2luX3VzZTsKLQkgICAgfQotCX0KLQlyZXR1cm4gMDsKLSAKLSBlcnJfb3V0OgotCXNjc2lfdW5yZWdpc3Rlcihlc3AtPmVob3N0KTsKLQllc3BfZGVhbGxvY2F0ZShlc3ApOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihib2FyZCtSRUFMX0JMWjEyMzBfRVNQX0FERFIsCi0JCQkgICBzaXplb2Yoc3RydWN0IEVTUF9yZWdzKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERNQSBGdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgZG1hX2J5dGVzX3NlbnQoc3RydWN0IE5DUl9FU1AgKmVzcCwgaW50IGZpZm9fY291bnQpCi17Ci0JLyogU2luY2UgdGhlIEJsaXp6YXJkIERNQSBpcyBmdWxseSBkZWRpY2F0ZWQgdG8gdGhlIEVTUCBjaGlwLAotCSAqIHRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudCAodG8gdGhlIEVTUCBjaGlwKSBlcXVhbHMgdGhlIG51bWJlcgotCSAqIG9mIGJ5dGVzIGluIHRoZSBGSUZPIC0gdGhlcmUgaXMgbm8gYnVmZmVyaW5nIGluIHRoZSBETUEgY29udHJvbGxlci4KLQkgKiBYWFhYIERvIEkgcmVhZCB0aGlzIHJpZ2h0PyBJdCBpcyBmcm9tIGhvc3QgdG8gRVNQLCByaWdodD8KLQkgKi8KLQlyZXR1cm4gZmlmb19jb3VudDsKLX0KLQotc3RhdGljIGludCBkbWFfY2FuX3RyYW5zZmVyKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCi17Ci0JLyogSSBkb24ndCB0aGluayB0aGVyZSdzIGFueSBsaW1pdCBvbiB0aGUgQmxpenphcmQgRE1BLiBTbyB3ZSB1c2Ugd2hhdAotCSAqIHRoZSBFU1AgY2hpcCBjYW4gaGFuZGxlICgyNCBiaXQpLgotCSAqLwotCXVuc2lnbmVkIGxvbmcgc3ogPSBzcC0+U0NwLnRoaXNfcmVzaWR1YWw7Ci0JaWYoc3ogPiAweDEwMDAwMDApCi0JCXN6ID0gMHgxMDAwMDAwOwotCXJldHVybiBzejsKLX0KLQotc3RhdGljIHZvaWQgZG1hX2R1bXBfc3RhdGUoc3RydWN0IE5DUl9FU1AgKmVzcCkKLXsKLQlFU1BMT0coKCJpbnRyZXE6PCUwNHg+LCBpbnRlbmE6PCUwNHg+XG4iLAotCQlhbWlnYV9jdXN0b20uaW50cmVxciwgYW1pZ2FfY3VzdG9tLmludGVuYXIpKTsKLX0KLQotdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBsZW5ndGgpCi17Ci0jaWYgTUtJVgotCXN0cnVjdCBibHoxMjMwX2RtYV9yZWdpc3RlcnMgKmRyZWdzID0gCi0JCShzdHJ1Y3QgYmx6MTIzMF9kbWFfcmVnaXN0ZXJzICopIChlc3AtPmRyZWdzKTsKLSNlbHNlCi0Jc3RydWN0IGJsejEyMzBJSV9kbWFfcmVnaXN0ZXJzICpkcmVncyA9IAotCQkoc3RydWN0IGJsejEyMzBJSV9kbWFfcmVnaXN0ZXJzICopIChlc3AtPmRyZWdzKTsKLSNlbmRpZgotCi0JY2FjaGVfY2xlYXIoYWRkciwgbGVuZ3RoKTsKLQotCWFkZHIgPj49IDE7Ci0JYWRkciAmPSB+KEJMWjEyMzBfRE1BX1dSSVRFKTsKLQotCS8qIEZpcnN0IHNldCBsYXRjaCAqLwotCWRyZWdzLT5kbWFfbGF0Y2ggPSAoYWRkciA+PiAyNCkgJiAweGZmOwotCi0JLyogVGhlbiBwdW1wIHRoZSBhZGRyZXNzIHRvIHRoZSBETUEgYWRkcmVzcyByZWdpc3RlciAqLwotI2lmIE1LSVYKLQlkcmVncy0+ZG1hX2FkZHIgPSAoYWRkciA+PiAyNCkgJiAweGZmOwotI2VuZGlmCi0JZHJlZ3MtPmRtYV9hZGRyID0gKGFkZHIgPj4gMTYpICYgMHhmZjsKLQlkcmVncy0+ZG1hX2FkZHIgPSAoYWRkciA+PiAgOCkgJiAweGZmOwotCWRyZWdzLT5kbWFfYWRkciA9IChhZGRyICAgICAgKSAmIDB4ZmY7Ci19Ci0KLXZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCkKLXsKLSNpZiBNS0lWCi0Jc3RydWN0IGJsejEyMzBfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPSAKLQkJKHN0cnVjdCBibHoxMjMwX2RtYV9yZWdpc3RlcnMgKikgKGVzcC0+ZHJlZ3MpOwotI2Vsc2UKLQlzdHJ1Y3QgYmx6MTIzMElJX2RtYV9yZWdpc3RlcnMgKmRyZWdzID0gCi0JCShzdHJ1Y3QgYmx6MTIzMElJX2RtYV9yZWdpc3RlcnMgKikgKGVzcC0+ZHJlZ3MpOwotI2VuZGlmCi0KLQljYWNoZV9wdXNoKGFkZHIsIGxlbmd0aCk7Ci0KLQlhZGRyID4+PSAxOwotCWFkZHIgfD0gQkxaMTIzMF9ETUFfV1JJVEU7Ci0KLQkvKiBGaXJzdCBzZXQgbGF0Y2ggKi8KLQlkcmVncy0+ZG1hX2xhdGNoID0gKGFkZHIgPj4gMjQpICYgMHhmZjsKLQotCS8qIFRoZW4gcHVtcCB0aGUgYWRkcmVzcyB0byB0aGUgRE1BIGFkZHJlc3MgcmVnaXN0ZXIgKi8KLSNpZiBNS0lWCi0JZHJlZ3MtPmRtYV9hZGRyID0gKGFkZHIgPj4gMjQpICYgMHhmZjsKLSNlbmRpZgotCWRyZWdzLT5kbWFfYWRkciA9IChhZGRyID4+IDE2KSAmIDB4ZmY7Ci0JZHJlZ3MtPmRtYV9hZGRyID0gKGFkZHIgPj4gIDgpICYgMHhmZjsKLQlkcmVncy0+ZG1hX2FkZHIgPSAoYWRkciAgICAgICkgJiAweGZmOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCkKLXsKLQlkaXNhYmxlX2lycShlc3AtPmlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci0JZW5hYmxlX2lycShlc3AtPmlycSk7Ci19Ci0KLXN0YXRpYyBpbnQgZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci0JcmV0dXJuIChlc3BfcmVhZChlc3AtPmVyZWdzLT5lc3Bfc3RhdHVzKSAmIEVTUF9TVEFUX0lOVFIpOwotfQotCi1zdGF0aWMgaW50IGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci0JcmV0dXJuICgoYW1pZ2FfY3VzdG9tLmludGVuYXIpICYgSUZfUE9SVFMpOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpCi17Ci0JLyogT24gdGhlIFNwYXJjLCBETUFfU1RfV1JJVEUgbWVhbnMgIm1vdmUgZGF0YSBmcm9tIGRldmljZSB0byBtZW1vcnkiCi0JICogc28gd2hlbiAod3JpdGUpIGlzIHRydWUsIGl0IGFjdHVhbGx5IG1lYW5zIFJFQUQhCi0JICovCi0JaWYod3JpdGUpewotCQlkbWFfaW5pdF9yZWFkKGVzcCwgYWRkciwgY291bnQpOwotCX0gZWxzZSB7Ci0JCWRtYV9pbml0X3dyaXRlKGVzcCwgYWRkciwgY291bnQpOwotCX0KLX0KLQotI2RlZmluZSBIT1NUU19DCi0KLWludCBibHoxMjMwX2VzcF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQotewotI2lmZGVmIE1PRFVMRQotCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKSgoc3RydWN0IE5DUl9FU1AgKilpbnN0YW5jZS0+aG9zdGRhdGEpLT5lZGV2OwotCWVzcF9kZWFsbG9jYXRlKChzdHJ1Y3QgTkNSX0VTUCAqKWluc3RhbmNlLT5ob3N0ZGF0YSk7Ci0JZXNwX3JlbGVhc2UoKTsKLQlyZWxlYXNlX21lbV9yZWdpb24oYWRkcmVzcywgc2l6ZW9mKHN0cnVjdCBFU1BfcmVncykpOwotCWZyZWVfaXJxKElSUV9BTUlHQV9QT1JUUywgZXNwX2ludHIpOwotI2VuZGlmCi0JcmV0dXJuIDE7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0gewotCS5wcm9jX25hbWUJCT0gImVzcC1ibHoxMjMwIiwKLQkucHJvY19pbmZvCQk9IGVzcF9wcm9jX2luZm8sCi0JLm5hbWUJCQk9ICJCbGl6emFyZDEyMzAgU0NTSSBJViIsCi0JLmRldGVjdAkJCT0gYmx6MTIzMF9lc3BfZGV0ZWN0LAotCS5zbGF2ZV9hbGxvYwkJPSBlc3Bfc2xhdmVfYWxsb2MsCi0JLnNsYXZlX2Rlc3Ryb3kJCT0gZXNwX3NsYXZlX2Rlc3Ryb3ksCi0JLnJlbGVhc2UJCT0gYmx6MTIzMF9lc3BfcmVsZWFzZSwKLQkucXVldWVjb21tYW5kCQk9IGVzcF9xdWV1ZSwKLQkuZWhfYWJvcnRfaGFuZGxlcgk9IGVzcF9hYm9ydCwKLQkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBlc3BfcmVzZXQsCi0JLmNhbl9xdWV1ZQkJPSA3LAotCS50aGlzX2lkCQk9IDcsCi0JLnNnX3RhYmxlc2l6ZQkJPSBTR19BTEwsCi0JLmNtZF9wZXJfbHVuCQk9IDEsCi0JLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HCi19OwotCi0KLSNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmx6MjA2MC5jIGIvZHJpdmVycy9zY3NpL2JsejIwNjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYyMDNlYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Njc2kvYmx6MjA2MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qIGJsejIwNjAuYzogRHJpdmVyIGZvciBCbGl6emFyZCAyMDYwIFNDU0kgQ29udHJvbGxlci4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYgSmVzcGVyIFNrb3YgKGpza292QGN5Z251cy5jby51aykKLSAqCi0gKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiB0aGUgQ3liZXJTdG9ybSBkcml2ZXIsIGhlbmNlIHRoZSBvY2Nhc2lvbmFsCi0gKiByZWZlcmVuY2UgdG8gQ3liZXJTdG9ybS4KLSAqLwotCi0vKiBUT0RPOgotICoKLSAqIDEpIEZpZ3VyZSBvdXQgaG93IHRvIG1ha2UgYSBjbGVhbmVyIG1lcmdlIHdpdGggdGhlIHNwYXJjIGRyaXZlciB3aXRoIHJlZ2FyZAotICogICAgdG8gdGhlIGNhY2hlcyBhbmQgdGhlIFNwYXJjIE1NVSBtYXBwaW5nLgotICogMikgTWFrZSBhcyBmZXcgcm91dGluZXMgcmVxdWlyZWQgb3V0c2lkZSB0aGUgZ2VuZXJpYyBkcml2ZXIuIEEgbG90IG9mIHRoZQotICogICAgcm91dGluZXMgaW4gdGhpcyBmaWxlIHVzZWQgdG8gYmUgaW5saW5lIQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KLSNpbmNsdWRlICJzY3NpLmgiCi0jaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KLSNpbmNsdWRlICJOQ1I1M0M5eC5oIgotCi0jaW5jbHVkZSA8bGludXgvem9ycm8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2FtaWdhaW50cy5oPgotI2luY2x1ZGUgPGFzbS9hbWlnYWh3Lmg+Ci0KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotCi0vKiBUaGUgY29udHJvbGxlciByZWdpc3RlcnMgY2FuIGJlIGZvdW5kIGluIHRoZSBaMiBjb25maWcgYXJlYSBhdCB0aGVzZQotICogb2Zmc2V0czoKLSAqLwotI2RlZmluZSBCTFoyMDYwX0VTUF9BRERSIDB4MWZmMDAKLSNkZWZpbmUgQkxaMjA2MF9ETUFfQUREUiAweDFmZmUwCi0KLQotLyogVGhlIEJsaXp6YXJkIDIwNjAgRE1BIGludGVyZmFjZQotICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICogT25seSB0d28gdGhpbmdzIGNhbiBiZSBwcm9ncmFtbWVkIGluIHRoZSBCbGl6emFyZCBETUE6Ci0gKiAgMSkgVGhlIGRhdGEgZGlyZWN0aW9uIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHN0YXR1cyBvZiBiaXQgMzEgKDEgPSB3cml0ZSkKLSAqICAyKSBUaGUgc291cmNlL2Rlc3QgYWRkcmVzcyAod29yZCBhbGlnbmVkLCBzaGlmdGVkIG9uZSByaWdodCkgaW4gYml0cyAzMC0wCi0gKgotICogRmlndXJlIG91dCBpbnRlcnJ1cHQgc3RhdHVzIGJ5IHJlYWRpbmcgdGhlIEVTUCBzdGF0dXMgYnl0ZS4KLSAqLwotc3RydWN0IGJsejIwNjBfZG1hX3JlZ2lzdGVycyB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciBkbWFfbGVkX2N0cmw7CS8qIERNQSBsZWQgY29udHJvbCAgIFsweDAwMF0gKi8KLQl1bnNpZ25lZCBjaGFyIGRtYXBhZDFbMHgwZl07Ci0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciBkbWFfYWRkcjA7IAkvKiBETUEgYWRkcmVzcyAoTVNCKSBbMHgwMTBdICovCi0JdW5zaWduZWQgY2hhciBkbWFwYWQyWzB4MDNdOwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZG1hX2FkZHIxOyAJLyogRE1BIGFkZHJlc3MgICAgICAgWzB4MDE0XSAqLwotCXVuc2lnbmVkIGNoYXIgZG1hcGFkM1sweDAzXTsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGRtYV9hZGRyMjsgCS8qIERNQSBhZGRyZXNzICAgICAgIFsweDAxOF0gKi8KLQl1bnNpZ25lZCBjaGFyIGRtYXBhZDRbMHgwM107Ci0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciBkbWFfYWRkcjM7IAkvKiBETUEgYWRkcmVzcyAoTFNCKSBbMHgwMWNdICovCi19OwotCi0jZGVmaW5lIEJMWjIwNjBfRE1BX1dSSVRFIDB4ODAwMDAwMDAKLQotLyogRE1BIGNvbnRyb2wgYml0cyAqLwotI2RlZmluZSBCTFoyMDYwX0RNQV9MRUQgICAgMHgwMgkJLyogSEQgbGVkIGNvbnRyb2wgMSA9IG9mZiAqLwotCi1zdGF0aWMgaW50ICBkbWFfYnl0ZXNfc2VudChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBpbnQgZmlmb19jb3VudCk7Ci1zdGF0aWMgaW50ICBkbWFfY2FuX3RyYW5zZmVyKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApOwotc3RhdGljIHZvaWQgZG1hX2R1bXBfc3RhdGUoc3RydWN0IE5DUl9FU1AgKmVzcCk7Ci1zdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBsZW5ndGgpOwotc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCk7Ci1zdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCk7Ci1zdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyBpbnQgIGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyB2b2lkIGRtYV9sZWRfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApOwotc3RhdGljIHZvaWQgZG1hX2xlZF9vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyBpbnQgIGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApOwotc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKTsKLQotc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgY21kX2J1ZmZlclsxNl07Ci0JCQkJLyogVGhpcyBpcyB3aGVyZSBhbGwgY29tbWFuZHMgYXJlIHB1dAotCQkJCSAqIGJlZm9yZSB0aGV5IGFyZSB0cmFuc2ZlcnJlZCB0byB0aGUgRVNQIGNoaXAKLQkJCQkgKiB2aWEgUElPLgotCQkJCSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRGV0ZWN0aW9uICovCi1pbnQgX19pbml0IGJsejIwNjBfZXNwX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICp0cG50KQotewotCXN0cnVjdCBOQ1JfRVNQICplc3A7Ci0Jc3RydWN0IHpvcnJvX2RldiAqeiA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBhZGRyZXNzOwotCi0JaWYgKCh6ID0gem9ycm9fZmluZF9kZXZpY2UoWk9SUk9fUFJPRF9QSEFTRTVfQkxJWlpBUkRfMjA2MCwgeikpKSB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgYm9hcmQgPSB6LT5yZXNvdXJjZS5zdGFydDsKLQkgICAgaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihib2FyZCtCTFoyMDYwX0VTUF9BRERSLAotCQkJCSAgIHNpemVvZihzdHJ1Y3QgRVNQX3JlZ3MpLCAiTkNSNTNDOXgiKSkgewotCQllc3AgPSBlc3BfYWxsb2NhdGUodHBudCwgKHZvaWQgKilib2FyZCArIEJMWjIwNjBfRVNQX0FERFIsIDApOwotCi0JCS8qIERvIGNvbW1hbmQgdHJhbnNmZXIgd2l0aCBwcm9ncmFtbWVkIEkvTyAqLwotCQllc3AtPmRvX3Bpb19jbWRzID0gMTsKLQotCQkvKiBSZXF1aXJlZCBmdW5jdGlvbnMgKi8KLQkJZXNwLT5kbWFfYnl0ZXNfc2VudCA9ICZkbWFfYnl0ZXNfc2VudDsKLQkJZXNwLT5kbWFfY2FuX3RyYW5zZmVyID0gJmRtYV9jYW5fdHJhbnNmZXI7Ci0JCWVzcC0+ZG1hX2R1bXBfc3RhdGUgPSAmZG1hX2R1bXBfc3RhdGU7Ci0JCWVzcC0+ZG1hX2luaXRfcmVhZCA9ICZkbWFfaW5pdF9yZWFkOwotCQllc3AtPmRtYV9pbml0X3dyaXRlID0gJmRtYV9pbml0X3dyaXRlOwotCQllc3AtPmRtYV9pbnRzX29mZiA9ICZkbWFfaW50c19vZmY7Ci0JCWVzcC0+ZG1hX2ludHNfb24gPSAmZG1hX2ludHNfb247Ci0JCWVzcC0+ZG1hX2lycV9wID0gJmRtYV9pcnFfcDsKLQkJZXNwLT5kbWFfcG9ydHNfcCA9ICZkbWFfcG9ydHNfcDsKLQkJZXNwLT5kbWFfc2V0dXAgPSAmZG1hX3NldHVwOwotCi0JCS8qIE9wdGlvbmFsIGZ1bmN0aW9ucyAqLwotCQllc3AtPmRtYV9iYXJyaWVyID0gMDsKLQkJZXNwLT5kbWFfZHJhaW4gPSAwOwotCQllc3AtPmRtYV9pbnZhbGlkYXRlID0gMDsKLQkJZXNwLT5kbWFfaXJxX2VudHJ5ID0gMDsKLQkJZXNwLT5kbWFfaXJxX2V4aXQgPSAwOwotCQllc3AtPmRtYV9sZWRfb24gPSAmZG1hX2xlZF9vbjsKLQkJZXNwLT5kbWFfbGVkX29mZiA9ICZkbWFfbGVkX29mZjsKLQkJZXNwLT5kbWFfcG9sbCA9IDA7Ci0JCWVzcC0+ZG1hX3Jlc2V0ID0gMDsKLQotCQkvKiBTQ1NJIGNoaXAgc3BlZWQgKi8KLQkJZXNwLT5jZnJlcSA9IDQwMDAwMDAwOwotCi0JCS8qIFRoZSBETUEgcmVnaXN0ZXJzIG9uIHRoZSBCbGl6emFyZCBhcmUgbWFwcGVkCi0JCSAqIHJlbGF0aXZlIHRvIHRoZSBkZXZpY2UgKGkuZS4gaW4gdGhlIHNhbWUgWm9ycm8KLQkJICogSS9PIGJsb2NrKS4KLQkJICovCi0JCWFkZHJlc3MgPSAodW5zaWduZWQgbG9uZylaVFdPX1ZBRERSKGJvYXJkKTsKLQkJZXNwLT5kcmVncyA9ICh2b2lkICopKGFkZHJlc3MgKyBCTFoyMDYwX0RNQV9BRERSKTsKLQotCQkvKiBFU1AgcmVnaXN0ZXIgYmFzZSAqLwotCQllc3AtPmVyZWdzID0gKHN0cnVjdCBFU1BfcmVncyAqKShhZGRyZXNzICsgQkxaMjA2MF9FU1BfQUREUik7Ci0JCQotCQkvKiBTZXQgdGhlIGNvbW1hbmQgYnVmZmVyICovCi0JCWVzcC0+ZXNwX2NvbW1hbmQgPSBjbWRfYnVmZmVyOwotCQllc3AtPmVzcF9jb21tYW5kX2R2bWEgPSB2aXJ0X3RvX2J1cygodm9pZCAqKWNtZF9idWZmZXIpOwotCi0JCWVzcC0+aXJxID0gSVJRX0FNSUdBX1BPUlRTOwotCQlyZXF1ZXN0X2lycShJUlFfQU1JR0FfUE9SVFMsIGVzcF9pbnRyLCBJUlFGX1NIQVJFRCwKLQkJCSAgICAiQmxpenphcmQgMjA2MCBTQ1NJIiwgZXNwLT5laG9zdCk7Ci0KLQkJLyogRmlndXJlIG91dCBvdXIgc2NzaSBJRCBvbiB0aGUgYnVzICovCi0JCWVzcC0+c2NzaV9pZCA9IDc7Ci0JCQotCQkvKiBXZSBkb24ndCBoYXZlIGEgZGlmZmVyZW50aWFsIFNDU0ktYnVzLiAqLwotCQllc3AtPmRpZmYgPSAwOwotCi0JCWVzcF9pbml0aWFsaXplKGVzcCk7Ci0KLQkJcHJpbnRrKCJFU1A6IFRvdGFsIG9mICVkIEVTUCBob3N0cyBmb3VuZCwgJWQgYWN0dWFsbHkgaW4gdXNlLlxuIiwgbmVzcHMsIGVzcHNfaW5fdXNlKTsKLQkJZXNwc19ydW5uaW5nID0gZXNwc19pbl91c2U7Ci0JCXJldHVybiBlc3BzX2luX3VzZTsKLQkgICAgfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRE1BIEZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBkbWFfYnl0ZXNfc2VudChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBpbnQgZmlmb19jb3VudCkKLXsKLQkvKiBTaW5jZSB0aGUgQmxpenphcmQgRE1BIGlzIGZ1bGx5IGRlZGljYXRlZCB0byB0aGUgRVNQIGNoaXAsCi0JICogdGhlIG51bWJlciBvZiBieXRlcyBzZW50ICh0byB0aGUgRVNQIGNoaXApIGVxdWFscyB0aGUgbnVtYmVyCi0JICogb2YgYnl0ZXMgaW4gdGhlIEZJRk8gLSB0aGVyZSBpcyBubyBidWZmZXJpbmcgaW4gdGhlIERNQSBjb250cm9sbGVyLgotCSAqIFhYWFggRG8gSSByZWFkIHRoaXMgcmlnaHQ/IEl0IGlzIGZyb20gaG9zdCB0byBFU1AsIHJpZ2h0PwotCSAqLwotCXJldHVybiBmaWZvX2NvdW50OwotfQotCi1zdGF0aWMgaW50IGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCkKLXsKLQkvKiBJIGRvbid0IHRoaW5rIHRoZXJlJ3MgYW55IGxpbWl0IG9uIHRoZSBCbGl6emFyZCBETUEuIFNvIHdlIHVzZSB3aGF0Ci0JICogdGhlIEVTUCBjaGlwIGNhbiBoYW5kbGUgKDI0IGJpdCkuCi0JICovCi0JdW5zaWduZWQgbG9uZyBzeiA9IHNwLT5TQ3AudGhpc19yZXNpZHVhbDsKLQlpZihzeiA+IDB4MTAwMDAwMCkKLQkJc3ogPSAweDEwMDAwMDA7Ci0JcmV0dXJuIHN6OwotfQotCi1zdGF0aWMgdm9pZCBkbWFfZHVtcF9zdGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotCUVTUExPRygoImludHJlcTo8JTA0eD4sIGludGVuYTo8JTA0eD5cbiIsCi0JCWFtaWdhX2N1c3RvbS5pbnRyZXFyLCBhbWlnYV9jdXN0b20uaW50ZW5hcikpOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGJsejIwNjBfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPSAKLQkJKHN0cnVjdCBibHoyMDYwX2RtYV9yZWdpc3RlcnMgKikgKGVzcC0+ZHJlZ3MpOwotCi0JY2FjaGVfY2xlYXIoYWRkciwgbGVuZ3RoKTsKLQotCWFkZHIgPj49IDE7Ci0JYWRkciAmPSB+KEJMWjIwNjBfRE1BX1dSSVRFKTsKLQlkcmVncy0+ZG1hX2FkZHIzID0gKGFkZHIgICAgICApICYgMHhmZjsKLQlkcmVncy0+ZG1hX2FkZHIyID0gKGFkZHIgPj4gIDgpICYgMHhmZjsKLQlkcmVncy0+ZG1hX2FkZHIxID0gKGFkZHIgPj4gMTYpICYgMHhmZjsKLQlkcmVncy0+ZG1hX2FkZHIwID0gKGFkZHIgPj4gMjQpICYgMHhmZjsKLX0KLQotc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgYmx6MjA2MF9kbWFfcmVnaXN0ZXJzICpkcmVncyA9IAotCQkoc3RydWN0IGJsejIwNjBfZG1hX3JlZ2lzdGVycyAqKSAoZXNwLT5kcmVncyk7Ci0KLQljYWNoZV9wdXNoKGFkZHIsIGxlbmd0aCk7Ci0KLQlhZGRyID4+PSAxOwotCWFkZHIgfD0gQkxaMjA2MF9ETUFfV1JJVEU7Ci0JZHJlZ3MtPmRtYV9hZGRyMyA9IChhZGRyICAgICAgKSAmIDB4ZmY7Ci0JZHJlZ3MtPmRtYV9hZGRyMiA9IChhZGRyID4+ICA4KSAmIDB4ZmY7Ci0JZHJlZ3MtPmRtYV9hZGRyMSA9IChhZGRyID4+IDE2KSAmIDB4ZmY7Ci0JZHJlZ3MtPmRtYV9hZGRyMCA9IChhZGRyID4+IDI0KSAmIDB4ZmY7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotCWRpc2FibGVfaXJxKGVzcC0+aXJxKTsKLX0KLQotc3RhdGljIHZvaWQgZG1hX2ludHNfb24oc3RydWN0IE5DUl9FU1AgKmVzcCkKLXsKLQllbmFibGVfaXJxKGVzcC0+aXJxKTsKLX0KLQotc3RhdGljIGludCBkbWFfaXJxX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCkKLXsKLQlyZXR1cm4gKGVzcF9yZWFkKGVzcC0+ZXJlZ3MtPmVzcF9zdGF0dXMpICYgRVNQX1NUQVRfSU5UUik7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9sZWRfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci0JKChzdHJ1Y3QgYmx6MjA2MF9kbWFfcmVnaXN0ZXJzICopIChlc3AtPmRyZWdzKSktPmRtYV9sZWRfY3RybCA9Ci0JCUJMWjIwNjBfRE1BX0xFRDsKLX0KLQotc3RhdGljIHZvaWQgZG1hX2xlZF9vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotCSgoc3RydWN0IGJsejIwNjBfZG1hX3JlZ2lzdGVycyAqKSAoZXNwLT5kcmVncykpLT5kbWFfbGVkX2N0cmwgPSAwOwotfQotCi1zdGF0aWMgaW50IGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci0JcmV0dXJuICgoYW1pZ2FfY3VzdG9tLmludGVuYXIpICYgSUZfUE9SVFMpOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpCi17Ci0JLyogT24gdGhlIFNwYXJjLCBETUFfU1RfV1JJVEUgbWVhbnMgIm1vdmUgZGF0YSBmcm9tIGRldmljZSB0byBtZW1vcnkiCi0JICogc28gd2hlbiAod3JpdGUpIGlzIHRydWUsIGl0IGFjdHVhbGx5IG1lYW5zIFJFQUQhCi0JICovCi0JaWYod3JpdGUpewotCQlkbWFfaW5pdF9yZWFkKGVzcCwgYWRkciwgY291bnQpOwotCX0gZWxzZSB7Ci0JCWRtYV9pbml0X3dyaXRlKGVzcCwgYWRkciwgY291bnQpOwotCX0KLX0KLQotI2RlZmluZSBIT1NUU19DCi0KLWludCBibHoyMDYwX2VzcF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQotewotI2lmZGVmIE1PRFVMRQotCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKSgoc3RydWN0IE5DUl9FU1AgKilpbnN0YW5jZS0+aG9zdGRhdGEpLT5lZGV2OwotCi0JZXNwX2RlYWxsb2NhdGUoKHN0cnVjdCBOQ1JfRVNQICopaW5zdGFuY2UtPmhvc3RkYXRhKTsKLQllc3BfcmVsZWFzZSgpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihhZGRyZXNzLCBzaXplb2Yoc3RydWN0IEVTUF9yZWdzKSk7Ci0JZnJlZV9pcnEoSVJRX0FNSUdBX1BPUlRTLCBlc3BfaW50cik7Ci0jZW5kaWYKLQlyZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7Ci0JLnByb2NfbmFtZQkJPSAiZXNwLWJsejIwNjAiLAotCS5wcm9jX2luZm8JCT0gZXNwX3Byb2NfaW5mbywKLQkubmFtZQkJCT0gIkJsaXp6YXJkMjA2MCBTQ1NJIiwKLQkuZGV0ZWN0CQkJPSBibHoyMDYwX2VzcF9kZXRlY3QsCi0JLnNsYXZlX2FsbG9jCQk9IGVzcF9zbGF2ZV9hbGxvYywKLQkuc2xhdmVfZGVzdHJveQkJPSBlc3Bfc2xhdmVfZGVzdHJveSwKLQkucmVsZWFzZQkJPSBibHoyMDYwX2VzcF9yZWxlYXNlLAotCS5xdWV1ZWNvbW1hbmQJCT0gZXNwX3F1ZXVlLAotCS5laF9hYm9ydF9oYW5kbGVyCT0gZXNwX2Fib3J0LAotCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IGVzcF9yZXNldCwKLQkuY2FuX3F1ZXVlCQk9IDcsCi0JLnRoaXNfaWQJCT0gNywKLQkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKLQkuY21kX3Blcl9sdW4JCT0gMSwKLQkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcKLX07Ci0KLQotI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCi0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jeWJlcnN0b3JtLmMgYi9kcml2ZXJzL3Njc2kvY3liZXJzdG9ybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmI5OGE0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc2NzaS9jeWJlcnN0b3JtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyogY3liZXJzdG9ybS5jOiBEcml2ZXIgZm9yIEN5YmVyU3Rvcm0gU0NTSSBDb250cm9sbGVyLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NiBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKQotICoKLSAqIFRoZSBDeWJlclN0b3JtIFNDU0kgZHJpdmVyIGlzIGJhc2VkIG9uIERhdmlkIFMuIE1pbGxlcidzIEVTUCBkcml2ZXIKLSAqIGZvciB0aGUgU3BhcmMgY29tcHV0ZXJzLiAKLSAqIAotICogVGhpcyB3b3JrIHdhcyBtYWRlIHBvc3NpYmxlIGJ5IFBoYXNlNSB3aG8gd2lsbGluZ2x5IChhbmQgbW9zdCBnZW5lcm91c2x5KQotICogc3VwcG9ydGVkIG1lIHdpdGggaGFyZHdhcmUgYW5kIGFsbCB0aGUgaW5mb3JtYXRpb24gSSBuZWVkZWQuCi0gKi8KLQotLyogVE9ETzoKLSAqCi0gKiAxKSBGaWd1cmUgb3V0IGhvdyB0byBtYWtlIGEgY2xlYW5lciBtZXJnZSB3aXRoIHRoZSBzcGFyYyBkcml2ZXIgd2l0aCByZWdhcmQKLSAqICAgIHRvIHRoZSBjYWNoZXMgYW5kIHRoZSBTcGFyYyBNTVUgbWFwcGluZy4KLSAqIDIpIE1ha2UgYXMgZmV3IHJvdXRpbmVzIHJlcXVpcmVkIG91dHNpZGUgdGhlIGdlbmVyaWMgZHJpdmVyLiBBIGxvdCBvZiB0aGUKLSAqICAgIHJvdXRpbmVzIGluIHRoaXMgZmlsZSB1c2VkIHRvIGJlIGlubGluZSEKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotCi0jaW5jbHVkZSAic2NzaS5oIgotI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+Ci0jaW5jbHVkZSAiTkNSNTNDOXguaCIKLQotI2luY2x1ZGUgPGxpbnV4L3pvcnJvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KLSNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgotCi0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLQotLyogVGhlIGNvbnRyb2xsZXIgcmVnaXN0ZXJzIGNhbiBiZSBmb3VuZCBpbiB0aGUgWjIgY29uZmlnIGFyZWEgYXQgdGhlc2UKLSAqIG9mZnNldHM6Ci0gKi8KLSNkZWZpbmUgQ1lCRVJfRVNQX0FERFIgMHhmNDAwCi0jZGVmaW5lIENZQkVSX0RNQV9BRERSIDB4ZjgwMAotCi0KLS8qIFRoZSBDeWJlclN0b3JtIERNQSBpbnRlcmZhY2UgKi8KLXN0cnVjdCBjeWJlcl9kbWFfcmVnaXN0ZXJzIHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGRtYV9hZGRyMDsJLyogRE1BIGFkZHJlc3MgKE1TQikgWzB4MDAwXSAqLwotCXVuc2lnbmVkIGNoYXIgZG1hcGFkMVsxXTsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGRtYV9hZGRyMTsJLyogRE1BIGFkZHJlc3MgICAgICAgWzB4MDAyXSAqLwotCXVuc2lnbmVkIGNoYXIgZG1hcGFkMlsxXTsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGRtYV9hZGRyMjsJLyogRE1BIGFkZHJlc3MgICAgICAgWzB4MDA0XSAqLwotCXVuc2lnbmVkIGNoYXIgZG1hcGFkM1sxXTsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGRtYV9hZGRyMzsJLyogRE1BIGFkZHJlc3MgKExTQikgWzB4MDA2XSAqLwotCXVuc2lnbmVkIGNoYXIgZG1hcGFkNFsweDNmYl07Ci0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciBjb25kX3JlZzsgICAgICAgIC8qIERNQSBjb25kICAgIChybykgIFsweDQwMl0gKi8KLSNkZWZpbmUgY3RybF9yZWcgIGNvbmRfcmVnCQkJLyogRE1BIGNvbnRyb2wgKHdvKSAgWzB4NDAyXSAqLwotfTsKLQotLyogRE1BIGNvbnRyb2wgYml0cyAqLwotI2RlZmluZSBDWUJFUl9ETUFfTEVEICAgIDB4ODAJLyogSEQgbGVkIGNvbnRyb2wgMSA9IG9uICovCi0jZGVmaW5lIENZQkVSX0RNQV9XUklURSAgMHg0MAkvKiBETUEgZGlyZWN0aW9uLiAxID0gd3JpdGUgKi8KLSNkZWZpbmUgQ1lCRVJfRE1BX1ozICAgICAweDIwCS8qIDE2IChaMikgb3IgMzIgKENISVAvWjMpIGJpdCBETUEgdHJhbnNmZXIgKi8KLQotLyogRE1BIHN0YXR1cyBiaXRzICovCi0jZGVmaW5lIENZQkVSX0RNQV9ITkRMX0lOVFIgMHg4MAkvKiBETUEgSVJRIHBlbmRpbmc/ICovCi0KLS8qIFRoZSBiaXRzIGJlbG93IGFwcGVhcnMgdG8gYmUgUGhhc2U1IERlYnVnIGJpdHMgb25seTsgdGhleSB3ZXJlIG5vdAotICogZGVzY3JpYmVkIGJ5IFBoYXNlNSBzbyB1c2luZyB0aGVtIG1heSBzZWVtIGEgYml0IHN0dXBpZC4uLgotICovCi0jZGVmaW5lIENZQkVSX0hPU1RfSUQgMHgwMgkvKiBJZiBzZXQsIGhvc3QgSUQgc2hvdWxkIGJlIDcsIG90aGVyd2lzZQotCQkJCSAqIGl0IHNob3VsZCBiZSA2LgotCQkJCSAqLwotI2RlZmluZSBDWUJFUl9TTE9XX0NBQkxFIDB4MDgJLyogSWYgKm5vdCogc2V0LCBhc3N1bWUgU0xPV19DQUJMRSAqLwotCi1zdGF0aWMgaW50ICBkbWFfYnl0ZXNfc2VudChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBpbnQgZmlmb19jb3VudCk7Ci1zdGF0aWMgaW50ICBkbWFfY2FuX3RyYW5zZmVyKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApOwotc3RhdGljIHZvaWQgZG1hX2R1bXBfc3RhdGUoc3RydWN0IE5DUl9FU1AgKmVzcCk7Ci1zdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBsZW5ndGgpOwotc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCk7Ci1zdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCk7Ci1zdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyBpbnQgIGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyB2b2lkIGRtYV9sZWRfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApOwotc3RhdGljIHZvaWQgZG1hX2xlZF9vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyBpbnQgIGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApOwotc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgY3RybF9kYXRhID0gMDsJLyogS2VlcCBiYWNrdXAgb2YgdGhlIHN0dWZmIHdyaXR0ZW4KLQkJCQkgKiB0byBjdHJsX3JlZy4gQWx3YXlzIHdyaXRlIGEgY29weQotCQkJCSAqIHRvIHRoaXMgcmVnaXN0ZXIgd2hlbiB3cml0aW5nIHRvCi0JCQkJICogdGhlIGhhcmR3YXJlIHJlZ2lzdGVyIQotCQkJCSAqLwotCi1zdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBjbWRfYnVmZmVyWzE2XTsKLQkJCQkvKiBUaGlzIGlzIHdoZXJlIGFsbCBjb21tYW5kcyBhcmUgcHV0Ci0JCQkJICogYmVmb3JlIHRoZXkgYXJlIHRyYW5zZmVycmVkIHRvIHRoZSBFU1AgY2hpcAotCQkJCSAqIHZpYSBQSU8uCi0JCQkJICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEZXRlY3Rpb24gKi8KLWludCBfX2luaXQgY3liZXJfZXNwX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICp0cG50KQotewotCXN0cnVjdCBOQ1JfRVNQICplc3A7Ci0Jc3RydWN0IHpvcnJvX2RldiAqeiA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBhZGRyZXNzOwotCi0Jd2hpbGUgKCh6ID0gem9ycm9fZmluZF9kZXZpY2UoWk9SUk9fV0lMRENBUkQsIHopKSkgewotCSAgICB1bnNpZ25lZCBsb25nIGJvYXJkID0gei0+cmVzb3VyY2Uuc3RhcnQ7Ci0JICAgIGlmICgoei0+aWQgPT0gWk9SUk9fUFJPRF9QSEFTRTVfQkxJWlpBUkRfMTIyMF9DWUJFUlNUT1JNIHx8Ci0JCSB6LT5pZCA9PSBaT1JST19QUk9EX1BIQVNFNV9CTElaWkFSRF8xMjMwX0lJX0ZBU1RMQU5FX1ozX0NZQkVSU0NTSV9DWUJFUlNUT1JNMDYwKSAmJgotCQlyZXF1ZXN0X21lbV9yZWdpb24oYm9hcmQrQ1lCRVJfRVNQX0FERFIsCi0JCSAgICAJCSAgIHNpemVvZihzdHJ1Y3QgRVNQX3JlZ3MpLCAiTkNSNTNDOXgiKSkgewotCQkvKiBGaWd1cmUgb3V0IGlmIHRoaXMgaXMgYSBDeWJlclN0b3JtIG9yIHJlYWxseSBhIAotCQkgKiBGYXN0bGFuZS9CbGl6emFyZCBNayBJSSBieSBsb29raW5nIGF0IHRoZSBib2FyZCBzaXplLgotCQkgKiBDeWJlclN0b3JtIG1hcHMgNjRrQgotCQkgKiAoWk9SUk9fUFJPRF9QSEFTRTVfQkxJWlpBUkRfMTIyMF9DWUJFUlNUT1JNIGRvZXMgYW55d2F5KQotCQkgKi8KLQkJaWYoei0+cmVzb3VyY2UuZW5kLWJvYXJkICE9IDB4ZmZmZikgewotCQkJcmVsZWFzZV9tZW1fcmVnaW9uKGJvYXJkK0NZQkVSX0VTUF9BRERSLAotCQkJCQkgICBzaXplb2Yoc3RydWN0IEVTUF9yZWdzKSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQllc3AgPSBlc3BfYWxsb2NhdGUodHBudCwgKHZvaWQgKilib2FyZCArIENZQkVSX0VTUF9BRERSLCAwKTsKLQotCQkvKiBEbyBjb21tYW5kIHRyYW5zZmVyIHdpdGggcHJvZ3JhbW1lZCBJL08gKi8KLQkJZXNwLT5kb19waW9fY21kcyA9IDE7Ci0KLQkJLyogUmVxdWlyZWQgZnVuY3Rpb25zICovCi0JCWVzcC0+ZG1hX2J5dGVzX3NlbnQgPSAmZG1hX2J5dGVzX3NlbnQ7Ci0JCWVzcC0+ZG1hX2Nhbl90cmFuc2ZlciA9ICZkbWFfY2FuX3RyYW5zZmVyOwotCQllc3AtPmRtYV9kdW1wX3N0YXRlID0gJmRtYV9kdW1wX3N0YXRlOwotCQllc3AtPmRtYV9pbml0X3JlYWQgPSAmZG1hX2luaXRfcmVhZDsKLQkJZXNwLT5kbWFfaW5pdF93cml0ZSA9ICZkbWFfaW5pdF93cml0ZTsKLQkJZXNwLT5kbWFfaW50c19vZmYgPSAmZG1hX2ludHNfb2ZmOwotCQllc3AtPmRtYV9pbnRzX29uID0gJmRtYV9pbnRzX29uOwotCQllc3AtPmRtYV9pcnFfcCA9ICZkbWFfaXJxX3A7Ci0JCWVzcC0+ZG1hX3BvcnRzX3AgPSAmZG1hX3BvcnRzX3A7Ci0JCWVzcC0+ZG1hX3NldHVwID0gJmRtYV9zZXR1cDsKLQotCQkvKiBPcHRpb25hbCBmdW5jdGlvbnMgKi8KLQkJZXNwLT5kbWFfYmFycmllciA9IDA7Ci0JCWVzcC0+ZG1hX2RyYWluID0gMDsKLQkJZXNwLT5kbWFfaW52YWxpZGF0ZSA9IDA7Ci0JCWVzcC0+ZG1hX2lycV9lbnRyeSA9IDA7Ci0JCWVzcC0+ZG1hX2lycV9leGl0ID0gMDsKLQkJZXNwLT5kbWFfbGVkX29uID0gJmRtYV9sZWRfb247Ci0JCWVzcC0+ZG1hX2xlZF9vZmYgPSAmZG1hX2xlZF9vZmY7Ci0JCWVzcC0+ZG1hX3BvbGwgPSAwOwotCQllc3AtPmRtYV9yZXNldCA9IDA7Ci0KLQkJLyogU0NTSSBjaGlwIHNwZWVkICovCi0JCWVzcC0+Y2ZyZXEgPSA0MDAwMDAwMDsKLQotCQkvKiBUaGUgRE1BIHJlZ2lzdGVycyBvbiB0aGUgQ3liZXJTdG9ybSBhcmUgbWFwcGVkCi0JCSAqIHJlbGF0aXZlIHRvIHRoZSBkZXZpY2UgKGkuZS4gaW4gdGhlIHNhbWUgWm9ycm8KLQkJICogSS9PIGJsb2NrKS4KLQkJICovCi0JCWFkZHJlc3MgPSAodW5zaWduZWQgbG9uZylaVFdPX1ZBRERSKGJvYXJkKTsKLQkJZXNwLT5kcmVncyA9ICh2b2lkICopKGFkZHJlc3MgKyBDWUJFUl9ETUFfQUREUik7Ci0KLQkJLyogRVNQIHJlZ2lzdGVyIGJhc2UgKi8KLQkJZXNwLT5lcmVncyA9IChzdHJ1Y3QgRVNQX3JlZ3MgKikoYWRkcmVzcyArIENZQkVSX0VTUF9BRERSKTsKLQkJCi0JCS8qIFNldCB0aGUgY29tbWFuZCBidWZmZXIgKi8KLQkJZXNwLT5lc3BfY29tbWFuZCA9IGNtZF9idWZmZXI7Ci0JCWVzcC0+ZXNwX2NvbW1hbmRfZHZtYSA9IHZpcnRfdG9fYnVzKCh2b2lkICopY21kX2J1ZmZlcik7Ci0KLQkJZXNwLT5pcnEgPSBJUlFfQU1JR0FfUE9SVFM7Ci0JCXJlcXVlc3RfaXJxKElSUV9BTUlHQV9QT1JUUywgZXNwX2ludHIsIElSUUZfU0hBUkVELAotCQkJICAgICJDeWJlclN0b3JtIFNDU0kiLCBlc3AtPmVob3N0KTsKLQkJLyogRmlndXJlIG91dCBvdXIgc2NzaSBJRCBvbiB0aGUgYnVzICovCi0JCS8qIFRoZSBETUEgY29uZCBmbGFnIGNvbnRhaW5zIGEgaGFyZGNvZGVkIGp1bXBlciBiaXQKLQkJICogd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2VsZWN0IGhvc3QgbnVtYmVyIDYgb3IgNy4KLQkJICogSG93ZXZlciwgZXZlbiB0aG91Z2ggaXQgbWF5IGNoYW5nZSwgd2UgdXNlIGEgaGFyZGNvZGVkCi0JCSAqIHZhbHVlIG9mIDcuCi0JCSAqLwotCQllc3AtPnNjc2lfaWQgPSA3OwotCQkKLQkJLyogV2UgZG9uJ3QgaGF2ZSBhIGRpZmZlcmVudGlhbCBTQ1NJLWJ1cy4gKi8KLQkJZXNwLT5kaWZmID0gMDsKLQotCQllc3BfaW5pdGlhbGl6ZShlc3ApOwotCi0JCXByaW50aygiRVNQOiBUb3RhbCBvZiAlZCBFU1AgaG9zdHMgZm91bmQsICVkIGFjdHVhbGx5IGluIHVzZS5cbiIsIG5lc3BzLCBlc3BzX2luX3VzZSk7Ci0JCWVzcHNfcnVubmluZyA9IGVzcHNfaW5fdXNlOwotCQlyZXR1cm4gZXNwc19pbl91c2U7Ci0JICAgIH0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERNQSBGdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgZG1hX2J5dGVzX3NlbnQoc3RydWN0IE5DUl9FU1AgKmVzcCwgaW50IGZpZm9fY291bnQpCi17Ci0JLyogU2luY2UgdGhlIEN5YmVyU3Rvcm0gRE1BIGlzIGZ1bGx5IGRlZGljYXRlZCB0byB0aGUgRVNQIGNoaXAsCi0JICogdGhlIG51bWJlciBvZiBieXRlcyBzZW50ICh0byB0aGUgRVNQIGNoaXApIGVxdWFscyB0aGUgbnVtYmVyCi0JICogb2YgYnl0ZXMgaW4gdGhlIEZJRk8gLSB0aGVyZSBpcyBubyBidWZmZXJpbmcgaW4gdGhlIERNQSBjb250cm9sbGVyLgotCSAqIFhYWFggRG8gSSByZWFkIHRoaXMgcmlnaHQ/IEl0IGlzIGZyb20gaG9zdCB0byBFU1AsIHJpZ2h0PwotCSAqLwotCXJldHVybiBmaWZvX2NvdW50OwotfQotCi1zdGF0aWMgaW50IGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCkKLXsKLQkvKiBJIGRvbid0IHRoaW5rIHRoZXJlJ3MgYW55IGxpbWl0IG9uIHRoZSBDeWJlckRNQS4gU28gd2UgdXNlIHdoYXQKLQkgKiB0aGUgRVNQIGNoaXAgY2FuIGhhbmRsZSAoMjQgYml0KS4KLQkgKi8KLQl1bnNpZ25lZCBsb25nIHN6ID0gc3AtPlNDcC50aGlzX3Jlc2lkdWFsOwotCWlmKHN6ID4gMHgxMDAwMDAwKQotCQlzeiA9IDB4MTAwMDAwMDsKLQlyZXR1cm4gc3o7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci0JRVNQTE9HKCgiZXNwJWQ6IGRtYSAtLSBjb25kX3JlZzwlMDJ4PlxuIiwKLQkJZXNwLT5lc3BfaWQsICgoc3RydWN0IGN5YmVyX2RtYV9yZWdpc3RlcnMgKikKLQkJCSAgICAgIChlc3AtPmRyZWdzKSktPmNvbmRfcmVnKSk7Ci0JRVNQTE9HKCgiaW50cmVxOjwlMDR4PiwgaW50ZW5hOjwlMDR4PlxuIiwKLQkJYW1pZ2FfY3VzdG9tLmludHJlcXIsIGFtaWdhX2N1c3RvbS5pbnRlbmFyKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgY3liZXJfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPSAKLQkJKHN0cnVjdCBjeWJlcl9kbWFfcmVnaXN0ZXJzICopIGVzcC0+ZHJlZ3M7Ci0KLQljYWNoZV9jbGVhcihhZGRyLCBsZW5ndGgpOwotCi0JYWRkciAmPSB+KDEpOwotCWRyZWdzLT5kbWFfYWRkcjAgPSAoYWRkciA+PiAyNCkgJiAweGZmOwotCWRyZWdzLT5kbWFfYWRkcjEgPSAoYWRkciA+PiAxNikgJiAweGZmOwotCWRyZWdzLT5kbWFfYWRkcjIgPSAoYWRkciA+PiAgOCkgJiAweGZmOwotCWRyZWdzLT5kbWFfYWRkcjMgPSAoYWRkciAgICAgICkgJiAweGZmOwotCWN0cmxfZGF0YSAmPSB+KENZQkVSX0RNQV9XUklURSk7Ci0KLQkvKiBDaGVjayBpZiBwaHlzaWNhbCBhZGRyZXNzIGlzIG91dHNpZGUgWjIgc3BhY2UgYW5kIG9mCi0JICogYmxvY2sgbGVuZ3RoL2Jsb2NrIGFsaWduZWQgaW4gbWVtb3J5LiBJZiB0aGlzIGlzIHRoZQotCSAqIGNhc2UsIGVuYWJsZSAzMiBiaXQgdHJhbnNmZXIuIEluIGFsbCBvdGhlciBjYXNlcywgZmFsbCBiYWNrCi0JICogdG8gMTYgYml0IHRyYW5zZmVyLgotCSAqIE9idmlvdXNseSAzMiBiaXQgdHJhbnNmZXIgc2hvdWxkIGJlIGVuYWJsZWQgaWYgdGhlIERNQSBhZGRyZXNzCi0JICogYW5kIGxlbmd0aCBhcmUgMzIgYml0IGFsaWduZWQuIEhvd2V2ZXIsIHRoaXMgbGVhZHMgdG8gc29tZQotCSAqIHN0cmFuZ2UgYmVoYXZpb3IuIEV2ZW4gNjQgYml0IGFsaWduZWQgYWRkci9sZW5ndGggZmFpbHMuCi0JICogVW50aWwgSSd2ZSBmb3VuZCBhIHJlYXNvbiBmb3IgdGhpcywgMzIgYml0IHRyYW5zZmVyIGlzIG9ubHkKLQkgKiB1c2VkIGZvciBmdWxsLWJsb2NrIHRyYW5zZmVycyAoMWtCKS4KLQkgKgkJCQkJCQktanNrb3YKLQkgKi8KLSNpZiAwCi0JaWYoKGFkZHIgJiAweDNmYykgfHwgbGVuZ3RoICYgMHgzZmYgfHwgKChhZGRyID4gMHgyMDAwMDApICYmCi0JCQkJCQkoYWRkciA8IDB4ZmYwMDAwKSkpCi0JCWN0cmxfZGF0YSAmPSB+KENZQkVSX0RNQV9aMyk7CS8qIFoyLCBkbyAxNiBiaXQgRE1BICovCi0JZWxzZQotCQljdHJsX2RhdGEgfD0gQ1lCRVJfRE1BX1ozOyAvKiBDSElQL1ozLCBkbyAzMiBiaXQgRE1BICovCi0jZWxzZQotCWN0cmxfZGF0YSAmPSB+KENZQkVSX0RNQV9aMyk7CS8qIFoyLCBkbyAxNiBiaXQgRE1BICovCi0jZW5kaWYKLQlkcmVncy0+Y3RybF9yZWcgPSBjdHJsX2RhdGE7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9pbml0X3dyaXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGN5YmVyX2RtYV9yZWdpc3RlcnMgKmRyZWdzID0gCi0JCShzdHJ1Y3QgY3liZXJfZG1hX3JlZ2lzdGVycyAqKSBlc3AtPmRyZWdzOwotCi0JY2FjaGVfcHVzaChhZGRyLCBsZW5ndGgpOwotCi0JYWRkciB8PSAxOwotCWRyZWdzLT5kbWFfYWRkcjAgPSAoYWRkciA+PiAyNCkgJiAweGZmOwotCWRyZWdzLT5kbWFfYWRkcjEgPSAoYWRkciA+PiAxNikgJiAweGZmOwotCWRyZWdzLT5kbWFfYWRkcjIgPSAoYWRkciA+PiAgOCkgJiAweGZmOwotCWRyZWdzLT5kbWFfYWRkcjMgPSAoYWRkciAgICAgICkgJiAweGZmOwotCWN0cmxfZGF0YSB8PSBDWUJFUl9ETUFfV1JJVEU7Ci0KLQkvKiBTZWUgY29tbWVudCBhYm92ZSAqLwotI2lmIDAKLQlpZigoYWRkciAmIDB4M2ZjKSB8fCBsZW5ndGggJiAweDNmZiB8fCAoKGFkZHIgPiAweDIwMDAwMCkgJiYKLQkJCQkJCShhZGRyIDwgMHhmZjAwMDApKSkKLQkJY3RybF9kYXRhICY9IH4oQ1lCRVJfRE1BX1ozKTsJLyogWjIsIGRvIDE2IGJpdCBETUEgKi8KLQllbHNlCi0JCWN0cmxfZGF0YSB8PSBDWUJFUl9ETUFfWjM7IC8qIENISVAvWjMsIGRvIDMyIGJpdCBETUEgKi8KLSNlbHNlCi0JY3RybF9kYXRhICY9IH4oQ1lCRVJfRE1BX1ozKTsJLyogWjIsIGRvIDE2IGJpdCBETUEgKi8KLSNlbmRpZgotCWRyZWdzLT5jdHJsX3JlZyA9IGN0cmxfZGF0YTsKLX0KLQotc3RhdGljIHZvaWQgZG1hX2ludHNfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci0JZGlzYWJsZV9pcnEoZXNwLT5pcnEpOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotCWVuYWJsZV9pcnEoZXNwLT5pcnEpOwotfQotCi1zdGF0aWMgaW50IGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotCS8qIEl0J3MgaW1wb3J0YW50IHRvIGNoZWNrIHRoZSBETUEgSVJRIGJpdCBpbiB0aGUgY29ycmVjdCB3YXkhICovCi0JcmV0dXJuICgoZXNwX3JlYWQoZXNwLT5lcmVncy0+ZXNwX3N0YXR1cykgJiBFU1BfU1RBVF9JTlRSKSAmJgotCQkoKCgoc3RydWN0IGN5YmVyX2RtYV9yZWdpc3RlcnMgKikoZXNwLT5kcmVncykpLT5jb25kX3JlZykgJgotCQkgQ1lCRVJfRE1BX0hORExfSU5UUikpOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfbGVkX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotCWN0cmxfZGF0YSAmPSB+Q1lCRVJfRE1BX0xFRDsKLQkoKHN0cnVjdCBjeWJlcl9kbWFfcmVnaXN0ZXJzICopKGVzcC0+ZHJlZ3MpKS0+Y3RybF9yZWcgPSBjdHJsX2RhdGE7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9sZWRfb24oc3RydWN0IE5DUl9FU1AgKmVzcCkKLXsKLQljdHJsX2RhdGEgfD0gQ1lCRVJfRE1BX0xFRDsKLQkoKHN0cnVjdCBjeWJlcl9kbWFfcmVnaXN0ZXJzICopKGVzcC0+ZHJlZ3MpKS0+Y3RybF9yZWcgPSBjdHJsX2RhdGE7Ci19Ci0KLXN0YXRpYyBpbnQgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCkKLXsKLQlyZXR1cm4gKChhbWlnYV9jdXN0b20uaW50ZW5hcikgJiBJRl9QT1JUUyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9zZXR1cChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgY291bnQsIGludCB3cml0ZSkKLXsKLQkvKiBPbiB0aGUgU3BhcmMsIERNQV9TVF9XUklURSBtZWFucyAibW92ZSBkYXRhIGZyb20gZGV2aWNlIHRvIG1lbW9yeSIKLQkgKiBzbyB3aGVuICh3cml0ZSkgaXMgdHJ1ZSwgaXQgYWN0dWFsbHkgbWVhbnMgUkVBRCEKLQkgKi8KLQlpZih3cml0ZSl7Ci0JCWRtYV9pbml0X3JlYWQoZXNwLCBhZGRyLCBjb3VudCk7Ci0JfSBlbHNlIHsKLQkJZG1hX2luaXRfd3JpdGUoZXNwLCBhZGRyLCBjb3VudCk7Ci0JfQotfQotCi0jZGVmaW5lIEhPU1RTX0MKLQotaW50IGN5YmVyX2VzcF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKQotewotI2lmZGVmIE1PRFVMRQotCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKSgoc3RydWN0IE5DUl9FU1AgKilpbnN0YW5jZS0+aG9zdGRhdGEpLT5lZGV2OwotCi0JZXNwX2RlYWxsb2NhdGUoKHN0cnVjdCBOQ1JfRVNQICopaW5zdGFuY2UtPmhvc3RkYXRhKTsKLQllc3BfcmVsZWFzZSgpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihhZGRyZXNzLCBzaXplb2Yoc3RydWN0IEVTUF9yZWdzKSk7Ci0JZnJlZV9pcnEoSVJRX0FNSUdBX1BPUlRTLCBlc3BfaW50cik7Ci0jZW5kaWYKLQlyZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7Ci0JLnByb2NfbmFtZQkJPSAiZXNwLWN5YmVyc3Rvcm0iLAotCS5wcm9jX2luZm8JCT0gZXNwX3Byb2NfaW5mbywKLQkubmFtZQkJCT0gIkN5YmVyU3Rvcm0gU0NTSSIsCi0JLmRldGVjdAkJCT0gY3liZXJfZXNwX2RldGVjdCwKLQkuc2xhdmVfYWxsb2MJCT0gZXNwX3NsYXZlX2FsbG9jLAotCS5zbGF2ZV9kZXN0cm95CQk9IGVzcF9zbGF2ZV9kZXN0cm95LAotCS5yZWxlYXNlCQk9IGN5YmVyX2VzcF9yZWxlYXNlLAotCS5xdWV1ZWNvbW1hbmQJCT0gZXNwX3F1ZXVlLAotCS5laF9hYm9ydF9oYW5kbGVyCT0gZXNwX2Fib3J0LAotCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IGVzcF9yZXNldCwKLQkuY2FuX3F1ZXVlCQk9IDcsCi0JLnRoaXNfaWQJCT0gNywKLQkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKLQkuY21kX3Blcl9sdW4JCT0gMSwKLQkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcKLX07Ci0KLQotI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCi0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jeWJlcnN0b3JtSUkuYyBiL2RyaXZlcnMvc2NzaS9jeWJlcnN0b3JtSUkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMzNmU4NS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Njc2kvY3liZXJzdG9ybUlJLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyogY3liZXJzdG9ybUlJLmM6IERyaXZlciBmb3IgQ3liZXJTdG9ybSBTQ1NJIE1rIElJCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk2IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspCi0gKgotICogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gY3liZXJzdG9ybS5jCi0gKi8KLQotLyogVE9ETzoKLSAqCi0gKiAxKSBGaWd1cmUgb3V0IGhvdyB0byBtYWtlIGEgY2xlYW5lciBtZXJnZSB3aXRoIHRoZSBzcGFyYyBkcml2ZXIgd2l0aCByZWdhcmQKLSAqICAgIHRvIHRoZSBjYWNoZXMgYW5kIHRoZSBTcGFyYyBNTVUgbWFwcGluZy4KLSAqIDIpIE1ha2UgYXMgZmV3IHJvdXRpbmVzIHJlcXVpcmVkIG91dHNpZGUgdGhlIGdlbmVyaWMgZHJpdmVyLiBBIGxvdCBvZiB0aGUKLSAqICAgIHJvdXRpbmVzIGluIHRoaXMgZmlsZSB1c2VkIHRvIGJlIGlubGluZSEKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotCi0jaW5jbHVkZSAic2NzaS5oIgotI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+Ci0jaW5jbHVkZSAiTkNSNTNDOXguaCIKLQotI2luY2x1ZGUgPGxpbnV4L3pvcnJvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KLSNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgotCi0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLQotLyogVGhlIGNvbnRyb2xsZXIgcmVnaXN0ZXJzIGNhbiBiZSBmb3VuZCBpbiB0aGUgWjIgY29uZmlnIGFyZWEgYXQgdGhlc2UKLSAqIG9mZnNldHM6Ci0gKi8KLSNkZWZpbmUgQ1lCRVJJSV9FU1BfQUREUiAweDFmZjAzCi0jZGVmaW5lIENZQkVSSUlfRE1BX0FERFIgMHgxZmY0MwotCi0KLS8qIFRoZSBDeWJlclN0b3JtIElJIERNQSBpbnRlcmZhY2UgKi8KLXN0cnVjdCBjeWJlcklJX2RtYV9yZWdpc3RlcnMgewotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgY29uZF9yZWc7ICAgICAgICAvKiBETUEgY29uZCAgICAocm8pICBbMHgwMDBdICovCi0jZGVmaW5lIGN0cmxfcmVnICBjb25kX3JlZwkJCS8qIERNQSBjb250cm9sICh3bykgIFsweDAwMF0gKi8KLQl1bnNpZ25lZCBjaGFyIGRtYXBhZDRbMHgzZl07Ci0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciBkbWFfYWRkcjA7CS8qIERNQSBhZGRyZXNzIChNU0IpIFsweDA0MF0gKi8KLQl1bnNpZ25lZCBjaGFyIGRtYXBhZDFbM107Ci0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciBkbWFfYWRkcjE7CS8qIERNQSBhZGRyZXNzICAgICAgIFsweDA0NF0gKi8KLQl1bnNpZ25lZCBjaGFyIGRtYXBhZDJbM107Ci0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciBkbWFfYWRkcjI7CS8qIERNQSBhZGRyZXNzICAgICAgIFsweDA0OF0gKi8KLQl1bnNpZ25lZCBjaGFyIGRtYXBhZDNbM107Ci0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciBkbWFfYWRkcjM7CS8qIERNQSBhZGRyZXNzIChMU0IpIFsweDA0Y10gKi8KLX07Ci0KLS8qIERNQSBjb250cm9sIGJpdHMgKi8KLSNkZWZpbmUgQ1lCRVJJSV9ETUFfTEVEICAgIDB4MDIJLyogSEQgbGVkIGNvbnRyb2wgMSA9IG9uICovCi0KLXN0YXRpYyBpbnQgIGRtYV9ieXRlc19zZW50KHN0cnVjdCBOQ1JfRVNQICplc3AsIGludCBmaWZvX2NvdW50KTsKLXN0YXRpYyBpbnQgIGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCk7Ci1zdGF0aWMgdm9pZCBkbWFfZHVtcF9zdGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCk7Ci1zdGF0aWMgdm9pZCBkbWFfaW5pdF93cml0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgbGVuZ3RoKTsKLXN0YXRpYyB2b2lkIGRtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApOwotc3RhdGljIGludCAgZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICplc3ApOwotc3RhdGljIHZvaWQgZG1hX2xlZF9vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCk7Ci1zdGF0aWMgdm9pZCBkbWFfbGVkX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApOwotc3RhdGljIGludCAgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCk7Ci1zdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpOwotCi1zdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBjbWRfYnVmZmVyWzE2XTsKLQkJCQkvKiBUaGlzIGlzIHdoZXJlIGFsbCBjb21tYW5kcyBhcmUgcHV0Ci0JCQkJICogYmVmb3JlIHRoZXkgYXJlIHRyYW5zZmVycmVkIHRvIHRoZSBFU1AgY2hpcAotCQkJCSAqIHZpYSBQSU8uCi0JCQkJICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEZXRlY3Rpb24gKi8KLWludCBfX2luaXQgY3liZXJJSV9lc3BfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQpCi17Ci0Jc3RydWN0IE5DUl9FU1AgKmVzcDsKLQlzdHJ1Y3Qgem9ycm9fZGV2ICp6ID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGFkZHJlc3M7Ci0Jc3RydWN0IEVTUF9yZWdzICplcmVnczsKLQotCWlmICgoeiA9IHpvcnJvX2ZpbmRfZGV2aWNlKFpPUlJPX1BST0RfUEhBU0U1X0NZQkVSU1RPUk1fTUtfSUksIHopKSkgewotCSAgICB1bnNpZ25lZCBsb25nIGJvYXJkID0gei0+cmVzb3VyY2Uuc3RhcnQ7Ci0JICAgIGlmIChyZXF1ZXN0X21lbV9yZWdpb24oYm9hcmQrQ1lCRVJJSV9FU1BfQUREUiwKLQkJCQkgICBzaXplb2Yoc3RydWN0IEVTUF9yZWdzKSwgIk5DUjUzQzl4IikpIHsKLQkJLyogRG8gc29tZSBtYWdpYyB0byBmaWd1cmUgb3V0IGlmIHRoZSBDeWJlclN0b3JtIE1rIElJCi0JCSAqIGlzIGVxdWlwcGVkIHdpdGggYSBTQ1NJIGNvbnRyb2xsZXIKLQkJICovCi0JCWFkZHJlc3MgPSAodW5zaWduZWQgbG9uZylaVFdPX1ZBRERSKGJvYXJkKTsKLQkJZXJlZ3MgPSAoc3RydWN0IEVTUF9yZWdzICopKGFkZHJlc3MgKyBDWUJFUklJX0VTUF9BRERSKTsKLQotCQllc3AgPSBlc3BfYWxsb2NhdGUodHBudCwgKHZvaWQgKilib2FyZCArIENZQkVSSUlfRVNQX0FERFIsIDApOwotCi0JCWVzcF93cml0ZShlcmVncy0+ZXNwX2NmZzEsIChFU1BfQ09ORklHMV9QRU5BQkxFIHwgNykpOwotCQl1ZGVsYXkoNSk7Ci0JCWlmKGVzcF9yZWFkKGVyZWdzLT5lc3BfY2ZnMSkgIT0gKEVTUF9DT05GSUcxX1BFTkFCTEUgfCA3KSkgewotCQkJZXNwX2RlYWxsb2NhdGUoZXNwKTsKLQkJCXNjc2lfdW5yZWdpc3Rlcihlc3AtPmVob3N0KTsKLQkJCXJlbGVhc2VfbWVtX3JlZ2lvbihib2FyZCtDWUJFUklJX0VTUF9BRERSLAotCQkJCQkgICBzaXplb2Yoc3RydWN0IEVTUF9yZWdzKSk7Ci0JCQlyZXR1cm4gMDsgLyogQmFpbCBvdXQgaWYgYWRkcmVzcyBkaWQgbm90IGhvbGQgZGF0YSAqLwotCQl9Ci0KLQkJLyogRG8gY29tbWFuZCB0cmFuc2ZlciB3aXRoIHByb2dyYW1tZWQgSS9PICovCi0JCWVzcC0+ZG9fcGlvX2NtZHMgPSAxOwotCi0JCS8qIFJlcXVpcmVkIGZ1bmN0aW9ucyAqLwotCQllc3AtPmRtYV9ieXRlc19zZW50ID0gJmRtYV9ieXRlc19zZW50OwotCQllc3AtPmRtYV9jYW5fdHJhbnNmZXIgPSAmZG1hX2Nhbl90cmFuc2ZlcjsKLQkJZXNwLT5kbWFfZHVtcF9zdGF0ZSA9ICZkbWFfZHVtcF9zdGF0ZTsKLQkJZXNwLT5kbWFfaW5pdF9yZWFkID0gJmRtYV9pbml0X3JlYWQ7Ci0JCWVzcC0+ZG1hX2luaXRfd3JpdGUgPSAmZG1hX2luaXRfd3JpdGU7Ci0JCWVzcC0+ZG1hX2ludHNfb2ZmID0gJmRtYV9pbnRzX29mZjsKLQkJZXNwLT5kbWFfaW50c19vbiA9ICZkbWFfaW50c19vbjsKLQkJZXNwLT5kbWFfaXJxX3AgPSAmZG1hX2lycV9wOwotCQllc3AtPmRtYV9wb3J0c19wID0gJmRtYV9wb3J0c19wOwotCQllc3AtPmRtYV9zZXR1cCA9ICZkbWFfc2V0dXA7Ci0KLQkJLyogT3B0aW9uYWwgZnVuY3Rpb25zICovCi0JCWVzcC0+ZG1hX2JhcnJpZXIgPSAwOwotCQllc3AtPmRtYV9kcmFpbiA9IDA7Ci0JCWVzcC0+ZG1hX2ludmFsaWRhdGUgPSAwOwotCQllc3AtPmRtYV9pcnFfZW50cnkgPSAwOwotCQllc3AtPmRtYV9pcnFfZXhpdCA9IDA7Ci0JCWVzcC0+ZG1hX2xlZF9vbiA9ICZkbWFfbGVkX29uOwotCQllc3AtPmRtYV9sZWRfb2ZmID0gJmRtYV9sZWRfb2ZmOwotCQllc3AtPmRtYV9wb2xsID0gMDsKLQkJZXNwLT5kbWFfcmVzZXQgPSAwOwotCi0JCS8qIFNDU0kgY2hpcCBzcGVlZCAqLwotCQllc3AtPmNmcmVxID0gNDAwMDAwMDA7Ci0KLQkJLyogVGhlIERNQSByZWdpc3RlcnMgb24gdGhlIEN5YmVyU3Rvcm0gYXJlIG1hcHBlZAotCQkgKiByZWxhdGl2ZSB0byB0aGUgZGV2aWNlIChpLmUuIGluIHRoZSBzYW1lIFpvcnJvCi0JCSAqIEkvTyBibG9jaykuCi0JCSAqLwotCQllc3AtPmRyZWdzID0gKHZvaWQgKikoYWRkcmVzcyArIENZQkVSSUlfRE1BX0FERFIpOwotCi0JCS8qIEVTUCByZWdpc3RlciBiYXNlICovCi0JCWVzcC0+ZXJlZ3MgPSBlcmVnczsKLQkJCi0JCS8qIFNldCB0aGUgY29tbWFuZCBidWZmZXIgKi8KLQkJZXNwLT5lc3BfY29tbWFuZCA9IGNtZF9idWZmZXI7Ci0JCWVzcC0+ZXNwX2NvbW1hbmRfZHZtYSA9IHZpcnRfdG9fYnVzKCh2b2lkICopY21kX2J1ZmZlcik7Ci0KLQkJZXNwLT5pcnEgPSBJUlFfQU1JR0FfUE9SVFM7Ci0JCXJlcXVlc3RfaXJxKElSUV9BTUlHQV9QT1JUUywgZXNwX2ludHIsIElSUUZfU0hBUkVELAotCQkJICAgICJDeWJlclN0b3JtIFNDU0kgTWsgSUkiLCBlc3AtPmVob3N0KTsKLQotCQkvKiBGaWd1cmUgb3V0IG91ciBzY3NpIElEIG9uIHRoZSBidXMgKi8KLQkJZXNwLT5zY3NpX2lkID0gNzsKLQkJCi0JCS8qIFdlIGRvbid0IGhhdmUgYSBkaWZmZXJlbnRpYWwgU0NTSS1idXMuICovCi0JCWVzcC0+ZGlmZiA9IDA7Ci0KLQkJZXNwX2luaXRpYWxpemUoZXNwKTsKLQotCQlwcmludGsoIkVTUDogVG90YWwgb2YgJWQgRVNQIGhvc3RzIGZvdW5kLCAlZCBhY3R1YWxseSBpbiB1c2UuXG4iLCBuZXNwcywgZXNwc19pbl91c2UpOwotCQllc3BzX3J1bm5pbmcgPSBlc3BzX2luX3VzZTsKLQkJcmV0dXJuIGVzcHNfaW5fdXNlOwotCSAgICB9Ci0JfQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBETUEgRnVuY3Rpb25zICovCi1zdGF0aWMgaW50IGRtYV9ieXRlc19zZW50KHN0cnVjdCBOQ1JfRVNQICplc3AsIGludCBmaWZvX2NvdW50KQotewotCS8qIFNpbmNlIHRoZSBDeWJlclN0b3JtIERNQSBpcyBmdWxseSBkZWRpY2F0ZWQgdG8gdGhlIEVTUCBjaGlwLAotCSAqIHRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudCAodG8gdGhlIEVTUCBjaGlwKSBlcXVhbHMgdGhlIG51bWJlcgotCSAqIG9mIGJ5dGVzIGluIHRoZSBGSUZPIC0gdGhlcmUgaXMgbm8gYnVmZmVyaW5nIGluIHRoZSBETUEgY29udHJvbGxlci4KLQkgKiBYWFhYIERvIEkgcmVhZCB0aGlzIHJpZ2h0PyBJdCBpcyBmcm9tIGhvc3QgdG8gRVNQLCByaWdodD8KLQkgKi8KLQlyZXR1cm4gZmlmb19jb3VudDsKLX0KLQotc3RhdGljIGludCBkbWFfY2FuX3RyYW5zZmVyKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCi17Ci0JLyogSSBkb24ndCB0aGluayB0aGVyZSdzIGFueSBsaW1pdCBvbiB0aGUgQ3liZXJETUEuIFNvIHdlIHVzZSB3aGF0Ci0JICogdGhlIEVTUCBjaGlwIGNhbiBoYW5kbGUgKDI0IGJpdCkuCi0JICovCi0JdW5zaWduZWQgbG9uZyBzeiA9IHNwLT5TQ3AudGhpc19yZXNpZHVhbDsKLQlpZihzeiA+IDB4MTAwMDAwMCkKLQkJc3ogPSAweDEwMDAwMDA7Ci0JcmV0dXJuIHN6OwotfQotCi1zdGF0aWMgdm9pZCBkbWFfZHVtcF9zdGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotCUVTUExPRygoImVzcCVkOiBkbWEgLS0gY29uZF9yZWc8JTAyeD5cbiIsCi0JCWVzcC0+ZXNwX2lkLCAoKHN0cnVjdCBjeWJlcklJX2RtYV9yZWdpc3RlcnMgKikKLQkJCSAgICAgIChlc3AtPmRyZWdzKSktPmNvbmRfcmVnKSk7Ci0JRVNQTE9HKCgiaW50cmVxOjwlMDR4PiwgaW50ZW5hOjwlMDR4PlxuIiwKLQkJYW1pZ2FfY3VzdG9tLmludHJlcXIsIGFtaWdhX2N1c3RvbS5pbnRlbmFyKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgY3liZXJJSV9kbWFfcmVnaXN0ZXJzICpkcmVncyA9IAotCQkoc3RydWN0IGN5YmVySUlfZG1hX3JlZ2lzdGVycyAqKSBlc3AtPmRyZWdzOwotCi0JY2FjaGVfY2xlYXIoYWRkciwgbGVuZ3RoKTsKLQotCWFkZHIgJj0gfigxKTsKLQlkcmVncy0+ZG1hX2FkZHIwID0gKGFkZHIgPj4gMjQpICYgMHhmZjsKLQlkcmVncy0+ZG1hX2FkZHIxID0gKGFkZHIgPj4gMTYpICYgMHhmZjsKLQlkcmVncy0+ZG1hX2FkZHIyID0gKGFkZHIgPj4gIDgpICYgMHhmZjsKLQlkcmVncy0+ZG1hX2FkZHIzID0gKGFkZHIgICAgICApICYgMHhmZjsKLX0KLQotc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgY3liZXJJSV9kbWFfcmVnaXN0ZXJzICpkcmVncyA9IAotCQkoc3RydWN0IGN5YmVySUlfZG1hX3JlZ2lzdGVycyAqKSBlc3AtPmRyZWdzOwotCi0JY2FjaGVfcHVzaChhZGRyLCBsZW5ndGgpOwotCi0JYWRkciB8PSAxOwotCWRyZWdzLT5kbWFfYWRkcjAgPSAoYWRkciA+PiAyNCkgJiAweGZmOwotCWRyZWdzLT5kbWFfYWRkcjEgPSAoYWRkciA+PiAxNikgJiAweGZmOwotCWRyZWdzLT5kbWFfYWRkcjIgPSAoYWRkciA+PiAgOCkgJiAweGZmOwotCWRyZWdzLT5kbWFfYWRkcjMgPSAoYWRkciAgICAgICkgJiAweGZmOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCkKLXsKLQlkaXNhYmxlX2lycShlc3AtPmlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci0JZW5hYmxlX2lycShlc3AtPmlycSk7Ci19Ci0KLXN0YXRpYyBpbnQgZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci0JLyogSXQncyBpbXBvcnRhbnQgdG8gY2hlY2sgdGhlIERNQSBJUlEgYml0IGluIHRoZSBjb3JyZWN0IHdheSEgKi8KLQlyZXR1cm4gKGVzcF9yZWFkKGVzcC0+ZXJlZ3MtPmVzcF9zdGF0dXMpICYgRVNQX1NUQVRfSU5UUik7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9sZWRfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci0JKChzdHJ1Y3QgY3liZXJJSV9kbWFfcmVnaXN0ZXJzICopKGVzcC0+ZHJlZ3MpKS0+Y3RybF9yZWcgJj0gfkNZQkVSSUlfRE1BX0xFRDsKLX0KLQotc3RhdGljIHZvaWQgZG1hX2xlZF9vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotCSgoc3RydWN0IGN5YmVySUlfZG1hX3JlZ2lzdGVycyAqKShlc3AtPmRyZWdzKSktPmN0cmxfcmVnIHw9IENZQkVSSUlfRE1BX0xFRDsKLX0KLQotc3RhdGljIGludCBkbWFfcG9ydHNfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotCXJldHVybiAoKGFtaWdhX2N1c3RvbS5pbnRlbmFyKSAmIElGX1BPUlRTKTsKLX0KLQotc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKQotewotCS8qIE9uIHRoZSBTcGFyYywgRE1BX1NUX1dSSVRFIG1lYW5zICJtb3ZlIGRhdGEgZnJvbSBkZXZpY2UgdG8gbWVtb3J5IgotCSAqIHNvIHdoZW4gKHdyaXRlKSBpcyB0cnVlLCBpdCBhY3R1YWxseSBtZWFucyBSRUFEIQotCSAqLwotCWlmKHdyaXRlKXsKLQkJZG1hX2luaXRfcmVhZChlc3AsIGFkZHIsIGNvdW50KTsKLQl9IGVsc2UgewotCQlkbWFfaW5pdF93cml0ZShlc3AsIGFkZHIsIGNvdW50KTsKLQl9Ci19Ci0KLSNkZWZpbmUgSE9TVFNfQwotCi1pbnQgY3liZXJJSV9lc3BfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKLXsKLSNpZmRlZiBNT0RVTEUKLQl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSAodW5zaWduZWQgbG9uZykoKHN0cnVjdCBOQ1JfRVNQICopaW5zdGFuY2UtPmhvc3RkYXRhKS0+ZWRldjsKLQotCWVzcF9kZWFsbG9jYXRlKChzdHJ1Y3QgTkNSX0VTUCAqKWluc3RhbmNlLT5ob3N0ZGF0YSk7IAotCWVzcF9yZWxlYXNlKCk7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKGFkZHJlc3MsIHNpemVvZihzdHJ1Y3QgRVNQX3JlZ3MpKTsKLQlmcmVlX2lycShJUlFfQU1JR0FfUE9SVFMsIGVzcF9pbnRyKTsKLSNlbmRpZgotCXJldHVybiAxOwotfQotCi0KLXN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKLQkucHJvY19uYW1lCQk9ICJlc3AtY3liZXJzdG9ybUlJIiwKLQkucHJvY19pbmZvCQk9IGVzcF9wcm9jX2luZm8sCi0JLm5hbWUJCQk9ICJDeWJlclN0b3JtIE1rIElJIFNDU0kiLAotCS5kZXRlY3QJCQk9IGN5YmVySUlfZXNwX2RldGVjdCwKLQkuc2xhdmVfYWxsb2MJCT0gZXNwX3NsYXZlX2FsbG9jLAotCS5zbGF2ZV9kZXN0cm95CQk9IGVzcF9zbGF2ZV9kZXN0cm95LAotCS5yZWxlYXNlCQk9IGN5YmVySUlfZXNwX3JlbGVhc2UsCi0JLnF1ZXVlY29tbWFuZAkJPSBlc3BfcXVldWUsCi0JLmVoX2Fib3J0X2hhbmRsZXIJPSBlc3BfYWJvcnQsCi0JLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gZXNwX3Jlc2V0LAotCS5jYW5fcXVldWUJCT0gNywKLQkudGhpc19pZAkJPSA3LAotCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAotCS5jbWRfcGVyX2x1bgkJPSAxLAotCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORwotfTsKLQotCi0jaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2RjMzk1eC5jIGIvZHJpdmVycy9zY3NpL2RjMzk1eC5jCmluZGV4IDIyZWYzNzEuLmUzNTFkYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9kYzM5NXguYworKysgYi9kcml2ZXJzL3Njc2kvZGMzOTV4LmMKQEAgLTQyNjcsNyArNDI2Nyw3IEBACiAJY29uc3QgdW5zaWduZWQgc3Jic19wZXJfcGFnZSA9IFBBR0VfU0laRS9TRUdNRU5UWF9MRU47CiAJaW50IHNyYl9pZHggPSAwOwogCXVuc2lnbmVkIGkgPSAwOwotCXN0cnVjdCBTR2VudHJ5ICpwdHI7CisJc3RydWN0IFNHZW50cnkgKnVuaW5pdGlhbGl6ZWRfdmFyKHB0cik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgREMzOTV4X01BWF9TUkJfQ05UOyBpKyspCiAJCWFjYi0+c3JiX2FycmF5W2ldLnNlZ21lbnRfeCA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZGVjX2VzcC5jIGIvZHJpdmVycy9zY3NpL2RlY19lc3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQyYWQ2Ni4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Njc2kvZGVjX2VzcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjg3ICswLDAgQEAKLS8qCi0gKiBkZWNfZXNwLmM6IERyaXZlciBmb3IgU0NTSSBjaGlwcyBvbiBJT0FTSUMgYmFzZWQgVFVSQk9jaGFubmVsIERFQ3N0YXRpb25zCi0gKiAgICAgICAgICAgIGFuZCBUVVJCT2NoYW5uZWwgUE1BWi1BIGNhcmRzCi0gKgotICogVFVSQk9jaGFubmVsIGNoYW5nZXMgYnkgSGFyYWxkIEtvZXJmZ2VuCi0gKiBQTUFaLUEgc3VwcG9ydCBieSBEYXZpZCBBaXJsaWUKLSAqCi0gKiBiYXNlZCBvbiBqYXp6X2VzcC5jOgotICogQ29weXJpZ2h0IChDKSAxOTk3IFRob21hcyBCb2dlbmRvZXJmZXIgKHRzYm9nZW5kQGFscGhhLmZyYW5rZW4uZGUpCi0gKgotICogamF6el9lc3AgaXMgYmFzZWQgb24gRGF2aWQgUy4gTWlsbGVyJ3MgRVNQIGRyaXZlciBhbmQgY3liZXJfZXNwCi0gKgotICogMjAwMDA4MTkgLSBTbWFsbCBQTUFaLUFBIGZpeGVzIGJ5IEZsb3JpYW4gTG9ob2ZmIDxmbG9AcmZjODIyLm9yZz4KLSAqICAgICAgICAgICAgQmUgd2FybmVkIHRoZSBQTUFaLUFBIHdvcmtzIGN1cnJlbnRseSBhcyBhIHNpbmdsZSBjYXJkLgotICogICAgICAgICAgICBEb250IHRyeSB0byBwdXQgbXVsdGlwbGUgY2FyZHMgaW4gb25lIG1hY2hpbmUgLSBUaGV5IGFyZQotICogICAgICAgICAgICBib3RoIGRldGVjdGVkIGJ1dCBpdCBtYXkgY3Jhc2ggdW5kZXIgaGlnaCBsb2FkIGdhcmJsaW5nIHlvdXIKLSAqICAgICAgICAgICAgZGF0YS4KLSAqIDIwMDAxMDA1CS0gSW5pdGlhbGl6YXRpb24gZml4ZXMgZm9yIDIuNC4wLXRlc3Q5Ci0gKiAJCQkgIEZsb3JpYW4gTG9ob2ZmIDxmbG9AcmZjODIyLm9yZz4KLSAqCi0gKglDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDYgIE1hY2llaiBXLiBSb3p5Y2tpCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L3RjLmg+Ci0KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotCi0jaW5jbHVkZSA8YXNtL2RlYy9pbnRlcnJ1cHRzLmg+Ci0jaW5jbHVkZSA8YXNtL2RlYy9pb2FzaWMuaD4KLSNpbmNsdWRlIDxhc20vZGVjL2lvYXNpY19hZGRycy5oPgotI2luY2x1ZGUgPGFzbS9kZWMvaW9hc2ljX2ludHMuaD4KLSNpbmNsdWRlIDxhc20vZGVjL21hY2h0eXBlLmg+Ci0jaW5jbHVkZSA8YXNtL2RlYy9zeXN0ZW0uaD4KLQotI2RlZmluZSBERUNfU0NTSV9TUkVHIDAKLSNkZWZpbmUgREVDX1NDU0lfRE1BUkVHIDB4NDAwMDAKLSNkZWZpbmUgREVDX1NDU0lfU1JBTSAweDgwMDAwCi0jZGVmaW5lIERFQ19TQ1NJX0RJQUcgMHhDMDAwMAotCi0jaW5jbHVkZSAic2NzaS5oIgotI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+Ci0jaW5jbHVkZSAiTkNSNTNDOXguaCIKLQotc3RhdGljIGludCAgZG1hX2J5dGVzX3NlbnQoc3RydWN0IE5DUl9FU1AgKmVzcCwgaW50IGZpZm9fY291bnQpOwotc3RhdGljIHZvaWQgZG1hX2RyYWluKHN0cnVjdCBOQ1JfRVNQICplc3ApOwotc3RhdGljIGludCAgZG1hX2Nhbl90cmFuc2ZlcihzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcCk7Ci1zdGF0aWMgdm9pZCBkbWFfZHVtcF9zdGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgdTMyIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKTsKLXN0YXRpYyB2b2lkIGRtYV9pbml0X3dyaXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIHUzMiB2YWRkcmVzcywgaW50IGxlbmd0aCk7Ci1zdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCk7Ci1zdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyBpbnQgIGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyBpbnQgIGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApOwotc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIHUzMiBhZGRyLCBpbnQgY291bnQsIGludCB3cml0ZSk7Ci1zdGF0aWMgdm9pZCBkbWFfbW11X2dldF9zY3NpX29uZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICogc3ApOwotc3RhdGljIHZvaWQgZG1hX21tdV9nZXRfc2NzaV9zZ2woc3RydWN0IE5DUl9FU1AgKmVzcCwgc3RydWN0IHNjc2lfY21uZCAqIHNwKTsKLXN0YXRpYyB2b2lkIGRtYV9hZHZhbmNlX3NnKHN0cnVjdCBzY3NpX2NtbmQgKiBzcCk7Ci0KLXN0YXRpYyB2b2lkIHBtYXpfZG1hX2RyYWluKHN0cnVjdCBOQ1JfRVNQICplc3ApOwotc3RhdGljIHZvaWQgcG1hel9kbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIHUzMiB2YWRkcmVzcywgaW50IGxlbmd0aCk7Ci1zdGF0aWMgdm9pZCBwbWF6X2RtYV9pbml0X3dyaXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIHUzMiB2YWRkcmVzcywgaW50IGxlbmd0aCk7Ci1zdGF0aWMgdm9pZCBwbWF6X2RtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyB2b2lkIHBtYXpfZG1hX2ludHNfb24oc3RydWN0IE5DUl9FU1AgKmVzcCk7Ci1zdGF0aWMgdm9pZCBwbWF6X2RtYV9zZXR1cChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCB1MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpOwotc3RhdGljIHZvaWQgcG1hel9kbWFfbW11X2dldF9zY3NpX29uZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICogc3ApOwotCi0jZGVmaW5lIFRDX0VTUF9SQU1fU0laRSAweDIwMDAwCi0jZGVmaW5lIEVTUF9UR1RfRE1BX1NJWkUgKChUQ19FU1BfUkFNX1NJWkUvNykgJiB+KHNpemVvZihpbnQpLTEpKQotI2RlZmluZSBFU1BfTkNNRCA3Ci0KLSNkZWZpbmUgVENfRVNQX0RNQVJfTUFTSyAgMHgxZmZmZgotI2RlZmluZSBUQ19FU1BfRE1BUl9XUklURSAweDgwMDAwMDAwCi0jZGVmaW5lIFRDX0VTUF9ETUFfQUREUih4KSAoKHVuc2lnbmVkKSh4KSAmIFRDX0VTUF9ETUFSX01BU0spCi0KLXUzMiBlc3BfdmlydF9idWZmZXI7Ci1pbnQgc2NzaV9jdXJyZW50X2xlbmd0aDsKLQotdm9sYXRpbGUgdW5zaWduZWQgY2hhciBjbWRfYnVmZmVyWzE2XTsKLXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgcG1hel9jbWRfYnVmZmVyWzE2XTsKLQkJCQkvKiBUaGlzIGlzIHdoZXJlIGFsbCBjb21tYW5kcyBhcmUgcHV0Ci0JCQkJICogYmVmb3JlIHRoZXkgYXJlIHRyYXNmZXJlZCB0byB0aGUgRVNQIGNoaXAKLQkJCQkgKiB2aWEgUElPLgotCQkJCSAqLwotCi1zdGF0aWMgaXJxcmV0dXJuX3Qgc2NzaV9kbWFfbWVycl9pbnQoaW50LCB2b2lkICopOwotc3RhdGljIGlycXJldHVybl90IHNjc2lfZG1hX2Vycl9pbnQoaW50LCB2b2lkICopOwotc3RhdGljIGlycXJldHVybl90IHNjc2lfZG1hX2ludChpbnQsIHZvaWQgKik7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGRlY19lc3BfdGVtcGxhdGUgPSB7Ci0JLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCi0JLm5hbWUJCQk9ICJOQ1I1M0M5NCIsCi0JLmluZm8JCQk9IGVzcF9pbmZvLAotCS5xdWV1ZWNvbW1hbmQJCT0gZXNwX3F1ZXVlLAotCS5laF9hYm9ydF9oYW5kbGVyCT0gZXNwX2Fib3J0LAotCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IGVzcF9yZXNldCwKLQkuc2xhdmVfYWxsb2MJCT0gZXNwX3NsYXZlX2FsbG9jLAotCS5zbGF2ZV9kZXN0cm95CQk9IGVzcF9zbGF2ZV9kZXN0cm95LAotCS5wcm9jX2luZm8JCT0gZXNwX3Byb2NfaW5mbywKLQkucHJvY19uYW1lCQk9ICJkZWNfZXNwIiwKLQkuY2FuX3F1ZXVlCQk9IDcsCi0JLnNnX3RhYmxlc2l6ZQkJPSBTR19BTEwsCi0JLmNtZF9wZXJfbHVuCQk9IDEsCi0JLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgTkNSX0VTUCAqZGVjX2VzcF9wbGF0Zm9ybTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERldGVjdGlvbiAqLwotc3RhdGljIGludCBkZWNfZXNwX3BsYXRmb3JtX3Byb2JlKHZvaWQpCi17Ci0Jc3RydWN0IE5DUl9FU1AgKmVzcDsKLQlpbnQgZXJyID0gMDsKLQotCWlmIChJT0FTSUMpIHsKLQkJZXNwID0gZXNwX2FsbG9jYXRlKCZkZWNfZXNwX3RlbXBsYXRlLCBOVUxMLCAxKTsKLQotCQkvKiBEbyBjb21tYW5kIHRyYW5zZmVyIHdpdGggcHJvZ3JhbW1lZCBJL08gKi8KLQkJZXNwLT5kb19waW9fY21kcyA9IDE7Ci0KLQkJLyogUmVxdWlyZWQgZnVuY3Rpb25zICovCi0JCWVzcC0+ZG1hX2J5dGVzX3NlbnQgPSAmZG1hX2J5dGVzX3NlbnQ7Ci0JCWVzcC0+ZG1hX2Nhbl90cmFuc2ZlciA9ICZkbWFfY2FuX3RyYW5zZmVyOwotCQllc3AtPmRtYV9kdW1wX3N0YXRlID0gJmRtYV9kdW1wX3N0YXRlOwotCQllc3AtPmRtYV9pbml0X3JlYWQgPSAmZG1hX2luaXRfcmVhZDsKLQkJZXNwLT5kbWFfaW5pdF93cml0ZSA9ICZkbWFfaW5pdF93cml0ZTsKLQkJZXNwLT5kbWFfaW50c19vZmYgPSAmZG1hX2ludHNfb2ZmOwotCQllc3AtPmRtYV9pbnRzX29uID0gJmRtYV9pbnRzX29uOwotCQllc3AtPmRtYV9pcnFfcCA9ICZkbWFfaXJxX3A7Ci0JCWVzcC0+ZG1hX3BvcnRzX3AgPSAmZG1hX3BvcnRzX3A7Ci0JCWVzcC0+ZG1hX3NldHVwID0gJmRtYV9zZXR1cDsKLQotCQkvKiBPcHRpb25hbCBmdW5jdGlvbnMgKi8KLQkJZXNwLT5kbWFfYmFycmllciA9IDA7Ci0JCWVzcC0+ZG1hX2RyYWluID0gJmRtYV9kcmFpbjsKLQkJZXNwLT5kbWFfaW52YWxpZGF0ZSA9IDA7Ci0JCWVzcC0+ZG1hX2lycV9lbnRyeSA9IDA7Ci0JCWVzcC0+ZG1hX2lycV9leGl0ID0gMDsKLQkJZXNwLT5kbWFfcG9sbCA9IDA7Ci0JCWVzcC0+ZG1hX3Jlc2V0ID0gMDsKLQkJZXNwLT5kbWFfbGVkX29mZiA9IDA7Ci0JCWVzcC0+ZG1hX2xlZF9vbiA9IDA7Ci0KLQkJLyogdmlydHVhbCBETUEgZnVuY3Rpb25zICovCi0JCWVzcC0+ZG1hX21tdV9nZXRfc2NzaV9vbmUgPSAmZG1hX21tdV9nZXRfc2NzaV9vbmU7Ci0JCWVzcC0+ZG1hX21tdV9nZXRfc2NzaV9zZ2wgPSAmZG1hX21tdV9nZXRfc2NzaV9zZ2w7Ci0JCWVzcC0+ZG1hX21tdV9yZWxlYXNlX3Njc2lfb25lID0gMDsKLQkJZXNwLT5kbWFfbW11X3JlbGVhc2Vfc2NzaV9zZ2wgPSAwOwotCQllc3AtPmRtYV9hZHZhbmNlX3NnID0gJmRtYV9hZHZhbmNlX3NnOwotCi0KLQkJLyogU0NTSSBjaGlwIHNwZWVkICovCi0JCWVzcC0+Y2ZyZXEgPSAyNTAwMDAwMDsKLQotCQllc3AtPmRyZWdzID0gMDsKLQotCQkvKiBFU1AgcmVnaXN0ZXIgYmFzZSAqLwotCQllc3AtPmVyZWdzID0gKHZvaWQgKilDS1NFRzFBRERSKGRlY19rbl9zbG90X2Jhc2UgKwotCQkJCQkJSU9BU0lDX1NDU0kpOwotCi0JCS8qIFNldCB0aGUgY29tbWFuZCBidWZmZXIgKi8KLQkJZXNwLT5lc3BfY29tbWFuZCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIGNtZF9idWZmZXI7Ci0KLQkJLyogZ2V0IHZpcnR1YWwgZG1hIGFkZHJlc3MgZm9yIGNvbW1hbmQgYnVmZmVyICovCi0JCWVzcC0+ZXNwX2NvbW1hbmRfZHZtYSA9IHZpcnRfdG9fcGh5cyhjbWRfYnVmZmVyKTsKLQotCQllc3AtPmlycSA9IGRlY19pbnRlcnJ1cHRbREVDX0lSUV9BU0NdOwotCi0JCWVzcC0+c2NzaV9pZCA9IDc7Ci0KLQkJLyogQ2hlY2sgZm9yIGRpZmZlcmVudGlhbCBTQ1NJLWJ1cyAqLwotCQllc3AtPmRpZmYgPSAwOwotCi0JCWVyciA9IHJlcXVlc3RfaXJxKGVzcC0+aXJxLCBlc3BfaW50ciwgSVJRRl9ESVNBQkxFRCwKLQkJCQkgICJuY3I1M2M5NCIsIGVzcC0+ZWhvc3QpOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJfYWxsb2M7Ci0JCWVyciA9IHJlcXVlc3RfaXJxKGRlY19pbnRlcnJ1cHRbREVDX0lSUV9BU0NfTUVSUl0sCi0JCQkJICBzY3NpX2RtYV9tZXJyX2ludCwgSVJRRl9ESVNBQkxFRCwKLQkJCQkgICJuY3I1M2M5NCBlcnJvciIsIGVzcC0+ZWhvc3QpOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJfaXJxOwotCQllcnIgPSByZXF1ZXN0X2lycShkZWNfaW50ZXJydXB0W0RFQ19JUlFfQVNDX0VSUl0sCi0JCQkJICBzY3NpX2RtYV9lcnJfaW50LCBJUlFGX0RJU0FCTEVELAotCQkJCSAgIm5jcjUzYzk0IG92ZXJydW4iLCBlc3AtPmVob3N0KTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXJyX2lycV9tZXJyOwotCQllcnIgPSByZXF1ZXN0X2lycShkZWNfaW50ZXJydXB0W0RFQ19JUlFfQVNDX0RNQV0sIHNjc2lfZG1hX2ludCwKLQkJCQkgIElSUUZfRElTQUJMRUQsICJuY3I1M2M5NCBkbWEiLCBlc3AtPmVob3N0KTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXJyX2lycV9lcnI7Ci0KLQkJZXNwX2luaXRpYWxpemUoZXNwKTsKLQotCQllcnIgPSBzY3NpX2FkZF9ob3N0KGVzcC0+ZWhvc3QsIE5VTEwpOwotCQlpZiAoZXJyKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIkVTUDogVW5hYmxlIHRvIHJlZ2lzdGVyIGFkYXB0ZXJcbiIpOwotCQkJZ290byBlcnJfaXJxX2RtYTsKLQkJfQotCi0JCXNjc2lfc2Nhbl9ob3N0KGVzcC0+ZWhvc3QpOwotCi0JCWRlY19lc3BfcGxhdGZvcm0gPSBlc3A7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycl9pcnFfZG1hOgotCWZyZWVfaXJxKGRlY19pbnRlcnJ1cHRbREVDX0lSUV9BU0NfRE1BXSwgZXNwLT5laG9zdCk7Ci1lcnJfaXJxX2VycjoKLQlmcmVlX2lycShkZWNfaW50ZXJydXB0W0RFQ19JUlFfQVNDX0VSUl0sIGVzcC0+ZWhvc3QpOwotZXJyX2lycV9tZXJyOgotCWZyZWVfaXJxKGRlY19pbnRlcnJ1cHRbREVDX0lSUV9BU0NfTUVSUl0sIGVzcC0+ZWhvc3QpOwotZXJyX2lycToKLQlmcmVlX2lycShlc3AtPmlycSwgZXNwLT5laG9zdCk7Ci1lcnJfYWxsb2M6Ci0JZXNwX2RlYWxsb2NhdGUoZXNwKTsKLQlzY3NpX2hvc3RfcHV0KGVzcC0+ZWhvc3QpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGRlY19lc3BfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBOQ1JfRVNQICplc3A7Ci0JcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LCBsZW47Ci0JaW50IGVycjsKLQotCWVzcCA9IGVzcF9hbGxvY2F0ZSgmZGVjX2VzcF90ZW1wbGF0ZSwgIE5VTEwsIDEpOwotCi0JZGV2X3NldF9kcnZkYXRhKGRldiwgZXNwKTsKLQotCXN0YXJ0ID0gdG9fdGNfZGV2KGRldiktPnJlc291cmNlLnN0YXJ0OwotCWxlbiA9IHRvX3RjX2RldihkZXYpLT5yZXNvdXJjZS5lbmQgLSBzdGFydCArIDE7Ci0KLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihzdGFydCwgbGVuLCBkZXYtPmJ1c19pZCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIHJlc2VydmUgTU1JTyByZXNvdXJjZVxuIiwKLQkJICAgICAgIGRldi0+YnVzX2lkKTsKLQkJZXJyID0gLUVCVVNZOwotCQlnb3RvIGVycl9hbGxvYzsKLQl9Ci0KLQkvKiBTdG9yZSBiYXNlIGFkZHIgaW50byBlc3Agc3RydWN0LiAgKi8KLQllc3AtPnNsb3QgPSBzdGFydDsKLQotCWVzcC0+ZHJlZ3MgPSAwOwotCWVzcC0+ZXJlZ3MgPSAodm9pZCAqKUNLU0VHMUFERFIoc3RhcnQgKyBERUNfU0NTSV9TUkVHKTsKLQllc3AtPmRvX3Bpb19jbWRzID0gMTsKLQotCS8qIFNldCB0aGUgY29tbWFuZCBidWZmZXIuICAqLwotCWVzcC0+ZXNwX2NvbW1hbmQgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXBtYXpfY21kX2J1ZmZlcjsKLQotCS8qIEdldCB2aXJ0dWFsIGRtYSBhZGRyZXNzIGZvciBjb21tYW5kIGJ1ZmZlci4gICovCi0JZXNwLT5lc3BfY29tbWFuZF9kdm1hID0gdmlydF90b19waHlzKHBtYXpfY21kX2J1ZmZlcik7Ci0KLQllc3AtPmNmcmVxID0gdGNfZ2V0X3NwZWVkKHRvX3RjX2RldihkZXYpLT5idXMpOwotCi0JZXNwLT5pcnEgPSB0b190Y19kZXYoZGV2KS0+aW50ZXJydXB0OwotCi0JLyogUmVxdWlyZWQgZnVuY3Rpb25zLiAgKi8KLQllc3AtPmRtYV9ieXRlc19zZW50ID0gJmRtYV9ieXRlc19zZW50OwotCWVzcC0+ZG1hX2Nhbl90cmFuc2ZlciA9ICZkbWFfY2FuX3RyYW5zZmVyOwotCWVzcC0+ZG1hX2R1bXBfc3RhdGUgPSAmZG1hX2R1bXBfc3RhdGU7Ci0JZXNwLT5kbWFfaW5pdF9yZWFkID0gJnBtYXpfZG1hX2luaXRfcmVhZDsKLQllc3AtPmRtYV9pbml0X3dyaXRlID0gJnBtYXpfZG1hX2luaXRfd3JpdGU7Ci0JZXNwLT5kbWFfaW50c19vZmYgPSAmcG1hel9kbWFfaW50c19vZmY7Ci0JZXNwLT5kbWFfaW50c19vbiA9ICZwbWF6X2RtYV9pbnRzX29uOwotCWVzcC0+ZG1hX2lycV9wID0gJmRtYV9pcnFfcDsKLQllc3AtPmRtYV9wb3J0c19wID0gJmRtYV9wb3J0c19wOwotCWVzcC0+ZG1hX3NldHVwID0gJnBtYXpfZG1hX3NldHVwOwotCi0JLyogT3B0aW9uYWwgZnVuY3Rpb25zLiAgKi8KLQllc3AtPmRtYV9iYXJyaWVyID0gMDsKLQllc3AtPmRtYV9kcmFpbiA9ICZwbWF6X2RtYV9kcmFpbjsKLQllc3AtPmRtYV9pbnZhbGlkYXRlID0gMDsKLQllc3AtPmRtYV9pcnFfZW50cnkgPSAwOwotCWVzcC0+ZG1hX2lycV9leGl0ID0gMDsKLQllc3AtPmRtYV9wb2xsID0gMDsKLQllc3AtPmRtYV9yZXNldCA9IDA7Ci0JZXNwLT5kbWFfbGVkX29mZiA9IDA7Ci0JZXNwLT5kbWFfbGVkX29uID0gMDsKLQotCWVzcC0+ZG1hX21tdV9nZXRfc2NzaV9vbmUgPSBwbWF6X2RtYV9tbXVfZ2V0X3Njc2lfb25lOwotCWVzcC0+ZG1hX21tdV9nZXRfc2NzaV9zZ2wgPSAwOwotCWVzcC0+ZG1hX21tdV9yZWxlYXNlX3Njc2lfb25lID0gMDsKLQllc3AtPmRtYV9tbXVfcmVsZWFzZV9zY3NpX3NnbCA9IDA7Ci0JZXNwLT5kbWFfYWR2YW5jZV9zZyA9IDA7Ci0KLQllcnIgPSByZXF1ZXN0X2lycShlc3AtPmlycSwgZXNwX2ludHIsIElSUUZfRElTQUJMRUQsICJQTUFaX0FBIiwKLQkJCSAgZXNwLT5laG9zdCk7Ci0JaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gZ2V0IElSUSAlZFxuIiwKLQkJICAgICAgIGRldi0+YnVzX2lkLCBlc3AtPmlycSk7Ci0JCWdvdG8gZXJyX3Jlc291cmNlOwotCX0KLQotCWVzcC0+c2NzaV9pZCA9IDc7Ci0JZXNwLT5kaWZmID0gMDsKLQllc3BfaW5pdGlhbGl6ZShlc3ApOwotCi0JZXJyID0gc2NzaV9hZGRfaG9zdChlc3AtPmVob3N0LCBkZXYpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIGFkYXB0ZXJcbiIsCi0JCSAgICAgICBkZXYtPmJ1c19pZCk7Ci0JCWdvdG8gZXJyX2lycTsKLQl9Ci0KLQlzY3NpX3NjYW5faG9zdChlc3AtPmVob3N0KTsKLQotCXJldHVybiAwOwotCi1lcnJfaXJxOgotCWZyZWVfaXJxKGVzcC0+aXJxLCBlc3AtPmVob3N0KTsKLQotZXJyX3Jlc291cmNlOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihzdGFydCwgbGVuKTsKLQotZXJyX2FsbG9jOgotCWVzcF9kZWFsbG9jYXRlKGVzcCk7Ci0Jc2NzaV9ob3N0X3B1dChlc3AtPmVob3N0KTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZGVjX2VzcF9wbGF0Zm9ybV9yZW1vdmUodm9pZCkKLXsKLQlzdHJ1Y3QgTkNSX0VTUCAqZXNwID0gZGVjX2VzcF9wbGF0Zm9ybTsKLQotCWZyZWVfaXJxKGVzcC0+aXJxLCBlc3AtPmVob3N0KTsKLQllc3BfZGVhbGxvY2F0ZShlc3ApOwotCXNjc2lfaG9zdF9wdXQoZXNwLT5laG9zdCk7Ci0JZGVjX2VzcF9wbGF0Zm9ybSA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBkZWNfZXNwX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IE5DUl9FU1AgKmVzcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JZnJlZV9pcnEoZXNwLT5pcnEsIGVzcC0+ZWhvc3QpOwotCWVzcF9kZWFsbG9jYXRlKGVzcCk7Ci0Jc2NzaV9ob3N0X3B1dChlc3AtPmVob3N0KTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBETUEgRnVuY3Rpb25zICovCi1zdGF0aWMgaXJxcmV0dXJuX3Qgc2NzaV9kbWFfbWVycl9pbnQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXByaW50aygiR290IHVuZXhwZWN0ZWQgU0NTSSBETUEgSW50ZXJydXB0ISA8ICIpOwotCXByaW50aygiU0NTSV9ETUFfTUVNUkRFUlIgIik7Ci0JcHJpbnRrKCI+XG4iKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGlycXJldHVybl90IHNjc2lfZG1hX2Vycl9pbnQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCS8qIGVtcHR5ICovCi0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBzY3NpX2RtYV9pbnQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXUzMiBzY3NpX25leHRfcHRyOwotCi0Jc2NzaV9uZXh0X3B0ciA9IGlvYXNpY19yZWFkKElPX1JFR19TQ1NJX0RNQV9QKTsKLQotCS8qIG5leHQgcGFnZSAqLwotCXNjc2lfbmV4dF9wdHIgPSAoKChzY3NpX25leHRfcHRyID4+IDMpICsgUEFHRV9TSVpFKSAmIFBBR0VfTUFTSykgPDwgMzsKLQlpb2FzaWNfd3JpdGUoSU9fUkVHX1NDU0lfRE1BX0JQLCBzY3NpX25leHRfcHRyKTsKLQlmYXN0X2lvYigpOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaW50IGRtYV9ieXRlc19zZW50KHN0cnVjdCBOQ1JfRVNQICplc3AsIGludCBmaWZvX2NvdW50KQotewotCXJldHVybiBmaWZvX2NvdW50OwotfQotCi1zdGF0aWMgdm9pZCBkbWFfZHJhaW4oc3RydWN0IE5DUl9FU1AgKmVzcCkKLXsKLQl1MzIgbncsIGRhdGEwLCBkYXRhMSwgc2NzaV9kYXRhX3B0cjsKLQl1MTYgKnA7Ci0KLQludyA9IGlvYXNpY19yZWFkKElPX1JFR19TQ1NJX1NDUik7Ci0KLQkvKgotCSAqIElzIHRoZXJlIHNvbWV0aGluZyBpbiB0aGUgZG1hIGJ1ZmZlcnMgbGVmdD8KLQkgKi8KLQlpZiAobncpIHsKLQkJc2NzaV9kYXRhX3B0ciA9IGlvYXNpY19yZWFkKElPX1JFR19TQ1NJX0RNQV9QKSA+PiAzOwotCQlwID0gcGh5c190b192aXJ0KHNjc2lfZGF0YV9wdHIpOwotCQlzd2l0Y2ggKG53KSB7Ci0JCWNhc2UgMToKLQkJCWRhdGEwID0gaW9hc2ljX3JlYWQoSU9fUkVHX1NDU0lfU0RSMCk7Ci0JCQlwWzBdID0gZGF0YTAgJiAweGZmZmY7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJZGF0YTAgPSBpb2FzaWNfcmVhZChJT19SRUdfU0NTSV9TRFIwKTsKLQkJCXBbMF0gPSBkYXRhMCAmIDB4ZmZmZjsKLQkJCXBbMV0gPSAoZGF0YTAgPj4gMTYpICYgMHhmZmZmOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCWRhdGEwID0gaW9hc2ljX3JlYWQoSU9fUkVHX1NDU0lfU0RSMCk7Ci0JCQlkYXRhMSA9IGlvYXNpY19yZWFkKElPX1JFR19TQ1NJX1NEUjEpOwotCQkJcFswXSA9IGRhdGEwICYgMHhmZmZmOwotCQkJcFsxXSA9IChkYXRhMCA+PiAxNikgJiAweGZmZmY7Ci0JCQlwWzJdID0gZGF0YTEgJiAweGZmZmY7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByaW50aygiU3RyYW5nZTogJWQgd29yZHMgaW4gZG1hIGJ1ZmZlciBsZWZ0XG4iLCBudyk7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotc3RhdGljIGludCBkbWFfY2FuX3RyYW5zZmVyKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBzY3NpX2NtbmQgKiBzcCkKLXsKLQlyZXR1cm4gc3AtPlNDcC50aGlzX3Jlc2lkdWFsOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfZHVtcF9zdGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotfQotCi1zdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICplc3AsIHUzMiB2YWRkcmVzcywgaW50IGxlbmd0aCkKLXsKLQl1MzIgc2NzaV9uZXh0X3B0ciwgaW9hc2ljX3NzcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHZhZGRyZXNzICYgMykKLQkJcGFuaWMoImRlY19lc3AuYzogdW5hYmxlIHRvIGhhbmRsZSBwYXJ0aWFsIHdvcmQgdHJhbnNmZXJzLCB5ZXQuLi4iKTsKLQotCWRtYV9jYWNoZV93YmFja19pbnYoKHVuc2lnbmVkIGxvbmcpIHBoeXNfdG9fdmlydCh2YWRkcmVzcyksIGxlbmd0aCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hc2ljX3Nzcl9sb2NrLCBmbGFncyk7Ci0KLQlmYXN0X21iKCk7Ci0JaW9hc2ljX3NzciA9IGlvYXNpY19yZWFkKElPX1JFR19TU1IpOwotCi0JaW9hc2ljX3NzciAmPSB+SU9fU1NSX1NDU0lfRE1BX0VOOwotCWlvYXNpY193cml0ZShJT19SRUdfU1NSLCBpb2FzaWNfc3NyKTsKLQotCWZhc3Rfd21iKCk7Ci0JaW9hc2ljX3dyaXRlKElPX1JFR19TQ1NJX1NDUiwgMCk7Ci0JaW9hc2ljX3dyaXRlKElPX1JFR19TQ1NJX0RNQV9QLCB2YWRkcmVzcyA8PCAzKTsKLQotCS8qIHByZXBhcmUgZm9yIG5leHQgcGFnZSAqLwotCXNjc2lfbmV4dF9wdHIgPSAoKHZhZGRyZXNzICsgUEFHRV9TSVpFKSAmIFBBR0VfTUFTSykgPDwgMzsKLQlpb2FzaWNfd3JpdGUoSU9fUkVHX1NDU0lfRE1BX0JQLCBzY3NpX25leHRfcHRyKTsKLQotCWlvYXNpY19zc3IgfD0gKElPX1NTUl9TQ1NJX0RNQV9ESVIgfCBJT19TU1JfU0NTSV9ETUFfRU4pOwotCWZhc3Rfd21iKCk7Ci0JaW9hc2ljX3dyaXRlKElPX1JFR19TU1IsIGlvYXNpY19zc3IpOwotCi0JZmFzdF9pb2IoKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FzaWNfc3NyX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgdTMyIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKQotewotCXUzMiBzY3NpX25leHRfcHRyLCBpb2FzaWNfc3NyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAodmFkZHJlc3MgJiAzKQotCQlwYW5pYygiZGVjX2VzcC5jOiB1bmFibGUgdG8gaGFuZGxlIHBhcnRpYWwgd29yZCB0cmFuc2ZlcnMsIHlldC4uLiIpOwotCi0JZG1hX2NhY2hlX3diYWNrX2ludigodW5zaWduZWQgbG9uZykgcGh5c190b192aXJ0KHZhZGRyZXNzKSwgbGVuZ3RoKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FzaWNfc3NyX2xvY2ssIGZsYWdzKTsKLQotCWZhc3RfbWIoKTsKLQlpb2FzaWNfc3NyID0gaW9hc2ljX3JlYWQoSU9fUkVHX1NTUik7Ci0KLQlpb2FzaWNfc3NyICY9IH4oSU9fU1NSX1NDU0lfRE1BX0RJUiB8IElPX1NTUl9TQ1NJX0RNQV9FTik7Ci0JaW9hc2ljX3dyaXRlKElPX1JFR19TU1IsIGlvYXNpY19zc3IpOwotCi0JZmFzdF93bWIoKTsKLQlpb2FzaWNfd3JpdGUoSU9fUkVHX1NDU0lfU0NSLCAwKTsKLQlpb2FzaWNfd3JpdGUoSU9fUkVHX1NDU0lfRE1BX1AsIHZhZGRyZXNzIDw8IDMpOwotCi0JLyogcHJlcGFyZSBmb3IgbmV4dCBwYWdlICovCi0Jc2NzaV9uZXh0X3B0ciA9ICgodmFkZHJlc3MgKyBQQUdFX1NJWkUpICYgUEFHRV9NQVNLKSA8PCAzOwotCWlvYXNpY193cml0ZShJT19SRUdfU0NTSV9ETUFfQlAsIHNjc2lfbmV4dF9wdHIpOwotCi0JaW9hc2ljX3NzciB8PSBJT19TU1JfU0NTSV9ETUFfRU47Ci0JZmFzdF93bWIoKTsKLQlpb2FzaWNfd3JpdGUoSU9fUkVHX1NTUiwgaW9hc2ljX3Nzcik7Ci0KLQlmYXN0X2lvYigpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXNpY19zc3JfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCkKLXsKLQlkaXNhYmxlX2lycShkZWNfaW50ZXJydXB0W0RFQ19JUlFfQVNDX0RNQV0pOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotCWVuYWJsZV9pcnEoZGVjX2ludGVycnVwdFtERUNfSVJRX0FTQ19ETUFdKTsKLX0KLQotc3RhdGljIGludCBkbWFfaXJxX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCkKLXsKLQlyZXR1cm4gKGVzcC0+ZXJlZ3MtPmVzcF9zdGF0dXMgJiBFU1BfU1RBVF9JTlRSKTsKLX0KLQotc3RhdGljIGludCBkbWFfcG9ydHNfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotCS8qCi0JICogRklYTUU6IHdoYXQncyB0aGlzIGdvb2QgZm9yPwotCSAqLwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKmVzcCwgdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKQotewotCS8qCi0JICogRE1BX1NUX1dSSVRFIG1lYW5zICJtb3ZlIGRhdGEgZnJvbSBkZXZpY2UgdG8gbWVtb3J5IgotCSAqIHNvIHdoZW4gKHdyaXRlKSBpcyB0cnVlLCBpdCBhY3R1YWxseSBtZWFucyBSRUFEIQotCSAqLwotCWlmICh3cml0ZSkKLQkJZG1hX2luaXRfcmVhZChlc3AsIGFkZHIsIGNvdW50KTsKLQllbHNlCi0JCWRtYV9pbml0X3dyaXRlKGVzcCwgYWRkciwgY291bnQpOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfbW11X2dldF9zY3NpX29uZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICogc3ApCi17Ci0Jc3AtPlNDcC5wdHIgPSAoY2hhciAqKXZpcnRfdG9fcGh5cyhzcC0+cmVxdWVzdF9idWZmZXIpOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfbW11X2dldF9zY3NpX3NnbChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICogc3ApCi17Ci0JaW50IHN6ID0gc3AtPlNDcC5idWZmZXJzX3Jlc2lkdWFsOwotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBzcC0+U0NwLmJ1ZmZlcjsKLQotCXdoaWxlIChzeiA+PSAwKSB7Ci0JCXNnW3N6XS5kbWFfYWRkcmVzcyA9IHBhZ2VfdG9fcGh5cyhzZ1tzel0ucGFnZSkgKyBzZ1tzel0ub2Zmc2V0OwotCQlzei0tOwotCX0KLQlzcC0+U0NwLnB0ciA9IChjaGFyICopKHNwLT5TQ3AuYnVmZmVyLT5kbWFfYWRkcmVzcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9hZHZhbmNlX3NnKHN0cnVjdCBzY3NpX2NtbmQgKiBzcCkKLXsKLQlzcC0+U0NwLnB0ciA9IChjaGFyICopKHNwLT5TQ3AuYnVmZmVyLT5kbWFfYWRkcmVzcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBtYXpfZG1hX2RyYWluKHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci0JbWVtY3B5KHBoeXNfdG9fdmlydChlc3BfdmlydF9idWZmZXIpLAotCSAgICAgICAodm9pZCAqKUNLU0VHMUFERFIoZXNwLT5zbG90ICsgREVDX1NDU0lfU1JBTSArCi0JCQkJICBFU1BfVEdUX0RNQV9TSVpFKSwKLQkgICAgICAgc2NzaV9jdXJyZW50X2xlbmd0aCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBtYXpfZG1hX2luaXRfcmVhZChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCB1MzIgdmFkZHJlc3MsIGludCBsZW5ndGgpCi17Ci0Jdm9sYXRpbGUgdTMyICpkbWFyZWcgPQotCQkodm9sYXRpbGUgdTMyICopQ0tTRUcxQUREUihlc3AtPnNsb3QgKyBERUNfU0NTSV9ETUFSRUcpOwotCi0JaWYgKGxlbmd0aCA+IEVTUF9UR1RfRE1BX1NJWkUpCi0JCWxlbmd0aCA9IEVTUF9UR1RfRE1BX1NJWkU7Ci0KLQkqZG1hcmVnID0gVENfRVNQX0RNQV9BRERSKEVTUF9UR1RfRE1BX1NJWkUpOwotCi0JaW9iKCk7Ci0KLQllc3BfdmlydF9idWZmZXIgPSB2YWRkcmVzczsKLQlzY3NpX2N1cnJlbnRfbGVuZ3RoID0gbGVuZ3RoOwotfQotCi1zdGF0aWMgdm9pZCBwbWF6X2RtYV9pbml0X3dyaXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIHUzMiB2YWRkcmVzcywgaW50IGxlbmd0aCkKLXsKLQl2b2xhdGlsZSB1MzIgKmRtYXJlZyA9Ci0JCSh2b2xhdGlsZSB1MzIgKilDS1NFRzFBRERSKGVzcC0+c2xvdCArIERFQ19TQ1NJX0RNQVJFRyk7Ci0KLQltZW1jcHkoKHZvaWQgKilDS1NFRzFBRERSKGVzcC0+c2xvdCArIERFQ19TQ1NJX1NSQU0gKwotCQkJCSAgRVNQX1RHVF9ETUFfU0laRSksCi0JICAgICAgIHBoeXNfdG9fdmlydCh2YWRkcmVzcyksIGxlbmd0aCk7Ci0KLQl3bWIoKTsKLQkqZG1hcmVnID0gVENfRVNQX0RNQVJfV1JJVEUgfCBUQ19FU1BfRE1BX0FERFIoRVNQX1RHVF9ETUFfU0laRSk7Ci0KLQlpb2IoKTsKLX0KLQotc3RhdGljIHZvaWQgcG1hel9kbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCkKLXsKLX0KLQotc3RhdGljIHZvaWQgcG1hel9kbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotfQotCi1zdGF0aWMgdm9pZCBwbWF6X2RtYV9zZXR1cChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCB1MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpCi17Ci0JLyoKLQkgKiBETUFfU1RfV1JJVEUgbWVhbnMgIm1vdmUgZGF0YSBmcm9tIGRldmljZSB0byBtZW1vcnkiCi0JICogc28gd2hlbiAod3JpdGUpIGlzIHRydWUsIGl0IGFjdHVhbGx5IG1lYW5zIFJFQUQhCi0JICovCi0JaWYgKHdyaXRlKQotCQlwbWF6X2RtYV9pbml0X3JlYWQoZXNwLCBhZGRyLCBjb3VudCk7Ci0JZWxzZQotCQlwbWF6X2RtYV9pbml0X3dyaXRlKGVzcCwgYWRkciwgY291bnQpOwotfQotCi1zdGF0aWMgdm9pZCBwbWF6X2RtYV9tbXVfZ2V0X3Njc2lfb25lKHN0cnVjdCBOQ1JfRVNQICplc3AsIHN0cnVjdCBzY3NpX2NtbmQgKiBzcCkKLXsKLQlzcC0+U0NwLnB0ciA9IChjaGFyICopdmlydF90b19waHlzKHNwLT5yZXF1ZXN0X2J1ZmZlcik7Ci19Ci0KLQotI2lmZGVmIENPTkZJR19UQwotc3RhdGljIGludCBfX2luaXQgZGVjX2VzcF90Y19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotc3RhdGljIGludCBfX2V4aXQgZGVjX2VzcF90Y19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0Y19kZXZpY2VfaWQgZGVjX2VzcF90Y190YWJsZVtdID0gewotICAgICAgICB7ICJERUMgICAgICIsICJQTUFaLUFBICIgfSwKLSAgICAgICAgeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRSh0YywgZGVjX2VzcF90Y190YWJsZSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgdGNfZHJpdmVyIGRlY19lc3BfdGNfZHJpdmVyID0gewotICAgICAgICAuaWRfdGFibGUgICAgICAgPSBkZWNfZXNwX3RjX3RhYmxlLAotICAgICAgICAuZHJpdmVyICAgICAgICAgPSB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICA9ICJkZWNfZXNwIiwKLSAgICAgICAgICAgICAgICAuYnVzICAgID0gJnRjX2J1c190eXBlLAotICAgICAgICAgICAgICAgIC5wcm9iZSAgPSBkZWNfZXNwX3RjX3Byb2JlLAotICAgICAgICAgICAgICAgIC5yZW1vdmUgPSBfX2V4aXRfcChkZWNfZXNwX3RjX3JlbW92ZSksCi0gICAgICAgIH0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBkZWNfZXNwX3RjX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlpbnQgc3RhdHVzID0gZGVjX2VzcF9wcm9iZShkZXYpOwotCWlmICghc3RhdHVzKQotCQlnZXRfZGV2aWNlKGRldik7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCBfX2V4aXQgZGVjX2VzcF90Y19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXB1dF9kZXZpY2UoZGV2KTsKLQlkZWNfZXNwX3JlbW92ZShkZXYpOwotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgX19pbml0IGRlY19lc3BfaW5pdCh2b2lkKQotewotCWludCBzdGF0dXM7Ci0KLQlzdGF0dXMgPSB0Y19yZWdpc3Rlcl9kcml2ZXIoJmRlY19lc3BfdGNfZHJpdmVyKTsKLQlpZiAoIXN0YXR1cykKLQkJZGVjX2VzcF9wbGF0Zm9ybV9wcm9iZSgpOwotCi0JaWYgKG5lc3BzKSB7Ci0JCXByX2luZm8oIkVTUDogVG90YWwgb2YgJWQgRVNQIGhvc3RzIGZvdW5kLCAiCi0JCQkiJWQgYWN0dWFsbHkgaW4gdXNlLlxuIiwgbmVzcHMsIGVzcHNfaW5fdXNlKTsKLQkJZXNwc19ydW5uaW5nID0gZXNwc19pbl91c2U7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGRlY19lc3BfZXhpdCh2b2lkKQotewotCWRlY19lc3BfcGxhdGZvcm1fcmVtb3ZlKCk7Ci0JdGNfdW5yZWdpc3Rlcl9kcml2ZXIoJmRlY19lc3BfdGNfZHJpdmVyKTsKLX0KLQotCi1tb2R1bGVfaW5pdChkZWNfZXNwX2luaXQpOwotbW9kdWxlX2V4aXQoZGVjX2VzcF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9mYXN0bGFuZS5jIGIvZHJpdmVycy9zY3NpL2Zhc3RsYW5lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNjZhMjEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zY3NpL2Zhc3RsYW5lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotLyogZmFzdGxhbmUuYzogRHJpdmVyIGZvciBQaGFzZTUncyBGYXN0bGFuZSBTQ1NJIENvbnRyb2xsZXIuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk2IEplc3BlciBTa292IChqc2tvdkBjeWdudXMuY28udWspCi0gKgotICogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gdGhlIEN5YmVyU3Rvcm0gZHJpdmVyLCBoZW5jZSB0aGUgb2NjYXNpb25hbAotICogcmVmZXJlbmNlIHRvIEN5YmVyU3Rvcm0uCi0gKgotICogQmV0YXRlc3RpbmcgJiBjcnVjaWFsIGFkanVzdG1lbnRzIGJ5Ci0gKiAgICAgICAgUGF0cmlrIFJhayAocHJhazMyNjRAc3MxMDAwLm1zLm1mZi5jdW5pLmN6KQotICoKLSAqLwotCi0vKiBUT0RPOgotICoKLSAqIG8gQWNjb3JkaW5nIHRvIHRoZSBkb2MgZnJvbSBsYWlyZSwgaXQgaXMgcmVxdWlyZWQgdG8gcmVzZXQgdGhlIERNQSB3aGVuCi0gKiAgIHRoZSB0cmFuc2ZlciBpcyBkb25lLiBBVE0gd2UgcmVzZXQgRE1BIGp1c3QgYmVmb3JlIGV2ZXJ5IG5ldyAKLSAqICAgZG1hX2luaXRfKHJlYWR8d3JpdGUpLgotICoKLSAqIDEpIEZpZ3VyZSBvdXQgaG93IHRvIG1ha2UgYSBjbGVhbmVyIG1lcmdlIHdpdGggdGhlIHNwYXJjIGRyaXZlciB3aXRoIHJlZ2FyZAotICogICAgdG8gdGhlIGNhY2hlcyBhbmQgdGhlIFNwYXJjIE1NVSBtYXBwaW5nLgotICogMikgTWFrZSBhcyBmZXcgcm91dGluZXMgcmVxdWlyZWQgb3V0c2lkZSB0aGUgZ2VuZXJpYyBkcml2ZXIuIEEgbG90IG9mIHRoZQotICogICAgcm91dGluZXMgaW4gdGhpcyBmaWxlIHVzZWQgdG8gYmUgaW5saW5lIQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KLSNpbmNsdWRlICJzY3NpLmgiCi0jaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KLSNpbmNsdWRlICJOQ1I1M0M5eC5oIgotCi0jaW5jbHVkZSA8bGludXgvem9ycm8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0KLSNpbmNsdWRlIDxhc20vYW1pZ2FpbnRzLmg+Ci0jaW5jbHVkZSA8YXNtL2FtaWdhaHcuaD4KLQotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0KLS8qIFN1Y2ggZGF5IGhhcyBqdXN0IGNvbWUuLi4gKi8KLSNpZiAwCi0vKiBMZXQgdGhpcyBkZWZpbmVkIHVubGVzcyB5b3UgcmVhbGx5IG5lZWQgdG8gZW5hYmxlIERNQSBJUlEgb25lIGRheSAqLwotI2RlZmluZSBOT0RNQUlSUQotI2VuZGlmCi0KLS8qIFRoZSBjb250cm9sbGVyIHJlZ2lzdGVycyBjYW4gYmUgZm91bmQgaW4gdGhlIFoyIGNvbmZpZyBhcmVhIGF0IHRoZXNlCi0gKiBvZmZzZXRzOgotICovCi0jZGVmaW5lIEZBU1RMQU5FX0VTUF9BRERSIDB4MTAwMDAwMQotI2RlZmluZSBGQVNUTEFORV9ETUFfQUREUiAweDEwMDAwNDEKLQotCi0vKiBUaGUgRmFzdGxhbmUgRE1BIGludGVyZmFjZSAqLwotc3RydWN0IGZhc3RsYW5lX2RtYV9yZWdpc3RlcnMgewotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgY29uZF9yZWc7CS8qIERNQSBzdGF0dXMgIChybykgWzB4MDAwMF0gKi8KLSNkZWZpbmUgY3RybF9yZWcgIGNvbmRfcmVnCQkJLyogRE1BIGNvbnRyb2wgKHdvKSBbMHgwMDAwXSAqLwotCXVuc2lnbmVkIGNoYXIgZG1hcGFkMVsweDNmXTsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGNsZWFyX3N0cm9iZTsgICAgLyogRE1BIGNsZWFyICAgKHdvKSBbMHgwMDQwXSAqLwotfTsKLQotCi0vKiBETUEgc3RhdHVzIGJpdHMgKi8KLSNkZWZpbmUgRkFTVExBTkVfRE1BX01JTlQgIDB4ODAKLSNkZWZpbmUgRkFTVExBTkVfRE1BX0lBQ1QgIDB4NDAKLSNkZWZpbmUgRkFTVExBTkVfRE1BX0NSRVEgIDB4MjAKLQotLyogRE1BIGNvbnRyb2wgYml0cyAqLwotI2RlZmluZSBGQVNUTEFORV9ETUFfRkNPREUgMHhhMAotI2RlZmluZSBGQVNUTEFORV9ETUFfTUFTSyAgMHhmMwotI2RlZmluZSBGQVNUTEFORV9ETUFfTEVEICAgMHgxMAkvKiBIRCBsZWQgY29udHJvbCAxID0gb24gKi8KLSNkZWZpbmUgRkFTVExBTkVfRE1BX1dSSVRFIDB4MDggLyogMSA9IHdyaXRlICovCi0jZGVmaW5lIEZBU1RMQU5FX0RNQV9FTkFCTEUgMHgwNCAvKiBFbmFibGUgRE1BICovCi0jZGVmaW5lIEZBU1RMQU5FX0RNQV9FREkgICAweDAyCS8qIEVuYWJsZSBETUEgSVJRID8gKi8KLSNkZWZpbmUgRkFTVExBTkVfRE1BX0VTSSAgIDB4MDEJLyogRW5hYmxlIFNDU0kgSVJRICovCi0KLXN0YXRpYyBpbnQgIGRtYV9ieXRlc19zZW50KHN0cnVjdCBOQ1JfRVNQICplc3AsIGludCBmaWZvX2NvdW50KTsKLXN0YXRpYyBpbnQgIGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCk7Ci1zdGF0aWMgdm9pZCBkbWFfZHVtcF9zdGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCk7Ci1zdGF0aWMgdm9pZCBkbWFfaW5pdF93cml0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiB2YWRkciwgaW50IGxlbmd0aCk7Ci1zdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCk7Ci1zdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyBpbnQgIGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyB2b2lkIGRtYV9pcnFfZXhpdChzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyB2b2lkIGRtYV9sZWRfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApOwotc3RhdGljIHZvaWQgZG1hX2xlZF9vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyBpbnQgIGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApOwotc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgY3RybF9kYXRhID0gMDsJLyogS2VlcCBiYWNrdXAgb2YgdGhlIHN0dWZmIHdyaXR0ZW4KLQkJCQkgKiB0byBjdHJsX3JlZy4gQWx3YXlzIHdyaXRlIGEgY29weQotCQkJCSAqIHRvIHRoaXMgcmVnaXN0ZXIgd2hlbiB3cml0aW5nIHRvCi0JCQkJICogdGhlIGhhcmR3YXJlIHJlZ2lzdGVyIQotCQkJCSAqLwotCi1zdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBjbWRfYnVmZmVyWzE2XTsKLQkJCQkvKiBUaGlzIGlzIHdoZXJlIGFsbCBjb21tYW5kcyBhcmUgcHV0Ci0JCQkJICogYmVmb3JlIHRoZXkgYXJlIHRyYW5zZmVycmVkIHRvIHRoZSBFU1AgY2hpcAotCQkJCSAqIHZpYSBQSU8uCi0JCQkJICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkbWFfY2xlYXIoc3RydWN0IE5DUl9FU1AgKmVzcCkKLXsKLQlzdHJ1Y3QgZmFzdGxhbmVfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPQotCQkoc3RydWN0IGZhc3RsYW5lX2RtYV9yZWdpc3RlcnMgKikgKGVzcC0+ZHJlZ3MpOwotCXVuc2lnbmVkIGxvbmcgKnQ7Ci0KLQljdHJsX2RhdGEgPSAoY3RybF9kYXRhICYgRkFTVExBTkVfRE1BX01BU0spOwotCWRyZWdzLT5jdHJsX3JlZyA9IGN0cmxfZGF0YTsKLQotCXQgPSAodW5zaWduZWQgbG9uZyAqKShlc3AtPmVkZXYpOwotCi0JZHJlZ3MtPmNsZWFyX3N0cm9iZSA9IDA7Ci0JKnQgPSAwIDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERldGVjdGlvbiAqLwotaW50IF9faW5pdCBmYXN0bGFuZV9lc3BfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQpCi17Ci0Jc3RydWN0IE5DUl9FU1AgKmVzcDsKLQlzdHJ1Y3Qgem9ycm9fZGV2ICp6ID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGFkZHJlc3M7Ci0KLQlpZiAoKHogPSB6b3Jyb19maW5kX2RldmljZShaT1JST19QUk9EX1BIQVNFNV9CTElaWkFSRF8xMjMwX0lJX0ZBU1RMQU5FX1ozX0NZQkVSU0NTSV9DWUJFUlNUT1JNMDYwLCB6KSkpIHsKLQkgICAgdW5zaWduZWQgbG9uZyBib2FyZCA9IHotPnJlc291cmNlLnN0YXJ0OwotCSAgICBpZiAocmVxdWVzdF9tZW1fcmVnaW9uKGJvYXJkK0ZBU1RMQU5FX0VTUF9BRERSLAotCQkJCSAgIHNpemVvZihzdHJ1Y3QgRVNQX3JlZ3MpLCAiTkNSNTNDOXgiKSkgewotCQkvKiBDaGVjayBpZiB0aGlzIGlzIHJlYWxseSBhIGZhc3RsYW5lIGNvbnRyb2xsZXIuIFRoZSBwcm9ibGVtCi0JCSAqIGlzIHRoYXQgYWxzbyB0aGUgY3liZXJzdG9ybSBhbmQgYmxpenphcmQgY29udHJvbGxlcnMgdXNlCi0JCSAqIHRoaXMgSUQgdmFsdWUuIEZvcnR1bmF0ZWx5IG9ubHkgRmFzdGxhbmUgbWFwcyBpbiBaMyBzcGFjZQotCQkgKi8KLQkJaWYgKGJvYXJkIDwgMHgxMDAwMDAwKSB7Ci0JCQlnb3RvIGVycl9yZWxlYXNlOwotCQl9Ci0JCWVzcCA9IGVzcF9hbGxvY2F0ZSh0cG50LCAodm9pZCAqKWJvYXJkICsgRkFTVExBTkVfRVNQX0FERFIsIDApOwotCi0JCS8qIERvIGNvbW1hbmQgdHJhbnNmZXIgd2l0aCBwcm9ncmFtbWVkIEkvTyAqLwotCQllc3AtPmRvX3Bpb19jbWRzID0gMTsKLQotCQkvKiBSZXF1aXJlZCBmdW5jdGlvbnMgKi8KLQkJZXNwLT5kbWFfYnl0ZXNfc2VudCA9ICZkbWFfYnl0ZXNfc2VudDsKLQkJZXNwLT5kbWFfY2FuX3RyYW5zZmVyID0gJmRtYV9jYW5fdHJhbnNmZXI7Ci0JCWVzcC0+ZG1hX2R1bXBfc3RhdGUgPSAmZG1hX2R1bXBfc3RhdGU7Ci0JCWVzcC0+ZG1hX2luaXRfcmVhZCA9ICZkbWFfaW5pdF9yZWFkOwotCQllc3AtPmRtYV9pbml0X3dyaXRlID0gJmRtYV9pbml0X3dyaXRlOwotCQllc3AtPmRtYV9pbnRzX29mZiA9ICZkbWFfaW50c19vZmY7Ci0JCWVzcC0+ZG1hX2ludHNfb24gPSAmZG1hX2ludHNfb247Ci0JCWVzcC0+ZG1hX2lycV9wID0gJmRtYV9pcnFfcDsKLQkJZXNwLT5kbWFfcG9ydHNfcCA9ICZkbWFfcG9ydHNfcDsKLQkJZXNwLT5kbWFfc2V0dXAgPSAmZG1hX3NldHVwOwotCi0JCS8qIE9wdGlvbmFsIGZ1bmN0aW9ucyAqLwotCQllc3AtPmRtYV9iYXJyaWVyID0gMDsKLQkJZXNwLT5kbWFfZHJhaW4gPSAwOwotCQllc3AtPmRtYV9pbnZhbGlkYXRlID0gMDsKLQkJZXNwLT5kbWFfaXJxX2VudHJ5ID0gMDsKLQkJZXNwLT5kbWFfaXJxX2V4aXQgPSAmZG1hX2lycV9leGl0OwotCQllc3AtPmRtYV9sZWRfb24gPSAmZG1hX2xlZF9vbjsKLQkJZXNwLT5kbWFfbGVkX29mZiA9ICZkbWFfbGVkX29mZjsKLQkJZXNwLT5kbWFfcG9sbCA9IDA7Ci0JCWVzcC0+ZG1hX3Jlc2V0ID0gMDsKLQotCQkvKiBJbml0aWFsaXplIHRoZSBwb3J0Qml0cyAoZW5hYmxlIElSUXMpICovCi0JCWN0cmxfZGF0YSA9IChGQVNUTEFORV9ETUFfRkNPREUgfAotI2lmbmRlZiBOT0RNQUlSUQotCQkJICAgICBGQVNUTEFORV9ETUFfRURJIHwKLSNlbmRpZgotCQkJICAgICBGQVNUTEFORV9ETUFfRVNJKTsKLQkJCQotCi0JCS8qIFNDU0kgY2hpcCBjbG9jayAqLwotCQllc3AtPmNmcmVxID0gNDAwMDAwMDA7Ci0KLQotCQkvKiBNYXAgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UgaW50byB2aXJ0dWFsIGtlcm5lbCBzcGFjZSAqLwotCQlhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpCi0JCQl6X2lvcmVtYXAoYm9hcmQsIHotPnJlc291cmNlLmVuZC1ib2FyZCsxKTsKLQotCQlpZighYWRkcmVzcyl7Ci0JCQlwcmludGsoIkNvdWxkIG5vdCByZW1hcCBGYXN0bGFuZSBjb250cm9sbGVyIG1lbW9yeSEiKTsKLQkJCWdvdG8gZXJyX3VucmVnaXN0ZXI7Ci0JCX0KLQotCi0JCS8qIFRoZSBETUEgcmVnaXN0ZXJzIG9uIHRoZSBGYXN0bGFuZSBhcmUgbWFwcGVkCi0JCSAqIHJlbGF0aXZlIHRvIHRoZSBkZXZpY2UgKGkuZS4gaW4gdGhlIHNhbWUgWm9ycm8KLQkJICogSS9PIGJsb2NrKS4KLQkJICovCi0JCWVzcC0+ZHJlZ3MgPSAodm9pZCAqKShhZGRyZXNzICsgRkFTVExBTkVfRE1BX0FERFIpOwotCi0JCS8qIEVTUCByZWdpc3RlciBiYXNlICovCi0JCWVzcC0+ZXJlZ3MgPSAoc3RydWN0IEVTUF9yZWdzICopKGFkZHJlc3MgKyBGQVNUTEFORV9FU1BfQUREUik7Ci0KLQkJLyogQm9hcmQgYmFzZSAqLwotCQllc3AtPmVkZXYgPSAodm9pZCAqKSBhZGRyZXNzOwotCQkKLQkJLyogU2V0IHRoZSBjb21tYW5kIGJ1ZmZlciAqLwotCQllc3AtPmVzcF9jb21tYW5kID0gY21kX2J1ZmZlcjsKLQkJZXNwLT5lc3BfY29tbWFuZF9kdm1hID0gdmlydF90b19idXMoKHZvaWQgKiljbWRfYnVmZmVyKTsKLQotCQllc3AtPmlycSA9IElSUV9BTUlHQV9QT1JUUzsKLQkJZXNwLT5zbG90ID0gYm9hcmQrRkFTVExBTkVfRVNQX0FERFI7Ci0JCWlmIChyZXF1ZXN0X2lycShJUlFfQU1JR0FfUE9SVFMsIGVzcF9pbnRyLCBJUlFGX1NIQVJFRCwKLQkJCQkiRmFzdGxhbmUgU0NTSSIsIGVzcC0+ZWhvc3QpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJGYXN0bGFuZTogQ291bGQgbm90IGdldCBJUlElZCwgYWJvcnRpbmcuXG4iLCBJUlFfQU1JR0FfUE9SVFMpOwotCQkJZ290byBlcnJfdW5tYXA7Ci0JCX0JCQkKLQotCQkvKiBDb250cm9sbGVyIElEICovCi0JCWVzcC0+c2NzaV9pZCA9IDc7Ci0JCQotCQkvKiBXZSBkb24ndCBoYXZlIGEgZGlmZmVyZW50aWFsIFNDU0ktYnVzLiAqLwotCQllc3AtPmRpZmYgPSAwOwotCi0JCWRtYV9jbGVhcihlc3ApOwotCQllc3BfaW5pdGlhbGl6ZShlc3ApOwotCi0JCXByaW50aygiRVNQOiBUb3RhbCBvZiAlZCBFU1AgaG9zdHMgZm91bmQsICVkIGFjdHVhbGx5IGluIHVzZS5cbiIsIG5lc3BzLCBlc3BzX2luX3VzZSk7Ci0JCWVzcHNfcnVubmluZyA9IGVzcHNfaW5fdXNlOwotCQlyZXR1cm4gZXNwc19pbl91c2U7Ci0JICAgIH0KLQl9Ci0JcmV0dXJuIDA7Ci0KLSBlcnJfdW5tYXA6Ci0Jel9pb3VubWFwKCh2b2lkICopYWRkcmVzcyk7Ci0gZXJyX3VucmVnaXN0ZXI6Ci0Jc2NzaV91bnJlZ2lzdGVyIChlc3AtPmVob3N0KTsKLSBlcnJfcmVsZWFzZToKLQlyZWxlYXNlX21lbV9yZWdpb24oei0+cmVzb3VyY2Uuc3RhcnQrRkFTVExBTkVfRVNQX0FERFIsCi0JCQkgICBzaXplb2Yoc3RydWN0IEVTUF9yZWdzKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRE1BIEZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBkbWFfYnl0ZXNfc2VudChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBpbnQgZmlmb19jb3VudCkKLXsKLQkvKiBTaW5jZSB0aGUgRmFzdGxhbmUgRE1BIGlzIGZ1bGx5IGRlZGljYXRlZCB0byB0aGUgRVNQIGNoaXAsCi0JICogdGhlIG51bWJlciBvZiBieXRlcyBzZW50ICh0byB0aGUgRVNQIGNoaXApIGVxdWFscyB0aGUgbnVtYmVyCi0JICogb2YgYnl0ZXMgaW4gdGhlIEZJRk8gLSB0aGVyZSBpcyBubyBidWZmZXJpbmcgaW4gdGhlIERNQSBjb250cm9sbGVyLgotCSAqIFhYWFggRG8gSSByZWFkIHRoaXMgcmlnaHQ/IEl0IGlzIGZyb20gaG9zdCB0byBFU1AsIHJpZ2h0PwotCSAqLwotCXJldHVybiBmaWZvX2NvdW50OwotfQotCi1zdGF0aWMgaW50IGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCkKLXsKLQl1bnNpZ25lZCBsb25nIHN6ID0gc3AtPlNDcC50aGlzX3Jlc2lkdWFsOwotCWlmKHN6ID4gMHhmZmZjKQotCQlzeiA9IDB4ZmZmYzsKLQlyZXR1cm4gc3o7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci0JRVNQTE9HKCgiZXNwJWQ6IGRtYSAtLSBjb25kX3JlZzwlMDJ4PlxuIiwKLQkJZXNwLT5lc3BfaWQsICgoc3RydWN0IGZhc3RsYW5lX2RtYV9yZWdpc3RlcnMgKikKLQkJCSAgICAgIChlc3AtPmRyZWdzKSktPmNvbmRfcmVnKSk7Ci0JRVNQTE9HKCgiaW50cmVxOjwlMDR4PiwgaW50ZW5hOjwlMDR4PlxuIiwKLQkJYW1pZ2FfY3VzdG9tLmludHJlcXIsIGFtaWdhX2N1c3RvbS5pbnRlbmFyKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgZmFzdGxhbmVfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPSAKLQkJKHN0cnVjdCBmYXN0bGFuZV9kbWFfcmVnaXN0ZXJzICopIChlc3AtPmRyZWdzKTsKLQl1bnNpZ25lZCBsb25nICp0OwotCQotCWNhY2hlX2NsZWFyKGFkZHIsIGxlbmd0aCk7Ci0KLQlkbWFfY2xlYXIoZXNwKTsKLQotCXQgPSAodW5zaWduZWQgbG9uZyAqKSgoYWRkciAmIDB4MDBmZmZmZmYpICsgZXNwLT5lZGV2KTsKLQotCWRyZWdzLT5jbGVhcl9zdHJvYmUgPSAwOwotCSp0ID0gYWRkcjsKLQotCWN0cmxfZGF0YSA9IChjdHJsX2RhdGEgJiBGQVNUTEFORV9ETUFfTUFTSykgfCBGQVNUTEFORV9ETUFfRU5BQkxFOwotCWRyZWdzLT5jdHJsX3JlZyA9IGN0cmxfZGF0YTsKLX0KLQotc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgZmFzdGxhbmVfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPSAKLQkJKHN0cnVjdCBmYXN0bGFuZV9kbWFfcmVnaXN0ZXJzICopIChlc3AtPmRyZWdzKTsKLQl1bnNpZ25lZCBsb25nICp0OwotCi0JY2FjaGVfcHVzaChhZGRyLCBsZW5ndGgpOwotCi0JZG1hX2NsZWFyKGVzcCk7Ci0KLQl0ID0gKHVuc2lnbmVkIGxvbmcgKikoKGFkZHIgJiAweDAwZmZmZmZmKSArIChlc3AtPmVkZXYpKTsKLQotCWRyZWdzLT5jbGVhcl9zdHJvYmUgPSAwOwotCSp0ID0gYWRkcjsKLQotCWN0cmxfZGF0YSA9ICgoY3RybF9kYXRhICYgRkFTVExBTkVfRE1BX01BU0spIHwgCi0JCSAgICAgRkFTVExBTkVfRE1BX0VOQUJMRSB8Ci0JCSAgICAgRkFTVExBTkVfRE1BX1dSSVRFKTsKLQlkcmVncy0+Y3RybF9yZWcgPSBjdHJsX2RhdGE7Ci19Ci0KLQotc3RhdGljIHZvaWQgZG1hX2ludHNfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci0JZGlzYWJsZV9pcnEoZXNwLT5pcnEpOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotCWVuYWJsZV9pcnEoZXNwLT5pcnEpOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfaXJxX2V4aXQoc3RydWN0IE5DUl9FU1AgKmVzcCkKLXsKLQlzdHJ1Y3QgZmFzdGxhbmVfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPSAKLQkJKHN0cnVjdCBmYXN0bGFuZV9kbWFfcmVnaXN0ZXJzICopIChlc3AtPmRyZWdzKTsKLQotCWRyZWdzLT5jdHJsX3JlZyA9IGN0cmxfZGF0YSAmIH4oRkFTVExBTkVfRE1BX0VESXxGQVNUTEFORV9ETUFfRVNJKTsKLSNpZmRlZiBfX21jNjgwMDBfXwotCW5vcCgpOwotI2VuZGlmCi0JZHJlZ3MtPmN0cmxfcmVnID0gY3RybF9kYXRhOwotfQotCi1zdGF0aWMgaW50IGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotCXN0cnVjdCBmYXN0bGFuZV9kbWFfcmVnaXN0ZXJzICpkcmVncyA9IAotCQkoc3RydWN0IGZhc3RsYW5lX2RtYV9yZWdpc3RlcnMgKikgKGVzcC0+ZHJlZ3MpOwotCXVuc2lnbmVkIGNoYXIgZG1hX3N0YXR1czsKLQotCWRtYV9zdGF0dXMgPSBkcmVncy0+Y29uZF9yZWc7Ci0KLQlpZihkbWFfc3RhdHVzICYgRkFTVExBTkVfRE1BX0lBQ1QpCi0JCXJldHVybiAwOwkvKiBub3Qgb3VyIElSUSAqLwotCi0JLyogUmV0dXJuIG5vbi16ZXJvIGlmIEVTUCByZXF1ZXN0ZWQgSVJRICovCi0JcmV0dXJuICgKLSNpZm5kZWYgTk9ETUFJUlEKLQkgICAoZG1hX3N0YXR1cyAmIEZBU1RMQU5FX0RNQV9DUkVRKSAmJgotI2VuZGlmCi0JICAgKCEoZG1hX3N0YXR1cyAmIEZBU1RMQU5FX0RNQV9NSU5UKSkgJiYKLQkgICAoZXNwX3JlYWQoKChzdHJ1Y3QgRVNQX3JlZ3MgKikgKGVzcC0+ZXJlZ3MpKS0+ZXNwX3N0YXR1cykgJiBFU1BfU1RBVF9JTlRSKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9sZWRfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci0JY3RybF9kYXRhICY9IH5GQVNUTEFORV9ETUFfTEVEOwotCSgoc3RydWN0IGZhc3RsYW5lX2RtYV9yZWdpc3RlcnMgKikoZXNwLT5kcmVncykpLT5jdHJsX3JlZyA9IGN0cmxfZGF0YTsKLX0KLQotc3RhdGljIHZvaWQgZG1hX2xlZF9vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotCWN0cmxfZGF0YSB8PSBGQVNUTEFORV9ETUFfTEVEOwotCSgoc3RydWN0IGZhc3RsYW5lX2RtYV9yZWdpc3RlcnMgKikoZXNwLT5kcmVncykpLT5jdHJsX3JlZyA9IGN0cmxfZGF0YTsKLX0KLQotc3RhdGljIGludCBkbWFfcG9ydHNfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotCXJldHVybiAoKGFtaWdhX2N1c3RvbS5pbnRlbmFyKSAmIElGX1BPUlRTKTsKLX0KLQotc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKQotewotCS8qIE9uIHRoZSBTcGFyYywgRE1BX1NUX1dSSVRFIG1lYW5zICJtb3ZlIGRhdGEgZnJvbSBkZXZpY2UgdG8gbWVtb3J5IgotCSAqIHNvIHdoZW4gKHdyaXRlKSBpcyB0cnVlLCBpdCBhY3R1YWxseSBtZWFucyBSRUFEIQotCSAqLwotCWlmKHdyaXRlKXsKLQkJZG1hX2luaXRfcmVhZChlc3AsIGFkZHIsIGNvdW50KTsKLQl9IGVsc2UgewotCQlkbWFfaW5pdF93cml0ZShlc3AsIGFkZHIsIGNvdW50KTsKLQl9Ci19Ci0KLSNkZWZpbmUgSE9TVFNfQwotCi1pbnQgZmFzdGxhbmVfZXNwX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCi17Ci0jaWZkZWYgTU9EVUxFCi0JdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpKChzdHJ1Y3QgTkNSX0VTUCAqKWluc3RhbmNlLT5ob3N0ZGF0YSktPmVkZXY7Ci0JZXNwX2RlYWxsb2NhdGUoKHN0cnVjdCBOQ1JfRVNQICopaW5zdGFuY2UtPmhvc3RkYXRhKTsKLQllc3BfcmVsZWFzZSgpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihhZGRyZXNzLCBzaXplb2Yoc3RydWN0IEVTUF9yZWdzKSk7Ci0JZnJlZV9pcnEoSVJRX0FNSUdBX1BPUlRTLCBlc3BfaW50cik7Ci0jZW5kaWYKLQlyZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7Ci0JLnByb2NfbmFtZQkJPSAiZXNwLWZhc3RsYW5lIiwKLQkucHJvY19pbmZvCQk9IGVzcF9wcm9jX2luZm8sCi0JLm5hbWUJCQk9ICJGYXN0bGFuZSBTQ1NJIiwKLQkuZGV0ZWN0CQkJPSBmYXN0bGFuZV9lc3BfZGV0ZWN0LAotCS5zbGF2ZV9hbGxvYwkJPSBlc3Bfc2xhdmVfYWxsb2MsCi0JLnNsYXZlX2Rlc3Ryb3kJCT0gZXNwX3NsYXZlX2Rlc3Ryb3ksCi0JLnJlbGVhc2UJCT0gZmFzdGxhbmVfZXNwX3JlbGVhc2UsCi0JLnF1ZXVlY29tbWFuZAkJPSBlc3BfcXVldWUsCi0JLmVoX2Fib3J0X2hhbmRsZXIJPSBlc3BfYWJvcnQsCi0JLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gZXNwX3Jlc2V0LAotCS5jYW5fcXVldWUJCT0gNywKLQkudGhpc19pZAkJPSA3LAotCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAotCS5jbWRfcGVyX2x1bgkJPSAxLAotCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORwotfTsKLQotI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCi0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYyBiL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYwppbmRleCBiNmY5OWRmLi44YTE3ODY3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lzY3NpX3RjcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9pc2NzaV90Y3AuYwpAQCAtNjI5LDggKzYyOSw5IEBACiAJaW50IHJjOwogCiAJaWYgKHRjcF9jb25uLT5pbi5kYXRhbGVuKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaXNjc2lfdGNwOiBpbnZhbGlkIFIydCB3aXRoIGRhdGFsZW4gJWRcbiIsCi0JCSAgICAgICB0Y3BfY29ubi0+aW4uZGF0YWxlbik7CisJCWlzY3NpX2Nvbm5fcHJpbnRrKEtFUk5fRVJSLCBjb25uLAorCQkJCSAgImludmFsaWQgUjJ0IHdpdGggZGF0YWxlbiAlZFxuIiwKKwkJCQkgIHRjcF9jb25uLT5pbi5kYXRhbGVuKTsKIAkJcmV0dXJuIElTQ1NJX0VSUl9EQVRBTEVOOwogCX0KIApAQCAtNjQ0LDggKzY0NSw5IEBACiAJaXNjc2lfdXBkYXRlX2NtZHNuKHNlc3Npb24sIChzdHJ1Y3QgaXNjc2lfbm9waW4qKXJoZHIpOwogCiAJaWYgKCFjdGFzay0+c2MgfHwgc2Vzc2lvbi0+c3RhdGUgIT0gSVNDU0lfU1RBVEVfTE9HR0VEX0lOKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImlzY3NpX3RjcDogZHJvcHBpbmcgUjJUIGl0dCAlZCBpbiAiCi0JCSAgICAgICAicmVjb3ZlcnkuLi5cbiIsIGN0YXNrLT5pdHQpOworCQlpc2NzaV9jb25uX3ByaW50ayhLRVJOX0lORk8sIGNvbm4sCisJCQkJICAiZHJvcHBpbmcgUjJUIGl0dCAlZCBpbiByZWNvdmVyeS5cbiIsCisJCQkJICBjdGFzay0+aXR0KTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC02NTUsNyArNjU3LDggQEAKIAlyMnQtPmV4cF9zdGF0c24gPSByaGRyLT5zdGF0c247CiAJcjJ0LT5kYXRhX2xlbmd0aCA9IGJlMzJfdG9fY3B1KHJoZHItPmRhdGFfbGVuZ3RoKTsKIAlpZiAocjJ0LT5kYXRhX2xlbmd0aCA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaXNjc2lfdGNwOiBpbnZhbGlkIFIyVCB3aXRoIHplcm8gZGF0YSBsZW5cbiIpOworCQlpc2NzaV9jb25uX3ByaW50ayhLRVJOX0VSUiwgY29ubiwKKwkJCQkgICJpbnZhbGlkIFIyVCB3aXRoIHplcm8gZGF0YSBsZW5cbiIpOwogCQlfX2tmaWZvX3B1dCh0Y3BfY3Rhc2stPnIydHBvb2wucXVldWUsICh2b2lkKikmcjJ0LAogCQkJICAgIHNpemVvZih2b2lkKikpOwogCQlyZXR1cm4gSVNDU0lfRVJSX0RBVEFMRU47CkBAIC02NjgsOSArNjcxLDEwIEBACiAKIAlyMnQtPmRhdGFfb2Zmc2V0ID0gYmUzMl90b19jcHUocmhkci0+ZGF0YV9vZmZzZXQpOwogCWlmIChyMnQtPmRhdGFfb2Zmc2V0ICsgcjJ0LT5kYXRhX2xlbmd0aCA+IHNjc2lfYnVmZmxlbihjdGFzay0+c2MpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaXNjc2lfdGNwOiBpbnZhbGlkIFIyVCB3aXRoIGRhdGEgbGVuICV1IGF0ICIKLQkJICAgICAgICJvZmZzZXQgJXUgYW5kIHRvdGFsIGxlbmd0aCAlZFxuIiwgcjJ0LT5kYXRhX2xlbmd0aCwKLQkJICAgICAgIHIydC0+ZGF0YV9vZmZzZXQsIHNjc2lfYnVmZmxlbihjdGFzay0+c2MpKTsKKwkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sCisJCQkJICAiaW52YWxpZCBSMlQgd2l0aCBkYXRhIGxlbiAldSBhdCBvZmZzZXQgJXUgIgorCQkJCSAgImFuZCB0b3RhbCBsZW5ndGggJWRcbiIsIHIydC0+ZGF0YV9sZW5ndGgsCisJCQkJICByMnQtPmRhdGFfb2Zmc2V0LCBzY3NpX2J1ZmZsZW4oY3Rhc2stPnNjKSk7CiAJCV9fa2ZpZm9fcHV0KHRjcF9jdGFzay0+cjJ0cG9vbC5xdWV1ZSwgKHZvaWQqKSZyMnQsCiAJCQkgICAgc2l6ZW9mKHZvaWQqKSk7CiAJCXJldHVybiBJU0NTSV9FUlJfREFUQUxFTjsKQEAgLTczNiw4ICs3NDAsOSBAQAogCS8qIHZlcmlmeSBQRFUgbGVuZ3RoICovCiAJdGNwX2Nvbm4tPmluLmRhdGFsZW4gPSBudG9oMjQoaGRyLT5kbGVuZ3RoKTsKIAlpZiAodGNwX2Nvbm4tPmluLmRhdGFsZW4gPiBjb25uLT5tYXhfcmVjdl9kbGVuZ3RoKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaXNjc2lfdGNwOiBkYXRhbGVuICVkID4gJWRcbiIsCi0JCSAgICAgICB0Y3BfY29ubi0+aW4uZGF0YWxlbiwgY29ubi0+bWF4X3JlY3ZfZGxlbmd0aCk7CisJCWlzY3NpX2Nvbm5fcHJpbnRrKEtFUk5fRVJSLCBjb25uLAorCQkJCSAgImlzY3NpX3RjcDogZGF0YWxlbiAlZCA+ICVkXG4iLAorCQkJCSAgdGNwX2Nvbm4tPmluLmRhdGFsZW4sIGNvbm4tPm1heF9yZWN2X2RsZW5ndGgpOwogCQlyZXR1cm4gSVNDU0lfRVJSX0RBVEFMRU47CiAJfQogCkBAIC04MTksMTAgKzgyNCwxMiBAQAogCQkgKiBGb3Igbm93IHdlIGZhaWwgdW50aWwgd2UgZmluZCBhIHZlbmRvciB0aGF0IG5lZWRzIGl0CiAJCSAqLwogCQlpZiAoSVNDU0lfREVGX01BWF9SRUNWX1NFR19MRU4gPCB0Y3BfY29ubi0+aW4uZGF0YWxlbikgewotCQkJcHJpbnRrKEtFUk5fRVJSICJpc2NzaV90Y3A6IHJlY2VpdmVkIGJ1ZmZlciBvZiBsZW4gJXUgIgotCQkJICAgICAgImJ1dCBjb25uIGJ1ZmZlciBpcyBvbmx5ICV1IChvcGNvZGUgJTB4KVxuIiwKLQkJCSAgICAgIHRjcF9jb25uLT5pbi5kYXRhbGVuLAotCQkJICAgICAgSVNDU0lfREVGX01BWF9SRUNWX1NFR19MRU4sIG9wY29kZSk7CisJCQlpc2NzaV9jb25uX3ByaW50ayhLRVJOX0VSUiwgY29ubiwKKwkJCQkJICAiaXNjc2lfdGNwOiByZWNlaXZlZCBidWZmZXIgb2YgIgorCQkJCQkgICJsZW4gJXUgYnV0IGNvbm4gYnVmZmVyIGlzIG9ubHkgJXUgIgorCQkJCQkgICIob3Bjb2RlICUweClcbiIsCisJCQkJCSAgdGNwX2Nvbm4tPmluLmRhdGFsZW4sCisJCQkJCSAgSVNDU0lfREVGX01BWF9SRUNWX1NFR19MRU4sIG9wY29kZSk7CiAJCQlyYyA9IElTQ1NJX0VSUl9QUk9UTzsKIAkJCWJyZWFrOwogCQl9CkBAIC0xNDk2LDMwICsxNTAzLDI1IEBACiAJdGNwX2Nvbm4tPnR4X2hhc2gudGZtID0gY3J5cHRvX2FsbG9jX2hhc2goImNyYzMyYyIsIDAsCiAJCQkJCQkgIENSWVBUT19BTEdfQVNZTkMpOwogCXRjcF9jb25uLT50eF9oYXNoLmZsYWdzID0gMDsKLQlpZiAoSVNfRVJSKHRjcF9jb25uLT50eF9oYXNoLnRmbSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgY3JlYXRlIGNvbm5lY3Rpb24gZHVlIHRvIGNyYzMyYyAiCi0JCSAgICAgICAibG9hZGluZyBlcnJvciAlbGQuIE1ha2Ugc3VyZSB0aGUgY3JjMzJjIG1vZHVsZSBpcyAiCi0JCSAgICAgICAiYnVpbHQgYXMgYSBtb2R1bGUgb3IgaW50byB0aGUga2VybmVsXG4iLAotCQkJUFRSX0VSUih0Y3BfY29ubi0+dHhfaGFzaC50Zm0pKTsKKwlpZiAoSVNfRVJSKHRjcF9jb25uLT50eF9oYXNoLnRmbSkpCiAJCWdvdG8gZnJlZV90Y3BfY29ubjsKLQl9CiAKIAl0Y3BfY29ubi0+cnhfaGFzaC50Zm0gPSBjcnlwdG9fYWxsb2NfaGFzaCgiY3JjMzJjIiwgMCwKIAkJCQkJCSAgQ1JZUFRPX0FMR19BU1lOQyk7CiAJdGNwX2Nvbm4tPnJ4X2hhc2guZmxhZ3MgPSAwOwotCWlmIChJU19FUlIodGNwX2Nvbm4tPnJ4X2hhc2gudGZtKSkgewotCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBjcmVhdGUgY29ubmVjdGlvbiBkdWUgdG8gY3JjMzJjICIKLQkJICAgICAgICJsb2FkaW5nIGVycm9yICVsZC4gTWFrZSBzdXJlIHRoZSBjcmMzMmMgbW9kdWxlIGlzICIKLQkJICAgICAgICJidWlsdCBhcyBhIG1vZHVsZSBvciBpbnRvIHRoZSBrZXJuZWxcbiIsCi0JCQlQVFJfRVJSKHRjcF9jb25uLT5yeF9oYXNoLnRmbSkpOworCWlmIChJU19FUlIodGNwX2Nvbm4tPnJ4X2hhc2gudGZtKSkKIAkJZ290byBmcmVlX3R4X3RmbTsKLQl9CiAKIAlyZXR1cm4gY2xzX2Nvbm47CiAKIGZyZWVfdHhfdGZtOgogCWNyeXB0b19mcmVlX2hhc2godGNwX2Nvbm4tPnR4X2hhc2gudGZtKTsKIGZyZWVfdGNwX2Nvbm46CisJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sCisJCQkgICJDb3VsZCBub3QgY3JlYXRlIGNvbm5lY3Rpb24gZHVlIHRvIGNyYzMyYyAiCisJCQkgICJsb2FkaW5nIGVycm9yLiBNYWtlIHN1cmUgdGhlIGNyYzMyYyAiCisJCQkgICJtb2R1bGUgaXMgYnVpbHQgYXMgYSBtb2R1bGUgb3IgaW50byB0aGUgIgorCQkJICAia2VybmVsXG4iKTsKIAlrZnJlZSh0Y3BfY29ubik7CiB0Y3BfY29ubl9hbGxvY19mYWlsOgogCWlzY3NpX2Nvbm5fdGVhcmRvd24oY2xzX2Nvbm4pOwpAQCAtMTYyNyw3ICsxNjI5LDggQEAKIAkvKiBsb29rdXAgZm9yIGV4aXN0aW5nIHNvY2tldCAqLwogCXNvY2sgPSBzb2NrZmRfbG9va3VwKChpbnQpdHJhbnNwb3J0X2VwaCwgJmVycik7CiAJaWYgKCFzb2NrKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaXNjc2lfdGNwOiBzb2NrZmRfbG9va3VwIGZhaWxlZCAlZFxuIiwgZXJyKTsKKwkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sCisJCQkJICAic29ja2ZkX2xvb2t1cCBmYWlsZWQgJWRcbiIsIGVycik7CiAJCXJldHVybiAtRUVYSVNUOwogCX0KIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmlzY3NpLmMgYi9kcml2ZXJzL3Njc2kvbGliaXNjc2kuYwppbmRleCA1NTMxNjhhLi41OWY4NDQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliaXNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvbGliaXNjc2kuYwpAQCAtMTYwLDcgKzE2MCw3IEBACiAJaGRyLT5vcGNvZGUgPSBJU0NTSV9PUF9TQ1NJX0NNRDsKIAloZHItPmZsYWdzID0gSVNDU0lfQVRUUl9TSU1QTEU7CiAJaW50X3RvX3Njc2lsdW4oc2MtPmRldmljZS0+bHVuLCAoc3RydWN0IHNjc2lfbHVuICopaGRyLT5sdW4pOwotCWhkci0+aXR0ID0gYnVpbGRfaXR0KGN0YXNrLT5pdHQsIGNvbm4tPmlkLCBzZXNzaW9uLT5hZ2UpOworCWhkci0+aXR0ID0gYnVpbGRfaXR0KGN0YXNrLT5pdHQsIHNlc3Npb24tPmFnZSk7CiAJaGRyLT5kYXRhX2xlbmd0aCA9IGNwdV90b19iZTMyKHNjc2lfYnVmZmxlbihzYykpOwogCWhkci0+Y21kc24gPSBjcHVfdG9fYmUzMihzZXNzaW9uLT5jbWRzbik7CiAJc2Vzc2lvbi0+Y21kc24rKzsKQEAgLTQxNiw4ICs0MTYsOSBAQAogCiAJCWlmIChkYXRhbGVuIDwgMikgewogaW52YWxpZF9kYXRhbGVuOgotCQkJcHJpbnRrKEtFUk5fRVJSICJpc2NzaTogR290IENIRUNLX0NPTkRJVElPTiBidXQgIgotCQkJICAgICAgICJpbnZhbGlkIGRhdGEgYnVmZmVyIHNpemUgb2YgJWRcbiIsIGRhdGFsZW4pOworCQkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsICBjb25uLAorCQkJCQkgIkdvdCBDSEVDS19DT05ESVRJT04gYnV0IGludmFsaWQgZGF0YSAiCisJCQkJCSAiYnVmZmVyIHNpemUgb2YgJWRcbiIsIGRhdGFsZW4pOwogCQkJc2MtPnJlc3VsdCA9IERJRF9CQURfVEFSR0VUIDw8IDE2OwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTQ5NCw3ICs0OTUsNyBAQAogCiAJbXRhc2sgPSBfX2lzY3NpX2Nvbm5fc2VuZF9wZHUoY29ubiwgKHN0cnVjdCBpc2NzaV9oZHIgKikmaGRyLCBOVUxMLCAwKTsKIAlpZiAoIW10YXNrKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IHNlbmQgbm9wb3V0XG4iKTsKKwkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sICJDb3VsZCBub3Qgc2VuZCBub3BvdXRcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC01MjIsOSArNTIzLDEwIEBACiAJCWlmIChudG9oMjQocmVqZWN0LT5kbGVuZ3RoKSA+PSBzaXplb2Yoc3RydWN0IGlzY3NpX2hkcikpIHsKIAkJCW1lbWNweSgmcmVqZWN0ZWRfcGR1LCBkYXRhLCBzaXplb2Yoc3RydWN0IGlzY3NpX2hkcikpOwogCQkJaXR0ID0gZ2V0X2l0dChyZWplY3RlZF9wZHUuaXR0KTsKLQkJCXByaW50ayhLRVJOX0VSUiAiaXR0IDB4JXggaGFkIHBkdSAob3AgMHgleCkgcmVqZWN0ZWQgIgotCQkJCSJkdWUgdG8gRGF0YURpZ2VzdCBlcnJvci5cbiIsIGl0dCwKLQkJCQlyZWplY3RlZF9wZHUub3Bjb2RlKTsKKwkJCWlzY3NpX2Nvbm5fcHJpbnRrKEtFUk5fRVJSLCBjb25uLAorCQkJCQkgICJpdHQgMHgleCBoYWQgcGR1IChvcCAweCV4KSByZWplY3RlZCAiCisJCQkJCSAgImR1ZSB0byBEYXRhRGlnZXN0IGVycm9yLlxuIiwgaXR0LAorCQkJCQkgIHJlamVjdGVkX3BkdS5vcGNvZGUpOwogCQl9CiAJfQogCXJldHVybiAwOwpAQCAtNTQxLDggKzU0Myw4IEBACiAgKiBxdWV1ZWNvbW1hbmQgb3Igc2VuZCBnZW5lcmljLiBzZXNzaW9uIGxvY2sgbXVzdCBiZSBoZWxkIGFuZCB2ZXJpZnkKICAqIGl0dCBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCiAgKi8KLWludCBfX2lzY3NpX2NvbXBsZXRlX3BkdShzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgc3RydWN0IGlzY3NpX2hkciAqaGRyLAotCQkJIGNoYXIgKmRhdGEsIGludCBkYXRhbGVuKQorc3RhdGljIGludCBfX2lzY3NpX2NvbXBsZXRlX3BkdShzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgc3RydWN0IGlzY3NpX2hkciAqaGRyLAorCQkJCWNoYXIgKmRhdGEsIGludCBkYXRhbGVuKQogewogCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gY29ubi0+c2Vzc2lvbjsKIAlpbnQgb3Bjb2RlID0gaGRyLT5vcGNvZGUgJiBJU0NTSV9PUENPREVfTUFTSywgcmMgPSAwOwpAQCAtNjcyLDcgKzY3NCw2IEBACiAKIAlyZXR1cm4gcmM7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChfX2lzY3NpX2NvbXBsZXRlX3BkdSk7CiAKIGludCBpc2NzaV9jb21wbGV0ZV9wZHUoc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sIHN0cnVjdCBpc2NzaV9oZHIgKmhkciwKIAkJICAgICAgIGNoYXIgKmRhdGEsIGludCBkYXRhbGVuKQpAQCAtNjk3LDE4ICs2OTgsMTMgQEAKIAlpZiAoaGRyLT5pdHQgIT0gUkVTRVJWRURfSVRUKSB7CiAJCWlmICgoKF9fZm9yY2UgdTMyKWhkci0+aXR0ICYgSVNDU0lfQUdFX01BU0spICE9CiAJCSAgICAoc2Vzc2lvbi0+YWdlIDw8IElTQ1NJX0FHRV9TSElGVCkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiaXNjc2k6IHJlY2VpdmVkIGl0dCAleCBleHBlY3RlZCAiCi0JCQkJInNlc3Npb24gYWdlICgleClcbiIsIChfX2ZvcmNlIHUzMiloZHItPml0dCwKLQkJCQlzZXNzaW9uLT5hZ2UgJiBJU0NTSV9BR0VfTUFTSyk7CisJCQlpc2NzaV9jb25uX3ByaW50ayhLRVJOX0VSUiwgY29ubiwKKwkJCQkJICAicmVjZWl2ZWQgaXR0ICV4IGV4cGVjdGVkIHNlc3Npb24gIgorCQkJCQkgICJhZ2UgKCV4KVxuIiwgKF9fZm9yY2UgdTMyKWhkci0+aXR0LAorCQkJCQkgIHNlc3Npb24tPmFnZSAmIElTQ1NJX0FHRV9NQVNLKTsKIAkJCXJldHVybiBJU0NTSV9FUlJfQkFEX0lUVDsKIAkJfQogCi0JCWlmICgoKF9fZm9yY2UgdTMyKWhkci0+aXR0ICYgSVNDU0lfQ0lEX01BU0spICE9Ci0JCSAgICAoY29ubi0+aWQgPDwgSVNDU0lfQ0lEX1NISUZUKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJpc2NzaTogcmVjZWl2ZWQgaXR0ICV4LCBleHBlY3RlZCAiCi0JCQkJIkNJRCAoJXgpXG4iLCAoX19mb3JjZSB1MzIpaGRyLT5pdHQsIGNvbm4tPmlkKTsKLQkJCXJldHVybiBJU0NTSV9FUlJfQkFEX0lUVDsKLQkJfQogCQlpdHQgPSBnZXRfaXR0KGhkci0+aXR0KTsKIAl9IGVsc2UKIAkJaXR0ID0gfjBVOwpAQCAtNzE3LDE2ICs3MTMsMTcgQEAKIAkJY3Rhc2sgPSBzZXNzaW9uLT5jbWRzW2l0dF07CiAKIAkJaWYgKCFjdGFzay0+c2MpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gImlzY3NpOiBkcm9wcGluZyBjdGFzayB3aXRoICIKLQkJCSAgICAgICAiaXR0IDB4JXhcbiIsIGN0YXNrLT5pdHQpOworCQkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9JTkZPLCBjb25uLCAiZHJvcHBpbmcgY3Rhc2sgIgorCQkJCQkgICJ3aXRoIGl0dCAweCV4XG4iLCBjdGFzay0+aXR0KTsKIAkJCS8qIGZvcmNlIGRyb3AgKi8KIAkJCXJldHVybiBJU0NTSV9FUlJfTk9fU0NTSV9DTUQ7CiAJCX0KIAogCQlpZiAoY3Rhc2stPnNjLT5TQ3AucGhhc2UgIT0gc2Vzc2lvbi0+YWdlKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImlzY3NpOiBjdGFzaydzIHNlc3Npb24gYWdlICVkLCAiCi0JCQkJImV4cGVjdGVkICVkXG4iLCBjdGFzay0+c2MtPlNDcC5waGFzZSwKLQkJCQlzZXNzaW9uLT5hZ2UpOworCQkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sCisJCQkJCSAgImlzY3NpOiBjdGFzaydzIHNlc3Npb24gYWdlICVkLCAiCisJCQkJCSAgImV4cGVjdGVkICVkXG4iLCBjdGFzay0+c2MtPlNDcC5waGFzZSwKKwkJCQkJICBzZXNzaW9uLT5hZ2UpOwogCQkJcmV0dXJuIElTQ1NJX0VSUl9TRVNTSU9OX0ZBSUxFRDsKIAkJfQogCX0KQEAgLTc3MSw3ICs3NjgsNyBAQAogCSAqLwogCW5vcC0+Y21kc24gPSBjcHVfdG9fYmUzMihzZXNzaW9uLT5jbWRzbik7CiAJaWYgKGhkci0+aXR0ICE9IFJFU0VSVkVEX0lUVCkgewotCQloZHItPml0dCA9IGJ1aWxkX2l0dChtdGFzay0+aXR0LCBjb25uLT5pZCwgc2Vzc2lvbi0+YWdlKTsKKwkJaGRyLT5pdHQgPSBidWlsZF9pdHQobXRhc2stPml0dCwgc2Vzc2lvbi0+YWdlKTsKIAkJLyoKIAkJICogVE9ETzogV2UgYWx3YXlzIHVzZSBpbW1lZGlhdGUsIHNvIHdlIG5ldmVyIGhpdCB0aGlzLgogCQkgKiBJZiB3ZSBzdGFydCB0byBzZW5kIHRtZnMgb3Igbm9wcyBhcyBub24taW1tZWRpYXRlIHRoZW4KQEAgLTk5Nyw2ICs5OTQsNyBAQAogCUZBSUxVUkVfU0VTU0lPTl9JTl9SRUNPVkVSWSwKIAlGQUlMVVJFX1NFU1NJT05fUkVDT1ZFUllfVElNRU9VVCwKIAlGQUlMVVJFX1NFU1NJT05fTE9HR0lOR19PVVQsCisJRkFJTFVSRV9TRVNTSU9OX05PVF9SRUFEWSwKIH07CiAKIGludCBpc2NzaV9xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqc2MsIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQpAQCAtMTAxNyw2ICsxMDE1LDEyIEBACiAJc2Vzc2lvbiA9IGlzY3NpX2hvc3RkYXRhKGhvc3QtPmhvc3RkYXRhKTsKIAlzcGluX2xvY2soJnNlc3Npb24tPmxvY2spOwogCisJcmVhc29uID0gaXNjc2lfc2Vzc2lvbl9jaGtyZWFkeShzZXNzaW9uX3RvX2NscyhzZXNzaW9uKSk7CisJaWYgKHJlYXNvbikgeworCQlzYy0+cmVzdWx0ID0gcmVhc29uOworCQlnb3RvIGZhdWx0OworCX0KKwogCS8qCiAJICogSVNDU0lfU1RBVEVfRkFJTEVEIGlzIGEgdGVtcC4gc3RhdGUuIFRoZSByZWNvdmVyeQogCSAqIGNvZGUgd2lsbCBkZWNpZGUgd2hhdCBpcyBiZXN0IHRvIGRvIHdpdGggY29tbWFuZCBxdWV1ZWQKQEAgLTEwMzMsMTggKzEwMzcsMjMgQEAKIAkJc3dpdGNoIChzZXNzaW9uLT5zdGF0ZSkgewogCQljYXNlIElTQ1NJX1NUQVRFX0lOX1JFQ09WRVJZOgogCQkJcmVhc29uID0gRkFJTFVSRV9TRVNTSU9OX0lOX1JFQ09WRVJZOwotCQkJZ290byByZWplY3Q7CisJCQlzYy0+cmVzdWx0ID0gRElEX0lNTV9SRVRSWSA8PCAxNjsKKwkJCWJyZWFrOwogCQljYXNlIElTQ1NJX1NUQVRFX0xPR0dJTkdfT1VUOgogCQkJcmVhc29uID0gRkFJTFVSRV9TRVNTSU9OX0xPR0dJTkdfT1VUOwotCQkJZ290byByZWplY3Q7CisJCQlzYy0+cmVzdWx0ID0gRElEX0lNTV9SRVRSWSA8PCAxNjsKKwkJCWJyZWFrOwogCQljYXNlIElTQ1NJX1NUQVRFX1JFQ09WRVJZX0ZBSUxFRDoKIAkJCXJlYXNvbiA9IEZBSUxVUkVfU0VTU0lPTl9SRUNPVkVSWV9USU1FT1VUOworCQkJc2MtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OwogCQkJYnJlYWs7CiAJCWNhc2UgSVNDU0lfU1RBVEVfVEVSTUlOQVRFOgogCQkJcmVhc29uID0gRkFJTFVSRV9TRVNTSU9OX1RFUk1JTkFURTsKKwkJCXNjLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcmVhc29uID0gRkFJTFVSRV9TRVNTSU9OX0ZSRUVEOworCQkJc2MtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OwogCQl9CiAJCWdvdG8gZmF1bHQ7CiAJfQpAQCAtMTA1Miw2ICsxMDYxLDcgQEAKIAljb25uID0gc2Vzc2lvbi0+bGVhZGNvbm47CiAJaWYgKCFjb25uKSB7CiAJCXJlYXNvbiA9IEZBSUxVUkVfU0VTU0lPTl9GUkVFRDsKKwkJc2MtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OwogCQlnb3RvIGZhdWx0OwogCX0KIApAQCAtMTA5MSw5ICsxMTAxLDcgQEAKIAogZmF1bHQ6CiAJc3Bpbl91bmxvY2soJnNlc3Npb24tPmxvY2spOwotCXByaW50ayhLRVJOX0VSUiAiaXNjc2k6IGNtZCAweCV4IGlzIG5vdCBxdWV1ZWQgKCVkKVxuIiwKLQkgICAgICAgc2MtPmNtbmRbMF0sIHJlYXNvbik7Ci0Jc2MtPnJlc3VsdCA9IChESURfTk9fQ09OTkVDVCA8PCAxNik7CisJZGVidWdfc2NzaSgiaXNjc2k6IGNtZCAweCV4IGlzIG5vdCBxdWV1ZWQgKCVkKVxuIiwgc2MtPmNtbmRbMF0sIHJlYXNvbik7CiAJc2NzaV9zZXRfcmVzaWQoc2MsIHNjc2lfYnVmZmxlbihzYykpOwogCXNjLT5zY3NpX2RvbmUoc2MpOwogCXNwaW5fbG9jayhob3N0LT5ob3N0X2xvY2spOwpAQCAtMTE2MCw3ICsxMTY4LDggQEAKIAltdXRleF9sb2NrKCZzZXNzaW9uLT5laF9tdXRleCk7CiAJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKIAlpZiAoc2Vzc2lvbi0+c3RhdGUgPT0gSVNDU0lfU1RBVEVfTE9HR0VEX0lOKQotCQlwcmludGsoS0VSTl9JTkZPICJpc2NzaTogaG9zdCByZXNldCBzdWNjZWVkZWRcbiIpOworCQlpc2NzaV9zZXNzaW9uX3ByaW50ayhLRVJOX0lORk8sIHNlc3Npb24sCisJCQkJICAgICAiaG9zdCByZXNldCBzdWNjZWVkZWRcbiIpOwogCWVsc2UKIAkJZ290byBmYWlsZWQ7CiAJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmxvY2spOwpAQCAtMTIzOSw3ICsxMjQ4LDggQEAKICAqIEZhaWwgY29tbWFuZHMuIHNlc3Npb24gbG9jayBoZWxkIGFuZCByZWN2IHNpZGUgc3VzcGVuZGVkIGFuZCB4bWl0CiAgKiB0aHJlYWQgZmx1c2hlZAogICovCi1zdGF0aWMgdm9pZCBmYWlsX2FsbF9jb21tYW5kcyhzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgdW5zaWduZWQgbHVuKQorc3RhdGljIHZvaWQgZmFpbF9hbGxfY29tbWFuZHMoc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4sIHVuc2lnbmVkIGx1biwKKwkJCSAgICAgIGludCBlcnJvcikKIHsKIAlzdHJ1Y3QgaXNjc2lfY21kX3Rhc2sgKmN0YXNrLCAqdG1wOwogCkBAIC0xMjUxLDcgKzEyNjEsNyBAQAogCQlpZiAobHVuID09IGN0YXNrLT5zYy0+ZGV2aWNlLT5sdW4gfHwgbHVuID09IC0xKSB7CiAJCQlkZWJ1Z19zY3NpKCJmYWlsaW5nIHBlbmRpbmcgc2MgJXAgaXR0IDB4JXhcbiIsCiAJCQkJICAgY3Rhc2stPnNjLCBjdGFzay0+aXR0KTsKLQkJCWZhaWxfY29tbWFuZChjb25uLCBjdGFzaywgRElEX0JVU19CVVNZIDw8IDE2KTsKKwkJCWZhaWxfY29tbWFuZChjb25uLCBjdGFzaywgZXJyb3IgPDwgMTYpOwogCQl9CiAJfQogCkBAIC0xMjU5LDcgKzEyNjksNyBAQAogCQlpZiAobHVuID09IGN0YXNrLT5zYy0+ZGV2aWNlLT5sdW4gfHwgbHVuID09IC0xKSB7CiAJCQlkZWJ1Z19zY3NpKCJmYWlsaW5nIHJlcXVldWVkIHNjICVwIGl0dCAweCV4XG4iLAogCQkJCSAgIGN0YXNrLT5zYywgY3Rhc2stPml0dCk7Ci0JCQlmYWlsX2NvbW1hbmQoY29ubiwgY3Rhc2ssIERJRF9CVVNfQlVTWSA8PCAxNik7CisJCQlmYWlsX2NvbW1hbmQoY29ubiwgY3Rhc2ssIGVycm9yIDw8IDE2KTsKIAkJfQogCX0KIApAQCAtMTM1NywxMCArMTM2NywxMCBAQAogCWxhc3RfcmVjdiA9IGNvbm4tPmxhc3RfcmVjdjsKIAlpZiAodGltZV9iZWZvcmVfZXEobGFzdF9yZWN2ICsgdGltZW91dCArIChjb25uLT5waW5nX3RpbWVvdXQgKiBIWiksCiAJCQkgICBqaWZmaWVzKSkgewotCQlwcmludGsoS0VSTl9FUlIgInBpbmcgdGltZW91dCBvZiAlZCBzZWNzIGV4cGlyZWQsICIKLQkJICAgICAgICJsYXN0IHJ4ICVsdSwgbGFzdCBwaW5nICVsdSwgbm93ICVsdVxuIiwKLQkJICAgICAgIGNvbm4tPnBpbmdfdGltZW91dCwgbGFzdF9yZWN2LAotCQkgICAgICAgY29ubi0+bGFzdF9waW5nLCBqaWZmaWVzKTsKKwkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sICJwaW5nIHRpbWVvdXQgb2YgJWQgc2VjcyAiCisJCQkJICAiZXhwaXJlZCwgbGFzdCByeCAlbHUsIGxhc3QgcGluZyAlbHUsICIKKwkJCQkgICJub3cgJWx1XG4iLCBjb25uLT5waW5nX3RpbWVvdXQsIGxhc3RfcmVjdiwKKwkJCQkgIGNvbm4tPmxhc3RfcGluZywgamlmZmllcyk7CiAJCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKIAkJaXNjc2lfY29ubl9mYWlsdXJlKGNvbm4sIElTQ1NJX0VSUl9DT05OX0ZBSUxFRCk7CiAJCXJldHVybjsKQEAgLTEzNzMsMTQgKzEzODMsMTEgQEAKIAkJCWlzY3NpX3NlbmRfbm9wb3V0KGNvbm4sIE5VTEwpOwogCQl9CiAJCW5leHRfdGltZW91dCA9IGxhc3RfcmVjdiArIHRpbWVvdXQgKyAoY29ubi0+cGluZ190aW1lb3V0ICogSFopOwotCX0gZWxzZSB7CisJfSBlbHNlCiAJCW5leHRfdGltZW91dCA9IGxhc3RfcmVjdiArIHRpbWVvdXQ7Ci0JfQogCi0JaWYgKG5leHRfdGltZW91dCkgewotCQlkZWJ1Z19zY3NpKCJTZXR0aW5nIG5leHQgdG1vICVsdVxuIiwgbmV4dF90aW1lb3V0KTsKLQkJbW9kX3RpbWVyKCZjb25uLT50cmFuc3BvcnRfdGltZXIsIG5leHRfdGltZW91dCk7Ci0JfQorCWRlYnVnX3Njc2koIlNldHRpbmcgbmV4dCB0bW8gJWx1XG4iLCBuZXh0X3RpbWVvdXQpOworCW1vZF90aW1lcigmY29ubi0+dHJhbnNwb3J0X3RpbWVyLCBuZXh0X3RpbWVvdXQpOwogZG9uZToKIAlzcGluX3VubG9jaygmc2Vzc2lvbi0+bG9jayk7CiB9CkBAIC0xNTczLDcgKzE1ODAsNyBAQAogCS8qIG5lZWQgdG8gZ3JhYiB0aGUgcmVjdiBsb2NrIHRoZW4gc2Vzc2lvbiBsb2NrICovCiAJd3JpdGVfbG9ja19iaChjb25uLT5yZWN2X2xvY2spOwogCXNwaW5fbG9jaygmc2Vzc2lvbi0+bG9jayk7Ci0JZmFpbF9hbGxfY29tbWFuZHMoY29ubiwgc2MtPmRldmljZS0+bHVuKTsKKwlmYWlsX2FsbF9jb21tYW5kcyhjb25uLCBzYy0+ZGV2aWNlLT5sdW4sIERJRF9FUlJPUik7CiAJY29ubi0+dG1mX3N0YXRlID0gVE1GX0lOSVRJQUw7CiAJc3Bpbl91bmxvY2soJnNlc3Npb24tPmxvY2spOwogCXdyaXRlX3VubG9ja19iaChjb25uLT5yZWN2X2xvY2spOwpAQCAtMTk0NCw5ICsxOTUxLDEwIEBACiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShzZXNzaW9uLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAkJbXNsZWVwX2ludGVycnVwdGlibGUoNTAwKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaXNjc2k6IHNjc2kgY29ubl9kZXN0cm95KCk6IGhvc3RfYnVzeSAlZCAiCi0JCSAgICAgICAiaG9zdF9mYWlsZWQgJWRcbiIsIHNlc3Npb24tPmhvc3QtPmhvc3RfYnVzeSwKLQkJICAgICAgIHNlc3Npb24tPmhvc3QtPmhvc3RfZmFpbGVkKTsKKwkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9JTkZPLCBjb25uLCAiaXNjc2kgY29ubl9kZXN0cm95KCk6ICIKKwkJCQkgICJob3N0X2J1c3kgJWQgaG9zdF9mYWlsZWQgJWRcbiIsCisJCQkJICBzZXNzaW9uLT5ob3N0LT5ob3N0X2J1c3ksCisJCQkJICBzZXNzaW9uLT5ob3N0LT5ob3N0X2ZhaWxlZCk7CiAJCS8qCiAJCSAqIGZvcmNlIGVoX2Fib3J0KCkgdG8gdW5ibG9jawogCQkgKi8KQEAgLTE5NzUsMjcgKzE5ODMsMjggQEAKIAlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2Vzc2lvbiA9IGNvbm4tPnNlc3Npb247CiAKIAlpZiAoIXNlc3Npb24pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpc2NzaTogY2FuJ3Qgc3RhcnQgdW5ib3VuZCBjb25uZWN0aW9uXG4iKTsKKwkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sCisJCQkJICAiY2FuJ3Qgc3RhcnQgdW5ib3VuZCBjb25uZWN0aW9uXG4iKTsKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CiAKIAlpZiAoKHNlc3Npb24tPmltbV9kYXRhX2VuIHx8ICFzZXNzaW9uLT5pbml0aWFsX3IydF9lbikgJiYKIAkgICAgIHNlc3Npb24tPmZpcnN0X2J1cnN0ID4gc2Vzc2lvbi0+bWF4X2J1cnN0KSB7Ci0JCXByaW50aygiaXNjc2k6IGludmFsaWQgYnVyc3QgbGVuZ3RoczogIgotCQkgICAgICAgImZpcnN0X2J1cnN0ICVkIG1heF9idXJzdCAlZFxuIiwKLQkJICAgICAgIHNlc3Npb24tPmZpcnN0X2J1cnN0LCBzZXNzaW9uLT5tYXhfYnVyc3QpOworCQlpc2NzaV9jb25uX3ByaW50ayhLRVJOX0lORk8sIGNvbm4sICJpbnZhbGlkIGJ1cnN0IGxlbmd0aHM6ICIKKwkJCQkgICJmaXJzdF9idXJzdCAlZCBtYXhfYnVyc3QgJWRcbiIsCisJCQkJICBzZXNzaW9uLT5maXJzdF9idXJzdCwgc2Vzc2lvbi0+bWF4X2J1cnN0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGNvbm4tPnBpbmdfdGltZW91dCAmJiAhY29ubi0+cmVjdl90aW1lb3V0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaXNjc2k6IGludmFsaWQgcmVjdiB0aW1lb3V0IG9mIHplcm8gIgotCQkgICAgICAiVXNpbmcgNSBzZWNvbmRzXG4uIik7CisJCWlzY3NpX2Nvbm5fcHJpbnRrKEtFUk5fRVJSLCBjb25uLCAiaW52YWxpZCByZWN2IHRpbWVvdXQgb2YgIgorCQkJCSAgInplcm8uIFVzaW5nIDUgc2Vjb25kc1xuLiIpOwogCQljb25uLT5yZWN2X3RpbWVvdXQgPSA1OwogCX0KIAogCWlmIChjb25uLT5yZWN2X3RpbWVvdXQgJiYgIWNvbm4tPnBpbmdfdGltZW91dCkgewotCQlwcmludGsoS0VSTl9FUlIgImlzY3NpOiBpbnZhbGlkIHBpbmcgdGltZW91dCBvZiB6ZXJvICIKLQkJICAgICAgIlVzaW5nIDUgc2Vjb25kcy5cbiIpOworCQlpc2NzaV9jb25uX3ByaW50ayhLRVJOX0VSUiwgY29ubiwgImludmFsaWQgcGluZyB0aW1lb3V0IG9mICIKKwkJCQkgICJ6ZXJvLiBVc2luZyA1IHNlY29uZHMuXG4iKTsKIAkJY29ubi0+cGluZ190aW1lb3V0ID0gNTsKIAl9CiAKQEAgLTIwMTksMTEgKzIwMjgsOSBAQAogCQljb25uLT5zdG9wX3N0YWdlID0gMDsKIAkJY29ubi0+dG1mX3N0YXRlID0gVE1GX0lOSVRJQUw7CiAJCXNlc3Npb24tPmFnZSsrOwotCQlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7Ci0KLQkJaXNjc2lfdW5ibG9ja19zZXNzaW9uKHNlc3Npb25fdG9fY2xzKHNlc3Npb24pKTsKLQkJd2FrZV91cCgmY29ubi0+ZWh3YWl0KTsKLQkJcmV0dXJuIDA7CisJCWlmIChzZXNzaW9uLT5hZ2UgPT0gMTYpCisJCQlzZXNzaW9uLT5hZ2UgPSAwOworCQlicmVhazsKIAljYXNlIFNUT1BfQ09OTl9URVJNOgogCQljb25uLT5zdG9wX3N0YWdlID0gMDsKIAkJYnJlYWs7CkBAIC0yMDMyLDYgKzIwMzksOCBAQAogCX0KIAlzcGluX3VubG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7CiAKKwlpc2NzaV91bmJsb2NrX3Nlc3Npb24oc2Vzc2lvbl90b19jbHMoc2Vzc2lvbikpOworCXdha2VfdXAoJmNvbm4tPmVod2FpdCk7CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9jb25uX3N0YXJ0KTsKQEAgLTIxMjMsNyArMjEzMiw4IEBACiAJICogZmx1c2ggcXVldWVzLgogCSAqLwogCXNwaW5fbG9ja19iaCgmc2Vzc2lvbi0+bG9jayk7Ci0JZmFpbF9hbGxfY29tbWFuZHMoY29ubiwgLTEpOworCWZhaWxfYWxsX2NvbW1hbmRzKGNvbm4sIC0xLAorCQkJU1RPUF9DT05OX1JFQ09WRVIgPyBESURfQlVTX0JVU1kgOiBESURfRVJST1IpOwogCWZsdXNoX2NvbnRyb2xfcXVldWVzKHNlc3Npb24sIGNvbm4pOwogCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5sb2NrKTsKIAltdXRleF91bmxvY2soJnNlc3Npb24tPmVoX211dGV4KTsKQEAgLTIxNDAsNyArMjE1MCw4IEBACiAJCWlzY3NpX3N0YXJ0X3Nlc3Npb25fcmVjb3Zlcnkoc2Vzc2lvbiwgY29ubiwgZmxhZyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAiaXNjc2k6IGludmFsaWQgc3RvcCBmbGFnICVkXG4iLCBmbGFnKTsKKwkJaXNjc2lfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sCisJCQkJICAiaW52YWxpZCBzdG9wIGZsYWcgJWRcbiIsIGZsYWcpOwogCX0KIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlzY3NpX2Nvbm5fc3RvcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWFjX2VzcC5jIGIvZHJpdmVycy9zY3NpL21hY19lc3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNiNDkwMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Njc2kvbWFjX2VzcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzUxICswLDAgQEAKLS8qCi0gKiA2OGsgbWFjIDUzYzlbNDZdIHNjc2kgZHJpdmVyCi0gKgotICogY29weXJpZ2h0IChjKSAxOTk4LCBEYXZpZCBXZWlzIHdlaXNkMzQ1OEB1bmkuZWR1Ci0gKgotICogZGVidWdnaW5nIG9uIFF1YWRyYSA4MDAgYW5kIDY2MEFWIE1pY2hhZWwgU2NobWl0eiwgRGF2ZSBLaWx6ZXIgNy85OAotICoKLSAqIGJhc2VkIGxvb3NlbHkgb24gY3liZXJfZXNwLmMKLSAqLwotCi0vKiB0aGVzZSBhcmUgdW51c2VkIGZvciBub3cgKi8KLSNkZWZpbmUgbXlyZWFkbChhZGRyKSAoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKGFkZHIpKQotI2RlZmluZSBteXdyaXRlbChiLCBhZGRyKSAoKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIChhZGRyKSkgPSAoYikpCi0KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLQotI2luY2x1ZGUgInNjc2kuaCIKLSNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgotI2luY2x1ZGUgIk5DUjUzQzl4LmgiCi0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vbWFjaW50cy5oPgotI2luY2x1ZGUgPGFzbS9tYWNody5oPgotI2luY2x1ZGUgPGFzbS9tYWNfdmlhLmg+Ci0KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2ludG9zaC5oPgotCi0vKiAjZGVmaW5lIERFQlVHX01BQ19FU1AgKi8KLQotZXh0ZXJuIHZvaWQgZXNwX2hhbmRsZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLWV4dGVybiB2b2lkIG1hY19lc3BfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwotCi1zdGF0aWMgaW50ICBkbWFfYnl0ZXNfc2VudChzdHJ1Y3QgTkNSX0VTUCAqIGVzcCwgaW50IGZpZm9fY291bnQpOwotc3RhdGljIGludCAgZG1hX2Nhbl90cmFuc2ZlcihzdHJ1Y3QgTkNSX0VTUCAqIGVzcCwgU2NzaV9DbW5kICpzcCk7Ci1zdGF0aWMgdm9pZCBkbWFfZHVtcF9zdGF0ZShzdHJ1Y3QgTkNSX0VTUCAqIGVzcCk7Ci1zdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICogZXNwLCBjaGFyICogdmFkZHJlc3MsIGludCBsZW5ndGgpOwotc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKiBlc3AsIGNoYXIgKiB2YWRkcmVzcywgaW50IGxlbmd0aCk7Ci1zdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKiBlc3ApOwotc3RhdGljIHZvaWQgZG1hX2ludHNfb24oc3RydWN0IE5DUl9FU1AgKiBlc3ApOwotc3RhdGljIGludCAgZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICogZXNwKTsKLXN0YXRpYyBpbnQgIGRtYV9pcnFfcF9xdWljayhzdHJ1Y3QgTkNSX0VTUCAqIGVzcCk7Ci1zdGF0aWMgdm9pZCBkbWFfbGVkX29mZihzdHJ1Y3QgTkNSX0VTUCAqIGVzcCk7Ci1zdGF0aWMgdm9pZCBkbWFfbGVkX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApOwotc3RhdGljIGludCAgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCk7Ci1zdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKiBlc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKTsKLXN0YXRpYyB2b2lkIGRtYV9zZXR1cF9xdWljayhzdHJ1Y3QgTkNSX0VTUCAqIGVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpOwotCi1zdGF0aWMgaW50IGVzcF9kYWZiX2RtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqIGVzcGRldik7Ci1zdGF0aWMgaW50IGVzcF9pb3NiX2RtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqIGVzcGRldik7Ci0KLXN0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGNtZF9idWZmZXJbMTZdOwotCQkJCS8qIFRoaXMgaXMgd2hlcmUgYWxsIGNvbW1hbmRzIGFyZSBwdXQKLQkJCQkgKiBiZWZvcmUgdGhleSBhcmUgdHJhbnNmZXJyZWQgdG8gdGhlIEVTUCBjaGlwCi0JCQkJICogdmlhIFBJTy4KLQkJCQkgKi8KLQotc3RhdGljIGludCBlc3BfaW5pdGlhbGl6ZWQgPSAwOwotCi1zdGF0aWMgaW50IHNldHVwX251bV9lc3BzID0gLTE7Ci1zdGF0aWMgaW50IHNldHVwX2Rpc2Nvbm5lY3QgPSAtMTsKLXN0YXRpYyBpbnQgc2V0dXBfbm9zeW5jID0gLTE7Ci1zdGF0aWMgaW50IHNldHVwX2Nhbl9xdWV1ZSA9IC0xOwotc3RhdGljIGludCBzZXR1cF9jbWRfcGVyX2x1biA9IC0xOwotc3RhdGljIGludCBzZXR1cF9zZ190YWJsZXNpemUgPSAtMTsKLSNpZmRlZiBTVVBQT1JUX1RBR1MKLXN0YXRpYyBpbnQgc2V0dXBfdXNlX3RhZ2dlZF9xdWV1aW5nID0gLTE7Ci0jZW5kaWYKLXN0YXRpYyBpbnQgc2V0dXBfaG9zdGlkID0gLTE7Ci0KLS8qCi0gKiBFeHBlcmltZW50YWwgRVNQIGludGhhbmRsZXI7IGNoZWNrIG1hY2ludHMuYyB0byBtYWtlIHN1cmUgZGV2X2lkIGlzIAotICogc2V0IHVwIHByb3Blcmx5IQotICovCi0KLXZvaWQgbWFjX2VzcF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgTkNSX0VTUCAqZXNwID0gKHN0cnVjdCBOQ1JfRVNQICopIGRldl9pZDsKLQlpbnQgaXJxX3AgPSAwOwotCi0JLyogSGFuZGxlIHRoZSBvbmUgRVNQIGludGVycnVwdCBzaG93aW5nIGF0IHRoaXMgSVJRIGxldmVsLiAqLwotCWlmKCgoZXNwKS0+aXJxICYgMHhmZikgPT0gaXJxKSB7Ci0JLyoKLQkgKiBEZWJ1ZyAuLgotCSAqLwotCQlpcnFfcCA9IGVzcC0+ZG1hX2lycV9wKGVzcCk7Ci0JIAlwcmludGsoIm1hY19lc3A6IGlycV9wICV4IGN1cnJlbnQgJXAgZGlzY29ubmVjdGVkICVwXG4iLAotCSAJCWlycV9wLCBlc3AtPmN1cnJlbnRfU0MsIGVzcC0+ZGlzY29ubmVjdGVkX1NDKTsKLQkgCQkKLQkJLyoKLQkJICogTWFjOiBpZiB3ZSdyZSBoZXJlLCBpdCdzIGFuIEVTUCBpbnRlcnJ1cHQgZm9yIHN1cmUhCi0JCSAqLwotCQlpZigoZXNwLT5jdXJyZW50X1NDIHx8IGVzcC0+ZGlzY29ubmVjdGVkX1NDKSkgewotCQkJZXNwLT5kbWFfaW50c19vZmYoZXNwKTsKLQotCQkJRVNQSVJRKCgiSSVkKCIsIGVzcC0+ZXNwX2lkKSk7Ci0JCQllc3BfaGFuZGxlKGVzcCk7Ci0JCQlFU1BJUlEoKCIpIikpOwotCi0JCQllc3AtPmRtYV9pbnRzX29uKGVzcCk7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBEZWJ1ZyBob29rczsgdXNlIGZvciBwbGF5aW5nIHdpdGggdGhlIGludGVycnVwdCBmbGFnIHRlc3RpbmcgYW5kIGludGVycnVwdAotICogYWNrbm93bGVkZ2Ugb24gdGhlIHZhcmlvdXMgbWFjaGluZXMKLSAqLwotCi12b2lkIHNjc2lfZXNwX3BvbGxlZChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0JaWYgKGVzcF9pbml0aWFsaXplZCA9PSAwKQotCQlyZXR1cm47Ci0KLQltYWNfZXNwX2ludHIoaXJxLCBkZXZfaWQpOwotfQotCi12b2lkIGZha2VfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0jaWZkZWYgREVCVUdfTUFDX0VTUAotCXByaW50aygibWFjX2VzcDogZ290IGlycVxuIik7Ci0jZW5kaWYKLQotCW1hY19lc3BfaW50cihpcnEsIGRldl9pZCk7Ci19Ci0KLWlycXJldHVybl90IGZha2VfZHJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlwcmludGsoIm1hY19lc3A6IGdvdCBkcnFcbiIpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotI2RlZmluZSBEUklWRVJfU0VUVVAKLQotLyoKLSAqIEZ1bmN0aW9uIDogbWFjX2VzcF9zZXR1cChjaGFyICpzdHIpCi0gKgotICogUHVycG9zZSA6IGJvb3RlciBjb21tYW5kIGxpbmUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG92ZXJyaWRlcyBhcnJheSwKLSAqCi0gKiBJbnB1dHMgOiBzdHIgLSBwYXJhbWV0ZXJzLCBzZXBhcmF0ZWQgYnkgY29tbWFzLgotICoKLSAqIEN1cnJlbnRseSB1bnVzZWQgaW4gdGhlIG5ldyBkcml2ZXI7IG5lZWQgdG8gYWRkIHNldHRhYmxlIHBhcmFtZXRlcnMgdG8gdGhlIAotICogZGV0ZWN0IGZ1bmN0aW9uLgotICoKLSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBtYWNfZXNwX3NldHVwKGNoYXIgKnN0cikgewotI2lmZGVmIERSSVZFUl9TRVRVUAotCS8qIEZvcm1hdCBvZiBtYWM1M2M5eCBwYXJhbWV0ZXIgaXM6Ci0JICogICBtYWM1M2M5eD08bnVtX2VzcHM+LDxkaXNjb25uZWN0Piw8bm9zeW5jPiw8Y2FuX3F1ZXVlPiw8Y21kX3Blcl9sdW4+LDxzZ190YWJsZXNpemU+LDxob3N0aWQ+LDx1c2VfdGFncz4KLQkgKiBOZWdhdGl2ZSB2YWx1ZXMgbWVhbiBkb24ndCBjaGFuZ2UuCi0JICovCi0JCi0JY2hhciAqdGhpc19vcHQ7Ci0JbG9uZyBvcHQ7Ci0KLQl0aGlzX29wdCA9IHN0cnNlcCAoJnN0ciwgIiwiKTsKLQlpZih0aGlzX29wdCkgewotCQlvcHQgPSBzaW1wbGVfc3RydG9sKCB0aGlzX29wdCwgTlVMTCwgMCApOwotCi0JCWlmIChvcHQgPj0gMCAmJiBvcHQgPD0gMikKLQkJCXNldHVwX251bV9lc3BzID0gb3B0OwotCQllbHNlIGlmIChvcHQgPiAyKQotCQkJcHJpbnRrKCAibWFjX2VzcF9zZXR1cDogaW52YWxpZCBudW1iZXIgb2YgaG9zdHMgJWxkICFcbiIsIG9wdCApOwotCi0JCXRoaXNfb3B0ID0gc3Ryc2VwICgmc3RyLCAiLCIpOwotCX0KLQlpZih0aGlzX29wdCkgewotCQlvcHQgPSBzaW1wbGVfc3RydG9sKCB0aGlzX29wdCwgTlVMTCwgMCApOwotCQotCQlpZiAob3B0ID4gMCkKLQkJCXNldHVwX2Rpc2Nvbm5lY3QgPSBvcHQ7Ci0KLQkJdGhpc19vcHQgPSBzdHJzZXAgKCZzdHIsICIsIik7Ci0JfQotCWlmKHRoaXNfb3B0KSB7Ci0JCW9wdCA9IHNpbXBsZV9zdHJ0b2woIHRoaXNfb3B0LCBOVUxMLCAwICk7Ci0KLQkJaWYgKG9wdCA+PSAwKQotCQkJc2V0dXBfbm9zeW5jID0gb3B0OwotCi0JCXRoaXNfb3B0ID0gc3Ryc2VwICgmc3RyLCAiLCIpOwotCX0KLQlpZih0aGlzX29wdCkgewotCQlvcHQgPSBzaW1wbGVfc3RydG9sKCB0aGlzX29wdCwgTlVMTCwgMCApOwotCi0JCWlmIChvcHQgPiAwKQotCQkJc2V0dXBfY2FuX3F1ZXVlID0gb3B0OwotCi0JCXRoaXNfb3B0ID0gc3Ryc2VwICgmc3RyLCAiLCIpOwotCX0KLQlpZih0aGlzX29wdCkgewotCQlvcHQgPSBzaW1wbGVfc3RydG9sKCB0aGlzX29wdCwgTlVMTCwgMCApOwotCi0JCWlmIChvcHQgPiAwKQotCQkJc2V0dXBfY21kX3Blcl9sdW4gPSBvcHQ7Ci0KLQkJdGhpc19vcHQgPSBzdHJzZXAgKCZzdHIsICIsIik7Ci0JfQotCWlmKHRoaXNfb3B0KSB7Ci0JCW9wdCA9IHNpbXBsZV9zdHJ0b2woIHRoaXNfb3B0LCBOVUxMLCAwICk7Ci0KLQkJaWYgKG9wdCA+PSAwKSB7Ci0JCQlzZXR1cF9zZ190YWJsZXNpemUgPSBvcHQ7Ci0JCQkvKiBNdXN0IGJlIDw9IFNHX0FMTCAoMjU1KSAqLwotCQkJaWYgKHNldHVwX3NnX3RhYmxlc2l6ZSA+IFNHX0FMTCkKLQkJCQlzZXR1cF9zZ190YWJsZXNpemUgPSBTR19BTEw7Ci0JCX0KLQotCQl0aGlzX29wdCA9IHN0cnNlcCAoJnN0ciwgIiwiKTsKLQl9Ci0JaWYodGhpc19vcHQpIHsKLQkJb3B0ID0gc2ltcGxlX3N0cnRvbCggdGhpc19vcHQsIE5VTEwsIDAgKTsKLQotCQkvKiBNdXN0IGJlIGJldHdlZW4gMCBhbmQgNyAqLwotCQlpZiAob3B0ID49IDAgJiYgb3B0IDw9IDcpCi0JCQlzZXR1cF9ob3N0aWQgPSBvcHQ7Ci0JCWVsc2UgaWYgKG9wdCA+IDcpCi0JCQlwcmludGsoICJtYWNfZXNwX3NldHVwOiBpbnZhbGlkIGhvc3QgSUQgJWxkICFcbiIsIG9wdCk7Ci0KLQkJdGhpc19vcHQgPSBzdHJzZXAgKCZzdHIsICIsIik7Ci0JfQotI2lmZGVmIFNVUFBPUlRfVEFHUwotCWlmKHRoaXNfb3B0KSB7Ci0JCW9wdCA9IHNpbXBsZV9zdHJ0b2woIHRoaXNfb3B0LCBOVUxMLCAwICk7Ci0JCWlmIChvcHQgPj0gMCkKLQkJCXNldHVwX3VzZV90YWdnZWRfcXVldWluZyA9ICEhb3B0OwotCX0KLSNlbmRpZgotI2VuZGlmCi0JcmV0dXJuIDE7IAotfQotCi1fX3NldHVwKCJtYWM1M2M5eD0iLCBtYWNfZXNwX3NldHVwKTsKLQotCi0vKgotICogRVNQIGFkZHJlc3MgJ2RldGVjdGlvbicKLSAqLwotCi11bnNpZ25lZCBsb25nIGdldF9iYXNlKGludCBjaGlwX251bSkKLXsKLQkvKgotCSAqIHVzaW5nIHRoZSBjaGlwX251bSBhbmQgbWFjIG1vZGVsLCBmaWd1cmUgb3V0IHdoZXJlIHRoZQotCSAqIGNoaXBzIGFyZSBtYXBwZWQKLQkgKi8KLQotCXVuc2lnbmVkIGxvbmcgaW9fYmFzZSA9IDB4NTBmMDAwMDA7Ci0JdW5zaWduZWQgaW50IHNlY29uZF9vZmZzZXQgPSAweDQwMjsKLQl1bnNpZ25lZCBsb25nIHNjc2lfbG9jID0gMDsKLQotCXN3aXRjaCAobWFjaW50b3NoX2NvbmZpZy0+c2NzaV90eXBlKSB7Ci0KLQkvKiA5NTAsIDkwMCwgNzAwICovCi0JY2FzZSBNQUNfU0NTSV9RVUFEUkEyOgotCQlzY3NpX2xvYyA9ICBpb19iYXNlICsgMHhmMDAwICsgKChjaGlwX251bSA9PSAwKSA/IDAgOiBzZWNvbmRfb2Zmc2V0KTsKLQkJYnJlYWs7Ci0KLQkvKiBhdidzICovCi0JY2FzZSBNQUNfU0NTSV9RVUFEUkEzOgotCQlzY3NpX2xvYyA9IGlvX2Jhc2UgKyAweDE4MDAwICsgKChjaGlwX251bSA9PSAwKSA/IDAgOiBzZWNvbmRfb2Zmc2V0KTsKLQkJYnJlYWs7Ci0KLQkvKiBtb3N0IHF1YWRyYS9jZW50cmlzIG1vZGVscyBhcmUgbGlrZSB0aGlzICovCQotCWNhc2UgTUFDX1NDU0lfUVVBRFJBOgotCQlzY3NpX2xvYyA9IGlvX2Jhc2UgKyAweDEwMDAwOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByaW50aygibWFjX2VzcDogZ2V0X2Jhc2U6IGhpdCBkZWZhdWx0IVxuIik7Ci0JCXNjc2lfbG9jID0gaW9fYmFzZSArIDB4MTAwMDA7Ci0JCWJyZWFrOwotCi0JfSAvKiBzd2l0Y2ggKi8KLQotCXByaW50aygibWFjX2VzcDogaW8gYmFzZSBhdCAweCVseFxuIiwgc2NzaV9sb2MpOwotCi0JcmV0dXJuIHNjc2lfbG9jOwotfQotCi0vKgotICogTW9kZWwgZGVwZW5kZW50IEVTUCBzZXR1cAotICovCi0KLWludCBtYWNfZXNwX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICogdHBudCkKLXsKLQlpbnQgcXVpY2sgPSAwOwotCWludCBjaGlwbnVtLCBjaGlwc3ByZXNlbnQgPSAwOwotI2lmIDAKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0jZW5kaWYKLQotCWlmIChlc3BfaW5pdGlhbGl6ZWQgPiAwKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCS8qIHdoYXQgZG8gd2UgaGF2ZSBpbiB0aGlzIG1hY2hpbmUuLi4gKi8KLQlpZiAoTUFDSFdfUFJFU0VOVChNQUNfU0NTSV85NikpIHsKLQkJY2hpcHNwcmVzZW50ICsrOwotCX0KLQotCWlmIChNQUNIV19QUkVTRU5UKE1BQ19TQ1NJXzk2XzIpKSB7Ci0JCWNoaXBzcHJlc2VudCArKzsKLQl9Ci0KLQkvKiBudW1iZXIgb2YgRVNQcyBwcmVzZW50ID8gKi8KLQlpZiAoc2V0dXBfbnVtX2VzcHMgPj0gMCkgewotCSAgaWYgKGNoaXBzcHJlc2VudCA+PSBzZXR1cF9udW1fZXNwcykKLQkgICAgY2hpcHNwcmVzZW50ID0gc2V0dXBfbnVtX2VzcHM7Ci0JICBlbHNlCi0JICAgIHByaW50aygibWFjX2VzcF9kZXRlY3Q6IG51bV9ob3N0cyBkZXRlY3RlZCAlZCBzZXR1cCAlZCBcbiIsCi0JCSAgIGNoaXBzcHJlc2VudCwgc2V0dXBfbnVtX2VzcHMpOwotCX0KLQotCS8qIFRPRE86IGFkZCBkaXNjb25uZWN0IC8gbm9zeW5jIGZsYWdzICovCi0KLQkvKiBzZXR1cCB2YXJpYWJsZXMgKi8KLQl0cG50LT5jYW5fcXVldWUgPQotCSAgKHNldHVwX2Nhbl9xdWV1ZSA+IDApID8gc2V0dXBfY2FuX3F1ZXVlIDogNzsKLQl0cG50LT5jbWRfcGVyX2x1biA9Ci0JICAoc2V0dXBfY21kX3Blcl9sdW4gPiAwKSA/IHNldHVwX2NtZF9wZXJfbHVuIDogMTsKLQl0cG50LT5zZ190YWJsZXNpemUgPSAKLQkgIChzZXR1cF9zZ190YWJsZXNpemUgPj0gMCkgPyBzZXR1cF9zZ190YWJsZXNpemUgOiBTR19BTEw7Ci0KLQlpZiAoc2V0dXBfaG9zdGlkID49IDApCi0JICB0cG50LT50aGlzX2lkID0gc2V0dXBfaG9zdGlkOwotCWVsc2UgewotCSAgLyogdXNlIDcgYXMgZGVmYXVsdCAqLwotCSAgdHBudC0+dGhpc19pZCA9IDc7Ci0JfQotCi0jaWZkZWYgU1VQUE9SVF9UQUdTCi0JaWYgKHNldHVwX3VzZV90YWdnZWRfcXVldWluZyA8IDApCi0JCXNldHVwX3VzZV90YWdnZWRfcXVldWluZyA9IERFRkFVTFRfVVNFX1RBR0dFRF9RVUVVSU5HOwotI2VuZGlmCi0KLQlmb3IgKGNoaXBudW0gPSAwOyBjaGlwbnVtIDwgY2hpcHNwcmVzZW50OyBjaGlwbnVtICsrKSB7Ci0JCXN0cnVjdCBOQ1JfRVNQICogZXNwOwotCi0JCWVzcCA9IGVzcF9hbGxvY2F0ZSh0cG50LCBOVUxMLCAwKTsKLQkJZXNwLT5lcmVncyA9IChzdHJ1Y3QgRVNQX3JlZ3MgKikgZ2V0X2Jhc2UoY2hpcG51bSk7Ci0KLQkJZXNwLT5kbWFfaXJxX3AgPSAmZXNwX2RhZmJfZG1hX2lycV9wOwotCQlpZiAoY2hpcG51bSA9PSAwKSB7Ci0KLQkJCWlmIChtYWNpbnRvc2hfY29uZmlnLT5zY3NpX3R5cGUgPT0gTUFDX1NDU0lfUVVBRFJBKSB7Ci0JCQkJLyogbW9zdCBtYWNoaW5lcyBleGNlcHQgdGhvc2UgYmVsb3cgOi0pICovCi0JCQkJcXVpY2sgPSAxOwotCQkJCWVzcC0+ZG1hX2lycV9wID0gJmVzcF9pb3NiX2RtYV9pcnFfcDsKLQkJCX0gZWxzZSBpZiAobWFjaW50b3NoX2NvbmZpZy0+c2NzaV90eXBlID09IE1BQ19TQ1NJX1FVQURSQTMpIHsKLQkJCQkvKiBtb3N0bHkgYXYncyAqLwotCQkJCXF1aWNrID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogcTk1MCwgOTAwLCA3MDAgKi8KLQkJCQlxdWljayA9IDE7Ci0JCQkJb3V0X2JlMzIoMHhmOTgwMDAyNCwgMHgxZDEpOwotCQkJCWVzcC0+ZHJlZ3MgPSAodm9pZCAqKSAweGY5ODAwMDI0OwotCQkJfQotCi0JCX0gZWxzZSB7IC8qIGNoaXBudW0gKi8KLQotCQkJcXVpY2sgPSAxOwotCQkJb3V0X2JlMzIoMHhmOTgwMDAyOCwgMHgxZDEpOwotCQkJZXNwLT5kcmVncyA9ICh2b2lkICopIDB4Zjk4MDAwMjg7Ci0KLQkJfSAvKiBjaGlwbnVtID09IDAgKi8KLQotCQkvKiB1c2UgcGlvIGZvciBjb21tYW5kIGJ5dGVzOyBwaW8gZm9yIG1lc3NhZ2UvZGF0YTogVEJJICovCi0JCWVzcC0+ZG9fcGlvX2NtZHMgPSAxOwotCi0JCS8qIFNldCB0aGUgY29tbWFuZCBidWZmZXIgKi8KLQkJZXNwLT5lc3BfY29tbWFuZCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKikgY21kX2J1ZmZlcjsKLQkJZXNwLT5lc3BfY29tbWFuZF9kdm1hID0gKF9fdTMyKSBjbWRfYnVmZmVyOwotCi0JCS8qIHZhcmlvdXMgZnVuY3Rpb25zICovCi0JCWVzcC0+ZG1hX2J5dGVzX3NlbnQgPSAmZG1hX2J5dGVzX3NlbnQ7Ci0JCWVzcC0+ZG1hX2Nhbl90cmFuc2ZlciA9ICZkbWFfY2FuX3RyYW5zZmVyOwotCQllc3AtPmRtYV9kdW1wX3N0YXRlID0gJmRtYV9kdW1wX3N0YXRlOwotCQllc3AtPmRtYV9pbml0X3JlYWQgPSBOVUxMOwotCQllc3AtPmRtYV9pbml0X3dyaXRlID0gTlVMTDsKLQkJZXNwLT5kbWFfaW50c19vZmYgPSAmZG1hX2ludHNfb2ZmOwotCQllc3AtPmRtYV9pbnRzX29uID0gJmRtYV9pbnRzX29uOwotCi0JCWVzcC0+ZG1hX3BvcnRzX3AgPSAmZG1hX3BvcnRzX3A7Ci0KLQotCQkvKiBPcHRpb25hbCBmdW5jdGlvbnMgKi8KLQkJZXNwLT5kbWFfYmFycmllciA9IE5VTEw7Ci0JCWVzcC0+ZG1hX2RyYWluID0gTlVMTDsKLQkJZXNwLT5kbWFfaW52YWxpZGF0ZSA9IE5VTEw7Ci0JCWVzcC0+ZG1hX2lycV9lbnRyeSA9IE5VTEw7Ci0JCWVzcC0+ZG1hX2lycV9leGl0ID0gTlVMTDsKLQkJZXNwLT5kbWFfbGVkX29uID0gTlVMTDsKLQkJZXNwLT5kbWFfbGVkX29mZiA9IE5VTEw7Ci0JCWVzcC0+ZG1hX3BvbGwgPSBOVUxMOwotCQllc3AtPmRtYV9yZXNldCA9IE5VTEw7Ci0KLQkJLyogU0NTSSBjaGlwIHNwZWVkICovCi0JCS8qIGJlbG93IGVzcC0+Y2ZyZXEgPSA0MDAwMDAwMDsgKi8KLQotCi0JCWlmIChxdWljaykgewotCQkJLyogJ3F1aWNrJyBtZWFucyB0aGVyZSdzIGhhbmRzaGFrZSBnbHVlIGxvZ2ljIGxpa2UgaW4gdGhlIDUzODAgY2FzZSAqLwotCQkJZXNwLT5kbWFfc2V0dXAgPSAmZG1hX3NldHVwX3F1aWNrOwotCQl9IGVsc2UgewotCQkJZXNwLT5kbWFfc2V0dXAgPSAmZG1hX3NldHVwOwotCQl9Ci0KLQkJaWYgKGNoaXBudW0gPT0gMCkgewotCi0JCQllc3AtPmlycSA9IElSUV9NQUNfU0NTSTsKLQotCQkJcmVxdWVzdF9pcnEoSVJRX01BQ19TQ1NJLCBlc3BfaW50ciwgMCwgIk1hYyBFU1AgU0NTSSIsIGVzcC0+ZWhvc3QpOwotI2lmIDAJLyogY29uZmxpY3RzIHdpdGggSU9QIEFEQiAqLwotCQkJcmVxdWVzdF9pcnEoSVJRX01BQ19TQ1NJRFJRLCBmYWtlX2RycSwgMCwgIk1hYyBFU1AgRFJRIiwgZXNwLT5laG9zdCk7Ci0jZW5kaWYKLQotCQkJaWYgKG1hY2ludG9zaF9jb25maWctPnNjc2lfdHlwZSA9PSBNQUNfU0NTSV9RVUFEUkEpIHsKLQkJCQllc3AtPmNmcmVxID0gMTY1MDAwMDA7Ci0JCQl9IGVsc2UgewotCQkJCWVzcC0+Y2ZyZXEgPSAyNTAwMDAwMDsKLQkJCX0KLQotCi0JCX0gZWxzZSB7IC8qIGNoaXBudW0gPT0gMSAqLwotCi0JCQllc3AtPmlycSA9IElSUV9NQUNfU0NTSURSUTsKLSNpZiAwCS8qIGNvbmZsaWN0cyB3aXRoIElPUCBBREIgKi8KLQkJCXJlcXVlc3RfaXJxKElSUV9NQUNfU0NTSURSUSwgZXNwX2ludHIsIDAsICJNYWMgRVNQIFNDU0kgMiIsIGVzcC0+ZWhvc3QpOwotI2VuZGlmCi0KLQkJCWVzcC0+Y2ZyZXEgPSAyNTAwMDAwMDsKLQotCQl9Ci0KLQkJaWYgKHF1aWNrKSB7Ci0JCQlwcmludGsoImVzcDogdXNpbmcgcXVpY2sgdmVyc2lvblxuIik7Ci0JCX0KLQotCQlwcmludGsoImVzcDogYWRkciBhdCAweCVwXG4iLCBlc3AtPmVyZWdzKTsKLQotCQllc3AtPnNjc2lfaWQgPSA3OwotCQllc3AtPmRpZmYgPSAwOwotCi0JCWVzcF9pbml0aWFsaXplKGVzcCk7Ci0KLQl9IC8qIGZvciBjaGlwbnVtICovCi0KLQlpZiAoY2hpcHNwcmVzZW50KQotCQlwcmludGsoIlxubWFjX2VzcDogJWQgZXNwIGNvbnRyb2xsZXJzIGZvdW5kXG4iLCBjaGlwc3ByZXNlbnQpOwotCi0JZXNwX2luaXRpYWxpemVkID0gY2hpcHNwcmVzZW50OwotCi0JcmV0dXJuIGNoaXBzcHJlc2VudDsKLX0KLQotc3RhdGljIGludCBtYWNfZXNwX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCi17Ci0JaWYgKHNob3N0LT5pcnEpCi0JCWZyZWVfaXJxKHNob3N0LT5pcnEsIE5VTEwpOwotCWlmIChzaG9zdC0+aW9fcG9ydCAmJiBzaG9zdC0+bl9pb19wb3J0KQotCQlyZWxlYXNlX3JlZ2lvbihzaG9zdC0+aW9fcG9ydCwgc2hvc3QtPm5faW9fcG9ydCk7Ci0Jc2NzaV91bnJlZ2lzdGVyKHNob3N0KTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEkndmUgYmVlbiB3b25kZXJpbmcgd2hhdCB0aGlzIGlzIHN1cHBvc2VkIHRvIGRvLCBmb3Igc29tZSB0aW1lLiBUYWxraW5nIAotICogdG8gQWxsZW4gQnJpZ2dzOiBUaGVzZSBtYWNoaW5lcyBoYXZlIGFuIGV4dHJhIHJlZ2lzdGVyIHNvbWVwbGFjZSB3aGVyZSB0aGUKLSAqIERSUSBwaW4gb2YgdGhlIEVTUCBjYW4gYmUgbW9uaXRvcmVkLiBUaGF0IGlzbid0IHVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcgCi0gKiBhbnl0aGluZyBlbHNlIChzdWNoIGFzIHJlc2VsZWN0IGludGVycnVwdCBvciBvdGhlciBtYWdpYykgdGhvdWdoLiAKLSAqIE1heWJlIG1ha2UgdGhlIHNlbWFudGljcyBzaG91bGQgYmUgY2hhbmdlZCBsaWtlIAotICogaWYgKGVzcC0+Y3VycmVudF9TQykKLSAqCS4uLiBjaGVjayBEUlEgZmxhZyAuLi4KLSAqIGVsc2UgCi0gKgkuLi4gZGlzY29ubmVjdGVkLCBjaGVjayBwZW5kaW5nIFZJQSBpbnRlcnJ1cHQgLi4uCi0gKgotICogVGhlcmUncyBhIHByb2JsZW0gd2l0aCB1c2luZyB0aGUgZGFiZiBmbGFnIG9yIG1hY19pcnFfcGVuZGluZygpIGhlcmU6IGJvdGgKLSAqIHNlZW0gdG8gcmV0dXJuIDEgZXZlbiB0aG91Z2ggbm8gaW50ZXJydXB0IGlzIGN1cnJlbnRseSBwZW5kaW5nLCByZXN1bHRpbmcKLSAqIGluIGVzcF9leGVjX2NtZCgpIGhvbGRpbmcgb2ZmIHRoZSBuZXh0IGNvbW1hbmQsIGFuZCBwb3NzaWJseSBpbmZpbml0ZSBsb29wcwotICogaW4gZXNwX2ludHIoKS4gCi0gKiBTaG9ydCB0ZXJtIGZpeDoganVzdCB1c2UgZXNwX3N0YXR1cyAmIEVTUF9TVEFUX0lOVFIgaGVyZSwgYXMgbG9uZyBhcyB3ZQotICogdXNlIHNpbXBsZSBQSU8uIFRoZSBEUlEgc3RhdHVzIHdpbGwgYmUgaW1wb3J0YW50IHdoZW4gaW1wbGVtZW50aW5nIHBzZXVkbwotICogRE1BIG1vZGUgKHNldCB1cCBFU1AgdHJhbnNmZXIgY291bnQsIHJldHVybiwgZG8gYSBiYXRjaCBvZiBieXRlcyBpbiBQSU8gb3IgCi0gKiAnaGFyZHdhcmUgaGFuZHNoYWtlJyBtb2RlIHVwb24gRFJRKS4KLSAqIElmIHlvdSBwbGFuIG9uIGNoYW5naW5nIHRoaXMgKGkuZS4gdG8gc2F2ZSB0aGUgZXNwX3N0YXR1cyByZWdpc3RlciBhY2Nlc3MgaW4gCi0gKiBmYXZvciBvZiBhIFZJQSByZWdpc3RlciBhY2Nlc3Mgb3IgYSBzaGFkb3cgcmVnaXN0ZXIgZm9yIHRoZSBJRlIpLCBtYWtlIHN1cmUKLSAqIHRvIHRyeSBhIGRlYnVnIHZlcnNpb24gb2YgdGhpcyBmaXJzdCB0byBtb25pdG9yIHdoYXQgcmVnaXN0ZXJzIHdvdWxkIGJlIGEgZ29vZAotICogaW5kaWNhdG9yIG9mIHRoZSBFU1AgaW50ZXJydXB0LgotICovCi0KLXN0YXRpYyBpbnQgZXNwX2RhZmJfZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICogZXNwKQotewotCXVuc2lnbmVkIGludCByZXQ7Ci0JaW50IHNyZWcgPSBlc3BfcmVhZChlc3AtPmVyZWdzLT5lc3Bfc3RhdHVzKTsKLQotI2lmZGVmIERFQlVHX01BQ19FU1AKLQlwcmludGsoIm1hY19lc3A6IGVzcF9kYWZiX2RtYV9pcnFfcCBkYWZiICVkIGlycSAlZFxuIiwgCi0JCXJlYWRsKGVzcC0+ZHJlZ3MpLCBtYWNfaXJxX3BlbmRpbmcoSVJRX01BQ19TQ1NJKSk7Ci0jZW5kaWYKLQotCXNyZWcgJj0gRVNQX1NUQVRfSU5UUjsKLQotCS8qCi0JICogbWF5YmUgd29ya2luZzsgdGhpcyBpcyBlc3NlbnRpYWxseSB3aGF0J3MgdXNlZCBmb3IgaW9zYl9kbWFfaXJxX3AKLQkgKi8KLQlpZiAoc3JlZykKLQkJcmV0dXJuIDE7Ci0JZWxzZQotCQlyZXR1cm4gMDsKLQotCS8qCi0JICogZGlkbid0IHdvcmsgLi4uCi0JICovCi0jaWYgMAotCWlmIChlc3AtPmN1cnJlbnRfU0MpCi0JCXJldCA9IHJlYWRsKGVzcC0+ZHJlZ3MpICYgMHgyMDA7Ci0JZWxzZSBpZiAoZXNwLT5kaXNjb25uZWN0ZWRfU0MpCi0JCXJldCA9IDE7IC8qIHNyZWcgPz8gKi8KLQllbHNlCi0JCXJldCA9IG1hY19pcnFfcGVuZGluZyhJUlFfTUFDX1NDU0kpOwotCi0JcmV0dXJuKHJldCk7Ci0jZW5kaWYKLQotfQotCi0vKgotICogU2VlIGFib3ZlOiB0ZXN0aW5nIG1hY19pcnFfcGVuZGluZyBhbHdheXMgcmV0dXJuZWQgOCAoU0NTSSBJUlEpIHJlZ2FyZGxlc3MgCi0gKiBvZiB0aGUgYWN0dWFsIEVTUCBzdGF0dXMuCi0gKi8KLQotc3RhdGljIGludCBlc3BfaW9zYl9kbWFfaXJxX3Aoc3RydWN0IE5DUl9FU1AgKiBlc3ApCi17Ci0JaW50IHJldCAgPSBtYWNfaXJxX3BlbmRpbmcoSVJRX01BQ19TQ1NJKSB8fCBtYWNfaXJxX3BlbmRpbmcoSVJRX01BQ19TQ1NJRFJRKTsKLQlpbnQgc3JlZyA9IGVzcF9yZWFkKGVzcC0+ZXJlZ3MtPmVzcF9zdGF0dXMpOwotCi0jaWZkZWYgREVCVUdfTUFDX0VTUAotCXByaW50aygibWFjX2VzcDogZG1hX2lycV9wIGRycSAlZCBpcnEgJWQgc3JlZyAleCBjdXJyICVwIGRpc2MgJXBcbiIsIAotCQltYWNfaXJxX3BlbmRpbmcoSVJRX01BQ19TQ1NJRFJRKSwgbWFjX2lycV9wZW5kaW5nKElSUV9NQUNfU0NTSSksIAotCQlzcmVnLCBlc3AtPmN1cnJlbnRfU0MsIGVzcC0+ZGlzY29ubmVjdGVkX1NDKTsKLSNlbmRpZgotCi0Jc3JlZyAmPSBFU1BfU1RBVF9JTlRSOwotCi0JaWYgKHNyZWcpCi0JCXJldHVybiAoc3JlZyk7Ci0JZWxzZQotCQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFRoaXMgc2VlbXMgdG8gYmUgT0sgZm9yIFBJTyBhdCBsZWFzdCAuLi4gdXN1YWxseSAwIGFmdGVyIFBJTy4KLSAqLwotCi1zdGF0aWMgaW50IGRtYV9ieXRlc19zZW50KHN0cnVjdCBOQ1JfRVNQICogZXNwLCBpbnQgZmlmb19jb3VudCkKLXsKLQotI2lmZGVmIERFQlVHX01BQ19FU1AKLQlwcmludGsoIm1hY19lc3A6IGRtYSBieXRlcyBzZW50ID0gJXhcbiIsIGZpZm9fY291bnQpOwotI2VuZGlmCi0KLQlyZXR1cm4gZmlmb19jb3VudDsKLX0KLQotLyoKLSAqIGRtYV9jYW5fdHJhbnNmZXIgaXMgdXNlZCB0byBzd2l0Y2ggYmV0d2VlbiBETUEgYW5kIFBJTywgaWYgRE1BIChwc2V1ZG8pCi0gKiBpcyBldmVyIGltcGxlbWVudGVkLiBSZXR1cm5pbmcgMCBoZXJlIHdpbGwgdXNlIFBJTy4KLSAqLwotCi1zdGF0aWMgaW50IGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKiBlc3AsIFNjc2lfQ21uZCAqIHNwKQotewotCXVuc2lnbmVkIGxvbmcgc3ogPSBzcC0+U0NwLnRoaXNfcmVzaWR1YWw7Ci0jaWYgMAkvKiBubyBETUEgeWV0OyBtYWtlIGNvbmRpdGlvbmFsICovCi0JaWYgKHN6ID4gMHgxMDAwMDAwMCkgewotCQlzeiA9IDB4MTAwMDAwMDA7Ci0JfQotCXByaW50aygibWFjX2VzcDogZG1hIGNhbiB0cmFuc2ZlciA9IDBseCV4XG4iLCBzeik7Ci0jZWxzZQotCi0jaWZkZWYgREVCVUdfTUFDX0VTUAotCXByaW50aygibWFjX2VzcDogcGlvIHRvIHRyYW5zZmVyID0gJWxkXG4iLCBzeik7Ci0jZW5kaWYKLQotCXN6ID0gMDsKLSNlbmRpZgotCXJldHVybiBzejsKLX0KLQotLyoKLSAqIE5vdCB5ZXQgLi4uCi0gKi8KLQotc3RhdGljIHZvaWQgZG1hX2R1bXBfc3RhdGUoc3RydWN0IE5DUl9FU1AgKiBlc3ApCi17Ci0jaWZkZWYgREVCVUdfTUFDX0VTUAotCXByaW50aygibWFjX2VzcDogZG1hX2R1bXBfc3RhdGU6IGNhbGxlZFxuIik7Ci0jZW5kaWYKLSNpZiAwCi0JRVNQTE9HKCgiZXNwJWQ6IGRtYSAtLSBjb25kX3JlZzwlMDJ4PlxuIiwKLQkJZXNwLT5lc3BfaWQsICgoc3RydWN0IG1hY19kbWFfcmVnaXN0ZXJzICopCi0JCShlc3AtPmRyZWdzKSktPmNvbmRfcmVnKSk7Ci0jZW5kaWYKLX0KLQotLyoKLSAqIERNQSBzZXR1cDogc2hvdWxkIGJlIHVzZWQgdG8gc2V0IHVwIHRoZSBFU1AgdHJhbnNmZXIgY291bnQgZm9yIHBzZXVkbwotICogRE1BIHRyYW5zZmVyczsgbmVlZCBhIERSUSB0cmFuc2ZlciBmdW5jdGlvbiB0byBkbyB0aGUgYWN0dWFsIHRyYW5zZmVyCi0gKi8KLQotc3RhdGljIHZvaWQgZG1hX2luaXRfcmVhZChzdHJ1Y3QgTkNSX0VTUCAqIGVzcCwgY2hhciAqIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKQotewotCXByaW50aygibWFjX2VzcDogZG1hX2luaXRfcmVhZFxuIik7Ci19Ci0KLQotc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKiBlc3AsIGNoYXIgKiB2YWRkcmVzcywgaW50IGxlbmd0aCkKLXsKLQlwcmludGsoIm1hY19lc3A6IGRtYV9pbml0X3dyaXRlXG4iKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKiBlc3ApCi17Ci0JZGlzYWJsZV9pcnEoZXNwLT5pcnEpOwotfQotCi0KLXN0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICogZXNwKQotewotCWVuYWJsZV9pcnEoZXNwLT5pcnEpOwotfQotCi0vKgotICogZ2VuZXJpYyBkbWFfaXJxX3AoKSwgdW51c2VkCi0gKi8KLQotc3RhdGljIGludCBkbWFfaXJxX3Aoc3RydWN0IE5DUl9FU1AgKiBlc3ApCi17Ci0JaW50IGkgPSBlc3BfcmVhZChlc3AtPmVyZWdzLT5lc3Bfc3RhdHVzKTsKLQotI2lmZGVmIERFQlVHX01BQ19FU1AKLQlwcmludGsoIm1hY19lc3A6IGRtYV9pcnFfcCBzdGF0dXMgJWRcbiIsIGkpOwotI2VuZGlmCi0KLQlyZXR1cm4gKGkgJiBFU1BfU1RBVF9JTlRSKTsKLX0KLQotc3RhdGljIGludCBkbWFfaXJxX3BfcXVpY2soc3RydWN0IE5DUl9FU1AgKiBlc3ApCi17Ci0JLyoKLQkgKiBDb3BpZWQgZnJvbSBpb3NiX2RtYV9pcnFfcCgpCi0JICovCi0JaW50IHJldCAgPSBtYWNfaXJxX3BlbmRpbmcoSVJRX01BQ19TQ1NJKSB8fCBtYWNfaXJxX3BlbmRpbmcoSVJRX01BQ19TQ1NJRFJRKTsKLQlpbnQgc3JlZyA9IGVzcF9yZWFkKGVzcC0+ZXJlZ3MtPmVzcF9zdGF0dXMpOwotCi0jaWZkZWYgREVCVUdfTUFDX0VTUAotCXByaW50aygibWFjX2VzcDogZG1hX2lycV9wIGRycSAlZCBpcnEgJWQgc3JlZyAleCBjdXJyICVwIGRpc2MgJXBcbiIsIAotCQltYWNfaXJxX3BlbmRpbmcoSVJRX01BQ19TQ1NJRFJRKSwgbWFjX2lycV9wZW5kaW5nKElSUV9NQUNfU0NTSSksIAotCQlzcmVnLCBlc3AtPmN1cnJlbnRfU0MsIGVzcC0+ZGlzY29ubmVjdGVkX1NDKTsKLSNlbmRpZgotCi0Jc3JlZyAmPSBFU1BfU1RBVF9JTlRSOwotCi0JaWYgKHNyZWcpCi0JCXJldHVybiAoc3JlZyk7Ci0JZWxzZQotCQlyZXR1cm4gMDsKLQotfQotCi1zdGF0aWMgdm9pZCBkbWFfbGVkX29mZihzdHJ1Y3QgTkNSX0VTUCAqIGVzcCkKLXsKLSNpZmRlZiBERUJVR19NQUNfRVNQCi0JcHJpbnRrKCJtYWNfZXNwOiBkbWFfbGVkX29mZjogY2FsbGVkXG4iKTsKLSNlbmRpZgotfQotCi0KLXN0YXRpYyB2b2lkIGRtYV9sZWRfb24oc3RydWN0IE5DUl9FU1AgKiBlc3ApCi17Ci0jaWZkZWYgREVCVUdfTUFDX0VTUAotCXByaW50aygibWFjX2VzcDogZG1hX2xlZF9vbjogY2FsbGVkXG4iKTsKLSNlbmRpZgotfQotCi0KLXN0YXRpYyBpbnQgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKiBlc3ApCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICogZXNwLCBfX3UzMiBhZGRyLCBpbnQgY291bnQsIGludCB3cml0ZSkKLXsKLQotI2lmZGVmIERFQlVHX01BQ19FU1AKLQlwcmludGsoIm1hY19lc3A6IGRtYV9zZXR1cFxuIik7Ci0jZW5kaWYKLQotCWlmICh3cml0ZSkgewotCQlkbWFfaW5pdF9yZWFkKGVzcCwgKGNoYXIgKikgYWRkciwgY291bnQpOwotCX0gZWxzZSB7Ci0JCWRtYV9pbml0X3dyaXRlKGVzcCwgKGNoYXIgKikgYWRkciwgY291bnQpOwotCX0KLX0KLQotCi1zdGF0aWMgdm9pZCBkbWFfc2V0dXBfcXVpY2soc3RydWN0IE5DUl9FU1AgKiBlc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKQotewotI2lmZGVmIERFQlVHX01BQ19FU1AKLQlwcmludGsoIm1hY19lc3A6IGRtYV9zZXR1cF9xdWlja1xuIik7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0gewotCS5wcm9jX25hbWUJCT0gIm1hY19lc3AiLAotCS5uYW1lCQkJPSAiTWFjIDUzQzl4IFNDU0kiLAotCS5kZXRlY3QJCQk9IG1hY19lc3BfZGV0ZWN0LAotCS5zbGF2ZV9hbGxvYwkJPSBlc3Bfc2xhdmVfYWxsb2MsCi0JLnNsYXZlX2Rlc3Ryb3kJCT0gZXNwX3NsYXZlX2Rlc3Ryb3ksCi0JLnJlbGVhc2UJCT0gbWFjX2VzcF9yZWxlYXNlLAotCS5pbmZvCQkJPSBlc3BfaW5mbywKLQkucXVldWVjb21tYW5kCQk9IGVzcF9xdWV1ZSwKLQkuZWhfYWJvcnRfaGFuZGxlcgk9IGVzcF9hYm9ydCwKLQkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBlc3BfcmVzZXQsCi0JLmNhbl9xdWV1ZQkJPSA3LAotCS50aGlzX2lkCQk9IDcsCi0JLnNnX3RhYmxlc2l6ZQkJPSBTR19BTEwsCi0JLmNtZF9wZXJfbHVuCQk9IDEsCi0JLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORwotfTsKLQotCi0jaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21jYV81M2M5eC5jIGIvZHJpdmVycy9zY3NpL21jYV81M2M5eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjkzZDBmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc2NzaS9tY2FfNTNjOXguYworKysgL2Rldi9udWxsCkBAIC0xLDUyMCArMCwwIEBACi0vKiBtY2FfNTNjOXguYzogRHJpdmVyIGZvciB0aGUgU0NTSSBhZGFwdGVyIGZvdW5kIG9uIE5DUiAzNXh4Ci0gKiAgKGFuZCBtYXliZSBzb21lIG90aGVyKSBNaWNyb2NoYW5uZWwgbWFjaGluZXMKLSAqCi0gKiBDb2RlIHRha2VuIG1vc3RseSBmcm9tIEN5YmVyc3Rvcm0gU0NTSSBkcml2ZXJzCi0gKiAgIENvcHlyaWdodCAoQykgMTk5NiBKZXNwZXIgU2tvdiAoanNrb3ZAY3lnbnVzLmNvLnVrKQotICoKLSAqIEhhY2tlZCB0byB3b3JrIHdpdGggdGhlIE5DUiBNQ0Egc3R1ZmYgYnkgVHltbSBUd2lsbG1hbiAodHltbUBjb21wdXRlci5vcmcpCi0gKgotICogVGhlIEN5YmVyU3Rvcm0gU0NTSSBkcml2ZXIgKGFuZCB0aGlzIGRyaXZlcikgaXMgYmFzZWQgb24gRGF2aWQgUy4gTWlsbGVyJ3MKLSAqICAgRVNQIGRyaXZlciAgKiBmb3IgdGhlIFNwYXJjIGNvbXB1dGVycy4gCi0gKiAKLSAqIFNwZWNpYWwgdGhhbmtzIHRvIEtlbiBTdGV3YXJ0IGF0IFN5bWJpb3MgKExTSSkgZm9yIGhlbHBpbmcgd2l0aCBpbmZvIG9uCi0gKiAgdGhlIDg2QzAxLiAgSSB3YXMgb24gdGhlIGJyaW5rIG9mIGdvaW5nIGdhLWdhLi4uCi0gKgotICogQWxzbyB0aGFua3MgdG8gSmVzcGVyIFNrb3YgZm9yIGhlbHBpbmcgbWUgd2l0aCBpbmZvIG9uIGhvdyB0aGUgQW1pZ2EKLSAqICBkb2VzIHRoaW5ncy4uLgotICovCi0KLS8qCi0gKiBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHNldCB1cCB0byB1c2Ugb25lIDUzYzl4IGNhcmQgYXQgYSB0aW1lOyBpdCBjb3VsZCBiZSAKLSAqICBjaGFuZ2VkIGZhaXJseSBlYXNpbHkgdG8gZGV0ZWN0L3VzZSBtb3JlIHRoYW4gb25lLCBidXQgSSdtIG5vdCB0b28gc3VyZSBob3cKLSAqICBtYW55IGNhcmRzIHRoYXQgdXNlIHRoZSA1M2M5eCBvbiBNQ0Egc3lzdGVtcyB0aGVyZSBhcmUgKGlmLCBpbiBmYWN0LCB0aGVyZQotICogIGFyZSBjYXJkcyB0aGF0IHVzZSB0aGVtLCBvdGhlciB0aGFuIHRoZSBvbmUgYnVpbHQgaW50byBzb21lIE5DUiBzeXN0ZW1zKS4uLgotICogIElmIGFueW9uZSByZXF1ZXN0cyB0aGlzLCBJJ2xsIHRocm93IGl0IGluLCBvdGhlcndpc2UgaXQncyBub3Qgd29ydGggdGhlCi0gKiAgZWZmb3J0LgotICovCi0KLS8qCi0gKiBJbmZvIG9uIHRoZSA4NkMwMSBNQ0EgaW50ZXJmYWNlIGNoaXAgYXQgdGhlIGJvdHRvbSwgaWYgeW91IGNhcmUgZW5vdWdoIHRvCi0gKiAgbG9vay4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tY2EuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L21jYS1sZWdhY3kuaD4KLQotI2luY2x1ZGUgInNjc2kuaCIKLSNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgotI2luY2x1ZGUgIk5DUjUzQzl4LmgiCi0KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9tY2FfZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLQotLyoKLSAqIEZyb20gaWJtbWNhLmMgKElCTSBzY3NpIGNvbnRyb2xsZXIgY2FyZCBkcml2ZXIpIC0tIHVzZWQgZm9yIHR1cm5pbmcgUFMyIGRpc2sKLSAqICBhY3Rpdml0eSBMRUQgb24gYW5kIG9mZgotICovCi0KLSNkZWZpbmUgUFMyX1NZU19DVFIJMHg5MgotCi0vKiBQb3J0cyB0aGUgbmNyJ3MgNTNjOTQgY2FuIGJlIHB1dCBhdDsgaW5kZXhlZCBieSBwb3MgcmVnaXN0ZXIgdmFsdWUgKi8KLQotI2RlZmluZSBNQ0FfNTNDOVhfSU9fUE9SVFMgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMCwgMHgwMjQwLCAweDAzNDAsIDB4MDQwMCwgXAotCSAgICAgICAgICAgICAgICAgMHgwNDIwLCAweDMyNDAsIDB4ODI0MCwgMHhBMjQwLCBcCi0JICAgICAgICAgICAgICAgIH0KLQkJCQotLyoKLSAqIFN1cHBvc2VkbHkgdGhlcmUgd2VyZSBzb21lIGNhcmRzIHB1dCB0b2dldGhlciB3aXRoIHRoZSAnYzl4IGFuZCA4NmMwMS4gIElmCi0gKiAgIHRoZXkgaGF2ZSBkaWZmZXJlbnQgSUQncyBmcm9tIHRoZSBvbmVzIG9uIHRoZSAzNTAwIHNlcmllcyBtYWNoaW5lcywgCi0gKiAgIHlvdSBjYW4gYWRkIHRoZW0gaGVyZSBhbmQgaG9wZWZ1bGx5IHRoaW5ncyB3aWxsIHdvcmsgb3V0LgotICovCi0JCQkKLSNkZWZpbmUgTUNBXzUzQzlYX0lEUyB7ICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAweDdGNEMsIFwKLQkJCSAweDAwMDAsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotc3RhdGljIGludCAgZG1hX2J5dGVzX3NlbnQoc3RydWN0IE5DUl9FU1AgKiwgaW50KTsKLXN0YXRpYyBpbnQgIGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKiwgU2NzaV9DbW5kICopOwotc3RhdGljIHZvaWQgZG1hX2R1bXBfc3RhdGUoc3RydWN0IE5DUl9FU1AgKik7Ci1zdGF0aWMgdm9pZCBkbWFfaW5pdF9yZWFkKHN0cnVjdCBOQ1JfRVNQICosIF9fdTMyLCBpbnQpOwotc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKiwgX191MzIsIGludCk7Ci1zdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKik7Ci1zdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqKTsKLXN0YXRpYyBpbnQgIGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqKTsKLXN0YXRpYyBpbnQgIGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICopOwotc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICosIF9fdTMyLCBpbnQsIGludCk7Ci1zdGF0aWMgdm9pZCBkbWFfbGVkX29uKHN0cnVjdCBOQ1JfRVNQICopOwotc3RhdGljIHZvaWQgZG1hX2xlZF9vZmYoc3RydWN0IE5DUl9FU1AgKik7Ci0KLS8qIFRoaXMgaXMgd2hlcmUgYWxsIGNvbW1hbmRzIGFyZSBwdXQgYmVmb3JlIHRoZXkgYXJlIHRyYXNmZXJlZCB0byB0aGUgCi0gKiAgNTNjOXggdmlhIFBJTy4KLSAqLwotCi1zdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBjbWRfYnVmZmVyWzE2XTsKLQotLyoKLSAqIFdlIGtlZXAgdGhlIHN0cnVjdHVyZSB0aGF0IGlzIHVzZWQgdG8gYWNjZXNzIHRoZSByZWdpc3RlcnMgb24gdGhlIDUzYzl4Ci0gKiAgaGVyZS4KLSAqLwotCi1zdGF0aWMgc3RydWN0IEVTUF9yZWdzIGVyZWdzOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRGV0ZWN0aW9uICovCi1zdGF0aWMgaW50IG1jYV9lc3BfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQpCi17Ci0Jc3RydWN0IE5DUl9FU1AgKmVzcDsKLQlzdGF0aWMgaW50IGlvX3BvcnRfYnlfcG9zW10gPSBNQ0FfNTNDOVhfSU9fUE9SVFM7Ci0JaW50IG1jYV81M2M5eF9pZHNbXSA9IE1DQV81M0M5WF9JRFM7Ci0JaW50ICppZF90b19jaGVjayA9IG1jYV81M2M5eF9pZHM7Ci0JaW50IHNsb3Q7Ci0JaW50IHBvc1szXTsKLQl1bnNpZ25lZCBpbnQgdG1wX2lvX2FkZHI7Ci0JdW5zaWduZWQgY2hhciB0bXBfYnl0ZTsKLQotCi0JaWYgKCFNQ0FfYnVzKQotCQlyZXR1cm4gMDsKLQotCXdoaWxlICgqaWRfdG9fY2hlY2spIHsgCi0JCWlmICgoc2xvdCA9IG1jYV9maW5kX2FkYXB0ZXIoKmlkX3RvX2NoZWNrLCAwKSkgIT0KLQkJICBNQ0FfTk9URk9VTkQpIAotCQl7Ci0JCQllc3AgPSBlc3BfYWxsb2NhdGUodHBudCwgTlVMTCwgMCk7Ci0KLQkJCXBvc1swXSA9IG1jYV9yZWFkX3N0b3JlZF9wb3Moc2xvdCwgMik7Ci0JCQlwb3NbMV0gPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDMpOwotCQkJcG9zWzJdID0gbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCA0KTsKLQotCQkJZXNwLT5lcmVncyA9ICZlcmVnczsKLQotCQkJLyoKLQkJCSAqIElPIHBvcnQgYmFzZSBpcyBnaXZlbiBpbiB0aGUgZmlyc3QgKG5vbi1JRCkgcG9zCi0JCQkgKiAgcmVnaXN0ZXIsIGxpa2Ugc286Ci0JCQkgKgotCQkJICogIEJpdHMgMyAgMiAgMSAgICAgICBJTyBiYXNlCi0JCQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkgKiAgICAgICAwICAwICAwICAgICAgIDxkaXNhYmxlZD4KLQkJCSAqICAgICAgIDAgIDAgIDEgICAgICAgMHgwMjQwCi0JCQkgKiAgICAgICAwICAxICAwICAgICAgIDB4MDM0MAotCQkJICogICAgICAgMCAgMSAgMSAgICAgICAweDA0MDAKLQkJCSAqICAgICAgIDEgIDAgIDAgICAgICAgMHgwNDIwCi0JCQkgKiAgICAgICAxICAwICAxICAgICAgIDB4MzI0MAotCQkJICogICAgICAgMSAgMSAgMCAgICAgICAweDgyNDAKLQkJCSAqICAgICAgIDEgIDEgIDEgICAgICAgMHhBMjQwCi0JCQkgKi8KLQotCQkJdG1wX2lvX2FkZHIgPQotCQkJICBpb19wb3J0X2J5X3Bvc1socG9zWzBdICYgMHgwRSkgPj4gMV07Ci0KLQkJCWVzcC0+ZXJlZ3MtPmlvX2FkZHIgPSB0bXBfaW9fYWRkciArIDB4MTA7Ci0KLSAgICAgIAkJCWlmIChlc3AtPmVyZWdzLT5pb19hZGRyID09IDB4MDAwMCkgeyAKLSAgICAgICAgCQkJcHJpbnRrKCJBZGFwdGVyIGlzIGRpc2FibGVkLlxuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBJUlEgaXMgc3BlY2lmaWVkIGluIGJpdHMgNCBhbmQgNToKLQkJCSAqCi0JCQkgKiAgQml0cyAgNCAgNSAgICAgICAgSVJRCi0JCQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJICogICAgICAgIDAgIDAgICAgICAgICAzCi0JCQkgKiAgICAgICAgMCAgMSAgICAgICAgIDUKLQkJCSAqICAgICAgICAxICAwICAgICAgICAgNwotCQkJICogICAgICAgIDEgIDEgICAgICAgICA5Ci0JCQkgKi8KLQotICAgICAgCQkJZXNwLT5pcnEgPSAoKHBvc1swXSAmIDB4MzApID4+IDMpICsgMzsKLQotCQkJLyoKLQkJCSAqIERNQSBjaGFubmVsIGlzIGluIHRoZSBsb3cgMyBiaXRzIG9mIHRoZSBzZWNvbmQKLQkJCSAqICBQT1MgcmVnaXN0ZXIKLQkJCSAqLwotCi0JCQllc3AtPmRtYSA9IHBvc1sxXSAmIDc7Ci0JCQllc3AtPnNsb3QgPSBzbG90OwotCi0JCQlpZiAocmVxdWVzdF9pcnEoZXNwLT5pcnEsIGVzcF9pbnRyLCAwLAotCQkJICJOQ1IgNTNjOXggU0NTSSIsIGVzcC0+ZWhvc3QpKQotCQkJewotCQkJCXByaW50aygiVW5hYmxlIHRvIHJlcXVlc3QgSVJRICVkLlxuIiwgZXNwLT5pcnEpOwotCQkJCWVzcF9kZWFsbG9jYXRlKGVzcCk7Ci0JCQkJc2NzaV91bnJlZ2lzdGVyKGVzcC0+ZWhvc3QpOwotCQkJCXJldHVybiAwOwotCQkJfQotCi0gCQkJaWYgKHJlcXVlc3RfZG1hKGVzcC0+ZG1hLCAiTkNSIDUzYzl4IFNDU0kiKSkgewotCQkJCXByaW50aygiVW5hYmxlIHRvIHJlcXVlc3QgRE1BIGNoYW5uZWwgJWQuXG4iLAotCQkJCSBlc3AtPmRtYSk7Ci0JCQkJZnJlZV9pcnEoZXNwLT5pcnEsIGVzcF9pbnRyKTsKLQkJCQllc3BfZGVhbGxvY2F0ZShlc3ApOwotCQkJCXNjc2lfdW5yZWdpc3Rlcihlc3AtPmVob3N0KTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQotCQkJcmVxdWVzdF9yZWdpb24odG1wX2lvX2FkZHIsIDMyLCAiTkNSIDUzYzl4IFNDU0kiKTsKLQotCQkJLyoKLQkJCSAqIDg2QzAxIGhhbmRsZXMgRE1BLCBJTyBtb2RlLCBmcm9tIGFkZHJlc3MKLQkJCSAqICAoYmFzZSArIDB4MGEpCi0JCQkgKi8KLQotCQkJbWNhX2Rpc2FibGVfZG1hKGVzcC0+ZG1hKTsKLQkJCW1jYV9zZXRfZG1hX2lvKGVzcC0+ZG1hLCB0bXBfaW9fYWRkciArIDB4MGEpOwotCQkJbWNhX2VuYWJsZV9kbWEoZXNwLT5kbWEpOwotIAotCQkJLyogVGVsbCB0aGUgODZDMDEgdG8gZ2l2ZSB1cyBpbnRlcnJ1cHRzICovCi0KLQkJCXRtcF9ieXRlID0gaW5iKHRtcF9pb19hZGRyICsgMHgwMikgfCAweDQwOwotCQkJb3V0Yih0bXBfYnl0ZSwgdG1wX2lvX2FkZHIgKyAweDAyKTsgCi0KLQkJCS8qCi0JCQkgKiBTY3NpIElEIC0tIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciwgaGkKLQkJCSAqICAyIGJpdHM7IGFkZCA0IHRvIHRoaXMgbnVtYmVyIHRvIGdldCB0aGUKLQkJCSAqICBJRAotCQkJICovCi0KLQkJCWVzcC0+c2NzaV9pZCA9ICgocG9zWzJdICYgMHhDMCkgPj4gNikgKyA0OwotCi0JCQkvKiBEbyBjb21tYW5kIHRyYW5zZmVyIHdpdGggcHJvZ3JhbW1lZCBJL08gKi8KLQotCQkJZXNwLT5kb19waW9fY21kcyA9IDE7Ci0KLQkJCS8qIFJlcXVpcmVkIGZ1bmN0aW9ucyAqLwotCi0JCQllc3AtPmRtYV9ieXRlc19zZW50ID0gJmRtYV9ieXRlc19zZW50OwotCQkJZXNwLT5kbWFfY2FuX3RyYW5zZmVyID0gJmRtYV9jYW5fdHJhbnNmZXI7Ci0JCQllc3AtPmRtYV9kdW1wX3N0YXRlID0gJmRtYV9kdW1wX3N0YXRlOwotCQkJZXNwLT5kbWFfaW5pdF9yZWFkID0gJmRtYV9pbml0X3JlYWQ7Ci0JCQllc3AtPmRtYV9pbml0X3dyaXRlID0gJmRtYV9pbml0X3dyaXRlOwotCQkJZXNwLT5kbWFfaW50c19vZmYgPSAmZG1hX2ludHNfb2ZmOwotCQkJZXNwLT5kbWFfaW50c19vbiA9ICZkbWFfaW50c19vbjsKLQkJCWVzcC0+ZG1hX2lycV9wID0gJmRtYV9pcnFfcDsKLQkJCWVzcC0+ZG1hX3BvcnRzX3AgPSAmZG1hX3BvcnRzX3A7Ci0JCQllc3AtPmRtYV9zZXR1cCA9ICZkbWFfc2V0dXA7Ci0KLQkJCS8qIE9wdGlvbmFsIGZ1bmN0aW9ucyAqLwotCi0JCQllc3AtPmRtYV9iYXJyaWVyID0gTlVMTDsKLQkJCWVzcC0+ZG1hX2RyYWluID0gTlVMTDsKLQkJCWVzcC0+ZG1hX2ludmFsaWRhdGUgPSBOVUxMOwotCQkJZXNwLT5kbWFfaXJxX2VudHJ5ID0gTlVMTDsKLQkJCWVzcC0+ZG1hX2lycV9leGl0ID0gTlVMTDsKLQkJCWVzcC0+ZG1hX2xlZF9vbiA9IGRtYV9sZWRfb247Ci0JCQllc3AtPmRtYV9sZWRfb2ZmID0gZG1hX2xlZF9vZmY7Ci0JCQllc3AtPmRtYV9wb2xsID0gTlVMTDsKLQkJCWVzcC0+ZG1hX3Jlc2V0ID0gTlVMTDsKLQotCQkJLyogU2V0IHRoZSBjb21tYW5kIGJ1ZmZlciAqLwotCi0JCQllc3AtPmVzcF9jb21tYW5kID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKQotCQkJICBjbWRfYnVmZmVyOwotCSAJCWVzcC0+ZXNwX2NvbW1hbmRfZHZtYSA9IGlzYV92aXJ0X3RvX2J1cyhjbWRfYnVmZmVyKTsKLQotCQkJLyogU0NTSSBjaGlwIHNwZWVkICovCi0KLQkJCWVzcC0+Y2ZyZXEgPSAyNTAwMDAwMDsKLQotCQkJLyogRGlmZmVyZW50aWFsIFNDU0k/IEkgdGhpbmsgbm90LiAqLwotCi0JCQllc3AtPmRpZmYgPSAwOwotCi0JCQllc3BfaW5pdGlhbGl6ZShlc3ApOwotCi0gICAgICAJCQlwcmludGsoIiBBZGFwdGVyIGZvdW5kIGluIHNsb3QgJTJkOiBpbyBwb3J0IDB4JXggIgotCQkJICAiaXJxICVkIGRtYSBjaGFubmVsICVkXG4iLCBzbG90ICsgMSwgdG1wX2lvX2FkZHIsCi0JCQkgICBlc3AtPmlycSwgZXNwLT5kbWEpOwotCi0JCQltY2Ffc2V0X2FkYXB0ZXJfbmFtZShzbG90LCAiTkNSIDUzQzlYIFNDU0kgQWRhcHRlciIpOwotCQkJbWNhX21hcmtfYXNfdXNlZChzbG90KTsKLQotCQkJYnJlYWs7Ci0JCX0KLSAgICAKLQkJaWRfdG9fY2hlY2srKzsKLQl9Ci0KLQlyZXR1cm4gZXNwc19pbl91c2U7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUmVsZWFzZSAqLwotCi1zdGF0aWMgaW50IG1jYV9lc3BfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQotewotCXN0cnVjdCBOQ1JfRVNQICplc3AgPSAoc3RydWN0IE5DUl9FU1AgKilob3N0LT5ob3N0ZGF0YTsKLQl1bnNpZ25lZCBjaGFyIHRtcF9ieXRlOwotCi0JZXNwX2RlYWxsb2NhdGUoZXNwKTsKLQkvKgotCSAqIFRlbGwgdGhlIDg2QzAxIHRvIHN0b3Agc2VuZGluZyBpbnRlcnJ1cHRzCi0JICovCi0KLQl0bXBfYnl0ZSA9IGluYihlc3AtPmVyZWdzLT5pb19hZGRyIC0gMHgwRSk7Ci0JdG1wX2J5dGUgJj0gfjB4NDA7Ci0Jb3V0Yih0bXBfYnl0ZSwgZXNwLT5lcmVncy0+aW9fYWRkciAtIDB4MEUpOwotCi0JZnJlZV9pcnEoZXNwLT5pcnEsIGVzcF9pbnRyKTsKLQlmcmVlX2RtYShlc3AtPmRtYSk7Ci0KLQltY2FfbWFya19hc191bnVzZWQoZXNwLT5zbG90KTsKLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBETUEgRnVuY3Rpb25zICovCi1zdGF0aWMgaW50IGRtYV9ieXRlc19zZW50KHN0cnVjdCBOQ1JfRVNQICplc3AsIGludCBmaWZvX2NvdW50KQotewotCS8qIEFzayB0aGUgNTNjOXguICBJdCBrbm93cy4gKi8KLQotCXJldHVybiBmaWZvX2NvdW50OwotfQotCi1zdGF0aWMgaW50IGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCkKLXsKLQkvKiAKLQkgKiBUaGUgTUNBIGRtYSBjaGFubmVscyBjYW4gb25seSBkbyB1cCB0byAxMjhLIGJ5dGVzIGF0IGEgdGltZS4KLSAgICAgICAgICogICgxNiBiaXQgbW9kZSkKLQkgKi8KLQotCXVuc2lnbmVkIGxvbmcgc3ogPSBzcC0+U0NwLnRoaXNfcmVzaWR1YWw7Ci0JaWYoc3ogPiAweDIwMDAwKQotCQlzeiA9IDB4MjAwMDA7Ci0JcmV0dXJuIHN6OwotfQotCi1zdGF0aWMgdm9pZCBkbWFfZHVtcF9zdGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotCS8qCi0JICogRG9lc24ndCBxdWl0ZSBtYXRjaCB1cCB0byB0aGUgb3RoZXIgZHJpdmVycywgYnV0IHdlIGRvIHdoYXQgd2UKLQkgKiAgY2FuLgotCSAqLwotCi0JRVNQTE9HKCgiZXNwJWQ6IGRtYSBjaGFubmVsIDwlZD5cbiIsIGVzcC0+ZXNwX2lkLCBlc3AtPmRtYSkpOwotCUVTUExPRygoImJ5dGVzIGxlZnQgdG8gZG1hOiAlZFxuIiwgbWNhX2dldF9kbWFfcmVzaWR1ZShlc3AtPmRtYSkpKTsKLX0KLQotc3RhdGljIHZvaWQgZG1hX2luaXRfcmVhZChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgbGVuZ3RoKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOwotCi0JbWNhX2Rpc2FibGVfZG1hKGVzcC0+ZG1hKTsKLQltY2Ffc2V0X2RtYV9tb2RlKGVzcC0+ZG1hLCBNQ0FfRE1BX01PREVfWEZFUiB8IE1DQV9ETUFfTU9ERV8xNiB8Ci0JICBNQ0FfRE1BX01PREVfSU8pOwotCW1jYV9zZXRfZG1hX2FkZHIoZXNwLT5kbWEsIGFkZHIpOwotCW1jYV9zZXRfZG1hX2NvdW50KGVzcC0+ZG1hLCBsZW5ndGggLyAyKTsgLyogISEhICovCi0JbWNhX2VuYWJsZV9kbWEoZXNwLT5kbWEpOwotCi0JcmVzdG9yZV9mbGFncyhmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9pbml0X3dyaXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBsZW5ndGgpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCi0Jc2F2ZV9mbGFncyhmbGFncyk7Ci0JY2xpKCk7Ci0KLQltY2FfZGlzYWJsZV9kbWEoZXNwLT5kbWEpOwotCW1jYV9zZXRfZG1hX21vZGUoZXNwLT5kbWEsIE1DQV9ETUFfTU9ERV9YRkVSIHwgTUNBX0RNQV9NT0RFX1dSSVRFIHwKLQkgIE1DQV9ETUFfTU9ERV8xNiB8IE1DQV9ETUFfTU9ERV9JTyk7Ci0JbWNhX3NldF9kbWFfYWRkcihlc3AtPmRtYSwgYWRkcik7Ci0JbWNhX3NldF9kbWFfY291bnQoZXNwLT5kbWEsIGxlbmd0aCAvIDIpOyAvKiAhISEgKi8KLQltY2FfZW5hYmxlX2RtYShlc3AtPmRtYSk7Ci0KLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgZG1hX2ludHNfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci0JLyoKLQkgKiBUZWxsIHRoZSAnQzAxIHRvIHNodXQgdXAuICBBbGwgaW50ZXJydXB0cyBhcmUgcm91dGVkIHRocm91Z2ggaXQuCi0JICovCi0KLQlvdXRiKGluYihlc3AtPmVyZWdzLT5pb19hZGRyIC0gMHgwRSkgJiB+MHg0MCwKLQkgZXNwLT5lcmVncy0+aW9fYWRkciAtIDB4MEUpOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotCS8qCi0JICogT2suICBZb3UgY2FuIHNwZWFrIGFnYWluLgotCSAqLwotCi0Jb3V0YihpbmIoZXNwLT5lcmVncy0+aW9fYWRkciAtIDB4MEUpIHwgMHg0MCwKLQkgZXNwLT5lcmVncy0+aW9fYWRkciAtIDB4MEUpOwotfQotCi1zdGF0aWMgaW50IGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotCS8qCi0JICogRGF2ZU0gc2F5cyB0aGF0IHRoaXMgc2hvdWxkIHJldHVybiBhICJ5ZXMiIGlmIHRoZXJlIGlzIGFuIGludGVycnVwdAotCSAqICBvciBhIERNQSBlcnJvciBvY2N1cnJlZC4gIEkgY29waWVkIHRoZSBBbWlnYSBkcml2ZXIncyBzZW1hbnRpY3MsCi0JICogIHRob3VnaCwgYmVjYXVzZSBpdCBzZWVtcyB0byB3b3JrIGFuZCB3ZSBjYW4ndCByZWFsbHkgdGVsbCBpZgotCSAqICBhIERNQSBlcnJvciBoYXBwZW5lZC4gIFRoaXMgZ2l2ZXMgdGhlICJ5ZXMiIGlmIHRoZSBzY3NpIGNoaXAKLQkgKiAgaXMgc2VuZGluZyBhbiBpbnRlcnJ1cHQgYW5kIG5vIERNQSBhY3Rpdml0eSBpcyB0YWtpbmcgcGxhY2UKLQkgKi8KLQotCXJldHVybiAoIShpbmIoZXNwLT5lcmVncy0+aW9fYWRkciAtIDB4MDQpICYgMSkgJiYKLQkgIShpbmIoZXNwLT5lcmVncy0+aW9fYWRkciAtIDB4MDQpICYgMikgKTsgCi19Ci0KLXN0YXRpYyBpbnQgZG1hX3BvcnRzX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCkKLXsKLQkvKgotCSAqIENoZWNrIHRvIHNlZSBpZiBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkIG9uIHRoZSAnQzAxIChpbiBjYXNlIGFib3J0Ci0JICogIGlzIGVudGVyZWQgbXVsdGlwbGUgdGltZXMsIHNvIHdlIG9ubHkgZG8gdGhlIGFib3J0IG9uY2UpCi0JICovCi0KLQlyZXR1cm4gKGluYihlc3AtPmVyZWdzLT5pb19hZGRyIC0gMHgwRSkgJiAweDQwKSA/IDE6MDsKLX0KLQotc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKQotewotCWlmKHdyaXRlKXsKLQkJZG1hX2luaXRfd3JpdGUoZXNwLCBhZGRyLCBjb3VudCk7Ci0JfSBlbHNlIHsKLQkJZG1hX2luaXRfcmVhZChlc3AsIGFkZHIsIGNvdW50KTsKLQl9Ci19Ci0KLS8qCi0gKiBUaGVzZSB3aWxsIG5vdCBwbGF5IG5pY2VseSB3aXRoIG90aGVyIGRpc2sgY29udHJvbGxlcnMgdGhhdCB0cnkgdG8gdXNlIHRoZQotICogIGRpc2sgYWN0aXZlIExFRC4uLiBidXQgd2hhdCBjYW4geW91IGRvPyAgRG9uJ3QgYW5zd2VyIHRoYXQuCi0gKgotICogU3RvbGVuIHNoYW1lbGVzc2x5IGZyb20gaWJtbWNhLmMgLS0gSUJNIE1pY3JvY2hhbm5lbCBTQ1NJIGFkYXB0ZXIgZHJpdmVyCi0gKgotICovCi0KLXN0YXRpYyB2b2lkIGRtYV9sZWRfb24oc3RydWN0IE5DUl9FU1AgKmVzcCkKLXsKLQlvdXRiKGluYihQUzJfU1lTX0NUUikgfCAweGMwLCBQUzJfU1lTX0NUUik7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9sZWRfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci0Jb3V0YihpbmIoUFMyX1NZU19DVFIpICYgMHgzZiwgUFMyX1NZU19DVFIpOwotfQotCi1zdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7Ci0JLnByb2NfbmFtZQkJPSAibWNhXzUzYzl4IiwKLQkubmFtZQkJCT0gIk5DUiA1M2M5eCBTQ1NJIiwKLQkuZGV0ZWN0CQkJPSBtY2FfZXNwX2RldGVjdCwKLQkuc2xhdmVfYWxsb2MJCT0gZXNwX3NsYXZlX2FsbG9jLAotCS5zbGF2ZV9kZXN0cm95CQk9IGVzcF9zbGF2ZV9kZXN0cm95LAotCS5yZWxlYXNlCQk9IG1jYV9lc3BfcmVsZWFzZSwKLQkucXVldWVjb21tYW5kCQk9IGVzcF9xdWV1ZSwKLQkuZWhfYWJvcnRfaGFuZGxlcgk9IGVzcF9hYm9ydCwKLQkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBlc3BfcmVzZXQsCi0JLmNhbl9xdWV1ZQkJPSA3LAotCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAotCS5jbWRfcGVyX2x1bgkJPSAxLAotCS51bmNoZWNrZWRfaXNhX2RtYQk9IDEsCi0JLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORwotfTsKLQotCi0jaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKLQotLyoKLSAqIE9LLCBoZXJlJ3MgdGhlIGdvb2RzIEkgcHJvbWlzZWQuICBUaGUgTkNSIDg2QzAxIGlzIGFuIE1DQSBpbnRlcmZhY2UgY2hpcCAKLSAqICB0aGF0IGhhbmRsZXMgZW5hYmxpbmcvZGlhYmxpbmcgSVJRLCBkbWEgaW50ZXJmYWNpbmcsIElPIHBvcnQgc2VsZWN0aW9uCi0gKiAgYW5kIG90aGVyIGZ1biBzdHVmZi4gIEl0IHRha2VzIHVwIDE2IGFkZHJlc3NlcywgYW5kIHRoZSBjaGlwIGl0IGlzCi0gKiAgY29ubm5lY3RlZCB0byBnZXRzIHRoZSBmb2xsb3dpbmcgMTYuICBSZWdpc3RlcnMgYXJlIGFzIGZvbGxvd3M6Ci0gKgotICogT2Zmc2V0cyAwLTEgOiBDYXJkIElECi0gKgotICogT2Zmc2V0ICAgIDIgOiBNb2RlIGVuYWJsZSByZWdpc3RlciAtLQotICogICAgICAgICAgICAgICAgQml0ICAgIDcgOiBEYXRhIFdvcmQgd2lkdGggKDEgPSAxNiwgMCA9IDgpCi0gKgkJICBCaXQgICAgNiA6IElSUSBlbmFibGUgKDEgPSBlbmFibGVkKQotICogICAgICAgICAgICAgICAgQml0cyA1LDQgOiBJUlEgc2VsZWN0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIDAgOiBJUlEgMwotICoJCQkgICAgICAgIDAgIDEgOiBJUlEgNQotICogCQkJCTEgIDAgOiBJUlEgNwotICogIAkJCQkxICAxIDogSVJRIDkKLSAqICAgICAgICAgICAgICAgIEJpdHMgMy0xIDogQmFzZSBBZGRyZXNzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIDAgIDAgOiA8ZGlzYWJsZWQ+Ci0gKiAJCQkgICAgIDAgIDAgIDEgOiAweDAyNDAKLSAqICAgIAkJCSAgICAgMCAgMSAgMCA6IDB4MDM0MAotICogICAgIAkJCSAgICAgMCAgMSAgMSA6IDB4MDQwMAotICogCQkJICAgICAxICAwICAwIDogMHgwNDIwCi0gKiAJCQkgICAgIDEgIDAgIDEgOiAweDMyNDAKLSAqIAkJCSAgICAgMSAgMSAgMCA6IDB4ODI0MAotICogCQkJICAgICAxICAxICAxIDogMHhBMjQwCi0gKgkJICBCaXQgICAgMCA6IENhcmQgZW5hYmxlICgxID0gZW5hYmxlZCkKLSAqCi0gKiBPZmZzZXQgICAgMyA6IERNQSBjb250cm9sIHJlZ2lzdGVyIC0tCi0gKiAgICAgICAgICAgICAgICBCaXQgICAgNyA6IERNQSBlbmFibGUgKDEgPSBlbmFibGVkKQotICogICAgICAgICAgICAgICAgQml0cyA2LDUgOiBQcmVlbXQgQ291bnQgU2VsZWN0ICh0cmFuc2ZlcnMgdG8gY29tcGxldGUgYWZ0ZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDMDEgaGFzIGJlZW4gcHJlZW1wdGVkIG9uIE1DQSBidXMpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIDAgOiAwCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIDEgOiAxCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIDAgOiAzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIDEgOiA3Ci0gKiAgKGFsbCB0aGVzZSB3YWNreSBudW1iZXJzOyBJJ20gc3VyZSB0aGVyZSdzIGEgcmVhc29uIHNvbWV3aGVyZSkKLSAqICAgICAgICAgICAgICAgIEJpdCAgICA0IDogRmFpcm5lc3MgZW5hYmxlICgxID0gZmFpciBidXMgcHJpb3JpdHkpCi0gKiAgICAgICAgICAgICAgICBCaXRzIDMtMCA6IEFyYml0cmF0aW9uIGxldmVsICgwLTE1IGNvbnNlY3V0aXZlKQotICogCi0gKiBPZmZzZXQgICAgNCA6IEdlbmVyYWwgcHVycG9zZSByZWdpc3RlcgotICogICAgICAgICAgICAgICAgQml0cyA3LTMgOiBVc2VyIGRlZmluYWJsZSAoaGVyZSwgNyw2IGFyZSBTQ1NJIElEKQotICogICAgICAgICAgICAgICAgQml0cyAyLTAgOiByZXNlcnZlZAotICoKLSAqIE9mZnNldCAgIDEwIDogRE1BIGRlY29kZSByZWdpc3RlciAodXNlZCBmb3IgSU8gYmFzZWQgRE1BOyBhbHNvIGNhbiBkbwotICogICAgICAgICAgICAgICAgUElPIHRocm91Z2ggdGhpcyBwb3J0KQotICoKLSAqIE9mZnNldCAgIDEyIDogU3RhdHVzCi0gKiAgICAgICAgICAgICAgICBCaXRzIDctMiA6IHJlc2VydmVkCi0gKiAgICAgICAgICAgICAgICBCaXQgICAgMSA6IERNQSBwZW5kaW5nICgxID0gcGVuZGluZykKLSAqICAgICAgICAgICAgICAgIEJpdCAgICAwIDogSVJRIHBlbmRpbmcgKDAgPSBwZW5kaW5nKQotICoKLSAqIEV4Y2l0aW5nLCBodWg/ICAKLSAqCi0gKi8gICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvb2t0YWdvbl9lc3AuYyBiL2RyaXZlcnMvc2NzaS9va3RhZ29uX2VzcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTVlYWRiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc2NzaS9va3RhZ29uX2VzcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjA2ICswLDAgQEAKLS8qCi0gKiBPa3RhZ29uX2VzcC5jIC0tIERyaXZlciBmb3IgYnNjIE9rdGFnb24KLSAqCi0gKiBXcml0dGVuIGJ5IENhcnN0ZW4gUGx1bnRrZSAxOTk4Ci0gKgotICogQmFzZWQgb24gY3liZXJfZXNwLmMKLSAqLwotCi0KLSNpZiBkZWZpbmVkKENPTkZJR19BTUlHQSkgfHwgZGVmaW5lZChDT05GSUdfQVBVUykKLSNkZWZpbmUgVVNFX0JPVFRPTV9IQUxGCi0jZW5kaWYKLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vcHRyYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLQotCi0jaW5jbHVkZSAic2NzaS5oIgotI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+Ci0jaW5jbHVkZSAiTkNSNTNDOXguaCIKLQotI2luY2x1ZGUgPGxpbnV4L3pvcnJvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KLSNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgotCi0jaWZkZWYgVVNFX0JPVFRPTV9IQUxGCi0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jZW5kaWYKLQotLyogVGhlIGNvbnRyb2xsZXIgcmVnaXN0ZXJzIGNhbiBiZSBmb3VuZCBpbiB0aGUgWjIgY29uZmlnIGFyZWEgYXQgdGhlc2UKLSAqIG9mZnNldHM6Ci0gKi8KLSNkZWZpbmUgT0tUQUdPTl9FU1BfQUREUiAweDAzMDAwCi0jZGVmaW5lIE9LVEFHT05fRE1BX0FERFIgMHgwMTAwMAotCi0KLXN0YXRpYyBpbnQgIGRtYV9ieXRlc19zZW50KHN0cnVjdCBOQ1JfRVNQICplc3AsIGludCBmaWZvX2NvdW50KTsKLXN0YXRpYyBpbnQgIGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCk7Ci1zdGF0aWMgdm9pZCBkbWFfZHVtcF9zdGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyB2b2lkIGRtYV9pbml0X3JlYWQoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgdmFkZHJlc3MsIGludCBsZW5ndGgpOwotc3RhdGljIHZvaWQgZG1hX2luaXRfd3JpdGUoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgdmFkZHJlc3MsIGludCBsZW5ndGgpOwotc3RhdGljIHZvaWQgZG1hX2ludHNfb2ZmKHN0cnVjdCBOQ1JfRVNQICplc3ApOwotc3RhdGljIHZvaWQgZG1hX2ludHNfb24oc3RydWN0IE5DUl9FU1AgKmVzcCk7Ci1zdGF0aWMgaW50ICBkbWFfaXJxX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCk7Ci1zdGF0aWMgdm9pZCBkbWFfbGVkX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyB2b2lkIGRtYV9sZWRfb24oc3RydWN0IE5DUl9FU1AgKmVzcCk7Ci1zdGF0aWMgaW50ICBkbWFfcG9ydHNfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyB2b2lkIGRtYV9zZXR1cChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiBhZGRyLCBpbnQgY291bnQsIGludCB3cml0ZSk7Ci0KLXN0YXRpYyB2b2lkIGRtYV9pcnFfZXhpdChzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyB2b2lkIGRtYV9pbnZhbGlkYXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApOwotCi1zdGF0aWMgdm9pZCBkbWFfbW11X2dldF9zY3NpX29uZShzdHJ1Y3QgTkNSX0VTUCAqLFNjc2lfQ21uZCAqKTsKLXN0YXRpYyB2b2lkIGRtYV9tbXVfZ2V0X3Njc2lfc2dsKHN0cnVjdCBOQ1JfRVNQICosU2NzaV9DbW5kICopOwotc3RhdGljIHZvaWQgZG1hX21tdV9yZWxlYXNlX3Njc2lfb25lKHN0cnVjdCBOQ1JfRVNQICosU2NzaV9DbW5kICopOwotc3RhdGljIHZvaWQgZG1hX21tdV9yZWxlYXNlX3Njc2lfc2dsKHN0cnVjdCBOQ1JfRVNQICosU2NzaV9DbW5kICopOwotc3RhdGljIHZvaWQgZG1hX2FkdmFuY2Vfc2coU2NzaV9DbW5kICopOwotc3RhdGljIGludCAgb2t0YWdvbl9ub3RpZnlfcmVib290KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLCB2b2lkICp4KTsKLQotI2lmZGVmIFVTRV9CT1RUT01fSEFMRgotc3RhdGljIHZvaWQgZG1hX2NvbW1pdChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnVudXNlZCk7Ci0KLWxvbmcgb2t0YWdfdG9faW8obG9uZyAqcGFkZHIsIGxvbmcgKmFkZHIsIGxvbmcgbGVuKTsKLWxvbmcgb2t0YWdfZnJvbV9pbyhsb25nICphZGRyLCBsb25nICpwYWRkciwgbG9uZyBsZW4pOwotCi1zdGF0aWMgREVDTEFSRV9XT1JLKHRxX2Zha2VfZG1hLCBkbWFfY29tbWl0KTsKLQotI2RlZmluZSBETUFfTUFYVFJBTlNGRVIgMHg4MDAwCi0KLSNlbHNlCi0KLS8qCi0gKiBObyBib3R0b20gaGFsZi4gVXNlIHRyYW5zZmVyIGRpcmVjdGx5IGZyb20gSVJRLiBGaW5kIGEgbmFycm93IHBhdGgKLSAqIGJldHdlZW4gdG9vIG11Y2ggSVJRIG92ZXJoZWFkIGFuZCBjbG9nZ2luZyB0aGUgSVJRIGZvciB0b28gbG9uZy4KLSAqLwotCi0jZGVmaW5lIERNQV9NQVhUUkFOU0ZFUiAweDEwMDAKLQotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgb2t0YWdvbl9ub3RpZmllciA9IHsgCi0Jb2t0YWdvbl9ub3RpZnlfcmVib290LAotCU5VTEwsCi0JMAotfTsKLQotc3RhdGljIGxvbmcgKnBhZGRyZXNzOwotc3RhdGljIGxvbmcgKmFkZHJlc3M7Ci1zdGF0aWMgbG9uZyBsZW47Ci1zdGF0aWMgbG9uZyBkbWFfb247Ci1zdGF0aWMgaW50IGRpcmVjdGlvbjsKLXN0YXRpYyBzdHJ1Y3QgTkNSX0VTUCAqY3VycmVudF9lc3A7Ci0KLQotc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgY21kX2J1ZmZlclsxNl07Ci0JCQkJLyogVGhpcyBpcyB3aGVyZSBhbGwgY29tbWFuZHMgYXJlIHB1dAotCQkJCSAqIGJlZm9yZSB0aGV5IGFyZSB0cmFzZmVyZWQgdG8gdGhlIEVTUCBjaGlwCi0JCQkJICogdmlhIFBJTy4KLQkJCQkgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERldGVjdGlvbiAqLwotaW50IG9rdGFnb25fZXNwX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICp0cG50KQotewotCXN0cnVjdCBOQ1JfRVNQICplc3A7Ci0Jc3RydWN0IHpvcnJvX2RldiAqeiA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBhZGRyZXNzOwotCXN0cnVjdCBFU1BfcmVncyAqZXJlZ3M7Ci0KLQl3aGlsZSAoKHogPSB6b3Jyb19maW5kX2RldmljZShaT1JST19QUk9EX0JTQ19PS1RBR09OXzIwMDgsIHopKSkgewotCSAgICB1bnNpZ25lZCBsb25nIGJvYXJkID0gei0+cmVzb3VyY2Uuc3RhcnQ7Ci0JICAgIGlmIChyZXF1ZXN0X21lbV9yZWdpb24oYm9hcmQrT0tUQUdPTl9FU1BfQUREUiwKLQkJCQkgICBzaXplb2Yoc3RydWN0IEVTUF9yZWdzKSwgIk5DUjUzQzl4IikpIHsKLQkJLyoKLQkJICogSXQgaXMgYSBTQ1NJIGNvbnRyb2xsZXIuCi0JCSAqIEhhcmR3aXJlIEhvc3QgYWRhcHRlciB0byBTQ1NJIElEIDcKLQkJICovCi0JCQotCQlhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpWlRXT19WQUREUihib2FyZCk7Ci0JCWVyZWdzID0gKHN0cnVjdCBFU1BfcmVncyAqKShhZGRyZXNzICsgT0tUQUdPTl9FU1BfQUREUik7Ci0KLQkJLyogVGhpcyBsaW5lIHdhcyA1IGxpbmVzIGxvd2VyICovCi0JCWVzcCA9IGVzcF9hbGxvY2F0ZSh0cG50LCAodm9pZCAqKWJvYXJkICsgT0tUQUdPTl9FU1BfQUREUiwgMCk7Ci0KLQkJLyogd2UgaGF2ZSB0byBzaGlmdCB0aGUgcmVnaXN0ZXJzIG9ubHkgb25lIGJpdCBmb3Igb2t0YWdvbiAqLwotCQllc3AtPnNoaWZ0ID0gMTsKLQotCQllc3Bfd3JpdGUoZXJlZ3MtPmVzcF9jZmcxLCAoRVNQX0NPTkZJRzFfUEVOQUJMRSB8IDcpKTsKLQkJdWRlbGF5KDUpOwotCQlpZiAoZXNwX3JlYWQoZXJlZ3MtPmVzcF9jZmcxKSAhPSAoRVNQX0NPTkZJRzFfUEVOQUJMRSB8IDcpKQotCQkJcmV0dXJuIDA7IC8qIEJhaWwgb3V0IGlmIGFkZHJlc3MgZGlkIG5vdCBob2xkIGRhdGEgKi8KLQotCQkvKiBEbyBjb21tYW5kIHRyYW5zZmVyIHdpdGggcHJvZ3JhbW1lZCBJL08gKi8KLQkJZXNwLT5kb19waW9fY21kcyA9IDE7Ci0KLQkJLyogUmVxdWlyZWQgZnVuY3Rpb25zICovCi0JCWVzcC0+ZG1hX2J5dGVzX3NlbnQgPSAmZG1hX2J5dGVzX3NlbnQ7Ci0JCWVzcC0+ZG1hX2Nhbl90cmFuc2ZlciA9ICZkbWFfY2FuX3RyYW5zZmVyOwotCQllc3AtPmRtYV9kdW1wX3N0YXRlID0gJmRtYV9kdW1wX3N0YXRlOwotCQllc3AtPmRtYV9pbml0X3JlYWQgPSAmZG1hX2luaXRfcmVhZDsKLQkJZXNwLT5kbWFfaW5pdF93cml0ZSA9ICZkbWFfaW5pdF93cml0ZTsKLQkJZXNwLT5kbWFfaW50c19vZmYgPSAmZG1hX2ludHNfb2ZmOwotCQllc3AtPmRtYV9pbnRzX29uID0gJmRtYV9pbnRzX29uOwotCQllc3AtPmRtYV9pcnFfcCA9ICZkbWFfaXJxX3A7Ci0JCWVzcC0+ZG1hX3BvcnRzX3AgPSAmZG1hX3BvcnRzX3A7Ci0JCWVzcC0+ZG1hX3NldHVwID0gJmRtYV9zZXR1cDsKLQotCQkvKiBPcHRpb25hbCBmdW5jdGlvbnMgKi8KLQkJZXNwLT5kbWFfYmFycmllciA9IDA7Ci0JCWVzcC0+ZG1hX2RyYWluID0gMDsKLQkJZXNwLT5kbWFfaW52YWxpZGF0ZSA9ICZkbWFfaW52YWxpZGF0ZTsKLQkJZXNwLT5kbWFfaXJxX2VudHJ5ID0gMDsKLQkJZXNwLT5kbWFfaXJxX2V4aXQgPSAmZG1hX2lycV9leGl0OwotCQllc3AtPmRtYV9sZWRfb24gPSAmZG1hX2xlZF9vbjsKLQkJZXNwLT5kbWFfbGVkX29mZiA9ICZkbWFfbGVkX29mZjsKLQkJZXNwLT5kbWFfcG9sbCA9IDA7Ci0JCWVzcC0+ZG1hX3Jlc2V0ID0gMDsKLQotCQllc3AtPmRtYV9tbXVfZ2V0X3Njc2lfb25lID0gJmRtYV9tbXVfZ2V0X3Njc2lfb25lOwotCQllc3AtPmRtYV9tbXVfZ2V0X3Njc2lfc2dsID0gJmRtYV9tbXVfZ2V0X3Njc2lfc2dsOwotCQllc3AtPmRtYV9tbXVfcmVsZWFzZV9zY3NpX29uZSA9ICZkbWFfbW11X3JlbGVhc2Vfc2NzaV9vbmU7Ci0JCWVzcC0+ZG1hX21tdV9yZWxlYXNlX3Njc2lfc2dsID0gJmRtYV9tbXVfcmVsZWFzZV9zY3NpX3NnbDsKLQkJZXNwLT5kbWFfYWR2YW5jZV9zZyA9ICZkbWFfYWR2YW5jZV9zZzsKLQotCQkvKiBTQ1NJIGNoaXAgc3BlZWQgKi8KLQkJLyogTG9va2luZyBhdCB0aGUgcXVhcnR6IG9mIHRoZSBTQ1NJIGJvYXJkLi4uICovCi0JCWVzcC0+Y2ZyZXEgPSAyNTAwMDAwMDsKLQotCQkvKiBUaGUgRE1BIHJlZ2lzdGVycyBvbiB0aGUgQ3liZXJTdG9ybSBhcmUgbWFwcGVkCi0JCSAqIHJlbGF0aXZlIHRvIHRoZSBkZXZpY2UgKGkuZS4gaW4gdGhlIHNhbWUgWm9ycm8KLQkJICogSS9PIGJsb2NrKS4KLQkJICovCi0JCWVzcC0+ZHJlZ3MgPSAodm9pZCAqKShhZGRyZXNzICsgT0tUQUdPTl9ETUFfQUREUik7Ci0KLQkJcGFkZHJlc3MgPSAobG9uZyAqKSBlc3AtPmRyZWdzOwotCi0JCS8qIEVTUCByZWdpc3RlciBiYXNlICovCi0JCWVzcC0+ZXJlZ3MgPSBlcmVnczsKLQkJCi0JCS8qIFNldCB0aGUgY29tbWFuZCBidWZmZXIgKi8KLQkJZXNwLT5lc3BfY29tbWFuZCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKikgY21kX2J1ZmZlcjsKLQotCQkvKiBZZXMsIHRoZSB2aXJ0dWFsIGFkZHJlc3MuIFNlZSBiZWxvdy4gKi8KLQkJZXNwLT5lc3BfY29tbWFuZF9kdm1hID0gKF9fdTMyKSBjbWRfYnVmZmVyOwotCi0JCWVzcC0+aXJxID0gSVJRX0FNSUdBX1BPUlRTOwotCQlyZXF1ZXN0X2lycShJUlFfQU1JR0FfUE9SVFMsIGVzcF9pbnRyLCBJUlFGX1NIQVJFRCwKLQkJCSAgICAiQlNDIE9rdGFnb24gU0NTSSIsIGVzcC0+ZWhvc3QpOwotCi0JCS8qIEZpZ3VyZSBvdXQgb3VyIHNjc2kgSUQgb24gdGhlIGJ1cyAqLwotCQllc3AtPnNjc2lfaWQgPSA3OwotCQkKLQkJLyogV2UgZG9uJ3QgaGF2ZSBhIGRpZmZlcmVudGlhbCBTQ1NJLWJ1cy4gKi8KLQkJZXNwLT5kaWZmID0gMDsKLQotCQllc3BfaW5pdGlhbGl6ZShlc3ApOwotCi0JCXByaW50aygiRVNQX09rdGFnb24gRHJpdmVyIDEuMSIKLSNpZmRlZiBVU0VfQk9UVE9NX0hBTEYKLQkJICAgICAgICIgW0JPVFRPTV9IQUxGXSIKLSNlbHNlCi0JCSAgICAgICAiIFtJUlFdIgotI2VuZGlmCi0JCSAgICAgICAiIHJlZ2lzdGVyZWQuXG4iKTsKLQkJcHJpbnRrKCJFU1A6IFRvdGFsIG9mICVkIEVTUCBob3N0cyBmb3VuZCwgJWQgYWN0dWFsbHkgaW4gdXNlLlxuIiwgbmVzcHMsZXNwc19pbl91c2UpOwotCQllc3BzX3J1bm5pbmcgPSBlc3BzX2luX3VzZTsKLQkJY3VycmVudF9lc3AgPSBlc3A7Ci0JCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmb2t0YWdvbl9ub3RpZmllcik7Ci0JCXJldHVybiBlc3BzX2luX3VzZTsKLQkgICAgfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogT24gY2VydGFpbiBjb25maWd1cmF0aW9ucyB0aGUgU0NTSSBlcXVpcG1lbnQgZ2V0cyBjb25mdXNlZCBvbiByZWJvb3QsCi0gKiBzbyB3ZSBoYXZlIHRvIHJlc2V0IGl0IHRoZW4uCi0gKi8KLQotc3RhdGljIGludAotb2t0YWdvbl9ub3RpZnlfcmVib290KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBjb2RlLCB2b2lkICp4KQotewotICBzdHJ1Y3QgTkNSX0VTUCAqZXNwOwotICAKLSAgaWYoKGNvZGUgPT0gU1lTX0RPV04gfHwgY29kZSA9PSBTWVNfSEFMVCkgJiYgKGVzcCA9IGN1cnJlbnRfZXNwKSkKLSAgIHsKLSAgICBlc3BfYm9vdHVwX3Jlc2V0KGVzcCxlc3AtPmVyZWdzKTsKLSAgICB1ZGVsYXkoNTAwKTsgLyogU2V0dGxlIHRpbWUuIE1heWJlIHVubmVjZXNzYXJ5LiAqLwotICAgfQotICByZXR1cm4gTk9USUZZX0RPTkU7Ci19Ci0gICAgCi0KLQkKLSNpZmRlZiBVU0VfQk9UVE9NX0hBTEYKLQotCi0vKgotICogVGhlIGJzYyBPa3RhZ29uIGNvbnRyb2xsZXIgaGFzIG5vIHJlYWwgRE1BLCBzbyB3ZSBoYXZlIHRvIGRvIHRoZSAnRE1BCi0gKiB0cmFuc2ZlcicgaW4gdGhlIGludGVycnVwdCAoWWlrZXMhKSBvciB1c2UgYSBib3R0b20gaGFsZiB0byBub3QgdG8gY2x1dHRlcgotICogSVJRJ3MgZm9yIGxvbmdlci10aGFuLWdvb2QuCi0gKgotICogRklYTUUKLSAqIEJJRyBQUk9CTEVNOiAnbGVuJyBpcyB1c3VhbGx5IHRoZSBidWZmZXIgbGVuZ3RoLCBub3QgdGhlIGV4cGVjdGVkIGxlbmd0aAotICogb2YgdGhlIGRhdGEuIFNvIERNQSBtYXkgZmluaXNoIHByZW1hdHVyZWx5LCBmdXJ0aGVyIHJlYWRzIGxlYWQgdG8KLSAqICdtYWNoaW5lIGNoZWNrJyBvbiBBUFVTIHN5c3RlbXMgKGRvbid0IGtub3cgYWJvdXQgbTY4ayBzeXN0ZW1zLCBBbWlnYU9TCi0gKiBkZWxpYmVyYXRlbHkgaWdub3JlcyB0aGUgYnVzIGZhdWx0cykgYW5kIGEgbm9ybWFsIGNvcHktbG9vcCBjYW4ndAotICogYmUgZXhpdGVkIHByZW1hdHVyZWx5IGp1c3QgYXQgdGhlIHJpZ2h0IG1vbWVudCBieSB0aGUgZG1hX2ludmFsaWRhdGUgSVJRLgotICogU28gZG8gaXQgdGhlIGhhcmQgd2F5LCB3cml0ZSBhbiBvd24gY29waWVyIGluIGFzc2VtYmxlciBhbmQKLSAqIGNhdGNoIHRoZSBleGNlcHRpb24uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBDYXJzdGVuCi0gKi8KLSAKLSAKLXN0YXRpYyB2b2lkIGRtYV9jb21taXQoc3RydWN0IHdvcmtfc3RydWN0ICp1bnVzZWQpCi17Ci0gICAgbG9uZyB3YWl0LGxlbjIscG9zOwotICAgIHN0cnVjdCBOQ1JfRVNQICplc3A7Ci0KLSAgICBFU1BEQVRBKCgiVHJhbnNmZXI6ICVsZCBieXRlcywgQWRkcmVzcyAweCUwOGxYLCBEaXJlY3Rpb246ICVkXG4iLAotICAgICAgICAgbGVuLChsb25nKSBhZGRyZXNzLGRpcmVjdGlvbikpOwotICAgIGRtYV9pbnRzX29mZihjdXJyZW50X2VzcCk7Ci0KLSAgICBwb3MgPSAwOwotICAgIHdhaXQgPSAxOwotICAgIGlmKGRpcmVjdGlvbikgLyogd3JpdGU/IChtZW1vcnkgdG8gZGV2aWNlKSAqLwotICAgICB7Ci0gICAgICB3aGlsZShsZW4gPiAwKQotICAgICAgIHsKLSAgICAgICAgbGVuMiA9IG9rdGFnX3RvX2lvKHBhZGRyZXNzLCBhZGRyZXNzK3BvcywgbGVuKTsKLQlpZighbGVuMikKLQkgewotCSAgaWYod2FpdCA+IDEwMDApCi0JICAgewotCSAgICBwcmludGsoIkV4cGVkaXRlZCBETUEgZXhpdCAod3JpdGluZykgJWxkXG4iLGxlbik7Ci0JICAgIGJyZWFrOwotCSAgIH0KLQkgIG1kZWxheSh3YWl0KTsKLQkgIHdhaXQgKj0gMjsKLQkgfQotCXBvcyArPSBsZW4yOwotCWxlbiAtPSBsZW4yKnNpemVvZihsb25nKTsKLSAgICAgICB9Ci0gICAgIH0gZWxzZSB7Ci0gICAgICB3aGlsZShsZW4gPiAwKQotICAgICAgIHsKLSAgICAgICAgbGVuMiA9IG9rdGFnX2Zyb21faW8oYWRkcmVzcytwb3MsIHBhZGRyZXNzLCBsZW4pOwotCWlmKCFsZW4yKQotCSB7Ci0JICBpZih3YWl0ID4gMTAwMCkKLQkgICB7Ci0JICAgIHByaW50aygiRXhwZWRpdGVkIERNQSBleGl0IChyZWFkaW5nKSAlbGRcbiIsbGVuKTsKLQkgICAgYnJlYWs7Ci0JICAgfQotCSAgbWRlbGF5KHdhaXQpOwotCSAgd2FpdCAqPSAyOwotCSB9Ci0JcG9zICs9IGxlbjI7Ci0JbGVuIC09IGxlbjIqc2l6ZW9mKGxvbmcpOwotICAgICAgIH0KLSAgICAgfQotCi0gICAgLyogdG8gbWFrZSBlc3AtPnNoaWZ0IHdvcmsgKi8KLSAgICBlc3A9Y3VycmVudF9lc3A7Ci0KLSNpZiAwCi0gICAgbGVuMiA9IChlc3BfcmVhZChjdXJyZW50X2VzcC0+ZXJlZ3MtPmVzcF90Y2xvdykgJiAweGZmKSB8Ci0gICAgICAgICAgICgoZXNwX3JlYWQoY3VycmVudF9lc3AtPmVyZWdzLT5lc3BfdGNtZWQpICYgMHhmZikgPDwgOCk7Ci0KLSAgICAvKgotICAgICAqIFVoIHVoLiBJZiB5b3Ugc2VlIHRoaXMsIGxlbiBhbmQgdHJhbnNmZXIgY291bnQgcmVnaXN0ZXJzIHdlcmUgb3V0IG9mCi0gICAgICogc3luYy4gVGhhdCBtZWFucyByZWFsbHkgc2VyaW91cyB0cm91YmxlLgotICAgICAqLwotCi0gICAgaWYobGVuMikKLSAgICAgIHByaW50aygiRWVlZWshISBUcmFuc2ZlciBjb3VudCBzdGlsbCAlbGQhXG4iLGxlbjIpOwotI2VuZGlmCi0KLSAgICAvKgotICAgICAqIE5vcm1hbGx5IHdlIGp1c3QgbmVlZCB0byBleGl0IGFuZCB3YWl0IGZvciB0aGUgaW50ZXJydXB0IHRvIGNvbWUuCi0gICAgICogQnV0IGF0IGxlYXN0IG9uZSBkZXZpY2UgKG15IE1pY3JvdGVrIFNjYW5NYWtlciA2MzApIHJlZ3VsYXJseSBtaXMtCi0gICAgICogY2FsY3VsYXRlcyB0aGUgYnl0ZXMgaXQgc2hvdWxkIHNlbmQgd2hpY2ggaXMgcmVhbGx5IHVnbHkgYmVjYXVzZQotICAgICAqIGl0IGxvY2tzIHVwIHRoZSBTQ1NJIGJ1cyBpZiBub3QgYWNjb3VudGVkIGZvci4KLSAgICAgKi8KLQotICAgIGlmKCEoZXNwX3JlYWQoY3VycmVudF9lc3AtPmVyZWdzLT5lc3Bfc3RhdHVzKSAmIEVTUF9TVEFUX0lOVFIpKQotICAgICB7Ci0gICAgICBsb25nIGxlbiA9IDEwMDsKLSAgICAgIGxvbmcgdHJhc2hbMTBdOwotCi0gICAgICAvKgotICAgICAgICogSW50ZXJydXB0IGJpdCB3YXMgbm90IHNldC4gRWl0aGVyIHRoZSBkZXZpY2UgaXMganVzdCBwbGFpbiBsYXp5Ci0gICAgICAgKiBzbyB3ZSBnaXZlIGl0IGEgMTAgbXMgY2hhbmNlIG9yLi4uCi0gICAgICAgKi8KLSAgICAgIHdoaWxlKGxlbi0tICYmICghKGVzcF9yZWFkKGN1cnJlbnRfZXNwLT5lcmVncy0+ZXNwX3N0YXR1cykgJiBFU1BfU1RBVF9JTlRSKSkpCi0gICAgICAgIHVkZWxheSgxMDApOwotCi0KLSAgICAgIGlmKCEoZXNwX3JlYWQoY3VycmVudF9lc3AtPmVyZWdzLT5lc3Bfc3RhdHVzKSAmIEVTUF9TVEFUX0lOVFIpKQotICAgICAgIHsKLSAgICAgICAgLyoKLQkgKiBTbyB3ZSB0aGluayB0aGF0IHRoZSB0cmFuc2ZlciBjb3VudCBpcyBvdXQgb2Ygc3luYy4gU2luY2Ugd2UKLQkgKiBoYXZlIGFsbCB3ZSB3YW50IHdlIGFyZSBoYXBweSBhbmQgY2FuIGRpdGNoIHRoZSB0cmFzaC4KLQkgKi8KLQkgCi0gICAgICAgIGxlbiA9IERNQV9NQVhUUkFOU0ZFUjsKLQotICAgICAgICB3aGlsZShsZW4tLSAmJiAoIShlc3BfcmVhZChjdXJyZW50X2VzcC0+ZXJlZ3MtPmVzcF9zdGF0dXMpICYgRVNQX1NUQVRfSU5UUikpKQotICAgICAgICAgIG9rdGFnX2Zyb21faW8odHJhc2gscGFkZHJlc3MsMik7Ci0KLSAgICAgICAgaWYoIShlc3BfcmVhZChjdXJyZW50X2VzcC0+ZXJlZ3MtPmVzcF9zdGF0dXMpICYgRVNQX1NUQVRfSU5UUikpCi0gICAgICAgICB7Ci0gICAgICAgICAgLyoKLSAgICAgICAgICAgKiBUaGluZ3MgcmVhbGx5IGhhdmUgZ29uZSB3cm9uZy4gSWYgd2UgbGVhdmUgdGhlIHN5c3RlbSBpbiB0aGF0Ci0gICAgICAgICAgICogc3RhdGUsIHRoZSBTQ1NJIGJ1cyBpcyBsb2NrZWQgZm9yZXZlci4gSSBob3BlIHRoYXQgdGhpcyB3aWxsCi0gICAgICAgICAgICogdHVybiB0aGUgc3lzdGVtIGluIGEgbW9yZSBvciBsZXNzIHJ1bm5pbmcgc3RhdGUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgcHJpbnRrKCJEZXZpY2UgaXMgYm9saXhlZCwgdHJ5aW5nIGJ1cyByZXNldC4uLlxuIik7Ci0JICBlc3BfYm9vdHVwX3Jlc2V0KGN1cnJlbnRfZXNwLGN1cnJlbnRfZXNwLT5lcmVncyk7Ci0gICAgICAgICB9Ci0gICAgICAgfQotICAgICB9Ci0KLSAgICBFU1BEQVRBKCgiVHJhbnNmZXJfZmluYWxlOiBkb19kYXRhX2ZpbmFsZSBzaG91bGQgY29tZVxuIikpOwotCi0gICAgbGVuID0gMDsKLSAgICBkbWFfb24gPSAwOwotICAgIGRtYV9pbnRzX29uKGN1cnJlbnRfZXNwKTsKLX0KLQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERNQSBGdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgZG1hX2J5dGVzX3NlbnQoc3RydWN0IE5DUl9FU1AgKmVzcCwgaW50IGZpZm9fY291bnQpCi17Ci0JLyogU2luY2UgdGhlIEN5YmVyU3Rvcm0gRE1BIGlzIGZ1bGx5IGRlZGljYXRlZCB0byB0aGUgRVNQIGNoaXAsCi0JICogdGhlIG51bWJlciBvZiBieXRlcyBzZW50ICh0byB0aGUgRVNQIGNoaXApIGVxdWFscyB0aGUgbnVtYmVyCi0JICogb2YgYnl0ZXMgaW4gdGhlIEZJRk8gLSB0aGVyZSBpcyBubyBidWZmZXJpbmcgaW4gdGhlIERNQSBjb250cm9sbGVyLgotCSAqIFhYWFggRG8gSSByZWFkIHRoaXMgcmlnaHQ/IEl0IGlzIGZyb20gaG9zdCB0byBFU1AsIHJpZ2h0PwotCSAqLwotCXJldHVybiBmaWZvX2NvdW50OwotfQotCi1zdGF0aWMgaW50IGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCkKLXsKLQl1bnNpZ25lZCBsb25nIHN6ID0gc3AtPlNDcC50aGlzX3Jlc2lkdWFsOwotCWlmKHN6ID4gRE1BX01BWFRSQU5TRkVSKQotCQlzeiA9IERNQV9NQVhUUkFOU0ZFUjsKLQlyZXR1cm4gc3o7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci19Ci0KLS8qCi0gKiBXaGF0IHRoZSBmJEAmIGlzIHRoaXM/Ci0gKgotICogU29tZSBTQ1NJIGRldmljZXMgKGxpa2UgbXkgTWljcm90ZWsgU2Nhbk1ha2VyIDYzMCBzY2FubmVyKSB3YW50IHRvIHRyYW5zZmVyCi0gKiBtb3JlIGRhdGEgdGhhbiByZXF1ZXN0ZWQuIEhvdyBtdWNoPyBEdW5uby4gU28gZGl0Y2ggdGhlIGJvZ3VzIGRhdGEgaW50bwotICogdGhlIHNpbmssIGhvcGluZyB0aGUgZGV2aWNlIHdpbGwgYWR2YW5jZSB0byB0aGUgbmV4dCBwaGFzZSBzb29uZXIgb3IgbGF0ZXIuCi0gKgotICogICAgICAgICAgICAgICAgICAgICAgICAgLS0gQ2Fyc3RlbgotICovCi0KLXN0YXRpYyBsb25nIG9rdGFnX2V2YV9idWZmZXJbMTZdOyAvKiBUaGUgZGF0YSBzaW5rICovCi0KLXN0YXRpYyB2b2lkIG9rdGFnX2NoZWNrX2RtYSh2b2lkKQotewotICBzdHJ1Y3QgTkNSX0VTUCAqZXNwOwotCi0gIGVzcD1jdXJyZW50X2VzcDsKLSAgaWYoIWxlbikKLSAgIHsKLSAgICBhZGRyZXNzID0gb2t0YWdfZXZhX2J1ZmZlcjsKLSAgICBsZW4gPSAyOwotICAgIC8qIGVzcF9kb19kYXRhIHNldHMgdGhlbSB0byB6ZXJvIGxpa2UgbGVuICovCi0gICAgZXNwX3dyaXRlKGN1cnJlbnRfZXNwLT5lcmVncy0+ZXNwX3RjbG93LDIpOwotICAgIGVzcF93cml0ZShjdXJyZW50X2VzcC0+ZXJlZ3MtPmVzcF90Y21lZCwwKTsKLSAgIH0KLX0KLQotc3RhdGljIHZvaWQgZG1hX2luaXRfcmVhZChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiB2YWRkcmVzcywgaW50IGxlbmd0aCkKLXsKLQkvKiBab3JybyBpcyBub25jYWNoZWQsIGV2ZXJ5dGhpbmcgZWxzZSBkb25lIHVzaW5nIHByb2Nlc3Nvci4gKi8KLQkvKiBjYWNoZV9jbGVhcihhZGRyLCBsZW5ndGgpOyAqLwotCQotCWlmKGRtYV9vbikKLQkgIHBhbmljKCJkbWFfaW5pdF9yZWFkIHdoaWxlIGRtYSBwcm9jZXNzIGlzIGluaXRpYWxpemVkL3J1bm5pbmchXG4iKTsKLQlkaXJlY3Rpb24gPSAwOwotCWFkZHJlc3MgPSAobG9uZyAqKSB2YWRkcmVzczsKLQljdXJyZW50X2VzcCA9IGVzcDsKLQlsZW4gPSBsZW5ndGg7Ci0Jb2t0YWdfY2hlY2tfZG1hKCk7Ci0gICAgICAgIGRtYV9vbiA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9pbml0X3dyaXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKQotewotCS8qIGNhY2hlX3B1c2goYWRkciwgbGVuZ3RoKTsgKi8KLQotCWlmKGRtYV9vbikKLQkgIHBhbmljKCJkbWFfaW5pdF93cml0ZSB3aGlsZSBkbWEgcHJvY2VzcyBpcyBpbml0aWFsaXplZC9ydW5uaW5nIVxuIik7Ci0JZGlyZWN0aW9uID0gMTsKLQlhZGRyZXNzID0gKGxvbmcgKikgdmFkZHJlc3M7Ci0JY3VycmVudF9lc3AgPSBlc3A7Ci0JbGVuID0gbGVuZ3RoOwotCW9rdGFnX2NoZWNrX2RtYSgpOwotCWRtYV9vbiA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9pbnRzX29mZihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotCWRpc2FibGVfaXJxKGVzcC0+aXJxKTsKLX0KLQotc3RhdGljIHZvaWQgZG1hX2ludHNfb24oc3RydWN0IE5DUl9FU1AgKmVzcCkKLXsKLQllbmFibGVfaXJxKGVzcC0+aXJxKTsKLX0KLQotc3RhdGljIGludCBkbWFfaXJxX3Aoc3RydWN0IE5DUl9FU1AgKmVzcCkKLXsKLQkvKiBJdCdzIGltcG9ydGFudCB0byBjaGVjayB0aGUgRE1BIElSUSBiaXQgaW4gdGhlIGNvcnJlY3Qgd2F5ISAqLwotCXJldHVybiAoZXNwX3JlYWQoZXNwLT5lcmVncy0+ZXNwX3N0YXR1cykgJiBFU1BfU1RBVF9JTlRSKTsKLX0KLQotc3RhdGljIHZvaWQgZG1hX2xlZF9vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCkKLXsKLX0KLQotc3RhdGljIHZvaWQgZG1hX2xlZF9vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotfQotCi1zdGF0aWMgaW50IGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci0JcmV0dXJuICgoYW1pZ2FfY3VzdG9tLmludGVuYXIpICYgSUZfUE9SVFMpOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfc2V0dXAoc3RydWN0IE5DUl9FU1AgKmVzcCwgX191MzIgYWRkciwgaW50IGNvdW50LCBpbnQgd3JpdGUpCi17Ci0JLyogT24gdGhlIFNwYXJjLCBETUFfU1RfV1JJVEUgbWVhbnMgIm1vdmUgZGF0YSBmcm9tIGRldmljZSB0byBtZW1vcnkiCi0JICogc28gd2hlbiAod3JpdGUpIGlzIHRydWUsIGl0IGFjdHVhbGx5IG1lYW5zIFJFQUQhCi0JICovCi0JaWYod3JpdGUpewotCQlkbWFfaW5pdF9yZWFkKGVzcCwgYWRkciwgY291bnQpOwotCX0gZWxzZSB7Ci0JCWRtYV9pbml0X3dyaXRlKGVzcCwgYWRkciwgY291bnQpOwotCX0KLX0KLQotLyoKLSAqIElSUSBlbnRyeSB3aGVuIERNQSB0cmFuc2ZlciBpcyByZWFkeSB0byBiZSBzdGFydGVkCi0gKi8KLQotc3RhdGljIHZvaWQgZG1hX2lycV9leGl0KHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci0jaWZkZWYgVVNFX0JPVFRPTV9IQUxGCi0JaWYoZG1hX29uKQotCSB7Ci0JICBzY2hlZHVsZV93b3JrKCZ0cV9mYWtlX2RtYSk7Ci0JIH0KLSNlbHNlCi0Jd2hpbGUobGVuICYmICFkbWFfaXJxX3AoZXNwKSkKLQkgewotCSAgaWYoZGlyZWN0aW9uKQotCSAgICAqcGFkZHJlc3MgPSAqYWRkcmVzcysrOwotCSAgIGVsc2UKLQkgICAgKmFkZHJlc3MrKyA9ICpwYWRkcmVzczsKLQkgIGxlbiAtPSAoc2l6ZW9mKGxvbmcpKTsKLQkgfQotCWxlbiA9IDA7Ci0gICAgICAgIGRtYV9vbiA9IDA7Ci0jZW5kaWYKLX0KLQotLyoKLSAqIElSUSBlbnRyeSB3aGVuIERNQSBoYXMganVzdCBmaW5pc2hlZAotICovCi0KLXN0YXRpYyB2b2lkIGRtYV9pbnZhbGlkYXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci19Ci0KLS8qCi0gKiBTaW5jZSB0aGUgcHJvY2Vzc29yIGRvZXMgdGhlIGRhdGEgdHJhbnNmZXIgd2UgaGF2ZSB0byB1c2UgdGhlIGN1c3RvbQotICogbW11IGludGVyZmFjZSB0byBwYXNzIHRoZSB2aXJ0dWFsIGFkZHJlc3MsIG5vdCB0aGUgcGh5c2ljYWwuCi0gKi8KLQotdm9pZCBkbWFfbW11X2dldF9zY3NpX29uZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKQotewotICAgICAgICBzcC0+U0NwLnB0ciA9Ci0gICAgICAgICAgICAgICAgc3AtPnJlcXVlc3RfYnVmZmVyOwotfQotCi12b2lkIGRtYV9tbXVfZ2V0X3Njc2lfc2dsKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCi17Ci0gICAgICAgIHNwLT5TQ3AucHRyID0gc2dfdmlydChzcC0+U0NwLmJ1ZmZlcik7Ci19Ci0KLXZvaWQgZG1hX21tdV9yZWxlYXNlX3Njc2lfb25lKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCi17Ci19Ci0KLXZvaWQgZG1hX21tdV9yZWxlYXNlX3Njc2lfc2dsKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApCi17Ci19Ci0KLXZvaWQgZG1hX2FkdmFuY2Vfc2coU2NzaV9DbW5kICpzcCkKLXsKLQlzcC0+U0NwLnB0ciA9IHNnX3ZpcnQoc3AtPlNDcC5idWZmZXIpOwotfQotCi0KLSNkZWZpbmUgSE9TVFNfQwotCi1pbnQgb2t0YWdvbl9lc3BfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKLXsKLSNpZmRlZiBNT0RVTEUKLQl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSAodW5zaWduZWQgbG9uZykoKHN0cnVjdCBOQ1JfRVNQICopaW5zdGFuY2UtPmhvc3RkYXRhKS0+ZWRldjsKLQllc3BfcmVsZWFzZSgpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihhZGRyZXNzLCBzaXplb2Yoc3RydWN0IEVTUF9yZWdzKSk7Ci0JZnJlZV9pcnEoSVJRX0FNSUdBX1BPUlRTLCBlc3BfaW50cik7Ci0JdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJm9rdGFnb25fbm90aWZpZXIpOwotI2VuZGlmCi0JcmV0dXJuIDE7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0gewotCS5wcm9jX25hbWUJCT0gImVzcC1va3RhZ29uIiwKLQkucHJvY19pbmZvCQk9ICZlc3BfcHJvY19pbmZvLAotCS5uYW1lCQkJPSAiQlNDIE9rdGFnb24gU0NTSSIsCi0JLmRldGVjdAkJCT0gb2t0YWdvbl9lc3BfZGV0ZWN0LAotCS5zbGF2ZV9hbGxvYwkJPSBlc3Bfc2xhdmVfYWxsb2MsCi0JLnNsYXZlX2Rlc3Ryb3kJCT0gZXNwX3NsYXZlX2Rlc3Ryb3ksCi0JLnJlbGVhc2UJCT0gb2t0YWdvbl9lc3BfcmVsZWFzZSwKLQkucXVldWVjb21tYW5kCQk9IGVzcF9xdWV1ZSwKLQkuZWhfYWJvcnRfaGFuZGxlcgk9IGVzcF9hYm9ydCwKLQkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJPSBlc3BfcmVzZXQsCi0JLmNhbl9xdWV1ZQkJPSA3LAotCS50aGlzX2lkCQk9IDcsCi0JLnNnX3RhYmxlc2l6ZQkJPSBTR19BTEwsCi0JLmNtZF9wZXJfbHVuCQk9IDEsCi0JLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HCi19OwotCi0KLSNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvb2t0YWdvbl9pby5TIGIvZHJpdmVycy9zY3NpL29rdGFnb25faW8uUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE3MzQwYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Njc2kvb2t0YWdvbl9pby5TCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qIC0qLSBtb2RlOiBhc20gLSotCi0gKiBEdWUgdG8gcHJvYmxlbXMgd2hpbGUgdHJhbnNmZXJyaW5nIGRhdGEgSSd2ZSBwdXQgdGhlc2Ugcm91dGluZXMgYXMgYXNzZW1ibHkKLSAqIGNvZGUuCi0gKiBTaW5jZSBJJ20gbm8gUFBDIGFzc2VtYmxlciBndXJ1LCB0aGUgY29kZSBpcyBqdXN0IHRoZSBhc3NlbWJsZXIgdmVyc2lvbiBvZgotCi1pbnQgb2t0YWdfdG9faW8obG9uZyAqcGFkZHIsbG9uZyAqYWRkcixsb25nIGxlbikKLXsKLSAgbG9uZyAqYWRkcjIgPSBhZGRyOwotICBmb3IobGVuPShsZW4rc2l6ZW9mKGxvbmcpLTEpL3NpemVvZihsb25nKTtsZW4tLTspCi0gICAgKnBhZGRyID0gKmFkZHIyKys7Ci0gIHJldHVybiBhZGRyMiAtIGFkZHI7Ci19Ci0KLWludCBva3RhZ19mcm9tX2lvKGxvbmcgKmFkZHIsbG9uZyAqcGFkZHIsbG9uZyBsZW4pCi17Ci0gIGxvbmcgKmFkZHIyID0gYWRkcjsKLSAgZm9yKGxlbj0obGVuK3NpemVvZihsb25nKS0xKS9zaXplb2YobG9uZyk7bGVuLS07KQotICAgICphZGRyMisrID0gKnBhZGRyOwotICByZXR1cm4gYWRkcjIgLSBhZGRyOwotfQotCi0gKiBhc3NlbWJsZWQgdXNpbmcgZ2NjIC1PMiAtUywgd2l0aCB0d28gZXhjZXB0aW9uIGNhdGNoIHBvaW50cyB3aGVyZSBkYXRhCi0gKiBpcyBtb3ZlZCB0by9mcm9tIHRoZSBJTyByZWdpc3Rlci4KLSAqLwotCi0KLSNpZmRlZiBDT05GSUdfQVBVUwotCi0JLmZpbGUJIm9rdGFnb25faW8uYyIKLQotZ2NjMl9jb21waWxlZC46Ci0vKgotCS5zZWN0aW9uICIudGV4dCIKLSovCi0JLmFsaWduIDIKLQkuZ2xvYmwgb2t0YWdfdG9faW8KLQkudHlwZQkgb2t0YWdfdG9faW8sQGZ1bmN0aW9uCi1va3RhZ190b19pbzoKLQlhZGRpIDUsNSwzCi0Jc3J3aSA1LDUsMgotCWNtcHdpIDEsNSwwCi0JbXIgOSwzCi0JbXIgMyw0Ci0JYWRkaSA1LDUsLTEKLQliYyAxMiw2LC5MMwotLkw1OgotCWNtcHdpIDEsNSwwCi0JbHd6IDAsMCgzKQotCWFkZGkgMywzLDQKLQlhZGRpIDUsNSwtMQotZXhwMToJc3R3IDAsMCg5KQotCWJjIDQsNiwuTDUKLS5MMzoKLXJldDE6CXN1YmYgMyw0LDMKLQlzcmF3aSAzLDMsMgotCWJscgotLkxmZTE6Ci0JLnNpemUJIG9rdGFnX3RvX2lvLC5MZmUxLW9rdGFnX3RvX2lvCi0JLmFsaWduIDIKLQkuZ2xvYmwgb2t0YWdfZnJvbV9pbwotCS50eXBlCSBva3RhZ19mcm9tX2lvLEBmdW5jdGlvbgotb2t0YWdfZnJvbV9pbzoKLQlhZGRpIDUsNSwzCi0Jc3J3aSA1LDUsMgotCWNtcHdpIDEsNSwwCi0JbXIgOSwzCi0JYWRkaSA1LDUsLTEKLQliYyAxMiw2LC5MOQotLkwxMToKLQljbXB3aSAxLDUsMAotZXhwMjoJbHd6IDAsMCg0KQotCWFkZGkgNSw1LC0xCi0Jc3R3IDAsMCgzKQotCWFkZGkgMywzLDQKLQliYyA0LDYsLkwxMQotLkw5OgotcmV0MjoJc3ViZiAzLDksMwotCXNyYXdpIDMsMywyCi0JYmxyCi0uTGZlMjoKLQkuc2l6ZQkgb2t0YWdfZnJvbV9pbywuTGZlMi1va3RhZ19mcm9tX2lvCi0JLmlkZW50CSJHQ0M6IChHTlUpIGVnY3MtMi45MC4yOSA5ODA1MTUgKGVnY3MtMS4wLjMgcmVsZWFzZSkiCi0KLS8qCi0gKiBFeGNlcHRpb24gdGFibGUuCi0gKiBTZWNvbmQgbG9uZ3dvcmQgc2hvd3Mgd2hlcmUgdG8ganVtcCB3aGVuIGFuIGV4Y2VwdGlvbiBhdCB0aGUgYWRkciB0aGUgZmlyc3QKLSAqIGxvbmd3b3JkIGlzIHBvaW50aW5nIHRvIGlzIGNhdWdodC4KLSAqLwotCi0uc2VjdGlvbiBfX2V4X3RhYmxlLCJhIgotCS5hbGlnbgkyCi1va3RhZ29uX2V4Y2VwdDoKLQkubG9uZwlleHAxLHJldDEKLQkubG9uZwlleHAyLHJldDIKLQotI2Vsc2UKLQotLyoKLVRoZSBjb2RlIHdoaWNoIGZvbGxvd3MgaXMgZm9yIDY4MHgwIGJhc2VkIGFzc2VtYmxlciBhbmQgaXMgbWVhbnQgZm9yCi1MaW51eC9tNjhrLiBJdCB3YXMgY3JlYXRlZCBieSBjcm9zcyBjb21waWxpbmcgdGhlIGNvZGUgdXNpbmcgdGhlCi1pbnN0cnVjdGlvbnMgZ2l2ZW4gYWJvdmUuIEkgdGhlbiBhZGRlZCB0aGUgZm91ciBsYWJlbHMgdXNlZCBpbiB0aGUKLWV4Y2VwdGlvbiBoYW5kbGVyIHRhYmxlIGF0IHRoZSBib3R0b20gb2YgdGhpcyBmaWxlLgotLSBLZXZpbiA8a2NvemVuc0BpbnRlcmxvZy5jb20+Ci0qLwotCi0jaWZkZWYgQ09ORklHX0FNSUdBCi0KLQkuZmlsZQkib2t0YWdvbl9pby5jIgotCS52ZXJzaW9uCSIwMS4wMSIKLWdjYzJfY29tcGlsZWQuOgotLnRleHQKLQkuYWxpZ24gCTIKLS5nbG9ibCBva3RhZ190b19pbwotCS50eXBlCSBva3RhZ190b19pbyxAZnVuY3Rpb24KLW9rdGFnX3RvX2lvOgotCWxpbmsudyAlYTYsIzAKLQltb3ZlLmwgJWQyLC0oJXNwKQotCW1vdmUubCA4KCVhNiksJWExCi0JbW92ZS5sIDEyKCVhNiksJWQxCi0JbW92ZS5sICVkMSwlYTAKLQltb3ZlLmwgMTYoJWE2KSwlZDAKLQlhZGRxLmwgIzMsJWQwCi0JbHNyLmwgIzIsJWQwCi0Jc3VicS5sICMxLCVkMAotCW1vdmVxLmwgIy0xLCVkMgotCWNtcC5sICVkMCwlZDIKLQlqYmVxIC5MMwotLkw1OgotZXhwMToKLQltb3ZlLmwgKCVhMCkrLCglYTEpCi0JZGJyYSAlZDAsLkw1Ci0JY2xyLncgJWQwCi0Jc3VicS5sICMxLCVkMAotCWpiY2MgLkw1Ci0uTDM6Ci1yZXQxOgotCW1vdmUubCAlYTAsJWQwCi0Jc3ViLmwgJWQxLCVkMAotCWFzci5sICMyLCVkMAotCW1vdmUubCAtNCglYTYpLCVkMgotCXVubGsgJWE2Ci0JcnRzCi0KLS5MZmUxOgotCS5zaXplCSBva3RhZ190b19pbywuTGZlMS1va3RhZ190b19pbwotCS5hbGlnbiAJMgotLmdsb2JsIG9rdGFnX2Zyb21faW8KLQkudHlwZQkgb2t0YWdfZnJvbV9pbyxAZnVuY3Rpb24KLW9rdGFnX2Zyb21faW86Ci0JbGluay53ICVhNiwjMAotCW1vdmUubCAlZDIsLSglc3ApCi0JbW92ZS5sIDgoJWE2KSwlZDEKLQltb3ZlLmwgMTIoJWE2KSwlYTEKLQltb3ZlLmwgJWQxLCVhMAotCW1vdmUubCAxNiglYTYpLCVkMAotCWFkZHEubCAjMywlZDAKLQlsc3IubCAjMiwlZDAKLQlzdWJxLmwgIzEsJWQwCi0JbW92ZXEubCAjLTEsJWQyCi0JY21wLmwgJWQwLCVkMgotCWpiZXEgLkw5Ci0uTDExOgotZXhwMjoKLQltb3ZlLmwgKCVhMSksKCVhMCkrCi0JZGJyYSAlZDAsLkwxMQotCWNsci53ICVkMAotCXN1YnEubCAjMSwlZDAKLQlqYmNjIC5MMTEKLS5MOToKLXJldDI6Ci0JbW92ZS5sICVhMCwlZDAKLQlzdWIubCAlZDEsJWQwCi0JYXNyLmwgIzIsJWQwCi0JbW92ZS5sIC00KCVhNiksJWQyCi0JdW5sayAlYTYKLQlydHMKLS5MZmUyOgotCS5zaXplCSBva3RhZ19mcm9tX2lvLC5MZmUyLW9rdGFnX2Zyb21faW8KLQkuaWRlbnQJIkdDQzogKEdOVSkgMi43LjIuMSIKLQotLyoKLSAqIEV4Y2VwdGlvbiB0YWJsZS4KLSAqIFNlY29uZCBsb25nd29yZCBzaG93cyB3aGVyZSB0byBqdW1wIHdoZW4gYW4gZXhjZXB0aW9uIGF0IHRoZSBhZGRyIHRoZSBmaXJzdAotICogbG9uZ3dvcmQgaXMgcG9pbnRpbmcgdG8gaXMgY2F1Z2h0LgotICovCi0KLS5zZWN0aW9uIF9fZXhfdGFibGUsImEiCi0JLmFsaWduCTIKLW9rdGFnb25fZXhjZXB0OgotCS5sb25nCWV4cDEscmV0MQotCS5sb25nCWV4cDIscmV0MgotCi0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BzM3JvbS5jIGIvZHJpdmVycy9zY3NpL3BzM3JvbS5jCmluZGV4IDE3YjRhN2MuLjBjZDYxNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wczNyb20uYworKysgYi9kcml2ZXJzL3Njc2kvcHMzcm9tLmMKQEAgLTM1LDcgKzM1LDcgQEAKIAogI2RlZmluZSBCT1VOQ0VfU0laRQkJCSg2NCoxMDI0KQogCi0jZGVmaW5lIFBTM1JPTV9NQVhfU0VDVE9SUwkJKEJPVU5DRV9TSVpFIC8gQ0RfRlJBTUVTSVpFKQorI2RlZmluZSBQUzNST01fTUFYX1NFQ1RPUlMJCShCT1VOQ0VfU0laRSA+PiA5KQogCiAKIHN0cnVjdCBwczNyb21fcHJpdmF0ZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYwppbmRleCBhZGY5NzMyLi40ODk0ZGM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKQEAgLTQyOCw2ICs0MjgsMTkgQEAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgb2ZmICE9IDAgfHwgY291bnQgIT0gU0ZQX0RFVl9TSVpFICogMikKIAkJcmV0dXJuIDA7CiAKKwlpZiAoaGEtPnNmcF9kYXRhKQorCQlnb3RvIGRvX3JlYWQ7CisKKwloYS0+c2ZwX2RhdGEgPSBkbWFfcG9vbF9hbGxvYyhoYS0+c19kbWFfcG9vbCwgR0ZQX0tFUk5FTCwKKwkgICAgJmhhLT5zZnBfZGF0YV9kbWEpOworCWlmICghaGEtPnNmcF9kYXRhKSB7CisJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBTRlAgcmVhZC1kYXRhLlxuIik7CisJCXJldHVybiAwOworCX0KKworZG9fcmVhZDoKKwltZW1zZXQoaGEtPnNmcF9kYXRhLCAwLCBTRlBfQkxPQ0tfU0laRSk7CiAJYWRkciA9IDB4YTA7CiAJZm9yIChpdGVyID0gMCwgb2Zmc2V0ID0gMDsgaXRlciA8IChTRlBfREVWX1NJWkUgKiAyKSAvIFNGUF9CTE9DS19TSVpFOwogCSAgICBpdGVyKyssIG9mZnNldCArPSBTRlBfQkxPQ0tfU0laRSkgewpAQCAtODM1LDcgKzg0OCw3IEBACiBzdGF0aWMgdm9pZAogcWxhMngwMF9nZXRfaG9zdF9zcGVlZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKIHsKLQlzY3NpX3FsYV9ob3N0X3QgKmhhID0gc2hvc3RfcHJpdihzaG9zdCk7CisJc2NzaV9xbGFfaG9zdF90ICpoYSA9IHRvX3FsYV9wYXJlbnQoc2hvc3RfcHJpdihzaG9zdCkpOwogCXVpbnQzMl90IHNwZWVkID0gMDsKIAogCXN3aXRjaCAoaGEtPmxpbmtfZGF0YV9yYXRlKSB7CkBAIC04NDgsNiArODYxLDkgQEAKIAljYXNlIFBPUlRfU1BFRURfNEdCOgogCQlzcGVlZCA9IDQ7CiAJCWJyZWFrOworCWNhc2UgUE9SVF9TUEVFRF84R0I6CisJCXNwZWVkID0gODsKKwkJYnJlYWs7CiAJfQogCWZjX2hvc3Rfc3BlZWQoc2hvc3QpID0gc3BlZWQ7CiB9CkBAIC04NTUsNyArODcxLDcgQEAKIHN0YXRpYyB2b2lkCiBxbGEyeDAwX2dldF9ob3N0X3BvcnRfdHlwZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKIHsKLQlzY3NpX3FsYV9ob3N0X3QgKmhhID0gc2hvc3RfcHJpdihzaG9zdCk7CisJc2NzaV9xbGFfaG9zdF90ICpoYSA9IHRvX3FsYV9wYXJlbnQoc2hvc3RfcHJpdihzaG9zdCkpOwogCXVpbnQzMl90IHBvcnRfdHlwZSA9IEZDX1BPUlRUWVBFX1VOS05PV047CiAKIAlzd2l0Y2ggKGhhLT5jdXJyZW50X3RvcG9sb2d5KSB7CkBAIC05NjUsNyArOTgxLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgZmNfaG9zdF9zdGF0aXN0aWNzICoKIHFsYTJ4MDBfZ2V0X2ZjX2hvc3Rfc3RhdHMoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7Ci0Jc2NzaV9xbGFfaG9zdF90ICpoYSA9IHNob3N0X3ByaXYoc2hvc3QpOworCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSB0b19xbGFfcGFyZW50KHNob3N0X3ByaXYoc2hvc3QpKTsKIAlpbnQgcnZhbDsKIAlzdHJ1Y3QgbGlua19zdGF0aXN0aWNzICpzdGF0czsKIAlkbWFfYWRkcl90IHN0YXRzX2RtYTsKQEAgLTEwNDksNyArMTA2NSw3IEBACiBzdGF0aWMgdm9pZAogcWxhMngwMF9nZXRfaG9zdF9wb3J0X3N0YXRlKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KQogewotCXNjc2lfcWxhX2hvc3RfdCAqaGEgPSBzaG9zdF9wcml2KHNob3N0KTsKKwlzY3NpX3FsYV9ob3N0X3QgKmhhID0gdG9fcWxhX3BhcmVudChzaG9zdF9wcml2KHNob3N0KSk7CiAKIAlpZiAoIWhhLT5mbGFncy5vbmxpbmUpCiAJCWZjX2hvc3RfcG9ydF9zdGF0ZShzaG9zdCkgPSBGQ19QT1JUU1RBVEVfT0ZGTElORTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaAppbmRleCBiNzJjN2YxLi4zNzUwMzE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGVmLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oCkBAIC0yMDQxLDggKzIwNDEsNiBAQAogI2RlZmluZSBWUF9SRVRfQ09ERV9OT19NRU0JCTUKICNkZWZpbmUgVlBfUkVUX0NPREVfTk9UX0ZPVU5ECQk2CiAKLSNkZWZpbmUgdG9fcWxhX3BhcmVudCh4KSAoKCh4KS0+cGFyZW50KSA/ICh4KS0+cGFyZW50IDogKHgpKQotCiAvKgogICogSVNQIG9wZXJhdGlvbnMKICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oCmluZGV4IGJhMzVmYzIuLjE5M2Y2ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmgKQEAgLTY2LDYgKzY2LDcgQEAKIGV4dGVybiBpbnQgbnVtX2hvc3RzOwogCiBleHRlcm4gaW50IHFsYTJ4MDBfbG9vcF9yZXNldChzY3NpX3FsYV9ob3N0X3QgKik7CitleHRlcm4gdm9pZCBxbGEyeDAwX2Fib3J0X2FsbF9jbWRzKHNjc2lfcWxhX2hvc3RfdCAqLCBpbnQpOwogCiAvKgogICogR2xvYmFsIEZ1bmN0aW9ucyBpbiBxbGFfbWlkLmMgc291cmNlIGZpbGUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYwppbmRleCBkMDYzM2NhLi5kNWM3ODUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKQEAgLTkyNSw2ICs5MjUsMTYgQEAKIHsKIAlpbnQgcnZhbDsKIAl1aW50MzJfdCBzcmlzY19hZGRyZXNzID0gMDsKKwlzdHJ1Y3QgZGV2aWNlX3JlZ18yeHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3A7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghSVNfRldJMl9DQVBBQkxFKGhhKSAmJiAhSVNfUUxBMjEwMChoYSkgJiYgIUlTX1FMQTIyMDAoaGEpKSB7CisJCS8qIERpc2FibGUgU1JBTSwgSW5zdHJ1Y3Rpb24gUkFNIGFuZCBHUCBSQU0gcGFyaXR5LiAgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCAoSENDUl9FTkFCTEVfUEFSSVRZICsgMHgwKSk7CisJCVJEX1JFR19XT1JEKCZyZWctPmhjY3IpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCX0KIAogCS8qIExvYWQgZmlybXdhcmUgc2VxdWVuY2VzICovCiAJcnZhbCA9IGhhLT5pc3Bfb3BzLT5sb2FkX3Jpc2MoaGEsICZzcmlzY19hZGRyZXNzKTsKQEAgLTk2OCw2ICs5NzgsMTkgQEAKIAkJfQogCX0KIAorCWlmICghSVNfRldJMl9DQVBBQkxFKGhhKSAmJiAhSVNfUUxBMjEwMChoYSkgJiYgIUlTX1FMQTIyMDAoaGEpKSB7CisJCS8qIEVuYWJsZSBwcm9wZXIgcGFyaXR5LiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwkJaWYgKElTX1FMQTIzMDAoaGEpKQorCQkJLyogU1JBTSBwYXJpdHkgKi8KKwkJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCBIQ0NSX0VOQUJMRV9QQVJJVFkgKyAweDEpOworCQllbHNlCisJCQkvKiBTUkFNLCBJbnN0cnVjdGlvbiBSQU0gYW5kIEdQIFJBTSBwYXJpdHkgKi8KKwkJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCBIQ0NSX0VOQUJMRV9QQVJJVFkgKyAweDcpOworCQlSRF9SRUdfV09SRCgmcmVnLT5oY2NyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwl9CisKIAlpZiAocnZhbCkgewogCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogU2V0dXAgY2hpcCAqKioqIEZBSUxFRCAqKioqLlxuIiwKIAkJICAgIGhhLT5ob3N0X25vKSk7CkBAIC0zMjEzLDkgKzMyMzYsNiBAQAogcWxhMngwMF9hYm9ydF9pc3Aoc2NzaV9xbGFfaG9zdF90ICpoYSkKIHsKIAlpbnQgcnZhbDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQl1aW50MTZfdCAgICAgICBjbnQ7Ci0Jc3JiX3QgICAgICAgICAgKnNwOwogCXVpbnQ4X3QgICAgICAgIHN0YXR1cyA9IDA7CiAKIAlpZiAoaGEtPmZsYWdzLm9ubGluZSkgewpAQCAtMzIzNiwxOSArMzI1Niw4IEBACiAJCQkJICAgIExPT1BfRE9XTl9USU1FKTsKIAkJfQogCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCQkvKiBSZXF1ZXVlIGFsbCBjb21tYW5kcyBpbiBvdXRzdGFuZGluZyBjb21tYW5kIGxpc3QuICovCi0JCWZvciAoY250ID0gMTsgY250IDwgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTOyBjbnQrKykgewotCQkJc3AgPSBoYS0+b3V0c3RhbmRpbmdfY21kc1tjbnRdOwotCQkJaWYgKHNwKSB7Ci0JCQkJaGEtPm91dHN0YW5kaW5nX2NtZHNbY250XSA9IE5VTEw7Ci0JCQkJc3AtPmZsYWdzID0gMDsKLQkJCQlzcC0+Y21kLT5yZXN1bHQgPSBESURfUkVTRVQgPDwgMTY7Ci0JCQkJc3AtPmNtZC0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopTlVMTDsKLQkJCQlxbGEyeDAwX3NwX2NvbXBsKGhhLCBzcCk7Ci0JCQl9Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwkJcWxhMngwMF9hYm9ydF9hbGxfY21kcyhoYSwgRElEX1JFU0VUIDw8IDE2KTsKIAogCQloYS0+aXNwX29wcy0+Z2V0X2ZsYXNoX3ZlcnNpb24oaGEsIGhhLT5yZXF1ZXN0X3JpbmcpOwogCkBAIC0zMjczLDYgKzMyODIsNyBAQAogCQkJY2xlYXJfYml0KElTUF9BQk9SVF9SRVRSWSwgJmhhLT5kcGNfZmxhZ3MpOwogCiAJCQlpZiAoaGEtPmVmdCkgeworCQkJCW1lbXNldChoYS0+ZWZ0LCAwLCBFRlRfU0laRSk7CiAJCQkJcnZhbCA9IHFsYTJ4MDBfZW5hYmxlX2VmdF90cmFjZShoYSwKIAkJCQkgICAgaGEtPmVmdF9kbWEsIEVGVF9OVU1fQlVGRkVSUyk7CiAJCQkJaWYgKHJ2YWwpIHsKQEAgLTMzNTcsNjAgKzMzNjcsMTUgQEAKIHFsYTJ4MDBfcmVzdGFydF9pc3Aoc2NzaV9xbGFfaG9zdF90ICpoYSkKIHsKIAl1aW50OF90CQlzdGF0dXMgPSAwOwotCXN0cnVjdCBkZXZpY2VfcmVnXzJ4eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDsKLQl1bnNpZ25lZCBsb25nCWZsYWdzID0gMDsKIAl1aW50MzJfdCB3YWl0X3RpbWU7CiAKIAkvKiBJZiBmaXJtd2FyZSBuZWVkcyB0byBiZSBsb2FkZWQgKi8KIAlpZiAocWxhMngwMF9pc3BfZmlybXdhcmUoaGEpKSB7CiAJCWhhLT5mbGFncy5vbmxpbmUgPSAwOwotCQlpZiAoIShzdGF0dXMgPSBoYS0+aXNwX29wcy0+Y2hpcF9kaWFnKGhhKSkpIHsKLQkJCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkgewotCQkJCXN0YXR1cyA9IHFsYTJ4MDBfc2V0dXBfY2hpcChoYSk7Ci0JCQkJZ290byBkb25lOwotCQkJfQotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKLQotCQkJaWYgKCFJU19RTEEyNFhYKGhhKSAmJiAhSVNfUUxBNTRYWChoYSkgJiYKLQkJCSAgICAhSVNfUUxBMjVYWChoYSkpIHsKLQkJCQkvKgotCQkJCSAqIERpc2FibGUgU1JBTSwgSW5zdHJ1Y3Rpb24gUkFNIGFuZCBHUCBSQU0KLQkJCQkgKiBwYXJpdHkuCi0JCQkJICovCi0JCQkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsCi0JCQkJICAgIChIQ0NSX0VOQUJMRV9QQVJJVFkgKyAweDApKTsKLQkJCQlSRF9SRUdfV09SRCgmcmVnLT5oY2NyKTsKLQkJCX0KLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKLQorCQlpZiAoIShzdGF0dXMgPSBoYS0+aXNwX29wcy0+Y2hpcF9kaWFnKGhhKSkpCiAJCQlzdGF0dXMgPSBxbGEyeDAwX3NldHVwX2NoaXAoaGEpOwotCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKLQotCQkJaWYgKCFJU19RTEEyNFhYKGhhKSAmJiAhSVNfUUxBNTRYWChoYSkgJiYKLQkJCSAgICAhSVNfUUxBMjVYWChoYSkpIHsKLQkJCQkvKiBFbmFibGUgcHJvcGVyIHBhcml0eSAqLwotCQkJCWlmIChJU19RTEEyMzAwKGhhKSkKLQkJCQkJLyogU1JBTSBwYXJpdHkgKi8KLQkJCQkJV1JUX1JFR19XT1JEKCZyZWctPmhjY3IsCi0JCQkJCSAgICAoSENDUl9FTkFCTEVfUEFSSVRZICsgMHgxKSk7Ci0JCQkJZWxzZQotCQkJCQkvKgotCQkJCQkgKiBTUkFNLCBJbnN0cnVjdGlvbiBSQU0gYW5kIEdQIFJBTQotCQkJCQkgKiBwYXJpdHkuCi0JCQkJCSAqLwotCQkJCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwKLQkJCQkJICAgIChIQ0NSX0VOQUJMRV9QQVJJVFkgKyAweDcpKTsKLQkJCQlSRF9SRUdfV09SRCgmcmVnLT5oY2NyKTsKLQkJCX0KLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKLQkJfQogCX0KIAotIGRvbmU6CiAJaWYgKCFzdGF0dXMgJiYgIShzdGF0dXMgPSBxbGEyeDAwX2luaXRfcmluZ3MoaGEpKSkgewogCQljbGVhcl9iaXQoUkVTRVRfTUFSS0VSX05FRURFRCwgJmhhLT5kcGNfZmxhZ3MpOwogCQlpZiAoIShzdGF0dXMgPSBxbGEyeDAwX2Z3X3JlYWR5KGhhKSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbmxpbmUuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbmxpbmUuaAppbmRleCA4ZTNiMDQ0Li41ZDFhM2Y3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5saW5lLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lubGluZS5oCkBAIC0xMTksNiArMTE5LDEzIEBACiAJcWxhMngwMF9nZXRfZmlybXdhcmVfc3RhdGUoaGEsICZmd19zdGF0ZSk7CiB9CiAKK3N0YXRpYyBfX2lubGluZV9fIHNjc2lfcWxhX2hvc3RfdCAqIHRvX3FsYV9wYXJlbnQoc2NzaV9xbGFfaG9zdF90ICopOworc3RhdGljIF9faW5saW5lX18gc2NzaV9xbGFfaG9zdF90ICoKK3RvX3FsYV9wYXJlbnQoc2NzaV9xbGFfaG9zdF90ICpoYSkKK3sKKwlyZXR1cm4gaGEtPnBhcmVudCA/IGhhLT5wYXJlbnQgOiBoYTsKK30KKwogLyoqCiAgKiBxbGEyeDAwX2lzc3VlX21hcmtlcigpIC0gSXNzdWUgYSBNYXJrZXIgSU9DQiBpZiBuZWNlc3NhcnkuCiAgKiBAaGE6IEhBIGNvbnRleHQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYwppbmRleCA2NDJhMGMzZi4uMTRlNmYyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYwpAQCAtMTgxNSw2ICsxODE1LDggQEAKIHFsYTJ4MDBfcmVxdWVzdF9pcnFzKHNjc2lfcWxhX2hvc3RfdCAqaGEpCiB7CiAJaW50IHJldDsKKwlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnID0gaGEtPmlvYmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogSWYgcG9zc2libGUsIGVuYWJsZSBNU0ktWC4gKi8KIAlpZiAoIUlTX1FMQTI0MzIoaGEpICYmICFJU19RTEEyNTMyKGhhKSkKQEAgLTE4NDYsNyArMTg0OCw3IEBACiAJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCiAJCSAgICAiTVNJLVg6IEVuYWJsZWQgKDB4JVgsIDB4JVgpLlxuIiwgaGEtPmNoaXBfcmV2aXNpb24sCiAJCSAgICBoYS0+ZndfYXR0cmlidXRlcykpOwotCQlyZXR1cm4gcmV0OworCQlnb3RvIGNsZWFyX3Jpc2NfaW50czsKIAl9CiAJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAogCSAgICAiTVNJLVg6IEZhbGxpbmcgYmFjay10byBJTlRhIG1vZGUgLS0gJWQuXG4iLCByZXQpOwpAQCAtMTg2NCwxNSArMTg2NiwzMCBAQAogCiAJcmV0ID0gcmVxdWVzdF9pcnEoaGEtPnBkZXYtPmlycSwgaGEtPmlzcF9vcHMtPmludHJfaGFuZGxlciwKIAkgICAgSVJRRl9ESVNBQkxFRHxJUlFGX1NIQVJFRCwgUUxBMlhYWF9EUklWRVJfTkFNRSwgaGEpOwotCWlmICghcmV0KSB7Ci0JCWhhLT5mbGFncy5pbnRhX2VuYWJsZWQgPSAxOwotCQloYS0+aG9zdC0+aXJxID0gaGEtPnBkZXYtPmlycTsKLQl9IGVsc2UgeworCWlmIChyZXQpIHsKIAkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAogCQkgICAgIkZhaWxlZCB0byByZXNlcnZlIGludGVycnVwdCAlZCBhbHJlYWR5IGluIHVzZS5cbiIsCiAJCSAgICBoYS0+cGRldi0+aXJxKTsKKwkJZ290byBmYWlsOwogCX0KKwloYS0+ZmxhZ3MuaW50YV9lbmFibGVkID0gMTsKKwloYS0+aG9zdC0+aXJxID0gaGEtPnBkZXYtPmlycTsKK2NsZWFyX3Jpc2NfaW50czoKIAorCWhhLT5pc3Bfb3BzLT5kaXNhYmxlX2ludHJzKGhhKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwlpZiAoSVNfRldJMl9DQVBBQkxFKGhhKSkgeworCQlXUlRfUkVHX0RXT1JEKCZyZWctPmlzcDI0LmhjY3IsIEhDQ1JYX0NMUl9IT1NUX0lOVCk7CisJCVdSVF9SRUdfRFdPUkQoJnJlZy0+aXNwMjQuaGNjciwgSENDUlhfQ0xSX1JJU0NfSU5UKTsKKwl9IGVsc2UgeworCQlXUlRfUkVHX1dPUkQoJnJlZy0+aXNwLnNlbWFwaG9yZSwgMCk7CisJCVdSVF9SRUdfV09SRCgmcmVnLT5pc3AuaGNjciwgSENDUl9DTFJfUklTQ19JTlQpOworCQlXUlRfUkVHX1dPUkQoJnJlZy0+aXNwLmhjY3IsIEhDQ1JfQ0xSX0hPU1RfSU5UKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKKwloYS0+aXNwX29wcy0+ZW5hYmxlX2ludHJzKGhhKTsKKworZmFpbDoKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMKaW5kZXggMGMxMGMwYi4uOTlkMjlmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYwpAQCAtOTgwLDcgKzk4MCw3IEBACiAJREVCVUcxMShwcmludGsoInFsYTJ4MDBfaW5pdF9maXJtd2FyZSglbGQpOiBlbnRlcmVkLlxuIiwKIAkgICAgaGEtPmhvc3Rfbm8pKTsKIAotCWlmIChoYS0+ZndfYXR0cmlidXRlcyAmIEJJVF8yKQorCWlmIChoYS0+ZmxhZ3MubnBpdl9zdXBwb3J0ZWQpCiAJCW1jcC0+bWJbMF0gPSBNQkNfTUlEX0lOSVRJQUxJWkVfRklSTVdBUkU7CiAJZWxzZQogCQltY3AtPm1iWzBdID0gTUJDX0lOSVRJQUxJWkVfRklSTVdBUkU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9vcy5jCmluZGV4IDhmNjljYWYuLjNjMWI0MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9vcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9vcy5jCkBAIC0yMDQsMTAgKzIwNCw4IEBACiAKIHN0YXRpYyB2b2lkIHFsYTJ4MDBfcnN0X2FlbihzY3NpX3FsYV9ob3N0X3QgKik7CiAKLXN0YXRpYyB1aW50OF90IHFsYTJ4MDBfbWVtX2FsbG9jKHNjc2lfcWxhX2hvc3RfdCAqKTsKK3N0YXRpYyBpbnQgcWxhMngwMF9tZW1fYWxsb2Moc2NzaV9xbGFfaG9zdF90ICopOwogc3RhdGljIHZvaWQgcWxhMngwMF9tZW1fZnJlZShzY3NpX3FsYV9ob3N0X3QgKmhhKTsKLXN0YXRpYyBpbnQgcWxhMngwMF9hbGxvY2F0ZV9zcF9wb29sKCBzY3NpX3FsYV9ob3N0X3QgKmhhKTsKLXN0YXRpYyB2b2lkIHFsYTJ4MDBfZnJlZV9zcF9wb29sKHNjc2lfcWxhX2hvc3RfdCAqaGEpOwogc3RhdGljIHZvaWQgcWxhMngwMF9zcF9mcmVlX2RtYShzY3NpX3FsYV9ob3N0X3QgKiwgc3JiX3QgKik7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMTE3LDYgKzExMTUsMjcgQEAKIAlyZXR1cm4gaGEtPmlzcF9vcHMtPmFib3J0X3RhcmdldChyZXNldF9mY3BvcnQpOwogfQogCit2b2lkCitxbGEyeDAwX2Fib3J0X2FsbF9jbWRzKHNjc2lfcWxhX2hvc3RfdCAqaGEsIGludCByZXMpCit7CisJaW50IGNudDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNyYl90ICpzcDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworCWZvciAoY250ID0gMTsgY250IDwgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTOyBjbnQrKykgeworCQlzcCA9IGhhLT5vdXRzdGFuZGluZ19jbWRzW2NudF07CisJCWlmIChzcCkgeworCQkJaGEtPm91dHN0YW5kaW5nX2NtZHNbY250XSA9IE5VTEw7CisJCQlzcC0+ZmxhZ3MgPSAwOworCQkJc3AtPmNtZC0+cmVzdWx0ID0gcmVzOworCQkJc3AtPmNtZC0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopTlVMTDsKKwkJCXFsYTJ4MDBfc3BfY29tcGwoaGEsIHNwKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOworfQorCiBzdGF0aWMgaW50CiBxbGEyeHh4X3NsYXZlX2FsbG9jKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKIHsKQEAgLTE1NTcsMTAgKzE1NzYsOCBAQAogcWxhMngwMF9wcm9iZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKIAlpbnQJcmV0ID0gLUVOT0RFVjsKLQlkZXZpY2VfcmVnX3QgX19pb21lbSAqcmVnOwogCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CiAJc2NzaV9xbGFfaG9zdF90ICpoYTsKLQl1bnNpZ25lZCBsb25nCWZsYWdzID0gMDsKIAljaGFyIHBjaV9pbmZvWzMwXTsKIAljaGFyIGZ3X3N0clszMF07CiAJc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqc2h0OwpAQCAtMTYwOCw2ICsxNjI1LDcgQEAKIAloYS0+cGFyZW50ID0gTlVMTDsKIAloYS0+YmFycyA9IGJhcnM7CiAJaGEtPm1lbV9vbmx5ID0gbWVtX29ubHk7CisJc3Bpbl9sb2NrX2luaXQoJmhhLT5oYXJkd2FyZV9sb2NrKTsKIAogCS8qIFNldCBJU1AtdHlwZSBpbmZvcm1hdGlvbi4gKi8KIAlxbGEyeDAwX3NldF9pc3BfZmxhZ3MoaGEpOwpAQCAtMTYyMSw4ICsxNjM5LDYgQEAKIAkgICAgIkZvdW5kIGFuIElTUCUwNFgsIGlycSAlZCwgaW9iYXNlIDB4JXBcbiIsIHBkZXYtPmRldmljZSwgcGRldi0+aXJxLAogCSAgICBoYS0+aW9iYXNlKTsKIAotCXNwaW5fbG9ja19pbml0KCZoYS0+aGFyZHdhcmVfbG9jayk7Ci0KIAloYS0+cHJldl90b3BvbG9neSA9IDA7CiAJaGEtPmluaXRfY2Jfc2l6ZSA9IHNpemVvZihpbml0X2NiX3QpOwogCWhhLT5tZ210X3N2cl9sb29wX2lkID0gTUFOQUdFTUVOVF9TRVJWRVIgKyBoYS0+dnBfaWR4OwpAQCAtMTc1MSwzNCArMTc2Nyw2IEBACiAJREVCVUcyKHByaW50aygiREVCVUc6IGRldGVjdCBoYmEgJWxkIGF0IGFkZHJlc3MgPSAlcFxuIiwKIAkgICAgaGEtPmhvc3Rfbm8sIGhhKSk7CiAKLQloYS0+aXNwX29wcy0+ZGlzYWJsZV9pbnRycyhoYSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKLQlyZWcgPSBoYS0+aW9iYXNlOwotCWlmIChJU19GV0kyX0NBUEFCTEUoaGEpKSB7Ci0JCVdSVF9SRUdfRFdPUkQoJnJlZy0+aXNwMjQuaGNjciwgSENDUlhfQ0xSX0hPU1RfSU5UKTsKLQkJV1JUX1JFR19EV09SRCgmcmVnLT5pc3AyNC5oY2NyLCBIQ0NSWF9DTFJfUklTQ19JTlQpOwotCX0gZWxzZSB7Ci0JCVdSVF9SRUdfV09SRCgmcmVnLT5pc3Auc2VtYXBob3JlLCAwKTsKLQkJV1JUX1JFR19XT1JEKCZyZWctPmlzcC5oY2NyLCBIQ0NSX0NMUl9SSVNDX0lOVCk7Ci0JCVdSVF9SRUdfV09SRCgmcmVnLT5pc3AuaGNjciwgSENDUl9DTFJfSE9TVF9JTlQpOwotCi0JCS8qIEVuYWJsZSBwcm9wZXIgcGFyaXR5ICovCi0JCWlmICghSVNfUUxBMjEwMChoYSkgJiYgIUlTX1FMQTIyMDAoaGEpKSB7Ci0JCQlpZiAoSVNfUUxBMjMwMChoYSkpCi0JCQkJLyogU1JBTSBwYXJpdHkgKi8KLQkJCQlXUlRfUkVHX1dPUkQoJnJlZy0+aXNwLmhjY3IsCi0JCQkJICAgIChIQ0NSX0VOQUJMRV9QQVJJVFkgKyAweDEpKTsKLQkJCWVsc2UKLQkJCQkvKiBTUkFNLCBJbnN0cnVjdGlvbiBSQU0gYW5kIEdQIFJBTSBwYXJpdHkgKi8KLQkJCQlXUlRfUkVHX1dPUkQoJnJlZy0+aXNwLmhjY3IsCi0JCQkJICAgIChIQ0NSX0VOQUJMRV9QQVJJVFkgKyAweDcpKTsKLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwotCi0JaGEtPmlzcF9vcHMtPmVuYWJsZV9pbnRycyhoYSk7Ci0KIAlwY2lfc2V0X2RydmRhdGEocGRldiwgaGEpOwogCiAJaGEtPmZsYWdzLmluaXRfZG9uZSA9IDE7CkBAIC0xODQ4LDEwICsxODM2LDE0IEBACiBzdGF0aWMgdm9pZAogcWxhMngwMF9mcmVlX2RldmljZShzY3NpX3FsYV9ob3N0X3QgKmhhKQogeworCXFsYTJ4MDBfYWJvcnRfYWxsX2NtZHMoaGEsIERJRF9OT19DT05ORUNUIDw8IDE2KTsKKwogCS8qIERpc2FibGUgdGltZXIgKi8KIAlpZiAoaGEtPnRpbWVyX2FjdGl2ZSkKIAkJcWxhMngwMF9zdG9wX3RpbWVyKGhhKTsKIAorCWhhLT5mbGFncy5vbmxpbmUgPSAwOworCiAJLyogS2lsbCB0aGUga2VybmVsIHRocmVhZCBmb3IgdGhpcyBob3N0ICovCiAJaWYgKGhhLT5kcGNfdGhyZWFkKSB7CiAJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdCA9IGhhLT5kcGNfdGhyZWFkOwpAQCAtMTg3MCw4ICsxODYyLDYgQEAKIAlpZiAoaGEtPmVmdCkKIAkJcWxhMngwMF9kaXNhYmxlX2VmdF90cmFjZShoYSk7CiAKLQloYS0+ZmxhZ3Mub25saW5lID0gMDsKLQogCS8qIFN0b3AgY3VycmVudGx5IGV4ZWN1dGluZyBmaXJtd2FyZS4gKi8KIAlxbGEyeDAwX3RyeV90b19zdG9wX2Zpcm13YXJlKGhhKTsKIApAQCAtMjAxMCwxOTYgKzIwMDAsMTA5IEBACiAqCiAqIFJldHVybnM6CiAqICAgICAgMCAgPSBzdWNjZXNzLgotKiAgICAgIDEgID0gZmFpbHVyZS4KKyogICAgICAhMCAgPSBmYWlsdXJlLgogKi8KLXN0YXRpYyB1aW50OF90CitzdGF0aWMgaW50CiBxbGEyeDAwX21lbV9hbGxvYyhzY3NpX3FsYV9ob3N0X3QgKmhhKQogewogCWNoYXIJbmFtZVsxNl07Ci0JdWludDhfdCAgIHN0YXR1cyA9IDE7Ci0JaW50CXJldHJ5PSAxMDsKIAotCWRvIHsKLQkJLyoKLQkJICogVGhpcyB3aWxsIGxvb3Agb25seSBvbmNlIGlmIGV2ZXJ5dGhpbmcgZ29lcyB3ZWxsLCBlbHNlIHNvbWUKLQkJICogbnVtYmVyIG9mIHJldHJpZXMgd2lsbCBiZSBwZXJmb3JtZWQgdG8gZ2V0IGFyb3VuZCBhIGtlcm5lbAotCQkgKiBidWcgd2hlcmUgYXZhaWxhYmxlIG1lbSBpcyBub3QgYWxsb2NhdGVkIHVudGlsIGFmdGVyIGEKLQkJICogbGl0dGxlIGRlbGF5IGFuZCBhIHJldHJ5LgotCQkgKi8KLQkJaGEtPnJlcXVlc3RfcmluZyA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKLQkJICAgIChoYS0+cmVxdWVzdF9xX2xlbmd0aCArIDEpICogc2l6ZW9mKHJlcXVlc3RfdCksCi0JCSAgICAmaGEtPnJlcXVlc3RfZG1hLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGhhLT5yZXF1ZXN0X3JpbmcgPT0gTlVMTCkgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJICAgICJNZW1vcnkgQWxsb2NhdGlvbiBmYWlsZWQgLSByZXF1ZXN0X3JpbmdcbiIpOworCWhhLT5yZXF1ZXN0X3JpbmcgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsCisJICAgIChoYS0+cmVxdWVzdF9xX2xlbmd0aCArIDEpICogc2l6ZW9mKHJlcXVlc3RfdCksICZoYS0+cmVxdWVzdF9kbWEsCisJICAgIEdGUF9LRVJORUwpOworCWlmICghaGEtPnJlcXVlc3RfcmluZykKKwkJZ290byBmYWlsOwogCi0JCQlxbGEyeDAwX21lbV9mcmVlKGhhKTsKLQkJCW1zbGVlcCgxMDApOworCWhhLT5yZXNwb25zZV9yaW5nID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAorCSAgICAoaGEtPnJlc3BvbnNlX3FfbGVuZ3RoICsgMSkgKiBzaXplb2YocmVzcG9uc2VfdCksCisJICAgICZoYS0+cmVzcG9uc2VfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhhLT5yZXNwb25zZV9yaW5nKQorCQlnb3RvIGZhaWxfZnJlZV9yZXF1ZXN0X3Jpbmc7CiAKLQkJCWNvbnRpbnVlOwotCQl9CisJaGEtPmdpZF9saXN0ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBHSURfTElTVF9TSVpFLAorCSAgICAmaGEtPmdpZF9saXN0X2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoYS0+Z2lkX2xpc3QpCisJCWdvdG8gZmFpbF9mcmVlX3Jlc3BvbnNlX3Jpbmc7CiAKLQkJaGEtPnJlc3BvbnNlX3JpbmcgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsCi0JCSAgICAoaGEtPnJlc3BvbnNlX3FfbGVuZ3RoICsgMSkgKiBzaXplb2YocmVzcG9uc2VfdCksCi0JCSAgICAmaGEtPnJlc3BvbnNlX2RtYSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChoYS0+cmVzcG9uc2VfcmluZyA9PSBOVUxMKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkgICAgIk1lbW9yeSBBbGxvY2F0aW9uIGZhaWxlZCAtIHJlc3BvbnNlX3JpbmdcbiIpOworCWhhLT5pbml0X2NiID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBoYS0+aW5pdF9jYl9zaXplLAorCSAgICAmaGEtPmluaXRfY2JfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhhLT5pbml0X2NiKQorCQlnb3RvIGZhaWxfZnJlZV9naWRfbGlzdDsKIAotCQkJcWxhMngwMF9tZW1fZnJlZShoYSk7Ci0JCQltc2xlZXAoMTAwKTsKKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlc18lbGQiLCBRTEEyWFhYX0RSSVZFUl9OQU1FLAorCSAgICBoYS0+aG9zdF9ubyk7CisJaGEtPnNfZG1hX3Bvb2wgPSBkbWFfcG9vbF9jcmVhdGUobmFtZSwgJmhhLT5wZGV2LT5kZXYsCisJICAgIERNQV9QT09MX1NJWkUsIDgsIDApOworCWlmICghaGEtPnNfZG1hX3Bvb2wpCisJCWdvdG8gZmFpbF9mcmVlX2luaXRfY2I7CiAKLQkJCWNvbnRpbnVlOwotCQl9CisJaGEtPnNyYl9tZW1wb29sID0gbWVtcG9vbF9jcmVhdGVfc2xhYl9wb29sKFNSQl9NSU5fUkVRLCBzcmJfY2FjaGVwKTsKKwlpZiAoIWhhLT5zcmJfbWVtcG9vbCkKKwkJZ290byBmYWlsX2ZyZWVfc19kbWFfcG9vbDsKIAotCQloYS0+Z2lkX2xpc3QgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIEdJRF9MSVNUX1NJWkUsCi0JCSAgICAmaGEtPmdpZF9saXN0X2RtYSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChoYS0+Z2lkX2xpc3QgPT0gTlVMTCkgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJICAgICJNZW1vcnkgQWxsb2NhdGlvbiBmYWlsZWQgLSBnaWRfbGlzdFxuIik7CisJLyogR2V0IG1lbW9yeSBmb3IgY2FjaGVkIE5WUkFNICovCisJaGEtPm52cmFtID0ga3phbGxvYyhNQVhfTlZSQU1fU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoYS0+bnZyYW0pCisJCWdvdG8gZmFpbF9mcmVlX3NyYl9tZW1wb29sOwogCi0JCQlxbGEyeDAwX21lbV9mcmVlKGhhKTsKLQkJCW1zbGVlcCgxMDApOworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgU05TIGNvbW1hbmRzICovCisJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKSB7CisJCS8qIEdldCBjb25zaXN0ZW50IG1lbW9yeSBhbGxvY2F0ZWQgZm9yIFNOUyBjb21tYW5kcyAqLworCQloYS0+c25zX2NtZCA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKKwkJICAgIHNpemVvZihzdHJ1Y3Qgc25zX2NtZF9wa3QpLCAmaGEtPnNuc19jbWRfZG1hLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFoYS0+c25zX2NtZCkKKwkJCWdvdG8gZmFpbF9mcmVlX252cmFtOworCX0gZWxzZSB7CisJCS8qIEdldCBjb25zaXN0ZW50IG1lbW9yeSBhbGxvY2F0ZWQgZm9yIE1TIElPQ0IgKi8KKwkJaGEtPm1zX2lvY2IgPSBkbWFfcG9vbF9hbGxvYyhoYS0+c19kbWFfcG9vbCwgR0ZQX0tFUk5FTCwKKwkJICAgICZoYS0+bXNfaW9jYl9kbWEpOworCQlpZiAoIWhhLT5tc19pb2NiKQorCQkJZ290byBmYWlsX2ZyZWVfbnZyYW07CiAKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogZ2V0IGNvbnNpc3RlbnQgbWVtb3J5IGFsbG9jYXRlZCBmb3IgaW5pdCBjb250cm9sIGJsb2NrICovCi0JCWhhLT5pbml0X2NiID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LAotCQkgICAgaGEtPmluaXRfY2Jfc2l6ZSwgJmhhLT5pbml0X2NiX2RtYSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChoYS0+aW5pdF9jYiA9PSBOVUxMKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkgICAgIk1lbW9yeSBBbGxvY2F0aW9uIGZhaWxlZCAtIGluaXRfY2JcbiIpOwotCi0JCQlxbGEyeDAwX21lbV9mcmVlKGhhKTsKLQkJCW1zbGVlcCgxMDApOwotCi0JCQljb250aW51ZTsKLQkJfQotCQltZW1zZXQoaGEtPmluaXRfY2IsIDAsIGhhLT5pbml0X2NiX3NpemUpOwotCi0JCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzXyVsZCIsIFFMQTJYWFhfRFJJVkVSX05BTUUsCi0JCSAgICBoYS0+aG9zdF9ubyk7Ci0JCWhhLT5zX2RtYV9wb29sID0gZG1hX3Bvb2xfY3JlYXRlKG5hbWUsICZoYS0+cGRldi0+ZGV2LAotCQkgICAgRE1BX1BPT0xfU0laRSwgOCwgMCk7Ci0JCWlmIChoYS0+c19kbWFfcG9vbCA9PSBOVUxMKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkgICAgIk1lbW9yeSBBbGxvY2F0aW9uIGZhaWxlZCAtIHNfZG1hX3Bvb2xcbiIpOwotCi0JCQlxbGEyeDAwX21lbV9mcmVlKGhhKTsKLQkJCW1zbGVlcCgxMDApOwotCi0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChxbGEyeDAwX2FsbG9jYXRlX3NwX3Bvb2woaGEpKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkgICAgIk1lbW9yeSBBbGxvY2F0aW9uIGZhaWxlZCAtICIKLQkJCSAgICAicWxhMngwMF9hbGxvY2F0ZV9zcF9wb29sKClcbiIpOwotCi0JCQlxbGEyeDAwX21lbV9mcmVlKGhhKTsKLQkJCW1zbGVlcCgxMDApOwotCi0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgU05TIGNvbW1hbmRzICovCi0JCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkgewotCQkJLyogR2V0IGNvbnNpc3RlbnQgbWVtb3J5IGFsbG9jYXRlZCBmb3IgU05TIGNvbW1hbmRzICovCi0JCQloYS0+c25zX2NtZCA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKLQkJCSAgICBzaXplb2Yoc3RydWN0IHNuc19jbWRfcGt0KSwgJmhhLT5zbnNfY21kX2RtYSwKLQkJCSAgICBHRlBfS0VSTkVMKTsKLQkJCWlmIChoYS0+c25zX2NtZCA9PSBOVUxMKSB7Ci0JCQkJLyogZXJyb3IgKi8KLQkJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkJICAgICJNZW1vcnkgQWxsb2NhdGlvbiBmYWlsZWQgLSBzbnNfY21kXG4iKTsKLQotCQkJCXFsYTJ4MDBfbWVtX2ZyZWUoaGEpOwotCQkJCW1zbGVlcCgxMDApOwotCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQltZW1zZXQoaGEtPnNuc19jbWQsIDAsIHNpemVvZihzdHJ1Y3Qgc25zX2NtZF9wa3QpKTsKLQkJfSBlbHNlIHsKLQkJCS8qIEdldCBjb25zaXN0ZW50IG1lbW9yeSBhbGxvY2F0ZWQgZm9yIE1TIElPQ0IgKi8KLQkJCWhhLT5tc19pb2NiID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsCi0JCQkgICAgJmhhLT5tc19pb2NiX2RtYSk7Ci0JCQlpZiAoaGEtPm1zX2lvY2IgPT0gTlVMTCkgewotCQkJCS8qIGVycm9yICovCi0JCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJCSAgICAiTWVtb3J5IEFsbG9jYXRpb24gZmFpbGVkIC0gbXNfaW9jYlxuIik7Ci0KLQkJCQlxbGEyeDAwX21lbV9mcmVlKGhhKTsKLQkJCQltc2xlZXAoMTAwKTsKLQotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJbWVtc2V0KGhhLT5tc19pb2NiLCAwLCBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7Ci0KLQkJCS8qCi0JCQkgKiBHZXQgY29uc2lzdGVudCBtZW1vcnkgYWxsb2NhdGVkIGZvciBDVCBTTlMKLQkJCSAqIGNvbW1hbmRzCi0JCQkgKi8KLQkJCWhhLT5jdF9zbnMgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsCi0JCQkgICAgc2l6ZW9mKHN0cnVjdCBjdF9zbnNfcGt0KSwgJmhhLT5jdF9zbnNfZG1hLAotCQkJICAgIEdGUF9LRVJORUwpOwotCQkJaWYgKGhhLT5jdF9zbnMgPT0gTlVMTCkgewotCQkJCS8qIGVycm9yICovCi0JCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJCSAgICAiTWVtb3J5IEFsbG9jYXRpb24gZmFpbGVkIC0gY3Rfc25zXG4iKTsKLQotCQkJCXFsYTJ4MDBfbWVtX2ZyZWUoaGEpOwotCQkJCW1zbGVlcCgxMDApOwotCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQltZW1zZXQoaGEtPmN0X3NucywgMCwgc2l6ZW9mKHN0cnVjdCBjdF9zbnNfcGt0KSk7Ci0KLQkJCWlmIChJU19GV0kyX0NBUEFCTEUoaGEpKSB7Ci0JCQkJLyoKLQkJCQkgKiBHZXQgY29uc2lzdGVudCBtZW1vcnkgYWxsb2NhdGVkIGZvciBTRlAKLQkJCQkgKiBibG9jay4KLQkJCQkgKi8KLQkJCQloYS0+c2ZwX2RhdGEgPSBkbWFfcG9vbF9hbGxvYyhoYS0+c19kbWFfcG9vbCwKLQkJCQkgICAgR0ZQX0tFUk5FTCwgJmhhLT5zZnBfZGF0YV9kbWEpOwotCQkJCWlmIChoYS0+c2ZwX2RhdGEgPT0gTlVMTCkgewotCQkJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkJCSAgICAiTWVtb3J5IEFsbG9jYXRpb24gZmFpbGVkIC0gIgotCQkJCQkgICAgInNmcF9kYXRhXG4iKTsKLQotCQkJCQlxbGEyeDAwX21lbV9mcmVlKGhhKTsKLQkJCQkJbXNsZWVwKDEwMCk7Ci0KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCW1lbXNldChoYS0+c2ZwX2RhdGEsIDAsIFNGUF9CTE9DS19TSVpFKTsKLQkJCX0KLQkJfQotCi0JCS8qIEdldCBtZW1vcnkgZm9yIGNhY2hlZCBOVlJBTSAqLwotCQloYS0+bnZyYW0gPSBremFsbG9jKE1BWF9OVlJBTV9TSVpFLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGhhLT5udnJhbSA9PSBOVUxMKSB7Ci0JCQkvKiBlcnJvciAqLwotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJICAgICJNZW1vcnkgQWxsb2NhdGlvbiBmYWlsZWQgLSBudnJhbSBjYWNoZVxuIik7Ci0KLQkJCXFsYTJ4MDBfbWVtX2ZyZWUoaGEpOwotCQkJbXNsZWVwKDEwMCk7Ci0KLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogRG9uZSBhbGwgYWxsb2NhdGlvbnMgd2l0aG91dCBhbnkgZXJyb3IuICovCi0JCXN0YXR1cyA9IDA7Ci0KLQl9IHdoaWxlIChyZXRyeS0tICYmIHN0YXR1cyAhPSAwKTsKLQotCWlmIChzdGF0dXMpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJIiVzKCk6ICoqKiogRkFJTEVEICoqKipcbiIsIF9fZnVuY19fKTsKKwkJLyogR2V0IGNvbnNpc3RlbnQgbWVtb3J5IGFsbG9jYXRlZCBmb3IgQ1QgU05TIGNvbW1hbmRzICovCisJCWhhLT5jdF9zbnMgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsCisJCSAgICBzaXplb2Yoc3RydWN0IGN0X3Nuc19wa3QpLCAmaGEtPmN0X3Nuc19kbWEsIEdGUF9LRVJORUwpOworCQlpZiAoIWhhLT5jdF9zbnMpCisJCQlnb3RvIGZhaWxfZnJlZV9tc19pb2NiOwogCX0KIAotCXJldHVybihzdGF0dXMpOworCXJldHVybiAwOworCitmYWlsX2ZyZWVfbXNfaW9jYjoKKwlkbWFfcG9vbF9mcmVlKGhhLT5zX2RtYV9wb29sLCBoYS0+bXNfaW9jYiwgaGEtPm1zX2lvY2JfZG1hKTsKKwloYS0+bXNfaW9jYiA9IE5VTEw7CisJaGEtPm1zX2lvY2JfZG1hID0gMDsKK2ZhaWxfZnJlZV9udnJhbToKKwlrZnJlZShoYS0+bnZyYW0pOworCWhhLT5udnJhbSA9IE5VTEw7CitmYWlsX2ZyZWVfc3JiX21lbXBvb2w6CisJbWVtcG9vbF9kZXN0cm95KGhhLT5zcmJfbWVtcG9vbCk7CisJaGEtPnNyYl9tZW1wb29sID0gTlVMTDsKK2ZhaWxfZnJlZV9zX2RtYV9wb29sOgorCWRtYV9wb29sX2Rlc3Ryb3koaGEtPnNfZG1hX3Bvb2wpOworCWhhLT5zX2RtYV9wb29sID0gTlVMTDsKK2ZhaWxfZnJlZV9pbml0X2NiOgorCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBoYS0+aW5pdF9jYl9zaXplLCBoYS0+aW5pdF9jYiwKKwkgICAgaGEtPmluaXRfY2JfZG1hKTsKKwloYS0+aW5pdF9jYiA9IE5VTEw7CisJaGEtPmluaXRfY2JfZG1hID0gMDsKK2ZhaWxfZnJlZV9naWRfbGlzdDoKKwlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgR0lEX0xJU1RfU0laRSwgaGEtPmdpZF9saXN0LAorCSAgICBoYS0+Z2lkX2xpc3RfZG1hKTsKKwloYS0+Z2lkX2xpc3QgPSBOVUxMOworCWhhLT5naWRfbGlzdF9kbWEgPSAwOworZmFpbF9mcmVlX3Jlc3BvbnNlX3Jpbmc6CisJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIChoYS0+cmVzcG9uc2VfcV9sZW5ndGggKyAxKSAqCisJICAgIHNpemVvZihyZXNwb25zZV90KSwgaGEtPnJlc3BvbnNlX3JpbmcsIGhhLT5yZXNwb25zZV9kbWEpOworCWhhLT5yZXNwb25zZV9yaW5nID0gTlVMTDsKKwloYS0+cmVzcG9uc2VfZG1hID0gMDsKK2ZhaWxfZnJlZV9yZXF1ZXN0X3Jpbmc6CisJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIChoYS0+cmVxdWVzdF9xX2xlbmd0aCArIDEpICoKKwkgICAgc2l6ZW9mKHJlcXVlc3RfdCksIGhhLT5yZXF1ZXN0X3JpbmcsIGhhLT5yZXF1ZXN0X2RtYSk7CisJaGEtPnJlcXVlc3RfcmluZyA9IE5VTEw7CisJaGEtPnJlcXVlc3RfZG1hID0gMDsKK2ZhaWw6CisJcmV0dXJuIC1FTk9NRU07CiB9CiAKIC8qCkBAIC0yMjE1LDE0ICsyMTE4LDggQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCSpmY3BsLCAqZmNwdGVtcDsKIAlmY19wb3J0X3QJKmZjcG9ydDsKIAotCWlmIChoYSA9PSBOVUxMKSB7Ci0JCS8qIGVycm9yICovCi0JCURFQlVHMihwcmludGsoIiVzKCk6IEVSUk9SIGludmFsaWQgaGEgcG9pbnRlci5cbiIsIF9fZnVuY19fKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBmcmVlIHNwIHBvb2wgKi8KLQlxbGEyeDAwX2ZyZWVfc3BfcG9vbChoYSk7CisJaWYgKGhhLT5zcmJfbWVtcG9vbCkKKwkJbWVtcG9vbF9kZXN0cm95KGhhLT5zcmJfbWVtcG9vbCk7CiAKIAlpZiAoaGEtPmZjZSkKIAkJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIEZDRV9TSVpFLCBoYS0+ZmNlLApAQCAtMjI3MCw2ICsyMTY3LDcgQEAKIAkJICAgIChoYS0+cmVxdWVzdF9xX2xlbmd0aCArIDEpICogc2l6ZW9mKHJlcXVlc3RfdCksCiAJCSAgICBoYS0+cmVxdWVzdF9yaW5nLCBoYS0+cmVxdWVzdF9kbWEpOwogCisJaGEtPnNyYl9tZW1wb29sID0gTlVMTDsKIAloYS0+ZWZ0ID0gTlVMTDsKIAloYS0+ZWZ0X2RtYSA9IDA7CiAJaGEtPnNuc19jbWQgPSBOVUxMOwpAQCAtMjMwOCw0NCArMjIwNiw2IEBACiAJa2ZyZWUoaGEtPm52cmFtKTsKIH0KIAotLyoKLSAqIHFsYTJ4MDBfYWxsb2NhdGVfc3BfcG9vbAotICogCSBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiB0byBhbGxvY2F0ZQotICogIAkgbWVtb3J5IGZvciBsb2NhbCBzcmJfdC4KLSAqCi0gKiBJbnB1dDoKLSAqCSBoYSAgID0gYWRhcHRlciBibG9jayBwb2ludGVyLgotICoKLSAqIENvbnRleHQ6Ci0gKiAgICAgIEtlcm5lbCBjb250ZXh0LgotICovCi1zdGF0aWMgaW50Ci1xbGEyeDAwX2FsbG9jYXRlX3NwX3Bvb2woc2NzaV9xbGFfaG9zdF90ICpoYSkKLXsKLQlpbnQgICAgICBydmFsOwotCi0JcnZhbCA9IFFMQV9TVUNDRVNTOwotCWhhLT5zcmJfbWVtcG9vbCA9IG1lbXBvb2xfY3JlYXRlX3NsYWJfcG9vbChTUkJfTUlOX1JFUSwgc3JiX2NhY2hlcCk7Ci0JaWYgKGhhLT5zcmJfbWVtcG9vbCA9PSBOVUxMKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlVuYWJsZSB0byBhbGxvY2F0ZSBTUkIgbWVtcG9vbC5cbiIpOwotCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKLQl9Ci0JcmV0dXJuIChydmFsKTsKLX0KLQotLyoKLSAqICBUaGlzIHJvdXRpbmUgZnJlZXMgYWxsIGFkYXB0ZXIgYWxsb2NhdGVkIG1lbW9yeS4KLSAqCi0gKi8KLXN0YXRpYyB2b2lkCi1xbGEyeDAwX2ZyZWVfc3BfcG9vbCggc2NzaV9xbGFfaG9zdF90ICpoYSkKLXsKLQlpZiAoaGEtPnNyYl9tZW1wb29sKSB7Ci0JCW1lbXBvb2xfZGVzdHJveShoYS0+c3JiX21lbXBvb2wpOwotCQloYS0+c3JiX21lbXBvb2wgPSBOVUxMOwotCX0KLX0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIHFsYTJ4MDBfZG9fZHBjCiAqICAgVGhpcyBrZXJuZWwgdGhyZWFkIGlzIGEgdGFzayB0aGF0IGlzIHNjaGVkdWxlIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlcgpAQCAtMjM2Nyw2ICsyMjI3LDkgQEAKIAlmY19wb3J0X3QJKmZjcG9ydDsKIAl1aW50OF90CQlzdGF0dXM7CiAJdWludDE2X3QJbmV4dF9sb29waWQ7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYTsKKwlpbnQgICAgICAgICAgICAgaTsKKwogCiAJaGEgPSAoc2NzaV9xbGFfaG9zdF90ICopZGF0YTsKIApAQCAtMjQwOSw2ICsyMjcyLDE4IEBACiAJCQkJfQogCQkJCWNsZWFyX2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmaGEtPmRwY19mbGFncyk7CiAJCQl9CisKKwkJCWZvcl9lYWNoX21hcHBlZF92cF9pZHgoaGEsIGkpIHsKKwkJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZoYSwgJmhhLT52cF9saXN0LAorCQkJCSAgICB2cF9saXN0KSB7CisJCQkJCWlmIChpID09IHZoYS0+dnBfaWR4KSB7CisJCQkJCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsCisJCQkJCQkgICAgJnZoYS0+ZHBjX2ZsYWdzKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCiAJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogZHBjOiBxbGEyeDAwX2Fib3J0X2lzcCBlbmRcbiIsCiAJCQkgICAgaGEtPmhvc3Rfbm8pKTsKIAkJfQpAQCAtMzAyOSwzICsyOTA0LDQgQEAKIE1PRFVMRV9GSVJNV0FSRShGV19GSUxFX0lTUDIzMDApOwogTU9EVUxFX0ZJUk1XQVJFKEZXX0ZJTEVfSVNQMjMyMik7CiBNT0RVTEVfRklSTVdBUkUoRldfRklMRV9JU1AyNFhYKTsKK01PRFVMRV9GSVJNV0FSRShGV19GSUxFX0lTUDI1WFgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jCmluZGV4IGI2OGZiNzMuLjI2ODIyYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zdXAuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc3VwLmMKQEAgLTg5Myw2ICs4OTMsOCBAQAogCX0KIH0KIAorI2RlZmluZSBQSU9fUkVHKGgsIHIpICgoaCktPnBpb19hZGRyZXNzICsgb2Zmc2V0b2Yoc3RydWN0IGRldmljZV9yZWdfMnh4eCwgcikpCisKIHZvaWQKIHFsYTJ4MDBfYmVhY29uX2JsaW5rKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKIHsKQEAgLTkwMiwxNSArOTA0LDEyIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yeHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3A7CiAKLQlpZiAoaGEtPnBpb19hZGRyZXNzKQotCQlyZWcgPSAoc3RydWN0IGRldmljZV9yZWdfMnh4eCBfX2lvbWVtICopaGEtPnBpb19hZGRyZXNzOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAKIAkvKiBTYXZlIHRoZSBPcmlnaW5hbCBHUElPRS4gKi8KIAlpZiAoaGEtPnBpb19hZGRyZXNzKSB7Ci0JCWdwaW9fZW5hYmxlID0gUkRfUkVHX1dPUkRfUElPKCZyZWctPmdwaW9lKTsKLQkJZ3Bpb19kYXRhID0gUkRfUkVHX1dPUkRfUElPKCZyZWctPmdwaW9kKTsKKwkJZ3Bpb19lbmFibGUgPSBSRF9SRUdfV09SRF9QSU8oUElPX1JFRyhoYSwgZ3Bpb2UpKTsKKwkJZ3Bpb19kYXRhID0gUkRfUkVHX1dPUkRfUElPKFBJT19SRUcoaGEsIGdwaW9kKSk7CiAJfSBlbHNlIHsKIAkJZ3Bpb19lbmFibGUgPSBSRF9SRUdfV09SRCgmcmVnLT5ncGlvZSk7CiAJCWdwaW9fZGF0YSA9IFJEX1JFR19XT1JEKCZyZWctPmdwaW9kKTsKQEAgLTkyMCw3ICs5MTksNyBAQAogCWdwaW9fZW5hYmxlIHw9IEdQSU9fTEVEX01BU0s7CiAKIAlpZiAoaGEtPnBpb19hZGRyZXNzKSB7Ci0JCVdSVF9SRUdfV09SRF9QSU8oJnJlZy0+Z3Bpb2UsIGdwaW9fZW5hYmxlKTsKKwkJV1JUX1JFR19XT1JEX1BJTyhQSU9fUkVHKGhhLCBncGlvZSksIGdwaW9fZW5hYmxlKTsKIAl9IGVsc2UgewogCQlXUlRfUkVHX1dPUkQoJnJlZy0+Z3Bpb2UsIGdwaW9fZW5hYmxlKTsKIAkJUkRfUkVHX1dPUkQoJnJlZy0+Z3Bpb2UpOwpAQCAtOTM2LDcgKzkzNSw3IEBACiAKIAkvKiBTZXQgdGhlIG1vZGlmaWVkIGdwaW9fZGF0YSB2YWx1ZXMgKi8KIAlpZiAoaGEtPnBpb19hZGRyZXNzKSB7Ci0JCVdSVF9SRUdfV09SRF9QSU8oJnJlZy0+Z3Bpb2QsIGdwaW9fZGF0YSk7CisJCVdSVF9SRUdfV09SRF9QSU8oUElPX1JFRyhoYSwgZ3Bpb2QpLCBncGlvX2RhdGEpOwogCX0gZWxzZSB7CiAJCVdSVF9SRUdfV09SRCgmcmVnLT5ncGlvZCwgZ3Bpb19kYXRhKTsKIAkJUkRfUkVHX1dPUkQoJnJlZy0+Z3Bpb2QpOwpAQCAtOTYyLDE0ICs5NjEsMTEgQEAKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfQogCi0JaWYgKGhhLT5waW9fYWRkcmVzcykKLQkJcmVnID0gKHN0cnVjdCBkZXZpY2VfcmVnXzJ4eHggX19pb21lbSAqKWhhLT5waW9fYWRkcmVzczsKLQogCS8qIFR1cm4gb2ZmIExFRHMuICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAJaWYgKGhhLT5waW9fYWRkcmVzcykgewotCQlncGlvX2VuYWJsZSA9IFJEX1JFR19XT1JEX1BJTygmcmVnLT5ncGlvZSk7Ci0JCWdwaW9fZGF0YSA9IFJEX1JFR19XT1JEX1BJTygmcmVnLT5ncGlvZCk7CisJCWdwaW9fZW5hYmxlID0gUkRfUkVHX1dPUkRfUElPKFBJT19SRUcoaGEsIGdwaW9lKSk7CisJCWdwaW9fZGF0YSA9IFJEX1JFR19XT1JEX1BJTyhQSU9fUkVHKGhhLCBncGlvZCkpOwogCX0gZWxzZSB7CiAJCWdwaW9fZW5hYmxlID0gUkRfUkVHX1dPUkQoJnJlZy0+Z3Bpb2UpOwogCQlncGlvX2RhdGEgPSBSRF9SRUdfV09SRCgmcmVnLT5ncGlvZCk7CkBAIC05NzgsNyArOTc0LDcgQEAKIAogCS8qIFNldCB0aGUgbW9kaWZpZWQgZ3Bpb19lbmFibGUgdmFsdWVzLiAqLwogCWlmIChoYS0+cGlvX2FkZHJlc3MpIHsKLQkJV1JUX1JFR19XT1JEX1BJTygmcmVnLT5ncGlvZSwgZ3Bpb19lbmFibGUpOworCQlXUlRfUkVHX1dPUkRfUElPKFBJT19SRUcoaGEsIGdwaW9lKSwgZ3Bpb19lbmFibGUpOwogCX0gZWxzZSB7CiAJCVdSVF9SRUdfV09SRCgmcmVnLT5ncGlvZSwgZ3Bpb19lbmFibGUpOwogCQlSRF9SRUdfV09SRCgmcmVnLT5ncGlvZSk7CkBAIC05ODcsNyArOTgzLDcgQEAKIAkvKiBDbGVhciBvdXQgcHJldmlvdXNseSBzZXQgTEVEIGNvbG91ci4gKi8KIAlncGlvX2RhdGEgJj0gfkdQSU9fTEVEX01BU0s7CiAJaWYgKGhhLT5waW9fYWRkcmVzcykgewotCQlXUlRfUkVHX1dPUkRfUElPKCZyZWctPmdwaW9kLCBncGlvX2RhdGEpOworCQlXUlRfUkVHX1dPUkRfUElPKFBJT19SRUcoaGEsIGdwaW9kKSwgZ3Bpb19kYXRhKTsKIAl9IGVsc2UgewogCQlXUlRfUkVHX1dPUkQoJnJlZy0+Z3Bpb2QsIGdwaW9fZGF0YSk7CiAJCVJEX1JFR19XT1JEKCZyZWctPmdwaW9kKTsKQEAgLTEyNDQsMTMgKzEyNDAsMTIgQEAKIAlpZiAoaGEtPnBpb19hZGRyZXNzKSB7CiAJCXVpbnQxNl90IGRhdGEyOwogCi0JCXJlZyA9IChzdHJ1Y3QgZGV2aWNlX3JlZ18yeHh4IF9faW9tZW0gKiloYS0+cGlvX2FkZHJlc3M7Ci0JCVdSVF9SRUdfV09SRF9QSU8oJnJlZy0+Zmxhc2hfYWRkcmVzcywgKHVpbnQxNl90KWFkZHIpOworCQlXUlRfUkVHX1dPUkRfUElPKFBJT19SRUcoaGEsIGZsYXNoX2FkZHJlc3MpLCAodWludDE2X3QpYWRkcik7CiAJCWRvIHsKLQkJCWRhdGEgPSBSRF9SRUdfV09SRF9QSU8oJnJlZy0+Zmxhc2hfZGF0YSk7CisJCQlkYXRhID0gUkRfUkVHX1dPUkRfUElPKFBJT19SRUcoaGEsIGZsYXNoX2RhdGEpKTsKIAkJCWJhcnJpZXIoKTsKIAkJCWNwdV9yZWxheCgpOwotCQkJZGF0YTIgPSBSRF9SRUdfV09SRF9QSU8oJnJlZy0+Zmxhc2hfZGF0YSk7CisJCQlkYXRhMiA9IFJEX1JFR19XT1JEX1BJTyhQSU9fUkVHKGhhLCBmbGFzaF9kYXRhKSk7CiAJCX0gd2hpbGUgKGRhdGEgIT0gZGF0YTIpOwogCX0gZWxzZSB7CiAJCVdSVF9SRUdfV09SRCgmcmVnLT5mbGFzaF9hZGRyZXNzLCAodWludDE2X3QpYWRkcik7CkBAIC0xMzA0LDkgKzEyOTksOCBAQAogCiAJLyogQWx3YXlzIHBlcmZvcm0gSU8gbWFwcGVkIGFjY2Vzc2VzIHRvIHRoZSBGTEFTSCByZWdpc3RlcnMuICovCiAJaWYgKGhhLT5waW9fYWRkcmVzcykgewotCQlyZWcgPSAoc3RydWN0IGRldmljZV9yZWdfMnh4eCBfX2lvbWVtICopaGEtPnBpb19hZGRyZXNzOwotCQlXUlRfUkVHX1dPUkRfUElPKCZyZWctPmZsYXNoX2FkZHJlc3MsICh1aW50MTZfdClhZGRyKTsKLQkJV1JUX1JFR19XT1JEX1BJTygmcmVnLT5mbGFzaF9kYXRhLCAodWludDE2X3QpZGF0YSk7CisJCVdSVF9SRUdfV09SRF9QSU8oUElPX1JFRyhoYSwgZmxhc2hfYWRkcmVzcyksICh1aW50MTZfdClhZGRyKTsKKwkJV1JUX1JFR19XT1JEX1BJTyhQSU9fUkVHKGhhLCBmbGFzaF9kYXRhKSwgKHVpbnQxNl90KWRhdGEpOwogCX0gZWxzZSB7CiAJCVdSVF9SRUdfV09SRCgmcmVnLT5mbGFzaF9hZGRyZXNzLCAodWludDE2X3QpYWRkcik7CiAJCVJEX1JFR19XT1JEKCZyZWctPmN0cmxfc3RhdHVzKTsJCS8qIFBDSSBQb3N0aW5nLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmgKaW5kZXggMmMyZjZiNC4uYzU3NDJjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oCkBAIC03LDcgKzcsNyBAQAogLyoKICAqIERyaXZlciB2ZXJzaW9uCiAgKi8KLSNkZWZpbmUgUUxBMlhYWF9WRVJTSU9OICAgICAgIjguMDIuMDAtazciCisjZGVmaW5lIFFMQTJYWFhfVkVSU0lPTiAgICAgICI4LjAyLjAwLWs4IgogCiAjZGVmaW5lIFFMQV9EUklWRVJfTUFKT1JfVkVSCTgKICNkZWZpbmUgUUxBX0RSSVZFUl9NSU5PUl9WRVIJMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2luaXQuYyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pbml0LmMKaW5kZXggNDk5MjVmOS4uMTBiM2I5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaW5pdC5jCkBAIC0xMzA2LDYgKzEzMDYsNyBAQAogCQlhdG9taWNfc2V0KCZkZGJfZW50cnktPnJlbG9naW5fdGltZXIsIDApOwogCQljbGVhcl9iaXQoREZfUkVMT0dJTiwgJmRkYl9lbnRyeS0+ZmxhZ3MpOwogCQljbGVhcl9iaXQoREZfTk9fUkVMT0dJTiwgJmRkYl9lbnRyeS0+ZmxhZ3MpOworCQlpc2NzaV91bmJsb2NrX3Nlc3Npb24oZGRiX2VudHJ5LT5zZXNzKTsKIAkJaXNjc2lfc2Vzc2lvbl9ldmVudChkZGJfZW50cnktPnNlc3MsCiAJCQkJICAgIElTQ1NJX0tFVkVOVF9DUkVBVEVfU0VTU0lPTik7CiAJCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfb3MuYyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9vcy5jCmluZGV4IDJlMmI5ZmUuLmMzYzU5ZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9vcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9vcy5jCkBAIC02Myw4ICs2Myw2IEBACiAJCQkJICBlbnVtIGlzY3NpX3BhcmFtIHBhcmFtLCBjaGFyICpidWYpOwogc3RhdGljIGludCBxbGE0eHh4X2hvc3RfZ2V0X3BhcmFtKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAogCQkJCSAgZW51bSBpc2NzaV9ob3N0X3BhcmFtIHBhcmFtLCBjaGFyICpidWYpOwotc3RhdGljIHZvaWQgcWxhNHh4eF9jb25uX3N0b3Aoc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uLCBpbnQgZmxhZyk7Ci1zdGF0aWMgaW50IHFsYTR4eHhfY29ubl9zdGFydChzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNvbm4pOwogc3RhdGljIHZvaWQgcWxhNHh4eF9yZWNvdmVyeV90aW1lZG91dChzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKnNlc3Npb24pOwogCiAvKgpAQCAtOTEsNiArODksOCBAQAogCS5zbGF2ZV9hbGxvYwkJPSBxbGE0eHh4X3NsYXZlX2FsbG9jLAogCS5zbGF2ZV9kZXN0cm95CQk9IHFsYTR4eHhfc2xhdmVfZGVzdHJveSwKIAorCS5zY2FuX2ZpbmlzaGVkCQk9IGlzY3NpX3NjYW5fZmluaXNoZWQsCisKIAkudGhpc19pZAkJPSAtMSwKIAkuY21kX3Blcl9sdW4JCT0gMywKIAkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCkBAIC0xMTYsOCArMTE2LDYgQEAKIAkuZ2V0X2Nvbm5fcGFyYW0JCT0gcWxhNHh4eF9jb25uX2dldF9wYXJhbSwKIAkuZ2V0X3Nlc3Npb25fcGFyYW0JPSBxbGE0eHh4X3Nlc3NfZ2V0X3BhcmFtLAogCS5nZXRfaG9zdF9wYXJhbQkJPSBxbGE0eHh4X2hvc3RfZ2V0X3BhcmFtLAotCS5zdGFydF9jb25uCQk9IHFsYTR4eHhfY29ubl9zdGFydCwKLQkuc3RvcF9jb25uCQk9IHFsYTR4eHhfY29ubl9zdG9wLAogCS5zZXNzaW9uX3JlY292ZXJ5X3RpbWVkb3V0ID0gcWxhNHh4eF9yZWNvdmVyeV90aW1lZG91dCwKIH07CiAKQEAgLTEyOCw0OCArMTI2LDE5IEBACiAJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5ID0gc2Vzc2lvbi0+ZGRfZGF0YTsKIAlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSBkZGJfZW50cnktPmhhOwogCi0JREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IGluZGV4IFslZF0gcG9ydCBkb3duIHJldHJ5IGNvdW50IG9mICglZCkgIgotCQkgICAgICAic2VjcyBleGhhdXN0ZWQsIG1hcmtpbmcgZGV2aWNlIERFQUQuXG4iLCBoYS0+aG9zdF9ubywKLQkJICAgICAgX19mdW5jX18sIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4LAotCQkgICAgICBoYS0+cG9ydF9kb3duX3JldHJ5X2NvdW50KSk7CisJaWYgKGF0b21pY19yZWFkKCZkZGJfZW50cnktPnN0YXRlKSAhPSBEREJfU1RBVEVfT05MSU5FKSB7CisJCWF0b21pY19zZXQoJmRkYl9lbnRyeS0+c3RhdGUsIEREQl9TVEFURV9ERUFEKTsKIAotCWF0b21pY19zZXQoJmRkYl9lbnRyeS0+c3RhdGUsIEREQl9TVEFURV9ERUFEKTsKKwkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IGluZGV4IFslZF0gcG9ydCBkb3duIHJldHJ5IGNvdW50ICIKKwkJCSAgICAgICJvZiAoJWQpIHNlY3MgZXhoYXVzdGVkLCBtYXJraW5nIGRldmljZSBERUFELlxuIiwKKwkJCSAgICAgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgsCisJCQkgICAgICBoYS0+cG9ydF9kb3duX3JldHJ5X2NvdW50KSk7CiAKLQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogc2NoZWR1bGluZyBkcGMgcm91dGluZSAtIGRwYyBmbGFncyA9ICIKLQkJICAgICAgIjB4JWx4XG4iLCBoYS0+aG9zdF9ubywgX19mdW5jX18sIGhhLT5kcGNfZmxhZ3MpKTsKLQlxdWV1ZV93b3JrKGhhLT5kcGNfdGhyZWFkLCAmaGEtPmRwY193b3JrKTsKLX0KLQotc3RhdGljIGludCBxbGE0eHh4X2Nvbm5fc3RhcnQoc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uKQotewotCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbjsKLQlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnk7Ci0KLQlzZXNzaW9uID0gaXNjc2lfZGV2X3RvX3Nlc3Npb24oY29ubi0+ZGV2LnBhcmVudCk7Ci0JZGRiX2VudHJ5ID0gc2Vzc2lvbi0+ZGRfZGF0YTsKLQotCURFQlVHMihwcmludGsoInNjc2klbGQ6ICVzOiBpbmRleCBbJWRdIHN0YXJ0aW5nIGNvbm5cbiIsCi0JCSAgICAgIGRkYl9lbnRyeS0+aGEtPmhvc3Rfbm8sIF9fZnVuY19fLAotCQkgICAgICBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCkpOwotCWlzY3NpX3VuYmxvY2tfc2Vzc2lvbihzZXNzaW9uKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcWxhNHh4eF9jb25uX3N0b3Aoc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uLCBpbnQgZmxhZykKLXsKLQlzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKnNlc3Npb247Ci0Jc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5OwotCi0Jc2Vzc2lvbiA9IGlzY3NpX2Rldl90b19zZXNzaW9uKGNvbm4tPmRldi5wYXJlbnQpOwotCWRkYl9lbnRyeSA9IHNlc3Npb24tPmRkX2RhdGE7Ci0KLQlERUJVRzIocHJpbnRrKCJzY3NpJWxkOiAlczogaW5kZXggWyVkXSBzdG9wcGluZyBjb25uXG4iLAotCQkgICAgICBkZGJfZW50cnktPmhhLT5ob3N0X25vLCBfX2Z1bmNfXywKLQkJICAgICAgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgpKTsKLQlpZiAoZmxhZyA9PSBTVE9QX0NPTk5fUkVDT1ZFUikKLQkJaXNjc2lfYmxvY2tfc2Vzc2lvbihzZXNzaW9uKTsKLQllbHNlCi0JCXByaW50ayhLRVJOX0VSUiAiaXNjc2k6IGludmFsaWQgc3RvcCBmbGFnICVkXG4iLCBmbGFnKTsKKwkJREVCVUcyKHByaW50aygic2NzaSVsZDogJXM6IHNjaGVkdWxpbmcgZHBjIHJvdXRpbmUgLSBkcGMgIgorCQkJICAgICAgImZsYWdzID0gMHglbHhcbiIsCisJCQkgICAgICBoYS0+aG9zdF9ubywgX19mdW5jX18sIGhhLT5kcGNfZmxhZ3MpKTsKKwkJcXVldWVfd29yayhoYS0+ZHBjX3RocmVhZCwgJmhhLT5kcGNfd29yayk7CisJfQogfQogCiBzdGF0aWMgaW50IHFsYTR4eHhfaG9zdF9nZXRfcGFyYW0oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCkBAIC0zMDgsNiArMjc3LDkgQEAKIAkJREVCVUcyKHByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IGFkZCBjb25uZWN0aW9uLlxuIikpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CisKKwkvKiBmaW5hbGx5IHJlYWR5IHRvIGdvICovCisJaXNjc2lfdW5ibG9ja19zZXNzaW9uKGRkYl9lbnRyeS0+c2Vzcyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM2NCw2ICszMzYsNyBAQAogCURFQlVHMyhwcmludGsoInNjc2klZDolZDolZDogaW5kZXggWyVkXSBtYXJrZWQgTUlTU0lOR1xuIiwKIAkJICAgICAgaGEtPmhvc3Rfbm8sIGRkYl9lbnRyeS0+YnVzLCBkZGJfZW50cnktPnRhcmdldCwKIAkJICAgICAgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgpKTsKKwlpc2NzaV9ibG9ja19zZXNzaW9uKGRkYl9lbnRyeS0+c2Vzcyk7CiAJaXNjc2lfY29ubl9lcnJvcihkZGJfZW50cnktPmNvbm4sIElTQ1NJX0VSUl9DT05OX0ZBSUxFRCk7CiB9CiAKQEAgLTQzMCw5ICs0MDMsMjEgQEAKIHsKIAlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEgPSB0b19xbGFfaG9zdChjbWQtPmRldmljZS0+aG9zdCk7CiAJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5ID0gY21kLT5kZXZpY2UtPmhvc3RkYXRhOworCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2VzcyA9IGRkYl9lbnRyeS0+c2VzczsKIAlzdHJ1Y3Qgc3JiICpzcmI7CiAJaW50IHJ2YWw7CiAKKwlpZiAoIXNlc3MpIHsKKwkJY21kLT5yZXN1bHQgPSBESURfSU1NX1JFVFJZIDw8IDE2OworCQlnb3RvIHFjX2ZhaWxfY29tbWFuZDsKKwl9CisKKwlydmFsID0gaXNjc2lfc2Vzc2lvbl9jaGtyZWFkeShzZXNzKTsKKwlpZiAocnZhbCkgeworCQljbWQtPnJlc3VsdCA9IHJ2YWw7CisJCWdvdG8gcWNfZmFpbF9jb21tYW5kOworCX0KKwogCWlmIChhdG9taWNfcmVhZCgmZGRiX2VudHJ5LT5zdGF0ZSkgIT0gRERCX1NUQVRFX09OTElORSkgewogCQlpZiAoYXRvbWljX3JlYWQoJmRkYl9lbnRyeS0+c3RhdGUpID09IEREQl9TVEFURV9ERUFEKSB7CiAJCQljbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OwpAQCAtMTMyMyw3ICsxMzA4LDcgQEAKIAkgICAgICAgcWxhNHh4eF92ZXJzaW9uX3N0ciwgaGEtPnBkZXYtPmRldmljZSwgcGNpX25hbWUoaGEtPnBkZXYpLAogCSAgICAgICBoYS0+aG9zdF9ubywgaGEtPmZpcm13YXJlX3ZlcnNpb25bMF0sIGhhLT5maXJtd2FyZV92ZXJzaW9uWzFdLAogCSAgICAgICBoYS0+cGF0Y2hfbnVtYmVyLCBoYS0+YnVpbGRfbnVtYmVyKTsKLQorCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOwogCXJldHVybiAwOwogCiByZW1vdmVfaG9zdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpLmMgYi9kcml2ZXJzL3Njc2kvc2NzaS5jCmluZGV4IGIzNWQxOTQuLmZlY2JhMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2kuYwpAQCAtOTY5LDkgKzk2OSwxMCBAQAogRVhQT1JUX1NZTUJPTChzdGFyZ2V0X2Zvcl9lYWNoX2RldmljZSk7CiAKIC8qKgotICogX19zdGFyZ2V0X2Zvcl9lYWNoX2RldmljZSAgLSAgaGVscGVyIHRvIHdhbGsgYWxsIGRldmljZXMgb2YgYSB0YXJnZXQKLSAqCQkJCSAoVU5MT0NLRUQpCisgKiBfX3N0YXJnZXRfZm9yX2VhY2hfZGV2aWNlIC0gaGVscGVyIHRvIHdhbGsgYWxsIGRldmljZXMgb2YgYSB0YXJnZXQgKFVOTE9DS0VEKQogICogQHN0YXJnZXQ6CXRhcmdldCB3aG9zZSBkZXZpY2VzIHdlIHdhbnQgdG8gaXRlcmF0ZSBvdmVyLgorICogQGRhdGE6CXBhcmFtZXRlciBmb3IgY2FsbGJhY2sgQGZuKCkKKyAqIEBmbjoJCWNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZCBmb3IgZWFjaCBkZXZpY2UKICAqCiAgKiBUaGlzIHRyYXZlcnNlcyBvdmVyIGVhY2ggZGV2aWNlIG9mIEBzdGFyZ2V0LiAgSXQgZG9lcyBfbm90XwogICogdGFrZSBhIHJlZmVyZW5jZSBvbiB0aGUgc2NzaV9kZXZpY2UsIHNvIHRoZSB3aG9sZSBsb29wIG11c3QgYmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jIGIvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMKaW5kZXggZjI0M2ZjMzAuLjEzNWMxZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCkBAIC0zMDEsNyArMzAxLDYgQEAKIAkJcGFnZSA9IHNnX3BhZ2Uoc2cpOwogCQlvZmYgPSBzZy0+b2Zmc2V0OwogCQlsZW4gPSBzZy0+bGVuZ3RoOwotIAkJZGF0YV9sZW4gKz0gbGVuOwogCiAJCXdoaWxlIChsZW4gPiAwICYmIGRhdGFfbGVuID4gMCkgewogCQkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5jIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKaW5kZXggMGQ3YjRlNy4uZmFjNzUzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2lzY3NpLmMKQEAgLTMwLDEwICszMCwxMCBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuaD4KICNpbmNsdWRlIDxzY3NpL2lzY3NpX2lmLmg+CiAKLSNkZWZpbmUgSVNDU0lfU0VTU0lPTl9BVFRSUyAxOAotI2RlZmluZSBJU0NTSV9DT05OX0FUVFJTIDExCisjZGVmaW5lIElTQ1NJX1NFU1NJT05fQVRUUlMgMTkKKyNkZWZpbmUgSVNDU0lfQ09OTl9BVFRSUyAxMwogI2RlZmluZSBJU0NTSV9IT1NUX0FUVFJTIDQKLSNkZWZpbmUgSVNDU0lfVFJBTlNQT1JUX1ZFUlNJT04gIjIuMC04NjciCisjZGVmaW5lIElTQ1NJX1RSQU5TUE9SVF9WRVJTSU9OICIyLjAtODY4IgogCiBzdHJ1Y3QgaXNjc2lfaW50ZXJuYWwgewogCWludCBkYWVtb25fcGlkOwpAQCAtMTI3LDEyICsxMjcsMTMgQEAKIAltZW1zZXQoaWhvc3QsIDAsIHNpemVvZigqaWhvc3QpKTsKIAlJTklUX0xJU1RfSEVBRCgmaWhvc3QtPnNlc3Npb25zKTsKIAltdXRleF9pbml0KCZpaG9zdC0+bXV0ZXgpOworCWF0b21pY19zZXQoJmlob3N0LT5ucl9zY2FucywgMCk7CiAKLQlzbnByaW50ZihpaG9zdC0+dW5iaW5kX3dvcmtxX25hbWUsIEtPQkpfTkFNRV9MRU4sICJpc2NzaV91bmJpbmRfJWQiLAorCXNucHJpbnRmKGlob3N0LT5zY2FuX3dvcmtxX25hbWUsIEtPQkpfTkFNRV9MRU4sICJpc2NzaV9zY2FuXyVkIiwKIAkJc2hvc3QtPmhvc3Rfbm8pOwotCWlob3N0LT51bmJpbmRfd29ya3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgKLQkJCQkJCWlob3N0LT51bmJpbmRfd29ya3FfbmFtZSk7Ci0JaWYgKCFpaG9zdC0+dW5iaW5kX3dvcmtxKQorCWlob3N0LT5zY2FuX3dvcmtxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoCisJCQkJCQlpaG9zdC0+c2Nhbl93b3JrcV9uYW1lKTsKKwlpZiAoIWlob3N0LT5zY2FuX3dvcmtxKQogCQlyZXR1cm4gLUVOT01FTTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE0Myw3ICsxNDQsNyBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KGRldik7CiAJc3RydWN0IGlzY3NpX2hvc3QgKmlob3N0ID0gc2hvc3QtPnNob3N0X2RhdGE7CiAKLQlkZXN0cm95X3dvcmtxdWV1ZShpaG9zdC0+dW5iaW5kX3dvcmtxKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShpaG9zdC0+c2Nhbl93b3JrcSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIyMSw2ICsyMjIsNTQgQEAKICAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIGJ5IExMRHMgdGhhdCBhbGxvY2F0ZQogICogdGhlaXIgb3duIHNjc2lfaG9zdHMgb3IgYnkgc29mdHdhcmUgaXNjc2kgTExEcwogICovCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgdmFsdWU7CisJY2hhciAqbmFtZTsKK30gaXNjc2lfc2Vzc2lvbl9zdGF0ZV9uYW1lc1tdID0geworCXsgSVNDU0lfU0VTU0lPTl9MT0dHRURfSU4sCSJMT0dHRURfSU4iIH0sCisJeyBJU0NTSV9TRVNTSU9OX0ZBSUxFRCwJCSJGQUlMRUQiIH0sCisJeyBJU0NTSV9TRVNTSU9OX0ZSRUUsCQkiRlJFRSIgfSwKK307CisKK2NvbnN0IGNoYXIgKmlzY3NpX3Nlc3Npb25fc3RhdGVfbmFtZShpbnQgc3RhdGUpCit7CisJaW50IGk7CisJY2hhciAqbmFtZSA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpc2NzaV9zZXNzaW9uX3N0YXRlX25hbWVzKTsgaSsrKSB7CisJCWlmIChpc2NzaV9zZXNzaW9uX3N0YXRlX25hbWVzW2ldLnZhbHVlID09IHN0YXRlKSB7CisJCQluYW1lID0gaXNjc2lfc2Vzc2lvbl9zdGF0ZV9uYW1lc1tpXS5uYW1lOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIG5hbWU7Cit9CisKK2ludCBpc2NzaV9zZXNzaW9uX2Noa3JlYWR5KHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2Vzc2lvbi0+bG9jaywgZmxhZ3MpOworCXN3aXRjaCAoc2Vzc2lvbi0+c3RhdGUpIHsKKwljYXNlIElTQ1NJX1NFU1NJT05fTE9HR0VEX0lOOgorCQllcnIgPSAwOworCQlicmVhazsKKwljYXNlIElTQ1NJX1NFU1NJT05fRkFJTEVEOgorCQllcnIgPSBESURfSU1NX1JFVFJZIDw8IDE2OworCQlicmVhazsKKwljYXNlIElTQ1NJX1NFU1NJT05fRlJFRToKKwkJZXJyID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2Vzc2lvbi0+bG9jaywgZmxhZ3MpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9zZXNzaW9uX2Noa3JlYWR5KTsKKwogc3RhdGljIHZvaWQgaXNjc2lfc2Vzc2lvbl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKnNlc3Npb24gPSBpc2NzaV9kZXZfdG9fc2Vzc2lvbihkZXYpOwpAQCAtMjM2LDYgKzI4NSwyNSBAQAogCXJldHVybiBkZXYtPnJlbGVhc2UgPT0gaXNjc2lfc2Vzc2lvbl9yZWxlYXNlOwogfQogCisvKioKKyAqIGlzY3NpX3NjYW5fZmluaXNoZWQgLSBoZWxwZXIgdG8gcmVwb3J0IHdoZW4gcnVubmluZyBzY2FucyBhcmUgZG9uZQorICogQHNob3N0OiBzY3NpIGhvc3QKKyAqIEB0aW1lOiBzY2FuIHJ1biB0aW1lCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBieSBkcml2ZXMgbGlrZSBxbGE0eHh4IHRvIHJlcG9ydCB0byB0aGUgc2NzaQorICogbGF5ZXIgd2hlbiB0aGUgc2NhbnMgaXQga2lja2VkIG9mZiBhdCBtb2R1bGUgbG9hZCB0aW1lIGFyZSBkb25lLgorICovCitpbnQgaXNjc2lfc2Nhbl9maW5pc2hlZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgdW5zaWduZWQgbG9uZyB0aW1lKQoreworCXN0cnVjdCBpc2NzaV9ob3N0ICppaG9zdCA9IHNob3N0LT5zaG9zdF9kYXRhOworCS8qCisJICogcWxhNHh4eCB3aWxsIGhhdmUga2lja2VkIG9mZiBzb21lIHNlc3Npb24gdW5ibG9ja3MgYmVmb3JlIGNhbGxpbmcKKwkgKiBzY3NpX3NjYW5faG9zdCwgc28ganVzdCB3YWl0IGZvciB0aGVtIHRvIGNvbXBsZXRlLgorCSAqLworCXJldHVybiAhYXRvbWljX3JlYWQoJmlob3N0LT5ucl9zY2Fucyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV9zY2FuX2ZpbmlzaGVkKTsKKwogc3RhdGljIGludCBpc2NzaV91c2VyX3NjYW4oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHVpbnQgY2hhbm5lbCwKIAkJCSAgIHVpbnQgaWQsIHVpbnQgbHVuKQogewpAQCAtMjU0LDE0ICszMjIsNTAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgaXNjc2lfc2Nhbl9zZXNzaW9uKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKnNlc3Npb24gPQorCQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiwgc2Nhbl93b3JrKTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGlzY3NpX3Nlc3Npb25fdG9fc2hvc3Qoc2Vzc2lvbik7CisJc3RydWN0IGlzY3NpX2hvc3QgKmlob3N0ID0gc2hvc3QtPnNob3N0X2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZXNzaW9uLT5sb2NrLCBmbGFncyk7CisJaWYgKHNlc3Npb24tPnN0YXRlICE9IElTQ1NJX1NFU1NJT05fTE9HR0VEX0lOKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlc3Npb24tPmxvY2ssIGZsYWdzKTsKKwkJZ290byBkb25lOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZXNzaW9uLT5sb2NrLCBmbGFncyk7CisKKwlzY3NpX3NjYW5fdGFyZ2V0KCZzZXNzaW9uLT5kZXYsIDAsIHNlc3Npb24tPnRhcmdldF9pZCwKKwkJCSBTQ0FOX1dJTERfQ0FSRCwgMSk7Citkb25lOgorCWF0b21pY19kZWMoJmlob3N0LT5ucl9zY2Fucyk7Cit9CisKIHN0YXRpYyB2b2lkIHNlc3Npb25fcmVjb3ZlcnlfdGltZWRvdXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbiA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24sCiAJCQkgICAgIHJlY292ZXJ5X3dvcmsud29yayk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRldl9wcmludGsoS0VSTl9JTkZPLCAmc2Vzc2lvbi0+ZGV2LCAiaXNjc2k6IHNlc3Npb24gcmVjb3ZlcnkgdGltZWQgIgotCQkgICJvdXQgYWZ0ZXIgJWQgc2Vjc1xuIiwgc2Vzc2lvbi0+cmVjb3ZlcnlfdG1vKTsKKwlpc2NzaV9jbHNfc2Vzc2lvbl9wcmludGsoS0VSTl9JTkZPLCBzZXNzaW9uLAorCQkJCSAic2Vzc2lvbiByZWNvdmVyeSB0aW1lZCBvdXQgYWZ0ZXIgJWQgc2Vjc1xuIiwKKwkJCQkgc2Vzc2lvbi0+cmVjb3ZlcnlfdG1vKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZXNzaW9uLT5sb2NrLCBmbGFncyk7CisJc3dpdGNoIChzZXNzaW9uLT5zdGF0ZSkgeworCWNhc2UgSVNDU0lfU0VTU0lPTl9GQUlMRUQ6CisJCXNlc3Npb24tPnN0YXRlID0gSVNDU0lfU0VTU0lPTl9GUkVFOworCQlicmVhazsKKwljYXNlIElTQ1NJX1NFU1NJT05fTE9HR0VEX0lOOgorCWNhc2UgSVNDU0lfU0VTU0lPTl9GUkVFOgorCQkvKiB3ZSByYWNlZCB3aXRoIHRoZSB1bmJsb2NrJ3MgZmx1c2ggKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2Vzc2lvbi0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlc3Npb24tPmxvY2ssIGZsYWdzKTsKIAogCWlmIChzZXNzaW9uLT50cmFuc3BvcnQtPnNlc3Npb25fcmVjb3ZlcnlfdGltZWRvdXQpCiAJCXNlc3Npb24tPnRyYW5zcG9ydC0+c2Vzc2lvbl9yZWNvdmVyeV90aW1lZG91dChzZXNzaW9uKTsKQEAgLTI2OSwxNiArMzczLDQ0IEBACiAJc2NzaV90YXJnZXRfdW5ibG9jaygmc2Vzc2lvbi0+ZGV2KTsKIH0KIAotdm9pZCBpc2NzaV91bmJsb2NrX3Nlc3Npb24oc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzaW9uKQordm9pZCBfX2lzY3NpX3VuYmxvY2tfc2Vzc2lvbihzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKnNlc3Npb24pCiB7CiAJaWYgKCFjYW5jZWxfZGVsYXllZF93b3JrKCZzZXNzaW9uLT5yZWNvdmVyeV93b3JrKSkKIAkJZmx1c2hfd29ya3F1ZXVlKGlzY3NpX2VoX3RpbWVyX3dvcmtxKTsKIAlzY3NpX3RhcmdldF91bmJsb2NrKCZzZXNzaW9uLT5kZXYpOwogfQorCit2b2lkIGlzY3NpX3VuYmxvY2tfc2Vzc2lvbihzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKnNlc3Npb24pCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBpc2NzaV9zZXNzaW9uX3RvX3Nob3N0KHNlc3Npb24pOworCXN0cnVjdCBpc2NzaV9ob3N0ICppaG9zdCA9IHNob3N0LT5zaG9zdF9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2Vzc2lvbi0+bG9jaywgZmxhZ3MpOworCXNlc3Npb24tPnN0YXRlID0gSVNDU0lfU0VTU0lPTl9MT0dHRURfSU47CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2Vzc2lvbi0+bG9jaywgZmxhZ3MpOworCisJX19pc2NzaV91bmJsb2NrX3Nlc3Npb24oc2Vzc2lvbik7CisJLyoKKwkgKiBPbmx5IGRvIGtlcm5lbCBzY2FubmluZyBpZiB0aGUgZHJpdmVyIGlzIHByb3Blcmx5IGhvb2tlZCBpbnRvCisJICogdGhlIGFzeW5jIHNjYW5uaW5nIGNvZGUgKGRyaXZlcnMgbGlrZSBpc2NzaV90Y3AgZG8gbG9naW4gYW5kCisJICogc2Nhbm5pbmcgZnJvbSB1c2Vyc3BhY2UpLgorCSAqLworCWlmIChzaG9zdC0+aG9zdHQtPnNjYW5fZmluaXNoZWQpIHsKKwkJaWYgKHF1ZXVlX3dvcmsoaWhvc3QtPnNjYW5fd29ya3EsICZzZXNzaW9uLT5zY2FuX3dvcmspKQorCQkJYXRvbWljX2luYygmaWhvc3QtPm5yX3NjYW5zKTsKKwl9Cit9CiBFWFBPUlRfU1lNQk9MX0dQTChpc2NzaV91bmJsb2NrX3Nlc3Npb24pOwogCiB2b2lkIGlzY3NpX2Jsb2NrX3Nlc3Npb24oc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzaW9uKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2Vzc2lvbi0+bG9jaywgZmxhZ3MpOworCXNlc3Npb24tPnN0YXRlID0gSVNDU0lfU0VTU0lPTl9GQUlMRUQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2Vzc2lvbi0+bG9jaywgZmxhZ3MpOworCiAJc2NzaV90YXJnZXRfYmxvY2soJnNlc3Npb24tPmRldik7CiAJcXVldWVfZGVsYXllZF93b3JrKGlzY3NpX2VoX3RpbWVyX3dvcmtxLCAmc2Vzc2lvbi0+cmVjb3Zlcnlfd29yaywKIAkJCSAgIHNlc3Npb24tPnJlY292ZXJ5X3RtbyAqIEhaKTsKQEAgLTMxMSw3ICs0NDMsNyBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gaXNjc2lfc2Vzc2lvbl90b19zaG9zdChzZXNzaW9uKTsKIAlzdHJ1Y3QgaXNjc2lfaG9zdCAqaWhvc3QgPSBzaG9zdC0+c2hvc3RfZGF0YTsKIAotCXJldHVybiBxdWV1ZV93b3JrKGlob3N0LT51bmJpbmRfd29ya3EsICZzZXNzaW9uLT51bmJpbmRfd29yayk7CisJcmV0dXJuIHF1ZXVlX3dvcmsoaWhvc3QtPnNjYW5fd29ya3EsICZzZXNzaW9uLT51bmJpbmRfd29yayk7CiB9CiAKIHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqCkBAIC0zMjcsMTAgKzQ1OSwxMyBAQAogCiAJc2Vzc2lvbi0+dHJhbnNwb3J0ID0gdHJhbnNwb3J0OwogCXNlc3Npb24tPnJlY292ZXJ5X3RtbyA9IDEyMDsKKwlzZXNzaW9uLT5zdGF0ZSA9IElTQ1NJX1NFU1NJT05fRlJFRTsKIAlJTklUX0RFTEFZRURfV09SSygmc2Vzc2lvbi0+cmVjb3Zlcnlfd29yaywgc2Vzc2lvbl9yZWNvdmVyeV90aW1lZG91dCk7CiAJSU5JVF9MSVNUX0hFQUQoJnNlc3Npb24tPmhvc3RfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJnNlc3Npb24tPnNlc3NfbGlzdCk7CiAJSU5JVF9XT1JLKCZzZXNzaW9uLT51bmJpbmRfd29yaywgX19pc2NzaV91bmJpbmRfc2Vzc2lvbik7CisJSU5JVF9XT1JLKCZzZXNzaW9uLT5zY2FuX3dvcmssIGlzY3NpX3NjYW5fc2Vzc2lvbik7CisJc3Bpbl9sb2NrX2luaXQoJnNlc3Npb24tPmxvY2spOwogCiAJLyogdGhpcyBpcyByZWxlYXNlZCBpbiB0aGUgZGV2J3MgcmVsZWFzZSBmdW5jdGlvbiAqLwogCXNjc2lfaG9zdF9nZXQoc2hvc3QpOwpAQCAtMzU4LDggKzQ5Myw4IEBACiAJCSBzZXNzaW9uLT5zaWQpOwogCWVyciA9IGRldmljZV9hZGQoJnNlc3Npb24tPmRldik7CiAJaWYgKGVycikgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmc2Vzc2lvbi0+ZGV2LCAiaXNjc2k6IGNvdWxkIG5vdCAiCi0JCQkgICAicmVnaXN0ZXIgc2Vzc2lvbidzIGRldlxuIik7CisJCWlzY3NpX2Nsc19zZXNzaW9uX3ByaW50ayhLRVJOX0VSUiwgc2Vzc2lvbiwKKwkJCQkJICJjb3VsZCBub3QgcmVnaXN0ZXIgc2Vzc2lvbidzIGRldlxuIik7CiAJCWdvdG8gcmVsZWFzZV9ob3N0OwogCX0KIAl0cmFuc3BvcnRfcmVnaXN0ZXJfZGV2aWNlKCZzZXNzaW9uLT5kZXYpOwpAQCAtNDQ0LDIyICs1NzksMjggQEAKIAkgKiBJZiB3ZSBhcmUgYmxvY2tlZCBsZXQgY29tbWFuZHMgZmxvdyBhZ2Fpbi4gVGhlIGxsZCBvciBpc2NzaQogCSAqIGxheWVyIHNob3VsZCBzZXQgdXAgdGhlIHF1ZXVlY29tbWFuZCB0byBmYWlsIGNvbW1hbmRzLgogCSAqLwotCWlzY3NpX3VuYmxvY2tfc2Vzc2lvbihzZXNzaW9uKTsKLQlpc2NzaV91bmJpbmRfc2Vzc2lvbihzZXNzaW9uKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2Vzc2lvbi0+bG9jaywgZmxhZ3MpOworCXNlc3Npb24tPnN0YXRlID0gSVNDU0lfU0VTU0lPTl9GUkVFOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlc3Npb24tPmxvY2ssIGZsYWdzKTsKKwlfX2lzY3NpX3VuYmxvY2tfc2Vzc2lvbihzZXNzaW9uKTsKKwlfX2lzY3NpX3VuYmluZF9zZXNzaW9uKCZzZXNzaW9uLT51bmJpbmRfd29yayk7CisKKwkvKiBmbHVzaCBydW5uaW5nIHNjYW5zICovCisJZmx1c2hfd29ya3F1ZXVlKGlob3N0LT5zY2FuX3dvcmtxKTsKIAkvKgogCSAqIElmIHRoZSBzZXNzaW9uIGRyb3BwZWQgd2hpbGUgcmVtb3ZpbmcgZGV2aWNlcyB0aGVuIHdlIG5lZWQgdG8gbWFrZQogCSAqIHN1cmUgaXQgaXMgbm90IGJsb2NrZWQKIAkgKi8KIAlpZiAoIWNhbmNlbF9kZWxheWVkX3dvcmsoJnNlc3Npb24tPnJlY292ZXJ5X3dvcmspKQogCQlmbHVzaF93b3JrcXVldWUoaXNjc2lfZWhfdGltZXJfd29ya3EpOwotCWZsdXNoX3dvcmtxdWV1ZShpaG9zdC0+dW5iaW5kX3dvcmtxKTsKIAogCS8qIGh3IGlzY3NpIG1heSBub3QgaGF2ZSByZW1vdmVkIGFsbCBjb25uZWN0aW9ucyBmcm9tIHNlc3Npb24gKi8KIAllcnIgPSBkZXZpY2VfZm9yX2VhY2hfY2hpbGQoJnNlc3Npb24tPmRldiwgTlVMTCwKIAkJCQkgICAgaXNjc2lfaXRlcl9kZXN0cm95X2Nvbm5fZm4pOwogCWlmIChlcnIpCi0JCWRldl9wcmludGsoS0VSTl9FUlIsICZzZXNzaW9uLT5kZXYsICJpc2NzaTogQ291bGQgbm90IGRlbGV0ZSAiCi0JCQkgICAiYWxsIGNvbm5lY3Rpb25zIGZvciBzZXNzaW9uLiBFcnJvciAlZC5cbiIsIGVycik7CisJCWlzY3NpX2Nsc19zZXNzaW9uX3ByaW50ayhLRVJOX0VSUiwgc2Vzc2lvbiwKKwkJCQkJICJDb3VsZCBub3QgZGVsZXRlIGFsbCBjb25uZWN0aW9ucyAiCisJCQkJCSAiZm9yIHNlc3Npb24uIEVycm9yICVkLlxuIiwgZXJyKTsKIAogCXRyYW5zcG9ydF91bnJlZ2lzdGVyX2RldmljZSgmc2Vzc2lvbi0+ZGV2KTsKIAlkZXZpY2VfZGVsKCZzZXNzaW9uLT5kZXYpOwpAQCAtNTMxLDggKzY3Miw4IEBACiAJY29ubi0+ZGV2LnJlbGVhc2UgPSBpc2NzaV9jb25uX3JlbGVhc2U7CiAJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZjb25uLT5kZXYpOwogCWlmIChlcnIpIHsKLQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJmNvbm4tPmRldiwgImlzY3NpOiBjb3VsZCBub3QgcmVnaXN0ZXIgIgotCQkJICAgImNvbm5lY3Rpb24ncyBkZXZcbiIpOworCQlpc2NzaV9jbHNfc2Vzc2lvbl9wcmludGsoS0VSTl9FUlIsIHNlc3Npb24sICJjb3VsZCBub3QgIgorCQkJCQkgInJlZ2lzdGVyIGNvbm5lY3Rpb24ncyBkZXZcbiIpOwogCQlnb3RvIHJlbGVhc2VfcGFyZW50X3JlZjsKIAl9CiAJdHJhbnNwb3J0X3JlZ2lzdGVyX2RldmljZSgmY29ubi0+ZGV2KTsKQEAgLTYzOSw4ICs3ODAsOCBAQAogCXNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpOwogCWlmICghc2tiKSB7CiAJCWlzY3NpX2Nvbm5fZXJyb3IoY29ubiwgSVNDU0lfRVJSX0NPTk5fRkFJTEVEKTsKLQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJmNvbm4tPmRldiwgImlzY3NpOiBjYW4gbm90IGRlbGl2ZXIgIgotCQkJICAgImNvbnRyb2wgUERVOiBPT01cbiIpOworCQlpc2NzaV9jbHNfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sICJjYW4gbm90IGRlbGl2ZXIgIgorCQkJCSAgICAgICJjb250cm9sIFBEVTogT09NXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC02NjEsMjAgKzgwMiwyNyBAQAogCiB2b2lkIGlzY3NpX2Nvbm5fZXJyb3Ioc3RydWN0IGlzY3NpX2Nsc19jb25uICpjb25uLCBlbnVtIGlzY3NpX2VyciBlcnJvcikKIHsKKwlzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKnNlc3Npb24gPSBpc2NzaV9jb25uX3RvX3Nlc3Npb24oY29ubik7CiAJc3RydWN0IG5sbXNnaGRyCSpubGg7CiAJc3RydWN0IHNrX2J1ZmYJKnNrYjsKIAlzdHJ1Y3QgaXNjc2lfdWV2ZW50ICpldjsKIAlzdHJ1Y3QgaXNjc2lfaW50ZXJuYWwgKnByaXY7CiAJaW50IGxlbiA9IE5MTVNHX1NQQUNFKHNpemVvZigqZXYpKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcHJpdiA9IGlzY3NpX2lmX3RyYW5zcG9ydF9sb29rdXAoY29ubi0+dHJhbnNwb3J0KTsKIAlpZiAoIXByaXYpCiAJCXJldHVybjsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZzZXNzaW9uLT5sb2NrLCBmbGFncyk7CisJaWYgKHNlc3Npb24tPnN0YXRlID09IElTQ1NJX1NFU1NJT05fTE9HR0VEX0lOKQorCQlzZXNzaW9uLT5zdGF0ZSA9IElTQ1NJX1NFU1NJT05fRkFJTEVEOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlc3Npb24tPmxvY2ssIGZsYWdzKTsKKwogCXNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpOwogCWlmICghc2tiKSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsICZjb25uLT5kZXYsICJpc2NzaTogZ3JhY2VmdWxseSBpZ25vcmVkICIKLQkJCSAgImNvbm4gZXJyb3IgKCVkKVxuIiwgZXJyb3IpOworCQlpc2NzaV9jbHNfY29ubl9wcmludGsoS0VSTl9FUlIsIGNvbm4sICJncmFjZWZ1bGx5IGlnbm9yZWQgIgorCQkJCSAgICAgICJjb25uIGVycm9yICglZClcbiIsIGVycm9yKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNjg4LDggKzgzNiw4IEBACiAKIAlpc2NzaV9icm9hZGNhc3Rfc2tiKHNrYiwgR0ZQX0FUT01JQyk7CiAKLQlkZXZfcHJpbnRrKEtFUk5fSU5GTywgJmNvbm4tPmRldiwgImlzY3NpOiBkZXRlY3RlZCBjb25uIGVycm9yICglZClcbiIsCi0JCSAgIGVycm9yKTsKKwlpc2NzaV9jbHNfY29ubl9wcmludGsoS0VSTl9JTkZPLCBjb25uLCAiZGV0ZWN0ZWQgY29ubiBlcnJvciAoJWQpXG4iLAorCQkJICAgICAgZXJyb3IpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfY29ubl9lcnJvcik7CiAKQEAgLTc0NCw4ICs4OTIsOCBAQAogCiAJCXNrYnN0YXQgPSBhbGxvY19za2IobGVuLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFza2JzdGF0KSB7Ci0JCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmY29ubi0+ZGV2LCAiaXNjc2k6IGNhbiBub3QgIgotCQkJCSAgICJkZWxpdmVyIHN0YXRzOiBPT01cbiIpOworCQkJaXNjc2lfY2xzX2Nvbm5fcHJpbnRrKEtFUk5fRVJSLCBjb25uLCAiY2FuIG5vdCAiCisJCQkJCSAgICAgICJkZWxpdmVyIHN0YXRzOiBPT01cbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIApAQCAtODAxLDggKzk0OSw5IEBACiAKIAlza2IgPSBhbGxvY19za2IobGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNrYikgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmc2Vzc2lvbi0+ZGV2LCAiQ2Fubm90IG5vdGlmeSB1c2Vyc3BhY2UgIgotCQkJICAib2Ygc2Vzc2lvbiBldmVudCAldVxuIiwgZXZlbnQpOworCQlpc2NzaV9jbHNfc2Vzc2lvbl9wcmludGsoS0VSTl9FUlIsIHNlc3Npb24sCisJCQkJCSAiQ2Fubm90IG5vdGlmeSB1c2Vyc3BhY2Ugb2Ygc2Vzc2lvbiAiCisJCQkJCSAiZXZlbnQgJXVcbiIsIGV2ZW50KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC04MjUsOCArOTc0LDggQEAKIAkJZXYtPnIudW5iaW5kX3Nlc3Npb24uc2lkID0gc2Vzc2lvbi0+c2lkOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmc2Vzc2lvbi0+ZGV2LCAiSW52YWxpZCBldmVudCAldS5cbiIsCi0JCQkgICBldmVudCk7CisJCWlzY3NpX2Nsc19zZXNzaW9uX3ByaW50ayhLRVJOX0VSUiwgc2Vzc2lvbiwgIkludmFsaWQgZXZlbnQgIgorCQkJCQkgIiV1LlxuIiwgZXZlbnQpOwogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtODM3LDggKzk4NiwxMCBAQAogCSAqLwogCXJjID0gaXNjc2lfYnJvYWRjYXN0X3NrYihza2IsIEdGUF9LRVJORUwpOwogCWlmIChyYyA8IDApCi0JCWRldl9wcmludGsoS0VSTl9FUlIsICZzZXNzaW9uLT5kZXYsICJDYW5ub3Qgbm90aWZ5IHVzZXJzcGFjZSAiCi0JCQkgICJvZiBzZXNzaW9uIGV2ZW50ICV1LiBDaGVjayBpc2NzaSBkYWVtb25cbiIsIGV2ZW50KTsKKwkJaXNjc2lfY2xzX3Nlc3Npb25fcHJpbnRrKEtFUk5fRVJSLCBzZXNzaW9uLAorCQkJCQkgIkNhbm5vdCBub3RpZnkgdXNlcnNwYWNlIG9mIHNlc3Npb24gIgorCQkJCQkgImV2ZW50ICV1LiBDaGVjayBpc2NzaSBkYWVtb25cbiIsCisJCQkJCSBldmVudCk7CiAJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXNjc2lfc2Vzc2lvbl9ldmVudCk7CkBAIC04NzEsMTYgKzEwMjIsMTUgQEAKIAogCXNlc3Npb24gPSBpc2NzaV9zZXNzaW9uX2xvb2t1cChldi0+dS5jX2Nvbm4uc2lkKTsKIAlpZiAoIXNlc3Npb24pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpc2NzaTogaW52YWxpZCBzZXNzaW9uICVkXG4iLAorCQlwcmludGsoS0VSTl9FUlIgImlzY3NpOiBpbnZhbGlkIHNlc3Npb24gJWQuXG4iLAogCQkgICAgICAgZXYtPnUuY19jb25uLnNpZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWNvbm4gPSB0cmFuc3BvcnQtPmNyZWF0ZV9jb25uKHNlc3Npb24sIGV2LT51LmNfY29ubi5jaWQpOwogCWlmICghY29ubikgewotCQlwcmludGsoS0VSTl9FUlIgImlzY3NpOiBjb3VsZG4ndCBjcmVhdGUgYSBuZXcgIgotCQkJICAgImNvbm5lY3Rpb24gZm9yIHNlc3Npb24gJWRcbiIsCi0JCQkgICBzZXNzaW9uLT5zaWQpOworCQlpc2NzaV9jbHNfc2Vzc2lvbl9wcmludGsoS0VSTl9FUlIsIHNlc3Npb24sCisJCQkJCSAiY291bGRuJ3QgY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24uIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTI0Niw2ICsxMzk2LDE1IEBACiBpc2NzaV9zZXNzaW9uX2F0dHIoYWJvcnRfdG1vLCBJU0NTSV9QQVJBTV9BQk9SVF9UTU8sIDApOwogaXNjc2lfc2Vzc2lvbl9hdHRyKGx1X3Jlc2V0X3RtbywgSVNDU0lfUEFSQU1fTFVfUkVTRVRfVE1PLCAwKTsKIAorc3RhdGljIHNzaXplX3QKK3Nob3dfcHJpdl9zZXNzaW9uX3N0YXRlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKnNlc3Npb24gPSBpc2NzaV9jZGV2X3RvX3Nlc3Npb24oY2Rldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGlzY3NpX3Nlc3Npb25fc3RhdGVfbmFtZShzZXNzaW9uLT5zdGF0ZSkpOworfQorc3RhdGljIElTQ1NJX0NMQVNTX0FUVFIocHJpdl9zZXNzLCBzdGF0ZSwgU19JUlVHTywgc2hvd19wcml2X3Nlc3Npb25fc3RhdGUsCisJCQlOVUxMKTsKKwogI2RlZmluZSBpc2NzaV9wcml2X3Nlc3Npb25fYXR0cl9zaG93KGZpZWxkLCBmb3JtYXQpCQkJXAogc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKIHNob3dfcHJpdl9zZXNzaW9uXyMjZmllbGQoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQkJXApAQCAtMTQ3Miw2ICsxNjMxLDcgQEAKIAlTRVRVUF9TRVNTSU9OX1JEX0FUVFIoYWJvcnRfdG1vLCBJU0NTSV9BQk9SVF9UTU8pOwogCVNFVFVQX1NFU1NJT05fUkRfQVRUUihsdV9yZXNldF90bW8sSVNDU0lfTFVfUkVTRVRfVE1PKTsKIAlTRVRVUF9QUklWX1NFU1NJT05fUkRfQVRUUihyZWNvdmVyeV90bW8pOworCVNFVFVQX1BSSVZfU0VTU0lPTl9SRF9BVFRSKHN0YXRlKTsKIAogCUJVR19PTihjb3VudCA+IElTQ1NJX1NFU1NJT05fQVRUUlMpOwogCXByaXYtPnNlc3Npb25fYXR0cnNbY291bnRdID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZC5jIGIvZHJpdmVycy9zY3NpL3NkLmMKaW5kZXggNTFhNTU1Ny4uMzdkZjhiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NkLmMKKysrIGIvZHJpdmVycy9zY3NpL3NkLmMKQEAgLTkyOSw2ICs5MjksNyBAQAogCXVuc2lnbmVkIGludCB4ZmVyX3NpemUgPSBzY3NpX2J1ZmZsZW4oU0NwbnQpOwogIAl1bnNpZ25lZCBpbnQgZ29vZF9ieXRlcyA9IHJlc3VsdCA/IDAgOiB4ZmVyX3NpemU7CiAgCXU2NCBzdGFydF9sYmEgPSBTQ3BudC0+cmVxdWVzdC0+c2VjdG9yOworCXU2NCBlbmRfbGJhID0gU0NwbnQtPnJlcXVlc3QtPnNlY3RvciArICh4ZmVyX3NpemUgLyA1MTIpOwogIAl1NjQgYmFkX2xiYTsKIAlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7CiAJaW50IHNlbnNlX3ZhbGlkID0gMDsKQEAgLTk2NywyNiArOTY4LDIzIEBACiAJCQlnb3RvIG91dDsKIAkJaWYgKHhmZXJfc2l6ZSA8PSBTQ3BudC0+ZGV2aWNlLT5zZWN0b3Jfc2l6ZSkKIAkJCWdvdG8gb3V0OwotCQlzd2l0Y2ggKFNDcG50LT5kZXZpY2UtPnNlY3Rvcl9zaXplKSB7Ci0JCWNhc2UgMjU2OgorCQlpZiAoU0NwbnQtPmRldmljZS0+c2VjdG9yX3NpemUgPCA1MTIpIHsKKwkJCS8qIG9ubHkgbGVnaXRpbWF0ZSBzZWN0b3Jfc2l6ZSBoZXJlIGlzIDI1NiAqLwogCQkJc3RhcnRfbGJhIDw8PSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgNTEyOgotCQkJYnJlYWs7Ci0JCWNhc2UgMTAyNDoKLQkJCXN0YXJ0X2xiYSA+Pj0gMTsKLQkJCWJyZWFrOwotCQljYXNlIDIwNDg6Ci0JCQlzdGFydF9sYmEgPj49IDI7Ci0JCQlicmVhazsKLQkJY2FzZSA0MDk2OgotCQkJc3RhcnRfbGJhID4+PSAzOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQkvKiBQcmludCBzb21ldGhpbmcgaGVyZSB3aXRoIGxpbWl0aW5nIGZyZXF1ZW5jeS4gKi8KLQkJCWdvdG8gb3V0OwotCQkJYnJlYWs7CisJCQllbmRfbGJhIDw8PSAxOworCQl9IGVsc2UgeworCQkJLyogYmUgY2FyZWZ1bCAuLi4gZG9uJ3Qgd2FudCBhbnkgb3ZlcmZsb3dzICovCisJCQl1NjQgZmFjdG9yID0gU0NwbnQtPmRldmljZS0+c2VjdG9yX3NpemUgLyA1MTI7CisJCQlkb19kaXYoc3RhcnRfbGJhLCBmYWN0b3IpOworCQkJZG9fZGl2KGVuZF9sYmEsIGZhY3Rvcik7CiAJCX0KKworCQlpZiAoYmFkX2xiYSA8IHN0YXJ0X2xiYSAgfHwgYmFkX2xiYSA+PSBlbmRfbGJhKQorCQkJLyogdGhlIGJhZCBsYmEgd2FzIHJlcG9ydGVkIGluY29ycmVjdGx5LCB3ZSBoYXZlCisJCQkgKiBubyBpZGVhIHdoZXJlIHRoZSBlcnJvciBpcworCQkJICovCisJCQlnb3RvIG91dDsKKwogCQkvKiBUaGlzIGNvbXB1dGF0aW9uIHNob3VsZCBhbHdheXMgYmUgZG9uZSBpbiB0ZXJtcyBvZgogCQkgKiB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgZGV2aWNlJ3MgbWVkaXVtLgogCQkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZXMuYyBiL2RyaXZlcnMvc2NzaS9zZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTZlNGY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3Nlcy5jCkBAIC0wLDAgKzEsNjg5IEBACisvKgorICogU0NTSSBFbmNsb3N1cmUgU2VydmljZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSmFtZXMgQm90dG9tbGV5IDxKYW1lcy5Cb3R0b21sZXlASGFuc2VuUGFydG5lcnNoaXAuY29tPgorICoKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqCisqKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKiogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqKiAgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKioKKyoqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKioKKyoqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqKgorKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2VuY2xvc3VyZS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGJnLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorCitzdHJ1Y3Qgc2VzX2RldmljZSB7CisJY2hhciAqcGFnZTE7CisJY2hhciAqcGFnZTI7CisJY2hhciAqcGFnZTEwOworCXNob3J0IHBhZ2UxX2xlbjsKKwlzaG9ydCBwYWdlMl9sZW47CisJc2hvcnQgcGFnZTEwX2xlbjsKK307CisKK3N0cnVjdCBzZXNfY29tcG9uZW50IHsKKwl1NjQgYWRkcjsKKwl1bnNpZ25lZCBjaGFyICpkZXNjOworfTsKKworc3RhdGljIGludCBzZXNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldik7CisJaW50IGVyciA9IC1FTk9ERVY7CisKKwlpZiAoc2Rldi0+dHlwZSAhPSBUWVBFX0VOQ0xPU1VSRSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAwOworCXNkZXZfcHJpbnRrKEtFUk5fTk9USUNFLCBzZGV2LCAiQXR0YWNoZWQgRW5jbG9zdXJlIGRldmljZVxuIik7CisKKyBvdXQ6CisJcmV0dXJuIGVycjsKK30KKworI2RlZmluZSBTRVNfVElNRU9VVCAzMAorI2RlZmluZSBTRVNfUkVUUklFUyAzCisKK3N0YXRpYyBpbnQgc2VzX3JlY3ZfZGlhZyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIGludCBwYWdlX2NvZGUsCisJCQkgdm9pZCAqYnVmLCBpbnQgYnVmZmxlbikKK3sKKwljaGFyIGNtZFtdID0geworCQlSRUNFSVZFX0RJQUdOT1NUSUMsCisJCTEsCQkvKiBTZXQgUENWIGJpdCAqLworCQlwYWdlX2NvZGUsCisJCWJ1ZmZsZW4gPj4gOCwKKwkJYnVmZmxlbiAmIDB4ZmYsCisJCTAKKwl9OworCisJcmV0dXJuIHNjc2lfZXhlY3V0ZV9yZXEoc2RldiwgY21kLCBETUFfRlJPTV9ERVZJQ0UsIGJ1ZiwgYnVmZmxlbiwKKwkJCQlOVUxMLCBTRVNfVElNRU9VVCwgU0VTX1JFVFJJRVMpOworfQorCitzdGF0aWMgaW50IHNlc19zZW5kX2RpYWcoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgcGFnZV9jb2RlLAorCQkJIHZvaWQgKmJ1ZiwgaW50IGJ1ZmZsZW4pCit7CisJdTMyIHJlc3VsdDsKKworCWNoYXIgY21kW10gPSB7CisJCVNFTkRfRElBR05PU1RJQywKKwkJMHgxMCwJCS8qIFNldCBQRiBiaXQgKi8KKwkJMCwKKwkJYnVmZmxlbiA+PiA4LAorCQlidWZmbGVuICYgMHhmZiwKKwkJMAorCX07CisKKwlyZXN1bHQgPSBzY3NpX2V4ZWN1dGVfcmVxKHNkZXYsIGNtZCwgRE1BX1RPX0RFVklDRSwgYnVmLCBidWZmbGVuLAorCQkJCSAgTlVMTCwgU0VTX1RJTUVPVVQsIFNFU19SRVRSSUVTKTsKKwlpZiAocmVzdWx0KQorCQlzZGV2X3ByaW50ayhLRVJOX0VSUiwgc2RldiwgIlNFTkQgRElBR05PU1RJQyByZXN1bHQ6ICU4eFxuIiwKKwkJCSAgICByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgc2VzX3NldF9wYWdlMl9kZXNjcmlwdG9yKHN0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICplZGV2LAorCQkJCSAgICAgIHN0cnVjdCBlbmNsb3N1cmVfY29tcG9uZW50ICplY29tcCwKKwkJCQkgICAgICBjaGFyICpkZXNjKQoreworCWludCBpLCBqLCBjb3VudCA9IDAsIGRlc2NyaXB0b3IgPSBlY29tcC0+bnVtYmVyOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHRvX3Njc2lfZGV2aWNlKGVkZXYtPmNkZXYuZGV2KTsKKwlzdHJ1Y3Qgc2VzX2RldmljZSAqc2VzX2RldiA9IGVkZXYtPnNjcmF0Y2g7CisJY2hhciAqdHlwZV9wdHIgPSBzZXNfZGV2LT5wYWdlMSArIDEyICsgc2VzX2Rldi0+cGFnZTFbMTFdOworCWNoYXIgKmRlc2NfcHRyID0gc2VzX2Rldi0+cGFnZTIgKyA4OworCisJLyogQ2xlYXIgZXZlcnl0aGluZyAqLworCW1lbXNldChkZXNjX3B0ciwgMCwgc2VzX2Rldi0+cGFnZTJfbGVuIC0gOCk7CisJZm9yIChpID0gMDsgaSA8IHNlc19kZXYtPnBhZ2UxWzEwXTsgaSsrLCB0eXBlX3B0ciArPSA0KSB7CisJCWZvciAoaiA9IDA7IGogPCB0eXBlX3B0clsxXTsgaisrKSB7CisJCQlkZXNjX3B0ciArPSA0OworCQkJaWYgKHR5cGVfcHRyWzBdICE9IEVOQ0xPU1VSRV9DT01QT05FTlRfREVWSUNFICYmCisJCQkgICAgdHlwZV9wdHJbMF0gIT0gRU5DTE9TVVJFX0NPTVBPTkVOVF9BUlJBWV9ERVZJQ0UpCisJCQkJY29udGludWU7CisJCQlpZiAoY291bnQrKyA9PSBkZXNjcmlwdG9yKSB7CisJCQkJbWVtY3B5KGRlc2NfcHRyLCBkZXNjLCA0KTsKKwkJCQkvKiBzZXQgc2VsZWN0ICovCisJCQkJZGVzY19wdHJbMF0gfD0gMHg4MDsKKwkJCQkvKiBjbGVhciByZXNlcnZlZCwganVzdCBpbiBjYXNlICovCisJCQkJZGVzY19wdHJbMF0gJj0gMHhmMDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBzZXNfc2VuZF9kaWFnKHNkZXYsIDIsIHNlc19kZXYtPnBhZ2UyLCBzZXNfZGV2LT5wYWdlMl9sZW4pOworfQorCitzdGF0aWMgY2hhciAqc2VzX2dldF9wYWdlMl9kZXNjcmlwdG9yKHN0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICplZGV2LAorCQkJCSAgICAgIHN0cnVjdCBlbmNsb3N1cmVfY29tcG9uZW50ICplY29tcCkKK3sKKwlpbnQgaSwgaiwgY291bnQgPSAwLCBkZXNjcmlwdG9yID0gZWNvbXAtPm51bWJlcjsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSB0b19zY3NpX2RldmljZShlZGV2LT5jZGV2LmRldik7CisJc3RydWN0IHNlc19kZXZpY2UgKnNlc19kZXYgPSBlZGV2LT5zY3JhdGNoOworCWNoYXIgKnR5cGVfcHRyID0gc2VzX2Rldi0+cGFnZTEgKyAxMiArIHNlc19kZXYtPnBhZ2UxWzExXTsKKwljaGFyICpkZXNjX3B0ciA9IHNlc19kZXYtPnBhZ2UyICsgODsKKworCXNlc19yZWN2X2RpYWcoc2RldiwgMiwgc2VzX2Rldi0+cGFnZTIsIHNlc19kZXYtPnBhZ2UyX2xlbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2VzX2Rldi0+cGFnZTFbMTBdOyBpKyssIHR5cGVfcHRyICs9IDQpIHsKKwkJZm9yIChqID0gMDsgaiA8IHR5cGVfcHRyWzFdOyBqKyspIHsKKwkJCWRlc2NfcHRyICs9IDQ7CisJCQlpZiAodHlwZV9wdHJbMF0gIT0gRU5DTE9TVVJFX0NPTVBPTkVOVF9ERVZJQ0UgJiYKKwkJCSAgICB0eXBlX3B0clswXSAhPSBFTkNMT1NVUkVfQ09NUE9ORU5UX0FSUkFZX0RFVklDRSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChjb3VudCsrID09IGRlc2NyaXB0b3IpCisJCQkJcmV0dXJuIGRlc2NfcHRyOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBzZXNfZ2V0X2ZhdWx0KHN0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICplZGV2LAorCQkJICBzdHJ1Y3QgZW5jbG9zdXJlX2NvbXBvbmVudCAqZWNvbXApCit7CisJY2hhciAqZGVzYzsKKworCWRlc2MgPSBzZXNfZ2V0X3BhZ2UyX2Rlc2NyaXB0b3IoZWRldiwgZWNvbXApOworCWVjb21wLT5mYXVsdCA9IChkZXNjWzNdICYgMHg2MCkgPj4gNDsKK30KKworc3RhdGljIGludCBzZXNfc2V0X2ZhdWx0KHN0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICplZGV2LAorCQkJICBzdHJ1Y3QgZW5jbG9zdXJlX2NvbXBvbmVudCAqZWNvbXAsCisJCQkgZW51bSBlbmNsb3N1cmVfY29tcG9uZW50X3NldHRpbmcgdmFsKQoreworCWNoYXIgZGVzY1s0XSA9IHswIH07CisKKwlzd2l0Y2ggKHZhbCkgeworCWNhc2UgRU5DTE9TVVJFX1NFVFRJTkdfRElTQUJMRUQ6CisJCS8qIHplcm8gaXMgZGlzYWJsZWQgKi8KKwkJYnJlYWs7CisJY2FzZSBFTkNMT1NVUkVfU0VUVElOR19FTkFCTEVEOgorCQlkZXNjWzJdID0gMHgwMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogU0VTIGRvZXNuJ3QgZG8gdGhlIFNHUElPIGJsaW5rIHNldHRpbmdzICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBzZXNfc2V0X3BhZ2UyX2Rlc2NyaXB0b3IoZWRldiwgZWNvbXAsIGRlc2MpOworfQorCitzdGF0aWMgdm9pZCBzZXNfZ2V0X3N0YXR1cyhzdHJ1Y3QgZW5jbG9zdXJlX2RldmljZSAqZWRldiwKKwkJCSAgIHN0cnVjdCBlbmNsb3N1cmVfY29tcG9uZW50ICplY29tcCkKK3sKKwljaGFyICpkZXNjOworCisJZGVzYyA9IHNlc19nZXRfcGFnZTJfZGVzY3JpcHRvcihlZGV2LCBlY29tcCk7CisJZWNvbXAtPnN0YXR1cyA9IChkZXNjWzBdICYgMHgwZik7Cit9CisKK3N0YXRpYyB2b2lkIHNlc19nZXRfbG9jYXRlKHN0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICplZGV2LAorCQkJICAgc3RydWN0IGVuY2xvc3VyZV9jb21wb25lbnQgKmVjb21wKQoreworCWNoYXIgKmRlc2M7CisKKwlkZXNjID0gc2VzX2dldF9wYWdlMl9kZXNjcmlwdG9yKGVkZXYsIGVjb21wKTsKKwllY29tcC0+bG9jYXRlID0gKGRlc2NbMl0gJiAweDAyKSA/IDEgOiAwOworfQorCitzdGF0aWMgaW50IHNlc19zZXRfbG9jYXRlKHN0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICplZGV2LAorCQkJICBzdHJ1Y3QgZW5jbG9zdXJlX2NvbXBvbmVudCAqZWNvbXAsCisJCQkgIGVudW0gZW5jbG9zdXJlX2NvbXBvbmVudF9zZXR0aW5nIHZhbCkKK3sKKwljaGFyIGRlc2NbNF0gPSB7MCB9OworCisJc3dpdGNoICh2YWwpIHsKKwljYXNlIEVOQ0xPU1VSRV9TRVRUSU5HX0RJU0FCTEVEOgorCQkvKiB6ZXJvIGlzIGRpc2FibGVkICovCisJCWJyZWFrOworCWNhc2UgRU5DTE9TVVJFX1NFVFRJTkdfRU5BQkxFRDoKKwkJZGVzY1syXSA9IDB4MDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFNFUyBkb2Vzbid0IGRvIHRoZSBTR1BJTyBibGluayBzZXR0aW5ncyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHNlc19zZXRfcGFnZTJfZGVzY3JpcHRvcihlZGV2LCBlY29tcCwgZGVzYyk7Cit9CisKK3N0YXRpYyBpbnQgc2VzX3NldF9hY3RpdmUoc3RydWN0IGVuY2xvc3VyZV9kZXZpY2UgKmVkZXYsCisJCQkgIHN0cnVjdCBlbmNsb3N1cmVfY29tcG9uZW50ICplY29tcCwKKwkJCSAgZW51bSBlbmNsb3N1cmVfY29tcG9uZW50X3NldHRpbmcgdmFsKQoreworCWNoYXIgZGVzY1s0XSA9IHswIH07CisKKwlzd2l0Y2ggKHZhbCkgeworCWNhc2UgRU5DTE9TVVJFX1NFVFRJTkdfRElTQUJMRUQ6CisJCS8qIHplcm8gaXMgZGlzYWJsZWQgKi8KKwkJZWNvbXAtPmFjdGl2ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgRU5DTE9TVVJFX1NFVFRJTkdfRU5BQkxFRDoKKwkJZGVzY1syXSA9IDB4ODA7CisJCWVjb21wLT5hY3RpdmUgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBTRVMgZG9lc24ndCBkbyB0aGUgU0dQSU8gYmxpbmsgc2V0dGluZ3MgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiBzZXNfc2V0X3BhZ2UyX2Rlc2NyaXB0b3IoZWRldiwgZWNvbXAsIGRlc2MpOworfQorCitzdGF0aWMgc3RydWN0IGVuY2xvc3VyZV9jb21wb25lbnRfY2FsbGJhY2tzIHNlc19lbmNsb3N1cmVfY2FsbGJhY2tzID0geworCS5nZXRfZmF1bHQJCT0gc2VzX2dldF9mYXVsdCwKKwkuc2V0X2ZhdWx0CQk9IHNlc19zZXRfZmF1bHQsCisJLmdldF9zdGF0dXMJCT0gc2VzX2dldF9zdGF0dXMsCisJLmdldF9sb2NhdGUJCT0gc2VzX2dldF9sb2NhdGUsCisJLnNldF9sb2NhdGUJCT0gc2VzX3NldF9sb2NhdGUsCisJLnNldF9hY3RpdmUJCT0gc2VzX3NldF9hY3RpdmUsCit9OworCitzdHJ1Y3Qgc2VzX2hvc3RfZWRldiB7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJc3RydWN0IGVuY2xvc3VyZV9kZXZpY2UgKmVkZXY7Cit9OworCitpbnQgc2VzX21hdGNoX2hvc3Qoc3RydWN0IGVuY2xvc3VyZV9kZXZpY2UgKmVkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNlc19ob3N0X2VkZXYgKnNlZCA9IGRhdGE7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCisJaWYgKCFzY3NpX2lzX3NkZXZfZGV2aWNlKGVkZXYtPmNkZXYuZGV2KSkKKwkJcmV0dXJuIDA7CisKKwlzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZWRldi0+Y2Rldi5kZXYpOworCisJaWYgKHNkZXYtPmhvc3QgIT0gc2VkLT5zaG9zdCkKKwkJcmV0dXJuIDA7CisKKwlzZWQtPmVkZXYgPSBlZGV2OworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBzZXNfcHJvY2Vzc19kZXNjcmlwdG9yKHN0cnVjdCBlbmNsb3N1cmVfY29tcG9uZW50ICplY29tcCwKKwkJCQkgICB1bnNpZ25lZCBjaGFyICpkZXNjKQoreworCWludCBlaXAgPSBkZXNjWzBdICYgMHgxMDsKKwlpbnQgaW52YWxpZCA9IGRlc2NbMF0gJiAweDgwOworCWVudW0gc2NzaV9wcm90b2NvbCBwcm90byA9IGRlc2NbMF0gJiAweDBmOworCXU2NCBhZGRyID0gMDsKKwlzdHJ1Y3Qgc2VzX2NvbXBvbmVudCAqc2NvbXAgPSBlY29tcC0+c2NyYXRjaDsKKwl1bnNpZ25lZCBjaGFyICpkOworCisJc2NvbXAtPmRlc2MgPSBkZXNjOworCisJaWYgKGludmFsaWQpCisJCXJldHVybjsKKworCXN3aXRjaCAocHJvdG8pIHsKKwljYXNlIFNDU0lfUFJPVE9DT0xfU0FTOgorCQlpZiAoZWlwKQorCQkJZCA9IGRlc2MgKyA4OworCQllbHNlCisJCQlkID0gZGVzYyArIDQ7CisJCS8qIG9ubHkgdGFrZSB0aGUgcGh5MCBhZGRyICovCisJCWFkZHIgPSAodTY0KWRbMTJdIDw8IDU2IHwKKwkJCSh1NjQpZFsxM10gPDwgNDggfAorCQkJKHU2NClkWzE0XSA8PCA0MCB8CisJCQkodTY0KWRbMTVdIDw8IDMyIHwKKwkJCSh1NjQpZFsxNl0gPDwgMjQgfAorCQkJKHU2NClkWzE3XSA8PCAxNiB8CisJCQkodTY0KWRbMThdIDw8IDggfAorCQkJKHU2NClkWzE5XTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogRklYTUU6IE5lZWQgdG8gYWRkIG1vcmUgcHJvdG9jb2xzIHRoYW4ganVzdCBTQVMgKi8KKwkJYnJlYWs7CisJfQorCXNjb21wLT5hZGRyID0gYWRkcjsKK30KKworc3RydWN0IGVmZCB7CisJdTY0IGFkZHI7CisJc3RydWN0IGRldmljZSAqZGV2OworfTsKKworc3RhdGljIGludCBzZXNfZW5jbG9zdXJlX2ZpbmRfYnlfYWRkcihzdHJ1Y3QgZW5jbG9zdXJlX2RldmljZSAqZWRldiwKKwkJCQkgICAgICB2b2lkICpkYXRhKQoreworCXN0cnVjdCBlZmQgKmVmZCA9IGRhdGE7CisJaW50IGk7CisJc3RydWN0IHNlc19jb21wb25lbnQgKnNjb21wOworCisJaWYgKCFlZGV2LT5jb21wb25lbnRbMF0uc2NyYXRjaCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgZWRldi0+Y29tcG9uZW50czsgaSsrKSB7CisJCXNjb21wID0gZWRldi0+Y29tcG9uZW50W2ldLnNjcmF0Y2g7CisJCWlmIChzY29tcC0+YWRkciAhPSBlZmQtPmFkZHIpCisJCQljb250aW51ZTsKKworCQllbmNsb3N1cmVfYWRkX2RldmljZShlZGV2LCBpLCBlZmQtPmRldik7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBWUERfSU5RVUlSWV9TSVpFIDUxMgorCitzdGF0aWMgdm9pZCBzZXNfbWF0Y2hfdG9fZW5jbG9zdXJlKHN0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICplZGV2LAorCQkJCSAgIHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwl1bnNpZ25lZCBjaGFyICpidWYgPSBrbWFsbG9jKFZQRF9JTlFVSVJZX1NJWkUsIEdGUF9LRVJORUwpOworCXVuc2lnbmVkIGNoYXIgKmRlc2M7CisJaW50IGxlbjsKKwlzdHJ1Y3QgZWZkIGVmZCA9IHsKKwkJLmFkZHIgPSAwLAorCX07CisJdW5zaWduZWQgY2hhciBjbWRbXSA9IHsKKwkJSU5RVUlSWSwKKwkJMSwKKwkJMHg4MywKKwkJVlBEX0lOUVVJUllfU0laRSA+PiA4LAorCQlWUERfSU5RVUlSWV9TSVpFICYgMHhmZiwKKwkJMAorCX07CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCisJaWYgKHNjc2lfZXhlY3V0ZV9yZXEoc2RldiwgY21kLCBETUFfRlJPTV9ERVZJQ0UsIGJ1ZiwKKwkJCSAgICAgVlBEX0lOUVVJUllfU0laRSwgTlVMTCwgU0VTX1RJTUVPVVQsIFNFU19SRVRSSUVTKSkKKwkJZ290byBmcmVlOworCisJbGVuID0gKGJ1ZlsyXSA8PCA4KSArIGJ1ZlszXTsKKwlkZXNjID0gYnVmICsgNDsKKwl3aGlsZSAoZGVzYyA8IGJ1ZiArIGxlbikgeworCQllbnVtIHNjc2lfcHJvdG9jb2wgcHJvdG8gPSBkZXNjWzBdID4+IDQ7CisJCXU4IGNvZGVfc2V0ID0gZGVzY1swXSAmIDB4MGY7CisJCXU4IHBpdiA9IGRlc2NbMV0gJiAweDgwOworCQl1OCBhc3NvYyA9IChkZXNjWzFdICYgMHgzMCkgPj4gNDsKKwkJdTggdHlwZSA9IGRlc2NbMV0gJiAweDBmOworCQl1OCBsZW4gPSBkZXNjWzNdOworCisJCWlmIChwaXYgJiYgY29kZV9zZXQgPT0gMSAmJiBhc3NvYyA9PSAxICYmIGNvZGVfc2V0ID09IDEKKwkJICAgICYmIHByb3RvID09IFNDU0lfUFJPVE9DT0xfU0FTICYmIHR5cGUgPT0gMyAmJiBsZW4gPT0gOCkKKwkJCWVmZC5hZGRyID0gKHU2NClkZXNjWzRdIDw8IDU2IHwKKwkJCQkodTY0KWRlc2NbNV0gPDwgNDggfAorCQkJCSh1NjQpZGVzY1s2XSA8PCA0MCB8CisJCQkJKHU2NClkZXNjWzddIDw8IDMyIHwKKwkJCQkodTY0KWRlc2NbOF0gPDwgMjQgfAorCQkJCSh1NjQpZGVzY1s5XSA8PCAxNiB8CisJCQkJKHU2NClkZXNjWzEwXSA8PCA4IHwKKwkJCQkodTY0KWRlc2NbMTFdOworCisJCWRlc2MgKz0gbGVuICsgNDsKKwl9CisJaWYgKCFlZmQuYWRkcikKKwkJZ290byBmcmVlOworCisJZWZkLmRldiA9ICZzZGV2LT5zZGV2X2dlbmRldjsKKworCWVuY2xvc3VyZV9mb3JfZWFjaF9kZXZpY2Uoc2VzX2VuY2xvc3VyZV9maW5kX2J5X2FkZHIsICZlZmQpOworIGZyZWU6CisJa2ZyZWUoYnVmKTsKK30KKworI2RlZmluZSBJTklUX0FMTE9DX1NJWkUgMzIKKworc3RhdGljIGludCBzZXNfaW50Zl9hZGQoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwKKwkJCXN0cnVjdCBjbGFzc19pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2ID0gdG9fc2NzaV9kZXZpY2UoY2Rldi0+ZGV2KTsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnRtcF9zZGV2OworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IE5VTEwsICpoZHJfYnVmLCAqdHlwZV9wdHIsICpkZXNjX3B0ciwKKwkJKmFkZGxfZGVzY19wdHI7CisJc3RydWN0IHNlc19kZXZpY2UgKnNlc19kZXY7CisJdTMyIHJlc3VsdDsKKwlpbnQgaSwgaiwgdHlwZXMsIGxlbiwgY29tcG9uZW50cyA9IDA7CisJaW50IGVyciA9IC1FTk9NRU07CisJc3RydWN0IGVuY2xvc3VyZV9kZXZpY2UgKmVkZXY7CisJc3RydWN0IHNlc19jb21wb25lbnQgKnNjb21wOworCisJaWYgKCFzY3NpX2RldmljZV9lbmNsb3N1cmUoc2RldikpIHsKKwkJLyogbm90IGFuIGVuY2xvc3VyZSwgYnV0IG1pZ2h0IGJlIGluIG9uZSAqLworCQllZGV2ID0gCWVuY2xvc3VyZV9maW5kKCZzZGV2LT5ob3N0LT5zaG9zdF9nZW5kZXYpOworCQlpZiAoZWRldikgeworCQkJc2VzX21hdGNoX3RvX2VuY2xvc3VyZShlZGV2LCBzZGV2KTsKKwkJCWNsYXNzX2RldmljZV9wdXQoJmVkZXYtPmNkZXYpOworCQl9CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFRZUEVfRU5DTE9TVVJFIHByaW50cyBhIG1lc3NhZ2UgaW4gcHJvYmUgKi8KKwlpZiAoc2Rldi0+dHlwZSAhPSBUWVBFX0VOQ0xPU1VSRSkKKwkJc2Rldl9wcmludGsoS0VSTl9OT1RJQ0UsIHNkZXYsICJFbWJlZGRlZCBFbmNsb3N1cmUgRGV2aWNlXG4iKTsKKworCXNlc19kZXYgPSBremFsbG9jKHNpemVvZigqc2VzX2RldiksIEdGUF9LRVJORUwpOworCWhkcl9idWYgPSBremFsbG9jKElOSVRfQUxMT0NfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoZHJfYnVmIHx8ICFzZXNfZGV2KQorCQlnb3RvIGVycl9pbml0X2ZyZWU7CisKKwlyZXN1bHQgPSBzZXNfcmVjdl9kaWFnKHNkZXYsIDEsIGhkcl9idWYsIElOSVRfQUxMT0NfU0laRSk7CisJaWYgKHJlc3VsdCkKKwkJZ290byByZWN2X2ZhaWxlZDsKKworCWlmIChoZHJfYnVmWzFdICE9IDApIHsKKwkJLyogRklYTUU6IG5lZWQgc3ViZW5jbG9zdXJlIHN1cHBvcnQ7IEkndmUganVzdCBuZXZlcgorCQkgKiBzZWVuIGEgZGV2aWNlIHdpdGggc3ViZW5jbG9zdXJlcyBhbmQgaXQgbWFrZXMgdGhlCisJCSAqIHRyYXZlcnNhbCByb3V0aW5lcyBtb3JlIGNvbXBsZXggKi8KKwkJc2Rldl9wcmludGsoS0VSTl9FUlIsIHNkZXYsCisJCQkiRklYTUUgZHJpdmVyIGhhcyBubyBzdXBwb3J0IGZvciBzdWJlbmNsb3N1cmVzICglZClcbiIsCisJCQlidWZbMV0pOworCQlnb3RvIGVycl9mcmVlOworCX0KKworCWxlbiA9IChoZHJfYnVmWzJdIDw8IDgpICsgaGRyX2J1ZlszXSArIDQ7CisJYnVmID0ga3phbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlnb3RvIGVycl9mcmVlOworCisJc2VzX2Rldi0+cGFnZTEgPSBidWY7CisJc2VzX2Rldi0+cGFnZTFfbGVuID0gbGVuOworCisJcmVzdWx0ID0gc2VzX3JlY3ZfZGlhZyhzZGV2LCAxLCBidWYsIGxlbik7CisJaWYgKHJlc3VsdCkKKwkJZ290byByZWN2X2ZhaWxlZDsKKworCXR5cGVzID0gYnVmWzEwXTsKKwlsZW4gPSBidWZbMTFdOworCisJdHlwZV9wdHIgPSBidWYgKyAxMiArIGxlbjsKKworCWZvciAoaSA9IDA7IGkgPCB0eXBlczsgaSsrLCB0eXBlX3B0ciArPSA0KSB7CisJCWlmICh0eXBlX3B0clswXSA9PSBFTkNMT1NVUkVfQ09NUE9ORU5UX0RFVklDRSB8fAorCQkgICAgdHlwZV9wdHJbMF0gPT0gRU5DTE9TVVJFX0NPTVBPTkVOVF9BUlJBWV9ERVZJQ0UpCisJCQljb21wb25lbnRzICs9IHR5cGVfcHRyWzFdOworCX0KKworCXJlc3VsdCA9IHNlc19yZWN2X2RpYWcoc2RldiwgMiwgaGRyX2J1ZiwgSU5JVF9BTExPQ19TSVpFKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIHJlY3ZfZmFpbGVkOworCisJbGVuID0gKGhkcl9idWZbMl0gPDwgOCkgKyBoZHJfYnVmWzNdICsgNDsKKwlidWYgPSBremFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCWdvdG8gZXJyX2ZyZWU7CisKKwkvKiBtYWtlIHN1cmUgZ2V0dGluZyBwYWdlIDIgYWN0dWFsbHkgd29ya3MgKi8KKwlyZXN1bHQgPSBzZXNfcmVjdl9kaWFnKHNkZXYsIDIsIGJ1ZiwgbGVuKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIHJlY3ZfZmFpbGVkOworCXNlc19kZXYtPnBhZ2UyID0gYnVmOworCXNlc19kZXYtPnBhZ2UyX2xlbiA9IGxlbjsKKworCS8qIFRoZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHBhZ2UgLS0tIGFsbG93cyB1cworCSAqIHRvIG1hdGNoIHVwIHRoZSBkZXZpY2VzICovCisJcmVzdWx0ID0gc2VzX3JlY3ZfZGlhZyhzZGV2LCAxMCwgaGRyX2J1ZiwgSU5JVF9BTExPQ19TSVpFKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIG5vX3BhZ2UxMDsKKworCWxlbiA9IChoZHJfYnVmWzJdIDw8IDgpICsgaGRyX2J1ZlszXSArIDQ7CisJYnVmID0ga3phbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlnb3RvIGVycl9mcmVlOworCisJcmVzdWx0ID0gc2VzX3JlY3ZfZGlhZyhzZGV2LCAxMCwgYnVmLCBsZW4pOworCWlmIChyZXN1bHQpCisJCWdvdG8gcmVjdl9mYWlsZWQ7CisJc2VzX2Rldi0+cGFnZTEwID0gYnVmOworCXNlc19kZXYtPnBhZ2UxMF9sZW4gPSBsZW47CisKKyBub19wYWdlMTA6CisJc2NvbXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VzX2NvbXBvbmVudCkgKiBjb21wb25lbnRzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNjb21wKQorCQlnb3RvICBlcnJfZnJlZTsKKworCWVkZXYgPSBlbmNsb3N1cmVfcmVnaXN0ZXIoY2Rldi0+ZGV2LCBzZGV2LT5zZGV2X2dlbmRldi5idXNfaWQsCisJCQkJICBjb21wb25lbnRzLCAmc2VzX2VuY2xvc3VyZV9jYWxsYmFja3MpOworCWlmIChJU19FUlIoZWRldikpIHsKKwkJZXJyID0gUFRSX0VSUihlZGV2KTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwllZGV2LT5zY3JhdGNoID0gc2VzX2RldjsKKwlmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50czsgaSsrKQorCQllZGV2LT5jb21wb25lbnRbaV0uc2NyYXRjaCA9IHNjb21wKys7CisKKwkvKiBQYWdlIDcgZm9yIHRoZSBkZXNjcmlwdG9ycyBpcyBvcHRpb25hbCAqLworCWJ1ZiA9IE5VTEw7CisJcmVzdWx0ID0gc2VzX3JlY3ZfZGlhZyhzZGV2LCA3LCBoZHJfYnVmLCBJTklUX0FMTE9DX1NJWkUpOworCWlmIChyZXN1bHQpCisJCWdvdG8gc2ltcGxlX3BvcHVsYXRlOworCisJbGVuID0gKGhkcl9idWZbMl0gPDwgOCkgKyBoZHJfYnVmWzNdICsgNDsKKwkvKiBhZGQgMSBmb3IgdHJhaWxpbmcgJ1wwJyB3ZSdsbCB1c2UgKi8KKwlidWYgPSBremFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOworCXJlc3VsdCA9IHNlc19yZWN2X2RpYWcoc2RldiwgNywgYnVmLCBsZW4pOworCWlmIChyZXN1bHQpIHsKKyBzaW1wbGVfcG9wdWxhdGU6CisJCWtmcmVlKGJ1Zik7CisJCWJ1ZiA9IE5VTEw7CisJCWRlc2NfcHRyID0gTlVMTDsKKwkJYWRkbF9kZXNjX3B0ciA9IE5VTEw7CisJfSBlbHNlIHsKKwkJZGVzY19wdHIgPSBidWYgKyA4OworCQlsZW4gPSAoZGVzY19wdHJbMl0gPDwgOCkgKyBkZXNjX3B0clszXTsKKwkJLyogc2tpcCBwYXN0IG92ZXJhbGwgZGVzY3JpcHRvciAqLworCQlkZXNjX3B0ciArPSBsZW4gKyA0OworCQlhZGRsX2Rlc2NfcHRyID0gc2VzX2Rldi0+cGFnZTEwICsgODsKKwl9CisJdHlwZV9wdHIgPSBzZXNfZGV2LT5wYWdlMSArIDEyICsgc2VzX2Rldi0+cGFnZTFbMTFdOworCWNvbXBvbmVudHMgPSAwOworCWZvciAoaSA9IDA7IGkgPCB0eXBlczsgaSsrLCB0eXBlX3B0ciArPSA0KSB7CisJCWZvciAoaiA9IDA7IGogPCB0eXBlX3B0clsxXTsgaisrKSB7CisJCQljaGFyICpuYW1lID0gTlVMTDsKKwkJCXN0cnVjdCBlbmNsb3N1cmVfY29tcG9uZW50ICplY29tcDsKKworCQkJaWYgKGRlc2NfcHRyKSB7CisJCQkJbGVuID0gKGRlc2NfcHRyWzJdIDw8IDgpICsgZGVzY19wdHJbM107CisJCQkJZGVzY19wdHIgKz0gNDsKKwkJCQkvKiBBZGQgdHJhaWxpbmcgemVybyAtIHB1c2hlcyBpbnRvCisJCQkJICogcmVzZXJ2ZWQgc3BhY2UgKi8KKwkJCQlkZXNjX3B0cltsZW5dID0gJ1wwJzsKKwkJCQluYW1lID0gZGVzY19wdHI7CisJCQl9CisJCQlpZiAodHlwZV9wdHJbMF0gIT0gRU5DTE9TVVJFX0NPTVBPTkVOVF9ERVZJQ0UgJiYKKwkJCSAgICB0eXBlX3B0clswXSAhPSBFTkNMT1NVUkVfQ09NUE9ORU5UX0FSUkFZX0RFVklDRSkKKwkJCQljb250aW51ZTsKKwkJCWVjb21wID0JZW5jbG9zdXJlX2NvbXBvbmVudF9yZWdpc3RlcihlZGV2LAorCQkJCQkJCSAgICAgY29tcG9uZW50cysrLAorCQkJCQkJCSAgICAgdHlwZV9wdHJbMF0sCisJCQkJCQkJICAgICBuYW1lKTsKKwkJCWlmIChkZXNjX3B0cikgeworCQkJCWRlc2NfcHRyICs9IGxlbjsKKwkJCQlpZiAoIUlTX0VSUihlY29tcCkpCisJCQkJCXNlc19wcm9jZXNzX2Rlc2NyaXB0b3IoZWNvbXAsCisJCQkJCQkJICAgICAgIGFkZGxfZGVzY19wdHIpOworCisJCQkJaWYgKGFkZGxfZGVzY19wdHIpCisJCQkJCWFkZGxfZGVzY19wdHIgKz0gYWRkbF9kZXNjX3B0clsxXSArIDI7CisJCQl9CisJCX0KKwl9CisJa2ZyZWUoYnVmKTsKKwlrZnJlZShoZHJfYnVmKTsKKworCS8qIHNlZSBpZiB0aGVyZSBhcmUgYW55IGRldmljZXMgbWF0Y2hpbmcgYmVmb3JlCisJICogd2UgZm91bmQgdGhlIGVuY2xvc3VyZSAqLworCXNob3N0X2Zvcl9lYWNoX2RldmljZSh0bXBfc2Rldiwgc2Rldi0+aG9zdCkgeworCQlpZiAodG1wX3NkZXYtPmx1biAhPSAwIHx8IHNjc2lfZGV2aWNlX2VuY2xvc3VyZSh0bXBfc2RldikpCisJCQljb250aW51ZTsKKwkJc2VzX21hdGNoX3RvX2VuY2xvc3VyZShlZGV2LCB0bXBfc2Rldik7CisJfQorCisJcmV0dXJuIDA7CisKKyByZWN2X2ZhaWxlZDoKKwlzZGV2X3ByaW50ayhLRVJOX0VSUiwgc2RldiwgIkZhaWxlZCB0byBnZXQgZGlhZ25vc3RpYyBwYWdlIDB4JXhcbiIsCisJCSAgICByZXN1bHQpOworCWVyciA9IC1FTk9ERVY7CisgZXJyX2ZyZWU6CisJa2ZyZWUoYnVmKTsKKwlrZnJlZShzZXNfZGV2LT5wYWdlMTApOworCWtmcmVlKHNlc19kZXYtPnBhZ2UyKTsKKwlrZnJlZShzZXNfZGV2LT5wYWdlMSk7CisgZXJyX2luaXRfZnJlZToKKwlrZnJlZShzZXNfZGV2KTsKKwlrZnJlZShoZHJfYnVmKTsKKwlzZGV2X3ByaW50ayhLRVJOX0VSUiwgc2RldiwgIkZhaWxlZCB0byBiaW5kIGVuY2xvc3VyZSAlZFxuIiwgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNlc19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZXNfaW50Zl9yZW1vdmUoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwKKwkJCSAgICBzdHJ1Y3QgY2xhc3NfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHRvX3Njc2lfZGV2aWNlKGNkZXYtPmRldik7CisJc3RydWN0IGVuY2xvc3VyZV9kZXZpY2UgKmVkZXY7CisJc3RydWN0IHNlc19kZXZpY2UgKnNlc19kZXY7CisKKwlpZiAoIXNjc2lfZGV2aWNlX2VuY2xvc3VyZShzZGV2KSkKKwkJcmV0dXJuOworCisJZWRldiA9IGVuY2xvc3VyZV9maW5kKGNkZXYtPmRldik7CisJaWYgKCFlZGV2KQorCQlyZXR1cm47CisKKwlzZXNfZGV2ID0gZWRldi0+c2NyYXRjaDsKKwllZGV2LT5zY3JhdGNoID0gTlVMTDsKKworCWtmcmVlKHNlc19kZXYtPnBhZ2UxKTsKKwlrZnJlZShzZXNfZGV2LT5wYWdlMik7CisJa2ZyZWUoc2VzX2Rldik7CisKKwlrZnJlZShlZGV2LT5jb21wb25lbnRbMF0uc2NyYXRjaCk7CisKKwljbGFzc19kZXZpY2VfcHV0KCZlZGV2LT5jZGV2KTsKKwllbmNsb3N1cmVfdW5yZWdpc3RlcihlZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBjbGFzc19pbnRlcmZhY2Ugc2VzX2ludGVyZmFjZSA9IHsKKwkuYWRkCT0gc2VzX2ludGZfYWRkLAorCS5yZW1vdmUJPSBzZXNfaW50Zl9yZW1vdmUsCit9OworCitzdGF0aWMgc3RydWN0IHNjc2lfZHJpdmVyIHNlc190ZW1wbGF0ZSA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5nZW5kcnYgPSB7CisJCS5uYW1lCQk9ICJzZXMiLAorCQkucHJvYmUJCT0gc2VzX3Byb2JlLAorCQkucmVtb3ZlCQk9IHNlc19yZW1vdmUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNlc19pbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCWVyciA9IHNjc2lfcmVnaXN0ZXJfaW50ZXJmYWNlKCZzZXNfaW50ZXJmYWNlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gc2NzaV9yZWdpc3Rlcl9kcml2ZXIoJnNlc190ZW1wbGF0ZS5nZW5kcnYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3VucmVnOworCisJcmV0dXJuIDA7CisKKyBvdXRfdW5yZWc6CisJc2NzaV91bnJlZ2lzdGVyX2ludGVyZmFjZSgmc2VzX2ludGVyZmFjZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNlc19leGl0KHZvaWQpCit7CisJc2NzaV91bnJlZ2lzdGVyX2RyaXZlcigmc2VzX3RlbXBsYXRlLmdlbmRydik7CisJc2NzaV91bnJlZ2lzdGVyX2ludGVyZmFjZSgmc2VzX2ludGVyZmFjZSk7Cit9CisKK21vZHVsZV9pbml0KHNlc19pbml0KTsKK21vZHVsZV9leGl0KHNlc19leGl0KTsKKworTU9EVUxFX0FMSUFTX1NDU0lfREVWSUNFKFRZUEVfRU5DTE9TVVJFKTsKKworTU9EVUxFX0FVVEhPUigiSmFtZXMgQm90dG9tbGV5Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNDU0kgRW5jbG9zdXJlIFNlcnZpY2VzIChzZXMpIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NnLmMgYi9kcml2ZXJzL3Njc2kvc2cuYwppbmRleCBhYmEyOGYzLi5lNTE1NmFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2cuYworKysgYi9kcml2ZXJzL3Njc2kvc2cuYwpAQCAtMTE2MCwyMyArMTE2MCwyMiBAQAogCXJldHVybiAocmV0dmFsIDwgMCkgPyByZXR2YWwgOiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKgotc2dfdm1hX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgKnR5cGUpCitzdGF0aWMgaW50CitzZ192bWFfZmF1bHQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCB2bV9mYXVsdCAqdm1mKQogewogCVNnX2ZkICpzZnA7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSBOT1BBR0VfU0lHQlVTOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBsZW4sIHNhOwogCVNnX3NjYXR0ZXJfaG9sZCAqcnN2X3NjaHA7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKIAlpbnQgazsKIAogCWlmICgoTlVMTCA9PSB2bWEpIHx8ICghKHNmcCA9IChTZ19mZCAqKSB2bWEtPnZtX3ByaXZhdGVfZGF0YSkpKQotCQlyZXR1cm4gcGFnZTsKKwkJcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUzsKIAlyc3Zfc2NocCA9ICZzZnAtPnJlc2VydmU7Ci0Jb2Zmc2V0ID0gYWRkciAtIHZtYS0+dm1fc3RhcnQ7CisJb2Zmc2V0ID0gdm1mLT5wZ29mZiA8PCBQQUdFX1NISUZUOwogCWlmIChvZmZzZXQgPj0gcnN2X3NjaHAtPmJ1ZmZsZW4pCi0JCXJldHVybiBwYWdlOwotCVNDU0lfTE9HX1RJTUVPVVQoMywgcHJpbnRrKCJzZ192bWFfbm9wYWdlOiBvZmZzZXQ9JWx1LCBzY2F0Zz0lZFxuIiwKKwkJcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUzsKKwlTQ1NJX0xPR19USU1FT1VUKDMsIHByaW50aygic2dfdm1hX2ZhdWx0OiBvZmZzZXQ9JWx1LCBzY2F0Zz0lZFxuIiwKIAkJCQkgICBvZmZzZXQsIHJzdl9zY2hwLT5rX3VzZV9zZykpOwogCXNnID0gcnN2X3NjaHAtPmJ1ZmZlcjsKIAlzYSA9IHZtYS0+dm1fc3RhcnQ7CkBAIC0xMTg1LDIxICsxMTg0LDIxIEBACiAJCWxlbiA9IHZtYS0+dm1fZW5kIC0gc2E7CiAJCWxlbiA9IChsZW4gPCBzZy0+bGVuZ3RoKSA/IGxlbiA6IHNnLT5sZW5ndGg7CiAJCWlmIChvZmZzZXQgPCBsZW4pIHsKKwkJCXN0cnVjdCBwYWdlICpwYWdlOwogCQkJcGFnZSA9IHZpcnRfdG9fcGFnZShwYWdlX2FkZHJlc3Moc2dfcGFnZShzZykpICsgb2Zmc2V0KTsKIAkJCWdldF9wYWdlKHBhZ2UpOwkvKiBpbmNyZW1lbnQgcGFnZSBjb3VudCAqLwotCQkJYnJlYWs7CisJCQl2bWYtPnBhZ2UgPSBwYWdlOworCQkJcmV0dXJuIDA7IC8qIHN1Y2Nlc3MgKi8KIAkJfQogCQlzYSArPSBsZW47CiAJCW9mZnNldCAtPSBsZW47CiAJfQogCi0JaWYgKHR5cGUpCi0JCSp0eXBlID0gVk1fRkFVTFRfTUlOT1I7Ci0JcmV0dXJuIHBhZ2U7CisJcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUzsKIH0KIAogc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBzZ19tbWFwX3ZtX29wcyA9IHsKLQkubm9wYWdlID0gc2dfdm1hX25vcGFnZSwKKwkuZmF1bHQgPSBzZ192bWFfZmF1bHQsCiB9OwogCiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3IuYyBiL2RyaXZlcnMvc2NzaS9zci5jCmluZGV4IDUwYmE0OTIuLjIwODU2NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zci5jCisrKyBiL2RyaXZlcnMvc2NzaS9zci5jCkBAIC0xNjMsNiArMTYzLDI5IEBACiAJbXV0ZXhfdW5sb2NrKCZzcl9yZWZfbXV0ZXgpOwogfQogCisvKiBpZGVudGljYWwgdG8gc2NzaV90ZXN0X3VuaXRfcmVhZHkgZXhjZXB0IHRoYXQgaXQgZG9lc24ndAorICogZWF0IHRoZSBOT1RfUkVBRFkgcmV0dXJucyBmb3IgcmVtb3ZhYmxlIG1lZGlhICovCitpbnQgc3JfdGVzdF91bml0X3JlYWR5KHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IHNjc2lfc2Vuc2VfaGRyICpzc2hkcikKK3sKKwlpbnQgcmV0cmllcyA9IE1BWF9SRVRSSUVTOworCWludCB0aGVfcmVzdWx0OworCXU4IGNtZFtdID0ge1RFU1RfVU5JVF9SRUFEWSwgMCwgMCwgMCwgMCwgMCB9OworCisJLyogaXNzdWUgVEVTVF9VTklUX1JFQURZIHVudGlsIHRoZSBpbml0aWFsIHN0YXJ0dXAgVU5JVF9BVFRFTlRJT04KKwkgKiBjb25kaXRpb25zIGFyZSBnb25lLCBvciBhIHRpbWVvdXQgaGFwcGVucworCSAqLworCWRvIHsKKwkJdGhlX3Jlc3VsdCA9IHNjc2lfZXhlY3V0ZV9yZXEoc2RldiwgY21kLCBETUFfTk9ORSwgTlVMTCwKKwkJCQkJICAgICAgMCwgc3NoZHIsIFNSX1RJTUVPVVQsCisJCQkJCSAgICAgIHJldHJpZXMtLSk7CisKKwl9IHdoaWxlIChyZXRyaWVzID4gMCAmJgorCQkgKCFzY3NpX3N0YXR1c19pc19nb29kKHRoZV9yZXN1bHQpIHx8CisJCSAgKHNjc2lfc2Vuc2VfdmFsaWQoc3NoZHIpICYmCisJCSAgIHNzaGRyLT5zZW5zZV9rZXkgPT0gVU5JVF9BVFRFTlRJT04pKSk7CisJcmV0dXJuIHRoZV9yZXN1bHQ7Cit9CisKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0byBzZWUgaWYgdGhlIG1lZGlhIGhhcyBiZWVuIGNoYW5nZWQgaW4gdGhlCiAgKiBDRFJPTSBkcml2ZS4gIEl0IGlzIHBvc3NpYmxlIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IHNlbnNlZCBhIGNoYW5nZSwKQEAgLTE4NSw4ICsyMDgsNyBAQAogCX0KIAogCXNzaGRyID0gIGt6YWxsb2Moc2l6ZW9mKCpzc2hkciksIEdGUF9LRVJORUwpOwotCXJldHZhbCA9IHNjc2lfdGVzdF91bml0X3JlYWR5KGNkLT5kZXZpY2UsIFNSX1RJTUVPVVQsIE1BWF9SRVRSSUVTLAotCQkJCSAgICAgIHNzaGRyKTsKKwlyZXR2YWwgPSBzcl90ZXN0X3VuaXRfcmVhZHkoY2QtPmRldmljZSwgc3NoZHIpOwogCWlmIChyZXR2YWwgfHwgKHNjc2lfc2Vuc2VfdmFsaWQoc3NoZHIpICYmCiAJCSAgICAgICAvKiAweDNhIGlzIG1lZGl1bSBub3QgcHJlc2VudCAqLwogCQkgICAgICAgc3NoZHItPmFzYyA9PSAweDNhKSkgewpAQCAtNzMzLDEwICs3NTUsOCBAQAogewogCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKIAlzdHJ1Y3Qgc2NzaV9tb2RlX2RhdGEgZGF0YTsKLQl1bnNpZ25lZCBjaGFyIGNtZFtNQVhfQ09NTUFORF9TSVpFXTsKIAlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc3NoZHI7Ci0JdW5zaWduZWQgaW50IHRoZV9yZXN1bHQ7Ci0JaW50IHJldHJpZXMsIHJjLCBuOworCWludCByYywgbjsKIAogCXN0YXRpYyBjb25zdCBjaGFyICpsb2FkbWVjaFtdID0KIAl7CkBAIC03NTgsMjMgKzc3OCw4IEBACiAJCXJldHVybjsKIAl9CiAKLQkvKiBpc3N1ZSBURVNUX1VOSVRfUkVBRFkgdW50aWwgdGhlIGluaXRpYWwgc3RhcnR1cCBVTklUX0FUVEVOVElPTgotCSAqIGNvbmRpdGlvbnMgYXJlIGdvbmUsIG9yIGEgdGltZW91dCBoYXBwZW5zCi0JICovCi0JcmV0cmllcyA9IDA7Ci0JZG8gewotCQltZW1zZXQoKHZvaWQgKiljbWQsIDAsIE1BWF9DT01NQU5EX1NJWkUpOwotCQljbWRbMF0gPSBURVNUX1VOSVRfUkVBRFk7Ci0KLQkJdGhlX3Jlc3VsdCA9IHNjc2lfZXhlY3V0ZV9yZXEgKGNkLT5kZXZpY2UsIGNtZCwgRE1BX05PTkUsIE5VTEwsCi0JCQkJCSAgICAgICAwLCAmc3NoZHIsIFNSX1RJTUVPVVQsCi0JCQkJCSAgICAgICBNQVhfUkVUUklFUyk7Ci0KLQkJcmV0cmllcysrOwotCX0gd2hpbGUgKHJldHJpZXMgPCA1ICYmIAotCQkgKCFzY3NpX3N0YXR1c19pc19nb29kKHRoZV9yZXN1bHQpIHx8Ci0JCSAgKHNjc2lfc2Vuc2VfdmFsaWQoJnNzaGRyKSAmJgotCQkgICBzc2hkci5zZW5zZV9rZXkgPT0gVU5JVF9BVFRFTlRJT04pKSk7CisJLyogZWF0IHVuaXQgYXR0ZW50aW9ucyAqLworCXNyX3Rlc3RfdW5pdF9yZWFkeShjZC0+ZGV2aWNlLCAmc3NoZHIpOwogCiAJLyogYXNrIGZvciBtb2RlIHBhZ2UgMHgyYSAqLwogCXJjID0gc2NzaV9tb2RlX3NlbnNlKGNkLT5kZXZpY2UsIDAsIDB4MmEsIGJ1ZmZlciwgMTI4LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NyLmggYi9kcml2ZXJzL3Njc2kvc3IuaAppbmRleCA4MWZiYzBiLi4xZTE0NGRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3IuaAorKysgYi9kcml2ZXJzL3Njc2kvc3IuaApAQCAtNjEsNiArNjEsNyBAQAogaW50IHNyX2F1ZGlvX2lvY3RsKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqLCB1bnNpZ25lZCBpbnQsIHZvaWQgKik7CiAKIGludCBzcl9pc194YShTY3NpX0NEICopOworaW50IHNyX3Rlc3RfdW5pdF9yZWFkeShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBzY3NpX3NlbnNlX2hkciAqc3NoZHIpOwogCiAvKiBzcl92ZW5kb3IuYyAqLwogdm9pZCBzcl92ZW5kb3JfaW5pdChTY3NpX0NEICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NyX2lvY3RsLmMgYi9kcml2ZXJzL3Njc2kvc3JfaW9jdGwuYwppbmRleCBkNWNlYmZmLi5hZTg3ZDA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3JfaW9jdGwuYworKysgYi9kcml2ZXJzL3Njc2kvc3JfaW9jdGwuYwpAQCAtMzA2LDggKzMwNiw3IEBACiAJCS8qIHdlIGhhdmUgbm8gY2hhbmdlciBzdXBwb3J0ICovCiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoMCA9PSBzY3NpX3Rlc3RfdW5pdF9yZWFkeShjZC0+ZGV2aWNlLCBTUl9USU1FT1VULCBNQVhfUkVUUklFUywKLQkJCQkgICAgICAmc3NoZHIpKQorCWlmICgwID09IHNyX3Rlc3RfdW5pdF9yZWFkeShjZC0+ZGV2aWNlLCAmc3NoZHIpKQogCQlyZXR1cm4gQ0RTX0RJU0NfT0s7CiAKIAlpZiAoIWNkcm9tX2dldF9tZWRpYV9ldmVudChjZGksICZtZWQpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3VuM3hfZXNwLmMgYi9kcml2ZXJzL3Njc2kvc3VuM3hfZXNwLmMKaW5kZXggMWJjNDE5MC4uMDYxNTJjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3N1bjN4X2VzcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zdW4zeF9lc3AuYwpAQCAtMSwzOTIgKzEsMzE2IEBACi0vKiBzdW4zeF9lc3AuYzogIEVuaGFuY2VkU2NzaVByb2Nlc3NvciBTdW4zeCBTQ1NJIGRyaXZlciBjb2RlLgorLyogc3VuM3hfZXNwLmM6IEVTUCBmcm9udC1lbmQgZm9yIFN1bjN4IHN5c3RlbXMuCiAgKgotICogKEMpIDE5OTkgVGhvbWFzIEJvZ2VuZG9lcmZlciAodHNib2dlbmRAYWxwaGEuZnJhbmtlbi5kZSkKLSAqCi0gKiBCYXNlZCBvbiBEYXZpZCBTLiBNaWxsZXIncyBlc3AgZHJpdmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsMjAwOCBUaG9tYXMgQm9nZW5kb2VyZmVyICh0c2JvZ2VuZEBhbHBoYS5mcmFua2VuLmRlKQogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKLSNpbmNsdWRlICJzY3NpLmgiCi0jaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KLSNpbmNsdWRlICJOQ1I1M0M5eC5oIgotCiAjaW5jbHVkZSA8YXNtL3N1bjN4Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9kdm1hLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgogCi1zdGF0aWMgdm9pZCBkbWFfYmFycmllcihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyBpbnQgIGRtYV9ieXRlc19zZW50KHN0cnVjdCBOQ1JfRVNQICplc3AsIGludCBmaWZvX2NvdW50KTsKLXN0YXRpYyBpbnQgIGRtYV9jYW5fdHJhbnNmZXIoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCk7Ci1zdGF0aWMgdm9pZCBkbWFfZHJhaW4oc3RydWN0IE5DUl9FU1AgKmVzcCk7Ci1zdGF0aWMgdm9pZCBkbWFfaW52YWxpZGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyB2b2lkIGRtYV9kdW1wX3N0YXRlKHN0cnVjdCBOQ1JfRVNQICplc3ApOwotc3RhdGljIHZvaWQgZG1hX2luaXRfcmVhZChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiB2YWRkcmVzcywgaW50IGxlbmd0aCk7Ci1zdGF0aWMgdm9pZCBkbWFfaW5pdF93cml0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiB2YWRkcmVzcywgaW50IGxlbmd0aCk7Ci1zdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCk7Ci1zdGF0aWMgdm9pZCBkbWFfaW50c19vbihzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyBpbnQgIGRtYV9pcnFfcChzdHJ1Y3QgTkNSX0VTUCAqZXNwKTsKLXN0YXRpYyB2b2lkIGRtYV9wb2xsKHN0cnVjdCBOQ1JfRVNQICplc3AsIHVuc2lnbmVkIGNoYXIgKnZhZGRyKTsKLXN0YXRpYyBpbnQgIGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApOwotc3RhdGljIHZvaWQgZG1hX3Jlc2V0KHN0cnVjdCBOQ1JfRVNQICplc3ApOwotc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKTsKLXN0YXRpYyB2b2lkIGRtYV9tbXVfZ2V0X3Njc2lfb25lIChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKTsKLXN0YXRpYyB2b2lkIGRtYV9tbXVfZ2V0X3Njc2lfc2dsIChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKTsKLXN0YXRpYyB2b2lkIGRtYV9tbXVfcmVsZWFzZV9zY3NpX29uZSAoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCk7Ci1zdGF0aWMgdm9pZCBkbWFfbW11X3JlbGVhc2Vfc2NzaV9zZ2wgKHN0cnVjdCBOQ1JfRVNQICplc3AsIFNjc2lfQ21uZCAqc3ApOwotc3RhdGljIHZvaWQgZG1hX2FkdmFuY2Vfc2cgKFNjc2lfQ21uZCAqc3ApOworLyogRE1BIGNvbnRyb2xsZXIgcmVnIG9mZnNldHMgKi8KKyNkZWZpbmUgRE1BX0NTUgkJMHgwMFVMCS8qIHJ3ICBETUEgY29udHJvbC9zdGF0dXMgcmVnaXN0ZXIgICAgMHgwMCAgICovCisjZGVmaW5lIERNQV9BRERSICAgICAgICAweDA0VUwJLyogcncgIERNQSB0cmFuc2ZlciBhZGRyZXNzIHJlZ2lzdGVyICAweDA0ICAgKi8KKyNkZWZpbmUgRE1BX0NPVU5UICAgICAgIDB4MDhVTAkvKiBydyAgRE1BIHRyYW5zZmVyIGNvdW50IHJlZ2lzdGVyICAgIDB4MDggICAqLworI2RlZmluZSBETUFfVEVTVCAgICAgICAgMHgwY1VMCS8qIHJ3ICBETUEgdGVzdC9kZWJ1ZyByZWdpc3RlciAgICAgICAgMHgwYyAgICovCiAKLS8qIERldGVjdGluZyBFU1AgY2hpcHMgb24gdGhlIG1hY2hpbmUuICBUaGlzIGlzIHRoZSBzaW1wbGUgYW5kIGVhc3kKLSAqIHZlcnNpb24uCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworI2luY2x1ZGUgImVzcF9zY3NpLmgiCisKKyNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkic3VuM3hfZXNwIgorI2RlZmluZSBQRlggRFJWX01PRFVMRV9OQU1FCSI6ICIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JCSIxLjAwMCIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJOb3YgMSwgMjAwNyIKKworLyoKKyAqIG02OGsgYWx3YXlzIGFzc3VtZXMgcmVhZGwvd3JpdGVsIG9wZXJhdGUgb24gbGl0dGxlIGVuZGlhbgorICogbW1pbyBzcGFjZTsgdGhpcyBpcyB3cm9uZyBhdCBsZWFzdCBmb3IgU3VuM3gsIHNvIHdlCisgKiBuZWVkIHRvIHdvcmthcm91bmQgdGhpcyB1bnRpbCBhIHByb3BlciB3YXkgaXMgZm91bmQKICAqLwotaW50IHN1bjN4X2VzcF9kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCkKKyNpZiAwCisjZGVmaW5lIGRtYV9yZWFkMzIoUkVHKSBcCisJcmVhZGwoZXNwLT5kbWFfcmVncyArIChSRUcpKQorI2RlZmluZSBkbWFfd3JpdGUzMihWQUwsIFJFRykgXAorCXdyaXRlbCgoVkFMKSwgZXNwLT5kbWFfcmVncyArIChSRUcpKQorI2Vsc2UKKyNkZWZpbmUgZG1hX3JlYWQzMihSRUcpIFwKKwkqKHZvbGF0aWxlIHUzMiAqKShlc3AtPmRtYV9yZWdzICsgKFJFRykpCisjZGVmaW5lIGRtYV93cml0ZTMyKFZBTCwgUkVHKSBcCisJZG8geyAqKHZvbGF0aWxlIHUzMiAqKShlc3AtPmRtYV9yZWdzICsgKFJFRykpID0gKFZBTCk7IH0gd2hpbGUgKDApCisjZW5kaWYKKworc3RhdGljIHZvaWQgc3VuM3hfZXNwX3dyaXRlOChzdHJ1Y3QgZXNwICplc3AsIHU4IHZhbCwgdW5zaWduZWQgbG9uZyByZWcpCiB7Ci0Jc3RydWN0IE5DUl9FU1AgKmVzcDsKLQlzdHJ1Y3QgQ29uZmlnRGV2ICplc3BfZGV2OwotCi0JZXNwX2RldiA9IDA7Ci0JZXNwID0gZXNwX2FsbG9jYXRlKHRwbnQsIGVzcF9kZXYsIDApOwotCi0JLyogRG8gY29tbWFuZCB0cmFuc2ZlciB3aXRoIERNQSAqLwotCWVzcC0+ZG9fcGlvX2NtZHMgPSAwOwotCi0JLyogUmVxdWlyZWQgZnVuY3Rpb25zICovCi0JZXNwLT5kbWFfYnl0ZXNfc2VudCA9ICZkbWFfYnl0ZXNfc2VudDsKLQllc3AtPmRtYV9jYW5fdHJhbnNmZXIgPSAmZG1hX2Nhbl90cmFuc2ZlcjsKLQllc3AtPmRtYV9kdW1wX3N0YXRlID0gJmRtYV9kdW1wX3N0YXRlOwotCWVzcC0+ZG1hX2luaXRfcmVhZCA9ICZkbWFfaW5pdF9yZWFkOwotCWVzcC0+ZG1hX2luaXRfd3JpdGUgPSAmZG1hX2luaXRfd3JpdGU7Ci0JZXNwLT5kbWFfaW50c19vZmYgPSAmZG1hX2ludHNfb2ZmOwotCWVzcC0+ZG1hX2ludHNfb24gPSAmZG1hX2ludHNfb247Ci0JZXNwLT5kbWFfaXJxX3AgPSAmZG1hX2lycV9wOwotCWVzcC0+ZG1hX3BvcnRzX3AgPSAmZG1hX3BvcnRzX3A7Ci0JZXNwLT5kbWFfc2V0dXAgPSAmZG1hX3NldHVwOwotCi0JLyogT3B0aW9uYWwgZnVuY3Rpb25zICovCi0JZXNwLT5kbWFfYmFycmllciA9ICZkbWFfYmFycmllcjsKLQllc3AtPmRtYV9pbnZhbGlkYXRlID0gJmRtYV9pbnZhbGlkYXRlOwotCWVzcC0+ZG1hX2RyYWluID0gJmRtYV9kcmFpbjsKLQllc3AtPmRtYV9pcnFfZW50cnkgPSAwOwotCWVzcC0+ZG1hX2lycV9leGl0ID0gMDsKLQllc3AtPmRtYV9sZWRfb24gPSAwOwotCWVzcC0+ZG1hX2xlZF9vZmYgPSAwOwotCWVzcC0+ZG1hX3BvbGwgPSAmZG1hX3BvbGw7Ci0JZXNwLT5kbWFfcmVzZXQgPSAmZG1hX3Jlc2V0OwotCi0gICAgICAgIC8qIHZpcnR1YWwgRE1BIGZ1bmN0aW9ucyAqLwotICAgICAgICBlc3AtPmRtYV9tbXVfZ2V0X3Njc2lfb25lID0gJmRtYV9tbXVfZ2V0X3Njc2lfb25lOwotICAgICAgICBlc3AtPmRtYV9tbXVfZ2V0X3Njc2lfc2dsID0gJmRtYV9tbXVfZ2V0X3Njc2lfc2dsOwotICAgICAgICBlc3AtPmRtYV9tbXVfcmVsZWFzZV9zY3NpX29uZSA9ICZkbWFfbW11X3JlbGVhc2Vfc2NzaV9vbmU7Ci0gICAgICAgIGVzcC0+ZG1hX21tdV9yZWxlYXNlX3Njc2lfc2dsID0gJmRtYV9tbXVfcmVsZWFzZV9zY3NpX3NnbDsKLSAgICAgICAgZXNwLT5kbWFfYWR2YW5jZV9zZyA9ICZkbWFfYWR2YW5jZV9zZzsKLQkgICAgCi0JLyogU0NTSSBjaGlwIHNwZWVkICovCi0JZXNwLT5jZnJlcSA9IDIwMDAwMDAwOwotCWVzcC0+ZXJlZ3MgPSAoc3RydWN0IEVTUF9yZWdzICopKFNVTjNYX0VTUF9CQVNFKTsKLQllc3AtPmRyZWdzID0gKHZvaWQgKilTVU4zWF9FU1BfRE1BOwotCi0JZXNwLT5lc3BfY29tbWFuZCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopZHZtYV9tYWxsb2MoRFZNQV9QQUdFX1NJWkUpOwotCWVzcC0+ZXNwX2NvbW1hbmRfZHZtYSA9IGR2bWFfdnRvYigodW5zaWduZWQgbG9uZyllc3AtPmVzcF9jb21tYW5kKTsKLQotCWVzcC0+aXJxID0gMjsKLQlpZiAocmVxdWVzdF9pcnEoZXNwLT5pcnEsIGVzcF9pbnRyLCBJUlFGX0RJU0FCTEVELAotCQkJIlNVTjNYIFNDU0kiLCBlc3AtPmVob3N0KSkgewotCQllc3BfZGVhbGxvY2F0ZShlc3ApOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQllc3AtPnNjc2lfaWQgPSA3OwotCWVzcC0+ZGlmZiA9IDA7Ci0KLQllc3BfaW5pdGlhbGl6ZShlc3ApOwotCi0gCS8qIGZvciByZWFzb25zIGJleW9uZCBteSBrbm93bGVkZ2UgKGFuZCB3aGljaCBzaG91bGQgbGlrZWx5IGJlIGZpeGVkKQotIAkgICBzeW5jIG1vZGUgZG9lc24ndCB3b3JrIG9uIGEgMy84MCBhdCA1bWh6LiAgYnV0IGl0IGRvZXMgYXQgNC4gKi8KLSAJZXNwLT5zeW5jX2RlZnAgPSAweDNmOwotCi0JcHJpbnRrKCJFU1A6IFRvdGFsIG9mICVkIEVTUCBob3N0cyBmb3VuZCwgJWQgYWN0dWFsbHkgaW4gdXNlLlxuIiwgbmVzcHMsCi0JICAgICAgIGVzcHNfaW5fdXNlKTsKLQllc3BzX3J1bm5pbmcgPSBlc3BzX2luX3VzZTsKLQlyZXR1cm4gZXNwc19pbl91c2U7CisJd3JpdGViKHZhbCwgZXNwLT5yZWdzICsgKHJlZyAqIDRVTCkpOwogfQogCi1zdGF0aWMgdm9pZCBkbWFfZG9fZHJhaW4oc3RydWN0IE5DUl9FU1AgKmVzcCkKK3N0YXRpYyB1OCBzdW4zeF9lc3BfcmVhZDgoc3RydWN0IGVzcCAqZXNwLCB1bnNpZ25lZCBsb25nIHJlZykKIHsKLSAJc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKmRyZWdzID0KLSAJCShzdHJ1Y3Qgc3BhcmNfZG1hX3JlZ2lzdGVycyAqKSBlc3AtPmRyZWdzOwotIAkKLSAJaW50IGNvdW50ID0gNTAwMDAwOwotIAotIAl3aGlsZSgoZHJlZ3MtPmNvbmRfcmVnICYgRE1BX1BFTkRfUkVBRCkgJiYgKC0tY291bnQgPiAwKSkgCi0gCQl1ZGVsYXkoMSk7Ci0gCi0gCWlmKCFjb3VudCkgewotIAkJcHJpbnRrKCIlczolZCB0aW1lb3V0IENTUiAlMDhseFxuIiwgX19GSUxFX18sIF9fTElORV9fLCBkcmVncy0+Y29uZF9yZWcpOwotIAl9Ci0gCi0gCWRyZWdzLT5jb25kX3JlZyB8PSBETUFfRklGT19TVERSQUlOOwotIAkKLSAJY291bnQgPSA1MDAwMDA7Ci0gCi0gCXdoaWxlKChkcmVncy0+Y29uZF9yZWcgJiBETUFfRklGT19JU0RSQUlOKSAmJiAoLS1jb3VudCA+IDApKSAKLSAJCXVkZWxheSgxKTsKLSAKLSAJaWYoIWNvdW50KSB7Ci0gCQlwcmludGsoIiVzOiVkIHRpbWVvdXQgQ1NSICUwOGx4XG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIGRyZWdzLT5jb25kX3JlZyk7Ci0gCX0KLSAKLX0KLSAKLXN0YXRpYyB2b2lkIGRtYV9iYXJyaWVyKHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci0gIAlzdHJ1Y3Qgc3BhcmNfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPQotICAJCShzdHJ1Y3Qgc3BhcmNfZG1hX3JlZ2lzdGVycyAqKSBlc3AtPmRyZWdzOwotIAlpbnQgY291bnQgPSA1MDAwMDA7Ci0gIAotIAl3aGlsZSgoZHJlZ3MtPmNvbmRfcmVnICYgRE1BX1BFTkRfUkVBRCkgJiYgKC0tY291bnQgPiAwKSkKLSAgCQl1ZGVsYXkoMSk7Ci0gCi0gCWlmKCFjb3VudCkgewotIAkJcHJpbnRrKCIlczolZCB0aW1lb3V0IENTUiAlMDhseFxuIiwgX19GSUxFX18sIF9fTElORV9fLCBkcmVncy0+Y29uZF9yZWcpOwotIAl9Ci0gCi0gIAlkcmVncy0+Y29uZF9yZWcgJj0gfihETUFfRU5BQkxFKTsKKwlyZXR1cm4gcmVhZGIoZXNwLT5yZWdzICsgKHJlZyAqIDRVTCkpOwogfQogCi0vKiBUaGlzIHVzZXMgdmFyaW91cyBETUEgY3NyIGZpZWxkcyBhbmQgdGhlIGZpZm8gZmxhZ3MgY291bnQgdmFsdWUgdG8KLSAqIGRldGVybWluZSBob3cgbWFueSBieXRlcyB3ZXJlIHN1Y2Nlc3NmdWxseSBzZW50L3JlY2VpdmVkIGJ5IHRoZSBFU1AuCi0gKi8KLXN0YXRpYyBpbnQgZG1hX2J5dGVzX3NlbnQoc3RydWN0IE5DUl9FU1AgKmVzcCwgaW50IGZpZm9fY291bnQpCitzdGF0aWMgZG1hX2FkZHJfdCBzdW4zeF9lc3BfbWFwX3NpbmdsZShzdHJ1Y3QgZXNwICplc3AsIHZvaWQgKmJ1ZiwKKwkJCQkgICAgICBzaXplX3Qgc3osIGludCBkaXIpCiB7Ci0Jc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKmRyZWdzID0gCi0JCShzdHJ1Y3Qgc3BhcmNfZG1hX3JlZ2lzdGVycyAqKSBlc3AtPmRyZWdzOwotCi0JaW50IHJ2YWwgPSBkcmVncy0+c3RfYWRkciAtIGVzcC0+ZXNwX2NvbW1hbmRfZHZtYTsKLQotCXJldHVybiBydmFsIC0gZmlmb19jb3VudDsKKwlyZXR1cm4gZG1hX21hcF9zaW5nbGUoZXNwLT5kZXYsIGJ1Ziwgc3osIGRpcik7CiB9CiAKLXN0YXRpYyBpbnQgZG1hX2Nhbl90cmFuc2ZlcihzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKQorc3RhdGljIGludCBzdW4zeF9lc3BfbWFwX3NnKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCQkgIGludCBudW1fc2csIGludCBkaXIpCiB7Ci0JcmV0dXJuIHNwLT5TQ3AudGhpc19yZXNpZHVhbDsKKwlyZXR1cm4gZG1hX21hcF9zZyhlc3AtPmRldiwgc2csIG51bV9zZywgZGlyKTsKIH0KIAotc3RhdGljIHZvaWQgZG1hX2RyYWluKHN0cnVjdCBOQ1JfRVNQICplc3ApCitzdGF0aWMgdm9pZCBzdW4zeF9lc3BfdW5tYXBfc2luZ2xlKHN0cnVjdCBlc3AgKmVzcCwgZG1hX2FkZHJfdCBhZGRyLAorCQkJCSAgc2l6ZV90IHN6LCBpbnQgZGlyKQogewotCXN0cnVjdCBzcGFyY19kbWFfcmVnaXN0ZXJzICpkcmVncyA9Ci0JCShzdHJ1Y3Qgc3BhcmNfZG1hX3JlZ2lzdGVycyAqKSBlc3AtPmRyZWdzOwotCWludCBjb3VudCA9IDUwMDAwMDsKKwlkbWFfdW5tYXBfc2luZ2xlKGVzcC0+ZGV2LCBhZGRyLCBzeiwgZGlyKTsKK30KIAotCWlmKGRyZWdzLT5jb25kX3JlZyAmIERNQV9GSUZPX0lTRFJBSU4pIHsKLQkJZHJlZ3MtPmNvbmRfcmVnIHw9IERNQV9GSUZPX1NURFJBSU47Ci0JCXdoaWxlKChkcmVncy0+Y29uZF9yZWcgJiBETUFfRklGT19JU0RSQUlOKSAmJiAoLS1jb3VudCA+IDApKQotCQkJdWRlbGF5KDEpOwotCQlpZighY291bnQpIHsKLQkJCXByaW50aygiJXM6JWQgdGltZW91dCBDU1IgJTA4bHhcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgZHJlZ3MtPmNvbmRfcmVnKTsKK3N0YXRpYyB2b2lkIHN1bjN4X2VzcF91bm1hcF9zZyhzdHJ1Y3QgZXNwICplc3AsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkgICAgICBpbnQgbnVtX3NnLCBpbnQgZGlyKQoreworCWRtYV91bm1hcF9zZyhlc3AtPmRldiwgc2csIG51bV9zZywgZGlyKTsKK30KKworc3RhdGljIGludCBzdW4zeF9lc3BfaXJxX3BlbmRpbmcoc3RydWN0IGVzcCAqZXNwKQoreworCWlmIChkbWFfcmVhZDMyKERNQV9DU1IpICYgKERNQV9ITkRMX0lOVFIgfCBETUFfSE5ETF9FUlJPUikpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdW4zeF9lc3BfcmVzZXRfZG1hKHN0cnVjdCBlc3AgKmVzcCkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gZG1hX3JlYWQzMihETUFfQ1NSKTsKKwlkbWFfd3JpdGUzMih2YWwgfCBETUFfUlNUX1NDU0ksIERNQV9DU1IpOworCWRtYV93cml0ZTMyKHZhbCAmIH5ETUFfUlNUX1NDU0ksIERNQV9DU1IpOworCisJLyogRW5hYmxlIGludGVycnVwdHMuICAqLworCXZhbCA9IGRtYV9yZWFkMzIoRE1BX0NTUik7CisJZG1hX3dyaXRlMzIodmFsIHwgRE1BX0lOVF9FTkFCLCBETUFfQ1NSKTsKK30KKworc3RhdGljIHZvaWQgc3VuM3hfZXNwX2RtYV9kcmFpbihzdHJ1Y3QgZXNwICplc3ApCit7CisJdTMyIGNzcjsKKwlpbnQgbGltOworCisJY3NyID0gZG1hX3JlYWQzMihETUFfQ1NSKTsKKwlpZiAoIShjc3IgJiBETUFfRklGT19JU0RSQUlOKSkKKwkJcmV0dXJuOworCisJZG1hX3dyaXRlMzIoY3NyIHwgRE1BX0ZJRk9fU1REUkFJTiwgRE1BX0NTUik7CisKKwlsaW0gPSAxMDAwOworCXdoaWxlIChkbWFfcmVhZDMyKERNQV9DU1IpICYgRE1BX0ZJRk9fSVNEUkFJTikgeworCQlpZiAoLS1saW0gPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJlc3AlZDogRE1BIHdpbGwgbm90IGRyYWluIVxuIiwKKwkJCSAgICAgICBlc3AtPmhvc3QtPnVuaXF1ZV9pZCk7CisJCQlicmVhazsKIAkJfQotCi0JfQotfQotCi1zdGF0aWMgdm9pZCBkbWFfaW52YWxpZGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKQotewotCXN0cnVjdCBzcGFyY19kbWFfcmVnaXN0ZXJzICpkcmVncyA9Ci0JCShzdHJ1Y3Qgc3BhcmNfZG1hX3JlZ2lzdGVycyAqKSBlc3AtPmRyZWdzOwotCi0JX191MzIgdG1wOwotCWludCBjb3VudCA9IDUwMDAwMDsKLQotCXdoaWxlKCgodG1wID0gZHJlZ3MtPmNvbmRfcmVnKSAmIERNQV9QRU5EX1JFQUQpICYmICgtLWNvdW50ID4gMCkpIAogCQl1ZGVsYXkoMSk7Ci0KLQlpZighY291bnQpIHsKLQkJcHJpbnRrKCIlczolZCB0aW1lb3V0IENTUiAlMDhseFxuIiwgX19GSUxFX18sIF9fTElORV9fLCBkcmVncy0+Y29uZF9yZWcpOwogCX0KLQotCWRyZWdzLT5jb25kX3JlZyA9IHRtcCB8IERNQV9GSUZPX0lOVjsKLQlkcmVncy0+Y29uZF9yZWcgJj0gfkRNQV9GSUZPX0lOVjsKLQogfQogCi1zdGF0aWMgdm9pZCBkbWFfZHVtcF9zdGF0ZShzdHJ1Y3QgTkNSX0VTUCAqZXNwKQorc3RhdGljIHZvaWQgc3VuM3hfZXNwX2RtYV9pbnZhbGlkYXRlKHN0cnVjdCBlc3AgKmVzcCkKIHsKLQlzdHJ1Y3Qgc3BhcmNfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPQotCQkoc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKikgZXNwLT5kcmVnczsKKwl1MzIgdmFsOworCWludCBsaW07CiAKLQlFU1BMT0coKCJlc3AlZDogZG1hIC0tIGNvbmRfcmVnPCUwOGx4PiBhZGRyPCUwOGx4PlxuIiwKLQkJZXNwLT5lc3BfaWQsIGRyZWdzLT5jb25kX3JlZywgZHJlZ3MtPnN0X2FkZHIpKTsKLX0KLQotc3RhdGljIHZvaWQgZG1hX2luaXRfcmVhZChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBfX3UzMiB2YWRkcmVzcywgaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3Qgc3BhcmNfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPSAKLQkJKHN0cnVjdCBzcGFyY19kbWFfcmVnaXN0ZXJzICopIGVzcC0+ZHJlZ3M7Ci0KLQlkcmVncy0+c3RfYWRkciA9IHZhZGRyZXNzOwotCWRyZWdzLT5jb25kX3JlZyB8PSAoRE1BX1NUX1dSSVRFIHwgRE1BX0VOQUJMRSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9pbml0X3dyaXRlKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIHZhZGRyZXNzLCBpbnQgbGVuZ3RoKQotewotCXN0cnVjdCBzcGFyY19kbWFfcmVnaXN0ZXJzICpkcmVncyA9IAotCQkoc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKikgZXNwLT5kcmVnczsKLQotCS8qIFNldCB1cCB0aGUgRE1BIGNvdW50ZXJzICovCi0KLQlkcmVncy0+c3RfYWRkciA9IHZhZGRyZXNzOwotCWRyZWdzLT5jb25kX3JlZyA9ICgoZHJlZ3MtPmNvbmRfcmVnICYgfihETUFfU1RfV1JJVEUpKSB8IERNQV9FTkFCTEUpOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKmVzcCkKLXsKLQlETUFfSU5UU09GRigoc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKikgZXNwLT5kcmVncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9pbnRzX29uKHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci0JRE1BX0lOVFNPTigoc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKikgZXNwLT5kcmVncyk7Ci19Ci0KLXN0YXRpYyBpbnQgZG1hX2lycV9wKHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci0JcmV0dXJuIERNQV9JUlFfUCgoc3RydWN0IHNwYXJjX2RtYV9yZWdpc3RlcnMgKikgZXNwLT5kcmVncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9wb2xsKHN0cnVjdCBOQ1JfRVNQICplc3AsIHVuc2lnbmVkIGNoYXIgKnZhZGRyKQotewotCWludCBjb3VudCA9IDUwOwotCWRtYV9kb19kcmFpbihlc3ApOwotCi0JLyogV2FpdCB0aWxsIHRoZSBmaXJzdCBiaXRzIHNldHRsZS4gKi8KLQl3aGlsZSgoKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopdmFkZHIgPT0gMHhmZikgJiYgKC0tY291bnQgPiAwKSkKKwlsaW0gPSAxMDAwOworCXdoaWxlICgodmFsID0gZG1hX3JlYWQzMihETUFfQ1NSKSkgJiBETUFfUEVORF9SRUFEKSB7CisJCWlmICgtLWxpbSA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9BTEVSVCBQRlggImVzcCVkOiBETUEgd2lsbCBub3QgIgorCQkJICAgICAgICJpbnZhbGlkYXRlIVxuIiwgZXNwLT5ob3N0LT51bmlxdWVfaWQpOworCQkJYnJlYWs7CisJCX0KIAkJdWRlbGF5KDEpOwotCi0JaWYoIWNvdW50KSB7Ci0vLwkJcHJpbnRrKCIlczolZCB0aW1lb3V0IGV4cGlyZSAoZGF0YSAlMDJ4KVxuIiwgX19GSUxFX18sIF9fTElORV9fLAotLy8JCSAgICAgICBlc3BfcmVhZChlc3AtPmVyZWdzLT5lc3BfZmRhdGEpKTsKLQkJLy9tYWNoX2hhbHQoKTsKLQkJdmFkZHJbMF0gPSBlc3BfcmVhZChlc3AtPmVyZWdzLT5lc3BfZmRhdGEpOwotCQl2YWRkclsxXSA9IGVzcF9yZWFkKGVzcC0+ZXJlZ3MtPmVzcF9mZGF0YSk7CiAJfQogCi19CQotCi1zdGF0aWMgaW50IGRtYV9wb3J0c19wKHN0cnVjdCBOQ1JfRVNQICplc3ApCi17Ci0JcmV0dXJuICgoKHN0cnVjdCBzcGFyY19kbWFfcmVnaXN0ZXJzICopIGVzcC0+ZHJlZ3MpLT5jb25kX3JlZyAKLQkJCSYgRE1BX0lOVF9FTkFCKTsKKwl2YWwgJj0gfihETUFfRU5BQkxFIHwgRE1BX1NUX1dSSVRFIHwgRE1BX0JDTlRfRU5BQik7CisJdmFsIHw9IERNQV9GSUZPX0lOVjsKKwlkbWFfd3JpdGUzMih2YWwsIERNQV9DU1IpOworCXZhbCAmPSB+RE1BX0ZJRk9fSU5WOworCWRtYV93cml0ZTMyKHZhbCwgRE1BX0NTUik7CiB9CiAKLS8qIFJlc2V0dGluZyB2YXJpb3VzIHBpZWNlcyBvZiB0aGUgRVNQIHNjc2kgZHJpdmVyIGNoaXBzZXQvYnVzZXMuICovCi1zdGF0aWMgdm9pZCBkbWFfcmVzZXQoc3RydWN0IE5DUl9FU1AgKmVzcCkKK3N0YXRpYyB2b2lkIHN1bjN4X2VzcF9zZW5kX2RtYV9jbWQoc3RydWN0IGVzcCAqZXNwLCB1MzIgYWRkciwgdTMyIGVzcF9jb3VudCwKKwkJCQkgIHUzMiBkbWFfY291bnQsIGludCB3cml0ZSwgdTggY21kKQogewotCXN0cnVjdCBzcGFyY19kbWFfcmVnaXN0ZXJzICpkcmVncyA9Ci0JCShzdHJ1Y3Qgc3BhcmNfZG1hX3JlZ2lzdGVycyAqKWVzcC0+ZHJlZ3M7CisJdTMyIGNzcjsKIAotCS8qIFB1bnQgdGhlIERWTUEgaW50byBhIGtub3duIHN0YXRlLiAqLwotCWRyZWdzLT5jb25kX3JlZyB8PSBETUFfUlNUX1NDU0k7Ci0JZHJlZ3MtPmNvbmRfcmVnICY9IH4oRE1BX1JTVF9TQ1NJKTsKLQlETUFfSU5UU09OKGRyZWdzKTsKKwlCVUdfT04oIShjbWQgJiBFU1BfQ01EX0RNQSkpOworCisJc3VuM3hfZXNwX3dyaXRlOChlc3AsIChlc3BfY291bnQgPj4gMCkgJiAweGZmLCBFU1BfVENMT1cpOworCXN1bjN4X2VzcF93cml0ZTgoZXNwLCAoZXNwX2NvdW50ID4+IDgpICYgMHhmZiwgRVNQX1RDTUVEKTsKKwljc3IgPSBkbWFfcmVhZDMyKERNQV9DU1IpOworCWNzciB8PSBETUFfRU5BQkxFOworCWlmICh3cml0ZSkKKwkJY3NyIHw9IERNQV9TVF9XUklURTsKKwllbHNlCisJCWNzciAmPSB+RE1BX1NUX1dSSVRFOworCWRtYV93cml0ZTMyKGNzciwgRE1BX0NTUik7CisJZG1hX3dyaXRlMzIoYWRkciwgRE1BX0FERFIpOworCisJc2NzaV9lc3BfY21kKGVzcCwgY21kKTsKIH0KIAotc3RhdGljIHZvaWQgZG1hX3NldHVwKHN0cnVjdCBOQ1JfRVNQICplc3AsIF9fdTMyIGFkZHIsIGludCBjb3VudCwgaW50IHdyaXRlKQorc3RhdGljIGludCBzdW4zeF9lc3BfZG1hX2Vycm9yKHN0cnVjdCBlc3AgKmVzcCkKIHsKLQlzdHJ1Y3Qgc3BhcmNfZG1hX3JlZ2lzdGVycyAqZHJlZ3MgPSAKLQkJKHN0cnVjdCBzcGFyY19kbWFfcmVnaXN0ZXJzICopIGVzcC0+ZHJlZ3M7Ci0JdW5zaWduZWQgbG9uZyBucmVnID0gZHJlZ3MtPmNvbmRfcmVnOworCXUzMiBjc3IgPSBkbWFfcmVhZDMyKERNQV9DU1IpOwogCi0vLwlwcmludGsoImRtYV9zZXR1cCAlYyBhZGRyICUwOHggY250ICUwOHhcbiIsCi0vLwkgICAgICAgd3JpdGUgPyAnVycgOiAnUicsIGFkZHIsIGNvdW50KTsKKwlpZiAoY3NyICYgRE1BX0hORExfRVJST1IpCisJCXJldHVybiAxOwogCi0JZG1hX2RvX2RyYWluKGVzcCk7Ci0KLQlpZih3cml0ZSkKLQkJbnJlZyB8PSBETUFfU1RfV1JJVEU7Ci0JZWxzZSB7Ci0JCW5yZWcgJj0gfihETUFfU1RfV1JJVEUpOwotCX0KLQkJCi0JbnJlZyB8PSBETUFfRU5BQkxFOwotCWRyZWdzLT5jb25kX3JlZyA9IG5yZWc7Ci0JZHJlZ3MtPnN0X2FkZHIgPSBhZGRyOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBkbWFfbW11X2dldF9zY3NpX29uZSAoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCkKLXsKLSAgICBzcC0+U0NwLmhhdmVfZGF0YV9pbiA9IGR2bWFfbWFwKCh1bnNpZ25lZCBsb25nKXNwLT5TQ3AuYnVmZmVyLAotCQkJCSAgICAgICBzcC0+U0NwLnRoaXNfcmVzaWR1YWwpOwotICAgIHNwLT5TQ3AucHRyID0gKGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpc3AtPlNDcC5oYXZlX2RhdGFfaW4pOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfbW11X2dldF9zY3NpX3NnbCAoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCkKLXsKLSAgICBpbnQgc3ogPSBzcC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWw7Ci0gICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHNwLT5TQ3AuYnVmZmVyOwotCi0gICAgd2hpbGUgKHN6ID49IDApIHsKLQkgICAgc2dbc3pdLmRtYV9hZGRyZXNzID0gZHZtYV9tYXAoKHVuc2lnbmVkIGxvbmcpc2dfdmlydCgmc2dbc3pdKSwKLQkJCQkJICBzZ1tzel0ubGVuZ3RoKTsKLQkgICAgc3otLTsKLSAgICB9Ci0gICAgc3AtPlNDcC5wdHI9KGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpc3AtPlNDcC5idWZmZXItPmRtYV9hZGRyZXNzKTsKLX0KLQotc3RhdGljIHZvaWQgZG1hX21tdV9yZWxlYXNlX3Njc2lfb25lIChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKQotewotICAgIGR2bWFfdW5tYXAoKGNoYXIgKilzcC0+U0NwLmhhdmVfZGF0YV9pbik7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV9tbXVfcmVsZWFzZV9zY3NpX3NnbCAoc3RydWN0IE5DUl9FU1AgKmVzcCwgU2NzaV9DbW5kICpzcCkKLXsKLSAgICBpbnQgc3ogPSBzcC0+dXNlX3NnIC0gMTsKLSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKXNwLT5yZXF1ZXN0X2J1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHdoaWxlKHN6ID49IDApIHsKLSAgICAgICAgZHZtYV91bm1hcCgoY2hhciAqKXNnW3N6XS5kbWFfYWRkcmVzcyk7Ci0gICAgICAgIHN6LS07Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBkbWFfYWR2YW5jZV9zZyAoU2NzaV9DbW5kICpzcCkKLXsKLSAgICBzcC0+U0NwLnB0ciA9IChjaGFyICopKCh1bnNpZ25lZCBsb25nKXNwLT5TQ3AuYnVmZmVyLT5kbWFfYWRkcmVzcyk7Ci19Ci0KLXN0YXRpYyBpbnQgc3VuM3hfZXNwX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCi17Ci0JLyogdGhpcyBjb2RlIGRvZXMgbm90IHN1cHBvcnQgYmVpbmcgY29tcGlsZWQgYXMgYSBtb2R1bGUgKi8JIAotCXJldHVybiAxOwotCi19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKLQkucHJvY19uYW1lCQk9ICJzdW4zeF9lc3AiLAotCS5wcm9jX2luZm8JCT0gJmVzcF9wcm9jX2luZm8sCi0JLm5hbWUJCQk9ICJTdW4gRVNQIDEwMC8xMDBhLzIwMCIsCi0JLmRldGVjdAkJCT0gc3VuM3hfZXNwX2RldGVjdCwKLQkucmVsZWFzZSAgICAgICAgICAgICAgICA9IHN1bjN4X2VzcF9yZWxlYXNlLAotCS5zbGF2ZV9hbGxvYwkJPSBlc3Bfc2xhdmVfYWxsb2MsCi0JLnNsYXZlX2Rlc3Ryb3kJCT0gZXNwX3NsYXZlX2Rlc3Ryb3ksCi0JLmluZm8JCQk9IGVzcF9pbmZvLAotCS5xdWV1ZWNvbW1hbmQJCT0gZXNwX3F1ZXVlLAotCS5laF9hYm9ydF9oYW5kbGVyCT0gZXNwX2Fib3J0LAotCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IGVzcF9yZXNldCwKLQkuY2FuX3F1ZXVlCQk9IDcsCi0JLnRoaXNfaWQJCT0gNywKLQkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKLQkuY21kX3Blcl9sdW4JCT0gMSwKLQkudXNlX2NsdXN0ZXJpbmcJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAorc3RhdGljIGNvbnN0IHN0cnVjdCBlc3BfZHJpdmVyX29wcyBzdW4zeF9lc3Bfb3BzID0geworCS5lc3Bfd3JpdGU4CT0Jc3VuM3hfZXNwX3dyaXRlOCwKKwkuZXNwX3JlYWQ4CT0Jc3VuM3hfZXNwX3JlYWQ4LAorCS5tYXBfc2luZ2xlCT0Jc3VuM3hfZXNwX21hcF9zaW5nbGUsCisJLm1hcF9zZwkJPQlzdW4zeF9lc3BfbWFwX3NnLAorCS51bm1hcF9zaW5nbGUJPQlzdW4zeF9lc3BfdW5tYXBfc2luZ2xlLAorCS51bm1hcF9zZwk9CXN1bjN4X2VzcF91bm1hcF9zZywKKwkuaXJxX3BlbmRpbmcJPQlzdW4zeF9lc3BfaXJxX3BlbmRpbmcsCisJLnJlc2V0X2RtYQk9CXN1bjN4X2VzcF9yZXNldF9kbWEsCisJLmRtYV9kcmFpbgk9CXN1bjN4X2VzcF9kbWFfZHJhaW4sCisJLmRtYV9pbnZhbGlkYXRlCT0Jc3VuM3hfZXNwX2RtYV9pbnZhbGlkYXRlLAorCS5zZW5kX2RtYV9jbWQJPQlzdW4zeF9lc3Bfc2VuZF9kbWFfY21kLAorCS5kbWFfZXJyb3IJPQlzdW4zeF9lc3BfZG1hX2Vycm9yLAogfTsKIAorc3RhdGljIGludCBfX2RldmluaXQgZXNwX3N1bjN4X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICp0cG50ID0gJnNjc2lfZXNwX3RlbXBsYXRlOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJc3RydWN0IGVzcCAqZXNwOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBlcnIgPSAtRU5PTUVNOwogCi0jaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKHRwbnQsIHNpemVvZihzdHJ1Y3QgZXNwKSk7CisJaWYgKCFob3N0KQorCQlnb3RvIGZhaWw7CiAKKwlob3N0LT5tYXhfaWQgPSA4OworCWVzcCA9IHNob3N0X3ByaXYoaG9zdCk7CisKKwllc3AtPmhvc3QgPSBob3N0OworCWVzcC0+ZGV2ID0gZGV2OworCWVzcC0+b3BzID0gJnN1bjN4X2VzcF9vcHM7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UoZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMgJiYgIXJlcy0+c3RhcnQpCisJCWdvdG8gZmFpbF91bmxpbms7CisKKwllc3AtPnJlZ3MgPSBpb3JlbWFwX25vY2FjaGUocmVzLT5zdGFydCwgMHgyMCk7CisJaWYgKCFlc3AtPnJlZ3MpCisJCWdvdG8gZmFpbF91bm1hcF9yZWdzOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKGRldiwgSU9SRVNPVVJDRV9NRU0sIDEpOworCWlmICghcmVzICYmICFyZXMtPnN0YXJ0KQorCQlnb3RvIGZhaWxfdW5tYXBfcmVnczsKKworCWVzcC0+ZG1hX3JlZ3MgPSBpb3JlbWFwX25vY2FjaGUocmVzLT5zdGFydCwgMHgxMCk7CisKKwllc3AtPmNvbW1hbmRfYmxvY2sgPSBkbWFfYWxsb2NfY29oZXJlbnQoZXNwLT5kZXYsIDE2LAorCQkJCQkJJmVzcC0+Y29tbWFuZF9ibG9ja19kbWEsCisJCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWVzcC0+Y29tbWFuZF9ibG9jaykKKwkJZ290byBmYWlsX3VubWFwX3JlZ3NfZG1hOworCisJaG9zdC0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShkZXYsIDApOworCWVyciA9IHJlcXVlc3RfaXJxKGhvc3QtPmlycSwgc2NzaV9lc3BfaW50ciwgSVJRRl9TSEFSRUQsCisJCQkgICJTVU4zWCBFU1AiLCBlc3ApOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGZhaWxfdW5tYXBfY29tbWFuZF9ibG9jazsKKworCWVzcC0+c2NzaV9pZCA9IDc7CisJZXNwLT5ob3N0LT50aGlzX2lkID0gZXNwLT5zY3NpX2lkOworCWVzcC0+c2NzaV9pZF9tYXNrID0gKDEgPDwgZXNwLT5zY3NpX2lkKTsKKwllc3AtPmNmcmVxID0gMjAwMDAwMDA7CisKKwlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBlc3ApOworCisJZXJyID0gc2NzaV9lc3BfcmVnaXN0ZXIoZXNwLCAmZGV2LT5kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbF9mcmVlX2lycTsKKworCXJldHVybiAwOworCitmYWlsX2ZyZWVfaXJxOgorCWZyZWVfaXJxKGhvc3QtPmlycSwgZXNwKTsKK2ZhaWxfdW5tYXBfY29tbWFuZF9ibG9jazoKKwlkbWFfZnJlZV9jb2hlcmVudChlc3AtPmRldiwgMTYsCisJCQkgIGVzcC0+Y29tbWFuZF9ibG9jaywKKwkJCSAgZXNwLT5jb21tYW5kX2Jsb2NrX2RtYSk7CitmYWlsX3VubWFwX3JlZ3NfZG1hOgorCWlvdW5tYXAoZXNwLT5kbWFfcmVncyk7CitmYWlsX3VubWFwX3JlZ3M6CisJaW91bm1hcChlc3AtPnJlZ3MpOworZmFpbF91bmxpbms6CisJc2NzaV9ob3N0X3B1dChob3N0KTsKK2ZhaWw6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZXNwX3N1bjN4X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVzcCAqZXNwID0gZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldik7CisJdW5zaWduZWQgaW50IGlycSA9IGVzcC0+aG9zdC0+aXJxOworCXUzMiB2YWw7CisKKwlzY3NpX2VzcF91bnJlZ2lzdGVyKGVzcCk7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMuICAqLworCXZhbCA9IGRtYV9yZWFkMzIoRE1BX0NTUik7CisJZG1hX3dyaXRlMzIodmFsICYgfkRNQV9JTlRfRU5BQiwgRE1BX0NTUik7CisKKwlmcmVlX2lycShpcnEsIGVzcCk7CisJZG1hX2ZyZWVfY29oZXJlbnQoZXNwLT5kZXYsIDE2LAorCQkJICBlc3AtPmNvbW1hbmRfYmxvY2ssCisJCQkgIGVzcC0+Y29tbWFuZF9ibG9ja19kbWEpOworCisJc2NzaV9ob3N0X3B1dChlc3AtPmhvc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGVzcF9zdW4zeF9kcml2ZXIgPSB7CisJLnByb2JlICAgICAgICAgID0gZXNwX3N1bjN4X3Byb2JlLAorCS5yZW1vdmUgICAgICAgICA9IF9fZGV2ZXhpdF9wKGVzcF9zdW4zeF9yZW1vdmUpLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lICAgPSAic3VuM3hfZXNwIiwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgc3VuM3hfZXNwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZlc3Bfc3VuM3hfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHN1bjN4X2VzcF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmVzcF9zdW4zeF9kcml2ZXIpOworfQorCitNT0RVTEVfREVTQ1JJUFRJT04oIlN1bjN4IEVTUCBTQ1NJIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiVGhvbWFzIEJvZ2VuZG9lcmZlciAodHNib2dlbmRAYWxwaGEuZnJhbmtlbi5kZSkiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKKworbW9kdWxlX2luaXQoc3VuM3hfZXNwX2luaXQpOworbW9kdWxlX2V4aXQoc3VuM3hfZXNwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9oaXBkLmMgYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2hpcGQuYwppbmRleCAyNTRiZGFlLi4zNTE0MmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2hpcGQuYworKysgYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2hpcGQuYwpAQCAtMzg0Miw3ICszODQyLDcgQEAKIAlpZiAoY3AtPnN0YXJ0cCA9PSBjcC0+cGh5cy5oZWFkLmxhc3RwIHx8CiAJICAgIHN5bV9ldmFsdWF0ZV9kcChucCwgY3AsIHNjcl90b19jcHUoY3AtPnBoeXMuaGVhZC5sYXN0cCksCiAJCQkgICAgJmRwX29mcykgPCAwKSB7Ci0JCXJldHVybiBjcC0+ZGF0YV9sZW47CisJCXJldHVybiBjcC0+ZGF0YV9sZW4gLSBjcC0+b2RkX2J5dGVfYWRqdXN0bWVudDsKIAl9CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3UxNC0zNGYuYyBiL2RyaXZlcnMvc2NzaS91MTQtMzRmLmMKaW5kZXggNjYyYzAwNC4uNThkN2VlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3UxNC0zNGYuYworKysgYi9kcml2ZXJzL3Njc2kvdTE0LTM0Zi5jCkBAIC0xMjE2LDcgKzEyMTYsNyBAQAogICAgICAgY3BwLT54ZGlyID0gRFREX0lOOwogICAgICAgcmV0dXJuOwogICAgICAgfQotICAgZWxzZSBpZiAoU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkgeworICAgZWxzZSBpZiAoU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpIHsKICAgICAgIGNwcC0+eGRpciA9IERURF9PVVQ7CiAgICAgICByZXR1cm47CiAgICAgICB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC82ODMyOHNlcmlhbC5jIGIvZHJpdmVycy9zZXJpYWwvNjgzMjhzZXJpYWwuYwppbmRleCAwZDk5MTIwLi4yYjhhNDEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC82ODMyOHNlcmlhbC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzY4MzI4c2VyaWFsLmMKQEAgLTg0LDkgKzg0LDYgQEAKIAogc3RydWN0IHR0eV9kcml2ZXIgKnNlcmlhbF9kcml2ZXI7CiAKLS8qIHNlcmlhbCBzdWJ0eXBlIGRlZmluaXRpb25zICovCi0jZGVmaW5lIFNFUklBTF9UWVBFX05PUk1BTAkxCi0gCiAvKiBudW1iZXIgb2YgY2hhcmFjdGVycyBsZWZ0IGluIHhtaXQgYnVmZmVyIGJlZm9yZSB3ZSBhc2sgZm9yIG1vcmUgKi8KICNkZWZpbmUgV0FLRVVQX0NIQVJTIDI1NgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC84MjUwLmMgYi9kcml2ZXJzL3NlcmlhbC84MjUwLmMKaW5kZXggYjhhNGJkOS4uNzdmN2E3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvODI1MC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzgyNTAuYwpAQCAtMzA1LDcgKzMwNSw3IEBACiAJcmV0dXJuIGF1X2lvX291dF9tYXBbb2Zmc2V0XTsKIH0KIAotI2VsaWYgZGVmaW5lZCAoQ09ORklHX1NFUklBTF84MjUwX1JNOUspCisjZWxpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfODI1MF9STTlLKQogCiBzdGF0aWMgY29uc3QgdTgKIAlyZWdtYXBfaW5bOF0gPSB7CkBAIC00NzUsNyArNDc1LDcgQEAKIAlzZXJpYWxfb3V0cCh1cCwgVUFSVF9ETE0sIHZhbHVlID4+IDggJiAweGZmKTsKIH0KIAotI2lmIGRlZmluZWQgKENPTkZJR19TRVJJQUxfODI1MF9BVTFYMDApCisjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMXzgyNTBfQVUxWDAwKQogLyogQXUxeDAwIGhhdmVuJ3QgZ290IGEgc3RhbmRhcmQgZGl2aXNvciBsYXRjaCAqLwogc3RhdGljIGludCBzZXJpYWxfZGxfcmVhZChzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwKQogewpAQCAtNDkyLDcgKzQ5Miw3IEBACiAJZWxzZQogCQlfc2VyaWFsX2RsX3dyaXRlKHVwLCB2YWx1ZSk7CiB9Ci0jZWxpZiBkZWZpbmVkIChDT05GSUdfU0VSSUFMXzgyNTBfUk05SykKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NFUklBTF84MjUwX1JNOUspCiBzdGF0aWMgaW50IHNlcmlhbF9kbF9yZWFkKHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXApCiB7CiAJcmV0dXJuCSh1cC0+cG9ydC5pb3R5cGUgPT0gVVBJT19STTkwMDApID8KQEAgLTExODUsOCArMTE4NSw4IEBACiAKIAlpcnFzID0gcHJvYmVfaXJxX29uKCk7CiAJc2VyaWFsX291dHAodXAsIFVBUlRfTUNSLCAwKTsKLQl1ZGVsYXkgKDEwKTsKLQlpZiAodXAtPnBvcnQuZmxhZ3MgJiBVUEZfRk9VUlBPUlQpICB7CisJdWRlbGF5KDEwKTsKKwlpZiAodXAtPnBvcnQuZmxhZ3MgJiBVUEZfRk9VUlBPUlQpIHsKIAkJc2VyaWFsX291dHAodXAsIFVBUlRfTUNSLAogCQkJICAgIFVBUlRfTUNSX0RUUiB8IFVBUlRfTUNSX1JUUyk7CiAJfSBlbHNlIHsKQEAgLTExOTksNyArMTE5OSw3IEBACiAJKHZvaWQpc2VyaWFsX2lucCh1cCwgVUFSVF9JSVIpOwogCSh2b2lkKXNlcmlhbF9pbnAodXAsIFVBUlRfTVNSKTsKIAlzZXJpYWxfb3V0cCh1cCwgVUFSVF9UWCwgMHhGRik7Ci0JdWRlbGF5ICgyMCk7CisJdWRlbGF5KDIwKTsKIAlpcnEgPSBwcm9iZV9pcnFfb2ZmKGlycXMpOwogCiAJc2VyaWFsX291dHAodXAsIFVBUlRfTUNSLCBzYXZlX21jcik7CkBAIC0xMzQzLDcgKzEzNDMsNyBAQAogCiAJCXVhcnRfaW5zZXJ0X2NoYXIoJnVwLT5wb3J0LCBsc3IsIFVBUlRfTFNSX09FLCBjaCwgZmxhZyk7CiAKLQlpZ25vcmVfY2hhcjoKK2lnbm9yZV9jaGFyOgogCQlsc3IgPSBzZXJpYWxfaW5wKHVwLCBVQVJUX0xTUik7CiAJfSB3aGlsZSAoKGxzciAmIFVBUlRfTFNSX0RSKSAmJiAobWF4X2NvdW50LS0gPiAwKSk7CiAJc3Bpbl91bmxvY2soJnVwLT5wb3J0LmxvY2spOwpAQCAtMTYzMyw3ICsxNjMzLDggQEAKIAkJc2VyaWFsX291dCh1cCwgVUFSVF9JRVIsIGllcik7CiAKIAkvKiBTdGFuZGFyZCB0aW1lciBpbnRlcnZhbCBwbHVzIDAuMnMgdG8ga2VlcCB0aGUgcG9ydCBydW5uaW5nICovCi0JbW9kX3RpbWVyKCZ1cC0+dGltZXIsIGppZmZpZXMgKyBwb2xsX3RpbWVvdXQodXAtPnBvcnQudGltZW91dCkgKyBIWi81KTsKKwltb2RfdGltZXIoJnVwLT50aW1lciwKKwkJamlmZmllcyArIHBvbGxfdGltZW91dCh1cC0+cG9ydC50aW1lb3V0KSArIEhaIC8gNSk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2VyaWFsODI1MF90eF9lbXB0eShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQpAQCAtMTg0NCw3ICsxODQ1LDcgQEAKIAkJCXVwLT50aW1lci5mdW5jdGlvbiA9IHNlcmlhbDgyNTBfYmFja3VwX3RpbWVvdXQ7CiAJCQl1cC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXVwOwogCQkJbW9kX3RpbWVyKCZ1cC0+dGltZXIsIGppZmZpZXMgKwotCQkJICAgICAgICAgIHBvbGxfdGltZW91dCh1cC0+cG9ydC50aW1lb3V0KSArIEhaLzUpOworCQkJCXBvbGxfdGltZW91dCh1cC0+cG9ydC50aW1lb3V0KSArIEhaIC8gNSk7CiAJCX0KIAl9CiAKQEAgLTIxNzMsNiArMjE3NCw3IEBACiAJfQogCXNlcmlhbDgyNTBfc2V0X21jdHJsKCZ1cC0+cG9ydCwgdXAtPnBvcnQubWN0cmwpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKKwl0dHlfdGVybWlvc19lbmNvZGVfYmF1ZF9yYXRlKHRlcm1pb3MsIGJhdWQsIGJhdWQpOwogfQogCiBzdGF0aWMgdm9pZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MF9lYXJseS5jIGIvZHJpdmVycy9zZXJpYWwvODI1MF9lYXJseS5jCmluZGV4IDFmMTZkZTcuLjM4Nzc2ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzgyNTBfZWFybHkuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwX2Vhcmx5LmMKQEAgLTgyLDcgKzgyLDggQEAKIAlzZXJpYWxfb3V0KHBvcnQsIFVBUlRfVFgsIGMpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZWFybHlfc2VyaWFsODI1MF93cml0ZShzdHJ1Y3QgY29uc29sZSAqY29uc29sZSwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGNvdW50KQorc3RhdGljIHZvaWQgX19pbml0IGVhcmx5X3NlcmlhbDgyNTBfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvbnNvbGUsCisJCQkJCWNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBjb3VudCkKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJmVhcmx5X2RldmljZS5wb3J0OwogCXVuc2lnbmVkIGludCBpZXI7CkBAIC0xMzIsNyArMTMzLDggQEAKIAlzZXJpYWxfb3V0KHBvcnQsIFVBUlRfTENSLCBjICYgflVBUlRfTENSX0RMQUIpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBwYXJzZV9vcHRpb25zKHN0cnVjdCBlYXJseV9zZXJpYWw4MjUwX2RldmljZSAqZGV2aWNlLCBjaGFyICpvcHRpb25zKQorc3RhdGljIGludCBfX2luaXQgcGFyc2Vfb3B0aW9ucyhzdHJ1Y3QgZWFybHlfc2VyaWFsODI1MF9kZXZpY2UgKmRldmljZSwKKwkJCQkJCQkJY2hhciAqb3B0aW9ucykKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJmRldmljZS0+cG9ydDsKIAlpbnQgbW1pbywgbGVuZ3RoOwpAQCAtMTQ1LDggKzE0NywxMCBAQAogCQlwb3J0LT5pb3R5cGUgPSBVUElPX01FTTsKIAkJcG9ydC0+bWFwYmFzZSA9IHNpbXBsZV9zdHJ0b3VsKG9wdGlvbnMgKyA1LCAmb3B0aW9ucywgMCk7CiAjaWZkZWYgQ09ORklHX0ZJWF9FQVJMWUNPTl9NRU0KLQkJc2V0X2ZpeG1hcF9ub2NhY2hlKEZJWF9FQVJMWUNPTl9NRU1fQkFTRSwgcG9ydC0+bWFwYmFzZSAmIFBBR0VfTUFTSyk7Ci0JCXBvcnQtPm1lbWJhc2UgPSAodm9pZCBfX2lvbWVtICopX19maXhfdG9fdmlydChGSVhfRUFSTFlDT05fTUVNX0JBU0UpOworCQlzZXRfZml4bWFwX25vY2FjaGUoRklYX0VBUkxZQ09OX01FTV9CQVNFLAorCQkJCQlwb3J0LT5tYXBiYXNlICYgUEFHRV9NQVNLKTsKKwkJcG9ydC0+bWVtYmFzZSA9CisJCQkodm9pZCBfX2lvbWVtICopX19maXhfdG9fdmlydChGSVhfRUFSTFlDT05fTUVNX0JBU0UpOwogCQlwb3J0LT5tZW1iYXNlICs9IHBvcnQtPm1hcGJhc2UgJiB+UEFHRV9NQVNLOwogI2Vsc2UKIAkJcG9ydC0+bWVtYmFzZSA9IGlvcmVtYXAocG9ydC0+bWFwYmFzZSwgNjQpOwpAQCAtMTY1LDcgKzE2OSw4IEBACiAJfSBlbHNlCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKChvcHRpb25zID0gc3RyY2hyKG9wdGlvbnMsICcsJykpKSB7CisJb3B0aW9ucyA9IHN0cmNocihvcHRpb25zLCAnLCcpOworCWlmIChvcHRpb25zKSB7CiAJCW9wdGlvbnMrKzsKIAkJZGV2aWNlLT5iYXVkID0gc2ltcGxlX3N0cnRvdWwob3B0aW9ucywgTlVMTCwgMCk7CiAJCWxlbmd0aCA9IG1pbihzdHJjc3BuKG9wdGlvbnMsICIgIiksIHNpemVvZihkZXZpY2UtPm9wdGlvbnMpKTsKQEAgLTE3OSw3ICsxODQsNyBAQAogCXByaW50ayhLRVJOX0lORk8gIkVhcmx5IHNlcmlhbCBjb25zb2xlIGF0ICVzIDB4JWxseCAob3B0aW9ucyAnJXMnKVxuIiwKIAkJbW1pbyA/ICJNTUlPIiA6ICJJL08gcG9ydCIsCiAJCW1taW8gPyAodW5zaWduZWQgbG9uZyBsb25nKSBwb3J0LT5tYXBiYXNlCi0JICAgICAgICAgICAgIDogKHVuc2lnbmVkIGxvbmcgbG9uZykgcG9ydC0+aW9iYXNlLAorCQkgICAgIDogKHVuc2lnbmVkIGxvbmcgbG9uZykgcG9ydC0+aW9iYXNlLAogCQlkZXZpY2UtPm9wdGlvbnMpOwogCXJldHVybiAwOwogfQpAQCAtMTk5LDcgKzIwNCw4IEBACiAJaWYgKGRldmljZS0+cG9ydC5tZW1iYXNlIHx8IGRldmljZS0+cG9ydC5pb2Jhc2UpCiAJCXJldHVybiAwOwogCi0JaWYgKChlcnIgPSBwYXJzZV9vcHRpb25zKGRldmljZSwgb3B0aW9ucykpIDwgMCkKKwllcnIgPSBwYXJzZV9vcHRpb25zKGRldmljZSwgb3B0aW9ucyk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKIAlpbml0X3BvcnQoZGV2aWNlKTsKQEAgLTIxOSw3ICsyMjUsOCBAQAogCX0KIAogCW9wdGlvbnMgPSBzdHJjaHIoY21kbGluZSwgJywnKSArIDE7Ci0JaWYgKChlcnIgPSBlYXJseV9zZXJpYWw4MjUwX3NldHVwKG9wdGlvbnMpKSA8IDApCisJZXJyID0gZWFybHlfc2VyaWFsODI1MF9zZXR1cChvcHRpb25zKTsKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAogCXJlZ2lzdGVyX2NvbnNvbGUoJmVhcmx5X3NlcmlhbDgyNTBfY29uc29sZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC84MjUwX2dzYy5jIGIvZHJpdmVycy9zZXJpYWwvODI1MF9nc2MuYwppbmRleCBjNWQwYWRkLi40ZWI3NDM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC84MjUwX2dzYy5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfZ3NjLmMKQEAgLTI1LDggKzI1LDcgQEAKIAogI2luY2x1ZGUgIjgyNTAuaCIKIAotc3RhdGljIGludCBfX2luaXQgCi1zZXJpYWxfaW5pdF9jaGlwKHN0cnVjdCBwYXJpc2NfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9faW5pdCBzZXJpYWxfaW5pdF9jaGlwKHN0cnVjdCBwYXJpc2NfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHVhcnRfcG9ydCBwb3J0OwogCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKQEAgLTM4LDE4ICszNywxNyBAQAogCQkgKiB3aGF0IHdlIGhhdmUgaGVyZSBpcyBhIG1pc3NpbmcgcGFyZW50IGRldmljZSwgc28gdGVsbAogCQkgKiB0aGUgdXNlciB3aGF0IHRoZXkncmUgbWlzc2luZy4KIAkJICovCi0JCWlmIChwYXJpc2NfcGFyZW50KGRldiktPmlkLmh3X3R5cGUgIT0gSFBIV19JT0EpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIlNlcmlhbDogZGV2aWNlIDB4JWx4IG5vdCBjb25maWd1cmVkLlxuIgorCQlpZiAocGFyaXNjX3BhcmVudChkZXYpLT5pZC5od190eXBlICE9IEhQSFdfSU9BKQorCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSJTZXJpYWw6IGRldmljZSAweCVseCBub3QgY29uZmlndXJlZC5cbiIKIAkJCQkiRW5hYmxlIHN1cHBvcnQgZm9yIFdheCwgTGFzaSwgQXNwIG9yIERpbm8uXG4iLAogCQkJCWRldi0+aHBhLnN0YXJ0KTsKLQkJfQogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlhZGRyZXNzID0gZGV2LT5ocGEuc3RhcnQ7Ci0JaWYgKGRldi0+aWQuc3ZlcnNpb24gIT0gMHg4ZCkgeworCWlmIChkZXYtPmlkLnN2ZXJzaW9uICE9IDB4OGQpCiAJCWFkZHJlc3MgKz0gMHg4MDA7Ci0JfQogCiAJbWVtc2V0KCZwb3J0LCAwLCBzaXplb2YocG9ydCkpOwogCXBvcnQuaW90eXBlCT0gVVBJT19NRU07CkBAIC02MywxMSArNjEsMTIgQEAKIAogCWVyciA9IHNlcmlhbDgyNTBfcmVnaXN0ZXJfcG9ydCgmcG9ydCk7CiAJaWYgKGVyciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2VyaWFsODI1MF9yZWdpc3Rlcl9wb3J0IHJldHVybmVkIGVycm9yICVkXG4iLCBlcnIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkic2VyaWFsODI1MF9yZWdpc3Rlcl9wb3J0IHJldHVybmVkIGVycm9yICVkXG4iLCBlcnIpOwogCQlpb3VubWFwKHBvcnQubWVtYmFzZSk7CiAJCXJldHVybiBlcnI7CiAJfQotICAgICAgICAKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC84MjUwX2hwMzAwLmMgYi9kcml2ZXJzL3NlcmlhbC84MjUwX2hwMzAwLmMKaW5kZXggMmNmMDk1My4uMGUxNDEwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvODI1MF9ocDMwMC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfaHAzMDAuYwpAQCAtMzYsNyArMzYsNyBAQAogI2lmZGVmIENPTkZJR19IUERDQQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBocGRjYV9pbml0X29uZShzdHJ1Y3QgZGlvX2RldiAqZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGRpb19kZXZpY2VfaWQgKmVudCk7CisJCQkJCWNvbnN0IHN0cnVjdCBkaW9fZGV2aWNlX2lkICplbnQpOwogc3RhdGljIHZvaWQgX19kZXZleGl0IGhwZGNhX3JlbW92ZV9vbmUoc3RydWN0IGRpb19kZXYgKmQpOwogCiBzdGF0aWMgc3RydWN0IGRpb19kZXZpY2VfaWQgaHBkY2FfZGlvX3RibFtdID0gewpAQCAtODUsNyArODUsNyBAQAogCiAjaWZkZWYgQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEUKIC8qCi0gKiBQYXJzZSB0aGUgYm9vdGluZm8gdG8gZmluZCBkZXNjcmlwdGlvbnMgZm9yIGhlYWRsZXNzIGNvbnNvbGUgYW5kIAorICogUGFyc2UgdGhlIGJvb3RpbmZvIHRvIGZpbmQgZGVzY3JpcHRpb25zIGZvciBoZWFkbGVzcyBjb25zb2xlIGFuZAogICogZGVidWcgc2VyaWFsIHBvcnRzIGFuZCByZWdpc3RlciB0aGVtIHdpdGggdGhlIDgyNTAgZHJpdmVyLgogICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBzZXJpYWxfY29uc29sZV9pbml0KCkgaXMgY2FsbGVkCiAgKiB0byBtYWtlIHN1cmUgdGhlIHNlcmlhbCBjb25zb2xlIHdpbGwgYmUgYXZhaWxhYmxlIGZvciB1c2UuIElBLTY0IGtlcm5lbApAQCAtMTI2LDEzICsxMjYsMTEgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiU2VyaWFsIGNvbnNvbGUgaXMgQVBDSSBidXQgc3VwcG9ydCBpcyBkaXNhYmxlZCAoQ09ORklHX0hQQVBDSSkhXG4iKTsKIAkJcmV0dXJuIDA7CiAjZW5kaWYKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKICNpZmRlZiBDT05GSUdfSFBEQ0EKIAkJdW5zaWduZWQgbG9uZyBwYSA9IGRpb19zY29kZXRvcGh5c2FkZHIoc2NvZGUpOwotCQlpZiAoIXBhKSB7CisJCWlmICghcGEpCiAJCQlyZXR1cm4gMDsKLQkJfQogCiAJCXByaW50ayhLRVJOX0lORk8gIlNlcmlhbCBjb25zb2xlIGlzIEhQIERDQSBhdCBzZWxlY3QgY29kZSAlZFxuIiwgc2NvZGUpOwogCkBAIC0xNDUsMjYgKzE0MywyMyBAQAogCQkvKiBFbmFibGUgYm9hcmQtaW50ZXJydXB0cyAqLwogCQlvdXRfOChwYSArIERJT19WSVJBRERSQkFTRSArIERDQV9JQywgRENBX0lDX0lFKTsKIAotCQlpZiAoRElPX0lEKHBhICsgRElPX1ZJUkFERFJCQVNFKSAmIDB4ODApIHsKKwkJaWYgKERJT19JRChwYSArIERJT19WSVJBRERSQkFTRSkgJiAweDgwKQogCQkJYWRkX3ByZWZlcnJlZF9jb25zb2xlKCJ0dHlTIiwgcG9ydC5saW5lLCAiOTYwMG44Iik7Ci0JCX0KICNlbHNlCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNlcmlhbCBjb25zb2xlIGlzIERDQSBidXQgc3VwcG9ydCBpcyBkaXNhYmxlZCAoQ09ORklHX0hQRENBKSFcbiIpOwogCQlyZXR1cm4gMDsKICNlbmRpZgogCX0KIAotCWlmIChlYXJseV9zZXJpYWxfc2V0dXAoJnBvcnQpIDwgMCkgeworCWlmIChlYXJseV9zZXJpYWxfc2V0dXAoJnBvcnQpIDwgMCkKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiaHAzMDBfc2V0dXBfc2VyaWFsX2NvbnNvbGUoKTogZWFybHlfc2VyaWFsX3NldHVwKCkgZmFpbGVkLlxuIik7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYgLyogQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEUgKi8KIAogI2lmZGVmIENPTkZJR19IUERDQQogc3RhdGljIGludCBfX2RldmluaXQgaHBkY2FfaW5pdF9vbmUoc3RydWN0IGRpb19kZXYgKmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBkaW9fZGV2aWNlX2lkICplbnQpCisJCQkJY29uc3Qgc3RydWN0IGRpb19kZXZpY2VfaWQgKmVudCkKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0IHBvcnQ7CiAJaW50IGxpbmU7CkBAIC0yMTAsNyArMjA1LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgaHAzMDBfODI1MF9pbml0KHZvaWQpCiB7Ci0Jc3RhdGljIGludCBjYWxsZWQgPSAwOworCXN0YXRpYyBpbnQgY2FsbGVkOwogI2lmZGVmIENPTkZJR19IUEFQQ0kKIAlpbnQgbGluZTsKIAl1bnNpZ25lZCBsb25nIGJhc2U7CkBAIC0yMzksMTMgKzIzNCwxMiBAQAogCSAqIFBvcnQgMSBpcyBlaXRoZXIgdGhlIGNvbnNvbGUgb3IgdGhlIERDQS4KIAkgKi8KIAlmb3IgKGkgPSAxOyBpIDwgNDsgaSsrKSB7Ci0JCS8qIFBvcnQgMSBpcyB0aGUgY29uc29sZSBvbiBhIDQyNWUsIG9uIG90aGVyIG1hY2hpbmVzIGl0J3MgbWFwcGVkIHRvCi0JCSAqIERDQS4KKwkJLyogUG9ydCAxIGlzIHRoZSBjb25zb2xlIG9uIGEgNDI1ZSwgb24gb3RoZXIgbWFjaGluZXMgaXQncworCQkgKiBtYXBwZWQgdG8gRENBLgogCQkgKi8KICNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRQotCQlpZiAoaSA9PSAxKSB7CisJCWlmIChpID09IDEpCiAJCQljb250aW51ZTsKLQkJfQogI2VuZGlmCiAKIAkJLyogQ3JlYXRlIG5ldyBzZXJpYWwgZGV2aWNlICovCkBAIC0yNTksNyArMjUzLDggQEAKIAogCQkvKiBNZW1vcnkgbWFwcGVkIEkvTyAqLwogCQl1cG9ydC5pb3R5cGUgPSBVUElPX01FTTsKLQkJdXBvcnQuZmxhZ3MgPSBVUEZfU0tJUF9URVNUIHwgVVBGX1NIQVJFX0lSUSB8IFVQRl9CT09UX0FVVE9DT05GOworCQl1cG9ydC5mbGFncyA9IFVQRl9TS0lQX1RFU1QgfCBVUEZfU0hBUkVfSVJRIFwKKwkJCSAgICAgIHwgVVBGX0JPT1RfQVVUT0NPTkY7CiAJCS8qIFhYWCAtIG5vIGludGVycnVwdCBzdXBwb3J0IHlldCAqLwogCQl1cG9ydC5pcnEgPSAwOwogCQl1cG9ydC51YXJ0Y2xrID0gSFBBUENJX0JBVURfQkFTRSAqIDE2OwpAQCAtMjcwLDggKzI2NSw4IEBACiAJCWxpbmUgPSBzZXJpYWw4MjUwX3JlZ2lzdGVyX3BvcnQoJnVwb3J0KTsKIAogCQlpZiAobGluZSA8IDApIHsKLQkJCXByaW50ayhLRVJOX05PVElDRSAiODI1MF9ocDMwMDogcmVnaXN0ZXJfc2VyaWFsKCkgQVBDSSAlZCIKLQkJCSAgICAgICAiIGlycSAlZCBmYWlsZWRcbiIsIGksIHVwb3J0LmlycSk7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIjgyNTBfaHAzMDA6IHJlZ2lzdGVyX3NlcmlhbCgpIEFQQ0kiCisJCQkgICAgICAgIiAlZCBpcnEgJWQgZmFpbGVkXG4iLCBpLCB1cG9ydC5pcnEpOwogCQkJa2ZyZWUocG9ydCk7CiAJCQljb250aW51ZTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MF9odWI2LmMgYi9kcml2ZXJzL3NlcmlhbC84MjUwX2h1YjYuYwppbmRleCBkYWY1NjljLi43NjA5MTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC84MjUwX2h1YjYuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwX2h1YjYuYwpAQCAtMjMsMTggKzIzLDE4IEBACiAJfQogCiBzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IGh1YjZfZGF0YVtdID0gewotCUhVQjYoMCwwKSwKLQlIVUI2KDAsMSksCi0JSFVCNigwLDIpLAotCUhVQjYoMCwzKSwKLQlIVUI2KDAsNCksCi0JSFVCNigwLDUpLAotCUhVQjYoMSwwKSwKLQlIVUI2KDEsMSksCi0JSFVCNigxLDIpLAotCUhVQjYoMSwzKSwKLQlIVUI2KDEsNCksCi0JSFVCNigxLDUpLAorCUhVQjYoMCwgMCksCisJSFVCNigwLCAxKSwKKwlIVUI2KDAsIDIpLAorCUhVQjYoMCwgMyksCisJSFVCNigwLCA0KSwKKwlIVUI2KDAsIDUpLAorCUhVQjYoMSwgMCksCisJSFVCNigxLCAxKSwKKwlIVUI2KDEsIDIpLAorCUhVQjYoMSwgMyksCisJSFVCNigxLCA0KSwKKwlIVUI2KDEsIDUpLAogCXsgfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsLzgyNTBfcGNpLmMgYi9kcml2ZXJzL3NlcmlhbC84MjUwX3BjaS5jCmluZGV4IDBhNGFjMmIuLmE4YmVjNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzgyNTBfcGNpLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvODI1MF9wY2kuYwpAQCAtMTQwLDcgKzE0MCw3IEBACiAJICAgICAgc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50IGlkeCkKIHsKIAl1bnNpZ25lZCBpbnQgYmFyLCBvZmZzZXQgPSBib2FyZC0+Zmlyc3Rfb2Zmc2V0OwotCQorCiAJYmFyID0gRkxfR0VUX0JBU0UoYm9hcmQtPmZsYWdzKTsKIAlpZiAoaWR4IDwgNCkKIAkJYmFyICs9IGlkeDsKQEAgLTIyNyw4ICsyMjcsOCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIGlzIGZpcm13YXJlIHN0YXJ0ZWQ/ICovCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMHg0NCwgKHZvaWQqKSAmb2xkdmFsKTsgCi0JaWYgKG9sZHZhbCA9PSAweDAwMDAxMDAwTCkgeyAvKiBSRVNFVCB2YWx1ZSAqLyAKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDQ0LCAodm9pZCAqKSZvbGR2YWwpOworCWlmIChvbGR2YWwgPT0gMHgwMDAwMTAwMEwpIHsgLyogUkVTRVQgdmFsdWUgKi8KIAkJcHJpbnRrKEtFUk5fREVCVUcgIkxvY2FsIGk5NjAgZmlybXdhcmUgbWlzc2luZyIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0yNTMsMTEgKzI1MywxMSBAQAogCiAJaXJxX2NvbmZpZyA9IDB4NDE7CiAJaWYgKGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfUEFOQUNPTSB8fAotCSAgICBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1NVQlZFTkRPUl9JRF9FWFNZUykgeworCSAgICBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1NVQlZFTkRPUl9JRF9FWFNZUykKIAkJaXJxX2NvbmZpZyA9IDB4NDM7Ci0JfQorCiAJaWYgKChkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1BMWCkgJiYKLQkgICAgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUExYX1JPTVVMVVMpKSB7CisJICAgIChkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1BMWF9ST01VTFVTKSkKIAkJLyoKIAkJICogQXMgdGhlIG1lZ2F3b2xmIGNhcmRzIGhhdmUgdGhlIGludCBwaW5zIGFjdGl2ZQogCQkgKiBoaWdoLCBhbmQgaGF2ZSAyIFVBUlQgY2hpcHMsIGJvdGggaW50cyBtdXN0IGJlCkBAIC0yNjcsOCArMjY3LDYgQEAKIAkJICogZGVlcCBGSUZPcwogCQkgKi8KIAkJaXJxX2NvbmZpZyA9IDB4NWI7Ci0JfQotCiAJLyoKIAkgKiBlbmFibGUvZGlzYWJsZSBpbnRlcnJ1cHRzCiAJICovCkBAIC0zNDMsMTQgKzM0MSwxNCBAQAogewogCXU4IF9faW9tZW0gKnA7CiAKLQlwID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKSxwY2lfcmVzb3VyY2VfbGVuKGRldiwwKSk7CisJcCA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCksIHBjaV9yZXNvdXJjZV9sZW4oZGV2LCAwKSk7CiAKIAlpZiAocCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAkvKiBTZXQgYml0LTQgQ29udHJvbCBSZWdpc3RlciAoVUFSVCBSRVNFVCkgaW4gdG8gcmVzZXQgdGhlIHVhcnRzICovCi0Jd3JpdGViKDB4MTAscCArIE9DVF9SRUdfQ1JfT0ZGKTsKKwl3cml0ZWIoMHgxMCwgcCArIE9DVF9SRUdfQ1JfT0ZGKTsKIAl1ZGVsYXkoNTApOwotCXdyaXRlYigweDAscCArIE9DVF9SRUdfQ1JfT0ZGKTsKKwl3cml0ZWIoMHgwLCBwICsgT0NUX1JFR19DUl9PRkYpOwogCiAJLyogU2V0IGJpdC0yIChJTlRFTkFCTEUpIG9mIENvbnRyb2wgUmVnaXN0ZXIgKi8KIAl3cml0ZWIoMHg0LCBwICsgT0NUX1JFR19DUl9PRkYpOwpAQCAtMzY3LDEwICszNjUsMTAgQEAKIHsKIAl1OCBfX2lvbWVtICpwOwogCi0JcCA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCkscGNpX3Jlc291cmNlX2xlbihkZXYsMCkpOwotCWlmIChwICE9IE5VTEwpIHsKKwlwID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKSwgcGNpX3Jlc291cmNlX2xlbihkZXYsIDApKTsKKwkvKiBGSVhNRTogV2hhdCBpZiByZXNvdXJjZV9sZW4gPCBPQ1RfUkVHX0NSX09GRiAqLworCWlmIChwICE9IE5VTEwpCiAJCXdyaXRlYigwLCBwICsgT0NUX1JFR19DUl9PRkYpOwotCX0KIAlpb3VubWFwKHApOwogfQogCkBAIC0zODYsNyArMzg0LDcgQEAKICAqIHdpdGggb3RoZXIgT1NlcyAobGlrZSBNJCBET1MpLgogICoKICAqICBTSUlHIHN1cHBvcnQgYWRkZWQgYnkgQW5kcmV5IFBhbmluIDxwYXprZUBkb25wYWMucnU+LCAxMC8xOTk5Ci0gKiAKKyAqCiAgKiBUaGVyZSBpcyB0d28gZmFtaWx5IG9mIFNJSUcgc2VyaWFsIGNhcmRzIHdpdGggZGlmZmVyZW50IFBDSQogICogaW50ZXJmYWNlIGNoaXAgYW5kIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIG1ldGhvZHM6CiAgKiAgICAgLSAxMHggY2FyZHMgaGF2ZSBjb250cm9sIHJlZ2lzdGVycyBpbiBJTyBhbmQvb3IgbWVtb3J5IHNwYWNlOwpAQCAtNDg5LDIxICs0ODcsMjEgQEAKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHRpbWVkaWFfZHVhbF9wb3J0W10gPSB7CiAJMHgwMDAyLCAweDQwMzYsIDB4NDAzNywgMHg0MDM4LCAweDQwNzgsIDB4NDA3OSwgMHg0MDg1LAotCTB4NDA4OCwgMHg0MDg5LCAweDUwMzcsIDB4NTA3OCwgMHg1MDc5LCAweDUwODUsIDB4NjA3OSwgCi0JMHg3MDc5LCAweDgwNzksIDB4ODEzNywgMHg4MTM4LCAweDgyMzcsIDB4ODIzOCwgMHg5MDc5LCAKKwkweDQwODgsIDB4NDA4OSwgMHg1MDM3LCAweDUwNzgsIDB4NTA3OSwgMHg1MDg1LCAweDYwNzksCisJMHg3MDc5LCAweDgwNzksIDB4ODEzNywgMHg4MTM4LCAweDgyMzcsIDB4ODIzOCwgMHg5MDc5LAogCTB4OTEzNywgMHg5MTM4LCAweDkyMzcsIDB4OTIzOCwgMHhBMDc5LCAweEIwNzksIDB4QzA3OSwKIAkweEQwNzksIDAKIH07CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCB0aW1lZGlhX3F1YWRfcG9ydFtdID0gewotCTB4NDA1NSwgMHg0MDU2LCAweDQwOTUsIDB4NDA5NiwgMHg1MDU2LCAweDgxNTYsIDB4ODE1NywgCi0JMHg4MjU2LCAweDgyNTcsIDB4OTA1NiwgMHg5MTU2LCAweDkxNTcsIDB4OTE1OCwgMHg5MTU5LCAKKwkweDQwNTUsIDB4NDA1NiwgMHg0MDk1LCAweDQwOTYsIDB4NTA1NiwgMHg4MTU2LCAweDgxNTcsCisJMHg4MjU2LCAweDgyNTcsIDB4OTA1NiwgMHg5MTU2LCAweDkxNTcsIDB4OTE1OCwgMHg5MTU5LAogCTB4OTI1NiwgMHg5MjU3LCAweEEwNTYsIDB4QTE1NywgMHhBMTU4LCAweEExNTksIDB4QjA1NiwKIAkweEIxNTcsIDAKIH07CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCB0aW1lZGlhX2VpZ2h0X3BvcnRbXSA9IHsKLQkweDQwNjUsIDB4NDA2NiwgMHg1MDY1LCAweDUwNjYsIDB4ODE2NiwgMHg5MDY2LCAweDkxNjYsIAorCTB4NDA2NSwgMHg0MDY2LCAweDUwNjUsIDB4NTA2NiwgMHg4MTY2LCAweDkwNjYsIDB4OTE2NiwKIAkweDkxNjcsIDB4OTE2OCwgMHhBMDY2LCAweEExNjcsIDB4QTE2OCwgMAogfTsKIApAQCAtNjU2LDcgKzY1NCw4IEBACiAJCQkJSVRFXzg4N3hfUE9TSU9fRU5BQkxFIHwgSVRFXzg4N3hfUE9TSU9fU1BFRUQgfAogCQkJCUlURV84ODd4X1BPU0lPX0lPU0laRV8zMiB8IGludGFfYWRkcltpXSk7CiAJCQkvKiB3cml0ZSBJTlRDQkFSIC0gaW9wb3J0ICovCi0JCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgSVRFXzg4N3hfSU5UQ0JBUiwgaW50YV9hZGRyW2ldKTsKKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBJVEVfODg3eF9JTlRDQkFSLAorCQkJCQkJCQlpbnRhX2FkZHJbaV0pOwogCQkJcmV0ID0gaW5iKGludGFfYWRkcltpXSk7CiAJCQlpZiAocmV0ICE9IDB4ZmYpIHsKIAkJCQkvKiBpb3BvcnQgY29ubmVjdGVkICovCkBAIC03NTUsNyArNzU0LDcgQEAKIAogCWlmIChib2FyZC0+ZmxhZ3MgJiBGTF9SRUdJT05fU1pfQ0FQICYmIGlkeCA+PSBtYXhucikKIAkJcmV0dXJuIDE7Ci0JCQkKKwogCXJldHVybiBzZXR1cF9wb3J0KHByaXYsIHBvcnQsIGJhciwgb2Zmc2V0LCBib2FyZC0+cmVnX3NoaWZ0KTsKIH0KIApAQCAtODQzLDcgKzg0Miw3IEBACiAJCS5pbml0CQk9IHBjaV9wbHg5MDUwX2luaXQsCiAJCS5zZXR1cAkJPSBwY2lfZGVmYXVsdF9zZXR1cCwKIAkJLmV4aXQJCT0gX19kZXZleGl0X3AocGNpX3BseDkwNTBfZXhpdCksCi0JfSwJCQorCX0sCiAJewogCQkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfUEFOQUNPTSwKIAkJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX1BBTkFDT01fRFVBTE1PREVNLApAQCAtMTAzMiw3ICsxMDMxLDcgQEAKIAkJICAgIHF1aXJrX2lkX21hdGNoZXMocXVpcmstPmRldmljZSwgZGV2LT5kZXZpY2UpICYmCiAJCSAgICBxdWlya19pZF9tYXRjaGVzKHF1aXJrLT5zdWJ2ZW5kb3IsIGRldi0+c3Vic3lzdGVtX3ZlbmRvcikgJiYKIAkJICAgIHF1aXJrX2lkX21hdGNoZXMocXVpcmstPnN1YmRldmljZSwgZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKSkKLQkJIAlicmVhazsKKwkJCWJyZWFrOwogCXJldHVybiBxdWlyazsKIH0KIApAQCAtMTcxMSw3ICsxNzEwLDcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzb2Z0bW9kZW1fYmxhY2tsaXN0W10gPSB7Ci0JeyBQQ0lfVkRFVklDRSAoIEFMLCAweDU0NTcgKSwgfSwgLyogQUxpIENvcnBvcmF0aW9uIE01NDU3IEFDJzk3IE1vZGVtICovCisJeyBQQ0lfVkRFVklDRShBTCwgMHg1NDU3KSwgfSwgLyogQUxpIENvcnBvcmF0aW9uIE01NDU3IEFDJzk3IE1vZGVtICovCiB9OwogCiAvKgpAQCAtMTcyNCwxMyArMTcyMywxMyBAQAogewogCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpibGFja2xpc3Q7CiAJaW50IG51bV9pb21lbSwgbnVtX3BvcnQsIGZpcnN0X3BvcnQgPSAtMSwgaTsKLQkKKwogCS8qCiAJICogSWYgaXQgaXMgbm90IGEgY29tbXVuaWNhdGlvbnMgZGV2aWNlIG9yIHRoZSBwcm9ncmFtbWluZwogCSAqIGludGVyZmFjZSBpcyBncmVhdGVyIHRoYW4gNiwgZ2l2ZSB1cC4KIAkgKgogCSAqIChTaG91bGQgd2UgdHJ5IHRvIG1ha2UgZ3Vlc3NlcyBmb3IgbXVsdGlwb3J0IHNlcmlhbCBkZXZpY2VzCi0JICogbGF0ZXI/KSAKKwkgKiBsYXRlcj8pCiAJICovCiAJaWYgKCgoKGRldi0+Y2xhc3MgPj4gOCkgIT0gUENJX0NMQVNTX0NPTU1VTklDQVRJT05fU0VSSUFMKSAmJgogCSAgICAgKChkZXYtPmNsYXNzID4+IDgpICE9IFBDSV9DTEFTU19DT01NVU5JQ0FUSU9OX01PREVNKSkgfHwKQEAgLTE4NjMsMjUgKzE4NjIsMjMgQEAKIAkJCWJyZWFrOwogCiAjaWZkZWYgU0VSSUFMX0RFQlVHX1BDSQotCQlwcmludGsoIlNldHVwIFBDSSBwb3J0OiBwb3J0ICV4LCBpcnEgJWQsIHR5cGUgJWRcbiIsCisJCXByaW50ayhLRVJOX0RFQlVHICJTZXR1cCBQQ0kgcG9ydDogcG9ydCAleCwgaXJxICVkLCB0eXBlICVkXG4iLAogCQkgICAgICAgc2VyaWFsX3BvcnQuaW9iYXNlLCBzZXJpYWxfcG9ydC5pcnEsIHNlcmlhbF9wb3J0LmlvdHlwZSk7CiAjZW5kaWYKLQkJCisKIAkJcHJpdi0+bGluZVtpXSA9IHNlcmlhbDgyNTBfcmVnaXN0ZXJfcG9ydCgmc2VyaWFsX3BvcnQpOwogCQlpZiAocHJpdi0+bGluZVtpXSA8IDApIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNvdWxkbid0IHJlZ2lzdGVyIHNlcmlhbCBwb3J0ICVzOiAlZFxuIiwgcGNpX25hbWUoZGV2KSwgcHJpdi0+bGluZVtpXSk7CiAJCQlicmVhazsKIAkJfQogCX0KLQogCXByaXYtPm5yID0gaTsKLQogCXJldHVybiBwcml2OwogCi0gZXJyX2RlaW5pdDoKK2Vycl9kZWluaXQ6CiAJaWYgKHF1aXJrLT5leGl0KQogCQlxdWlyay0+ZXhpdChkZXYpOwotIGVycl9vdXQ6CitlcnJfb3V0OgogCXJldHVybiBwcml2OwogfQogRVhQT1JUX1NZTUJPTF9HUEwocGNpc2VyaWFsX2luaXRfcG9ydHMpOwpAQCAtMjE3MSwyMiArMjE2OCwyMiBAQAogCQlwYm5fYjBfOF8xODQzMjAwXzIwMCB9LAogCiAJewlQQ0lfVkVORE9SX0lEX1NFQUxFVkVMLCBQQ0lfREVWSUNFX0lEX1NFQUxFVkVMX1U1MzAsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAogCQlwYm5fYjJfYnRfMV8xMTUyMDAgfSwKIAl7CVBDSV9WRU5ET1JfSURfU0VBTEVWRUwsIFBDSV9ERVZJQ0VfSURfU0VBTEVWRUxfVUNPTU0yLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKIAkJcGJuX2IyX2J0XzJfMTE1MjAwIH0sCiAJewlQQ0lfVkVORE9SX0lEX1NFQUxFVkVMLCBQQ0lfREVWSUNFX0lEX1NFQUxFVkVMX1VDT01NNDIyLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKIAkJcGJuX2IyX2J0XzRfMTE1MjAwIH0sCiAJewlQQ0lfVkVORE9SX0lEX1NFQUxFVkVMLCBQQ0lfREVWSUNFX0lEX1NFQUxFVkVMX1VDT01NMjMyLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKIAkJcGJuX2IyX2J0XzJfMTE1MjAwIH0sCiAJewlQQ0lfVkVORE9SX0lEX1NFQUxFVkVMLCBQQ0lfREVWSUNFX0lEX1NFQUxFVkVMX0NPTU00LAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKIAkJcGJuX2IyX2J0XzRfMTE1MjAwIH0sCiAJewlQQ0lfVkVORE9SX0lEX1NFQUxFVkVMLCBQQ0lfREVWSUNFX0lEX1NFQUxFVkVMX0NPTU04LAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKIAkJcGJuX2IyXzhfMTE1MjAwIH0sCiAJewlQQ0lfVkVORE9SX0lEX1NFQUxFVkVMLCBQQ0lfREVWSUNFX0lEX1NFQUxFVkVMX1VDT01NOCwKIAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKQEAgLTIyMDEsMTEgKzIxOTgsMTEgQEAKIAkvKgogCSAqIFZTY29tIFNQQ09NODAwLCBmcm9tIHNsQHMucGwKIAkgKi8KLQl7CVBDSV9WRU5ET1JfSURfUExYLCBQQ0lfREVWSUNFX0lEX1BMWF9TUENPTTgwMCwgCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIAorCXsJUENJX1ZFTkRPUl9JRF9QTFgsIFBDSV9ERVZJQ0VfSURfUExYX1NQQ09NODAwLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAogCQlwYm5fYjJfOF85MjE2MDAgfSwKIAl7CVBDSV9WRU5ET1JfSURfUExYLCBQQ0lfREVWSUNFX0lEX1BMWF8xMDc3LAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKIAkJcGJuX2IyXzRfOTIxNjAwIH0sCiAJewlQQ0lfVkVORE9SX0lEX1BMWCwgUENJX0RFVklDRV9JRF9QTFhfOTA1MCwKIAkJUENJX1NVQlZFTkRPUl9JRF9LRVlTUEFOLApAQCAtMjIyMywyNyArMjIyMCwyNyBAQAogCQlwYm5fYjJfNF8xMTUyMDAgfSwKIAl7CVBDSV9WRU5ET1JfSURfUExYLCBQQ0lfREVWSUNFX0lEX1BMWF85MDUwLAogCQlQQ0lfU1VCVkVORE9SX0lEX0NIQVNFX1BDSUZBU1QsCi0JCVBDSV9TVUJERVZJQ0VfSURfQ0hBU0VfUENJRkFTVDQsIDAsIDAsIAorCQlQQ0lfU1VCREVWSUNFX0lEX0NIQVNFX1BDSUZBU1Q0LCAwLCAwLAogCQlwYm5fYjJfNF80NjA4MDAgfSwKIAl7CVBDSV9WRU5ET1JfSURfUExYLCBQQ0lfREVWSUNFX0lEX1BMWF85MDUwLAogCQlQQ0lfU1VCVkVORE9SX0lEX0NIQVNFX1BDSUZBU1QsCi0JCVBDSV9TVUJERVZJQ0VfSURfQ0hBU0VfUENJRkFTVDgsIDAsIDAsIAorCQlQQ0lfU1VCREVWSUNFX0lEX0NIQVNFX1BDSUZBU1Q4LCAwLCAwLAogCQlwYm5fYjJfOF80NjA4MDAgfSwKIAl7CVBDSV9WRU5ET1JfSURfUExYLCBQQ0lfREVWSUNFX0lEX1BMWF85MDUwLAogCQlQQ0lfU1VCVkVORE9SX0lEX0NIQVNFX1BDSUZBU1QsCi0JCVBDSV9TVUJERVZJQ0VfSURfQ0hBU0VfUENJRkFTVDE2LCAwLCAwLCAKKwkJUENJX1NVQkRFVklDRV9JRF9DSEFTRV9QQ0lGQVNUMTYsIDAsIDAsCiAJCXBibl9iMl8xNl80NjA4MDAgfSwKIAl7CVBDSV9WRU5ET1JfSURfUExYLCBQQ0lfREVWSUNFX0lEX1BMWF85MDUwLAogCQlQQ0lfU1VCVkVORE9SX0lEX0NIQVNFX1BDSUZBU1QsCi0JCVBDSV9TVUJERVZJQ0VfSURfQ0hBU0VfUENJRkFTVDE2Rk1DLCAwLCAwLCAKKwkJUENJX1NVQkRFVklDRV9JRF9DSEFTRV9QQ0lGQVNUMTZGTUMsIDAsIDAsCiAJCXBibl9iMl8xNl80NjA4MDAgfSwKIAl7CVBDSV9WRU5ET1JfSURfUExYLCBQQ0lfREVWSUNFX0lEX1BMWF85MDUwLAogCQlQQ0lfU1VCVkVORE9SX0lEX0NIQVNFX1BDSVJBUywKLQkJUENJX1NVQkRFVklDRV9JRF9DSEFTRV9QQ0lSQVM0LCAwLCAwLCAKKwkJUENJX1NVQkRFVklDRV9JRF9DSEFTRV9QQ0lSQVM0LCAwLCAwLAogCQlwYm5fYjJfNF80NjA4MDAgfSwKIAl7CVBDSV9WRU5ET1JfSURfUExYLCBQQ0lfREVWSUNFX0lEX1BMWF85MDUwLAogCQlQQ0lfU1VCVkVORE9SX0lEX0NIQVNFX1BDSVJBUywKLQkJUENJX1NVQkRFVklDRV9JRF9DSEFTRV9QQ0lSQVM4LCAwLCAwLCAKKwkJUENJX1NVQkRFVklDRV9JRF9DSEFTRV9QQ0lSQVM4LCAwLCAwLAogCQlwYm5fYjJfOF80NjA4MDAgfSwKIAl7CVBDSV9WRU5ET1JfSURfUExYLCBQQ0lfREVWSUNFX0lEX1BMWF85MDUwLAogCQlQQ0lfU1VCVkVORE9SX0lEX0VYU1lTLApAQCAtMjI2OSwxMCArMjI2NiwxMiBAQAogCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAogCQlwYm5fYjFfOF8xMTUyMDAgfSwKIAl7CVBDSV9WRU5ET1JfSURfU1BFQ0lBTElYLCBQQ0lfREVWSUNFX0lEX09YU0VNSV8xNlBDSTk1NCwKLQkJUENJX1ZFTkRPUl9JRF9TUEVDSUFMSVgsIFBDSV9TVUJERVZJQ0VfSURfU1BFQ0lBTElYX1NQRUVENCwgMCwgMCwKKwkJUENJX1ZFTkRPUl9JRF9TUEVDSUFMSVgsIFBDSV9TVUJERVZJQ0VfSURfU1BFQ0lBTElYX1NQRUVENCwKKwkJMCwgMCwKIAkJcGJuX2IwXzRfOTIxNjAwIH0sCiAJewlQQ0lfVkVORE9SX0lEX09YU0VNSSwgUENJX0RFVklDRV9JRF9PWFNFTUlfMTZQQ0k5NTQsCi0JCVBDSV9TVUJWRU5ET1JfSURfU0lJRywgUENJX1NVQkRFVklDRV9JRF9TSUlHX1FVQVJURVRfU0VSSUFMLCAwLCAwLAorCQlQQ0lfU1VCVkVORE9SX0lEX1NJSUcsIFBDSV9TVUJERVZJQ0VfSURfU0lJR19RVUFSVEVUX1NFUklBTCwKKwkJMCwgMCwKIAkJcGJuX2IwXzRfMTE1MjAwMCB9LAogCiAJCS8qCkBAIC0yMzEyLDcgKzIzMTEsNyBAQAogCSAqIERpZ2l0YW4gRFM1NjAtNTU4LCBmcm9tIGppbWRAZXNvZnQuY29tCiAJICovCiAJewlQQ0lfVkVORE9SX0lEX0FUVCwgUENJX0RFVklDRV9JRF9BVFRfVkVOVVNfTU9ERU0sCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAogCQlwYm5fYjFfMV8xMTUyMDAgfSwKIAogCS8qCkBAIC0yMzIwLDE2ICsyMzE5LDE2IEBACiAJICogIFRoZSA0MDBMIGFuZCA4MDBMIGhhdmUgYSBjdXN0b20gc2V0dXAgcXVpcmsuCiAJICovCiAJewlQQ0lfVkVORE9SX0lEX1RJVEFOLCBQQ0lfREVWSUNFX0lEX1RJVEFOXzEwMCwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCiAJCXBibl9iMF8xXzkyMTYwMCB9LAogCXsJUENJX1ZFTkRPUl9JRF9USVRBTiwgUENJX0RFVklDRV9JRF9USVRBTl8yMDAsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAogCQlwYm5fYjBfMl85MjE2MDAgfSwKIAl7CVBDSV9WRU5ET1JfSURfVElUQU4sIFBDSV9ERVZJQ0VfSURfVElUQU5fNDAwLAotCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKIAkJcGJuX2IwXzRfOTIxNjAwIH0sCiAJewlQQ0lfVkVORE9SX0lEX1RJVEFOLCBQQ0lfREVWSUNFX0lEX1RJVEFOXzgwMEIsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAogCQlwYm5fYjBfNF85MjE2MDAgfSwKIAl7CVBDSV9WRU5ET1JfSURfVElUQU4sIFBDSV9ERVZJQ0VfSURfVElUQU5fMTAwTCwKIAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL0tjb25maWcgYi9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCmluZGV4IDZhNDRmYjEuLmI4MjU5NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKKysrIGIvZHJpdmVycy9zZXJpYWwvS2NvbmZpZwpAQCAtMzgwLDYgKzM4MCwyMSBAQAogCSAgY29uc29sZSBpcyB0aGUgZGV2aWNlIHdoaWNoIHJlY2VpdmVzIGFsbCBrZXJuZWwgbWVzc2FnZXMgYW5kCiAJICB3YXJuaW5ncyBhbmQgd2hpY2ggYWxsb3dzIGxvZ2lucyBpbiBzaW5nbGUgdXNlciBtb2RlKS4KIAorY29uZmlnIFNFUklBTF9BVE1FTF9QREMKKwlib29sICJTdXBwb3J0IERNQSB0cmFuc2ZlcnMgb24gQVQ5MSAvIEFUMzIgc2VyaWFsIHBvcnQiCisJZGVwZW5kcyBvbiBTRVJJQUxfQVRNRUwKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3aXNoIHRvIHVzZSB0aGUgUERDIHRvIGRvIERNQSB0cmFuc2ZlcnMgdG8KKwkgIGFuZCBmcm9tIHRoZSBBdG1lbCBBVDkxIC8gQVQzMiBzZXJpYWwgcG9ydC4gSW4gb3JkZXIgdG8KKwkgIGFjdHVhbGx5IHVzZSBETUEgdHJhbnNmZXJzLCBtYWtlIHN1cmUgdGhhdCB0aGUgdXNlX2RtYV90eAorCSAgYW5kIHVzZV9kbWFfcnggbWVtYmVycyBpbiB0aGUgYXRtZWxfdWFydF9kYXRhIHN0cnVjdCBpcyBzZXQKKwkgIGFwcHJvcHJpYXRlbHkgZm9yIGVhY2ggcG9ydC4KKworCSAgTm90ZSB0aGF0IGJyZWFrIGFuZCBlcnJvciBoYW5kbGluZyBjdXJyZW50bHkgZG9lc24ndCB3b3JrCisJICBwcm9wZXJseSB3aGVuIERNQSBpcyBlbmFibGVkLiBNYWtlIHN1cmUgdGhhdCBwb3J0cyB3aGVyZQorCSAgdGhpcyBtYXR0ZXJzIGRvbid0IHVzZSBETUEuCisKIGNvbmZpZyBTRVJJQUxfQVRNRUxfVFRZQVQKIAlib29sICJJbnN0YWxsIGFzIGRldmljZSB0dHlBVG4gaW5zdGVhZCBvZiB0dHlTbiIKIAlkZXBlbmRzIG9uIFNFUklBTF9BVE1FTD15CkBAIC00NjUsMjAgKzQ4MCwyNCBAQAogCWJvb2wgIkRFQ3N0YXRpb24gRFogc2VyaWFsIGRyaXZlciIKIAlkZXBlbmRzIG9uIE1BQ0hfREVDU1RBVElPTiAmJiAzMkJJVAogCXNlbGVjdCBTRVJJQUxfQ09SRQotCWhlbHAKLQkgIERaMTEtZmFtaWx5IHNlcmlhbCBjb250cm9sbGVycyBmb3IgVkFYc3RhdGlvbnMsIGluY2x1ZGluZyB0aGUKLQkgIERDNzA4NSwgTTc4MTQsIGFuZCBNNzgxOS4KKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBEWjExLWZhbWlseSBzZXJpYWwgY29udHJvbGxlcnMgZm9yIERFQ3N0YXRpb25zIGFuZCBWQVhzdGF0aW9ucywKKwkgIGluY2x1ZGluZyB0aGUgREM3MDg1LCBNNzgxNCwgYW5kIE03ODE5LgogCiBjb25maWcgU0VSSUFMX0RaX0NPTlNPTEUKIAlib29sICJTdXBwb3J0IGNvbnNvbGUgb24gREVDc3RhdGlvbiBEWiBzZXJpYWwgZHJpdmVyIgogCWRlcGVuZHMgb24gU0VSSUFMX0RaPXkKIAlzZWxlY3QgU0VSSUFMX0NPUkVfQ09OU09MRQotCWhlbHAKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSwgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byB1c2UgYSBzZXJpYWwgcG9ydCBhcyB0aGUKIAkgIHN5c3RlbSBjb25zb2xlICh0aGUgc3lzdGVtIGNvbnNvbGUgaXMgdGhlIGRldmljZSB3aGljaCByZWNlaXZlcyBhbGwKIAkgIGtlcm5lbCBtZXNzYWdlcyBhbmQgd2FybmluZ3MgYW5kIHdoaWNoIGFsbG93cyBsb2dpbnMgaW4gc2luZ2xlIHVzZXIKLQkgIG1vZGUpLiAgTm90ZSB0aGF0IHRoZSBmaXJtd2FyZSB1c2VzIHR0eVMwIGFzIHRoZSBzZXJpYWwgY29uc29sZSBvbgotCSAgdGhlIE1heGluZSBhbmQgdHR5UzIgb24gdGhlIG90aGVycy4KKwkgIG1vZGUpLgorCisJICBOb3RlIHRoYXQgdGhlIGZpcm13YXJlIHVzZXMgdHR5UzMgYXMgdGhlIHNlcmlhbCBjb25zb2xlIG9uCisJICBERUNzdGF0aW9ucyB0aGF0IHVzZSB0aGlzIGRyaXZlci4KIAogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIApAQCAtMTEzOCwxNyArMTE1NywxNyBAQAogCQlzYXkgWS4gIE90aGVyd2lzZSwgc2F5IE4uCiAKIGNvbmZpZyBTRVJJQUxfTVBDNTJ4eAotCXRyaXN0YXRlICJGcmVlc2NhbGUgTVBDNTJ4eCBmYW1pbHkgUFNDIHNlcmlhbCBzdXBwb3J0IgotCWRlcGVuZHMgb24gUFBDX01QQzUyeHgKKwl0cmlzdGF0ZSAiRnJlZXNjYWxlIE1QQzUyeHgvTVBDNTEyeCBmYW1pbHkgUFNDIHNlcmlhbCBzdXBwb3J0IgorCWRlcGVuZHMgb24gUFBDX01QQzUyeHggfHwgUFBDX01QQzUxMngKIAlzZWxlY3QgU0VSSUFMX0NPUkUKIAloZWxwCi0JICBUaGlzIGRyaXZlcnMgc3VwcG9ydCB0aGUgTVBDNTJ4eCBQU0Mgc2VyaWFsIHBvcnRzLiBJZiB5b3Ugd291bGQKLQkgIGxpa2UgdG8gdXNlIHRoZW0sIHlvdSBtdXN0IGFuc3dlciBZIG9yIE0gdG8gdGhpcyBvcHRpb24uIE5vdCB0aGF0CisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBNUEM1Mnh4IGFuZCBNUEM1MTJ4IFBTQyBzZXJpYWwgcG9ydHMuIElmIHlvdSB3b3VsZAorCSAgbGlrZSB0byB1c2UgdGhlbSwgeW91IG11c3QgYW5zd2VyIFkgb3IgTSB0byB0aGlzIG9wdGlvbi4gTm90ZSB0aGF0CiAJICBmb3IgdXNlIGFzIGNvbnNvbGUsIGl0IG11c3QgYmUgaW5jbHVkZWQgaW4ga2VybmVsIGFuZCBub3QgYXMgYQogCSAgbW9kdWxlLgogCiBjb25maWcgU0VSSUFMX01QQzUyeHhfQ09OU09MRQotCWJvb2wgIkNvbnNvbGUgb24gYSBGcmVlc2NhbGUgTVBDNTJ4eCBmYW1pbHkgUFNDIHNlcmlhbCBwb3J0IgorCWJvb2wgIkNvbnNvbGUgb24gYSBGcmVlc2NhbGUgTVBDNTJ4eC9NUEM1MTJ4IGZhbWlseSBQU0Mgc2VyaWFsIHBvcnQiCiAJZGVwZW5kcyBvbiBTRVJJQUxfTVBDNTJ4eD15CiAJc2VsZWN0IFNFUklBTF9DT1JFX0NPTlNPTEUKIAloZWxwCkBAIC0xMTU2LDcgKzExNzUsNyBAQAogCSAgb2YgdGhlIEZyZWVzY2FsZSBNUEM1Mnh4IGZhbWlseSBhcyBhIGNvbnNvbGUuCiAKIGNvbmZpZyBTRVJJQUxfTVBDNTJ4eF9DT05TT0xFX0JBVUQKLQlpbnQgIkZyZWVzY2FsZSBNUEM1Mnh4IGZhbWlseSBQU0Mgc2VyaWFsIHBvcnQgYmF1ZCIKKwlpbnQgIkZyZWVzY2FsZSBNUEM1Mnh4L01QQzUxMnggZmFtaWx5IFBTQyBzZXJpYWwgcG9ydCBiYXVkIgogCWRlcGVuZHMgb24gU0VSSUFMX01QQzUyeHhfQ09OU09MRT15CiAJZGVmYXVsdCAiOTYwMCIKIAloZWxwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9hdG1lbF9zZXJpYWwuYyBiL2RyaXZlcnMvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCmluZGV4IDYwZjUyOTAuLmZhZDI0NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCkBAIC03LDYgKzcsOCBAQAogICogIEJhc2VkIG9uIGRyaXZlcnMvY2hhci9zZXJpYWxfc2ExMTAwLmMsIGJ5IERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkLgogICogIEJhc2VkIG9uIGRyaXZlcnMvY2hhci9zZXJpYWwuYywgYnkgTGludXMgVG9ydmFsZHMsIFRoZW9kb3JlIFRzJ28uCiAgKgorICogIERNQSBzdXBwb3J0IGFkZGVkIGJ5IENoaXAgQ29sZHdlbGwuCisgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgpAQCAtMzMsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c3JxLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2F0bWVsX3BkYy5oPgogI2luY2x1ZGUgPGxpbnV4L2F0bWVsX3NlcmlhbC5oPgogCkBAIC00Niw2ICs0OSwxMCBAQAogI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KICNlbmRpZgogCisjZGVmaW5lIFBEQ19CVUZGRVJfU0laRQkJNTEyCisvKiBSZXZpc2l0OiBXZSBzaG91bGQgY2FsY3VsYXRlIHRoaXMgYmFzZWQgb24gdGhlIGFjdHVhbCBwb3J0IHNldHRpbmdzICovCisjZGVmaW5lIFBEQ19SWF9USU1FT1VUCQkoMyAqIDEwKQkJLyogMyBieXRlcyAqLworCiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0FUTUVMX0NPTlNPTEUpICYmIGRlZmluZWQoQ09ORklHX01BR0lDX1NZU1JRKQogI2RlZmluZSBTVVBQT1JUX1NZU1JRCiAjZW5kaWYKQEAgLTczLDYgKzgwLDcgQEAKIAogI2RlZmluZSBBVE1FTF9JU1JfUEFTU19MSU1JVAkyNTYKIAorLyogVUFSVCByZWdpc3RlcnMuIENSIGlzIHdyaXRlLW9ubHksIGhlbmNlIG5vIEdFVCBtYWNybyAqLwogI2RlZmluZSBVQVJUX1BVVF9DUihwb3J0LHYpCV9fcmF3X3dyaXRlbCh2LCAocG9ydCktPm1lbWJhc2UgKyBBVE1FTF9VU19DUikKICNkZWZpbmUgVUFSVF9HRVRfTVIocG9ydCkJX19yYXdfcmVhZGwoKHBvcnQpLT5tZW1iYXNlICsgQVRNRUxfVVNfTVIpCiAjZGVmaW5lIFVBUlRfUFVUX01SKHBvcnQsdikJX19yYXdfd3JpdGVsKHYsIChwb3J0KS0+bWVtYmFzZSArIEFUTUVMX1VTX01SKQpAQCAtODYsOCArOTQsNiBAQAogI2RlZmluZSBVQVJUX1BVVF9CUkdSKHBvcnQsdikJX19yYXdfd3JpdGVsKHYsIChwb3J0KS0+bWVtYmFzZSArIEFUTUVMX1VTX0JSR1IpCiAjZGVmaW5lIFVBUlRfUFVUX1JUT1IocG9ydCx2KQlfX3Jhd193cml0ZWwodiwgKHBvcnQpLT5tZW1iYXNlICsgQVRNRUxfVVNfUlRPUikKIAotLy8gI2RlZmluZSBVQVJUX0dFVF9DUihwb3J0KQlfX3Jhd19yZWFkbCgocG9ydCktPm1lbWJhc2UgKyBBVE1FTF9VU19DUikJCS8vIGlzIHdyaXRlLW9ubHkKLQogIC8qIFBEQyByZWdpc3RlcnMgKi8KICNkZWZpbmUgVUFSVF9QVVRfUFRDUihwb3J0LHYpCV9fcmF3X3dyaXRlbCh2LCAocG9ydCktPm1lbWJhc2UgKyBBVE1FTF9QRENfUFRDUikKICNkZWZpbmUgVUFSVF9HRVRfUFRTUihwb3J0KQlfX3Jhd19yZWFkbCgocG9ydCktPm1lbWJhc2UgKyBBVE1FTF9QRENfUFRTUikKQEAgLTEwMCwxMiArMTA2LDI0IEBACiAKICNkZWZpbmUgVUFSVF9QVVRfVFBSKHBvcnQsdikJX19yYXdfd3JpdGVsKHYsIChwb3J0KS0+bWVtYmFzZSArIEFUTUVMX1BEQ19UUFIpCiAjZGVmaW5lIFVBUlRfUFVUX1RDUihwb3J0LHYpCV9fcmF3X3dyaXRlbCh2LCAocG9ydCktPm1lbWJhc2UgKyBBVE1FTF9QRENfVENSKQotLy8jZGVmaW5lIFVBUlRfUFVUX1ROUFIocG9ydCx2KQlfX3Jhd193cml0ZWwodiwgKHBvcnQpLT5tZW1iYXNlICsgQVRNRUxfUERDX1ROUFIpCi0vLyNkZWZpbmUgVUFSVF9QVVRfVE5DUihwb3J0LHYpCV9fcmF3X3dyaXRlbCh2LCAocG9ydCktPm1lbWJhc2UgKyBBVE1FTF9QRENfVE5DUikKIAogc3RhdGljIGludCAoKmF0bWVsX29wZW5faG9vaykoc3RydWN0IHVhcnRfcG9ydCAqKTsKIHN0YXRpYyB2b2lkICgqYXRtZWxfY2xvc2VfaG9vaykoc3RydWN0IHVhcnRfcG9ydCAqKTsKIAorc3RydWN0IGF0bWVsX2RtYV9idWZmZXIgeworCXVuc2lnbmVkIGNoYXIJKmJ1ZjsKKwlkbWFfYWRkcl90CWRtYV9hZGRyOworCXVuc2lnbmVkIGludAlkbWFfc2l6ZTsKKwl1bnNpZ25lZCBpbnQJb2ZzOworfTsKKworc3RydWN0IGF0bWVsX3VhcnRfY2hhciB7CisJdTE2CQlzdGF0dXM7CisJdTE2CQljaDsKK307CisKKyNkZWZpbmUgQVRNRUxfU0VSSUFMX1JJTkdTSVpFIDEwMjQKKwogLyoKICAqIFdlIHdyYXAgb3VyIHBvcnQgc3RydWN0dXJlIGFyb3VuZCB0aGUgZ2VuZXJpYyB1YXJ0X3BvcnQuCiAgKi8KQEAgLTExNCw2ICsxMzIsMTkgQEAKIAlzdHJ1Y3QgY2xrCQkqY2xrOwkJLyogdWFydCBjbG9jayAqLwogCXVuc2lnbmVkIHNob3J0CQlzdXNwZW5kZWQ7CS8qIGlzIHBvcnQgc3VzcGVuZGVkPyAqLwogCWludAkJCWJyZWFrX2FjdGl2ZTsJLyogYnJlYWsgYmVpbmcgcmVjZWl2ZWQgKi8KKworCXNob3J0CQkJdXNlX2RtYV9yeDsJLyogZW5hYmxlIFBEQyByZWNlaXZlciAqLworCXNob3J0CQkJcGRjX3J4X2lkeDsJLyogY3VycmVudCBQREMgUlggYnVmZmVyICovCisJc3RydWN0IGF0bWVsX2RtYV9idWZmZXIJcGRjX3J4WzJdOwkvKiBQREMgcmVjZWllciAqLworCisJc2hvcnQJCQl1c2VfZG1hX3R4OwkvKiBlbmFibGUgUERDIHRyYW5zbWl0dGVyICovCisJc3RydWN0IGF0bWVsX2RtYV9idWZmZXIJcGRjX3R4OwkJLyogUERDIHRyYW5zbWl0dGVyICovCisKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJdGFza2xldDsKKwl1bnNpZ25lZCBpbnQJCWlycV9zdGF0dXM7CisJdW5zaWduZWQgaW50CQlpcnFfc3RhdHVzX3ByZXY7CisKKwlzdHJ1Y3QgY2lyY19idWYJCXJ4X3Jpbmc7CiB9OwogCiBzdGF0aWMgc3RydWN0IGF0bWVsX3VhcnRfcG9ydCBhdG1lbF9wb3J0c1tBVE1FTF9NQVhfVUFSVF07CkBAIC0xMjIsNiArMTUzLDM4IEBACiBzdGF0aWMgc3RydWN0IGNvbnNvbGUgYXRtZWxfY29uc29sZTsKICNlbmRpZgogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhdG1lbF91YXJ0X3BvcnQgKgordG9fYXRtZWxfdWFydF9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnVhcnQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZih1YXJ0LCBzdHJ1Y3QgYXRtZWxfdWFydF9wb3J0LCB1YXJ0KTsKK30KKworI2lmZGVmIENPTkZJR19TRVJJQUxfQVRNRUxfUERDCitzdGF0aWMgYm9vbCBhdG1lbF91c2VfZG1hX3J4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IGF0bWVsX3VhcnRfcG9ydCAqYXRtZWxfcG9ydCA9IHRvX2F0bWVsX3VhcnRfcG9ydChwb3J0KTsKKworCXJldHVybiBhdG1lbF9wb3J0LT51c2VfZG1hX3J4OworfQorCitzdGF0aWMgYm9vbCBhdG1lbF91c2VfZG1hX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IGF0bWVsX3VhcnRfcG9ydCAqYXRtZWxfcG9ydCA9IHRvX2F0bWVsX3VhcnRfcG9ydChwb3J0KTsKKworCXJldHVybiBhdG1lbF9wb3J0LT51c2VfZG1hX3R4OworfQorI2Vsc2UKK3N0YXRpYyBib29sIGF0bWVsX3VzZV9kbWFfcngoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGF0bWVsX3VzZV9kbWFfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYKKwogLyoKICAqIFJldHVybiBUSU9DU0VSX1RFTVQgd2hlbiB0cmFuc21pdHRlciBGSUZPIGFuZCBTaGlmdCByZWdpc3RlciBpcyBlbXB0eS4KICAqLwpAQCAtMTQxLDggKzIwNCw4IEBACiAjaWZkZWYgQ09ORklHX0FSQ0hfQVQ5MVJNOTIwMAogCWlmIChjcHVfaXNfYXQ5MXJtOTIwMCgpKSB7CiAJCS8qCi0JCSAqIEFUOTFSTTkyMDAgRXJyYXRhICMzOTogUlRTMCBpcyBub3QgaW50ZXJuYWxseSBjb25uZWN0ZWQgdG8gUEEyMS4KLQkJICogIFdlIG5lZWQgdG8gZHJpdmUgdGhlIHBpbiBtYW51YWxseS4KKwkJICogQVQ5MVJNOTIwMCBFcnJhdGEgIzM5OiBSVFMwIGlzIG5vdCBpbnRlcm5hbGx5IGNvbm5lY3RlZAorCQkgKiB0byBQQTIxLiBXZSBuZWVkIHRvIGRyaXZlIHRoZSBwaW4gbWFudWFsbHkuCiAJCSAqLwogCQlpZiAocG9ydC0+bWFwYmFzZSA9PSBBVDkxUk05MjAwX0JBU0VfVVMwKSB7CiAJCQlpZiAobWN0cmwgJiBUSU9DTV9SVFMpCkBAIC0yMDMsNyArMjY2LDEyIEBACiAgKi8KIHN0YXRpYyB2b2lkIGF0bWVsX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKLQlVQVJUX1BVVF9JRFIocG9ydCwgQVRNRUxfVVNfVFhSRFkpOworCWlmIChhdG1lbF91c2VfZG1hX3R4KHBvcnQpKSB7CisJCS8qIGRpc2FibGUgUERDIHRyYW5zbWl0ICovCisJCVVBUlRfUFVUX1BUQ1IocG9ydCwgQVRNRUxfUERDX1RYVERJUyk7CisJCVVBUlRfUFVUX0lEUihwb3J0LCBBVE1FTF9VU19FTkRUWCB8IEFUTUVMX1VTX1RYQlVGRSk7CisJfSBlbHNlCisJCVVBUlRfUFVUX0lEUihwb3J0LCBBVE1FTF9VU19UWFJEWSk7CiB9CiAKIC8qCkBAIC0yMTEsNyArMjc5LDE3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGF0bWVsX3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7Ci0JVUFSVF9QVVRfSUVSKHBvcnQsIEFUTUVMX1VTX1RYUkRZKTsKKwlpZiAoYXRtZWxfdXNlX2RtYV90eChwb3J0KSkgeworCQlpZiAoVUFSVF9HRVRfUFRTUihwb3J0KSAmIEFUTUVMX1BEQ19UWFRFTikKKwkJCS8qIFRoZSB0cmFuc21pdHRlciBpcyBhbHJlYWR5IHJ1bm5pbmcuICBZZXMsIHdlCisJCQkgICByZWFsbHkgbmVlZCB0aGlzLiovCisJCQlyZXR1cm47CisKKwkJVUFSVF9QVVRfSUVSKHBvcnQsIEFUTUVMX1VTX0VORFRYIHwgQVRNRUxfVVNfVFhCVUZFKTsKKwkJLyogcmUtZW5hYmxlIFBEQyB0cmFuc21pdCAqLworCQlVQVJUX1BVVF9QVENSKHBvcnQsIEFUTUVMX1BEQ19UWFRFTik7CisJfSBlbHNlCisJCVVBUlRfUFVUX0lFUihwb3J0LCBBVE1FTF9VU19UWFJEWSk7CiB9CiAKIC8qCkBAIC0yMTksNyArMjk3LDEyIEBACiAgKi8KIHN0YXRpYyB2b2lkIGF0bWVsX3N0b3Bfcngoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKLQlVQVJUX1BVVF9JRFIocG9ydCwgQVRNRUxfVVNfUlhSRFkpOworCWlmIChhdG1lbF91c2VfZG1hX3J4KHBvcnQpKSB7CisJCS8qIGRpc2FibGUgUERDIHJlY2VpdmUgKi8KKwkJVUFSVF9QVVRfUFRDUihwb3J0LCBBVE1FTF9QRENfUlhURElTKTsKKwkJVUFSVF9QVVRfSURSKHBvcnQsIEFUTUVMX1VTX0VORFJYIHwgQVRNRUxfVVNfVElNRU9VVCk7CisJfSBlbHNlCisJCVVBUlRfUFVUX0lEUihwb3J0LCBBVE1FTF9VU19SWFJEWSk7CiB9CiAKIC8qCkBAIC0yMjcsNyArMzEwLDggQEAKICAqLwogc3RhdGljIHZvaWQgYXRtZWxfZW5hYmxlX21zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7Ci0JVUFSVF9QVVRfSUVSKHBvcnQsIEFUTUVMX1VTX1JJSUMgfCBBVE1FTF9VU19EU1JJQyB8IEFUTUVMX1VTX0RDRElDIHwgQVRNRUxfVVNfQ1RTSUMpOworCVVBUlRfUFVUX0lFUihwb3J0LCBBVE1FTF9VU19SSUlDIHwgQVRNRUxfVVNfRFNSSUMKKwkJCXwgQVRNRUxfVVNfRENESUMgfCBBVE1FTF9VU19DVFNJQyk7CiB9CiAKIC8qCkBAIC0yNDIsMjIgKzMyNiw2MyBAQAogfQogCiAvKgorICogU3RvcmVzIHRoZSBpbmNvbWluZyBjaGFyYWN0ZXIgaW4gdGhlIHJpbmcgYnVmZmVyCisgKi8KK3N0YXRpYyB2b2lkCithdG1lbF9idWZmZXJfcnhfY2hhcihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgc3RhdHVzLAorCQkgICAgIHVuc2lnbmVkIGludCBjaCkKK3sKKwlzdHJ1Y3QgYXRtZWxfdWFydF9wb3J0ICphdG1lbF9wb3J0ID0gdG9fYXRtZWxfdWFydF9wb3J0KHBvcnQpOworCXN0cnVjdCBjaXJjX2J1ZiAqcmluZyA9ICZhdG1lbF9wb3J0LT5yeF9yaW5nOworCXN0cnVjdCBhdG1lbF91YXJ0X2NoYXIgKmM7CisKKwlpZiAoIUNJUkNfU1BBQ0UocmluZy0+aGVhZCwgcmluZy0+dGFpbCwgQVRNRUxfU0VSSUFMX1JJTkdTSVpFKSkKKwkJLyogQnVmZmVyIG92ZXJmbG93LCBpZ25vcmUgY2hhciAqLworCQlyZXR1cm47CisKKwljID0gJigoc3RydWN0IGF0bWVsX3VhcnRfY2hhciAqKXJpbmctPmJ1ZilbcmluZy0+aGVhZF07CisJYy0+c3RhdHVzCT0gc3RhdHVzOworCWMtPmNoCQk9IGNoOworCisJLyogTWFrZSBzdXJlIHRoZSBjaGFyYWN0ZXIgaXMgc3RvcmVkIGJlZm9yZSB3ZSB1cGRhdGUgaGVhZC4gKi8KKwlzbXBfd21iKCk7CisKKwlyaW5nLT5oZWFkID0gKHJpbmctPmhlYWQgKyAxKSAmIChBVE1FTF9TRVJJQUxfUklOR1NJWkUgLSAxKTsKK30KKworLyoKKyAqIERlYWwgd2l0aCBwYXJpdHksIGZyYW1pbmcgYW5kIG92ZXJydW4gZXJyb3JzLgorICovCitzdGF0aWMgdm9pZCBhdG1lbF9wZGNfcnhlcnIoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHN0YXR1cykKK3sKKwkvKiBjbGVhciBlcnJvciAqLworCVVBUlRfUFVUX0NSKHBvcnQsIEFUTUVMX1VTX1JTVFNUQSk7CisKKwlpZiAoc3RhdHVzICYgQVRNRUxfVVNfUlhCUkspIHsKKwkJLyogaWdub3JlIHNpZGUtZWZmZWN0ICovCisJCXN0YXR1cyAmPSB+KEFUTUVMX1VTX1BBUkUgfCBBVE1FTF9VU19GUkFNRSk7CisJCXBvcnQtPmljb3VudC5icmsrKzsKKwl9CisJaWYgKHN0YXR1cyAmIEFUTUVMX1VTX1BBUkUpCisJCXBvcnQtPmljb3VudC5wYXJpdHkrKzsKKwlpZiAoc3RhdHVzICYgQVRNRUxfVVNfRlJBTUUpCisJCXBvcnQtPmljb3VudC5mcmFtZSsrOworCWlmIChzdGF0dXMgJiBBVE1FTF9VU19PVlJFKQorCQlwb3J0LT5pY291bnQub3ZlcnJ1bisrOworfQorCisvKgogICogQ2hhcmFjdGVycyByZWNlaXZlZCAoY2FsbGVkIGZyb20gaW50ZXJydXB0IGhhbmRsZXIpCiAgKi8KIHN0YXRpYyB2b2lkIGF0bWVsX3J4X2NoYXJzKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7Ci0Jc3RydWN0IGF0bWVsX3VhcnRfcG9ydCAqYXRtZWxfcG9ydCA9IChzdHJ1Y3QgYXRtZWxfdWFydF9wb3J0ICopIHBvcnQ7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPmluZm8tPnR0eTsKLQl1bnNpZ25lZCBpbnQgc3RhdHVzLCBjaCwgZmxnOworCXN0cnVjdCBhdG1lbF91YXJ0X3BvcnQgKmF0bWVsX3BvcnQgPSB0b19hdG1lbF91YXJ0X3BvcnQocG9ydCk7CisJdW5zaWduZWQgaW50IHN0YXR1cywgY2g7CiAKIAlzdGF0dXMgPSBVQVJUX0dFVF9DU1IocG9ydCk7CiAJd2hpbGUgKHN0YXR1cyAmIEFUTUVMX1VTX1JYUkRZKSB7CiAJCWNoID0gVUFSVF9HRVRfQ0hBUihwb3J0KTsKIAotCQlwb3J0LT5pY291bnQucngrKzsKLQotCQlmbGcgPSBUVFlfTk9STUFMOwotCiAJCS8qCiAJCSAqIG5vdGUgdGhhdCB0aGUgZXJyb3IgaGFuZGxpbmcgY29kZSBpcwogCQkgKiBvdXQgb2YgdGhlIG1haW4gZXhlY3V0aW9uIHBhdGgKQEAgLTI2NSwxNSArMzkwLDE0IEBACiAJCWlmICh1bmxpa2VseShzdGF0dXMgJiAoQVRNRUxfVVNfUEFSRSB8IEFUTUVMX1VTX0ZSQU1FCiAJCQkJICAgICAgIHwgQVRNRUxfVVNfT1ZSRSB8IEFUTUVMX1VTX1JYQlJLKQogCQkJICAgICB8fCBhdG1lbF9wb3J0LT5icmVha19hY3RpdmUpKSB7Ci0JCQlVQVJUX1BVVF9DUihwb3J0LCBBVE1FTF9VU19SU1RTVEEpOwkvKiBjbGVhciBlcnJvciAqLworCisJCQkvKiBjbGVhciBlcnJvciAqLworCQkJVUFSVF9QVVRfQ1IocG9ydCwgQVRNRUxfVVNfUlNUU1RBKTsKKwogCQkJaWYgKHN0YXR1cyAmIEFUTUVMX1VTX1JYQlJLCiAJCQkgICAgJiYgIWF0bWVsX3BvcnQtPmJyZWFrX2FjdGl2ZSkgewotCQkJCXN0YXR1cyAmPSB+KEFUTUVMX1VTX1BBUkUgfCBBVE1FTF9VU19GUkFNRSk7CS8qIGlnbm9yZSBzaWRlLWVmZmVjdCAqLwotCQkJCXBvcnQtPmljb3VudC5icmsrKzsKIAkJCQlhdG1lbF9wb3J0LT5icmVha19hY3RpdmUgPSAxOwogCQkJCVVBUlRfUFVUX0lFUihwb3J0LCBBVE1FTF9VU19SWEJSSyk7Ci0JCQkJaWYgKHVhcnRfaGFuZGxlX2JyZWFrKHBvcnQpKQotCQkJCQlnb3RvIGlnbm9yZV9jaGFyOwogCQkJfSBlbHNlIHsKIAkJCQkvKgogCQkJCSAqIFRoaXMgaXMgZWl0aGVyIHRoZSBlbmQtb2YtYnJlYWsKQEAgLTI4Niw2ICs0MTAsMjI4IEBACiAJCQkJc3RhdHVzICY9IH5BVE1FTF9VU19SWEJSSzsKIAkJCQlhdG1lbF9wb3J0LT5icmVha19hY3RpdmUgPSAwOwogCQkJfQorCQl9CisKKwkJYXRtZWxfYnVmZmVyX3J4X2NoYXIocG9ydCwgc3RhdHVzLCBjaCk7CisJCXN0YXR1cyA9IFVBUlRfR0VUX0NTUihwb3J0KTsKKwl9CisKKwl0YXNrbGV0X3NjaGVkdWxlKCZhdG1lbF9wb3J0LT50YXNrbGV0KTsKK30KKworLyoKKyAqIFRyYW5zbWl0IGNoYXJhY3RlcnMgKGNhbGxlZCBmcm9tIHRhc2tsZXQgd2l0aCBUWFJEWSBpbnRlcnJ1cHQKKyAqIGRpc2FibGVkKQorICovCitzdGF0aWMgdm9pZCBhdG1lbF90eF9jaGFycyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZwb3J0LT5pbmZvLT54bWl0OworCisJaWYgKHBvcnQtPnhfY2hhciAmJiBVQVJUX0dFVF9DU1IocG9ydCkgJiBBVE1FTF9VU19UWFJEWSkgeworCQlVQVJUX1BVVF9DSEFSKHBvcnQsIHBvcnQtPnhfY2hhcik7CisJCXBvcnQtPmljb3VudC50eCsrOworCQlwb3J0LT54X2NoYXIgPSAwOworCX0KKwlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpIHx8IHVhcnRfdHhfc3RvcHBlZChwb3J0KSkKKwkJcmV0dXJuOworCisJd2hpbGUgKFVBUlRfR0VUX0NTUihwb3J0KSAmIEFUTUVMX1VTX1RYUkRZKSB7CisJCVVBUlRfUFVUX0NIQVIocG9ydCwgeG1pdC0+YnVmW3htaXQtPnRhaWxdKTsKKwkJeG1pdC0+dGFpbCA9ICh4bWl0LT50YWlsICsgMSkgJiAoVUFSVF9YTUlUX1NJWkUgLSAxKTsKKwkJcG9ydC0+aWNvdW50LnR4Kys7CisJCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpCisJCQlicmVhazsKKwl9CisKKwlpZiAodWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoeG1pdCkgPCBXQUtFVVBfQ0hBUlMpCisJCXVhcnRfd3JpdGVfd2FrZXVwKHBvcnQpOworCisJaWYgKCF1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpCisJCVVBUlRfUFVUX0lFUihwb3J0LCBBVE1FTF9VU19UWFJEWSk7Cit9CisKKy8qCisgKiByZWNlaXZlIGludGVycnVwdCBoYW5kbGVyLgorICovCitzdGF0aWMgdm9pZAorYXRtZWxfaGFuZGxlX3JlY2VpdmUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHBlbmRpbmcpCit7CisJc3RydWN0IGF0bWVsX3VhcnRfcG9ydCAqYXRtZWxfcG9ydCA9IHRvX2F0bWVsX3VhcnRfcG9ydChwb3J0KTsKKworCWlmIChhdG1lbF91c2VfZG1hX3J4KHBvcnQpKSB7CisJCS8qCisJCSAqIFBEQyByZWNlaXZlLiBKdXN0IHNjaGVkdWxlIHRoZSB0YXNrbGV0IGFuZCBsZXQgaXQKKwkJICogZmlndXJlIG91dCB0aGUgZGV0YWlscy4KKwkJICoKKwkJICogVE9ETzogV2UncmUgbm90IGhhbmRsaW5nIGVycm9yIGZsYWdzIGNvcnJlY3RseSBhdAorCQkgKiB0aGUgbW9tZW50LgorCQkgKi8KKwkJaWYgKHBlbmRpbmcgJiAoQVRNRUxfVVNfRU5EUlggfCBBVE1FTF9VU19USU1FT1VUKSkgeworCQkJVUFSVF9QVVRfSURSKHBvcnQsIChBVE1FTF9VU19FTkRSWAorCQkJCQkJfCBBVE1FTF9VU19USU1FT1VUKSk7CisJCQl0YXNrbGV0X3NjaGVkdWxlKCZhdG1lbF9wb3J0LT50YXNrbGV0KTsKKwkJfQorCisJCWlmIChwZW5kaW5nICYgKEFUTUVMX1VTX1JYQlJLIHwgQVRNRUxfVVNfT1ZSRSB8CisJCQkJQVRNRUxfVVNfRlJBTUUgfCBBVE1FTF9VU19QQVJFKSkKKwkJCWF0bWVsX3BkY19yeGVycihwb3J0LCBwZW5kaW5nKTsKKwl9CisKKwkvKiBJbnRlcnJ1cHQgcmVjZWl2ZSAqLworCWlmIChwZW5kaW5nICYgQVRNRUxfVVNfUlhSRFkpCisJCWF0bWVsX3J4X2NoYXJzKHBvcnQpOworCWVsc2UgaWYgKHBlbmRpbmcgJiBBVE1FTF9VU19SWEJSSykgeworCQkvKgorCQkgKiBFbmQgb2YgYnJlYWsgZGV0ZWN0ZWQuIElmIGl0IGNhbWUgYWxvbmcgd2l0aCBhCisJCSAqIGNoYXJhY3RlciwgYXRtZWxfcnhfY2hhcnMgd2lsbCBoYW5kbGUgaXQuCisJCSAqLworCQlVQVJUX1BVVF9DUihwb3J0LCBBVE1FTF9VU19SU1RTVEEpOworCQlVQVJUX1BVVF9JRFIocG9ydCwgQVRNRUxfVVNfUlhCUkspOworCQlhdG1lbF9wb3J0LT5icmVha19hY3RpdmUgPSAwOworCX0KK30KKworLyoKKyAqIHRyYW5zbWl0IGludGVycnVwdCBoYW5kbGVyLiAoVHJhbnNtaXQgaXMgSVJRRl9OT0RFTEFZIHNhZmUpCisgKi8KK3N0YXRpYyB2b2lkCithdG1lbF9oYW5kbGVfdHJhbnNtaXQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHBlbmRpbmcpCit7CisJc3RydWN0IGF0bWVsX3VhcnRfcG9ydCAqYXRtZWxfcG9ydCA9IHRvX2F0bWVsX3VhcnRfcG9ydChwb3J0KTsKKworCWlmIChhdG1lbF91c2VfZG1hX3R4KHBvcnQpKSB7CisJCS8qIFBEQyB0cmFuc21pdCAqLworCQlpZiAocGVuZGluZyAmIChBVE1FTF9VU19FTkRUWCB8IEFUTUVMX1VTX1RYQlVGRSkpIHsKKwkJCVVBUlRfUFVUX0lEUihwb3J0LCBBVE1FTF9VU19FTkRUWCB8IEFUTUVMX1VTX1RYQlVGRSk7CisJCQl0YXNrbGV0X3NjaGVkdWxlKCZhdG1lbF9wb3J0LT50YXNrbGV0KTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIEludGVycnVwdCB0cmFuc21pdCAqLworCQlpZiAocGVuZGluZyAmIEFUTUVMX1VTX1RYUkRZKSB7CisJCQlVQVJUX1BVVF9JRFIocG9ydCwgQVRNRUxfVVNfVFhSRFkpOworCQkJdGFza2xldF9zY2hlZHVsZSgmYXRtZWxfcG9ydC0+dGFza2xldCk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBzdGF0dXMgZmxhZ3MgaW50ZXJydXB0IGhhbmRsZXIuCisgKi8KK3N0YXRpYyB2b2lkCithdG1lbF9oYW5kbGVfc3RhdHVzKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBwZW5kaW5nLAorCQkgICAgdW5zaWduZWQgaW50IHN0YXR1cykKK3sKKwlzdHJ1Y3QgYXRtZWxfdWFydF9wb3J0ICphdG1lbF9wb3J0ID0gdG9fYXRtZWxfdWFydF9wb3J0KHBvcnQpOworCisJaWYgKHBlbmRpbmcgJiAoQVRNRUxfVVNfUklJQyB8IEFUTUVMX1VTX0RTUklDIHwgQVRNRUxfVVNfRENESUMKKwkJCQl8IEFUTUVMX1VTX0NUU0lDKSkgeworCQlhdG1lbF9wb3J0LT5pcnFfc3RhdHVzID0gc3RhdHVzOworCQl0YXNrbGV0X3NjaGVkdWxlKCZhdG1lbF9wb3J0LT50YXNrbGV0KTsKKwl9Cit9CisKKy8qCisgKiBJbnRlcnJ1cHQgaGFuZGxlcgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYXRtZWxfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gZGV2X2lkOworCXVuc2lnbmVkIGludCBzdGF0dXMsIHBlbmRpbmcsIHBhc3NfY291bnRlciA9IDA7CisKKwlkbyB7CisJCXN0YXR1cyA9IFVBUlRfR0VUX0NTUihwb3J0KTsKKwkJcGVuZGluZyA9IHN0YXR1cyAmIFVBUlRfR0VUX0lNUihwb3J0KTsKKwkJaWYgKCFwZW5kaW5nKQorCQkJYnJlYWs7CisKKwkJYXRtZWxfaGFuZGxlX3JlY2VpdmUocG9ydCwgcGVuZGluZyk7CisJCWF0bWVsX2hhbmRsZV9zdGF0dXMocG9ydCwgcGVuZGluZywgc3RhdHVzKTsKKwkJYXRtZWxfaGFuZGxlX3RyYW5zbWl0KHBvcnQsIHBlbmRpbmcpOworCX0gd2hpbGUgKHBhc3NfY291bnRlcisrIDwgQVRNRUxfSVNSX1BBU1NfTElNSVQpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogQ2FsbGVkIGZyb20gdGFza2xldCB3aXRoIEVORFRYIGFuZCBUWEJVRkUgaW50ZXJydXB0cyBkaXNhYmxlZC4KKyAqLworc3RhdGljIHZvaWQgYXRtZWxfdHhfZG1hKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IGF0bWVsX3VhcnRfcG9ydCAqYXRtZWxfcG9ydCA9IHRvX2F0bWVsX3VhcnRfcG9ydChwb3J0KTsKKwlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmcG9ydC0+aW5mby0+eG1pdDsKKwlzdHJ1Y3QgYXRtZWxfZG1hX2J1ZmZlciAqcGRjID0gJmF0bWVsX3BvcnQtPnBkY190eDsKKwlpbnQgY291bnQ7CisKKwl4bWl0LT50YWlsICs9IHBkYy0+b2ZzOworCXhtaXQtPnRhaWwgJj0gVUFSVF9YTUlUX1NJWkUgLSAxOworCisJcG9ydC0+aWNvdW50LnR4ICs9IHBkYy0+b2ZzOworCXBkYy0+b2ZzID0gMDsKKworCWlmICghdWFydF9jaXJjX2VtcHR5KHhtaXQpKSB7CisJCS8qIG1vcmUgdG8gdHJhbnNtaXQgLSBzZXR1cCBuZXh0IHRyYW5zZmVyICovCisKKwkJLyogZGlzYWJsZSBQREMgdHJhbnNtaXQgKi8KKwkJVUFSVF9QVVRfUFRDUihwb3J0LCBBVE1FTF9QRENfVFhURElTKTsKKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UocG9ydC0+ZGV2LAorCQkJCQkgICBwZGMtPmRtYV9hZGRyLAorCQkJCQkgICBwZGMtPmRtYV9zaXplLAorCQkJCQkgICBETUFfVE9fREVWSUNFKTsKKworCQljb3VudCA9IENJUkNfQ05UX1RPX0VORCh4bWl0LT5oZWFkLCB4bWl0LT50YWlsLCBVQVJUX1hNSVRfU0laRSk7CisJCXBkYy0+b2ZzID0gY291bnQ7CisKKwkJVUFSVF9QVVRfVFBSKHBvcnQsIHBkYy0+ZG1hX2FkZHIgKyB4bWl0LT50YWlsKTsKKwkJVUFSVF9QVVRfVENSKHBvcnQsIGNvdW50KTsKKwkJLyogcmUtZW5hYmxlIFBEQyB0cmFuc21pdCBhbmQgaW50ZXJydXB0cyAqLworCQlVQVJUX1BVVF9QVENSKHBvcnQsIEFUTUVMX1BEQ19UWFRFTik7CisJCVVBUlRfUFVUX0lFUihwb3J0LCBBVE1FTF9VU19FTkRUWCB8IEFUTUVMX1VTX1RYQlVGRSk7CisJfSBlbHNlIHsKKwkJLyogbm90aGluZyBsZWZ0IHRvIHRyYW5zbWl0IC0gZGlzYWJsZSB0aGUgdHJhbnNtaXR0ZXIgKi8KKworCQkvKiBkaXNhYmxlIFBEQyB0cmFuc21pdCAqLworCQlVQVJUX1BVVF9QVENSKHBvcnQsIEFUTUVMX1BEQ19UWFRESVMpOworCX0KKworCWlmICh1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZyh4bWl0KSA8IFdBS0VVUF9DSEFSUykKKwkJdWFydF93cml0ZV93YWtldXAocG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGF0bWVsX3J4X2Zyb21fcmluZyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBhdG1lbF91YXJ0X3BvcnQgKmF0bWVsX3BvcnQgPSB0b19hdG1lbF91YXJ0X3BvcnQocG9ydCk7CisJc3RydWN0IGNpcmNfYnVmICpyaW5nID0gJmF0bWVsX3BvcnQtPnJ4X3Jpbmc7CisJdW5zaWduZWQgaW50IGZsZzsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJd2hpbGUgKHJpbmctPmhlYWQgIT0gcmluZy0+dGFpbCkgeworCQlzdHJ1Y3QgYXRtZWxfdWFydF9jaGFyIGM7CisKKwkJLyogTWFrZSBzdXJlIGMgaXMgbG9hZGVkIGFmdGVyIGhlYWQuICovCisJCXNtcF9ybWIoKTsKKworCQljID0gKChzdHJ1Y3QgYXRtZWxfdWFydF9jaGFyICopcmluZy0+YnVmKVtyaW5nLT50YWlsXTsKKworCQlyaW5nLT50YWlsID0gKHJpbmctPnRhaWwgKyAxKSAmIChBVE1FTF9TRVJJQUxfUklOR1NJWkUgLSAxKTsKKworCQlwb3J0LT5pY291bnQucngrKzsKKwkJc3RhdHVzID0gYy5zdGF0dXM7CisJCWZsZyA9IFRUWV9OT1JNQUw7CisKKwkJLyoKKwkJICogbm90ZSB0aGF0IHRoZSBlcnJvciBoYW5kbGluZyBjb2RlIGlzCisJCSAqIG91dCBvZiB0aGUgbWFpbiBleGVjdXRpb24gcGF0aAorCQkgKi8KKwkJaWYgKHVubGlrZWx5KHN0YXR1cyAmIChBVE1FTF9VU19QQVJFIHwgQVRNRUxfVVNfRlJBTUUKKwkJCQkgICAgICAgfCBBVE1FTF9VU19PVlJFIHwgQVRNRUxfVVNfUlhCUkspKSkgeworCQkJaWYgKHN0YXR1cyAmIEFUTUVMX1VTX1JYQlJLKSB7CisJCQkJLyogaWdub3JlIHNpZGUtZWZmZWN0ICovCisJCQkJc3RhdHVzICY9IH4oQVRNRUxfVVNfUEFSRSB8IEFUTUVMX1VTX0ZSQU1FKTsKKworCQkJCXBvcnQtPmljb3VudC5icmsrKzsKKwkJCQlpZiAodWFydF9oYW5kbGVfYnJlYWsocG9ydCkpCisJCQkJCWNvbnRpbnVlOworCQkJfQogCQkJaWYgKHN0YXR1cyAmIEFUTUVMX1VTX1BBUkUpCiAJCQkJcG9ydC0+aWNvdW50LnBhcml0eSsrOwogCQkJaWYgKHN0YXR1cyAmIEFUTUVMX1VTX0ZSQU1FKQpAQCAtMzAzLDk4ICs2NDksMTQyIEBACiAJCQkJZmxnID0gVFRZX0ZSQU1FOwogCQl9CiAKLQkJaWYgKHVhcnRfaGFuZGxlX3N5c3JxX2NoYXIocG9ydCwgY2gpKQotCQkJZ290byBpZ25vcmVfY2hhcjsKIAotCQl1YXJ0X2luc2VydF9jaGFyKHBvcnQsIHN0YXR1cywgQVRNRUxfVVNfT1ZSRSwgY2gsIGZsZyk7CisJCWlmICh1YXJ0X2hhbmRsZV9zeXNycV9jaGFyKHBvcnQsIGMuY2gpKQorCQkJY29udGludWU7CiAKLQlpZ25vcmVfY2hhcjoKLQkJc3RhdHVzID0gVUFSVF9HRVRfQ1NSKHBvcnQpOworCQl1YXJ0X2luc2VydF9jaGFyKHBvcnQsIHN0YXR1cywgQVRNRUxfVVNfT1ZSRSwgYy5jaCwgZmxnKTsKIAl9CiAKLQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworCS8qCisJICogRHJvcCB0aGUgbG9jayBoZXJlIHNpbmNlIGl0IG1pZ2h0IGVuZCB1cCBjYWxsaW5nCisJICogdWFydF9zdGFydCgpLCB3aGljaCB0YWtlcyB0aGUgbG9jay4KKwkgKi8KKwlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7CisJdHR5X2ZsaXBfYnVmZmVyX3B1c2gocG9ydC0+aW5mby0+dHR5KTsKKwlzcGluX2xvY2soJnBvcnQtPmxvY2spOwogfQogCi0vKgotICogVHJhbnNtaXQgY2hhcmFjdGVycyAoY2FsbGVkIGZyb20gaW50ZXJydXB0IGhhbmRsZXIpCi0gKi8KLXN0YXRpYyB2b2lkIGF0bWVsX3R4X2NoYXJzKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCitzdGF0aWMgdm9pZCBhdG1lbF9yeF9mcm9tX2RtYShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewotCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZwb3J0LT5pbmZvLT54bWl0OworCXN0cnVjdCBhdG1lbF91YXJ0X3BvcnQgKmF0bWVsX3BvcnQgPSB0b19hdG1lbF91YXJ0X3BvcnQocG9ydCk7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPmluZm8tPnR0eTsKKwlzdHJ1Y3QgYXRtZWxfZG1hX2J1ZmZlciAqcGRjOworCWludCByeF9pZHggPSBhdG1lbF9wb3J0LT5wZGNfcnhfaWR4OworCXVuc2lnbmVkIGludCBoZWFkOworCXVuc2lnbmVkIGludCB0YWlsOworCXVuc2lnbmVkIGludCBjb3VudDsKIAotCWlmIChwb3J0LT54X2NoYXIpIHsKLQkJVUFSVF9QVVRfQ0hBUihwb3J0LCBwb3J0LT54X2NoYXIpOwotCQlwb3J0LT5pY291bnQudHgrKzsKLQkJcG9ydC0+eF9jaGFyID0gMDsKLQkJcmV0dXJuOwotCX0KLQlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpIHx8IHVhcnRfdHhfc3RvcHBlZChwb3J0KSkgewotCQlhdG1lbF9zdG9wX3R4KHBvcnQpOwotCQlyZXR1cm47Ci0JfQorCWRvIHsKKwkJLyogUmVzZXQgdGhlIFVBUlQgdGltZW91dCBlYXJseSBzbyB0aGF0IHdlIGRvbid0IG1pc3Mgb25lICovCisJCVVBUlRfUFVUX0NSKHBvcnQsIEFUTUVMX1VTX1NUVFRPKTsKIAotCXdoaWxlIChVQVJUX0dFVF9DU1IocG9ydCkgJiBBVE1FTF9VU19UWFJEWSkgewotCQlVQVJUX1BVVF9DSEFSKHBvcnQsIHhtaXQtPmJ1Zlt4bWl0LT50YWlsXSk7Ci0JCXhtaXQtPnRhaWwgPSAoeG1pdC0+dGFpbCArIDEpICYgKFVBUlRfWE1JVF9TSVpFIC0gMSk7Ci0JCXBvcnQtPmljb3VudC50eCsrOwotCQlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpKQotCQkJYnJlYWs7Ci0JfQorCQlwZGMgPSAmYXRtZWxfcG9ydC0+cGRjX3J4W3J4X2lkeF07CisJCWhlYWQgPSBVQVJUX0dFVF9SUFIocG9ydCkgLSBwZGMtPmRtYV9hZGRyOworCQl0YWlsID0gcGRjLT5vZnM7CiAKLQlpZiAodWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoeG1pdCkgPCBXQUtFVVBfQ0hBUlMpCi0JCXVhcnRfd3JpdGVfd2FrZXVwKHBvcnQpOworCQkvKiBJZiB0aGUgUERDIGhhcyBzd2l0Y2hlZCBidWZmZXJzLCBSUFIgd29uJ3QgY29udGFpbgorCQkgKiBhbnkgYWRkcmVzcyB3aXRoaW4gdGhlIGN1cnJlbnQgYnVmZmVyLiBTaW5jZSBoZWFkCisJCSAqIGlzIHVuc2lnbmVkLCB3ZSBqdXN0IG5lZWQgYSBvbmUtd2F5IGNvbXBhcmlzb24gdG8KKwkJICogZmluZCBvdXQuCisJCSAqCisJCSAqIEluIHRoaXMgY2FzZSwgd2UganVzdCBuZWVkIHRvIGNvbnN1bWUgdGhlIGVudGlyZQorCQkgKiBidWZmZXIgYW5kIHJlc3VibWl0IGl0IGZvciBETUEuIFRoaXMgd2lsbCBjbGVhciB0aGUKKwkJICogRU5EUlggYml0IGFzIHdlbGwsIHNvIHRoYXQgd2UgY2FuIHNhZmVseSByZS1lbmFibGUKKwkJICogYWxsIGludGVycnVwdHMgYmVsb3cuCisJCSAqLworCQloZWFkID0gbWluKGhlYWQsIHBkYy0+ZG1hX3NpemUpOwogCi0JaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSkKLQkJYXRtZWxfc3RvcF90eChwb3J0KTsKLX0KKwkJaWYgKGxpa2VseShoZWFkICE9IHRhaWwpKSB7CisJCQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShwb3J0LT5kZXYsIHBkYy0+ZG1hX2FkZHIsCisJCQkJCXBkYy0+ZG1hX3NpemUsIERNQV9GUk9NX0RFVklDRSk7CiAKLS8qCi0gKiBJbnRlcnJ1cHQgaGFuZGxlcgotICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgYXRtZWxfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gZGV2X2lkOwotCXN0cnVjdCBhdG1lbF91YXJ0X3BvcnQgKmF0bWVsX3BvcnQgPSAoc3RydWN0IGF0bWVsX3VhcnRfcG9ydCAqKSBwb3J0OwotCXVuc2lnbmVkIGludCBzdGF0dXMsIHBlbmRpbmcsIHBhc3NfY291bnRlciA9IDA7Ci0KLQlzdGF0dXMgPSBVQVJUX0dFVF9DU1IocG9ydCk7Ci0JcGVuZGluZyA9IHN0YXR1cyAmIFVBUlRfR0VUX0lNUihwb3J0KTsKLQl3aGlsZSAocGVuZGluZykgewotCQkvKiBJbnRlcnJ1cHQgcmVjZWl2ZSAqLwotCQlpZiAocGVuZGluZyAmIEFUTUVMX1VTX1JYUkRZKQotCQkJYXRtZWxfcnhfY2hhcnMocG9ydCk7Ci0JCWVsc2UgaWYgKHBlbmRpbmcgJiBBVE1FTF9VU19SWEJSSykgewogCQkJLyoKLQkJCSAqIEVuZCBvZiBicmVhayBkZXRlY3RlZC4gSWYgaXQgY2FtZSBhbG9uZwotCQkJICogd2l0aCBhIGNoYXJhY3RlciwgYXRtZWxfcnhfY2hhcnMgd2lsbAotCQkJICogaGFuZGxlIGl0LgorCQkJICogaGVhZCB3aWxsIG9ubHkgd3JhcCBhcm91bmQgd2hlbiB3ZSByZWN5Y2xlCisJCQkgKiB0aGUgRE1BIGJ1ZmZlciwgYW5kIHdoZW4gdGhhdCBoYXBwZW5zLCB3ZQorCQkJICogZXhwbGljaXRseSBzZXQgdGFpbCB0byAwLiBTbyBoZWFkIHdpbGwKKwkJCSAqIGFsd2F5cyBiZSBncmVhdGVyIHRoYW4gdGFpbC4KIAkJCSAqLwotCQkJVUFSVF9QVVRfQ1IocG9ydCwgQVRNRUxfVVNfUlNUU1RBKTsKLQkJCVVBUlRfUFVUX0lEUihwb3J0LCBBVE1FTF9VU19SWEJSSyk7Ci0JCQlhdG1lbF9wb3J0LT5icmVha19hY3RpdmUgPSAwOworCQkJY291bnQgPSBoZWFkIC0gdGFpbDsKKworCQkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIHBkYy0+YnVmICsgcGRjLT5vZnMsIGNvdW50KTsKKworCQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UocG9ydC0+ZGV2LCBwZGMtPmRtYV9hZGRyLAorCQkJCQlwZGMtPmRtYV9zaXplLCBETUFfRlJPTV9ERVZJQ0UpOworCisJCQlwb3J0LT5pY291bnQucnggKz0gY291bnQ7CisJCQlwZGMtPm9mcyA9IGhlYWQ7CiAJCX0KIAotCQkvLyBUT0RPOiBBbGwgcmVhZHMgdG8gQ1NSIHdpbGwgY2xlYXIgdGhlc2UgaW50ZXJydXB0cyEKLQkJaWYgKHBlbmRpbmcgJiBBVE1FTF9VU19SSUlDKSBwb3J0LT5pY291bnQucm5nKys7Ci0JCWlmIChwZW5kaW5nICYgQVRNRUxfVVNfRFNSSUMpIHBvcnQtPmljb3VudC5kc3IrKzsKLQkJaWYgKHBlbmRpbmcgJiBBVE1FTF9VU19EQ0RJQykKKwkJLyoKKwkJICogSWYgdGhlIGN1cnJlbnQgYnVmZmVyIGlzIGZ1bGwsIHdlIG5lZWQgdG8gY2hlY2sgaWYKKwkJICogdGhlIG5leHQgb25lIGNvbnRhaW5zIGFueSBhZGRpdGlvbmFsIGRhdGEuCisJCSAqLworCQlpZiAoaGVhZCA+PSBwZGMtPmRtYV9zaXplKSB7CisJCQlwZGMtPm9mcyA9IDA7CisJCQlVQVJUX1BVVF9STlBSKHBvcnQsIHBkYy0+ZG1hX2FkZHIpOworCQkJVUFSVF9QVVRfUk5DUihwb3J0LCBwZGMtPmRtYV9zaXplKTsKKworCQkJcnhfaWR4ID0gIXJ4X2lkeDsKKwkJCWF0bWVsX3BvcnQtPnBkY19yeF9pZHggPSByeF9pZHg7CisJCX0KKwl9IHdoaWxlIChoZWFkID49IHBkYy0+ZG1hX3NpemUpOworCisJLyoKKwkgKiBEcm9wIHRoZSBsb2NrIGhlcmUgc2luY2UgaXQgbWlnaHQgZW5kIHVwIGNhbGxpbmcKKwkgKiB1YXJ0X3N0YXJ0KCksIHdoaWNoIHRha2VzIHRoZSBsb2NrLgorCSAqLworCXNwaW5fdW5sb2NrKCZwb3J0LT5sb2NrKTsKKwl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworCXNwaW5fbG9jaygmcG9ydC0+bG9jayk7CisKKwlVQVJUX1BVVF9JRVIocG9ydCwgQVRNRUxfVVNfRU5EUlggfCBBVE1FTF9VU19USU1FT1VUKTsKK30KKworLyoKKyAqIHRhc2tsZXQgaGFuZGxpbmcgdHR5IHN0dWZmIG91dHNpZGUgdGhlIGludGVycnVwdCBoYW5kbGVyLgorICovCitzdGF0aWMgdm9pZCBhdG1lbF90YXNrbGV0X2Z1bmModW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSAoc3RydWN0IHVhcnRfcG9ydCAqKWRhdGE7CisJc3RydWN0IGF0bWVsX3VhcnRfcG9ydCAqYXRtZWxfcG9ydCA9IHRvX2F0bWVsX3VhcnRfcG9ydChwb3J0KTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCXVuc2lnbmVkIGludCBzdGF0dXNfY2hhbmdlOworCisJLyogVGhlIGludGVycnVwdCBoYW5kbGVyIGRvZXMgbm90IHRha2UgdGhlIGxvY2sgKi8KKwlzcGluX2xvY2soJnBvcnQtPmxvY2spOworCisJaWYgKGF0bWVsX3VzZV9kbWFfdHgocG9ydCkpCisJCWF0bWVsX3R4X2RtYShwb3J0KTsKKwllbHNlCisJCWF0bWVsX3R4X2NoYXJzKHBvcnQpOworCisJc3RhdHVzID0gYXRtZWxfcG9ydC0+aXJxX3N0YXR1czsKKwlzdGF0dXNfY2hhbmdlID0gc3RhdHVzIF4gYXRtZWxfcG9ydC0+aXJxX3N0YXR1c19wcmV2OworCisJaWYgKHN0YXR1c19jaGFuZ2UgJiAoQVRNRUxfVVNfUkkgfCBBVE1FTF9VU19EU1IKKwkJCQl8IEFUTUVMX1VTX0RDRCB8IEFUTUVMX1VTX0NUUykpIHsKKwkJLyogVE9ETzogQWxsIHJlYWRzIHRvIENTUiB3aWxsIGNsZWFyIHRoZXNlIGludGVycnVwdHMhICovCisJCWlmIChzdGF0dXNfY2hhbmdlICYgQVRNRUxfVVNfUkkpCisJCQlwb3J0LT5pY291bnQucm5nKys7CisJCWlmIChzdGF0dXNfY2hhbmdlICYgQVRNRUxfVVNfRFNSKQorCQkJcG9ydC0+aWNvdW50LmRzcisrOworCQlpZiAoc3RhdHVzX2NoYW5nZSAmIEFUTUVMX1VTX0RDRCkKIAkJCXVhcnRfaGFuZGxlX2RjZF9jaGFuZ2UocG9ydCwgIShzdGF0dXMgJiBBVE1FTF9VU19EQ0QpKTsKLQkJaWYgKHBlbmRpbmcgJiBBVE1FTF9VU19DVFNJQykKKwkJaWYgKHN0YXR1c19jaGFuZ2UgJiBBVE1FTF9VU19DVFMpCiAJCQl1YXJ0X2hhbmRsZV9jdHNfY2hhbmdlKHBvcnQsICEoc3RhdHVzICYgQVRNRUxfVVNfQ1RTKSk7Ci0JCWlmIChwZW5kaW5nICYgKEFUTUVMX1VTX1JJSUMgfCBBVE1FTF9VU19EU1JJQyB8IEFUTUVMX1VTX0RDRElDIHwgQVRNRUxfVVNfQ1RTSUMpKQotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5pbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CiAKLQkJLyogSW50ZXJydXB0IHRyYW5zbWl0ICovCi0JCWlmIChwZW5kaW5nICYgQVRNRUxfVVNfVFhSRFkpCi0JCQlhdG1lbF90eF9jaGFycyhwb3J0KTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5pbmZvLT5kZWx0YV9tc3Jfd2FpdCk7CiAKLQkJaWYgKHBhc3NfY291bnRlcisrID4gQVRNRUxfSVNSX1BBU1NfTElNSVQpCi0JCQlicmVhazsKLQotCQlzdGF0dXMgPSBVQVJUX0dFVF9DU1IocG9ydCk7Ci0JCXBlbmRpbmcgPSBzdGF0dXMgJiBVQVJUX0dFVF9JTVIocG9ydCk7CisJCWF0bWVsX3BvcnQtPmlycV9zdGF0dXNfcHJldiA9IHN0YXR1czsKIAl9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOworCisJaWYgKGF0bWVsX3VzZV9kbWFfcngocG9ydCkpCisJCWF0bWVsX3J4X2Zyb21fZG1hKHBvcnQpOworCWVsc2UKKwkJYXRtZWxfcnhfZnJvbV9yaW5nKHBvcnQpOworCisJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOwogfQogCiAvKgpAQCAtNDAyLDYgKzc5Miw4IEBACiAgKi8KIHN0YXRpYyBpbnQgYXRtZWxfc3RhcnR1cChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogeworCXN0cnVjdCBhdG1lbF91YXJ0X3BvcnQgKmF0bWVsX3BvcnQgPSB0b19hdG1lbF91YXJ0X3BvcnQocG9ydCk7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPmluZm8tPnR0eTsKIAlpbnQgcmV0dmFsOwogCiAJLyoKQEAgLTQxNCwxMyArODA2LDY0IEBACiAJLyoKIAkgKiBBbGxvY2F0ZSB0aGUgSVJRCiAJICovCi0JcmV0dmFsID0gcmVxdWVzdF9pcnEocG9ydC0+aXJxLCBhdG1lbF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCAiYXRtZWxfc2VyaWFsIiwgcG9ydCk7CisJcmV0dmFsID0gcmVxdWVzdF9pcnEocG9ydC0+aXJxLCBhdG1lbF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAorCQkJdHR5ID8gdHR5LT5uYW1lIDogImF0bWVsX3NlcmlhbCIsIHBvcnQpOwogCWlmIChyZXR2YWwpIHsKIAkJcHJpbnRrKCJhdG1lbF9zZXJpYWw6IGF0bWVsX3N0YXJ0dXAgLSBDYW4ndCBnZXQgaXJxXG4iKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKIAkvKgorCSAqIEluaXRpYWxpemUgRE1BIChpZiBuZWNlc3NhcnkpCisJICovCisJaWYgKGF0bWVsX3VzZV9kbWFfcngocG9ydCkpIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJc3RydWN0IGF0bWVsX2RtYV9idWZmZXIgKnBkYyA9ICZhdG1lbF9wb3J0LT5wZGNfcnhbaV07CisKKwkJCXBkYy0+YnVmID0ga21hbGxvYyhQRENfQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpOworCQkJaWYgKHBkYy0+YnVmID09IE5VTEwpIHsKKwkJCQlpZiAoaSAhPSAwKSB7CisJCQkJCWRtYV91bm1hcF9zaW5nbGUocG9ydC0+ZGV2LAorCQkJCQkJYXRtZWxfcG9ydC0+cGRjX3J4WzBdLmRtYV9hZGRyLAorCQkJCQkJUERDX0JVRkZFUl9TSVpFLAorCQkJCQkJRE1BX0ZST01fREVWSUNFKTsKKwkJCQkJa2ZyZWUoYXRtZWxfcG9ydC0+cGRjX3J4WzBdLmJ1Zik7CisJCQkJfQorCQkJCWZyZWVfaXJxKHBvcnQtPmlycSwgcG9ydCk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlwZGMtPmRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUocG9ydC0+ZGV2LAorCQkJCQkJICAgICAgIHBkYy0+YnVmLAorCQkJCQkJICAgICAgIFBEQ19CVUZGRVJfU0laRSwKKwkJCQkJCSAgICAgICBETUFfRlJPTV9ERVZJQ0UpOworCQkJcGRjLT5kbWFfc2l6ZSA9IFBEQ19CVUZGRVJfU0laRTsKKwkJCXBkYy0+b2ZzID0gMDsKKwkJfQorCisJCWF0bWVsX3BvcnQtPnBkY19yeF9pZHggPSAwOworCisJCVVBUlRfUFVUX1JQUihwb3J0LCBhdG1lbF9wb3J0LT5wZGNfcnhbMF0uZG1hX2FkZHIpOworCQlVQVJUX1BVVF9SQ1IocG9ydCwgUERDX0JVRkZFUl9TSVpFKTsKKworCQlVQVJUX1BVVF9STlBSKHBvcnQsIGF0bWVsX3BvcnQtPnBkY19yeFsxXS5kbWFfYWRkcik7CisJCVVBUlRfUFVUX1JOQ1IocG9ydCwgUERDX0JVRkZFUl9TSVpFKTsKKwl9CisJaWYgKGF0bWVsX3VzZV9kbWFfdHgocG9ydCkpIHsKKwkJc3RydWN0IGF0bWVsX2RtYV9idWZmZXIgKnBkYyA9ICZhdG1lbF9wb3J0LT5wZGNfdHg7CisJCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZwb3J0LT5pbmZvLT54bWl0OworCisJCXBkYy0+YnVmID0geG1pdC0+YnVmOworCQlwZGMtPmRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUocG9ydC0+ZGV2LAorCQkJCQkgICAgICAgcGRjLT5idWYsCisJCQkJCSAgICAgICBVQVJUX1hNSVRfU0laRSwKKwkJCQkJICAgICAgIERNQV9UT19ERVZJQ0UpOworCQlwZGMtPmRtYV9zaXplID0gVUFSVF9YTUlUX1NJWkU7CisJCXBkYy0+b2ZzID0gMDsKKwl9CisKKwkvKgogCSAqIElmIHRoZXJlIGlzIGEgc3BlY2lmaWMgIm9wZW4iIGZ1bmN0aW9uICh0byByZWdpc3RlcgogCSAqIGNvbnRyb2wgbGluZSBpbnRlcnJ1cHRzKQogCSAqLwpAQCAtNDM2LDkgKzg3OSwyMSBAQAogCSAqIEZpbmFsbHksIGVuYWJsZSB0aGUgc2VyaWFsIHBvcnQKIAkgKi8KIAlVQVJUX1BVVF9DUihwb3J0LCBBVE1FTF9VU19SU1RTVEEgfCBBVE1FTF9VU19SU1RSWCk7Ci0JVUFSVF9QVVRfQ1IocG9ydCwgQVRNRUxfVVNfVFhFTiB8IEFUTUVMX1VTX1JYRU4pOwkJLyogZW5hYmxlIHhtaXQgJiByY3ZyICovCisJLyogZW5hYmxlIHhtaXQgJiByY3ZyICovCisJVUFSVF9QVVRfQ1IocG9ydCwgQVRNRUxfVVNfVFhFTiB8IEFUTUVMX1VTX1JYRU4pOwogCi0JVUFSVF9QVVRfSUVSKHBvcnQsIEFUTUVMX1VTX1JYUkRZKTsJCS8qIGVuYWJsZSByZWNlaXZlIG9ubHkgKi8KKwlpZiAoYXRtZWxfdXNlX2RtYV9yeChwb3J0KSkgeworCQkvKiBzZXQgVUFSVCB0aW1lb3V0ICovCisJCVVBUlRfUFVUX1JUT1IocG9ydCwgUERDX1JYX1RJTUVPVVQpOworCQlVQVJUX1BVVF9DUihwb3J0LCBBVE1FTF9VU19TVFRUTyk7CisKKwkJVUFSVF9QVVRfSUVSKHBvcnQsIEFUTUVMX1VTX0VORFJYIHwgQVRNRUxfVVNfVElNRU9VVCk7CisJCS8qIGVuYWJsZSBQREMgY29udHJvbGxlciAqLworCQlVQVJUX1BVVF9QVENSKHBvcnQsIEFUTUVMX1BEQ19SWFRFTik7CisJfSBlbHNlIHsKKwkJLyogZW5hYmxlIHJlY2VpdmUgb25seSAqLworCQlVQVJUX1BVVF9JRVIocG9ydCwgQVRNRUxfVVNfUlhSRFkpOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtNDQ4LDYgKzkwMywzOCBAQAogICovCiBzdGF0aWMgdm9pZCBhdG1lbF9zaHV0ZG93bihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogeworCXN0cnVjdCBhdG1lbF91YXJ0X3BvcnQgKmF0bWVsX3BvcnQgPSB0b19hdG1lbF91YXJ0X3BvcnQocG9ydCk7CisJLyoKKwkgKiBFbnN1cmUgZXZlcnl0aGluZyBpcyBzdG9wcGVkLgorCSAqLworCWF0bWVsX3N0b3BfcngocG9ydCk7CisJYXRtZWxfc3RvcF90eChwb3J0KTsKKworCS8qCisJICogU2h1dC1kb3duIHRoZSBETUEuCisJICovCisJaWYgKGF0bWVsX3VzZV9kbWFfcngocG9ydCkpIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJc3RydWN0IGF0bWVsX2RtYV9idWZmZXIgKnBkYyA9ICZhdG1lbF9wb3J0LT5wZGNfcnhbaV07CisKKwkJCWRtYV91bm1hcF9zaW5nbGUocG9ydC0+ZGV2LAorCQkJCQkgcGRjLT5kbWFfYWRkciwKKwkJCQkJIHBkYy0+ZG1hX3NpemUsCisJCQkJCSBETUFfRlJPTV9ERVZJQ0UpOworCQkJa2ZyZWUocGRjLT5idWYpOworCQl9CisJfQorCWlmIChhdG1lbF91c2VfZG1hX3R4KHBvcnQpKSB7CisJCXN0cnVjdCBhdG1lbF9kbWFfYnVmZmVyICpwZGMgPSAmYXRtZWxfcG9ydC0+cGRjX3R4OworCisJCWRtYV91bm1hcF9zaW5nbGUocG9ydC0+ZGV2LAorCQkJCSBwZGMtPmRtYV9hZGRyLAorCQkJCSBwZGMtPmRtYV9zaXplLAorCQkJCSBETUFfVE9fREVWSUNFKTsKKwl9CisKIAkvKgogCSAqIERpc2FibGUgYWxsIGludGVycnVwdHMsIHBvcnQgYW5kIGJyZWFrIGNvbmRpdGlvbi4KIAkgKi8KQEAgLTQ3MCw0NSArOTU3LDQ4IEBACiAvKgogICogUG93ZXIgLyBDbG9jayBtYW5hZ2VtZW50LgogICovCi1zdGF0aWMgdm9pZCBhdG1lbF9zZXJpYWxfcG0oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHN0YXRlLCB1bnNpZ25lZCBpbnQgb2xkc3RhdGUpCitzdGF0aWMgdm9pZCBhdG1lbF9zZXJpYWxfcG0oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHN0YXRlLAorCQkJICAgIHVuc2lnbmVkIGludCBvbGRzdGF0ZSkKIHsKLQlzdHJ1Y3QgYXRtZWxfdWFydF9wb3J0ICphdG1lbF9wb3J0ID0gKHN0cnVjdCBhdG1lbF91YXJ0X3BvcnQgKikgcG9ydDsKKwlzdHJ1Y3QgYXRtZWxfdWFydF9wb3J0ICphdG1lbF9wb3J0ID0gdG9fYXRtZWxfdWFydF9wb3J0KHBvcnQpOwogCiAJc3dpdGNoIChzdGF0ZSkgewotCQljYXNlIDA6Ci0JCQkvKgotCQkJICogRW5hYmxlIHRoZSBwZXJpcGhlcmFsIGNsb2NrIGZvciB0aGlzIHNlcmlhbCBwb3J0LgotCQkJICogVGhpcyBpcyBjYWxsZWQgb24gdWFydF9vcGVuKCkgb3IgYSByZXN1bWUgZXZlbnQuCi0JCQkgKi8KLQkJCWNsa19lbmFibGUoYXRtZWxfcG9ydC0+Y2xrKTsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQkvKgotCQkJICogRGlzYWJsZSB0aGUgcGVyaXBoZXJhbCBjbG9jayBmb3IgdGhpcyBzZXJpYWwgcG9ydC4KLQkJCSAqIFRoaXMgaXMgY2FsbGVkIG9uIHVhcnRfY2xvc2UoKSBvciBhIHN1c3BlbmQgZXZlbnQuCi0JCQkgKi8KLQkJCWNsa19kaXNhYmxlKGF0bWVsX3BvcnQtPmNsayk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX0VSUiAiYXRtZWxfc2VyaWFsOiB1bmtub3duIHBtICVkXG4iLCBzdGF0ZSk7CisJY2FzZSAwOgorCQkvKgorCQkgKiBFbmFibGUgdGhlIHBlcmlwaGVyYWwgY2xvY2sgZm9yIHRoaXMgc2VyaWFsIHBvcnQuCisJCSAqIFRoaXMgaXMgY2FsbGVkIG9uIHVhcnRfb3BlbigpIG9yIGEgcmVzdW1lIGV2ZW50LgorCQkgKi8KKwkJY2xrX2VuYWJsZShhdG1lbF9wb3J0LT5jbGspOworCQlicmVhazsKKwljYXNlIDM6CisJCS8qCisJCSAqIERpc2FibGUgdGhlIHBlcmlwaGVyYWwgY2xvY2sgZm9yIHRoaXMgc2VyaWFsIHBvcnQuCisJCSAqIFRoaXMgaXMgY2FsbGVkIG9uIHVhcnRfY2xvc2UoKSBvciBhIHN1c3BlbmQgZXZlbnQuCisJCSAqLworCQljbGtfZGlzYWJsZShhdG1lbF9wb3J0LT5jbGspOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgImF0bWVsX3NlcmlhbDogdW5rbm93biBwbSAlZFxuIiwgc3RhdGUpOwogCX0KIH0KIAogLyoKICAqIENoYW5nZSB0aGUgcG9ydCBwYXJhbWV0ZXJzCiAgKi8KLXN0YXRpYyB2b2lkIGF0bWVsX3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBrdGVybWlvcyAqIHRlcm1pb3MsIHN0cnVjdCBrdGVybWlvcyAqIG9sZCkKK3N0YXRpYyB2b2lkIGF0bWVsX3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcywKKwkJCSAgICAgIHN0cnVjdCBrdGVybWlvcyAqb2xkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IG1vZGUsIGltciwgcXVvdCwgYmF1ZDsKIAogCS8qIEdldCBjdXJyZW50IG1vZGUgcmVnaXN0ZXIgKi8KLQltb2RlID0gVUFSVF9HRVRfTVIocG9ydCkgJiB+KEFUTUVMX1VTX1VTQ0xLUyB8IEFUTUVMX1VTX0NIUkwgfCBBVE1FTF9VU19OQlNUT1AgfCBBVE1FTF9VU19QQVIpOworCW1vZGUgPSBVQVJUX0dFVF9NUihwb3J0KSAmIH4oQVRNRUxfVVNfVVNDTEtTIHwgQVRNRUxfVVNfQ0hSTAorCQkJCQl8IEFUTUVMX1VTX05CU1RPUCB8IEFUTUVMX1VTX1BBUik7CiAKLQliYXVkID0gdWFydF9nZXRfYmF1ZF9yYXRlKHBvcnQsIHRlcm1pb3MsIG9sZCwgMCwgcG9ydC0+dWFydGNsay8xNik7CisJYmF1ZCA9IHVhcnRfZ2V0X2JhdWRfcmF0ZShwb3J0LCB0ZXJtaW9zLCBvbGQsIDAsIHBvcnQtPnVhcnRjbGsgLyAxNik7CiAJcXVvdCA9IHVhcnRfZ2V0X2Rpdmlzb3IocG9ydCwgYmF1ZCk7CiAKLQlpZiAocXVvdCA+IDY1NTM1KSB7CQkvKiBCUkdSIGlzIDE2LWJpdCwgc28gc3dpdGNoIHRvIHNsb3dlciBjbG9jayAqLworCWlmIChxdW90ID4gNjU1MzUpIHsJLyogQlJHUiBpcyAxNi1iaXQsIHNvIHN3aXRjaCB0byBzbG93ZXIgY2xvY2sgKi8KIAkJcXVvdCAvPSA4OwogCQltb2RlIHw9IEFUTUVMX1VTX1VTQ0xLU19NQ0tfRElWODsKIAl9CkBAIC01MzUsMTggKzEwMjUsMTcgQEAKIAogCS8qIHBhcml0eSAqLwogCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgUEFSRU5CKSB7Ci0JCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ01TUEFSKSB7CQkJLyogTWFyayBvciBTcGFjZSBwYXJpdHkgKi8KKwkJLyogTWFyayBvciBTcGFjZSBwYXJpdHkgKi8KKwkJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBDTVNQQVIpIHsKIAkJCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgUEFST0REKQogCQkJCW1vZGUgfD0gQVRNRUxfVVNfUEFSX01BUks7CiAJCQllbHNlCiAJCQkJbW9kZSB8PSBBVE1FTF9VU19QQVJfU1BBQ0U7Ci0JCX0KLQkJZWxzZSBpZiAodGVybWlvcy0+Y19jZmxhZyAmIFBBUk9ERCkKKwkJfSBlbHNlIGlmICh0ZXJtaW9zLT5jX2NmbGFnICYgUEFST0REKQogCQkJbW9kZSB8PSBBVE1FTF9VU19QQVJfT0REOwogCQllbHNlCiAJCQltb2RlIHw9IEFUTUVMX1VTX1BBUl9FVkVOOwotCX0KLQllbHNlCisJfSBlbHNlCiAJCW1vZGUgfD0gQVRNRUxfVVNfUEFSX05PTkU7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwpAQCAtNTU3LDYgKzEwNDYsMTAgQEAKIAlpZiAodGVybWlvcy0+Y19pZmxhZyAmIChCUktJTlQgfCBQQVJNUkspKQogCQlwb3J0LT5yZWFkX3N0YXR1c19tYXNrIHw9IEFUTUVMX1VTX1JYQlJLOwogCisJaWYgKGF0bWVsX3VzZV9kbWFfcngocG9ydCkpCisJCS8qIG5lZWQgdG8gZW5hYmxlIGVycm9yIGludGVycnVwdHMgKi8KKwkJVUFSVF9QVVRfSUVSKHBvcnQsIHBvcnQtPnJlYWRfc3RhdHVzX21hc2spOworCiAJLyoKIAkgKiBDaGFyYWN0ZXJzIHRvIGlnbm9yZQogCSAqLwpAQCAtNTcyLDE2ICsxMDY1LDE2IEBACiAJCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgSUdOUEFSKQogCQkJcG9ydC0+aWdub3JlX3N0YXR1c19tYXNrIHw9IEFUTUVMX1VTX09WUkU7CiAJfQotCi0JLy8gVE9ETzogSWdub3JlIGFsbCBjaGFyYWN0ZXJzIGlmIENSRUFEIGlzIHNldC4KKwkvKiBUT0RPOiBJZ25vcmUgYWxsIGNoYXJhY3RlcnMgaWYgQ1JFQUQgaXMgc2V0LiovCiAKIAkvKiB1cGRhdGUgdGhlIHBlci1wb3J0IHRpbWVvdXQgKi8KIAl1YXJ0X3VwZGF0ZV90aW1lb3V0KHBvcnQsIHRlcm1pb3MtPmNfY2ZsYWcsIGJhdWQpOwogCi0JLyogZGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBkcmFpbiB0cmFuc21pdHRlciAqLwotCWltciA9IFVBUlRfR0VUX0lNUihwb3J0KTsJLyogZ2V0IGludGVycnVwdCBtYXNrICovCi0JVUFSVF9QVVRfSURSKHBvcnQsIC0xKTsJCS8qIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KLQl3aGlsZSAoIShVQVJUX0dFVF9DU1IocG9ydCkgJiBBVE1FTF9VU19UWEVNUFRZKSkgeyBiYXJyaWVyKCk7IH0KKwkvKiBzYXZlL2Rpc2FibGUgaW50ZXJydXB0cyBhbmQgZHJhaW4gdHJhbnNtaXR0ZXIgKi8KKwlpbXIgPSBVQVJUX0dFVF9JTVIocG9ydCk7CisJVUFSVF9QVVRfSURSKHBvcnQsIC0xKTsKKwl3aGlsZSAoIShVQVJUX0dFVF9DU1IocG9ydCkgJiBBVE1FTF9VU19UWEVNUFRZKSkKKwkJY3B1X3JlbGF4KCk7CiAKIAkvKiBkaXNhYmxlIHJlY2VpdmVyIGFuZCB0cmFuc21pdHRlciAqLwogCVVBUlRfUFVUX0NSKHBvcnQsIEFUTUVMX1VTX1RYRElTIHwgQVRNRUxfVVNfUlhESVMpOwpAQCAtNzA3LDcgKzEyMDAsOCBAQAogLyoKICAqIENvbmZpZ3VyZSB0aGUgcG9ydCBmcm9tIHRoZSBwbGF0Zm9ybSBkZXZpY2UgcmVzb3VyY2UgaW5mby4KICAqLwotc3RhdGljIHZvaWQgX19kZXZpbml0IGF0bWVsX2luaXRfcG9ydChzdHJ1Y3QgYXRtZWxfdWFydF9wb3J0ICphdG1lbF9wb3J0LCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIHZvaWQgX19kZXZpbml0IGF0bWVsX2luaXRfcG9ydChzdHJ1Y3QgYXRtZWxfdWFydF9wb3J0ICphdG1lbF9wb3J0LAorCQkJCSAgICAgIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9ICZhdG1lbF9wb3J0LT51YXJ0OwogCXN0cnVjdCBhdG1lbF91YXJ0X2RhdGEgKmRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKQEAgLTcyMiw2ICsxMjE2LDExIEBACiAJcG9ydC0+bWFwYmFzZQk9IHBkZXYtPnJlc291cmNlWzBdLnN0YXJ0OwogCXBvcnQtPmlycQk9IHBkZXYtPnJlc291cmNlWzFdLnN0YXJ0OwogCisJdGFza2xldF9pbml0KCZhdG1lbF9wb3J0LT50YXNrbGV0LCBhdG1lbF90YXNrbGV0X2Z1bmMsCisJCQkodW5zaWduZWQgbG9uZylwb3J0KTsKKworCW1lbXNldCgmYXRtZWxfcG9ydC0+cnhfcmluZywgMCwgc2l6ZW9mKGF0bWVsX3BvcnQtPnJ4X3JpbmcpKTsKKwogCWlmIChkYXRhLT5yZWdzKQogCQkvKiBBbHJlYWR5IG1hcHBlZCBieSBzZXR1cCBjb2RlICovCiAJCXBvcnQtPm1lbWJhc2UgPSBkYXRhLT5yZWdzOwpAQCAtNzMwLDExICsxMjI5LDE3IEBACiAJCXBvcnQtPm1lbWJhc2UJPSBOVUxMOwogCX0KIAotCWlmICghYXRtZWxfcG9ydC0+Y2xrKSB7CQkvKiBmb3IgY29uc29sZSwgdGhlIGNsb2NrIGNvdWxkIGFscmVhZHkgYmUgY29uZmlndXJlZCAqLworCS8qIGZvciBjb25zb2xlLCB0aGUgY2xvY2sgY291bGQgYWxyZWFkeSBiZSBjb25maWd1cmVkICovCisJaWYgKCFhdG1lbF9wb3J0LT5jbGspIHsKIAkJYXRtZWxfcG9ydC0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAidXNhcnQiKTsKIAkJY2xrX2VuYWJsZShhdG1lbF9wb3J0LT5jbGspOwogCQlwb3J0LT51YXJ0Y2xrID0gY2xrX2dldF9yYXRlKGF0bWVsX3BvcnQtPmNsayk7CiAJfQorCisJYXRtZWxfcG9ydC0+dXNlX2RtYV9yeCA9IGRhdGEtPnVzZV9kbWFfcng7CisJYXRtZWxfcG9ydC0+dXNlX2RtYV90eCA9IGRhdGEtPnVzZV9kbWFfdHg7CisJaWYgKGF0bWVsX3VzZV9kbWFfdHgocG9ydCkpCisJCXBvcnQtPmZpZm9zaXplID0gUERDX0JVRkZFUl9TSVpFOwogfQogCiAvKgpAQCAtNzU0LDEyICsxMjU5LDExIEBACiAJYXRtZWxfcG9wcy5zZXRfd2FrZQk9IGZucy0+c2V0X3dha2U7CiB9CiAKLQogI2lmZGVmIENPTkZJR19TRVJJQUxfQVRNRUxfQ09OU09MRQogc3RhdGljIHZvaWQgYXRtZWxfY29uc29sZV9wdXRjaGFyKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBjaCkKIHsKIAl3aGlsZSAoIShVQVJUX0dFVF9DU1IocG9ydCkgJiBBVE1FTF9VU19UWFJEWSkpCi0JCWJhcnJpZXIoKTsKKwkJY3B1X3JlbGF4KCk7CiAJVUFSVF9QVVRfQ0hBUihwb3J0LCBjaCk7CiB9CiAKQEAgLTc3MiwzOCArMTI3Niw0MCBAQAogCXVuc2lnbmVkIGludCBzdGF0dXMsIGltcjsKIAogCS8qCi0JICoJRmlyc3QsIHNhdmUgSU1SIGFuZCB0aGVuIGRpc2FibGUgaW50ZXJydXB0cworCSAqIEZpcnN0LCBzYXZlIElNUiBhbmQgdGhlbiBkaXNhYmxlIGludGVycnVwdHMKIAkgKi8KLQlpbXIgPSBVQVJUX0dFVF9JTVIocG9ydCk7CS8qIGdldCBpbnRlcnJ1cHQgbWFzayAqLworCWltciA9IFVBUlRfR0VUX0lNUihwb3J0KTsKIAlVQVJUX1BVVF9JRFIocG9ydCwgQVRNRUxfVVNfUlhSRFkgfCBBVE1FTF9VU19UWFJEWSk7CiAKIAl1YXJ0X2NvbnNvbGVfd3JpdGUocG9ydCwgcywgY291bnQsIGF0bWVsX2NvbnNvbGVfcHV0Y2hhcik7CiAKIAkvKgotCSAqCUZpbmFsbHksIHdhaXQgZm9yIHRyYW5zbWl0dGVyIHRvIGJlY29tZSBlbXB0eQotCSAqCWFuZCByZXN0b3JlIElNUgorCSAqIEZpbmFsbHksIHdhaXQgZm9yIHRyYW5zbWl0dGVyIHRvIGJlY29tZSBlbXB0eQorCSAqIGFuZCByZXN0b3JlIElNUgogCSAqLwogCWRvIHsKIAkJc3RhdHVzID0gVUFSVF9HRVRfQ1NSKHBvcnQpOwogCX0gd2hpbGUgKCEoc3RhdHVzICYgQVRNRUxfVVNfVFhSRFkpKTsKLQlVQVJUX1BVVF9JRVIocG9ydCwgaW1yKTsJLyogc2V0IGludGVycnVwdHMgYmFjayB0aGUgd2F5IHRoZXkgd2VyZSAqLworCS8qIHNldCBpbnRlcnJ1cHRzIGJhY2sgdGhlIHdheSB0aGV5IHdlcmUgKi8KKwlVQVJUX1BVVF9JRVIocG9ydCwgaW1yKTsKIH0KIAogLyoKLSAqIElmIHRoZSBwb3J0IHdhcyBhbHJlYWR5IGluaXRpYWxpc2VkIChlZywgYnkgYSBib290IGxvYWRlciksIHRyeSB0byBkZXRlcm1pbmUKLSAqIHRoZSBjdXJyZW50IHNldHVwLgorICogSWYgdGhlIHBvcnQgd2FzIGFscmVhZHkgaW5pdGlhbGlzZWQgKGVnLCBieSBhIGJvb3QgbG9hZGVyKSwKKyAqIHRyeSB0byBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgc2V0dXAuCiAgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBhdG1lbF9jb25zb2xlX2dldF9vcHRpb25zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCAqYmF1ZCwgaW50ICpwYXJpdHksIGludCAqYml0cykKK3N0YXRpYyB2b2lkIF9faW5pdCBhdG1lbF9jb25zb2xlX2dldF9vcHRpb25zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCAqYmF1ZCwKKwkJCQkJICAgICBpbnQgKnBhcml0eSwgaW50ICpiaXRzKQogewogCXVuc2lnbmVkIGludCBtciwgcXVvdDsKIAotLy8gVE9ETzogQ1IgaXMgYSB3cml0ZS1vbmx5IHJlZ2lzdGVyCi0vLwl1bnNpZ25lZCBpbnQgY3I7Ci0vLwotLy8JY3IgPSBVQVJUX0dFVF9DUihwb3J0KSAmIChBVE1FTF9VU19SWEVOIHwgQVRNRUxfVVNfVFhFTik7Ci0vLwlpZiAoY3IgPT0gKEFUTUVMX1VTX1JYRU4gfCBBVE1FTF9VU19UWEVOKSkgewotLy8JCS8qIG9rLCB0aGUgcG9ydCB3YXMgZW5hYmxlZCAqLwotLy8JfQorCS8qCisJICogSWYgdGhlIGJhdWQgcmF0ZSBnZW5lcmF0b3IgaXNuJ3QgcnVubmluZywgdGhlIHBvcnQgd2Fzbid0CisJICogaW5pdGlhbGl6ZWQgYnkgdGhlIGJvb3QgbG9hZGVyLgorCSAqLworCXF1b3QgPSBVQVJUX0dFVF9CUkdSKHBvcnQpOworCWlmICghcXVvdCkKKwkJcmV0dXJuOwogCiAJbXIgPSBVQVJUX0dFVF9NUihwb3J0KSAmIEFUTUVMX1VTX0NIUkw7CiAJaWYgKG1yID09IEFUTUVMX1VTX0NIUkxfOCkKQEAgLTgyMyw3ICsxMzI5LDYgQEAKIAkgKiBsb3dlciB0aGFuIG9uZSBvZiB0aG9zZSwgYXMgaXQgd291bGQgbWFrZSB1cyBmYWxsIHRocm91Z2gKIAkgKiB0byBhIG11Y2ggbG93ZXIgYmF1ZCByYXRlIHRoYW4gd2UgcmVhbGx5IHdhbnQuCiAJICovCi0JcXVvdCA9IFVBUlRfR0VUX0JSR1IocG9ydCk7CiAJKmJhdWQgPSBwb3J0LT51YXJ0Y2xrIC8gKDE2ICogKHF1b3QgLSAxKSk7CiB9CiAKQEAgLTgzNSwxMCArMTM0MCwxMiBAQAogCWludCBwYXJpdHkgPSAnbic7CiAJaW50IGZsb3cgPSAnbic7CiAKLQlpZiAocG9ydC0+bWVtYmFzZSA9PSAwKQkJLyogUG9ydCBub3QgaW5pdGlhbGl6ZWQgeWV0IC0gZGVsYXkgc2V0dXAgKi8KKwlpZiAocG9ydC0+bWVtYmFzZSA9PSBOVUxMKSB7CisJCS8qIFBvcnQgbm90IGluaXRpYWxpemVkIHlldCAtIGRlbGF5IHNldHVwICovCiAJCXJldHVybiAtRU5PREVWOworCX0KIAotCVVBUlRfUFVUX0lEUihwb3J0LCAtMSk7CQkJCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCVVBUlRfUFVUX0lEUihwb3J0LCAtMSk7CiAJVUFSVF9QVVRfQ1IocG9ydCwgQVRNRUxfVVNfUlNUU1RBIHwgQVRNRUxfVVNfUlNUUlgpOwogCVVBUlRfUFVUX0NSKHBvcnQsIEFUTUVMX1VTX1RYRU4gfCBBVE1FTF9VU19SWEVOKTsKIApAQCAtODcwLDEzICsxMzc3LDE2IEBACiBzdGF0aWMgaW50IF9faW5pdCBhdG1lbF9jb25zb2xlX2luaXQodm9pZCkKIHsKIAlpZiAoYXRtZWxfZGVmYXVsdF9jb25zb2xlX2RldmljZSkgewotCQlhZGRfcHJlZmVycmVkX2NvbnNvbGUoQVRNRUxfREVWSUNFTkFNRSwgYXRtZWxfZGVmYXVsdF9jb25zb2xlX2RldmljZS0+aWQsIE5VTEwpOwotCQlhdG1lbF9pbml0X3BvcnQoJihhdG1lbF9wb3J0c1thdG1lbF9kZWZhdWx0X2NvbnNvbGVfZGV2aWNlLT5pZF0pLCBhdG1lbF9kZWZhdWx0X2NvbnNvbGVfZGV2aWNlKTsKKwkJYWRkX3ByZWZlcnJlZF9jb25zb2xlKEFUTUVMX0RFVklDRU5BTUUsCisJCQkJICAgICAgYXRtZWxfZGVmYXVsdF9jb25zb2xlX2RldmljZS0+aWQsIE5VTEwpOworCQlhdG1lbF9pbml0X3BvcnQoJmF0bWVsX3BvcnRzW2F0bWVsX2RlZmF1bHRfY29uc29sZV9kZXZpY2UtPmlkXSwKKwkJCQlhdG1lbF9kZWZhdWx0X2NvbnNvbGVfZGV2aWNlKTsKIAkJcmVnaXN0ZXJfY29uc29sZSgmYXRtZWxfY29uc29sZSk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CisKIGNvbnNvbGVfaW5pdGNhbGwoYXRtZWxfY29uc29sZV9pbml0KTsKIAogLyoKQEAgLTg4NCwzNCArMTM5NCw0OCBAQAogICovCiBzdGF0aWMgaW50IF9faW5pdCBhdG1lbF9sYXRlX2NvbnNvbGVfaW5pdCh2b2lkKQogewotCWlmIChhdG1lbF9kZWZhdWx0X2NvbnNvbGVfZGV2aWNlICYmICEoYXRtZWxfY29uc29sZS5mbGFncyAmIENPTl9FTkFCTEVEKSkKKwlpZiAoYXRtZWxfZGVmYXVsdF9jb25zb2xlX2RldmljZQorCSAgICAmJiAhKGF0bWVsX2NvbnNvbGUuZmxhZ3MgJiBDT05fRU5BQkxFRCkpCiAJCXJlZ2lzdGVyX2NvbnNvbGUoJmF0bWVsX2NvbnNvbGUpOwogCiAJcmV0dXJuIDA7CiB9CisKIGNvcmVfaW5pdGNhbGwoYXRtZWxfbGF0ZV9jb25zb2xlX2luaXQpOwogCitzdGF0aWMgaW5saW5lIGJvb2wgYXRtZWxfaXNfY29uc29sZV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcmV0dXJuIHBvcnQtPmNvbnMgJiYgcG9ydC0+Y29ucy0+aW5kZXggPT0gcG9ydC0+bGluZTsKK30KKwogI2Vsc2UKICNkZWZpbmUgQVRNRUxfQ09OU09MRV9ERVZJQ0UJTlVMTAorCitzdGF0aWMgaW5saW5lIGJvb2wgYXRtZWxfaXNfY29uc29sZV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcmV0dXJuIGZhbHNlOworfQogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgYXRtZWxfdWFydCA9IHsKLQkub3duZXIJCQk9IFRISVNfTU9EVUxFLAotCS5kcml2ZXJfbmFtZQkJPSAiYXRtZWxfc2VyaWFsIiwKLQkuZGV2X25hbWUJCT0gQVRNRUxfREVWSUNFTkFNRSwKLQkubWFqb3IJCQk9IFNFUklBTF9BVE1FTF9NQUpPUiwKLQkubWlub3IJCQk9IE1JTk9SX1NUQVJULAotCS5ucgkJCT0gQVRNRUxfTUFYX1VBUlQsCi0JLmNvbnMJCQk9IEFUTUVMX0NPTlNPTEVfREVWSUNFLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJpdmVyX25hbWUJPSAiYXRtZWxfc2VyaWFsIiwKKwkuZGV2X25hbWUJPSBBVE1FTF9ERVZJQ0VOQU1FLAorCS5tYWpvcgkJPSBTRVJJQUxfQVRNRUxfTUFKT1IsCisJLm1pbm9yCQk9IE1JTk9SX1NUQVJULAorCS5ucgkJPSBBVE1FTF9NQVhfVUFSVCwKKwkuY29ucwkJPSBBVE1FTF9DT05TT0xFX0RFVklDRSwKIH07CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgYXRtZWxfc2VyaWFsX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBhdG1lbF9zZXJpYWxfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCXBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGF0bWVsX3VhcnRfcG9ydCAqYXRtZWxfcG9ydCA9IChzdHJ1Y3QgYXRtZWxfdWFydF9wb3J0ICopIHBvcnQ7CisJc3RydWN0IGF0bWVsX3VhcnRfcG9ydCAqYXRtZWxfcG9ydCA9IHRvX2F0bWVsX3VhcnRfcG9ydChwb3J0KTsKIAotCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KSAmJiAhYXQ5MV9zdXNwZW5kX2VudGVyaW5nX3Nsb3dfY2xvY2soKSkKKwlpZiAoZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikKKwkgICAgJiYgIWF0OTFfc3VzcGVuZF9lbnRlcmluZ19zbG93X2Nsb2NrKCkpCiAJCWVuYWJsZV9pcnFfd2FrZShwb3J0LT5pcnEpOwogCWVsc2UgewogCQl1YXJ0X3N1c3BlbmRfcG9ydCgmYXRtZWxfdWFydCwgcG9ydCk7CkBAIC05MjQsMTMgKzE0NDgsMTIgQEAKIHN0YXRpYyBpbnQgYXRtZWxfc2VyaWFsX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgYXRtZWxfdWFydF9wb3J0ICphdG1lbF9wb3J0ID0gKHN0cnVjdCBhdG1lbF91YXJ0X3BvcnQgKikgcG9ydDsKKwlzdHJ1Y3QgYXRtZWxfdWFydF9wb3J0ICphdG1lbF9wb3J0ID0gdG9fYXRtZWxfdWFydF9wb3J0KHBvcnQpOwogCiAJaWYgKGF0bWVsX3BvcnQtPnN1c3BlbmRlZCkgewogCQl1YXJ0X3Jlc3VtZV9wb3J0KCZhdG1lbF91YXJ0LCBwb3J0KTsKIAkJYXRtZWxfcG9ydC0+c3VzcGVuZGVkID0gMDsKLQl9Ci0JZWxzZQorCX0gZWxzZQogCQlkaXNhYmxlX2lycV93YWtlKHBvcnQtPmlycSk7CiAKIAlyZXR1cm4gMDsKQEAgLTk0MywxNSArMTQ2Niw0MCBAQAogc3RhdGljIGludCBfX2RldmluaXQgYXRtZWxfc2VyaWFsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGF0bWVsX3VhcnRfcG9ydCAqcG9ydDsKKwl2b2lkICpkYXRhOwogCWludCByZXQ7CiAKKwlCVUlMRF9CVUdfT04oIWlzX3Bvd2VyX29mXzIoQVRNRUxfU0VSSUFMX1JJTkdTSVpFKSk7CisKIAlwb3J0ID0gJmF0bWVsX3BvcnRzW3BkZXYtPmlkXTsKIAlhdG1lbF9pbml0X3BvcnQocG9ydCwgcGRldik7CiAKKwlpZiAoIWF0bWVsX3VzZV9kbWFfcngoJnBvcnQtPnVhcnQpKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXRtZWxfdWFydF9jaGFyKQorCQkJCSogQVRNRUxfU0VSSUFMX1JJTkdTSVpFLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFkYXRhKQorCQkJZ290byBlcnJfYWxsb2NfcmluZzsKKwkJcG9ydC0+cnhfcmluZy5idWYgPSBkYXRhOworCX0KKwogCXJldCA9IHVhcnRfYWRkX29uZV9wb3J0KCZhdG1lbF91YXJ0LCAmcG9ydC0+dWFydCk7Ci0JaWYgKCFyZXQpIHsKLQkJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIDEpOwotCQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwb3J0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9hZGRfcG9ydDsKKworCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAxKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwb3J0KTsKKworCXJldHVybiAwOworCitlcnJfYWRkX3BvcnQ6CisJa2ZyZWUocG9ydC0+cnhfcmluZy5idWYpOworCXBvcnQtPnJ4X3JpbmcuYnVmID0gTlVMTDsKK2Vycl9hbGxvY19yaW5nOgorCWlmICghYXRtZWxfaXNfY29uc29sZV9wb3J0KCZwb3J0LT51YXJ0KSkgeworCQljbGtfZGlzYWJsZShwb3J0LT5jbGspOworCQljbGtfcHV0KHBvcnQtPmNsayk7CisJCXBvcnQtPmNsayA9IE5VTEw7CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTk2MCwxOSArMTUwOCwyMSBAQAogc3RhdGljIGludCBfX2RldmV4aXQgYXRtZWxfc2VyaWFsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgYXRtZWxfdWFydF9wb3J0ICphdG1lbF9wb3J0ID0gKHN0cnVjdCBhdG1lbF91YXJ0X3BvcnQgKikgcG9ydDsKKwlzdHJ1Y3QgYXRtZWxfdWFydF9wb3J0ICphdG1lbF9wb3J0ID0gdG9fYXRtZWxfdWFydF9wb3J0KHBvcnQpOwogCWludCByZXQgPSAwOwogCi0JY2xrX2Rpc2FibGUoYXRtZWxfcG9ydC0+Y2xrKTsKLQljbGtfcHV0KGF0bWVsX3BvcnQtPmNsayk7Ci0KIAlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMCk7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAKLQlpZiAocG9ydCkgewotCQlyZXQgPSB1YXJ0X3JlbW92ZV9vbmVfcG9ydCgmYXRtZWxfdWFydCwgcG9ydCk7Ci0JCWtmcmVlKHBvcnQpOwotCX0KKwlyZXQgPSB1YXJ0X3JlbW92ZV9vbmVfcG9ydCgmYXRtZWxfdWFydCwgcG9ydCk7CisKKwl0YXNrbGV0X2tpbGwoJmF0bWVsX3BvcnQtPnRhc2tsZXQpOworCWtmcmVlKGF0bWVsX3BvcnQtPnJ4X3JpbmcuYnVmKTsKKworCS8qICJwb3J0IiBpcyBhbGxvY2F0ZWQgc3RhdGljYWxseSwgc28gd2Ugc2hvdWxkbid0IGZyZWUgaXQgKi8KKworCWNsa19kaXNhYmxlKGF0bWVsX3BvcnQtPmNsayk7CisJY2xrX3B1dChhdG1lbF9wb3J0LT5jbGspOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2NyaXN2MTAuYyBiL2RyaXZlcnMvc2VyaWFsL2NyaXN2MTAuYwppbmRleCBhNGUyM2NmLi4zODNjNGU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9jcmlzdjEwLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvY3Jpc3YxMC5jCkBAIC02OCwxMSArNjgsNiBAQAogCiBzdHJ1Y3QgdHR5X2RyaXZlciAqc2VyaWFsX2RyaXZlcjsKIAotLyogc2VyaWFsIHN1YnR5cGUgZGVmaW5pdGlvbnMgKi8KLSNpZm5kZWYgU0VSSUFMX1RZUEVfTk9STUFMCi0jZGVmaW5lIFNFUklBTF9UWVBFX05PUk1BTAkxCi0jZW5kaWYKLQogLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgbGVmdCBpbiB4bWl0IGJ1ZmZlciBiZWZvcmUgd2UgYXNrIGZvciBtb3JlICovCiAjZGVmaW5lIFdBS0VVUF9DSEFSUyAyNTYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvZHouYyBiL2RyaXZlcnMvc2VyaWFsL2R6LmMKaW5kZXggYmJhZTVhMi4uMTE2MjExZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvZHouYworKysgYi9kcml2ZXJzL3NlcmlhbC9kei5jCkBAIC02LDcgKzYsNyBAQAogICoKICAqIEVtYWlsOiBvbGl2aWVyLmxlYmFpbGxpZkBpZnJzeXMuY29tCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA2ICBNYWNpZWogVy4gUm96eWNraQorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA2LCAyMDA3ICBNYWNpZWogVy4gUm96eWNraQogICoKICAqIFszMS1BVUctOThdIHRyaWVtZXIKICAqIENoYW5nZWQgSVJRIHRvIHVzZSBIYXJhbGQncyBkZWMgaW50ZXJuYWxzIGludGVycnVwdHMuaApAQCAtMzIsMzggKzMyLDYzIEBACiAjZGVmaW5lIFNVUFBPUlRfU1lTUlEKICNlbmRpZgogCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KLSNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAKKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCiAjaW5jbHVkZSA8YXNtL2RlYy9pbnRlcnJ1cHRzLmg+CiAjaW5jbHVkZSA8YXNtL2RlYy9rbjAxLmg+CiAjaW5jbHVkZSA8YXNtL2RlYy9rbjAyLmg+CiAjaW5jbHVkZSA8YXNtL2RlYy9tYWNodHlwZS5oPgogI2luY2x1ZGUgPGFzbS9kZWMvcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vZGVjL3N5c3RlbS5oPgogCiAjaW5jbHVkZSAiZHouaCIKIAotc3RhdGljIGNoYXIgKmR6X25hbWUgPSAiREVDc3RhdGlvbiBEWiBzZXJpYWwgZHJpdmVyIHZlcnNpb24gIjsKLXN0YXRpYyBjaGFyICpkel92ZXJzaW9uID0gIjEuMDMiOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkRFQ3N0YXRpb24gRFogc2VyaWFsIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKK3N0YXRpYyBjaGFyIGR6X25hbWVbXSBfX2luaXRkYXRhID0gIkRFQ3N0YXRpb24gRFogc2VyaWFsIGRyaXZlciB2ZXJzaW9uICI7CitzdGF0aWMgY2hhciBkel92ZXJzaW9uW10gX19pbml0ZGF0YSA9ICIxLjA0IjsKIAogc3RydWN0IGR6X3BvcnQgeworCXN0cnVjdCBkel9tdXgJCSptdXg7CiAJc3RydWN0IHVhcnRfcG9ydAlwb3J0OwogCXVuc2lnbmVkIGludAkJY2ZsYWc7CiB9OwogCi1zdGF0aWMgc3RydWN0IGR6X3BvcnQgZHpfcG9ydHNbRFpfTkJfUE9SVF07CitzdHJ1Y3QgZHpfbXV4IHsKKwlzdHJ1Y3QgZHpfcG9ydAkJZHBvcnRbRFpfTkJfUE9SVF07CisJYXRvbWljX3QJCW1hcF9ndWFyZDsKKwlhdG9taWNfdAkJaXJxX2d1YXJkOworCWludAkJCWluaXRpYWxpc2VkOworfTsKKworc3RhdGljIHN0cnVjdCBkel9tdXggZHpfbXV4OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkel9wb3J0ICp0b19kcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKHVwb3J0LCBzdHJ1Y3QgZHpfcG9ydCwgcG9ydCk7Cit9CiAKIC8qCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTc0LDIxICs5OSwxOCBAQAogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBkel9pbihzdHJ1Y3QgZHpfcG9ydCAqZHBvcnQsIHVuc2lnbmVkIG9mZnNldCkKK3N0YXRpYyB1MTYgZHpfaW4oc3RydWN0IGR6X3BvcnQgKmRwb3J0LCB1bnNpZ25lZCBvZmZzZXQpCiB7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKmFkZHIgPQotCQkodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikgKGRwb3J0LT5wb3J0Lm1lbWJhc2UgKyBvZmZzZXQpOworCXZvaWQgX19pb21lbSAqYWRkciA9IGRwb3J0LT5wb3J0Lm1lbWJhc2UgKyBvZmZzZXQ7CiAKLQlyZXR1cm4gKmFkZHI7CisJcmV0dXJuIHJlYWR3KGFkZHIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZHpfb3V0KHN0cnVjdCBkel9wb3J0ICpkcG9ydCwgdW5zaWduZWQgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKK3N0YXRpYyB2b2lkIGR6X291dChzdHJ1Y3QgZHpfcG9ydCAqZHBvcnQsIHVuc2lnbmVkIG9mZnNldCwgdTE2IHZhbHVlKQogewotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICphZGRyID0KLQkJKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopIChkcG9ydC0+cG9ydC5tZW1iYXNlICsgb2Zmc2V0KTsKKwl2b2lkIF9faW9tZW0gKmFkZHIgPSBkcG9ydC0+cG9ydC5tZW1iYXNlICsgb2Zmc2V0OwogCi0JKmFkZHIgPSB2YWx1ZTsKKwl3cml0ZXcodmFsdWUsIGFkZHIpOwogfQogCiAvKgpAQCAtMTAzLDQyICsxMjUsMzMgQEAKIAogc3RhdGljIHZvaWQgZHpfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKIHsKLQlzdHJ1Y3QgZHpfcG9ydCAqZHBvcnQgPSAoc3RydWN0IGR6X3BvcnQgKil1cG9ydDsKLQl1bnNpZ25lZCBzaG9ydCB0bXAsIG1hc2sgPSAxIDw8IGRwb3J0LT5wb3J0LmxpbmU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZHpfcG9ydCAqZHBvcnQgPSB0b19kcG9ydCh1cG9ydCk7CisJdTE2IHRtcCwgbWFzayA9IDEgPDwgZHBvcnQtPnBvcnQubGluZTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZkcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7CiAJdG1wID0gZHpfaW4oZHBvcnQsIERaX1RDUik7CS8qIHJlYWQgdGhlIFRYIGZsYWcgKi8KIAl0bXAgJj0gfm1hc2s7CQkJLyogY2xlYXIgdGhlIFRYIGZsYWcgKi8KIAlkel9vdXQoZHBvcnQsIERaX1RDUiwgdG1wKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIGR6X3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQogewotCXN0cnVjdCBkel9wb3J0ICpkcG9ydCA9IChzdHJ1Y3QgZHpfcG9ydCAqKXVwb3J0OwotCXVuc2lnbmVkIHNob3J0IHRtcCwgbWFzayA9IDEgPDwgZHBvcnQtPnBvcnQubGluZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBkel9wb3J0ICpkcG9ydCA9IHRvX2Rwb3J0KHVwb3J0KTsKKwl1MTYgdG1wLCBtYXNrID0gMSA8PCBkcG9ydC0+cG9ydC5saW5lOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKIAl0bXAgPSBkel9pbihkcG9ydCwgRFpfVENSKTsJLyogcmVhZCB0aGUgVFggZmxhZyAqLwogCXRtcCB8PSBtYXNrOwkJCS8qIHNldCB0aGUgVFggZmxhZyAqLwogCWR6X291dChkcG9ydCwgRFpfVENSLCB0bXApOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgZHpfc3RvcF9yeChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKIHsKLQlzdHJ1Y3QgZHpfcG9ydCAqZHBvcnQgPSAoc3RydWN0IGR6X3BvcnQgKil1cG9ydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBkel9wb3J0ICpkcG9ydCA9IHRvX2Rwb3J0KHVwb3J0KTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZkcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7Ci0JZHBvcnQtPmNmbGFnICY9IH5EWl9DUkVBRDsKLQlkel9vdXQoZHBvcnQsIERaX0xQUiwgZHBvcnQtPmNmbGFnIHwgZHBvcnQtPnBvcnQubGluZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHBvcnQtPnBvcnQubG9jaywgZmxhZ3MpOworCWRwb3J0LT5jZmxhZyAmPSB+RFpfUlhFTkFCOworCWR6X291dChkcG9ydCwgRFpfTFBSLCBkcG9ydC0+Y2ZsYWcpOwogfQogCi1zdGF0aWMgdm9pZCBkel9lbmFibGVfbXMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3N0YXRpYyB2b2lkIGR6X2VuYWJsZV9tcyhzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKIHsKIAkvKiBub3RoaW5nIHRvIGRvICovCiB9CkBAIC0xNzAsNzMgKzE4Myw3MyBAQAogICogVGhpcyByb3V0aW5lIGRlYWxzIHdpdGggaW5wdXRzIGZyb20gYW55IGxpbmVzLgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBkel9yZWNlaXZlX2NoYXJzKHN0cnVjdCBkel9wb3J0ICpkcG9ydF9pbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBkel9yZWNlaXZlX2NoYXJzKHN0cnVjdCBkel9tdXggKm11eCkKIHsKLQlzdHJ1Y3QgZHpfcG9ydCAqZHBvcnQ7CisJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQ7CisJc3RydWN0IGR6X3BvcnQgKmRwb3J0ID0gJm11eC0+ZHBvcnRbMF07CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IE5VTEw7CiAJc3RydWN0IHVhcnRfaWNvdW50ICppY291bnQ7CiAJaW50IGxpbmVzX3J4W0RaX05CX1BPUlRdID0geyBbMCAuLi4gRFpfTkJfUE9SVCAtIDFdID0gMCB9OwotCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKIAl1bnNpZ25lZCBjaGFyIGNoLCBmbGFnOworCXUxNiBzdGF0dXM7CiAJaW50IGk7CiAKLQl3aGlsZSAoKHN0YXR1cyA9IGR6X2luKGRwb3J0X2luLCBEWl9SQlVGKSkgJiBEWl9EVkFMKSB7Ci0JCWRwb3J0ID0gJmR6X3BvcnRzW0xJTkUoc3RhdHVzKV07Ci0JCXR0eSA9IGRwb3J0LT5wb3J0LmluZm8tPnR0eTsJLyogcG9pbnQgdG8gdGhlIHByb3BlciBkZXYgKi8KKwl3aGlsZSAoKHN0YXR1cyA9IGR6X2luKGRwb3J0LCBEWl9SQlVGKSkgJiBEWl9EVkFMKSB7CisJCWRwb3J0ID0gJm11eC0+ZHBvcnRbTElORShzdGF0dXMpXTsKKwkJdXBvcnQgPSAmZHBvcnQtPnBvcnQ7CisJCXR0eSA9IHVwb3J0LT5pbmZvLT50dHk7CQkvKiBwb2ludCB0byB0aGUgcHJvcGVyIGRldiAqLwogCiAJCWNoID0gVUNIQVIoc3RhdHVzKTsJCS8qIGdyYWIgdGhlIGNoYXIgKi8KKwkJZmxhZyA9IFRUWV9OT1JNQUw7CiAKLQkJaWNvdW50ID0gJmRwb3J0LT5wb3J0Lmljb3VudDsKKwkJaWNvdW50ID0gJnVwb3J0LT5pY291bnQ7CiAJCWljb3VudC0+cngrKzsKIAotCQlmbGFnID0gVFRZX05PUk1BTDsKLQkJaWYgKHN0YXR1cyAmIERaX0ZFUlIpIHsJCS8qIGZyYW1lIGVycm9yICovCi0JCQkvKgotCQkJICogVGhlcmUgaXMgbm8gc2VwYXJhdGUgQlJFQUsgc3RhdHVzIGJpdCwgc28KLQkJCSAqIHRyZWF0IGZyYW1pbmcgZXJyb3JzIGFzIEJSRUFLcyBmb3IgTWFnaWMgU3lzUnEKLQkJCSAqIGFuZCBTQUs7IG5vcm1hbGx5LCBvdGhlcndpc2UuCi0JCQkgKi8KLQkJCWlmICh1YXJ0X2hhbmRsZV9icmVhaygmZHBvcnQtPnBvcnQpKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGRwb3J0LT5wb3J0LmZsYWdzICYgVVBGX1NBSykKLQkJCQlmbGFnID0gVFRZX0JSRUFLOwotCQkJZWxzZQotCQkJCWZsYWcgPSBUVFlfRlJBTUU7Ci0JCX0gZWxzZSBpZiAoc3RhdHVzICYgRFpfT0VSUikJLyogb3ZlcnJ1biBlcnJvciAqLwotCQkJZmxhZyA9IFRUWV9PVkVSUlVOOwotCQllbHNlIGlmIChzdGF0dXMgJiBEWl9QRVJSKQkvKiBwYXJpdHkgZXJyb3IgKi8KLQkJCWZsYWcgPSBUVFlfUEFSSVRZOworCQlpZiAodW5saWtlbHkoc3RhdHVzICYgKERaX09FUlIgfCBEWl9GRVJSIHwgRFpfUEVSUikpKSB7CiAKLQkJLyoga2VlcCB0cmFjayBvZiB0aGUgc3RhdGlzdGljcyAqLwotCQlzd2l0Y2ggKGZsYWcpIHsKLQkJY2FzZSBUVFlfRlJBTUU6Ci0JCQlpY291bnQtPmZyYW1lKys7Ci0JCQlicmVhazsKLQkJY2FzZSBUVFlfUEFSSVRZOgotCQkJaWNvdW50LT5wYXJpdHkrKzsKLQkJCWJyZWFrOwotCQljYXNlIFRUWV9PVkVSUlVOOgotCQkJaWNvdW50LT5vdmVycnVuKys7Ci0JCQlicmVhazsKLQkJY2FzZSBUVFlfQlJFQUs6Ci0JCQlpY291bnQtPmJyaysrOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKKwkJCS8qCisJCQkgKiBUaGVyZSBpcyBubyBzZXBhcmF0ZSBCUkVBSyBzdGF0dXMgYml0LCBzbyB0cmVhdAorCQkJICogbnVsbCBjaGFyYWN0ZXJzIHdpdGggZnJhbWluZyBlcnJvcnMgYXMgQlJFQUtzOworCQkJICogbm9ybWFsbHksIG90aGVyd2lzZS4gIEZvciB0aGlzIG1vdmUgdGhlIEZyYW1pbmcKKwkJCSAqIEVycm9yIGJpdCB0byBhIHNpbXVsYXRlZCBCUkVBSyBiaXQuCisJCQkgKi8KKwkJCWlmICghY2gpIHsKKwkJCQlzdGF0dXMgfD0gKHN0YXR1cyAmIERaX0ZFUlIpID4+CisJCQkJCSAgKGZmcyhEWl9GRVJSKSAtIGZmcyhEWl9CUkVBSykpOworCQkJCXN0YXR1cyAmPSB+RFpfRkVSUjsKKwkJCX0KKworCQkJLyogSGFuZGxlIFN5c1JxL1NBSyAmIGtlZXAgdHJhY2sgb2YgdGhlIHN0YXRpc3RpY3MuICovCisJCQlpZiAoc3RhdHVzICYgRFpfQlJFQUspIHsKKwkJCQlpY291bnQtPmJyaysrOworCQkJCWlmICh1YXJ0X2hhbmRsZV9icmVhayh1cG9ydCkpCisJCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmIChzdGF0dXMgJiBEWl9GRVJSKQorCQkJCWljb3VudC0+ZnJhbWUrKzsKKwkJCWVsc2UgaWYgKHN0YXR1cyAmIERaX1BFUlIpCisJCQkJaWNvdW50LT5wYXJpdHkrKzsKKwkJCWlmIChzdGF0dXMgJiBEWl9PRVJSKQorCQkJCWljb3VudC0+b3ZlcnJ1bisrOworCisJCQlzdGF0dXMgJj0gdXBvcnQtPnJlYWRfc3RhdHVzX21hc2s7CisJCQlpZiAoc3RhdHVzICYgRFpfQlJFQUspCisJCQkJZmxhZyA9IFRUWV9CUkVBSzsKKwkJCWVsc2UgaWYgKHN0YXR1cyAmIERaX0ZFUlIpCisJCQkJZmxhZyA9IFRUWV9GUkFNRTsKKwkJCWVsc2UgaWYgKHN0YXR1cyAmIERaX1BFUlIpCisJCQkJZmxhZyA9IFRUWV9QQVJJVFk7CisKIAkJfQogCi0JCWlmICh1YXJ0X2hhbmRsZV9zeXNycV9jaGFyKCZkcG9ydC0+cG9ydCwgY2gpKQorCQlpZiAodWFydF9oYW5kbGVfc3lzcnFfY2hhcih1cG9ydCwgY2gpKQogCQkJY29udGludWU7CiAKLQkJaWYgKChzdGF0dXMgJiBkcG9ydC0+cG9ydC5pZ25vcmVfc3RhdHVzX21hc2spID09IDApIHsKLQkJCXVhcnRfaW5zZXJ0X2NoYXIoJmRwb3J0LT5wb3J0LAotCQkJCQkgc3RhdHVzLCBEWl9PRVJSLCBjaCwgZmxhZyk7Ci0JCQlsaW5lc19yeFtMSU5FKHN0YXR1cyldID0gMTsKLQkJfQorCQl1YXJ0X2luc2VydF9jaGFyKHVwb3J0LCBzdGF0dXMsIERaX09FUlIsIGNoLCBmbGFnKTsKKwkJbGluZXNfcnhbTElORShzdGF0dXMpXSA9IDE7CiAJfQogCWZvciAoaSA9IDA7IGkgPCBEWl9OQl9QT1JUOyBpKyspCiAJCWlmIChsaW5lc19yeFtpXSkKLQkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKGR6X3BvcnRzW2ldLnBvcnQuaW5mby0+dHR5KTsKKwkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKG11eC0+ZHBvcnRbaV0ucG9ydC5pbmZvLT50dHkpOwogfQogCiAvKgpAQCAtMjQ2LDE1ICsyNTksMTUgQEAKICAqIFRoaXMgcm91dGluZSBkZWFscyB3aXRoIG91dHB1dHMgdG8gYW55IGxpbmVzLgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBkel90cmFuc21pdF9jaGFycyhzdHJ1Y3QgZHpfcG9ydCAqZHBvcnRfaW4pCitzdGF0aWMgaW5saW5lIHZvaWQgZHpfdHJhbnNtaXRfY2hhcnMoc3RydWN0IGR6X211eCAqbXV4KQogewotCXN0cnVjdCBkel9wb3J0ICpkcG9ydDsKKwlzdHJ1Y3QgZHpfcG9ydCAqZHBvcnQgPSAmbXV4LT5kcG9ydFswXTsKIAlzdHJ1Y3QgY2lyY19idWYgKnhtaXQ7Ci0JdW5zaWduZWQgc2hvcnQgc3RhdHVzOwogCXVuc2lnbmVkIGNoYXIgdG1wOworCXUxNiBzdGF0dXM7CiAKLQlzdGF0dXMgPSBkel9pbihkcG9ydF9pbiwgRFpfQ1NSKTsKLQlkcG9ydCA9ICZkel9wb3J0c1tMSU5FKHN0YXR1cyldOworCXN0YXR1cyA9IGR6X2luKGRwb3J0LCBEWl9DU1IpOworCWRwb3J0ID0gJm11eC0+ZHBvcnRbTElORShzdGF0dXMpXTsKIAl4bWl0ID0gJmRwb3J0LT5wb3J0LmluZm8tPnhtaXQ7CiAKIAlpZiAoZHBvcnQtPnBvcnQueF9jaGFyKSB7CQkvKiBYT04vWE9GRiBjaGFycyAqLwpAQCAtMjY1LDcgKzI3OCw5IEBACiAJfQogCS8qIElmIG5vdGhpbmcgdG8gZG8gb3Igc3RvcHBlZCBvciBoYXJkd2FyZSBzdG9wcGVkLiAqLwogCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkgfHwgdWFydF90eF9zdG9wcGVkKCZkcG9ydC0+cG9ydCkpIHsKKwkJc3Bpbl9sb2NrKCZkcG9ydC0+cG9ydC5sb2NrKTsKIAkJZHpfc3RvcF90eCgmZHBvcnQtPnBvcnQpOworCQlzcGluX3VubG9jaygmZHBvcnQtPnBvcnQubG9jayk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTI4Miw4ICsyOTcsMTEgQEAKIAkJdWFydF93cml0ZV93YWtldXAoJmRwb3J0LT5wb3J0KTsKIAogCS8qIEFyZSB3ZSBhcmUgZG9uZS4gKi8KLQlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpKQorCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpIHsKKwkJc3Bpbl9sb2NrKCZkcG9ydC0+cG9ydC5sb2NrKTsKIAkJZHpfc3RvcF90eCgmZHBvcnQtPnBvcnQpOworCQlzcGluX3VubG9jaygmZHBvcnQtPnBvcnQubG9jayk7CisJfQogfQogCiAvKgpAQCAtMzAxLDcgKzMxOSw3IEBACiAJICogMS4gTm8gc3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHQ7IHVzZSBhIHRpbWVyLgogCSAqIDIuIEhhbmRsZSB0aGUgMzEwMC81MDAwIGFzIGFwcHJvcHJpYXRlLiAtLW1hY3JvCiAJICovCi0JdW5zaWduZWQgc2hvcnQgc3RhdHVzOworCXUxNiBzdGF0dXM7CiAKIAkvKiBJZiBub3QgdGhlIG1vZGVtIGxpbmUganVzdCByZXR1cm4uICAqLwogCWlmIChkcG9ydC0+cG9ydC5saW5lICE9IERaX01PREVNKQpAQCAtMzIyLDE5ICszNDAsMjAgQEAKICAqIEl0IGRlYWxzIHdpdGggdGhlIG11bHRpcGxlIHBvcnRzLgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBkel9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2KQorc3RhdGljIGlycXJldHVybl90IGR6X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0Jc3RydWN0IGR6X3BvcnQgKmRwb3J0ID0gZGV2OwotCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKKwlzdHJ1Y3QgZHpfbXV4ICptdXggPSBkZXZfaWQ7CisJc3RydWN0IGR6X3BvcnQgKmRwb3J0ID0gJm11eC0+ZHBvcnRbMF07CisJdTE2IHN0YXR1czsKIAogCS8qIGdldCB0aGUgcmVhc29uIHdoeSB3ZSBqdXN0IGdvdCBhbiBpcnEgKi8KIAlzdGF0dXMgPSBkel9pbihkcG9ydCwgRFpfQ1NSKTsKIAogCWlmICgoc3RhdHVzICYgKERaX1JET05FIHwgRFpfUklFKSkgPT0gKERaX1JET05FIHwgRFpfUklFKSkKLQkJZHpfcmVjZWl2ZV9jaGFycyhkcG9ydCk7CisJCWR6X3JlY2VpdmVfY2hhcnMobXV4KTsKIAogCWlmICgoc3RhdHVzICYgKERaX1RSRFkgfCBEWl9USUUpKSA9PSAoRFpfVFJEWSB8IERaX1RJRSkpCi0JCWR6X3RyYW5zbWl0X2NoYXJzKGRwb3J0KTsKKwkJZHpfdHJhbnNtaXRfY2hhcnMobXV4KTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTM1MCw3ICszNjksNyBAQAogCS8qCiAJICogRklYTUU6IEhhbmRsZSB0aGUgMzEwMC81MDAwIGFzIGFwcHJvcHJpYXRlLiAtLW1hY3JvCiAJICovCi0Jc3RydWN0IGR6X3BvcnQgKmRwb3J0ID0gKHN0cnVjdCBkel9wb3J0ICopdXBvcnQ7CisJc3RydWN0IGR6X3BvcnQgKmRwb3J0ID0gdG9fZHBvcnQodXBvcnQpOwogCXVuc2lnbmVkIGludCBtY3RybCA9IFRJT0NNX0NBUiB8IFRJT0NNX0RTUiB8IFRJT0NNX0NUUzsKIAogCWlmIChkcG9ydC0+cG9ydC5saW5lID09IERaX01PREVNKSB7CkBAIC0zNjYsOCArMzg1LDggQEAKIAkvKgogCSAqIEZJWE1FOiBIYW5kbGUgdGhlIDMxMDAvNTAwMCBhcyBhcHByb3ByaWF0ZS4gLS1tYWNybwogCSAqLwotCXN0cnVjdCBkel9wb3J0ICpkcG9ydCA9IChzdHJ1Y3QgZHpfcG9ydCAqKXVwb3J0OwotCXVuc2lnbmVkIHNob3J0IHRtcDsKKwlzdHJ1Y3QgZHpfcG9ydCAqZHBvcnQgPSB0b19kcG9ydCh1cG9ydCk7CisJdTE2IHRtcDsKIAogCWlmIChkcG9ydC0+cG9ydC5saW5lID09IERaX01PREVNKSB7CiAJCXRtcCA9IGR6X2luKGRwb3J0LCBEWl9UQ1IpOwpAQCAtMzg4LDE1ICs0MDcsMzAgQEAKICAqLwogc3RhdGljIGludCBkel9zdGFydHVwKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQogewotCXN0cnVjdCBkel9wb3J0ICpkcG9ydCA9IChzdHJ1Y3QgZHpfcG9ydCAqKXVwb3J0OworCXN0cnVjdCBkel9wb3J0ICpkcG9ydCA9IHRvX2Rwb3J0KHVwb3J0KTsKKwlzdHJ1Y3QgZHpfbXV4ICptdXggPSBkcG9ydC0+bXV4OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgc2hvcnQgdG1wOworCWludCBpcnFfZ3VhcmQ7CisJaW50IHJldDsKKwl1MTYgdG1wOworCisJaXJxX2d1YXJkID0gYXRvbWljX2FkZF9yZXR1cm4oMSwgJm11eC0+aXJxX2d1YXJkKTsKKwlpZiAoaXJxX2d1YXJkICE9IDEpCisJCXJldHVybiAwOworCisJcmV0ID0gcmVxdWVzdF9pcnEoZHBvcnQtPnBvcnQuaXJxLCBkel9pbnRlcnJ1cHQsCisJCQkgIElSUUZfU0hBUkVELCAiZHoiLCBtdXgpOworCWlmIChyZXQpIHsKKwkJYXRvbWljX2FkZCgtMSwgJm11eC0+aXJxX2d1YXJkKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJkejogQ2Fubm90IGdldCBJUlEgJWQhXG4iLCBkcG9ydC0+cG9ydC5pcnEpOworCQlyZXR1cm4gcmV0OworCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7CiAKLQkvKiBlbmFibGUgdGhlIGludGVycnVwdCBhbmQgdGhlIHNjYW5uaW5nICovCisJLyogRW5hYmxlIGludGVycnVwdHMuICAqLwogCXRtcCA9IGR6X2luKGRwb3J0LCBEWl9DU1IpOwotCXRtcCB8PSBEWl9SSUUgfCBEWl9USUUgfCBEWl9NU0U7CisJdG1wIHw9IERaX1JJRSB8IERaX1RJRTsKIAlkel9vdXQoZHBvcnQsIERaX0NTUiwgdG1wKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKQEAgLTQxNCw3ICs0NDgsMjUgQEAKICAqLwogc3RhdGljIHZvaWQgZHpfc2h1dGRvd24oc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCiB7Ci0JZHpfc3RvcF90eCh1cG9ydCk7CisJc3RydWN0IGR6X3BvcnQgKmRwb3J0ID0gdG9fZHBvcnQodXBvcnQpOworCXN0cnVjdCBkel9tdXggKm11eCA9IGRwb3J0LT5tdXg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaXJxX2d1YXJkOworCXUxNiB0bXA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHBvcnQtPnBvcnQubG9jaywgZmxhZ3MpOworCWR6X3N0b3BfdHgoJmRwb3J0LT5wb3J0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7CisKKwlpcnFfZ3VhcmQgPSBhdG9taWNfYWRkX3JldHVybigtMSwgJm11eC0+aXJxX2d1YXJkKTsKKwlpZiAoIWlycV9ndWFyZCkgeworCQkvKiBEaXNhYmxlIGludGVycnVwdHMuICAqLworCQl0bXAgPSBkel9pbihkcG9ydCwgRFpfQ1NSKTsKKwkJdG1wICY9IH4oRFpfUklFIHwgRFpfVElFKTsKKwkJZHpfb3V0KGRwb3J0LCBEWl9DU1IsIHRtcCk7CisKKwkJZnJlZV9pcnEoZHBvcnQtPnBvcnQuaXJxLCBtdXgpOworCX0KIH0KIAogLyoKQEAgLTQzMSw3ICs0ODMsNyBAQAogICovCiBzdGF0aWMgdW5zaWduZWQgaW50IGR6X3R4X2VtcHR5KHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQogewotCXN0cnVjdCBkel9wb3J0ICpkcG9ydCA9IChzdHJ1Y3QgZHpfcG9ydCAqKXVwb3J0OworCXN0cnVjdCBkel9wb3J0ICpkcG9ydCA9IHRvX2Rwb3J0KHVwb3J0KTsKIAl1bnNpZ25lZCBzaG9ydCB0bXAsIG1hc2sgPSAxIDw8IGRwb3J0LT5wb3J0LmxpbmU7CiAKIAl0bXAgPSBkel9pbihkcG9ydCwgRFpfVENSKTsKQEAgLTQ0Niw3ICs0OTgsNyBAQAogCSAqIEZJWE1FOiBDYW4ndCBhY2Nlc3MgQlJFQUsgYml0cyBpbiBURFIgZWFzaWx5OwogCSAqIHJldXNlIHRoZSBjb2RlIGZvciBwb2xsZWQgVFguIC0tbWFjcm8KIAkgKi8KLQlzdHJ1Y3QgZHpfcG9ydCAqZHBvcnQgPSAoc3RydWN0IGR6X3BvcnQgKil1cG9ydDsKKwlzdHJ1Y3QgZHpfcG9ydCAqZHBvcnQgPSB0b19kcG9ydCh1cG9ydCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBzaG9ydCB0bXAsIG1hc2sgPSAxIDw8IGRwb3J0LT5wb3J0LmxpbmU7CiAKQEAgLTQ2MCwxMiArNTEyLDY5IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXBvcnQtPmxvY2ssIGZsYWdzKTsKIH0KIAorc3RhdGljIGludCBkel9lbmNvZGVfYmF1ZF9yYXRlKHVuc2lnbmVkIGludCBiYXVkKQoreworCXN3aXRjaCAoYmF1ZCkgeworCWNhc2UgNTA6CisJCXJldHVybiBEWl9CNTA7CisJY2FzZSA3NToKKwkJcmV0dXJuIERaX0I3NTsKKwljYXNlIDExMDoKKwkJcmV0dXJuIERaX0IxMTA7CisJY2FzZSAxMzQ6CisJCXJldHVybiBEWl9CMTM0OworCWNhc2UgMTUwOgorCQlyZXR1cm4gRFpfQjE1MDsKKwljYXNlIDMwMDoKKwkJcmV0dXJuIERaX0IzMDA7CisJY2FzZSA2MDA6CisJCXJldHVybiBEWl9CNjAwOworCWNhc2UgMTIwMDoKKwkJcmV0dXJuIERaX0IxMjAwOworCWNhc2UgMTgwMDoKKwkJcmV0dXJuIERaX0IxODAwOworCWNhc2UgMjAwMDoKKwkJcmV0dXJuIERaX0IyMDAwOworCWNhc2UgMjQwMDoKKwkJcmV0dXJuIERaX0IyNDAwOworCWNhc2UgMzYwMDoKKwkJcmV0dXJuIERaX0IzNjAwOworCWNhc2UgNDgwMDoKKwkJcmV0dXJuIERaX0I0ODAwOworCWNhc2UgNzIwMDoKKwkJcmV0dXJuIERaX0I3MjAwOworCWNhc2UgOTYwMDoKKwkJcmV0dXJuIERaX0I5NjAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgZHpfcmVzZXQoc3RydWN0IGR6X3BvcnQgKmRwb3J0KQoreworCXN0cnVjdCBkel9tdXggKm11eCA9IGRwb3J0LT5tdXg7CisKKwlpZiAobXV4LT5pbml0aWFsaXNlZCkKKwkJcmV0dXJuOworCisJZHpfb3V0KGRwb3J0LCBEWl9DU1IsIERaX0NMUik7CisJd2hpbGUgKGR6X2luKGRwb3J0LCBEWl9DU1IpICYgRFpfQ0xSKTsKKwlpb2IoKTsKKworCS8qIEVuYWJsZSBzY2FubmluZy4gICovCisJZHpfb3V0KGRwb3J0LCBEWl9DU1IsIERaX01TRSk7CisKKwltdXgtPmluaXRpYWxpc2VkID0gMTsKK30KKwogc3RhdGljIHZvaWQgZHpfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQsIHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcywKIAkJCSAgIHN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7Ci0Jc3RydWN0IGR6X3BvcnQgKmRwb3J0ID0gKHN0cnVjdCBkel9wb3J0ICopdXBvcnQ7CisJc3RydWN0IGR6X3BvcnQgKmRwb3J0ID0gdG9fZHBvcnQodXBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGNmbGFnLCBiYXVkOworCWludCBiZmxhZzsKIAogCWNmbGFnID0gZHBvcnQtPnBvcnQubGluZTsKIApAQCAtNDkyLDEwNSArNjAxLDEyNyBAQAogCQljZmxhZyB8PSBEWl9QQVJPREQ7CiAKIAliYXVkID0gdWFydF9nZXRfYmF1ZF9yYXRlKHVwb3J0LCB0ZXJtaW9zLCBvbGRfdGVybWlvcywgNTAsIDk2MDApOwotCXN3aXRjaCAoYmF1ZCkgewotCWNhc2UgNTA6Ci0JCWNmbGFnIHw9IERaX0I1MDsKLQkJYnJlYWs7Ci0JY2FzZSA3NToKLQkJY2ZsYWcgfD0gRFpfQjc1OwotCQlicmVhazsKLQljYXNlIDExMDoKLQkJY2ZsYWcgfD0gRFpfQjExMDsKLQkJYnJlYWs7Ci0JY2FzZSAxMzQ6Ci0JCWNmbGFnIHw9IERaX0IxMzQ7Ci0JCWJyZWFrOwotCWNhc2UgMTUwOgotCQljZmxhZyB8PSBEWl9CMTUwOwotCQlicmVhazsKLQljYXNlIDMwMDoKLQkJY2ZsYWcgfD0gRFpfQjMwMDsKLQkJYnJlYWs7Ci0JY2FzZSA2MDA6Ci0JCWNmbGFnIHw9IERaX0I2MDA7Ci0JCWJyZWFrOwotCWNhc2UgMTIwMDoKLQkJY2ZsYWcgfD0gRFpfQjEyMDA7Ci0JCWJyZWFrOwotCWNhc2UgMTgwMDoKLQkJY2ZsYWcgfD0gRFpfQjE4MDA7Ci0JCWJyZWFrOwotCWNhc2UgMjAwMDoKLQkJY2ZsYWcgfD0gRFpfQjIwMDA7Ci0JCWJyZWFrOwotCWNhc2UgMjQwMDoKLQkJY2ZsYWcgfD0gRFpfQjI0MDA7Ci0JCWJyZWFrOwotCWNhc2UgMzYwMDoKLQkJY2ZsYWcgfD0gRFpfQjM2MDA7Ci0JCWJyZWFrOwotCWNhc2UgNDgwMDoKLQkJY2ZsYWcgfD0gRFpfQjQ4MDA7Ci0JCWJyZWFrOwotCWNhc2UgNzIwMDoKLQkJY2ZsYWcgfD0gRFpfQjcyMDA7Ci0JCWJyZWFrOwotCWNhc2UgOTYwMDoKLQlkZWZhdWx0OgotCQljZmxhZyB8PSBEWl9COTYwMDsKKwliZmxhZyA9IGR6X2VuY29kZV9iYXVkX3JhdGUoYmF1ZCk7CisJaWYgKGJmbGFnIDwgMCkJewkJCS8qIFRyeSB0byBrZWVwIHVuY2hhbmdlZC4gICovCisJCWJhdWQgPSB1YXJ0X2dldF9iYXVkX3JhdGUodXBvcnQsIG9sZF90ZXJtaW9zLCBOVUxMLCA1MCwgOTYwMCk7CisJCWJmbGFnID0gZHpfZW5jb2RlX2JhdWRfcmF0ZShiYXVkKTsKKwkJaWYgKGJmbGFnIDwgMCkJewkJLyogUmVzb3J0IHRvIDk2MDAuICAqLworCQkJYmF1ZCA9IDk2MDA7CisJCQliZmxhZyA9IERaX0I5NjAwOworCQl9CisJCXR0eV90ZXJtaW9zX2VuY29kZV9iYXVkX3JhdGUodGVybWlvcywgYmF1ZCwgYmF1ZCk7CiAJfQorCWNmbGFnIHw9IGJmbGFnOwogCiAJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBDUkVBRCkKIAkJY2ZsYWcgfD0gRFpfUlhFTkFCOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKIAotCWR6X291dChkcG9ydCwgRFpfTFBSLCBjZmxhZyB8IGRwb3J0LT5wb3J0LmxpbmUpOworCXVhcnRfdXBkYXRlX3RpbWVvdXQodXBvcnQsIHRlcm1pb3MtPmNfY2ZsYWcsIGJhdWQpOworCisJZHpfb3V0KGRwb3J0LCBEWl9MUFIsIGNmbGFnKTsKIAlkcG9ydC0+Y2ZsYWcgPSBjZmxhZzsKIAogCS8qIHNldHVwIGFjY2VwdCBmbGFnICovCiAJZHBvcnQtPnBvcnQucmVhZF9zdGF0dXNfbWFzayA9IERaX09FUlI7CiAJaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiBJTlBDSykKIAkJZHBvcnQtPnBvcnQucmVhZF9zdGF0dXNfbWFzayB8PSBEWl9GRVJSIHwgRFpfUEVSUjsKKwlpZiAodGVybWlvcy0+Y19pZmxhZyAmIChCUktJTlQgfCBQQVJNUkspKQorCQlkcG9ydC0+cG9ydC5yZWFkX3N0YXR1c19tYXNrIHw9IERaX0JSRUFLOwogCiAJLyogY2hhcmFjdGVycyB0byBpZ25vcmUgKi8KIAl1cG9ydC0+aWdub3JlX3N0YXR1c19tYXNrID0gMDsKKwlpZiAoKHRlcm1pb3MtPmNfaWZsYWcgJiAoSUdOUEFSIHwgSUdOQlJLKSkgPT0gKElHTlBBUiB8IElHTkJSSykpCisJCWRwb3J0LT5wb3J0Lmlnbm9yZV9zdGF0dXNfbWFzayB8PSBEWl9PRVJSOwogCWlmICh0ZXJtaW9zLT5jX2lmbGFnICYgSUdOUEFSKQogCQlkcG9ydC0+cG9ydC5pZ25vcmVfc3RhdHVzX21hc2sgfD0gRFpfRkVSUiB8IERaX1BFUlI7CisJaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiBJR05CUkspCisJCWRwb3J0LT5wb3J0Lmlnbm9yZV9zdGF0dXNfbWFzayB8PSBEWl9CUkVBSzsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIGNvbnN0IGNoYXIgKmR6X3R5cGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3N0YXRpYyBjb25zdCBjaGFyICpkel90eXBlKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0KQogewogCXJldHVybiAiRFoiOwogfQogCi1zdGF0aWMgdm9pZCBkel9yZWxlYXNlX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3N0YXRpYyB2b2lkIGR6X3JlbGVhc2VfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKIHsKLQkvKiBub3RoaW5nIHRvIGRvICovCisJc3RydWN0IGR6X211eCAqbXV4ID0gdG9fZHBvcnQodXBvcnQpLT5tdXg7CisJaW50IG1hcF9ndWFyZDsKKworCWlvdW5tYXAodXBvcnQtPm1lbWJhc2UpOworCXVwb3J0LT5tZW1iYXNlID0gTlVMTDsKKworCW1hcF9ndWFyZCA9IGF0b21pY19hZGRfcmV0dXJuKC0xLCAmbXV4LT5tYXBfZ3VhcmQpOworCWlmICghbWFwX2d1YXJkKQorCQlyZWxlYXNlX21lbV9yZWdpb24odXBvcnQtPm1hcGJhc2UsIGRlY19rbl9zbG90X3NpemUpOwogfQogCi1zdGF0aWMgaW50IGR6X3JlcXVlc3RfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQorc3RhdGljIGludCBkel9tYXBfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCkKIHsKKwlpZiAoIXVwb3J0LT5tZW1iYXNlKQorCQl1cG9ydC0+bWVtYmFzZSA9IGlvcmVtYXBfbm9jYWNoZSh1cG9ydC0+bWFwYmFzZSwKKwkJCQkJCSBkZWNfa25fc2xvdF9zaXplKTsKKwlpZiAoIXVwb3J0LT5tZW1iYXNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZHo6IENhbm5vdCBtYXAgTU1JT1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZHpfY29uZmlnX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50IGZsYWdzKQorc3RhdGljIGludCBkel9yZXF1ZXN0X3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQpCiB7Ci0JaWYgKGZsYWdzICYgVUFSVF9DT05GSUdfVFlQRSkKLQkJcG9ydC0+dHlwZSA9IFBPUlRfRFo7CisJc3RydWN0IGR6X211eCAqbXV4ID0gdG9fZHBvcnQodXBvcnQpLT5tdXg7CisJaW50IG1hcF9ndWFyZDsKKwlpbnQgcmV0OworCisJbWFwX2d1YXJkID0gYXRvbWljX2FkZF9yZXR1cm4oMSwgJm11eC0+bWFwX2d1YXJkKTsKKwlpZiAobWFwX2d1YXJkID09IDEpIHsKKwkJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24odXBvcnQtPm1hcGJhc2UsIGRlY19rbl9zbG90X3NpemUsCisJCQkJCSJkeiIpKSB7CisJCQlhdG9taWNfYWRkKC0xLCAmbXV4LT5tYXBfZ3VhcmQpOworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgImR6OiBVbmFibGUgdG8gcmVzZXJ2ZSBNTUlPIHJlc291cmNlXG4iKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisJcmV0ID0gZHpfbWFwX3BvcnQodXBvcnQpOworCWlmIChyZXQpIHsKKwkJbWFwX2d1YXJkID0gYXRvbWljX2FkZF9yZXR1cm4oLTEsICZtdXgtPm1hcF9ndWFyZCk7CisJCWlmICghbWFwX2d1YXJkKQorCQkJcmVsZWFzZV9tZW1fcmVnaW9uKHVwb3J0LT5tYXBiYXNlLCBkZWNfa25fc2xvdF9zaXplKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGR6X2NvbmZpZ19wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0LCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGR6X3BvcnQgKmRwb3J0ID0gdG9fZHBvcnQodXBvcnQpOworCisJaWYgKGZsYWdzICYgVUFSVF9DT05GSUdfVFlQRSkgeworCQlpZiAoZHpfcmVxdWVzdF9wb3J0KHVwb3J0KSkKKwkJCXJldHVybjsKKworCQl1cG9ydC0+dHlwZSA9IFBPUlRfRFo7CisKKwkJZHpfcmVzZXQoZHBvcnQpOworCX0KIH0KIAogLyoKLSAqIHZlcmlmeSB0aGUgbmV3IHNlcmlhbF9zdHJ1Y3QgKGZvciBUSU9DU1NFUklBTCkuCisgKiBWZXJpZnkgdGhlIG5ldyBzZXJpYWxfc3RydWN0IChmb3IgVElPQ1NTRVJJQUwpLgogICovCi1zdGF0aWMgaW50IGR6X3ZlcmlmeV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBzZXJpYWxfc3RydWN0ICpzZXIpCitzdGF0aWMgaW50IGR6X3ZlcmlmeV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0LCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqc2VyKQogewogCWludCByZXQgPSAwOworCiAJaWYgKHNlci0+dHlwZSAhPSBQT1JUX1VOS05PV04gJiYgc2VyLT50eXBlICE9IFBPUlRfRFopCiAJCXJldCA9IC1FSU5WQUw7Ci0JaWYgKHNlci0+aXJxICE9IHBvcnQtPmlycSkKKwlpZiAoc2VyLT5pcnEgIT0gdXBvcnQtPmlycSkKIAkJcmV0ID0gLUVJTlZBTDsKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjE3LDQyICs3NDgsMzQgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBkel9pbml0X3BvcnRzKHZvaWQpCiB7CiAJc3RhdGljIGludCBmaXJzdCA9IDE7Ci0Jc3RydWN0IGR6X3BvcnQgKmRwb3J0OwogCXVuc2lnbmVkIGxvbmcgYmFzZTsKLQlpbnQgaTsKKwlpbnQgbGluZTsKIAogCWlmICghZmlyc3QpCiAJCXJldHVybjsKIAlmaXJzdCA9IDA7CiAKLQlpZiAobWlwc19tYWNodHlwZSA9PSBNQUNIX0RTMjMxMDAgfHwKLQkgICAgbWlwc19tYWNodHlwZSA9PSBNQUNIX0RTNTEwMCkKLQkJYmFzZSA9IENLU0VHMUFERFIoS04wMV9TTE9UX0JBU0UgKyBLTjAxX0RaMTEpOworCWlmIChtaXBzX21hY2h0eXBlID09IE1BQ0hfRFMyMzEwMCB8fCBtaXBzX21hY2h0eXBlID09IE1BQ0hfRFM1MTAwKQorCQliYXNlID0gZGVjX2tuX3Nsb3RfYmFzZSArIEtOMDFfRFoxMTsKIAllbHNlCi0JCWJhc2UgPSBDS1NFRzFBRERSKEtOMDJfU0xPVF9CQVNFICsgS04wMl9EWjExKTsKKwkJYmFzZSA9IGRlY19rbl9zbG90X2Jhc2UgKyBLTjAyX0RaMTE7CiAKLQlmb3IgKGkgPSAwLCBkcG9ydCA9IGR6X3BvcnRzOyBpIDwgRFpfTkJfUE9SVDsgaSsrLCBkcG9ydCsrKSB7Ci0JCXNwaW5fbG9ja19pbml0KCZkcG9ydC0+cG9ydC5sb2NrKTsKLQkJZHBvcnQtPnBvcnQubWVtYmFzZQk9IChjaGFyICopIGJhc2U7Ci0JCWRwb3J0LT5wb3J0LmlvdHlwZQk9IFVQSU9fTUVNOwotCQlkcG9ydC0+cG9ydC5pcnEJCT0gZGVjX2ludGVycnVwdFtERUNfSVJRX0RaMTFdOwotCQlkcG9ydC0+cG9ydC5saW5lCT0gaTsKLQkJZHBvcnQtPnBvcnQuZmlmb3NpemUJPSAxOwotCQlkcG9ydC0+cG9ydC5vcHMJCT0gJmR6X29wczsKLQkJZHBvcnQtPnBvcnQuZmxhZ3MJPSBVUEZfQk9PVF9BVVRPQ09ORjsKKwlmb3IgKGxpbmUgPSAwOyBsaW5lIDwgRFpfTkJfUE9SVDsgbGluZSsrKSB7CisJCXN0cnVjdCBkel9wb3J0ICpkcG9ydCA9ICZkel9tdXguZHBvcnRbbGluZV07CisJCXN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0ID0gJmRwb3J0LT5wb3J0OworCisJCWRwb3J0LT5tdXgJPSAmZHpfbXV4OworCisJCXVwb3J0LT5pcnEJPSBkZWNfaW50ZXJydXB0W0RFQ19JUlFfRFoxMV07CisJCXVwb3J0LT5maWZvc2l6ZQk9IDE7CisJCXVwb3J0LT5pb3R5cGUJPSBVUElPX01FTTsKKwkJdXBvcnQtPmZsYWdzCT0gVVBGX0JPT1RfQVVUT0NPTkY7CisJCXVwb3J0LT5vcHMJPSAmZHpfb3BzOworCQl1cG9ydC0+bGluZQk9IGxpbmU7CisJCXVwb3J0LT5tYXBiYXNlCT0gYmFzZTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGR6X3Jlc2V0KHN0cnVjdCBkel9wb3J0ICpkcG9ydCkKLXsKLQlkel9vdXQoZHBvcnQsIERaX0NTUiwgRFpfQ0xSKTsKLQl3aGlsZSAoZHpfaW4oZHBvcnQsIERaX0NTUikgJiBEWl9DTFIpOwotCWlvYigpOwotCi0JLyogZW5hYmxlIHNjYW5uaW5nICovCi0JZHpfb3V0KGRwb3J0LCBEWl9DU1IsIERaX01TRSk7Ci19Ci0KICNpZmRlZiBDT05GSUdfU0VSSUFMX0RaX0NPTlNPTEUKIC8qCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC02NzAsNyArNzkzLDcgQEAKICAqLwogc3RhdGljIHZvaWQgZHpfY29uc29sZV9wdXRjaGFyKHN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0LCBpbnQgY2gpCiB7Ci0Jc3RydWN0IGR6X3BvcnQgKmRwb3J0ID0gKHN0cnVjdCBkel9wb3J0ICopdXBvcnQ7CisJc3RydWN0IGR6X3BvcnQgKmRwb3J0ID0gdG9fZHBvcnQodXBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgc2hvcnQgY3NyLCB0Y3IsIHRyZHksIG1hc2s7CiAJaW50IGxvb3BzID0gMTAwMDA7CkBAIC02ODUsNyArODA4LDcgQEAKIAlpb2IoKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7CiAKLQl3aGlsZSAobG9vcHMtLSkgeworCWRvIHsKIAkJdHJkeSA9IGR6X2luKGRwb3J0LCBEWl9DU1IpOwogCQlpZiAoISh0cmR5ICYgRFpfVFJEWSkpCiAJCQljb250aW51ZTsKQEAgLTY5Niw3ICs4MTksNyBAQAogCQlkel9vdXQoZHBvcnQsIERaX1RDUiwgbWFzayk7CiAJCWlvYigpOwogCQl1ZGVsYXkoMik7Ci0JfQorCX0gd2hpbGUgKGxvb3BzLS0pOwogCiAJaWYgKGxvb3BzKQkJCQkvKiBDYW5ub3Qgc2VuZCBvdGhlcndpc2UuICovCiAJCWR6X291dChkcG9ydCwgRFpfVERSLCBjaCk7CkBAIC03MTcsNyArODQwLDcgQEAKIAkJCSAgICAgY29uc3QgY2hhciAqc3RyLAogCQkJICAgICB1bnNpZ25lZCBpbnQgY291bnQpCiB7Ci0Jc3RydWN0IGR6X3BvcnQgKmRwb3J0ID0gJmR6X3BvcnRzW2NvLT5pbmRleF07CisJc3RydWN0IGR6X3BvcnQgKmRwb3J0ID0gJmR6X211eC5kcG9ydFtjby0+aW5kZXhdOwogI2lmZGVmIERFQlVHX0RaCiAJcHJvbV9wcmludGYoKGNoYXIgKikgc3RyKTsKICNlbmRpZgpAQCAtNzI2LDIyICs4NDksMjggQEAKIAogc3RhdGljIGludCBfX2luaXQgZHpfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCiB7Ci0Jc3RydWN0IGR6X3BvcnQgKmRwb3J0ID0gJmR6X3BvcnRzW2NvLT5pbmRleF07CisJc3RydWN0IGR6X3BvcnQgKmRwb3J0ID0gJmR6X211eC5kcG9ydFtjby0+aW5kZXhdOworCXN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0ID0gJmRwb3J0LT5wb3J0OwogCWludCBiYXVkID0gOTYwMDsKIAlpbnQgYml0cyA9IDg7CiAJaW50IHBhcml0eSA9ICduJzsKIAlpbnQgZmxvdyA9ICduJzsKKwlpbnQgcmV0OworCisJcmV0ID0gZHpfbWFwX3BvcnQodXBvcnQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlkel9yZXNldChkcG9ydCk7CiAKIAlpZiAob3B0aW9ucykKIAkJdWFydF9wYXJzZV9vcHRpb25zKG9wdGlvbnMsICZiYXVkLCAmcGFyaXR5LCAmYml0cywgJmZsb3cpOwogCi0JZHpfcmVzZXQoZHBvcnQpOwotCiAJcmV0dXJuIHVhcnRfc2V0X29wdGlvbnMoJmRwb3J0LT5wb3J0LCBjbywgYmF1ZCwgcGFyaXR5LCBiaXRzLCBmbG93KTsKIH0KIAogc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBkel9yZWc7Ci1zdGF0aWMgc3RydWN0IGNvbnNvbGUgZHpfc2VyY29ucyA9IHsKK3N0YXRpYyBzdHJ1Y3QgY29uc29sZSBkel9jb25zb2xlID0gewogCS5uYW1lCT0gInR0eVMiLAogCS53cml0ZQk9IGR6X2NvbnNvbGVfcHJpbnQsCiAJLmRldmljZQk9IHVhcnRfY29uc29sZV9kZXZpY2UsCkBAIC03NTUsNyArODg0LDcgQEAKIHsKIAlpZiAoIUlPQVNJQykgewogCQlkel9pbml0X3BvcnRzKCk7Ci0JCXJlZ2lzdGVyX2NvbnNvbGUoJmR6X3NlcmNvbnMpOworCQlyZWdpc3Rlcl9jb25zb2xlKCZkel9jb25zb2xlKTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlCiAJCXJldHVybiAtRU5YSU87CkBAIC03NjMsNyArODkyLDcgQEAKIAogY29uc29sZV9pbml0Y2FsbChkel9zZXJpYWxfY29uc29sZV9pbml0KTsKIAotI2RlZmluZSBTRVJJQUxfRFpfQ09OU09MRQkmZHpfc2VyY29ucworI2RlZmluZSBTRVJJQUxfRFpfQ09OU09MRQkmZHpfY29uc29sZQogI2Vsc2UKICNkZWZpbmUgU0VSSUFMX0RaX0NPTlNPTEUJTlVMTAogI2VuZGlmIC8qIENPTkZJR19TRVJJQUxfRFpfQ09OU09MRSAqLwpAQCAtNzg5LDI2ICs5MTgsMTQgQEAKIAogCWR6X2luaXRfcG9ydHMoKTsKIAotI2lmbmRlZiBDT05GSUdfU0VSSUFMX0RaX0NPTlNPTEUKLQkvKiByZXNldCB0aGUgY2hpcCAqLwotCWR6X3Jlc2V0KCZkel9wb3J0c1swXSk7Ci0jZW5kaWYKLQotCWlmIChyZXF1ZXN0X2lycShkel9wb3J0c1swXS5wb3J0LmlycSwgZHpfaW50ZXJydXB0LAotCQkJSVJRRl9ESVNBQkxFRCwgIkRaIiwgJmR6X3BvcnRzWzBdKSkKLQkJcGFuaWMoIlVuYWJsZSB0byByZWdpc3RlciBEWiBpbnRlcnJ1cHQiKTsKLQogCXJldCA9IHVhcnRfcmVnaXN0ZXJfZHJpdmVyKCZkel9yZWcpOwotCWlmIChyZXQgIT0gMCkKKwlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJZm9yIChpID0gMDsgaSA8IERaX05CX1BPUlQ7IGkrKykKLQkJdWFydF9hZGRfb25lX3BvcnQoJmR6X3JlZywgJmR6X3BvcnRzW2ldLnBvcnQpOworCQl1YXJ0X2FkZF9vbmVfcG9ydCgmZHpfcmVnLCAmZHpfbXV4LmRwb3J0W2ldLnBvcnQpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogbW9kdWxlX2luaXQoZHpfaW5pdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiREVDc3RhdGlvbiBEWiBzZXJpYWwgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9kei5oIGIvZHJpdmVycy9zZXJpYWwvZHouaAppbmRleCA5Njc0ZDRlLi5mYWYxNjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9kei5oCisrKyBiL2RyaXZlcnMvc2VyaWFsL2R6LmgKQEAgLTMzLDYgKzMzLDggQEAKICNkZWZpbmUgRFpfRkVSUiAgICAgICAgMHgyMDAwICAgICAgICAgICAgICAgICAvKiBGcmFtZSBlcnJvciBpbmRpY2F0b3IgKi8KICNkZWZpbmUgRFpfUEVSUiAgICAgICAgMHgxMDAwICAgICAgICAgICAgICAgICAvKiBQYXJpdHkgZXJyb3IgaW5kaWNhdG9yICovCiAKKyNkZWZpbmUgRFpfQlJFQUsgICAgICAgMHgwODAwICAgICAgICAgICAgICAgICAvKiBCUkVBSyBldmVudCBzb2Z0d2FyZSBmbGFnICovCisKICNkZWZpbmUgTElORSh4KSAoKHggJiBEWl9MSU5FX01BU0spID4+IDgpICAgICAvKiBHZXQgdGhlIGxpbmUgbnVtYmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgaW5wdXQgYnVmZmVyICovCiAjZGVmaW5lIFVDSEFSKHgpICgodW5zaWduZWQgY2hhcikoeCAmIERaX1JCVUZfTUFTSykpCkBAIC0xMDcsOCArMTA5LDggQEAKICNkZWZpbmUgRFpfQjcyMDAgICAgICAgICAweDBEMDAKICNkZWZpbmUgRFpfQjk2MDAgICAgICAgICAweDBFMDAKIAotI2RlZmluZSBEWl9DUkVBRCAgICAgICAgIDB4MTAwMCAgICAgICAgICAgICAgIC8qIEVuYWJsZSByZWNlaXZlciAqLwotI2RlZmluZSBEWl9SWEVOQUIgICAgICAgIDB4MTAwMCAgICAgICAgICAgICAgIC8qIGVuYWJsZSByZWNlaXZlIGNoYXIgKi8KKyNkZWZpbmUgRFpfUlhFTkFCICAgICAgICAweDEwMDAgICAgICAgICAgICAgICAvKiBSZWNlaXZlciBFbmFibGUgKi8KKwogLyoKICAqIEFkZHJlc3NlcyBmb3IgdGhlIERaIHJlZ2lzdGVycwogICovCkBAIC0xMjQsOSArMTI2LDQgQEAKICNkZWZpbmUgRFpfWE1JVF9TSVpFICAgNDA5NiAgICAgICAgICAgICAgICAgLyogYnVmZmVyIHNpemUgKi8KICNkZWZpbmUgRFpfV0FLRVVQX0NIQVJTICAgRFpfWE1JVF9TSVpFLzQKIAotI2lmZGVmIE1PRFVMRQotaW50IGluaXRfbW9kdWxlICh2b2lkKQotdm9pZCBjbGVhbnVwX21vZHVsZSAodm9pZCkKLSNlbmRpZgotCiAjZW5kaWYgLyogRFpfU0VSSUFMX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL21wYzUyeHhfdWFydC5jIGIvZHJpdmVycy9zZXJpYWwvbXBjNTJ4eF91YXJ0LmMKaW5kZXggM2M0ZDI5ZS4uYTYzOGYyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvbXBjNTJ4eF91YXJ0LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvbXBjNTJ4eF91YXJ0LmMKQEAgLTE2LDYgKzE2LDkgQEAKICAqIFNvbWUgb2YgdGhlIGNvZGUgaGFzIGJlZW4gaW5zcGlyZWQvY29waWVkIGZyb20gdGhlIDIuNCBjb2RlIHdyaXR0ZW4KICAqIGJ5IERhbGUgRmFybnN3b3J0aCA8ZGZhcm5zd29ydGhAbXZpc3RhLmNvbT4uCiAgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqICAgICAgICAgICAgICAgICAgICBKb2huIFJpZ2J5IDxqcmlnYnlAZ21haWwuY29tPgorICogQWRkZWQgc3VwcG9ydCBmb3IgTVBDNTEyMQogICogQ29weXJpZ2h0IChDKSAyMDA2IFNlY3JldCBMYWIgVGVjaG5vbG9naWVzIEx0ZC4KICAqICAgICAgICAgICAgICAgICAgICBHcmFudCBMaWtlbHkgPGdyYW50Lmxpa2VseUBzZWNyZXRsYWIuY2E+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+CkBAIC02Nyw3ICs3MCw2IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+Ci0KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKQEAgLTc5LDYgKzgxLDcgQEAKICNlbmRpZgogCiAjaW5jbHVkZSA8YXNtL21wYzUyeHguaD4KKyNpbmNsdWRlIDxhc20vbXBjNTEyeC5oPgogI2luY2x1ZGUgPGFzbS9tcGM1Mnh4X3BzYy5oPgogCiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX01QQzUyeHhfQ09OU09MRSkgJiYgZGVmaW5lZChDT05GSUdfTUFHSUNfU1lTUlEpCkBAIC0xMTEsOCArMTE0LDggQEAKIHN0YXRpYyB2b2lkIG1wYzUyeHhfdWFydF9vZl9lbnVtZXJhdGUodm9pZCk7CiAjZW5kaWYKIAorCiAjZGVmaW5lIFBTQyhwb3J0KSAoKHN0cnVjdCBtcGM1Mnh4X3BzYyBfX2lvbWVtICopKChwb3J0KS0+bWVtYmFzZSkpCi0jZGVmaW5lIEZJRk8ocG9ydCkgKChzdHJ1Y3QgbXBjNTJ4eF9wc2NfZmlmbyBfX2lvbWVtICopKFBTQyhwb3J0KSsxKSkKIAogCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHRoZSBpbnRlcnJ1cHRpb24gaGFuZGxpbmcgcm91dGluZSAqLwpAQCAtMTI4LDE1ICsxMzEsMzAxIEBACiAjZGVmaW5lIHVhcnRfY29uc29sZShwb3J0KQkoMCkKICNlbmRpZgogCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIFBTQyBmaWZvIG9wZXJhdGlvbnMgZm9yIGlzb2xhdGluZyBkaWZmZXJlbmNlcyBiZXR3ZWVuIDUyeHggYW5kIDUxMnggICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0cnVjdCBwc2Nfb3BzIHsKKwl2b2lkCQkoKmZpZm9faW5pdCkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCk7CisJaW50CQkoKnJhd19yeF9yZHkpKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpOworCWludAkJKCpyYXdfdHhfcmR5KShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKKwlpbnQJCSgqcnhfcmR5KShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKKwlpbnQJCSgqdHhfcmR5KShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKKwlpbnQJCSgqdHhfZW1wdHkpKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpOworCXZvaWQJCSgqc3RvcF9yeCkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCk7CisJdm9pZAkJKCpzdGFydF90eCkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCk7CisJdm9pZAkJKCpzdG9wX3R4KShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKKwl2b2lkCQkoKnJ4X2Nscl9pcnEpKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpOworCXZvaWQJCSgqdHhfY2xyX2lycSkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCk7CisJdm9pZAkJKCp3cml0ZV9jaGFyKShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBjaGFyIGMpOworCXVuc2lnbmVkIGNoYXIJKCpyZWFkX2NoYXIpKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpOworCXZvaWQJCSgqY3dfZGlzYWJsZV9pbnRzKShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKKwl2b2lkCQkoKmN3X3Jlc3RvcmVfaW50cykoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCk7CisJdW5zaWduZWQgbG9uZwkoKmdldHVhcnRjbGspKHZvaWQgKnApOworfTsKKworI2lmZGVmIENPTkZJR19QUENfTVBDNTJ4eAorI2RlZmluZSBGSUZPXzUyeHgocG9ydCkgKChzdHJ1Y3QgbXBjNTJ4eF9wc2NfZmlmbyBfX2lvbWVtICopKFBTQyhwb3J0KSsxKSkKK3N0YXRpYyB2b2lkIG1wYzUyeHhfcHNjX2ZpZm9faW5pdChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBtcGM1Mnh4X3BzYyBfX2lvbWVtICpwc2MgPSBQU0MocG9ydCk7CisJc3RydWN0IG1wYzUyeHhfcHNjX2ZpZm8gX19pb21lbSAqZmlmbyA9IEZJRk9fNTJ4eChwb3J0KTsKKworCS8qIC8zMiBwcmVzY2FsZXIgKi8KKwlvdXRfYmUxNigmcHNjLT5tcGM1Mnh4X3BzY19jbG9ja19zZWxlY3QsIDB4ZGQwMCk7CisKKwlvdXRfOCgmZmlmby0+cmZjbnRsLCAweDAwKTsKKwlvdXRfYmUxNigmZmlmby0+cmZhbGFybSwgMHgxZmYpOworCW91dF84KCZmaWZvLT50ZmNudGwsIDB4MDcpOworCW91dF9iZTE2KCZmaWZvLT50ZmFsYXJtLCAweDgwKTsKKworCXBvcnQtPnJlYWRfc3RhdHVzX21hc2sgfD0gTVBDNTJ4eF9QU0NfSU1SX1JYUkRZIHwgTVBDNTJ4eF9QU0NfSU1SX1RYUkRZOworCW91dF9iZTE2KCZwc2MtPm1wYzUyeHhfcHNjX2ltciwgcG9ydC0+cmVhZF9zdGF0dXNfbWFzayk7Cit9CisKK3N0YXRpYyBpbnQgbXBjNTJ4eF9wc2NfcmF3X3J4X3JkeShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXJldHVybiBpbl9iZTE2KCZQU0MocG9ydCktPm1wYzUyeHhfcHNjX3N0YXR1cykKKwkgICAgJiBNUEM1Mnh4X1BTQ19TUl9SWFJEWTsKK30KKworc3RhdGljIGludCBtcGM1Mnh4X3BzY19yYXdfdHhfcmR5KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcmV0dXJuIGluX2JlMTYoJlBTQyhwb3J0KS0+bXBjNTJ4eF9wc2Nfc3RhdHVzKQorCSAgICAmIE1QQzUyeHhfUFNDX1NSX1RYUkRZOworfQorCisKK3N0YXRpYyBpbnQgbXBjNTJ4eF9wc2NfcnhfcmR5KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcmV0dXJuIGluX2JlMTYoJlBTQyhwb3J0KS0+bXBjNTJ4eF9wc2NfaXNyKQorCSAgICAmIHBvcnQtPnJlYWRfc3RhdHVzX21hc2sKKwkgICAgJiBNUEM1Mnh4X1BTQ19JTVJfUlhSRFk7Cit9CisKK3N0YXRpYyBpbnQgbXBjNTJ4eF9wc2NfdHhfcmR5KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcmV0dXJuIGluX2JlMTYoJlBTQyhwb3J0KS0+bXBjNTJ4eF9wc2NfaXNyKQorCSAgICAmIHBvcnQtPnJlYWRfc3RhdHVzX21hc2sKKwkgICAgJiBNUEM1Mnh4X1BTQ19JTVJfVFhSRFk7Cit9CisKK3N0YXRpYyBpbnQgbXBjNTJ4eF9wc2NfdHhfZW1wdHkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlyZXR1cm4gaW5fYmUxNigmUFNDKHBvcnQpLT5tcGM1Mnh4X3BzY19zdGF0dXMpCisJICAgICYgTVBDNTJ4eF9QU0NfU1JfVFhFTVA7Cit9CisKK3N0YXRpYyB2b2lkIG1wYzUyeHhfcHNjX3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcG9ydC0+cmVhZF9zdGF0dXNfbWFzayB8PSBNUEM1Mnh4X1BTQ19JTVJfVFhSRFk7CisJb3V0X2JlMTYoJlBTQyhwb3J0KS0+bXBjNTJ4eF9wc2NfaW1yLCBwb3J0LT5yZWFkX3N0YXR1c19tYXNrKTsKK30KKworc3RhdGljIHZvaWQgbXBjNTJ4eF9wc2Nfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXBvcnQtPnJlYWRfc3RhdHVzX21hc2sgJj0gfk1QQzUyeHhfUFNDX0lNUl9UWFJEWTsKKwlvdXRfYmUxNigmUFNDKHBvcnQpLT5tcGM1Mnh4X3BzY19pbXIsIHBvcnQtPnJlYWRfc3RhdHVzX21hc2spOworfQorCitzdGF0aWMgdm9pZCBtcGM1Mnh4X3BzY19zdG9wX3J4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcG9ydC0+cmVhZF9zdGF0dXNfbWFzayAmPSB+TVBDNTJ4eF9QU0NfSU1SX1JYUkRZOworCW91dF9iZTE2KCZQU0MocG9ydCktPm1wYzUyeHhfcHNjX2ltciwgcG9ydC0+cmVhZF9zdGF0dXNfbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIG1wYzUyeHhfcHNjX3J4X2Nscl9pcnEoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKK30KKworc3RhdGljIHZvaWQgbXBjNTJ4eF9wc2NfdHhfY2xyX2lycShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworfQorCitzdGF0aWMgdm9pZCBtcGM1Mnh4X3BzY193cml0ZV9jaGFyKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGNoYXIgYykKK3sKKwlvdXRfOCgmUFNDKHBvcnQpLT5tcGM1Mnh4X3BzY19idWZmZXJfOCwgYyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1wYzUyeHhfcHNjX3JlYWRfY2hhcihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXJldHVybiBpbl84KCZQU0MocG9ydCktPm1wYzUyeHhfcHNjX2J1ZmZlcl84KTsKK30KKworc3RhdGljIHZvaWQgbXBjNTJ4eF9wc2NfY3dfZGlzYWJsZV9pbnRzKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJb3V0X2JlMTYoJlBTQyhwb3J0KS0+bXBjNTJ4eF9wc2NfaW1yLCAwKTsKK30KKworc3RhdGljIHZvaWQgbXBjNTJ4eF9wc2NfY3dfcmVzdG9yZV9pbnRzKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJb3V0X2JlMTYoJlBTQyhwb3J0KS0+bXBjNTJ4eF9wc2NfaW1yLCBwb3J0LT5yZWFkX3N0YXR1c19tYXNrKTsKK30KKworLyogU2VhcmNoIGZvciBidXMtZnJlcXVlbmN5IHByb3BlcnR5IGluIHRoaXMgbm9kZSBvciBhIHBhcmVudCAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbXBjNTJ4eF9nZXR1YXJ0Y2xrKHZvaWQgKnApCit7CiAjaWYgZGVmaW5lZChDT05GSUdfUFBDX01FUkdFKQotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbXBjNTJ4eF91YXJ0X29mX21hdGNoW10gPSB7Ci0JeyAudHlwZSA9ICJzZXJpYWwiLCAuY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC1wc2MtdWFydCIsIH0sCi0JeyAudHlwZSA9ICJzZXJpYWwiLCAuY29tcGF0aWJsZSA9ICJtcGM1MjAwLXBzYy11YXJ0IiwgfSwgLyogbGl0ZTUyMDAgKi8KLQl7IC50eXBlID0gInNlcmlhbCIsIC5jb21wYXRpYmxlID0gIm1wYzUyMDAtc2VyaWFsIiwgfSwgLyogZWZpa2EgKi8KLQl7fSwKKwkvKgorCSAqIDUyMDAgVUFSVHMgaGF2ZSBhIC8gMzIgcHJlc2NhbGVyCisJICogYnV0IHRoZSBnZW5lcmljIHNlcmlhbCBjb2RlIGFzc3VtZXMgMTYKKwkgKiBzbyByZXR1cm4gaXBiIGZyZXEgLyAyCisJICovCisJcmV0dXJuIG1wYzUyeHhfZmluZF9pcGJfZnJlcShwKSAvIDI7CisjZWxzZQorCXByX2RlYnVnKCJ1bmV4cGVjdGVkIGNhbGwgdG8gbXBjNTJ4eF9nZXR1YXJ0Y2xrIHdpdGggYXJjaC9wcGNcbiIpOworCXJldHVybiBOVUxMOworI2VuZGlmCit9CisKK3N0YXRpYyBzdHJ1Y3QgcHNjX29wcyBtcGM1Mnh4X3BzY19vcHMgPSB7CisJLmZpZm9faW5pdCA9IG1wYzUyeHhfcHNjX2ZpZm9faW5pdCwKKwkucmF3X3J4X3JkeSA9IG1wYzUyeHhfcHNjX3Jhd19yeF9yZHksCisJLnJhd190eF9yZHkgPSBtcGM1Mnh4X3BzY19yYXdfdHhfcmR5LAorCS5yeF9yZHkgPSBtcGM1Mnh4X3BzY19yeF9yZHksCisJLnR4X3JkeSA9IG1wYzUyeHhfcHNjX3R4X3JkeSwKKwkudHhfZW1wdHkgPSBtcGM1Mnh4X3BzY190eF9lbXB0eSwKKwkuc3RvcF9yeCA9IG1wYzUyeHhfcHNjX3N0b3BfcngsCisJLnN0YXJ0X3R4ID0gbXBjNTJ4eF9wc2Nfc3RhcnRfdHgsCisJLnN0b3BfdHggPSBtcGM1Mnh4X3BzY19zdG9wX3R4LAorCS5yeF9jbHJfaXJxID0gbXBjNTJ4eF9wc2NfcnhfY2xyX2lycSwKKwkudHhfY2xyX2lycSA9IG1wYzUyeHhfcHNjX3R4X2Nscl9pcnEsCisJLndyaXRlX2NoYXIgPSBtcGM1Mnh4X3BzY193cml0ZV9jaGFyLAorCS5yZWFkX2NoYXIgPSBtcGM1Mnh4X3BzY19yZWFkX2NoYXIsCisJLmN3X2Rpc2FibGVfaW50cyA9IG1wYzUyeHhfcHNjX2N3X2Rpc2FibGVfaW50cywKKwkuY3dfcmVzdG9yZV9pbnRzID0gbXBjNTJ4eF9wc2NfY3dfcmVzdG9yZV9pbnRzLAorCS5nZXR1YXJ0Y2xrID0gbXBjNTJ4eF9nZXR1YXJ0Y2xrLAorfTsKKworI2VuZGlmIC8qIENPTkZJR19NUEM1Mnh4ICovCisKKyNpZmRlZiBDT05GSUdfUFBDX01QQzUxMngKKyNkZWZpbmUgRklGT181MTJ4KHBvcnQpICgoc3RydWN0IG1wYzUxMnhfcHNjX2ZpZm8gX19pb21lbSAqKShQU0MocG9ydCkrMSkpCitzdGF0aWMgdm9pZCBtcGM1MTJ4X3BzY19maWZvX2luaXQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlvdXRfYmUzMigmRklGT181MTJ4KHBvcnQpLT50eGNtZCwgTVBDNTEyeF9QU0NfRklGT19SRVNFVF9TTElDRSk7CisJb3V0X2JlMzIoJkZJRk9fNTEyeChwb3J0KS0+dHhjbWQsIE1QQzUxMnhfUFNDX0ZJRk9fRU5BQkxFX1NMSUNFKTsKKwlvdXRfYmUzMigmRklGT181MTJ4KHBvcnQpLT50eGFsYXJtLCAxKTsKKwlvdXRfYmUzMigmRklGT181MTJ4KHBvcnQpLT50eGltciwgMCk7CisKKwlvdXRfYmUzMigmRklGT181MTJ4KHBvcnQpLT5yeGNtZCwgTVBDNTEyeF9QU0NfRklGT19SRVNFVF9TTElDRSk7CisJb3V0X2JlMzIoJkZJRk9fNTEyeChwb3J0KS0+cnhjbWQsIE1QQzUxMnhfUFNDX0ZJRk9fRU5BQkxFX1NMSUNFKTsKKwlvdXRfYmUzMigmRklGT181MTJ4KHBvcnQpLT5yeGFsYXJtLCAxKTsKKwlvdXRfYmUzMigmRklGT181MTJ4KHBvcnQpLT5yeGltciwgMCk7CisKKwlvdXRfYmUzMigmRklGT181MTJ4KHBvcnQpLT50eGltciwgTVBDNTEyeF9QU0NfRklGT19BTEFSTSk7CisJb3V0X2JlMzIoJkZJRk9fNTEyeChwb3J0KS0+cnhpbXIsIE1QQzUxMnhfUFNDX0ZJRk9fQUxBUk0pOworfQorCitzdGF0aWMgaW50IG1wYzUxMnhfcHNjX3Jhd19yeF9yZHkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlyZXR1cm4gIShpbl9iZTMyKCZGSUZPXzUxMngocG9ydCktPnJ4c3IpICYgTVBDNTEyeF9QU0NfRklGT19FTVBUWSk7Cit9CisKK3N0YXRpYyBpbnQgbXBjNTEyeF9wc2NfcmF3X3R4X3JkeShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXJldHVybiAhKGluX2JlMzIoJkZJRk9fNTEyeChwb3J0KS0+dHhzcikgJiBNUEM1MTJ4X1BTQ19GSUZPX0ZVTEwpOworfQorCitzdGF0aWMgaW50IG1wYzUxMnhfcHNjX3J4X3JkeShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXJldHVybiBpbl9iZTMyKCZGSUZPXzUxMngocG9ydCktPnJ4c3IpCisJICAgICYgaW5fYmUzMigmRklGT181MTJ4KHBvcnQpLT5yeGltcikKKwkgICAgJiBNUEM1MTJ4X1BTQ19GSUZPX0FMQVJNOworfQorCitzdGF0aWMgaW50IG1wYzUxMnhfcHNjX3R4X3JkeShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXJldHVybiBpbl9iZTMyKCZGSUZPXzUxMngocG9ydCktPnR4c3IpCisJICAgICYgaW5fYmUzMigmRklGT181MTJ4KHBvcnQpLT50eGltcikKKwkgICAgJiBNUEM1MTJ4X1BTQ19GSUZPX0FMQVJNOworfQorCitzdGF0aWMgaW50IG1wYzUxMnhfcHNjX3R4X2VtcHR5KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcmV0dXJuIGluX2JlMzIoJkZJRk9fNTEyeChwb3J0KS0+dHhzcikKKwkgICAgJiBNUEM1MTJ4X1BTQ19GSUZPX0VNUFRZOworfQorCitzdGF0aWMgdm9pZCBtcGM1MTJ4X3BzY19zdG9wX3J4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJdW5zaWduZWQgbG9uZyByeF9maWZvX2ltcjsKKworCXJ4X2ZpZm9faW1yID0gaW5fYmUzMigmRklGT181MTJ4KHBvcnQpLT5yeGltcik7CisJcnhfZmlmb19pbXIgJj0gfk1QQzUxMnhfUFNDX0ZJRk9fQUxBUk07CisJb3V0X2JlMzIoJkZJRk9fNTEyeChwb3J0KS0+cnhpbXIsIHJ4X2ZpZm9faW1yKTsKK30KKworc3RhdGljIHZvaWQgbXBjNTEyeF9wc2Nfc3RhcnRfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwl1bnNpZ25lZCBsb25nIHR4X2ZpZm9faW1yOworCisJdHhfZmlmb19pbXIgPSBpbl9iZTMyKCZGSUZPXzUxMngocG9ydCktPnR4aW1yKTsKKwl0eF9maWZvX2ltciB8PSBNUEM1MTJ4X1BTQ19GSUZPX0FMQVJNOworCW91dF9iZTMyKCZGSUZPXzUxMngocG9ydCktPnR4aW1yLCB0eF9maWZvX2ltcik7Cit9CisKK3N0YXRpYyB2b2lkIG1wYzUxMnhfcHNjX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwl1bnNpZ25lZCBsb25nIHR4X2ZpZm9faW1yOworCisJdHhfZmlmb19pbXIgPSBpbl9iZTMyKCZGSUZPXzUxMngocG9ydCktPnR4aW1yKTsKKwl0eF9maWZvX2ltciAmPSB+TVBDNTEyeF9QU0NfRklGT19BTEFSTTsKKwlvdXRfYmUzMigmRklGT181MTJ4KHBvcnQpLT50eGltciwgdHhfZmlmb19pbXIpOworfQorCitzdGF0aWMgdm9pZCBtcGM1MTJ4X3BzY19yeF9jbHJfaXJxKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJb3V0X2JlMzIoJkZJRk9fNTEyeChwb3J0KS0+cnhpc3IsIGluX2JlMzIoJkZJRk9fNTEyeChwb3J0KS0+cnhpc3IpKTsKK30KKworc3RhdGljIHZvaWQgbXBjNTEyeF9wc2NfdHhfY2xyX2lycShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCW91dF9iZTMyKCZGSUZPXzUxMngocG9ydCktPnR4aXNyLCBpbl9iZTMyKCZGSUZPXzUxMngocG9ydCktPnR4aXNyKSk7Cit9CisKK3N0YXRpYyB2b2lkIG1wYzUxMnhfcHNjX3dyaXRlX2NoYXIoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgY2hhciBjKQoreworCW91dF84KCZGSUZPXzUxMngocG9ydCktPnR4ZGF0YV84LCBjKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbXBjNTEyeF9wc2NfcmVhZF9jaGFyKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcmV0dXJuIGluXzgoJkZJRk9fNTEyeChwb3J0KS0+cnhkYXRhXzgpOworfQorCitzdGF0aWMgdm9pZCBtcGM1MTJ4X3BzY19jd19kaXNhYmxlX2ludHMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlwb3J0LT5yZWFkX3N0YXR1c19tYXNrID0KKwkJaW5fYmUzMigmRklGT181MTJ4KHBvcnQpLT50eGltcikgPDwgMTYgfAorCQlpbl9iZTMyKCZGSUZPXzUxMngocG9ydCktPnJ4aW1yKTsKKwlvdXRfYmUzMigmRklGT181MTJ4KHBvcnQpLT50eGltciwgMCk7CisJb3V0X2JlMzIoJkZJRk9fNTEyeChwb3J0KS0+cnhpbXIsIDApOworfQorCitzdGF0aWMgdm9pZCBtcGM1MTJ4X3BzY19jd19yZXN0b3JlX2ludHMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlvdXRfYmUzMigmRklGT181MTJ4KHBvcnQpLT50eGltciwKKwkJKHBvcnQtPnJlYWRfc3RhdHVzX21hc2sgPj4gMTYpICYgMHg3Zik7CisJb3V0X2JlMzIoJkZJRk9fNTEyeChwb3J0KS0+cnhpbXIsIHBvcnQtPnJlYWRfc3RhdHVzX21hc2sgJiAweDdmKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbXBjNTEyeF9nZXR1YXJ0Y2xrKHZvaWQgKnApCit7CisJcmV0dXJuIG1wYzUxMnhfZmluZF9pcHNfZnJlcShwKTsKK30KKworc3RhdGljIHN0cnVjdCBwc2Nfb3BzIG1wYzUxMnhfcHNjX29wcyA9IHsKKwkuZmlmb19pbml0ID0gbXBjNTEyeF9wc2NfZmlmb19pbml0LAorCS5yYXdfcnhfcmR5ID0gbXBjNTEyeF9wc2NfcmF3X3J4X3JkeSwKKwkucmF3X3R4X3JkeSA9IG1wYzUxMnhfcHNjX3Jhd190eF9yZHksCisJLnJ4X3JkeSA9IG1wYzUxMnhfcHNjX3J4X3JkeSwKKwkudHhfcmR5ID0gbXBjNTEyeF9wc2NfdHhfcmR5LAorCS50eF9lbXB0eSA9IG1wYzUxMnhfcHNjX3R4X2VtcHR5LAorCS5zdG9wX3J4ID0gbXBjNTEyeF9wc2Nfc3RvcF9yeCwKKwkuc3RhcnRfdHggPSBtcGM1MTJ4X3BzY19zdGFydF90eCwKKwkuc3RvcF90eCA9IG1wYzUxMnhfcHNjX3N0b3BfdHgsCisJLnJ4X2Nscl9pcnEgPSBtcGM1MTJ4X3BzY19yeF9jbHJfaXJxLAorCS50eF9jbHJfaXJxID0gbXBjNTEyeF9wc2NfdHhfY2xyX2lycSwKKwkud3JpdGVfY2hhciA9IG1wYzUxMnhfcHNjX3dyaXRlX2NoYXIsCisJLnJlYWRfY2hhciA9IG1wYzUxMnhfcHNjX3JlYWRfY2hhciwKKwkuY3dfZGlzYWJsZV9pbnRzID0gbXBjNTEyeF9wc2NfY3dfZGlzYWJsZV9pbnRzLAorCS5jd19yZXN0b3JlX2ludHMgPSBtcGM1MTJ4X3BzY19jd19yZXN0b3JlX2ludHMsCisJLmdldHVhcnRjbGsgPSBtcGM1MTJ4X2dldHVhcnRjbGssCiB9OwogI2VuZGlmCiAKK3N0YXRpYyBzdHJ1Y3QgcHNjX29wcyAqcHNjX29wczsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiBVQVJUIG9wZXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE0NSw4ICs0MzQsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludAogbXBjNTJ4eF91YXJ0X3R4X2VtcHR5KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7Ci0JaW50IHN0YXR1cyA9IGluX2JlMTYoJlBTQyhwb3J0KS0+bXBjNTJ4eF9wc2Nfc3RhdHVzKTsKLQlyZXR1cm4gKHN0YXR1cyAmIE1QQzUyeHhfUFNDX1NSX1RYRU1QKSA/IFRJT0NTRVJfVEVNVCA6IDA7CisJcmV0dXJuIHBzY19vcHMtPnR4X2VtcHR5KHBvcnQpID8gVElPQ1NFUl9URU1UIDogMDsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTE2NiwxNiArNDU0LDE0IEBACiBtcGM1Mnh4X3VhcnRfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCS8qIHBvcnQtPmxvY2sgdGFrZW4gYnkgY2FsbGVyICovCi0JcG9ydC0+cmVhZF9zdGF0dXNfbWFzayAmPSB+TVBDNTJ4eF9QU0NfSU1SX1RYUkRZOwotCW91dF9iZTE2KCZQU0MocG9ydCktPm1wYzUyeHhfcHNjX2ltciwgcG9ydC0+cmVhZF9zdGF0dXNfbWFzayk7CisJcHNjX29wcy0+c3RvcF90eChwb3J0KTsKIH0KIAogc3RhdGljIHZvaWQKIG1wYzUyeHhfdWFydF9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCS8qIHBvcnQtPmxvY2sgdGFrZW4gYnkgY2FsbGVyICovCi0JcG9ydC0+cmVhZF9zdGF0dXNfbWFzayB8PSBNUEM1Mnh4X1BTQ19JTVJfVFhSRFk7Ci0Jb3V0X2JlMTYoJlBTQyhwb3J0KS0+bXBjNTJ4eF9wc2NfaW1yLCBwb3J0LT5yZWFkX3N0YXR1c19tYXNrKTsKKwlwc2Nfb3BzLT5zdGFydF90eChwb3J0KTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTE4OCw4ICs0NzQsNyBAQAogCWlmIChjaCkgewogCQkvKiBNYWtlIHN1cmUgdHggaW50ZXJydXB0cyBhcmUgb24gKi8KIAkJLyogVHJ1bHkgbmVjZXNzYXJ5ID8/PyBUaGV5IHNob3VsZCBiZSBhbnl3YXkgKi8KLQkJcG9ydC0+cmVhZF9zdGF0dXNfbWFzayB8PSBNUEM1Mnh4X1BTQ19JTVJfVFhSRFk7Ci0JCW91dF9iZTE2KCZQU0MocG9ydCktPm1wYzUyeHhfcHNjX2ltciwgcG9ydC0+cmVhZF9zdGF0dXNfbWFzayk7CisJCXBzY19vcHMtPnN0YXJ0X3R4KHBvcnQpOwogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKQEAgLTE5OSw4ICs0ODQsNyBAQAogbXBjNTJ4eF91YXJ0X3N0b3Bfcngoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAkvKiBwb3J0LT5sb2NrIHRha2VuIGJ5IGNhbGxlciAqLwotCXBvcnQtPnJlYWRfc3RhdHVzX21hc2sgJj0gfk1QQzUyeHhfUFNDX0lNUl9SWFJEWTsKLQlvdXRfYmUxNigmUFNDKHBvcnQpLT5tcGM1Mnh4X3BzY19pbXIsIHBvcnQtPnJlYWRfc3RhdHVzX21hc2spOworCXBzY19vcHMtPnN0b3BfcngocG9ydCk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0yMjcsMTIgKzUxMSwxMiBAQAogbXBjNTJ4eF91YXJ0X3N0YXJ0dXAoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgbXBjNTJ4eF9wc2MgX19pb21lbSAqcHNjID0gUFNDKHBvcnQpOwotCXN0cnVjdCBtcGM1Mnh4X3BzY19maWZvIF9faW9tZW0gKmZpZm8gPSBGSUZPKHBvcnQpOwogCWludCByZXQ7CiAKIAkvKiBSZXF1ZXN0IElSUSAqLwogCXJldCA9IHJlcXVlc3RfaXJxKHBvcnQtPmlycSwgbXBjNTJ4eF91YXJ0X2ludCwKLQkJSVJRRl9ESVNBQkxFRCB8IElSUUZfU0FNUExFX1JBTkRPTSwgIm1wYzUyeHhfcHNjX3VhcnQiLCBwb3J0KTsKKwkJSVJRRl9ESVNBQkxFRCB8IElSUUZfU0FNUExFX1JBTkRPTSB8IElSUUZfU0hBUkVELAorCQkibXBjNTJ4eF9wc2NfdWFydCIsIHBvcnQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTI0MiwxNSArNTI2LDcgQEAKIAogCW91dF9iZTMyKCZwc2MtPnNpY3IsIDApOwkvKiBVQVJUIG1vZGUgRENEIGlnbm9yZWQgKi8KIAotCW91dF9iZTE2KCZwc2MtPm1wYzUyeHhfcHNjX2Nsb2NrX3NlbGVjdCwgMHhkZDAwKTsgLyogLzE2IHByZXNjYWxlciBvbiAqLwotCi0Jb3V0XzgoJmZpZm8tPnJmY250bCwgMHgwMCk7Ci0Jb3V0X2JlMTYoJmZpZm8tPnJmYWxhcm0sIDB4MWZmKTsKLQlvdXRfOCgmZmlmby0+dGZjbnRsLCAweDA3KTsKLQlvdXRfYmUxNigmZmlmby0+dGZhbGFybSwgMHg4MCk7Ci0KLQlwb3J0LT5yZWFkX3N0YXR1c19tYXNrIHw9IE1QQzUyeHhfUFNDX0lNUl9SWFJEWSB8IE1QQzUyeHhfUFNDX0lNUl9UWFJEWTsKLQlvdXRfYmUxNigmcHNjLT5tcGM1Mnh4X3BzY19pbXIsIHBvcnQtPnJlYWRfc3RhdHVzX21hc2spOworCXBzY19vcHMtPmZpZm9faW5pdChwb3J0KTsKIAogCW91dF84KCZwc2MtPmNvbW1hbmQsIE1QQzUyeHhfUFNDX1RYX0VOQUJMRSk7CiAJb3V0XzgoJnBzYy0+Y29tbWFuZCwgTVBDNTJ4eF9QU0NfUlhfRU5BQkxFKTsKQEAgLTMzMyw4ICs2MDksNyBAQAogCSAqIGJvb3QgZm9yIHRoZSBjb25zb2xlLCBhbGwgc3R1ZmYgaXMgbm90IHlldCByZWFkeSB0byByZWNlaXZlIGF0IHRoYXQKIAkgKiB0aW1lIGFuZCB0aGF0IGp1c3QgbWFrZXMgdGhlIGtlcm5lbCBvb3BzICovCiAJLyogd2hpbGUgKGotLSAmJiBtcGM1Mnh4X3VhcnRfaW50X3J4X2NoYXJzKHBvcnQpKTsgKi8KLQl3aGlsZSAoIShpbl9iZTE2KCZwc2MtPm1wYzUyeHhfcHNjX3N0YXR1cykgJiBNUEM1Mnh4X1BTQ19TUl9UWEVNUCkgJiYKLQkgICAgICAgLS1qKQorCXdoaWxlICghbXBjNTJ4eF91YXJ0X3R4X2VtcHR5KHBvcnQpICYmIC0taikKIAkJdWRlbGF5KDEpOwogCiAJaWYgKCFqKQpAQCAtNDYyLDExICs3MzcsOSBAQAogCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKIAogCS8qIFdoaWxlIHdlIGNhbiByZWFkLCBkbyBzbyAhICovCi0Jd2hpbGUgKChzdGF0dXMgPSBpbl9iZTE2KCZQU0MocG9ydCktPm1wYzUyeHhfcHNjX3N0YXR1cykpICYKLQkJTVBDNTJ4eF9QU0NfU1JfUlhSRFkpIHsKLQorCXdoaWxlIChwc2Nfb3BzLT5yYXdfcnhfcmR5KHBvcnQpKSB7CiAJCS8qIEdldCB0aGUgY2hhciAqLwotCQljaCA9IGluXzgoJlBTQyhwb3J0KS0+bXBjNTJ4eF9wc2NfYnVmZmVyXzgpOworCQljaCA9IHBzY19vcHMtPnJlYWRfY2hhcihwb3J0KTsKIAogCQkvKiBIYW5kbGUgc3lzcmVxIGNoYXIgKi8KICNpZmRlZiBTVVBQT1JUX1NZU1JRCkBAIC00ODEsNiArNzU0LDggQEAKIAkJZmxhZyA9IFRUWV9OT1JNQUw7CiAJCXBvcnQtPmljb3VudC5yeCsrOwogCisJCXN0YXR1cyA9IGluX2JlMTYoJlBTQyhwb3J0KS0+bXBjNTJ4eF9wc2Nfc3RhdHVzKTsKKwogCQlpZiAoc3RhdHVzICYgKE1QQzUyeHhfUFNDX1NSX1BFIHwKIAkJCSAgICAgIE1QQzUyeHhfUFNDX1NSX0ZFIHwKIAkJCSAgICAgIE1QQzUyeHhfUFNDX1NSX1JCKSkgewpAQCAtNTEwLDcgKzc4NSw3IEBACiAKIAl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogCi0JcmV0dXJuIGluX2JlMTYoJlBTQyhwb3J0KS0+bXBjNTJ4eF9wc2Nfc3RhdHVzKSAmIE1QQzUyeHhfUFNDX1NSX1JYUkRZOworCXJldHVybiBwc2Nfb3BzLT5yYXdfcnhfcmR5KHBvcnQpOwogfQogCiBzdGF0aWMgaW5saW5lIGludApAQCAtNTIwLDcgKzc5NSw3IEBACiAKIAkvKiBQcm9jZXNzIG91dCBvZiBiYW5kIGNoYXJzICovCiAJaWYgKHBvcnQtPnhfY2hhcikgewotCQlvdXRfOCgmUFNDKHBvcnQpLT5tcGM1Mnh4X3BzY19idWZmZXJfOCwgcG9ydC0+eF9jaGFyKTsKKwkJcHNjX29wcy0+d3JpdGVfY2hhcihwb3J0LCBwb3J0LT54X2NoYXIpOwogCQlwb3J0LT5pY291bnQudHgrKzsKIAkJcG9ydC0+eF9jaGFyID0gMDsKIAkJcmV0dXJuIDE7CkBAIC01MzMsOCArODA4LDggQEAKIAl9CiAKIAkvKiBTZW5kIGNoYXJzICovCi0Jd2hpbGUgKGluX2JlMTYoJlBTQyhwb3J0KS0+bXBjNTJ4eF9wc2Nfc3RhdHVzKSAmIE1QQzUyeHhfUFNDX1NSX1RYUkRZKSB7Ci0JCW91dF84KCZQU0MocG9ydCktPm1wYzUyeHhfcHNjX2J1ZmZlcl84LCB4bWl0LT5idWZbeG1pdC0+dGFpbF0pOworCXdoaWxlIChwc2Nfb3BzLT5yYXdfdHhfcmR5KHBvcnQpKSB7CisJCXBzY19vcHMtPndyaXRlX2NoYXIocG9ydCwgeG1pdC0+YnVmW3htaXQtPnRhaWxdKTsKIAkJeG1pdC0+dGFpbCA9ICh4bWl0LT50YWlsICsgMSkgJiAoVUFSVF9YTUlUX1NJWkUgLSAxKTsKIAkJcG9ydC0+aWNvdW50LnR4Kys7CiAJCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpCkBAIC01NjAsNyArODM1LDYgQEAKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gZGV2X2lkOwogCXVuc2lnbmVkIGxvbmcgcGFzcyA9IElTUl9QQVNTX0xJTUlUOwogCXVuc2lnbmVkIGludCBrZWVwZ29pbmc7Ci0JdW5zaWduZWQgc2hvcnQgc3RhdHVzOwogCiAJc3Bpbl9sb2NrKCZwb3J0LT5sb2NrKTsKIApAQCAtNTY5LDE4ICs4NDMsMTIgQEAKIAkJLyogSWYgd2UgZG9uJ3QgZmluZCBhbnl0aGluZyB0byBkbywgd2Ugc3RvcCAqLwogCQlrZWVwZ29pbmcgPSAwOwogCi0JCS8qIFJlYWQgc3RhdHVzICovCi0JCXN0YXR1cyA9IGluX2JlMTYoJlBTQyhwb3J0KS0+bXBjNTJ4eF9wc2NfaXNyKTsKLQkJc3RhdHVzICY9IHBvcnQtPnJlYWRfc3RhdHVzX21hc2s7Ci0KLQkJLyogRG8gd2UgbmVlZCB0byByZWNlaXZlIGNoYXJzID8gKi8KLQkJLyogRm9yIHRoaXMgUlggaW50ZXJydXB0cyBtdXN0IGJlIG9uIGFuZCBzb21lIGNoYXJzIHdhaXRpbmcgKi8KLQkJaWYgKHN0YXR1cyAmIE1QQzUyeHhfUFNDX0lNUl9SWFJEWSkKKwkJcHNjX29wcy0+cnhfY2xyX2lycShwb3J0KTsKKwkJaWYgKHBzY19vcHMtPnJ4X3JkeShwb3J0KSkKIAkJCWtlZXBnb2luZyB8PSBtcGM1Mnh4X3VhcnRfaW50X3J4X2NoYXJzKHBvcnQpOwogCi0JCS8qIERvIHdlIG5lZWQgdG8gc2VuZCBjaGFycyA/ICovCi0JCS8qIEZvciB0aGlzLCBUWCBtdXN0IGJlIHJlYWR5IGFuZCBUWCBpbnRlcnJ1cHQgZW5hYmxlZCAqLwotCQlpZiAoc3RhdHVzICYgTVBDNTJ4eF9QU0NfSU1SX1RYUkRZKQorCQlwc2Nfb3BzLT50eF9jbHJfaXJxKHBvcnQpOworCQlpZiAocHNjX29wcy0+dHhfcmR5KHBvcnQpKQogCQkJa2VlcGdvaW5nIHw9IG1wYzUyeHhfdWFydF9pbnRfdHhfY2hhcnMocG9ydCk7CiAKIAkJLyogTGltaXQgbnVtYmVyIG9mIGl0ZXJhdGlvbiAqLwpAQCAtNjQ3LDM2ICs5MTUsMzMgQEAKIG1wYzUyeHhfY29uc29sZV93cml0ZShzdHJ1Y3QgY29uc29sZSAqY28sIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBjb3VudCkKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJm1wYzUyeHhfdWFydF9wb3J0c1tjby0+aW5kZXhdOwotCXN0cnVjdCBtcGM1Mnh4X3BzYyBfX2lvbWVtICpwc2MgPSBQU0MocG9ydCk7CiAJdW5zaWduZWQgaW50IGksIGo7CiAKIAkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KLQlvdXRfYmUxNigmcHNjLT5tcGM1Mnh4X3BzY19pbXIsIDApOworCXBzY19vcHMtPmN3X2Rpc2FibGVfaW50cyhwb3J0KTsKIAogCS8qIFdhaXQgdGhlIFRYIGJ1ZmZlciB0byBiZSBlbXB0eSAqLwogCWogPSA1MDAwMDAwOwkvKiBNYXhpbXVtIHdhaXQgKi8KLQl3aGlsZSAoIShpbl9iZTE2KCZwc2MtPm1wYzUyeHhfcHNjX3N0YXR1cykgJiBNUEM1Mnh4X1BTQ19TUl9UWEVNUCkgJiYKLQkgICAgICAgLS1qKQorCXdoaWxlICghbXBjNTJ4eF91YXJ0X3R4X2VtcHR5KHBvcnQpICYmIC0taikKIAkJdWRlbGF5KDEpOwogCiAJLyogV3JpdGUgYWxsIHRoZSBjaGFycyAqLwogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBzKyspIHsKIAkJLyogTGluZSByZXR1cm4gaGFuZGxpbmcgKi8KIAkJaWYgKCpzID09ICdcbicpCi0JCQlvdXRfOCgmcHNjLT5tcGM1Mnh4X3BzY19idWZmZXJfOCwgJ1xyJyk7CisJCQlwc2Nfb3BzLT53cml0ZV9jaGFyKHBvcnQsICdccicpOwogCiAJCS8qIFNlbmQgdGhlIGNoYXIgKi8KLQkJb3V0XzgoJnBzYy0+bXBjNTJ4eF9wc2NfYnVmZmVyXzgsICpzKTsKKwkJcHNjX29wcy0+d3JpdGVfY2hhcihwb3J0LCAqcyk7CiAKIAkJLyogV2FpdCB0aGUgVFggYnVmZmVyIHRvIGJlIGVtcHR5ICovCiAJCWogPSAyMDAwMDsJLyogTWF4aW11bSB3YWl0ICovCi0JCXdoaWxlICghKGluX2JlMTYoJnBzYy0+bXBjNTJ4eF9wc2Nfc3RhdHVzKSAmCi0JCQkgTVBDNTJ4eF9QU0NfU1JfVFhFTVApICYmIC0taikKKwkJd2hpbGUgKCFtcGM1Mnh4X3VhcnRfdHhfZW1wdHkocG9ydCkgJiYgLS1qKQogCQkJdWRlbGF5KDEpOwogCX0KIAogCS8qIFJlc3RvcmUgaW50ZXJydXB0IHN0YXRlICovCi0Jb3V0X2JlMTYoJnBzYy0+bXBjNTJ4eF9wc2NfaW1yLCBwb3J0LT5yZWFkX3N0YXR1c19tYXNrKTsKKwlwc2Nfb3BzLT5jd19yZXN0b3JlX2ludHMocG9ydCk7CiB9CiAKICNpZiAhZGVmaW5lZChDT05GSUdfUFBDX01FUkdFKQpAQCAtNzIxLDcgKzk4Niw3IEBACiB7CiAJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9ICZtcGM1Mnh4X3VhcnRfcG9ydHNbY28tPmluZGV4XTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gbXBjNTJ4eF91YXJ0X25vZGVzW2NvLT5pbmRleF07Ci0JdW5zaWduZWQgaW50IGlwYl9mcmVxOworCXVuc2lnbmVkIGludCB1YXJ0Y2xrOwogCXN0cnVjdCByZXNvdXJjZSByZXM7CiAJaW50IHJldDsKIApAQCAtNzUzLDE3ICsxMDE4LDE2IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JLyogU2VhcmNoIGZvciBidXMtZnJlcXVlbmN5IHByb3BlcnR5IGluIHRoaXMgbm9kZSBvciBhIHBhcmVudCAqLwotCWlwYl9mcmVxID0gbXBjNTJ4eF9maW5kX2lwYl9mcmVxKG5wKTsKLQlpZiAoaXBiX2ZyZXEgPT0gMCkgewotCQlwcl9kZWJ1ZygiQ291bGQgbm90IGZpbmQgSVBCIGJ1cyBmcmVxdWVuY3khXG4iKTsKKwl1YXJ0Y2xrID0gcHNjX29wcy0+Z2V0dWFydGNsayhucCk7CisJaWYgKHVhcnRjbGsgPT0gMCkgeworCQlwcl9kZWJ1ZygiQ291bGQgbm90IGZpbmQgdWFydCBjbG9jayBmcmVxdWVuY3khXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogQmFzaWMgcG9ydCBpbml0LiBOZWVkZWQgc2luY2Ugd2UgdXNlIHNvbWUgdWFydF8/Pz8gZnVuYyBiZWZvcmUKIAkgKiByZWFsIGluaXQgZm9yIGVhcmx5IGFjY2VzcyAqLwogCXNwaW5fbG9ja19pbml0KCZwb3J0LT5sb2NrKTsKLQlwb3J0LT51YXJ0Y2xrCT0gaXBiX2ZyZXEgLyAyOworCXBvcnQtPnVhcnRjbGsgPSB1YXJ0Y2xrOwogCXBvcnQtPm9wcwk9ICZtcGM1Mnh4X3VhcnRfb3BzOwogCXBvcnQtPm1hcGJhc2UgPSByZXMuc3RhcnQ7CiAJcG9ydC0+bWVtYmFzZSA9IGlvcmVtYXAocmVzLnN0YXJ0LCBzaXplb2Yoc3RydWN0IG1wYzUyeHhfcHNjKSk7CkBAIC05NDUsMTEgKzEyMDksMjUgQEAKIC8qIE9GIFBsYXRmb3JtIERyaXZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1wYzUyeHhfdWFydF9vZl9tYXRjaFtdID0geworI2lmZGVmIENPTkZJR19QUENfTVBDNTJ4eAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDAtcHNjLXVhcnQiLCAuZGF0YSA9ICZtcGM1Mnh4X3BzY19vcHMsIH0sCisJLyogYmluZGluZyB1c2VkIGJ5IG9sZCBsaXRlNTIwMCBkZXZpY2UgdHJlZXM6ICovCisJeyAuY29tcGF0aWJsZSA9ICJtcGM1MjAwLXBzYy11YXJ0IiwgLmRhdGEgPSAmbXBjNTJ4eF9wc2Nfb3BzLCB9LAorCS8qIGJpbmRpbmcgdXNlZCBieSBlZmlrYTogKi8KKwl7IC5jb21wYXRpYmxlID0gIm1wYzUyMDAtc2VyaWFsIiwgLmRhdGEgPSAmbXBjNTJ4eF9wc2Nfb3BzLCB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1BQQ19NUEM1MTJ4CisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjNTEyMS1wc2MtdWFydCIsIC5kYXRhID0gJm1wYzUxMnhfcHNjX29wcywgfSwKKwl7fSwKKyNlbmRpZgorfTsKKwogc3RhdGljIGludCBfX2RldmluaXQKIG1wYzUyeHhfdWFydF9vZl9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJaW50IGlkeCA9IC0xOwotCXVuc2lnbmVkIGludCBpcGJfZnJlcTsKKwl1bnNpZ25lZCBpbnQgdWFydGNsazsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gTlVMTDsKIAlzdHJ1Y3QgcmVzb3VyY2UgcmVzOwogCWludCByZXQ7CkBAIC05NjUsMTAgKzEyNDMsOSBAQAogCXByX2RlYnVnKCJGb3VuZCAlcyBhc3NpZ25lZCB0byB0dHlQU0MleFxuIiwKIAkJIG1wYzUyeHhfdWFydF9ub2Rlc1tpZHhdLT5mdWxsX25hbWUsIGlkeCk7CiAKLQkvKiBTZWFyY2ggZm9yIGJ1cy1mcmVxdWVuY3kgcHJvcGVydHkgaW4gdGhpcyBub2RlIG9yIGEgcGFyZW50ICovCi0JaXBiX2ZyZXEgPSBtcGM1Mnh4X2ZpbmRfaXBiX2ZyZXEob3AtPm5vZGUpOwotCWlmIChpcGJfZnJlcSA9PSAwKSB7Ci0JCWRldl9kYmcoJm9wLT5kZXYsICJDb3VsZCBub3QgZmluZCBJUEIgYnVzIGZyZXF1ZW5jeSFcbiIpOworCXVhcnRjbGsgPSBwc2Nfb3BzLT5nZXR1YXJ0Y2xrKG9wLT5ub2RlKTsKKwlpZiAodWFydGNsayA9PSAwKSB7CisJCWRldl9kYmcoJm9wLT5kZXYsICJDb3VsZCBub3QgZmluZCB1YXJ0IGNsb2NrIGZyZXF1ZW5jeSFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTk3Niw3ICsxMjUzLDcgQEAKIAlwb3J0ID0gJm1wYzUyeHhfdWFydF9wb3J0c1tpZHhdOwogCiAJc3Bpbl9sb2NrX2luaXQoJnBvcnQtPmxvY2spOwotCXBvcnQtPnVhcnRjbGsJPSBpcGJfZnJlcSAvIDI7CisJcG9ydC0+dWFydGNsayA9IHVhcnRjbGs7CiAJcG9ydC0+Zmlmb3NpemUJPSA1MTI7CiAJcG9ydC0+aW90eXBlCT0gVVBJT19NRU07CiAJcG9ydC0+ZmxhZ3MJPSBVUEZfQk9PVF9BVVRPQ09ORiB8CkBAIC0xMDgwLDE1ICsxMzU3LDE5IEBACiAJc3RhdGljIGludCBlbnVtX2RvbmU7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKIAljb25zdCB1bnNpZ25lZCBpbnQgKmRldm5vOworCWNvbnN0IHN0cnVjdCAgb2ZfZGV2aWNlX2lkICptYXRjaDsKIAlpbnQgaTsKIAogCWlmIChlbnVtX2RvbmUpCiAJCXJldHVybjsKIAogCWZvcl9lYWNoX25vZGVfYnlfdHlwZShucCwgInNlcmlhbCIpIHsKLQkJaWYgKCFvZl9tYXRjaF9ub2RlKG1wYzUyeHhfdWFydF9vZl9tYXRjaCwgbnApKQorCQltYXRjaCA9IG9mX21hdGNoX25vZGUobXBjNTJ4eF91YXJ0X29mX21hdGNoLCBucCk7CisJCWlmICghbWF0Y2gpCiAJCQljb250aW51ZTsKIAorCQlwc2Nfb3BzID0gbWF0Y2gtPmRhdGE7CisKIAkJLyogSXMgYSBwYXJ0aWN1bGFyIGRldmljZSBudW1iZXIgcmVxdWVzdGVkPyAqLwogCQlkZXZubyA9IG9mX2dldF9wcm9wZXJ0eShucCwgInBvcnQtbnVtYmVyIiwgTlVMTCk7CiAJCW1wYzUyeHhfdWFydF9vZl9hc3NpZ24obnAsIGRldm5vID8gKmRldm5vIDogLTEpOwpAQCAtMTE0OSw2ICsxNDMwLDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAjZWxzZQorCXBzY19vcHMgPSAmbXBjNTJ4eF9wc2Nfb3BzOwogCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXBjNTJ4eF91YXJ0X3BsYXRmb3JtX2RyaXZlcik7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIgZmFpbGVkICglaSlcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYwppbmRleCAyNzZkYTE0Li4wZjVhMTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMKQEAgLTU4LDcgKzU4LDggQEAKICNkZWZpbmUgdWFydF9jb25zb2xlKHBvcnQpCSgwKQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIHVhcnRfY2hhbmdlX3NwZWVkKHN0cnVjdCB1YXJ0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcyk7CitzdGF0aWMgdm9pZCB1YXJ0X2NoYW5nZV9zcGVlZChzdHJ1Y3QgdWFydF9zdGF0ZSAqc3RhdGUsCisJCQkJCXN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpOwogc3RhdGljIHZvaWQgdWFydF93YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpOwogc3RhdGljIHZvaWQgdWFydF9jaGFuZ2VfcG0oc3RydWN0IHVhcnRfc3RhdGUgKnN0YXRlLCBpbnQgcG1fc3RhdGUpOwogCkBAIC0xMjksOCArMTMwLDggQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiB9CiAKLSNkZWZpbmUgdWFydF9zZXRfbWN0cmwocG9ydCxzZXQpCXVhcnRfdXBkYXRlX21jdHJsKHBvcnQsc2V0LDApCi0jZGVmaW5lIHVhcnRfY2xlYXJfbWN0cmwocG9ydCxjbGVhcikJdWFydF91cGRhdGVfbWN0cmwocG9ydCwwLGNsZWFyKQorI2RlZmluZSB1YXJ0X3NldF9tY3RybChwb3J0LCBzZXQpCXVhcnRfdXBkYXRlX21jdHJsKHBvcnQsIHNldCwgMCkKKyNkZWZpbmUgdWFydF9jbGVhcl9tY3RybChwb3J0LCBjbGVhcikJdWFydF91cGRhdGVfbWN0cmwocG9ydCwgMCwgY2xlYXIpCiAKIC8qCiAgKiBTdGFydHVwIHRoZSBwb3J0LiAgVGhpcyB3aWxsIGJlIGNhbGxlZCBvbmNlIHBlciBvcGVuLiAgQWxsIGNhbGxzCkBAIC0yOTAsNyArMjkxLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYml0cyA9IDEwOwotCQlicmVhazsgLy8gQ1M4CisJCWJyZWFrOyAvKiBDUzggKi8KIAl9CiAKIAlpZiAoY2ZsYWcgJiBDU1RPUEIpCkBAIC02MjIsNyArNjIzLDcgQEAKIAl0bXAuY2xvc2VfZGVsYXkJICAgID0gc3RhdGUtPmNsb3NlX2RlbGF5IC8gMTA7CiAJdG1wLmNsb3Npbmdfd2FpdCAgICA9IHN0YXRlLT5jbG9zaW5nX3dhaXQgPT0gVVNGX0NMT1NJTkdfV0FJVF9OT05FID8KIAkJCQlBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSA6Ci0JCQkgICAgICAgIHN0YXRlLT5jbG9zaW5nX3dhaXQgLyAxMDsKKwkJCQlzdGF0ZS0+Y2xvc2luZ193YWl0IC8gMTA7CiAJdG1wLmN1c3RvbV9kaXZpc29yICA9IHBvcnQtPmN1c3RvbV9kaXZpc29yOwogCXRtcC5odWI2CSAgICA9IHBvcnQtPmh1YjY7CiAJdG1wLmlvX3R5cGUgICAgICAgICA9IHBvcnQtPmlvdHlwZTsKQEAgLTc4OCw3ICs3ODksOCBAQAogCQkJICogV2UgZmFpbGVkIGFueXdheS4KIAkJCSAqLwogCQkJcmV0dmFsID0gLUVCVVNZOwotCQkJZ290byBleGl0OyAgLy8gQWRkZWQgdG8gcmV0dXJuIHRoZSBjb3JyZWN0IGVycm9yIC1SYW0gR3VwdGEKKwkJCS8qIEFkZGVkIHRvIHJldHVybiB0aGUgY29ycmVjdCBlcnJvciAtUmFtIEd1cHRhICovCisJCQlnb3RvIGV4aXQ7CiAJCX0KIAl9CiAKQEAgLTg1OCw3ICs4NjAsNyBAQAogCSAgICAoKHVhcnRfY2lyY19jaGFyc19wZW5kaW5nKCZzdGF0ZS0+aW5mby0+eG1pdCkgPiAwKSAmJgogCSAgICAgIXN0YXRlLT5pbmZvLT50dHktPnN0b3BwZWQgJiYgIXN0YXRlLT5pbmZvLT50dHktPmh3X3N0b3BwZWQpKQogCQlyZXN1bHQgJj0gflRJT0NTRVJfVEVNVDsKLQkKKwogCXJldHVybiBwdXRfdXNlcihyZXN1bHQsIHZhbHVlKTsKIH0KIApAQCAtOTk2LDggKzk5OCw4IEBACiAJCSAgICAoKGFyZyAmIFRJT0NNX0RTUikgJiYgKGNub3cuZHNyICE9IGNwcmV2LmRzcikpIHx8CiAJCSAgICAoKGFyZyAmIFRJT0NNX0NEKSAgJiYgKGNub3cuZGNkICE9IGNwcmV2LmRjZCkpIHx8CiAJCSAgICAoKGFyZyAmIFRJT0NNX0NUUykgJiYgKGNub3cuY3RzICE9IGNwcmV2LmN0cykpKSB7Ci0JCSAgICAJcmV0ID0gMDsKLQkJICAgIAlicmVhazsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKIAkJfQogCiAJCXNjaGVkdWxlKCk7CkBAIC0xMTM3LDcgKzExMzksOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHVhcnRfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKK3N0YXRpYyB2b2lkIHVhcnRfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCQkJCXN0cnVjdCBrdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJc3RydWN0IHVhcnRfc3RhdGUgKnN0YXRlID0gdHR5LT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTIxMyw3ICsxMjE2LDcgQEAKIHsKIAlzdHJ1Y3QgdWFydF9zdGF0ZSAqc3RhdGUgPSB0dHktPmRyaXZlcl9kYXRhOwogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQ7Ci0JCisKIAlCVUdfT04oIWtlcm5lbF9sb2NrZWQoKSk7CiAKIAlpZiAoIXN0YXRlIHx8ICFzdGF0ZS0+cG9ydCkKQEAgLTEyNzgsOCArMTI4MSw4IEBACiAJdWFydF9zaHV0ZG93bihzdGF0ZSk7CiAJdWFydF9mbHVzaF9idWZmZXIodHR5KTsKIAotCXR0eV9sZGlzY19mbHVzaCh0dHkpOwkKLQkKKwl0dHlfbGRpc2NfZmx1c2godHR5KTsKKwogCXR0eS0+Y2xvc2luZyA9IDA7CiAJc3RhdGUtPmluZm8tPnR0eSA9IE5VTEw7CiAKQEAgLTEzNDEsNyArMTM0NCw3IEBACiAJZXhwaXJlID0gamlmZmllcyArIHRpbWVvdXQ7CiAKIAlwcl9kZWJ1ZygidWFydF93YWl0X3VudGlsX3NlbnQoJWQpLCBqaWZmaWVzPSVsdSwgZXhwaXJlPSVsdS4uLlxuIiwKLQkgICAgICAgIHBvcnQtPmxpbmUsIGppZmZpZXMsIGV4cGlyZSk7CisJCXBvcnQtPmxpbmUsIGppZmZpZXMsIGV4cGlyZSk7CiAKIAkvKgogCSAqIENoZWNrIHdoZXRoZXIgdGhlIHRyYW5zbWl0dGVyIGlzIGVtcHR5IGV2ZXJ5ICdjaGFyX3RpbWUnLgpAQCAtMTQ2MCwxMCArMTQ2Myw5IEBACiAJCSAqIGhhdmUgc2V0IFRUWV9JT19FUlJPUiBmb3IgYSBub24tZXhpc3RhbnQgcG9ydC4KIAkJICovCiAJCWlmICgoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHx8Ci0JICAgICAgICAgICAgKGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkgfHwKLQkJICAgIChpbmZvLT50dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkpIHsKKwkJICAgIChpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpIHx8CisJCSAgICAoaW5mby0+dHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpKQogCQkJYnJlYWs7Ci0JCX0KIAogCQkvKgogCQkgKiBTZXQgRFRSIHRvIGFsbG93IG1vZGVtIHRvIGtub3cgd2UncmUgd2FpdGluZy4gIERvCkBAIC0xNTUxLDggKzE1NTMsOCBAQAogfQogCiAvKgotICogSW4gMi40LjUsIGNhbGxzIHRvIHVhcnRfb3BlbiBhcmUgc2VyaWFsaXNlZCBieSB0aGUgQktMIGluCi0gKiAgIGxpbnV4L2ZzL2RldmljZXMuYzpjaHJkZXZfb3BlbigpCisgKiBjYWxscyB0byB1YXJ0X29wZW4gYXJlIHNlcmlhbGlzZWQgYnkgdGhlIEJLTCBpbgorICogICBmcy9jaGFyX2Rldi5jOmNocmRldl9vcGVuKCkKICAqIE5vdGUgdGhhdCBpZiB0aGlzIGZhaWxzLCB0aGVuIHVhcnRfY2xvc2UoKSBfd2lsbF8gYmUgY2FsbGVkLgogICoKICAqIEluIHRpbWUsIHdlIHdhbnQgdG8gc2NyYXAgdGhlICJvcGVuaW5nIG5vbnByZXNlbnQgcG9ydHMiCkBAIC0xNjc0LDcgKzE2NzYsNyBAQAogCQkJcG9ydC0+bGluZSwgdWFydF90eXBlKHBvcnQpLAogCQkJbW1pbyA/ICJtbWlvOjB4IiA6ICJwb3J0OiIsCiAJCQltbWlvID8gKHVuc2lnbmVkIGxvbmcgbG9uZylwb3J0LT5tYXBiYXNlCi0JCSAgICAgICAgICAgICA6ICh1bnNpZ25lZCBsb25nIGxvbmcpIHBvcnQtPmlvYmFzZSwKKwkJCSAgICAgOiAodW5zaWduZWQgbG9uZyBsb25nKSBwb3J0LT5pb2Jhc2UsCiAJCQlwb3J0LT5pcnEpOwogCiAJaWYgKHBvcnQtPnR5cGUgPT0gUE9SVF9VTktOT1dOKSB7CkBAIC0xNjgyLDggKzE2ODQsNyBAQAogCQlyZXR1cm4gcmV0ICsgMTsKIAl9CiAKLQlpZihjYXBhYmxlKENBUF9TWVNfQURNSU4pKQotCXsKKwlpZiAoY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewogCQltdXRleF9sb2NrKCZzdGF0ZS0+bXV0ZXgpOwogCQlwbV9zdGF0ZSA9IHN0YXRlLT5wbV9zdGF0ZTsKIAkJaWYgKHBtX3N0YXRlKQpAQCAtMTcwOSwxMiArMTcxMCwxMiBAQAogCQlpZiAocG9ydC0+aWNvdW50Lm92ZXJydW4pCiAJCQlyZXQgKz0gc3ByaW50ZihidWYgKyByZXQsICIgb2U6JWQiLAogCQkJCXBvcnQtPmljb3VudC5vdmVycnVuKTsKLQkKLSNkZWZpbmUgSU5GT0JJVChiaXQsc3RyKSBcCisKKyNkZWZpbmUgSU5GT0JJVChiaXQsIHN0cikgXAogCWlmIChwb3J0LT5tY3RybCAmIChiaXQpKSBcCiAJCXN0cm5jYXQoc3RhdF9idWYsIChzdHIpLCBzaXplb2Yoc3RhdF9idWYpIC0gXAogCQkJc3RybGVuKHN0YXRfYnVmKSAtIDIpCi0jZGVmaW5lIFNUQVRCSVQoYml0LHN0cikgXAorI2RlZmluZSBTVEFUQklUKGJpdCwgc3RyKSBcCiAJaWYgKHN0YXR1cyAmIChiaXQpKSBcCiAJCXN0cm5jYXQoc3RhdF9idWYsIChzdHIpLCBzaXplb2Yoc3RhdF9idWYpIC0gXAogCQkgICAgICAgc3RybGVuKHN0YXRfYnVmKSAtIDIpCkBAIC0xNzMwLDcgKzE3MzEsNyBAQAogCQlpZiAoc3RhdF9idWZbMF0pCiAJCQlzdGF0X2J1ZlswXSA9ICcgJzsKIAkJc3RyY2F0KHN0YXRfYnVmLCAiXG4iKTsKLQkKKwogCQlyZXQgKz0gc3ByaW50ZihidWYgKyByZXQsIHN0YXRfYnVmKTsKIAl9IGVsc2UgewogCQlzdHJjYXQoYnVmLCAiXG4iKTsKQEAgLTE5OTIsMTEgKzE5OTMsMTEgQEAKIAkJLyoKIAkJICogV2FpdCBmb3IgdGhlIHRyYW5zbWl0dGVyIHRvIGVtcHR5LgogCQkgKi8KLQkJZm9yICh0cmllcyA9IDM7ICFvcHMtPnR4X2VtcHR5KHBvcnQpICYmIHRyaWVzOyB0cmllcy0tKSB7CisJCWZvciAodHJpZXMgPSAzOyAhb3BzLT50eF9lbXB0eShwb3J0KSAmJiB0cmllczsgdHJpZXMtLSkKIAkJCW1zbGVlcCgxMCk7Ci0JCX0KIAkJaWYgKCF0cmllcykKLQkJCXByaW50ayhLRVJOX0VSUiAiJXMlcyVzJWQ6IFVuYWJsZSB0byBkcmFpbiB0cmFuc21pdHRlclxuIiwKKwkJCXByaW50ayhLRVJOX0VSUiAiJXMlcyVzJWQ6IFVuYWJsZSB0byBkcmFpbiAiCisJCQkJCSJ0cmFuc21pdHRlclxuIiwKIAkJCSAgICAgICBwb3J0LT5kZXYgPyBwb3J0LT5kZXYtPmJ1c19pZCA6ICIiLAogCQkJICAgICAgIHBvcnQtPmRldiA/ICI6ICIgOiAiIiwKIAkJCSAgICAgICBkcnYtPmRldl9uYW1lLCBwb3J0LT5saW5lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3VhcnRsaXRlLmMgYi9kcml2ZXJzL3NlcmlhbC91YXJ0bGl0ZS5jCmluZGV4IGJhY2Y2OGQuLjRlMDZhYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3VhcnRsaXRlLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvdWFydGxpdGUuYwpAQCAtMTcsMTAgKzE3LDIxIEBACiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaWYgZGVmaW5lZChDT05GSUdfT0YpCisjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorCisvKiBNYXRjaCB0YWJsZSBmb3Igb2ZfcGxhdGZvcm0gYmluZGluZyAqLworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgdWxpdGVfb2ZfbWF0Y2hbXSBfX2RldmluaXRkYXRhID0geworCXsgLmNvbXBhdGlibGUgPSAieGxueCxvcGItdWFydGxpdGUtMS4wMC5iIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInhsbngseHBzLXVhcnRsaXRlLTEuMDAuYSIsIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB1bGl0ZV9vZl9tYXRjaCk7CisKICNlbmRpZgogCiAjZGVmaW5lIFVMSVRFX05BTUUJCSJ0dHlVTCIKQEAgLTI3NSw2ICsyODYsOSBAQAogCiBzdGF0aWMgaW50IHVsaXRlX3JlcXVlc3RfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogeworCXByX2RlYnVnKCJ1bGl0ZSBjb25zb2xlOiBwb3J0PSVwOyBwb3J0LT5tYXBiYXNlPSV4XG4iLAorCQkgcG9ydCwgcG9ydC0+bWFwYmFzZSk7CisKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihwb3J0LT5tYXBiYXNlLCBVTElURV9SRUdJT04sICJ1YXJ0bGl0ZSIpKSB7CiAJCWRldl9lcnIocG9ydC0+ZGV2LCAiTWVtb3J5IHJlZ2lvbiBidXN5XG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTM3NSwzMiArMzg5LDYgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfT0YpCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IHVsaXRlX2NvbnNvbGVfb2ZfZmluZF9kZXZpY2UoaW50IGlkKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0Jc3RydWN0IHJlc291cmNlIHJlczsKLQljb25zdCB1bnNpZ25lZCBpbnQgKm9mX2lkOwotCWludCByYzsKLQotCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgTlVMTCwgInhpbGlueCx1YXJ0bGl0ZSIpIHsKLQkJb2ZfaWQgPSBvZl9nZXRfcHJvcGVydHkobnAsICJwb3J0LW51bWJlciIsIE5VTEwpOwotCQlpZiAoKCFvZl9pZCkgfHwgKCpvZl9pZCAhPSBpZCkpCi0JCQljb250aW51ZTsKLQotCQlyYyA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpOwotCQlpZiAocmMpCi0JCQljb250aW51ZTsKLQotCQl1bGl0ZV9wb3J0c1tpZF0ubWFwYmFzZSA9IHJlcy5zdGFydDsKLQkJb2Zfbm9kZV9wdXQobnApOwotCQlyZXR1cm47Ci0JfQotfQotI2Vsc2UgLyogQ09ORklHX09GICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IHVsaXRlX2NvbnNvbGVfb2ZfZmluZF9kZXZpY2UoaW50IGlkKSB7IC8qIGRvIG5vdGhpbmcgKi8gfQotI2VuZGlmIC8qIENPTkZJR19PRiAqLwotCiBzdGF0aWMgaW50IF9faW5pdCB1bGl0ZV9jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjbywgY2hhciAqb3B0aW9ucykKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0OwpAQCAtNDE0LDExICs0MDIsNyBAQAogCiAJcG9ydCA9ICZ1bGl0ZV9wb3J0c1tjby0+aW5kZXhdOwogCi0JLyogQ2hlY2sgaWYgaXQgaXMgYW4gT0YgZGV2aWNlICovCi0JaWYgKCFwb3J0LT5tYXBiYXNlKQotCQl1bGl0ZV9jb25zb2xlX29mX2ZpbmRfZGV2aWNlKGNvLT5pbmRleCk7Ci0KLQkvKiBEbyB3ZSBoYXZlIGEgZGV2aWNlIG5vdz8gKi8KKwkvKiBIYXMgdGhlIGRldmljZSBiZWVuIGluaXRpYWxpemVkIHlldD8gKi8KIAlpZiAoIXBvcnQtPm1hcGJhc2UpIHsKIAkJcHJfZGVidWcoImNvbnNvbGUgb24gdHR5VUwlaSBub3QgcHJlc2VudFxuIiwgY28tPmluZGV4KTsKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC02MTcsMTMgKzYwMSw2IEBACiAJcmV0dXJuIHVsaXRlX3JlbGVhc2UoJm9wLT5kZXYpOwogfQogCi0vKiBNYXRjaCB0YWJsZSBmb3Igb2ZfcGxhdGZvcm0gYmluZGluZyAqLwotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgX19kZXZpbml0IHVsaXRlX29mX21hdGNoW10gPSB7Ci0JeyAudHlwZSA9ICJzZXJpYWwiLCAuY29tcGF0aWJsZSA9ICJ4aWxpbngsdWFydGxpdGUiLCB9LAotCXt9LAotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHVsaXRlX29mX21hdGNoKTsKLQogc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgdWxpdGVfb2ZfZHJpdmVyID0gewogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5uYW1lID0gInVhcnRsaXRlIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGhlcm1hbC9LY29uZmlnIGIvZHJpdmVycy90aGVybWFsL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlmMTlmMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdGhlcm1hbC9LY29uZmlnCkBAIC0wLDAgKzEsMTUgQEAKKyMKKyMgR2VuZXJpYyB0aGVybWFsIHN5c2ZzIGRyaXZlcnMgY29uZmlndXJhdGlvbgorIworCittZW51Y29uZmlnIFRIRVJNQUwKKwlib29sICJHZW5lcmljIFRoZXJtYWwgc3lzZnMgZHJpdmVyIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEdlbmVyaWMgVGhlcm1hbCBTeXNmcyBkcml2ZXIgb2ZmZXJzIGEgZ2VuZXJpYyBtZWNoYW5pc20gZm9yCisJICB0aGVybWFsIG1hbmFnZW1lbnQuIFVzdWFsbHkgaXQncyBtYWRlIHVwIG9mIG9uZSBvciBtb3JlIHRoZXJtYWwKKwkgIHpvbmUgYW5kIGNvb2xpbmcgZGV2aWNlLgorCSAgRWFjaCB0aGVybWFsIHpvbmUgY29udGFpbnMgaXRzIG93biB0ZW1wZXJhdHVyZSwgdHJpcCBwb2ludHMsCisJICBjb29saW5nIGRldmljZXMuCisJICBBbGwgcGxhdGZvcm1zIHdpdGggQUNQSSB0aGVybWFsIHN1cHBvcnQgY2FuIHVzZSB0aGlzIGRyaXZlci4KKwkgIElmIHlvdSB3YW50IHRoaXMgc3VwcG9ydCwgeW91IHNob3VsZCBzYXkgWSBoZXJlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90aGVybWFsL01ha2VmaWxlIGIvZHJpdmVycy90aGVybWFsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZjEyMzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3RoZXJtYWwvTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACisjCisjIE1ha2VmaWxlIGZvciBzZW5zb3IgY2hpcCBkcml2ZXJzLgorIworCitvYmotJChDT05GSUdfVEhFUk1BTCkJCSs9IHRoZXJtYWwubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90aGVybWFsL3RoZXJtYWwuYyBiL2RyaXZlcnMvdGhlcm1hbC90aGVybWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc4MmIzZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdGhlcm1hbC90aGVybWFsLmMKQEAgLTAsMCArMSw3MjEgQEAKKy8qCisgKiAgdGhlcm1hbC5jIC0gR2VuZXJpYyBUaGVybWFsIE1hbmFnZW1lbnQgU3lzZnMgc3VwcG9ydC4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IEludGVsIENvcnAKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDggWmhhbmcgUnVpIDxydWkuemhhbmdAaW50ZWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwOCBTdWppdGggVGhvbWFzIDxzdWppdGgudGhvbWFzQGludGVsLmNvbT4KKyAqCisgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L3RoZXJtYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCitNT0RVTEVfQVVUSE9SKCJaaGFuZyBSdWkiKQorTU9EVUxFX0RFU0NSSVBUSU9OKCJHZW5lcmljIHRoZXJtYWwgbWFuYWdlbWVudCBzeXNmcyBzdXBwb3J0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgUFJFRklYICJUaGVybWFsOiAiCisKK3N0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX2luc3RhbmNlIHsKKwlpbnQgaWQ7CisJY2hhciBuYW1lW1RIRVJNQUxfTkFNRV9MRU5HVEhdOworCXN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0ejsKKwlzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldjsKKwlpbnQgdHJpcDsKKwljaGFyIGF0dHJfbmFtZVtUSEVSTUFMX05BTUVfTEVOR1RIXTsKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBhdHRyOworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKK307CisKK3N0YXRpYyBERUZJTkVfSURSKHRoZXJtYWxfdHpfaWRyKTsKK3N0YXRpYyBERUZJTkVfSURSKHRoZXJtYWxfY2Rldl9pZHIpOworc3RhdGljIERFRklORV9NVVRFWCh0aGVybWFsX2lkcl9sb2NrKTsKKworc3RhdGljIExJU1RfSEVBRCh0aGVybWFsX3R6X2xpc3QpOworc3RhdGljIExJU1RfSEVBRCh0aGVybWFsX2NkZXZfbGlzdCk7CitzdGF0aWMgREVGSU5FX01VVEVYKHRoZXJtYWxfbGlzdF9sb2NrKTsKKworc3RhdGljIGludCBnZXRfaWRyKHN0cnVjdCBpZHIgKmlkciwgc3RydWN0IG11dGV4ICpsb2NrLCBpbnQgKmlkKQoreworCWludCBlcnI7CisKKyAgICAgIGFnYWluOgorCWlmICh1bmxpa2VseShpZHJfcHJlX2dldChpZHIsIEdGUF9LRVJORUwpID09IDApKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChsb2NrKQorCQltdXRleF9sb2NrKGxvY2spOworCWVyciA9IGlkcl9nZXRfbmV3KGlkciwgTlVMTCwgaWQpOworCWlmIChsb2NrKQorCQltdXRleF91bmxvY2sobG9jayk7CisJaWYgKHVubGlrZWx5KGVyciA9PSAtRUFHQUlOKSkKKwkJZ290byBhZ2FpbjsKKwllbHNlIGlmICh1bmxpa2VseShlcnIpKQorCQlyZXR1cm4gZXJyOworCisJKmlkID0gKmlkICYgTUFYX0lEX01BU0s7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfaWRyKHN0cnVjdCBpZHIgKmlkciwgc3RydWN0IG11dGV4ICpsb2NrLCBpbnQgaWQpCit7CisJaWYgKGxvY2spCisJCW11dGV4X2xvY2sobG9jayk7CisJaWRyX3JlbW92ZShpZHIsIGlkKTsKKwlpZiAobG9jaykKKwkJbXV0ZXhfdW5sb2NrKGxvY2spOworfQorCisvKiBzeXMgSS9GIGZvciB0aGVybWFsIHpvbmUgKi8KKworI2RlZmluZSB0b190aGVybWFsX3pvbmUoX2RldikgXAorCWNvbnRhaW5lcl9vZihfZGV2LCBzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSwgZGV2aWNlKQorCitzdGF0aWMgc3NpemVfdAordHlwZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdHogPSB0b190aGVybWFsX3pvbmUoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCB0ei0+dHlwZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90Cit0ZW1wX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0eiA9IHRvX3RoZXJtYWxfem9uZShkZXYpOworCisJaWYgKCF0ei0+b3BzLT5nZXRfdGVtcCkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXJldHVybiB0ei0+b3BzLT5nZXRfdGVtcCh0eiwgYnVmKTsKK30KKworc3RhdGljIHNzaXplX3QKK21vZGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6ID0gdG9fdGhlcm1hbF96b25lKGRldik7CisKKwlpZiAoIXR6LT5vcHMtPmdldF9tb2RlKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0dXJuIHR6LT5vcHMtPmdldF9tb2RlKHR6LCBidWYpOworfQorCitzdGF0aWMgc3NpemVfdAorbW9kZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0eiA9IHRvX3RoZXJtYWxfem9uZShkZXYpOworCWludCByZXN1bHQ7CisKKwlpZiAoIXR6LT5vcHMtPnNldF9tb2RlKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmVzdWx0ID0gdHotPm9wcy0+c2V0X21vZGUodHosIGJ1Zik7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QKK3RyaXBfcG9pbnRfdHlwZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0eiA9IHRvX3RoZXJtYWxfem9uZShkZXYpOworCWludCB0cmlwOworCisJaWYgKCF0ei0+b3BzLT5nZXRfdHJpcF90eXBlKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKCFzc2NhbmYoYXR0ci0+YXR0ci5uYW1lLCAidHJpcF9wb2ludF8lZF90eXBlIiwgJnRyaXApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiB0ei0+b3BzLT5nZXRfdHJpcF90eXBlKHR6LCB0cmlwLCBidWYpOworfQorCitzdGF0aWMgc3NpemVfdAordHJpcF9wb2ludF90ZW1wX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6ID0gdG9fdGhlcm1hbF96b25lKGRldik7CisJaW50IHRyaXA7CisKKwlpZiAoIXR6LT5vcHMtPmdldF90cmlwX3RlbXApCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoIXNzY2FuZihhdHRyLT5hdHRyLm5hbWUsICJ0cmlwX3BvaW50XyVkX3RlbXAiLCAmdHJpcCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHR6LT5vcHMtPmdldF90cmlwX3RlbXAodHosIHRyaXAsIGJ1Zik7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUih0eXBlLCAwNDQ0LCB0eXBlX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHRlbXAsIDA0NDQsIHRlbXBfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIobW9kZSwgMDY0NCwgbW9kZV9zaG93LCBtb2RlX3N0b3JlKTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHRyaXBfcG9pbnRfYXR0cnNbXSA9IHsKKwlfX0FUVFIodHJpcF9wb2ludF8wX3R5cGUsIDA0NDQsIHRyaXBfcG9pbnRfdHlwZV9zaG93LCBOVUxMKSwKKwlfX0FUVFIodHJpcF9wb2ludF8wX3RlbXAsIDA0NDQsIHRyaXBfcG9pbnRfdGVtcF9zaG93LCBOVUxMKSwKKwlfX0FUVFIodHJpcF9wb2ludF8xX3R5cGUsIDA0NDQsIHRyaXBfcG9pbnRfdHlwZV9zaG93LCBOVUxMKSwKKwlfX0FUVFIodHJpcF9wb2ludF8xX3RlbXAsIDA0NDQsIHRyaXBfcG9pbnRfdGVtcF9zaG93LCBOVUxMKSwKKwlfX0FUVFIodHJpcF9wb2ludF8yX3R5cGUsIDA0NDQsIHRyaXBfcG9pbnRfdHlwZV9zaG93LCBOVUxMKSwKKwlfX0FUVFIodHJpcF9wb2ludF8yX3RlbXAsIDA0NDQsIHRyaXBfcG9pbnRfdGVtcF9zaG93LCBOVUxMKSwKKwlfX0FUVFIodHJpcF9wb2ludF8zX3R5cGUsIDA0NDQsIHRyaXBfcG9pbnRfdHlwZV9zaG93LCBOVUxMKSwKKwlfX0FUVFIodHJpcF9wb2ludF8zX3RlbXAsIDA0NDQsIHRyaXBfcG9pbnRfdGVtcF9zaG93LCBOVUxMKSwKKwlfX0FUVFIodHJpcF9wb2ludF80X3R5cGUsIDA0NDQsIHRyaXBfcG9pbnRfdHlwZV9zaG93LCBOVUxMKSwKKwlfX0FUVFIodHJpcF9wb2ludF80X3RlbXAsIDA0NDQsIHRyaXBfcG9pbnRfdGVtcF9zaG93LCBOVUxMKSwKKwlfX0FUVFIodHJpcF9wb2ludF81X3R5cGUsIDA0NDQsIHRyaXBfcG9pbnRfdHlwZV9zaG93LCBOVUxMKSwKKwlfX0FUVFIodHJpcF9wb2ludF81X3RlbXAsIDA0NDQsIHRyaXBfcG9pbnRfdGVtcF9zaG93LCBOVUxMKSwKKwlfX0FUVFIodHJpcF9wb2ludF82X3R5cGUsIDA0NDQsIHRyaXBfcG9pbnRfdHlwZV9zaG93LCBOVUxMKSwKKwlfX0FUVFIodHJpcF9wb2ludF82X3RlbXAsIDA0NDQsIHRyaXBfcG9pbnRfdGVtcF9zaG93LCBOVUxMKSwKKwlfX0FUVFIodHJpcF9wb2ludF83X3R5cGUsIDA0NDQsIHRyaXBfcG9pbnRfdHlwZV9zaG93LCBOVUxMKSwKKwlfX0FUVFIodHJpcF9wb2ludF83X3RlbXAsIDA0NDQsIHRyaXBfcG9pbnRfdGVtcF9zaG93LCBOVUxMKSwKKwlfX0FUVFIodHJpcF9wb2ludF84X3R5cGUsIDA0NDQsIHRyaXBfcG9pbnRfdHlwZV9zaG93LCBOVUxMKSwKKwlfX0FUVFIodHJpcF9wb2ludF84X3RlbXAsIDA0NDQsIHRyaXBfcG9pbnRfdGVtcF9zaG93LCBOVUxMKSwKKwlfX0FUVFIodHJpcF9wb2ludF85X3R5cGUsIDA0NDQsIHRyaXBfcG9pbnRfdHlwZV9zaG93LCBOVUxMKSwKKwlfX0FUVFIodHJpcF9wb2ludF85X3RlbXAsIDA0NDQsIHRyaXBfcG9pbnRfdGVtcF9zaG93LCBOVUxMKSwKK307CisKKyNkZWZpbmUgVFJJUF9QT0lOVF9BVFRSX0FERChfZGV2LCBfaW5kZXgsIHJlc3VsdCkgICAgIFwKK2RvIHsgICAgXAorCXJlc3VsdCA9IGRldmljZV9jcmVhdGVfZmlsZShfZGV2LAlcCisJCQkJJnRyaXBfcG9pbnRfYXR0cnNbX2luZGV4ICogMl0pOwlcCisJaWYgKHJlc3VsdCkJXAorCQlicmVhazsJXAorCXJlc3VsdCA9IGRldmljZV9jcmVhdGVfZmlsZShfZGV2LAlcCisJCQkmdHJpcF9wb2ludF9hdHRyc1tfaW5kZXggKiAyICsgMV0pOwlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFRSSVBfUE9JTlRfQVRUUl9SRU1PVkUoX2RldiwgX2luZGV4KQlcCitkbyB7CVwKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoX2RldiwgJnRyaXBfcG9pbnRfYXR0cnNbX2luZGV4ICogMl0pOwlcCisJZGV2aWNlX3JlbW92ZV9maWxlKF9kZXYsICZ0cmlwX3BvaW50X2F0dHJzW19pbmRleCAqIDIgKyAxXSk7CVwKK30gd2hpbGUgKDApCisKKy8qIHN5cyBJL0YgZm9yIGNvb2xpbmcgZGV2aWNlICovCisjZGVmaW5lIHRvX2Nvb2xpbmdfZGV2aWNlKF9kZXYpCVwKKwljb250YWluZXJfb2YoX2Rldiwgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UsIGRldmljZSkKKworc3RhdGljIHNzaXplX3QKK3RoZXJtYWxfY29vbGluZ19kZXZpY2VfdHlwZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldiA9IHRvX2Nvb2xpbmdfZGV2aWNlKGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgY2Rldi0+dHlwZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90Cit0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX21heF9zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2ID0gdG9fY29vbGluZ19kZXZpY2UoZGV2KTsKKworCXJldHVybiBjZGV2LT5vcHMtPmdldF9tYXhfc3RhdGUoY2RldiwgYnVmKTsKK30KKworc3RhdGljIHNzaXplX3QKK3RoZXJtYWxfY29vbGluZ19kZXZpY2VfY3VyX3N0YXRlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXYgPSB0b19jb29saW5nX2RldmljZShkZXYpOworCisJcmV0dXJuIGNkZXYtPm9wcy0+Z2V0X2N1cl9zdGF0ZShjZGV2LCBidWYpOworfQorCitzdGF0aWMgc3NpemVfdAordGhlcm1hbF9jb29saW5nX2RldmljZV9jdXJfc3RhdGVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXYgPSB0b19jb29saW5nX2RldmljZShkZXYpOworCWludCBzdGF0ZTsKKwlpbnQgcmVzdWx0OworCisJaWYgKCFzc2NhbmYoYnVmLCAiJWRcbiIsICZzdGF0ZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHN0YXRlIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXN1bHQgPSBjZGV2LT5vcHMtPnNldF9jdXJfc3RhdGUoY2Rldiwgc3RhdGUpOworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfY2Rldl90eXBlID0KK19fQVRUUih0eXBlLCAwNDQ0LCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX3R5cGVfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIobWF4X3N0YXRlLCAwNDQ0LAorCQkgICB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX21heF9zdGF0ZV9zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihjdXJfc3RhdGUsIDA2NDQsCisJCSAgIHRoZXJtYWxfY29vbGluZ19kZXZpY2VfY3VyX3N0YXRlX3Nob3csCisJCSAgIHRoZXJtYWxfY29vbGluZ19kZXZpY2VfY3VyX3N0YXRlX3N0b3JlKTsKKworc3RhdGljIHNzaXplX3QKK3RoZXJtYWxfY29vbGluZ19kZXZpY2VfdHJpcF9wb2ludF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZV9pbnN0YW5jZSAqaW5zdGFuY2U7CisKKwlpbnN0YW5jZSA9CisJICAgIGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZV9pbnN0YW5jZSwgYXR0cik7CisKKwlpZiAoaW5zdGFuY2UtPnRyaXAgPT0gVEhFUk1BTF9UUklQU19OT05FKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICItMVxuIik7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgaW5zdGFuY2UtPnRyaXApOworfQorCisvKiBEZXZpY2UgbWFuYWdlbWVudCAqLworCisvKioKKyAqIHRoZXJtYWxfem9uZV9iaW5kX2Nvb2xpbmdfZGV2aWNlIC0gYmluZCBhIGNvb2xpbmcgZGV2aWNlIHRvIGEgdGhlcm1hbCB6b25lCisgKiBAdHo6CQl0aGVybWFsIHpvbmUgZGV2aWNlCisgKiBAdHJpcDoJaW5kaWNhdGVzIHdoaWNoIHRyaXAgcG9pbnQgdGhlIGNvb2xpbmcgZGV2aWNlcyBpcworICoJCWFzc29jaWF0ZWQgd2l0aCBpbiB0aGlzIHRoZXJtYWwgem9uZS4KKyAqIEBjZGV2Ogl0aGVybWFsIGNvb2xpbmcgZGV2aWNlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c3VhbGx5IGNhbGxlZCBpbiB0aGUgdGhlcm1hbCB6b25lIGRldmljZSAuYmluZCBjYWxsYmFjay4KKyAqLworaW50IHRoZXJtYWxfem9uZV9iaW5kX2Nvb2xpbmdfZGV2aWNlKHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0eiwKKwkJCQkgICAgIGludCB0cmlwLAorCQkJCSAgICAgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXYpCit7CisJc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2VfaW5zdGFuY2UgKmRldjsKKwlzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZV9pbnN0YW5jZSAqcG9zOworCWludCByZXN1bHQ7CisKKwlpZiAodHJpcCA+PSB0ei0+dHJpcHMgfHwgKHRyaXAgPCAwICYmIHRyaXAgIT0gVEhFUk1BTF9UUklQU19OT05FKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXR6IHx8ICFjZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldiA9CisJICAgIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX2luc3RhbmNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCWRldi0+dHogPSB0ejsKKwlkZXYtPmNkZXYgPSBjZGV2OworCWRldi0+dHJpcCA9IHRyaXA7CisJcmVzdWx0ID0gZ2V0X2lkcigmdHotPmlkciwgJnR6LT5sb2NrLCAmZGV2LT5pZCk7CisJaWYgKHJlc3VsdCkKKwkJZ290byBmcmVlX21lbTsKKworCXNwcmludGYoZGV2LT5uYW1lLCAiY2RldiVkIiwgZGV2LT5pZCk7CisJcmVzdWx0ID0KKwkgICAgc3lzZnNfY3JlYXRlX2xpbmsoJnR6LT5kZXZpY2Uua29iaiwgJmNkZXYtPmRldmljZS5rb2JqLCBkZXYtPm5hbWUpOworCWlmIChyZXN1bHQpCisJCWdvdG8gcmVsZWFzZV9pZHI7CisKKwlzcHJpbnRmKGRldi0+YXR0cl9uYW1lLCAiY2RldiVkX3RyaXBfcG9pbnQiLCBkZXYtPmlkKTsKKwlkZXYtPmF0dHIuYXR0ci5uYW1lID0gZGV2LT5hdHRyX25hbWU7CisJZGV2LT5hdHRyLmF0dHIubW9kZSA9IDA0NDQ7CisJZGV2LT5hdHRyLnNob3cgPSB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX3RyaXBfcG9pbnRfc2hvdzsKKwlyZXN1bHQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnR6LT5kZXZpY2UsICZkZXYtPmF0dHIpOworCWlmIChyZXN1bHQpCisJCWdvdG8gcmVtb3ZlX3N5bWJvbF9saW5rOworCisJbXV0ZXhfbG9jaygmdHotPmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmdHotPmNvb2xpbmdfZGV2aWNlcywgbm9kZSkKKwkgICAgaWYgKHBvcy0+dHogPT0gdHogJiYgcG9zLT50cmlwID09IHRyaXAgJiYgcG9zLT5jZGV2ID09IGNkZXYpIHsKKwkJcmVzdWx0ID0gLUVFWElTVDsKKwkJYnJlYWs7CisJfQorCWlmICghcmVzdWx0KQorCQlsaXN0X2FkZF90YWlsKCZkZXYtPm5vZGUsICZ0ei0+Y29vbGluZ19kZXZpY2VzKTsKKwltdXRleF91bmxvY2soJnR6LT5sb2NrKTsKKworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gMDsKKworCWRldmljZV9yZW1vdmVfZmlsZSgmdHotPmRldmljZSwgJmRldi0+YXR0cik7CisgICAgICByZW1vdmVfc3ltYm9sX2xpbms6CisJc3lzZnNfcmVtb3ZlX2xpbmsoJnR6LT5kZXZpY2Uua29iaiwgZGV2LT5uYW1lKTsKKyAgICAgIHJlbGVhc2VfaWRyOgorCXJlbGVhc2VfaWRyKCZ0ei0+aWRyLCAmdHotPmxvY2ssIGRldi0+aWQpOworICAgICAgZnJlZV9tZW06CisJa2ZyZWUoZGV2KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitFWFBPUlRfU1lNQk9MKHRoZXJtYWxfem9uZV9iaW5kX2Nvb2xpbmdfZGV2aWNlKTsKKworLyoqCisgKiB0aGVybWFsX3pvbmVfdW5iaW5kX2Nvb2xpbmdfZGV2aWNlIC0gdW5iaW5kIGEgY29vbGluZyBkZXZpY2UgZnJvbSBhIHRoZXJtYWwgem9uZQorICogQHR6OgkJdGhlcm1hbCB6b25lIGRldmljZQorICogQHRyaXA6CWluZGljYXRlcyB3aGljaCB0cmlwIHBvaW50IHRoZSBjb29saW5nIGRldmljZXMgaXMKKyAqCQlhc3NvY2lhdGVkIHdpdGggaW4gdGhpcyB0aGVybWFsIHpvbmUuCisgKiBAY2RldjoJdGhlcm1hbCBjb29saW5nIGRldmljZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXN1YWxseSBjYWxsZWQgaW4gdGhlIHRoZXJtYWwgem9uZSBkZXZpY2UgLnVuYmluZCBjYWxsYmFjay4KKyAqLworaW50IHRoZXJtYWxfem9uZV91bmJpbmRfY29vbGluZ19kZXZpY2Uoc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6LAorCQkJCSAgICAgICBpbnQgdHJpcCwKKwkJCQkgICAgICAgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXYpCit7CisJc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2VfaW5zdGFuY2UgKnBvcywgKm5leHQ7CisKKwltdXRleF9sb2NrKCZ0ei0+bG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcywgbmV4dCwgJnR6LT5jb29saW5nX2RldmljZXMsIG5vZGUpIHsKKwkJaWYgKHBvcy0+dHogPT0gdHogJiYgcG9zLT50cmlwID09IHRyaXAgJiYgcG9zLT5jZGV2ID09IGNkZXYpIHsKKwkJCWxpc3RfZGVsKCZwb3MtPm5vZGUpOworCQkJbXV0ZXhfdW5sb2NrKCZ0ei0+bG9jayk7CisJCQlnb3RvIHVuYmluZDsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJnR6LT5sb2NrKTsKKworCXJldHVybiAtRU5PREVWOworCisgICAgICB1bmJpbmQ6CisJZGV2aWNlX3JlbW92ZV9maWxlKCZ0ei0+ZGV2aWNlLCAmcG9zLT5hdHRyKTsKKwlzeXNmc19yZW1vdmVfbGluaygmdHotPmRldmljZS5rb2JqLCBwb3MtPm5hbWUpOworCXJlbGVhc2VfaWRyKCZ0ei0+aWRyLCAmdHotPmxvY2ssIHBvcy0+aWQpOworCWtmcmVlKHBvcyk7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0wodGhlcm1hbF96b25lX3VuYmluZF9jb29saW5nX2RldmljZSk7CisKK3N0YXRpYyB2b2lkIHRoZXJtYWxfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6OworCXN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2OworCisJaWYgKCFzdHJuY21wKGRldi0+YnVzX2lkLCAidGhlcm1hbF96b25lIiwgc2l6ZW9mICJ0aGVybWFsX3pvbmUiIC0gMSkpIHsKKwkJdHogPSB0b190aGVybWFsX3pvbmUoZGV2KTsKKwkJa2ZyZWUodHopOworCX0gZWxzZSB7CisJCWNkZXYgPSB0b19jb29saW5nX2RldmljZShkZXYpOworCQlrZnJlZShjZGV2KTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgdGhlcm1hbF9jbGFzcyA9IHsKKwkubmFtZSA9ICJ0aGVybWFsIiwKKwkuZGV2X3JlbGVhc2UgPSB0aGVybWFsX3JlbGVhc2UsCit9OworCisvKioKKyAqIHRoZXJtYWxfY29vbGluZ19kZXZpY2VfcmVnaXN0ZXIgLSByZWdpc3RlciBhIG5ldyB0aGVybWFsIGNvb2xpbmcgZGV2aWNlCisgKiBAdHlwZToJdGhlIHRoZXJtYWwgY29vbGluZyBkZXZpY2UgdHlwZS4KKyAqIEBkZXZkYXRhOglkZXZpY2UgcHJpdmF0ZSBkYXRhLgorICogQG9wczoJCXN0YW5kYXJkIHRoZXJtYWwgY29vbGluZyBkZXZpY2VzIGNhbGxiYWNrcy4KKyAqLworc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKnRoZXJtYWxfY29vbGluZ19kZXZpY2VfcmVnaXN0ZXIoY2hhciAqdHlwZSwKKwkJCQkJCQkgICAgICAgdm9pZCAqZGV2ZGF0YSwKKwkJCQkJCQkgICAgICAgc3RydWN0CisJCQkJCQkJICAgICAgIHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzCisJCQkJCQkJICAgICAgICpvcHMpCit7CisJc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKmNkZXY7CisJc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnBvczsKKwlpbnQgcmVzdWx0OworCisJaWYgKHN0cmxlbih0eXBlKSA+PSBUSEVSTUFMX05BTUVfTEVOR1RIKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghb3BzIHx8ICFvcHMtPmdldF9tYXhfc3RhdGUgfHwgIW9wcy0+Z2V0X2N1cl9zdGF0ZSB8fAorCSAgICAhb3BzLT5zZXRfY3VyX3N0YXRlKQorCQlyZXR1cm4gTlVMTDsKKworCWNkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghY2RldikKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXN1bHQgPSBnZXRfaWRyKCZ0aGVybWFsX2NkZXZfaWRyLCAmdGhlcm1hbF9pZHJfbG9jaywgJmNkZXYtPmlkKTsKKwlpZiAocmVzdWx0KSB7CisJCWtmcmVlKGNkZXYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzdHJjcHkoY2Rldi0+dHlwZSwgdHlwZSk7CisJY2Rldi0+b3BzID0gb3BzOworCWNkZXYtPmRldmljZS5jbGFzcyA9ICZ0aGVybWFsX2NsYXNzOworCWNkZXYtPmRldmRhdGEgPSBkZXZkYXRhOworCXNwcmludGYoY2Rldi0+ZGV2aWNlLmJ1c19pZCwgImNvb2xpbmdfZGV2aWNlJWQiLCBjZGV2LT5pZCk7CisJcmVzdWx0ID0gZGV2aWNlX3JlZ2lzdGVyKCZjZGV2LT5kZXZpY2UpOworCWlmIChyZXN1bHQpIHsKKwkJcmVsZWFzZV9pZHIoJnRoZXJtYWxfY2Rldl9pZHIsICZ0aGVybWFsX2lkcl9sb2NrLCBjZGV2LT5pZCk7CisJCWtmcmVlKGNkZXYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBzeXMgSS9GICovCisJaWYgKHR5cGUpIHsKKwkJcmVzdWx0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZjZGV2LT5kZXZpY2UsICZkZXZfYXR0cl9jZGV2X3R5cGUpOworCQlpZiAocmVzdWx0KQorCQkJZ290byB1bnJlZ2lzdGVyOworCX0KKworCXJlc3VsdCA9IGRldmljZV9jcmVhdGVfZmlsZSgmY2Rldi0+ZGV2aWNlLCAmZGV2X2F0dHJfbWF4X3N0YXRlKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIHVucmVnaXN0ZXI7CisKKwlyZXN1bHQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmNkZXYtPmRldmljZSwgJmRldl9hdHRyX2N1cl9zdGF0ZSk7CisJaWYgKHJlc3VsdCkKKwkJZ290byB1bnJlZ2lzdGVyOworCisJbXV0ZXhfbG9jaygmdGhlcm1hbF9saXN0X2xvY2spOworCWxpc3RfYWRkKCZjZGV2LT5ub2RlLCAmdGhlcm1hbF9jZGV2X2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmdGhlcm1hbF90el9saXN0LCBub2RlKSB7CisJCWlmICghcG9zLT5vcHMtPmJpbmQpCisJCQljb250aW51ZTsKKwkJcmVzdWx0ID0gcG9zLT5vcHMtPmJpbmQocG9zLCBjZGV2KTsKKwkJaWYgKHJlc3VsdCkKKwkJCWJyZWFrOworCisJfQorCW11dGV4X3VubG9jaygmdGhlcm1hbF9saXN0X2xvY2spOworCisJaWYgKCFyZXN1bHQpCisJCXJldHVybiBjZGV2OworCisgICAgICB1bnJlZ2lzdGVyOgorCXJlbGVhc2VfaWRyKCZ0aGVybWFsX2NkZXZfaWRyLCAmdGhlcm1hbF9pZHJfbG9jaywgY2Rldi0+aWQpOworCWRldmljZV91bnJlZ2lzdGVyKCZjZGV2LT5kZXZpY2UpOworCXJldHVybiBOVUxMOworfQorCitFWFBPUlRfU1lNQk9MKHRoZXJtYWxfY29vbGluZ19kZXZpY2VfcmVnaXN0ZXIpOworCisvKioKKyAqIHRoZXJtYWxfY29vbGluZ19kZXZpY2VfdW5yZWdpc3RlciAtIHJlbW92ZXMgdGhlIHJlZ2lzdGVyZWQgdGhlcm1hbCBjb29saW5nIGRldmljZQorICogQGNkZXY6CXRoZSB0aGVybWFsIGNvb2xpbmcgZGV2aWNlIHRvIHJlbW92ZS4KKyAqCisgKiB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX3VucmVnaXN0ZXIoKSBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBkZXZpY2UgaXMgbm8KKyAqIGxvbmdlciBuZWVkZWQuCisgKi8KK3ZvaWQgdGhlcm1hbF9jb29saW5nX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdAorCQkJCSAgICAgICB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlCisJCQkJICAgICAgICpjZGV2KQoreworCXN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0ejsKKwlzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqcG9zID0gTlVMTDsKKworCWlmICghY2RldikKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmdGhlcm1hbF9saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmdGhlcm1hbF9jZGV2X2xpc3QsIG5vZGUpCisJICAgIGlmIChwb3MgPT0gY2RldikKKwkJYnJlYWs7CisJaWYgKHBvcyAhPSBjZGV2KSB7CisJCS8qIHRoZXJtYWwgY29vbGluZyBkZXZpY2Ugbm90IGZvdW5kICovCisJCW11dGV4X3VubG9jaygmdGhlcm1hbF9saXN0X2xvY2spOworCQlyZXR1cm47CisJfQorCWxpc3RfZGVsKCZjZGV2LT5ub2RlKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHR6LCAmdGhlcm1hbF90el9saXN0LCBub2RlKSB7CisJCWlmICghdHotPm9wcy0+dW5iaW5kKQorCQkJY29udGludWU7CisJCXR6LT5vcHMtPnVuYmluZCh0eiwgY2Rldik7CisJfQorCW11dGV4X3VubG9jaygmdGhlcm1hbF9saXN0X2xvY2spOworCWlmIChjZGV2LT50eXBlWzBdKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmNkZXYtPmRldmljZSwgJmRldl9hdHRyX2NkZXZfdHlwZSk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZjZGV2LT5kZXZpY2UsICZkZXZfYXR0cl9tYXhfc3RhdGUpOworCWRldmljZV9yZW1vdmVfZmlsZSgmY2Rldi0+ZGV2aWNlLCAmZGV2X2F0dHJfY3VyX3N0YXRlKTsKKworCXJlbGVhc2VfaWRyKCZ0aGVybWFsX2NkZXZfaWRyLCAmdGhlcm1hbF9pZHJfbG9jaywgY2Rldi0+aWQpOworCWRldmljZV91bnJlZ2lzdGVyKCZjZGV2LT5kZXZpY2UpOworCXJldHVybjsKK30KKworRVhQT1JUX1NZTUJPTCh0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX3VucmVnaXN0ZXIpOworCisvKioKKyAqIHRoZXJtYWxfem9uZV9kZXZpY2VfcmVnaXN0ZXIgLSByZWdpc3RlciBhIG5ldyB0aGVybWFsIHpvbmUgZGV2aWNlCisgKiBAdHlwZToJdGhlIHRoZXJtYWwgem9uZSBkZXZpY2UgdHlwZQorICogQHRyaXBzOgl0aGUgbnVtYmVyIG9mIHRyaXAgcG9pbnRzIHRoZSB0aGVybWFsIHpvbmUgc3VwcG9ydAorICogQGRldmRhdGE6CXByaXZhdGUgZGV2aWNlIGRhdGEKKyAqIEBvcHM6CXN0YW5kYXJkIHRoZXJtYWwgem9uZSBkZXZpY2UgY2FsbGJhY2tzCisgKgorICogdGhlcm1hbF96b25lX2RldmljZV91bnJlZ2lzdGVyKCkgbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgZGV2aWNlIGlzIG5vCisgKiBsb25nZXIgbmVlZGVkLgorICovCitzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdGhlcm1hbF96b25lX2RldmljZV9yZWdpc3RlcihjaGFyICp0eXBlLAorCQkJCQkJCSBpbnQgdHJpcHMsCisJCQkJCQkJIHZvaWQgKmRldmRhdGEsIHN0cnVjdAorCQkJCQkJCSB0aGVybWFsX3pvbmVfZGV2aWNlX29wcworCQkJCQkJCSAqb3BzKQoreworCXN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0ejsKKwlzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqcG9zOworCWludCByZXN1bHQ7CisJaW50IGNvdW50OworCisJaWYgKHN0cmxlbih0eXBlKSA+PSBUSEVSTUFMX05BTUVfTEVOR1RIKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICh0cmlwcyA+IFRIRVJNQUxfTUFYX1RSSVBTIHx8IHRyaXBzIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIW9wcyB8fCAhb3BzLT5nZXRfdGVtcCkKKwkJcmV0dXJuIE5VTEw7CisKKwl0eiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0eikKKwkJcmV0dXJuIE5VTEw7CisKKwlJTklUX0xJU1RfSEVBRCgmdHotPmNvb2xpbmdfZGV2aWNlcyk7CisJaWRyX2luaXQoJnR6LT5pZHIpOworCW11dGV4X2luaXQoJnR6LT5sb2NrKTsKKwlyZXN1bHQgPSBnZXRfaWRyKCZ0aGVybWFsX3R6X2lkciwgJnRoZXJtYWxfaWRyX2xvY2ssICZ0ei0+aWQpOworCWlmIChyZXN1bHQpIHsKKwkJa2ZyZWUodHopOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzdHJjcHkodHotPnR5cGUsIHR5cGUpOworCXR6LT5vcHMgPSBvcHM7CisJdHotPmRldmljZS5jbGFzcyA9ICZ0aGVybWFsX2NsYXNzOworCXR6LT5kZXZkYXRhID0gZGV2ZGF0YTsKKwl0ei0+dHJpcHMgPSB0cmlwczsKKwlzcHJpbnRmKHR6LT5kZXZpY2UuYnVzX2lkLCAidGhlcm1hbF96b25lJWQiLCB0ei0+aWQpOworCXJlc3VsdCA9IGRldmljZV9yZWdpc3RlcigmdHotPmRldmljZSk7CisJaWYgKHJlc3VsdCkgeworCQlyZWxlYXNlX2lkcigmdGhlcm1hbF90el9pZHIsICZ0aGVybWFsX2lkcl9sb2NrLCB0ei0+aWQpOworCQlrZnJlZSh0eik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIHN5cyBJL0YgKi8KKwlpZiAodHlwZSkgeworCQlyZXN1bHQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnR6LT5kZXZpY2UsICZkZXZfYXR0cl90eXBlKTsKKwkJaWYgKHJlc3VsdCkKKwkJCWdvdG8gdW5yZWdpc3RlcjsKKwl9CisKKwlyZXN1bHQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnR6LT5kZXZpY2UsICZkZXZfYXR0cl90ZW1wKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIHVucmVnaXN0ZXI7CisKKwlpZiAob3BzLT5nZXRfbW9kZSkgeworCQlyZXN1bHQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnR6LT5kZXZpY2UsICZkZXZfYXR0cl9tb2RlKTsKKwkJaWYgKHJlc3VsdCkKKwkJCWdvdG8gdW5yZWdpc3RlcjsKKwl9CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCB0cmlwczsgY291bnQrKykgeworCQlUUklQX1BPSU5UX0FUVFJfQUREKCZ0ei0+ZGV2aWNlLCBjb3VudCwgcmVzdWx0KTsKKwkJaWYgKHJlc3VsdCkKKwkJCWdvdG8gdW5yZWdpc3RlcjsKKwl9CisKKwltdXRleF9sb2NrKCZ0aGVybWFsX2xpc3RfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmdHotPm5vZGUsICZ0aGVybWFsX3R6X2xpc3QpOworCWlmIChvcHMtPmJpbmQpCisJCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmdGhlcm1hbF9jZGV2X2xpc3QsIG5vZGUpIHsKKwkJcmVzdWx0ID0gb3BzLT5iaW5kKHR6LCBwb3MpOworCQlpZiAocmVzdWx0KQorCQkJYnJlYWs7CisJCX0KKwltdXRleF91bmxvY2soJnRoZXJtYWxfbGlzdF9sb2NrKTsKKworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gdHo7CisKKyAgICAgIHVucmVnaXN0ZXI6CisJcmVsZWFzZV9pZHIoJnRoZXJtYWxfdHpfaWRyLCAmdGhlcm1hbF9pZHJfbG9jaywgdHotPmlkKTsKKwlkZXZpY2VfdW5yZWdpc3RlcigmdHotPmRldmljZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK0VYUE9SVF9TWU1CT0wodGhlcm1hbF96b25lX2RldmljZV9yZWdpc3Rlcik7CisKKy8qKgorICogdGhlcm1hbF9kZXZpY2VfdW5yZWdpc3RlciAtIHJlbW92ZXMgdGhlIHJlZ2lzdGVyZWQgdGhlcm1hbCB6b25lIGRldmljZQorICogQHR6OiB0aGUgdGhlcm1hbCB6b25lIGRldmljZSB0byByZW1vdmUKKyAqLwordm9pZCB0aGVybWFsX3pvbmVfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6KQoreworCXN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2OworCXN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICpwb3MgPSBOVUxMOworCWludCBjb3VudDsKKworCWlmICghdHopCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJnRoZXJtYWxfbGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJnRoZXJtYWxfdHpfbGlzdCwgbm9kZSkKKwkgICAgaWYgKHBvcyA9PSB0eikKKwkJYnJlYWs7CisJaWYgKHBvcyAhPSB0eikgeworCQkvKiB0aGVybWFsIHpvbmUgZGV2aWNlIG5vdCBmb3VuZCAqLworCQltdXRleF91bmxvY2soJnRoZXJtYWxfbGlzdF9sb2NrKTsKKwkJcmV0dXJuOworCX0KKwlsaXN0X2RlbCgmdHotPm5vZGUpOworCWlmICh0ei0+b3BzLT51bmJpbmQpCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2RldiwgJnRoZXJtYWxfY2Rldl9saXN0LCBub2RlKQorCQkgICAgdHotPm9wcy0+dW5iaW5kKHR6LCBjZGV2KTsKKwltdXRleF91bmxvY2soJnRoZXJtYWxfbGlzdF9sb2NrKTsKKworCWlmICh0ei0+dHlwZVswXSkKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZ0ei0+ZGV2aWNlLCAmZGV2X2F0dHJfdHlwZSk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZ0ei0+ZGV2aWNlLCAmZGV2X2F0dHJfdGVtcCk7CisJaWYgKHR6LT5vcHMtPmdldF9tb2RlKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnR6LT5kZXZpY2UsICZkZXZfYXR0cl9tb2RlKTsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IHR6LT50cmlwczsgY291bnQrKykKKwkJVFJJUF9QT0lOVF9BVFRSX1JFTU9WRSgmdHotPmRldmljZSwgY291bnQpOworCisJcmVsZWFzZV9pZHIoJnRoZXJtYWxfdHpfaWRyLCAmdGhlcm1hbF9pZHJfbG9jaywgdHotPmlkKTsKKwlpZHJfZGVzdHJveSgmdHotPmlkcik7CisJbXV0ZXhfZGVzdHJveSgmdHotPmxvY2spOworCWRldmljZV91bnJlZ2lzdGVyKCZ0ei0+ZGV2aWNlKTsKKwlyZXR1cm47Cit9CisKK0VYUE9SVF9TWU1CT0wodGhlcm1hbF96b25lX2RldmljZV91bnJlZ2lzdGVyKTsKKworc3RhdGljIGludCBfX2luaXQgdGhlcm1hbF9pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdCA9IDA7CisKKwlyZXN1bHQgPSBjbGFzc19yZWdpc3RlcigmdGhlcm1hbF9jbGFzcyk7CisJaWYgKHJlc3VsdCkgeworCQlpZHJfZGVzdHJveSgmdGhlcm1hbF90el9pZHIpOworCQlpZHJfZGVzdHJveSgmdGhlcm1hbF9jZGV2X2lkcik7CisJCW11dGV4X2Rlc3Ryb3koJnRoZXJtYWxfaWRyX2xvY2spOworCQltdXRleF9kZXN0cm95KCZ0aGVybWFsX2xpc3RfbG9jayk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0aGVybWFsX2V4aXQodm9pZCkKK3sKKwljbGFzc191bnJlZ2lzdGVyKCZ0aGVybWFsX2NsYXNzKTsKKwlpZHJfZGVzdHJveSgmdGhlcm1hbF90el9pZHIpOworCWlkcl9kZXN0cm95KCZ0aGVybWFsX2NkZXZfaWRyKTsKKwltdXRleF9kZXN0cm95KCZ0aGVybWFsX2lkcl9sb2NrKTsKKwltdXRleF9kZXN0cm95KCZ0aGVybWFsX2xpc3RfbG9jayk7Cit9CisKK3N1YnN5c19pbml0Y2FsbCh0aGVybWFsX2luaXQpOworbW9kdWxlX2V4aXQodGhlcm1hbF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9uZXQyMjgwLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5jCmluZGV4IDMzNDY5Y2YuLmUwMTg2MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9uZXQyMjgwLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuYwpAQCAtMTQxOCw4ICsxNDE4LDggQEAKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUiAoZnVuY3Rpb24sIFNfSVJVR08sIHNob3dfZnVuY3Rpb24sIE5VTEwpOwogCi1zdGF0aWMgc3NpemVfdAotc2hvd19yZWdpc3RlcnMgKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBuZXQyMjgwX3Nob3dfcmVnaXN0ZXJzKHN0cnVjdCBkZXZpY2UgKl9kZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgbmV0MjI4MAkJKmRldjsKIAljaGFyCQkJKm5leHQ7CkBAIC0xNTcxLDcgKzE1NzEsNyBAQAogCiAJcmV0dXJuIFBBR0VfU0laRSAtIHNpemU7CiB9Ci1zdGF0aWMgREVWSUNFX0FUVFIgKHJlZ2lzdGVycywgU19JUlVHTywgc2hvd19yZWdpc3RlcnMsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHJlZ2lzdGVycywgU19JUlVHTywgbmV0MjI4MF9zaG93X3JlZ2lzdGVycywgTlVMTCk7CiAKIHN0YXRpYyBzc2l6ZV90CiBzaG93X3F1ZXVlcyAoc3RydWN0IGRldmljZSAqX2Rldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9LY29uZmlnCmluZGV4IDkyNGUyNTUuLmRjZDgwNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L0tjb25maWcKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvS2NvbmZpZwpAQCAtODAsNiArODAsMTUgQEAKIAkgIElmIHlvdSBoYXZlIGEgU2hhcnAgWmF1cnVzIFNMLTU1MDAgKENvbGxpZSkgb3IgU0wtNTYwMCAoUG9vZGxlKSBzYXkgeSB0bwogCSAgZW5hYmxlIHRoZSBMQ0QvYmFja2xpZ2h0IGRyaXZlci4KIAorY29uZmlnIEJBQ0tMSUdIVF9PTUFQMQorCXRyaXN0YXRlICJPTUFQMSBQV0wtYmFzZWQgTENEIEJhY2tsaWdodCIKKwlkZXBlbmRzIG9uIEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UgJiYgQVJDSF9PTUFQMQorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGNvbnRyb2xzIHRoZSBMQ0QgYmFja2xpZ2h0IGxldmVsIGFuZCBwb3dlciBmb3IKKwkgIHRoZSBQV0wgbW9kdWxlIG9mIE9NQVAxIHByb2Nlc3NvcnMuICBTYXkgWSBpZiB5b3VyIGJvYXJkCisJICB1c2VzIHRoaXMgaGFyZHdhcmUuCisKIGNvbmZpZyBCQUNLTElHSFRfSFA2ODAKIAl0cmlzdGF0ZSAiSFAgSm9ybmFkYSA2ODAgQmFja2xpZ2h0IERyaXZlciIKIAlkZXBlbmRzIG9uIEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UgJiYgU0hfSFA2WFgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L01ha2VmaWxlIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvTWFrZWZpbGUKaW5kZXggOTY1YTc4Yi4uMzNmNmM3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvTWFrZWZpbGUKQEAgLTcsNSArNyw2IEBACiBvYmotJChDT05GSUdfQkFDS0xJR0hUX0NPUkdJKQkrPSBjb3JnaV9ibC5vCiBvYmotJChDT05GSUdfQkFDS0xJR0hUX0hQNjgwKQkrPSBocDY4MF9ibC5vCiBvYmotJChDT05GSUdfQkFDS0xJR0hUX0xPQ09NTykJKz0gbG9jb21vbGNkLm8KK29iai0kKENPTkZJR19CQUNLTElHSFRfT01BUDEpCSs9IG9tYXAxX2JsLm8KIG9iai0kKENPTkZJR19CQUNLTElHSFRfUFJPR0VBUikgKz0gcHJvZ2Vhcl9ibC5vCiBvYmotJChDT05GSUdfQkFDS0xJR0hUX0NBUklMTE9fUkFOQ0gpICs9IGNyX2JsbGNkLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2JhY2tsaWdodC5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYmFja2xpZ2h0LmMKaW5kZXggNDg0MGZlMi4uMzkzOTQ3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYmFja2xpZ2h0LmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYmFja2xpZ2h0LmMKQEAgLTk0LDggKzk0LDEwIEBACiAJbXV0ZXhfbG9jaygmYmQtPm9wc19sb2NrKTsKIAlpZiAoYmQtPm9wcykgewogCQlwcl9kZWJ1ZygiYmFja2xpZ2h0OiBzZXQgcG93ZXIgdG8gJWRcbiIsIHBvd2VyKTsKLQkJYmQtPnByb3BzLnBvd2VyID0gcG93ZXI7Ci0JCWJhY2tsaWdodF91cGRhdGVfc3RhdHVzKGJkKTsKKwkJaWYgKGJkLT5wcm9wcy5wb3dlciAhPSBwb3dlcikgeworCQkJYmQtPnByb3BzLnBvd2VyID0gcG93ZXI7CisJCQliYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyhiZCk7CisJCX0KIAkJcmMgPSBjb3VudDsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZiZC0+b3BzX2xvY2spOwpAQCAtMTMyLDggKzEzNCwxMCBAQAogCQllbHNlIHsKIAkJCXByX2RlYnVnKCJiYWNrbGlnaHQ6IHNldCBicmlnaHRuZXNzIHRvICVkXG4iLAogCQkJCSBicmlnaHRuZXNzKTsKLQkJCWJkLT5wcm9wcy5icmlnaHRuZXNzID0gYnJpZ2h0bmVzczsKLQkJCWJhY2tsaWdodF91cGRhdGVfc3RhdHVzKGJkKTsKKwkJCWlmIChiZC0+cHJvcHMuYnJpZ2h0bmVzcyAhPSBicmlnaHRuZXNzKSB7CisJCQkJYmQtPnByb3BzLmJyaWdodG5lc3MgPSBicmlnaHRuZXNzOworCQkJCWJhY2tsaWdodF91cGRhdGVfc3RhdHVzKGJkKTsKKwkJCX0KIAkJCXJjID0gY291bnQ7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9vbWFwMV9ibC5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvb21hcDFfYmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTE4NzVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvb21hcDFfYmwuYwpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIEJhY2tsaWdodCBkcml2ZXIgZm9yIE9NQVAgYmFzZWQgYm9hcmRzLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBBbmRyemVqIFphYm9yb3dza2kgIDxiYWxyb2dAemFib3Iub3JnPgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHBhY2thZ2U7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorCisjZGVmaW5lIE9NQVBCTF9NQVhfSU5URU5TSVRZCQkweGZmCisKK3N0cnVjdCBvbWFwX2JhY2tsaWdodCB7CisJaW50IHBvd2VybW9kZTsKKwlpbnQgY3VycmVudF9pbnRlbnNpdHk7CisKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IG9tYXBfYmFja2xpZ2h0X2NvbmZpZyAqcGRhdGE7Cit9OworCitzdGF0aWMgdm9pZCBpbmxpbmUgb21hcGJsX3NlbmRfaW50ZW5zaXR5KGludCBpbnRlbnNpdHkpCit7CisJb21hcF93cml0ZWIoaW50ZW5zaXR5LCBPTUFQX1BXTF9FTkFCTEUpOworfQorCitzdGF0aWMgdm9pZCBpbmxpbmUgb21hcGJsX3NlbmRfZW5hYmxlKGludCBlbmFibGUpCit7CisJb21hcF93cml0ZWIoZW5hYmxlLCBPTUFQX1BXTF9DTEtfRU5BQkxFKTsKK30KKworc3RhdGljIHZvaWQgb21hcGJsX2JsYW5rKHN0cnVjdCBvbWFwX2JhY2tsaWdodCAqYmwsIGludCBtb2RlKQoreworCWlmIChibC0+cGRhdGEtPnNldF9wb3dlcikKKwkJYmwtPnBkYXRhLT5zZXRfcG93ZXIoYmwtPmRldiwgbW9kZSk7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIEZCX0JMQU5LX05PUk1BTDoKKwljYXNlIEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQ6CisJY2FzZSBGQl9CTEFOS19IU1lOQ19TVVNQRU5EOgorCWNhc2UgRkJfQkxBTktfUE9XRVJET1dOOgorCQlvbWFwYmxfc2VuZF9pbnRlbnNpdHkoMCk7CisJCW9tYXBibF9zZW5kX2VuYWJsZSgwKTsKKwkJYnJlYWs7CisKKwljYXNlIEZCX0JMQU5LX1VOQkxBTks6CisJCW9tYXBibF9zZW5kX2ludGVuc2l0eShibC0+Y3VycmVudF9pbnRlbnNpdHkpOworCQlvbWFwYmxfc2VuZF9lbmFibGUoMSk7CisJCWJyZWFrOworCX0KK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBvbWFwYmxfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBvbWFwX2JhY2tsaWdodCAqYmwgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKKworCW9tYXBibF9ibGFuayhibCwgRkJfQkxBTktfUE9XRVJET1dOKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwYmxfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBvbWFwX2JhY2tsaWdodCAqYmwgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKKworCW9tYXBibF9ibGFuayhibCwgYmwtPnBvd2VybW9kZSk7CisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBvbWFwYmxfc3VzcGVuZAlOVUxMCisjZGVmaW5lIG9tYXBibF9yZXN1bWUJTlVMTAorI2VuZGlmCisKK3N0YXRpYyBpbnQgb21hcGJsX3NldF9wb3dlcihzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqZGV2LCBpbnQgc3RhdGUpCit7CisJc3RydWN0IG9tYXBfYmFja2xpZ2h0ICpibCA9IGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXYpOworCisJb21hcGJsX2JsYW5rKGJsLCBzdGF0ZSk7CisJYmwtPnBvd2VybW9kZSA9IHN0YXRlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcGJsX3VwZGF0ZV9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb21hcF9iYWNrbGlnaHQgKmJsID0gZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldik7CisKKwlpZiAoYmwtPmN1cnJlbnRfaW50ZW5zaXR5ICE9IGRldi0+cHJvcHMuYnJpZ2h0bmVzcykgeworCQlpZiAoYmwtPnBvd2VybW9kZSA9PSBGQl9CTEFOS19VTkJMQU5LKQorCQkJb21hcGJsX3NlbmRfaW50ZW5zaXR5KGRldi0+cHJvcHMuYnJpZ2h0bmVzcyk7CisJCWJsLT5jdXJyZW50X2ludGVuc2l0eSA9IGRldi0+cHJvcHMuYnJpZ2h0bmVzczsKKwl9CisKKwlpZiAoZGV2LT5wcm9wcy5mYl9ibGFuayAhPSBibC0+cG93ZXJtb2RlKQorCQlvbWFwYmxfc2V0X3Bvd2VyKGRldiwgZGV2LT5wcm9wcy5mYl9ibGFuayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwYmxfZ2V0X2ludGVuc2l0eShzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvbWFwX2JhY2tsaWdodCAqYmwgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKKwlyZXR1cm4gYmwtPmN1cnJlbnRfaW50ZW5zaXR5OworfQorCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9vcHMgb21hcGJsX29wcyA9IHsKKwkuZ2V0X2JyaWdodG5lc3MgPSBvbWFwYmxfZ2V0X2ludGVuc2l0eSwKKwkudXBkYXRlX3N0YXR1cyAgPSBvbWFwYmxfdXBkYXRlX3N0YXR1cywKK307CisKK3N0YXRpYyBpbnQgb21hcGJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgb21hcF9iYWNrbGlnaHQgKmJsOworCXN0cnVjdCBvbWFwX2JhY2tsaWdodF9jb25maWcgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAoIXBkYXRhKQorCQlyZXR1cm4gLUVOWElPOworCisJb21hcGJsX29wcy5jaGVja19mYiA9IHBkYXRhLT5jaGVja19mYjsKKworCWJsID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9tYXBfYmFja2xpZ2h0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFibCkpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2ID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3Rlcigib21hcC1ibCIsICZwZGV2LT5kZXYsIGJsLCAmb21hcGJsX29wcyk7CisJaWYgKElTX0VSUihkZXYpKSB7CisJCWtmcmVlKGJsKTsKKwkJcmV0dXJuIFBUUl9FUlIoZGV2KTsKKwl9CisKKwlibC0+cG93ZXJtb2RlID0gRkJfQkxBTktfUE9XRVJET1dOOworCWJsLT5jdXJyZW50X2ludGVuc2l0eSA9IDA7CisKKwlibC0+cGRhdGEgPSBwZGF0YTsKKwlibC0+ZGV2ID0gJnBkZXYtPmRldjsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwlvbWFwX2NmZ19yZWcoUFdMKTsJLyogQ29uZmxpY3RzIHdpdGggVUFSVDMgKi8KKworCWRldi0+cHJvcHMuZmJfYmxhbmsgPSBGQl9CTEFOS19VTkJMQU5LOworCWRldi0+cHJvcHMubWF4X2JyaWdodG5lc3MgPSBPTUFQQkxfTUFYX0lOVEVOU0lUWTsKKwlkZXYtPnByb3BzLmJyaWdodG5lc3MgPSBwZGF0YS0+ZGVmYXVsdF9pbnRlbnNpdHk7CisJb21hcGJsX3VwZGF0ZV9zdGF0dXMoZGV2KTsKKworCXByaW50ayhLRVJOX0lORk8gIk9NQVAgTENEIGJhY2tsaWdodCBpbml0aWFsaXNlZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwYmxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBvbWFwX2JhY2tsaWdodCAqYmwgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKKworCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihkZXYpOworCWtmcmVlKGJsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwYmxfZHJpdmVyID0geworCS5wcm9iZQkJPSBvbWFwYmxfcHJvYmUsCisJLnJlbW92ZQkJPSBvbWFwYmxfcmVtb3ZlLAorCS5zdXNwZW5kCT0gb21hcGJsX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBvbWFwYmxfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJvbWFwLWJsIiwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgb21hcGJsX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZvbWFwYmxfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG9tYXBibF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm9tYXBibF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChvbWFwYmxfaW5pdCk7Cittb2R1bGVfZXhpdChvbWFwYmxfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkFuZHJ6ZWogWmFib3Jvd3NraSA8YmFscm9nQHphYm9yLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiT01BUCBMQ0QgQmFja2xpZ2h0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb25zb2xlL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvS2NvbmZpZwppbmRleCAyYjUzZDFmLi4wNmY4N2IwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvS2NvbmZpZwpAQCAtNiw3ICs2LDcgQEAKIAogY29uZmlnIFZHQV9DT05TT0xFCiAJYm9vbCAiVkdBIHRleHQgY29uc29sZSIgaWYgRU1CRURERUQgfHwgIVg4NgotCWRlcGVuZHMgb24gIUFSQ0hfQUNPUk4gJiYgIUFSQ0hfRUJTQTExMCAmJiAhNHh4ICYmICE4eHggJiYgIVNQQVJDICYmICFNNjhLICYmICFQQVJJU0MgJiYgIUZSViAmJiAhQVJDSF9WRVJTQVRJTEUgJiYgIVNVUEVSSCAmJiAhQkxBQ0tGSU4gJiYgIUFWUjMyCisJZGVwZW5kcyBvbiAhQVJDSF9BQ09STiAmJiAhQVJDSF9FQlNBMTEwICYmICE0eHggJiYgITh4eCAmJiAhU1BBUkMgJiYgIU02OEsgJiYgIVBBUklTQyAmJiAhRlJWICYmICFBUkNIX1ZFUlNBVElMRSAmJiAhU1VQRVJIICYmICFCTEFDS0ZJTiAmJiAhQVZSMzIgJiYgIU1OMTAzMDAKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBTYXlpbmcgWSBoZXJlIHdpbGwgYWxsb3cgeW91IHRvIHVzZSBMaW51eCBpbiB0ZXh0IG1vZGUgdGhyb3VnaCBhCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3hpbGlueGZiLmMgYi9kcml2ZXJzL3ZpZGVvL3hpbGlueGZiLmMKaW5kZXggZTM4ZDNiNy4uN2IzYTg0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby94aWxpbnhmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8veGlsaW54ZmIuYwpAQCAtNDU5LDggKzQ1OSw4IEBACiB9CiAKIC8qIE1hdGNoIHRhYmxlIGZvciBvZl9wbGF0Zm9ybSBiaW5kaW5nICovCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBfX2RldmluaXQgeGlsaW54ZmJfb2ZfbWF0Y2hbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInhpbGlueCxtbDMwMC1mYiIsIH0sCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCB4aWxpbnhmYl9vZl9tYXRjaFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ4bG54LHBsYi10ZnQtY250bHItcmVmLTEuMDAuYSIsIH0sCiAJe30sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgeGlsaW54ZmJfb2ZfbWF0Y2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9tYXN0ZXJzL2RzMXdtLmMgYi9kcml2ZXJzL3cxL21hc3RlcnMvZHMxd20uYwppbmRleCA1NzQ3OTk3Li42ODhlNDM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL21hc3RlcnMvZHMxd20uYworKysgYi9kcml2ZXJzL3cxL21hc3RlcnMvZHMxd20uYwpAQCAtMzYxLDExICszNjEsMTIgQEAKIAkJZ290byBlcnIxOwogCX0KIAlkczF3bV9kYXRhLT5pcnEgPSByZXMtPnN0YXJ0OwotCWRzMXdtX2RhdGEtPmFjdGl2ZV9oaWdoID0gKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lSUV9ISUdIRURHRSkgPwotCQkxIDogMDsKKwlkczF3bV9kYXRhLT5hY3RpdmVfaGlnaCA9IHBsYXQtPmFjdGl2ZV9oaWdoOwogCi0Jc2V0X2lycV90eXBlKGRzMXdtX2RhdGEtPmlycSwgZHMxd21fZGF0YS0+YWN0aXZlX2hpZ2ggPwotCQkJSVJRX1RZUEVfRURHRV9SSVNJTkcgOiBJUlFfVFlQRV9FREdFX0ZBTExJTkcpOworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JUlFfSElHSEVER0UpCisJCXNldF9pcnFfdHlwZShkczF3bV9kYXRhLT5pcnEsIElSUV9UWVBFX0VER0VfUklTSU5HKTsKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSVJRX0xPV0VER0UpCisJCXNldF9pcnFfdHlwZShkczF3bV9kYXRhLT5pcnEsIElSUV9UWVBFX0VER0VfRkFMTElORyk7CiAKIAlyZXQgPSByZXF1ZXN0X2lycShkczF3bV9kYXRhLT5pcnEsIGRzMXdtX2lzciwgSVJRRl9ESVNBQkxFRCwKIAkJCSAgImRzMXdtIiwgZHMxd21fZGF0YSk7CmRpZmYgLS1naXQgYS9mcy85cC92ZnNfaW5vZGUuYyBiL2ZzLzlwL3Zmc19pbm9kZS5jCmluZGV4IDVjNTEzN2MxLi42YTI4ODQyIDEwMDY0NAotLS0gYS9mcy85cC92ZnNfaW5vZGUuYworKysgYi9mcy85cC92ZnNfaW5vZGUuYwpAQCAtNTczLDcgKzU3Myw3IEBACiAJdjlzZXMgPSB2OWZzX2lub2RlMnY5c2VzKGRpcik7CiAJZGZpZCA9IHY5ZnNfZmlkX2xvb2t1cChkZW50cnktPmRfcGFyZW50KTsKIAlpZiAoSVNfRVJSKGRmaWQpKQotCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKGRmaWQpKTsKKwkJcmV0dXJuIEVSUl9DQVNUKGRmaWQpOwogCiAJbmFtZSA9IChjaGFyICopIGRlbnRyeS0+ZF9uYW1lLm5hbWU7CiAJZmlkID0gcDlfY2xpZW50X3dhbGsoZGZpZCwgMSwgJm5hbWUsIDEpOwpkaWZmIC0tZ2l0IGEvZnMvS2NvbmZpZyBiL2ZzL0tjb25maWcKaW5kZXggZWE1YjM1OS4uZDczMTI4MiAxMDA2NDQKLS0tIGEvZnMvS2NvbmZpZworKysgYi9mcy9LY29uZmlnCkBAIC00NjMsNDAgKzQ2MywxOCBAQAogCSAgdGhpcyBvcHRpb24gZm9yIGRlYnVnZ2luZyBvbmx5IGFzIGl0IGlzIGxpa2VseSB0byBkZWNyZWFzZQogCSAgcGVyZm9ybWFuY2Ugb2YgdGhlIGZpbGVzeXN0ZW0uCiAKLWNvbmZpZyBNSU5JWF9GUwotCXRyaXN0YXRlICJNaW5peCBmcyBzdXBwb3J0IgorZW5kaWYgIyBCTE9DSworCitjb25maWcgRE5PVElGWQorCWJvb2wgIkRub3RpZnkgc3VwcG9ydCIKKwlkZWZhdWx0IHkKIAloZWxwCi0JICBNaW5peCBpcyBhIHNpbXBsZSBvcGVyYXRpbmcgc3lzdGVtIHVzZWQgaW4gbWFueSBjbGFzc2VzIGFib3V0IE9TJ3MuCi0JICBUaGUgbWluaXggZmlsZSBzeXN0ZW0gKG1ldGhvZCB0byBvcmdhbml6ZSBmaWxlcyBvbiBhIGhhcmQgZGlzawotCSAgcGFydGl0aW9uIG9yIGEgZmxvcHB5IGRpc2spIHdhcyB0aGUgb3JpZ2luYWwgZmlsZSBzeXN0ZW0gZm9yIExpbnV4LAotCSAgYnV0IGhhcyBiZWVuIHN1cGVyc2VkZWQgYnkgdGhlIHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbSBleHQyZnMuCi0JICBZb3UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIG1pbml4IGZpbGUgc3lzdGVtIG9uIHlvdXIgaGFyZCBkaXNrCi0JICBiZWNhdXNlIG9mIGNlcnRhaW4gYnVpbHQtaW4gcmVzdHJpY3Rpb25zLCBidXQgaXQgaXMgc29tZXRpbWVzIGZvdW5kCi0JICBvbiBvbGRlciBMaW51eCBmbG9wcHkgZGlza3MuICBUaGlzIG9wdGlvbiB3aWxsIGVubGFyZ2UgeW91ciBrZXJuZWwKLQkgIGJ5IGFib3V0IDI4IEtCLiBJZiB1bnN1cmUsIHNheSBOLgorCSAgRG5vdGlmeSBpcyBhIGRpcmVjdG9yeS1iYXNlZCBwZXItZmQgZmlsZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIHN5c3RlbQorCSAgdGhhdCB1c2VzIHNpZ25hbHMgdG8gY29tbXVuaWNhdGUgZXZlbnRzIHRvIHVzZXItc3BhY2UuICBUaGVyZSBleGlzdAorCSAgc3VwZXJpb3IgYWx0ZXJuYXRpdmVzLCBidXQgc29tZSBhcHBsaWNhdGlvbnMgbWF5IHN0aWxsIHJlbHkgb24KKwkgIGRub3RpZnkuCiAKLQkgIFRvIGNvbXBpbGUgdGhpcyBmaWxlIHN5c3RlbSBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtaW5peC4gIE5vdGUgdGhhdCB0aGUgZmlsZSBzeXN0ZW0gb2YgeW91ciByb290Ci0JICBwYXJ0aXRpb24gKHRoZSBvbmUgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5IC8pIGNhbm5vdCBiZSBjb21waWxlZCBhcwotCSAgYSBtb2R1bGUuCi0KLWNvbmZpZyBST01GU19GUwotCXRyaXN0YXRlICJST00gZmlsZSBzeXN0ZW0gc3VwcG9ydCIKLQktLS1oZWxwLS0tCi0JICBUaGlzIGlzIGEgdmVyeSBzbWFsbCByZWFkLW9ubHkgZmlsZSBzeXN0ZW0gbWFpbmx5IGludGVuZGVkIGZvcgotCSAgaW5pdGlhbCByYW0gZGlza3Mgb2YgaW5zdGFsbGF0aW9uIGRpc2tzLCBidXQgaXQgY291bGQgYmUgdXNlZCBmb3IKLQkgIG90aGVyIHJlYWQtb25seSBtZWRpYSBhcyB3ZWxsLiAgUmVhZAotCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9yb21mcy50eHQ+IGZvciBkZXRhaWxzLgotCi0JICBUbyBjb21waWxlIHRoaXMgZmlsZSBzeXN0ZW0gc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcm9tZnMuICBOb3RlIHRoYXQgdGhlIGZpbGUgc3lzdGVtIG9mIHlvdXIKLQkgIHJvb3QgcGFydGl0aW9uICh0aGUgb25lIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeSAvKSBjYW5ub3QgYmUgYQotCSAgbW9kdWxlLgotCi0JICBJZiB5b3UgZG9uJ3Qga25vdyB3aGV0aGVyIHlvdSBuZWVkIGl0LCB0aGVuIHlvdSBkb24ndCBuZWVkIGl0OgotCSAgYW5zd2VyIE4uCi0KLWVuZGlmCisJICBJZiB1bnN1cmUsIHNheSBZLgogCiBjb25maWcgSU5PVElGWQogCWJvb2wgIklub3RpZnkgZmlsZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIHN1cHBvcnQiCkBAIC01NzcsMTcgKzU1NSw2IEBACiAJZGVwZW5kcyBvbiBYRlNfUVVPVEEgfHwgUVVPVEEKIAlkZWZhdWx0IHkKIAotY29uZmlnIEROT1RJRlkKLQlib29sICJEbm90aWZ5IHN1cHBvcnQiCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgRG5vdGlmeSBpcyBhIGRpcmVjdG9yeS1iYXNlZCBwZXItZmQgZmlsZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIHN5c3RlbQotCSAgdGhhdCB1c2VzIHNpZ25hbHMgdG8gY29tbXVuaWNhdGUgZXZlbnRzIHRvIHVzZXItc3BhY2UuICBUaGVyZSBleGlzdAotCSAgc3VwZXJpb3IgYWx0ZXJuYXRpdmVzLCBidXQgc29tZSBhcHBsaWNhdGlvbnMgbWF5IHN0aWxsIHJlbHkgb24KLQkgIGRub3RpZnkuCi0KLQkgIElmIHVuc3VyZSwgc2F5IFkuCi0KIGNvbmZpZyBBVVRPRlNfRlMKIAl0cmlzdGF0ZSAiS2VybmVsIGF1dG9tb3VudGVyIHN1cHBvcnQiCiAJaGVscApAQCAtNzEzLDcgKzY4MCw3IEBACiAJZGVwZW5kcyBvbiAoVURGX0ZTPW0gJiYgTkxTKSB8fCAoVURGX0ZTPXkgJiYgTkxTPXkpCiAKIGVuZG1lbnUKLWVuZGlmCitlbmRpZiAjIEJMT0NLCiAKIGlmIEJMT0NLCiBtZW51ICJET1MvRkFUL05UIEZpbGVzeXN0ZW1zIgpAQCAtODk2LDcgKzg2Myw3IEBACiAJICBJdCBpcyBwZXJmZWN0bHkgc2FmZSB0byBzYXkgTiBoZXJlLgogCiBlbmRtZW51Ci1lbmRpZgorZW5kaWYgIyBCTE9DSwogCiBtZW51ICJQc2V1ZG8gZmlsZXN5c3RlbXMiCiAKQEAgLTE0MTcsNiArMTM4NCwyNCBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKIAkgIGNhbGxlZCBmcmVldnhmcy4gIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBNSU5JWF9GUworCXRyaXN0YXRlICJNaW5peCBmaWxlIHN5c3RlbSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQkxPQ0sKKwloZWxwCisJICBNaW5peCBpcyBhIHNpbXBsZSBvcGVyYXRpbmcgc3lzdGVtIHVzZWQgaW4gbWFueSBjbGFzc2VzIGFib3V0IE9TJ3MuCisJICBUaGUgbWluaXggZmlsZSBzeXN0ZW0gKG1ldGhvZCB0byBvcmdhbml6ZSBmaWxlcyBvbiBhIGhhcmQgZGlzaworCSAgcGFydGl0aW9uIG9yIGEgZmxvcHB5IGRpc2spIHdhcyB0aGUgb3JpZ2luYWwgZmlsZSBzeXN0ZW0gZm9yIExpbnV4LAorCSAgYnV0IGhhcyBiZWVuIHN1cGVyc2VkZWQgYnkgdGhlIHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbSBleHQyZnMuCisJICBZb3UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIG1pbml4IGZpbGUgc3lzdGVtIG9uIHlvdXIgaGFyZCBkaXNrCisJICBiZWNhdXNlIG9mIGNlcnRhaW4gYnVpbHQtaW4gcmVzdHJpY3Rpb25zLCBidXQgaXQgaXMgc29tZXRpbWVzIGZvdW5kCisJICBvbiBvbGRlciBMaW51eCBmbG9wcHkgZGlza3MuICBUaGlzIG9wdGlvbiB3aWxsIGVubGFyZ2UgeW91ciBrZXJuZWwKKwkgIGJ5IGFib3V0IDI4IEtCLiBJZiB1bnN1cmUsIHNheSBOLgorCisJICBUbyBjb21waWxlIHRoaXMgZmlsZSBzeXN0ZW0gc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbWluaXguICBOb3RlIHRoYXQgdGhlIGZpbGUgc3lzdGVtIG9mIHlvdXIgcm9vdAorCSAgcGFydGl0aW9uICh0aGUgb25lIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeSAvKSBjYW5ub3QgYmUgY29tcGlsZWQgYXMKKwkgIGEgbW9kdWxlLgorCiAKIGNvbmZpZyBIUEZTX0ZTCiAJdHJpc3RhdGUgIk9TLzIgSFBGUyBmaWxlIHN5c3RlbSBzdXBwb3J0IgpAQCAtMTQzNCw3ICsxNDE5LDYgQEAKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBocGZzLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAogCi0KIGNvbmZpZyBRTlg0RlNfRlMKIAl0cmlzdGF0ZSAiUU5YNCBmaWxlIHN5c3RlbSBzdXBwb3J0IChyZWFkIG9ubHkpIgogCWRlcGVuZHMgb24gQkxPQ0sKQEAgLTE0NjEsNiArMTQ0NSwyMiBAQAogCSAgSXQncyBjdXJyZW50bHkgYnJva2VuLCBzbyBmb3Igbm93OgogCSAgYW5zd2VyIE4uCiAKK2NvbmZpZyBST01GU19GUworCXRyaXN0YXRlICJST00gZmlsZSBzeXN0ZW0gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJMT0NLCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIHZlcnkgc21hbGwgcmVhZC1vbmx5IGZpbGUgc3lzdGVtIG1haW5seSBpbnRlbmRlZCBmb3IKKwkgIGluaXRpYWwgcmFtIGRpc2tzIG9mIGluc3RhbGxhdGlvbiBkaXNrcywgYnV0IGl0IGNvdWxkIGJlIHVzZWQgZm9yCisJICBvdGhlciByZWFkLW9ubHkgbWVkaWEgYXMgd2VsbC4gIFJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcm9tZnMudHh0PiBmb3IgZGV0YWlscy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGZpbGUgc3lzdGVtIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHJvbWZzLiAgTm90ZSB0aGF0IHRoZSBmaWxlIHN5c3RlbSBvZiB5b3VyCisJICByb290IHBhcnRpdGlvbiAodGhlIG9uZSBjb250YWluaW5nIHRoZSBkaXJlY3RvcnkgLykgY2Fubm90IGJlIGEKKwkgIG1vZHVsZS4KKworCSAgSWYgeW91IGRvbid0IGtub3cgd2hldGhlciB5b3UgbmVlZCBpdCwgdGhlbiB5b3UgZG9uJ3QgbmVlZCBpdDoKKwkgIGFuc3dlciBOLgogCiAKIGNvbmZpZyBTWVNWX0ZTCkBAIC0xNTAxLDcgKzE1MDEsNiBAQAogCSAgSWYgeW91IGhhdmVuJ3QgaGVhcmQgYWJvdXQgYWxsIG9mIHRoaXMgYmVmb3JlLCBpdCdzIHNhZmUgdG8gc2F5IE4uCiAKIAotCiBjb25maWcgVUZTX0ZTCiAJdHJpc3RhdGUgIlVGUyBmaWxlIHN5c3RlbSBzdXBwb3J0IChyZWFkIG9ubHkpIgogCWRlcGVuZHMgb24gQkxPQ0sKQEAgLTE3NzksMTIgKzE3NzgsOSBAQAogCXRyaXN0YXRlCiAKIGNvbmZpZyBTVU5SUENfWFBSVF9SRE1BCi0JdHJpc3RhdGUgIlJETUEgdHJhbnNwb3J0IGZvciBzdW5ycGMgKEVYUEVSSU1FTlRBTCkiCisJdHJpc3RhdGUKIAlkZXBlbmRzIG9uIFNVTlJQQyAmJiBJTkZJTklCQU5EICYmIEVYUEVSSU1FTlRBTAotCWRlZmF1bHQgbQotCWhlbHAKLQkgIEFkZHMgYSBjbGllbnQgUlBDIHRyYW5zcG9ydCBmb3Igc3VwcG9ydGluZyBrZXJuZWwgTkZTIG92ZXIgUkRNQQotCSAgbW91bnRzLCBpbmNsdWRpbmcgSW5maW5pYmFuZCBhbmQgaVdBUlAuIEV4cGVyaW1lbnRhbC4KKwlkZWZhdWx0IFNVTlJQQyAmJiBJTkZJTklCQU5ECiAKIGNvbmZpZyBTVU5SUENfQklORDM0CiAJYm9vbCAiU3VwcG9ydCBmb3IgcnBjYmluZCB2ZXJzaW9ucyAzICYgNCAoRVhQRVJJTUVOVEFMKSIKZGlmZiAtLWdpdCBhL2ZzL0tjb25maWcuYmluZm10IGIvZnMvS2NvbmZpZy5iaW5mbXQKaW5kZXggN2MzZDVmOS4uYjVjM2I2MSAxMDA2NDQKLS0tIGEvZnMvS2NvbmZpZy5iaW5mbXQKKysrIGIvZnMvS2NvbmZpZy5iaW5mbXQKQEAgLTYxLDcgKzYxLDggQEAKIAogY29uZmlnIEJJTkZNVF9BT1VUCiAJdHJpc3RhdGUgIktlcm5lbCBzdXBwb3J0IGZvciBhLm91dCBhbmQgRUNPRkYgYmluYXJpZXMiCi0JZGVwZW5kcyBvbiBYODZfMzIgfHwgQUxQSEEgfHwgQVJNIHx8IE02OEsgfHwgU1BBUkMzMgorCWRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19BT1VUICYmIFwKKwkJKFg4Nl8zMiB8fCBBTFBIQSB8fCBBUk0gfHwgTTY4SyB8fCBTUEFSQzMyKQogCS0tLWhlbHAtLS0KIAkgIEEub3V0IChBc3NlbWJsZXIuT1VUcHV0KSBpcyBhIHNldCBvZiBmb3JtYXRzIGZvciBsaWJyYXJpZXMgYW5kCiAJICBleGVjdXRhYmxlcyB1c2VkIGluIHRoZSBlYXJsaWVzdCB2ZXJzaW9ucyBvZiBVTklYLiAgTGludXggdXNlZApkaWZmIC0tZ2l0IGEvZnMvYWRmcy9zdXBlci5jIGIvZnMvYWRmcy9zdXBlci5jCmluZGV4IGIzNjY5NWEuLjllNDIxZWUgMTAwNjQ0Ci0tLSBhL2ZzL2FkZnMvc3VwZXIuYworKysgYi9mcy9hZGZzL3N1cGVyLmMKQEAgLTIwLDYgKzIwLDggQEAKICNpbmNsdWRlIDxsaW51eC92ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTMwLDYgKzMyLDkgQEAKICNpbmNsdWRlICJkaXJfZi5oIgogI2luY2x1ZGUgImRpcl9mcGx1cy5oIgogCisjZGVmaW5lIEFERlNfREVGQVVMVF9PV05FUl9NQVNLIFNfSVJXWFUKKyNkZWZpbmUgQURGU19ERUZBVUxUX09USEVSX01BU0sgKFNfSVJXWEcgfCBTX0lSV1hPKQorCiB2b2lkIF9fYWRmc19lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmdW5jdGlvbiwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAJY2hhciBlcnJvcl9idWZbMTI4XTsKQEAgLTEzNCw2ICsxMzksMjIgQEAKIAlzYi0+c19mc19pbmZvID0gTlVMTDsKIH0KIAorc3RhdGljIGludCBhZGZzX3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJc3RydWN0IGFkZnNfc2JfaW5mbyAqYXNiID0gQURGU19TQihtbnQtPm1udF9zYik7CisKKwlpZiAoYXNiLT5zX3VpZCAhPSAwKQorCQlzZXFfcHJpbnRmKHNlcSwgIix1aWQ9JXUiLCBhc2ItPnNfdWlkKTsKKwlpZiAoYXNiLT5zX2dpZCAhPSAwKQorCQlzZXFfcHJpbnRmKHNlcSwgIixnaWQ9JXUiLCBhc2ItPnNfZ2lkKTsKKwlpZiAoYXNiLT5zX293bmVyX21hc2sgIT0gQURGU19ERUZBVUxUX09XTkVSX01BU0spCisJCXNlcV9wcmludGYoc2VxLCAiLG93bm1hc2s9JW8iLCBhc2ItPnNfb3duZXJfbWFzayk7CisJaWYgKGFzYi0+c19vdGhlcl9tYXNrICE9IEFERlNfREVGQVVMVF9PVEhFUl9NQVNLKQorCQlzZXFfcHJpbnRmKHNlcSwgIixvdGhtYXNrPSVvIiwgYXNiLT5zX290aGVyX21hc2spOworCisJcmV0dXJuIDA7Cit9CisKIGVudW0ge09wdF91aWQsIE9wdF9naWQsIE9wdF9vd25tYXNrLCBPcHRfb3RobWFzaywgT3B0X2Vycn07CiAKIHN0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKQEAgLTI1OSw2ICsyODAsNyBAQAogCS5wdXRfc3VwZXIJPSBhZGZzX3B1dF9zdXBlciwKIAkuc3RhdGZzCQk9IGFkZnNfc3RhdGZzLAogCS5yZW1vdW50X2ZzCT0gYWRmc19yZW1vdW50LAorCS5zaG93X29wdGlvbnMJPSBhZGZzX3Nob3dfb3B0aW9ucywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYWRmc19kaXNjbWFwICphZGZzX3JlYWRfbWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBhZGZzX2Rpc2NyZWNvcmQgKmRyKQpAQCAtMzQ0LDggKzM2Niw4IEBACiAJLyogc2V0IGRlZmF1bHQgb3B0aW9ucyAqLwogCWFzYi0+c191aWQgPSAwOwogCWFzYi0+c19naWQgPSAwOwotCWFzYi0+c19vd25lcl9tYXNrID0gU19JUldYVTsKLQlhc2ItPnNfb3RoZXJfbWFzayA9IFNfSVJXWEcgfCBTX0lSV1hPOworCWFzYi0+c19vd25lcl9tYXNrID0gQURGU19ERUZBVUxUX09XTkVSX01BU0s7CisJYXNiLT5zX290aGVyX21hc2sgPSBBREZTX0RFRkFVTFRfT1RIRVJfTUFTSzsKIAogCWlmIChwYXJzZV9vcHRpb25zKHNiLCBkYXRhKSkKIAkJZ290byBlcnJvcjsKZGlmZiAtLWdpdCBhL2ZzL2FmZnMvYWZmcy5oIGIvZnMvYWZmcy9hZmZzLmgKaW5kZXggMjMyYzY5NC4uZDViZDQ5NyAxMDA2NDQKLS0tIGEvZnMvYWZmcy9hZmZzLmgKKysrIGIvZnMvYWZmcy9hZmZzLmgKQEAgLTE3NCw3ICsxNzQsOCBAQAogZXh0ZXJuIHZvaWQJCQkgYWZmc19kcm9wX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogZXh0ZXJuIHZvaWQJCQkgYWZmc19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CiBleHRlcm4gdm9pZAkJCSBhZmZzX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwotZXh0ZXJuIHZvaWQJCQkgYWZmc19yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworZXh0ZXJuIHN0cnVjdCBpbm9kZQkJKmFmZnNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCQl1bnNpZ25lZCBsb25nIGlubyk7CiBleHRlcm4gaW50CQkJIGFmZnNfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50KTsKIGV4dGVybiBpbnQJCQkgYWZmc19hZGRfZW50cnkoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgczMyIHR5cGUpOwogCmRpZmYgLS1naXQgYS9mcy9hZmZzL2FtaWdhZmZzLmMgYi9mcy9hZmZzL2FtaWdhZmZzLmMKaW5kZXggZjRkZTRiOS4uODA1NTczMCAxMDA2NDQKLS0tIGEvZnMvYWZmcy9hbWlnYWZmcy5jCisrKyBiL2ZzL2FmZnMvYW1pZ2FmZnMuYwpAQCAtMTcwLDkgKzE3MCwxMSBAQAogCQlpZiAoIWxpbmtfYmgpCiAJCQlnb3RvIGRvbmU7CiAKLQkJZGlyID0gaWdldChzYiwgYmUzMl90b19jcHUoQUZGU19UQUlMKHNiLCBsaW5rX2JoKS0+cGFyZW50KSk7Ci0JCWlmICghZGlyKQorCQlkaXIgPSBhZmZzX2lnZXQoc2IsIGJlMzJfdG9fY3B1KEFGRlNfVEFJTChzYiwgbGlua19iaCktPnBhcmVudCkpOworCQlpZiAoSVNfRVJSKGRpcikpIHsKKwkJCXJldHZhbCA9IFBUUl9FUlIoZGlyKTsKIAkJCWdvdG8gZG9uZTsKKwkJfQogCiAJCWFmZnNfbG9ja19kaXIoZGlyKTsKIAkJYWZmc19maXhfZGNhY2hlKGRlbnRyeSwgbGlua19pbm8pOwpkaWZmIC0tZ2l0IGEvZnMvYWZmcy9pbm9kZS5jIGIvZnMvYWZmcy9pbm9kZS5jCmluZGV4IDQ2MDlhNmMuLjI3ZmU2Y2IgMTAwNjQ0Ci0tLSBhL2ZzL2FmZnMvaW5vZGUuYworKysgYi9mcy9hZmZzL2lub2RlLmMKQEAgLTE1LDIwICsxNSwyNSBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwogZXh0ZXJuIHN0cnVjdCB0aW1lem9uZSBzeXNfdHo7CiAKLXZvaWQKLWFmZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQorc3RydWN0IGlub2RlICphZmZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBpbm8pCiB7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrCSpzYiA9IGlub2RlLT5pX3NiOwogCXN0cnVjdCBhZmZzX3NiX2luZm8JKnNiaSA9IEFGRlNfU0Ioc2IpOwogCXN0cnVjdCBidWZmZXJfaGVhZAkqYmg7CiAJc3RydWN0IGFmZnNfaGVhZAkqaGVhZDsKIAlzdHJ1Y3QgYWZmc190YWlsCSp0YWlsOworCXN0cnVjdCBpbm9kZQkJKmlub2RlOwogCXUzMgkJCSBibG9jazsKIAl1MzIJCQkgc2l6ZTsKIAl1MzIJCQkgcHJvdDsKIAl1MTYJCQkgaWQ7CiAKLQlwcl9kZWJ1ZygiQUZGUzogcmVhZF9pbm9kZSglbHUpXG4iLGlub2RlLT5pX2lubyk7CisJaW5vZGUgPSBpZ2V0X2xvY2tlZChzYiwgaW5vKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSkKKwkJcmV0dXJuIGlub2RlOworCisJcHJfZGVidWcoIkFGRlM6IGFmZnNfaWdldCglbHUpXG4iLCBpbm9kZS0+aV9pbm8pOwogCiAJYmxvY2sgPSBpbm9kZS0+aV9pbm87CiAJYmggPSBhZmZzX2JyZWFkKHNiLCBibG9jayk7CkBAIC0xNTQsMTIgKzE1OSwxMyBAQAogCQkJIHN5c190ei50el9taW51dGVzd2VzdCAqIDYwOwogCWlub2RlLT5pX210aW1lLnR2X25zZWMgPSBpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IDA7CiAJYWZmc19icmVsc2UoYmgpOwotCXJldHVybjsKKwl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKwlyZXR1cm4gaW5vZGU7CiAKIGJhZF9pbm9kZToKLQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CiAJYWZmc19icmVsc2UoYmgpOwotCXJldHVybjsKKwlpZ2V0X2ZhaWxlZChpbm9kZSk7CisJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CiB9CiAKIGludApkaWZmIC0tZ2l0IGEvZnMvYWZmcy9uYW1laS5jIGIvZnMvYWZmcy9uYW1laS5jCmluZGV4IGE0MjE0M2MuLjIyMThmMWUgMTAwNjQ0Ci0tLSBhL2ZzL2FmZnMvbmFtZWkuYworKysgYi9mcy9hZmZzL25hbWVpLmMKQEAgLTIwOCw5ICsyMDgsOCBAQAogCWFmZnNfbG9ja19kaXIoZGlyKTsKIAliaCA9IGFmZnNfZmluZF9lbnRyeShkaXIsIGRlbnRyeSk7CiAJYWZmc191bmxvY2tfZGlyKGRpcik7Ci0JaWYgKElTX0VSUihiaCkpIHsKLQkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihiaCkpOwotCX0KKwlpZiAoSVNfRVJSKGJoKSkKKwkJcmV0dXJuIEVSUl9DQVNUKGJoKTsKIAlpZiAoYmgpIHsKIAkJdTMyIGlubyA9IGJoLT5iX2Jsb2NrbnI7CiAKQEAgLTIyMywxMCArMjIyLDkgQEAKIAkJCWlubyA9IGJlMzJfdG9fY3B1KEFGRlNfVEFJTChzYiwgYmgpLT5vcmlnaW5hbCk7CiAJCX0KIAkJYWZmc19icmVsc2UoYmgpOwotCQlpbm9kZSA9IGlnZXQoc2IsIGlubyk7Ci0JCWlmICghaW5vZGUpIHsKLQkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwotCQl9CisJCWlub2RlID0gYWZmc19pZ2V0KHNiLCBpbm8pOworCQlpZiAoSVNfRVJSKGlub2RlKSkKKwkJCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoaW5vZGUpKTsKIAl9CiAJZGVudHJ5LT5kX29wID0gQUZGU19TQihzYiktPnNfZmxhZ3MgJiBTRl9JTlRMID8gJmFmZnNfaW50bF9kZW50cnlfb3BlcmF0aW9ucyA6ICZhZmZzX2RlbnRyeV9vcGVyYXRpb25zOwogCWRfYWRkKGRlbnRyeSwgaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvYWZmcy9zdXBlci5jIGIvZnMvYWZmcy9zdXBlci5jCmluZGV4IGI1M2U1ZDAuLmQyZGMwNDcgMTAwNjQ0Ci0tLSBhL2ZzL2FmZnMvc3VwZXIuYworKysgYi9mcy9hZmZzL3N1cGVyLmMKQEAgLTExMyw3ICsxMTMsNiBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGFmZnNfc29wcyA9IHsKIAkuYWxsb2NfaW5vZGUJPSBhZmZzX2FsbG9jX2lub2RlLAogCS5kZXN0cm95X2lub2RlCT0gYWZmc19kZXN0cm95X2lub2RlLAotCS5yZWFkX2lub2RlCT0gYWZmc19yZWFkX2lub2RlLAogCS53cml0ZV9pbm9kZQk9IGFmZnNfd3JpdGVfaW5vZGUsCiAJLnB1dF9pbm9kZQk9IGFmZnNfcHV0X2lub2RlLAogCS5kcm9wX2lub2RlCT0gYWZmc19kcm9wX2lub2RlLApAQCAtMTIzLDYgKzEyMiw3IEBACiAJLndyaXRlX3N1cGVyCT0gYWZmc193cml0ZV9zdXBlciwKIAkuc3RhdGZzCQk9IGFmZnNfc3RhdGZzLAogCS5yZW1vdW50X2ZzCT0gYWZmc19yZW1vdW50LAorCS5zaG93X29wdGlvbnMJPSBnZW5lcmljX3Nob3dfb3B0aW9ucywKIH07CiAKIGVudW0gewpAQCAtMjcxLDYgKzI3MSw5IEBACiAJdW5zaWduZWQgbG9uZwkJIG1vdW50X2ZsYWdzOwogCWludAkJCSB0bXBfZmxhZ3M7CS8qIGZpeCByZW1vdW50IHByb3RvdHlwZS4uLiAqLwogCXU4CQkJIHNpZ1s0XTsKKwlpbnQJCQkgcmV0ID0gLUVJTlZBTDsKKworCXNhdmVfbW91bnRfb3B0aW9ucyhzYiwgZGF0YSk7CiAKIAlwcl9kZWJ1ZygiQUZGUzogcmVhZF9zdXBlciglcylcbiIsZGF0YSA/IChjb25zdCBjaGFyICopZGF0YSA6ICJubyBvcHRpb25zIik7CiAKQEAgLTQ0NCw3ICs0NDcsMTIgQEAKIAogCS8qIHNldCB1cCBlbm91Z2ggc28gdGhhdCBpdCBjYW4gcmVhZCBhbiBpbm9kZSAqLwogCi0Jcm9vdF9pbm9kZSA9IGlnZXQoc2IsIHJvb3RfYmxvY2spOworCXJvb3RfaW5vZGUgPSBhZmZzX2lnZXQoc2IsIHJvb3RfYmxvY2spOworCWlmIChJU19FUlIocm9vdF9pbm9kZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihyb290X2lub2RlKTsKKwkJZ290byBvdXRfZXJyb3Jfbm9pbm9kZTsKKwl9CisKIAlzYi0+c19yb290ID0gZF9hbGxvY19yb290KHJvb3RfaW5vZGUpOwogCWlmICghc2ItPnNfcm9vdCkgewogCQlwcmludGsoS0VSTl9FUlIgIkFGRlM6IEdldCByb290IGlub2RlIGZhaWxlZFxuIik7CkBAIC00NjEsMTIgKzQ2OSwxMyBAQAogb3V0X2Vycm9yOgogCWlmIChyb290X2lub2RlKQogCQlpcHV0KHJvb3RfaW5vZGUpOworb3V0X2Vycm9yX25vaW5vZGU6CiAJa2ZyZWUoc2JpLT5zX2JpdG1hcCk7CiAJYWZmc19icmVsc2Uocm9vdF9iaCk7CiAJa2ZyZWUoc2JpLT5zX3ByZWZpeCk7CiAJa2ZyZWUoc2JpKTsKIAlzYi0+c19mc19pbmZvID0gTlVMTDsKLQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50CkBAIC00ODEsMTQgKzQ5MCwyMSBAQAogCWludAkJCSByb290X2Jsb2NrOwogCXVuc2lnbmVkIGxvbmcJCSBtb3VudF9mbGFnczsKIAlpbnQJCQkgcmVzID0gMDsKKwljaGFyCQkJKm5ld19vcHRzID0ga3N0cmR1cChkYXRhLCBHRlBfS0VSTkVMKTsKIAogCXByX2RlYnVnKCJBRkZTOiByZW1vdW50KGZsYWdzPTB4JXgsb3B0cz1cIiVzXCIpXG4iLCpmbGFncyxkYXRhKTsKIAogCSpmbGFncyB8PSBNU19OT0RJUkFUSU1FOwogCi0JaWYgKCFwYXJzZV9vcHRpb25zKGRhdGEsJnVpZCwmZ2lkLCZtb2RlLCZyZXNlcnZlZCwmcm9vdF9ibG9jaywKLQkgICAgJmJsb2Nrc2l6ZSwmc2JpLT5zX3ByZWZpeCxzYmktPnNfdm9sdW1lLCZtb3VudF9mbGFncykpCisJaWYgKCFwYXJzZV9vcHRpb25zKGRhdGEsICZ1aWQsICZnaWQsICZtb2RlLCAmcmVzZXJ2ZWQsICZyb290X2Jsb2NrLAorCQkJICAgJmJsb2Nrc2l6ZSwgJnNiaS0+c19wcmVmaXgsIHNiaS0+c192b2x1bWUsCisJCQkgICAmbW91bnRfZmxhZ3MpKSB7CisJCWtmcmVlKG5ld19vcHRzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWtmcmVlKHNiLT5zX29wdGlvbnMpOworCXNiLT5zX29wdGlvbnMgPSBuZXdfb3B0czsKKwogCXNiaS0+c19mbGFncyA9IG1vdW50X2ZsYWdzOwogCXNiaS0+c19tb2RlICA9IG1vZGU7CiAJc2JpLT5zX3VpZCAgID0gdWlkOwpkaWZmIC0tZ2l0IGEvZnMvYWZzL2Rpci5jIGIvZnMvYWZzL2Rpci5jCmluZGV4IDBjYzM1OTcuLmI1OGFmOGYgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9kaXIuYworKysgYi9mcy9hZnMvZGlyLmMKQEAgLTUxMiw3ICs1MTIsNyBAQAogCWtleSA9IGFmc19yZXF1ZXN0X2tleSh2bm9kZS0+dm9sdW1lLT5jZWxsKTsKIAlpZiAoSVNfRVJSKGtleSkpIHsKIAkJX2xlYXZlKCIgPSAlbGQgW2tleV0iLCBQVFJfRVJSKGtleSkpOwotCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKGtleSkpOworCQlyZXR1cm4gRVJSX0NBU1Qoa2V5KTsKIAl9CiAKIAlyZXQgPSBhZnNfdmFsaWRhdGUodm5vZGUsIGtleSk7CkBAIC01NDAsNyArNTQwLDcgQEAKIAlrZXlfcHV0KGtleSk7CiAJaWYgKElTX0VSUihpbm9kZSkpIHsKIAkJX2xlYXZlKCIgPSAlbGQiLCBQVFJfRVJSKGlub2RlKSk7Ci0JCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoaW5vZGUpKTsKKwkJcmV0dXJuIEVSUl9DQVNUKGlub2RlKTsKIAl9CiAKIAlkZW50cnktPmRfb3AgPSAmYWZzX2ZzX2RlbnRyeV9vcGVyYXRpb25zOwpkaWZmIC0tZ2l0IGEvZnMvYWZzL2lub2RlLmMgYi9mcy9hZnMvaW5vZGUuYwppbmRleCA4NDc1MGM4Li4wOGRiODJlIDEwMDY0NAotLS0gYS9mcy9hZnMvaW5vZGUuYworKysgYi9mcy9hZnMvaW5vZGUuYwpAQCAtMTk2LDEwICsxOTYsNyBAQAogCiAJLyogZmFpbHVyZSAqLwogYmFkX2lub2RlOgotCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKLQl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKLQlpcHV0KGlub2RlKTsKLQorCWlnZXRfZmFpbGVkKGlub2RlKTsKIAlfbGVhdmUoIiA9ICVkIFtiYWRdIiwgcmV0KTsKIAlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQpkaWZmIC0tZ2l0IGEvZnMvYWZzL3NlY3VyaXR5LmMgYi9mcy9hZnMvc2VjdXJpdHkuYwppbmRleCA1NjZmZTcxLi4zYmNiZWNlIDEwMDY0NAotLS0gYS9mcy9hZnMvc2VjdXJpdHkuYworKysgYi9mcy9hZnMvc2VjdXJpdHkuYwpAQCAtOTUsNyArOTUsNyBAQAogCQlhdXRoX2lub2RlID0gYWZzX2lnZXQodm5vZGUtPnZmc19pbm9kZS5pX3NiLCBrZXksCiAJCQkJICAgICAgJnZub2RlLT5zdGF0dXMucGFyZW50LCBOVUxMLCBOVUxMKTsKIAkJaWYgKElTX0VSUihhdXRoX2lub2RlKSkKLQkJCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoYXV0aF9pbm9kZSkpOworCQkJcmV0dXJuIEVSUl9DQVNUKGF1dGhfaW5vZGUpOwogCX0KIAogCWF1dGhfdm5vZGUgPSBBRlNfRlNfSShhdXRoX2lub2RlKTsKQEAgLTI4Nyw3ICsyODcsNyBAQAogaW50IGFmc19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKIAlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IEFGU19GU19JKGlub2RlKTsKLQlhZnNfYWNjZXNzX3QgYWNjZXNzOworCWFmc19hY2Nlc3NfdCB1bmluaXRpYWxpemVkX3ZhcihhY2Nlc3MpOwogCXN0cnVjdCBrZXkgKmtleTsKIAlpbnQgcmV0OwogCmRpZmYgLS1naXQgYS9mcy9hZnMvc3VwZXIuYyBiL2ZzL2Fmcy9zdXBlci5jCmluZGV4IDRiMjU1OGMuLjM2YmJjZTQgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9zdXBlci5jCisrKyBiL2ZzL2Fmcy9zdXBlci5jCkBAIC01Miw2ICs1Miw3IEBACiAJLmNsZWFyX2lub2RlCT0gYWZzX2NsZWFyX2lub2RlLAogCS51bW91bnRfYmVnaW4JPSBhZnNfdW1vdW50X2JlZ2luLAogCS5wdXRfc3VwZXIJPSBhZnNfcHV0X3N1cGVyLAorCS5zaG93X29wdGlvbnMJPSBnZW5lcmljX3Nob3dfb3B0aW9ucywKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqYWZzX2lub2RlX2NhY2hlcDsKQEAgLTM1Nyw2ICszNTgsNyBAQAogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CiAJc3RydWN0IGFmc192b2x1bWUgKnZvbDsKIAlzdHJ1Y3Qga2V5ICprZXk7CisJY2hhciAqbmV3X29wdHMgPSBrc3RyZHVwKG9wdGlvbnMsIEdGUF9LRVJORUwpOwogCWludCByZXQ7CiAKIAlfZW50ZXIoIiwsJXMsJXAiLCBkZXZfbmFtZSwgb3B0aW9ucyk7CkBAIC00MDgsOSArNDEwLDExIEBACiAJCQlkZWFjdGl2YXRlX3N1cGVyKHNiKTsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KKwkJc2ItPnNfb3B0aW9ucyA9IG5ld19vcHRzOwogCQlzYi0+c19mbGFncyB8PSBNU19BQ1RJVkU7CiAJfSBlbHNlIHsKIAkJX2RlYnVnKCJyZXVzZSIpOworCQlrZnJlZShuZXdfb3B0cyk7CiAJCUFTU0VSVENNUChzYi0+c19mbGFncywgJiwgTVNfQUNUSVZFKTsKIAl9CiAKQEAgLTQyNCw2ICs0MjgsNyBAQAogCWFmc19wdXRfdm9sdW1lKHBhcmFtcy52b2x1bWUpOwogCWFmc19wdXRfY2VsbChwYXJhbXMuY2VsbCk7CiAJa2V5X3B1dChwYXJhbXMua2V5KTsKKwlrZnJlZShuZXdfb3B0cyk7CiAJX2xlYXZlKCIgPSAlZCIsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2Fpby5jIGIvZnMvYWlvLmMKaW5kZXggOGEzN2RiYi4uYjc0YzU2NyAxMDA2NDQKLS0tIGEvZnMvYWlvLmMKKysrIGIvZnMvYWlvLmMKQEAgLTMxNyw3ICszMTcsNyBAQAogLyogd2FpdF9vbl9zeW5jX2tpb2NiOgogICoJV2FpdHMgb24gdGhlIGdpdmVuIHN5bmMga2lvY2IgdG8gY29tcGxldGUuCiAgKi8KLXNzaXplX3QgZmFzdGNhbGwgd2FpdF9vbl9zeW5jX2tpb2NiKHN0cnVjdCBraW9jYiAqaW9jYikKK3NzaXplX3Qgd2FpdF9vbl9zeW5jX2tpb2NiKHN0cnVjdCBraW9jYiAqaW9jYikKIHsKIAl3aGlsZSAoaW9jYi0+a2lfdXNlcnMpIHsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwpAQCAtMzM2LDcgKzMzNiw3IEBACiAgKiBnbyBhd2F5LCB0aGV5IHdpbGwgY2FsbCBwdXRfaW9jdHggYW5kIHJlbGVhc2UgYW55IHBpbm5lZCBtZW1vcnkKICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdCAoaGVsZCB2aWEgc3RydWN0IHBhZ2UgKiByZWZlcmVuY2VzKS4KICAqLwotdm9pZCBmYXN0Y2FsbCBleGl0X2FpbyhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3ZvaWQgZXhpdF9haW8oc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CiAJc3RydWN0IGtpb2N0eCAqY3R4ID0gbW0tPmlvY3R4X2xpc3Q7CiAJbW0tPmlvY3R4X2xpc3QgPSBOVUxMOwpAQCAtMzY1LDcgKzM2NSw3IEBACiAgKglDYWxsZWQgd2hlbiB0aGUgbGFzdCB1c2VyIG9mIGFuIGFpbyBjb250ZXh0IGhhcyBnb25lIGF3YXksCiAgKglhbmQgdGhlIHN0cnVjdCBuZWVkcyB0byBiZSBmcmVlZC4KICAqLwotdm9pZCBmYXN0Y2FsbCBfX3B1dF9pb2N0eChzdHJ1Y3Qga2lvY3R4ICpjdHgpCit2b2lkIF9fcHV0X2lvY3R4KHN0cnVjdCBraW9jdHggKmN0eCkKIHsKIAl1bnNpZ25lZCBucl9ldmVudHMgPSBjdHgtPm1heF9yZXFzOwogCkBAIC0zOTcsOCArMzk3LDcgQEAKICAqIFRoaXMgcHJldmVudHMgcmFjZXMgYmV0d2VlbiB0aGUgYWlvIGNvZGUgcGF0aCByZWZlcmVuY2luZyB0aGUKICAqIHJlcSAoYWZ0ZXIgc3VibWl0dGluZyBpdCkgYW5kIGFpb19jb21wbGV0ZSgpIGZyZWVpbmcgdGhlIHJlcS4KICAqLwotc3RhdGljIHN0cnVjdCBraW9jYiAqX19haW9fZ2V0X3JlcShzdHJ1Y3Qga2lvY3R4ICpjdHgpOwotc3RhdGljIHN0cnVjdCBraW9jYiBmYXN0Y2FsbCAqX19haW9fZ2V0X3JlcShzdHJ1Y3Qga2lvY3R4ICpjdHgpCitzdGF0aWMgc3RydWN0IGtpb2NiICpfX2Fpb19nZXRfcmVxKHN0cnVjdCBraW9jdHggKmN0eCkKIHsKIAlzdHJ1Y3Qga2lvY2IgKnJlcSA9IE5VTEw7CiAJc3RydWN0IGFpb19yaW5nICpyaW5nOwpAQCAtNTMzLDcgKzUzMiw3IEBACiAgKglSZXR1cm5zIHRydWUgaWYgdGhpcyBwdXQgd2FzIHRoZSBsYXN0IHVzZXIgb2YgdGhlIGtpb2NiLAogICoJZmFsc2UgaWYgdGhlIHJlcXVlc3QgaXMgc3RpbGwgaW4gdXNlLgogICovCi1pbnQgZmFzdGNhbGwgYWlvX3B1dF9yZXEoc3RydWN0IGtpb2NiICpyZXEpCitpbnQgYWlvX3B1dF9yZXEoc3RydWN0IGtpb2NiICpyZXEpCiB7CiAJc3RydWN0IGtpb2N0eCAqY3R4ID0gcmVxLT5raV9jdHg7CiAJaW50IHJldDsKQEAgLTg5Myw3ICs4OTIsNyBAQAogICogICAgICBUaGUgcmV0cnkgaXMgdXN1YWxseSBleGVjdXRlZCBieSBhaW8gd29ya3F1ZXVlCiAgKiAgICAgIHRocmVhZHMgKFNlZSBhaW9fa2lja19oYW5kbGVyKS4KICAqLwotdm9pZCBmYXN0Y2FsbCBraWNrX2lvY2Ioc3RydWN0IGtpb2NiICppb2NiKQordm9pZCBraWNrX2lvY2Ioc3RydWN0IGtpb2NiICppb2NiKQogewogCS8qIHN5bmMgaW9jYnMgYXJlIGVhc3k6IHRoZXkgY2FuIG9ubHkgZXZlciBiZSBleGVjdXRpbmcgZnJvbSBhIAogCSAqIHNpbmdsZSBjb250ZXh0LiAqLwpAQCAtOTEyLDcgKzkxMSw3IEBACiAgKglSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyB0aGUgbGFzdCB1c2VyIG9mIHRoZSByZXF1ZXN0LiAgVGhlIAogICoJb25seSBvdGhlciB1c2VyIG9mIHRoZSByZXF1ZXN0IGNhbiBiZSB0aGUgY2FuY2VsbGF0aW9uIGNvZGUuCiAgKi8KLWludCBmYXN0Y2FsbCBhaW9fY29tcGxldGUoc3RydWN0IGtpb2NiICppb2NiLCBsb25nIHJlcywgbG9uZyByZXMyKQoraW50IGFpb19jb21wbGV0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIGxvbmcgcmVzLCBsb25nIHJlczIpCiB7CiAJc3RydWN0IGtpb2N0eAkqY3R4ID0gaW9jYi0+a2lfY3R4OwogCXN0cnVjdCBhaW9fcmluZ19pbmZvCSppbmZvOwpAQCAtMTMzMCw2ICsxMzI5LDEwIEBACiAJCW9wY29kZSA9IElPQ0JfQ01EX1BXUklURVY7CiAJfQogCisJLyogVGhpcyBtYXRjaGVzIHRoZSBwcmVhZCgpL3B3cml0ZSgpIGxvZ2ljICovCisJaWYgKGlvY2ItPmtpX3BvcyA8IDApCisJCXJldHVybiAtRUlOVkFMOworCiAJZG8gewogCQlyZXQgPSByd19vcChpb2NiLCAmaW9jYi0+a2lfaW92ZWNbaW9jYi0+a2lfY3VyX3NlZ10sCiAJCQkgICAgaW9jYi0+a2lfbnJfc2VncyAtIGlvY2ItPmtpX2N1cl9zZWcsCkBAIC0xMzQ4LDYgKzEzNTEsMTMgQEAKIAlpZiAoKHJldCA9PSAwKSB8fCAoaW9jYi0+a2lfbGVmdCA9PSAwKSkKIAkJcmV0ID0gaW9jYi0+a2lfbmJ5dGVzIC0gaW9jYi0+a2lfbGVmdDsKIAorCS8qIElmIHdlIG1hbmFnZWQgdG8gd3JpdGUgc29tZSBvdXQgd2UgcmV0dXJuIHRoYXQsIHJhdGhlciB0aGFuCisJICogdGhlIGV2ZW50dWFsIGVycm9yLiAqLworCWlmIChvcGNvZGUgPT0gSU9DQl9DTURfUFdSSVRFVgorCSAgICAmJiByZXQgPCAwICYmIHJldCAhPSAtRUlPQ0JRVUVVRUQgJiYgcmV0ICE9IC1FSU9DQlJFVFJZCisJICAgICYmIGlvY2ItPmtpX25ieXRlcyAtIGlvY2ItPmtpX2xlZnQpCisJCXJldCA9IGlvY2ItPmtpX25ieXRlcyAtIGlvY2ItPmtpX2xlZnQ7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNTIzLDcgKzE1MzMsNyBAQAogCXJldHVybiAxOwogfQogCi1pbnQgZmFzdGNhbGwgaW9fc3VibWl0X29uZShzdHJ1Y3Qga2lvY3R4ICpjdHgsIHN0cnVjdCBpb2NiIF9fdXNlciAqdXNlcl9pb2NiLAoraW50IGlvX3N1Ym1pdF9vbmUoc3RydWN0IGtpb2N0eCAqY3R4LCBzdHJ1Y3QgaW9jYiBfX3VzZXIgKnVzZXJfaW9jYiwKIAkJCSBzdHJ1Y3QgaW9jYiAqaW9jYikKIHsKIAlzdHJ1Y3Qga2lvY2IgKnJlcTsKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mcy9hdXRvZnNfaS5oIGIvZnMvYXV0b2ZzL2F1dG9mc19pLmgKaW5kZXggOGI0Y2NhMy4uOTAxYTNlNiAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzL2F1dG9mc19pLmgKKysrIGIvZnMvYXV0b2ZzL2F1dG9mc19pLmgKQEAgLTE1MCw2ICsxNTAsNyBAQAogCiBpbnQgYXV0b2ZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICosIHZvaWQgKiwgaW50KTsKIHZvaWQgYXV0b2ZzX2tpbGxfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CitzdHJ1Y3QgaW5vZGUgKmF1dG9mc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1bnNpZ25lZCBsb25nKTsKIAogLyogUXVldWUgbWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KIApkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzL2lub2RlLmMgYi9mcy9hdXRvZnMvaW5vZGUuYwppbmRleCA0NWY1OTkyLi5kZGE1MTBkIDEwMDY0NAotLS0gYS9mcy9hdXRvZnMvaW5vZGUuYworKysgYi9mcy9hdXRvZnMvaW5vZGUuYwpAQCAtNTIsMTEgKzUyLDkgQEAKIAlraWxsX2Fub25fc3VwZXIoc2IpOwogfQogCi1zdGF0aWMgdm9pZCBhdXRvZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGF1dG9mc19zb3BzID0gewotCS5yZWFkX2lub2RlCT0gYXV0b2ZzX3JlYWRfaW5vZGUsCiAJLnN0YXRmcwkJPSBzaW1wbGVfc3RhdGZzLAorCS5zaG93X29wdGlvbnMJPSBnZW5lcmljX3Nob3dfb3B0aW9ucywKIH07CiAKIGVudW0ge09wdF9lcnIsIE9wdF9mZCwgT3B0X3VpZCwgT3B0X2dpZCwgT3B0X3BncnAsIE9wdF9taW5wcm90bywgT3B0X21heHByb3RvfTsKQEAgLTE0Myw2ICsxNDEsOCBAQAogCWludCBtaW5wcm90bywgbWF4cHJvdG87CiAJcGlkX3QgcGdpZDsKIAorCXNhdmVfbW91bnRfb3B0aW9ucyhzLCBkYXRhKTsKKwogCXNiaSA9IGt6YWxsb2Moc2l6ZW9mKCpzYmkpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNiaSkKIAkJZ290byBmYWlsX3VubG9jazsKQEAgLTE2NCw3ICsxNjQsOSBAQAogCXMtPnNfdGltZV9ncmFuID0gMTsKIAlzYmktPnNiID0gczsKIAotCXJvb3RfaW5vZGUgPSBpZ2V0KHMsIEFVVE9GU19ST09UX0lOTyk7CisJcm9vdF9pbm9kZSA9IGF1dG9mc19pZ2V0KHMsIEFVVE9GU19ST09UX0lOTyk7CisJaWYgKElTX0VSUihyb290X2lub2RlKSkKKwkJZ290byBmYWlsX2ZyZWU7CiAJcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKTsKIAlwaXBlID0gTlVMTDsKIApAQCAtMjMwLDExICsyMzIsMTcgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIHZvaWQgYXV0b2ZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3N0cnVjdCBpbm9kZSAqYXV0b2ZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBpbm8pCiB7Ci0JaW5vX3QgaW5vID0gaW5vZGUtPmlfaW5vOwogCXVuc2lnbmVkIGludCBuOwotCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpID0gYXV0b2ZzX3NiaShpbm9kZS0+aV9zYik7CisJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnNfc2JpKHNiKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJaW5vZGUgPSBpZ2V0X2xvY2tlZChzYiwgaW5vKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSkKKwkJcmV0dXJuIGlub2RlOwogCiAJLyogSW5pdGlhbGl6ZSB0byB0aGUgZGVmYXVsdCBjYXNlIChzdHViIGRpcmVjdG9yeSkgKi8KIApAQCAtMjUwLDcgKzI1OCw3IEBACiAJCWlub2RlLT5pX29wID0gJmF1dG9mc19yb290X2lub2RlX29wZXJhdGlvbnM7CiAJCWlub2RlLT5pX2ZvcCA9ICZhdXRvZnNfcm9vdF9vcGVyYXRpb25zOwogCQlpbm9kZS0+aV91aWQgPSBpbm9kZS0+aV9naWQgPSAwOyAvKiBDaGFuZ2VkIGluIHJlYWRfc3VwZXIgKi8KLQkJcmV0dXJuOworCQlnb3RvIGRvbmU7CiAJfSAKIAkKIAlpbm9kZS0+aV91aWQgPSBpbm9kZS0+aV9zYi0+c19yb290LT5kX2lub2RlLT5pX3VpZDsKQEAgLTI2Myw3ICsyNzEsNyBAQAogCQluID0gaW5vIC0gQVVUT0ZTX0ZJUlNUX1NZTUxJTks7CiAJCWlmIChuID49IEFVVE9GU19NQVhfU1lNTElOS1MgfHwgIXRlc3RfYml0KG4sc2JpLT5zeW1saW5rX2JpdG1hcCkpIHsKIAkJCXByaW50aygiYXV0b2ZzOiBMb29raW5nIGZvciBiYWQgc3ltbGluayBpbm9kZSAldVxuIiwgKHVuc2lnbmVkIGludCkgaW5vKTsKLQkJCXJldHVybjsKKwkJCWdvdG8gZG9uZTsKIAkJfQogCQkKIAkJaW5vZGUtPmlfb3AgPSAmYXV0b2ZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKQEAgLTI3NSw0ICsyODMsOCBAQAogCQlpbm9kZS0+aV9zaXplID0gc2wtPmxlbjsKIAkJaW5vZGUtPmlfbmxpbmsgPSAxOwogCX0KKworZG9uZToKKwl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKwlyZXR1cm4gaW5vZGU7CiB9CmRpZmYgLS1naXQgYS9mcy9hdXRvZnMvcm9vdC5jIGIvZnMvYXV0b2ZzL3Jvb3QuYwppbmRleCA1ZWZmZjNjLi44YWFjYWRlIDEwMDY0NAotLS0gYS9mcy9hdXRvZnMvcm9vdC5jCisrKyBiL2ZzL2F1dG9mcy9yb290LmMKQEAgLTExNCw4ICsxMTQsOCBAQAogCWRlbnRyeS0+ZF90aW1lID0gKHVuc2lnbmVkIGxvbmcpIGVudDsKIAkKIAlpZiAoIWRlbnRyeS0+ZF9pbm9kZSkgewotCQlpbm9kZSA9IGlnZXQoc2IsIGVudC0+aW5vKTsKLQkJaWYgKCFpbm9kZSkgeworCQlpbm9kZSA9IGF1dG9mc19pZ2V0KHNiLCBlbnQtPmlubyk7CisJCWlmIChJU19FUlIoaW5vZGUpKSB7CiAJCQkvKiBGYWlsZWQsIGJ1dCBsZWF2ZSBwZW5kaW5nIGZvciBuZXh0IHRpbWUgKi8KIAkJCXJldHVybiAxOwogCQl9CkBAIC0yNzQsNiArMjc0LDcgQEAKIAl1bnNpZ25lZCBpbnQgbjsKIAlpbnQgc2xzaXplOwogCXN0cnVjdCBhdXRvZnNfc3ltbGluayAqc2w7CisJc3RydWN0IGlub2RlICppbm9kZTsKIAogCURQUklOVEsoKCJhdXRvZnNfcm9vdF9zeW1saW5rOiAlcyA8LSAiLCBzeW1uYW1lKSk7CiAJYXV0b2ZzX3NheShkZW50cnktPmRfbmFtZS5uYW1lLGRlbnRyeS0+ZF9uYW1lLmxlbik7CkBAIC0zMzEsNyArMzMyLDEyIEBACiAJZW50LT5kZW50cnkgPSBOVUxMOwkvKiBXZSBkb24ndCBrZWVwIHRoZSBkZW50cnkgZm9yIHN5bWxpbmtzICovCiAKIAlhdXRvZnNfaGFzaF9pbnNlcnQoZGgsZW50KTsKLQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaWdldChkaXItPmlfc2IsZW50LT5pbm8pKTsKKworCWlub2RlID0gYXV0b2ZzX2lnZXQoZGlyLT5pX3NiLCBlbnQtPmlubyk7CisJaWYgKElTX0VSUihpbm9kZSkpCisJCXJldHVybiBQVFJfRVJSKGlub2RlKTsKKworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CiAJdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiAwOwogfQpAQCAtNDI4LDYgKzQzNCw3IEBACiAJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnNfc2JpKGRpci0+aV9zYik7CiAJc3RydWN0IGF1dG9mc19kaXJoYXNoICpkaCA9ICZzYmktPmRpcmhhc2g7CiAJc3RydWN0IGF1dG9mc19kaXJfZW50ICplbnQ7CisJc3RydWN0IGlub2RlICppbm9kZTsKIAlpbm9fdCBpbm87CiAKIAlsb2NrX2tlcm5lbCgpOwpAQCAtNDY5LDcgKzQ3NiwxNCBAQAogCWF1dG9mc19oYXNoX2luc2VydChkaCxlbnQpOwogCiAJaW5jX25saW5rKGRpcik7Ci0JZF9pbnN0YW50aWF0ZShkZW50cnksIGlnZXQoZGlyLT5pX3NiLGlubykpOworCisJaW5vZGUgPSBhdXRvZnNfaWdldChkaXItPmlfc2IsIGlubyk7CisJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJZHJvcF9ubGluayhkaXIpOworCQlyZXR1cm4gUFRSX0VSUihpbm9kZSk7CisJfQorCisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKIAl1bmxvY2tfa2VybmVsKCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvaW5vZGUuYyBiL2ZzL2F1dG9mczQvaW5vZGUuYwppbmRleCA3ZjA1ZDZjLi4yZmRjZjVlIDEwMDY0NAotLS0gYS9mcy9hdXRvZnM0L2lub2RlLmMKKysrIGIvZnMvYXV0b2ZzNC9pbm9kZS5jCkBAIC0xNzYsMTEgKzE3NiwxNiBAQAogc3RhdGljIGludCBhdXRvZnM0X3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewogCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpID0gYXV0b2ZzNF9zYmkobW50LT5tbnRfc2IpOworCXN0cnVjdCBpbm9kZSAqcm9vdF9pbm9kZSA9IG1udC0+bW50X3NiLT5zX3Jvb3QtPmRfaW5vZGU7CiAKIAlpZiAoIXNiaSkKIAkJcmV0dXJuIDA7CiAKIAlzZXFfcHJpbnRmKG0sICIsZmQ9JWQiLCBzYmktPnBpcGVmZCk7CisJaWYgKHJvb3RfaW5vZGUtPmlfdWlkICE9IDApCisJCXNlcV9wcmludGYobSwgIix1aWQ9JXUiLCByb290X2lub2RlLT5pX3VpZCk7CisJaWYgKHJvb3RfaW5vZGUtPmlfZ2lkICE9IDApCisJCXNlcV9wcmludGYobSwgIixnaWQ9JXUiLCByb290X2lub2RlLT5pX2dpZCk7CiAJc2VxX3ByaW50ZihtLCAiLHBncnA9JWQiLCBzYmktPm96X3BncnApOwogCXNlcV9wcmludGYobSwgIix0aW1lb3V0PSVsdSIsIHNiaS0+ZXhwX3RpbWVvdXQvSFopOwogCXNlcV9wcmludGYobSwgIixtaW5wcm90bz0lZCIsIHNiaS0+bWluX3Byb3RvKTsKZGlmZiAtLWdpdCBhL2ZzL2JhZF9pbm9kZS5jIGIvZnMvYmFkX2lub2RlLmMKaW5kZXggNTIxZmY3Yy4uZjFjMmVhOCAxMDA2NDQKLS0tIGEvZnMvYmFkX2lub2RlLmMKKysrIGIvZnMvYmFkX2lub2RlLmMKQEAgLTM1OSwzICszNTksMTcgQEAKIH0KIAogRVhQT1JUX1NZTUJPTChpc19iYWRfaW5vZGUpOworCisvKioKKyAqIGlnZXRfZmFpbGVkIC0gTWFyayBhbiB1bmRlci1jb25zdHJ1Y3Rpb24gaW5vZGUgYXMgZGVhZCBhbmQgcmVsZWFzZSBpdAorICogQGlub2RlOiBUaGUgaW5vZGUgdG8gZGlzY2FyZAorICoKKyAqIE1hcmsgYW4gdW5kZXItY29uc3RydWN0aW9uIGlub2RlIGFzIGRlYWQgYW5kIHJlbGVhc2UgaXQuCisgKi8KK3ZvaWQgaWdldF9mYWlsZWQoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CisJaXB1dChpbm9kZSk7Cit9CitFWFBPUlRfU1lNQk9MKGlnZXRfZmFpbGVkKTsKZGlmZiAtLWdpdCBhL2ZzL2JlZnMvbGludXh2ZnMuYyBiL2ZzL2JlZnMvbGludXh2ZnMuYwppbmRleCBiMjhhMjBlLi44MjEyM2ZmIDEwMDY0NAotLS0gYS9mcy9iZWZzL2xpbnV4dmZzLmMKKysrIGIvZnMvYmVmcy9saW51eHZmcy5jCkBAIC0zNSw3ICszNSw3IEBACiBzdGF0aWMgaW50IGJlZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKTsKIHN0YXRpYyBzZWN0b3JfdCBiZWZzX2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHNlY3Rvcl90IGJsb2NrKTsKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpiZWZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICopOwotc3RhdGljIHZvaWQgYmVmc19yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vKTsKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmJlZnNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZyk7CiBzdGF0aWMgc3RydWN0IGlub2RlICpiZWZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwogc3RhdGljIHZvaWQgYmVmc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogc3RhdGljIGludCBiZWZzX2luaXRfaW5vZGVjYWNoZSh2b2lkKTsKQEAgLTUyLDEyICs1MiwxMiBAQAogc3RhdGljIGludCBwYXJzZV9vcHRpb25zKGNoYXIgKiwgYmVmc19tb3VudF9vcHRpb25zICopOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgYmVmc19zb3BzID0gewotCS5yZWFkX2lub2RlCT0gYmVmc19yZWFkX2lub2RlLAkvKiBpbml0aWFsaXplICYgcmVhZCBpbm9kZSAqLwogCS5hbGxvY19pbm9kZQk9IGJlZnNfYWxsb2NfaW5vZGUsCS8qIGFsbG9jYXRlIGEgbmV3IGlub2RlICovCiAJLmRlc3Ryb3lfaW5vZGUJPSBiZWZzX2Rlc3Ryb3lfaW5vZGUsIC8qIGRlYWxsb2NhdGUgYW4gaW5vZGUgKi8KIAkucHV0X3N1cGVyCT0gYmVmc19wdXRfc3VwZXIsCS8qIHVuaW5pdCBzdXBlciAqLwogCS5zdGF0ZnMJCT0gYmVmc19zdGF0ZnMsCS8qIHN0YXRmcyAqLwogCS5yZW1vdW50X2ZzCT0gYmVmc19yZW1vdW50LAorCS5zaG93X29wdGlvbnMJPSBnZW5lcmljX3Nob3dfb3B0aW9ucywKIH07CiAKIC8qIHNsYWIgY2FjaGUgZm9yIGJlZnNfaW5vZGVfaW5mbyBvYmplY3RzICovCkBAIC0xOTgsOSArMTk4LDkgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT0RBVEEpOwogCX0KIAotCWlub2RlID0gaWdldChkaXItPmlfc2IsIChpbm9fdCkgb2Zmc2V0KTsKLQlpZiAoIWlub2RlKQotCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKKwlpbm9kZSA9IGJlZnNfaWdldChkaXItPmlfc2IsIChpbm9fdCkgb2Zmc2V0KTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJcmV0dXJuIEVSUl9DQVNUKGlub2RlKTsKIAogCWRfYWRkKGRlbnRyeSwgaW5vZGUpOwogCkBAIC0yOTYsMTcgKzI5NiwyMyBAQAogCWlub2RlX2luaXRfb25jZSgmYmktPnZmc19pbm9kZSk7CiB9CiAKLXN0YXRpYyB2b2lkCi1iZWZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmJlZnNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBsb25nIGlubykKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAliZWZzX2lub2RlICpyYXdfaW5vZGUgPSBOVUxMOwogCi0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwogCWJlZnNfc2JfaW5mbyAqYmVmc19zYiA9IEJFRlNfU0Ioc2IpOwogCWJlZnNfaW5vZGVfaW5mbyAqYmVmc19pbm8gPSBOVUxMOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJbG9uZyByZXQgPSAtRUlPOwogCi0JYmVmc19kZWJ1ZyhzYiwgIi0tLT4gYmVmc19yZWFkX2lub2RlKCkgIiAiaW5vZGUgPSAlbHUiLCBpbm9kZS0+aV9pbm8pOworCWJlZnNfZGVidWcoc2IsICItLS0+IGJlZnNfcmVhZF9pbm9kZSgpICIgImlub2RlID0gJWx1IiwgaW5vKTsKKworCWlub2RlID0gaWdldF9sb2NrZWQoc2IsIGlubyk7CisJaWYgKElTX0VSUihpbm9kZSkpCisJCXJldHVybiBpbm9kZTsKKwlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSkKKwkJcmV0dXJuIGlub2RlOwogCiAJYmVmc19pbm8gPSBCRUZTX0koaW5vZGUpOwogCkBAIC00MDIsMTUgKzQwOCwxNiBAQAogCiAJYnJlbHNlKGJoKTsKIAliZWZzX2RlYnVnKHNiLCAiPC0tLSBiZWZzX3JlYWRfaW5vZGUoKSIpOwotCXJldHVybjsKKwl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKwlyZXR1cm4gaW5vZGU7CiAKICAgICAgIHVuYWNxdWlyZV9iaDoKIAlicmVsc2UoYmgpOwogCiAgICAgICB1bmFjcXVpcmVfbm9uZToKLQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJaWdldF9mYWlsZWQoaW5vZGUpOwogCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfcmVhZF9pbm9kZSgpIC0gQmFkIGlub2RlIik7Ci0JcmV0dXJuOworCXJldHVybiBFUlJfUFRSKHJldCk7CiB9CiAKIC8qIEluaXRpYWxpemUgdGhlIGlub2RlIGNhY2hlLiBDYWxsZWQgYXQgZnMgc2V0dXAuCkBAIC03NTIsMTAgKzc1OSwxMiBAQAogCWJlZnNfc2JfaW5mbyAqYmVmc19zYjsKIAliZWZzX3N1cGVyX2Jsb2NrICpkaXNrX3NiOwogCXN0cnVjdCBpbm9kZSAqcm9vdDsKLQorCWxvbmcgcmV0ID0gLUVJTlZBTDsKIAljb25zdCB1bnNpZ25lZCBsb25nIHNiX2Jsb2NrID0gMDsKIAljb25zdCBvZmZfdCB4ODZfc2Jfb2ZmID0gNTEyOwogCisJc2F2ZV9tb3VudF9vcHRpb25zKHNiLCBkYXRhKTsKKwogCXNiLT5zX2ZzX2luZm8gPSBrbWFsbG9jKHNpemVvZiAoKmJlZnNfc2IpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc2ItPnNfZnNfaW5mbyA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUgpAQCAtODMzLDcgKzg0MiwxMSBAQAogCS8qIFNldCByZWFsIGJsb2Nrc2l6ZSBvZiBmcyAqLwogCXNiX3NldF9ibG9ja3NpemUoc2IsICh1bG9uZykgYmVmc19zYi0+YmxvY2tfc2l6ZSk7CiAJc2ItPnNfb3AgPSAoc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgKikgJmJlZnNfc29wczsKLQlyb290ID0gaWdldChzYiwgaWFkZHIyYmxvY2tubyhzYiwgJihiZWZzX3NiLT5yb290X2RpcikpKTsKKwlyb290ID0gYmVmc19pZ2V0KHNiLCBpYWRkcjJibG9ja25vKHNiLCAmKGJlZnNfc2ItPnJvb3RfZGlyKSkpOworCWlmIChJU19FUlIocm9vdCkpIHsKKwkJcmV0ID0gUFRSX0VSUihyb290KTsKKwkJZ290byB1bmFjcXVpcmVfcHJpdl9zYnA7CisJfQogCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CiAJaWYgKCFzYi0+c19yb290KSB7CiAJCWlwdXQocm9vdCk7CkBAIC04NjgsNyArODgxLDcgQEAKIAogICAgICAgdW5hY3F1aXJlX25vbmU6CiAJc2ItPnNfZnNfaW5mbyA9IE5VTEw7Ci0JcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvZnMvYmZzL2Jmcy5oIGIvZnMvYmZzL2Jmcy5oCmluZGV4IGFjN2E4YjEuLjcxZmFmNGQgMTAwNjQ0Ci0tLSBhL2ZzL2Jmcy9iZnMuaAorKysgYi9mcy9iZnMvYmZzLmgKQEAgLTQ0LDYgKzQ0LDggQEAKICNkZWZpbmUgcHJpbnRmKGZvcm1hdCwgYXJncy4uLikgXAogCXByaW50ayhLRVJOX0VSUiAiQkZTLWZzOiAlcygpOiAiIGZvcm1hdCwgX19GVU5DVElPTl9fLCAjIyBhcmdzKQogCisvKiBpbm9kZS5jICovCitleHRlcm4gc3RydWN0IGlub2RlICpiZnNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBsb25nIGlubyk7CiAKIC8qIGZpbGUuYyAqLwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGJmc19maWxlX2lub3BzOwpkaWZmIC0tZ2l0IGEvZnMvYmZzL2Rpci5jIGIvZnMvYmZzL2Rpci5jCmluZGV4IDFmZDA1NmQuLjAzNDk1MGMgMTAwNjQ0Ci0tLSBhL2ZzL2Jmcy9kaXIuYworKysgYi9mcy9iZnMvZGlyLmMKQEAgLTE0OCwxMCArMTQ4LDEwIEBACiAJaWYgKGJoKSB7CiAJCXVuc2lnbmVkIGxvbmcgaW5vID0gKHVuc2lnbmVkIGxvbmcpbGUxNl90b19jcHUoZGUtPmlubyk7CiAJCWJyZWxzZShiaCk7Ci0JCWlub2RlID0gaWdldChkaXItPmlfc2IsIGlubyk7Ci0JCWlmICghaW5vZGUpIHsKKwkJaW5vZGUgPSBiZnNfaWdldChkaXItPmlfc2IsIGlubyk7CisJCWlmIChJU19FUlIoaW5vZGUpKSB7CiAJCQl1bmxvY2tfa2VybmVsKCk7Ci0JCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKKwkJCXJldHVybiBFUlJfQ0FTVChpbm9kZSk7CiAJCX0KIAl9CiAJdW5sb2NrX2tlcm5lbCgpOwpkaWZmIC0tZ2l0IGEvZnMvYmZzL2lub2RlLmMgYi9mcy9iZnMvaW5vZGUuYwppbmRleCBhNjRhNzFkLi44ZGI2MjM4IDEwMDY0NAotLS0gYS9mcy9iZnMvaW5vZGUuYworKysgYi9mcy9iZnMvaW5vZGUuYwpAQCAtMzIsMTcgKzMyLDIyIEBACiAKIHZvaWQgZHVtcF9pbWFwKGNvbnN0IGNoYXIgKnByZWZpeCwgc3RydWN0IHN1cGVyX2Jsb2NrICpzKTsKIAotc3RhdGljIHZvaWQgYmZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3N0cnVjdCBpbm9kZSAqYmZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBpbm8pCiB7Ci0JdW5zaWduZWQgbG9uZyBpbm8gPSBpbm9kZS0+aV9pbm87CiAJc3RydWN0IGJmc19pbm9kZSAqZGk7CisJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCWludCBibG9jaywgb2ZmOwogCisJaW5vZGUgPSBpZ2V0X2xvY2tlZChzYiwgaW5vKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykpCisJCXJldHVybiBpbm9kZTsKKwogCWlmICgoaW5vIDwgQkZTX1JPT1RfSU5PKSB8fCAoaW5vID4gQkZTX1NCKGlub2RlLT5pX3NiKS0+c2lfbGFzdGkpKSB7CiAJCXByaW50ZigiQmFkIGlub2RlIG51bWJlciAlczolMDhseFxuIiwgaW5vZGUtPmlfc2ItPnNfaWQsIGlubyk7Ci0JCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKLQkJcmV0dXJuOworCQlnb3RvIGVycm9yOwogCX0KIAogCWJsb2NrID0gKGlubyAtIEJGU19ST09UX0lOTykgLyBCRlNfSU5PREVTX1BFUl9CTE9DSyArIDE7CkBAIC01MCw4ICs1NSw3IEBACiAJaWYgKCFiaCkgewogCQlwcmludGYoIlVuYWJsZSB0byByZWFkIGlub2RlICVzOiUwOGx4XG4iLCBpbm9kZS0+aV9zYi0+c19pZCwKIAkJCQkJCQkJCWlubyk7Ci0JCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKLQkJcmV0dXJuOworCQlnb3RvIGVycm9yOwogCX0KIAogCW9mZiA9IChpbm8gLSBCRlNfUk9PVF9JTk8pICUgQkZTX0lOT0RFU19QRVJfQkxPQ0s7CkBAIC04NSw2ICs4OSwxMiBAQAogCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSAwOwogCiAJYnJlbHNlKGJoKTsKKwl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKwlyZXR1cm4gaW5vZGU7CisKK2Vycm9yOgorCWlnZXRfZmFpbGVkKGlub2RlKTsKKwlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIH0KIAogc3RhdGljIGludCBiZnNfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHVudXNlZCkKQEAgLTI3Niw3ICsyODYsNiBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGJmc19zb3BzID0gewogCS5hbGxvY19pbm9kZQk9IGJmc19hbGxvY19pbm9kZSwKIAkuZGVzdHJveV9pbm9kZQk9IGJmc19kZXN0cm95X2lub2RlLAotCS5yZWFkX2lub2RlCT0gYmZzX3JlYWRfaW5vZGUsCiAJLndyaXRlX2lub2RlCT0gYmZzX3dyaXRlX2lub2RlLAogCS5kZWxldGVfaW5vZGUJPSBiZnNfZGVsZXRlX2lub2RlLAogCS5wdXRfc3VwZXIJPSBiZnNfcHV0X3N1cGVyLApAQCAtMzEyLDYgKzMyMSw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZTsKIAl1bnNpZ25lZCBpLCBpbWFwX2xlbjsKIAlzdHJ1Y3QgYmZzX3NiX2luZm8gKmluZm87CisJbG9uZyByZXQgPSAtRUlOVkFMOwogCiAJaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbmZvKQpAQCAtMzQ2LDE0ICszNTYsMTYgQEAKIAkJc2V0X2JpdChpLCBpbmZvLT5zaV9pbWFwKTsKIAogCXMtPnNfb3AgPSAmYmZzX3NvcHM7Ci0JaW5vZGUgPSBpZ2V0KHMsIEJGU19ST09UX0lOTyk7Ci0JaWYgKCFpbm9kZSkgeworCWlub2RlID0gYmZzX2lnZXQocywgQkZTX1JPT1RfSU5PKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkgeworCQlyZXQgPSBQVFJfRVJSKGlub2RlKTsKIAkJa2ZyZWUoaW5mby0+c2lfaW1hcCk7CiAJCWdvdG8gb3V0OwogCX0KIAlzLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3QoaW5vZGUpOwogCWlmICghcy0+c19yb290KSB7CiAJCWlwdXQoaW5vZGUpOworCQlyZXQgPSAtRU5PTUVNOwogCQlrZnJlZShpbmZvLT5zaV9pbWFwKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNDA0LDcgKzQxNiw3IEBACiAJYnJlbHNlKGJoKTsKIAlrZnJlZShpbmZvKTsKIAlzLT5zX2ZzX2luZm8gPSBOVUxMOwotCXJldHVybiAtRUlOVkFMOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYmZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9hb3V0LmMgYi9mcy9iaW5mbXRfYW91dC5jCmluZGV4IDc1OTZlMWUuLmExYmIyMjQgMTAwNjQ0Ci0tLSBhL2ZzL2JpbmZtdF9hb3V0LmMKKysrIGIvZnMvYmluZm10X2FvdXQuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2Eub3V0LWNvcmUuaD4KIAogc3RhdGljIGludCBsb2FkX2FvdXRfYmluYXJ5KHN0cnVjdCBsaW51eF9iaW5wcm0gKiwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKTsKIHN0YXRpYyBpbnQgbG9hZF9hb3V0X2xpYnJhcnkoc3RydWN0IGZpbGUqKTsKQEAgLTExNSwxMCArMTE2LDEwIEBACiAJY3VycmVudC0+ZmxhZ3MgfD0gUEZfRFVNUENPUkU7CiAgICAgICAgCXN0cm5jcHkoZHVtcC51X2NvbW0sIGN1cnJlbnQtPmNvbW0sIHNpemVvZihkdW1wLnVfY29tbSkpOwogI2lmbmRlZiBfX3NwYXJjX18KLQlkdW1wLnVfYXIwID0gKHZvaWQgKikoKCh1bnNpZ25lZCBsb25nKSgmZHVtcC5yZWdzKSkgLSAoKHVuc2lnbmVkIGxvbmcpKCZkdW1wKSkpOworCWR1bXAudV9hcjAgPSBvZmZzZXRvZihzdHJ1Y3QgdXNlciwgcmVncyk7CiAjZW5kaWYKIAlkdW1wLnNpZ25hbCA9IHNpZ25yOwotCWR1bXBfdGhyZWFkKHJlZ3MsICZkdW1wKTsKKwlhb3V0X2R1bXBfdGhyZWFkKHJlZ3MsICZkdW1wKTsKIAogLyogSWYgdGhlIHNpemUgb2YgdGhlIGR1bXAgZmlsZSBleGNlZWRzIHRoZSBybGltaXQsIHRoZW4gc2VlIHdoYXQgd291bGQgaGFwcGVuCiAgICBpZiB3ZSB3cm90ZSB0aGUgc3RhY2ssIGJ1dCBub3QgdGhlIGRhdGEgYXJlYS4gICovCmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfZWxmLmMgYi9mcy9iaW5mbXRfZWxmLmMKaW5kZXggMTExNzcxZC4uNDFhOTU4YSAxMDA2NDQKLS0tIGEvZnMvYmluZm10X2VsZi5jCisrKyBiL2ZzL2JpbmZtdF9lbGYuYwpAQCAtMTM0LDggKzEzNCw3IEBACiAKIHN0YXRpYyBpbnQKIGNyZWF0ZV9lbGZfdGFibGVzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0sIHN0cnVjdCBlbGZoZHIgKmV4ZWMsCi0JCWludCBpbnRlcnBfYW91dCwgdW5zaWduZWQgbG9uZyBsb2FkX2FkZHIsCi0JCXVuc2lnbmVkIGxvbmcgaW50ZXJwX2xvYWRfYWRkcikKKwkJdW5zaWduZWQgbG9uZyBsb2FkX2FkZHIsIHVuc2lnbmVkIGxvbmcgaW50ZXJwX2xvYWRfYWRkcikKIHsKIAl1bnNpZ25lZCBsb25nIHAgPSBicHJtLT5wOwogCWludCBhcmdjID0gYnBybS0+YXJnYzsKQEAgLTIyMywxMiArMjIyLDcgQEAKIAogCXNwID0gU1RBQ0tfQUREKHAsIGVpX2luZGV4KTsKIAotCWl0ZW1zID0gKGFyZ2MgKyAxKSArIChlbnZjICsgMSk7Ci0JaWYgKGludGVycF9hb3V0KSB7Ci0JCWl0ZW1zICs9IDM7IC8qIGEub3V0IGludGVycHJldGVycyByZXF1aXJlIGFyZ3YgJiBlbnZwIHRvbyAqLwotCX0gZWxzZSB7Ci0JCWl0ZW1zICs9IDE7IC8qIEVMRiBpbnRlcnByZXRlcnMgb25seSBwdXQgYXJnYyBvbiB0aGUgc3RhY2sgKi8KLQl9CisJaXRlbXMgPSAoYXJnYyArIDEpICsgKGVudmMgKyAxKSArIDE7CiAJYnBybS0+cCA9IFNUQUNLX1JPVU5EKHNwLCBpdGVtcyk7CiAKIAkvKiBQb2ludCBzcCBhdCB0aGUgbG93ZXN0IGFkZHJlc3Mgb24gdGhlIHN0YWNrICovCkBAIC0yNTEsMTYgKzI0NSw4IEBACiAJLyogTm93LCBsZXQncyBwdXQgYXJnYyAoYW5kIGFyZ3YsIGVudnAgaWYgYXBwcm9wcmlhdGUpIG9uIHRoZSBzdGFjayAqLwogCWlmIChfX3B1dF91c2VyKGFyZ2MsIHNwKyspKQogCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAoaW50ZXJwX2FvdXQpIHsKLQkJYXJndiA9IHNwICsgMjsKLQkJZW52cCA9IGFyZ3YgKyBhcmdjICsgMTsKLQkJaWYgKF9fcHV0X3VzZXIoKGVsZl9hZGRyX3QpKHVuc2lnbmVkIGxvbmcpYXJndiwgc3ArKykgfHwKLQkJICAgIF9fcHV0X3VzZXIoKGVsZl9hZGRyX3QpKHVuc2lnbmVkIGxvbmcpZW52cCwgc3ArKykpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9IGVsc2UgewotCQlhcmd2ID0gc3A7Ci0JCWVudnAgPSBhcmd2ICsgYXJnYyArIDE7Ci0JfQorCWFyZ3YgPSBzcDsKKwllbnZwID0gYXJndiArIGFyZ2MgKyAxOwogCiAJLyogUG9wdWxhdGUgYXJndiBhbmQgZW52cCAqLwogCXAgPSBjdXJyZW50LT5tbS0+YXJnX2VuZCA9IGN1cnJlbnQtPm1tLT5hcmdfc3RhcnQ7CkBAIC01MTMsNTkgKzQ5OSwxMiBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9hZF9hb3V0X2ludGVycChzdHJ1Y3QgZXhlYyAqaW50ZXJwX2V4LAotCQlzdHJ1Y3QgZmlsZSAqaW50ZXJwcmV0ZXIpCi17Ci0JdW5zaWduZWQgbG9uZyB0ZXh0X2RhdGEsIGVsZl9lbnRyeSA9IH4wVUw7Ci0JY2hhciBfX3VzZXIgKiBhZGRyOwotCWxvZmZfdCBvZmZzZXQ7Ci0KLQljdXJyZW50LT5tbS0+ZW5kX2NvZGUgPSBpbnRlcnBfZXgtPmFfdGV4dDsKLQl0ZXh0X2RhdGEgPSBpbnRlcnBfZXgtPmFfdGV4dCArIGludGVycF9leC0+YV9kYXRhOwotCWN1cnJlbnQtPm1tLT5lbmRfZGF0YSA9IHRleHRfZGF0YTsKLQljdXJyZW50LT5tbS0+YnJrID0gaW50ZXJwX2V4LT5hX2JzcyArIHRleHRfZGF0YTsKLQotCXN3aXRjaCAoTl9NQUdJQygqaW50ZXJwX2V4KSkgewotCWNhc2UgT01BR0lDOgotCQlvZmZzZXQgPSAzMjsKLQkJYWRkciA9IChjaGFyIF9fdXNlciAqKTA7Ci0JCWJyZWFrOwotCWNhc2UgWk1BR0lDOgotCWNhc2UgUU1BR0lDOgotCQlvZmZzZXQgPSBOX1RYVE9GRigqaW50ZXJwX2V4KTsKLQkJYWRkciA9IChjaGFyIF9fdXNlciAqKU5fVFhUQUREUigqaW50ZXJwX2V4KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZ290byBvdXQ7Ci0JfQotCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsJCi0JZG9fYnJrKDAsIHRleHRfZGF0YSk7Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JaWYgKCFpbnRlcnByZXRlci0+Zl9vcCB8fCAhaW50ZXJwcmV0ZXItPmZfb3AtPnJlYWQpCi0JCWdvdG8gb3V0OwotCWlmIChpbnRlcnByZXRlci0+Zl9vcC0+cmVhZChpbnRlcnByZXRlciwgYWRkciwgdGV4dF9kYXRhLCAmb2Zmc2V0KSA8IDApCi0JCWdvdG8gb3V0OwotCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylhZGRyLAotCSAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylhZGRyICsgdGV4dF9kYXRhKTsKLQotCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CQotCWRvX2JyayhFTEZfUEFHRVNUQVJUKHRleHRfZGF0YSArIEVMRl9NSU5fQUxJR04gLSAxKSwKLQkJaW50ZXJwX2V4LT5hX2Jzcyk7Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JZWxmX2VudHJ5ID0gaW50ZXJwX2V4LT5hX2VudHJ5OwotCi1vdXQ6Ci0JcmV0dXJuIGVsZl9lbnRyeTsKLX0KLQogLyoKICAqIFRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zIHVzZWQgdG8gbG9hZCBFTEYgc3R5bGUgZXhlY3V0YWJsZXMgYW5kIHNoYXJlZAogICogbGlicmFyaWVzLiAgVGhlcmUgaXMgbm8gYmluYXJ5IGRlcGVuZGVudCBjb2RlIGFueXdoZXJlIGVsc2UuCiAgKi8KIAogI2RlZmluZSBJTlRFUlBSRVRFUl9OT05FIDAKLSNkZWZpbmUgSU5URVJQUkVURVJfQU9VVCAxCiAjZGVmaW5lIElOVEVSUFJFVEVSX0VMRiAyCiAKICNpZm5kZWYgU1RBQ0tfUk5EX01BU0sKQEAgLTU5NCw3ICs1MzMsNiBAQAogIAl1bnNpZ25lZCBsb25nIGxvYWRfYWRkciA9IDAsIGxvYWRfYmlhcyA9IDA7CiAJaW50IGxvYWRfYWRkcl9zZXQgPSAwOwogCWNoYXIgKiBlbGZfaW50ZXJwcmV0ZXIgPSBOVUxMOwotCXVuc2lnbmVkIGludCBpbnRlcnByZXRlcl90eXBlID0gSU5URVJQUkVURVJfTk9ORTsKIAl1bnNpZ25lZCBsb25nIGVycm9yOwogCXN0cnVjdCBlbGZfcGhkciAqZWxmX3BwbnQsICplbGZfcGhkYXRhOwogCXVuc2lnbmVkIGxvbmcgZWxmX2JzcywgZWxmX2JyazsKQEAgLTYwNSw3ICs1NDMsNiBAQAogCXVuc2lnbmVkIGxvbmcgaW50ZXJwX2xvYWRfYWRkciA9IDA7CiAJdW5zaWduZWQgbG9uZyBzdGFydF9jb2RlLCBlbmRfY29kZSwgc3RhcnRfZGF0YSwgZW5kX2RhdGE7CiAJdW5zaWduZWQgbG9uZyByZWxvY19mdW5jX2Rlc2MgPSAwOwotCWNoYXIgcGFzc2VkX2ZpbGVub1s2XTsKIAlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlczsKIAlpbnQgZXhlY3V0YWJsZV9zdGFjayA9IEVYU1RBQ0tfREVGQVVMVDsKIAl1bnNpZ25lZCBsb25nIGRlZl9mbGFncyA9IDA7CkBAIC03NzQsNTkgKzcxMSwxOCBAQAogCiAJLyogU29tZSBzaW1wbGUgY29uc2lzdGVuY3kgY2hlY2tzIGZvciB0aGUgaW50ZXJwcmV0ZXIgKi8KIAlpZiAoZWxmX2ludGVycHJldGVyKSB7Ci0JCXN0YXRpYyBpbnQgd2FybjsKLQkJaW50ZXJwcmV0ZXJfdHlwZSA9IElOVEVSUFJFVEVSX0VMRiB8IElOVEVSUFJFVEVSX0FPVVQ7Ci0KLQkJLyogTm93IGZpZ3VyZSBvdXQgd2hpY2ggZm9ybWF0IG91ciBiaW5hcnkgaXMgKi8KLQkJaWYgKChOX01BR0lDKGxvYy0+aW50ZXJwX2V4KSAhPSBPTUFHSUMpICYmCi0JCSAgICAoTl9NQUdJQyhsb2MtPmludGVycF9leCkgIT0gWk1BR0lDKSAmJgotCQkgICAgKE5fTUFHSUMobG9jLT5pbnRlcnBfZXgpICE9IFFNQUdJQykpCi0JCQlpbnRlcnByZXRlcl90eXBlID0gSU5URVJQUkVURVJfRUxGOwotCi0JCWlmIChtZW1jbXAobG9jLT5pbnRlcnBfZWxmX2V4LmVfaWRlbnQsIEVMRk1BRywgU0VMRk1BRykgIT0gMCkKLQkJCWludGVycHJldGVyX3R5cGUgJj0gfklOVEVSUFJFVEVSX0VMRjsKLQotCQlpZiAoaW50ZXJwcmV0ZXJfdHlwZSA9PSBJTlRFUlBSRVRFUl9BT1VUICYmIHdhcm4gPCAxMCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYS5vdXQgRUxGIGludGVycHJldGVyICVzIGlzICIKLQkJCQkiZGVwcmVjYXRlZCBhbmQgd2lsbCBub3QgYmUgc3VwcG9ydGVkICIKLQkJCQkiYWZ0ZXIgTGludXggMi42LjI1XG4iLCBlbGZfaW50ZXJwcmV0ZXIpOwotCQkJd2FybisrOwotCQl9Ci0KIAkJcmV0dmFsID0gLUVMSUJCQUQ7Ci0JCWlmICghaW50ZXJwcmV0ZXJfdHlwZSkKKwkJLyogTm90IGFuIEVMRiBpbnRlcnByZXRlciAqLworCQlpZiAobWVtY21wKGxvYy0+aW50ZXJwX2VsZl9leC5lX2lkZW50LCBFTEZNQUcsIFNFTEZNQUcpICE9IDApCiAJCQlnb3RvIG91dF9mcmVlX2RlbnRyeTsKLQotCQkvKiBNYWtlIHN1cmUgb25seSBvbmUgdHlwZSB3YXMgc2VsZWN0ZWQgKi8KLQkJaWYgKChpbnRlcnByZXRlcl90eXBlICYgSU5URVJQUkVURVJfRUxGKSAmJgotCQkgICAgIGludGVycHJldGVyX3R5cGUgIT0gSU5URVJQUkVURVJfRUxGKSB7Ci0JICAgICAJCS8vIEZJWE1FIC0gcmF0ZWxpbWl0IHRoaXMgYmVmb3JlIHJlLWVuYWJsaW5nCi0JCQkvLyBwcmludGsoS0VSTl9XQVJOSU5HICJFTEY6IEFtYmlndW91cyB0eXBlLCB1c2luZyBFTEZcbiIpOwotCQkJaW50ZXJwcmV0ZXJfdHlwZSA9IElOVEVSUFJFVEVSX0VMRjsKLQkJfQogCQkvKiBWZXJpZnkgdGhlIGludGVycHJldGVyIGhhcyBhIHZhbGlkIGFyY2ggKi8KLQkJaWYgKChpbnRlcnByZXRlcl90eXBlID09IElOVEVSUFJFVEVSX0VMRikgJiYKLQkJICAgICFlbGZfY2hlY2tfYXJjaCgmbG9jLT5pbnRlcnBfZWxmX2V4KSkKKwkJaWYgKCFlbGZfY2hlY2tfYXJjaCgmbG9jLT5pbnRlcnBfZWxmX2V4KSkKIAkJCWdvdG8gb3V0X2ZyZWVfZGVudHJ5OwogCX0gZWxzZSB7CiAJCS8qIEV4ZWN1dGFibGVzIHdpdGhvdXQgYW4gaW50ZXJwcmV0ZXIgYWxzbyBuZWVkIGEgcGVyc29uYWxpdHkgICovCiAJCVNFVF9QRVJTT05BTElUWShsb2MtPmVsZl9leCwgMCk7CiAJfQogCi0JLyogT0ssIHdlIGFyZSBkb25lIHdpdGggdGhhdCwgbm93IHNldCB1cCB0aGUgYXJnIHN0dWZmLAotCSAgIGFuZCB0aGVuIHN0YXJ0IHRoaXMgc3Vja2VyIHVwICovCi0JaWYgKCghYnBybS0+c2hfYmFuZykgJiYgKGludGVycHJldGVyX3R5cGUgPT0gSU5URVJQUkVURVJfQU9VVCkpIHsKLQkJY2hhciAqcGFzc2VkX3AgPSBwYXNzZWRfZmlsZW5vOwotCQlzcHJpbnRmKHBhc3NlZF9maWxlbm8sICIlZCIsIGVsZl9leGVjX2ZpbGVubyk7Ci0KLQkJaWYgKGVsZl9pbnRlcnByZXRlcikgewotCQkJcmV0dmFsID0gY29weV9zdHJpbmdzX2tlcm5lbCgxLCAmcGFzc2VkX3AsIGJwcm0pOwotCQkJaWYgKHJldHZhbCkKLQkJCQlnb3RvIG91dF9mcmVlX2RlbnRyeTsgCi0JCQlicHJtLT5hcmdjKys7Ci0JCX0KLQl9Ci0KIAkvKiBGbHVzaCBhbGwgdHJhY2VzIG9mIHRoZSBjdXJyZW50bHkgcnVubmluZyBleGVjdXRhYmxlICovCiAJcmV0dmFsID0gZmx1c2hfb2xkX2V4ZWMoYnBybSk7CiAJaWYgKHJldHZhbCkKQEAgLTEwMDQsMjQgKzkwMCwxOSBAQAogCX0KIAogCWlmIChlbGZfaW50ZXJwcmV0ZXIpIHsKLQkJaWYgKGludGVycHJldGVyX3R5cGUgPT0gSU5URVJQUkVURVJfQU9VVCkgewotCQkJZWxmX2VudHJ5ID0gbG9hZF9hb3V0X2ludGVycCgmbG9jLT5pbnRlcnBfZXgsCi0JCQkJCQkgICAgIGludGVycHJldGVyKTsKLQkJfSBlbHNlIHsKLQkJCXVuc2lnbmVkIGxvbmcgdW5pbml0aWFsaXplZF92YXIoaW50ZXJwX21hcF9hZGRyKTsKKwkJdW5zaWduZWQgbG9uZyB1bmluaXRpYWxpemVkX3ZhcihpbnRlcnBfbWFwX2FkZHIpOwogCi0JCQllbGZfZW50cnkgPSBsb2FkX2VsZl9pbnRlcnAoJmxvYy0+aW50ZXJwX2VsZl9leCwKLQkJCQkJCSAgICBpbnRlcnByZXRlciwKLQkJCQkJCSAgICAmaW50ZXJwX21hcF9hZGRyLAotCQkJCQkJICAgIGxvYWRfYmlhcyk7Ci0JCQlpZiAoIUlTX0VSUigodm9pZCAqKWVsZl9lbnRyeSkpIHsKLQkJCQkvKgotCQkJCSAqIGxvYWRfZWxmX2ludGVycCgpIHJldHVybnMgcmVsb2NhdGlvbgotCQkJCSAqIGFkanVzdG1lbnQKLQkJCQkgKi8KLQkJCQlpbnRlcnBfbG9hZF9hZGRyID0gZWxmX2VudHJ5OwotCQkJCWVsZl9lbnRyeSArPSBsb2MtPmludGVycF9lbGZfZXguZV9lbnRyeTsKLQkJCX0KKwkJZWxmX2VudHJ5ID0gbG9hZF9lbGZfaW50ZXJwKCZsb2MtPmludGVycF9lbGZfZXgsCisJCQkJCSAgICBpbnRlcnByZXRlciwKKwkJCQkJICAgICZpbnRlcnBfbWFwX2FkZHIsCisJCQkJCSAgICBsb2FkX2JpYXMpOworCQlpZiAoIUlTX0VSUigodm9pZCAqKWVsZl9lbnRyeSkpIHsKKwkJCS8qCisJCQkgKiBsb2FkX2VsZl9pbnRlcnAoKSByZXR1cm5zIHJlbG9jYXRpb24KKwkJCSAqIGFkanVzdG1lbnQKKwkJCSAqLworCQkJaW50ZXJwX2xvYWRfYWRkciA9IGVsZl9lbnRyeTsKKwkJCWVsZl9lbnRyeSArPSBsb2MtPmludGVycF9lbGZfZXguZV9lbnRyeTsKIAkJfQogCQlpZiAoQkFEX0FERFIoZWxmX2VudHJ5KSkgewogCQkJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwpAQCAtMTA0NSw4ICs5MzYsNyBAQAogCiAJa2ZyZWUoZWxmX3BoZGF0YSk7CiAKLQlpZiAoaW50ZXJwcmV0ZXJfdHlwZSAhPSBJTlRFUlBSRVRFUl9BT1VUKQotCQlzeXNfY2xvc2UoZWxmX2V4ZWNfZmlsZW5vKTsKKwlzeXNfY2xvc2UoZWxmX2V4ZWNfZmlsZW5vKTsKIAogCXNldF9iaW5mbXQoJmVsZl9mb3JtYXQpOwogCkBAIC0xMDYxLDE1ICs5NTEsMTIgQEAKIAljb21wdXRlX2NyZWRzKGJwcm0pOwogCWN1cnJlbnQtPmZsYWdzICY9IH5QRl9GT1JLTk9FWEVDOwogCXJldHZhbCA9IGNyZWF0ZV9lbGZfdGFibGVzKGJwcm0sICZsb2MtPmVsZl9leCwKLQkJCSAgKGludGVycHJldGVyX3R5cGUgPT0gSU5URVJQUkVURVJfQU9VVCksCiAJCQkgIGxvYWRfYWRkciwgaW50ZXJwX2xvYWRfYWRkcik7CiAJaWYgKHJldHZhbCA8IDApIHsKIAkJc2VuZF9zaWcoU0lHS0lMTCwgY3VycmVudCwgMCk7CiAJCWdvdG8gb3V0OwogCX0KIAkvKiBOLkIuIHBhc3NlZF9maWxlbm8gbWlnaHQgbm90IGJlIGluaXRpYWxpemVkPyAqLwotCWlmIChpbnRlcnByZXRlcl90eXBlID09IElOVEVSUFJFVEVSX0FPVVQpCi0JCWN1cnJlbnQtPm1tLT5hcmdfc3RhcnQgKz0gc3RybGVuKHBhc3NlZF9maWxlbm8pICsgMTsKIAljdXJyZW50LT5tbS0+ZW5kX2NvZGUgPSBlbmRfY29kZTsKIAljdXJyZW50LT5tbS0+c3RhcnRfY29kZSA9IHN0YXJ0X2NvZGU7CiAJY3VycmVudC0+bW0tPnN0YXJ0X2RhdGEgPSBzdGFydF9kYXRhOwpkaWZmIC0tZ2l0IGEvZnMvYmluZm10X2ZsYXQuYyBiL2ZzL2JpbmZtdF9mbGF0LmMKaW5kZXggMzM3NjRmZC4uZDhhMDJmMSAxMDA2NDQKLS0tIGEvZnMvYmluZm10X2ZsYXQuYworKysgYi9mcy9iaW5mbXRfZmxhdC5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KLSNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfc29tLmMgYi9mcy9iaW5mbXRfc29tLmMKaW5kZXggOTIwOGM0MS4uMTRjNjM1MiAxMDA2NDQKLS0tIGEvZnMvYmluZm10X3NvbS5jCisrKyBiL2ZzL2JpbmZtdF9zb20uYwpAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCi0jaW5jbHVkZSA8YXNtL2Eub3V0Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogCmRpZmYgLS1naXQgYS9mcy9idWZmZXIuYyBiL2ZzL2J1ZmZlci5jCmluZGV4IDgyNmJhZjQuLjNlYmNjZjQgMTAwNjQ0Ci0tLSBhL2ZzL2J1ZmZlci5jCisrKyBiL2ZzL2J1ZmZlci5jCkBAIC02NywxNCArNjcsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBmYXN0Y2FsbCBfX2xvY2tfYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit2b2lkIF9fbG9ja19idWZmZXIoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKIAl3YWl0X29uX2JpdF9sb2NrKCZiaC0+Yl9zdGF0ZSwgQkhfTG9jaywgc3luY19idWZmZXIsCiAJCQkJCQkJVEFTS19VTklOVEVSUlVQVElCTEUpOwogfQogRVhQT1JUX1NZTUJPTChfX2xvY2tfYnVmZmVyKTsKIAotdm9pZCBmYXN0Y2FsbCB1bmxvY2tfYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit2b2lkIHVubG9ja19idWZmZXIoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKIAlzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKTsKIAljbGVhcl9idWZmZXJfbG9ja2VkKGJoKTsKQEAgLTY3OCw3ICs2NzgsNyBAQAogCX0gZWxzZSB7CiAJCUJVR19PTihtYXBwaW5nLT5hc3NvY19tYXBwaW5nICE9IGJ1ZmZlcl9tYXBwaW5nKTsKIAl9Ci0JaWYgKGxpc3RfZW1wdHkoJmJoLT5iX2Fzc29jX2J1ZmZlcnMpKSB7CisJaWYgKCFiaC0+Yl9hc3NvY19tYXApIHsKIAkJc3Bpbl9sb2NrKCZidWZmZXJfbWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKIAkJbGlzdF9tb3ZlX3RhaWwoJmJoLT5iX2Fzc29jX2J1ZmZlcnMsCiAJCQkJJm1hcHBpbmctPnByaXZhdGVfbGlzdCk7CkBAIC03OTQsNiArNzk0LDcgQEAKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCXN0cnVjdCBsaXN0X2hlYWQgdG1wOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOwogCWludCBlcnIgPSAwLCBlcnIyOwogCiAJSU5JVF9MSVNUX0hFQUQoJnRtcCk7CkBAIC04MDEsOSArODAyLDE0IEBACiAJc3Bpbl9sb2NrKGxvY2spOwogCXdoaWxlICghbGlzdF9lbXB0eShsaXN0KSkgewogCQliaCA9IEJIX0VOVFJZKGxpc3QtPm5leHQpOworCQltYXBwaW5nID0gYmgtPmJfYXNzb2NfbWFwOwogCQlfX3JlbW92ZV9hc3NvY19xdWV1ZShiaCk7CisJCS8qIEF2b2lkIHJhY2Ugd2l0aCBtYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZSgpIHdoaWNoIGRvZXMKKwkJICogYSBsb2NrbGVzcyBjaGVjayBhbmQgd2UgcmVseSBvbiBzZWVpbmcgdGhlIGRpcnR5IGJpdCAqLworCQlzbXBfbWIoKTsKIAkJaWYgKGJ1ZmZlcl9kaXJ0eShiaCkgfHwgYnVmZmVyX2xvY2tlZChiaCkpIHsKIAkJCWxpc3RfYWRkKCZiaC0+Yl9hc3NvY19idWZmZXJzLCAmdG1wKTsKKwkJCWJoLT5iX2Fzc29jX21hcCA9IG1hcHBpbmc7CiAJCQlpZiAoYnVmZmVyX2RpcnR5KGJoKSkgewogCQkJCWdldF9iaChiaCk7CiAJCQkJc3Bpbl91bmxvY2sobG9jayk7CkBAIC04MjIsOCArODI4LDE3IEBACiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnRtcCkpIHsKIAkJYmggPSBCSF9FTlRSWSh0bXAucHJldik7Ci0JCWxpc3RfZGVsX2luaXQoJmJoLT5iX2Fzc29jX2J1ZmZlcnMpOwogCQlnZXRfYmgoYmgpOworCQltYXBwaW5nID0gYmgtPmJfYXNzb2NfbWFwOworCQlfX3JlbW92ZV9hc3NvY19xdWV1ZShiaCk7CisJCS8qIEF2b2lkIHJhY2Ugd2l0aCBtYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZSgpIHdoaWNoIGRvZXMKKwkJICogYSBsb2NrbGVzcyBjaGVjayBhbmQgd2UgcmVseSBvbiBzZWVpbmcgdGhlIGRpcnR5IGJpdCAqLworCQlzbXBfbWIoKTsKKwkJaWYgKGJ1ZmZlcl9kaXJ0eShiaCkpIHsKKwkJCWxpc3RfYWRkKCZiaC0+Yl9hc3NvY19idWZmZXJzLAorCQkJCSAmYmgtPmJfYXNzb2NfbWFwLT5wcml2YXRlX2xpc3QpOworCQkJYmgtPmJfYXNzb2NfbWFwID0gbWFwcGluZzsKKwkJfQogCQlzcGluX3VubG9jayhsb2NrKTsKIAkJd2FpdF9vbl9idWZmZXIoYmgpOwogCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCkBAIC0xMTY0LDcgKzExNzksNyBAQAogICogbWFya19idWZmZXJfZGlydHkoKSBpcyBhdG9taWMuICBJdCB0YWtlcyBiaC0+Yl9wYWdlLT5tYXBwaW5nLT5wcml2YXRlX2xvY2ssCiAgKiBtYXBwaW5nLT50cmVlX2xvY2sgYW5kIHRoZSBnbG9iYWwgaW5vZGVfbG9jay4KICAqLwotdm9pZCBmYXN0Y2FsbCBtYXJrX2J1ZmZlcl9kaXJ0eShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQordm9pZCBtYXJrX2J1ZmZlcl9kaXJ0eShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewogCVdBUk5fT05fT05DRSghYnVmZmVyX3VwdG9kYXRlKGJoKSk7CiAJaWYgKCFidWZmZXJfZGlydHkoYmgpICYmICF0ZXN0X3NldF9idWZmZXJfZGlydHkoYmgpKQpAQCAtMTE5NSw3ICsxMjEwLDcgQEAKIHZvaWQgX19iZm9yZ2V0KHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7CiAJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKLQlpZiAoIWxpc3RfZW1wdHkoJmJoLT5iX2Fzc29jX2J1ZmZlcnMpKSB7CisJaWYgKGJoLT5iX2Fzc29jX21hcCkgewogCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqYnVmZmVyX21hcHBpbmcgPSBiaC0+Yl9wYWdlLT5tYXBwaW5nOwogCiAJCXNwaW5fbG9jaygmYnVmZmVyX21hcHBpbmctPnByaXZhdGVfbG9jayk7CkBAIC0xNDM2LDYgKzE0NTEsNyBAQAogewogCW9uX2VhY2hfY3B1KGludmFsaWRhdGVfYmhfbHJ1LCBOVUxMLCAxLCAxKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGludmFsaWRhdGVfYmhfbHJ1cyk7CiAKIHZvaWQgc2V0X2JoX3BhZ2Uoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKIAkJc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQpAQCAtMzAyMSw3ICszMDM3LDcgQEAKIAlkbyB7CiAJCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV4dCA9IGJoLT5iX3RoaXNfcGFnZTsKIAotCQlpZiAoIWxpc3RfZW1wdHkoJmJoLT5iX2Fzc29jX2J1ZmZlcnMpKQorCQlpZiAoYmgtPmJfYXNzb2NfbWFwKQogCQkJX19yZW1vdmVfYXNzb2NfcXVldWUoYmgpOwogCQliaCA9IG5leHQ7CiAJfSB3aGlsZSAoYmggIT0gaGVhZCk7CmRpZmYgLS1naXQgYS9mcy9jaGFyX2Rldi5jIGIvZnMvY2hhcl9kZXYuYwppbmRleCAyYzdhOGI1Li4wMzg2NzRhIDEwMDY0NAotLS0gYS9mcy9jaGFyX2Rldi5jCisrKyBiL2ZzL2NoYXJfZGV2LmMKQEAgLTM1Nyw3ICszNTcsNyBAQAogLyoKICAqIENhbGxlZCBldmVyeSB0aW1lIGEgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZSBpcyBvcGVuZWQKICAqLwotaW50IGNocmRldl9vcGVuKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCitzdGF0aWMgaW50IGNocmRldl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCXN0cnVjdCBjZGV2ICpwOwogCXN0cnVjdCBjZGV2ICpuZXcgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZnMuYyBiL2ZzL2NpZnMvY2lmc2ZzLmMKaW5kZXggZTlmNGVjNy4uZmNjNDM0MiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZnMuYworKysgYi9mcy9jaWZzL2NpZnNmcy5jCkBAIC0xNDcsMTAgKzE0NywxMSBAQAogI2VuZGlmCiAJc2ItPnNfYmxvY2tzaXplID0gQ0lGU19NQVhfTVNHU0laRTsKIAlzYi0+c19ibG9ja3NpemVfYml0cyA9IDE0OwkvKiBkZWZhdWx0IDIqKjE0ID0gQ0lGU19NQVhfTVNHU0laRSAqLwotCWlub2RlID0gaWdldChzYiwgUk9PVF9JKTsKKwlpbm9kZSA9IGNpZnNfaWdldChzYiwgUk9PVF9JKTsKIAotCWlmICghaW5vZGUpIHsKLQkJcmMgPSAtRU5PTUVNOworCWlmIChJU19FUlIoaW5vZGUpKSB7CisJCXJjID0gUFRSX0VSUihpbm9kZSk7CisJCWlub2RlID0gTlVMTDsKIAkJZ290byBvdXRfbm9fcm9vdDsKIAl9CiAKQEAgLTUyMCw3ICs1MjEsNiBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgY2lmc19zdXBlcl9vcHMgPSB7Ci0JLnJlYWRfaW5vZGUgPSBjaWZzX3JlYWRfaW5vZGUsCiAJLnB1dF9zdXBlciA9IGNpZnNfcHV0X3N1cGVyLAogCS5zdGF0ZnMgPSBjaWZzX3N0YXRmcywKIAkuYWxsb2NfaW5vZGUgPSBjaWZzX2FsbG9jX2lub2RlLApkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZnMuaCBiL2ZzL2NpZnMvY2lmc2ZzLmgKaW5kZXggMTk1YjE0ZC4uNjg5NzgzMCAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZnMuaAorKysgYi9mcy9jaWZzL2NpZnNmcy5oCkBAIC00NCw2ICs0NCw3IEBACiAKIC8qIEZ1bmN0aW9ucyByZWxhdGVkIHRvIGlub2RlcyAqLwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGNpZnNfZGlyX2lub2RlX29wczsKK2V4dGVybiBzdHJ1Y3QgaW5vZGUgKmNpZnNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZyk7CiBleHRlcm4gaW50IGNpZnNfY3JlYXRlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCwKIAkJICAgICAgIHN0cnVjdCBuYW1laWRhdGEgKik7CiBleHRlcm4gc3RydWN0IGRlbnRyeSAqY2lmc19sb29rdXAoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvaW5vZGUuYyBiL2ZzL2NpZnMvaW5vZGUuYwppbmRleCA0N2YyNjIxLi5iMWE0YTY1IDEwMDY0NAotLS0gYS9mcy9jaWZzL2lub2RlLmMKKysrIGIvZnMvY2lmcy9pbm9kZS5jCkBAIC01ODYsMTAgKzU4NiwxOCBAQAogfTsKIAogLyogZ2V0cyByb290IGlub2RlICovCi12b2lkIGNpZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQorc3RydWN0IGlub2RlICpjaWZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBpbm8pCiB7Ci0JaW50IHhpZCwgcmM7CisJaW50IHhpZDsKIAlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJbG9uZyByYzsKKworCWlub2RlID0gaWdldF9sb2NrZWQoc2IsIGlubyk7CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykpCisJCXJldHVybiBpbm9kZTsKIAogCWNpZnNfc2IgPSBDSUZTX1NCKGlub2RlLT5pX3NiKTsKIAl4aWQgPSBHZXRYaWQoKTsKQEAgLTYwNiwxMCArNjE0LDE4IEBACiAJCWlub2RlLT5pX2ZvcCA9ICZzaW1wbGVfZGlyX29wZXJhdGlvbnM7CiAJCWlub2RlLT5pX3VpZCA9IGNpZnNfc2ItPm1udF91aWQ7CiAJCWlub2RlLT5pX2dpZCA9IGNpZnNfc2ItPm1udF9naWQ7CisJCV9GcmVlWGlkKHhpZCk7CisJCWlnZXRfZmFpbGVkKGlub2RlKTsKKwkJcmV0dXJuIEVSUl9QVFIocmMpOwogCX0KIAotCS8qIGNhbiBub3QgY2FsbCBtYWNybyBGcmVlWGlkIGhlcmUgc2luY2UgaW4gYSB2b2lkIGZ1bmMgKi8KKwl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKworCS8qIGNhbiBub3QgY2FsbCBtYWNybyBGcmVlWGlkIGhlcmUgc2luY2UgaW4gYSB2b2lkIGZ1bmMKKwkgKiBUT0RPOiBUaGlzIGlzIG5vIGxvbmdlciB0cnVlCisJICovCiAJX0ZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gaW5vZGU7CiB9CiAKIGludCBjaWZzX3VubGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSkKZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdF9pb2N0bC5jIGIvZnMvY29tcGF0X2lvY3RsLmMKaW5kZXggZmZkYzAyMi4uZWUzMmMwZSAxMDA2NDQKLS0tIGEvZnMvY29tcGF0X2lvY3RsLmMKKysrIGIvZnMvY29tcGF0X2lvY3RsLmMKQEAgLTc4LDcgKzc4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9taWkuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9ib25kaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KLSNpbmNsdWRlIDxsaW51eC9kbS1pb2N0bC5oPgogCiAjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CiAjaW5jbHVkZSA8bGludXgvbHAuaD4KQEAgLTE5OTMsMzkgKzE5OTIsNiBAQAogQ09NUEFUSUJMRV9JT0NUTChSRVNUQVJUX0FSUkFZX1JXKQogQ09NUEFUSUJMRV9JT0NUTChHRVRfQklUTUFQX0ZJTEUpCiBVTE9OR19JT0NUTChTRVRfQklUTUFQX0ZJTEUpCi0vKiBETSAqLwotQ09NUEFUSUJMRV9JT0NUTChETV9WRVJTSU9OXzMyKQotQ09NUEFUSUJMRV9JT0NUTChETV9SRU1PVkVfQUxMXzMyKQotQ09NUEFUSUJMRV9JT0NUTChETV9MSVNUX0RFVklDRVNfMzIpCi1DT01QQVRJQkxFX0lPQ1RMKERNX0RFVl9DUkVBVEVfMzIpCi1DT01QQVRJQkxFX0lPQ1RMKERNX0RFVl9SRU1PVkVfMzIpCi1DT01QQVRJQkxFX0lPQ1RMKERNX0RFVl9SRU5BTUVfMzIpCi1DT01QQVRJQkxFX0lPQ1RMKERNX0RFVl9TVVNQRU5EXzMyKQotQ09NUEFUSUJMRV9JT0NUTChETV9ERVZfU1RBVFVTXzMyKQotQ09NUEFUSUJMRV9JT0NUTChETV9ERVZfV0FJVF8zMikKLUNPTVBBVElCTEVfSU9DVEwoRE1fVEFCTEVfTE9BRF8zMikKLUNPTVBBVElCTEVfSU9DVEwoRE1fVEFCTEVfQ0xFQVJfMzIpCi1DT01QQVRJQkxFX0lPQ1RMKERNX1RBQkxFX0RFUFNfMzIpCi1DT01QQVRJQkxFX0lPQ1RMKERNX1RBQkxFX1NUQVRVU18zMikKLUNPTVBBVElCTEVfSU9DVEwoRE1fTElTVF9WRVJTSU9OU18zMikKLUNPTVBBVElCTEVfSU9DVEwoRE1fVEFSR0VUX01TR18zMikKLUNPTVBBVElCTEVfSU9DVEwoRE1fREVWX1NFVF9HRU9NRVRSWV8zMikKLUNPTVBBVElCTEVfSU9DVEwoRE1fVkVSU0lPTikKLUNPTVBBVElCTEVfSU9DVEwoRE1fUkVNT1ZFX0FMTCkKLUNPTVBBVElCTEVfSU9DVEwoRE1fTElTVF9ERVZJQ0VTKQotQ09NUEFUSUJMRV9JT0NUTChETV9ERVZfQ1JFQVRFKQotQ09NUEFUSUJMRV9JT0NUTChETV9ERVZfUkVNT1ZFKQotQ09NUEFUSUJMRV9JT0NUTChETV9ERVZfUkVOQU1FKQotQ09NUEFUSUJMRV9JT0NUTChETV9ERVZfU1VTUEVORCkKLUNPTVBBVElCTEVfSU9DVEwoRE1fREVWX1NUQVRVUykKLUNPTVBBVElCTEVfSU9DVEwoRE1fREVWX1dBSVQpCi1DT01QQVRJQkxFX0lPQ1RMKERNX1RBQkxFX0xPQUQpCi1DT01QQVRJQkxFX0lPQ1RMKERNX1RBQkxFX0NMRUFSKQotQ09NUEFUSUJMRV9JT0NUTChETV9UQUJMRV9ERVBTKQotQ09NUEFUSUJMRV9JT0NUTChETV9UQUJMRV9TVEFUVVMpCi1DT01QQVRJQkxFX0lPQ1RMKERNX0xJU1RfVkVSU0lPTlMpCi1DT01QQVRJQkxFX0lPQ1RMKERNX1RBUkdFVF9NU0cpCi1DT01QQVRJQkxFX0lPQ1RMKERNX0RFVl9TRVRfR0VPTUVUUlkpCiAvKiBCaWcgSyAqLwogQ09NUEFUSUJMRV9JT0NUTChQSU9fRk9OVCkKIENPTVBBVElCTEVfSU9DVEwoR0lPX0ZPTlQpCkBAIC0yOTg2LDcgKzI5NTIsNyBAQAogCX0KIAogIGRvX2lvY3RsOgotCWVycm9yID0gdmZzX2lvY3RsKGZpbHAsIGZkLCBjbWQsIGFyZyk7CisJZXJyb3IgPSBkb192ZnNfaW9jdGwoZmlscCwgZmQsIGNtZCwgYXJnKTsKICBvdXRfZnB1dDoKIAlmcHV0X2xpZ2h0KGZpbHAsIGZwdXRfbmVlZGVkKTsKICBvdXQ6CmRpZmYgLS1naXQgYS9mcy9kZWJ1Z2ZzL2ZpbGUuYyBiL2ZzL2RlYnVnZnMvZmlsZS5jCmluZGV4IGZhNmI3ZjcuLmZkZGZmZTQgMTAwNjQ0Ci0tLSBhL2ZzL2RlYnVnZnMvZmlsZS5jCisrKyBiL2ZzL2RlYnVnZnMvZmlsZS5jCkBAIC01NiwxMyArNTYsMTUgQEAKIAkuZm9sbG93X2xpbmsgICAgPSBkZWJ1Z2ZzX2ZvbGxvd19saW5rLAogfTsKIAotc3RhdGljIHZvaWQgZGVidWdmc191OF9zZXQodm9pZCAqZGF0YSwgdTY0IHZhbCkKK3N0YXRpYyBpbnQgZGVidWdmc191OF9zZXQodm9pZCAqZGF0YSwgdTY0IHZhbCkKIHsKIAkqKHU4ICopZGF0YSA9IHZhbDsKKwlyZXR1cm4gMDsKIH0KLXN0YXRpYyB1NjQgZGVidWdmc191OF9nZXQodm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgZGVidWdmc191OF9nZXQodm9pZCAqZGF0YSwgdTY0ICp2YWwpCiB7Ci0JcmV0dXJuICoodTggKilkYXRhOworCSp2YWwgPSAqKHU4ICopZGF0YTsKKwlyZXR1cm4gMDsKIH0KIERFRklORV9TSU1QTEVfQVRUUklCVVRFKGZvcHNfdTgsIGRlYnVnZnNfdThfZ2V0LCBkZWJ1Z2ZzX3U4X3NldCwgIiVsbHVcbiIpOwogCkBAIC05NywxMyArOTksMTUgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRlYnVnZnNfY3JlYXRlX3U4KTsKIAotc3RhdGljIHZvaWQgZGVidWdmc191MTZfc2V0KHZvaWQgKmRhdGEsIHU2NCB2YWwpCitzdGF0aWMgaW50IGRlYnVnZnNfdTE2X3NldCh2b2lkICpkYXRhLCB1NjQgdmFsKQogewogCSoodTE2ICopZGF0YSA9IHZhbDsKKwlyZXR1cm4gMDsKIH0KLXN0YXRpYyB1NjQgZGVidWdmc191MTZfZ2V0KHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGRlYnVnZnNfdTE2X2dldCh2b2lkICpkYXRhLCB1NjQgKnZhbCkKIHsKLQlyZXR1cm4gKih1MTYgKilkYXRhOworCSp2YWwgPSAqKHUxNiAqKWRhdGE7CisJcmV0dXJuIDA7CiB9CiBERUZJTkVfU0lNUExFX0FUVFJJQlVURShmb3BzX3UxNiwgZGVidWdmc191MTZfZ2V0LCBkZWJ1Z2ZzX3UxNl9zZXQsICIlbGx1XG4iKTsKIApAQCAtMTM4LDEzICsxNDIsMTUgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRlYnVnZnNfY3JlYXRlX3UxNik7CiAKLXN0YXRpYyB2b2lkIGRlYnVnZnNfdTMyX3NldCh2b2lkICpkYXRhLCB1NjQgdmFsKQorc3RhdGljIGludCBkZWJ1Z2ZzX3UzMl9zZXQodm9pZCAqZGF0YSwgdTY0IHZhbCkKIHsKIAkqKHUzMiAqKWRhdGEgPSB2YWw7CisJcmV0dXJuIDA7CiB9Ci1zdGF0aWMgdTY0IGRlYnVnZnNfdTMyX2dldCh2b2lkICpkYXRhKQorc3RhdGljIGludCBkZWJ1Z2ZzX3UzMl9nZXQodm9pZCAqZGF0YSwgdTY0ICp2YWwpCiB7Ci0JcmV0dXJuICoodTMyICopZGF0YTsKKwkqdmFsID0gKih1MzIgKilkYXRhOworCXJldHVybiAwOwogfQogREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoZm9wc191MzIsIGRlYnVnZnNfdTMyX2dldCwgZGVidWdmc191MzJfc2V0LCAiJWxsdVxuIik7CiAKQEAgLTE3OSwxNCArMTg1LDE2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkZWJ1Z2ZzX2NyZWF0ZV91MzIpOwogCi1zdGF0aWMgdm9pZCBkZWJ1Z2ZzX3U2NF9zZXQodm9pZCAqZGF0YSwgdTY0IHZhbCkKK3N0YXRpYyBpbnQgZGVidWdmc191NjRfc2V0KHZvaWQgKmRhdGEsIHU2NCB2YWwpCiB7CiAJKih1NjQgKilkYXRhID0gdmFsOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdTY0IGRlYnVnZnNfdTY0X2dldCh2b2lkICpkYXRhKQorc3RhdGljIGludCBkZWJ1Z2ZzX3U2NF9nZXQodm9pZCAqZGF0YSwgdTY0ICp2YWwpCiB7Ci0JcmV0dXJuICoodTY0ICopZGF0YTsKKwkqdmFsID0gKih1NjQgKilkYXRhOworCXJldHVybiAwOwogfQogREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoZm9wc191NjQsIGRlYnVnZnNfdTY0X2dldCwgZGVidWdmc191NjRfc2V0LCAiJWxsdVxuIik7CiAKZGlmZiAtLWdpdCBhL2ZzL2RldnB0cy9pbm9kZS5jIGIvZnMvZGV2cHRzL2lub2RlLmMKaW5kZXggMDZlZjlhMi4uZjEyMGUxMiAxMDA2NDQKLS0tIGEvZnMvZGV2cHRzL2lub2RlLmMKKysrIGIvZnMvZGV2cHRzL2lub2RlLmMKQEAgLTIwLDkgKzIwLDEyIEBACiAjaW5jbHVkZSA8bGludXgvZGV2cHRzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CiAjaW5jbHVkZSA8bGludXgvZnNub3RpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogCiAjZGVmaW5lIERFVlBUU19TVVBFUl9NQUdJQyAweDFjZDEKIAorI2RlZmluZSBERVZQVFNfREVGQVVMVF9NT0RFIDA2MDAKKwogc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqZGV2cHRzX21udDsKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZXZwdHNfcm9vdDsKIApAQCAtMzIsNyArMzUsNyBAQAogCXVpZF90ICAgdWlkOwogCWdpZF90ICAgZ2lkOwogCXVtb2RlX3QgbW9kZTsKLX0gY29uZmlnID0gey5tb2RlID0gMDYwMH07Cit9IGNvbmZpZyA9IHsubW9kZSA9IERFVlBUU19ERUZBVUxUX01PREV9OwogCiBlbnVtIHsKIAlPcHRfdWlkLCBPcHRfZ2lkLCBPcHRfbW9kZSwKQEAgLTU0LDcgKzU3LDcgQEAKIAljb25maWcuc2V0Z2lkICA9IDA7CiAJY29uZmlnLnVpZCAgICAgPSAwOwogCWNvbmZpZy5naWQgICAgID0gMDsKLQljb25maWcubW9kZSAgICA9IDA2MDA7CisJY29uZmlnLm1vZGUgICAgPSBERVZQVFNfREVGQVVMVF9NT0RFOwogCiAJd2hpbGUgKChwID0gc3Ryc2VwKCZkYXRhLCAiLCIpKSAhPSBOVUxMKSB7CiAJCXN1YnN0cmluZ190IGFyZ3NbTUFYX09QVF9BUkdTXTsKQEAgLTgxLDcgKzg0LDcgQEAKIAkJY2FzZSBPcHRfbW9kZToKIAkJCWlmIChtYXRjaF9vY3RhbCgmYXJnc1swXSwgJm9wdGlvbikpCiAJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQljb25maWcubW9kZSA9IG9wdGlvbiAmIH5TX0lGTVQ7CisJCQljb25maWcubW9kZSA9IG9wdGlvbiAmIFNfSUFMTFVHTzsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJpbnRrKEtFUk5fRVJSICJkZXZwdHM6IGNhbGxlZCB3aXRoIGJvZ3VzIG9wdGlvbnNcbiIpOwpAQCAtOTIsOSArOTUsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBkZXZwdHNfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgdmZzbW91bnQgKnZmcykKK3sKKwlpZiAoY29uZmlnLnNldHVpZCkKKwkJc2VxX3ByaW50ZihzZXEsICIsdWlkPSV1IiwgY29uZmlnLnVpZCk7CisJaWYgKGNvbmZpZy5zZXRnaWQpCisJCXNlcV9wcmludGYoc2VxLCAiLGdpZD0ldSIsIGNvbmZpZy5naWQpOworCXNlcV9wcmludGYoc2VxLCAiLG1vZGU9JTAzbyIsIGNvbmZpZy5tb2RlKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgZGV2cHRzX3NvcHMgPSB7CiAJLnN0YXRmcwkJPSBzaW1wbGVfc3RhdGZzLAogCS5yZW1vdW50X2ZzCT0gZGV2cHRzX3JlbW91bnQsCisJLnNob3dfb3B0aW9ucwk9IGRldnB0c19zaG93X29wdGlvbnMsCiB9OwogCiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9mcy9kbG0vYXN0LmMgYi9mcy9kbG0vYXN0LmMKaW5kZXggNjMwODEyMi4uOGJmMzFlMyAxMDA2NDQKLS0tIGEvZnMvZGxtL2FzdC5jCisrKyBiL2ZzL2RsbS9hc3QuYwpAQCAtMzksNyArMzksNiBAQAogCQlkbG1fdXNlcl9hZGRfYXN0KGxrYiwgdHlwZSk7CiAJCXJldHVybjsKIAl9Ci0JRExNX0FTU0VSVChsa2ItPmxrYl9hc3RhZGRyICE9IERMTV9GQUtFX1VTRVJfQVNULCBkbG1fcHJpbnRfbGtiKGxrYik7KTsKIAogCXNwaW5fbG9jaygmYXN0X3F1ZXVlX2xvY2spOwogCWlmICghKGxrYi0+bGtiX2FzdF90eXBlICYgKEFTVF9DT01QIHwgQVNUX0JBU1QpKSkgewpAQCAtNTgsOCArNTcsOCBAQAogCXN0cnVjdCBkbG1fbHMgKmxzID0gTlVMTDsKIAlzdHJ1Y3QgZGxtX3JzYiAqciA9IE5VTEw7CiAJc3RydWN0IGRsbV9sa2IgKmxrYjsKLQl2b2lkICgqY2FzdCkgKGxvbmcgcGFyYW0pOwotCXZvaWQgKCpiYXN0KSAobG9uZyBwYXJhbSwgaW50IG1vZGUpOworCXZvaWQgKCpjYXN0KSAodm9pZCAqYXN0cGFyYW0pOworCXZvaWQgKCpiYXN0KSAodm9pZCAqYXN0cGFyYW0sIGludCBtb2RlKTsKIAlpbnQgdHlwZSA9IDAsIGZvdW5kLCBibW9kZTsKIAogCWZvciAoOzspIHsKQEAgLTgzLDggKzgyLDggQEAKIAkJaWYgKCFmb3VuZCkKIAkJCWJyZWFrOwogCi0JCWNhc3QgPSBsa2ItPmxrYl9hc3RhZGRyOwotCQliYXN0ID0gbGtiLT5sa2JfYmFzdGFkZHI7CisJCWNhc3QgPSBsa2ItPmxrYl9hc3RmbjsKKwkJYmFzdCA9IGxrYi0+bGtiX2Jhc3RmbjsKIAkJYm1vZGUgPSBsa2ItPmxrYl9iYXN0bW9kZTsKIAogCQlpZiAoKHR5cGUgJiBBU1RfQ09NUCkgJiYgY2FzdCkKZGlmZiAtLWdpdCBhL2ZzL2RsbS9jb25maWcuYyBiL2ZzL2RsbS9jb25maWcuYwppbmRleCAyZjhlM2M4Li5jM2FkMWRmIDEwMDY0NAotLS0gYS9mcy9kbG0vY29uZmlnLmMKKysrIGIvZnMvZGxtL2NvbmZpZy5jCkBAIC02MDQsNyArNjA0LDcgQEAKIAl9LAogfTsKIAotaW50IGRsbV9jb25maWdfaW5pdCh2b2lkKQoraW50IF9faW5pdCBkbG1fY29uZmlnX2luaXQodm9pZCkKIHsKIAljb25maWdfZ3JvdXBfaW5pdCgmY2x1c3RlcnNfcm9vdC5zdWJzeXMuc3VfZ3JvdXApOwogCW11dGV4X2luaXQoJmNsdXN0ZXJzX3Jvb3Quc3Vic3lzLnN1X211dGV4KTsKZGlmZiAtLWdpdCBhL2ZzL2RsbS9kZWJ1Z19mcy5jIGIvZnMvZGxtL2RlYnVnX2ZzLmMKaW5kZXggMTJjM2JmZC4uOGZjMjRmNCAxMDA2NDQKLS0tIGEvZnMvZGxtL2RlYnVnX2ZzLmMKKysrIGIvZnMvZGxtL2RlYnVnX2ZzLmMKQEAgLTE2MiwxNCArMTYyLDEyIEBACiAKIHN0YXRpYyB2b2lkIHByaW50X2xvY2soc3RydWN0IHNlcV9maWxlICpzLCBzdHJ1Y3QgZGxtX2xrYiAqbGtiLCBzdHJ1Y3QgZGxtX3JzYiAqcikKIHsKLQlzdHJ1Y3QgZGxtX3VzZXJfYXJncyAqdWE7CiAJdW5zaWduZWQgaW50IHdhaXRpbmcgPSAwOwogCXVpbnQ2NF90IHhpZCA9IDA7CiAKIAlpZiAobGtiLT5sa2JfZmxhZ3MgJiBETE1fSUZMX1VTRVIpIHsKLQkJdWEgPSAoc3RydWN0IGRsbV91c2VyX2FyZ3MgKikgbGtiLT5sa2JfYXN0cGFyYW07Ci0JCWlmICh1YSkKLQkJCXhpZCA9IHVhLT54aWQ7CisJCWlmIChsa2ItPmxrYl91YSkKKwkJCXhpZCA9IGxrYi0+bGtiX3VhLT54aWQ7CiAJfQogCiAJaWYgKGxrYi0+bGtiX3RpbWVzdGFtcCkKQEAgLTU0Myw3ICs1NDEsNyBAQAogCQlkZWJ1Z2ZzX3JlbW92ZShscy0+bHNfZGVidWdfbG9ja3NfZGVudHJ5KTsKIH0KIAotaW50IGRsbV9yZWdpc3Rlcl9kZWJ1Z2ZzKHZvaWQpCitpbnQgX19pbml0IGRsbV9yZWdpc3Rlcl9kZWJ1Z2ZzKHZvaWQpCiB7CiAJbXV0ZXhfaW5pdCgmZGVidWdfYnVmX2xvY2spOwogCWRsbV9yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKCJkbG0iLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2ZzL2RsbS9kaXIuYyBiL2ZzL2RsbS9kaXIuYwppbmRleCBmZjk3YmE5Li44NWRlZmViIDEwMDY0NAotLS0gYS9mcy9kbG0vZGlyLmMKKysrIGIvZnMvZGxtL2Rpci5jCkBAIC0yMjAsNiArMjIwLDcgQEAKIAkJbGFzdF9sZW4gPSAwOwogCiAJCWZvciAoOzspIHsKKwkJCWludCBsZWZ0OwogCQkJZXJyb3IgPSBkbG1fcmVjb3Zlcnlfc3RvcHBlZChscyk7CiAJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBvdXRfZnJlZTsKQEAgLTIzNSwxMiArMjM2LDIxIEBACiAJCQkgKiBwaWNrIG5hbWVsZW4vbmFtZSBwYWlycyBvdXQgb2YgcmVjZWl2ZWQgYnVmZmVyCiAJCQkgKi8KIAotCQkJYiA9IGxzLT5sc19yZWNvdmVyX2J1ZiArIHNpemVvZihzdHJ1Y3QgZGxtX3Jjb20pOworCQkJYiA9IGxzLT5sc19yZWNvdmVyX2J1Zi0+cmNfYnVmOworCQkJbGVmdCA9IGxzLT5sc19yZWNvdmVyX2J1Zi0+cmNfaGVhZGVyLmhfbGVuZ3RoOworCQkJbGVmdCAtPSBzaXplb2Yoc3RydWN0IGRsbV9yY29tKTsKIAogCQkJZm9yICg7OykgewotCQkJCW1lbWNweSgmbmFtZWxlbiwgYiwgc2l6ZW9mKHVpbnQxNl90KSk7Ci0JCQkJbmFtZWxlbiA9IGJlMTZfdG9fY3B1KG5hbWVsZW4pOwotCQkJCWIgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKwkJCQlfX2JlMTYgdjsKKworCQkJCWVycm9yID0gLUVJTlZBTDsKKwkJCQlpZiAobGVmdCA8IHNpemVvZihfX2JlMTYpKQorCQkJCQlnb3RvIG91dF9mcmVlOworCisJCQkJbWVtY3B5KCZ2LCBiLCBzaXplb2YoX19iZTE2KSk7CisJCQkJbmFtZWxlbiA9IGJlMTZfdG9fY3B1KHYpOworCQkJCWIgKz0gc2l6ZW9mKF9fYmUxNik7CisJCQkJbGVmdCAtPSBzaXplb2YoX19iZTE2KTsKIAogCQkJCS8qIG5hbWVsZW4gb2YgMHhGRkZGRiBtYXJrcyBlbmQgb2YgbmFtZXMgZm9yCiAJCQkJICAgdGhpcyBub2RlOyBuYW1lbGVuIG9mIDAgbWFya3MgZW5kIG9mIHRoZQpAQCAtMjUxLDYgKzI2MSwxMiBAQAogCQkJCWlmICghbmFtZWxlbikKIAkJCQkJYnJlYWs7CiAKKwkJCQlpZiAobmFtZWxlbiA+IGxlZnQpCisJCQkJCWdvdG8gb3V0X2ZyZWU7CisKKwkJCQlpZiAobmFtZWxlbiA+IERMTV9SRVNOQU1FX01BWExFTikKKwkJCQkJZ290byBvdXRfZnJlZTsKKwogCQkJCWVycm9yID0gLUVOT01FTTsKIAkJCQlkZSA9IGdldF9mcmVlX2RlKGxzLCBuYW1lbGVuKTsKIAkJCQlpZiAoIWRlKQpAQCAtMjYyLDYgKzI3OCw3IEBACiAJCQkJbWVtY3B5KGRlLT5uYW1lLCBiLCBuYW1lbGVuKTsKIAkJCQltZW1jcHkobGFzdF9uYW1lLCBiLCBuYW1lbGVuKTsKIAkJCQliICs9IG5hbWVsZW47CisJCQkJbGVmdCAtPSBuYW1lbGVuOwogCiAJCQkJYWRkX2VudHJ5X3RvX2hhc2gobHMsIGRlKTsKIAkJCQljb3VudCsrOwpAQCAtMzAyLDYgKzMxOSw5IEBACiAKIAl3cml0ZV91bmxvY2soJmxzLT5sc19kaXJ0YmxbYnVja2V0XS5sb2NrKTsKIAorCWlmIChuYW1lbGVuID4gRExNX1JFU05BTUVfTUFYTEVOKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRsbV9kaXJlbnRyeSkgKyBuYW1lbGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRlKQogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2ZzL2RsbS9kbG1faW50ZXJuYWwuaCBiL2ZzL2RsbS9kbG1faW50ZXJuYWwuaAppbmRleCBlYzYxYmJhLi5kMzBlYThiIDEwMDY0NAotLS0gYS9mcy9kbG0vZGxtX2ludGVybmFsLmgKKysrIGIvZnMvZGxtL2RsbV9pbnRlcm5hbC5oCkBAIC05Miw4ICs5Miw2IEBACiAgIH0gXAogfQogCi0jZGVmaW5lIERMTV9GQUtFX1VTRVJfQVNUIEVSUl9QVFIoLUVJTlZBTCkKLQogCiBzdHJ1Y3QgZGxtX2RpcmVudHJ5IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CkBAIC0xNDYsOSArMTQ0LDkgQEAKIAogc3RydWN0IGRsbV9hcmdzIHsKIAl1aW50MzJfdAkJZmxhZ3M7Ci0Jdm9pZAkJCSphc3RhZGRyOwotCWxvbmcJCQlhc3RwYXJhbTsKLQl2b2lkCQkJKmJhc3RhZGRyOworCXZvaWQJCQkoKmFzdGZuKSAodm9pZCAqYXN0cGFyYW0pOworCXZvaWQJCQkqYXN0cGFyYW07CisJdm9pZAkJCSgqYmFzdGZuKSAodm9pZCAqYXN0cGFyYW0sIGludCBtb2RlKTsKIAlpbnQJCQltb2RlOwogCXN0cnVjdCBkbG1fbGtzYgkJKmxrc2I7CiAJdW5zaWduZWQgbG9uZwkJdGltZW91dDsKQEAgLTI1Myw5ICsyNTEsMTIgQEAKIAogCWNoYXIJCQkqbGtiX2x2YnB0cjsKIAlzdHJ1Y3QgZGxtX2xrc2IJCSpsa2JfbGtzYjsgICAgICAvKiBjYWxsZXIncyBzdGF0dXMgYmxvY2sgKi8KLQl2b2lkCQkJKmxrYl9hc3RhZGRyOwkvKiBjYWxsZXIncyBhc3QgZnVuY3Rpb24gKi8KLQl2b2lkCQkJKmxrYl9iYXN0YWRkcjsJLyogY2FsbGVyJ3MgYmFzdCBmdW5jdGlvbiAqLwotCWxvbmcJCQlsa2JfYXN0cGFyYW07CS8qIGNhbGxlcidzIGFzdCBhcmcgKi8KKwl2b2lkCQkJKCpsa2JfYXN0Zm4pICh2b2lkICphc3RwYXJhbSk7CisJdm9pZAkJCSgqbGtiX2Jhc3RmbikgKHZvaWQgKmFzdHBhcmFtLCBpbnQgbW9kZSk7CisJdW5pb24geworCQl2b2lkCQkJKmxrYl9hc3RwYXJhbTsJLyogY2FsbGVyJ3MgYXN0IGFyZyAqLworCQlzdHJ1Y3QgZGxtX3VzZXJfYXJncwkqbGtiX3VhOworCX07CiB9OwogCiAKQEAgLTQwMywyOCArNDA0LDM0IEBACiAJY2hhcgkJCXJjX2J1ZlswXTsKIH07CiAKK3VuaW9uIGRsbV9wYWNrZXQgeworCXN0cnVjdCBkbG1faGVhZGVyCWhlYWRlcjsJCS8qIGNvbW1vbiB0byBvdGhlciB0d28gKi8KKwlzdHJ1Y3QgZGxtX21lc3NhZ2UJbWVzc2FnZTsKKwlzdHJ1Y3QgZGxtX3Jjb20JCXJjb207Cit9OworCiBzdHJ1Y3QgcmNvbV9jb25maWcgewotCXVpbnQzMl90CQlyZl9sdmJsZW47Ci0JdWludDMyX3QJCXJmX2xzZmxhZ3M7Ci0JdWludDY0X3QJCXJmX3VudXNlZDsKKwlfX2xlMzIJCQlyZl9sdmJsZW47CisJX19sZTMyCQkJcmZfbHNmbGFnczsKKwlfX2xlNjQJCQlyZl91bnVzZWQ7CiB9OwogCiBzdHJ1Y3QgcmNvbV9sb2NrIHsKLQl1aW50MzJfdAkJcmxfb3ducGlkOwotCXVpbnQzMl90CQlybF9sa2lkOwotCXVpbnQzMl90CQlybF9yZW1pZDsKLQl1aW50MzJfdAkJcmxfcGFyZW50X2xraWQ7Ci0JdWludDMyX3QJCXJsX3BhcmVudF9yZW1pZDsKLQl1aW50MzJfdAkJcmxfZXhmbGFnczsKLQl1aW50MzJfdAkJcmxfZmxhZ3M7Ci0JdWludDMyX3QJCXJsX2x2YnNlcTsKLQlpbnQJCQlybF9yZXN1bHQ7CisJX19sZTMyCQkJcmxfb3ducGlkOworCV9fbGUzMgkJCXJsX2xraWQ7CisJX19sZTMyCQkJcmxfcmVtaWQ7CisJX19sZTMyCQkJcmxfcGFyZW50X2xraWQ7CisJX19sZTMyCQkJcmxfcGFyZW50X3JlbWlkOworCV9fbGUzMgkJCXJsX2V4ZmxhZ3M7CisJX19sZTMyCQkJcmxfZmxhZ3M7CisJX19sZTMyCQkJcmxfbHZic2VxOworCV9fbGUzMgkJCXJsX3Jlc3VsdDsKIAlpbnQ4X3QJCQlybF9ycW1vZGU7CiAJaW50OF90CQkJcmxfZ3Jtb2RlOwogCWludDhfdAkJCXJsX3N0YXR1czsKIAlpbnQ4X3QJCQlybF9hc3RzOwotCXVpbnQxNl90CQlybF93YWl0X3R5cGU7Ci0JdWludDE2X3QJCXJsX25hbWVsZW47CisJX19sZTE2CQkJcmxfd2FpdF90eXBlOworCV9fbGUxNgkJCXJsX25hbWVsZW47CiAJY2hhcgkJCXJsX25hbWVbRExNX1JFU05BTUVfTUFYTEVOXTsKIAljaGFyCQkJcmxfbHZiWzBdOwogfTsKQEAgLTQ5NCw3ICs1MDEsNyBAQAogCXN0cnVjdCByd19zZW1hcGhvcmUJbHNfcmVjdl9hY3RpdmU7CS8qIGJsb2NrIGRsbV9yZWN2ICovCiAJc3RydWN0IGxpc3RfaGVhZAlsc19yZXF1ZXN0cXVldWU7LyogcXVldWUgcmVtb3RlIHJlcXVlc3RzICovCiAJc3RydWN0IG11dGV4CQlsc19yZXF1ZXN0cXVldWVfbXV0ZXg7Ci0JY2hhcgkJCSpsc19yZWNvdmVyX2J1ZjsKKwlzdHJ1Y3QgZGxtX3Jjb20JCSpsc19yZWNvdmVyX2J1ZjsKIAlpbnQJCQlsc19yZWNvdmVyX25vZGVpZDsgLyogZm9yIGRlYnVnZ2luZyAqLwogCXVpbnQ2NF90CQlsc19yY29tX3NlcTsKIAlzcGlubG9ja190CQlsc19yY29tX3NwaW47CmRpZmYgLS1naXQgYS9mcy9kbG0vbG9jay5jIGIvZnMvZGxtL2xvY2suYwppbmRleCBmZjRhMTk4Li44ZjI1MGFjIDEwMDY0NAotLS0gYS9mcy9kbG0vbG9jay5jCisrKyBiL2ZzL2RsbS9sb2NrLmMKQEAgLTQzNiwxMSArNDM2LDE1IEBACiB7CiAJc3RydWN0IGRsbV9yc2IgKnIsICp0bXA7CiAJdWludDMyX3QgaGFzaCwgYnVja2V0OwotCWludCBlcnJvciA9IDA7CisJaW50IGVycm9yID0gLUVJTlZBTDsKKworCWlmIChuYW1lbGVuID4gRExNX1JFU05BTUVfTUFYTEVOKQorCQlnb3RvIG91dDsKIAogCWlmIChkbG1fbm9fZGlyZWN0b3J5KGxzKSkKIAkJZmxhZ3MgfD0gUl9DUkVBVEU7CiAKKwllcnJvciA9IDA7CiAJaGFzaCA9IGpoYXNoKG5hbWUsIG5hbWVsZW4sIDApOwogCWJ1Y2tldCA9IGhhc2ggJiAobHMtPmxzX3JzYnRibF9zaXplIC0gMSk7CiAKQEAgLTEyMjIsNiArMTIyNiw4IEBACiAJYiA9IGRsbV9sdmJfb3BlcmF0aW9uc1tsa2ItPmxrYl9ncm1vZGUgKyAxXVtsa2ItPmxrYl9ycW1vZGUgKyAxXTsKIAlpZiAoYiA9PSAxKSB7CiAJCWludCBsZW4gPSByZWNlaXZlX2V4dHJhbGVuKG1zKTsKKwkJaWYgKGxlbiA+IERMTV9SRVNOQU1FX01BWExFTikKKwkJCWxlbiA9IERMTV9SRVNOQU1FX01BWExFTjsKIAkJbWVtY3B5KGxrYi0+bGtiX2x2YnB0ciwgbXMtPm1fZXh0cmEsIGxlbik7CiAJCWxrYi0+bGtiX2x2YnNlcSA9IG1zLT5tX2x2YnNlcTsKIAl9CkBAIC0xNzc1LDcgKzE3ODEsNyBAQAogCSAqLwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxrYiwgcywgJnItPnJlc19ncmFudHF1ZXVlLCBsa2Jfc3RhdGVxdWV1ZSkgewotCQlpZiAobGtiLT5sa2JfYmFzdGFkZHIgJiYgbG9ja19yZXF1aXJlc19iYXN0KGxrYiwgaGlnaCwgY3cpKSB7CisJCWlmIChsa2ItPmxrYl9iYXN0Zm4gJiYgbG9ja19yZXF1aXJlc19iYXN0KGxrYiwgaGlnaCwgY3cpKSB7CiAJCQlpZiAoY3cgJiYgaGlnaCA9PSBETE1fTE9DS19QUikKIAkJCQlxdWV1ZV9iYXN0KHIsIGxrYiwgRExNX0xPQ0tfQ1cpOwogCQkJZWxzZQpAQCAtMTgwNSw3ICsxODExLDcgQEAKIAlzdHJ1Y3QgZGxtX2xrYiAqZ3I7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGdyLCBoZWFkLCBsa2Jfc3RhdGVxdWV1ZSkgewotCQlpZiAoZ3ItPmxrYl9iYXN0YWRkciAmJiBtb2Rlc19yZXF1aXJlX2Jhc3QoZ3IsIGxrYikpIHsKKwkJaWYgKGdyLT5sa2JfYmFzdGZuICYmIG1vZGVzX3JlcXVpcmVfYmFzdChnciwgbGtiKSkgewogCQkJcXVldWVfYmFzdChyLCBnciwgbGtiLT5sa2JfcnFtb2RlKTsKIAkJCWdyLT5sa2JfaGlnaGJhc3QgPSBsa2ItPmxrYl9ycW1vZGU7CiAJCX0KQEAgLTE5NjAsOCArMTk2NiwxMSBAQAogfQogCiBzdGF0aWMgaW50IHNldF9sb2NrX2FyZ3MoaW50IG1vZGUsIHN0cnVjdCBkbG1fbGtzYiAqbGtzYiwgdWludDMyX3QgZmxhZ3MsCi0JCQkgaW50IG5hbWVsZW4sIHVuc2lnbmVkIGxvbmcgdGltZW91dF9jcywgdm9pZCAqYXN0LAotCQkJIHZvaWQgKmFzdGFyZywgdm9pZCAqYmFzdCwgc3RydWN0IGRsbV9hcmdzICphcmdzKQorCQkJIGludCBuYW1lbGVuLCB1bnNpZ25lZCBsb25nIHRpbWVvdXRfY3MsCisJCQkgdm9pZCAoKmFzdCkgKHZvaWQgKmFzdHBhcmFtKSwKKwkJCSB2b2lkICphc3RwYXJhbSwKKwkJCSB2b2lkICgqYmFzdCkgKHZvaWQgKmFzdHBhcmFtLCBpbnQgbW9kZSksCisJCQkgc3RydWN0IGRsbV9hcmdzICphcmdzKQogewogCWludCBydiA9IC1FSU5WQUw7CiAKQEAgLTIwMTEsOSArMjAyMCw5IEBACiAJICAgYW4gYWN0aXZlIGxrYiBjYW5ub3QgYmUgbW9kaWZpZWQgYmVmb3JlIGxvY2tpbmcgdGhlIHJzYiAqLwogCiAJYXJncy0+ZmxhZ3MgPSBmbGFnczsKLQlhcmdzLT5hc3RhZGRyID0gYXN0OwotCWFyZ3MtPmFzdHBhcmFtID0gKGxvbmcpIGFzdGFyZzsKLQlhcmdzLT5iYXN0YWRkciA9IGJhc3Q7CisJYXJncy0+YXN0Zm4gPSBhc3Q7CisJYXJncy0+YXN0cGFyYW0gPSBhc3RwYXJhbTsKKwlhcmdzLT5iYXN0Zm4gPSBiYXN0OwogCWFyZ3MtPnRpbWVvdXQgPSB0aW1lb3V0X2NzOwogCWFyZ3MtPm1vZGUgPSBtb2RlOwogCWFyZ3MtPmxrc2IgPSBsa3NiOwpAQCAtMjAzMiw3ICsyMDQxLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlhcmdzLT5mbGFncyA9IGZsYWdzOwotCWFyZ3MtPmFzdHBhcmFtID0gKGxvbmcpIGFzdGFyZzsKKwlhcmdzLT5hc3RwYXJhbSA9IGFzdGFyZzsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjA2Miw5ICsyMDcxLDkgQEAKIAogCWxrYi0+bGtiX2V4ZmxhZ3MgPSBhcmdzLT5mbGFnczsKIAlsa2ItPmxrYl9zYmZsYWdzID0gMDsKLQlsa2ItPmxrYl9hc3RhZGRyID0gYXJncy0+YXN0YWRkcjsKKwlsa2ItPmxrYl9hc3RmbiA9IGFyZ3MtPmFzdGZuOwogCWxrYi0+bGtiX2FzdHBhcmFtID0gYXJncy0+YXN0cGFyYW07Ci0JbGtiLT5sa2JfYmFzdGFkZHIgPSBhcmdzLT5iYXN0YWRkcjsKKwlsa2ItPmxrYl9iYXN0Zm4gPSBhcmdzLT5iYXN0Zm47CiAJbGtiLT5sa2JfcnFtb2RlID0gYXJncy0+bW9kZTsKIAlsa2ItPmxrYl9sa3NiID0gYXJncy0+bGtzYjsKIAlsa2ItPmxrYl9sdmJwdHIgPSBhcmdzLT5sa3NiLT5zYl9sdmJwdHI7CkBAIC0yNzExLDkgKzI3MjAsOSBAQAogCS8qIG1fcmVzdWx0IGFuZCBtX2Jhc3Rtb2RlIGFyZSBzZXQgZnJvbSBmdW5jdGlvbiBhcmdzLAogCSAgIG5vdCBmcm9tIGxrYiBmaWVsZHMgKi8KIAotCWlmIChsa2ItPmxrYl9iYXN0YWRkcikKKwlpZiAobGtiLT5sa2JfYmFzdGZuKQogCQltcy0+bV9hc3RzIHw9IEFTVF9CQVNUOwotCWlmIChsa2ItPmxrYl9hc3RhZGRyKQorCWlmIChsa2ItPmxrYl9hc3RmbikKIAkJbXMtPm1fYXN0cyB8PSBBU1RfQ09NUDsKIAogCS8qIGNvbXBhcmUgd2l0aCBzd2l0Y2ggaW4gY3JlYXRlX21lc3NhZ2U7IHNlbmRfcmVtb3ZlKCkgZG9lc24ndApAQCAtMjk4OSwxMSArMjk5OCwyMyBAQAogCQlpZiAoIWxrYi0+bGtiX2x2YnB0cikKIAkJCXJldHVybiAtRU5PTUVNOwogCQlsZW4gPSByZWNlaXZlX2V4dHJhbGVuKG1zKTsKKwkJaWYgKGxlbiA+IERMTV9SRVNOQU1FX01BWExFTikKKwkJCWxlbiA9IERMTV9SRVNOQU1FX01BWExFTjsKIAkJbWVtY3B5KGxrYi0+bGtiX2x2YnB0ciwgbXMtPm1fZXh0cmEsIGxlbik7CiAJfQogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBmYWtlX2Jhc3Rmbih2b2lkICphc3RwYXJhbSwgaW50IG1vZGUpCit7CisJbG9nX3ByaW50KCJmYWtlX2Jhc3RmbiBzaG91bGQgbm90IGJlIGNhbGxlZCIpOworfQorCitzdGF0aWMgdm9pZCBmYWtlX2FzdGZuKHZvaWQgKmFzdHBhcmFtKQoreworCWxvZ19wcmludCgiZmFrZV9hc3RmbiBzaG91bGQgbm90IGJlIGNhbGxlZCIpOworfQorCiBzdGF0aWMgaW50IHJlY2VpdmVfcmVxdWVzdF9hcmdzKHN0cnVjdCBkbG1fbHMgKmxzLCBzdHJ1Y3QgZGxtX2xrYiAqbGtiLAogCQkJCXN0cnVjdCBkbG1fbWVzc2FnZSAqbXMpCiB7CkBAIC0zMDAyLDggKzMwMjMsOSBAQAogCWxrYi0+bGtiX3JlbWlkID0gbXMtPm1fbGtpZDsKIAlsa2ItPmxrYl9ncm1vZGUgPSBETE1fTE9DS19JVjsKIAlsa2ItPmxrYl9ycW1vZGUgPSBtcy0+bV9ycW1vZGU7Ci0JbGtiLT5sa2JfYmFzdGFkZHIgPSAodm9pZCAqKSAobG9uZykgKG1zLT5tX2FzdHMgJiBBU1RfQkFTVCk7Ci0JbGtiLT5sa2JfYXN0YWRkciA9ICh2b2lkICopIChsb25nKSAobXMtPm1fYXN0cyAmIEFTVF9DT01QKTsKKworCWxrYi0+bGtiX2Jhc3RmbiA9IChtcy0+bV9hc3RzICYgQVNUX0JBU1QpID8gJmZha2VfYmFzdGZuIDogTlVMTDsKKwlsa2ItPmxrYl9hc3RmbiA9IChtcy0+bV9hc3RzICYgQVNUX0NPTVApID8gJmZha2VfYXN0Zm4gOiBOVUxMOwogCiAJaWYgKGxrYi0+bGtiX2V4ZmxhZ3MgJiBETE1fTEtGX1ZBTEJMSykgewogCQkvKiBsa2Igd2FzIGp1c3QgY3JlYXRlZCBzbyB0aGVyZSB3b24ndCBiZSBhbiBsdmIgeWV0ICovCkBAIC0zODAyLDcgKzM4MjQsNyBAQAogCQkJCWludCBub2RlaWQpCiB7CiAJaWYgKGRsbV9sb2NraW5nX3N0b3BwZWQobHMpKSB7Ci0JCWRsbV9hZGRfcmVxdWVzdHF1ZXVlKGxzLCBub2RlaWQsIChzdHJ1Y3QgZGxtX2hlYWRlciAqKSBtcyk7CisJCWRsbV9hZGRfcmVxdWVzdHF1ZXVlKGxzLCBub2RlaWQsIG1zKTsKIAl9IGVsc2UgewogCQlkbG1fd2FpdF9yZXF1ZXN0cXVldWUobHMpOwogCQlfcmVjZWl2ZV9tZXNzYWdlKGxzLCBtcyk7CkBAIC0zODIyLDIxICszODQ0LDIwIEBACiAgICBzdGFuZGFyZCBsb2NraW5nIGFjdGl2aXR5KSBvciBhbiBSQ09NIChyZWNvdmVyeSBtZXNzYWdlIHNlbnQgYXMgcGFydCBvZgogICAgbG9ja3NwYWNlIHJlY292ZXJ5KS4gKi8KIAotdm9pZCBkbG1fcmVjZWl2ZV9idWZmZXIoc3RydWN0IGRsbV9oZWFkZXIgKmhkLCBpbnQgbm9kZWlkKQordm9pZCBkbG1fcmVjZWl2ZV9idWZmZXIodW5pb24gZGxtX3BhY2tldCAqcCwgaW50IG5vZGVpZCkKIHsKLQlzdHJ1Y3QgZGxtX21lc3NhZ2UgKm1zID0gKHN0cnVjdCBkbG1fbWVzc2FnZSAqKSBoZDsKLQlzdHJ1Y3QgZGxtX3Jjb20gKnJjID0gKHN0cnVjdCBkbG1fcmNvbSAqKSBoZDsKKwlzdHJ1Y3QgZGxtX2hlYWRlciAqaGQgPSAmcC0+aGVhZGVyOwogCXN0cnVjdCBkbG1fbHMgKmxzOwogCWludCB0eXBlID0gMDsKIAogCXN3aXRjaCAoaGQtPmhfY21kKSB7CiAJY2FzZSBETE1fTVNHOgotCQlkbG1fbWVzc2FnZV9pbihtcyk7Ci0JCXR5cGUgPSBtcy0+bV90eXBlOworCQlkbG1fbWVzc2FnZV9pbigmcC0+bWVzc2FnZSk7CisJCXR5cGUgPSBwLT5tZXNzYWdlLm1fdHlwZTsKIAkJYnJlYWs7CiAJY2FzZSBETE1fUkNPTToKLQkJZGxtX3Jjb21faW4ocmMpOwotCQl0eXBlID0gcmMtPnJjX3R5cGU7CisJCWRsbV9yY29tX2luKCZwLT5yY29tKTsKKwkJdHlwZSA9IHAtPnJjb20ucmNfdHlwZTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJbG9nX3ByaW50KCJpbnZhbGlkIGhfY21kICVkIGZyb20gJXUiLCBoZC0+aF9jbWQsIG5vZGVpZCk7CkBAIC0zODU2LDcgKzM4NzcsNyBAQAogCQkJCSAgaGQtPmhfbG9ja3NwYWNlLCBub2RlaWQsIGhkLT5oX2NtZCwgdHlwZSk7CiAKIAkJaWYgKGhkLT5oX2NtZCA9PSBETE1fUkNPTSAmJiB0eXBlID09IERMTV9SQ09NX1NUQVRVUykKLQkJCWRsbV9zZW5kX2xzX25vdF9yZWFkeShub2RlaWQsIHJjKTsKKwkJCWRsbV9zZW5kX2xzX25vdF9yZWFkeShub2RlaWQsICZwLT5yY29tKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzg2NSw5ICszODg2LDkgQEAKIAogCWRvd25fcmVhZCgmbHMtPmxzX3JlY3ZfYWN0aXZlKTsKIAlpZiAoaGQtPmhfY21kID09IERMTV9NU0cpCi0JCWRsbV9yZWNlaXZlX21lc3NhZ2UobHMsIG1zLCBub2RlaWQpOworCQlkbG1fcmVjZWl2ZV9tZXNzYWdlKGxzLCAmcC0+bWVzc2FnZSwgbm9kZWlkKTsKIAllbHNlCi0JCWRsbV9yZWNlaXZlX3Jjb20obHMsIHJjLCBub2RlaWQpOworCQlkbG1fcmVjZWl2ZV9yY29tKGxzLCAmcC0+cmNvbSwgbm9kZWlkKTsKIAl1cF9yZWFkKCZscy0+bHNfcmVjdl9hY3RpdmUpOwogCiAJZGxtX3B1dF9sb2Nrc3BhY2UobHMpOwpAQCAtNDI2NywzMiArNDI4OCwzNCBAQAogCXJldHVybiBOVUxMOwogfQogCisvKiBuZWVkcyBhdCBsZWFzdCBkbG1fcmNvbSArIHJjb21fbG9jayAqLwogc3RhdGljIGludCByZWNlaXZlX3Jjb21fbG9ja19hcmdzKHN0cnVjdCBkbG1fbHMgKmxzLCBzdHJ1Y3QgZGxtX2xrYiAqbGtiLAogCQkJCSAgc3RydWN0IGRsbV9yc2IgKnIsIHN0cnVjdCBkbG1fcmNvbSAqcmMpCiB7CiAJc3RydWN0IHJjb21fbG9jayAqcmwgPSAoc3RydWN0IHJjb21fbG9jayAqKSByYy0+cmNfYnVmOwotCWludCBsdmJsZW47CiAKIAlsa2ItPmxrYl9ub2RlaWQgPSByYy0+cmNfaGVhZGVyLmhfbm9kZWlkOwotCWxrYi0+bGtiX293bnBpZCA9IHJsLT5ybF9vd25waWQ7Ci0JbGtiLT5sa2JfcmVtaWQgPSBybC0+cmxfbGtpZDsKLQlsa2ItPmxrYl9leGZsYWdzID0gcmwtPnJsX2V4ZmxhZ3M7Ci0JbGtiLT5sa2JfZmxhZ3MgPSBybC0+cmxfZmxhZ3MgJiAweDAwMDBGRkZGOworCWxrYi0+bGtiX293bnBpZCA9IGxlMzJfdG9fY3B1KHJsLT5ybF9vd25waWQpOworCWxrYi0+bGtiX3JlbWlkID0gbGUzMl90b19jcHUocmwtPnJsX2xraWQpOworCWxrYi0+bGtiX2V4ZmxhZ3MgPSBsZTMyX3RvX2NwdShybC0+cmxfZXhmbGFncyk7CisJbGtiLT5sa2JfZmxhZ3MgPSBsZTMyX3RvX2NwdShybC0+cmxfZmxhZ3MpICYgMHgwMDAwRkZGRjsKIAlsa2ItPmxrYl9mbGFncyB8PSBETE1fSUZMX01TVENQWTsKLQlsa2ItPmxrYl9sdmJzZXEgPSBybC0+cmxfbHZic2VxOworCWxrYi0+bGtiX2x2YnNlcSA9IGxlMzJfdG9fY3B1KHJsLT5ybF9sdmJzZXEpOwogCWxrYi0+bGtiX3JxbW9kZSA9IHJsLT5ybF9ycW1vZGU7CiAJbGtiLT5sa2JfZ3Jtb2RlID0gcmwtPnJsX2dybW9kZTsKIAkvKiBkb24ndCBzZXQgbGtiX3N0YXR1cyBiZWNhdXNlIGFkZF9sa2Igd2FudHMgdG8gaXRzZWxmICovCiAKLQlsa2ItPmxrYl9iYXN0YWRkciA9ICh2b2lkICopIChsb25nKSAocmwtPnJsX2FzdHMgJiBBU1RfQkFTVCk7Ci0JbGtiLT5sa2JfYXN0YWRkciA9ICh2b2lkICopIChsb25nKSAocmwtPnJsX2FzdHMgJiBBU1RfQ09NUCk7CisJbGtiLT5sa2JfYmFzdGZuID0gKHJsLT5ybF9hc3RzICYgQVNUX0JBU1QpID8gJmZha2VfYmFzdGZuIDogTlVMTDsKKwlsa2ItPmxrYl9hc3RmbiA9IChybC0+cmxfYXN0cyAmIEFTVF9DT01QKSA/ICZmYWtlX2FzdGZuIDogTlVMTDsKIAogCWlmIChsa2ItPmxrYl9leGZsYWdzICYgRExNX0xLRl9WQUxCTEspIHsKKwkJaW50IGx2YmxlbiA9IHJjLT5yY19oZWFkZXIuaF9sZW5ndGggLSBzaXplb2Yoc3RydWN0IGRsbV9yY29tKSAtCisJCQkgc2l6ZW9mKHN0cnVjdCByY29tX2xvY2spOworCQlpZiAobHZibGVuID4gbHMtPmxzX2x2YmxlbikKKwkJCXJldHVybiAtRUlOVkFMOwogCQlsa2ItPmxrYl9sdmJwdHIgPSBkbG1fYWxsb2NhdGVfbHZiKGxzKTsKIAkJaWYgKCFsa2ItPmxrYl9sdmJwdHIpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJbHZibGVuID0gcmMtPnJjX2hlYWRlci5oX2xlbmd0aCAtIHNpemVvZihzdHJ1Y3QgZGxtX3Jjb20pIC0KLQkJCSBzaXplb2Yoc3RydWN0IHJjb21fbG9jayk7CiAJCW1lbWNweShsa2ItPmxrYl9sdmJwdHIsIHJsLT5ybF9sdmIsIGx2Ymxlbik7CiAJfQogCkBAIC00MzAwLDcgKzQzMjMsOCBAQAogCSAgIFRoZSByZWFsIGdyYW50ZWQgbW9kZSBvZiB0aGVzZSBjb252ZXJ0aW5nIGxvY2tzIGNhbm5vdCBiZSBkZXRlcm1pbmVkCiAJICAgdW50aWwgYWxsIGxvY2tzIGhhdmUgYmVlbiByZWJ1aWx0IG9uIHRoZSByc2IgKHJlY292ZXJfY29udmVyc2lvbikgKi8KIAotCWlmIChybC0+cmxfd2FpdF90eXBlID09IERMTV9NU0dfQ09OVkVSVCAmJiBtaWRkbGVfY29udmVyc2lvbihsa2IpKSB7CisJaWYgKHJsLT5ybF93YWl0X3R5cGUgPT0gY3B1X3RvX2xlMTYoRExNX01TR19DT05WRVJUKSAmJgorCSAgICBtaWRkbGVfY29udmVyc2lvbihsa2IpKSB7CiAJCXJsLT5ybF9zdGF0dXMgPSBETE1fTEtTVFNfQ09OVkVSVDsKIAkJbGtiLT5sa2JfZ3Jtb2RlID0gRExNX0xPQ0tfSVY7CiAJCXJzYl9zZXRfZmxhZyhyLCBSU0JfUkVDT1ZFUl9DT05WRVJUKTsKQEAgLTQzMTUsNiArNDMzOSw3IEBACiAgICB0aGUgZ2l2ZW4gdmFsdWVzIGFuZCBzZW5kIGJhY2sgb3VyIGxraWQuICBXZSBzZW5kIGJhY2sgb3VyIGxraWQgYnkgc2VuZGluZwogICAgYmFjayB0aGUgcmNvbV9sb2NrIHN0cnVjdCB3ZSBnb3QgYnV0IHdpdGggdGhlIHJlbWlkIGZpZWxkIGZpbGxlZCBpbi4gKi8KIAorLyogbmVlZHMgYXQgbGVhc3QgZGxtX3Jjb20gKyByY29tX2xvY2sgKi8KIGludCBkbG1fcmVjb3Zlcl9tYXN0ZXJfY29weShzdHJ1Y3QgZGxtX2xzICpscywgc3RydWN0IGRsbV9yY29tICpyYykKIHsKIAlzdHJ1Y3QgcmNvbV9sb2NrICpybCA9IChzdHJ1Y3QgcmNvbV9sb2NrICopIHJjLT5yY19idWY7CkBAIC00MzI3LDEzICs0MzUyLDE0IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWVycm9yID0gZmluZF9yc2IobHMsIHJsLT5ybF9uYW1lLCBybC0+cmxfbmFtZWxlbiwgUl9NQVNURVIsICZyKTsKKwllcnJvciA9IGZpbmRfcnNiKGxzLCBybC0+cmxfbmFtZSwgbGUxNl90b19jcHUocmwtPnJsX25hbWVsZW4pLAorCQkJIFJfTUFTVEVSLCAmcik7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKIAogCWxvY2tfcnNiKHIpOwogCi0JbGtiID0gc2VhcmNoX3JlbWlkKHIsIHJjLT5yY19oZWFkZXIuaF9ub2RlaWQsIHJsLT5ybF9sa2lkKTsKKwlsa2IgPSBzZWFyY2hfcmVtaWQociwgcmMtPnJjX2hlYWRlci5oX25vZGVpZCwgbGUzMl90b19jcHUocmwtPnJsX2xraWQpKTsKIAlpZiAobGtiKSB7CiAJCWVycm9yID0gLUVFWElTVDsKIAkJZ290byBvdXRfcmVtaWQ7CkBAIC00MzU2LDE4ICs0MzgyLDIwIEBACiAgb3V0X3JlbWlkOgogCS8qIHRoaXMgaXMgdGhlIG5ldyB2YWx1ZSByZXR1cm5lZCB0byB0aGUgbG9jayBob2xkZXIgZm9yCiAJICAgc2F2aW5nIGluIGl0cyBwcm9jZXNzLWNvcHkgbGtiICovCi0JcmwtPnJsX3JlbWlkID0gbGtiLT5sa2JfaWQ7CisJcmwtPnJsX3JlbWlkID0gY3B1X3RvX2xlMzIobGtiLT5sa2JfaWQpOwogCiAgb3V0X3VubG9jazoKIAl1bmxvY2tfcnNiKHIpOwogCXB1dF9yc2Iocik7CiAgb3V0OgogCWlmIChlcnJvcikKLQkJbG9nX2RlYnVnKGxzLCAicmVjb3Zlcl9tYXN0ZXJfY29weSAlZCAleCIsIGVycm9yLCBybC0+cmxfbGtpZCk7Ci0JcmwtPnJsX3Jlc3VsdCA9IGVycm9yOworCQlsb2dfZGVidWcobHMsICJyZWNvdmVyX21hc3Rlcl9jb3B5ICVkICV4IiwgZXJyb3IsCisJCQkgIGxlMzJfdG9fY3B1KHJsLT5ybF9sa2lkKSk7CisJcmwtPnJsX3Jlc3VsdCA9IGNwdV90b19sZTMyKGVycm9yKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKKy8qIG5lZWRzIGF0IGxlYXN0IGRsbV9yY29tICsgcmNvbV9sb2NrICovCiBpbnQgZGxtX3JlY292ZXJfcHJvY2Vzc19jb3B5KHN0cnVjdCBkbG1fbHMgKmxzLCBzdHJ1Y3QgZGxtX3Jjb20gKnJjKQogewogCXN0cnVjdCByY29tX2xvY2sgKnJsID0gKHN0cnVjdCByY29tX2xvY2sgKikgcmMtPnJjX2J1ZjsKQEAgLTQzNzUsMTUgKzQ0MDMsMTYgQEAKIAlzdHJ1Y3QgZGxtX2xrYiAqbGtiOwogCWludCBlcnJvcjsKIAotCWVycm9yID0gZmluZF9sa2IobHMsIHJsLT5ybF9sa2lkLCAmbGtiKTsKKwllcnJvciA9IGZpbmRfbGtiKGxzLCBsZTMyX3RvX2NwdShybC0+cmxfbGtpZCksICZsa2IpOwogCWlmIChlcnJvcikgewotCQlsb2dfZXJyb3IobHMsICJyZWNvdmVyX3Byb2Nlc3NfY29weSBubyBsa2lkICV4IiwgcmwtPnJsX2xraWQpOworCQlsb2dfZXJyb3IobHMsICJyZWNvdmVyX3Byb2Nlc3NfY29weSBubyBsa2lkICV4IiwKKwkJCQlsZTMyX3RvX2NwdShybC0+cmxfbGtpZCkpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQogCiAJRExNX0FTU0VSVChpc19wcm9jZXNzX2NvcHkobGtiKSwgZGxtX3ByaW50X2xrYihsa2IpOyk7CiAKLQllcnJvciA9IHJsLT5ybF9yZXN1bHQ7CisJZXJyb3IgPSBsZTMyX3RvX2NwdShybC0+cmxfcmVzdWx0KTsKIAogCXIgPSBsa2ItPmxrYl9yZXNvdXJjZTsKIAlob2xkX3JzYihyKTsKQEAgLTQ0MDIsNyArNDQzMSw3IEBACiAJCWxvZ19kZWJ1ZyhscywgIm1hc3RlciBjb3B5IGV4aXN0cyAleCIsIGxrYi0+bGtiX2lkKTsKIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSAwOgotCQlsa2ItPmxrYl9yZW1pZCA9IHJsLT5ybF9yZW1pZDsKKwkJbGtiLT5sa2JfcmVtaWQgPSBsZTMyX3RvX2NwdShybC0+cmxfcmVtaWQpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlsb2dfZXJyb3IobHMsICJkbG1fcmVjb3Zlcl9wcm9jZXNzX2NvcHkgdW5rbm93biBlcnJvciAlZCAleCIsCkBAIC00NDUxLDcgKzQ0ODAsNyBAQAogCSAgIGxvY2sgYW5kIHRoYXQgbGtiX2FzdHBhcmFtIGlzIHRoZSBkbG1fdXNlcl9hcmdzIHN0cnVjdHVyZS4gKi8KIAogCWVycm9yID0gc2V0X2xvY2tfYXJncyhtb2RlLCAmdWEtPmxrc2IsIGZsYWdzLCBuYW1lbGVuLCB0aW1lb3V0X2NzLAotCQkJICAgICAgRExNX0ZBS0VfVVNFUl9BU1QsIHVhLCBETE1fRkFLRV9VU0VSX0FTVCwgJmFyZ3MpOworCQkJICAgICAgZmFrZV9hc3RmbiwgdWEsIGZha2VfYmFzdGZuLCAmYXJncyk7CiAJbGtiLT5sa2JfZmxhZ3MgfD0gRExNX0lGTF9VU0VSOwogCXVhLT5vbGRfbW9kZSA9IERMTV9MT0NLX0lWOwogCkBAIC00NTA0LDcgKzQ1MzMsNyBAQAogCS8qIHVzZXIgY2FuIGNoYW5nZSB0aGUgcGFyYW1zIG9uIGl0cyBsb2NrIHdoZW4gaXQgY29udmVydHMgaXQsIG9yCiAJICAgYWRkIGFuIGx2YiB0aGF0IGRpZG4ndCBleGlzdCBiZWZvcmUgKi8KIAotCXVhID0gKHN0cnVjdCBkbG1fdXNlcl9hcmdzICopbGtiLT5sa2JfYXN0cGFyYW07CisJdWEgPSBsa2ItPmxrYl91YTsKIAogCWlmIChmbGFncyAmIERMTV9MS0ZfVkFMQkxLICYmICF1YS0+bGtzYi5zYl9sdmJwdHIpIHsKIAkJdWEtPmxrc2Iuc2JfbHZicHRyID0ga3phbGxvYyhETE1fVVNFUl9MVkJfTEVOLCBHRlBfS0VSTkVMKTsKQEAgLTQ1MjUsNyArNDU1NCw3IEBACiAJdWEtPm9sZF9tb2RlID0gbGtiLT5sa2JfZ3Jtb2RlOwogCiAJZXJyb3IgPSBzZXRfbG9ja19hcmdzKG1vZGUsICZ1YS0+bGtzYiwgZmxhZ3MsIDAsIHRpbWVvdXRfY3MsCi0JCQkgICAgICBETE1fRkFLRV9VU0VSX0FTVCwgdWEsIERMTV9GQUtFX1VTRVJfQVNULCAmYXJncyk7CisJCQkgICAgICBmYWtlX2FzdGZuLCB1YSwgZmFrZV9iYXN0Zm4sICZhcmdzKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0X3B1dDsKIApAQCAtNDU1NSw3ICs0NTg0LDcgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwogCi0JdWEgPSAoc3RydWN0IGRsbV91c2VyX2FyZ3MgKilsa2ItPmxrYl9hc3RwYXJhbTsKKwl1YSA9IGxrYi0+bGtiX3VhOwogCiAJaWYgKGx2Yl9pbiAmJiB1YS0+bGtzYi5zYl9sdmJwdHIpCiAJCW1lbWNweSh1YS0+bGtzYi5zYl9sdmJwdHIsIGx2Yl9pbiwgRExNX1VTRVJfTFZCX0xFTik7CkBAIC00NjA0LDcgKzQ2MzMsNyBAQAogCWlmIChlcnJvcikKIAkJZ290byBvdXQ7CiAKLQl1YSA9IChzdHJ1Y3QgZGxtX3VzZXJfYXJncyAqKWxrYi0+bGtiX2FzdHBhcmFtOworCXVhID0gbGtiLT5sa2JfdWE7CiAJaWYgKHVhX3RtcC0+Y2FzdHBhcmFtKQogCQl1YS0+Y2FzdHBhcmFtID0gdWFfdG1wLT5jYXN0cGFyYW07CiAJdWEtPnVzZXJfbGtzYiA9IHVhX3RtcC0+dXNlcl9sa3NiOwpAQCAtNDY0Miw3ICs0NjcxLDcgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwogCi0JdWEgPSAoc3RydWN0IGRsbV91c2VyX2FyZ3MgKilsa2ItPmxrYl9hc3RwYXJhbTsKKwl1YSA9IGxrYi0+bGtiX3VhOwogCiAJZXJyb3IgPSBzZXRfdW5sb2NrX2FyZ3MoZmxhZ3MsIHVhLCAmYXJncyk7CiAJaWYgKGVycm9yKQpAQCAtNDY4MSw3ICs0NzEwLDYgQEAKIAogc3RhdGljIGludCBvcnBoYW5fcHJvY19sb2NrKHN0cnVjdCBkbG1fbHMgKmxzLCBzdHJ1Y3QgZGxtX2xrYiAqbGtiKQogewotCXN0cnVjdCBkbG1fdXNlcl9hcmdzICp1YSA9IChzdHJ1Y3QgZGxtX3VzZXJfYXJncyAqKWxrYi0+bGtiX2FzdHBhcmFtOwogCXN0cnVjdCBkbG1fYXJncyBhcmdzOwogCWludCBlcnJvcjsKIApAQCAtNDY5MCw3ICs0NzE4LDcgQEAKIAlsaXN0X2FkZF90YWlsKCZsa2ItPmxrYl9vd25xdWV1ZSwgJmxzLT5sc19vcnBoYW5zKTsKIAltdXRleF91bmxvY2soJmxzLT5sc19vcnBoYW5zX211dGV4KTsKIAotCXNldF91bmxvY2tfYXJncygwLCB1YSwgJmFyZ3MpOworCXNldF91bmxvY2tfYXJncygwLCBsa2ItPmxrYl91YSwgJmFyZ3MpOwogCiAJZXJyb3IgPSBjYW5jZWxfbG9jayhscywgbGtiLCAmYXJncyk7CiAJaWYgKGVycm9yID09IC1ETE1fRUNBTkNFTCkKQEAgLTQ3MDMsMTEgKzQ3MzEsMTAgQEAKIAogc3RhdGljIGludCB1bmxvY2tfcHJvY19sb2NrKHN0cnVjdCBkbG1fbHMgKmxzLCBzdHJ1Y3QgZGxtX2xrYiAqbGtiKQogewotCXN0cnVjdCBkbG1fdXNlcl9hcmdzICp1YSA9IChzdHJ1Y3QgZGxtX3VzZXJfYXJncyAqKWxrYi0+bGtiX2FzdHBhcmFtOwogCXN0cnVjdCBkbG1fYXJncyBhcmdzOwogCWludCBlcnJvcjsKIAotCXNldF91bmxvY2tfYXJncyhETE1fTEtGX0ZPUkNFVU5MT0NLLCB1YSwgJmFyZ3MpOworCXNldF91bmxvY2tfYXJncyhETE1fTEtGX0ZPUkNFVU5MT0NLLCBsa2ItPmxrYl91YSwgJmFyZ3MpOwogCiAJZXJyb3IgPSB1bmxvY2tfbG9jayhscywgbGtiLCAmYXJncyk7CiAJaWYgKGVycm9yID09IC1ETE1fRVVOTE9DSykKZGlmZiAtLWdpdCBhL2ZzL2RsbS9sb2NrLmggYi9mcy9kbG0vbG9jay5oCmluZGV4IDI3YjZlZDMuLjA1ZDljODIgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9sb2NrLmgKKysrIGIvZnMvZGxtL2xvY2suaApAQCAtMTcsNyArMTcsNyBAQAogdm9pZCBkbG1fZHVtcF9yc2Ioc3RydWN0IGRsbV9yc2IgKnIpOwogdm9pZCBkbG1fcHJpbnRfbGtiKHN0cnVjdCBkbG1fbGtiICpsa2IpOwogdm9pZCBkbG1fcmVjZWl2ZV9tZXNzYWdlX3NhdmVkKHN0cnVjdCBkbG1fbHMgKmxzLCBzdHJ1Y3QgZGxtX21lc3NhZ2UgKm1zKTsKLXZvaWQgZGxtX3JlY2VpdmVfYnVmZmVyKHN0cnVjdCBkbG1faGVhZGVyICpoZCwgaW50IG5vZGVpZCk7Cit2b2lkIGRsbV9yZWNlaXZlX2J1ZmZlcih1bmlvbiBkbG1fcGFja2V0ICpwLCBpbnQgbm9kZWlkKTsKIGludCBkbG1fbW9kZXNfY29tcGF0KGludCBtb2RlMSwgaW50IG1vZGUyKTsKIHZvaWQgZGxtX3B1dF9yc2Ioc3RydWN0IGRsbV9yc2IgKnIpOwogdm9pZCBkbG1faG9sZF9yc2Ioc3RydWN0IGRsbV9yc2IgKnIpOwpkaWZmIC0tZ2l0IGEvZnMvZGxtL2xvY2tzcGFjZS5jIGIvZnMvZGxtL2xvY2tzcGFjZS5jCmluZGV4IGIxODBmZGMuLmI2NGU1NWUgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9sb2Nrc3BhY2UuYworKysgYi9mcy9kbG0vbG9ja3NwYWNlLmMKQEAgLTE5MSw3ICsxOTEsNyBAQAogfQogCiAKLWludCBkbG1fbG9ja3NwYWNlX2luaXQodm9pZCkKK2ludCBfX2luaXQgZGxtX2xvY2tzcGFjZV9pbml0KHZvaWQpCiB7CiAJbHNfY291bnQgPSAwOwogCW11dGV4X2luaXQoJmxzX2xvY2spOwpkaWZmIC0tZ2l0IGEvZnMvZGxtL21lbW9yeS5jIGIvZnMvZGxtL21lbW9yeS5jCmluZGV4IGY3NzgzODYuLjU0YzE0YzYgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS9tZW1vcnkuYworKysgYi9mcy9kbG0vbWVtb3J5LmMKQEAgLTE4LDcgKzE4LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqbGtiX2NhY2hlOwogCiAKLWludCBkbG1fbWVtb3J5X2luaXQodm9pZCkKK2ludCBfX2luaXQgZGxtX21lbW9yeV9pbml0KHZvaWQpCiB7CiAJaW50IHJldCA9IDA7CiAKQEAgLTgwLDcgKzgwLDcgQEAKIHsKIAlpZiAobGtiLT5sa2JfZmxhZ3MgJiBETE1fSUZMX1VTRVIpIHsKIAkJc3RydWN0IGRsbV91c2VyX2FyZ3MgKnVhOwotCQl1YSA9IChzdHJ1Y3QgZGxtX3VzZXJfYXJncyAqKWxrYi0+bGtiX2FzdHBhcmFtOworCQl1YSA9IGxrYi0+bGtiX3VhOwogCQlpZiAodWEpIHsKIAkJCWlmICh1YS0+bGtzYi5zYl9sdmJwdHIpCiAJCQkJa2ZyZWUodWEtPmxrc2Iuc2JfbHZicHRyKTsKZGlmZiAtLWdpdCBhL2ZzL2RsbS9taWRjb21tcy5jIGIvZnMvZGxtL21pZGNvbW1zLmMKaW5kZXggZTY5OTI2ZS4uMDdhYzcwOSAxMDA2NDQKLS0tIGEvZnMvZGxtL21pZGNvbW1zLmMKKysrIGIvZnMvZGxtL21pZGNvbW1zLmMKQEAgLTYxLDkgKzYxLDkgQEAKIAl1bmlvbiB7CiAJCXVuc2lnbmVkIGNoYXIgX19idWZbRExNX0lOQlVGX0xFTl07CiAJCS8qIHRoaXMgaXMgdG8gZm9yY2UgcHJvcGVyIGFsaWdubWVudCBvbiBzb21lIGFyY2hlcyAqLwotCQlzdHJ1Y3QgZGxtX2hlYWRlciBkbG07CisJCXVuaW9uIGRsbV9wYWNrZXQgcDsKIAl9IF9fdG1wOwotCXN0cnVjdCBkbG1faGVhZGVyICptc2cgPSAmX190bXAuZGxtOworCXVuaW9uIGRsbV9wYWNrZXQgKnAgPSAmX190bXAucDsKIAlpbnQgcmV0ID0gMDsKIAlpbnQgZXJyID0gMDsKIAl1aW50MTZfdCBtc2dsZW47CkBAIC03NSwxNSArNzUsMjIgQEAKIAkJICAgbWVzc2FnZSBtYXkgd3JhcCBhcm91bmQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGJhY2sgdG8gdGhlCiAJCSAgIHN0YXJ0LCBzbyB3ZSBuZWVkIHRvIHVzZSBhIHRlbXAgYnVmZmVyIGFuZCBjb3B5X2Zyb21fY2IuICovCiAKLQkJY29weV9mcm9tX2NiKG1zZywgYmFzZSwgb2Zmc2V0LCBzaXplb2Yoc3RydWN0IGRsbV9oZWFkZXIpLAorCQljb3B5X2Zyb21fY2IocCwgYmFzZSwgb2Zmc2V0LCBzaXplb2Yoc3RydWN0IGRsbV9oZWFkZXIpLAogCQkJICAgICBsaW1pdCk7CiAKLQkJbXNnbGVuID0gbGUxNl90b19jcHUobXNnLT5oX2xlbmd0aCk7Ci0JCWxvY2tzcGFjZSA9IG1zZy0+aF9sb2Nrc3BhY2U7CisJCW1zZ2xlbiA9IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5oX2xlbmd0aCk7CisJCWxvY2tzcGFjZSA9IHAtPmhlYWRlci5oX2xvY2tzcGFjZTsKIAogCQllcnIgPSAtRUlOVkFMOwogCQlpZiAobXNnbGVuIDwgc2l6ZW9mKHN0cnVjdCBkbG1faGVhZGVyKSkKIAkJCWJyZWFrOworCQlpZiAocC0+aGVhZGVyLmhfY21kID09IERMTV9NU0cpIHsKKwkJCWlmIChtc2dsZW4gPCBzaXplb2Yoc3RydWN0IGRsbV9tZXNzYWdlKSkKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWlmIChtc2dsZW4gPCBzaXplb2Yoc3RydWN0IGRsbV9yY29tKSkKKwkJCQlicmVhazsKKwkJfQogCQllcnIgPSAtRTJCSUc7CiAJCWlmIChtc2dsZW4gPiBkbG1fY29uZmlnLmNpX2J1ZmZlcl9zaXplKSB7CiAJCQlsb2dfcHJpbnQoIm1lc3NhZ2Ugc2l6ZSAlZCBmcm9tICVkIHRvbyBiaWcsIGJ1ZiBsZW4gJWQiLApAQCAtMTA0LDI2ICsxMTEsMjYgQEAKIAkJICAgaW4gdGhlIGJ1ZmZlciBvbiB0aGUgc3RhY2sgKHdoaWNoIHNob3VsZCB3b3JrIGZvciBtb3N0CiAJCSAgIG9yZGluYXJ5IG1lc3NhZ2VzKS4gKi8KIAotCQlpZiAobXNnbGVuID4gRExNX0lOQlVGX0xFTiAmJiBtc2cgPT0gJl9fdG1wLmRsbSkgewotCQkJbXNnID0ga21hbGxvYyhkbG1fY29uZmlnLmNpX2J1ZmZlcl9zaXplLCBHRlBfS0VSTkVMKTsKLQkJCWlmIChtc2cgPT0gTlVMTCkKKwkJaWYgKG1zZ2xlbiA+IHNpemVvZihfX3RtcCkgJiYgcCA9PSAmX190bXAucCkgeworCQkJcCA9IGttYWxsb2MoZGxtX2NvbmZpZy5jaV9idWZmZXJfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAocCA9PSBOVUxMKQogCQkJCXJldHVybiByZXQ7CiAJCX0KIAotCQljb3B5X2Zyb21fY2IobXNnLCBiYXNlLCBvZmZzZXQsIG1zZ2xlbiwgbGltaXQpOworCQljb3B5X2Zyb21fY2IocCwgYmFzZSwgb2Zmc2V0LCBtc2dsZW4sIGxpbWl0KTsKIAotCQlCVUdfT04obG9ja3NwYWNlICE9IG1zZy0+aF9sb2Nrc3BhY2UpOworCQlCVUdfT04obG9ja3NwYWNlICE9IHAtPmhlYWRlci5oX2xvY2tzcGFjZSk7CiAKIAkJcmV0ICs9IG1zZ2xlbjsKIAkJb2Zmc2V0ICs9IG1zZ2xlbjsKIAkJb2Zmc2V0ICY9IChsaW1pdCAtIDEpOwogCQlsZW4gLT0gbXNnbGVuOwogCi0JCWRsbV9yZWNlaXZlX2J1ZmZlcihtc2csIG5vZGVpZCk7CisJCWRsbV9yZWNlaXZlX2J1ZmZlcihwLCBub2RlaWQpOwogCX0KIAotCWlmIChtc2cgIT0gJl9fdG1wLmRsbSkKLQkJa2ZyZWUobXNnKTsKKwlpZiAocCAhPSAmX190bXAucCkKKwkJa2ZyZWUocCk7CiAKIAlyZXR1cm4gZXJyID8gZXJyIDogcmV0OwogfQpkaWZmIC0tZ2l0IGEvZnMvZGxtL25ldGxpbmsuYyBiL2ZzL2RsbS9uZXRsaW5rLmMKaW5kZXggODYzYjg3ZC4uNzE0NTkzNiAxMDA2NDQKLS0tIGEvZnMvZGxtL25ldGxpbmsuYworKysgYi9mcy9kbG0vbmV0bGluay5jCkBAIC03OCw3ICs3OCw3IEBACiAJLmRvaXQJCT0gdXNlcl9jbWQsCiB9OwogCi1pbnQgZGxtX25ldGxpbmtfaW5pdCh2b2lkKQoraW50IF9faW5pdCBkbG1fbmV0bGlua19pbml0KHZvaWQpCiB7CiAJaW50IHJ2OwogCkBAIC05NSw3ICs5NSw3IEBACiAJcmV0dXJuIHJ2OwogfQogCi12b2lkIGRsbV9uZXRsaW5rX2V4aXQodm9pZCkKK3ZvaWQgX19leGl0IGRsbV9uZXRsaW5rX2V4aXQodm9pZCkKIHsKIAlnZW5sX3VucmVnaXN0ZXJfb3BzKCZmYW1pbHksICZkbG1fbmxfb3BzKTsKIAlnZW5sX3VucmVnaXN0ZXJfZmFtaWx5KCZmYW1pbHkpOwpAQCAtMTA0LDcgKzEwNCw2IEBACiBzdGF0aWMgdm9pZCBmaWxsX2RhdGEoc3RydWN0IGRsbV9sb2NrX2RhdGEgKmRhdGEsIHN0cnVjdCBkbG1fbGtiICpsa2IpCiB7CiAJc3RydWN0IGRsbV9yc2IgKnIgPSBsa2ItPmxrYl9yZXNvdXJjZTsKLQlzdHJ1Y3QgZGxtX3VzZXJfYXJncyAqdWEgPSAoc3RydWN0IGRsbV91c2VyX2FyZ3MgKikgbGtiLT5sa2JfYXN0cGFyYW07CiAKIAltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBkbG1fbG9ja19kYXRhKSk7CiAKQEAgLTExNyw4ICsxMTYsOCBAQAogCWRhdGEtPmdybW9kZSA9IGxrYi0+bGtiX2dybW9kZTsKIAlkYXRhLT5ycW1vZGUgPSBsa2ItPmxrYl9ycW1vZGU7CiAJZGF0YS0+dGltZXN0YW1wID0gbGtiLT5sa2JfdGltZXN0YW1wOwotCWlmICh1YSkKLQkJZGF0YS0+eGlkID0gdWEtPnhpZDsKKwlpZiAobGtiLT5sa2JfdWEpCisJCWRhdGEtPnhpZCA9IGxrYi0+bGtiX3VhLT54aWQ7CiAJaWYgKHIpIHsKIAkJZGF0YS0+bG9ja3NwYWNlX2lkID0gci0+cmVzX2xzLT5sc19nbG9iYWxfaWQ7CiAJCWRhdGEtPnJlc291cmNlX25hbWVsZW4gPSByLT5yZXNfbGVuZ3RoOwpkaWZmIC0tZ2l0IGEvZnMvZGxtL3Jjb20uYyBiL2ZzL2RsbS9yY29tLmMKaW5kZXggMDI2ODI0Yy4uMDM1ZTZmOSAxMDA2NDQKLS0tIGEvZnMvZGxtL3Jjb20uYworKysgYi9mcy9kbG0vcmNvbS5jCkBAIC03OCwxMyArNzgsMTQgQEAKIAogc3RhdGljIHZvaWQgbWFrZV9jb25maWcoc3RydWN0IGRsbV9scyAqbHMsIHN0cnVjdCByY29tX2NvbmZpZyAqcmYpCiB7Ci0JcmYtPnJmX2x2YmxlbiA9IGxzLT5sc19sdmJsZW47Ci0JcmYtPnJmX2xzZmxhZ3MgPSBscy0+bHNfZXhmbGFnczsKKwlyZi0+cmZfbHZibGVuID0gY3B1X3RvX2xlMzIobHMtPmxzX2x2Ymxlbik7CisJcmYtPnJmX2xzZmxhZ3MgPSBjcHVfdG9fbGUzMihscy0+bHNfZXhmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQgY2hlY2tfY29uZmlnKHN0cnVjdCBkbG1fbHMgKmxzLCBzdHJ1Y3QgZGxtX3Jjb20gKnJjLCBpbnQgbm9kZWlkKQogewogCXN0cnVjdCByY29tX2NvbmZpZyAqcmYgPSAoc3RydWN0IHJjb21fY29uZmlnICopIHJjLT5yY19idWY7CisJc2l6ZV90IGNvbmZfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZGxtX3Jjb20pICsgc2l6ZW9mKHN0cnVjdCByY29tX2NvbmZpZyk7CiAKIAlpZiAoKHJjLT5yY19oZWFkZXIuaF92ZXJzaW9uICYgMHhGRkZGMDAwMCkgIT0gRExNX0hFQURFUl9NQUpPUikgewogCQlsb2dfZXJyb3IobHMsICJ2ZXJzaW9uIG1pc21hdGNoOiAleCBub2RlaWQgJWQ6ICV4IiwKQEAgLTkzLDExICs5NCwxOCBAQAogCQlyZXR1cm4gLUVQUk9UTzsKIAl9CiAKLQlpZiAocmYtPnJmX2x2YmxlbiAhPSBscy0+bHNfbHZibGVuIHx8Ci0JICAgIHJmLT5yZl9sc2ZsYWdzICE9IGxzLT5sc19leGZsYWdzKSB7CisJaWYgKHJjLT5yY19oZWFkZXIuaF9sZW5ndGggPCBjb25mX3NpemUpIHsKKwkJbG9nX2Vycm9yKGxzLCAiY29uZmlnIHRvbyBzaG9ydDogJWQgbm9kZWlkICVkIiwKKwkJCSAgcmMtPnJjX2hlYWRlci5oX2xlbmd0aCwgbm9kZWlkKTsKKwkJcmV0dXJuIC1FUFJPVE87CisJfQorCisJaWYgKGxlMzJfdG9fY3B1KHJmLT5yZl9sdmJsZW4pICE9IGxzLT5sc19sdmJsZW4gfHwKKwkgICAgbGUzMl90b19jcHUocmYtPnJmX2xzZmxhZ3MpICE9IGxzLT5sc19leGZsYWdzKSB7CiAJCWxvZ19lcnJvcihscywgImNvbmZpZyBtaXNtYXRjaDogJWQsJXggbm9kZWlkICVkOiAlZCwleCIsCi0JCQkgIGxzLT5sc19sdmJsZW4sIGxzLT5sc19leGZsYWdzLAotCQkJICBub2RlaWQsIHJmLT5yZl9sdmJsZW4sIHJmLT5yZl9sc2ZsYWdzKTsKKwkJCSAgbHMtPmxzX2x2YmxlbiwgbHMtPmxzX2V4ZmxhZ3MsIG5vZGVpZCwKKwkJCSAgbGUzMl90b19jcHUocmYtPnJmX2x2YmxlbiksCisJCQkgIGxlMzJfdG9fY3B1KHJmLT5yZl9sc2ZsYWdzKSk7CiAJCXJldHVybiAtRVBST1RPOwogCX0KIAlyZXR1cm4gMDsKQEAgLTEyOCw3ICsxMzYsNyBAQAogCWxzLT5sc19yZWNvdmVyX25vZGVpZCA9IG5vZGVpZDsKIAogCWlmIChub2RlaWQgPT0gZGxtX291cl9ub2RlaWQoKSkgewotCQlyYyA9IChzdHJ1Y3QgZGxtX3Jjb20gKikgbHMtPmxzX3JlY292ZXJfYnVmOworCQlyYyA9IGxzLT5sc19yZWNvdmVyX2J1ZjsKIAkJcmMtPnJjX3Jlc3VsdCA9IGRsbV9yZWNvdmVyX3N0YXR1cyhscyk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTE0Nyw3ICsxNTUsNyBAQAogCWlmIChlcnJvcikKIAkJZ290byBvdXQ7CiAKLQlyYyA9IChzdHJ1Y3QgZGxtX3Jjb20gKikgbHMtPmxzX3JlY292ZXJfYnVmOworCXJjID0gbHMtPmxzX3JlY292ZXJfYnVmOwogCiAJaWYgKHJjLT5yY19yZXN1bHQgPT0gLUVTUkNIKSB7CiAJCS8qIHdlIHByZXRlbmQgdGhlIHJlbW90ZSBsb2Nrc3BhY2UgZXhpc3RzIHdpdGggMCBzdGF0dXMgKi8KQEAgLTIwMSwxNCArMjA5LDE1IEBACiB7CiAJc3RydWN0IGRsbV9yY29tICpyYzsKIAlzdHJ1Y3QgZGxtX21oYW5kbGUgKm1oOwotCWludCBlcnJvciA9IDAsIGxlbiA9IHNpemVvZihzdHJ1Y3QgZGxtX3Jjb20pOworCWludCBlcnJvciA9IDA7CisJaW50IG1heF9zaXplID0gZGxtX2NvbmZpZy5jaV9idWZmZXJfc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZGxtX3Jjb20pOwogCiAJbHMtPmxzX3JlY292ZXJfbm9kZWlkID0gbm9kZWlkOwogCiAJaWYgKG5vZGVpZCA9PSBkbG1fb3VyX25vZGVpZCgpKSB7CiAJCWRsbV9jb3B5X21hc3Rlcl9uYW1lcyhscywgbGFzdF9uYW1lLCBsYXN0X2xlbiwKLQkJICAgICAgICAgICAgICAgICAgICAgIGxzLT5sc19yZWNvdmVyX2J1ZiArIGxlbiwKLQkJICAgICAgICAgICAgICAgICAgICAgIGRsbV9jb25maWcuY2lfYnVmZmVyX3NpemUgLSBsZW4sIG5vZGVpZCk7CisJCSAgICAgICAgICAgICAgICAgICAgICBscy0+bHNfcmVjb3Zlcl9idWYtPnJjX2J1ZiwKKwkJICAgICAgICAgICAgICAgICAgICAgIG1heF9zaXplLCBub2RlaWQpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTI5OSwyMiArMzA4LDIyIEBACiB7CiAJbWVtc2V0KHJsLCAwLCBzaXplb2YoKnJsKSk7CiAKLQlybC0+cmxfb3ducGlkID0gbGtiLT5sa2Jfb3ducGlkOwotCXJsLT5ybF9sa2lkID0gbGtiLT5sa2JfaWQ7Ci0JcmwtPnJsX2V4ZmxhZ3MgPSBsa2ItPmxrYl9leGZsYWdzOwotCXJsLT5ybF9mbGFncyA9IGxrYi0+bGtiX2ZsYWdzOwotCXJsLT5ybF9sdmJzZXEgPSBsa2ItPmxrYl9sdmJzZXE7CisJcmwtPnJsX293bnBpZCA9IGNwdV90b19sZTMyKGxrYi0+bGtiX293bnBpZCk7CisJcmwtPnJsX2xraWQgPSBjcHVfdG9fbGUzMihsa2ItPmxrYl9pZCk7CisJcmwtPnJsX2V4ZmxhZ3MgPSBjcHVfdG9fbGUzMihsa2ItPmxrYl9leGZsYWdzKTsKKwlybC0+cmxfZmxhZ3MgPSBjcHVfdG9fbGUzMihsa2ItPmxrYl9mbGFncyk7CisJcmwtPnJsX2x2YnNlcSA9IGNwdV90b19sZTMyKGxrYi0+bGtiX2x2YnNlcSk7CiAJcmwtPnJsX3JxbW9kZSA9IGxrYi0+bGtiX3JxbW9kZTsKIAlybC0+cmxfZ3Jtb2RlID0gbGtiLT5sa2JfZ3Jtb2RlOwogCXJsLT5ybF9zdGF0dXMgPSBsa2ItPmxrYl9zdGF0dXM7Ci0JcmwtPnJsX3dhaXRfdHlwZSA9IGxrYi0+bGtiX3dhaXRfdHlwZTsKKwlybC0+cmxfd2FpdF90eXBlID0gY3B1X3RvX2xlMTYobGtiLT5sa2Jfd2FpdF90eXBlKTsKIAotCWlmIChsa2ItPmxrYl9iYXN0YWRkcikKKwlpZiAobGtiLT5sa2JfYmFzdGZuKQogCQlybC0+cmxfYXN0cyB8PSBBU1RfQkFTVDsKLQlpZiAobGtiLT5sa2JfYXN0YWRkcikKKwlpZiAobGtiLT5sa2JfYXN0Zm4pCiAJCXJsLT5ybF9hc3RzIHw9IEFTVF9DT01QOwogCi0JcmwtPnJsX25hbWVsZW4gPSByLT5yZXNfbGVuZ3RoOworCXJsLT5ybF9uYW1lbGVuID0gY3B1X3RvX2xlMTYoci0+cmVzX2xlbmd0aCk7CiAJbWVtY3B5KHJsLT5ybF9uYW1lLCByLT5yZXNfbmFtZSwgci0+cmVzX2xlbmd0aCk7CiAKIAkvKiBGSVhNRTogbWlnaHQgd2UgaGF2ZSBhbiBsdmIgd2l0aG91dCBETE1fTEtGX1ZBTEJMSyBzZXQgPwpAQCAtMzQ4LDYgKzM1Nyw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCisvKiBuZWVkcyBhdCBsZWFzdCBkbG1fcmNvbSArIHJjb21fbG9jayAqLwogc3RhdGljIHZvaWQgcmVjZWl2ZV9yY29tX2xvY2soc3RydWN0IGRsbV9scyAqbHMsIHN0cnVjdCBkbG1fcmNvbSAqcmNfaW4pCiB7CiAJc3RydWN0IGRsbV9yY29tICpyYzsKQEAgLTQwMSw3ICs0MTEsNyBAQAogCXJjLT5yY19yZXN1bHQgPSAtRVNSQ0g7CiAKIAlyZiA9IChzdHJ1Y3QgcmNvbV9jb25maWcgKikgcmMtPnJjX2J1ZjsKLQlyZi0+cmZfbHZibGVuID0gLTE7CisJcmYtPnJmX2x2YmxlbiA9IGNwdV90b19sZTMyKH4wVSk7CiAKIAlkbG1fcmNvbV9vdXQocmMpOwogCWRsbV9sb3djb21tc19jb21taXRfYnVmZmVyKG1oKTsKQEAgLTQzOSw2ICs0NDksOCBAQAogCiB2b2lkIGRsbV9yZWNlaXZlX3Jjb20oc3RydWN0IGRsbV9scyAqbHMsIHN0cnVjdCBkbG1fcmNvbSAqcmMsIGludCBub2RlaWQpCiB7CisJaW50IGxvY2tfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZGxtX3Jjb20pICsgc2l6ZW9mKHN0cnVjdCByY29tX2xvY2spOworCiAJaWYgKGRsbV9yZWNvdmVyeV9zdG9wcGVkKGxzKSAmJiAocmMtPnJjX3R5cGUgIT0gRExNX1JDT01fU1RBVFVTKSkgewogCQlsb2dfZGVidWcobHMsICJpZ25vcmluZyByZWNvdmVyeSBtZXNzYWdlICV4IGZyb20gJWQiLAogCQkJICByYy0+cmNfdHlwZSwgbm9kZWlkKTsKQEAgLTQ2Miw2ICs0NzQsOCBAQAogCQlicmVhazsKIAogCWNhc2UgRExNX1JDT01fTE9DSzoKKwkJaWYgKHJjLT5yY19oZWFkZXIuaF9sZW5ndGggPCBsb2NrX3NpemUpCisJCQlnb3RvIEVzaG9ydDsKIAkJcmVjZWl2ZV9yY29tX2xvY2sobHMsIHJjKTsKIAkJYnJlYWs7CiAKQEAgLTQ3OCwxMyArNDkyLDE4IEBACiAJCWJyZWFrOwogCiAJY2FzZSBETE1fUkNPTV9MT0NLX1JFUExZOgorCQlpZiAocmMtPnJjX2hlYWRlci5oX2xlbmd0aCA8IGxvY2tfc2l6ZSkKKwkJCWdvdG8gRXNob3J0OwogCQlkbG1fcmVjb3Zlcl9wcm9jZXNzX2NvcHkobHMsIHJjKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQlsb2dfZXJyb3IobHMsICJyZWNlaXZlX3Jjb20gYmFkIHR5cGUgJWQiLCByYy0+cmNfdHlwZSk7CiAJfQotIG91dDoKK291dDoKIAlyZXR1cm47CitFc2hvcnQ6CisJbG9nX2Vycm9yKGxzLCAicmVjb3ZlcnkgbWVzc2FnZSAleCBmcm9tICVkIGlzIHRvbyBzaG9ydCIsCisJCQkgIHJjLT5yY190eXBlLCBub2RlaWQpOwogfQogCmRpZmYgLS1naXQgYS9mcy9kbG0vcmVjb3Zlci5jIGIvZnMvZGxtL3JlY292ZXIuYwppbmRleCBkZjA3NWRjLi44MGFiYTViIDEwMDY0NAotLS0gYS9mcy9kbG0vcmVjb3Zlci5jCisrKyBiL2ZzL2RsbS9yZWNvdmVyLmMKQEAgLTk0LDcgKzk0LDcgQEAKIAogc3RhdGljIGludCB3YWl0X3N0YXR1c19hbGwoc3RydWN0IGRsbV9scyAqbHMsIHVpbnQzMl90IHdhaXRfc3RhdHVzKQogewotCXN0cnVjdCBkbG1fcmNvbSAqcmMgPSAoc3RydWN0IGRsbV9yY29tICopIGxzLT5sc19yZWNvdmVyX2J1ZjsKKwlzdHJ1Y3QgZGxtX3Jjb20gKnJjID0gbHMtPmxzX3JlY292ZXJfYnVmOwogCXN0cnVjdCBkbG1fbWVtYmVyICptZW1iOwogCWludCBlcnJvciA9IDAsIGRlbGF5OwogCkBAIC0xMjMsNyArMTIzLDcgQEAKIAogc3RhdGljIGludCB3YWl0X3N0YXR1c19sb3coc3RydWN0IGRsbV9scyAqbHMsIHVpbnQzMl90IHdhaXRfc3RhdHVzKQogewotCXN0cnVjdCBkbG1fcmNvbSAqcmMgPSAoc3RydWN0IGRsbV9yY29tICopIGxzLT5sc19yZWNvdmVyX2J1ZjsKKwlzdHJ1Y3QgZGxtX3Jjb20gKnJjID0gbHMtPmxzX3JlY292ZXJfYnVmOwogCWludCBlcnJvciA9IDAsIGRlbGF5ID0gMCwgbm9kZWlkID0gbHMtPmxzX2xvd19ub2RlaWQ7CiAKIAlmb3IgKDs7KSB7CmRpZmYgLS1naXQgYS9mcy9kbG0vcmVxdWVzdHF1ZXVlLmMgYi9mcy9kbG0vcmVxdWVzdHF1ZXVlLmMKaW5kZXggMGRlMDRmMS4uZGFhNDE4MyAxMDA2NDQKLS0tIGEvZnMvZGxtL3JlcXVlc3RxdWV1ZS5jCisrKyBiL2ZzL2RsbS9yZXF1ZXN0cXVldWUuYwpAQCAtMjAsNyArMjAsNyBAQAogc3RydWN0IHJxX2VudHJ5IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJaW50IG5vZGVpZDsKLQljaGFyIHJlcXVlc3RbMF07CisJc3RydWN0IGRsbV9tZXNzYWdlIHJlcXVlc3Q7CiB9OwogCiAvKgpAQCAtMzAsMTAgKzMwLDEwIEBACiAgKiBsb2Nrc3BhY2UgaXMgZW5hYmxlZCBvbiBzb21lIHdoaWxlIHN0aWxsIHN1c3BlbmRlZCBvbiBvdGhlcnMuCiAgKi8KIAotdm9pZCBkbG1fYWRkX3JlcXVlc3RxdWV1ZShzdHJ1Y3QgZGxtX2xzICpscywgaW50IG5vZGVpZCwgc3RydWN0IGRsbV9oZWFkZXIgKmhkKQordm9pZCBkbG1fYWRkX3JlcXVlc3RxdWV1ZShzdHJ1Y3QgZGxtX2xzICpscywgaW50IG5vZGVpZCwgc3RydWN0IGRsbV9tZXNzYWdlICptcykKIHsKIAlzdHJ1Y3QgcnFfZW50cnkgKmU7Ci0JaW50IGxlbmd0aCA9IGhkLT5oX2xlbmd0aDsKKwlpbnQgbGVuZ3RoID0gbXMtPm1faGVhZGVyLmhfbGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBkbG1fbWVzc2FnZSk7CiAKIAllID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJxX2VudHJ5KSArIGxlbmd0aCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlKSB7CkBAIC00Miw3ICs0Miw3IEBACiAJfQogCiAJZS0+bm9kZWlkID0gbm9kZWlkOwotCW1lbWNweShlLT5yZXF1ZXN0LCBoZCwgbGVuZ3RoKTsKKwltZW1jcHkoJmUtPnJlcXVlc3QsIG1zLCBtcy0+bV9oZWFkZXIuaF9sZW5ndGgpOwogCiAJbXV0ZXhfbG9jaygmbHMtPmxzX3JlcXVlc3RxdWV1ZV9tdXRleCk7CiAJbGlzdF9hZGRfdGFpbCgmZS0+bGlzdCwgJmxzLT5sc19yZXF1ZXN0cXVldWUpOwpAQCAtNzYsNyArNzYsNyBAQAogCQllID0gbGlzdF9lbnRyeShscy0+bHNfcmVxdWVzdHF1ZXVlLm5leHQsIHN0cnVjdCBycV9lbnRyeSwgbGlzdCk7CiAJCW11dGV4X3VubG9jaygmbHMtPmxzX3JlcXVlc3RxdWV1ZV9tdXRleCk7CiAKLQkJZGxtX3JlY2VpdmVfbWVzc2FnZV9zYXZlZChscywgKHN0cnVjdCBkbG1fbWVzc2FnZSAqKWUtPnJlcXVlc3QpOworCQlkbG1fcmVjZWl2ZV9tZXNzYWdlX3NhdmVkKGxzLCAmZS0+cmVxdWVzdCk7CiAKIAkJbXV0ZXhfbG9jaygmbHMtPmxzX3JlcXVlc3RxdWV1ZV9tdXRleCk7CiAJCWxpc3RfZGVsKCZlLT5saXN0KTsKQEAgLTE3Niw3ICsxNzYsNyBAQAogCiAJbXV0ZXhfbG9jaygmbHMtPmxzX3JlcXVlc3RxdWV1ZV9tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGUsIHNhZmUsICZscy0+bHNfcmVxdWVzdHF1ZXVlLCBsaXN0KSB7Ci0JCW1zID0gKHN0cnVjdCBkbG1fbWVzc2FnZSAqKSBlLT5yZXF1ZXN0OworCQltcyA9ICAmZS0+cmVxdWVzdDsKIAogCQlpZiAocHVyZ2VfcmVxdWVzdChscywgbXMsIGUtPm5vZGVpZCkpIHsKIAkJCWxpc3RfZGVsKCZlLT5saXN0KTsKZGlmZiAtLWdpdCBhL2ZzL2RsbS9yZXF1ZXN0cXVldWUuaCBiL2ZzL2RsbS9yZXF1ZXN0cXVldWUuaAppbmRleCBhYmEzNGZjLi4xMGNlNDQ5IDEwMDY0NAotLS0gYS9mcy9kbG0vcmVxdWVzdHF1ZXVlLmgKKysrIGIvZnMvZGxtL3JlcXVlc3RxdWV1ZS5oCkBAIC0xMyw3ICsxMyw3IEBACiAjaWZuZGVmIF9fUkVRVUVTVFFVRVVFX0RPVF9IX18KICNkZWZpbmUgX19SRVFVRVNUUVVFVUVfRE9UX0hfXwogCi12b2lkIGRsbV9hZGRfcmVxdWVzdHF1ZXVlKHN0cnVjdCBkbG1fbHMgKmxzLCBpbnQgbm9kZWlkLCBzdHJ1Y3QgZGxtX2hlYWRlciAqaGQpOwordm9pZCBkbG1fYWRkX3JlcXVlc3RxdWV1ZShzdHJ1Y3QgZGxtX2xzICpscywgaW50IG5vZGVpZCwgc3RydWN0IGRsbV9tZXNzYWdlICptcyk7CiBpbnQgZGxtX3Byb2Nlc3NfcmVxdWVzdHF1ZXVlKHN0cnVjdCBkbG1fbHMgKmxzKTsKIHZvaWQgZGxtX3dhaXRfcmVxdWVzdHF1ZXVlKHN0cnVjdCBkbG1fbHMgKmxzKTsKIHZvaWQgZGxtX3B1cmdlX3JlcXVlc3RxdWV1ZShzdHJ1Y3QgZGxtX2xzICpscyk7CmRpZmYgLS1naXQgYS9mcy9kbG0vdXNlci5jIGIvZnMvZGxtL3VzZXIuYwppbmRleCA3Y2JjNjgyLi5lYmJjZjM4IDEwMDY0NAotLS0gYS9mcy9kbG0vdXNlci5jCisrKyBiL2ZzL2RsbS91c2VyLmMKQEAgLTgyLDcgKzgyLDcgQEAKIAogc3RhdGljIHZvaWQgY29tcGF0X2lucHV0KHN0cnVjdCBkbG1fd3JpdGVfcmVxdWVzdCAqa2IsCiAJCQkgc3RydWN0IGRsbV93cml0ZV9yZXF1ZXN0MzIgKmtiMzIsCi0JCQkgaW50IG1heF9uYW1lbGVuKQorCQkJIHNpemVfdCBjb3VudCkKIHsKIAlrYi0+dmVyc2lvblswXSA9IGtiMzItPnZlcnNpb25bMF07CiAJa2ItPnZlcnNpb25bMV0gPSBrYjMyLT52ZXJzaW9uWzFdOwpAQCAtOTQsNyArOTQsOCBAQAogCSAgICBrYi0+Y21kID09IERMTV9VU0VSX1JFTU9WRV9MT0NLU1BBQ0UpIHsKIAkJa2ItPmkubHNwYWNlLmZsYWdzID0ga2IzMi0+aS5sc3BhY2UuZmxhZ3M7CiAJCWtiLT5pLmxzcGFjZS5taW5vciA9IGtiMzItPmkubHNwYWNlLm1pbm9yOwotCQlzdHJjcHkoa2ItPmkubHNwYWNlLm5hbWUsIGtiMzItPmkubHNwYWNlLm5hbWUpOworCQltZW1jcHkoa2ItPmkubHNwYWNlLm5hbWUsIGtiMzItPmkubHNwYWNlLm5hbWUsIGNvdW50IC0KKwkJCW9mZnNldG9mKHN0cnVjdCBkbG1fd3JpdGVfcmVxdWVzdDMyLCBpLmxzcGFjZS5uYW1lKSk7CiAJfSBlbHNlIGlmIChrYi0+Y21kID09IERMTV9VU0VSX1BVUkdFKSB7CiAJCWtiLT5pLnB1cmdlLm5vZGVpZCA9IGtiMzItPmkucHVyZ2Uubm9kZWlkOwogCQlrYi0+aS5wdXJnZS5waWQgPSBrYjMyLT5pLnB1cmdlLnBpZDsKQEAgLTExMiwxMSArMTEzLDggQEAKIAkJa2ItPmkubG9jay5iYXN0YWRkciA9ICh2b2lkICopKGxvbmcpa2IzMi0+aS5sb2NrLmJhc3RhZGRyOwogCQlrYi0+aS5sb2NrLmxrc2IgPSAodm9pZCAqKShsb25nKWtiMzItPmkubG9jay5sa3NiOwogCQltZW1jcHkoa2ItPmkubG9jay5sdmIsIGtiMzItPmkubG9jay5sdmIsIERMTV9VU0VSX0xWQl9MRU4pOwotCQlpZiAoa2ItPmkubG9jay5uYW1lbGVuIDw9IG1heF9uYW1lbGVuKQotCQkJbWVtY3B5KGtiLT5pLmxvY2submFtZSwga2IzMi0+aS5sb2NrLm5hbWUsCi0JCQkgICAgICAga2ItPmkubG9jay5uYW1lbGVuKTsKLQkJZWxzZQotCQkJa2ItPmkubG9jay5uYW1lbGVuID0gbWF4X25hbWVsZW47CisJCW1lbWNweShrYi0+aS5sb2NrLm5hbWUsIGtiMzItPmkubG9jay5uYW1lLCBjb3VudCAtCisJCQlvZmZzZXRvZihzdHJ1Y3QgZGxtX3dyaXRlX3JlcXVlc3QzMiwgaS5sb2NrLm5hbWUpKTsKIAl9CiB9CiAKQEAgLTE5Nyw4ICsxOTUsOCBAQAogCWlmIChsa2ItPmxrYl9mbGFncyAmIChETE1fSUZMX09SUEhBTiB8IERMTV9JRkxfREVBRCkpCiAJCWdvdG8gb3V0OwogCi0JRExNX0FTU0VSVChsa2ItPmxrYl9hc3RwYXJhbSwgZGxtX3ByaW50X2xrYihsa2IpOyk7Ci0JdWEgPSAoc3RydWN0IGRsbV91c2VyX2FyZ3MgKilsa2ItPmxrYl9hc3RwYXJhbTsKKwlETE1fQVNTRVJUKGxrYi0+bGtiX3VhLCBkbG1fcHJpbnRfbGtiKGxrYik7KTsKKwl1YSA9IGxrYi0+bGtiX3VhOwogCXByb2MgPSB1YS0+cHJvYzsKIAogCWlmICh0eXBlID09IEFTVF9CQVNUICYmIHVhLT5iYXN0YWRkciA9PSBOVUxMKQpAQCAtNTA4LDcgKzUwNiw3IEBACiAjZW5kaWYKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlrYnVmID0ga21hbGxvYyhjb3VudCwgR0ZQX0tFUk5FTCk7CisJa2J1ZiA9IGt6YWxsb2MoY291bnQgKyAxLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWtidWYpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC01MjYsMTUgKzUyNCwxNCBAQAogCWlmICgha2J1Zi0+aXM2NGJpdCkgewogCQlzdHJ1Y3QgZGxtX3dyaXRlX3JlcXVlc3QzMiAqazMyYnVmOwogCQlrMzJidWYgPSAoc3RydWN0IGRsbV93cml0ZV9yZXF1ZXN0MzIgKilrYnVmOwotCQlrYnVmID0ga21hbGxvYyhjb3VudCArIChzaXplb2Yoc3RydWN0IGRsbV93cml0ZV9yZXF1ZXN0KSAtCisJCWtidWYgPSBrbWFsbG9jKGNvdW50ICsgMSArIChzaXplb2Yoc3RydWN0IGRsbV93cml0ZV9yZXF1ZXN0KSAtCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBkbG1fd3JpdGVfcmVxdWVzdDMyKSksIEdGUF9LRVJORUwpOwogCQlpZiAoIWtidWYpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAogCQlpZiAocHJvYykKIAkJCXNldF9iaXQoRExNX1BST0NfRkxBR1NfQ09NUEFULCAmcHJvYy0+ZmxhZ3MpOwotCQljb21wYXRfaW5wdXQoa2J1ZiwgazMyYnVmLAotCQkJICAgICBjb3VudCAtIHNpemVvZihzdHJ1Y3QgZGxtX3dyaXRlX3JlcXVlc3QzMikpOworCQljb21wYXRfaW5wdXQoa2J1ZiwgazMyYnVmLCBjb3VudCArIDEpOwogCQlrZnJlZShrMzJidWYpOwogCX0KICNlbmRpZgpAQCAtNzc0LDcgKzc3MSw2IEBACiB7CiAJc3RydWN0IGRsbV91c2VyX3Byb2MgKnByb2MgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGRsbV9sa2IgKmxrYjsKLQlzdHJ1Y3QgZGxtX3VzZXJfYXJncyAqdWE7CiAJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAJaW50IGVycm9yLCB0eXBlPTAsIGJtb2RlPTAsIHJlbW92ZWQgPSAwOwogCkBAIC04NDUsOCArODQxLDcgQEAKIAl9CiAJc3Bpbl91bmxvY2soJnByb2MtPmFzdHNfc3Bpbik7CiAKLQl1YSA9IChzdHJ1Y3QgZGxtX3VzZXJfYXJncyAqKWxrYi0+bGtiX2FzdHBhcmFtOwotCWVycm9yID0gY29weV9yZXN1bHRfdG9fdXNlcih1YSwKKwllcnJvciA9IGNvcHlfcmVzdWx0X3RvX3VzZXIobGtiLT5sa2JfdWEsCiAJCQkgCXRlc3RfYml0KERMTV9QUk9DX0ZMQUdTX0NPTVBBVCwgJnByb2MtPmZsYWdzKSwKIAkJCQl0eXBlLCBibW9kZSwgYnVmLCBjb3VudCk7CiAKQEAgLTkwNyw3ICs5MDIsNyBAQAogCS5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUiwKIH07CiAKLWludCBkbG1fdXNlcl9pbml0KHZvaWQpCitpbnQgX19pbml0IGRsbV91c2VyX2luaXQodm9pZCkKIHsKIAlpbnQgZXJyb3I7CiAKZGlmZiAtLWdpdCBhL2ZzL2RsbS91dGlsLmMgYi9mcy9kbG0vdXRpbC5jCmluZGV4IDRkOWMxZjQuLmUzNjUyMGEgMTAwNjQ0Ci0tLSBhL2ZzL2RsbS91dGlsLmMKKysrIGIvZnMvZGxtL3V0aWwuYwpAQCAtMTMxLDUyICsxMzEsOCBAQAogCW1zLT5tX3Jlc3VsdAkJPSBmcm9tX2RsbV9lcnJubyhsZTMyX3RvX2NwdShtcy0+bV9yZXN1bHQpKTsKIH0KIAotc3RhdGljIHZvaWQgcmNvbV9sb2NrX291dChzdHJ1Y3QgcmNvbV9sb2NrICpybCkKLXsKLQlybC0+cmxfb3ducGlkCQk9IGNwdV90b19sZTMyKHJsLT5ybF9vd25waWQpOwotCXJsLT5ybF9sa2lkCQk9IGNwdV90b19sZTMyKHJsLT5ybF9sa2lkKTsKLQlybC0+cmxfcmVtaWQJCT0gY3B1X3RvX2xlMzIocmwtPnJsX3JlbWlkKTsKLQlybC0+cmxfcGFyZW50X2xraWQJPSBjcHVfdG9fbGUzMihybC0+cmxfcGFyZW50X2xraWQpOwotCXJsLT5ybF9wYXJlbnRfcmVtaWQJPSBjcHVfdG9fbGUzMihybC0+cmxfcGFyZW50X3JlbWlkKTsKLQlybC0+cmxfZXhmbGFncwkJPSBjcHVfdG9fbGUzMihybC0+cmxfZXhmbGFncyk7Ci0JcmwtPnJsX2ZsYWdzCQk9IGNwdV90b19sZTMyKHJsLT5ybF9mbGFncyk7Ci0JcmwtPnJsX2x2YnNlcQkJPSBjcHVfdG9fbGUzMihybC0+cmxfbHZic2VxKTsKLQlybC0+cmxfcmVzdWx0CQk9IGNwdV90b19sZTMyKHJsLT5ybF9yZXN1bHQpOwotCXJsLT5ybF93YWl0X3R5cGUJPSBjcHVfdG9fbGUxNihybC0+cmxfd2FpdF90eXBlKTsKLQlybC0+cmxfbmFtZWxlbgkJPSBjcHVfdG9fbGUxNihybC0+cmxfbmFtZWxlbik7Ci19Ci0KLXN0YXRpYyB2b2lkIHJjb21fbG9ja19pbihzdHJ1Y3QgcmNvbV9sb2NrICpybCkKLXsKLQlybC0+cmxfb3ducGlkCQk9IGxlMzJfdG9fY3B1KHJsLT5ybF9vd25waWQpOwotCXJsLT5ybF9sa2lkCQk9IGxlMzJfdG9fY3B1KHJsLT5ybF9sa2lkKTsKLQlybC0+cmxfcmVtaWQJCT0gbGUzMl90b19jcHUocmwtPnJsX3JlbWlkKTsKLQlybC0+cmxfcGFyZW50X2xraWQJPSBsZTMyX3RvX2NwdShybC0+cmxfcGFyZW50X2xraWQpOwotCXJsLT5ybF9wYXJlbnRfcmVtaWQJPSBsZTMyX3RvX2NwdShybC0+cmxfcGFyZW50X3JlbWlkKTsKLQlybC0+cmxfZXhmbGFncwkJPSBsZTMyX3RvX2NwdShybC0+cmxfZXhmbGFncyk7Ci0JcmwtPnJsX2ZsYWdzCQk9IGxlMzJfdG9fY3B1KHJsLT5ybF9mbGFncyk7Ci0JcmwtPnJsX2x2YnNlcQkJPSBsZTMyX3RvX2NwdShybC0+cmxfbHZic2VxKTsKLQlybC0+cmxfcmVzdWx0CQk9IGxlMzJfdG9fY3B1KHJsLT5ybF9yZXN1bHQpOwotCXJsLT5ybF93YWl0X3R5cGUJPSBsZTE2X3RvX2NwdShybC0+cmxfd2FpdF90eXBlKTsKLQlybC0+cmxfbmFtZWxlbgkJPSBsZTE2X3RvX2NwdShybC0+cmxfbmFtZWxlbik7Ci19Ci0KLXN0YXRpYyB2b2lkIHJjb21fY29uZmlnX291dChzdHJ1Y3QgcmNvbV9jb25maWcgKnJmKQotewotCXJmLT5yZl9sdmJsZW4JCT0gY3B1X3RvX2xlMzIocmYtPnJmX2x2Ymxlbik7Ci0JcmYtPnJmX2xzZmxhZ3MJCT0gY3B1X3RvX2xlMzIocmYtPnJmX2xzZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCByY29tX2NvbmZpZ19pbihzdHJ1Y3QgcmNvbV9jb25maWcgKnJmKQotewotCXJmLT5yZl9sdmJsZW4JCT0gbGUzMl90b19jcHUocmYtPnJmX2x2Ymxlbik7Ci0JcmYtPnJmX2xzZmxhZ3MJCT0gbGUzMl90b19jcHUocmYtPnJmX2xzZmxhZ3MpOwotfQotCiB2b2lkIGRsbV9yY29tX291dChzdHJ1Y3QgZGxtX3Jjb20gKnJjKQogewotCWludCB0eXBlID0gcmMtPnJjX3R5cGU7Ci0KIAloZWFkZXJfb3V0KCZyYy0+cmNfaGVhZGVyKTsKIAogCXJjLT5yY190eXBlCQk9IGNwdV90b19sZTMyKHJjLT5yY190eXBlKTsKQEAgLTE4NCwxOCArMTQwLDEwIEBACiAJcmMtPnJjX2lkCQk9IGNwdV90b19sZTY0KHJjLT5yY19pZCk7CiAJcmMtPnJjX3NlcQkJPSBjcHVfdG9fbGU2NChyYy0+cmNfc2VxKTsKIAlyYy0+cmNfc2VxX3JlcGx5CT0gY3B1X3RvX2xlNjQocmMtPnJjX3NlcV9yZXBseSk7Ci0KLQlpZiAoKHR5cGUgPT0gRExNX1JDT01fTE9DSykgfHwgKHR5cGUgPT0gRExNX1JDT01fTE9DS19SRVBMWSkpCi0JCXJjb21fbG9ja19vdXQoKHN0cnVjdCByY29tX2xvY2sgKikgcmMtPnJjX2J1Zik7Ci0KLQllbHNlIGlmICh0eXBlID09IERMTV9SQ09NX1NUQVRVU19SRVBMWSkKLQkJcmNvbV9jb25maWdfb3V0KChzdHJ1Y3QgcmNvbV9jb25maWcgKikgcmMtPnJjX2J1Zik7CiB9CiAKIHZvaWQgZGxtX3Jjb21faW4oc3RydWN0IGRsbV9yY29tICpyYykKIHsKLQlpbnQgdHlwZTsKLQogCWhlYWRlcl9pbigmcmMtPnJjX2hlYWRlcik7CiAKIAlyYy0+cmNfdHlwZQkJPSBsZTMyX3RvX2NwdShyYy0+cmNfdHlwZSk7CkBAIC0yMDMsMTMgKzE1MSw0IEBACiAJcmMtPnJjX2lkCQk9IGxlNjRfdG9fY3B1KHJjLT5yY19pZCk7CiAJcmMtPnJjX3NlcQkJPSBsZTY0X3RvX2NwdShyYy0+cmNfc2VxKTsKIAlyYy0+cmNfc2VxX3JlcGx5CT0gbGU2NF90b19jcHUocmMtPnJjX3NlcV9yZXBseSk7Ci0KLQl0eXBlID0gcmMtPnJjX3R5cGU7Ci0KLQlpZiAoKHR5cGUgPT0gRExNX1JDT01fTE9DSykgfHwgKHR5cGUgPT0gRExNX1JDT01fTE9DS19SRVBMWSkpCi0JCXJjb21fbG9ja19pbigoc3RydWN0IHJjb21fbG9jayAqKSByYy0+cmNfYnVmKTsKLQotCWVsc2UgaWYgKHR5cGUgPT0gRExNX1JDT01fU1RBVFVTX1JFUExZKQotCQlyY29tX2NvbmZpZ19pbigoc3RydWN0IHJjb21fY29uZmlnICopIHJjLT5yY19idWYpOwogfQotCmRpZmYgLS1naXQgYS9mcy9lZnMvaW5vZGUuYyBiL2ZzL2Vmcy9pbm9kZS5jCmluZGV4IDE3NDY5NmYuLjYyN2MzMDIgMTAwNjQ0Ci0tLSBhL2ZzL2Vmcy9pbm9kZS5jCisrKyBiL2ZzL2Vmcy9pbm9kZS5jCkBAIC00NSwxNyArNDUsMjYgQEAKIAlyZXR1cm47CiB9CiAKLXZvaWQgZWZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3N0cnVjdCBpbm9kZSAqZWZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzdXBlciwgdW5zaWduZWQgbG9uZyBpbm8pCiB7CiAJaW50IGksIGlub2RlX2luZGV4OwogCWRldl90IGRldmljZTsKIAl1MzIgcmRldjsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwotCXN0cnVjdCBlZnNfc2JfaW5mbyAgICAqc2IgPSBTVVBFUl9JTkZPKGlub2RlLT5pX3NiKTsKLQlzdHJ1Y3QgZWZzX2lub2RlX2luZm8gKmluID0gSU5PREVfSU5GTyhpbm9kZSk7CisJc3RydWN0IGVmc19zYl9pbmZvICAgICpzYiA9IFNVUEVSX0lORk8oc3VwZXIpOworCXN0cnVjdCBlZnNfaW5vZGVfaW5mbyAqaW47CiAJZWZzX2Jsb2NrX3QgYmxvY2ssIG9mZnNldDsKIAlzdHJ1Y3QgZWZzX2Rpbm9kZSAqZWZzX2lub2RlOwotICAKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJaW5vZGUgPSBpZ2V0X2xvY2tlZChzdXBlciwgaW5vKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykpCisJCXJldHVybiBpbm9kZTsKKworCWluID0gSU5PREVfSU5GTyhpbm9kZSk7CisKIAkvKgogCSoqIEVGUyBsYXlvdXQ6CiAJKioKQEAgLTE1OSwxMyArMTY4LDEzIEBACiAJCQlicmVhazsKIAl9CiAKLQlyZXR1cm47CisJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CisJcmV0dXJuIGlub2RlOwogICAgICAgICAKIHJlYWRfaW5vZGVfZXJyb3I6CiAJcHJpbnRrKEtFUk5fV0FSTklORyAiRUZTOiBmYWlsZWQgdG8gcmVhZCBpbm9kZSAlbHVcbiIsIGlub2RlLT5pX2lubyk7Ci0JbWFrZV9iYWRfaW5vZGUoaW5vZGUpOwotCi0JcmV0dXJuOworCWlnZXRfZmFpbGVkKGlub2RlKTsKKwlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIH0KIAogc3RhdGljIGlubGluZSBlZnNfYmxvY2tfdApkaWZmIC0tZ2l0IGEvZnMvZWZzL25hbWVpLmMgYi9mcy9lZnMvbmFtZWkuYwppbmRleCBmN2Y0MDcwLi5lMjY3MDQ3IDEwMDY0NAotLS0gYS9mcy9lZnMvbmFtZWkuYworKysgYi9mcy9lZnMvbmFtZWkuYwpAQCAtNjYsOSArNjYsMTAgQEAKIAlsb2NrX2tlcm5lbCgpOwogCWlub2RlbnVtID0gZWZzX2ZpbmRfZW50cnkoZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4pOwogCWlmIChpbm9kZW51bSkgewotCQlpZiAoIShpbm9kZSA9IGlnZXQoZGlyLT5pX3NiLCBpbm9kZW51bSkpKSB7CisJCWlub2RlID0gZWZzX2lnZXQoZGlyLT5pX3NiLCBpbm9kZW51bSk7CisJCWlmIChJU19FUlIoaW5vZGUpKSB7CiAJCQl1bmxvY2tfa2VybmVsKCk7Ci0JCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKKwkJCXJldHVybiBFUlJfQ0FTVChpbm9kZSk7CiAJCX0KIAl9CiAJdW5sb2NrX2tlcm5lbCgpOwpAQCAtODQsMTIgKzg1LDExIEBACiAKIAlpZiAoaW5vID09IDApCiAJCXJldHVybiBFUlJfUFRSKC1FU1RBTEUpOwotCWlub2RlID0gaWdldChzYiwgaW5vKTsKLQlpZiAoaW5vZGUgPT0gTlVMTCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJaW5vZGUgPSBlZnNfaWdldChzYiwgaW5vKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJcmV0dXJuIEVSUl9DQVNUKGlub2RlKTsKIAotCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpIHx8Ci0JICAgIChnZW5lcmF0aW9uICYmIGlub2RlLT5pX2dlbmVyYXRpb24gIT0gZ2VuZXJhdGlvbikpIHsKKwlpZiAoZ2VuZXJhdGlvbiAmJiBpbm9kZS0+aV9nZW5lcmF0aW9uICE9IGdlbmVyYXRpb24pIHsKIAkJaXB1dChpbm9kZSk7CiAJCXJldHVybiBFUlJfUFRSKC1FU1RBTEUpOwogCX0KQEAgLTExNiw3ICsxMTYsNyBAQAogCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCWVmc19pbm9fdCBpbm87Ci0JaW50IGVycm9yOworCWxvbmcgZXJyb3I7CiAKIAlsb2NrX2tlcm5lbCgpOwogCkBAIC0xMjUsMTAgKzEyNSwxMSBAQAogCWlmICghaW5vKQogCQlnb3RvIGZhaWw7CiAKLQllcnJvciA9IC1FQUNDRVM7Ci0JaW5vZGUgPSBpZ2V0KGNoaWxkLT5kX2lub2RlLT5pX3NiLCBpbm8pOwotCWlmICghaW5vZGUpCisJaW5vZGUgPSBlZnNfaWdldChjaGlsZC0+ZF9pbm9kZS0+aV9zYiwgaW5vKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkgeworCQllcnJvciA9IFBUUl9FUlIoaW5vZGUpOwogCQlnb3RvIGZhaWw7CisJfQogCiAJZXJyb3IgPSAtRU5PTUVNOwogCXBhcmVudCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9lZnMvc3VwZXIuYyBiL2ZzL2Vmcy9zdXBlci5jCmluZGV4IGM3OWJjNjIuLjE0MDgyNDAgMTAwNjQ0Ci0tLSBhL2ZzL2Vmcy9zdXBlci5jCisrKyBiL2ZzL2Vmcy9zdXBlci5jCkBAIC0xMDcsNyArMTA3LDYgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBlZnNfc3VwZXJibG9ja19vcGVyYXRpb25zID0gewogCS5hbGxvY19pbm9kZQk9IGVmc19hbGxvY19pbm9kZSwKIAkuZGVzdHJveV9pbm9kZQk9IGVmc19kZXN0cm95X2lub2RlLAotCS5yZWFkX2lub2RlCT0gZWZzX3JlYWRfaW5vZGUsCiAJLnB1dF9zdXBlcgk9IGVmc19wdXRfc3VwZXIsCiAJLnN0YXRmcwkJPSBlZnNfc3RhdGZzLAogCS5yZW1vdW50X2ZzCT0gZWZzX3JlbW91bnQsCkBAIC0yNDcsNiArMjQ2LDcgQEAKIAlzdHJ1Y3QgZWZzX3NiX2luZm8gKnNiOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJc3RydWN0IGlub2RlICpyb290OworCWludCByZXQgPSAtRUlOVkFMOwogCiAgCXNiID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGVmc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzYikKQEAgLTMwMywxMiArMzAzLDE4IEBACiAJfQogCXMtPnNfb3AgICA9ICZlZnNfc3VwZXJibG9ja19vcGVyYXRpb25zOwogCXMtPnNfZXhwb3J0X29wID0gJmVmc19leHBvcnRfb3BzOwotCXJvb3QgPSBpZ2V0KHMsIEVGU19ST09USU5PREUpOwotCXMtPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290KTsKLSAKLQlpZiAoIShzLT5zX3Jvb3QpKSB7CisJcm9vdCA9IGVmc19pZ2V0KHMsIEVGU19ST09USU5PREUpOworCWlmIChJU19FUlIocm9vdCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJFRlM6IGdldCByb290IGlub2RlIGZhaWxlZFxuIik7CisJCXJldCA9IFBUUl9FUlIocm9vdCk7CisJCWdvdG8gb3V0X25vX2ZzOworCX0KKworCXMtPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290KTsKKwlpZiAoIShzLT5zX3Jvb3QpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRUZTOiBnZXQgcm9vdCBkZW50cnkgZmFpbGVkXG4iKTsKIAkJaXB1dChyb290KTsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXRfbm9fZnM7CiAJfQogCkBAIC0zMTgsNyArMzI0LDcgQEAKIG91dF9ub19mczoKIAlzLT5zX2ZzX2luZm8gPSBOVUxMOwogCWtmcmVlKHNiKTsKLQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGVmc19zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKSB7CmRpZmYgLS1naXQgYS9mcy9leGVjLmMgYi9mcy9leGVjLmMKaW5kZXggYmU5MjNlNC4uOWZmNjA2OSAxMDA2NDQKLS0tIGEvZnMvZXhlYy5jCisrKyBiL2ZzL2V4ZWMuYwpAQCAtMTE5LDcgKzExOSw3IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIGV4aXQ7CiAKLQlmaWxlID0gbmFtZWlkYXRhX3RvX2ZpbHAoJm5kLCBPX1JET05MWSk7CisJZmlsZSA9IG5hbWVpZGF0YV90b19maWxwKCZuZCwgT19SRE9OTFl8T19MQVJHRUZJTEUpOwogCWVycm9yID0gUFRSX0VSUihmaWxlKTsKIAlpZiAoSVNfRVJSKGZpbGUpKQogCQlnb3RvIG91dDsKQEAgLTY1OCw3ICs2NTgsOCBAQAogCQkJaW50IGVyciA9IHZmc19wZXJtaXNzaW9uKCZuZCwgTUFZX0VYRUMpOwogCQkJZmlsZSA9IEVSUl9QVFIoZXJyKTsKIAkJCWlmICghZXJyKSB7Ci0JCQkJZmlsZSA9IG5hbWVpZGF0YV90b19maWxwKCZuZCwgT19SRE9OTFkpOworCQkJCWZpbGUgPSBuYW1laWRhdGFfdG9fZmlscCgmbmQsCisJCQkJCQkJT19SRE9OTFl8T19MQVJHRUZJTEUpOwogCQkJCWlmICghSVNfRVJSKGZpbGUpKSB7CiAJCQkJCWVyciA9IGRlbnlfd3JpdGVfYWNjZXNzKGZpbGUpOwogCQkJCQlpZiAoZXJyKSB7CkBAIC03ODIsMjYgKzc4Myw4IEBACiAJemFwX290aGVyX3RocmVhZHModHNrKTsKIAlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiAKLQkvKgotCSAqIEFjY291bnQgZm9yIHRoZSB0aHJlYWQgZ3JvdXAgbGVhZGVyIGhhbmdpbmcgYXJvdW5kOgotCSAqLwotCWNvdW50ID0gMTsKLQlpZiAoIXRocmVhZF9ncm91cF9sZWFkZXIodHNrKSkgewotCQljb3VudCA9IDI7Ci0JCS8qCi0JCSAqIFRoZSBTSUdBTFJNIHRpbWVyIHN1cnZpdmVzIHRoZSBleGVjLCBidXQgbmVlZHMgdG8gcG9pbnQKLQkJICogYXQgdXMgYXMgdGhlIG5ldyBncm91cCBsZWFkZXIgbm93LiAgV2UgaGF2ZSBhIHJhY2Ugd2l0aAotCQkgKiBhIHRpbWVyIGZpcmluZyBub3cgZ2V0dGluZyB0aGUgb2xkIGxlYWRlciwgc28gd2UgbmVlZCB0bwotCQkgKiBzeW5jaHJvbml6ZSB3aXRoIGFueSBmaXJpbmcgKGJ5IGNhbGxpbmcgZGVsX3RpbWVyX3N5bmMpCi0JCSAqIGJlZm9yZSB3ZSBjYW4gc2FmZWx5IGxldCB0aGUgb2xkIGdyb3VwIGxlYWRlciBkaWUuCi0JCSAqLwotCQlzaWctPnRzayA9IHRzazsKLQkJc3Bpbl91bmxvY2tfaXJxKGxvY2spOwotCQlpZiAoaHJ0aW1lcl9jYW5jZWwoJnNpZy0+cmVhbF90aW1lcikpCi0JCQlocnRpbWVyX3Jlc3RhcnQoJnNpZy0+cmVhbF90aW1lcik7Ci0JCXNwaW5fbG9ja19pcnEobG9jayk7Ci0JfQotCisJLyogQWNjb3VudCBmb3IgdGhlIHRocmVhZCBncm91cCBsZWFkZXIgaGFuZ2luZyBhcm91bmQ6ICovCisJY291bnQgPSB0aHJlYWRfZ3JvdXBfbGVhZGVyKHRzaykgPyAxIDogMjsKIAlzaWctPm5vdGlmeV9jb3VudCA9IGNvdW50OwogCXdoaWxlIChhdG9taWNfcmVhZCgmc2lnLT5jb3VudCkgPiBjb3VudCkgewogCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKQEAgLTExODQsNyArMTE2Nyw3IEBACiB7CiAJaW50IHRyeSxyZXR2YWw7CiAJc3RydWN0IGxpbnV4X2JpbmZtdCAqZm10OwotI2lmZGVmIF9fYWxwaGFfXworI2lmIGRlZmluZWQoX19hbHBoYV9fKSAmJiBkZWZpbmVkKENPTkZJR19BUkNIX1NVUFBPUlRTX0FPVVQpCiAJLyogaGFuZGxlIC9zYmluL2xvYWRlci4uICovCiAJewogCSAgICBzdHJ1Y3QgZXhlYyAqIGVoID0gKHN0cnVjdCBleGVjICopIGJwcm0tPmJ1ZjsKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvZXh0Mi5oIGIvZnMvZXh0Mi9leHQyLmgKaW5kZXggYmI5OTQ4Yy4uNDdkODhkYSAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9leHQyLmgKKysrIGIvZnMvZXh0Mi9leHQyLmgKQEAgLTEyNCw5ICsxMjQsOCBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZXh0Ml9jb3VudF9mcmVlIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgdW5zaWduZWQpOwogCiAvKiBpbm9kZS5jICovCi1leHRlcm4gdm9pZCBleHQyX3JlYWRfaW5vZGUgKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBzdHJ1Y3QgaW5vZGUgKmV4dDJfaWdldCAoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIGludCBleHQyX3dyaXRlX2lub2RlIChzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKLWV4dGVybiB2b2lkIGV4dDJfcHV0X2lub2RlIChzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gdm9pZCBleHQyX2RlbGV0ZV9pbm9kZSAoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIGludCBleHQyX3N5bmNfaW5vZGUgKHN0cnVjdCBpbm9kZSAqKTsKIGV4dGVybiBpbnQgZXh0Ml9nZXRfYmxvY2soc3RydWN0IGlub2RlICosIHNlY3Rvcl90LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgaW50KTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvaW5vZGUuYyBiL2ZzL2V4dDIvaW5vZGUuYwppbmRleCAwMzk3OGVjLi5jNjIwMDY4IDEwMDY0NAotLS0gYS9mcy9leHQyL2lub2RlLmMKKysrIGIvZnMvZXh0Mi9pbm9kZS5jCkBAIC0xMTgxLDIyICsxMTgxLDMzIEBACiAJCWVpLT5pX2ZsYWdzIHw9IEVYVDJfRElSU1lOQ19GTDsKIH0KIAotdm9pZCBleHQyX3JlYWRfaW5vZGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlKQorc3RydWN0IGlub2RlICpleHQyX2lnZXQgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgaW5vKQogewotCXN0cnVjdCBleHQyX2lub2RlX2luZm8gKmVpID0gRVhUMl9JKGlub2RlKTsKLQlpbm9fdCBpbm8gPSBpbm9kZS0+aV9pbm87CisJc3RydWN0IGV4dDJfaW5vZGVfaW5mbyAqZWk7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7Ci0Jc3RydWN0IGV4dDJfaW5vZGUgKiByYXdfaW5vZGUgPSBleHQyX2dldF9pbm9kZShpbm9kZS0+aV9zYiwgaW5vLCAmYmgpOworCXN0cnVjdCBleHQyX2lub2RlICpyYXdfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlsb25nIHJldCA9IC1FSU87CiAJaW50IG47CiAKKwlpbm9kZSA9IGlnZXRfbG9ja2VkKHNiLCBpbm8pOworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWlmICghKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpKQorCQlyZXR1cm4gaW5vZGU7CisKKwllaSA9IEVYVDJfSShpbm9kZSk7CiAjaWZkZWYgQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMCiAJZWktPmlfYWNsID0gRVhUMl9BQ0xfTk9UX0NBQ0hFRDsKIAllaS0+aV9kZWZhdWx0X2FjbCA9IEVYVDJfQUNMX05PVF9DQUNIRUQ7CiAjZW5kaWYKIAllaS0+aV9ibG9ja19hbGxvY19pbmZvID0gTlVMTDsKIAotCWlmIChJU19FUlIocmF3X2lub2RlKSkKKwlyYXdfaW5vZGUgPSBleHQyX2dldF9pbm9kZShpbm9kZS0+aV9zYiwgaW5vLCAmYmgpOworCWlmIChJU19FUlIocmF3X2lub2RlKSkgeworCQlyZXQgPSBQVFJfRVJSKHJhd19pbm9kZSk7CiAgCQlnb3RvIGJhZF9pbm9kZTsKKwl9CiAKIAlpbm9kZS0+aV9tb2RlID0gbGUxNl90b19jcHUocmF3X2lub2RlLT5pX21vZGUpOwogCWlub2RlLT5pX3VpZCA9ICh1aWRfdClsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfdWlkX2xvdyk7CkBAIC0xMjIwLDYgKzEyMzEsNyBAQAogCWlmIChpbm9kZS0+aV9ubGluayA9PSAwICYmIChpbm9kZS0+aV9tb2RlID09IDAgfHwgZWktPmlfZHRpbWUpKSB7CiAJCS8qIHRoaXMgaW5vZGUgaXMgZGVsZXRlZCAqLwogCQlicmVsc2UgKGJoKTsKKwkJcmV0ID0gLUVTVEFMRTsKIAkJZ290byBiYWRfaW5vZGU7CiAJfQogCWlub2RlLT5pX2Jsb2NrcyA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9ibG9ja3MpOwpAQCAtMTI4NiwxMSArMTI5OCwxMiBAQAogCX0KIAlicmVsc2UgKGJoKTsKIAlleHQyX3NldF9pbm9kZV9mbGFncyhpbm9kZSk7Ci0JcmV0dXJuOworCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCXJldHVybiBpbm9kZTsKIAkKIGJhZF9pbm9kZToKLQltYWtlX2JhZF9pbm9kZShpbm9kZSk7Ci0JcmV0dXJuOworCWlnZXRfZmFpbGVkKGlub2RlKTsKKwlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQogCiBzdGF0aWMgaW50IGV4dDJfdXBkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBpbnQgZG9fc3luYykKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvbmFtZWkuYyBiL2ZzL2V4dDIvbmFtZWkuYwppbmRleCBlNjliZWVkLi44MGM5N2ZkIDEwMDY0NAotLS0gYS9mcy9leHQyL25hbWVpLmMKKysrIGIvZnMvZXh0Mi9uYW1laS5jCkBAIC02Myw5ICs2Myw5IEBACiAJaW5vID0gZXh0Ml9pbm9kZV9ieV9uYW1lKGRpciwgZGVudHJ5KTsKIAlpbm9kZSA9IE5VTEw7CiAJaWYgKGlubykgewotCQlpbm9kZSA9IGlnZXQoZGlyLT5pX3NiLCBpbm8pOwotCQlpZiAoIWlub2RlKQotCQkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisJCWlub2RlID0gZXh0Ml9pZ2V0KGRpci0+aV9zYiwgaW5vKTsKKwkJaWYgKElTX0VSUihpbm9kZSkpCisJCQlyZXR1cm4gRVJSX0NBU1QoaW5vZGUpOwogCX0KIAlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7CiB9CkBAIC04MywxMCArODMsMTAgQEAKIAlpbm8gPSBleHQyX2lub2RlX2J5X25hbWUoY2hpbGQtPmRfaW5vZGUsICZkb3Rkb3QpOwogCWlmICghaW5vKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKLQlpbm9kZSA9IGlnZXQoY2hpbGQtPmRfaW5vZGUtPmlfc2IsIGlubyk7CisJaW5vZGUgPSBleHQyX2lnZXQoY2hpbGQtPmRfaW5vZGUtPmlfc2IsIGlubyk7CiAKLQlpZiAoIWlub2RlKQotCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJcmV0dXJuIEVSUl9DQVNUKGlub2RlKTsKIAlwYXJlbnQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOwogCWlmICghcGFyZW50KSB7CiAJCWlwdXQoaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9zdXBlci5jIGIvZnMvZXh0Mi9zdXBlci5jCmluZGV4IDFiYTE4YjcuLjA4OGIwMTEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvc3VwZXIuYworKysgYi9mcy9leHQyL3N1cGVyLmMKQEAgLTI4NSw2ICsyODUsOSBAQAogCQlzZXFfcHV0cyhzZXEsICIseGlwIik7CiAjZW5kaWYKIAorCWlmICghdGVzdF9vcHQoc2IsIFJFU0VSVkFUSU9OKSkKKwkJc2VxX3B1dHMoc2VxLCAiLG5vcmVzZXJ2YXRpb24iKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0yOTYsNyArMjk5LDYgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBleHQyX3NvcHMgPSB7CiAJLmFsbG9jX2lub2RlCT0gZXh0Ml9hbGxvY19pbm9kZSwKIAkuZGVzdHJveV9pbm9kZQk9IGV4dDJfZGVzdHJveV9pbm9kZSwKLQkucmVhZF9pbm9kZQk9IGV4dDJfcmVhZF9pbm9kZSwKIAkud3JpdGVfaW5vZGUJPSBleHQyX3dyaXRlX2lub2RlLAogCS5kZWxldGVfaW5vZGUJPSBleHQyX2RlbGV0ZV9pbm9kZSwKIAkucHV0X3N1cGVyCT0gZXh0Ml9wdXRfc3VwZXIsCkBAIC0zMjYsMTEgKzMyOCwxMCBAQAogCSAqIGl0IG1pZ2h0IGJlICJuZWF0ZXIiIHRvIGNhbGwgZXh0Ml9nZXRfaW5vZGUgZmlyc3QgYW5kIGNoZWNrCiAJICogaWYgdGhlIGlub2RlIGlzIHZhbGlkLi4uLi4KIAkgKi8KLQlpbm9kZSA9IGlnZXQoc2IsIGlubyk7Ci0JaWYgKGlub2RlID09IE5VTEwpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpIHx8Ci0JICAgIChnZW5lcmF0aW9uICYmIGlub2RlLT5pX2dlbmVyYXRpb24gIT0gZ2VuZXJhdGlvbikpIHsKKwlpbm9kZSA9IGV4dDJfaWdldChzYiwgaW5vKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJcmV0dXJuIEVSUl9DQVNUKGlub2RlKTsKKwlpZiAoZ2VuZXJhdGlvbiAmJiBpbm9kZS0+aV9nZW5lcmF0aW9uICE9IGdlbmVyYXRpb24pIHsKIAkJLyogd2UgZGlkbid0IGZpbmQgdGhlIHJpZ2h0IGlub2RlLi4gKi8KIAkJaXB1dChpbm9kZSk7CiAJCXJldHVybiBFUlJfUFRSKC1FU1RBTEUpOwpAQCAtNzQ2LDYgKzc0Nyw3IEBACiAJdW5zaWduZWQgbG9uZyBsb2dpY19zYl9ibG9jazsKIAl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7CiAJdW5zaWduZWQgbG9uZyBkZWZfbW91bnRfb3B0czsKKwlsb25nIHJldCA9IC1FSU5WQUw7CiAJaW50IGJsb2Nrc2l6ZSA9IEJMT0NLX1NJWkU7CiAJaW50IGRiX2NvdW50OwogCWludCBpLCBqOwpAQCAtMTA0MSwxNyArMTA0MywyMiBAQAogCXNiLT5zX29wID0gJmV4dDJfc29wczsKIAlzYi0+c19leHBvcnRfb3AgPSAmZXh0Ml9leHBvcnRfb3BzOwogCXNiLT5zX3hhdHRyID0gZXh0Ml94YXR0cl9oYW5kbGVyczsKLQlyb290ID0gaWdldChzYiwgRVhUMl9ST09UX0lOTyk7CisJcm9vdCA9IGV4dDJfaWdldChzYiwgRVhUMl9ST09UX0lOTyk7CisJaWYgKElTX0VSUihyb290KSkgeworCQlyZXQgPSBQVFJfRVJSKHJvb3QpOworCQlnb3RvIGZhaWxlZF9tb3VudDM7CisJfQorCWlmICghU19JU0RJUihyb290LT5pX21vZGUpIHx8ICFyb290LT5pX2Jsb2NrcyB8fCAhcm9vdC0+aV9zaXplKSB7CisJCWlwdXQocm9vdCk7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUMi1mczogY29ycnVwdCByb290IGlub2RlLCBydW4gZTJmc2NrXG4iKTsKKwkJZ290byBmYWlsZWRfbW91bnQzOworCX0KKwogCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CiAJaWYgKCFzYi0+c19yb290KSB7CiAJCWlwdXQocm9vdCk7CiAJCXByaW50ayhLRVJOX0VSUiAiRVhUMi1mczogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKTsKLQkJZ290byBmYWlsZWRfbW91bnQzOwotCX0KLQlpZiAoIVNfSVNESVIocm9vdC0+aV9tb2RlKSB8fCAhcm9vdC0+aV9ibG9ja3MgfHwgIXJvb3QtPmlfc2l6ZSkgewotCQlkcHV0KHNiLT5zX3Jvb3QpOwotCQlzYi0+c19yb290ID0gTlVMTDsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQyLWZzOiBjb3JydXB0IHJvb3QgaW5vZGUsIHJ1biBlMmZzY2tcbiIpOworCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWxlZF9tb3VudDM7CiAJfQogCWlmIChFWFQyX0hBU19DT01QQVRfRkVBVFVSRShzYiwgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCkpCkBAIC0xMDgwLDcgKzEwODcsNyBAQAogZmFpbGVkX3NiaToKIAlzYi0+c19mc19pbmZvID0gTlVMTDsKIAlrZnJlZShzYmkpOwotCXJldHVybiAtRUlOVkFMOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGV4dDJfY29tbWl0X3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvYmFsbG9jLmMgYi9mcy9leHQzL2JhbGxvYy5jCmluZGV4IGE3NTcxMzAuLmRhMGNiMmMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvYmFsbG9jLmMKKysrIGIvZnMvZXh0My9iYWxsb2MuYwpAQCAtNjMwLDkgKzYzMCw3IEBACiAJamJkX3VubG9ja19iaF9zdGF0ZShiaXRtYXBfYmgpOwogCiAJc3Bpbl9sb2NrKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApKTsKLQlkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCA9Ci0JCWNwdV90b19sZTE2KGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSArCi0JCQlncm91cF9mcmVlZCk7CisJbGUxNl9hZGRfY3B1KCZkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCwgZ3JvdXBfZnJlZWQpOwogCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApKTsKIAlwZXJjcHVfY291bnRlcl9hZGQoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIsIGNvdW50KTsKIApAQCAtMTY5Niw4ICsxNjk0LDcgQEAKIAkJCXJldF9ibG9jaywgZ29hbF9oaXRzLCBnb2FsX2F0dGVtcHRzKTsKIAogCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwX25vKSk7Ci0JZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCA9Ci0JCQljcHVfdG9fbGUxNihsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KS1udW0pOworCWxlMTZfYWRkX2NwdSgmZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCwgLW51bSk7CiAJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBncm91cF9ubykpOwogCXBlcmNwdV9jb3VudGVyX3N1Yigmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwgbnVtKTsKIApkaWZmIC0tZ2l0IGEvZnMvZXh0My9pYWxsb2MuYyBiL2ZzL2V4dDMvaWFsbG9jLmMKaW5kZXggMWJjOGNkOC4uNGY0MDIwYyAxMDA2NDQKLS0tIGEvZnMvZXh0My9pYWxsb2MuYworKysgYi9mcy9leHQzL2lhbGxvYy5jCkBAIC0xNjQsMTEgKzE2NCw5IEBACiAKIAkJaWYgKGdkcCkgewogCQkJc3Bpbl9sb2NrKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApKTsKLQkJCWdkcC0+YmdfZnJlZV9pbm9kZXNfY291bnQgPSBjcHVfdG9fbGUxNigKLQkJCQlsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSArIDEpOworCQkJbGUxNl9hZGRfY3B1KCZnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50LCAxKTsKIAkJCWlmIChpc19kaXJlY3RvcnkpCi0JCQkJZ2RwLT5iZ191c2VkX2RpcnNfY291bnQgPSBjcHVfdG9fbGUxNigKLQkJCQkgIGxlMTZfdG9fY3B1KGdkcC0+YmdfdXNlZF9kaXJzX2NvdW50KSAtIDEpOworCQkJCWxlMTZfYWRkX2NwdSgmZ2RwLT5iZ191c2VkX2RpcnNfY291bnQsIC0xKTsKIAkJCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApKTsKIAkJCXBlcmNwdV9jb3VudGVyX2luYygmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlcik7CiAJCQlpZiAoaXNfZGlyZWN0b3J5KQpAQCAtNTI3LDExICs1MjUsOSBAQAogCWVyciA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgyKTsKIAlpZiAoZXJyKSBnb3RvIGZhaWw7CiAJc3Bpbl9sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXApKTsKLQlnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50ID0KLQkJY3B1X3RvX2xlMTYobGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2lub2Rlc19jb3VudCkgLSAxKTsKKwlsZTE2X2FkZF9jcHUoJmdkcC0+YmdfZnJlZV9pbm9kZXNfY291bnQsIC0xKTsKIAlpZiAoU19JU0RJUihtb2RlKSkgewotCQlnZHAtPmJnX3VzZWRfZGlyc19jb3VudCA9Ci0JCQljcHVfdG9fbGUxNihsZTE2X3RvX2NwdShnZHAtPmJnX3VzZWRfZGlyc19jb3VudCkgKyAxKTsKKwkJbGUxNl9hZGRfY3B1KCZnZHAtPmJnX3VzZWRfZGlyc19jb3VudCwgMSk7CiAJfQogCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXApKTsKIAlCVUZGRVJfVFJBQ0UoYmgyLCAiY2FsbCBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKQEAgLTY0MiwxNCArNjM4LDE1IEBACiAJdW5zaWduZWQgbG9uZyBtYXhfaW5vID0gbGUzMl90b19jcHUoRVhUM19TQihzYiktPnNfZXMtPnNfaW5vZGVzX2NvdW50KTsKIAl1bnNpZ25lZCBsb25nIGJsb2NrX2dyb3VwOwogCWludCBiaXQ7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCWxvbmcgZXJyID0gLUVJTzsKIAogCS8qIEVycm9yIGNhc2VzIC0gZTJmc2NrIGhhcyBhbHJlYWR5IGNsZWFuZWQgdXAgZm9yIHVzICovCiAJaWYgKGlubyA+IG1heF9pbm8pIHsKIAkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCiAJCQkgICAgICJiYWQgb3JwaGFuIGlubyAlbHUhICBlMmZzY2sgd2FzIHJ1bj8iLCBpbm8pOwotCQlnb3RvIG91dDsKKwkJZ290byBlcnJvcjsKIAl9CiAKIAlibG9ja19ncm91cCA9IChpbm8gLSAxKSAvIEVYVDNfSU5PREVTX1BFUl9HUk9VUChzYik7CkBAIC02NTgsMzggKzY1NSw0OSBAQAogCWlmICghYml0bWFwX2JoKSB7CiAJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAogCQkJICAgICAiaW5vZGUgYml0bWFwIGVycm9yIGZvciBvcnBoYW4gJWx1IiwgaW5vKTsKLQkJZ290byBvdXQ7CisJCWdvdG8gZXJyb3I7CiAJfQogCiAJLyogSGF2aW5nIHRoZSBpbm9kZSBiaXQgc2V0IHNob3VsZCBiZSBhIDEwMCUgaW5kaWNhdG9yIHRoYXQgdGhpcwogCSAqIGlzIGEgdmFsaWQgb3JwaGFuIChubyBlMmZzY2sgcnVuIG9uIGZzKS4gIE9ycGhhbnMgYWxzbyBpbmNsdWRlCiAJICogaW5vZGVzIHRoYXQgd2VyZSBiZWluZyB0cnVuY2F0ZWQsIHNvIHdlIGNhbid0IGNoZWNrIGlfbmxpbms9PTAuCiAJICovCi0JaWYgKCFleHQzX3Rlc3RfYml0KGJpdCwgYml0bWFwX2JoLT5iX2RhdGEpIHx8Ci0JCQkhKGlub2RlID0gaWdldChzYiwgaW5vKSkgfHwgaXNfYmFkX2lub2RlKGlub2RlKSB8fAotCQkJTkVYVF9PUlBIQU4oaW5vZGUpID4gbWF4X2lubykgewotCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKLQkJCSAgICAgImJhZCBvcnBoYW4gaW5vZGUgJWx1ISAgZTJmc2NrIHdhcyBydW4/IiwgaW5vKTsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJleHQzX3Rlc3RfYml0KGJpdD0lZCwgYmxvY2s9JWxsdSkgPSAlZFxuIiwKLQkJICAgICAgIGJpdCwgKHVuc2lnbmVkIGxvbmcgbG9uZyliaXRtYXBfYmgtPmJfYmxvY2tuciwKLQkJICAgICAgIGV4dDNfdGVzdF9iaXQoYml0LCBiaXRtYXBfYmgtPmJfZGF0YSkpOwotCQlwcmludGsoS0VSTl9OT1RJQ0UgImlub2RlPSVwXG4iLCBpbm9kZSk7Ci0JCWlmIChpbm9kZSkgewotCQkJcHJpbnRrKEtFUk5fTk9USUNFICJpc19iYWRfaW5vZGUoaW5vZGUpPSVkXG4iLAotCQkJICAgICAgIGlzX2JhZF9pbm9kZShpbm9kZSkpOwotCQkJcHJpbnRrKEtFUk5fTk9USUNFICJORVhUX09SUEhBTihpbm9kZSk9JXVcbiIsCi0JCQkgICAgICAgTkVYVF9PUlBIQU4oaW5vZGUpKTsKLQkJCXByaW50ayhLRVJOX05PVElDRSAibWF4X2lubz0lbHVcbiIsIG1heF9pbm8pOwotCQl9Ci0JCS8qIEF2b2lkIGZyZWVpbmcgYmxvY2tzIGlmIHdlIGdvdCBhIGJhZCBkZWxldGVkIGlub2RlICovCi0JCWlmIChpbm9kZSAmJiBpbm9kZS0+aV9ubGluayA9PSAwKQotCQkJaW5vZGUtPmlfYmxvY2tzID0gMDsKLQkJaXB1dChpbm9kZSk7Ci0JCWlub2RlID0gTlVMTDsKLQl9Ci1vdXQ6CisJaWYgKCFleHQzX3Rlc3RfYml0KGJpdCwgYml0bWFwX2JoLT5iX2RhdGEpKQorCQlnb3RvIGJhZF9vcnBoYW47CisKKwlpbm9kZSA9IGV4dDNfaWdldChzYiwgaW5vKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJZ290byBpZ2V0X2ZhaWxlZDsKKworCWlmIChORVhUX09SUEhBTihpbm9kZSkgPiBtYXhfaW5vKQorCQlnb3RvIGJhZF9vcnBoYW47CiAJYnJlbHNlKGJpdG1hcF9iaCk7CiAJcmV0dXJuIGlub2RlOworCitpZ2V0X2ZhaWxlZDoKKwllcnIgPSBQVFJfRVJSKGlub2RlKTsKKwlpbm9kZSA9IE5VTEw7CitiYWRfb3JwaGFuOgorCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkgICAgICJiYWQgb3JwaGFuIGlub2RlICVsdSEgIGUyZnNjayB3YXMgcnVuPyIsIGlubyk7CisJcHJpbnRrKEtFUk5fTk9USUNFICJleHQzX3Rlc3RfYml0KGJpdD0lZCwgYmxvY2s9JWxsdSkgPSAlZFxuIiwKKwkgICAgICAgYml0LCAodW5zaWduZWQgbG9uZyBsb25nKWJpdG1hcF9iaC0+Yl9ibG9ja25yLAorCSAgICAgICBleHQzX3Rlc3RfYml0KGJpdCwgYml0bWFwX2JoLT5iX2RhdGEpKTsKKwlwcmludGsoS0VSTl9OT1RJQ0UgImlub2RlPSVwXG4iLCBpbm9kZSk7CisJaWYgKGlub2RlKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiaXNfYmFkX2lub2RlKGlub2RlKT0lZFxuIiwKKwkJICAgICAgIGlzX2JhZF9pbm9kZShpbm9kZSkpOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIk5FWFRfT1JQSEFOKGlub2RlKT0ldVxuIiwKKwkJICAgICAgIE5FWFRfT1JQSEFOKGlub2RlKSk7CisJCXByaW50ayhLRVJOX05PVElDRSAibWF4X2lubz0lbHVcbiIsIG1heF9pbm8pOworCQkvKiBBdm9pZCBmcmVlaW5nIGJsb2NrcyBpZiB3ZSBnb3QgYSBiYWQgZGVsZXRlZCBpbm9kZSAqLworCQlpZiAoaW5vZGUtPmlfbmxpbmsgPT0gMCkKKwkJCWlub2RlLT5pX2Jsb2NrcyA9IDA7CisJCWlwdXQoaW5vZGUpOworCX0KKwlicmVsc2UoYml0bWFwX2JoKTsKK2Vycm9yOgorCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiAKIHVuc2lnbmVkIGxvbmcgZXh0M19jb3VudF9mcmVlX2lub2RlcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCmRpZmYgLS1naXQgYS9mcy9leHQzL2lub2RlLmMgYi9mcy9leHQzL2lub2RlLmMKaW5kZXggOGE5Y2UyZC4uZWI5NTY3MCAxMDA2NDQKLS0tIGEvZnMvZXh0My9pbm9kZS5jCisrKyBiL2ZzL2V4dDMvaW5vZGUuYwpAQCAtMjY1NCwyMSArMjY1NCwzMSBAQAogCQllaS0+aV9mbGFncyB8PSBFWFQzX0RJUlNZTkNfRkw7CiB9CiAKLXZvaWQgZXh0M19yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlKQorc3RydWN0IGlub2RlICpleHQzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBpbm8pCiB7CiAJc3RydWN0IGV4dDNfaWxvYyBpbG9jOwogCXN0cnVjdCBleHQzX2lub2RlICpyYXdfaW5vZGU7Ci0Jc3RydWN0IGV4dDNfaW5vZGVfaW5mbyAqZWkgPSBFWFQzX0koaW5vZGUpOworCXN0cnVjdCBleHQzX2lub2RlX2luZm8gKmVpOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlsb25nIHJldDsKIAlpbnQgYmxvY2s7CiAKKwlpbm9kZSA9IGlnZXRfbG9ja2VkKHNiLCBpbm8pOworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWlmICghKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpKQorCQlyZXR1cm4gaW5vZGU7CisKKwllaSA9IEVYVDNfSShpbm9kZSk7CiAjaWZkZWYgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMCiAJZWktPmlfYWNsID0gRVhUM19BQ0xfTk9UX0NBQ0hFRDsKIAllaS0+aV9kZWZhdWx0X2FjbCA9IEVYVDNfQUNMX05PVF9DQUNIRUQ7CiAjZW5kaWYKIAllaS0+aV9ibG9ja19hbGxvY19pbmZvID0gTlVMTDsKIAotCWlmIChfX2V4dDNfZ2V0X2lub2RlX2xvYyhpbm9kZSwgJmlsb2MsIDApKQorCXJldCA9IF9fZXh0M19nZXRfaW5vZGVfbG9jKGlub2RlLCAmaWxvYywgMCk7CisJaWYgKHJldCA8IDApCiAJCWdvdG8gYmFkX2lub2RlOwogCWJoID0gaWxvYy5iaDsKIAlyYXdfaW5vZGUgPSBleHQzX3Jhd19pbm9kZSgmaWxvYyk7CkBAIC0yNjk5LDYgKzI3MDksNyBAQAogCQkgICAgIShFWFQzX1NCKGlub2RlLT5pX3NiKS0+c19tb3VudF9zdGF0ZSAmIEVYVDNfT1JQSEFOX0ZTKSkgewogCQkJLyogdGhpcyBpbm9kZSBpcyBkZWxldGVkICovCiAJCQlicmVsc2UgKGJoKTsKKwkJCXJldCA9IC1FU1RBTEU7CiAJCQlnb3RvIGJhZF9pbm9kZTsKIAkJfQogCQkvKiBUaGUgb25seSB1bmxpbmtlZCBpbm9kZXMgd2UgbGV0IHRocm91Z2ggaGVyZSBoYXZlCkBAIC0yNzQyLDYgKzI3NTMsNyBAQAogCQlpZiAoRVhUM19HT09EX09MRF9JTk9ERV9TSVpFICsgZWktPmlfZXh0cmFfaXNpemUgPgogCQkgICAgRVhUM19JTk9ERV9TSVpFKGlub2RlLT5pX3NiKSkgewogCQkJYnJlbHNlIChiaCk7CisJCQlyZXQgPSAtRUlPOwogCQkJZ290byBiYWRfaW5vZGU7CiAJCX0KIAkJaWYgKGVpLT5pX2V4dHJhX2lzaXplID09IDApIHsKQEAgLTI3ODMsMTEgKzI3OTUsMTIgQEAKIAl9CiAJYnJlbHNlIChpbG9jLmJoKTsKIAlleHQzX3NldF9pbm9kZV9mbGFncyhpbm9kZSk7Ci0JcmV0dXJuOworCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCXJldHVybiBpbm9kZTsKIAogYmFkX2lub2RlOgotCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKLQlyZXR1cm47CisJaWdldF9mYWlsZWQoaW5vZGUpOworCXJldHVybiBFUlJfUFRSKHJldCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9leHQzL25hbWVpLmMgYi9mcy9leHQzL25hbWVpLmMKaW5kZXggOTJiODNiMC4uZGVjM2UwZCAxMDA2NDQKLS0tIGEvZnMvZXh0My9uYW1laS5jCisrKyBiL2ZzL2V4dDMvbmFtZWkuYwpAQCAtMTAzNywxNyArMTAzNywxMSBAQAogCQlpZiAoIWV4dDNfdmFsaWRfaW51bShkaXItPmlfc2IsIGlubykpIHsKIAkJCWV4dDNfZXJyb3IoZGlyLT5pX3NiLCAiZXh0M19sb29rdXAiLAogCQkJCSAgICJiYWQgaW5vZGUgbnVtYmVyOiAlbHUiLCBpbm8pOwotCQkJaW5vZGUgPSBOVUxMOwotCQl9IGVsc2UKLQkJCWlub2RlID0gaWdldChkaXItPmlfc2IsIGlubyk7Ci0KLQkJaWYgKCFpbm9kZSkKLQkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwotCi0JCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKSB7Ci0JCQlpcHV0KGlub2RlKTsKLQkJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCQkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CiAJCX0KKwkJaW5vZGUgPSBleHQzX2lnZXQoZGlyLT5pX3NiLCBpbm8pOworCQlpZiAoSVNfRVJSKGlub2RlKSkKKwkJCXJldHVybiBFUlJfQ0FTVChpbm9kZSk7CiAJfQogCXJldHVybiBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKIH0KQEAgLTEwNzYsMTggKzEwNzAsMTMgQEAKIAlpZiAoIWV4dDNfdmFsaWRfaW51bShjaGlsZC0+ZF9pbm9kZS0+aV9zYiwgaW5vKSkgewogCQlleHQzX2Vycm9yKGNoaWxkLT5kX2lub2RlLT5pX3NiLCAiZXh0M19nZXRfcGFyZW50IiwKIAkJCSAgICJiYWQgaW5vZGUgbnVtYmVyOiAlbHUiLCBpbm8pOwotCQlpbm9kZSA9IE5VTEw7Ci0JfSBlbHNlCi0JCWlub2RlID0gaWdldChjaGlsZC0+ZF9pbm9kZS0+aV9zYiwgaW5vKTsKLQotCWlmICghaW5vZGUpCi0JCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwotCi0JaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpIHsKLQkJaXB1dChpbm9kZSk7Ci0JCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIAl9CiAKKwlpbm9kZSA9IGV4dDNfaWdldChjaGlsZC0+ZF9pbm9kZS0+aV9zYiwgaW5vKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJcmV0dXJuIEVSUl9DQVNUKGlub2RlKTsKKwogCXBhcmVudCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CiAJaWYgKCFwYXJlbnQpIHsKIAkJaXB1dChpbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9leHQzL3Jlc2l6ZS5jIGIvZnMvZXh0My9yZXNpemUuYwppbmRleCA0NGRlMTQ1Li45Mzk3ZDc3IDEwMDY0NAotLS0gYS9mcy9leHQzL3Jlc2l6ZS5jCisrKyBiL2ZzL2V4dDMvcmVzaXplLmMKQEAgLTUxOCw4ICs1MTgsNyBAQAogCUVYVDNfU0Ioc2IpLT5zX2dkYl9jb3VudCsrOwogCWtmcmVlKG9fZ3JvdXBfZGVzYyk7CiAKLQllcy0+c19yZXNlcnZlZF9nZHRfYmxvY2tzID0KLQkJY3B1X3RvX2xlMTYobGUxNl90b19jcHUoZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcykgLSAxKTsKKwlsZTE2X2FkZF9jcHUoJmVzLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3MsIC0xKTsKIAlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBFWFQzX1NCKHNiKS0+c19zYmgpOwogCiAJcmV0dXJuIDA7CkBAIC03OTUsMTIgKzc5NCwxMSBAQAogCQkJCSAgICAgIk5vIHJlc2VydmVkIEdEVCBibG9ja3MsIGNhbid0IHJlc2l6ZSIpOwogCQkJcmV0dXJuIC1FUEVSTTsKIAkJfQotCQlpbm9kZSA9IGlnZXQoc2IsIEVYVDNfUkVTSVpFX0lOTyk7Ci0JCWlmICghaW5vZGUgfHwgaXNfYmFkX2lub2RlKGlub2RlKSkgeworCQlpbm9kZSA9IGV4dDNfaWdldChzYiwgRVhUM19SRVNJWkVfSU5PKTsKKwkJaWYgKElTX0VSUihpbm9kZSkpIHsKIAkJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAogCQkJCSAgICAgIkVycm9yIG9wZW5pbmcgcmVzaXplIGlub2RlIik7Ci0JCQlpcHV0KGlub2RlKTsKLQkJCXJldHVybiAtRU5PRU5UOworCQkJcmV0dXJuIFBUUl9FUlIoaW5vZGUpOwogCQl9CiAJfQogCkBAIC04OTEsMTAgKzg4OSw4IEBACiAJICogYmxvY2tzL2lub2RlcyBiZWZvcmUgdGhlIGdyb3VwIGlzIGxpdmUgd29uJ3QgYWN0dWFsbHkgbGV0IHVzCiAJICogYWxsb2NhdGUgdGhlIG5ldyBzcGFjZSB5ZXQuCiAJICovCi0JZXMtPnNfYmxvY2tzX2NvdW50ID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSArCi0JCWlucHV0LT5ibG9ja3NfY291bnQpOwotCWVzLT5zX2lub2Rlc19jb3VudCA9IGNwdV90b19sZTMyKGxlMzJfdG9fY3B1KGVzLT5zX2lub2Rlc19jb3VudCkgKwotCQlFWFQzX0lOT0RFU19QRVJfR1JPVVAoc2IpKTsKKwlsZTMyX2FkZF9jcHUoJmVzLT5zX2Jsb2Nrc19jb3VudCwgaW5wdXQtPmJsb2Nrc19jb3VudCk7CisJbGUzMl9hZGRfY3B1KCZlcy0+c19pbm9kZXNfY291bnQsIEVYVDNfSU5PREVTX1BFUl9HUk9VUChzYikpOwogCiAJLyoKIAkgKiBXZSBuZWVkIHRvIHByb3RlY3Qgc19ncm91cHNfY291bnQgYWdhaW5zdCBvdGhlciBDUFVzIHNlZWluZwpAQCAtOTI3LDggKzkyMyw3IEBACiAKIAkvKiBVcGRhdGUgdGhlIHJlc2VydmVkIGJsb2NrIGNvdW50cyBvbmx5IG9uY2UgdGhlIG5ldyBncm91cCBpcwogCSAqIGFjdGl2ZS4gKi8KLQllcy0+c19yX2Jsb2Nrc19jb3VudCA9IGNwdV90b19sZTMyKGxlMzJfdG9fY3B1KGVzLT5zX3JfYmxvY2tzX2NvdW50KSArCi0JCWlucHV0LT5yZXNlcnZlZF9ibG9ja3MpOworCWxlMzJfYWRkX2NwdSgmZXMtPnNfcl9ibG9ja3NfY291bnQsIGlucHV0LT5yZXNlcnZlZF9ibG9ja3MpOwogCiAJLyogVXBkYXRlIHRoZSBmcmVlIHNwYWNlIGNvdW50cyAqLwogCXBlcmNwdV9jb3VudGVyX2FkZCgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvc3VwZXIuYyBiL2ZzL2V4dDMvc3VwZXIuYwppbmRleCAzNDM2NzdlLi44ZTAyY2JmIDEwMDY0NAotLS0gYS9mcy9leHQzL3N1cGVyLmMKKysrIGIvZnMvZXh0My9zdXBlci5jCkBAIC02NDksMTEgKzY0OSwxMCBAQAogCSAqIEN1cnJlbnRseSB3ZSBkb24ndCBrbm93IHRoZSBnZW5lcmF0aW9uIGZvciBwYXJlbnQgZGlyZWN0b3J5LCBzbwogCSAqIGEgZ2VuZXJhdGlvbiBvZiAwIG1lYW5zICJhY2NlcHQgYW55IgogCSAqLwotCWlub2RlID0gaWdldChzYiwgaW5vKTsKLQlpZiAoaW5vZGUgPT0gTlVMTCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkgfHwKLQkgICAgKGdlbmVyYXRpb24gJiYgaW5vZGUtPmlfZ2VuZXJhdGlvbiAhPSBnZW5lcmF0aW9uKSkgeworCWlub2RlID0gZXh0M19pZ2V0KHNiLCBpbm8pOworCWlmIChJU19FUlIoaW5vZGUpKQorCQlyZXR1cm4gRVJSX0NBU1QoaW5vZGUpOworCWlmIChnZW5lcmF0aW9uICYmIGlub2RlLT5pX2dlbmVyYXRpb24gIT0gZ2VuZXJhdGlvbikgewogCQlpcHV0KGlub2RlKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVTVEFMRSk7CiAJfQpAQCAtNzIyLDcgKzcyMSw2IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgZXh0M19zb3BzID0gewogCS5hbGxvY19pbm9kZQk9IGV4dDNfYWxsb2NfaW5vZGUsCiAJLmRlc3Ryb3lfaW5vZGUJPSBleHQzX2Rlc3Ryb3lfaW5vZGUsCi0JLnJlYWRfaW5vZGUJPSBleHQzX3JlYWRfaW5vZGUsCiAJLndyaXRlX2lub2RlCT0gZXh0M193cml0ZV9pbm9kZSwKIAkuZGlydHlfaW5vZGUJPSBleHQzX2RpcnR5X2lub2RlLAogCS5kZWxldGVfaW5vZGUJPSBleHQzX2RlbGV0ZV9pbm9kZSwKQEAgLTEyMjQsNyArMTIyMiw3IEBACiAjZW5kaWYKIAlpZiAoIShfX3MxNikgbGUxNl90b19jcHUoZXMtPnNfbWF4X21udF9jb3VudCkpCiAJCWVzLT5zX21heF9tbnRfY291bnQgPSBjcHVfdG9fbGUxNihFWFQzX0RGTF9NQVhfTU5UX0NPVU5UKTsKLQllcy0+c19tbnRfY291bnQ9Y3B1X3RvX2xlMTYobGUxNl90b19jcHUoZXMtPnNfbW50X2NvdW50KSArIDEpOworCWxlMTZfYWRkX2NwdSgmZXMtPnNfbW50X2NvdW50LCAxKTsKIAllcy0+c19tdGltZSA9IGNwdV90b19sZTMyKGdldF9zZWNvbmRzKCkpOwogCWV4dDNfdXBkYXRlX2R5bmFtaWNfcmV2KHNiKTsKIAlFWFQzX1NFVF9JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUik7CkBAIC0xMzc4LDggKzEzNzYsOCBAQAogCXdoaWxlIChlcy0+c19sYXN0X29ycGhhbikgewogCQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCi0JCWlmICghKGlub2RlID0KLQkJICAgICAgZXh0M19vcnBoYW5fZ2V0KHNiLCBsZTMyX3RvX2NwdShlcy0+c19sYXN0X29ycGhhbikpKSkgeworCQlpbm9kZSA9IGV4dDNfb3JwaGFuX2dldChzYiwgbGUzMl90b19jcHUoZXMtPnNfbGFzdF9vcnBoYW4pKTsKKwkJaWYgKElTX0VSUihpbm9kZSkpIHsKIAkJCWVzLT5zX2xhc3Rfb3JwaGFuID0gMDsKIAkJCWJyZWFrOwogCQl9CkBAIC0xNTA4LDYgKzE1MDYsNyBAQAogCWludCBkYl9jb3VudDsKIAlpbnQgaTsKIAlpbnQgbmVlZHNfcmVjb3Zlcnk7CisJaW50IHJldCA9IC1FSU5WQUw7CiAJX19sZTMyIGZlYXR1cmVzOwogCWludCBlcnI7CiAKQEAgLTE4NzcsMTkgKzE4NzYsMjQgQEAKIAkgKiBzbyB3ZSBjYW4gc2FmZWx5IG1vdW50IHRoZSByZXN0IG9mIHRoZSBmaWxlc3lzdGVtIG5vdy4KIAkgKi8KIAotCXJvb3QgPSBpZ2V0KHNiLCBFWFQzX1JPT1RfSU5PKTsKLQlzYi0+c19yb290ID0gZF9hbGxvY19yb290KHJvb3QpOwotCWlmICghc2ItPnNfcm9vdCkgeworCXJvb3QgPSBleHQzX2lnZXQoc2IsIEVYVDNfUk9PVF9JTk8pOworCWlmIChJU19FUlIocm9vdCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBnZXQgcm9vdCBpbm9kZSBmYWlsZWRcbiIpOwotCQlpcHV0KHJvb3QpOworCQlyZXQgPSBQVFJfRVJSKHJvb3QpOwogCQlnb3RvIGZhaWxlZF9tb3VudDQ7CiAJfQogCWlmICghU19JU0RJUihyb290LT5pX21vZGUpIHx8ICFyb290LT5pX2Jsb2NrcyB8fCAhcm9vdC0+aV9zaXplKSB7Ci0JCWRwdXQoc2ItPnNfcm9vdCk7Ci0JCXNiLT5zX3Jvb3QgPSBOVUxMOworCQlpcHV0KHJvb3QpOwogCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGNvcnJ1cHQgcm9vdCBpbm9kZSwgcnVuIGUyZnNja1xuIik7CiAJCWdvdG8gZmFpbGVkX21vdW50NDsKIAl9CisJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290KTsKKwlpZiAoIXNiLT5zX3Jvb3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBnZXQgcm9vdCBkZW50cnkgZmFpbGVkXG4iKTsKKwkJaXB1dChyb290KTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsZWRfbW91bnQ0OworCX0KIAogCWV4dDNfc2V0dXBfc3VwZXIgKHNiLCBlcywgc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpOwogCS8qCkBAIC0xOTQxLDcgKzE5NDUsNyBAQAogCXNiLT5zX2ZzX2luZm8gPSBOVUxMOwogCWtmcmVlKHNiaSk7CiAJbG9ja19rZXJuZWwoKTsKLQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtMTk3Nyw4ICsxOTgxLDggQEAKIAkgKiB0aGluZ3MgaGFwcGVuIGlmIHdlIGlnZXQoKSBhbiB1bnVzZWQgaW5vZGUsIGFzIHRoZSBzdWJzZXF1ZW50CiAJICogaXB1dCgpIHdpbGwgdHJ5IHRvIGRlbGV0ZSBpdC4gKi8KIAotCWpvdXJuYWxfaW5vZGUgPSBpZ2V0KHNiLCBqb3VybmFsX2ludW0pOwotCWlmICgham91cm5hbF9pbm9kZSkgeworCWpvdXJuYWxfaW5vZGUgPSBleHQzX2lnZXQoc2IsIGpvdXJuYWxfaW51bSk7CisJaWYgKElTX0VSUihqb3VybmFsX2lub2RlKSkgewogCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IG5vIGpvdXJuYWwgZm91bmQuXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMTk5MSw3ICsxOTk1LDcgQEAKIAogCWpiZF9kZWJ1ZygyLCAiSm91cm5hbCBpbm9kZSBmb3VuZCBhdCAlcDogJUxkIGJ5dGVzXG4iLAogCQkgIGpvdXJuYWxfaW5vZGUsIGpvdXJuYWxfaW5vZGUtPmlfc2l6ZSk7Ci0JaWYgKGlzX2JhZF9pbm9kZShqb3VybmFsX2lub2RlKSB8fCAhU19JU1JFRyhqb3VybmFsX2lub2RlLT5pX21vZGUpKSB7CisJaWYgKCFTX0lTUkVHKGpvdXJuYWxfaW5vZGUtPmlfbW9kZSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBpbnZhbGlkIGpvdXJuYWwgaW5vZGUuXG4iKTsKIAkJaXB1dChqb3VybmFsX2lub2RlKTsKIAkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9mcy9leHQzL3hhdHRyLmMgYi9mcy9leHQzL3hhdHRyLmMKaW5kZXggNDA4MzczOC4uZmI4OWMyOSAxMDA2NDQKLS0tIGEvZnMvZXh0My94YXR0ci5jCisrKyBiL2ZzL2V4dDMveGF0dHIuYwpAQCAtNDkyLDggKzQ5Miw3IEBACiAJCWdldF9iaChiaCk7CiAJCWV4dDNfZm9yZ2V0KGhhbmRsZSwgMSwgaW5vZGUsIGJoLCBiaC0+Yl9ibG9ja25yKTsKIAl9IGVsc2UgewotCQlCSERSKGJoKS0+aF9yZWZjb3VudCA9IGNwdV90b19sZTMyKAotCQkJCWxlMzJfdG9fY3B1KEJIRFIoYmgpLT5oX3JlZmNvdW50KSAtIDEpOworCQlsZTMyX2FkZF9jcHUoJkJIRFIoYmgpLT5oX3JlZmNvdW50LCAtMSk7CiAJCWVycm9yID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOwogCQlpZiAoSVNfU1lOQyhpbm9kZSkpCiAJCQloYW5kbGUtPmhfc3luYyA9IDE7CkBAIC03ODAsOCArNzc5LDcgQEAKIAkJCQlpZiAoZXJyb3IpCiAJCQkJCWdvdG8gY2xlYW51cF9kcXVvdDsKIAkJCQlsb2NrX2J1ZmZlcihuZXdfYmgpOwotCQkJCUJIRFIobmV3X2JoKS0+aF9yZWZjb3VudCA9IGNwdV90b19sZTMyKDEgKwotCQkJCQlsZTMyX3RvX2NwdShCSERSKG5ld19iaCktPmhfcmVmY291bnQpKTsKKwkJCQlsZTMyX2FkZF9jcHUoJkJIRFIobmV3X2JoKS0+aF9yZWZjb3VudCwgMSk7CiAJCQkJZWFfYmRlYnVnKG5ld19iaCwgInJldXNpbmc7IHJlZmNvdW50IG5vdz0lZCIsCiAJCQkJCWxlMzJfdG9fY3B1KEJIRFIobmV3X2JoKS0+aF9yZWZjb3VudCkpOwogCQkJCXVubG9ja19idWZmZXIobmV3X2JoKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaWFsbG9jLmMgYi9mcy9leHQ0L2lhbGxvYy5jCmluZGV4IDU3NWI1MjEuLmRhMThhNzQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaWFsbG9jLmMKKysrIGIvZnMvZXh0NC9pYWxsb2MuYwpAQCAtNzgyLDE0ICs3ODIsMTUgQEAKIAl1bnNpZ25lZCBsb25nIG1heF9pbm8gPSBsZTMyX3RvX2NwdShFWFQ0X1NCKHNiKS0+c19lcy0+c19pbm9kZXNfY291bnQpOwogCWV4dDRfZ3JvdXBfdCBibG9ja19ncm91cDsKIAlpbnQgYml0OwotCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoID0gTlVMTDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwlsb25nIGVyciA9IC1FSU87CiAKIAkvKiBFcnJvciBjYXNlcyAtIGUyZnNjayBoYXMgYWxyZWFkeSBjbGVhbmVkIHVwIGZvciB1cyAqLwogCWlmIChpbm8gPiBtYXhfaW5vKSB7CiAJCWV4dDRfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAogCQkJICAgICAiYmFkIG9ycGhhbiBpbm8gJWx1ISAgZTJmc2NrIHdhcyBydW4/IiwgaW5vKTsKLQkJZ290byBvdXQ7CisJCWdvdG8gZXJyb3I7CiAJfQogCiAJYmxvY2tfZ3JvdXAgPSAoaW5vIC0gMSkgLyBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpOwpAQCAtNzk4LDM4ICs3OTksNDkgQEAKIAlpZiAoIWJpdG1hcF9iaCkgewogCQlleHQ0X3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKIAkJCSAgICAgImlub2RlIGJpdG1hcCBlcnJvciBmb3Igb3JwaGFuICVsdSIsIGlubyk7Ci0JCWdvdG8gb3V0OworCQlnb3RvIGVycm9yOwogCX0KIAogCS8qIEhhdmluZyB0aGUgaW5vZGUgYml0IHNldCBzaG91bGQgYmUgYSAxMDAlIGluZGljYXRvciB0aGF0IHRoaXMKIAkgKiBpcyBhIHZhbGlkIG9ycGhhbiAobm8gZTJmc2NrIHJ1biBvbiBmcykuICBPcnBoYW5zIGFsc28gaW5jbHVkZQogCSAqIGlub2RlcyB0aGF0IHdlcmUgYmVpbmcgdHJ1bmNhdGVkLCBzbyB3ZSBjYW4ndCBjaGVjayBpX25saW5rPT0wLgogCSAqLwotCWlmICghZXh0NF90ZXN0X2JpdChiaXQsIGJpdG1hcF9iaC0+Yl9kYXRhKSB8fAotCQkJIShpbm9kZSA9IGlnZXQoc2IsIGlubykpIHx8IGlzX2JhZF9pbm9kZShpbm9kZSkgfHwKLQkJCU5FWFRfT1JQSEFOKGlub2RlKSA+IG1heF9pbm8pIHsKLQkJZXh0NF93YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCi0JCQkgICAgICJiYWQgb3JwaGFuIGlub2RlICVsdSEgIGUyZnNjayB3YXMgcnVuPyIsIGlubyk7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiZXh0NF90ZXN0X2JpdChiaXQ9JWQsIGJsb2NrPSVsbHUpID0gJWRcbiIsCi0JCSAgICAgICBiaXQsICh1bnNpZ25lZCBsb25nIGxvbmcpYml0bWFwX2JoLT5iX2Jsb2NrbnIsCi0JCSAgICAgICBleHQ0X3Rlc3RfYml0KGJpdCwgYml0bWFwX2JoLT5iX2RhdGEpKTsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJpbm9kZT0lcFxuIiwgaW5vZGUpOwotCQlpZiAoaW5vZGUpIHsKLQkJCXByaW50ayhLRVJOX05PVElDRSAiaXNfYmFkX2lub2RlKGlub2RlKT0lZFxuIiwKLQkJCSAgICAgICBpc19iYWRfaW5vZGUoaW5vZGUpKTsKLQkJCXByaW50ayhLRVJOX05PVElDRSAiTkVYVF9PUlBIQU4oaW5vZGUpPSV1XG4iLAotCQkJICAgICAgIE5FWFRfT1JQSEFOKGlub2RlKSk7Ci0JCQlwcmludGsoS0VSTl9OT1RJQ0UgIm1heF9pbm89JWx1XG4iLCBtYXhfaW5vKTsKLQkJfQotCQkvKiBBdm9pZCBmcmVlaW5nIGJsb2NrcyBpZiB3ZSBnb3QgYSBiYWQgZGVsZXRlZCBpbm9kZSAqLwotCQlpZiAoaW5vZGUgJiYgaW5vZGUtPmlfbmxpbmsgPT0gMCkKLQkJCWlub2RlLT5pX2Jsb2NrcyA9IDA7Ci0JCWlwdXQoaW5vZGUpOwotCQlpbm9kZSA9IE5VTEw7Ci0JfQotb3V0OgorCWlmICghZXh0NF90ZXN0X2JpdChiaXQsIGJpdG1hcF9iaC0+Yl9kYXRhKSkKKwkJZ290byBiYWRfb3JwaGFuOworCisJaW5vZGUgPSBleHQ0X2lnZXQoc2IsIGlubyk7CisJaWYgKElTX0VSUihpbm9kZSkpCisJCWdvdG8gaWdldF9mYWlsZWQ7CisKKwlpZiAoTkVYVF9PUlBIQU4oaW5vZGUpID4gbWF4X2lubykKKwkJZ290byBiYWRfb3JwaGFuOwogCWJyZWxzZShiaXRtYXBfYmgpOwogCXJldHVybiBpbm9kZTsKKworaWdldF9mYWlsZWQ6CisJZXJyID0gUFRSX0VSUihpbm9kZSk7CisJaW5vZGUgPSBOVUxMOworYmFkX29ycGhhbjoKKwlleHQ0X3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJICAgICAiYmFkIG9ycGhhbiBpbm9kZSAlbHUhICBlMmZzY2sgd2FzIHJ1bj8iLCBpbm8pOworCXByaW50ayhLRVJOX05PVElDRSAiZXh0NF90ZXN0X2JpdChiaXQ9JWQsIGJsb2NrPSVsbHUpID0gJWRcbiIsCisJICAgICAgIGJpdCwgKHVuc2lnbmVkIGxvbmcgbG9uZyliaXRtYXBfYmgtPmJfYmxvY2tuciwKKwkgICAgICAgZXh0NF90ZXN0X2JpdChiaXQsIGJpdG1hcF9iaC0+Yl9kYXRhKSk7CisJcHJpbnRrKEtFUk5fTk9USUNFICJpbm9kZT0lcFxuIiwgaW5vZGUpOworCWlmIChpbm9kZSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImlzX2JhZF9pbm9kZShpbm9kZSk9JWRcbiIsCisJCSAgICAgICBpc19iYWRfaW5vZGUoaW5vZGUpKTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJORVhUX09SUEhBTihpbm9kZSk9JXVcbiIsCisJCSAgICAgICBORVhUX09SUEhBTihpbm9kZSkpOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIm1heF9pbm89JWx1XG4iLCBtYXhfaW5vKTsKKwkJLyogQXZvaWQgZnJlZWluZyBibG9ja3MgaWYgd2UgZ290IGEgYmFkIGRlbGV0ZWQgaW5vZGUgKi8KKwkJaWYgKGlub2RlLT5pX25saW5rID09IDApCisJCQlpbm9kZS0+aV9ibG9ja3MgPSAwOworCQlpcHV0KGlub2RlKTsKKwl9CisJYnJlbHNlKGJpdG1hcF9iaCk7CitlcnJvcjoKKwlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQogCiB1bnNpZ25lZCBsb25nIGV4dDRfY291bnRfZnJlZV9pbm9kZXMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiKQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pbm9kZS5jIGIvZnMvZXh0NC9pbm9kZS5jCmluZGV4IDBlOTA1NWMuLmY0ZTM4NzQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW5vZGUuYworKysgYi9mcy9leHQ0L2lub2RlLmMKQEAgLTI2ODAsMjEgKzI2ODAsMzEgQEAKIAl9CiB9CiAKLXZvaWQgZXh0NF9yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlKQorc3RydWN0IGlub2RlICpleHQ0X2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBpbm8pCiB7CiAJc3RydWN0IGV4dDRfaWxvYyBpbG9jOwogCXN0cnVjdCBleHQ0X2lub2RlICpyYXdfaW5vZGU7Ci0Jc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOworCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlsb25nIHJldDsKIAlpbnQgYmxvY2s7CiAKKwlpbm9kZSA9IGlnZXRfbG9ja2VkKHNiLCBpbm8pOworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWlmICghKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpKQorCQlyZXR1cm4gaW5vZGU7CisKKwllaSA9IEVYVDRfSShpbm9kZSk7CiAjaWZkZWYgQ09ORklHX0VYVDRERVZfRlNfUE9TSVhfQUNMCiAJZWktPmlfYWNsID0gRVhUNF9BQ0xfTk9UX0NBQ0hFRDsKIAllaS0+aV9kZWZhdWx0X2FjbCA9IEVYVDRfQUNMX05PVF9DQUNIRUQ7CiAjZW5kaWYKIAllaS0+aV9ibG9ja19hbGxvY19pbmZvID0gTlVMTDsKIAotCWlmIChfX2V4dDRfZ2V0X2lub2RlX2xvYyhpbm9kZSwgJmlsb2MsIDApKQorCXJldCA9IF9fZXh0NF9nZXRfaW5vZGVfbG9jKGlub2RlLCAmaWxvYywgMCk7CisJaWYgKHJldCA8IDApCiAJCWdvdG8gYmFkX2lub2RlOwogCWJoID0gaWxvYy5iaDsKIAlyYXdfaW5vZGUgPSBleHQ0X3Jhd19pbm9kZSgmaWxvYyk7CkBAIC0yNzIwLDYgKzI3MzAsNyBAQAogCQkgICAgIShFWFQ0X1NCKGlub2RlLT5pX3NiKS0+c19tb3VudF9zdGF0ZSAmIEVYVDRfT1JQSEFOX0ZTKSkgewogCQkJLyogdGhpcyBpbm9kZSBpcyBkZWxldGVkICovCiAJCQlicmVsc2UgKGJoKTsKKwkJCXJldCA9IC1FU1RBTEU7CiAJCQlnb3RvIGJhZF9pbm9kZTsKIAkJfQogCQkvKiBUaGUgb25seSB1bmxpbmtlZCBpbm9kZXMgd2UgbGV0IHRocm91Z2ggaGVyZSBoYXZlCkBAIC0yNzU4LDYgKzI3NjksNyBAQAogCQlpZiAoRVhUNF9HT09EX09MRF9JTk9ERV9TSVpFICsgZWktPmlfZXh0cmFfaXNpemUgPgogCQkgICAgRVhUNF9JTk9ERV9TSVpFKGlub2RlLT5pX3NiKSkgewogCQkJYnJlbHNlIChiaCk7CisJCQlyZXQgPSAtRUlPOwogCQkJZ290byBiYWRfaW5vZGU7CiAJCX0KIAkJaWYgKGVpLT5pX2V4dHJhX2lzaXplID09IDApIHsKQEAgLTI4MTEsMTEgKzI4MjMsMTIgQEAKIAl9CiAJYnJlbHNlIChpbG9jLmJoKTsKIAlleHQ0X3NldF9pbm9kZV9mbGFncyhpbm9kZSk7Ci0JcmV0dXJuOworCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCXJldHVybiBpbm9kZTsKIAogYmFkX2lub2RlOgotCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKLQlyZXR1cm47CisJaWdldF9mYWlsZWQoaW5vZGUpOworCXJldHVybiBFUlJfUFRSKHJldCk7CiB9CiAKIHN0YXRpYyBpbnQgZXh0NF9pbm9kZV9ibG9ja3Nfc2V0KGhhbmRsZV90ICpoYW5kbGUsCmRpZmYgLS1naXQgYS9mcy9leHQ0L25hbWVpLmMgYi9mcy9leHQ0L25hbWVpLmMKaW5kZXggNjdiNmQ4YS4uZDE1M2JiNSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9uYW1laS5jCisrKyBiL2ZzL2V4dDQvbmFtZWkuYwpAQCAtMTAzOSwxNyArMTAzOSwxMSBAQAogCQlpZiAoIWV4dDRfdmFsaWRfaW51bShkaXItPmlfc2IsIGlubykpIHsKIAkJCWV4dDRfZXJyb3IoZGlyLT5pX3NiLCAiZXh0NF9sb29rdXAiLAogCQkJCSAgICJiYWQgaW5vZGUgbnVtYmVyOiAlbHUiLCBpbm8pOwotCQkJaW5vZGUgPSBOVUxMOwotCQl9IGVsc2UKLQkJCWlub2RlID0gaWdldChkaXItPmlfc2IsIGlubyk7Ci0KLQkJaWYgKCFpbm9kZSkKLQkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwotCi0JCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKSB7Ci0JCQlpcHV0KGlub2RlKTsKLQkJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCQkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CiAJCX0KKwkJaW5vZGUgPSBleHQ0X2lnZXQoZGlyLT5pX3NiLCBpbm8pOworCQlpZiAoSVNfRVJSKGlub2RlKSkKKwkJCXJldHVybiBFUlJfQ0FTVChpbm9kZSk7CiAJfQogCXJldHVybiBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKIH0KQEAgLTEwNzgsMTggKzEwNzIsMTMgQEAKIAlpZiAoIWV4dDRfdmFsaWRfaW51bShjaGlsZC0+ZF9pbm9kZS0+aV9zYiwgaW5vKSkgewogCQlleHQ0X2Vycm9yKGNoaWxkLT5kX2lub2RlLT5pX3NiLCAiZXh0NF9nZXRfcGFyZW50IiwKIAkJCSAgICJiYWQgaW5vZGUgbnVtYmVyOiAlbHUiLCBpbm8pOwotCQlpbm9kZSA9IE5VTEw7Ci0JfSBlbHNlCi0JCWlub2RlID0gaWdldChjaGlsZC0+ZF9pbm9kZS0+aV9zYiwgaW5vKTsKLQotCWlmICghaW5vZGUpCi0JCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwotCi0JaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpIHsKLQkJaXB1dChpbm9kZSk7Ci0JCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIAl9CiAKKwlpbm9kZSA9IGV4dDRfaWdldChjaGlsZC0+ZF9pbm9kZS0+aV9zYiwgaW5vKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJcmV0dXJuIEVSUl9DQVNUKGlub2RlKTsKKwogCXBhcmVudCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CiAJaWYgKCFwYXJlbnQpIHsKIAkJaXB1dChpbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L3Jlc2l6ZS5jIGIvZnMvZXh0NC9yZXNpemUuYwppbmRleCA0ZmJiYTYwLi45NDc3YTJiIDEwMDY0NAotLS0gYS9mcy9leHQ0L3Jlc2l6ZS5jCisrKyBiL2ZzL2V4dDQvcmVzaXplLmMKQEAgLTc3OSwxMiArNzc5LDExIEBACiAJCQkJICAgICAiTm8gcmVzZXJ2ZWQgR0RUIGJsb2NrcywgY2FuJ3QgcmVzaXplIik7CiAJCQlyZXR1cm4gLUVQRVJNOwogCQl9Ci0JCWlub2RlID0gaWdldChzYiwgRVhUNF9SRVNJWkVfSU5PKTsKLQkJaWYgKCFpbm9kZSB8fCBpc19iYWRfaW5vZGUoaW5vZGUpKSB7CisJCWlub2RlID0gZXh0NF9pZ2V0KHNiLCBFWFQ0X1JFU0laRV9JTk8pOworCQlpZiAoSVNfRVJSKGlub2RlKSkgewogCQkJZXh0NF93YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCiAJCQkJICAgICAiRXJyb3Igb3BlbmluZyByZXNpemUgaW5vZGUiKTsKLQkJCWlwdXQoaW5vZGUpOwotCQkJcmV0dXJuIC1FTk9FTlQ7CisJCQlyZXR1cm4gUFRSX0VSUihpbm9kZSk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvc3VwZXIuYyBiL2ZzL2V4dDQvc3VwZXIuYwppbmRleCBjODliYjg3Li45M2JlYjg2IDEwMDY0NAotLS0gYS9mcy9leHQ0L3N1cGVyLmMKKysrIGIvZnMvZXh0NC9zdXBlci5jCkBAIC03NzcsMTEgKzc3NywxMCBAQAogCSAqIEN1cnJlbnRseSB3ZSBkb24ndCBrbm93IHRoZSBnZW5lcmF0aW9uIGZvciBwYXJlbnQgZGlyZWN0b3J5LCBzbwogCSAqIGEgZ2VuZXJhdGlvbiBvZiAwIG1lYW5zICJhY2NlcHQgYW55IgogCSAqLwotCWlub2RlID0gaWdldChzYiwgaW5vKTsKLQlpZiAoaW5vZGUgPT0gTlVMTCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkgfHwKLQkgICAgKGdlbmVyYXRpb24gJiYgaW5vZGUtPmlfZ2VuZXJhdGlvbiAhPSBnZW5lcmF0aW9uKSkgeworCWlub2RlID0gZXh0NF9pZ2V0KHNiLCBpbm8pOworCWlmIChJU19FUlIoaW5vZGUpKQorCQlyZXR1cm4gRVJSX0NBU1QoaW5vZGUpOworCWlmIChnZW5lcmF0aW9uICYmIGlub2RlLT5pX2dlbmVyYXRpb24gIT0gZ2VuZXJhdGlvbikgewogCQlpcHV0KGlub2RlKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVTVEFMRSk7CiAJfQpAQCAtODUwLDcgKzg0OSw2IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgZXh0NF9zb3BzID0gewogCS5hbGxvY19pbm9kZQk9IGV4dDRfYWxsb2NfaW5vZGUsCiAJLmRlc3Ryb3lfaW5vZGUJPSBleHQ0X2Rlc3Ryb3lfaW5vZGUsCi0JLnJlYWRfaW5vZGUJPSBleHQ0X3JlYWRfaW5vZGUsCiAJLndyaXRlX2lub2RlCT0gZXh0NF93cml0ZV9pbm9kZSwKIAkuZGlydHlfaW5vZGUJPSBleHQ0X2RpcnR5X2lub2RlLAogCS5kZWxldGVfaW5vZGUJPSBleHQ0X2RlbGV0ZV9pbm9kZSwKQEAgLTE4MDUsNiArMTgwMyw3IEBACiAJdW5zaWduZWQgbG9uZyBqb3VybmFsX2Rldm51bSA9IDA7CiAJdW5zaWduZWQgbG9uZyBkZWZfbW91bnRfb3B0czsKIAlzdHJ1Y3QgaW5vZGUgKnJvb3Q7CisJaW50IHJldCA9IC1FSU5WQUw7CiAJaW50IGJsb2Nrc2l6ZTsKIAlpbnQgZGJfY291bnQ7CiAJaW50IGk7CkBAIC0yMjM3LDE5ICsyMjM2LDI0IEBACiAJICogc28gd2UgY2FuIHNhZmVseSBtb3VudCB0aGUgcmVzdCBvZiB0aGUgZmlsZXN5c3RlbSBub3cuCiAJICovCiAKLQlyb290ID0gaWdldChzYiwgRVhUNF9ST09UX0lOTyk7Ci0Jc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290KTsKLQlpZiAoIXNiLT5zX3Jvb3QpIHsKKwlyb290ID0gZXh0NF9pZ2V0KHNiLCBFWFQ0X1JPT1RfSU5PKTsKKwlpZiAoSVNfRVJSKHJvb3QpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKTsKLQkJaXB1dChyb290KTsKKwkJcmV0ID0gUFRSX0VSUihyb290KTsKIAkJZ290byBmYWlsZWRfbW91bnQ0OwogCX0KIAlpZiAoIVNfSVNESVIocm9vdC0+aV9tb2RlKSB8fCAhcm9vdC0+aV9ibG9ja3MgfHwgIXJvb3QtPmlfc2l6ZSkgewotCQlkcHV0KHNiLT5zX3Jvb3QpOwotCQlzYi0+c19yb290ID0gTlVMTDsKKwkJaXB1dChyb290KTsKIAkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBjb3JydXB0IHJvb3QgaW5vZGUsIHJ1biBlMmZzY2tcbiIpOwogCQlnb3RvIGZhaWxlZF9tb3VudDQ7CiAJfQorCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CisJaWYgKCFzYi0+c19yb290KSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogZ2V0IHJvb3QgZGVudHJ5IGZhaWxlZFxuIik7CisJCWlwdXQocm9vdCk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbGVkX21vdW50NDsKKwl9CiAKIAlleHQ0X3NldHVwX3N1cGVyIChzYiwgZXMsIHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKTsKIApAQCAtMjMzMCw3ICsyMzM0LDcgQEAKIAlzYi0+c19mc19pbmZvID0gTlVMTDsKIAlrZnJlZShzYmkpOwogCWxvY2tfa2VybmVsKCk7Ci0JcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTIzNjYsOCArMjM3MCw4IEBACiAJICogdGhpbmdzIGhhcHBlbiBpZiB3ZSBpZ2V0KCkgYW4gdW51c2VkIGlub2RlLCBhcyB0aGUgc3Vic2VxdWVudAogCSAqIGlwdXQoKSB3aWxsIHRyeSB0byBkZWxldGUgaXQuICovCiAKLQlqb3VybmFsX2lub2RlID0gaWdldChzYiwgam91cm5hbF9pbnVtKTsKLQlpZiAoIWpvdXJuYWxfaW5vZGUpIHsKKwlqb3VybmFsX2lub2RlID0gZXh0NF9pZ2V0KHNiLCBqb3VybmFsX2ludW0pOworCWlmIChJU19FUlIoam91cm5hbF9pbm9kZSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBubyBqb3VybmFsIGZvdW5kLlxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTIzODAsNyArMjM4NCw3IEBACiAKIAlqYmRfZGVidWcoMiwgIkpvdXJuYWwgaW5vZGUgZm91bmQgYXQgJXA6ICVMZCBieXRlc1xuIiwKIAkJICBqb3VybmFsX2lub2RlLCBqb3VybmFsX2lub2RlLT5pX3NpemUpOwotCWlmIChpc19iYWRfaW5vZGUoam91cm5hbF9pbm9kZSkgfHwgIVNfSVNSRUcoam91cm5hbF9pbm9kZS0+aV9tb2RlKSkgeworCWlmICghU19JU1JFRyhqb3VybmFsX2lub2RlLT5pX21vZGUpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogaW52YWxpZCBqb3VybmFsIGlub2RlLlxuIik7CiAJCWlwdXQoam91cm5hbF9pbm9kZSk7CiAJCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvZnMvZmF0L2lub2RlLmMgYi9mcy9mYXQvaW5vZGUuYwppbmRleCAyNGMwYWFhLi41M2YzY2Y2IDEwMDY0NAotLS0gYS9mcy9mYXQvaW5vZGUuYworKysgYi9mcy9mYXQvaW5vZGUuYwpAQCAtNjM0LDggKzYzNCw2IEBACiAJLmNsZWFyX2lub2RlCT0gZmF0X2NsZWFyX2lub2RlLAogCS5yZW1vdW50X2ZzCT0gZmF0X3JlbW91bnQsCiAKLQkucmVhZF9pbm9kZQk9IG1ha2VfYmFkX2lub2RlLAotCiAJLnNob3dfb3B0aW9ucwk9IGZhdF9zaG93X29wdGlvbnMsCiB9OwogCkBAIC02NjMsOCArNjYxLDggQEAKIAlpZiAoZmhfbGVuIDwgNSB8fCBmaF90eXBlICE9IDMpCiAJCXJldHVybiBOVUxMOwogCi0JaW5vZGUgPSBpZ2V0KHNiLCBmaFswXSk7Ci0JaWYgKCFpbm9kZSB8fCBpc19iYWRfaW5vZGUoaW5vZGUpIHx8IGlub2RlLT5pX2dlbmVyYXRpb24gIT0gZmhbMV0pIHsKKwlpbm9kZSA9IGlsb29rdXAoc2IsIGZoWzBdKTsKKwlpZiAoIWlub2RlIHx8IGlub2RlLT5pX2dlbmVyYXRpb24gIT0gZmhbMV0pIHsKIAkJaWYgKGlub2RlKQogCQkJaXB1dChpbm9kZSk7CiAJCWlub2RlID0gTlVMTDsKQEAgLTc2MCw3ICs3NTgsNyBAQAogCWlub2RlID0gZmF0X2J1aWxkX2lub2RlKGNoaWxkLT5kX3NiLCBkZSwgaV9wb3MpOwogCWJyZWxzZShiaCk7CiAJaWYgKElTX0VSUihpbm9kZSkpIHsKLQkJcGFyZW50ID0gRVJSX1BUUihQVFJfRVJSKGlub2RlKSk7CisJCXBhcmVudCA9IEVSUl9DQVNUKGlub2RlKTsKIAkJZ290byBvdXQ7CiAJfQogCXBhcmVudCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CkBAIC04MzksNiArODM3LDggQEAKIAkJaWYgKCFvcHRzLT5udW10YWlsKQogCQkJc2VxX3B1dHMobSwgIixub251bXRhaWwiKTsKIAl9CisJaWYgKHNiaS0+b3B0aW9ucy5mbHVzaCkKKwkJc2VxX3B1dHMobSwgIixmbHVzaCIpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy9mY250bC5jIGIvZnMvZmNudGwuYwppbmRleCA4Njg1MjYzLi5lNjMyZGE3IDEwMDY0NAotLS0gYS9mcy9mY250bC5jCisrKyBiL2ZzL2ZjbnRsLmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxhc20vc2lnaW5mby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLXZvaWQgZmFzdGNhbGwgc2V0X2Nsb3NlX29uX2V4ZWModW5zaWduZWQgaW50IGZkLCBpbnQgZmxhZykKK3ZvaWQgc2V0X2Nsb3NlX29uX2V4ZWModW5zaWduZWQgaW50IGZkLCBpbnQgZmxhZykKIHsKIAlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOwogCXN0cnVjdCBmZHRhYmxlICpmZHQ7CkBAIC0zMDksNyArMzA5LDcgQEAKIHsKIAlwaWRfdCBwaWQ7CiAJcmVhZF9sb2NrKCZmaWxwLT5mX293bmVyLmxvY2spOwotCXBpZCA9IHBpZF9ucl9ucyhmaWxwLT5mX293bmVyLnBpZCwgY3VycmVudC0+bnNwcm94eS0+cGlkX25zKTsKKwlwaWQgPSBwaWRfdm5yKGZpbHAtPmZfb3duZXIucGlkKTsKIAlpZiAoZmlscC0+Zl9vd25lci5waWRfdHlwZSA9PSBQSURUWVBFX1BHSUQpCiAJCXBpZCA9IC1waWQ7CiAJcmVhZF91bmxvY2soJmZpbHAtPmZfb3duZXIubG9jayk7CmRpZmYgLS1naXQgYS9mcy9maWxlX3RhYmxlLmMgYi9mcy9maWxlX3RhYmxlLmMKaW5kZXggNjY0ZTNmMi4uNmQyN2JlZiAxMDA2NDQKLS0tIGEvZnMvZmlsZV90YWJsZS5jCisrKyBiL2ZzL2ZpbGVfdGFibGUuYwpAQCAtMTk3LDcgKzE5Nyw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGluaXRfZmlsZSk7CiAKLXZvaWQgZmFzdGNhbGwgZnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSkKK3ZvaWQgZnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZmlsZS0+Zl9jb3VudCkpCiAJCV9fZnB1dChmaWxlKTsKQEAgLTIwOCw3ICsyMDgsNyBAQAogLyogX19mcHV0IGlzIGNhbGxlZCBmcm9tIHRhc2sgY29udGV4dCB3aGVuIGFpbyBjb21wbGV0aW9uIHJlbGVhc2VzIHRoZSBsYXN0CiAgKiBsYXN0IHVzZSBvZiBhIHN0cnVjdCBmaWxlICouICBEbyBub3QgdXNlIG90aGVyd2lzZS4KICAqLwotdm9pZCBmYXN0Y2FsbCBfX2ZwdXQoc3RydWN0IGZpbGUgKmZpbGUpCit2b2lkIF9fZnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX3BhdGguZGVudHJ5OwogCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gZmlsZS0+Zl9wYXRoLm1udDsKQEAgLTI0MSw3ICsyNDEsNyBAQAogCW1udHB1dChtbnQpOwogfQogCi1zdHJ1Y3QgZmlsZSBmYXN0Y2FsbCAqZmdldCh1bnNpZ25lZCBpbnQgZmQpCitzdHJ1Y3QgZmlsZSAqZmdldCh1bnNpZ25lZCBpbnQgZmQpCiB7CiAJc3RydWN0IGZpbGUgKmZpbGU7CiAJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBjdXJyZW50LT5maWxlczsKQEAgLTI2OSw3ICsyNjksNyBAQAogICogYW5kIGEgZmxhZyBpcyByZXR1cm5lZCB0byBiZSBwYXNzZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZnB1dF9saWdodCgpLgogICogVGhlcmUgbXVzdCBub3QgYmUgYSBjbG9uaW5nIGJldHdlZW4gYW4gZmdldF9saWdodC9mcHV0X2xpZ2h0IHBhaXIuCiAgKi8KLXN0cnVjdCBmaWxlIGZhc3RjYWxsICpmZ2V0X2xpZ2h0KHVuc2lnbmVkIGludCBmZCwgaW50ICpmcHV0X25lZWRlZCkKK3N0cnVjdCBmaWxlICpmZ2V0X2xpZ2h0KHVuc2lnbmVkIGludCBmZCwgaW50ICpmcHV0X25lZWRlZCkKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlsZTsKIAlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOwpkaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19leHRlcm4uaCBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfZXh0ZXJuLmgKaW5kZXggOTFjY2VlOC4uMmI0NjA2NCAxMDA2NDQKLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19leHRlcm4uaAorKysgYi9mcy9mcmVldnhmcy92eGZzX2V4dGVybi5oCkBAIC01OCw3ICs1OCw3IEBACiBleHRlcm4gdm9pZAkJCXZ4ZnNfcHV0X2Zha2VfaW5vZGUoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIHN0cnVjdCB2eGZzX2lub2RlX2luZm8gKgl2eGZzX2Jsa2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVfbG9uZywgaW5vX3QpOwogZXh0ZXJuIHN0cnVjdCB2eGZzX2lub2RlX2luZm8gKgl2eGZzX3N0aWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW5vX3QpOwotZXh0ZXJuIHZvaWQJCQl2eGZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICopOworZXh0ZXJuIHN0cnVjdCBpbm9kZSAqCQl2eGZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIGlub190KTsKIGV4dGVybiB2b2lkCQkJdnhmc19jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CiAKIC8qIHZ4ZnNfbG9va3VwLmMgKi8KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuYwppbmRleCBkMWY3YzViLi5hZDg4ZDIzIDEwMDY0NAotLS0gYS9mcy9mcmVldnhmcy92eGZzX2lub2RlLmMKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5jCkBAIC0xMjksNyArMTI5LDcgQEAKICAqIERlc2NyaXB0aW9uOgogICogIFNlYXJjaCB0aGUgZm9yIGlub2RlIG51bWJlciBAaW5vIGluIHRoZSBmaWxlc3lzdGVtCiAgKiAgZGVzY3JpYmVkIGJ5IEBzYnAuICBVc2UgdGhlIHNwZWNpZmllZCBpbm9kZSB0YWJsZSAoQGlsaXN0cCkuCi0gKiAgUmV0dXJucyB0aGUgbWF0Y2hpbmcgVnhGUyBpbm9kZSBvbiBzdWNjZXNzLCBlbHNlIGEgTlVMTCBwb2ludGVyLgorICogIFJldHVybnMgdGhlIG1hdGNoaW5nIFZ4RlMgaW5vZGUgb24gc3VjY2VzcywgZWxzZSBhbiBlcnJvciBjb2RlLgogICovCiBzdGF0aWMgc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqCiBfX3Z4ZnNfaWdldChpbm9fdCBpbm8sIHN0cnVjdCBpbm9kZSAqaWxpc3RwKQpAQCAtMTU3LDEyICsxNTcsMTIgQEAKIAl9CiAKIAlwcmludGsoS0VSTl9XQVJOSU5HICJ2eGZzOiBlcnJvciBvbiBwYWdlICVwXG4iLCBwcCk7Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIEVSUl9DQVNUKHBwKTsKIAogZmFpbDoKIAlwcmludGsoS0VSTl9XQVJOSU5HICJ2eGZzOiB1bmFibGUgdG8gcmVhZCBpbm9kZSAlbGRcbiIsICh1bnNpZ25lZCBsb25nKWlubyk7CiAJdnhmc19wdXRfcGFnZShwcCk7Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiB9CiAKIC8qKgpAQCAtMTc4LDcgKzE3OCwxMCBAQAogc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqCiB2eGZzX3N0aWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgaW5vX3QgaW5vKQogewotICAgICAgICByZXR1cm4gX192eGZzX2lnZXQoaW5vLCBWWEZTX1NCSShzYnApLT52c2lfc3RpbGlzdCk7CisJc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwOworCisJdmlwID0gX192eGZzX2lnZXQoaW5vLCBWWEZTX1NCSShzYnApLT52c2lfc3RpbGlzdCk7CisJcmV0dXJuIElTX0VSUih2aXApID8gTlVMTCA6IHZpcDsKIH0KIAogLyoqCkBAIC0yODIsMjMgKzI4NSwzMiBAQAogfQogCiAvKioKLSAqIHZ4ZnNfcmVhZF9pbm9kZSAtIGZpbGwgaW4gaW5vZGUgaW5mb3JtYXRpb24KLSAqIEBpcDoJCWlub2RlIHBvaW50ZXIgdG8gZmlsbAorICogdnhmc19pZ2V0IC0gZ2V0IGFuIGlub2RlCisgKiBAc2JwOgl0aGUgc3VwZXJibG9jayB0byBnZXQgdGhlIGlub2RlIGZvcgorICogQGlubzoJdGhlIG51bWJlciBvZiB0aGUgaW5vZGUgdG8gZ2V0CiAgKgogICogRGVzY3JpcHRpb246Ci0gKiAgdnhmc19yZWFkX2lub2RlIHJlYWRzIHRoZSBkaXNrIGlub2RlIGZvciBAaXAgYW5kIGZpbGxzCi0gKiAgaW4gYWxsIHJlbGV2YW50IGZpZWxkcyBpbiBAaXAuCisgKiAgdnhmc19yZWFkX2lub2RlIGNyZWF0ZXMgYW4gaW5vZGUsIHJlYWRzIHRoZSBkaXNrIGlub2RlIGZvciBAaW5vIGFuZCBmaWxscworICogIGluIGFsbCByZWxldmFudCBmaWVsZHMgaW4gdGhlIG5ldyBpbm9kZS4KICAqLwotdm9pZAotdnhmc19yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaXApCitzdHJ1Y3QgaW5vZGUgKgordnhmc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCBpbm9fdCBpbm8pCiB7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrCQkqc2JwID0gaXAtPmlfc2I7CiAJc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbwkJKnZpcDsKIAljb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zCSphb3BzOwotCWlub190CQkJCWlubyA9IGlwLT5pX2lubzsKKwlzdHJ1Y3QgaW5vZGUgKmlwOwogCi0JaWYgKCEodmlwID0gX192eGZzX2lnZXQoaW5vLCBWWEZTX1NCSShzYnApLT52c2lfaWxpc3QpKSkKLQkJcmV0dXJuOworCWlwID0gaWdldF9sb2NrZWQoc2JwLCBpbm8pOworCWlmICghaXApCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWlmICghKGlwLT5pX3N0YXRlICYgSV9ORVcpKQorCQlyZXR1cm4gaXA7CisKKwl2aXAgPSBfX3Z4ZnNfaWdldChpbm8sIFZYRlNfU0JJKHNicCktPnZzaV9pbGlzdCk7CisJaWYgKElTX0VSUih2aXApKSB7CisJCWlnZXRfZmFpbGVkKGlwKTsKKwkJcmV0dXJuIEVSUl9DQVNUKHZpcCk7CisJfQogCiAJdnhmc19paW5pdChpcCwgdmlwKTsKIApAQCAtMzIzLDcgKzMzNSw4IEBACiAJfSBlbHNlCiAJCWluaXRfc3BlY2lhbF9pbm9kZShpcCwgaXAtPmlfbW9kZSwgb2xkX2RlY29kZV9kZXYodmlwLT52aWlfcmRldikpOwogCi0JcmV0dXJuOworCXVubG9ja19uZXdfaW5vZGUoaXApOworCXJldHVybiBpcDsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2xvb2t1cC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19sb29rdXAuYwppbmRleCBiZjg2ZTU0Li5hZWUwNDljIDEwMDY0NAotLS0gYS9mcy9mcmVldnhmcy92eGZzX2xvb2t1cC5jCisrKyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfbG9va3VwLmMKQEAgLTIxMywxMCArMjEzLDEwIEBACiAJbG9ja19rZXJuZWwoKTsKIAlpbm8gPSB2eGZzX2lub2RlX2J5X25hbWUoZGlwLCBkcCk7CiAJaWYgKGlubykgewotCQlpcCA9IGlnZXQoZGlwLT5pX3NiLCBpbm8pOwotCQlpZiAoIWlwKSB7CisJCWlwID0gdnhmc19pZ2V0KGRpcC0+aV9zYiwgaW5vKTsKKwkJaWYgKElTX0VSUihpcCkpIHsKIAkJCXVubG9ja19rZXJuZWwoKTsKLQkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCQkJcmV0dXJuIEVSUl9DQVNUKGlwKTsKIAkJfQogCX0KIAl1bmxvY2tfa2VybmVsKCk7CmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX3N1cGVyLmMgYi9mcy9mcmVldnhmcy92eGZzX3N1cGVyLmMKaW5kZXggNGY5NTU3Mi4uMWRhY2RhOCAxMDA2NDQKLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19zdXBlci5jCisrKyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3VwZXIuYwpAQCAtNjAsNyArNjAsNiBAQAogc3RhdGljIGludAkJdnhmc19yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQgKiwgY2hhciAqKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHZ4ZnNfc3VwZXJfb3BzID0gewotCS5yZWFkX2lub2RlID0JCXZ4ZnNfcmVhZF9pbm9kZSwKIAkuY2xlYXJfaW5vZGUgPQkJdnhmc19jbGVhcl9pbm9kZSwKIAkucHV0X3N1cGVyID0JCXZ4ZnNfcHV0X3N1cGVyLAogCS5zdGF0ZnMgPQkJdnhmc19zdGF0ZnMsCkBAIC0xNTMsNiArMTUyLDcgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJwID0gTlVMTDsKIAl1X2xvbmcJCQlic2l6ZTsKIAlzdHJ1Y3QgaW5vZGUgKnJvb3Q7CisJaW50IHJldCA9IC1FSU5WQUw7CiAKIAlzYnAtPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOwogCkBAIC0yMTksNyArMjE5LDExIEBACiAJfQogCiAJc2JwLT5zX29wID0gJnZ4ZnNfc3VwZXJfb3BzOwotCXJvb3QgPSBpZ2V0KHNicCwgVlhGU19ST09UX0lOTyk7CisJcm9vdCA9IHZ4ZnNfaWdldChzYnAsIFZYRlNfUk9PVF9JTk8pOworCWlmIChJU19FUlIocm9vdCkpIHsKKwkJcmV0ID0gUFRSX0VSUihyb290KTsKKwkJZ290byBvdXQ7CisJfQogCXNicC0+c19yb290ID0gZF9hbGxvY19yb290KHJvb3QpOwogCWlmICghc2JwLT5zX3Jvb3QpIHsKIAkJaXB1dChyb290KTsKQEAgLTIzNiw3ICsyNDAsNyBAQAogb3V0OgogCWJyZWxzZShicCk7CiAJa2ZyZWUoaW5mcCk7Ci0JcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL2ZzLXdyaXRlYmFjay5jIGIvZnMvZnMtd3JpdGViYWNrLmMKaW5kZXggZGI4MGNlOS4uYzAwNzYwNyAxMDA2NDQKLS0tIGEvZnMvZnMtd3JpdGViYWNrLmMKKysrIGIvZnMvZnMtd3JpdGViYWNrLmMKQEAgLTY1NSw3ICs2NTUsNyBAQAogCWludCByZXQ7CiAJc3RydWN0IHdyaXRlYmFja19jb250cm9sIHdiYyA9IHsKIAkJLm5yX3RvX3dyaXRlID0gTE9OR19NQVgsCi0JCS5zeW5jX21vZGUgPSBXQl9TWU5DX0FMTCwKKwkJLnN5bmNfbW9kZSA9IHN5bmMgPyBXQl9TWU5DX0FMTCA6IFdCX1NZTkNfTk9ORSwKIAkJLnJhbmdlX3N0YXJ0ID0gMCwKIAkJLnJhbmdlX2VuZCA9IExMT05HX01BWCwKIAl9OwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9kaXIuYyBiL2ZzL2Z1c2UvZGlyLmMKaW5kZXggZjU2ZjkxYi4uN2ZiNTE0YiAxMDA2NDQKLS0tIGEvZnMvZnVzZS9kaXIuYworKysgYi9mcy9mdXNlL2Rpci5jCkBAIC0yNjksMTIgKzI2OSwxMiBAQAogCiAJcmVxID0gZnVzZV9nZXRfcmVxKGZjKTsKIAlpZiAoSVNfRVJSKHJlcSkpCi0JCXJldHVybiBFUlJfUFRSKFBUUl9FUlIocmVxKSk7CisJCXJldHVybiBFUlJfQ0FTVChyZXEpOwogCiAJZm9yZ2V0X3JlcSA9IGZ1c2VfZ2V0X3JlcShmYyk7CiAJaWYgKElTX0VSUihmb3JnZXRfcmVxKSkgewogCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwotCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKGZvcmdldF9yZXEpKTsKKwkJcmV0dXJuIEVSUl9DQVNUKGZvcmdldF9yZXEpOwogCX0KIAogCWF0dHJfdmVyc2lvbiA9IGZ1c2VfZ2V0X2F0dHJfdmVyc2lvbihmYyk7CkBAIC0xMDA2LDcgKzEwMDYsNyBAQAogCWNoYXIgKmxpbms7CiAKIAlpZiAoSVNfRVJSKHJlcSkpCi0JCXJldHVybiBFUlJfUFRSKFBUUl9FUlIocmVxKSk7CisJCXJldHVybiBFUlJfQ0FTVChyZXEpOwogCiAJbGluayA9IChjaGFyICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKIAlpZiAoIWxpbmspIHsKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvaW5vZGUuYyBiL2ZzL2Z1c2UvaW5vZGUuYwppbmRleCBjOTBmNjMzLi4wMzNmN2JkIDEwMDY0NAotLS0gYS9mcy9mdXNlL2lub2RlLmMKKysrIGIvZnMvZnVzZS9pbm9kZS5jCkBAIC0yOSw2ICsyOSw4IEBACiAKICNkZWZpbmUgRlVTRV9TVVBFUl9NQUdJQyAweDY1NzM1NTQ2CiAKKyNkZWZpbmUgRlVTRV9ERUZBVUxUX0JMS1NJWkUgNTEyCisKIHN0cnVjdCBmdXNlX21vdW50X2RhdGEgewogCWludCBmZDsKIAl1bnNpZ25lZCByb290bW9kZTsKQEAgLTc2LDExICs3OCw2IEBACiAJa21lbV9jYWNoZV9mcmVlKGZ1c2VfaW5vZGVfY2FjaGVwLCBpbm9kZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGZ1c2VfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCS8qIE5vIG9wICovCi19Ci0KIHZvaWQgZnVzZV9zZW5kX2ZvcmdldChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEsCiAJCSAgICAgIHVuc2lnbmVkIGxvbmcgbm9kZWlkLCB1NjQgbmxvb2t1cCkKIHsKQEAgLTM2MCw3ICszNTcsNyBAQAogCWNoYXIgKnA7CiAJbWVtc2V0KGQsIDAsIHNpemVvZihzdHJ1Y3QgZnVzZV9tb3VudF9kYXRhKSk7CiAJZC0+bWF4X3JlYWQgPSB+MDsKLQlkLT5ibGtzaXplID0gNTEyOworCWQtPmJsa3NpemUgPSBGVVNFX0RFRkFVTFRfQkxLU0laRTsKIAogCXdoaWxlICgocCA9IHN0cnNlcCgmb3B0LCAiLCIpKSAhPSBOVUxMKSB7CiAJCWludCB0b2tlbjsKQEAgLTQ0NSw2ICs0NDIsOSBAQAogCQlzZXFfcHV0cyhtLCAiLGFsbG93X290aGVyIik7CiAJaWYgKGZjLT5tYXhfcmVhZCAhPSB+MCkKIAkJc2VxX3ByaW50ZihtLCAiLG1heF9yZWFkPSV1IiwgZmMtPm1heF9yZWFkKTsKKwlpZiAobW50LT5tbnRfc2ItPnNfYmRldiAmJgorCSAgICBtbnQtPm1udF9zYi0+c19ibG9ja3NpemUgIT0gRlVTRV9ERUZBVUxUX0JMS1NJWkUpCisJCXNlcV9wcmludGYobSwgIixibGtzaXplPSVsdSIsIG1udC0+bW50X3NiLT5zX2Jsb2Nrc2l6ZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUxNSw3ICs1MTUsNiBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGZ1c2Vfc3VwZXJfb3BlcmF0aW9ucyA9IHsKIAkuYWxsb2NfaW5vZGUgICAgPSBmdXNlX2FsbG9jX2lub2RlLAogCS5kZXN0cm95X2lub2RlICA9IGZ1c2VfZGVzdHJveV9pbm9kZSwKLQkucmVhZF9pbm9kZQk9IGZ1c2VfcmVhZF9pbm9kZSwKIAkuY2xlYXJfaW5vZGUJPSBmdXNlX2NsZWFyX2lub2RlLAogCS5kcm9wX2lub2RlCT0gZ2VuZXJpY19kZWxldGVfaW5vZGUsCiAJLnJlbW91bnRfZnMJPSBmdXNlX3JlbW91bnRfZnMsCmRpZmYgLS1naXQgYS9mcy9nZnMyL2Rpci5jIGIvZnMvZ2ZzMi9kaXIuYwppbmRleCA1N2UyZWQ5Li5jMzQ3MDk1IDEwMDY0NAotLS0gYS9mcy9nZnMyL2Rpci5jCisrKyBiL2ZzL2dmczIvZGlyLmMKQEAgLTE0OTgsNyArMTQ5OCw3IEBACiAJZGVudCA9IGdmczJfZGlyZW50X3NlYXJjaChkaXIsIG5hbWUsIGdmczJfZGlyZW50X2ZpbmQsICZiaCk7CiAJaWYgKGRlbnQpIHsKIAkJaWYgKElTX0VSUihkZW50KSkKLQkJCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoZGVudCkpOworCQkJcmV0dXJuIEVSUl9DQVNUKGRlbnQpOwogCQlpbm9kZSA9IGdmczJfaW5vZGVfbG9va3VwKGRpci0+aV9zYiwgCiAJCQkJYmUxNl90b19jcHUoZGVudC0+ZGVfdHlwZSksCiAJCQkJYmU2NF90b19jcHUoZGVudC0+ZGVfaW51bS5ub19hZGRyKSwKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZ2xvY2suYyBiL2ZzL2dmczIvZ2xvY2suYwppbmRleCA4MGUwOWM1Li43MTc1YTRkIDEwMDY0NAotLS0gYS9mcy9nZnMyL2dsb2NrLmMKKysrIGIvZnMvZ2ZzMi9nbG9jay5jCkBAIC0zMzQsNyArMzM0LDcgQEAKIAlnbC0+Z2xfc3RhdGUgPSBMTV9TVF9VTkxPQ0tFRDsKIAlnbC0+Z2xfZGVtb3RlX3N0YXRlID0gTE1fU1RfRVhDTFVTSVZFOwogCWdsLT5nbF9oYXNoID0gaGFzaDsKLQlnbC0+Z2xfb3duZXJfcGlkID0gMDsKKwlnbC0+Z2xfb3duZXJfcGlkID0gTlVMTDsKIAlnbC0+Z2xfaXAgPSAwOwogCWdsLT5nbF9vcHMgPSBnbG9wczsKIAlnbC0+Z2xfcmVxX2doID0gTlVMTDsKQEAgLTM5OSw3ICszOTksNyBAQAogCUlOSVRfTElTVF9IRUFEKCZnaC0+Z2hfbGlzdCk7CiAJZ2gtPmdoX2dsID0gZ2w7CiAJZ2gtPmdoX2lwID0gKHVuc2lnbmVkIGxvbmcpX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOwotCWdoLT5naF9vd25lcl9waWQgPSBjdXJyZW50LT5waWQ7CisJZ2gtPmdoX293bmVyX3BpZCA9IGdldF9waWQodGFza19waWQoY3VycmVudCkpOwogCWdoLT5naF9zdGF0ZSA9IHN0YXRlOwogCWdoLT5naF9mbGFncyA9IGZsYWdzOwogCWdoLT5naF9lcnJvciA9IDA7CkBAIC00MzMsNiArNDMzLDcgQEAKIAogdm9pZCBnZnMyX2hvbGRlcl91bmluaXQoc3RydWN0IGdmczJfaG9sZGVyICpnaCkKIHsKKwlwdXRfcGlkKGdoLT5naF9vd25lcl9waWQpOwogCWdmczJfZ2xvY2tfcHV0KGdoLT5naF9nbCk7CiAJZ2gtPmdoX2dsID0gTlVMTDsKIAlnaC0+Z2hfaXAgPSAwOwpAQCAtNjMxLDcgKzYzMiw3IEBACiAJCXdhaXRfb25faG9sZGVyKCZnaCk7CiAJCWdmczJfaG9sZGVyX3VuaW5pdCgmZ2gpOwogCX0gZWxzZSB7Ci0JCWdsLT5nbF9vd25lcl9waWQgPSBjdXJyZW50LT5waWQ7CisJCWdsLT5nbF9vd25lcl9waWQgPSBnZXRfcGlkKHRhc2tfcGlkKGN1cnJlbnQpKTsKIAkJZ2wtPmdsX2lwID0gKHVuc2lnbmVkIGxvbmcpX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOwogCQlzcGluX3VubG9jaygmZ2wtPmdsX3NwaW4pOwogCX0KQEAgLTY1Miw3ICs2NTMsNyBAQAogCWlmICh0ZXN0X2FuZF9zZXRfYml0KEdMRl9MT0NLLCAmZ2wtPmdsX2ZsYWdzKSkgewogCQlhY3F1aXJlZCA9IDA7CiAJfSBlbHNlIHsKLQkJZ2wtPmdsX293bmVyX3BpZCA9IGN1cnJlbnQtPnBpZDsKKwkJZ2wtPmdsX293bmVyX3BpZCA9IGdldF9waWQodGFza19waWQoY3VycmVudCkpOwogCQlnbC0+Z2xfaXAgPSAodW5zaWduZWQgbG9uZylfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7CiAJfQogCXNwaW5fdW5sb2NrKCZnbC0+Z2xfc3Bpbik7CkBAIC02NjgsMTIgKzY2OSwxNyBAQAogCiBzdGF0aWMgdm9pZCBnZnMyX2dsbXV0ZXhfdW5sb2NrKHN0cnVjdCBnZnMyX2dsb2NrICpnbCkKIHsKKwlzdHJ1Y3QgcGlkICpwaWQ7CisKIAlzcGluX2xvY2soJmdsLT5nbF9zcGluKTsKIAljbGVhcl9iaXQoR0xGX0xPQ0ssICZnbC0+Z2xfZmxhZ3MpOwotCWdsLT5nbF9vd25lcl9waWQgPSAwOworCXBpZCA9IGdsLT5nbF9vd25lcl9waWQ7CisJZ2wtPmdsX293bmVyX3BpZCA9IE5VTEw7CiAJZ2wtPmdsX2lwID0gMDsKIAlydW5fcXVldWUoZ2wpOwogCXNwaW5fdW5sb2NrKCZnbC0+Z2xfc3Bpbik7CisKKwlwdXRfcGlkKHBpZCk7CiB9CiAKIC8qKgpAQCAtMTA0NSw3ICsxMDUxLDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKgotZmluZF9ob2xkZXJfYnlfb3duZXIoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgcGlkX3QgcGlkKQorZmluZF9ob2xkZXJfYnlfb3duZXIoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgc3RydWN0IHBpZCAqcGlkKQogewogCXN0cnVjdCBnZnMyX2hvbGRlciAqZ2g7CiAKQEAgLTEwODIsNyArMTA4OCw3IEBACiAJc3RydWN0IGdmczJfZ2xvY2sgKmdsID0gZ2gtPmdoX2dsOwogCXN0cnVjdCBnZnMyX2hvbGRlciAqZXhpc3Rpbmc7CiAKLQlCVUdfT04oIWdoLT5naF9vd25lcl9waWQpOworCUJVR19PTihnaC0+Z2hfb3duZXJfcGlkID09IE5VTEwpOwogCWlmICh0ZXN0X2FuZF9zZXRfYml0KEhJRl9XQUlULCAmZ2gtPmdoX2lmbGFncykpCiAJCUJVRygpOwogCkBAIC0xMDkyLDEyICsxMDk4LDE0IEBACiAJCWlmIChleGlzdGluZykgewogCQkJcHJpbnRfc3ltYm9sKEtFUk5fV0FSTklORyAib3JpZ2luYWw6ICVzXG4iLCAKIAkJCQkgICAgIGV4aXN0aW5nLT5naF9pcCk7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJwaWQgOiAlZFxuIiwgZXhpc3RpbmctPmdoX293bmVyX3BpZCk7CisJCQlwcmludGsoS0VSTl9JTkZPICJwaWQgOiAlZFxuIiwKKwkJCQkJcGlkX25yKGV4aXN0aW5nLT5naF9vd25lcl9waWQpKTsKIAkJCXByaW50ayhLRVJOX0lORk8gImxvY2sgdHlwZSA6ICVkIGxvY2sgc3RhdGUgOiAlZFxuIiwKIAkJCSAgICAgICBleGlzdGluZy0+Z2hfZ2wtPmdsX25hbWUubG5fdHlwZSwgCiAJCQkgICAgICAgZXhpc3RpbmctPmdoX2dsLT5nbF9zdGF0ZSk7CiAJCQlwcmludF9zeW1ib2woS0VSTl9XQVJOSU5HICJuZXc6ICVzXG4iLCBnaC0+Z2hfaXApOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAicGlkIDogJWRcbiIsIGdoLT5naF9vd25lcl9waWQpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAicGlkIDogJWRcbiIsCisJCQkJCXBpZF9ucihnaC0+Z2hfb3duZXJfcGlkKSk7CiAJCQlwcmludGsoS0VSTl9JTkZPICJsb2NrIHR5cGUgOiAlZCBsb2NrIHN0YXRlIDogJWRcbiIsCiAJCQkgICAgICAgZ2wtPmdsX25hbWUubG5fdHlwZSwgZ2wtPmdsX3N0YXRlKTsKIAkJCUJVRygpOwpAQCAtMTc5OCw4ICsxODA2LDkgQEAKIAogCXByaW50X2RiZyhnaSwgIiAgJXNcbiIsIHN0cik7CiAJaWYgKGdoLT5naF9vd25lcl9waWQpIHsKLQkJcHJpbnRfZGJnKGdpLCAiICAgIG93bmVyID0gJWxkICIsIChsb25nKWdoLT5naF9vd25lcl9waWQpOwotCQlnaF9vd25lciA9IGZpbmRfdGFza19ieV9waWQoZ2gtPmdoX293bmVyX3BpZCk7CisJCXByaW50X2RiZyhnaSwgIiAgICBvd25lciA9ICVsZCAiLAorCQkJCShsb25nKXBpZF9ucihnaC0+Z2hfb3duZXJfcGlkKSk7CisJCWdoX293bmVyID0gcGlkX3Rhc2soZ2gtPmdoX293bmVyX3BpZCwgUElEVFlQRV9QSUQpOwogCQlpZiAoZ2hfb3duZXIpCiAJCQlwcmludF9kYmcoZ2ksICIoJXMpXG4iLCBnaF9vd25lci0+Y29tbSk7CiAJCWVsc2UKQEAgLTE4NzcsMTMgKzE4ODYsMTMgQEAKIAlwcmludF9kYmcoZ2ksICIgIGdsX3JlZiA9ICVkXG4iLCBhdG9taWNfcmVhZCgmZ2wtPmdsX3JlZikpOwogCXByaW50X2RiZyhnaSwgIiAgZ2xfc3RhdGUgPSAldVxuIiwgZ2wtPmdsX3N0YXRlKTsKIAlpZiAoZ2wtPmdsX293bmVyX3BpZCkgewotCQlnbF9vd25lciA9IGZpbmRfdGFza19ieV9waWQoZ2wtPmdsX293bmVyX3BpZCk7CisJCWdsX293bmVyID0gcGlkX3Rhc2soZ2wtPmdsX293bmVyX3BpZCwgUElEVFlQRV9QSUQpOwogCQlpZiAoZ2xfb3duZXIpCiAJCQlwcmludF9kYmcoZ2ksICIgIGdsX293bmVyID0gcGlkICVkICglcylcbiIsCi0JCQkJICBnbC0+Z2xfb3duZXJfcGlkLCBnbF9vd25lci0+Y29tbSk7CisJCQkJICBwaWRfbnIoZ2wtPmdsX293bmVyX3BpZCksIGdsX293bmVyLT5jb21tKTsKIAkJZWxzZQogCQkJcHJpbnRfZGJnKGdpLCAiICBnbF9vd25lciA9ICVkIChlbmRlZClcbiIsCi0JCQkJICBnbC0+Z2xfb3duZXJfcGlkKTsKKwkJCQkgIHBpZF9ucihnbC0+Z2xfb3duZXJfcGlkKSk7CiAJfSBlbHNlCiAJCXByaW50X2RiZyhnaSwgIiAgZ2xfb3duZXIgPSAtMVxuIik7CiAJcHJpbnRfZGJnKGdpLCAiICBnbF9pcCA9ICVsdVxuIiwgZ2wtPmdsX2lwKTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZ2xvY2suaCBiL2ZzL2dmczIvZ2xvY2suaAppbmRleCBiMTZmNjA0Li4yZjljNmQxIDEwMDY0NAotLS0gYS9mcy9nZnMyL2dsb2NrLmgKKysrIGIvZnMvZ2ZzMi9nbG9jay5oCkBAIC0zNiwxMSArMzYsMTMgQEAKIHsKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKmdoOwogCWludCBsb2NrZWQgPSAwOworCXN0cnVjdCBwaWQgKnBpZDsKIAogCS8qIExvb2sgaW4gZ2xvY2sncyBsaXN0IG9mIGhvbGRlcnMgZm9yIG9uZSB3aXRoIGN1cnJlbnQgdGFzayBhcyBvd25lciAqLwogCXNwaW5fbG9jaygmZ2wtPmdsX3NwaW4pOworCXBpZCA9IHRhc2tfcGlkKGN1cnJlbnQpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZ2gsICZnbC0+Z2xfaG9sZGVycywgZ2hfbGlzdCkgewotCQlpZiAoZ2gtPmdoX293bmVyX3BpZCA9PSBjdXJyZW50LT5waWQpIHsKKwkJaWYgKGdoLT5naF9vd25lcl9waWQgPT0gcGlkKSB7CiAJCQlsb2NrZWQgPSAxOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL2dmczIvaW5jb3JlLmggYi9mcy9nZnMyL2luY29yZS5oCmluZGV4IDUxM2FhZjAuLjUyNWRjYWUgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvaW5jb3JlLmgKKysrIGIvZnMvZ2ZzMi9pbmNvcmUuaApAQCAtMTUxLDcgKzE1MSw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBnaF9saXN0OwogCiAJc3RydWN0IGdmczJfZ2xvY2sgKmdoX2dsOwotCXBpZF90IGdoX293bmVyX3BpZDsKKwlzdHJ1Y3QgcGlkICpnaF9vd25lcl9waWQ7CiAJdW5zaWduZWQgaW50IGdoX3N0YXRlOwogCXVuc2lnbmVkIGdoX2ZsYWdzOwogCkBAIC0xODIsNyArMTgyLDcgQEAKIAl1bnNpZ25lZCBpbnQgZ2xfaGFzaDsKIAl1bnNpZ25lZCBpbnQgZ2xfZGVtb3RlX3N0YXRlOyAvKiBzdGF0ZSByZXF1ZXN0ZWQgYnkgcmVtb3RlIG5vZGUgKi8KIAl1bnNpZ25lZCBsb25nIGdsX2RlbW90ZV90aW1lOyAvKiB0aW1lIG9mIGZpcnN0IGRlbW90ZSByZXF1ZXN0ICovCi0JcGlkX3QgZ2xfb3duZXJfcGlkOworCXN0cnVjdCBwaWQgKmdsX293bmVyX3BpZDsKIAl1bnNpZ25lZCBsb25nIGdsX2lwOwogCXN0cnVjdCBsaXN0X2hlYWQgZ2xfaG9sZGVyczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGdsX3dhaXRlcnMxOwkvKiBISUZfTVVURVggKi8KZGlmZiAtLWdpdCBhL2ZzL2dmczIvaW5vZGUuYyBiL2ZzL2dmczIvaW5vZGUuYwppbmRleCA3MjhkMzE2OS4uMzc3MjVhZCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9pbm9kZS5jCisrKyBiL2ZzL2dmczIvaW5vZGUuYwpAQCAtMjQwLDcgKzI0MCw3IEBACiAJaXAtPmlfZ2wtPmdsX29iamVjdCA9IE5VTEw7CiAJZ2ZzMl9nbG9ja19wdXQoaXAtPmlfZ2wpOwogZmFpbDoKLQlpcHV0KGlub2RlKTsKKwlpZ2V0X2ZhaWxlZChpbm9kZSk7CiAJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOwogfQogCmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19leHBvcnQuYyBiL2ZzL2dmczIvb3BzX2V4cG9ydC5jCmluZGV4IGI5ZGE2MjMuLjMzNGM3ZjggMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvb3BzX2V4cG9ydC5jCisrKyBiL2ZzL2dmczIvb3BzX2V4cG9ydC5jCkBAIC0xNDMsNyArMTQzLDcgQEAKIAkgKiBoYXZlIHRvIHJldHVybiB0aGF0IGFzIGEobiBpbnZhbGlkKSBwb2ludGVyIHRvIGRlbnRyeS4KIAkgKi8KIAlpZiAoSVNfRVJSKGlub2RlKSkKLQkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihpbm9kZSkpOworCQlyZXR1cm4gRVJSX0NBU1QoaW5vZGUpOwogCiAJZGVudHJ5ID0gZF9hbGxvY19hbm9uKGlub2RlKTsKIAlpZiAoIWRlbnRyeSkgewpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfaW5vZGUuYyBiL2ZzL2dmczIvb3BzX2lub2RlLmMKaW5kZXggOWY3MTM3Mi4uZTg3NDEyOSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfaW5vZGUuYworKysgYi9mcy9nZnMyL29wc19pbm9kZS5jCkBAIC0xMTEsNyArMTExLDcgQEAKIAogCWlub2RlID0gZ2ZzMl9sb29rdXBpKGRpciwgJmRlbnRyeS0+ZF9uYW1lLCAwLCBuZCk7CiAJaWYgKGlub2RlICYmIElTX0VSUihpbm9kZSkpCi0JCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoaW5vZGUpKTsKKwkJcmV0dXJuIEVSUl9DQVNUKGlub2RlKTsKIAogCWlmIChpbm9kZSkgewogCQlzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wgPSBHRlMyX0koaW5vZGUpLT5pX2dsOwpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9idHJlZS5jIGIvZnMvaGZzcGx1cy9idHJlZS5jCmluZGV4IDA1MGQyOWMuLmJiNTQzMzYgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvYnRyZWUuYworKysgYi9mcy9oZnNwbHVzL2J0cmVlLmMKQEAgLTIyLDYgKzIyLDcgQEAKIAlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOwogCXN0cnVjdCBoZnNfYnRyZWVfaGVhZGVyX3JlYyAqaGVhZDsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBwYWdlICpwYWdlOwogCXVuc2lnbmVkIGludCBzaXplOwogCkBAIC0zMyw5ICszNCwxMCBAQAogCXNwaW5fbG9ja19pbml0KCZ0cmVlLT5oYXNoX2xvY2spOwogCXRyZWUtPnNiID0gc2I7CiAJdHJlZS0+Y25pZCA9IGlkOwotCXRyZWUtPmlub2RlID0gaWdldChzYiwgaWQpOwotCWlmICghdHJlZS0+aW5vZGUpCisJaW5vZGUgPSBoZnNwbHVzX2lnZXQoc2IsIGlkKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKIAkJZ290byBmcmVlX3RyZWU7CisJdHJlZS0+aW5vZGUgPSBpbm9kZTsKIAogCW1hcHBpbmcgPSB0cmVlLT5pbm9kZS0+aV9tYXBwaW5nOwogCXBhZ2UgPSByZWFkX21hcHBpbmdfcGFnZShtYXBwaW5nLCAwLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvZGlyLmMgYi9mcy9oZnNwbHVzL2Rpci5jCmluZGV4IDE5NTVlZTYuLjI5NjgzNjQgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvZGlyLmMKKysrIGIvZnMvaGZzcGx1cy9kaXIuYwpAQCAtOTcsOSArOTcsOSBAQAogCQlnb3RvIGZhaWw7CiAJfQogCWhmc19maW5kX2V4aXQoJmZkKTsKLQlpbm9kZSA9IGlnZXQoZGlyLT5pX3NiLCBjbmlkKTsKLQlpZiAoIWlub2RlKQotCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKKwlpbm9kZSA9IGhmc3BsdXNfaWdldChkaXItPmlfc2IsIGNuaWQpOworCWlmIChJU19FUlIoaW5vZGUpKQorCQlyZXR1cm4gRVJSX0NBU1QoaW5vZGUpOwogCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQogCQlIRlNQTFVTX0koaW5vZGUpLmRldiA9IGxpbmtpZDsKIG91dDoKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvaGZzcGx1c19mcy5oIGIvZnMvaGZzcGx1cy9oZnNwbHVzX2ZzLmgKaW5kZXggZDlmNWVkYS4uZDcyZDBhOCAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9oZnNwbHVzX2ZzLmgKKysrIGIvZnMvaGZzcGx1cy9oZnNwbHVzX2ZzLmgKQEAgLTM0NSw2ICszNDUsOSBAQAogdm9pZCBoZnNwbHVzX2ZpbGxfZGVmYXVsdHMoc3RydWN0IGhmc3BsdXNfc2JfaW5mbyAqKTsKIGludCBoZnNwbHVzX3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKiwgc3RydWN0IHZmc21vdW50ICopOwogCisvKiBzdXBlci5jICovCitzdHJ1Y3QgaW5vZGUgKmhmc3BsdXNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZyk7CisKIC8qIHRhYmxlcy5jICovCiBleHRlcm4gdTE2IGhmc3BsdXNfY2FzZV9mb2xkX3RhYmxlW107CiBleHRlcm4gdTE2IGhmc3BsdXNfZGVjb21wb3NlX3RhYmxlW107CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL3N1cGVyLmMgYi9mcy9oZnNwbHVzL3N1cGVyLmMKaW5kZXggZWNmNzBkYS4uYjBmOWFkMyAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9zdXBlci5jCisrKyBiL2ZzL2hmc3BsdXMvc3VwZXIuYwpAQCAtMjAsMTEgKzIwLDE4IEBACiAKICNpbmNsdWRlICJoZnNwbHVzX2ZzLmgiCiAKLXN0YXRpYyB2b2lkIGhmc3BsdXNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQorc3RydWN0IGlub2RlICpoZnNwbHVzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBpbm8pCiB7CiAJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CiAJc3RydWN0IGhmc3BsdXNfdmggKnZoZHI7Ci0JaW50IGVycjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWxvbmcgZXJyID0gLUVJTzsKKworCWlub2RlID0gaWdldF9sb2NrZWQoc2IsIGlubyk7CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykpCisJCXJldHVybiBpbm9kZTsKIAogCUlOSVRfTElTVF9IRUFEKCZIRlNQTFVTX0koaW5vZGUpLm9wZW5fZGlyX2xpc3QpOwogCWluaXRfTVVURVgoJkhGU1BMVVNfSShpbm9kZSkuZXh0ZW50c19sb2NrKTsKQEAgLTQxLDcgKzQ4LDcgQEAKIAkJaGZzX2ZpbmRfZXhpdCgmZmQpOwogCQlpZiAoZXJyKQogCQkJZ290byBiYWRfaW5vZGU7Ci0JCXJldHVybjsKKwkJZ290byBkb25lOwogCX0KIAl2aGRyID0gSEZTUExVU19TQihpbm9kZS0+aV9zYikuc192aGRyOwogCXN3aXRjaChpbm9kZS0+aV9pbm8pIHsKQEAgLTcwLDEwICs3NywxMyBAQAogCQlnb3RvIGJhZF9pbm9kZTsKIAl9CiAKLQlyZXR1cm47Citkb25lOgorCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCXJldHVybiBpbm9kZTsKIAotIGJhZF9pbm9kZToKLQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CitiYWRfaW5vZGU6CisJaWdldF9mYWlsZWQoaW5vZGUpOworCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiAKIHN0YXRpYyBpbnQgaGZzcGx1c193cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdW51c2VkKQpAQCAtMjYyLDcgKzI3Miw2IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgaGZzcGx1c19zb3BzID0gewogCS5hbGxvY19pbm9kZQk9IGhmc3BsdXNfYWxsb2NfaW5vZGUsCiAJLmRlc3Ryb3lfaW5vZGUJPSBoZnNwbHVzX2Rlc3Ryb3lfaW5vZGUsCi0JLnJlYWRfaW5vZGUJPSBoZnNwbHVzX3JlYWRfaW5vZGUsCiAJLndyaXRlX2lub2RlCT0gaGZzcGx1c193cml0ZV9pbm9kZSwKIAkuY2xlYXJfaW5vZGUJPSBoZnNwbHVzX2NsZWFyX2lub2RlLAogCS5wdXRfc3VwZXIJPSBoZnNwbHVzX3B1dF9zdXBlciwKQEAgLTI3OCw3ICsyODcsNyBAQAogCXN0cnVjdCBoZnNwbHVzX3NiX2luZm8gKnNiaTsKIAloZnNwbHVzX2NhdF9lbnRyeSBlbnRyeTsKIAlzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSBmZDsKLQlzdHJ1Y3QgaW5vZGUgKnJvb3Q7CisJc3RydWN0IGlub2RlICpyb290LCAqaW5vZGU7CiAJc3RydWN0IHFzdHIgc3RyOwogCXN0cnVjdCBubHNfdGFibGUgKm5scyA9IE5VTEw7CiAJaW50IGVyciA9IC1FSU5WQUw7CkBAIC0zNjYsMTggKzM3NSwyNSBAQAogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0JSEZTUExVU19TQihzYikuYWxsb2NfZmlsZSA9IGlnZXQoc2IsIEhGU1BMVVNfQUxMT0NfQ05JRCk7Ci0JaWYgKCFIRlNQTFVTX1NCKHNiKS5hbGxvY19maWxlKSB7CisJaW5vZGUgPSBoZnNwbHVzX2lnZXQoc2IsIEhGU1BMVVNfQUxMT0NfQ05JRCk7CisJaWYgKElTX0VSUihpbm9kZSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJoZnM6IGZhaWxlZCB0byBsb2FkIGFsbG9jYXRpb24gZmlsZVxuIik7CisJCWVyciA9IFBUUl9FUlIoaW5vZGUpOwogCQlnb3RvIGNsZWFudXA7CiAJfQorCUhGU1BMVVNfU0Ioc2IpLmFsbG9jX2ZpbGUgPSBpbm9kZTsKIAogCS8qIExvYWQgdGhlIHJvb3QgZGlyZWN0b3J5ICovCi0Jcm9vdCA9IGlnZXQoc2IsIEhGU1BMVVNfUk9PVF9DTklEKTsKKwlyb290ID0gaGZzcGx1c19pZ2V0KHNiLCBIRlNQTFVTX1JPT1RfQ05JRCk7CisJaWYgKElTX0VSUihyb290KSkgeworCQlwcmludGsoS0VSTl9FUlIgImhmczogZmFpbGVkIHRvIGxvYWQgcm9vdCBkaXJlY3RvcnlcbiIpOworCQllcnIgPSBQVFJfRVJSKHJvb3QpOworCQlnb3RvIGNsZWFudXA7CisJfQogCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CiAJaWYgKCFzYi0+c19yb290KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaGZzOiBmYWlsZWQgdG8gbG9hZCByb290IGRpcmVjdG9yeVxuIik7CiAJCWlwdXQocm9vdCk7CisJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAJc2ItPnNfcm9vdC0+ZF9vcCA9ICZoZnNwbHVzX2RlbnRyeV9vcGVyYXRpb25zOwpAQCAtMzkwLDkgKzQwNiwxMiBAQAogCQloZnNfZmluZF9leGl0KCZmZCk7CiAJCWlmIChlbnRyeS50eXBlICE9IGNwdV90b19iZTE2KEhGU1BMVVNfRk9MREVSKSkKIAkJCWdvdG8gY2xlYW51cDsKLQkJSEZTUExVU19TQihzYikuaGlkZGVuX2RpciA9IGlnZXQoc2IsIGJlMzJfdG9fY3B1KGVudHJ5LmZvbGRlci5pZCkpOwotCQlpZiAoIUhGU1BMVVNfU0Ioc2IpLmhpZGRlbl9kaXIpCisJCWlub2RlID0gaGZzcGx1c19pZ2V0KHNiLCBiZTMyX3RvX2NwdShlbnRyeS5mb2xkZXIuaWQpKTsKKwkJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJCWVyciA9IFBUUl9FUlIoaW5vZGUpOwogCQkJZ290byBjbGVhbnVwOworCQl9CisJCUhGU1BMVVNfU0Ioc2IpLmhpZGRlbl9kaXIgPSBpbm9kZTsKIAl9IGVsc2UKIAkJaGZzX2ZpbmRfZXhpdCgmZmQpOwogCmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL3VuaWNvZGUuYyBiL2ZzL2hmc3BsdXMvdW5pY29kZS5jCmluZGV4IDllMTBmOTQuLjYyOGNjZjYgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvdW5pY29kZS5jCisrKyBiL2ZzL2hmc3BsdXMvdW5pY29kZS5jCkBAIC0zMjUsNyArMzI1LDcgQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGVudHJ5LT5kX3NiOwogCWNvbnN0IGNoYXIgKmFzdHI7CiAJY29uc3QgdTE2ICpkc3RyOwotCWludCBjYXNlZm9sZCwgZGVjb21wb3NlLCBzaXplLCBkc2l6ZSwgbGVuOworCWludCBjYXNlZm9sZCwgZGVjb21wb3NlLCBzaXplLCBsZW47CiAJdW5zaWduZWQgbG9uZyBoYXNoOwogCXdjaGFyX3QgYzsKIAl1MTYgYzI7CkBAIC0zMzYsNiArMzM2LDcgQEAKIAlhc3RyID0gc3RyLT5uYW1lOwogCWxlbiA9IHN0ci0+bGVuOwogCXdoaWxlIChsZW4gPiAwKSB7CisJCWludCB1bmluaXRpYWxpemVkX3Zhcihkc2l6ZSk7CiAJCXNpemUgPSBhc2MydW5pY2hhcihzYiwgYXN0ciwgbGVuLCAmYyk7CiAJCWFzdHIgKz0gc2l6ZTsKIAkJbGVuIC09IHNpemU7CmRpZmYgLS1naXQgYS9mcy9ob3N0ZnMvaG9zdGZzX2tlcm4uYyBiL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jCmluZGV4IDg5NjZiMDUuLjUyMjIzNDUgMTAwNjQ0Ci0tLSBhL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jCisrKyBiL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jCkBAIC0xMSw2ICsxMSw4IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdGZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgImhvc3Rmcy5oIgogI2luY2x1ZGUgImluaXQuaCIKICNpbmNsdWRlICJrZXJuLmgiCkBAIC0yMDIsNyArMjA0LDcgQEAKIAlyZXR1cm4gRVJSX1BUUihuKTsKIH0KIAotc3RhdGljIGludCByZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vKQorc3RhdGljIGludCBob3N0ZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlubykKIHsKIAljaGFyICpuYW1lOwogCWludCBlcnIgPSAwOwpAQCAtMjMzLDYgKzIzNSwyNSBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmhvc3Rmc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlsb25nIHJldDsKKworCWlub2RlID0gaWdldF9sb2NrZWQoc2IsIDApOworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWlmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSB7CisJCXJldCA9IGhvc3Rmc19yZWFkX2lub2RlKGlub2RlKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWlnZXRfZmFpbGVkKGlub2RlKTsKKwkJCXJldHVybiBFUlJfUFRSKHJldCk7CisJCX0KKwkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CisJfQorCXJldHVybiBpbm9kZTsKK30KKwogaW50IGhvc3Rmc19zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqc2YpCiB7CiAJLyoKQEAgLTMwMyw5ICszMjQsMTYgQEAKIAlrZnJlZShIT1NURlNfSShpbm9kZSkpOwogfQogCi1zdGF0aWMgdm9pZCBob3N0ZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQorc3RhdGljIGludCBob3N0ZnNfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgdmZzbW91bnQgKnZmcykKIHsKLQlyZWFkX2lub2RlKGlub2RlKTsKKwlzdHJ1Y3QgaW5vZGUgKnJvb3QgPSB2ZnMtPm1udF9zYi0+c19yb290LT5kX2lub2RlOworCWNvbnN0IGNoYXIgKnJvb3RfcGF0aCA9IEhPU1RGU19JKHJvb3QpLT5ob3N0X2ZpbGVuYW1lOworCXNpemVfdCBvZmZzZXQgPSBzdHJsZW4ocm9vdF9pbm8pICsgMTsKKworCWlmIChzdHJsZW4ocm9vdF9wYXRoKSA+IG9mZnNldCkKKwkJc2VxX3ByaW50ZihzZXEsICIsJXMiLCByb290X3BhdGggKyBvZmZzZXQpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBob3N0ZnNfc2JvcHMgPSB7CkBAIC0zMTMsOCArMzQxLDggQEAKIAkuZHJvcF9pbm9kZQk9IGdlbmVyaWNfZGVsZXRlX2lub2RlLAogCS5kZWxldGVfaW5vZGUgICA9IGhvc3Rmc19kZWxldGVfaW5vZGUsCiAJLmRlc3Ryb3lfaW5vZGUJPSBob3N0ZnNfZGVzdHJveV9pbm9kZSwKLQkucmVhZF9pbm9kZQk9IGhvc3Rmc19yZWFkX2lub2RlLAogCS5zdGF0ZnMJCT0gaG9zdGZzX3N0YXRmcywKKwkuc2hvd19vcHRpb25zCT0gaG9zdGZzX3Nob3dfb3B0aW9ucywKIH07CiAKIGludCBob3N0ZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKQEAgLTU3MSwxMCArNTk5LDExIEBACiAJY2hhciAqbmFtZTsKIAlpbnQgZXJyb3IsIGZkOwogCi0JZXJyb3IgPSAtRU5PTUVNOwotCWlub2RlID0gaWdldChkaXItPmlfc2IsIDApOwotCWlmIChpbm9kZSA9PSBOVUxMKQorCWlub2RlID0gaG9zdGZzX2lnZXQoZGlyLT5pX3NiKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkgeworCQllcnJvciA9IFBUUl9FUlIoaW5vZGUpOwogCQlnb3RvIG91dDsKKwl9CiAKIAllcnJvciA9IGluaXRfaW5vZGUoaW5vZGUsIGRlbnRyeSk7CiAJaWYgKGVycm9yKQpAQCAtNjE1LDEwICs2NDQsMTEgQEAKIAljaGFyICpuYW1lOwogCWludCBlcnI7CiAKLQllcnIgPSAtRU5PTUVNOwotCWlub2RlID0gaWdldChpbm8tPmlfc2IsIDApOwotCWlmIChpbm9kZSA9PSBOVUxMKQorCWlub2RlID0gaG9zdGZzX2lnZXQoaW5vLT5pX3NiKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkgeworCQllcnIgPSBQVFJfRVJSKGlub2RlKTsKIAkJZ290byBvdXQ7CisJfQogCiAJZXJyID0gaW5pdF9pbm9kZShpbm9kZSwgZGVudHJ5KTsKIAlpZiAoZXJyKQpAQCAtNzM2LDExICs3NjYsMTMgQEAKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCWNoYXIgKm5hbWU7Ci0JaW50IGVyciA9IC1FTk9NRU07CisJaW50IGVycjsKIAotCWlub2RlID0gaWdldChkaXItPmlfc2IsIDApOwotCWlmIChpbm9kZSA9PSBOVUxMKQorCWlub2RlID0gaG9zdGZzX2lnZXQoZGlyLT5pX3NiKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkgeworCQllcnIgPSBQVFJfRVJSKGlub2RlKTsKIAkJZ290byBvdXQ7CisJfQogCiAJZXJyID0gaW5pdF9pbm9kZShpbm9kZSwgZGVudHJ5KTsKIAlpZiAoZXJyKQpAQCAtOTUyLDkgKzk4NCwxMSBAQAogCiAJc3ByaW50Zihob3N0X3Jvb3RfcGF0aCwgIiVzLyVzIiwgcm9vdF9pbm8sIHJlcV9yb290KTsKIAotCXJvb3RfaW5vZGUgPSBpZ2V0KHNiLCAwKTsKLQlpZiAocm9vdF9pbm9kZSA9PSBOVUxMKQorCXJvb3RfaW5vZGUgPSBob3N0ZnNfaWdldChzYik7CisJaWYgKElTX0VSUihyb290X2lub2RlKSkgeworCQllcnIgPSBQVFJfRVJSKHJvb3RfaW5vZGUpOwogCQlnb3RvIG91dF9mcmVlOworCX0KIAogCWVyciA9IGluaXRfaW5vZGUocm9vdF9pbm9kZSwgTlVMTCk7CiAJaWYgKGVycikKQEAgLTk3Miw3ICsxMDA2LDcgQEAKIAlpZiAoc2ItPnNfcm9vdCA9PSBOVUxMKQogCQlnb3RvIG91dF9wdXQ7CiAKLQllcnIgPSByZWFkX2lub2RlKHJvb3RfaW5vZGUpOworCWVyciA9IGhvc3Rmc19yZWFkX2lub2RlKHJvb3RfaW5vZGUpOwogCWlmIChlcnIpIHsKIAkJLyogTm8gaXB1dCBpbiB0aGlzIGNhc2UgYmVjYXVzZSB0aGUgZHB1dCBkb2VzIHRoYXQgZm9yIHVzICovCiAJCWRwdXQoc2ItPnNfcm9vdCk7CmRpZmYgLS1naXQgYS9mcy9ocGZzL3N1cGVyLmMgYi9mcy9ocGZzL3N1cGVyLmMKaW5kZXggMDA5NzFkOS4uZjYzYTY5OSAxMDA2NDQKLS0tIGEvZnMvaHBmcy9zdXBlci5jCisrKyBiL2ZzL2hwZnMvc3VwZXIuYwpAQCAtMzg2LDYgKzM4Niw3IEBACiAJaW50IGxvd2VyY2FzZSwgY29udiwgZWFzLCBjaGssIGVycnMsIGNoa2RzaywgdGltZXNoaWZ0OwogCWludCBvOwogCXN0cnVjdCBocGZzX3NiX2luZm8gKnNiaSA9IGhwZnNfc2Iocyk7CisJY2hhciAqbmV3X29wdHMgPSBrc3RyZHVwKGRhdGEsIEdGUF9LRVJORUwpOwogCQogCSpmbGFncyB8PSBNU19OT0FUSU1FOwogCQpAQCAtMzk4LDE1ICszOTksMTUgQEAKIAlpZiAoIShvID0gcGFyc2Vfb3B0cyhkYXRhLCAmdWlkLCAmZ2lkLCAmdW1hc2ssICZsb3dlcmNhc2UsICZjb252LAogCSAgICAmZWFzLCAmY2hrLCAmZXJycywgJmNoa2RzaywgJnRpbWVzaGlmdCkpKSB7CiAJCXByaW50aygiSFBGUzogYmFkIG1vdW50IG9wdGlvbnMuXG4iKTsKLQkgICAgCXJldHVybiAxOworCQlnb3RvIG91dF9lcnI7CiAJfQogCWlmIChvID09IDIpIHsKIAkJaHBmc19oZWxwKCk7Ci0JCXJldHVybiAxOworCQlnb3RvIG91dF9lcnI7CiAJfQogCWlmICh0aW1lc2hpZnQgIT0gc2JpLT5zYl90aW1lc2hpZnQpIHsKIAkJcHJpbnRrKCJIUEZTOiB0aW1lc2hpZnQgY2FuJ3QgYmUgY2hhbmdlZCB1c2luZyByZW1vdW50LlxuIik7Ci0JCXJldHVybiAxOworCQlnb3RvIG91dF9lcnI7CiAJfQogCiAJdW5tYXJrX2RpcnR5KHMpOwpAQCAtNDE5LDcgKzQyMCwxNCBAQAogCiAJaWYgKCEoKmZsYWdzICYgTVNfUkRPTkxZKSkgbWFya19kaXJ0eShzKTsKIAorCWtmcmVlKHMtPnNfb3B0aW9ucyk7CisJcy0+c19vcHRpb25zID0gbmV3X29wdHM7CisKIAlyZXR1cm4gMDsKKworb3V0X2VycjoKKwlrZnJlZShuZXdfb3B0cyk7CisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIC8qIFN1cGVyIG9wZXJhdGlvbnMgKi8KQEAgLTQzMiw2ICs0NDAsNyBAQAogCS5wdXRfc3VwZXIJPSBocGZzX3B1dF9zdXBlciwKIAkuc3RhdGZzCQk9IGhwZnNfc3RhdGZzLAogCS5yZW1vdW50X2ZzCT0gaHBmc19yZW1vdW50X2ZzLAorCS5zaG93X29wdGlvbnMJPSBnZW5lcmljX3Nob3dfb3B0aW9ucywKIH07CiAKIHN0YXRpYyBpbnQgaHBmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqb3B0aW9ucywgaW50IHNpbGVudCkKQEAgLTQ1NCw2ICs0NjMsOCBAQAogCiAJaW50IG87CiAKKwlzYXZlX21vdW50X29wdGlvbnMocywgb3B0aW9ucyk7CisKIAlzYmkgPSBremFsbG9jKHNpemVvZigqc2JpKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzYmkpCiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZnMvaHBwZnMvaHBwZnNfa2Vybi5jIGIvZnMvaHBwZnMvaHBwZnNfa2Vybi5jCmluZGV4IGFmZmI3NDEuLmExZTFmMGYgMTAwNjQ0Ci0tLSBhL2ZzL2hwcGZzL2hwcGZzX2tlcm4uYworKysgYi9mcy9ocHBmcy9ocHBmc19rZXJuLmMKQEAgLTE1NSw2ICsxNTUsMjAgQEAKIAlpbm8tPmlfYmxvY2tzID0gcHJvY19pbm8tPmlfYmxvY2tzOwogfQogCitzdGF0aWMgc3RydWN0IGlub2RlICpocHBmc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCWlub2RlID0gaWdldF9sb2NrZWQoc2IsIDApOworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWlmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSB7CisJCWhwcGZzX3JlYWRfaW5vZGUoaW5vZGUpOworCQl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKwl9CisJcmV0dXJuIGlub2RlOworfQorCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqaHBwZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqaW5vLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7CkBAIC0xOTAsOSArMjA0LDExIEBACiAJaWYoSVNfRVJSKHByb2NfZGVudHJ5KSkKIAkJcmV0dXJuKHByb2NfZGVudHJ5KTsKIAotCWlub2RlID0gaWdldChpbm8tPmlfc2IsIDApOwotCWlmKGlub2RlID09IE5VTEwpCisJaW5vZGUgPSBocHBmc19pZ2V0KGluby0+aV9zYik7CisJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJZXJyID0gUFRSX0VSUihpbm9kZSk7CiAJCWdvdG8gb3V0X2RwdXQ7CisJfQogCiAJZXJyID0gaW5pdF9pbm9kZShpbm9kZSwgcHJvY19kZW50cnkpOwogCWlmKGVycikKQEAgLTY1Miw3ICs2NjgsNiBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGhwcGZzX3Nib3BzID0gewogCS5hbGxvY19pbm9kZQk9IGhwcGZzX2FsbG9jX2lub2RlLAogCS5kZXN0cm95X2lub2RlCT0gaHBwZnNfZGVzdHJveV9pbm9kZSwKLQkucmVhZF9pbm9kZQk9IGhwcGZzX3JlYWRfaW5vZGUsCiAJLmRlbGV0ZV9pbm9kZQk9IGhwcGZzX2RlbGV0ZV9pbm9kZSwKIAkuc3RhdGZzCQk9IGhwcGZzX3N0YXRmcywKIH07CkBAIC03NDUsOSArNzYwLDExIEBACiAJc2ItPnNfbWFnaWMgPSBIUFBGU19TVVBFUl9NQUdJQzsKIAlzYi0+c19vcCA9ICZocHBmc19zYm9wczsKIAotCXJvb3RfaW5vZGUgPSBpZ2V0KHNiLCAwKTsKLQlpZihyb290X2lub2RlID09IE5VTEwpCisJcm9vdF9pbm9kZSA9IGhwcGZzX2lnZXQoc2IpOworCWlmIChJU19FUlIocm9vdF9pbm9kZSkpIHsKKwkJZXJyID0gUFRSX0VSUihyb290X2lub2RlKTsKIAkJZ290byBvdXQ7CisJfQogCiAJZXJyID0gaW5pdF9pbm9kZShyb290X2lub2RlLCBwcm9jX3NiLT5zX3Jvb3QpOwogCWlmKGVycikKZGlmZiAtLWdpdCBhL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jIGIvZnMvaHVnZXRsYmZzL2lub2RlLmMKaW5kZXggM2IzY2MyOC4uZWVlOTQ4NyAxMDA2NDQKLS0tIGEvZnMvaHVnZXRsYmZzL2lub2RlLmMKKysrIGIvZnMvaHVnZXRsYmZzL2lub2RlLmMKQEAgLTczNCw2ICs3MzQsNyBAQAogCS5kZWxldGVfaW5vZGUJPSBodWdldGxiZnNfZGVsZXRlX2lub2RlLAogCS5kcm9wX2lub2RlCT0gaHVnZXRsYmZzX2Ryb3BfaW5vZGUsCiAJLnB1dF9zdXBlcgk9IGh1Z2V0bGJmc19wdXRfc3VwZXIsCisJLnNob3dfb3B0aW9ucwk9IGdlbmVyaWNfc2hvd19vcHRpb25zLAogfTsKIAogc3RhdGljIGludApAQCAtODE3LDYgKzgxOCw4IEBACiAJc3RydWN0IGh1Z2V0bGJmc19jb25maWcgY29uZmlnOwogCXN0cnVjdCBodWdldGxiZnNfc2JfaW5mbyAqc2JpbmZvOwogCisJc2F2ZV9tb3VudF9vcHRpb25zKHNiLCBkYXRhKTsKKwogCWNvbmZpZy5ucl9ibG9ja3MgPSAtMTsgLyogTm8gbGltaXQgb24gc2l6ZSBieSBkZWZhdWx0ICovCiAJY29uZmlnLm5yX2lub2RlcyA9IC0xOyAvKiBObyBsaW1pdCBvbiBudW1iZXIgb2YgaW5vZGVzIGJ5IGRlZmF1bHQgKi8KIAljb25maWcudWlkID0gY3VycmVudC0+ZnN1aWQ7CmRpZmYgLS1naXQgYS9mcy9pbm9kZS5jIGIvZnMvaW5vZGUuYwppbmRleCAyNzZmZmQ2Li41MzI0NWZmIDEwMDY0NAotLS0gYS9mcy9pbm9kZS5jCisrKyBiL2ZzL2lub2RlLmMKQEAgLTkyOCw4ICs5MjgsNiBAQAogICogQHNldDoJY2FsbGJhY2sgdXNlZCB0byBpbml0aWFsaXplIGEgbmV3IHN0cnVjdCBpbm9kZQogICogQGRhdGE6CW9wYXF1ZSBkYXRhIHBvaW50ZXIgdG8gcGFzcyB0byBAdGVzdCBhbmQgQHNldAogICoKLSAqIFRoaXMgaXMgaWdldCgpIHdpdGhvdXQgdGhlIHJlYWRfaW5vZGUoKSBwb3J0aW9uIG9mIGdldF9uZXdfaW5vZGUoKS4KLSAqCiAgKiBpZ2V0NV9sb2NrZWQoKSB1c2VzIGlmaW5kKCkgdG8gc2VhcmNoIGZvciB0aGUgaW5vZGUgc3BlY2lmaWVkIGJ5IEBoYXNodmFsCiAgKiBhbmQgQGRhdGEgaW4gdGhlIGlub2RlIGNhY2hlIGFuZCBpZiBwcmVzZW50IGl0IGlzIHJldHVybmVkIHdpdGggYW4gaW5jcmVhc2VkCiAgKiByZWZlcmVuY2UgY291bnQuIFRoaXMgaXMgYSBnZW5lcmFsaXplZCB2ZXJzaW9uIG9mIGlnZXRfbG9ja2VkKCkgZm9yIGZpbGUKQEAgLTk2Niw4ICs5NjQsNiBAQAogICogQHNiOgkJc3VwZXIgYmxvY2sgb2YgZmlsZSBzeXN0ZW0KICAqIEBpbm86CWlub2RlIG51bWJlciB0byBnZXQKICAqCi0gKiBUaGlzIGlzIGlnZXQoKSB3aXRob3V0IHRoZSByZWFkX2lub2RlKCkgcG9ydGlvbiBvZiBnZXRfbmV3X2lub2RlX2Zhc3QoKS4KLSAqCiAgKiBpZ2V0X2xvY2tlZCgpIHVzZXMgaWZpbmRfZmFzdCgpIHRvIHNlYXJjaCBmb3IgdGhlIGlub2RlIHNwZWNpZmllZCBieSBAaW5vIGluCiAgKiB0aGUgaW5vZGUgY2FjaGUgYW5kIGlmIHByZXNlbnQgaXQgaXMgcmV0dXJuZWQgd2l0aCBhbiBpbmNyZWFzZWQgcmVmZXJlbmNlCiAgKiBjb3VudC4gVGhpcyBpcyBmb3IgZmlsZSBzeXN0ZW1zIHdoZXJlIHRoZSBpbm9kZSBudW1iZXIgaXMgc3VmZmljaWVudCBmb3IKZGlmZiAtLWdpdCBhL2ZzL2lub3RpZnlfdXNlci5jIGIvZnMvaW5vdGlmeV91c2VyLmMKaW5kZXggYTMzNmM5Ny4uM2FiMDlhNiAxMDA2NDQKLS0tIGEvZnMvaW5vdGlmeV91c2VyLmMKKysrIGIvZnMvaW5vdGlmeV91c2VyLmMKQEAgLTI4Myw3ICsyODMsNyBAQAogCS8qIHdlIGNhbiBzYWZlbHkgcHV0IHRoZSB3YXRjaCBhcyB3ZSBkb24ndCByZWZlcmVuY2UgaXQgd2hpbGUKIAkgKiBnZW5lcmF0aW5nIHRoZSBldmVudAogCSAqLwotCWlmIChtYXNrICYgSU5fSUdOT1JFRCB8fCBtYXNrICYgSU5fT05FU0hPVCkKKwlpZiAobWFzayAmIElOX0lHTk9SRUQgfHwgdy0+bWFzayAmIElOX09ORVNIT1QpCiAJCXB1dF9pbm90aWZ5X3dhdGNoKHcpOyAvKiBmaW5hbCBwdXQgKi8KIAogCS8qIGNvYWxlc2Npbmc6IGRyb3AgdGhpcyBldmVudCBpZiBpdCBpcyBhIGR1cGUgb2YgdGhlIHByZXZpb3VzICovCmRpZmYgLS1naXQgYS9mcy9pb2N0bC5jIGIvZnMvaW9jdGwuYwppbmRleCBjMmE3NzNlLi5mMzJmYmRlIDEwMDY0NAotLS0gYS9mcy9pb2N0bC5jCisrKyBiL2ZzL2lvY3RsLmMKQEAgLTEyLDEyICsxMiwyNCBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KIAotc3RhdGljIGxvbmcgZG9faW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCi0JCXVuc2lnbmVkIGxvbmcgYXJnKQorLyoqCisgKiB2ZnNfaW9jdGwgLSBjYWxsIGZpbGVzeXN0ZW0gc3BlY2lmaWMgaW9jdGwgbWV0aG9kcworICogQGZpbHA6CW9wZW4gZmlsZSB0byBpbnZva2UgaW9jdGwgbWV0aG9kIG9uCisgKiBAY21kOglpb2N0bCBjb21tYW5kIHRvIGV4ZWN1dGUKKyAqIEBhcmc6CWNvbW1hbmQtc3BlY2lmaWMgYXJndW1lbnQgZm9yIGlvY3RsCisgKgorICogSW52b2tlcyBmaWxlc3lzdGVtIHNwZWNpZmljIC0+dW5sb2NrZWRfaW9jdGwsIGlmIG9uZSBleGlzdHM7IG90aGVyd2lzZQorICogaW52b2tlcyBmaWxlc3lzdGVtIHNwZWNpZmljIC0+aW9jdGwgbWV0aG9kLiAgSWYgbmVpdGhlciBtZXRob2QgZXhpc3RzLAorICogcmV0dXJucyAtRU5PVFRZLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZXJyb3IuCisgKi8KK2xvbmcgdmZzX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlpbnQgZXJyb3IgPSAtRU5PVFRZOwogCkBAIC00MCwxMjMgKzUyLDE0OCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAorc3RhdGljIGludCBpb2N0bF9maWJtYXAoc3RydWN0IGZpbGUgKmZpbHAsIGludCBfX3VzZXIgKnApCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmaWxwLT5mX21hcHBpbmc7CisJaW50IHJlcywgYmxvY2s7CisKKwkvKiBkbyB3ZSBzdXBwb3J0IHRoaXMgbWVzcz8gKi8KKwlpZiAoIW1hcHBpbmctPmFfb3BzLT5ibWFwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCisJCXJldHVybiAtRVBFUk07CisJcmVzID0gZ2V0X3VzZXIoYmxvY2ssIHApOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisJbG9ja19rZXJuZWwoKTsKKwlyZXMgPSBtYXBwaW5nLT5hX29wcy0+Ym1hcChtYXBwaW5nLCBibG9jayk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBwdXRfdXNlcihyZXMsIHApOworfQorCiBzdGF0aWMgaW50IGZpbGVfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCXVuc2lnbmVkIGxvbmcgYXJnKQogewotCWludCBlcnJvcjsKLQlpbnQgYmxvY2s7Ci0Jc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCWludCBfX3VzZXIgKnAgPSAoaW50IF9fdXNlciAqKWFyZzsKIAogCXN3aXRjaCAoY21kKSB7Ci0JCWNhc2UgRklCTUFQOgotCQl7Ci0JCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZpbHAtPmZfbWFwcGluZzsKLQkJCWludCByZXM7Ci0JCQkvKiBkbyB3ZSBzdXBwb3J0IHRoaXMgbWVzcz8gKi8KLQkJCWlmICghbWFwcGluZy0+YV9vcHMtPmJtYXApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCi0JCQkJcmV0dXJuIC1FUEVSTTsKLQkJCWlmICgoZXJyb3IgPSBnZXRfdXNlcihibG9jaywgcCkpICE9IDApCi0JCQkJcmV0dXJuIGVycm9yOwotCi0JCQlsb2NrX2tlcm5lbCgpOwotCQkJcmVzID0gbWFwcGluZy0+YV9vcHMtPmJtYXAobWFwcGluZywgYmxvY2spOwotCQkJdW5sb2NrX2tlcm5lbCgpOwotCQkJcmV0dXJuIHB1dF91c2VyKHJlcywgcCk7Ci0JCX0KLQkJY2FzZSBGSUdFVEJTWjoKLQkJCXJldHVybiBwdXRfdXNlcihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUsIHApOwotCQljYXNlIEZJT05SRUFEOgotCQkJcmV0dXJuIHB1dF91c2VyKGlfc2l6ZV9yZWFkKGlub2RlKSAtIGZpbHAtPmZfcG9zLCBwKTsKKwljYXNlIEZJQk1BUDoKKwkJcmV0dXJuIGlvY3RsX2ZpYm1hcChmaWxwLCBwKTsKKwljYXNlIEZJR0VUQlNaOgorCQlyZXR1cm4gcHV0X3VzZXIoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplLCBwKTsKKwljYXNlIEZJT05SRUFEOgorCQlyZXR1cm4gcHV0X3VzZXIoaV9zaXplX3JlYWQoaW5vZGUpIC0gZmlscC0+Zl9wb3MsIHApOwogCX0KIAotCXJldHVybiBkb19pb2N0bChmaWxwLCBjbWQsIGFyZyk7CisJcmV0dXJuIHZmc19pb2N0bChmaWxwLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyBpbnQgaW9jdGxfZmlvbmJpbyhzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IF9fdXNlciAqYXJncCkKK3sKKwl1bnNpZ25lZCBpbnQgZmxhZzsKKwlpbnQgb24sIGVycm9yOworCisJZXJyb3IgPSBnZXRfdXNlcihvbiwgYXJncCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJZmxhZyA9IE9fTk9OQkxPQ0s7CisjaWZkZWYgX19zcGFyY19fCisJLyogU3VuT1MgY29tcGF0aWJpbGl0eSBpdGVtLiAqLworCWlmIChPX05PTkJMT0NLICE9IE9fTkRFTEFZKQorCQlmbGFnIHw9IE9fTkRFTEFZOworI2VuZGlmCisJaWYgKG9uKQorCQlmaWxwLT5mX2ZsYWdzIHw9IGZsYWc7CisJZWxzZQorCQlmaWxwLT5mX2ZsYWdzICY9IH5mbGFnOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBpb2N0bF9maW9hc3luYyh1bnNpZ25lZCBpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICBpbnQgX191c2VyICphcmdwKQoreworCXVuc2lnbmVkIGludCBmbGFnOworCWludCBvbiwgZXJyb3I7CisKKwllcnJvciA9IGdldF91c2VyKG9uLCBhcmdwKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwlmbGFnID0gb24gPyBGQVNZTkMgOiAwOworCisJLyogRGlkIEZBU1lOQyBzdGF0ZSBjaGFuZ2UgPyAqLworCWlmICgoZmxhZyBeIGZpbHAtPmZfZmxhZ3MpICYgRkFTWU5DKSB7CisJCWlmIChmaWxwLT5mX29wICYmIGZpbHAtPmZfb3AtPmZhc3luYykgeworCQkJbG9ja19rZXJuZWwoKTsKKwkJCWVycm9yID0gZmlscC0+Zl9vcC0+ZmFzeW5jKGZkLCBmaWxwLCBvbik7CisJCQl1bmxvY2tfa2VybmVsKCk7CisJCX0gZWxzZQorCQkJZXJyb3IgPSAtRU5PVFRZOworCX0KKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWlmIChvbikKKwkJZmlscC0+Zl9mbGFncyB8PSBGQVNZTkM7CisJZWxzZQorCQlmaWxwLT5mX2ZsYWdzICY9IH5GQVNZTkM7CisJcmV0dXJuIGVycm9yOwogfQogCiAvKgogICogV2hlbiB5b3UgYWRkIGFueSBuZXcgY29tbW9uIGlvY3RscyB0byB0aGUgc3dpdGNoZXMgYWJvdmUgYW5kIGJlbG93CiAgKiBwbGVhc2UgdXBkYXRlIGNvbXBhdF9zeXNfaW9jdGwoKSB0b28uCiAgKgotICogdmZzX2lvY3RsKCkgaXMgbm90IGZvciBkcml2ZXJzIGFuZCBub3QgaW50ZW5kZWQgdG8gYmUgRVhQT1JUX1NZTUJPTCgpJ2QuCisgKiBkb192ZnNfaW9jdGwoKSBpcyBub3QgZm9yIGRyaXZlcnMgYW5kIG5vdCBpbnRlbmRlZCB0byBiZSBFWFBPUlRfU1lNQk9MKCknZC4KICAqIEl0J3MganVzdCBhIHNpbXBsZSBoZWxwZXIgZm9yIHN5c19pb2N0bCBhbmQgY29tcGF0X3N5c19pb2N0bC4KICAqLwotaW50IHZmc19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK2ludCBkb192ZnNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwKKwkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXVuc2lnbmVkIGludCBmbGFnOwotCWludCBvbiwgZXJyb3IgPSAwOworCWludCBlcnJvciA9IDA7CisJaW50IF9fdXNlciAqYXJncCA9IChpbnQgX191c2VyICopYXJnOwogCiAJc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBGSU9DTEVYOgotCQkJc2V0X2Nsb3NlX29uX2V4ZWMoZmQsIDEpOwotCQkJYnJlYWs7CisJY2FzZSBGSU9DTEVYOgorCQlzZXRfY2xvc2Vfb25fZXhlYyhmZCwgMSk7CisJCWJyZWFrOwogCi0JCWNhc2UgRklPTkNMRVg6Ci0JCQlzZXRfY2xvc2Vfb25fZXhlYyhmZCwgMCk7Ci0JCQlicmVhazsKKwljYXNlIEZJT05DTEVYOgorCQlzZXRfY2xvc2Vfb25fZXhlYyhmZCwgMCk7CisJCWJyZWFrOwogCi0JCWNhc2UgRklPTkJJTzoKLQkJCWlmICgoZXJyb3IgPSBnZXRfdXNlcihvbiwgKGludCBfX3VzZXIgKilhcmcpKSAhPSAwKQotCQkJCWJyZWFrOwotCQkJZmxhZyA9IE9fTk9OQkxPQ0s7Ci0jaWZkZWYgX19zcGFyY19fCi0JCQkvKiBTdW5PUyBjb21wYXRpYmlsaXR5IGl0ZW0uICovCi0JCQlpZihPX05PTkJMT0NLICE9IE9fTkRFTEFZKQotCQkJCWZsYWcgfD0gT19OREVMQVk7Ci0jZW5kaWYKLQkJCWlmIChvbikKLQkJCQlmaWxwLT5mX2ZsYWdzIHw9IGZsYWc7Ci0JCQllbHNlCi0JCQkJZmlscC0+Zl9mbGFncyAmPSB+ZmxhZzsKLQkJCWJyZWFrOworCWNhc2UgRklPTkJJTzoKKwkJZXJyb3IgPSBpb2N0bF9maW9uYmlvKGZpbHAsIGFyZ3ApOworCQlicmVhazsKIAotCQljYXNlIEZJT0FTWU5DOgotCQkJaWYgKChlcnJvciA9IGdldF91c2VyKG9uLCAoaW50IF9fdXNlciAqKWFyZykpICE9IDApCi0JCQkJYnJlYWs7Ci0JCQlmbGFnID0gb24gPyBGQVNZTkMgOiAwOworCWNhc2UgRklPQVNZTkM6CisJCWVycm9yID0gaW9jdGxfZmlvYXN5bmMoZmQsIGZpbHAsIGFyZ3ApOworCQlicmVhazsKIAotCQkJLyogRGlkIEZBU1lOQyBzdGF0ZSBjaGFuZ2UgPyAqLwotCQkJaWYgKChmbGFnIF4gZmlscC0+Zl9mbGFncykgJiBGQVNZTkMpIHsKLQkJCQlpZiAoZmlscC0+Zl9vcCAmJiBmaWxwLT5mX29wLT5mYXN5bmMpIHsKLQkJCQkJbG9ja19rZXJuZWwoKTsKLQkJCQkJZXJyb3IgPSBmaWxwLT5mX29wLT5mYXN5bmMoZmQsIGZpbHAsIG9uKTsKLQkJCQkJdW5sb2NrX2tlcm5lbCgpOwotCQkJCX0KLQkJCQllbHNlIGVycm9yID0gLUVOT1RUWTsKLQkJCX0KLQkJCWlmIChlcnJvciAhPSAwKQotCQkJCWJyZWFrOwotCi0JCQlpZiAob24pCi0JCQkJZmlscC0+Zl9mbGFncyB8PSBGQVNZTkM7Ci0JCQllbHNlCi0JCQkJZmlscC0+Zl9mbGFncyAmPSB+RkFTWU5DOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBGSU9RU0laRToKLQkJCWlmIChTX0lTRElSKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkgfHwKLQkJCSAgICBTX0lTUkVHKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkgfHwKLQkJCSAgICBTX0lTTE5LKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpIHsKLQkJCQlsb2ZmX3QgcmVzID0gaW5vZGVfZ2V0X2J5dGVzKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwotCQkJCWVycm9yID0gY29weV90b191c2VyKChsb2ZmX3QgX191c2VyICopYXJnLCAmcmVzLCBzaXplb2YocmVzKSkgPyAtRUZBVUxUIDogMDsKLQkJCX0KLQkJCWVsc2UKLQkJCQllcnJvciA9IC1FTk9UVFk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWlmIChTX0lTUkVHKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpCi0JCQkJZXJyb3IgPSBmaWxlX2lvY3RsKGZpbHAsIGNtZCwgYXJnKTsKLQkJCWVsc2UKLQkJCQllcnJvciA9IGRvX2lvY3RsKGZpbHAsIGNtZCwgYXJnKTsKLQkJCWJyZWFrOworCWNhc2UgRklPUVNJWkU6CisJCWlmIChTX0lTRElSKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkgfHwKKwkJICAgIFNfSVNSRUcoZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSB8fAorCQkgICAgU19JU0xOSyhmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKSB7CisJCQlsb2ZmX3QgcmVzID0KKwkJCQlpbm9kZV9nZXRfYnl0ZXMoZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJCQllcnJvciA9IGNvcHlfdG9fdXNlcigobG9mZl90IF9fdXNlciAqKWFyZywgJnJlcywKKwkJCQkJICAgICBzaXplb2YocmVzKSkgPyAtRUZBVUxUIDogMDsKKwkJfSBlbHNlCisJCQllcnJvciA9IC1FTk9UVFk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChTX0lTUkVHKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpCisJCQllcnJvciA9IGZpbGVfaW9jdGwoZmlscCwgY21kLCBhcmcpOworCQllbHNlCisJCQllcnJvciA9IHZmc19pb2N0bChmaWxwLCBjbWQsIGFyZyk7CisJCWJyZWFrOwogCX0KIAlyZXR1cm4gZXJyb3I7CiB9CiAKIGFzbWxpbmthZ2UgbG9uZyBzeXNfaW9jdGwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlzdHJ1Y3QgZmlsZSAqIGZpbHA7CisJc3RydWN0IGZpbGUgKmZpbHA7CiAJaW50IGVycm9yID0gLUVCQURGOwogCWludCBmcHV0X25lZWRlZDsKIApAQCAtMTY4LDcgKzIwNSw3IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9mcHV0OwogCi0JZXJyb3IgPSB2ZnNfaW9jdGwoZmlscCwgZmQsIGNtZCwgYXJnKTsKKwllcnJvciA9IGRvX3Zmc19pb2N0bChmaWxwLCBmZCwgY21kLCBhcmcpOwogIG91dF9mcHV0OgogCWZwdXRfbGlnaHQoZmlscCwgZnB1dF9uZWVkZWQpOwogIG91dDoKZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL2V4cG9ydC5jIGIvZnMvaXNvZnMvZXhwb3J0LmMKaW5kZXggMjlmOTc1My4uYmIyMTkxMyAxMDA2NDQKLS0tIGEvZnMvaXNvZnMvZXhwb3J0LmMKKysrIGIvZnMvaXNvZnMvZXhwb3J0LmMKQEAgLTI2LDExICsyNiw5IEBACiAJaWYgKGJsb2NrID09IDApCiAJCXJldHVybiBFUlJfUFRSKC1FU1RBTEUpOwogCWlub2RlID0gaXNvZnNfaWdldChzYiwgYmxvY2ssIG9mZnNldCk7Ci0JaWYgKGlub2RlID09IE5VTEwpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpCi0JICAgIHx8IChnZW5lcmF0aW9uICYmIGlub2RlLT5pX2dlbmVyYXRpb24gIT0gZ2VuZXJhdGlvbikpCi0JeworCWlmIChJU19FUlIoaW5vZGUpKQorCQlyZXR1cm4gRVJSX0NBU1QoaW5vZGUpOworCWlmIChnZW5lcmF0aW9uICYmIGlub2RlLT5pX2dlbmVyYXRpb24gIT0gZ2VuZXJhdGlvbikgewogCQlpcHV0KGlub2RlKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVTVEFMRSk7CiAJfQpAQCAtMTEwLDggKzEwOCwxMCBAQAogCXBhcmVudF9pbm9kZSA9IGlzb2ZzX2lnZXQoY2hpbGRfaW5vZGUtPmlfc2IsCiAJCQkJICBwYXJlbnRfYmxvY2ssCiAJCQkJICBwYXJlbnRfb2Zmc2V0KTsKLQlpZiAocGFyZW50X2lub2RlID09IE5VTEwpIHsKLQkJcnYgPSBFUlJfUFRSKC1FQUNDRVMpOworCWlmIChJU19FUlIocGFyZW50X2lub2RlKSkgeworCQlydiA9IEVSUl9DQVNUKHBhcmVudF9pbm9kZSk7CisJCWlmIChydiAhPSBFUlJfUFRSKC1FTk9NRU0pKQorCQkJcnYgPSBFUlJfUFRSKC1FQUNDRVMpOwogCQlnb3RvIG91dDsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL2lub2RlLmMgYi9mcy9pc29mcy9pbm9kZS5jCmluZGV4IDA5ZTNkMzAuLjA0NGEyNTQgMTAwNjQ0Ci0tLSBhL2ZzL2lzb2ZzL2lub2RlLmMKKysrIGIvZnMvaXNvZnMvaW5vZGUuYwpAQCAtNTQsNyArNTQsNyBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIHZvaWQgaXNvZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CitzdGF0aWMgaW50IGlzb2ZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICopOwogc3RhdGljIGludCBpc29mc19zdGF0ZnMgKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGtzdGF0ZnMgKik7CiAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqaXNvZnNfaW5vZGVfY2FjaGVwOwpAQCAtMTA3LDEwICsxMDcsMTAgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBpc29mc19zb3BzID0gewogCS5hbGxvY19pbm9kZQk9IGlzb2ZzX2FsbG9jX2lub2RlLAogCS5kZXN0cm95X2lub2RlCT0gaXNvZnNfZGVzdHJveV9pbm9kZSwKLQkucmVhZF9pbm9kZQk9IGlzb2ZzX3JlYWRfaW5vZGUsCiAJLnB1dF9zdXBlcgk9IGlzb2ZzX3B1dF9zdXBlciwKIAkuc3RhdGZzCQk9IGlzb2ZzX3N0YXRmcywKIAkucmVtb3VudF9mcwk9IGlzb2ZzX3JlbW91bnQsCisJLnNob3dfb3B0aW9ucwk9IGdlbmVyaWNfc2hvd19vcHRpb25zLAogfTsKIAogCkBAIC0xNDUsNyArMTQ1LDggQEAKIAljaGFyIG5vY29tcHJlc3M7CiAJdW5zaWduZWQgY2hhciBjaGVjazsKIAl1bnNpZ25lZCBpbnQgYmxvY2tzaXplOwotCW1vZGVfdCBtb2RlOworCW1vZGVfdCBmbW9kZTsKKwltb2RlX3QgZG1vZGU7CiAJZ2lkX3QgZ2lkOwogCXVpZF90IHVpZDsKIAljaGFyICppb2NoYXJzZXQ7CkBAIC0zMDYsNyArMzA3LDcgQEAKIAlPcHRfYmxvY2ssIE9wdF9jaGVja19yLCBPcHRfY2hlY2tfcywgT3B0X2NydWZ0LCBPcHRfZ2lkLCBPcHRfaWdub3JlLAogCU9wdF9pb2NoYXJzZXQsIE9wdF9tYXBfYSwgT3B0X21hcF9uLCBPcHRfbWFwX28sIE9wdF9tb2RlLCBPcHRfbm9qb2xpZXQsCiAJT3B0X25vcm9jaywgT3B0X3NiLCBPcHRfc2Vzc2lvbiwgT3B0X3VpZCwgT3B0X3VuaGlkZSwgT3B0X3V0ZjgsIE9wdF9lcnIsCi0JT3B0X25vY29tcHJlc3MsIE9wdF9oaWRlLCBPcHRfc2hvd2Fzc29jLAorCU9wdF9ub2NvbXByZXNzLCBPcHRfaGlkZSwgT3B0X3Nob3dhc3NvYywgT3B0X2Rtb2RlLAogfTsKIAogc3RhdGljIG1hdGNoX3RhYmxlX3QgdG9rZW5zID0gewpAQCAtMzMzLDYgKzMzNCw3IEBACiAJe09wdF91aWQsICJ1aWQ9JXUifSwKIAl7T3B0X2dpZCwgImdpZD0ldSJ9LAogCXtPcHRfbW9kZSwgIm1vZGU9JXUifSwKKwl7T3B0X2Rtb2RlLCAiZG1vZGU9JXUifSwKIAl7T3B0X2Jsb2NrLCAiYmxvY2s9JXUifSwKIAl7T3B0X2lnbm9yZSwgImNvbnY9YmluYXJ5In0sCiAJe09wdF9pZ25vcmUsICJjb252PWIifSwKQEAgLTM2MCw3ICszNjIsNyBAQAogCXBvcHQtPmNoZWNrID0gJ3UnOwkJLyogdW5zZXQgKi8KIAlwb3B0LT5ub2NvbXByZXNzID0gMDsKIAlwb3B0LT5ibG9ja3NpemUgPSAxMDI0OwotCXBvcHQtPm1vZGUgPSBTX0lSVUdPIHwgU19JWFVHTzsgLyoKKwlwb3B0LT5mbW9kZSA9IHBvcHQtPmRtb2RlID0gU19JUlVHTyB8IFNfSVhVR087IC8qCiAJCQkJCSAqIHIteCBmb3IgYWxsLiAgVGhlIGRpc2MgY291bGQKIAkJCQkJICogYmUgc2hhcmVkIHdpdGggRE9TIG1hY2hpbmVzIHNvCiAJCQkJCSAqIHZpcnR1YWxseSBhbnl0aGluZyBjb3VsZCBiZQpAQCAtNDUyLDcgKzQ1NCwxMiBAQAogCQljYXNlIE9wdF9tb2RlOgogCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCiAJCQkJcmV0dXJuIDA7Ci0JCQlwb3B0LT5tb2RlID0gb3B0aW9uOworCQkJcG9wdC0+Zm1vZGUgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZG1vZGU6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCXBvcHQtPmRtb2RlID0gb3B0aW9uOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2Jsb2NrOgogCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCkBAIC01NTIsOSArNTU5LDExIEBACiAJaW50IGpvbGlldF9sZXZlbCA9IDA7CiAJaW50IGlzb19ibGtudW0sIGJsb2NrOwogCWludCBvcmlnX3pvbmVzaXplOwotCWludCB0YWJsZTsKKwlpbnQgdGFibGUsIGVycm9yID0gLUVJTlZBTDsKIAl1bnNpZ25lZCBpbnQgdm9sX2Rlc2Nfc3RhcnQ7CiAKKwlzYXZlX21vdW50X29wdGlvbnMocywgZGF0YSk7CisKIAlzYmkgPSBremFsbG9jKHNpemVvZigqc2JpKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzYmkpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtODAyLDcgKzgxMSw4IEBACiAJICogb24gdGhlIGRpc2sgYXMgc3VpZCwgc28gd2UgbWVyZWx5IGFsbG93IHRoZW0gdG8gc2V0IHRoZSBkZWZhdWx0CiAJICogcGVybWlzc2lvbnMuCiAJICovCi0Jc2JpLT5zX21vZGUgPSBvcHQubW9kZSAmIDA3Nzc7CisJc2JpLT5zX2Ztb2RlID0gb3B0LmZtb2RlICYgMDc3NzsKKwlzYmktPnNfZG1vZGUgPSBvcHQuZG1vZGUgJiAwNzc3OwogCiAJLyoKIAkgKiBSZWFkIHRoZSByb290IGlub2RlLCB3aGljaCBfbWF5XyByZXN1bHQgaW4gY2hhbmdpbmcKQEAgLTgxMCw2ICs4MjAsOCBAQAogCSAqIHdlIHRoZW4gZGVjaWRlIHdoZXRoZXIgdG8gdXNlIHRoZSBKb2xpZXQgZGVzY3JpcHRvci4KIAkgKi8KIAlpbm9kZSA9IGlzb2ZzX2lnZXQocywgc2JpLT5zX2ZpcnN0ZGF0YXpvbmUsIDApOworCWlmIChJU19FUlIoaW5vZGUpKQorCQlnb3RvIG91dF9ub19yb290OwogCiAJLyoKIAkgKiBJZiB0aGlzIGRpc2sgaGFzIGJvdGggUm9jayBSaWRnZSBhbmQgSm9saWV0IG9uIGl0LCB0aGVuIHdlCkBAIC04MjksNiArODQxLDggQEAKIAkJCQkiSVNPRlM6IGNoYW5naW5nIHRvIHNlY29uZGFyeSByb290XG4iKTsKIAkJCWlwdXQoaW5vZGUpOwogCQkJaW5vZGUgPSBpc29mc19pZ2V0KHMsIHNiaS0+c19maXJzdGRhdGF6b25lLCAwKTsKKwkJCWlmIChJU19FUlIoaW5vZGUpKQorCQkJCWdvdG8gb3V0X25vX3Jvb3Q7CiAJCX0KIAl9CiAKQEAgLTg0Miw4ICs4NTYsNiBAQAogCXNiaS0+c19qb2xpZXRfbGV2ZWwgPSBqb2xpZXRfbGV2ZWw7CiAKIAkvKiBjaGVjayB0aGUgcm9vdCBpbm9kZSAqLwotCWlmICghaW5vZGUpCi0JCWdvdG8gb3V0X25vX3Jvb3Q7CiAJaWYgKCFpbm9kZS0+aV9vcCkKIAkJZ290byBvdXRfYmFkX3Jvb3Q7CiAKQEAgLTg3NiwxMSArODg4LDE0IEBACiAJICovCiBvdXRfYmFkX3Jvb3Q6CiAJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJvb3QgaW5vZGUgbm90IGluaXRpYWxpemVkXG4iLCBfX2Z1bmNfXyk7Ci0JZ290byBvdXRfaXB1dDsKLW91dF9ub19yb290OgotCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBnZXQgcm9vdCBpbm9kZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKIG91dF9pcHV0OgogCWlwdXQoaW5vZGUpOworCWdvdG8gb3V0X25vX2lub2RlOworb3V0X25vX3Jvb3Q6CisJZXJyb3IgPSBQVFJfRVJSKGlub2RlKTsKKwlpZiAoZXJyb3IgIT0gLUVOT01FTSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGdldCByb290IGlub2RlIGZhaWxlZFxuIiwgX19mdW5jX18pOworb3V0X25vX2lub2RlOgogI2lmZGVmIENPTkZJR19KT0xJRVQKIAlpZiAoc2JpLT5zX25sc19pb2NoYXJzZXQpCiAJCXVubG9hZF9ubHMoc2JpLT5zX25sc19pb2NoYXJzZXQpOwpAQCAtOTA4LDcgKzkyMyw3IEBACiAJa2ZyZWUob3B0LmlvY2hhcnNldCk7CiAJa2ZyZWUoc2JpKTsKIAlzLT5zX2ZzX2luZm8gPSBOVUxMOwotCXJldHVybiAtRUlOVkFMOworCXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIGludCBpc29mc19zdGF0ZnMgKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKQEAgLTkzMCw3ICs5NDUsNyBAQAogLyoKICAqIEdldCBhIHNldCBvZiBibG9ja3M7IGZpbGxpbmcgaW4gYnVmZmVyX2hlYWRzIGlmIGFscmVhZHkgYWxsb2NhdGVkCiAgKiBvciBnZXRibGsoKSBpZiB0aGV5IGFyZSBub3QuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYmxvY2tzIGluc2VydGVkCi0gKiAoMCA9PSBlcnJvci4pCisgKiAoLXZlID09IGVycm9yLikKICAqLwogaW50IGlzb2ZzX2dldF9ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgaWJsb2NrX3MsCiAJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgsIHVuc2lnbmVkIGxvbmcgbmJsb2NrcykKQEAgLTk0MCwxMSArOTU1LDEyIEBACiAJdW5zaWduZWQgaW50IGZpcnN0ZXh0OwogCXVuc2lnbmVkIGxvbmcgbmV4dGJsaywgbmV4dG9mZjsKIAlsb25nIGlibG9jayA9IChsb25nKWlibG9ja19zOwotCWludCBzZWN0aW9uLCBydjsKKwlpbnQgc2VjdGlvbiwgcnYsIGVycm9yOwogCXN0cnVjdCBpc29faW5vZGVfaW5mbyAqZWkgPSBJU09GU19JKGlub2RlKTsKIAogCWxvY2tfa2VybmVsKCk7CiAKKwllcnJvciA9IC1FSU87CiAJcnYgPSAwOwogCWlmIChpYmxvY2sgPCAwIHx8IGlibG9jayAhPSBpYmxvY2tfcykgewogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJsb2NrIG51bWJlciB0b28gbGFyZ2VcbiIsIF9fZnVuY19fKTsKQEAgLTk4Myw4ICs5OTksMTAgQEAKIAogCQkJb2Zmc2V0ICs9IHNlY3Rfc2l6ZTsKIAkJCW5pbm9kZSA9IGlzb2ZzX2lnZXQoaW5vZGUtPmlfc2IsIG5leHRibGssIG5leHRvZmYpOwotCQkJaWYgKCFuaW5vZGUpCisJCQlpZiAoSVNfRVJSKG5pbm9kZSkpIHsKKwkJCQllcnJvciA9IFBUUl9FUlIobmlub2RlKTsKIAkJCQlnb3RvIGFib3J0OworCQkJfQogCQkJZmlyc3RleHQgID0gSVNPRlNfSShuaW5vZGUpLT5pX2ZpcnN0X2V4dGVudDsKIAkJCXNlY3Rfc2l6ZSA9IElTT0ZTX0kobmlub2RlKS0+aV9zZWN0aW9uX3NpemUgPj4gSVNPRlNfQlVGRkVSX0JJVFMobmlub2RlKTsKIAkJCW5leHRibGsgICA9IElTT0ZTX0kobmlub2RlKS0+aV9uZXh0X3NlY3Rpb25fYmxvY2s7CkBAIC0xMDE1LDkgKzEwMzMsMTAgQEAKIAkJcnYrKzsKIAl9CiAKKwllcnJvciA9IDA7CiBhYm9ydDoKIAl1bmxvY2tfa2VybmVsKCk7Ci0JcmV0dXJuIHJ2OworCXJldHVybiBydiAhPSAwID8gcnYgOiBlcnJvcjsKIH0KIAogLyoKQEAgLTEwMjYsMTIgKzEwNDUsMTUgQEAKIHN0YXRpYyBpbnQgaXNvZnNfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywKIAkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCBpbnQgY3JlYXRlKQogeworCWludCByZXQ7CisKIAlpZiAoY3JlYXRlKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogS2VybmVsIHRyaWVzIHRvIGFsbG9jYXRlIGEgYmxvY2tcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FUk9GUzsKIAl9CiAKLQlyZXR1cm4gaXNvZnNfZ2V0X2Jsb2Nrcyhpbm9kZSwgaWJsb2NrLCAmYmhfcmVzdWx0LCAxKSA/IDAgOiAtRUlPOworCXJldCA9IGlzb2ZzX2dldF9ibG9ja3MoaW5vZGUsIGlibG9jaywgJmJoX3Jlc3VsdCwgMSk7CisJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAwOwogfQogCiBzdGF0aWMgaW50IGlzb2ZzX2JtYXAoc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgYmxvY2spCkBAIC0xMTg2LDcgKzEyMDgsNyBAQAogCWdvdG8gb3V0OwogfQogCi1zdGF0aWMgdm9pZCBpc29mc19yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdGF0aWMgaW50IGlzb2ZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAJc3RydWN0IGlzb2ZzX3NiX2luZm8gKnNiaSA9IElTT0ZTX1NCKHNiKTsKQEAgLTExOTksNiArMTIyMSw3IEBACiAJdW5zaWduZWQgaW50IGRlX2xlbjsKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKIAlzdHJ1Y3QgaXNvX2lub2RlX2luZm8gKmVpID0gSVNPRlNfSShpbm9kZSk7CisJaW50IHJldCA9IC1FSU87CiAKIAlibG9jayA9IGVpLT5pX2lnZXQ1X2Jsb2NrOwogCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIGJsb2NrKTsKQEAgLTEyMTYsNiArMTIzOSw3IEBACiAJCXRtcGRlID0ga21hbGxvYyhkZV9sZW4sIEdGUF9LRVJORUwpOwogCQlpZiAodG1wZGUgPT0gTlVMTCkgewogCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG91dCBvZiBtZW1vcnlcbiIsIF9fZnVuY19fKTsKKwkJCXJldCA9IC1FTk9NRU07CiAJCQlnb3RvIGZhaWw7CiAJCX0KIAkJbWVtY3B5KHRtcGRlLCBiaC0+Yl9kYXRhICsgb2Zmc2V0LCBmcmFnMSk7CkBAIC0xMjM1LDcgKzEyNTksNyBAQAogCWVpLT5pX2ZpbGVfZm9ybWF0ID0gaXNvZnNfZmlsZV9ub3JtYWw7CiAKIAlpZiAoZGUtPmZsYWdzWy1oaWdoX3NpZXJyYV0gJiAyKSB7Ci0JCWlub2RlLT5pX21vZGUgPSBTX0lSVUdPIHwgU19JWFVHTyB8IFNfSUZESVI7CisJCWlub2RlLT5pX21vZGUgPSBzYmktPnNfZG1vZGUgfCBTX0lGRElSOwogCQlpbm9kZS0+aV9ubGluayA9IDE7CS8qCiAJCQkJCSAqIFNldCB0byAxLiAgV2Uga25vdyB0aGVyZSBhcmUgMiwgYnV0CiAJCQkJCSAqIHRoZSBmaW5kIHV0aWxpdHkgdHJpZXMgdG8gb3B0aW1pemUKQEAgLTEyNDUsOSArMTI2OSw4IEBACiAJCQkJCSAqLwogCX0gZWxzZSB7CiAJCS8qIEV2ZXJ5Ym9keSBnZXRzIHRvIHJlYWQgdGhlIGZpbGUuICovCi0JCWlub2RlLT5pX21vZGUgPSBzYmktPnNfbW9kZTsKKwkJaW5vZGUtPmlfbW9kZSA9IHNiaS0+c19mbW9kZSB8IFNfSUZSRUc7CiAJCWlub2RlLT5pX25saW5rID0gMTsKLQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGUkVHOwogCX0KIAlpbm9kZS0+aV91aWQgPSBzYmktPnNfdWlkOwogCWlub2RlLT5pX2dpZCA9IHNiaS0+c19naWQ7CkBAIC0xMjU5LDggKzEyODIsMTAgQEAKIAogCWVpLT5pX3NlY3Rpb25fc2l6ZSA9IGlzb251bV83MzMoZGUtPnNpemUpOwogCWlmIChkZS0+ZmxhZ3NbLWhpZ2hfc2llcnJhXSAmIDB4ODApIHsKLQkJaWYoaXNvZnNfcmVhZF9sZXZlbDNfc2l6ZShpbm9kZSkpCisJCXJldCA9IGlzb2ZzX3JlYWRfbGV2ZWwzX3NpemUoaW5vZGUpOworCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZmFpbDsKKwkJcmV0ID0gLUVJTzsKIAl9IGVsc2UgewogCQllaS0+aV9uZXh0X3NlY3Rpb25fYmxvY2sgPSAwOwogCQllaS0+aV9uZXh0X3NlY3Rpb25fb2Zmc2V0ID0gMDsKQEAgLTEzNDYsMTYgKzEzNzEsMTYgQEAKIAkJLyogWFhYIC0gcGFyc2Vfcm9ja19yaWRnZV9pbm9kZSgpIGhhZCBhbHJlYWR5IHNldCBpX3JkZXYuICovCiAJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgaW5vZGUtPmlfcmRldik7CiAKKwlyZXQgPSAwOwogb3V0OgogCWtmcmVlKHRtcGRlKTsKIAlpZiAoYmgpCiAJCWJyZWxzZShiaCk7Ci0JcmV0dXJuOworCXJldHVybiByZXQ7CiAKIG91dF9iYWRyZWFkOgogCXByaW50ayhLRVJOX1dBUk5JTkcgIklTT0ZTOiB1bmFibGUgdG8gcmVhZCBpLW5vZGUgYmxvY2tcbiIpOwogZmFpbDoKLQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CiAJZ290byBvdXQ7CiB9CiAKQEAgLTEzOTQsOSArMTQxOSwxMCBAQAogCXVuc2lnbmVkIGxvbmcgaGFzaHZhbDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBpc29mc19pZ2V0NV9jYWxsYmFja19kYXRhIGRhdGE7CisJbG9uZyByZXQ7CiAKIAlpZiAob2Zmc2V0ID49IDF1bCA8PCBzYi0+c19ibG9ja3NpemVfYml0cykKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCiAJZGF0YS5ibG9jayA9IGJsb2NrOwogCWRhdGEub2Zmc2V0ID0gb2Zmc2V0OwpAQCAtMTQwNiw5ICsxNDMyLDE3IEBACiAJaW5vZGUgPSBpZ2V0NV9sb2NrZWQoc2IsIGhhc2h2YWwsICZpc29mc19pZ2V0NV90ZXN0LAogCQkJCSZpc29mc19pZ2V0NV9zZXQsICZkYXRhKTsKIAotCWlmIChpbm9kZSAmJiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykpIHsKLQkJc2ItPnNfb3AtPnJlYWRfaW5vZGUoaW5vZGUpOwotCQl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSB7CisJCXJldCA9IGlzb2ZzX3JlYWRfaW5vZGUoaW5vZGUpOworCQlpZiAocmV0IDwgMCkgeworCQkJaWdldF9mYWlsZWQoaW5vZGUpOworCQkJaW5vZGUgPSBFUlJfUFRSKHJldCk7CisJCX0gZWxzZSB7CisJCQl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKwkJfQogCX0KIAogCXJldHVybiBpbm9kZTsKZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL2lzb2ZzLmggYi9mcy9pc29mcy9pc29mcy5oCmluZGV4IGYzMjEzZjkuLmQxYmRmOGFkIDEwMDY0NAotLS0gYS9mcy9pc29mcy9pc29mcy5oCisrKyBiL2ZzL2lzb2ZzL2lzb2ZzLmgKQEAgLTUxLDcgKzUxLDggQEAKIAl1bnNpZ25lZCBjaGFyIHNfaGlkZTsKIAl1bnNpZ25lZCBjaGFyIHNfc2hvd2Fzc29jOwogCi0JbW9kZV90IHNfbW9kZTsKKwltb2RlX3Qgc19mbW9kZTsKKwltb2RlX3Qgc19kbW9kZTsKIAlnaWRfdCBzX2dpZDsKIAl1aWRfdCBzX3VpZDsKIAlzdHJ1Y3QgbmxzX3RhYmxlICpzX25sc19pb2NoYXJzZXQ7IC8qIE5hdGl2ZSBsYW5ndWFnZSBzdXBwb3J0IHRhYmxlICovCmRpZmYgLS1naXQgYS9mcy9pc29mcy9uYW1laS5jIGIvZnMvaXNvZnMvbmFtZWkuYwppbmRleCBlMmI0ZGFkLi4zNDRiMjQ3IDEwMDY0NAotLS0gYS9mcy9pc29mcy9uYW1laS5jCisrKyBiL2ZzL2lzb2ZzL25hbWVpLmMKQEAgLTE3OSw5ICsxNzksOSBAQAogCWlub2RlID0gTlVMTDsKIAlpZiAoZm91bmQpIHsKIAkJaW5vZGUgPSBpc29mc19pZ2V0KGRpci0+aV9zYiwgYmxvY2ssIG9mZnNldCk7Ci0JCWlmICghaW5vZGUpIHsKKwkJaWYgKElTX0VSUihpbm9kZSkpIHsKIAkJCXVubG9ja19rZXJuZWwoKTsKLQkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCQkJcmV0dXJuIEVSUl9DQVNUKGlub2RlKTsKIAkJfQogCX0KIAl1bmxvY2tfa2VybmVsKCk7CmRpZmYgLS1naXQgYS9mcy9pc29mcy9yb2NrLmMgYi9mcy9pc29mcy9yb2NrLmMKaW5kZXggZjNhMWRiMy4uNmJkNDhmMCAxMDA2NDQKLS0tIGEvZnMvaXNvZnMvcm9jay5jCisrKyBiL2ZzL2lzb2ZzL3JvY2suYwpAQCAtNDc0LDggKzQ3NCwxMCBAQAogCQkJICAgIGlzb2ZzX2lnZXQoaW5vZGUtPmlfc2IsCiAJCQkJICAgICAgIElTT0ZTX0koaW5vZGUpLT5pX2ZpcnN0X2V4dGVudCwKIAkJCQkgICAgICAgMCk7Ci0JCQlpZiAoIXJlbG9jKQorCQkJaWYgKElTX0VSUihyZWxvYykpIHsKKwkJCQlyZXQgPSBQVFJfRVJSKHJlbG9jKTsKIAkJCQlnb3RvIG91dDsKKwkJCX0KIAkJCWlub2RlLT5pX21vZGUgPSByZWxvYy0+aV9tb2RlOwogCQkJaW5vZGUtPmlfbmxpbmsgPSByZWxvYy0+aV9ubGluazsKIAkJCWlub2RlLT5pX3VpZCA9IHJlbG9jLT5pX3VpZDsKZGlmZiAtLWdpdCBhL2ZzL2piZC9jb21taXQuYyBiL2ZzL2piZC9jb21taXQuYwppbmRleCAzMTg1M2ViLi44ZTA4ZWZjIDEwMDY0NAotLS0gYS9mcy9qYmQvY29tbWl0LmMKKysrIGIvZnMvamJkL2NvbW1pdC5jCkBAIC0xMzEsNiArMTMxLDggQEAKIAkJYmFycmllcl9kb25lID0gMTsKIAl9CiAJcmV0ID0gc3luY19kaXJ0eV9idWZmZXIoYmgpOworCWlmIChiYXJyaWVyX2RvbmUpCisJCWNsZWFyX2J1ZmZlcl9vcmRlcmVkKGJoKTsKIAkvKiBpcyBpdCBwb3NzaWJsZSBmb3IgYW5vdGhlciBjb21taXQgdG8gZmFpbCBhdCByb3VnaGx5CiAJICogdGhlIHNhbWUgdGltZSBhcyB0aGlzIG9uZT8gIElmIHNvLCB3ZSBkb24ndCB3YW50IHRvCiAJICogdHJ1c3QgdGhlIGJhcnJpZXIgZmxhZyBpbiB0aGUgc3VwZXIsIGJ1dCBpbnN0ZWFkIHdhbnQKQEAgLTE0OCw3ICsxNTAsNiBAQAogCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKIAogCQkvKiBBbmQgdHJ5IGFnYWluLCB3aXRob3V0IHRoZSBiYXJyaWVyICovCi0JCWNsZWFyX2J1ZmZlcl9vcmRlcmVkKGJoKTsKIAkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJCXNldF9idWZmZXJfZGlydHkoYmgpOwogCQlyZXQgPSBzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9hY2wuYyBiL2ZzL2pmZnMyL2FjbC5jCmluZGV4IDc3ZmM1ODMuLjRjODA0MDQgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2FjbC5jCisrKyBiL2ZzL2pmZnMyL2FjbC5jCkBAIC0xNzYsNyArMTc2LDcgQEAKIAlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiB9CiAKLXN0cnVjdCBwb3NpeF9hY2wgKmpmZnMyX2dldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCitzdGF0aWMgc3RydWN0IHBvc2l4X2FjbCAqamZmczJfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKIHsKIAlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiA9IEpGRlMyX0lOT0RFX0lORk8oaW5vZGUpOwogCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKQEAgLTM0NSw4ICszNDUsMTAgQEAKIAkJaWYgKCFjbG9uZSkKIAkJCXJldHVybiAtRU5PTUVNOwogCQlyYyA9IHBvc2l4X2FjbF9jcmVhdGVfbWFzcShjbG9uZSwgKG1vZGVfdCAqKWlfbW9kZSk7Ci0JCWlmIChyYyA8IDApCisJCWlmIChyYyA8IDApIHsKKwkJCXBvc2l4X2FjbF9yZWxlYXNlKGNsb25lKTsKIAkJCXJldHVybiByYzsKKwkJfQogCQlpZiAocmMgPiAwKQogCQkJamZmczJfaXNldF9hY2woaW5vZGUsICZmLT5pX2FjbF9hY2Nlc3MsIGNsb25lKTsKIApkaWZmIC0tZ2l0IGEvZnMvamZmczIvYWNsLmggYi9mcy9qZmZzMi9hY2wuaAppbmRleCA3NmM2ZWJkMS4uMGJiN2YwMDMgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2FjbC5oCisrKyBiL2ZzL2pmZnMyL2FjbC5oCkBAIC0yOCw3ICsyOCw2IEBACiAKICNkZWZpbmUgSkZGUzJfQUNMX05PVF9DQUNIRUQgKCh2b2lkICopLTEpCiAKLWV4dGVybiBzdHJ1Y3QgcG9zaXhfYWNsICpqZmZzMl9nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKTsKIGV4dGVybiBpbnQgamZmczJfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKiwgaW50LCBzdHJ1Y3QgbmFtZWlkYXRhICopOwogZXh0ZXJuIGludCBqZmZzMl9hY2xfY2htb2Qoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIGludCBqZmZzMl9pbml0X2FjbF9wcmUoc3RydWN0IGlub2RlICosIHN0cnVjdCBpbm9kZSAqLCBpbnQgKik7CkBAIC00MCw3ICszOSw2IEBACiAKICNlbHNlCiAKLSNkZWZpbmUgamZmczJfZ2V0X2FjbChpbm9kZSwgdHlwZSkJCShOVUxMKQogI2RlZmluZSBqZmZzMl9wZXJtaXNzaW9uCQkJKE5VTEwpCiAjZGVmaW5lIGpmZnMyX2FjbF9jaG1vZChpbm9kZSkJCQkoMCkKICNkZWZpbmUgamZmczJfaW5pdF9hY2xfcHJlKGRpcl9pLGlub2RlLG1vZGUpCSgwKQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvZGlyLmMgYi9mcy9qZmZzMi9kaXIuYwppbmRleCA3ODdlMzkyLi5mOTQ4ZjdlIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9kaXIuYworKysgYi9mcy9qZmZzMi9kaXIuYwpAQCAtMTAxLDEwICsxMDEsMTAgQEAKIAkJaW5vID0gZmQtPmlubzsKIAl1cCgmZGlyX2YtPnNlbSk7CiAJaWYgKGlubykgewotCQlpbm9kZSA9IGlnZXQoZGlyX2ktPmlfc2IsIGlubyk7Ci0JCWlmICghaW5vZGUpIHsKKwkJaW5vZGUgPSBqZmZzMl9pZ2V0KGRpcl9pLT5pX3NiLCBpbm8pOworCQlpZiAoSVNfRVJSKGlub2RlKSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaWdldCgpIGZhaWxlZCBmb3IgaW5vICMldVxuIiwgaW5vKTsKLQkJCXJldHVybiAoRVJSX1BUUigtRUlPKSk7CisJCQlyZXR1cm4gRVJSX0NBU1QoaW5vZGUpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9mcy5jIGIvZnMvamZmczIvZnMuYwppbmRleCBkMmUwNmY3Li5lMjZlYTc4IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9mcy5jCisrKyBiL2ZzL2pmZnMyL2ZzLmMKQEAgLTk3LDExICs5Nyw3IEBACiAJcmktPmdpZCA9IGNwdV90b19qZTE2KChpdmFsaWQgJiBBVFRSX0dJRCk/aWF0dHItPmlhX2dpZDppbm9kZS0+aV9naWQpOwogCiAJaWYgKGl2YWxpZCAmIEFUVFJfTU9ERSkKLQkJaWYgKGlhdHRyLT5pYV9tb2RlICYgU19JU0dJRCAmJgotCQkgICAgIWluX2dyb3VwX3AoamUxNl90b19jcHUocmktPmdpZCkpICYmICFjYXBhYmxlKENBUF9GU0VUSUQpKQotCQkJcmktPm1vZGUgPSBjcHVfdG9famVtb2RlKGlhdHRyLT5pYV9tb2RlICYgflNfSVNHSUQpOwotCQllbHNlCi0JCQlyaS0+bW9kZSA9IGNwdV90b19qZW1vZGUoaWF0dHItPmlhX21vZGUpOworCQlyaS0+bW9kZSA9IGNwdV90b19qZW1vZGUoaWF0dHItPmlhX21vZGUpOwogCWVsc2UKIAkJcmktPm1vZGUgPSBjcHVfdG9famVtb2RlKGlub2RlLT5pX21vZGUpOwogCkBAIC0yMzAsMTYgKzIyNiwyMyBAQAogCWpmZnMyX2RvX2NsZWFyX2lub2RlKGMsIGYpOwogfQogCi12b2lkIGpmZnMyX3JlYWRfaW5vZGUgKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdHJ1Y3QgaW5vZGUgKmpmZnMyX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBpbm8pCiB7CiAJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmY7CiAJc3RydWN0IGpmZnMyX3NiX2luZm8gKmM7CiAJc3RydWN0IGpmZnMyX3Jhd19pbm9kZSBsYXRlc3Rfbm9kZTsKIAl1bmlvbiBqZmZzMl9kZXZpY2Vfbm9kZSBqZGV2OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJZGV2X3QgcmRldiA9IDA7CiAJaW50IHJldDsKIAotCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9yZWFkX2lub2RlKCk6IGlub2RlLT5pX2lubyA9PSAlbHVcbiIsIGlub2RlLT5pX2lubykpOworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9pZ2V0KCk6IGlubyA9PSAlbHVcbiIsIGlubykpOworCisJaW5vZGUgPSBpZ2V0X2xvY2tlZChzYiwgaW5vKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSkKKwkJcmV0dXJuIGlub2RlOwogCiAJZiA9IEpGRlMyX0lOT0RFX0lORk8oaW5vZGUpOwogCWMgPSBKRkZTMl9TQl9JTkZPKGlub2RlLT5pX3NiKTsKQEAgLTI1MCw5ICsyNTMsOSBAQAogCXJldCA9IGpmZnMyX2RvX3JlYWRfaW5vZGUoYywgZiwgaW5vZGUtPmlfaW5vLCAmbGF0ZXN0X25vZGUpOwogCiAJaWYgKHJldCkgewotCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CiAJCXVwKCZmLT5zZW0pOwotCQlyZXR1cm47CisJCWlnZXRfZmFpbGVkKGlub2RlKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKIAl9CiAJaW5vZGUtPmlfbW9kZSA9IGplbW9kZV90b19jcHUobGF0ZXN0X25vZGUubW9kZSk7CiAJaW5vZGUtPmlfdWlkID0gamUxNl90b19jcHUobGF0ZXN0X25vZGUudWlkKTsKQEAgLTMwMywxOSArMzA2LDE0IEBACiAJCWlmIChmLT5tZXRhZGF0YS0+c2l6ZSAhPSBzaXplb2YoamRldi5vbGQpICYmCiAJCSAgICBmLT5tZXRhZGF0YS0+c2l6ZSAhPSBzaXplb2YoamRldi5uZXcpKSB7CiAJCQlwcmludGsoS0VSTl9OT1RJQ0UgIkRldmljZSBub2RlIGhhcyBzdHJhbmdlIHNpemUgJWRcbiIsIGYtPm1ldGFkYXRhLT5zaXplKTsKLQkJCXVwKCZmLT5zZW0pOwotCQkJamZmczJfZG9fY2xlYXJfaW5vZGUoYywgZik7Ci0JCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7Ci0JCQlyZXR1cm47CisJCQlnb3RvIGVycm9yX2lvOwogCQl9CiAJCUQxKHByaW50ayhLRVJOX0RFQlVHICJSZWFkaW5nIGRldmljZSBudW1iZXJzIGZyb20gZmxhc2hcbiIpKTsKLQkJaWYgKGpmZnMyX3JlYWRfZG5vZGUoYywgZiwgZi0+bWV0YWRhdGEsIChjaGFyICopJmpkZXYsIDAsIGYtPm1ldGFkYXRhLT5zaXplKSA8IDApIHsKKwkJcmV0ID0gamZmczJfcmVhZF9kbm9kZShjLCBmLCBmLT5tZXRhZGF0YSwgKGNoYXIgKikmamRldiwgMCwgZi0+bWV0YWRhdGEtPnNpemUpOworCQlpZiAocmV0IDwgMCkgewogCQkJLyogRWVwICovCiAJCQlwcmludGsoS0VSTl9OT1RJQ0UgIlJlYWQgZGV2aWNlIG51bWJlcnMgZm9yIGlub2RlICVsdSBmYWlsZWRcbiIsICh1bnNpZ25lZCBsb25nKWlub2RlLT5pX2lubyk7Ci0JCQl1cCgmZi0+c2VtKTsKLQkJCWpmZnMyX2RvX2NsZWFyX2lub2RlKGMsIGYpOwotCQkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOwotCQkJcmV0dXJuOworCQkJZ290byBlcnJvcjsKIAkJfQogCQlpZiAoZi0+bWV0YWRhdGEtPnNpemUgPT0gc2l6ZW9mKGpkZXYub2xkKSkKIAkJCXJkZXYgPSBvbGRfZGVjb2RlX2RldihqZTE2X3RvX2NwdShqZGV2Lm9sZCkpOwpAQCAtMzM1LDYgKzMzMywxNiBAQAogCXVwKCZmLT5zZW0pOwogCiAJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3JlYWRfaW5vZGUoKSByZXR1cm5pbmdcbiIpKTsKKwl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKwlyZXR1cm4gaW5vZGU7CisKK2Vycm9yX2lvOgorCXJldCA9IC1FSU87CitlcnJvcjoKKwl1cCgmZi0+c2VtKTsKKwlqZmZzMl9kb19jbGVhcl9pbm9kZShjLCBmKTsKKwlpZ2V0X2ZhaWxlZChpbm9kZSk7CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKIH0KIAogdm9pZCBqZmZzMl9kaXJ0eV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQpAQCAtNTIyLDE1ICs1MzAsMTYgQEAKIAlpZiAoKHJldCA9IGpmZnMyX2RvX21vdW50X2ZzKGMpKSkKIAkJZ290byBvdXRfaW5vaGFzaDsKIAotCXJldCA9IC1FSU5WQUw7Ci0KIAlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZG9fZmlsbF9zdXBlcigpOiBHZXR0aW5nIHJvb3QgaW5vZGVcbiIpKTsKLQlyb290X2kgPSBpZ2V0KHNiLCAxKTsKLQlpZiAoaXNfYmFkX2lub2RlKHJvb3RfaSkpIHsKKwlyb290X2kgPSBqZmZzMl9pZ2V0KHNiLCAxKTsKKwlpZiAoSVNfRVJSKHJvb3RfaSkpIHsKIAkJRDEocHJpbnRrKEtFUk5fV0FSTklORyAiZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKSk7Ci0JCWdvdG8gb3V0X3Jvb3RfaTsKKwkJcmV0ID0gUFRSX0VSUihyb290X2kpOworCQlnb3RvIG91dF9yb290OwogCX0KIAorCXJldCA9IC1FTk9NRU07CisKIAlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZG9fZmlsbF9zdXBlcigpOiBkX2FsbG9jX3Jvb3QoKVxuIikpOwogCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdF9pKTsKIAlpZiAoIXNiLT5zX3Jvb3QpCkBAIC01NDYsNiArNTU1LDcgQEAKIAogIG91dF9yb290X2k6CiAJaXB1dChyb290X2kpOworb3V0X3Jvb3Q6CiAJamZmczJfZnJlZV9pbm9fY2FjaGVzKGMpOwogCWpmZnMyX2ZyZWVfcmF3X25vZGVfcmVmcyhjKTsKIAlpZiAoamZmczJfYmxvY2tzX3VzZV92bWFsbG9jKGMpKQpAQCAtNjE1LDkgKzYyNSw5IEBACiAJCSAgIGpmZnMyX2RvX3VubGluaygpIHdvdWxkIG5lZWQgdGhlIGFsbG9jX3NlbSBhbmQgd2UgaGF2ZSBpdC4KIAkJICAgSnVzdCBpZ2V0KCkgaXQsIGFuZCBpZiByZWFkX2lub2RlKCkgaXMgbmVjZXNzYXJ5IHRoYXQncyBPSy4KIAkJKi8KLQkJaW5vZGUgPSBpZ2V0KE9GTklfQlNfMlNGRkooYyksIGludW0pOwotCQlpZiAoIWlub2RlKQotCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCWlub2RlID0gamZmczJfaWdldChPRk5JX0JTXzJTRkZKKGMpLCBpbnVtKTsKKwkJaWYgKElTX0VSUihpbm9kZSkpCisJCQlyZXR1cm4gRVJSX0NBU1QoaW5vZGUpOwogCX0KIAlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSkgewogCQlwcmludGsoS0VSTl9OT1RJQ0UgIkVlcC4gcmVhZF9pbm9kZSgpIGZhaWxlZCBmb3IgaW5vICMldS4gbmxpbmsgJWRcbiIsCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9ub2RlbGlzdC5jIGIvZnMvamZmczIvbm9kZWxpc3QuYwppbmRleCA0YmY4NjA4Li44N2M2ZjU1IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9ub2RlbGlzdC5jCisrKyBiL2ZzL2pmZnMyL25vZGVsaXN0LmMKQEAgLTMyLDE1ICszMiwxOCBAQAogCQlpZiAoKCpwcmV2KS0+bmhhc2ggPT0gbmV3LT5uaGFzaCAmJiAhc3RyY21wKCgqcHJldiktPm5hbWUsIG5ldy0+bmFtZSkpIHsKIAkJCS8qIER1cGxpY2F0ZS4gRnJlZSBvbmUgKi8KIAkJCWlmIChuZXctPnZlcnNpb24gPCAoKnByZXYpLT52ZXJzaW9uKSB7Ci0JCQkJZGJnX2RlbnRsaXN0KCJFZXAhIE1hcmtpbmcgbmV3IGRpcmVudCBub2RlIGlzIG9ic29sZXRlLCBvbGQgaXMgXCIlc1wiLCBpbm8gIyV1XG4iLAorCQkJCWRiZ19kZW50bGlzdCgiRWVwISBNYXJraW5nIG5ldyBkaXJlbnQgbm9kZSBvYnNvbGV0ZSwgb2xkIGlzIFwiJXNcIiwgaW5vICMldVxuIiwKIAkJCQkJKCpwcmV2KS0+bmFtZSwgKCpwcmV2KS0+aW5vKTsKIAkJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgbmV3LT5yYXcpOwogCQkJCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQobmV3KTsKIAkJCX0gZWxzZSB7Ci0JCQkJZGJnX2RlbnRsaXN0KCJtYXJraW5nIG9sZCBkaXJlbnQgXCIlc1wiLCBpbm8gIyV1IGJzb2xldGVcbiIsCisJCQkJZGJnX2RlbnRsaXN0KCJtYXJraW5nIG9sZCBkaXJlbnQgXCIlc1wiLCBpbm8gIyV1IG9ic29sZXRlXG4iLAogCQkJCQkoKnByZXYpLT5uYW1lLCAoKnByZXYpLT5pbm8pOwogCQkJCW5ldy0+bmV4dCA9ICgqcHJldiktPm5leHQ7Ci0JCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsICgoKnByZXYpLT5yYXcpKTsKKwkJCQkvKiBJdCBtYXkgaGF2ZSBiZWVuIGEgJ3BsYWNlaG9sZGVyJyBkZWxldGlvbiBkaXJlbnQsIAorCQkJCSAgIGlmIGpmZnMyX2Nhbl9tYXJrX29ic29sZXRlKCkgKHNlZSBqZmZzMl9kb191bmxpbmsoKSkgKi8KKwkJCQlpZiAoKCpwcmV2KS0+cmF3KQorCQkJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgKCgqcHJldiktPnJhdykpOwogCQkJCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQoKnByZXYpOwogCQkJCSpwcmV2ID0gbmV3OwogCQkJfQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvb3MtbGludXguaCBiL2ZzL2pmZnMyL29zLWxpbnV4LmgKaW5kZXggYmY2NDY4Ni4uMWIxMGQyNSAxMDA2NDQKLS0tIGEvZnMvamZmczIvb3MtbGludXguaAorKysgYi9mcy9qZmZzMi9vcy1saW51eC5oCkBAIC0xNzUsNyArMTc1LDcgQEAKIC8qIGZzLmMgKi8KIGludCBqZmZzMl9zZXRhdHRyIChzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBpYXR0ciAqKTsKIGludCBqZmZzMl9kb19zZXRhdHRyIChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGlhdHRyICopOwotdm9pZCBqZmZzMl9yZWFkX2lub2RlIChzdHJ1Y3QgaW5vZGUgKik7CitzdHJ1Y3QgaW5vZGUgKmpmZnMyX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcpOwogdm9pZCBqZmZzMl9jbGVhcl9pbm9kZSAoc3RydWN0IGlub2RlICopOwogdm9pZCBqZmZzMl9kaXJ0eV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIHN0cnVjdCBpbm9kZSAqamZmczJfbmV3X2lub2RlIChzdHJ1Y3QgaW5vZGUgKmRpcl9pLCBpbnQgbW9kZSwKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3JlYWRpbm9kZS5jIGIvZnMvamZmczIvcmVhZGlub2RlLmMKaW5kZXggNmMxYmEzNS4uZTUxMmE5MyAxMDA2NDQKLS0tIGEvZnMvamZmczIvcmVhZGlub2RlLmMKKysrIGIvZnMvamZmczIvcmVhZGlub2RlLmMKQEAgLTM3LDI0ICszNywyNSBAQAogCiAJQlVHX09OKHRuLT5jc2l6ZSA9PSAwKTsKIAotCWlmICghamZmczJfaXNfd3JpdGVidWZmZXJlZChjKSkKLQkJZ290byBhZGpfYWNjOwotCiAJLyogQ2FsY3VsYXRlIGhvdyBtYW55IGJ5dGVzIHdlcmUgYWxyZWFkeSBjaGVja2VkICovCiAJb2ZzID0gcmVmX29mZnNldChyZWYpICsgc2l6ZW9mKHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUpOwotCWxlbiA9IG9mcyAlIGMtPndidWZfcGFnZXNpemU7Ci0JaWYgKGxpa2VseShsZW4pKQotCQlsZW4gPSBjLT53YnVmX3BhZ2VzaXplIC0gbGVuOworCWxlbiA9IHRuLT5jc2l6ZTsKIAotCWlmIChsZW4gPj0gdG4tPmNzaXplKSB7Ci0JCWRiZ19yZWFkaW5vZGUoIm5vIG5lZWQgdG8gY2hlY2sgbm9kZSBhdCAlIzA4eCwgZGF0YSBsZW5ndGggJXUsIGRhdGEgc3RhcnRzIGF0ICUjMDh4IC0gaXQgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkLlxuIiwKLQkJCXJlZl9vZmZzZXQocmVmKSwgdG4tPmNzaXplLCBvZnMpOwotCQlnb3RvIGFkal9hY2M7CisJaWYgKGpmZnMyX2lzX3dyaXRlYnVmZmVyZWQoYykpIHsKKwkJaW50IGFkaiA9IG9mcyAlIGMtPndidWZfcGFnZXNpemU7CisJCWlmIChsaWtlbHkoYWRqKSkKKwkJCWFkaiA9IGMtPndidWZfcGFnZXNpemUgLSBhZGo7CisKKwkJaWYgKGFkaiA+PSB0bi0+Y3NpemUpIHsKKwkJCWRiZ19yZWFkaW5vZGUoIm5vIG5lZWQgdG8gY2hlY2sgbm9kZSBhdCAlIzA4eCwgZGF0YSBsZW5ndGggJXUsIGRhdGEgc3RhcnRzIGF0ICUjMDh4IC0gaXQgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkLlxuIiwKKwkJCQkgICAgICByZWZfb2Zmc2V0KHJlZiksIHRuLT5jc2l6ZSwgb2ZzKTsKKwkJCWdvdG8gYWRqX2FjYzsKKwkJfQorCisJCW9mcyArPSBhZGo7CisJCWxlbiAtPSBhZGo7CiAJfQogCi0Jb2ZzICs9IGxlbjsKLQlsZW4gPSB0bi0+Y3NpemUgLSBsZW47Ci0KIAlkYmdfcmVhZGlub2RlKCJjaGVjayBub2RlIGF0ICUjMDh4LCBkYXRhIGxlbmd0aCAldSwgcGFydGlhbCBDUkMgJSMwOHgsIGNvcnJlY3QgQ1JDICUjMDh4LCBkYXRhIHN0YXJ0cyBhdCAlIzA4eCwgc3RhcnQgY2hlY2tpbmcgZnJvbSAlIzA4eCAtICV1IGJ5dGVzLlxuIiwKIAkJcmVmX29mZnNldChyZWYpLCB0bi0+Y3NpemUsIHRuLT5wYXJ0aWFsX2NyYywgdG4tPmRhdGFfY3JjLCBvZnMgLSBsZW4sIG9mcywgbGVuKTsKIApAQCAtNjMsNyArNjQsNyBAQAogCSAqIGFkZGluZyBhbmQgamZmczJfZmxhc2hfcmVhZF9lbmQoKSBpbnRlcmZhY2UuICovCiAJaWYgKGMtPm10ZC0+cG9pbnQpIHsKIAkJZXJyID0gYy0+bXRkLT5wb2ludChjLT5tdGQsIG9mcywgbGVuLCAmcmV0bGVuLCAmYnVmZmVyKTsKLQkJaWYgKCFlcnIgJiYgcmV0bGVuIDwgdG4tPmNzaXplKSB7CisJCWlmICghZXJyICYmIHJldGxlbiA8IGxlbikgewogCQkJSkZGUzJfV0FSTklORygiTVREIHBvaW50IHJldHVybmVkIGxlbiB0b28gc2hvcnQ6ICV6dSBpbnN0ZWFkIG9mICV1LlxuIiwgcmV0bGVuLCB0bi0+Y3NpemUpOwogCQkJYy0+bXRkLT51bnBvaW50KGMtPm10ZCwgYnVmZmVyLCBvZnMsIHJldGxlbik7CiAJCX0gZWxzZSBpZiAoZXJyKQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvc3VwZXIuYyBiL2ZzL2pmZnMyL3N1cGVyLmMKaW5kZXggZmZhNDQ3NS4uNDY3NzM1NSAxMDA2NDQKLS0tIGEvZnMvamZmczIvc3VwZXIuYworKysgYi9mcy9qZmZzMi9zdXBlci5jCkBAIC02NSw3ICs2NSw2IEBACiB7CiAJLmFsbG9jX2lub2RlID0JamZmczJfYWxsb2NfaW5vZGUsCiAJLmRlc3Ryb3lfaW5vZGUgPWpmZnMyX2Rlc3Ryb3lfaW5vZGUsCi0JLnJlYWRfaW5vZGUgPQlqZmZzMl9yZWFkX2lub2RlLAogCS5wdXRfc3VwZXIgPQlqZmZzMl9wdXRfc3VwZXIsCiAJLndyaXRlX3N1cGVyID0JamZmczJfd3JpdGVfc3VwZXIsCiAJLnN0YXRmcyA9CWpmZnMyX3N0YXRmcywKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3dyaXRlLmMgYi9mcy9qZmZzMi93cml0ZS5jCmluZGV4IDE0N2UyY2IuLjc3NmYxM2MgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL3dyaXRlLmMKKysrIGIvZnMvamZmczIvd3JpdGUuYwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAJCXZvaWQgKmhvbGRfZXJyID0gZm4tPnJhdzsKIAkJLyogUmVsZWFzZSB0aGUgZnVsbF9kbm9kZSB3aGljaCBpcyBub3cgdXNlbGVzcywgYW5kIHJldHVybiAqLwogCQlqZmZzMl9mcmVlX2Z1bGxfZG5vZGUoZm4pOwotCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKGhvbGRfZXJyKSk7CisJCXJldHVybiBFUlJfQ0FTVChob2xkX2Vycik7CiAJfQogCWZuLT5vZnMgPSBqZTMyX3RvX2NwdShyaS0+b2Zmc2V0KTsKIAlmbi0+c2l6ZSA9IGplMzJfdG9fY3B1KHJpLT5kc2l6ZSk7CkBAIC0zMTMsNyArMzEzLDcgQEAKIAkJdm9pZCAqaG9sZF9lcnIgPSBmZC0+cmF3OwogCQkvKiBSZWxlYXNlIHRoZSBmdWxsX2RpcmVudCB3aGljaCBpcyBub3cgdXNlbGVzcywgYW5kIHJldHVybiAqLwogCQlqZmZzMl9mcmVlX2Z1bGxfZGlyZW50KGZkKTsKLQkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihob2xkX2VycikpOworCQlyZXR1cm4gRVJSX0NBU1QoaG9sZF9lcnIpOwogCX0KIAogCWlmIChyZXRyaWVkKSB7CkBAIC01ODIsNyArNTgyLDcgQEAKIAkJamZmczJfYWRkX2ZkX3RvX2xpc3QoYywgZmQsICZkaXJfZi0+ZGVudHMpOwogCQl1cCgmZGlyX2YtPnNlbSk7CiAJfSBlbHNlIHsKLQkJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICoqcHJldiA9ICZkaXJfZi0+ZGVudHM7CisJCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQgPSBkaXJfZi0+ZGVudHM7CiAJCXVpbnQzMl90IG5oYXNoID0gZnVsbF9uYW1lX2hhc2gobmFtZSwgbmFtZWxlbik7CiAKIAkJLyogV2UgZG9uJ3QgYWN0dWFsbHkgd2FudCB0byByZXNlcnZlIGFueSBzcGFjZSwgYnV0IHdlIGRvCkBAIC01OTAsMjEgKzU5MCwyMiBAQAogCQlkb3duKCZjLT5hbGxvY19zZW0pOwogCQlkb3duKCZkaXJfZi0+c2VtKTsKIAotCQl3aGlsZSAoKCpwcmV2KSAmJiAoKnByZXYpLT5uaGFzaCA8PSBuaGFzaCkgewotCQkJaWYgKCgqcHJldiktPm5oYXNoID09IG5oYXNoICYmCi0JCQkgICAgIW1lbWNtcCgoKnByZXYpLT5uYW1lLCBuYW1lLCBuYW1lbGVuKSAmJgotCQkJICAgICEoKnByZXYpLT5uYW1lW25hbWVsZW5dKSB7Ci0JCQkJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICp0aGlzID0gKnByZXY7CisJCWZvciAoZmQgPSBkaXJfZi0+ZGVudHM7IGZkOyBmZCA9IGZkLT5uZXh0KSB7CisJCQlpZiAoZmQtPm5oYXNoID09IG5oYXNoICYmCisJCQkgICAgIW1lbWNtcChmZC0+bmFtZSwgbmFtZSwgbmFtZWxlbikgJiYKKwkJCSAgICAhZmQtPm5hbWVbbmFtZWxlbl0pIHsKIAogCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJNYXJraW5nIG9sZCBkaXJlbnQgbm9kZSAoaW5vICMldSkgQCUwOHggb2Jzb2xldGVcbiIsCi0JCQkJCSAgdGhpcy0+aW5vLCByZWZfb2Zmc2V0KHRoaXMtPnJhdykpKTsKLQotCQkJCSpwcmV2ID0gdGhpcy0+bmV4dDsKLQkJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgKHRoaXMtPnJhdykpOwotCQkJCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQodGhpcyk7CisJCQkJCSAgZmQtPmlubywgcmVmX29mZnNldChmZC0+cmF3KSkpOworCQkJCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCBmZC0+cmF3KTsKKwkJCQkvKiBXZSBkb24ndCB3YW50IHRvIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0IGltbWVkaWF0ZWx5LAorCQkJCSAgIGJlY2F1c2UgdGhhdCBzY3Jld3MgdXAgZ2V0ZGVudHMoKS9zZWVrKCkgc2VtYW50aWNzIGV2ZW4KKwkJCQkgICBtb3JlIHRoYW4gdGhleSdyZSBzY3Jld2VkIGFscmVhZHkuIFR1cm4gaXQgaW50byBhCisJCQkJICAgbm9kZS1sZXNzIGRlbGV0aW9uIGRpcmVudCBpbnN0ZWFkIC0tIGEgcGxhY2Vob2xkZXIgKi8KKwkJCQlmZC0+cmF3ID0gTlVMTDsKKwkJCQlmZC0+aW5vID0gMDsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXByZXYgPSAmKCgqcHJldiktPm5leHQpOwogCQl9CiAJCXVwKCZkaXJfZi0+c2VtKTsKIAl9CkBAIC02MzAsNyArNjMxLDggQEAKIAkJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlJlbW92aW5nIGRlbGV0aW9uIGRpcmVudCBmb3IgXCIlc1wiIGZyb20gZGlyIGlubyAjJXVcbiIsCiAJCQkJCQlmZC0+bmFtZSwgZGVhZF9mLT5pbm9jYWNoZS0+aW5vKSk7CiAJCQkJfQotCQkJCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCBmZC0+cmF3KTsKKwkJCQlpZiAoZmQtPnJhdykKKwkJCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIGZkLT5yYXcpOwogCQkJCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQoZmQpOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9mcy9qZnMvZmlsZS5jIGIvZnMvamZzL2ZpbGUuYwppbmRleCA4N2ViOTM2Li43ZjYwNjNhIDEwMDY0NAotLS0gYS9mcy9qZnMvZmlsZS5jCisrKyBiL2ZzL2pmcy9maWxlLmMKQEAgLTExMiw1ICsxMTIsOCBAQAogCS5zcGxpY2Vfd3JpdGUJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3dyaXRlLAogCS5mc3luYwkJPSBqZnNfZnN5bmMsCiAJLnJlbGVhc2UJPSBqZnNfcmVsZWFzZSwKLQkuaW9jdGwJCT0gamZzX2lvY3RsLAorCS51bmxvY2tlZF9pb2N0bCA9IGpmc19pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bAk9IGpmc19jb21wYXRfaW9jdGwsCisjZW5kaWYKIH07CmRpZmYgLS1naXQgYS9mcy9qZnMvaW5vZGUuYyBiL2ZzL2pmcy9pbm9kZS5jCmluZGV4IDQ2NzIwMTMuLjIxMDMzOTcgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9pbm9kZS5jCisrKyBiL2ZzL2pmcy9pbm9kZS5jCkBAIC0zMSwxMSArMzEsMjEgQEAKICNpbmNsdWRlICJqZnNfZGVidWcuaCIKIAogCi12b2lkIGpmc19yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdHJ1Y3QgaW5vZGUgKmpmc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgaW5vKQogewotCWlmIChkaVJlYWQoaW5vZGUpKSB7Ci0JCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKLQkJcmV0dXJuOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IHJldDsKKworCWlub2RlID0gaWdldF9sb2NrZWQoc2IsIGlubyk7CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykpCisJCXJldHVybiBpbm9kZTsKKworCXJldCA9IGRpUmVhZChpbm9kZSk7CisJaWYgKHJldCA8IDApIHsKKwkJaWdldF9mYWlsZWQoaW5vZGUpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCX0KIAogCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CkBAIC01NSw2ICs2NSw4IEBACiAJCWlub2RlLT5pX29wID0gJmpmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CiAJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgaW5vZGUtPmlfcmRldik7CiAJfQorCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCXJldHVybiBpbm9kZTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL2pmcy9pb2N0bC5jIGIvZnMvamZzL2lvY3RsLmMKaW5kZXggZGZkYTEyYS4uYTFmOGUzNyAxMDA2NDQKLS0tIGEvZnMvamZzL2lvY3RsLmMKKysrIGIvZnMvamZzL2lvY3RsLmMKQEAgLTUxLDkgKzUxLDkgQEAKIH0KIAogCi1pbnQgamZzX2lvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHAsIHVuc2lnbmVkIGludCBjbWQsCi0JCXVuc2lnbmVkIGxvbmcgYXJnKQorbG9uZyBqZnNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogeworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgamZzX2lub2RlX2luZm8gKmpmc19pbm9kZSA9IEpGU19JUChpbm9kZSk7CiAJdW5zaWduZWQgaW50IGZsYWdzOwogCkBAIC04Miw2ICs4MiwxMCBAQAogCQkvKiBJcyBpdCBxdW90YSBmaWxlPyBEbyBub3QgYWxsb3cgdXNlciB0byBtZXNzIHdpdGggaXQgKi8KIAkJaWYgKElTX05PUVVPVEEoaW5vZGUpKQogCQkJcmV0dXJuIC1FUEVSTTsKKworCQkvKiBMb2NrIGFnYWluc3Qgb3RoZXIgcGFyYWxsZWwgY2hhbmdlcyBvZiBmbGFncyAqLworCQltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisKIAkJamZzX2dldF9pbm9kZV9mbGFncyhqZnNfaW5vZGUpOwogCQlvbGRmbGFncyA9IGpmc19pbm9kZS0+bW9kZTI7CiAKQEAgLTkyLDggKzk2LDEwIEBACiAJCWlmICgob2xkZmxhZ3MgJiBKRlNfSU1NVVRBQkxFX0ZMKSB8fAogCQkJKChmbGFncyBeIG9sZGZsYWdzKSAmCiAJCQkoSkZTX0FQUEVORF9GTCB8IEpGU19JTU1VVEFCTEVfRkwpKSkgewotCQkJaWYgKCFjYXBhYmxlKENBUF9MSU5VWF9JTU1VVEFCTEUpKQorCQkJaWYgKCFjYXBhYmxlKENBUF9MSU5VWF9JTU1VVEFCTEUpKSB7CisJCQkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCX0KIAkJfQogCiAJCWZsYWdzID0gZmxhZ3MgJiBKRlNfRkxfVVNFUl9NT0RJRklBQkxFOwpAQCAtMTAxLDYgKzEwNyw3IEBACiAJCWpmc19pbm9kZS0+bW9kZTIgPSBmbGFnczsKIAogCQlqZnNfc2V0X2lub2RlX2ZsYWdzKGlub2RlKTsKKwkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKIAkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJCXJldHVybiAwOwpAQCAtMTEwLDMgKzExNywyMSBAQAogCX0KIH0KIAorI2lmZGVmIENPTkZJR19DT01QQVQKK2xvbmcgamZzX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJLyogV2hpbGUgdGhlc2UgaW9jdGwgbnVtYmVycyBkZWZpbmVkIHdpdGggJ2xvbmcnIGFuZCBoYXZlIGRpZmZlcmVudAorCSAqIG51bWJlcnMgdGhhbiB0aGUgNjRiaXQgQUJJLAorCSAqIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb25seSBkZWFscyB3aXRoIGludHMgYW5kIGlzIGNvbXBhdGlibGUuCisJICovCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEpGU19JT0NfR0VURkxBR1MzMjoKKwkJY21kID0gSkZTX0lPQ19HRVRGTEFHUzsKKwkJYnJlYWs7CisJY2FzZSBKRlNfSU9DX1NFVEZMQUdTMzI6CisJCWNtZCA9IEpGU19JT0NfU0VURkxBR1M7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gamZzX2lvY3RsKGZpbHAsIGNtZCwgYXJnKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19kaW5vZGUuaCBiL2ZzL2pmcy9qZnNfZGlub2RlLmgKaW5kZXggYzM4NzU0MC4uMzk1YzRjMCAxMDA2NDQKLS0tIGEvZnMvamZzL2pmc19kaW5vZGUuaAorKysgYi9mcy9qZnMvamZzX2Rpbm9kZS5oCkBAIC0xNzAsNSArMTcwLDcgQEAKICNkZWZpbmUgSkZTX0lPQ19HRVRGTEFHUwlfSU9SKCdmJywgMSwgbG9uZykKICNkZWZpbmUgSkZTX0lPQ19TRVRGTEFHUwlfSU9XKCdmJywgMiwgbG9uZykKIAorI2RlZmluZSBKRlNfSU9DX0dFVEZMQUdTMzIJX0lPUignZicsIDEsIGludCkKKyNkZWZpbmUgSkZTX0lPQ19TRVRGTEFHUzMyCV9JT1coJ2YnLCAyLCBpbnQpCiAKICNlbmRpZiAvKl9IX0pGU19ESU5PREUgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfaW5vZGUuaCBiL2ZzL2pmcy9qZnNfaW5vZGUuaAppbmRleCA4ZTJjZjJjLi5hZGIyZmFmIDEwMDY0NAotLS0gYS9mcy9qZnMvamZzX2lub2RlLmgKKysrIGIvZnMvamZzL2pmc19pbm9kZS5oCkBAIC0yMiw5ICsyMiw5IEBACiAKIGV4dGVybiBzdHJ1Y3QgaW5vZGUgKmlhbGxvYyhzdHJ1Y3QgaW5vZGUgKiwgdW1vZGVfdCk7CiBleHRlcm4gaW50IGpmc19mc3luYyhzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7Ci1leHRlcm4gaW50IGpmc19pb2N0bChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKiwKLQkJCXVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7Ci1leHRlcm4gdm9pZCBqZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gbG9uZyBqZnNfaW9jdGwoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiBsb25nIGpmc19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiBzdHJ1Y3QgaW5vZGUgKmpmc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1bnNpZ25lZCBsb25nKTsKIGV4dGVybiBpbnQgamZzX2NvbW1pdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKIGV4dGVybiBpbnQgamZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSosIGludCk7CiBleHRlcm4gdm9pZCBqZnNfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKZGlmZiAtLWdpdCBhL2ZzL2pmcy9uYW1laS5jIGIvZnMvamZzL25hbWVpLmMKaW5kZXggZjg3MThkZS4uMGJhNjc3OCAxMDA2NDQKLS0tIGEvZnMvamZzL25hbWVpLmMKKysrIGIvZnMvamZzL25hbWVpLmMKQEAgLTE0NjIsMTIgKzE0NjIsMTAgQEAKIAkJfQogCX0KIAotCWlwID0gaWdldChkaXAtPmlfc2IsIGludW0pOwotCWlmIChpcCA9PSBOVUxMIHx8IGlzX2JhZF9pbm9kZShpcCkpIHsKKwlpcCA9IGpmc19pZ2V0KGRpcC0+aV9zYiwgaW51bSk7CisJaWYgKElTX0VSUihpcCkpIHsKIAkJamZzX2VycigiamZzX2xvb2t1cDogaWdldCBmYWlsZWQgb24gaW51bSAlZCIsICh1aW50KSBpbnVtKTsKLQkJaWYgKGlwKQotCQkJaXB1dChpcCk7Ci0JCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCQlyZXR1cm4gRVJSX0NBU1QoaXApOwogCX0KIAogCWRlbnRyeSA9IGRfc3BsaWNlX2FsaWFzKGlwLCBkZW50cnkpOwpAQCAtMTQ4NSwxMiArMTQ4MywxMSBAQAogCiAJaWYgKGlubyA9PSAwKQogCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKLQlpbm9kZSA9IGlnZXQoc2IsIGlubyk7Ci0JaWYgKGlub2RlID09IE5VTEwpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWlub2RlID0gamZzX2lnZXQoc2IsIGlubyk7CisJaWYgKElTX0VSUihpbm9kZSkpCisJCXJldHVybiBFUlJfQ0FTVChpbm9kZSk7CiAKLQlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSB8fAotCSAgICAoZ2VuZXJhdGlvbiAmJiBpbm9kZS0+aV9nZW5lcmF0aW9uICE9IGdlbmVyYXRpb24pKSB7CisJaWYgKGdlbmVyYXRpb24gJiYgaW5vZGUtPmlfZ2VuZXJhdGlvbiAhPSBnZW5lcmF0aW9uKSB7CiAJCWlwdXQoaW5vZGUpOwogCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKIAl9CkBAIC0xNTIxLDE3ICsxNTE4LDE0IEBACiAKIAlwYXJlbnRfaW5vID0KIAkJbGUzMl90b19jcHUoSkZTX0lQKGRlbnRyeS0+ZF9pbm9kZSktPmlfZHRyb290LmhlYWRlci5pZG90ZG90KTsKLQlpbm9kZSA9IGlnZXQoc2IsIHBhcmVudF9pbm8pOwotCWlmIChpbm9kZSkgewotCQlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSkgeworCWlub2RlID0gamZzX2lnZXQoc2IsIHBhcmVudF9pbm8pOworCWlmIChJU19FUlIoaW5vZGUpKSB7CisJCXBhcmVudCA9IEVSUl9DQVNUKGlub2RlKTsKKwl9IGVsc2UgeworCQlwYXJlbnQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOworCQlpZiAoIXBhcmVudCkgeworCQkJcGFyZW50ID0gRVJSX1BUUigtRU5PTUVNKTsKIAkJCWlwdXQoaW5vZGUpOwotCQkJcGFyZW50ID0gRVJSX1BUUigtRUFDQ0VTKTsKLQkJfSBlbHNlIHsKLQkJCXBhcmVudCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7Ci0JCQlpZiAoIXBhcmVudCkgewotCQkJCXBhcmVudCA9IEVSUl9QVFIoLUVOT01FTSk7Ci0JCQkJaXB1dChpbm9kZSk7Ci0JCQl9CiAJCX0KIAl9CiAKQEAgLTE1NjIsNyArMTU1NiwxMCBAQAogCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCiAJLnJlYWRkaXIJPSBqZnNfcmVhZGRpciwKIAkuZnN5bmMJCT0gamZzX2ZzeW5jLAotCS5pb2N0bAkJPSBqZnNfaW9jdGwsCisJLnVubG9ja2VkX2lvY3RsID0gamZzX2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsCT0gamZzX2NvbXBhdF9pb2N0bCwKKyNlbmRpZgogfTsKIAogc3RhdGljIGludCBqZnNfY2lfaGFzaChzdHJ1Y3QgZGVudHJ5ICpkaXIsIHN0cnVjdCBxc3RyICp0aGlzKQpkaWZmIC0tZ2l0IGEvZnMvamZzL3N1cGVyLmMgYi9mcy9qZnMvc3VwZXIuYwppbmRleCA3MGExNDAwLi41MGVhNjU0IDEwMDY0NAotLS0gYS9mcy9qZnMvc3VwZXIuYworKysgYi9mcy9qZnMvc3VwZXIuYwpAQCAtNDE0LDcgKzQxNCw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlpbnQgcmM7CiAJczY0IG5ld0xWU2l6ZSA9IDA7Ci0JaW50IGZsYWc7CisJaW50IGZsYWcsIHJldCA9IC1FSU5WQUw7CiAKIAlqZnNfaW5mbygiSW4gamZzX3JlYWRfc3VwZXI6IHNfZmxhZ3M9MHglbHgiLCBzYi0+c19mbGFncyk7CiAKQEAgLTQ2MSw4ICs0NjEsMTAgQEAKIAkgKiBJbml0aWFsaXplIGRpcmVjdC1tYXBwaW5nIGlub2RlL2FkZHJlc3Mtc3BhY2UKIAkgKi8KIAlpbm9kZSA9IG5ld19pbm9kZShzYik7Ci0JaWYgKGlub2RlID09IE5VTEwpCisJaWYgKGlub2RlID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXRfa2ZyZWU7CisJfQogCWlub2RlLT5pX2lubyA9IDA7CiAJaW5vZGUtPmlfbmxpbmsgPSAxOwogCWlub2RlLT5pX3NpemUgPSBzYi0+c19iZGV2LT5iZF9pbm9kZS0+aV9zaXplOwpAQCAtNDk0LDkgKzQ5NiwxMSBAQAogCiAJc2ItPnNfbWFnaWMgPSBKRlNfU1VQRVJfTUFHSUM7CiAKLQlpbm9kZSA9IGlnZXQoc2IsIFJPT1RfSSk7Ci0JaWYgKCFpbm9kZSB8fCBpc19iYWRfaW5vZGUoaW5vZGUpKQorCWlub2RlID0gamZzX2lnZXQoc2IsIFJPT1RfSSk7CisJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihpbm9kZSk7CiAJCWdvdG8gb3V0X25vX3Jvb3Q7CisJfQogCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3QoaW5vZGUpOwogCWlmICghc2ItPnNfcm9vdCkKIAkJZ290byBvdXRfbm9fcm9vdDsKQEAgLTUzNiw3ICs1NDAsNyBAQAogCWlmIChzYmktPm5sc190YWIpCiAJCXVubG9hZF9ubHMoc2JpLT5ubHNfdGFiKTsKIAlrZnJlZShzYmkpOwotCXJldHVybiAtRUlOVkFMOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGpmc193cml0ZV9zdXBlcl9sb2NrZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKQEAgLTcyNiw3ICs3MzAsNiBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGpmc19zdXBlcl9vcGVyYXRpb25zID0gewogCS5hbGxvY19pbm9kZQk9IGpmc19hbGxvY19pbm9kZSwKIAkuZGVzdHJveV9pbm9kZQk9IGpmc19kZXN0cm95X2lub2RlLAotCS5yZWFkX2lub2RlCT0gamZzX3JlYWRfaW5vZGUsCiAJLmRpcnR5X2lub2RlCT0gamZzX2RpcnR5X2lub2RlLAogCS53cml0ZV9pbm9kZQk9IGpmc193cml0ZV9pbm9kZSwKIAkuZGVsZXRlX2lub2RlCT0gamZzX2RlbGV0ZV9pbm9kZSwKZGlmZiAtLWdpdCBhL2ZzL2xpYmZzLmMgYi9mcy9saWJmcy5jCmluZGV4IDU1MjNiZGUuLmIwMDRkZmEgMTAwNjQ0Ci0tLSBhL2ZzL2xpYmZzLmMKKysrIGIvZnMvbGliZnMuYwpAQCAtNTgzLDggKzU4Myw4IEBACiAvKiBTaW1wbGUgYXR0cmlidXRlIGZpbGVzICovCiAKIHN0cnVjdCBzaW1wbGVfYXR0ciB7Ci0JdTY0ICgqZ2V0KSh2b2lkICopOwotCXZvaWQgKCpzZXQpKHZvaWQgKiwgdTY0KTsKKwlpbnQgKCpnZXQpKHZvaWQgKiwgdTY0ICopOworCWludCAoKnNldCkodm9pZCAqLCB1NjQpOwogCWNoYXIgZ2V0X2J1ZlsyNF07CS8qIGVub3VnaCB0byBzdG9yZSBhIHU2NCBhbmQgIlxuXDAiICovCiAJY2hhciBzZXRfYnVmWzI0XTsKIAl2b2lkICpkYXRhOwpAQCAtNTk1LDcgKzU5NSw3IEBACiAvKiBzaW1wbGVfYXR0cl9vcGVuIGlzIGNhbGxlZCBieSBhbiBhY3R1YWwgYXR0cmlidXRlIG9wZW4gZmlsZSBvcGVyYXRpb24KICAqIHRvIHNldCB0aGUgYXR0cmlidXRlIHNwZWNpZmljIGFjY2VzcyBvcGVyYXRpb25zLiAqLwogaW50IHNpbXBsZV9hdHRyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCSAgICAgdTY0ICgqZ2V0KSh2b2lkICopLCB2b2lkICgqc2V0KSh2b2lkICosIHU2NCksCisJCSAgICAgaW50ICgqZ2V0KSh2b2lkICosIHU2NCAqKSwgaW50ICgqc2V0KSh2b2lkICosIHU2NCksCiAJCSAgICAgY29uc3QgY2hhciAqZm10KQogewogCXN0cnVjdCBzaW1wbGVfYXR0ciAqYXR0cjsKQEAgLTYxNSw3ICs2MTUsNyBAQAogCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKIH0KIAotaW50IHNpbXBsZV9hdHRyX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoraW50IHNpbXBsZV9hdHRyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJa2ZyZWUoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKIAlyZXR1cm4gMDsKQEAgLTYzNCwxNSArNjM0LDI0IEBACiAJaWYgKCFhdHRyLT5nZXQpCiAJCXJldHVybiAtRUFDQ0VTOwogCi0JbXV0ZXhfbG9jaygmYXR0ci0+bXV0ZXgpOwotCWlmICgqcHBvcykgLyogY29udGludWVkIHJlYWQgKi8KKwlyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmF0dHItPm11dGV4KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKCpwcG9zKSB7CQkvKiBjb250aW51ZWQgcmVhZCAqLwogCQlzaXplID0gc3RybGVuKGF0dHItPmdldF9idWYpOwotCWVsc2UJICAvKiBmaXJzdCByZWFkICovCisJfSBlbHNlIHsJCS8qIGZpcnN0IHJlYWQgKi8KKwkJdTY0IHZhbDsKKwkJcmV0ID0gYXR0ci0+Z2V0KGF0dHItPmRhdGEsICZ2YWwpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisKIAkJc2l6ZSA9IHNjbnByaW50ZihhdHRyLT5nZXRfYnVmLCBzaXplb2YoYXR0ci0+Z2V0X2J1ZiksCi0JCQkJIGF0dHItPmZtdCwKLQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylhdHRyLT5nZXQoYXR0ci0+ZGF0YSkpOworCQkJCSBhdHRyLT5mbXQsICh1bnNpZ25lZCBsb25nIGxvbmcpdmFsKTsKKwl9CiAKIAlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGxlbiwgcHBvcywgYXR0ci0+Z2V0X2J1Ziwgc2l6ZSk7CitvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZhdHRyLT5tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTY1NywxMSArNjY2LDEzIEBACiAJc3NpemVfdCByZXQ7CiAKIAlhdHRyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCiAJaWYgKCFhdHRyLT5zZXQpCiAJCXJldHVybiAtRUFDQ0VTOwogCi0JbXV0ZXhfbG9jaygmYXR0ci0+bXV0ZXgpOworCXJldCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmYXR0ci0+bXV0ZXgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlyZXQgPSAtRUZBVUxUOwogCXNpemUgPSBtaW4oc2l6ZW9mKGF0dHItPnNldF9idWYpIC0gMSwgbGVuKTsKIAlpZiAoY29weV9mcm9tX3VzZXIoYXR0ci0+c2V0X2J1ZiwgYnVmLCBzaXplKSkKQEAgLTc5Myw2ICs4MDQsNiBAQAogRVhQT1JUX1NZTUJPTChzaW1wbGVfdHJhbnNhY3Rpb25fcmVhZCk7CiBFWFBPUlRfU1lNQk9MKHNpbXBsZV90cmFuc2FjdGlvbl9yZWxlYXNlKTsKIEVYUE9SVF9TWU1CT0xfR1BMKHNpbXBsZV9hdHRyX29wZW4pOwotRVhQT1JUX1NZTUJPTF9HUEwoc2ltcGxlX2F0dHJfY2xvc2UpOworRVhQT1JUX1NZTUJPTF9HUEwoc2ltcGxlX2F0dHJfcmVsZWFzZSk7CiBFWFBPUlRfU1lNQk9MX0dQTChzaW1wbGVfYXR0cl9yZWFkKTsKIEVYUE9SVF9TWU1CT0xfR1BMKHNpbXBsZV9hdHRyX3dyaXRlKTsKZGlmZiAtLWdpdCBhL2ZzL2xvY2tzLmMgYi9mcy9sb2Nrcy5jCmluZGV4IDQ5MzU0YjkuLmYzNmYwZTYgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tzLmMKKysrIGIvZnMvbG9ja3MuYwpAQCAtNjU4LDggKzY1OCw3IEBACiAJaWYgKGNmbCkgewogCQlfX2xvY2tzX2NvcHlfbG9jayhmbCwgY2ZsKTsKIAkJaWYgKGNmbC0+ZmxfbnNwaWQpCi0JCQlmbC0+ZmxfcGlkID0gcGlkX25yX25zKGNmbC0+ZmxfbnNwaWQsCi0JCQkJCQl0YXNrX2FjdGl2ZV9waWRfbnMoY3VycmVudCkpOworCQkJZmwtPmZsX3BpZCA9IHBpZF92bnIoY2ZsLT5mbF9uc3BpZCk7CiAJfSBlbHNlCiAJCWZsLT5mbF90eXBlID0gRl9VTkxDSzsKIAl1bmxvY2tfa2VybmVsKCk7CkBAIC0yMDg0LDcgKzIwODMsNyBAQAogCXVuc2lnbmVkIGludCBmbF9waWQ7CiAKIAlpZiAoZmwtPmZsX25zcGlkKQotCQlmbF9waWQgPSBwaWRfbnJfbnMoZmwtPmZsX25zcGlkLCB0YXNrX2FjdGl2ZV9waWRfbnMoY3VycmVudCkpOworCQlmbF9waWQgPSBwaWRfdm5yKGZsLT5mbF9uc3BpZCk7CiAJZWxzZQogCQlmbF9waWQgPSBmbC0+ZmxfcGlkOwogCmRpZmYgLS1naXQgYS9mcy9taW5peC9pbm9kZS5jIGIvZnMvbWluaXgvaW5vZGUuYwppbmRleCBiZjRjZDMxLi44NGY2MjQyIDEwMDY0NAotLS0gYS9mcy9taW5peC9pbm9kZS5jCisrKyBiL2ZzL21pbml4L2lub2RlLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9oaWdodWlkLmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CiAKLXN0YXRpYyB2b2lkIG1pbml4X3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpOwogc3RhdGljIGludCBtaW5peF93cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgaW50IHdhaXQpOwogc3RhdGljIGludCBtaW5peF9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKTsKIHN0YXRpYyBpbnQgbWluaXhfcmVtb3VudCAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGludCAqIGZsYWdzLCBjaGFyICogZGF0YSk7CkBAIC05Niw3ICs5NSw2IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgbWluaXhfc29wcyA9IHsKIAkuYWxsb2NfaW5vZGUJPSBtaW5peF9hbGxvY19pbm9kZSwKIAkuZGVzdHJveV9pbm9kZQk9IG1pbml4X2Rlc3Ryb3lfaW5vZGUsCi0JLnJlYWRfaW5vZGUJPSBtaW5peF9yZWFkX2lub2RlLAogCS53cml0ZV9pbm9kZQk9IG1pbml4X3dyaXRlX2lub2RlLAogCS5kZWxldGVfaW5vZGUJPSBtaW5peF9kZWxldGVfaW5vZGUsCiAJLnB1dF9zdXBlcgk9IG1pbml4X3B1dF9zdXBlciwKQEAgLTE0OSw2ICsxNDcsNyBAQAogCXVuc2lnbmVkIGxvbmcgaSwgYmxvY2s7CiAJc3RydWN0IGlub2RlICpyb290X2lub2RlOwogCXN0cnVjdCBtaW5peF9zYl9pbmZvICpzYmk7CisJaW50IHJldCA9IC1FSU5WQUw7CiAKIAlzYmkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWluaXhfc2JfaW5mbyksIEdGUF9LRVJORUwpOwogCWlmICghc2JpKQpAQCAtMjQ2LDEwICsyNDUsMTMgQEAKIAogCS8qIHNldCB1cCBlbm91Z2ggc28gdGhhdCBpdCBjYW4gcmVhZCBhbiBpbm9kZSAqLwogCXMtPnNfb3AgPSAmbWluaXhfc29wczsKLQlyb290X2lub2RlID0gaWdldChzLCBNSU5JWF9ST09UX0lOTyk7Ci0JaWYgKCFyb290X2lub2RlIHx8IGlzX2JhZF9pbm9kZShyb290X2lub2RlKSkKKwlyb290X2lub2RlID0gbWluaXhfaWdldChzLCBNSU5JWF9ST09UX0lOTyk7CisJaWYgKElTX0VSUihyb290X2lub2RlKSkgeworCQlyZXQgPSBQVFJfRVJSKHJvb3RfaW5vZGUpOwogCQlnb3RvIG91dF9ub19yb290OworCX0KIAorCXJldCA9IC1FTk9NRU07CiAJcy0+c19yb290ID0gZF9hbGxvY19yb290KHJvb3RfaW5vZGUpOwogCWlmICghcy0+c19yb290KQogCQlnb3RvIG91dF9pcHV0OwpAQCAtMjkwLDYgKzI5Miw3IEBACiAJZ290byBvdXRfcmVsZWFzZTsKIAogb3V0X25vX21hcDoKKwlyZXQgPSAtRU5PTUVNOwogCWlmICghc2lsZW50KQogCQlwcmludGsoIk1JTklYLWZzOiBjYW4ndCBhbGxvY2F0ZSBtYXBcbiIpOwogCWdvdG8gb3V0X3JlbGVhc2U7CkBAIC0zMTYsNyArMzE5LDcgQEAKIG91dDoKIAlzLT5zX2ZzX2luZm8gPSBOVUxMOwogCWtmcmVlKHNiaSk7Ci0JcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBtaW5peF9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQpAQCAtNDA5LDcgKzQxMiw3IEBACiAvKgogICogVGhlIG1pbml4IFYxIGZ1bmN0aW9uIHRvIHJlYWQgYW4gaW5vZGUuCiAgKi8KLXN0YXRpYyB2b2lkIFYxX21pbml4X3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpCitzdGF0aWMgc3RydWN0IGlub2RlICpWMV9taW5peF9pZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CiAJc3RydWN0IG1pbml4X2lub2RlICogcmF3X2lub2RlOwpAQCAtNDE4LDggKzQyMSw4IEBACiAKIAlyYXdfaW5vZGUgPSBtaW5peF9WMV9yYXdfaW5vZGUoaW5vZGUtPmlfc2IsIGlub2RlLT5pX2lubywgJmJoKTsKIAlpZiAoIXJhd19pbm9kZSkgewotCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7Ci0JCXJldHVybjsKKwkJaWdldF9mYWlsZWQoaW5vZGUpOworCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIAl9CiAJaW5vZGUtPmlfbW9kZSA9IHJhd19pbm9kZS0+aV9tb2RlOwogCWlub2RlLT5pX3VpZCA9ICh1aWRfdClyYXdfaW5vZGUtPmlfdWlkOwpAQCAtNDM1LDEyICs0MzgsMTQgQEAKIAkJbWluaXhfaW5vZGUtPnUuaTFfZGF0YVtpXSA9IHJhd19pbm9kZS0+aV96b25lW2ldOwogCW1pbml4X3NldF9pbm9kZShpbm9kZSwgb2xkX2RlY29kZV9kZXYocmF3X2lub2RlLT5pX3pvbmVbMF0pKTsKIAlicmVsc2UoYmgpOworCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCXJldHVybiBpbm9kZTsKIH0KIAogLyoKICAqIFRoZSBtaW5peCBWMiBmdW5jdGlvbiB0byByZWFkIGFuIGlub2RlLgogICovCi1zdGF0aWMgdm9pZCBWMl9taW5peF9yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlKQorc3RhdGljIHN0cnVjdCBpbm9kZSAqVjJfbWluaXhfaWdldChzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOwogCXN0cnVjdCBtaW5peDJfaW5vZGUgKiByYXdfaW5vZGU7CkBAIC00NDksOCArNDU0LDggQEAKIAogCXJhd19pbm9kZSA9IG1pbml4X1YyX3Jhd19pbm9kZShpbm9kZS0+aV9zYiwgaW5vZGUtPmlfaW5vLCAmYmgpOwogCWlmICghcmF3X2lub2RlKSB7Ci0JCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKLQkJcmV0dXJuOworCQlpZ2V0X2ZhaWxlZChpbm9kZSk7CisJCXJldHVybiBFUlJfUFRSKC1FSU8pOwogCX0KIAlpbm9kZS0+aV9tb2RlID0gcmF3X2lub2RlLT5pX21vZGU7CiAJaW5vZGUtPmlfdWlkID0gKHVpZF90KXJhd19pbm9kZS0+aV91aWQ7CkBAIC00NjgsMTcgKzQ3MywyNyBAQAogCQltaW5peF9pbm9kZS0+dS5pMl9kYXRhW2ldID0gcmF3X2lub2RlLT5pX3pvbmVbaV07CiAJbWluaXhfc2V0X2lub2RlKGlub2RlLCBvbGRfZGVjb2RlX2RldihyYXdfaW5vZGUtPmlfem9uZVswXSkpOwogCWJyZWxzZShiaCk7CisJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CisJcmV0dXJuIGlub2RlOwogfQogCiAvKgogICogVGhlIGdsb2JhbCBmdW5jdGlvbiB0byByZWFkIGFuIGlub2RlLgogICovCi1zdGF0aWMgdm9pZCBtaW5peF9yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlKQorc3RydWN0IGlub2RlICptaW5peF9pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgaW5vKQogeworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlpbm9kZSA9IGlnZXRfbG9ja2VkKHNiLCBpbm8pOworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWlmICghKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpKQorCQlyZXR1cm4gaW5vZGU7CisKIAlpZiAoSU5PREVfVkVSU0lPTihpbm9kZSkgPT0gTUlOSVhfVjEpCi0JCVYxX21pbml4X3JlYWRfaW5vZGUoaW5vZGUpOworCQlyZXR1cm4gVjFfbWluaXhfaWdldChpbm9kZSk7CiAJZWxzZQotCQlWMl9taW5peF9yZWFkX2lub2RlKGlub2RlKTsKKwkJcmV0dXJuIFYyX21pbml4X2lnZXQoaW5vZGUpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvbWluaXgvbWluaXguaCBiL2ZzL21pbml4L21pbml4LmgKaW5kZXggYWM1ZDNhNy4uMzI2ZWRmZSAxMDA2NDQKLS0tIGEvZnMvbWluaXgvbWluaXguaAorKysgYi9mcy9taW5peC9taW5peC5oCkBAIC00NSw2ICs0NSw3IEBACiAJdW5zaWduZWQgc2hvcnQgc192ZXJzaW9uOwogfTsKIAorZXh0ZXJuIHN0cnVjdCBpbm9kZSAqbWluaXhfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZyk7CiBleHRlcm4gc3RydWN0IG1pbml4X2lub2RlICogbWluaXhfVjFfcmF3X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbm9fdCwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqKTsKIGV4dGVybiBzdHJ1Y3QgbWluaXgyX2lub2RlICogbWluaXhfVjJfcmF3X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbm9fdCwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqKTsKIGV4dGVybiBzdHJ1Y3QgaW5vZGUgKiBtaW5peF9uZXdfaW5vZGUoY29uc3Qgc3RydWN0IGlub2RlICogZGlyLCBpbnQgKiBlcnJvcik7CmRpZmYgLS1naXQgYS9mcy9taW5peC9uYW1laS5jIGIvZnMvbWluaXgvbmFtZWkuYwppbmRleCBmNGFhN2E5Li4xMDIyNDFiIDEwMDY0NAotLS0gYS9mcy9taW5peC9uYW1laS5jCisrKyBiL2ZzL21pbml4L25hbWVpLmMKQEAgLTU0LDEwICs1NCw5IEBACiAKIAlpbm8gPSBtaW5peF9pbm9kZV9ieV9uYW1lKGRlbnRyeSk7CiAJaWYgKGlubykgewotCQlpbm9kZSA9IGlnZXQoZGlyLT5pX3NiLCBpbm8pOwotIAotCQlpZiAoIWlub2RlKQotCQkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisJCWlub2RlID0gbWluaXhfaWdldChkaXItPmlfc2IsIGlubyk7CisJCWlmIChJU19FUlIoaW5vZGUpKQorCQkJcmV0dXJuIEVSUl9DQVNUKGlub2RlKTsKIAl9CiAJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CiAJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9mcy9uYW1laS5jIGIvZnMvbmFtZWkuYwppbmRleCAyNDFjZmY0Li41MjcwMzk4IDEwMDY0NAotLS0gYS9mcy9uYW1laS5jCisrKyBiL2ZzL25hbWVpLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogICogYW55IGV4dHJhIGNvbnRlbnRpb24uLi4KICAqLwogCi1zdGF0aWMgaW50IGZhc3RjYWxsIGxpbmtfcGF0aF93YWxrKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBuYW1laWRhdGEgKm5kKTsKK3N0YXRpYyBpbnQgbGlua19wYXRoX3dhbGsoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpOwogCiAvKiBJbiBvcmRlciB0byByZWR1Y2Ugc29tZSByYWNlcywgd2hpbGUgYXQgdGhlIHNhbWUgdGltZSBkb2luZyBhZGRpdGlvbmFsCiAgKiBjaGVja2luZyBhbmQgaG9wZWZ1bGx5IHNwZWVkaW5nIHRoaW5ncyB1cCwgd2UgY29weSBmaWxlbmFtZXMgdG8gdGhlCkBAIC04MjMsNyArODIzLDcgQEAKICAqIFJldHVybnMgMCBhbmQgbmQgd2lsbCBoYXZlIHZhbGlkIGRlbnRyeSBhbmQgbW50IG9uIHN1Y2Nlc3MuCiAgKiBSZXR1cm5zIGVycm9yIGFuZCBkcm9wcyByZWZlcmVuY2UgdG8gaW5wdXQgbmFtZWkgZGF0YSBvbiBmYWlsdXJlLgogICovCi1zdGF0aWMgZmFzdGNhbGwgaW50IF9fbGlua19wYXRoX3dhbGsoY29uc3QgY2hhciAqIG5hbWUsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQorc3RhdGljIGludCBfX2xpbmtfcGF0aF93YWxrKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewogCXN0cnVjdCBwYXRoIG5leHQ7CiAJc3RydWN0IGlub2RlICppbm9kZTsKQEAgLTEwMTUsNyArMTAxNSw3IEBACiAgKiBSZXRyeSB0aGUgd2hvbGUgcGF0aCBvbmNlLCBmb3JjaW5nIHJlYWwgbG9va3VwIHJlcXVlc3RzCiAgKiBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGhlIGRjYWNoZS4KICAqLwotc3RhdGljIGludCBmYXN0Y2FsbCBsaW5rX3BhdGhfd2Fsayhjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3N0YXRpYyBpbnQgbGlua19wYXRoX3dhbGsoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7CiAJc3RydWN0IG5hbWVpZGF0YSBzYXZlID0gKm5kOwogCWludCByZXN1bHQ7CkBAIC0xMDM5LDcgKzEwMzksNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBpbnQgZmFzdGNhbGwgcGF0aF93YWxrKGNvbnN0IGNoYXIgKiBuYW1lLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3N0YXRpYyBpbnQgcGF0aF93YWxrKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewogCWN1cnJlbnQtPnRvdGFsX2xpbmtfY291bnQgPSAwOwogCXJldHVybiBsaW5rX3BhdGhfd2FsayhuYW1lLCBuZCk7CkBAIC0xMTE2LDcgKzExMTYsNyBAQAogfQogCiAvKiBSZXR1cm5zIDAgYW5kIG5kIHdpbGwgYmUgdmFsaWQgb24gc3VjY2VzczsgUmV0dW5zIGVycm9yLCBvdGhlcndpc2UuICovCi1zdGF0aWMgaW50IGZhc3RjYWxsIGRvX3BhdGhfbG9va3VwKGludCBkZmQsIGNvbnN0IGNoYXIgKm5hbWUsCitzdGF0aWMgaW50IGRvX3BhdGhfbG9va3VwKGludCBkZmQsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKIAlpbnQgcmV0dmFsID0gMDsKQEAgLTExODMsNyArMTE4Myw3IEBACiAJZ290byBvdXRfZmFpbDsKIH0KIAotaW50IGZhc3RjYWxsIHBhdGhfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCBmbGFncywKK2ludCBwYXRoX2xvb2t1cChjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCiAJCQlzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKIAlyZXR1cm4gZG9fcGF0aF9sb29rdXAoQVRfRkRDV0QsIG5hbWUsIGZsYWdzLCBuZCk7CkBAIC0xNDA5LDcgKzE0MDksNyBAQAogCXJldHVybiBfX2xvb2t1cF9oYXNoKCZ0aGlzLCBiYXNlLCBOVUxMKTsKIH0KIAotaW50IGZhc3RjYWxsIF9fdXNlcl93YWxrX2ZkKGludCBkZmQsIGNvbnN0IGNoYXIgX191c2VyICpuYW1lLCB1bnNpZ25lZCBmbGFncywKK2ludCBfX3VzZXJfd2Fsa19mZChpbnQgZGZkLCBjb25zdCBjaGFyIF9fdXNlciAqbmFtZSwgdW5zaWduZWQgZmxhZ3MsCiAJCQkgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7CiAJY2hhciAqdG1wID0gZ2V0bmFtZShuYW1lKTsKQEAgLTE0MjIsNyArMTQyMiw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IGZhc3RjYWxsIF9fdXNlcl93YWxrKGNvbnN0IGNoYXIgX191c2VyICpuYW1lLCB1bnNpZ25lZCBmbGFncywgc3RydWN0IG5hbWVpZGF0YSAqbmQpCitpbnQgX191c2VyX3dhbGsoY29uc3QgY2hhciBfX3VzZXIgKm5hbWUsIHVuc2lnbmVkIGZsYWdzLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKIAlyZXR1cm4gX191c2VyX3dhbGtfZmQoQVRfRkRDV0QsIG5hbWUsIGZsYWdzLCBuZCk7CiB9CmRpZmYgLS1naXQgYS9mcy9uYW1lc3BhY2UuYyBiL2ZzL25hbWVzcGFjZS5jCmluZGV4IGU5YzEwY2QuLjYzY2VkMjEgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVzcGFjZS5jCisrKyBiL2ZzL25hbWVzcGFjZS5jCkBAIC0zMjAsNiArMzIwLDUwIEBACiAKIEVYUE9SVF9TWU1CT0wobW50X3VucGluKTsKIAorc3RhdGljIGlubGluZSB2b2lkIG1hbmdsZShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGNvbnN0IGNoYXIgKnMpCit7CisJc2VxX2VzY2FwZShtLCBzLCAiIFx0XG5cXCIpOworfQorCisvKgorICogU2ltcGxlIC5zaG93X29wdGlvbnMgY2FsbGJhY2sgZm9yIGZpbGVzeXN0ZW1zIHdoaWNoIGRvbid0IHdhbnQgdG8KKyAqIGltcGxlbWVudCBtb3JlIGNvbXBsZXggbW91bnQgb3B0aW9uIHNob3dpbmcuCisgKgorICogU2VlIGFsc28gc2F2ZV9tb3VudF9vcHRpb25zKCkuCisgKi8KK2ludCBnZW5lcmljX3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCWNvbnN0IGNoYXIgKm9wdGlvbnMgPSBtbnQtPm1udF9zYi0+c19vcHRpb25zOworCisJaWYgKG9wdGlvbnMgIT0gTlVMTCAmJiBvcHRpb25zWzBdKSB7CisJCXNlcV9wdXRjKG0sICcsJyk7CisJCW1hbmdsZShtLCBvcHRpb25zKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZ2VuZXJpY19zaG93X29wdGlvbnMpOworCisvKgorICogSWYgZmlsZXN5c3RlbSB1c2VzIGdlbmVyaWNfc2hvd19vcHRpb25zKCksIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlCisgKiBjYWxsZWQgZnJvbSB0aGUgZmlsbF9zdXBlcigpIGNhbGxiYWNrLgorICoKKyAqIFRoZSAucmVtb3VudF9mcyBjYWxsYmFjayB1c3VhbGx5IG5lZWRzIHRvIGJlIGhhbmRsZWQgaW4gYSBzcGVjaWFsCisgKiB3YXksIHRvIG1ha2Ugc3VyZSwgdGhhdCBwcmV2aW91cyBvcHRpb25zIGFyZSBub3Qgb3ZlcndyaXR0ZW4gaWYgdGhlCisgKiByZW1vdW50IGZhaWxzLgorICoKKyAqIEFsc28gbm90ZSwgdGhhdCBpZiB0aGUgZmlsZXN5c3RlbSdzIC5yZW1vdW50X2ZzIGZ1bmN0aW9uIGRvZXNuJ3QKKyAqIHJlc2V0IGFsbCBvcHRpb25zIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWUsIGJ1dCBjaGFuZ2VzIG9ubHkgbmV3bHkKKyAqIGdpdmVuIG9wdGlvbnMsIHRoZW4gdGhlIGRpc3BsYXllZCBvcHRpb25zIHdpbGwgbm90IHJlZmxlY3QgcmVhbGl0eQorICogYW55IG1vcmUuCisgKi8KK3ZvaWQgc2F2ZV9tb3VudF9vcHRpb25zKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNoYXIgKm9wdGlvbnMpCit7CisJa2ZyZWUoc2ItPnNfb3B0aW9ucyk7CisJc2ItPnNfb3B0aW9ucyA9IGtzdHJkdXAob3B0aW9ucywgR0ZQX0tFUk5FTCk7Cit9CitFWFBPUlRfU1lNQk9MKHNhdmVfbW91bnRfb3B0aW9ucyk7CisKIC8qIGl0ZXJhdG9yICovCiBzdGF0aWMgdm9pZCAqbV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQogewpAQCAtMzQxLDExICszODUsNiBAQAogCXVwX3JlYWQoJm5hbWVzcGFjZV9zZW0pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbWFuZ2xlKHN0cnVjdCBzZXFfZmlsZSAqbSwgY29uc3QgY2hhciAqcykKLXsKLQlzZXFfZXNjYXBlKG0sIHMsICIgXHRcblxcIik7Ci19Ci0KIHN0YXRpYyBpbnQgc2hvd192ZnNtbnQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewogCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgdmZzbW91bnQsIG1udF9saXN0KTsKQEAgLTg5Nyw4ICs5MzYsOSBAQAogCiAvKgogICogcmVjdXJzaXZlbHkgY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBtb3VudHBvaW50LgorICogbm9pbmxpbmUgdGhpcyBkb19tb3VudCBoZWxwZXIgdG8gc2F2ZSBkb19tb3VudCBzdGFjayBzcGFjZS4KICAqLwotc3RhdGljIGludCBkb19jaGFuZ2VfdHlwZShzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgaW50IGZsYWcpCitzdGF0aWMgbm9pbmxpbmUgaW50IGRvX2NoYW5nZV90eXBlKHN0cnVjdCBuYW1laWRhdGEgKm5kLCBpbnQgZmxhZykKIHsKIAlzdHJ1Y3QgdmZzbW91bnQgKm0sICptbnQgPSBuZC0+bW50OwogCWludCByZWN1cnNlID0gZmxhZyAmIE1TX1JFQzsKQEAgLTkyMSw4ICs5NjEsMTAgQEAKIAogLyoKICAqIGRvIGxvb3BiYWNrIG1vdW50LgorICogbm9pbmxpbmUgdGhpcyBkb19tb3VudCBoZWxwZXIgdG8gc2F2ZSBkb19tb3VudCBzdGFjayBzcGFjZS4KICAqLwotc3RhdGljIGludCBkb19sb29wYmFjayhzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgY2hhciAqb2xkX25hbWUsIGludCByZWN1cnNlKQorc3RhdGljIG5vaW5saW5lIGludCBkb19sb29wYmFjayhzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgY2hhciAqb2xkX25hbWUsCisJCQkJaW50IHJlY3Vyc2UpCiB7CiAJc3RydWN0IG5hbWVpZGF0YSBvbGRfbmQ7CiAJc3RydWN0IHZmc21vdW50ICptbnQgPSBOVUxMOwpAQCAtOTcxLDggKzEwMTMsOSBAQAogICogY2hhbmdlIGZpbGVzeXN0ZW0gZmxhZ3MuIGRpciBzaG91bGQgYmUgYSBwaHlzaWNhbCByb290IG9mIGZpbGVzeXN0ZW0uCiAgKiBJZiB5b3UndmUgbW91bnRlZCBhIG5vbi1yb290IGRpcmVjdG9yeSBzb21ld2hlcmUgYW5kIHdhbnQgdG8gZG8gcmVtb3VudAogICogb24gaXQgLSB0b3VnaCBsdWNrLgorICogbm9pbmxpbmUgdGhpcyBkb19tb3VudCBoZWxwZXIgdG8gc2F2ZSBkb19tb3VudCBzdGFjayBzcGFjZS4KICAqLwotc3RhdGljIGludCBkb19yZW1vdW50KHN0cnVjdCBuYW1laWRhdGEgKm5kLCBpbnQgZmxhZ3MsIGludCBtbnRfZmxhZ3MsCitzdGF0aWMgbm9pbmxpbmUgaW50IGRvX3JlbW91bnQoc3RydWN0IG5hbWVpZGF0YSAqbmQsIGludCBmbGFncywgaW50IG1udF9mbGFncywKIAkJICAgICAgdm9pZCAqZGF0YSkKIHsKIAlpbnQgZXJyOwpAQCAtMTAwNyw3ICsxMDUwLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZG9fbW92ZV9tb3VudChzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgY2hhciAqb2xkX25hbWUpCisvKgorICogbm9pbmxpbmUgdGhpcyBkb19tb3VudCBoZWxwZXIgdG8gc2F2ZSBkb19tb3VudCBzdGFjayBzcGFjZS4KKyAqLworc3RhdGljIG5vaW5saW5lIGludCBkb19tb3ZlX21vdW50KHN0cnVjdCBuYW1laWRhdGEgKm5kLCBjaGFyICpvbGRfbmFtZSkKIHsKIAlzdHJ1Y3QgbmFtZWlkYXRhIG9sZF9uZCwgcGFyZW50X25kOwogCXN0cnVjdCB2ZnNtb3VudCAqcDsKQEAgLTEwODIsOCArMTEyOCw5IEBACiAvKgogICogY3JlYXRlIGEgbmV3IG1vdW50IGZvciB1c2Vyc3BhY2UgYW5kIHJlcXVlc3QgaXQgdG8gYmUgYWRkZWQgaW50byB0aGUKICAqIG5hbWVzcGFjZSdzIHRyZWUKKyAqIG5vaW5saW5lIHRoaXMgZG9fbW91bnQgaGVscGVyIHRvIHNhdmUgZG9fbW91bnQgc3RhY2sgc3BhY2UuCiAgKi8KLXN0YXRpYyBpbnQgZG9fbmV3X21vdW50KHN0cnVjdCBuYW1laWRhdGEgKm5kLCBjaGFyICp0eXBlLCBpbnQgZmxhZ3MsCitzdGF0aWMgbm9pbmxpbmUgaW50IGRvX25ld19tb3VudChzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgY2hhciAqdHlwZSwgaW50IGZsYWdzLAogCQkJaW50IG1udF9mbGFncywgY2hhciAqbmFtZSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgdmZzbW91bnQgKm1udDsKZGlmZiAtLWdpdCBhL2ZzL25jcGZzL2lub2RlLmMgYi9mcy9uY3Bmcy9pbm9kZS5jCmluZGV4IGVmZjFmMTguLmZiYmI5ZjcgMTAwNjQ0Ci0tLSBhL2ZzL25jcGZzL2lub2RlLmMKKysrIGIvZnMvbmNwZnMvaW5vZGUuYwpAQCAtMjgsNiArMjgsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KIAogI2luY2x1ZGUgPGxpbnV4L25jcF9mcy5oPgogCkBAIC0zNiw5ICszOCwxNSBAQAogI2luY2x1ZGUgIm5jcGxpYl9rZXJuZWwuaCIKICNpbmNsdWRlICJnZXRvcHQuaCIKIAorI2RlZmluZSBOQ1BfREVGQVVMVF9GSUxFX01PREUgMDYwMAorI2RlZmluZSBOQ1BfREVGQVVMVF9ESVJfTU9ERSAwNzAwCisjZGVmaW5lIE5DUF9ERUZBVUxUX1RJTUVfT1VUIDEwCisjZGVmaW5lIE5DUF9ERUZBVUxUX1JFVFJZX0NPVU5UIDIwCisKIHN0YXRpYyB2b2lkIG5jcF9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICopOwogc3RhdGljIHZvaWQgbmNwX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CiBzdGF0aWMgaW50ICBuY3Bfc3RhdGZzKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGtzdGF0ZnMgKik7CitzdGF0aWMgaW50ICBuY3Bfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqLCBzdHJ1Y3QgdmZzbW91bnQgKik7CiAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqIG5jcF9pbm9kZV9jYWNoZXA7CiAKQEAgLTk2LDYgKzEwNCw3IEBACiAJLnB1dF9zdXBlcgk9IG5jcF9wdXRfc3VwZXIsCiAJLnN0YXRmcwkJPSBuY3Bfc3RhdGZzLAogCS5yZW1vdW50X2ZzCT0gbmNwX3JlbW91bnQsCisJLnNob3dfb3B0aW9ucwk9IG5jcF9zaG93X29wdGlvbnMsCiB9OwogCiBleHRlcm4gc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIG5jcF9yb290X2RlbnRyeV9vcGVyYXRpb25zOwpAQCAtMzA0LDYgKzMxMywzNyBAQAogCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CiB9CiAKK3N0YXRpYyBpbnQgIG5jcF9zaG93X29wdGlvbnMoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCXN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIgPSBOQ1BfU0JQKG1udC0+bW50X3NiKTsKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJaWYgKHNlcnZlci0+bS51aWQgIT0gMCkKKwkJc2VxX3ByaW50ZihzZXEsICIsdWlkPSV1Iiwgc2VydmVyLT5tLnVpZCk7CisJaWYgKHNlcnZlci0+bS5naWQgIT0gMCkKKwkJc2VxX3ByaW50ZihzZXEsICIsZ2lkPSV1Iiwgc2VydmVyLT5tLmdpZCk7CisJaWYgKHNlcnZlci0+bS5tb3VudGVkX3VpZCAhPSAwKQorCQlzZXFfcHJpbnRmKHNlcSwgIixvd25lcj0ldSIsIHNlcnZlci0+bS5tb3VudGVkX3VpZCk7CisJdG1wID0gc2VydmVyLT5tLmZpbGVfbW9kZSAmIFNfSUFMTFVHTzsKKwlpZiAodG1wICE9IE5DUF9ERUZBVUxUX0ZJTEVfTU9ERSkKKwkJc2VxX3ByaW50ZihzZXEsICIsbW9kZT0wJW8iLCB0bXApOworCXRtcCA9IHNlcnZlci0+bS5kaXJfbW9kZSAmIFNfSUFMTFVHTzsKKwlpZiAodG1wICE9IE5DUF9ERUZBVUxUX0RJUl9NT0RFKQorCQlzZXFfcHJpbnRmKHNlcSwgIixkaXJtb2RlPTAlbyIsIHRtcCk7CisJaWYgKHNlcnZlci0+bS50aW1lX291dCAhPSBOQ1BfREVGQVVMVF9USU1FX09VVCAqIEhaIC8gMTAwKSB7CisJCXRtcCA9IHNlcnZlci0+bS50aW1lX291dCAqIDEwMCAvIEhaOworCQlzZXFfcHJpbnRmKHNlcSwgIix0aW1lb3V0PSV1IiwgdG1wKTsKKwl9CisJaWYgKHNlcnZlci0+bS5yZXRyeV9jb3VudCAhPSBOQ1BfREVGQVVMVF9SRVRSWV9DT1VOVCkKKwkJc2VxX3ByaW50ZihzZXEsICIscmV0cnk9JXUiLCBzZXJ2ZXItPm0ucmV0cnlfY291bnQpOworCWlmIChzZXJ2ZXItPm0uZmxhZ3MgIT0gMCkKKwkJc2VxX3ByaW50ZihzZXEsICIsZmxhZ3M9JWx1Iiwgc2VydmVyLT5tLmZsYWdzKTsKKwlpZiAoc2VydmVyLT5tLndkb2dfcGlkICE9IE5VTEwpCisJCXNlcV9wcmludGYoc2VxLCAiLHdkb2dwaWQ9JXUiLCBwaWRfdm5yKHNlcnZlci0+bS53ZG9nX3BpZCkpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmNwX29wdGlvbiBuY3Bfb3B0c1tdID0gewogCXsgInVpZCIsCU9QVF9JTlQsCSd1JyB9LAogCXsgImdpZCIsCU9QVF9JTlQsCSdnJyB9LApAQCAtMzMxLDEyICszNzEsMTIgQEAKIAlkYXRhLT5tb3VudGVkX3VpZCA9IDA7CiAJZGF0YS0+d2RvZ19waWQgPSBOVUxMOwogCWRhdGEtPm5jcF9mZCA9IH4wOwotCWRhdGEtPnRpbWVfb3V0ID0gMTA7Ci0JZGF0YS0+cmV0cnlfY291bnQgPSAyMDsKKwlkYXRhLT50aW1lX291dCA9IE5DUF9ERUZBVUxUX1RJTUVfT1VUOworCWRhdGEtPnJldHJ5X2NvdW50ID0gTkNQX0RFRkFVTFRfUkVUUllfQ09VTlQ7CiAJZGF0YS0+dWlkID0gMDsKIAlkYXRhLT5naWQgPSAwOwotCWRhdGEtPmZpbGVfbW9kZSA9IDA2MDA7Ci0JZGF0YS0+ZGlyX21vZGUgPSAwNzAwOworCWRhdGEtPmZpbGVfbW9kZSA9IE5DUF9ERUZBVUxUX0ZJTEVfTU9ERTsKKwlkYXRhLT5kaXJfbW9kZSA9IE5DUF9ERUZBVUxUX0RJUl9NT0RFOwogCWRhdGEtPmluZm9fZmQgPSAtMTsKIAlkYXRhLT5tb3VudGVkX3ZvbFswXSA9IDA7CiAJCkBAIC05ODIsNiArMTAyMiw3IEBACiAJLm5hbWUJCT0gIm5jcGZzIiwKIAkuZ2V0X3NiCQk9IG5jcF9nZXRfc2IsCiAJLmtpbGxfc2IJPSBraWxsX2Fub25fc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfQklOQVJZX01PVU5UREFUQSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfbmNwX2ZzKHZvaWQpCmRpZmYgLS1naXQgYS9mcy9uZnMvZ2V0cm9vdC5jIGIvZnMvbmZzL2dldHJvb3QuYwppbmRleCBlNjI0MmNkLi5mYWU5NzE5IDEwMDY0NAotLS0gYS9mcy9uZnMvZ2V0cm9vdC5jCisrKyBiL2ZzL25mcy9nZXRyb290LmMKQEAgLTk2LDcgKzk2LDcgQEAKIAlpbm9kZSA9IG5mc19maGdldChzYiwgbW50ZmgsIGZzaW5mby5mYXR0cik7CiAJaWYgKElTX0VSUihpbm9kZSkpIHsKIAkJZHByaW50aygibmZzX2dldF9yb290OiBnZXQgcm9vdCBpbm9kZSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKGlub2RlKSk7CisJCXJldHVybiBFUlJfQ0FTVChpbm9kZSk7CiAJfQogCiAJZXJyb3IgPSBuZnNfc3VwZXJibG9ja19zZXRfZHVtbXlfcm9vdChzYiwgaW5vZGUpOwpAQCAtMjY2LDcgKzI2Niw3IEBACiAJaW5vZGUgPSBuZnNfZmhnZXQoc2IsIG1udGZoLCAmZmF0dHIpOwogCWlmIChJU19FUlIoaW5vZGUpKSB7CiAJCWRwcmludGsoIm5mc19nZXRfcm9vdDogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihpbm9kZSkpOworCQlyZXR1cm4gRVJSX0NBU1QoaW5vZGUpOwogCX0KIAogCWVycm9yID0gbmZzX3N1cGVyYmxvY2tfc2V0X2R1bW15X3Jvb3Qoc2IsIGlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy93cml0ZS5jIGIvZnMvbmZzL3dyaXRlLmMKaW5kZXggYjE0NGIxOS4uZjU1YzQzNyAxMDA2NDQKLS0tIGEvZnMvbmZzL3dyaXRlLmMKKysrIGIvZnMvbmZzL3dyaXRlLmMKQEAgLTY5Nyw2ICs2OTcsMTcgQEAKIH0KIAogLyoKKyAqIElmIHRoZSBwYWdlIGNhY2hlIGlzIG1hcmtlZCBhcyB1bnNhZmUgb3IgaW52YWxpZCwgdGhlbiB3ZSBjYW4ndCByZWx5IG9uCisgKiB0aGUgUGFnZVVwdG9kYXRlKCkgZmxhZy4gSW4gdGhpcyBjYXNlLCB3ZSB3aWxsIG5lZWQgdG8gdHVybiBvZmYKKyAqIHdyaXRlIG9wdGltaXNhdGlvbnMgdGhhdCBkZXBlbmQgb24gdGhlIHBhZ2UgY29udGVudHMgYmVpbmcgY29ycmVjdC4KKyAqLworc3RhdGljIGludCBuZnNfd3JpdGVfcGFnZXVwdG9kYXRlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiBQYWdlVXB0b2RhdGUocGFnZSkgJiYKKwkJIShORlNfSShpbm9kZSktPmNhY2hlX3ZhbGlkaXR5ICYgKE5GU19JTk9fUkVWQUxfUEFHRUNBQ0hFfE5GU19JTk9fSU5WQUxJRF9EQVRBKSk7Cit9CisKKy8qCiAgKiBVcGRhdGUgYW5kIHBvc3NpYmx5IHdyaXRlIGEgY2FjaGVkIHBhZ2Ugb2YgYW4gTkZTIGZpbGUuCiAgKgogICogWFhYOiBLZWVwIGFuIGV5ZSBvbiBnZW5lcmljX2ZpbGVfcmVhZCB0byBtYWtlIHN1cmUgaXQgZG9lc24ndCBkbyBiYWQKQEAgLTcxNywxMCArNzI4LDEzIEBACiAJCShsb25nIGxvbmcpKHBhZ2Vfb2Zmc2V0KHBhZ2UpICtvZmZzZXQpKTsKIAogCS8qIElmIHdlJ3JlIG5vdCB1c2luZyBieXRlIHJhbmdlIGxvY2tzLCBhbmQgd2Uga25vdyB0aGUgcGFnZQotCSAqIGlzIGVudGlyZWx5IGluIGNhY2hlLCBpdCBtYXkgYmUgbW9yZSBlZmZpY2llbnQgdG8gYXZvaWQKLQkgKiBmcmFnbWVudGluZyB3cml0ZSByZXF1ZXN0cy4KKwkgKiBpcyB1cCB0byBkYXRlLCBpdCBtYXkgYmUgbW9yZSBlZmZpY2llbnQgdG8gZXh0ZW5kIHRoZSB3cml0ZQorCSAqIHRvIGNvdmVyIHRoZSBlbnRpcmUgcGFnZSBpbiBvcmRlciB0byBhdm9pZCBmcmFnbWVudGF0aW9uCisJICogaW5lZmZpY2llbmNpZXMuCiAJICovCi0JaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSAmJiBpbm9kZS0+aV9mbG9jayA9PSBOVUxMICYmICEoZmlsZS0+Zl9tb2RlICYgT19TWU5DKSkgeworCWlmIChuZnNfd3JpdGVfcGFnZXVwdG9kYXRlKHBhZ2UsIGlub2RlKSAmJgorCQkJaW5vZGUtPmlfZmxvY2sgPT0gTlVMTCAmJgorCQkJIShmaWxlLT5mX21vZGUgJiBPX1NZTkMpKSB7CiAJCWNvdW50ID0gbWF4KGNvdW50ICsgb2Zmc2V0LCBuZnNfcGFnZV9sZW5ndGgocGFnZSkpOwogCQlvZmZzZXQgPSAwOwogCX0KZGlmZiAtLWdpdCBhL2ZzL25mc2QvZXhwb3J0LmMgYi9mcy9uZnNkL2V4cG9ydC5jCmluZGV4IDc5YjRiZjguLjM0NjU3MGYgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvZXhwb3J0LmMKKysrIGIvZnMvbmZzZC9leHBvcnQuYwpAQCAtMTIxOCwxMyArMTIxOCwxMyBAQAogCXN0cnVjdCBzdmNfZXhwb3J0ICpleHA7CiAJc3RydWN0IHN2Y19leHBrZXkgKmVrID0gZXhwX2ZpbmRfa2V5KGNscCwgZnNpZF90eXBlLCBmc2lkdiwgcmVxcCk7CiAJaWYgKElTX0VSUihlaykpCi0JCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoZWspKTsKKwkJcmV0dXJuIEVSUl9DQVNUKGVrKTsKIAogCWV4cCA9IGV4cF9nZXRfYnlfbmFtZShjbHAsIGVrLT5la19tbnQsIGVrLT5la19kZW50cnksIHJlcXApOwogCWNhY2hlX3B1dCgmZWstPmgsICZzdmNfZXhwa2V5X2NhY2hlKTsKIAogCWlmIChJU19FUlIoZXhwKSkKLQkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihleHApKTsKKwkJcmV0dXJuIEVSUl9DQVNUKGV4cCk7CiAJcmV0dXJuIGV4cDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvY2x1c3Rlci9lbmRpYW4uaCBiL2ZzL29jZnMyL2NsdXN0ZXIvZW5kaWFuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZjkwODIuLjAwMDAwMDAKLS0tIGEvZnMvb2NmczIvY2x1c3Rlci9lbmRpYW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qIC0qLSBtb2RlOiBjOyBjLWJhc2ljLW9mZnNldDogODsgLSotCi0gKiB2aW06IG5vZXhwYW5kdGFiIHN3PTggdHM9OCBzdHM9MDoKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCi0gKi8KLQotI2lmbmRlZiBPQ0ZTMl9DTFVTVEVSX0VORElBTl9ICi0jZGVmaW5lIE9DRlMyX0NMVVNURVJfRU5ESUFOX0gKLQotc3RhdGljIGlubGluZSB2b2lkIGJlMzJfYWRkX2NwdShfX2JlMzIgKnZhciwgdTMyIHZhbCkKLXsKLQkqdmFyID0gY3B1X3RvX2JlMzIoYmUzMl90b19jcHUoKnZhcikgKyB2YWwpOwotfQotCi0jZW5kaWYgLyogT0NGUzJfQ0xVU1RFUl9FTkRJQU5fSCAqLwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvY2x1c3Rlci9ub2RlbWFuYWdlci5jIGIvZnMvb2NmczIvY2x1c3Rlci9ub2RlbWFuYWdlci5jCmluZGV4IGFmMjA3MGQuLjcwOWZiYTIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvbm9kZW1hbmFnZXIuYworKysgYi9mcy9vY2ZzMi9jbHVzdGVyL25vZGVtYW5hZ2VyLmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWdmcy5oPgogCi0jaW5jbHVkZSAiZW5kaWFuLmgiCiAjaW5jbHVkZSAidGNwLmgiCiAjaW5jbHVkZSAibm9kZW1hbmFnZXIuaCIKICNpbmNsdWRlICJoZWFydGJlYXQuaCIKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvdGNwX2ludGVybmFsLmggYi9mcy9vY2ZzMi9jbHVzdGVyL3RjcF9pbnRlcm5hbC5oCmluZGV4IGIyZTgzMmEuLmQyNWI5YWYgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvdGNwX2ludGVybmFsLmgKKysrIGIvZnMvb2NmczIvY2x1c3Rlci90Y3BfaW50ZXJuYWwuaApAQCAtMzgsNiArMzgsMTUgQEAKICAqIGxvY2tpbmcgc2VtYW50aWNzIG9mIHRoZSBmaWxlIHN5c3RlbSB1c2luZyB0aGUgcHJvdG9jb2wuICBJdCBzaG91bGQgCiAgKiBiZSBzb21ld2hlcmUgZWxzZSwgSSdtIHN1cmUsIGJ1dCByaWdodCBub3cgaXQgaXNuJ3QuCiAgKgorICogV2l0aCB2ZXJzaW9uIDExLCB3ZSBzZXBhcmF0ZSBvdXQgdGhlIGZpbGVzeXN0ZW0gbG9ja2luZyBwb3J0aW9uLiAgVGhlCisgKiBmaWxlc3lzdGVtIG5vdyBoYXMgYSBtYWpvci5taW5vciB2ZXJzaW9uIGl0IG5lZ290aWF0ZXMuICBWZXJzaW9uIDExCisgKiBpbnRyb2R1Y2VzIHRoaXMgbmVnb3RpYXRpb24gdG8gdGhlIG8yZGxtIHByb3RvY29sLCBhbmQgYXMgc3VjaCB0aGUKKyAqIHZlcnNpb24gaGVyZSBpbiB0Y3BfaW50ZXJuYWwuaCBzaG91bGQgbm90IG5lZWQgdG8gYmUgYnVtcGVkIGZvcgorICogZmlsZXN5c3RlbSBsb2NraW5nIGNoYW5nZXMuCisgKgorICogTmV3IGluIHZlcnNpb24gMTEKKyAqIAktIE5lZ290aWF0aW9uIG9mIGZpbGVzeXN0ZW0gbG9ja2luZyBpbiB0aGUgZGxtIGpvaW4uCisgKgogICogTmV3IGluIHZlcnNpb24gMTA6CiAgKiAJLSBNZXRhL2RhdGEgbG9ja3MgY29tYmluZWQKICAqCkBAIC02Niw3ICs3NSw3IEBACiAgKiAJLSBmdWxsIDY0IGJpdCBpX3NpemUgaW4gdGhlIG1ldGFkYXRhIGxvY2sgbHZicwogICogCS0gaW50cm9kdWN0aW9uIG9mICJydyIgbG9jayBhbmQgcHVzaGluZyBtZXRhL2RhdGEgbG9ja2luZyBkb3duCiAgKi8KLSNkZWZpbmUgTzJORVRfUFJPVE9DT0xfVkVSU0lPTiAxMFVMTAorI2RlZmluZSBPMk5FVF9QUk9UT0NPTF9WRVJTSU9OIDExVUxMCiBzdHJ1Y3QgbzJuZXRfaGFuZHNoYWtlIHsKIAlfX2JlNjQJcHJvdG9jb2xfdmVyc2lvbjsKIAlfX2JlNjQJY29ubmVjdG9yX2lkOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbWFwaS5oIGIvZnMvb2NmczIvZGxtL2RsbWFwaS5oCmluZGV4IGNmZDVjYjYuLmI1Nzg2YTcgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbS9kbG1hcGkuaAorKysgYi9mcy9vY2ZzMi9kbG0vZGxtYXBpLmgKQEAgLTE5Myw3ICsxOTMsMTIgQEAKIAkJCSAgZGxtX2FzdHVubG9ja2Z1bmNfdCAqdW5sb2NrYXN0LAogCQkJICB2b2lkICpkYXRhKTsKIAotc3RydWN0IGRsbV9jdHh0ICogZGxtX3JlZ2lzdGVyX2RvbWFpbihjb25zdCBjaGFyICpkb21haW4sIHUzMiBrZXkpOworc3RydWN0IGRsbV9wcm90b2NvbF92ZXJzaW9uIHsKKwl1OCBwdl9tYWpvcjsKKwl1OCBwdl9taW5vcjsKK307CitzdHJ1Y3QgZGxtX2N0eHQgKiBkbG1fcmVnaXN0ZXJfZG9tYWluKGNvbnN0IGNoYXIgKmRvbWFpbiwgdTMyIGtleSwKKwkJCQkgICAgICBzdHJ1Y3QgZGxtX3Byb3RvY29sX3ZlcnNpb24gKmZzX3Byb3RvKTsKIAogdm9pZCBkbG1fdW5yZWdpc3Rlcl9kb21haW4oc3RydWN0IGRsbV9jdHh0ICpkbG0pOwogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vZGxtYXN0LmMgYi9mcy9vY2ZzMi9kbG0vZGxtYXN0LmMKaW5kZXggMmZkOGJkZS4uNjQ0YmVlNSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWFzdC5jCisrKyBiL2ZzL29jZnMyL2RsbS9kbG1hc3QuYwpAQCAtNDMsNyArNDMsNiBAQAogI2luY2x1ZGUgImNsdXN0ZXIvaGVhcnRiZWF0LmgiCiAjaW5jbHVkZSAiY2x1c3Rlci9ub2RlbWFuYWdlci5oIgogI2luY2x1ZGUgImNsdXN0ZXIvdGNwLmgiCi0jaW5jbHVkZSAiY2x1c3Rlci9lbmRpYW4uaCIKIAogI2luY2x1ZGUgImRsbWFwaS5oIgogI2luY2x1ZGUgImRsbWNvbW1vbi5oIgpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbWNvbW1vbi5oIGIvZnMvb2NmczIvZGxtL2RsbWNvbW1vbi5oCmluZGV4IGU5MGI5MmYuLjk4NDNlZTEgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbS9kbG1jb21tb24uaAorKysgYi9mcy9vY2ZzMi9kbG0vZGxtY29tbW9uLmgKQEAgLTE0Miw2ICsxNDIsMTIgQEAKIAlzcGlubG9ja190IHdvcmtfbG9jazsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGRsbV9kb21haW5faGFuZGxlcnM7CiAJc3RydWN0IGxpc3RfaGVhZAlkbG1fZXZpY3Rpb25fY2FsbGJhY2tzOworCisJLyogVGhlIGZpbGVzeXN0ZW0gc3BlY2lmaWVzIHRoaXMgYXQgZG9tYWluIHJlZ2lzdHJhdGlvbi4gIFdlCisJICogY2FjaGUgaXQgaGVyZSB0byBrbm93IHdoYXQgdG8gdGVsbCBvdGhlciBub2Rlcy4gKi8KKwlzdHJ1Y3QgZGxtX3Byb3RvY29sX3ZlcnNpb24gZnNfbG9ja2luZ19wcm90bzsKKwkvKiBUaGlzIGlzIHRoZSBpbnRlci1kbG0gY29tbXVuaWNhdGlvbiB2ZXJzaW9uICovCisJc3RydWN0IGRsbV9wcm90b2NvbF92ZXJzaW9uIGRsbV9sb2NraW5nX3Byb3RvOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgaGxpc3RfaGVhZCAqZGxtX2xvY2tyZXNfaGFzaChzdHJ1Y3QgZGxtX2N0eHQgKmRsbSwgdW5zaWduZWQgaSkKQEAgLTU4OSwxMCArNTk1LDI0IEBACiAjZGVmaW5lIERMTV9QUk9YWV9BU1RfTUFYX0xFTiAgKHNpemVvZihzdHJ1Y3QgZGxtX3Byb3h5X2FzdCkrRExNX0xWQl9MRU4pCiAKICNkZWZpbmUgRExNX01PRF9LRVkgKDB4NjY2YzYxNzIpCi1lbnVtIGRsbV9xdWVyeV9qb2luX3Jlc3BvbnNlIHsKK2VudW0gZGxtX3F1ZXJ5X2pvaW5fcmVzcG9uc2VfY29kZSB7CiAJSk9JTl9ESVNBTExPVyA9IDAsCiAJSk9JTl9PSywKIAlKT0lOX09LX05PX01BUCwKKwlKT0lOX1BST1RPQ09MX01JU01BVENILAorfTsKKwordW5pb24gZGxtX3F1ZXJ5X2pvaW5fcmVzcG9uc2UgeworCXUzMiBpbnR2YWw7CisJc3RydWN0IHsKKwkJdTggY29kZTsJLyogUmVzcG9uc2UgY29kZS4gIGRsbV9taW5vciBhbmQgZnNfbWlub3IKKwkJCQkgICBhcmUgb25seSB2YWxpZCBpZiB0aGlzIGlzIEpPSU5fT0sgKi8KKwkJdTggZGxtX21pbm9yOwkvKiBUaGUgbWlub3IgdmVyc2lvbiBvZiB0aGUgcHJvdG9jb2wgdGhlCisJCQkJICAgZGxtIGlzIHNwZWFraW5nLiAqLworCQl1OCBmc19taW5vcjsJLyogVGhlIG1pbm9yIHZlcnNpb24gb2YgdGhlIHByb3RvY29sIHRoZQorCQkJCSAgIGZpbGVzeXN0ZW0gaXMgc3BlYWtpbmcuICovCisJCXU4IHJlc2VydmVkOworCX0gcGFja2V0OwogfTsKIAogc3RydWN0IGRsbV9sb2NrX3JlcXVlc3QKQEAgLTYzMyw2ICs2NTMsOCBAQAogCXU4IG5vZGVfaWR4OwogCXU4IHBhZDFbMl07CiAJdTggbmFtZV9sZW47CisJc3RydWN0IGRsbV9wcm90b2NvbF92ZXJzaW9uIGRsbV9wcm90bzsKKwlzdHJ1Y3QgZGxtX3Byb3RvY29sX3ZlcnNpb24gZnNfcHJvdG87CiAJdTggZG9tYWluW08yTk1fTUFYX05BTUVfTEVOXTsKIAl1OCBub2RlX21hcFtCSVRTX1RPX0JZVEVTKE8yTk1fTUFYX05PREVTKV07CiB9OwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbWRvbWFpbi5jIGIvZnMvb2NmczIvZGxtL2RsbWRvbWFpbi5jCmluZGV4IDY5NTQ1NjUuLjYzOGQyZWIgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbS9kbG1kb21haW4uYworKysgYi9mcy9vY2ZzMi9kbG0vZGxtZG9tYWluLmMKQEAgLTEyMyw2ICsxMjMsMTcgQEAKIExJU1RfSEVBRChkbG1fZG9tYWlucyk7CiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoZGxtX2RvbWFpbl9ldmVudHMpOwogCisvKgorICogVGhlIHN1cHBvcnRlZCBwcm90b2NvbCB2ZXJzaW9uIGZvciBETE0gY29tbXVuaWNhdGlvbi4gIFJ1bm5pbmcgZG9tYWlucworICogd2lsbCBoYXZlIGEgbmVnb3RpYXRlZCB2ZXJzaW9uIHdpdGggdGhlIHNhbWUgbWFqb3IgbnVtYmVyIGFuZCBhIG1pbm9yCisgKiBudW1iZXIgZXF1YWwgb3Igc21hbGxlci4gIFRoZSBkbG1fY3R4dC0+ZGxtX2xvY2tpbmdfcHJvdG8gZmllbGQgc2hvdWxkCisgKiBiZSB1c2VkIHRvIGRldGVybWluZSB3aGF0IGEgcnVubmluZyBkb21haW4gaXMgYWN0dWFsbHkgdXNpbmcuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGxtX3Byb3RvY29sX3ZlcnNpb24gZGxtX3Byb3RvY29sID0geworCS5wdl9tYWpvciA9IDEsCisJLnB2X21pbm9yID0gMCwKK307CisKICNkZWZpbmUgRExNX0RPTUFJTl9CQUNLT0ZGX01TIDIwMAogCiBzdGF0aWMgaW50IGRsbV9xdWVyeV9qb2luX2hhbmRsZXIoc3RydWN0IG8ybmV0X21zZyAqbXNnLCB1MzIgbGVuLCB2b2lkICpkYXRhLApAQCAtMTMzLDYgKzE0NCw4IEBACiAJCQkJICAgdm9pZCAqKnJldF9kYXRhKTsKIHN0YXRpYyBpbnQgZGxtX2V4aXRfZG9tYWluX2hhbmRsZXIoc3RydWN0IG8ybmV0X21zZyAqbXNnLCB1MzIgbGVuLCB2b2lkICpkYXRhLAogCQkJCSAgIHZvaWQgKipyZXRfZGF0YSk7CitzdGF0aWMgaW50IGRsbV9wcm90b2NvbF9jb21wYXJlKHN0cnVjdCBkbG1fcHJvdG9jb2xfdmVyc2lvbiAqZXhpc3RpbmcsCisJCQkJc3RydWN0IGRsbV9wcm90b2NvbF92ZXJzaW9uICpyZXF1ZXN0KTsKIAogc3RhdGljIHZvaWQgZGxtX3VucmVnaXN0ZXJfZG9tYWluX2hhbmRsZXJzKHN0cnVjdCBkbG1fY3R4dCAqZGxtKTsKIApAQCAtNjY4LDExICs2ODEsNDUgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRsbV91bnJlZ2lzdGVyX2RvbWFpbik7CiAKK3N0YXRpYyBpbnQgZGxtX3F1ZXJ5X2pvaW5fcHJvdG9fY2hlY2soY2hhciAqcHJvdG9fdHlwZSwgaW50IG5vZGUsCisJCQkJICAgICAgc3RydWN0IGRsbV9wcm90b2NvbF92ZXJzaW9uICpvdXJzLAorCQkJCSAgICAgIHN0cnVjdCBkbG1fcHJvdG9jb2xfdmVyc2lvbiAqcmVxdWVzdCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IGRsbV9wcm90b2NvbF92ZXJzaW9uIHByb3RvID0gKnJlcXVlc3Q7CisKKwlpZiAoIWRsbV9wcm90b2NvbF9jb21wYXJlKG91cnMsICZwcm90bykpIHsKKwkJbWxvZygwLAorCQkgICAgICJub2RlICV1IHdhbnRlZCB0byBqb2luIHdpdGggJXMgbG9ja2luZyBwcm90b2NvbCAiCisJCSAgICAgIiV1LiV1LCB3ZSByZXNwb25kIHdpdGggJXUuJXVcbiIsCisJCSAgICAgbm9kZSwgcHJvdG9fdHlwZSwKKwkJICAgICByZXF1ZXN0LT5wdl9tYWpvciwKKwkJICAgICByZXF1ZXN0LT5wdl9taW5vciwKKwkJICAgICBwcm90by5wdl9tYWpvciwgcHJvdG8ucHZfbWlub3IpOworCQlyZXF1ZXN0LT5wdl9taW5vciA9IHByb3RvLnB2X21pbm9yOworCQlyYyA9IDA7CisJfSBlbHNlIHsKKwkJbWxvZyhNTF9OT1RJQ0UsCisJCSAgICAgIk5vZGUgJXUgd2FudGVkIHRvIGpvaW4gd2l0aCAlcyBsb2NraW5nICIKKwkJICAgICAicHJvdG9jb2wgJXUuJXUsIGJ1dCB3ZSBoYXZlICV1LiV1LCBkaXNhbGxvd2luZ1xuIiwKKwkJICAgICBub2RlLCBwcm90b190eXBlLAorCQkgICAgIHJlcXVlc3QtPnB2X21ham9yLAorCQkgICAgIHJlcXVlc3QtPnB2X21pbm9yLAorCQkgICAgIG91cnMtPnB2X21ham9yLAorCQkgICAgIG91cnMtPnB2X21pbm9yKTsKKwkJcmMgPSAxOworCX0KKworCXJldHVybiByYzsKK30KKwogc3RhdGljIGludCBkbG1fcXVlcnlfam9pbl9oYW5kbGVyKHN0cnVjdCBvMm5ldF9tc2cgKm1zZywgdTMyIGxlbiwgdm9pZCAqZGF0YSwKIAkJCQkgIHZvaWQgKipyZXRfZGF0YSkKIHsKIAlzdHJ1Y3QgZGxtX3F1ZXJ5X2pvaW5fcmVxdWVzdCAqcXVlcnk7Ci0JZW51bSBkbG1fcXVlcnlfam9pbl9yZXNwb25zZSByZXNwb25zZTsKKwl1bmlvbiBkbG1fcXVlcnlfam9pbl9yZXNwb25zZSByZXNwb25zZSA9IHsKKwkJLnBhY2tldC5jb2RlID0gSk9JTl9ESVNBTExPVywKKwl9OwogCXN0cnVjdCBkbG1fY3R4dCAqZGxtID0gTlVMTDsKIAl1OCBub2RlbnVtOwogCkBAIC02OTAsMTEgKzczNywxMSBAQAogCQltbG9nKDAsICJub2RlICV1IGlzIG5vdCBpbiBvdXIgbGl2ZSBtYXAgeWV0XG4iLAogCQkgICAgIHF1ZXJ5LT5ub2RlX2lkeCk7CiAKLQkJcmVzcG9uc2UgPSBKT0lOX0RJU0FMTE9XOworCQlyZXNwb25zZS5wYWNrZXQuY29kZSA9IEpPSU5fRElTQUxMT1c7CiAJCWdvdG8gcmVzcG9uZDsKIAl9CiAKLQlyZXNwb25zZSA9IEpPSU5fT0tfTk9fTUFQOworCXJlc3BvbnNlLnBhY2tldC5jb2RlID0gSk9JTl9PS19OT19NQVA7CiAKIAlzcGluX2xvY2soJmRsbV9kb21haW5fbG9jayk7CiAJZGxtID0gX19kbG1fbG9va3VwX2RvbWFpbl9mdWxsKHF1ZXJ5LT5kb21haW4sIHF1ZXJ5LT5uYW1lX2xlbik7CkBAIC03MTMsNyArNzYwLDcgQEAKIAkJCQltbG9nKDAsICJkaXNhbGxvdyBqb2luIGFzIG5vZGUgJXUgZG9lcyBub3QgIgogCQkJCSAgICAgImhhdmUgbm9kZSAldSBpbiBpdHMgbm9kZW1hcFxuIiwKIAkJCQkgICAgIHF1ZXJ5LT5ub2RlX2lkeCwgbm9kZW51bSk7Ci0JCQkJcmVzcG9uc2UgPSBKT0lOX0RJU0FMTE9XOworCQkJCXJlc3BvbnNlLnBhY2tldC5jb2RlID0gSk9JTl9ESVNBTExPVzsKIAkJCQlnb3RvIHVubG9ja19yZXNwb25kOwogCQkJfQogCQl9CkBAIC03MzMsMzAgKzc4MCw0OCBAQAogCQkJLypJZiB0aGlzIGlzIGEgYnJhbmQgbmV3IGNvbnRleHQgYW5kIHdlCiAJCQkgKiBoYXZlbid0IHN0YXJ0ZWQgb3VyIGpvaW4gcHJvY2VzcyB5ZXQsIHRoZW4KIAkJCSAqIHRoZSBvdGhlciBub2RlIHdvbiB0aGUgcmFjZS4gKi8KLQkJCXJlc3BvbnNlID0gSk9JTl9PS19OT19NQVA7CisJCQlyZXNwb25zZS5wYWNrZXQuY29kZSA9IEpPSU5fT0tfTk9fTUFQOwogCQl9IGVsc2UgaWYgKGRsbS0+am9pbmluZ19ub2RlICE9IERMTV9MT0NLX1JFU19PV05FUl9VTktOT1dOKSB7CiAJCQkvKiBEaXNhbGxvdyBwYXJhbGxlbCBqb2lucy4gKi8KLQkJCXJlc3BvbnNlID0gSk9JTl9ESVNBTExPVzsKKwkJCXJlc3BvbnNlLnBhY2tldC5jb2RlID0gSk9JTl9ESVNBTExPVzsKIAkJfSBlbHNlIGlmIChkbG0tPnJlY28uc3RhdGUgJiBETE1fUkVDT19TVEFURV9BQ1RJVkUpIHsKIAkJCW1sb2coMCwgIm5vZGUgJXUgdHJ5aW5nIHRvIGpvaW4sIGJ1dCByZWNvdmVyeSAiCiAJCQkgICAgICJpcyBvbmdvaW5nLlxuIiwgYml0KTsKLQkJCXJlc3BvbnNlID0gSk9JTl9ESVNBTExPVzsKKwkJCXJlc3BvbnNlLnBhY2tldC5jb2RlID0gSk9JTl9ESVNBTExPVzsKIAkJfSBlbHNlIGlmICh0ZXN0X2JpdChiaXQsIGRsbS0+cmVjb3ZlcnlfbWFwKSkgewogCQkJbWxvZygwLCAibm9kZSAldSB0cnlpbmcgdG8gam9pbiwgYnV0IGl0ICIKIAkJCSAgICAgInN0aWxsIG5lZWRzIHJlY292ZXJ5LlxuIiwgYml0KTsKLQkJCXJlc3BvbnNlID0gSk9JTl9ESVNBTExPVzsKKwkJCXJlc3BvbnNlLnBhY2tldC5jb2RlID0gSk9JTl9ESVNBTExPVzsKIAkJfSBlbHNlIGlmICh0ZXN0X2JpdChiaXQsIGRsbS0+ZG9tYWluX21hcCkpIHsKIAkJCW1sb2coMCwgIm5vZGUgJXUgdHJ5aW5nIHRvIGpvaW4sIGJ1dCBpdCAiCiAJCQkgICAgICJpcyBzdGlsbCBpbiB0aGUgZG9tYWluISBuZWVkcyByZWNvdmVyeT9cbiIsCiAJCQkgICAgIGJpdCk7Ci0JCQlyZXNwb25zZSA9IEpPSU5fRElTQUxMT1c7CisJCQlyZXNwb25zZS5wYWNrZXQuY29kZSA9IEpPSU5fRElTQUxMT1c7CiAJCX0gZWxzZSB7CiAJCQkvKiBBbHJpZ2h0IHdlJ3JlIGZ1bGx5IGEgcGFydCBvZiB0aGlzIGRvbWFpbgogCQkJICogc28gd2Uga2VlcCBzb21lIHN0YXRlIGFzIHRvIHdobydzIGpvaW5pbmcKIAkJCSAqIGFuZCBpbmRpY2F0ZSB0byBoaW0gdGhhdCBuZWVkcyB0byBiZSBmaXhlZAogCQkJICogdXAuICovCi0JCQlyZXNwb25zZSA9IEpPSU5fT0s7Ci0JCQlfX2RsbV9zZXRfam9pbmluZ19ub2RlKGRsbSwgcXVlcnktPm5vZGVfaWR4KTsKKworCQkJLyogTWFrZSBzdXJlIHdlIHNwZWFrIGNvbXBhdGlibGUgbG9ja2luZyBwcm90b2NvbHMuICAqLworCQkJaWYgKGRsbV9xdWVyeV9qb2luX3Byb3RvX2NoZWNrKCJETE0iLCBiaXQsCisJCQkJCQkgICAgICAgJmRsbS0+ZGxtX2xvY2tpbmdfcHJvdG8sCisJCQkJCQkgICAgICAgJnF1ZXJ5LT5kbG1fcHJvdG8pKSB7CisJCQkJcmVzcG9uc2UucGFja2V0LmNvZGUgPQorCQkJCQlKT0lOX1BST1RPQ09MX01JU01BVENIOworCQkJfSBlbHNlIGlmIChkbG1fcXVlcnlfam9pbl9wcm90b19jaGVjaygiZnMiLCBiaXQsCisJCQkJCQkJICAgICAgJmRsbS0+ZnNfbG9ja2luZ19wcm90bywKKwkJCQkJCQkgICAgICAmcXVlcnktPmZzX3Byb3RvKSkgeworCQkJCXJlc3BvbnNlLnBhY2tldC5jb2RlID0KKwkJCQkJSk9JTl9QUk9UT0NPTF9NSVNNQVRDSDsKKwkJCX0gZWxzZSB7CisJCQkJcmVzcG9uc2UucGFja2V0LmRsbV9taW5vciA9CisJCQkJCXF1ZXJ5LT5kbG1fcHJvdG8ucHZfbWlub3I7CisJCQkJcmVzcG9uc2UucGFja2V0LmZzX21pbm9yID0KKwkJCQkJcXVlcnktPmZzX3Byb3RvLnB2X21pbm9yOworCQkJCXJlc3BvbnNlLnBhY2tldC5jb2RlID0gSk9JTl9PSzsKKwkJCQlfX2RsbV9zZXRfam9pbmluZ19ub2RlKGRsbSwgcXVlcnktPm5vZGVfaWR4KTsKKwkJCX0KIAkJfQogCiAJCXNwaW5fdW5sb2NrKCZkbG0tPnNwaW5sb2NrKTsKQEAgLTc2NSw5ICs4MzAsOSBAQAogCXNwaW5fdW5sb2NrKCZkbG1fZG9tYWluX2xvY2spOwogCiByZXNwb25kOgotCW1sb2coMCwgIldlIHJlc3BvbmQgd2l0aCAldVxuIiwgcmVzcG9uc2UpOworCW1sb2coMCwgIldlIHJlc3BvbmQgd2l0aCAldVxuIiwgcmVzcG9uc2UucGFja2V0LmNvZGUpOwogCi0JcmV0dXJuIHJlc3BvbnNlOworCXJldHVybiByZXNwb25zZS5pbnR2YWw7CiB9CiAKIHN0YXRpYyBpbnQgZGxtX2Fzc2VydF9qb2luZWRfaGFuZGxlcihzdHJ1Y3QgbzJuZXRfbXNnICptc2csIHUzMiBsZW4sIHZvaWQgKmRhdGEsCkBAIC04OTksMTAgKzk2NCwxMSBAQAogCiBzdGF0aWMgaW50IGRsbV9yZXF1ZXN0X2pvaW4oc3RydWN0IGRsbV9jdHh0ICpkbG0sCiAJCQkgICAgaW50IG5vZGUsCi0JCQkgICAgZW51bSBkbG1fcXVlcnlfam9pbl9yZXNwb25zZSAqcmVzcG9uc2UpCisJCQkgICAgZW51bSBkbG1fcXVlcnlfam9pbl9yZXNwb25zZV9jb2RlICpyZXNwb25zZSkKIHsKLQlpbnQgc3RhdHVzLCByZXR2YWw7CisJaW50IHN0YXR1czsKIAlzdHJ1Y3QgZGxtX3F1ZXJ5X2pvaW5fcmVxdWVzdCBqb2luX21zZzsKKwl1bmlvbiBkbG1fcXVlcnlfam9pbl9yZXNwb25zZSBqb2luX3Jlc3A7CiAKIAltbG9nKDAsICJxdWVyeWluZyBub2RlICVkXG4iLCBub2RlKTsKIApAQCAtOTEwLDEyICs5NzYsMTUgQEAKIAlqb2luX21zZy5ub2RlX2lkeCA9IGRsbS0+bm9kZV9udW07CiAJam9pbl9tc2cubmFtZV9sZW4gPSBzdHJsZW4oZGxtLT5uYW1lKTsKIAltZW1jcHkoam9pbl9tc2cuZG9tYWluLCBkbG0tPm5hbWUsIGpvaW5fbXNnLm5hbWVfbGVuKTsKKwlqb2luX21zZy5kbG1fcHJvdG8gPSBkbG0tPmRsbV9sb2NraW5nX3Byb3RvOworCWpvaW5fbXNnLmZzX3Byb3RvID0gZGxtLT5mc19sb2NraW5nX3Byb3RvOwogCiAJLyogY29weSBsaXZlIG5vZGUgbWFwIHRvIGpvaW4gbWVzc2FnZSAqLwogCWJ5dGVfY29weW1hcChqb2luX21zZy5ub2RlX21hcCwgZGxtLT5saXZlX25vZGVzX21hcCwgTzJOTV9NQVhfTk9ERVMpOwogCiAJc3RhdHVzID0gbzJuZXRfc2VuZF9tZXNzYWdlKERMTV9RVUVSWV9KT0lOX01TRywgRExNX01PRF9LRVksICZqb2luX21zZywKLQkJCQkgICAgc2l6ZW9mKGpvaW5fbXNnKSwgbm9kZSwgJnJldHZhbCk7CisJCQkJICAgIHNpemVvZihqb2luX21zZyksIG5vZGUsCisJCQkJICAgICZqb2luX3Jlc3AuaW50dmFsKTsKIAlpZiAoc3RhdHVzIDwgMCAmJiBzdGF0dXMgIT0gLUVOT1BST1RPT1BUKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwpAQCAtOTI4LDE0ICs5OTcsNDEgQEAKIAlpZiAoc3RhdHVzID09IC1FTk9QUk9UT09QVCkgewogCQlzdGF0dXMgPSAwOwogCQkqcmVzcG9uc2UgPSBKT0lOX09LX05PX01BUDsKLQl9IGVsc2UgaWYgKHJldHZhbCA9PSBKT0lOX0RJU0FMTE9XIHx8Ci0JCSAgIHJldHZhbCA9PSBKT0lOX09LIHx8Ci0JCSAgIHJldHZhbCA9PSBKT0lOX09LX05PX01BUCkgewotCQkqcmVzcG9uc2UgPSByZXR2YWw7CisJfSBlbHNlIGlmIChqb2luX3Jlc3AucGFja2V0LmNvZGUgPT0gSk9JTl9ESVNBTExPVyB8fAorCQkgICBqb2luX3Jlc3AucGFja2V0LmNvZGUgPT0gSk9JTl9PS19OT19NQVApIHsKKwkJKnJlc3BvbnNlID0gam9pbl9yZXNwLnBhY2tldC5jb2RlOworCX0gZWxzZSBpZiAoam9pbl9yZXNwLnBhY2tldC5jb2RlID09IEpPSU5fUFJPVE9DT0xfTUlTTUFUQ0gpIHsKKwkJbWxvZyhNTF9OT1RJQ0UsCisJCSAgICAgIlRoaXMgbm9kZSByZXF1ZXN0ZWQgRExNIGxvY2tpbmcgcHJvdG9jb2wgJXUuJXUgYW5kICIKKwkJICAgICAiZmlsZXN5c3RlbSBsb2NraW5nIHByb3RvY29sICV1LiV1LiAgQXQgbGVhc3Qgb25lIG9mICIKKwkJICAgICAidGhlIHByb3RvY29sIHZlcnNpb25zIG9uIG5vZGUgJWQgaXMgbm90IGNvbXBhdGlibGUsICIKKwkJICAgICAiZGlzY29ubmVjdGluZ1xuIiwKKwkJICAgICBkbG0tPmRsbV9sb2NraW5nX3Byb3RvLnB2X21ham9yLAorCQkgICAgIGRsbS0+ZGxtX2xvY2tpbmdfcHJvdG8ucHZfbWlub3IsCisJCSAgICAgZGxtLT5mc19sb2NraW5nX3Byb3RvLnB2X21ham9yLAorCQkgICAgIGRsbS0+ZnNfbG9ja2luZ19wcm90by5wdl9taW5vciwKKwkJICAgICBub2RlKTsKKwkJc3RhdHVzID0gLUVQUk9UTzsKKwkJKnJlc3BvbnNlID0gam9pbl9yZXNwLnBhY2tldC5jb2RlOworCX0gZWxzZSBpZiAoam9pbl9yZXNwLnBhY2tldC5jb2RlID09IEpPSU5fT0spIHsKKwkJKnJlc3BvbnNlID0gam9pbl9yZXNwLnBhY2tldC5jb2RlOworCQkvKiBVc2UgdGhlIHNhbWUgbG9ja2luZyBwcm90b2NvbCBhcyB0aGUgcmVtb3RlIG5vZGUgKi8KKwkJZGxtLT5kbG1fbG9ja2luZ19wcm90by5wdl9taW5vciA9CisJCQlqb2luX3Jlc3AucGFja2V0LmRsbV9taW5vcjsKKwkJZGxtLT5mc19sb2NraW5nX3Byb3RvLnB2X21pbm9yID0KKwkJCWpvaW5fcmVzcC5wYWNrZXQuZnNfbWlub3I7CisJCW1sb2coMCwKKwkJICAgICAiTm9kZSAlZCByZXNwb25kcyBKT0lOX09LIHdpdGggRExNIGxvY2tpbmcgcHJvdG9jb2wgIgorCQkgICAgICIldS4ldSBhbmQgZnMgbG9ja2luZyBwcm90b2NvbCAldS4ldVxuIiwKKwkJICAgICBub2RlLAorCQkgICAgIGRsbS0+ZGxtX2xvY2tpbmdfcHJvdG8ucHZfbWFqb3IsCisJCSAgICAgZGxtLT5kbG1fbG9ja2luZ19wcm90by5wdl9taW5vciwKKwkJICAgICBkbG0tPmZzX2xvY2tpbmdfcHJvdG8ucHZfbWFqb3IsCisJCSAgICAgZGxtLT5mc19sb2NraW5nX3Byb3RvLnB2X21pbm9yKTsKIAl9IGVsc2UgewogCQlzdGF0dXMgPSAtRUlOVkFMOwotCQltbG9nKE1MX0VSUk9SLCAiaW52YWxpZCByZXNwb25zZSAlZCBmcm9tIG5vZGUgJXVcbiIsIHJldHZhbCwKLQkJICAgICBub2RlKTsKKwkJbWxvZyhNTF9FUlJPUiwgImludmFsaWQgcmVzcG9uc2UgJWQgZnJvbSBub2RlICV1XG4iLAorCQkgICAgIGpvaW5fcmVzcC5wYWNrZXQuY29kZSwgbm9kZSk7CiAJfQogCiAJbWxvZygwLCAic3RhdHVzICVkLCBub2RlICVkIHJlc3BvbnNlIGlzICVkXG4iLCBzdGF0dXMsIG5vZGUsCkBAIC0xMDA4LDcgKzExMDQsNyBAQAogCiBzdGF0aWMgaW50IGRsbV9zaG91bGRfcmVzdGFydF9qb2luKHN0cnVjdCBkbG1fY3R4dCAqZGxtLAogCQkJCSAgIHN0cnVjdCBkb21haW5fam9pbl9jdHh0ICpjdHh0LAotCQkJCSAgIGVudW0gZGxtX3F1ZXJ5X2pvaW5fcmVzcG9uc2UgcmVzcG9uc2UpCisJCQkJICAgZW51bSBkbG1fcXVlcnlfam9pbl9yZXNwb25zZV9jb2RlIHJlc3BvbnNlKQogewogCWludCByZXQ7CiAKQEAgLTEwMzQsNyArMTEzMCw3IEBACiB7CiAJaW50IHN0YXR1cyA9IDAsIHRtcHN0YXQsIG5vZGU7CiAJc3RydWN0IGRvbWFpbl9qb2luX2N0eHQgKmN0eHQ7Ci0JZW51bSBkbG1fcXVlcnlfam9pbl9yZXNwb25zZSByZXNwb25zZSA9IEpPSU5fRElTQUxMT1c7CisJZW51bSBkbG1fcXVlcnlfam9pbl9yZXNwb25zZV9jb2RlIHJlc3BvbnNlID0gSk9JTl9ESVNBTExPVzsKIAogCW1sb2dfZW50cnkoIiVwIiwgZGxtKTsKIApAQCAtMTQ1MCwxMCArMTU0NiwzOCBAQAogfQogCiAvKgotICogZGxtX3JlZ2lzdGVyX2RvbWFpbjogb25lLXRpbWUgc2V0dXAgcGVyICJkb21haW4iCisgKiBDb21wYXJlIGEgcmVxdWVzdGVkIGxvY2tpbmcgcHJvdG9jb2wgdmVyc2lvbiBhZ2FpbnN0IHRoZSBjdXJyZW50IG9uZS4KKyAqCisgKiBJZiB0aGUgbWFqb3IgbnVtYmVycyBhcmUgZGlmZmVyZW50LCB0aGV5IGFyZSBpbmNvbXBhdGlibGUuCisgKiBJZiB0aGUgY3VycmVudCBtaW5vciBpcyBncmVhdGVyIHRoYW4gdGhlIHJlcXVlc3QsIHRoZXkgYXJlIGluY29tcGF0aWJsZS4KKyAqIElmIHRoZSBjdXJyZW50IG1pbm9yIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgcmVxdWVzdCwgdGhleSBhcmUKKyAqIGNvbXBhdGlibGUsIGFuZCB0aGUgcmVxdWVzdGVyIHNob3VsZCBydW4gYXQgdGhlIGN1cnJlbnQgbWlub3IgdmVyc2lvbi4KKyAqLworc3RhdGljIGludCBkbG1fcHJvdG9jb2xfY29tcGFyZShzdHJ1Y3QgZGxtX3Byb3RvY29sX3ZlcnNpb24gKmV4aXN0aW5nLAorCQkJCXN0cnVjdCBkbG1fcHJvdG9jb2xfdmVyc2lvbiAqcmVxdWVzdCkKK3sKKwlpZiAoZXhpc3RpbmctPnB2X21ham9yICE9IHJlcXVlc3QtPnB2X21ham9yKQorCQlyZXR1cm4gMTsKKworCWlmIChleGlzdGluZy0+cHZfbWlub3IgPiByZXF1ZXN0LT5wdl9taW5vcikKKwkJcmV0dXJuIDE7CisKKwlpZiAoZXhpc3RpbmctPnB2X21pbm9yIDwgcmVxdWVzdC0+cHZfbWlub3IpCisJCXJlcXVlc3QtPnB2X21pbm9yID0gZXhpc3RpbmctPnB2X21pbm9yOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBkbG1fcmVnaXN0ZXJfZG9tYWluOiBvbmUtdGltZSBzZXR1cCBwZXIgImRvbWFpbiIuCisgKgorICogVGhlIGZpbGVzeXN0ZW0gcGFzc2VzIGluIHRoZSByZXF1ZXN0ZWQgbG9ja2luZyB2ZXJzaW9uIHZpYSBwcm90by4KKyAqIElmIHJlZ2lzdHJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgcHJvdG8gd2lsbCBjb250YWluIHRoZSBuZWdvdGlhdGVkCisgKiBsb2NraW5nIHByb3RvY29sLgogICovCiBzdHJ1Y3QgZGxtX2N0eHQgKiBkbG1fcmVnaXN0ZXJfZG9tYWluKGNvbnN0IGNoYXIgKmRvbWFpbiwKLQkJCSAgICAgICB1MzIga2V5KQorCQkJICAgICAgIHUzMiBrZXksCisJCQkgICAgICAgc3RydWN0IGRsbV9wcm90b2NvbF92ZXJzaW9uICpmc19wcm90bykKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBkbG1fY3R4dCAqZGxtID0gTlVMTDsKQEAgLTE0OTYsNiArMTYyMCwxNSBAQAogCQkJZ290byByZXRyeTsKIAkJfQogCisJCWlmIChkbG1fcHJvdG9jb2xfY29tcGFyZSgmZGxtLT5mc19sb2NraW5nX3Byb3RvLCBmc19wcm90bykpIHsKKwkJCW1sb2coTUxfRVJST1IsCisJCQkgICAgICJSZXF1ZXN0ZWQgbG9ja2luZyBwcm90b2NvbCB2ZXJzaW9uIGlzIG5vdCAiCisJCQkgICAgICJjb21wYXRpYmxlIHdpdGggYWxyZWFkeSByZWdpc3RlcmVkIGRvbWFpbiAiCisJCQkgICAgICJcIiVzXCJcbiIsIGRvbWFpbik7CisJCQlyZXQgPSAtRVBST1RPOworCQkJZ290byBsZWF2ZTsKKwkJfQorCiAJCV9fZGxtX2dldChkbG0pOwogCQlkbG0tPm51bV9qb2lucysrOwogCkBAIC0xNTI2LDYgKzE2NTksMTMgQEAKIAlsaXN0X2FkZF90YWlsKCZkbG0tPmxpc3QsICZkbG1fZG9tYWlucyk7CiAJc3Bpbl91bmxvY2soJmRsbV9kb21haW5fbG9jayk7CiAKKwkvKgorCSAqIFBhc3MgdGhlIGxvY2tpbmcgcHJvdG9jb2wgdmVyc2lvbiBpbnRvIHRoZSBqb2luLiAgSWYgdGhlIGpvaW4KKwkgKiBzdWNjZWVkcywgaXQgd2lsbCBoYXZlIHRoZSBuZWdvdGlhdGVkIHByb3RvY29sIHNldC4KKwkgKi8KKwlkbG0tPmRsbV9sb2NraW5nX3Byb3RvID0gZGxtX3Byb3RvY29sOworCWRsbS0+ZnNfbG9ja2luZ19wcm90byA9ICpmc19wcm90bzsKKwogCXJldCA9IGRsbV9qb2luX2RvbWFpbihkbG0pOwogCWlmIChyZXQpIHsKIAkJbWxvZ19lcnJubyhyZXQpOwpAQCAtMTUzMyw2ICsxNjczLDkgQEAKIAkJZ290byBsZWF2ZTsKIAl9CiAKKwkvKiBUZWxsIHRoZSBjYWxsZXIgd2hhdCBsb2NraW5nIHByb3RvY29sIHdlIG5lZ290aWF0ZWQgKi8KKwkqZnNfcHJvdG8gPSBkbG0tPmZzX2xvY2tpbmdfcHJvdG87CisKIAlyZXQgPSAwOwogbGVhdmU6CiAJaWYgKG5ld19jdHh0KQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbWZzLmMgYi9mcy9vY2ZzMi9kbG0vZGxtZnMuYwppbmRleCA2NjM5YmFhLi42MWEwMDBmIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vZGxtZnMuYworKysgYi9mcy9vY2ZzMi9kbG0vZGxtZnMuYwpAQCAtNjAsNiArNjAsOCBAQAogI2RlZmluZSBNTE9HX01BU0tfUFJFRklYIE1MX0RMTUZTCiAjaW5jbHVkZSAiY2x1c3Rlci9tYXNrbG9nLmgiCiAKKyNpbmNsdWRlICJvY2ZzMl9sb2NraW5ndmVyLmgiCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBkbG1mc19vcHM7CiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkbG1mc19maWxlX29wZXJhdGlvbnM7CiBzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZGxtZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CkBAIC03MCw2ICs3MiwxNiBAQAogc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnVzZXJfZGxtX3dvcmtlcjsKIAogLyoKKyAqIFRoaXMgaXMgdGhlIHVzZXJkbG1mcyBsb2NraW5nIHByb3RvY29sIHZlcnNpb24uCisgKgorICogU2VlIGZzL29jZnMyL2RsbWdsdWUuYyBmb3IgbW9yZSBkZXRhaWxzIG9uIGxvY2tpbmcgdmVyc2lvbnMuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGxtX3Byb3RvY29sX3ZlcnNpb24gdXNlcl9sb2NraW5nX3Byb3RvY29sID0geworCS5wdl9tYWpvciA9IE9DRlMyX0xPQ0tJTkdfUFJPVE9DT0xfTUFKT1IsCisJLnB2X21pbm9yID0gT0NGUzJfTE9DS0lOR19QUk9UT0NPTF9NSU5PUiwKK307CisKKy8qCiAgKiBkZWNvZGVzIGEgc2V0IG9mIG9wZW4gZmxhZ3MgaW50byBhIHZhbGlkIGxvY2sgbGV2ZWwgYW5kIGEgc2V0IG9mIGZsYWdzLgogICogcmV0dXJucyA8IDAgaWYgd2UgaGF2ZSBpbnZhbGlkIGZsYWdzCiAgKiBmbGFncyB3aGljaCBtZWFuIHNvbWV0aGluZyB0byB1czoKQEAgLTQxNiw2ICs0MjgsNyBAQAogCXN0cnVjdCBxc3RyICpkb21haW4gPSAmZGVudHJ5LT5kX25hbWU7CiAJc3RydWN0IGRsbWZzX2lub2RlX3ByaXZhdGUgKmlwOwogCXN0cnVjdCBkbG1fY3R4dCAqZGxtOworCXN0cnVjdCBkbG1fcHJvdG9jb2xfdmVyc2lvbiBwcm90byA9IHVzZXJfbG9ja2luZ19wcm90b2NvbDsKIAogCW1sb2coMCwgIm1rZGlyICUuKnNcbiIsIGRvbWFpbi0+bGVuLCBkb21haW4tPm5hbWUpOwogCkBAIC00MzUsNyArNDQ4LDcgQEAKIAogCWlwID0gRExNRlNfSShpbm9kZSk7CiAKLQlkbG0gPSB1c2VyX2RsbV9yZWdpc3Rlcl9jb250ZXh0KGRvbWFpbik7CisJZGxtID0gdXNlcl9kbG1fcmVnaXN0ZXJfY29udGV4dChkb21haW4sICZwcm90byk7CiAJaWYgKElTX0VSUihkbG0pKSB7CiAJCXN0YXR1cyA9IFBUUl9FUlIoZGxtKTsKIAkJbWxvZyhNTF9FUlJPUiwgIkVycm9yICVkIGNvdWxkIG5vdCByZWdpc3RlciBkb21haW4gXCIlLipzXCJcbiIsCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG0vdXNlcmRsbS5jIGIvZnMvb2NmczIvZGxtL3VzZXJkbG0uYwppbmRleCA3ZDJmNTc4Li40Y2IxZDNkIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG0vdXNlcmRsbS5jCisrKyBiL2ZzL29jZnMyL2RsbS91c2VyZGxtLmMKQEAgLTY0NSw3ICs2NDUsOCBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0cnVjdCBkbG1fY3R4dCAqdXNlcl9kbG1fcmVnaXN0ZXJfY29udGV4dChzdHJ1Y3QgcXN0ciAqbmFtZSkKK3N0cnVjdCBkbG1fY3R4dCAqdXNlcl9kbG1fcmVnaXN0ZXJfY29udGV4dChzdHJ1Y3QgcXN0ciAqbmFtZSwKKwkJCQkJICAgc3RydWN0IGRsbV9wcm90b2NvbF92ZXJzaW9uICpwcm90bykKIHsKIAlzdHJ1Y3QgZGxtX2N0eHQgKmRsbTsKIAl1MzIgZGxtX2tleTsKQEAgLTY2MSw3ICs2NjIsNyBAQAogCiAJc25wcmludGYoZG9tYWluLCBuYW1lLT5sZW4gKyAxLCAiJS4qcyIsIG5hbWUtPmxlbiwgbmFtZS0+bmFtZSk7CiAKLQlkbG0gPSBkbG1fcmVnaXN0ZXJfZG9tYWluKGRvbWFpbiwgZGxtX2tleSk7CisJZGxtID0gZGxtX3JlZ2lzdGVyX2RvbWFpbihkb21haW4sIGRsbV9rZXksIHByb3RvKTsKIAlpZiAoSVNfRVJSKGRsbSkpCiAJCW1sb2dfZXJybm8oUFRSX0VSUihkbG0pKTsKIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL3VzZXJkbG0uaCBiL2ZzL29jZnMyL2RsbS91c2VyZGxtLmgKaW5kZXggYzQwMGU5My4uMzllYzI3NyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL3VzZXJkbG0uaAorKysgYi9mcy9vY2ZzMi9kbG0vdXNlcmRsbS5oCkBAIC04Myw3ICs4Myw4IEBACiB2b2lkIHVzZXJfZGxtX3JlYWRfbHZiKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCSAgICAgICBjaGFyICp2YWwsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgbGVuKTsKLXN0cnVjdCBkbG1fY3R4dCAqdXNlcl9kbG1fcmVnaXN0ZXJfY29udGV4dChzdHJ1Y3QgcXN0ciAqbmFtZSk7CitzdHJ1Y3QgZGxtX2N0eHQgKnVzZXJfZGxtX3JlZ2lzdGVyX2NvbnRleHQoc3RydWN0IHFzdHIgKm5hbWUsCisJCQkJCSAgIHN0cnVjdCBkbG1fcHJvdG9jb2xfdmVyc2lvbiAqcHJvdG8pOwogdm9pZCB1c2VyX2RsbV91bnJlZ2lzdGVyX2NvbnRleHQoc3RydWN0IGRsbV9jdHh0ICpkbG0pOwogCiBzdHJ1Y3QgZGxtZnNfaW5vZGVfcHJpdmF0ZSB7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG1nbHVlLmMgYi9mcy9vY2ZzMi9kbG1nbHVlLmMKaW5kZXggMzg2NzI0NC4uMzUxMTMwYyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtZ2x1ZS5jCisrKyBiL2ZzL29jZnMyL2RsbWdsdWUuYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPGNsdXN0ZXIvbWFza2xvZy5oPgogCiAjaW5jbHVkZSAib2NmczIuaCIKKyNpbmNsdWRlICJvY2ZzMl9sb2NraW5ndmVyLmgiCiAKICNpbmNsdWRlICJhbGxvYy5oIgogI2luY2x1ZGUgImRjYWNoZS5oIgpAQCAtMjU4LDYgKzI1OSwzMSBAQAogCS5mbGFncwkJPSAwLAogfTsKIAorLyoKKyAqIFRoaXMgaXMgdGhlIGZpbGVzeXN0ZW0gbG9ja2luZyBwcm90b2NvbCB2ZXJzaW9uLgorICoKKyAqIFdoZW5ldmVyIHRoZSBmaWxlc3lzdGVtIGRvZXMgbmV3IHRoaW5ncyB3aXRoIGxvY2tzIChhZGRzIG9yIHJlbW92ZXMgYQorICogbG9jaywgb3JkZXJzIHRoZW0gZGlmZmVyZW50bHksIGRvZXMgZGlmZmVyZW50IHRoaW5ncyB1bmRlcm5lYXRoIGEgbG9jayksCisgKiB0aGUgdmVyc2lvbiBtdXN0IGJlIGNoYW5nZWQuICBUaGUgcHJvdG9jb2wgaXMgbmVnb3RpYXRlZCB3aGVuIGpvaW5pbmcKKyAqIHRoZSBkbG0gZG9tYWluLiAgQSBub2RlIG1heSBqb2luIHRoZSBkb21haW4gaWYgaXRzIG1ham9yIHZlcnNpb24gaXMKKyAqIGlkZW50aWNhbCB0byBhbGwgb3RoZXIgbm9kZXMgYW5kIGl0cyBtaW5vciB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbgorICogb3IgZXF1YWwgdG8gYWxsIG90aGVyIG5vZGVzLiAgV2hlbiBpdHMgbWlub3IgdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4KKyAqIHRoZSBvdGhlciBub2RlcywgaXQgd2lsbCBydW4gYXQgdGhlIG1pbm9yIHZlcnNpb24gc3BlY2lmaWVkIGJ5IHRoZQorICogb3RoZXIgbm9kZXMuCisgKgorICogSWYgYSBsb2NraW5nIGNoYW5nZSBpcyBtYWRlIHRoYXQgd2lsbCBub3QgYmUgY29tcGF0aWJsZSB3aXRoIG9sZGVyCisgKiB2ZXJzaW9ucywgdGhlIG1ham9yIG51bWJlciBtdXN0IGJlIGluY3JlYXNlZCBhbmQgdGhlIG1pbm9yIHZlcnNpb24gc2V0CisgKiB0byB6ZXJvLiAgSWYgYSBjaGFuZ2UgbWVyZWx5IGFkZHMgYSBiZWhhdmlvciB0aGF0IGNhbiBiZSBkaXNhYmxlZCB3aGVuCisgKiBzcGVha2luZyB0byBvbGRlciB2ZXJzaW9ucywgdGhlIG1pbm9yIHZlcnNpb24gbXVzdCBiZSBpbmNyZWFzZWQuICBJZiBhCisgKiBjaGFuZ2UgYWRkcyBhIGZ1bGx5IGJhY2t3YXJkcyBjb21wYXRpYmxlIGNoYW5nZSAoZWcsIExWQiBjaGFuZ2VzIHRoYXQKKyAqIGFyZSBqdXN0IGlnbm9yZWQgYnkgb2xkZXIgdmVyc2lvbnMpLCB0aGUgdmVyc2lvbiBkb2VzIG5vdCBuZWVkIHRvIGJlCisgKiB1cGRhdGVkLgorICovCitjb25zdCBzdHJ1Y3QgZGxtX3Byb3RvY29sX3ZlcnNpb24gb2NmczJfbG9ja2luZ19wcm90b2NvbCA9IHsKKwkucHZfbWFqb3IgPSBPQ0ZTMl9MT0NLSU5HX1BST1RPQ09MX01BSk9SLAorCS5wdl9taW5vciA9IE9DRlMyX0xPQ0tJTkdfUFJPVE9DT0xfTUlOT1IsCit9OworCiBzdGF0aWMgaW5saW5lIGludCBvY2ZzMl9pc19pbm9kZV9sb2NrKHN0cnVjdCBvY2ZzMl9sb2NrX3JlcyAqbG9ja3JlcykKIHsKIAlyZXR1cm4gbG9ja3Jlcy0+bF90eXBlID09IE9DRlMyX0xPQ0tfVFlQRV9NRVRBIHx8CkBAIC0yNTA2LDcgKzI1MzIsOCBAQAogCWRsbV9rZXkgPSBjcmMzMl9sZSgwLCBvc2ItPnV1aWRfc3RyLCBzdHJsZW4ob3NiLT51dWlkX3N0cikpOwogCiAJLyogZm9yIG5vdywgdXVpZCA9PSBkb21haW4gKi8KLQlkbG0gPSBkbG1fcmVnaXN0ZXJfZG9tYWluKG9zYi0+dXVpZF9zdHIsIGRsbV9rZXkpOworCWRsbSA9IGRsbV9yZWdpc3Rlcl9kb21haW4ob3NiLT51dWlkX3N0ciwgZGxtX2tleSwKKwkJCQkgICZvc2ItPm9zYl9sb2NraW5nX3Byb3RvKTsKIAlpZiAoSVNfRVJSKGRsbSkpIHsKIAkJc3RhdHVzID0gUFRSX0VSUihkbG0pOwogCQltbG9nX2Vycm5vKHN0YXR1cyk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9kbG1nbHVlLmggYi9mcy9vY2ZzMi9kbG1nbHVlLmgKaW5kZXggNWYxNzI0My4uMWQ1YjA2OSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtZ2x1ZS5oCisrKyBiL2ZzL29jZnMyL2RsbWdsdWUuaApAQCAtMTE2LDQgKzExNiw1IEBACiBzdHJ1Y3Qgb2NmczJfZGxtX2RlYnVnICpvY2ZzMl9uZXdfZGxtX2RlYnVnKHZvaWQpOwogdm9pZCBvY2ZzMl9wdXRfZGxtX2RlYnVnKHN0cnVjdCBvY2ZzMl9kbG1fZGVidWcgKmRsbV9kZWJ1Zyk7CiAKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZGxtX3Byb3RvY29sX3ZlcnNpb24gb2NmczJfbG9ja2luZ19wcm90b2NvbDsKICNlbmRpZgkvKiBETE1HTFVFX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2VuZGlhbi5oIGIvZnMvb2NmczIvZW5kaWFuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NDJlMDkuLjAwMDAwMDAKLS0tIGEvZnMvb2NmczIvZW5kaWFuLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKiAtKi0gbW9kZTogYzsgYy1iYXNpYy1vZmZzZXQ6IDg7IC0qLQotICogdmltOiBub2V4cGFuZHRhYiBzdz04IHRzPTggc3RzPTA6Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDA1IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgotICovCi0KLSNpZm5kZWYgT0NGUzJfRU5ESUFOX0gKLSNkZWZpbmUgT0NGUzJfRU5ESUFOX0gKLQotc3RhdGljIGlubGluZSB2b2lkIGxlMTZfYWRkX2NwdShfX2xlMTYgKnZhciwgdTE2IHZhbCkKLXsKLQkqdmFyID0gY3B1X3RvX2xlMTYobGUxNl90b19jcHUoKnZhcikgKyB2YWwpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbGUzMl9hZGRfY3B1KF9fbGUzMiAqdmFyLCB1MzIgdmFsKQotewotCSp2YXIgPSBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdSgqdmFyKSArIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBsZTY0X2FkZF9jcHUoX19sZTY0ICp2YXIsIHU2NCB2YWwpCi17Ci0JKnZhciA9IGNwdV90b19sZTY0KGxlNjRfdG9fY3B1KCp2YXIpICsgdmFsKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGJlMzJfYWRkX2NwdShfX2JlMzIgKnZhciwgdTMyIHZhbCkKLXsKLQkqdmFyID0gY3B1X3RvX2JlMzIoYmUzMl90b19jcHUoKnZhcikgKyB2YWwpOwotfQotCi0jZW5kaWYgLyogT0NGUzJfRU5ESUFOX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL29jZnMyLmggYi9mcy9vY2ZzMi9vY2ZzMi5oCmluZGV4IGQwODQ4MDUuLjY1NDZjZWYgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL29jZnMyLmgKKysrIGIvZnMvb2NmczIvb2NmczIuaApAQCAtNDMsNyArNDMsNiBAQAogI2luY2x1ZGUgImRsbS9kbG1hcGkuaCIKIAogI2luY2x1ZGUgIm9jZnMyX2ZzLmgiCi0jaW5jbHVkZSAiZW5kaWFuLmgiCiAjaW5jbHVkZSAib2NmczJfbG9ja2lkLmgiCiAKIC8qIE1vc3QgdXNlciB2aXNpYmxlIE9DRlMyIGlub2RlcyB3aWxsIGhhdmUgdmVyeSBmZXcgcGllY2VzIG9mCkBAIC0yNTEsNiArMjUwLDcgQEAKIAlzdHJ1Y3Qgb2NmczJfbG9ja19yZXMgb3NiX3JlbmFtZV9sb2NrcmVzOwogCXN0cnVjdCBkbG1fZXZpY3Rpb25fY2Igb3NiX2V2aWN0aW9uX2NiOwogCXN0cnVjdCBvY2ZzMl9kbG1fZGVidWcgKm9zYl9kbG1fZGVidWc7CisJc3RydWN0IGRsbV9wcm90b2NvbF92ZXJzaW9uIG9zYl9sb2NraW5nX3Byb3RvOwogCiAJc3RydWN0IGRlbnRyeSAqb3NiX2RlYnVnX3Jvb3Q7CiAKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL29jZnMyX2xvY2tpbmd2ZXIuaCBiL2ZzL29jZnMyL29jZnMyX2xvY2tpbmd2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmQ1ZWVhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvb2NmczIvb2NmczJfbG9ja2luZ3Zlci5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qIC0qLSBtb2RlOiBjOyBjLWJhc2ljLW9mZnNldDogODsgLSotCisgKiB2aW06IG5vZXhwYW5kdGFiIHN3PTggdHM9OCBzdHM9MDoKKyAqCisgKiBvY2ZzMl9sb2NraW5ndmVyLmgKKyAqCisgKiBEZWZpbmVzIE9DRlMyIExvY2tpbmcgdmVyc2lvbiB2YWx1ZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBPQ0ZTMl9MT0NLSU5HVkVSX0gKKyNkZWZpbmUgT0NGUzJfTE9DS0lOR1ZFUl9ICisKKy8qCisgKiBUaGUgcHJvdG9jb2wgdmVyc2lvbiBmb3Igb2NmczIgY2x1c3RlciBsb2NraW5nLiAgU2VlIGRsbWdsdWUuYyBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworI2RlZmluZSBPQ0ZTMl9MT0NLSU5HX1BST1RPQ09MX01BSk9SIDEKKyNkZWZpbmUgT0NGUzJfTE9DS0lOR19QUk9UT0NPTF9NSU5PUiAwCisKKyNlbmRpZiAgLyogT0NGUzJfTE9DS0lOR1ZFUl9IICovCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zdXBlci5jIGIvZnMvb2NmczIvc3VwZXIuYwppbmRleCAwMWZlNDBlLi5iZWM3NWFmIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zdXBlci5jCisrKyBiL2ZzL29jZnMyL3N1cGVyLmMKQEAgLTEzNTUsNiArMTM1NSw3IEBACiAJc2ItPnNfZnNfaW5mbyA9IG9zYjsKIAlzYi0+c19vcCA9ICZvY2ZzMl9zb3BzOwogCXNiLT5zX2V4cG9ydF9vcCA9ICZvY2ZzMl9leHBvcnRfb3BzOworCW9zYi0+b3NiX2xvY2tpbmdfcHJvdG8gPSBvY2ZzMl9sb2NraW5nX3Byb3RvY29sOwogCXNiLT5zX3RpbWVfZ3JhbiA9IDE7CiAJc2ItPnNfZmxhZ3MgfD0gTVNfTk9BVElNRTsKIAkvKiB0aGlzIGlzIG5lZWRlZCB0byBzdXBwb3J0IE9fTEFSR0VGSUxFICovCmRpZmYgLS1naXQgYS9mcy9vcGVuLmMgYi9mcy9vcGVuLmMKaW5kZXggNDkzMmI0ZDEuLjQzZmNkNjAgMTAwNjQ0Ci0tLSBhL2ZzL29wZW4uYworKysgYi9mcy9vcGVuLmMKQEAgLTk5MSw3ICs5OTEsNyBAQAogCQlmaWxlcy0+bmV4dF9mZCA9IGZkOwogfQogCi12b2lkIGZhc3RjYWxsIHB1dF91bnVzZWRfZmQodW5zaWduZWQgaW50IGZkKQordm9pZCBwdXRfdW51c2VkX2ZkKHVuc2lnbmVkIGludCBmZCkKIHsKIAlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOwogCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CkBAIC0xMDE0LDcgKzEwMTQsNyBAQAogICogd2lsbCBmb2xsb3cuCiAgKi8KIAotdm9pZCBmYXN0Y2FsbCBmZF9pbnN0YWxsKHVuc2lnbmVkIGludCBmZCwgc3RydWN0IGZpbGUgKiBmaWxlKQordm9pZCBmZF9pbnN0YWxsKHVuc2lnbmVkIGludCBmZCwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBjdXJyZW50LT5maWxlczsKIAlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwpAQCAtMTA2MSw3ICsxMDYxLDYgQEAKIAlwcmV2ZW50X3RhaWxfY2FsbChyZXQpOwogCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfVU5VU0VEX1NZTUJPTF9HUEwoc3lzX29wZW4pOyAvKiBUbyBiZSBkZWxldGVkIGZvciAyLjYuMjUgKi8KIAogYXNtbGlua2FnZSBsb25nIHN5c19vcGVuYXQoaW50IGRmZCwgY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MsCiAJCQkgICBpbnQgbW9kZSkKZGlmZiAtLWdpdCBhL2ZzL29wZW5wcm9tZnMvaW5vZGUuYyBiL2ZzL29wZW5wcm9tZnMvaW5vZGUuYwppbmRleCA2YjdmZjE2Li5kMTdiNGZkIDEwMDY0NAotLS0gYS9mcy9vcGVucHJvbWZzL2lub2RlLmMKKysrIGIvZnMvb3BlbnByb21mcy9pbm9kZS5jCkBAIC0zOCw2ICszOCw4IEBACiAJdW5pb24gb3BfaW5vZGVfZGF0YQl1OwogfTsKIAorc3RhdGljIHN0cnVjdCBpbm9kZSAqb3BlbnByb21faWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbm9fdCBpbm8pOworCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBvcF9pbm9kZV9pbmZvICpPUF9JKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJcmV0dXJuIGNvbnRhaW5lcl9vZihpbm9kZSwgc3RydWN0IG9wX2lub2RlX2luZm8sIHZmc19pbm9kZSk7CkBAIC0yMjYsMTAgKzIyOCwxMCBAQAogCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwogCiBmb3VuZDoKLQlpbm9kZSA9IGlnZXQoZGlyLT5pX3NiLCBpbm8pOworCWlub2RlID0gb3BlbnByb21faWdldChkaXItPmlfc2IsIGlubyk7CiAJbXV0ZXhfdW5sb2NrKCZvcF9tdXRleCk7Ci0JaWYgKCFpbm9kZSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJaWYgKElTX0VSUihpbm9kZSkpCisJCXJldHVybiBFUlJfQ0FTVChpbm9kZSk7CiAJZW50X29pID0gT1BfSShpbm9kZSk7CiAJZW50X29pLT50eXBlID0gZW50X3R5cGU7CiAJZW50X29pLT51ID0gZW50X2RhdGE7CkBAIC0zNDgsMTQgKzM1MCwyMyBAQAogCWttZW1fY2FjaGVfZnJlZShvcF9pbm9kZV9jYWNoZXAsIE9QX0koaW5vZGUpKTsKIH0KIAotc3RhdGljIHZvaWQgb3BlbnByb21fcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKm9wZW5wcm9tX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW5vX3QgaW5vKQogewotCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKLQlpZiAoaW5vZGUtPmlfaW5vID09IE9QRU5QUk9NX1JPT1RfSU5PKSB7Ci0JCWlub2RlLT5pX29wID0gJm9wZW5wcm9tX2lub2RlX29wZXJhdGlvbnM7Ci0JCWlub2RlLT5pX2ZvcCA9ICZvcGVucHJvbV9vcGVyYXRpb25zOwotCQlpbm9kZS0+aV9tb2RlID0gU19JRkRJUiB8IFNfSVJVR08gfCBTX0lYVUdPOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlpbm9kZSA9IGlnZXRfbG9ja2VkKHNiLCBpbm8pOworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWlmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSB7CisJCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwkJaWYgKGlub2RlLT5pX2lubyA9PSBPUEVOUFJPTV9ST09UX0lOTykgeworCQkJaW5vZGUtPmlfb3AgPSAmb3BlbnByb21faW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX2ZvcCA9ICZvcGVucHJvbV9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfbW9kZSA9IFNfSUZESVIgfCBTX0lSVUdPIHwgU19JWFVHTzsKKwkJfQorCQl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKIAl9CisJcmV0dXJuIGlub2RlOwogfQogCiBzdGF0aWMgaW50IG9wZW5wcm9tX3JlbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSkKQEAgLTM2Nyw3ICszNzgsNiBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIG9wZW5wcm9tX3NvcHMgPSB7CiAJLmFsbG9jX2lub2RlCT0gb3BlbnByb21fYWxsb2NfaW5vZGUsCiAJLmRlc3Ryb3lfaW5vZGUJPSBvcGVucHJvbV9kZXN0cm95X2lub2RlLAotCS5yZWFkX2lub2RlCT0gb3BlbnByb21fcmVhZF9pbm9kZSwKIAkuc3RhdGZzCQk9IHNpbXBsZV9zdGF0ZnMsCiAJLnJlbW91bnRfZnMJPSBvcGVucHJvbV9yZW1vdW50LAogfTsKQEAgLTM3Niw2ICszODYsNyBAQAogewogCXN0cnVjdCBpbm9kZSAqcm9vdF9pbm9kZTsKIAlzdHJ1Y3Qgb3BfaW5vZGVfaW5mbyAqb2k7CisJaW50IHJldDsKIAogCXMtPnNfZmxhZ3MgfD0gTVNfTk9BVElNRTsKIAlzLT5zX2Jsb2Nrc2l6ZSA9IDEwMjQ7CkBAIC0zODMsOSArMzk0LDExIEBACiAJcy0+c19tYWdpYyA9IE9QRU5QUk9NX1NVUEVSX01BR0lDOwogCXMtPnNfb3AgPSAmb3BlbnByb21fc29wczsKIAlzLT5zX3RpbWVfZ3JhbiA9IDE7Ci0Jcm9vdF9pbm9kZSA9IGlnZXQocywgT1BFTlBST01fUk9PVF9JTk8pOwotCWlmICghcm9vdF9pbm9kZSkKKwlyb290X2lub2RlID0gb3BlbnByb21faWdldChzLCBPUEVOUFJPTV9ST09UX0lOTyk7CisJaWYgKElTX0VSUihyb290X2lub2RlKSkgeworCQlyZXQgPSBQVFJfRVJSKHJvb3RfaW5vZGUpOwogCQlnb3RvIG91dF9ub19yb290OworCX0KIAogCW9pID0gT1BfSShyb290X2lub2RlKTsKIAlvaS0+dHlwZSA9IG9wX2lub2RlX25vZGU7CkBAIC0zOTMsMTMgKzQwNiwxNSBAQAogCiAJcy0+c19yb290ID0gZF9hbGxvY19yb290KHJvb3RfaW5vZGUpOwogCWlmICghcy0+c19yb290KQotCQlnb3RvIG91dF9ub19yb290OworCQlnb3RvIG91dF9ub19yb290X2RlbnRyeTsKIAlyZXR1cm4gMDsKIAorb3V0X25vX3Jvb3RfZGVudHJ5OgorCWlwdXQocm9vdF9pbm9kZSk7CisJcmV0ID0gLUVOT01FTTsKIG91dF9ub19yb290OgogCXByaW50aygib3BlbnByb21fZmlsbF9zdXBlcjogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKTsKLQlpcHV0KHJvb3RfaW5vZGUpOwotCXJldHVybiAtRU5PTUVNOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgb3BlbnByb21fZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLApkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9jaGVjay5jIGIvZnMvcGFydGl0aW9ucy9jaGVjay5jCmluZGV4IDczOWRhNzAuLjAzZjgwOGMgMTAwNjQ0Ci0tLSBhL2ZzL3BhcnRpdGlvbnMvY2hlY2suYworKysgYi9mcy9wYXJ0aXRpb25zL2NoZWNrLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CiAKICNpbmNsdWRlICJjaGVjay5oIgogCkBAIC0yMTUsOSArMjE2LDI1IEBACiB7CiAJc3RydWN0IGhkX3N0cnVjdCAqcCA9IGRldl90b19wYXJ0KGRldik7CiAKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlOHUgJThsbHUgJTh1ICU4bGx1XG4iLAotCQkgICAgICAgcC0+aW9zWzBdLCAodW5zaWduZWQgbG9uZyBsb25nKXAtPnNlY3RvcnNbMF0sCi0JCSAgICAgICBwLT5pb3NbMV0sICh1bnNpZ25lZCBsb25nIGxvbmcpcC0+c2VjdG9yc1sxXSk7CisJcHJlZW1wdF9kaXNhYmxlKCk7CisJcGFydF9yb3VuZF9zdGF0cyhwKTsKKwlwcmVlbXB0X2VuYWJsZSgpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwKKwkJIiU4bHUgJThsdSAlOGxsdSAlOHUgIgorCQkiJThsdSAlOGx1ICU4bGx1ICU4dSAiCisJCSIlOHUgJTh1ICU4dSIKKwkJIlxuIiwKKwkJcGFydF9zdGF0X3JlYWQocCwgaW9zW1JFQURdKSwKKwkJcGFydF9zdGF0X3JlYWQocCwgbWVyZ2VzW1JFQURdKSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylwYXJ0X3N0YXRfcmVhZChwLCBzZWN0b3JzW1JFQURdKSwKKwkJamlmZmllc190b19tc2VjcyhwYXJ0X3N0YXRfcmVhZChwLCB0aWNrc1tSRUFEXSkpLAorCQlwYXJ0X3N0YXRfcmVhZChwLCBpb3NbV1JJVEVdKSwKKwkJcGFydF9zdGF0X3JlYWQocCwgbWVyZ2VzW1dSSVRFXSksCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGFydF9zdGF0X3JlYWQocCwgc2VjdG9yc1tXUklURV0pLAorCQlqaWZmaWVzX3RvX21zZWNzKHBhcnRfc3RhdF9yZWFkKHAsIHRpY2tzW1dSSVRFXSkpLAorCQlwLT5pbl9mbGlnaHQsCisJCWppZmZpZXNfdG9fbXNlY3MocGFydF9zdGF0X3JlYWQocCwgaW9fdGlja3MpKSwKKwkJamlmZmllc190b19tc2VjcyhwYXJ0X3N0YXRfcmVhZChwLCB0aW1lX2luX3F1ZXVlKSkpOwogfQogCiAjaWZkZWYgQ09ORklHX0ZBSUxfTUFLRV9SRVFVRVNUCkBAIC0yNzMsNiArMjkwLDcgQEAKIHN0YXRpYyB2b2lkIHBhcnRfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGhkX3N0cnVjdCAqcCA9IGRldl90b19wYXJ0KGRldik7CisJZnJlZV9wYXJ0X3N0YXRzKHApOwogCWtmcmVlKHApOwogfQogCkBAIC0zMTIsMTMgKzMzMCwyMCBAQAogCWRpc2stPnBhcnRbcGFydC0xXSA9IE5VTEw7CiAJcC0+c3RhcnRfc2VjdCA9IDA7CiAJcC0+bnJfc2VjdHMgPSAwOwotCXAtPmlvc1swXSA9IHAtPmlvc1sxXSA9IDA7Ci0JcC0+c2VjdG9yc1swXSA9IHAtPnNlY3RvcnNbMV0gPSAwOworCXBhcnRfc3RhdF9zZXRfYWxsKHAsIDApOwogCWtvYmplY3RfcHV0KHAtPmhvbGRlcl9kaXIpOwogCWRldmljZV9kZWwoJnAtPmRldik7CiAJcHV0X2RldmljZSgmcC0+ZGV2KTsKIH0KIAorc3RhdGljIHNzaXplX3Qgd2hvbGVfZGlza19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiAwOworfQorc3RhdGljIERFVklDRV9BVFRSKHdob2xlX2Rpc2ssIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCwKKwkJICAgd2hvbGVfZGlza19zaG93LCBOVUxMKTsKKwogdm9pZCBhZGRfcGFydGl0aW9uKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBpbnQgcGFydCwgc2VjdG9yX3Qgc3RhcnQsIHNlY3Rvcl90IGxlbiwgaW50IGZsYWdzKQogewogCXN0cnVjdCBoZF9zdHJ1Y3QgKnA7CkBAIC0zMjgsNiArMzUzLDEwIEBACiAJaWYgKCFwKQogCQlyZXR1cm47CiAKKwlpZiAoIWluaXRfcGFydF9zdGF0cyhwKSkgeworCQlrZnJlZShwKTsKKwkJcmV0dXJuOworCX0KIAlwLT5zdGFydF9zZWN0ID0gc3RhcnQ7CiAJcC0+bnJfc2VjdHMgPSBsZW47CiAJcC0+cGFydG5vID0gcGFydDsKQEAgLTM1MiwxMyArMzgxLDggQEAKIAlkZXZpY2VfYWRkKCZwLT5kZXYpOwogCXBhcnRpdGlvbl9zeXNmc19hZGRfc3ViZGlyKHApOwogCXAtPmRldi51ZXZlbnRfc3VwcHJlc3MgPSAwOwotCWlmIChmbGFncyAmIEFERFBBUlRfRkxBR19XSE9MRURJU0spIHsKLQkJc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgYWRkcGFydGF0dHIgPSB7Ci0JCQkubmFtZSA9ICJ3aG9sZV9kaXNrIiwKLQkJCS5tb2RlID0gU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RILAotCQl9OwotCQllcnIgPSBzeXNmc19jcmVhdGVfZmlsZSgmcC0+ZGV2LmtvYmosICZhZGRwYXJ0YXR0cik7Ci0JfQorCWlmIChmbGFncyAmIEFERFBBUlRfRkxBR19XSE9MRURJU0spCisJCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmcC0+ZGV2LCAmZGV2X2F0dHJfd2hvbGVfZGlzayk7CiAKIAkvKiBzdXBwcmVzcyB1ZXZlbnQgaWYgdGhlIGRpc2sgc3VwcmVzc2VzIGl0ICovCiAJaWYgKCFkaXNrLT5kZXYudWV2ZW50X3N1cHByZXNzKQpkaWZmIC0tZ2l0IGEvZnMvcGlwZS5jIGIvZnMvcGlwZS5jCmluZGV4IGU2NmVjNDguLmEwN2U5YTUgMTAwNjQ0Ci0tLSBhL2ZzL3BpcGUuYworKysgYi9mcy9waXBlLmMKQEAgLTU3Niw5ICs1NzYsNyBAQAogCXJldHVybiAtRUJBREY7CiB9CiAKLXN0YXRpYyBpbnQKLXBpcGVfaW9jdGwoc3RydWN0IGlub2RlICpwaW5vLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBsb25nIHBpcGVfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGU7CkBAIC03ODUsNyArNzgzLDcgQEAKIAkuYWlvX3JlYWQJPSBwaXBlX3JlYWQsCiAJLndyaXRlCQk9IGJhZF9waXBlX3csCiAJLnBvbGwJCT0gcGlwZV9wb2xsLAotCS5pb2N0bAkJPSBwaXBlX2lvY3RsLAorCS51bmxvY2tlZF9pb2N0bAk9IHBpcGVfaW9jdGwsCiAJLm9wZW4JCT0gcGlwZV9yZWFkX29wZW4sCiAJLnJlbGVhc2UJPSBwaXBlX3JlYWRfcmVsZWFzZSwKIAkuZmFzeW5jCQk9IHBpcGVfcmVhZF9mYXN5bmMsCkBAIC03OTcsNyArNzk1LDcgQEAKIAkud3JpdGUJCT0gZG9fc3luY193cml0ZSwKIAkuYWlvX3dyaXRlCT0gcGlwZV93cml0ZSwKIAkucG9sbAkJPSBwaXBlX3BvbGwsCi0JLmlvY3RsCQk9IHBpcGVfaW9jdGwsCisJLnVubG9ja2VkX2lvY3RsCT0gcGlwZV9pb2N0bCwKIAkub3BlbgkJPSBwaXBlX3dyaXRlX29wZW4sCiAJLnJlbGVhc2UJPSBwaXBlX3dyaXRlX3JlbGVhc2UsCiAJLmZhc3luYwkJPSBwaXBlX3dyaXRlX2Zhc3luYywKQEAgLTgxMCw3ICs4MDgsNyBAQAogCS53cml0ZQkJPSBkb19zeW5jX3dyaXRlLAogCS5haW9fd3JpdGUJPSBwaXBlX3dyaXRlLAogCS5wb2xsCQk9IHBpcGVfcG9sbCwKLQkuaW9jdGwJCT0gcGlwZV9pb2N0bCwKKwkudW5sb2NrZWRfaW9jdGwJPSBwaXBlX2lvY3RsLAogCS5vcGVuCQk9IHBpcGVfcmR3cl9vcGVuLAogCS5yZWxlYXNlCT0gcGlwZV9yZHdyX3JlbGVhc2UsCiAJLmZhc3luYwkJPSBwaXBlX3Jkd3JfZmFzeW5jLApAQCAtODIyLDcgKzgyMCw3IEBACiAJLmFpb19yZWFkCT0gcGlwZV9yZWFkLAogCS53cml0ZQkJPSBiYWRfcGlwZV93LAogCS5wb2xsCQk9IHBpcGVfcG9sbCwKLQkuaW9jdGwJCT0gcGlwZV9pb2N0bCwKKwkudW5sb2NrZWRfaW9jdGwJPSBwaXBlX2lvY3RsLAogCS5vcGVuCQk9IHBpcGVfcmVhZF9vcGVuLAogCS5yZWxlYXNlCT0gcGlwZV9yZWFkX3JlbGVhc2UsCiAJLmZhc3luYwkJPSBwaXBlX3JlYWRfZmFzeW5jLApAQCAtODM0LDcgKzgzMiw3IEBACiAJLndyaXRlCQk9IGRvX3N5bmNfd3JpdGUsCiAJLmFpb193cml0ZQk9IHBpcGVfd3JpdGUsCiAJLnBvbGwJCT0gcGlwZV9wb2xsLAotCS5pb2N0bAkJPSBwaXBlX2lvY3RsLAorCS51bmxvY2tlZF9pb2N0bAk9IHBpcGVfaW9jdGwsCiAJLm9wZW4JCT0gcGlwZV93cml0ZV9vcGVuLAogCS5yZWxlYXNlCT0gcGlwZV93cml0ZV9yZWxlYXNlLAogCS5mYXN5bmMJCT0gcGlwZV93cml0ZV9mYXN5bmMsCkBAIC04NDcsNyArODQ1LDcgQEAKIAkud3JpdGUJCT0gZG9fc3luY193cml0ZSwKIAkuYWlvX3dyaXRlCT0gcGlwZV93cml0ZSwKIAkucG9sbAkJPSBwaXBlX3BvbGwsCi0JLmlvY3RsCQk9IHBpcGVfaW9jdGwsCisJLnVubG9ja2VkX2lvY3RsCT0gcGlwZV9pb2N0bCwKIAkub3BlbgkJPSBwaXBlX3Jkd3Jfb3BlbiwKIAkucmVsZWFzZQk9IHBpcGVfcmR3cl9yZWxlYXNlLAogCS5mYXN5bmMJCT0gcGlwZV9yZHdyX2Zhc3luYywKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvYXJyYXkuYyBiL2ZzL3Byb2MvYXJyYXkuYwppbmRleCA2YmEyNzQ2Li4wN2Q2YzQ4IDEwMDY0NAotLS0gYS9mcy9wcm9jL2FycmF5LmMKKysrIGIvZnMvcHJvYy9hcnJheS5jCkBAIC03Nyw2ICs3Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvY3B1c2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheWFjY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BpZF9uYW1lc3BhY2UuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CkBAIC04OCwxOCArODksMjEgQEAKIGRvIHsgbWVtY3B5KGJ1ZmZlciwgc3RyaW5nLCBzdHJsZW4oc3RyaW5nKSk7IFwKICAgICAgYnVmZmVyICs9IHN0cmxlbihzdHJpbmcpOyB9IHdoaWxlICgwKQogCi1zdGF0aWMgaW5saW5lIGNoYXIgKnRhc2tfbmFtZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbmxpbmUgdm9pZCB0YXNrX25hbWUoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJaW50IGk7CisJY2hhciAqYnVmLCAqZW5kOwogCWNoYXIgKm5hbWU7CiAJY2hhciB0Y29tbVtzaXplb2YocC0+Y29tbSldOwogCiAJZ2V0X3Rhc2tfY29tbSh0Y29tbSwgcCk7CiAKLQlBRERCVUYoYnVmLCAiTmFtZTpcdCIpOworCXNlcV9wcmludGYobSwgIk5hbWU6XHQiKTsKKwllbmQgPSBtLT5idWYgKyBtLT5zaXplOworCWJ1ZiA9IG0tPmJ1ZiArIG0tPmNvdW50OwogCW5hbWUgPSB0Y29tbTsKIAlpID0gc2l6ZW9mKHRjb21tKTsKLQlkbyB7CisJd2hpbGUgKGkgJiYgKGJ1ZiA8IGVuZCkpIHsKIAkJdW5zaWduZWQgY2hhciBjID0gKm5hbWU7CiAJCW5hbWUrKzsKIAkJaS0tOwpAQCAtMTA3LDIwICsxMTEsMjEgQEAKIAkJaWYgKCFjKQogCQkJYnJlYWs7CiAJCWlmIChjID09ICdcXCcpIHsKLQkJCWJ1ZlsxXSA9IGM7Ci0JCQlidWYgKz0gMjsKKwkJCWJ1ZisrOworCQkJaWYgKGJ1ZiA8IGVuZCkKKwkJCQkqYnVmKysgPSBjOwogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKGMgPT0gJ1xuJykgewotCQkJYnVmWzBdID0gJ1xcJzsKLQkJCWJ1ZlsxXSA9ICduJzsKLQkJCWJ1ZiArPSAyOworCQkJKmJ1ZisrID0gJ1xcJzsKKwkJCWlmIChidWYgPCBlbmQpCisJCQkJKmJ1ZisrID0gJ24nOwogCQkJY29udGludWU7CiAJCX0KIAkJYnVmKys7Ci0JfSB3aGlsZSAoaSk7Ci0JKmJ1ZiA9ICdcbic7Ci0JcmV0dXJuIGJ1ZisxOworCX0KKwltLT5jb3VudCA9IGJ1ZiAtIG0tPmJ1ZjsKKwlzZXFfcHJpbnRmKG0sICJcbiIpOwogfQogCiAvKgpAQCAtMTUxLDIxICsxNTYsMjAgQEAKIAlyZXR1cm4gKnA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgY2hhciAqdGFza19zdGF0ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNoYXIgKmJ1ZmZlcikKK3N0YXRpYyBpbmxpbmUgdm9pZCB0YXNrX3N0YXRlKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zLAorCQkJCXN0cnVjdCBwaWQgKnBpZCwgc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewogCXN0cnVjdCBncm91cF9pbmZvICpncm91cF9pbmZvOwogCWludCBnOwogCXN0cnVjdCBmZHRhYmxlICpmZHQgPSBOVUxMOwotCXN0cnVjdCBwaWRfbmFtZXNwYWNlICpuczsKIAlwaWRfdCBwcGlkLCB0cGlkOwogCi0JbnMgPSBjdXJyZW50LT5uc3Byb3h5LT5waWRfbnM7CiAJcmN1X3JlYWRfbG9jaygpOwogCXBwaWQgPSBwaWRfYWxpdmUocCkgPwogCQl0YXNrX3RnaWRfbnJfbnMocmN1X2RlcmVmZXJlbmNlKHAtPnJlYWxfcGFyZW50KSwgbnMpIDogMDsKIAl0cGlkID0gcGlkX2FsaXZlKHApICYmIHAtPnB0cmFjZSA/CiAJCXRhc2tfcGlkX25yX25zKHJjdV9kZXJlZmVyZW5jZShwLT5wYXJlbnQpLCBucykgOiAwOwotCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwKKwlzZXFfcHJpbnRmKG0sCiAJCSJTdGF0ZTpcdCVzXG4iCiAJCSJUZ2lkOlx0JWRcbiIKIAkJIlBpZDpcdCVkXG4iCkBAIC0xNzUsNyArMTc5LDcgQEAKIAkJIkdpZDpcdCVkXHQlZFx0JWRcdCVkXG4iLAogCQlnZXRfdGFza19zdGF0ZShwKSwKIAkJdGFza190Z2lkX25yX25zKHAsIG5zKSwKLQkJdGFza19waWRfbnJfbnMocCwgbnMpLAorCQlwaWRfbnJfbnMocGlkLCBucyksCiAJCXBwaWQsIHRwaWQsCiAJCXAtPnVpZCwgcC0+ZXVpZCwgcC0+c3VpZCwgcC0+ZnN1aWQsCiAJCXAtPmdpZCwgcC0+ZWdpZCwgcC0+c2dpZCwgcC0+ZnNnaWQpOwpAQCAtMTgzLDcgKzE4Nyw3IEBACiAJdGFza19sb2NrKHApOwogCWlmIChwLT5maWxlcykKIAkJZmR0ID0gZmlsZXNfZmR0YWJsZShwLT5maWxlcyk7Ci0JYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLAorCXNlcV9wcmludGYobSwKIAkJIkZEU2l6ZTpcdCVkXG4iCiAJCSJHcm91cHM6XHQiLAogCQlmZHQgPyBmZHQtPm1heF9mZHMgOiAwKTsKQEAgLTE5NCwyMCArMTk4LDE4IEBACiAJdGFza191bmxvY2socCk7CiAKIAlmb3IgKGcgPSAwOyBnIDwgbWluKGdyb3VwX2luZm8tPm5ncm91cHMsIE5HUk9VUFNfU01BTEwpOyBnKyspCi0JCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwgIiVkICIsIEdST1VQX0FUKGdyb3VwX2luZm8sIGcpKTsKKwkJc2VxX3ByaW50ZihtLCAiJWQgIiwgR1JPVVBfQVQoZ3JvdXBfaW5mbywgZykpOwogCXB1dF9ncm91cF9pbmZvKGdyb3VwX2luZm8pOwogCi0JYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAiXG4iKTsKLQlyZXR1cm4gYnVmZmVyOworCXNlcV9wcmludGYobSwgIlxuIik7CiB9CiAKLXN0YXRpYyBjaGFyICpyZW5kZXJfc2lnc2V0X3QoY29uc3QgY2hhciAqaGVhZGVyLCBzaWdzZXRfdCAqc2V0LCBjaGFyICpidWZmZXIpCitzdGF0aWMgdm9pZCByZW5kZXJfc2lnc2V0X3Qoc3RydWN0IHNlcV9maWxlICptLCBjb25zdCBjaGFyICpoZWFkZXIsCisJCQkJc2lnc2V0X3QgKnNldCkKIHsKLQlpbnQgaSwgbGVuOworCWludCBpOwogCi0JbGVuID0gc3RybGVuKGhlYWRlcik7Ci0JbWVtY3B5KGJ1ZmZlciwgaGVhZGVyLCBsZW4pOwotCWJ1ZmZlciArPSBsZW47CisJc2VxX3ByaW50ZihtLCAiJXMiLCBoZWFkZXIpOwogCiAJaSA9IF9OU0lHOwogCWRvIHsKQEAgLTIxOCwxMiArMjIwLDEwIEBACiAJCWlmIChzaWdpc21lbWJlcihzZXQsIGkrMikpIHggfD0gMjsKIAkJaWYgKHNpZ2lzbWVtYmVyKHNldCwgaSszKSkgeCB8PSA0OwogCQlpZiAoc2lnaXNtZW1iZXIoc2V0LCBpKzQpKSB4IHw9IDg7Ci0JCSpidWZmZXIrKyA9ICh4IDwgMTAgPyAnMCcgOiAnYScgLSAxMCkgKyB4OworCQlzZXFfcHJpbnRmKG0sICIleCIsIHgpOwogCX0gd2hpbGUgKGkgPj0gNCk7CiAKLQkqYnVmZmVyKysgPSAnXG4nOwotCSpidWZmZXIgPSAwOwotCXJldHVybiBidWZmZXI7CisJc2VxX3ByaW50ZihtLCAiXG4iKTsKIH0KIAogc3RhdGljIHZvaWQgY29sbGVjdF9zaWdpZ25fc2lnY2F0Y2goc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzaWdzZXRfdCAqaWduLApAQCAtMjQxLDcgKzI0MSw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIGNoYXIgKnRhc2tfc2lnKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY2hhciAqYnVmZmVyKQorc3RhdGljIGlubGluZSB2b2lkIHRhc2tfc2lnKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc2lnc2V0X3QgcGVuZGluZywgc2hwZW5kaW5nLCBibG9ja2VkLCBpZ25vcmVkLCBjYXVnaHQ7CkBAIC0yNjgsNjcgKzI2OCw2NiBAQAogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwgIlRocmVhZHM6XHQlZFxuIiwgbnVtX3RocmVhZHMpOwotCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwgIlNpZ1E6XHQlbHUvJWx1XG4iLCBxc2l6ZSwgcWxpbSk7CisJc2VxX3ByaW50ZihtLCAiVGhyZWFkczpcdCVkXG4iLCBudW1fdGhyZWFkcyk7CisJc2VxX3ByaW50ZihtLCAiU2lnUTpcdCVsdS8lbHVcbiIsIHFzaXplLCBxbGltKTsKIAogCS8qIHJlbmRlciB0aGVtIGFsbCAqLwotCWJ1ZmZlciA9IHJlbmRlcl9zaWdzZXRfdCgiU2lnUG5kOlx0IiwgJnBlbmRpbmcsIGJ1ZmZlcik7Ci0JYnVmZmVyID0gcmVuZGVyX3NpZ3NldF90KCJTaGRQbmQ6XHQiLCAmc2hwZW5kaW5nLCBidWZmZXIpOwotCWJ1ZmZlciA9IHJlbmRlcl9zaWdzZXRfdCgiU2lnQmxrOlx0IiwgJmJsb2NrZWQsIGJ1ZmZlcik7Ci0JYnVmZmVyID0gcmVuZGVyX3NpZ3NldF90KCJTaWdJZ246XHQiLCAmaWdub3JlZCwgYnVmZmVyKTsKLQlidWZmZXIgPSByZW5kZXJfc2lnc2V0X3QoIlNpZ0NndDpcdCIsICZjYXVnaHQsIGJ1ZmZlcik7Ci0KLQlyZXR1cm4gYnVmZmVyOworCXJlbmRlcl9zaWdzZXRfdChtLCAiU2lnUG5kOlx0IiwgJnBlbmRpbmcpOworCXJlbmRlcl9zaWdzZXRfdChtLCAiU2hkUG5kOlx0IiwgJnNocGVuZGluZyk7CisJcmVuZGVyX3NpZ3NldF90KG0sICJTaWdCbGs6XHQiLCAmYmxvY2tlZCk7CisJcmVuZGVyX3NpZ3NldF90KG0sICJTaWdJZ246XHQiLCAmaWdub3JlZCk7CisJcmVuZGVyX3NpZ3NldF90KG0sICJTaWdDZ3Q6XHQiLCAmY2F1Z2h0KTsKIH0KIAotc3RhdGljIGNoYXIgKnJlbmRlcl9jYXBfdChjb25zdCBjaGFyICpoZWFkZXIsIGtlcm5lbF9jYXBfdCAqYSwgY2hhciAqYnVmZmVyKQorc3RhdGljIHZvaWQgcmVuZGVyX2NhcF90KHN0cnVjdCBzZXFfZmlsZSAqbSwgY29uc3QgY2hhciAqaGVhZGVyLAorCQkJa2VybmVsX2NhcF90ICphKQogewogCXVuc2lnbmVkIF9fY2FwaTsKIAotCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwgIiVzIiwgaGVhZGVyKTsKKwlzZXFfcHJpbnRmKG0sICIlcyIsIGhlYWRlcik7CiAJQ0FQX0ZPUl9FQUNIX1UzMihfX2NhcGkpIHsKLQkJYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAiJTA4eCIsCi0JCQkJICBhLT5jYXBbKF9MSU5VWF9DQVBBQklMSVRZX1UzMlMtMSkgLSBfX2NhcGldKTsKKwkJc2VxX3ByaW50ZihtLCAiJTA4eCIsCisJCQkgICBhLT5jYXBbKF9MSU5VWF9DQVBBQklMSVRZX1UzMlMtMSkgLSBfX2NhcGldKTsKIAl9Ci0JcmV0dXJuIGJ1ZmZlciArIHNwcmludGYoYnVmZmVyLCAiXG4iKTsKKwlzZXFfcHJpbnRmKG0sICJcbiIpOwogfQogCi1zdGF0aWMgaW5saW5lIGNoYXIgKnRhc2tfY2FwKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY2hhciAqYnVmZmVyKQorc3RhdGljIGlubGluZSB2b2lkIHRhc2tfY2FwKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewotCWJ1ZmZlciA9IHJlbmRlcl9jYXBfdCgiQ2FwSW5oOlx0IiwgJnAtPmNhcF9pbmhlcml0YWJsZSwgYnVmZmVyKTsKLQlidWZmZXIgPSByZW5kZXJfY2FwX3QoIkNhcFBybTpcdCIsICZwLT5jYXBfcGVybWl0dGVkLCBidWZmZXIpOwotCXJldHVybiByZW5kZXJfY2FwX3QoIkNhcEVmZjpcdCIsICZwLT5jYXBfZWZmZWN0aXZlLCBidWZmZXIpOworCXJlbmRlcl9jYXBfdChtLCAiQ2FwSW5oOlx0IiwgJnAtPmNhcF9pbmhlcml0YWJsZSk7CisJcmVuZGVyX2NhcF90KG0sICJDYXBQcm06XHQiLCAmcC0+Y2FwX3Blcm1pdHRlZCk7CisJcmVuZGVyX2NhcF90KG0sICJDYXBFZmY6XHQiLCAmcC0+Y2FwX2VmZmVjdGl2ZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgY2hhciAqdGFza19jb250ZXh0X3N3aXRjaF9jb3VudHMoc3RydWN0IHRhc2tfc3RydWN0ICpwLAotCQkJCQkJY2hhciAqYnVmZmVyKQorc3RhdGljIGlubGluZSB2b2lkIHRhc2tfY29udGV4dF9zd2l0Y2hfY291bnRzKHN0cnVjdCBzZXFfZmlsZSAqbSwKKwkJCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKLQlyZXR1cm4gYnVmZmVyICsgc3ByaW50ZihidWZmZXIsICJ2b2x1bnRhcnlfY3R4dF9zd2l0Y2hlczpcdCVsdVxuIgotCQkJICAgICJub252b2x1bnRhcnlfY3R4dF9zd2l0Y2hlczpcdCVsdVxuIiwKLQkJCSAgICBwLT5udmNzdywKLQkJCSAgICBwLT5uaXZjc3cpOworCXNlcV9wcmludGYobSwJInZvbHVudGFyeV9jdHh0X3N3aXRjaGVzOlx0JWx1XG4iCisJCQkibm9udm9sdW50YXJ5X2N0eHRfc3dpdGNoZXM6XHQlbHVcbiIsCisJCQlwLT5udmNzdywKKwkJCXAtPm5pdmNzdyk7CiB9CiAKLWludCBwcm9jX3BpZF9zdGF0dXMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICpidWZmZXIpCitpbnQgcHJvY19waWRfc3RhdHVzKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zLAorCQkJc3RydWN0IHBpZCAqcGlkLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0JY2hhciAqb3JpZyA9IGJ1ZmZlcjsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGdldF90YXNrX21tKHRhc2spOwogCi0JYnVmZmVyID0gdGFza19uYW1lKHRhc2ssIGJ1ZmZlcik7Ci0JYnVmZmVyID0gdGFza19zdGF0ZSh0YXNrLCBidWZmZXIpOworCXRhc2tfbmFtZShtLCB0YXNrKTsKKwl0YXNrX3N0YXRlKG0sIG5zLCBwaWQsIHRhc2spOwogCiAJaWYgKG1tKSB7Ci0JCWJ1ZmZlciA9IHRhc2tfbWVtKG1tLCBidWZmZXIpOworCQl0YXNrX21lbShtLCBtbSk7CiAJCW1tcHV0KG1tKTsKIAl9Ci0JYnVmZmVyID0gdGFza19zaWcodGFzaywgYnVmZmVyKTsKLQlidWZmZXIgPSB0YXNrX2NhcCh0YXNrLCBidWZmZXIpOwotCWJ1ZmZlciA9IGNwdXNldF90YXNrX3N0YXR1c19hbGxvd2VkKHRhc2ssIGJ1ZmZlcik7CisJdGFza19zaWcobSwgdGFzayk7CisJdGFza19jYXAobSwgdGFzayk7CisJY3B1c2V0X3Rhc2tfc3RhdHVzX2FsbG93ZWQobSwgdGFzayk7CiAjaWYgZGVmaW5lZChDT05GSUdfUzM5MCkKLQlidWZmZXIgPSB0YXNrX3Nob3dfcmVncyh0YXNrLCBidWZmZXIpOworCXRhc2tfc2hvd19yZWdzKG0sIHRhc2spOwogI2VuZGlmCi0JYnVmZmVyID0gdGFza19jb250ZXh0X3N3aXRjaF9jb3VudHModGFzaywgYnVmZmVyKTsKLQlyZXR1cm4gYnVmZmVyIC0gb3JpZzsKKwl0YXNrX2NvbnRleHRfc3dpdGNoX2NvdW50cyhtLCB0YXNrKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTM5MCwxNCArMzg5LDE0IEBACiAJcmV0dXJuIHAtPmd0aW1lOwogfQogCi1zdGF0aWMgaW50IGRvX3Rhc2tfc3RhdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKmJ1ZmZlciwgaW50IHdob2xlKQorc3RhdGljIGludCBkb190YXNrX3N0YXQoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMsCisJCQlzdHJ1Y3QgcGlkICpwaWQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IHdob2xlKQogewogCXVuc2lnbmVkIGxvbmcgdnNpemUsIGVpcCwgZXNwLCB3Y2hhbiA9IH4wVUw7CiAJbG9uZyBwcmlvcml0eSwgbmljZTsKIAlpbnQgdHR5X3BncnAgPSAtMSwgdHR5X25yID0gMDsKIAlzaWdzZXRfdCBzaWdpZ24sIHNpZ2NhdGNoOwogCWNoYXIgc3RhdGU7Ci0JaW50IHJlczsKIAlwaWRfdCBwcGlkID0gMCwgcGdpZCA9IC0xLCBzaWQgPSAtMTsKIAlpbnQgbnVtX3RocmVhZHMgPSAwOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwpAQCAtNDA5LDkgKzQwOCw2IEBACiAJdW5zaWduZWQgbG9uZyByc3NsaW0gPSAwOwogCWNoYXIgdGNvbW1bc2l6ZW9mKHRhc2stPmNvbW0pXTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBwaWRfbmFtZXNwYWNlICpuczsKLQotCW5zID0gY3VycmVudC0+bnNwcm94eS0+cGlkX25zOwogCiAJc3RhdGUgPSAqZ2V0X3Rhc2tfc3RhdGUodGFzayk7CiAJdnNpemUgPSBlaXAgPSBlc3AgPSAwOwpAQCAtNDk4LDEwICs0OTQsMTAgQEAKIAkvKiBjb252ZXJ0IG5zZWMgLT4gdGlja3MgKi8KIAlzdGFydF90aW1lID0gbnNlY190b19jbG9ja190KHN0YXJ0X3RpbWUpOwogCi0JcmVzID0gc3ByaW50ZihidWZmZXIsICIlZCAoJXMpICVjICVkICVkICVkICVkICVkICV1ICVsdSBcCisJc2VxX3ByaW50ZihtLCAiJWQgKCVzKSAlYyAlZCAlZCAlZCAlZCAlZCAldSAlbHUgXAogJWx1ICVsdSAlbHUgJWx1ICVsdSAlbGQgJWxkICVsZCAlbGQgJWQgMCAlbGx1ICVsdSAlbGQgJWx1ICVsdSAlbHUgJWx1ICVsdSBcCiAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1ICVkICVkICV1ICV1ICVsbHUgJWx1ICVsZFxuIiwKLQkJdGFza19waWRfbnJfbnModGFzaywgbnMpLAorCQlwaWRfbnJfbnMocGlkLCBucyksCiAJCXRjb21tLAogCQlzdGF0ZSwKIAkJcHBpZCwKQEAgLTU1MCwyMCArNTQ2LDIzIEBACiAJCWNwdXRpbWVfdG9fY2xvY2tfdChjZ3RpbWUpKTsKIAlpZiAobW0pCiAJCW1tcHV0KG1tKTsKLQlyZXR1cm4gcmVzOworCXJldHVybiAwOwogfQogCi1pbnQgcHJvY190aWRfc3RhdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKmJ1ZmZlcikKK2ludCBwcm9jX3RpZF9zdGF0KHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zLAorCQkJc3RydWN0IHBpZCAqcGlkLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0JcmV0dXJuIGRvX3Rhc2tfc3RhdCh0YXNrLCBidWZmZXIsIDApOworCXJldHVybiBkb190YXNrX3N0YXQobSwgbnMsIHBpZCwgdGFzaywgMCk7CiB9CiAKLWludCBwcm9jX3RnaWRfc3RhdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKmJ1ZmZlcikKK2ludCBwcm9jX3RnaWRfc3RhdChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpucywKKwkJCXN0cnVjdCBwaWQgKnBpZCwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewotCXJldHVybiBkb190YXNrX3N0YXQodGFzaywgYnVmZmVyLCAxKTsKKwlyZXR1cm4gZG9fdGFza19zdGF0KG0sIG5zLCBwaWQsIHRhc2ssIDEpOwogfQogCi1pbnQgcHJvY19waWRfc3RhdG0oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICpidWZmZXIpCitpbnQgcHJvY19waWRfc3RhdG0oc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMsCisJCQlzdHJ1Y3QgcGlkICpwaWQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKIAlpbnQgc2l6ZSA9IDAsIHJlc2lkZW50ID0gMCwgc2hhcmVkID0gMCwgdGV4dCA9IDAsIGxpYiA9IDAsIGRhdGEgPSAwOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gZ2V0X3Rhc2tfbW0odGFzayk7CkBAIC01NzIsNyArNTcxLDggQEAKIAkJc2l6ZSA9IHRhc2tfc3RhdG0obW0sICZzaGFyZWQsICZ0ZXh0LCAmZGF0YSwgJnJlc2lkZW50KTsKIAkJbW1wdXQobW0pOwogCX0KKwlzZXFfcHJpbnRmKG0sICIlZCAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKKwkJCXNpemUsIHJlc2lkZW50LCBzaGFyZWQsIHRleHQsIGxpYiwgZGF0YSwgMCk7CiAKLQlyZXR1cm4gc3ByaW50ZihidWZmZXIsICIlZCAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKLQkJICAgICAgIHNpemUsIHJlc2lkZW50LCBzaGFyZWQsIHRleHQsIGxpYiwgZGF0YSwgMCk7CisJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy9wcm9jL2Jhc2UuYyBiL2ZzL3Byb2MvYmFzZS5jCmluZGV4IGM1OTg1MmIuLjdjNmI0ZWMgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvYmFzZS5jCisrKyBiL2ZzL3Byb2MvYmFzZS5jCkBAIC0xMjEsNiArMTIxLDEwIEBACiAJTk9EKE5BTUUsIChTX0lGUkVHfChNT0RFKSksIAkJCVwKIAkJTlVMTCwgJnByb2NfaW5mb19maWxlX29wZXJhdGlvbnMsCVwKIAkJeyAucHJvY19yZWFkID0gJnByb2NfIyNPVFlQRSB9ICkKKyNkZWZpbmUgT05FKE5BTUUsIE1PREUsIE9UWVBFKQkJCQlcCisJTk9EKE5BTUUsIChTX0lGUkVHfChNT0RFKSksIAkJCVwKKwkJTlVMTCwgJnByb2Nfc2luZ2xlX2ZpbGVfb3BlcmF0aW9ucywJXAorCQl7IC5wcm9jX3Nob3cgPSAmcHJvY18jI09UWVBFIH0gKQogCiBpbnQgbWFwc19wcm90ZWN0OwogRVhQT1JUX1NZTUJPTChtYXBzX3Byb3RlY3QpOwpAQCAtNTAyLDcgKzUwNiw3IEBACiAJLnNldGF0dHIJPSBwcm9jX3NldGF0dHIsCiB9OwogCi1leHRlcm4gc3RydWN0IHNlcV9vcGVyYXRpb25zIG1vdW50c19vcDsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbW91bnRzX29wOwogc3RydWN0IHByb2NfbW91bnRzIHsKIAlzdHJ1Y3Qgc2VxX2ZpbGUgbTsKIAlpbnQgZXZlbnQ7CkBAIC01ODEsNyArNTg1LDcgQEAKIAkucG9sbAkJPSBtb3VudHNfcG9sbCwKIH07CiAKLWV4dGVybiBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbW91bnRzdGF0c19vcDsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbW91bnRzdGF0c19vcDsKIHN0YXRpYyBpbnQgbW91bnRzdGF0c19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCWludCByZXQgPSBzZXFfb3BlbihmaWxlLCAmbW91bnRzdGF0c19vcCk7CkBAIC02NTgsNiArNjYyLDQ1IEBACiAJLnJlYWQJCT0gcHJvY19pbmZvX3JlYWQsCiB9OwogCitzdGF0aWMgaW50IHByb2Nfc2luZ2xlX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtLT5wcml2YXRlOworCXN0cnVjdCBwaWRfbmFtZXNwYWNlICpuczsKKwlzdHJ1Y3QgcGlkICpwaWQ7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCWludCByZXQ7CisKKwlucyA9IGlub2RlLT5pX3NiLT5zX2ZzX2luZm87CisJcGlkID0gcHJvY19waWQoaW5vZGUpOworCXRhc2sgPSBnZXRfcGlkX3Rhc2socGlkLCBQSURUWVBFX1BJRCk7CisJaWYgKCF0YXNrKQorCQlyZXR1cm4gLUVTUkNIOworCisJcmV0ID0gUFJPQ19JKGlub2RlKS0+b3AucHJvY19zaG93KG0sIG5zLCBwaWQsIHRhc2spOworCisJcHV0X3Rhc2tfc3RydWN0KHRhc2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19zaW5nbGVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlpbnQgcmV0OworCXJldCA9IHNpbmdsZV9vcGVuKGZpbHAsIHByb2Nfc2luZ2xlX3Nob3csIE5VTEwpOworCWlmICghcmV0KSB7CisJCXN0cnVjdCBzZXFfZmlsZSAqbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCQltLT5wcml2YXRlID0gaW5vZGU7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfc2luZ2xlX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBwcm9jX3NpbmdsZV9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCiBzdGF0aWMgaW50IG1lbV9vcGVuKHN0cnVjdCBpbm9kZSogaW5vZGUsIHN0cnVjdCBmaWxlKiBmaWxlKQogewogCWZpbGUtPnByaXZhdGVfZGF0YSA9ICh2b2lkKikoKGxvbmcpY3VycmVudC0+c2VsZl9leGVjX2lkKTsKQEAgLTIwNTgsMTUgKzIxMDEsMjMgQEAKIHN0YXRpYyBpbnQgcHJvY19zZWxmX3JlYWRsaW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwKIAkJCSAgICAgIGludCBidWZsZW4pCiB7CisJc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zID0gZGVudHJ5LT5kX3NiLT5zX2ZzX2luZm87CisJcGlkX3QgdGdpZCA9IHRhc2tfdGdpZF9ucl9ucyhjdXJyZW50LCBucyk7CiAJY2hhciB0bXBbUFJPQ19OVU1CVUZdOwotCXNwcmludGYodG1wLCAiJWQiLCB0YXNrX3RnaWRfdm5yKGN1cnJlbnQpKTsKKwlpZiAoIXRnaWQpCisJCXJldHVybiAtRU5PRU5UOworCXNwcmludGYodG1wLCAiJWQiLCB0Z2lkKTsKIAlyZXR1cm4gdmZzX3JlYWRsaW5rKGRlbnRyeSxidWZmZXIsYnVmbGVuLHRtcCk7CiB9CiAKIHN0YXRpYyB2b2lkICpwcm9jX3NlbGZfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKKwlzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMgPSBkZW50cnktPmRfc2ItPnNfZnNfaW5mbzsKKwlwaWRfdCB0Z2lkID0gdGFza190Z2lkX25yX25zKGN1cnJlbnQsIG5zKTsKIAljaGFyIHRtcFtQUk9DX05VTUJVRl07Ci0Jc3ByaW50Zih0bXAsICIlZCIsIHRhc2tfdGdpZF92bnIoY3VycmVudCkpOworCWlmICghdGdpZCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisJc3ByaW50Zih0bXAsICIlZCIsIHRhc2tfdGdpZF9ucl9ucyhjdXJyZW50LCBucykpOwogCXJldHVybiBFUlJfUFRSKHZmc19mb2xsb3dfbGluayhuZCx0bXApKTsKIH0KIApAQCAtMjIzMSwxNCArMjI4MiwxNCBAQAogCURJUigiZmRpbmZvIiwgICAgIFNfSVJVU1J8U19JWFVTUiwgZmRpbmZvKSwKIAlSRUcoImVudmlyb24iLCAgICBTX0lSVVNSLCBlbnZpcm9uKSwKIAlJTkYoImF1eHYiLCAgICAgICBTX0lSVVNSLCBwaWRfYXV4diksCi0JSU5GKCJzdGF0dXMiLCAgICAgU19JUlVHTywgcGlkX3N0YXR1cyksCisJT05FKCJzdGF0dXMiLCAgICAgU19JUlVHTywgcGlkX3N0YXR1cyksCiAJSU5GKCJsaW1pdHMiLAkgIFNfSVJVU1IsIHBpZF9saW1pdHMpLAogI2lmZGVmIENPTkZJR19TQ0hFRF9ERUJVRwogCVJFRygic2NoZWQiLCAgICAgIFNfSVJVR098U19JV1VTUiwgcGlkX3NjaGVkKSwKICNlbmRpZgogCUlORigiY21kbGluZSIsICAgIFNfSVJVR08sIHBpZF9jbWRsaW5lKSwKLQlJTkYoInN0YXQiLCAgICAgICBTX0lSVUdPLCB0Z2lkX3N0YXQpLAotCUlORigic3RhdG0iLCAgICAgIFNfSVJVR08sIHBpZF9zdGF0bSksCisJT05FKCJzdGF0IiwgICAgICAgU19JUlVHTywgdGdpZF9zdGF0KSwKKwlPTkUoInN0YXRtIiwgICAgICBTX0lSVUdPLCBwaWRfc3RhdG0pLAogCVJFRygibWFwcyIsICAgICAgIFNfSVJVR08sIG1hcHMpLAogI2lmZGVmIENPTkZJR19OVU1BCiAJUkVHKCJudW1hX21hcHMiLCAgU19JUlVHTywgbnVtYV9tYXBzKSwKQEAgLTI1NjIsMTQgKzI2MTMsMTQgQEAKIAlESVIoImZkaW5mbyIsICAgIFNfSVJVU1J8U19JWFVTUiwgZmRpbmZvKSwKIAlSRUcoImVudmlyb24iLCAgIFNfSVJVU1IsIGVudmlyb24pLAogCUlORigiYXV4diIsICAgICAgU19JUlVTUiwgcGlkX2F1eHYpLAotCUlORigic3RhdHVzIiwgICAgU19JUlVHTywgcGlkX3N0YXR1cyksCisJT05FKCJzdGF0dXMiLCAgICBTX0lSVUdPLCBwaWRfc3RhdHVzKSwKIAlJTkYoImxpbWl0cyIsCSBTX0lSVVNSLCBwaWRfbGltaXRzKSwKICNpZmRlZiBDT05GSUdfU0NIRURfREVCVUcKIAlSRUcoInNjaGVkIiwgICAgIFNfSVJVR098U19JV1VTUiwgcGlkX3NjaGVkKSwKICNlbmRpZgogCUlORigiY21kbGluZSIsICAgU19JUlVHTywgcGlkX2NtZGxpbmUpLAotCUlORigic3RhdCIsICAgICAgU19JUlVHTywgdGlkX3N0YXQpLAotCUlORigic3RhdG0iLCAgICAgU19JUlVHTywgcGlkX3N0YXRtKSwKKwlPTkUoInN0YXQiLCAgICAgIFNfSVJVR08sIHRpZF9zdGF0KSwKKwlPTkUoInN0YXRtIiwgICAgIFNfSVJVR08sIHBpZF9zdGF0bSksCiAJUkVHKCJtYXBzIiwgICAgICBTX0lSVUdPLCBtYXBzKSwKICNpZmRlZiBDT05GSUdfTlVNQQogCVJFRygibnVtYV9tYXBzIiwgU19JUlVHTywgbnVtYV9tYXBzKSwKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvZ2VuZXJpYy5jIGIvZnMvcHJvYy9nZW5lcmljLmMKaW5kZXggNmEyZmU1MS4uNjg5NzFlNiAxMDA2NDQKLS0tIGEvZnMvcHJvYy9nZW5lcmljLmMKKysrIGIvZnMvcHJvYy9nZW5lcmljLmMKQEAgLTI1LDEyICsyNSw2IEBACiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi1zdGF0aWMgc3NpemVfdCBwcm9jX2ZpbGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgICAgIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcyk7Ci1zdGF0aWMgc3NpemVfdCBwcm9jX2ZpbGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCi0JCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOwotc3RhdGljIGxvZmZfdCBwcm9jX2ZpbGVfbHNlZWsoc3RydWN0IGZpbGUgKiwgbG9mZl90LCBpbnQpOwotCiBERUZJTkVfU1BJTkxPQ0socHJvY19zdWJkaXJfbG9jayk7CiAKIHN0YXRpYyBpbnQgcHJvY19tYXRjaChpbnQgbGVuLCBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlKQpAQCAtNDAsMTIgKzM0LDYgQEAKIAlyZXR1cm4gIW1lbWNtcChuYW1lLCBkZS0+bmFtZSwgbGVuKTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19maWxlX29wZXJhdGlvbnMgPSB7Ci0JLmxsc2VlawkJPSBwcm9jX2ZpbGVfbHNlZWssCi0JLnJlYWQJCT0gcHJvY19maWxlX3JlYWQsCi0JLndyaXRlCQk9IHByb2NfZmlsZV93cml0ZSwKLX07Ci0KIC8qIGJ1ZmZlciBzaXplIGlzIG9uZSBwYWdlIGJ1dCBvdXIgb3V0cHV0IHJvdXRpbmVzIHVzZSBzb21lIHNsYWNrIGZvciBvdmVycnVucyAqLwogI2RlZmluZSBQUk9DX0JMT0NLX1NJWkUJKFBBR0VfU0laRSAtIDEwMjQpCiAKQEAgLTIzMyw2ICsyMjEsMTIgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrCQk9IHByb2NfZmlsZV9sc2VlaywKKwkucmVhZAkJPSBwcm9jX2ZpbGVfcmVhZCwKKwkud3JpdGUJCT0gcHJvY19maWxlX3dyaXRlLAorfTsKKwogc3RhdGljIGludCBwcm9jX25vdGlmeV9jaGFuZ2Uoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmlhdHRyKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CkBAIC00MDYsMTIgKzQwMCwxMiBAQAogCQkJCXNwaW5fdW5sb2NrKCZwcm9jX3N1YmRpcl9sb2NrKTsKIAkJCQllcnJvciA9IC1FSU5WQUw7CiAJCQkJaW5vZGUgPSBwcm9jX2dldF9pbm9kZShkaXItPmlfc2IsIGlubywgZGUpOwotCQkJCXNwaW5fbG9jaygmcHJvY19zdWJkaXJfbG9jayk7Ci0JCQkJYnJlYWs7CisJCQkJZ290byBvdXRfdW5sb2NrOwogCQkJfQogCQl9CiAJfQogCXNwaW5fdW5sb2NrKCZwcm9jX3N1YmRpcl9sb2NrKTsKK291dF91bmxvY2s6CiAJdW5sb2NrX2tlcm5lbCgpOwogCiAJaWYgKGlub2RlKSB7CkBAIC01MjcsNiArNTIxLDcgQEAKIHN0YXRpYyBpbnQgcHJvY19yZWdpc3RlcihzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKiBkaXIsIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqIGRwKQogewogCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqdG1wOwogCQogCWkgPSBnZXRfaW5vZGVfbnVtYmVyKCk7CiAJaWYgKGkgPT0gMCkKQEAgLTU1MCw2ICs1NDUsMTUgQEAKIAl9CiAKIAlzcGluX2xvY2soJnByb2Nfc3ViZGlyX2xvY2spOworCisJZm9yICh0bXAgPSBkaXItPnN1YmRpcjsgdG1wOyB0bXAgPSB0bXAtPm5leHQpCisJCWlmIChzdHJjbXAodG1wLT5uYW1lLCBkcC0+bmFtZSkgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicHJvY19kaXJfZW50cnkgJyVzJyBhbHJlYWR5ICIKKwkJCQkJInJlZ2lzdGVyZWRcbiIsIGRwLT5uYW1lKTsKKwkJCWR1bXBfc3RhY2soKTsKKwkJCWJyZWFrOworCQl9CisKIAlkcC0+bmV4dCA9IGRpci0+c3ViZGlyOwogCWRwLT5wYXJlbnQgPSBkaXI7CiAJZGlyLT5zdWJkaXIgPSBkcDsKQEAgLTU1OCw3ICs1NjIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2NyZWF0ZShzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKipwYXJlbnQsCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpfX3Byb2NfY3JlYXRlKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqKnBhcmVudCwKIAkJCQkJICBjb25zdCBjaGFyICpuYW1lLAogCQkJCQkgIG1vZGVfdCBtb2RlLAogCQkJCQkgIG5saW5rX3QgbmxpbmspCkBAIC02MDEsNyArNjA1LDcgQEAKIHsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudDsKIAotCWVudCA9IHByb2NfY3JlYXRlKCZwYXJlbnQsbmFtZSwKKwllbnQgPSBfX3Byb2NfY3JlYXRlKCZwYXJlbnQsIG5hbWUsCiAJCQkgIChTX0lGTE5LIHwgU19JUlVHTyB8IFNfSVdVR08gfCBTX0lYVUdPKSwxKTsKIAogCWlmIChlbnQpIHsKQEAgLTYyNiw3ICs2MzAsNyBAQAogewogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50OwogCi0JZW50ID0gcHJvY19jcmVhdGUoJnBhcmVudCwgbmFtZSwgU19JRkRJUiB8IG1vZGUsIDIpOworCWVudCA9IF9fcHJvY19jcmVhdGUoJnBhcmVudCwgbmFtZSwgU19JRkRJUiB8IG1vZGUsIDIpOwogCWlmIChlbnQpIHsKIAkJaWYgKHByb2NfcmVnaXN0ZXIocGFyZW50LCBlbnQpIDwgMCkgewogCQkJa2ZyZWUoZW50KTsKQEAgLTY2MCw3ICs2NjQsNyBAQAogCQlubGluayA9IDE7CiAJfQogCi0JZW50ID0gcHJvY19jcmVhdGUoJnBhcmVudCxuYW1lLG1vZGUsbmxpbmspOworCWVudCA9IF9fcHJvY19jcmVhdGUoJnBhcmVudCwgbmFtZSwgbW9kZSwgbmxpbmspOwogCWlmIChlbnQpIHsKIAkJaWYgKHByb2NfcmVnaXN0ZXIocGFyZW50LCBlbnQpIDwgMCkgewogCQkJa2ZyZWUoZW50KTsKQEAgLTY3MCw2ICs2NzQsMzggQEAKIAlyZXR1cm4gZW50OwogfQogCitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLAorCQkJCSAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGFyZW50LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKnByb2NfZm9wcykKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZTsKKwlubGlua190IG5saW5rOworCisJaWYgKFNfSVNESVIobW9kZSkpIHsKKwkJaWYgKChtb2RlICYgU19JQUxMVUdPKSA9PSAwKQorCQkJbW9kZSB8PSBTX0lSVUdPIHwgU19JWFVHTzsKKwkJbmxpbmsgPSAyOworCX0gZWxzZSB7CisJCWlmICgobW9kZSAmIFNfSUZNVCkgPT0gMCkKKwkJCW1vZGUgfD0gU19JRlJFRzsKKwkJaWYgKChtb2RlICYgU19JQUxMVUdPKSA9PSAwKQorCQkJbW9kZSB8PSBTX0lSVUdPOworCQlubGluayA9IDE7CisJfQorCisJcGRlID0gX19wcm9jX2NyZWF0ZSgmcGFyZW50LCBuYW1lLCBtb2RlLCBubGluayk7CisJaWYgKCFwZGUpCisJCWdvdG8gb3V0OworCXBkZS0+cHJvY19mb3BzID0gcHJvY19mb3BzOworCWlmIChwcm9jX3JlZ2lzdGVyKHBhcmVudCwgcGRlKSA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisJcmV0dXJuIHBkZTsKK291dF9mcmVlOgorCWtmcmVlKHBkZSk7CitvdXQ6CisJcmV0dXJuIE5VTEw7Cit9CisKIHZvaWQgZnJlZV9wcm9jX2VudHJ5KHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGUpCiB7CiAJdW5zaWduZWQgaW50IGlubyA9IGRlLT5sb3dfaW5vOwpAQCAtNjc5LDcgKzcxNSw3IEBACiAKIAlyZWxlYXNlX2lub2RlX251bWJlcihpbm8pOwogCi0JaWYgKFNfSVNMTksoZGUtPm1vZGUpICYmIGRlLT5kYXRhKQorCWlmIChTX0lTTE5LKGRlLT5tb2RlKSkKIAkJa2ZyZWUoZGUtPmRhdGEpOwogCWtmcmVlKGRlKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3Byb2MvaW5vZGUuYyBiL2ZzL3Byb2MvaW5vZGUuYwppbmRleCAxYTU1MWQ5Li44MmIzYTFiIDEwMDY0NAotLS0gYS9mcy9wcm9jL2lub2RlLmMKKysrIGIvZnMvcHJvYy9pbm9kZS5jCkBAIC03MywxMSArNzMsNiBAQAogCiBzdHJ1Y3QgdmZzbW91bnQgKnByb2NfbW50OwogCi1zdGF0aWMgdm9pZCBwcm9jX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpCi17Ci0JaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwotfQotCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKiBwcm9jX2lub2RlX2NhY2hlcDsKIAogc3RhdGljIHN0cnVjdCBpbm9kZSAqcHJvY19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQpAQCAtMTI4LDcgKzEyMyw2IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgcHJvY19zb3BzID0gewogCS5hbGxvY19pbm9kZQk9IHByb2NfYWxsb2NfaW5vZGUsCiAJLmRlc3Ryb3lfaW5vZGUJPSBwcm9jX2Rlc3Ryb3lfaW5vZGUsCi0JLnJlYWRfaW5vZGUJPSBwcm9jX3JlYWRfaW5vZGUsCiAJLmRyb3BfaW5vZGUJPSBnZW5lcmljX2RlbGV0ZV9pbm9kZSwKIAkuZGVsZXRlX2lub2RlCT0gcHJvY19kZWxldGVfaW5vZGUsCiAJLnN0YXRmcwkJPSBzaW1wbGVfc3RhdGZzLApAQCAtNDAxLDM5ICszOTUsNDEgQEAKIAlpZiAoZGUgIT0gTlVMTCAmJiAhdHJ5X21vZHVsZV9nZXQoZGUtPm93bmVyKSkKIAkJZ290byBvdXRfbW9kOwogCi0JaW5vZGUgPSBpZ2V0KHNiLCBpbm8pOworCWlub2RlID0gaWdldF9sb2NrZWQoc2IsIGlubyk7CiAJaWYgKCFpbm9kZSkKIAkJZ290byBvdXRfaW5vOwotCi0JUFJPQ19JKGlub2RlKS0+ZmQgPSAwOwotCVBST0NfSShpbm9kZSktPnBkZSA9IGRlOwotCWlmIChkZSkgewotCQlpZiAoZGUtPm1vZGUpIHsKLQkJCWlub2RlLT5pX21vZGUgPSBkZS0+bW9kZTsKLQkJCWlub2RlLT5pX3VpZCA9IGRlLT51aWQ7Ci0JCQlpbm9kZS0+aV9naWQgPSBkZS0+Z2lkOwotCQl9Ci0JCWlmIChkZS0+c2l6ZSkKLQkJCWlub2RlLT5pX3NpemUgPSBkZS0+c2l6ZTsKLQkJaWYgKGRlLT5ubGluaykKLQkJCWlub2RlLT5pX25saW5rID0gZGUtPm5saW5rOwotCQlpZiAoZGUtPnByb2NfaW9wcykKLQkJCWlub2RlLT5pX29wID0gZGUtPnByb2NfaW9wczsKLQkJaWYgKGRlLT5wcm9jX2ZvcHMpIHsKLQkJCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7Ci0jaWZkZWYgQ09ORklHX0NPTVBBVAotCQkJCWlmICghZGUtPnByb2NfZm9wcy0+Y29tcGF0X2lvY3RsKQotCQkJCQlpbm9kZS0+aV9mb3AgPQotCQkJCQkJJnByb2NfcmVnX2ZpbGVfb3BzX25vX2NvbXBhdDsKLQkJCQllbHNlCi0jZW5kaWYKLQkJCQkJaW5vZGUtPmlfZm9wID0gJnByb2NfcmVnX2ZpbGVfb3BzOworCWlmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSB7CisJCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwkJUFJPQ19JKGlub2RlKS0+ZmQgPSAwOworCQlQUk9DX0koaW5vZGUpLT5wZGUgPSBkZTsKKwkJaWYgKGRlKSB7CisJCQlpZiAoZGUtPm1vZGUpIHsKKwkJCQlpbm9kZS0+aV9tb2RlID0gZGUtPm1vZGU7CisJCQkJaW5vZGUtPmlfdWlkID0gZGUtPnVpZDsKKwkJCQlpbm9kZS0+aV9naWQgPSBkZS0+Z2lkOwogCQkJfQotCQkJZWxzZQotCQkJCWlub2RlLT5pX2ZvcCA9IGRlLT5wcm9jX2ZvcHM7CisJCQlpZiAoZGUtPnNpemUpCisJCQkJaW5vZGUtPmlfc2l6ZSA9IGRlLT5zaXplOworCQkJaWYgKGRlLT5ubGluaykKKwkJCQlpbm9kZS0+aV9ubGluayA9IGRlLT5ubGluazsKKwkJCWlmIChkZS0+cHJvY19pb3BzKQorCQkJCWlub2RlLT5pX29wID0gZGUtPnByb2NfaW9wczsKKwkJCWlmIChkZS0+cHJvY19mb3BzKSB7CisJCQkJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJCQkJCWlmICghZGUtPnByb2NfZm9wcy0+Y29tcGF0X2lvY3RsKQorCQkJCQkJaW5vZGUtPmlfZm9wID0KKwkJCQkJCQkmcHJvY19yZWdfZmlsZV9vcHNfbm9fY29tcGF0OworCQkJCQllbHNlCisjZW5kaWYKKwkJCQkJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX3JlZ19maWxlX29wczsKKwkJCQl9IGVsc2UgeworCQkJCQlpbm9kZS0+aV9mb3AgPSBkZS0+cHJvY19mb3BzOworCQkJCX0KKwkJCX0KIAkJfQorCQl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKIAl9Ci0KIAlyZXR1cm4gaW5vZGU7CiAKIG91dF9pbm86CkBAIC00NzEsNCArNDY3LDMgQEAKIAlkZV9wdXQoJnByb2Nfcm9vdCk7CiAJcmV0dXJuIC1FTk9NRU07CiB9Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9mcy9wcm9jL2ludGVybmFsLmggYi9mcy9wcm9jL2ludGVybmFsLmgKaW5kZXggN2Q1N2U4MC4uZWE0OTZmZiAxMDA2NDQKLS0tIGEvZnMvcHJvYy9pbnRlcm5hbC5oCisrKyBiL2ZzL3Byb2MvaW50ZXJuYWwuaApAQCAtNDYsMTIgKzQ2LDE3IEBACiAKIGV4dGVybiBpbnQgbWFwc19wcm90ZWN0OwogCi1leHRlcm4gdm9pZCBjcmVhdGVfc2VxX2VudHJ5KGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLCBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmKTsKK2V4dGVybiB2b2lkIGNyZWF0ZV9zZXFfZW50cnkoY2hhciAqbmFtZSwgbW9kZV90IG1vZGUsCisJCQkJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZik7CiBleHRlcm4gaW50IHByb2NfZXhlX2xpbmsoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiosIHN0cnVjdCB2ZnNtb3VudCAqKik7Ci1leHRlcm4gaW50IHByb2NfdGlkX3N0YXQoc3RydWN0IHRhc2tfc3RydWN0ICosICBjaGFyICopOwotZXh0ZXJuIGludCBwcm9jX3RnaWRfc3RhdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgY2hhciAqKTsKLWV4dGVybiBpbnQgcHJvY19waWRfc3RhdHVzKHN0cnVjdCB0YXNrX3N0cnVjdCAqLCBjaGFyICopOwotZXh0ZXJuIGludCBwcm9jX3BpZF9zdGF0bShzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgY2hhciAqKTsKK2V4dGVybiBpbnQgcHJvY190aWRfc3RhdChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpucywKKwkJCQlzdHJ1Y3QgcGlkICpwaWQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CitleHRlcm4gaW50IHByb2NfdGdpZF9zdGF0KHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zLAorCQkJCXN0cnVjdCBwaWQgKnBpZCwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKK2V4dGVybiBpbnQgcHJvY19waWRfc3RhdHVzKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zLAorCQkJCXN0cnVjdCBwaWQgKnBpZCwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKK2V4dGVybiBpbnQgcHJvY19waWRfc3RhdG0oc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMsCisJCQkJc3RydWN0IHBpZCAqcGlkLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOwogZXh0ZXJuIGxvZmZfdCBtZW1fbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnKTsKIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19tYXBzX29wZXJhdGlvbnM7CmRpZmYgLS1naXQgYS9mcy9wcm9jL2tjb3JlLmMgYi9mcy9wcm9jL2tjb3JlLmMKaW5kZXggN2RkMjZlMS4uZTc4YzgxZiAxMDA2NDQKLS0tIGEvZnMvcHJvYy9rY29yZS5jCisrKyBiL2ZzL3Byb2Mva2NvcmUuYwpAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9lbGYuaD4KICNpbmNsdWRlIDxsaW51eC9lbGZjb3JlLmg+CmRpZmYgLS1naXQgYS9mcy9wcm9jL25vbW11LmMgYi9mcy9wcm9jL25vbW11LmMKaW5kZXggMjJmNzg5ZC4uNWQ5MTQ3YiAxMDA2NDQKLS0tIGEvZnMvcHJvYy9ub21tdS5jCisrKyBiL2ZzL3Byb2Mvbm9tbXUuYwpAQCAtMTE2LDcgKzExNiw3IEBACiAJcmV0dXJuIHJiX25leHQoKHN0cnVjdCByYl9ub2RlICopIHYpOwogfQogCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHByb2Nfbm9tbXVfdm1hX2xpc3Rfc2Vxb3AgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIHByb2Nfbm9tbXVfdm1hX2xpc3Rfc2Vxb3AgPSB7CiAJLnN0YXJ0CT0gbm9tbXVfdm1hX2xpc3Rfc3RhcnQsCiAJLm5leHQJPSBub21tdV92bWFfbGlzdF9uZXh0LAogCS5zdG9wCT0gbm9tbXVfdm1hX2xpc3Rfc3RvcCwKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvcHJvY19taXNjLmMgYi9mcy9wcm9jL3Byb2NfbWlzYy5jCmluZGV4IDI2ODY1OTIuLjQ2ODgwNWQgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvcHJvY19taXNjLmMKKysrIGIvZnMvcHJvYy9wcm9jX21pc2MuYwpAQCAtMjIyLDcgKzIyMiw3IEBACiAjdW5kZWYgSwogfQogCi1leHRlcm4gc3RydWN0IHNlcV9vcGVyYXRpb25zIGZyYWdtZW50YXRpb25fb3A7CitleHRlcm4gY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGZyYWdtZW50YXRpb25fb3A7CiBzdGF0aWMgaW50IGZyYWdtZW50YXRpb25fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAkodm9pZClpbm9kZTsKQEAgLTIzNiw3ICsyMzYsNyBAQAogCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCiB9OwogCi1leHRlcm4gc3RydWN0IHNlcV9vcGVyYXRpb25zIHBhZ2V0eXBlaW5mb19vcDsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcGFnZXR5cGVpbmZvX29wOwogc3RhdGljIGludCBwYWdldHlwZWluZm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJnBhZ2V0eXBlaW5mb19vcCk7CkBAIC0yNDksNyArMjQ5LDcgQEAKIAkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAogfTsKIAotZXh0ZXJuIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyB6b25laW5mb19vcDsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgem9uZWluZm9fb3A7CiBzdGF0aWMgaW50IHpvbmVpbmZvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZ6b25laW5mb19vcCk7CkBAIC0yNzQsNyArMjc0LDcgQEAKIAlyZXR1cm4gcHJvY19jYWxjX21ldHJpY3MocGFnZSwgc3RhcnQsIG9mZiwgY291bnQsIGVvZiwgbGVuKTsKIH0KIAotZXh0ZXJuIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBjcHVpbmZvX29wOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBjcHVpbmZvX29wOwogc3RhdGljIGludCBjcHVpbmZvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZjcHVpbmZvX29wKTsKQEAgLTMyNyw3ICszMjcsNyBAQAogCS8qIE5vdGhpbmcgdG8gZG8gKi8KIH0KIAotc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBkZXZpbmZvX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZGV2aW5mb19vcHMgPSB7CiAJLnN0YXJ0ID0gZGV2aW5mb19zdGFydCwKIAkubmV4dCAgPSBkZXZpbmZvX25leHQsCiAJLnN0b3AgID0gZGV2aW5mb19zdG9wLApAQCAtMzQ2LDcgKzM0Niw3IEBACiAJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZSwKIH07CiAKLWV4dGVybiBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgdm1zdGF0X29wOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyB2bXN0YXRfb3A7CiBzdGF0aWMgaW50IHZtc3RhdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXJldHVybiBzZXFfb3BlbihmaWxlLCAmdm1zdGF0X29wKTsKQEAgLTM3Nyw3ICszNzcsNyBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQkxPQ0sKLWV4dGVybiBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcGFydGl0aW9uc19vcDsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcGFydGl0aW9uc19vcDsKIHN0YXRpYyBpbnQgcGFydGl0aW9uc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXJldHVybiBzZXFfb3BlbihmaWxlLCAmcGFydGl0aW9uc19vcCk7CkBAIC0zODksNyArMzg5LDcgQEAKIAkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAogfTsKIAotZXh0ZXJuIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBkaXNrc3RhdHNfb3A7CitleHRlcm4gY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGRpc2tzdGF0c19vcDsKIHN0YXRpYyBpbnQgZGlza3N0YXRzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZkaXNrc3RhdHNfb3ApOwpAQCAtNDAzLDcgKzQwMyw3IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19NT0RVTEVTCi1leHRlcm4gc3RydWN0IHNlcV9vcGVyYXRpb25zIG1vZHVsZXNfb3A7CitleHRlcm4gY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIG1vZHVsZXNfb3A7CiBzdGF0aWMgaW50IG1vZHVsZXNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJm1vZHVsZXNfb3ApOwpAQCAtNDMwLDcgKzQzMCw3IEBACiB9OwogCiAjaWZkZWYgQ09ORklHX0RFQlVHX1NMQUJfTEVBSwotZXh0ZXJuIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBzbGFic3RhdHNfb3A7CitleHRlcm4gY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIHNsYWJzdGF0c19vcDsKIHN0YXRpYyBpbnQgc2xhYnN0YXRzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJdW5zaWduZWQgbG9uZyAqbiA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKQEAgLTYwNCw3ICs2MDQsNyBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaW50X3NlcV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGludF9zZXFfb3BzID0gewogCS5zdGFydCA9IGludF9zZXFfc3RhcnQsCiAJLm5leHQgID0gaW50X3NlcV9uZXh0LAogCS5zdG9wICA9IGludF9zZXFfc3RvcCwKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvcHJvY19uZXQuYyBiL2ZzL3Byb2MvcHJvY19uZXQuYwppbmRleCA0ODIzYzk2Li4xNGU5YjVhIDEwMDY0NAotLS0gYS9mcy9wcm9jL3Byb2NfbmV0LmMKKysrIGIvZnMvcHJvYy9wcm9jX25ldC5jCkBAIC02NywxMiArNjcsNyBAQAogc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX25ldF9mb3BzX2NyZWF0ZShzdHJ1Y3QgbmV0ICpuZXQsCiAJY29uc3QgY2hhciAqbmFtZSwgbW9kZV90IG1vZGUsIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMpCiB7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyZXM7Ci0KLQlyZXMgPSBjcmVhdGVfcHJvY19lbnRyeShuYW1lLCBtb2RlLCBuZXQtPnByb2NfbmV0KTsKLQlpZiAocmVzKQotCQlyZXMtPnByb2NfZm9wcyA9IGZvcHM7Ci0JcmV0dXJuIHJlczsKKwlyZXR1cm4gcHJvY19jcmVhdGUobmFtZSwgbW9kZSwgbmV0LT5wcm9jX25ldCwgZm9wcyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwcm9jX25ldF9mb3BzX2NyZWF0ZSk7CiAKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvcHJvY19zeXNjdGwuYyBiL2ZzL3Byb2MvcHJvY19zeXNjdGwuYwppbmRleCA0ZTU3ZmNmLi5iOWNiMjNjIDEwMDY0NAotLS0gYS9mcy9wcm9jL3Byb2Nfc3lzY3RsLmMKKysrIGIvZnMvcHJvYy9wcm9jX3N5c2N0bC5jCkBAIC05LDcgKzksNyBAQAogCiBzdGF0aWMgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIHByb2Nfc3lzX2RlbnRyeV9vcGVyYXRpb25zOwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19zeXNfZmlsZV9vcGVyYXRpb25zOwotc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHByb2Nfc3lzX2lub2RlX29wZXJhdGlvbnM7CitzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcHJvY19zeXNfaW5vZGVfb3BlcmF0aW9uczsKIAogc3RhdGljIHZvaWQgcHJvY19zeXNfcmVmcmVzaF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSkKIHsKQEAgLTQ0Niw3ICs0NDYsNyBAQAogCS5yZWFkZGlyCT0gcHJvY19zeXNfcmVhZGRpciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBwcm9jX3N5c19pbm9kZV9vcGVyYXRpb25zID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHByb2Nfc3lzX2lub2RlX29wZXJhdGlvbnMgPSB7CiAJLmxvb2t1cAkJPSBwcm9jX3N5c19sb29rdXAsCiAJLnBlcm1pc3Npb24JPSBwcm9jX3N5c19wZXJtaXNzaW9uLAogCS5zZXRhdHRyCT0gcHJvY19zeXNfc2V0YXR0ciwKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvcHJvY190dHkuYyBiL2ZzL3Byb2MvcHJvY190dHkuYwppbmRleCAyMjg0NjIyLi40OTgxNmUwIDEwMDY0NAotLS0gYS9mcy9wcm9jL3Byb2NfdHR5LmMKKysrIGIvZnMvcHJvYy9wcm9jX3R0eS5jCkBAIC0xNSw5ICsxNSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KIAotc3RhdGljIGludCB0dHlfbGRpc2NzX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKLQkJCQlpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLQogLyoKICAqIFRoZSAvcHJvYy90dHkgZGlyZWN0b3J5IGlub2Rlcy4uLgogICovCkBAIC0xMjAsNyArMTE3LDcgQEAKIAltdXRleF91bmxvY2soJnR0eV9tdXRleCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgdHR5X2RyaXZlcnNfb3AgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIHR0eV9kcml2ZXJzX29wID0gewogCS5zdGFydAk9IHRfc3RhcnQsCiAJLm5leHQJPSB0X25leHQsCiAJLnN0b3AJPSB0X3N0b3AsCmRpZmYgLS1naXQgYS9mcy9wcm9jL3Jvb3QuYyBiL2ZzL3Byb2Mvcm9vdC5jCmluZGV4IDgxZjk5ZTYuLmVmMGZiNTcgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2Mvcm9vdC5jCisrKyBiL2ZzL3Byb2Mvcm9vdC5jCkBAIC0yMzIsNiArMjMyLDcgQEAKIEVYUE9SVF9TWU1CT0wocHJvY19zeW1saW5rKTsKIEVYUE9SVF9TWU1CT0wocHJvY19ta2Rpcik7CiBFWFBPUlRfU1lNQk9MKGNyZWF0ZV9wcm9jX2VudHJ5KTsKK0VYUE9SVF9TWU1CT0wocHJvY19jcmVhdGUpOwogRVhQT1JUX1NZTUJPTChyZW1vdmVfcHJvY19lbnRyeSk7CiBFWFBPUlRfU1lNQk9MKHByb2Nfcm9vdCk7CiBFWFBPUlRfU1lNQk9MKHByb2Nfcm9vdF9mcyk7CmRpZmYgLS1naXQgYS9mcy9wcm9jL3Rhc2tfbW11LmMgYi9mcy9wcm9jL3Rhc2tfbW11LmMKaW5kZXggMzgzMzhlZC4uYWU0ZDNmMiAxMDA2NDQKLS0tIGEvZnMvcHJvYy90YXNrX21tdS5jCisrKyBiL2ZzL3Byb2MvdGFza19tbXUuYwpAQCAtOSwxMyArOSwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L21lbXBvbGljeS5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9zd2Fwb3BzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KIAogI2luY2x1ZGUgPGFzbS9lbGYuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKLWNoYXIgKnRhc2tfbWVtKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBjaGFyICpidWZmZXIpCit2b2lkIHRhc2tfbWVtKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CiAJdW5zaWduZWQgbG9uZyBkYXRhLCB0ZXh0LCBsaWI7CiAJdW5zaWduZWQgbG9uZyBoaXdhdGVyX3ZtLCB0b3RhbF92bSwgaGl3YXRlcl9yc3MsIHRvdGFsX3JzczsKQEAgLTM3LDcgKzM4LDcgQEAKIAlkYXRhID0gbW0tPnRvdGFsX3ZtIC0gbW0tPnNoYXJlZF92bSAtIG1tLT5zdGFja192bTsKIAl0ZXh0ID0gKFBBR0VfQUxJR04obW0tPmVuZF9jb2RlKSAtIChtbS0+c3RhcnRfY29kZSAmIFBBR0VfTUFTSykpID4+IDEwOwogCWxpYiA9IChtbS0+ZXhlY192bSA8PCAoUEFHRV9TSElGVC0xMCkpIC0gdGV4dDsKLQlidWZmZXIgKz0gc3ByaW50ZihidWZmZXIsCisJc2VxX3ByaW50ZihtLAogCQkiVm1QZWFrOlx0JThsdSBrQlxuIgogCQkiVm1TaXplOlx0JThsdSBrQlxuIgogCQkiVm1MY2s6XHQlOGx1IGtCXG4iCkBAIC01Niw3ICs1Nyw2IEBACiAJCWRhdGEgPDwgKFBBR0VfU0hJRlQtMTApLAogCQltbS0+c3RhY2tfdm0gPDwgKFBBR0VfU0hJRlQtMTApLCB0ZXh0LCBsaWIsCiAJCShQVFJTX1BFUl9QVEUqc2l6ZW9mKHB0ZV90KSptbS0+bnJfcHRlcykgPj4gMTApOwotCXJldHVybiBidWZmZXI7CiB9CiAKIHVuc2lnbmVkIGxvbmcgdGFza192c2l6ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKQEAgLTIxNiw3ICsyMTYsNyBAQAogfQogCiBzdGF0aWMgaW50IGRvX21hcHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCXN0cnVjdCBzZXFfb3BlcmF0aW9ucyAqb3BzKQorCQkJY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zICpvcHMpCiB7CiAJc3RydWN0IHByb2NfbWFwc19wcml2YXRlICpwcml2OwogCWludCByZXQgPSAtRU5PTUVNOwpAQCAtMjk5LDcgKzI5OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcHJvY19waWRfbWFwc19vcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcHJvY19waWRfbWFwc19vcCA9IHsKIAkuc3RhcnQJPSBtX3N0YXJ0LAogCS5uZXh0CT0gbV9uZXh0LAogCS5zdG9wCT0gbV9zdG9wLApAQCAtNDM0LDcgKzQzNCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBwcm9jX3BpZF9zbWFwc19vcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcHJvY19waWRfc21hcHNfb3AgPSB7CiAJLnN0YXJ0CT0gbV9zdGFydCwKIAkubmV4dAk9IG1fbmV4dCwKIAkuc3RvcAk9IG1fc3RvcCwKQEAgLTczNCw3ICs3MzQsNyBAQAogCXJldHVybiBzaG93X251bWFfbWFwKG0sIHYpOwogfQogCi1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHByb2NfcGlkX251bWFfbWFwc19vcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcHJvY19waWRfbnVtYV9tYXBzX29wID0gewogICAgICAgICAuc3RhcnQgID0gbV9zdGFydCwKICAgICAgICAgLm5leHQgICA9IG1fbmV4dCwKICAgICAgICAgLnN0b3AgICA9IG1fc3RvcCwKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvdGFza19ub21tdS5jIGIvZnMvcHJvYy90YXNrX25vbW11LmMKaW5kZXggMTkzMmMyYy4uYWJmYzZmNSAxMDA2NDQKLS0tIGEvZnMvcHJvYy90YXNrX25vbW11LmMKKysrIGIvZnMvcHJvYy90YXNrX25vbW11LmMKQEAgLTEyLDcgKzEyLDcgQEAKICAqIGVhY2ggcHJvY2VzcyB0aGF0IG93bnMgaXQuIE5vbi1zaGFyZWQgbWVtb3J5IGlzIGNvdW50ZWQKICAqIGFjY3VyYXRlbHkuCiAgKi8KLWNoYXIgKnRhc2tfbWVtKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBjaGFyICpidWZmZXIpCit2b2lkIHRhc2tfbWVtKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CiAJc3RydWN0IHZtX2xpc3Rfc3RydWN0ICp2bWw7CiAJdW5zaWduZWQgbG9uZyBieXRlcyA9IDAsIHNieXRlcyA9IDAsIHNsYWNrID0gMDsKQEAgLTU4LDE0ICs1OCwxMyBAQAogCiAJYnl0ZXMgKz0ga29ianNpemUoY3VycmVudCk7IC8qIGluY2x1ZGVzIGtlcm5lbCBzdGFjayAqLwogCi0JYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLAorCXNlcV9wcmludGYobSwKIAkJIk1lbTpcdCU4bHUgYnl0ZXNcbiIKIAkJIlNsYWNrOlx0JThsdSBieXRlc1xuIgogCQkiU2hhcmVkOlx0JThsdSBieXRlc1xuIiwKIAkJYnl0ZXMsIHNsYWNrLCBzYnl0ZXMpOwogCiAJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKLQlyZXR1cm4gYnVmZmVyOwogfQogCiB1bnNpZ25lZCBsb25nIHRhc2tfdnNpemUoc3RydWN0IG1tX3N0cnVjdCAqbW0pCkBAIC0xOTksNyArMTk4LDcgQEAKIAlyZXR1cm4gdm1sID8gdm1sLT5uZXh0IDogTlVMTDsKIH0KIAotc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBwcm9jX3BpZF9tYXBzX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcHJvY19waWRfbWFwc19vcHMgPSB7CiAJLnN0YXJ0CT0gbV9zdGFydCwKIAkubmV4dAk9IG1fbmV4dCwKIAkuc3RvcAk9IG1fc3RvcCwKZGlmZiAtLWdpdCBhL2ZzL3Byb2Mvdm1jb3JlLmMgYi9mcy9wcm9jL3ZtY29yZS5jCmluZGV4IDUyM2UxMDkuLjlhYzBmNWUgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2Mvdm1jb3JlLmMKKysrIGIvZnMvcHJvYy92bWNvcmUuYwpAQCAtMTAsNyArMTAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgogI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgogI2luY2x1ZGUgPGxpbnV4L2VsZmNvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CmRpZmYgLS1naXQgYS9mcy9xbng0L2lub2RlLmMgYi9mcy9xbng0L2lub2RlLmMKaW5kZXggNjM4YmRiOS4uYjMxYWI3OCAxMDA2NDQKLS0tIGEvZnMvcW54NC9pbm9kZS5jCisrKyBiL2ZzL3FueDQvaW5vZGUuYwpAQCAtMTI1LDcgKzEyNSw2IEBACiBzdGF0aWMgdm9pZCBxbng0X3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIHN0YXRpYyBzdHJ1Y3QgaW5vZGUgKnFueDRfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiBzdGF0aWMgdm9pZCBxbng0X2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7Ci1zdGF0aWMgdm9pZCBxbng0X3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICopOwogc3RhdGljIGludCBxbng0X3JlbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSk7CiBzdGF0aWMgaW50IHFueDRfc3RhdGZzKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGtzdGF0ZnMgKik7CiAKQEAgLTEzMyw3ICsxMzIsNiBAQAogewogCS5hbGxvY19pbm9kZQk9IHFueDRfYWxsb2NfaW5vZGUsCiAJLmRlc3Ryb3lfaW5vZGUJPSBxbng0X2Rlc3Ryb3lfaW5vZGUsCi0JLnJlYWRfaW5vZGUJPSBxbng0X3JlYWRfaW5vZGUsCiAJLnB1dF9zdXBlcgk9IHFueDRfcHV0X3N1cGVyLAogCS5zdGF0ZnMJCT0gcW54NF9zdGF0ZnMsCiAJLnJlbW91bnRfZnMJPSBxbng0X3JlbW91bnQsCkBAIC0zNTcsNiArMzU1LDcgQEAKIAlzdHJ1Y3QgaW5vZGUgKnJvb3Q7CiAJY29uc3QgY2hhciAqZXJybXNnOwogCXN0cnVjdCBxbng0X3NiX2luZm8gKnFzOworCWludCByZXQgPSAtRUlOVkFMOwogCiAJcXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcW54NF9zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFxcykKQEAgLTM5NiwxMiArMzk1LDE0IEBACiAJfQogCiAgCS8qIGRvZXMgcm9vdCBub3QgaGF2ZSBpbm9kZSBudW1iZXIgUU5YNF9ST09UX0lOTyA/PyAqLwotIAlyb290ID0gaWdldChzLCBRTlg0X1JPT1RfSU5PICogUU5YNF9JTk9ERVNfUEVSX0JMT0NLKTsKLSAJaWYgKCFyb290KSB7CisJcm9vdCA9IHFueDRfaWdldChzLCBRTlg0X1JPT1RfSU5PICogUU5YNF9JTk9ERVNfUEVSX0JMT0NLKTsKKwlpZiAoSVNfRVJSKHJvb3QpKSB7CiAgCQlwcmludGsoInFueDQ6IGdldCBpbm9kZSBmYWlsZWRcbiIpOworCQlyZXQgPSBQVFJfRVJSKHJvb3QpOwogIAkJZ290byBvdXQ7CiAgCX0KIAorCXJldCA9IC1FTk9NRU07CiAgCXMtPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290KTsKICAJaWYgKHMtPnNfcm9vdCA9PSBOVUxMKQogIAkJZ290byBvdXRpOwpAQCAtNDE3LDcgKzQxOCw3IEBACiAgICAgICBvdXRub2JoOgogCWtmcmVlKHFzKTsKIAlzLT5zX2ZzX2luZm8gPSBOVUxMOwotCXJldHVybiAtRUlOVkFMOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIHFueDRfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCkBAIC00NjIsMjkgKzQ2MywzOCBAQAogCS5ibWFwCQk9IHFueDRfYm1hcAogfTsKIAotc3RhdGljIHZvaWQgcW54NF9yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdHJ1Y3QgaW5vZGUgKnFueDRfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBsb25nIGlubykKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCXN0cnVjdCBxbng0X2lub2RlX2VudHJ5ICpyYXdfaW5vZGU7Ci0JaW50IGJsb2NrLCBpbm87Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwotCXN0cnVjdCBxbng0X2lub2RlX2VudHJ5ICpxbng0X2lub2RlID0gcW54NF9yYXdfaW5vZGUoaW5vZGUpOworCWludCBibG9jazsKKwlzdHJ1Y3QgcW54NF9pbm9kZV9lbnRyeSAqcW54NF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCi0JaW5vID0gaW5vZGUtPmlfaW5vOworCWlub2RlID0gaWdldF9sb2NrZWQoc2IsIGlubyk7CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykpCisJCXJldHVybiBpbm9kZTsKKworCXFueDRfaW5vZGUgPSBxbng0X3Jhd19pbm9kZShpbm9kZSk7CiAJaW5vZGUtPmlfbW9kZSA9IDA7CiAKIAlRTlg0REVCVUcoKCJSZWFkaW5nIGlub2RlIDogWyVkXVxuIiwgaW5vKSk7CiAJaWYgKCFpbm8pIHsKLQkJcHJpbnRrKCJxbng0OiBiYWQgaW5vZGUgbnVtYmVyIG9uIGRldiAlczogJWQgaXMgb3V0IG9mIHJhbmdlXG4iLAorCQlwcmludGsoS0VSTl9FUlIgInFueDQ6IGJhZCBpbm9kZSBudW1iZXIgb24gZGV2ICVzOiAlbHUgaXMgIgorCQkJCSJvdXQgb2YgcmFuZ2VcbiIsCiAJCSAgICAgICBzYi0+c19pZCwgaW5vKTsKLQkJcmV0dXJuOworCQlpZ2V0X2ZhaWxlZChpbm9kZSk7CisJCXJldHVybiBFUlJfUFRSKC1FSU8pOwogCX0KIAlibG9jayA9IGlubyAvIFFOWDRfSU5PREVTX1BFUl9CTE9DSzsKIAogCWlmICghKGJoID0gc2JfYnJlYWQoc2IsIGJsb2NrKSkpIHsKIAkJcHJpbnRrKCJxbng0OiBtYWpvciBwcm9ibGVtOiB1bmFibGUgdG8gcmVhZCBpbm9kZSBmcm9tIGRldiAiCiAJCSAgICAgICAiJXNcbiIsIHNiLT5zX2lkKTsKLQkJcmV0dXJuOworCQlpZ2V0X2ZhaWxlZChpbm9kZSk7CisJCXJldHVybiBFUlJfUFRSKC1FSU8pOwogCX0KIAlyYXdfaW5vZGUgPSAoKHN0cnVjdCBxbng0X2lub2RlX2VudHJ5ICopIGJoLT5iX2RhdGEpICsKIAkgICAgKGlubyAlIFFOWDRfSU5PREVTX1BFUl9CTE9DSyk7CkBAIC01MTUsOSArNTI1LDE2IEBACiAJCWlub2RlLT5pX29wID0gJnBhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwogCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZxbng0X2FvcHM7CiAJCXFueDRfaShpbm9kZSktPm1tdV9wcml2YXRlID0gaW5vZGUtPmlfc2l6ZTsKLQl9IGVsc2UKLQkJcHJpbnRrKCJxbng0OiBiYWQgaW5vZGUgJWQgb24gZGV2ICVzXG4iLGlubyxzYi0+c19pZCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJxbng0OiBiYWQgaW5vZGUgJWx1IG9uIGRldiAlc1xuIiwKKwkJCWlubywgc2ItPnNfaWQpOworCQlpZ2V0X2ZhaWxlZChpbm9kZSk7CisJCWJyZWxzZShiaCk7CisJCXJldHVybiBFUlJfUFRSKC1FSU8pOworCX0KIAlicmVsc2UoYmgpOworCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCXJldHVybiBpbm9kZTsKIH0KIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpxbng0X2lub2RlX2NhY2hlcDsKZGlmZiAtLWdpdCBhL2ZzL3FueDQvbmFtZWkuYyBiL2ZzL3FueDQvbmFtZWkuYwppbmRleCA3MzNjZGYwLi43NzVlZWQzIDEwMDY0NAotLS0gYS9mcy9xbng0L25hbWVpLmMKKysrIGIvZnMvcW54NC9uYW1laS5jCkBAIC0xMjgsMTAgKzEyOCwxMiBAQAogCX0KIAlicmVsc2UoYmgpOwogCi0JaWYgKChmb3VuZGlub2RlID0gaWdldChkaXItPmlfc2IsIGlubykpID09IE5VTEwpIHsKKwlmb3VuZGlub2RlID0gcW54NF9pZ2V0KGRpci0+aV9zYiwgaW5vKTsKKwlpZiAoSVNfRVJSKGZvdW5kaW5vZGUpKSB7CiAJCXVubG9ja19rZXJuZWwoKTsKLQkJUU5YNERFQlVHKCgicW54NDogbG9va3VwLT5pZ2V0IC0+IE5VTExcbiIpKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisJCVFOWDRERUJVRygoInFueDQ6IGxvb2t1cC0+aWdldCAtPiBlcnJvciAlbGRcbiIsCisJCQkgICBQVFJfRVJSKGZvdW5kaW5vZGUpKSk7CisJCXJldHVybiBFUlJfQ0FTVChmb3VuZGlub2RlKTsKIAl9CiBvdXQ6CiAJdW5sb2NrX2tlcm5lbCgpOwpkaWZmIC0tZ2l0IGEvZnMvcXVvdGEuYyBiL2ZzL3F1b3RhLmMKaW5kZXggOTliMjRiNS4uODRmMjhkZCAxMDA2NDQKLS0tIGEvZnMvcXVvdGEuYworKysgYi9mcy9xdW90YS5jCkBAIC0zNDEsMTEgKzM0MSwxMSBAQAogCWNoYXIgKnRtcCA9IGdldG5hbWUoc3BlY2lhbCk7CiAKIAlpZiAoSVNfRVJSKHRtcCkpCi0JCXJldHVybiBFUlJfUFRSKFBUUl9FUlIodG1wKSk7CisJCXJldHVybiBFUlJfQ0FTVCh0bXApOwogCWJkZXYgPSBsb29rdXBfYmRldih0bXApOwogCXB1dG5hbWUodG1wKTsKIAlpZiAoSVNfRVJSKGJkZXYpKQotCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKGJkZXYpKTsKKwkJcmV0dXJuIEVSUl9DQVNUKGJkZXYpOwogCXNiID0gZ2V0X3N1cGVyKGJkZXYpOwogCWJkcHV0KGJkZXYpOwogCWlmICghc2IpCmRpZmYgLS1naXQgYS9mcy9yZWFkX3dyaXRlLmMgYi9mcy9yZWFkX3dyaXRlLmMKaW5kZXggMWMxNzdmMi4uNDlhOTg3MSAxMDA2NDQKLS0tIGEvZnMvcmVhZF93cml0ZS5jCisrKyBiL2ZzL3JlYWRfd3JpdGUuYwpAQCAtMzY2LDcgKzM2Niw2IEBACiAKIAlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1VOVVNFRF9TWU1CT0xfR1BMKHN5c19yZWFkKTsgLyogdG8gYmUgZGVsZXRlZCBmb3IgMi42LjI1ICovCiAKIGFzbWxpbmthZ2Ugc3NpemVfdCBzeXNfd3JpdGUodW5zaWduZWQgaW50IGZkLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IGNvdW50KQogewpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvaW5vZGUuYyBiL2ZzL3JlaXNlcmZzL2lub2RlLmMKaW5kZXggMTk1MzA5OC4uNTc5MTc5MyAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvaW5vZGUuYworKysgYi9mcy9yZWlzZXJmcy9pbm9kZS5jCkBAIC0xNTM2LDcgKzE1MzYsNyBAQAogCWlmICghaW5vZGUpCiAJCWlub2RlID0gRVJSX1BUUigtRVNUQUxFKTsKIAlpZiAoSVNfRVJSKGlub2RlKSkKLQkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihpbm9kZSkpOworCQlyZXR1cm4gRVJSX0NBU1QoaW5vZGUpOwogCXJlc3VsdCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CiAJaWYgKCFyZXN1bHQpIHsKIAkJaXB1dChpbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9wcm9jZnMuYyBiL2ZzL3JlaXNlcmZzL3Byb2Nmcy5jCmluZGV4IDAwMTE0NDYuLjhmODZjNTIgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3Byb2Nmcy5jCisrKyBiL2ZzL3JlaXNlcmZzL3Byb2Nmcy5jCkBAIC00NDQsNyArNDQ0LDcgQEAKIAlyZXR1cm4gc2hvdyhtLCB2KTsKIH0KIAotc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyByX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcl9vcHMgPSB7CiAJLnN0YXJ0ID0gcl9zdGFydCwKIAkubmV4dCA9IHJfbmV4dCwKIAkuc3RvcCA9IHJfc3RvcCwKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3N1cGVyLmMgYi9mcy9yZWlzZXJmcy9zdXBlci5jCmluZGV4IDVjZDg1ZmUuLjYwMzNmMGMgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3N1cGVyLmMKKysrIGIvZnMvcmVpc2VyZnMvc3VwZXIuYwpAQCAtNjE3LDYgKzYxNyw3IEBACiAJLnVubG9ja2ZzID0gcmVpc2VyZnNfdW5sb2NrZnMsCiAJLnN0YXRmcyA9IHJlaXNlcmZzX3N0YXRmcywKIAkucmVtb3VudF9mcyA9IHJlaXNlcmZzX3JlbW91bnQsCisJLnNob3dfb3B0aW9ucyA9IGdlbmVyaWNfc2hvd19vcHRpb25zLAogI2lmZGVmIENPTkZJR19RVU9UQQogCS5xdW90YV9yZWFkID0gcmVpc2VyZnNfcXVvdGFfcmVhZCwKIAkucXVvdGFfd3JpdGUgPSByZWlzZXJmc19xdW90YV93cml0ZSwKQEAgLTExMzgsNiArMTEzOSw3IEBACiAJdW5zaWduZWQgbG9uZyBzYWZlX21hc2sgPSAwOwogCXVuc2lnbmVkIGludCBjb21taXRfbWF4X2FnZSA9ICh1bnNpZ25lZCBpbnQpLTE7CiAJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHMpOworCWNoYXIgKm5ld19vcHRzID0ga3N0cmR1cChhcmcsIEdGUF9LRVJORUwpOwogCWludCBlcnI7CiAjaWZkZWYgQ09ORklHX1FVT1RBCiAJaW50IGk7CkBAIC0xMTUzLDcgKzExNTUsOCBAQAogCQkJUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbaV0gPSBOVUxMOwogCQl9CiAjZW5kaWYKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2VycjsKIAl9CiAKIAloYW5kbGVfYXR0cnMocyk7CkBAIC0xMTkxLDkgKzExOTQsOSBAQAogCX0KIAogCWlmIChibG9ja3MpIHsKLQkJaW50IHJjID0gcmVpc2VyZnNfcmVzaXplKHMsIGJsb2Nrcyk7Ci0JCWlmIChyYyAhPSAwKQotCQkJcmV0dXJuIHJjOworCQllcnIgPSByZWlzZXJmc19yZXNpemUocywgYmxvY2tzKTsKKwkJaWYgKGVyciAhPSAwKQorCQkJZ290byBvdXRfZXJyOwogCX0KIAogCWlmICgqbW91bnRfZmxhZ3MgJiBNU19SRE9OTFkpIHsKQEAgLTEyMDEsMTYgKzEyMDQsMTYgQEAKIAkJLyogcmVtb3VudCByZWFkLW9ubHkgKi8KIAkJaWYgKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpCiAJCQkvKiBpdCBpcyByZWFkLW9ubHkgYWxyZWFkeSAqLwotCQkJcmV0dXJuIDA7CisJCQlnb3RvIG91dF9vazsKIAkJLyogdHJ5IHRvIHJlbW91bnQgZmlsZSBzeXN0ZW0gd2l0aCByZWFkLW9ubHkgcGVybWlzc2lvbnMgKi8KIAkJaWYgKHNiX3Vtb3VudF9zdGF0ZShycykgPT0gUkVJU0VSRlNfVkFMSURfRlMKIAkJICAgIHx8IFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X3N0YXRlICE9IFJFSVNFUkZTX1ZBTElEX0ZTKSB7Ci0JCQlyZXR1cm4gMDsKKwkJCWdvdG8gb3V0X29rOwogCQl9CiAKIAkJZXJyID0gam91cm5hbF9iZWdpbigmdGgsIHMsIDEwKTsKIAkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7CisJCQlnb3RvIG91dF9lcnI7CiAKIAkJLyogTW91bnRpbmcgYSBydyBwYXJ0aXRpb24gcmVhZC1vbmx5LiAqLwogCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLCAxKTsKQEAgLTEyMjAsMTEgKzEyMjMsMTMgQEAKIAkJLyogcmVtb3VudCByZWFkLXdyaXRlICovCiAJCWlmICghKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CiAJCQlyZWlzZXJmc194YXR0cl9pbml0KHMsICptb3VudF9mbGFncyk7Ci0JCQlyZXR1cm4gMDsJLyogV2UgYXJlIHJlYWQtd3JpdGUgYWxyZWFkeSAqLworCQkJZ290byBvdXRfb2s7CS8qIFdlIGFyZSByZWFkLXdyaXRlIGFscmVhZHkgKi8KIAkJfQogCi0JCWlmIChyZWlzZXJmc19pc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpCi0JCQlyZXR1cm4gam91cm5hbC0+al9lcnJubzsKKwkJaWYgKHJlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSkgeworCQkJZXJyID0gam91cm5hbC0+al9lcnJubzsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQogCiAJCWhhbmRsZV9kYXRhX21vZGUocywgbW91bnRfb3B0aW9ucyk7CiAJCWhhbmRsZV9iYXJyaWVyX21vZGUocywgbW91bnRfb3B0aW9ucyk7CkBAIC0xMjMyLDcgKzEyMzcsNyBAQAogCQlzLT5zX2ZsYWdzICY9IH5NU19SRE9OTFk7CS8qIG5vdyBpdCBpcyBzYWZlIHRvIGNhbGwgam91cm5hbF9iZWdpbiAqLwogCQllcnIgPSBqb3VybmFsX2JlZ2luKCZ0aCwgcywgMTApOwogCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKKwkJCWdvdG8gb3V0X2VycjsKIAogCQkvKiBNb3VudCBhIHBhcnRpdGlvbiB3aGljaCBpcyByZWFkLW9ubHksIHJlYWQtd3JpdGUgKi8KIAkJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwgMSk7CkBAIC0xMjQ3LDcgKzEyNTIsNyBAQAogCVNCX0pPVVJOQUwocyktPmpfbXVzdF93YWl0ID0gMTsKIAllcnIgPSBqb3VybmFsX2VuZCgmdGgsIHMsIDEwKTsKIAlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOworCQlnb3RvIG91dF9lcnI7CiAJcy0+c19kaXJ0ID0gMDsKIAogCWlmICghKCptb3VudF9mbGFncyAmIE1TX1JET05MWSkpIHsKQEAgLTEyNTUsNyArMTI2MCwxNCBAQAogCQlyZWlzZXJmc194YXR0cl9pbml0KHMsICptb3VudF9mbGFncyk7CiAJfQogCitvdXRfb2s6CisJa2ZyZWUocy0+c19vcHRpb25zKTsKKwlzLT5zX29wdGlvbnMgPSBuZXdfb3B0czsKIAlyZXR1cm4gMDsKKworb3V0X2VycjoKKwlrZnJlZShuZXdfb3B0cyk7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCByZWFkX3N1cGVyX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgaW50IG9mZnNldCkKQEAgLTE1NTksNiArMTU3MSw4IEBACiAJc3RydWN0IHJlaXNlcmZzX3NiX2luZm8gKnNiaTsKIAlpbnQgZXJydmFsID0gLUVJTlZBTDsKIAorCXNhdmVfbW91bnRfb3B0aW9ucyhzLCBkYXRhKTsKKwogCXNiaSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzYmkpIHsKIAkJZXJydmFsID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3hhdHRyLmMgYi9mcy9yZWlzZXJmcy94YXR0ci5jCmluZGV4IGE1YmQyM2MuLmViYTAzN2IgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3hhdHRyLmMKKysrIGIvZnMvcmVpc2VyZnMveGF0dHIuYwpAQCAtMTU1LDcgKzE1NSw3IEBACiAKIAl4YWRpciA9IG9wZW5feGFfZGlyKGlub2RlLCBmbGFncyk7CiAJaWYgKElTX0VSUih4YWRpcikpIHsKLQkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUih4YWRpcikpOworCQlyZXR1cm4gRVJSX0NBU1QoeGFkaXIpOwogCX0gZWxzZSBpZiAoeGFkaXIgJiYgIXhhZGlyLT5kX2lub2RlKSB7CiAJCWRwdXQoeGFkaXIpOwogCQlyZXR1cm4gRVJSX1BUUigtRU5PREFUQSk7CkBAIC0xNjQsNyArMTY0LDcgQEAKIAl4YWZpbGUgPSBsb29rdXBfb25lX2xlbihuYW1lLCB4YWRpciwgc3RybGVuKG5hbWUpKTsKIAlpZiAoSVNfRVJSKHhhZmlsZSkpIHsKIAkJZHB1dCh4YWRpcik7Ci0JCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoeGFmaWxlKSk7CisJCXJldHVybiBFUlJfQ0FTVCh4YWZpbGUpOwogCX0KIAogCWlmICh4YWZpbGUtPmRfaW5vZGUpIHsJLyogZmlsZSBleGlzdHMgKi8KZGlmZiAtLWdpdCBhL2ZzL3JvbWZzL2lub2RlLmMgYi9mcy9yb21mcy9pbm9kZS5jCmluZGV4IGE0OWNmNWIuLjAwYjZmMGE1IDEwMDY0NAotLS0gYS9mcy9yb21mcy9pbm9kZS5jCisrKyBiL2ZzL3JvbWZzL2lub2RlLmMKQEAgLTg0LDYgKzg0LDggQEAKIAlzdHJ1Y3QgaW5vZGUgdmZzX2lub2RlOwogfTsKIAorc3RhdGljIHN0cnVjdCBpbm9kZSAqcm9tZnNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZyk7CisKIC8qIGluc3RlYWQgb2YgcHJpdmF0ZSBzdXBlcmJsb2NrIGRhdGEgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyByb21mc19tYXhzaXplKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CkBAIC0xMTcsNyArMTE5LDcgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCXN0cnVjdCByb21mc19zdXBlcl9ibG9jayAqcnNiOwogCXN0cnVjdCBpbm9kZSAqcm9vdDsKLQlpbnQgc3o7CisJaW50IHN6LCByZXQgPSAtRUlOVkFMOwogCiAJLyogSSB3b3VsZCBwYXJzZSB0aGUgb3B0aW9ucyBoZXJlLCBidXQgdGhlcmUgYXJlIG5vbmUuLiA6KSAqLwogCkBAIC0xNTcsMTAgKzE1OSwxMyBAQAogCSAgICAgJiBST01GSF9NQVNLOwogCiAJcy0+c19vcAk9ICZyb21mc19vcHM7Ci0Jcm9vdCA9IGlnZXQocywgc3opOwotCWlmICghcm9vdCkKKwlyb290ID0gcm9tZnNfaWdldChzLCBzeik7CisJaWYgKElTX0VSUihyb290KSkgeworCQlyZXQgPSBQVFJfRVJSKHJvb3QpOwogCQlnb3RvIG91dDsKKwl9CiAKKwlyZXQgPSAtRU5PTUVNOwogCXMtPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290KTsKIAlpZiAoIXMtPnNfcm9vdCkKIAkJZ290byBvdXRpcHV0OwpAQCAtMTczLDcgKzE3OCw3IEBACiBvdXQ6CiAJYnJlbHNlKGJoKTsKIG91dG5vYmg6Ci0JcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHJldDsKIH0KIAogLyogVGhhdCdzIHNpbXBsZSB0b28uICovCkBAIC0zODksOCArMzk0LDExIEBACiAJaWYgKChiZTMyX3RvX2NwdShyaS5uZXh0KSAmIFJPTUZIX1RZUEUpID09IFJPTUZIX0hSRCkKIAkJb2Zmc2V0ID0gYmUzMl90b19jcHUocmkuc3BlYykgJiBST01GSF9NQVNLOwogCi0JaWYgKChpbm9kZSA9IGlnZXQoZGlyLT5pX3NiLCBvZmZzZXQpKSkKLQkJZ290byBvdXRpOworCWlub2RlID0gcm9tZnNfaWdldChkaXItPmlfc2IsIG9mZnNldCk7CisJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJcmVzID0gUFRSX0VSUihpbm9kZSk7CisJCWdvdG8gb3V0OworCX0KIAogCS8qCiAJICogaXQncyBhIGJpdCBmdW5reSwgX2xvb2t1cCBuZWVkcyB0byByZXR1cm4gYW4gZXJyb3IgY29kZQpAQCAtNDAyLDcgKzQxMCw3IEBACiAJICovCiAKIG91dDA6CWlub2RlID0gTlVMTDsKLW91dGk6CXJlcyA9IDA7CisJcmVzID0gMDsKIAlkX2FkZCAoZGVudHJ5LCBpbm9kZSk7CiAKIG91dDoJdW5sb2NrX2tlcm5lbCgpOwpAQCAtNDc4LDIwICs0ODYsMjkgQEAKIAlTX0lGQkxLKzA2MDAsIFNfSUZDSFIrMDYwMCwgU19JRlNPQ0srMDY0NCwgU19JRklGTyswNjQ0CiB9OwogCi1zdGF0aWMgdm9pZAotcm9tZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmkpCitzdGF0aWMgc3RydWN0IGlub2RlICoKK3JvbWZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBpbm8pCiB7Ci0JaW50IG5leHRmaCwgaW5vOworCWludCBuZXh0Zmg7CiAJc3RydWN0IHJvbWZzX2lub2RlIHJpOworCXN0cnVjdCBpbm9kZSAqaTsKIAotCWlubyA9IGktPmlfaW5vICYgUk9NRkhfTUFTSzsKKwlpbm8gJj0gUk9NRkhfTUFTSzsKKwlpID0gaWdldF9sb2NrZWQoc2IsIGlubyk7CisJaWYgKCFpKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlpZiAoIShpLT5pX3N0YXRlICYgSV9ORVcpKQorCQlyZXR1cm4gaTsKKwogCWktPmlfbW9kZSA9IDA7CiAKIAkvKiBMb29wIGZvciBmaW5kaW5nIHRoZSByZWFsIGhhcmQgbGluayAqLwogCWZvcig7OykgewogCQlpZiAocm9tZnNfY29weWZyb20oaSwgJnJpLCBpbm8sIFJPTUZIX1NJWkUpIDw9IDApIHsKLQkJCXByaW50aygicm9tZnM6IHJlYWQgZXJyb3IgZm9yIGlub2RlIDB4JXhcbiIsIGlubyk7Ci0JCQlyZXR1cm47CisJCQlwcmludGsoS0VSTl9FUlIgInJvbWZzOiByZWFkIGVycm9yIGZvciBpbm9kZSAweCVseFxuIiwKKwkJCQlpbm8pOworCQkJaWdldF9mYWlsZWQoaSk7CisJCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIAkJfQogCQkvKiBYWFg6IGRvIHJvbWZzX2NoZWNrc3VtIGhlcmUgdG9vICh3aXRoIG5hbWUpICovCiAKQEAgLTU0OCw2ICs1NjUsOCBAQAogCQkJaW5pdF9zcGVjaWFsX2lub2RlKGksIGlubywKIAkJCQkJTUtERVYobmV4dGZoPj4xNixuZXh0ZmgmMHhmZmZmKSk7CiAJfQorCXVubG9ja19uZXdfaW5vZGUoaSk7CisJcmV0dXJuIGk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqIHJvbWZzX2lub2RlX2NhY2hlcDsKQEAgLTU5OSw3ICs2MTgsNiBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHJvbWZzX29wcyA9IHsKIAkuYWxsb2NfaW5vZGUJPSByb21mc19hbGxvY19pbm9kZSwKIAkuZGVzdHJveV9pbm9kZQk9IHJvbWZzX2Rlc3Ryb3lfaW5vZGUsCi0JLnJlYWRfaW5vZGUJPSByb21mc19yZWFkX2lub2RlLAogCS5zdGF0ZnMJCT0gcm9tZnNfc3RhdGZzLAogCS5yZW1vdW50X2ZzCT0gcm9tZnNfcmVtb3VudCwKIH07CmRpZmYgLS1naXQgYS9mcy9zcGxpY2UuYyBiL2ZzL3NwbGljZS5jCmluZGV4IDRlZTQ5ZTguLjE0ZTIyNjIgMTAwNjQ0Ci0tLSBhL2ZzL3NwbGljZS5jCisrKyBiL2ZzL3NwbGljZS5jCkBAIC0xMTc5LDYgKzExNzksOSBAQAogewogCWludCBwYXJ0aWFsOwogCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHNyYywgbikpCisJCXJldHVybiAtRUZBVUxUOworCiAJcGFnZWZhdWx0X2Rpc2FibGUoKTsKIAlwYXJ0aWFsID0gX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyhkc3QsIHNyYywgbik7CiAJcGFnZWZhdWx0X2VuYWJsZSgpOwpAQCAtMTM4Nyw2ICsxMzkwLDExIEBACiAJCQlicmVhazsKIAkJfQogCisJCWlmICh1bmxpa2VseSghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYmFzZSwgbGVuKSkpIHsKKwkJCWVycm9yID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKIAkJc2QubGVuID0gMDsKIAkJc2QudG90YWxfbGVuID0gbGVuOwogCQlzZC5mbGFncyA9IGZsYWdzOwpkaWZmIC0tZ2l0IGEvZnMvc3VwZXIuYyBiL2ZzL3N1cGVyLmMKaW5kZXggY2VhZjJlMy4uODg4MTFmNiAxMDA2NDQKLS0tIGEvZnMvc3VwZXIuYworKysgYi9mcy9zdXBlci5jCkBAIC0xMDUsNiArMTA1LDcgQEAKIHsKIAlzZWN1cml0eV9zYl9mcmVlKHMpOwogCWtmcmVlKHMtPnNfc3VidHlwZSk7CisJa2ZyZWUocy0+c19vcHRpb25zKTsKIAlrZnJlZShzKTsKIH0KIApAQCAtNjAzLDYgKzYwNCw3IEBACiAJCQltYXJrX2ZpbGVzX3JvKHNiKTsKIAkJZWxzZSBpZiAoIWZzX21heV9yZW1vdW50X3JvKHNiKSkKIAkJCXJldHVybiAtRUJVU1k7CisJCURRVU9UX09GRihzYik7CiAJfQogCiAJaWYgKHNiLT5zX29wLT5yZW1vdW50X2ZzKSB7CmRpZmYgLS1naXQgYS9mcy9zeXNmcy9ncm91cC5jIGIvZnMvc3lzZnMvZ3JvdXAuYwppbmRleCAwODcxYzNkLi40Nzc5MDQ5IDEwMDY0NAotLS0gYS9mcy9zeXNmcy9ncm91cC5jCisrKyBiL2ZzL3N5c2ZzL2dyb3VwLmMKQEAgLTc3LDcgKzc3LDEyIEBACiAKIAlpZiAoZ3JwLT5uYW1lKSB7CiAJCXNkID0gc3lzZnNfZ2V0X2RpcmVudChkaXJfc2QsIGdycC0+bmFtZSk7Ci0JCUJVR19PTighc2QpOworCQlpZiAoIXNkKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzeXNmcyBncm91cCAlcCBub3QgZm91bmQgZm9yICIKKwkJCQkia29iamVjdCAnJXMnXG4iLCBncnAsIGtvYmplY3RfbmFtZShrb2JqKSk7CisJCQlXQVJOX09OKCFzZCk7CisJCQlyZXR1cm47CisJCX0KIAl9IGVsc2UKIAkJc2QgPSBzeXNmc19nZXQoZGlyX3NkKTsKIApkaWZmIC0tZ2l0IGEvZnMvc3lzdi9pbm9kZS5jIGIvZnMvc3lzdi9pbm9kZS5jCmluZGV4IDgxZWM2YzUuLmM1ZDYwZGUgMTAwNjQ0Ci0tLSBhL2ZzL3N5c3YvaW5vZGUuYworKysgYi9mcy9zeXN2L2lub2RlLmMKQEAgLTE2OSwyMCArMTY5LDI3IEBACiAJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgcmRldik7CiB9CiAKLXN0YXRpYyB2b2lkIHN5c3ZfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQorc3RydWN0IGlub2RlICpzeXN2X2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGlubykKIHsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiA9IGlub2RlLT5pX3NiOwogCXN0cnVjdCBzeXN2X3NiX2luZm8gKiBzYmkgPSBTWVNWX1NCKHNiKTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKIAlzdHJ1Y3Qgc3lzdl9pbm9kZSAqIHJhd19pbm9kZTsKIAlzdHJ1Y3Qgc3lzdl9pbm9kZV9pbmZvICogc2k7Ci0JdW5zaWduZWQgaW50IGJsb2NrLCBpbm8gPSBpbm9kZS0+aV9pbm87CisJc3RydWN0IGlub2RlICppbm9kZTsKKwl1bnNpZ25lZCBpbnQgYmxvY2s7CiAKIAlpZiAoIWlubyB8fCBpbm8gPiBzYmktPnNfbmlub2RlcykgewogCQlwcmludGsoIkJhZCBpbm9kZSBudW1iZXIgb24gZGV2ICVzOiAlZCBpcyBvdXQgb2YgcmFuZ2VcbiIsCi0JCSAgICAgICBpbm9kZS0+aV9zYi0+c19pZCwgaW5vKTsKLQkJZ290byBiYWRfaW5vZGU7CisJCSAgICAgICBzYi0+c19pZCwgaW5vKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CiAJfQorCisJaW5vZGUgPSBpZ2V0X2xvY2tlZChzYiwgaW5vKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSkKKwkJcmV0dXJuIGlub2RlOworCiAJcmF3X2lub2RlID0gc3lzdl9yYXdfaW5vZGUoc2IsIGlubywgJmJoKTsKIAlpZiAoIXJhd19pbm9kZSkgewogCQlwcmludGsoIk1ham9yIHByb2JsZW06IHVuYWJsZSB0byByZWFkIGlub2RlIGZyb20gZGV2ICVzXG4iLApAQCAtMjE0LDExICsyMjEsMTIgQEAKIAkJCSAgICAgICBvbGRfZGVjb2RlX2RldihmczMyX3RvX2NwdShzYmksIHNpLT5pX2RhdGFbMF0pKSk7CiAJZWxzZQogCQlzeXN2X3NldF9pbm9kZShpbm9kZSwgMCk7Ci0JcmV0dXJuOworCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCXJldHVybiBpbm9kZTsKIAogYmFkX2lub2RlOgotCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKLQlyZXR1cm47CisJaWdldF9mYWlsZWQoaW5vZGUpOworCXJldHVybiBFUlJfUFRSKC1FSU8pOwogfQogCiBzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICogc3lzdl91cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpCkBAIC0zMjgsNyArMzM2LDYgQEAKIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHN5c3Zfc29wcyA9IHsKIAkuYWxsb2NfaW5vZGUJPSBzeXN2X2FsbG9jX2lub2RlLAogCS5kZXN0cm95X2lub2RlCT0gc3lzdl9kZXN0cm95X2lub2RlLAotCS5yZWFkX2lub2RlCT0gc3lzdl9yZWFkX2lub2RlLAogCS53cml0ZV9pbm9kZQk9IHN5c3Zfd3JpdGVfaW5vZGUsCiAJLmRlbGV0ZV9pbm9kZQk9IHN5c3ZfZGVsZXRlX2lub2RlLAogCS5wdXRfc3VwZXIJPSBzeXN2X3B1dF9zdXBlciwKZGlmZiAtLWdpdCBhL2ZzL3N5c3YvbmFtZWkuYyBiL2ZzL3N5c3YvbmFtZWkuYwppbmRleCA2YmQ4NTBiLi5hMWYxZWYzIDEwMDY0NAotLS0gYS9mcy9zeXN2L25hbWVpLmMKKysrIGIvZnMvc3lzdi9uYW1laS5jCkBAIC01Myw5ICs1Myw5IEBACiAJaW5vID0gc3lzdl9pbm9kZV9ieV9uYW1lKGRlbnRyeSk7CiAKIAlpZiAoaW5vKSB7Ci0JCWlub2RlID0gaWdldChkaXItPmlfc2IsIGlubyk7Ci0JCWlmICghaW5vZGUpCi0JCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKKwkJaW5vZGUgPSBzeXN2X2lnZXQoZGlyLT5pX3NiLCBpbm8pOworCQlpZiAoSVNfRVJSKGlub2RlKSkKKwkJCXJldHVybiBFUlJfQ0FTVChpbm9kZSk7CiAJfQogCWRfYWRkKGRlbnRyeSwgaW5vZGUpOwogCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvZnMvc3lzdi9zdXBlci5jIGIvZnMvc3lzdi9zdXBlci5jCmluZGV4IDZmOTcwN2EuLjVhOTAzZGEgMTAwNjQ0Ci0tLSBhL2ZzL3N5c3Yvc3VwZXIuYworKysgYi9mcy9zeXN2L3N1cGVyLmMKQEAgLTMzMiw4ICszMzIsOCBAQAogCXNiLT5zX21hZ2ljID0gU1lTVl9NQUdJQ19CQVNFICsgc2JpLT5zX3R5cGU7CiAJLyogc2V0IHVwIGVub3VnaCBzbyB0aGF0IGl0IGNhbiByZWFkIGFuIGlub2RlICovCiAJc2ItPnNfb3AgPSAmc3lzdl9zb3BzOwotCXJvb3RfaW5vZGUgPSBpZ2V0KHNiLFNZU1ZfUk9PVF9JTk8pOwotCWlmICghcm9vdF9pbm9kZSB8fCBpc19iYWRfaW5vZGUocm9vdF9pbm9kZSkpIHsKKwlyb290X2lub2RlID0gc3lzdl9pZ2V0KHNiLCBTWVNWX1JPT1RfSU5PKTsKKwlpZiAoSVNfRVJSKHJvb3RfaW5vZGUpKSB7CiAJCXByaW50aygiU3lzViBGUzogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvc3lzdi9zeXN2LmggYi9mcy9zeXN2L3N5c3YuaAppbmRleCA2NGMwM2JkLi40MmQ1MWQxIDEwMDY0NAotLS0gYS9mcy9zeXN2L3N5c3YuaAorKysgYi9mcy9zeXN2L3N5c3YuaApAQCAtMTQxLDYgKzE0MSw3IEBACiAJCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VwLCB2b2lkICoqZnNkYXRhKTsKIAogLyogaW5vZGUuYyAqLworZXh0ZXJuIHN0cnVjdCBpbm9kZSAqc3lzdl9pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIGludCBzeXN2X3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqLCBpbnQpOwogZXh0ZXJuIGludCBzeXN2X3N5bmNfaW5vZGUoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIGludCBzeXN2X3N5bmNfZmlsZShzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7CmRpZmYgLS1naXQgYS9mcy91ZGYvYmFsbG9jLmMgYi9mcy91ZGYvYmFsbG9jLmMKaW5kZXggYWIyNjE3Ni4uZDcyMWExYSAxMDA2NDQKLS0tIGEvZnMvdWRmL2JhbGxvYy5jCisrKyBiL2ZzL3VkZi9iYWxsb2MuYwpAQCAtMjgsMTUgKzI4LDE2IEBACiAjaW5jbHVkZSAidWRmX2kuaCIKICNpbmNsdWRlICJ1ZGZfc2IuaCIKIAotI2RlZmluZSB1ZGZfY2xlYXJfYml0KG5yLGFkZHIpIGV4dDJfY2xlYXJfYml0KG5yLGFkZHIpCi0jZGVmaW5lIHVkZl9zZXRfYml0KG5yLGFkZHIpIGV4dDJfc2V0X2JpdChucixhZGRyKQorI2RlZmluZSB1ZGZfY2xlYXJfYml0KG5yLCBhZGRyKSBleHQyX2NsZWFyX2JpdChuciwgYWRkcikKKyNkZWZpbmUgdWRmX3NldF9iaXQobnIsIGFkZHIpIGV4dDJfc2V0X2JpdChuciwgYWRkcikKICNkZWZpbmUgdWRmX3Rlc3RfYml0KG5yLCBhZGRyKSBleHQyX3Rlc3RfYml0KG5yLCBhZGRyKQogI2RlZmluZSB1ZGZfZmluZF9maXJzdF9vbmVfYml0KGFkZHIsIHNpemUpIGZpbmRfZmlyc3Rfb25lX2JpdChhZGRyLCBzaXplKQotI2RlZmluZSB1ZGZfZmluZF9uZXh0X29uZV9iaXQoYWRkciwgc2l6ZSwgb2Zmc2V0KSBmaW5kX25leHRfb25lX2JpdChhZGRyLCBzaXplLCBvZmZzZXQpCisjZGVmaW5lIHVkZl9maW5kX25leHRfb25lX2JpdChhZGRyLCBzaXplLCBvZmZzZXQpIFwKKwkJZmluZF9uZXh0X29uZV9iaXQoYWRkciwgc2l6ZSwgb2Zmc2V0KQogCiAjZGVmaW5lIGxlQlBMX3RvX2NwdXAoeCkgbGVOVU1fdG9fY3B1cChCSVRTX1BFUl9MT05HLCB4KQotI2RlZmluZSBsZU5VTV90b19jcHVwKHgseSkgeGxlTlVNX3RvX2NwdXAoeCx5KQotI2RlZmluZSB4bGVOVU1fdG9fY3B1cCh4LHkpIChsZSAjIyB4ICMjIF90b19jcHVwKHkpKQorI2RlZmluZSBsZU5VTV90b19jcHVwKHgsIHkpIHhsZU5VTV90b19jcHVwKHgsIHkpCisjZGVmaW5lIHhsZU5VTV90b19jcHVwKHgsIHkpIChsZSAjIyB4ICMjIF90b19jcHVwKHkpKQogI2RlZmluZSB1aW50QlBMX3QgdWludChCSVRTX1BFUl9MT05HKQogI2RlZmluZSB1aW50KHgpIHh1aW50KHgpCiAjZGVmaW5lIHh1aW50KHgpIF9fbGUgIyMgeApAQCAtNjIsNyArNjMsOCBAQAogCQlyZXN1bHQgKz0gQklUU19QRVJfTE9ORzsKIAl9CiAJd2hpbGUgKHNpemUgJiB+KEJJVFNfUEVSX0xPTkcgLSAxKSkgewotCQlpZiAoKHRtcCA9IGxlQlBMX3RvX2NwdXAocCsrKSkpCisJCXRtcCA9IGxlQlBMX3RvX2NwdXAocCsrKTsKKwkJaWYgKHRtcCkKIAkJCWdvdG8gZm91bmRfbWlkZGxlOwogCQlyZXN1bHQgKz0gQklUU19QRVJfTE9ORzsKIAkJc2l6ZSAtPSBCSVRTX1BFUl9MT05HOwpAQCAtODgsMTIgKzkwLDEyIEBACiAJa2VybmVsX2xiX2FkZHIgbG9jOwogCiAJbG9jLmxvZ2ljYWxCbG9ja051bSA9IGJpdG1hcC0+c19leHRQb3NpdGlvbjsKLQlsb2MucGFydGl0aW9uUmVmZXJlbmNlTnVtID0gVURGX1NCX1BBUlRJVElPTihzYik7CisJbG9jLnBhcnRpdGlvblJlZmVyZW5jZU51bSA9IFVERl9TQihzYiktPnNfcGFydGl0aW9uOwogCiAJYmggPSB1ZGZfdHJlYWQoc2IsIHVkZl9nZXRfbGJfcGJsb2NrKHNiLCBsb2MsIGJsb2NrKSk7Ci0JaWYgKCFiaCkgeworCWlmICghYmgpCiAJCXJldHZhbCA9IC1FSU87Ci0JfQorCiAJYml0bWFwLT5zX2Jsb2NrX2JpdG1hcFtiaXRtYXBfbnJdID0gYmg7CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTEzOCw2ICsxNDAsMjAgQEAKIAlyZXR1cm4gc2xvdDsKIH0KIAorc3RhdGljIGJvb2wgdWRmX2FkZF9mcmVlX3NwYWNlKHN0cnVjdCB1ZGZfc2JfaW5mbyAqc2JpLAorCQkJCXUxNiBwYXJ0aXRpb24sIHUzMiBjbnQpCit7CisJc3RydWN0IGxvZ2ljYWxWb2xJbnRlZ3JpdHlEZXNjICpsdmlkOworCisJaWYgKHNiaS0+c19sdmlkX2JoKQorCQlyZXR1cm4gZmFsc2U7CisKKwlsdmlkID0gKHN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzYyAqKXNiaS0+c19sdmlkX2JoLT5iX2RhdGE7CisJbHZpZC0+ZnJlZVNwYWNlVGFibGVbcGFydGl0aW9uXSA9IGNwdV90b19sZTMyKGxlMzJfdG9fY3B1KAorCQkJCQlsdmlkLT5mcmVlU3BhY2VUYWJsZVtwYXJ0aXRpb25dKSArIGNudCk7CisJcmV0dXJuIHRydWU7Cit9CisKIHN0YXRpYyB2b2lkIHVkZl9iaXRtYXBfZnJlZV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgIHN0cnVjdCB1ZGZfYml0bWFwICpiaXRtYXAsCkBAIC0xNTUsNTcgKzE3MSw1OCBAQAogCiAJbXV0ZXhfbG9jaygmc2JpLT5zX2FsbG9jX211dGV4KTsKIAlpZiAoYmxvYy5sb2dpY2FsQmxvY2tOdW0gPCAwIHx8Ci0JICAgIChibG9jLmxvZ2ljYWxCbG9ja051bSArIGNvdW50KSA+IFVERl9TQl9QQVJUTEVOKHNiLCBibG9jLnBhcnRpdGlvblJlZmVyZW5jZU51bSkpIHsKKwkgICAgKGJsb2MubG9naWNhbEJsb2NrTnVtICsgY291bnQpID4KKwkJc2JpLT5zX3BhcnRtYXBzW2Jsb2MucGFydGl0aW9uUmVmZXJlbmNlTnVtXS5zX3BhcnRpdGlvbl9sZW4pIHsKIAkJdWRmX2RlYnVnKCIlZCA8ICVkIHx8ICVkICsgJWQgPiAlZFxuIiwKIAkJCSAgYmxvYy5sb2dpY2FsQmxvY2tOdW0sIDAsIGJsb2MubG9naWNhbEJsb2NrTnVtLCBjb3VudCwKLQkJCSAgVURGX1NCX1BBUlRMRU4oc2IsIGJsb2MucGFydGl0aW9uUmVmZXJlbmNlTnVtKSk7CisJCQkgIHNiaS0+c19wYXJ0bWFwc1tibG9jLnBhcnRpdGlvblJlZmVyZW5jZU51bV0uCisJCQkJCQkJc19wYXJ0aXRpb25fbGVuKTsKIAkJZ290byBlcnJvcl9yZXR1cm47CiAJfQogCi0JYmxvY2sgPSBibG9jLmxvZ2ljYWxCbG9ja051bSArIG9mZnNldCArIChzaXplb2Yoc3RydWN0IHNwYWNlQml0bWFwRGVzYykgPDwgMyk7CisJYmxvY2sgPSBibG9jLmxvZ2ljYWxCbG9ja051bSArIG9mZnNldCArCisJCShzaXplb2Yoc3RydWN0IHNwYWNlQml0bWFwRGVzYykgPDwgMyk7CiAKLWRvX21vcmU6Ci0Jb3ZlcmZsb3cgPSAwOwotCWJsb2NrX2dyb3VwID0gYmxvY2sgPj4gKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzICsgMyk7Ci0JYml0ID0gYmxvY2sgJSAoc2ItPnNfYmxvY2tzaXplIDw8IDMpOworCWRvIHsKKwkJb3ZlcmZsb3cgPSAwOworCQlibG9ja19ncm91cCA9IGJsb2NrID4+IChzYi0+c19ibG9ja3NpemVfYml0cyArIDMpOworCQliaXQgPSBibG9jayAlIChzYi0+c19ibG9ja3NpemUgPDwgMyk7CiAKLQkvKgotCSAqIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgZnJlZWluZyBibG9ja3MgYWNyb3NzIGEgZ3JvdXAgYm91bmRhcnkuCi0JICovCi0JaWYgKGJpdCArIGNvdW50ID4gKHNiLT5zX2Jsb2Nrc2l6ZSA8PCAzKSkgewotCQlvdmVyZmxvdyA9IGJpdCArIGNvdW50IC0gKHNiLT5zX2Jsb2Nrc2l6ZSA8PCAzKTsKLQkJY291bnQgLT0gb3ZlcmZsb3c7Ci0JfQotCWJpdG1hcF9uciA9IGxvYWRfYmxvY2tfYml0bWFwKHNiLCBiaXRtYXAsIGJsb2NrX2dyb3VwKTsKLQlpZiAoYml0bWFwX25yIDwgMCkKLQkJZ290byBlcnJvcl9yZXR1cm47CisJCS8qCisJCSogQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBmcmVlaW5nIGJsb2NrcyBhY3Jvc3MgYSBncm91cCBib3VuZGFyeS4KKwkJKi8KKwkJaWYgKGJpdCArIGNvdW50ID4gKHNiLT5zX2Jsb2Nrc2l6ZSA8PCAzKSkgeworCQkJb3ZlcmZsb3cgPSBiaXQgKyBjb3VudCAtIChzYi0+c19ibG9ja3NpemUgPDwgMyk7CisJCQljb3VudCAtPSBvdmVyZmxvdzsKKwkJfQorCQliaXRtYXBfbnIgPSBsb2FkX2Jsb2NrX2JpdG1hcChzYiwgYml0bWFwLCBibG9ja19ncm91cCk7CisJCWlmIChiaXRtYXBfbnIgPCAwKQorCQkJZ290byBlcnJvcl9yZXR1cm47CiAKLQliaCA9IGJpdG1hcC0+c19ibG9ja19iaXRtYXBbYml0bWFwX25yXTsKLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQlpZiAodWRmX3NldF9iaXQoYml0ICsgaSwgYmgtPmJfZGF0YSkpIHsKLQkJCXVkZl9kZWJ1ZygiYml0ICVsZCBhbHJlYWR5IHNldFxuIiwgYml0ICsgaSk7Ci0JCQl1ZGZfZGVidWcoImJ5dGU9JTJ4XG4iLCAoKGNoYXIgKiliaC0+Yl9kYXRhKVsoYml0ICsgaSkgPj4gM10pOwotCQl9IGVsc2UgewotCQkJaWYgKGlub2RlKQotCQkJCURRVU9UX0ZSRUVfQkxPQ0soaW5vZGUsIDEpOwotCQkJaWYgKFVERl9TQl9MVklEQkgoc2IpKSB7Ci0JCQkJVURGX1NCX0xWSUQoc2IpLT5mcmVlU3BhY2VUYWJsZVtVREZfU0JfUEFSVElUSU9OKHNiKV0gPQotCQkJCQljcHVfdG9fbGUzMihsZTMyX3RvX2NwdShVREZfU0JfTFZJRChzYiktPmZyZWVTcGFjZVRhYmxlW1VERl9TQl9QQVJUSVRJT04oc2IpXSkgKyAxKTsKKwkJYmggPSBiaXRtYXAtPnNfYmxvY2tfYml0bWFwW2JpdG1hcF9ucl07CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlpZiAodWRmX3NldF9iaXQoYml0ICsgaSwgYmgtPmJfZGF0YSkpIHsKKwkJCQl1ZGZfZGVidWcoImJpdCAlbGQgYWxyZWFkeSBzZXRcbiIsIGJpdCArIGkpOworCQkJCXVkZl9kZWJ1ZygiYnl0ZT0lMnhcbiIsCisJCQkJCSgoY2hhciAqKWJoLT5iX2RhdGEpWyhiaXQgKyBpKSA+PiAzXSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChpbm9kZSkKKwkJCQkJRFFVT1RfRlJFRV9CTE9DSyhpbm9kZSwgMSk7CisJCQkJdWRmX2FkZF9mcmVlX3NwYWNlKHNiaSwgc2JpLT5zX3BhcnRpdGlvbiwgMSk7CiAJCQl9CiAJCX0KLQl9Ci0JbWFya19idWZmZXJfZGlydHkoYmgpOwotCWlmIChvdmVyZmxvdykgewotCQlibG9jayArPSBjb3VudDsKLQkJY291bnQgPSBvdmVyZmxvdzsKLQkJZ290byBkb19tb3JlOwotCX0KKwkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQlpZiAob3ZlcmZsb3cpIHsKKwkJCWJsb2NrICs9IGNvdW50OworCQkJY291bnQgPSBvdmVyZmxvdzsKKwkJfQorCX0gd2hpbGUgKG92ZXJmbG93KTsKKwogZXJyb3JfcmV0dXJuOgogCXNiLT5zX2RpcnQgPSAxOwotCWlmIChVREZfU0JfTFZJREJIKHNiKSkKLQkJbWFya19idWZmZXJfZGlydHkoVURGX1NCX0xWSURCSChzYikpOworCWlmIChzYmktPnNfbHZpZF9iaCkKKwkJbWFya19idWZmZXJfZGlydHkoc2JpLT5zX2x2aWRfYmgpOwogCW11dGV4X3VubG9jaygmc2JpLT5zX2FsbG9jX211dGV4KTsKLQlyZXR1cm47CiB9CiAKIHN0YXRpYyBpbnQgdWRmX2JpdG1hcF9wcmVhbGxvY19ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKQEAgLTIxOSw1MyArMjM2LDUwIEBACiAJaW50IGJpdCwgYmxvY2ssIGJsb2NrX2dyb3VwLCBncm91cF9zdGFydDsKIAlpbnQgbnJfZ3JvdXBzLCBiaXRtYXBfbnI7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlfX3UzMiBwYXJ0X2xlbjsKIAogCW11dGV4X2xvY2soJnNiaS0+c19hbGxvY19tdXRleCk7Ci0JaWYgKGZpcnN0X2Jsb2NrIDwgMCB8fCBmaXJzdF9ibG9jayA+PSBVREZfU0JfUEFSVExFTihzYiwgcGFydGl0aW9uKSkKKwlwYXJ0X2xlbiA9IHNiaS0+c19wYXJ0bWFwc1twYXJ0aXRpb25dLnNfcGFydGl0aW9uX2xlbjsKKwlpZiAoZmlyc3RfYmxvY2sgPCAwIHx8IGZpcnN0X2Jsb2NrID49IHBhcnRfbGVuKQogCQlnb3RvIG91dDsKIAotCWlmIChmaXJzdF9ibG9jayArIGJsb2NrX2NvdW50ID4gVURGX1NCX1BBUlRMRU4oc2IsIHBhcnRpdGlvbikpCi0JCWJsb2NrX2NvdW50ID0gVURGX1NCX1BBUlRMRU4oc2IsIHBhcnRpdGlvbikgLSBmaXJzdF9ibG9jazsKKwlpZiAoZmlyc3RfYmxvY2sgKyBibG9ja19jb3VudCA+IHBhcnRfbGVuKQorCQlibG9ja19jb3VudCA9IHBhcnRfbGVuIC0gZmlyc3RfYmxvY2s7CiAKLXJlcGVhdDoKLQlucl9ncm91cHMgPSAoVURGX1NCX1BBUlRMRU4oc2IsIHBhcnRpdGlvbikgKwotCQkgICAgIChzaXplb2Yoc3RydWN0IHNwYWNlQml0bWFwRGVzYykgPDwgMykgKwotCQkgICAgIChzYi0+c19ibG9ja3NpemUgKiA4KSAtIDEpIC8gKHNiLT5zX2Jsb2Nrc2l6ZSAqIDgpOwotCWJsb2NrID0gZmlyc3RfYmxvY2sgKyAoc2l6ZW9mKHN0cnVjdCBzcGFjZUJpdG1hcERlc2MpIDw8IDMpOwotCWJsb2NrX2dyb3VwID0gYmxvY2sgPj4gKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzICsgMyk7Ci0JZ3JvdXBfc3RhcnQgPSBibG9ja19ncm91cCA/IDAgOiBzaXplb2Yoc3RydWN0IHNwYWNlQml0bWFwRGVzYyk7CisJZG8geworCQlucl9ncm91cHMgPSB1ZGZfY29tcHV0ZV9ucl9ncm91cHMoc2IsIHBhcnRpdGlvbik7CisJCWJsb2NrID0gZmlyc3RfYmxvY2sgKyAoc2l6ZW9mKHN0cnVjdCBzcGFjZUJpdG1hcERlc2MpIDw8IDMpOworCQlibG9ja19ncm91cCA9IGJsb2NrID4+IChzYi0+c19ibG9ja3NpemVfYml0cyArIDMpOworCQlncm91cF9zdGFydCA9IGJsb2NrX2dyb3VwID8gMCA6IHNpemVvZihzdHJ1Y3Qgc3BhY2VCaXRtYXBEZXNjKTsKIAotCWJpdG1hcF9uciA9IGxvYWRfYmxvY2tfYml0bWFwKHNiLCBiaXRtYXAsIGJsb2NrX2dyb3VwKTsKLQlpZiAoYml0bWFwX25yIDwgMCkKLQkJZ290byBvdXQ7Ci0JYmggPSBiaXRtYXAtPnNfYmxvY2tfYml0bWFwW2JpdG1hcF9ucl07Ci0KLQliaXQgPSBibG9jayAlIChzYi0+c19ibG9ja3NpemUgPDwgMyk7Ci0KLQl3aGlsZSAoYml0IDwgKHNiLT5zX2Jsb2Nrc2l6ZSA8PCAzKSAmJiBibG9ja19jb3VudCA+IDApIHsKLQkJaWYgKCF1ZGZfdGVzdF9iaXQoYml0LCBiaC0+Yl9kYXRhKSkgeworCQliaXRtYXBfbnIgPSBsb2FkX2Jsb2NrX2JpdG1hcChzYiwgYml0bWFwLCBibG9ja19ncm91cCk7CisJCWlmIChiaXRtYXBfbnIgPCAwKQogCQkJZ290byBvdXQ7Ci0JCX0gZWxzZSBpZiAoRFFVT1RfUFJFQUxMT0NfQkxPQ0soaW5vZGUsIDEpKSB7Ci0JCQlnb3RvIG91dDsKLQkJfSBlbHNlIGlmICghdWRmX2NsZWFyX2JpdChiaXQsIGJoLT5iX2RhdGEpKSB7Ci0JCQl1ZGZfZGVidWcoImJpdCBhbHJlYWR5IGNsZWFyZWQgZm9yIGJsb2NrICVkXG4iLCBiaXQpOwotCQkJRFFVT1RfRlJFRV9CTE9DSyhpbm9kZSwgMSk7Ci0JCQlnb3RvIG91dDsKKwkJYmggPSBiaXRtYXAtPnNfYmxvY2tfYml0bWFwW2JpdG1hcF9ucl07CisKKwkJYml0ID0gYmxvY2sgJSAoc2ItPnNfYmxvY2tzaXplIDw8IDMpOworCisJCXdoaWxlIChiaXQgPCAoc2ItPnNfYmxvY2tzaXplIDw8IDMpICYmIGJsb2NrX2NvdW50ID4gMCkgeworCQkJaWYgKCF1ZGZfdGVzdF9iaXQoYml0LCBiaC0+Yl9kYXRhKSkKKwkJCQlnb3RvIG91dDsKKwkJCWVsc2UgaWYgKERRVU9UX1BSRUFMTE9DX0JMT0NLKGlub2RlLCAxKSkKKwkJCQlnb3RvIG91dDsKKwkJCWVsc2UgaWYgKCF1ZGZfY2xlYXJfYml0KGJpdCwgYmgtPmJfZGF0YSkpIHsKKwkJCQl1ZGZfZGVidWcoImJpdCBhbHJlYWR5IGNsZWFyZWQgZm9yIGJsb2NrICVkXG4iLCBiaXQpOworCQkJCURRVU9UX0ZSRUVfQkxPQ0soaW5vZGUsIDEpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJYmxvY2tfY291bnQtLTsKKwkJCWFsbG9jX2NvdW50Kys7CisJCQliaXQrKzsKKwkJCWJsb2NrKys7CiAJCX0KLQkJYmxvY2tfY291bnQtLTsKLQkJYWxsb2NfY291bnQrKzsKLQkJYml0Kys7Ci0JCWJsb2NrKys7Ci0JfQotCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKLQlpZiAoYmxvY2tfY291bnQgPiAwKQotCQlnb3RvIHJlcGVhdDsKKwkJbWFya19idWZmZXJfZGlydHkoYmgpOworCX0gd2hpbGUgKGJsb2NrX2NvdW50ID4gMCk7CisKIG91dDoKLQlpZiAoVURGX1NCX0xWSURCSChzYikpIHsKLQkJVURGX1NCX0xWSUQoc2IpLT5mcmVlU3BhY2VUYWJsZVtwYXJ0aXRpb25dID0KLQkJCWNwdV90b19sZTMyKGxlMzJfdG9fY3B1KFVERl9TQl9MVklEKHNiKS0+ZnJlZVNwYWNlVGFibGVbcGFydGl0aW9uXSkgLSBhbGxvY19jb3VudCk7Ci0JCW1hcmtfYnVmZmVyX2RpcnR5KFVERl9TQl9MVklEQkgoc2IpKTsKLQl9CisJaWYgKHVkZl9hZGRfZnJlZV9zcGFjZShzYmksIHBhcnRpdGlvbiwgLWFsbG9jX2NvdW50KSkKKwkJbWFya19idWZmZXJfZGlydHkoc2JpLT5zX2x2aWRfYmgpOwogCXNiLT5zX2RpcnQgPSAxOwogCW11dGV4X3VubG9jaygmc2JpLT5zX2FsbG9jX211dGV4KTsKIAlyZXR1cm4gYWxsb2NfY291bnQ7CkBAIC0yODcsNyArMzAxLDcgQEAKIAltdXRleF9sb2NrKCZzYmktPnNfYWxsb2NfbXV0ZXgpOwogCiByZXBlYXQ6Ci0JaWYgKGdvYWwgPCAwIHx8IGdvYWwgPj0gVURGX1NCX1BBUlRMRU4oc2IsIHBhcnRpdGlvbikpCisJaWYgKGdvYWwgPCAwIHx8IGdvYWwgPj0gc2JpLT5zX3BhcnRtYXBzW3BhcnRpdGlvbl0uc19wYXJ0aXRpb25fbGVuKQogCQlnb2FsID0gMDsKIAogCW5yX2dyb3VwcyA9IGJpdG1hcC0+c19ucl9ncm91cHM7CkBAIC0zMTIsMTQgKzMyNiwxNiBAQAogCQlpZiAoYml0IDwgZW5kX2dvYWwpCiAJCQlnb3RvIGdvdF9ibG9jazsKIAotCQlwdHIgPSBtZW1zY2FuKChjaGFyICopYmgtPmJfZGF0YSArIChiaXQgPj4gMyksIDB4RkYsIHNiLT5zX2Jsb2Nrc2l6ZSAtICgoYml0ICsgNykgPj4gMykpOworCQlwdHIgPSBtZW1zY2FuKChjaGFyICopYmgtPmJfZGF0YSArIChiaXQgPj4gMyksIDB4RkYsCisJCQkgICAgICBzYi0+c19ibG9ja3NpemUgLSAoKGJpdCArIDcpID4+IDMpKTsKIAkJbmV3Yml0ID0gKHB0ciAtICgoY2hhciAqKWJoLT5iX2RhdGEpKSA8PCAzOwogCQlpZiAobmV3Yml0IDwgc2ItPnNfYmxvY2tzaXplIDw8IDMpIHsKIAkJCWJpdCA9IG5ld2JpdDsKIAkJCWdvdG8gc2VhcmNoX2JhY2s7CiAJCX0KIAotCQluZXdiaXQgPSB1ZGZfZmluZF9uZXh0X29uZV9iaXQoYmgtPmJfZGF0YSwgc2ItPnNfYmxvY2tzaXplIDw8IDMsIGJpdCk7CisJCW5ld2JpdCA9IHVkZl9maW5kX25leHRfb25lX2JpdChiaC0+Yl9kYXRhLAorCQkJCQkgICAgICAgc2ItPnNfYmxvY2tzaXplIDw8IDMsIGJpdCk7CiAJCWlmIChuZXdiaXQgPCBzYi0+c19ibG9ja3NpemUgPDwgMykgewogCQkJYml0ID0gbmV3Yml0OwogCQkJZ290byBnb3RfYmxvY2s7CkBAIC0zNTgsMTUgKzM3NCwyMCBAQAogCWlmIChiaXQgPCBzYi0+c19ibG9ja3NpemUgPDwgMykKIAkJZ290byBzZWFyY2hfYmFjazsKIAllbHNlCi0JCWJpdCA9IHVkZl9maW5kX25leHRfb25lX2JpdChiaC0+Yl9kYXRhLCBzYi0+c19ibG9ja3NpemUgPDwgMywgZ3JvdXBfc3RhcnQgPDwgMyk7CisJCWJpdCA9IHVkZl9maW5kX25leHRfb25lX2JpdChiaC0+Yl9kYXRhLCBzYi0+c19ibG9ja3NpemUgPDwgMywKKwkJCQkJICAgIGdyb3VwX3N0YXJ0IDw8IDMpOwogCWlmIChiaXQgPj0gc2ItPnNfYmxvY2tzaXplIDw8IDMpIHsKIAkJbXV0ZXhfdW5sb2NrKCZzYmktPnNfYWxsb2NfbXV0ZXgpOwogCQlyZXR1cm4gMDsKIAl9CiAKIHNlYXJjaF9iYWNrOgotCWZvciAoaSA9IDA7IGkgPCA3ICYmIGJpdCA+IChncm91cF9zdGFydCA8PCAzKSAmJiB1ZGZfdGVzdF9iaXQoYml0IC0gMSwgYmgtPmJfZGF0YSk7IGkrKywgYml0LS0pCi0JCTsgLyogZW1wdHkgbG9vcCAqLworCWkgPSAwOworCXdoaWxlIChpIDwgNyAmJiBiaXQgPiAoZ3JvdXBfc3RhcnQgPDwgMykgJiYKKwkgICAgICAgdWRmX3Rlc3RfYml0KGJpdCAtIDEsIGJoLT5iX2RhdGEpKSB7CisJCSsraTsKKwkJLS1iaXQ7CisJfQogCiBnb3RfYmxvY2s6CiAKQEAgLTM4OSwxMSArNDEwLDggQEAKIAogCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKIAotCWlmIChVREZfU0JfTFZJREJIKHNiKSkgewotCQlVREZfU0JfTFZJRChzYiktPmZyZWVTcGFjZVRhYmxlW3BhcnRpdGlvbl0gPQotCQkJY3B1X3RvX2xlMzIobGUzMl90b19jcHUoVURGX1NCX0xWSUQoc2IpLT5mcmVlU3BhY2VUYWJsZVtwYXJ0aXRpb25dKSAtIDEpOwotCQltYXJrX2J1ZmZlcl9kaXJ0eShVREZfU0JfTFZJREJIKHNiKSk7Ci0JfQorCWlmICh1ZGZfYWRkX2ZyZWVfc3BhY2Uoc2JpLCBwYXJ0aXRpb24sIC0xKSkKKwkJbWFya19idWZmZXJfZGlydHkoc2JpLT5zX2x2aWRfYmgpOwogCXNiLT5zX2RpcnQgPSAxOwogCW11dGV4X3VubG9jaygmc2JpLT5zX2FsbG9jX211dGV4KTsKIAkqZXJyID0gMDsKQEAgLTQxOCw1NiArNDM2LDcwIEBACiAJc3RydWN0IGV4dGVudF9wb3NpdGlvbiBvZXBvcywgZXBvczsKIAlpbnQ4X3QgZXR5cGU7CiAJaW50IGk7CisJc3RydWN0IHVkZl9pbm9kZV9pbmZvICppaW5mbzsKIAogCW11dGV4X2xvY2soJnNiaS0+c19hbGxvY19tdXRleCk7CiAJaWYgKGJsb2MubG9naWNhbEJsb2NrTnVtIDwgMCB8fAotCSAgICAoYmxvYy5sb2dpY2FsQmxvY2tOdW0gKyBjb3VudCkgPiBVREZfU0JfUEFSVExFTihzYiwgYmxvYy5wYXJ0aXRpb25SZWZlcmVuY2VOdW0pKSB7CisJICAgIChibG9jLmxvZ2ljYWxCbG9ja051bSArIGNvdW50KSA+CisJCXNiaS0+c19wYXJ0bWFwc1tibG9jLnBhcnRpdGlvblJlZmVyZW5jZU51bV0uc19wYXJ0aXRpb25fbGVuKSB7CiAJCXVkZl9kZWJ1ZygiJWQgPCAlZCB8fCAlZCArICVkID4gJWRcbiIsCiAJCQkgIGJsb2MubG9naWNhbEJsb2NrTnVtLCAwLCBibG9jLmxvZ2ljYWxCbG9ja051bSwgY291bnQsCi0JCQkgIFVERl9TQl9QQVJUTEVOKHNiLCBibG9jLnBhcnRpdGlvblJlZmVyZW5jZU51bSkpOworCQkJICBzYmktPnNfcGFydG1hcHNbYmxvYy5wYXJ0aXRpb25SZWZlcmVuY2VOdW1dLgorCQkJCQkJCXNfcGFydGl0aW9uX2xlbik7CiAJCWdvdG8gZXJyb3JfcmV0dXJuOwogCX0KIAotCS8qIFdlIGRvIHRoaXMgdXAgZnJvbnQgLSBUaGVyZSBhcmUgc29tZSBlcnJvciBjb25kaXRpb25zIHRoYXQgY291bGQgb2NjdXJlLAotCSAgIGJ1dC4uIG9oIHdlbGwgKi8KKwlpaW5mbyA9IFVERl9JKHRhYmxlKTsKKwkvKiBXZSBkbyB0aGlzIHVwIGZyb250IC0gVGhlcmUgYXJlIHNvbWUgZXJyb3IgY29uZGl0aW9ucyB0aGF0CisJICAgY291bGQgb2NjdXJlLCBidXQuLiBvaCB3ZWxsICovCiAJaWYgKGlub2RlKQogCQlEUVVPVF9GUkVFX0JMT0NLKGlub2RlLCBjb3VudCk7Ci0JaWYgKFVERl9TQl9MVklEQkgoc2IpKSB7Ci0JCVVERl9TQl9MVklEKHNiKS0+ZnJlZVNwYWNlVGFibGVbVURGX1NCX1BBUlRJVElPTihzYildID0KLQkJCWNwdV90b19sZTMyKGxlMzJfdG9fY3B1KFVERl9TQl9MVklEKHNiKS0+ZnJlZVNwYWNlVGFibGVbVURGX1NCX1BBUlRJVElPTihzYildKSArIGNvdW50KTsKLQkJbWFya19idWZmZXJfZGlydHkoVURGX1NCX0xWSURCSChzYikpOwotCX0KKwlpZiAodWRmX2FkZF9mcmVlX3NwYWNlKHNiaSwgc2JpLT5zX3BhcnRpdGlvbiwgY291bnQpKQorCQltYXJrX2J1ZmZlcl9kaXJ0eShzYmktPnNfbHZpZF9iaCk7CiAKIAlzdGFydCA9IGJsb2MubG9naWNhbEJsb2NrTnVtICsgb2Zmc2V0OwogCWVuZCA9IGJsb2MubG9naWNhbEJsb2NrTnVtICsgb2Zmc2V0ICsgY291bnQgLSAxOwogCiAJZXBvcy5vZmZzZXQgPSBvZXBvcy5vZmZzZXQgPSBzaXplb2Yoc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5KTsKIAllbGVuID0gMDsKLQllcG9zLmJsb2NrID0gb2Vwb3MuYmxvY2sgPSBVREZfSV9MT0NBVElPTih0YWJsZSk7CisJZXBvcy5ibG9jayA9IG9lcG9zLmJsb2NrID0gaWluZm8tPmlfbG9jYXRpb247CiAJZXBvcy5iaCA9IG9lcG9zLmJoID0gTlVMTDsKIAogCXdoaWxlIChjb3VudCAmJgogCSAgICAgICAoZXR5cGUgPSB1ZGZfbmV4dF9hZXh0KHRhYmxlLCAmZXBvcywgJmVsb2MsICZlbGVuLCAxKSkgIT0gLTEpIHsKLQkJaWYgKCgoZWxvYy5sb2dpY2FsQmxvY2tOdW0gKyAoZWxlbiA+PiBzYi0+c19ibG9ja3NpemVfYml0cykpID09IHN0YXJ0KSkgewotCQkJaWYgKCgweDNGRkZGRkZGIC0gZWxlbikgPCAoY291bnQgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHMpKSB7Ci0JCQkJY291bnQgLT0gKCgweDNGRkZGRkZGIC0gZWxlbikgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHMpOwotCQkJCXN0YXJ0ICs9ICgoMHgzRkZGRkZGRiAtIGVsZW4pID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKLQkJCQllbGVuID0gKGV0eXBlIDw8IDMwKSB8ICgweDQwMDAwMDAwIC0gc2ItPnNfYmxvY2tzaXplKTsKKwkJaWYgKCgoZWxvYy5sb2dpY2FsQmxvY2tOdW0gKworCQkJKGVsZW4gPj4gc2ItPnNfYmxvY2tzaXplX2JpdHMpKSA9PSBzdGFydCkpIHsKKwkJCWlmICgoMHgzRkZGRkZGRiAtIGVsZW4pIDwKKwkJCQkJKGNvdW50IDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSkgeworCQkJCXVpbnQzMl90IHRtcCA9ICgoMHgzRkZGRkZGRiAtIGVsZW4pID4+CisJCQkJCQkJc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQkJCWNvdW50IC09IHRtcDsKKwkJCQlzdGFydCArPSB0bXA7CisJCQkJZWxlbiA9IChldHlwZSA8PCAzMCkgfAorCQkJCQkoMHg0MDAwMDAwMCAtIHNiLT5zX2Jsb2Nrc2l6ZSk7CiAJCQl9IGVsc2UgewotCQkJCWVsZW4gPSAoZXR5cGUgPDwgMzApIHwgKGVsZW4gKyAoY291bnQgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHMpKTsKKwkJCQllbGVuID0gKGV0eXBlIDw8IDMwKSB8CisJCQkJCShlbGVuICsKKwkJCQkJKGNvdW50IDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSk7CiAJCQkJc3RhcnQgKz0gY291bnQ7CiAJCQkJY291bnQgPSAwOwogCQkJfQogCQkJdWRmX3dyaXRlX2FleHQodGFibGUsICZvZXBvcywgZWxvYywgZWxlbiwgMSk7CiAJCX0gZWxzZSBpZiAoZWxvYy5sb2dpY2FsQmxvY2tOdW0gPT0gKGVuZCArIDEpKSB7Ci0JCQlpZiAoKDB4M0ZGRkZGRkYgLSBlbGVuKSA8IChjb3VudCA8PCBzYi0+c19ibG9ja3NpemVfYml0cykpIHsKLQkJCQljb3VudCAtPSAoKDB4M0ZGRkZGRkYgLSBlbGVuKSA+PiBzYi0+c19ibG9ja3NpemVfYml0cyk7Ci0JCQkJZW5kIC09ICgoMHgzRkZGRkZGRiAtIGVsZW4pID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKLQkJCQllbG9jLmxvZ2ljYWxCbG9ja051bSAtPSAoKDB4M0ZGRkZGRkYgLSBlbGVuKSA+PiBzYi0+c19ibG9ja3NpemVfYml0cyk7Ci0JCQkJZWxlbiA9IChldHlwZSA8PCAzMCkgfCAoMHg0MDAwMDAwMCAtIHNiLT5zX2Jsb2Nrc2l6ZSk7CisJCQlpZiAoKDB4M0ZGRkZGRkYgLSBlbGVuKSA8CisJCQkJCShjb3VudCA8PCBzYi0+c19ibG9ja3NpemVfYml0cykpIHsKKwkJCQl1aW50MzJfdCB0bXAgPSAoKDB4M0ZGRkZGRkYgLSBlbGVuKSA+PgorCQkJCQkJc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQkJCWNvdW50IC09IHRtcDsKKwkJCQllbmQgLT0gdG1wOworCQkJCWVsb2MubG9naWNhbEJsb2NrTnVtIC09IHRtcDsKKwkJCQllbGVuID0gKGV0eXBlIDw8IDMwKSB8CisJCQkJCSgweDQwMDAwMDAwIC0gc2ItPnNfYmxvY2tzaXplKTsKIAkJCX0gZWxzZSB7CiAJCQkJZWxvYy5sb2dpY2FsQmxvY2tOdW0gPSBzdGFydDsKLQkJCQllbGVuID0gKGV0eXBlIDw8IDMwKSB8IChlbGVuICsgKGNvdW50IDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSk7CisJCQkJZWxlbiA9IChldHlwZSA8PCAzMCkgfAorCQkJCQkoZWxlbiArCisJCQkJCShjb3VudCA8PCBzYi0+c19ibG9ja3NpemVfYml0cykpOwogCQkJCWVuZCAtPSBjb3VudDsKIAkJCQljb3VudCA9IDA7CiAJCQl9CkBAIC00ODgsOSArNTIwLDkgQEAKIAogCWlmIChjb3VudCkgewogCQkvKgotCQkgKiBOT1RFOiB3ZSBDQU5OT1QgdXNlIHVkZl9hZGRfYWV4dCBoZXJlLCBhcyBpdCBjYW4gdHJ5IHRvIGFsbG9jYXRlCi0JCSAqIGEgbmV3IGJsb2NrLCBhbmQgc2luY2Ugd2UgaG9sZCB0aGUgc3VwZXIgYmxvY2sgbG9jayBhbHJlYWR5Ci0JCSAqIHZlcnkgYmFkIHRoaW5ncyB3b3VsZCBoYXBwZW4gOikKKwkJICogTk9URTogd2UgQ0FOTk9UIHVzZSB1ZGZfYWRkX2FleHQgaGVyZSwgYXMgaXQgY2FuIHRyeSB0bworCQkgKiBhbGxvY2F0ZSBhIG5ldyBibG9jaywgYW5kIHNpbmNlIHdlIGhvbGQgdGhlIHN1cGVyIGJsb2NrCisJCSAqIGxvY2sgYWxyZWFkeSB2ZXJ5IGJhZCB0aGluZ3Mgd291bGQgaGFwcGVuIDopCiAJCSAqCiAJCSAqIFdlIGNvcHkgdGhlIGJlaGF2aW9yIG9mIHVkZl9hZGRfYWV4dCwgYnV0IGluc3RlYWQgb2YKIAkJICogdHJ5aW5nIHRvIGFsbG9jYXRlIGEgbmV3IGJsb2NrIGNsb3NlIHRvIHRoZSBleGlzdGluZyBvbmUsCkBAIC01MDksMTEgKzU0MSwxMSBAQAogCQllbGVuID0gRVhUX1JFQ09SREVEX0FMTE9DQVRFRCB8CiAJCQkoY291bnQgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHMpOwogCi0JCWlmIChVREZfSV9BTExPQ1RZUEUodGFibGUpID09IElDQlRBR19GTEFHX0FEX1NIT1JUKSB7CisJCWlmIChpaW5mby0+aV9hbGxvY190eXBlID09IElDQlRBR19GTEFHX0FEX1NIT1JUKQogCQkJYWRzaXplID0gc2l6ZW9mKHNob3J0X2FkKTsKLQkJfSBlbHNlIGlmIChVREZfSV9BTExPQ1RZUEUodGFibGUpID09IElDQlRBR19GTEFHX0FEX0xPTkcpIHsKKwkJZWxzZSBpZiAoaWluZm8tPmlfYWxsb2NfdHlwZSA9PSBJQ0JUQUdfRkxBR19BRF9MT05HKQogCQkJYWRzaXplID0gc2l6ZW9mKGxvbmdfYWQpOwotCQl9IGVsc2UgeworCQllbHNlIHsKIAkJCWJyZWxzZShvZXBvcy5iaCk7CiAJCQlicmVsc2UoZXBvcy5iaCk7CiAJCQlnb3RvIGVycm9yX3JldHVybjsKQEAgLTUzMSw1NiArNTYzLDcwIEBACiAJCQllbG9jLmxvZ2ljYWxCbG9ja051bSsrOwogCQkJZWxlbiAtPSBzYi0+c19ibG9ja3NpemU7CiAKLQkJCWlmICghKGVwb3MuYmggPSB1ZGZfdHJlYWQoc2IsIHVkZl9nZXRfbGJfcGJsb2NrKHNiLCBlcG9zLmJsb2NrLCAwKSkpKSB7CisJCQllcG9zLmJoID0gdWRmX3RyZWFkKHNiLAorCQkJCQl1ZGZfZ2V0X2xiX3BibG9jayhzYiwgZXBvcy5ibG9jaywgMCkpOworCQkJaWYgKCFlcG9zLmJoKSB7CiAJCQkJYnJlbHNlKG9lcG9zLmJoKTsKIAkJCQlnb3RvIGVycm9yX3JldHVybjsKIAkJCX0KIAkJCWFlZCA9IChzdHJ1Y3QgYWxsb2NFeHREZXNjICopKGVwb3MuYmgtPmJfZGF0YSk7Ci0JCQlhZWQtPnByZXZpb3VzQWxsb2NFeHRMb2NhdGlvbiA9IGNwdV90b19sZTMyKG9lcG9zLmJsb2NrLmxvZ2ljYWxCbG9ja051bSk7CisJCQlhZWQtPnByZXZpb3VzQWxsb2NFeHRMb2NhdGlvbiA9CisJCQkJY3B1X3RvX2xlMzIob2Vwb3MuYmxvY2subG9naWNhbEJsb2NrTnVtKTsKIAkJCWlmIChlcG9zLm9mZnNldCArIGFkc2l6ZSA+IHNiLT5zX2Jsb2Nrc2l6ZSkgewogCQkJCWxvZmZzZXQgPSBlcG9zLm9mZnNldDsKIAkJCQlhZWQtPmxlbmd0aEFsbG9jRGVzY3MgPSBjcHVfdG9fbGUzMihhZHNpemUpOwotCQkJCXNwdHIgPSBVREZfSV9EQVRBKHRhYmxlKSArIGVwb3Mub2Zmc2V0IC0gYWRzaXplOwotCQkJCWRwdHIgPSBlcG9zLmJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYyk7CisJCQkJc3B0ciA9IGlpbmZvLT5pX2V4dC5pX2RhdGEgKyBlcG9zLm9mZnNldAorCQkJCQkJCQktIGFkc2l6ZTsKKwkJCQlkcHRyID0gZXBvcy5iaC0+Yl9kYXRhICsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpOwogCQkJCW1lbWNweShkcHRyLCBzcHRyLCBhZHNpemUpOwotCQkJCWVwb3Mub2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpICsgYWRzaXplOworCQkJCWVwb3Mub2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpICsKKwkJCQkJCWFkc2l6ZTsKIAkJCX0gZWxzZSB7CiAJCQkJbG9mZnNldCA9IGVwb3Mub2Zmc2V0ICsgYWRzaXplOwogCQkJCWFlZC0+bGVuZ3RoQWxsb2NEZXNjcyA9IGNwdV90b19sZTMyKDApOwogCQkJCWlmIChvZXBvcy5iaCkgewogCQkJCQlzcHRyID0gb2Vwb3MuYmgtPmJfZGF0YSArIGVwb3Mub2Zmc2V0OwotCQkJCQlhZWQgPSAoc3RydWN0IGFsbG9jRXh0RGVzYyAqKW9lcG9zLmJoLT5iX2RhdGE7CisJCQkJCWFlZCA9IChzdHJ1Y3QgYWxsb2NFeHREZXNjICopCisJCQkJCQlvZXBvcy5iaC0+Yl9kYXRhOwogCQkJCQlhZWQtPmxlbmd0aEFsbG9jRGVzY3MgPQotCQkJCQkJY3B1X3RvX2xlMzIobGUzMl90b19jcHUoYWVkLT5sZW5ndGhBbGxvY0Rlc2NzKSArIGFkc2l6ZSk7CisJCQkJCQljcHVfdG9fbGUzMihsZTMyX3RvX2NwdSgKKwkJCQkJCQlhZWQtPmxlbmd0aEFsbG9jRGVzY3MpICsKKwkJCQkJCQkJYWRzaXplKTsKIAkJCQl9IGVsc2UgewotCQkJCQlzcHRyID0gVURGX0lfREFUQSh0YWJsZSkgKyBlcG9zLm9mZnNldDsKLQkJCQkJVURGX0lfTEVOQUxMT0ModGFibGUpICs9IGFkc2l6ZTsKKwkJCQkJc3B0ciA9IGlpbmZvLT5pX2V4dC5pX2RhdGEgKworCQkJCQkJCQllcG9zLm9mZnNldDsKKwkJCQkJaWluZm8tPmlfbGVuQWxsb2MgKz0gYWRzaXplOwogCQkJCQltYXJrX2lub2RlX2RpcnR5KHRhYmxlKTsKIAkJCQl9CiAJCQkJZXBvcy5vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYyk7CiAJCQl9Ci0JCQlpZiAoVURGX1NCX1VERlJFVihzYikgPj0gMHgwMjAwKQotCQkJCXVkZl9uZXdfdGFnKGVwb3MuYmgtPmJfZGF0YSwgVEFHX0lERU5UX0FFRCwgMywgMSwKLQkJCQkJICAgIGVwb3MuYmxvY2subG9naWNhbEJsb2NrTnVtLCBzaXplb2YodGFnKSk7CisJCQlpZiAoc2JpLT5zX3VkZnJldiA+PSAweDAyMDApCisJCQkJdWRmX25ld190YWcoZXBvcy5iaC0+Yl9kYXRhLCBUQUdfSURFTlRfQUVELAorCQkJCQkgICAgMywgMSwgZXBvcy5ibG9jay5sb2dpY2FsQmxvY2tOdW0sCisJCQkJCSAgICBzaXplb2YodGFnKSk7CiAJCQllbHNlCi0JCQkJdWRmX25ld190YWcoZXBvcy5iaC0+Yl9kYXRhLCBUQUdfSURFTlRfQUVELCAyLCAxLAotCQkJCQkgICAgZXBvcy5ibG9jay5sb2dpY2FsQmxvY2tOdW0sIHNpemVvZih0YWcpKTsKKwkJCQl1ZGZfbmV3X3RhZyhlcG9zLmJoLT5iX2RhdGEsIFRBR19JREVOVF9BRUQsCisJCQkJCSAgICAyLCAxLCBlcG9zLmJsb2NrLmxvZ2ljYWxCbG9ja051bSwKKwkJCQkJICAgIHNpemVvZih0YWcpKTsKIAotCQkJc3dpdGNoIChVREZfSV9BTExPQ1RZUEUodGFibGUpKSB7Ci0JCQkJY2FzZSBJQ0JUQUdfRkxBR19BRF9TSE9SVDoKLQkJCQkJc2FkID0gKHNob3J0X2FkICopc3B0cjsKLQkJCQkJc2FkLT5leHRMZW5ndGggPSBjcHVfdG9fbGUzMigKLQkJCQkJCUVYVF9ORVhUX0VYVEVOVF9BTExPQ0RFQ1MgfAotCQkJCQkJc2ItPnNfYmxvY2tzaXplKTsKLQkJCQkJc2FkLT5leHRQb3NpdGlvbiA9IGNwdV90b19sZTMyKGVwb3MuYmxvY2subG9naWNhbEJsb2NrTnVtKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ0JUQUdfRkxBR19BRF9MT05HOgotCQkJCQlsYWQgPSAobG9uZ19hZCAqKXNwdHI7Ci0JCQkJCWxhZC0+ZXh0TGVuZ3RoID0gY3B1X3RvX2xlMzIoCi0JCQkJCQlFWFRfTkVYVF9FWFRFTlRfQUxMT0NERUNTIHwKLQkJCQkJCXNiLT5zX2Jsb2Nrc2l6ZSk7Ci0JCQkJCWxhZC0+ZXh0TG9jYXRpb24gPSBjcHVfdG9fbGVsYihlcG9zLmJsb2NrKTsKLQkJCQkJYnJlYWs7CisJCQlzd2l0Y2ggKGlpbmZvLT5pX2FsbG9jX3R5cGUpIHsKKwkJCWNhc2UgSUNCVEFHX0ZMQUdfQURfU0hPUlQ6CisJCQkJc2FkID0gKHNob3J0X2FkICopc3B0cjsKKwkJCQlzYWQtPmV4dExlbmd0aCA9IGNwdV90b19sZTMyKAorCQkJCQlFWFRfTkVYVF9FWFRFTlRfQUxMT0NERUNTIHwKKwkJCQkJc2ItPnNfYmxvY2tzaXplKTsKKwkJCQlzYWQtPmV4dFBvc2l0aW9uID0KKwkJCQkJY3B1X3RvX2xlMzIoZXBvcy5ibG9jay5sb2dpY2FsQmxvY2tOdW0pOworCQkJCWJyZWFrOworCQkJY2FzZSBJQ0JUQUdfRkxBR19BRF9MT05HOgorCQkJCWxhZCA9IChsb25nX2FkICopc3B0cjsKKwkJCQlsYWQtPmV4dExlbmd0aCA9IGNwdV90b19sZTMyKAorCQkJCQlFWFRfTkVYVF9FWFRFTlRfQUxMT0NERUNTIHwKKwkJCQkJc2ItPnNfYmxvY2tzaXplKTsKKwkJCQlsYWQtPmV4dExvY2F0aW9uID0KKwkJCQkJY3B1X3RvX2xlbGIoZXBvcy5ibG9jayk7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAob2Vwb3MuYmgpIHsKIAkJCQl1ZGZfdXBkYXRlX3RhZyhvZXBvcy5iaC0+Yl9kYXRhLCBsb2Zmc2V0KTsKQEAgLTU5MCwxNiArNjM2LDE4IEBACiAJCQl9CiAJCX0KIAotCQlpZiAoZWxlbikgeyAvKiBJdCdzIHBvc3NpYmxlIHRoYXQgc3RlYWxpbmcgdGhlIGJsb2NrIGVtcHRpZWQgdGhlIGV4dGVudCAqLworCQkvKiBJdCdzIHBvc3NpYmxlIHRoYXQgc3RlYWxpbmcgdGhlIGJsb2NrIGVtcHRpZWQgdGhlIGV4dGVudCAqLworCQlpZiAoZWxlbikgewogCQkJdWRmX3dyaXRlX2FleHQodGFibGUsICZlcG9zLCBlbG9jLCBlbGVuLCAxKTsKIAogCQkJaWYgKCFlcG9zLmJoKSB7Ci0JCQkJVURGX0lfTEVOQUxMT0ModGFibGUpICs9IGFkc2l6ZTsKKwkJCQlpaW5mby0+aV9sZW5BbGxvYyArPSBhZHNpemU7CiAJCQkJbWFya19pbm9kZV9kaXJ0eSh0YWJsZSk7CiAJCQl9IGVsc2UgewogCQkJCWFlZCA9IChzdHJ1Y3QgYWxsb2NFeHREZXNjICopZXBvcy5iaC0+Yl9kYXRhOwogCQkJCWFlZC0+bGVuZ3RoQWxsb2NEZXNjcyA9Ci0JCQkJCWNwdV90b19sZTMyKGxlMzJfdG9fY3B1KGFlZC0+bGVuZ3RoQWxsb2NEZXNjcykgKyBhZHNpemUpOworCQkJCQljcHVfdG9fbGUzMihsZTMyX3RvX2NwdSgKKwkJCQkJICAgIGFlZC0+bGVuZ3RoQWxsb2NEZXNjcykgKyBhZHNpemUpOwogCQkJCXVkZl91cGRhdGVfdGFnKGVwb3MuYmgtPmJfZGF0YSwgZXBvcy5vZmZzZXQpOwogCQkJCW1hcmtfYnVmZmVyX2RpcnR5KGVwb3MuYmgpOwogCQkJfQpAQCAtNjI2LDIwICs2NzQsMjMgQEAKIAlrZXJuZWxfbGJfYWRkciBlbG9jOwogCXN0cnVjdCBleHRlbnRfcG9zaXRpb24gZXBvczsKIAlpbnQ4X3QgZXR5cGUgPSAtMTsKKwlzdHJ1Y3QgdWRmX2lub2RlX2luZm8gKmlpbmZvOwogCi0JaWYgKGZpcnN0X2Jsb2NrIDwgMCB8fCBmaXJzdF9ibG9jayA+PSBVREZfU0JfUEFSVExFTihzYiwgcGFydGl0aW9uKSkKKwlpZiAoZmlyc3RfYmxvY2sgPCAwIHx8CisJCWZpcnN0X2Jsb2NrID49IHNiaS0+c19wYXJ0bWFwc1twYXJ0aXRpb25dLnNfcGFydGl0aW9uX2xlbikKIAkJcmV0dXJuIDA7CiAKLQlpZiAoVURGX0lfQUxMT0NUWVBFKHRhYmxlKSA9PSBJQ0JUQUdfRkxBR19BRF9TSE9SVCkKKwlpaW5mbyA9IFVERl9JKHRhYmxlKTsKKwlpZiAoaWluZm8tPmlfYWxsb2NfdHlwZSA9PSBJQ0JUQUdfRkxBR19BRF9TSE9SVCkKIAkJYWRzaXplID0gc2l6ZW9mKHNob3J0X2FkKTsKLQllbHNlIGlmIChVREZfSV9BTExPQ1RZUEUodGFibGUpID09IElDQlRBR19GTEFHX0FEX0xPTkcpCisJZWxzZSBpZiAoaWluZm8tPmlfYWxsb2NfdHlwZSA9PSBJQ0JUQUdfRkxBR19BRF9MT05HKQogCQlhZHNpemUgPSBzaXplb2YobG9uZ19hZCk7CiAJZWxzZQogCQlyZXR1cm4gMDsKIAogCW11dGV4X2xvY2soJnNiaS0+c19hbGxvY19tdXRleCk7CiAJZXBvcy5vZmZzZXQgPSBzaXplb2Yoc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5KTsKLQllcG9zLmJsb2NrID0gVURGX0lfTE9DQVRJT04odGFibGUpOworCWVwb3MuYmxvY2sgPSBpaW5mby0+aV9sb2NhdGlvbjsKIAllcG9zLmJoID0gTlVMTDsKIAllbG9jLmxvZ2ljYWxCbG9ja051bSA9IDB4RkZGRkZGRkY7CiAKQEAgLTY1NCwyNiArNzA1LDI2IEBACiAJCWVwb3Mub2Zmc2V0IC09IGFkc2l6ZTsKIAogCQlhbGxvY19jb3VudCA9IChlbGVuID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKLQkJaWYgKGlub2RlICYmIERRVU9UX1BSRUFMTE9DX0JMT0NLKGlub2RlLCBhbGxvY19jb3VudCA+IGJsb2NrX2NvdW50ID8gYmxvY2tfY291bnQgOiBhbGxvY19jb3VudCkpIHsKKwkJaWYgKGlub2RlICYmIERRVU9UX1BSRUFMTE9DX0JMT0NLKGlub2RlLAorCQkJYWxsb2NfY291bnQgPiBibG9ja19jb3VudCA/IGJsb2NrX2NvdW50IDogYWxsb2NfY291bnQpKQogCQkJYWxsb2NfY291bnQgPSAwOwotCQl9IGVsc2UgaWYgKGFsbG9jX2NvdW50ID4gYmxvY2tfY291bnQpIHsKKwkJZWxzZSBpZiAoYWxsb2NfY291bnQgPiBibG9ja19jb3VudCkgewogCQkJYWxsb2NfY291bnQgPSBibG9ja19jb3VudDsKIAkJCWVsb2MubG9naWNhbEJsb2NrTnVtICs9IGFsbG9jX2NvdW50OwogCQkJZWxlbiAtPSAoYWxsb2NfY291bnQgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHMpOwotCQkJdWRmX3dyaXRlX2FleHQodGFibGUsICZlcG9zLCBlbG9jLCAoZXR5cGUgPDwgMzApIHwgZWxlbiwgMSk7Ci0JCX0gZWxzZSB7Ci0JCQl1ZGZfZGVsZXRlX2FleHQodGFibGUsIGVwb3MsIGVsb2MsIChldHlwZSA8PCAzMCkgfCBlbGVuKTsKLQkJfQorCQkJdWRmX3dyaXRlX2FleHQodGFibGUsICZlcG9zLCBlbG9jLAorCQkJCQkoZXR5cGUgPDwgMzApIHwgZWxlbiwgMSk7CisJCX0gZWxzZQorCQkJdWRmX2RlbGV0ZV9hZXh0KHRhYmxlLCBlcG9zLCBlbG9jLAorCQkJCQkoZXR5cGUgPDwgMzApIHwgZWxlbik7CiAJfSBlbHNlIHsKIAkJYWxsb2NfY291bnQgPSAwOwogCX0KIAogCWJyZWxzZShlcG9zLmJoKTsKIAotCWlmIChhbGxvY19jb3VudCAmJiBVREZfU0JfTFZJREJIKHNiKSkgewotCQlVREZfU0JfTFZJRChzYiktPmZyZWVTcGFjZVRhYmxlW3BhcnRpdGlvbl0gPQotCQkJY3B1X3RvX2xlMzIobGUzMl90b19jcHUoVURGX1NCX0xWSUQoc2IpLT5mcmVlU3BhY2VUYWJsZVtwYXJ0aXRpb25dKSAtIGFsbG9jX2NvdW50KTsKLQkJbWFya19idWZmZXJfZGlydHkoVURGX1NCX0xWSURCSChzYikpOworCWlmIChhbGxvY19jb3VudCAmJiB1ZGZfYWRkX2ZyZWVfc3BhY2Uoc2JpLCBwYXJ0aXRpb24sIC1hbGxvY19jb3VudCkpIHsKKwkJbWFya19idWZmZXJfZGlydHkoc2JpLT5zX2x2aWRfYmgpOwogCQlzYi0+c19kaXJ0ID0gMTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZzYmktPnNfYWxsb2NfbXV0ZXgpOwpAQCAtNjkyLDMzICs3NDMsMzUgQEAKIAlrZXJuZWxfbGJfYWRkciBlbG9jLCB1bmluaXRpYWxpemVkX3Zhcihnb2FsX2Vsb2MpOwogCXN0cnVjdCBleHRlbnRfcG9zaXRpb24gZXBvcywgZ29hbF9lcG9zOwogCWludDhfdCBldHlwZTsKKwlzdHJ1Y3QgdWRmX2lub2RlX2luZm8gKmlpbmZvID0gVURGX0kodGFibGUpOwogCiAJKmVyciA9IC1FTk9TUEM7CiAKLQlpZiAoVURGX0lfQUxMT0NUWVBFKHRhYmxlKSA9PSBJQ0JUQUdfRkxBR19BRF9TSE9SVCkKKwlpZiAoaWluZm8tPmlfYWxsb2NfdHlwZSA9PSBJQ0JUQUdfRkxBR19BRF9TSE9SVCkKIAkJYWRzaXplID0gc2l6ZW9mKHNob3J0X2FkKTsKLQllbHNlIGlmIChVREZfSV9BTExPQ1RZUEUodGFibGUpID09IElDQlRBR19GTEFHX0FEX0xPTkcpCisJZWxzZSBpZiAoaWluZm8tPmlfYWxsb2NfdHlwZSA9PSBJQ0JUQUdfRkxBR19BRF9MT05HKQogCQlhZHNpemUgPSBzaXplb2YobG9uZ19hZCk7CiAJZWxzZQogCQlyZXR1cm4gbmV3YmxvY2s7CiAKIAltdXRleF9sb2NrKCZzYmktPnNfYWxsb2NfbXV0ZXgpOwotCWlmIChnb2FsIDwgMCB8fCBnb2FsID49IFVERl9TQl9QQVJUTEVOKHNiLCBwYXJ0aXRpb24pKQorCWlmIChnb2FsIDwgMCB8fCBnb2FsID49IHNiaS0+c19wYXJ0bWFwc1twYXJ0aXRpb25dLnNfcGFydGl0aW9uX2xlbikKIAkJZ29hbCA9IDA7CiAKLQkvKiBXZSBzZWFyY2ggZm9yIHRoZSBjbG9zZXN0IG1hdGNoaW5nIGJsb2NrIHRvIGdvYWwuIElmIHdlIGZpbmQgYSBleGFjdCBoaXQsCi0JICAgd2Ugc3RvcC4gT3RoZXJ3aXNlIHdlIGtlZXAgZ29pbmcgdGlsbCB3ZSBydW4gb3V0IG9mIGV4dGVudHMuCi0JICAgV2Ugc3RvcmUgdGhlIGJ1ZmZlcl9oZWFkLCBibG9jLCBhbmQgZXh0b2Zmc2V0IG9mIHRoZSBjdXJyZW50IGNsb3Nlc3QKLQkgICBtYXRjaCBhbmQgdXNlIHRoYXQgd2hlbiB3ZSBhcmUgZG9uZS4KKwkvKiBXZSBzZWFyY2ggZm9yIHRoZSBjbG9zZXN0IG1hdGNoaW5nIGJsb2NrIHRvIGdvYWwuIElmIHdlIGZpbmQKKwkgICBhIGV4YWN0IGhpdCwgd2Ugc3RvcC4gT3RoZXJ3aXNlIHdlIGtlZXAgZ29pbmcgdGlsbCB3ZSBydW4gb3V0CisJICAgb2YgZXh0ZW50cy4gV2Ugc3RvcmUgdGhlIGJ1ZmZlcl9oZWFkLCBibG9jLCBhbmQgZXh0b2Zmc2V0CisJICAgb2YgdGhlIGN1cnJlbnQgY2xvc2VzdCBtYXRjaCBhbmQgdXNlIHRoYXQgd2hlbiB3ZSBhcmUgZG9uZS4KIAkgKi8KIAllcG9zLm9mZnNldCA9IHNpemVvZihzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkpOwotCWVwb3MuYmxvY2sgPSBVREZfSV9MT0NBVElPTih0YWJsZSk7CisJZXBvcy5ibG9jayA9IGlpbmZvLT5pX2xvY2F0aW9uOwogCWVwb3MuYmggPSBnb2FsX2Vwb3MuYmggPSBOVUxMOwogCiAJd2hpbGUgKHNwcmVhZCAmJgogCSAgICAgICAoZXR5cGUgPSB1ZGZfbmV4dF9hZXh0KHRhYmxlLCAmZXBvcywgJmVsb2MsICZlbGVuLCAxKSkgIT0gLTEpIHsKIAkJaWYgKGdvYWwgPj0gZWxvYy5sb2dpY2FsQmxvY2tOdW0pIHsKLQkJCWlmIChnb2FsIDwgZWxvYy5sb2dpY2FsQmxvY2tOdW0gKyAoZWxlbiA+PiBzYi0+c19ibG9ja3NpemVfYml0cykpCisJCQlpZiAoZ29hbCA8IGVsb2MubG9naWNhbEJsb2NrTnVtICsKKwkJCQkJKGVsZW4gPj4gc2ItPnNfYmxvY2tzaXplX2JpdHMpKQogCQkJCW5zcHJlYWQgPSAwOwogCQkJZWxzZQogCQkJCW5zcHJlYWQgPSBnb2FsIC0gZWxvYy5sb2dpY2FsQmxvY2tOdW0gLQpAQCAtNzcxLDExICs4MjQsOCBAQAogCQl1ZGZfZGVsZXRlX2FleHQodGFibGUsIGdvYWxfZXBvcywgZ29hbF9lbG9jLCBnb2FsX2VsZW4pOwogCWJyZWxzZShnb2FsX2Vwb3MuYmgpOwogCi0JaWYgKFVERl9TQl9MVklEQkgoc2IpKSB7Ci0JCVVERl9TQl9MVklEKHNiKS0+ZnJlZVNwYWNlVGFibGVbcGFydGl0aW9uXSA9Ci0JCQljcHVfdG9fbGUzMihsZTMyX3RvX2NwdShVREZfU0JfTFZJRChzYiktPmZyZWVTcGFjZVRhYmxlW3BhcnRpdGlvbl0pIC0gMSk7Ci0JCW1hcmtfYnVmZmVyX2RpcnR5KFVERl9TQl9MVklEQkgoc2IpKTsKLQl9CisJaWYgKHVkZl9hZGRfZnJlZV9zcGFjZShzYmksIHBhcnRpdGlvbiwgLTEpKQorCQltYXJrX2J1ZmZlcl9kaXJ0eShzYmktPnNfbHZpZF9iaCk7CiAKIAlzYi0+c19kaXJ0ID0gMTsKIAltdXRleF91bmxvY2soJnNiaS0+c19hbGxvY19tdXRleCk7CkBAIC03ODksMjIgKzgzOSwyMyBAQAogCQkJICAgIHVpbnQzMl90IGNvdW50KQogewogCXVpbnQxNl90IHBhcnRpdGlvbiA9IGJsb2MucGFydGl0aW9uUmVmZXJlbmNlTnVtOworCXN0cnVjdCB1ZGZfcGFydF9tYXAgKm1hcCA9ICZVREZfU0Ioc2IpLT5zX3BhcnRtYXBzW3BhcnRpdGlvbl07CiAKLQlpZiAoVURGX1NCX1BBUlRGTEFHUyhzYiwgcGFydGl0aW9uKSAmIFVERl9QQVJUX0ZMQUdfVU5BTExPQ19CSVRNQVApIHsKKwlpZiAobWFwLT5zX3BhcnRpdGlvbl9mbGFncyAmIFVERl9QQVJUX0ZMQUdfVU5BTExPQ19CSVRNQVApIHsKIAkJcmV0dXJuIHVkZl9iaXRtYXBfZnJlZV9ibG9ja3Moc2IsIGlub2RlLAotCQkJCQkgICAgICBVREZfU0JfUEFSVE1BUFMoc2IpW3BhcnRpdGlvbl0uc191c3BhY2Uuc19iaXRtYXAsCisJCQkJCSAgICAgIG1hcC0+c191c3BhY2Uuc19iaXRtYXAsCiAJCQkJCSAgICAgIGJsb2MsIG9mZnNldCwgY291bnQpOwotCX0gZWxzZSBpZiAoVURGX1NCX1BBUlRGTEFHUyhzYiwgcGFydGl0aW9uKSAmIFVERl9QQVJUX0ZMQUdfVU5BTExPQ19UQUJMRSkgeworCX0gZWxzZSBpZiAobWFwLT5zX3BhcnRpdGlvbl9mbGFncyAmIFVERl9QQVJUX0ZMQUdfVU5BTExPQ19UQUJMRSkgewogCQlyZXR1cm4gdWRmX3RhYmxlX2ZyZWVfYmxvY2tzKHNiLCBpbm9kZSwKLQkJCQkJICAgICBVREZfU0JfUEFSVE1BUFMoc2IpW3BhcnRpdGlvbl0uc191c3BhY2Uuc190YWJsZSwKKwkJCQkJICAgICBtYXAtPnNfdXNwYWNlLnNfdGFibGUsCiAJCQkJCSAgICAgYmxvYywgb2Zmc2V0LCBjb3VudCk7Ci0JfSBlbHNlIGlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBwYXJ0aXRpb24pICYgVURGX1BBUlRfRkxBR19GUkVFRF9CSVRNQVApIHsKKwl9IGVsc2UgaWYgKG1hcC0+c19wYXJ0aXRpb25fZmxhZ3MgJiBVREZfUEFSVF9GTEFHX0ZSRUVEX0JJVE1BUCkgewogCQlyZXR1cm4gdWRmX2JpdG1hcF9mcmVlX2Jsb2NrcyhzYiwgaW5vZGUsCi0JCQkJCSAgICAgIFVERl9TQl9QQVJUTUFQUyhzYilbcGFydGl0aW9uXS5zX2ZzcGFjZS5zX2JpdG1hcCwKKwkJCQkJICAgICAgbWFwLT5zX2ZzcGFjZS5zX2JpdG1hcCwKIAkJCQkJICAgICAgYmxvYywgb2Zmc2V0LCBjb3VudCk7Ci0JfSBlbHNlIGlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBwYXJ0aXRpb24pICYgVURGX1BBUlRfRkxBR19GUkVFRF9UQUJMRSkgeworCX0gZWxzZSBpZiAobWFwLT5zX3BhcnRpdGlvbl9mbGFncyAmIFVERl9QQVJUX0ZMQUdfRlJFRURfVEFCTEUpIHsKIAkJcmV0dXJuIHVkZl90YWJsZV9mcmVlX2Jsb2NrcyhzYiwgaW5vZGUsCi0JCQkJCSAgICAgVURGX1NCX1BBUlRNQVBTKHNiKVtwYXJ0aXRpb25dLnNfZnNwYWNlLnNfdGFibGUsCisJCQkJCSAgICAgbWFwLT5zX2ZzcGFjZS5zX3RhYmxlLAogCQkJCQkgICAgIGJsb2MsIG9mZnNldCwgY291bnQpOwogCX0gZWxzZSB7CiAJCXJldHVybjsKQEAgLTgxNiw1MSArODY3LDU1IEBACiAJCQkgICAgICAgdWludDE2X3QgcGFydGl0aW9uLCB1aW50MzJfdCBmaXJzdF9ibG9jaywKIAkJCSAgICAgICB1aW50MzJfdCBibG9ja19jb3VudCkKIHsKLQlpZiAoVURGX1NCX1BBUlRGTEFHUyhzYiwgcGFydGl0aW9uKSAmIFVERl9QQVJUX0ZMQUdfVU5BTExPQ19CSVRNQVApIHsKKwlzdHJ1Y3QgdWRmX3BhcnRfbWFwICptYXAgPSAmVURGX1NCKHNiKS0+c19wYXJ0bWFwc1twYXJ0aXRpb25dOworCisJaWYgKG1hcC0+c19wYXJ0aXRpb25fZmxhZ3MgJiBVREZfUEFSVF9GTEFHX1VOQUxMT0NfQklUTUFQKQogCQlyZXR1cm4gdWRmX2JpdG1hcF9wcmVhbGxvY19ibG9ja3Moc2IsIGlub2RlLAotCQkJCQkJICBVREZfU0JfUEFSVE1BUFMoc2IpW3BhcnRpdGlvbl0uc191c3BhY2Uuc19iaXRtYXAsCi0JCQkJCQkgIHBhcnRpdGlvbiwgZmlyc3RfYmxvY2ssIGJsb2NrX2NvdW50KTsKLQl9IGVsc2UgaWYgKFVERl9TQl9QQVJURkxBR1Moc2IsIHBhcnRpdGlvbikgJiBVREZfUEFSVF9GTEFHX1VOQUxMT0NfVEFCTEUpIHsKKwkJCQkJCSAgbWFwLT5zX3VzcGFjZS5zX2JpdG1hcCwKKwkJCQkJCSAgcGFydGl0aW9uLCBmaXJzdF9ibG9jaywKKwkJCQkJCSAgYmxvY2tfY291bnQpOworCWVsc2UgaWYgKG1hcC0+c19wYXJ0aXRpb25fZmxhZ3MgJiBVREZfUEFSVF9GTEFHX1VOQUxMT0NfVEFCTEUpCiAJCXJldHVybiB1ZGZfdGFibGVfcHJlYWxsb2NfYmxvY2tzKHNiLCBpbm9kZSwKLQkJCQkJCSBVREZfU0JfUEFSVE1BUFMoc2IpW3BhcnRpdGlvbl0uc191c3BhY2Uuc190YWJsZSwKLQkJCQkJCSBwYXJ0aXRpb24sIGZpcnN0X2Jsb2NrLCBibG9ja19jb3VudCk7Ci0JfSBlbHNlIGlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBwYXJ0aXRpb24pICYgVURGX1BBUlRfRkxBR19GUkVFRF9CSVRNQVApIHsKKwkJCQkJCSBtYXAtPnNfdXNwYWNlLnNfdGFibGUsCisJCQkJCQkgcGFydGl0aW9uLCBmaXJzdF9ibG9jaywKKwkJCQkJCSBibG9ja19jb3VudCk7CisJZWxzZSBpZiAobWFwLT5zX3BhcnRpdGlvbl9mbGFncyAmIFVERl9QQVJUX0ZMQUdfRlJFRURfQklUTUFQKQogCQlyZXR1cm4gdWRmX2JpdG1hcF9wcmVhbGxvY19ibG9ja3Moc2IsIGlub2RlLAotCQkJCQkJICBVREZfU0JfUEFSVE1BUFMoc2IpW3BhcnRpdGlvbl0uc19mc3BhY2Uuc19iaXRtYXAsCi0JCQkJCQkgIHBhcnRpdGlvbiwgZmlyc3RfYmxvY2ssIGJsb2NrX2NvdW50KTsKLQl9IGVsc2UgaWYgKFVERl9TQl9QQVJURkxBR1Moc2IsIHBhcnRpdGlvbikgJiBVREZfUEFSVF9GTEFHX0ZSRUVEX1RBQkxFKSB7CisJCQkJCQkgIG1hcC0+c19mc3BhY2Uuc19iaXRtYXAsCisJCQkJCQkgIHBhcnRpdGlvbiwgZmlyc3RfYmxvY2ssCisJCQkJCQkgIGJsb2NrX2NvdW50KTsKKwllbHNlIGlmIChtYXAtPnNfcGFydGl0aW9uX2ZsYWdzICYgVURGX1BBUlRfRkxBR19GUkVFRF9UQUJMRSkKIAkJcmV0dXJuIHVkZl90YWJsZV9wcmVhbGxvY19ibG9ja3Moc2IsIGlub2RlLAotCQkJCQkJIFVERl9TQl9QQVJUTUFQUyhzYilbcGFydGl0aW9uXS5zX2ZzcGFjZS5zX3RhYmxlLAotCQkJCQkJIHBhcnRpdGlvbiwgZmlyc3RfYmxvY2ssIGJsb2NrX2NvdW50KTsKLQl9IGVsc2UgeworCQkJCQkJIG1hcC0+c19mc3BhY2Uuc190YWJsZSwKKwkJCQkJCSBwYXJ0aXRpb24sIGZpcnN0X2Jsb2NrLAorCQkJCQkJIGJsb2NrX2NvdW50KTsKKwllbHNlCiAJCXJldHVybiAwOwotCX0KIH0KIAogaW5saW5lIGludCB1ZGZfbmV3X2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCSB1aW50MTZfdCBwYXJ0aXRpb24sIHVpbnQzMl90IGdvYWwsIGludCAqZXJyKQogewotCWludCByZXQ7CisJc3RydWN0IHVkZl9wYXJ0X21hcCAqbWFwID0gJlVERl9TQihzYiktPnNfcGFydG1hcHNbcGFydGl0aW9uXTsKIAotCWlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBwYXJ0aXRpb24pICYgVURGX1BBUlRfRkxBR19VTkFMTE9DX0JJVE1BUCkgewotCQlyZXQgPSB1ZGZfYml0bWFwX25ld19ibG9jayhzYiwgaW5vZGUsCi0JCQkJCSAgIFVERl9TQl9QQVJUTUFQUyhzYilbcGFydGl0aW9uXS5zX3VzcGFjZS5zX2JpdG1hcCwKLQkJCQkJICAgcGFydGl0aW9uLCBnb2FsLCBlcnIpOwotCQlyZXR1cm4gcmV0OwotCX0gZWxzZSBpZiAoVURGX1NCX1BBUlRGTEFHUyhzYiwgcGFydGl0aW9uKSAmIFVERl9QQVJUX0ZMQUdfVU5BTExPQ19UQUJMRSkgewotCQlyZXR1cm4gdWRmX3RhYmxlX25ld19ibG9jayhzYiwgaW5vZGUsCi0JCQkJCSAgIFVERl9TQl9QQVJUTUFQUyhzYilbcGFydGl0aW9uXS5zX3VzcGFjZS5zX3RhYmxlLAotCQkJCQkgICBwYXJ0aXRpb24sIGdvYWwsIGVycik7Ci0JfSBlbHNlIGlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBwYXJ0aXRpb24pICYgVURGX1BBUlRfRkxBR19GUkVFRF9CSVRNQVApIHsKKwlpZiAobWFwLT5zX3BhcnRpdGlvbl9mbGFncyAmIFVERl9QQVJUX0ZMQUdfVU5BTExPQ19CSVRNQVApCiAJCXJldHVybiB1ZGZfYml0bWFwX25ld19ibG9jayhzYiwgaW5vZGUsCi0JCQkJCSAgICBVREZfU0JfUEFSVE1BUFMoc2IpW3BhcnRpdGlvbl0uc19mc3BhY2Uuc19iaXRtYXAsCi0JCQkJCSAgICBwYXJ0aXRpb24sIGdvYWwsIGVycik7Ci0JfSBlbHNlIGlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBwYXJ0aXRpb24pICYgVURGX1BBUlRfRkxBR19GUkVFRF9UQUJMRSkgewotCQlyZXR1cm4gdWRmX3RhYmxlX25ld19ibG9jayhzYiwgaW5vZGUsCi0JCQkJCSAgIFVERl9TQl9QQVJUTUFQUyhzYilbcGFydGl0aW9uXS5zX2ZzcGFjZS5zX3RhYmxlLAorCQkJCQkgICBtYXAtPnNfdXNwYWNlLnNfYml0bWFwLAogCQkJCQkgICBwYXJ0aXRpb24sIGdvYWwsIGVycik7Ci0JfSBlbHNlIHsKKwllbHNlIGlmIChtYXAtPnNfcGFydGl0aW9uX2ZsYWdzICYgVURGX1BBUlRfRkxBR19VTkFMTE9DX1RBQkxFKQorCQlyZXR1cm4gdWRmX3RhYmxlX25ld19ibG9jayhzYiwgaW5vZGUsCisJCQkJCSAgIG1hcC0+c191c3BhY2Uuc190YWJsZSwKKwkJCQkJICAgcGFydGl0aW9uLCBnb2FsLCBlcnIpOworCWVsc2UgaWYgKG1hcC0+c19wYXJ0aXRpb25fZmxhZ3MgJiBVREZfUEFSVF9GTEFHX0ZSRUVEX0JJVE1BUCkKKwkJcmV0dXJuIHVkZl9iaXRtYXBfbmV3X2Jsb2NrKHNiLCBpbm9kZSwKKwkJCQkJICAgIG1hcC0+c19mc3BhY2Uuc19iaXRtYXAsCisJCQkJCSAgICBwYXJ0aXRpb24sIGdvYWwsIGVycik7CisJZWxzZSBpZiAobWFwLT5zX3BhcnRpdGlvbl9mbGFncyAmIFVERl9QQVJUX0ZMQUdfRlJFRURfVEFCTEUpCisJCXJldHVybiB1ZGZfdGFibGVfbmV3X2Jsb2NrKHNiLCBpbm9kZSwKKwkJCQkJICAgbWFwLT5zX2ZzcGFjZS5zX3RhYmxlLAorCQkJCQkgICBwYXJ0aXRpb24sIGdvYWwsIGVycik7CisJZWxzZSB7CiAJCSplcnIgPSAtRUlPOwogCQlyZXR1cm4gMDsKIAl9CmRpZmYgLS1naXQgYS9mcy91ZGYvY3JjLmMgYi9mcy91ZGYvY3JjLmMKaW5kZXggODVhYWVlNS4uYjE2NjEyOSAxMDA2NDQKLS0tIGEvZnMvdWRmL2NyYy5jCisrKyBiL2ZzL3VkZi9jcmMuYwpAQCAtNzksNyArNzksNyBAQAogICoJSnVseSAyMSwgMTk5NyAtIEFuZHJldyBFLiBNaWxlc2tpCiAgKglBZGFwdGVkIGZyb20gT1NUQS1VREYodG0pIDEuNTAgc3RhbmRhcmQuCiAgKi8KLXVpbnQxNl90IHVkZl9jcmModWludDhfdCAqIGRhdGEsIHVpbnQzMl90IHNpemUsIHVpbnQxNl90IGNyYykKK3VpbnQxNl90IHVkZl9jcmModWludDhfdCAqZGF0YSwgdWludDMyX3Qgc2l6ZSwgdWludDE2X3QgY3JjKQogewogCXdoaWxlIChzaXplLS0pCiAJCWNyYyA9IGNyY190YWJsZVsoY3JjID4+IDggXiAqKGRhdGErKykpICYgMHhmZlVdIF4gKGNyYyA8PCA4KTsKZGlmZiAtLWdpdCBhL2ZzL3VkZi9kaXIuYyBiL2ZzL3VkZi9kaXIuYwppbmRleCA5ZTNiOWY5Li40YjQ0ZTIzIDEwMDY0NAotLS0gYS9mcy91ZGYvZGlyLmMKKysrIGIvZnMvdWRmL2Rpci5jCkBAIC0zNiw2OCArMzYsOCBAQAogI2luY2x1ZGUgInVkZl9pLmgiCiAjaW5jbHVkZSAidWRmX3NiLmgiCiAKLS8qIFByb3RvdHlwZXMgZm9yIGZpbGUgb3BlcmF0aW9ucyAqLwotc3RhdGljIGludCB1ZGZfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqLCB2b2lkICosIGZpbGxkaXJfdCk7Ci1zdGF0aWMgaW50IGRvX3VkZl9yZWFkZGlyKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCBmaWxsZGlyX3QsIHZvaWQgKik7Ci0KLS8qIHJlYWRkaXIgYW5kIGxvb2t1cCBmdW5jdGlvbnMgKi8KLQotY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1ZGZfZGlyX29wZXJhdGlvbnMgPSB7Ci0JLnJlYWQJCQk9IGdlbmVyaWNfcmVhZF9kaXIsCi0JLnJlYWRkaXIJCT0gdWRmX3JlYWRkaXIsCi0JLmlvY3RsCQkJPSB1ZGZfaW9jdGwsCi0JLmZzeW5jCQkJPSB1ZGZfZnN5bmNfZmlsZSwKLX07Ci0KLS8qCi0gKiB1ZGZfcmVhZGRpcgotICoKLSAqIFBVUlBPU0UKLSAqCVJlYWQgYSBkaXJlY3RvcnkgZW50cnkuCi0gKgotICogREVTQ1JJUFRJT04KLSAqCU9wdGlvbmFsIC0gc3lzX2dldGRlbnRzKCkgd2lsbCByZXR1cm4gLUVOT1RESVIgaWYgdGhpcyByb3V0aW5lIGlzIG5vdAotICoJYXZhaWxhYmxlLgotICoKLSAqCVJlZmVyIHRvIHN5c19nZXRkZW50cygpIGluIGZzL3JlYWRkaXIuYwotICoJc3lzX2dldGRlbnRzKCkgLT4gLgotICoKLSAqIFBSRS1DT05ESVRJT05TCi0gKglmaWxwCQkJUG9pbnRlciB0byBkaXJlY3RvcnkgZmlsZS4KLSAqCWJ1ZgkJCVBvaW50ZXIgdG8gZGlyZWN0b3J5IGVudHJ5IGJ1ZmZlci4KLSAqCWZpbGxkaXIJCQlQb2ludGVyIHRvIGZpbGxkaXIgZnVuY3Rpb24uCi0gKgotICogUE9TVC1DT05ESVRJT05TCi0gKgk8cmV0dXJuPgkJPj0wIG9uIHN1Y2Nlc3MuCi0gKgotICogSElTVE9SWQotICoJSnVseSAxLCAxOTk3IC0gQW5kcmV3IEUuIE1pbGVza2kKLSAqCVdyaXR0ZW4sIHRlc3RlZCwgYW5kIHJlbGVhc2VkLgotICovCi0KLWludCB1ZGZfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKLXsKLQlzdHJ1Y3QgaW5vZGUgKmRpciA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7Ci0JaW50IHJlc3VsdDsKLQotCWxvY2tfa2VybmVsKCk7Ci0KLQlpZiAoZmlscC0+Zl9wb3MgPT0gMCkgewotCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuIiwgMSwgZmlscC0+Zl9wb3MsIGRpci0+aV9pbm8sIERUX0RJUikgPCAwKSB7Ci0JCQl1bmxvY2tfa2VybmVsKCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlmaWxwLT5mX3BvcysrOwotCX0KLQotCXJlc3VsdCA9IGRvX3VkZl9yZWFkZGlyKGRpciwgZmlscCwgZmlsbGRpciwgZGlyZW50KTsKLQl1bmxvY2tfa2VybmVsKCk7Ci0gCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWRvX3VkZl9yZWFkZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZmlsZSAqZmlscCwgZmlsbGRpcl90IGZpbGxkaXIsCi0JICAgICAgIHZvaWQgKmRpcmVudCkKK3N0YXRpYyBpbnQgZG9fdWRmX3JlYWRkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICBmaWxsZGlyX3QgZmlsbGRpciwgdm9pZCAqZGlyZW50KQogewogCXN0cnVjdCB1ZGZfZmlsZWlkZW50X2JoIGZpYmg7CiAJc3RydWN0IGZpbGVJZGVudERlc2MgKmZpID0gTlVMTDsKQEAgLTExNyw2ICs1Nyw3IEBACiAJaW50IGksIG51bTsKIAl1bnNpZ25lZCBpbnQgZHRfdHlwZTsKIAlzdHJ1Y3QgZXh0ZW50X3Bvc2l0aW9uIGVwb3MgPSB7IE5VTEwsIDAsIHswLCAwfSB9OworCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqaWluZm87CiAKIAlpZiAobmZfcG9zID49IHNpemUpCiAJCXJldHVybiAwOwpAQCAtMTI1LDE1ICs2NiwxNyBAQAogCQluZl9wb3MgPSAodWRmX2V4dDBfb2Zmc2V0KGRpcikgPj4gMik7CiAKIAlmaWJoLnNvZmZzZXQgPSBmaWJoLmVvZmZzZXQgPSAobmZfcG9zICYgKChkaXItPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkgPj4gMikpIDw8IDI7Ci0JaWYgKFVERl9JX0FMTE9DVFlQRShkaXIpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikgeworCWlpbmZvID0gVURGX0koZGlyKTsKKwlpZiAoaWluZm8tPmlfYWxsb2NfdHlwZSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpIHsKIAkJZmliaC5zYmggPSBmaWJoLmViaCA9IE5VTEw7CiAJfSBlbHNlIGlmIChpbm9kZV9ibWFwKGRpciwgbmZfcG9zID4+IChkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSAyKSwKIAkJCSAgICAgICZlcG9zLCAmZWxvYywgJmVsZW4sICZvZmZzZXQpID09IChFWFRfUkVDT1JERURfQUxMT0NBVEVEID4+IDMwKSkgewogCQlibG9jayA9IHVkZl9nZXRfbGJfcGJsb2NrKGRpci0+aV9zYiwgZWxvYywgb2Zmc2V0KTsKIAkJaWYgKCgrK29mZnNldCA8PCBkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpIDwgZWxlbikgewotCQkJaWYgKFVERl9JX0FMTE9DVFlQRShkaXIpID09IElDQlRBR19GTEFHX0FEX1NIT1JUKQorCQkJaWYgKGlpbmZvLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfU0hPUlQpCiAJCQkJZXBvcy5vZmZzZXQgLT0gc2l6ZW9mKHNob3J0X2FkKTsKLQkJCWVsc2UgaWYgKFVERl9JX0FMTE9DVFlQRShkaXIpID09IElDQlRBR19GTEFHX0FEX0xPTkcpCisJCQllbHNlIGlmIChpaW5mby0+aV9hbGxvY190eXBlID09CisJCQkJCUlDQlRBR19GTEFHX0FEX0xPTkcpCiAJCQkJZXBvcy5vZmZzZXQgLT0gc2l6ZW9mKGxvbmdfYWQpOwogCQl9IGVsc2UgewogCQkJb2Zmc2V0ID0gMDsKQEAgLTI0NCwzICsxODcsNTcgQEAKIAogCXJldHVybiAwOwogfQorCisvKgorICogdWRmX3JlYWRkaXIKKyAqCisgKiBQVVJQT1NFCisgKglSZWFkIGEgZGlyZWN0b3J5IGVudHJ5LgorICoKKyAqIERFU0NSSVBUSU9OCisgKglPcHRpb25hbCAtIHN5c19nZXRkZW50cygpIHdpbGwgcmV0dXJuIC1FTk9URElSIGlmIHRoaXMgcm91dGluZSBpcyBub3QKKyAqCWF2YWlsYWJsZS4KKyAqCisgKglSZWZlciB0byBzeXNfZ2V0ZGVudHMoKSBpbiBmcy9yZWFkZGlyLmMKKyAqCXN5c19nZXRkZW50cygpIC0+IC4KKyAqCisgKiBQUkUtQ09ORElUSU9OUworICoJZmlscAkJCVBvaW50ZXIgdG8gZGlyZWN0b3J5IGZpbGUuCisgKglidWYJCQlQb2ludGVyIHRvIGRpcmVjdG9yeSBlbnRyeSBidWZmZXIuCisgKglmaWxsZGlyCQkJUG9pbnRlciB0byBmaWxsZGlyIGZ1bmN0aW9uLgorICoKKyAqIFBPU1QtQ09ORElUSU9OUworICoJPHJldHVybj4JCT49MCBvbiBzdWNjZXNzLgorICoKKyAqIEhJU1RPUlkKKyAqCUp1bHkgMSwgMTk5NyAtIEFuZHJldyBFLiBNaWxlc2tpCisgKglXcml0dGVuLCB0ZXN0ZWQsIGFuZCByZWxlYXNlZC4KKyAqLworCitzdGF0aWMgaW50IHVkZl9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXN0cnVjdCBpbm9kZSAqZGlyID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgcmVzdWx0OworCisJbG9ja19rZXJuZWwoKTsKKworCWlmIChmaWxwLT5mX3BvcyA9PSAwKSB7CisJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4iLCAxLCBmaWxwLT5mX3BvcywgZGlyLT5pX2lubywgRFRfRElSKSA8IDApIHsKKwkJCXVubG9ja19rZXJuZWwoKTsKKwkJCXJldHVybiAwOworCQl9CisJCWZpbHAtPmZfcG9zKys7CisJfQorCisJcmVzdWx0ID0gZG9fdWRmX3JlYWRkaXIoZGlyLCBmaWxwLCBmaWxsZGlyLCBkaXJlbnQpOworCXVubG9ja19rZXJuZWwoKTsKKyAJcmV0dXJuIHJlc3VsdDsKK30KKworLyogcmVhZGRpciBhbmQgbG9va3VwIGZ1bmN0aW9ucyAqLworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1ZGZfZGlyX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJCT0gdWRmX3JlYWRkaXIsCisJLmlvY3RsCQkJPSB1ZGZfaW9jdGwsCisJLmZzeW5jCQkJPSB1ZGZfZnN5bmNfZmlsZSwKK307CmRpZmYgLS1naXQgYS9mcy91ZGYvZGlyZWN0b3J5LmMgYi9mcy91ZGYvZGlyZWN0b3J5LmMKaW5kZXggZmY4YzA4Zi4uMjgyMGY4ZiAxMDA2NDQKLS0tIGEvZnMvdWRmL2RpcmVjdG9yeS5jCisrKyBiL2ZzL3VkZi9kaXJlY3RvcnkuYwpAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAKICNpZiAwCi1zdGF0aWMgdWludDhfdCAqdWRmX2ZpbGVhZF9yZWFkKHN0cnVjdCBpbm9kZSAqZGlyLCB1aW50OF90ICogdG1wYWQsCitzdGF0aWMgdWludDhfdCAqdWRmX2ZpbGVhZF9yZWFkKHN0cnVjdCBpbm9kZSAqZGlyLCB1aW50OF90ICp0bXBhZCwKIAkJCQl1aW50OF90IGFkX3NpemUsIGtlcm5lbF9sYl9hZGRyIGZlX2xvYywKIAkJCQlpbnQgKnBvcywgaW50ICpvZmZzZXQsIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoLAogCQkJCWludCAqZXJyb3IpCkBAIC00NSw3ICs0NSw4IEBACiAJCWJsb2NrID0gdWRmX2dldF9sYl9wYmxvY2soZGlyLT5pX3NiLCBmZV9sb2MsICsrKnBvcyk7CiAJCWlmICghYmxvY2spCiAJCQlyZXR1cm4gTlVMTDsKLQkJaWYgKCEoKmJoID0gdWRmX3RyZWFkKGRpci0+aV9zYiwgYmxvY2spKSkKKwkJKmJoID0gdWRmX3RyZWFkKGRpci0+aV9zYiwgYmxvY2spOworCQlpZiAoISpiaCkKIAkJCXJldHVybiBOVUxMOwogCX0gZWxzZSBpZiAoKm9mZnNldCA+IGRpci0+aV9zYi0+c19ibG9ja3NpemUpIHsKIAkJYWQgPSB0bXBhZDsKQEAgLTU3LDEwICs1OCwxMiBAQAogCQlibG9jayA9IHVkZl9nZXRfbGJfcGJsb2NrKGRpci0+aV9zYiwgZmVfbG9jLCArKypwb3MpOwogCQlpZiAoIWJsb2NrKQogCQkJcmV0dXJuIE5VTEw7Ci0JCWlmICghKCgqYmgpID0gdWRmX3RyZWFkKGRpci0+aV9zYiwgYmxvY2spKSkKKwkJKCpiaCkgPSB1ZGZfdHJlYWQoZGlyLT5pX3NiLCBibG9jayk7CisJCWlmICghKmJoKQogCQkJcmV0dXJuIE5VTEw7CiAKLQkJbWVtY3B5KCh1aW50OF90ICopYWQgKyByZW1haW5kZXIsICgqYmgpLT5iX2RhdGEsIGFkX3NpemUgLSByZW1haW5kZXIpOworCQltZW1jcHkoKHVpbnQ4X3QgKilhZCArIHJlbWFpbmRlciwgKCpiaCktPmJfZGF0YSwKKwkJCWFkX3NpemUgLSByZW1haW5kZXIpOwogCQkqb2Zmc2V0ID0gYWRfc2l6ZSAtIHJlbWFpbmRlcjsKIAl9CiAKQEAgLTY4LDI5ICs3MSwzMSBAQAogfQogI2VuZGlmCiAKLXN0cnVjdCBmaWxlSWRlbnREZXNjICp1ZGZfZmlsZWlkZW50X3JlYWQoc3RydWN0IGlub2RlICpkaXIsIGxvZmZfdCAqIG5mX3BvcywKK3N0cnVjdCBmaWxlSWRlbnREZXNjICp1ZGZfZmlsZWlkZW50X3JlYWQoc3RydWN0IGlub2RlICpkaXIsIGxvZmZfdCAqbmZfcG9zLAogCQkJCQkgc3RydWN0IHVkZl9maWxlaWRlbnRfYmggKmZpYmgsCiAJCQkJCSBzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqY2ZpLAogCQkJCQkgc3RydWN0IGV4dGVudF9wb3NpdGlvbiAqZXBvcywKLQkJCQkJIGtlcm5lbF9sYl9hZGRyICogZWxvYywgdWludDMyX3QgKiBlbGVuLAotCQkJCQkgc2VjdG9yX3QgKiBvZmZzZXQpCisJCQkJCSBrZXJuZWxfbGJfYWRkciAqZWxvYywgdWludDMyX3QgKmVsZW4sCisJCQkJCSBzZWN0b3JfdCAqb2Zmc2V0KQogewogCXN0cnVjdCBmaWxlSWRlbnREZXNjICpmaTsKIAlpbnQgaSwgbnVtLCBibG9jazsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRtcCwgKmJoYVsxNl07CisJc3RydWN0IHVkZl9pbm9kZV9pbmZvICppaW5mbyA9IFVERl9JKGRpcik7CiAKIAlmaWJoLT5zb2Zmc2V0ID0gZmliaC0+ZW9mZnNldDsKIAotCWlmIChVREZfSV9BTExPQ1RZUEUoZGlyKSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpIHsKLQkJZmkgPSB1ZGZfZ2V0X2ZpbGVpZGVudChVREZfSV9EQVRBKGRpcikgLQotCQkJCSAgICAgICAoVURGX0lfRUZFKGRpcikgPworCWlmIChpaW5mby0+aV9hbGxvY190eXBlID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikgeworCQlmaSA9IHVkZl9nZXRfZmlsZWlkZW50KGlpbmZvLT5pX2V4dC5pX2RhdGEgLQorCQkJCSAgICAgICAoaWluZm8tPmlfZWZlID8KIAkJCQkJc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEZpbGVFbnRyeSkgOgogCQkJCQlzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSkpLAotCQkJCSAgICAgICBkaXItPmlfc2ItPnNfYmxvY2tzaXplLCAmKGZpYmgtPmVvZmZzZXQpKTsKKwkJCQkgICAgICAgZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSwKKwkJCQkgICAgICAgJihmaWJoLT5lb2Zmc2V0KSk7CiAJCWlmICghZmkpCiAJCQlyZXR1cm4gTlVMTDsKIAotCQkqbmZfcG9zICs9ICgoZmliaC0+ZW9mZnNldCAtIGZpYmgtPnNvZmZzZXQpID4+IDIpOworCQkqbmZfcG9zICs9IGZpYmgtPmVvZmZzZXQgLSBmaWJoLT5zb2Zmc2V0OwogCiAJCW1lbWNweSgodWludDhfdCAqKWNmaSwgKHVpbnQ4X3QgKilmaSwKIAkJICAgICAgIHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYykpOwpAQCAtMTAwLDYgKzEwNSw3IEBACiAKIAlpZiAoZmliaC0+ZW9mZnNldCA9PSBkaXItPmlfc2ItPnNfYmxvY2tzaXplKSB7CiAJCWludCBsZXh0b2Zmc2V0ID0gZXBvcy0+b2Zmc2V0OworCQl1bnNpZ25lZCBjaGFyIGJsb2Nrc2l6ZV9iaXRzID0gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwogCiAJCWlmICh1ZGZfbmV4dF9hZXh0KGRpciwgZXBvcywgZWxvYywgZWxlbiwgMSkgIT0KIAkJICAgIChFWFRfUkVDT1JERURfQUxMT0NBVEVEID4+IDMwKSkKQEAgLTEwOSwyNCArMTE1LDI3IEBACiAKIAkJKCpvZmZzZXQpKys7CiAKLQkJaWYgKCgqb2Zmc2V0IDw8IGRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cykgPj0gKmVsZW4pCisJCWlmICgoKm9mZnNldCA8PCBibG9ja3NpemVfYml0cykgPj0gKmVsZW4pCiAJCQkqb2Zmc2V0ID0gMDsKIAkJZWxzZQogCQkJZXBvcy0+b2Zmc2V0ID0gbGV4dG9mZnNldDsKIAogCQlicmVsc2UoZmliaC0+c2JoKTsKLQkJaWYgKCEoZmliaC0+c2JoID0gZmliaC0+ZWJoID0gdWRmX3RyZWFkKGRpci0+aV9zYiwgYmxvY2spKSkKKwkJZmliaC0+c2JoID0gZmliaC0+ZWJoID0gdWRmX3RyZWFkKGRpci0+aV9zYiwgYmxvY2spOworCQlpZiAoIWZpYmgtPnNiaCkKIAkJCXJldHVybiBOVUxMOwogCQlmaWJoLT5zb2Zmc2V0ID0gZmliaC0+ZW9mZnNldCA9IDA7CiAKLQkJaWYgKCEoKm9mZnNldCAmICgoMTYgPj4gKGRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cyAtIDkpKSAtIDEpKSkgewotCQkJaSA9IDE2ID4+IChkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSA5KTsKLQkJCWlmIChpICsgKm9mZnNldCA+ICgqZWxlbiA+PiBkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpKQotCQkJCWkgPSAoKmVsZW4gPj4gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKS0qb2Zmc2V0OworCQlpZiAoISgqb2Zmc2V0ICYgKCgxNiA+PiAoYmxvY2tzaXplX2JpdHMgLSA5KSkgLSAxKSkpIHsKKwkJCWkgPSAxNiA+PiAoYmxvY2tzaXplX2JpdHMgLSA5KTsKKwkJCWlmIChpICsgKm9mZnNldCA+ICgqZWxlbiA+PiBibG9ja3NpemVfYml0cykpCisJCQkJaSA9ICgqZWxlbiA+PiBibG9ja3NpemVfYml0cyktKm9mZnNldDsKIAkJCWZvciAobnVtID0gMDsgaSA+IDA7IGktLSkgewotCQkJCWJsb2NrID0gdWRmX2dldF9sYl9wYmxvY2soZGlyLT5pX3NiLCAqZWxvYywgKm9mZnNldCArIGkpOworCQkJCWJsb2NrID0gdWRmX2dldF9sYl9wYmxvY2soZGlyLT5pX3NiLCAqZWxvYywKKwkJCQkJCQkgICpvZmZzZXQgKyBpKTsKIAkJCQl0bXAgPSB1ZGZfdGdldGJsayhkaXItPmlfc2IsIGJsb2NrKTsKLQkJCQlpZiAodG1wICYmICFidWZmZXJfdXB0b2RhdGUodG1wKSAmJiAhYnVmZmVyX2xvY2tlZCh0bXApKQorCQkJCWlmICh0bXAgJiYgIWJ1ZmZlcl91cHRvZGF0ZSh0bXApICYmCisJCQkJCQkhYnVmZmVyX2xvY2tlZCh0bXApKQogCQkJCQliaGFbbnVtKytdID0gdG1wOwogCQkJCWVsc2UKIAkJCQkJYnJlbHNlKHRtcCk7CkBAIC0xNDgsNyArMTU3LDcgQEAKIAlpZiAoIWZpKQogCQlyZXR1cm4gTlVMTDsKIAotCSpuZl9wb3MgKz0gKChmaWJoLT5lb2Zmc2V0IC0gZmliaC0+c29mZnNldCkgPj4gMik7CisJKm5mX3BvcyArPSBmaWJoLT5lb2Zmc2V0IC0gZmliaC0+c29mZnNldDsKIAogCWlmIChmaWJoLT5lb2Zmc2V0IDw9IGRpci0+aV9zYi0+c19ibG9ja3NpemUpIHsKIAkJbWVtY3B5KCh1aW50OF90ICopY2ZpLCAodWludDhfdCAqKWZpLApAQCAtMTcyLDIwICsxODEsMjMgQEAKIAkJZmliaC0+c29mZnNldCAtPSBkaXItPmlfc2ItPnNfYmxvY2tzaXplOwogCQlmaWJoLT5lb2Zmc2V0IC09IGRpci0+aV9zYi0+c19ibG9ja3NpemU7CiAKLQkJaWYgKCEoZmliaC0+ZWJoID0gdWRmX3RyZWFkKGRpci0+aV9zYiwgYmxvY2spKSkKKwkJZmliaC0+ZWJoID0gdWRmX3RyZWFkKGRpci0+aV9zYiwgYmxvY2spOworCQlpZiAoIWZpYmgtPmViaCkKIAkJCXJldHVybiBOVUxMOwogCiAJCWlmIChzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpID4gLWZpYmgtPnNvZmZzZXQpIHsKIAkJCWludCBmaV9sZW47CiAKIAkJCW1lbWNweSgodWludDhfdCAqKWNmaSwgKHVpbnQ4X3QgKilmaSwgLWZpYmgtPnNvZmZzZXQpOwotCQkJbWVtY3B5KCh1aW50OF90ICopY2ZpIC0gZmliaC0+c29mZnNldCwgZmliaC0+ZWJoLT5iX2RhdGEsCisJCQltZW1jcHkoKHVpbnQ4X3QgKiljZmkgLSBmaWJoLT5zb2Zmc2V0LAorCQkJICAgICAgIGZpYmgtPmViaC0+Yl9kYXRhLAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYykgKyBmaWJoLT5zb2Zmc2V0KTsKIAotCQkJZmlfbGVuID0gKHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYykgKyBjZmktPmxlbmd0aEZpbGVJZGVudCArCisJCQlmaV9sZW4gPSAoc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKSArCisJCQkJICBjZmktPmxlbmd0aEZpbGVJZGVudCArCiAJCQkJICBsZTE2X3RvX2NwdShjZmktPmxlbmd0aE9mSW1wVXNlKSArIDMpICYgfjM7CiAKLQkJCSpuZl9wb3MgKz0gKChmaV9sZW4gLSAoZmliaC0+ZW9mZnNldCAtIGZpYmgtPnNvZmZzZXQpKSA+PiAyKTsKKwkJCSpuZl9wb3MgKz0gZmlfbGVuIC0gKGZpYmgtPmVvZmZzZXQgLSBmaWJoLT5zb2Zmc2V0KTsKIAkJCWZpYmgtPmVvZmZzZXQgPSBmaWJoLT5zb2Zmc2V0ICsgZmlfbGVuOwogCQl9IGVsc2UgewogCQkJbWVtY3B5KCh1aW50OF90ICopY2ZpLCAodWludDhfdCAqKWZpLApAQCAtMjEwLDExICsyMjIsMTAgQEAKIAogCXB0ciA9IGJ1ZmZlcjsKIAotCWlmICgoKm9mZnNldCA+IDApICYmICgqb2Zmc2V0IDwgYnVmc2l6ZSkpIHsKKwlpZiAoKCpvZmZzZXQgPiAwKSAmJiAoKm9mZnNldCA8IGJ1ZnNpemUpKQogCQlwdHIgKz0gKm9mZnNldDsKLQl9CiAJZmkgPSAoc3RydWN0IGZpbGVJZGVudERlc2MgKilwdHI7Ci0JaWYgKGxlMTZfdG9fY3B1KGZpLT5kZXNjVGFnLnRhZ0lkZW50KSAhPSBUQUdfSURFTlRfRklEKSB7CisJaWYgKGZpLT5kZXNjVGFnLnRhZ0lkZW50ICE9IGNwdV90b19sZTE2KFRBR19JREVOVF9GSUQpKSB7CiAJCXVkZl9kZWJ1ZygiMHgleCAhPSBUQUdfSURFTlRfRklEXG4iLAogCQkJICBsZTE2X3RvX2NwdShmaS0+ZGVzY1RhZy50YWdJZGVudCkpOwogCQl1ZGZfZGVidWcoIm9mZnNldDogJXUgc2l6ZW9mOiAlbHUgYnVmc2l6ZTogJXVcbiIsCkBAIC0yMjIsMTIgKzIzMywxMSBAQAogCQkJICBidWZzaXplKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCWlmICgoKm9mZnNldCArIHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYykpID4gYnVmc2l6ZSkgeworCWlmICgoKm9mZnNldCArIHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYykpID4gYnVmc2l6ZSkKIAkJbGVuZ3RoVGhpc0lkZW50ID0gc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKTsKLQl9IGVsc2UgeworCWVsc2UKIAkJbGVuZ3RoVGhpc0lkZW50ID0gc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKSArCiAJCQlmaS0+bGVuZ3RoRmlsZUlkZW50ICsgbGUxNl90b19jcHUoZmktPmxlbmd0aE9mSW1wVXNlKTsKLQl9CiAKIAkvKiB3ZSBuZWVkIHRvIGZpZ3VyZSBwYWRkaW5nLCB0b28hICovCiAJcGFkbGVuID0gbGVuZ3RoVGhpc0lkZW50ICUgVURGX05BTUVfUEFEOwpAQCAtMjUyLDE3ICsyNjIsMTcgQEAKIAogCWZlID0gKHN0cnVjdCBmaWxlRW50cnkgKilidWZmZXI7CiAKLQlpZiAobGUxNl90b19jcHUoZmUtPmRlc2NUYWcudGFnSWRlbnQpICE9IFRBR19JREVOVF9GRSkgeworCWlmIChmZS0+ZGVzY1RhZy50YWdJZGVudCAhPSBjcHVfdG9fbGUxNihUQUdfSURFTlRfRkUpKSB7CiAJCXVkZl9kZWJ1ZygiMHgleCAhPSBUQUdfSURFTlRfRkVcbiIsCiAJCQkgIGxlMTZfdG9fY3B1KGZlLT5kZXNjVGFnLnRhZ0lkZW50KSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAotCXB0ciA9ICh1aW50OF90ICopKGZlLT5leHRlbmRlZEF0dHIpICsgbGUzMl90b19jcHUoZmUtPmxlbmd0aEV4dGVuZGVkQXR0cik7CisJcHRyID0gKHVpbnQ4X3QgKikoZmUtPmV4dGVuZGVkQXR0cikgKworCQlsZTMyX3RvX2NwdShmZS0+bGVuZ3RoRXh0ZW5kZWRBdHRyKTsKIAotCWlmICgoKm9mZnNldCA+IDApICYmICgqb2Zmc2V0IDwgbGUzMl90b19jcHUoZmUtPmxlbmd0aEFsbG9jRGVzY3MpKSkgeworCWlmICgoKm9mZnNldCA+IDApICYmICgqb2Zmc2V0IDwgbGUzMl90b19jcHUoZmUtPmxlbmd0aEFsbG9jRGVzY3MpKSkKIAkJcHRyICs9ICpvZmZzZXQ7Ci0JfQogCiAJZXh0ID0gKGV4dGVudF9hZCAqKXB0cjsKIApAQCAtMjcxLDcgKzI4MSw3IEBACiB9CiAjZW5kaWYKIAotc2hvcnRfYWQgKnVkZl9nZXRfZmlsZXNob3J0YWQodWludDhfdCAqcHRyLCBpbnQgbWF4b2Zmc2V0LCBpbnQgKm9mZnNldCwKK3Nob3J0X2FkICp1ZGZfZ2V0X2ZpbGVzaG9ydGFkKHVpbnQ4X3QgKnB0ciwgaW50IG1heG9mZnNldCwgdWludDMyX3QgKm9mZnNldCwKIAkJCSAgICAgIGludCBpbmMpCiB7CiAJc2hvcnRfYWQgKnNhOwpAQCAtMjgxLDE3ICsyOTEsMjAgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JaWYgKCgqb2Zmc2V0IDwgMCkgfHwgKCgqb2Zmc2V0ICsgc2l6ZW9mKHNob3J0X2FkKSkgPiBtYXhvZmZzZXQpKQorCWlmICgoKm9mZnNldCArIHNpemVvZihzaG9ydF9hZCkpID4gbWF4b2Zmc2V0KQogCQlyZXR1cm4gTlVMTDsKLQllbHNlIGlmICgoc2EgPSAoc2hvcnRfYWQgKilwdHIpLT5leHRMZW5ndGggPT0gMCkKLQkJcmV0dXJuIE5VTEw7CisJZWxzZSB7CisJCXNhID0gKHNob3J0X2FkICopcHRyOworCQlpZiAoc2EtPmV4dExlbmd0aCA9PSAwKQorCQkJcmV0dXJuIE5VTEw7CisJfQogCiAJaWYgKGluYykKIAkJKm9mZnNldCArPSBzaXplb2Yoc2hvcnRfYWQpOwogCXJldHVybiBzYTsKIH0KIAotbG9uZ19hZCAqdWRmX2dldF9maWxlbG9uZ2FkKHVpbnQ4X3QgKnB0ciwgaW50IG1heG9mZnNldCwgaW50ICpvZmZzZXQsIGludCBpbmMpCitsb25nX2FkICp1ZGZfZ2V0X2ZpbGVsb25nYWQodWludDhfdCAqcHRyLCBpbnQgbWF4b2Zmc2V0LCB1aW50MzJfdCAqb2Zmc2V0LCBpbnQgaW5jKQogewogCWxvbmdfYWQgKmxhOwogCkBAIC0zMDAsMTAgKzMxMywxMyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlpZiAoKCpvZmZzZXQgPCAwKSB8fCAoKCpvZmZzZXQgKyBzaXplb2YobG9uZ19hZCkpID4gbWF4b2Zmc2V0KSkKKwlpZiAoKCpvZmZzZXQgKyBzaXplb2YobG9uZ19hZCkpID4gbWF4b2Zmc2V0KQogCQlyZXR1cm4gTlVMTDsKLQllbHNlIGlmICgobGEgPSAobG9uZ19hZCAqKXB0ciktPmV4dExlbmd0aCA9PSAwKQotCQlyZXR1cm4gTlVMTDsKKwllbHNlIHsKKwkJbGEgPSAobG9uZ19hZCAqKXB0cjsKKwkJaWYgKGxhLT5leHRMZW5ndGggPT0gMCkKKwkJCXJldHVybiBOVUxMOworCX0KIAogCWlmIChpbmMpCiAJCSpvZmZzZXQgKz0gc2l6ZW9mKGxvbmdfYWQpOwpkaWZmIC0tZ2l0IGEvZnMvdWRmL2ZpbGUuYyBiL2ZzL3VkZi9maWxlLmMKaW5kZXggN2M3YTFiMy4uOTdjNzFhZSAxMDA2NDQKLS0tIGEvZnMvdWRmL2ZpbGUuYworKysgYi9mcy91ZGYvZmlsZS5jCkBAIC00NSwxMiArNDUsMTMgQEAKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKIAljaGFyICprYWRkcjsKKwlzdHJ1Y3QgdWRmX2lub2RlX2luZm8gKmlpbmZvID0gVURGX0koaW5vZGUpOwogCiAJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKIAogCWthZGRyID0ga21hcChwYWdlKTsKIAltZW1zZXQoa2FkZHIsIDAsIFBBR0VfQ0FDSEVfU0laRSk7Ci0JbWVtY3B5KGthZGRyLCBVREZfSV9EQVRBKGlub2RlKSArIFVERl9JX0xFTkVBVFRSKGlub2RlKSwgaW5vZGUtPmlfc2l6ZSk7CisJbWVtY3B5KGthZGRyLCBpaW5mby0+aV9leHQuaV9kYXRhICsgaWluZm8tPmlfbGVuRUF0dHIsIGlub2RlLT5pX3NpemUpOwogCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwogCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKIAlrdW5tYXAocGFnZSk7CkBAIC01OSwxNSArNjAsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB1ZGZfYWRpbmljYl93cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQorc3RhdGljIGludCB1ZGZfYWRpbmljYl93cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OwogCWNoYXIgKmthZGRyOworCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqaWluZm8gPSBVREZfSShpbm9kZSk7CiAKIAlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOwogCiAJa2FkZHIgPSBrbWFwKHBhZ2UpOwotCW1lbWNweShVREZfSV9EQVRBKGlub2RlKSArIFVERl9JX0xFTkVBVFRSKGlub2RlKSwga2FkZHIsIGlub2RlLT5pX3NpemUpOworCW1lbWNweShpaW5mby0+aV9leHQuaV9kYXRhICsgaWluZm8tPmlfbGVuRUF0dHIsIGthZGRyLCBpbm9kZS0+aV9zaXplKTsKIAltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CiAJa3VubWFwKHBhZ2UpOwpAQCAtODQsOSArODcsMTAgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKIAl1bnNpZ25lZCBvZmZzZXQgPSBwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CiAJY2hhciAqa2FkZHI7CisJc3RydWN0IHVkZl9pbm9kZV9pbmZvICppaW5mbyA9IFVERl9JKGlub2RlKTsKIAogCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwotCW1lbWNweShVREZfSV9EQVRBKGlub2RlKSArIFVERl9JX0xFTkVBVFRSKGlub2RlKSArIG9mZnNldCwKKwltZW1jcHkoaWluZm8tPmlfZXh0LmlfZGF0YSArIGlpbmZvLT5pX2xlbkVBdHRyICsgb2Zmc2V0LAogCQlrYWRkciArIG9mZnNldCwgY29waWVkKTsKIAlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CiAKQEAgLTEwOSwyNSArMTEzLDI3IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJaW50IGVyciwgcG9zOwogCXNpemVfdCBjb3VudCA9IGlvY2ItPmtpX2xlZnQ7CisJc3RydWN0IHVkZl9pbm9kZV9pbmZvICppaW5mbyA9IFVERl9JKGlub2RlKTsKIAotCWlmIChVREZfSV9BTExPQ1RZUEUoaW5vZGUpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikgeworCWlmIChpaW5mby0+aV9hbGxvY190eXBlID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikgewogCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fQVBQRU5EKQogCQkJcG9zID0gaW5vZGUtPmlfc2l6ZTsKIAkJZWxzZQogCQkJcG9zID0gcHBvczsKIAotCQlpZiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIDwgKHVkZl9maWxlX2VudHJ5X2FsbG9jX29mZnNldChpbm9kZSkgKworCQlpZiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIDwKKwkJCQkodWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKSArCiAJCQkJCQlwb3MgKyBjb3VudCkpIHsKIAkJCXVkZl9leHBhbmRfZmlsZV9hZGluaWNiKGlub2RlLCBwb3MgKyBjb3VudCwgJmVycik7Ci0JCQlpZiAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpIHsKKwkJCWlmIChpaW5mby0+aV9hbGxvY190eXBlID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikgewogCQkJCXVkZl9kZWJ1ZygidWRmX2V4cGFuZF9hZGluaWNiOiBlcnI9JWRcbiIsIGVycik7CiAJCQkJcmV0dXJuIGVycjsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCWlmIChwb3MgKyBjb3VudCA+IGlub2RlLT5pX3NpemUpCi0JCQkJVURGX0lfTEVOQUxMT0MoaW5vZGUpID0gcG9zICsgY291bnQ7CisJCQkJaWluZm8tPmlfbGVuQWxsb2MgPSBwb3MgKyBjb3VudDsKIAkJCWVsc2UKLQkJCQlVREZfSV9MRU5BTExPQyhpbm9kZSkgPSBpbm9kZS0+aV9zaXplOworCQkJCWlpbmZvLT5pX2xlbkFsbG9jID0gaW5vZGUtPmlfc2l6ZTsKIAkJfQogCX0KIApAQCAtMTkxLDIzICsxOTcsMjggQEAKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBVREZfR0VUVk9MSURFTlQ6Ci0JCXJldHVybiBjb3B5X3RvX3VzZXIoKGNoYXIgX191c2VyICopYXJnLAotCQkJCSAgICBVREZfU0JfVk9MSURFTlQoaW5vZGUtPmlfc2IpLCAzMikgPyAtRUZBVUxUIDogMDsKKwkJaWYgKGNvcHlfdG9fdXNlcigoY2hhciBfX3VzZXIgKilhcmcsCisJCQkJIFVERl9TQihpbm9kZS0+aV9zYiktPnNfdm9sdW1lX2lkZW50LCAzMikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CiAJY2FzZSBVREZfUkVMT0NBVEVfQkxPQ0tTOgogCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCQlyZXR1cm4gLUVBQ0NFUzsKIAkJaWYgKGdldF91c2VyKG9sZF9ibG9jaywgKGxvbmcgX191c2VyICopYXJnKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQlpZiAoKHJlc3VsdCA9IHVkZl9yZWxvY2F0ZV9ibG9ja3MoaW5vZGUtPmlfc2IsCi0JCQkJCQkgIG9sZF9ibG9jaywgJm5ld19ibG9jaykpID09IDApCisJCXJlc3VsdCA9IHVkZl9yZWxvY2F0ZV9ibG9ja3MoaW5vZGUtPmlfc2IsCisJCQkJCQlvbGRfYmxvY2ssICZuZXdfYmxvY2spOworCQlpZiAocmVzdWx0ID09IDApCiAJCQlyZXN1bHQgPSBwdXRfdXNlcihuZXdfYmxvY2ssIChsb25nIF9fdXNlciAqKWFyZyk7CiAJCXJldHVybiByZXN1bHQ7CiAJY2FzZSBVREZfR0VURUFTSVpFOgotCQlyZXN1bHQgPSBwdXRfdXNlcihVREZfSV9MRU5FQVRUUihpbm9kZSksIChpbnQgX191c2VyICopYXJnKTsKKwkJcmVzdWx0ID0gcHV0X3VzZXIoVURGX0koaW5vZGUpLT5pX2xlbkVBdHRyLCAoaW50IF9fdXNlciAqKWFyZyk7CiAJCWJyZWFrOwogCWNhc2UgVURGX0dFVEVBQkxPQ0s6Ci0JCXJlc3VsdCA9IGNvcHlfdG9fdXNlcigoY2hhciBfX3VzZXIgKilhcmcsIFVERl9JX0RBVEEoaW5vZGUpLAotCQkJCSAgICAgIFVERl9JX0xFTkVBVFRSKGlub2RlKSkgPyAtRUZBVUxUIDogMDsKKwkJcmVzdWx0ID0gY29weV90b191c2VyKChjaGFyIF9fdXNlciAqKWFyZywKKwkJCQkgICAgICBVREZfSShpbm9kZSktPmlfZXh0LmlfZGF0YSwKKwkJCQkgICAgICBVREZfSShpbm9kZSktPmlfbGVuRUF0dHIpID8gLUVGQVVMVCA6IDA7CiAJCWJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvZnMvdWRmL2lhbGxvYy5jIGIvZnMvdWRmL2lhbGxvYy5jCmluZGV4IDYzNmQ4ZjYuLjg0MzYwMzE1IDEwMDY0NAotLS0gYS9mcy91ZGYvaWFsbG9jLmMKKysrIGIvZnMvdWRmL2lhbGxvYy5jCkBAIC00MywxOSArNDMsMjEgQEAKIAljbGVhcl9pbm9kZShpbm9kZSk7CiAKIAltdXRleF9sb2NrKCZzYmktPnNfYWxsb2NfbXV0ZXgpOwotCWlmIChzYmktPnNfbHZpZGJoKSB7CisJaWYgKHNiaS0+c19sdmlkX2JoKSB7CisJCXN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzY0ltcFVzZSAqbHZpZGl1ID0KKwkJCQkJCQl1ZGZfc2JfbHZpZGl1KHNiaSk7CiAJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQotCQkJVURGX1NCX0xWSURJVShzYiktPm51bURpcnMgPQotCQkJCWNwdV90b19sZTMyKGxlMzJfdG9fY3B1KFVERl9TQl9MVklESVUoc2IpLT5udW1EaXJzKSAtIDEpOworCQkJbHZpZGl1LT5udW1EaXJzID0KKwkJCQljcHVfdG9fbGUzMihsZTMyX3RvX2NwdShsdmlkaXUtPm51bURpcnMpIC0gMSk7CiAJCWVsc2UKLQkJCVVERl9TQl9MVklESVUoc2IpLT5udW1GaWxlcyA9Ci0JCQkJY3B1X3RvX2xlMzIobGUzMl90b19jcHUoVURGX1NCX0xWSURJVShzYiktPm51bUZpbGVzKSAtIDEpOworCQkJbHZpZGl1LT5udW1GaWxlcyA9CisJCQkJY3B1X3RvX2xlMzIobGUzMl90b19jcHUobHZpZGl1LT5udW1GaWxlcykgLSAxKTsKIAotCQltYXJrX2J1ZmZlcl9kaXJ0eShzYmktPnNfbHZpZGJoKTsKKwkJbWFya19idWZmZXJfZGlydHkoc2JpLT5zX2x2aWRfYmgpOwogCX0KIAltdXRleF91bmxvY2soJnNiaS0+c19hbGxvY19tdXRleCk7CiAKLQl1ZGZfZnJlZV9ibG9ja3Moc2IsIE5VTEwsIFVERl9JX0xPQ0FUSU9OKGlub2RlKSwgMCwgMSk7CisJdWRmX2ZyZWVfYmxvY2tzKHNiLCBOVUxMLCBVREZfSShpbm9kZSktPmlfbG9jYXRpb24sIDAsIDEpOwogfQogCiBzdHJ1Y3QgaW5vZGUgKnVkZl9uZXdfaW5vZGUoc3RydWN0IGlub2RlICpkaXIsIGludCBtb2RlLCBpbnQgKmVycikKQEAgLTY0LDcgKzY2LDkgQEAKIAlzdHJ1Y3QgdWRmX3NiX2luZm8gKnNiaSA9IFVERl9TQihzYik7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlpbnQgYmxvY2s7Ci0JdWludDMyX3Qgc3RhcnQgPSBVREZfSV9MT0NBVElPTihkaXIpLmxvZ2ljYWxCbG9ja051bTsKKwl1aW50MzJfdCBzdGFydCA9IFVERl9JKGRpciktPmlfbG9jYXRpb24ubG9naWNhbEJsb2NrTnVtOworCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqaWluZm87CisJc3RydWN0IHVkZl9pbm9kZV9pbmZvICpkaW5mbyA9IFVERl9JKGRpcik7CiAKIAlpbm9kZSA9IG5ld19pbm9kZShzYik7CiAKQEAgLTc0LDEzICs3OCwxNSBAQAogCX0KIAkqZXJyID0gLUVOT1NQQzsKIAotCVVERl9JX1VOSVFVRShpbm9kZSkgPSAwOwotCVVERl9JX0xFTkVYVEVOVFMoaW5vZGUpID0gMDsKLQlVREZfSV9ORVhUX0FMTE9DX0JMT0NLKGlub2RlKSA9IDA7Ci0JVURGX0lfTkVYVF9BTExPQ19HT0FMKGlub2RlKSA9IDA7Ci0JVURGX0lfU1RSQVQ0MDk2KGlub2RlKSA9IDA7CisJaWluZm8gPSBVREZfSShpbm9kZSk7CisJaWluZm8tPmlfdW5pcXVlID0gMDsKKwlpaW5mby0+aV9sZW5FeHRlbnRzID0gMDsKKwlpaW5mby0+aV9uZXh0X2FsbG9jX2Jsb2NrID0gMDsKKwlpaW5mby0+aV9uZXh0X2FsbG9jX2dvYWwgPSAwOworCWlpbmZvLT5pX3N0cmF0NDA5NiA9IDA7CiAKLQlibG9jayA9IHVkZl9uZXdfYmxvY2soZGlyLT5pX3NiLCBOVUxMLCBVREZfSV9MT0NBVElPTihkaXIpLnBhcnRpdGlvblJlZmVyZW5jZU51bSwKKwlibG9jayA9IHVkZl9uZXdfYmxvY2soZGlyLT5pX3NiLCBOVUxMLAorCQkJICAgICAgZGluZm8tPmlfbG9jYXRpb24ucGFydGl0aW9uUmVmZXJlbmNlTnVtLAogCQkJICAgICAgc3RhcnQsIGVycik7CiAJaWYgKCplcnIpIHsKIAkJaXB1dChpbm9kZSk7CkBAIC04OCwyMSArOTQsMjcgQEAKIAl9CiAKIAltdXRleF9sb2NrKCZzYmktPnNfYWxsb2NfbXV0ZXgpOwotCWlmIChVREZfU0JfTFZJREJIKHNiKSkgeworCWlmIChzYmktPnNfbHZpZF9iaCkgeworCQlzdHJ1Y3QgbG9naWNhbFZvbEludGVncml0eURlc2MgKmx2aWQgPQorCQkJKHN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzYyAqKQorCQkJc2JpLT5zX2x2aWRfYmgtPmJfZGF0YTsKKwkJc3RydWN0IGxvZ2ljYWxWb2xJbnRlZ3JpdHlEZXNjSW1wVXNlICpsdmlkaXUgPQorCQkJCQkJCXVkZl9zYl9sdmlkaXUoc2JpKTsKIAkJc3RydWN0IGxvZ2ljYWxWb2xIZWFkZXJEZXNjICpsdmhkOwogCQl1aW50NjRfdCB1bmlxdWVJRDsKLQkJbHZoZCA9IChzdHJ1Y3QgbG9naWNhbFZvbEhlYWRlckRlc2MgKikoVURGX1NCX0xWSUQoc2IpLT5sb2dpY2FsVm9sQ29udGVudHNVc2UpOworCQlsdmhkID0gKHN0cnVjdCBsb2dpY2FsVm9sSGVhZGVyRGVzYyAqKQorCQkJCShsdmlkLT5sb2dpY2FsVm9sQ29udGVudHNVc2UpOwogCQlpZiAoU19JU0RJUihtb2RlKSkKLQkJCVVERl9TQl9MVklESVUoc2IpLT5udW1EaXJzID0KLQkJCQljcHVfdG9fbGUzMihsZTMyX3RvX2NwdShVREZfU0JfTFZJRElVKHNiKS0+bnVtRGlycykgKyAxKTsKKwkJCWx2aWRpdS0+bnVtRGlycyA9CisJCQkJY3B1X3RvX2xlMzIobGUzMl90b19jcHUobHZpZGl1LT5udW1EaXJzKSArIDEpOwogCQllbHNlCi0JCQlVREZfU0JfTFZJRElVKHNiKS0+bnVtRmlsZXMgPQotCQkJCWNwdV90b19sZTMyKGxlMzJfdG9fY3B1KFVERl9TQl9MVklESVUoc2IpLT5udW1GaWxlcykgKyAxKTsKLQkJVURGX0lfVU5JUVVFKGlub2RlKSA9IHVuaXF1ZUlEID0gbGU2NF90b19jcHUobHZoZC0+dW5pcXVlSUQpOworCQkJbHZpZGl1LT5udW1GaWxlcyA9CisJCQkJY3B1X3RvX2xlMzIobGUzMl90b19jcHUobHZpZGl1LT5udW1GaWxlcykgKyAxKTsKKwkJaWluZm8tPmlfdW5pcXVlID0gdW5pcXVlSUQgPSBsZTY0X3RvX2NwdShsdmhkLT51bmlxdWVJRCk7CiAJCWlmICghKCsrdW5pcXVlSUQgJiAweDAwMDAwMDAwRkZGRkZGRkZVTCkpCiAJCQl1bmlxdWVJRCArPSAxNjsKIAkJbHZoZC0+dW5pcXVlSUQgPSBjcHVfdG9fbGU2NCh1bmlxdWVJRCk7Ci0JCW1hcmtfYnVmZmVyX2RpcnR5KFVERl9TQl9MVklEQkgoc2IpKTsKKwkJbWFya19idWZmZXJfZGlydHkoc2JpLT5zX2x2aWRfYmgpOwogCX0KIAlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAlpbm9kZS0+aV91aWQgPSBjdXJyZW50LT5mc3VpZDsKQEAgLTExNCwzNSArMTI2LDQxIEBACiAJCWlub2RlLT5pX2dpZCA9IGN1cnJlbnQtPmZzZ2lkOwogCX0KIAotCVVERl9JX0xPQ0FUSU9OKGlub2RlKS5sb2dpY2FsQmxvY2tOdW0gPSBibG9jazsKLQlVREZfSV9MT0NBVElPTihpbm9kZSkucGFydGl0aW9uUmVmZXJlbmNlTnVtID0gVURGX0lfTE9DQVRJT04oZGlyKS5wYXJ0aXRpb25SZWZlcmVuY2VOdW07Ci0JaW5vZGUtPmlfaW5vID0gdWRmX2dldF9sYl9wYmxvY2soc2IsIFVERl9JX0xPQ0FUSU9OKGlub2RlKSwgMCk7CisJaWluZm8tPmlfbG9jYXRpb24ubG9naWNhbEJsb2NrTnVtID0gYmxvY2s7CisJaWluZm8tPmlfbG9jYXRpb24ucGFydGl0aW9uUmVmZXJlbmNlTnVtID0KKwkJCQlkaW5mby0+aV9sb2NhdGlvbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW07CisJaW5vZGUtPmlfaW5vID0gdWRmX2dldF9sYl9wYmxvY2soc2IsIGlpbmZvLT5pX2xvY2F0aW9uLCAwKTsKIAlpbm9kZS0+aV9ibG9ja3MgPSAwOwotCVVERl9JX0xFTkVBVFRSKGlub2RlKSA9IDA7Ci0JVURGX0lfTEVOQUxMT0MoaW5vZGUpID0gMDsKLQlVREZfSV9VU0UoaW5vZGUpID0gMDsKKwlpaW5mby0+aV9sZW5FQXR0ciA9IDA7CisJaWluZm8tPmlfbGVuQWxsb2MgPSAwOworCWlpbmZvLT5pX3VzZSA9IDA7CiAJaWYgKFVERl9RVUVSWV9GTEFHKGlub2RlLT5pX3NiLCBVREZfRkxBR19VU0VfRVhURU5ERURfRkUpKSB7Ci0JCVVERl9JX0VGRShpbm9kZSkgPSAxOwotCQlVREZfVVBEQVRFX1VERlJFVihpbm9kZS0+aV9zYiwgVURGX1ZFUlNfVVNFX0VYVEVOREVEX0ZFKTsKLQkJVURGX0lfREFUQShpbm9kZSkgPSBremFsbG9jKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkpLCBHRlBfS0VSTkVMKTsKKwkJaWluZm8tPmlfZWZlID0gMTsKKwkJaWYgKFVERl9WRVJTX1VTRV9FWFRFTkRFRF9GRSA+IHNiaS0+c191ZGZyZXYpCisJCQlzYmktPnNfdWRmcmV2ID0gVURGX1ZFUlNfVVNFX0VYVEVOREVEX0ZFOworCQlpaW5mby0+aV9leHQuaV9kYXRhID0ga3phbGxvYyhpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLQorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEZpbGVFbnRyeSksCisJCQkJCSAgICBHRlBfS0VSTkVMKTsKIAl9IGVsc2UgewotCQlVREZfSV9FRkUoaW5vZGUpID0gMDsKLQkJVURGX0lfREFUQShpbm9kZSkgPSBremFsbG9jKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KSwgR0ZQX0tFUk5FTCk7CisJCWlpbmZvLT5pX2VmZSA9IDA7CisJCWlpbmZvLT5pX2V4dC5pX2RhdGEgPSBremFsbG9jKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSksCisJCQkJCSAgICBHRlBfS0VSTkVMKTsKIAl9Ci0JaWYgKCFVREZfSV9EQVRBKGlub2RlKSkgeworCWlmICghaWluZm8tPmlfZXh0LmlfZGF0YSkgewogCQlpcHV0KGlub2RlKTsKIAkJKmVyciA9IC1FTk9NRU07CiAJCW11dGV4X3VubG9jaygmc2JpLT5zX2FsbG9jX211dGV4KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCWlmIChVREZfUVVFUllfRkxBRyhpbm9kZS0+aV9zYiwgVURGX0ZMQUdfVVNFX0FEX0lOX0lDQikpCi0JCVVERl9JX0FMTE9DVFlQRShpbm9kZSkgPSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0I7CisJCWlpbmZvLT5pX2FsbG9jX3R5cGUgPSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0I7CiAJZWxzZSBpZiAoVURGX1FVRVJZX0ZMQUcoaW5vZGUtPmlfc2IsIFVERl9GTEFHX1VTRV9TSE9SVF9BRCkpCi0JCVVERl9JX0FMTE9DVFlQRShpbm9kZSkgPSBJQ0JUQUdfRkxBR19BRF9TSE9SVDsKKwkJaWluZm8tPmlfYWxsb2NfdHlwZSA9IElDQlRBR19GTEFHX0FEX1NIT1JUOwogCWVsc2UKLQkJVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9IElDQlRBR19GTEFHX0FEX0xPTkc7CisJCWlpbmZvLT5pX2FsbG9jX3R5cGUgPSBJQ0JUQUdfRkxBR19BRF9MT05HOwogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9Ci0JCVVERl9JX0NSVElNRShpbm9kZSkgPSBjdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOworCQlpaW5mby0+aV9jcnRpbWUgPSBjdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOwogCWluc2VydF9pbm9kZV9oYXNoKGlub2RlKTsKIAltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAltdXRleF91bmxvY2soJnNiaS0+c19hbGxvY19tdXRleCk7CmRpZmYgLS1naXQgYS9mcy91ZGYvaW5vZGUuYyBiL2ZzL3VkZi9pbm9kZS5jCmluZGV4IDZmZjgxNTEuLjI0Y2ZhNTUgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9pbm9kZS5jCisrKyBiL2ZzL3VkZi9pbm9kZS5jCkBAIC0xOSw3ICsxOSw4IEBACiAgKiAgMTAvMDQvOTggZGdiICBBZGRlZCBydWRpbWVudGFyeSBkaXJlY3RvcnkgZnVuY3Rpb25zCiAgKiAgMTAvMDcvOTggICAgICBGdWxseSB3b3JraW5nIHVkZl9ibG9ja19tYXAhIEl0IHdvcmtzIQogICogIDExLzI1Lzk4ICAgICAgYm1hcCBhbHRlcmVkIHRvIGJldHRlciBzdXBwb3J0IGV4dGVudHMKLSAqICAxMi8wNi85OCBibGYgIHBhcnRpdGlvbiBzdXBwb3J0IGluIHVkZl9pZ2V0LCB1ZGZfYmxvY2tfbWFwIGFuZCB1ZGZfcmVhZF9pbm9kZQorICogIDEyLzA2Lzk4IGJsZiAgcGFydGl0aW9uIHN1cHBvcnQgaW4gdWRmX2lnZXQsIHVkZl9ibG9ja19tYXAKKyAqICAgICAgICAgICAgICAgIGFuZCB1ZGZfcmVhZF9pbm9kZQogICogIDEyLzEyLzk4ICAgICAgcmV3cm90ZSB1ZGZfYmxvY2tfbWFwIHRvIGhhbmRsZSBuZXh0IGV4dGVudHMgYW5kIGRlc2NzIGFjcm9zcwogICogICAgICAgICAgICAgICAgYmxvY2sgYm91bmRhcmllcyAod2hpY2ggaXMgbm90IGFjdHVhbGx5IGFsbG93ZWQpCiAgKiAgMTIvMjAvOTggICAgICBhZGRlZCBzdXBwb3J0IGZvciBzdHJhdGVneSA0MDk2CkBAIC01MSw3ICs1Miw3IEBACiBzdGF0aWMgdm9pZCB1ZGZfZmlsbF9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICopOwogc3RhdGljIGludCB1ZGZfYWxsb2NfaV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNpemVfdCBzaXplKTsKIHN0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmlub2RlX2dldGJsayhzdHJ1Y3QgaW5vZGUgKiwgc2VjdG9yX3QsIGludCAqLAotCQkJCQlsb25nICosIGludCAqKTsKKwkJCQkJc2VjdG9yX3QgKiwgaW50ICopOwogc3RhdGljIGludDhfdCB1ZGZfaW5zZXJ0X2FleHQoc3RydWN0IGlub2RlICosIHN0cnVjdCBleHRlbnRfcG9zaXRpb24sCiAJCQkgICAgICBrZXJuZWxfbGJfYWRkciwgdWludDMyX3QpOwogc3RhdGljIHZvaWQgdWRmX3NwbGl0X2V4dGVudHMoc3RydWN0IGlub2RlICosIGludCAqLCBpbnQsIGludCwKQEAgLTExMSwxNiArMTEyLDE4IEBACiAgKi8KIHZvaWQgdWRmX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CisJc3RydWN0IHVkZl9pbm9kZV9pbmZvICppaW5mbzsKIAlpZiAoIShpbm9kZS0+aV9zYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKIAkJbG9ja19rZXJuZWwoKTsKIAkJLyogRGlzY2FyZCBwcmVhbGxvY2F0aW9uIGZvciBkaXJlY3Rvcmllcywgc3ltbGlua3MsIGV0Yy4gKi8KIAkJdWRmX2Rpc2NhcmRfcHJlYWxsb2MoaW5vZGUpOwogCQl1ZGZfdHJ1bmNhdGVfdGFpbF9leHRlbnQoaW5vZGUpOwogCQl1bmxvY2tfa2VybmVsKCk7Ci0JCXdyaXRlX2lub2RlX25vdyhpbm9kZSwgMSk7CisJCXdyaXRlX2lub2RlX25vdyhpbm9kZSwgMCk7CiAJfQotCWtmcmVlKFVERl9JX0RBVEEoaW5vZGUpKTsKLQlVREZfSV9EQVRBKGlub2RlKSA9IE5VTEw7CisJaWluZm8gPSBVREZfSShpbm9kZSk7CisJa2ZyZWUoaWluZm8tPmlfZXh0LmlfZGF0YSk7CisJaWluZm8tPmlfZXh0LmlfZGF0YSA9IE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQgdWRmX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCkBAIC0xNjAsNiArMTYzLDcgQEAKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAljaGFyICprYWRkcjsKKwlzdHJ1Y3QgdWRmX2lub2RlX2luZm8gKmlpbmZvID0gVURGX0koaW5vZGUpOwogCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCB1ZGZfd2JjID0gewogCQkuc3luY19tb2RlID0gV0JfU1lOQ19OT05FLAogCQkubnJfdG9fd3JpdGUgPSAxLApAQCAtMTY4LDExICsxNzIsMTEgQEAKIAkvKiBmcm9tIG5vdyBvbiB3ZSBoYXZlIG5vcm1hbCBhZGRyZXNzX3NwYWNlIG1ldGhvZHMgKi8KIAlpbm9kZS0+aV9kYXRhLmFfb3BzID0gJnVkZl9hb3BzOwogCi0JaWYgKCFVREZfSV9MRU5BTExPQyhpbm9kZSkpIHsKKwlpZiAoIWlpbmZvLT5pX2xlbkFsbG9jKSB7CiAJCWlmIChVREZfUVVFUllfRkxBRyhpbm9kZS0+aV9zYiwgVURGX0ZMQUdfVVNFX1NIT1JUX0FEKSkKLQkJCVVERl9JX0FMTE9DVFlQRShpbm9kZSkgPSBJQ0JUQUdfRkxBR19BRF9TSE9SVDsKKwkJCWlpbmZvLT5pX2FsbG9jX3R5cGUgPSBJQ0JUQUdfRkxBR19BRF9TSE9SVDsKIAkJZWxzZQotCQkJVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9IElDQlRBR19GTEFHX0FEX0xPTkc7CisJCQlpaW5mby0+aV9hbGxvY190eXBlID0gSUNCVEFHX0ZMQUdfQURfTE9ORzsKIAkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJCXJldHVybjsKIAl9CkBAIC0xODIsMjEgKzE4NiwyMSBAQAogCiAJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKIAkJa2FkZHIgPSBrbWFwKHBhZ2UpOwotCQltZW1zZXQoa2FkZHIgKyBVREZfSV9MRU5BTExPQyhpbm9kZSksIDB4MDAsCi0JCSAgICAgICBQQUdFX0NBQ0hFX1NJWkUgLSBVREZfSV9MRU5BTExPQyhpbm9kZSkpOwotCQltZW1jcHkoa2FkZHIsIFVERl9JX0RBVEEoaW5vZGUpICsgVURGX0lfTEVORUFUVFIoaW5vZGUpLAotCQkgICAgICAgVURGX0lfTEVOQUxMT0MoaW5vZGUpKTsKKwkJbWVtc2V0KGthZGRyICsgaWluZm8tPmlfbGVuQWxsb2MsIDB4MDAsCisJCSAgICAgICBQQUdFX0NBQ0hFX1NJWkUgLSBpaW5mby0+aV9sZW5BbGxvYyk7CisJCW1lbWNweShrYWRkciwgaWluZm8tPmlfZXh0LmlfZGF0YSArIGlpbmZvLT5pX2xlbkVBdHRyLAorCQkJaWluZm8tPmlfbGVuQWxsb2MpOwogCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKIAkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwogCQlrdW5tYXAocGFnZSk7CiAJfQotCW1lbXNldChVREZfSV9EQVRBKGlub2RlKSArIFVERl9JX0xFTkVBVFRSKGlub2RlKSwgMHgwMCwKLQkgICAgICAgVURGX0lfTEVOQUxMT0MoaW5vZGUpKTsKLQlVREZfSV9MRU5BTExPQyhpbm9kZSkgPSAwOworCW1lbXNldChpaW5mby0+aV9leHQuaV9kYXRhICsgaWluZm8tPmlfbGVuRUF0dHIsIDB4MDAsCisJICAgICAgIGlpbmZvLT5pX2xlbkFsbG9jKTsKKwlpaW5mby0+aV9sZW5BbGxvYyA9IDA7CiAJaWYgKFVERl9RVUVSWV9GTEFHKGlub2RlLT5pX3NiLCBVREZfRkxBR19VU0VfU0hPUlRfQUQpKQotCQlVREZfSV9BTExPQ1RZUEUoaW5vZGUpID0gSUNCVEFHX0ZMQUdfQURfU0hPUlQ7CisJCWlpbmZvLT5pX2FsbG9jX3R5cGUgPSBJQ0JUQUdfRkxBR19BRF9TSE9SVDsKIAllbHNlCi0JCVVERl9JX0FMTE9DVFlQRShpbm9kZSkgPSBJQ0JUQUdfRkxBR19BRF9MT05HOworCQlpaW5mby0+aV9hbGxvY190eXBlID0gSUNCVEFHX0ZMQUdfQURfTE9ORzsKIAogCWlub2RlLT5pX2RhdGEuYV9vcHMtPndyaXRlcGFnZShwYWdlLCAmdWRmX3diYyk7CiAJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwpAQCAtMjE1LDkgKzIxOSwxMCBAQAogCXN0cnVjdCBleHRlbnRfcG9zaXRpb24gZXBvczsKIAogCXN0cnVjdCB1ZGZfZmlsZWlkZW50X2JoIHNmaWJoLCBkZmliaDsKLQlsb2ZmX3QgZl9wb3MgPSB1ZGZfZXh0MF9vZmZzZXQoaW5vZGUpID4+IDI7Ci0JaW50IHNpemUgPSAodWRmX2V4dDBfb2Zmc2V0KGlub2RlKSArIGlub2RlLT5pX3NpemUpID4+IDI7CisJbG9mZl90IGZfcG9zID0gdWRmX2V4dDBfb2Zmc2V0KGlub2RlKTsKKwlpbnQgc2l6ZSA9IHVkZl9leHQwX29mZnNldChpbm9kZSkgKyBpbm9kZS0+aV9zaXplOwogCXN0cnVjdCBmaWxlSWRlbnREZXNjIGNmaSwgKnNmaSwgKmRmaTsKKwlzdHJ1Y3QgdWRmX2lub2RlX2luZm8gKmlpbmZvID0gVURGX0koaW5vZGUpOwogCiAJaWYgKFVERl9RVUVSWV9GTEFHKGlub2RlLT5pX3NiLCBVREZfRkxBR19VU0VfU0hPUlRfQUQpKQogCQlhbGxvY3R5cGUgPSBJQ0JUQUdfRkxBR19BRF9TSE9SVDsKQEAgLTIyNSwxOSArMjMwLDIwIEBACiAJCWFsbG9jdHlwZSA9IElDQlRBR19GTEFHX0FEX0xPTkc7CiAKIAlpZiAoIWlub2RlLT5pX3NpemUpIHsKLQkJVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9IGFsbG9jdHlwZTsKKwkJaWluZm8tPmlfYWxsb2NfdHlwZSA9IGFsbG9jdHlwZTsKIAkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCS8qIGFsbG9jIGJsb2NrLCBhbmQgY29weSBkYXRhIHRvIGl0ICovCiAJKmJsb2NrID0gdWRmX25ld19ibG9jayhpbm9kZS0+aV9zYiwgaW5vZGUsCi0JCQkgICAgICAgVURGX0lfTE9DQVRJT04oaW5vZGUpLnBhcnRpdGlvblJlZmVyZW5jZU51bSwKLQkJCSAgICAgICBVREZfSV9MT0NBVElPTihpbm9kZSkubG9naWNhbEJsb2NrTnVtLCBlcnIpOworCQkJICAgICAgIGlpbmZvLT5pX2xvY2F0aW9uLnBhcnRpdGlvblJlZmVyZW5jZU51bSwKKwkJCSAgICAgICBpaW5mby0+aV9sb2NhdGlvbi5sb2dpY2FsQmxvY2tOdW0sIGVycik7CiAJaWYgKCEoKmJsb2NrKSkKIAkJcmV0dXJuIE5VTEw7CiAJbmV3YmxvY2sgPSB1ZGZfZ2V0X3BibG9jayhpbm9kZS0+aV9zYiwgKmJsb2NrLAotCQkJCSAgVURGX0lfTE9DQVRJT04oaW5vZGUpLnBhcnRpdGlvblJlZmVyZW5jZU51bSwgMCk7CisJCQkJICBpaW5mby0+aV9sb2NhdGlvbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW0sCisJCQkJMCk7CiAJaWYgKCFuZXdibG9jaykKIAkJcmV0dXJuIE5VTEw7CiAJZGJoID0gdWRmX3RnZXRibGsoaW5vZGUtPmlfc2IsIG5ld2Jsb2NrKTsKQEAgLTI0OSwzOSArMjU1LDQ0IEBACiAJdW5sb2NrX2J1ZmZlcihkYmgpOwogCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKGRiaCwgaW5vZGUpOwogCi0Jc2ZpYmguc29mZnNldCA9IHNmaWJoLmVvZmZzZXQgPSAoZl9wb3MgJiAoKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+IDIpKSA8PCAyOworCXNmaWJoLnNvZmZzZXQgPSBzZmliaC5lb2Zmc2V0ID0KKwkJCWZfcG9zICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpOwogCXNmaWJoLnNiaCA9IHNmaWJoLmViaCA9IE5VTEw7CiAJZGZpYmguc29mZnNldCA9IGRmaWJoLmVvZmZzZXQgPSAwOwogCWRmaWJoLnNiaCA9IGRmaWJoLmViaCA9IGRiaDsKLQl3aGlsZSAoKGZfcG9zIDwgc2l6ZSkpIHsKLQkJVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9IElDQlRBR19GTEFHX0FEX0lOX0lDQjsKLQkJc2ZpID0gdWRmX2ZpbGVpZGVudF9yZWFkKGlub2RlLCAmZl9wb3MsICZzZmliaCwgJmNmaSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJd2hpbGUgKGZfcG9zIDwgc2l6ZSkgeworCQlpaW5mby0+aV9hbGxvY190eXBlID0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCOworCQlzZmkgPSB1ZGZfZmlsZWlkZW50X3JlYWQoaW5vZGUsICZmX3BvcywgJnNmaWJoLCAmY2ZpLCBOVUxMLAorCQkJCQkgTlVMTCwgTlVMTCwgTlVMTCk7CiAJCWlmICghc2ZpKSB7CiAJCQlicmVsc2UoZGJoKTsKIAkJCXJldHVybiBOVUxMOwogCQl9Ci0JCVVERl9JX0FMTE9DVFlQRShpbm9kZSkgPSBhbGxvY3R5cGU7CisJCWlpbmZvLT5pX2FsbG9jX3R5cGUgPSBhbGxvY3R5cGU7CiAJCXNmaS0+ZGVzY1RhZy50YWdMb2NhdGlvbiA9IGNwdV90b19sZTMyKCpibG9jayk7CiAJCWRmaWJoLnNvZmZzZXQgPSBkZmliaC5lb2Zmc2V0OwogCQlkZmliaC5lb2Zmc2V0ICs9IChzZmliaC5lb2Zmc2V0IC0gc2ZpYmguc29mZnNldCk7CiAJCWRmaSA9IChzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqKShkYmgtPmJfZGF0YSArIGRmaWJoLnNvZmZzZXQpOwogCQlpZiAodWRmX3dyaXRlX2ZpKGlub2RlLCBzZmksIGRmaSwgJmRmaWJoLCBzZmktPmltcFVzZSwKLQkJCQkgc2ZpLT5maWxlSWRlbnQgKyBsZTE2X3RvX2NwdShzZmktPmxlbmd0aE9mSW1wVXNlKSkpIHsKLQkJCVVERl9JX0FMTE9DVFlQRShpbm9kZSkgPSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0I7CisJCQkJIHNmaS0+ZmlsZUlkZW50ICsKKwkJCQkJbGUxNl90b19jcHUoc2ZpLT5sZW5ndGhPZkltcFVzZSkpKSB7CisJCQlpaW5mby0+aV9hbGxvY190eXBlID0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCOwogCQkJYnJlbHNlKGRiaCk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCX0KIAltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShkYmgsIGlub2RlKTsKIAotCW1lbXNldChVREZfSV9EQVRBKGlub2RlKSArIFVERl9JX0xFTkVBVFRSKGlub2RlKSwgMCwgVURGX0lfTEVOQUxMT0MoaW5vZGUpKTsKLQlVREZfSV9MRU5BTExPQyhpbm9kZSkgPSAwOworCW1lbXNldChpaW5mby0+aV9leHQuaV9kYXRhICsgaWluZm8tPmlfbGVuRUF0dHIsIDAsCisJCWlpbmZvLT5pX2xlbkFsbG9jKTsKKwlpaW5mby0+aV9sZW5BbGxvYyA9IDA7CiAJZWxvYy5sb2dpY2FsQmxvY2tOdW0gPSAqYmxvY2s7Ci0JZWxvYy5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPSBVREZfSV9MT0NBVElPTihpbm9kZSkucGFydGl0aW9uUmVmZXJlbmNlTnVtOwotCWVsZW4gPSBpbm9kZS0+aV9zaXplOwotCVVERl9JX0xFTkVYVEVOVFMoaW5vZGUpID0gZWxlbjsKKwllbG9jLnBhcnRpdGlvblJlZmVyZW5jZU51bSA9CisJCQkJaWluZm8tPmlfbG9jYXRpb24ucGFydGl0aW9uUmVmZXJlbmNlTnVtOworCWVsZW4gPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJaWluZm8tPmlfbGVuRXh0ZW50cyA9IGVsZW47CiAJZXBvcy5iaCA9IE5VTEw7Ci0JZXBvcy5ibG9jayA9IFVERl9JX0xPQ0FUSU9OKGlub2RlKTsKKwllcG9zLmJsb2NrID0gaWluZm8tPmlfbG9jYXRpb247CiAJZXBvcy5vZmZzZXQgPSB1ZGZfZmlsZV9lbnRyeV9hbGxvY19vZmZzZXQoaW5vZGUpOwogCXVkZl9hZGRfYWV4dChpbm9kZSwgJmVwb3MsIGVsb2MsIGVsZW4sIDApOwogCS8qIFVuaXF1ZUlEIHN0dWZmICovCkBAIC0yOTYsNyArMzA3LDggQEAKIHsKIAlpbnQgZXJyLCBuZXc7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKLQl1bnNpZ25lZCBsb25nIHBoeXM7CisJc2VjdG9yX3QgcGh5cyA9IDA7CisJc3RydWN0IHVkZl9pbm9kZV9pbmZvICppaW5mbzsKIAogCWlmICghY3JlYXRlKSB7CiAJCXBoeXMgPSB1ZGZfYmxvY2tfbWFwKGlub2RlLCBibG9jayk7CkBAIC0zMTQsOSArMzI2LDEwIEBACiAJaWYgKGJsb2NrIDwgMCkKIAkJZ290byBhYm9ydF9uZWdhdGl2ZTsKIAotCWlmIChibG9jayA9PSBVREZfSV9ORVhUX0FMTE9DX0JMT0NLKGlub2RlKSArIDEpIHsKLQkJVURGX0lfTkVYVF9BTExPQ19CTE9DSyhpbm9kZSkrKzsKLQkJVURGX0lfTkVYVF9BTExPQ19HT0FMKGlub2RlKSsrOworCWlpbmZvID0gVURGX0koaW5vZGUpOworCWlmIChibG9jayA9PSBpaW5mby0+aV9uZXh0X2FsbG9jX2Jsb2NrICsgMSkgeworCQlpaW5mby0+aV9uZXh0X2FsbG9jX2Jsb2NrKys7CisJCWlpbmZvLT5pX25leHRfYWxsb2NfZ29hbCsrOwogCX0KIAogCWVyciA9IDA7CkBAIC0zNjYsMzIgKzM3OSwzNSBAQAogCiAvKiBFeHRlbmQgdGhlIGZpbGUgYnkgJ2Jsb2NrcycgYmxvY2tzLCByZXR1cm4gdGhlIG51bWJlciBvZiBleHRlbnRzIGFkZGVkICovCiBpbnQgdWRmX2V4dGVuZF9maWxlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHRlbnRfcG9zaXRpb24gKmxhc3RfcG9zLAotCQkgICAga2VybmVsX2xvbmdfYWQgKiBsYXN0X2V4dCwgc2VjdG9yX3QgYmxvY2tzKQorCQkgICAga2VybmVsX2xvbmdfYWQgKmxhc3RfZXh0LCBzZWN0b3JfdCBibG9ja3MpCiB7CiAJc2VjdG9yX3QgYWRkOwogCWludCBjb3VudCA9IDAsIGZha2UgPSAhKGxhc3RfZXh0LT5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKTsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAJa2VybmVsX2xiX2FkZHIgcHJlYWxsb2NfbG9jID0ge307CiAJaW50IHByZWFsbG9jX2xlbiA9IDA7CisJc3RydWN0IHVkZl9pbm9kZV9pbmZvICppaW5mbzsKIAogCS8qIFRoZSBwcmV2aW91cyBleHRlbnQgaXMgZmFrZSBhbmQgd2Ugc2hvdWxkIG5vdCBleHRlbmQgYnkgYW55dGhpbmcKIAkgKiAtIHRoZXJlJ3Mgbm90aGluZyB0byBkby4uLiAqLwogCWlmICghYmxvY2tzICYmIGZha2UpCiAJCXJldHVybiAwOwogCisJaWluZm8gPSBVREZfSShpbm9kZSk7CiAJLyogUm91bmQgdGhlIGxhc3QgZXh0ZW50IHVwIHRvIGEgbXVsdGlwbGUgb2YgYmxvY2sgc2l6ZSAqLwogCWlmIChsYXN0X2V4dC0+ZXh0TGVuZ3RoICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSB7CiAJCWxhc3RfZXh0LT5leHRMZW5ndGggPQogCQkJKGxhc3RfZXh0LT5leHRMZW5ndGggJiBVREZfRVhURU5UX0ZMQUdfTUFTSykgfAogCQkJKCgobGFzdF9leHQtPmV4dExlbmd0aCAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0spICsKIAkJCSAgc2ItPnNfYmxvY2tzaXplIC0gMSkgJiB+KHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpKTsKLQkJVURGX0lfTEVORVhURU5UUyhpbm9kZSkgPQotCQkJKFVERl9JX0xFTkVYVEVOVFMoaW5vZGUpICsgc2ItPnNfYmxvY2tzaXplIC0gMSkgJgorCQlpaW5mby0+aV9sZW5FeHRlbnRzID0KKwkJCShpaW5mby0+aV9sZW5FeHRlbnRzICsgc2ItPnNfYmxvY2tzaXplIC0gMSkgJgogCQkJfihzYi0+c19ibG9ja3NpemUgLSAxKTsKIAl9CiAKIAkvKiBMYXN0IGV4dGVudCBhcmUganVzdCBwcmVhbGxvY2F0ZWQgYmxvY2tzPyAqLwotCWlmICgobGFzdF9leHQtPmV4dExlbmd0aCAmIFVERl9FWFRFTlRfRkxBR19NQVNLKSA9PSBFWFRfTk9UX1JFQ09SREVEX0FMTE9DQVRFRCkgeworCWlmICgobGFzdF9leHQtPmV4dExlbmd0aCAmIFVERl9FWFRFTlRfRkxBR19NQVNLKSA9PQorCQkJCQkJRVhUX05PVF9SRUNPUkRFRF9BTExPQ0FURUQpIHsKIAkJLyogU2F2ZSB0aGUgZXh0ZW50IHNvIHRoYXQgd2UgY2FuIHJlYXR0YWNoIGl0IHRvIHRoZSBlbmQgKi8KIAkJcHJlYWxsb2NfbG9jID0gbGFzdF9leHQtPmV4dExvY2F0aW9uOwogCQlwcmVhbGxvY19sZW4gPSBsYXN0X2V4dC0+ZXh0TGVuZ3RoOwpAQCAtMzk5LDEzICs0MTUsMTUgQEAKIAkJbGFzdF9leHQtPmV4dExlbmd0aCA9IEVYVF9OT1RfUkVDT1JERURfTk9UX0FMTE9DQVRFRCB8CiAJCQkobGFzdF9leHQtPmV4dExlbmd0aCAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0spOwogCQlsYXN0X2V4dC0+ZXh0TG9jYXRpb24ubG9naWNhbEJsb2NrTnVtID0gMDsKLSAgICAgICAJCWxhc3RfZXh0LT5leHRMb2NhdGlvbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPSAwOworCQlsYXN0X2V4dC0+ZXh0TG9jYXRpb24ucGFydGl0aW9uUmVmZXJlbmNlTnVtID0gMDsKIAl9CiAKIAkvKiBDYW4gd2UgbWVyZ2Ugd2l0aCB0aGUgcHJldmlvdXMgZXh0ZW50PyAqLwotCWlmICgobGFzdF9leHQtPmV4dExlbmd0aCAmIFVERl9FWFRFTlRfRkxBR19NQVNLKSA9PSBFWFRfTk9UX1JFQ09SREVEX05PVF9BTExPQ0FURUQpIHsKLQkJYWRkID0gKCgxIDw8IDMwKSAtIHNiLT5zX2Jsb2Nrc2l6ZSAtIChsYXN0X2V4dC0+ZXh0TGVuZ3RoICYKLQkJCQkJCSAgICAgIFVERl9FWFRFTlRfTEVOR1RIX01BU0spKSA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKwlpZiAoKGxhc3RfZXh0LT5leHRMZW5ndGggJiBVREZfRVhURU5UX0ZMQUdfTUFTSykgPT0KKwkJCQkJRVhUX05PVF9SRUNPUkRFRF9OT1RfQUxMT0NBVEVEKSB7CisJCWFkZCA9ICgoMSA8PCAzMCkgLSBzYi0+c19ibG9ja3NpemUgLQorCQkJKGxhc3RfZXh0LT5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSkgPj4KKwkJCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwogCQlpZiAoYWRkID4gYmxvY2tzKQogCQkJYWRkID0gYmxvY2tzOwogCQlibG9ja3MgLT0gYWRkOwpAQCAtNDE2LDkgKzQzNCw5IEBACiAJCXVkZl9hZGRfYWV4dChpbm9kZSwgbGFzdF9wb3MsIGxhc3RfZXh0LT5leHRMb2NhdGlvbiwKIAkJCSAgICAgbGFzdF9leHQtPmV4dExlbmd0aCwgMSk7CiAJCWNvdW50Kys7Ci0JfSBlbHNlIHsKLQkJdWRmX3dyaXRlX2FleHQoaW5vZGUsIGxhc3RfcG9zLCBsYXN0X2V4dC0+ZXh0TG9jYXRpb24sIGxhc3RfZXh0LT5leHRMZW5ndGgsIDEpOwotCX0KKwl9IGVsc2UKKwkJdWRmX3dyaXRlX2FleHQoaW5vZGUsIGxhc3RfcG9zLCBsYXN0X2V4dC0+ZXh0TG9jYXRpb24sCisJCQkJbGFzdF9leHQtPmV4dExlbmd0aCwgMSk7CiAKIAkvKiBNYW5hZ2VkIHRvIGRvIGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5PyAqLwogCWlmICghYmxvY2tzKQpAQCAtNDI2LDkgKzQ0NCwxMCBAQAogCiAJLyogQWxsIGZ1cnRoZXIgZXh0ZW50cyB3aWxsIGJlIE5PVF9SRUNPUkRFRF9OT1RfQUxMT0NBVEVEICovCiAJbGFzdF9leHQtPmV4dExvY2F0aW9uLmxvZ2ljYWxCbG9ja051bSA9IDA7Ci0gICAgICAgCWxhc3RfZXh0LT5leHRMb2NhdGlvbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPSAwOworCWxhc3RfZXh0LT5leHRMb2NhdGlvbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPSAwOwogCWFkZCA9ICgxIDw8ICgzMC1zYi0+c19ibG9ja3NpemVfYml0cykpIC0gMTsKLQlsYXN0X2V4dC0+ZXh0TGVuZ3RoID0gRVhUX05PVF9SRUNPUkRFRF9OT1RfQUxMT0NBVEVEIHwgKGFkZCA8PCBzYi0+c19ibG9ja3NpemVfYml0cyk7CisJbGFzdF9leHQtPmV4dExlbmd0aCA9IEVYVF9OT1RfUkVDT1JERURfTk9UX0FMTE9DQVRFRCB8CisJCQkJKGFkZCA8PCBzYi0+c19ibG9ja3NpemVfYml0cyk7CiAKIAkvKiBDcmVhdGUgZW5vdWdoIGV4dGVudHMgdG8gY292ZXIgdGhlIHdob2xlIGhvbGUgKi8KIAl3aGlsZSAoYmxvY2tzID4gYWRkKSB7CkBAIC00NTAsNyArNDY5LDggQEAKIG91dDoKIAkvKiBEbyB3ZSBoYXZlIHNvbWUgcHJlYWxsb2NhdGVkIGJsb2NrcyBzYXZlZD8gKi8KIAlpZiAocHJlYWxsb2NfbGVuKSB7Ci0JCWlmICh1ZGZfYWRkX2FleHQoaW5vZGUsIGxhc3RfcG9zLCBwcmVhbGxvY19sb2MsIHByZWFsbG9jX2xlbiwgMSkgPT0gLTEpCisJCWlmICh1ZGZfYWRkX2FleHQoaW5vZGUsIGxhc3RfcG9zLCBwcmVhbGxvY19sb2MsCisJCQkJIHByZWFsbG9jX2xlbiwgMSkgPT0gLTEpCiAJCQlyZXR1cm4gLTE7CiAJCWxhc3RfZXh0LT5leHRMb2NhdGlvbiA9IHByZWFsbG9jX2xvYzsKIAkJbGFzdF9leHQtPmV4dExlbmd0aCA9IHByZWFsbG9jX2xlbjsKQEAgLTQ1OCw5ICs0NzgsOSBAQAogCX0KIAogCS8qIGxhc3RfcG9zIHNob3VsZCBwb2ludCB0byB0aGUgbGFzdCB3cml0dGVuIGV4dGVudC4uLiAqLwotCWlmIChVREZfSV9BTExPQ1RZUEUoaW5vZGUpID09IElDQlRBR19GTEFHX0FEX1NIT1JUKQorCWlmIChpaW5mby0+aV9hbGxvY190eXBlID09IElDQlRBR19GTEFHX0FEX1NIT1JUKQogCQlsYXN0X3Bvcy0+b2Zmc2V0IC09IHNpemVvZihzaG9ydF9hZCk7Ci0JZWxzZSBpZiAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9PSBJQ0JUQUdfRkxBR19BRF9MT05HKQorCWVsc2UgaWYgKGlpbmZvLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfTE9ORykKIAkJbGFzdF9wb3MtPm9mZnNldCAtPSBzaXplb2YobG9uZ19hZCk7CiAJZWxzZQogCQlyZXR1cm4gLTE7CkBAIC00NjksNyArNDg5LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqaW5vZGVfZ2V0YmxrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGJsb2NrLAotCQkJCQlpbnQgKmVyciwgbG9uZyAqcGh5cywgaW50ICpuZXcpCisJCQkJCWludCAqZXJyLCBzZWN0b3JfdCAqcGh5cywgaW50ICpuZXcpCiB7CiAJc3RhdGljIHNlY3Rvcl90IGxhc3RfYmxvY2s7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpyZXN1bHQgPSBOVUxMOwpAQCAtNDgzLDExICs1MDMsMTIgQEAKIAl1aW50MzJfdCBuZXdibG9ja251bSwgbmV3YmxvY2s7CiAJc2VjdG9yX3Qgb2Zmc2V0ID0gMDsKIAlpbnQ4X3QgZXR5cGU7Ci0JaW50IGdvYWwgPSAwLCBwZ29hbCA9IFVERl9JX0xPQ0FUSU9OKGlub2RlKS5sb2dpY2FsQmxvY2tOdW07CisJc3RydWN0IHVkZl9pbm9kZV9pbmZvICppaW5mbyA9IFVERl9JKGlub2RlKTsKKwlpbnQgZ29hbCA9IDAsIHBnb2FsID0gaWluZm8tPmlfbG9jYXRpb24ubG9naWNhbEJsb2NrTnVtOwogCWludCBsYXN0YmxvY2sgPSAwOwogCiAJcHJldl9lcG9zLm9mZnNldCA9IHVkZl9maWxlX2VudHJ5X2FsbG9jX29mZnNldChpbm9kZSk7Ci0JcHJldl9lcG9zLmJsb2NrID0gVURGX0lfTE9DQVRJT04oaW5vZGUpOworCXByZXZfZXBvcy5ibG9jayA9IGlpbmZvLT5pX2xvY2F0aW9uOwogCXByZXZfZXBvcy5iaCA9IE5VTEw7CiAJY3VyX2Vwb3MgPSBuZXh0X2Vwb3MgPSBwcmV2X2Vwb3M7CiAJYl9vZmYgPSAobG9mZl90KWJsb2NrIDw8IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwpAQCAtNTE1LDcgKzUzNiw4IEBACiAJCXByZXZfZXBvcy5vZmZzZXQgPSBjdXJfZXBvcy5vZmZzZXQ7CiAJCWN1cl9lcG9zLm9mZnNldCA9IG5leHRfZXBvcy5vZmZzZXQ7CiAKLQkJaWYgKChldHlwZSA9IHVkZl9uZXh0X2FleHQoaW5vZGUsICZuZXh0X2Vwb3MsICZlbG9jLCAmZWxlbiwgMSkpID09IC0xKQorCQlldHlwZSA9IHVkZl9uZXh0X2FleHQoaW5vZGUsICZuZXh0X2Vwb3MsICZlbG9jLCAmZWxlbiwgMSk7CisJCWlmIChldHlwZSA9PSAtMSkKIAkJCWJyZWFrOwogCiAJCWMgPSAhYzsKQEAgLTU2OSw5ICs1OTEsMTEgQEAKIAkJCXN0YXJ0bnVtID0gMTsKIAkJfSBlbHNlIHsKIAkJCS8qIENyZWF0ZSBhIGZha2UgZXh0ZW50IHdoZW4gdGhlcmUncyBub3Qgb25lICovCi0JCQltZW1zZXQoJmxhYXJyWzBdLmV4dExvY2F0aW9uLCAweDAwLCBzaXplb2Yoa2VybmVsX2xiX2FkZHIpKTsKKwkJCW1lbXNldCgmbGFhcnJbMF0uZXh0TG9jYXRpb24sIDB4MDAsCisJCQkJc2l6ZW9mKGtlcm5lbF9sYl9hZGRyKSk7CiAJCQlsYWFyclswXS5leHRMZW5ndGggPSBFWFRfTk9UX1JFQ09SREVEX05PVF9BTExPQ0FURUQ7Ci0JCQkvKiBXaWxsIHVkZl9leHRlbmRfZmlsZSgpIGNyZWF0ZSByZWFsIGV4dGVudCBmcm9tIGEgZmFrZSBvbmU/ICovCisJCQkvKiBXaWxsIHVkZl9leHRlbmRfZmlsZSgpIGNyZWF0ZSByZWFsIGV4dGVudCBmcm9tCisJCQkgICBhIGZha2Ugb25lPyAqLwogCQkJc3RhcnRudW0gPSAob2Zmc2V0ID4gMCk7CiAJCX0KIAkJLyogQ3JlYXRlIGV4dGVudHMgZm9yIHRoZSBob2xlIGJldHdlZW4gRU9GIGFuZCBvZmZzZXQgKi8KQEAgLTU4OSwxNCArNjEzLDE2IEBACiAJCW9mZnNldCA9IDA7CiAJCWNvdW50ICs9IHJldDsKIAkJLyogV2UgYXJlIG5vdCBjb3ZlcmVkIGJ5IGEgcHJlYWxsb2NhdGVkIGV4dGVudD8gKi8KLQkJaWYgKChsYWFyclswXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0ZMQUdfTUFTSykgIT0gRVhUX05PVF9SRUNPUkRFRF9BTExPQ0FURUQpIHsKKwkJaWYgKChsYWFyclswXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0ZMQUdfTUFTSykgIT0KKwkJCQkJCUVYVF9OT1RfUkVDT1JERURfQUxMT0NBVEVEKSB7CiAJCQkvKiBJcyB0aGVyZSBhbnkgcmVhbCBleHRlbnQ/IC0gb3RoZXJ3aXNlIHdlIG92ZXJ3cml0ZQogCQkJICogdGhlIGZha2Ugb25lLi4uICovCiAJCQlpZiAoY291bnQpCiAJCQkJYyA9ICFjOwogCQkJbGFhcnJbY10uZXh0TGVuZ3RoID0gRVhUX05PVF9SRUNPUkRFRF9OT1RfQUxMT0NBVEVEIHwKIAkJCQlpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7Ci0JCQltZW1zZXQoJmxhYXJyW2NdLmV4dExvY2F0aW9uLCAweDAwLCBzaXplb2Yoa2VybmVsX2xiX2FkZHIpKTsKKwkJCW1lbXNldCgmbGFhcnJbY10uZXh0TG9jYXRpb24sIDB4MDAsCisJCQkJc2l6ZW9mKGtlcm5lbF9sYl9hZGRyKSk7CiAJCQljb3VudCsrOwogCQkJZW5kbnVtKys7CiAJCX0KQEAgLTYwNSw3ICs2MzEsOCBAQAogCX0gZWxzZSB7CiAJCWVuZG51bSA9IHN0YXJ0bnVtID0gKChjb3VudCA+IDIpID8gMiA6IGNvdW50KTsKIAotCQkvKiBpZiB0aGUgY3VycmVudCBleHRlbnQgaXMgaW4gcG9zaXRpb24gMCwgc3dhcCBpdCB3aXRoIHRoZSBwcmV2aW91cyAqLworCQkvKiBpZiB0aGUgY3VycmVudCBleHRlbnQgaXMgaW4gcG9zaXRpb24gMCwKKwkJICAgc3dhcCBpdCB3aXRoIHRoZSBwcmV2aW91cyAqLwogCQlpZiAoIWMgJiYgY291bnQgIT0gMSkgewogCQkJbGFhcnJbMl0gPSBsYWFyclswXTsKIAkJCWxhYXJyWzBdID0gbGFhcnJbMV07CkBAIC02MTMsNDQgKzY0MCw0NyBAQAogCQkJYyA9IDE7CiAJCX0KIAotCQkvKiBpZiB0aGUgY3VycmVudCBibG9jayBpcyBsb2NhdGVkIGluIGFuIGV4dGVudCwgcmVhZCB0aGUgbmV4dCBleHRlbnQgKi8KLQkJaWYgKChldHlwZSA9IHVkZl9uZXh0X2FleHQoaW5vZGUsICZuZXh0X2Vwb3MsICZlbG9jLCAmZWxlbiwgMCkpICE9IC0xKSB7CisJCS8qIGlmIHRoZSBjdXJyZW50IGJsb2NrIGlzIGxvY2F0ZWQgaW4gYW4gZXh0ZW50LAorCQkgICByZWFkIHRoZSBuZXh0IGV4dGVudCAqLworCQlldHlwZSA9IHVkZl9uZXh0X2FleHQoaW5vZGUsICZuZXh0X2Vwb3MsICZlbG9jLCAmZWxlbiwgMCk7CisJCWlmIChldHlwZSAhPSAtMSkgewogCQkJbGFhcnJbYyArIDFdLmV4dExlbmd0aCA9IChldHlwZSA8PCAzMCkgfCBlbGVuOwogCQkJbGFhcnJbYyArIDFdLmV4dExvY2F0aW9uID0gZWxvYzsKIAkJCWNvdW50Kys7CiAJCQlzdGFydG51bSsrOwogCQkJZW5kbnVtKys7Ci0JCX0gZWxzZSB7CisJCX0gZWxzZQogCQkJbGFzdGJsb2NrID0gMTsKLQkJfQogCX0KIAogCS8qIGlmIHRoZSBjdXJyZW50IGV4dGVudCBpcyBub3QgcmVjb3JkZWQgYnV0IGFsbG9jYXRlZCwgZ2V0IHRoZQogCSAqIGJsb2NrIGluIHRoZSBleHRlbnQgY29ycmVzcG9uZGluZyB0byB0aGUgcmVxdWVzdGVkIGJsb2NrICovCi0JaWYgKChsYWFycltjXS5leHRMZW5ndGggPj4gMzApID09IChFWFRfTk9UX1JFQ09SREVEX0FMTE9DQVRFRCA+PiAzMCkpIHsKKwlpZiAoKGxhYXJyW2NdLmV4dExlbmd0aCA+PiAzMCkgPT0gKEVYVF9OT1RfUkVDT1JERURfQUxMT0NBVEVEID4+IDMwKSkKIAkJbmV3YmxvY2tudW0gPSBsYWFycltjXS5leHRMb2NhdGlvbi5sb2dpY2FsQmxvY2tOdW0gKyBvZmZzZXQ7Ci0JfSBlbHNlIHsgLyogb3RoZXJ3aXNlLCBhbGxvY2F0ZSBhIG5ldyBibG9jayAqLwotCQlpZiAoVURGX0lfTkVYVF9BTExPQ19CTE9DSyhpbm9kZSkgPT0gYmxvY2spCi0JCQlnb2FsID0gVURGX0lfTkVYVF9BTExPQ19HT0FMKGlub2RlKTsKKwllbHNlIHsgLyogb3RoZXJ3aXNlLCBhbGxvY2F0ZSBhIG5ldyBibG9jayAqLworCQlpZiAoaWluZm8tPmlfbmV4dF9hbGxvY19ibG9jayA9PSBibG9jaykKKwkJCWdvYWwgPSBpaW5mby0+aV9uZXh0X2FsbG9jX2dvYWw7CiAKIAkJaWYgKCFnb2FsKSB7Ci0JCQlpZiAoIShnb2FsID0gcGdvYWwpKQotCQkJCWdvYWwgPSBVREZfSV9MT0NBVElPTihpbm9kZSkubG9naWNhbEJsb2NrTnVtICsgMTsKKwkJCWlmICghKGdvYWwgPSBwZ29hbCkpIC8qIFhYWDogd2hhdCB3YXMgaW50ZW5kZWQgaGVyZT8gKi8KKwkJCQlnb2FsID0gaWluZm8tPmlfbG9jYXRpb24ubG9naWNhbEJsb2NrTnVtICsgMTsKIAkJfQogCi0JCWlmICghKG5ld2Jsb2NrbnVtID0gdWRmX25ld19ibG9jayhpbm9kZS0+aV9zYiwgaW5vZGUsCi0JCQkJCQkgIFVERl9JX0xPQ0FUSU9OKGlub2RlKS5wYXJ0aXRpb25SZWZlcmVuY2VOdW0sCi0JCQkJCQkgIGdvYWwsIGVycikpKSB7CisJCW5ld2Jsb2NrbnVtID0gdWRmX25ld19ibG9jayhpbm9kZS0+aV9zYiwgaW5vZGUsCisJCQkJaWluZm8tPmlfbG9jYXRpb24ucGFydGl0aW9uUmVmZXJlbmNlTnVtLAorCQkJCWdvYWwsIGVycik7CisJCWlmICghbmV3YmxvY2tudW0pIHsKIAkJCWJyZWxzZShwcmV2X2Vwb3MuYmgpOwogCQkJKmVyciA9IC1FTk9TUEM7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQotCQlVREZfSV9MRU5FWFRFTlRTKGlub2RlKSArPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJCWlpbmZvLT5pX2xlbkV4dGVudHMgKz0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOwogCX0KIAotCS8qIGlmIHRoZSBleHRlbnQgdGhlIHJlcXVzdGVkIGJsb2NrIGlzIGxvY2F0ZWQgaW4gY29udGFpbnMgbXVsdGlwbGUgYmxvY2tzLAotCSAqIHNwbGl0IHRoZSBleHRlbnQgaW50byBhdCBtb3N0IHRocmVlIGV4dGVudHMuIGJsb2NrcyBwcmlvciB0byByZXF1ZXN0ZWQKLQkgKiBibG9jaywgcmVxdWVzdGVkIGJsb2NrLCBhbmQgYmxvY2tzIGFmdGVyIHJlcXVlc3RlZCBibG9jayAqLworCS8qIGlmIHRoZSBleHRlbnQgdGhlIHJlcXVzdGVkIGJsb2NrIGlzIGxvY2F0ZWQgaW4gY29udGFpbnMgbXVsdGlwbGUKKwkgKiBibG9ja3MsIHNwbGl0IHRoZSBleHRlbnQgaW50byBhdCBtb3N0IHRocmVlIGV4dGVudHMuIGJsb2NrcyBwcmlvcgorCSAqIHRvIHJlcXVlc3RlZCBibG9jaywgcmVxdWVzdGVkIGJsb2NrLCBhbmQgYmxvY2tzIGFmdGVyIHJlcXVlc3RlZAorCSAqIGJsb2NrICovCiAJdWRmX3NwbGl0X2V4dGVudHMoaW5vZGUsICZjLCBvZmZzZXQsIG5ld2Jsb2NrbnVtLCBsYWFyciwgJmVuZG51bSk7CiAKICNpZmRlZiBVREZfUFJFQUxMT0NBVEUKQEAgLTY2OCwxNSArNjk4LDE1IEBACiAKIAlicmVsc2UocHJldl9lcG9zLmJoKTsKIAotCWlmICghKG5ld2Jsb2NrID0gdWRmX2dldF9wYmxvY2soaW5vZGUtPmlfc2IsIG5ld2Jsb2NrbnVtLAotCQkJCQlVREZfSV9MT0NBVElPTihpbm9kZSkucGFydGl0aW9uUmVmZXJlbmNlTnVtLCAwKSkpIHsKKwluZXdibG9jayA9IHVkZl9nZXRfcGJsb2NrKGlub2RlLT5pX3NiLCBuZXdibG9ja251bSwKKwkJCQlpaW5mby0+aV9sb2NhdGlvbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW0sIDApOworCWlmICghbmV3YmxvY2spCiAJCXJldHVybiBOVUxMOwotCX0KIAkqcGh5cyA9IG5ld2Jsb2NrOwogCSplcnIgPSAwOwogCSpuZXcgPSAxOwotCVVERl9JX05FWFRfQUxMT0NfQkxPQ0soaW5vZGUpID0gYmxvY2s7Ci0JVURGX0lfTkVYVF9BTExPQ19HT0FMKGlub2RlKSA9IG5ld2Jsb2NrbnVtOworCWlpbmZvLT5pX25leHRfYWxsb2NfYmxvY2sgPSBibG9jazsKKwlpaW5mby0+aV9uZXh0X2FsbG9jX2dvYWwgPSBuZXdibG9ja251bTsKIAlpbm9kZS0+aV9jdGltZSA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7CiAKIAlpZiAoSVNfU1lOQyhpbm9kZSkpCkBAIC02OTIsMTYgKzcyMiwyMCBAQAogCQkJICAgICAga2VybmVsX2xvbmdfYWQgbGFhcnJbRVhURU5UX01FUkdFX1NJWkVdLAogCQkJICAgICAgaW50ICplbmRudW0pCiB7CisJdW5zaWduZWQgbG9uZyBibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJdW5zaWduZWQgY2hhciBibG9ja3NpemVfYml0cyA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCiAJaWYgKChsYWFyclsqY10uZXh0TGVuZ3RoID4+IDMwKSA9PSAoRVhUX05PVF9SRUNPUkRFRF9BTExPQ0FURUQgPj4gMzApIHx8Ci0JICAgIChsYWFyclsqY10uZXh0TGVuZ3RoID4+IDMwKSA9PSAoRVhUX05PVF9SRUNPUkRFRF9OT1RfQUxMT0NBVEVEID4+IDMwKSkgeworCSAgICAobGFhcnJbKmNdLmV4dExlbmd0aCA+PiAzMCkgPT0KKwkJCQkoRVhUX05PVF9SRUNPUkRFRF9OT1RfQUxMT0NBVEVEID4+IDMwKSkgewogCQlpbnQgY3VyciA9ICpjOwogCQlpbnQgYmxlbiA9ICgobGFhcnJbY3Vycl0uZXh0TGVuZ3RoICYgVURGX0VYVEVOVF9MRU5HVEhfTUFTSykgKwotCQkJICAgIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCQkJICAgIGJsb2Nrc2l6ZSAtIDEpID4+IGJsb2Nrc2l6ZV9iaXRzOwogCQlpbnQ4X3QgZXR5cGUgPSAobGFhcnJbY3Vycl0uZXh0TGVuZ3RoID4+IDMwKTsKIAotCQlpZiAoYmxlbiA9PSAxKSB7CisJCWlmIChibGVuID09IDEpCiAJCQk7Ci0JCX0gZWxzZSBpZiAoIW9mZnNldCB8fCBibGVuID09IG9mZnNldCArIDEpIHsKKwkJZWxzZSBpZiAoIW9mZnNldCB8fCBibGVuID09IG9mZnNldCArIDEpIHsKIAkJCWxhYXJyW2N1cnIgKyAyXSA9IGxhYXJyW2N1cnIgKyAxXTsKIAkJCWxhYXJyW2N1cnIgKyAxXSA9IGxhYXJyW2N1cnJdOwogCQl9IGVsc2UgewpAQCAtNzExLDE1ICs3NDUsMTggQEAKIAogCQlpZiAob2Zmc2V0KSB7CiAJCQlpZiAoZXR5cGUgPT0gKEVYVF9OT1RfUkVDT1JERURfQUxMT0NBVEVEID4+IDMwKSkgewotCQkJCXVkZl9mcmVlX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgaW5vZGUsIGxhYXJyW2N1cnJdLmV4dExvY2F0aW9uLCAwLCBvZmZzZXQpOwotCQkJCWxhYXJyW2N1cnJdLmV4dExlbmd0aCA9IEVYVF9OT1RfUkVDT1JERURfTk9UX0FMTE9DQVRFRCB8Ci0JCQkJCShvZmZzZXQgPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQkJCXVkZl9mcmVlX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgaW5vZGUsCisJCQkJCQlsYWFycltjdXJyXS5leHRMb2NhdGlvbiwKKwkJCQkJCTAsIG9mZnNldCk7CisJCQkJbGFhcnJbY3Vycl0uZXh0TGVuZ3RoID0KKwkJCQkJRVhUX05PVF9SRUNPUkRFRF9OT1RfQUxMT0NBVEVEIHwKKwkJCQkJKG9mZnNldCA8PCBibG9ja3NpemVfYml0cyk7CiAJCQkJbGFhcnJbY3Vycl0uZXh0TG9jYXRpb24ubG9naWNhbEJsb2NrTnVtID0gMDsKLQkJCQlsYWFycltjdXJyXS5leHRMb2NhdGlvbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPSAwOwotCQkJfSBlbHNlIHsKKwkJCQlsYWFycltjdXJyXS5leHRMb2NhdGlvbi4KKwkJCQkJCXBhcnRpdGlvblJlZmVyZW5jZU51bSA9IDA7CisJCQl9IGVsc2UKIAkJCQlsYWFycltjdXJyXS5leHRMZW5ndGggPSAoZXR5cGUgPDwgMzApIHwKLQkJCQkJKG9mZnNldCA8PCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7Ci0JCQl9CisJCQkJCShvZmZzZXQgPDwgYmxvY2tzaXplX2JpdHMpOwogCQkJY3VycisrOwogCQkJKCpjKSsrOwogCQkJKCplbmRudW0pKys7CkBAIC03MjgsMTYgKzc2NSwxNyBAQAogCQlsYWFycltjdXJyXS5leHRMb2NhdGlvbi5sb2dpY2FsQmxvY2tOdW0gPSBuZXdibG9ja251bTsKIAkJaWYgKGV0eXBlID09IChFWFRfTk9UX1JFQ09SREVEX05PVF9BTExPQ0FURUQgPj4gMzApKQogCQkJbGFhcnJbY3Vycl0uZXh0TG9jYXRpb24ucGFydGl0aW9uUmVmZXJlbmNlTnVtID0KLQkJCQlVREZfSV9MT0NBVElPTihpbm9kZSkucGFydGl0aW9uUmVmZXJlbmNlTnVtOworCQkJCVVERl9JKGlub2RlKS0+aV9sb2NhdGlvbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW07CiAJCWxhYXJyW2N1cnJdLmV4dExlbmd0aCA9IEVYVF9SRUNPUkRFRF9BTExPQ0FURUQgfAotCQkJaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCQkJYmxvY2tzaXplOwogCQljdXJyKys7CiAKIAkJaWYgKGJsZW4gIT0gb2Zmc2V0ICsgMSkgewogCQkJaWYgKGV0eXBlID09IChFWFRfTk9UX1JFQ09SREVEX0FMTE9DQVRFRCA+PiAzMCkpCi0JCQkJbGFhcnJbY3Vycl0uZXh0TG9jYXRpb24ubG9naWNhbEJsb2NrTnVtICs9IChvZmZzZXQgKyAxKTsKKwkJCQlsYWFycltjdXJyXS5leHRMb2NhdGlvbi5sb2dpY2FsQmxvY2tOdW0gKz0KKwkJCQkJCQkJb2Zmc2V0ICsgMTsKIAkJCWxhYXJyW2N1cnJdLmV4dExlbmd0aCA9IChldHlwZSA8PCAzMCkgfAotCQkJCSgoYmxlbiAtIChvZmZzZXQgKyAxKSkgPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQkJCSgoYmxlbiAtIChvZmZzZXQgKyAxKSkgPDwgYmxvY2tzaXplX2JpdHMpOwogCQkJY3VycisrOwogCQkJKCplbmRudW0pKys7CiAJCX0KQEAgLTc1Niw2OSArNzk0LDg2IEBACiAJCWVsc2UKIAkJCXN0YXJ0ID0gYzsKIAl9IGVsc2UgewotCQlpZiAoKGxhYXJyW2MgKyAxXS5leHRMZW5ndGggPj4gMzApID09IChFWFRfTk9UX1JFQ09SREVEX0FMTE9DQVRFRCA+PiAzMCkpIHsKKwkJaWYgKChsYWFycltjICsgMV0uZXh0TGVuZ3RoID4+IDMwKSA9PQorCQkJCQkoRVhUX05PVF9SRUNPUkRFRF9BTExPQ0FURUQgPj4gMzApKSB7CiAJCQlzdGFydCA9IGMgKyAxOwotCQkJbGVuZ3RoID0gY3Vycmxlbmd0aCA9ICgoKGxhYXJyW2MgKyAxXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCi0JCQkJCQlpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7Ci0JCX0gZWxzZSB7CisJCQlsZW5ndGggPSBjdXJybGVuZ3RoID0KKwkJCQkoKChsYWFycltjICsgMV0uZXh0TGVuZ3RoICYKKwkJCQkJVURGX0VYVEVOVF9MRU5HVEhfTUFTSykgKworCQkJCWlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+CisJCQkJaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQl9IGVsc2UKIAkJCXN0YXJ0ID0gYzsKLQkJfQogCX0KIAogCWZvciAoaSA9IHN0YXJ0ICsgMTsgaSA8PSAqZW5kbnVtOyBpKyspIHsKIAkJaWYgKGkgPT0gKmVuZG51bSkgewogCQkJaWYgKGxhc3RibG9jaykKIAkJCQlsZW5ndGggKz0gVURGX0RFRkFVTFRfUFJFQUxMT0NfQkxPQ0tTOwotCQl9IGVsc2UgaWYgKChsYWFycltpXS5leHRMZW5ndGggPj4gMzApID09IChFWFRfTk9UX1JFQ09SREVEX05PVF9BTExPQ0FURUQgPj4gMzApKSB7Ci0JCQlsZW5ndGggKz0gKCgobGFhcnJbaV0uZXh0TGVuZ3RoICYgVURGX0VYVEVOVF9MRU5HVEhfTUFTSykgKwotCQkJCSAgICBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7Ci0JCX0gZWxzZSB7CisJCX0gZWxzZSBpZiAoKGxhYXJyW2ldLmV4dExlbmd0aCA+PiAzMCkgPT0KKwkJCQkoRVhUX05PVF9SRUNPUkRFRF9OT1RfQUxMT0NBVEVEID4+IDMwKSkgeworCQkJbGVuZ3RoICs9ICgoKGxhYXJyW2ldLmV4dExlbmd0aCAmCisJCQkJCQlVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCisJCQkJICAgIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+CisJCQkJICAgIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJfSBlbHNlCiAJCQlicmVhazsKLQkJfQogCX0KIAogCWlmIChsZW5ndGgpIHsKIAkJaW50IG5leHQgPSBsYWFycltzdGFydF0uZXh0TG9jYXRpb24ubG9naWNhbEJsb2NrTnVtICsKIAkJCSgoKGxhYXJyW3N0YXJ0XS5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCi0JCQkgIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJCSAgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkgPj4KKwkJCSAgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOwogCQlpbnQgbnVtYWxsb2MgPSB1ZGZfcHJlYWxsb2NfYmxvY2tzKGlub2RlLT5pX3NiLCBpbm9kZSwKLQkJCQkJCSAgIGxhYXJyW3N0YXJ0XS5leHRMb2NhdGlvbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW0sCi0JCQkJCQkgICBuZXh0LCAoVURGX0RFRkFVTFRfUFJFQUxMT0NfQkxPQ0tTID4gbGVuZ3RoID8gbGVuZ3RoIDoKLQkJCQkJCQkgIFVERl9ERUZBVUxUX1BSRUFMTE9DX0JMT0NLUykgLSBjdXJybGVuZ3RoKTsKKwkJCQlsYWFycltzdGFydF0uZXh0TG9jYXRpb24ucGFydGl0aW9uUmVmZXJlbmNlTnVtLAorCQkJCW5leHQsIChVREZfREVGQVVMVF9QUkVBTExPQ19CTE9DS1MgPiBsZW5ndGggPworCQkJCWxlbmd0aCA6IFVERl9ERUZBVUxUX1BSRUFMTE9DX0JMT0NLUykgLQorCQkJCWN1cnJsZW5ndGgpOwogCQlpZiAobnVtYWxsb2MpIAl7Ci0JCQlpZiAoc3RhcnQgPT0gKGMgKyAxKSkgeworCQkJaWYgKHN0YXJ0ID09IChjICsgMSkpCiAJCQkJbGFhcnJbc3RhcnRdLmV4dExlbmd0aCArPQotCQkJCQkobnVtYWxsb2MgPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOwotCQkJfSBlbHNlIHsKKwkJCQkJKG51bWFsbG9jIDw8CisJCQkJCSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7CisJCQllbHNlIHsKIAkJCQltZW1tb3ZlKCZsYWFycltjICsgMl0sICZsYWFycltjICsgMV0sCiAJCQkJCXNpemVvZihsb25nX2FkKSAqICgqZW5kbnVtIC0gKGMgKyAxKSkpOwogCQkJCSgqZW5kbnVtKSsrOwogCQkJCWxhYXJyW2MgKyAxXS5leHRMb2NhdGlvbi5sb2dpY2FsQmxvY2tOdW0gPSBuZXh0OwogCQkJCWxhYXJyW2MgKyAxXS5leHRMb2NhdGlvbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPQotCQkJCQlsYWFycltjXS5leHRMb2NhdGlvbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW07Ci0JCQkJbGFhcnJbYyArIDFdLmV4dExlbmd0aCA9IEVYVF9OT1RfUkVDT1JERURfQUxMT0NBVEVEIHwKLQkJCQkJKG51bWFsbG9jIDw8IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJCQkJbGFhcnJbY10uZXh0TG9jYXRpb24uCisJCQkJCQkJcGFydGl0aW9uUmVmZXJlbmNlTnVtOworCQkJCWxhYXJyW2MgKyAxXS5leHRMZW5ndGggPQorCQkJCQlFWFRfTk9UX1JFQ09SREVEX0FMTE9DQVRFRCB8CisJCQkJCShudW1hbGxvYyA8PAorCQkJCQkgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOwogCQkJCXN0YXJ0ID0gYyArIDE7CiAJCQl9CiAKIAkJCWZvciAoaSA9IHN0YXJ0ICsgMTsgbnVtYWxsb2MgJiYgaSA8ICplbmRudW07IGkrKykgewotCQkJCWludCBlbGVuID0gKChsYWFycltpXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCi0JCQkJCSAgICBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKwkJCQlpbnQgZWxlbiA9ICgobGFhcnJbaV0uZXh0TGVuZ3RoICYKKwkJCQkJCVVERl9FWFRFTlRfTEVOR1RIX01BU0spICsKKwkJCQkJICAgIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+CisJCQkJCSAgICBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKIAogCQkJCWlmIChlbGVuID4gbnVtYWxsb2MpIHsKIAkJCQkJbGFhcnJbaV0uZXh0TGVuZ3RoIC09Ci0JCQkJCQkobnVtYWxsb2MgPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQkJCQkJKG51bWFsbG9jIDw8CisJCQkJCQkgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOwogCQkJCQludW1hbGxvYyA9IDA7CiAJCQkJfSBlbHNlIHsKIAkJCQkJbnVtYWxsb2MgLT0gZWxlbjsKIAkJCQkJaWYgKCplbmRudW0gPiAoaSArIDEpKQotCQkJCQkJbWVtbW92ZSgmbGFhcnJbaV0sICZsYWFycltpICsgMV0sCi0JCQkJCQkJc2l6ZW9mKGxvbmdfYWQpICogKCplbmRudW0gLSAoaSArIDEpKSk7CisJCQkJCQltZW1tb3ZlKCZsYWFycltpXSwKKwkJCQkJCQkmbGFhcnJbaSArIDFdLAorCQkJCQkJCXNpemVvZihsb25nX2FkKSAqCisJCQkJCQkJKCplbmRudW0gLSAoaSArIDEpKSk7CiAJCQkJCWktLTsKIAkJCQkJKCplbmRudW0pLS07CiAJCQkJfQogCQkJfQotCQkJVURGX0lfTEVORVhURU5UUyhpbm9kZSkgKz0gbnVtYWxsb2MgPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJCQlVREZfSShpbm9kZSktPmlfbGVuRXh0ZW50cyArPQorCQkJCW51bWFsbG9jIDw8IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwogCQl9CiAJfQogfQpAQCAtODI4LDcwICs4ODMsOTcgQEAKIAkJCSAgICAgIGludCAqZW5kbnVtKQogewogCWludCBpOworCXVuc2lnbmVkIGxvbmcgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCXVuc2lnbmVkIGNoYXIgYmxvY2tzaXplX2JpdHMgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKIAogCWZvciAoaSA9IDA7IGkgPCAoKmVuZG51bSAtIDEpOyBpKyspIHsKLQkJaWYgKChsYWFycltpXS5leHRMZW5ndGggPj4gMzApID09IChsYWFycltpICsgMV0uZXh0TGVuZ3RoID4+IDMwKSkgewotCQkJaWYgKCgobGFhcnJbaV0uZXh0TGVuZ3RoID4+IDMwKSA9PSAoRVhUX05PVF9SRUNPUkRFRF9OT1RfQUxMT0NBVEVEID4+IDMwKSkgfHwKLQkJCSAgICAoKGxhYXJyW2kgKyAxXS5leHRMb2NhdGlvbi5sb2dpY2FsQmxvY2tOdW0gLSBsYWFycltpXS5leHRMb2NhdGlvbi5sb2dpY2FsQmxvY2tOdW0pID09Ci0JCQkgICAgICgoKGxhYXJyW2ldLmV4dExlbmd0aCAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0spICsKLQkJCSAgICAgICBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cykpKSB7Ci0JCQkJaWYgKCgobGFhcnJbaV0uZXh0TGVuZ3RoICYgVURGX0VYVEVOVF9MRU5HVEhfTUFTSykgKwotCQkJCSAgICAgKGxhYXJyW2kgKyAxXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCi0JCQkJICAgICBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSAmIH5VREZfRVhURU5UX0xFTkdUSF9NQVNLKSB7Ci0JCQkJCWxhYXJyW2kgKyAxXS5leHRMZW5ndGggPSAobGFhcnJbaSArIDFdLmV4dExlbmd0aCAtCi0JCQkJCQkJCSAgKGxhYXJyW2ldLmV4dExlbmd0aCAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0spICsKLQkJCQkJCQkJICBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSAmIH4oaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSk7Ci0JCQkJCWxhYXJyW2ldLmV4dExlbmd0aCA9IChsYWFycltpXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0ZMQUdfTUFTSykgKwotCQkJCQkJKFVERl9FWFRFTlRfTEVOR1RIX01BU0sgKyAxKSAtIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKLQkJCQkJbGFhcnJbaSArIDFdLmV4dExvY2F0aW9uLmxvZ2ljYWxCbG9ja051bSA9Ci0JCQkJCQlsYWFycltpXS5leHRMb2NhdGlvbi5sb2dpY2FsQmxvY2tOdW0gKwotCQkJCQkJKChsYWFycltpXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSA+PgotCQkJCQkJIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKLQkJCQl9IGVsc2UgewotCQkJCQlsYWFycltpXS5leHRMZW5ndGggPSBsYWFycltpICsgMV0uZXh0TGVuZ3RoICsKLQkJCQkJCSgoKGxhYXJyW2ldLmV4dExlbmd0aCAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0spICsKLQkJCQkJCSAgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkgJiB+KGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKTsKLQkJCQkJaWYgKCplbmRudW0gPiAoaSArIDIpKQotCQkJCQkJbWVtbW92ZSgmbGFhcnJbaSArIDFdLCAmbGFhcnJbaSArIDJdLAotCQkJCQkJCXNpemVvZihsb25nX2FkKSAqICgqZW5kbnVtIC0gKGkgKyAyKSkpOwotCQkJCQlpLS07Ci0JCQkJCSgqZW5kbnVtKS0tOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmICgoKGxhYXJyW2ldLmV4dExlbmd0aCA+PiAzMCkgPT0gKEVYVF9OT1RfUkVDT1JERURfQUxMT0NBVEVEID4+IDMwKSkgJiYKLQkJCSAgICgobGFhcnJbaSArIDFdLmV4dExlbmd0aCA+PiAzMCkgPT0gKEVYVF9OT1RfUkVDT1JERURfTk9UX0FMTE9DQVRFRCA+PiAzMCkpKSB7Ci0JCQl1ZGZfZnJlZV9ibG9ja3MoaW5vZGUtPmlfc2IsIGlub2RlLCBsYWFycltpXS5leHRMb2NhdGlvbiwgMCwKLQkJCQkJKChsYWFycltpXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCi0JCQkJCSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7Ci0JCQlsYWFycltpXS5leHRMb2NhdGlvbi5sb2dpY2FsQmxvY2tOdW0gPSAwOwotCQkJbGFhcnJbaV0uZXh0TG9jYXRpb24ucGFydGl0aW9uUmVmZXJlbmNlTnVtID0gMDsKKwkJa2VybmVsX2xvbmdfYWQgKmxpIC8qbFtpXSovID0gJmxhYXJyW2ldOworCQlrZXJuZWxfbG9uZ19hZCAqbGlwMSAvKmxbaSBwbHVzIDFdKi8gPSAmbGFhcnJbaSArIDFdOwogCi0JCQlpZiAoKChsYWFycltpXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCi0JCQkgICAgIChsYWFycltpICsgMV0uZXh0TGVuZ3RoICYgVURGX0VYVEVOVF9MRU5HVEhfTUFTSykgKwotCQkJICAgICBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSAmIH5VREZfRVhURU5UX0xFTkdUSF9NQVNLKSB7Ci0JCQkJbGFhcnJbaSArIDFdLmV4dExlbmd0aCA9IChsYWFycltpICsgMV0uZXh0TGVuZ3RoIC0KLQkJCQkJCQkgIChsYWFycltpXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCi0JCQkJCQkJICBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSAmIH4oaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSk7Ci0JCQkJbGFhcnJbaV0uZXh0TGVuZ3RoID0gKGxhYXJyW2ldLmV4dExlbmd0aCAmIFVERl9FWFRFTlRfRkxBR19NQVNLKSArCi0JCQkJCShVREZfRVhURU5UX0xFTkdUSF9NQVNLICsgMSkgLSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJCWlmICgoKGxpLT5leHRMZW5ndGggPj4gMzApID09IChsaXAxLT5leHRMZW5ndGggPj4gMzApKSAmJgorCQkJKCgobGktPmV4dExlbmd0aCA+PiAzMCkgPT0KKwkJCQkoRVhUX05PVF9SRUNPUkRFRF9OT1RfQUxMT0NBVEVEID4+IDMwKSkgfHwKKwkJCSgobGlwMS0+ZXh0TG9jYXRpb24ubG9naWNhbEJsb2NrTnVtIC0KKwkJCSAgbGktPmV4dExvY2F0aW9uLmxvZ2ljYWxCbG9ja051bSkgPT0KKwkJCSgoKGxpLT5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCisJCQlibG9ja3NpemUgLSAxKSA+PiBibG9ja3NpemVfYml0cykpKSkgeworCisJCQlpZiAoKChsaS0+ZXh0TGVuZ3RoICYgVURGX0VYVEVOVF9MRU5HVEhfTUFTSykgKworCQkJCShsaXAxLT5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCisJCQkJYmxvY2tzaXplIC0gMSkgJiB+VURGX0VYVEVOVF9MRU5HVEhfTUFTSykgeworCQkJCWxpcDEtPmV4dExlbmd0aCA9IChsaXAxLT5leHRMZW5ndGggLQorCQkJCQkJICAobGktPmV4dExlbmd0aCAmCisJCQkJCQkgICBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCisJCQkJCQkgICBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSAmCisJCQkJCQkJfihibG9ja3NpemUgLSAxKTsKKwkJCQlsaS0+ZXh0TGVuZ3RoID0gKGxpLT5leHRMZW5ndGggJgorCQkJCQkJIFVERl9FWFRFTlRfRkxBR19NQVNLKSArCisJCQkJCQkoVURGX0VYVEVOVF9MRU5HVEhfTUFTSyArIDEpIC0KKwkJCQkJCWJsb2Nrc2l6ZTsKKwkJCQlsaXAxLT5leHRMb2NhdGlvbi5sb2dpY2FsQmxvY2tOdW0gPQorCQkJCQlsaS0+ZXh0TG9jYXRpb24ubG9naWNhbEJsb2NrTnVtICsKKwkJCQkJKChsaS0+ZXh0TGVuZ3RoICYKKwkJCQkJCVVERl9FWFRFTlRfTEVOR1RIX01BU0spID4+CisJCQkJCQlibG9ja3NpemVfYml0cyk7CiAJCQl9IGVsc2UgewotCQkJCWxhYXJyW2ldLmV4dExlbmd0aCA9IGxhYXJyW2kgKyAxXS5leHRMZW5ndGggKwotCQkJCQkoKChsYWFycltpXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCi0JCQkJCSAgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkgJiB+KGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKTsKKwkJCQlsaS0+ZXh0TGVuZ3RoID0gbGlwMS0+ZXh0TGVuZ3RoICsKKwkJCQkJKCgobGktPmV4dExlbmd0aCAmCisJCQkJCQlVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCisJCQkJCSBibG9ja3NpemUgLSAxKSAmIH4oYmxvY2tzaXplIC0gMSkpOwogCQkJCWlmICgqZW5kbnVtID4gKGkgKyAyKSkKIAkJCQkJbWVtbW92ZSgmbGFhcnJbaSArIDFdLCAmbGFhcnJbaSArIDJdLAotCQkJCQkJc2l6ZW9mKGxvbmdfYWQpICogKCplbmRudW0gLSAoaSArIDIpKSk7CisJCQkJCQlzaXplb2YobG9uZ19hZCkgKgorCQkJCQkJKCplbmRudW0gLSAoaSArIDIpKSk7CiAJCQkJaS0tOwogCQkJCSgqZW5kbnVtKS0tOwogCQkJfQotCQl9IGVsc2UgaWYgKChsYWFycltpXS5leHRMZW5ndGggPj4gMzApID09IChFWFRfTk9UX1JFQ09SREVEX0FMTE9DQVRFRCA+PiAzMCkpIHsKLQkJCXVkZl9mcmVlX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgaW5vZGUsIGxhYXJyW2ldLmV4dExvY2F0aW9uLCAwLAotCQkJCQkoKGxhYXJyW2ldLmV4dExlbmd0aCAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0spICsKLQkJCQkJIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKLQkJCWxhYXJyW2ldLmV4dExvY2F0aW9uLmxvZ2ljYWxCbG9ja051bSA9IDA7Ci0JCQlsYWFycltpXS5leHRMb2NhdGlvbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPSAwOwotCQkJbGFhcnJbaV0uZXh0TGVuZ3RoID0gKGxhYXJyW2ldLmV4dExlbmd0aCAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0spIHwKLQkJCQlFWFRfTk9UX1JFQ09SREVEX05PVF9BTExPQ0FURUQ7CisJCX0gZWxzZSBpZiAoKChsaS0+ZXh0TGVuZ3RoID4+IDMwKSA9PQorCQkJCShFWFRfTk9UX1JFQ09SREVEX0FMTE9DQVRFRCA+PiAzMCkpICYmCisJCQkgICAoKGxpcDEtPmV4dExlbmd0aCA+PiAzMCkgPT0KKwkJCQkoRVhUX05PVF9SRUNPUkRFRF9OT1RfQUxMT0NBVEVEID4+IDMwKSkpIHsKKwkJCXVkZl9mcmVlX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgaW5vZGUsIGxpLT5leHRMb2NhdGlvbiwgMCwKKwkJCQkJKChsaS0+ZXh0TGVuZ3RoICYKKwkJCQkJICBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCisJCQkJCSBibG9ja3NpemUgLSAxKSA+PiBibG9ja3NpemVfYml0cyk7CisJCQlsaS0+ZXh0TG9jYXRpb24ubG9naWNhbEJsb2NrTnVtID0gMDsKKwkJCWxpLT5leHRMb2NhdGlvbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPSAwOworCisJCQlpZiAoKChsaS0+ZXh0TGVuZ3RoICYgVURGX0VYVEVOVF9MRU5HVEhfTUFTSykgKworCQkJICAgICAobGlwMS0+ZXh0TGVuZ3RoICYgVURGX0VYVEVOVF9MRU5HVEhfTUFTSykgKworCQkJICAgICBibG9ja3NpemUgLSAxKSAmIH5VREZfRVhURU5UX0xFTkdUSF9NQVNLKSB7CisJCQkJbGlwMS0+ZXh0TGVuZ3RoID0gKGxpcDEtPmV4dExlbmd0aCAtCisJCQkJCQkgICAobGktPmV4dExlbmd0aCAmCisJCQkJCQkgICBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCisJCQkJCQkgICBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSAmCisJCQkJCQkgICB+KGJsb2Nrc2l6ZSAtIDEpOworCQkJCWxpLT5leHRMZW5ndGggPSAobGktPmV4dExlbmd0aCAmCisJCQkJCQkgVURGX0VYVEVOVF9GTEFHX01BU0spICsKKwkJCQkJCShVREZfRVhURU5UX0xFTkdUSF9NQVNLICsgMSkgLQorCQkJCQkJYmxvY2tzaXplOworCQkJfSBlbHNlIHsKKwkJCQlsaS0+ZXh0TGVuZ3RoID0gbGlwMS0+ZXh0TGVuZ3RoICsKKwkJCQkJKCgobGktPmV4dExlbmd0aCAmCisJCQkJCQlVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCisJCQkJCSAgYmxvY2tzaXplIC0gMSkgJiB+KGJsb2Nrc2l6ZSAtIDEpKTsKKwkJCQlpZiAoKmVuZG51bSA+IChpICsgMikpCisJCQkJCW1lbW1vdmUoJmxhYXJyW2kgKyAxXSwgJmxhYXJyW2kgKyAyXSwKKwkJCQkJCXNpemVvZihsb25nX2FkKSAqCisJCQkJCQkoKmVuZG51bSAtIChpICsgMikpKTsKKwkJCQlpLS07CisJCQkJKCplbmRudW0pLS07CisJCQl9CisJCX0gZWxzZSBpZiAoKGxpLT5leHRMZW5ndGggPj4gMzApID09CisJCQkJCShFWFRfTk9UX1JFQ09SREVEX0FMTE9DQVRFRCA+PiAzMCkpIHsKKwkJCXVkZl9mcmVlX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgaW5vZGUsCisJCQkJCWxpLT5leHRMb2NhdGlvbiwgMCwKKwkJCQkJKChsaS0+ZXh0TGVuZ3RoICYKKwkJCQkJCVVERl9FWFRFTlRfTEVOR1RIX01BU0spICsKKwkJCQkJIGJsb2Nrc2l6ZSAtIDEpID4+IGJsb2Nrc2l6ZV9iaXRzKTsKKwkJCWxpLT5leHRMb2NhdGlvbi5sb2dpY2FsQmxvY2tOdW0gPSAwOworCQkJbGktPmV4dExvY2F0aW9uLnBhcnRpdGlvblJlZmVyZW5jZU51bSA9IDA7CisJCQlsaS0+ZXh0TGVuZ3RoID0gKGxpLT5leHRMZW5ndGggJgorCQkJCQkJVURGX0VYVEVOVF9MRU5HVEhfTUFTSykgfAorCQkJCQkJRVhUX05PVF9SRUNPUkRFRF9OT1RfQUxMT0NBVEVEOwogCQl9CiAJfQogfQpAQCAtOTUzLDYgKzEwMzUsNyBAQAogewogCWludCBvZmZzZXQ7CiAJaW50IGVycjsKKwlzdHJ1Y3QgdWRmX2lub2RlX2luZm8gKmlpbmZvOwogCiAJaWYgKCEoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8CiAJICAgICAgU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkpCkBAIC05NjEsMjUgKzEwNDQsMjggQEAKIAkJcmV0dXJuOwogCiAJbG9ja19rZXJuZWwoKTsKLQlpZiAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpIHsKLQkJaWYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSA8ICh1ZGZfZmlsZV9lbnRyeV9hbGxvY19vZmZzZXQoaW5vZGUpICsKLQkJCQkJCWlub2RlLT5pX3NpemUpKSB7CisJaWluZm8gPSBVREZfSShpbm9kZSk7CisJaWYgKGlpbmZvLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKSB7CisJCWlmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgPAorCQkJCSh1ZGZfZmlsZV9lbnRyeV9hbGxvY19vZmZzZXQoaW5vZGUpICsKKwkJCQkgaW5vZGUtPmlfc2l6ZSkpIHsKIAkJCXVkZl9leHBhbmRfZmlsZV9hZGluaWNiKGlub2RlLCBpbm9kZS0+aV9zaXplLCAmZXJyKTsKLQkJCWlmIChVREZfSV9BTExPQ1RZUEUoaW5vZGUpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikgewotCQkJCWlub2RlLT5pX3NpemUgPSBVREZfSV9MRU5BTExPQyhpbm9kZSk7CisJCQlpZiAoaWluZm8tPmlfYWxsb2NfdHlwZSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpIHsKKwkJCQlpbm9kZS0+aV9zaXplID0gaWluZm8tPmlfbGVuQWxsb2M7CiAJCQkJdW5sb2NrX2tlcm5lbCgpOwogCQkJCXJldHVybjsKLQkJCX0gZWxzZSB7CisJCQl9IGVsc2UKIAkJCQl1ZGZfdHJ1bmNhdGVfZXh0ZW50cyhpbm9kZSk7Ci0JCQl9CiAJCX0gZWxzZSB7CiAJCQlvZmZzZXQgPSBpbm9kZS0+aV9zaXplICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpOwotCQkJbWVtc2V0KFVERl9JX0RBVEEoaW5vZGUpICsgVURGX0lfTEVORUFUVFIoaW5vZGUpICsgb2Zmc2V0LCAweDAwLAotCQkJICAgICAgIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldCAtIHVkZl9maWxlX2VudHJ5X2FsbG9jX29mZnNldChpbm9kZSkpOwotCQkJVURGX0lfTEVOQUxMT0MoaW5vZGUpID0gaW5vZGUtPmlfc2l6ZTsKKwkJCW1lbXNldChpaW5mby0+aV9leHQuaV9kYXRhICsgaWluZm8tPmlfbGVuRUF0dHIgKyBvZmZzZXQsCisJCQkJMHgwMCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0KKwkJCQlvZmZzZXQgLSB1ZGZfZmlsZV9lbnRyeV9hbGxvY19vZmZzZXQoaW5vZGUpKTsKKwkJCWlpbmZvLT5pX2xlbkFsbG9jID0gaW5vZGUtPmlfc2l6ZTsKIAkJfQogCX0gZWxzZSB7Ci0JCWJsb2NrX3RydW5jYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5vZGUtPmlfc2l6ZSwgdWRmX2dldF9ibG9jayk7CisJCWJsb2NrX3RydW5jYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5vZGUtPmlfc2l6ZSwKKwkJCQkgICAgdWRmX2dldF9ibG9jayk7CiAJCXVkZl90cnVuY2F0ZV9leHRlbnRzKGlub2RlKTsKIAl9CiAKQEAgLTk5Niw2ICsxMDgyLDcgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAlzdHJ1Y3QgZmlsZUVudHJ5ICpmZTsKIAl1aW50MTZfdCBpZGVudDsKKwlzdHJ1Y3QgdWRmX2lub2RlX2luZm8gKmlpbmZvID0gVURGX0koaW5vZGUpOwogCiAJLyoKIAkgKiBTZXQgZGVmYXVsdHMsIGJ1dCB0aGUgaW5vZGUgaXMgc3RpbGwgaW5jb21wbGV0ZSEKQEAgLTEwMDksNyArMTA5Niw3IEBACiAJICogICAgICBpX25saW5rID0gMQogCSAqICAgICAgaV9vcCA9IE5VTEw7CiAJICovCi0JYmggPSB1ZGZfcmVhZF9wdGFnZ2VkKGlub2RlLT5pX3NiLCBVREZfSV9MT0NBVElPTihpbm9kZSksIDAsICZpZGVudCk7CisJYmggPSB1ZGZfcmVhZF9wdGFnZ2VkKGlub2RlLT5pX3NiLCBpaW5mby0+aV9sb2NhdGlvbiwgMCwgJmlkZW50KTsKIAlpZiAoIWJoKSB7CiAJCXByaW50ayhLRVJOX0VSUiAidWRmOiB1ZGZfcmVhZF9pbm9kZShpbm8gJWxkKSBmYWlsZWQgIWJoXG4iLAogCQkgICAgICAgaW5vZGUtPmlfaW5vKTsKQEAgLTEwMTksOCArMTEwNiw4IEBACiAKIAlpZiAoaWRlbnQgIT0gVEFHX0lERU5UX0ZFICYmIGlkZW50ICE9IFRBR19JREVOVF9FRkUgJiYKIAkgICAgaWRlbnQgIT0gVEFHX0lERU5UX1VTRSkgewotCQlwcmludGsoS0VSTl9FUlIgInVkZjogdWRmX3JlYWRfaW5vZGUoaW5vICVsZCkgZmFpbGVkIGlkZW50PSVkXG4iLAotCQkgICAgICAgaW5vZGUtPmlfaW5vLCBpZGVudCk7CisJCXByaW50ayhLRVJOX0VSUiAidWRmOiB1ZGZfcmVhZF9pbm9kZShpbm8gJWxkKSAiCisJCQkJImZhaWxlZCBpZGVudD0lZFxuIiwgaW5vZGUtPmlfaW5vLCBpZGVudCk7CiAJCWJyZWxzZShiaCk7CiAJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKIAkJcmV0dXJuOwpAQCAtMTAyOCwxMSArMTExNSwxMiBAQAogCiAJZmUgPSAoc3RydWN0IGZpbGVFbnRyeSAqKWJoLT5iX2RhdGE7CiAKLQlpZiAobGUxNl90b19jcHUoZmUtPmljYlRhZy5zdHJhdGVneVR5cGUpID09IDQwOTYpIHsKKwlpZiAoZmUtPmljYlRhZy5zdHJhdGVneVR5cGUgPT0gY3B1X3RvX2xlMTYoNDA5NikpIHsKIAkJc3RydWN0IGJ1ZmZlcl9oZWFkICppYmggPSBOVUxMLCAqbmJoID0gTlVMTDsKIAkJc3RydWN0IGluZGlyZWN0RW50cnkgKmllOwogCi0JCWliaCA9IHVkZl9yZWFkX3B0YWdnZWQoaW5vZGUtPmlfc2IsIFVERl9JX0xPQ0FUSU9OKGlub2RlKSwgMSwgJmlkZW50KTsKKwkJaWJoID0gdWRmX3JlYWRfcHRhZ2dlZChpbm9kZS0+aV9zYiwgaWluZm8tPmlfbG9jYXRpb24sIDEsCisJCQkJCSZpZGVudCk7CiAJCWlmIChpZGVudCA9PSBUQUdfSURFTlRfSUUpIHsKIAkJCWlmIChpYmgpIHsKIAkJCQlrZXJuZWxfbGJfYWRkciBsb2M7CkBAIC0xMDQxLDEwICsxMTI5LDEyIEBACiAJCQkJbG9jID0gbGVsYl90b19jcHUoaWUtPmluZGlyZWN0SUNCLmV4dExvY2F0aW9uKTsKIAogCQkJCWlmIChpZS0+aW5kaXJlY3RJQ0IuZXh0TGVuZ3RoICYmCi0JCQkJICAgIChuYmggPSB1ZGZfcmVhZF9wdGFnZ2VkKGlub2RlLT5pX3NiLCBsb2MsIDAsICZpZGVudCkpKSB7CisJCQkJICAgIChuYmggPSB1ZGZfcmVhZF9wdGFnZ2VkKGlub2RlLT5pX3NiLCBsb2MsIDAsCisJCQkJCQkJICAgICZpZGVudCkpKSB7CiAJCQkJCWlmIChpZGVudCA9PSBUQUdfSURFTlRfRkUgfHwKIAkJCQkJICAgIGlkZW50ID09IFRBR19JREVOVF9FRkUpIHsKLQkJCQkJCW1lbWNweSgmVURGX0lfTE9DQVRJT04oaW5vZGUpLCAmbG9jLAorCQkJCQkJbWVtY3B5KCZpaW5mby0+aV9sb2NhdGlvbiwKKwkJCQkJCSAgICAgICAmbG9jLAogCQkJCQkJICAgICAgIHNpemVvZihrZXJuZWxfbGJfYWRkcikpOwogCQkJCQkJYnJlbHNlKGJoKTsKIAkJCQkJCWJyZWxzZShpYmgpOwpAQCAtMTA2Miw3ICsxMTUyLDcgQEAKIAkJfSBlbHNlIHsKIAkJCWJyZWxzZShpYmgpOwogCQl9Ci0JfSBlbHNlIGlmIChsZTE2X3RvX2NwdShmZS0+aWNiVGFnLnN0cmF0ZWd5VHlwZSkgIT0gNCkgeworCX0gZWxzZSBpZiAoZmUtPmljYlRhZy5zdHJhdGVneVR5cGUgIT0gY3B1X3RvX2xlMTYoNCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IHVuc3VwcG9ydGVkIHN0cmF0ZWd5IHR5cGU6ICVkXG4iLAogCQkgICAgICAgbGUxNl90b19jcHUoZmUtPmljYlRhZy5zdHJhdGVneVR5cGUpKTsKIAkJYnJlbHNlKGJoKTsKQEAgLTEwODEsNTEgKzExNzEsNjMgQEAKIAl0aW1lX3QgY29udnRpbWU7CiAJbG9uZyBjb252dGltZV91c2VjOwogCWludCBvZmZzZXQ7CisJc3RydWN0IHVkZl9zYl9pbmZvICpzYmkgPSBVREZfU0IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqaWluZm8gPSBVREZfSShpbm9kZSk7CiAKIAlmZSA9IChzdHJ1Y3QgZmlsZUVudHJ5ICopYmgtPmJfZGF0YTsKIAllZmUgPSAoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5ICopYmgtPmJfZGF0YTsKIAotCWlmIChsZTE2X3RvX2NwdShmZS0+aWNiVGFnLnN0cmF0ZWd5VHlwZSkgPT0gNCkKLQkJVURGX0lfU1RSQVQ0MDk2KGlub2RlKSA9IDA7Ci0JZWxzZSAvKiBpZiAobGUxNl90b19jcHUoZmUtPmljYlRhZy5zdHJhdGVneVR5cGUpID09IDQwOTYpICovCi0JCVVERl9JX1NUUkFUNDA5Nihpbm9kZSkgPSAxOworCWlmIChmZS0+aWNiVGFnLnN0cmF0ZWd5VHlwZSA9PSBjcHVfdG9fbGUxNig0KSkKKwkJaWluZm8tPmlfc3RyYXQ0MDk2ID0gMDsKKwllbHNlIC8qIGlmIChmZS0+aWNiVGFnLnN0cmF0ZWd5VHlwZSA9PSBjcHVfdG9fbGUxNig0MDk2KSkgKi8KKwkJaWluZm8tPmlfc3RyYXQ0MDk2ID0gMTsKIAotCVVERl9JX0FMTE9DVFlQRShpbm9kZSkgPSBsZTE2X3RvX2NwdShmZS0+aWNiVGFnLmZsYWdzKSAmIElDQlRBR19GTEFHX0FEX01BU0s7Ci0JVURGX0lfVU5JUVVFKGlub2RlKSA9IDA7Ci0JVURGX0lfTEVORUFUVFIoaW5vZGUpID0gMDsKLQlVREZfSV9MRU5FWFRFTlRTKGlub2RlKSA9IDA7Ci0JVURGX0lfTEVOQUxMT0MoaW5vZGUpID0gMDsKLQlVREZfSV9ORVhUX0FMTE9DX0JMT0NLKGlub2RlKSA9IDA7Ci0JVURGX0lfTkVYVF9BTExPQ19HT0FMKGlub2RlKSA9IDA7Ci0JaWYgKGxlMTZfdG9fY3B1KGZlLT5kZXNjVGFnLnRhZ0lkZW50KSA9PSBUQUdfSURFTlRfRUZFKSB7Ci0JCVVERl9JX0VGRShpbm9kZSkgPSAxOwotCQlVREZfSV9VU0UoaW5vZGUpID0gMDsKLQkJaWYgKHVkZl9hbGxvY19pX2RhdGEoaW5vZGUsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkpKSkgeworCWlpbmZvLT5pX2FsbG9jX3R5cGUgPSBsZTE2X3RvX2NwdShmZS0+aWNiVGFnLmZsYWdzKSAmCisJCQkJCQkJSUNCVEFHX0ZMQUdfQURfTUFTSzsKKwlpaW5mby0+aV91bmlxdWUgPSAwOworCWlpbmZvLT5pX2xlbkVBdHRyID0gMDsKKwlpaW5mby0+aV9sZW5FeHRlbnRzID0gMDsKKwlpaW5mby0+aV9sZW5BbGxvYyA9IDA7CisJaWluZm8tPmlfbmV4dF9hbGxvY19ibG9jayA9IDA7CisJaWluZm8tPmlfbmV4dF9hbGxvY19nb2FsID0gMDsKKwlpZiAoZmUtPmRlc2NUYWcudGFnSWRlbnQgPT0gY3B1X3RvX2xlMTYoVEFHX0lERU5UX0VGRSkpIHsKKwkJaWluZm8tPmlfZWZlID0gMTsKKwkJaWluZm8tPmlfdXNlID0gMDsKKwkJaWYgKHVkZl9hbGxvY19pX2RhdGEoaW5vZGUsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtCisJCQkJCXNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkpKSkgewogCQkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOwogCQkJcmV0dXJuOwogCQl9Ci0JCW1lbWNweShVREZfSV9EQVRBKGlub2RlKSwgYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkpLAotCQkgICAgICAgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEZpbGVFbnRyeSkpOwotCX0gZWxzZSBpZiAobGUxNl90b19jcHUoZmUtPmRlc2NUYWcudGFnSWRlbnQpID09IFRBR19JREVOVF9GRSkgewotCQlVREZfSV9FRkUoaW5vZGUpID0gMDsKLQkJVURGX0lfVVNFKGlub2RlKSA9IDA7Ci0JCWlmICh1ZGZfYWxsb2NfaV9kYXRhKGlub2RlLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSkpKSB7CisJCW1lbWNweShpaW5mby0+aV9leHQuaV9kYXRhLAorCQkgICAgICAgYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkpLAorCQkgICAgICAgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0KKwkJCQkJc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEZpbGVFbnRyeSkpOworCX0gZWxzZSBpZiAoZmUtPmRlc2NUYWcudGFnSWRlbnQgPT0gY3B1X3RvX2xlMTYoVEFHX0lERU5UX0ZFKSkgeworCQlpaW5mby0+aV9lZmUgPSAwOworCQlpaW5mby0+aV91c2UgPSAwOworCQlpZiAodWRmX2FsbG9jX2lfZGF0YShpbm9kZSwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0KKwkJCQkJCXNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KSkpIHsKIAkJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKIAkJCXJldHVybjsKIAkJfQotCQltZW1jcHkoVURGX0lfREFUQShpbm9kZSksIGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSksCisJCW1lbWNweShpaW5mby0+aV9leHQuaV9kYXRhLAorCQkgICAgICAgYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KSwKIAkJICAgICAgIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KSk7Ci0JfSBlbHNlIGlmIChsZTE2X3RvX2NwdShmZS0+ZGVzY1RhZy50YWdJZGVudCkgPT0gVEFHX0lERU5UX1VTRSkgewotCQlVREZfSV9FRkUoaW5vZGUpID0gMDsKLQkJVURGX0lfVVNFKGlub2RlKSA9IDE7Ci0JCVVERl9JX0xFTkFMTE9DKGlub2RlKSA9Ci0JCSAgICBsZTMyX3RvX2NwdSgoKHN0cnVjdCB1bmFsbG9jU3BhY2VFbnRyeSAqKWJoLT5iX2RhdGEpLT5sZW5ndGhBbGxvY0Rlc2NzKTsKLQkJaWYgKHVkZl9hbGxvY19pX2RhdGEoaW5vZGUsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkpKSkgeworCX0gZWxzZSBpZiAoZmUtPmRlc2NUYWcudGFnSWRlbnQgPT0gY3B1X3RvX2xlMTYoVEFHX0lERU5UX1VTRSkpIHsKKwkJaWluZm8tPmlfZWZlID0gMDsKKwkJaWluZm8tPmlfdXNlID0gMTsKKwkJaWluZm8tPmlfbGVuQWxsb2MgPSBsZTMyX3RvX2NwdSgKKwkJCQkoKHN0cnVjdCB1bmFsbG9jU3BhY2VFbnRyeSAqKWJoLT5iX2RhdGEpLT4KKwkJCQkgbGVuZ3RoQWxsb2NEZXNjcyk7CisJCWlmICh1ZGZfYWxsb2NfaV9kYXRhKGlub2RlLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLQorCQkJCQlzaXplb2Yoc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5KSkpIHsKIAkJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKIAkJCXJldHVybjsKIAkJfQotCQltZW1jcHkoVURGX0lfREFUQShpbm9kZSksIGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5KSwKLQkJICAgICAgIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkpKTsKKwkJbWVtY3B5KGlpbmZvLT5pX2V4dC5pX2RhdGEsCisJCSAgICAgICBiaC0+Yl9kYXRhICsgc2l6ZW9mKHN0cnVjdCB1bmFsbG9jU3BhY2VFbnRyeSksCisJCSAgICAgICBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLQorCQkJCQlzaXplb2Yoc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5KSk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTExNDYsMTIgKzEyNDgsMTIgQEAKIAkJaW5vZGUtPmlfbmxpbmsgPSAxOwogCiAJaW5vZGUtPmlfc2l6ZSA9IGxlNjRfdG9fY3B1KGZlLT5pbmZvcm1hdGlvbkxlbmd0aCk7Ci0JVURGX0lfTEVORVhURU5UUyhpbm9kZSkgPSBpbm9kZS0+aV9zaXplOworCWlpbmZvLT5pX2xlbkV4dGVudHMgPSBpbm9kZS0+aV9zaXplOwogCiAJaW5vZGUtPmlfbW9kZSA9IHVkZl9jb252ZXJ0X3Blcm1pc3Npb25zKGZlKTsKIAlpbm9kZS0+aV9tb2RlICY9IH5VREZfU0IoaW5vZGUtPmlfc2IpLT5zX3VtYXNrOwogCi0JaWYgKFVERl9JX0VGRShpbm9kZSkgPT0gMCkgeworCWlmIChpaW5mby0+aV9lZmUgPT0gMCkgewogCQlpbm9kZS0+aV9ibG9ja3MgPSBsZTY0X3RvX2NwdShmZS0+bG9naWNhbEJsb2Nrc1JlY29yZGVkKSA8PAogCQkJKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSk7CiAKQEAgLTExNjAsNyArMTI2Miw3IEBACiAJCQlpbm9kZS0+aV9hdGltZS50dl9zZWMgPSBjb252dGltZTsKIAkJCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSBjb252dGltZV91c2VjICogMTAwMDsKIAkJfSBlbHNlIHsKLQkJCWlub2RlLT5pX2F0aW1lID0gVURGX1NCX1JFQ09SRFRJTUUoaW5vZGUtPmlfc2IpOworCQkJaW5vZGUtPmlfYXRpbWUgPSBzYmktPnNfcmVjb3JkX3RpbWU7CiAJCX0KIAogCQlpZiAodWRmX3N0YW1wX3RvX3RpbWUoJmNvbnZ0aW1lLCAmY29udnRpbWVfdXNlYywKQEAgLTExNjgsNyArMTI3MCw3IEBACiAJCQlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBjb252dGltZTsKIAkJCWlub2RlLT5pX210aW1lLnR2X25zZWMgPSBjb252dGltZV91c2VjICogMTAwMDsKIAkJfSBlbHNlIHsKLQkJCWlub2RlLT5pX210aW1lID0gVURGX1NCX1JFQ09SRFRJTUUoaW5vZGUtPmlfc2IpOworCQkJaW5vZGUtPmlfbXRpbWUgPSBzYmktPnNfcmVjb3JkX3RpbWU7CiAJCX0KIAogCQlpZiAodWRmX3N0YW1wX3RvX3RpbWUoJmNvbnZ0aW1lLCAmY29udnRpbWVfdXNlYywKQEAgLTExNzYsMTMgKzEyNzgsMTMgQEAKIAkJCWlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IGNvbnZ0aW1lOwogCQkJaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IGNvbnZ0aW1lX3VzZWMgKiAxMDAwOwogCQl9IGVsc2UgewotCQkJaW5vZGUtPmlfY3RpbWUgPSBVREZfU0JfUkVDT1JEVElNRShpbm9kZS0+aV9zYik7CisJCQlpbm9kZS0+aV9jdGltZSA9IHNiaS0+c19yZWNvcmRfdGltZTsKIAkJfQogCi0JCVVERl9JX1VOSVFVRShpbm9kZSkgPSBsZTY0X3RvX2NwdShmZS0+dW5pcXVlSUQpOwotCQlVREZfSV9MRU5FQVRUUihpbm9kZSkgPSBsZTMyX3RvX2NwdShmZS0+bGVuZ3RoRXh0ZW5kZWRBdHRyKTsKLQkJVURGX0lfTEVOQUxMT0MoaW5vZGUpID0gbGUzMl90b19jcHUoZmUtPmxlbmd0aEFsbG9jRGVzY3MpOwotCQlvZmZzZXQgPSBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSkgKyBVREZfSV9MRU5FQVRUUihpbm9kZSk7CisJCWlpbmZvLT5pX3VuaXF1ZSA9IGxlNjRfdG9fY3B1KGZlLT51bmlxdWVJRCk7CisJCWlpbmZvLT5pX2xlbkVBdHRyID0gbGUzMl90b19jcHUoZmUtPmxlbmd0aEV4dGVuZGVkQXR0cik7CisJCWlpbmZvLT5pX2xlbkFsbG9jID0gbGUzMl90b19jcHUoZmUtPmxlbmd0aEFsbG9jRGVzY3MpOworCQlvZmZzZXQgPSBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSkgKyBpaW5mby0+aV9sZW5FQXR0cjsKIAl9IGVsc2UgewogCQlpbm9kZS0+aV9ibG9ja3MgPSBsZTY0X3RvX2NwdShlZmUtPmxvZ2ljYWxCbG9ja3NSZWNvcmRlZCkgPDwKIAkJICAgIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyAtIDkpOwpAQCAtMTE5Miw3ICsxMjk0LDcgQEAKIAkJCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IGNvbnZ0aW1lOwogCQkJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IGNvbnZ0aW1lX3VzZWMgKiAxMDAwOwogCQl9IGVsc2UgewotCQkJaW5vZGUtPmlfYXRpbWUgPSBVREZfU0JfUkVDT1JEVElNRShpbm9kZS0+aV9zYik7CisJCQlpbm9kZS0+aV9hdGltZSA9IHNiaS0+c19yZWNvcmRfdGltZTsKIAkJfQogCiAJCWlmICh1ZGZfc3RhbXBfdG9fdGltZSgmY29udnRpbWUsICZjb252dGltZV91c2VjLApAQCAtMTIwMCwxNSArMTMwMiwxNSBAQAogCQkJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gY29udnRpbWU7CiAJCQlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gY29udnRpbWVfdXNlYyAqIDEwMDA7CiAJCX0gZWxzZSB7Ci0JCQlpbm9kZS0+aV9tdGltZSA9IFVERl9TQl9SRUNPUkRUSU1FKGlub2RlLT5pX3NiKTsKKwkJCWlub2RlLT5pX210aW1lID0gc2JpLT5zX3JlY29yZF90aW1lOwogCQl9CiAKIAkJaWYgKHVkZl9zdGFtcF90b190aW1lKCZjb252dGltZSwgJmNvbnZ0aW1lX3VzZWMsCiAJCQkJICAgICAgbGV0c190b19jcHUoZWZlLT5jcmVhdGVUaW1lKSkpIHsKLQkJCVVERl9JX0NSVElNRShpbm9kZSkudHZfc2VjID0gY29udnRpbWU7Ci0JCQlVREZfSV9DUlRJTUUoaW5vZGUpLnR2X25zZWMgPSBjb252dGltZV91c2VjICogMTAwMDsKKwkJCWlpbmZvLT5pX2NydGltZS50dl9zZWMgPSBjb252dGltZTsKKwkJCWlpbmZvLT5pX2NydGltZS50dl9uc2VjID0gY29udnRpbWVfdXNlYyAqIDEwMDA7CiAJCX0gZWxzZSB7Ci0JCQlVREZfSV9DUlRJTUUoaW5vZGUpID0gVURGX1NCX1JFQ09SRFRJTUUoaW5vZGUtPmlfc2IpOworCQkJaWluZm8tPmlfY3J0aW1lID0gc2JpLT5zX3JlY29yZF90aW1lOwogCQl9CiAKIAkJaWYgKHVkZl9zdGFtcF90b190aW1lKCZjb252dGltZSwgJmNvbnZ0aW1lX3VzZWMsCkBAIC0xMjE2LDEzICsxMzE4LDE0IEBACiAJCQlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBjb252dGltZTsKIAkJCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSBjb252dGltZV91c2VjICogMTAwMDsKIAkJfSBlbHNlIHsKLQkJCWlub2RlLT5pX2N0aW1lID0gVURGX1NCX1JFQ09SRFRJTUUoaW5vZGUtPmlfc2IpOworCQkJaW5vZGUtPmlfY3RpbWUgPSBzYmktPnNfcmVjb3JkX3RpbWU7CiAJCX0KIAotCQlVREZfSV9VTklRVUUoaW5vZGUpID0gbGU2NF90b19jcHUoZWZlLT51bmlxdWVJRCk7Ci0JCVVERl9JX0xFTkVBVFRSKGlub2RlKSA9IGxlMzJfdG9fY3B1KGVmZS0+bGVuZ3RoRXh0ZW5kZWRBdHRyKTsKLQkJVURGX0lfTEVOQUxMT0MoaW5vZGUpID0gbGUzMl90b19jcHUoZWZlLT5sZW5ndGhBbGxvY0Rlc2NzKTsKLQkJb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEZpbGVFbnRyeSkgKyBVREZfSV9MRU5FQVRUUihpbm9kZSk7CisJCWlpbmZvLT5pX3VuaXF1ZSA9IGxlNjRfdG9fY3B1KGVmZS0+dW5pcXVlSUQpOworCQlpaW5mby0+aV9sZW5FQXR0ciA9IGxlMzJfdG9fY3B1KGVmZS0+bGVuZ3RoRXh0ZW5kZWRBdHRyKTsKKwkJaWluZm8tPmlfbGVuQWxsb2MgPSBsZTMyX3RvX2NwdShlZmUtPmxlbmd0aEFsbG9jRGVzY3MpOworCQlvZmZzZXQgPSBzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSArCisJCQkJCQkJaWluZm8tPmlfbGVuRUF0dHI7CiAJfQogCiAJc3dpdGNoIChmZS0+aWNiVGFnLmZpbGVUeXBlKSB7CkBAIC0xMjM1LDcgKzEzMzgsNyBAQAogCWNhc2UgSUNCVEFHX0ZJTEVfVFlQRV9SRUFMVElNRToKIAljYXNlIElDQlRBR19GSUxFX1RZUEVfUkVHVUxBUjoKIAljYXNlIElDQlRBR19GSUxFX1RZUEVfVU5ERUY6Ci0JCWlmIChVREZfSV9BTExPQ1RZUEUoaW5vZGUpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikKKwkJaWYgKGlpbmZvLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKQogCQkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZ1ZGZfYWRpbmljYl9hb3BzOwogCQllbHNlCiAJCQlpbm9kZS0+aV9kYXRhLmFfb3BzID0gJnVkZl9hb3BzOwpAQCAtMTI2MSwzMSArMTM2NCwzMyBAQAogCQlpbm9kZS0+aV9tb2RlID0gU19JRkxOSyB8IFNfSVJXWFVHTzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IHVkZl9maWxsX2lub2RlKGlubyAlbGQpIGZhaWxlZCB1bmtub3duIGZpbGUgdHlwZT0lZFxuIiwKLQkJICAgICAgIGlub2RlLT5pX2lubywgZmUtPmljYlRhZy5maWxlVHlwZSk7CisJCXByaW50ayhLRVJOX0VSUiAidWRmOiB1ZGZfZmlsbF9pbm9kZShpbm8gJWxkKSBmYWlsZWQgdW5rbm93biAiCisJCQkJImZpbGUgdHlwZT0lZFxuIiwgaW5vZGUtPmlfaW5vLAorCQkJCWZlLT5pY2JUYWcuZmlsZVR5cGUpOwogCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CiAJCXJldHVybjsKIAl9CiAJaWYgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkgewotCQlzdHJ1Y3QgZGV2aWNlU3BlYyAqZHNlYSA9IChzdHJ1Y3QgZGV2aWNlU3BlYyAqKXVkZl9nZXRfZXh0ZW5kZWRhdHRyKGlub2RlLCAxMiwgMSk7CisJCXN0cnVjdCBkZXZpY2VTcGVjICpkc2VhID0KKwkJCShzdHJ1Y3QgZGV2aWNlU3BlYyAqKXVkZl9nZXRfZXh0ZW5kZWRhdHRyKGlub2RlLCAxMiwgMSk7CiAJCWlmIChkc2VhKSB7CiAJCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsCi0JCQkJCSAgIE1LREVWKGxlMzJfdG9fY3B1KGRzZWEtPm1ham9yRGV2aWNlSWRlbnQpLAotCQkJCQkJIGxlMzJfdG9fY3B1KGRzZWEtPm1pbm9yRGV2aWNlSWRlbnQpKSk7CisJCQkJTUtERVYobGUzMl90b19jcHUoZHNlYS0+bWFqb3JEZXZpY2VJZGVudCksCisJCQkJICAgICAgbGUzMl90b19jcHUoZHNlYS0+bWlub3JEZXZpY2VJZGVudCkpKTsKIAkJCS8qIERldmVsb3BlciBJRCA/Pz8gKi8KLQkJfSBlbHNlIHsKKwkJfSBlbHNlCiAJCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7Ci0JCX0KIAl9CiB9CiAKIHN0YXRpYyBpbnQgdWRmX2FsbG9jX2lfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzaXplX3Qgc2l6ZSkKIHsKLQlVREZfSV9EQVRBKGlub2RlKSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IHVkZl9pbm9kZV9pbmZvICppaW5mbyA9IFVERl9JKGlub2RlKTsKKwlpaW5mby0+aV9leHQuaV9kYXRhID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAotCWlmICghVURGX0lfREFUQShpbm9kZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6dWRmX2FsbG9jX2lfZGF0YSAoaW5vICVsZCkgbm8gZnJlZSBtZW1vcnlcbiIsCi0JCSAgICAgICBpbm9kZS0+aV9pbm8pOworCWlmICghaWluZm8tPmlfZXh0LmlfZGF0YSkgeworCQlwcmludGsoS0VSTl9FUlIgInVkZjp1ZGZfYWxsb2NfaV9kYXRhIChpbm8gJWxkKSAiCisJCQkJIm5vIGZyZWUgbWVtb3J5XG4iLCBpbm9kZS0+aV9pbm8pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTEzMDEsMTIgKzE0MDYsMTIgQEAKIAlwZXJtaXNzaW9ucyA9IGxlMzJfdG9fY3B1KGZlLT5wZXJtaXNzaW9ucyk7CiAJZmxhZ3MgPSBsZTE2X3RvX2NwdShmZS0+aWNiVGFnLmZsYWdzKTsKIAotCW1vZGUgPQkoKCBwZXJtaXNzaW9ucyAgICAgICkgJiBTX0lSV1hPKSB8Ci0JCSgoIHBlcm1pc3Npb25zID4+IDIgKSAmIFNfSVJXWEcpIHwKLQkJKCggcGVybWlzc2lvbnMgPj4gNCApICYgU19JUldYVSkgfAotCQkoKCBmbGFncyAmIElDQlRBR19GTEFHX1NFVFVJRCkgPyBTX0lTVUlEIDogMCkgfAotCQkoKCBmbGFncyAmIElDQlRBR19GTEFHX1NFVEdJRCkgPyBTX0lTR0lEIDogMCkgfAotCQkoKCBmbGFncyAmIElDQlRBR19GTEFHX1NUSUNLWSkgPyBTX0lTVlRYIDogMCk7CisJbW9kZSA9CSgocGVybWlzc2lvbnMpICYgU19JUldYTykgfAorCQkoKHBlcm1pc3Npb25zID4+IDIpICYgU19JUldYRykgfAorCQkoKHBlcm1pc3Npb25zID4+IDQpICYgU19JUldYVSkgfAorCQkoKGZsYWdzICYgSUNCVEFHX0ZMQUdfU0VUVUlEKSA/IFNfSVNVSUQgOiAwKSB8CisJCSgoZmxhZ3MgJiBJQ0JUQUdfRkxBR19TRVRHSUQpID8gU19JU0dJRCA6IDApIHwKKwkJKChmbGFncyAmIElDQlRBR19GTEFHX1NUSUNLWSkgPyBTX0lTVlRYIDogMCk7CiAKIAlyZXR1cm4gbW9kZTsKIH0KQEAgLTEzNTAsMTEgKzE0NTUsMTUgQEAKIAl1aW50MzJfdCB1ZGZwZXJtczsKIAl1aW50MTZfdCBpY2JmbGFnczsKIAl1aW50MTZfdCBjcmNsZW47Ci0JaW50IGk7CiAJa2VybmVsX3RpbWVzdGFtcCBjcHVfdGltZTsKIAlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgdWRmX3NiX2luZm8gKnNiaSA9IFVERl9TQihpbm9kZS0+aV9zYik7CisJdW5zaWduZWQgY2hhciBibG9ja3NpemVfYml0cyA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqaWluZm8gPSBVREZfSShpbm9kZSk7CiAKLQliaCA9IHVkZl90cmVhZChpbm9kZS0+aV9zYiwgdWRmX2dldF9sYl9wYmxvY2soaW5vZGUtPmlfc2IsIFVERl9JX0xPQ0FUSU9OKGlub2RlKSwgMCkpOworCWJoID0gdWRmX3RyZWFkKGlub2RlLT5pX3NiLAorCQkJdWRmX2dldF9sYl9wYmxvY2soaW5vZGUtPmlfc2IsCisJCQkJCSAgaWluZm8tPmlfbG9jYXRpb24sIDApKTsKIAlpZiAoIWJoKSB7CiAJCXVkZl9kZWJ1ZygiYnJlYWQgZmFpbHVyZVxuIik7CiAJCXJldHVybiAtRUlPOwpAQCAtMTM2NSwyMyArMTQ3NCwyNCBAQAogCWZlID0gKHN0cnVjdCBmaWxlRW50cnkgKiliaC0+Yl9kYXRhOwogCWVmZSA9IChzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkgKiliaC0+Yl9kYXRhOwogCi0JaWYgKGxlMTZfdG9fY3B1KGZlLT5kZXNjVGFnLnRhZ0lkZW50KSA9PSBUQUdfSURFTlRfVVNFKSB7CisJaWYgKGZlLT5kZXNjVGFnLnRhZ0lkZW50ID09IGNwdV90b19sZTE2KFRBR19JREVOVF9VU0UpKSB7CiAJCXN0cnVjdCB1bmFsbG9jU3BhY2VFbnRyeSAqdXNlID0KIAkJCShzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkgKiliaC0+Yl9kYXRhOwogCi0JCXVzZS0+bGVuZ3RoQWxsb2NEZXNjcyA9IGNwdV90b19sZTMyKFVERl9JX0xFTkFMTE9DKGlub2RlKSk7Ci0JCW1lbWNweShiaC0+Yl9kYXRhICsgc2l6ZW9mKHN0cnVjdCB1bmFsbG9jU3BhY2VFbnRyeSksIFVERl9JX0RBVEEoaW5vZGUpLAotCQkgICAgICAgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCB1bmFsbG9jU3BhY2VFbnRyeSkpOwotCQljcmNsZW4gPSBzaXplb2Yoc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5KSArIFVERl9JX0xFTkFMTE9DKGlub2RlKSAtIHNpemVvZih0YWcpOwotCQl1c2UtPmRlc2NUYWcudGFnTG9jYXRpb24gPSBjcHVfdG9fbGUzMihVREZfSV9MT0NBVElPTihpbm9kZSkubG9naWNhbEJsb2NrTnVtKTsKKwkJdXNlLT5sZW5ndGhBbGxvY0Rlc2NzID0gY3B1X3RvX2xlMzIoaWluZm8tPmlfbGVuQWxsb2MpOworCQltZW1jcHkoYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkpLAorCQkgICAgICAgaWluZm8tPmlfZXh0LmlfZGF0YSwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0KKwkJCQkJc2l6ZW9mKHN0cnVjdCB1bmFsbG9jU3BhY2VFbnRyeSkpOworCQljcmNsZW4gPSBzaXplb2Yoc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5KSArCisJCQkJaWluZm8tPmlfbGVuQWxsb2MgLSBzaXplb2YodGFnKTsKKwkJdXNlLT5kZXNjVGFnLnRhZ0xvY2F0aW9uID0gY3B1X3RvX2xlMzIoCisJCQkJCQlpaW5mby0+aV9sb2NhdGlvbi4KKwkJCQkJCQlsb2dpY2FsQmxvY2tOdW0pOwogCQl1c2UtPmRlc2NUYWcuZGVzY0NSQ0xlbmd0aCA9IGNwdV90b19sZTE2KGNyY2xlbik7Ci0JCXVzZS0+ZGVzY1RhZy5kZXNjQ1JDID0gY3B1X3RvX2xlMTYodWRmX2NyYygoY2hhciAqKXVzZSArIHNpemVvZih0YWcpLCBjcmNsZW4sIDApKTsKLQotCQl1c2UtPmRlc2NUYWcudGFnQ2hlY2tzdW0gPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQkJaWYgKGkgIT0gNCkKLQkJCQl1c2UtPmRlc2NUYWcudGFnQ2hlY2tzdW0gKz0gKCh1aW50OF90ICopJih1c2UtPmRlc2NUYWcpKVtpXTsKLQkJfQorCQl1c2UtPmRlc2NUYWcuZGVzY0NSQyA9IGNwdV90b19sZTE2KHVkZl9jcmMoKGNoYXIgKil1c2UgKworCQkJCQkJCSAgIHNpemVvZih0YWcpLCBjcmNsZW4sCisJCQkJCQkJICAgMCkpOworCQl1c2UtPmRlc2NUYWcudGFnQ2hlY2tzdW0gPSB1ZGZfdGFnX2NoZWNrc3VtKCZ1c2UtPmRlc2NUYWcpOwogCiAJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKIAkJYnJlbHNlKGJoKTsKQEAgLTEzOTgsMTQgKzE1MDgsMTQgQEAKIAllbHNlCiAJCWZlLT5naWQgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9naWQpOwogCi0JdWRmcGVybXMgPQkoKGlub2RlLT5pX21vZGUgJiBTX0lSV1hPKSAgICAgKSB8Ci0JCQkoKGlub2RlLT5pX21vZGUgJiBTX0lSV1hHKSA8PCAyKSB8Ci0JCQkoKGlub2RlLT5pX21vZGUgJiBTX0lSV1hVKSA8PCA0KTsKKwl1ZGZwZXJtcyA9ICgoaW5vZGUtPmlfbW9kZSAmIFNfSVJXWE8pKSB8CisJCSAgICgoaW5vZGUtPmlfbW9kZSAmIFNfSVJXWEcpIDw8IDIpIHwKKwkJICAgKChpbm9kZS0+aV9tb2RlICYgU19JUldYVSkgPDwgNCk7CiAKLQl1ZGZwZXJtcyB8PQkobGUzMl90b19jcHUoZmUtPnBlcm1pc3Npb25zKSAmCi0JCQkoRkVfUEVSTV9PX0RFTEVURSB8IEZFX1BFUk1fT19DSEFUVFIgfAotCQkJIEZFX1BFUk1fR19ERUxFVEUgfCBGRV9QRVJNX0dfQ0hBVFRSIHwKLQkJCSBGRV9QRVJNX1VfREVMRVRFIHwgRkVfUEVSTV9VX0NIQVRUUikpOworCXVkZnBlcm1zIHw9IChsZTMyX3RvX2NwdShmZS0+cGVybWlzc2lvbnMpICYKKwkJICAgIChGRV9QRVJNX09fREVMRVRFIHwgRkVfUEVSTV9PX0NIQVRUUiB8CisJCSAgICAgRkVfUEVSTV9HX0RFTEVURSB8IEZFX1BFUk1fR19DSEFUVFIgfAorCQkgICAgIEZFX1BFUk1fVV9ERUxFVEUgfCBGRV9QRVJNX1VfQ0hBVFRSKSk7CiAJZmUtPnBlcm1pc3Npb25zID0gY3B1X3RvX2xlMzIodWRmcGVybXMpOwogCiAJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCkBAIC0xNDI2LDggKzE1MzYsOSBAQAogCQkJCQkJICAgICBzaXplb2YocmVnaWQpLCAxMiwgMHgzKTsKIAkJCWRzZWEtPmF0dHJUeXBlID0gY3B1X3RvX2xlMzIoMTIpOwogCQkJZHNlYS0+YXR0clN1YnR5cGUgPSAxOwotCQkJZHNlYS0+YXR0ckxlbmd0aCA9IGNwdV90b19sZTMyKHNpemVvZihzdHJ1Y3QgZGV2aWNlU3BlYykgKwotCQkJCQkJICAgICAgIHNpemVvZihyZWdpZCkpOworCQkJZHNlYS0+YXR0ckxlbmd0aCA9IGNwdV90b19sZTMyKAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBkZXZpY2VTcGVjKSArCisJCQkJCQlzaXplb2YocmVnaWQpKTsKIAkJCWRzZWEtPmltcFVzZUxlbmd0aCA9IGNwdV90b19sZTMyKHNpemVvZihyZWdpZCkpOwogCQl9CiAJCWVpZCA9IChyZWdpZCAqKWRzZWEtPmltcFVzZTsKQEAgLTE0MzksMTIgKzE1NTAsMTMgQEAKIAkJZHNlYS0+bWlub3JEZXZpY2VJZGVudCA9IGNwdV90b19sZTMyKGltaW5vcihpbm9kZSkpOwogCX0KIAotCWlmIChVREZfSV9FRkUoaW5vZGUpID09IDApIHsKLQkJbWVtY3B5KGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSksIFVERl9JX0RBVEEoaW5vZGUpLAorCWlmIChpaW5mby0+aV9lZmUgPT0gMCkgeworCQltZW1jcHkoYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KSwKKwkJICAgICAgIGlpbmZvLT5pX2V4dC5pX2RhdGEsCiAJCSAgICAgICBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSkpOwogCQlmZS0+bG9naWNhbEJsb2Nrc1JlY29yZGVkID0gY3B1X3RvX2xlNjQoCi0JCQkoaW5vZGUtPmlfYmxvY2tzICsgKDEgPDwgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSkpIC0gMSkgPj4KLQkJCShpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyAtIDkpKTsKKwkJCShpbm9kZS0+aV9ibG9ja3MgKyAoMSA8PCAoYmxvY2tzaXplX2JpdHMgLSA5KSkgLSAxKSA+PgorCQkJKGJsb2Nrc2l6ZV9iaXRzIC0gOSkpOwogCiAJCWlmICh1ZGZfdGltZV90b19zdGFtcCgmY3B1X3RpbWUsIGlub2RlLT5pX2F0aW1lKSkKIAkJCWZlLT5hY2Nlc3NUaW1lID0gY3B1X3RvX2xldHMoY3B1X3RpbWUpOwpAQCAtMTQ1Niw0MCArMTU2OCw0MSBAQAogCQlzdHJjcHkoZmUtPmltcElkZW50LmlkZW50LCBVREZfSURfREVWRUxPUEVSKTsKIAkJZmUtPmltcElkZW50LmlkZW50U3VmZml4WzBdID0gVURGX09TX0NMQVNTX1VOSVg7CiAJCWZlLT5pbXBJZGVudC5pZGVudFN1ZmZpeFsxXSA9IFVERl9PU19JRF9MSU5VWDsKLQkJZmUtPnVuaXF1ZUlEID0gY3B1X3RvX2xlNjQoVURGX0lfVU5JUVVFKGlub2RlKSk7Ci0JCWZlLT5sZW5ndGhFeHRlbmRlZEF0dHIgPSBjcHVfdG9fbGUzMihVREZfSV9MRU5FQVRUUihpbm9kZSkpOwotCQlmZS0+bGVuZ3RoQWxsb2NEZXNjcyA9IGNwdV90b19sZTMyKFVERl9JX0xFTkFMTE9DKGlub2RlKSk7CisJCWZlLT51bmlxdWVJRCA9IGNwdV90b19sZTY0KGlpbmZvLT5pX3VuaXF1ZSk7CisJCWZlLT5sZW5ndGhFeHRlbmRlZEF0dHIgPSBjcHVfdG9fbGUzMihpaW5mby0+aV9sZW5FQXR0cik7CisJCWZlLT5sZW5ndGhBbGxvY0Rlc2NzID0gY3B1X3RvX2xlMzIoaWluZm8tPmlfbGVuQWxsb2MpOwogCQlmZS0+ZGVzY1RhZy50YWdJZGVudCA9IGNwdV90b19sZTE2KFRBR19JREVOVF9GRSk7CiAJCWNyY2xlbiA9IHNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KTsKIAl9IGVsc2UgewotCQltZW1jcHkoYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkpLCBVREZfSV9EQVRBKGlub2RlKSwKLQkJICAgICAgIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkpKTsKKwkJbWVtY3B5KGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSwKKwkJICAgICAgIGlpbmZvLT5pX2V4dC5pX2RhdGEsCisJCSAgICAgICBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLQorCQkJCQlzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSk7CiAJCWVmZS0+b2JqZWN0U2l6ZSA9IGNwdV90b19sZTY0KGlub2RlLT5pX3NpemUpOwogCQllZmUtPmxvZ2ljYWxCbG9ja3NSZWNvcmRlZCA9IGNwdV90b19sZTY0KAotCQkJKGlub2RlLT5pX2Jsb2NrcyArICgxIDw8IChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyAtIDkpKSAtIDEpID4+Ci0JCQkoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSA5KSk7CisJCQkoaW5vZGUtPmlfYmxvY2tzICsgKDEgPDwgKGJsb2Nrc2l6ZV9iaXRzIC0gOSkpIC0gMSkgPj4KKwkJCShibG9ja3NpemVfYml0cyAtIDkpKTsKIAotCQlpZiAoVURGX0lfQ1JUSU1FKGlub2RlKS50dl9zZWMgPiBpbm9kZS0+aV9hdGltZS50dl9zZWMgfHwKLQkJICAgIChVREZfSV9DUlRJTUUoaW5vZGUpLnR2X3NlYyA9PSBpbm9kZS0+aV9hdGltZS50dl9zZWMgJiYKLQkJICAgICBVREZfSV9DUlRJTUUoaW5vZGUpLnR2X25zZWMgPiBpbm9kZS0+aV9hdGltZS50dl9uc2VjKSkgewotCQkJVURGX0lfQ1JUSU1FKGlub2RlKSA9IGlub2RlLT5pX2F0aW1lOwotCQl9Ci0JCWlmIChVREZfSV9DUlRJTUUoaW5vZGUpLnR2X3NlYyA+IGlub2RlLT5pX210aW1lLnR2X3NlYyB8fAotCQkgICAgKFVERl9JX0NSVElNRShpbm9kZSkudHZfc2VjID09IGlub2RlLT5pX210aW1lLnR2X3NlYyAmJgotCQkgICAgIFVERl9JX0NSVElNRShpbm9kZSkudHZfbnNlYyA+IGlub2RlLT5pX210aW1lLnR2X25zZWMpKSB7Ci0JCQlVREZfSV9DUlRJTUUoaW5vZGUpID0gaW5vZGUtPmlfbXRpbWU7Ci0JCX0KLQkJaWYgKFVERl9JX0NSVElNRShpbm9kZSkudHZfc2VjID4gaW5vZGUtPmlfY3RpbWUudHZfc2VjIHx8Ci0JCSAgICAoVURGX0lfQ1JUSU1FKGlub2RlKS50dl9zZWMgPT0gaW5vZGUtPmlfY3RpbWUudHZfc2VjICYmCi0JCSAgICAgVURGX0lfQ1JUSU1FKGlub2RlKS50dl9uc2VjID4gaW5vZGUtPmlfY3RpbWUudHZfbnNlYykpIHsKLQkJCVVERl9JX0NSVElNRShpbm9kZSkgPSBpbm9kZS0+aV9jdGltZTsKLQkJfQorCQlpZiAoaWluZm8tPmlfY3J0aW1lLnR2X3NlYyA+IGlub2RlLT5pX2F0aW1lLnR2X3NlYyB8fAorCQkgICAgKGlpbmZvLT5pX2NydGltZS50dl9zZWMgPT0gaW5vZGUtPmlfYXRpbWUudHZfc2VjICYmCisJCSAgICAgaWluZm8tPmlfY3J0aW1lLnR2X25zZWMgPiBpbm9kZS0+aV9hdGltZS50dl9uc2VjKSkKKwkJCWlpbmZvLT5pX2NydGltZSA9IGlub2RlLT5pX2F0aW1lOworCisJCWlmIChpaW5mby0+aV9jcnRpbWUudHZfc2VjID4gaW5vZGUtPmlfbXRpbWUudHZfc2VjIHx8CisJCSAgICAoaWluZm8tPmlfY3J0aW1lLnR2X3NlYyA9PSBpbm9kZS0+aV9tdGltZS50dl9zZWMgJiYKKwkJICAgICBpaW5mby0+aV9jcnRpbWUudHZfbnNlYyA+IGlub2RlLT5pX210aW1lLnR2X25zZWMpKQorCQkJaWluZm8tPmlfY3J0aW1lID0gaW5vZGUtPmlfbXRpbWU7CisKKwkJaWYgKGlpbmZvLT5pX2NydGltZS50dl9zZWMgPiBpbm9kZS0+aV9jdGltZS50dl9zZWMgfHwKKwkJICAgIChpaW5mby0+aV9jcnRpbWUudHZfc2VjID09IGlub2RlLT5pX2N0aW1lLnR2X3NlYyAmJgorCQkgICAgIGlpbmZvLT5pX2NydGltZS50dl9uc2VjID4gaW5vZGUtPmlfY3RpbWUudHZfbnNlYykpCisJCQlpaW5mby0+aV9jcnRpbWUgPSBpbm9kZS0+aV9jdGltZTsKIAogCQlpZiAodWRmX3RpbWVfdG9fc3RhbXAoJmNwdV90aW1lLCBpbm9kZS0+aV9hdGltZSkpCiAJCQllZmUtPmFjY2Vzc1RpbWUgPSBjcHVfdG9fbGV0cyhjcHVfdGltZSk7CiAJCWlmICh1ZGZfdGltZV90b19zdGFtcCgmY3B1X3RpbWUsIGlub2RlLT5pX210aW1lKSkKIAkJCWVmZS0+bW9kaWZpY2F0aW9uVGltZSA9IGNwdV90b19sZXRzKGNwdV90aW1lKTsKLQkJaWYgKHVkZl90aW1lX3RvX3N0YW1wKCZjcHVfdGltZSwgVURGX0lfQ1JUSU1FKGlub2RlKSkpCisJCWlmICh1ZGZfdGltZV90b19zdGFtcCgmY3B1X3RpbWUsIGlpbmZvLT5pX2NydGltZSkpCiAJCQllZmUtPmNyZWF0ZVRpbWUgPSBjcHVfdG9fbGV0cyhjcHVfdGltZSk7CiAJCWlmICh1ZGZfdGltZV90b19zdGFtcCgmY3B1X3RpbWUsIGlub2RlLT5pX2N0aW1lKSkKIAkJCWVmZS0+YXR0clRpbWUgPSBjcHVfdG9fbGV0cyhjcHVfdGltZSk7CkBAIC0xNDk4LDEzICsxNjExLDEzIEBACiAJCXN0cmNweShlZmUtPmltcElkZW50LmlkZW50LCBVREZfSURfREVWRUxPUEVSKTsKIAkJZWZlLT5pbXBJZGVudC5pZGVudFN1ZmZpeFswXSA9IFVERl9PU19DTEFTU19VTklYOwogCQllZmUtPmltcElkZW50LmlkZW50U3VmZml4WzFdID0gVURGX09TX0lEX0xJTlVYOwotCQllZmUtPnVuaXF1ZUlEID0gY3B1X3RvX2xlNjQoVURGX0lfVU5JUVVFKGlub2RlKSk7Ci0JCWVmZS0+bGVuZ3RoRXh0ZW5kZWRBdHRyID0gY3B1X3RvX2xlMzIoVURGX0lfTEVORUFUVFIoaW5vZGUpKTsKLQkJZWZlLT5sZW5ndGhBbGxvY0Rlc2NzID0gY3B1X3RvX2xlMzIoVURGX0lfTEVOQUxMT0MoaW5vZGUpKTsKKwkJZWZlLT51bmlxdWVJRCA9IGNwdV90b19sZTY0KGlpbmZvLT5pX3VuaXF1ZSk7CisJCWVmZS0+bGVuZ3RoRXh0ZW5kZWRBdHRyID0gY3B1X3RvX2xlMzIoaWluZm8tPmlfbGVuRUF0dHIpOworCQllZmUtPmxlbmd0aEFsbG9jRGVzY3MgPSBjcHVfdG9fbGUzMihpaW5mby0+aV9sZW5BbGxvYyk7CiAJCWVmZS0+ZGVzY1RhZy50YWdJZGVudCA9IGNwdV90b19sZTE2KFRBR19JREVOVF9FRkUpOwogCQljcmNsZW4gPSBzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KTsKIAl9Ci0JaWYgKFVERl9JX1NUUkFUNDA5Nihpbm9kZSkpIHsKKwlpZiAoaWluZm8tPmlfc3RyYXQ0MDk2KSB7CiAJCWZlLT5pY2JUYWcuc3RyYXRlZ3lUeXBlID0gY3B1X3RvX2xlMTYoNDA5Nik7CiAJCWZlLT5pY2JUYWcuc3RyYXRlZ3lQYXJhbWV0ZXIgPSBjcHVfdG9fbGUxNigxKTsKIAkJZmUtPmljYlRhZy5udW1FbnRyaWVzID0gY3B1X3RvX2xlMTYoMik7CkBAIC0xNTI4LDcgKzE2NDEsNyBAQAogCWVsc2UgaWYgKFNfSVNTT0NLKGlub2RlLT5pX21vZGUpKQogCQlmZS0+aWNiVGFnLmZpbGVUeXBlID0gSUNCVEFHX0ZJTEVfVFlQRV9TT0NLRVQ7CiAKLQlpY2JmbGFncyA9CVVERl9JX0FMTE9DVFlQRShpbm9kZSkgfAorCWljYmZsYWdzID0JaWluZm8tPmlfYWxsb2NfdHlwZSB8CiAJCQkoKGlub2RlLT5pX21vZGUgJiBTX0lTVUlEKSA/IElDQlRBR19GTEFHX1NFVFVJRCA6IDApIHwKIAkJCSgoaW5vZGUtPmlfbW9kZSAmIFNfSVNHSUQpID8gSUNCVEFHX0ZMQUdfU0VUR0lEIDogMCkgfAogCQkJKChpbm9kZS0+aV9tb2RlICYgU19JU1ZUWCkgPyBJQ0JUQUdfRkxBR19TVElDS1kgOiAwKSB8CkBAIC0xNTM3LDI5ICsxNjUwLDI4IEBACiAJCQkJSUNCVEFHX0ZMQUdfU0VUR0lEIHwgSUNCVEFHX0ZMQUdfU1RJQ0tZKSk7CiAKIAlmZS0+aWNiVGFnLmZsYWdzID0gY3B1X3RvX2xlMTYoaWNiZmxhZ3MpOwotCWlmIChVREZfU0JfVURGUkVWKGlub2RlLT5pX3NiKSA+PSAweDAyMDApCisJaWYgKHNiaS0+c191ZGZyZXYgPj0gMHgwMjAwKQogCQlmZS0+ZGVzY1RhZy5kZXNjVmVyc2lvbiA9IGNwdV90b19sZTE2KDMpOwogCWVsc2UKIAkJZmUtPmRlc2NUYWcuZGVzY1ZlcnNpb24gPSBjcHVfdG9fbGUxNigyKTsKLQlmZS0+ZGVzY1RhZy50YWdTZXJpYWxOdW0gPSBjcHVfdG9fbGUxNihVREZfU0JfU0VSSUFMTlVNKGlub2RlLT5pX3NiKSk7Ci0JZmUtPmRlc2NUYWcudGFnTG9jYXRpb24gPSBjcHVfdG9fbGUzMihVREZfSV9MT0NBVElPTihpbm9kZSkubG9naWNhbEJsb2NrTnVtKTsKLQljcmNsZW4gKz0gVURGX0lfTEVORUFUVFIoaW5vZGUpICsgVURGX0lfTEVOQUxMT0MoaW5vZGUpIC0gc2l6ZW9mKHRhZyk7CisJZmUtPmRlc2NUYWcudGFnU2VyaWFsTnVtID0gY3B1X3RvX2xlMTYoc2JpLT5zX3NlcmlhbF9udW1iZXIpOworCWZlLT5kZXNjVGFnLnRhZ0xvY2F0aW9uID0gY3B1X3RvX2xlMzIoCisJCQkJCWlpbmZvLT5pX2xvY2F0aW9uLmxvZ2ljYWxCbG9ja051bSk7CisJY3JjbGVuICs9IGlpbmZvLT5pX2xlbkVBdHRyICsgaWluZm8tPmlfbGVuQWxsb2MgLQorCQkJCQkJCQlzaXplb2YodGFnKTsKIAlmZS0+ZGVzY1RhZy5kZXNjQ1JDTGVuZ3RoID0gY3B1X3RvX2xlMTYoY3JjbGVuKTsKLQlmZS0+ZGVzY1RhZy5kZXNjQ1JDID0gY3B1X3RvX2xlMTYodWRmX2NyYygoY2hhciAqKWZlICsgc2l6ZW9mKHRhZyksIGNyY2xlbiwgMCkpOwotCi0JZmUtPmRlc2NUYWcudGFnQ2hlY2tzdW0gPSAwOwotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCWlmIChpICE9IDQpCi0JCQlmZS0+ZGVzY1RhZy50YWdDaGVja3N1bSArPSAoKHVpbnQ4X3QgKikmKGZlLT5kZXNjVGFnKSlbaV07Ci0JfQorCWZlLT5kZXNjVGFnLmRlc2NDUkMgPSBjcHVfdG9fbGUxNih1ZGZfY3JjKChjaGFyICopZmUgKyBzaXplb2YodGFnKSwKKwkJCQkJCSAgY3JjbGVuLCAwKSk7CisJZmUtPmRlc2NUYWcudGFnQ2hlY2tzdW0gPSB1ZGZfdGFnX2NoZWNrc3VtKCZmZS0+ZGVzY1RhZyk7CiAKIAkvKiB3cml0ZSB0aGUgZGF0YSBibG9ja3MgKi8KIAltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CiAJaWYgKGRvX3N5bmMpIHsKIAkJc3luY19kaXJ0eV9idWZmZXIoYmgpOwogCQlpZiAoYnVmZmVyX3JlcShiaCkgJiYgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKLQkJCXByaW50aygiSU8gZXJyb3Igc3luY2luZyB1ZGYgaW5vZGUgWyVzOiUwOGx4XVxuIiwKLQkJCSAgICAgICBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIklPIGVycm9yIHN5bmNpbmcgdWRmIGlub2RlICIKKwkJCQkiWyVzOiUwOGx4XVxuIiwgaW5vZGUtPmlfc2ItPnNfaWQsCisJCQkJaW5vZGUtPmlfaW5vKTsKIAkJCWVyciA9IC1FSU87CiAJCX0KIAl9CkBAIC0xNTc3LDcgKzE2ODksNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWlmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSB7Ci0JCW1lbWNweSgmVURGX0lfTE9DQVRJT04oaW5vZGUpLCAmaW5vLCBzaXplb2Yoa2VybmVsX2xiX2FkZHIpKTsKKwkJbWVtY3B5KCZVREZfSShpbm9kZSktPmlfbG9jYXRpb24sICZpbm8sIHNpemVvZihrZXJuZWxfbGJfYWRkcikpOwogCQlfX3VkZl9yZWFkX2lub2RlKGlub2RlKTsKIAkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CiAJfQpAQCAtMTU4NSw3ICsxNjk3LDggQEAKIAlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSkKIAkJZ290byBvdXRfaXB1dDsKIAotCWlmIChpbm8ubG9naWNhbEJsb2NrTnVtID49IFVERl9TQl9QQVJUTEVOKHNiLCBpbm8ucGFydGl0aW9uUmVmZXJlbmNlTnVtKSkgeworCWlmIChpbm8ubG9naWNhbEJsb2NrTnVtID49IFVERl9TQihzYiktPgorCQkJc19wYXJ0bWFwc1tpbm8ucGFydGl0aW9uUmVmZXJlbmNlTnVtXS5zX3BhcnRpdGlvbl9sZW4pIHsKIAkJdWRmX2RlYnVnKCJibG9jaz0lZCwgcGFydGl0aW9uPSVkIG91dCBvZiByYW5nZVxuIiwKIAkJCSAgaW5vLmxvZ2ljYWxCbG9ja051bSwgaW5vLnBhcnRpdGlvblJlZmVyZW5jZU51bSk7CiAJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKQEAgLTE1OTksNyArMTcxMiw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLWludDhfdCB1ZGZfYWRkX2FleHQoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBleHRlbnRfcG9zaXRpb24gKiBlcG9zLAoraW50OF90IHVkZl9hZGRfYWV4dChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0ZW50X3Bvc2l0aW9uICplcG9zLAogCQkgICAga2VybmVsX2xiX2FkZHIgZWxvYywgdWludDMyX3QgZWxlbiwgaW50IGluYykKIHsKIAlpbnQgYWRzaXplOwpAQCAtMTYwOCwxNSArMTcyMSwxOCBAQAogCXN0cnVjdCBhbGxvY0V4dERlc2MgKmFlZDsKIAlpbnQ4X3QgZXR5cGU7CiAJdWludDhfdCAqcHRyOworCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqaWluZm8gPSBVREZfSShpbm9kZSk7CiAKIAlpZiAoIWVwb3MtPmJoKQotCQlwdHIgPSBVREZfSV9EQVRBKGlub2RlKSArIGVwb3MtPm9mZnNldCAtIHVkZl9maWxlX2VudHJ5X2FsbG9jX29mZnNldChpbm9kZSkgKyBVREZfSV9MRU5FQVRUUihpbm9kZSk7CisJCXB0ciA9IGlpbmZvLT5pX2V4dC5pX2RhdGEgKyBlcG9zLT5vZmZzZXQgLQorCQkJdWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKSArCisJCQlpaW5mby0+aV9sZW5FQXR0cjsKIAllbHNlCiAJCXB0ciA9IGVwb3MtPmJoLT5iX2RhdGEgKyBlcG9zLT5vZmZzZXQ7CiAKLQlpZiAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9PSBJQ0JUQUdfRkxBR19BRF9TSE9SVCkKKwlpZiAoaWluZm8tPmlfYWxsb2NfdHlwZSA9PSBJQ0JUQUdfRkxBR19BRF9TSE9SVCkKIAkJYWRzaXplID0gc2l6ZW9mKHNob3J0X2FkKTsKLQllbHNlIGlmIChVREZfSV9BTExPQ1RZUEUoaW5vZGUpID09IElDQlRBR19GTEFHX0FEX0xPTkcpCisJZWxzZSBpZiAoaWluZm8tPmlfYWxsb2NfdHlwZSA9PSBJQ0JUQUdfRkxBR19BRF9MT05HKQogCQlhZHNpemUgPSBzaXplb2YobG9uZ19hZCk7CiAJZWxzZQogCQlyZXR1cm4gLTE7CkBAIC0xNjI3LDE1ICsxNzQzLDE2IEBACiAJCWludCBlcnIsIGxvZmZzZXQ7CiAJCWtlcm5lbF9sYl9hZGRyIG9ibG9jID0gZXBvcy0+YmxvY2s7CiAKLQkJaWYgKCEoZXBvcy0+YmxvY2subG9naWNhbEJsb2NrTnVtID0gdWRmX25ld19ibG9jayhpbm9kZS0+aV9zYiwgTlVMTCwKLQkJCQkJCQkJICBvYmxvYy5wYXJ0aXRpb25SZWZlcmVuY2VOdW0sCi0JCQkJCQkJCSAgb2Jsb2MubG9naWNhbEJsb2NrTnVtLCAmZXJyKSkpIHsKKwkJZXBvcy0+YmxvY2subG9naWNhbEJsb2NrTnVtID0gdWRmX25ld19ibG9jayhpbm9kZS0+aV9zYiwgTlVMTCwKKwkJCQkJCW9ibG9jLnBhcnRpdGlvblJlZmVyZW5jZU51bSwKKwkJCQkJCW9ibG9jLmxvZ2ljYWxCbG9ja051bSwgJmVycik7CisJCWlmICghZXBvcy0+YmxvY2subG9naWNhbEJsb2NrTnVtKQogCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmICghKG5iaCA9IHVkZl90Z2V0YmxrKGlub2RlLT5pX3NiLCB1ZGZfZ2V0X2xiX3BibG9jayhpbm9kZS0+aV9zYiwKLQkJCQkJCQkJICAgICAgIGVwb3MtPmJsb2NrLCAwKSkpKSB7CisJCW5iaCA9IHVkZl90Z2V0YmxrKGlub2RlLT5pX3NiLCB1ZGZfZ2V0X2xiX3BibG9jayhpbm9kZS0+aV9zYiwKKwkJCQkJCQkJIGVwb3MtPmJsb2NrLAorCQkJCQkJCQkgMCkpOworCQlpZiAoIW5iaCkKIAkJCXJldHVybiAtMTsKLQkJfQogCQlsb2NrX2J1ZmZlcihuYmgpOwogCQltZW1zZXQobmJoLT5iX2RhdGEsIDB4MDAsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CiAJCXNldF9idWZmZXJfdXB0b2RhdGUobmJoKTsKQEAgLTE2NDQsNyArMTc2MSw4IEBACiAKIAkJYWVkID0gKHN0cnVjdCBhbGxvY0V4dERlc2MgKikobmJoLT5iX2RhdGEpOwogCQlpZiAoIVVERl9RVUVSWV9GTEFHKGlub2RlLT5pX3NiLCBVREZfRkxBR19TVFJJQ1QpKQotCQkJYWVkLT5wcmV2aW91c0FsbG9jRXh0TG9jYXRpb24gPSBjcHVfdG9fbGUzMihvYmxvYy5sb2dpY2FsQmxvY2tOdW0pOworCQkJYWVkLT5wcmV2aW91c0FsbG9jRXh0TG9jYXRpb24gPQorCQkJCQljcHVfdG9fbGUzMihvYmxvYy5sb2dpY2FsQmxvY2tOdW0pOwogCQlpZiAoZXBvcy0+b2Zmc2V0ICsgYWRzaXplID4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKSB7CiAJCQlsb2Zmc2V0ID0gZXBvcy0+b2Zmc2V0OwogCQkJYWVkLT5sZW5ndGhBbGxvY0Rlc2NzID0gY3B1X3RvX2xlMzIoYWRzaXplKTsKQEAgLTE2NjEsMjQgKzE3NzksMjYgQEAKIAkJCWlmIChlcG9zLT5iaCkgewogCQkJCWFlZCA9IChzdHJ1Y3QgYWxsb2NFeHREZXNjICopZXBvcy0+YmgtPmJfZGF0YTsKIAkJCQlhZWQtPmxlbmd0aEFsbG9jRGVzY3MgPQotCQkJCQljcHVfdG9fbGUzMihsZTMyX3RvX2NwdShhZWQtPmxlbmd0aEFsbG9jRGVzY3MpICsgYWRzaXplKTsKKwkJCQkJY3B1X3RvX2xlMzIobGUzMl90b19jcHUoCisJCQkJCWFlZC0+bGVuZ3RoQWxsb2NEZXNjcykgKyBhZHNpemUpOwogCQkJfSBlbHNlIHsKLQkJCQlVREZfSV9MRU5BTExPQyhpbm9kZSkgKz0gYWRzaXplOworCQkJCWlpbmZvLT5pX2xlbkFsbG9jICs9IGFkc2l6ZTsKIAkJCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAkJCX0KIAkJfQotCQlpZiAoVURGX1NCX1VERlJFVihpbm9kZS0+aV9zYikgPj0gMHgwMjAwKQorCQlpZiAoVURGX1NCKGlub2RlLT5pX3NiKS0+c191ZGZyZXYgPj0gMHgwMjAwKQogCQkJdWRmX25ld190YWcobmJoLT5iX2RhdGEsIFRBR19JREVOVF9BRUQsIDMsIDEsCiAJCQkJICAgIGVwb3MtPmJsb2NrLmxvZ2ljYWxCbG9ja051bSwgc2l6ZW9mKHRhZykpOwogCQllbHNlCiAJCQl1ZGZfbmV3X3RhZyhuYmgtPmJfZGF0YSwgVEFHX0lERU5UX0FFRCwgMiwgMSwKIAkJCQkgICAgZXBvcy0+YmxvY2subG9naWNhbEJsb2NrTnVtLCBzaXplb2YodGFnKSk7Ci0JCXN3aXRjaCAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSkgeworCQlzd2l0Y2ggKGlpbmZvLT5pX2FsbG9jX3R5cGUpIHsKIAkJY2FzZSBJQ0JUQUdfRkxBR19BRF9TSE9SVDoKIAkJCXNhZCA9IChzaG9ydF9hZCAqKXNwdHI7CiAJCQlzYWQtPmV4dExlbmd0aCA9IGNwdV90b19sZTMyKEVYVF9ORVhUX0VYVEVOVF9BTExPQ0RFQ1MgfAogCQkJCQkJICAgICBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOwotCQkJc2FkLT5leHRQb3NpdGlvbiA9IGNwdV90b19sZTMyKGVwb3MtPmJsb2NrLmxvZ2ljYWxCbG9ja051bSk7CisJCQlzYWQtPmV4dFBvc2l0aW9uID0KKwkJCQljcHVfdG9fbGUzMihlcG9zLT5ibG9jay5sb2dpY2FsQmxvY2tOdW0pOwogCQkJYnJlYWs7CiAJCWNhc2UgSUNCVEFHX0ZMQUdfQURfTE9ORzoKIAkJCWxhZCA9IChsb25nX2FkICopc3B0cjsKQEAgLTE2OTAsMTAgKzE4MTAsMTEgQEAKIAkJfQogCQlpZiAoZXBvcy0+YmgpIHsKIAkJCWlmICghVURGX1FVRVJZX0ZMQUcoaW5vZGUtPmlfc2IsIFVERl9GTEFHX1NUUklDVCkgfHwKLQkJCSAgICBVREZfU0JfVURGUkVWKGlub2RlLT5pX3NiKSA+PSAweDAyMDEpCisJCQkgICAgVURGX1NCKGlub2RlLT5pX3NiKS0+c191ZGZyZXYgPj0gMHgwMjAxKQogCQkJCXVkZl91cGRhdGVfdGFnKGVwb3MtPmJoLT5iX2RhdGEsIGxvZmZzZXQpOwogCQkJZWxzZQotCQkJCXVkZl91cGRhdGVfdGFnKGVwb3MtPmJoLT5iX2RhdGEsIHNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKSk7CisJCQkJdWRmX3VwZGF0ZV90YWcoZXBvcy0+YmgtPmJfZGF0YSwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKSk7CiAJCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShlcG9zLT5iaCwgaW5vZGUpOwogCQkJYnJlbHNlKGVwb3MtPmJoKTsKIAkJfSBlbHNlIHsKQEAgLTE3MDUsMzYgKzE4MjYsNDMgQEAKIAlldHlwZSA9IHVkZl93cml0ZV9hZXh0KGlub2RlLCBlcG9zLCBlbG9jLCBlbGVuLCBpbmMpOwogCiAJaWYgKCFlcG9zLT5iaCkgewotCQlVREZfSV9MRU5BTExPQyhpbm9kZSkgKz0gYWRzaXplOworCQlpaW5mby0+aV9sZW5BbGxvYyArPSBhZHNpemU7CiAJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCX0gZWxzZSB7CiAJCWFlZCA9IChzdHJ1Y3QgYWxsb2NFeHREZXNjICopZXBvcy0+YmgtPmJfZGF0YTsKIAkJYWVkLT5sZW5ndGhBbGxvY0Rlc2NzID0KLQkJCWNwdV90b19sZTMyKGxlMzJfdG9fY3B1KGFlZC0+bGVuZ3RoQWxsb2NEZXNjcykgKyBhZHNpemUpOwotCQlpZiAoIVVERl9RVUVSWV9GTEFHKGlub2RlLT5pX3NiLCBVREZfRkxBR19TVFJJQ1QpIHx8IFVERl9TQl9VREZSRVYoaW5vZGUtPmlfc2IpID49IDB4MDIwMSkKLQkJCXVkZl91cGRhdGVfdGFnKGVwb3MtPmJoLT5iX2RhdGEsIGVwb3MtPm9mZnNldCArIChpbmMgPyAwIDogYWRzaXplKSk7CisJCQljcHVfdG9fbGUzMihsZTMyX3RvX2NwdShhZWQtPmxlbmd0aEFsbG9jRGVzY3MpICsKKwkJCQkgICAgYWRzaXplKTsKKwkJaWYgKCFVREZfUVVFUllfRkxBRyhpbm9kZS0+aV9zYiwgVURGX0ZMQUdfU1RSSUNUKSB8fAorCQkJCVVERl9TQihpbm9kZS0+aV9zYiktPnNfdWRmcmV2ID49IDB4MDIwMSkKKwkJCXVkZl91cGRhdGVfdGFnKGVwb3MtPmJoLT5iX2RhdGEsCisJCQkJCWVwb3MtPm9mZnNldCArIChpbmMgPyAwIDogYWRzaXplKSk7CiAJCWVsc2UKLQkJCXVkZl91cGRhdGVfdGFnKGVwb3MtPmJoLT5iX2RhdGEsIHNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKSk7CisJCQl1ZGZfdXBkYXRlX3RhZyhlcG9zLT5iaC0+Yl9kYXRhLAorCQkJCQlzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYykpOwogCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShlcG9zLT5iaCwgaW5vZGUpOwogCX0KIAogCXJldHVybiBldHlwZTsKIH0KIAotaW50OF90IHVkZl93cml0ZV9hZXh0KHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZXh0ZW50X3Bvc2l0aW9uICogZXBvcywKK2ludDhfdCB1ZGZfd3JpdGVfYWV4dChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0ZW50X3Bvc2l0aW9uICplcG9zLAogCQkgICAgICBrZXJuZWxfbGJfYWRkciBlbG9jLCB1aW50MzJfdCBlbGVuLCBpbnQgaW5jKQogewogCWludCBhZHNpemU7CiAJdWludDhfdCAqcHRyOwogCXNob3J0X2FkICpzYWQ7CiAJbG9uZ19hZCAqbGFkOworCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqaWluZm8gPSBVREZfSShpbm9kZSk7CiAKIAlpZiAoIWVwb3MtPmJoKQotCQlwdHIgPSBVREZfSV9EQVRBKGlub2RlKSArIGVwb3MtPm9mZnNldCAtIHVkZl9maWxlX2VudHJ5X2FsbG9jX29mZnNldChpbm9kZSkgKyBVREZfSV9MRU5FQVRUUihpbm9kZSk7CisJCXB0ciA9IGlpbmZvLT5pX2V4dC5pX2RhdGEgKyBlcG9zLT5vZmZzZXQgLQorCQkJdWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKSArCisJCQlpaW5mby0+aV9sZW5FQXR0cjsKIAllbHNlCiAJCXB0ciA9IGVwb3MtPmJoLT5iX2RhdGEgKyBlcG9zLT5vZmZzZXQ7CiAKLQlzd2l0Y2ggKFVERl9JX0FMTE9DVFlQRShpbm9kZSkpIHsKKwlzd2l0Y2ggKGlpbmZvLT5pX2FsbG9jX3R5cGUpIHsKIAljYXNlIElDQlRBR19GTEFHX0FEX1NIT1JUOgogCQlzYWQgPSAoc2hvcnRfYWQgKilwdHI7CiAJCXNhZC0+ZXh0TGVuZ3RoID0gY3B1X3RvX2xlMzIoZWxlbik7CkBAIC0xNzU0LDEwICsxODgyLDEyIEBACiAKIAlpZiAoZXBvcy0+YmgpIHsKIAkJaWYgKCFVREZfUVVFUllfRkxBRyhpbm9kZS0+aV9zYiwgVURGX0ZMQUdfU1RSSUNUKSB8fAotCQkgICAgVURGX1NCX1VERlJFVihpbm9kZS0+aV9zYikgPj0gMHgwMjAxKSB7Ci0JCQlzdHJ1Y3QgYWxsb2NFeHREZXNjICphZWQgPSAoc3RydWN0IGFsbG9jRXh0RGVzYyAqKWVwb3MtPmJoLT5iX2RhdGE7CisJCSAgICBVREZfU0IoaW5vZGUtPmlfc2IpLT5zX3VkZnJldiA+PSAweDAyMDEpIHsKKwkJCXN0cnVjdCBhbGxvY0V4dERlc2MgKmFlZCA9CisJCQkJKHN0cnVjdCBhbGxvY0V4dERlc2MgKillcG9zLT5iaC0+Yl9kYXRhOwogCQkJdWRmX3VwZGF0ZV90YWcoZXBvcy0+YmgtPmJfZGF0YSwKLQkJCQkgICAgICAgbGUzMl90b19jcHUoYWVkLT5sZW5ndGhBbGxvY0Rlc2NzKSArIHNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKSk7CisJCQkJICAgICAgIGxlMzJfdG9fY3B1KGFlZC0+bGVuZ3RoQWxsb2NEZXNjcykgKworCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYykpOwogCQl9CiAJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKGVwb3MtPmJoLCBpbm9kZSk7CiAJfSBlbHNlIHsKQEAgLTE3NzAsMTkgKzE5MDAsMjEgQEAKIAlyZXR1cm4gKGVsZW4gPj4gMzApOwogfQogCi1pbnQ4X3QgdWRmX25leHRfYWV4dChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGV4dGVudF9wb3NpdGlvbiAqIGVwb3MsCi0JCSAgICAga2VybmVsX2xiX2FkZHIgKiBlbG9jLCB1aW50MzJfdCAqIGVsZW4sIGludCBpbmMpCitpbnQ4X3QgdWRmX25leHRfYWV4dChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0ZW50X3Bvc2l0aW9uICplcG9zLAorCQkgICAgIGtlcm5lbF9sYl9hZGRyICplbG9jLCB1aW50MzJfdCAqZWxlbiwgaW50IGluYykKIHsKIAlpbnQ4X3QgZXR5cGU7CiAKIAl3aGlsZSAoKGV0eXBlID0gdWRmX2N1cnJlbnRfYWV4dChpbm9kZSwgZXBvcywgZWxvYywgZWxlbiwgaW5jKSkgPT0KIAkgICAgICAgKEVYVF9ORVhUX0VYVEVOVF9BTExPQ0RFQ1MgPj4gMzApKSB7CisJCWludCBibG9jazsKIAkJZXBvcy0+YmxvY2sgPSAqZWxvYzsKIAkJZXBvcy0+b2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpOwogCQlicmVsc2UoZXBvcy0+YmgpOwotCQlpZiAoIShlcG9zLT5iaCA9IHVkZl90cmVhZChpbm9kZS0+aV9zYiwgdWRmX2dldF9sYl9wYmxvY2soaW5vZGUtPmlfc2IsIGVwb3MtPmJsb2NrLCAwKSkpKSB7Ci0JCQl1ZGZfZGVidWcoInJlYWRpbmcgYmxvY2sgJWQgZmFpbGVkIVxuIiwKLQkJCQkgIHVkZl9nZXRfbGJfcGJsb2NrKGlub2RlLT5pX3NiLCBlcG9zLT5ibG9jaywgMCkpOworCQlibG9jayA9IHVkZl9nZXRfbGJfcGJsb2NrKGlub2RlLT5pX3NiLCBlcG9zLT5ibG9jaywgMCk7CisJCWVwb3MtPmJoID0gdWRmX3RyZWFkKGlub2RlLT5pX3NiLCBibG9jayk7CisJCWlmICghZXBvcy0+YmgpIHsKKwkJCXVkZl9kZWJ1ZygicmVhZGluZyBibG9jayAlZCBmYWlsZWQhXG4iLCBibG9jayk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAl9CkBAIC0xNzkwLDQ3ICsxOTIyLDU1IEBACiAJcmV0dXJuIGV0eXBlOwogfQogCi1pbnQ4X3QgdWRmX2N1cnJlbnRfYWV4dChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGV4dGVudF9wb3NpdGlvbiAqIGVwb3MsCi0JCQlrZXJuZWxfbGJfYWRkciAqIGVsb2MsIHVpbnQzMl90ICogZWxlbiwgaW50IGluYykKK2ludDhfdCB1ZGZfY3VycmVudF9hZXh0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHRlbnRfcG9zaXRpb24gKmVwb3MsCisJCQlrZXJuZWxfbGJfYWRkciAqZWxvYywgdWludDMyX3QgKmVsZW4sIGludCBpbmMpCiB7CiAJaW50IGFsZW47CiAJaW50OF90IGV0eXBlOwogCXVpbnQ4X3QgKnB0cjsKIAlzaG9ydF9hZCAqc2FkOwogCWxvbmdfYWQgKmxhZDsKLQorCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqaWluZm8gPSBVREZfSShpbm9kZSk7CiAKIAlpZiAoIWVwb3MtPmJoKSB7CiAJCWlmICghZXBvcy0+b2Zmc2V0KQogCQkJZXBvcy0+b2Zmc2V0ID0gdWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKTsKLQkJcHRyID0gVURGX0lfREFUQShpbm9kZSkgKyBlcG9zLT5vZmZzZXQgLSB1ZGZfZmlsZV9lbnRyeV9hbGxvY19vZmZzZXQoaW5vZGUpICsgVURGX0lfTEVORUFUVFIoaW5vZGUpOwotCQlhbGVuID0gdWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKSArIFVERl9JX0xFTkFMTE9DKGlub2RlKTsKKwkJcHRyID0gaWluZm8tPmlfZXh0LmlfZGF0YSArIGVwb3MtPm9mZnNldCAtCisJCQl1ZGZfZmlsZV9lbnRyeV9hbGxvY19vZmZzZXQoaW5vZGUpICsKKwkJCWlpbmZvLT5pX2xlbkVBdHRyOworCQlhbGVuID0gdWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKSArCisJCQkJCQkJaWluZm8tPmlfbGVuQWxsb2M7CiAJfSBlbHNlIHsKIAkJaWYgKCFlcG9zLT5vZmZzZXQpCiAJCQllcG9zLT5vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYyk7CiAJCXB0ciA9IGVwb3MtPmJoLT5iX2RhdGEgKyBlcG9zLT5vZmZzZXQ7CiAJCWFsZW4gPSBzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYykgKwotCQkJbGUzMl90b19jcHUoKChzdHJ1Y3QgYWxsb2NFeHREZXNjICopZXBvcy0+YmgtPmJfZGF0YSktPmxlbmd0aEFsbG9jRGVzY3MpOworCQkJbGUzMl90b19jcHUoKChzdHJ1Y3QgYWxsb2NFeHREZXNjICopZXBvcy0+YmgtPmJfZGF0YSktPgorCQkJCQkJCWxlbmd0aEFsbG9jRGVzY3MpOwogCX0KIAotCXN3aXRjaCAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSkgeworCXN3aXRjaCAoaWluZm8tPmlfYWxsb2NfdHlwZSkgewogCWNhc2UgSUNCVEFHX0ZMQUdfQURfU0hPUlQ6Ci0JCWlmICghKHNhZCA9IHVkZl9nZXRfZmlsZXNob3J0YWQocHRyLCBhbGVuLCAmZXBvcy0+b2Zmc2V0LCBpbmMpKSkKKwkJc2FkID0gdWRmX2dldF9maWxlc2hvcnRhZChwdHIsIGFsZW4sICZlcG9zLT5vZmZzZXQsIGluYyk7CisJCWlmICghc2FkKQogCQkJcmV0dXJuIC0xOwogCQlldHlwZSA9IGxlMzJfdG9fY3B1KHNhZC0+ZXh0TGVuZ3RoKSA+PiAzMDsKIAkJZWxvYy0+bG9naWNhbEJsb2NrTnVtID0gbGUzMl90b19jcHUoc2FkLT5leHRQb3NpdGlvbik7Ci0JCWVsb2MtPnBhcnRpdGlvblJlZmVyZW5jZU51bSA9IFVERl9JX0xPQ0FUSU9OKGlub2RlKS5wYXJ0aXRpb25SZWZlcmVuY2VOdW07CisJCWVsb2MtPnBhcnRpdGlvblJlZmVyZW5jZU51bSA9CisJCQkJaWluZm8tPmlfbG9jYXRpb24ucGFydGl0aW9uUmVmZXJlbmNlTnVtOwogCQkqZWxlbiA9IGxlMzJfdG9fY3B1KHNhZC0+ZXh0TGVuZ3RoKSAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0s7CiAJCWJyZWFrOwogCWNhc2UgSUNCVEFHX0ZMQUdfQURfTE9ORzoKLQkJaWYgKCEobGFkID0gdWRmX2dldF9maWxlbG9uZ2FkKHB0ciwgYWxlbiwgJmVwb3MtPm9mZnNldCwgaW5jKSkpCisJCWxhZCA9IHVkZl9nZXRfZmlsZWxvbmdhZChwdHIsIGFsZW4sICZlcG9zLT5vZmZzZXQsIGluYyk7CisJCWlmICghbGFkKQogCQkJcmV0dXJuIC0xOwogCQlldHlwZSA9IGxlMzJfdG9fY3B1KGxhZC0+ZXh0TGVuZ3RoKSA+PiAzMDsKIAkJKmVsb2MgPSBsZWxiX3RvX2NwdShsYWQtPmV4dExvY2F0aW9uKTsKIAkJKmVsZW4gPSBsZTMyX3RvX2NwdShsYWQtPmV4dExlbmd0aCkgJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQl1ZGZfZGVidWcoImFsbG9jX3R5cGUgPSAlZCB1bnN1cHBvcnRlZFxuIiwgVURGX0lfQUxMT0NUWVBFKGlub2RlKSk7CisJCXVkZl9kZWJ1ZygiYWxsb2NfdHlwZSA9ICVkIHVuc3VwcG9ydGVkXG4iLAorCQkJCWlpbmZvLT5pX2FsbG9jX3R5cGUpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0xODU4LDIyICsxOTk4LDI0IEBACiAJcmV0dXJuIChuZWxlbiA+PiAzMCk7CiB9CiAKLWludDhfdCB1ZGZfZGVsZXRlX2FleHQoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBleHRlbnRfcG9zaXRpb24gZXBvcywKK2ludDhfdCB1ZGZfZGVsZXRlX2FleHQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dGVudF9wb3NpdGlvbiBlcG9zLAogCQkgICAgICAga2VybmVsX2xiX2FkZHIgZWxvYywgdWludDMyX3QgZWxlbikKIHsKIAlzdHJ1Y3QgZXh0ZW50X3Bvc2l0aW9uIG9lcG9zOwogCWludCBhZHNpemU7CiAJaW50OF90IGV0eXBlOwogCXN0cnVjdCBhbGxvY0V4dERlc2MgKmFlZDsKKwlzdHJ1Y3QgdWRmX2lub2RlX2luZm8gKmlpbmZvOwogCiAJaWYgKGVwb3MuYmgpIHsKIAkJZ2V0X2JoKGVwb3MuYmgpOwogCQlnZXRfYmgoZXBvcy5iaCk7CiAJfQogCi0JaWYgKFVERl9JX0FMTE9DVFlQRShpbm9kZSkgPT0gSUNCVEFHX0ZMQUdfQURfU0hPUlQpCisJaWluZm8gPSBVREZfSShpbm9kZSk7CisJaWYgKGlpbmZvLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfU0hPUlQpCiAJCWFkc2l6ZSA9IHNpemVvZihzaG9ydF9hZCk7Ci0JZWxzZSBpZiAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9PSBJQ0JUQUdfRkxBR19BRF9MT05HKQorCWVsc2UgaWYgKGlpbmZvLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfTE9ORykKIAkJYWRzaXplID0gc2l6ZW9mKGxvbmdfYWQpOwogCWVsc2UKIAkJYWRzaXplID0gMDsKQEAgLTE5MDAsMzMgKzIwNDIsMzkgQEAKIAkJdWRmX3dyaXRlX2FleHQoaW5vZGUsICZvZXBvcywgZWxvYywgZWxlbiwgMSk7CiAJCXVkZl93cml0ZV9hZXh0KGlub2RlLCAmb2Vwb3MsIGVsb2MsIGVsZW4sIDEpOwogCQlpZiAoIW9lcG9zLmJoKSB7Ci0JCQlVREZfSV9MRU5BTExPQyhpbm9kZSkgLT0gKGFkc2l6ZSAqIDIpOworCQkJaWluZm8tPmlfbGVuQWxsb2MgLT0gKGFkc2l6ZSAqIDIpOwogCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJCX0gZWxzZSB7CiAJCQlhZWQgPSAoc3RydWN0IGFsbG9jRXh0RGVzYyAqKW9lcG9zLmJoLT5iX2RhdGE7CiAJCQlhZWQtPmxlbmd0aEFsbG9jRGVzY3MgPQotCQkJCWNwdV90b19sZTMyKGxlMzJfdG9fY3B1KGFlZC0+bGVuZ3RoQWxsb2NEZXNjcykgLSAoMiAqIGFkc2l6ZSkpOworCQkJCWNwdV90b19sZTMyKGxlMzJfdG9fY3B1KGFlZC0+bGVuZ3RoQWxsb2NEZXNjcykgLQorCQkJCQkgICAgKDIgKiBhZHNpemUpKTsKIAkJCWlmICghVURGX1FVRVJZX0ZMQUcoaW5vZGUtPmlfc2IsIFVERl9GTEFHX1NUUklDVCkgfHwKLQkJCSAgICBVREZfU0JfVURGUkVWKGlub2RlLT5pX3NiKSA+PSAweDAyMDEpCi0JCQkJdWRmX3VwZGF0ZV90YWcob2Vwb3MuYmgtPmJfZGF0YSwgb2Vwb3Mub2Zmc2V0IC0gKDIgKiBhZHNpemUpKTsKKwkJCSAgICBVREZfU0IoaW5vZGUtPmlfc2IpLT5zX3VkZnJldiA+PSAweDAyMDEpCisJCQkJdWRmX3VwZGF0ZV90YWcob2Vwb3MuYmgtPmJfZGF0YSwKKwkJCQkJCW9lcG9zLm9mZnNldCAtICgyICogYWRzaXplKSk7CiAJCQllbHNlCi0JCQkJdWRmX3VwZGF0ZV90YWcob2Vwb3MuYmgtPmJfZGF0YSwgc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpKTsKKwkJCQl1ZGZfdXBkYXRlX3RhZyhvZXBvcy5iaC0+Yl9kYXRhLAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpKTsKIAkJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKG9lcG9zLmJoLCBpbm9kZSk7CiAJCX0KIAl9IGVsc2UgewogCQl1ZGZfd3JpdGVfYWV4dChpbm9kZSwgJm9lcG9zLCBlbG9jLCBlbGVuLCAxKTsKIAkJaWYgKCFvZXBvcy5iaCkgewotCQkJVURGX0lfTEVOQUxMT0MoaW5vZGUpIC09IGFkc2l6ZTsKKwkJCWlpbmZvLT5pX2xlbkFsbG9jIC09IGFkc2l6ZTsKIAkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCQl9IGVsc2UgewogCQkJYWVkID0gKHN0cnVjdCBhbGxvY0V4dERlc2MgKilvZXBvcy5iaC0+Yl9kYXRhOwogCQkJYWVkLT5sZW5ndGhBbGxvY0Rlc2NzID0KLQkJCQljcHVfdG9fbGUzMihsZTMyX3RvX2NwdShhZWQtPmxlbmd0aEFsbG9jRGVzY3MpIC0gYWRzaXplKTsKKwkJCQljcHVfdG9fbGUzMihsZTMyX3RvX2NwdShhZWQtPmxlbmd0aEFsbG9jRGVzY3MpIC0KKwkJCQkJICAgIGFkc2l6ZSk7CiAJCQlpZiAoIVVERl9RVUVSWV9GTEFHKGlub2RlLT5pX3NiLCBVREZfRkxBR19TVFJJQ1QpIHx8Ci0JCQkgICAgVURGX1NCX1VERlJFVihpbm9kZS0+aV9zYikgPj0gMHgwMjAxKQotCQkJCXVkZl91cGRhdGVfdGFnKG9lcG9zLmJoLT5iX2RhdGEsIGVwb3Mub2Zmc2V0IC0gYWRzaXplKTsKKwkJCSAgICBVREZfU0IoaW5vZGUtPmlfc2IpLT5zX3VkZnJldiA+PSAweDAyMDEpCisJCQkJdWRmX3VwZGF0ZV90YWcob2Vwb3MuYmgtPmJfZGF0YSwKKwkJCQkJCWVwb3Mub2Zmc2V0IC0gYWRzaXplKTsKIAkJCWVsc2UKLQkJCQl1ZGZfdXBkYXRlX3RhZyhvZXBvcy5iaC0+Yl9kYXRhLCBzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYykpOworCQkJCXVkZl91cGRhdGVfdGFnKG9lcG9zLmJoLT5iX2RhdGEsCisJCQkJCQlzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYykpOwogCQkJbWFya19idWZmZXJfZGlydHlfaW5vZGUob2Vwb3MuYmgsIGlub2RlKTsKIAkJfQogCX0KQEAgLTE5MzcsMzQgKzIwODUsMzggQEAKIAlyZXR1cm4gKGVsZW4gPj4gMzApOwogfQogCi1pbnQ4X3QgaW5vZGVfYm1hcChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc2VjdG9yX3QgYmxvY2ssCi0JCSAgc3RydWN0IGV4dGVudF9wb3NpdGlvbiAqIHBvcywga2VybmVsX2xiX2FkZHIgKiBlbG9jLAotCQkgIHVpbnQzMl90ICogZWxlbiwgc2VjdG9yX3QgKiBvZmZzZXQpCitpbnQ4X3QgaW5vZGVfYm1hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBibG9jaywKKwkJICBzdHJ1Y3QgZXh0ZW50X3Bvc2l0aW9uICpwb3MsIGtlcm5lbF9sYl9hZGRyICplbG9jLAorCQkgIHVpbnQzMl90ICplbGVuLCBzZWN0b3JfdCAqb2Zmc2V0KQogeworCXVuc2lnbmVkIGNoYXIgYmxvY2tzaXplX2JpdHMgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKIAlsb2ZmX3QgbGJjb3VudCA9IDAsIGJjb3VudCA9Ci0JICAgIChsb2ZmX3QpIGJsb2NrIDw8IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCSAgICAobG9mZl90KSBibG9jayA8PCBibG9ja3NpemVfYml0czsKIAlpbnQ4X3QgZXR5cGU7CisJc3RydWN0IHVkZl9pbm9kZV9pbmZvICppaW5mbzsKIAogCWlmIChibG9jayA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IGlub2RlX2JtYXA6IGJsb2NrIDwgMFxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKKwlpaW5mbyA9IFVERl9JKGlub2RlKTsKIAlwb3MtPm9mZnNldCA9IDA7Ci0JcG9zLT5ibG9jayA9IFVERl9JX0xPQ0FUSU9OKGlub2RlKTsKKwlwb3MtPmJsb2NrID0gaWluZm8tPmlfbG9jYXRpb247CiAJcG9zLT5iaCA9IE5VTEw7CiAJKmVsZW4gPSAwOwogCiAJZG8gewotCQlpZiAoKGV0eXBlID0gdWRmX25leHRfYWV4dChpbm9kZSwgcG9zLCBlbG9jLCBlbGVuLCAxKSkgPT0gLTEpIHsKLQkJCSpvZmZzZXQgPSAoYmNvdW50IC0gbGJjb3VudCkgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7Ci0JCQlVREZfSV9MRU5FWFRFTlRTKGlub2RlKSA9IGxiY291bnQ7CisJCWV0eXBlID0gdWRmX25leHRfYWV4dChpbm9kZSwgcG9zLCBlbG9jLCBlbGVuLCAxKTsKKwkJaWYgKGV0eXBlID09IC0xKSB7CisJCQkqb2Zmc2V0ID0gKGJjb3VudCAtIGxiY291bnQpID4+IGJsb2Nrc2l6ZV9iaXRzOworCQkJaWluZm8tPmlfbGVuRXh0ZW50cyA9IGxiY291bnQ7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJbGJjb3VudCArPSAqZWxlbjsKIAl9IHdoaWxlIChsYmNvdW50IDw9IGJjb3VudCk7CiAKLQkqb2Zmc2V0ID0gKGJjb3VudCArICplbGVuIC0gbGJjb3VudCkgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJKm9mZnNldCA9IChiY291bnQgKyAqZWxlbiAtIGxiY291bnQpID4+IGJsb2Nrc2l6ZV9iaXRzOwogCiAJcmV0dXJuIGV0eXBlOwogfQpAQCAtMTk3OSw3ICsyMTMxLDggQEAKIAogCWxvY2tfa2VybmVsKCk7CiAKLQlpZiAoaW5vZGVfYm1hcChpbm9kZSwgYmxvY2ssICZlcG9zLCAmZWxvYywgJmVsZW4sICZvZmZzZXQpID09IChFWFRfUkVDT1JERURfQUxMT0NBVEVEID4+IDMwKSkKKwlpZiAoaW5vZGVfYm1hcChpbm9kZSwgYmxvY2ssICZlcG9zLCAmZWxvYywgJmVsZW4sICZvZmZzZXQpID09CisJCQkJCQkoRVhUX1JFQ09SREVEX0FMTE9DQVRFRCA+PiAzMCkpCiAJCXJldCA9IHVkZl9nZXRfbGJfcGJsb2NrKGlub2RlLT5pX3NiLCBlbG9jLCBvZmZzZXQpOwogCWVsc2UKIAkJcmV0ID0gMDsKZGlmZiAtLWdpdCBhL2ZzL3VkZi9taXNjLmMgYi9mcy91ZGYvbWlzYy5jCmluZGV4IDE1Mjk3ZGUuLmExZDZkYTAgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9taXNjLmMKKysrIGIvZnMvdWRmL21pc2MuYwpAQCAtNTEsMTggKzUxLDE4IEBACiAJdWludDhfdCAqZWEgPSBOVUxMLCAqYWQgPSBOVUxMOwogCWludCBvZmZzZXQ7CiAJdWludDE2X3QgY3JjbGVuOwotCWludCBpOworCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqaWluZm8gPSBVREZfSShpbm9kZSk7CiAKLQllYSA9IFVERl9JX0RBVEEoaW5vZGUpOwotCWlmIChVREZfSV9MRU5FQVRUUihpbm9kZSkpIHsKLQkJYWQgPSBVREZfSV9EQVRBKGlub2RlKSArIFVERl9JX0xFTkVBVFRSKGlub2RlKTsKKwllYSA9IGlpbmZvLT5pX2V4dC5pX2RhdGE7CisJaWYgKGlpbmZvLT5pX2xlbkVBdHRyKSB7CisJCWFkID0gaWluZm8tPmlfZXh0LmlfZGF0YSArIGlpbmZvLT5pX2xlbkVBdHRyOwogCX0gZWxzZSB7CiAJCWFkID0gZWE7CiAJCXNpemUgKz0gc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEF0dHJIZWFkZXJEZXNjKTsKIAl9CiAKIAlvZmZzZXQgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSB1ZGZfZmlsZV9lbnRyeV9hbGxvY19vZmZzZXQoaW5vZGUpIC0KLQkJVURGX0lfTEVOQUxMT0MoaW5vZGUpOworCQlpaW5mby0+aV9sZW5BbGxvYzsKIAogCS8qIFRPRE8gLSBDaGVjayBmb3IgRnJlZUVBU3BhY2UgKi8KIApAQCAtNzAsNjkgKzcwLDgwIEBACiAJCXN0cnVjdCBleHRlbmRlZEF0dHJIZWFkZXJEZXNjICplYWhkOwogCQllYWhkID0gKHN0cnVjdCBleHRlbmRlZEF0dHJIZWFkZXJEZXNjICopZWE7CiAKLQkJaWYgKFVERl9JX0xFTkFMTE9DKGlub2RlKSkgewotCQkJbWVtbW92ZSgmYWRbc2l6ZV0sIGFkLCBVREZfSV9MRU5BTExPQyhpbm9kZSkpOwotCQl9CisJCWlmIChpaW5mby0+aV9sZW5BbGxvYykKKwkJCW1lbW1vdmUoJmFkW3NpemVdLCBhZCwgaWluZm8tPmlfbGVuQWxsb2MpOwogCi0JCWlmIChVREZfSV9MRU5FQVRUUihpbm9kZSkpIHsKKwkJaWYgKGlpbmZvLT5pX2xlbkVBdHRyKSB7CiAJCQkvKiBjaGVjayBjaGVja3N1bS9jcmMgKi8KLQkJCWlmIChsZTE2X3RvX2NwdShlYWhkLT5kZXNjVGFnLnRhZ0lkZW50KSAhPSBUQUdfSURFTlRfRUFIRCB8fAotCQkJICAgIGxlMzJfdG9fY3B1KGVhaGQtPmRlc2NUYWcudGFnTG9jYXRpb24pICE9IFVERl9JX0xPQ0FUSU9OKGlub2RlKS5sb2dpY2FsQmxvY2tOdW0pIHsKKwkJCWlmIChlYWhkLT5kZXNjVGFnLnRhZ0lkZW50ICE9CisJCQkJCWNwdV90b19sZTE2KFRBR19JREVOVF9FQUhEKSB8fAorCQkJICAgIGxlMzJfdG9fY3B1KGVhaGQtPmRlc2NUYWcudGFnTG9jYXRpb24pICE9CisJCQkJCWlpbmZvLT5pX2xvY2F0aW9uLmxvZ2ljYWxCbG9ja051bSkKIAkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KIAkJfSBlbHNlIHsKKwkJCXN0cnVjdCB1ZGZfc2JfaW5mbyAqc2JpID0gVURGX1NCKGlub2RlLT5pX3NiKTsKKwogCQkJc2l6ZSAtPSBzaXplb2Yoc3RydWN0IGV4dGVuZGVkQXR0ckhlYWRlckRlc2MpOwotCQkJVURGX0lfTEVORUFUVFIoaW5vZGUpICs9IHNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRBdHRySGVhZGVyRGVzYyk7CisJCQlpaW5mby0+aV9sZW5FQXR0ciArPQorCQkJCXNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRBdHRySGVhZGVyRGVzYyk7CiAJCQllYWhkLT5kZXNjVGFnLnRhZ0lkZW50ID0gY3B1X3RvX2xlMTYoVEFHX0lERU5UX0VBSEQpOwotCQkJaWYgKFVERl9TQl9VREZSRVYoaW5vZGUtPmlfc2IpID49IDB4MDIwMCkKKwkJCWlmIChzYmktPnNfdWRmcmV2ID49IDB4MDIwMCkKIAkJCQllYWhkLT5kZXNjVGFnLmRlc2NWZXJzaW9uID0gY3B1X3RvX2xlMTYoMyk7CiAJCQllbHNlCiAJCQkJZWFoZC0+ZGVzY1RhZy5kZXNjVmVyc2lvbiA9IGNwdV90b19sZTE2KDIpOwotCQkJZWFoZC0+ZGVzY1RhZy50YWdTZXJpYWxOdW0gPSBjcHVfdG9fbGUxNihVREZfU0JfU0VSSUFMTlVNKGlub2RlLT5pX3NiKSk7Ci0JCQllYWhkLT5kZXNjVGFnLnRhZ0xvY2F0aW9uID0gY3B1X3RvX2xlMzIoVURGX0lfTE9DQVRJT04oaW5vZGUpLmxvZ2ljYWxCbG9ja051bSk7CisJCQllYWhkLT5kZXNjVGFnLnRhZ1NlcmlhbE51bSA9CisJCQkJCWNwdV90b19sZTE2KHNiaS0+c19zZXJpYWxfbnVtYmVyKTsKKwkJCWVhaGQtPmRlc2NUYWcudGFnTG9jYXRpb24gPSBjcHVfdG9fbGUzMigKKwkJCQkJaWluZm8tPmlfbG9jYXRpb24ubG9naWNhbEJsb2NrTnVtKTsKIAkJCWVhaGQtPmltcEF0dHJMb2NhdGlvbiA9IGNwdV90b19sZTMyKDB4RkZGRkZGRkYpOwogCQkJZWFoZC0+YXBwQXR0ckxvY2F0aW9uID0gY3B1X3RvX2xlMzIoMHhGRkZGRkZGRik7CiAJCX0KIAotCQlvZmZzZXQgPSBVREZfSV9MRU5FQVRUUihpbm9kZSk7CisJCW9mZnNldCA9IGlpbmZvLT5pX2xlbkVBdHRyOwogCQlpZiAodHlwZSA8IDIwNDgpIHsKLQkJCWlmIChsZTMyX3RvX2NwdShlYWhkLT5hcHBBdHRyTG9jYXRpb24pIDwgVURGX0lfTEVORUFUVFIoaW5vZGUpKSB7Ci0JCQkJdWludDMyX3QgYWFsID0gbGUzMl90b19jcHUoZWFoZC0+YXBwQXR0ckxvY2F0aW9uKTsKKwkJCWlmIChsZTMyX3RvX2NwdShlYWhkLT5hcHBBdHRyTG9jYXRpb24pIDwKKwkJCQkJaWluZm8tPmlfbGVuRUF0dHIpIHsKKwkJCQl1aW50MzJfdCBhYWwgPQorCQkJCQlsZTMyX3RvX2NwdShlYWhkLT5hcHBBdHRyTG9jYXRpb24pOwogCQkJCW1lbW1vdmUoJmVhW29mZnNldCAtIGFhbCArIHNpemVdLAogCQkJCQkmZWFbYWFsXSwgb2Zmc2V0IC0gYWFsKTsKIAkJCQlvZmZzZXQgLT0gYWFsOwotCQkJCWVhaGQtPmFwcEF0dHJMb2NhdGlvbiA9IGNwdV90b19sZTMyKGFhbCArIHNpemUpOworCQkJCWVhaGQtPmFwcEF0dHJMb2NhdGlvbiA9CisJCQkJCQljcHVfdG9fbGUzMihhYWwgKyBzaXplKTsKIAkJCX0KLQkJCWlmIChsZTMyX3RvX2NwdShlYWhkLT5pbXBBdHRyTG9jYXRpb24pIDwgVURGX0lfTEVORUFUVFIoaW5vZGUpKSB7Ci0JCQkJdWludDMyX3QgaWFsID0gbGUzMl90b19jcHUoZWFoZC0+aW1wQXR0ckxvY2F0aW9uKTsKKwkJCWlmIChsZTMyX3RvX2NwdShlYWhkLT5pbXBBdHRyTG9jYXRpb24pIDwKKwkJCQkJaWluZm8tPmlfbGVuRUF0dHIpIHsKKwkJCQl1aW50MzJfdCBpYWwgPQorCQkJCQlsZTMyX3RvX2NwdShlYWhkLT5pbXBBdHRyTG9jYXRpb24pOwogCQkJCW1lbW1vdmUoJmVhW29mZnNldCAtIGlhbCArIHNpemVdLAogCQkJCQkmZWFbaWFsXSwgb2Zmc2V0IC0gaWFsKTsKIAkJCQlvZmZzZXQgLT0gaWFsOwotCQkJCWVhaGQtPmltcEF0dHJMb2NhdGlvbiA9IGNwdV90b19sZTMyKGlhbCArIHNpemUpOworCQkJCWVhaGQtPmltcEF0dHJMb2NhdGlvbiA9CisJCQkJCQljcHVfdG9fbGUzMihpYWwgKyBzaXplKTsKIAkJCX0KIAkJfSBlbHNlIGlmICh0eXBlIDwgNjU1MzYpIHsKLQkJCWlmIChsZTMyX3RvX2NwdShlYWhkLT5hcHBBdHRyTG9jYXRpb24pIDwgVURGX0lfTEVORUFUVFIoaW5vZGUpKSB7Ci0JCQkJdWludDMyX3QgYWFsID0gbGUzMl90b19jcHUoZWFoZC0+YXBwQXR0ckxvY2F0aW9uKTsKKwkJCWlmIChsZTMyX3RvX2NwdShlYWhkLT5hcHBBdHRyTG9jYXRpb24pIDwKKwkJCQkJaWluZm8tPmlfbGVuRUF0dHIpIHsKKwkJCQl1aW50MzJfdCBhYWwgPQorCQkJCQlsZTMyX3RvX2NwdShlYWhkLT5hcHBBdHRyTG9jYXRpb24pOwogCQkJCW1lbW1vdmUoJmVhW29mZnNldCAtIGFhbCArIHNpemVdLAogCQkJCQkmZWFbYWFsXSwgb2Zmc2V0IC0gYWFsKTsKIAkJCQlvZmZzZXQgLT0gYWFsOwotCQkJCWVhaGQtPmFwcEF0dHJMb2NhdGlvbiA9IGNwdV90b19sZTMyKGFhbCArIHNpemUpOworCQkJCWVhaGQtPmFwcEF0dHJMb2NhdGlvbiA9CisJCQkJCQljcHVfdG9fbGUzMihhYWwgKyBzaXplKTsKIAkJCX0KIAkJfQogCQkvKiByZXdyaXRlIENSQyArIGNoZWNrc3VtIG9mIGVhaGQgKi8KIAkJY3JjbGVuID0gc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEF0dHJIZWFkZXJEZXNjKSAtIHNpemVvZih0YWcpOwogCQllYWhkLT5kZXNjVGFnLmRlc2NDUkNMZW5ndGggPSBjcHVfdG9fbGUxNihjcmNsZW4pOwogCQllYWhkLT5kZXNjVGFnLmRlc2NDUkMgPSBjcHVfdG9fbGUxNih1ZGZfY3JjKChjaGFyICopZWFoZCArCi0JCQkJCQkJICAgIHNpemVvZih0YWcpLCBjcmNsZW4sIDApKTsKLQkJZWFoZC0+ZGVzY1RhZy50YWdDaGVja3N1bSA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotCQkJaWYgKGkgIT0gNCkKLQkJCQllYWhkLT5kZXNjVGFnLnRhZ0NoZWNrc3VtICs9ICgodWludDhfdCAqKSYoZWFoZC0+ZGVzY1RhZykpW2ldOwotCQlVREZfSV9MRU5FQVRUUihpbm9kZSkgKz0gc2l6ZTsKKwkJCQkJCXNpemVvZih0YWcpLCBjcmNsZW4sIDApKTsKKwkJZWFoZC0+ZGVzY1RhZy50YWdDaGVja3N1bSA9IHVkZl90YWdfY2hlY2tzdW0oJmVhaGQtPmRlc2NUYWcpOworCQlpaW5mby0+aV9sZW5FQXR0ciArPSBzaXplOwogCQlyZXR1cm4gKHN0cnVjdCBnZW5lcmljRm9ybWF0ICopJmVhW29mZnNldF07CiAJfQotCWlmIChsb2MgJiAweDAyKSB7Ci0JfQorCWlmIChsb2MgJiAweDAyKQorCQk7CiAKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTE0MywxOCArMTU0LDIwIEBACiAJc3RydWN0IGdlbmVyaWNGb3JtYXQgKmdhZjsKIAl1aW50OF90ICplYSA9IE5VTEw7CiAJdWludDMyX3Qgb2Zmc2V0OworCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqaWluZm8gPSBVREZfSShpbm9kZSk7CiAKLQllYSA9IFVERl9JX0RBVEEoaW5vZGUpOworCWVhID0gaWluZm8tPmlfZXh0LmlfZGF0YTsKIAotCWlmIChVREZfSV9MRU5FQVRUUihpbm9kZSkpIHsKKwlpZiAoaWluZm8tPmlfbGVuRUF0dHIpIHsKIAkJc3RydWN0IGV4dGVuZGVkQXR0ckhlYWRlckRlc2MgKmVhaGQ7CiAJCWVhaGQgPSAoc3RydWN0IGV4dGVuZGVkQXR0ckhlYWRlckRlc2MgKillYTsKIAogCQkvKiBjaGVjayBjaGVja3N1bS9jcmMgKi8KLQkJaWYgKGxlMTZfdG9fY3B1KGVhaGQtPmRlc2NUYWcudGFnSWRlbnQpICE9IFRBR19JREVOVF9FQUhEIHx8Ci0JCSAgICBsZTMyX3RvX2NwdShlYWhkLT5kZXNjVGFnLnRhZ0xvY2F0aW9uKSAhPSBVREZfSV9MT0NBVElPTihpbm9kZSkubG9naWNhbEJsb2NrTnVtKSB7CisJCWlmIChlYWhkLT5kZXNjVGFnLnRhZ0lkZW50ICE9CisJCQkJY3B1X3RvX2xlMTYoVEFHX0lERU5UX0VBSEQpIHx8CisJCSAgICBsZTMyX3RvX2NwdShlYWhkLT5kZXNjVGFnLnRhZ0xvY2F0aW9uKSAhPQorCQkJCWlpbmZvLT5pX2xvY2F0aW9uLmxvZ2ljYWxCbG9ja051bSkKIAkJCXJldHVybiBOVUxMOwotCQl9CiAKIAkJaWYgKHR5cGUgPCAyMDQ4KQogCQkJb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEF0dHJIZWFkZXJEZXNjKTsKQEAgLTE2Myw5ICsxNzYsMTAgQEAKIAkJZWxzZQogCQkJb2Zmc2V0ID0gbGUzMl90b19jcHUoZWFoZC0+YXBwQXR0ckxvY2F0aW9uKTsKIAotCQl3aGlsZSAob2Zmc2V0IDwgVURGX0lfTEVORUFUVFIoaW5vZGUpKSB7CisJCXdoaWxlIChvZmZzZXQgPCBpaW5mby0+aV9sZW5FQXR0cikgewogCQkJZ2FmID0gKHN0cnVjdCBnZW5lcmljRm9ybWF0ICopJmVhW29mZnNldF07Ci0JCQlpZiAobGUzMl90b19jcHUoZ2FmLT5hdHRyVHlwZSkgPT0gdHlwZSAmJiBnYWYtPmF0dHJTdWJ0eXBlID09IHN1YnR5cGUpCisJCQlpZiAobGUzMl90b19jcHUoZ2FmLT5hdHRyVHlwZSkgPT0gdHlwZSAmJgorCQkJCQlnYWYtPmF0dHJTdWJ0eXBlID09IHN1YnR5cGUpCiAJCQkJcmV0dXJuIGdhZjsKIAkJCWVsc2UKIAkJCQlvZmZzZXQgKz0gbGUzMl90b19jcHUoZ2FmLT5hdHRyTGVuZ3RoKTsKQEAgLTE4NiwyMSArMjAwLDIwIEBACiAgKglXcml0dGVuLCB0ZXN0ZWQsIGFuZCByZWxlYXNlZC4KICAqLwogc3RydWN0IGJ1ZmZlcl9oZWFkICp1ZGZfcmVhZF90YWdnZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdWludDMyX3QgYmxvY2ssCi0JCQkJICAgIHVpbnQzMl90IGxvY2F0aW9uLCB1aW50MTZfdCAqIGlkZW50KQorCQkJCSAgICB1aW50MzJfdCBsb2NhdGlvbiwgdWludDE2X3QgKmlkZW50KQogewogCXRhZyAqdGFnX3A7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7Ci0JcmVnaXN0ZXIgdWludDhfdCBjaGVja3N1bTsKLQlyZWdpc3RlciBpbnQgaTsKKwlzdHJ1Y3QgdWRmX3NiX2luZm8gKnNiaSA9IFVERl9TQihzYik7CiAKIAkvKiBSZWFkIHRoZSBibG9jayAqLwogCWlmIChibG9jayA9PSAweEZGRkZGRkZGKQogCQlyZXR1cm4gTlVMTDsKIAotCWJoID0gdWRmX3RyZWFkKHNiLCBibG9jayArIFVERl9TQl9TRVNTSU9OKHNiKSk7CisJYmggPSB1ZGZfdHJlYWQoc2IsIGJsb2NrICsgc2JpLT5zX3Nlc3Npb24pOwogCWlmICghYmgpIHsKIAkJdWRmX2RlYnVnKCJibG9jaz0lZCwgbG9jYXRpb249JWQ6IHJlYWQgZmFpbGVkXG4iLAotCQkJICBibG9jayArIFVERl9TQl9TRVNTSU9OKHNiKSwgbG9jYXRpb24pOworCQkJICBibG9jayArIHNiaS0+c19zZXNzaW9uLCBsb2NhdGlvbik7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtMjEwLDI0ICsyMjMsMjAgQEAKIAogCWlmIChsb2NhdGlvbiAhPSBsZTMyX3RvX2NwdSh0YWdfcC0+dGFnTG9jYXRpb24pKSB7CiAJCXVkZl9kZWJ1ZygibG9jYXRpb24gbWlzbWF0Y2ggYmxvY2sgJXUsIHRhZyAldSAhPSAldVxuIiwKLQkJCSAgYmxvY2sgKyBVREZfU0JfU0VTU0lPTihzYiksIGxlMzJfdG9fY3B1KHRhZ19wLT50YWdMb2NhdGlvbiksIGxvY2F0aW9uKTsKKwkJCSAgYmxvY2sgKyBzYmktPnNfc2Vzc2lvbiwKKwkJCSAgbGUzMl90b19jcHUodGFnX3AtPnRhZ0xvY2F0aW9uKSwgbG9jYXRpb24pOwogCQlnb3RvIGVycm9yX291dDsKIAl9CiAKIAkvKiBWZXJpZnkgdGhlIHRhZyBjaGVja3N1bSAqLwotCWNoZWNrc3VtID0gMFU7Ci0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQkJY2hlY2tzdW0gKz0gKHVpbnQ4X3QpKGJoLT5iX2RhdGFbaV0pOwotCWZvciAoaSA9IDU7IGkgPCAxNjsgaSsrKQotCQljaGVja3N1bSArPSAodWludDhfdCkoYmgtPmJfZGF0YVtpXSk7Ci0JaWYgKGNoZWNrc3VtICE9IHRhZ19wLT50YWdDaGVja3N1bSkgeworCWlmICh1ZGZfdGFnX2NoZWNrc3VtKHRhZ19wKSAhPSB0YWdfcC0+dGFnQ2hlY2tzdW0pIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IHRhZyBjaGVja3N1bSBmYWlsZWQgYmxvY2sgJWRcbiIsIGJsb2NrKTsKIAkJZ290byBlcnJvcl9vdXQ7CiAJfQogCiAJLyogVmVyaWZ5IHRoZSB0YWcgdmVyc2lvbiAqLwotCWlmIChsZTE2X3RvX2NwdSh0YWdfcC0+ZGVzY1ZlcnNpb24pICE9IDB4MDAwMlUgJiYKLQkgICAgbGUxNl90b19jcHUodGFnX3AtPmRlc2NWZXJzaW9uKSAhPSAweDAwMDNVKSB7CisJaWYgKHRhZ19wLT5kZXNjVmVyc2lvbiAhPSBjcHVfdG9fbGUxNigweDAwMDJVKSAmJgorCSAgICB0YWdfcC0+ZGVzY1ZlcnNpb24gIT0gY3B1X3RvX2xlMTYoMHgwMDAzVSkpIHsKIAkJdWRmX2RlYnVnKCJ0YWcgdmVyc2lvbiAweCUwNHggIT0gMHgwMDAyIHx8IDB4MDAwMyBibG9jayAlZFxuIiwKIAkJCSAgbGUxNl90b19jcHUodGFnX3AtPmRlc2NWZXJzaW9uKSwgYmxvY2spOwogCQlnb3RvIGVycm9yX291dDsKQEAgLTIzNiwxMSArMjQ1LDExIEBACiAJLyogVmVyaWZ5IHRoZSBkZXNjcmlwdG9yIENSQyAqLwogCWlmIChsZTE2X3RvX2NwdSh0YWdfcC0+ZGVzY0NSQ0xlbmd0aCkgKyBzaXplb2YodGFnKSA+IHNiLT5zX2Jsb2Nrc2l6ZSB8fAogCSAgICBsZTE2X3RvX2NwdSh0YWdfcC0+ZGVzY0NSQykgPT0gdWRmX2NyYyhiaC0+Yl9kYXRhICsgc2l6ZW9mKHRhZyksCi0JCQkJCQkgICBsZTE2X3RvX2NwdSh0YWdfcC0+ZGVzY0NSQ0xlbmd0aCksIDApKSB7CisJCQkJCWxlMTZfdG9fY3B1KHRhZ19wLT5kZXNjQ1JDTGVuZ3RoKSwgMCkpCiAJCXJldHVybiBiaDsKLQl9CisKIAl1ZGZfZGVidWcoIkNyYyBmYWlsdXJlIGJsb2NrICVkOiBjcmMgPSAlZCwgY3JjbGVuID0gJWRcbiIsCi0JCSAgYmxvY2sgKyBVREZfU0JfU0VTU0lPTihzYiksIGxlMTZfdG9fY3B1KHRhZ19wLT5kZXNjQ1JDKSwKKwkJICBibG9jayArIHNiaS0+c19zZXNzaW9uLCBsZTE2X3RvX2NwdSh0YWdfcC0+ZGVzY0NSQyksCiAJCSAgbGUxNl90b19jcHUodGFnX3AtPmRlc2NDUkNMZW5ndGgpKTsKIAogZXJyb3Jfb3V0OgpAQCAtMjQ5LDcgKzI1OCw3IEBACiB9CiAKIHN0cnVjdCBidWZmZXJfaGVhZCAqdWRmX3JlYWRfcHRhZ2dlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBrZXJuZWxfbGJfYWRkciBsb2MsCi0JCQkJICAgICB1aW50MzJfdCBvZmZzZXQsIHVpbnQxNl90ICogaWRlbnQpCisJCQkJICAgICB1aW50MzJfdCBvZmZzZXQsIHVpbnQxNl90ICppZGVudCkKIHsKIAlyZXR1cm4gdWRmX3JlYWRfdGFnZ2VkKHNiLCB1ZGZfZ2V0X2xiX3BibG9jayhzYiwgbG9jLCBvZmZzZXQpLAogCQkJICAgICAgIGxvYy5sb2dpY2FsQmxvY2tOdW0gKyBvZmZzZXQsIGlkZW50KTsKQEAgLTI1OCwxNyArMjY3LDExIEBACiB2b2lkIHVkZl91cGRhdGVfdGFnKGNoYXIgKmRhdGEsIGludCBsZW5ndGgpCiB7CiAJdGFnICp0cHRyID0gKHRhZyAqKWRhdGE7Ci0JaW50IGk7Ci0KIAlsZW5ndGggLT0gc2l6ZW9mKHRhZyk7CiAKLQl0cHRyLT50YWdDaGVja3N1bSA9IDA7CiAJdHB0ci0+ZGVzY0NSQ0xlbmd0aCA9IGNwdV90b19sZTE2KGxlbmd0aCk7CiAJdHB0ci0+ZGVzY0NSQyA9IGNwdV90b19sZTE2KHVkZl9jcmMoZGF0YSArIHNpemVvZih0YWcpLCBsZW5ndGgsIDApKTsKLQotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotCQlpZiAoaSAhPSA0KQotCQkJdHB0ci0+dGFnQ2hlY2tzdW0gKz0gKHVpbnQ4X3QpKGRhdGFbaV0pOworCXRwdHItPnRhZ0NoZWNrc3VtID0gdWRmX3RhZ19jaGVja3N1bSh0cHRyKTsKIH0KIAogdm9pZCB1ZGZfbmV3X3RhZyhjaGFyICpkYXRhLCB1aW50MTZfdCBpZGVudCwgdWludDE2X3QgdmVyc2lvbiwgdWludDE2X3Qgc251bSwKQEAgLTI4MSwzICsyODQsMTQgQEAKIAl0cHRyLT50YWdMb2NhdGlvbiA9IGNwdV90b19sZTMyKGxvYyk7CiAJdWRmX3VwZGF0ZV90YWcoZGF0YSwgbGVuZ3RoKTsKIH0KKwordTggdWRmX3RhZ19jaGVja3N1bShjb25zdCB0YWcgKnQpCit7CisJdTggKmRhdGEgPSAodTggKil0OworCXU4IGNoZWNrc3VtID0gMDsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHRhZyk7ICsraSkKKwkJaWYgKGkgIT0gNCkgLyogcG9zaXRpb24gb2YgY2hlY2tzdW0gKi8KKwkJCWNoZWNrc3VtICs9IGRhdGFbaV07CisJcmV0dXJuIGNoZWNrc3VtOworfQpkaWZmIC0tZ2l0IGEvZnMvdWRmL25hbWVpLmMgYi9mcy91ZGYvbmFtZWkuYwppbmRleCBiZWM5NmE2Li4xMTJhNWZiIDEwMDY0NAotLS0gYS9mcy91ZGYvbmFtZWkuYworKysgYi9mcy91ZGYvbmFtZWkuYwpAQCAtNDMsMTIgKzQzLDEwIEBACiAKIGludCB1ZGZfd3JpdGVfZmkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGVJZGVudERlc2MgKmNmaSwKIAkJIHN0cnVjdCBmaWxlSWRlbnREZXNjICpzZmksIHN0cnVjdCB1ZGZfZmlsZWlkZW50X2JoICpmaWJoLAotCQkgdWludDhfdCAqIGltcHVzZSwgdWludDhfdCAqIGZpbGVpZGVudCkKKwkJIHVpbnQ4X3QgKmltcHVzZSwgdWludDhfdCAqZmlsZWlkZW50KQogewogCXVpbnQxNl90IGNyY2xlbiA9IGZpYmgtPmVvZmZzZXQgLSBmaWJoLT5zb2Zmc2V0IC0gc2l6ZW9mKHRhZyk7CiAJdWludDE2X3QgY3JjOwotCXVpbnQ4X3QgY2hlY2tzdW0gPSAwOwotCWludCBpOwogCWludCBvZmZzZXQ7CiAJdWludDE2X3QgbGl1ID0gbGUxNl90b19jcHUoY2ZpLT5sZW5ndGhPZkltcFVzZSk7CiAJdWludDhfdCBsZmkgPSBjZmktPmxlbmd0aEZpbGVJZGVudDsKQEAgLTU2LDcgKzU0LDcgQEAKIAkJc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKTsKIAlpbnQgYWRpbmljYiA9IDA7CiAKLQlpZiAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpCisJaWYgKFVERl9JKGlub2RlKS0+aV9hbGxvY190eXBlID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikKIAkJYWRpbmljYiA9IDE7CiAKIAlvZmZzZXQgPSBmaWJoLT5zb2Zmc2V0ICsgc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKTsKQEAgLTY4LDcgKzY2LDggQEAKIAkJCW1lbWNweShmaWJoLT5lYmgtPmJfZGF0YSArIG9mZnNldCwgaW1wdXNlLCBsaXUpOwogCQl9IGVsc2UgewogCQkJbWVtY3B5KCh1aW50OF90ICopc2ZpLT5pbXBVc2UsIGltcHVzZSwgLW9mZnNldCk7Ci0JCQltZW1jcHkoZmliaC0+ZWJoLT5iX2RhdGEsIGltcHVzZSAtIG9mZnNldCwgbGl1ICsgb2Zmc2V0KTsKKwkJCW1lbWNweShmaWJoLT5lYmgtPmJfZGF0YSwgaW1wdXNlIC0gb2Zmc2V0LAorCQkJCWxpdSArIG9mZnNldCk7CiAJCX0KIAl9CiAKQEAgLTgwLDggKzc5LDEwIEBACiAJCX0gZWxzZSBpZiAob2Zmc2V0ID49IDApIHsKIAkJCW1lbWNweShmaWJoLT5lYmgtPmJfZGF0YSArIG9mZnNldCwgZmlsZWlkZW50LCBsZmkpOwogCQl9IGVsc2UgewotCQkJbWVtY3B5KCh1aW50OF90ICopc2ZpLT5maWxlSWRlbnQgKyBsaXUsIGZpbGVpZGVudCwgLW9mZnNldCk7Ci0JCQltZW1jcHkoZmliaC0+ZWJoLT5iX2RhdGEsIGZpbGVpZGVudCAtIG9mZnNldCwgbGZpICsgb2Zmc2V0KTsKKwkJCW1lbWNweSgodWludDhfdCAqKXNmaS0+ZmlsZUlkZW50ICsgbGl1LCBmaWxlaWRlbnQsCisJCQkJLW9mZnNldCk7CisJCQltZW1jcHkoZmliaC0+ZWJoLT5iX2RhdGEsIGZpbGVpZGVudCAtIG9mZnNldCwKKwkJCQlsZmkgKyBvZmZzZXQpOwogCQl9CiAJfQogCkBAIC0xMDEsMjcgKzEwMiwyOSBAQAogCiAJaWYgKGZpYmgtPnNiaCA9PSBmaWJoLT5lYmgpIHsKIAkJY3JjID0gdWRmX2NyYygodWludDhfdCAqKXNmaS0+aW1wVXNlLAotCQkJICAgICAgY3JjbGVuICsgc2l6ZW9mKHRhZykgLSBzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpLCBjcmMpOworCQkJICAgICAgY3JjbGVuICsgc2l6ZW9mKHRhZykgLQorCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKSwgY3JjKTsKIAl9IGVsc2UgaWYgKHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYykgPj0gLWZpYmgtPnNvZmZzZXQpIHsKLQkJY3JjID0gdWRmX2NyYyhmaWJoLT5lYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYykgKyBmaWJoLT5zb2Zmc2V0LAotCQkJICAgICAgY3JjbGVuICsgc2l6ZW9mKHRhZykgLSBzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpLCBjcmMpOworCQljcmMgPSB1ZGZfY3JjKGZpYmgtPmViaC0+Yl9kYXRhICsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKSArCisJCQkJCWZpYmgtPnNvZmZzZXQsCisJCQkgICAgICBjcmNsZW4gKyBzaXplb2YodGFnKSAtCisJCQkJCXNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYyksCisJCQkgICAgICBjcmMpOwogCX0gZWxzZSB7CiAJCWNyYyA9IHVkZl9jcmMoKHVpbnQ4X3QgKilzZmktPmltcFVzZSwKLQkJCSAgICAgIC1maWJoLT5zb2Zmc2V0IC0gc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKSwgY3JjKTsKKwkJCSAgICAgIC1maWJoLT5zb2Zmc2V0IC0gc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKSwKKwkJCSAgICAgIGNyYyk7CiAJCWNyYyA9IHVkZl9jcmMoZmliaC0+ZWJoLT5iX2RhdGEsIGZpYmgtPmVvZmZzZXQsIGNyYyk7CiAJfQogCiAJY2ZpLT5kZXNjVGFnLmRlc2NDUkMgPSBjcHVfdG9fbGUxNihjcmMpOwogCWNmaS0+ZGVzY1RhZy5kZXNjQ1JDTGVuZ3RoID0gY3B1X3RvX2xlMTYoY3JjbGVuKTsKKwljZmktPmRlc2NUYWcudGFnQ2hlY2tzdW0gPSB1ZGZfdGFnX2NoZWNrc3VtKCZjZmktPmRlc2NUYWcpOwogCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJaWYgKGkgIT0gNCkKLQkJCWNoZWNrc3VtICs9ICgodWludDhfdCAqKSZjZmktPmRlc2NUYWcpW2ldOwotCX0KLQotCWNmaS0+ZGVzY1RhZy50YWdDaGVja3N1bSA9IGNoZWNrc3VtOwogCWlmIChhZGluaWNiIHx8IChzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpIDw9IC1maWJoLT5zb2Zmc2V0KSkgewotCQltZW1jcHkoKHVpbnQ4X3QgKilzZmksICh1aW50OF90ICopY2ZpLCBzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpKTsKKwkJbWVtY3B5KCh1aW50OF90ICopc2ZpLCAodWludDhfdCAqKWNmaSwKKwkJCXNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYykpOwogCX0gZWxzZSB7CiAJCW1lbWNweSgodWludDhfdCAqKXNmaSwgKHVpbnQ4X3QgKiljZmksIC1maWJoLT5zb2Zmc2V0KTsKIAkJbWVtY3B5KGZpYmgtPmViaC0+Yl9kYXRhLCAodWludDhfdCAqKWNmaSAtIGZpYmgtPnNvZmZzZXQsCkBAIC0xNTUsMjYgKzE1OCwyOCBAQAogCXVpbnQzMl90IGVsZW47CiAJc2VjdG9yX3Qgb2Zmc2V0OwogCXN0cnVjdCBleHRlbnRfcG9zaXRpb24gZXBvcyA9IHt9OworCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqZGluZm8gPSBVREZfSShkaXIpOwogCi0Jc2l6ZSA9ICh1ZGZfZXh0MF9vZmZzZXQoZGlyKSArIGRpci0+aV9zaXplKSA+PiAyOwotCWZfcG9zID0gKHVkZl9leHQwX29mZnNldChkaXIpID4+IDIpOworCXNpemUgPSB1ZGZfZXh0MF9vZmZzZXQoZGlyKSArIGRpci0+aV9zaXplOworCWZfcG9zID0gdWRmX2V4dDBfb2Zmc2V0KGRpcik7CiAKLQlmaWJoLT5zb2Zmc2V0ID0gZmliaC0+ZW9mZnNldCA9IChmX3BvcyAmICgoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+IDIpKSA8PCAyOwotCWlmIChVREZfSV9BTExPQ1RZUEUoZGlyKSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpIHsKKwlmaWJoLT5zb2Zmc2V0ID0gZmliaC0+ZW9mZnNldCA9IGZfcG9zICYgKGRpci0+aV9zYi0+c19ibG9ja3NpemUgLSAxKTsKKwlpZiAoZGluZm8tPmlfYWxsb2NfdHlwZSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpCiAJCWZpYmgtPnNiaCA9IGZpYmgtPmViaCA9IE5VTEw7Ci0JfSBlbHNlIGlmIChpbm9kZV9ibWFwKGRpciwgZl9wb3MgPj4gKGRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cyAtIDIpLAotCQkJICAgICAgJmVwb3MsICZlbG9jLCAmZWxlbiwgJm9mZnNldCkgPT0gKEVYVF9SRUNPUkRFRF9BTExPQ0FURUQgPj4gMzApKSB7CisJZWxzZSBpZiAoaW5vZGVfYm1hcChkaXIsIGZfcG9zID4+IGRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cywKKwkJCSAgICAgICZlcG9zLCAmZWxvYywgJmVsZW4sICZvZmZzZXQpID09CisJCQkJCShFWFRfUkVDT1JERURfQUxMT0NBVEVEID4+IDMwKSkgewogCQlibG9jayA9IHVkZl9nZXRfbGJfcGJsb2NrKGRpci0+aV9zYiwgZWxvYywgb2Zmc2V0KTsKIAkJaWYgKCgrK29mZnNldCA8PCBkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpIDwgZWxlbikgewotCQkJaWYgKFVERl9JX0FMTE9DVFlQRShkaXIpID09IElDQlRBR19GTEFHX0FEX1NIT1JUKQorCQkJaWYgKGRpbmZvLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfU0hPUlQpCiAJCQkJZXBvcy5vZmZzZXQgLT0gc2l6ZW9mKHNob3J0X2FkKTsKLQkJCWVsc2UgaWYgKFVERl9JX0FMTE9DVFlQRShkaXIpID09IElDQlRBR19GTEFHX0FEX0xPTkcpCisJCQllbHNlIGlmIChkaW5mby0+aV9hbGxvY190eXBlID09IElDQlRBR19GTEFHX0FEX0xPTkcpCiAJCQkJZXBvcy5vZmZzZXQgLT0gc2l6ZW9mKGxvbmdfYWQpOwotCQl9IGVsc2UgeworCQl9IGVsc2UKIAkJCW9mZnNldCA9IDA7Ci0JCX0KIAotCQlpZiAoIShmaWJoLT5zYmggPSBmaWJoLT5lYmggPSB1ZGZfdHJlYWQoZGlyLT5pX3NiLCBibG9jaykpKSB7CisJCWZpYmgtPnNiaCA9IGZpYmgtPmViaCA9IHVkZl90cmVhZChkaXItPmlfc2IsIGJsb2NrKTsKKwkJaWYgKCFmaWJoLT5zYmgpIHsKIAkJCWJyZWxzZShlcG9zLmJoKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CkBAIC0xODMsNyArMTg4LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0Jd2hpbGUgKChmX3BvcyA8IHNpemUpKSB7CisJd2hpbGUgKGZfcG9zIDwgc2l6ZSkgewogCQlmaSA9IHVkZl9maWxlaWRlbnRfcmVhZChkaXIsICZmX3BvcywgZmliaCwgY2ZpLCAmZXBvcywgJmVsb2MsCiAJCQkJCSZlbGVuLCAmb2Zmc2V0KTsKIAkJaWYgKCFmaSkgewpAQCAtMjAyLDE0ICsyMDcsMTggQEAKIAkJfSBlbHNlIHsKIAkJCWludCBwb2Zmc2V0OwkvKiBVbnBhZGVkIGVuZGluZyBvZmZzZXQgKi8KIAotCQkJcG9mZnNldCA9IGZpYmgtPnNvZmZzZXQgKyBzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpICsgbGl1ICsgbGZpOworCQkJcG9mZnNldCA9IGZpYmgtPnNvZmZzZXQgKyBzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpICsKKwkJCQkJbGl1ICsgbGZpOwogCi0JCQlpZiAocG9mZnNldCA+PSBsZmkpIHsKLQkJCQluYW1lcHRyID0gKHVpbnQ4X3QgKikoZmliaC0+ZWJoLT5iX2RhdGEgKyBwb2Zmc2V0IC0gbGZpKTsKLQkJCX0gZWxzZSB7CisJCQlpZiAocG9mZnNldCA+PSBsZmkpCisJCQkJbmFtZXB0ciA9ICh1aW50OF90ICopKGZpYmgtPmViaC0+Yl9kYXRhICsKKwkJCQkJCSAgICAgIHBvZmZzZXQgLSBsZmkpOworCQkJZWxzZSB7CiAJCQkJbmFtZXB0ciA9IGZuYW1lOwotCQkJCW1lbWNweShuYW1lcHRyLCBmaS0+ZmlsZUlkZW50ICsgbGl1LCBsZmkgLSBwb2Zmc2V0KTsKLQkJCQltZW1jcHkobmFtZXB0ciArIGxmaSAtIHBvZmZzZXQsIGZpYmgtPmViaC0+Yl9kYXRhLCBwb2Zmc2V0KTsKKwkJCQltZW1jcHkobmFtZXB0ciwgZmktPmZpbGVJZGVudCArIGxpdSwKKwkJCQkJbGZpIC0gcG9mZnNldCk7CisJCQkJbWVtY3B5KG5hbWVwdHIgKyBsZmkgLSBwb2Zmc2V0LAorCQkJCQlmaWJoLT5lYmgtPmJfZGF0YSwgcG9mZnNldCk7CiAJCQl9CiAJCX0KIApAQCAtMjI2LDExICsyMzUsMTEgQEAKIAkJaWYgKCFsZmkpCiAJCQljb250aW51ZTsKIAotCQlpZiAoKGZsZW4gPSB1ZGZfZ2V0X2ZpbGVuYW1lKGRpci0+aV9zYiwgbmFtZXB0ciwgZm5hbWUsIGxmaSkpKSB7Ci0JCQlpZiAodWRmX21hdGNoKGZsZW4sIGZuYW1lLCBkZW50cnktPmRfbmFtZS5sZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpKSB7Ci0JCQkJYnJlbHNlKGVwb3MuYmgpOwotCQkJCXJldHVybiBmaTsKLQkJCX0KKwkJZmxlbiA9IHVkZl9nZXRfZmlsZW5hbWUoZGlyLT5pX3NiLCBuYW1lcHRyLCBmbmFtZSwgbGZpKTsKKwkJaWYgKGZsZW4gJiYgdWRmX21hdGNoKGZsZW4sIGZuYW1lLCBkZW50cnktPmRfbmFtZS5sZW4sCisJCQkJICAgICAgZGVudHJ5LT5kX25hbWUubmFtZSkpIHsKKwkJCWJyZWxzZShlcG9zLmJoKTsKKwkJCXJldHVybiBmaTsKIAkJfQogCX0KIApAQCAtMjkxLDE2ICszMDAsMTYgQEAKIAlpZiAoIXN0cm5jbXAoZGVudHJ5LT5kX25hbWUubmFtZSwgIi5CPSIsIDMpKSB7CiAJCWtlcm5lbF9sYl9hZGRyIGxiID0gewogCQkJLmxvZ2ljYWxCbG9ja051bSA9IDAsCi0JCQkucGFydGl0aW9uUmVmZXJlbmNlTnVtID0gc2ltcGxlX3N0cnRvdWwoZGVudHJ5LT5kX25hbWUubmFtZSArIDMsCi0JCQkJCQkJCU5VTEwsIDApLAorCQkJLnBhcnRpdGlvblJlZmVyZW5jZU51bSA9CisJCQkJc2ltcGxlX3N0cnRvdWwoZGVudHJ5LT5kX25hbWUubmFtZSArIDMsCisJCQkJCQlOVUxMLCAwKSwKIAkJfTsKIAkJaW5vZGUgPSB1ZGZfaWdldChkaXItPmlfc2IsIGxiKTsKIAkJaWYgKCFpbm9kZSkgewogCQkJdW5sb2NrX2tlcm5lbCgpOwogCQkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CiAJCX0KLQl9Ci0JZWxzZQorCX0gZWxzZQogI2VuZGlmIC8qIFVERl9SRUNPVkVSWSAqLwogCiAJaWYgKHVkZl9maW5kX2VudHJ5KGRpciwgZGVudHJ5LCAmZmliaCwgJmNmaSkpIHsKQEAgLTMyNSwxNCArMzM0LDE0IEBACiAJCQkJCSAgIHN0cnVjdCB1ZGZfZmlsZWlkZW50X2JoICpmaWJoLAogCQkJCQkgICBzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqY2ZpLCBpbnQgKmVycikKIHsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CiAJc3RydWN0IGZpbGVJZGVudERlc2MgKmZpID0gTlVMTDsKIAljaGFyIG5hbWVbVURGX05BTUVfTEVOXSwgZm5hbWVbVURGX05BTUVfTEVOXTsKIAlpbnQgbmFtZWxlbjsKIAlsb2ZmX3QgZl9wb3M7CiAJaW50IGZsZW47CiAJY2hhciAqbmFtZXB0cjsKLQlsb2ZmX3Qgc2l6ZSA9ICh1ZGZfZXh0MF9vZmZzZXQoZGlyKSArIGRpci0+aV9zaXplKSA+PiAyOworCWxvZmZfdCBzaXplID0gdWRmX2V4dDBfb2Zmc2V0KGRpcikgKyBkaXItPmlfc2l6ZTsKIAlpbnQgbmZpZGxlbjsKIAl1aW50OF90IGxmaTsKIAl1aW50MTZfdCBsaXU7CkBAIC0zNDEsMTYgKzM1MCwxNiBAQAogCXVpbnQzMl90IGVsZW47CiAJc2VjdG9yX3Qgb2Zmc2V0OwogCXN0cnVjdCBleHRlbnRfcG9zaXRpb24gZXBvcyA9IHt9OwotCi0Jc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IHVkZl9pbm9kZV9pbmZvICpkaW5mbzsKIAogCWlmIChkZW50cnkpIHsKIAkJaWYgKCFkZW50cnktPmRfbmFtZS5sZW4pIHsKIAkJCSplcnIgPSAtRUlOVkFMOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KLQkJaWYgKCEobmFtZWxlbiA9IHVkZl9wdXRfZmlsZW5hbWUoc2IsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIG5hbWUsCi0JCQkJCQkgZGVudHJ5LT5kX25hbWUubGVuKSkpIHsKKwkJbmFtZWxlbiA9IHVkZl9wdXRfZmlsZW5hbWUoc2IsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIG5hbWUsCisJCQkJCQkgZGVudHJ5LT5kX25hbWUubGVuKTsKKwkJaWYgKCFuYW1lbGVuKSB7CiAJCQkqZXJyID0gLUVOQU1FVE9PTE9ORzsKIAkJCXJldHVybiBOVUxMOwogCQl9CkBAIC0zNjAsMzkgKzM2OSw0MCBAQAogCiAJbmZpZGxlbiA9IChzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpICsgbmFtZWxlbiArIDMpICYgfjM7CiAKLQlmX3BvcyA9ICh1ZGZfZXh0MF9vZmZzZXQoZGlyKSA+PiAyKTsKKwlmX3BvcyA9IHVkZl9leHQwX29mZnNldChkaXIpOwogCi0JZmliaC0+c29mZnNldCA9IGZpYmgtPmVvZmZzZXQgPSAoZl9wb3MgJiAoKGRpci0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSA+PiAyKSkgPDwgMjsKLQlpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKSB7CisJZmliaC0+c29mZnNldCA9IGZpYmgtPmVvZmZzZXQgPSBmX3BvcyAmIChkaXItPmlfc2ItPnNfYmxvY2tzaXplIC0gMSk7CisJZGluZm8gPSBVREZfSShkaXIpOworCWlmIChkaW5mby0+aV9hbGxvY190eXBlID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikKIAkJZmliaC0+c2JoID0gZmliaC0+ZWJoID0gTlVMTDsKLQl9IGVsc2UgaWYgKGlub2RlX2JtYXAoZGlyLCBmX3BvcyA+PiAoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gMiksCi0JCQkgICAgICAmZXBvcywgJmVsb2MsICZlbGVuLCAmb2Zmc2V0KSA9PSAoRVhUX1JFQ09SREVEX0FMTE9DQVRFRCA+PiAzMCkpIHsKKwllbHNlIGlmIChpbm9kZV9ibWFwKGRpciwgZl9wb3MgPj4gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzLAorCQkJICAgICAgJmVwb3MsICZlbG9jLCAmZWxlbiwgJm9mZnNldCkgPT0KKwkJCQkJKEVYVF9SRUNPUkRFRF9BTExPQ0FURUQgPj4gMzApKSB7CiAJCWJsb2NrID0gdWRmX2dldF9sYl9wYmxvY2soZGlyLT5pX3NiLCBlbG9jLCBvZmZzZXQpOwogCQlpZiAoKCsrb2Zmc2V0IDw8IGRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cykgPCBlbGVuKSB7Ci0JCQlpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfU0hPUlQpCisJCQlpZiAoZGluZm8tPmlfYWxsb2NfdHlwZSA9PSBJQ0JUQUdfRkxBR19BRF9TSE9SVCkKIAkJCQllcG9zLm9mZnNldCAtPSBzaXplb2Yoc2hvcnRfYWQpOwotCQkJZWxzZSBpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfTE9ORykKKwkJCWVsc2UgaWYgKGRpbmZvLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfTE9ORykKIAkJCQllcG9zLm9mZnNldCAtPSBzaXplb2YobG9uZ19hZCk7Ci0JCX0gZWxzZSB7CisJCX0gZWxzZQogCQkJb2Zmc2V0ID0gMDsKLQkJfQogCi0JCWlmICghKGZpYmgtPnNiaCA9IGZpYmgtPmViaCA9IHVkZl90cmVhZChkaXItPmlfc2IsIGJsb2NrKSkpIHsKKwkJZmliaC0+c2JoID0gZmliaC0+ZWJoID0gdWRmX3RyZWFkKGRpci0+aV9zYiwgYmxvY2spOworCQlpZiAoIWZpYmgtPnNiaCkgewogCQkJYnJlbHNlKGVwb3MuYmgpOwogCQkJKmVyciA9IC1FSU87CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCi0JCWJsb2NrID0gVURGX0lfTE9DQVRJT04oZGlyKS5sb2dpY2FsQmxvY2tOdW07Ci0KKwkJYmxvY2sgPSBkaW5mby0+aV9sb2NhdGlvbi5sb2dpY2FsQmxvY2tOdW07CiAJfSBlbHNlIHsKLQkJYmxvY2sgPSB1ZGZfZ2V0X2xiX3BibG9jayhkaXItPmlfc2IsIFVERl9JX0xPQ0FUSU9OKGRpciksIDApOworCQlibG9jayA9IHVkZl9nZXRfbGJfcGJsb2NrKGRpci0+aV9zYiwgZGluZm8tPmlfbG9jYXRpb24sIDApOwogCQlmaWJoLT5zYmggPSBmaWJoLT5lYmggPSBOVUxMOwogCQlmaWJoLT5zb2Zmc2V0ID0gZmliaC0+ZW9mZnNldCA9IHNiLT5zX2Jsb2Nrc2l6ZTsKIAkJZ290byBhZGQ7CiAJfQogCi0Jd2hpbGUgKChmX3BvcyA8IHNpemUpKSB7CisJd2hpbGUgKGZfcG9zIDwgc2l6ZSkgewogCQlmaSA9IHVkZl9maWxlaWRlbnRfcmVhZChkaXIsICZmX3BvcywgZmliaCwgY2ZpLCAmZXBvcywgJmVsb2MsCiAJCQkJCSZlbGVuLCAmb2Zmc2V0KTsKIApAQCAtNDA4LDMzICs0MTgsMzkgQEAKIAkJbGl1ID0gbGUxNl90b19jcHUoY2ZpLT5sZW5ndGhPZkltcFVzZSk7CiAJCWxmaSA9IGNmaS0+bGVuZ3RoRmlsZUlkZW50OwogCi0JCWlmIChmaWJoLT5zYmggPT0gZmliaC0+ZWJoKSB7CisJCWlmIChmaWJoLT5zYmggPT0gZmliaC0+ZWJoKQogCQkJbmFtZXB0ciA9IGZpLT5maWxlSWRlbnQgKyBsaXU7Ci0JCX0gZWxzZSB7CisJCWVsc2UgewogCQkJaW50IHBvZmZzZXQ7CS8qIFVucGFkZWQgZW5kaW5nIG9mZnNldCAqLwogCi0JCQlwb2Zmc2V0ID0gZmliaC0+c29mZnNldCArIHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYykgKyBsaXUgKyBsZmk7CisJCQlwb2Zmc2V0ID0gZmliaC0+c29mZnNldCArIHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYykgKworCQkJCQlsaXUgKyBsZmk7CiAKLQkJCWlmIChwb2Zmc2V0ID49IGxmaSkgewotCQkJCW5hbWVwdHIgPSAoY2hhciAqKShmaWJoLT5lYmgtPmJfZGF0YSArIHBvZmZzZXQgLSBsZmkpOwotCQkJfSBlbHNlIHsKKwkJCWlmIChwb2Zmc2V0ID49IGxmaSkKKwkJCQluYW1lcHRyID0gKGNoYXIgKikoZmliaC0+ZWJoLT5iX2RhdGEgKworCQkJCQkJICAgcG9mZnNldCAtIGxmaSk7CisJCQllbHNlIHsKIAkJCQluYW1lcHRyID0gZm5hbWU7Ci0JCQkJbWVtY3B5KG5hbWVwdHIsIGZpLT5maWxlSWRlbnQgKyBsaXUsIGxmaSAtIHBvZmZzZXQpOwotCQkJCW1lbWNweShuYW1lcHRyICsgbGZpIC0gcG9mZnNldCwgZmliaC0+ZWJoLT5iX2RhdGEsIHBvZmZzZXQpOworCQkJCW1lbWNweShuYW1lcHRyLCBmaS0+ZmlsZUlkZW50ICsgbGl1LAorCQkJCQlsZmkgLSBwb2Zmc2V0KTsKKwkJCQltZW1jcHkobmFtZXB0ciArIGxmaSAtIHBvZmZzZXQsCisJCQkJCWZpYmgtPmViaC0+Yl9kYXRhLCBwb2Zmc2V0KTsKIAkJCX0KIAkJfQogCiAJCWlmICgoY2ZpLT5maWxlQ2hhcmFjdGVyaXN0aWNzICYgRklEX0ZJTEVfQ0hBUl9ERUxFVEVEKSAhPSAwKSB7Ci0JCQlpZiAoKChzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpICsgbGl1ICsgbGZpICsgMykgJiB+MykgPT0gbmZpZGxlbikgeworCQkJaWYgKCgoc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKSArCisJCQkJCWxpdSArIGxmaSArIDMpICYgfjMpID09IG5maWRsZW4pIHsKIAkJCQlicmVsc2UoZXBvcy5iaCk7CiAJCQkJY2ZpLT5kZXNjVGFnLnRhZ1NlcmlhbE51bSA9IGNwdV90b19sZTE2KDEpOwogCQkJCWNmaS0+ZmlsZVZlcnNpb25OdW0gPSBjcHVfdG9fbGUxNigxKTsKIAkJCQljZmktPmZpbGVDaGFyYWN0ZXJpc3RpY3MgPSAwOwogCQkJCWNmaS0+bGVuZ3RoRmlsZUlkZW50ID0gbmFtZWxlbjsKIAkJCQljZmktPmxlbmd0aE9mSW1wVXNlID0gY3B1X3RvX2xlMTYoMCk7Ci0JCQkJaWYgKCF1ZGZfd3JpdGVfZmkoZGlyLCBjZmksIGZpLCBmaWJoLCBOVUxMLCBuYW1lKSkgeworCQkJCWlmICghdWRmX3dyaXRlX2ZpKGRpciwgY2ZpLCBmaSwgZmliaCwgTlVMTCwKKwkJCQkJCSAgbmFtZSkpCiAJCQkJCXJldHVybiBmaTsKLQkJCQl9IGVsc2UgeworCQkJCWVsc2UgewogCQkJCQkqZXJyID0gLUVJTzsKIAkJCQkJcmV0dXJuIE5VTEw7CiAJCQkJfQpAQCAtNDQ0LDggKzQ2MCw5IEBACiAJCWlmICghbGZpIHx8ICFkZW50cnkpCiAJCQljb250aW51ZTsKIAotCQlpZiAoKGZsZW4gPSB1ZGZfZ2V0X2ZpbGVuYW1lKGRpci0+aV9zYiwgbmFtZXB0ciwgZm5hbWUsIGxmaSkpICYmCi0JCSAgICB1ZGZfbWF0Y2goZmxlbiwgZm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwgZGVudHJ5LT5kX25hbWUubmFtZSkpIHsKKwkJZmxlbiA9IHVkZl9nZXRfZmlsZW5hbWUoZGlyLT5pX3NiLCBuYW1lcHRyLCBmbmFtZSwgbGZpKTsKKwkJaWYgKGZsZW4gJiYgdWRmX21hdGNoKGZsZW4sIGZuYW1lLCBkZW50cnktPmRfbmFtZS5sZW4sCisJCQkJICAgICAgZGVudHJ5LT5kX25hbWUubmFtZSkpIHsKIAkJCWlmIChmaWJoLT5zYmggIT0gZmliaC0+ZWJoKQogCQkJCWJyZWxzZShmaWJoLT5lYmgpOwogCQkJYnJlbHNlKGZpYmgtPnNiaCk7CkBAIC00NTYsMjkgKzQ3MywzNCBAQAogCX0KIAogYWRkOgorCWlmIChkaW5mby0+aV9hbGxvY190eXBlICE9IElDQlRBR19GTEFHX0FEX0lOX0lDQikgeworCQllbGVuID0gKGVsZW4gKyBzYi0+c19ibG9ja3NpemUgLSAxKSAmIH4oc2ItPnNfYmxvY2tzaXplIC0gMSk7CisJCWlmIChkaW5mby0+aV9hbGxvY190eXBlID09IElDQlRBR19GTEFHX0FEX1NIT1JUKQorCQkJZXBvcy5vZmZzZXQgLT0gc2l6ZW9mKHNob3J0X2FkKTsKKwkJZWxzZSBpZiAoZGluZm8tPmlfYWxsb2NfdHlwZSA9PSBJQ0JUQUdfRkxBR19BRF9MT05HKQorCQkJZXBvcy5vZmZzZXQgLT0gc2l6ZW9mKGxvbmdfYWQpOworCQl1ZGZfd3JpdGVfYWV4dChkaXIsICZlcG9zLCBlbG9jLCBlbGVuLCAxKTsKKwl9CiAJZl9wb3MgKz0gbmZpZGxlbjsKIAotCWlmIChVREZfSV9BTExPQ1RZUEUoZGlyKSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IgJiYKKwlpZiAoZGluZm8tPmlfYWxsb2NfdHlwZSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IgJiYKIAkgICAgc2ItPnNfYmxvY2tzaXplIC0gZmliaC0+ZW9mZnNldCA8IG5maWRsZW4pIHsKIAkJYnJlbHNlKGVwb3MuYmgpOwogCQllcG9zLmJoID0gTlVMTDsKIAkJZmliaC0+c29mZnNldCAtPSB1ZGZfZXh0MF9vZmZzZXQoZGlyKTsKIAkJZmliaC0+ZW9mZnNldCAtPSB1ZGZfZXh0MF9vZmZzZXQoZGlyKTsKLQkJZl9wb3MgLT0gKHVkZl9leHQwX29mZnNldChkaXIpID4+IDIpOworCQlmX3BvcyAtPSB1ZGZfZXh0MF9vZmZzZXQoZGlyKTsKIAkJaWYgKGZpYmgtPnNiaCAhPSBmaWJoLT5lYmgpCiAJCQlicmVsc2UoZmliaC0+ZWJoKTsKIAkJYnJlbHNlKGZpYmgtPnNiaCk7Ci0JCWlmICghKGZpYmgtPnNiaCA9IGZpYmgtPmViaCA9IHVkZl9leHBhbmRfZGlyX2FkaW5pY2IoZGlyLCAmYmxvY2ssIGVycikpKQorCQlmaWJoLT5zYmggPSBmaWJoLT5lYmggPQorCQkJCXVkZl9leHBhbmRfZGlyX2FkaW5pY2IoZGlyLCAmYmxvY2ssIGVycik7CisJCWlmICghZmliaC0+c2JoKQogCQkJcmV0dXJuIE5VTEw7Ci0JCWVwb3MuYmxvY2sgPSBVREZfSV9MT0NBVElPTihkaXIpOwotCQllbG9jLmxvZ2ljYWxCbG9ja051bSA9IGJsb2NrOwotCQllbG9jLnBhcnRpdGlvblJlZmVyZW5jZU51bSA9IFVERl9JX0xPQ0FUSU9OKGRpcikucGFydGl0aW9uUmVmZXJlbmNlTnVtOwotCQllbGVuID0gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwkJZXBvcy5ibG9jayA9IGRpbmZvLT5pX2xvY2F0aW9uOwogCQllcG9zLm9mZnNldCA9IHVkZl9maWxlX2VudHJ5X2FsbG9jX29mZnNldChkaXIpOwotCQlpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfU0hPUlQpCi0JCQllcG9zLm9mZnNldCArPSBzaXplb2Yoc2hvcnRfYWQpOwotCQllbHNlIGlmIChVREZfSV9BTExPQ1RZUEUoZGlyKSA9PSBJQ0JUQUdfRkxBR19BRF9MT05HKQotCQkJZXBvcy5vZmZzZXQgKz0gc2l6ZW9mKGxvbmdfYWQpOworCQkvKiBMb2FkIGV4dGVudCB1ZGZfZXhwYW5kX2Rpcl9hZGluaWNiKCkgaGFzIGNyZWF0ZWQgKi8KKwkJdWRmX2N1cnJlbnRfYWV4dChkaXIsICZlcG9zLCAmZWxvYywgJmVsZW4sIDEpOwogCX0KIAogCWlmIChzYi0+c19ibG9ja3NpemUgLSBmaWJoLT5lb2Zmc2V0ID49IG5maWRsZW4pIHsKQEAgLTQ4OSwxNSArNTExLDE5IEBACiAJCQlmaWJoLT5zYmggPSBmaWJoLT5lYmg7CiAJCX0KIAotCQlpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKSB7Ci0JCQlibG9jayA9IFVERl9JX0xPQ0FUSU9OKGRpcikubG9naWNhbEJsb2NrTnVtOwotCQkJZmkgPSAoc3RydWN0IGZpbGVJZGVudERlc2MgKikoVURGX0lfREFUQShkaXIpICsgZmliaC0+c29mZnNldCAtCi0JCQkJCQkgICAgICB1ZGZfZXh0MF9vZmZzZXQoZGlyKSArCi0JCQkJCQkgICAgICBVREZfSV9MRU5FQVRUUihkaXIpKTsKKwkJaWYgKGRpbmZvLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKSB7CisJCQlibG9jayA9IGRpbmZvLT5pX2xvY2F0aW9uLmxvZ2ljYWxCbG9ja051bTsKKwkJCWZpID0gKHN0cnVjdCBmaWxlSWRlbnREZXNjICopCisJCQkJCShkaW5mby0+aV9leHQuaV9kYXRhICsKKwkJCQkJIGZpYmgtPnNvZmZzZXQgLQorCQkJCQkgdWRmX2V4dDBfb2Zmc2V0KGRpcikgKworCQkJCQkgZGluZm8tPmlfbGVuRUF0dHIpOwogCQl9IGVsc2UgewotCQkJYmxvY2sgPSBlbG9jLmxvZ2ljYWxCbG9ja051bSArICgoZWxlbiAtIDEpID4+Ci0JCQkJCQkJZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKLQkJCWZpID0gKHN0cnVjdCBmaWxlSWRlbnREZXNjICopKGZpYmgtPnNiaC0+Yl9kYXRhICsgZmliaC0+c29mZnNldCk7CisJCQlibG9jayA9IGVsb2MubG9naWNhbEJsb2NrTnVtICsKKwkJCQkJKChlbGVuIC0gMSkgPj4KKwkJCQkJCWRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7CisJCQlmaSA9IChzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqKQorCQkJCShmaWJoLT5zYmgtPmJfZGF0YSArIGZpYmgtPnNvZmZzZXQpOwogCQl9CiAJfSBlbHNlIHsKIAkJZmliaC0+c29mZnNldCA9IGZpYmgtPmVvZmZzZXQgLSBzYi0+c19ibG9ja3NpemU7CkBAIC01MDksNyArNTM1LDggQEAKIAogCQlibG9jayA9IGVsb2MubG9naWNhbEJsb2NrTnVtICsgKChlbGVuIC0gMSkgPj4KIAkJCQkJCWRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7Ci0JCWZpYmgtPmViaCA9IHVkZl9icmVhZChkaXIsIGZfcG9zID4+IChkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSAyKSwgMSwgZXJyKTsKKwkJZmliaC0+ZWJoID0gdWRmX2JyZWFkKGRpciwKKwkJCQlmX3BvcyA+PiBkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMsIDEsIGVycik7CiAJCWlmICghZmliaC0+ZWJoKSB7CiAJCQlicmVsc2UoZXBvcy5iaCk7CiAJCQlicmVsc2UoZmliaC0+c2JoKTsKQEAgLTUyMSwzMiArNTQ4LDM0IEBACiAJCQkgICAgKEVYVF9SRUNPUkRFRF9BTExPQ0FURUQgPj4gMzApKSB7CiAJCQkJYmxvY2sgPSBlbG9jLmxvZ2ljYWxCbG9ja051bSArICgoZWxlbiAtIDEpID4+CiAJCQkJCWRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7Ci0JCQl9IGVsc2UgeworCQkJfSBlbHNlCiAJCQkJYmxvY2srKzsKLQkJCX0KIAogCQkJYnJlbHNlKGZpYmgtPnNiaCk7CiAJCQlmaWJoLT5zYmggPSBmaWJoLT5lYmg7CiAJCQlmaSA9IChzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqKShmaWJoLT5zYmgtPmJfZGF0YSk7CiAJCX0gZWxzZSB7CiAJCQlmaSA9IChzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqKQotCQkJCShmaWJoLT5zYmgtPmJfZGF0YSArIHNiLT5zX2Jsb2Nrc2l6ZSArIGZpYmgtPnNvZmZzZXQpOworCQkJCShmaWJoLT5zYmgtPmJfZGF0YSArIHNiLT5zX2Jsb2Nrc2l6ZSArCisJCQkJCWZpYmgtPnNvZmZzZXQpOwogCQl9CiAJfQogCiAJbWVtc2V0KGNmaSwgMCwgc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKSk7Ci0JaWYgKFVERl9TQl9VREZSRVYoc2IpID49IDB4MDIwMCkKLQkJdWRmX25ld190YWcoKGNoYXIgKiljZmksIFRBR19JREVOVF9GSUQsIDMsIDEsIGJsb2NrLCBzaXplb2YodGFnKSk7CisJaWYgKFVERl9TQihzYiktPnNfdWRmcmV2ID49IDB4MDIwMCkKKwkJdWRmX25ld190YWcoKGNoYXIgKiljZmksIFRBR19JREVOVF9GSUQsIDMsIDEsIGJsb2NrLAorCQkJICAgIHNpemVvZih0YWcpKTsKIAllbHNlCi0JCXVkZl9uZXdfdGFnKChjaGFyICopY2ZpLCBUQUdfSURFTlRfRklELCAyLCAxLCBibG9jaywgc2l6ZW9mKHRhZykpOworCQl1ZGZfbmV3X3RhZygoY2hhciAqKWNmaSwgVEFHX0lERU5UX0ZJRCwgMiwgMSwgYmxvY2ssCisJCQkgICAgc2l6ZW9mKHRhZykpOwogCWNmaS0+ZmlsZVZlcnNpb25OdW0gPSBjcHVfdG9fbGUxNigxKTsKIAljZmktPmxlbmd0aEZpbGVJZGVudCA9IG5hbWVsZW47CiAJY2ZpLT5sZW5ndGhPZkltcFVzZSA9IGNwdV90b19sZTE2KDApOwogCWlmICghdWRmX3dyaXRlX2ZpKGRpciwgY2ZpLCBmaSwgZmliaCwgTlVMTCwgbmFtZSkpIHsKIAkJYnJlbHNlKGVwb3MuYmgpOwogCQlkaXItPmlfc2l6ZSArPSBuZmlkbGVuOwotCQlpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKQotCQkJVURGX0lfTEVOQUxMT0MoZGlyKSArPSBuZmlkbGVuOworCQlpZiAoZGluZm8tPmlfYWxsb2NfdHlwZSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpCisJCQlkaW5mby0+aV9sZW5BbGxvYyArPSBuZmlkbGVuOwogCQltYXJrX2lub2RlX2RpcnR5KGRpcik7CiAJCXJldHVybiBmaTsKIAl9IGVsc2UgewpAQCAtNTc4LDYgKzYwNyw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgZmlsZUlkZW50RGVzYyBjZmksICpmaTsKIAlpbnQgZXJyOworCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqaWluZm87CiAKIAlsb2NrX2tlcm5lbCgpOwogCWlub2RlID0gdWRmX25ld19pbm9kZShkaXIsIG1vZGUsICZlcnIpOwpAQCAtNTg2LDcgKzYxNiw4IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0JaWYgKFVERl9JX0FMTE9DVFlQRShpbm9kZSkgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKQorCWlpbmZvID0gVURGX0koaW5vZGUpOworCWlmIChpaW5mby0+aV9hbGxvY190eXBlID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikKIAkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZ1ZGZfYWRpbmljYl9hb3BzOwogCWVsc2UKIAkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZ1ZGZfYW9wczsKQEAgLTU5NSw3ICs2MjYsOCBAQAogCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCi0JaWYgKCEoZmkgPSB1ZGZfYWRkX2VudHJ5KGRpciwgZGVudHJ5LCAmZmliaCwgJmNmaSwgJmVycikpKSB7CisJZmkgPSB1ZGZfYWRkX2VudHJ5KGRpciwgZGVudHJ5LCAmZmliaCwgJmNmaSwgJmVycik7CisJaWYgKCFmaSkgewogCQlpbm9kZS0+aV9ubGluay0tOwogCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAkJaXB1dChpbm9kZSk7CkBAIC02MDMsMTMgKzYzNSwxMiBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAljZmkuaWNiLmV4dExlbmd0aCA9IGNwdV90b19sZTMyKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7Ci0JY2ZpLmljYi5leHRMb2NhdGlvbiA9IGNwdV90b19sZWxiKFVERl9JX0xPQ0FUSU9OKGlub2RlKSk7CisJY2ZpLmljYi5leHRMb2NhdGlvbiA9IGNwdV90b19sZWxiKGlpbmZvLT5pX2xvY2F0aW9uKTsKIAkqKF9fbGUzMiAqKSgoc3RydWN0IGFsbG9jRGVzY0ltcFVzZSAqKWNmaS5pY2IuaW1wVXNlKS0+aW1wVXNlID0KLQkJY3B1X3RvX2xlMzIoVURGX0lfVU5JUVVFKGlub2RlKSAmIDB4MDAwMDAwMDBGRkZGRkZGRlVMKTsKKwkJY3B1X3RvX2xlMzIoaWluZm8tPmlfdW5pcXVlICYgMHgwMDAwMDAwMEZGRkZGRkZGVUwpOwogCXVkZl93cml0ZV9maShkaXIsICZjZmksIGZpLCAmZmliaCwgTlVMTCwgTlVMTCk7Ci0JaWYgKFVERl9JX0FMTE9DVFlQRShkaXIpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikgeworCWlmIChVREZfSShkaXIpLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKQogCQltYXJrX2lub2RlX2RpcnR5KGRpcik7Ci0JfQogCWlmIChmaWJoLnNiaCAhPSBmaWJoLmViaCkKIAkJYnJlbHNlKGZpYmguZWJoKTsKIAlicmVsc2UoZmliaC5zYmgpOwpAQCAtNjI2LDYgKzY1Nyw3IEBACiAJc3RydWN0IHVkZl9maWxlaWRlbnRfYmggZmliaDsKIAlzdHJ1Y3QgZmlsZUlkZW50RGVzYyBjZmksICpmaTsKIAlpbnQgZXJyOworCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqaWluZm87CiAKIAlpZiAoIW9sZF92YWxpZF9kZXYocmRldikpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNjM2LDkgKzY2OCwxMSBAQAogCWlmICghaW5vZGUpCiAJCWdvdG8gb3V0OwogCisJaWluZm8gPSBVREZfSShpbm9kZSk7CiAJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CiAJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBtb2RlLCByZGV2KTsKLQlpZiAoIShmaSA9IHVkZl9hZGRfZW50cnkoZGlyLCBkZW50cnksICZmaWJoLCAmY2ZpLCAmZXJyKSkpIHsKKwlmaSA9IHVkZl9hZGRfZW50cnkoZGlyLCBkZW50cnksICZmaWJoLCAmY2ZpLCAmZXJyKTsKKwlpZiAoIWZpKSB7CiAJCWlub2RlLT5pX25saW5rLS07CiAJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCQlpcHV0KGlub2RlKTsKQEAgLTY0NiwxMyArNjgwLDEyIEBACiAJCXJldHVybiBlcnI7CiAJfQogCWNmaS5pY2IuZXh0TGVuZ3RoID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKLQljZmkuaWNiLmV4dExvY2F0aW9uID0gY3B1X3RvX2xlbGIoVURGX0lfTE9DQVRJT04oaW5vZGUpKTsKKwljZmkuaWNiLmV4dExvY2F0aW9uID0gY3B1X3RvX2xlbGIoaWluZm8tPmlfbG9jYXRpb24pOwogCSooX19sZTMyICopKChzdHJ1Y3QgYWxsb2NEZXNjSW1wVXNlICopY2ZpLmljYi5pbXBVc2UpLT5pbXBVc2UgPQotCQljcHVfdG9fbGUzMihVREZfSV9VTklRVUUoaW5vZGUpICYgMHgwMDAwMDAwMEZGRkZGRkZGVUwpOworCQljcHVfdG9fbGUzMihpaW5mby0+aV91bmlxdWUgJiAweDAwMDAwMDAwRkZGRkZGRkZVTCk7CiAJdWRmX3dyaXRlX2ZpKGRpciwgJmNmaSwgZmksICZmaWJoLCBOVUxMLCBOVUxMKTsKLQlpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKSB7CisJaWYgKFVERl9JKGRpciktPmlfYWxsb2NfdHlwZSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpCiAJCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKLQl9CiAJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAKIAlpZiAoZmliaC5zYmggIT0gZmliaC5lYmgpCkBAIC02NzIsNiArNzA1LDggQEAKIAlzdHJ1Y3QgdWRmX2ZpbGVpZGVudF9iaCBmaWJoOwogCXN0cnVjdCBmaWxlSWRlbnREZXNjIGNmaSwgKmZpOwogCWludCBlcnI7CisJc3RydWN0IHVkZl9pbm9kZV9pbmZvICpkaW5mbyA9IFVERl9JKGRpcik7CisJc3RydWN0IHVkZl9pbm9kZV9pbmZvICppaW5mbzsKIAogCWxvY2tfa2VybmVsKCk7CiAJZXJyID0gLUVNTElOSzsKQEAgLTY4Myw5ICs3MTgsMTEgQEAKIAlpZiAoIWlub2RlKQogCQlnb3RvIG91dDsKIAorCWlpbmZvID0gVURGX0koaW5vZGUpOwogCWlub2RlLT5pX29wID0gJnVkZl9kaXJfaW5vZGVfb3BlcmF0aW9uczsKIAlpbm9kZS0+aV9mb3AgPSAmdWRmX2Rpcl9vcGVyYXRpb25zOwotCWlmICghKGZpID0gdWRmX2FkZF9lbnRyeShpbm9kZSwgTlVMTCwgJmZpYmgsICZjZmksICZlcnIpKSkgeworCWZpID0gdWRmX2FkZF9lbnRyeShpbm9kZSwgTlVMTCwgJmZpYmgsICZjZmksICZlcnIpOworCWlmICghZmkpIHsKIAkJaW5vZGUtPmlfbmxpbmstLTsKIAkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJCWlwdXQoaW5vZGUpOwpAQCAtNjkzLDEwICs3MzAsMTEgQEAKIAl9CiAJaW5vZGUtPmlfbmxpbmsgPSAyOwogCWNmaS5pY2IuZXh0TGVuZ3RoID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKLQljZmkuaWNiLmV4dExvY2F0aW9uID0gY3B1X3RvX2xlbGIoVURGX0lfTE9DQVRJT04oZGlyKSk7CisJY2ZpLmljYi5leHRMb2NhdGlvbiA9IGNwdV90b19sZWxiKGRpbmZvLT5pX2xvY2F0aW9uKTsKIAkqKF9fbGUzMiAqKSgoc3RydWN0IGFsbG9jRGVzY0ltcFVzZSAqKWNmaS5pY2IuaW1wVXNlKS0+aW1wVXNlID0KLQkJY3B1X3RvX2xlMzIoVURGX0lfVU5JUVVFKGRpcikgJiAweDAwMDAwMDAwRkZGRkZGRkZVTCk7Ci0JY2ZpLmZpbGVDaGFyYWN0ZXJpc3RpY3MgPSBGSURfRklMRV9DSEFSX0RJUkVDVE9SWSB8IEZJRF9GSUxFX0NIQVJfUEFSRU5UOworCQljcHVfdG9fbGUzMihkaW5mby0+aV91bmlxdWUgJiAweDAwMDAwMDAwRkZGRkZGRkZVTCk7CisJY2ZpLmZpbGVDaGFyYWN0ZXJpc3RpY3MgPQorCQkJRklEX0ZJTEVfQ0hBUl9ESVJFQ1RPUlkgfCBGSURfRklMRV9DSEFSX1BBUkVOVDsKIAl1ZGZfd3JpdGVfZmkoaW5vZGUsICZjZmksIGZpLCAmZmliaCwgTlVMTCwgTlVMTCk7CiAJYnJlbHNlKGZpYmguc2JoKTsKIAlpbm9kZS0+aV9tb2RlID0gU19JRkRJUiB8IG1vZGU7CkBAIC03MDQsMTYgKzc0MiwxNyBAQAogCQlpbm9kZS0+aV9tb2RlIHw9IFNfSVNHSUQ7CiAJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAKLQlpZiAoIShmaSA9IHVkZl9hZGRfZW50cnkoZGlyLCBkZW50cnksICZmaWJoLCAmY2ZpLCAmZXJyKSkpIHsKKwlmaSA9IHVkZl9hZGRfZW50cnkoZGlyLCBkZW50cnksICZmaWJoLCAmY2ZpLCAmZXJyKTsKKwlpZiAoIWZpKSB7CiAJCWlub2RlLT5pX25saW5rID0gMDsKIAkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJCWlwdXQoaW5vZGUpOwogCQlnb3RvIG91dDsKIAl9CiAJY2ZpLmljYi5leHRMZW5ndGggPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOwotCWNmaS5pY2IuZXh0TG9jYXRpb24gPSBjcHVfdG9fbGVsYihVREZfSV9MT0NBVElPTihpbm9kZSkpOworCWNmaS5pY2IuZXh0TG9jYXRpb24gPSBjcHVfdG9fbGVsYihpaW5mby0+aV9sb2NhdGlvbik7CiAJKihfX2xlMzIgKikoKHN0cnVjdCBhbGxvY0Rlc2NJbXBVc2UgKiljZmkuaWNiLmltcFVzZSktPmltcFVzZSA9Ci0JCWNwdV90b19sZTMyKFVERl9JX1VOSVFVRShpbm9kZSkgJiAweDAwMDAwMDAwRkZGRkZGRkZVTCk7CisJCWNwdV90b19sZTMyKGlpbmZvLT5pX3VuaXF1ZSAmIDB4MDAwMDAwMDBGRkZGRkZGRlVMKTsKIAljZmkuZmlsZUNoYXJhY3RlcmlzdGljcyB8PSBGSURfRklMRV9DSEFSX0RJUkVDVE9SWTsKIAl1ZGZfd3JpdGVfZmkoZGlyLCAmY2ZpLCBmaSwgJmZpYmgsIE5VTEwsIE5VTEwpOwogCWluY19ubGluayhkaXIpOwpAQCAtNzM0LDMyICs3NzMsMzMgQEAKIAlzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqZmksIGNmaTsKIAlzdHJ1Y3QgdWRmX2ZpbGVpZGVudF9iaCBmaWJoOwogCWxvZmZfdCBmX3BvczsKLQlsb2ZmX3Qgc2l6ZSA9ICh1ZGZfZXh0MF9vZmZzZXQoZGlyKSArIGRpci0+aV9zaXplKSA+PiAyOworCWxvZmZfdCBzaXplID0gdWRmX2V4dDBfb2Zmc2V0KGRpcikgKyBkaXItPmlfc2l6ZTsKIAlpbnQgYmxvY2s7CiAJa2VybmVsX2xiX2FkZHIgZWxvYzsKIAl1aW50MzJfdCBlbGVuOwogCXNlY3Rvcl90IG9mZnNldDsKIAlzdHJ1Y3QgZXh0ZW50X3Bvc2l0aW9uIGVwb3MgPSB7fTsKKwlzdHJ1Y3QgdWRmX2lub2RlX2luZm8gKmRpbmZvID0gVURGX0koZGlyKTsKIAotCWZfcG9zID0gKHVkZl9leHQwX29mZnNldChkaXIpID4+IDIpOworCWZfcG9zID0gdWRmX2V4dDBfb2Zmc2V0KGRpcik7CisJZmliaC5zb2Zmc2V0ID0gZmliaC5lb2Zmc2V0ID0gZl9wb3MgJiAoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpOwogCi0JZmliaC5zb2Zmc2V0ID0gZmliaC5lb2Zmc2V0ID0gKGZfcG9zICYgKChkaXItPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkgPj4gMikpIDw8IDI7Ci0KLQlpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKSB7CisJaWYgKGRpbmZvLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKQogCQlmaWJoLnNiaCA9IGZpYmguZWJoID0gTlVMTDsKLQl9IGVsc2UgaWYgKGlub2RlX2JtYXAoZGlyLCBmX3BvcyA+PiAoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gMiksCi0JCQkgICAgICAmZXBvcywgJmVsb2MsICZlbGVuLCAmb2Zmc2V0KSA9PSAoRVhUX1JFQ09SREVEX0FMTE9DQVRFRCA+PiAzMCkpIHsKKwllbHNlIGlmIChpbm9kZV9ibWFwKGRpciwgZl9wb3MgPj4gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzLAorCQkJICAgICAgJmVwb3MsICZlbG9jLCAmZWxlbiwgJm9mZnNldCkgPT0KKwkJCQkJKEVYVF9SRUNPUkRFRF9BTExPQ0FURUQgPj4gMzApKSB7CiAJCWJsb2NrID0gdWRmX2dldF9sYl9wYmxvY2soZGlyLT5pX3NiLCBlbG9jLCBvZmZzZXQpOwogCQlpZiAoKCsrb2Zmc2V0IDw8IGRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cykgPCBlbGVuKSB7Ci0JCQlpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfU0hPUlQpCisJCQlpZiAoZGluZm8tPmlfYWxsb2NfdHlwZSA9PSBJQ0JUQUdfRkxBR19BRF9TSE9SVCkKIAkJCQllcG9zLm9mZnNldCAtPSBzaXplb2Yoc2hvcnRfYWQpOwotCQkJZWxzZSBpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfTE9ORykKKwkJCWVsc2UgaWYgKGRpbmZvLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfTE9ORykKIAkJCQllcG9zLm9mZnNldCAtPSBzaXplb2YobG9uZ19hZCk7Ci0JCX0gZWxzZSB7CisJCX0gZWxzZQogCQkJb2Zmc2V0ID0gMDsKLQkJfQogCi0JCWlmICghKGZpYmguc2JoID0gZmliaC5lYmggPSB1ZGZfdHJlYWQoZGlyLT5pX3NiLCBibG9jaykpKSB7CisJCWZpYmguc2JoID0gZmliaC5lYmggPSB1ZGZfdHJlYWQoZGlyLT5pX3NiLCBibG9jayk7CisJCWlmICghZmliaC5zYmgpIHsKIAkJCWJyZWxzZShlcG9zLmJoKTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC03NjgsNyArODA4LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0Jd2hpbGUgKChmX3BvcyA8IHNpemUpKSB7CisJd2hpbGUgKGZfcG9zIDwgc2l6ZSkgewogCQlmaSA9IHVkZl9maWxlaWRlbnRfcmVhZChkaXIsICZmX3BvcywgJmZpYmgsICZjZmksICZlcG9zLCAmZWxvYywKIAkJCQkJJmVsZW4sICZvZmZzZXQpOwogCQlpZiAoIWZpKSB7CkBAIC04MjgsNyArODY4LDggQEAKIAljbGVhcl9ubGluayhpbm9kZSk7CiAJaW5vZGUtPmlfc2l6ZSA9IDA7CiAJaW5vZGVfZGVjX2xpbmtfY291bnQoZGlyKTsKLQlpbm9kZS0+aV9jdGltZSA9IGRpci0+aV9jdGltZSA9IGRpci0+aV9tdGltZSA9IGN1cnJlbnRfZnNfdGltZShkaXItPmlfc2IpOworCWlub2RlLT5pX2N0aW1lID0gZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0KKwkJCQkJCWN1cnJlbnRfZnNfdGltZShkaXItPmlfc2IpOwogCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKIAogZW5kX3JtZGlyOgpAQCAtOTAxLDM2ICs5NDIsNDIgQEAKIAlpbnQgYmxvY2s7CiAJY2hhciBuYW1lW1VERl9OQU1FX0xFTl07CiAJaW50IG5hbWVsZW47CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgdWRmX2lub2RlX2luZm8gKmlpbmZvOwogCiAJbG9ja19rZXJuZWwoKTsKLQlpZiAoIShpbm9kZSA9IHVkZl9uZXdfaW5vZGUoZGlyLCBTX0lGTE5LLCAmZXJyKSkpCisJaW5vZGUgPSB1ZGZfbmV3X2lub2RlKGRpciwgU19JRkxOSywgJmVycik7CisJaWYgKCFpbm9kZSkKIAkJZ290byBvdXQ7CiAKKwlpaW5mbyA9IFVERl9JKGlub2RlKTsKIAlpbm9kZS0+aV9tb2RlID0gU19JRkxOSyB8IFNfSVJXWFVHTzsKIAlpbm9kZS0+aV9kYXRhLmFfb3BzID0gJnVkZl9zeW1saW5rX2FvcHM7CiAJaW5vZGUtPmlfb3AgPSAmcGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CiAKLQlpZiAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSAhPSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpIHsKKwlpZiAoaWluZm8tPmlfYWxsb2NfdHlwZSAhPSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpIHsKIAkJa2VybmVsX2xiX2FkZHIgZWxvYzsKIAkJdWludDMyX3QgZWxlbjsKIAogCQlibG9jayA9IHVkZl9uZXdfYmxvY2soaW5vZGUtPmlfc2IsIGlub2RlLAotCQkJCSAgICAgIFVERl9JX0xPQ0FUSU9OKGlub2RlKS5wYXJ0aXRpb25SZWZlcmVuY2VOdW0sCi0JCQkJICAgICAgVURGX0lfTE9DQVRJT04oaW5vZGUpLmxvZ2ljYWxCbG9ja051bSwgJmVycik7CisJCQkJaWluZm8tPmlfbG9jYXRpb24ucGFydGl0aW9uUmVmZXJlbmNlTnVtLAorCQkJCWlpbmZvLT5pX2xvY2F0aW9uLmxvZ2ljYWxCbG9ja051bSwgJmVycik7CiAJCWlmICghYmxvY2spCiAJCQlnb3RvIG91dF9ub19lbnRyeTsKLQkJZXBvcy5ibG9jayA9IFVERl9JX0xPQ0FUSU9OKGlub2RlKTsKKwkJZXBvcy5ibG9jayA9IGlpbmZvLT5pX2xvY2F0aW9uOwogCQllcG9zLm9mZnNldCA9IHVkZl9maWxlX2VudHJ5X2FsbG9jX29mZnNldChpbm9kZSk7CiAJCWVwb3MuYmggPSBOVUxMOwogCQllbG9jLmxvZ2ljYWxCbG9ja051bSA9IGJsb2NrOwotCQllbG9jLnBhcnRpdGlvblJlZmVyZW5jZU51bSA9IFVERl9JX0xPQ0FUSU9OKGlub2RlKS5wYXJ0aXRpb25SZWZlcmVuY2VOdW07CisJCWVsb2MucGFydGl0aW9uUmVmZXJlbmNlTnVtID0KKwkJCQlpaW5mby0+aV9sb2NhdGlvbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW07CiAJCWVsZW4gPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7Ci0JCVVERl9JX0xFTkVYVEVOVFMoaW5vZGUpID0gZWxlbjsKKwkJaWluZm8tPmlfbGVuRXh0ZW50cyA9IGVsZW47CiAJCXVkZl9hZGRfYWV4dChpbm9kZSwgJmVwb3MsIGVsb2MsIGVsZW4sIDApOwogCQlicmVsc2UoZXBvcy5iaCk7CiAKIAkJYmxvY2sgPSB1ZGZfZ2V0X3BibG9jayhpbm9kZS0+aV9zYiwgYmxvY2ssCi0JCQkJICAgICAgIFVERl9JX0xPQ0FUSU9OKGlub2RlKS5wYXJ0aXRpb25SZWZlcmVuY2VOdW0sIDApOworCQkJCWlpbmZvLT5pX2xvY2F0aW9uLnBhcnRpdGlvblJlZmVyZW5jZU51bSwKKwkJCQkwKTsKIAkJZXBvcy5iaCA9IHVkZl90cmVhZChpbm9kZS0+aV9zYiwgYmxvY2spOwogCQlsb2NrX2J1ZmZlcihlcG9zLmJoKTsKIAkJbWVtc2V0KGVwb3MuYmgtPmJfZGF0YSwgMHgwMCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKQEAgLTkzOCw5ICs5ODUsOCBAQAogCQl1bmxvY2tfYnVmZmVyKGVwb3MuYmgpOwogCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShlcG9zLmJoLCBpbm9kZSk7CiAJCWVhID0gZXBvcy5iaC0+Yl9kYXRhICsgdWRmX2V4dDBfb2Zmc2V0KGlub2RlKTsKLQl9IGVsc2UgewotCQllYSA9IFVERl9JX0RBVEEoaW5vZGUpICsgVURGX0lfTEVORUFUVFIoaW5vZGUpOwotCX0KKwl9IGVsc2UKKwkJZWEgPSBpaW5mby0+aV9leHQuaV9kYXRhICsgaWluZm8tPmlfbGVuRUF0dHI7CiAKIAllb2Zmc2V0ID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gdWRmX2V4dDBfb2Zmc2V0KGlub2RlKTsKIAlwYyA9IChzdHJ1Y3QgcGF0aENvbXBvbmVudCAqKWVhOwpAQCAtOTc3LDcgKzEwMjMsOCBAQAogCQlpZiAoY29tcHN0YXJ0WzBdID09ICcuJykgewogCQkJaWYgKChzeW1uYW1lIC0gY29tcHN0YXJ0KSA9PSAxKQogCQkJCXBjLT5jb21wb25lbnRUeXBlID0gNDsKLQkJCWVsc2UgaWYgKChzeW1uYW1lIC0gY29tcHN0YXJ0KSA9PSAyICYmIGNvbXBzdGFydFsxXSA9PSAnLicpCisJCQllbHNlIGlmICgoc3ltbmFtZSAtIGNvbXBzdGFydCkgPT0gMiAmJgorCQkJCQljb21wc3RhcnRbMV0gPT0gJy4nKQogCQkJCXBjLT5jb21wb25lbnRUeXBlID0gMzsKIAkJfQogCkBAIC05ODcsNyArMTAzNCw4IEBACiAJCQlpZiAoIW5hbWVsZW4pCiAJCQkJZ290byBvdXRfbm9fZW50cnk7CiAKLQkJCWlmIChlbGVuICsgc2l6ZW9mKHN0cnVjdCBwYXRoQ29tcG9uZW50KSArIG5hbWVsZW4gPiBlb2Zmc2V0KQorCQkJaWYgKGVsZW4gKyBzaXplb2Yoc3RydWN0IHBhdGhDb21wb25lbnQpICsgbmFtZWxlbiA+CisJCQkJCWVvZmZzZXQpCiAJCQkJZ290byBvdXRfbm9fZW50cnk7CiAJCQllbHNlCiAJCQkJcGMtPmxlbmd0aENvbXBvbmVudElkZW50ID0gbmFtZWxlbjsKQEAgLTEwMDYsMzAgKzEwNTQsMzQgQEAKIAogCWJyZWxzZShlcG9zLmJoKTsKIAlpbm9kZS0+aV9zaXplID0gZWxlbjsKLQlpZiAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpCi0JCVVERl9JX0xFTkFMTE9DKGlub2RlKSA9IGlub2RlLT5pX3NpemU7CisJaWYgKGlpbmZvLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKQorCQlpaW5mby0+aV9sZW5BbGxvYyA9IGlub2RlLT5pX3NpemU7CiAJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAKLQlpZiAoIShmaSA9IHVkZl9hZGRfZW50cnkoZGlyLCBkZW50cnksICZmaWJoLCAmY2ZpLCAmZXJyKSkpCisJZmkgPSB1ZGZfYWRkX2VudHJ5KGRpciwgZGVudHJ5LCAmZmliaCwgJmNmaSwgJmVycik7CisJaWYgKCFmaSkKIAkJZ290byBvdXRfbm9fZW50cnk7CiAJY2ZpLmljYi5leHRMZW5ndGggPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOwotCWNmaS5pY2IuZXh0TG9jYXRpb24gPSBjcHVfdG9fbGVsYihVREZfSV9MT0NBVElPTihpbm9kZSkpOwotCWlmIChVREZfU0JfTFZJREJIKGlub2RlLT5pX3NiKSkgeworCWNmaS5pY2IuZXh0TG9jYXRpb24gPSBjcHVfdG9fbGVsYihpaW5mby0+aV9sb2NhdGlvbik7CisJYmggPSBVREZfU0IoaW5vZGUtPmlfc2IpLT5zX2x2aWRfYmg7CisJaWYgKGJoKSB7CisJCXN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzYyAqbHZpZCA9CisJCQkJKHN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzYyAqKWJoLT5iX2RhdGE7CiAJCXN0cnVjdCBsb2dpY2FsVm9sSGVhZGVyRGVzYyAqbHZoZDsKIAkJdWludDY0X3QgdW5pcXVlSUQ7Ci0JCWx2aGQgPSAoc3RydWN0IGxvZ2ljYWxWb2xIZWFkZXJEZXNjICopKFVERl9TQl9MVklEKGlub2RlLT5pX3NiKS0+bG9naWNhbFZvbENvbnRlbnRzVXNlKTsKKwkJbHZoZCA9IChzdHJ1Y3QgbG9naWNhbFZvbEhlYWRlckRlc2MgKikKKwkJCQlsdmlkLT5sb2dpY2FsVm9sQ29udGVudHNVc2U7CiAJCXVuaXF1ZUlEID0gbGU2NF90b19jcHUobHZoZC0+dW5pcXVlSUQpOwogCQkqKF9fbGUzMiAqKSgoc3RydWN0IGFsbG9jRGVzY0ltcFVzZSAqKWNmaS5pY2IuaW1wVXNlKS0+aW1wVXNlID0KIAkJCWNwdV90b19sZTMyKHVuaXF1ZUlEICYgMHgwMDAwMDAwMEZGRkZGRkZGVUwpOwogCQlpZiAoISgrK3VuaXF1ZUlEICYgMHgwMDAwMDAwMEZGRkZGRkZGVUwpKQogCQkJdW5pcXVlSUQgKz0gMTY7CiAJCWx2aGQtPnVuaXF1ZUlEID0gY3B1X3RvX2xlNjQodW5pcXVlSUQpOwotCQltYXJrX2J1ZmZlcl9kaXJ0eShVREZfU0JfTFZJREJIKGlub2RlLT5pX3NiKSk7CisJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKIAl9CiAJdWRmX3dyaXRlX2ZpKGRpciwgJmNmaSwgZmksICZmaWJoLCBOVUxMLCBOVUxMKTsKLQlpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKSB7CisJaWYgKFVERl9JKGRpciktPmlfYWxsb2NfdHlwZSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpCiAJCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKLQl9CiAJaWYgKGZpYmguc2JoICE9IGZpYmguZWJoKQogCQlicmVsc2UoZmliaC5lYmgpOwogCWJyZWxzZShmaWJoLnNiaCk7CkBAIC0xMDUzLDYgKzExMDUsNyBAQAogCXN0cnVjdCB1ZGZfZmlsZWlkZW50X2JoIGZpYmg7CiAJc3RydWN0IGZpbGVJZGVudERlc2MgY2ZpLCAqZmk7CiAJaW50IGVycjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCiAJbG9ja19rZXJuZWwoKTsKIAlpZiAoaW5vZGUtPmlfbmxpbmsgPj0gKDI1NiA8PCBzaXplb2YoaW5vZGUtPmlfbmxpbmspKSAtIDEpIHsKQEAgLTEwNjAsMjggKzExMTMsMzIgQEAKIAkJcmV0dXJuIC1FTUxJTks7CiAJfQogCi0JaWYgKCEoZmkgPSB1ZGZfYWRkX2VudHJ5KGRpciwgZGVudHJ5LCAmZmliaCwgJmNmaSwgJmVycikpKSB7CisJZmkgPSB1ZGZfYWRkX2VudHJ5KGRpciwgZGVudHJ5LCAmZmliaCwgJmNmaSwgJmVycik7CisJaWYgKCFmaSkgewogCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiBlcnI7CiAJfQogCWNmaS5pY2IuZXh0TGVuZ3RoID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKLQljZmkuaWNiLmV4dExvY2F0aW9uID0gY3B1X3RvX2xlbGIoVURGX0lfTE9DQVRJT04oaW5vZGUpKTsKLQlpZiAoVURGX1NCX0xWSURCSChpbm9kZS0+aV9zYikpIHsKKwljZmkuaWNiLmV4dExvY2F0aW9uID0gY3B1X3RvX2xlbGIoVURGX0koaW5vZGUpLT5pX2xvY2F0aW9uKTsKKwliaCA9IFVERl9TQihpbm9kZS0+aV9zYiktPnNfbHZpZF9iaDsKKwlpZiAoYmgpIHsKKwkJc3RydWN0IGxvZ2ljYWxWb2xJbnRlZ3JpdHlEZXNjICpsdmlkID0KKwkJCQkoc3RydWN0IGxvZ2ljYWxWb2xJbnRlZ3JpdHlEZXNjICopYmgtPmJfZGF0YTsKIAkJc3RydWN0IGxvZ2ljYWxWb2xIZWFkZXJEZXNjICpsdmhkOwogCQl1aW50NjRfdCB1bmlxdWVJRDsKLQkJbHZoZCA9IChzdHJ1Y3QgbG9naWNhbFZvbEhlYWRlckRlc2MgKikoVURGX1NCX0xWSUQoaW5vZGUtPmlfc2IpLT5sb2dpY2FsVm9sQ29udGVudHNVc2UpOworCQlsdmhkID0gKHN0cnVjdCBsb2dpY2FsVm9sSGVhZGVyRGVzYyAqKQorCQkJCShsdmlkLT5sb2dpY2FsVm9sQ29udGVudHNVc2UpOwogCQl1bmlxdWVJRCA9IGxlNjRfdG9fY3B1KGx2aGQtPnVuaXF1ZUlEKTsKIAkJKihfX2xlMzIgKikoKHN0cnVjdCBhbGxvY0Rlc2NJbXBVc2UgKiljZmkuaWNiLmltcFVzZSktPmltcFVzZSA9CiAJCQljcHVfdG9fbGUzMih1bmlxdWVJRCAmIDB4MDAwMDAwMDBGRkZGRkZGRlVMKTsKIAkJaWYgKCEoKyt1bmlxdWVJRCAmIDB4MDAwMDAwMDBGRkZGRkZGRlVMKSkKIAkJCXVuaXF1ZUlEICs9IDE2OwogCQlsdmhkLT51bmlxdWVJRCA9IGNwdV90b19sZTY0KHVuaXF1ZUlEKTsKLQkJbWFya19idWZmZXJfZGlydHkoVURGX1NCX0xWSURCSChpbm9kZS0+aV9zYikpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CiAJfQogCXVkZl93cml0ZV9maShkaXIsICZjZmksIGZpLCAmZmliaCwgTlVMTCwgTlVMTCk7Ci0JaWYgKFVERl9JX0FMTE9DVFlQRShkaXIpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikgeworCWlmIChVREZfSShkaXIpLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKQogCQltYXJrX2lub2RlX2RpcnR5KGRpcik7Ci0JfQogCiAJaWYgKGZpYmguc2JoICE9IGZpYmguZWJoKQogCQlicmVsc2UoZmliaC5lYmgpOwpAQCAtMTEwNSwxMyArMTE2MiwxNiBAQAogCXN0cnVjdCBpbm9kZSAqb2xkX2lub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgaW5vZGUgKm5ld19pbm9kZSA9IG5ld19kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHVkZl9maWxlaWRlbnRfYmggb2ZpYmgsIG5maWJoOwotCXN0cnVjdCBmaWxlSWRlbnREZXNjICpvZmkgPSBOVUxMLCAqbmZpID0gTlVMTCwgKmRpcl9maSA9IE5VTEwsIG9jZmksIG5jZmk7CisJc3RydWN0IGZpbGVJZGVudERlc2MgKm9maSA9IE5VTEwsICpuZmkgPSBOVUxMLCAqZGlyX2ZpID0gTlVMTDsKKwlzdHJ1Y3QgZmlsZUlkZW50RGVzYyBvY2ZpLCBuY2ZpOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqZGlyX2JoID0gTlVMTDsKIAlpbnQgcmV0dmFsID0gLUVOT0VOVDsKIAlrZXJuZWxfbGJfYWRkciB0bG9jOworCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqb2xkX2lpbmZvID0gVURGX0kob2xkX2lub2RlKTsKIAogCWxvY2tfa2VybmVsKCk7Ci0JaWYgKChvZmkgPSB1ZGZfZmluZF9lbnRyeShvbGRfZGlyLCBvbGRfZGVudHJ5LCAmb2ZpYmgsICZvY2ZpKSkpIHsKKwlvZmkgPSB1ZGZfZmluZF9lbnRyeShvbGRfZGlyLCBvbGRfZGVudHJ5LCAmb2ZpYmgsICZvY2ZpKTsKKwlpZiAob2ZpKSB7CiAJCWlmIChvZmliaC5zYmggIT0gb2ZpYmguZWJoKQogCQkJYnJlbHNlKG9maWJoLmViaCk7CiAJCWJyZWxzZShvZmliaC5zYmgpOwpAQCAtMTEzMSw3ICsxMTkxLDcgQEAKIAkJfQogCX0KIAlpZiAoU19JU0RJUihvbGRfaW5vZGUtPmlfbW9kZSkpIHsKLQkJdWludDMyX3Qgb2Zmc2V0ID0gdWRmX2V4dDBfb2Zmc2V0KG9sZF9pbm9kZSk7CisJCWludCBvZmZzZXQgPSB1ZGZfZXh0MF9vZmZzZXQob2xkX2lub2RlKTsKIAogCQlpZiAobmV3X2lub2RlKSB7CiAJCQlyZXR2YWwgPSAtRU5PVEVNUFRZOwpAQCAtMTEzOSwzMCArMTE5OSwzNiBAQAogCQkJCWdvdG8gZW5kX3JlbmFtZTsKIAkJfQogCQlyZXR2YWwgPSAtRUlPOwotCQlpZiAoVURGX0lfQUxMT0NUWVBFKG9sZF9pbm9kZSkgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKSB7Ci0JCQlkaXJfZmkgPSB1ZGZfZ2V0X2ZpbGVpZGVudChVREZfSV9EQVRBKG9sZF9pbm9kZSkgLQotCQkJCQkJICAgKFVERl9JX0VGRShvbGRfaW5vZGUpID8KLQkJCQkJCSAgICBzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSA6Ci0JCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBmaWxlRW50cnkpKSwKLQkJCQkJCSAgIG9sZF9pbm9kZS0+aV9zYi0+c19ibG9ja3NpemUsICZvZmZzZXQpOworCQlpZiAob2xkX2lpbmZvLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKSB7CisJCQlkaXJfZmkgPSB1ZGZfZ2V0X2ZpbGVpZGVudCgKKwkJCQkJb2xkX2lpbmZvLT5pX2V4dC5pX2RhdGEgLQorCQkJCQkgIChvbGRfaWluZm8tPmlfZWZlID8KKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEZpbGVFbnRyeSkgOgorCQkJCQkgICBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSkpLAorCQkJCQlvbGRfaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplLCAmb2Zmc2V0KTsKIAkJfSBlbHNlIHsKIAkJCWRpcl9iaCA9IHVkZl9icmVhZChvbGRfaW5vZGUsIDAsIDAsICZyZXR2YWwpOwogCQkJaWYgKCFkaXJfYmgpCiAJCQkJZ290byBlbmRfcmVuYW1lOwotCQkJZGlyX2ZpID0gdWRmX2dldF9maWxlaWRlbnQoZGlyX2JoLT5iX2RhdGEsIG9sZF9pbm9kZS0+aV9zYi0+c19ibG9ja3NpemUsICZvZmZzZXQpOworCQkJZGlyX2ZpID0gdWRmX2dldF9maWxlaWRlbnQoZGlyX2JoLT5iX2RhdGEsCisJCQkJCW9sZF9pbm9kZS0+aV9zYi0+c19ibG9ja3NpemUsICZvZmZzZXQpOwogCQl9CiAJCWlmICghZGlyX2ZpKQogCQkJZ290byBlbmRfcmVuYW1lOwogCQl0bG9jID0gbGVsYl90b19jcHUoZGlyX2ZpLT5pY2IuZXh0TG9jYXRpb24pOwotCQlpZiAodWRmX2dldF9sYl9wYmxvY2sob2xkX2lub2RlLT5pX3NiLCB0bG9jLCAwKSAhPSBvbGRfZGlyLT5pX2lubykKKwkJaWYgKHVkZl9nZXRfbGJfcGJsb2NrKG9sZF9pbm9kZS0+aV9zYiwgdGxvYywgMCkgIT0KKwkJCQlvbGRfZGlyLT5pX2lubykKIAkJCWdvdG8gZW5kX3JlbmFtZTsKIAogCQlyZXR2YWwgPSAtRU1MSU5LOwotCQlpZiAoIW5ld19pbm9kZSAmJiBuZXdfZGlyLT5pX25saW5rID49ICgyNTYgPDwgc2l6ZW9mKG5ld19kaXItPmlfbmxpbmspKSAtIDEpCisJCWlmICghbmV3X2lub2RlICYmCisJCQluZXdfZGlyLT5pX25saW5rID49CisJCQkJKDI1NiA8PCBzaXplb2YobmV3X2Rpci0+aV9ubGluaykpIC0gMSkKIAkJCWdvdG8gZW5kX3JlbmFtZTsKIAl9CiAJaWYgKCFuZmkpIHsKLQkJbmZpID0gdWRmX2FkZF9lbnRyeShuZXdfZGlyLCBuZXdfZGVudHJ5LCAmbmZpYmgsICZuY2ZpLCAmcmV0dmFsKTsKKwkJbmZpID0gdWRmX2FkZF9lbnRyeShuZXdfZGlyLCBuZXdfZGVudHJ5LCAmbmZpYmgsICZuY2ZpLAorCQkJCSAgICAmcmV0dmFsKTsKIAkJaWYgKCFuZmkpCiAJCQlnb3RvIGVuZF9yZW5hbWU7CiAJfQpAQCAtMTE5NCwxOCArMTI2MCwxOSBAQAogCW1hcmtfaW5vZGVfZGlydHkob2xkX2Rpcik7CiAKIAlpZiAoZGlyX2ZpKSB7Ci0JCWRpcl9maS0+aWNiLmV4dExvY2F0aW9uID0gY3B1X3RvX2xlbGIoVURGX0lfTE9DQVRJT04obmV3X2RpcikpOwotCQl1ZGZfdXBkYXRlX3RhZygoY2hhciAqKWRpcl9maSwgKHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYykgKwotCQkJCQkJbGUxNl90b19jcHUoZGlyX2ZpLT5sZW5ndGhPZkltcFVzZSkgKyAzKSAmIH4zKTsKLQkJaWYgKFVERl9JX0FMTE9DVFlQRShvbGRfaW5vZGUpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikgeworCQlkaXJfZmktPmljYi5leHRMb2NhdGlvbiA9IGNwdV90b19sZWxiKFVERl9JKG5ld19kaXIpLT5pX2xvY2F0aW9uKTsKKwkJdWRmX3VwZGF0ZV90YWcoKGNoYXIgKilkaXJfZmksCisJCQkJKHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYykgKworCQkJCWxlMTZfdG9fY3B1KGRpcl9maS0+bGVuZ3RoT2ZJbXBVc2UpICsgMykgJiB+Myk7CisJCWlmIChvbGRfaWluZm8tPmlfYWxsb2NfdHlwZSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpCiAJCQltYXJrX2lub2RlX2RpcnR5KG9sZF9pbm9kZSk7Ci0JCX0gZWxzZSB7CisJCWVsc2UKIAkJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKGRpcl9iaCwgb2xkX2lub2RlKTsKLQkJfQorCiAJCWlub2RlX2RlY19saW5rX2NvdW50KG9sZF9kaXIpOwotCQlpZiAobmV3X2lub2RlKSB7CisJCWlmIChuZXdfaW5vZGUpCiAJCQlpbm9kZV9kZWNfbGlua19jb3VudChuZXdfaW5vZGUpOwotCQl9IGVsc2UgeworCQllbHNlIHsKIAkJCWluY19ubGluayhuZXdfZGlyKTsKIAkJCW1hcmtfaW5vZGVfZGlydHkobmV3X2Rpcik7CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL3VkZi9wYXJ0aXRpb24uYyBiL2ZzL3VkZi9wYXJ0aXRpb24uYwppbmRleCBhYWFiMjRjLi5mYzUzMzM0IDEwMDY0NAotLS0gYS9mcy91ZGYvcGFydGl0aW9uLmMKKysrIGIvZnMvdWRmL3BhcnRpdGlvbi5jCkBAIC0zMSwxNSArMzEsMTggQEAKIGlubGluZSB1aW50MzJfdCB1ZGZfZ2V0X3BibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1aW50MzJfdCBibG9jaywKIAkJCSAgICAgICB1aW50MTZfdCBwYXJ0aXRpb24sIHVpbnQzMl90IG9mZnNldCkKIHsKLQlpZiAocGFydGl0aW9uID49IFVERl9TQl9OVU1QQVJUUyhzYikpIHsKLQkJdWRmX2RlYnVnKCJibG9jaz0lZCwgcGFydGl0aW9uPSVkLCBvZmZzZXQ9JWQ6IGludmFsaWQgcGFydGl0aW9uXG4iLAotCQkJICBibG9jaywgcGFydGl0aW9uLCBvZmZzZXQpOworCXN0cnVjdCB1ZGZfc2JfaW5mbyAqc2JpID0gVURGX1NCKHNiKTsKKwlzdHJ1Y3QgdWRmX3BhcnRfbWFwICptYXA7CisJaWYgKHBhcnRpdGlvbiA+PSBzYmktPnNfcGFydGl0aW9ucykgeworCQl1ZGZfZGVidWcoImJsb2NrPSVkLCBwYXJ0aXRpb249JWQsIG9mZnNldD0lZDogIgorCQkJICAiaW52YWxpZCBwYXJ0aXRpb25cbiIsIGJsb2NrLCBwYXJ0aXRpb24sIG9mZnNldCk7CiAJCXJldHVybiAweEZGRkZGRkZGOwogCX0KLQlpZiAoVURGX1NCX1BBUlRGVU5DKHNiLCBwYXJ0aXRpb24pKQotCQlyZXR1cm4gVURGX1NCX1BBUlRGVU5DKHNiLCBwYXJ0aXRpb24pKHNiLCBibG9jaywgcGFydGl0aW9uLCBvZmZzZXQpOworCW1hcCA9ICZzYmktPnNfcGFydG1hcHNbcGFydGl0aW9uXTsKKwlpZiAobWFwLT5zX3BhcnRpdGlvbl9mdW5jKQorCQlyZXR1cm4gbWFwLT5zX3BhcnRpdGlvbl9mdW5jKHNiLCBibG9jaywgcGFydGl0aW9uLCBvZmZzZXQpOwogCWVsc2UKLQkJcmV0dXJuIFVERl9TQl9QQVJUUk9PVChzYiwgcGFydGl0aW9uKSArIGJsb2NrICsgb2Zmc2V0OworCQlyZXR1cm4gbWFwLT5zX3BhcnRpdGlvbl9yb290ICsgYmxvY2sgKyBvZmZzZXQ7CiB9CiAKIHVpbnQzMl90IHVkZl9nZXRfcGJsb2NrX3ZpcnQxNShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1aW50MzJfdCBibG9jaywKQEAgLTQ5LDEyICs1MiwxOCBAQAogCXVpbnQzMl90IG5ld2Jsb2NrOwogCXVpbnQzMl90IGluZGV4OwogCXVpbnQzMl90IGxvYzsKKwlzdHJ1Y3QgdWRmX3NiX2luZm8gKnNiaSA9IFVERl9TQihzYik7CisJc3RydWN0IHVkZl9wYXJ0X21hcCAqbWFwOworCXN0cnVjdCB1ZGZfdmlydHVhbF9kYXRhICp2ZGF0YTsKKwlzdHJ1Y3QgdWRmX2lub2RlX2luZm8gKmlpbmZvOwogCi0JaW5kZXggPSAoc2ItPnNfYmxvY2tzaXplIC0gVURGX1NCX1RZUEVWSVJUKHNiLHBhcnRpdGlvbikuc19zdGFydF9vZmZzZXQpIC8gc2l6ZW9mKHVpbnQzMl90KTsKKwltYXAgPSAmc2JpLT5zX3BhcnRtYXBzW3BhcnRpdGlvbl07CisJdmRhdGEgPSAmbWFwLT5zX3R5cGVfc3BlY2lmaWMuc192aXJ0dWFsOworCWluZGV4ID0gKHNiLT5zX2Jsb2Nrc2l6ZSAtIHZkYXRhLT5zX3N0YXJ0X29mZnNldCkgLyBzaXplb2YodWludDMyX3QpOwogCi0JaWYgKGJsb2NrID4gVURGX1NCX1RZUEVWSVJUKHNiLHBhcnRpdGlvbikuc19udW1fZW50cmllcykgewotCQl1ZGZfZGVidWcoIlRyeWluZyB0byBhY2Nlc3MgYmxvY2sgYmV5b25kIGVuZCBvZiBWQVQgKCVkIG1heCAlZClcbiIsCi0JCQkgIGJsb2NrLCBVREZfU0JfVFlQRVZJUlQoc2IscGFydGl0aW9uKS5zX251bV9lbnRyaWVzKTsKKwlpZiAoYmxvY2sgPiB2ZGF0YS0+c19udW1fZW50cmllcykgeworCQl1ZGZfZGVidWcoIlRyeWluZyB0byBhY2Nlc3MgYmxvY2sgYmV5b25kIGVuZCBvZiBWQVQgIgorCQkJICAiKCVkIG1heCAlZClcbiIsIGJsb2NrLCB2ZGF0YS0+c19udW1fZW50cmllcyk7CiAJCXJldHVybiAweEZGRkZGRkZGOwogCX0KIApAQCAtNjQsMTIgKzczLDEzIEBACiAJCWluZGV4ID0gYmxvY2sgJSAoc2ItPnNfYmxvY2tzaXplIC8gc2l6ZW9mKHVpbnQzMl90KSk7CiAJfSBlbHNlIHsKIAkJbmV3YmxvY2sgPSAwOwotCQlpbmRleCA9IFVERl9TQl9UWVBFVklSVChzYixwYXJ0aXRpb24pLnNfc3RhcnRfb2Zmc2V0IC8gc2l6ZW9mKHVpbnQzMl90KSArIGJsb2NrOworCQlpbmRleCA9IHZkYXRhLT5zX3N0YXJ0X29mZnNldCAvIHNpemVvZih1aW50MzJfdCkgKyBibG9jazsKIAl9CiAKLQlsb2MgPSB1ZGZfYmxvY2tfbWFwKFVERl9TQl9WQVQoc2IpLCBuZXdibG9jayk7CisJbG9jID0gdWRmX2Jsb2NrX21hcChzYmktPnNfdmF0X2lub2RlLCBuZXdibG9jayk7CiAKLQlpZiAoIShiaCA9IHNiX2JyZWFkKHNiLCBsb2MpKSkgeworCWJoID0gc2JfYnJlYWQoc2IsIGxvYyk7CisJaWYgKCFiaCkgewogCQl1ZGZfZGVidWcoImdldF9wYmxvY2soVURGX1ZJUlRVQUxfTUFQOiVwLCVkLCVkKSBWQVQ6ICVkWyVkXVxuIiwKIAkJCSAgc2IsIGJsb2NrLCBwYXJ0aXRpb24sIGxvYywgaW5kZXgpOwogCQlyZXR1cm4gMHhGRkZGRkZGRjsKQEAgLTc5LDUwICs4OSw2MSBAQAogCiAJYnJlbHNlKGJoKTsKIAotCWlmIChVREZfSV9MT0NBVElPTihVREZfU0JfVkFUKHNiKSkucGFydGl0aW9uUmVmZXJlbmNlTnVtID09IHBhcnRpdGlvbikgeworCWlpbmZvID0gVURGX0koc2JpLT5zX3ZhdF9pbm9kZSk7CisJaWYgKGlpbmZvLT5pX2xvY2F0aW9uLnBhcnRpdGlvblJlZmVyZW5jZU51bSA9PSBwYXJ0aXRpb24pIHsKIAkJdWRmX2RlYnVnKCJyZWN1cnNpdmUgY2FsbCB0byB1ZGZfZ2V0X3BibG9jayFcbiIpOwogCQlyZXR1cm4gMHhGRkZGRkZGRjsKIAl9CiAKIAlyZXR1cm4gdWRmX2dldF9wYmxvY2soc2IsIGxvYywKLQkJCSAgICAgIFVERl9JX0xPQ0FUSU9OKFVERl9TQl9WQVQoc2IpKS5wYXJ0aXRpb25SZWZlcmVuY2VOdW0sCisJCQkgICAgICBpaW5mby0+aV9sb2NhdGlvbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW0sCiAJCQkgICAgICBvZmZzZXQpOwogfQogCi1pbmxpbmUgdWludDMyX3QgdWRmX2dldF9wYmxvY2tfdmlydDIwKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCB1aW50MzJfdCBibG9jaywKK2lubGluZSB1aW50MzJfdCB1ZGZfZ2V0X3BibG9ja192aXJ0MjAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdWludDMyX3QgYmxvY2ssCiAJCQkJICAgICAgdWludDE2X3QgcGFydGl0aW9uLCB1aW50MzJfdCBvZmZzZXQpCiB7CiAJcmV0dXJuIHVkZl9nZXRfcGJsb2NrX3ZpcnQxNShzYiwgYmxvY2ssIHBhcnRpdGlvbiwgb2Zmc2V0KTsKIH0KIAotdWludDMyX3QgdWRmX2dldF9wYmxvY2tfc3BhcjE1KHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCB1aW50MzJfdCBibG9jaywKK3VpbnQzMl90IHVkZl9nZXRfcGJsb2NrX3NwYXIxNShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1aW50MzJfdCBibG9jaywKIAkJCSAgICAgICB1aW50MTZfdCBwYXJ0aXRpb24sIHVpbnQzMl90IG9mZnNldCkKIHsKIAlpbnQgaTsKIAlzdHJ1Y3Qgc3BhcmluZ1RhYmxlICpzdCA9IE5VTEw7Ci0JdWludDMyX3QgcGFja2V0ID0gKGJsb2NrICsgb2Zmc2V0KSAmIH4oVURGX1NCX1RZUEVTUEFSKHNiLHBhcnRpdGlvbikuc19wYWNrZXRfbGVuIC0gMSk7CisJc3RydWN0IHVkZl9zYl9pbmZvICpzYmkgPSBVREZfU0Ioc2IpOworCXN0cnVjdCB1ZGZfcGFydF9tYXAgKm1hcDsKKwl1aW50MzJfdCBwYWNrZXQ7CisJc3RydWN0IHVkZl9zcGFyaW5nX2RhdGEgKnNkYXRhOworCisJbWFwID0gJnNiaS0+c19wYXJ0bWFwc1twYXJ0aXRpb25dOworCXNkYXRhID0gJm1hcC0+c190eXBlX3NwZWNpZmljLnNfc3BhcmluZzsKKwlwYWNrZXQgPSAoYmxvY2sgKyBvZmZzZXQpICYgfihzZGF0YS0+c19wYWNrZXRfbGVuIC0gMSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCWlmIChVREZfU0JfVFlQRVNQQVIoc2IscGFydGl0aW9uKS5zX3NwYXJfbWFwW2ldICE9IE5VTEwpIHsKLQkJCXN0ID0gKHN0cnVjdCBzcGFyaW5nVGFibGUgKilVREZfU0JfVFlQRVNQQVIoc2IscGFydGl0aW9uKS5zX3NwYXJfbWFwW2ldLT5iX2RhdGE7CisJCWlmIChzZGF0YS0+c19zcGFyX21hcFtpXSAhPSBOVUxMKSB7CisJCQlzdCA9IChzdHJ1Y3Qgc3BhcmluZ1RhYmxlICopCisJCQkJCXNkYXRhLT5zX3NwYXJfbWFwW2ldLT5iX2RhdGE7CiAJCQlicmVhazsKIAkJfQogCX0KIAogCWlmIChzdCkgewogCQlmb3IgKGkgPSAwOyBpIDwgbGUxNl90b19jcHUoc3QtPnJlYWxsb2NhdGlvblRhYmxlTGVuKTsgaSsrKSB7Ci0JCQlpZiAobGUzMl90b19jcHUoc3QtPm1hcEVudHJ5W2ldLm9yaWdMb2NhdGlvbikgPj0gMHhGRkZGRkZGMCkgeworCQkJc3RydWN0IHNwYXJpbmdFbnRyeSAqZW50cnkgPSAmc3QtPm1hcEVudHJ5W2ldOworCQkJdTMyIG9yaWdMb2MgPSBsZTMyX3RvX2NwdShlbnRyeS0+b3JpZ0xvY2F0aW9uKTsKKwkJCWlmIChvcmlnTG9jID49IDB4RkZGRkZGRjApCiAJCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKGxlMzJfdG9fY3B1KHN0LT5tYXBFbnRyeVtpXS5vcmlnTG9jYXRpb24pID09IHBhY2tldCkgewotCQkJCXJldHVybiBsZTMyX3RvX2NwdShzdC0+bWFwRW50cnlbaV0ubWFwcGVkTG9jYXRpb24pICsKLQkJCQkJKChibG9jayArIG9mZnNldCkgJiAoVURGX1NCX1RZUEVTUEFSKHNiLHBhcnRpdGlvbikuc19wYWNrZXRfbGVuIC0gMSkpOwotCQkJfSBlbHNlIGlmIChsZTMyX3RvX2NwdShzdC0+bWFwRW50cnlbaV0ub3JpZ0xvY2F0aW9uKSA+IHBhY2tldCkgeworCQkJZWxzZSBpZiAob3JpZ0xvYyA9PSBwYWNrZXQpCisJCQkJcmV0dXJuIGxlMzJfdG9fY3B1KGVudHJ5LT5tYXBwZWRMb2NhdGlvbikgKworCQkJCQkoKGJsb2NrICsgb2Zmc2V0KSAmCisJCQkJCQkoc2RhdGEtPnNfcGFja2V0X2xlbiAtIDEpKTsKKwkJCWVsc2UgaWYgKG9yaWdMb2MgPiBwYWNrZXQpCiAJCQkJYnJlYWs7Ci0JCQl9CiAJCX0KIAl9CiAKLQlyZXR1cm4gVURGX1NCX1BBUlRST09UKHNiLHBhcnRpdGlvbikgKyBibG9jayArIG9mZnNldDsKKwlyZXR1cm4gbWFwLT5zX3BhcnRpdGlvbl9yb290ICsgYmxvY2sgKyBvZmZzZXQ7CiB9CiAKIGludCB1ZGZfcmVsb2NhdGVfYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGxvbmcgb2xkX2Jsb2NrLCBsb25nICpuZXdfYmxvY2spCkBAIC0xMzIsNjkgKzE1MywxMDkgQEAKIAlzdHJ1Y3Qgc3BhcmluZ0VudHJ5IG1hcEVudHJ5OwogCXVpbnQzMl90IHBhY2tldDsKIAlpbnQgaSwgaiwgaywgbDsKKwlzdHJ1Y3QgdWRmX3NiX2luZm8gKnNiaSA9IFVERl9TQihzYik7CisJdTE2IHJlYWxsb2NhdGlvblRhYmxlTGVuOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAKLQlmb3IgKGkgPSAwOyBpIDwgVURGX1NCX05VTVBBUlRTKHNiKTsgaSsrKSB7Ci0JCWlmIChvbGRfYmxvY2sgPiBVREZfU0JfUEFSVFJPT1Qoc2IsaSkgJiYKLQkJICAgIG9sZF9ibG9jayA8IFVERl9TQl9QQVJUUk9PVChzYixpKSArIFVERl9TQl9QQVJUTEVOKHNiLGkpKSB7Ci0JCQlzZGF0YSA9ICZVREZfU0JfVFlQRVNQQVIoc2IsaSk7Ci0JCQlwYWNrZXQgPSAob2xkX2Jsb2NrIC0gVURGX1NCX1BBUlRST09UKHNiLGkpKSAmIH4oc2RhdGEtPnNfcGFja2V0X2xlbiAtIDEpOworCWZvciAoaSA9IDA7IGkgPCBzYmktPnNfcGFydGl0aW9uczsgaSsrKSB7CisJCXN0cnVjdCB1ZGZfcGFydF9tYXAgKm1hcCA9ICZzYmktPnNfcGFydG1hcHNbaV07CisJCWlmIChvbGRfYmxvY2sgPiBtYXAtPnNfcGFydGl0aW9uX3Jvb3QgJiYKKwkJICAgIG9sZF9ibG9jayA8IG1hcC0+c19wYXJ0aXRpb25fcm9vdCArIG1hcC0+c19wYXJ0aXRpb25fbGVuKSB7CisJCQlzZGF0YSA9ICZtYXAtPnNfdHlwZV9zcGVjaWZpYy5zX3NwYXJpbmc7CisJCQlwYWNrZXQgPSAob2xkX2Jsb2NrIC0gbWFwLT5zX3BhcnRpdGlvbl9yb290KSAmCisJCQkJCQl+KHNkYXRhLT5zX3BhY2tldF9sZW4gLSAxKTsKIAotCQkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgewotCQkJCWlmIChVREZfU0JfVFlQRVNQQVIoc2IsaSkuc19zcGFyX21hcFtqXSAhPSBOVUxMKSB7Ci0JCQkJCXN0ID0gKHN0cnVjdCBzcGFyaW5nVGFibGUgKilzZGF0YS0+c19zcGFyX21hcFtqXS0+Yl9kYXRhOworCQkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKwkJCQlpZiAoc2RhdGEtPnNfc3Bhcl9tYXBbal0gIT0gTlVMTCkgeworCQkJCQlzdCA9IChzdHJ1Y3Qgc3BhcmluZ1RhYmxlICopCisJCQkJCQlzZGF0YS0+c19zcGFyX21hcFtqXS0+Yl9kYXRhOwogCQkJCQlicmVhazsKIAkJCQl9Ci0JCQl9CiAKIAkJCWlmICghc3QpCiAJCQkJcmV0dXJuIDE7CiAKLQkJCWZvciAoayA9IDA7IGsgPCBsZTE2X3RvX2NwdShzdC0+cmVhbGxvY2F0aW9uVGFibGVMZW4pOyBrKyspIHsKLQkJCQlpZiAobGUzMl90b19jcHUoc3QtPm1hcEVudHJ5W2tdLm9yaWdMb2NhdGlvbikgPT0gMHhGRkZGRkZGRikgeworCQkJcmVhbGxvY2F0aW9uVGFibGVMZW4gPQorCQkJCQlsZTE2X3RvX2NwdShzdC0+cmVhbGxvY2F0aW9uVGFibGVMZW4pOworCQkJZm9yIChrID0gMDsgayA8IHJlYWxsb2NhdGlvblRhYmxlTGVuOyBrKyspIHsKKwkJCQlzdHJ1Y3Qgc3BhcmluZ0VudHJ5ICplbnRyeSA9ICZzdC0+bWFwRW50cnlba107CisJCQkJdTMyIG9yaWdMb2MgPSBsZTMyX3RvX2NwdShlbnRyeS0+b3JpZ0xvY2F0aW9uKTsKKworCQkJCWlmIChvcmlnTG9jID09IDB4RkZGRkZGRkYpIHsKIAkJCQkJZm9yICg7IGogPCA0OyBqKyspIHsKLQkJCQkJCWlmIChzZGF0YS0+c19zcGFyX21hcFtqXSkgewotCQkJCQkJCXN0ID0gKHN0cnVjdCBzcGFyaW5nVGFibGUgKilzZGF0YS0+c19zcGFyX21hcFtqXS0+Yl9kYXRhOwotCQkJCQkJCXN0LT5tYXBFbnRyeVtrXS5vcmlnTG9jYXRpb24gPSBjcHVfdG9fbGUzMihwYWNrZXQpOwotCQkJCQkJCXVkZl91cGRhdGVfdGFnKChjaGFyICopc3QsIHNpemVvZihzdHJ1Y3Qgc3BhcmluZ1RhYmxlKSArIGxlMTZfdG9fY3B1KHN0LT5yZWFsbG9jYXRpb25UYWJsZUxlbikgKiBzaXplb2Yoc3RydWN0IHNwYXJpbmdFbnRyeSkpOwotCQkJCQkJCW1hcmtfYnVmZmVyX2RpcnR5KHNkYXRhLT5zX3NwYXJfbWFwW2pdKTsKLQkJCQkJCX0KKwkJCQkJCWludCBsZW47CisJCQkJCQliaCA9IHNkYXRhLT5zX3NwYXJfbWFwW2pdOworCQkJCQkJaWYgKCFiaCkKKwkJCQkJCQljb250aW51ZTsKKworCQkJCQkJc3QgPSAoc3RydWN0IHNwYXJpbmdUYWJsZSAqKQorCQkJCQkJCQliaC0+Yl9kYXRhOworCQkJCQkJZW50cnktPm9yaWdMb2NhdGlvbiA9CisJCQkJCQkJY3B1X3RvX2xlMzIocGFja2V0KTsKKwkJCQkJCWxlbiA9CisJCQkJCQkgIHNpemVvZihzdHJ1Y3Qgc3BhcmluZ1RhYmxlKSArCisJCQkJCQkgIHJlYWxsb2NhdGlvblRhYmxlTGVuICoKKwkJCQkJCSAgc2l6ZW9mKHN0cnVjdCBzcGFyaW5nRW50cnkpOworCQkJCQkJdWRmX3VwZGF0ZV90YWcoKGNoYXIgKilzdCwgbGVuKTsKKwkJCQkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKIAkJCQkJfQotCQkJCQkqbmV3X2Jsb2NrID0gbGUzMl90b19jcHUoc3QtPm1hcEVudHJ5W2tdLm1hcHBlZExvY2F0aW9uKSArCi0JCQkJCQkoKG9sZF9ibG9jayAtIFVERl9TQl9QQVJUUk9PVChzYixpKSkgJiAoc2RhdGEtPnNfcGFja2V0X2xlbiAtIDEpKTsKKwkJCQkJKm5ld19ibG9jayA9IGxlMzJfdG9fY3B1KAorCQkJCQkJCWVudHJ5LT5tYXBwZWRMb2NhdGlvbikgKworCQkJCQkJICAgICAoKG9sZF9ibG9jayAtCisJCQkJCQkJbWFwLT5zX3BhcnRpdGlvbl9yb290KSAmCisJCQkJCQkgICAgIChzZGF0YS0+c19wYWNrZXRfbGVuIC0gMSkpOwogCQkJCQlyZXR1cm4gMDsKLQkJCQl9IGVsc2UgaWYgKGxlMzJfdG9fY3B1KHN0LT5tYXBFbnRyeVtrXS5vcmlnTG9jYXRpb24pID09IHBhY2tldCkgewotCQkJCQkqbmV3X2Jsb2NrID0gbGUzMl90b19jcHUoc3QtPm1hcEVudHJ5W2tdLm1hcHBlZExvY2F0aW9uKSArCi0JCQkJCQkoKG9sZF9ibG9jayAtIFVERl9TQl9QQVJUUk9PVChzYixpKSkgJiAoc2RhdGEtPnNfcGFja2V0X2xlbiAtIDEpKTsKKwkJCQl9IGVsc2UgaWYgKG9yaWdMb2MgPT0gcGFja2V0KSB7CisJCQkJCSpuZXdfYmxvY2sgPSBsZTMyX3RvX2NwdSgKKwkJCQkJCQllbnRyeS0+bWFwcGVkTG9jYXRpb24pICsKKwkJCQkJCSAgICAgKChvbGRfYmxvY2sgLQorCQkJCQkJCW1hcC0+c19wYXJ0aXRpb25fcm9vdCkgJgorCQkJCQkJICAgICAoc2RhdGEtPnNfcGFja2V0X2xlbiAtIDEpKTsKIAkJCQkJcmV0dXJuIDA7Ci0JCQkJfSBlbHNlIGlmIChsZTMyX3RvX2NwdShzdC0+bWFwRW50cnlba10ub3JpZ0xvY2F0aW9uKSA+IHBhY2tldCkgeworCQkJCX0gZWxzZSBpZiAob3JpZ0xvYyA+IHBhY2tldCkKIAkJCQkJYnJlYWs7Ci0JCQkJfQogCQkJfQogCi0JCQlmb3IgKGwgPSBrOyBsIDwgbGUxNl90b19jcHUoc3QtPnJlYWxsb2NhdGlvblRhYmxlTGVuKTsgbCsrKSB7Ci0JCQkJaWYgKGxlMzJfdG9fY3B1KHN0LT5tYXBFbnRyeVtsXS5vcmlnTG9jYXRpb24pID09IDB4RkZGRkZGRkYpIHsKLQkJCQkJZm9yICg7IGogPCA0OyBqKyspIHsKLQkJCQkJCWlmIChzZGF0YS0+c19zcGFyX21hcFtqXSkgewotCQkJCQkJCXN0ID0gKHN0cnVjdCBzcGFyaW5nVGFibGUgKilzZGF0YS0+c19zcGFyX21hcFtqXS0+Yl9kYXRhOwotCQkJCQkJCW1hcEVudHJ5ID0gc3QtPm1hcEVudHJ5W2xdOwotCQkJCQkJCW1hcEVudHJ5Lm9yaWdMb2NhdGlvbiA9IGNwdV90b19sZTMyKHBhY2tldCk7Ci0JCQkJCQkJbWVtbW92ZSgmc3QtPm1hcEVudHJ5W2sgKyAxXSwgJnN0LT5tYXBFbnRyeVtrXSwgKGwgLSBrKSAqIHNpemVvZihzdHJ1Y3Qgc3BhcmluZ0VudHJ5KSk7Ci0JCQkJCQkJc3QtPm1hcEVudHJ5W2tdID0gbWFwRW50cnk7Ci0JCQkJCQkJdWRmX3VwZGF0ZV90YWcoKGNoYXIgKilzdCwgc2l6ZW9mKHN0cnVjdCBzcGFyaW5nVGFibGUpICsgbGUxNl90b19jcHUoc3QtPnJlYWxsb2NhdGlvblRhYmxlTGVuKSAqIHNpemVvZihzdHJ1Y3Qgc3BhcmluZ0VudHJ5KSk7Ci0JCQkJCQkJbWFya19idWZmZXJfZGlydHkoc2RhdGEtPnNfc3Bhcl9tYXBbal0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCSpuZXdfYmxvY2sgPSBsZTMyX3RvX2NwdShzdC0+bWFwRW50cnlba10ubWFwcGVkTG9jYXRpb24pICsKLQkJCQkJCSgob2xkX2Jsb2NrIC0gVURGX1NCX1BBUlRST09UKHNiLGkpKSAmIChzZGF0YS0+c19wYWNrZXRfbGVuIC0gMSkpOwotCQkJCQlyZXR1cm4gMDsKKwkJCWZvciAobCA9IGs7IGwgPCByZWFsbG9jYXRpb25UYWJsZUxlbjsgbCsrKSB7CisJCQkJc3RydWN0IHNwYXJpbmdFbnRyeSAqZW50cnkgPSAmc3QtPm1hcEVudHJ5W2xdOworCQkJCXUzMiBvcmlnTG9jID0gbGUzMl90b19jcHUoZW50cnktPm9yaWdMb2NhdGlvbik7CisKKwkJCQlpZiAob3JpZ0xvYyAhPSAweEZGRkZGRkZGKQorCQkJCQljb250aW51ZTsKKworCQkJCWZvciAoOyBqIDwgNDsgaisrKSB7CisJCQkJCWJoID0gc2RhdGEtPnNfc3Bhcl9tYXBbal07CisJCQkJCWlmICghYmgpCisJCQkJCQljb250aW51ZTsKKworCQkJCQlzdCA9IChzdHJ1Y3Qgc3BhcmluZ1RhYmxlICopYmgtPmJfZGF0YTsKKwkJCQkJbWFwRW50cnkgPSBzdC0+bWFwRW50cnlbbF07CisJCQkJCW1hcEVudHJ5Lm9yaWdMb2NhdGlvbiA9CisJCQkJCQkJY3B1X3RvX2xlMzIocGFja2V0KTsKKwkJCQkJbWVtbW92ZSgmc3QtPm1hcEVudHJ5W2sgKyAxXSwKKwkJCQkJCSZzdC0+bWFwRW50cnlba10sCisJCQkJCQkobCAtIGspICoKKwkJCQkJCXNpemVvZihzdHJ1Y3Qgc3BhcmluZ0VudHJ5KSk7CisJCQkJCXN0LT5tYXBFbnRyeVtrXSA9IG1hcEVudHJ5OworCQkJCQl1ZGZfdXBkYXRlX3RhZygoY2hhciAqKXN0LAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBzcGFyaW5nVGFibGUpICsKKwkJCQkJCXJlYWxsb2NhdGlvblRhYmxlTGVuICoKKwkJCQkJCXNpemVvZihzdHJ1Y3Qgc3BhcmluZ0VudHJ5KSk7CisJCQkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKIAkJCQl9CisJCQkJKm5ld19ibG9jayA9CisJCQkJCWxlMzJfdG9fY3B1KAorCQkJCQkgICAgICBzdC0+bWFwRW50cnlba10ubWFwcGVkTG9jYXRpb24pICsKKwkJCQkJKChvbGRfYmxvY2sgLSBtYXAtPnNfcGFydGl0aW9uX3Jvb3QpICYKKwkJCQkJIChzZGF0YS0+c19wYWNrZXRfbGVuIC0gMSkpOworCQkJCXJldHVybiAwOwogCQkJfQogCiAJCQlyZXR1cm4gMTsKIAkJfSAvKiBpZiBvbGRfYmxvY2sgKi8KIAl9CiAKLQlpZiAoaSA9PSBVREZfU0JfTlVNUEFSVFMoc2IpKSB7CisJaWYgKGkgPT0gc2JpLT5zX3BhcnRpdGlvbnMpIHsKIAkJLyogb3V0c2lkZSBvZiBwYXJ0aXRpb25zICovCiAJCS8qIGZvciBub3csIGZhaWwgPSkgKi8KIAkJcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9mcy91ZGYvc3VwZXIuYyBiL2ZzL3VkZi9zdXBlci5jCmluZGV4IDQzNjBjN2EuLmYzYWM0YWIgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9zdXBlci5jCisrKyBiL2ZzL3VkZi9zdXBlci5jCkBAIC0zMyw4ICszMyw4IEBACiAgKiAgMTAvMTcvOTggICAgICBhZGRlZCBmcmVlc3BhY2UgY291bnQgZm9yICJkZiIKICAqICAxMS8xMS85OCBnciAgIGFkZGVkIG5vdnJzIG9wdGlvbgogICogIDExLzI2Lzk4IGRnYiAgYWRkZWQgZmlsZXNldCxhbmNob3IgbW91bnQgb3B0aW9ucwotICogIDEyLzA2Lzk4IGJsZiAgcmVhbGx5IGhvc2VkIHRoaW5ncyByb3lhbGx5LiB2YXQvc3BhcmluZyBzdXBwb3J0LiBzZXF1ZW5jZWQgdm9sIGRlc2NzCi0gKiAgICAgICAgICAgICAgICByZXdyb3RlIG9wdGlvbiBoYW5kbGluZyBiYXNlZCBvbiBpc29mcworICogIDEyLzA2Lzk4IGJsZiAgcmVhbGx5IGhvc2VkIHRoaW5ncyByb3lhbGx5LiB2YXQvc3BhcmluZyBzdXBwb3J0LiBzZXF1ZW5jZWQKKyAqICAgICAgICAgICAgICAgIHZvbCBkZXNjcy4gcmV3cm90ZSBvcHRpb24gaGFuZGxpbmcgYmFzZWQgb24gaXNvZnMKICAqICAxMi8yMC85OCAgICAgIGZpbmQgdGhlIGZyZWUgc3BhY2UgYml0bWFwIChpZiBpdCBleGlzdHMpCiAgKi8KIApAQCAtNTIsNiArNTIsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3VkZl9mcy5oPgpAQCAtNzAsNiArNzMsOCBAQAogI2RlZmluZSBWRFNfUE9TX1RFUk1JTkFUSU5HX0RFU0MJNgogI2RlZmluZSBWRFNfUE9TX0xFTkdUSAkJCTcKIAorI2RlZmluZSBVREZfREVGQVVMVF9CTE9DS1NJWkUgMjA0OAorCiBzdGF0aWMgY2hhciBlcnJvcl9idWZbMTAyNF07CiAKIC8qIFRoZXNlIGFyZSB0aGUgIm1lYXQiIC0gZXZlcnl0aGluZyBlbHNlIGlzIHN0dWZmaW5nICovCkBAIC05NCw2ICs5OSwxNyBAQAogc3RhdGljIHZvaWQgdWRmX2Nsb3NlX2x2aWQoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogc3RhdGljIHVuc2lnbmVkIGludCB1ZGZfY291bnRfZnJlZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CiBzdGF0aWMgaW50IHVkZl9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKK3N0YXRpYyBpbnQgdWRmX3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKiwgc3RydWN0IHZmc21vdW50ICopOworCitzdHJ1Y3QgbG9naWNhbFZvbEludGVncml0eURlc2NJbXBVc2UgKnVkZl9zYl9sdmlkaXUoc3RydWN0IHVkZl9zYl9pbmZvICpzYmkpCit7CisJc3RydWN0IGxvZ2ljYWxWb2xJbnRlZ3JpdHlEZXNjICpsdmlkID0KKwkJKHN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzYyAqKXNiaS0+c19sdmlkX2JoLT5iX2RhdGE7CisJX191MzIgbnVtYmVyX29mX3BhcnRpdGlvbnMgPSBsZTMyX3RvX2NwdShsdmlkLT5udW1PZlBhcnRpdGlvbnMpOworCV9fdTMyIG9mZnNldCA9IG51bWJlcl9vZl9wYXJ0aXRpb25zICogMiAqCisJCQkJc2l6ZW9mKHVpbnQzMl90KS9zaXplb2YodWludDhfdCk7CisJcmV0dXJuIChzdHJ1Y3QgbG9naWNhbFZvbEludGVncml0eURlc2NJbXBVc2UgKikmKGx2aWQtPmltcFVzZVtvZmZzZXRdKTsKK30KIAogLyogVURGIGZpbGVzeXN0ZW0gdHlwZSAqLwogc3RhdGljIGludCB1ZGZfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLApAQCAtMTE2LDcgKzEzMiw3IEBACiBzdGF0aWMgc3RydWN0IGlub2RlICp1ZGZfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgdWRmX2lub2RlX2luZm8gKmVpOwotCWVpID0gKHN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqKWttZW1fY2FjaGVfYWxsb2ModWRmX2lub2RlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJZWkgPSBrbWVtX2NhY2hlX2FsbG9jKHVkZl9pbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmICghZWkpCiAJCXJldHVybiBOVUxMOwogCkBAIC0xNzAsNiArMTg2LDcgQEAKIAkud3JpdGVfc3VwZXIJPSB1ZGZfd3JpdGVfc3VwZXIsCiAJLnN0YXRmcwkJPSB1ZGZfc3RhdGZzLAogCS5yZW1vdW50X2ZzCT0gdWRmX3JlbW91bnRfZnMsCisJLnNob3dfb3B0aW9ucwk9IHVkZl9zaG93X29wdGlvbnMsCiB9OwogCiBzdHJ1Y3QgdWRmX29wdGlvbnMgewpAQCAtMjE4LDYgKzIzNSw3OSBAQAogbW9kdWxlX2luaXQoaW5pdF91ZGZfZnMpCiBtb2R1bGVfZXhpdChleGl0X3VkZl9mcykKIAorc3RhdGljIGludCB1ZGZfc2JfYWxsb2NfcGFydGl0aW9uX21hcHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdTMyIGNvdW50KQoreworCXN0cnVjdCB1ZGZfc2JfaW5mbyAqc2JpID0gVURGX1NCKHNiKTsKKworCXNiaS0+c19wYXJ0bWFwcyA9IGtjYWxsb2MoY291bnQsIHNpemVvZihzdHJ1Y3QgdWRmX3BhcnRfbWFwKSwKKwkJCQkgIEdGUF9LRVJORUwpOworCWlmICghc2JpLT5zX3BhcnRtYXBzKSB7CisJCXVkZl9lcnJvcihzYiwgX19GVU5DVElPTl9fLAorCQkJICAiVW5hYmxlIHRvIGFsbG9jYXRlIHNwYWNlIGZvciAlZCBwYXJ0aXRpb24gbWFwcyIsCisJCQkgIGNvdW50KTsKKwkJc2JpLT5zX3BhcnRpdGlvbnMgPSAwOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzYmktPnNfcGFydGl0aW9ucyA9IGNvdW50OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVkZl9zaG93X29wdGlvbnMoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBtbnQtPm1udF9zYjsKKwlzdHJ1Y3QgdWRmX3NiX2luZm8gKnNiaSA9IFVERl9TQihzYik7CisKKwlpZiAoIVVERl9RVUVSWV9GTEFHKHNiLCBVREZfRkxBR19TVFJJQ1QpKQorCQlzZXFfcHV0cyhzZXEsICIsbm9zdHJpY3QiKTsKKwlpZiAoc2ItPnNfYmxvY2tzaXplICE9IFVERl9ERUZBVUxUX0JMT0NLU0laRSkKKwkJc2VxX3ByaW50ZihzZXEsICIsYnM9JWx1Iiwgc2ItPnNfYmxvY2tzaXplKTsKKwlpZiAoVURGX1FVRVJZX0ZMQUcoc2IsIFVERl9GTEFHX1VOSElERSkpCisJCXNlcV9wdXRzKHNlcSwgIix1bmhpZGUiKTsKKwlpZiAoVURGX1FVRVJZX0ZMQUcoc2IsIFVERl9GTEFHX1VOREVMRVRFKSkKKwkJc2VxX3B1dHMoc2VxLCAiLHVuZGVsZXRlIik7CisJaWYgKCFVREZfUVVFUllfRkxBRyhzYiwgVURGX0ZMQUdfVVNFX0FEX0lOX0lDQikpCisJCXNlcV9wdXRzKHNlcSwgIixub2FkaW5pY2IiKTsKKwlpZiAoVURGX1FVRVJZX0ZMQUcoc2IsIFVERl9GTEFHX1VTRV9TSE9SVF9BRCkpCisJCXNlcV9wdXRzKHNlcSwgIixzaG9ydGFkIik7CisJaWYgKFVERl9RVUVSWV9GTEFHKHNiLCBVREZfRkxBR19VSURfRk9SR0VUKSkKKwkJc2VxX3B1dHMoc2VxLCAiLHVpZD1mb3JnZXQiKTsKKwlpZiAoVURGX1FVRVJZX0ZMQUcoc2IsIFVERl9GTEFHX1VJRF9JR05PUkUpKQorCQlzZXFfcHV0cyhzZXEsICIsdWlkPWlnbm9yZSIpOworCWlmIChVREZfUVVFUllfRkxBRyhzYiwgVURGX0ZMQUdfR0lEX0ZPUkdFVCkpCisJCXNlcV9wdXRzKHNlcSwgIixnaWQ9Zm9yZ2V0Iik7CisJaWYgKFVERl9RVUVSWV9GTEFHKHNiLCBVREZfRkxBR19HSURfSUdOT1JFKSkKKwkJc2VxX3B1dHMoc2VxLCAiLGdpZD1pZ25vcmUiKTsKKwlpZiAoVURGX1FVRVJZX0ZMQUcoc2IsIFVERl9GTEFHX1VJRF9TRVQpKQorCQlzZXFfcHJpbnRmKHNlcSwgIix1aWQ9JXUiLCBzYmktPnNfdWlkKTsKKwlpZiAoVURGX1FVRVJZX0ZMQUcoc2IsIFVERl9GTEFHX0dJRF9TRVQpKQorCQlzZXFfcHJpbnRmKHNlcSwgIixnaWQ9JXUiLCBzYmktPnNfZ2lkKTsKKwlpZiAoc2JpLT5zX3VtYXNrICE9IDApCisJCXNlcV9wcmludGYoc2VxLCAiLHVtYXNrPSVvIiwgc2JpLT5zX3VtYXNrKTsKKwlpZiAoVURGX1FVRVJZX0ZMQUcoc2IsIFVERl9GTEFHX1NFU1NJT05fU0VUKSkKKwkJc2VxX3ByaW50ZihzZXEsICIsc2Vzc2lvbj0ldSIsIHNiaS0+c19zZXNzaW9uKTsKKwlpZiAoVURGX1FVRVJZX0ZMQUcoc2IsIFVERl9GTEFHX0xBU1RCTE9DS19TRVQpKQorCQlzZXFfcHJpbnRmKHNlcSwgIixsYXN0YmxvY2s9JXUiLCBzYmktPnNfbGFzdF9ibG9jayk7CisJLyoKKwkgKiBzX2FuY2hvclsyXSBjb3VsZCBiZSB6ZXJvZWQgb3V0IGluIGNhc2UgdGhlcmUgaXMgbm8gYW5jaG9yCisJICogaW4gdGhlIHNwZWNpZmllZCBibG9jaywgYnV0IHRoZW4gdGhlICJhbmNob3I9TiIgb3B0aW9uCisJICogb3JpZ2luYWxseSBnaXZlbiBieSB0aGUgdXNlciB3YXNuJ3QgZWZmZWN0aXZlLCBzbyBpdCdzIE9LCisJICogaWYgd2UgZG9uJ3Qgc2hvdyBpdC4KKwkgKi8KKwlpZiAoc2JpLT5zX2FuY2hvclsyXSAhPSAwKQorCQlzZXFfcHJpbnRmKHNlcSwgIixhbmNob3I9JXUiLCBzYmktPnNfYW5jaG9yWzJdKTsKKwkvKgorCSAqIHZvbHVtZSwgcGFydGl0aW9uLCBmaWxlc2V0IGFuZCByb290ZGlyIHNlZW0gdG8gYmUgaWdub3JlZAorCSAqIGN1cnJlbnRseQorCSAqLworCWlmIChVREZfUVVFUllfRkxBRyhzYiwgVURGX0ZMQUdfVVRGOCkpCisJCXNlcV9wdXRzKHNlcSwgIix1dGY4Iik7CisJaWYgKFVERl9RVUVSWV9GTEFHKHNiLCBVREZfRkxBR19OTFNfTUFQKSAmJiBzYmktPnNfbmxzX21hcCkKKwkJc2VxX3ByaW50ZihzZXEsICIsaW9jaGFyc2V0PSVzIiwgc2JpLT5zX25sc19tYXAtPmNoYXJzZXQpOworCisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiB1ZGZfcGFyc2Vfb3B0aW9ucwogICoKQEAgLTMxMCwxMyArNDAwLDE0IEBACiAJe09wdF9lcnIsCU5VTEx9CiB9OwogCi1zdGF0aWMgaW50IHVkZl9wYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMsIHN0cnVjdCB1ZGZfb3B0aW9ucyAqdW9wdCkKK3N0YXRpYyBpbnQgdWRmX3BhcnNlX29wdGlvbnMoY2hhciAqb3B0aW9ucywgc3RydWN0IHVkZl9vcHRpb25zICp1b3B0LAorCQkJICAgICBib29sIHJlbW91bnQpCiB7CiAJY2hhciAqcDsKIAlpbnQgb3B0aW9uOwogCiAJdW9wdC0+bm92cnMgPSAwOwotCXVvcHQtPmJsb2Nrc2l6ZSA9IDIwNDg7CisJdW9wdC0+YmxvY2tzaXplID0gVURGX0RFRkFVTFRfQkxPQ0tTSVpFOwogCXVvcHQtPnBhcnRpdGlvbiA9IDB4RkZGRjsKIAl1b3B0LT5zZXNzaW9uID0gMHhGRkZGRkZGRjsKIAl1b3B0LT5sYXN0YmxvY2sgPSAwOwpAQCAtMzg2LDExICs0NzcsMTUgQEAKIAkJCWlmIChtYXRjaF9pbnQoYXJncywgJm9wdGlvbikpCiAJCQkJcmV0dXJuIDA7CiAJCQl1b3B0LT5zZXNzaW9uID0gb3B0aW9uOworCQkJaWYgKCFyZW1vdW50KQorCQkJCXVvcHQtPmZsYWdzIHw9ICgxIDw8IFVERl9GTEFHX1NFU1NJT05fU0VUKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9sYXN0YmxvY2s6CiAJCQlpZiAobWF0Y2hfaW50KGFyZ3MsICZvcHRpb24pKQogCQkJCXJldHVybiAwOwogCQkJdW9wdC0+bGFzdGJsb2NrID0gb3B0aW9uOworCQkJaWYgKCFyZW1vdW50KQorCQkJCXVvcHQtPmZsYWdzIHw9ICgxIDw8IFVERl9GTEFHX0xBU1RCTE9DS19TRVQpOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2FuY2hvcjoKIAkJCWlmIChtYXRjaF9pbnQoYXJncywgJm9wdGlvbikpCkBAIC00NDcsNyArNTQyLDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotdm9pZCB1ZGZfd3JpdGVfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3N0YXRpYyB2b2lkIHVkZl93cml0ZV9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCWxvY2tfa2VybmVsKCk7CiAKQEAgLTQ2MSwyMiArNTU2LDIzIEBACiBzdGF0aWMgaW50IHVkZl9yZW1vdW50X2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKm9wdGlvbnMpCiB7CiAJc3RydWN0IHVkZl9vcHRpb25zIHVvcHQ7CisJc3RydWN0IHVkZl9zYl9pbmZvICpzYmkgPSBVREZfU0Ioc2IpOwogCi0JdW9wdC5mbGFncyA9IFVERl9TQihzYiktPnNfZmxhZ3M7Ci0JdW9wdC51aWQgICA9IFVERl9TQihzYiktPnNfdWlkOwotCXVvcHQuZ2lkICAgPSBVREZfU0Ioc2IpLT5zX2dpZDsKLQl1b3B0LnVtYXNrID0gVURGX1NCKHNiKS0+c191bWFzazsKKwl1b3B0LmZsYWdzID0gc2JpLT5zX2ZsYWdzOworCXVvcHQudWlkICAgPSBzYmktPnNfdWlkOworCXVvcHQuZ2lkICAgPSBzYmktPnNfZ2lkOworCXVvcHQudW1hc2sgPSBzYmktPnNfdW1hc2s7CiAKLQlpZiAoIXVkZl9wYXJzZV9vcHRpb25zKG9wdGlvbnMsICZ1b3B0KSkKKwlpZiAoIXVkZl9wYXJzZV9vcHRpb25zKG9wdGlvbnMsICZ1b3B0LCB0cnVlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlVREZfU0Ioc2IpLT5zX2ZsYWdzID0gdW9wdC5mbGFnczsKLQlVREZfU0Ioc2IpLT5zX3VpZCAgID0gdW9wdC51aWQ7Ci0JVURGX1NCKHNiKS0+c19naWQgICA9IHVvcHQuZ2lkOwotCVVERl9TQihzYiktPnNfdW1hc2sgPSB1b3B0LnVtYXNrOworCXNiaS0+c19mbGFncyA9IHVvcHQuZmxhZ3M7CisJc2JpLT5zX3VpZCAgID0gdW9wdC51aWQ7CisJc2JpLT5zX2dpZCAgID0gdW9wdC5naWQ7CisJc2JpLT5zX3VtYXNrID0gdW9wdC51bWFzazsKIAotCWlmIChVREZfU0JfTFZJREJIKHNiKSkgewotCQlpbnQgd3JpdGVfcmV2ID0gbGUxNl90b19jcHUoVURGX1NCX0xWSURJVShzYiktPm1pblVERldyaXRlUmV2KTsKKwlpZiAoc2JpLT5zX2x2aWRfYmgpIHsKKwkJaW50IHdyaXRlX3JldiA9IGxlMTZfdG9fY3B1KHVkZl9zYl9sdmlkaXUoc2JpKS0+bWluVURGV3JpdGVSZXYpOwogCQlpZiAod3JpdGVfcmV2ID4gVURGX01BWF9XUklURV9WRVJTSU9OKQogCQkJKmZsYWdzIHw9IE1TX1JET05MWTsKIAl9CkBAIC01MzgsMTcgKzYzNCwxOSBAQAogCWludCBpc285NjYwID0gMDsKIAlpbnQgbnNyMDIgPSAwOwogCWludCBuc3IwMyA9IDA7CisJc3RydWN0IHVkZl9zYl9pbmZvICpzYmk7CiAKIAkvKiBCbG9jayBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA1MTIgKi8KIAlpZiAoc2ItPnNfYmxvY2tzaXplICYgNTExKQogCQlyZXR1cm4gMDsKKwlzYmkgPSBVREZfU0Ioc2IpOwogCiAJaWYgKHNiLT5zX2Jsb2Nrc2l6ZSA8IHNpemVvZihzdHJ1Y3Qgdm9sU3RydWN0RGVzYykpCiAJCXNlY3RvcnNpemUgPSBzaXplb2Yoc3RydWN0IHZvbFN0cnVjdERlc2MpOwogCWVsc2UKIAkJc2VjdG9yc2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKIAotCXNlY3RvciArPSAoVURGX1NCX1NFU1NJT04oc2IpIDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwlzZWN0b3IgKz0gKHNiaS0+c19zZXNzaW9uIDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKIAogCXVkZl9kZWJ1ZygiU3RhcnRpbmcgYXQgc2VjdG9yICV1ICglbGQgYnl0ZSBzZWN0b3JzKVxuIiwKIAkJICAoc2VjdG9yID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSwgc2ItPnNfYmxvY2tzaXplKTsKQEAgLTU2MSw0NyArNjU5LDUyIEBACiAKIAkJLyogTG9vayBmb3IgSVNPICBkZXNjcmlwdG9ycyAqLwogCQl2c2QgPSAoc3RydWN0IHZvbFN0cnVjdERlc2MgKikoYmgtPmJfZGF0YSArCi0JCQkJCSAgICAgICAoc2VjdG9yICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSk7CisJCQkJCSAgICAgIChzZWN0b3IgJiAoc2ItPnNfYmxvY2tzaXplIC0gMSkpKTsKIAogCQlpZiAodnNkLT5zdGRJZGVudFswXSA9PSAwKSB7CiAJCQlicmVsc2UoYmgpOwogCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAoIXN0cm5jbXAodnNkLT5zdGRJZGVudCwgVlNEX1NURF9JRF9DRDAwMSwgVlNEX1NURF9JRF9MRU4pKSB7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAodnNkLT5zdGRJZGVudCwgVlNEX1NURF9JRF9DRDAwMSwKKwkJCQkgICAgVlNEX1NURF9JRF9MRU4pKSB7CiAJCQlpc285NjYwID0gc2VjdG9yOwogCQkJc3dpdGNoICh2c2QtPnN0cnVjdFR5cGUpIHsKIAkJCWNhc2UgMDoKIAkJCQl1ZGZfZGVidWcoIklTTzk2NjAgQm9vdCBSZWNvcmQgZm91bmRcbiIpOwogCQkJCWJyZWFrOwogCQkJY2FzZSAxOgotCQkJCXVkZl9kZWJ1ZwotCQkJCSAgICAoIklTTzk2NjAgUHJpbWFyeSBWb2x1bWUgRGVzY3JpcHRvciBmb3VuZFxuIik7CisJCQkJdWRmX2RlYnVnKCJJU085NjYwIFByaW1hcnkgVm9sdW1lIERlc2NyaXB0b3IgIgorCQkJCQkgICJmb3VuZFxuIik7CiAJCQkJYnJlYWs7CiAJCQljYXNlIDI6Ci0JCQkJdWRmX2RlYnVnCi0JCQkJICAgICgiSVNPOTY2MCBTdXBwbGVtZW50YXJ5IFZvbHVtZSBEZXNjcmlwdG9yIGZvdW5kXG4iKTsKKwkJCQl1ZGZfZGVidWcoIklTTzk2NjAgU3VwcGxlbWVudGFyeSBWb2x1bWUgIgorCQkJCQkgICJEZXNjcmlwdG9yIGZvdW5kXG4iKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgMzoKLQkJCQl1ZGZfZGVidWcKLQkJCQkgICAgKCJJU085NjYwIFZvbHVtZSBQYXJ0aXRpb24gRGVzY3JpcHRvciBmb3VuZFxuIik7CisJCQkJdWRmX2RlYnVnKCJJU085NjYwIFZvbHVtZSBQYXJ0aXRpb24gRGVzY3JpcHRvciAiCisJCQkJCSAgImZvdW5kXG4iKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgMjU1OgotCQkJCXVkZl9kZWJ1ZwotCQkJCSAgICAoIklTTzk2NjAgVm9sdW1lIERlc2NyaXB0b3IgU2V0IFRlcm1pbmF0b3IgZm91bmRcbiIpOworCQkJCXVkZl9kZWJ1ZygiSVNPOTY2MCBWb2x1bWUgRGVzY3JpcHRvciBTZXQgIgorCQkJCQkgICJUZXJtaW5hdG9yIGZvdW5kXG4iKTsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CiAJCQkJdWRmX2RlYnVnKCJJU085NjYwIFZSUyAoJXUpIGZvdW5kXG4iLAogCQkJCQkgIHZzZC0+c3RydWN0VHlwZSk7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoIXN0cm5jbXAodnNkLT5zdGRJZGVudCwgVlNEX1NURF9JRF9CRUEwMSwgVlNEX1NURF9JRF9MRU4pKSB7Ci0JCX0gZWxzZSBpZiAoIXN0cm5jbXAodnNkLT5zdGRJZGVudCwgVlNEX1NURF9JRF9URUEwMSwgVlNEX1NURF9JRF9MRU4pKSB7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAodnNkLT5zdGRJZGVudCwgVlNEX1NURF9JRF9CRUEwMSwKKwkJCQkgICAgVlNEX1NURF9JRF9MRU4pKQorCQkJOyAvKiBub3RoaW5nICovCisJCWVsc2UgaWYgKCFzdHJuY21wKHZzZC0+c3RkSWRlbnQsIFZTRF9TVERfSURfVEVBMDEsCisJCQkJICAgIFZTRF9TVERfSURfTEVOKSkgewogCQkJYnJlbHNlKGJoKTsKIAkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKCFzdHJuY21wKHZzZC0+c3RkSWRlbnQsIFZTRF9TVERfSURfTlNSMDIsIFZTRF9TVERfSURfTEVOKSkgeworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHZzZC0+c3RkSWRlbnQsIFZTRF9TVERfSURfTlNSMDIsCisJCQkJICAgIFZTRF9TVERfSURfTEVOKSkKIAkJCW5zcjAyID0gc2VjdG9yOwotCQl9IGVsc2UgaWYgKCFzdHJuY21wKHZzZC0+c3RkSWRlbnQsIFZTRF9TVERfSURfTlNSMDMsIFZTRF9TVERfSURfTEVOKSkgeworCQllbHNlIGlmICghc3RybmNtcCh2c2QtPnN0ZElkZW50LCBWU0RfU1REX0lEX05TUjAzLAorCQkJCSAgICBWU0RfU1REX0lEX0xFTikpCiAJCQluc3IwMyA9IHNlY3RvcjsKLQkJfQogCQlicmVsc2UoYmgpOwogCX0KIApAQCAtNjA5LDcgKzcxMiw3IEBACiAJCXJldHVybiBuc3IwMzsKIAllbHNlIGlmIChuc3IwMikKIAkJcmV0dXJuIG5zcjAyOwotCWVsc2UgaWYgKHNlY3RvciAtIChVREZfU0JfU0VTU0lPTihzYikgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHMpID09IDMyNzY4KQorCWVsc2UgaWYgKHNlY3RvciAtIChzYmktPnNfc2Vzc2lvbiA8PCBzYi0+c19ibG9ja3NpemVfYml0cykgPT0gMzI3NjgpCiAJCXJldHVybiAtMTsKIAllbHNlCiAJCXJldHVybiAwOwpAQCAtNjM0LDExICs3MzcsMTUgQEAKICAqLwogc3RhdGljIHZvaWQgdWRmX2ZpbmRfYW5jaG9yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0JaW50IGxhc3RibG9jayA9IFVERl9TQl9MQVNUQkxPQ0soc2IpOworCWludCBsYXN0YmxvY2s7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CiAJdWludDE2X3QgaWRlbnQ7CiAJdWludDMyX3QgbG9jYXRpb247CiAJaW50IGk7CisJc3RydWN0IHVkZl9zYl9pbmZvICpzYmk7CisKKwlzYmkgPSBVREZfU0Ioc2IpOworCWxhc3RibG9jayA9IHNiaS0+c19sYXN0X2Jsb2NrOwogCiAJaWYgKGxhc3RibG9jaykgewogCQlpbnQgdmFybGFzdGJsb2NrID0gdWRmX3ZhcmlhYmxlX3RvX2ZpeGVkKGxhc3RibG9jayk7CkBAIC02NTgsNTcgKzc2NSw4MyBAQAogCQkgKiAgaG93ZXZlciwgaWYgdGhlIGRpc2MgaXNuJ3QgY2xvc2VkLCBpdCBjb3VsZCBiZSA1MTIgKi8KIAogCQlmb3IgKGkgPSAwOyAhbGFzdGJsb2NrICYmIGkgPCBBUlJBWV9TSVpFKGxhc3QpOyBpKyspIHsKLQkJCWlmIChsYXN0W2ldIDwgMCB8fCAhKGJoID0gc2JfYnJlYWQoc2IsIGxhc3RbaV0pKSkgewotCQkJCWlkZW50ID0gbG9jYXRpb24gPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZGVudCA9IGxlMTZfdG9fY3B1KCgodGFnICopYmgtPmJfZGF0YSktPnRhZ0lkZW50KTsKLQkJCQlsb2NhdGlvbiA9IGxlMzJfdG9fY3B1KCgodGFnICopYmgtPmJfZGF0YSktPnRhZ0xvY2F0aW9uKTsKLQkJCQlicmVsc2UoYmgpOworCQkJaWRlbnQgPSBsb2NhdGlvbiA9IDA7CisJCQlpZiAobGFzdFtpXSA+PSAwKSB7CisJCQkJYmggPSBzYl9icmVhZChzYiwgbGFzdFtpXSk7CisJCQkJaWYgKGJoKSB7CisJCQkJCXRhZyAqdCA9ICh0YWcgKiliaC0+Yl9kYXRhOworCQkJCQlpZGVudCA9IGxlMTZfdG9fY3B1KHQtPnRhZ0lkZW50KTsKKwkJCQkJbG9jYXRpb24gPSBsZTMyX3RvX2NwdSh0LT50YWdMb2NhdGlvbik7CisJCQkJCWJyZWxzZShiaCk7CisJCQkJfQogCQkJfQogCiAJCQlpZiAoaWRlbnQgPT0gVEFHX0lERU5UX0FWRFApIHsKLQkJCQlpZiAobG9jYXRpb24gPT0gbGFzdFtpXSAtIFVERl9TQl9TRVNTSU9OKHNiKSkgewotCQkJCQlsYXN0YmxvY2sgPSBVREZfU0JfQU5DSE9SKHNiKVswXSA9IGxhc3RbaV0gLSBVREZfU0JfU0VTU0lPTihzYik7Ci0JCQkJCVVERl9TQl9BTkNIT1Ioc2IpWzFdID0gbGFzdFtpXSAtIDI1NiAtIFVERl9TQl9TRVNTSU9OKHNiKTsKLQkJCQl9IGVsc2UgaWYgKGxvY2F0aW9uID09IHVkZl92YXJpYWJsZV90b19maXhlZChsYXN0W2ldKSAtIFVERl9TQl9TRVNTSU9OKHNiKSkgeworCQkJCWlmIChsb2NhdGlvbiA9PSBsYXN0W2ldIC0gc2JpLT5zX3Nlc3Npb24pIHsKKwkJCQkJbGFzdGJsb2NrID0gbGFzdFtpXSAtIHNiaS0+c19zZXNzaW9uOworCQkJCQlzYmktPnNfYW5jaG9yWzBdID0gbGFzdGJsb2NrOworCQkJCQlzYmktPnNfYW5jaG9yWzFdID0gbGFzdGJsb2NrIC0gMjU2OworCQkJCX0gZWxzZSBpZiAobG9jYXRpb24gPT0KKwkJCQkJCXVkZl92YXJpYWJsZV90b19maXhlZChsYXN0W2ldKSAtCisJCQkJCQkJc2JpLT5zX3Nlc3Npb24pIHsKIAkJCQkJVURGX1NFVF9GTEFHKHNiLCBVREZfRkxBR19WQVJDT05WKTsKLQkJCQkJbGFzdGJsb2NrID0gVURGX1NCX0FOQ0hPUihzYilbMF0gPSB1ZGZfdmFyaWFibGVfdG9fZml4ZWQobGFzdFtpXSkgLSBVREZfU0JfU0VTU0lPTihzYik7Ci0JCQkJCVVERl9TQl9BTkNIT1Ioc2IpWzFdID0gbGFzdGJsb2NrIC0gMjU2IC0gVURGX1NCX1NFU1NJT04oc2IpOworCQkJCQlsYXN0YmxvY2sgPQorCQkJCQkJdWRmX3ZhcmlhYmxlX3RvX2ZpeGVkKGxhc3RbaV0pIC0KKwkJCQkJCQlzYmktPnNfc2Vzc2lvbjsKKwkJCQkJc2JpLT5zX2FuY2hvclswXSA9IGxhc3RibG9jazsKKwkJCQkJc2JpLT5zX2FuY2hvclsxXSA9IGxhc3RibG9jayAtIDI1NiAtCisJCQkJCQkJCXNiaS0+c19zZXNzaW9uOwogCQkJCX0gZWxzZSB7Ci0JCQkJCXVkZl9kZWJ1ZygiQW5jaG9yIGZvdW5kIGF0IGJsb2NrICVkLCBsb2NhdGlvbiBtaXNtYXRjaCAlZC5cbiIsCisJCQkJCXVkZl9kZWJ1ZygiQW5jaG9yIGZvdW5kIGF0IGJsb2NrICVkLCAiCisJCQkJCQkgICJsb2NhdGlvbiBtaXNtYXRjaCAlZC5cbiIsCiAJCQkJCQkgIGxhc3RbaV0sIGxvY2F0aW9uKTsKIAkJCQl9Ci0JCQl9IGVsc2UgaWYgKGlkZW50ID09IFRBR19JREVOVF9GRSB8fCBpZGVudCA9PSBUQUdfSURFTlRfRUZFKSB7CisJCQl9IGVsc2UgaWYgKGlkZW50ID09IFRBR19JREVOVF9GRSB8fAorCQkJCQlpZGVudCA9PSBUQUdfSURFTlRfRUZFKSB7CiAJCQkJbGFzdGJsb2NrID0gbGFzdFtpXTsKLQkJCQlVREZfU0JfQU5DSE9SKHNiKVszXSA9IDUxMjsKKwkJCQlzYmktPnNfYW5jaG9yWzNdID0gNTEyOwogCQkJfSBlbHNlIHsKLQkJCQlpZiAobGFzdFtpXSA8IDI1NiB8fCAhKGJoID0gc2JfYnJlYWQoc2IsIGxhc3RbaV0gLSAyNTYpKSkgewotCQkJCQlpZGVudCA9IGxvY2F0aW9uID0gMDsKLQkJCQl9IGVsc2UgewotCQkJCQlpZGVudCA9IGxlMTZfdG9fY3B1KCgodGFnICopYmgtPmJfZGF0YSktPnRhZ0lkZW50KTsKLQkJCQkJbG9jYXRpb24gPSBsZTMyX3RvX2NwdSgoKHRhZyAqKWJoLT5iX2RhdGEpLT50YWdMb2NhdGlvbik7Ci0JCQkJCWJyZWxzZShiaCk7CisJCQkJaWRlbnQgPSBsb2NhdGlvbiA9IDA7CisJCQkJaWYgKGxhc3RbaV0gPj0gMjU2KSB7CisJCQkJCWJoID0gc2JfYnJlYWQoc2IsIGxhc3RbaV0gLSAyNTYpOworCQkJCQlpZiAoYmgpIHsKKwkJCQkJCXRhZyAqdCA9ICh0YWcgKiliaC0+Yl9kYXRhOworCQkJCQkJaWRlbnQgPSBsZTE2X3RvX2NwdSgKKwkJCQkJCQkJdC0+dGFnSWRlbnQpOworCQkJCQkJbG9jYXRpb24gPSBsZTMyX3RvX2NwdSgKKwkJCQkJCQkJdC0+dGFnTG9jYXRpb24pOworCQkJCQkJYnJlbHNlKGJoKTsKKwkJCQkJfQogCQkJCX0KIAogCQkJCWlmIChpZGVudCA9PSBUQUdfSURFTlRfQVZEUCAmJgotCQkJCSAgICBsb2NhdGlvbiA9PSBsYXN0W2ldIC0gMjU2IC0gVURGX1NCX1NFU1NJT04oc2IpKSB7CisJCQkJICAgIGxvY2F0aW9uID09IGxhc3RbaV0gLSAyNTYgLQorCQkJCQkJc2JpLT5zX3Nlc3Npb24pIHsKIAkJCQkJbGFzdGJsb2NrID0gbGFzdFtpXTsKLQkJCQkJVURGX1NCX0FOQ0hPUihzYilbMV0gPSBsYXN0W2ldIC0gMjU2OworCQkJCQlzYmktPnNfYW5jaG9yWzFdID0gbGFzdFtpXSAtIDI1NjsKIAkJCQl9IGVsc2UgewotCQkJCQlpZiAobGFzdFtpXSA8IDMxMiArIFVERl9TQl9TRVNTSU9OKHNiKSB8fAotCQkJCQkgICAgIShiaCA9IHNiX2JyZWFkKHNiLCBsYXN0W2ldIC0gMzEyIC0gVURGX1NCX1NFU1NJT04oc2IpKSkpIHsKLQkJCQkJCWlkZW50ID0gbG9jYXRpb24gPSAwOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWRlbnQgPSBsZTE2X3RvX2NwdSgoKHRhZyAqKWJoLT5iX2RhdGEpLT50YWdJZGVudCk7Ci0JCQkJCQlsb2NhdGlvbiA9IGxlMzJfdG9fY3B1KCgodGFnICopYmgtPmJfZGF0YSktPnRhZ0xvY2F0aW9uKTsKLQkJCQkJCWJyZWxzZShiaCk7CisJCQkJCWlkZW50ID0gbG9jYXRpb24gPSAwOworCQkJCQlpZiAobGFzdFtpXSA+PSAzMTIgKyBzYmktPnNfc2Vzc2lvbikgeworCQkJCQkJYmggPSBzYl9icmVhZChzYiwKKwkJCQkJCQkJbGFzdFtpXSAtIDMxMiAtCisJCQkJCQkJCXNiaS0+c19zZXNzaW9uKTsKKwkJCQkJCWlmIChiaCkgeworCQkJCQkJCXRhZyAqdCA9ICh0YWcgKikKKwkJCQkJCQkJIGJoLT5iX2RhdGE7CisJCQkJCQkJaWRlbnQgPSBsZTE2X3RvX2NwdSgKKwkJCQkJCQkJdC0+dGFnSWRlbnQpOworCQkJCQkJCWxvY2F0aW9uID0gbGUzMl90b19jcHUoCisJCQkJCQkJCXQtPnRhZ0xvY2F0aW9uKTsKKwkJCQkJCQlicmVsc2UoYmgpOworCQkJCQkJfQogCQkJCQl9CiAKIAkJCQkJaWYgKGlkZW50ID09IFRBR19JREVOVF9BVkRQICYmCiAJCQkJCSAgICBsb2NhdGlvbiA9PSB1ZGZfdmFyaWFibGVfdG9fZml4ZWQobGFzdFtpXSkgLSAyNTYpIHsKLQkJCQkJCVVERl9TRVRfRkxBRyhzYiwgVURGX0ZMQUdfVkFSQ09OVik7CisJCQkJCQlVREZfU0VUX0ZMQUcoc2IsCisJCQkJCQkJICAgICBVREZfRkxBR19WQVJDT05WKTsKIAkJCQkJCWxhc3RibG9jayA9IHVkZl92YXJpYWJsZV90b19maXhlZChsYXN0W2ldKTsKLQkJCQkJCVVERl9TQl9BTkNIT1Ioc2IpWzFdID0gbGFzdGJsb2NrIC0gMjU2OworCQkJCQkJc2JpLT5zX2FuY2hvclsxXSA9IGxhc3RibG9jayAtIDI1NjsKIAkJCQkJfQogCQkJCX0KIAkJCX0KQEAgLTcxNiwxMCArODQ5LDEyIEBACiAJfQogCiAJaWYgKCFsYXN0YmxvY2spIHsKLQkJLyogV2UgaGF2bid0IGZvdW5kIHRoZSBsYXN0YmxvY2suIGNoZWNrIDMxMiAqLwotCQlpZiAoKGJoID0gc2JfYnJlYWQoc2IsIDMxMiArIFVERl9TQl9TRVNTSU9OKHNiKSkpKSB7Ci0JCQlpZGVudCA9IGxlMTZfdG9fY3B1KCgodGFnICopYmgtPmJfZGF0YSktPnRhZ0lkZW50KTsKLQkJCWxvY2F0aW9uID0gbGUzMl90b19jcHUoKCh0YWcgKiliaC0+Yl9kYXRhKS0+dGFnTG9jYXRpb24pOworCQkvKiBXZSBoYXZlbid0IGZvdW5kIHRoZSBsYXN0YmxvY2suIGNoZWNrIDMxMiAqLworCQliaCA9IHNiX2JyZWFkKHNiLCAzMTIgKyBzYmktPnNfc2Vzc2lvbik7CisJCWlmIChiaCkgeworCQkJdGFnICp0ID0gKHRhZyAqKWJoLT5iX2RhdGE7CisJCQlpZGVudCA9IGxlMTZfdG9fY3B1KHQtPnRhZ0lkZW50KTsKKwkJCWxvY2F0aW9uID0gbGUzMl90b19jcHUodC0+dGFnTG9jYXRpb24pOwogCQkJYnJlbHNlKGJoKTsKIAogCQkJaWYgKGlkZW50ID09IFRBR19JREVOVF9BVkRQICYmIGxvY2F0aW9uID09IDI1NikKQEAgLTcyNywyOSArODYyLDMzIEBACiAJCX0KIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShVREZfU0JfQU5DSE9SKHNiKSk7IGkrKykgewotCQlpZiAoVURGX1NCX0FOQ0hPUihzYilbaV0pIHsKLQkJCWlmICghKGJoID0gdWRmX3JlYWRfdGFnZ2VkKHNiLCBVREZfU0JfQU5DSE9SKHNiKVtpXSwKLQkJCQkJCSAgIFVERl9TQl9BTkNIT1Ioc2IpW2ldLCAmaWRlbnQpKSkgewotCQkJCVVERl9TQl9BTkNIT1Ioc2IpW2ldID0gMDsKLQkJCX0gZWxzZSB7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2JpLT5zX2FuY2hvcik7IGkrKykgeworCQlpZiAoc2JpLT5zX2FuY2hvcltpXSkgeworCQkJYmggPSB1ZGZfcmVhZF90YWdnZWQoc2IsIHNiaS0+c19hbmNob3JbaV0sCisJCQkJCSAgICAgc2JpLT5zX2FuY2hvcltpXSwgJmlkZW50KTsKKwkJCWlmICghYmgpCisJCQkJc2JpLT5zX2FuY2hvcltpXSA9IDA7CisJCQllbHNlIHsKIAkJCQlicmVsc2UoYmgpOwogCQkJCWlmICgoaWRlbnQgIT0gVEFHX0lERU5UX0FWRFApICYmCi0JCQkJICAgIChpIHx8IChpZGVudCAhPSBUQUdfSURFTlRfRkUgJiYgaWRlbnQgIT0gVEFHX0lERU5UX0VGRSkpKSB7Ci0JCQkJCVVERl9TQl9BTkNIT1Ioc2IpW2ldID0gMDsKLQkJCQl9CisJCQkJICAgIChpIHx8IChpZGVudCAhPSBUQUdfSURFTlRfRkUgJiYKKwkJCQkJICAgaWRlbnQgIT0gVEFHX0lERU5UX0VGRSkpKQorCQkJCQlzYmktPnNfYW5jaG9yW2ldID0gMDsKIAkJCX0KIAkJfQogCX0KIAotCVVERl9TQl9MQVNUQkxPQ0soc2IpID0gbGFzdGJsb2NrOworCXNiaS0+c19sYXN0X2Jsb2NrID0gbGFzdGJsb2NrOwogfQogCi1zdGF0aWMgaW50IHVkZl9maW5kX2ZpbGVzZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwga2VybmVsX2xiX2FkZHIgKmZpbGVzZXQsIGtlcm5lbF9sYl9hZGRyICpyb290KQorc3RhdGljIGludCB1ZGZfZmluZF9maWxlc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkgICAga2VybmVsX2xiX2FkZHIgKmZpbGVzZXQsCisJCQkgICAga2VybmVsX2xiX2FkZHIgKnJvb3QpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CiAJbG9uZyBsYXN0YmxvY2s7CiAJdWludDE2X3QgaWRlbnQ7CisJc3RydWN0IHVkZl9zYl9pbmZvICpzYmk7CiAKIAlpZiAoZmlsZXNldC0+bG9naWNhbEJsb2NrTnVtICE9IDB4RkZGRkZGRkYgfHwKIAkgICAgZmlsZXNldC0+cGFydGl0aW9uUmVmZXJlbmNlTnVtICE9IDB4RkZGRikgewpAQCAtNzY0LDIyICs5MDMsMjcgQEAKIAogCX0KIAotCWlmICghYmgpIHsgLyogU2VhcmNoIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSBwYXJ0aXRpb25zICovCisJc2JpID0gVURGX1NCKHNiKTsKKwlpZiAoIWJoKSB7CisJCS8qIFNlYXJjaCBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgcGFydGl0aW9ucyAqLwogCQlrZXJuZWxfbGJfYWRkciBuZXdmaWxlc2V0OwogCiAvKiAtLT4gY3ZnOiBGSVhNRSAtIGlzIGl0IHJlYXNvbmFibGU/ICovCiAJCXJldHVybiAxOwogCi0JCWZvciAobmV3ZmlsZXNldC5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPSBVREZfU0JfTlVNUEFSVFMoc2IpIC0gMTsKKwkJZm9yIChuZXdmaWxlc2V0LnBhcnRpdGlvblJlZmVyZW5jZU51bSA9IHNiaS0+c19wYXJ0aXRpb25zIC0gMTsKIAkJICAgICAobmV3ZmlsZXNldC5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gIT0gMHhGRkZGICYmCiAJCSAgICAgIGZpbGVzZXQtPmxvZ2ljYWxCbG9ja051bSA9PSAweEZGRkZGRkZGICYmCiAJCSAgICAgIGZpbGVzZXQtPnBhcnRpdGlvblJlZmVyZW5jZU51bSA9PSAweEZGRkYpOwogCQkgICAgIG5ld2ZpbGVzZXQucGFydGl0aW9uUmVmZXJlbmNlTnVtLS0pIHsKLQkJCWxhc3RibG9jayA9IFVERl9TQl9QQVJUTEVOKHNiLCBuZXdmaWxlc2V0LnBhcnRpdGlvblJlZmVyZW5jZU51bSk7CisJCQlsYXN0YmxvY2sgPSBzYmktPnNfcGFydG1hcHMKKwkJCQkJW25ld2ZpbGVzZXQucGFydGl0aW9uUmVmZXJlbmNlTnVtXQorCQkJCQkJLnNfcGFydGl0aW9uX2xlbjsKIAkJCW5ld2ZpbGVzZXQubG9naWNhbEJsb2NrTnVtID0gMDsKIAogCQkJZG8gewotCQkJCWJoID0gdWRmX3JlYWRfcHRhZ2dlZChzYiwgbmV3ZmlsZXNldCwgMCwgJmlkZW50KTsKKwkJCQliaCA9IHVkZl9yZWFkX3B0YWdnZWQoc2IsIG5ld2ZpbGVzZXQsIDAsCisJCQkJCQkgICAgICAmaWRlbnQpOwogCQkJCWlmICghYmgpIHsKIAkJCQkJbmV3ZmlsZXNldC5sb2dpY2FsQmxvY2tOdW0rKzsKIAkJCQkJY29udGludWU7CkBAIC03ODksMTEgKzkzMywxMiBAQAogCQkJCWNhc2UgVEFHX0lERU5UX1NCRDoKIAkJCQl7CiAJCQkJCXN0cnVjdCBzcGFjZUJpdG1hcERlc2MgKnNwOwotCQkJCQlzcCA9IChzdHJ1Y3Qgc3BhY2VCaXRtYXBEZXNjICopYmgtPmJfZGF0YTsKKwkJCQkJc3AgPSAoc3RydWN0IHNwYWNlQml0bWFwRGVzYyAqKQorCQkJCQkJCQliaC0+Yl9kYXRhOwogCQkJCQluZXdmaWxlc2V0LmxvZ2ljYWxCbG9ja051bSArPSAxICsKIAkJCQkJCSgobGUzMl90b19jcHUoc3AtPm51bU9mQnl0ZXMpICsKLQkJCQkJCSAgc2l6ZW9mKHN0cnVjdCBzcGFjZUJpdG1hcERlc2MpIC0gMSkKLQkJCQkJCSA+PiBzYi0+c19ibG9ja3NpemVfYml0cyk7CisJCQkJCQkgIHNpemVvZihzdHJ1Y3Qgc3BhY2VCaXRtYXBEZXNjKQorCQkJCQkJICAtIDEpID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKIAkJCQkJYnJlbHNlKGJoKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQpAQCAtODE4LDcgKzk2Myw3IEBACiAJCQkgIGZpbGVzZXQtPmxvZ2ljYWxCbG9ja051bSwKIAkJCSAgZmlsZXNldC0+cGFydGl0aW9uUmVmZXJlbmNlTnVtKTsKIAotCQlVREZfU0JfUEFSVElUSU9OKHNiKSA9IGZpbGVzZXQtPnBhcnRpdGlvblJlZmVyZW5jZU51bTsKKwkJc2JpLT5zX3BhcnRpdGlvbiA9IGZpbGVzZXQtPnBhcnRpdGlvblJlZmVyZW5jZU51bTsKIAkJdWRmX2xvYWRfZmlsZXNldChzYiwgYmgsIHJvb3QpOwogCQlicmVsc2UoYmgpOwogCQlyZXR1cm4gMDsKQEAgLTg0MCwyNiArOTg1LDI2IEBACiAJCQkgICAgICBsZXRzX3RvX2NwdShwdm9sZGVzYy0+cmVjb3JkaW5nRGF0ZUFuZFRpbWUpKSkgewogCQlrZXJuZWxfdGltZXN0YW1wIHRzOwogCQl0cyA9IGxldHNfdG9fY3B1KHB2b2xkZXNjLT5yZWNvcmRpbmdEYXRlQW5kVGltZSk7Ci0JCXVkZl9kZWJ1ZygicmVjb3JkaW5nIHRpbWUgJWxkLyVsZCwgJTA0dS8lMDJ1LyUwMnUgJTAydTolMDJ1ICgleClcbiIsCisJCXVkZl9kZWJ1ZygicmVjb3JkaW5nIHRpbWUgJWxkLyVsZCwgJTA0dS8lMDJ1LyUwMnUiCisJCQkgICIgJTAydTolMDJ1ICgleClcbiIsCiAJCQkgIHJlY29yZGluZywgcmVjb3JkaW5nX3VzZWMsCiAJCQkgIHRzLnllYXIsIHRzLm1vbnRoLCB0cy5kYXksIHRzLmhvdXIsCiAJCQkgIHRzLm1pbnV0ZSwgdHMudHlwZUFuZFRpbWV6b25lKTsKLQkJVURGX1NCX1JFQ09SRFRJTUUoc2IpLnR2X3NlYyA9IHJlY29yZGluZzsKLQkJVURGX1NCX1JFQ09SRFRJTUUoc2IpLnR2X25zZWMgPSByZWNvcmRpbmdfdXNlYyAqIDEwMDA7CisJCVVERl9TQihzYiktPnNfcmVjb3JkX3RpbWUudHZfc2VjID0gcmVjb3JkaW5nOworCQlVREZfU0Ioc2IpLT5zX3JlY29yZF90aW1lLnR2X25zZWMgPSByZWNvcmRpbmdfdXNlYyAqIDEwMDA7CiAJfQogCi0JaWYgKCF1ZGZfYnVpbGRfdXN0cigmaW5zdHIsIHB2b2xkZXNjLT52b2xJZGVudCwgMzIpKSB7CisJaWYgKCF1ZGZfYnVpbGRfdXN0cigmaW5zdHIsIHB2b2xkZXNjLT52b2xJZGVudCwgMzIpKQogCQlpZiAodWRmX0NTMHRvVVRGOCgmb3V0c3RyLCAmaW5zdHIpKSB7Ci0JCQlzdHJuY3B5KFVERl9TQl9WT0xJREVOVChzYiksIG91dHN0ci51X25hbWUsCisJCQlzdHJuY3B5KFVERl9TQihzYiktPnNfdm9sdW1lX2lkZW50LCBvdXRzdHIudV9uYW1lLAogCQkJCW91dHN0ci51X2xlbiA+IDMxID8gMzEgOiBvdXRzdHIudV9sZW4pOwotCQkJdWRmX2RlYnVnKCJ2b2xJZGVudFtdID0gJyVzJ1xuIiwgVURGX1NCX1ZPTElERU5UKHNiKSk7CisJCQl1ZGZfZGVidWcoInZvbElkZW50W10gPSAnJXMnXG4iLAorCQkJCQlVREZfU0Ioc2IpLT5zX3ZvbHVtZV9pZGVudCk7CiAJCX0KLQl9CiAKLQlpZiAoIXVkZl9idWlsZF91c3RyKCZpbnN0ciwgcHZvbGRlc2MtPnZvbFNldElkZW50LCAxMjgpKSB7CisJaWYgKCF1ZGZfYnVpbGRfdXN0cigmaW5zdHIsIHB2b2xkZXNjLT52b2xTZXRJZGVudCwgMTI4KSkKIAkJaWYgKHVkZl9DUzB0b1VURjgoJm91dHN0ciwgJmluc3RyKSkKIAkJCXVkZl9kZWJ1Zygidm9sU2V0SWRlbnRbXSA9ICclcydcbiIsIG91dHN0ci51X25hbWUpOwotCX0KIH0KIAogc3RhdGljIHZvaWQgdWRmX2xvYWRfZmlsZXNldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLApAQCAtODcxLDY1ICsxMDE2LDEyNCBAQAogCiAJKnJvb3QgPSBsZWxiX3RvX2NwdShmc2V0LT5yb290RGlyZWN0b3J5SUNCLmV4dExvY2F0aW9uKTsKIAotCVVERl9TQl9TRVJJQUxOVU0oc2IpID0gbGUxNl90b19jcHUoZnNldC0+ZGVzY1RhZy50YWdTZXJpYWxOdW0pOworCVVERl9TQihzYiktPnNfc2VyaWFsX251bWJlciA9IGxlMTZfdG9fY3B1KGZzZXQtPmRlc2NUYWcudGFnU2VyaWFsTnVtKTsKIAogCXVkZl9kZWJ1ZygiUm9vdGRpciBhdCBibG9jaz0lZCwgcGFydGl0aW9uPSVkXG4iLAogCQkgIHJvb3QtPmxvZ2ljYWxCbG9ja051bSwgcm9vdC0+cGFydGl0aW9uUmVmZXJlbmNlTnVtKTsKIH0KIAoraW50IHVkZl9jb21wdXRlX25yX2dyb3VwcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1MzIgcGFydGl0aW9uKQoreworCXN0cnVjdCB1ZGZfcGFydF9tYXAgKm1hcCA9ICZVREZfU0Ioc2IpLT5zX3BhcnRtYXBzW3BhcnRpdGlvbl07CisJcmV0dXJuIChtYXAtPnNfcGFydGl0aW9uX2xlbiArCisJCShzaXplb2Yoc3RydWN0IHNwYWNlQml0bWFwRGVzYykgPDwgMykgKworCQkoc2ItPnNfYmxvY2tzaXplICogOCkgLSAxKSAvCisJCShzYi0+c19ibG9ja3NpemUgKiA4KTsKK30KKworc3RhdGljIHN0cnVjdCB1ZGZfYml0bWFwICp1ZGZfc2JfYWxsb2NfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHUzMiBpbmRleCkKK3sKKwlzdHJ1Y3QgdWRmX2JpdG1hcCAqYml0bWFwOworCWludCBucl9ncm91cHM7CisJaW50IHNpemU7CisKKwlucl9ncm91cHMgPSB1ZGZfY29tcHV0ZV9ucl9ncm91cHMoc2IsIGluZGV4KTsKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCB1ZGZfYml0bWFwKSArCisJCShzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopICogbnJfZ3JvdXBzKTsKKworCWlmIChzaXplIDw9IFBBR0VfU0laRSkKKwkJYml0bWFwID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwllbHNlCisJCWJpdG1hcCA9IHZtYWxsb2Moc2l6ZSk7IC8qIFRPRE86IGdldCByaWQgb2Ygdm1hbGxvYyAqLworCisJaWYgKGJpdG1hcCA9PSBOVUxMKSB7CisJCXVkZl9lcnJvcihzYiwgX19GVU5DVElPTl9fLAorCQkJICAiVW5hYmxlIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBiaXRtYXAgIgorCQkJICAiYW5kICVkIGJ1ZmZlcl9oZWFkIHBvaW50ZXJzIiwgbnJfZ3JvdXBzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KGJpdG1hcCwgMHgwMCwgc2l6ZSk7CisJYml0bWFwLT5zX2Jsb2NrX2JpdG1hcCA9IChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiopKGJpdG1hcCArIDEpOworCWJpdG1hcC0+c19ucl9ncm91cHMgPSBucl9ncm91cHM7CisJcmV0dXJuIGJpdG1hcDsKK30KKwogc3RhdGljIGludCB1ZGZfbG9hZF9wYXJ0ZGVzYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewogCXN0cnVjdCBwYXJ0aXRpb25EZXNjICpwOwogCWludCBpOworCXN0cnVjdCB1ZGZfcGFydF9tYXAgKm1hcDsKKwlzdHJ1Y3QgdWRmX3NiX2luZm8gKnNiaTsKIAogCXAgPSAoc3RydWN0IHBhcnRpdGlvbkRlc2MgKiliaC0+Yl9kYXRhOworCXNiaSA9IFVERl9TQihzYik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgVURGX1NCX05VTVBBUlRTKHNiKTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHNiaS0+c19wYXJ0aXRpb25zOyBpKyspIHsKKwkJbWFwID0gJnNiaS0+c19wYXJ0bWFwc1tpXTsKIAkJdWRmX2RlYnVnKCJTZWFyY2hpbmcgbWFwOiAoJWQgPT0gJWQpXG4iLAotCQkJICBVREZfU0JfUEFSVE1BUFMoc2IpW2ldLnNfcGFydGl0aW9uX251bSwgbGUxNl90b19jcHUocC0+cGFydGl0aW9uTnVtYmVyKSk7Ci0JCWlmIChVREZfU0JfUEFSVE1BUFMoc2IpW2ldLnNfcGFydGl0aW9uX251bSA9PSBsZTE2X3RvX2NwdShwLT5wYXJ0aXRpb25OdW1iZXIpKSB7Ci0JCQlVREZfU0JfUEFSVExFTihzYixpKSA9IGxlMzJfdG9fY3B1KHAtPnBhcnRpdGlvbkxlbmd0aCk7IC8qIGJsb2NrcyAqLwotCQkJVURGX1NCX1BBUlRST09UKHNiLGkpID0gbGUzMl90b19jcHUocC0+cGFydGl0aW9uU3RhcnRpbmdMb2NhdGlvbik7Ci0JCQlpZiAobGUzMl90b19jcHUocC0+YWNjZXNzVHlwZSkgPT0gUERfQUNDRVNTX1RZUEVfUkVBRF9PTkxZKQotCQkJCVVERl9TQl9QQVJURkxBR1Moc2IsaSkgfD0gVURGX1BBUlRfRkxBR19SRUFEX09OTFk7Ci0JCQlpZiAobGUzMl90b19jcHUocC0+YWNjZXNzVHlwZSkgPT0gUERfQUNDRVNTX1RZUEVfV1JJVEVfT05DRSkKLQkJCQlVREZfU0JfUEFSVEZMQUdTKHNiLGkpIHw9IFVERl9QQVJUX0ZMQUdfV1JJVEVfT05DRTsKLQkJCWlmIChsZTMyX3RvX2NwdShwLT5hY2Nlc3NUeXBlKSA9PSBQRF9BQ0NFU1NfVFlQRV9SRVdSSVRBQkxFKQotCQkJCVVERl9TQl9QQVJURkxBR1Moc2IsaSkgfD0gVURGX1BBUlRfRkxBR19SRVdSSVRBQkxFOwotCQkJaWYgKGxlMzJfdG9fY3B1KHAtPmFjY2Vzc1R5cGUpID09IFBEX0FDQ0VTU19UWVBFX09WRVJXUklUQUJMRSkKLQkJCQlVREZfU0JfUEFSVEZMQUdTKHNiLGkpIHw9IFVERl9QQVJUX0ZMQUdfT1ZFUldSSVRBQkxFOworCQkJICBtYXAtPnNfcGFydGl0aW9uX251bSwKKwkJCSAgbGUxNl90b19jcHUocC0+cGFydGl0aW9uTnVtYmVyKSk7CisJCWlmIChtYXAtPnNfcGFydGl0aW9uX251bSA9PQorCQkJCWxlMTZfdG9fY3B1KHAtPnBhcnRpdGlvbk51bWJlcikpIHsKKwkJCW1hcC0+c19wYXJ0aXRpb25fbGVuID0KKwkJCQlsZTMyX3RvX2NwdShwLT5wYXJ0aXRpb25MZW5ndGgpOyAvKiBibG9ja3MgKi8KKwkJCW1hcC0+c19wYXJ0aXRpb25fcm9vdCA9CisJCQkJbGUzMl90b19jcHUocC0+cGFydGl0aW9uU3RhcnRpbmdMb2NhdGlvbik7CisJCQlpZiAocC0+YWNjZXNzVHlwZSA9PQorCQkJCQljcHVfdG9fbGUzMihQRF9BQ0NFU1NfVFlQRV9SRUFEX09OTFkpKQorCQkJCW1hcC0+c19wYXJ0aXRpb25fZmxhZ3MgfD0KKwkJCQkJCVVERl9QQVJUX0ZMQUdfUkVBRF9PTkxZOworCQkJaWYgKHAtPmFjY2Vzc1R5cGUgPT0KKwkJCQkJY3B1X3RvX2xlMzIoUERfQUNDRVNTX1RZUEVfV1JJVEVfT05DRSkpCisJCQkJbWFwLT5zX3BhcnRpdGlvbl9mbGFncyB8PQorCQkJCQkJVURGX1BBUlRfRkxBR19XUklURV9PTkNFOworCQkJaWYgKHAtPmFjY2Vzc1R5cGUgPT0KKwkJCQkJY3B1X3RvX2xlMzIoUERfQUNDRVNTX1RZUEVfUkVXUklUQUJMRSkpCisJCQkJbWFwLT5zX3BhcnRpdGlvbl9mbGFncyB8PQorCQkJCQkJVURGX1BBUlRfRkxBR19SRVdSSVRBQkxFOworCQkJaWYgKHAtPmFjY2Vzc1R5cGUgPT0KKwkJCQkgICAgY3B1X3RvX2xlMzIoUERfQUNDRVNTX1RZUEVfT1ZFUldSSVRBQkxFKSkKKwkJCQltYXAtPnNfcGFydGl0aW9uX2ZsYWdzIHw9CisJCQkJCQlVREZfUEFSVF9GTEFHX09WRVJXUklUQUJMRTsKIAotCQkJaWYgKCFzdHJjbXAocC0+cGFydGl0aW9uQ29udGVudHMuaWRlbnQsIFBEX1BBUlRJVElPTl9DT05URU5UU19OU1IwMikgfHwKLQkJCSAgICAhc3RyY21wKHAtPnBhcnRpdGlvbkNvbnRlbnRzLmlkZW50LCBQRF9QQVJUSVRJT05fQ09OVEVOVFNfTlNSMDMpKSB7CisJCQlpZiAoIXN0cmNtcChwLT5wYXJ0aXRpb25Db250ZW50cy5pZGVudCwKKwkJCQkgICAgUERfUEFSVElUSU9OX0NPTlRFTlRTX05TUjAyKSB8fAorCQkJICAgICFzdHJjbXAocC0+cGFydGl0aW9uQ29udGVudHMuaWRlbnQsCisJCQkJICAgIFBEX1BBUlRJVElPTl9DT05URU5UU19OU1IwMykpIHsKIAkJCQlzdHJ1Y3QgcGFydGl0aW9uSGVhZGVyRGVzYyAqcGhkOwogCi0JCQkJcGhkID0gKHN0cnVjdCBwYXJ0aXRpb25IZWFkZXJEZXNjICopKHAtPnBhcnRpdGlvbkNvbnRlbnRzVXNlKTsKKwkJCQlwaGQgPSAoc3RydWN0IHBhcnRpdGlvbkhlYWRlckRlc2MgKikKKwkJCQkJCShwLT5wYXJ0aXRpb25Db250ZW50c1VzZSk7CiAJCQkJaWYgKHBoZC0+dW5hbGxvY1NwYWNlVGFibGUuZXh0TGVuZ3RoKSB7CiAJCQkJCWtlcm5lbF9sYl9hZGRyIGxvYyA9IHsKIAkJCQkJCS5sb2dpY2FsQmxvY2tOdW0gPSBsZTMyX3RvX2NwdShwaGQtPnVuYWxsb2NTcGFjZVRhYmxlLmV4dFBvc2l0aW9uKSwKIAkJCQkJCS5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPSBpLAogCQkJCQl9OwogCi0JCQkJCVVERl9TQl9QQVJUTUFQUyhzYilbaV0uc191c3BhY2Uuc190YWJsZSA9CisJCQkJCW1hcC0+c191c3BhY2Uuc190YWJsZSA9CiAJCQkJCQl1ZGZfaWdldChzYiwgbG9jKTsKLQkJCQkJaWYgKCFVREZfU0JfUEFSVE1BUFMoc2IpW2ldLnNfdXNwYWNlLnNfdGFibGUpIHsKKwkJCQkJaWYgKCFtYXAtPnNfdXNwYWNlLnNfdGFibGUpIHsKIAkJCQkJCXVkZl9kZWJ1ZygiY2Fubm90IGxvYWQgdW5hbGxvY1NwYWNlVGFibGUgKHBhcnQgJWQpXG4iLCBpKTsKIAkJCQkJCXJldHVybiAxOwogCQkJCQl9Ci0JCQkJCVVERl9TQl9QQVJURkxBR1Moc2IsaSkgfD0gVURGX1BBUlRfRkxBR19VTkFMTE9DX1RBQkxFOworCQkJCQltYXAtPnNfcGFydGl0aW9uX2ZsYWdzIHw9CisJCQkJCQlVREZfUEFSVF9GTEFHX1VOQUxMT0NfVEFCTEU7CiAJCQkJCXVkZl9kZWJ1ZygidW5hbGxvY1NwYWNlVGFibGUgKHBhcnQgJWQpIEAgJWxkXG4iLAotCQkJCQkJICBpLCBVREZfU0JfUEFSVE1BUFMoc2IpW2ldLnNfdXNwYWNlLnNfdGFibGUtPmlfaW5vKTsKKwkJCQkJCSAgaSwgbWFwLT5zX3VzcGFjZS5zX3RhYmxlLT5pX2lubyk7CiAJCQkJfQogCQkJCWlmIChwaGQtPnVuYWxsb2NTcGFjZUJpdG1hcC5leHRMZW5ndGgpIHsKLQkJCQkJVURGX1NCX0FMTE9DX0JJVE1BUChzYiwgaSwgc191c3BhY2UpOwotCQkJCQlpZiAoVURGX1NCX1BBUlRNQVBTKHNiKVtpXS5zX3VzcGFjZS5zX2JpdG1hcCAhPSBOVUxMKSB7Ci0JCQkJCQlVREZfU0JfUEFSVE1BUFMoc2IpW2ldLnNfdXNwYWNlLnNfYml0bWFwLT5zX2V4dExlbmd0aCA9CisJCQkJCXN0cnVjdCB1ZGZfYml0bWFwICpiaXRtYXAgPQorCQkJCQkJdWRmX3NiX2FsbG9jX2JpdG1hcChzYiwgaSk7CisJCQkJCW1hcC0+c191c3BhY2Uuc19iaXRtYXAgPSBiaXRtYXA7CisJCQkJCWlmIChiaXRtYXAgIT0gTlVMTCkgeworCQkJCQkJYml0bWFwLT5zX2V4dExlbmd0aCA9CiAJCQkJCQkJbGUzMl90b19jcHUocGhkLT51bmFsbG9jU3BhY2VCaXRtYXAuZXh0TGVuZ3RoKTsKLQkJCQkJCVVERl9TQl9QQVJUTUFQUyhzYilbaV0uc191c3BhY2Uuc19iaXRtYXAtPnNfZXh0UG9zaXRpb24gPQorCQkJCQkJYml0bWFwLT5zX2V4dFBvc2l0aW9uID0KIAkJCQkJCQlsZTMyX3RvX2NwdShwaGQtPnVuYWxsb2NTcGFjZUJpdG1hcC5leHRQb3NpdGlvbik7Ci0JCQkJCQlVREZfU0JfUEFSVEZMQUdTKHNiLGkpIHw9IFVERl9QQVJUX0ZMQUdfVU5BTExPQ19CSVRNQVA7CisJCQkJCQltYXAtPnNfcGFydGl0aW9uX2ZsYWdzIHw9IFVERl9QQVJUX0ZMQUdfVU5BTExPQ19CSVRNQVA7CiAJCQkJCQl1ZGZfZGVidWcoInVuYWxsb2NTcGFjZUJpdG1hcCAocGFydCAlZCkgQCAlZFxuIiwKLQkJCQkJCQkgIGksIFVERl9TQl9QQVJUTUFQUyhzYilbaV0uc191c3BhY2Uuc19iaXRtYXAtPnNfZXh0UG9zaXRpb24pOworCQkJCQkJCSAgaSwgYml0bWFwLT5zX2V4dFBvc2l0aW9uKTsKIAkJCQkJfQogCQkJCX0KIAkJCQlpZiAocGhkLT5wYXJ0aXRpb25JbnRlZ3JpdHlUYWJsZS5leHRMZW5ndGgpCkBAIC05NDAsNDAgKzExNDQsNDUgQEAKIAkJCQkJCS5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPSBpLAogCQkJCQl9OwogCi0JCQkJCVVERl9TQl9QQVJUTUFQUyhzYilbaV0uc19mc3BhY2Uuc190YWJsZSA9CisJCQkJCW1hcC0+c19mc3BhY2Uuc190YWJsZSA9CiAJCQkJCQl1ZGZfaWdldChzYiwgbG9jKTsKLQkJCQkJaWYgKCFVREZfU0JfUEFSVE1BUFMoc2IpW2ldLnNfZnNwYWNlLnNfdGFibGUpIHsKKwkJCQkJaWYgKCFtYXAtPnNfZnNwYWNlLnNfdGFibGUpIHsKIAkJCQkJCXVkZl9kZWJ1ZygiY2Fubm90IGxvYWQgZnJlZWRTcGFjZVRhYmxlIChwYXJ0ICVkKVxuIiwgaSk7CiAJCQkJCQlyZXR1cm4gMTsKIAkJCQkJfQotCQkJCQlVREZfU0JfUEFSVEZMQUdTKHNiLGkpIHw9IFVERl9QQVJUX0ZMQUdfRlJFRURfVEFCTEU7CisJCQkJCW1hcC0+c19wYXJ0aXRpb25fZmxhZ3MgfD0KKwkJCQkJCVVERl9QQVJUX0ZMQUdfRlJFRURfVEFCTEU7CiAJCQkJCXVkZl9kZWJ1ZygiZnJlZWRTcGFjZVRhYmxlIChwYXJ0ICVkKSBAICVsZFxuIiwKLQkJCQkJCSAgaSwgVURGX1NCX1BBUlRNQVBTKHNiKVtpXS5zX2ZzcGFjZS5zX3RhYmxlLT5pX2lubyk7CisJCQkJCQkgIGksIG1hcC0+c19mc3BhY2Uuc190YWJsZS0+aV9pbm8pOwogCQkJCX0KIAkJCQlpZiAocGhkLT5mcmVlZFNwYWNlQml0bWFwLmV4dExlbmd0aCkgewotCQkJCQlVREZfU0JfQUxMT0NfQklUTUFQKHNiLCBpLCBzX2ZzcGFjZSk7Ci0JCQkJCWlmIChVREZfU0JfUEFSVE1BUFMoc2IpW2ldLnNfZnNwYWNlLnNfYml0bWFwICE9IE5VTEwpIHsKLQkJCQkJCVVERl9TQl9QQVJUTUFQUyhzYilbaV0uc19mc3BhY2Uuc19iaXRtYXAtPnNfZXh0TGVuZ3RoID0KKwkJCQkJc3RydWN0IHVkZl9iaXRtYXAgKmJpdG1hcCA9CisJCQkJCQl1ZGZfc2JfYWxsb2NfYml0bWFwKHNiLCBpKTsKKwkJCQkJbWFwLT5zX2ZzcGFjZS5zX2JpdG1hcCA9IGJpdG1hcDsKKwkJCQkJaWYgKGJpdG1hcCAhPSBOVUxMKSB7CisJCQkJCQliaXRtYXAtPnNfZXh0TGVuZ3RoID0KIAkJCQkJCQlsZTMyX3RvX2NwdShwaGQtPmZyZWVkU3BhY2VCaXRtYXAuZXh0TGVuZ3RoKTsKLQkJCQkJCVVERl9TQl9QQVJUTUFQUyhzYilbaV0uc19mc3BhY2Uuc19iaXRtYXAtPnNfZXh0UG9zaXRpb24gPQorCQkJCQkJYml0bWFwLT5zX2V4dFBvc2l0aW9uID0KIAkJCQkJCQlsZTMyX3RvX2NwdShwaGQtPmZyZWVkU3BhY2VCaXRtYXAuZXh0UG9zaXRpb24pOwotCQkJCQkJVURGX1NCX1BBUlRGTEFHUyhzYixpKSB8PSBVREZfUEFSVF9GTEFHX0ZSRUVEX0JJVE1BUDsKKwkJCQkJCW1hcC0+c19wYXJ0aXRpb25fZmxhZ3MgfD0gVURGX1BBUlRfRkxBR19GUkVFRF9CSVRNQVA7CiAJCQkJCQl1ZGZfZGVidWcoImZyZWVkU3BhY2VCaXRtYXAgKHBhcnQgJWQpIEAgJWRcbiIsCi0JCQkJCQkJICBpLCBVREZfU0JfUEFSVE1BUFMoc2IpW2ldLnNfZnNwYWNlLnNfYml0bWFwLT5zX2V4dFBvc2l0aW9uKTsKKwkJCQkJCQkgIGksIGJpdG1hcC0+c19leHRQb3NpdGlvbik7CiAJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCQlicmVhazsKIAkJfQogCX0KLQlpZiAoaSA9PSBVREZfU0JfTlVNUEFSVFMoc2IpKSB7CisJaWYgKGkgPT0gc2JpLT5zX3BhcnRpdGlvbnMpCiAJCXVkZl9kZWJ1ZygiUGFydGl0aW9uICglZCkgbm90IGZvdW5kIGluIHBhcnRpdGlvbiBtYXBcbiIsCiAJCQkgIGxlMTZfdG9fY3B1KHAtPnBhcnRpdGlvbk51bWJlcikpOwotCX0gZWxzZSB7Ci0JCXVkZl9kZWJ1ZygiUGFydGl0aW9uICglZDolZCB0eXBlICV4KSBzdGFydHMgYXQgcGh5c2ljYWwgJWQsIGJsb2NrIGxlbmd0aCAlZFxuIiwKLQkJCSAgbGUxNl90b19jcHUocC0+cGFydGl0aW9uTnVtYmVyKSwgaSwgVURGX1NCX1BBUlRUWVBFKHNiLGkpLAotCQkJICBVREZfU0JfUEFSVFJPT1Qoc2IsaSksIFVERl9TQl9QQVJUTEVOKHNiLGkpKTsKLQl9CisJZWxzZQorCQl1ZGZfZGVidWcoIlBhcnRpdGlvbiAoJWQ6JWQgdHlwZSAleCkgc3RhcnRzIGF0IHBoeXNpY2FsICVkLCAiCisJCQkgICJibG9jayBsZW5ndGggJWRcbiIsCisJCQkgIGxlMTZfdG9fY3B1KHAtPnBhcnRpdGlvbk51bWJlciksIGksCisJCQkgIG1hcC0+c19wYXJ0aXRpb25fdHlwZSwKKwkJCSAgbWFwLT5zX3BhcnRpdGlvbl9yb290LAorCQkJICBtYXAtPnNfcGFydGl0aW9uX2xlbik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk4Myw3MCArMTE5MiwxMDUgQEAKIAlzdHJ1Y3QgbG9naWNhbFZvbERlc2MgKmx2ZDsKIAlpbnQgaSwgaiwgb2Zmc2V0OwogCXVpbnQ4X3QgdHlwZTsKKwlzdHJ1Y3QgdWRmX3NiX2luZm8gKnNiaSA9IFVERl9TQihzYik7CisJc3RydWN0IGdlbmVyaWNQYXJ0aXRpb25NYXAgKmdwbTsKIAogCWx2ZCA9IChzdHJ1Y3QgbG9naWNhbFZvbERlc2MgKiliaC0+Yl9kYXRhOwogCi0JVURGX1NCX0FMTE9DX1BBUlRNQVBTKHNiLCBsZTMyX3RvX2NwdShsdmQtPm51bVBhcnRpdGlvbk1hcHMpKTsKKwlpID0gdWRmX3NiX2FsbG9jX3BhcnRpdGlvbl9tYXBzKHNiLCBsZTMyX3RvX2NwdShsdmQtPm51bVBhcnRpdGlvbk1hcHMpKTsKKwlpZiAoaSAhPSAwKQorCQlyZXR1cm4gaTsKIAogCWZvciAoaSA9IDAsIG9mZnNldCA9IDA7Ci0JICAgICBpIDwgVURGX1NCX05VTVBBUlRTKHNiKSAmJiBvZmZzZXQgPCBsZTMyX3RvX2NwdShsdmQtPm1hcFRhYmxlTGVuZ3RoKTsKLQkgICAgIGkrKywgb2Zmc2V0ICs9ICgoc3RydWN0IGdlbmVyaWNQYXJ0aXRpb25NYXAgKikmKGx2ZC0+cGFydGl0aW9uTWFwc1tvZmZzZXRdKSktPnBhcnRpdGlvbk1hcExlbmd0aCkgewotCQl0eXBlID0gKChzdHJ1Y3QgZ2VuZXJpY1BhcnRpdGlvbk1hcCAqKSYobHZkLT5wYXJ0aXRpb25NYXBzW29mZnNldF0pKS0+cGFydGl0aW9uTWFwVHlwZTsKKwkgICAgIGkgPCBzYmktPnNfcGFydGl0aW9ucyAmJiBvZmZzZXQgPCBsZTMyX3RvX2NwdShsdmQtPm1hcFRhYmxlTGVuZ3RoKTsKKwkgICAgIGkrKywgb2Zmc2V0ICs9IGdwbS0+cGFydGl0aW9uTWFwTGVuZ3RoKSB7CisJCXN0cnVjdCB1ZGZfcGFydF9tYXAgKm1hcCA9ICZzYmktPnNfcGFydG1hcHNbaV07CisJCWdwbSA9IChzdHJ1Y3QgZ2VuZXJpY1BhcnRpdGlvbk1hcCAqKQorCQkJCSYobHZkLT5wYXJ0aXRpb25NYXBzW29mZnNldF0pOworCQl0eXBlID0gZ3BtLT5wYXJ0aXRpb25NYXBUeXBlOwogCQlpZiAodHlwZSA9PSAxKSB7Ci0JCQlzdHJ1Y3QgZ2VuZXJpY1BhcnRpdGlvbk1hcDEgKmdwbTEgPSAoc3RydWN0IGdlbmVyaWNQYXJ0aXRpb25NYXAxICopJihsdmQtPnBhcnRpdGlvbk1hcHNbb2Zmc2V0XSk7Ci0JCQlVREZfU0JfUEFSVFRZUEUoc2IsaSkgPSBVREZfVFlQRTFfTUFQMTU7Ci0JCQlVREZfU0JfUEFSVFZTTihzYixpKSA9IGxlMTZfdG9fY3B1KGdwbTEtPnZvbFNlcU51bSk7Ci0JCQlVREZfU0JfUEFSVE5VTShzYixpKSA9IGxlMTZfdG9fY3B1KGdwbTEtPnBhcnRpdGlvbk51bSk7Ci0JCQlVREZfU0JfUEFSVEZVTkMoc2IsaSkgPSBOVUxMOworCQkJc3RydWN0IGdlbmVyaWNQYXJ0aXRpb25NYXAxICpncG0xID0KKwkJCQkoc3RydWN0IGdlbmVyaWNQYXJ0aXRpb25NYXAxICopZ3BtOworCQkJbWFwLT5zX3BhcnRpdGlvbl90eXBlID0gVURGX1RZUEUxX01BUDE1OworCQkJbWFwLT5zX3ZvbHVtZXNlcW51bSA9IGxlMTZfdG9fY3B1KGdwbTEtPnZvbFNlcU51bSk7CisJCQltYXAtPnNfcGFydGl0aW9uX251bSA9IGxlMTZfdG9fY3B1KGdwbTEtPnBhcnRpdGlvbk51bSk7CisJCQltYXAtPnNfcGFydGl0aW9uX2Z1bmMgPSBOVUxMOwogCQl9IGVsc2UgaWYgKHR5cGUgPT0gMikgewotCQkJc3RydWN0IHVkZlBhcnRpdGlvbk1hcDIgKnVwbTIgPSAoc3RydWN0IHVkZlBhcnRpdGlvbk1hcDIgKikmKGx2ZC0+cGFydGl0aW9uTWFwc1tvZmZzZXRdKTsKLQkJCWlmICghc3RybmNtcCh1cG0yLT5wYXJ0SWRlbnQuaWRlbnQsIFVERl9JRF9WSVJUVUFMLCBzdHJsZW4oVURGX0lEX1ZJUlRVQUwpKSkgewotCQkJCWlmIChsZTE2X3RvX2NwdSgoKF9fbGUxNiAqKXVwbTItPnBhcnRJZGVudC5pZGVudFN1ZmZpeClbMF0pID09IDB4MDE1MCkgewotCQkJCQlVREZfU0JfUEFSVFRZUEUoc2IsaSkgPSBVREZfVklSVFVBTF9NQVAxNTsKLQkJCQkJVURGX1NCX1BBUlRGVU5DKHNiLGkpID0gdWRmX2dldF9wYmxvY2tfdmlydDE1OwotCQkJCX0gZWxzZSBpZiAobGUxNl90b19jcHUoKChfX2xlMTYgKil1cG0yLT5wYXJ0SWRlbnQuaWRlbnRTdWZmaXgpWzBdKSA9PSAweDAyMDApIHsKLQkJCQkJVURGX1NCX1BBUlRUWVBFKHNiLGkpID0gVURGX1ZJUlRVQUxfTUFQMjA7Ci0JCQkJCVVERl9TQl9QQVJURlVOQyhzYixpKSA9IHVkZl9nZXRfcGJsb2NrX3ZpcnQyMDsKKwkJCXN0cnVjdCB1ZGZQYXJ0aXRpb25NYXAyICp1cG0yID0KKwkJCQkJCShzdHJ1Y3QgdWRmUGFydGl0aW9uTWFwMiAqKWdwbTsKKwkJCWlmICghc3RybmNtcCh1cG0yLT5wYXJ0SWRlbnQuaWRlbnQsIFVERl9JRF9WSVJUVUFMLAorCQkJCQkJc3RybGVuKFVERl9JRF9WSVJUVUFMKSkpIHsKKwkJCQl1MTYgc3VmID0KKwkJCQkJbGUxNl90b19jcHUoKChfX2xlMTYgKil1cG0yLT5wYXJ0SWRlbnQuCisJCQkJCQkJaWRlbnRTdWZmaXgpWzBdKTsKKwkJCQlpZiAoc3VmID09IDB4MDE1MCkgeworCQkJCQltYXAtPnNfcGFydGl0aW9uX3R5cGUgPQorCQkJCQkJCVVERl9WSVJUVUFMX01BUDE1OworCQkJCQltYXAtPnNfcGFydGl0aW9uX2Z1bmMgPQorCQkJCQkJCXVkZl9nZXRfcGJsb2NrX3ZpcnQxNTsKKwkJCQl9IGVsc2UgaWYgKHN1ZiA9PSAweDAyMDApIHsKKwkJCQkJbWFwLT5zX3BhcnRpdGlvbl90eXBlID0KKwkJCQkJCQlVREZfVklSVFVBTF9NQVAyMDsKKwkJCQkJbWFwLT5zX3BhcnRpdGlvbl9mdW5jID0KKwkJCQkJCQl1ZGZfZ2V0X3BibG9ja192aXJ0MjA7CiAJCQkJfQotCQkJfSBlbHNlIGlmICghc3RybmNtcCh1cG0yLT5wYXJ0SWRlbnQuaWRlbnQsIFVERl9JRF9TUEFSQUJMRSwgc3RybGVuKFVERl9JRF9TUEFSQUJMRSkpKSB7CisJCQl9IGVsc2UgaWYgKCFzdHJuY21wKHVwbTItPnBhcnRJZGVudC5pZGVudCwKKwkJCQkJCVVERl9JRF9TUEFSQUJMRSwKKwkJCQkJCXN0cmxlbihVREZfSURfU1BBUkFCTEUpKSkgewogCQkJCXVpbnQzMl90IGxvYzsKIAkJCQl1aW50MTZfdCBpZGVudDsKIAkJCQlzdHJ1Y3Qgc3BhcmluZ1RhYmxlICpzdDsKLQkJCQlzdHJ1Y3Qgc3BhcmFibGVQYXJ0aXRpb25NYXAgKnNwbSA9IChzdHJ1Y3Qgc3BhcmFibGVQYXJ0aXRpb25NYXAgKikmKGx2ZC0+cGFydGl0aW9uTWFwc1tvZmZzZXRdKTsKKwkJCQlzdHJ1Y3Qgc3BhcmFibGVQYXJ0aXRpb25NYXAgKnNwbSA9CisJCQkJCShzdHJ1Y3Qgc3BhcmFibGVQYXJ0aXRpb25NYXAgKilncG07CiAKLQkJCQlVREZfU0JfUEFSVFRZUEUoc2IsaSkgPSBVREZfU1BBUkFCTEVfTUFQMTU7Ci0JCQkJVURGX1NCX1RZUEVTUEFSKHNiLGkpLnNfcGFja2V0X2xlbiA9IGxlMTZfdG9fY3B1KHNwbS0+cGFja2V0TGVuZ3RoKTsKKwkJCQltYXAtPnNfcGFydGl0aW9uX3R5cGUgPSBVREZfU1BBUkFCTEVfTUFQMTU7CisJCQkJbWFwLT5zX3R5cGVfc3BlY2lmaWMuc19zcGFyaW5nLnNfcGFja2V0X2xlbiA9CisJCQkJCQlsZTE2X3RvX2NwdShzcG0tPnBhY2tldExlbmd0aCk7CiAJCQkJZm9yIChqID0gMDsgaiA8IHNwbS0+bnVtU3BhcmluZ1RhYmxlczsgaisrKSB7Ci0JCQkJCWxvYyA9IGxlMzJfdG9fY3B1KHNwbS0+bG9jU3BhcmluZ1RhYmxlW2pdKTsKLQkJCQkJVURGX1NCX1RZUEVTUEFSKHNiLGkpLnNfc3Bhcl9tYXBbal0gPQotCQkJCQkJdWRmX3JlYWRfdGFnZ2VkKHNiLCBsb2MsIGxvYywgJmlkZW50KTsKLQkJCQkJaWYgKFVERl9TQl9UWVBFU1BBUihzYixpKS5zX3NwYXJfbWFwW2pdICE9IE5VTEwpIHsKLQkJCQkJCXN0ID0gKHN0cnVjdCBzcGFyaW5nVGFibGUgKilVREZfU0JfVFlQRVNQQVIoc2IsaSkuc19zcGFyX21hcFtqXS0+Yl9kYXRhOwotCQkJCQkJaWYgKGlkZW50ICE9IDAgfHwKLQkJCQkJCSAgICBzdHJuY21wKHN0LT5zcGFyaW5nSWRlbnQuaWRlbnQsIFVERl9JRF9TUEFSSU5HLCBzdHJsZW4oVURGX0lEX1NQQVJJTkcpKSkgewotCQkJCQkJCWJyZWxzZShVREZfU0JfVFlQRVNQQVIoc2IsaSkuc19zcGFyX21hcFtqXSk7Ci0JCQkJCQkJVURGX1NCX1RZUEVTUEFSKHNiLGkpLnNfc3Bhcl9tYXBbal0gPSBOVUxMOworCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMjsKKworCQkJCQlsb2MgPSBsZTMyX3RvX2NwdSgKKwkJCQkJCXNwbS0+bG9jU3BhcmluZ1RhYmxlW2pdKTsKKwkJCQkJYmgyID0gdWRmX3JlYWRfdGFnZ2VkKHNiLCBsb2MsIGxvYywKKwkJCQkJCQkgICAgICZpZGVudCk7CisJCQkJCW1hcC0+c190eXBlX3NwZWNpZmljLnNfc3BhcmluZy4KKwkJCQkJCQlzX3NwYXJfbWFwW2pdID0gYmgyOworCisJCQkJCWlmIChiaDIgIT0gTlVMTCkgeworCQkJCQkJc3QgPSAoc3RydWN0IHNwYXJpbmdUYWJsZSAqKQorCQkJCQkJCQliaDItPmJfZGF0YTsKKwkJCQkJCWlmIChpZGVudCAhPSAwIHx8IHN0cm5jbXAoCisJCQkJCQkJc3QtPnNwYXJpbmdJZGVudC5pZGVudCwKKwkJCQkJCQlVREZfSURfU1BBUklORywKKwkJCQkJCQlzdHJsZW4oVURGX0lEX1NQQVJJTkcpKSkgeworCQkJCQkJCWJyZWxzZShiaDIpOworCQkJCQkJCW1hcC0+c190eXBlX3NwZWNpZmljLgorCQkJCQkJCQlzX3NwYXJpbmcuCisJCQkJCQkJCXNfc3Bhcl9tYXBbal0gPQorCQkJCQkJCQkJTlVMTDsKIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0KLQkJCQlVREZfU0JfUEFSVEZVTkMoc2IsaSkgPSB1ZGZfZ2V0X3BibG9ja19zcGFyMTU7CisJCQkJbWFwLT5zX3BhcnRpdGlvbl9mdW5jID0gdWRmX2dldF9wYmxvY2tfc3BhcjE1OwogCQkJfSBlbHNlIHsKLQkJCQl1ZGZfZGVidWcoIlVua25vd24gaWRlbnQ6ICVzXG4iLCB1cG0yLT5wYXJ0SWRlbnQuaWRlbnQpOworCQkJCXVkZl9kZWJ1ZygiVW5rbm93biBpZGVudDogJXNcbiIsCisJCQkJCSAgdXBtMi0+cGFydElkZW50LmlkZW50KTsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCVVERl9TQl9QQVJUVlNOKHNiLGkpID0gbGUxNl90b19jcHUodXBtMi0+dm9sU2VxTnVtKTsKLQkJCVVERl9TQl9QQVJUTlVNKHNiLGkpID0gbGUxNl90b19jcHUodXBtMi0+cGFydGl0aW9uTnVtKTsKKwkJCW1hcC0+c192b2x1bWVzZXFudW0gPSBsZTE2X3RvX2NwdSh1cG0yLT52b2xTZXFOdW0pOworCQkJbWFwLT5zX3BhcnRpdGlvbl9udW0gPSBsZTE2X3RvX2NwdSh1cG0yLT5wYXJ0aXRpb25OdW0pOwogCQl9CiAJCXVkZl9kZWJ1ZygiUGFydGl0aW9uICglZDolZCkgdHlwZSAlZCBvbiB2b2x1bWUgJWRcbiIsCi0JCQkgIGksIFVERl9TQl9QQVJUTlVNKHNiLGkpLCB0eXBlLCBVREZfU0JfUEFSVFZTTihzYixpKSk7CisJCQkgIGksIG1hcC0+c19wYXJ0aXRpb25fbnVtLCB0eXBlLAorCQkJICBtYXAtPnNfdm9sdW1lc2VxbnVtKTsKIAl9CiAKIAlpZiAoZmlsZXNldCkgewogCQlsb25nX2FkICpsYSA9IChsb25nX2FkICopJihsdmQtPmxvZ2ljYWxWb2xDb250ZW50c1VzZVswXSk7CiAKIAkJKmZpbGVzZXQgPSBsZWxiX3RvX2NwdShsYS0+ZXh0TG9jYXRpb24pOwotCQl1ZGZfZGVidWcoIkZpbGVTZXQgZm91bmQgaW4gTG9naWNhbFZvbERlc2MgYXQgYmxvY2s9JWQsIHBhcnRpdGlvbj0lZFxuIiwKLQkJCSAgZmlsZXNldC0+bG9naWNhbEJsb2NrTnVtLAorCQl1ZGZfZGVidWcoIkZpbGVTZXQgZm91bmQgaW4gTG9naWNhbFZvbERlc2MgYXQgYmxvY2s9JWQsICIKKwkJCSAgInBhcnRpdGlvbj0lZFxuIiwgZmlsZXNldC0+bG9naWNhbEJsb2NrTnVtLAogCQkJICBmaWxlc2V0LT5wYXJ0aXRpb25SZWZlcmVuY2VOdW0pOwogCX0KIAlpZiAobHZkLT5pbnRlZ3JpdHlTZXFFeHQuZXh0TGVuZ3RoKQpAQCAtMTA2MywyMiArMTMwNywyNiBAQAogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOwogCXVpbnQxNl90IGlkZW50OworCXN0cnVjdCB1ZGZfc2JfaW5mbyAqc2JpID0gVURGX1NCKHNiKTsKKwlzdHJ1Y3QgbG9naWNhbFZvbEludGVncml0eURlc2MgKmx2aWQ7CiAKIAl3aGlsZSAobG9jLmV4dExlbmd0aCA+IDAgJiYKIAkgICAgICAgKGJoID0gdWRmX3JlYWRfdGFnZ2VkKHNiLCBsb2MuZXh0TG9jYXRpb24sCiAJCQkJICAgICBsb2MuZXh0TG9jYXRpb24sICZpZGVudCkpICYmCiAJICAgICAgIGlkZW50ID09IFRBR19JREVOVF9MVklEKSB7Ci0JCVVERl9TQl9MVklEQkgoc2IpID0gYmg7CisJCXNiaS0+c19sdmlkX2JoID0gYmg7CisJCWx2aWQgPSAoc3RydWN0IGxvZ2ljYWxWb2xJbnRlZ3JpdHlEZXNjICopYmgtPmJfZGF0YTsKIAotCQlpZiAoVURGX1NCX0xWSUQoc2IpLT5uZXh0SW50ZWdyaXR5RXh0LmV4dExlbmd0aCkKLQkJCXVkZl9sb2FkX2xvZ2ljYWx2b2xpbnQoc2IsIGxlZWFfdG9fY3B1KFVERl9TQl9MVklEKHNiKS0+bmV4dEludGVncml0eUV4dCkpOworCQlpZiAobHZpZC0+bmV4dEludGVncml0eUV4dC5leHRMZW5ndGgpCisJCQl1ZGZfbG9hZF9sb2dpY2Fsdm9saW50KHNiLAorCQkJCWxlZWFfdG9fY3B1KGx2aWQtPm5leHRJbnRlZ3JpdHlFeHQpKTsKIAotCQlpZiAoVURGX1NCX0xWSURCSChzYikgIT0gYmgpCisJCWlmIChzYmktPnNfbHZpZF9iaCAhPSBiaCkKIAkJCWJyZWxzZShiaCk7CiAJCWxvYy5leHRMZW5ndGggLT0gc2ItPnNfYmxvY2tzaXplOwogCQlsb2MuZXh0TG9jYXRpb24rKzsKIAl9Ci0JaWYgKFVERl9TQl9MVklEQkgoc2IpICE9IGJoKQorCWlmIChzYmktPnNfbHZpZF9iaCAhPSBiaCkKIAkJYnJlbHNlKGJoKTsKIH0KIApAQCAtMTA5NywxMSArMTM0NSwxMiBAQAogICoJSnVseSAxLCAxOTk3IC0gQW5kcmV3IEUuIE1pbGVza2kKICAqCVdyaXR0ZW4sIHRlc3RlZCwgYW5kIHJlbGVhc2VkLgogICovCi1zdGF0aWMgaW50IHVkZl9wcm9jZXNzX3NlcXVlbmNlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGxvbmcgYmxvY2ssIGxvbmcgbGFzdGJsb2NrLAotCQkJCSBrZXJuZWxfbGJfYWRkciAqZmlsZXNldCkKK3N0YXRpYyBpbnQgdWRmX3Byb2Nlc3Nfc2VxdWVuY2Uoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgbG9uZyBibG9jaywKKwkJCQlsb25nIGxhc3RibG9jaywga2VybmVsX2xiX2FkZHIgKmZpbGVzZXQpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CiAJc3RydWN0IHVkZl92ZHNfcmVjb3JkIHZkc1tWRFNfUE9TX0xFTkdUSF07CisJc3RydWN0IHVkZl92ZHNfcmVjb3JkICpjdXJyOwogCXN0cnVjdCBnZW5lcmljX2Rlc2MgKmdkOwogCXN0cnVjdCB2b2xEZXNjUHRyICp2ZHA7CiAJaW50IGRvbmUgPSAwOwpAQCAtMTEyNCw0MyArMTM3Myw1MSBAQAogCQl2ZHNuID0gbGUzMl90b19jcHUoZ2QtPnZvbERlc2NTZXFOdW0pOwogCQlzd2l0Y2ggKGlkZW50KSB7CiAJCWNhc2UgVEFHX0lERU5UX1BWRDogLyogSVNPIDEzMzQ2IDMvMTAuMSAqLwotCQkJaWYgKHZkc24gPj0gdmRzW1ZEU19QT1NfUFJJTUFSWV9WT0xfREVTQ10udm9sRGVzY1NlcU51bSkgewotCQkJCXZkc1tWRFNfUE9TX1BSSU1BUllfVk9MX0RFU0NdLnZvbERlc2NTZXFOdW0gPSB2ZHNuOwotCQkJCXZkc1tWRFNfUE9TX1BSSU1BUllfVk9MX0RFU0NdLmJsb2NrID0gYmxvY2s7CisJCQljdXJyID0gJnZkc1tWRFNfUE9TX1BSSU1BUllfVk9MX0RFU0NdOworCQkJaWYgKHZkc24gPj0gY3Vyci0+dm9sRGVzY1NlcU51bSkgeworCQkJCWN1cnItPnZvbERlc2NTZXFOdW0gPSB2ZHNuOworCQkJCWN1cnItPmJsb2NrID0gYmxvY2s7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBUQUdfSURFTlRfVkRQOiAvKiBJU08gMTMzNDYgMy8xMC4zICovCi0JCQlpZiAodmRzbiA+PSB2ZHNbVkRTX1BPU19WT0xfREVTQ19QVFJdLnZvbERlc2NTZXFOdW0pIHsKLQkJCQl2ZHNbVkRTX1BPU19WT0xfREVTQ19QVFJdLnZvbERlc2NTZXFOdW0gPSB2ZHNuOwotCQkJCXZkc1tWRFNfUE9TX1ZPTF9ERVNDX1BUUl0uYmxvY2sgPSBibG9jazsKKwkJCWN1cnIgPSAmdmRzW1ZEU19QT1NfVk9MX0RFU0NfUFRSXTsKKwkJCWlmICh2ZHNuID49IGN1cnItPnZvbERlc2NTZXFOdW0pIHsKKwkJCQljdXJyLT52b2xEZXNjU2VxTnVtID0gdmRzbjsKKwkJCQljdXJyLT5ibG9jayA9IGJsb2NrOwogCiAJCQkJdmRwID0gKHN0cnVjdCB2b2xEZXNjUHRyICopYmgtPmJfZGF0YTsKLQkJCQluZXh0X3MgPSBsZTMyX3RvX2NwdSh2ZHAtPm5leHRWb2xEZXNjU2VxRXh0LmV4dExvY2F0aW9uKTsKLQkJCQluZXh0X2UgPSBsZTMyX3RvX2NwdSh2ZHAtPm5leHRWb2xEZXNjU2VxRXh0LmV4dExlbmd0aCk7CisJCQkJbmV4dF9zID0gbGUzMl90b19jcHUoCisJCQkJCXZkcC0+bmV4dFZvbERlc2NTZXFFeHQuZXh0TG9jYXRpb24pOworCQkJCW5leHRfZSA9IGxlMzJfdG9fY3B1KAorCQkJCQl2ZHAtPm5leHRWb2xEZXNjU2VxRXh0LmV4dExlbmd0aCk7CiAJCQkJbmV4dF9lID0gbmV4dF9lID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwogCQkJCW5leHRfZSArPSBuZXh0X3M7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBUQUdfSURFTlRfSVVWRDogLyogSVNPIDEzMzQ2IDMvMTAuNCAqLwotCQkJaWYgKHZkc24gPj0gdmRzW1ZEU19QT1NfSU1QX1VTRV9WT0xfREVTQ10udm9sRGVzY1NlcU51bSkgewotCQkJCXZkc1tWRFNfUE9TX0lNUF9VU0VfVk9MX0RFU0NdLnZvbERlc2NTZXFOdW0gPSB2ZHNuOwotCQkJCXZkc1tWRFNfUE9TX0lNUF9VU0VfVk9MX0RFU0NdLmJsb2NrID0gYmxvY2s7CisJCQljdXJyID0gJnZkc1tWRFNfUE9TX0lNUF9VU0VfVk9MX0RFU0NdOworCQkJaWYgKHZkc24gPj0gY3Vyci0+dm9sRGVzY1NlcU51bSkgeworCQkJCWN1cnItPnZvbERlc2NTZXFOdW0gPSB2ZHNuOworCQkJCWN1cnItPmJsb2NrID0gYmxvY2s7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBUQUdfSURFTlRfUEQ6IC8qIElTTyAxMzM0NiAzLzEwLjUgKi8KLQkJCWlmICghdmRzW1ZEU19QT1NfUEFSVElUSU9OX0RFU0NdLmJsb2NrKQotCQkJCXZkc1tWRFNfUE9TX1BBUlRJVElPTl9ERVNDXS5ibG9jayA9IGJsb2NrOworCQkJY3VyciA9ICZ2ZHNbVkRTX1BPU19QQVJUSVRJT05fREVTQ107CisJCQlpZiAoIWN1cnItPmJsb2NrKQorCQkJCWN1cnItPmJsb2NrID0gYmxvY2s7CiAJCQlicmVhazsKIAkJY2FzZSBUQUdfSURFTlRfTFZEOiAvKiBJU08gMTMzNDYgMy8xMC42ICovCi0JCQlpZiAodmRzbiA+PSB2ZHNbVkRTX1BPU19MT0dJQ0FMX1ZPTF9ERVNDXS52b2xEZXNjU2VxTnVtKSB7Ci0JCQkJdmRzW1ZEU19QT1NfTE9HSUNBTF9WT0xfREVTQ10udm9sRGVzY1NlcU51bSA9IHZkc247Ci0JCQkJdmRzW1ZEU19QT1NfTE9HSUNBTF9WT0xfREVTQ10uYmxvY2sgPSBibG9jazsKKwkJCWN1cnIgPSAmdmRzW1ZEU19QT1NfTE9HSUNBTF9WT0xfREVTQ107CisJCQlpZiAodmRzbiA+PSBjdXJyLT52b2xEZXNjU2VxTnVtKSB7CisJCQkJY3Vyci0+dm9sRGVzY1NlcU51bSA9IHZkc247CisJCQkJY3Vyci0+YmxvY2sgPSBibG9jazsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFRBR19JREVOVF9VU0Q6IC8qIElTTyAxMzM0NiAzLzEwLjggKi8KLQkJCWlmICh2ZHNuID49IHZkc1tWRFNfUE9TX1VOQUxMT0NfU1BBQ0VfREVTQ10udm9sRGVzY1NlcU51bSkgewotCQkJCXZkc1tWRFNfUE9TX1VOQUxMT0NfU1BBQ0VfREVTQ10udm9sRGVzY1NlcU51bSA9IHZkc247Ci0JCQkJdmRzW1ZEU19QT1NfVU5BTExPQ19TUEFDRV9ERVNDXS5ibG9jayA9IGJsb2NrOworCQkJY3VyciA9ICZ2ZHNbVkRTX1BPU19VTkFMTE9DX1NQQUNFX0RFU0NdOworCQkJaWYgKHZkc24gPj0gY3Vyci0+dm9sRGVzY1NlcU51bSkgeworCQkJCWN1cnItPnZvbERlc2NTZXFOdW0gPSB2ZHNuOworCQkJCWN1cnItPmJsb2NrID0gYmxvY2s7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBUQUdfSURFTlRfVEQ6IC8qIElTTyAxMzM0NiAzLzEwLjkgKi8KQEAgLTExNjksMzIgKzE0MjYsMzggQEAKIAkJCQlibG9jayA9IG5leHRfczsKIAkJCQlsYXN0YmxvY2sgPSBuZXh0X2U7CiAJCQkJbmV4dF9zID0gbmV4dF9lID0gMDsKLQkJCX0gZWxzZSB7CisJCQl9IGVsc2UKIAkJCQlkb25lID0gMTsKLQkJCX0KIAkJCWJyZWFrOwogCQl9CiAJCWJyZWxzZShiaCk7CiAJfQogCWZvciAoaSA9IDA7IGkgPCBWRFNfUE9TX0xFTkdUSDsgaSsrKSB7CiAJCWlmICh2ZHNbaV0uYmxvY2spIHsKLQkJCWJoID0gdWRmX3JlYWRfdGFnZ2VkKHNiLCB2ZHNbaV0uYmxvY2ssIHZkc1tpXS5ibG9jaywgJmlkZW50KTsKKwkJCWJoID0gdWRmX3JlYWRfdGFnZ2VkKHNiLCB2ZHNbaV0uYmxvY2ssIHZkc1tpXS5ibG9jaywKKwkJCQkJICAgICAmaWRlbnQpOwogCiAJCQlpZiAoaSA9PSBWRFNfUE9TX1BSSU1BUllfVk9MX0RFU0MpIHsKIAkJCQl1ZGZfbG9hZF9wdm9sZGVzYyhzYiwgYmgpOwogCQkJfSBlbHNlIGlmIChpID09IFZEU19QT1NfTE9HSUNBTF9WT0xfREVTQykgewotCQkJCXVkZl9sb2FkX2xvZ2ljYWx2b2woc2IsIGJoLCBmaWxlc2V0KTsKKwkJCQlpZiAodWRmX2xvYWRfbG9naWNhbHZvbChzYiwgYmgsIGZpbGVzZXQpKSB7CisJCQkJCWJyZWxzZShiaCk7CisJCQkJCXJldHVybiAxOworCQkJCX0KIAkJCX0gZWxzZSBpZiAoaSA9PSBWRFNfUE9TX1BBUlRJVElPTl9ERVNDKSB7CiAJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDIgPSBOVUxMOwogCQkJCWlmICh1ZGZfbG9hZF9wYXJ0ZGVzYyhzYiwgYmgpKSB7CiAJCQkJCWJyZWxzZShiaCk7CiAJCQkJCXJldHVybiAxOwogCQkJCX0KLQkJCQlmb3IgKGogPSB2ZHNbaV0uYmxvY2sgKyAxOyBqIDwgIHZkc1tWRFNfUE9TX1RFUk1JTkFUSU5HX0RFU0NdLmJsb2NrOyBqKyspIHsKKwkJCQlmb3IgKGogPSB2ZHNbaV0uYmxvY2sgKyAxOworCQkJCSAgICAgaiA8ICB2ZHNbVkRTX1BPU19URVJNSU5BVElOR19ERVNDXS5ibG9jazsKKwkJCQkgICAgIGorKykgewogCQkJCQliaDIgPSB1ZGZfcmVhZF90YWdnZWQoc2IsIGosIGosICZpZGVudCk7CiAJCQkJCWdkID0gKHN0cnVjdCBnZW5lcmljX2Rlc2MgKiliaDItPmJfZGF0YTsKIAkJCQkJaWYgKGlkZW50ID09IFRBR19JREVOVF9QRCkKLQkJCQkJCWlmICh1ZGZfbG9hZF9wYXJ0ZGVzYyhzYiwgYmgyKSkgeworCQkJCQkJaWYgKHVkZl9sb2FkX3BhcnRkZXNjKHNiLAorCQkJCQkJCQkgICAgICBiaDIpKSB7CiAJCQkJCQkJYnJlbHNlKGJoKTsKIAkJCQkJCQlicmVsc2UoYmgyKTsKIAkJCQkJCQlyZXR1cm4gMTsKQEAgLTEyMjIsMTQgKzE0ODUsMTcgQEAKIAl9CiAJLyogQ2hlY2sgdGhhdCBpdCBpcyBOU1IwMiBjb21wbGlhbnQgKi8KIAkvKiBQcm9jZXNzIGFueSAiQ0QtUk9NIFZvbHVtZSBEZXNjcmlwdG9yIFNldCIgKEVDTUEgMTY3IDIvOC4zLjEpICovCi0JZWxzZSBpZiAoKGJsb2NrID0gdWRmX3ZycyhzYiwgc2lsZW50KSkgPT0gLTEpIHsKLQkJdWRmX2RlYnVnKCJGYWlsZWQgdG8gcmVhZCBieXRlIDMyNzY4LiBBc3N1bWluZyBvcGVuIGRpc2MuICIKLQkJCSAgIlNraXBwaW5nIHZhbGlkaXR5IGNoZWNrXG4iKTsKLQkJaWYgKCFVREZfU0JfTEFTVEJMT0NLKHNiKSkKLQkJCVVERl9TQl9MQVNUQkxPQ0soc2IpID0gdWRmX2dldF9sYXN0X2Jsb2NrKHNiKTsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuICFibG9jazsKKwllbHNlIHsKKwkJYmxvY2sgPSB1ZGZfdnJzKHNiLCBzaWxlbnQpOworCQlpZiAoYmxvY2sgPT0gLTEpIHsKKwkJCXN0cnVjdCB1ZGZfc2JfaW5mbyAqc2JpID0gVURGX1NCKHNiKTsKKwkJCXVkZl9kZWJ1ZygiRmFpbGVkIHRvIHJlYWQgYnl0ZSAzMjc2OC4gQXNzdW1pbmcgb3BlbiAiCisJCQkJICAiZGlzYy4gU2tpcHBpbmcgdmFsaWRpdHkgY2hlY2tcbiIpOworCQkJaWYgKCFzYmktPnNfbGFzdF9ibG9jaykKKwkJCQlzYmktPnNfbGFzdF9ibG9jayA9IHVkZl9nZXRfbGFzdF9ibG9jayhzYik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlCisJCQlyZXR1cm4gIWJsb2NrOwogCX0KIH0KIApAQCAtMTI0MCwxMDAgKzE1MDYsMTIxIEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlsb25nIG1haW5fcywgbWFpbl9lLCByZXNlcnZlX3MsIHJlc2VydmVfZTsKIAlpbnQgaSwgajsKKwlzdHJ1Y3QgdWRmX3NiX2luZm8gKnNiaTsKIAogCWlmICghc2IpCiAJCXJldHVybiAxOworCXNiaSA9IFVERl9TQihzYik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShVREZfU0JfQU5DSE9SKHNiKSk7IGkrKykgewotCQlpZiAoVURGX1NCX0FOQ0hPUihzYilbaV0gJiYKLQkJICAgIChiaCA9IHVkZl9yZWFkX3RhZ2dlZChzYiwgVURGX1NCX0FOQ0hPUihzYilbaV0sCi0JCQkJCSAgVURGX1NCX0FOQ0hPUihzYilbaV0sICZpZGVudCkpKSB7Ci0JCQlhbmNob3IgPSAoc3RydWN0IGFuY2hvclZvbERlc2NQdHIgKiliaC0+Yl9kYXRhOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNiaS0+c19hbmNob3IpOyBpKyspIHsKKwkJaWYgKCFzYmktPnNfYW5jaG9yW2ldKQorCQkJY29udGludWU7CisJCWJoID0gdWRmX3JlYWRfdGFnZ2VkKHNiLCBzYmktPnNfYW5jaG9yW2ldLCBzYmktPnNfYW5jaG9yW2ldLAorCQkJCSAgICAgJmlkZW50KTsKKwkJaWYgKCFiaCkKKwkJCWNvbnRpbnVlOwogCi0JCQkvKiBMb2NhdGUgdGhlIG1haW4gc2VxdWVuY2UgKi8KLQkJCW1haW5fcyA9IGxlMzJfdG9fY3B1KGFuY2hvci0+bWFpblZvbERlc2NTZXFFeHQuZXh0TG9jYXRpb24pOwotCQkJbWFpbl9lID0gbGUzMl90b19jcHUoYW5jaG9yLT5tYWluVm9sRGVzY1NlcUV4dC5leHRMZW5ndGggKTsKLQkJCW1haW5fZSA9IG1haW5fZSA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKLQkJCW1haW5fZSArPSBtYWluX3M7CisJCWFuY2hvciA9IChzdHJ1Y3QgYW5jaG9yVm9sRGVzY1B0ciAqKWJoLT5iX2RhdGE7CiAKLQkJCS8qIExvY2F0ZSB0aGUgcmVzZXJ2ZSBzZXF1ZW5jZSAqLwotCQkJcmVzZXJ2ZV9zID0gbGUzMl90b19jcHUoYW5jaG9yLT5yZXNlcnZlVm9sRGVzY1NlcUV4dC5leHRMb2NhdGlvbik7Ci0JCQlyZXNlcnZlX2UgPSBsZTMyX3RvX2NwdShhbmNob3ItPnJlc2VydmVWb2xEZXNjU2VxRXh0LmV4dExlbmd0aCk7Ci0JCQlyZXNlcnZlX2UgPSByZXNlcnZlX2UgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7Ci0JCQlyZXNlcnZlX2UgKz0gcmVzZXJ2ZV9zOworCQkvKiBMb2NhdGUgdGhlIG1haW4gc2VxdWVuY2UgKi8KKwkJbWFpbl9zID0gbGUzMl90b19jcHUoYW5jaG9yLT5tYWluVm9sRGVzY1NlcUV4dC5leHRMb2NhdGlvbik7CisJCW1haW5fZSA9IGxlMzJfdG9fY3B1KGFuY2hvci0+bWFpblZvbERlc2NTZXFFeHQuZXh0TGVuZ3RoKTsKKwkJbWFpbl9lID0gbWFpbl9lID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCQltYWluX2UgKz0gbWFpbl9zOwogCi0JCQlicmVsc2UoYmgpOworCQkvKiBMb2NhdGUgdGhlIHJlc2VydmUgc2VxdWVuY2UgKi8KKwkJcmVzZXJ2ZV9zID0gbGUzMl90b19jcHUoCisJCQkJYW5jaG9yLT5yZXNlcnZlVm9sRGVzY1NlcUV4dC5leHRMb2NhdGlvbik7CisJCXJlc2VydmVfZSA9IGxlMzJfdG9fY3B1KAorCQkJCWFuY2hvci0+cmVzZXJ2ZVZvbERlc2NTZXFFeHQuZXh0TGVuZ3RoKTsKKwkJcmVzZXJ2ZV9lID0gcmVzZXJ2ZV9lID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCQlyZXNlcnZlX2UgKz0gcmVzZXJ2ZV9zOwogCi0JCQkvKiBQcm9jZXNzIHRoZSBtYWluICYgcmVzZXJ2ZSBzZXF1ZW5jZXMgKi8KLQkJCS8qIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIHRoZSBQYXJ0aXRpb25EZXNjKHMpICovCi0JCQlpZiAoISh1ZGZfcHJvY2Vzc19zZXF1ZW5jZShzYiwgbWFpbl9zLCBtYWluX2UsIGZpbGVzZXQpICYmCi0JCQkgICAgICB1ZGZfcHJvY2Vzc19zZXF1ZW5jZShzYiwgcmVzZXJ2ZV9zLCByZXNlcnZlX2UsIGZpbGVzZXQpKSkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9CisJCWJyZWxzZShiaCk7CisKKwkJLyogUHJvY2VzcyB0aGUgbWFpbiAmIHJlc2VydmUgc2VxdWVuY2VzICovCisJCS8qIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIHRoZSBQYXJ0aXRpb25EZXNjKHMpICovCisJCWlmICghKHVkZl9wcm9jZXNzX3NlcXVlbmNlKHNiLCBtYWluX3MsIG1haW5fZSwKKwkJCQkJICAgZmlsZXNldCkgJiYKKwkJICAgICAgdWRmX3Byb2Nlc3Nfc2VxdWVuY2Uoc2IsIHJlc2VydmVfcywgcmVzZXJ2ZV9lLAorCQkJCQkgICBmaWxlc2V0KSkpCisJCQlicmVhazsKIAl9CiAKLQlpZiAoaSA9PSBBUlJBWV9TSVpFKFVERl9TQl9BTkNIT1Ioc2IpKSkgeworCWlmIChpID09IEFSUkFZX1NJWkUoc2JpLT5zX2FuY2hvcikpIHsKIAkJdWRmX2RlYnVnKCJObyBBbmNob3IgYmxvY2sgZm91bmRcbiIpOwogCQlyZXR1cm4gMTsKLQl9IGVsc2UKLQkJdWRmX2RlYnVnKCJVc2luZyBhbmNob3IgaW4gYmxvY2sgJWRcbiIsIFVERl9TQl9BTkNIT1Ioc2IpW2ldKTsKKwl9CisJdWRmX2RlYnVnKCJVc2luZyBhbmNob3IgaW4gYmxvY2sgJWRcbiIsIHNiaS0+c19hbmNob3JbaV0pOwogCi0JZm9yIChpID0gMDsgaSA8IFVERl9TQl9OVU1QQVJUUyhzYik7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBzYmktPnNfcGFydGl0aW9uczsgaSsrKSB7CiAJCWtlcm5lbF9sYl9hZGRyIHVuaW5pdGlhbGl6ZWRfdmFyKGlubyk7Ci0JCXN3aXRjaCAoVURGX1NCX1BBUlRUWVBFKHNiLCBpKSkgeworCQlzdHJ1Y3QgdWRmX3BhcnRfbWFwICptYXAgPSAmc2JpLT5zX3BhcnRtYXBzW2ldOworCQlzd2l0Y2ggKG1hcC0+c19wYXJ0aXRpb25fdHlwZSkgewogCQljYXNlIFVERl9WSVJUVUFMX01BUDE1OgogCQljYXNlIFVERl9WSVJUVUFMX01BUDIwOgotCQkJaWYgKCFVREZfU0JfTEFTVEJMT0NLKHNiKSkgewotCQkJCVVERl9TQl9MQVNUQkxPQ0soc2IpID0gdWRmX2dldF9sYXN0X2Jsb2NrKHNiKTsKKwkJCWlmICghc2JpLT5zX2xhc3RfYmxvY2spIHsKKwkJCQlzYmktPnNfbGFzdF9ibG9jayA9IHVkZl9nZXRfbGFzdF9ibG9jayhzYik7CiAJCQkJdWRmX2ZpbmRfYW5jaG9yKHNiKTsKIAkJCX0KIAotCQkJaWYgKCFVREZfU0JfTEFTVEJMT0NLKHNiKSkgeworCQkJaWYgKCFzYmktPnNfbGFzdF9ibG9jaykgewogCQkJCXVkZl9kZWJ1ZygiVW5hYmxlIHRvIGRldGVybWluZSBMYXN0YmxvY2sgKEZvciAiCiAJCQkJCSAgIlZpcnR1YWwgUGFydGl0aW9uKVxuIik7CiAJCQkJcmV0dXJuIDE7CiAJCQl9CiAKLQkJCWZvciAoaiA9IDA7IGogPCBVREZfU0JfTlVNUEFSVFMoc2IpOyBqKyspIHsKKwkJCWZvciAoaiA9IDA7IGogPCBzYmktPnNfcGFydGl0aW9uczsgaisrKSB7CisJCQkJc3RydWN0IHVkZl9wYXJ0X21hcCAqbWFwMiA9ICZzYmktPnNfcGFydG1hcHNbal07CiAJCQkJaWYgKGogIT0gaSAmJgotCQkJCSAgICBVREZfU0JfUEFSVFZTTihzYiwgaSkgPT0gVURGX1NCX1BBUlRWU04oc2IsIGopICYmCi0JCQkJICAgIFVERl9TQl9QQVJUTlVNKHNiLCBpKSA9PSBVREZfU0JfUEFSVE5VTShzYiwgaikpIHsKKwkJCQkgICAgbWFwLT5zX3ZvbHVtZXNlcW51bSA9PQorCQkJCQkJbWFwMi0+c192b2x1bWVzZXFudW0gJiYKKwkJCQkgICAgbWFwLT5zX3BhcnRpdGlvbl9udW0gPT0KKwkJCQkJCW1hcDItPnNfcGFydGl0aW9uX251bSkgewogCQkJCQlpbm8ucGFydGl0aW9uUmVmZXJlbmNlTnVtID0gajsKLQkJCQkJaW5vLmxvZ2ljYWxCbG9ja051bSA9IFVERl9TQl9MQVNUQkxPQ0soc2IpIC0gVURGX1NCX1BBUlRST09UKHNiLCBqKTsKKwkJCQkJaW5vLmxvZ2ljYWxCbG9ja051bSA9CisJCQkJCQlzYmktPnNfbGFzdF9ibG9jayAtCisJCQkJCQkJbWFwMi0+c19wYXJ0aXRpb25fcm9vdDsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQogCi0JCQlpZiAoaiA9PSBVREZfU0JfTlVNUEFSVFMoc2IpKQorCQkJaWYgKGogPT0gc2JpLT5zX3BhcnRpdGlvbnMpCiAJCQkJcmV0dXJuIDE7CiAKLQkJCWlmICghKFVERl9TQl9WQVQoc2IpID0gdWRmX2lnZXQoc2IsIGlubykpKQorCQkJc2JpLT5zX3ZhdF9pbm9kZSA9IHVkZl9pZ2V0KHNiLCBpbm8pOworCQkJaWYgKCFzYmktPnNfdmF0X2lub2RlKQogCQkJCXJldHVybiAxOwogCi0JCQlpZiAoVURGX1NCX1BBUlRUWVBFKHNiLCBpKSA9PSBVREZfVklSVFVBTF9NQVAxNSkgewotCQkJCVVERl9TQl9UWVBFVklSVChzYiwgaSkuc19zdGFydF9vZmZzZXQgPQotCQkJCQl1ZGZfZXh0MF9vZmZzZXQoVURGX1NCX1ZBVChzYikpOwotCQkJCVVERl9TQl9UWVBFVklSVChzYiwgaSkuc19udW1fZW50cmllcyA9Ci0JCQkJCShVREZfU0JfVkFUKHNiKS0+aV9zaXplIC0gMzYpID4+IDI7Ci0JCQl9IGVsc2UgaWYgKFVERl9TQl9QQVJUVFlQRShzYiwgaSkgPT0gVURGX1ZJUlRVQUxfTUFQMjApIHsKLQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwkJCWlmIChtYXAtPnNfcGFydGl0aW9uX3R5cGUgPT0gVURGX1ZJUlRVQUxfTUFQMTUpIHsKKwkJCQltYXAtPnNfdHlwZV9zcGVjaWZpYy5zX3ZpcnR1YWwuc19zdGFydF9vZmZzZXQgPQorCQkJCQl1ZGZfZXh0MF9vZmZzZXQoc2JpLT5zX3ZhdF9pbm9kZSk7CisJCQkJbWFwLT5zX3R5cGVfc3BlY2lmaWMuc192aXJ0dWFsLnNfbnVtX2VudHJpZXMgPQorCQkJCQkoc2JpLT5zX3ZhdF9pbm9kZS0+aV9zaXplIC0gMzYpID4+IDI7CisJCQl9IGVsc2UgaWYgKG1hcC0+c19wYXJ0aXRpb25fdHlwZSA9PSBVREZfVklSVFVBTF9NQVAyMCkgewogCQkJCXVpbnQzMl90IHBvczsKKwkJCQlzdHJ1Y3QgdmlydHVhbEFsbG9jYXRpb25UYWJsZTIwICp2YXQyMDsKIAotCQkJCXBvcyA9IHVkZl9ibG9ja19tYXAoVURGX1NCX1ZBVChzYiksIDApOworCQkJCXBvcyA9IHVkZl9ibG9ja19tYXAoc2JpLT5zX3ZhdF9pbm9kZSwgMCk7CiAJCQkJYmggPSBzYl9icmVhZChzYiwgcG9zKTsKIAkJCQlpZiAoIWJoKQogCQkJCQlyZXR1cm4gMTsKLQkJCQlVREZfU0JfVFlQRVZJUlQoc2IsIGkpLnNfc3RhcnRfb2Zmc2V0ID0KLQkJCQkJbGUxNl90b19jcHUoKChzdHJ1Y3QgdmlydHVhbEFsbG9jYXRpb25UYWJsZTIwICopYmgtPmJfZGF0YSArCi0JCQkJCQkgICAgIHVkZl9leHQwX29mZnNldChVREZfU0JfVkFUKHNiKSkpLT5sZW5ndGhIZWFkZXIpICsKLQkJCQkJdWRmX2V4dDBfb2Zmc2V0KFVERl9TQl9WQVQoc2IpKTsKLQkJCQlVREZfU0JfVFlQRVZJUlQoc2IsIGkpLnNfbnVtX2VudHJpZXMgPSAoVURGX1NCX1ZBVChzYiktPmlfc2l6ZSAtCi0JCQkJCQkJCQlVREZfU0JfVFlQRVZJUlQoc2IsIGkpLnNfc3RhcnRfb2Zmc2V0KSA+PiAyOworCQkJCXZhdDIwID0gKHN0cnVjdCB2aXJ0dWFsQWxsb2NhdGlvblRhYmxlMjAgKikKKwkJCQkJYmgtPmJfZGF0YSArCisJCQkJCXVkZl9leHQwX29mZnNldChzYmktPnNfdmF0X2lub2RlKTsKKwkJCQltYXAtPnNfdHlwZV9zcGVjaWZpYy5zX3ZpcnR1YWwuc19zdGFydF9vZmZzZXQgPQorCQkJCQlsZTE2X3RvX2NwdSh2YXQyMC0+bGVuZ3RoSGVhZGVyKSArCisJCQkJCXVkZl9leHQwX29mZnNldChzYmktPnNfdmF0X2lub2RlKTsKKwkJCQltYXAtPnNfdHlwZV9zcGVjaWZpYy5zX3ZpcnR1YWwuc19udW1fZW50cmllcyA9CisJCQkJCShzYmktPnNfdmF0X2lub2RlLT5pX3NpemUgLQorCQkJCQkgbWFwLT5zX3R5cGVfc3BlY2lmaWMuc192aXJ0dWFsLgorCQkJCQkJCXNfc3RhcnRfb2Zmc2V0KSA+PiAyOwogCQkJCWJyZWxzZShiaCk7CiAJCQl9Ci0JCQlVREZfU0JfUEFSVFJPT1Qoc2IsIGkpID0gdWRmX2dldF9wYmxvY2soc2IsIDAsIGksIDApOwotCQkJVURGX1NCX1BBUlRMRU4oc2IsIGkpID0gVURGX1NCX1BBUlRMRU4oc2IsIGluby5wYXJ0aXRpb25SZWZlcmVuY2VOdW0pOworCQkJbWFwLT5zX3BhcnRpdGlvbl9yb290ID0gdWRmX2dldF9wYmxvY2soc2IsIDAsIGksIDApOworCQkJbWFwLT5zX3BhcnRpdGlvbl9sZW4gPQorCQkJCXNiaS0+c19wYXJ0bWFwc1tpbm8ucGFydGl0aW9uUmVmZXJlbmNlTnVtXS4KKwkJCQkJCQkJc19wYXJ0aXRpb25fbGVuOwogCQl9CiAJfQogCXJldHVybiAwOwpAQCAtMTM0MSw2MiArMTYyOCw4NiBAQAogCiBzdGF0aWMgdm9pZCB1ZGZfb3Blbl9sdmlkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0JaWYgKFVERl9TQl9MVklEQkgoc2IpKSB7Ci0JCWludCBpOworCXN0cnVjdCB1ZGZfc2JfaW5mbyAqc2JpID0gVURGX1NCKHNiKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gc2JpLT5zX2x2aWRfYmg7CisJaWYgKGJoKSB7CiAJCWtlcm5lbF90aW1lc3RhbXAgY3B1X3RpbWU7CisJCXN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzYyAqbHZpZCA9CisJCQkJKHN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzYyAqKWJoLT5iX2RhdGE7CisJCXN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzY0ltcFVzZSAqbHZpZGl1ID0KKwkJCQkJCQl1ZGZfc2JfbHZpZGl1KHNiaSk7CiAKLQkJVURGX1NCX0xWSURJVShzYiktPmltcElkZW50LmlkZW50U3VmZml4WzBdID0gVURGX09TX0NMQVNTX1VOSVg7Ci0JCVVERl9TQl9MVklESVUoc2IpLT5pbXBJZGVudC5pZGVudFN1ZmZpeFsxXSA9IFVERl9PU19JRF9MSU5VWDsKKwkJbHZpZGl1LT5pbXBJZGVudC5pZGVudFN1ZmZpeFswXSA9IFVERl9PU19DTEFTU19VTklYOworCQlsdmlkaXUtPmltcElkZW50LmlkZW50U3VmZml4WzFdID0gVURGX09TX0lEX0xJTlVYOwogCQlpZiAodWRmX3RpbWVfdG9fc3RhbXAoJmNwdV90aW1lLCBDVVJSRU5UX1RJTUUpKQotCQkJVURGX1NCX0xWSUQoc2IpLT5yZWNvcmRpbmdEYXRlQW5kVGltZSA9IGNwdV90b19sZXRzKGNwdV90aW1lKTsKLQkJVURGX1NCX0xWSUQoc2IpLT5pbnRlZ3JpdHlUeXBlID0gTFZJRF9JTlRFR1JJVFlfVFlQRV9PUEVOOworCQkJbHZpZC0+cmVjb3JkaW5nRGF0ZUFuZFRpbWUgPSBjcHVfdG9fbGV0cyhjcHVfdGltZSk7CisJCWx2aWQtPmludGVncml0eVR5cGUgPSBMVklEX0lOVEVHUklUWV9UWVBFX09QRU47CiAKLQkJVURGX1NCX0xWSUQoc2IpLT5kZXNjVGFnLmRlc2NDUkMgPSBjcHVfdG9fbGUxNih1ZGZfY3JjKChjaGFyICopVURGX1NCX0xWSUQoc2IpICsgc2l6ZW9mKHRhZyksCi0JCQkJCQkJCSAgICAgICBsZTE2X3RvX2NwdShVREZfU0JfTFZJRChzYiktPmRlc2NUYWcuZGVzY0NSQ0xlbmd0aCksIDApKTsKKwkJbHZpZC0+ZGVzY1RhZy5kZXNjQ1JDID0gY3B1X3RvX2xlMTYoCisJCQl1ZGZfY3JjKChjaGFyICopbHZpZCArIHNpemVvZih0YWcpLAorCQkJCWxlMTZfdG9fY3B1KGx2aWQtPmRlc2NUYWcuZGVzY0NSQ0xlbmd0aCksCisJCQkJMCkpOwogCi0JCVVERl9TQl9MVklEKHNiKS0+ZGVzY1RhZy50YWdDaGVja3N1bSA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotCQkJaWYgKGkgIT0gNCkKLQkJCQlVREZfU0JfTFZJRChzYiktPmRlc2NUYWcudGFnQ2hlY2tzdW0gKz0KLQkJCQkJKCh1aW50OF90ICopICYoVURGX1NCX0xWSUQoc2IpLT5kZXNjVGFnKSlbaV07Ci0KLQkJbWFya19idWZmZXJfZGlydHkoVURGX1NCX0xWSURCSChzYikpOworCQlsdmlkLT5kZXNjVGFnLnRhZ0NoZWNrc3VtID0gdWRmX3RhZ19jaGVja3N1bSgmbHZpZC0+ZGVzY1RhZyk7CisJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIHVkZl9jbG9zZV9sdmlkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJa2VybmVsX3RpbWVzdGFtcCBjcHVfdGltZTsKLQlpbnQgaTsKKwlzdHJ1Y3QgdWRmX3NiX2luZm8gKnNiaSA9IFVERl9TQihzYik7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IHNiaS0+c19sdmlkX2JoOworCXN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzYyAqbHZpZDsKIAotCWlmIChVREZfU0JfTFZJREJIKHNiKSAmJgotCSAgICBVREZfU0JfTFZJRChzYiktPmludGVncml0eVR5cGUgPT0gTFZJRF9JTlRFR1JJVFlfVFlQRV9PUEVOKSB7Ci0JCVVERl9TQl9MVklESVUoc2IpLT5pbXBJZGVudC5pZGVudFN1ZmZpeFswXSA9IFVERl9PU19DTEFTU19VTklYOwotCQlVREZfU0JfTFZJRElVKHNiKS0+aW1wSWRlbnQuaWRlbnRTdWZmaXhbMV0gPSBVREZfT1NfSURfTElOVVg7CisJaWYgKCFiaCkKKwkJcmV0dXJuOworCisJbHZpZCA9IChzdHJ1Y3QgbG9naWNhbFZvbEludGVncml0eURlc2MgKiliaC0+Yl9kYXRhOworCisJaWYgKGx2aWQtPmludGVncml0eVR5cGUgPT0gTFZJRF9JTlRFR1JJVFlfVFlQRV9PUEVOKSB7CisJCXN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzY0ltcFVzZSAqbHZpZGl1ID0KKwkJCQkJCQl1ZGZfc2JfbHZpZGl1KHNiaSk7CisJCWx2aWRpdS0+aW1wSWRlbnQuaWRlbnRTdWZmaXhbMF0gPSBVREZfT1NfQ0xBU1NfVU5JWDsKKwkJbHZpZGl1LT5pbXBJZGVudC5pZGVudFN1ZmZpeFsxXSA9IFVERl9PU19JRF9MSU5VWDsKIAkJaWYgKHVkZl90aW1lX3RvX3N0YW1wKCZjcHVfdGltZSwgQ1VSUkVOVF9USU1FKSkKLQkJCVVERl9TQl9MVklEKHNiKS0+cmVjb3JkaW5nRGF0ZUFuZFRpbWUgPSBjcHVfdG9fbGV0cyhjcHVfdGltZSk7Ci0JCWlmIChVREZfTUFYX1dSSVRFX1ZFUlNJT04gPiBsZTE2X3RvX2NwdShVREZfU0JfTFZJRElVKHNiKS0+bWF4VURGV3JpdGVSZXYpKQotCQkJVURGX1NCX0xWSURJVShzYiktPm1heFVERldyaXRlUmV2ID0gY3B1X3RvX2xlMTYoVURGX01BWF9XUklURV9WRVJTSU9OKTsKLQkJaWYgKFVERl9TQl9VREZSRVYoc2IpID4gbGUxNl90b19jcHUoVURGX1NCX0xWSURJVShzYiktPm1pblVERlJlYWRSZXYpKQotCQkJVURGX1NCX0xWSURJVShzYiktPm1pblVERlJlYWRSZXYgPSBjcHVfdG9fbGUxNihVREZfU0JfVURGUkVWKHNiKSk7Ci0JCWlmIChVREZfU0JfVURGUkVWKHNiKSA+IGxlMTZfdG9fY3B1KFVERl9TQl9MVklESVUoc2IpLT5taW5VREZXcml0ZVJldikpCi0JCQlVREZfU0JfTFZJRElVKHNiKS0+bWluVURGV3JpdGVSZXYgPSBjcHVfdG9fbGUxNihVREZfU0JfVURGUkVWKHNiKSk7Ci0JCVVERl9TQl9MVklEKHNiKS0+aW50ZWdyaXR5VHlwZSA9IGNwdV90b19sZTMyKExWSURfSU5URUdSSVRZX1RZUEVfQ0xPU0UpOworCQkJbHZpZC0+cmVjb3JkaW5nRGF0ZUFuZFRpbWUgPSBjcHVfdG9fbGV0cyhjcHVfdGltZSk7CisJCWlmIChVREZfTUFYX1dSSVRFX1ZFUlNJT04gPiBsZTE2X3RvX2NwdShsdmlkaXUtPm1heFVERldyaXRlUmV2KSkKKwkJCWx2aWRpdS0+bWF4VURGV3JpdGVSZXYgPQorCQkJCQljcHVfdG9fbGUxNihVREZfTUFYX1dSSVRFX1ZFUlNJT04pOworCQlpZiAoc2JpLT5zX3VkZnJldiA+IGxlMTZfdG9fY3B1KGx2aWRpdS0+bWluVURGUmVhZFJldikpCisJCQlsdmlkaXUtPm1pblVERlJlYWRSZXYgPSBjcHVfdG9fbGUxNihzYmktPnNfdWRmcmV2KTsKKwkJaWYgKHNiaS0+c191ZGZyZXYgPiBsZTE2X3RvX2NwdShsdmlkaXUtPm1pblVERldyaXRlUmV2KSkKKwkJCWx2aWRpdS0+bWluVURGV3JpdGVSZXYgPSBjcHVfdG9fbGUxNihzYmktPnNfdWRmcmV2KTsKKwkJbHZpZC0+aW50ZWdyaXR5VHlwZSA9IGNwdV90b19sZTMyKExWSURfSU5URUdSSVRZX1RZUEVfQ0xPU0UpOwogCi0JCVVERl9TQl9MVklEKHNiKS0+ZGVzY1RhZy5kZXNjQ1JDID0KLQkJCWNwdV90b19sZTE2KHVkZl9jcmMoKGNoYXIgKilVREZfU0JfTFZJRChzYikgKyBzaXplb2YodGFnKSwKLQkJCQkJICAgIGxlMTZfdG9fY3B1KFVERl9TQl9MVklEKHNiKS0+ZGVzY1RhZy5kZXNjQ1JDTGVuZ3RoKSwgMCkpOworCQlsdmlkLT5kZXNjVGFnLmRlc2NDUkMgPSBjcHVfdG9fbGUxNigKKwkJCXVkZl9jcmMoKGNoYXIgKilsdmlkICsgc2l6ZW9mKHRhZyksCisJCQkJbGUxNl90b19jcHUobHZpZC0+ZGVzY1RhZy5kZXNjQ1JDTGVuZ3RoKSwKKwkJCQkwKSk7CiAKLQkJVURGX1NCX0xWSUQoc2IpLT5kZXNjVGFnLnRhZ0NoZWNrc3VtID0gMDsKLQkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCQlpZiAoaSAhPSA0KQotCQkJCVVERl9TQl9MVklEKHNiKS0+ZGVzY1RhZy50YWdDaGVja3N1bSArPQotCQkJCQkoKHVpbnQ4X3QgKikmKFVERl9TQl9MVklEKHNiKS0+ZGVzY1RhZykpW2ldOwotCi0JCW1hcmtfYnVmZmVyX2RpcnR5KFVERl9TQl9MVklEQkgoc2IpKTsKKwkJbHZpZC0+ZGVzY1RhZy50YWdDaGVja3N1bSA9IHVkZl90YWdfY2hlY2tzdW0oJmx2aWQtPmRlc2NUYWcpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CiAJfQogfQogCitzdGF0aWMgdm9pZCB1ZGZfc2JfZnJlZV9iaXRtYXAoc3RydWN0IHVkZl9iaXRtYXAgKmJpdG1hcCkKK3sKKwlpbnQgaTsKKwlpbnQgbnJfZ3JvdXBzID0gYml0bWFwLT5zX25yX2dyb3VwczsKKwlpbnQgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdWRmX2JpdG1hcCkgKyAoc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSAqCisJCQkJCQlucl9ncm91cHMpOworCisJZm9yIChpID0gMDsgaSA8IG5yX2dyb3VwczsgaSsrKQorCQlpZiAoYml0bWFwLT5zX2Jsb2NrX2JpdG1hcFtpXSkKKwkJCWJyZWxzZShiaXRtYXAtPnNfYmxvY2tfYml0bWFwW2ldKTsKKworCWlmIChzaXplIDw9IFBBR0VfU0laRSkKKwkJa2ZyZWUoYml0bWFwKTsKKwllbHNlCisJCXZmcmVlKGJpdG1hcCk7Cit9CisKIC8qCiAgKiB1ZGZfcmVhZF9zdXBlcgogICoKQEAgLTE0MjYsMTYgKzE3MzcsMTUgQEAKIAl1b3B0LmdpZCA9IC0xOwogCXVvcHQudW1hc2sgPSAwOwogCi0Jc2JpID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHVkZl9zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJc2JpID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVkZl9zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzYmkpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJc2ItPnNfZnNfaW5mbyA9IHNiaTsKLQltZW1zZXQoVURGX1NCKHNiKSwgMHgwMCwgc2l6ZW9mKHN0cnVjdCB1ZGZfc2JfaW5mbykpOwogCiAJbXV0ZXhfaW5pdCgmc2JpLT5zX2FsbG9jX211dGV4KTsKIAotCWlmICghdWRmX3BhcnNlX29wdGlvbnMoKGNoYXIgKilvcHRpb25zLCAmdW9wdCkpCisJaWYgKCF1ZGZfcGFyc2Vfb3B0aW9ucygoY2hhciAqKW9wdGlvbnMsICZ1b3B0LCBmYWxzZSkpCiAJCWdvdG8gZXJyb3Jfb3V0OwogCiAJaWYgKHVvcHQuZmxhZ3MgJiAoMSA8PCBVREZfRkxBR19VVEY4KSAmJgpAQCAtMTQ1OSwzMCArMTc2OSwzMSBAQAogCWZpbGVzZXQubG9naWNhbEJsb2NrTnVtID0gMHhGRkZGRkZGRjsKIAlmaWxlc2V0LnBhcnRpdGlvblJlZmVyZW5jZU51bSA9IDB4RkZGRjsKIAotCVVERl9TQihzYiktPnNfZmxhZ3MgPSB1b3B0LmZsYWdzOwotCVVERl9TQihzYiktPnNfdWlkID0gdW9wdC51aWQ7Ci0JVURGX1NCKHNiKS0+c19naWQgPSB1b3B0LmdpZDsKLQlVREZfU0Ioc2IpLT5zX3VtYXNrID0gdW9wdC51bWFzazsKLQlVREZfU0Ioc2IpLT5zX25sc19tYXAgPSB1b3B0Lm5sc19tYXA7CisJc2JpLT5zX2ZsYWdzID0gdW9wdC5mbGFnczsKKwlzYmktPnNfdWlkID0gdW9wdC51aWQ7CisJc2JpLT5zX2dpZCA9IHVvcHQuZ2lkOworCXNiaS0+c191bWFzayA9IHVvcHQudW1hc2s7CisJc2JpLT5zX25sc19tYXAgPSB1b3B0Lm5sc19tYXA7CiAKIAkvKiBTZXQgdGhlIGJsb2NrIHNpemUgZm9yIGFsbCB0cmFuc2ZlcnMgKi8KIAlpZiAoIXVkZl9zZXRfYmxvY2tzaXplKHNiLCB1b3B0LmJsb2Nrc2l6ZSkpCiAJCWdvdG8gZXJyb3Jfb3V0OwogCiAJaWYgKHVvcHQuc2Vzc2lvbiA9PSAweEZGRkZGRkZGKQotCQlVREZfU0JfU0VTU0lPTihzYikgPSB1ZGZfZ2V0X2xhc3Rfc2Vzc2lvbihzYik7CisJCXNiaS0+c19zZXNzaW9uID0gdWRmX2dldF9sYXN0X3Nlc3Npb24oc2IpOwogCWVsc2UKLQkJVURGX1NCX1NFU1NJT04oc2IpID0gdW9wdC5zZXNzaW9uOworCQlzYmktPnNfc2Vzc2lvbiA9IHVvcHQuc2Vzc2lvbjsKIAotCXVkZl9kZWJ1ZygiTXVsdGktc2Vzc2lvbj0lZFxuIiwgVURGX1NCX1NFU1NJT04oc2IpKTsKKwl1ZGZfZGVidWcoIk11bHRpLXNlc3Npb249JWRcbiIsIHNiaS0+c19zZXNzaW9uKTsKIAotCVVERl9TQl9MQVNUQkxPQ0soc2IpID0gdW9wdC5sYXN0YmxvY2s7Ci0JVURGX1NCX0FOQ0hPUihzYilbMF0gPSBVREZfU0JfQU5DSE9SKHNiKVsxXSA9IDA7Ci0JVURGX1NCX0FOQ0hPUihzYilbMl0gPSB1b3B0LmFuY2hvcjsKLQlVREZfU0JfQU5DSE9SKHNiKVszXSA9IDI1NjsKKwlzYmktPnNfbGFzdF9ibG9jayA9IHVvcHQubGFzdGJsb2NrOworCXNiaS0+c19hbmNob3JbMF0gPSBzYmktPnNfYW5jaG9yWzFdID0gMDsKKwlzYmktPnNfYW5jaG9yWzJdID0gdW9wdC5hbmNob3I7CisJc2JpLT5zX2FuY2hvclszXSA9IDI1NjsKIAotCWlmICh1ZGZfY2hlY2tfdmFsaWQoc2IsIHVvcHQubm92cnMsIHNpbGVudCkpIHsgLyogcmVhZCB2b2x1bWUgcmVjb2duaXRpb24gc2VxdWVuY2VzICovCi0JCXByaW50aygiVURGLWZzOiBObyBWUlMgZm91bmRcbiIpOworCWlmICh1ZGZfY2hlY2tfdmFsaWQoc2IsIHVvcHQubm92cnMsIHNpbGVudCkpIHsKKwkJLyogcmVhZCB2b2x1bWUgcmVjb2duaXRpb24gc2VxdWVuY2VzICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVERi1mczogTm8gVlJTIGZvdW5kXG4iKTsKIAkJZ290byBlcnJvcl9vdXQ7CiAJfQogCkBAIC0xNDk2LDI3ICsxODA3LDMwIEBACiAJc2ItPnNfdGltZV9ncmFuID0gMTAwMDsKIAogCWlmICh1ZGZfbG9hZF9wYXJ0aXRpb24oc2IsICZmaWxlc2V0KSkgewotCQlwcmludGsoIlVERi1mczogTm8gcGFydGl0aW9uIGZvdW5kICgxKVxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVERi1mczogTm8gcGFydGl0aW9uIGZvdW5kICgxKVxuIik7CiAJCWdvdG8gZXJyb3Jfb3V0OwogCX0KIAotCXVkZl9kZWJ1ZygiTGFzdGJsb2NrPSVkXG4iLCBVREZfU0JfTEFTVEJMT0NLKHNiKSk7CisJdWRmX2RlYnVnKCJMYXN0YmxvY2s9JWRcbiIsIHNiaS0+c19sYXN0X2Jsb2NrKTsKIAotCWlmIChVREZfU0JfTFZJREJIKHNiKSkgewotCQl1aW50MTZfdCBtaW5VREZSZWFkUmV2ID0gbGUxNl90b19jcHUoVURGX1NCX0xWSURJVShzYiktPm1pblVERlJlYWRSZXYpOwotCQl1aW50MTZfdCBtaW5VREZXcml0ZVJldiA9IGxlMTZfdG9fY3B1KFVERl9TQl9MVklESVUoc2IpLT5taW5VREZXcml0ZVJldik7Ci0JCS8qIHVpbnQxNl90IG1heFVERldyaXRlUmV2ID0gbGUxNl90b19jcHUoVURGX1NCX0xWSURJVShzYiktPm1heFVERldyaXRlUmV2KTsgKi8KKwlpZiAoc2JpLT5zX2x2aWRfYmgpIHsKKwkJc3RydWN0IGxvZ2ljYWxWb2xJbnRlZ3JpdHlEZXNjSW1wVXNlICpsdmlkaXUgPQorCQkJCQkJCXVkZl9zYl9sdmlkaXUoc2JpKTsKKwkJdWludDE2X3QgbWluVURGUmVhZFJldiA9IGxlMTZfdG9fY3B1KGx2aWRpdS0+bWluVURGUmVhZFJldik7CisJCXVpbnQxNl90IG1pblVERldyaXRlUmV2ID0gbGUxNl90b19jcHUobHZpZGl1LT5taW5VREZXcml0ZVJldik7CisJCS8qIHVpbnQxNl90IG1heFVERldyaXRlUmV2ID0KKwkJCQlsZTE2X3RvX2NwdShsdmlkaXUtPm1heFVERldyaXRlUmV2KTsgKi8KIAogCQlpZiAobWluVURGUmVhZFJldiA+IFVERl9NQVhfUkVBRF9WRVJTSU9OKSB7Ci0JCQlwcmludGsoIlVERi1mczogbWluVURGUmVhZFJldj0leCAobWF4IGlzICV4KVxuIiwKLQkJCSAgICAgICBsZTE2X3RvX2NwdShVREZfU0JfTFZJRElVKHNiKS0+bWluVURGUmVhZFJldiksCisJCQlwcmludGsoS0VSTl9FUlIgIlVERi1mczogbWluVURGUmVhZFJldj0leCAiCisJCQkJCSIobWF4IGlzICV4KVxuIiwKKwkJCSAgICAgICBsZTE2X3RvX2NwdShsdmlkaXUtPm1pblVERlJlYWRSZXYpLAogCQkJICAgICAgIFVERl9NQVhfUkVBRF9WRVJTSU9OKTsKIAkJCWdvdG8gZXJyb3Jfb3V0OwotCQl9IGVsc2UgaWYgKG1pblVERldyaXRlUmV2ID4gVURGX01BWF9XUklURV9WRVJTSU9OKSB7CisJCX0gZWxzZSBpZiAobWluVURGV3JpdGVSZXYgPiBVREZfTUFYX1dSSVRFX1ZFUlNJT04pCiAJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7Ci0JCX0KIAotCQlVREZfU0JfVURGUkVWKHNiKSA9IG1pblVERldyaXRlUmV2OworCQlzYmktPnNfdWRmcmV2ID0gbWluVURGV3JpdGVSZXY7CiAKIAkJaWYgKG1pblVERlJlYWRSZXYgPj0gVURGX1ZFUlNfVVNFX0VYVEVOREVEX0ZFKQogCQkJVURGX1NFVF9GTEFHKHNiLCBVREZfRkxBR19VU0VfRVhURU5ERURfRkUpOwpAQCAtMTUyNCwyOSArMTgzOCwzMCBAQAogCQkJVURGX1NFVF9GTEFHKHNiLCBVREZfRkxBR19VU0VfU1RSRUFNUyk7CiAJfQogCi0JaWYgKCFVREZfU0JfTlVNUEFSVFMoc2IpKSB7Ci0JCXByaW50aygiVURGLWZzOiBObyBwYXJ0aXRpb24gZm91bmQgKDIpXG4iKTsKKwlpZiAoIXNiaS0+c19wYXJ0aXRpb25zKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVERi1mczogTm8gcGFydGl0aW9uIGZvdW5kICgyKVxuIik7CiAJCWdvdG8gZXJyb3Jfb3V0OwogCX0KIAotCWlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBVREZfU0JfUEFSVElUSU9OKHNiKSkgJiBVREZfUEFSVF9GTEFHX1JFQURfT05MWSkgewotCQlwcmludGsoIlVERi1mczogUGFydGl0aW9uIG1hcmtlZCByZWFkb25seTsgZm9yY2luZyByZWFkb25seSBtb3VudFxuIik7CisJaWYgKHNiaS0+c19wYXJ0bWFwc1tzYmktPnNfcGFydGl0aW9uXS5zX3BhcnRpdGlvbl9mbGFncyAmCisJCQlVREZfUEFSVF9GTEFHX1JFQURfT05MWSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIlVERi1mczogUGFydGl0aW9uIG1hcmtlZCByZWFkb25seTsgIgorCQkJCSAgICJmb3JjaW5nIHJlYWRvbmx5IG1vdW50XG4iKTsKIAkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOwogCX0KIAogCWlmICh1ZGZfZmluZF9maWxlc2V0KHNiLCAmZmlsZXNldCwgJnJvb3RkaXIpKSB7Ci0JCXByaW50aygiVURGLWZzOiBObyBmaWxlc2V0IGZvdW5kXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVURGLWZzOiBObyBmaWxlc2V0IGZvdW5kXG4iKTsKIAkJZ290byBlcnJvcl9vdXQ7CiAJfQogCiAJaWYgKCFzaWxlbnQpIHsKIAkJa2VybmVsX3RpbWVzdGFtcCB0czsKLQkJdWRmX3RpbWVfdG9fc3RhbXAoJnRzLCBVREZfU0JfUkVDT1JEVElNRShzYikpOwotCQl1ZGZfaW5mbygiVURGICVzICglcykgTW91bnRpbmcgdm9sdW1lICclcycsICIKKwkJdWRmX3RpbWVfdG9fc3RhbXAoJnRzLCBzYmktPnNfcmVjb3JkX3RpbWUpOworCQl1ZGZfaW5mbygiVURGOiBNb3VudGluZyB2b2x1bWUgJyVzJywgIgogCQkJICJ0aW1lc3RhbXAgJTA0dS8lMDJ1LyUwMnUgJTAydTolMDJ1ICgleClcbiIsCi0JCQkgVURGRlNfVkVSU0lPTiwgVURGRlNfREFURSwKLQkJCSBVREZfU0JfVk9MSURFTlQoc2IpLCB0cy55ZWFyLCB0cy5tb250aCwgdHMuZGF5LCB0cy5ob3VyLCB0cy5taW51dGUsCi0JCQkgdHMudHlwZUFuZFRpbWV6b25lKTsKKwkJCSBzYmktPnNfdm9sdW1lX2lkZW50LCB0cy55ZWFyLCB0cy5tb250aCwgdHMuZGF5LAorCQkJIHRzLmhvdXIsIHRzLm1pbnV0ZSwgdHMudHlwZUFuZFRpbWV6b25lKTsKIAl9CiAJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKQogCQl1ZGZfb3Blbl9sdmlkKHNiKTsKQEAgLTE1NTYsNyArMTg3MSw4IEBACiAJLyogcGVyaGFwcyBpdCdzIG5vdCBleHRlbnNpYmxlIGVub3VnaCwgYnV0IGZvciBub3cgLi4uICovCiAJaW5vZGUgPSB1ZGZfaWdldChzYiwgcm9vdGRpcik7CiAJaWYgKCFpbm9kZSkgewotCQlwcmludGsoIlVERi1mczogRXJyb3IgaW4gdWRmX2lnZXQsIGJsb2NrPSVkLCBwYXJ0aXRpb249JWRcbiIsCisJCXByaW50ayhLRVJOX0VSUiAiVURGLWZzOiBFcnJvciBpbiB1ZGZfaWdldCwgYmxvY2s9JWQsICIKKwkJCQkicGFydGl0aW9uPSVkXG4iLAogCQkgICAgICAgcm9vdGRpci5sb2dpY2FsQmxvY2tOdW0sIHJvb3RkaXIucGFydGl0aW9uUmVmZXJlbmNlTnVtKTsKIAkJZ290byBlcnJvcl9vdXQ7CiAJfQpAQCAtMTU2NCw3ICsxODgwLDcgQEAKIAkvKiBBbGxvY2F0ZSBhIGRlbnRyeSBmb3IgdGhlIHJvb3QgaW5vZGUgKi8KIAlzYi0+c19yb290ID0gZF9hbGxvY19yb290KGlub2RlKTsKIAlpZiAoIXNiLT5zX3Jvb3QpIHsKLQkJcHJpbnRrKCJVREYtZnM6IENvdWxkbid0IGFsbG9jYXRlIHJvb3QgZGVudHJ5XG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJVREYtZnM6IENvdWxkbid0IGFsbG9jYXRlIHJvb3QgZGVudHJ5XG4iKTsKIAkJaXB1dChpbm9kZSk7CiAJCWdvdG8gZXJyb3Jfb3V0OwogCX0KQEAgLTE1NzIsMzAgKzE4ODgsMzIgQEAKIAlyZXR1cm4gMDsKIAogZXJyb3Jfb3V0OgotCWlmIChVREZfU0JfVkFUKHNiKSkKLQkJaXB1dChVREZfU0JfVkFUKHNiKSk7Ci0JaWYgKFVERl9TQl9OVU1QQVJUUyhzYikpIHsKLQkJaWYgKFVERl9TQl9QQVJURkxBR1Moc2IsIFVERl9TQl9QQVJUSVRJT04oc2IpKSAmIFVERl9QQVJUX0ZMQUdfVU5BTExPQ19UQUJMRSkKLQkJCWlwdXQoVURGX1NCX1BBUlRNQVBTKHNiKVtVREZfU0JfUEFSVElUSU9OKHNiKV0uc191c3BhY2Uuc190YWJsZSk7Ci0JCWlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBVREZfU0JfUEFSVElUSU9OKHNiKSkgJiBVREZfUEFSVF9GTEFHX0ZSRUVEX1RBQkxFKQotCQkJaXB1dChVREZfU0JfUEFSVE1BUFMoc2IpW1VERl9TQl9QQVJUSVRJT04oc2IpXS5zX2ZzcGFjZS5zX3RhYmxlKTsKLQkJaWYgKFVERl9TQl9QQVJURkxBR1Moc2IsIFVERl9TQl9QQVJUSVRJT04oc2IpKSAmIFVERl9QQVJUX0ZMQUdfVU5BTExPQ19CSVRNQVApCi0JCQlVREZfU0JfRlJFRV9CSVRNQVAoc2IsVURGX1NCX1BBUlRJVElPTihzYiksIHNfdXNwYWNlKTsKLQkJaWYgKFVERl9TQl9QQVJURkxBR1Moc2IsIFVERl9TQl9QQVJUSVRJT04oc2IpKSAmIFVERl9QQVJUX0ZMQUdfRlJFRURfQklUTUFQKQotCQkJVURGX1NCX0ZSRUVfQklUTUFQKHNiLFVERl9TQl9QQVJUSVRJT04oc2IpLCBzX2ZzcGFjZSk7Ci0JCWlmIChVREZfU0JfUEFSVFRZUEUoc2IsIFVERl9TQl9QQVJUSVRJT04oc2IpKSA9PSBVREZfU1BBUkFCTEVfTUFQMTUpIHsKKwlpZiAoc2JpLT5zX3ZhdF9pbm9kZSkKKwkJaXB1dChzYmktPnNfdmF0X2lub2RlKTsKKwlpZiAoc2JpLT5zX3BhcnRpdGlvbnMpIHsKKwkJc3RydWN0IHVkZl9wYXJ0X21hcCAqbWFwID0gJnNiaS0+c19wYXJ0bWFwc1tzYmktPnNfcGFydGl0aW9uXTsKKwkJaWYgKG1hcC0+c19wYXJ0aXRpb25fZmxhZ3MgJiBVREZfUEFSVF9GTEFHX1VOQUxMT0NfVEFCTEUpCisJCQlpcHV0KG1hcC0+c191c3BhY2Uuc190YWJsZSk7CisJCWlmIChtYXAtPnNfcGFydGl0aW9uX2ZsYWdzICYgVURGX1BBUlRfRkxBR19GUkVFRF9UQUJMRSkKKwkJCWlwdXQobWFwLT5zX2ZzcGFjZS5zX3RhYmxlKTsKKwkJaWYgKG1hcC0+c19wYXJ0aXRpb25fZmxhZ3MgJiBVREZfUEFSVF9GTEFHX1VOQUxMT0NfQklUTUFQKQorCQkJdWRmX3NiX2ZyZWVfYml0bWFwKG1hcC0+c191c3BhY2Uuc19iaXRtYXApOworCQlpZiAobWFwLT5zX3BhcnRpdGlvbl9mbGFncyAmIFVERl9QQVJUX0ZMQUdfRlJFRURfQklUTUFQKQorCQkJdWRmX3NiX2ZyZWVfYml0bWFwKG1hcC0+c19mc3BhY2Uuc19iaXRtYXApOworCQlpZiAobWFwLT5zX3BhcnRpdGlvbl90eXBlID09IFVERl9TUEFSQUJMRV9NQVAxNSkKIAkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JCQkJYnJlbHNlKFVERl9TQl9UWVBFU1BBUihzYiwgVURGX1NCX1BBUlRJVElPTihzYikpLnNfc3Bhcl9tYXBbaV0pOwotCQl9CisJCQkJYnJlbHNlKG1hcC0+c190eXBlX3NwZWNpZmljLnNfc3BhcmluZy4KKwkJCQkJCXNfc3Bhcl9tYXBbaV0pOwogCX0KICNpZmRlZiBDT05GSUdfVURGX05MUwogCWlmIChVREZfUVVFUllfRkxBRyhzYiwgVURGX0ZMQUdfTkxTX01BUCkpCi0JCXVubG9hZF9ubHMoVURGX1NCKHNiKS0+c19ubHNfbWFwKTsKKwkJdW5sb2FkX25scyhzYmktPnNfbmxzX21hcCk7CiAjZW5kaWYKIAlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCiAJCXVkZl9jbG9zZV9sdmlkKHNiKTsKLQlicmVsc2UoVURGX1NCX0xWSURCSChzYikpOwotCVVERl9TQl9GUkVFKHNiKTsKKwlicmVsc2Uoc2JpLT5zX2x2aWRfYmgpOworCisJa2ZyZWUoc2JpLT5zX3BhcnRtYXBzKTsKIAlrZnJlZShzYmkpOwogCXNiLT5zX2ZzX2luZm8gPSBOVUxMOwogCkBAIC0xNjE0LDcgKzE5MzIsNyBAQAogCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CiAJdnNucHJpbnRmKGVycm9yX2J1Ziwgc2l6ZW9mKGVycm9yX2J1ZiksIGZtdCwgYXJncyk7CiAJdmFfZW5kKGFyZ3MpOwotCXByaW50ayAoS0VSTl9DUklUICJVREYtZnMgZXJyb3IgKGRldmljZSAlcyk6ICVzOiAlc1xuIiwKKwlwcmludGsoS0VSTl9DUklUICJVREYtZnMgZXJyb3IgKGRldmljZSAlcyk6ICVzOiAlc1xuIiwKIAkJc2ItPnNfaWQsIGZ1bmN0aW9uLCBlcnJvcl9idWYpOwogfQogCkBAIC0xNjQ2LDMxICsxOTY0LDM0IEBACiBzdGF0aWMgdm9pZCB1ZGZfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJaW50IGk7CisJc3RydWN0IHVkZl9zYl9pbmZvICpzYmk7CiAKLQlpZiAoVURGX1NCX1ZBVChzYikpCi0JCWlwdXQoVURGX1NCX1ZBVChzYikpOwotCWlmIChVREZfU0JfTlVNUEFSVFMoc2IpKSB7Ci0JCWlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBVREZfU0JfUEFSVElUSU9OKHNiKSkgJiBVREZfUEFSVF9GTEFHX1VOQUxMT0NfVEFCTEUpCi0JCQlpcHV0KFVERl9TQl9QQVJUTUFQUyhzYilbVURGX1NCX1BBUlRJVElPTihzYildLnNfdXNwYWNlLnNfdGFibGUpOwotCQlpZiAoVURGX1NCX1BBUlRGTEFHUyhzYiwgVURGX1NCX1BBUlRJVElPTihzYikpICYgVURGX1BBUlRfRkxBR19GUkVFRF9UQUJMRSkKLQkJCWlwdXQoVURGX1NCX1BBUlRNQVBTKHNiKVtVREZfU0JfUEFSVElUSU9OKHNiKV0uc19mc3BhY2Uuc190YWJsZSk7Ci0JCWlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBVREZfU0JfUEFSVElUSU9OKHNiKSkgJiBVREZfUEFSVF9GTEFHX1VOQUxMT0NfQklUTUFQKQotCQkJVURGX1NCX0ZSRUVfQklUTUFQKHNiLFVERl9TQl9QQVJUSVRJT04oc2IpLCBzX3VzcGFjZSk7Ci0JCWlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBVREZfU0JfUEFSVElUSU9OKHNiKSkgJiBVREZfUEFSVF9GTEFHX0ZSRUVEX0JJVE1BUCkKLQkJCVVERl9TQl9GUkVFX0JJVE1BUChzYixVREZfU0JfUEFSVElUSU9OKHNiKSwgc19mc3BhY2UpOwotCQlpZiAoVURGX1NCX1BBUlRUWVBFKHNiLCBVREZfU0JfUEFSVElUSU9OKHNiKSkgPT0gVURGX1NQQVJBQkxFX01BUDE1KSB7CisJc2JpID0gVURGX1NCKHNiKTsKKwlpZiAoc2JpLT5zX3ZhdF9pbm9kZSkKKwkJaXB1dChzYmktPnNfdmF0X2lub2RlKTsKKwlpZiAoc2JpLT5zX3BhcnRpdGlvbnMpIHsKKwkJc3RydWN0IHVkZl9wYXJ0X21hcCAqbWFwID0gJnNiaS0+c19wYXJ0bWFwc1tzYmktPnNfcGFydGl0aW9uXTsKKwkJaWYgKG1hcC0+c19wYXJ0aXRpb25fZmxhZ3MgJiBVREZfUEFSVF9GTEFHX1VOQUxMT0NfVEFCTEUpCisJCQlpcHV0KG1hcC0+c191c3BhY2Uuc190YWJsZSk7CisJCWlmIChtYXAtPnNfcGFydGl0aW9uX2ZsYWdzICYgVURGX1BBUlRfRkxBR19GUkVFRF9UQUJMRSkKKwkJCWlwdXQobWFwLT5zX2ZzcGFjZS5zX3RhYmxlKTsKKwkJaWYgKG1hcC0+c19wYXJ0aXRpb25fZmxhZ3MgJiBVREZfUEFSVF9GTEFHX1VOQUxMT0NfQklUTUFQKQorCQkJdWRmX3NiX2ZyZWVfYml0bWFwKG1hcC0+c191c3BhY2Uuc19iaXRtYXApOworCQlpZiAobWFwLT5zX3BhcnRpdGlvbl9mbGFncyAmIFVERl9QQVJUX0ZMQUdfRlJFRURfQklUTUFQKQorCQkJdWRmX3NiX2ZyZWVfYml0bWFwKG1hcC0+c19mc3BhY2Uuc19iaXRtYXApOworCQlpZiAobWFwLT5zX3BhcnRpdGlvbl90eXBlID09IFVERl9TUEFSQUJMRV9NQVAxNSkKIAkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JCQkJYnJlbHNlKFVERl9TQl9UWVBFU1BBUihzYiwgVURGX1NCX1BBUlRJVElPTihzYikpLnNfc3Bhcl9tYXBbaV0pOwotCQl9CisJCQkJYnJlbHNlKG1hcC0+c190eXBlX3NwZWNpZmljLnNfc3BhcmluZy4KKwkJCQkJCXNfc3Bhcl9tYXBbaV0pOwogCX0KICNpZmRlZiBDT05GSUdfVURGX05MUwogCWlmIChVREZfUVVFUllfRkxBRyhzYiwgVURGX0ZMQUdfTkxTX01BUCkpCi0JCXVubG9hZF9ubHMoVURGX1NCKHNiKS0+c19ubHNfbWFwKTsKKwkJdW5sb2FkX25scyhzYmktPnNfbmxzX21hcCk7CiAjZW5kaWYKIAlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCiAJCXVkZl9jbG9zZV9sdmlkKHNiKTsKLQlicmVsc2UoVURGX1NCX0xWSURCSChzYikpOwotCVVERl9TQl9GUkVFKHNiKTsKKwlicmVsc2Uoc2JpLT5zX2x2aWRfYmgpOworCWtmcmVlKHNiaS0+c19wYXJ0bWFwcyk7CiAJa2ZyZWUoc2ItPnNfZnNfaW5mbyk7CiAJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CiB9CkBAIC0xNjkxLDE1ICsyMDEyLDIyIEBACiBzdGF0aWMgaW50IHVkZl9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQogewogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkZW50cnktPmRfc2I7CisJc3RydWN0IHVkZl9zYl9pbmZvICpzYmkgPSBVREZfU0Ioc2IpOworCXN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzY0ltcFVzZSAqbHZpZGl1OworCisJaWYgKHNiaS0+c19sdmlkX2JoICE9IE5VTEwpCisJCWx2aWRpdSA9IHVkZl9zYl9sdmlkaXUoc2JpKTsKKwllbHNlCisJCWx2aWRpdSA9IE5VTEw7CiAKIAlidWYtPmZfdHlwZSA9IFVERl9TVVBFUl9NQUdJQzsKIAlidWYtPmZfYnNpemUgPSBzYi0+c19ibG9ja3NpemU7Ci0JYnVmLT5mX2Jsb2NrcyA9IFVERl9TQl9QQVJUTEVOKHNiLCBVREZfU0JfUEFSVElUSU9OKHNiKSk7CisJYnVmLT5mX2Jsb2NrcyA9IHNiaS0+c19wYXJ0bWFwc1tzYmktPnNfcGFydGl0aW9uXS5zX3BhcnRpdGlvbl9sZW47CiAJYnVmLT5mX2JmcmVlID0gdWRmX2NvdW50X2ZyZWUoc2IpOwogCWJ1Zi0+Zl9iYXZhaWwgPSBidWYtPmZfYmZyZWU7Ci0JYnVmLT5mX2ZpbGVzID0gKFVERl9TQl9MVklEQkgoc2IpID8KLQkJCShsZTMyX3RvX2NwdShVREZfU0JfTFZJRElVKHNiKS0+bnVtRmlsZXMpICsKLQkJCSBsZTMyX3RvX2NwdShVREZfU0JfTFZJRElVKHNiKS0+bnVtRGlycykpIDogMCkgKyBidWYtPmZfYmZyZWU7CisJYnVmLT5mX2ZpbGVzID0gKGx2aWRpdSAhPSBOVUxMID8gKGxlMzJfdG9fY3B1KGx2aWRpdS0+bnVtRmlsZXMpICsKKwkJCQkJICBsZTMyX3RvX2NwdShsdmlkaXUtPm51bURpcnMpKSA6IDApCisJCQkrIGJ1Zi0+Zl9iZnJlZTsKIAlidWYtPmZfZmZyZWUgPSBidWYtPmZfYmZyZWU7CiAJLyogX19rZXJuZWxfZnNpZF90IGZfZnNpZCAqLwogCWJ1Zi0+Zl9uYW1lbGVuID0gVURGX05BTUVfTEVOIC0gMjsKQEAgLTE3MTEsNyArMjAzOSw4IEBACiAJMCwgMSwgMSwgMiwgMSwgMiwgMiwgMywgMSwgMiwgMiwgMywgMiwgMywgMywgNAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCB1ZGZfY291bnRfZnJlZV9iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IHVkZl9iaXRtYXAgKmJpdG1hcCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdWRmX2NvdW50X2ZyZWVfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJCSAgc3RydWN0IHVkZl9iaXRtYXAgKmJpdG1hcCkKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgYWNjdW0gPSAwOwpAQCAtMTcyNyw3ICsyMDU2LDcgQEAKIAlsb2NrX2tlcm5lbCgpOwogCiAJbG9jLmxvZ2ljYWxCbG9ja051bSA9IGJpdG1hcC0+c19leHRQb3NpdGlvbjsKLQlsb2MucGFydGl0aW9uUmVmZXJlbmNlTnVtID0gVURGX1NCX1BBUlRJVElPTihzYik7CisJbG9jLnBhcnRpdGlvblJlZmVyZW5jZU51bSA9IFVERl9TQihzYiktPnNfcGFydGl0aW9uOwogCWJoID0gdWRmX3JlYWRfcHRhZ2dlZChzYiwgbG9jLCAwLCAmaWRlbnQpOwogCiAJaWYgKCFiaCkgewpAQCAtMTc3Miw3ICsyMTAxLDggQEAKIAlyZXR1cm4gYWNjdW07CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgdWRmX2NvdW50X2ZyZWVfdGFibGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGlub2RlICp0YWJsZSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdWRmX2NvdW50X2ZyZWVfdGFibGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJIHN0cnVjdCBpbm9kZSAqdGFibGUpCiB7CiAJdW5zaWduZWQgaW50IGFjY3VtID0gMDsKIAl1aW50MzJfdCBlbGVuOwpAQCAtMTc4MiwxMyArMjExMiwxMyBAQAogCiAJbG9ja19rZXJuZWwoKTsKIAotCWVwb3MuYmxvY2sgPSBVREZfSV9MT0NBVElPTih0YWJsZSk7CisJZXBvcy5ibG9jayA9IFVERl9JKHRhYmxlKS0+aV9sb2NhdGlvbjsKIAllcG9zLm9mZnNldCA9IHNpemVvZihzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkpOwogCWVwb3MuYmggPSBOVUxMOwogCi0Jd2hpbGUgKChldHlwZSA9IHVkZl9uZXh0X2FleHQodGFibGUsICZlcG9zLCAmZWxvYywgJmVsZW4sIDEpKSAhPSAtMSkgeworCXdoaWxlICgoZXR5cGUgPSB1ZGZfbmV4dF9hZXh0KHRhYmxlLCAmZXBvcywgJmVsb2MsICZlbGVuLCAxKSkgIT0gLTEpCiAJCWFjY3VtICs9IChlbGVuID4+IHRhYmxlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKLQl9CisKIAlicmVsc2UoZXBvcy5iaCk7CiAKIAl1bmxvY2tfa2VybmVsKCk7CkBAIC0xNzk5LDEwICsyMTI5LDE3IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IHVkZl9jb3VudF9mcmVlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJdW5zaWduZWQgaW50IGFjY3VtID0gMDsKKwlzdHJ1Y3QgdWRmX3NiX2luZm8gKnNiaTsKKwlzdHJ1Y3QgdWRmX3BhcnRfbWFwICptYXA7CiAKLQlpZiAoVURGX1NCX0xWSURCSChzYikpIHsKLQkJaWYgKGxlMzJfdG9fY3B1KFVERl9TQl9MVklEKHNiKS0+bnVtT2ZQYXJ0aXRpb25zKSA+IFVERl9TQl9QQVJUSVRJT04oc2IpKSB7Ci0JCQlhY2N1bSA9IGxlMzJfdG9fY3B1KFVERl9TQl9MVklEKHNiKS0+ZnJlZVNwYWNlVGFibGVbVURGX1NCX1BBUlRJVElPTihzYildKTsKKwlzYmkgPSBVREZfU0Ioc2IpOworCWlmIChzYmktPnNfbHZpZF9iaCkgeworCQlzdHJ1Y3QgbG9naWNhbFZvbEludGVncml0eURlc2MgKmx2aWQgPQorCQkJKHN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzYyAqKQorCQkJc2JpLT5zX2x2aWRfYmgtPmJfZGF0YTsKKwkJaWYgKGxlMzJfdG9fY3B1KGx2aWQtPm51bU9mUGFydGl0aW9ucykgPiBzYmktPnNfcGFydGl0aW9uKSB7CisJCQlhY2N1bSA9IGxlMzJfdG9fY3B1KAorCQkJCQlsdmlkLT5mcmVlU3BhY2VUYWJsZVtzYmktPnNfcGFydGl0aW9uXSk7CiAJCQlpZiAoYWNjdW0gPT0gMHhGRkZGRkZGRikKIAkJCQlhY2N1bSA9IDA7CiAJCX0KQEAgLTE4MTEsMjQgKzIxNDgsMjUgQEAKIAlpZiAoYWNjdW0pCiAJCXJldHVybiBhY2N1bTsKIAotCWlmIChVREZfU0JfUEFSVEZMQUdTKHNiLFVERl9TQl9QQVJUSVRJT04oc2IpKSAmIFVERl9QQVJUX0ZMQUdfVU5BTExPQ19CSVRNQVApIHsKKwltYXAgPSAmc2JpLT5zX3BhcnRtYXBzW3NiaS0+c19wYXJ0aXRpb25dOworCWlmIChtYXAtPnNfcGFydGl0aW9uX2ZsYWdzICYgVURGX1BBUlRfRkxBR19VTkFMTE9DX0JJVE1BUCkgewogCQlhY2N1bSArPSB1ZGZfY291bnRfZnJlZV9iaXRtYXAoc2IsCi0JCQkJCSAgICAgICBVREZfU0JfUEFSVE1BUFMoc2IpW1VERl9TQl9QQVJUSVRJT04oc2IpXS5zX3VzcGFjZS5zX2JpdG1hcCk7CisJCQkJCSAgICAgICBtYXAtPnNfdXNwYWNlLnNfYml0bWFwKTsKIAl9Ci0JaWYgKFVERl9TQl9QQVJURkxBR1Moc2IsVURGX1NCX1BBUlRJVElPTihzYikpICYgVURGX1BBUlRfRkxBR19GUkVFRF9CSVRNQVApIHsKKwlpZiAobWFwLT5zX3BhcnRpdGlvbl9mbGFncyAmIFVERl9QQVJUX0ZMQUdfRlJFRURfQklUTUFQKSB7CiAJCWFjY3VtICs9IHVkZl9jb3VudF9mcmVlX2JpdG1hcChzYiwKLQkJCQkJICAgICAgIFVERl9TQl9QQVJUTUFQUyhzYilbVURGX1NCX1BBUlRJVElPTihzYildLnNfZnNwYWNlLnNfYml0bWFwKTsKKwkJCQkJICAgICAgIG1hcC0+c19mc3BhY2Uuc19iaXRtYXApOwogCX0KIAlpZiAoYWNjdW0pCiAJCXJldHVybiBhY2N1bTsKIAotCWlmIChVREZfU0JfUEFSVEZMQUdTKHNiLFVERl9TQl9QQVJUSVRJT04oc2IpKSAmIFVERl9QQVJUX0ZMQUdfVU5BTExPQ19UQUJMRSkgeworCWlmIChtYXAtPnNfcGFydGl0aW9uX2ZsYWdzICYgVURGX1BBUlRfRkxBR19VTkFMTE9DX1RBQkxFKSB7CiAJCWFjY3VtICs9IHVkZl9jb3VudF9mcmVlX3RhYmxlKHNiLAotCQkJCQkgICAgICBVREZfU0JfUEFSVE1BUFMoc2IpW1VERl9TQl9QQVJUSVRJT04oc2IpXS5zX3VzcGFjZS5zX3RhYmxlKTsKKwkJCQkJICAgICAgbWFwLT5zX3VzcGFjZS5zX3RhYmxlKTsKIAl9Ci0JaWYgKFVERl9TQl9QQVJURkxBR1Moc2IsVURGX1NCX1BBUlRJVElPTihzYikpICYgVURGX1BBUlRfRkxBR19GUkVFRF9UQUJMRSkgeworCWlmIChtYXAtPnNfcGFydGl0aW9uX2ZsYWdzICYgVURGX1BBUlRfRkxBR19GUkVFRF9UQUJMRSkgewogCQlhY2N1bSArPSB1ZGZfY291bnRfZnJlZV90YWJsZShzYiwKLQkJCQkJICAgICAgVURGX1NCX1BBUlRNQVBTKHNiKVtVREZfU0JfUEFSVElUSU9OKHNiKV0uc19mc3BhY2Uuc190YWJsZSk7CisJCQkJCSAgICAgIG1hcC0+c19mc3BhY2Uuc190YWJsZSk7CiAJfQogCiAJcmV0dXJuIGFjY3VtOwpkaWZmIC0tZ2l0IGEvZnMvdWRmL3N5bWxpbmsuYyBiL2ZzL3VkZi9zeW1saW5rLmMKaW5kZXggZTZmOTMzZC4uNmVjOTkyMiAxMDA2NDQKLS0tIGEvZnMvdWRmL3N5bWxpbmsuYworKysgYi9mcy91ZGYvc3ltbGluay5jCkBAIC0zMyw3ICszMyw4IEBACiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KICNpbmNsdWRlICJ1ZGZfaS5oIgogCi1zdGF0aWMgdm9pZCB1ZGZfcGNfdG9fY2hhcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjaGFyICpmcm9tLCBpbnQgZnJvbWxlbiwgY2hhciAqdG8pCitzdGF0aWMgdm9pZCB1ZGZfcGNfdG9fY2hhcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjaGFyICpmcm9tLCBpbnQgZnJvbWxlbiwKKwkJCSAgIGNoYXIgKnRvKQogewogCXN0cnVjdCBwYXRoQ29tcG9uZW50ICpwYzsKIAlpbnQgZWxlbiA9IDA7CkBAIC03OCwxMCArNzksMTIgQEAKIAljaGFyICpzeW1saW5rOwogCWludCBlcnIgPSAtRUlPOwogCWNoYXIgKnAgPSBrbWFwKHBhZ2UpOworCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqaWluZm87CiAKIAlsb2NrX2tlcm5lbCgpOwotCWlmIChVREZfSV9BTExPQ1RZUEUoaW5vZGUpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikgewotCQlzeW1saW5rID0gVURGX0lfREFUQShpbm9kZSkgKyBVREZfSV9MRU5FQVRUUihpbm9kZSk7CisJaWluZm8gPSBVREZfSShpbm9kZSk7CisJaWYgKGlpbmZvLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKSB7CisJCXN5bWxpbmsgPSBpaW5mby0+aV9leHQuaV9kYXRhICsgaWluZm8tPmlfbGVuRUF0dHI7CiAJfSBlbHNlIHsKIAkJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgdWRmX2Jsb2NrX21hcChpbm9kZSwgMCkpOwogCmRpZmYgLS1naXQgYS9mcy91ZGYvdHJ1bmNhdGUuYyBiL2ZzL3VkZi90cnVuY2F0ZS5jCmluZGV4IDdmYzM5MTIuLmZlNjFiZTEgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi90cnVuY2F0ZS5jCisrKyBiL2ZzL3VkZi90cnVuY2F0ZS5jCkBAIC03NCwxNyArNzQsMTggQEAKIAl1aW50NjRfdCBsYmNvdW50ID0gMDsKIAlpbnQ4X3QgZXR5cGUgPSAtMSwgbmV0eXBlOwogCWludCBhZHNpemU7CisJc3RydWN0IHVkZl9pbm9kZV9pbmZvICppaW5mbyA9IFVERl9JKGlub2RlKTsKIAotCWlmIChVREZfSV9BTExPQ1RZUEUoaW5vZGUpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQiB8fAotCSAgICBpbm9kZS0+aV9zaXplID09IFVERl9JX0xFTkVYVEVOVFMoaW5vZGUpKQorCWlmIChpaW5mby0+aV9hbGxvY190eXBlID09IElDQlRBR19GTEFHX0FEX0lOX0lDQiB8fAorCSAgICBpbm9kZS0+aV9zaXplID09IGlpbmZvLT5pX2xlbkV4dGVudHMpCiAJCXJldHVybjsKIAkvKiBBcmUgd2UgZ29pbmcgdG8gZGVsZXRlIHRoZSBmaWxlIGFueXdheT8gKi8KIAlpZiAoaW5vZGUtPmlfbmxpbmsgPT0gMCkKIAkJcmV0dXJuOwogCi0JaWYgKFVERl9JX0FMTE9DVFlQRShpbm9kZSkgPT0gSUNCVEFHX0ZMQUdfQURfU0hPUlQpCisJaWYgKGlpbmZvLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfU0hPUlQpCiAJCWFkc2l6ZSA9IHNpemVvZihzaG9ydF9hZCk7Ci0JZWxzZSBpZiAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9PSBJQ0JUQUdfRkxBR19BRF9MT05HKQorCWVsc2UgaWYgKGlpbmZvLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfTE9ORykKIAkJYWRzaXplID0gc2l6ZW9mKGxvbmdfYWQpOwogCWVsc2UKIAkJQlVHKCk7CkBAIC0xMTcsNyArMTE4LDcgQEAKIAl9CiAJLyogVGhpcyBpbm9kZSBlbnRyeSBpcyBpbi1tZW1vcnkgb25seSBhbmQgdGh1cyB3ZSBkb24ndCBoYXZlIHRvIG1hcmsKIAkgKiB0aGUgaW5vZGUgZGlydHkgKi8KLQlVREZfSV9MRU5FWFRFTlRTKGlub2RlKSA9IGlub2RlLT5pX3NpemU7CisJaWluZm8tPmlfbGVuRXh0ZW50cyA9IGlub2RlLT5pX3NpemU7CiAJYnJlbHNlKGVwb3MuYmgpOwogfQogCkBAIC0xMjksMTkgKzEzMCwyMCBAQAogCXVpbnQ2NF90IGxiY291bnQgPSAwOwogCWludDhfdCBldHlwZSA9IC0xLCBuZXR5cGU7CiAJaW50IGFkc2l6ZTsKKwlzdHJ1Y3QgdWRmX2lub2RlX2luZm8gKmlpbmZvID0gVURGX0koaW5vZGUpOwogCi0JaWYgKFVERl9JX0FMTE9DVFlQRShpbm9kZSkgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCIHx8Ci0JICAgIGlub2RlLT5pX3NpemUgPT0gVURGX0lfTEVORVhURU5UUyhpbm9kZSkpCisJaWYgKGlpbmZvLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCIHx8CisJICAgIGlub2RlLT5pX3NpemUgPT0gaWluZm8tPmlfbGVuRXh0ZW50cykKIAkJcmV0dXJuOwogCi0JaWYgKFVERl9JX0FMTE9DVFlQRShpbm9kZSkgPT0gSUNCVEFHX0ZMQUdfQURfU0hPUlQpCisJaWYgKGlpbmZvLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfU0hPUlQpCiAJCWFkc2l6ZSA9IHNpemVvZihzaG9ydF9hZCk7Ci0JZWxzZSBpZiAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9PSBJQ0JUQUdfRkxBR19BRF9MT05HKQorCWVsc2UgaWYgKGlpbmZvLT5pX2FsbG9jX3R5cGUgPT0gSUNCVEFHX0ZMQUdfQURfTE9ORykKIAkJYWRzaXplID0gc2l6ZW9mKGxvbmdfYWQpOwogCWVsc2UKIAkJYWRzaXplID0gMDsKIAotCWVwb3MuYmxvY2sgPSBVREZfSV9MT0NBVElPTihpbm9kZSk7CisJZXBvcy5ibG9jayA9IGlpbmZvLT5pX2xvY2F0aW9uOwogCiAJLyogRmluZCB0aGUgbGFzdCBleHRlbnQgaW4gdGhlIGZpbGUgKi8KIAl3aGlsZSAoKG5ldHlwZSA9IHVkZl9uZXh0X2FleHQoaW5vZGUsICZlcG9zLCAmZWxvYywgJmVsZW4sIDEpKSAhPSAtMSkgewpAQCAtMTUzLDggKzE1NSw5IEBACiAJCWxiY291bnQgLT0gZWxlbjsKIAkJZXh0ZW50X3RydW5jKGlub2RlLCAmZXBvcywgZWxvYywgZXR5cGUsIGVsZW4sIDApOwogCQlpZiAoIWVwb3MuYmgpIHsKLQkJCVVERl9JX0xFTkFMTE9DKGlub2RlKSA9Ci0JCQkJZXBvcy5vZmZzZXQgLSB1ZGZfZmlsZV9lbnRyeV9hbGxvY19vZmZzZXQoaW5vZGUpOworCQkJaWluZm8tPmlfbGVuQWxsb2MgPQorCQkJCWVwb3Mub2Zmc2V0IC0KKwkJCQl1ZGZfZmlsZV9lbnRyeV9hbGxvY19vZmZzZXQoaW5vZGUpOwogCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJCX0gZWxzZSB7CiAJCQlzdHJ1Y3QgYWxsb2NFeHREZXNjICphZWQgPQpAQCAtMTYzLDcgKzE2Niw3IEBACiAJCQkJY3B1X3RvX2xlMzIoZXBvcy5vZmZzZXQgLQogCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpKTsKIAkJCWlmICghVURGX1FVRVJZX0ZMQUcoaW5vZGUtPmlfc2IsIFVERl9GTEFHX1NUUklDVCkgfHwKLQkJCSAgICBVREZfU0JfVURGUkVWKGlub2RlLT5pX3NiKSA+PSAweDAyMDEpCisJCQkgICAgVURGX1NCKGlub2RlLT5pX3NiKS0+c191ZGZyZXYgPj0gMHgwMjAxKQogCQkJCXVkZl91cGRhdGVfdGFnKGVwb3MuYmgtPmJfZGF0YSwgZXBvcy5vZmZzZXQpOwogCQkJZWxzZQogCQkJCXVkZl91cGRhdGVfdGFnKGVwb3MuYmgtPmJfZGF0YSwKQEAgLTE3Myw3ICsxNzYsNyBAQAogCX0KIAkvKiBUaGlzIGlub2RlIGVudHJ5IGlzIGluLW1lbW9yeSBvbmx5IGFuZCB0aHVzIHdlIGRvbid0IGhhdmUgdG8gbWFyawogCSAqIHRoZSBpbm9kZSBkaXJ0eSAqLwotCVVERl9JX0xFTkVYVEVOVFMoaW5vZGUpID0gbGJjb3VudDsKKwlpaW5mby0+aV9sZW5FeHRlbnRzID0gbGJjb3VudDsKIAlicmVsc2UoZXBvcy5iaCk7CiB9CiAKQEAgLTE4NCwxMyArMTg3LDE1IEBACiAJdWludDMyX3QgZWxlbiwgbmVsZW4gPSAwLCBpbmRpcmVjdF9leHRfbGVuID0gMCwgbGVuYWxsb2M7CiAJaW50OF90IGV0eXBlOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgdWRmX3NiX2luZm8gKnNiaSA9IFVERl9TQihzYik7CiAJc2VjdG9yX3QgZmlyc3RfYmxvY2sgPSBpbm9kZS0+aV9zaXplID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzLCBvZmZzZXQ7CiAJbG9mZl90IGJ5dGVfb2Zmc2V0OwogCWludCBhZHNpemU7CisJc3RydWN0IHVkZl9pbm9kZV9pbmZvICppaW5mbyA9IFVERl9JKGlub2RlKTsKIAotCWlmIChVREZfSV9BTExPQ1RZUEUoaW5vZGUpID09IElDQlRBR19GTEFHX0FEX1NIT1JUKQorCWlmIChpaW5mby0+aV9hbGxvY190eXBlID09IElDQlRBR19GTEFHX0FEX1NIT1JUKQogCQlhZHNpemUgPSBzaXplb2Yoc2hvcnRfYWQpOwotCWVsc2UgaWYgKFVERl9JX0FMTE9DVFlQRShpbm9kZSkgPT0gSUNCVEFHX0ZMQUdfQURfTE9ORykKKwllbHNlIGlmIChpaW5mby0+aV9hbGxvY190eXBlID09IElDQlRBR19GTEFHX0FEX0xPTkcpCiAJCWFkc2l6ZSA9IHNpemVvZihsb25nX2FkKTsKIAllbHNlCiAJCUJVRygpOwpAQCAtMjEyLDcgKzIxNyw4IEBACiAJCWVsc2UKIAkJCWxlbmFsbG9jIC09IHNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKTsKIAotCQl3aGlsZSAoKGV0eXBlID0gdWRmX2N1cnJlbnRfYWV4dChpbm9kZSwgJmVwb3MsICZlbG9jLCAmZWxlbiwgMCkpICE9IC0xKSB7CisJCXdoaWxlICgoZXR5cGUgPSB1ZGZfY3VycmVudF9hZXh0KGlub2RlLCAmZXBvcywgJmVsb2MsCisJCQkJCQkgJmVsZW4sIDApKSAhPSAtMSkgewogCQkJaWYgKGV0eXBlID09IChFWFRfTkVYVF9FWFRFTlRfQUxMT0NERUNTID4+IDMwKSkgewogCQkJCXVkZl93cml0ZV9hZXh0KGlub2RlLCAmZXBvcywgbmVsb2MsIG5lbGVuLCAwKTsKIAkJCQlpZiAoaW5kaXJlY3RfZXh0X2xlbikgewpAQCAtMjI0LDM1ICsyMzAsNDMgQEAKIAkJCQkJCQkwLCBpbmRpcmVjdF9leHRfbGVuKTsKIAkJCQl9IGVsc2UgewogCQkJCQlpZiAoIWVwb3MuYmgpIHsKLQkJCQkJCVVERl9JX0xFTkFMTE9DKGlub2RlKSA9IGxlbmFsbG9jOworCQkJCQkJaWluZm8tPmlfbGVuQWxsb2MgPQorCQkJCQkJCQlsZW5hbGxvYzsKIAkJCQkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCQkJCQl9IGVsc2UgewogCQkJCQkJc3RydWN0IGFsbG9jRXh0RGVzYyAqYWVkID0KLQkJCQkJCQkoc3RydWN0IGFsbG9jRXh0RGVzYyAqKShlcG9zLmJoLT5iX2RhdGEpOworCQkJCQkJCShzdHJ1Y3QgYWxsb2NFeHREZXNjICopCisJCQkJCQkJKGVwb3MuYmgtPmJfZGF0YSk7CisJCQkJCQlpbnQgbGVuID0KKwkJCQkJCSAgICBzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYyk7CisKIAkJCQkJCWFlZC0+bGVuZ3RoQWxsb2NEZXNjcyA9CiAJCQkJCQkgICAgY3B1X3RvX2xlMzIobGVuYWxsb2MpOwotCQkJCQkJaWYgKCFVREZfUVVFUllfRkxBRyhzYiwgVURGX0ZMQUdfU1RSSUNUKSB8fAotCQkJCQkJICAgIFVERl9TQl9VREZSRVYoc2IpID49IDB4MDIwMSkKLQkJCQkJCQl1ZGZfdXBkYXRlX3RhZyhlcG9zLmJoLT5iX2RhdGEsCi0JCQkJCQkJCSAgICAgICBsZW5hbGxvYyArCi0JCQkJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYykpOwotCQkJCQkJZWxzZQotCQkJCQkJCXVkZl91cGRhdGVfdGFnKGVwb3MuYmgtPmJfZGF0YSwKLQkJCQkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKSk7Ci0JCQkJCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShlcG9zLmJoLCBpbm9kZSk7CisJCQkJCQlpZiAoIVVERl9RVUVSWV9GTEFHKHNiLAorCQkJCQkJCVVERl9GTEFHX1NUUklDVCkgfHwKKwkJCQkJCSAgICBzYmktPnNfdWRmcmV2ID49IDB4MDIwMSkKKwkJCQkJCQlsZW4gKz0gbGVuYWxsb2M7CisKKwkJCQkJCXVkZl91cGRhdGVfdGFnKGVwb3MuYmgtPmJfZGF0YSwKKwkJCQkJCQkJbGVuKTsKKwkJCQkJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKAorCQkJCQkJCQllcG9zLmJoLCBpbm9kZSk7CiAJCQkJCX0KIAkJCQl9CiAJCQkJYnJlbHNlKGVwb3MuYmgpOwogCQkJCWVwb3Mub2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpOwogCQkJCWVwb3MuYmxvY2sgPSBlbG9jOwotCQkJCWVwb3MuYmggPSB1ZGZfdHJlYWQoc2IsIHVkZl9nZXRfbGJfcGJsb2NrKHNiLCBlbG9jLCAwKSk7CisJCQkJZXBvcy5iaCA9IHVkZl90cmVhZChzYiwKKwkJCQkJCXVkZl9nZXRfbGJfcGJsb2NrKHNiLCBlbG9jLCAwKSk7CiAJCQkJaWYgKGVsZW4pCi0JCQkJCWluZGlyZWN0X2V4dF9sZW4gPSAoZWxlbiArIHNiLT5zX2Jsb2Nrc2l6ZSAtMSkgPj4KKwkJCQkJaW5kaXJlY3RfZXh0X2xlbiA9CisJCQkJCQkoZWxlbiArIHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+CiAJCQkJCQlzYi0+c19ibG9ja3NpemVfYml0czsKIAkJCQllbHNlCiAJCQkJCWluZGlyZWN0X2V4dF9sZW4gPSAxOwogCQkJfSBlbHNlIHsKLQkJCQlleHRlbnRfdHJ1bmMoaW5vZGUsICZlcG9zLCBlbG9jLCBldHlwZSwgZWxlbiwgMCk7CisJCQkJZXh0ZW50X3RydW5jKGlub2RlLCAmZXBvcywgZWxvYywgZXR5cGUsCisJCQkJCSAgICAgZWxlbiwgMCk7CiAJCQkJZXBvcy5vZmZzZXQgKz0gYWRzaXplOwogCQkJfQogCQl9CkBAIC0yNjQsMTkgKzI3OCwyMCBAQAogCQkJCQlpbmRpcmVjdF9leHRfbGVuKTsKIAkJfSBlbHNlIHsKIAkJCWlmICghZXBvcy5iaCkgewotCQkJCVVERl9JX0xFTkFMTE9DKGlub2RlKSA9IGxlbmFsbG9jOworCQkJCWlpbmZvLT5pX2xlbkFsbG9jID0gbGVuYWxsb2M7CiAJCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJCQl9IGVsc2UgewogCQkJCXN0cnVjdCBhbGxvY0V4dERlc2MgKmFlZCA9CiAJCQkJICAgIChzdHJ1Y3QgYWxsb2NFeHREZXNjICopKGVwb3MuYmgtPmJfZGF0YSk7CiAJCQkJYWVkLT5sZW5ndGhBbGxvY0Rlc2NzID0gY3B1X3RvX2xlMzIobGVuYWxsb2MpOwogCQkJCWlmICghVURGX1FVRVJZX0ZMQUcoc2IsIFVERl9GTEFHX1NUUklDVCkgfHwKLQkJCQkgICAgVURGX1NCX1VERlJFVihzYikgPj0gMHgwMjAxKQorCQkJCSAgICBzYmktPnNfdWRmcmV2ID49IDB4MDIwMSkKIAkJCQkJdWRmX3VwZGF0ZV90YWcoZXBvcy5iaC0+Yl9kYXRhLAotCQkJCQkJICAgICAgIGxlbmFsbG9jICsgc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpKTsKKwkJCQkJCWxlbmFsbG9jICsKKwkJCQkJCXNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKSk7CiAJCQkJZWxzZQogCQkJCQl1ZGZfdXBkYXRlX3RhZyhlcG9zLmJoLT5iX2RhdGEsCi0JCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpKTsKKwkJCQkJCXNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKSk7CiAJCQkJbWFya19idWZmZXJfZGlydHlfaW5vZGUoZXBvcy5iaCwgaW5vZGUpOwogCQkJfQogCQl9CkBAIC0yOTAsMTMgKzMwNSwxNiBAQAogCQkJICogIGV4dGVuZGluZyB0aGUgZmlsZSBieSAnb2Zmc2V0JyBibG9ja3MuCiAJCQkgKi8KIAkJCWlmICgoIWVwb3MuYmggJiYKLQkJCSAgICAgZXBvcy5vZmZzZXQgPT0gdWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKSkgfHwKLQkJCSAgICAoZXBvcy5iaCAmJiBlcG9zLm9mZnNldCA9PSBzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYykpKSB7CisJCQkgICAgIGVwb3Mub2Zmc2V0ID09CisJCQkJCXVkZl9maWxlX2VudHJ5X2FsbG9jX29mZnNldChpbm9kZSkpIHx8CisJCQkgICAgKGVwb3MuYmggJiYgZXBvcy5vZmZzZXQgPT0KKwkJCQkJCXNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKSkpIHsKIAkJCQkvKiBGaWxlIGhhcyBubyBleHRlbnRzIGF0IGFsbCBvciBoYXMgZW1wdHkgbGFzdAogCQkJCSAqIGluZGlyZWN0IGV4dGVudCEgQ3JlYXRlIGEgZmFrZSBleHRlbnQuLi4gKi8KIAkJCQlleHRlbnQuZXh0TG9jYXRpb24ubG9naWNhbEJsb2NrTnVtID0gMDsKIAkJCQlleHRlbnQuZXh0TG9jYXRpb24ucGFydGl0aW9uUmVmZXJlbmNlTnVtID0gMDsKLQkJCQlleHRlbnQuZXh0TGVuZ3RoID0gRVhUX05PVF9SRUNPUkRFRF9OT1RfQUxMT0NBVEVEOworCQkJCWV4dGVudC5leHRMZW5ndGggPQorCQkJCQlFWFRfTk9UX1JFQ09SREVEX05PVF9BTExPQ0FURUQ7CiAJCQl9IGVsc2UgewogCQkJCWVwb3Mub2Zmc2V0IC09IGFkc2l6ZTsKIAkJCQlldHlwZSA9IHVkZl9uZXh0X2FleHQoaW5vZGUsICZlcG9zLApAQCAtMzA1LDEwICszMjMsMTIgQEAKIAkJCQlleHRlbnQuZXh0TGVuZ3RoIHw9IGV0eXBlIDw8IDMwOwogCQkJfQogCQkJdWRmX2V4dGVuZF9maWxlKGlub2RlLCAmZXBvcywgJmV4dGVudCwKLQkJCQkJb2Zmc2V0ICsgKChpbm9kZS0+aV9zaXplICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSAhPSAwKSk7CisJCQkJCW9mZnNldCArCisJCQkJCSgoaW5vZGUtPmlfc2l6ZSAmCisJCQkJCQkoc2ItPnNfYmxvY2tzaXplIC0gMSkpICE9IDApKTsKIAkJfQogCX0KLQlVREZfSV9MRU5FWFRFTlRTKGlub2RlKSA9IGlub2RlLT5pX3NpemU7CisJaWluZm8tPmlfbGVuRXh0ZW50cyA9IGlub2RlLT5pX3NpemU7CiAKIAlicmVsc2UoZXBvcy5iaCk7CiB9CmRpZmYgLS1naXQgYS9mcy91ZGYvdWRmX2kuaCBiL2ZzL3VkZi91ZGZfaS5oCmluZGV4IGQ3ZGJlNmYuLmNjYzUyZjEgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi91ZGZfaS5oCisrKyBiL2ZzL3VkZi91ZGZfaS5oCkBAIC03LDIwICs3LDQgQEAKIAlyZXR1cm4gbGlzdF9lbnRyeShpbm9kZSwgc3RydWN0IHVkZl9pbm9kZV9pbmZvLCB2ZnNfaW5vZGUpOwogfQogCi0jZGVmaW5lIFVERl9JX0xPQ0FUSU9OKFgpCSggVURGX0koWCktPmlfbG9jYXRpb24gKQotI2RlZmluZSBVREZfSV9MRU5FQVRUUihYKQkoIFVERl9JKFgpLT5pX2xlbkVBdHRyICkKLSNkZWZpbmUgVURGX0lfTEVOQUxMT0MoWCkJKCBVREZfSShYKS0+aV9sZW5BbGxvYyApCi0jZGVmaW5lIFVERl9JX0xFTkVYVEVOVFMoWCkJKCBVREZfSShYKS0+aV9sZW5FeHRlbnRzICkKLSNkZWZpbmUgVURGX0lfVU5JUVVFKFgpCQkoIFVERl9JKFgpLT5pX3VuaXF1ZSApCi0jZGVmaW5lIFVERl9JX0FMTE9DVFlQRShYKQkoIFVERl9JKFgpLT5pX2FsbG9jX3R5cGUgKQotI2RlZmluZSBVREZfSV9FRkUoWCkJCSggVURGX0koWCktPmlfZWZlICkKLSNkZWZpbmUgVURGX0lfVVNFKFgpCQkoIFVERl9JKFgpLT5pX3VzZSApCi0jZGVmaW5lIFVERl9JX1NUUkFUNDA5NihYKQkoIFVERl9JKFgpLT5pX3N0cmF0NDA5NiApCi0jZGVmaW5lIFVERl9JX05FWFRfQUxMT0NfQkxPQ0soWCkJKCBVREZfSShYKS0+aV9uZXh0X2FsbG9jX2Jsb2NrICkKLSNkZWZpbmUgVURGX0lfTkVYVF9BTExPQ19HT0FMKFgpCSggVURGX0koWCktPmlfbmV4dF9hbGxvY19nb2FsICkKLSNkZWZpbmUgVURGX0lfQ1JUSU1FKFgpCQkoIFVERl9JKFgpLT5pX2NydGltZSApCi0jZGVmaW5lIFVERl9JX1NBRChYKQkJKCBVREZfSShYKS0+aV9leHQuaV9zYWQgKQotI2RlZmluZSBVREZfSV9MQUQoWCkJCSggVURGX0koWCktPmlfZXh0LmlfbGFkICkKLSNkZWZpbmUgVURGX0lfREFUQShYKQkJKCBVREZfSShYKS0+aV9leHQuaV9kYXRhICkKLQogI2VuZGlmIC8qICFkZWZpbmVkKF9MSU5VWF9VREZfSV9IKSAqLwpkaWZmIC0tZ2l0IGEvZnMvdWRmL3VkZl9zYi5oIGIvZnMvdWRmL3VkZl9zYi5oCmluZGV4IDNjMjk4MjAuLjczN2QxYzYgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi91ZGZfc2IuaAorKysgYi9mcy91ZGYvdWRmX3NiLmgKQEAgLTI2LDYgKzI2LDggQEAKICNkZWZpbmUgVURGX0ZMQUdfR0lEX0lHTk9SRSAgICAgMTQKICNkZWZpbmUgVURGX0ZMQUdfVUlEX1NFVAkxNQogI2RlZmluZSBVREZfRkxBR19HSURfU0VUCTE2CisjZGVmaW5lIFVERl9GTEFHX1NFU1NJT05fU0VUCTE3CisjZGVmaW5lIFVERl9GTEFHX0xBU1RCTE9DS19TRVQJMTgKIAogI2RlZmluZSBVREZfUEFSVF9GTEFHX1VOQUxMT0NfQklUTUFQCTB4MDAwMQogI2RlZmluZSBVREZfUEFSVF9GTEFHX1VOQUxMT0NfVEFCTEUJMHgwMDAyCkBAIC00MSw5NiArNDMsMTIgQEAKIAlyZXR1cm4gc2ItPnNfZnNfaW5mbzsKIH0KIAotI2RlZmluZSBVREZfU0JfRlJFRShYKVwKLXtcCi0JaWYgKFVERl9TQihYKSkge1wKLQkJa2ZyZWUoVURGX1NCX1BBUlRNQVBTKFgpKTtcCi0JCVVERl9TQl9QQVJUTUFQUyhYKSA9IE5VTEw7XAotCX1cCi19CitzdHJ1Y3QgbG9naWNhbFZvbEludGVncml0eURlc2NJbXBVc2UgKnVkZl9zYl9sdmlkaXUoc3RydWN0IHVkZl9zYl9pbmZvICpzYmkpOwogCi0jZGVmaW5lIFVERl9TQl9BTExPQ19QQVJUTUFQUyhYLFkpXAote1wKLQlVREZfU0JfUEFSVE1BUFMoWCkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdWRmX3BhcnRfbWFwKSAqIFksIEdGUF9LRVJORUwpO1wKLQlpZiAoVURGX1NCX1BBUlRNQVBTKFgpICE9IE5VTEwpIHtcCi0JCVVERl9TQl9OVU1QQVJUUyhYKSA9IFk7XAotCQltZW1zZXQoVURGX1NCX1BBUlRNQVBTKFgpLCAweDAwLCBzaXplb2Yoc3RydWN0IHVkZl9wYXJ0X21hcCkgKiBZKTtcCi0JfSBlbHNlIHtcCi0JCVVERl9TQl9OVU1QQVJUUyhYKSA9IDA7XAotCQl1ZGZfZXJyb3IoWCwgX19GVU5DVElPTl9fLCAiVW5hYmxlIHRvIGFsbG9jYXRlIHNwYWNlIGZvciAlZCBwYXJ0aXRpb24gbWFwcyIsIFkpO1wKLQl9XAotfQotCi0jZGVmaW5lIFVERl9TQl9BTExPQ19CSVRNQVAoWCxZLFopXAote1wKLQlpbnQgbnJfZ3JvdXBzID0gKChVREZfU0JfUEFSVExFTigoWCksKFkpKSArIChzaXplb2Yoc3RydWN0IHNwYWNlQml0bWFwRGVzYykgPDwgMykgK1wKLQkJKChYKS0+c19ibG9ja3NpemUgKiA4KSAtIDEpIC8gKChYKS0+c19ibG9ja3NpemUgKiA4KSk7XAotCWludCBzaXplID0gc2l6ZW9mKHN0cnVjdCB1ZGZfYml0bWFwKSArIChzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopICogbnJfZ3JvdXBzKTtcCi0JaWYgKHNpemUgPD0gUEFHRV9TSVpFKVwKLQkJVURGX1NCX1BBUlRNQVBTKFgpWyhZKV0uWi5zX2JpdG1hcCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7XAotCWVsc2VcCi0JCVVERl9TQl9QQVJUTUFQUyhYKVsoWSldLlouc19iaXRtYXAgPSB2bWFsbG9jKHNpemUpO1wKLQlpZiAoVURGX1NCX1BBUlRNQVBTKFgpWyhZKV0uWi5zX2JpdG1hcCAhPSBOVUxMKSB7XAotCQltZW1zZXQoVURGX1NCX1BBUlRNQVBTKFgpWyhZKV0uWi5zX2JpdG1hcCwgMHgwMCwgc2l6ZSk7XAotCQlVREZfU0JfUEFSVE1BUFMoWClbKFkpXS5aLnNfYml0bWFwLT5zX2Jsb2NrX2JpdG1hcCA9XAotCQkJKHN0cnVjdCBidWZmZXJfaGVhZCAqKikoVURGX1NCX1BBUlRNQVBTKFgpWyhZKV0uWi5zX2JpdG1hcCArIDEpO1wKLQkJVURGX1NCX1BBUlRNQVBTKFgpWyhZKV0uWi5zX2JpdG1hcC0+c19ucl9ncm91cHMgPSBucl9ncm91cHM7XAotCX0gZWxzZSB7XAotCQl1ZGZfZXJyb3IoWCwgX19GVU5DVElPTl9fLCAiVW5hYmxlIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBiaXRtYXAgYW5kICVkIGJ1ZmZlcl9oZWFkIHBvaW50ZXJzIiwgbnJfZ3JvdXBzKTtcCi0JfVwKLX0KLQotI2RlZmluZSBVREZfU0JfRlJFRV9CSVRNQVAoWCxZLFopXAote1wKLQlpbnQgaTtcCi0JaW50IG5yX2dyb3VwcyA9IFVERl9TQl9CSVRNQVBfTlJfR1JPVVBTKFgsWSxaKTtcCi0JaW50IHNpemUgPSBzaXplb2Yoc3RydWN0IHVkZl9iaXRtYXApICsgKHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKikgKiBucl9ncm91cHMpO1wKLQlmb3IgKGkgPSAwOyBpIDwgbnJfZ3JvdXBzOyBpKyspIHtcCi0JCWlmIChVREZfU0JfQklUTUFQKFgsWSxaLGkpKVwKLQkJCWJyZWxzZShVREZfU0JfQklUTUFQKFgsWSxaLGkpKTtcCi0JfVwKLQlpZiAoc2l6ZSA8PSBQQUdFX1NJWkUpXAotCQlrZnJlZShVREZfU0JfUEFSVE1BUFMoWClbWV0uWi5zX2JpdG1hcCk7XAotCWVsc2VcCi0JCXZmcmVlKFVERl9TQl9QQVJUTUFQUyhYKVtZXS5aLnNfYml0bWFwKTtcCi19CitpbnQgdWRmX2NvbXB1dGVfbnJfZ3JvdXBzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHUzMiBwYXJ0aXRpb24pOwogCiAjZGVmaW5lIFVERl9RVUVSWV9GTEFHKFgsWSkJCQkoIFVERl9TQihYKS0+c19mbGFncyAmICggMSA8PCAoWSkgKSApCiAjZGVmaW5lIFVERl9TRVRfRkxBRyhYLFkpCQkJKCBVREZfU0IoWCktPnNfZmxhZ3MgfD0gKCAxIDw8IChZKSApICkKICNkZWZpbmUgVURGX0NMRUFSX0ZMQUcoWCxZKQkJCSggVURGX1NCKFgpLT5zX2ZsYWdzICY9IH4oIDEgPDwgKFkpICkgKQogCi0jZGVmaW5lIFVERl9VUERBVEVfVURGUkVWKFgsWSkJCQkoICgoWSkgPiBVREZfU0JfVURGUkVWKFgpKSA/IFVERl9TQl9VREZSRVYoWCkgPSAoWSkgOiBVREZfU0JfVURGUkVWKFgpICkKLQotI2RlZmluZSBVREZfU0JfUEFSVE1BUFMoWCkJCQkoIFVERl9TQihYKS0+c19wYXJ0bWFwcyApCi0jZGVmaW5lIFVERl9TQl9QQVJUVFlQRShYLFkpCQkJKCBVREZfU0JfUEFSVE1BUFMoWClbKFkpXS5zX3BhcnRpdGlvbl90eXBlICkKLSNkZWZpbmUgVURGX1NCX1BBUlRST09UKFgsWSkJCQkoIFVERl9TQl9QQVJUTUFQUyhYKVsoWSldLnNfcGFydGl0aW9uX3Jvb3QgKQotI2RlZmluZSBVREZfU0JfUEFSVExFTihYLFkpCQkJKCBVREZfU0JfUEFSVE1BUFMoWClbKFkpXS5zX3BhcnRpdGlvbl9sZW4gKQotI2RlZmluZSBVREZfU0JfUEFSVFZTTihYLFkpCQkJKCBVREZfU0JfUEFSVE1BUFMoWClbKFkpXS5zX3ZvbHVtZXNlcW51bSApCi0jZGVmaW5lIFVERl9TQl9QQVJUTlVNKFgsWSkJCQkoIFVERl9TQl9QQVJUTUFQUyhYKVsoWSldLnNfcGFydGl0aW9uX251bSApCi0jZGVmaW5lIFVERl9TQl9UWVBFU1BBUihYLFkpCQkJKCBVREZfU0JfUEFSVE1BUFMoWClbKFkpXS5zX3R5cGVfc3BlY2lmaWMuc19zcGFyaW5nICkKLSNkZWZpbmUgVURGX1NCX1RZUEVWSVJUKFgsWSkJCQkoIFVERl9TQl9QQVJUTUFQUyhYKVsoWSldLnNfdHlwZV9zcGVjaWZpYy5zX3ZpcnR1YWwgKQotI2RlZmluZSBVREZfU0JfUEFSVEZVTkMoWCxZKQkJCSggVURGX1NCX1BBUlRNQVBTKFgpWyhZKV0uc19wYXJ0aXRpb25fZnVuYyApCi0jZGVmaW5lIFVERl9TQl9QQVJURkxBR1MoWCxZKQkJCSggVURGX1NCX1BBUlRNQVBTKFgpWyhZKV0uc19wYXJ0aXRpb25fZmxhZ3MgKQotI2RlZmluZSBVREZfU0JfQklUTUFQKFgsWSxaLEkpCQkJKCBVREZfU0JfUEFSVE1BUFMoWClbKFkpXS5aLnNfYml0bWFwLT5zX2Jsb2NrX2JpdG1hcFtJXSApCi0jZGVmaW5lIFVERl9TQl9CSVRNQVBfTlJfR1JPVVBTKFgsWSxaKQkJKCBVREZfU0JfUEFSVE1BUFMoWClbKFkpXS5aLnNfYml0bWFwLT5zX25yX2dyb3VwcyApCi0KLSNkZWZpbmUgVURGX1NCX1ZPTElERU5UKFgpCQkJKCBVREZfU0IoWCktPnNfdm9saWRlbnQgKQotI2RlZmluZSBVREZfU0JfTlVNUEFSVFMoWCkJCQkoIFVERl9TQihYKS0+c19wYXJ0aXRpb25zICkKLSNkZWZpbmUgVURGX1NCX1BBUlRJVElPTihYKQkJCSggVURGX1NCKFgpLT5zX3BhcnRpdGlvbiApCi0jZGVmaW5lIFVERl9TQl9TRVNTSU9OKFgpCQkJKCBVREZfU0IoWCktPnNfc2Vzc2lvbiApCi0jZGVmaW5lIFVERl9TQl9BTkNIT1IoWCkJCQkoIFVERl9TQihYKS0+c19hbmNob3IgKQotI2RlZmluZSBVREZfU0JfTEFTVEJMT0NLKFgpCQkJKCBVREZfU0IoWCktPnNfbGFzdGJsb2NrICkKLSNkZWZpbmUgVURGX1NCX0xWSURCSChYKQkJCSggVURGX1NCKFgpLT5zX2x2aWRiaCApCi0jZGVmaW5lIFVERl9TQl9MVklEKFgpCQkJCSggKHN0cnVjdCBsb2dpY2FsVm9sSW50ZWdyaXR5RGVzYyAqKVVERl9TQl9MVklEQkgoWCktPmJfZGF0YSApCi0jZGVmaW5lIFVERl9TQl9MVklESVUoWCkJCQkoIChzdHJ1Y3QgbG9naWNhbFZvbEludGVncml0eURlc2NJbXBVc2UgKikmKFVERl9TQl9MVklEKFgpLT5pbXBVc2VbbGUzMl90b19jcHUoVURGX1NCX0xWSUQoWCktPm51bU9mUGFydGl0aW9ucykgKiAyICogc2l6ZW9mKHVpbnQzMl90KS9zaXplb2YodWludDhfdCldKSApCi0KLSNkZWZpbmUgVURGX1NCX1VNQVNLKFgpCQkJCSggVURGX1NCKFgpLT5zX3VtYXNrICkKLSNkZWZpbmUgVURGX1NCX0dJRChYKQkJCQkoIFVERl9TQihYKS0+c19naWQgKQotI2RlZmluZSBVREZfU0JfVUlEKFgpCQkJCSggVURGX1NCKFgpLT5zX3VpZCApCi0jZGVmaW5lIFVERl9TQl9SRUNPUkRUSU1FKFgpCQkJKCBVREZfU0IoWCktPnNfcmVjb3JkdGltZSApCi0jZGVmaW5lIFVERl9TQl9TRVJJQUxOVU0oWCkJCQkoIFVERl9TQihYKS0+c19zZXJpYWxudW0gKQotI2RlZmluZSBVREZfU0JfVURGUkVWKFgpCQkJKCBVREZfU0IoWCktPnNfdWRmcmV2ICkKLSNkZWZpbmUgVURGX1NCX0ZMQUdTKFgpCQkJCSggVURGX1NCKFgpLT5zX2ZsYWdzICkKLSNkZWZpbmUgVURGX1NCX1ZBVChYKQkJCQkoIFVERl9TQihYKS0+c192YXQgKQotCiAjZW5kaWYgLyogX19MSU5VWF9VREZfU0JfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvdWRmL3VkZmRlY2wuaCBiL2ZzL3VkZi91ZGZkZWNsLmgKaW5kZXggYzgwMTZjYy4uNjgxZGMyYiAxMDA2NDQKLS0tIGEvZnMvdWRmL3VkZmRlY2wuaAorKysgYi9mcy91ZGYvdWRmZGVjbC5oCkBAIC0yNCwxOCArMjQsMjEgQEAKICNkZWZpbmUgVURGX1BBVEhfTEVOCQkxMDIzCiAKICNkZWZpbmUgdWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKVwKLQkoVURGX0lfVVNFKGlub2RlKSA/XAorCShVREZfSShpbm9kZSktPmlfdXNlID9cCiAJCXNpemVvZihzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkpIDpcCi0JCSgoVURGX0lfRUZFKGlub2RlKSA/XAorCQkoKFVERl9JKGlub2RlKS0+aV9lZmUgP1wKIAkJCXNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkpIDpcCi0JCQlzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSkpICsgVURGX0lfTEVORUFUVFIoaW5vZGUpKSkKKwkJCXNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KSkgKyBVREZfSShpbm9kZSktPmlfbGVuRUF0dHIpKQogCiAjZGVmaW5lIHVkZl9leHQwX29mZnNldChpbm9kZSlcCi0JKFVERl9JX0FMTE9DVFlQRShpbm9kZSkgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCID9cCisJKFVERl9JKGlub2RlKS0+aV9hbGxvY190eXBlID09IElDQlRBR19GTEFHX0FEX0lOX0lDQiA/XAogCQl1ZGZfZmlsZV9lbnRyeV9hbGxvY19vZmZzZXQoaW5vZGUpIDogMCkKIAogI2RlZmluZSB1ZGZfZ2V0X2xiX3BibG9jayhzYixsb2Msb2Zmc2V0KSB1ZGZfZ2V0X3BibG9jaygoc2IpLCAobG9jKS5sb2dpY2FsQmxvY2tOdW0sIChsb2MpLnBhcnRpdGlvblJlZmVyZW5jZU51bSwgKG9mZnNldCkpCiAKKy8qIGNvbXB1dGVzIHRhZyBjaGVja3N1bSAqLwordTggdWRmX3RhZ19jaGVja3N1bShjb25zdCB0YWcgKnQpOworCiBzdHJ1Y3QgZGVudHJ5Owogc3RydWN0IGlub2RlOwogc3RydWN0IHRhc2tfc3RydWN0OwpAQCAtMTg1LDggKzE4OCw4IEBACiAJCQkJCQlzZWN0b3JfdCAqKTsKIGV4dGVybiBzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqdWRmX2dldF9maWxlaWRlbnQodm9pZCAqYnVmZmVyLCBpbnQgYnVmc2l6ZSwKIAkJCQkJICAgICAgIGludCAqb2Zmc2V0KTsKLWV4dGVybiBsb25nX2FkICp1ZGZfZ2V0X2ZpbGVsb25nYWQodWludDhfdCAqLCBpbnQsIGludCAqLCBpbnQpOwotZXh0ZXJuIHNob3J0X2FkICp1ZGZfZ2V0X2ZpbGVzaG9ydGFkKHVpbnQ4X3QgKiwgaW50LCBpbnQgKiwgaW50KTsKK2V4dGVybiBsb25nX2FkICp1ZGZfZ2V0X2ZpbGVsb25nYWQodWludDhfdCAqLCBpbnQsIHVpbnQzMl90ICosIGludCk7CitleHRlcm4gc2hvcnRfYWQgKnVkZl9nZXRfZmlsZXNob3J0YWQodWludDhfdCAqLCBpbnQsIHVpbnQzMl90ICosIGludCk7CiAKIC8qIGNyYy5jICovCiBleHRlcm4gdWludDE2X3QgdWRmX2NyYyh1aW50OF90ICosIHVpbnQzMl90LCB1aW50MTZfdCk7CmRpZmYgLS1naXQgYS9mcy91ZGYvdWRmdGltZS5jIGIvZnMvdWRmL3VkZnRpbWUuYwppbmRleCBhZGNiODdjLi5jZTU5NTczIDEwMDY0NAotLS0gYS9mcy91ZGYvdWRmdGltZS5jCisrKyBiL2ZzL3VkZi91ZGZ0aW1lLmMKQEAgLTE4LDggKzE4LDEwIEBACiAgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCiAKIC8qCi0gKiBkZ2IgMTAvMDIvOTg6IHJpcHBlZCB0aGlzIGZyb20gZ2xpYmMgc291cmNlIHRvIGhlbHAgY29udmVydCB0aW1lc3RhbXBzIHRvIHVuaXggdGltZQotICogICAgIDEwLzA0Lzk4OiBhZGRlZCBuZXcgdGFibGUtYmFzZWQgbG9va3VwIGFmdGVyIHNlZWluZyBob3cgdWdseSB0aGUgZ251IGNvZGUgaXMKKyAqIGRnYiAxMC8wMi85ODogcmlwcGVkIHRoaXMgZnJvbSBnbGliYyBzb3VyY2UgdG8gaGVscCBjb252ZXJ0IHRpbWVzdGFtcHMKKyAqICAgICAgICAgICAgICAgdG8gdW5peCB0aW1lCisgKiAgICAgMTAvMDQvOTg6IGFkZGVkIG5ldyB0YWJsZS1iYXNlZCBsb29rdXAgYWZ0ZXIgc2VlaW5nIGhvdyB1Z2x5CisgKiAgICAgICAgICAgICAgIHRoZSBnbnUgY29kZSBpcwogICogYmxmIDA5LzI3Lzk5OiByaXBwZWQgb3V0IGFsbCB0aGUgb2xkIGNvZGUgYW5kIGluc2VydGVkIG5ldyB0YWJsZSBmcm9tCiAgKgkJIEpvaG4gQnJvY2ttZXllciAod2l0aG91dCBsZWFwIHNlY29uZCBjb3JyZWN0aW9ucykKICAqCQkgcmV3cm90ZSB1ZGZfc3RhbXBfdG9fdGltZSBhbmQgZml4ZWQgdGltZXpvbmUgYWNjb3VudGluZyBpbgpAQCAtNTUsMjcgKzU3LDI3IEBACiAKICNkZWZpbmUgTUFYX1lFQVJfU0VDT05EUwk2OQogI2RlZmluZSBTUEQJCQkweDE1MTgwCS8qMzYwMCoyNCAqLwotI2RlZmluZSBTUFkoeSxsLHMpCQkoU1BEICogKDM2NSp5K2wpK3MpCisjZGVmaW5lIFNQWSh5LCBsLCBzKQkJKFNQRCAqICgzNjUgKiB5ICsgbCkgKyBzKQogCi1zdGF0aWMgdGltZV90IHllYXJfc2Vjb25kc1tNQVhfWUVBUl9TRUNPTkRTXT0gewotLyoxOTcwKi8gU1BZKCAwLCAwLDApLCBTUFkoIDEsIDAsMCksIFNQWSggMiwgMCwwKSwgU1BZKCAzLCAxLDApLAotLyoxOTc0Ki8gU1BZKCA0LCAxLDApLCBTUFkoIDUsIDEsMCksIFNQWSggNiwgMSwwKSwgU1BZKCA3LCAyLDApLAotLyoxOTc4Ki8gU1BZKCA4LCAyLDApLCBTUFkoIDksIDIsMCksIFNQWSgxMCwgMiwwKSwgU1BZKDExLCAzLDApLAotLyoxOTgyKi8gU1BZKDEyLCAzLDApLCBTUFkoMTMsIDMsMCksIFNQWSgxNCwgMywwKSwgU1BZKDE1LCA0LDApLAotLyoxOTg2Ki8gU1BZKDE2LCA0LDApLCBTUFkoMTcsIDQsMCksIFNQWSgxOCwgNCwwKSwgU1BZKDE5LCA1LDApLAotLyoxOTkwKi8gU1BZKDIwLCA1LDApLCBTUFkoMjEsIDUsMCksIFNQWSgyMiwgNSwwKSwgU1BZKDIzLCA2LDApLAotLyoxOTk0Ki8gU1BZKDI0LCA2LDApLCBTUFkoMjUsIDYsMCksIFNQWSgyNiwgNiwwKSwgU1BZKDI3LCA3LDApLAotLyoxOTk4Ki8gU1BZKDI4LCA3LDApLCBTUFkoMjksIDcsMCksIFNQWSgzMCwgNywwKSwgU1BZKDMxLCA4LDApLAotLyoyMDAyKi8gU1BZKDMyLCA4LDApLCBTUFkoMzMsIDgsMCksIFNQWSgzNCwgOCwwKSwgU1BZKDM1LCA5LDApLAotLyoyMDA2Ki8gU1BZKDM2LCA5LDApLCBTUFkoMzcsIDksMCksIFNQWSgzOCwgOSwwKSwgU1BZKDM5LDEwLDApLAotLyoyMDEwKi8gU1BZKDQwLDEwLDApLCBTUFkoNDEsMTAsMCksIFNQWSg0MiwxMCwwKSwgU1BZKDQzLDExLDApLAotLyoyMDE0Ki8gU1BZKDQ0LDExLDApLCBTUFkoNDUsMTEsMCksIFNQWSg0NiwxMSwwKSwgU1BZKDQ3LDEyLDApLAotLyoyMDE4Ki8gU1BZKDQ4LDEyLDApLCBTUFkoNDksMTIsMCksIFNQWSg1MCwxMiwwKSwgU1BZKDUxLDEzLDApLAotLyoyMDIyKi8gU1BZKDUyLDEzLDApLCBTUFkoNTMsMTMsMCksIFNQWSg1NCwxMywwKSwgU1BZKDU1LDE0LDApLAotLyoyMDI2Ki8gU1BZKDU2LDE0LDApLCBTUFkoNTcsMTQsMCksIFNQWSg1OCwxNCwwKSwgU1BZKDU5LDE1LDApLAotLyoyMDMwKi8gU1BZKDYwLDE1LDApLCBTUFkoNjEsMTUsMCksIFNQWSg2MiwxNSwwKSwgU1BZKDYzLDE2LDApLAotLyoyMDM0Ki8gU1BZKDY0LDE2LDApLCBTUFkoNjUsMTYsMCksIFNQWSg2NiwxNiwwKSwgU1BZKDY3LDE3LDApLAotLyoyMDM4Ki8gU1BZKDY4LDE3LDApCitzdGF0aWMgdGltZV90IHllYXJfc2Vjb25kc1tNQVhfWUVBUl9TRUNPTkRTXSA9IHsKKy8qMTk3MCovIFNQWSgwLCAgIDAsIDApLCBTUFkoMSwgICAwLCAwKSwgU1BZKDIsICAgMCwgMCksIFNQWSgzLCAgIDEsIDApLAorLyoxOTc0Ki8gU1BZKDQsICAgMSwgMCksIFNQWSg1LCAgIDEsIDApLCBTUFkoNiwgICAxLCAwKSwgU1BZKDcsICAgMiwgMCksCisvKjE5NzgqLyBTUFkoOCwgICAyLCAwKSwgU1BZKDksICAgMiwgMCksIFNQWSgxMCwgIDIsIDApLCBTUFkoMTEsICAzLCAwKSwKKy8qMTk4MiovIFNQWSgxMiwgIDMsIDApLCBTUFkoMTMsICAzLCAwKSwgU1BZKDE0LCAgMywgMCksIFNQWSgxNSwgIDQsIDApLAorLyoxOTg2Ki8gU1BZKDE2LCAgNCwgMCksIFNQWSgxNywgIDQsIDApLCBTUFkoMTgsICA0LCAwKSwgU1BZKDE5LCAgNSwgMCksCisvKjE5OTAqLyBTUFkoMjAsICA1LCAwKSwgU1BZKDIxLCAgNSwgMCksIFNQWSgyMiwgIDUsIDApLCBTUFkoMjMsICA2LCAwKSwKKy8qMTk5NCovIFNQWSgyNCwgIDYsIDApLCBTUFkoMjUsICA2LCAwKSwgU1BZKDI2LCAgNiwgMCksIFNQWSgyNywgIDcsIDApLAorLyoxOTk4Ki8gU1BZKDI4LCAgNywgMCksIFNQWSgyOSwgIDcsIDApLCBTUFkoMzAsICA3LCAwKSwgU1BZKDMxLCAgOCwgMCksCisvKjIwMDIqLyBTUFkoMzIsICA4LCAwKSwgU1BZKDMzLCAgOCwgMCksIFNQWSgzNCwgIDgsIDApLCBTUFkoMzUsICA5LCAwKSwKKy8qMjAwNiovIFNQWSgzNiwgIDksIDApLCBTUFkoMzcsICA5LCAwKSwgU1BZKDM4LCAgOSwgMCksIFNQWSgzOSwgMTAsIDApLAorLyoyMDEwKi8gU1BZKDQwLCAxMCwgMCksIFNQWSg0MSwgMTAsIDApLCBTUFkoNDIsIDEwLCAwKSwgU1BZKDQzLCAxMSwgMCksCisvKjIwMTQqLyBTUFkoNDQsIDExLCAwKSwgU1BZKDQ1LCAxMSwgMCksIFNQWSg0NiwgMTEsIDApLCBTUFkoNDcsIDEyLCAwKSwKKy8qMjAxOCovIFNQWSg0OCwgMTIsIDApLCBTUFkoNDksIDEyLCAwKSwgU1BZKDUwLCAxMiwgMCksIFNQWSg1MSwgMTMsIDApLAorLyoyMDIyKi8gU1BZKDUyLCAxMywgMCksIFNQWSg1MywgMTMsIDApLCBTUFkoNTQsIDEzLCAwKSwgU1BZKDU1LCAxNCwgMCksCisvKjIwMjYqLyBTUFkoNTYsIDE0LCAwKSwgU1BZKDU3LCAxNCwgMCksIFNQWSg1OCwgMTQsIDApLCBTUFkoNTksIDE1LCAwKSwKKy8qMjAzMCovIFNQWSg2MCwgMTUsIDApLCBTUFkoNjEsIDE1LCAwKSwgU1BZKDYyLCAxNSwgMCksIFNQWSg2MywgMTYsIDApLAorLyoyMDM0Ki8gU1BZKDY0LCAxNiwgMCksIFNQWSg2NSwgMTYsIDApLCBTUFkoNjYsIDE2LCAwKSwgU1BZKDY3LCAxNywgMCksCisvKjIwMzgqLyBTUFkoNjgsIDE3LCAwKQogfTsKIAogZXh0ZXJuIHN0cnVjdCB0aW1lem9uZSBzeXNfdHo7CkBAIC0xMTUsNyArMTE3LDcgQEAKIAlyZXR1cm4gZGVzdDsKIH0KIAota2VybmVsX3RpbWVzdGFtcCAqdWRmX3RpbWVfdG9fc3RhbXAoa2VybmVsX3RpbWVzdGFtcCAqIGRlc3QsIHN0cnVjdCB0aW1lc3BlYyB0cykKK2tlcm5lbF90aW1lc3RhbXAgKnVkZl90aW1lX3RvX3N0YW1wKGtlcm5lbF90aW1lc3RhbXAgKmRlc3QsIHN0cnVjdCB0aW1lc3BlYyB0cykKIHsKIAlsb25nIGludCBkYXlzLCByZW0sIHk7CiAJY29uc3QgdW5zaWduZWQgc2hvcnQgaW50ICppcDsKQEAgLTEzNyw3ICsxMzksNyBAQAogCWRlc3QtPnNlY29uZCA9IHJlbSAlIDYwOwogCXkgPSAxOTcwOwogCi0jZGVmaW5lIERJVihhLGIpICgoYSkgLyAoYikgLSAoKGEpICUgKGIpIDwgMCkpCisjZGVmaW5lIERJVihhLCBiKSAoKGEpIC8gKGIpIC0gKChhKSAlIChiKSA8IDApKQogI2RlZmluZSBMRUFQU19USFJVX0VORF9PRih5KSAoRElWICh5LCA0KSAtIERJViAoeSwgMTAwKSArIERJViAoeSwgNDAwKSkKIAogCXdoaWxlIChkYXlzIDwgMCB8fCBkYXlzID49IChfX2lzbGVhcCh5KSA/IDM2NiA6IDM2NSkpIHsKQEAgLTE0NSw4ICsxNDcsOCBAQAogCiAJCS8qIEFkanVzdCBEQVlTIGFuZCBZIHRvIG1hdGNoIHRoZSBndWVzc2VkIHllYXIuICAqLwogCQlkYXlzIC09ICgoeWcgLSB5KSAqIDM2NQotCQkJICsgTEVBUFNfVEhSVV9FTkRfT0YgKHlnIC0gMSkKLQkJCSAtIExFQVBTX1RIUlVfRU5EX09GICh5IC0gMSkpOworCQkJICsgTEVBUFNfVEhSVV9FTkRfT0YoeWcgLSAxKQorCQkJIC0gTEVBUFNfVEhSVV9FTkRfT0YoeSAtIDEpKTsKIAkJeSA9IHlnOwogCX0KIAlkZXN0LT55ZWFyID0geTsKQEAgLTE1OCw3ICsxNjAsOCBAQAogCWRlc3QtPmRheSA9IGRheXMgKyAxOwogCiAJZGVzdC0+Y2VudGlzZWNvbmRzID0gdHMudHZfbnNlYyAvIDEwMDAwMDAwOwotCWRlc3QtPmh1bmRyZWRzT2ZNaWNyb3NlY29uZHMgPSAodHMudHZfbnNlYyAvIDEwMDAgLSBkZXN0LT5jZW50aXNlY29uZHMgKiAxMDAwMCkgLyAxMDA7CisJZGVzdC0+aHVuZHJlZHNPZk1pY3Jvc2Vjb25kcyA9ICh0cy50dl9uc2VjIC8gMTAwMCAtCisJCQkJCWRlc3QtPmNlbnRpc2Vjb25kcyAqIDEwMDAwKSAvIDEwMDsKIAlkZXN0LT5taWNyb3NlY29uZHMgPSAodHMudHZfbnNlYyAvIDEwMDAgLSBkZXN0LT5jZW50aXNlY29uZHMgKiAxMDAwMCAtCiAJCQkgICAgICBkZXN0LT5odW5kcmVkc09mTWljcm9zZWNvbmRzICogMTAwKTsKIAlyZXR1cm4gZGVzdDsKZGlmZiAtLWdpdCBhL2ZzL3VkZi91bmljb2RlLmMgYi9mcy91ZGYvdW5pY29kZS5jCmluZGV4IDllNjA5OWMuLmU1MzNiMTEgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi91bmljb2RlLmMKKysrIGIvZnMvdWRmL3VuaWNvZGUuYwpAQCAtMTM2LDEyICsxMzYsMTggQEAKIAkJaWYgKGMgPCAweDgwVSkgewogCQkJdXRmX28tPnVfbmFtZVt1dGZfby0+dV9sZW4rK10gPSAodWludDhfdCljOwogCQl9IGVsc2UgaWYgKGMgPCAweDgwMFUpIHsKLQkJCXV0Zl9vLT51X25hbWVbdXRmX28tPnVfbGVuKytdID0gKHVpbnQ4X3QpKDB4YzAgfCAoYyA+PiA2KSk7Ci0JCQl1dGZfby0+dV9uYW1lW3V0Zl9vLT51X2xlbisrXSA9ICh1aW50OF90KSgweDgwIHwgKGMgJiAweDNmKSk7CisJCQl1dGZfby0+dV9uYW1lW3V0Zl9vLT51X2xlbisrXSA9CisJCQkJCQkodWludDhfdCkoMHhjMCB8IChjID4+IDYpKTsKKwkJCXV0Zl9vLT51X25hbWVbdXRmX28tPnVfbGVuKytdID0KKwkJCQkJCSh1aW50OF90KSgweDgwIHwgKGMgJiAweDNmKSk7CiAJCX0gZWxzZSB7Ci0JCQl1dGZfby0+dV9uYW1lW3V0Zl9vLT51X2xlbisrXSA9ICh1aW50OF90KSgweGUwIHwgKGMgPj4gMTIpKTsKLQkJCXV0Zl9vLT51X25hbWVbdXRmX28tPnVfbGVuKytdID0gKHVpbnQ4X3QpKDB4ODAgfCAoKGMgPj4gNikgJiAweDNmKSk7Ci0JCQl1dGZfby0+dV9uYW1lW3V0Zl9vLT51X2xlbisrXSA9ICh1aW50OF90KSgweDgwIHwgKGMgJiAweDNmKSk7CisJCQl1dGZfby0+dV9uYW1lW3V0Zl9vLT51X2xlbisrXSA9CisJCQkJCQkodWludDhfdCkoMHhlMCB8IChjID4+IDEyKSk7CisJCQl1dGZfby0+dV9uYW1lW3V0Zl9vLT51X2xlbisrXSA9CisJCQkJCQkodWludDhfdCkoMHg4MCB8CisJCQkJCQkJICAoKGMgPj4gNikgJiAweDNmKSk7CisJCQl1dGZfby0+dV9uYW1lW3V0Zl9vLT51X2xlbisrXSA9CisJCQkJCQkodWludDhfdCkoMHg4MCB8IChjICYgMHgzZikpOwogCQl9CiAJfQogCXV0Zl9vLT51X2NtcElEID0gODsKQEAgLTIzMiw5ICsyMzgsOCBAQAogCQkJZ290byBlcnJvcl9vdXQ7CiAJCX0KIAotCQlpZiAobWF4X3ZhbCA9PSAweGZmZmZVKSB7CisJCWlmIChtYXhfdmFsID09IDB4ZmZmZlUpCiAJCQlvY3VbKyt1X2xlbl0gPSAodWludDhfdCkodXRmX2NoYXIgPj4gOCk7Ci0JCX0KIAkJb2N1WysrdV9sZW5dID0gKHVpbnQ4X3QpKHV0Zl9jaGFyICYgMHhmZlUpOwogCX0KIApAQCAtMzMwLDI5ICszMzUsMjkgQEAKIAlzdHJ1Y3QgdXN0ciBmaWxlbmFtZSwgdW5pZmlsZW5hbWU7CiAJaW50IGxlbjsKIAotCWlmICh1ZGZfYnVpbGRfdXN0cl9leGFjdCgmdW5pZmlsZW5hbWUsIHNuYW1lLCBmbGVuKSkgeworCWlmICh1ZGZfYnVpbGRfdXN0cl9leGFjdCgmdW5pZmlsZW5hbWUsIHNuYW1lLCBmbGVuKSkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJaWYgKFVERl9RVUVSWV9GTEFHKHNiLCBVREZfRkxBR19VVEY4KSkgewogCQlpZiAoIXVkZl9DUzB0b1VURjgoJmZpbGVuYW1lLCAmdW5pZmlsZW5hbWUpKSB7Ci0JCQl1ZGZfZGVidWcoIkZhaWxlZCBpbiB1ZGZfZ2V0X2ZpbGVuYW1lOiBzbmFtZSA9ICVzXG4iLCBzbmFtZSk7CisJCQl1ZGZfZGVidWcoIkZhaWxlZCBpbiB1ZGZfZ2V0X2ZpbGVuYW1lOiBzbmFtZSA9ICVzXG4iLAorCQkJCSAgc25hbWUpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9IGVsc2UgaWYgKFVERl9RVUVSWV9GTEFHKHNiLCBVREZfRkxBR19OTFNfTUFQKSkgewotCQlpZiAoIXVkZl9DUzB0b05MUyhVREZfU0Ioc2IpLT5zX25sc19tYXAsICZmaWxlbmFtZSwgJnVuaWZpbGVuYW1lKSkgewotCQkJdWRmX2RlYnVnKCJGYWlsZWQgaW4gdWRmX2dldF9maWxlbmFtZTogc25hbWUgPSAlc1xuIiwgc25hbWUpOworCQlpZiAoIXVkZl9DUzB0b05MUyhVREZfU0Ioc2IpLT5zX25sc19tYXAsICZmaWxlbmFtZSwKKwkJCQkgICZ1bmlmaWxlbmFtZSkpIHsKKwkJCXVkZl9kZWJ1ZygiRmFpbGVkIGluIHVkZl9nZXRfZmlsZW5hbWU6IHNuYW1lID0gJXNcbiIsCisJCQkJICBzbmFtZSk7CiAJCQlyZXR1cm4gMDsKIAkJfQotCX0gZWxzZSB7CisJfSBlbHNlCiAJCXJldHVybiAwOwotCX0KIAogCWxlbiA9IHVkZl90cmFuc2xhdGVfdG9fbGludXgoZG5hbWUsIGZpbGVuYW1lLnVfbmFtZSwgZmlsZW5hbWUudV9sZW4sCiAJCQkJICAgICB1bmlmaWxlbmFtZS51X25hbWUsIHVuaWZpbGVuYW1lLnVfbGVuKTsKLQlpZiAobGVuKSB7CisJaWYgKGxlbikKIAkJcmV0dXJuIGxlbjsKLQl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM2MywyMyArMzY4LDIwIEBACiAJc3RydWN0IHVzdHIgdW5pZmlsZW5hbWU7CiAJaW50IG5hbWVsZW47CiAKLQlpZiAoISh1ZGZfY2hhcl90b191c3RyKCZ1bmlmaWxlbmFtZSwgc25hbWUsIGZsZW4pKSkgeworCWlmICghdWRmX2NoYXJfdG9fdXN0cigmdW5pZmlsZW5hbWUsIHNuYW1lLCBmbGVuKSkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJaWYgKFVERl9RVUVSWV9GTEFHKHNiLCBVREZfRkxBR19VVEY4KSkgewogCQluYW1lbGVuID0gdWRmX1VURjh0b0NTMChkbmFtZSwgJnVuaWZpbGVuYW1lLCBVREZfTkFNRV9MRU4pOwotCQlpZiAoIW5hbWVsZW4pIHsKKwkJaWYgKCFuYW1lbGVuKQogCQkJcmV0dXJuIDA7Ci0JCX0KIAl9IGVsc2UgaWYgKFVERl9RVUVSWV9GTEFHKHNiLCBVREZfRkxBR19OTFNfTUFQKSkgewotCQluYW1lbGVuID0gdWRmX05MU3RvQ1MwKFVERl9TQihzYiktPnNfbmxzX21hcCwgZG5hbWUsICZ1bmlmaWxlbmFtZSwgVURGX05BTUVfTEVOKTsKLQkJaWYgKCFuYW1lbGVuKSB7CisJCW5hbWVsZW4gPSB1ZGZfTkxTdG9DUzAoVURGX1NCKHNiKS0+c19ubHNfbWFwLCBkbmFtZSwKKwkJCQkJJnVuaWZpbGVuYW1lLCBVREZfTkFNRV9MRU4pOworCQlpZiAoIW5hbWVsZW4pCiAJCQlyZXR1cm4gMDsKLQkJfQotCX0gZWxzZSB7CisJfSBlbHNlCiAJCXJldHVybiAwOwotCX0KIAogCXJldHVybiBuYW1lbGVuOwogfQpAQCAtMzg5LDggKzM5MSw5IEBACiAjZGVmaW5lIENSQ19NQVJLCQknIycKICNkZWZpbmUgRVhUX1NJWkUgCQk1CiAKLXN0YXRpYyBpbnQgdWRmX3RyYW5zbGF0ZV90b19saW51eCh1aW50OF90ICpuZXdOYW1lLCB1aW50OF90ICp1ZGZOYW1lLCBpbnQgdWRmTGVuLAotCQkJCSAgdWludDhfdCAqZmlkTmFtZSwgaW50IGZpZE5hbWVMZW4pCitzdGF0aWMgaW50IHVkZl90cmFuc2xhdGVfdG9fbGludXgodWludDhfdCAqbmV3TmFtZSwgdWludDhfdCAqdWRmTmFtZSwKKwkJCQkgIGludCB1ZGZMZW4sIHVpbnQ4X3QgKmZpZE5hbWUsCisJCQkJICBpbnQgZmlkTmFtZUxlbikKIHsKIAlpbnQgaW5kZXgsIG5ld0luZGV4ID0gMCwgbmVlZHNDUkMgPSAwOwogCWludCBleHRJbmRleCA9IDAsIG5ld0V4dEluZGV4ID0gMCwgaGFzRXh0ID0gMDsKQEAgLTQwOSwxMyArNDEyLDE2IEBACiAJCQlpZiAoY3VyciA9PSAnLycgfHwgY3VyciA9PSAwKSB7CiAJCQkJbmVlZHNDUkMgPSAxOwogCQkJCWN1cnIgPSBJTExFR0FMX0NIQVJfTUFSSzsKLQkJCQl3aGlsZSAoaW5kZXggKyAxIDwgdWRmTGVuICYmICh1ZGZOYW1lW2luZGV4ICsgMV0gPT0gJy8nIHx8Ci0JCQkJCQkJICAgICAgdWRmTmFtZVtpbmRleCArIDFdID09IDApKQorCQkJCXdoaWxlIChpbmRleCArIDEgPCB1ZGZMZW4gJiYKKwkJCQkJCSh1ZGZOYW1lW2luZGV4ICsgMV0gPT0gJy8nIHx8CisJCQkJCQkgdWRmTmFtZVtpbmRleCArIDFdID09IDApKQogCQkJCQlpbmRleCsrOwotCQkJfSBpZiAoY3VyciA9PSBFWFRfTUFSSyAmJiAodWRmTGVuIC0gaW5kZXggLSAxKSA8PSBFWFRfU0laRSkgewotCQkJCWlmICh1ZGZMZW4gPT0gaW5kZXggKyAxKSB7CisJCQl9CisJCQlpZiAoY3VyciA9PSBFWFRfTUFSSyAmJgorCQkJCQkodWRmTGVuIC0gaW5kZXggLSAxKSA8PSBFWFRfU0laRSkgeworCQkJCWlmICh1ZGZMZW4gPT0gaW5kZXggKyAxKQogCQkJCQloYXNFeHQgPSAwOwotCQkJCX0gZWxzZSB7CisJCQkJZWxzZSB7CiAJCQkJCWhhc0V4dCA9IDE7CiAJCQkJCWV4dEluZGV4ID0gaW5kZXg7CiAJCQkJCW5ld0V4dEluZGV4ID0gbmV3SW5kZXg7CkBAIC00MzMsMTYgKzQzOSwxOCBAQAogCiAJCWlmIChoYXNFeHQpIHsKIAkJCWludCBtYXhGaWxlbmFtZUxlbjsKLQkJCWZvcihpbmRleCA9IDA7IGluZGV4IDwgRVhUX1NJWkUgJiYgZXh0SW5kZXggKyBpbmRleCArIDEgPCB1ZGZMZW47IGluZGV4KyspIHsKKwkJCWZvciAoaW5kZXggPSAwOworCQkJICAgICBpbmRleCA8IEVYVF9TSVpFICYmIGV4dEluZGV4ICsgaW5kZXggKyAxIDwgdWRmTGVuOworCQkJICAgICBpbmRleCsrKSB7CiAJCQkJY3VyciA9IHVkZk5hbWVbZXh0SW5kZXggKyBpbmRleCArIDFdOwogCiAJCQkJaWYgKGN1cnIgPT0gJy8nIHx8IGN1cnIgPT0gMCkgewogCQkJCQluZWVkc0NSQyA9IDE7CiAJCQkJCWN1cnIgPSBJTExFR0FMX0NIQVJfTUFSSzsKLQkJCQkJd2hpbGUoZXh0SW5kZXggKyBpbmRleCArIDIgPCB1ZGZMZW4gJiYKLQkJCQkJICAgICAgKGluZGV4ICsgMSA8IEVYVF9TSVpFCi0JCQkJCSAgICAgICAmJiAodWRmTmFtZVtleHRJbmRleCArIGluZGV4ICsgMl0gPT0gJy8nIHx8Ci0JCQkJCQkgICB1ZGZOYW1lW2V4dEluZGV4ICsgaW5kZXggKyAyXSA9PSAwKSkpCisJCQkJCXdoaWxlIChleHRJbmRleCArIGluZGV4ICsgMiA8IHVkZkxlbiAmJgorCQkJCQkgICAgICAoaW5kZXggKyAxIDwgRVhUX1NJWkUgJiYKKwkJCQkJCSh1ZGZOYW1lW2V4dEluZGV4ICsgaW5kZXggKyAyXSA9PSAnLycgfHwKKwkJCQkJCSB1ZGZOYW1lW2V4dEluZGV4ICsgaW5kZXggKyAyXSA9PSAwKSkpCiAJCQkJCQlpbmRleCsrOwogCQkJCX0KIAkJCQlleHRbbG9jYWxFeHRJbmRleCsrXSA9IGN1cnI7CkBAIC00NTIsOSArNDYwLDggQEAKIAkJCQluZXdJbmRleCA9IG1heEZpbGVuYW1lTGVuOwogCQkJZWxzZQogCQkJCW5ld0luZGV4ID0gbmV3RXh0SW5kZXg7Ci0JCX0gZWxzZSBpZiAobmV3SW5kZXggPiAyNTApIHsKKwkJfSBlbHNlIGlmIChuZXdJbmRleCA+IDI1MCkKIAkJCW5ld0luZGV4ID0gMjUwOwotCQl9CiAJCW5ld05hbWVbbmV3SW5kZXgrK10gPSBDUkNfTUFSSzsKIAkJdmFsdWVDUkMgPSB1ZGZfY3JjKGZpZE5hbWUsIGZpZE5hbWVMZW4sIDApOwogCQluZXdOYW1lW25ld0luZGV4KytdID0gaGV4Q2hhclsodmFsdWVDUkMgJiAweGYwMDApID4+IDEyXTsKZGlmZiAtLWdpdCBhL2ZzL3Vmcy9iYWxsb2MuYyBiL2ZzL3Vmcy9iYWxsb2MuYwppbmRleCBmNjNhMDljLi4xZmNhMzgxIDEwMDY0NAotLS0gYS9mcy91ZnMvYmFsbG9jLmMKKysrIGIvZnMvdWZzL2JhbGxvYy5jCkBAIC05LDcgKzksNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3Vmc19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CkBAIC0xOSw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCisjaW5jbHVkZSAidWZzX2ZzLmgiCiAjaW5jbHVkZSAidWZzLmgiCiAjaW5jbHVkZSAic3dhYi5oIgogI2luY2x1ZGUgInV0aWwuaCIKZGlmZiAtLWdpdCBhL2ZzL3Vmcy9jeWxpbmRlci5jIGIvZnMvdWZzL2N5bGluZGVyLmMKaW5kZXggMmE4MTU2Ni4uYjQ2NzYzMiAxMDA2NDQKLS0tIGEvZnMvdWZzL2N5bGluZGVyLmMKKysrIGIvZnMvdWZzL2N5bGluZGVyLmMKQEAgLTksNyArOSw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvdWZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KQEAgLTE3LDYgKzE2LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAorI2luY2x1ZGUgInVmc19mcy5oIgogI2luY2x1ZGUgInVmcy5oIgogI2luY2x1ZGUgInN3YWIuaCIKICNpbmNsdWRlICJ1dGlsLmgiCmRpZmYgLS1naXQgYS9mcy91ZnMvZGlyLmMgYi9mcy91ZnMvZGlyLmMKaW5kZXggYWFmMjg3OC4uZWY1NjNmYyAxMDA2NDQKLS0tIGEvZnMvdWZzL2Rpci5jCisrKyBiL2ZzL3Vmcy9kaXIuYwpAQCAtMTgsOSArMTgsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvdWZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogCisjaW5jbHVkZSAidWZzX2ZzLmgiCiAjaW5jbHVkZSAidWZzLmgiCiAjaW5jbHVkZSAic3dhYi5oIgogI2luY2x1ZGUgInV0aWwuaCIKZGlmZiAtLWdpdCBhL2ZzL3Vmcy9maWxlLmMgYi9mcy91ZnMvZmlsZS5jCmluZGV4IGE0NmM5N2IuLjYyNWVmMTcgMTAwNjQ0Ci0tLSBhL2ZzL3Vmcy9maWxlLmMKKysrIGIvZnMvdWZzL2ZpbGUuYwpAQCAtMjQsOSArMjQsOSBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3Vmc19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CS8qIGZvciBzeW5jX21hcHBpbmdfYnVmZmVycygpICovCiAKKyNpbmNsdWRlICJ1ZnNfZnMuaCIKICNpbmNsdWRlICJ1ZnMuaCIKIAogCmRpZmYgLS1naXQgYS9mcy91ZnMvaWFsbG9jLmMgYi9mcy91ZnMvaWFsbG9jLmMKaW5kZXggN2UyNjBiYy4uYWMxODFmNiAxMDA2NDQKLS0tIGEvZnMvdWZzL2lhbGxvYy5jCisrKyBiL2ZzL3Vmcy9pYWxsb2MuYwpAQCAtMjQsNyArMjQsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3Vmc19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CkBAIC0zNCw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCisjaW5jbHVkZSAidWZzX2ZzLmgiCiAjaW5jbHVkZSAidWZzLmgiCiAjaW5jbHVkZSAic3dhYi5oIgogI2luY2x1ZGUgInV0aWwuaCIKZGlmZiAtLWdpdCBhL2ZzL3Vmcy9pbm9kZS5jIGIvZnMvdWZzL2lub2RlLmMKaW5kZXggNDMyMDc4Mi4uNTQ0NmI4OCAxMDA2NDQKLS0tIGEvZnMvdWZzL2lub2RlLmMKKysrIGIvZnMvdWZzL2lub2RlLmMKQEAgLTMwLDcgKzMwLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC91ZnNfZnMuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgpAQCAtMzgsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KIAorI2luY2x1ZGUgInVmc19mcy5oIgogI2luY2x1ZGUgInVmcy5oIgogI2luY2x1ZGUgInN3YWIuaCIKICNpbmNsdWRlICJ1dGlsLmgiCkBAIC03MTQsMjYgKzcxNCwzMCBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHVmc19yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlKQorc3RydWN0IGlub2RlICp1ZnNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBsb25nIGlubykKIHsKLQlzdHJ1Y3QgdWZzX2lub2RlX2luZm8gKnVmc2kgPSBVRlNfSShpbm9kZSk7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7Ci0Jc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXN0cnVjdCB1ZnNfaW5vZGVfaW5mbyAqdWZzaTsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCWludCBlcnI7CiAKLQlVRlNEKCJFTlRFUiwgaW5vICVsdVxuIiwgaW5vZGUtPmlfaW5vKTsKKwlVRlNEKCJFTlRFUiwgaW5vICVsdVxuIiwgaW5vKTsKIAotCXNiID0gaW5vZGUtPmlfc2I7Ci0JdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKLQotCWlmIChpbm9kZS0+aV9pbm8gPCBVRlNfUk9PVElOTyB8fAotCSAgICBpbm9kZS0+aV9pbm8gPiAodXNwaS0+c19uY2cgKiB1c3BpLT5zX2lwZykpIHsKKwlpZiAoaW5vIDwgVUZTX1JPT1RJTk8gfHwgaW5vID4gKHVzcGktPnNfbmNnICogdXNwaS0+c19pcGcpKSB7CiAJCXVmc193YXJuaW5nKHNiLCAidWZzX3JlYWRfaW5vZGUiLCAiYmFkIGlub2RlIG51bWJlciAoJWx1KVxuIiwKLQkJCSAgICBpbm9kZS0+aV9pbm8pOwotCQlnb3RvIGJhZF9pbm9kZTsKKwkJCSAgICBpbm8pOworCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIAl9CiAKKwlpbm9kZSA9IGlnZXRfbG9ja2VkKHNiLCBpbm8pOworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWlmICghKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpKQorCQlyZXR1cm4gaW5vZGU7CisKKwl1ZnNpID0gVUZTX0koaW5vZGUpOworCiAJYmggPSBzYl9icmVhZChzYiwgdXNwaS0+c19zYmJhc2UgKyB1ZnNfaW5vdG9mc2JhKGlub2RlLT5pX2lubykpOwogCWlmICghYmgpIHsKIAkJdWZzX3dhcm5pbmcoc2IsICJ1ZnNfcmVhZF9pbm9kZSIsICJ1bmFibGUgdG8gcmVhZCBpbm9kZSAlbHVcbiIsCkBAIC03NjUsMTAgKzc2OSwxMiBAQAogCWJyZWxzZShiaCk7CiAKIAlVRlNEKCJFWElUXG4iKTsKLQlyZXR1cm47CisJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CisJcmV0dXJuIGlub2RlOwogCiBiYWRfaW5vZGU6Ci0JbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCWlnZXRfZmFpbGVkKGlub2RlKTsKKwlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIH0KIAogc3RhdGljIHZvaWQgdWZzMV91cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHVmc19pbm9kZSAqdWZzX2lub2RlKQpkaWZmIC0tZ2l0IGEvZnMvdWZzL25hbWVpLmMgYi9mcy91ZnMvbmFtZWkuYwppbmRleCBkOGJmYmVlLi5lM2E5YjFmIDEwMDY0NAotLS0gYS9mcy91ZnMvbmFtZWkuYworKysgYi9mcy91ZnMvbmFtZWkuYwpAQCAtMjksOCArMjksOSBAQAogCiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvdWZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworI2luY2x1ZGUgInVmc19mcy5oIgogI2luY2x1ZGUgInVmcy5oIgogI2luY2x1ZGUgInV0aWwuaCIKIApAQCAtNTcsMTAgKzU4LDEwIEBACiAJbG9ja19rZXJuZWwoKTsKIAlpbm8gPSB1ZnNfaW5vZGVfYnlfbmFtZShkaXIsIGRlbnRyeSk7CiAJaWYgKGlubykgewotCQlpbm9kZSA9IGlnZXQoZGlyLT5pX3NiLCBpbm8pOwotCQlpZiAoIWlub2RlKSB7CisJCWlub2RlID0gdWZzX2lnZXQoZGlyLT5pX3NiLCBpbm8pOworCQlpZiAoSVNfRVJSKGlub2RlKSkgewogCQkJdW5sb2NrX2tlcm5lbCgpOwotCQkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisJCQlyZXR1cm4gRVJSX0NBU1QoaW5vZGUpOwogCQl9CiAJfQogCXVubG9ja19rZXJuZWwoKTsKZGlmZiAtLWdpdCBhL2ZzL3Vmcy9zdXBlci5jIGIvZnMvdWZzL3N1cGVyLmMKaW5kZXggMDA3MmNiMy4uODViMjJiNSAxMDA2NDQKLS0tIGEvZnMvdWZzL3N1cGVyLmMKKysrIGIvZnMvdWZzL3N1cGVyLmMKQEAgLTc2LDcgKzc2LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC91ZnNfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KQEAgLTkxLDYgKzkwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKKyNpbmNsdWRlICJ1ZnNfZnMuaCIKICNpbmNsdWRlICJ1ZnMuaCIKICNpbmNsdWRlICJzd2FiLmgiCiAjaW5jbHVkZSAidXRpbC5oIgpAQCAtMTMxLDYgKzEzMSw4IEBACiAJCXByaW50ayhLRVJOX0lORk8iICBjc19uZmZyZWUoTnVtIG9mIGZyZWUgZnJhZ3MpOiAlbGx1XG4iLAogCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykKIAkJICAgICAgIGZzNjRfdG9fY3B1KHNiLCB1c2IzLT5mc191bjEuZnNfdTIuY3NfbmZmcmVlKSk7CisJCXByaW50ayhLRVJOX0lORk8iICBmc19tYXhzeW1saW5rbGVuOiAldVxuIiwKKwkJICAgICAgIGZzMzJfdG9fY3B1KHNiLCB1c2IzLT5mc191bjIuZnNfNDQuZnNfbWF4c3ltbGlua2xlbikpOwogCX0gZWxzZSB7CiAJCXByaW50aygiIHNibGtubzogICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX3NibGtubykpOwogCQlwcmludGsoIiBjYmxrbm86ICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jYmxrbm8pKTsKQEAgLTYzMyw2ICs2MzUsNyBAQAogCXVuc2lnbmVkIGJsb2NrX3NpemUsIHN1cGVyX2Jsb2NrX3NpemU7CiAJdW5zaWduZWQgZmxhZ3M7CiAJdW5zaWduZWQgc3VwZXJfYmxvY2tfb2Zmc2V0OworCWludCByZXQgPSAtRUlOVkFMOwogCiAJdXNwaSA9IE5VTEw7CiAJdWJoID0gTlVMTDsKQEAgLTEwNjAsMTcgKzEwNjMsMjEgQEAKIAl1c3BpLT5zX2JwZiA9IHVzcGktPnNfZnNpemUgPDwgMzsKIAl1c3BpLT5zX2JwZnNoaWZ0ID0gdXNwaS0+c19mc2hpZnQgKyAzOwogCXVzcGktPnNfYnBmbWFzayA9IHVzcGktPnNfYnBmIC0gMTsKLQlpZiAoKHNiaS0+c19tb3VudF9vcHQgJiBVRlNfTU9VTlRfVUZTVFlQRSkgPT0KLQkgICAgVUZTX01PVU5UX1VGU1RZUEVfNDRCU0QpCisJaWYgKChzYmktPnNfbW91bnRfb3B0ICYgVUZTX01PVU5UX1VGU1RZUEUpID09IFVGU19NT1VOVF9VRlNUWVBFXzQ0QlNEIHx8CisJICAgIChzYmktPnNfbW91bnRfb3B0ICYgVUZTX01PVU5UX1VGU1RZUEUpID09IFVGU19NT1VOVF9VRlNUWVBFX1VGUzIpCiAJCXVzcGktPnNfbWF4c3ltbGlua2xlbiA9CiAJCSAgICBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfdW4yLmZzXzQ0LmZzX21heHN5bWxpbmtsZW4pOwogCi0JaW5vZGUgPSBpZ2V0KHNiLCBVRlNfUk9PVElOTyk7Ci0JaWYgKCFpbm9kZSB8fCBpc19iYWRfaW5vZGUoaW5vZGUpKQorCWlub2RlID0gdWZzX2lnZXQoc2IsIFVGU19ST09USU5PKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkgeworCQlyZXQgPSBQVFJfRVJSKGlub2RlKTsKIAkJZ290byBmYWlsZWQ7CisJfQogCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3QoaW5vZGUpOwotCWlmICghc2ItPnNfcm9vdCkKKwlpZiAoIXNiLT5zX3Jvb3QpIHsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBkYWxsb2NfZmFpbGVkOworCX0KIAogCXVmc19zZXR1cF9jc3RvdGFsKHNiKTsKIAkvKgpAQCAtMTA5Miw3ICsxMDk5LDcgQEAKIAlrZnJlZShzYmkpOwogCXNiLT5zX2ZzX2luZm8gPSBOVUxMOwogCVVGU0QoIkVYSVQgKEZBSUxFRClcbiIpOwotCXJldHVybiAtRUlOVkFMOworCXJldHVybiByZXQ7CiAKIGZhaWxlZF9ub21lbToKIAlVRlNEKCJFWElUIChOT01FTSlcbiIpOwpAQCAtMTMyNiw3ICsxMzMzLDYgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyB1ZnNfc3VwZXJfb3BzID0gewogCS5hbGxvY19pbm9kZQk9IHVmc19hbGxvY19pbm9kZSwKIAkuZGVzdHJveV9pbm9kZQk9IHVmc19kZXN0cm95X2lub2RlLAotCS5yZWFkX2lub2RlCT0gdWZzX3JlYWRfaW5vZGUsCiAJLndyaXRlX2lub2RlCT0gdWZzX3dyaXRlX2lub2RlLAogCS5kZWxldGVfaW5vZGUJPSB1ZnNfZGVsZXRlX2lub2RlLAogCS5wdXRfc3VwZXIJPSB1ZnNfcHV0X3N1cGVyLApkaWZmIC0tZ2l0IGEvZnMvdWZzL3N5bWxpbmsuYyBiL2ZzL3Vmcy9zeW1saW5rLmMKaW5kZXggNDNhYzEwZS4uYzAxNTZlZCAxMDA2NDQKLS0tIGEvZnMvdWZzL3N5bWxpbmsuYworKysgYi9mcy91ZnMvc3ltbGluay5jCkBAIC0yNyw3ICsyNyw4IEBACiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+Ci0jaW5jbHVkZSA8bGludXgvdWZzX2ZzLmg+CisKKyNpbmNsdWRlICJ1ZnNfZnMuaCIKICNpbmNsdWRlICJ1ZnMuaCIKIAogCmRpZmYgLS1naXQgYS9mcy91ZnMvdHJ1bmNhdGUuYyBiL2ZzL3Vmcy90cnVuY2F0ZS5jCmluZGV4IDMxMWRlZDMuLjQxZGQ0MzEgMTAwNjQ0Ci0tLSBhL2ZzL3Vmcy90cnVuY2F0ZS5jCisrKyBiL2ZzL3Vmcy90cnVuY2F0ZS5jCkBAIC0zNiw3ICszNiw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvdWZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgpAQCAtNDYsNiArNDUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAKKyNpbmNsdWRlICJ1ZnNfZnMuaCIKICNpbmNsdWRlICJ1ZnMuaCIKICNpbmNsdWRlICJzd2FiLmgiCiAjaW5jbHVkZSAidXRpbC5oIgpkaWZmIC0tZ2l0IGEvZnMvdWZzL3Vmcy5oIGIvZnMvdWZzL3Vmcy5oCmluZGV4IDdmYWE0Y2QuLmZjYjkyMzEgMTAwNjQ0Ci0tLSBhL2ZzL3Vmcy91ZnMuaAorKysgYi9mcy91ZnMvdWZzLmgKQEAgLTEwNiw3ICsxMDYsNyBAQAogZXh0ZXJuIHN0cnVjdCBpbm9kZSAqIHVmc19uZXdfaW5vZGUgKHN0cnVjdCBpbm9kZSAqLCBpbnQpOwogCiAvKiBpbm9kZS5jICovCi1leHRlcm4gdm9pZCB1ZnNfcmVhZF9pbm9kZSAoc3RydWN0IGlub2RlICopOworZXh0ZXJuIHN0cnVjdCBpbm9kZSAqdWZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIHZvaWQgdWZzX3B1dF9pbm9kZSAoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIGludCB1ZnNfd3JpdGVfaW5vZGUgKHN0cnVjdCBpbm9kZSAqLCBpbnQpOwogZXh0ZXJuIGludCB1ZnNfc3luY19pbm9kZSAoc3RydWN0IGlub2RlICopOwpkaWZmIC0tZ2l0IGEvZnMvdWZzL3Vmc19mcy5oIGIvZnMvdWZzL3Vmc19mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YmRlMTgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy91ZnMvdWZzX2ZzLmgKQEAgLTAsMCArMSw5NDcgQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9saW51eC91ZnNfZnMuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NgorICogQWRyaWFuIFJvZHJpZ3VleiAoYWRyaWFuQGZyYW5rbGlucy10b3dlci5ydXRnZXJzLmVkdSkKKyAqIExhYm9yYXRvcnkgZm9yIENvbXB1dGVyIFNjaWVuY2UgUmVzZWFyY2ggQ29tcHV0aW5nIEZhY2lsaXR5CisgKiBSdXRnZXJzLCBUaGUgU3RhdGUgVW5pdmVyc2l0eSBvZiBOZXcgSmVyc2V5CisgKgorICogQ2xlYW4gc3dhYiBzdXBwb3J0IGJ5IEZhcmUgPGZhcmVAdHVuZXMub3JnPgorICoganVzdCBob3BlIG5vIG9uZSBpcyB1c2luZyBOTlVVWFhJIG9uIF9fPzY0IHN0cnVjdHVyZSBlbGVtZW50cworICogNjQtYml0IGNsZWFuIHRoYW5rcyB0byBNYWNpZWogVy4gUm96eWNraSA8bWFjcm9AZHMyLnBnLmdkYS5wbD4KKyAqCisgKiA0LjRCU0QgKEZyZWVCU0QpIHN1cHBvcnQgYWRkZWQgb24gRmVicnVhcnkgMXN0IDE5OTggYnkKKyAqIE5pZWxzIEtyaXN0aWFuIEJlY2ggSmVuc2VuIDxua2JqQGltYWdlLmRrPiBwYXJ0aWFsbHkgYmFzZWQKKyAqIG9uIGNvZGUgYnkgTWFydGluIHZvbiBMb2V3aXMgPG1hcnRpbkBtaXJhLmlzZG4uY3MudHUtYmVybGluLmRlPi4KKyAqCisgKiBOZVhUc3RlcCBzdXBwb3J0IGFkZGVkIG9uIEZlYnJ1YXJ5IDV0aCAxOTk4IGJ5CisgKiBOaWVscyBLcmlzdGlhbiBCZWNoIEplbnNlbiA8bmtiakBpbWFnZS5kaz4uCisgKgorICogV3JpdGUgc3VwcG9ydCBieSBEYW5pZWwgUGlya2wgPGRhbmllbC5waXJrbEBlbWFpbC5jej4KKyAqCisgKiBIUC9VWCBoZnMgZmlsZXN5c3RlbSBzdXBwb3J0IGFkZGVkIGJ5CisgKiBNYXJ0aW4gSy4gUGV0ZXJzZW4gPG1rcEBta3AubmV0PiwgQXVndXN0IDE5OTkKKyAqCisgKiBVRlMyIChvZiBGcmVlQlNEIDUueCkgc3VwcG9ydCBhZGRlZCBieQorICogTmlyYWogS3VtYXIgPG5pcmFqMTdAaWl0Ym9tYmF5Lm9yZz4gICwgSmFuIDIwMDQKKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1VGU19GU19ICisjZGVmaW5lIF9fTElOVVhfVUZTX0ZTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KK3R5cGVkZWYgX191NjQgX19iaXR3aXNlIF9fZnM2NDsKK3R5cGVkZWYgX191MzIgX19iaXR3aXNlIF9fZnMzMjsKK3R5cGVkZWYgX191MTYgX19iaXR3aXNlIF9fZnMxNjsKKworI2RlZmluZSBVRlNfQkJMT0NLIDAKKyNkZWZpbmUgVUZTX0JCU0laRSA4MTkyCisjZGVmaW5lIFVGU19TQkxPQ0sgODE5MgorI2RlZmluZSBVRlNfU0JTSVpFIDgxOTIKKworI2RlZmluZSBVRlNfU0VDVE9SX1NJWkUgNTEyCisjZGVmaW5lIFVGU19TRUNUT1JfQklUUyA5CisjZGVmaW5lIFVGU19NQUdJQyAgMHgwMDAxMTk1NAorI2RlZmluZSBVRlMyX01BR0lDIDB4MTk1NDAxMTkKKyNkZWZpbmUgVUZTX0NJR0FNICAweDU0MTkwMTAwIC8qIGJ5dGVzd2FwcGVkIE1BR0lDICovCisKKy8qIENvcGllZCBmcm9tIEZyZWVCU0QgKi8KKy8qCisgKiBFYWNoIGRpc2sgZHJpdmUgY29udGFpbnMgc29tZSBudW1iZXIgb2YgZmlsZXN5c3RlbXMuCisgKiBBIGZpbGVzeXN0ZW0gY29uc2lzdHMgb2YgYSBudW1iZXIgb2YgY3lsaW5kZXIgZ3JvdXBzLgorICogRWFjaCBjeWxpbmRlciBncm91cCBoYXMgaW5vZGVzIGFuZCBkYXRhLgorICoKKyAqIEEgZmlsZXN5c3RlbSBpcyBkZXNjcmliZWQgYnkgaXRzIHN1cGVyLWJsb2NrLCB3aGljaCBpbiB0dXJuCisgKiBkZXNjcmliZXMgdGhlIGN5bGluZGVyIGdyb3Vwcy4gIFRoZSBzdXBlci1ibG9jayBpcyBjcml0aWNhbAorICogZGF0YSBhbmQgaXMgcmVwbGljYXRlZCBpbiBlYWNoIGN5bGluZGVyIGdyb3VwIHRvIHByb3RlY3QgYWdhaW5zdAorICogY2F0YXN0cm9waGljIGxvc3MuICBUaGlzIGlzIGRvbmUgYXQgYG5ld2ZzJyB0aW1lIGFuZCB0aGUgY3JpdGljYWwKKyAqIHN1cGVyLWJsb2NrIGRhdGEgZG9lcyBub3QgY2hhbmdlLCBzbyB0aGUgY29waWVzIG5lZWQgbm90IGJlCisgKiByZWZlcmVuY2VkIGZ1cnRoZXIgdW5sZXNzIGRpc2FzdGVyIHN0cmlrZXMuCisgKgorICogRm9yIGZpbGVzeXN0ZW0gZnMsIHRoZSBvZmZzZXRzIG9mIHRoZSB2YXJpb3VzIGJsb2NrcyBvZiBpbnRlcmVzdAorICogYXJlIGdpdmVuIGluIHRoZSBzdXBlciBibG9jayBhczoKKyAqICAgICAgW2ZzLT5mc19zYmxrbm9dICAgICAgICAgU3VwZXItYmxvY2sKKyAqICAgICAgW2ZzLT5mc19jYmxrbm9dICAgICAgICAgQ3lsaW5kZXIgZ3JvdXAgYmxvY2sKKyAqICAgICAgW2ZzLT5mc19pYmxrbm9dICAgICAgICAgSW5vZGUgYmxvY2tzCisgKiAgICAgIFtmcy0+ZnNfZGJsa25vXSAgICAgICAgIERhdGEgYmxvY2tzCisgKiBUaGUgYmVnaW5uaW5nIG9mIGN5bGluZGVyIGdyb3VwIGNnIGluIGZzLCBpcyBnaXZlbiBieQorICogdGhlIGBgY2diYXNlKGZzLCBjZyknJyBtYWNyby4KKyAqCisgKiBEZXBlbmRpbmcgb24gdGhlIGFyY2hpdGVjdHVyZSBhbmQgdGhlIG1lZGlhLCB0aGUgc3VwZXJibG9jayBtYXkKKyAqIHJlc2lkZSBpbiBhbnkgb25lIG9mIGZvdXIgcGxhY2VzLiBGb3IgdGlueSBtZWRpYSB3aGVyZSBldmVyeSBibG9jaworICogY291bnRzLCBpdCBpcyBwbGFjZWQgYXQgdGhlIHZlcnkgZnJvbnQgb2YgdGhlIHBhcnRpdGlvbi4gSGlzdG9yaWNhbGx5LAorICogVUZTMSBwbGFjZWQgaXQgOEsgZnJvbSB0aGUgZnJvbnQgdG8gbGVhdmUgcm9vbSBmb3IgdGhlIGRpc2sgbGFiZWwgYW5kCisgKiBhIHNtYWxsIGJvb3RzdHJhcC4gRm9yIFVGUzIgaXQgZ290IG1vdmVkIHRvIDY0SyBmcm9tIHRoZSBmcm9udCB0byBsZWF2ZQorICogcm9vbSBmb3IgdGhlIGRpc2sgbGFiZWwgYW5kIGEgYmlnZ2VyIGJvb3RzdHJhcCwgYW5kIGZvciByZWFsbHkgcGlnZ3kKKyAqIHN5c3RlbXMgd2UgY2hlY2sgYXQgMjU2SyBmcm9tIHRoZSBmcm9udCBpZiB0aGUgZmlyc3QgdGhyZWUgZmFpbC4gSW4KKyAqIGFsbCBjYXNlcyB0aGUgc2l6ZSBvZiB0aGUgc3VwZXJibG9jayB3aWxsIGJlIFNCTE9DS1NJWkUuIEFsbCB2YWx1ZXMgYXJlCisgKiBnaXZlbiBpbiBieXRlLW9mZnNldCBmb3JtLCBzbyB0aGV5IGRvIG5vdCBpbXBseSBhIHNlY3RvciBzaXplLiBUaGUKKyAqIFNCTE9DS1NFQVJDSCBzcGVjaWZpZXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBsb2NhdGlvbnMgc2hvdWxkIGJlIHNlYXJjaGVkLgorICovCisjZGVmaW5lIFNCTE9DS19GTE9QUFkgICAgICAgIDAKKyNkZWZpbmUgU0JMT0NLX1VGUzEgICAgICAgODE5MgorI2RlZmluZSBTQkxPQ0tfVUZTMiAgICAgIDY1NTM2CisjZGVmaW5lIFNCTE9DS19QSUdHWSAgICAyNjIxNDQKKyNkZWZpbmUgU0JMT0NLU0laRSAgICAgICAgODE5MgorI2RlZmluZSBTQkxPQ0tTRUFSQ0ggXAorICAgICAgICB7IFNCTE9DS19VRlMyLCBTQkxPQ0tfVUZTMSwgU0JMT0NLX0ZMT1BQWSwgU0JMT0NLX1BJR0dZLCAtMSB9CisKKworLyogSFAgc3BlY2lmaWMgTUFHSUMgdmFsdWVzICovCisKKyNkZWZpbmUgVUZTX01BR0lDX0xGTiAgIDB4MDAwOTUwMTQgLyogZnMgc3VwcG9ydHMgZmlsZW5hbWVzID4gMTQgY2hhcnMgKi8KKyNkZWZpbmUgVUZTX0NJR0FNX0xGTiAgIDB4MTQ1MDA5MDAgLyogc3JhaGMgNDEgPCBzZW1hbmVsaWYgc3Ryb3BwdXMgc2YgKi8KKworI2RlZmluZSBVRlNfTUFHSUNfU0VDICAgMHgwMDYxMjE5NSAvKiBCMSBzZWN1cml0eSBmcyAqLworI2RlZmluZSBVRlNfQ0lHQU1fU0VDICAgMHg5NTIxNjEwMAorCisjZGVmaW5lIFVGU19NQUdJQ19GRUEgICAweDAwMTk1NjEyIC8qIGZzX2ZlYXR1cmViaXRzIHN1cHBvcnRlZCAqLworI2RlZmluZSBVRlNfQ0lHQU1fRkVBICAgMHgxMjU2MTkwMAorCisjZGVmaW5lIFVGU19NQUdJQ180R0IgICAweDA1MjMxOTk0IC8qIGZzID4gNCBHQiAmJiBmc19mZWF0dXJlYml0cyAqLworI2RlZmluZSBVRlNfQ0lHQU1fNEdCICAgMHg5NDE5MjMwNQorCisvKiBTZWVtcyBzb21lYm9keSBhdCBIUCBnb29mZWQgaGVyZS4gQjEgYW5kIGxmcyBhcmUgYm90aCAweDIgIT8hICovCisjZGVmaW5lIFVGU19GU0ZfTEZOICAgICAweDAwMDAwMDAxIC8qIGxvbmcgZmlsZSBuYW1lcyAqLworI2RlZmluZSBVRlNfRlNGX0IxICAgICAgMHgwMDAwMDAwMiAvKiBCMSBzZWN1cml0eSAqLworI2RlZmluZSBVRlNfRlNGX0xGUyAgICAgMHgwMDAwMDAwMiAvKiBsYXJnZSBmaWxlcyAqLworI2RlZmluZSBVRlNfRlNGX0xVSUQgICAgMHgwMDAwMDAwNCAvKiBsYXJnZSBVSURzICovCisKKy8qIEVuZCBvZiBIUCBzdHVmZiAqLworCisKKyNkZWZpbmUgVUZTX0JTSVpFCTgxOTIKKyNkZWZpbmUgVUZTX01JTkJTSVpFCTQwOTYKKyNkZWZpbmUgVUZTX0ZTSVpFCTEwMjQKKyNkZWZpbmUgVUZTX01BWEZSQUcJKFVGU19CU0laRSAvIFVGU19GU0laRSkKKworI2RlZmluZSBVRlNfTkRBRERSIDEyCisjZGVmaW5lIFVGU19OSU5ESVIgMworCisjZGVmaW5lIFVGU19JTkRfQkxPQ0sJKFVGU19OREFERFIgKyAwKQorI2RlZmluZSBVRlNfRElORF9CTE9DSwkoVUZTX05EQUREUiArIDEpCisjZGVmaW5lIFVGU19USU5EX0JMT0NLCShVRlNfTkRBRERSICsgMikKKworI2RlZmluZSBVRlNfTkRJUl9GUkFHTUVOVCAoVUZTX05EQUREUiA8PCB1c3BpLT5zX2ZwYnNoaWZ0KQorI2RlZmluZSBVRlNfSU5EX0ZSQUdNRU5UIChVRlNfSU5EX0JMT0NLIDw8IHVzcGktPnNfZnBic2hpZnQpCisjZGVmaW5lIFVGU19ESU5EX0ZSQUdNRU5UIChVRlNfRElORF9CTE9DSyA8PCB1c3BpLT5zX2ZwYnNoaWZ0KQorI2RlZmluZSBVRlNfVElORF9GUkFHTUVOVCAoVUZTX1RJTkRfQkxPQ0sgPDwgdXNwaS0+c19mcGJzaGlmdCkKKworI2RlZmluZSBVRlNfUk9PVElOTyAyCisjZGVmaW5lIFVGU19GSVJTVF9JTk8gKFVGU19ST09USU5PICsgMSkKKworI2RlZmluZSBVRlNfVVNFRUZUICAoKF9fdTE2KTY1NTM1KQorCisjZGVmaW5lIFVGU19GU09LICAgICAgMHg3YzI2OWQzOAorI2RlZmluZSBVRlNfRlNBQ1RJVkUgICgoX19zOCkweDAwKQorI2RlZmluZSBVRlNfRlNDTEVBTiAgICgoX19zOCkweDAxKQorI2RlZmluZSBVRlNfRlNTVEFCTEUgICgoX19zOCkweDAyKQorI2RlZmluZSBVRlNfRlNPU0YxICAgICgoX19zOCkweDAzKQkvKiBpcyB0aGlzIGNvcnJlY3QgZm9yIERFQyBPU0YvMT8gKi8KKyNkZWZpbmUgVUZTX0ZTQkFEICAgICAoKF9fczgpMHhmZikKKworLyogRnJvbSBoZXJlIHRvIG5leHQgYmxhbmsgbGluZSwgc19mbGFncyBmb3IgdWZzX3NiX2luZm8gKi8KKy8qIGRpcmVjdG9yeSBlbnRyeSBlbmNvZGluZyAqLworI2RlZmluZSBVRlNfREVfTUFTSwkJMHgwMDAwMDAxMAkvKiBtYXNrIGZvciB0aGUgZm9sbG93aW5nICovCisjZGVmaW5lIFVGU19ERV9PTEQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVUZTX0RFXzQ0QlNECQkweDAwMDAwMDEwCisvKiB1aWQgZW5jb2RpbmcgKi8KKyNkZWZpbmUgVUZTX1VJRF9NQVNLCQkweDAwMDAwMDYwCS8qIG1hc2sgZm9yIHRoZSBmb2xsb3dpbmcgKi8KKyNkZWZpbmUgVUZTX1VJRF9PTEQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVUZTX1VJRF80NEJTRAkJMHgwMDAwMDAyMAorI2RlZmluZSBVRlNfVUlEX0VGVAkJMHgwMDAwMDA0MAorLyogc3VwZXJibG9jayBzdGF0ZSBlbmNvZGluZyAqLworI2RlZmluZSBVRlNfU1RfTUFTSwkJMHgwMDAwMDcwMAkvKiBtYXNrIGZvciB0aGUgZm9sbG93aW5nICovCisjZGVmaW5lIFVGU19TVF9PTEQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVUZTX1NUXzQ0QlNECQkweDAwMDAwMTAwCisjZGVmaW5lIFVGU19TVF9TVU4JCTB4MDAwMDAyMDAgLyogU29sYXJpcyAqLworI2RlZmluZSBVRlNfU1RfU1VOT1MJCTB4MDAwMDAzMDAKKyNkZWZpbmUgVUZTX1NUX1NVTng4NgkJMHgwMDAwMDQwMCAvKiBTb2xhcmlzIHg4NiAqLworLypjeWxpbmRlciBncm91cCBlbmNvZGluZyAqLworI2RlZmluZSBVRlNfQ0dfTUFTSwkJMHgwMDAwMzAwMAkvKiBtYXNrIGZvciB0aGUgZm9sbG93aW5nICovCisjZGVmaW5lIFVGU19DR19PTEQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgVUZTX0NHXzQ0QlNECQkweDAwMDAyMDAwCisjZGVmaW5lIFVGU19DR19TVU4JCTB4MDAwMDEwMDAKKy8qIGZpbGVzeXN0ZW0gdHlwZSBlbmNvZGluZyAqLworI2RlZmluZSBVRlNfVFlQRV9NQVNLCQkweDAwMDEwMDAwCS8qIG1hc2sgZm9yIHRoZSBmb2xsb3dpbmcgKi8KKyNkZWZpbmUgVUZTX1RZUEVfVUZTMQkJMHgwMDAwMDAwMAorI2RlZmluZSBVRlNfVFlQRV9VRlMyCQkweDAwMDEwMDAwCisKKworLyogZnNfaW5vZGVmbXQgb3B0aW9ucyAqLworI2RlZmluZSBVRlNfNDJJTk9ERUZNVAktMQorI2RlZmluZSBVRlNfNDRJTk9ERUZNVAkyCisKKy8qCisgKiBNSU5GUkVFIGdpdmVzIHRoZSBtaW5pbXVtIGFjY2VwdGFibGUgcGVyY2VudGFnZSBvZiBmaWxlIHN5c3RlbQorICogYmxvY2tzIHdoaWNoIG1heSBiZSBmcmVlLiBJZiB0aGUgZnJlZWxpc3QgZHJvcHMgYmVsb3cgdGhpcyBsZXZlbAorICogb25seSB0aGUgc3VwZXJ1c2VyIG1heSBjb250aW51ZSB0byBhbGxvY2F0ZSBibG9ja3MuIFRoaXMgbWF5CisgKiBiZSBzZXQgdG8gMCBpZiBubyByZXNlcnZlIG9mIGZyZWUgYmxvY2tzIGlzIGRlZW1lZCBuZWNlc3NhcnksCisgKiBob3dldmVyIHRocm91Z2hwdXQgZHJvcHMgYnkgZmlmdHkgcGVyY2VudCBpZiB0aGUgZmlsZSBzeXN0ZW0KKyAqIGlzIHJ1biBhdCBiZXR3ZWVuIDk1JSBhbmQgMTAwJSBmdWxsOyB0aHVzIHRoZSBtaW5pbXVtIGRlZmF1bHQKKyAqIHZhbHVlIG9mIGZzX21pbmZyZWUgaXMgNSUuIEhvd2V2ZXIsIHRvIGdldCBnb29kIGNsdXN0ZXJpbmcKKyAqIHBlcmZvcm1hbmNlLCAxMCUgaXMgYSBiZXR0ZXIgY2hvaWNlLiBoZW5jZSB3ZSB1c2UgMTAlIGFzIG91cgorICogZGVmYXVsdCB2YWx1ZS4gV2l0aCAxMCUgZnJlZSBzcGFjZSwgZnJhZ21lbnRhdGlvbiBpcyBub3QgYQorICogcHJvYmxlbSwgc28gd2UgY2hvb3NlIHRvIG9wdGltaXplIGZvciB0aW1lLgorICovCisjZGVmaW5lIFVGU19NSU5GUkVFICAgICAgICAgNQorI2RlZmluZSBVRlNfREVGQVVMVE9QVCAgICAgIFVGU19PUFRUSU1FCisKKy8qCisgKiBUdXJuIGZpbGUgc3lzdGVtIGJsb2NrIG51bWJlcnMgaW50byBkaXNrIGJsb2NrIGFkZHJlc3Nlcy4KKyAqIFRoaXMgbWFwcyBmaWxlIHN5c3RlbSBibG9ja3MgdG8gZGV2aWNlIHNpemUgYmxvY2tzLgorICovCisjZGVmaW5lIHVmc19mc2J0b2RiKHVzcGksIGIpCSgoYikgPDwgKHVzcGkpLT5zX2ZzYnRvZGIpCisjZGVmaW5lCXVmc19kYnRvZnNiKHVzcGksIGIpCSgoYikgPj4gKHVzcGkpLT5zX2ZzYnRvZGIpCisKKy8qCisgKiBDeWxpbmRlciBncm91cCBtYWNyb3MgdG8gbG9jYXRlIHRoaW5ncyBpbiBjeWxpbmRlciBncm91cHMuCisgKiBUaGV5IGNhbGMgZmlsZSBzeXN0ZW0gYWRkcmVzc2VzIG9mIGN5bGluZGVyIGdyb3VwIGRhdGEgc3RydWN0dXJlcy4KKyAqLworI2RlZmluZQl1ZnNfY2diYXNlKGMpCSh1c3BpLT5zX2ZwZyAqIChjKSkKKyNkZWZpbmUgdWZzX2Nnc3RhcnQoYykJKCh1c3BpKS0+ZnNfbWFnaWMgPT0gVUZTMl9NQUdJQyA/ICB1ZnNfY2diYXNlKGMpIDogXAorCSh1ZnNfY2diYXNlKGMpICArIHVzcGktPnNfY2dvZmZzZXQgKiAoKGMpICYgfnVzcGktPnNfY2dtYXNrKSkpCisjZGVmaW5lCXVmc19jZ3NibG9jayhjKQkodWZzX2Nnc3RhcnQoYykgKyB1c3BpLT5zX3NibGtubykJLyogc3VwZXIgYmxrICovCisjZGVmaW5lCXVmc19jZ2NtaW4oYykJKHVmc19jZ3N0YXJ0KGMpICsgdXNwaS0+c19jYmxrbm8pCS8qIGNnIGJsb2NrICovCisjZGVmaW5lCXVmc19jZ2ltaW4oYykJKHVmc19jZ3N0YXJ0KGMpICsgdXNwaS0+c19pYmxrbm8pCS8qIGlub2RlIGJsayAqLworI2RlZmluZQl1ZnNfY2dkbWluKGMpCSh1ZnNfY2dzdGFydChjKSArIHVzcGktPnNfZGJsa25vKQkvKiAxc3QgZGF0YSAqLworCisvKgorICogTWFjcm9zIGZvciBoYW5kbGluZyBpbm9kZSBudW1iZXJzOgorICogICAgIGlub2RlIG51bWJlciB0byBmaWxlIHN5c3RlbSBibG9jayBvZmZzZXQuCisgKiAgICAgaW5vZGUgbnVtYmVyIHRvIGN5bGluZGVyIGdyb3VwIG51bWJlci4KKyAqICAgICBpbm9kZSBudW1iZXIgdG8gZmlsZSBzeXN0ZW0gYmxvY2sgYWRkcmVzcy4KKyAqLworI2RlZmluZQl1ZnNfaW5vdG9jZyh4KQkJKCh4KSAvIHVzcGktPnNfaXBnKQorI2RlZmluZQl1ZnNfaW5vdG9jZ29mZih4KQkoKHgpICUgdXNwaS0+c19pcGcpCisjZGVmaW5lCXVmc19pbm90b2ZzYmEoeCkJKCgodTY0KXVmc19jZ2ltaW4odWZzX2lub3RvY2coeCkpKSArIHVmc19pbm90b2Nnb2ZmKHgpIC8gdXNwaS0+c19pbm9wZikKKyNkZWZpbmUJdWZzX2lub3RvZnNibyh4KQkoKHgpICUgdXNwaS0+c19pbm9wZikKKworLyoKKyAqIENvbXB1dGUgdGhlIGN5bGluZGVyIGFuZCByb3RhdGlvbmFsIHBvc2l0aW9uIG9mIGEgY3lsIGJsb2NrIGFkZHIuCisgKi8KKyNkZWZpbmUgdWZzX2NidG9jeWxubyhibm8pIFwKKwkoKGJubykgKiB1c3BpLT5zX25zcGYgLyB1c3BpLT5zX3NwYykKKyNkZWZpbmUgdWZzX2NidG9ycG9zKGJubykgXAorCSgoKChibm8pICogdXNwaS0+c19uc3BmICUgdXNwaS0+c19zcGMgLyB1c3BpLT5zX25zZWN0IFwKKwkqIHVzcGktPnNfdHJhY2tza2V3ICsgKGJubykgKiB1c3BpLT5zX25zcGYgJSB1c3BpLT5zX3NwYyBcCisJJSB1c3BpLT5zX25zZWN0ICogdXNwaS0+c19pbnRlcmxlYXZlKSAlIHVzcGktPnNfbnNlY3QgXAorCSogdXNwaS0+c19ucnBvcykgLyB1c3BpLT5zX25wc2VjdCkKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgbWFjcm9zIG9wdGltaXplIGNlcnRhaW4gZnJlcXVlbnRseSBjYWxjdWxhdGVkCisgKiBxdWFudGl0aWVzIGJ5IHVzaW5nIHNoaWZ0cyBhbmQgbWFza3MgaW4gcGxhY2Ugb2YgZGl2aXNpb25zCisgKiBtb2R1bG9zIGFuZCBtdWx0aXBsaWNhdGlvbnMuCisgKi8KKyNkZWZpbmUgdWZzX2Jsa29mZihsb2MpCQkoKGxvYykgJiB1c3BpLT5zX3FibWFzaykKKyNkZWZpbmUgdWZzX2ZyYWdvZmYobG9jKQkoKGxvYykgJiB1c3BpLT5zX3FmbWFzaykKKyNkZWZpbmUgdWZzX2xibGt0b3NpemUoYmxrKQkoKGJsaykgPDwgdXNwaS0+c19ic2hpZnQpCisjZGVmaW5lIHVmc19sYmxrbm8obG9jKQkJKChsb2MpID4+IHVzcGktPnNfYnNoaWZ0KQorI2RlZmluZSB1ZnNfbnVtZnJhZ3MobG9jKQkoKGxvYykgPj4gdXNwaS0+c19mc2hpZnQpCisjZGVmaW5lIHVmc19ibGtyb3VuZHVwKHNpemUpCSgoKHNpemUpICsgdXNwaS0+c19xYm1hc2spICYgdXNwaS0+c19ibWFzaykKKyNkZWZpbmUgdWZzX2ZyYWdyb3VuZHVwKHNpemUpCSgoKHNpemUpICsgdXNwaS0+c19xZm1hc2spICYgdXNwaS0+c19mbWFzaykKKyNkZWZpbmUgdWZzX2ZyYWdzdG9ibGtzKGZyYWdzKQkoKGZyYWdzKSA+PiB1c3BpLT5zX2ZwYnNoaWZ0KQorI2RlZmluZSB1ZnNfYmxrc3RvZnJhZ3MoYmxrcykJKChibGtzKSA8PCB1c3BpLT5zX2ZwYnNoaWZ0KQorI2RlZmluZSB1ZnNfZnJhZ251bShmc2IpCSgoZnNiKSAmIHVzcGktPnNfZnBibWFzaykKKyNkZWZpbmUgdWZzX2Jsa251bShmc2IpCQkoKGZzYikgJiB+dXNwaS0+c19mcGJtYXNrKQorCisjZGVmaW5lCVVGU19NQVhOQU1MRU4gMjU1CisjZGVmaW5lIFVGU19NQVhNTlRMRU4gNTEyCisjZGVmaW5lIFVGUzJfTUFYTU5UTEVOIDQ2OAorI2RlZmluZSBVRlMyX01BWFZPTExFTiAzMgorI2RlZmluZSBVRlNfTUFYQ1NCVUZTIDMxCisjZGVmaW5lIFVGU19MSU5LX01BWCAzMjAwMAorLyoKKyNkZWZpbmUJVUZTMl9OT0NTUFRSUwkoKDEyOCAvIHNpemVvZih2b2lkICopKSAtIDQpCisqLworI2RlZmluZQlVRlMyX05PQ1NQVFJTCTI4CisKKy8qCisgKiBVRlNfRElSX1BBRCBkZWZpbmVzIHRoZSBkaXJlY3RvcnkgZW50cmllcyBib3VuZGFyaWVzCisgKiAobXVzdCBiZSBhIG11bHRpcGxlIG9mIDQpCisgKi8KKyNkZWZpbmUgVUZTX0RJUl9QQUQJCQk0CisjZGVmaW5lIFVGU19ESVJfUk9VTkQJCQkoVUZTX0RJUl9QQUQgLSAxKQorI2RlZmluZSBVRlNfRElSX1JFQ19MRU4obmFtZV9sZW4pCSgoKG5hbWVfbGVuKSArIDEgKyA4ICsgVUZTX0RJUl9ST1VORCkgJiB+VUZTX0RJUl9ST1VORCkKKworc3RydWN0IHVmc190aW1ldmFsIHsKKwlfX2ZzMzIJdHZfc2VjOworCV9fZnMzMgl0dl91c2VjOworfTsKKworc3RydWN0IHVmc19kaXJfZW50cnkgeworCV9fZnMzMiAgZF9pbm87CQkJLyogaW5vZGUgbnVtYmVyIG9mIHRoaXMgZW50cnkgKi8KKwlfX2ZzMTYgIGRfcmVjbGVuOwkJLyogbGVuZ3RoIG9mIHRoaXMgZW50cnkgKi8KKwl1bmlvbiB7CisJCV9fZnMxNglkX25hbWxlbjsJCS8qIGFjdHVhbCBsZW5ndGggb2YgZF9uYW1lICovCisJCXN0cnVjdCB7CisJCQlfX3U4CWRfdHlwZTsJCS8qIGZpbGUgdHlwZSAqLworCQkJX191OAlkX25hbWxlbjsJLyogbGVuZ3RoIG9mIHN0cmluZyBpbiBkX25hbWUgKi8KKwkJfSBkXzQ0OworCX0gZF91OworCV9fdTgJZF9uYW1lW1VGU19NQVhOQU1MRU4gKyAxXTsJLyogZmlsZSBuYW1lICovCit9OworCitzdHJ1Y3QgdWZzX2NzdW0geworCV9fZnMzMgljc19uZGlyOwkvKiBudW1iZXIgb2YgZGlyZWN0b3JpZXMgKi8KKwlfX2ZzMzIJY3NfbmJmcmVlOwkvKiBudW1iZXIgb2YgZnJlZSBibG9ja3MgKi8KKwlfX2ZzMzIJY3NfbmlmcmVlOwkvKiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgKi8KKwlfX2ZzMzIJY3NfbmZmcmVlOwkvKiBudW1iZXIgb2YgZnJlZSBmcmFncyAqLworfTsKK3N0cnVjdCB1ZnMyX2NzdW1fdG90YWwgeworCV9fZnM2NAljc19uZGlyOwkvKiBudW1iZXIgb2YgZGlyZWN0b3JpZXMgKi8KKwlfX2ZzNjQJY3NfbmJmcmVlOwkvKiBudW1iZXIgb2YgZnJlZSBibG9ja3MgKi8KKwlfX2ZzNjQJY3NfbmlmcmVlOwkvKiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgKi8KKwlfX2ZzNjQJY3NfbmZmcmVlOwkvKiBudW1iZXIgb2YgZnJlZSBmcmFncyAqLworCV9fZnM2NCAgIGNzX251bWNsdXN0ZXJzOwkvKiBudW1iZXIgb2YgZnJlZSBjbHVzdGVycyAqLworCV9fZnM2NCAgIGNzX3NwYXJlWzNdOwkvKiBmdXR1cmUgZXhwYW5zaW9uICovCit9OworCitzdHJ1Y3QgdWZzX2NzdW1fY29yZSB7CisJX191NjQJY3NfbmRpcjsJLyogbnVtYmVyIG9mIGRpcmVjdG9yaWVzICovCisJX191NjQJY3NfbmJmcmVlOwkvKiBudW1iZXIgb2YgZnJlZSBibG9ja3MgKi8KKwlfX3U2NAljc19uaWZyZWU7CS8qIG51bWJlciBvZiBmcmVlIGlub2RlcyAqLworCV9fdTY0CWNzX25mZnJlZTsJLyogbnVtYmVyIG9mIGZyZWUgZnJhZ3MgKi8KKwlfX3U2NCAgIGNzX251bWNsdXN0ZXJzOwkvKiBudW1iZXIgb2YgZnJlZSBjbHVzdGVycyAqLworfTsKKworLyoKKyAqIEZpbGUgc3lzdGVtIGZsYWdzCisgKi8KKyNkZWZpbmUgVUZTX1VOQ0xFQU4gICAgICAweDAxICAgIC8qIGZpbGUgc3lzdGVtIG5vdCBjbGVhbiBhdCBtb3VudCAodW51c2VkKSAqLworI2RlZmluZSBVRlNfRE9TT0ZUREVQICAgIDB4MDIgICAgLyogZmlsZSBzeXN0ZW0gdXNpbmcgc29mdCBkZXBlbmRlbmNpZXMgKi8KKyNkZWZpbmUgVUZTX05FRURTRlNDSyAgICAweDA0ICAgIC8qIG5lZWRzIHN5bmMgZnNjayAoRnJlZUJTRCBjb21wYXQsIHVudXNlZCkgKi8KKyNkZWZpbmUgVUZTX0lOREVYRElSUyAgICAweDA4ICAgIC8qIGtlcm5lbCBzdXBwb3J0cyBpbmRleGVkIGRpcmVjdG9yaWVzICovCisjZGVmaW5lIFVGU19BQ0xTICAgICAgICAgMHgxMCAgICAvKiBmaWxlIHN5c3RlbSBoYXMgQUNMcyBlbmFibGVkICovCisjZGVmaW5lIFVGU19NVUxUSUxBQkVMICAgMHgyMCAgICAvKiBmaWxlIHN5c3RlbSBpcyBNQUMgbXVsdGktbGFiZWwgKi8KKyNkZWZpbmUgVUZTX0ZMQUdTX1VQREFURUQgMHg4MCAgIC8qIGZsYWdzIGhhdmUgYmVlbiBtb3ZlZCB0byBuZXcgbG9jYXRpb24gKi8KKworI2lmIDAKKy8qCisgKiBUaGlzIGlzIHRoZSBhY3R1YWwgc3VwZXJibG9jaywgYXMgaXQgaXMgbGFpZCBvdXQgb24gdGhlIGRpc2suCisgKiBEbyBOT1QgdXNlIHRoaXMgc3RydWN0dXJlLCBiZWNhdXNlIG9mIHNpemVvZih1ZnNfc3VwZXJfYmxvY2spID4gNTEyIGFuZAorICogaXQgbWF5IG9jY3VweSBzZXZlcmFsIGJsb2NrcywgdXNlCisgKiBzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrXyhmaXJzdCxzZWNvbmQsdGhpcmQpIGluc3RlYWQuCisgKi8KK3N0cnVjdCB1ZnNfc3VwZXJfYmxvY2sgeworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fZnMzMglmc19saW5rOwkvKiBVTlVTRUQgKi8KKwkJfSBmc180MjsKKwkJc3RydWN0IHsKKwkJCV9fZnMzMglmc19zdGF0ZTsJLyogZmlsZSBzeXN0ZW0gc3RhdGUgZmxhZyAqLworCQl9IGZzX3N1bjsKKwl9IGZzX3UwOworCV9fZnMzMglmc19ybGluazsJLyogVU5VU0VEICovCisJX19mczMyCWZzX3NibGtubzsJLyogYWRkciBvZiBzdXBlci1ibG9jayBpbiBmaWxlc3lzICovCisJX19mczMyCWZzX2NibGtubzsJLyogb2Zmc2V0IG9mIGN5bC1ibG9jayBpbiBmaWxlc3lzICovCisJX19mczMyCWZzX2libGtubzsJLyogb2Zmc2V0IG9mIGlub2RlLWJsb2NrcyBpbiBmaWxlc3lzICovCisJX19mczMyCWZzX2RibGtubzsJLyogb2Zmc2V0IG9mIGZpcnN0IGRhdGEgYWZ0ZXIgY2cgKi8KKwlfX2ZzMzIJZnNfY2dvZmZzZXQ7CS8qIGN5bGluZGVyIGdyb3VwIG9mZnNldCBpbiBjeWxpbmRlciAqLworCV9fZnMzMglmc19jZ21hc2s7CS8qIHVzZWQgdG8gY2FsYyBtb2QgZnNfbnRyYWsgKi8KKwlfX2ZzMzIJZnNfdGltZTsJLyogbGFzdCB0aW1lIHdyaXR0ZW4gLS0gdGltZV90ICovCisJX19mczMyCWZzX3NpemU7CS8qIG51bWJlciBvZiBibG9ja3MgaW4gZnMgKi8KKwlfX2ZzMzIJZnNfZHNpemU7CS8qIG51bWJlciBvZiBkYXRhIGJsb2NrcyBpbiBmcyAqLworCV9fZnMzMglmc19uY2c7CQkvKiBudW1iZXIgb2YgY3lsaW5kZXIgZ3JvdXBzICovCisJX19mczMyCWZzX2JzaXplOwkvKiBzaXplIG9mIGJhc2ljIGJsb2NrcyBpbiBmcyAqLworCV9fZnMzMglmc19mc2l6ZTsJLyogc2l6ZSBvZiBmcmFnIGJsb2NrcyBpbiBmcyAqLworCV9fZnMzMglmc19mcmFnOwkvKiBudW1iZXIgb2YgZnJhZ3MgaW4gYSBibG9jayBpbiBmcyAqLworLyogdGhlc2UgYXJlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLworCV9fZnMzMglmc19taW5mcmVlOwkvKiBtaW5pbXVtIHBlcmNlbnRhZ2Ugb2YgZnJlZSBibG9ja3MgKi8KKwlfX2ZzMzIJZnNfcm90ZGVsYXk7CS8qIG51bSBvZiBtcyBmb3Igb3B0aW1hbCBuZXh0IGJsb2NrICovCisJX19mczMyCWZzX3JwczsJCS8qIGRpc2sgcmV2b2x1dGlvbnMgcGVyIHNlY29uZCAqLworLyogdGhlc2UgZmllbGRzIGNhbiBiZSBjb21wdXRlZCBmcm9tIHRoZSBvdGhlcnMgKi8KKwlfX2ZzMzIJZnNfYm1hc2s7CS8qIGBgYmxrb2ZmJycgY2FsYyBvZiBibGsgb2Zmc2V0cyAqLworCV9fZnMzMglmc19mbWFzazsJLyogYGBmcmFnb2ZmJycgY2FsYyBvZiBmcmFnIG9mZnNldHMgKi8KKwlfX2ZzMzIJZnNfYnNoaWZ0OwkvKiBgYGxibGtubycnIGNhbGMgb2YgbG9naWNhbCBibGtubyAqLworCV9fZnMzMglmc19mc2hpZnQ7CS8qIGBgbnVtZnJhZ3MnJyBjYWxjIG51bWJlciBvZiBmcmFncyAqLworLyogdGhlc2UgYXJlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLworCV9fZnMzMglmc19tYXhjb250aWc7CS8qIG1heCBudW1iZXIgb2YgY29udGlndW91cyBibGtzICovCisJX19mczMyCWZzX21heGJwZzsJLyogbWF4IG51bWJlciBvZiBibGtzIHBlciBjeWwgZ3JvdXAgKi8KKy8qIHRoZXNlIGZpZWxkcyBjYW4gYmUgY29tcHV0ZWQgZnJvbSB0aGUgb3RoZXJzICovCisJX19mczMyCWZzX2ZyYWdzaGlmdDsJLyogYmxvY2sgdG8gZnJhZyBzaGlmdCAqLworCV9fZnMzMglmc19mc2J0b2RiOwkvKiBmc2J0b2RiIGFuZCBkYnRvZnNiIHNoaWZ0IGNvbnN0YW50ICovCisJX19mczMyCWZzX3Nic2l6ZTsJLyogYWN0dWFsIHNpemUgb2Ygc3VwZXIgYmxvY2sgKi8KKwlfX2ZzMzIJZnNfY3NtYXNrOwkvKiBjc3VtIGJsb2NrIG9mZnNldCAqLworCV9fZnMzMglmc19jc3NoaWZ0OwkvKiBjc3VtIGJsb2NrIG51bWJlciAqLworCV9fZnMzMglmc19uaW5kaXI7CS8qIHZhbHVlIG9mIE5JTkRJUiAqLworCV9fZnMzMglmc19pbm9wYjsJLyogdmFsdWUgb2YgSU5PUEIgKi8KKwlfX2ZzMzIJZnNfbnNwZjsJLyogdmFsdWUgb2YgTlNQRiAqLworLyogeWV0IGFub3RoZXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgKi8KKwlfX2ZzMzIJZnNfb3B0aW07CS8qIG9wdGltaXphdGlvbiBwcmVmZXJlbmNlLCBzZWUgYmVsb3cgKi8KKy8qIHRoZXNlIGZpZWxkcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBoYXJkd2FyZSAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fZnMzMglmc19ucHNlY3Q7CS8qICMgc2VjdG9ycy90cmFjayBpbmNsdWRpbmcgc3BhcmVzICovCisJCX0gZnNfc3VuOworCQlzdHJ1Y3QgeworCQkJX19mczMyCWZzX3N0YXRlOwkvKiBmaWxlIHN5c3RlbSBzdGF0ZSB0aW1lIHN0YW1wICovCisJCX0gZnNfc3VueDg2OworCX0gZnNfdTE7CisJX19mczMyCWZzX2ludGVybGVhdmU7CS8qIGhhcmR3YXJlIHNlY3RvciBpbnRlcmxlYXZlICovCisJX19mczMyCWZzX3RyYWNrc2tldzsJLyogc2VjdG9yIDAgc2tldywgcGVyIHRyYWNrICovCisvKiBhIHVuaXF1ZSBpZCBmb3IgdGhpcyBmaWxlc3lzdGVtIChjdXJyZW50bHkgdW51c2VkIGFuZCB1bm1haW50YWluZWQpICovCisvKiBJbiA0LjMgVGFob2UgdGhpcyBzcGFjZSBpcyB1c2VkIGJ5IGZzX2hlYWRzd2l0Y2ggYW5kIGZzX3Rya3NlZWsgKi8KKy8qIE5laXRoZXIgb2YgdGhvc2UgZmllbGRzIGlzIHVzZWQgaW4gdGhlIFRhaG9lIGNvZGUgcmlnaHQgbm93IGJ1dCAqLworLyogdGhlcmUgY291bGQgYmUgcHJvYmxlbXMgaWYgdGhleSBhcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJX19mczMyCWZzX2lkWzJdOwkvKiBmaWxlIHN5c3RlbSBpZCAqLworLyogc2l6ZXMgZGV0ZXJtaW5lZCBieSBudW1iZXIgb2YgY3lsaW5kZXIgZ3JvdXBzIGFuZCB0aGVpciBzaXplcyAqLworCV9fZnMzMglmc19jc2FkZHI7CS8qIGJsayBhZGRyIG9mIGN5bCBncnAgc3VtbWFyeSBhcmVhICovCisJX19mczMyCWZzX2Nzc2l6ZTsJLyogc2l6ZSBvZiBjeWwgZ3JwIHN1bW1hcnkgYXJlYSAqLworCV9fZnMzMglmc19jZ3NpemU7CS8qIGN5bGluZGVyIGdyb3VwIHNpemUgKi8KKy8qIHRoZXNlIGZpZWxkcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBoYXJkd2FyZSAqLworCV9fZnMzMglmc19udHJhazsJLyogdHJhY2tzIHBlciBjeWxpbmRlciAqLworCV9fZnMzMglmc19uc2VjdDsJLyogc2VjdG9ycyBwZXIgdHJhY2sgKi8KKwlfX2ZzMzIJZnNfc3BjOwkJLyogc2VjdG9ycyBwZXIgY3lsaW5kZXIgKi8KKy8qIHRoaXMgY29tZXMgZnJvbSB0aGUgZGlzayBkcml2ZXIgcGFydGl0aW9uaW5nICovCisJX19mczMyCWZzX25jeWw7CS8qIGN5bGluZGVycyBpbiBmaWxlIHN5c3RlbSAqLworLyogdGhlc2UgZmllbGRzIGNhbiBiZSBjb21wdXRlZCBmcm9tIHRoZSBvdGhlcnMgKi8KKwlfX2ZzMzIJZnNfY3BnOwkJLyogY3lsaW5kZXJzIHBlciBncm91cCAqLworCV9fZnMzMglmc19pcGc7CQkvKiBpbm9kZXMgcGVyIGN5bGluZGVyIGdyb3VwICovCisJX19mczMyCWZzX2ZwZzsJCS8qIGJsb2NrcyBwZXIgZ3JvdXAgKiBmc19mcmFnICovCisvKiB0aGlzIGRhdGEgbXVzdCBiZSByZS1jb21wdXRlZCBhZnRlciBjcmFzaGVzICovCisJc3RydWN0IHVmc19jc3VtIGZzX2NzdG90YWw7CS8qIGN5bGluZGVyIHN1bW1hcnkgaW5mb3JtYXRpb24gKi8KKy8qIHRoZXNlIGZpZWxkcyBhcmUgY2xlYXJlZCBhdCBtb3VudCB0aW1lICovCisJX19zOAlmc19mbW9kOwkvKiBzdXBlciBibG9jayBtb2RpZmllZCBmbGFnICovCisJX19zOAlmc19jbGVhbjsJLyogZmlsZSBzeXN0ZW0gaXMgY2xlYW4gZmxhZyAqLworCV9fczgJZnNfcm9ubHk7CS8qIG1vdW50ZWQgcmVhZC1vbmx5IGZsYWcgKi8KKwlfX3M4CWZzX2ZsYWdzOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fczgJZnNfZnNtbnRbVUZTX01BWE1OVExFTl07LyogbmFtZSBtb3VudGVkIG9uICovCisJCQlfX2ZzMzIJZnNfY2dyb3RvcjsJLyogbGFzdCBjZyBzZWFyY2hlZCAqLworCQkJX19mczMyCWZzX2NzcFtVRlNfTUFYQ1NCVUZTXTsvKmxpc3Qgb2YgZnNfY3MgaW5mbyBidWZmZXJzICovCisJCQlfX2ZzMzIJZnNfbWF4Y2x1c3RlcjsKKwkJCV9fZnMzMglmc19jcGM7CQkvKiBjeWwgcGVyIGN5Y2xlIGluIHBvc3RibCAqLworCQkJX19mczE2CWZzX29wb3N0YmxbMTZdWzhdOyAvKiBvbGQgcm90YXRpb24gYmxvY2sgbGlzdCBoZWFkICovCisJCX0gZnNfdTE7CisJCXN0cnVjdCB7CisJCQlfX3M4ICBmc19mc21udFtVRlMyX01BWE1OVExFTl07CS8qIG5hbWUgbW91bnRlZCBvbiAqLworCQkJX191OCAgIGZzX3ZvbG5hbWVbVUZTMl9NQVhWT0xMRU5dOyAvKiB2b2x1bWUgbmFtZSAqLworCQkJX19mczY0ICBmc19zd3VpZDsJCS8qIHN5c3RlbS13aWRlIHVpZCAqLworCQkJX19mczMyICBmc19wYWQ7CS8qIGR1ZSB0byBhbGlnbm1lbnQgb2YgZnNfc3d1aWQgKi8KKwkJCV9fZnMzMiAgIGZzX2Nncm90b3I7ICAgICAvKiBsYXN0IGNnIHNlYXJjaGVkICovCisJCQlfX2ZzMzIgICBmc19vY3NwW1VGUzJfTk9DU1BUUlNdOyAvKmxpc3Qgb2YgZnNfY3MgaW5mbyBidWZmZXJzICovCisJCQlfX2ZzMzIgICBmc19jb250aWdkaXJzOy8qIyBvZiBjb250aWd1b3VzbHkgYWxsb2NhdGVkIGRpcnMgKi8KKwkJCV9fZnMzMiAgIGZzX2NzcDsJLyogY2cgc3VtbWFyeSBpbmZvIGJ1ZmZlciBmb3IgZnNfY3MgKi8KKwkJCV9fZnMzMiAgIGZzX21heGNsdXN0ZXI7CisJCQlfX2ZzMzIgICBmc19hY3RpdmU7LyogdXNlZCBieSBzbmFwc2hvdHMgdG8gdHJhY2sgZnMgKi8KKwkJCV9fZnMzMiAgIGZzX29sZF9jcGM7CS8qIGN5bCBwZXIgY3ljbGUgaW4gcG9zdGJsICovCisJCQlfX2ZzMzIgICBmc19tYXhic2l6ZTsvKm1heGltdW0gYmxvY2tpbmcgZmFjdG9yIHBlcm1pdHRlZCAqLworCQkJX19mczY0ICAgZnNfc3BhcmVjb242NFsxN107LypvbGQgcm90YXRpb24gYmxvY2sgbGlzdCBoZWFkICovCisJCQlfX2ZzNjQgICBmc19zYmxvY2tsb2M7IC8qIGJ5dGUgb2Zmc2V0IG9mIHN0YW5kYXJkIHN1cGVyYmxvY2sgKi8KKwkJCXN0cnVjdCAgdWZzMl9jc3VtX3RvdGFsIGZzX2NzdG90YWw7LypjeWxpbmRlciBzdW1tYXJ5IGluZm9ybWF0aW9uKi8KKwkJCXN0cnVjdCAgdWZzX3RpbWV2YWwgICAgZnNfdGltZTsJCS8qIGxhc3QgdGltZSB3cml0dGVuICovCisJCQlfX2ZzNjQgICAgZnNfc2l6ZTsJCS8qIG51bWJlciBvZiBibG9ja3MgaW4gZnMgKi8KKwkJCV9fZnM2NCAgICBmc19kc2l6ZTsJLyogbnVtYmVyIG9mIGRhdGEgYmxvY2tzIGluIGZzICovCisJCQlfX2ZzNjQgICBmc19jc2FkZHI7CS8qIGJsayBhZGRyIG9mIGN5bCBncnAgc3VtbWFyeSBhcmVhICovCisJCQlfX2ZzNjQgICAgZnNfcGVuZGluZ2Jsb2NrczsvKiBibG9ja3MgaW4gcHJvY2VzcyBvZiBiZWluZyBmcmVlZCAqLworCQkJX19mczMyICAgIGZzX3BlbmRpbmdpbm9kZXM7Lyppbm9kZXMgaW4gcHJvY2VzcyBvZiBiZWluZyBmcmVlZCAqLworCQl9IGZzX3UyOworCX0gIGZzX3UxMTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX2ZzMzIJZnNfc3BhcmVjb25bNTNdOy8qIHJlc2VydmVkIGZvciBmdXR1cmUgY29uc3RhbnRzICovCisJCQlfX2ZzMzIJZnNfcmVjbGFpbTsKKwkJCV9fZnMzMglmc19zcGFyZWNvbjJbMV07CisJCQlfX2ZzMzIJZnNfc3RhdGU7CS8qIGZpbGUgc3lzdGVtIHN0YXRlIHRpbWUgc3RhbXAgKi8KKwkJCV9fZnMzMglmc19xYm1hc2tbMl07CS8qIH51c2JfYm1hc2sgKi8KKwkJCV9fZnMzMglmc19xZm1hc2tbMl07CS8qIH51c2JfZm1hc2sgKi8KKwkJfSBmc19zdW47CisJCXN0cnVjdCB7CisJCQlfX2ZzMzIJZnNfc3BhcmVjb25bNTNdOy8qIHJlc2VydmVkIGZvciBmdXR1cmUgY29uc3RhbnRzICovCisJCQlfX2ZzMzIJZnNfcmVjbGFpbTsKKwkJCV9fZnMzMglmc19zcGFyZWNvbjJbMV07CisJCQlfX2ZzMzIJZnNfbnBzZWN0OwkvKiAjIHNlY3RvcnMvdHJhY2sgaW5jbHVkaW5nIHNwYXJlcyAqLworCQkJX19mczMyCWZzX3FibWFza1syXTsJLyogfnVzYl9ibWFzayAqLworCQkJX19mczMyCWZzX3FmbWFza1syXTsJLyogfnVzYl9mbWFzayAqLworCQl9IGZzX3N1bng4NjsKKwkJc3RydWN0IHsKKwkJCV9fZnMzMglmc19zcGFyZWNvbls1MF07LyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBjb25zdGFudHMgKi8KKwkJCV9fZnMzMglmc19jb250aWdzdW1zaXplOy8qIHNpemUgb2YgY2x1c3RlciBzdW1tYXJ5IGFycmF5ICovCisJCQlfX2ZzMzIJZnNfbWF4c3ltbGlua2xlbjsvKiBtYXggbGVuZ3RoIG9mIGFuIGludGVybmFsIHN5bWxpbmsgKi8KKwkJCV9fZnMzMglmc19pbm9kZWZtdDsJLyogZm9ybWF0IG9mIG9uLWRpc2sgaW5vZGVzICovCisJCQlfX2ZzMzIJZnNfbWF4ZmlsZXNpemVbMl07CS8qIG1heCByZXByZXNlbnRhYmxlIGZpbGUgc2l6ZSAqLworCQkJX19mczMyCWZzX3FibWFza1syXTsJLyogfnVzYl9ibWFzayAqLworCQkJX19mczMyCWZzX3FmbWFza1syXTsJLyogfnVzYl9mbWFzayAqLworCQkJX19mczMyCWZzX3N0YXRlOwkvKiBmaWxlIHN5c3RlbSBzdGF0ZSB0aW1lIHN0YW1wICovCisJCX0gZnNfNDQ7CisJfSBmc191MjsKKwlfX2ZzMzIJZnNfcG9zdGJsZm9ybWF0OwkvKiBmb3JtYXQgb2YgcG9zaXRpb25hbCBsYXlvdXQgdGFibGVzICovCisJX19mczMyCWZzX25ycG9zOwkJLyogbnVtYmVyIG9mIHJvdGF0aW9uYWwgcG9zaXRpb25zICovCisJX19mczMyCWZzX3Bvc3RibG9mZjsJCS8qIChfX3MxNikgcm90YXRpb24gYmxvY2sgbGlzdCBoZWFkICovCisJX19mczMyCWZzX3JvdGJsb2ZmOwkJLyogKF9fdTgpIGJsb2NrcyBmb3IgZWFjaCByb3RhdGlvbiAqLworCV9fZnMzMglmc19tYWdpYzsJCS8qIG1hZ2ljIG51bWJlciAqLworCV9fdTgJZnNfc3BhY2VbMV07CQkvKiBsaXN0IG9mIGJsb2NrcyBmb3IgZWFjaCByb3RhdGlvbiAqLworfTsKKyNlbmRpZi8qc3RydWN0IHVmc19zdXBlcl9ibG9jayovCisKKy8qCisgKiBQcmVmZXJlbmNlIGZvciBvcHRpbWl6YXRpb24uCisgKi8KKyNkZWZpbmUgVUZTX09QVFRJTUUJMAkvKiBtaW5pbWl6ZSBhbGxvY2F0aW9uIHRpbWUgKi8KKyNkZWZpbmUgVUZTX09QVFNQQUNFCTEJLyogbWluaW1pemUgZGlzayBmcmFnbWVudGF0aW9uICovCisKKy8qCisgKiBSb3RhdGlvbmFsIGxheW91dCB0YWJsZSBmb3JtYXQgdHlwZXMKKyAqLworI2RlZmluZSBVRlNfNDJQT1NUQkxGTVQJCS0xCS8qIDQuMkJTRCByb3RhdGlvbmFsIHRhYmxlIGZvcm1hdCAqLworI2RlZmluZSBVRlNfRFlOQU1JQ1BPU1RCTEZNVAkxCS8qIGR5bmFtaWMgcm90YXRpb25hbCB0YWJsZSBmb3JtYXQgKi8KKworLyoKKyAqIENvbnZlcnQgY3lsaW5kZXIgZ3JvdXAgdG8gYmFzZSBhZGRyZXNzIG9mIGl0cyBnbG9iYWwgc3VtbWFyeSBpbmZvLgorICovCisjZGVmaW5lIGZzX2NzKGluZHgpIHNfY3NwWyhpbmR4KV0KKworLyoKKyAqIEN5bGluZGVyIGdyb3VwIGJsb2NrIGZvciBhIGZpbGUgc3lzdGVtLgorICoKKyAqIFdyaXRhYmxlIGZpZWxkcyBpbiB0aGUgY3lsaW5kZXIgZ3JvdXAgYXJlIHByb3RlY3RlZCBieSB0aGUgYXNzb2NpYXRlZAorICogc3VwZXIgYmxvY2sgbG9jayBmcy0+ZnNfbG9jay4KKyAqLworI2RlZmluZQlDR19NQUdJQwkweDA5MDI1NQorI2RlZmluZSB1ZnNfY2dfY2hrbWFnaWMoc2IsIHVjZykgXAorCShmczMyX3RvX2NwdSgoc2IpLCAodWNnKS0+Y2dfbWFnaWMpID09IENHX01BR0lDKQorLyoKKyAqIE1hY3JvcyBmb3IgYWNjZXNzIHRvIG9sZCBjeWxpbmRlciBncm91cCBhcnJheSBzdHJ1Y3R1cmVzCisgKi8KKyNkZWZpbmUgdWZzX29jZ19ibGt0b3Qoc2IsIHVjZykgICAgICBmczMyX3RvX2NwdSgoc2IpLCAoKHN0cnVjdCB1ZnNfb2xkX2N5bGluZGVyX2dyb3VwICopKHVjZykpLT5jZ19idG90KQorI2RlZmluZSB1ZnNfb2NnX2Jsa3Moc2IsIHVjZywgY3lsbm8pIGZzMzJfdG9fY3B1KChzYiksICgoc3RydWN0IHVmc19vbGRfY3lsaW5kZXJfZ3JvdXAgKikodWNnKSktPmNnX2JbY3lsbm9dKQorI2RlZmluZSB1ZnNfb2NnX2lub3N1c2VkKHNiLCB1Y2cpICAgIGZzMzJfdG9fY3B1KChzYiksICgoc3RydWN0IHVmc19vbGRfY3lsaW5kZXJfZ3JvdXAgKikodWNnKSktPmNnX2l1c2VkKQorI2RlZmluZSB1ZnNfb2NnX2Jsa3NmcmVlKHNiLCB1Y2cpICAgIGZzMzJfdG9fY3B1KChzYiksICgoc3RydWN0IHVmc19vbGRfY3lsaW5kZXJfZ3JvdXAgKikodWNnKSktPmNnX2ZyZWUpCisjZGVmaW5lIHVmc19vY2dfY2hrbWFnaWMoc2IsIHVjZykgXAorCShmczMyX3RvX2NwdSgoc2IpLCAoKHN0cnVjdCB1ZnNfb2xkX2N5bGluZGVyX2dyb3VwICopKHVjZykpLT5jZ19tYWdpYykgPT0gQ0dfTUFHSUMpCisKKy8qCisgKiBzaXplIG9mIHRoaXMgc3RydWN0dXJlIGlzIDE3MiBCCisgKi8KK3N0cnVjdAl1ZnNfY3lsaW5kZXJfZ3JvdXAgeworCV9fZnMzMgljZ19saW5rOwkJLyogbGlua2VkIGxpc3Qgb2YgY3lsIGdyb3VwcyAqLworCV9fZnMzMgljZ19tYWdpYzsJCS8qIG1hZ2ljIG51bWJlciAqLworCV9fZnMzMgljZ190aW1lOwkJLyogdGltZSBsYXN0IHdyaXR0ZW4gKi8KKwlfX2ZzMzIJY2dfY2d4OwkJCS8qIHdlIGFyZSB0aGUgY2d4J3RoIGN5bGluZGVyIGdyb3VwICovCisJX19mczE2CWNnX25jeWw7CQkvKiBudW1iZXIgb2YgY3lsJ3MgdGhpcyBjZyAqLworCV9fZnMxNgljZ19uaWJsazsJCS8qIG51bWJlciBvZiBpbm9kZSBibG9ja3MgdGhpcyBjZyAqLworCV9fZnMzMgljZ19uZGJsazsJCS8qIG51bWJlciBvZiBkYXRhIGJsb2NrcyB0aGlzIGNnICovCisJc3RydWN0CXVmc19jc3VtIGNnX2NzOwkJLyogY3lsaW5kZXIgc3VtbWFyeSBpbmZvcm1hdGlvbiAqLworCV9fZnMzMgljZ19yb3RvcjsJCS8qIHBvc2l0aW9uIG9mIGxhc3QgdXNlZCBibG9jayAqLworCV9fZnMzMgljZ19mcm90b3I7CQkvKiBwb3NpdGlvbiBvZiBsYXN0IHVzZWQgZnJhZyAqLworCV9fZnMzMgljZ19pcm90b3I7CQkvKiBwb3NpdGlvbiBvZiBsYXN0IHVzZWQgaW5vZGUgKi8KKwlfX2ZzMzIJY2dfZnJzdW1bVUZTX01BWEZSQUddOwkvKiBjb3VudHMgb2YgYXZhaWxhYmxlIGZyYWdzICovCisJX19mczMyCWNnX2J0b3RvZmY7CQkvKiAoX191MzIpIGJsb2NrIHRvdGFscyBwZXIgY3lsaW5kZXIgKi8KKwlfX2ZzMzIJY2dfYm9mZjsJCS8qIChzaG9ydCkgZnJlZSBibG9jayBwb3NpdGlvbnMgKi8KKwlfX2ZzMzIJY2dfaXVzZWRvZmY7CQkvKiAoY2hhcikgdXNlZCBpbm9kZSBtYXAgKi8KKwlfX2ZzMzIJY2dfZnJlZW9mZjsJCS8qICh1X2NoYXIpIGZyZWUgYmxvY2sgbWFwICovCisJX19mczMyCWNnX25leHRmcmVlb2ZmOwkJLyogKHVfY2hhcikgbmV4dCBhdmFpbGFibGUgc3BhY2UgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX2ZzMzIJY2dfY2x1c3RlcnN1bW9mZjsJLyogKHVfaW50MzIpIGNvdW50cyBvZiBhdmFpbCBjbHVzdGVycyAqLworCQkJX19mczMyCWNnX2NsdXN0ZXJvZmY7CQkvKiAodV9pbnQ4KSBmcmVlIGNsdXN0ZXIgbWFwICovCisJCQlfX2ZzMzIJY2dfbmNsdXN0ZXJibGtzOwkvKiBudW1iZXIgb2YgY2x1c3RlcnMgdGhpcyBjZyAqLworCQkJX19mczMyCWNnX3NwYXJlY29uWzEzXTsJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KKwkJfSBjZ180NDsKKwkJc3RydWN0IHsKKwkJCV9fZnMzMgljZ19jbHVzdGVyc3Vtb2ZmOy8qICh1X2ludDMyKSBjb3VudHMgb2YgYXZhaWwgY2x1c3RlcnMgKi8KKwkJCV9fZnMzMgljZ19jbHVzdGVyb2ZmOwkvKiAodV9pbnQ4KSBmcmVlIGNsdXN0ZXIgbWFwICovCisJCQlfX2ZzMzIJY2dfbmNsdXN0ZXJibGtzOy8qIG51bWJlciBvZiBjbHVzdGVycyB0aGlzIGNnICovCisJCQlfX2ZzMzIgICBjZ19uaWJsazsgLyogbnVtYmVyIG9mIGlub2RlIGJsb2NrcyB0aGlzIGNnICovCisJCQlfX2ZzMzIgICBjZ19pbml0ZWRpYmxrOwkvKiBsYXN0IGluaXRpYWxpemVkIGlub2RlICovCisJCQlfX2ZzMzIgICBjZ19zcGFyZWNvbjMyWzNdOy8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCisJCQlfX2ZzNjQgICBjZ190aW1lOwkvKiB0aW1lIGxhc3Qgd3JpdHRlbiAqLworCQkJX19mczY0CWNnX3NwYXJlY29uWzNdOwkvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworCQl9IGNnX3UyOworCQlfX2ZzMzIJY2dfc3BhcmVjb25bMTZdOwkvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworCX0gY2dfdTsKKwlfX3U4CWNnX3NwYWNlWzFdOwkJLyogc3BhY2UgZm9yIGN5bGluZGVyIGdyb3VwIG1hcHMgKi8KKy8qIGFjdHVhbGx5IGxvbmdlciAqLworfTsKKworLyogSGlzdG9yaWMgQ3lsaW5kZXIgZ3JvdXAgaW5mbyAqLworc3RydWN0IHVmc19vbGRfY3lsaW5kZXJfZ3JvdXAgeworCV9fZnMzMgljZ19saW5rOwkJLyogbGlua2VkIGxpc3Qgb2YgY3lsIGdyb3VwcyAqLworCV9fZnMzMgljZ19ybGluazsJCS8qIGZvciBpbmNvcmUgY3lsIGdyb3VwcyAgICAgKi8KKwlfX2ZzMzIJY2dfdGltZTsJCS8qIHRpbWUgbGFzdCB3cml0dGVuICovCisJX19mczMyCWNnX2NneDsJCQkvKiB3ZSBhcmUgdGhlIGNneCd0aCBjeWxpbmRlciBncm91cCAqLworCV9fZnMxNgljZ19uY3lsOwkJLyogbnVtYmVyIG9mIGN5bCdzIHRoaXMgY2cgKi8KKwlfX2ZzMTYJY2dfbmlibGs7CQkvKiBudW1iZXIgb2YgaW5vZGUgYmxvY2tzIHRoaXMgY2cgKi8KKwlfX2ZzMzIJY2dfbmRibGs7CQkvKiBudW1iZXIgb2YgZGF0YSBibG9ja3MgdGhpcyBjZyAqLworCXN0cnVjdAl1ZnNfY3N1bSBjZ19jczsJCS8qIGN5bGluZGVyIHN1bW1hcnkgaW5mb3JtYXRpb24gKi8KKwlfX2ZzMzIJY2dfcm90b3I7CQkvKiBwb3NpdGlvbiBvZiBsYXN0IHVzZWQgYmxvY2sgKi8KKwlfX2ZzMzIJY2dfZnJvdG9yOwkJLyogcG9zaXRpb24gb2YgbGFzdCB1c2VkIGZyYWcgKi8KKwlfX2ZzMzIJY2dfaXJvdG9yOwkJLyogcG9zaXRpb24gb2YgbGFzdCB1c2VkIGlub2RlICovCisJX19mczMyCWNnX2Zyc3VtWzhdOwkJLyogY291bnRzIG9mIGF2YWlsYWJsZSBmcmFncyAqLworCV9fZnMzMgljZ19idG90WzMyXTsJCS8qIGJsb2NrIHRvdGFscyBwZXIgY3lsaW5kZXIgKi8KKwlfX2ZzMTYJY2dfYlszMl1bOF07CQkvKiBwb3NpdGlvbnMgb2YgZnJlZSBibG9ja3MgKi8KKwlfX3U4CWNnX2l1c2VkWzI1Nl07CQkvKiB1c2VkIGlub2RlIG1hcCAqLworCV9fZnMzMgljZ19tYWdpYzsJCS8qIG1hZ2ljIG51bWJlciAqLworCV9fdTgJY2dfZnJlZVsxXTsJCS8qIGZyZWUgYmxvY2sgbWFwICovCisvKiBhY3R1YWxseSBsb25nZXIgKi8KK307CisKKy8qCisgKiBzdHJ1Y3R1cmUgb2YgYW4gb24tZGlzayBpbm9kZQorICovCitzdHJ1Y3QgdWZzX2lub2RlIHsKKwlfX2ZzMTYJdWlfbW9kZTsJCS8qICAweDAgKi8KKwlfX2ZzMTYJdWlfbmxpbms7CQkvKiAgMHgyICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX19mczE2CXVpX3N1aWQ7CS8qICAweDQgKi8KKwkJCV9fZnMxNgl1aV9zZ2lkOwkvKiAgMHg2ICovCisJCX0gb2xkaWRzOworCQlfX2ZzMzIJdWlfaW51bWJlcjsJCS8qICAweDQgbHNmOiBpbm9kZSBudW1iZXIgKi8KKwkJX19mczMyCXVpX2F1dGhvcjsJCS8qICAweDQgR05VIEhVUkQ6IGF1dGhvciAqLworCX0gdWlfdTE7CisJX19mczY0CXVpX3NpemU7CQkvKiAgMHg4ICovCisJc3RydWN0IHVmc190aW1ldmFsIHVpX2F0aW1lOwkvKiAweDEwIGFjY2VzcyAqLworCXN0cnVjdCB1ZnNfdGltZXZhbCB1aV9tdGltZTsJLyogMHgxOCBtb2RpZmljYXRpb24gKi8KKwlzdHJ1Y3QgdWZzX3RpbWV2YWwgdWlfY3RpbWU7CS8qIDB4MjAgY3JlYXRpb24gKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX2ZzMzIJdWlfZGJbVUZTX05EQUREUl07LyogMHgyOCBkYXRhIGJsb2NrcyAqLworCQkJX19mczMyCXVpX2liW1VGU19OSU5ESVJdOy8qIDB4NTggaW5kaXJlY3QgYmxvY2tzICovCisJCX0gdWlfYWRkcjsKKwkJX191OAl1aV9zeW1saW5rWzQqKFVGU19OREFERFIrVUZTX05JTkRJUildOy8qIDB4MjggZmFzdCBzeW1saW5rICovCisJfSB1aV91MjsKKwlfX2ZzMzIJdWlfZmxhZ3M7CQkvKiAweDY0IGltbXV0YWJsZSwgYXBwZW5kLW9ubHkuLi4gKi8KKwlfX2ZzMzIJdWlfYmxvY2tzOwkJLyogMHg2OCBibG9ja3MgaW4gdXNlICovCisJX19mczMyCXVpX2dlbjsJCQkvKiAweDZjIGxpa2UgZXh0MiBpX3ZlcnNpb24sIGZvciBORlMgc3VwcG9ydCAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fZnMzMgl1aV9zaGFkb3c7CS8qIDB4NzAgc2hhZG93IGlub2RlIHdpdGggc2VjdXJpdHkgZGF0YSAqLworCQkJX19mczMyCXVpX3VpZDsJCS8qIDB4NzQgbG9uZyBFRlQgdmVyc2lvbiBvZiB1aWQgKi8KKwkJCV9fZnMzMgl1aV9naWQ7CQkvKiAweDc4IGxvbmcgRUZUIHZlcnNpb24gb2YgZ2lkICovCisJCQlfX2ZzMzIJdWlfb2VmdGZsYWc7CS8qIDB4N2MgcmVzZXJ2ZWQgKi8KKwkJfSB1aV9zdW47CisJCXN0cnVjdCB7CisJCQlfX2ZzMzIJdWlfdWlkOwkJLyogMHg3MCBGaWxlIG93bmVyICovCisJCQlfX2ZzMzIJdWlfZ2lkOwkJLyogMHg3NCBGaWxlIGdyb3VwICovCisJCQlfX2ZzMzIJdWlfc3BhcmVbMl07CS8qIDB4NzggcmVzZXJ2ZWQgKi8KKwkJfSB1aV80NDsKKwkJc3RydWN0IHsKKwkJCV9fZnMzMgl1aV91aWQ7CQkvKiAweDcwICovCisJCQlfX2ZzMzIJdWlfZ2lkOwkJLyogMHg3NCAqLworCQkJX19mczE2CXVpX21vZGVoOwkvKiAweDc4IG1vZGUgaGlnaCBiaXRzICovCisJCQlfX2ZzMTYJdWlfc3BhcmU7CS8qIDB4N0EgdW51c2VkICovCisJCQlfX2ZzMzIJdWlfdHJhbnM7CS8qIDB4N2MgZmlsZXN5c3RlbSB0cmFuc2xhdG9yICovCisJCX0gdWlfaHVyZDsKKwl9IHVpX3UzOworfTsKKworI2RlZmluZSBVRlNfTlhBRERSICAyICAgICAgICAgICAgLyogRXh0ZXJuYWwgYWRkcmVzc2VzIGluIGlub2RlLiAqLworc3RydWN0IHVmczJfaW5vZGUgeworCV9fZnMxNiAgICAgdWlfbW9kZTsgICAgICAgIC8qICAgMDogSUZNVCwgcGVybWlzc2lvbnM7IHNlZSBiZWxvdy4gKi8KKwlfX2ZzMTYgICAgIHVpX25saW5rOyAgICAgICAvKiAgIDI6IEZpbGUgbGluayBjb3VudC4gKi8KKwlfX2ZzMzIgICAgIHVpX3VpZDsgICAgICAgICAvKiAgIDQ6IEZpbGUgb3duZXIuICovCisJX19mczMyICAgICB1aV9naWQ7ICAgICAgICAgLyogICA4OiBGaWxlIGdyb3VwLiAqLworCV9fZnMzMiAgICAgdWlfYmxrc2l6ZTsgICAgIC8qICAxMjogSW5vZGUgYmxvY2tzaXplLiAqLworCV9fZnM2NCAgICAgdWlfc2l6ZTsgICAgICAgIC8qICAxNjogRmlsZSBieXRlIGNvdW50LiAqLworCV9fZnM2NCAgICAgdWlfYmxvY2tzOyAgICAgIC8qICAyNDogQnl0ZXMgYWN0dWFsbHkgaGVsZC4gKi8KKwlfX2ZzNjQgICB1aV9hdGltZTsgICAgICAgLyogIDMyOiBMYXN0IGFjY2VzcyB0aW1lLiAqLworCV9fZnM2NCAgIHVpX210aW1lOyAgICAgICAvKiAgNDA6IExhc3QgbW9kaWZpZWQgdGltZS4gKi8KKwlfX2ZzNjQgICB1aV9jdGltZTsgICAgICAgLyogIDQ4OiBMYXN0IGlub2RlIGNoYW5nZSB0aW1lLiAqLworCV9fZnM2NCAgIHVpX2JpcnRodGltZTsgICAvKiAgNTY6IElub2RlIGNyZWF0aW9uIHRpbWUuICovCisJX19mczMyICAgICB1aV9tdGltZW5zZWM7ICAgLyogIDY0OiBMYXN0IG1vZGlmaWVkIHRpbWUuICovCisJX19mczMyICAgICB1aV9hdGltZW5zZWM7ICAgLyogIDY4OiBMYXN0IGFjY2VzcyB0aW1lLiAqLworCV9fZnMzMiAgICAgdWlfY3RpbWVuc2VjOyAgIC8qICA3MjogTGFzdCBpbm9kZSBjaGFuZ2UgdGltZS4gKi8KKwlfX2ZzMzIgICAgIHVpX2JpcnRobnNlYzsgICAvKiAgNzY6IElub2RlIGNyZWF0aW9uIHRpbWUuICovCisJX19mczMyICAgICB1aV9nZW47ICAgICAgICAgLyogIDgwOiBHZW5lcmF0aW9uIG51bWJlci4gKi8KKwlfX2ZzMzIgICAgIHVpX2tlcm5mbGFnczsgICAvKiAgODQ6IEtlcm5lbCBmbGFncy4gKi8KKwlfX2ZzMzIgICAgIHVpX2ZsYWdzOyAgICAgICAvKiAgODg6IFN0YXR1cyBmbGFncyAoY2hmbGFncykuICovCisJX19mczMyICAgICB1aV9leHRzaXplOyAgICAgLyogIDkyOiBFeHRlcm5hbCBhdHRyaWJ1dGVzIGJsb2NrLiAqLworCV9fZnM2NCAgICAgdWlfZXh0YltVRlNfTlhBRERSXTsvKiAgOTY6IEV4dGVybmFsIGF0dHJpYnV0ZXMgYmxvY2suICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX19mczY0ICAgICB1aV9kYltVRlNfTkRBRERSXTsgLyogMTEyOiBEaXJlY3QgZGlzayBibG9ja3MuICovCisJCQlfX2ZzNjQgICAgIHVpX2liW1VGU19OSU5ESVJdOy8qIDIwODogSW5kaXJlY3QgZGlzayBibG9ja3MuKi8KKwkJfSB1aV9hZGRyOworCV9fdTgJdWlfc3ltbGlua1syKjQqKFVGU19OREFERFIrVUZTX05JTkRJUildOy8qIDB4MjggZmFzdCBzeW1saW5rICovCisJfSB1aV91MjsKKwlfX2ZzNjQgICAgIHVpX3NwYXJlWzNdOyAgICAvKiAyMzI6IFJlc2VydmVkOyBjdXJyZW50bHkgdW51c2VkICovCit9OworCisKKy8qIEZyZWVCU0QgaGFzIHRoZXNlIGluIHN5cy9zdGF0LmggKi8KKy8qIHVpX2ZsYWdzIHRoYXQgY2FuIGJlIHNldCBieSBhIGZpbGUgb3duZXIgKi8KKyNkZWZpbmUgVUZTX1VGX1NFVFRBQkxFICAgMHgwMDAwZmZmZgorI2RlZmluZSBVRlNfVUZfTk9EVU1QICAgICAweDAwMDAwMDAxICAvKiBkbyBub3QgZHVtcCAqLworI2RlZmluZSBVRlNfVUZfSU1NVVRBQkxFICAweDAwMDAwMDAyICAvKiBpbW11dGFibGUgKGNhbid0ICJjaGFuZ2UiKSAqLworI2RlZmluZSBVRlNfVUZfQVBQRU5EICAgICAweDAwMDAwMDA0ICAvKiBhcHBlbmQtb25seSAqLworI2RlZmluZSBVRlNfVUZfT1BBUVVFICAgICAweDAwMDAwMDA4ICAvKiBkaXJlY3RvcnkgaXMgb3BhcXVlICh1bmlvbmZzKSAqLworI2RlZmluZSBVRlNfVUZfTk9VTkxJTksgICAweDAwMDAwMDEwICAvKiBjYW4ndCBiZSByZW1vdmVkIG9yIHJlbmFtZWQgKi8KKy8qIHVpX2ZsYWdzIHRoYXQgb25seSByb290IGNhbiBzZXQgKi8KKyNkZWZpbmUgVUZTX1NGX1NFVFRBQkxFICAgMHhmZmZmMDAwMAorI2RlZmluZSBVRlNfU0ZfQVJDSElWRUQgICAweDAwMDEwMDAwICAvKiBhcmNoaXZlZCAqLworI2RlZmluZSBVRlNfU0ZfSU1NVVRBQkxFICAweDAwMDIwMDAwICAvKiBpbW11dGFibGUgKGNhbid0ICJjaGFuZ2UiKSAqLworI2RlZmluZSBVRlNfU0ZfQVBQRU5EICAgICAweDAwMDQwMDAwICAvKiBhcHBlbmQtb25seSAqLworI2RlZmluZSBVRlNfU0ZfTk9VTkxJTksgICAweDAwMTAwMDAwICAvKiBjYW4ndCBiZSByZW1vdmVkIG9yIHJlbmFtZWQgKi8KKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIHJlYWRpbmcgZGlzayBzdHJ1Y3R1cmVzIGxhcmdlcgorICogdGhhbiB0aGUgc2l6ZSBvZiBmcmFnbWVudC4KKyAqLworc3RydWN0IHVmc19idWZmZXJfaGVhZCB7CisJX191NjQgZnJhZ21lbnQ7CQkJLyogZmlyc3QgZnJhZ21lbnQgKi8KKwlfX3U2NCBjb3VudDsJCQkJLyogbnVtYmVyIG9mIGZyYWdtZW50cyAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoW1VGU19NQVhGUkFHXTsJLyogYnVmZmVycyAqLworfTsKKworc3RydWN0IHVmc19jZ19wcml2YXRlX2luZm8geworCXN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgY191Ymg7CisJX191MzIJY19jZ3g7CQkvKiBudW1iZXIgb2YgY3lsaWRuZXIgZ3JvdXAgKi8KKwlfX3UxNgljX25jeWw7CQkvKiBudW1iZXIgb2YgY3lsJ3MgdGhpcyBjZyAqLworCV9fdTE2CWNfbmlibGs7CS8qIG51bWJlciBvZiBpbm9kZSBibG9ja3MgdGhpcyBjZyAqLworCV9fdTMyCWNfbmRibGs7CS8qIG51bWJlciBvZiBkYXRhIGJsb2NrcyB0aGlzIGNnICovCisJX191MzIJY19yb3RvcjsJLyogcG9zaXRpb24gb2YgbGFzdCB1c2VkIGJsb2NrICovCisJX191MzIJY19mcm90b3I7CS8qIHBvc2l0aW9uIG9mIGxhc3QgdXNlZCBmcmFnICovCisJX191MzIJY19pcm90b3I7CS8qIHBvc2l0aW9uIG9mIGxhc3QgdXNlZCBpbm9kZSAqLworCV9fdTMyCWNfYnRvdG9mZjsJLyogKF9fdTMyKSBibG9jayB0b3RhbHMgcGVyIGN5bGluZGVyICovCisJX191MzIJY19ib2ZmOwkJLyogKHNob3J0KSBmcmVlIGJsb2NrIHBvc2l0aW9ucyAqLworCV9fdTMyCWNfaXVzZWRvZmY7CS8qIChjaGFyKSB1c2VkIGlub2RlIG1hcCAqLworCV9fdTMyCWNfZnJlZW9mZjsJLyogKHVfY2hhcikgZnJlZSBibG9jayBtYXAgKi8KKwlfX3UzMgljX25leHRmcmVlb2ZmOwkvKiAodV9jaGFyKSBuZXh0IGF2YWlsYWJsZSBzcGFjZSAqLworCV9fdTMyCWNfY2x1c3RlcnN1bW9mZjsvKiAodV9pbnQzMikgY291bnRzIG9mIGF2YWlsIGNsdXN0ZXJzICovCisJX191MzIJY19jbHVzdGVyb2ZmOwkvKiAodV9pbnQ4KSBmcmVlIGNsdXN0ZXIgbWFwICovCisJX191MzIJY19uY2x1c3RlcmJsa3M7CS8qIG51bWJlciBvZiBjbHVzdGVycyB0aGlzIGNnICovCit9OworCisKK3N0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvIHsKKwlzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkIHNfdWJoOyAvKiBidWZmZXIgY29udGFpbmluZyBzdXBlciBibG9jayAqLworCXN0cnVjdCB1ZnNfY3N1bV9jb3JlIGNzX3RvdGFsOworCV9fdTMyCXNfc2Jsa25vOwkvKiBvZmZzZXQgb2Ygc3VwZXItYmxvY2tzIGluIGZpbGVzeXMgKi8KKwlfX3UzMglzX2NibGtubzsJLyogb2Zmc2V0IG9mIGNnLWJsb2NrIGluIGZpbGVzeXMgKi8KKwlfX3UzMglzX2libGtubzsJLyogb2Zmc2V0IG9mIGlub2RlLWJsb2NrcyBpbiBmaWxlc3lzICovCisJX191MzIJc19kYmxrbm87CS8qIG9mZnNldCBvZiBmaXJzdCBkYXRhIGFmdGVyIGNnICovCisJX191MzIJc19jZ29mZnNldDsJLyogY3lsaW5kZXIgZ3JvdXAgb2Zmc2V0IGluIGN5bGluZGVyICovCisJX191MzIJc19jZ21hc2s7CS8qIHVzZWQgdG8gY2FsYyBtb2QgZnNfbnRyYWsgKi8KKwlfX3UzMglzX3NpemU7CQkvKiBudW1iZXIgb2YgYmxvY2tzIChmcmFnbWVudHMpIGluIGZzICovCisJX191MzIJc19kc2l6ZTsJLyogbnVtYmVyIG9mIGRhdGEgYmxvY2tzIGluIGZzICovCisJX191NjQJc191Ml9zaXplOwkvKiB1ZnMyOiBudW1iZXIgb2YgYmxvY2tzIChmcmFnbWVudHMpIGluIGZzICovCisJX191NjQJc191Ml9kc2l6ZTsJLyp1ZnMyOiAgbnVtYmVyIG9mIGRhdGEgYmxvY2tzIGluIGZzICovCisJX191MzIJc19uY2c7CQkvKiBudW1iZXIgb2YgY3lsaW5kZXIgZ3JvdXBzICovCisJX191MzIJc19ic2l6ZTsJLyogc2l6ZSBvZiBiYXNpYyBibG9ja3MgKi8KKwlfX3UzMglzX2ZzaXplOwkvKiBzaXplIG9mIGZyYWdtZW50cyAqLworCV9fdTMyCXNfZnBiOwkJLyogZnJhZ21lbnRzIHBlciBibG9jayAqLworCV9fdTMyCXNfbWluZnJlZTsJLyogbWluaW11bSBwZXJjZW50YWdlIG9mIGZyZWUgYmxvY2tzICovCisJX191MzIJc19ibWFzazsJLyogYGJsa29mZicnIGNhbGMgb2YgYmxrIG9mZnNldHMgKi8KKwlfX3UzMglzX2ZtYXNrOwkvKiBzX2ZzaXplIG1hc2sgKi8KKwlfX3UzMglzX2JzaGlmdDsJLyogYGxibGtubycnIGNhbGMgb2YgbG9naWNhbCBibGtubyAqLworCV9fdTMyICAgc19mc2hpZnQ7CS8qIHNfZnNpemUgc2hpZnQgKi8KKwlfX3UzMglzX2ZwYnNoaWZ0OwkvKiBmcmFnbWVudHMgcGVyIGJsb2NrIHNoaWZ0ICovCisJX191MzIJc19mc2J0b2RiOwkvKiBmc2J0b2RiIGFuZCBkYnRvZnNiIHNoaWZ0IGNvbnN0YW50ICovCisJX191MzIJc19zYnNpemU7CS8qIGFjdHVhbCBzaXplIG9mIHN1cGVyIGJsb2NrICovCisJX191MzIgICBzX2NzbWFzazsJLyogY3N1bSBibG9jayBvZmZzZXQgKi8KKwlfX3UzMglzX2Nzc2hpZnQ7CS8qIGNzdW0gYmxvY2sgbnVtYmVyICovCisJX191MzIJc19uaW5kaXI7CS8qIHZhbHVlIG9mIE5JTkRJUiAqLworCV9fdTMyCXNfaW5vcGI7CS8qIHZhbHVlIG9mIElOT1BCICovCisJX191MzIJc19uc3BmOwkJLyogdmFsdWUgb2YgTlNQRiAqLworCV9fdTMyCXNfbnBzZWN0OwkvKiAjIHNlY3RvcnMvdHJhY2sgaW5jbHVkaW5nIHNwYXJlcyAqLworCV9fdTMyCXNfaW50ZXJsZWF2ZTsJLyogaGFyZHdhcmUgc2VjdG9yIGludGVybGVhdmUgKi8KKwlfX3UzMglzX3RyYWNrc2tldzsJLyogc2VjdG9yIDAgc2tldywgcGVyIHRyYWNrICovCisJX191NjQJc19jc2FkZHI7CS8qIGJsayBhZGRyIG9mIGN5bCBncnAgc3VtbWFyeSBhcmVhICovCisJX191MzIJc19jc3NpemU7CS8qIHNpemUgb2YgY3lsIGdycCBzdW1tYXJ5IGFyZWEgKi8KKwlfX3UzMglzX2Nnc2l6ZTsJLyogY3lsaW5kZXIgZ3JvdXAgc2l6ZSAqLworCV9fdTMyCXNfbnRyYWs7CS8qIHRyYWNrcyBwZXIgY3lsaW5kZXIgKi8KKwlfX3UzMglzX25zZWN0OwkvKiBzZWN0b3JzIHBlciB0cmFjayAqLworCV9fdTMyCXNfc3BjOwkJLyogc2VjdG9ycyBwZXIgY3lsaW5kZXIgKi8KKwlfX3UzMglzX2lwZzsJCS8qIGlub2RlcyBwZXIgY3lsaW5kZXIgZ3JvdXAgKi8KKwlfX3UzMglzX2ZwZzsJCS8qIGZyYWdtZW50cyBwZXIgZ3JvdXAgKi8KKwlfX3UzMglzX2NwYzsJCS8qIGN5bCBwZXIgY3ljbGUgaW4gcG9zdGJsICovCisJX19zMzIJc19jb250aWdzdW1zaXplOy8qIHNpemUgb2YgY2x1c3RlciBzdW1tYXJ5IGFycmF5LCA0NGJzZCAqLworCV9fczY0CXNfcWJtYXNrOwkvKiB+dXNiX2JtYXNrICovCisJX19zNjQJc19xZm1hc2s7CS8qIH51c2JfZm1hc2sgKi8KKwlfX3MzMglzX3Bvc3RibGZvcm1hdDsJLyogZm9ybWF0IG9mIHBvc2l0aW9uYWwgbGF5b3V0IHRhYmxlcyAqLworCV9fczMyCXNfbnJwb3M7CS8qIG51bWJlciBvZiByb3RhdGlvbmFsIHBvc2l0aW9ucyAqLworICAgICAgICBfX3MzMglzX3Bvc3RibG9mZjsJLyogKF9fczE2KSByb3RhdGlvbiBibG9jayBsaXN0IGhlYWQgKi8KKwlfX3MzMglzX3JvdGJsb2ZmOwkvKiAoX191OCkgYmxvY2tzIGZvciBlYWNoIHJvdGF0aW9uICovCisKKwlfX3UzMglzX2ZwYm1hc2s7CS8qIGZyYWdtZW50cyBwZXIgYmxvY2sgbWFzayAqLworCV9fdTMyCXNfYXBiOwkJLyogYWRkcmVzcyBwZXIgYmxvY2sgKi8KKwlfX3UzMglzXzJhcGI7CQkvKiBhZGRyZXNzIHBlciBibG9ja14yICovCisJX191MzIJc18zYXBiOwkJLyogYWRkcmVzcyBwZXIgYmxvY2teMyAqLworCV9fdTMyCXNfYXBibWFzazsJLyogYWRkcmVzcyBwZXIgYmxvY2sgbWFzayAqLworCV9fdTMyCXNfYXBic2hpZnQ7CS8qIGFkZHJlc3MgcGVyIGJsb2NrIHNoaWZ0ICovCisJX191MzIJc18yYXBic2hpZnQ7CS8qIGFkZHJlc3MgcGVyIGJsb2NrIHNoaWZ0ICogMiAqLworCV9fdTMyCXNfM2FwYnNoaWZ0OwkvKiBhZGRyZXNzIHBlciBibG9jayBzaGlmdCAqIDMgKi8KKwlfX3UzMglzX25zcGZzaGlmdDsJLyogbnVtYmVyIG9mIHNlY3RvciBwZXIgZnJhZ21lbnQgc2hpZnQgKi8KKwlfX3UzMglzX25zcGI7CQkvKiBudW1iZXIgb2Ygc2VjdG9yIHBlciBibG9jayAqLworCV9fdTMyCXNfaW5vcGY7CS8qIGlub2RlcyBwZXIgZnJhZ21lbnQgKi8KKwlfX3UzMglzX3NiYmFzZTsJLyogb2Zmc2V0IG9mIE5lWFRzdGVwIHN1cGVyYmxvY2sgKi8KKwlfX3UzMglzX2JwZjsJCS8qIGJpdHMgcGVyIGZyYWdtZW50ICovCisJX191MzIJc19icGZzaGlmdDsJLyogYml0cyBwZXIgZnJhZ21lbnQgc2hpZnQqLworCV9fdTMyCXNfYnBmbWFzazsJLyogYml0cyBwZXIgZnJhZ21lbnQgbWFzayAqLworCisJX191MzIJc19tYXhzeW1saW5rbGVuOy8qIHVwcGVyIGxpbWl0IG9uIGZhc3Qgc3ltbGlua3MnIHNpemUgKi8KKwlfX3MzMglmc19tYWdpYzsgICAgICAgLyogZmlsZXN5c3RlbSBtYWdpYyAqLworCXVuc2lnbmVkIGludCBzX2RpcmJsa3NpemU7Cit9OworCisvKgorICogU2l6ZXMgb2YgdGhpcyBzdHJ1Y3R1cmVzIGFyZToKKyAqCXVmc19zdXBlcl9ibG9ja19maXJzdAk1MTIKKyAqCXVmc19zdXBlcl9ibG9ja19zZWNvbmQJNTEyCisgKgl1ZnNfc3VwZXJfYmxvY2tfdGhpcmQJMzU2CisgKi8KK3N0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfZmlyc3QgeworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fZnMzMglmc19saW5rOwkvKiBVTlVTRUQgKi8KKwkJfSBmc180MjsKKwkJc3RydWN0IHsKKwkJCV9fZnMzMglmc19zdGF0ZTsJLyogZmlsZSBzeXN0ZW0gc3RhdGUgZmxhZyAqLworCQl9IGZzX3N1bjsKKwl9IGZzX3UwOworCV9fZnMzMglmc19ybGluazsKKwlfX2ZzMzIJZnNfc2Jsa25vOworCV9fZnMzMglmc19jYmxrbm87CisJX19mczMyCWZzX2libGtubzsKKwlfX2ZzMzIJZnNfZGJsa25vOworCV9fZnMzMglmc19jZ29mZnNldDsKKwlfX2ZzMzIJZnNfY2dtYXNrOworCV9fZnMzMglmc190aW1lOworCV9fZnMzMglmc19zaXplOworCV9fZnMzMglmc19kc2l6ZTsKKwlfX2ZzMzIJZnNfbmNnOworCV9fZnMzMglmc19ic2l6ZTsKKwlfX2ZzMzIJZnNfZnNpemU7CisJX19mczMyCWZzX2ZyYWc7CisJX19mczMyCWZzX21pbmZyZWU7CisJX19mczMyCWZzX3JvdGRlbGF5OworCV9fZnMzMglmc19ycHM7CisJX19mczMyCWZzX2JtYXNrOworCV9fZnMzMglmc19mbWFzazsKKwlfX2ZzMzIJZnNfYnNoaWZ0OworCV9fZnMzMglmc19mc2hpZnQ7CisJX19mczMyCWZzX21heGNvbnRpZzsKKwlfX2ZzMzIJZnNfbWF4YnBnOworCV9fZnMzMglmc19mcmFnc2hpZnQ7CisJX19mczMyCWZzX2ZzYnRvZGI7CisJX19mczMyCWZzX3Nic2l6ZTsKKwlfX2ZzMzIJZnNfY3NtYXNrOworCV9fZnMzMglmc19jc3NoaWZ0OworCV9fZnMzMglmc19uaW5kaXI7CisJX19mczMyCWZzX2lub3BiOworCV9fZnMzMglmc19uc3BmOworCV9fZnMzMglmc19vcHRpbTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX2ZzMzIJZnNfbnBzZWN0OworCQl9IGZzX3N1bjsKKwkJc3RydWN0IHsKKwkJCV9fZnMzMglmc19zdGF0ZTsKKwkJfSBmc19zdW54ODY7CisJfSBmc191MTsKKwlfX2ZzMzIJZnNfaW50ZXJsZWF2ZTsKKwlfX2ZzMzIJZnNfdHJhY2tza2V3OworCV9fZnMzMglmc19pZFsyXTsKKwlfX2ZzMzIJZnNfY3NhZGRyOworCV9fZnMzMglmc19jc3NpemU7CisJX19mczMyCWZzX2Nnc2l6ZTsKKwlfX2ZzMzIJZnNfbnRyYWs7CisJX19mczMyCWZzX25zZWN0OworCV9fZnMzMglmc19zcGM7CisJX19mczMyCWZzX25jeWw7CisJX19mczMyCWZzX2NwZzsKKwlfX2ZzMzIJZnNfaXBnOworCV9fZnMzMglmc19mcGc7CisJc3RydWN0IHVmc19jc3VtIGZzX2NzdG90YWw7CisJX19zOAlmc19mbW9kOworCV9fczgJZnNfY2xlYW47CisJX19zOAlmc19yb25seTsKKwlfX3M4CWZzX2ZsYWdzOworCV9fczgJZnNfZnNtbnRbVUZTX01BWE1OVExFTiAtIDIxMl07CisKK307CisKK3N0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfc2Vjb25kIHsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3M4CWZzX2ZzbW50WzIxMl07CisJCQlfX2ZzMzIJZnNfY2dyb3RvcjsKKwkJCV9fZnMzMglmc19jc3BbVUZTX01BWENTQlVGU107CisJCQlfX2ZzMzIJZnNfbWF4Y2x1c3RlcjsKKwkJCV9fZnMzMglmc19jcGM7CisJCQlfX2ZzMTYJZnNfb3Bvc3RibFs4Ml07CisJCX0gZnNfdTE7CisJCXN0cnVjdCB7CisJCQlfX3M4ICBmc19mc21udFtVRlMyX01BWE1OVExFTiAtIFVGU19NQVhNTlRMRU4gKyAyMTJdOworCQkJX191OCAgIGZzX3ZvbG5hbWVbVUZTMl9NQVhWT0xMRU5dOworCQkJX19mczY0ICBmc19zd3VpZDsKKwkJCV9fZnMzMiAgZnNfcGFkOworCQkJX19mczMyICAgZnNfY2dyb3RvcjsKKwkJCV9fZnMzMiAgIGZzX29jc3BbVUZTMl9OT0NTUFRSU107CisJCQlfX2ZzMzIgICBmc19jb250aWdkaXJzOworCQkJX19mczMyICAgZnNfY3NwOworCQkJX19mczMyICAgZnNfbWF4Y2x1c3RlcjsKKwkJCV9fZnMzMiAgIGZzX2FjdGl2ZTsKKwkJCV9fZnMzMiAgIGZzX29sZF9jcGM7CisJCQlfX2ZzMzIgICBmc19tYXhic2l6ZTsKKwkJCV9fZnM2NCAgIGZzX3NwYXJlY29uNjRbMTddOworCQkJX19mczY0ICAgZnNfc2Jsb2NrbG9jOworCQkJX19mczY0CWNzX25kaXI7CisJCQlfX2ZzNjQJY3NfbmJmcmVlOworCQl9IGZzX3UyOworCX0gZnNfdW47Cit9OworCitzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX3RoaXJkIHsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX2ZzMTYJZnNfb3Bvc3RibFs0Nl07CisJCX0gZnNfdTE7CisJCXN0cnVjdCB7CisJCQlfX2ZzNjQJY3NfbmlmcmVlOwkvKiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgKi8KKwkJCV9fZnM2NAljc19uZmZyZWU7CS8qIG51bWJlciBvZiBmcmVlIGZyYWdzICovCisJCQlfX2ZzNjQgICBjc19udW1jbHVzdGVyczsJLyogbnVtYmVyIG9mIGZyZWUgY2x1c3RlcnMgKi8KKwkJCV9fZnM2NCAgIGNzX3NwYXJlWzNdOwkvKiBmdXR1cmUgZXhwYW5zaW9uICovCisJCQlzdHJ1Y3QgIHVmc190aW1ldmFsICAgIGZzX3RpbWU7CQkvKiBsYXN0IHRpbWUgd3JpdHRlbiAqLworCQkJX19mczY0ICAgIGZzX3NpemU7CQkvKiBudW1iZXIgb2YgYmxvY2tzIGluIGZzICovCisJCQlfX2ZzNjQgICAgZnNfZHNpemU7CS8qIG51bWJlciBvZiBkYXRhIGJsb2NrcyBpbiBmcyAqLworCQkJX19mczY0ICAgZnNfY3NhZGRyOwkvKiBibGsgYWRkciBvZiBjeWwgZ3JwIHN1bW1hcnkgYXJlYSAqLworCQkJX19mczY0ICAgIGZzX3BlbmRpbmdibG9ja3M7LyogYmxvY2tzIGluIHByb2Nlc3Mgb2YgYmVpbmcgZnJlZWQgKi8KKwkJCV9fZnMzMiAgICBmc19wZW5kaW5naW5vZGVzOy8qaW5vZGVzIGluIHByb2Nlc3Mgb2YgYmVpbmcgZnJlZWQgKi8KKwkJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZnNfdTI7CisJfSBmc191bjE7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX19mczMyCWZzX3NwYXJlY29uWzUzXTsvKiByZXNlcnZlZCBmb3IgZnV0dXJlIGNvbnN0YW50cyAqLworCQkJX19mczMyCWZzX3JlY2xhaW07CisJCQlfX2ZzMzIJZnNfc3BhcmVjb24yWzFdOworCQkJX19mczMyCWZzX3N0YXRlOwkvKiBmaWxlIHN5c3RlbSBzdGF0ZSB0aW1lIHN0YW1wICovCisJCQlfX2ZzMzIJZnNfcWJtYXNrWzJdOwkvKiB+dXNiX2JtYXNrICovCisJCQlfX2ZzMzIJZnNfcWZtYXNrWzJdOwkvKiB+dXNiX2ZtYXNrICovCisJCX0gZnNfc3VuOworCQlzdHJ1Y3QgeworCQkJX19mczMyCWZzX3NwYXJlY29uWzUzXTsvKiByZXNlcnZlZCBmb3IgZnV0dXJlIGNvbnN0YW50cyAqLworCQkJX19mczMyCWZzX3JlY2xhaW07CisJCQlfX2ZzMzIJZnNfc3BhcmVjb24yWzFdOworCQkJX19mczMyCWZzX25wc2VjdDsJLyogIyBzZWN0b3JzL3RyYWNrIGluY2x1ZGluZyBzcGFyZXMgKi8KKwkJCV9fZnMzMglmc19xYm1hc2tbMl07CS8qIH51c2JfYm1hc2sgKi8KKwkJCV9fZnMzMglmc19xZm1hc2tbMl07CS8qIH51c2JfZm1hc2sgKi8KKwkJfSBmc19zdW54ODY7CisJCXN0cnVjdCB7CisJCQlfX2ZzMzIJZnNfc3BhcmVjb25bNTBdOy8qIHJlc2VydmVkIGZvciBmdXR1cmUgY29uc3RhbnRzICovCisJCQlfX2ZzMzIJZnNfY29udGlnc3Vtc2l6ZTsvKiBzaXplIG9mIGNsdXN0ZXIgc3VtbWFyeSBhcnJheSAqLworCQkJX19mczMyCWZzX21heHN5bWxpbmtsZW47LyogbWF4IGxlbmd0aCBvZiBhbiBpbnRlcm5hbCBzeW1saW5rICovCisJCQlfX2ZzMzIJZnNfaW5vZGVmbXQ7CS8qIGZvcm1hdCBvZiBvbi1kaXNrIGlub2RlcyAqLworCQkJX19mczMyCWZzX21heGZpbGVzaXplWzJdOwkvKiBtYXggcmVwcmVzZW50YWJsZSBmaWxlIHNpemUgKi8KKwkJCV9fZnMzMglmc19xYm1hc2tbMl07CS8qIH51c2JfYm1hc2sgKi8KKwkJCV9fZnMzMglmc19xZm1hc2tbMl07CS8qIH51c2JfZm1hc2sgKi8KKwkJCV9fZnMzMglmc19zdGF0ZTsJLyogZmlsZSBzeXN0ZW0gc3RhdGUgdGltZSBzdGFtcCAqLworCQl9IGZzXzQ0OworCX0gZnNfdW4yOworCV9fZnMzMglmc19wb3N0Ymxmb3JtYXQ7CisJX19mczMyCWZzX25ycG9zOworCV9fZnMzMglmc19wb3N0YmxvZmY7CisJX19mczMyCWZzX3JvdGJsb2ZmOworCV9fZnMzMglmc19tYWdpYzsKKwlfX3U4CWZzX3NwYWNlWzFdOworfTsKKworI2VuZGlmIC8qIF9fTElOVVhfVUZTX0ZTX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL3Vmcy91dGlsLmMgYi9mcy91ZnMvdXRpbC5jCmluZGV4IDQxMDA4NGQuLjg1YTdmYzkgMTAwNjQ0Ci0tLSBhL2ZzL3Vmcy91dGlsLmMKKysrIGIvZnMvdWZzL3V0aWwuYwpAQCAtOCw5ICs4LDkgQEAKICAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdWZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KIAorI2luY2x1ZGUgInVmc19mcy5oIgogI2luY2x1ZGUgInVmcy5oIgogI2luY2x1ZGUgInN3YWIuaCIKICNpbmNsdWRlICJ1dGlsLmgiCmRpZmYgLS1naXQgYS9mcy92ZmF0L25hbWVpLmMgYi9mcy92ZmF0L25hbWVpLmMKaW5kZXggYzI4YWRkMi4uY2Q0NTBiZSAxMDA2NDQKLS0tIGEvZnMvdmZhdC9uYW1laS5jCisrKyBiL2ZzL3ZmYXQvbmFtZWkuYwpAQCAtNzA1LDcgKzcwNSw3IEBACiAJYnJlbHNlKHNpbmZvLmJoKTsKIAlpZiAoSVNfRVJSKGlub2RlKSkgewogCQl1bmxvY2tfa2VybmVsKCk7Ci0JCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoaW5vZGUpKTsKKwkJcmV0dXJuIEVSUl9DQVNUKGlub2RlKTsKIAl9CiAJYWxpYXMgPSBkX2ZpbmRfYWxpYXMoaW5vZGUpOwogCWlmIChhbGlhcykgewpkaWZmIC0tZ2l0IGEvZnMveGZzL01ha2VmaWxlLWxpbnV4LTIuNiBiL2ZzL3hmcy9NYWtlZmlsZS1saW51eC0yLjYKaW5kZXggZDE0OTFhYS4uOTczMTY0NSAxMDA2NDQKLS0tIGEvZnMveGZzL01ha2VmaWxlLWxpbnV4LTIuNgorKysgYi9mcy94ZnMvTWFrZWZpbGUtbGludXgtMi42CkBAIC03MCw3ICs3MCw2IEBACiAJCQkJICAgeGZzX2lnZXQubyBcCiAJCQkJICAgeGZzX2lub2RlLm8gXAogCQkJCSAgIHhmc19pbm9kZV9pdGVtLm8gXAotCQkJCSAgIHhmc19pb2NvcmUubyBcCiAJCQkJICAgeGZzX2lvbWFwLm8gXAogCQkJCSAgIHhmc19pdGFibGUubyBcCiAJCQkJICAgeGZzX2RmcmFnLm8gXApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi9zcGluLmggYi9mcy94ZnMvbGludXgtMi42L3NwaW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhNjE5MS4uMDAwMDAwMAotLS0gYS9mcy94ZnMvbGludXgtMi42L3NwaW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiwyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCi0gKi8KLSNpZm5kZWYgX19YRlNfU1VQUE9SVF9TUElOX0hfXwotI2RlZmluZSBfX1hGU19TVVBQT1JUX1NQSU5fSF9fCi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgkvKiBwcmVlbXB0IG5lZWRzIHRoaXMgKi8KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotCi0vKgotICogTWFwIGxvY2tfdCBmcm9tIElSSVggdG8gTGludXggc3BpbmxvY2tzLgotICoKLSAqIFdlIGRvIG5vdCBtYWtlIHVzZSBvZiBsb2NrX3QgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCwgc28gd2UgZG8gbm90Ci0gKiBoYXZlIHRvIHdvcnJ5IGFib3V0IGRpc2FibGluZyBpbnRlcnJ1cHRzIGF0IGFsbCAodW5saWtlIElSSVgpLgotICovCi0KLXR5cGVkZWYgc3BpbmxvY2tfdCBsb2NrX3Q7Ci0KLSNkZWZpbmUgU1BMREVDTChzKQkJCXVuc2lnbmVkIGxvbmcgcwotI2lmbmRlZiBERUZJTkVfU1BJTkxPQ0sKLSNkZWZpbmUgREVGSU5FX1NQSU5MT0NLKHMpCQlzcGlubG9ja190IHMgPSBTUElOX0xPQ0tfVU5MT0NLRUQKLSNlbmRpZgotCi0jZGVmaW5lIHNwaW5sb2NrX2luaXQobG9jaywgbmFtZSkJc3Bpbl9sb2NrX2luaXQobG9jaykKLSNkZWZpbmUJc3BpbmxvY2tfZGVzdHJveShsb2NrKQotI2RlZmluZSBtdXRleF9zcGlubG9jayhsb2NrKQkJKHsgc3Bpbl9sb2NrKGxvY2spOyAwOyB9KQotI2RlZmluZSBtdXRleF9zcGludW5sb2NrKGxvY2ssIHMpCWRvIHsgc3Bpbl91bmxvY2sobG9jayk7ICh2b2lkKXM7IH0gd2hpbGUgKDApCi0jZGVmaW5lIG5lc3RlZF9zcGlubG9jayhsb2NrKQkJc3Bpbl9sb2NrKGxvY2spCi0jZGVmaW5lIG5lc3RlZF9zcGludW5sb2NrKGxvY2spCQlzcGluX3VubG9jayhsb2NrKQotCi0jZW5kaWYgLyogX19YRlNfU1VQUE9SVF9TUElOX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jCmluZGV4IDJlMzRiMTAuLmUwNTE5NTIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMKQEAgLTEwNyw2ICsxMDcsMTggQEAKICNkZWZpbmUgeGZzX3BhZ2VfdHJhY2UodGFnLCBpbm9kZSwgcGFnZSwgcGdvZmYpCiAjZW5kaWYKIAorU1RBVElDIHN0cnVjdCBibG9ja19kZXZpY2UgKgoreGZzX2ZpbmRfYmRldl9mb3JfaW5vZGUoCisJc3RydWN0IHhmc19pbm9kZQkqaXApCit7CisJc3RydWN0IHhmc19tb3VudAkqbXAgPSBpcC0+aV9tb3VudDsKKworCWlmIChYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApKQorCQlyZXR1cm4gbXAtPm1fcnRkZXZfdGFyZ3AtPmJ0X2JkZXY7CisJZWxzZQorCQlyZXR1cm4gbXAtPm1fZGRldl90YXJncC0+YnRfYmRldjsKK30KKwogLyoKICAqIFNjaGVkdWxlIElPIGNvbXBsZXRpb24gaGFuZGxpbmcgb24gYSB4ZnNkYXRhZCBpZiB0aGlzIHdhcwogICogdGhlIGZpbmFsIGhvbGQgb24gdGhpcyBpb2VuZC4gSWYgd2UgYXJlIGFza2VkIHRvIHdhaXQsCkBAIC0xNTEsNyArMTYzLDcgQEAKIC8qCiAgKiBVcGRhdGUgb24tZGlzayBmaWxlIHNpemUgbm93IHRoYXQgZGF0YSBoYXMgYmVlbiB3cml0dGVuIHRvIGRpc2suCiAgKiBUaGUgY3VycmVudCBpbi1tZW1vcnkgZmlsZSBzaXplIGlzIGlfc2l6ZS4gIElmIGEgd3JpdGUgaXMgYmV5b25kCi0gKiBlb2YgaW9fbmV3X3NpemUgd2lsbCBiZSB0aGUgaW50ZW5kZWQgZmlsZSBzaXplIHVudGlsIGlfc2l6ZSBpcworICogZW9mIGlfbmV3X3NpemUgd2lsbCBiZSB0aGUgaW50ZW5kZWQgZmlsZSBzaXplIHVudGlsIGlfc2l6ZSBpcwogICogdXBkYXRlZC4gIElmIHRoaXMgd3JpdGUgZG9lcyBub3QgZXh0ZW5kIGFsbCB0aGUgd2F5IHRvIHRoZSB2YWxpZAogICogZmlsZSBzaXplIHRoZW4gcmVzdHJpY3QgdGhpcyB1cGRhdGUgdG8gdGhlIGVuZCBvZiB0aGUgd3JpdGUuCiAgKi8KQEAgLTE3Myw3ICsxODUsNyBAQAogCiAJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAKLQlpc2l6ZSA9IE1BWChpcC0+aV9zaXplLCBpcC0+aV9pb2NvcmUuaW9fbmV3X3NpemUpOworCWlzaXplID0gTUFYKGlwLT5pX3NpemUsIGlwLT5pX25ld19zaXplKTsKIAlpc2l6ZSA9IE1JTihpc2l6ZSwgYnNpemUpOwogCiAJaWYgKGlwLT5pX2QuZGlfc2l6ZSA8IGlzaXplKSB7CkBAIC0yMjYsMTIgKzIzOCwxMyBAQAogewogCXhmc19pb2VuZF90CQkqaW9lbmQgPQogCQljb250YWluZXJfb2Yod29yaywgeGZzX2lvZW5kX3QsIGlvX3dvcmspOworCXN0cnVjdCB4ZnNfaW5vZGUJKmlwID0gWEZTX0koaW9lbmQtPmlvX2lub2RlKTsKIAl4ZnNfb2ZmX3QJCW9mZnNldCA9IGlvZW5kLT5pb19vZmZzZXQ7CiAJc2l6ZV90CQkJc2l6ZSA9IGlvZW5kLT5pb19zaXplOwogCiAJaWYgKGxpa2VseSghaW9lbmQtPmlvX2Vycm9yKSkgewotCQl4ZnNfYm1hcChYRlNfSShpb2VuZC0+aW9faW5vZGUpLCBvZmZzZXQsIHNpemUsCi0JCQkJQk1BUElfVU5XUklUVEVOLCBOVUxMLCBOVUxMKTsKKwkJaWYgKCFYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSkKKwkJCXhmc19pb21hcF93cml0ZV91bndyaXR0ZW4oaXAsIG9mZnNldCwgc2l6ZSk7CiAJCXhmc19zZXRmaWxlc2l6ZShpb2VuZCk7CiAJfQogCXhmc19kZXN0cm95X2lvZW5kKGlvZW5kKTsKQEAgLTMwNCw3ICszMTcsNyBAQAogCXhmc19pbm9kZV90CQkqaXAgPSBYRlNfSShpbm9kZSk7CiAJaW50CQkJZXJyb3IsIG5tYXBzID0gMTsKIAotCWVycm9yID0geGZzX2JtYXAoaXAsIG9mZnNldCwgY291bnQsCisJZXJyb3IgPSB4ZnNfaW9tYXAoaXAsIG9mZnNldCwgY291bnQsCiAJCQkJZmxhZ3MsIG1hcHAsICZubWFwcyk7CiAJaWYgKCFlcnJvciAmJiAoZmxhZ3MgJiAoQk1BUElfV1JJVEV8Qk1BUElfQUxMT0NBVEUpKSkKIAkJeGZzX2lmbGFnc19zZXQoaXAsIFhGU19JTU9ESUZJRUQpOwpAQCAtMTMyMyw3ICsxMzM2LDcgQEAKIAlvZmZzZXQgPSAoeGZzX29mZl90KWlibG9jayA8PCBpbm9kZS0+aV9ibGtiaXRzOwogCUFTU0VSVChiaF9yZXN1bHQtPmJfc2l6ZSA+PSAoMSA8PCBpbm9kZS0+aV9ibGtiaXRzKSk7CiAJc2l6ZSA9IGJoX3Jlc3VsdC0+Yl9zaXplOwotCWVycm9yID0geGZzX2JtYXAoWEZTX0koaW5vZGUpLCBvZmZzZXQsIHNpemUsCisJZXJyb3IgPSB4ZnNfaW9tYXAoWEZTX0koaW5vZGUpLCBvZmZzZXQsIHNpemUsCiAJCQkgICAgIGNyZWF0ZSA/IGZsYWdzIDogQk1BUElfUkVBRCwgJmlvbWFwLCAmbmlvbWFwKTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiAtZXJyb3I7CkBAIC0xNDcxLDI4ICsxNDg0LDIxIEBACiB7CiAJc3RydWN0IGZpbGUJKmZpbGUgPSBpb2NiLT5raV9maWxwOwogCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7Ci0JeGZzX2lvbWFwX3QJaW9tYXA7Ci0JaW50CQltYXBzID0gMTsKLQlpbnQJCWVycm9yOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiAJc3NpemVfdAkJcmV0OwogCi0JZXJyb3IgPSB4ZnNfYm1hcChYRlNfSShpbm9kZSksIG9mZnNldCwgMCwKLQkJCQlCTUFQSV9ERVZJQ0UsICZpb21hcCwgJm1hcHMpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIC1lcnJvcjsKKwliZGV2ID0geGZzX2ZpbmRfYmRldl9mb3JfaW5vZGUoWEZTX0koaW5vZGUpKTsKIAogCWlmIChydyA9PSBXUklURSkgewogCQlpb2NiLT5wcml2YXRlID0geGZzX2FsbG9jX2lvZW5kKGlub2RlLCBJT01BUF9VTldSSVRURU4pOwogCQlyZXQgPSBibG9ja2Rldl9kaXJlY3RfSU9fb3duX2xvY2tpbmcocncsIGlvY2IsIGlub2RlLAotCQkJaW9tYXAuaW9tYXBfdGFyZ2V0LT5idF9iZGV2LAotCQkJaW92LCBvZmZzZXQsIG5yX3NlZ3MsCisJCQliZGV2LCBpb3YsIG9mZnNldCwgbnJfc2VncywKIAkJCXhmc19nZXRfYmxvY2tzX2RpcmVjdCwKIAkJCXhmc19lbmRfaW9fZGlyZWN0KTsKIAl9IGVsc2UgewogCQlpb2NiLT5wcml2YXRlID0geGZzX2FsbG9jX2lvZW5kKGlub2RlLCBJT01BUF9SRUFEKTsKIAkJcmV0ID0gYmxvY2tkZXZfZGlyZWN0X0lPX25vX2xvY2tpbmcocncsIGlvY2IsIGlub2RlLAotCQkJaW9tYXAuaW9tYXBfdGFyZ2V0LT5idF9iZGV2LAotCQkJaW92LCBvZmZzZXQsIG5yX3NlZ3MsCisJCQliZGV2LCBpb3YsIG9mZnNldCwgbnJfc2VncywKIAkJCXhmc19nZXRfYmxvY2tzX2RpcmVjdCwKIAkJCXhmc19lbmRfaW9fZGlyZWN0KTsKIAl9CkBAIC0xNTI1LDggKzE1MzEsNyBAQAogCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gKHN0cnVjdCBpbm9kZSAqKW1hcHBpbmctPmhvc3Q7CiAJc3RydWN0IHhmc19pbm9kZQkqaXAgPSBYRlNfSShpbm9kZSk7CiAKLQl2bl90cmFjZV9lbnRyeShYRlNfSShpbm9kZSksIF9fRlVOQ1RJT05fXywKLQkJCShpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKwl4ZnNfaXRyYWNlX2VudHJ5KFhGU19JKGlub2RlKSk7CiAJeGZzX3J3bG9jayhpcCwgVlJXTE9DS19SRUFEKTsKIAl4ZnNfZmx1c2hfcGFnZXMoaXAsICh4ZnNfb2ZmX3QpMCwgLTEsIDAsIEZJX1JFTUFQRik7CiAJeGZzX3J3dW5sb2NrKGlwLCBWUldMT0NLX1JFQUQpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYwppbmRleCAwMzgyYzE5Li5lMzQ3YmZkIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYwpAQCAtMzg3LDggKzM4Nyw2IEBACiAJCWlmICh1bmxpa2VseShwYWdlID09IE5VTEwpKSB7CiAJCQlpZiAoZmxhZ3MgJiBYQkZfUkVBRF9BSEVBRCkgewogCQkJCWJwLT5iX3BhZ2VfY291bnQgPSBpOwotCQkJCWZvciAoaSA9IDA7IGkgPCBicC0+Yl9wYWdlX2NvdW50OyBpKyspCi0JCQkJCXVubG9ja19wYWdlKGJwLT5iX3BhZ2VzW2ldKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIApAQCAtNDE4LDI0ICs0MTYsMTcgQEAKIAkJQVNTRVJUKCFQYWdlUHJpdmF0ZShwYWdlKSk7CiAJCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CiAJCQlwYWdlX2NvdW50LS07Ci0JCQlpZiAoYmxvY2tzaXplID49IFBBR0VfQ0FDSEVfU0laRSkgewotCQkJCWlmIChmbGFncyAmIFhCRl9SRUFEKQotCQkJCQlicC0+Yl9sb2NrZWQgPSAxOwotCQkJfSBlbHNlIGlmICghUGFnZVByaXZhdGUocGFnZSkpIHsKKwkJCWlmIChibG9ja3NpemUgPCBQQUdFX0NBQ0hFX1NJWkUgJiYgIVBhZ2VQcml2YXRlKHBhZ2UpKSB7CiAJCQkJaWYgKHRlc3RfcGFnZV9yZWdpb24ocGFnZSwgb2Zmc2V0LCBuYnl0ZXMpKQogCQkJCQlwYWdlX2NvdW50Kys7CiAJCQl9CiAJCX0KIAorCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJYnAtPmJfcGFnZXNbaV0gPSBwYWdlOwogCQlvZmZzZXQgPSAwOwogCX0KIAotCWlmICghYnAtPmJfbG9ja2VkKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBicC0+Yl9wYWdlX2NvdW50OyBpKyspCi0JCQl1bmxvY2tfcGFnZShicC0+Yl9wYWdlc1tpXSk7Ci0JfQotCiAJaWYgKHBhZ2VfY291bnQgPT0gYnAtPmJfcGFnZV9jb3VudCkKIAkJYnAtPmJfZmxhZ3MgfD0gWEJGX0RPTkU7CiAKQEAgLTc1MSw3ICs3NDIsNiBAQAogCQlicC0+Yl9wYWdlc1tpXSA9IG1lbV90b19wYWdlKCh2b2lkICopcGFnZWFkZHIpOwogCQlwYWdlYWRkciArPSBQQUdFX0NBQ0hFX1NJWkU7CiAJfQotCWJwLT5iX2xvY2tlZCA9IDA7CiAKIAlicC0+Yl9jb3VudF9kZXNpcmVkID0gbGVuOwogCWJwLT5iX2J1ZmZlcl9sZW5ndGggPSBidWZsZW47CkBAIC0xMDk4LDI1ICsxMDg4LDEzIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotU1RBVElDX0lOTElORSBpbnQKLV94ZnNfYnVmX2lvbG9ja2VkKAotCXhmc19idWZfdAkJKmJwKQotewotCUFTU0VSVChicC0+Yl9mbGFncyAmIChYQkZfUkVBRCB8IFhCRl9XUklURSkpOwotCWlmIChicC0+Yl9mbGFncyAmIFhCRl9SRUFEKQotCQlyZXR1cm4gYnAtPmJfbG9ja2VkOwotCXJldHVybiAwOwotfQotCiBTVEFUSUNfSU5MSU5FIHZvaWQKIF94ZnNfYnVmX2lvZW5kKAogCXhmc19idWZfdAkJKmJwLAogCWludAkJCXNjaGVkdWxlKQogewotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZicC0+Yl9pb19yZW1haW5pbmcpID09IDEpIHsKLQkJYnAtPmJfbG9ja2VkID0gMDsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYnAtPmJfaW9fcmVtYWluaW5nKSA9PSAxKQogCQl4ZnNfYnVmX2lvZW5kKGJwLCBzY2hlZHVsZSk7Ci0JfQogfQogCiBTVEFUSUMgdm9pZApAQCAtMTE0NywxMCArMTEyNSw2IEBACiAKIAkJaWYgKC0tYnZlYyA+PSBiaW8tPmJpX2lvX3ZlYykKIAkJCXByZWZldGNodygmYnZlYy0+YnZfcGFnZS0+ZmxhZ3MpOwotCi0JCWlmIChfeGZzX2J1Zl9pb2xvY2tlZChicCkpIHsKLQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQl9CiAJfSB3aGlsZSAoYnZlYyA+PSBiaW8tPmJpX2lvX3ZlYyk7CiAKIAlfeGZzX2J1Zl9pb2VuZChicCwgMSk7CkBAIC0xMTYxLDEzICsxMTM1LDEyIEBACiBfeGZzX2J1Zl9pb2FwcGx5KAogCXhmc19idWZfdAkJKmJwKQogewotCWludAkJCWksIHJ3LCBtYXBfaSwgdG90YWxfbnJfcGFnZXMsIG5yX3BhZ2VzOworCWludAkJCXJ3LCBtYXBfaSwgdG90YWxfbnJfcGFnZXMsIG5yX3BhZ2VzOwogCXN0cnVjdCBiaW8JCSpiaW87CiAJaW50CQkJb2Zmc2V0ID0gYnAtPmJfb2Zmc2V0OwogCWludAkJCXNpemUgPSBicC0+Yl9jb3VudF9kZXNpcmVkOwogCXNlY3Rvcl90CQlzZWN0b3IgPSBicC0+Yl9ibjsKIAl1bnNpZ25lZCBpbnQJCWJsb2Nrc2l6ZSA9IGJwLT5iX3RhcmdldC0+YnRfYnNpemU7Ci0JaW50CQkJbG9ja2luZyA9IF94ZnNfYnVmX2lvbG9ja2VkKGJwKTsKIAogCXRvdGFsX25yX3BhZ2VzID0gYnAtPmJfcGFnZV9jb3VudDsKIAltYXBfaSA9IDA7CkBAIC0xMTkwLDcgKzExNjMsNyBAQAogCSAqIGZpbGVzeXN0ZW0gYmxvY2sgc2l6ZSBpcyBub3Qgc21hbGxlciB0aGFuIHRoZSBwYWdlIHNpemUuCiAJICovCiAJaWYgKChicC0+Yl9idWZmZXJfbGVuZ3RoIDwgUEFHRV9DQUNIRV9TSVpFKSAmJgotCSAgICAoYnAtPmJfZmxhZ3MgJiBYQkZfUkVBRCkgJiYgbG9ja2luZyAmJgorCSAgICAoYnAtPmJfZmxhZ3MgJiBYQkZfUkVBRCkgJiYKIAkgICAgKGJsb2Nrc2l6ZSA+PSBQQUdFX0NBQ0hFX1NJWkUpKSB7CiAJCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9JTywgMSk7CiAKQEAgLTEyMDcsMjQgKzExODAsNiBAQAogCQlnb3RvIHN1Ym1pdF9pbzsKIAl9CiAKLQkvKiBMb2NrIGRvd24gdGhlIHBhZ2VzIHdoaWNoIHdlIG5lZWQgdG8gZm9yIHRoZSByZXF1ZXN0ICovCi0JaWYgKGxvY2tpbmcgJiYgKGJwLT5iX2ZsYWdzICYgWEJGX1dSSVRFKSAmJiAoYnAtPmJfbG9ja2VkID09IDApKSB7Ci0JCWZvciAoaSA9IDA7IHNpemU7IGkrKykgewotCQkJaW50CQluYnl0ZXMgPSBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQ7Ci0JCQlzdHJ1Y3QgcGFnZQkqcGFnZSA9IGJwLT5iX3BhZ2VzW2ldOwotCi0JCQlpZiAobmJ5dGVzID4gc2l6ZSkKLQkJCQluYnl0ZXMgPSBzaXplOwotCi0JCQlsb2NrX3BhZ2UocGFnZSk7Ci0KLQkJCXNpemUgLT0gbmJ5dGVzOwotCQkJb2Zmc2V0ID0gMDsKLQkJfQotCQlvZmZzZXQgPSBicC0+Yl9vZmZzZXQ7Ci0JCXNpemUgPSBicC0+Yl9jb3VudF9kZXNpcmVkOwotCX0KLQogbmV4dF9jaHVuazoKIAlhdG9taWNfaW5jKCZicC0+Yl9pb19yZW1haW5pbmcpOwogCW5yX3BhZ2VzID0gQklPX01BWF9TRUNUT1JTID4+IChQQUdFX1NISUZUIC0gQkJTSElGVCk7CkBAIC0xNTcxLDcgKzE1MjYsNyBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJmJ0cC0+YnRfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmJ0cC0+YnRfZGVsd3JpdGVfcXVldWUpOwotCXNwaW5sb2NrX2luaXQoJmJ0cC0+YnRfZGVsd3JpdGVfbG9jaywgImRlbHdyaV9sb2NrIik7CisJc3Bpbl9sb2NrX2luaXQoJmJ0cC0+YnRfZGVsd3JpdGVfbG9jayk7CiAJYnRwLT5idF9mbGFncyA9IDA7CiAJYnRwLT5idF90YXNrID0ga3RocmVhZF9ydW4oeGZzYnVmZCwgYnRwLCAieGZzYnVmZCIpOwogCWlmIChJU19FUlIoYnRwLT5idF90YXNrKSkgewpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuaAppbmRleCBiNTkwOGEzLi5hM2QyMDdkIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19idWYuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuaApAQCAtMTQzLDcgKzE0Myw2IEBACiAJdm9pZAkJCSpiX2ZzcHJpdjI7CiAJdm9pZAkJCSpiX2ZzcHJpdjM7CiAJdW5zaWduZWQgc2hvcnQJCWJfZXJyb3I7CS8qIGVycm9yIGNvZGUgb24gSS9PICovCi0JdW5zaWduZWQgc2hvcnQJCWJfbG9ja2VkOwkvKiBwYWdlIGFycmF5IGlzIGxvY2tlZCAqLwogCXVuc2lnbmVkIGludAkJYl9wYWdlX2NvdW50OwkvKiBzaXplIG9mIHBhZ2UgYXJyYXkgKi8KIAl1bnNpZ25lZCBpbnQJCWJfb2Zmc2V0OwkvKiBwYWdlIG9mZnNldCBpbiBmaXJzdCBwYWdlICovCiAJc3RydWN0IHBhZ2UJCSoqYl9wYWdlczsJLyogYXJyYXkgb2YgcGFnZSBwb2ludGVycyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZXhwb3J0LmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19leHBvcnQuYwppbmRleCAxNWJkNDk0Li5jYTRmNjZjIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19leHBvcnQuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19leHBvcnQuYwpAQCAtMTE4LDIwICsxMTgsMjkgQEAKIAl1NjQJCQlpbm8sCiAJdTMyCQkJZ2VuZXJhdGlvbikKICB7Ci0JeGZzX2ZpZF90CQl4ZmlkOwotCWJodl92bm9kZV90CQkqdnA7CisgCXhmc19tb3VudF90CQkqbXAgPSBYRlNfTShzYik7CisJeGZzX2lub2RlX3QJCSppcDsKIAlpbnQJCQllcnJvcjsKIAotCXhmaWQuZmlkX2xlbiA9IHNpemVvZih4ZnNfZmlkX3QpIC0gc2l6ZW9mKHhmaWQuZmlkX2xlbik7Ci0JeGZpZC5maWRfcGFkID0gMDsKLQl4ZmlkLmZpZF9pbm8gPSBpbm87Ci0JeGZpZC5maWRfZ2VuID0gZ2VuZXJhdGlvbjsKKwkvKgorCSAqIE5GUyBjYW4gc29tZXRpbWVzIHNlbmQgcmVxdWVzdHMgZm9yIGlubyAwLiAgRmFpbCB0aGVtIGdyYWNlZnVsbHkuCisJICovCisJaWYgKGlubyA9PSAwKQorCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKIAotCWVycm9yID0geGZzX3ZnZXQoWEZTX00oc2IpLCAmdnAsICZ4ZmlkKTsKKwllcnJvciA9IHhmc19pZ2V0KG1wLCBOVUxMLCBpbm8sIDAsIFhGU19JTE9DS19TSEFSRUQsICZpcCwgMCk7CiAJaWYgKGVycm9yKQogCQlyZXR1cm4gRVJSX1BUUigtZXJyb3IpOworCWlmICghaXApCisJCXJldHVybiBFUlJfUFRSKC1FSU8pOwogCi0JcmV0dXJuIHZwID8gdm5fdG9faW5vZGUodnApIDogTlVMTDsKKwlpZiAoIWlwLT5pX2QuZGlfbW9kZSB8fCBpcC0+aV9kLmRpX2dlbiAhPSBnZW5lcmF0aW9uKSB7CisJCXhmc19pcHV0X25ldyhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCX0KKworCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwlyZXR1cm4gaXAtPmlfdm5vZGU7CiB9CiAKIFNUQVRJQyBzdHJ1Y3QgZGVudHJ5ICoKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYwppbmRleCAyMWExYzJiLi5lZGFiMWZmIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19maWxlLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jCkBAIC0zNTAsOCArMzUwLDggQEAKIAogCQlzaXplID0gYnVmLnVzZWQ7CiAJCWRlID0gKHN0cnVjdCBoYWNrX2RpcmVudCAqKWJ1Zi5kaXJlbnQ7Ci0JCWN1cnJfb2Zmc2V0ID0gZGUtPm9mZnNldCAvKiAmIDB4N2ZmZmZmZmYgKi87CiAJCXdoaWxlIChzaXplID4gMCkgeworCQkJY3Vycl9vZmZzZXQgPSBkZS0+b2Zmc2V0IC8qICYgMHg3ZmZmZmZmZiAqLzsKIAkJCWlmIChmaWxsZGlyKGRpcmVudCwgZGUtPm5hbWUsIGRlLT5uYW1sZW4sCiAJCQkJCWN1cnJfb2Zmc2V0ICYgMHg3ZmZmZmZmZiwKIAkJCQkJZGUtPmlubywgZGUtPmRfdHlwZSkpIHsKQEAgLTM2Miw3ICszNjIsNiBAQAogCQkJCSAgICAgICBzaXplb2YodTY0KSk7CiAJCQlzaXplIC09IHJlY2xlbjsKIAkJCWRlID0gKHN0cnVjdCBoYWNrX2RpcmVudCAqKSgoY2hhciAqKWRlICsgcmVjbGVuKTsKLQkJCWN1cnJfb2Zmc2V0ID0gZGUtPm9mZnNldCAvKiAmIDB4N2ZmZmZmZmYgKi87CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2dsb2JhbHMuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2dsb2JhbHMuYwppbmRleCA5ZmViZjlkLi5lZjkwZTY0IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19nbG9iYWxzLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZ2xvYmFscy5jCkBAIC00Nyw1ICs0Nyw2IEBACiAvKgogICogR2xvYmFsIHN5c3RlbSBjcmVkZW50aWFsIHN0cnVjdHVyZS4KICAqLwotY3JlZF90IHN5c19jcmVkX3ZhbCwgKnN5c19jcmVkID0gJnN5c19jcmVkX3ZhbDsKK3N0YXRpYyBjcmVkX3Qgc3lzX2NyZWRfdmFsOworY3JlZF90ICpzeXNfY3JlZCA9ICZzeXNfY3JlZF92YWw7CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bC5jCmluZGV4IDk4YTU2NTYuLjRjODJhMDUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwuYwpAQCAtNzUsNyArNzUsNiBAQAogCXhmc19oYW5kbGVfdAkJaGFuZGxlOwogCXhmc19mc29wX2hhbmRsZXJlcV90CWhyZXE7CiAJc3RydWN0IGlub2RlCQkqaW5vZGU7Ci0JYmh2X3Zub2RlX3QJCSp2cDsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmaHJlcSwgYXJnLCBzaXplb2YoaHJlcSkpKQogCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOwpAQCAtMTM0LDIxICsxMzMsMTYgQEAKIAkJcmV0dXJuIC1YRlNfRVJST1IoRUJBREYpOwogCX0KIAotCS8qIHdlIG5lZWQgdGhlIHZub2RlICovCi0JdnAgPSB2bl9mcm9tX2lub2RlKGlub2RlKTsKLQogCS8qIG5vdyB3ZSBjYW4gZ3JhYiB0aGUgZnNpZCAqLwogCW1lbWNweSgmaGFuZGxlLmhhX2ZzaWQsIFhGU19JKGlub2RlKS0+aV9tb3VudC0+bV9maXhlZGZzaWQsCiAJCQlzaXplb2YoeGZzX2ZzaWRfdCkpOwogCWhzaXplID0gc2l6ZW9mKHhmc19mc2lkX3QpOwogCiAJaWYgKGNtZCAhPSBYRlNfSU9DX1BBVEhfVE9fRlNIQU5ETEUpIHsKLQkJeGZzX2lub2RlX3QJKmlwOworCQl4ZnNfaW5vZGVfdAkqaXAgPSBYRlNfSShpbm9kZSk7CiAJCWludAkJbG9ja19tb2RlOwogCiAJCS8qIG5lZWQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgeGZzX2lub2RlIHRvIHJlYWQgdGhlIGdlbmVyYXRpb24gKi8KLQkJaXAgPSB4ZnNfdnRvaSh2cCk7Ci0JCUFTU0VSVChpcCk7CiAJCWxvY2tfbW9kZSA9IHhmc19pbG9ja19tYXBfc2hhcmVkKGlwKTsKIAogCQkvKiBmaWxsIGluIGZpZCBzZWN0aW9uIG9mIGhhbmRsZSBmcm9tIGlub2RlICovCkBAIC0xNzYsMjEgKzE3MCwxOSBAQAogCiAKIC8qCi0gKiBDb252ZXJ0IHVzZXJzcGFjZSBoYW5kbGUgZGF0YSBpbnRvIHZub2RlIChhbmQgaW5vZGUpLgotICogV2UgW2FiXXVzZSB0aGUgZmFjdCB0aGF0IGFsbCB0aGUgZnNvcF9oYW5kbGVyZXEgaW9jdGwgY2FsbHMKLSAqIGhhdmUgYSBkYXRhIHN0cnVjdHVyZSBhcmd1bWVudCB3aG9zZSBmaXJzdCBjb21wb25lbnQgaXMgYWx3YXlzCi0gKiBhIHhmc19mc29wX2hhbmRsZXJlcV90LCBzbyB3ZSBjYW4gY2FzdCB0byBhbmQgZnJvbSB0aGlzIHR5cGUuCi0gKiBUaGlzIGFsbG93cyB1cyB0byBvcHRpbWlzZSB0aGUgY29weV9mcm9tX3VzZXIgY2FsbHMgYW5kIGdpdmVzCi0gKiBhIGhhbmR5LCBzaGFyZWQgcm91dGluZS4KKyAqIENvbnZlcnQgdXNlcnNwYWNlIGhhbmRsZSBkYXRhIGludG8gaW5vZGUuCiAgKgotICogSWYgbm8gZXJyb3IsIGNhbGxlciBtdXN0IGFsd2F5cyBWTl9SRUxFIHRoZSByZXR1cm5lZCB2cC4KKyAqIFdlIHVzZSB0aGUgZmFjdCB0aGF0IGFsbCB0aGUgZnNvcF9oYW5kbGVyZXEgaW9jdGwgY2FsbHMgaGF2ZSBhIGRhdGEKKyAqIHN0cnVjdHVyZSBhcmd1bWVudCB3aG9zZSBmaXJzdCBjb21wb25lbnQgaXMgYWx3YXlzIGEgeGZzX2Zzb3BfaGFuZGxlcmVxX3QsCisgKiBzbyB3ZSBjYW4gcGFzcyB0aGF0IHN1YiBzdHJ1Y3R1cmUgaW50byB0aGlzIGhhbmR5LCBzaGFyZWQgcm91dGluZS4KKyAqCisgKiBJZiBubyBlcnJvciwgY2FsbGVyIG11c3QgYWx3YXlzIGlwdXQgdGhlIHJldHVybmVkIGlub2RlLgogICovCiBTVEFUSUMgaW50CiB4ZnNfdmdldF9mc29wX2hhbmRsZXJlcSgKIAl4ZnNfbW91bnRfdAkJKm1wLAogCXN0cnVjdCBpbm9kZQkJKnBhcmlub2RlLAkvKiBwYXJlbnQgaW5vZGUgcG9pbnRlciAgICAqLwogCXhmc19mc29wX2hhbmRsZXJlcV90CSpocmVxLAotCWJodl92bm9kZV90CQkqKnZwLAogCXN0cnVjdCBpbm9kZQkJKippbm9kZSkKIHsKIAl2b2lkCQkJX191c2VyICpoYW5wOwpAQCAtMTk5LDggKzE5MSw2IEBACiAJeGZzX2hhbmRsZV90CQkqaGFuZGxlcDsKIAl4ZnNfaGFuZGxlX3QJCWhhbmRsZTsKIAl4ZnNfaW5vZGVfdAkJKmlwOwotCXN0cnVjdCBpbm9kZQkJKmlub2RlcDsKLQliaHZfdm5vZGVfdAkJKnZwcDsKIAl4ZnNfaW5vX3QJCWlubzsKIAlfX3UzMgkJCWlnZW47CiAJaW50CQkJZXJyb3I7CkBAIC0yNDEsNyArMjMxLDcgQEAKIAl9CiAKIAkvKgotCSAqIEdldCB0aGUgWEZTIGlub2RlLCBidWlsZGluZyBhIHZub2RlIHRvIGdvIHdpdGggaXQuCisJICogR2V0IHRoZSBYRlMgaW5vZGUsIGJ1aWxkaW5nIGEgTGludXggaW5vZGUgdG8gZ28gd2l0aCBpdC4KIAkgKi8KIAllcnJvciA9IHhmc19pZ2V0KG1wLCBOVUxMLCBpbm8sIDAsIFhGU19JTE9DS19TSEFSRUQsICZpcCwgMCk7CiAJaWYgKGVycm9yKQpAQCAtMjUzLDEyICsyNDMsOSBAQAogCQlyZXR1cm4gWEZTX0VSUk9SKEVOT0VOVCk7CiAJfQogCi0JdnBwID0gWEZTX0lUT1YoaXApOwotCWlub2RlcCA9IHZuX3RvX2lub2RlKHZwcCk7CiAJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwogCi0JKnZwID0gdnBwOwotCSppbm9kZSA9IGlub2RlcDsKKwkqaW5vZGUgPSBYRlNfSVRPVihpcCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI3NSw3ICsyNjIsNiBAQAogCXN0cnVjdCBmaWxlCQkqZmlscDsKIAlzdHJ1Y3QgaW5vZGUJCSppbm9kZTsKIAlzdHJ1Y3QgZGVudHJ5CQkqZGVudHJ5OwotCWJodl92bm9kZV90CQkqdnA7CiAJeGZzX2Zzb3BfaGFuZGxlcmVxX3QJaHJlcTsKIAogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKQEAgLTI4Myw3ICsyNjksNyBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmaHJlcSwgYXJnLCBzaXplb2YoeGZzX2Zzb3BfaGFuZGxlcmVxX3QpKSkKIAkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKIAotCWVycm9yID0geGZzX3ZnZXRfZnNvcF9oYW5kbGVyZXEobXAsIHBhcmlub2RlLCAmaHJlcSwgJnZwLCAmaW5vZGUpOworCWVycm9yID0geGZzX3ZnZXRfZnNvcF9oYW5kbGVyZXEobXAsIHBhcmlub2RlLCAmaHJlcSwgJmlub2RlKTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiAtZXJyb3I7CiAKQEAgLTM4NSw3ICszNzEsNiBAQAogewogCXN0cnVjdCBpbm9kZQkJKmlub2RlOwogCXhmc19mc29wX2hhbmRsZXJlcV90CWhyZXE7Ci0JYmh2X3Zub2RlX3QJCSp2cDsKIAlfX3UzMgkJCW9sZW47CiAJdm9pZAkJCSpsaW5rOwogCWludAkJCWVycm9yOwpAQCAtMzk1LDcgKzM4MCw3IEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZocmVxLCBhcmcsIHNpemVvZih4ZnNfZnNvcF9oYW5kbGVyZXFfdCkpKQogCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOwogCi0JZXJyb3IgPSB4ZnNfdmdldF9mc29wX2hhbmRsZXJlcShtcCwgcGFyaW5vZGUsICZocmVxLCAmdnAsICZpbm9kZSk7CisJZXJyb3IgPSB4ZnNfdmdldF9mc29wX2hhbmRsZXJlcShtcCwgcGFyaW5vZGUsICZocmVxLCAmaW5vZGUpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIC1lcnJvcjsKIApAQCAtNDM4LDM0ICs0MjMsMzIgQEAKIAlzdHJ1Y3QgZnNkbWlkYXRhCWZzZDsKIAl4ZnNfZnNvcF9zZXRkbV9oYW5kbGVyZXFfdCBkbWhyZXE7CiAJc3RydWN0IGlub2RlCQkqaW5vZGU7Ci0JYmh2X3Zub2RlX3QJCSp2cDsKIAogCWlmICghY2FwYWJsZShDQVBfTUtOT0QpKQogCQlyZXR1cm4gLVhGU19FUlJPUihFUEVSTSk7CiAJaWYgKGNvcHlfZnJvbV91c2VyKCZkbWhyZXEsIGFyZywgc2l6ZW9mKHhmc19mc29wX3NldGRtX2hhbmRsZXJlcV90KSkpCiAJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CiAKLQllcnJvciA9IHhmc192Z2V0X2Zzb3BfaGFuZGxlcmVxKG1wLCBwYXJpbm9kZSwgJmRtaHJlcS5ocmVxLCAmdnAsICZpbm9kZSk7CisJZXJyb3IgPSB4ZnNfdmdldF9mc29wX2hhbmRsZXJlcShtcCwgcGFyaW5vZGUsICZkbWhyZXEuaHJlcSwgJmlub2RlKTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiAtZXJyb3I7CiAKIAlpZiAoSVNfSU1NVVRBQkxFKGlub2RlKSB8fCBJU19BUFBFTkQoaW5vZGUpKSB7Ci0JCVZOX1JFTEUodnApOwotCQlyZXR1cm4gLVhGU19FUlJPUihFUEVSTSk7CisJCWVycm9yID0gLVhGU19FUlJPUihFUEVSTSk7CisJCWdvdG8gb3V0OwogCX0KIAogCWlmIChjb3B5X2Zyb21fdXNlcigmZnNkLCBkbWhyZXEuZGF0YSwgc2l6ZW9mKGZzZCkpKSB7Ci0JCVZOX1JFTEUodnApOwotCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCQllcnJvciA9IC1YRlNfRVJST1IoRUZBVUxUKTsKKwkJZ290byBvdXQ7CiAJfQogCi0JZXJyb3IgPSB4ZnNfc2V0X2RtYXR0cnMoeGZzX3Z0b2kodnApLAotCQkJZnNkLmZzZF9kbWV2bWFzaywgZnNkLmZzZF9kbXN0YXRlKTsKKwllcnJvciA9IC14ZnNfc2V0X2RtYXR0cnMoWEZTX0koaW5vZGUpLCBmc2QuZnNkX2RtZXZtYXNrLAorCQkJCSBmc2QuZnNkX2Rtc3RhdGUpOwogCi0JVk5fUkVMRSh2cCk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gLWVycm9yOwotCXJldHVybiAwOworIG91dDoKKwlpcHV0KGlub2RlKTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIFNUQVRJQyBpbnQKQEAgLTQ3OCw3ICs0NjEsNiBAQAogCWF0dHJsaXN0X2N1cnNvcl9rZXJuX3QJKmN1cnNvcjsKIAl4ZnNfZnNvcF9hdHRybGlzdF9oYW5kbGVyZXFfdCBhbF9ocmVxOwogCXN0cnVjdCBpbm9kZQkJKmlub2RlOwotCWJodl92bm9kZV90CQkqdnA7CiAJY2hhcgkJCSprYnVmOwogCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQpAQCAtNDg4LDggKzQ3MCw3IEBACiAJaWYgKGFsX2hyZXEuYnVmbGVuID4gWEFUVFJfTElTVF9NQVgpCiAJCXJldHVybiAtWEZTX0VSUk9SKEVJTlZBTCk7CiAKLQllcnJvciA9IHhmc192Z2V0X2Zzb3BfaGFuZGxlcmVxKG1wLCBwYXJpbm9kZSwgJmFsX2hyZXEuaHJlcSwKLQkJCSZ2cCwgJmlub2RlKTsKKwllcnJvciA9IHhmc192Z2V0X2Zzb3BfaGFuZGxlcmVxKG1wLCBwYXJpbm9kZSwgJmFsX2hyZXEuaHJlcSwgJmlub2RlKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwogCkBAIC01MDksNyArNDkwLDcgQEAKICBvdXRfa2ZyZWU6CiAJa2ZyZWUoa2J1Zik7CiAgb3V0X3ZuX3JlbGU6Ci0JVk5fUkVMRSh2cCk7CisJaXB1dChpbm9kZSk7CiAgb3V0OgogCXJldHVybiAtZXJyb3I7CiB9CkBAIC01MzEsNyArNTEyLDcgQEAKIAlpZiAoIWtidWYpCiAJCXJldHVybiBFTk9NRU07CiAKLQllcnJvciA9IHhmc19hdHRyX2dldChYRlNfSShpbm9kZSksIG5hbWUsIGtidWYsIGxlbiwgZmxhZ3MsIE5VTEwpOworCWVycm9yID0geGZzX2F0dHJfZ2V0KFhGU19JKGlub2RlKSwgbmFtZSwga2J1ZiwgKGludCAqKWxlbiwgZmxhZ3MsIE5VTEwpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXRfa2ZyZWU7CiAKQEAgLTU5OCw3ICs1NzksNiBAQAogCXhmc19hdHRyX211bHRpb3BfdAkqb3BzOwogCXhmc19mc29wX2F0dHJtdWx0aV9oYW5kbGVyZXFfdCBhbV9ocmVxOwogCXN0cnVjdCBpbm9kZQkJKmlub2RlOwotCWJodl92bm9kZV90CQkqdnA7CiAJdW5zaWduZWQgaW50CQlpLCBzaXplOwogCWNoYXIJCQkqYXR0cl9uYW1lOwogCkBAIC02MDcsNyArNTg3LDcgQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmFtX2hyZXEsIGFyZywgc2l6ZW9mKHhmc19mc29wX2F0dHJtdWx0aV9oYW5kbGVyZXFfdCkpKQogCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOwogCi0JZXJyb3IgPSB4ZnNfdmdldF9mc29wX2hhbmRsZXJlcShtcCwgcGFyaW5vZGUsICZhbV9ocmVxLmhyZXEsICZ2cCwgJmlub2RlKTsKKwllcnJvciA9IHhmc192Z2V0X2Zzb3BfaGFuZGxlcmVxKG1wLCBwYXJpbm9kZSwgJmFtX2hyZXEuaHJlcSwgJmlub2RlKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwogCkBAIC02NjYsNyArNjQ2LDcgQEAKICBvdXRfa2ZyZWVfb3BzOgogCWtmcmVlKG9wcyk7CiAgb3V0X3ZuX3JlbGU6Ci0JVk5fUkVMRSh2cCk7CisJaXB1dChpbm9kZSk7CiAgb3V0OgogCXJldHVybiAtZXJyb3I7CiB9CkBAIC03MDIsNyArNjgyLDYgQEAKIAogU1RBVElDIGludAogeGZzX2lvY194YXR0cigKLQliaHZfdm5vZGVfdAkJKnZwLAogCXhmc19pbm9kZV90CQkqaXAsCiAJc3RydWN0IGZpbGUJCSpmaWxwLAogCXVuc2lnbmVkIGludAkJY21kLApAQCAtNzM1LDEyICs3MTQsMTAgQEAKIAl2b2lkCQkJX191c2VyICphcmcpCiB7CiAJc3RydWN0IGlub2RlCQkqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwotCWJodl92bm9kZV90CQkqdnAgPSB2bl9mcm9tX2lub2RlKGlub2RlKTsKIAl4ZnNfbW91bnRfdAkJKm1wID0gaXAtPmlfbW91bnQ7CiAJaW50CQkJZXJyb3I7CiAKLQl2bl90cmFjZV9lbnRyeShYRlNfSShpbm9kZSksICJ4ZnNfaW9jdGwiLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7Ci0KKwl4ZnNfaXRyYWNlX2VudHJ5KFhGU19JKGlub2RlKSk7CiAJc3dpdGNoIChjbWQpIHsKIAogCWNhc2UgWEZTX0lPQ19BTExPQ1NQOgpAQCAtNzY0LDcgKzc0MSw3IEBACiAJY2FzZSBYRlNfSU9DX0RJT0lORk86IHsKIAkJc3RydWN0IGRpb2F0dHIJZGE7CiAJCXhmc19idWZ0YXJnX3QJKnRhcmdldCA9Ci0JCQkoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpID8KKwkJCVhGU19JU19SRUFMVElNRV9JTk9ERShpcCkgPwogCQkJbXAtPm1fcnRkZXZfdGFyZ3AgOiBtcC0+bV9kZGV2X3RhcmdwOwogCiAJCWRhLmRfbWVtID0gZGEuZF9taW5pb3N6ID0gMSA8PCB0YXJnZXQtPmJ0X3NzaGlmdDsKQEAgLTc5Niw3ICs3NzMsNyBAQAogCWNhc2UgWEZTX0lPQ19HRVRYRkxBR1M6CiAJY2FzZSBYRlNfSU9DX1NFVFhGTEFHUzoKIAljYXNlIFhGU19JT0NfRlNTRVRYQVRUUjoKLQkJcmV0dXJuIHhmc19pb2NfeGF0dHIodnAsIGlwLCBmaWxwLCBjbWQsIGFyZyk7CisJCXJldHVybiB4ZnNfaW9jX3hhdHRyKGlwLCBmaWxwLCBjbWQsIGFyZyk7CiAKIAljYXNlIFhGU19JT0NfRlNTRVRETTogewogCQlzdHJ1Y3QgZnNkbWlkYXRhCWRtaTsKQEAgLTEyMDMsNyArMTE4MCw2IEBACiAKIFNUQVRJQyBpbnQKIHhmc19pb2NfeGF0dHIoCi0JYmh2X3Zub2RlX3QJCSp2cCwKIAl4ZnNfaW5vZGVfdAkJKmlwLAogCXN0cnVjdCBmaWxlCQkqZmlscCwKIAl1bnNpZ25lZCBpbnQJCWNtZCwKQEAgLTEyMzcsNyArMTIxMyw3IEBACiAKIAkJZXJyb3IgPSB4ZnNfc2V0YXR0cihpcCwgdmF0dHIsIGF0dHJfZmxhZ3MsIE5VTEwpOwogCQlpZiAobGlrZWx5KCFlcnJvcikpCi0JCQlfX3ZuX3JldmFsaWRhdGUodnAsIHZhdHRyKTsJLyogdXBkYXRlIGZsYWdzICovCisJCQl2bl9yZXZhbGlkYXRlKFhGU19JVE9WKGlwKSk7CS8qIHVwZGF0ZSBmbGFncyAqLwogCQllcnJvciA9IC1lcnJvcjsKIAkJYnJlYWs7CiAJfQpAQCAtMTI3Miw3ICsxMjQ4LDcgQEAKIAogCQllcnJvciA9IHhmc19zZXRhdHRyKGlwLCB2YXR0ciwgYXR0cl9mbGFncywgTlVMTCk7CiAJCWlmIChsaWtlbHkoIWVycm9yKSkKLQkJCV9fdm5fcmV2YWxpZGF0ZSh2cCwgdmF0dHIpOwkvKiB1cGRhdGUgZmxhZ3MgKi8KKwkJCXZuX3JldmFsaWRhdGUoWEZTX0lUT1YoaXApKTsJLyogdXBkYXRlIGZsYWdzICovCiAJCWVycm9yID0gLWVycm9yOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bDMyLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bDMyLmMKaW5kZXggYmYyYTk1Ni4uYTRiMjU0ZSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwzMi5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsMzIuYwpAQCAtNDQsNiArNDQsNyBAQAogI2luY2x1ZGUgInhmc19lcnJvci5oIgogI2luY2x1ZGUgInhmc19kZnJhZy5oIgogI2luY2x1ZGUgInhmc192bm9kZW9wcy5oIgorI2luY2x1ZGUgInhmc19pb2N0bDMyLmgiCiAKICNkZWZpbmUgIF9OQVRJVkVfSU9DKGNtZCwgdHlwZSkgXAogCSAgX0lPQyhfSU9DX0RJUihjbWQpLCBfSU9DX1RZUEUoY21kKSwgX0lPQ19OUihjbWQpLCBzaXplb2YodHlwZSkpCkBAIC0zNzksOSArMzgwLDYgQEAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgWEZTX0lPQ19ESU9JTkZPOgogCWNhc2UgWEZTX0lPQ19GU0dFT01FVFJZOgotCWNhc2UgWEZTX0lPQ19HRVRWRVJTSU9OOgotCWNhc2UgWEZTX0lPQ19HRVRYRkxBR1M6Ci0JY2FzZSBYRlNfSU9DX1NFVFhGTEFHUzoKIAljYXNlIFhGU19JT0NfRlNHRVRYQVRUUjoKIAljYXNlIFhGU19JT0NfRlNTRVRYQVRUUjoKIAljYXNlIFhGU19JT0NfRlNHRVRYQVRUUkE6CkBAIC00MDcsNiArNDA1LDExIEBACiAJY2FzZSBYRlNfSU9DX0VSUk9SX0NMRUFSQUxMOgogCQlicmVhazsKIAorCWNhc2UgWEZTX0lPQzMyX0dFVFhGTEFHUzoKKwljYXNlIFhGU19JT0MzMl9TRVRYRkxBR1M6CisJY2FzZSBYRlNfSU9DMzJfR0VUVkVSU0lPTjoKKwkJY21kID0gX05BVElWRV9JT0MoY21kLCBsb25nKTsKKwkJYnJlYWs7CiAjaWZkZWYgQlJPS0VOX1g4Nl9BTElHTk1FTlQKIAkvKiB4ZnNfZmxvY2tfdCBoYXMgd3JvbmcgdTMyIHZzIHU2NCBhbGlnbm1lbnQgKi8KIAljYXNlIFhGU19JT0NfQUxMT0NTUF8zMjoKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuYwppbmRleCA1ZThiYjdmLi5jYzRhYmQzIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5jCkBAIC01Miw2ICs1Miw3IEBACiAjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvZmFsbG9jLmg+CiAKIC8qCiAgKiBCcmluZyB0aGUgYXRpbWUgaW4gdGhlIFhGUyBpbm9kZSB1cHRvZGF0ZS4KQEAgLTcxLDYgKzcyLDIyIEBACiB9CiAKIC8qCisgKiBJZiB0aGUgbGludXggaW5vZGUgZXhpc3RzLCBtYXJrIGl0IGRpcnR5LgorICogVXNlZCB3aGVuIGNvbW1pdGluZyBhIGRpcnR5IGlub2RlIGludG8gYSB0cmFuc2FjdGlvbiBzbyB0aGF0CisgKiB0aGUgaW5vZGUgd2lsbCBnZXQgd3JpdHRlbiBiYWNrIGJ5IHRoZSBsaW51eCBjb2RlCisgKi8KK3ZvaWQKK3hmc19tYXJrX2lub2RlX2RpcnR5X3N5bmMoCisJeGZzX2lub2RlX3QJKmlwKQoreworCWJodl92bm9kZV90CSp2cDsKKworCXZwID0gWEZTX0lUT1ZfTlVMTChpcCk7CisJaWYgKHZwKQorCQltYXJrX2lub2RlX2RpcnR5X3N5bmModm5fdG9faW5vZGUodnApKTsKK30KKworLyoKICAqIENoYW5nZSB0aGUgcmVxdWVzdGVkIHRpbWVzdGFtcCBpbiB0aGUgZ2l2ZW4gaW5vZGUuCiAgKiBXZSBkb24ndCBsb2NrIGFjcm9zcyB0aW1lc3RhbXAgdXBkYXRlcywgYW5kIHdlIGRvbid0IGxvZyB0aGVtIGJ1dAogICogd2UgZG8gcmVjb3JkIHRoZSBmYWN0IHRoYXQgdGhlcmUgaXMgZGlydHkgaW5mb3JtYXRpb24gaW4gY29yZS4KQEAgLTE4NCwxMCArMjAxLDYgQEAKIAlzdHJ1Y3QgeGZzX2lub2RlCSppcCA9IFhGU19JKGlub2RlKTsKIAlsb2ZmX3Qgc2l6ZTsKIAotCWlub2RlLT5pX25saW5rID0gaXAtPmlfZC5kaV9ubGluazsKLQlpbm9kZS0+aV9ibG9ja3MgPQotCQlYRlNfRlNCX1RPX0JCKGlwLT5pX21vdW50LCBpcC0+aV9kLmRpX25ibG9ja3MgKwotCQkJCQkgICBpcC0+aV9kZWxheWVkX2Jsa3MpOwogCS8qIHdlJ3JlIHVuZGVyIGlfc2VtIHNvIGlfc2l6ZSBjYW4ndCBjaGFuZ2UgdW5kZXIgdXMgKi8KIAlzaXplID0gWEZTX0lTSVpFKGlwKTsKIAlpZiAoaV9zaXplX3JlYWQoaW5vZGUpICE9IHNpemUpCkBAIC01NDIsMTIgKzU1NSwzMSBAQAogCiAjaWZkZWYgQ09ORklHX1hGU19QT1NJWF9BQ0wKIFNUQVRJQyBpbnQKLXhmc192bl9wZXJtaXNzaW9uKAotCXN0cnVjdCBpbm9kZQkqaW5vZGUsCi0JaW50CQltb2RlLAotCXN0cnVjdCBuYW1laWRhdGEgKm5kKQoreGZzX2NoZWNrX2FjbCgKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZSwKKwlpbnQJCQltYXNrKQogewotCXJldHVybiAteGZzX2FjY2VzcyhYRlNfSShpbm9kZSksIG1vZGUgPDwgNiwgTlVMTCk7CisJc3RydWN0IHhmc19pbm9kZQkqaXAgPSBYRlNfSShpbm9kZSk7CisJaW50CQkJZXJyb3I7CisKKwl4ZnNfaXRyYWNlX2VudHJ5KGlwKTsKKworCWlmIChYRlNfSUZPUktfUShpcCkpIHsKKwkJZXJyb3IgPSB4ZnNfYWNsX2lhY2Nlc3MoaXAsIG1hc2ssIE5VTEwpOworCQlpZiAoZXJyb3IgIT0gLTEpCisJCQlyZXR1cm4gLWVycm9yOworCX0KKworCXJldHVybiAtRUFHQUlOOworfQorCitTVEFUSUMgaW50Cit4ZnNfdm5fcGVybWlzc2lvbigKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZSwKKwlpbnQJCQltYXNrLAorCXN0cnVjdCBuYW1laWRhdGEJKm5kKQoreworCXJldHVybiBnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIG1hc2ssIHhmc19jaGVja19hY2wpOwogfQogI2Vsc2UKICNkZWZpbmUgeGZzX3ZuX3Blcm1pc3Npb24gTlVMTApAQCAtNTU1LDMzICs1ODcsNjEgQEAKIAogU1RBVElDIGludAogeGZzX3ZuX2dldGF0dHIoCi0Jc3RydWN0IHZmc21vdW50CSptbnQsCi0Jc3RydWN0IGRlbnRyeQkqZGVudHJ5LAotCXN0cnVjdCBrc3RhdAkqc3RhdCkKKwlzdHJ1Y3QgdmZzbW91bnQJCSptbnQsCisJc3RydWN0IGRlbnRyeQkJKmRlbnRyeSwKKwlzdHJ1Y3Qga3N0YXQJCSpzdGF0KQogewotCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7Ci0JYmh2X3ZhdHRyX3QJdmF0dHIgPSB7IC52YV9tYXNrID0gWEZTX0FUX1NUQVQgfTsKLQlpbnQJCWVycm9yOworCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCB4ZnNfaW5vZGUJKmlwID0gWEZTX0koaW5vZGUpOworCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gaXAtPmlfbW91bnQ7CiAKLQllcnJvciA9IHhmc19nZXRhdHRyKFhGU19JKGlub2RlKSwgJnZhdHRyLCBBVFRSX0xBWlkpOwotCWlmIChsaWtlbHkoIWVycm9yKSkgewotCQlzdGF0LT5zaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwotCQlzdGF0LT5kZXYgPSBpbm9kZS0+aV9zYi0+c19kZXY7Ci0JCXN0YXQtPnJkZXYgPSAodmF0dHIudmFfcmRldiA9PSAwKSA/IDAgOgotCQkJCU1LREVWKHN5c3ZfbWFqb3IodmF0dHIudmFfcmRldikgJiAweDFmZiwKLQkJCQkgICAgICBzeXN2X21pbm9yKHZhdHRyLnZhX3JkZXYpKTsKLQkJc3RhdC0+bW9kZSA9IHZhdHRyLnZhX21vZGU7Ci0JCXN0YXQtPm5saW5rID0gdmF0dHIudmFfbmxpbms7Ci0JCXN0YXQtPnVpZCA9IHZhdHRyLnZhX3VpZDsKLQkJc3RhdC0+Z2lkID0gdmF0dHIudmFfZ2lkOwotCQlzdGF0LT5pbm8gPSB2YXR0ci52YV9ub2RlaWQ7Ci0JCXN0YXQtPmF0aW1lID0gdmF0dHIudmFfYXRpbWU7Ci0JCXN0YXQtPm10aW1lID0gdmF0dHIudmFfbXRpbWU7Ci0JCXN0YXQtPmN0aW1lID0gdmF0dHIudmFfY3RpbWU7Ci0JCXN0YXQtPmJsb2NrcyA9IHZhdHRyLnZhX25ibG9ja3M7Ci0JCXN0YXQtPmJsa3NpemUgPSB2YXR0ci52YV9ibG9ja3NpemU7CisJeGZzX2l0cmFjZV9lbnRyeShpcCk7CisKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKworCXN0YXQtPnNpemUgPSBYRlNfSVNJWkUoaXApOworCXN0YXQtPmRldiA9IGlub2RlLT5pX3NiLT5zX2RldjsKKwlzdGF0LT5tb2RlID0gaXAtPmlfZC5kaV9tb2RlOworCXN0YXQtPm5saW5rID0gaXAtPmlfZC5kaV9ubGluazsKKwlzdGF0LT51aWQgPSBpcC0+aV9kLmRpX3VpZDsKKwlzdGF0LT5naWQgPSBpcC0+aV9kLmRpX2dpZDsKKwlzdGF0LT5pbm8gPSBpcC0+aV9pbm87CisjaWYgWEZTX0JJR19JTlVNUworCXN0YXQtPmlubyArPSBtcC0+bV9pbm9hZGQ7CisjZW5kaWYKKwlzdGF0LT5hdGltZSA9IGlub2RlLT5pX2F0aW1lOworCXN0YXQtPm10aW1lLnR2X3NlYyA9IGlwLT5pX2QuZGlfbXRpbWUudF9zZWM7CisJc3RhdC0+bXRpbWUudHZfbnNlYyA9IGlwLT5pX2QuZGlfbXRpbWUudF9uc2VjOworCXN0YXQtPmN0aW1lLnR2X3NlYyA9IGlwLT5pX2QuZGlfY3RpbWUudF9zZWM7CisJc3RhdC0+Y3RpbWUudHZfbnNlYyA9IGlwLT5pX2QuZGlfY3RpbWUudF9uc2VjOworCXN0YXQtPmJsb2NrcyA9CisJCVhGU19GU0JfVE9fQkIobXAsIGlwLT5pX2QuZGlfbmJsb2NrcyArIGlwLT5pX2RlbGF5ZWRfYmxrcyk7CisKKworCXN3aXRjaCAoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgeworCWNhc2UgU19JRkJMSzoKKwljYXNlIFNfSUZDSFI6CisJCXN0YXQtPmJsa3NpemUgPSBCTEtERVZfSU9TSVpFOworCQlzdGF0LT5yZGV2ID0gTUtERVYoc3lzdl9tYWpvcihpcC0+aV9kZi5pZl91Mi5pZl9yZGV2KSAmIDB4MWZmLAorCQkJCSAgIHN5c3ZfbWlub3IoaXAtPmlfZGYuaWZfdTIuaWZfcmRldikpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKSkgeworCQkJLyoKKwkJCSAqIElmIHRoZSBmaWxlIGJsb2NrcyBhcmUgYmVpbmcgYWxsb2NhdGVkIGZyb20gYQorCQkJICogcmVhbHRpbWUgdm9sdW1lLCB0aGVuIHJldHVybiB0aGUgaW5vZGUncyByZWFsdGltZQorCQkJICogZXh0ZW50IHNpemUgb3IgdGhlIHJlYWx0aW1lIHZvbHVtZSdzIGV4dGVudCBzaXplLgorCQkJICovCisJCQlzdGF0LT5ibGtzaXplID0KKwkJCQl4ZnNfZ2V0X2V4dHN6X2hpbnQoaXApIDw8IG1wLT5tX3NiLnNiX2Jsb2NrbG9nOworCQl9IGVsc2UKKwkJCXN0YXQtPmJsa3NpemUgPSB4ZnNfcHJlZmVycmVkX2lvc2l6ZShtcCk7CisJCXN0YXQtPnJkZXYgPSAwOworCQlicmVhazsKIAl9Ci0JcmV0dXJuIC1lcnJvcjsKKworCXJldHVybiAwOwogfQogCiBTVEFUSUMgaW50CkBAIC02MzYsNyArNjk2LDcgQEAKIAogCWVycm9yID0geGZzX3NldGF0dHIoWEZTX0koaW5vZGUpLCAmdmF0dHIsIGZsYWdzLCBOVUxMKTsKIAlpZiAobGlrZWx5KCFlcnJvcikpCi0JCV9fdm5fcmV2YWxpZGF0ZSh2bl9mcm9tX2lub2RlKGlub2RlKSwgJnZhdHRyKTsKKwkJdm5fcmV2YWxpZGF0ZSh2bl9mcm9tX2lub2RlKGlub2RlKSk7CiAJcmV0dXJuIC1lcnJvcjsKIH0KIApAQCAtNzUwLDYgKzgxMCw0NyBAQAogCXJldHVybiBuYW1lc3AtPmF0dHJfcmVtb3ZlKHZwLCBhdHRyLCB4ZmxhZ3MpOwogfQogCitTVEFUSUMgbG9uZworeGZzX3ZuX2ZhbGxvY2F0ZSgKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlLAorCWludAkJbW9kZSwKKwlsb2ZmX3QJCW9mZnNldCwKKwlsb2ZmX3QJCWxlbikKK3sKKwlsb25nCQllcnJvcjsKKwlsb2ZmX3QJCW5ld19zaXplID0gMDsKKwl4ZnNfZmxvY2s2NF90CWJmOworCXhmc19pbm9kZV90CSppcCA9IFhGU19JKGlub2RlKTsKKworCS8qIHByZWFsbG9jYXRpb24gb24gZGlyZWN0b3JpZXMgbm90IHlldCBzdXBwb3J0ZWQgKi8KKwllcnJvciA9IC1FTk9ERVY7CisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCWdvdG8gb3V0X2Vycm9yOworCisJYmYubF93aGVuY2UgPSAwOworCWJmLmxfc3RhcnQgPSBvZmZzZXQ7CisJYmYubF9sZW4gPSBsZW47CisKKwl4ZnNfaWxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7CisJZXJyb3IgPSB4ZnNfY2hhbmdlX2ZpbGVfc3BhY2UoaXAsIFhGU19JT0NfUkVTVlNQLCAmYmYsCisJCQkJCQkwLCBOVUxMLCBBVFRSX05PTE9DSyk7CisJaWYgKCFlcnJvciAmJiAhKG1vZGUgJiBGQUxMT0NfRkxfS0VFUF9TSVpFKSAmJgorCSAgICBvZmZzZXQgKyBsZW4gPiBpX3NpemVfcmVhZChpbm9kZSkpCisJCW5ld19zaXplID0gb2Zmc2V0ICsgbGVuOworCisJLyogQ2hhbmdlIGZpbGUgc2l6ZSBpZiBuZWVkZWQgKi8KKwlpZiAobmV3X3NpemUpIHsKKwkJYmh2X3ZhdHRyX3QJdmE7CisKKwkJdmEudmFfbWFzayA9IFhGU19BVF9TSVpFOworCQl2YS52YV9zaXplID0gbmV3X3NpemU7CisJCWVycm9yID0geGZzX3NldGF0dHIoaXAsICZ2YSwgQVRUUl9OT0xPQ0ssIE5VTEwpOworCX0KKworCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wpOworb3V0X2Vycm9yOgorCXJldHVybiBlcnJvcjsKK30KIAogY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgeGZzX2lub2RlX29wZXJhdGlvbnMgPSB7CiAJLnBlcm1pc3Npb24JCT0geGZzX3ZuX3Blcm1pc3Npb24sCkBAIC03NjAsNiArODYxLDcgQEAKIAkuZ2V0eGF0dHIJCT0geGZzX3ZuX2dldHhhdHRyLAogCS5saXN0eGF0dHIJCT0geGZzX3ZuX2xpc3R4YXR0ciwKIAkucmVtb3ZleGF0dHIJCT0geGZzX3ZuX3JlbW92ZXhhdHRyLAorCS5mYWxsb2NhdGUJCT0geGZzX3ZuX2ZhbGxvY2F0ZSwKIH07CiAKIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHhmc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2xpbnV4LmggYi9mcy94ZnMvbGludXgtMi42L3hmc19saW51eC5oCmluZGV4IGRjMzc1MmQuLjNjYTM5YzQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2xpbnV4LmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfbGludXguaApAQCAtNDMsNyArNDMsNiBAQAogCiAjaW5jbHVkZSA8a21lbS5oPgogI2luY2x1ZGUgPG1ybG9jay5oPgotI2luY2x1ZGUgPHNwaW4uaD4KICNpbmNsdWRlIDxzdi5oPgogI2luY2x1ZGUgPG11dGV4Lmg+CiAjaW5jbHVkZSA8c2VtYS5oPgpAQCAtNzUsNiArNzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CkBAIC0xMzYsNDMgKzEzNiwxOSBAQAogI2RlZmluZSBjdXJyZW50X3Jlc3RvcmVfZmxhZ3NfbmVzdGVkKHNwLCBmKQlcCiAJCShjdXJyZW50LT5mbGFncyA9ICgoY3VycmVudC0+ZmxhZ3MgJiB+KGYpKSB8ICgqKHNwKSAmIChmKSkpKQogCi0jZGVmaW5lIE5CUFAJCVBBR0VfU0laRQotI2RlZmluZSBORFBQCQkoMSA8PCAoUEFHRV9TSElGVCAtIDkpKQorI2RlZmluZSBzcGlubG9ja19kZXN0cm95KGxvY2spCiAKICNkZWZpbmUgTkJCWQkJOAkJLyogbnVtYmVyIG9mIGJpdHMgcGVyIGJ5dGUgKi8KLSNkZWZpbmUJTkJQQwkJUEFHRV9TSVpFCS8qIE51bWJlciBvZiBieXRlcyBwZXIgY2xpY2sgKi8KLSNkZWZpbmUJQlBDU0hJRlQJUEFHRV9TSElGVAkvKiBMT0cyKE5CUEMpIGlmIGV4YWN0ICovCiAKIC8qCiAgKiBTaXplIG9mIGJsb2NrIGRldmljZSBpL28gaXMgcGFyYW1ldGVyaXplZCBoZXJlLgogICogQ3VycmVudGx5IHRoZSBzeXN0ZW0gc3VwcG9ydHMgcGFnZS1zaXplZCBpL28uCiAgKi8KLSNkZWZpbmUJQkxLREVWX0lPU0hJRlQJCUJQQ1NISUZUCisjZGVmaW5lCUJMS0RFVl9JT1NISUZUCQlQQUdFX0NBQ0hFX1NISUZUCiAjZGVmaW5lCUJMS0RFVl9JT1NJWkUJCSgxPDxCTEtERVZfSU9TSElGVCkKIC8qIG51bWJlciBvZiBCQidzIHBlciBibG9jayBkZXZpY2UgYmxvY2sgKi8KICNkZWZpbmUJQkxLREVWX0JCCQlCVE9CQihCTEtERVZfSU9TSVpFKQogCi0vKiBieXRlcyB0byBjbGlja3MgKi8KLSNkZWZpbmUJYnRvYyh4KQkJKCgoX19wc3Vuc2lnbmVkX3QpKHgpKyhOQlBDLTEpKT4+QlBDU0hJRlQpCi0jZGVmaW5lCWJ0b2N0KHgpCSgoX19wc3Vuc2lnbmVkX3QpKHgpPj5CUENTSElGVCkKLSNkZWZpbmUJYnRvYzY0KHgpCSgoKF9fdWludDY0X3QpKHgpKyhOQlBDLTEpKT4+QlBDU0hJRlQpCi0jZGVmaW5lCWJ0b2N0NjQoeCkJKChfX3VpbnQ2NF90KSh4KT4+QlBDU0hJRlQpCi0KLS8qIG9mZl90IGJ5dGVzIHRvIGNsaWNrcyAqLwotI2RlZmluZSBvZmZ0b2MoeCkgICAgICAgKCgoX191aW50NjRfdCkoeCkrKE5CUEMtMSkpPj5CUENTSElGVCkKLSNkZWZpbmUgb2ZmdG9jdCh4KSAgICAgICgoeGZzX29mZl90KSh4KT4+QlBDU0hJRlQpCi0KLS8qIGNsaWNrcyB0byBvZmZfdCBieXRlcyAqLwotI2RlZmluZQljdG9vZmYoeCkJKCh4ZnNfb2ZmX3QpKHgpPDxCUENTSElGVCkKLQotLyogY2xpY2tzIHRvIGJ5dGVzICovCi0jZGVmaW5lCWN0b2IoeCkJCSgoX19wc3Vuc2lnbmVkX3QpKHgpPDxCUENTSElGVCkKLSNkZWZpbmUgYnRvY3QoeCkgICAgICAgICgoX19wc3Vuc2lnbmVkX3QpKHgpPj5CUENTSElGVCkKLSNkZWZpbmUJY3RvYjY0KHgpCSgoX191aW50NjRfdCkoeCk8PEJQQ1NISUZUKQotCi0vKiBieXRlcyB0byBjbGlja3MgKi8KLSNkZWZpbmUgYnRvYyh4KSAgICAgICAgICgoKF9fcHN1bnNpZ25lZF90KSh4KSsoTkJQQy0xKSk+PkJQQ1NISUZUKQotCiAjZGVmaW5lIEVOT0FUVFIJCUVOT0RBVEEJCS8qIEF0dHJpYnV0ZSBub3QgZm91bmQgKi8KICNkZWZpbmUgRVdST05HRlMJRUlOVkFMCQkvKiBNb3VudCB3aXRoIHdyb25nIGZpbGVzeXN0ZW0gdHlwZSAqLwogI2RlZmluZSBFRlNDT1JSVVBURUQJRVVDTEVBTgkJLyogRmlsZXN5c3RlbSBpcyBjb3JydXB0ZWQgKi8KQEAgLTIwNSwxMCArMTgxLDYgQEAKICNkZWZpbmUgeGZzX3N0YWNrX3RyYWNlKCkJZHVtcF9zdGFjaygpCiAjZGVmaW5lIHhmc19pdHJ1bmNhdGVfZGF0YShpcCwgb2ZmKQlcCiAJKC12bXRydW5jYXRlKHZuX3RvX2lub2RlKFhGU19JVE9WKGlwKSksIChvZmYpKSkKLSNkZWZpbmUgeGZzX3N0YXR2ZnNfZnNpZChzdGF0cCwgbXApCVwKLQkoeyB1NjQgaWQgPSBodWdlX2VuY29kZV9kZXYoKG1wKS0+bV9kZGV2X3RhcmdwLT5idF9kZXYpOyBcCi0JICAgX19rZXJuZWxfZnNpZF90ICpmc2lkID0gJihzdGF0cCktPmZfZnNpZDsJXAotCShmc2lkLT52YWxbMF0gPSAodTMyKWlkLCBmc2lkLT52YWxbMV0gPSAodTMyKShpZCA+PiAzMikpOyB9KQogCiAKIC8qIE1vdmUgdGhlIGtlcm5lbCBkb19kaXYgZGVmaW5pdGlvbiBvZmYgdG8gb25lIHNpZGUgKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2xydy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmMKaW5kZXggNmY2MTRmMy4uMTY2MzUzMyAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmMKQEAgLTU4LDE0ICs1OCwxMiBAQAogdm9pZAogeGZzX3J3X2VudGVyX3RyYWNlKAogCWludAkJCXRhZywKLQl4ZnNfaW9jb3JlX3QJCSppbywKKwl4ZnNfaW5vZGVfdAkJKmlwLAogCXZvaWQJCQkqZGF0YSwKIAlzaXplX3QJCQlzZWdzLAogCWxvZmZfdAkJCW9mZnNldCwKIAlpbnQJCQlpb2ZsYWdzKQogewotCXhmc19pbm9kZV90CSppcCA9IFhGU19JT19JTk9ERShpbyk7Ci0KIAlpZiAoaXAtPmlfcnd0cmFjZSA9PSBOVUxMKQogCQlyZXR1cm47CiAJa3RyYWNlX2VudGVyKGlwLT5pX3J3dHJhY2UsCkBAIC03OCw4ICs3Niw4IEBACiAJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKSgob2Zmc2V0ID4+IDMyKSAmIDB4ZmZmZmZmZmYpKSwKIAkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKG9mZnNldCAmIDB4ZmZmZmZmZmYpKSwKIAkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpaW9mbGFncyksCi0JCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKSgoaW8tPmlvX25ld19zaXplID4+IDMyKSAmIDB4ZmZmZmZmZmYpKSwKLQkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGlvLT5pb19uZXdfc2l6ZSAmIDB4ZmZmZmZmZmYpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKChpcC0+aV9uZXdfc2l6ZSA+PiAzMikgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShpcC0+aV9uZXdfc2l6ZSAmIDB4ZmZmZmZmZmYpKSwKIAkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpY3VycmVudF9waWQoKSksCiAJCSh2b2lkICopTlVMTCwKIAkJKHZvaWQgKilOVUxMLApAQCAtODksMTMgKzg3LDEyIEBACiAKIHZvaWQKIHhmc19pbnZhbF9jYWNoZWRfdHJhY2UoCi0JeGZzX2lvY29yZV90CSppbywKKwl4ZnNfaW5vZGVfdAkqaXAsCiAJeGZzX29mZl90CW9mZnNldCwKIAl4ZnNfb2ZmX3QJbGVuLAogCXhmc19vZmZfdAlmaXJzdCwKIAl4ZnNfb2ZmX3QJbGFzdCkKIHsKLQl4ZnNfaW5vZGVfdAkqaXAgPSBYRlNfSU9fSU5PREUoaW8pOwogCiAJaWYgKGlwLT5pX3J3dHJhY2UgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMTMxLDcgKzEyOCw3IEBACiAgKi8KIFNUQVRJQyBpbnQKIHhmc19pb3plcm8oCi0Jc3RydWN0IGlub2RlCQkqaXAsCS8qIGlub2RlCQkJKi8KKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCwJLyogaW5vZGUJCQkqLwogCWxvZmZfdAkJCXBvcywJLyogb2Zmc2V0IGluIGZpbGUJCSovCiAJc2l6ZV90CQkJY291bnQpCS8qIHNpemUgb2YgZGF0YSB0byB6ZXJvCQkqLwogewpAQCAtMTM5LDcgKzEzNiw3IEBACiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UJKm1hcHBpbmc7CiAJaW50CQkJc3RhdHVzOwogCi0JbWFwcGluZyA9IGlwLT5pX21hcHBpbmc7CisJbWFwcGluZyA9IGlwLT5pX3Zub2RlLT5pX21hcHBpbmc7CiAJZG8gewogCQl1bnNpZ25lZCBvZmZzZXQsIGJ5dGVzOwogCQl2b2lkICpmc2RhdGE7CkBAIC0yMDUsNyArMjAyLDcgQEAKIAogCWlmICh1bmxpa2VseShpb2ZsYWdzICYgSU9fSVNESVJFQ1QpKSB7CiAJCXhmc19idWZ0YXJnX3QJKnRhcmdldCA9Ci0JCQkoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpID8KKwkJCVhGU19JU19SRUFMVElNRV9JTk9ERShpcCkgPwogCQkJCW1wLT5tX3J0ZGV2X3RhcmdwIDogbXAtPm1fZGRldl90YXJncDsKIAkJaWYgKCgqb2Zmc2V0ICYgdGFyZ2V0LT5idF9zbWFzaykgfHwKIAkJICAgIChzaXplICYgdGFyZ2V0LT5idF9zbWFzaykpIHsKQEAgLTI0Niw5ICsyNDMsOCBAQAogCiAJaWYgKHVubGlrZWx5KGlvZmxhZ3MgJiBJT19JU0RJUkVDVCkpIHsKIAkJaWYgKFZOX0NBQ0hFRCh2cCkpCi0JCQlyZXQgPSB4ZnNfZmx1c2hpbnZhbF9wYWdlcyhpcCwKLQkJCQkJY3Rvb2ZmKG9mZnRvY3QoKm9mZnNldCkpLAotCQkJCQktMSwgRklfUkVNQVBGX0xPQ0tFRCk7CisJCQlyZXQgPSB4ZnNfZmx1c2hpbnZhbF9wYWdlcyhpcCwgKCpvZmZzZXQgJiBQQUdFX0NBQ0hFX01BU0spLAorCQkJCQkJICAgIC0xLCBGSV9SRU1BUEZfTE9DS0VEKTsKIAkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJCWlmIChyZXQpIHsKIAkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX1NIQVJFRCk7CkBAIC0yNTYsNyArMjUyLDcgQEAKIAkJfQogCX0KIAotCXhmc19yd19lbnRlcl90cmFjZShYRlNfUkVBRF9FTlRFUiwgJmlwLT5pX2lvY29yZSwKKwl4ZnNfcndfZW50ZXJfdHJhY2UoWEZTX1JFQURfRU5URVIsIGlwLAogCQkJCSh2b2lkICopaW92cCwgc2VncywgKm9mZnNldCwgaW9mbGFncyk7CiAKIAlpb2NiLT5raV9wb3MgPSAqb2Zmc2V0OwpAQCAtMzAxLDcgKzI5Nyw3IEBACiAJCQlyZXR1cm4gLWVycm9yOwogCQl9CiAJfQotCXhmc19yd19lbnRlcl90cmFjZShYRlNfU1BMSUNFX1JFQURfRU5URVIsICZpcC0+aV9pb2NvcmUsCisJeGZzX3J3X2VudGVyX3RyYWNlKFhGU19TUExJQ0VfUkVBRF9FTlRFUiwgaXAsCiAJCQkgICBwaXBlLCBjb3VudCwgKnBwb3MsIGlvZmxhZ3MpOwogCXJldCA9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZChpbmZpbHAsIHBwb3MsIHBpcGUsIGNvdW50LCBmbGFncyk7CiAJaWYgKHJldCA+IDApCkBAIC0zMjMsNyArMzE5LDYgQEAKIHsKIAliaHZfdm5vZGVfdAkJKnZwID0gWEZTX0lUT1YoaXApOwogCXhmc19tb3VudF90CQkqbXAgPSBpcC0+aV9tb3VudDsKLQl4ZnNfaW9jb3JlX3QJCSppbyA9ICZpcC0+aV9pb2NvcmU7CiAJc3NpemVfdAkJCXJldDsKIAlzdHJ1Y3QgaW5vZGUJCSppbm9kZSA9IG91dGZpbHAtPmZfbWFwcGluZy0+aG9zdDsKIAl4ZnNfZnNpemVfdAkJaXNpemUsIG5ld19zaXplOwpAQCAtMzUwLDEwICszNDUsMTAgQEAKIAogCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwogCWlmIChuZXdfc2l6ZSA+IGlwLT5pX3NpemUpCi0JCWlvLT5pb19uZXdfc2l6ZSA9IG5ld19zaXplOworCQlpcC0+aV9uZXdfc2l6ZSA9IG5ld19zaXplOwogCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAKLQl4ZnNfcndfZW50ZXJfdHJhY2UoWEZTX1NQTElDRV9XUklURV9FTlRFUiwgJmlwLT5pX2lvY29yZSwKKwl4ZnNfcndfZW50ZXJfdHJhY2UoWEZTX1NQTElDRV9XUklURV9FTlRFUiwgaXAsCiAJCQkgICBwaXBlLCBjb3VudCwgKnBwb3MsIGlvZmxhZ3MpOwogCXJldCA9IGdlbmVyaWNfZmlsZV9zcGxpY2Vfd3JpdGUocGlwZSwgb3V0ZmlscCwgcHBvcywgY291bnQsIGZsYWdzKTsKIAlpZiAocmV0ID4gMCkKQEAgLTM3MCw5ICszNjUsOSBAQAogCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwogCX0KIAotCWlmIChpby0+aW9fbmV3X3NpemUpIHsKKwlpZiAoaXAtPmlfbmV3X3NpemUpIHsKIAkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JCWlvLT5pb19uZXdfc2l6ZSA9IDA7CisJCWlwLT5pX25ld19zaXplID0gMDsKIAkJaWYgKGlwLT5pX2QuZGlfc2l6ZSA+IGlwLT5pX3NpemUpCiAJCQlpcC0+aV9kLmRpX3NpemUgPSBpcC0+aV9zaXplOwogCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwpAQCAtMzg5LDIwICszODQsMTkgQEAKICAqLwogU1RBVElDIGludAkJCQkvKiBlcnJvciAocG9zaXRpdmUpICovCiB4ZnNfemVyb19sYXN0X2Jsb2NrKAotCXN0cnVjdCBpbm9kZQkqaXAsCi0JeGZzX2lvY29yZV90CSppbywKKwl4ZnNfaW5vZGVfdAkqaXAsCiAJeGZzX2ZzaXplX3QJb2Zmc2V0LAogCXhmc19mc2l6ZV90CWlzaXplKQogewogCXhmc19maWxlb2ZmX3QJbGFzdF9mc2I7Ci0JeGZzX21vdW50X3QJKm1wID0gaW8tPmlvX21vdW50OworCXhmc19tb3VudF90CSptcCA9IGlwLT5pX21vdW50OwogCWludAkJbmltYXBzOwogCWludAkJemVyb19vZmZzZXQ7CiAJaW50CQl6ZXJvX2xlbjsKIAlpbnQJCWVycm9yID0gMDsKIAl4ZnNfYm1idF9pcmVjX3QJaW1hcDsKIAotCUFTU0VSVChpc21ybG9ja2VkKGlvLT5pb19sb2NrLCBNUl9VUERBVEUpICE9IDApOworCUFTU0VSVChpc21ybG9ja2VkKCZpcC0+aV9sb2NrLCBNUl9VUERBVEUpICE9IDApOwogCiAJemVyb19vZmZzZXQgPSBYRlNfQl9GU0JfT0ZGU0VUKG1wLCBpc2l6ZSk7CiAJaWYgKHplcm9fb2Zmc2V0ID09IDApIHsKQEAgLTQxNSw3ICs0MDksNyBAQAogCiAJbGFzdF9mc2IgPSBYRlNfQl9UT19GU0JUKG1wLCBpc2l6ZSk7CiAJbmltYXBzID0gMTsKLQllcnJvciA9IFhGU19CTUFQSShtcCwgTlVMTCwgaW8sIGxhc3RfZnNiLCAxLCAwLCBOVUxMLCAwLCAmaW1hcCwKKwllcnJvciA9IHhmc19ibWFwaShOVUxMLCBpcCwgbGFzdF9mc2IsIDEsIDAsIE5VTEwsIDAsICZpbWFwLAogCQkJICAmbmltYXBzLCBOVUxMLCBOVUxMKTsKIAlpZiAoZXJyb3IpIHsKIAkJcmV0dXJuIGVycm9yOwpAQCAtNDMzLDE0ICs0MjcsMTQgQEAKIAkgKiBvdXQgc3luYy4gIFdlIG5lZWQgdG8gZHJvcCB0aGUgaWxvY2sgd2hpbGUgd2UgZG8gdGhpcyBzbyB3ZQogCSAqIGRvbid0IGRlYWRsb2NrIHdoZW4gdGhlIGJ1ZmZlciBjYWNoZSBjYWxscyBiYWNrIHRvIHVzLgogCSAqLwotCVhGU19JVU5MT0NLKG1wLCBpbywgWEZTX0lMT0NLX0VYQ0x8IFhGU19FWFRTSVpFX1JEKTsKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0x8IFhGU19FWFRTSVpFX1JEKTsKIAogCXplcm9fbGVuID0gbXAtPm1fc2Iuc2JfYmxvY2tzaXplIC0gemVyb19vZmZzZXQ7CiAJaWYgKGlzaXplICsgemVyb19sZW4gPiBvZmZzZXQpCiAJCXplcm9fbGVuID0gb2Zmc2V0IC0gaXNpemU7CiAJZXJyb3IgPSB4ZnNfaW96ZXJvKGlwLCBpc2l6ZSwgemVyb19sZW4pOwogCi0JWEZTX0lMT0NLKG1wLCBpbywgWEZTX0lMT0NLX0VYQ0x8WEZTX0VYVFNJWkVfUkQpOworCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0x8WEZTX0VYVFNJWkVfUkQpOwogCUFTU0VSVChlcnJvciA+PSAwKTsKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC00NTgsMzUgKzQ1MiwzMyBAQAogCiBpbnQJCQkJCS8qIGVycm9yIChwb3NpdGl2ZSkgKi8KIHhmc196ZXJvX2VvZigKLQliaHZfdm5vZGVfdAkqdnAsCi0JeGZzX2lvY29yZV90CSppbywKKwl4ZnNfaW5vZGVfdAkqaXAsCiAJeGZzX29mZl90CW9mZnNldCwJCS8qIHN0YXJ0aW5nIEkvTyBvZmZzZXQgKi8KIAl4ZnNfZnNpemVfdAlpc2l6ZSkJCS8qIGN1cnJlbnQgaW5vZGUgc2l6ZSAqLwogewotCXN0cnVjdCBpbm9kZQkqaXAgPSB2bl90b19pbm9kZSh2cCk7CisJeGZzX21vdW50X3QJKm1wID0gaXAtPmlfbW91bnQ7CiAJeGZzX2ZpbGVvZmZfdAlzdGFydF96ZXJvX2ZzYjsKIAl4ZnNfZmlsZW9mZl90CWVuZF96ZXJvX2ZzYjsKIAl4ZnNfZmlsZW9mZl90CXplcm9fY291bnRfZnNiOwogCXhmc19maWxlb2ZmX3QJbGFzdF9mc2I7CiAJeGZzX2ZpbGVvZmZfdAl6ZXJvX29mZjsKIAl4ZnNfZnNpemVfdAl6ZXJvX2xlbjsKLQl4ZnNfbW91bnRfdAkqbXAgPSBpby0+aW9fbW91bnQ7CiAJaW50CQluaW1hcHM7CiAJaW50CQllcnJvciA9IDA7CiAJeGZzX2JtYnRfaXJlY190CWltYXA7CiAKLQlBU1NFUlQoaXNtcmxvY2tlZChpby0+aW9fbG9jaywgTVJfVVBEQVRFKSk7Ci0JQVNTRVJUKGlzbXJsb2NrZWQoaW8tPmlvX2lvbG9jaywgTVJfVVBEQVRFKSk7CisJQVNTRVJUKGlzbXJsb2NrZWQoJmlwLT5pX2xvY2ssIE1SX1VQREFURSkpOworCUFTU0VSVChpc21ybG9ja2VkKCZpcC0+aV9pb2xvY2ssIE1SX1VQREFURSkpOwogCUFTU0VSVChvZmZzZXQgPiBpc2l6ZSk7CiAKIAkvKgogCSAqIEZpcnN0IGhhbmRsZSB6ZXJvaW5nIHRoZSBibG9jayBvbiB3aGljaCBpc2l6ZSByZXNpZGVzLgogCSAqIFdlIG9ubHkgemVybyBhIHBhcnQgb2YgdGhhdCBibG9jayBzbyBpdCBpcyBoYW5kbGVkIHNwZWNpYWxseS4KIAkgKi8KLQllcnJvciA9IHhmc196ZXJvX2xhc3RfYmxvY2soaXAsIGlvLCBvZmZzZXQsIGlzaXplKTsKKwllcnJvciA9IHhmc196ZXJvX2xhc3RfYmxvY2soaXAsIG9mZnNldCwgaXNpemUpOwogCWlmIChlcnJvcikgewotCQlBU1NFUlQoaXNtcmxvY2tlZChpby0+aW9fbG9jaywgTVJfVVBEQVRFKSk7Ci0JCUFTU0VSVChpc21ybG9ja2VkKGlvLT5pb19pb2xvY2ssIE1SX1VQREFURSkpOworCQlBU1NFUlQoaXNtcmxvY2tlZCgmaXAtPmlfbG9jaywgTVJfVVBEQVRFKSk7CisJCUFTU0VSVChpc21ybG9ja2VkKCZpcC0+aV9pb2xvY2ssIE1SX1VQREFURSkpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQogCkBAIC01MTQsMTEgKzUwNiwxMSBAQAogCXdoaWxlIChzdGFydF96ZXJvX2ZzYiA8PSBlbmRfemVyb19mc2IpIHsKIAkJbmltYXBzID0gMTsKIAkJemVyb19jb3VudF9mc2IgPSBlbmRfemVyb19mc2IgLSBzdGFydF96ZXJvX2ZzYiArIDE7Ci0JCWVycm9yID0gWEZTX0JNQVBJKG1wLCBOVUxMLCBpbywgc3RhcnRfemVyb19mc2IsIHplcm9fY291bnRfZnNiLAorCQllcnJvciA9IHhmc19ibWFwaShOVUxMLCBpcCwgc3RhcnRfemVyb19mc2IsIHplcm9fY291bnRfZnNiLAogCQkJCSAgMCwgTlVMTCwgMCwgJmltYXAsICZuaW1hcHMsIE5VTEwsIE5VTEwpOwogCQlpZiAoZXJyb3IpIHsKLQkJCUFTU0VSVChpc21ybG9ja2VkKGlvLT5pb19sb2NrLCBNUl9VUERBVEUpKTsKLQkJCUFTU0VSVChpc21ybG9ja2VkKGlvLT5pb19pb2xvY2ssIE1SX1VQREFURSkpOworCQkJQVNTRVJUKGlzbXJsb2NrZWQoJmlwLT5pX2xvY2ssIE1SX1VQREFURSkpOworCQkJQVNTRVJUKGlzbXJsb2NrZWQoJmlwLT5pX2lvbG9jaywgTVJfVVBEQVRFKSk7CiAJCQlyZXR1cm4gZXJyb3I7CiAJCX0KIAkJQVNTRVJUKG5pbWFwcyA+IDApOwpAQCAtNTQyLDcgKzUzNCw3IEBACiAJCSAqIERyb3AgdGhlIGlub2RlIGxvY2sgd2hpbGUgd2UncmUgZG9pbmcgdGhlIEkvTy4KIAkJICogV2UnbGwgc3RpbGwgaGF2ZSB0aGUgaW9sb2NrIHRvIHByb3RlY3QgdXMuCiAJCSAqLwotCQlYRlNfSVVOTE9DSyhtcCwgaW8sIFhGU19JTE9DS19FWENMfFhGU19FWFRTSVpFX1JEKTsKKwkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMfFhGU19FWFRTSVpFX1JEKTsKIAogCQl6ZXJvX29mZiA9IFhGU19GU0JfVE9fQihtcCwgc3RhcnRfemVyb19mc2IpOwogCQl6ZXJvX2xlbiA9IFhGU19GU0JfVE9fQihtcCwgaW1hcC5icl9ibG9ja2NvdW50KTsKQEAgLTU1OCwxNCArNTUwLDEzIEBACiAJCXN0YXJ0X3plcm9fZnNiID0gaW1hcC5icl9zdGFydG9mZiArIGltYXAuYnJfYmxvY2tjb3VudDsKIAkJQVNTRVJUKHN0YXJ0X3plcm9fZnNiIDw9IChlbmRfemVyb19mc2IgKyAxKSk7CiAKLQkJWEZTX0lMT0NLKG1wLCBpbywgWEZTX0lMT0NLX0VYQ0x8WEZTX0VYVFNJWkVfUkQpOworCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMfFhGU19FWFRTSVpFX1JEKTsKIAl9CiAKIAlyZXR1cm4gMDsKIAogb3V0X2xvY2s6Ci0KLQlYRlNfSUxPQ0sobXAsIGlvLCBYRlNfSUxPQ0tfRVhDTHxYRlNfRVhUU0laRV9SRCk7CisJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTHxYRlNfRVhUU0laRV9SRCk7CiAJQVNTRVJUKGVycm9yID49IDApOwogCXJldHVybiBlcnJvcjsKIH0KQEAgLTU4Nyw3ICs1NzgsNiBAQAogCXhmc19tb3VudF90CQkqbXA7CiAJc3NpemVfdAkJCXJldCA9IDAsIGVycm9yID0gMDsKIAl4ZnNfZnNpemVfdAkJaXNpemUsIG5ld19zaXplOwotCXhmc19pb2NvcmVfdAkJKmlvOwogCWludAkJCWlvbG9jazsKIAlpbnQJCQlldmVudHNlbnQgPSAwOwogCWJodl92cndsb2NrX3QJCWxvY2t0eXBlOwpAQCAtNjA3LDggKzU5Nyw3IEBACiAJaWYgKGNvdW50ID09IDApCiAJCXJldHVybiAwOwogCi0JaW8gPSAmeGlwLT5pX2lvY29yZTsKLQltcCA9IGlvLT5pb19tb3VudDsKKwltcCA9IHhpcC0+aV9tb3VudDsKIAogCXhmc193YWl0X2Zvcl9mcmVlemUobXAsIFNCX0ZSRUVaRV9XUklURSk7CiAKQEAgLTY2Nyw3ICs2NTYsNyBAQAogCiAJaWYgKGlvZmxhZ3MgJiBJT19JU0RJUkVDVCkgewogCQl4ZnNfYnVmdGFyZ190CSp0YXJnZXQgPQotCQkJKHhpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSkgPworCQkJWEZTX0lTX1JFQUxUSU1FX0lOT0RFKHhpcCkgPwogCQkJCW1wLT5tX3J0ZGV2X3RhcmdwIDogbXAtPm1fZGRldl90YXJncDsKIAogCQlpZiAoKHBvcyAmIHRhcmdldC0+YnRfc21hc2spIHx8IChjb3VudCAmIHRhcmdldC0+YnRfc21hc2spKSB7CkBAIC02ODgsNyArNjc3LDcgQEAKIAogCW5ld19zaXplID0gcG9zICsgY291bnQ7CiAJaWYgKG5ld19zaXplID4geGlwLT5pX3NpemUpCi0JCWlvLT5pb19uZXdfc2l6ZSA9IG5ld19zaXplOworCQl4aXAtPmlfbmV3X3NpemUgPSBuZXdfc2l6ZTsKIAogCWlmIChsaWtlbHkoIShpb2ZsYWdzICYgSU9fSU5WSVMpKSkgewogCQlmaWxlX3VwZGF0ZV90aW1lKGZpbGUpOwpAQCAtNzA2LDcgKzY5NSw3IEBACiAJICovCiAKIAlpZiAocG9zID4geGlwLT5pX3NpemUpIHsKLQkJZXJyb3IgPSB4ZnNfemVyb19lb2YodnAsIGlvLCBwb3MsIHhpcC0+aV9zaXplKTsKKwkJZXJyb3IgPSB4ZnNfemVyb19lb2YoeGlwLCBwb3MsIHhpcC0+aV9zaXplKTsKIAkJaWYgKGVycm9yKSB7CiAJCQl4ZnNfaXVubG9jayh4aXAsIFhGU19JTE9DS19FWENMKTsKIAkJCWdvdG8gb3V0X3VubG9ja19pbnRlcm5hbDsKQEAgLTc0MCwxMCArNzI5LDEwIEBACiAJaWYgKChpb2ZsYWdzICYgSU9fSVNESVJFQ1QpKSB7CiAJCWlmIChWTl9DQUNIRUQodnApKSB7CiAJCQlXQVJOX09OKG5lZWRfaV9tdXRleCA9PSAwKTsKLQkJCXhmc19pbnZhbF9jYWNoZWRfdHJhY2UoaW8sIHBvcywgLTEsCi0JCQkJCWN0b29mZihvZmZ0b2N0KHBvcykpLCAtMSk7CisJCQl4ZnNfaW52YWxfY2FjaGVkX3RyYWNlKHhpcCwgcG9zLCAtMSwKKwkJCQkJKHBvcyAmIFBBR0VfQ0FDSEVfTUFTSyksIC0xKTsKIAkJCWVycm9yID0geGZzX2ZsdXNoaW52YWxfcGFnZXMoeGlwLAotCQkJCQljdG9vZmYob2ZmdG9jdChwb3MpKSwKKwkJCQkJKHBvcyAmIFBBR0VfQ0FDSEVfTUFTSyksCiAJCQkJCS0xLCBGSV9SRU1BUEZfTE9DS0VEKTsKIAkJCWlmIChlcnJvcikKIAkJCQlnb3RvIG91dF91bmxvY2tfaW50ZXJuYWw7CkBAIC03NTEsNyArNzQwLDcgQEAKIAogCQlpZiAobmVlZF9pX211dGV4KSB7CiAJCQkvKiBkZW1vdGUgdGhlIGxvY2sgbm93IHRoZSBjYWNoZWQgcGFnZXMgYXJlIGdvbmUgKi8KLQkJCVhGU19JTE9DS19ERU1PVEUobXAsIGlvLCBYRlNfSU9MT0NLX0VYQ0wpOworCQkJeGZzX2lsb2NrX2RlbW90ZSh4aXAsIFhGU19JT0xPQ0tfRVhDTCk7CiAJCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAogCQkJaW9sb2NrID0gWEZTX0lPTE9DS19TSEFSRUQ7CkBAIC03NTksNyArNzQ4LDcgQEAKIAkJCW5lZWRfaV9tdXRleCA9IDA7CiAJCX0KIAotIAkJeGZzX3J3X2VudGVyX3RyYWNlKFhGU19ESU9XUl9FTlRFUiwgaW8sICh2b2lkICopaW92cCwgc2VncywKKyAJCXhmc19yd19lbnRlcl90cmFjZShYRlNfRElPV1JfRU5URVIsIHhpcCwgKHZvaWQgKilpb3ZwLCBzZWdzLAogCQkJCSpvZmZzZXQsIGlvZmxhZ3MpOwogCQlyZXQgPSBnZW5lcmljX2ZpbGVfZGlyZWN0X3dyaXRlKGlvY2IsIGlvdnAsCiAJCQkJJnNlZ3MsIHBvcywgb2Zmc2V0LCBjb3VudCwgb2NvdW50KTsKQEAgLTc3OSw3ICs3NjgsNyBAQAogCQkJZ290byByZWxvY2s7CiAJCX0KIAl9IGVsc2UgewotCQl4ZnNfcndfZW50ZXJfdHJhY2UoWEZTX1dSSVRFX0VOVEVSLCBpbywgKHZvaWQgKilpb3ZwLCBzZWdzLAorCQl4ZnNfcndfZW50ZXJfdHJhY2UoWEZTX1dSSVRFX0VOVEVSLCB4aXAsICh2b2lkICopaW92cCwgc2VncywKIAkJCQkqb2Zmc2V0LCBpb2ZsYWdzKTsKIAkJcmV0ID0gZ2VuZXJpY19maWxlX2J1ZmZlcmVkX3dyaXRlKGlvY2IsIGlvdnAsIHNlZ3MsCiAJCQkJcG9zLCBvZmZzZXQsIGNvdW50LCByZXQpOwpAQCAtODQzLDkgKzgzMiw5IEBACiAJfQogCiAgb3V0X3VubG9ja19pbnRlcm5hbDoKLQlpZiAoaW8tPmlvX25ld19zaXplKSB7CisJaWYgKHhpcC0+aV9uZXdfc2l6ZSkgewogCQl4ZnNfaWxvY2soeGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JCWlvLT5pb19uZXdfc2l6ZSA9IDA7CisJCXhpcC0+aV9uZXdfc2l6ZSA9IDA7CiAJCS8qCiAJCSAqIElmIHRoaXMgd2FzIGEgZGlyZWN0IG9yIHN5bmNocm9ub3VzIEkvTyB0aGF0IGZhaWxlZCAoc3VjaAogCQkgKiBhcyBFTk9TUEMpIHRoZW4gcGFydCBvZiB0aGUgSS9PIG1heSBoYXZlIGJlZW4gd3JpdHRlbiB0bwpAQCAtODk0LDI1ICs4ODMsNiBAQAogCX0KIH0KIAotCi1pbnQKLXhmc19ibWFwKAotCXhmc19pbm9kZV90CSppcCwKLQl4ZnNfb2ZmX3QJb2Zmc2V0LAotCXNzaXplX3QJCWNvdW50LAotCWludAkJZmxhZ3MsCi0JeGZzX2lvbWFwX3QJKmlvbWFwcCwKLQlpbnQJCSpuaW9tYXBzKQotewotCXhmc19pb2NvcmVfdAkqaW8gPSAmaXAtPmlfaW9jb3JlOwotCi0JQVNTRVJUKChpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZSRUcpOwotCUFTU0VSVCgoKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKSAhPSAwKSA9PQotCSAgICAgICAoKGlwLT5pX2lvY29yZS5pb19mbGFncyAmIFhGU19JT0NPUkVfUlQpICE9IDApKTsKLQotCXJldHVybiB4ZnNfaW9tYXAoaW8sIG9mZnNldCwgY291bnQsIGZsYWdzLCBpb21hcHAsIG5pb21hcHMpOwotfQotCiAvKgogICogV3JhcHBlciBhcm91bmQgYmRzdHJhdCBzbyB0aGF0IHdlIGNhbiBzdG9wIGRhdGEKICAqIGZyb20gZ29pbmcgdG8gZGlzayBpbiBjYXNlIHdlIGFyZSBzaHV0dGluZyBkb3duIHRoZSBmaWxlc3lzdGVtLgpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmggYi9mcy94ZnMvbGludXgtMi42L3hmc19scncuaAppbmRleCA0Yjc3NDdhLi5lMjAwMjUzIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19scncuaAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19scncuaApAQCAtMTksNyArMTksNiBAQAogI2RlZmluZSBfX1hGU19MUldfSF9fCiAKIHN0cnVjdCB4ZnNfbW91bnQ7Ci1zdHJ1Y3QgeGZzX2lvY29yZTsKIHN0cnVjdCB4ZnNfaW5vZGU7CiBzdHJ1Y3QgeGZzX2JtYnRfaXJlYzsKIHN0cnVjdCB4ZnNfYnVmOwpAQCAtNjAsMjAgKzU5LDE5IEBACiAjZGVmaW5lCVhGU19JT01BUF9VTldSSVRURU4JMjcKICNkZWZpbmUgWEZTX1NQTElDRV9SRUFEX0VOVEVSCTI4CiAjZGVmaW5lIFhGU19TUExJQ0VfV1JJVEVfRU5URVIJMjkKLWV4dGVybiB2b2lkIHhmc19yd19lbnRlcl90cmFjZShpbnQsIHN0cnVjdCB4ZnNfaW9jb3JlICosCi0JCQkJdm9pZCAqLCBzaXplX3QsIGxvZmZfdCwgaW50KTsKLWV4dGVybiB2b2lkIHhmc19pbnZhbF9jYWNoZWRfdHJhY2Uoc3RydWN0IHhmc19pb2NvcmUgKiwKLQkJCQl4ZnNfb2ZmX3QsIHhmc19vZmZfdCwgeGZzX29mZl90LCB4ZnNfb2ZmX3QpOworZXh0ZXJuIHZvaWQgeGZzX3J3X2VudGVyX3RyYWNlKGludCwgc3RydWN0IHhmc19pbm9kZSAqLAorCQl2b2lkICosIHNpemVfdCwgbG9mZl90LCBpbnQpOworZXh0ZXJuIHZvaWQgeGZzX2ludmFsX2NhY2hlZF90cmFjZShzdHJ1Y3QgeGZzX2lub2RlICosCisJCXhmc19vZmZfdCwgeGZzX29mZl90LCB4ZnNfb2ZmX3QsIHhmc19vZmZfdCk7CiAjZWxzZQotI2RlZmluZSB4ZnNfcndfZW50ZXJfdHJhY2UodGFnLCBpbywgZGF0YSwgc2l6ZSwgb2Zmc2V0LCBpb2ZsYWdzKQotI2RlZmluZSB4ZnNfaW52YWxfY2FjaGVkX3RyYWNlKGlvLCBvZmZzZXQsIGxlbiwgZmlyc3QsIGxhc3QpCisjZGVmaW5lIHhmc19yd19lbnRlcl90cmFjZSh0YWcsIGlwLCBkYXRhLCBzaXplLCBvZmZzZXQsIGlvZmxhZ3MpCisjZGVmaW5lIHhmc19pbnZhbF9jYWNoZWRfdHJhY2UoaXAsIG9mZnNldCwgbGVuLCBmaXJzdCwgbGFzdCkKICNlbmRpZgogCiBleHRlcm4gaW50IHhmc2Jkc3RyYXQoc3RydWN0IHhmc19tb3VudCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqKTsKIGV4dGVybiBpbnQgeGZzX2Jkc3RyYXRfY2Ioc3RydWN0IHhmc19idWYgKik7CiBleHRlcm4gaW50IHhmc19kZXZfaXNfcmVhZF9vbmx5KHN0cnVjdCB4ZnNfbW91bnQgKiwgY2hhciAqKTsKIAotZXh0ZXJuIGludCB4ZnNfemVyb19lb2Yoc3RydWN0IGlub2RlICosIHN0cnVjdCB4ZnNfaW9jb3JlICosIHhmc19vZmZfdCwKLQkJCQl4ZnNfZnNpemVfdCk7CitleHRlcm4gaW50IHhmc196ZXJvX2VvZihzdHJ1Y3QgeGZzX2lub2RlICosIHhmc19vZmZfdCwgeGZzX2ZzaXplX3QpOwogCiAjZW5kaWYJLyogX19YRlNfTFJXX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKaW5kZXggOGNiNjNjNi4uMjFkZmM5ZCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCisjaW5jbHVkZSAieGZzX2Zzb3BzLmgiCiAjaW5jbHVkZSAieGZzX3J3LmgiCiAjaW5jbHVkZSAieGZzX2FjbC5oIgogI2luY2x1ZGUgInhmc19hdHRyLmgiCkBAIC00OSw2ICs1MCw4IEBACiAjaW5jbHVkZSAieGZzX3Zub2Rlb3BzLmgiCiAjaW5jbHVkZSAieGZzX3Zmc29wcy5oIgogI2luY2x1ZGUgInhmc192ZXJzaW9uLmgiCisjaW5jbHVkZSAieGZzX2xvZ19wcml2LmgiCisjaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKIAogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtODcsNiArOTAsNDM1IEBACiAJcmV0dXJuIGFyZ3M7CiB9CiAKKyNkZWZpbmUgTU5UT1BUX0xPR0JVRlMJImxvZ2J1ZnMiCS8qIG51bWJlciBvZiBYRlMgbG9nIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgTU5UT1BUX0xPR0JTSVpFCSJsb2dic2l6ZSIJLyogc2l6ZSBvZiBYRlMgbG9nIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgTU5UT1BUX0xPR0RFVgkibG9nZGV2IgkvKiBsb2cgZGV2aWNlICovCisjZGVmaW5lIE1OVE9QVF9SVERFVgkicnRkZXYiCQkvKiByZWFsdGltZSBJL08gZGV2aWNlICovCisjZGVmaW5lIE1OVE9QVF9CSU9TSVpFCSJiaW9zaXplIgkvKiBsb2cyIG9mIHByZWZlcnJlZCBidWZmZXJlZCBpbyBzaXplICovCisjZGVmaW5lIE1OVE9QVF9XU1lOQwkid3N5bmMiCQkvKiBzYWZlLW1vZGUgbmZzIGNvbXBhdGlibGUgbW91bnQgKi8KKyNkZWZpbmUgTU5UT1BUX0lOTzY0CSJpbm82NCIJCS8qIGZvcmNlIGlub2RlcyBpbnRvIDY0LWJpdCByYW5nZSAqLworI2RlZmluZSBNTlRPUFRfTk9BTElHTgkibm9hbGlnbiIJLyogdHVybiBvZmYgc3RyaXBlIGFsaWdubWVudCAqLworI2RlZmluZSBNTlRPUFRfU1dBTExPQwkic3dhbGxvYyIJLyogdHVybiBvbiBzdHJpcGUgd2lkdGggYWxsb2NhdGlvbiAqLworI2RlZmluZSBNTlRPUFRfU1VOSVQJInN1bml0IgkJLyogZGF0YSB2b2x1bWUgc3RyaXBlIHVuaXQgKi8KKyNkZWZpbmUgTU5UT1BUX1NXSURUSAkic3dpZHRoIgkvKiBkYXRhIHZvbHVtZSBzdHJpcGUgd2lkdGggKi8KKyNkZWZpbmUgTU5UT1BUX05PVVVJRAkibm91dWlkIgkvKiBpZ25vcmUgZmlsZXN5c3RlbSBVVUlEICovCisjZGVmaW5lIE1OVE9QVF9NVFBUCSJtdHB0IgkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworI2RlZmluZSBNTlRPUFRfR1JQSUQJImdycGlkIgkJLyogZ3JvdXAtSUQgZnJvbSBwYXJlbnQgZGlyZWN0b3J5ICovCisjZGVmaW5lIE1OVE9QVF9OT0dSUElECSJub2dycGlkIgkvKiBncm91cC1JRCBmcm9tIGN1cnJlbnQgcHJvY2VzcyAqLworI2RlZmluZSBNTlRPUFRfQlNER1JPVVBTICAgICJic2Rncm91cHMiICAgIC8qIGdyb3VwLUlEIGZyb20gcGFyZW50IGRpcmVjdG9yeSAqLworI2RlZmluZSBNTlRPUFRfU1lTVkdST1VQUyAgICJzeXN2Z3JvdXBzIiAgIC8qIGdyb3VwLUlEIGZyb20gY3VycmVudCBwcm9jZXNzICovCisjZGVmaW5lIE1OVE9QVF9BTExPQ1NJWkUgICAgImFsbG9jc2l6ZSIgICAgLyogcHJlZmVycmVkIGFsbG9jYXRpb24gc2l6ZSAqLworI2RlZmluZSBNTlRPUFRfTk9SRUNPVkVSWSAgICJub3JlY292ZXJ5IiAgIC8qIGRvbid0IHJ1biBYRlMgcmVjb3ZlcnkgKi8KKyNkZWZpbmUgTU5UT1BUX0JBUlJJRVIJImJhcnJpZXIiCS8qIHVzZSB3cml0ZXIgYmFycmllcnMgZm9yIGxvZyB3cml0ZSBhbmQKKwkJCQkJICogdW53cml0dGVuIGV4dGVudCBjb252ZXJzaW9uICovCisjZGVmaW5lIE1OVE9QVF9OT0JBUlJJRVIgIm5vYmFycmllciIJLyogLi4gZGlzYWJsZSAqLworI2RlZmluZSBNTlRPUFRfT1NZTkNJU09TWU5DICJvc3luY2lzb3N5bmMiIC8qIG9fc3luYyBpcyBSRUFMTFkgb19zeW5jICovCisjZGVmaW5lIE1OVE9QVF82NEJJVElOT0RFICAgImlub2RlNjQiCS8qIGlub2RlcyBjYW4gYmUgYWxsb2NhdGVkIGFueXdoZXJlICovCisjZGVmaW5lIE1OVE9QVF9JS0VFUAkiaWtlZXAiCQkvKiBkbyBub3QgZnJlZSBlbXB0eSBpbm9kZSBjbHVzdGVycyAqLworI2RlZmluZSBNTlRPUFRfTk9JS0VFUAkibm9pa2VlcCIJLyogZnJlZSBlbXB0eSBpbm9kZSBjbHVzdGVycyAqLworI2RlZmluZSBNTlRPUFRfTEFSR0VJTwkgICAibGFyZ2VpbyIJLyogcmVwb3J0IGxhcmdlIEkvTyBzaXplcyBpbiBzdGF0KCkgKi8KKyNkZWZpbmUgTU5UT1BUX05PTEFSR0VJTyAgICJub2xhcmdlaW8iCS8qIGRvIG5vdCByZXBvcnQgbGFyZ2UgSS9PIHNpemVzCisJCQkJCSAqIGluIHN0YXQoKS4gKi8KKyNkZWZpbmUgTU5UT1BUX0FUVFIyCSJhdHRyMiIJCS8qIGRvIHVzZSBhdHRyMiBhdHRyaWJ1dGUgZm9ybWF0ICovCisjZGVmaW5lIE1OVE9QVF9OT0FUVFIyCSJub2F0dHIyIgkvKiBkbyBub3QgdXNlIGF0dHIyIGF0dHJpYnV0ZSBmb3JtYXQgKi8KKyNkZWZpbmUgTU5UT1BUX0ZJTEVTVFJFQU0gICJmaWxlc3RyZWFtcyIgLyogdXNlIGZpbGVzdHJlYW1zIGFsbG9jYXRvciAqLworI2RlZmluZSBNTlRPUFRfUVVPVEEJInF1b3RhIgkJLyogZGlzayBxdW90YXMgKHVzZXIpICovCisjZGVmaW5lIE1OVE9QVF9OT1FVT1RBCSJub3F1b3RhIgkvKiBubyBxdW90YXMgKi8KKyNkZWZpbmUgTU5UT1BUX1VTUlFVT1RBCSJ1c3JxdW90YSIJLyogdXNlciBxdW90YSBlbmFibGVkICovCisjZGVmaW5lIE1OVE9QVF9HUlBRVU9UQQkiZ3JwcXVvdGEiCS8qIGdyb3VwIHF1b3RhIGVuYWJsZWQgKi8KKyNkZWZpbmUgTU5UT1BUX1BSSlFVT1RBCSJwcmpxdW90YSIJLyogcHJvamVjdCBxdW90YSBlbmFibGVkICovCisjZGVmaW5lIE1OVE9QVF9VUVVPVEEJInVxdW90YSIJLyogdXNlciBxdW90YSAoSVJJWCB2YXJpYW50KSAqLworI2RlZmluZSBNTlRPUFRfR1FVT1RBCSJncXVvdGEiCS8qIGdyb3VwIHF1b3RhIChJUklYIHZhcmlhbnQpICovCisjZGVmaW5lIE1OVE9QVF9QUVVPVEEJInBxdW90YSIJLyogcHJvamVjdCBxdW90YSAoSVJJWCB2YXJpYW50KSAqLworI2RlZmluZSBNTlRPUFRfVVFVT1RBTk9FTkYgInVxbm9lbmZvcmNlIi8qIHVzZXIgcXVvdGEgbGltaXQgZW5mb3JjZW1lbnQgKi8KKyNkZWZpbmUgTU5UT1BUX0dRVU9UQU5PRU5GICJncW5vZW5mb3JjZSIvKiBncm91cCBxdW90YSBsaW1pdCBlbmZvcmNlbWVudCAqLworI2RlZmluZSBNTlRPUFRfUFFVT1RBTk9FTkYgInBxbm9lbmZvcmNlIi8qIHByb2plY3QgcXVvdGEgbGltaXQgZW5mb3JjZW1lbnQgKi8KKyNkZWZpbmUgTU5UT1BUX1FVT1RBTk9FTkYgICJxbm9lbmZvcmNlIgkvKiBzYW1lIGFzIHVxbm9lbmZvcmNlICovCisjZGVmaW5lIE1OVE9QVF9ETUFQSQkiZG1hcGkiCQkvKiBETUkgZW5hYmxlZCAoRE1BUEkgLyBYRFNNKSAqLworI2RlZmluZSBNTlRPUFRfWERTTQkieGRzbSIJCS8qIERNSSBlbmFibGVkIChETUFQSSAvIFhEU00pICovCisjZGVmaW5lIE1OVE9QVF9ETUkJImRtaSIJCS8qIERNSSBlbmFibGVkIChETUFQSSAvIFhEU00pICovCisKK1NUQVRJQyB1bnNpZ25lZCBsb25nCitzdWZmaXhfc3RydG91bChjaGFyICpzLCBjaGFyICoqZW5kcCwgdW5zaWduZWQgaW50IGJhc2UpCit7CisJaW50CWxhc3QsIHNoaWZ0X2xlZnRfZmFjdG9yID0gMDsKKwljaGFyCSp2YWx1ZSA9IHM7CisKKwlsYXN0ID0gc3RybGVuKHZhbHVlKSAtIDE7CisJaWYgKHZhbHVlW2xhc3RdID09ICdLJyB8fCB2YWx1ZVtsYXN0XSA9PSAnaycpIHsKKwkJc2hpZnRfbGVmdF9mYWN0b3IgPSAxMDsKKwkJdmFsdWVbbGFzdF0gPSAnXDAnOworCX0KKwlpZiAodmFsdWVbbGFzdF0gPT0gJ00nIHx8IHZhbHVlW2xhc3RdID09ICdtJykgeworCQlzaGlmdF9sZWZ0X2ZhY3RvciA9IDIwOworCQl2YWx1ZVtsYXN0XSA9ICdcMCc7CisJfQorCWlmICh2YWx1ZVtsYXN0XSA9PSAnRycgfHwgdmFsdWVbbGFzdF0gPT0gJ2cnKSB7CisJCXNoaWZ0X2xlZnRfZmFjdG9yID0gMzA7CisJCXZhbHVlW2xhc3RdID0gJ1wwJzsKKwl9CisKKwlyZXR1cm4gc2ltcGxlX3N0cnRvdWwoKGNvbnN0IGNoYXIgKilzLCBlbmRwLCBiYXNlKSA8PCBzaGlmdF9sZWZ0X2ZhY3RvcjsKK30KKworU1RBVElDIGludAoreGZzX3BhcnNlYXJncygKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwKKwljaGFyCQkJKm9wdGlvbnMsCisJc3RydWN0IHhmc19tb3VudF9hcmdzCSphcmdzLAorCWludAkJCXVwZGF0ZSkKK3sKKwljaGFyCQkJKnRoaXNfY2hhciwgKnZhbHVlLCAqZW92OworCWludAkJCWRzdW5pdCwgZHN3aWR0aCwgdm9sX2RzdW5pdCwgdm9sX2Rzd2lkdGg7CisJaW50CQkJaW9zaXplOworCWludAkJCWlrZWVwID0gMDsKKworCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9CQVJSSUVSOworCWFyZ3MtPmZsYWdzMiB8PSBYRlNNTlQyX0NPTVBBVF9JT1NJWkU7CisKKwlpZiAoIW9wdGlvbnMpCisJCWdvdG8gZG9uZTsKKworCWlvc2l6ZSA9IGRzdW5pdCA9IGRzd2lkdGggPSB2b2xfZHN1bml0ID0gdm9sX2Rzd2lkdGggPSAwOworCisJd2hpbGUgKCh0aGlzX2NoYXIgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJaWYgKCEqdGhpc19jaGFyKQorCQkJY29udGludWU7CisJCWlmICgodmFsdWUgPSBzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCQkJKnZhbHVlKysgPSAwOworCisJCWlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0xPR0JVRlMpKSB7CisJCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpIHsKKwkJCQljbW5fZXJyKENFX1dBUk4sCisJCQkJCSJYRlM6ICVzIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIsCisJCQkJCXRoaXNfY2hhcik7CisJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCX0KKwkJCWFyZ3MtPmxvZ2J1ZnMgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgJmVvdiwgMTApOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTE9HQlNJWkUpKSB7CisJCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpIHsKKwkJCQljbW5fZXJyKENFX1dBUk4sCisJCQkJCSJYRlM6ICVzIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIsCisJCQkJCXRoaXNfY2hhcik7CisJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCX0KKwkJCWFyZ3MtPmxvZ2J1ZnNpemUgPSBzdWZmaXhfc3RydG91bCh2YWx1ZSwgJmVvdiwgMTApOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTE9HREVWKSkgeworCQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKSB7CisJCQkJY21uX2VycihDRV9XQVJOLAorCQkJCQkiWEZTOiAlcyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiLAorCQkJCQl0aGlzX2NoYXIpOworCQkJCXJldHVybiBFSU5WQUw7CisJCQl9CisJCQlzdHJuY3B5KGFyZ3MtPmxvZ25hbWUsIHZhbHVlLCBNQVhOQU1FTEVOKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX01UUFQpKSB7CisJCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpIHsKKwkJCQljbW5fZXJyKENFX1dBUk4sCisJCQkJCSJYRlM6ICVzIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIsCisJCQkJCXRoaXNfY2hhcik7CisJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCX0KKwkJCXN0cm5jcHkoYXJncy0+bXRwdCwgdmFsdWUsIE1BWE5BTUVMRU4pOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfUlRERVYpKSB7CisJCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpIHsKKwkJCQljbW5fZXJyKENFX1dBUk4sCisJCQkJCSJYRlM6ICVzIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIsCisJCQkJCXRoaXNfY2hhcik7CisJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCX0KKwkJCXN0cm5jcHkoYXJncy0+cnRuYW1lLCB2YWx1ZSwgTUFYTkFNRUxFTik7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9CSU9TSVpFKSkgeworCQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKSB7CisJCQkJY21uX2VycihDRV9XQVJOLAorCQkJCQkiWEZTOiAlcyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiLAorCQkJCQl0aGlzX2NoYXIpOworCQkJCXJldHVybiBFSU5WQUw7CisJCQl9CisJCQlpb3NpemUgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgJmVvdiwgMTApOworCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX0lPU0laRTsKKwkJCWFyZ3MtPmlvc2l6ZWxvZyA9ICh1aW50OF90KSBpb3NpemU7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9BTExPQ1NJWkUpKSB7CisJCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpIHsKKwkJCQljbW5fZXJyKENFX1dBUk4sCisJCQkJCSJYRlM6ICVzIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIsCisJCQkJCXRoaXNfY2hhcik7CisJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCX0KKwkJCWlvc2l6ZSA9IHN1ZmZpeF9zdHJ0b3VsKHZhbHVlLCAmZW92LCAxMCk7CisJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfSU9TSVpFOworCQkJYXJncy0+aW9zaXplbG9nID0gZmZzKGlvc2l6ZSkgLSAxOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfR1JQSUQpIHx8CisJCQkgICAhc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0JTREdST1VQUykpIHsKKwkJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9HUlBJRDsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX05PR1JQSUQpIHx8CisJCQkgICAhc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1NZU1ZHUk9VUFMpKSB7CisJCQltcC0+bV9mbGFncyAmPSB+WEZTX01PVU5UX0dSUElEOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfV1NZTkMpKSB7CisJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfV1NZTkM7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9PU1lOQ0lTT1NZTkMpKSB7CisJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfT1NZTkNJU09TWU5DOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTk9SRUNPVkVSWSkpIHsKKwkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9OT1JFQ09WRVJZOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfSU5PNjQpKSB7CisJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfSU5PNjQ7CisjaWYgIVhGU19CSUdfSU5VTVMKKwkJCWNtbl9lcnIoQ0VfV0FSTiwKKwkJCQkiWEZTOiAlcyBvcHRpb24gbm90IGFsbG93ZWQgb24gdGhpcyBzeXN0ZW0iLAorCQkJCXRoaXNfY2hhcik7CisJCQlyZXR1cm4gRUlOVkFMOworI2VuZGlmCisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9OT0FMSUdOKSkgeworCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX05PQUxJR047CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9TV0FMTE9DKSkgeworCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX1NXQUxMT0M7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9TVU5JVCkpIHsKKwkJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkgeworCQkJCWNtbl9lcnIoQ0VfV0FSTiwKKwkJCQkJIlhGUzogJXMgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiwKKwkJCQkJdGhpc19jaGFyKTsKKwkJCQlyZXR1cm4gRUlOVkFMOworCQkJfQorCQkJZHN1bml0ID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsICZlb3YsIDEwKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1NXSURUSCkpIHsKKwkJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkgeworCQkJCWNtbl9lcnIoQ0VfV0FSTiwKKwkJCQkJIlhGUzogJXMgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiwKKwkJCQkJdGhpc19jaGFyKTsKKwkJCQlyZXR1cm4gRUlOVkFMOworCQkJfQorCQkJZHN3aWR0aCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCAmZW92LCAxMCk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF82NEJJVElOT0RFKSkgeworCQkJYXJncy0+ZmxhZ3MgJj0gflhGU01OVF8zMkJJVElOT0RFUzsKKyNpZiAhWEZTX0JJR19JTlVNUworCQkJY21uX2VycihDRV9XQVJOLAorCQkJCSJYRlM6ICVzIG9wdGlvbiBub3QgYWxsb3dlZCBvbiB0aGlzIHN5c3RlbSIsCisJCQkJdGhpc19jaGFyKTsKKwkJCXJldHVybiBFSU5WQUw7CisjZW5kaWYKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX05PVVVJRCkpIHsKKwkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9OT1VVSUQ7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9CQVJSSUVSKSkgeworCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX0JBUlJJRVI7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9OT0JBUlJJRVIpKSB7CisJCQlhcmdzLT5mbGFncyAmPSB+WEZTTU5UX0JBUlJJRVI7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9JS0VFUCkpIHsKKwkJCWlrZWVwID0gMTsKKwkJCWFyZ3MtPmZsYWdzICY9IH5YRlNNTlRfSURFTEVURTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX05PSUtFRVApKSB7CisJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfSURFTEVURTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0xBUkdFSU8pKSB7CisJCQlhcmdzLT5mbGFnczIgJj0gflhGU01OVDJfQ09NUEFUX0lPU0laRTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX05PTEFSR0VJTykpIHsKKwkJCWFyZ3MtPmZsYWdzMiB8PSBYRlNNTlQyX0NPTVBBVF9JT1NJWkU7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9BVFRSMikpIHsKKwkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9BVFRSMjsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX05PQVRUUjIpKSB7CisJCQlhcmdzLT5mbGFncyAmPSB+WEZTTU5UX0FUVFIyOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfRklMRVNUUkVBTSkpIHsKKwkJCWFyZ3MtPmZsYWdzMiB8PSBYRlNNTlQyX0ZJTEVTVFJFQU1TOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTk9RVU9UQSkpIHsKKwkJCWFyZ3MtPmZsYWdzICY9IH4oWEZTTU5UX1VRVU9UQUVORnxYRlNNTlRfVVFVT1RBKTsKKwkJCWFyZ3MtPmZsYWdzICY9IH4oWEZTTU5UX0dRVU9UQUVORnxYRlNNTlRfR1FVT1RBKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1FVT1RBKSB8fAorCQkJICAgIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9VUVVPVEEpIHx8CisJCQkgICAhc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1VTUlFVT1RBKSkgeworCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX1VRVU9UQSB8IFhGU01OVF9VUVVPVEFFTkY7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9RVU9UQU5PRU5GKSB8fAorCQkJICAgIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9VUVVPVEFOT0VORikpIHsKKwkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9VUVVPVEE7CisJCQlhcmdzLT5mbGFncyAmPSB+WEZTTU5UX1VRVU9UQUVORjsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1BRVU9UQSkgfHwKKwkJCSAgICFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfUFJKUVVPVEEpKSB7CisJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfUFFVT1RBIHwgWEZTTU5UX1BRVU9UQUVORjsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1BRVU9UQU5PRU5GKSkgeworCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX1BRVU9UQTsKKwkJCWFyZ3MtPmZsYWdzICY9IH5YRlNNTlRfUFFVT1RBRU5GOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfR1FVT1RBKSB8fAorCQkJICAgIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9HUlBRVU9UQSkpIHsKKwkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9HUVVPVEEgfCBYRlNNTlRfR1FVT1RBRU5GOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfR1FVT1RBTk9FTkYpKSB7CisJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfR1FVT1RBOworCQkJYXJncy0+ZmxhZ3MgJj0gflhGU01OVF9HUVVPVEFFTkY7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9ETUFQSSkpIHsKKwkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9ETUFQSTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1hEU00pKSB7CisJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfRE1BUEk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9ETUkpKSB7CisJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfRE1BUEk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJpaGFzaHNpemUiKSkgeworCQkJY21uX2VycihDRV9XQVJOLAorCSJYRlM6IGloYXNoc2l6ZSBubyBsb25nZXIgdXNlZCwgb3B0aW9uIGlzIGRlcHJlY2F0ZWQuIik7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJvc3luY2lzZHN5bmMiKSkgeworCQkJLyogbm8tb3AsIHRoaXMgaXMgbm93IHRoZSBkZWZhdWx0ICovCisJCQljbW5fZXJyKENFX1dBUk4sCisJIlhGUzogb3N5bmNpc2RzeW5jIGlzIG5vdyB0aGUgZGVmYXVsdCwgb3B0aW9uIGlzIGRlcHJlY2F0ZWQuIik7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJpcml4c2dpZCIpKSB7CisJCQljbW5fZXJyKENFX1dBUk4sCisJIlhGUzogaXJpeHNnaWQgaXMgbm93IGEgc3lzY3RsKDIpIHZhcmlhYmxlLCBvcHRpb24gaXMgZGVwcmVjYXRlZC4iKTsKKwkJfSBlbHNlIHsKKwkJCWNtbl9lcnIoQ0VfV0FSTiwKKwkJCQkiWEZTOiB1bmtub3duIG1vdW50IG9wdGlvbiBbJXNdLiIsIHRoaXNfY2hhcik7CisJCQlyZXR1cm4gRUlOVkFMOworCQl9CisJfQorCisJaWYgKGFyZ3MtPmZsYWdzICYgWEZTTU5UX05PUkVDT1ZFUlkpIHsKKwkJaWYgKChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9SRE9OTFkpID09IDApIHsKKwkJCWNtbl9lcnIoQ0VfV0FSTiwKKwkJCQkiWEZTOiBuby1yZWNvdmVyeSBtb3VudHMgbXVzdCBiZSByZWFkLW9ubHkuIik7CisJCQlyZXR1cm4gRUlOVkFMOworCQl9CisJfQorCisJaWYgKChhcmdzLT5mbGFncyAmIFhGU01OVF9OT0FMSUdOKSAmJiAoZHN1bml0IHx8IGRzd2lkdGgpKSB7CisJCWNtbl9lcnIoQ0VfV0FSTiwKKwkiWEZTOiBzdW5pdCBhbmQgc3dpZHRoIG9wdGlvbnMgaW5jb21wYXRpYmxlIHdpdGggdGhlIG5vYWxpZ24gb3B0aW9uIik7CisJCXJldHVybiBFSU5WQUw7CisJfQorCisJaWYgKChhcmdzLT5mbGFncyAmIFhGU01OVF9HUVVPVEEpICYmIChhcmdzLT5mbGFncyAmIFhGU01OVF9QUVVPVEEpKSB7CisJCWNtbl9lcnIoQ0VfV0FSTiwKKwkJCSJYRlM6IGNhbm5vdCBtb3VudCB3aXRoIGJvdGggcHJvamVjdCBhbmQgZ3JvdXAgcXVvdGEiKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisKKwlpZiAoKGFyZ3MtPmZsYWdzICYgWEZTTU5UX0RNQVBJKSAmJiAqYXJncy0+bXRwdCA9PSAnXDAnKSB7CisJCXByaW50aygiWEZTOiAlcyBvcHRpb24gbmVlZHMgdGhlIG1vdW50IHBvaW50IG9wdGlvbiBhcyB3ZWxsXG4iLAorCQkJTU5UT1BUX0RNQVBJKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisKKwlpZiAoKGRzdW5pdCAmJiAhZHN3aWR0aCkgfHwgKCFkc3VuaXQgJiYgZHN3aWR0aCkpIHsKKwkJY21uX2VycihDRV9XQVJOLAorCQkJIlhGUzogc3VuaXQgYW5kIHN3aWR0aCBtdXN0IGJlIHNwZWNpZmllZCB0b2dldGhlciIpOworCQlyZXR1cm4gRUlOVkFMOworCX0KKworCWlmIChkc3VuaXQgJiYgKGRzd2lkdGggJSBkc3VuaXQgIT0gMCkpIHsKKwkJY21uX2VycihDRV9XQVJOLAorCSJYRlM6IHN0cmlwZSB3aWR0aCAoJWQpIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgc3RyaXBlIHVuaXQgKCVkKSIsCisJCQlkc3dpZHRoLCBkc3VuaXQpOworCQlyZXR1cm4gRUlOVkFMOworCX0KKworCS8qCisJICogQXBwbGljYXRpb25zIHVzaW5nIERNSSBmaWxlc3lzdGVtcyBvZnRlbiBleHBlY3QgdGhlCisJICogaW5vZGUgZ2VuZXJhdGlvbiBudW1iZXIgdG8gYmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLgorCSAqIElmIHdlIGRlbGV0ZSBpbm9kZSBjaHVua3Mgd2UgYnJlYWsgdGhpcyBhc3N1bXB0aW9uLCBzbworCSAqIGtlZXAgdW51c2VkIGlub2RlIGNodW5rcyBvbiBkaXNrIGZvciBETUkgZmlsZXN5c3RlbXMKKwkgKiB1bnRpbCB3ZSBjb21lIHVwIHdpdGggYSBiZXR0ZXIgc29sdXRpb24uCisJICogTm90ZSB0aGF0IGlmICJpa2VlcCIgb3IgIm5vaWtlZXAiIG1vdW50IG9wdGlvbnMgYXJlCisJICogc3VwcGxpZWQsIHRoZW4gdGhleSBhcmUgaG9ub3JlZC4KKwkgKi8KKwlpZiAoIShhcmdzLT5mbGFncyAmIFhGU01OVF9ETUFQSSkgJiYgIWlrZWVwKQorCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfSURFTEVURTsKKworCWlmICgoYXJncy0+ZmxhZ3MgJiBYRlNNTlRfTk9BTElHTikgIT0gWEZTTU5UX05PQUxJR04pIHsKKwkJaWYgKGRzdW5pdCkgeworCQkJYXJncy0+c3VuaXQgPSBkc3VuaXQ7CisJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfUkVURVJSOworCQl9IGVsc2UgeworCQkJYXJncy0+c3VuaXQgPSB2b2xfZHN1bml0OworCQl9CisJCWRzd2lkdGggPyAoYXJncy0+c3dpZHRoID0gZHN3aWR0aCkgOgorCQkJICAoYXJncy0+c3dpZHRoID0gdm9sX2Rzd2lkdGgpOworCX0gZWxzZSB7CisJCWFyZ3MtPnN1bml0ID0gYXJncy0+c3dpZHRoID0gMDsKKwl9CisKK2RvbmU6CisJaWYgKGFyZ3MtPmZsYWdzICYgWEZTTU5UXzMyQklUSU5PREVTKQorCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfU01BTExfSU5VTVM7CisJaWYgKGFyZ3MtPmZsYWdzMikKKwkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX0ZMQUdTMjsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHByb2NfeGZzX2luZm8geworCWludAlmbGFnOworCWNoYXIJKnN0cjsKK307CisKK1NUQVRJQyBpbnQKK3hmc19zaG93YXJncygKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwKKwlzdHJ1Y3Qgc2VxX2ZpbGUJCSptKQoreworCXN0YXRpYyBzdHJ1Y3QgcHJvY194ZnNfaW5mbyB4ZnNfaW5mb19zZXRbXSA9IHsKKwkJLyogdGhlIGZldyBzaW1wbGUgb25lcyB3ZSBjYW4gZ2V0IGZyb20gdGhlIG1vdW50IHN0cnVjdCAqLworCQl7IFhGU19NT1VOVF9XU1lOQywJCSIsIiBNTlRPUFRfV1NZTkMgfSwKKwkJeyBYRlNfTU9VTlRfSU5PNjQsCQkiLCIgTU5UT1BUX0lOTzY0IH0sCisJCXsgWEZTX01PVU5UX05PQUxJR04sCQkiLCIgTU5UT1BUX05PQUxJR04gfSwKKwkJeyBYRlNfTU9VTlRfU1dBTExPQywJCSIsIiBNTlRPUFRfU1dBTExPQyB9LAorCQl7IFhGU19NT1VOVF9OT1VVSUQsCQkiLCIgTU5UT1BUX05PVVVJRCB9LAorCQl7IFhGU19NT1VOVF9OT1JFQ09WRVJZLAkJIiwiIE1OVE9QVF9OT1JFQ09WRVJZIH0sCisJCXsgWEZTX01PVU5UX09TWU5DSVNPU1lOQywJIiwiIE1OVE9QVF9PU1lOQ0lTT1NZTkMgfSwKKwkJeyBYRlNfTU9VTlRfQVRUUjIsCQkiLCIgTU5UT1BUX0FUVFIyIH0sCisJCXsgWEZTX01PVU5UX0ZJTEVTVFJFQU1TLAkiLCIgTU5UT1BUX0ZJTEVTVFJFQU0gfSwKKwkJeyBYRlNfTU9VTlRfRE1BUEksCQkiLCIgTU5UT1BUX0RNQVBJIH0sCisJCXsgWEZTX01PVU5UX0dSUElELAkJIiwiIE1OVE9QVF9HUlBJRCB9LAorCQl7IDAsIE5VTEwgfQorCX07CisJc3RhdGljIHN0cnVjdCBwcm9jX3hmc19pbmZvIHhmc19pbmZvX3Vuc2V0W10gPSB7CisJCS8qIHRoZSBmZXcgc2ltcGxlIG9uZXMgd2UgY2FuIGdldCBmcm9tIHRoZSBtb3VudCBzdHJ1Y3QgKi8KKwkJeyBYRlNfTU9VTlRfSURFTEVURSwJCSIsIiBNTlRPUFRfSUtFRVAgfSwKKwkJeyBYRlNfTU9VTlRfQ09NUEFUX0lPU0laRSwJIiwiIE1OVE9QVF9MQVJHRUlPIH0sCisJCXsgWEZTX01PVU5UX0JBUlJJRVIsCQkiLCIgTU5UT1BUX05PQkFSUklFUiB9LAorCQl7IFhGU19NT1VOVF9TTUFMTF9JTlVNUywJIiwiIE1OVE9QVF82NEJJVElOT0RFIH0sCisJCXsgMCwgTlVMTCB9CisJfTsKKwlzdHJ1Y3QgcHJvY194ZnNfaW5mbwkqeGZzX2luZm9wOworCisJZm9yICh4ZnNfaW5mb3AgPSB4ZnNfaW5mb19zZXQ7IHhmc19pbmZvcC0+ZmxhZzsgeGZzX2luZm9wKyspIHsKKwkJaWYgKG1wLT5tX2ZsYWdzICYgeGZzX2luZm9wLT5mbGFnKQorCQkJc2VxX3B1dHMobSwgeGZzX2luZm9wLT5zdHIpOworCX0KKwlmb3IgKHhmc19pbmZvcCA9IHhmc19pbmZvX3Vuc2V0OyB4ZnNfaW5mb3AtPmZsYWc7IHhmc19pbmZvcCsrKSB7CisJCWlmICghKG1wLT5tX2ZsYWdzICYgeGZzX2luZm9wLT5mbGFnKSkKKwkJCXNlcV9wdXRzKG0sIHhmc19pbmZvcC0+c3RyKTsKKwl9CisKKwlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfREZMVF9JT1NJWkUpCisJCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF9BTExPQ1NJWkUgIj0lZGsiLAorCQkJCShpbnQpKDEgPDwgbXAtPm1fd3JpdGVpb19sb2cpID4+IDEwKTsKKworCWlmIChtcC0+bV9sb2didWZzID4gMCkKKwkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX0xPR0JVRlMgIj0lZCIsIG1wLT5tX2xvZ2J1ZnMpOworCWlmIChtcC0+bV9sb2dic2l6ZSA+IDApCisJCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF9MT0dCU0laRSAiPSVkayIsIG1wLT5tX2xvZ2JzaXplID4+IDEwKTsKKworCWlmIChtcC0+bV9sb2duYW1lKQorCQlzZXFfcHJpbnRmKG0sICIsIiBNTlRPUFRfTE9HREVWICI9JXMiLCBtcC0+bV9sb2duYW1lKTsKKwlpZiAobXAtPm1fcnRuYW1lKQorCQlzZXFfcHJpbnRmKG0sICIsIiBNTlRPUFRfUlRERVYgIj0lcyIsIG1wLT5tX3J0bmFtZSk7CisKKwlpZiAobXAtPm1fZGFsaWduID4gMCkKKwkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX1NVTklUICI9JWQiLAorCQkJCShpbnQpWEZTX0ZTQl9UT19CQihtcCwgbXAtPm1fZGFsaWduKSk7CisJaWYgKG1wLT5tX3N3aWR0aCA+IDApCisJCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF9TV0lEVEggIj0lZCIsCisJCQkJKGludClYRlNfRlNCX1RPX0JCKG1wLCBtcC0+bV9zd2lkdGgpKTsKKworCWlmIChtcC0+bV9xZmxhZ3MgJiAoWEZTX1VRVU9UQV9BQ0NUfFhGU19VUVVPVEFfRU5GRCkpCisJCXNlcV9wdXRzKG0sICIsIiBNTlRPUFRfVVNSUVVPVEEpOworCWVsc2UgaWYgKG1wLT5tX3FmbGFncyAmIFhGU19VUVVPVEFfQUNDVCkKKwkJc2VxX3B1dHMobSwgIiwiIE1OVE9QVF9VUVVPVEFOT0VORik7CisKKwlpZiAobXAtPm1fcWZsYWdzICYgKFhGU19QUVVPVEFfQUNDVHxYRlNfT1FVT1RBX0VORkQpKQorCQlzZXFfcHV0cyhtLCAiLCIgTU5UT1BUX1BSSlFVT1RBKTsKKwllbHNlIGlmIChtcC0+bV9xZmxhZ3MgJiBYRlNfUFFVT1RBX0FDQ1QpCisJCXNlcV9wdXRzKG0sICIsIiBNTlRPUFRfUFFVT1RBTk9FTkYpOworCisJaWYgKG1wLT5tX3FmbGFncyAmIChYRlNfR1FVT1RBX0FDQ1R8WEZTX09RVU9UQV9FTkZEKSkKKwkJc2VxX3B1dHMobSwgIiwiIE1OVE9QVF9HUlBRVU9UQSk7CisJZWxzZSBpZiAobXAtPm1fcWZsYWdzICYgWEZTX0dRVU9UQV9BQ0NUKQorCQlzZXFfcHV0cyhtLCAiLCIgTU5UT1BUX0dRVU9UQU5PRU5GKTsKKworCWlmICghKG1wLT5tX3FmbGFncyAmIFhGU19BTExfUVVPVEFfQUNDVCkpCisJCXNlcV9wdXRzKG0sICIsIiBNTlRPUFRfTk9RVU9UQSk7CisKKwlyZXR1cm4gMDsKK30KIF9fdWludDY0X3QKIHhmc19tYXhfZmlsZV9vZmZzZXQoCiAJdW5zaWduZWQgaW50CQlibG9ja3NoaWZ0KQpAQCAtMTM3LDcgKzU2OSw3IEBACiAJCWJyZWFrOwogCWNhc2UgU19JRkxOSzoKIAkJaW5vZGUtPmlfb3AgPSAmeGZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKLQkJaWYgKGlub2RlLT5pX2Jsb2NrcykKKwkJaWYgKCEoWEZTX0koaW5vZGUpLT5pX2RmLmlmX2ZsYWdzICYgWEZTX0lGSU5MSU5FKSkKIAkJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnhmc19hZGRyZXNzX3NwYWNlX29wZXJhdGlvbnM7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0xNzQsOCArNjA2LDYgQEAKIAogCWlub2RlLT5pX2dlbmVyYXRpb24gPSBpcC0+aV9kLmRpX2dlbjsKIAlpX3NpemVfd3JpdGUoaW5vZGUsIGlwLT5pX2QuZGlfc2l6ZSk7Ci0JaW5vZGUtPmlfYmxvY2tzID0KLQkJWEZTX0ZTQl9UT19CQihtcCwgaXAtPmlfZC5kaV9uYmxvY2tzICsgaXAtPmlfZGVsYXllZF9ibGtzKTsKIAlpbm9kZS0+aV9hdGltZS50dl9zZWMJPSBpcC0+aV9kLmRpX2F0aW1lLnRfc2VjOwogCWlub2RlLT5pX2F0aW1lLnR2X25zZWMJPSBpcC0+aV9kLmRpX2F0aW1lLnRfbnNlYzsKIAlpbm9kZS0+aV9tdGltZS50dl9zZWMJPSBpcC0+aV9kLmRpX210aW1lLnRfc2VjOwpAQCAtMzM0LDYgKzc2NCw2NCBAQAogCWJsa2Rldl9pc3N1ZV9mbHVzaChidWZ0YXJnLT5idF9iZGV2LCBOVUxMKTsKIH0KIAorLyoKKyAqIFhGUyBBSUwgcHVzaCB0aHJlYWQgc3VwcG9ydAorICovCit2b2lkCit4ZnNhaWxkX3dha2V1cCgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXhmc19sc25fdAkJdGhyZXNob2xkX2xzbikKK3sKKwltcC0+bV9haWwueGFfdGFyZ2V0ID0gdGhyZXNob2xkX2xzbjsKKwl3YWtlX3VwX3Byb2Nlc3MobXAtPm1fYWlsLnhhX3Rhc2spOworfQorCitpbnQKK3hmc2FpbGQoCisJdm9pZAkqZGF0YSkKK3sKKwl4ZnNfbW91bnRfdAkqbXAgPSAoeGZzX21vdW50X3QgKilkYXRhOworCXhmc19sc25fdAlsYXN0X3B1c2hlZF9sc24gPSAwOworCWxvbmcJCXRvdXQgPSAwOworCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJaWYgKHRvdXQpCisJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcyh0b3V0KSk7CisJCXRvdXQgPSAxMDAwOworCisJCS8qIHN3c3VzcCAqLworCQl0cnlfdG9fZnJlZXplKCk7CisKKwkJQVNTRVJUKG1wLT5tX2xvZyk7CisJCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKKwkJCWNvbnRpbnVlOworCisJCXRvdXQgPSB4ZnNhaWxkX3B1c2gobXAsICZsYXN0X3B1c2hlZF9sc24pOworCX0KKworCXJldHVybiAwOworfQkvKiB4ZnNhaWxkICovCisKK2ludAoreGZzYWlsZF9zdGFydCgKKwl4ZnNfbW91bnRfdAkqbXApCit7CisJbXAtPm1fYWlsLnhhX3RhcmdldCA9IDA7CisJbXAtPm1fYWlsLnhhX3Rhc2sgPSBrdGhyZWFkX3J1bih4ZnNhaWxkLCBtcCwgInhmc2FpbGQiKTsKKwlpZiAoSVNfRVJSKG1wLT5tX2FpbC54YV90YXNrKSkKKwkJcmV0dXJuIC1QVFJfRVJSKG1wLT5tX2FpbC54YV90YXNrKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZAoreGZzYWlsZF9zdG9wKAorCXhmc19tb3VudF90CSptcCkKK3sKKwlrdGhyZWFkX3N0b3AobXAtPm1fYWlsLnhhX3Rhc2spOworfQorCisKKwogU1RBVElDIHN0cnVjdCBpbm9kZSAqCiB4ZnNfZnNfYWxsb2NfaW5vZGUoCiAJc3RydWN0IHN1cGVyX2Jsb2NrCSpzYikKQEAgLTM2MSw3ICs4NDksNyBAQAogCWlub2RlX2luaXRfb25jZSh2bl90b19pbm9kZSgoYmh2X3Zub2RlX3QgKil2bm9kZSkpOwogfQogCi1TVEFUSUMgaW50CitTVEFUSUMgaW50IF9faW5pdAogeGZzX2luaXRfem9uZXModm9pZCkKIHsKIAl4ZnNfdm5vZGVfem9uZSA9IGttZW1fem9uZV9pbml0X2ZsYWdzKHNpemVvZihiaHZfdm5vZGVfdCksICJ4ZnNfdm5vZGUiLApAQCAtNDEwLDggKzg5OCw3IEBACiB7CiAJaW50CQkJZXJyb3IgPSAwLCBmbGFncyA9IEZMVVNIX0lOT0RFOwogCi0Jdm5fdHJhY2VfZW50cnkoWEZTX0koaW5vZGUpLCBfX0ZVTkNUSU9OX18sCi0JCQkoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisJeGZzX2l0cmFjZV9lbnRyeShYRlNfSShpbm9kZSkpOwogCWlmIChzeW5jKSB7CiAJCWZpbGVtYXBfZmRhdGF3YWl0KGlub2RlLT5pX21hcHBpbmcpOwogCQlmbGFncyB8PSBGTFVTSF9TWU5DOwpAQCAtNDM4LDggKzkyNSw3IEBACiAJICogZmluZCBhbiBpbm9kZSB3aXRoIGRpX21vZGUgPT0gMCBidXQgd2l0aG91dCBJR0VUX0NSRUFURSBzZXQuCiAJICovCiAJaWYgKGlwKSB7Ci0JCXZuX3RyYWNlX2VudHJ5KGlwLCBfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKLQorCQl4ZnNfaXRyYWNlX2VudHJ5KGlwKTsKIAkJWEZTX1NUQVRTX0lOQyh2bl9yZWxlKTsKIAkJWEZTX1NUQVRTX0lOQyh2bl9yZW1vdmUpOwogCQlYRlNfU1RBVFNfSU5DKHZuX3JlY2xhaW0pOwpAQCAtNjgzLDggKzExNjksNDQgQEAKIAlzdHJ1Y3QgZGVudHJ5CQkqZGVudHJ5LAogCXN0cnVjdCBrc3RhdGZzCQkqc3RhdHApCiB7Ci0JcmV0dXJuIC14ZnNfc3RhdHZmcyhYRlNfTShkZW50cnktPmRfc2IpLCBzdGF0cCwKLQkJCQl2bl9mcm9tX2lub2RlKGRlbnRyeS0+ZF9pbm9kZSkpOworCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gWEZTX00oZGVudHJ5LT5kX3NiKTsKKwl4ZnNfc2JfdAkJKnNicCA9ICZtcC0+bV9zYjsKKwlfX3VpbnQ2NF90CQlmYWtlaW5vcywgaWQ7CisJeGZzX2V4dGxlbl90CQlsc2l6ZTsKKworCXN0YXRwLT5mX3R5cGUgPSBYRlNfU0JfTUFHSUM7CisJc3RhdHAtPmZfbmFtZWxlbiA9IE1BWE5BTUVMRU4gLSAxOworCisJaWQgPSBodWdlX2VuY29kZV9kZXYobXAtPm1fZGRldl90YXJncC0+YnRfZGV2KTsKKwlzdGF0cC0+Zl9mc2lkLnZhbFswXSA9ICh1MzIpaWQ7CisJc3RhdHAtPmZfZnNpZC52YWxbMV0gPSAodTMyKShpZCA+PiAzMik7CisKKwl4ZnNfaWNzYl9zeW5jX2NvdW50ZXJzX2ZsYWdzKG1wLCBYRlNfSUNTQl9MQVpZX0NPVU5UKTsKKworCXNwaW5fbG9jaygmbXAtPm1fc2JfbG9jayk7CisJc3RhdHAtPmZfYnNpemUgPSBzYnAtPnNiX2Jsb2Nrc2l6ZTsKKwlsc2l6ZSA9IHNicC0+c2JfbG9nc3RhcnQgPyBzYnAtPnNiX2xvZ2Jsb2NrcyA6IDA7CisJc3RhdHAtPmZfYmxvY2tzID0gc2JwLT5zYl9kYmxvY2tzIC0gbHNpemU7CisJc3RhdHAtPmZfYmZyZWUgPSBzdGF0cC0+Zl9iYXZhaWwgPQorCQkJCXNicC0+c2JfZmRibG9ja3MgLSBYRlNfQUxMT0NfU0VUX0FTSURFKG1wKTsKKwlmYWtlaW5vcyA9IHN0YXRwLT5mX2JmcmVlIDw8IHNicC0+c2JfaW5vcGJsb2c7CisjaWYgWEZTX0JJR19JTlVNUworCWZha2Vpbm9zICs9IG1wLT5tX2lub2FkZDsKKyNlbmRpZgorCXN0YXRwLT5mX2ZpbGVzID0KKwkgICAgTUlOKHNicC0+c2JfaWNvdW50ICsgZmFrZWlub3MsIChfX3VpbnQ2NF90KVhGU19NQVhJTlVNQkVSKTsKKwlpZiAobXAtPm1fbWF4aWNvdW50KQorI2lmIFhGU19CSUdfSU5VTVMKKwkJaWYgKCFtcC0+bV9pbm9hZGQpCisjZW5kaWYKKwkJCXN0YXRwLT5mX2ZpbGVzID0gbWluX3QodHlwZW9mKHN0YXRwLT5mX2ZpbGVzKSwKKwkJCQkJCXN0YXRwLT5mX2ZpbGVzLAorCQkJCQkJbXAtPm1fbWF4aWNvdW50KTsKKwlzdGF0cC0+Zl9mZnJlZSA9IHN0YXRwLT5mX2ZpbGVzIC0gKHNicC0+c2JfaWNvdW50IC0gc2JwLT5zYl9pZnJlZSk7CisJc3Bpbl91bmxvY2soJm1wLT5tX3NiX2xvY2spOworCisJWEZTX1FNX0RRU1RBVFZGUyhYRlNfSShkZW50cnktPmRfaW5vZGUpLCBzdGF0cCk7CisJcmV0dXJuIDA7CiB9CiAKIFNUQVRJQyBpbnQKQEAgLTcwNCwxMSArMTIyNiwxOSBAQAogCXJldHVybiAtZXJyb3I7CiB9CiAKKy8qCisgKiBTZWNvbmQgc3RhZ2Ugb2YgYSBmcmVlemUuIFRoZSBkYXRhIGlzIGFscmVhZHkgZnJvemVuIHNvIHdlIG9ubHkKKyAqIG5lZWQgdG8gdGFrZSBjYXJlIG9mIHRoZW1ldGFkYXRhLiBPbmNlIHRoYXQncyBkb25lIHdyaXRlIGEgZHVtbXkKKyAqIHJlY29yZCB0byBkaXJ0eSB0aGUgbG9nIGluIGNhc2Ugb2YgYSBjcmFzaCB3aGlsZSBmcm96ZW4uCisgKi8KIFNUQVRJQyB2b2lkCiB4ZnNfZnNfbG9ja2ZzKAogCXN0cnVjdCBzdXBlcl9ibG9jawkqc2IpCiB7Ci0JeGZzX2ZyZWV6ZShYRlNfTShzYikpOworCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gWEZTX00oc2IpOworCisJeGZzX2F0dHJfcXVpZXNjZShtcCk7CisJeGZzX2ZzX2xvZ19kdW1teShtcCk7CiB9CiAKIFNUQVRJQyBpbnQKQEAgLTc3OSw3ICsxMzA5LDYgQEAKIAlzdHJ1Y3QgaW5vZGUJCSpyb290dnA7CiAJc3RydWN0IHhmc19tb3VudAkqbXAgPSBOVUxMOwogCXN0cnVjdCB4ZnNfbW91bnRfYXJncwkqYXJncyA9IHhmc19hcmdzX2FsbG9jYXRlKHNiLCBzaWxlbnQpOwotCXN0cnVjdCBrc3RhdGZzCQlzdGF0dmZzOwogCWludAkJCWVycm9yOwogCiAJbXAgPSB4ZnNfbW91bnRfaW5pdCgpOwpAQCAtODA3LDIxICsxMzM2LDE5IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIGZhaWxfdmZzb3A7CiAKLQllcnJvciA9IHhmc19zdGF0dmZzKG1wLCAmc3RhdHZmcywgTlVMTCk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIGZhaWxfdW5tb3VudDsKLQogCXNiLT5zX2RpcnQgPSAxOwotCXNiLT5zX21hZ2ljID0gc3RhdHZmcy5mX3R5cGU7Ci0Jc2ItPnNfYmxvY2tzaXplID0gc3RhdHZmcy5mX2JzaXplOwotCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gZmZzKHN0YXR2ZnMuZl9ic2l6ZSkgLSAxOworCXNiLT5zX21hZ2ljID0gWEZTX1NCX01BR0lDOworCXNiLT5zX2Jsb2Nrc2l6ZSA9IG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZTsKKwlzYi0+c19ibG9ja3NpemVfYml0cyA9IGZmcyhzYi0+c19ibG9ja3NpemUpIC0gMTsKIAlzYi0+c19tYXhieXRlcyA9IHhmc19tYXhfZmlsZV9vZmZzZXQoc2ItPnNfYmxvY2tzaXplX2JpdHMpOwogCXNiLT5zX3RpbWVfZ3JhbiA9IDE7CiAJc2V0X3Bvc2l4X2FjbF9mbGFnKHNiKTsKIAotCWVycm9yID0geGZzX3Jvb3QobXAsICZyb290dnApOwotCWlmIChlcnJvcikKKwlyb290dnAgPSBpZ3JhYihtcC0+bV9yb290aXAtPmlfdm5vZGUpOworCWlmICghcm9vdHZwKSB7CisJCWVycm9yID0gRU5PRU5UOwogCQlnb3RvIGZhaWxfdW5tb3VudDsKKwl9CiAKIAlzYi0+c19yb290ID0gZF9hbGxvY19yb290KHZuX3RvX2lub2RlKHJvb3R2cCkpOwogCWlmICghc2ItPnNfcm9vdCkgewpAQCAtODQxLDggKzEzNjgsNyBAQAogCQlnb3RvIGZhaWxfdm5yZWxlOwogCX0KIAotCXZuX3RyYWNlX2V4aXQoWEZTX0koc2ItPnNfcm9vdC0+ZF9pbm9kZSksIF9fRlVOQ1RJT05fXywKLQkJCShpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKwl4ZnNfaXRyYWNlX2V4aXQoWEZTX0koc2ItPnNfcm9vdC0+ZF9pbm9kZSkpOwogCiAJa21lbV9mcmVlKGFyZ3MsIHNpemVvZigqYXJncykpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zub2RlLmMKaW5kZXggODE0MTY5Zi4uYmM3YWZlMCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5jCkBAIC00MCw3ICs0MCw3IEBACiAjZGVmaW5lIHZwdG9zeW5jKHYpICAgICAgICAgICAgICgmdnN5bmNbKCh1bnNpZ25lZCBsb25nKXYpICUgTlZTWU5DXSkKIHN0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCB2c3luY1tOVlNZTkNdOwogCi12b2lkCit2b2lkIF9faW5pdAogdm5faW5pdCh2b2lkKQogewogCWludCBpOwpAQCAtODIsODQgKzgyLDU1IEBACiAJCXhmc19kb19mb3JjZV9zaHV0ZG93bihpcC0+aV9tb3VudCwgU0hVVERPV05fREVWSUNFX1JFUSwgZiwgbCk7CiB9CiAKLWJodl92bm9kZV90ICoKLXZuX2luaXRpYWxpemUoCi0Jc3RydWN0IGlub2RlCSppbm9kZSkKLXsKLQliaHZfdm5vZGVfdAkqdnAgPSB2bl9mcm9tX2lub2RlKGlub2RlKTsKLQotCVhGU19TVEFUU19JTkModm5fYWN0aXZlKTsKLQlYRlNfU1RBVFNfSU5DKHZuX2FsbG9jKTsKLQotCUFTU0VSVChWTl9DQUNIRUQodnApID09IDApOwotCi0JcmV0dXJuIHZwOwotfQotCiAvKgotICogUmV2YWxpZGF0ZSB0aGUgTGludXggaW5vZGUgZnJvbSB0aGUgdmF0dHIuCisgKiBSZXZhbGlkYXRlIHRoZSBMaW51eCBpbm9kZSBmcm9tIHRoZSBYRlMgaW5vZGUuCiAgKiBOb3RlOiBpX3NpemUgX25vdF8gdXBkYXRlZDsgd2UgbXVzdCBob2xkIHRoZSBpbm9kZQogICogc2VtYXBob3JlIHdoZW4gZG9pbmcgdGhhdCAtIGNhbGxlcnMgcmVzcG9uc2liaWxpdHkuCiAgKi8KLXZvaWQKLXZuX3JldmFsaWRhdGVfY29yZSgKLQliaHZfdm5vZGVfdAkqdnAsCi0JYmh2X3ZhdHRyX3QJKnZhcCkKK2ludAordm5fcmV2YWxpZGF0ZSgKKwliaHZfdm5vZGVfdAkJKnZwKQogewotCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSB2bl90b19pbm9kZSh2cCk7CisJc3RydWN0IGlub2RlCQkqaW5vZGUgPSB2bl90b19pbm9kZSh2cCk7CisJc3RydWN0IHhmc19pbm9kZQkqaXAgPSBYRlNfSShpbm9kZSk7CisJc3RydWN0IHhmc19tb3VudAkqbXAgPSBpcC0+aV9tb3VudDsKKwl1bnNpZ25lZCBsb25nCQl4ZmxhZ3M7CiAKLQlpbm9kZS0+aV9tb2RlCSAgICA9IHZhcC0+dmFfbW9kZTsKLQlpbm9kZS0+aV9ubGluawkgICAgPSB2YXAtPnZhX25saW5rOwotCWlub2RlLT5pX3VpZAkgICAgPSB2YXAtPnZhX3VpZDsKLQlpbm9kZS0+aV9naWQJICAgID0gdmFwLT52YV9naWQ7Ci0JaW5vZGUtPmlfYmxvY2tzCSAgICA9IHZhcC0+dmFfbmJsb2NrczsKLQlpbm9kZS0+aV9tdGltZQkgICAgPSB2YXAtPnZhX210aW1lOwotCWlub2RlLT5pX2N0aW1lCSAgICA9IHZhcC0+dmFfY3RpbWU7Ci0JaWYgKHZhcC0+dmFfeGZsYWdzICYgWEZTX1hGTEFHX0lNTVVUQUJMRSkKKwl4ZnNfaXRyYWNlX2VudHJ5KGlwKTsKKworCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKKwkJcmV0dXJuIC1FSU87CisKKwl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCWlub2RlLT5pX21vZGUJICAgID0gaXAtPmlfZC5kaV9tb2RlOworCWlub2RlLT5pX3VpZAkgICAgPSBpcC0+aV9kLmRpX3VpZDsKKwlpbm9kZS0+aV9naWQJICAgID0gaXAtPmlfZC5kaV9naWQ7CisJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gaXAtPmlfZC5kaV9tdGltZS50X3NlYzsKKwlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gaXAtPmlfZC5kaV9tdGltZS50X25zZWM7CisJaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gaXAtPmlfZC5kaV9jdGltZS50X3NlYzsKKwlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gaXAtPmlfZC5kaV9jdGltZS50X25zZWM7CisKKwl4ZmxhZ3MgPSB4ZnNfaXAyeGZsYWdzKGlwKTsKKwlpZiAoeGZsYWdzICYgWEZTX1hGTEFHX0lNTVVUQUJMRSkKIAkJaW5vZGUtPmlfZmxhZ3MgfD0gU19JTU1VVEFCTEU7CiAJZWxzZQogCQlpbm9kZS0+aV9mbGFncyAmPSB+U19JTU1VVEFCTEU7Ci0JaWYgKHZhcC0+dmFfeGZsYWdzICYgWEZTX1hGTEFHX0FQUEVORCkKKwlpZiAoeGZsYWdzICYgWEZTX1hGTEFHX0FQUEVORCkKIAkJaW5vZGUtPmlfZmxhZ3MgfD0gU19BUFBFTkQ7CiAJZWxzZQogCQlpbm9kZS0+aV9mbGFncyAmPSB+U19BUFBFTkQ7Ci0JaWYgKHZhcC0+dmFfeGZsYWdzICYgWEZTX1hGTEFHX1NZTkMpCisJaWYgKHhmbGFncyAmIFhGU19YRkxBR19TWU5DKQogCQlpbm9kZS0+aV9mbGFncyB8PSBTX1NZTkM7CiAJZWxzZQogCQlpbm9kZS0+aV9mbGFncyAmPSB+U19TWU5DOwotCWlmICh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19OT0FUSU1FKQorCWlmICh4ZmxhZ3MgJiBYRlNfWEZMQUdfTk9BVElNRSkKIAkJaW5vZGUtPmlfZmxhZ3MgfD0gU19OT0FUSU1FOwogCWVsc2UKIAkJaW5vZGUtPmlfZmxhZ3MgJj0gflNfTk9BVElNRTsKLX0KKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CiAKLS8qCi0gKiBSZXZhbGlkYXRlIHRoZSBMaW51eCBpbm9kZSBmcm9tIHRoZSB2bm9kZS4KLSAqLwotaW50Ci1fX3ZuX3JldmFsaWRhdGUoCi0JYmh2X3Zub2RlX3QJKnZwLAotCWJodl92YXR0cl90CSp2YXR0cikKLXsKLQlpbnQJCWVycm9yOwotCi0Jdm5fdHJhY2VfZW50cnkoeGZzX3Z0b2kodnApLCBfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKLQl2YXR0ci0+dmFfbWFzayA9IFhGU19BVF9TVEFUIHwgWEZTX0FUX1hGTEFHUzsKLQllcnJvciA9IHhmc19nZXRhdHRyKHhmc192dG9pKHZwKSwgdmF0dHIsIDApOwotCWlmIChsaWtlbHkoIWVycm9yKSkgewotCQl2bl9yZXZhbGlkYXRlX2NvcmUodnAsIHZhdHRyKTsKLQkJeGZzX2lmbGFnc19jbGVhcih4ZnNfdnRvaSh2cCksIFhGU19JTU9ESUZJRUQpOwotCX0KLQlyZXR1cm4gLWVycm9yOwotfQotCi1pbnQKLXZuX3JldmFsaWRhdGUoCi0JYmh2X3Zub2RlX3QJKnZwKQotewotCWJodl92YXR0cl90CXZhdHRyOwotCi0JcmV0dXJuIF9fdm5fcmV2YWxpZGF0ZSh2cCwgJnZhdHRyKTsKKwl4ZnNfaWZsYWdzX2NsZWFyKGlwLCBYRlNfSU1PRElGSUVEKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTE3OSw3ICsxNTAsNyBAQAogCXJldHVybiB2cDsKIH0KIAotI2lmZGVmCVhGU19WTk9ERV9UUkFDRQorI2lmZGVmCVhGU19JTk9ERV9UUkFDRQogCiAvKgogICogUmVmZXJlbmNlIGNvdW50IG9mIExpbnV4IGlub2RlIGlmIHByZXNlbnQsIC0xIGlmIHRoZSB4ZnNfaW5vZGUKQEAgLTIxMSwzMiArMTgyLDMyIEBACiAgKiBWbm9kZSB0cmFjaW5nIGNvZGUuCiAgKi8KIHZvaWQKLXZuX3RyYWNlX2VudHJ5KHhmc19pbm9kZV90ICppcCwgY29uc3QgY2hhciAqZnVuYywgaW5zdF90ICpyYSkKK194ZnNfaXRyYWNlX2VudHJ5KHhmc19pbm9kZV90ICppcCwgY29uc3QgY2hhciAqZnVuYywgaW5zdF90ICpyYSkKIHsKLQlLVFJBQ0VfRU5URVIoaXAsIFZOT0RFX0tUUkFDRV9FTlRSWSwgZnVuYywgMCwgcmEpOworCUtUUkFDRV9FTlRFUihpcCwgSU5PREVfS1RSQUNFX0VOVFJZLCBmdW5jLCAwLCByYSk7CiB9CiAKIHZvaWQKLXZuX3RyYWNlX2V4aXQoeGZzX2lub2RlX3QgKmlwLCBjb25zdCBjaGFyICpmdW5jLCBpbnN0X3QgKnJhKQorX3hmc19pdHJhY2VfZXhpdCh4ZnNfaW5vZGVfdCAqaXAsIGNvbnN0IGNoYXIgKmZ1bmMsIGluc3RfdCAqcmEpCiB7Ci0JS1RSQUNFX0VOVEVSKGlwLCBWTk9ERV9LVFJBQ0VfRVhJVCwgZnVuYywgMCwgcmEpOworCUtUUkFDRV9FTlRFUihpcCwgSU5PREVfS1RSQUNFX0VYSVQsIGZ1bmMsIDAsIHJhKTsKIH0KIAogdm9pZAotdm5fdHJhY2VfaG9sZCh4ZnNfaW5vZGVfdCAqaXAsIGNoYXIgKmZpbGUsIGludCBsaW5lLCBpbnN0X3QgKnJhKQoreGZzX2l0cmFjZV9ob2xkKHhmc19pbm9kZV90ICppcCwgY2hhciAqZmlsZSwgaW50IGxpbmUsIGluc3RfdCAqcmEpCiB7Ci0JS1RSQUNFX0VOVEVSKGlwLCBWTk9ERV9LVFJBQ0VfSE9MRCwgZmlsZSwgbGluZSwgcmEpOworCUtUUkFDRV9FTlRFUihpcCwgSU5PREVfS1RSQUNFX0hPTEQsIGZpbGUsIGxpbmUsIHJhKTsKIH0KIAogdm9pZAotdm5fdHJhY2VfcmVmKHhmc19pbm9kZV90ICppcCwgY2hhciAqZmlsZSwgaW50IGxpbmUsIGluc3RfdCAqcmEpCitfeGZzX2l0cmFjZV9yZWYoeGZzX2lub2RlX3QgKmlwLCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW5zdF90ICpyYSkKIHsKLQlLVFJBQ0VfRU5URVIoaXAsIFZOT0RFX0tUUkFDRV9SRUYsIGZpbGUsIGxpbmUsIHJhKTsKKwlLVFJBQ0VfRU5URVIoaXAsIElOT0RFX0tUUkFDRV9SRUYsIGZpbGUsIGxpbmUsIHJhKTsKIH0KIAogdm9pZAotdm5fdHJhY2VfcmVsZSh4ZnNfaW5vZGVfdCAqaXAsIGNoYXIgKmZpbGUsIGludCBsaW5lLCBpbnN0X3QgKnJhKQoreGZzX2l0cmFjZV9yZWxlKHhmc19pbm9kZV90ICppcCwgY2hhciAqZmlsZSwgaW50IGxpbmUsIGluc3RfdCAqcmEpCiB7Ci0JS1RSQUNFX0VOVEVSKGlwLCBWTk9ERV9LVFJBQ0VfUkVMRSwgZmlsZSwgbGluZSwgcmEpOworCUtUUkFDRV9FTlRFUihpcCwgSU5PREVfS1RSQUNFX1JFTEUsIGZpbGUsIGxpbmUsIHJhKTsKIH0KLSNlbmRpZgkvKiBYRlNfVk5PREVfVFJBQ0UgKi8KKyNlbmRpZgkvKiBYRlNfSU5PREVfVFJBQ0UgKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zub2RlLmggYi9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5oCmluZGV4IDU1ZmI0NjkuLmI1ZWE0MTggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zub2RlLmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuaApAQCAtMTg3LDEwICsxODcsNyBAQAogCShWTl9JU1JFRyh2cCkgJiYgKChtb2RlKSAmIChWU0dJRHwoVkVYRUM+PjMpKSkgPT0gVlNHSUQpCiAKIGV4dGVybiB2b2lkCXZuX2luaXQodm9pZCk7Ci1leHRlcm4gYmh2X3Zub2RlX3QJKnZuX2luaXRpYWxpemUoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIGludAl2bl9yZXZhbGlkYXRlKGJodl92bm9kZV90ICopOwotZXh0ZXJuIGludAlfX3ZuX3JldmFsaWRhdGUoYmh2X3Zub2RlX3QgKiwgYmh2X3ZhdHRyX3QgKik7Ci1leHRlcm4gdm9pZAl2bl9yZXZhbGlkYXRlX2NvcmUoYmh2X3Zub2RlX3QgKiwgYmh2X3ZhdHRyX3QgKik7CiAKIC8qCiAgKiBZZWFoLCB0aGVzZSBkb24ndCB0YWtlIHZub2RlIGFueW1vcmUgYXQgYWxsLCBhbGwgdGhpcyBzaG91bGQgYmUKQEAgLTIxMCwxMiArMjA3LDEyIEBACiAgKi8KIGV4dGVybiBiaHZfdm5vZGVfdAkqdm5faG9sZChiaHZfdm5vZGVfdCAqKTsKIAotI2lmIGRlZmluZWQoWEZTX1ZOT0RFX1RSQUNFKQorI2lmIGRlZmluZWQoWEZTX0lOT0RFX1RSQUNFKQogI2RlZmluZSBWTl9IT0xEKHZwKQkJXAogCSgodm9pZCl2bl9ob2xkKHZwKSwJXAotCSAgdm5fdHJhY2VfaG9sZCh4ZnNfdnRvaSh2cCksIF9fRklMRV9fLCBfX0xJTkVfXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpKQorCSAgeGZzX2l0cmFjZV9ob2xkKHhmc192dG9pKHZwKSwgX19GSUxFX18sIF9fTElORV9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcykpCiAjZGVmaW5lIFZOX1JFTEUodnApCQlcCi0JICAodm5fdHJhY2VfcmVsZSh4ZnNfdnRvaSh2cCksIF9fRklMRV9fLCBfX0xJTkVfXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpLCBcCisJICAoeGZzX2l0cmFjZV9yZWxlKHhmc192dG9pKHZwKSwgX19GSUxFX18sIF9fTElORV9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyksIFwKIAkgICBpcHV0KHZuX3RvX2lub2RlKHZwKSkpCiAjZWxzZQogI2RlZmluZSBWTl9IT0xEKHZwKQkJKCh2b2lkKXZuX2hvbGQodnApKQpAQCAtMjM4LDExICsyMzUsNiBAQAogLyoKICAqIERlYWxpbmcgd2l0aCBiYWQgaW5vZGVzCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCB2bl9tYXJrX2JhZChiaHZfdm5vZGVfdCAqdnApCi17Ci0JbWFrZV9iYWRfaW5vZGUodm5fdG9faW5vZGUodnApKTsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgVk5fQkFEKGJodl92bm9kZV90ICp2cCkKIHsKIAlyZXR1cm4gaXNfYmFkX2lub2RlKHZuX3RvX2lub2RlKHZwKSk7CkBAIC0yOTYsMjYgKzI4OCwzNiBAQAogLyoKICAqIFRyYWNraW5nIHZub2RlIGFjdGl2aXR5LgogICovCi0jaWYgZGVmaW5lZChYRlNfVk5PREVfVFJBQ0UpCisjaWYgZGVmaW5lZChYRlNfSU5PREVfVFJBQ0UpCiAKLSNkZWZpbmUJVk5PREVfVFJBQ0VfU0laRQkxNgkJLyogbnVtYmVyIG9mIHRyYWNlIGVudHJpZXMgKi8KLSNkZWZpbmUJVk5PREVfS1RSQUNFX0VOVFJZCTEKLSNkZWZpbmUJVk5PREVfS1RSQUNFX0VYSVQJMgotI2RlZmluZQlWTk9ERV9LVFJBQ0VfSE9MRAkzCi0jZGVmaW5lCVZOT0RFX0tUUkFDRV9SRUYJNAotI2RlZmluZQlWTk9ERV9LVFJBQ0VfUkVMRQk1CisjZGVmaW5lCUlOT0RFX1RSQUNFX1NJWkUJMTYJCS8qIG51bWJlciBvZiB0cmFjZSBlbnRyaWVzICovCisjZGVmaW5lCUlOT0RFX0tUUkFDRV9FTlRSWQkxCisjZGVmaW5lCUlOT0RFX0tUUkFDRV9FWElUCTIKKyNkZWZpbmUJSU5PREVfS1RSQUNFX0hPTEQJMworI2RlZmluZQlJTk9ERV9LVFJBQ0VfUkVGCTQKKyNkZWZpbmUJSU5PREVfS1RSQUNFX1JFTEUJNQogCi1leHRlcm4gdm9pZCB2bl90cmFjZV9lbnRyeShzdHJ1Y3QgeGZzX2lub2RlICosIGNvbnN0IGNoYXIgKiwgaW5zdF90ICopOwotZXh0ZXJuIHZvaWQgdm5fdHJhY2VfZXhpdChzdHJ1Y3QgeGZzX2lub2RlICosIGNvbnN0IGNoYXIgKiwgaW5zdF90ICopOwotZXh0ZXJuIHZvaWQgdm5fdHJhY2VfaG9sZChzdHJ1Y3QgeGZzX2lub2RlICosIGNoYXIgKiwgaW50LCBpbnN0X3QgKik7Ci1leHRlcm4gdm9pZCB2bl90cmFjZV9yZWYoc3RydWN0IHhmc19pbm9kZSAqLCBjaGFyICosIGludCwgaW5zdF90ICopOwotZXh0ZXJuIHZvaWQgdm5fdHJhY2VfcmVsZShzdHJ1Y3QgeGZzX2lub2RlICosIGNoYXIgKiwgaW50LCBpbnN0X3QgKik7CitleHRlcm4gdm9pZCBfeGZzX2l0cmFjZV9lbnRyeShzdHJ1Y3QgeGZzX2lub2RlICosIGNvbnN0IGNoYXIgKiwgaW5zdF90ICopOworZXh0ZXJuIHZvaWQgX3hmc19pdHJhY2VfZXhpdChzdHJ1Y3QgeGZzX2lub2RlICosIGNvbnN0IGNoYXIgKiwgaW5zdF90ICopOworZXh0ZXJuIHZvaWQgeGZzX2l0cmFjZV9ob2xkKHN0cnVjdCB4ZnNfaW5vZGUgKiwgY2hhciAqLCBpbnQsIGluc3RfdCAqKTsKK2V4dGVybiB2b2lkIF94ZnNfaXRyYWNlX3JlZihzdHJ1Y3QgeGZzX2lub2RlICosIGNoYXIgKiwgaW50LCBpbnN0X3QgKik7CitleHRlcm4gdm9pZCB4ZnNfaXRyYWNlX3JlbGUoc3RydWN0IHhmc19pbm9kZSAqLCBjaGFyICosIGludCwgaW5zdF90ICopOworI2RlZmluZSB4ZnNfaXRyYWNlX2VudHJ5KGlwKQlcCisJX3hmc19pdHJhY2VfZW50cnkoaXAsIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpCisjZGVmaW5lIHhmc19pdHJhY2VfZXhpdChpcCkJXAorCV94ZnNfaXRyYWNlX2V4aXQoaXAsIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpCisjZGVmaW5lIHhmc19pdHJhY2VfZXhpdF90YWcoaXAsIHRhZykJXAorCV94ZnNfaXRyYWNlX2V4aXQoaXAsIHRhZywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpCisjZGVmaW5lIHhmc19pdHJhY2VfcmVmKGlwKQlcCisJX3hmc19pdHJhY2VfcmVmKGlwLCBfX0ZJTEVfXywgX19MSU5FX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKQorCiAjZWxzZQotI2RlZmluZQl2bl90cmFjZV9lbnRyeShhLGIsYykKLSNkZWZpbmUJdm5fdHJhY2VfZXhpdChhLGIsYykKLSNkZWZpbmUJdm5fdHJhY2VfaG9sZChhLGIsYyxkKQotI2RlZmluZQl2bl90cmFjZV9yZWYoYSxiLGMsZCkKLSNkZWZpbmUJdm5fdHJhY2VfcmVsZShhLGIsYyxkKQorI2RlZmluZQl4ZnNfaXRyYWNlX2VudHJ5KGEpCisjZGVmaW5lCXhmc19pdHJhY2VfZXhpdChhKQorI2RlZmluZQl4ZnNfaXRyYWNlX2V4aXRfdGFnKGEsIGIpCisjZGVmaW5lCXhmc19pdHJhY2VfaG9sZChhLCBiLCBjLCBkKQorI2RlZmluZQl4ZnNfaXRyYWNlX3JlZihhKQorI2RlZmluZQl4ZnNfaXRyYWNlX3JlbGUoYSwgYiwgYywgZCkKICNlbmRpZgogCiAjZW5kaWYJLyogX19YRlNfVk5PREVfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmMgYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmMKaW5kZXggY2ZkZDM1ZS4uNjY1YmFiYyAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5jCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuYwpAQCAtMTIwOSw3ICsxMjA5LDYgQEAKIAl4ZnNfYnVmX3QJCSpicDsKIAl4ZnNfZGlza19kcXVvdF90CSpkZHFwOwogCWludAkJCWVycm9yOwotCVNQTERFQ0wocyk7CiAKIAlBU1NFUlQoWEZTX0RRX0lTX0xPQ0tFRChkcXApKTsKIAlBU1NFUlQoWEZTX0RRX0lTX0ZMVVNIX0xPQ0tFRChkcXApKTsKQEAgLTEyNzAsOSArMTI2OSw5IEBACiAJbXAgPSBkcXAtPnFfbW91bnQ7CiAKIAkvKiBsc24gaXMgNjQgYml0cyAqLwotCUFJTF9MT0NLKG1wLCBzKTsKKwlzcGluX2xvY2soJm1wLT5tX2FpbF9sb2NrKTsKIAlkcXAtPnFfbG9naXRlbS5xbGlfZmx1c2hfbHNuID0gZHFwLT5xX2xvZ2l0ZW0ucWxpX2l0ZW0ubGlfbHNuOwotCUFJTF9VTkxPQ0sobXAsIHMpOworCXNwaW5fdW5sb2NrKCZtcC0+bV9haWxfbG9jayk7CiAKIAkvKgogCSAqIEF0dGFjaCBhbiBpb2RvbmUgcm91dGluZSBzbyB0aGF0IHdlIGNhbiByZW1vdmUgdGhpcyBkcXVvdCBmcm9tIHRoZQpAQCAtMTMxOCw3ICsxMzE3LDYgQEAKIAl4ZnNfZHFfbG9naXRlbV90CSpxaXApCiB7CiAJeGZzX2RxdW90X3QJCSpkcXA7Ci0JU1BMREVDTChzKTsKIAogCWRxcCA9IHFpcC0+cWxpX2RxdW90OwogCkBAIC0xMzMzLDE1ICsxMzMxLDE1IEBACiAJaWYgKChxaXAtPnFsaV9pdGVtLmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkgJiYKIAkgICAgcWlwLT5xbGlfaXRlbS5saV9sc24gPT0gcWlwLT5xbGlfZmx1c2hfbHNuKSB7CiAKLQkJQUlMX0xPQ0soZHFwLT5xX21vdW50LCBzKTsKKwkJc3Bpbl9sb2NrKCZkcXAtPnFfbW91bnQtPm1fYWlsX2xvY2spOwogCQkvKgogCQkgKiB4ZnNfdHJhbnNfZGVsZXRlX2FpbCgpIGRyb3BzIHRoZSBBSUwgbG9jay4KIAkJICovCiAJCWlmIChxaXAtPnFsaV9pdGVtLmxpX2xzbiA9PSBxaXAtPnFsaV9mbHVzaF9sc24pCiAJCQl4ZnNfdHJhbnNfZGVsZXRlX2FpbChkcXAtPnFfbW91bnQsCi0JCQkJCSAgICAgKHhmc19sb2dfaXRlbV90KilxaXAsIHMpOworCQkJCQkgICAgICh4ZnNfbG9nX2l0ZW1fdCopcWlwKTsKIAkJZWxzZQotCQkJQUlMX1VOTE9DSyhkcXAtPnFfbW91bnQsIHMpOworCQkJc3Bpbl91bmxvY2soJmRxcC0+cV9tb3VudC0+bV9haWxfbG9jayk7CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuaCBiL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuaAppbmRleCA3OGQzYWI5Li41YzM3MWE5IDEwMDY0NAotLS0gYS9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmgKKysrIGIvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5oCkBAIC0xMjMsMTEgKzEyMyw2IEBACiAJCQkJICAgdnNlbWEoJigoZHFwKS0+cV9mbG9jaykpOyBcCiAJCQkJICAgKGRxcCktPmRxX2ZsYWdzICY9IH4oWEZTX0RRX0ZMT0NLRUQpOyB9CiAKLSNkZWZpbmUgWEZTX0RRX1BJTkxPQ0soZHFwKQkgICBtdXRleF9zcGlubG9jayggXAotCQkJCSAgICAgJihYRlNfRFFfVE9fUUlORihkcXApLT5xaV9waW5sb2NrKSkKLSNkZWZpbmUgWEZTX0RRX1BJTlVOTE9DSyhkcXAsIHMpICAgbXV0ZXhfc3BpbnVubG9jayggXAotCQkJCSAgICAgJihYRlNfRFFfVE9fUUlORihkcXApLT5xaV9waW5sb2NrKSwgcykKLQogI2RlZmluZSBYRlNfRFFfSVNfRkxVU0hfTE9DS0VEKGRxcCkgKGlzc2VtYWxvY2tlZCgmKChkcXApLT5xX2Zsb2NrKSkpCiAjZGVmaW5lIFhGU19EUV9JU19PTl9GUkVFTElTVChkcXApICAoKGRxcCktPmRxX2ZsbmV4dCAhPSAoZHFwKSkKICNkZWZpbmUgWEZTX0RRX0lTX0RJUlRZKGRxcCkJKChkcXApLT5kcV9mbGFncyAmIFhGU19EUV9ESVJUWSkKZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3RfaXRlbS5jIGIvZnMveGZzL3F1b3RhL3hmc19kcXVvdF9pdGVtLmMKaW5kZXggZGRiNjFmZS4uMTgwMGU4ZCAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19kcXVvdF9pdGVtLmMKKysrIGIvZnMveGZzL3F1b3RhL3hmc19kcXVvdF9pdGVtLmMKQEAgLTk0LDE0ICs5NCwxMyBAQAogeGZzX3FtX2RxdW90X2xvZ2l0ZW1fcGluKAogCXhmc19kcV9sb2dpdGVtX3QgKmxvZ2l0ZW0pCiB7Ci0JdW5zaWduZWQgbG9uZwlzOwogCXhmc19kcXVvdF90ICpkcXA7CiAKIAlkcXAgPSBsb2dpdGVtLT5xbGlfZHF1b3Q7CiAJQVNTRVJUKFhGU19EUV9JU19MT0NLRUQoZHFwKSk7Ci0JcyA9IFhGU19EUV9QSU5MT0NLKGRxcCk7CisJc3Bpbl9sb2NrKCYoWEZTX0RRX1RPX1FJTkYoZHFwKS0+cWlfcGlubG9jaykpOwogCWRxcC0+cV9waW5jb3VudCsrOwotCVhGU19EUV9QSU5VTkxPQ0soZHFwLCBzKTsKKwlzcGluX3VubG9jaygmKFhGU19EUV9UT19RSU5GKGRxcCktPnFpX3BpbmxvY2spKTsKIH0KIAogLyoKQEAgLTExNSwxNyArMTE0LDE2IEBACiAJeGZzX2RxX2xvZ2l0ZW1fdCAqbG9naXRlbSwKIAlpbnQJCSAgc3RhbGUpCiB7Ci0JdW5zaWduZWQgbG9uZwlzOwogCXhmc19kcXVvdF90ICpkcXA7CiAKIAlkcXAgPSBsb2dpdGVtLT5xbGlfZHF1b3Q7CiAJQVNTRVJUKGRxcC0+cV9waW5jb3VudCA+IDApOwotCXMgPSBYRlNfRFFfUElOTE9DSyhkcXApOworCXNwaW5fbG9jaygmKFhGU19EUV9UT19RSU5GKGRxcCktPnFpX3BpbmxvY2spKTsKIAlkcXAtPnFfcGluY291bnQtLTsKIAlpZiAoZHFwLT5xX3BpbmNvdW50ID09IDApIHsKIAkJc3ZfYnJvYWRjYXN0KCZkcXAtPnFfcGlud2FpdCk7CiAJfQotCVhGU19EUV9QSU5VTkxPQ0soZHFwLCBzKTsKKwlzcGluX3VubG9jaygmKFhGU19EUV9UT19RSU5GKGRxcCktPnFpX3BpbmxvY2spKTsKIH0KIAogLyogQVJHU1VTRUQgKi8KQEAgLTE4OSw4ICsxODcsNiBAQAogeGZzX3FtX2RxdW5waW5fd2FpdCgKIAl4ZnNfZHF1b3RfdAkqZHFwKQogewotCVNQTERFQ0wocyk7Ci0KIAlBU1NFUlQoWEZTX0RRX0lTX0xPQ0tFRChkcXApKTsKIAlpZiAoZHFwLT5xX3BpbmNvdW50ID09IDApIHsKIAkJcmV0dXJuOwpAQCAtMjAwLDkgKzE5Niw5IEBACiAJICogR2l2ZSB0aGUgbG9nIGEgcHVzaCBzbyB3ZSBkb24ndCB3YWl0IGhlcmUgdG9vIGxvbmcuCiAJICovCiAJeGZzX2xvZ19mb3JjZShkcXAtPnFfbW91bnQsICh4ZnNfbHNuX3QpMCwgWEZTX0xPR19GT1JDRSk7Ci0JcyA9IFhGU19EUV9QSU5MT0NLKGRxcCk7CisJc3Bpbl9sb2NrKCYoWEZTX0RRX1RPX1FJTkYoZHFwKS0+cWlfcGlubG9jaykpOwogCWlmIChkcXAtPnFfcGluY291bnQgPT0gMCkgewotCQlYRlNfRFFfUElOVU5MT0NLKGRxcCwgcyk7CisJCXNwaW5fdW5sb2NrKCYoWEZTX0RRX1RPX1FJTkYoZHFwKS0+cWlfcGlubG9jaykpOwogCQlyZXR1cm47CiAJfQogCXN2X3dhaXQoJihkcXAtPnFfcGlud2FpdCksIFBJTk9ELApAQCAtMjE2LDggKzIxMiw4IEBACiAgKiBJZiBzbywgd2Ugd2FudCB0byBwdXNoIGl0IG91dCB0byBoZWxwIHVzIHRha2UgdGhpcyBpdGVtIG9mZiB0aGUgQUlMIGFzIHNvb24KICAqIGFzIHBvc3NpYmxlLgogICoKLSAqIFdlIG11c3Qgbm90IGJlIGhvbGRpbmcgdGhlIEFJTF9MT0NLIGF0IHRoaXMgcG9pbnQuIENhbGxpbmcgaW5jb3JlKCkgdG8KLSAqIHNlYXJjaCB0aGUgYnVmZmVyIGNhY2hlIGNhbiBiZSBhIHRpbWUgY29uc3VtaW5nIHRoaW5nLCBhbmQgQUlMX0xPQ0sgaXMgYQorICogV2UgbXVzdCBub3QgYmUgaG9sZGluZyB0aGUgQUlMIGxvY2sgYXQgdGhpcyBwb2ludC4gQ2FsbGluZyBpbmNvcmUoKSB0bworICogc2VhcmNoIHRoZSBidWZmZXIgY2FjaGUgY2FuIGJlIGEgdGltZSBjb25zdW1pbmcgdGhpbmcsIGFuZCBBSUwgbG9jayBpcyBhCiAgKiBzcGlubG9jay4KICAqLwogU1RBVElDIHZvaWQKQEAgLTMyMiw3ICszMTgsNyBAQAogCQkgKiB3YW50IHRvIGRvIHRoYXQgbm93IHNpbmNlIHdlIG1pZ2h0IHNsZWVwIGluIHRoZSBkZXZpY2UKIAkJICogc3RyYXRlZ3kgcm91dGluZS4gIFdlIGFsc28gZG9uJ3Qgd2FudCB0byBncmFiIHRoZSBidWZmZXIgbG9jawogCQkgKiBoZXJlIGJlY2F1c2Ugd2UnZCBsaWtlIG5vdCB0byBjYWxsIGludG8gdGhlIGJ1ZmZlciBjYWNoZQotCQkgKiB3aGlsZSBob2xkaW5nIHRoZSBBSUxfTE9DSy4KKwkJICogd2hpbGUgaG9sZGluZyB0aGUgQUlMIGxvY2suCiAJCSAqIE1ha2Ugc3VyZSB0byBvbmx5IHJldHVybiBQVVNIQlVGIGlmIHdlIHNldCBwdXNoYnVmX2ZsYWcKIAkJICogb3Vyc2VsdmVzLiAgSWYgc29tZW9uZSBlbHNlIGlzIGRvaW5nIGl0IHRoZW4gd2UgZG9uJ3QKIAkJICogd2FudCB0byBnbyB0byB0aGUgcHVzaCByb3V0aW5lIGFuZCBkdXBsaWNhdGUgdGhlaXIgZWZmb3J0cy4KQEAgLTU2MiwxNSArNTU4LDE0IEBACiAJeGZzX2xzbl90IGxzbikKIHsKIAl4ZnNfcW9mZl9sb2dpdGVtX3QJKnFmczsKLQlTUExERUNMKHMpOwogCiAJcWZzID0gcWZlLT5xcWxfc3RhcnRfbGlwOwotCUFJTF9MT0NLKHFmcy0+cXFsX2l0ZW0ubGlfbW91bnRwLHMpOworCXNwaW5fbG9jaygmcWZzLT5xcWxfaXRlbS5saV9tb3VudHAtPm1fYWlsX2xvY2spOwogCS8qCiAJICogRGVsZXRlIHRoZSBxb2ZmLXN0YXJ0IGxvZ2l0ZW0gZnJvbSB0aGUgQUlMLgogCSAqIHhmc190cmFuc19kZWxldGVfYWlsKCkgZHJvcHMgdGhlIEFJTCBsb2NrLgogCSAqLwotCXhmc190cmFuc19kZWxldGVfYWlsKHFmcy0+cXFsX2l0ZW0ubGlfbW91bnRwLCAoeGZzX2xvZ19pdGVtX3QgKilxZnMsIHMpOworCXhmc190cmFuc19kZWxldGVfYWlsKHFmcy0+cXFsX2l0ZW0ubGlfbW91bnRwLCAoeGZzX2xvZ19pdGVtX3QgKilxZnMpOwogCWttZW1fZnJlZShxZnMsIHNpemVvZih4ZnNfcW9mZl9sb2dpdGVtX3QpKTsKIAlrbWVtX2ZyZWUocWZlLCBzaXplb2YoeGZzX3FvZmZfbG9naXRlbV90KSk7CiAJcmV0dXJuICh4ZnNfbHNuX3QpLTE7CmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX3FtLmMgYi9mcy94ZnMvcXVvdGEveGZzX3FtLmMKaW5kZXggZDQ4ODY0NS4uMzU1ODJmZSAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19xbS5jCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfcW0uYwpAQCAtMzEwLDcgKzMxMCw2IEBACiAJeGZzX21vdW50X3QJKm1wLAogCWludAkJbWZzaV9mbGFncykKIHsKLQl1bnNpZ25lZCBsb25nCXM7CiAJaW50CQllcnJvciA9IDA7CiAJdWludAkJc2JmOwogCkBAIC0zNjcsMTMgKzM2NiwxMyBAQAogCiAgd3JpdGVfY2hhbmdlczoKIAkvKgotCSAqIFdlIGFjdHVhbGx5IGRvbid0IGhhdmUgdG8gYWNxdWlyZSB0aGUgU0JfTE9DSyBhdCBhbGwuCisJICogV2UgYWN0dWFsbHkgZG9uJ3QgaGF2ZSB0byBhY3F1aXJlIHRoZSBtX3NiX2xvY2sgYXQgYWxsLgogCSAqIFRoaXMgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gbW91bnQsIGFuZCB0aGF0J3Mgc2luZ2xlIHRocmVhZGVkLiBYWFgKIAkgKi8KLQlzID0gWEZTX1NCX0xPQ0sobXApOworCXNwaW5fbG9jaygmbXAtPm1fc2JfbG9jayk7CiAJc2JmID0gbXAtPm1fc2Iuc2JfcWZsYWdzOwogCW1wLT5tX3NiLnNiX3FmbGFncyA9IG1wLT5tX3FmbGFncyAmIFhGU19NT1VOVF9RVU9UQV9BTEw7Ci0JWEZTX1NCX1VOTE9DSyhtcCwgcyk7CisJc3Bpbl91bmxvY2soJm1wLT5tX3NiX2xvY2spOwogCiAJaWYgKHNiZiAhPSAobXAtPm1fcWZsYWdzICYgWEZTX01PVU5UX1FVT1RBX0FMTCkpIHsKIAkJaWYgKHhmc19xbV93cml0ZV9zYl9jaGFuZ2VzKG1wLCBYRlNfU0JfUUZMQUdTKSkgewpAQCAtMTEzOSw3ICsxMTM4LDcgQEAKIAkJcmV0dXJuIGVycm9yOwogCX0KIAotCXNwaW5sb2NrX2luaXQoJnFpbmYtPnFpX3BpbmxvY2ssICJ4ZnNfcWluZl9waW4iKTsKKwlzcGluX2xvY2tfaW5pdCgmcWluZi0+cWlfcGlubG9jayk7CiAJeGZzX3FtX2xpc3RfaW5pdCgmcWluZi0+cWlfZHFsaXN0LCAibXBkcWxpc3QiLCAwKTsKIAlxaW5mLT5xaV9kcXJlY2xhaW1zID0gMDsKIApAQCAtMTM3MCw3ICsxMzY5LDYgQEAKIHsKIAl4ZnNfdHJhbnNfdAkqdHA7CiAJaW50CQllcnJvcjsKLQl1bnNpZ25lZCBsb25nCXM7CiAJaW50CQljb21taXR0ZWQ7CiAKIAl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX1FNX1FJTk9DUkVBVEUpOwpAQCAtMTQwMiw3ICsxNDAwLDcgQEAKIAkgKiBzYmZpZWxkcyBhcmcgbWF5IGNvbnRhaW4gZmllbGRzIG90aGVyIHRoYW4gKlFVT1RJTk87CiAJICogVkVSU0lPTk5VTSBmb3IgZXhhbXBsZS4KIAkgKi8KLQlzID0gWEZTX1NCX0xPQ0sobXApOworCXNwaW5fbG9jaygmbXAtPm1fc2JfbG9jayk7CiAJaWYgKGZsYWdzICYgWEZTX1FNT1BUX1NCVkVSU0lPTikgewogI2lmIGRlZmluZWQoREVCVUcpICYmIGRlZmluZWQoWEZTX0xPVURfUkVDT1ZFUlkpCiAJCXVuc2lnbmVkIG9sZHYgPSBtcC0+bV9zYi5zYl92ZXJzaW9ubnVtOwpAQCAtMTQyOSw3ICsxNDI3LDcgQEAKIAkJbXAtPm1fc2Iuc2JfdXF1b3Rpbm8gPSAoKmlwKS0+aV9pbm87CiAJZWxzZQogCQltcC0+bV9zYi5zYl9ncXVvdGlubyA9ICgqaXApLT5pX2lubzsKLQlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKKwlzcGluX3VubG9jaygmbXAtPm1fc2JfbG9jayk7CiAJeGZzX21vZF9zYih0cCwgc2JmaWVsZHMpOwogCiAJaWYgKChlcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMpKSkgewpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19xbS5oIGIvZnMveGZzL3F1b3RhL3hmc19xbS5oCmluZGV4IDIzY2NhYTUuLmJhZjUzN2MgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9xdW90YS94ZnNfcW0uaAorKysgYi9mcy94ZnMvcXVvdGEveGZzX3FtLmgKQEAgLTUyLDggKzUyLDggQEAKIC8qCiAgKiBEcXVvdCBoYXNodGFibGUgY29uc3RhbnRzL3RocmVzaG9sZCB2YWx1ZXMuCiAgKi8KLSNkZWZpbmUgWEZTX1FNX0hBU0hTSVpFX0xPVwkJKE5CUFAgLyBzaXplb2YoeGZzX2RxaGFzaF90KSkKLSNkZWZpbmUgWEZTX1FNX0hBU0hTSVpFX0hJR0gJCSgoTkJQUCAqIDQpIC8gc2l6ZW9mKHhmc19kcWhhc2hfdCkpCisjZGVmaW5lIFhGU19RTV9IQVNIU0laRV9MT1cJCShQQUdFX1NJWkUgLyBzaXplb2YoeGZzX2RxaGFzaF90KSkKKyNkZWZpbmUgWEZTX1FNX0hBU0hTSVpFX0hJR0gJCSgoUEFHRV9TSVpFICogNCkgLyBzaXplb2YoeGZzX2RxaGFzaF90KSkKIAogLyoKICAqIFRoaXMgZGVmaW5lcyB0aGUgdW5pdCBvZiBhbGxvY2F0aW9uIG9mIGRxdW90cy4KQEAgLTEwNiw3ICsxMDYsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgeGZzX3F1b3RhaW5mbyB7CiAJeGZzX2lub2RlX3QJKnFpX3VxdW90YWlwOwkgLyogdXNlciBxdW90YSBpbm9kZSAqLwogCXhmc19pbm9kZV90CSpxaV9ncXVvdGFpcDsJIC8qIGdyb3VwIHF1b3RhIGlub2RlICovCi0JbG9ja190CQkgcWlfcGlubG9jazsJIC8qIGRxdW90IHBpbm5pbmcgbXV0ZXggKi8KKwlzcGlubG9ja190CSBxaV9waW5sb2NrOwkgLyogZHF1b3QgcGlubmluZyBsb2NrICovCiAJeGZzX2RxbGlzdF90CSBxaV9kcWxpc3Q7CSAvKiBhbGwgZHF1b3RzIGluIGZpbGVzeXMgKi8KIAlpbnQJCSBxaV9kcXJlY2xhaW1zOwkgLyogYSBjaGFuZ2UgaGVyZSBpbmRpY2F0ZXMKIAkJCQkJICAgIGEgcmVtb3ZhbCBpbiB0aGUgZHFsaXN0ICovCmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX3FtX3N5c2NhbGxzLmMgYi9mcy94ZnMvcXVvdGEveGZzX3FtX3N5c2NhbGxzLmMKaW5kZXggYWQ1NTc5ZC4uMmNjNTg4NiAxMDA2NDQKLS0tIGEvZnMveGZzL3F1b3RhL3hmc19xbV9zeXNjYWxscy5jCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfcW1fc3lzY2FsbHMuYwpAQCAtMjAwLDcgKzIwMCw2IEBACiAJYm9vbGVhbl90CQlmb3JjZSkKIHsKIAl1aW50CQkJZHF0eXBlOwotCXVuc2lnbmVkIGxvbmcJczsKIAlpbnQJCQllcnJvcjsKIAl1aW50CQkJaW5hY3RpdmF0ZV9mbGFnczsKIAl4ZnNfcW9mZl9sb2dpdGVtX3QJKnFvZmZzdGFydDsKQEAgLTIzNyw5ICsyMzYsOSBAQAogCWlmICgoZmxhZ3MgJiBYRlNfQUxMX1FVT1RBX0FDQ1QpID09IDApIHsKIAkJbXAtPm1fcWZsYWdzICY9IH4oZmxhZ3MpOwogCi0JCXMgPSBYRlNfU0JfTE9DSyhtcCk7CisJCXNwaW5fbG9jaygmbXAtPm1fc2JfbG9jayk7CiAJCW1wLT5tX3NiLnNiX3FmbGFncyA9IG1wLT5tX3FmbGFnczsKLQkJWEZTX1NCX1VOTE9DSyhtcCwgcyk7CisJCXNwaW5fdW5sb2NrKCZtcC0+bV9zYl9sb2NrKTsKIAkJbXV0ZXhfdW5sb2NrKCYoWEZTX1FJX1FPRkZMT0NLKG1wKSkpOwogCiAJCS8qIFhYWCB3aGF0IHRvIGRvIGlmIGVycm9yID8gUmV2ZXJ0IGJhY2sgdG8gb2xkIHZhbHMgaW5jb3JlID8gKi8KQEAgLTQxNSw3ICs0MTQsNiBAQAogCXVpbnQJCWZsYWdzKQogewogCWludAkJZXJyb3I7Ci0JdW5zaWduZWQgbG9uZwlzOwogCXVpbnQJCXFmOwogCXVpbnQJCWFjY2ZsYWdzOwogCV9faW50NjRfdAlzYmZsYWdzOwpAQCAtNDY4LDEwICs0NjYsMTAgQEAKIAkgKiBDaGFuZ2Ugc2JfcWZsYWdzIG9uIGRpc2sgYnV0IG5vdCBpbmNvcmUgbXAtPnFmbGFncwogCSAqIGlmIHRoaXMgaXMgdGhlIHJvb3QgZmlsZXN5c3RlbS4KIAkgKi8KLQlzID0gWEZTX1NCX0xPQ0sobXApOworCXNwaW5fbG9jaygmbXAtPm1fc2JfbG9jayk7CiAJcWYgPSBtcC0+bV9zYi5zYl9xZmxhZ3M7CiAJbXAtPm1fc2Iuc2JfcWZsYWdzID0gcWYgfCBmbGFnczsKLQlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKKwlzcGluX3VubG9jaygmbXAtPm1fc2JfbG9jayk7CiAKIAkvKgogCSAqIFRoZXJlJ3Mgbm90aGluZyB0byBjaGFuZ2UgaWYgaXQncyB0aGUgc2FtZS4KQEAgLTgxNSw3ICs4MTMsNiBAQAogewogCXhmc190cmFuc190CSAgICAgICAqdHA7CiAJaW50CQkJZXJyb3I7Ci0JdW5zaWduZWQgbG9uZwlzOwogCXhmc19xb2ZmX2xvZ2l0ZW1fdCAgICAgKnFvZmZpPU5VTEw7CiAJdWludAkJCW9sZHNicWZsYWc9MDsKIApAQCAtODMyLDEwICs4MjksMTAgQEAKIAlxb2ZmaSA9IHhmc190cmFuc19nZXRfcW9mZl9pdGVtKHRwLCBOVUxMLCBmbGFncyAmIFhGU19BTExfUVVPVEFfQUNDVCk7CiAJeGZzX3RyYW5zX2xvZ19xdW90YW9mZl9pdGVtKHRwLCBxb2ZmaSk7CiAKLQlzID0gWEZTX1NCX0xPQ0sobXApOworCXNwaW5fbG9jaygmbXAtPm1fc2JfbG9jayk7CiAJb2xkc2JxZmxhZyA9IG1wLT5tX3NiLnNiX3FmbGFnczsKIAltcC0+bV9zYi5zYl9xZmxhZ3MgPSAobXAtPm1fcWZsYWdzICYgfihmbGFncykpICYgWEZTX01PVU5UX1FVT1RBX0FMTDsKLQlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKKwlzcGluX3VubG9jaygmbXAtPm1fc2JfbG9jayk7CiAKIAl4ZnNfbW9kX3NiKHRwLCBYRlNfU0JfUUZMQUdTKTsKIApAQCAtODU0LDkgKzg1MSw5IEBACiAJCSAqIE5vIG9uZSBlbHNlIGlzIG1vZGlmeWluZyBzYl9xZmxhZ3MsIHNvIHRoaXMgaXMgT0suCiAJCSAqIFdlIHN0aWxsIGhvbGQgdGhlIHF1b3Rhb2ZmbG9jay4KIAkJICovCi0JCXMgPSBYRlNfU0JfTE9DSyhtcCk7CisJCXNwaW5fbG9jaygmbXAtPm1fc2JfbG9jayk7CiAJCW1wLT5tX3NiLnNiX3FmbGFncyA9IG9sZHNicWZsYWc7Ci0JCVhGU19TQl9VTkxPQ0sobXAsIHMpOworCQlzcGluX3VubG9jaygmbXAtPm1fc2JfbG9jayk7CiAJfQogCSpxb2Zmc3RhcnRwID0gcW9mZmk7CiAJcmV0dXJuIChlcnJvcik7CmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5jIGIvZnMveGZzL3N1cHBvcnQvZGVidWcuYwppbmRleCBmNDVhNDlmLi5jMjdhYmVmIDEwMDY0NAotLS0gYS9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5jCisrKyBiL2ZzL3hmcy9zdXBwb3J0L2RlYnVnLmMKQEAgLTE3LDcgKzE3LDYgQEAKICAqLwogI2luY2x1ZGUgPHhmcy5oPgogI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAic3Bpbi5oIgogCiBzdGF0aWMgY2hhcgkJbWVzc2FnZVsxMDI0XTsJLyoga2VlcCBpdCBvZmYgdGhlIHN0YWNrICovCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHhmc19lcnJfbG9jayk7CkBAIC04MSwzICs4MCw5IEBACiAJcHJpbnRrKCJBc3NlcnRpb24gZmFpbGVkOiAlcywgZmlsZTogJXMsIGxpbmU6ICVkXG4iLCBleHByLCBmaWxlLCBsaW5lKTsKIAlCVUcoKTsKIH0KKwordm9pZAoreGZzX2hleF9kdW1wKHZvaWQgKnAsIGludCBsZW5ndGgpCit7CisJcHJpbnRfaGV4X2R1bXAoS0VSTl9BTEVSVCwgIiIsIERVTVBfUFJFRklYX09GRlNFVCwgMTYsIDEsIHAsIGxlbmd0aCwgMSk7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9rdHJhY2UuYyBiL2ZzL3hmcy9zdXBwb3J0L2t0cmFjZS5jCmluZGV4IDVjZjJlODYuLjEyOTA2N2MgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9zdXBwb3J0L2t0cmFjZS5jCisrKyBiL2ZzL3hmcy9zdXBwb3J0L2t0cmFjZS5jCkBAIC0yMSw3ICsyMSw3IEBACiBzdGF0aWMga21lbV96b25lX3QgKmt0cmFjZV9lbnRfem9uZTsKIHN0YXRpYyBpbnQgICAgICAgICAga3RyYWNlX3plbnRyaWVzOwogCi12b2lkCit2b2lkIF9faW5pdAoga3RyYWNlX2luaXQoaW50IHplbnRyaWVzKQogewogCWt0cmFjZV96ZW50cmllcyA9IHplbnRyaWVzOwpAQCAtMzYsNyArMzYsNyBAQAogCUFTU0VSVChrdHJhY2VfZW50X3pvbmUpOwogfQogCi12b2lkCit2b2lkIF9fZXhpdAoga3RyYWNlX3VuaW5pdCh2b2lkKQogewogCWttZW1fem9uZV9kZXN0cm95KGt0cmFjZV9oZHJfem9uZSk7CkBAIC05MCw4ICs5MCw2IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCXNwaW5sb2NrX2luaXQoJihrdHAtPmt0X2xvY2spLCAia3RfbG9jayIpOwotCiAJa3RwLT5rdF9lbnRyaWVzICA9IGt0ZXA7CiAJa3RwLT5rdF9uZW50cmllcyA9IG5lbnRyaWVzOwogCWt0cC0+a3RfaW5kZXggICAgPSAwOwpAQCAtMTE0LDggKzExMiw2IEBACiAJaWYgKGt0cCA9PSAoa3RyYWNlX3QgKilOVUxMKQogCQlyZXR1cm47CiAKLQlzcGlubG9ja19kZXN0cm95KCZrdHAtPmt0X2xvY2spOwotCiAJLyoKIAkgKiBTcGVjaWFsIHRyZWF0bWVudCBmb3IgdGhlIFZub2RlIHRyYWNlIGJ1ZmZlci4KIAkgKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9zdXBwb3J0L2t0cmFjZS5oIGIvZnMveGZzL3N1cHBvcnQva3RyYWNlLmgKaW5kZXggMGQ3MzIxNi4uNTZlNzJiNCAxMDA2NDQKLS0tIGEvZnMveGZzL3N1cHBvcnQva3RyYWNlLmgKKysrIGIvZnMveGZzL3N1cHBvcnQva3RyYWNlLmgKQEAgLTE4LDggKzE4LDYgQEAKICNpZm5kZWYgX19YRlNfU1VQUE9SVF9LVFJBQ0VfSF9fCiAjZGVmaW5lIF9fWEZTX1NVUFBPUlRfS1RSQUNFX0hfXwogCi0jaW5jbHVkZSA8c3Bpbi5oPgotCiAvKgogICogVHJhY2UgYnVmZmVyIGVudHJ5IHN0cnVjdHVyZS4KICAqLwpAQCAtMzEsNyArMjksNiBAQAogICogVHJhY2UgYnVmZmVyIGhlYWRlciBzdHJ1Y3R1cmUuCiAgKi8KIHR5cGVkZWYgc3RydWN0IGt0cmFjZSB7Ci0JbG9ja190CQlrdF9sb2NrOwkvKiBtdXRleCB0byBndWFyZCBjb3VudGVycyAqLwogCWludAkJa3RfbmVudHJpZXM7CS8qIG51bWJlciBvZiBlbnRyaWVzIGluIHRyYWNlIGJ1ZiAqLwogCWludAkJa3RfaW5kZXg7CS8qIGN1cnJlbnQgaW5kZXggaW4gZW50cmllcyAqLwogCWludAkJa3Rfcm9sbG92ZXI7CmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC91dWlkLmMgYi9mcy94ZnMvc3VwcG9ydC91dWlkLmMKaW5kZXggZTE1NzAxNS4uNDkzYTZlYyAxMDA2NDQKLS0tIGEvZnMveGZzL3N1cHBvcnQvdXVpZC5jCisrKyBiL2ZzL3hmcy9zdXBwb3J0L3V1aWQuYwpAQCAtMTMzLDcgKzEzMyw3IEBACiAJbXV0ZXhfdW5sb2NrKCZ1dWlkX21vbml0b3IpOwogfQogCi12b2lkCit2b2lkIF9faW5pdAogdXVpZF9pbml0KHZvaWQpCiB7CiAJbXV0ZXhfaW5pdCgmdXVpZF9tb25pdG9yKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnMuaCBiL2ZzL3hmcy94ZnMuaAppbmRleCBiNWE3ZDkyLi41NDBlNGM5IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzLmgKKysrIGIvZnMveGZzL3hmcy5oCkBAIC0zNyw3ICszNyw3IEBACiAjZGVmaW5lIFhGU19MT0dfVFJBQ0UgMQogI2RlZmluZSBYRlNfUldfVFJBQ0UgMQogI2RlZmluZSBYRlNfQlVGX1RSQUNFIDEKLSNkZWZpbmUgWEZTX1ZOT0RFX1RSQUNFIDEKKyNkZWZpbmUgWEZTX0lOT0RFX1RSQUNFIDEKICNkZWZpbmUgWEZTX0ZJTEVTVFJFQU1TX1RSQUNFIDEKICNlbmRpZgogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FjbC5jIGIvZnMveGZzL3hmc19hY2wuYwppbmRleCA1YmZiNjZmLi43MjcyZmUzIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2FjbC5jCisrKyBiL2ZzL3hmcy94ZnNfYWNsLmMKQEAgLTM5MiwzMiArMzkyLDYgQEAKIH0KIAogLyoKLSAqIFRoZSBhY2Nlc3MgY29udHJvbCBwcm9jZXNzIHRvIGRldGVybWluZSB0aGUgYWNjZXNzIHBlcm1pc3Npb246Ci0gKglpZiB1aWQgPT0gZmlsZSBvd25lciBpZCwgdXNlIHRoZSBmaWxlIG93bmVyIGJpdHMuCi0gKglpZiBnaWQgPT0gZmlsZSBvd25lciBncm91cCBpZCwgdXNlIHRoZSBmaWxlIGdyb3VwIGJpdHMuCi0gKglzY2FuIEFDTCBmb3IgYSBtYXRjaGluZyB1c2VyIG9yIGdyb3VwLCBhbmQgdXNlIG1hdGNoZWQgZW50cnkKLSAqCXBlcm1pc3Npb24uIFVzZSB0b3RhbCBwZXJtaXNzaW9ucyBvZiBhbGwgbWF0Y2hpbmcgZ3JvdXAgZW50cmllcywKLSAqCXVudGlsIGFsbCBhY2wgZW50cmllcyBhcmUgZXhoYXVzdGVkLiBUaGUgZmluYWwgcGVybWlzc2lvbiBwcm9kdWNlZAotICoJYnkgbWF0Y2hpbmcgYWNsIGVudHJ5IG9yIGVudHJpZXMgbmVlZHMgdG8gYmUgJiB3aXRoIGdyb3VwIHBlcm1pc3Npb24uCi0gKglpZiBub3Qgb3duZXIsIG93bmluZyBncm91cCwgb3IgbWF0Y2hpbmcgZW50cnkgaW4gQUNMLCB1c2UgZmlsZQotICoJb3RoZXIgYml0cy4gIAotICovCi1TVEFUSUMgaW50Ci14ZnNfYWNsX2NhcGFiaWxpdHlfY2hlY2soCi0JbW9kZV90CQltb2RlLAotCWNyZWRfdAkJKmNyKQotewotCWlmICgobW9kZSAmIEFDTF9SRUFEKSAmJiAhY2FwYWJsZV9jcmVkKGNyLCBDQVBfREFDX1JFQURfU0VBUkNIKSkKLQkJcmV0dXJuIEVBQ0NFUzsKLQlpZiAoKG1vZGUgJiBBQ0xfV1JJVEUpICYmICFjYXBhYmxlX2NyZWQoY3IsIENBUF9EQUNfT1ZFUlJJREUpKQotCQlyZXR1cm4gRUFDQ0VTOwotCWlmICgobW9kZSAmIEFDTF9FWEVDVVRFKSAmJiAhY2FwYWJsZV9jcmVkKGNyLCBDQVBfREFDX09WRVJSSURFKSkKLQkJcmV0dXJuIEVBQ0NFUzsKLQotCXJldHVybiAwOwotfQotCi0vKgogICogTm90ZTogY3IgaXMgb25seSB1c2VkIGhlcmUgZm9yIHRoZSBjYXBhYmlsaXR5IGNoZWNrIGlmIHRoZSBBQ0wgdGVzdCBmYWlscy4KICAqICAgICAgIEl0IGlzIG5vdCB1c2VkIHRvIGZpbmQgb3V0IHRoZSBjcmVkZW50aWFscyB1aWQgb3IgZ3JvdXBzIGV0YywgYXMgd2FzCiAgKiAgICAgICBkb25lIGluIElSSVguIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgdWlkIGFuZCBncm91cHMgZm9yIHRoZSBjdXJyZW50CkBAIC00MzgsNyArNDEyLDYgQEAKIAogCW1hdGNoZWQuYWVfdGFnID0gMDsJLyogSW52YWxpZCB0eXBlICovCiAJbWF0Y2hlZC5hZV9wZXJtID0gMDsKLQltZCA+Pj0gNjsJLyogTm9ybWFsaXplIHRoZSBiaXRzIGZvciBjb21wYXJpc29uICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgZmFwLT5hY2xfY250OyBpKyspIHsKIAkJLyoKQEAgLTUyMCw3ICs0OTMsOCBAQAogCQlicmVhazsKIAl9CiAKLQlyZXR1cm4geGZzX2FjbF9jYXBhYmlsaXR5X2NoZWNrKG1kLCBjcik7CisJLyogRUFDQ0VTIHRlbGxzIGdlbmVyaWNfcGVybWlzc2lvbiB0byBjaGVjayBmb3IgY2FwYWJpbGl0eSBvdmVycmlkZXMgKi8KKwlyZXR1cm4gRUFDQ0VTOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hY2wuaCBiL2ZzL3hmcy94ZnNfYWNsLmgKaW5kZXggMzRiN2QzMy4uMzMyYTc3MiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hY2wuaAorKysgYi9mcy94ZnMveGZzX2FjbC5oCkBAIC03NSw3ICs3NSw2IEBACiAjZGVmaW5lIF9BQ0xfR0VUX0RFRkFVTFQocHYscGQpCSh4ZnNfYWNsX3Z0b2FjbChwdixOVUxMLHBkKSA9PSAwKQogI2RlZmluZSBfQUNMX0FDQ0VTU19FWElTVFMJeGZzX2FjbF92aGFzYWNsX2FjY2VzcwogI2RlZmluZSBfQUNMX0RFRkFVTFRfRVhJU1RTCXhmc19hY2xfdmhhc2FjbF9kZWZhdWx0Ci0jZGVmaW5lIF9BQ0xfWEZTX0lBQ0NFU1MoaSxtLGMpIChYRlNfSUZPUktfUShpKSA/IHhmc19hY2xfaWFjY2VzcyhpLG0sYykgOiAtMSkKIAogI2RlZmluZSBfQUNMX0FMTE9DKGEpCQkoKGEpID0ga21lbV96b25lX2FsbG9jKHhmc19hY2xfem9uZSwgS01fU0xFRVApKQogI2RlZmluZSBfQUNMX0ZSRUUoYSkJCSgoYSk/IGttZW1fem9uZV9mcmVlKHhmc19hY2xfem9uZSwgKGEpKToodm9pZCkwKQpAQCAtOTUsNyArOTQsNiBAQAogI2RlZmluZSBfQUNMX0dFVF9ERUZBVUxUKHB2LHBkKQkoMCkKICNkZWZpbmUgX0FDTF9BQ0NFU1NfRVhJU1RTCShOVUxMKQogI2RlZmluZSBfQUNMX0RFRkFVTFRfRVhJU1RTCShOVUxMKQotI2RlZmluZSBfQUNMX1hGU19JQUNDRVNTKGksbSxjKSAoLTEpCiAjZW5kaWYKIAogI2VuZGlmCS8qIF9fWEZTX0FDTF9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYWcuaCBiL2ZzL3hmcy94ZnNfYWcuaAppbmRleCA5MzgxYjAzLi42MWIyOTJhIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2FnLmgKKysrIGIvZnMveGZzL3hmc19hZy5oCkBAIC0xOTMsNyArMTkzLDcgQEAKIAl4ZnNfYWdpbm9fdAlwYWdpX2NvdW50OwkvKiBudW1iZXIgb2YgYWxsb2NhdGVkIGlub2RlcyAqLwogCWludAkJcGFnYl9jb3VudDsJLyogcGFnYiBzbG90cyBpbiB1c2UgKi8KICNpZmRlZiBfX0tFUk5FTF9fCi0JbG9ja190CQlwYWdiX2xvY2s7CS8qIGxvY2sgZm9yIHBhZ2JfbGlzdCAqLworCXNwaW5sb2NrX3QJcGFnYl9sb2NrOwkvKiBsb2NrIGZvciBwYWdiX2xpc3QgKi8KICNlbmRpZgogCXhmc19wZXJhZ19idXN5X3QgKnBhZ2JfbGlzdDsJLyogdW5zdGFibGUgYmxvY2tzICovCiAJYXRvbWljX3QgICAgICAgIHBhZ2ZfZnN0cm1zOyAgICAvKiAjIG9mIGZpbGVzdHJlYW1zIGFjdGl2ZSBpbiB0aGlzIEFHICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FsbG9jLmMgYi9mcy94ZnMveGZzX2FsbG9jLmMKaW5kZXggMDEyYTY0OS4uZWE2YWE2MCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hbGxvYy5jCisrKyBiL2ZzL3hmcy94ZnNfYWxsb2MuYwpAQCAtMjIwNiw3ICsyMjA2LDcgQEAKIAkJCWJlMzJfdG9fY3B1KGFnZi0+YWdmX2xldmVsc1tYRlNfQlROVU1fQk5PaV0pOwogCQlwYWctPnBhZ2ZfbGV2ZWxzW1hGU19CVE5VTV9DTlRpXSA9CiAJCQliZTMyX3RvX2NwdShhZ2YtPmFnZl9sZXZlbHNbWEZTX0JUTlVNX0NOVGldKTsKLQkJc3BpbmxvY2tfaW5pdCgmcGFnLT5wYWdiX2xvY2ssICJ4ZnNwYWdiIik7CisJCXNwaW5fbG9ja19pbml0KCZwYWctPnBhZ2JfbG9jayk7CiAJCXBhZy0+cGFnYl9saXN0ID0ga21lbV96YWxsb2MoWEZTX1BBR0JfTlVNX1NMT1RTICoKIAkJCQkJc2l6ZW9mKHhmc19wZXJhZ19idXN5X3QpLCBLTV9TTEVFUCk7CiAJCXBhZy0+cGFnZl9pbml0ID0gMTsKQEAgLTI1MDAsMTAgKzI1MDAsOSBAQAogCXhmc19tb3VudF90CQkqbXA7CiAJeGZzX3BlcmFnX2J1c3lfdAkqYnN5OwogCWludAkJCW47Ci0JU1BMREVDTChzKTsKIAogCW1wID0gdHAtPnRfbW91bnRwOwotCXMgPSBtdXRleF9zcGlubG9jaygmbXAtPm1fcGVyYWdbYWdub10ucGFnYl9sb2NrKTsKKwlzcGluX2xvY2soJm1wLT5tX3BlcmFnW2Fnbm9dLnBhZ2JfbG9jayk7CiAKIAkvKiBzZWFyY2ggcGFnYl9saXN0IGZvciBhbiBvcGVuIHNsb3QgKi8KIAlmb3IgKGJzeSA9IG1wLT5tX3BlcmFnW2Fnbm9dLnBhZ2JfbGlzdCwgbiA9IDA7CkBAIC0yNTMzLDcgKzI1MzIsNyBAQAogCQl4ZnNfdHJhbnNfc2V0X3N5bmModHApOwogCX0KIAotCW11dGV4X3NwaW51bmxvY2soJm1wLT5tX3BlcmFnW2Fnbm9dLnBhZ2JfbG9jaywgcyk7CisJc3Bpbl91bmxvY2soJm1wLT5tX3BlcmFnW2Fnbm9dLnBhZ2JfbG9jayk7CiB9CiAKIHZvaWQKQEAgLTI1NDMsMTEgKzI1NDIsMTAgQEAKIHsKIAl4ZnNfbW91bnRfdAkJKm1wOwogCXhmc19wZXJhZ19idXN5X3QJKmxpc3Q7Ci0JU1BMREVDTChzKTsKIAogCW1wID0gdHAtPnRfbW91bnRwOwogCi0JcyA9IG11dGV4X3NwaW5sb2NrKCZtcC0+bV9wZXJhZ1thZ25vXS5wYWdiX2xvY2spOworCXNwaW5fbG9jaygmbXAtPm1fcGVyYWdbYWdub10ucGFnYl9sb2NrKTsKIAlsaXN0ID0gbXAtPm1fcGVyYWdbYWdub10ucGFnYl9saXN0OwogCiAJQVNTRVJUKGlkeCA8IFhGU19QQUdCX05VTV9TTE9UUyk7CkBAIC0yNTU5LDcgKzI1NTcsNyBAQAogCQlUUkFDRV9VTkJVU1koInhmc19hbGxvY19jbGVhcl9idXN5IiwgIm1pc3NpbmciLCBhZ25vLCBpZHgsIHRwKTsKIAl9CiAKLQltdXRleF9zcGludW5sb2NrKCZtcC0+bV9wZXJhZ1thZ25vXS5wYWdiX2xvY2ssIHMpOworCXNwaW5fdW5sb2NrKCZtcC0+bV9wZXJhZ1thZ25vXS5wYWdiX2xvY2spOwogfQogCiAKQEAgLTI1NzgsMTEgKzI1NzYsMTAgQEAKIAl4ZnNfYWdibG9ja190CQl1ZW5kLCBiZW5kOwogCXhmc19sc25fdAkJbHNuOwogCWludAkJCWNudDsKLQlTUExERUNMKHMpOwogCiAJbXAgPSB0cC0+dF9tb3VudHA7CiAKLQlzID0gbXV0ZXhfc3BpbmxvY2soJm1wLT5tX3BlcmFnW2Fnbm9dLnBhZ2JfbG9jayk7CisJc3Bpbl9sb2NrKCZtcC0+bV9wZXJhZ1thZ25vXS5wYWdiX2xvY2spOwogCWNudCA9IG1wLT5tX3BlcmFnW2Fnbm9dLnBhZ2JfY291bnQ7CiAKIAl1ZW5kID0gYm5vICsgbGVuIC0gMTsKQEAgLTI2MTUsMTIgKzI2MTIsMTIgQEAKIAlpZiAoY250KSB7CiAJCVRSQUNFX0JVU1lTRUFSQ0goInhmc19hbGxvY19zZWFyY2hfYnVzeSIsICJmb3VuZCIsIGFnbm8sIGJubywgbGVuLCBuLCB0cCk7CiAJCWxzbiA9IGJzeS0+YnVzeV90cC0+dF9jb21taXRfbHNuOwotCQltdXRleF9zcGludW5sb2NrKCZtcC0+bV9wZXJhZ1thZ25vXS5wYWdiX2xvY2ssIHMpOworCQlzcGluX3VubG9jaygmbXAtPm1fcGVyYWdbYWdub10ucGFnYl9sb2NrKTsKIAkJeGZzX2xvZ19mb3JjZShtcCwgbHNuLCBYRlNfTE9HX0ZPUkNFfFhGU19MT0dfU1lOQyk7CiAJfSBlbHNlIHsKIAkJVFJBQ0VfQlVTWVNFQVJDSCgieGZzX2FsbG9jX3NlYXJjaF9idXN5IiwgIm5vdC1mb3VuZCIsIGFnbm8sIGJubywgbGVuLCBuLCB0cCk7CiAJCW4gPSAtMTsKLQkJbXV0ZXhfc3BpbnVubG9jaygmbXAtPm1fcGVyYWdbYWdub10ucGFnYl9sb2NrLCBzKTsKKwkJc3Bpbl91bmxvY2soJm1wLT5tX3BlcmFnW2Fnbm9dLnBhZ2JfbG9jayk7CiAJfQogCiAJcmV0dXJuIG47CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2F0dHIuYyBiL2ZzL3hmcy94ZnNfYXR0ci5jCmluZGV4IDkzZmE2NGQuLmU1OGYzMjEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYXR0ci5jCisrKyBiL2ZzL3hmcy94ZnNfYXR0ci5jCkBAIC05MjksNyArOTI5LDcgQEAKICAqIFRoaXMgbGVhZiBibG9jayBjYW5ub3QgaGF2ZSBhICJyZW1vdGUiIHZhbHVlLCB3ZSBvbmx5IGNhbGwgdGhpcyByb3V0aW5lCiAgKiBpZiBibWFwX29uZV9ibG9jaygpIHNheXMgdGhlcmUgaXMgb25seSBvbmUgYmxvY2sgKGllOiBubyByZW1vdGUgYmxrcykuCiAgKi8KLWludAorU1RBVElDIGludAogeGZzX2F0dHJfbGVhZl9hZGRuYW1lKHhmc19kYV9hcmdzX3QgKmFyZ3MpCiB7CiAJeGZzX2lub2RlX3QgKmRwOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hdHRyX2xlYWYuYyBiL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMKaW5kZXggODFmNDVkYS4uZWIzODE1ZSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hdHRyX2xlYWYuYworKysgYi9mcy94ZnMveGZzX2F0dHJfbGVhZi5jCkBAIC0yMjYsMTcgKzIyNiwxNSBAQAogU1RBVElDIHZvaWQKIHhmc19zYnZlcnNpb25fYWRkX2F0dHIyKHhmc19tb3VudF90ICptcCwgeGZzX3RyYW5zX3QgKnRwKQogewotCXVuc2lnbmVkIGxvbmcgczsKLQogCWlmICgobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQVRUUjIpICYmCiAJICAgICEoWEZTX1NCX1ZFUlNJT05fSEFTQVRUUjIoJm1wLT5tX3NiKSkpIHsKLQkJcyA9IFhGU19TQl9MT0NLKG1wKTsKKwkJc3Bpbl9sb2NrKCZtcC0+bV9zYl9sb2NrKTsKIAkJaWYgKCFYRlNfU0JfVkVSU0lPTl9IQVNBVFRSMigmbXAtPm1fc2IpKSB7CiAJCQlYRlNfU0JfVkVSU0lPTl9BRERBVFRSMigmbXAtPm1fc2IpOwotCQkJWEZTX1NCX1VOTE9DSyhtcCwgcyk7CisJCQlzcGluX3VubG9jaygmbXAtPm1fc2JfbG9jayk7CiAJCQl4ZnNfbW9kX3NiKHRwLCBYRlNfU0JfVkVSU0lPTk5VTSB8IFhGU19TQl9GRUFUVVJFUzIpOwogCQl9IGVsc2UKLQkJCVhGU19TQl9VTkxPQ0sobXAsIHMpOworCQkJc3Bpbl91bmxvY2soJm1wLT5tX3NiX2xvY2spOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19iaXQuYyBiL2ZzL3hmcy94ZnNfYml0LmMKaW5kZXggZmFiMGI2ZC4uNDgyMjg4NCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19iaXQuYworKysgYi9mcy94ZnMveGZzX2JpdC5jCkBAIC0yNSwxMDkgKzI1LDYgQEAKICAqIFhGUyBiaXQgbWFuaXB1bGF0aW9uIHJvdXRpbmVzLCB1c2VkIGluIG5vbi1yZWFsdGltZSBjb2RlLgogICovCiAKLSNpZm5kZWYgSEFWRV9BUkNIX0hJR0hCSVQKLS8qCi0gKiBJbmRleCBvZiBoaWdoIGJpdCBudW1iZXIgaW4gYnl0ZSwgLTEgZm9yIG5vbmUgc2V0LCAwLi43IG90aGVyd2lzZS4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgeGZzX2hpZ2hiaXRbMjU2XSA9IHsKLSAgICAgICAtMSwgMCwgMSwgMSwgMiwgMiwgMiwgMiwJCQkvKiAwMCAuLiAwNyAqLwotCTMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCQkJLyogMDggLi4gMGYgKi8KLQk0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAkJCS8qIDEwIC4uIDE3ICovCi0JNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwJCQkvKiAxOCAuLiAxZiAqLwotCTUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsCQkJLyogMjAgLi4gMjcgKi8KLQk1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LAkJCS8qIDI4IC4uIDJmICovCi0JNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwJCQkvKiAzMCAuLiAzNyAqLwotCTUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsCQkJLyogMzggLi4gM2YgKi8KLQk2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAkJCS8qIDQwIC4uIDQ3ICovCi0JNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwJCQkvKiA0OCAuLiA0ZiAqLwotCTYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCQkJLyogNTAgLi4gNTcgKi8KLQk2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAkJCS8qIDU4IC4uIDVmICovCi0JNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwJCQkvKiA2MCAuLiA2NyAqLwotCTYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCQkJLyogNjggLi4gNmYgKi8KLQk2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAkJCS8qIDcwIC4uIDc3ICovCi0JNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwJCQkvKiA3OCAuLiA3ZiAqLwotCTcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCQkJLyogODAgLi4gODcgKi8KLQk3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAkJCS8qIDg4IC4uIDhmICovCi0JNywgNywgNywgNywgNywgNywgNywgNywJCQkvKiA5MCAuLiA5NyAqLwotCTcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCQkJLyogOTggLi4gOWYgKi8KLQk3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAkJCS8qIGEwIC4uIGE3ICovCi0JNywgNywgNywgNywgNywgNywgNywgNywJCQkvKiBhOCAuLiBhZiAqLwotCTcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCQkJLyogYjAgLi4gYjcgKi8KLQk3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAkJCS8qIGI4IC4uIGJmICovCi0JNywgNywgNywgNywgNywgNywgNywgNywJCQkvKiBjMCAuLiBjNyAqLwotCTcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCQkJLyogYzggLi4gY2YgKi8KLQk3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAkJCS8qIGQwIC4uIGQ3ICovCi0JNywgNywgNywgNywgNywgNywgNywgNywJCQkvKiBkOCAuLiBkZiAqLwotCTcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCQkJLyogZTAgLi4gZTcgKi8KLQk3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAkJCS8qIGU4IC4uIGVmICovCi0JNywgNywgNywgNywgNywgNywgNywgNywJCQkvKiBmMCAuLiBmNyAqLwotCTcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCQkJLyogZjggLi4gZmYgKi8KLX07Ci0jZW5kaWYKLQotLyoKLSAqIHhmc19oaWdoYml0MzI6IGdldCBoaWdoIGJpdCBzZXQgb3V0IG9mIDMyLWJpdCBhcmd1bWVudCwgLTEgaWYgbm9uZSBzZXQuCi0gKi8KLWlubGluZSBpbnQKLXhmc19oaWdoYml0MzIoCi0JX191aW50MzJfdAl2KQotewotI2lmZGVmIEhBVkVfQVJDSF9ISUdIQklUCi0JcmV0dXJuIGhpZ2hiaXQzMih2KTsKLSNlbHNlCi0JaW50CQlpOwotCi0JaWYgKHYgJiAweGZmZmYwMDAwKQotCQlpZiAodiAmIDB4ZmYwMDAwMDApCi0JCQlpID0gMjQ7Ci0JCWVsc2UKLQkJCWkgPSAxNjsKLQllbHNlIGlmICh2ICYgMHgwMDAwZmZmZikKLQkJaWYgKHYgJiAweDAwMDBmZjAwKQotCQkJaSA9IDg7Ci0JCWVsc2UKLQkJCWkgPSAwOwotCWVsc2UKLQkJcmV0dXJuIC0xOwotCXJldHVybiBpICsgeGZzX2hpZ2hiaXRbKHYgPj4gaSkgJiAweGZmXTsKLSNlbmRpZgotfQotCi0vKgotICogeGZzX2xvd2JpdDY0OiBnZXQgbG93IGJpdCBzZXQgb3V0IG9mIDY0LWJpdCBhcmd1bWVudCwgLTEgaWYgbm9uZSBzZXQuCi0gKi8KLWludAoteGZzX2xvd2JpdDY0KAotCV9fdWludDY0X3QJdikKLXsKLQlfX3VpbnQzMl90CXcgPSAoX191aW50MzJfdCl2OwotCWludAkJbiA9IDA7Ci0KLQlpZiAodykgewkvKiBsb3dlciBiaXRzICovCi0JCW4gPSBmZnModyk7Ci0JfSBlbHNlIHsJLyogdXBwZXIgYml0cyAqLwotCQl3ID0gKF9fdWludDMyX3QpKHYgPj4gMzIpOwotCQlpZiAodyAmJiAobiA9IGZmcyh3KSkpCi0JCQluICs9IDMyOwotCX0KLQlyZXR1cm4gbiAtIDE7Ci19Ci0KLS8qCi0gKiB4ZnNfaGlnaGJpdDY0OiBnZXQgaGlnaCBiaXQgc2V0IG91dCBvZiA2NC1iaXQgYXJndW1lbnQsIC0xIGlmIG5vbmUgc2V0LgotICovCi1pbnQKLXhmc19oaWdoYml0NjQoCi0JX191aW50NjRfdAl2KQotewotCV9fdWludDMyX3QJaCA9IChfX3VpbnQzMl90KSh2ID4+IDMyKTsKLQotCWlmIChoKQotCQlyZXR1cm4geGZzX2hpZ2hiaXQzMihoKSArIDMyOwotCXJldHVybiB4ZnNfaGlnaGJpdDMyKChfX3VpbnQzMl90KXYpOwotfQotCi0KIC8qCiAgKiBSZXR1cm4gd2hldGhlciBiaXRtYXAgaXMgZW1wdHkuCiAgKiBTaXplIGlzIG51bWJlciBvZiB3b3JkcyBpbiB0aGUgYml0bWFwLCB3aGljaCBpcyBwYWRkZWQgdG8gd29yZCBib3VuZGFyeQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19iaXQuaCBiL2ZzL3hmcy94ZnNfYml0LmgKaW5kZXggMDgyNjQxYS4uMzI1YTAwNyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19iaXQuaAorKysgYi9mcy94ZnMveGZzX2JpdC5oCkBAIC00NywxMyArNDcsMzAgQEAKIH0KIAogLyogR2V0IGhpZ2ggYml0IHNldCBvdXQgb2YgMzItYml0IGFyZ3VtZW50LCAtMSBpZiBub25lIHNldCAqLwotZXh0ZXJuIGludCB4ZnNfaGlnaGJpdDMyKF9fdWludDMyX3Qgdik7Ci0KLS8qIEdldCBsb3cgYml0IHNldCBvdXQgb2YgNjQtYml0IGFyZ3VtZW50LCAtMSBpZiBub25lIHNldCAqLwotZXh0ZXJuIGludCB4ZnNfbG93Yml0NjQoX191aW50NjRfdCB2KTsKK3N0YXRpYyBpbmxpbmUgaW50IHhmc19oaWdoYml0MzIoX191aW50MzJfdCB2KQoreworCXJldHVybiBmbHModikgLSAxOworfQogCiAvKiBHZXQgaGlnaCBiaXQgc2V0IG91dCBvZiA2NC1iaXQgYXJndW1lbnQsIC0xIGlmIG5vbmUgc2V0ICovCi1leHRlcm4gaW50IHhmc19oaWdoYml0NjQoX191aW50NjRfdCk7CitzdGF0aWMgaW5saW5lIGludCB4ZnNfaGlnaGJpdDY0KF9fdWludDY0X3QgdikKK3sKKwlyZXR1cm4gZmxzNjQodikgLSAxOworfQorCisvKiBHZXQgbG93IGJpdCBzZXQgb3V0IG9mIDMyLWJpdCBhcmd1bWVudCwgLTEgaWYgbm9uZSBzZXQgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHhmc19sb3diaXQzMihfX3VpbnQzMl90IHYpCit7CisJX191aW50MzJfdCB0ID0gdjsKKwlyZXR1cm4gKHQpID8gZmluZF9maXJzdF9iaXQoKHVuc2lnbmVkIGxvbmcgKikmdCwgMzIpIDogLTE7Cit9CisKKy8qIEdldCBsb3cgYml0IHNldCBvdXQgb2YgNjQtYml0IGFyZ3VtZW50LCAtMSBpZiBub25lIHNldCAqLworc3RhdGljIGlubGluZSBpbnQgeGZzX2xvd2JpdDY0KF9fdWludDY0X3QgdikKK3sKKwlfX3VpbnQ2NF90IHQgPSB2OworCXJldHVybiAodCkgPyBmaW5kX2ZpcnN0X2JpdCgodW5zaWduZWQgbG9uZyAqKSZ0LCA2NCkgOiAtMTsKK30KIAogLyogUmV0dXJuIHdoZXRoZXIgYml0bWFwIGlzIGVtcHR5ICgxID09IGVtcHR5KSAqLwogZXh0ZXJuIGludCB4ZnNfYml0bWFwX2VtcHR5KHVpbnQgKm1hcCwgdWludCBzaXplKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYm1hcC5jIGIvZnMveGZzL3hmc19ibWFwLmMKaW5kZXggMmU5YjM0Yi4uMWMwYTVhNSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ibWFwLmMKKysrIGIvZnMveGZzL3hmc19ibWFwLmMKQEAgLTI4MzAsMTEgKzI4MzAsMTEgQEAKIAkJYXJncy5wcm9kID0gYWxpZ247CiAJCWlmICgoYXJncy5tb2QgPSAoeGZzX2V4dGxlbl90KWRvX21vZChhcC0+b2ZmLCBhcmdzLnByb2QpKSkKIAkJCWFyZ3MubW9kID0gKHhmc19leHRsZW5fdCkoYXJncy5wcm9kIC0gYXJncy5tb2QpOwotCX0gZWxzZSBpZiAobXAtPm1fc2Iuc2JfYmxvY2tzaXplID49IE5CUFApIHsKKwl9IGVsc2UgaWYgKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSA+PSBQQUdFX0NBQ0hFX1NJWkUpIHsKIAkJYXJncy5wcm9kID0gMTsKIAkJYXJncy5tb2QgPSAwOwogCX0gZWxzZSB7Ci0JCWFyZ3MucHJvZCA9IE5CUFAgPj4gbXAtPm1fc2Iuc2JfYmxvY2tsb2c7CisJCWFyZ3MucHJvZCA9IFBBR0VfQ0FDSEVfU0laRSA+PiBtcC0+bV9zYi5zYl9ibG9ja2xvZzsKIAkJaWYgKChhcmdzLm1vZCA9ICh4ZnNfZXh0bGVuX3QpKGRvX21vZChhcC0+b2ZmLCBhcmdzLnByb2QpKSkpCiAJCQlhcmdzLm1vZCA9ICh4ZnNfZXh0bGVuX3QpKGFyZ3MucHJvZCAtIGFyZ3MubW9kKTsKIAl9CkBAIC0yOTY5LDcgKzI5NjksNyBAQAogeGZzX2JtYXBfYWxsb2MoCiAJeGZzX2JtYWxsb2NhX3QJKmFwKQkJLyogYm1hcCBhbGxvYyBhcmd1bWVudCBzdHJ1Y3QgKi8KIHsKLQlpZiAoKGFwLT5pcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSkgJiYgYXAtPnVzZXJkYXRhKQorCWlmIChYRlNfSVNfUkVBTFRJTUVfSU5PREUoYXAtPmlwKSAmJiBhcC0+dXNlcmRhdGEpCiAJCXJldHVybiB4ZnNfYm1hcF9ydGFsbG9jKGFwKTsKIAlyZXR1cm4geGZzX2JtYXBfYnRhbGxvYyhhcCk7CiB9CkBAIC0zMDk2LDggKzMwOTYsNyBAQAogCQkvKgogCQkgKiBSZWFsdGltZSBhbGxvY2F0aW9uLiAgRnJlZSBpdCBhbmQgcmVjb3JkIGRpX25ibG9ja3MgdXBkYXRlLgogCQkgKi8KLQkJaWYgKHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLICYmCi0JCSAgICAoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpKSB7CisJCWlmICh3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSyAmJiBYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApKSB7CiAJCQl4ZnNfZnNibG9ja190CWJubzsKIAkJCXhmc19maWxibGtzX3QJbGVuOwogCkBAIC0zOTU2LDcgKzM5NTUsNiBAQAogCXhmc19ibWFwX2ZyZWVfdAkJZmxpc3Q7CQkvKiBmcmVlZCBleHRlbnQgcmVjb3JkcyAqLwogCXhmc19tb3VudF90CQkqbXA7CQkvKiBtb3VudCBzdHJ1Y3R1cmUgKi8KIAl4ZnNfdHJhbnNfdAkJKnRwOwkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLwotCXVuc2lnbmVkIGxvbmcJCXM7CQkvKiBzcGlubG9jayBzcGwgdmFsdWUgKi8KIAlpbnQJCQlibGtzOwkJLyogc3BhY2UgcmVzZXJ2YXRpb24gKi8KIAlpbnQJCQl2ZXJzaW9uID0gMTsJLyogc3VwZXJibG9jayBhdHRyIHZlcnNpb24gKi8KIAlpbnQJCQljb21taXR0ZWQ7CS8qIHhhY3Rpb24gd2FzIGNvbW1pdHRlZCAqLwpAQCAtNDA1Myw3ICs0MDUxLDcgQEAKIAkgICAoIVhGU19TQl9WRVJTSU9OX0hBU0FUVFIyKCZtcC0+bV9zYikgJiYgdmVyc2lvbiA9PSAyKSkgewogCQlfX2ludDY0X3Qgc2JmaWVsZHMgPSAwOwogCi0JCXMgPSBYRlNfU0JfTE9DSyhtcCk7CisJCXNwaW5fbG9jaygmbXAtPm1fc2JfbG9jayk7CiAJCWlmICghWEZTX1NCX1ZFUlNJT05fSEFTQVRUUigmbXAtPm1fc2IpKSB7CiAJCQlYRlNfU0JfVkVSU0lPTl9BRERBVFRSKCZtcC0+bV9zYik7CiAJCQlzYmZpZWxkcyB8PSBYRlNfU0JfVkVSU0lPTk5VTTsKQEAgLTQwNjMsMTAgKzQwNjEsMTAgQEAKIAkJCXNiZmllbGRzIHw9IChYRlNfU0JfVkVSU0lPTk5VTSB8IFhGU19TQl9GRUFUVVJFUzIpOwogCQl9CiAJCWlmIChzYmZpZWxkcykgewotCQkJWEZTX1NCX1VOTE9DSyhtcCwgcyk7CisJCQlzcGluX3VubG9jaygmbXAtPm1fc2JfbG9jayk7CiAJCQl4ZnNfbW9kX3NiKHRwLCBzYmZpZWxkcyk7CiAJCX0gZWxzZQotCQkJWEZTX1NCX1VOTE9DSyhtcCwgcyk7CisJCQlzcGluX3VubG9jaygmbXAtPm1fc2JfbG9jayk7CiAJfQogCWlmICgoZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2goJnRwLCAmZmxpc3QsICZjb21taXR0ZWQpKSkKIAkJZ290byBlcnJvcjI7CkBAIC02Mzk0LDcgKzYzOTIsNyBAQAogICogUmVjdXJzaXZlbHkgd2Fsa3MgZWFjaCBsZXZlbCBvZiBhIGJ0cmVlCiAgKiB0byBjb3VudCB0b3RhbCBmc2Jsb2NrcyBpcyB1c2UuCiAgKi8KLWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlcnJvciAqLworU1RBVElDIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlcnJvciAqLwogeGZzX2JtYXBfY291bnRfdHJlZSgKIAl4ZnNfbW91bnRfdCAgICAgKm1wLCAgICAgICAgICAgIC8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCiAJeGZzX3RyYW5zX3QgICAgICp0cCwgICAgICAgICAgICAvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCkBAIC02NDcwLDcgKzY0NjgsNyBAQAogLyoKICAqIENvdW50IGxlYWYgYmxvY2tzIGdpdmVuIGEgcmFuZ2Ugb2YgZXh0ZW50IHJlY29yZHMuCiAgKi8KLWludAorU1RBVElDIGludAogeGZzX2JtYXBfY291bnRfbGVhdmVzKAogCXhmc19pZm9ya190CQkqaWZwLAogCXhmc19leHRudW1fdAkJaWR4LApAQCAtNjQ5MCw3ICs2NDg4LDcgQEAKICAqIENvdW50IGxlYWYgYmxvY2tzIGdpdmVuIGEgcmFuZ2Ugb2YgZXh0ZW50IHJlY29yZHMgb3JpZ2luYWxseQogICogaW4gYnRyZWUgZm9ybWF0LgogICovCi1pbnQKK1NUQVRJQyBpbnQKIHhmc19ibWFwX2Rpc2tfY291bnRfbGVhdmVzKAogCXhmc19leHRudW1fdAkJaWR4LAogCXhmc19ibWJ0X2Jsb2NrX3QJKmJsb2NrLApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19ibWFwLmggYi9mcy94ZnMveGZzX2JtYXAuaAppbmRleCA2ODI2N2Q3Li44NzIyNGI3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2JtYXAuaAorKysgYi9mcy94ZnMveGZzX2JtYXAuaApAQCAtMjUsNiArMjUsOCBAQAogc3RydWN0IHhmc19tb3VudDsKIHN0cnVjdCB4ZnNfdHJhbnM7CiAKK2V4dGVybiBrbWVtX3pvbmVfdAkqeGZzX2JtYXBfZnJlZV9pdGVtX3pvbmU7CisKIC8qCiAgKiBERUxUQTogZGVzY3JpYmUgYSBjaGFuZ2UgdG8gdGhlIGluLWNvcmUgZXh0ZW50IGxpc3QuCiAgKgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19ibWFwX2J0cmVlLmMgYi9mcy94ZnMveGZzX2JtYXBfYnRyZWUuYwppbmRleCAzMmI0OWVjLi5jNDE4MWQ4IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2JtYXBfYnRyZWUuYworKysgYi9mcy94ZnMveGZzX2JtYXBfYnRyZWUuYwpAQCAtMjA2Miw4ICsyMDYyLDcgQEAKIAkJCQlwY3VyLT5iY19wcml2YXRlLmIuYWxsb2NhdGVkOwogCQkJcGN1ci0+YmNfcHJpdmF0ZS5iLmFsbG9jYXRlZCA9IDA7CiAJCQlBU1NFUlQoKGN1ci0+YmNfcHJpdmF0ZS5iLmZpcnN0YmxvY2sgIT0gTlVMTEZTQkxPQ0spIHx8Ci0JCQkgICAgICAgKGN1ci0+YmNfcHJpdmF0ZS5iLmlwLT5pX2QuZGlfZmxhZ3MgJgotCQkJCVhGU19ESUZMQUdfUkVBTFRJTUUpKTsKKwkJCSAgICAgICBYRlNfSVNfUkVBTFRJTUVfSU5PREUoY3VyLT5iY19wcml2YXRlLmIuaXApKTsKIAkJCWN1ci0+YmNfcHJpdmF0ZS5iLmZpcnN0YmxvY2sgPQogCQkJCXBjdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrOwogCQkJQVNTRVJUKGN1ci0+YmNfcHJpdmF0ZS5iLmZsaXN0ID09CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2J0cmVlLmggYi9mcy94ZnMveGZzX2J0cmVlLmgKaW5kZXggNmU0MGEwYS4uNzQ0MGI3OCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19idHJlZS5oCisrKyBiL2ZzL3hmcy94ZnNfYnRyZWUuaApAQCAtMjQsNiArMjQsOCBAQAogc3RydWN0IHhmc19tb3VudDsKIHN0cnVjdCB4ZnNfdHJhbnM7CiAKK2V4dGVybiBrbWVtX3pvbmVfdAkqeGZzX2J0cmVlX2N1cl96b25lOworCiAvKgogICogVGhpcyBub25zZW5zZSBpcyB0byBtYWtlIC13bGludCBoYXBweS4KICAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19idWZfaXRlbS5jIGIvZnMveGZzL3hmc19idWZfaXRlbS5jCmluZGV4IGM4ZjJjMjguLjYzZGViZDEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uYworKysgYi9mcy94ZnMveGZzX2J1Zl9pdGVtLmMKQEAgLTM3OCw3ICszNzgsNiBAQAogCXhmc19tb3VudF90CSptcDsKIAl4ZnNfYnVmX3QJKmJwOwogCWludAkJZnJlZWQ7Ci0JU1BMREVDTChzKTsKIAogCWJwID0gYmlwLT5ibGlfYnVmOwogCUFTU0VSVChicCAhPSBOVUxMKTsKQEAgLTQwOSw4ICs0MDgsOCBAQAogCQkJWEZTX0JVRl9TRVRfRlNQUklWQVRFKGJwLCBOVUxMKTsKIAkJCVhGU19CVUZfQ0xSX0lPRE9ORV9GVU5DKGJwKTsKIAkJfSBlbHNlIHsKLQkJCUFJTF9MT0NLKG1wLHMpOwotCQkJeGZzX3RyYW5zX2RlbGV0ZV9haWwobXAsICh4ZnNfbG9nX2l0ZW1fdCAqKWJpcCwgcyk7CisJCQlzcGluX2xvY2soJm1wLT5tX2FpbF9sb2NrKTsKKwkJCXhmc190cmFuc19kZWxldGVfYWlsKG1wLCAoeGZzX2xvZ19pdGVtX3QgKiliaXApOwogCQkJeGZzX2J1Zl9pdGVtX3JlbHNlKGJwKTsKIAkJCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURShicCwgdm9pZCAqKSA9PSBOVUxMKTsKIAkJfQpAQCAtMTExMyw3ICsxMTEyLDYgQEAKIAl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCkKIHsKIAlzdHJ1Y3QgeGZzX21vdW50CSptcDsKLQlTUExERUNMKHMpOwogCiAJQVNTRVJUKGJpcC0+YmxpX2J1ZiA9PSBicCk7CiAKQEAgLTExMjgsMTEgKzExMjYsMTEgQEAKIAkgKgogCSAqIEVpdGhlciB3YXksIEFJTCBpcyB1c2VsZXNzIGlmIHdlJ3JlIGZvcmNpbmcgYSBzaHV0ZG93bi4KIAkgKi8KLQlBSUxfTE9DSyhtcCxzKTsKKwlzcGluX2xvY2soJm1wLT5tX2FpbF9sb2NrKTsKIAkvKgogCSAqIHhmc190cmFuc19kZWxldGVfYWlsKCkgZHJvcHMgdGhlIEFJTCBsb2NrLgogCSAqLwotCXhmc190cmFuc19kZWxldGVfYWlsKG1wLCAoeGZzX2xvZ19pdGVtX3QgKiliaXAsIHMpOworCXhmc190cmFuc19kZWxldGVfYWlsKG1wLCAoeGZzX2xvZ19pdGVtX3QgKiliaXApOwogCiAjaWZkZWYgWEZTX1RSQU5TX0RFQlVHCiAJa21lbV9mcmVlKGJpcC0+YmxpX29yaWcsIFhGU19CVUZfQ09VTlQoYnApKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uaCBiL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uaAppbmRleCBkN2UxMzYxLi41YTQxYzM0IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2J1Zl9pdGVtLmgKKysrIGIvZnMveGZzL3hmc19idWZfaXRlbS5oCkBAIC0xOCw2ICsxOCw4IEBACiAjaWZuZGVmCV9fWEZTX0JVRl9JVEVNX0hfXwogI2RlZmluZQlfX1hGU19CVUZfSVRFTV9IX18KIAorZXh0ZXJuIGttZW1fem9uZV90CSp4ZnNfYnVmX2l0ZW1fem9uZTsKKwogLyoKICAqIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSB1c2VkIHRvIGxheSBvdXQgYSBidWYgbG9nIGl0ZW0gaW4gdGhlCiAgKiBsb2cuICBUaGUgZGF0YSBtYXAgZGVzY3JpYmVzIHdoaWNoIDEyOCBieXRlIGNodW5rcyBvZiB0aGUgYnVmZmVyCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RhX2J0cmVlLmMgYi9mcy94ZnMveGZzX2RhX2J0cmVlLmMKaW5kZXggMjZkMDllMi4uMWI0NDY4NCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kYV9idHJlZS5jCisrKyBiL2ZzL3hmcy94ZnNfZGFfYnRyZWUuYwpAQCAtMjIxOCw3ICsyMjE4LDcgQEAKIAogI2lmZGVmIFhGU19EQUJVRl9ERUJVRwogeGZzX2RhYnVmX3QJKnhmc19kYWJ1Zl9nbG9iYWxfbGlzdDsKLWxvY2tfdAkJeGZzX2RhYnVmX2dsb2JhbF9sb2NrOworc3BpbmxvY2tfdAl4ZnNfZGFidWZfZ2xvYmFsX2xvY2s7CiAjZW5kaWYKIAogLyoKQEAgLTIyNjQsMTAgKzIyNjQsOSBAQAogCX0KICNpZmRlZiBYRlNfREFCVUZfREVCVUcKIAl7Ci0JCVNQTERFQ0wocyk7CiAJCXhmc19kYWJ1Zl90CSpwOwogCi0JCXMgPSBtdXRleF9zcGlubG9jaygmeGZzX2RhYnVmX2dsb2JhbF9sb2NrKTsKKwkJc3Bpbl9sb2NrKCZ4ZnNfZGFidWZfZ2xvYmFsX2xvY2spOwogCQlmb3IgKHAgPSB4ZnNfZGFidWZfZ2xvYmFsX2xpc3Q7IHA7IHAgPSBwLT5uZXh0KSB7CiAJCQlBU1NFUlQocC0+Ymxrbm8gIT0gZGFidWYtPmJsa25vIHx8CiAJCQkgICAgICAgcC0+dGFyZ2V0ICE9IGRhYnVmLT50YXJnZXQpOwpAQCAtMjI3Nyw3ICsyMjc2LDcgQEAKIAkJCXhmc19kYWJ1Zl9nbG9iYWxfbGlzdC0+cHJldiA9IGRhYnVmOwogCQlkYWJ1Zi0+bmV4dCA9IHhmc19kYWJ1Zl9nbG9iYWxfbGlzdDsKIAkJeGZzX2RhYnVmX2dsb2JhbF9saXN0ID0gZGFidWY7Ci0JCW11dGV4X3NwaW51bmxvY2soJnhmc19kYWJ1Zl9nbG9iYWxfbG9jaywgcyk7CisJCXNwaW5fdW5sb2NrKCZ4ZnNfZGFidWZfZ2xvYmFsX2xvY2spOwogCX0KICNlbmRpZgogCXJldHVybiBkYWJ1ZjsKQEAgLTIzMTksMTYgKzIzMTgsMTQgQEAKIAkJa21lbV9mcmVlKGRhYnVmLT5kYXRhLCBCQlRPQihkYWJ1Zi0+YmJjb3VudCkpOwogI2lmZGVmIFhGU19EQUJVRl9ERUJVRwogCXsKLQkJU1BMREVDTChzKTsKLQotCQlzID0gbXV0ZXhfc3BpbmxvY2soJnhmc19kYWJ1Zl9nbG9iYWxfbG9jayk7CisJCXNwaW5fbG9jaygmeGZzX2RhYnVmX2dsb2JhbF9sb2NrKTsKIAkJaWYgKGRhYnVmLT5wcmV2KQogCQkJZGFidWYtPnByZXYtPm5leHQgPSBkYWJ1Zi0+bmV4dDsKIAkJZWxzZQogCQkJeGZzX2RhYnVmX2dsb2JhbF9saXN0ID0gZGFidWYtPm5leHQ7CiAJCWlmIChkYWJ1Zi0+bmV4dCkKIAkJCWRhYnVmLT5uZXh0LT5wcmV2ID0gZGFidWYtPnByZXY7Ci0JCW11dGV4X3NwaW51bmxvY2soJnhmc19kYWJ1Zl9nbG9iYWxfbG9jaywgcyk7CisJCXNwaW5fdW5sb2NrKCZ4ZnNfZGFidWZfZ2xvYmFsX2xvY2spOwogCX0KIAltZW1zZXQoZGFidWYsIDAsIFhGU19EQV9CVUZfU0laRShkYWJ1Zi0+bmJ1ZikpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RhX2J0cmVlLmggYi9mcy94ZnMveGZzX2RhX2J0cmVlLmgKaW5kZXggNDRkYWJmMC4uN2ZhY2Y4NiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19kYV9idHJlZS5oCisrKyBiL2ZzL3hmcy94ZnNfZGFfYnRyZWUuaApAQCAtMjYwLDYgKzI2MCw3IEBACiB4ZnNfZGFkZHJfdCB4ZnNfZGFfYmxrbm8oeGZzX2RhYnVmX3QgKmRhYnVmKTsKIAogZXh0ZXJuIHN0cnVjdCBrbWVtX3pvbmUgKnhmc19kYV9zdGF0ZV96b25lOworZXh0ZXJuIHN0cnVjdCBrbWVtX3pvbmUgKnhmc19kYWJ1Zl96b25lOwogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmCS8qIF9fWEZTX0RBX0JUUkVFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kZnJhZy5jIGIvZnMveGZzL3hmc19kZnJhZy5jCmluZGV4IDU4NGYxYWU4Li4zZjUzZmFkIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RmcmFnLmMKKysrIGIvZnMveGZzL3hmc19kZnJhZy5jCkBAIC01Miw3NiArNTIsNzIgQEAKIAl4ZnNfc3dhcGV4dF90CV9fdXNlciAqc3h1KQogewogCXhmc19zd2FwZXh0X3QJKnN4cDsKLQl4ZnNfaW5vZGVfdCAgICAgKmlwPU5VTEwsICp0aXA9TlVMTDsKLQl4ZnNfbW91bnRfdCAgICAgKm1wOwotCXN0cnVjdCBmaWxlCSpmcCA9IE5VTEwsICp0ZnAgPSBOVUxMOwotCWJodl92bm9kZV90CSp2cCwgKnR2cDsKKwl4ZnNfaW5vZGVfdCAgICAgKmlwLCAqdGlwOworCXN0cnVjdCBmaWxlCSpmaWxlLCAqdGFyZ2V0X2ZpbGU7CiAJaW50CQllcnJvciA9IDA7CiAKIAlzeHAgPSBrbWVtX2FsbG9jKHNpemVvZih4ZnNfc3dhcGV4dF90KSwgS01fTUFZRkFJTCk7CiAJaWYgKCFzeHApIHsKIAkJZXJyb3IgPSBYRlNfRVJST1IoRU5PTUVNKTsKLQkJZ290byBlcnJvcjA7CisJCWdvdG8gb3V0OwogCX0KIAogCWlmIChjb3B5X2Zyb21fdXNlcihzeHAsIHN4dSwgc2l6ZW9mKHhmc19zd2FwZXh0X3QpKSkgewogCQllcnJvciA9IFhGU19FUlJPUihFRkFVTFQpOwotCQlnb3RvIGVycm9yMDsKKwkJZ290byBvdXRfZnJlZV9zeHA7CiAJfQogCiAJLyogUHVsbCBpbmZvcm1hdGlvbiBmb3IgdGhlIHRhcmdldCBmZCAqLwotCWlmICgoKGZwID0gZmdldCgoaW50KXN4cC0+c3hfZmR0YXJnZXQpKSA9PSBOVUxMKSB8fAotCSAgICAoKHZwID0gdm5fZnJvbV9pbm9kZShmcC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSkpID09IE5VTEwpKSAgeworCWZpbGUgPSBmZ2V0KChpbnQpc3hwLT5zeF9mZHRhcmdldCk7CisJaWYgKCFmaWxlKSB7CiAJCWVycm9yID0gWEZTX0VSUk9SKEVJTlZBTCk7Ci0JCWdvdG8gZXJyb3IwOworCQlnb3RvIG91dF9mcmVlX3N4cDsKIAl9CiAKLQlpcCA9IHhmc192dG9pKHZwKTsKLQlpZiAoaXAgPT0gTlVMTCkgeworCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB8fCAoZmlsZS0+Zl9mbGFncyAmIE9fQVBQRU5EKSkgewogCQllcnJvciA9IFhGU19FUlJPUihFQkFERik7Ci0JCWdvdG8gZXJyb3IwOworCQlnb3RvIG91dF9wdXRfZmlsZTsKIAl9CiAKLQlpZiAoKCh0ZnAgPSBmZ2V0KChpbnQpc3hwLT5zeF9mZHRtcCkpID09IE5VTEwpIHx8Ci0JICAgICgodHZwID0gdm5fZnJvbV9pbm9kZSh0ZnAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpKSA9PSBOVUxMKSkgeworCXRhcmdldF9maWxlID0gZmdldCgoaW50KXN4cC0+c3hfZmR0bXApOworCWlmICghdGFyZ2V0X2ZpbGUpIHsKIAkJZXJyb3IgPSBYRlNfRVJST1IoRUlOVkFMKTsKLQkJZ290byBlcnJvcjA7CisJCWdvdG8gb3V0X3B1dF9maWxlOwogCX0KIAotCXRpcCA9IHhmc192dG9pKHR2cCk7Ci0JaWYgKHRpcCA9PSBOVUxMKSB7CisJaWYgKCEodGFyZ2V0X2ZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB8fAorCSAgICAodGFyZ2V0X2ZpbGUtPmZfZmxhZ3MgJiBPX0FQUEVORCkpIHsKIAkJZXJyb3IgPSBYRlNfRVJST1IoRUJBREYpOwotCQlnb3RvIGVycm9yMDsKKwkJZ290byBvdXRfcHV0X3RhcmdldF9maWxlOwogCX0KIAorCWlwID0gWEZTX0koZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJdGlwID0gWEZTX0kodGFyZ2V0X2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOworCiAJaWYgKGlwLT5pX21vdW50ICE9IHRpcC0+aV9tb3VudCkgewotCQllcnJvciA9ICBYRlNfRVJST1IoRUlOVkFMKTsKLQkJZ290byBlcnJvcjA7CisJCWVycm9yID0gWEZTX0VSUk9SKEVJTlZBTCk7CisJCWdvdG8gb3V0X3B1dF90YXJnZXRfZmlsZTsKIAl9CiAKIAlpZiAoaXAtPmlfaW5vID09IHRpcC0+aV9pbm8pIHsKLQkJZXJyb3IgPSAgWEZTX0VSUk9SKEVJTlZBTCk7Ci0JCWdvdG8gZXJyb3IwOworCQllcnJvciA9IFhGU19FUlJPUihFSU5WQUwpOworCQlnb3RvIG91dF9wdXRfdGFyZ2V0X2ZpbGU7CiAJfQogCi0JbXAgPSBpcC0+aV9tb3VudDsKLQotCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgewotCQllcnJvciA9ICBYRlNfRVJST1IoRUlPKTsKLQkJZ290byBlcnJvcjA7CisJaWYgKFhGU19GT1JDRURfU0hVVERPV04oaXAtPmlfbW91bnQpKSB7CisJCWVycm9yID0gWEZTX0VSUk9SKEVJTyk7CisJCWdvdG8gb3V0X3B1dF90YXJnZXRfZmlsZTsKIAl9CiAKLQllcnJvciA9IFhGU19TV0FQX0VYVEVOVFMobXAsICZpcC0+aV9pb2NvcmUsICZ0aXAtPmlfaW9jb3JlLCBzeHApOworCWVycm9yID0geGZzX3N3YXBfZXh0ZW50cyhpcCwgdGlwLCBzeHApOwogCi0gZXJyb3IwOgotCWlmIChmcCAhPSBOVUxMKQotCQlmcHV0KGZwKTsKLQlpZiAodGZwICE9IE5VTEwpCi0JCWZwdXQodGZwKTsKLQotCWlmIChzeHAgIT0gTlVMTCkKLQkJa21lbV9mcmVlKHN4cCwgc2l6ZW9mKHhmc19zd2FwZXh0X3QpKTsKLQorIG91dF9wdXRfdGFyZ2V0X2ZpbGU6CisJZnB1dCh0YXJnZXRfZmlsZSk7Cisgb3V0X3B1dF9maWxlOgorCWZwdXQoZmlsZSk7Cisgb3V0X2ZyZWVfc3hwOgorCWttZW1fZnJlZShzeHAsIHNpemVvZih4ZnNfc3dhcGV4dF90KSk7Cisgb3V0OgogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMTY5LDE1ICsxNjUsNiBAQAogCXhmc19sb2NrX2lub2RlcyhpcHMsIDIsIDAsIGxvY2tfZmxhZ3MpOwogCWxvY2tlZCA9IDE7CiAKLQkvKiBDaGVjayBwZXJtaXNzaW9ucyAqLwotCWVycm9yID0geGZzX2lhY2Nlc3MoaXAsIFNfSVdVU1IsIE5VTEwpOwotCWlmIChlcnJvcikKLQkJZ290byBlcnJvcjA7Ci0KLQllcnJvciA9IHhmc19pYWNjZXNzKHRpcCwgU19JV1VTUiwgTlVMTCk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIGVycm9yMDsKLQogCS8qIFZlcmlmeSB0aGF0IGJvdGggZmlsZXMgaGF2ZSB0aGUgc2FtZSBmb3JtYXQgKi8KIAlpZiAoKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgIT0gKHRpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpKSB7CiAJCWVycm9yID0gWEZTX0VSUk9SKEVJTlZBTCk7CkBAIC0xODUsOCArMTcyLDcgQEAKIAl9CiAKIAkvKiBWZXJpZnkgYm90aCBmaWxlcyBhcmUgZWl0aGVyIHJlYWwtdGltZSBvciBub24tcmVhbHRpbWUgKi8KLQlpZiAoKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKSAhPQotCSAgICAodGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKSkgeworCWlmIChYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApICE9IFhGU19JU19SRUFMVElNRV9JTk9ERSh0aXApKSB7CiAJCWVycm9yID0gWEZTX0VSUk9SKEVJTlZBTCk7CiAJCWdvdG8gZXJyb3IwOwogCX0KQEAgLTE5OSw3ICsxODUsNyBAQAogCX0KIAogCWlmIChWTl9DQUNIRUQodHZwKSAhPSAwKSB7Ci0JCXhmc19pbnZhbF9jYWNoZWRfdHJhY2UoJnRpcC0+aV9pb2NvcmUsIDAsIC0xLCAwLCAtMSk7CisJCXhmc19pbnZhbF9jYWNoZWRfdHJhY2UodGlwLCAwLCAtMSwgMCwgLTEpOwogCQllcnJvciA9IHhmc19mbHVzaGludmFsX3BhZ2VzKHRpcCwgMCwgLTEsCiAJCQkJRklfUkVNQVBGX0xPQ0tFRCk7CiAJCWlmIChlcnJvcikKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlub2RlLmggYi9mcy94ZnMveGZzX2Rpbm9kZS5oCmluZGV4IGRlZGQ3MTM1Li5jOTA2NWVhIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2Rpbm9kZS5oCisrKyBiL2ZzL3hmcy94ZnNfZGlub2RlLmgKQEAgLTE3MSw2OSArMTcxLDM1IEBACiAvKgogICogSW5vZGUgZGF0YSAmIGF0dHJpYnV0ZSBmb3JrIHNpemVzLCBwZXIgaW5vZGUuCiAgKi8KLSNkZWZpbmUgWEZTX0NGT1JLX1EoZGNwKSAgICAgICAgICAgICAgICAgICAgKChkY3ApLT5kaV9mb3Jrb2ZmICE9IDApCi0jZGVmaW5lCVhGU19DRk9SS19RX0RJU0soZGNwKQkJICAgICgoZGNwKS0+ZGlfZm9ya29mZiAhPSAwKQotCi0jZGVmaW5lIFhGU19DRk9SS19CT0ZGKGRjcCkgICAgICAgICAgICAgICAgICgoaW50KSgoZGNwKS0+ZGlfZm9ya29mZiA8PCAzKSkKLSNkZWZpbmUJWEZTX0NGT1JLX0JPRkZfRElTSyhkY3ApCSAgICAoKGludCkoKGRjcCktPmRpX2ZvcmtvZmYgPDwgMykpCi0KLSNkZWZpbmUJWEZTX0NGT1JLX0RTSVpFX0RJU0soZGNwLG1wKSBcCi0JKFhGU19DRk9SS19RX0RJU0soZGNwKSA/IFhGU19DRk9SS19CT0ZGX0RJU0soZGNwKSA6IFhGU19MSVRJTk8obXApKQotI2RlZmluZSBYRlNfQ0ZPUktfRFNJWkUoZGNwLG1wKSBcCi0JKFhGU19DRk9SS19RKGRjcCkgPyBYRlNfQ0ZPUktfQk9GRihkY3ApIDogWEZTX0xJVElOTyhtcCkpCi0KLSNkZWZpbmUJWEZTX0NGT1JLX0FTSVpFX0RJU0soZGNwLG1wKSBcCi0JKFhGU19DRk9SS19RX0RJU0soZGNwKSA/IFhGU19MSVRJTk8obXApIC0gWEZTX0NGT1JLX0JPRkZfRElTSyhkY3ApIDogMCkKLSNkZWZpbmUgWEZTX0NGT1JLX0FTSVpFKGRjcCxtcCkgXAotCShYRlNfQ0ZPUktfUShkY3ApID8gWEZTX0xJVElOTyhtcCkgLSBYRlNfQ0ZPUktfQk9GRihkY3ApIDogMCkKLQotI2RlZmluZQlYRlNfQ0ZPUktfU0laRV9ESVNLKGRjcCxtcCx3KSBcCi0JKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gXAotCQlYRlNfQ0ZPUktfRFNJWkVfRElTSyhkY3AsIG1wKSA6IFwKLQkgCVhGU19DRk9SS19BU0laRV9ESVNLKGRjcCwgbXApKQotI2RlZmluZSBYRlNfQ0ZPUktfU0laRShkY3AsbXAsdykgXAotCSgodykgPT0gWEZTX0RBVEFfRk9SSyA/IFwKLQkJWEZTX0NGT1JLX0RTSVpFKGRjcCwgbXApIDogWEZTX0NGT1JLX0FTSVpFKGRjcCwgbXApKQorI2RlZmluZSBYRlNfREZPUktfUShkaXApCQkoKGRpcCktPmRpX2NvcmUuZGlfZm9ya29mZiAhPSAwKQorI2RlZmluZSBYRlNfREZPUktfQk9GRihkaXApCQkoKGludCkoKGRpcCktPmRpX2NvcmUuZGlfZm9ya29mZiA8PCAzKSkKIAogI2RlZmluZSBYRlNfREZPUktfRFNJWkUoZGlwLG1wKSBcCi0JWEZTX0NGT1JLX0RTSVpFX0RJU0soJihkaXApLT5kaV9jb3JlLCBtcCkKLSNkZWZpbmUgWEZTX0RGT1JLX0RTSVpFX0hPU1QoZGlwLG1wKSBcCi0JWEZTX0NGT1JLX0RTSVpFKCYoZGlwKS0+ZGlfY29yZSwgbXApCisJKFhGU19ERk9SS19RKGRpcCkgPyBcCisJCVhGU19ERk9SS19CT0ZGKGRpcCkgOiBcCisJCVhGU19MSVRJTk8obXApKQogI2RlZmluZSBYRlNfREZPUktfQVNJWkUoZGlwLG1wKSBcCi0JWEZTX0NGT1JLX0FTSVpFX0RJU0soJihkaXApLT5kaV9jb3JlLCBtcCkKLSNkZWZpbmUgWEZTX0RGT1JLX0FTSVpFX0hPU1QoZGlwLG1wKSBcCi0JWEZTX0NGT1JLX0FTSVpFKCYoZGlwKS0+ZGlfY29yZSwgbXApCi0jZGVmaW5lCVhGU19ERk9SS19TSVpFKGRpcCxtcCx3KSBcCi0JWEZTX0NGT1JLX1NJWkVfRElTSygmKGRpcCktPmRpX2NvcmUsIG1wLCB3KQotI2RlZmluZQlYRlNfREZPUktfU0laRV9IT1NUKGRpcCxtcCx3KSBcCi0JWEZTX0NGT1JLX1NJWkUoJihkaXApLT5kaV9jb3JlLCBtcCwgdykKKwkoWEZTX0RGT1JLX1EoZGlwKSA/IFwKKwkJWEZTX0xJVElOTyhtcCkgLSBYRlNfREZPUktfQk9GRihkaXApIDogXAorCQkwKQorI2RlZmluZSBYRlNfREZPUktfU0laRShkaXAsbXAsdykgXAorCSgodykgPT0gWEZTX0RBVEFfRk9SSyA/IFwKKwkJWEZTX0RGT1JLX0RTSVpFKGRpcCwgbXApIDogXAorCQlYRlNfREZPUktfQVNJWkUoZGlwLCBtcCkpCiAKLSNkZWZpbmUJWEZTX0RGT1JLX1EoZGlwKSAgICAgICAgICAgICAgICAgICAgWEZTX0NGT1JLX1FfRElTSygmKGRpcCktPmRpX2NvcmUpCi0jZGVmaW5lCVhGU19ERk9SS19CT0ZGKGRpcCkJCSAgICBYRlNfQ0ZPUktfQk9GRl9ESVNLKCYoZGlwKS0+ZGlfY29yZSkKLSNkZWZpbmUJWEZTX0RGT1JLX0RQVFIoZGlwKQkJICAgICgoZGlwKS0+ZGlfdS5kaV9jKQotI2RlZmluZQlYRlNfREZPUktfQVBUUihkaXApCVwKKyNkZWZpbmUgWEZTX0RGT1JLX0RQVFIoZGlwKQkJICAgICgoZGlwKS0+ZGlfdS5kaV9jKQorI2RlZmluZSBYRlNfREZPUktfQVBUUihkaXApCVwKIAkoKGRpcCktPmRpX3UuZGlfYyArIFhGU19ERk9SS19CT0ZGKGRpcCkpCi0jZGVmaW5lCVhGU19ERk9SS19QVFIoZGlwLHcpCVwKKyNkZWZpbmUgWEZTX0RGT1JLX1BUUihkaXAsdykJXAogCSgodykgPT0gWEZTX0RBVEFfRk9SSyA/IFhGU19ERk9SS19EUFRSKGRpcCkgOiBYRlNfREZPUktfQVBUUihkaXApKQotI2RlZmluZQlYRlNfQ0ZPUktfRk9STUFUKGRjcCx3KQlcCi0JKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gKGRjcCktPmRpX2Zvcm1hdCA6IChkY3ApLT5kaV9hZm9ybWF0KQotI2RlZmluZQlYRlNfQ0ZPUktfRk1UX1NFVChkY3AsdyxuKSBcCisjZGVmaW5lIFhGU19ERk9SS19GT1JNQVQoZGlwLHcpIFwKIAkoKHcpID09IFhGU19EQVRBX0ZPUksgPyBcCi0JCSgoZGNwKS0+ZGlfZm9ybWF0ID0gKG4pKSA6ICgoZGNwKS0+ZGlfYWZvcm1hdCA9IChuKSkpCi0jZGVmaW5lCVhGU19ERk9SS19GT1JNQVQoZGlwLHcpIFhGU19DRk9SS19GT1JNQVQoJihkaXApLT5kaV9jb3JlLCB3KQotCi0jZGVmaW5lCVhGU19DRk9SS19ORVhURU5UU19ESVNLKGRjcCx3KSBcCisJCShkaXApLT5kaV9jb3JlLmRpX2Zvcm1hdCA6IFwKKwkJKGRpcCktPmRpX2NvcmUuZGlfYWZvcm1hdCkKKyNkZWZpbmUgWEZTX0RGT1JLX05FWFRFTlRTKGRpcCx3KSBcCiAJKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gXAotCSAJYmUzMl90b19jcHUoKGRjcCktPmRpX25leHRlbnRzKSA6IFwKLQkgCWJlMTZfdG9fY3B1KChkY3ApLT5kaV9hbmV4dGVudHMpKQotI2RlZmluZSBYRlNfQ0ZPUktfTkVYVEVOVFMoZGNwLHcpIFwKLQkoKHcpID09IFhGU19EQVRBX0ZPUksgPyAoZGNwKS0+ZGlfbmV4dGVudHMgOiAoZGNwKS0+ZGlfYW5leHRlbnRzKQotI2RlZmluZQlYRlNfREZPUktfTkVYVEVOVFMoZGlwLHcpIFhGU19DRk9SS19ORVhURU5UU19ESVNLKCYoZGlwKS0+ZGlfY29yZSwgdykKLSNkZWZpbmUJWEZTX0RGT1JLX05FWFRFTlRTX0hPU1QoZGlwLHcpIFhGU19DRk9SS19ORVhURU5UUygmKGRpcCktPmRpX2NvcmUsIHcpCi0KLSNkZWZpbmUJWEZTX0NGT1JLX05FWFRfU0VUKGRjcCx3LG4pIFwKLQkoKHcpID09IFhGU19EQVRBX0ZPUksgPyBcCi0JCSgoZGNwKS0+ZGlfbmV4dGVudHMgPSAobikpIDogKChkY3ApLT5kaV9hbmV4dGVudHMgPSAobikpKQorCSAJYmUzMl90b19jcHUoKGRpcCktPmRpX2NvcmUuZGlfbmV4dGVudHMpIDogXAorCSAJYmUxNl90b19jcHUoKGRpcCktPmRpX2NvcmUuZGlfYW5leHRlbnRzKSkKIAogI2RlZmluZQlYRlNfQlVGX1RPX0RJTk9ERShicCkJKCh4ZnNfZGlub2RlX3QgKilYRlNfQlVGX1BUUihicCkpCiAKQEAgLTI3Myw2ICsyMzksMTIgQEAKICNkZWZpbmUgWEZTX0RJRkxBR19OT0RFRlJBRyAgICAgICgxIDw8IFhGU19ESUZMQUdfTk9ERUZSQUdfQklUKQogI2RlZmluZSBYRlNfRElGTEFHX0ZJTEVTVFJFQU0gICAgKDEgPDwgWEZTX0RJRkxBR19GSUxFU1RSRUFNX0JJVCkKIAorI2lmZGVmIENPTkZJR19YRlNfUlQKKyNkZWZpbmUgWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKSAoKGlwKS0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSkKKyNlbHNlCisjZGVmaW5lIFhGU19JU19SRUFMVElNRV9JTk9ERShpcCkgKDApCisjZW5kaWYKKwogI2RlZmluZSBYRlNfRElGTEFHX0FOWSBcCiAJKFhGU19ESUZMQUdfUkVBTFRJTUUgfCBYRlNfRElGTEFHX1BSRUFMTE9DIHwgWEZTX0RJRkxBR19ORVdSVEJNIHwgXAogCSBYRlNfRElGTEFHX0lNTVVUQUJMRSB8IFhGU19ESUZMQUdfQVBQRU5EIHwgWEZTX0RJRkxBR19TWU5DIHwgXApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyLmMgYi9mcy94ZnMveGZzX2RpcjIuYwppbmRleCBiMGYxZWU4Li5iZTdjNDI1IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2RpcjIuYworKysgYi9mcy94ZnMveGZzX2RpcjIuYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgInhmc19kaXIyX25vZGUuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMl90cmFjZS5oIgogI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc192bm9kZW9wcy5oIgogCiAKIHZvaWQKQEAgLTMwMSw3ICszMDIsNyBAQAogCWludAkJcnZhbDsJCS8qIHJldHVybiB2YWx1ZSAqLwogCWludAkJdjsJCS8qIHR5cGUtY2hlY2tpbmcgdmFsdWUgKi8KIAotCXZuX3RyYWNlX2VudHJ5KGRwLCBfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKwl4ZnNfaXRyYWNlX2VudHJ5KGRwKTsKIAogCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKGRwLT5pX21vdW50KSkKIAkJcmV0dXJuIFhGU19FUlJPUihFSU8pOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19lcnJvci5jIGIvZnMveGZzL3hmc19lcnJvci5jCmluZGV4IGE0NjM0ZDkuLjA1ZTUzNjUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZXJyb3IuYworKysgYi9mcy94ZnMveGZzX2Vycm9yLmMKQEAgLTIzMCwzNyArMjMwLDYgQEAKIAl9CiB9CiAKLVNUQVRJQyB2b2lkCi14ZnNfaGV4X2R1bXAodm9pZCAqcCwgaW50IGxlbmd0aCkKLXsKLQlfX3VpbnQ4X3QgKnVpcCA9IChfX3VpbnQ4X3QqKXA7Ci0JaW50CWk7Ci0JY2hhcglzYnVmWzEyOF0sICpzOwotCi0JcyA9IHNidWY7Ci0JKnMgPSAnXDAnOwotCWZvciAoaT0wOyBpPGxlbmd0aDsgaSsrLCB1aXArKykgewotCQlpZiAoKGkgJSAxNikgPT0gMCkgewotCQkJaWYgKCpzICE9ICdcMCcpCi0JCQkJY21uX2VycihDRV9BTEVSVCwgIiVzXG4iLCBzYnVmKTsKLQkJCXMgPSBzYnVmOwotCQkJc3ByaW50ZihzLCAiMHgleDogIiwgaSk7Ci0JCQl3aGlsZSggKnMgIT0gJ1wwJykKLQkJCQlzKys7Ci0JCX0KLQkJc3ByaW50ZihzLCAiJTAyeCAiLCAqdWlwKTsKLQotCQkvKgotCQkgKiB0aGUga2VybmVsIHNwcmludGYgaXMgYSB2b2lkOyB1c2VyIHNwcmludGYgcmV0dXJucwotCQkgKiB0aGUgc3ByaW50ZidlZCBzdHJpbmcncyBsZW5ndGguICBGaW5kIHRoZSBuZXcgZW5kLQotCQkgKiBvZi1zdHJpbmcKLQkJICovCi0JCXdoaWxlKCAqcyAhPSAnXDAnKQotCQkJcysrOwotCX0KLQljbW5fZXJyKENFX0FMRVJULCAiJXNcbiIsIHNidWYpOwotfQotCiB2b2lkCiB4ZnNfY29ycnVwdGlvbl9lcnJvcigKIAljaGFyCQkqdGFnLApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19lcnJvci5oIGIvZnMveGZzL3hmc19lcnJvci5oCmluZGV4IDEwZTlkOTYuLjY0OTBkMmEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZXJyb3IuaAorKysgYi9mcy94ZnMveGZzX2Vycm9yLmgKQEAgLTE3NCw2ICsxNzQsOCBAQAogLyogUFJJTlRGTElLRTMgKi8KIGV4dGVybiB2b2lkIHhmc19mc19jbW5fZXJyKGludCBsZXZlbCwgc3RydWN0IHhmc19tb3VudCAqbXAsIGNoYXIgKmZtdCwgLi4uKTsKIAorZXh0ZXJuIHZvaWQgeGZzX2hleF9kdW1wKHZvaWQgKnAsIGludCBsZW5ndGgpOworCiAjZGVmaW5lIHhmc19mc19yZXBhaXJfY21uX2VycihsZXZlbCwgbXAsIGZtdCwgYXJncy4uLikgXAogCXhmc19mc19jbW5fZXJyKGxldmVsLCBtcCwgZm10ICIgIFVubW91bnQgYW5kIHJ1biB4ZnNfcmVwYWlyLiIsICMjIGFyZ3MpCiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZXh0ZnJlZV9pdGVtLmMgYi9mcy94ZnMveGZzX2V4dGZyZWVfaXRlbS5jCmluZGV4IGY5MzhhNTEuLjEzMmJkMDcgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZXh0ZnJlZV9pdGVtLmMKKysrIGIvZnMveGZzL3hmc19leHRmcmVlX2l0ZW0uYwpAQCAtMTEwLDE5ICsxMTAsMTggQEAKIHhmc19lZmlfaXRlbV91bnBpbih4ZnNfZWZpX2xvZ19pdGVtX3QgKmVmaXAsIGludCBzdGFsZSkKIHsKIAl4ZnNfbW91bnRfdAkqbXA7Ci0JU1BMREVDTChzKTsKIAogCW1wID0gZWZpcC0+ZWZpX2l0ZW0ubGlfbW91bnRwOwotCUFJTF9MT0NLKG1wLCBzKTsKKwlzcGluX2xvY2soJm1wLT5tX2FpbF9sb2NrKTsKIAlpZiAoZWZpcC0+ZWZpX2ZsYWdzICYgWEZTX0VGSV9DQU5DRUxFRCkgewogCQkvKgogCQkgKiB4ZnNfdHJhbnNfZGVsZXRlX2FpbCgpIGRyb3BzIHRoZSBBSUwgbG9jay4KIAkJICovCi0JCXhmc190cmFuc19kZWxldGVfYWlsKG1wLCAoeGZzX2xvZ19pdGVtX3QgKillZmlwLCBzKTsKKwkJeGZzX3RyYW5zX2RlbGV0ZV9haWwobXAsICh4ZnNfbG9nX2l0ZW1fdCAqKWVmaXApOwogCQl4ZnNfZWZpX2l0ZW1fZnJlZShlZmlwKTsKIAl9IGVsc2UgewogCQllZmlwLT5lZmlfZmxhZ3MgfD0gWEZTX0VGSV9DT01NSVRURUQ7Ci0JCUFJTF9VTkxPQ0sobXAsIHMpOworCQlzcGluX3VubG9jaygmbXAtPm1fYWlsX2xvY2spOwogCX0KIH0KIApAQCAtMTM4LDEwICsxMzcsOSBAQAogewogCXhmc19tb3VudF90CSptcDsKIAl4ZnNfbG9nX2l0ZW1fZGVzY190CSpsaWRwOwotCVNQTERFQ0wocyk7CiAKIAltcCA9IGVmaXAtPmVmaV9pdGVtLmxpX21vdW50cDsKLQlBSUxfTE9DSyhtcCwgcyk7CisJc3Bpbl9sb2NrKCZtcC0+bV9haWxfbG9jayk7CiAJaWYgKGVmaXAtPmVmaV9mbGFncyAmIFhGU19FRklfQ0FOQ0VMRUQpIHsKIAkJLyoKIAkJICogZnJlZSB0aGUgeGFjdGlvbiBkZXNjcmlwdG9yIHBvaW50aW5nIHRvIHRoaXMgaXRlbQpAQCAtMTUyLDExICsxNTAsMTEgQEAKIAkJICogcHVsbCB0aGUgaXRlbSBvZmYgdGhlIEFJTC4KIAkJICogeGZzX3RyYW5zX2RlbGV0ZV9haWwoKSBkcm9wcyB0aGUgQUlMIGxvY2suCiAJCSAqLwotCQl4ZnNfdHJhbnNfZGVsZXRlX2FpbChtcCwgKHhmc19sb2dfaXRlbV90ICopZWZpcCwgcyk7CisJCXhmc190cmFuc19kZWxldGVfYWlsKG1wLCAoeGZzX2xvZ19pdGVtX3QgKillZmlwKTsKIAkJeGZzX2VmaV9pdGVtX2ZyZWUoZWZpcCk7CiAJfSBlbHNlIHsKIAkJZWZpcC0+ZWZpX2ZsYWdzIHw9IFhGU19FRklfQ09NTUlUVEVEOwotCQlBSUxfVU5MT0NLKG1wLCBzKTsKKwkJc3Bpbl91bmxvY2soJm1wLT5tX2FpbF9sb2NrKTsKIAl9CiB9CiAKQEAgLTM1MCwxMyArMzQ4LDEyIEBACiB7CiAJeGZzX21vdW50X3QJKm1wOwogCWludAkJZXh0ZW50c19sZWZ0OwotCVNQTERFQ0wocyk7CiAKIAltcCA9IGVmaXAtPmVmaV9pdGVtLmxpX21vdW50cDsKIAlBU1NFUlQoZWZpcC0+ZWZpX25leHRfZXh0ZW50ID4gMCk7CiAJQVNTRVJUKGVmaXAtPmVmaV9mbGFncyAmIFhGU19FRklfQ09NTUlUVEVEKTsKIAotCUFJTF9MT0NLKG1wLCBzKTsKKwlzcGluX2xvY2soJm1wLT5tX2FpbF9sb2NrKTsKIAlBU1NFUlQoZWZpcC0+ZWZpX25leHRfZXh0ZW50ID49IG5leHRlbnRzKTsKIAllZmlwLT5lZmlfbmV4dF9leHRlbnQgLT0gbmV4dGVudHM7CiAJZXh0ZW50c19sZWZ0ID0gZWZpcC0+ZWZpX25leHRfZXh0ZW50OwpAQCAtMzY0LDEwICszNjEsMTAgQEAKIAkJLyoKIAkJICogeGZzX3RyYW5zX2RlbGV0ZV9haWwoKSBkcm9wcyB0aGUgQUlMIGxvY2suCiAJCSAqLwotCQl4ZnNfdHJhbnNfZGVsZXRlX2FpbChtcCwgKHhmc19sb2dfaXRlbV90ICopZWZpcCwgcyk7CisJCXhmc190cmFuc19kZWxldGVfYWlsKG1wLCAoeGZzX2xvZ19pdGVtX3QgKillZmlwKTsKIAkJeGZzX2VmaV9pdGVtX2ZyZWUoZWZpcCk7CiAJfSBlbHNlIHsKLQkJQUlMX1VOTE9DSyhtcCwgcyk7CisJCXNwaW5fdW5sb2NrKCZtcC0+bV9haWxfbG9jayk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2ZpbGVzdHJlYW0uYyBiL2ZzL3hmcy94ZnNfZmlsZXN0cmVhbS5jCmluZGV4IDM2ZDhmNmEuLmViMDNlYWIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZmlsZXN0cmVhbS5jCisrKyBiL2ZzL3hmcy94ZnNfZmlsZXN0cmVhbS5jCkBAIC0zNDgsNyArMzQ4LDcgQEAKIH0KIAogLyogeGZzX2ZzdHJtX2ZyZWVfZnVuYygpOiBjYWxsYmFjayBmb3IgZnJlZWluZyBjYWNoZWQgc3RyZWFtIGl0ZW1zLiAqLwotdm9pZAorU1RBVElDIHZvaWQKIHhmc19mc3RybV9mcmVlX2Z1bmMoCiAJdW5zaWduZWQgbG9uZwlpbm8sCiAJdm9pZAkJKmRhdGEpCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2ZzLmggYi9mcy94ZnMveGZzX2ZzLmgKaW5kZXggYWFiOTY2Mi4uM2JlZDY0MyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19mcy5oCisrKyBiL2ZzL3hmcy94ZnNfZnMuaApAQCAtNDE5LDkgKzQxOSwxMyBAQAogLyoKICAqIGlvY3RsIGNvbW1hbmRzIHRoYXQgYXJlIHVzZWQgYnkgTGludXggZmlsZXN5c3RlbXMKICAqLwotI2RlZmluZSBYRlNfSU9DX0dFVFhGTEFHUwlfSU9SKCdmJywgMSwgbG9uZykKLSNkZWZpbmUgWEZTX0lPQ19TRVRYRkxBR1MJX0lPVygnZicsIDIsIGxvbmcpCi0jZGVmaW5lIFhGU19JT0NfR0VUVkVSU0lPTglfSU9SKCd2JywgMSwgbG9uZykKKyNkZWZpbmUgWEZTX0lPQ19HRVRYRkxBR1MJRlNfSU9DX0dFVEZMQUdTCisjZGVmaW5lIFhGU19JT0NfU0VUWEZMQUdTCUZTX0lPQ19TRVRGTEFHUworI2RlZmluZSBYRlNfSU9DX0dFVFZFUlNJT04JRlNfSU9DX0dFVFZFUlNJT04KKy8qIDMyLWJpdCBjb21wYXQgY291bnRlcnBhcnRzICovCisjZGVmaW5lIFhGU19JT0MzMl9HRVRYRkxBR1MJRlNfSU9DMzJfR0VURkxBR1MKKyNkZWZpbmUgWEZTX0lPQzMyX1NFVFhGTEFHUwlGU19JT0MzMl9TRVRGTEFHUworI2RlZmluZSBYRlNfSU9DMzJfR0VUVkVSU0lPTglGU19JT0MzMl9HRVRWRVJTSU9OCiAKIC8qCiAgKiBpb2N0bCBjb21tYW5kcyB0aGF0IHJlcGxhY2UgSVJJWCBmY250bCgpJ3MKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZnNvcHMuYyBiL2ZzL3hmcy94ZnNfZnNvcHMuYwppbmRleCBjOTJkNWI4Li5iOGRlN2YzIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2Zzb3BzLmMKKysrIGIvZnMveGZzL3hmc19mc29wcy5jCkBAIC00NjIsMTUgKzQ2MiwxMyBAQAogCXhmc19tb3VudF90CQkqbXAsCiAJeGZzX2Zzb3BfY291bnRzX3QJKmNudCkKIHsKLQl1bnNpZ25lZCBsb25nCXM7Ci0KIAl4ZnNfaWNzYl9zeW5jX2NvdW50ZXJzX2ZsYWdzKG1wLCBYRlNfSUNTQl9MQVpZX0NPVU5UKTsKLQlzID0gWEZTX1NCX0xPQ0sobXApOworCXNwaW5fbG9jaygmbXAtPm1fc2JfbG9jayk7CiAJY250LT5mcmVlZGF0YSA9IG1wLT5tX3NiLnNiX2ZkYmxvY2tzIC0gWEZTX0FMTE9DX1NFVF9BU0lERShtcCk7CiAJY250LT5mcmVlcnR4ID0gbXAtPm1fc2Iuc2JfZnJleHRlbnRzOwogCWNudC0+ZnJlZWlubyA9IG1wLT5tX3NiLnNiX2lmcmVlOwogCWNudC0+YWxsb2Npbm8gPSBtcC0+bV9zYi5zYl9pY291bnQ7Ci0JWEZTX1NCX1VOTE9DSyhtcCwgcyk7CisJc3Bpbl91bmxvY2soJm1wLT5tX3NiX2xvY2spOwogCXJldHVybiAwOwogfQogCkBAIC00OTcsNyArNDk1LDYgQEAKIHsKIAlfX2ludDY0X3QJCWxjb3VudGVyLCBkZWx0YSwgZmRibGtzX2RlbHRhOwogCV9fdWludDY0X3QJCXJlcXVlc3Q7Ci0JdW5zaWduZWQgbG9uZwkJczsKIAogCS8qIElmIGludmFsIGlzIG51bGwsIHJlcG9ydCBjdXJyZW50IHZhbHVlcyBhbmQgcmV0dXJuICovCiAJaWYgKGludmFsID09IChfX3VpbnQ2NF90ICopTlVMTCkgewpAQCAtNTE1LDcgKzUxMiw3IEBACiAJICogcHJvYmxlbS4gd2UgbmVlZHRvIHdvcmsgb3V0IGlmIHdlIGFyZSBmcmVlaW5nIG9yIGFsbG9jYXRpb24KIAkgKiBibG9ja3MgZmlyc3QsIHRoZW4gd2UgY2FuIGRvIHRoZSBtb2RpZmljYXRpb24gYXMgbmVjZXNzYXJ5LgogCSAqCi0JICogV2UgZG8gdGhpcyB1bmRlciB0aGUgWEZTX1NCX0xPQ0sgc28gdGhhdCBpZiB3ZSBhcmUgbmVhcgorCSAqIFdlIGRvIHRoaXMgdW5kZXIgdGhlIG1fc2JfbG9jayBzbyB0aGF0IGlmIHdlIGFyZSBuZWFyCiAJICogRU5PU1BDLCB3ZSB3aWxsIGhvbGQgb3V0IGFueSBjaGFuZ2VzIHdoaWxlIHdlIHdvcmsgb3V0CiAJICogd2hhdCB0byBkby4gVGhpcyBtZWFucyB0aGF0IHRoZSBhbW91bnQgb2YgZnJlZSBzcGFjZSBjYW4KIAkgKiBjaGFuZ2Ugd2hpbGUgd2UgZG8gdGhpcywgc28gd2UgbmVlZCB0byByZXRyeSBpZiB3ZSBlbmQgdXAKQEAgLTUyNiw3ICs1MjMsNyBAQAogCSAqIGVuYWJsZWQsIGRpc2FibGVkIG9yIGV2ZW4gY29tcGlsZWQgaW4uLi4uCiAJICovCiByZXRyeToKLQlzID0gWEZTX1NCX0xPQ0sobXApOworCXNwaW5fbG9jaygmbXAtPm1fc2JfbG9jayk7CiAJeGZzX2ljc2Jfc3luY19jb3VudGVyc19mbGFncyhtcCwgWEZTX0lDU0JfU0JfTE9DS0VEKTsKIAogCS8qCkBAIC01NjksNyArNTY2LDcgQEAKIAkJb3V0dmFsLT5yZXNibGtzID0gbXAtPm1fcmVzYmxrczsKIAkJb3V0dmFsLT5yZXNibGtzX2F2YWlsID0gbXAtPm1fcmVzYmxrc19hdmFpbDsKIAl9Ci0JWEZTX1NCX1VOTE9DSyhtcCwgcyk7CisJc3Bpbl91bmxvY2soJm1wLT5tX3NiX2xvY2spOwogCiAJaWYgKGZkYmxrc19kZWx0YSkgewogCQkvKgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pYWxsb2NfYnRyZWUuaCBiL2ZzL3hmcy94ZnNfaWFsbG9jX2J0cmVlLmgKaW5kZXggYmY4ZTlhZi4uOGVmYzRhNSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pYWxsb2NfYnRyZWUuaAorKysgYi9mcy94ZnMveGZzX2lhbGxvY19idHJlZS5oCkBAIC04MSw4ICs4MSw2IEBACiAjZGVmaW5lCVhGU19JTk9CVF9NQVNLKGkpCQkoKHhmc19pbm9mcmVlX3QpMSA8PCAoaSkpCiAjZGVmaW5lCVhGU19JTk9CVF9JU19GUkVFKHJwLGkpCQlcCiAJCSgoKHJwKS0+aXJfZnJlZSAmIFhGU19JTk9CVF9NQVNLKGkpKSAhPSAwKQotI2RlZmluZQlYRlNfSU5PQlRfSVNfRlJFRV9ESVNLKHJwLGkpCVwKLQkJKChiZTY0X3RvX2NwdSgocnApLT5pcl9mcmVlKSAmIFhGU19JTk9CVF9NQVNLKGkpKSAhPSAwKQogI2RlZmluZQlYRlNfSU5PQlRfU0VUX0ZSRUUocnAsaSkJKChycCktPmlyX2ZyZWUgfD0gWEZTX0lOT0JUX01BU0soaSkpCiAjZGVmaW5lCVhGU19JTk9CVF9DTFJfRlJFRShycCxpKQkoKHJwKS0+aXJfZnJlZSAmPSB+WEZTX0lOT0JUX01BU0soaSkpCiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaWdldC5jIGIvZnMveGZzL3hmc19pZ2V0LmMKaW5kZXggZmI2OWVmMS4uZjAxYjA3NiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pZ2V0LmMKKysrIGIvZnMveGZzL3hmc19pZ2V0LmMKQEAgLTY1LDcgKzY1LDcgQEAKICAqLwogU1RBVElDIGludAogeGZzX2lnZXRfY29yZSgKLQliaHZfdm5vZGVfdAkqdnAsCisJc3RydWN0IGlub2RlCSppbm9kZSwKIAl4ZnNfbW91bnRfdAkqbXAsCiAJeGZzX3RyYW5zX3QJKnRwLAogCXhmc19pbm9fdAlpbm8sCkBAIC03NCw5ICs3NCw5IEBACiAJeGZzX2lub2RlX3QJKippcHAsCiAJeGZzX2RhZGRyX3QJYm5vKQogeworCXN0cnVjdCBpbm9kZQkqb2xkX2lub2RlOwogCXhmc19pbm9kZV90CSppcDsKIAl4ZnNfaW5vZGVfdAkqaXE7Ci0JYmh2X3Zub2RlX3QJKmlub2RlX3ZwOwogCWludAkJZXJyb3I7CiAJeGZzX2ljbHVzdGVyX3QJKmljbCwgKm5ld19pY2wgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcJZmlyc3RfaW5kZXgsIG1hc2s7CkBAIC0xMTEsOCArMTExLDggQEAKIAkJCWdvdG8gYWdhaW47CiAJCX0KIAotCQlpbm9kZV92cCA9IFhGU19JVE9WX05VTEwoaXApOwotCQlpZiAoaW5vZGVfdnAgPT0gTlVMTCkgeworCQlvbGRfaW5vZGUgPSBpcC0+aV92bm9kZTsKKwkJaWYgKG9sZF9pbm9kZSA9PSBOVUxMKSB7CiAJCQkvKgogCQkJICogSWYgSVJFQ0xBSU0gaXMgc2V0IHRoaXMgaW5vZGUgaXMKIAkJCSAqIG9uIGl0cyB3YXkgb3V0IG9mIHRoZSBzeXN0ZW0sCkBAIC0xNDAsMjggKzE0MCw5IEBACiAJCQkJcmV0dXJuIEVOT0VOVDsKIAkJCX0KIAotCQkJLyoKLQkJCSAqIFRoZXJlIG1heSBiZSB0cmFuc2FjdGlvbnMgc2l0dGluZyBpbiB0aGUKLQkJCSAqIGluY29yZSBsb2cgYnVmZmVycyBvciBiZWluZyBmbHVzaGVkIHRvIGRpc2sKLQkJCSAqIGF0IHRoaXMgdGltZS4gIFdlIGNhbid0IGNsZWFyIHRoZQotCQkJICogWEZTX0lSRUNMQUlNQUJMRSBmbGFnIHVudGlsIHRoZXNlCi0JCQkgKiB0cmFuc2FjdGlvbnMgaGF2ZSBoaXQgdGhlIGRpc2ssIG90aGVyd2lzZSB3ZQotCQkJICogd2lsbCB2b2lkIHRoZSBndWFyYW50ZWUgdGhlIGZsYWcgcHJvdmlkZXMKLQkJCSAqIHhmc19pdW5waW4oKQotCQkJICovCi0JCQlpZiAoeGZzX2lwaW5jb3VudChpcCkpIHsKLQkJCQlyZWFkX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOwotCQkJCXhmc19sb2dfZm9yY2UobXAsIDAsCi0JCQkJCVhGU19MT0dfRk9SQ0V8WEZTX0xPR19TWU5DKTsKLQkJCQlYRlNfU1RBVFNfSU5DKHhzX2lnX2ZyZWN5Y2xlKTsKLQkJCQlnb3RvIGFnYWluOwotCQkJfQotCi0JCQl2bl90cmFjZV9leGl0KGlwLCAieGZzX2lnZXQuYWxsb2MiLAotCQkJCShpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKwkJCXhmc19pdHJhY2VfZXhpdF90YWcoaXAsICJ4ZnNfaWdldC5hbGxvYyIpOwogCiAJCQlYRlNfU1RBVFNfSU5DKHhzX2lnX2ZvdW5kKTsKLQogCQkJeGZzX2lmbGFnc19jbGVhcihpcCwgWEZTX0lSRUNMQUlNQUJMRSk7CiAJCQlyZWFkX3VubG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOwogCkBAIC0xNzEsMTMgKzE1MiwxMSBAQAogCiAJCQlnb3RvIGZpbmlzaF9pbm9kZTsKIAotCQl9IGVsc2UgaWYgKHZwICE9IGlub2RlX3ZwKSB7Ci0JCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gdm5fdG9faW5vZGUoaW5vZGVfdnApOwotCisJCX0gZWxzZSBpZiAoaW5vZGUgIT0gb2xkX2lub2RlKSB7CiAJCQkvKiBUaGUgaW5vZGUgaXMgYmVpbmcgdG9ybiBkb3duLCBwYXVzZSBhbmQKIAkJCSAqIHRyeSBhZ2Fpbi4KIAkJCSAqLwotCQkJaWYgKGlub2RlLT5pX3N0YXRlICYgKElfRlJFRUlORyB8IElfQ0xFQVIpKSB7CisJCQlpZiAob2xkX2lub2RlLT5pX3N0YXRlICYgKElfRlJFRUlORyB8IElfQ0xFQVIpKSB7CiAJCQkJcmVhZF91bmxvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKIAkJCQlkZWxheSgxKTsKIAkJCQlYRlNfU1RBVFNfSU5DKHhzX2lnX2ZyZWN5Y2xlKTsKQEAgLTE5MCw3ICsxNjksNyBAQAogKi8KIAkJCWNtbl9lcnIoQ0VfUEFOSUMsCiAJCSJ4ZnNfaWdldF9jb3JlOiBhbWJpZ3VvdXMgdm5zOiB2cC8weCVwLCBpbnZwLzB4JXAiLAotCQkJCQlpbm9kZV92cCwgdnApOworCQkJCQlvbGRfaW5vZGUsIGlub2RlKTsKIAkJfQogCiAJCS8qCkBAIC0yMDAsMjAgKzE3OSwxNiBAQAogCQlYRlNfU1RBVFNfSU5DKHhzX2lnX2ZvdW5kKTsKIAogZmluaXNoX2lub2RlOgotCQlpZiAoaXAtPmlfZC5kaV9tb2RlID09IDApIHsKLQkJCWlmICghKGZsYWdzICYgWEZTX0lHRVRfQ1JFQVRFKSkgewotCQkJCXhmc19wdXRfcGVyYWcobXAsIHBhZyk7Ci0JCQkJcmV0dXJuIEVOT0VOVDsKLQkJCX0KLQkJCXhmc19pb2NvcmVfaW5vZGVfcmVpbml0KGlwKTsKKwkJaWYgKGlwLT5pX2QuZGlfbW9kZSA9PSAwICYmICEoZmxhZ3MgJiBYRlNfSUdFVF9DUkVBVEUpKSB7CisJCQl4ZnNfcHV0X3BlcmFnKG1wLCBwYWcpOworCQkJcmV0dXJuIEVOT0VOVDsKIAkJfQogCiAJCWlmIChsb2NrX2ZsYWdzICE9IDApCiAJCQl4ZnNfaWxvY2soaXAsIGxvY2tfZmxhZ3MpOwogCiAJCXhmc19pZmxhZ3NfY2xlYXIoaXAsIFhGU19JU1RBTEUpOwotCQl2bl90cmFjZV9leGl0KGlwLCAieGZzX2lnZXQuZm91bmQiLAotCQkJCQkoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisJCXhmc19pdHJhY2VfZXhpdF90YWcoaXAsICJ4ZnNfaWdldC5mb3VuZCIpOwogCQlnb3RvIHJldHVybl9pcDsKIAl9CiAKQEAgLTIzNCwxMCArMjA5LDE2IEBACiAJCXJldHVybiBlcnJvcjsKIAl9CiAKLQl2bl90cmFjZV9leGl0KGlwLCAieGZzX2lnZXQuYWxsb2MiLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisJeGZzX2l0cmFjZV9leGl0X3RhZyhpcCwgInhmc19pZ2V0LmFsbG9jIik7CiAKLQl4ZnNfaW5vZGVfbG9ja19pbml0KGlwLCB2cCk7Ci0JeGZzX2lvY29yZV9pbm9kZV9pbml0KGlwKTsKKworCW1ybG9ja19pbml0KCZpcC0+aV9sb2NrLCBNUkxPQ0tfQUxMT1dfRVFVQUxfUFJJfE1STE9DS19CQVJSSUVSLAorCQkgICAgICJ4ZnNpbm8iLCBpcC0+aV9pbm8pOworCW1ybG9ja19pbml0KCZpcC0+aV9pb2xvY2ssIE1STE9DS19CQVJSSUVSLCAieGZzaW8iLCBpcC0+aV9pbm8pOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmlwLT5pX2lwaW5fd2FpdCk7CisJYXRvbWljX3NldCgmaXAtPmlfcGluY291bnQsIDApOworCWluaXRuc2VtYSgmaXAtPmlfZmxvY2ssIDEsICJ4ZnNmaW5vIik7CisKIAlpZiAobG9ja19mbGFncykKIAkJeGZzX2lsb2NrKGlwLCBsb2NrX2ZsYWdzKTsKIApAQCAtMzMzLDkgKzMxNCw2IEBACiAJQVNTRVJUKGlwLT5pX2RmLmlmX2V4dF9tYXggPT0KIAkgICAgICAgWEZTX0lGT1JLX0RTSVpFKGlwKSAvIHNpemVvZih4ZnNfYm1idF9yZWNfdCkpOwogCi0JQVNTRVJUKCgoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpICE9IDApID09Ci0JICAgICAgICgoaXAtPmlfaW9jb3JlLmlvX2ZsYWdzICYgWEZTX0lPQ09SRV9SVCkgIT0gMCkpOwotCiAJeGZzX2lmbGFnc19zZXQoaXAsIFhGU19JTU9ESUZJRUQpOwogCSppcHAgPSBpcDsKIApAQCAtMzQzLDcgKzMyMSw3IEBACiAJICogSWYgd2UgaGF2ZSBhIHJlYWwgdHlwZSBmb3IgYW4gb24tZGlzayBpbm9kZSwgd2UgY2FuIHNldCBvcHMoJnVubG9jaykKIAkgKiBub3cuCSBJZiBpdCdzIGEgbmV3IGlub2RlIGJlaW5nIGNyZWF0ZWQsIHhmc19pYWxsb2Mgd2lsbCBoYW5kbGUgaXQuCiAJICovCi0JeGZzX2luaXRpYWxpemVfdm5vZGUobXAsIHZwLCBpcCk7CisJeGZzX2luaXRpYWxpemVfdm5vZGUobXAsIGlub2RlLCBpcCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM2Myw2OSArMzQxLDU4IEBACiAJeGZzX2RhZGRyX3QJYm5vKQogewogCXN0cnVjdCBpbm9kZQkqaW5vZGU7Ci0JYmh2X3Zub2RlX3QJKnZwID0gTlVMTDsKKwl4ZnNfaW5vZGVfdAkqaXA7CiAJaW50CQllcnJvcjsKIAogCVhGU19TVEFUU19JTkMoeHNfaWdfYXR0ZW1wdHMpOwogCiByZXRyeToKIAlpbm9kZSA9IGlnZXRfbG9ja2VkKG1wLT5tX3N1cGVyLCBpbm8pOwotCWlmIChpbm9kZSkgewotCQl4ZnNfaW5vZGVfdAkqaXA7CisJaWYgKCFpbm9kZSkKKwkJLyogSWYgd2UgZ290IG5vIGlub2RlIHdlIGFyZSBvdXQgb2YgbWVtb3J5ICovCisJCXJldHVybiBFTk9NRU07CiAKLQkJdnAgPSB2bl9mcm9tX2lub2RlKGlub2RlKTsKLQkJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKLQkJCXZuX2luaXRpYWxpemUoaW5vZGUpOwotCQkJZXJyb3IgPSB4ZnNfaWdldF9jb3JlKHZwLCBtcCwgdHAsIGlubywgZmxhZ3MsCi0JCQkJCWxvY2tfZmxhZ3MsIGlwcCwgYm5vKTsKLQkJCWlmIChlcnJvcikgewotCQkJCXZuX21hcmtfYmFkKHZwKTsKLQkJCQlpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykKLQkJCQkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7Ci0JCQkJaXB1dChpbm9kZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogSWYgdGhlIGlub2RlIGlzIG5vdCBmdWxseSBjb25zdHJ1Y3RlZCBkdWUgdG8KLQkJCSAqIGZpbGVoYW5kbGUgbWlzbWF0Y2hlcyB3YWl0IGZvciB0aGUgaW5vZGUgdG8gZ28KLQkJCSAqIGF3YXkgYW5kIHRyeSBhZ2Fpbi4KLQkJCSAqCi0JCQkgKiBpZ2V0X2xvY2tlZCB3aWxsIGNhbGwgX193YWl0X29uX2ZyZWVpbmdfaW5vZGUKLQkJCSAqIHRvIHdhaXQgZm9yIHRoZSBpbm9kZSB0byBnbyBhd2F5LgotCQkJICovCi0JCQlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSB8fAotCQkJICAgICgoaXAgPSB4ZnNfdnRvaSh2cCkpID09IE5VTEwpKSB7Ci0JCQkJaXB1dChpbm9kZSk7Ci0JCQkJZGVsYXkoMSk7Ci0JCQkJZ290byByZXRyeTsKLQkJCX0KKwlpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykgeworCQlYRlNfU1RBVFNfSU5DKHZuX2FjdGl2ZSk7CisJCVhGU19TVEFUU19JTkModm5fYWxsb2MpOwogCi0JCQlpZiAobG9ja19mbGFncyAhPSAwKQotCQkJCXhmc19pbG9jayhpcCwgbG9ja19mbGFncyk7Ci0JCQlYRlNfU1RBVFNfSU5DKHhzX2lnX2ZvdW5kKTsKLQkJCSppcHAgPSBpcDsKLQkJCWVycm9yID0gMDsKKwkJZXJyb3IgPSB4ZnNfaWdldF9jb3JlKGlub2RlLCBtcCwgdHAsIGlubywgZmxhZ3MsCisJCQkJbG9ja19mbGFncywgaXBwLCBibm8pOworCQlpZiAoZXJyb3IpIHsKKwkJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJCWlmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKQorCQkJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCQkJaXB1dChpbm9kZSk7CiAJCX0KLQl9IGVsc2UKLQkJZXJyb3IgPSBFTk9NRU07CS8qIElmIHdlIGdvdCBubyBpbm9kZSB3ZSBhcmUgb3V0IG9mIG1lbW9yeSAqLworCQlyZXR1cm4gZXJyb3I7CisJfQogCi0JcmV0dXJuIGVycm9yOwotfQorCS8qCisJICogSWYgdGhlIGlub2RlIGlzIG5vdCBmdWxseSBjb25zdHJ1Y3RlZCBkdWUgdG8KKwkgKiBmaWxlaGFuZGxlIG1pc21hdGNoZXMgd2FpdCBmb3IgdGhlIGlub2RlIHRvIGdvCisJICogYXdheSBhbmQgdHJ5IGFnYWluLgorCSAqCisJICogaWdldF9sb2NrZWQgd2lsbCBjYWxsIF9fd2FpdF9vbl9mcmVlaW5nX2lub2RlCisJICogdG8gd2FpdCBmb3IgdGhlIGlub2RlIHRvIGdvIGF3YXkuCisJICovCisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpIHsKKwkJaXB1dChpbm9kZSk7CisJCWRlbGF5KDEpOworCQlnb3RvIHJldHJ5OworCX0KIAotLyoKLSAqIERvIHRoZSBzZXR1cCBmb3IgdGhlIHZhcmlvdXMgbG9ja3Mgd2l0aGluIHRoZSBpbmNvcmUgaW5vZGUuCi0gKi8KLXZvaWQKLXhmc19pbm9kZV9sb2NrX2luaXQoCi0JeGZzX2lub2RlX3QJKmlwLAotCWJodl92bm9kZV90CSp2cCkKLXsKLQltcmxvY2tfaW5pdCgmaXAtPmlfbG9jaywgTVJMT0NLX0FMTE9XX0VRVUFMX1BSSXxNUkxPQ0tfQkFSUklFUiwKLQkJICAgICAieGZzaW5vIiwgaXAtPmlfaW5vKTsKLQltcmxvY2tfaW5pdCgmaXAtPmlfaW9sb2NrLCBNUkxPQ0tfQkFSUklFUiwgInhmc2lvIiwgaXAtPmlfaW5vKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpcC0+aV9pcGluX3dhaXQpOwotCWF0b21pY19zZXQoJmlwLT5pX3BpbmNvdW50LCAwKTsKLQlpbml0bnNlbWEoJmlwLT5pX2Zsb2NrLCAxLCAieGZzZmlubyIpOworCWlwID0gWEZTX0koaW5vZGUpOworCWlmICghaXApIHsKKwkJaXB1dChpbm9kZSk7CisJCWRlbGF5KDEpOworCQlnb3RvIHJldHJ5OworCX0KKworCWlmIChsb2NrX2ZsYWdzICE9IDApCisJCXhmc19pbG9jayhpcCwgbG9ja19mbGFncyk7CisJWEZTX1NUQVRTX0lOQyh4c19pZ19mb3VuZCk7CisJKmlwcCA9IGlwOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtNDY1LDExICs0MzIsOSBAQAogeGZzX2lwdXQoeGZzX2lub2RlX3QJKmlwLAogCSB1aW50CQlsb2NrX2ZsYWdzKQogewotCWJodl92bm9kZV90CSp2cCA9IFhGU19JVE9WKGlwKTsKLQotCXZuX3RyYWNlX2VudHJ5KGlwLCAieGZzX2lwdXQiLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisJeGZzX2l0cmFjZV9lbnRyeShpcCk7CiAJeGZzX2l1bmxvY2soaXAsIGxvY2tfZmxhZ3MpOwotCVZOX1JFTEUodnApOworCUlSRUxFKGlwKTsKIH0KIAogLyoKQEAgLTQ3OSwyMCArNDQ0LDE5IEBACiB4ZnNfaXB1dF9uZXcoeGZzX2lub2RlX3QJKmlwLAogCSAgICAgdWludAkJbG9ja19mbGFncykKIHsKLQliaHZfdm5vZGVfdAkqdnAgPSBYRlNfSVRPVihpcCk7Ci0Jc3RydWN0IGlub2RlCSppbm9kZSA9IHZuX3RvX2lub2RlKHZwKTsKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gaXAtPmlfdm5vZGU7CiAKLQl2bl90cmFjZV9lbnRyeShpcCwgInhmc19pcHV0X25ldyIsIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKwl4ZnNfaXRyYWNlX2VudHJ5KGlwKTsKIAogCWlmICgoaXAtPmlfZC5kaV9tb2RlID09IDApKSB7CiAJCUFTU0VSVCgheGZzX2lmbGFnc190ZXN0KGlwLCBYRlNfSVJFQ0xBSU1BQkxFKSk7Ci0JCXZuX21hcmtfYmFkKHZwKTsKKwkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOwogCX0KIAlpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykKIAkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CiAJaWYgKGxvY2tfZmxhZ3MpCiAJCXhmc19pdW5sb2NrKGlwLCBsb2NrX2ZsYWdzKTsKLQlWTl9SRUxFKHZwKTsKKwlJUkVMRShpcCk7CiB9CiAKIApAQCAtNTA1LDggKzQ2OSw2IEBACiB2b2lkCiB4ZnNfaXJlY2xhaW0oeGZzX2lub2RlX3QgKmlwKQogewotCWJodl92bm9kZV90CSp2cDsKLQogCS8qCiAJICogUmVtb3ZlIGZyb20gb2xkIGhhc2ggbGlzdCBhbmQgbW91bnQgbGlzdC4KIAkgKi8KQEAgLTUzNSw5ICs0OTcsOCBAQAogCS8qCiAJICogUHVsbCBvdXIgYmVoYXZpb3IgZGVzY3JpcHRvciBmcm9tIHRoZSB2bm9kZSBjaGFpbi4KIAkgKi8KLQl2cCA9IFhGU19JVE9WX05VTEwoaXApOwotCWlmICh2cCkgewotCQl2bl90b19pbm9kZSh2cCktPmlfcHJpdmF0ZSA9IE5VTEw7CisJaWYgKGlwLT5pX3Zub2RlKSB7CisJCWlwLT5pX3Zub2RlLT5pX3ByaXZhdGUgPSBOVUxMOwogCQlpcC0+aV92bm9kZSA9IE5VTEw7CiAJfQogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlLmMgYi9mcy94ZnMveGZzX2lub2RlLmMKaW5kZXggMzQ0OTQ4MC4uYTU1MDU0NmEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW5vZGUuYworKysgYi9mcy94ZnMveGZzX2lub2RlLmMKQEAgLTE1LDYgKzE1LDggQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCiAgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKICAqLworI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KKwogI2luY2x1ZGUgInhmcy5oIgogI2luY2x1ZGUgInhmc19mcy5oIgogI2luY2x1ZGUgInhmc190eXBlcy5oIgpAQCAtODI2LDE1ICs4MjgsMTcgQEAKIAl4ZnNfaWNkaW5vZGVfdAkJKmRpYyA9ICZpcC0+aV9kOwogCiAJcmV0dXJuIF94ZnNfZGljMnhmbGFncyhkaWMtPmRpX2ZsYWdzKSB8Ci0JCQkJKFhGU19DRk9SS19RKGRpYykgPyBYRlNfWEZMQUdfSEFTQVRUUiA6IDApOworCQkJCShYRlNfSUZPUktfUShpcCkgPyBYRlNfWEZMQUdfSEFTQVRUUiA6IDApOwogfQogCiB1aW50CiB4ZnNfZGljMnhmbGFncygKLQl4ZnNfZGlub2RlX2NvcmVfdAkqZGljKQorCXhmc19kaW5vZGVfdAkJKmRpcCkKIHsKKwl4ZnNfZGlub2RlX2NvcmVfdAkqZGljID0gJmRpcC0+ZGlfY29yZTsKKwogCXJldHVybiBfeGZzX2RpYzJ4ZmxhZ3MoYmUxNl90b19jcHUoZGljLT5kaV9mbGFncykpIHwKLQkJCQkoWEZTX0NGT1JLX1FfRElTSyhkaWMpID8gWEZTX1hGTEFHX0hBU0FUVFIgOiAwKTsKKwkJCQkoWEZTX0RGT1JLX1EoZGlwKSA/IFhGU19YRkxBR19IQVNBVFRSIDogMCk7CiB9CiAKIC8qCkBAIC04ODQsOCArODg4LDggQEAKIAkgKiBJbml0aWFsaXplIGlub2RlJ3MgdHJhY2UgYnVmZmVycy4KIAkgKiBEbyB0aGlzIGJlZm9yZSB4ZnNfaWZvcm1hdCBpbiBjYXNlIGl0IGFkZHMgZW50cmllcy4KIAkgKi8KLSNpZmRlZglYRlNfVk5PREVfVFJBQ0UKLQlpcC0+aV90cmFjZSA9IGt0cmFjZV9hbGxvYyhWTk9ERV9UUkFDRV9TSVpFLCBLTV9TTEVFUCk7CisjaWZkZWYJWEZTX0lOT0RFX1RSQUNFCisJaXAtPmlfdHJhY2UgPSBrdHJhY2VfYWxsb2MoSU5PREVfVFJBQ0VfU0laRSwgS01fU0xFRVApOwogI2VuZGlmCiAjaWZkZWYgWEZTX0JNQVBfVFJBQ0UKIAlpcC0+aV94dHJhY2UgPSBrdHJhY2VfYWxsb2MoWEZTX0JNQVBfS1RSQUNFX1NJWkUsIEtNX1NMRUVQKTsKQEAgLTEyMjAsMTAgKzEyMjQsOCBAQAogCQkJCQlpcC0+aV9kLmRpX2V4dHNpemUgPSBwaXAtPmlfZC5kaV9leHRzaXplOwogCQkJCX0KIAkJCX0gZWxzZSBpZiAoKG1vZGUgJiBTX0lGTVQpID09IFNfSUZSRUcpIHsKLQkJCQlpZiAocGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JUSU5IRVJJVCkgeworCQkJCWlmIChwaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUlRJTkhFUklUKQogCQkJCQlkaV9mbGFncyB8PSBYRlNfRElGTEFHX1JFQUxUSU1FOwotCQkJCQlpcC0+aV9pb2NvcmUuaW9fZmxhZ3MgfD0gWEZTX0lPQ09SRV9SVDsKLQkJCQl9CiAJCQkJaWYgKHBpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19FWFRTWklOSEVSSVQpIHsKIAkJCQkJZGlfZmxhZ3MgfD0gWEZTX0RJRkxBR19FWFRTSVpFOwogCQkJCQlpcC0+aV9kLmRpX2V4dHNpemUgPSBwaXAtPmlfZC5kaV9leHRzaXplOwpAQCAtMTI5OCw3ICsxMzAwLDEwIEBACiAJaWYgKChpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpICE9IFNfSUZSRUcpCiAJCXJldHVybjsKIAotCWlmIChpcC0+aV9kLmRpX2ZsYWdzICYgKFhGU19ESUZMQUdfUkVBTFRJTUUgfCBYRlNfRElGTEFHX0VYVFNJWkUpKQorCWlmIChYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApKQorCQlyZXR1cm47CisKKwlpZiAoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfRVhUU0laRSkKIAkJcmV0dXJuOwogCiAJbmltYXBzID0gMjsKQEAgLTE3MTEsNyArMTcxNiw3IEBACiAJCSAqIHJ1bnMuCiAJCSAqLwogCQlYRlNfQk1BUF9JTklUKCZmcmVlX2xpc3QsICZmaXJzdF9ibG9jayk7Ci0JCWVycm9yID0gWEZTX0JVTk1BUEkobXAsIG50cCwgJmlwLT5pX2lvY29yZSwKKwkJZXJyb3IgPSB4ZnNfYnVubWFwaShudHAsIGlwLAogCQkJCSAgICBmaXJzdF91bm1hcF9ibG9jaywgdW5tYXBfbGVuLAogCQkJCSAgICBYRlNfQk1BUElfQUZMQUcoZm9yaykgfAogCQkJCSAgICAgIChzeW5jID8gMCA6IFhGU19CTUFQSV9BU1lOQyksCkBAIC0xODQ0LDggKzE4NDksNiBAQAogCXhmc19mc2l6ZV90CW5ld19zaXplLAogCWNyZWRfdAkJKmNyZWRwKQogewotCWludAkJZXJyb3I7Ci0KIAlBU1NFUlQoaXNtcmxvY2tlZCgmKGlwLT5pX2xvY2spLCBNUl9VUERBVEUpICE9IDApOwogCUFTU0VSVChpc21ybG9ja2VkKCYoaXAtPmlfaW9sb2NrKSwgTVJfVVBEQVRFKSAhPSAwKTsKIAlBU1NFUlQobmV3X3NpemUgPiBpcC0+aV9zaXplKTsKQEAgLTE4NTUsOSArMTg1OCw3IEBACiAJICogeGZzX3dyaXRlX2ZpbGUoKSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZmlsZQogCSAqIGFuZCBhbnkgYmxvY2tzIGJldHdlZW4gdGhlIG9sZCBhbmQgbmV3IGZpbGUgc2l6ZXMuCiAJICovCi0JZXJyb3IgPSB4ZnNfemVyb19lb2YoWEZTX0lUT1YoaXApLCAmaXAtPmlfaW9jb3JlLCBuZXdfc2l6ZSwKLQkJCSAgICAgaXAtPmlfc2l6ZSk7Ci0JcmV0dXJuIGVycm9yOworCXJldHVybiB4ZnNfemVyb19lb2YoaXAsIG5ld19zaXplLCBpcC0+aV9zaXplKTsKIH0KIAogLyoKQEAgLTE5NTksMjQgKzE5NjAsNiBAQAogCUFTU0VSVChhZ2ktPmFnaV91bmxpbmtlZFtidWNrZXRfaW5kZXhdKTsKIAlBU1NFUlQoYmUzMl90b19jcHUoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XSkgIT0gYWdpbm8pOwogCi0JZXJyb3IgPSB4ZnNfaXRvYnAobXAsIHRwLCBpcCwgJmRpcCwgJmlicCwgMCwgMCk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7Ci0KLQkvKgotCSAqIENsZWFyIHRoZSBvbi1kaXNrIGRpX25saW5rLiBUaGlzIGlzIHRvIHByZXZlbnQgeGZzX2J1bGtzdGF0Ci0JICogZnJvbSBwaWNraW5nIHVwIHRoaXMgaW5vZGUgd2hlbiBpdCBpcyByZWNsYWltZWQgKGl0cyBpbmNvcmUgc3RhdGUKLQkgKiBpbml0aWFsemVkIGJ1dCBub3QgZmx1c2hlZCB0byBkaXNrIHlldCkuIFRoZSBpbi1jb3JlIGRpX25saW5rIGlzCi0JICogYWxyZWFkeSBjbGVhcmVkIGluIHhmc19kcm9wbGluaygpIGFuZCBhIGNvcnJlc3BvbmRpbmcgdHJhbnNhY3Rpb24KLQkgKiBsb2dnZWQuIFRoZSBoYWNrIGhlcmUganVzdCBzeW5jaHJvbml6ZXMgdGhlIGluLWNvcmUgdG8gb24tZGlzawotCSAqIGRpX25saW5rIHZhbHVlIGluIGFkdmFuY2UgYmVmb3JlIHRoZSBhY3R1YWwgaW5vZGUgc3luYyB0byBkaXNrLgotCSAqIFRoaXMgaXMgT0sgYmVjYXVzZSB0aGUgaW5vZGUgaXMgYWxyZWFkeSB1bmxpbmtlZCBhbmQgd291bGQgbmV2ZXIKLQkgKiBjaGFuZ2UgaXRzIGRpX25saW5rIGFnYWluIGZvciB0aGlzIGlub2RlIGdlbmVyYXRpb24uCi0JICogVGhpcyBpcyBhIHRlbXBvcmFyeSBoYWNrIHRoYXQgd291bGQgcmVxdWlyZSBhIHByb3BlciBmaXgKLQkgKiBpbiB0aGUgZnV0dXJlLgotCSAqLwotCWRpcC0+ZGlfY29yZS5kaV9ubGluayA9IDA7Ci0KIAlpZiAoYmUzMl90b19jcHUoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XSkgIT0gTlVMTEFHSU5PKSB7CiAJCS8qCiAJCSAqIFRoZXJlIGlzIGFscmVhZHkgYW5vdGhlciBpbm9kZSBpbiB0aGUgYnVja2V0IHdlIG5lZWQKQEAgLTE5ODQsNiArMTk2NywxMCBAQAogCQkgKiBIZXJlIHdlIHB1dCB0aGUgaGVhZCBwb2ludGVyIGludG8gb3VyIG5leHQgcG9pbnRlciwKIAkJICogYW5kIHRoZW4gd2UgZmFsbCB0aHJvdWdoIHRvIHBvaW50IHRoZSBoZWFkIGF0IHVzLgogCQkgKi8KKwkJZXJyb3IgPSB4ZnNfaXRvYnAobXAsIHRwLCBpcCwgJmRpcCwgJmlicCwgMCwgMCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwogCQlBU1NFUlQoYmUzMl90b19jcHUoZGlwLT5kaV9uZXh0X3VubGlua2VkKSA9PSBOVUxMQUdJTk8pOwogCQkvKiBib3RoIG9uLWRpc2ssIGRvbid0IGVuZGlhbiBmbGlwIHR3aWNlICovCiAJCWRpcC0+ZGlfbmV4dF91bmxpbmtlZCA9IGFnaS0+YWdpX3VubGlua2VkW2J1Y2tldF9pbmRleF07CkBAIC0yMjA5LDcgKzIxOTYsNiBAQAogCXhmc19pbm9kZV9sb2dfaXRlbV90CSppaXA7CiAJeGZzX2xvZ19pdGVtX3QJCSpsaXA7CiAJeGZzX3BlcmFnX3QJCSpwYWcgPSB4ZnNfZ2V0X3BlcmFnKG1wLCBpbnVtKTsKLQlTUExERUNMKHMpOwogCiAJaWYgKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSA+PSBYRlNfSU5PREVfQ0xVU1RFUl9TSVpFKG1wKSkgewogCQlibGtzX3Blcl9jbHVzdGVyID0gMTsKQEAgLTIzMTEsOSArMjI5Nyw5IEBACiAJCQkJaWlwID0gKHhmc19pbm9kZV9sb2dfaXRlbV90ICopbGlwOwogCQkJCUFTU0VSVChpaXAtPmlsaV9sb2dnZWQgPT0gMSk7CiAJCQkJbGlwLT5saV9jYiA9ICh2b2lkKCopKHhmc19idWZfdCoseGZzX2xvZ19pdGVtX3QqKSkgeGZzX2lzdGFsZV9kb25lOwotCQkJCUFJTF9MT0NLKG1wLHMpOworCQkJCXNwaW5fbG9jaygmbXAtPm1fYWlsX2xvY2spOwogCQkJCWlpcC0+aWxpX2ZsdXNoX2xzbiA9IGlpcC0+aWxpX2l0ZW0ubGlfbHNuOwotCQkJCUFJTF9VTkxPQ0sobXAsIHMpOworCQkJCXNwaW5fdW5sb2NrKCZtcC0+bV9haWxfbG9jayk7CiAJCQkJeGZzX2lmbGFnc19zZXQoaWlwLT5pbGlfaW5vZGUsIFhGU19JU1RBTEUpOwogCQkJCXByZV9mbHVzaGVkKys7CiAJCQl9CkBAIC0yMzM0LDkgKzIzMjAsOSBAQAogCQkJaWlwLT5pbGlfbGFzdF9maWVsZHMgPSBpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkczsKIAkJCWlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzID0gMDsKIAkJCWlpcC0+aWxpX2xvZ2dlZCA9IDE7Ci0JCQlBSUxfTE9DSyhtcCxzKTsKKwkJCXNwaW5fbG9jaygmbXAtPm1fYWlsX2xvY2spOwogCQkJaWlwLT5pbGlfZmx1c2hfbHNuID0gaWlwLT5pbGlfaXRlbS5saV9sc247Ci0JCQlBSUxfVU5MT0NLKG1wLCBzKTsKKwkJCXNwaW5fdW5sb2NrKCZtcC0+bV9haWxfbG9jayk7CiAKIAkJCXhmc19idWZfYXR0YWNoX2lvZG9uZShicCwKIAkJCQkodm9pZCgqKSh4ZnNfYnVmX3QqLHhmc19sb2dfaXRlbV90KikpCkBAIC0yMzc0LDYgKzIzNjAsOCBAQAogCWludAkJCWVycm9yOwogCWludAkJCWRlbGV0ZTsKIAl4ZnNfaW5vX3QJCWZpcnN0X2lubzsKKwl4ZnNfZGlub2RlX3QgICAgCSpkaXA7CisJeGZzX2J1Zl90ICAgICAgIAkqaWJwOwogCiAJQVNTRVJUKGlzbXJsb2NrZWQoJmlwLT5pX2xvY2ssIE1SX1VQREFURSkpOwogCUFTU0VSVChpcC0+aV90cmFuc3AgPT0gdHApOwpAQCAtMjQwOSw4ICsyMzk3LDI3IEBACiAJICogYnkgcmVpbmNhcm5hdGlvbnMgb2YgdGhpcyBpbm9kZS4KIAkgKi8KIAlpcC0+aV9kLmRpX2dlbisrOworCiAJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIFhGU19JTE9HX0NPUkUpOwogCisJZXJyb3IgPSB4ZnNfaXRvYnAoaXAtPmlfbW91bnQsIHRwLCBpcCwgJmRpcCwgJmlicCwgMCwgMCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKyAgICAgICAgLyoKKwkqIENsZWFyIHRoZSBvbi1kaXNrIGRpX21vZGUuIFRoaXMgaXMgdG8gcHJldmVudCB4ZnNfYnVsa3N0YXQKKwkqIGZyb20gcGlja2luZyB1cCB0aGlzIGlub2RlIHdoZW4gaXQgaXMgcmVjbGFpbWVkIChpdHMgaW5jb3JlIHN0YXRlCisJKiBpbml0aWFsemVkIGJ1dCBub3QgZmx1c2hlZCB0byBkaXNrIHlldCkuIFRoZSBpbi1jb3JlIGRpX21vZGUgaXMKKwkqIGFscmVhZHkgY2xlYXJlZCAgYW5kIGEgY29ycmVzcG9uZGluZyB0cmFuc2FjdGlvbiBsb2dnZWQuCisJKiBUaGUgaGFjayBoZXJlIGp1c3Qgc3luY2hyb25pemVzIHRoZSBpbi1jb3JlIHRvIG9uLWRpc2sKKwkqIGRpX21vZGUgdmFsdWUgaW4gYWR2YW5jZSBiZWZvcmUgdGhlIGFjdHVhbCBpbm9kZSBzeW5jIHRvIGRpc2suCisJKiBUaGlzIGlzIE9LIGJlY2F1c2UgdGhlIGlub2RlIGlzIGFscmVhZHkgdW5saW5rZWQgYW5kIHdvdWxkIG5ldmVyCisJKiBjaGFuZ2UgaXRzIGRpX21vZGUgYWdhaW4gZm9yIHRoaXMgaW5vZGUgZ2VuZXJhdGlvbi4KKwkqIFRoaXMgaXMgYSB0ZW1wb3JhcnkgaGFjayB0aGF0IHdvdWxkIHJlcXVpcmUgYSBwcm9wZXIgZml4CisJKiBpbiB0aGUgZnV0dXJlLgorCSovCisJZGlwLT5kaV9jb3JlLmRpX21vZGUgPSAwOworCiAJaWYgKGRlbGV0ZSkgewogCQl4ZnNfaWZyZWVfY2x1c3RlcihpcCwgdHAsIGZpcnN0X2lubyk7CiAJfQpAQCAtMjczNSw3ICsyNzQyLDYgQEAKIHhmc19pZGVzdHJveSgKIAl4ZnNfaW5vZGVfdAkqaXApCiB7Ci0KIAlzd2l0Y2ggKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgewogCWNhc2UgU19JRlJFRzoKIAljYXNlIFNfSUZESVI6CkBAIC0yNzQ5LDcgKzI3NTUsNyBAQAogCW1yZnJlZSgmaXAtPmlfaW9sb2NrKTsKIAlmcmVlc2VtYSgmaXAtPmlfZmxvY2spOwogCi0jaWZkZWYgWEZTX1ZOT0RFX1RSQUNFCisjaWZkZWYgWEZTX0lOT0RFX1RSQUNFCiAJa3RyYWNlX2ZyZWUoaXAtPmlfdHJhY2UpOwogI2VuZGlmCiAjaWZkZWYgWEZTX0JNQVBfVFJBQ0UKQEAgLTI3NzUsMTYgKzI3ODEsMTUgQEAKIAkJICovCiAJCXhmc19tb3VudF90CSptcCA9IGlwLT5pX21vdW50OwogCQl4ZnNfbG9nX2l0ZW1fdAkqbGlwID0gJmlwLT5pX2l0ZW1wLT5pbGlfaXRlbTsKLQkJaW50CQlzOwogCiAJCUFTU0VSVCgoKGxpcC0+bGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSA9PSAwKSB8fAogCQkJCSAgICAgICBYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSk7CiAJCWlmIChsaXAtPmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkgewotCQkJQUlMX0xPQ0sobXAsIHMpOworCQkJc3Bpbl9sb2NrKCZtcC0+bV9haWxfbG9jayk7CiAJCQlpZiAobGlwLT5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpCi0JCQkJeGZzX3RyYW5zX2RlbGV0ZV9haWwobXAsIGxpcCwgcyk7CisJCQkJeGZzX3RyYW5zX2RlbGV0ZV9haWwobXAsIGxpcCk7CiAJCQllbHNlCi0JCQkJQUlMX1VOTE9DSyhtcCwgcyk7CisJCQkJc3Bpbl91bmxvY2soJm1wLT5tX2FpbF9sb2NrKTsKIAkJfQogCQl4ZnNfaW5vZGVfaXRlbV9kZXN0cm95KGlwKTsKIAl9CkBAIC0yODE2LDQwICsyODIxLDggQEAKIHsKIAlBU1NFUlQoYXRvbWljX3JlYWQoJmlwLT5pX3BpbmNvdW50KSA+IDApOwogCi0JaWYgKGF0b21pY19kZWNfYW5kX2xvY2soJmlwLT5pX3BpbmNvdW50LCAmaXAtPmlfZmxhZ3NfbG9jaykpIHsKLQotCQkvKgotCQkgKiBJZiB0aGUgaW5vZGUgaXMgY3VycmVudGx5IGJlaW5nIHJlY2xhaW1lZCwgdGhlIGxpbmsgYmV0d2VlbgotCQkgKiB0aGUgYmh2X3Zub2RlIGFuZCB0aGUgeGZzX2lub2RlIHdpbGwgYmUgYnJva2VuIGFmdGVyIHRoZQotCQkgKiBYRlNfSVJFQ0xBSU0qIGZsYWcgaXMgc2V0LiBIZW5jZSwgaWYgdGhlc2UgZmxhZ3MgYXJlIG5vdAotCQkgKiBzZXQsIHRoZW4gd2UgY2FuIG1vdmUgZm9yd2FyZCBhbmQgbWFyayB0aGUgbGludXggaW5vZGUgZGlydHkKLQkJICoga25vd2luZyB0aGF0IGl0IGlzIHN0aWxsIHZhbGlkIGFzIGl0IHdvbid0IGZyZWVkIHVudGlsIGFmdGVyCi0JCSAqIHRoZSBiaHZfdm5vZGU8LT54ZnNfaW5vZGUgbGluayBpcyBicm9rZW4gaW4geGZzX3JlY2xhaW0uIFRoZQotCQkgKiBpX2ZsYWdzX2xvY2sgaXMgdXNlZCB0byBzeW5jaHJvbmlzZSB0aGUgc2V0dGluZyBvZiB0aGUKLQkJICogWEZTX0lSRUNMQUlNKiBmbGFncyBhbmQgdGhlIGJyZWFraW5nIG9mIHRoZSBsaW5rLCBhbmQgc28gd2UKLQkJICogY2FuIGV4ZWN1dGUgYXRvbWljYWxseSB3LnIudCB0byByZWNsYWltIGJ5IGhvbGRpbmcgdGhpcyBsb2NrCi0JCSAqIGhlcmUuCi0JCSAqCi0JCSAqIEhvd2V2ZXIsIHdlIHN0aWxsIG5lZWQgdG8gaXNzdWUgdGhlIHVucGluIHdha2V1cCBjYWxsIGFzIHRoZQotCQkgKiBpbm9kZSByZWNsYWltIG1heSBiZSBibG9ja2VkIHdhaXRpbmcgZm9yIHRoZSBpbm9kZSB0byBiZWNvbWUKLQkJICogdW5waW5uZWQuCi0JCSAqLwotCi0JCWlmICghX194ZnNfaWZsYWdzX3Rlc3QoaXAsIFhGU19JUkVDTEFJTXxYRlNfSVJFQ0xBSU1BQkxFKSkgewotCQkJYmh2X3Zub2RlX3QJKnZwID0gWEZTX0lUT1ZfTlVMTChpcCk7Ci0JCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKLQotCQkJQlVHX09OKHZwID09IE5VTEwpOwotCQkJaW5vZGUgPSB2bl90b19pbm9kZSh2cCk7Ci0JCQlCVUdfT04oaW5vZGUtPmlfc3RhdGUgJiBJX0NMRUFSKTsKLQotCQkJLyogbWFrZSBzeW5jIGNvbWUgYmFjayBhbmQgZmx1c2ggdGhpcyBpbm9kZSAqLwotCQkJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiAoSV9ORVd8SV9GUkVFSU5HKSkpCi0JCQkJbWFya19pbm9kZV9kaXJ0eV9zeW5jKGlub2RlKTsKLQkJfQotCQlzcGluX3VubG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmlwLT5pX3BpbmNvdW50KSkKIAkJd2FrZV91cCgmaXAtPmlfaXBpbl93YWl0KTsKLQl9CiB9CiAKIC8qCkBAIC0zMzM4LDcgKzMzMTEsNiBAQAogI2lmZGVmIFhGU19UUkFOU19ERUJVRwogCWludAkJCWZpcnN0OwogI2VuZGlmCi0JU1BMREVDTChzKTsKIAogCUFTU0VSVChpc21ybG9ja2VkKCZpcC0+aV9sb2NrLCBNUl9VUERBVEV8TVJfQUNDRVNTKSk7CiAJQVNTRVJUKGlzc2VtYWxvY2tlZCgmKGlwLT5pX2Zsb2NrKSkpOwpAQCAtMzUzMyw5ICszNTA1LDkgQEAKIAkJaWlwLT5pbGlfbG9nZ2VkID0gMTsKIAogCQlBU1NFUlQoc2l6ZW9mKHhmc19sc25fdCkgPT0gOCk7CS8qIGRvbid0IGxvY2sgaWYgaXQgc2hyaW5rcyAqLwotCQlBSUxfTE9DSyhtcCxzKTsKKwkJc3Bpbl9sb2NrKCZtcC0+bV9haWxfbG9jayk7CiAJCWlpcC0+aWxpX2ZsdXNoX2xzbiA9IGlpcC0+aWxpX2l0ZW0ubGlfbHNuOwotCQlBSUxfVU5MT0NLKG1wLCBzKTsKKwkJc3Bpbl91bmxvY2soJm1wLT5tX2FpbF9sb2NrKTsKIAogCQkvKgogCQkgKiBBdHRhY2ggdGhlIGZ1bmN0aW9uIHhmc19pZmx1c2hfZG9uZSB0byB0aGUgaW5vZGUncwpAQCAtMzYxMSw5NSArMzU4Myw2IEBACiAJWEZTX01PVU5UX0lVTkxPQ0sobXApOwogfQogCi0vKgotICogeGZzX2lhY2Nlc3M6IGNoZWNrIGFjY2Vzc2liaWxpdHkgb2YgaW5vZGUgZm9yIG1vZGUuCi0gKi8KLWludAoteGZzX2lhY2Nlc3MoCi0JeGZzX2lub2RlX3QJKmlwLAotCW1vZGVfdAkJbW9kZSwKLQljcmVkX3QJCSpjcikKLXsKLQlpbnQJCWVycm9yOwotCW1vZGVfdAkJb3JnbW9kZSA9IG1vZGU7Ci0Jc3RydWN0IGlub2RlCSppbm9kZSA9IHZuX3RvX2lub2RlKFhGU19JVE9WKGlwKSk7Ci0KLQlpZiAobW9kZSAmIFNfSVdVU1IpIHsKLQkJdW1vZGVfdAkJaW1vZGUgPSBpbm9kZS0+aV9tb2RlOwotCi0JCWlmIChJU19SRE9OTFkoaW5vZGUpICYmCi0JCSAgICAoU19JU1JFRyhpbW9kZSkgfHwgU19JU0RJUihpbW9kZSkgfHwgU19JU0xOSyhpbW9kZSkpKQotCQkJcmV0dXJuIFhGU19FUlJPUihFUk9GUyk7Ci0KLQkJaWYgKElTX0lNTVVUQUJMRShpbm9kZSkpCi0JCQlyZXR1cm4gWEZTX0VSUk9SKEVBQ0NFUyk7Ci0JfQotCi0JLyoKLQkgKiBJZiB0aGVyZSdzIGFuIEFjY2VzcyBDb250cm9sIExpc3QgaXQncyB1c2VkIGluc3RlYWQgb2YKLQkgKiB0aGUgbW9kZSBiaXRzLgotCSAqLwotCWlmICgoZXJyb3IgPSBfQUNMX1hGU19JQUNDRVNTKGlwLCBtb2RlLCBjcikpICE9IC0xKQotCQlyZXR1cm4gZXJyb3IgPyBYRlNfRVJST1IoZXJyb3IpIDogMDsKLQotCWlmIChjdXJyZW50X2ZzdWlkKGNyKSAhPSBpcC0+aV9kLmRpX3VpZCkgewotCQltb2RlID4+PSAzOwotCQlpZiAoIWluX2dyb3VwX3AoKGdpZF90KWlwLT5pX2QuZGlfZ2lkKSkKLQkJCW1vZGUgPj49IDM7Ci0JfQotCi0JLyoKLQkgKiBJZiB0aGUgREFDcyBhcmUgb2sgd2UgZG9uJ3QgbmVlZCBhbnkgY2FwYWJpbGl0eSBjaGVjay4KLQkgKi8KLQlpZiAoKGlwLT5pX2QuZGlfbW9kZSAmIG1vZGUpID09IG1vZGUpCi0JCXJldHVybiAwOwotCS8qCi0JICogUmVhZC93cml0ZSBEQUNzIGFyZSBhbHdheXMgb3ZlcnJpZGFibGUuCi0JICogRXhlY3V0YWJsZSBEQUNzIGFyZSBvdmVycmlkYWJsZSBpZiBhdCBsZWFzdCBvbmUgZXhlYyBiaXQgaXMgc2V0LgotCSAqLwotCWlmICghKG9yZ21vZGUgJiBTX0lYVVNSKSB8fAotCSAgICAoaW5vZGUtPmlfbW9kZSAmIFNfSVhVR08pIHx8IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCi0JCWlmIChjYXBhYmxlX2NyZWQoY3IsIENBUF9EQUNfT1ZFUlJJREUpKQotCQkJcmV0dXJuIDA7Ci0KLQlpZiAoKG9yZ21vZGUgPT0gU19JUlVTUikgfHwKLQkgICAgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgKCEob3JnbW9kZSAmIFNfSVdVU1IpKSkpIHsKLQkJaWYgKGNhcGFibGVfY3JlZChjciwgQ0FQX0RBQ19SRUFEX1NFQVJDSCkpCi0JCQlyZXR1cm4gMDsKLSNpZmRlZglOT0lTRQotCQljbW5fZXJyKENFX05PVEUsICJJY2s6IG1vZGU9JW8sIG9yZ21vZGU9JW8iLCBtb2RlLCBvcmdtb2RlKTsKLSNlbmRpZgkvKiBOT0lTRSAqLwotCQlyZXR1cm4gWEZTX0VSUk9SKEVBQ0NFUyk7Ci0JfQotCXJldHVybiBYRlNfRVJST1IoRUFDQ0VTKTsKLX0KLQotLyoKLSAqIHhmc19pcm91bmR1cDogcm91bmQgdXAgYXJndW1lbnQgdG8gbmV4dCBwb3dlciBvZiB0d28KLSAqLwotdWludAoteGZzX2lyb3VuZHVwKAotCXVpbnQJdikKLXsKLQlpbnQgaTsKLQl1aW50IG07Ci0KLQlpZiAoKHYgJiAodiAtIDEpKSA9PSAwKQotCQlyZXR1cm4gdjsKLQlBU1NFUlQoKHYgJiAweDgwMDAwMDAwKSA9PSAwKTsKLQlpZiAoKHYgJiAodiArIDEpKSA9PSAwKQotCQlyZXR1cm4gdiArIDE7Ci0JZm9yIChpID0gMCwgbSA9IDE7IGkgPCAzMTsgaSsrLCBtIDw8PSAxKSB7Ci0JCWlmICh2ICYgbSkKLQkJCWNvbnRpbnVlOwotCQl2IHw9IG07Ci0JCWlmICgodiAmICh2ICsgMSkpID09IDApCi0JCQlyZXR1cm4gdiArIDE7Ci0JfQotCUFTU0VSVCgwKTsKLQlyZXR1cm4oIDAgKTsKLX0KLQogI2lmZGVmIFhGU19JTE9DS19UUkFDRQoga3RyYWNlX3QJKnhmc19pbG9ja190cmFjZV9idWY7CiAKQEAgLTQyMDYsNyArNDA4OSw3IEBACiAJCQlyZXR1cm47CiAJCX0KIAkJaWYgKCFpc19wb3dlcl9vZl8yKG5ld19zaXplKSl7Ci0JCQlybmV3X3NpemUgPSB4ZnNfaXJvdW5kdXAobmV3X3NpemUpOworCQkJcm5ld19zaXplID0gcm91bmR1cF9wb3dfb2ZfdHdvKG5ld19zaXplKTsKIAkJfQogCQlpZiAocm5ld19zaXplICE9IGlmcC0+aWZfcmVhbF9ieXRlcykgewogCQkJaWZwLT5pZl91MS5pZl9leHRlbnRzID0KQEAgLTQyMjksNyArNDExMiw3IEBACiAJZWxzZSB7CiAJCW5ld19zaXplICs9IGlmcC0+aWZfYnl0ZXM7CiAJCWlmICghaXNfcG93ZXJfb2ZfMihuZXdfc2l6ZSkpIHsKLQkJCXJuZXdfc2l6ZSA9IHhmc19pcm91bmR1cChuZXdfc2l6ZSk7CisJCQlybmV3X3NpemUgPSByb3VuZHVwX3Bvd19vZl90d28obmV3X3NpemUpOwogCQl9CiAJCXhmc19pZXh0X2lubGluZV90b19kaXJlY3QoaWZwLCBybmV3X3NpemUpOwogCX0KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW5vZGUuaCBiL2ZzL3hmcy94ZnNfaW5vZGUuaAppbmRleCBlNWFmZjkyLi5iZmNkNzJjIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lub2RlLmgKKysrIGIvZnMveGZzL3hmc19pbm9kZS5oCkBAIC0xMzIsNDUgKzEzMiw2IEBACiAJX191aW50MTZfdAlkYV9wYWQ7CQkvKiBETUlHIGV4dHJhIHBhZGRpbmcgKi8KIH0gZG1fYXR0cnNfdDsKIAotdHlwZWRlZiBzdHJ1Y3QgeGZzX2lvY29yZSB7Ci0Jdm9pZAkJCSppb19vYmo7CS8qIHBvaW50ZXIgdG8gY29udGFpbmVyCi0JCQkJCQkgKiBpbm9kZSBvciBkY3h2biBzdHJ1Y3R1cmUgKi8KLQlzdHJ1Y3QgeGZzX21vdW50CSppb19tb3VudDsJLyogZnMgbW91bnQgc3RydWN0IHB0ciAqLwotI2lmZGVmIERFQlVHCi0JbXJsb2NrX3QJCSppb19sb2NrOwkvKiBpbm9kZSBJTyBsb2NrICovCi0JbXJsb2NrX3QJCSppb19pb2xvY2s7CS8qIGlub2RlIElPIGxvY2sgKi8KLSNlbmRpZgotCi0JLyogSS9PIHN0YXRlICovCi0JeGZzX2ZzaXplX3QJCWlvX25ld19zaXplOwkvKiBzeiB3aGVuIHdyaXRlIGNvbXBsZXRlcyAqLwotCi0JLyogTWlzY2VsbGFuZW91cyBzdGF0ZS4gKi8KLQl1bnNpZ25lZCBpbnQJCWlvX2ZsYWdzOwkvKiBJTyByZWxhdGVkIGZsYWdzICovCi0KLQkvKiBETUFQSSBzdGF0ZSAqLwotCWRtX2F0dHJzX3QJCWlvX2RtYXR0cnM7Ci0KLX0geGZzX2lvY29yZV90OwotCi0jZGVmaW5lICAgICAgICBpb19kbWV2bWFzayAgICAgaW9fZG1hdHRycy5kYV9kbWV2bWFzawotI2RlZmluZSAgICAgICAgaW9fZG1zdGF0ZSAgICAgIGlvX2RtYXR0cnMuZGFfZG1zdGF0ZQotCi0jZGVmaW5lIFhGU19JT19JTk9ERShpbykJKCh4ZnNfaW5vZGVfdCAqKSAoKGlvKS0+aW9fb2JqKSkKLSNkZWZpbmUgWEZTX0lPX0RDWFZOKGlvKQkoKGRjeHZuX3QgKikgKChpbyktPmlvX29iaikpCi0KLS8qCi0gKiBGbGFncyBpbiB0aGUgZmxhZ3MgZmllbGQKLSAqLwotCi0jZGVmaW5lIFhGU19JT0NPUkVfUlQJCTB4MQotCi0vKgotICogeGZzX2lvY29yZSBwcm90b3R5cGVzCi0gKi8KLQotZXh0ZXJuIHZvaWQgeGZzX2lvY29yZV9pbm9kZV9pbml0KHN0cnVjdCB4ZnNfaW5vZGUgKik7Ci1leHRlcm4gdm9pZCB4ZnNfaW9jb3JlX2lub2RlX3JlaW5pdChzdHJ1Y3QgeGZzX2lub2RlICopOwotCiAvKgogICogVGhpcyBpcyB0aGUgeGZzIGlub2RlIGNsdXN0ZXIgc3RydWN0dXJlLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieQogICogeGZzX2lmbHVzaCB0byBmaW5kIGlub2RlcyB0aGF0IHNoYXJlIGEgY2x1c3RlciBhbmQgY2FuIGJlIGZsdXNoZWQgdG8gZGlzayBhdApAQCAtMTgxLDcgKzE0Miw3IEBACiAJeGZzX2RhZGRyX3QJCWljbF9ibGtubzsJLyogc3RhcnRpbmcgYmxvY2sgbnVtYmVyIG9mCiAJCQkJCQkgKiB0aGUgY2x1c3RlciAqLwogCXN0cnVjdCB4ZnNfYnVmCQkqaWNsX2J1ZjsJLyogdGhlIGlub2RlIGJ1ZmZlciAqLwotCWxvY2tfdAkJCWljbF9sb2NrOwkvKiBpbm9kZSBsaXN0IGxvY2sgKi8KKwlzcGlubG9ja190CQlpY2xfbG9jazsJLyogaW5vZGUgbGlzdCBsb2NrICovCiB9IHhmc19pY2x1c3Rlcl90OwogCiAvKgpAQCAtMjgzLDkgKzI0NCw2IEBACiAJc3RydWN0IHhmc19pbm9kZQkqKmlfcmVmY2FjaGU7CS8qIHB0ciB0byBlbnRyeSBpbiByZWYgY2FjaGUgKi8KIAlzdHJ1Y3QgeGZzX2lub2RlCSppX3JlbGVhc2U7CS8qIGlub2RlIHRvIHVucmVmICovCiAjZW5kaWYKLQkvKiBJL08gc3RhdGUgKi8KLQl4ZnNfaW9jb3JlX3QJCWlfaW9jb3JlOwkvKiBJL08gY29yZSAqLwotCiAJLyogTWlzY2VsbGFuZW91cyBzdGF0ZS4gKi8KIAl1bnNpZ25lZCBzaG9ydAkJaV9mbGFnczsJLyogc2VlIGRlZmluZWQgZmxhZ3MgYmVsb3cgKi8KIAl1bnNpZ25lZCBjaGFyCQlpX3VwZGF0ZV9jb3JlOwkvKiB0aW1lc3RhbXBzL3NpemUgaXMgZGlydHkgKi8KQEAgLTI5OCw5ICsyNTYsMTAgQEAKIAlzdHJ1Y3QgaGxpc3Rfbm9kZQlpX2Nub2RlOwkvKiBjbHVzdGVyIGxpbmsgbm9kZSAqLwogCiAJeGZzX2ZzaXplX3QJCWlfc2l6ZTsJCS8qIGluLW1lbW9yeSBzaXplICovCisJeGZzX2ZzaXplX3QJCWlfbmV3X3NpemU7CS8qIHNpemUgd2hlbiB3cml0ZSBjb21wbGV0ZXMgKi8KIAlhdG9taWNfdAkJaV9pb2NvdW50OwkvKiBvdXRzdGFuZGluZyBJL08gY291bnQgKi8KIAkvKiBUcmFjZSBidWZmZXJzIHBlciBpbm9kZS4gKi8KLSNpZmRlZiBYRlNfVk5PREVfVFJBQ0UKKyNpZmRlZiBYRlNfSU5PREVfVFJBQ0UKIAlzdHJ1Y3Qga3RyYWNlCQkqaV90cmFjZTsJLyogZ2VuZXJhbCBpbm9kZSB0cmFjZSAqLwogI2VuZGlmCiAjaWZkZWYgWEZTX0JNQVBfVFJBQ0UKQEAgLTM4MiwxNyArMzQxLDQyIEBACiAvKgogICogRm9yayBoYW5kbGluZy4KICAqLwotI2RlZmluZQlYRlNfSUZPUktfUFRSKGlwLHcpCQlcCi0JKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gJihpcCktPmlfZGYgOiAoaXApLT5pX2FmcCkKLSNkZWZpbmUJWEZTX0lGT1JLX1EoaXApCQkJWEZTX0NGT1JLX1EoJihpcCktPmlfZCkKLSNkZWZpbmUJWEZTX0lGT1JLX0RTSVpFKGlwKQkJWEZTX0NGT1JLX0RTSVpFKCZpcC0+aV9kLCBpcC0+aV9tb3VudCkKLSNkZWZpbmUJWEZTX0lGT1JLX0FTSVpFKGlwKQkJWEZTX0NGT1JLX0FTSVpFKCZpcC0+aV9kLCBpcC0+aV9tb3VudCkKLSNkZWZpbmUJWEZTX0lGT1JLX1NJWkUoaXAsdykJCVhGU19DRk9SS19TSVpFKCZpcC0+aV9kLCBpcC0+aV9tb3VudCwgdykKLSNkZWZpbmUJWEZTX0lGT1JLX0ZPUk1BVChpcCx3KQkJWEZTX0NGT1JLX0ZPUk1BVCgmaXAtPmlfZCwgdykKLSNkZWZpbmUJWEZTX0lGT1JLX0ZNVF9TRVQoaXAsdyxuKQlYRlNfQ0ZPUktfRk1UX1NFVCgmaXAtPmlfZCwgdywgbikKLSNkZWZpbmUJWEZTX0lGT1JLX05FWFRFTlRTKGlwLHcpCVhGU19DRk9SS19ORVhURU5UUygmaXAtPmlfZCwgdykKLSNkZWZpbmUJWEZTX0lGT1JLX05FWFRfU0VUKGlwLHcsbikJWEZTX0NGT1JLX05FWFRfU0VUKCZpcC0+aV9kLCB3LCBuKQogCisjZGVmaW5lIFhGU19JRk9SS19RKGlwKQkJCSgoaXApLT5pX2QuZGlfZm9ya29mZiAhPSAwKQorI2RlZmluZSBYRlNfSUZPUktfQk9GRihpcCkJCSgoaW50KSgoaXApLT5pX2QuZGlfZm9ya29mZiA8PCAzKSkKKworI2RlZmluZSBYRlNfSUZPUktfUFRSKGlwLHcpCQlcCisJKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gXAorCQkmKGlwKS0+aV9kZiA6IFwKKwkJKGlwKS0+aV9hZnApCisjZGVmaW5lIFhGU19JRk9SS19EU0laRShpcCkgXAorCShYRlNfSUZPUktfUShpcCkgPyBcCisJCVhGU19JRk9SS19CT0ZGKGlwKSA6IFwKKwkJWEZTX0xJVElOTygoaXApLT5pX21vdW50KSkKKyNkZWZpbmUgWEZTX0lGT1JLX0FTSVpFKGlwKSBcCisJKFhGU19JRk9SS19RKGlwKSA/IFwKKwkJWEZTX0xJVElOTygoaXApLT5pX21vdW50KSAtIFhGU19JRk9SS19CT0ZGKGlwKSA6IFwKKwkJMCkKKyNkZWZpbmUgWEZTX0lGT1JLX1NJWkUoaXAsdykgXAorCSgodykgPT0gWEZTX0RBVEFfRk9SSyA/IFwKKwkJWEZTX0lGT1JLX0RTSVpFKGlwKSA6IFwKKwkJWEZTX0lGT1JLX0FTSVpFKGlwKSkKKyNkZWZpbmUgWEZTX0lGT1JLX0ZPUk1BVChpcCx3KSBcCisJKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gXAorCQkoaXApLT5pX2QuZGlfZm9ybWF0IDogXAorCQkoaXApLT5pX2QuZGlfYWZvcm1hdCkKKyNkZWZpbmUgWEZTX0lGT1JLX0ZNVF9TRVQoaXAsdyxuKSBcCisJKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gXAorCQkoKGlwKS0+aV9kLmRpX2Zvcm1hdCA9IChuKSkgOiBcCisJCSgoaXApLT5pX2QuZGlfYWZvcm1hdCA9IChuKSkpCisjZGVmaW5lIFhGU19JRk9SS19ORVhURU5UUyhpcCx3KSBcCisJKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gXAorCQkoaXApLT5pX2QuZGlfbmV4dGVudHMgOiBcCisJCShpcCktPmlfZC5kaV9hbmV4dGVudHMpCisjZGVmaW5lIFhGU19JRk9SS19ORVhUX1NFVChpcCx3LG4pIFwKKwkoKHcpID09IFhGU19EQVRBX0ZPUksgPyBcCisJCSgoaXApLT5pX2QuZGlfbmV4dGVudHMgPSAobikpIDogXAorCQkoKGlwKS0+aV9kLmRpX2FuZXh0ZW50cyA9IChuKSkpCiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKQEAgLTUwOSw3ICs0OTMsNiBAQAogdm9pZAkJeGZzX2loYXNoX2ZyZWUoc3RydWN0IHhmc19tb3VudCAqKTsKIHhmc19pbm9kZV90CSp4ZnNfaW5vZGVfaW5jb3JlKHN0cnVjdCB4ZnNfbW91bnQgKiwgeGZzX2lub190LAogCQkJCSAgc3RydWN0IHhmc190cmFucyAqKTsKLXZvaWQgICAgICAgICAgICB4ZnNfaW5vZGVfbG9ja19pbml0KHhmc19pbm9kZV90ICosIGJodl92bm9kZV90ICopOwogaW50CQl4ZnNfaWdldChzdHJ1Y3QgeGZzX21vdW50ICosIHN0cnVjdCB4ZnNfdHJhbnMgKiwgeGZzX2lub190LAogCQkJIHVpbnQsIHVpbnQsIHhmc19pbm9kZV90ICoqLCB4ZnNfZGFkZHJfdCk7CiB2b2lkCQl4ZnNfaXB1dCh4ZnNfaW5vZGVfdCAqLCB1aW50KTsKQEAgLTU0NSw3ICs1MjgsNyBAQAogCQkJCSAgIHN0cnVjdCB4ZnNfaWNkaW5vZGUgKik7CiAKIHVpbnQJCXhmc19pcDJ4ZmxhZ3Moc3RydWN0IHhmc19pbm9kZSAqKTsKLXVpbnQJCXhmc19kaWMyeGZsYWdzKHN0cnVjdCB4ZnNfZGlub2RlX2NvcmUgKik7Cit1aW50CQl4ZnNfZGljMnhmbGFncyhzdHJ1Y3QgeGZzX2Rpbm9kZSAqKTsKIGludAkJeGZzX2lmcmVlKHN0cnVjdCB4ZnNfdHJhbnMgKiwgeGZzX2lub2RlX3QgKiwKIAkJCSAgIHN0cnVjdCB4ZnNfYm1hcF9mcmVlICopOwogaW50CQl4ZnNfaXRydW5jYXRlX3N0YXJ0KHhmc19pbm9kZV90ICosIHVpbnQsIHhmc19mc2l6ZV90KTsKQEAgLTU2NywxMyArNTUwLDEyIEBACiBpbnQJCXhmc19pZXh0ZW50c19jb3B5KHhmc19pbm9kZV90ICosIHhmc19ibWJ0X3JlY190ICosIGludCk7CiBpbnQJCXhmc19pZmx1c2goeGZzX2lub2RlX3QgKiwgdWludCk7CiB2b2lkCQl4ZnNfaWZsdXNoX2FsbChzdHJ1Y3QgeGZzX21vdW50ICopOwotaW50CQl4ZnNfaWFjY2Vzcyh4ZnNfaW5vZGVfdCAqLCBtb2RlX3QsIGNyZWRfdCAqKTsKLXVpbnQJCXhmc19pcm91bmR1cCh1aW50KTsKIHZvaWQJCXhmc19pY2hndGltZSh4ZnNfaW5vZGVfdCAqLCBpbnQpOwogeGZzX2ZzaXplX3QJeGZzX2ZpbGVfbGFzdF9ieXRlKHhmc19pbm9kZV90ICopOwogdm9pZAkJeGZzX2xvY2tfaW5vZGVzKHhmc19pbm9kZV90ICoqLCBpbnQsIGludCwgdWludCk7CiAKIHZvaWQJCXhmc19zeW5jaHJvbml6ZV9hdGltZSh4ZnNfaW5vZGVfdCAqKTsKK3ZvaWQJCXhmc19tYXJrX2lub2RlX2RpcnR5X3N5bmMoeGZzX2lub2RlX3QgKik7CiAKIHhmc19ibWJ0X3JlY19ob3N0X3QgKnhmc19pZXh0X2dldF9leHQoeGZzX2lmb3JrX3QgKiwgeGZzX2V4dG51bV90KTsKIHZvaWQJCXhmc19pZXh0X2luc2VydCh4ZnNfaWZvcmtfdCAqLCB4ZnNfZXh0bnVtX3QsIHhmc19leHRudW1fdCwKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5jIGIvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKaW5kZXggNTY1ZDQ3MC4uMDM0Y2E3MiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKKysrIGIvZnMveGZzL3hmc19pbm9kZV9pdGVtLmMKQEAgLTI3NCw2ICsyNzQsMTEgQEAKIAkgKi8KIAl4ZnNfc3luY2hyb25pemVfYXRpbWUoaXApOwogCisJLyoKKwkgKiBtYWtlIHN1cmUgdGhlIGxpbnV4IGlub2RlIGlzIGRpcnR5CisJICovCisJeGZzX21hcmtfaW5vZGVfZGlydHlfc3luYyhpcCk7CisKIAl2ZWNwLT5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpJmlwLT5pX2Q7CiAJdmVjcC0+aV9sZW4gID0gc2l6ZW9mKHhmc19kaW5vZGVfY29yZV90KTsKIAlYTE9HX1ZFQ19TRVRfVFlQRSh2ZWNwLCBYTE9HX1JFR19UWVBFX0lDT1JFKTsKQEAgLTYxNSw3ICs2MjAsNyBAQAogCQkJcmV0dXJuIFhGU19JVEVNX1BVU0hCVUY7CiAJCX0gZWxzZSB7CiAJCQkvKgotCQkJICogV2UgaG9sZCB0aGUgQUlMX0xPQ0ssIHNvIHdlIG11c3Qgc3BlY2lmeSB0aGUKKwkJCSAqIFdlIGhvbGQgdGhlIEFJTCBsb2NrLCBzbyB3ZSBtdXN0IHNwZWNpZnkgdGhlCiAJCQkgKiBOT05PVElGWSBmbGFnIHNvIHRoYXQgd2Ugd29uJ3QgZG91YmxlIHRyaXAuCiAJCQkgKi8KIAkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEfFhGU19JVU5MT0NLX05PTk9USUZZKTsKQEAgLTc0OSw3ICs3NTQsNyBAQAogICogbWFya2VkIGRlbGF5ZWQgd3JpdGUuIElmIHRoYXQncyB0aGUgY2FzZSwgd2UnbGwgaW5pdGlhdGUgYSBiYXdyaXRlIG9uIHRoYXQKICAqIGJ1ZmZlciB0byBleHBlZGl0ZSB0aGUgcHJvY2Vzcy4KICAqCi0gKiBXZSBhcmVuJ3QgaG9sZGluZyB0aGUgQUlMX0xPQ0sgKG9yIHRoZSBmbHVzaCBsb2NrKSB3aGVuIHRoaXMgZ2V0cyBjYWxsZWQsCisgKiBXZSBhcmVuJ3QgaG9sZGluZyB0aGUgQUlMIGxvY2sgKG9yIHRoZSBmbHVzaCBsb2NrKSB3aGVuIHRoaXMgZ2V0cyBjYWxsZWQsCiAgKiBzbyBpdCBpcyBpbmhlcmVudGx5IHJhY2UteS4KICAqLwogU1RBVElDIHZvaWQKQEAgLTc5Miw3ICs3OTcsNyBAQAogCQlpZiAoWEZTX0JVRl9JU0RFTEFZV1JJVEUoYnApKSB7CiAJCQkvKgogCQkJICogV2Ugd2VyZSByYWNpbmcgd2l0aCBpZmx1c2ggYmVjYXVzZSB3ZSBkb24ndCBob2xkCi0JCQkgKiB0aGUgQUlMX0xPQ0sgb3IgdGhlIGZsdXNoIGxvY2suIEhvd2V2ZXIsIGF0IHRoaXMgcG9pbnQsCisJCQkgKiB0aGUgQUlMIGxvY2sgb3IgdGhlIGZsdXNoIGxvY2suIEhvd2V2ZXIsIGF0IHRoaXMgcG9pbnQsCiAJCQkgKiB3ZSBoYXZlIHRoZSBidWZmZXIsIGFuZCB3ZSBrbm93IHRoYXQgaXQncyBkaXJ0eS4KIAkJCSAqIFNvLCBpdCdzIHBvc3NpYmxlIHRoYXQgaWZsdXNoIHJhY2VkIHdpdGggdXMsIGFuZAogCQkJICogdGhpcyBpdGVtIGlzIGFscmVhZHkgdGFrZW4gb2ZmIHRoZSBBSUwuCkBAIC05NjgsNyArOTczLDYgQEAKIAl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwKQogewogCXhmc19pbm9kZV90CSppcDsKLQlTUExERUNMKHMpOwogCiAJaXAgPSBpaXAtPmlsaV9pbm9kZTsKIApAQCAtOTgzLDE1ICs5ODcsMTUgQEAKIAkgKi8KIAlpZiAoaWlwLT5pbGlfbG9nZ2VkICYmCiAJICAgIChpaXAtPmlsaV9pdGVtLmxpX2xzbiA9PSBpaXAtPmlsaV9mbHVzaF9sc24pKSB7Ci0JCUFJTF9MT0NLKGlwLT5pX21vdW50LCBzKTsKKwkJc3Bpbl9sb2NrKCZpcC0+aV9tb3VudC0+bV9haWxfbG9jayk7CiAJCWlmIChpaXAtPmlsaV9pdGVtLmxpX2xzbiA9PSBpaXAtPmlsaV9mbHVzaF9sc24pIHsKIAkJCS8qCiAJCQkgKiB4ZnNfdHJhbnNfZGVsZXRlX2FpbCgpIGRyb3BzIHRoZSBBSUwgbG9jay4KIAkJCSAqLwogCQkJeGZzX3RyYW5zX2RlbGV0ZV9haWwoaXAtPmlfbW91bnQsCi0JCQkJCSAgICAgKHhmc19sb2dfaXRlbV90KilpaXAsIHMpOworCQkJCQkgICAgICh4ZnNfbG9nX2l0ZW1fdCopaWlwKTsKIAkJfSBlbHNlIHsKLQkJCUFJTF9VTkxPQ0soaXAtPmlfbW91bnQsIHMpOworCQkJc3Bpbl91bmxvY2soJmlwLT5pX21vdW50LT5tX2FpbF9sb2NrKTsKIAkJfQogCX0KIApAQCAtMTAyNSwyMSArMTAyOSwxOSBAQAogewogCXhmc19pbm9kZV9sb2dfaXRlbV90CSppaXA7CiAJeGZzX21vdW50X3QJCSptcDsKLQlTUExERUNMKHMpOwogCiAJaWlwID0gaXAtPmlfaXRlbXA7CiAJbXAgPSBpcC0+aV9tb3VudDsKIAlpZiAoaWlwKSB7CiAJCWlmIChpaXAtPmlsaV9pdGVtLmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkgewotCQkJQUlMX0xPQ0sobXAsIHMpOworCQkJc3Bpbl9sb2NrKCZtcC0+bV9haWxfbG9jayk7CiAJCQlpZiAoaWlwLT5pbGlfaXRlbS5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpIHsKIAkJCQkvKgogCQkJCSAqIHhmc190cmFuc19kZWxldGVfYWlsKCkgZHJvcHMgdGhlIEFJTCBsb2NrLgogCQkJCSAqLwotCQkJCXhmc190cmFuc19kZWxldGVfYWlsKG1wLCAoeGZzX2xvZ19pdGVtX3QgKilpaXAsCi0JCQkJCXMpOworCQkJCXhmc190cmFuc19kZWxldGVfYWlsKG1wLCAoeGZzX2xvZ19pdGVtX3QgKilpaXApOwogCQkJfSBlbHNlCi0JCQkJQUlMX1VOTE9DSyhtcCwgcyk7CisJCQkJc3Bpbl91bmxvY2soJm1wLT5tX2FpbF9sb2NrKTsKIAkJfQogCQlpaXAtPmlsaV9sb2dnZWQgPSAwOwogCQkvKgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pb2NvcmUuYyBiL2ZzL3hmcy94ZnNfaW9jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyN2I1ZDUuLjAwMDAwMDAKLS0tIGEvZnMveGZzL3hmc19pb2NvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMsMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQotICovCi0jaW5jbHVkZSAieGZzLmgiCi0jaW5jbHVkZSAieGZzX2ZzLmgiCi0jaW5jbHVkZSAieGZzX3R5cGVzLmgiCi0jaW5jbHVkZSAieGZzX2JpdC5oIgotI2luY2x1ZGUgInhmc19sb2cuaCIKLSNpbmNsdWRlICJ4ZnNfaW51bS5oIgotI2luY2x1ZGUgInhmc190cmFucy5oIgotI2luY2x1ZGUgInhmc19zYi5oIgotI2luY2x1ZGUgInhmc19hZy5oIgotI2luY2x1ZGUgInhmc19kaXIyLmgiCi0jaW5jbHVkZSAieGZzX2RmcmFnLmgiCi0jaW5jbHVkZSAieGZzX2RtYXBpLmgiCi0jaW5jbHVkZSAieGZzX21vdW50LmgiCi0jaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCi0jaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKLSNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgotI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKLSNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgotI2luY2x1ZGUgInhmc19pdGFibGUuaCIKLSNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKLSNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKLSNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCi0jaW5jbHVkZSAieGZzX2JtYXAuaCIKLSNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKLSNpbmNsdWRlICJ4ZnNfcncuaCIKLSNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKLSNpbmNsdWRlICJ4ZnNfdHJhbnNfc3BhY2UuaCIKLSNpbmNsdWRlICJ4ZnNfaW9tYXAuaCIKLQotCi1TVEFUSUMgeGZzX2ZzaXplX3QKLXhmc19zaXplX2ZuKAotCXhmc19pbm9kZV90CQkqaXApCi17Ci0JcmV0dXJuIFhGU19JU0laRShpcCk7Ci19Ci0KLVNUQVRJQyBpbnQKLXhmc19pb2luaXQoCi0Jc3RydWN0IHhmc19tb3VudAkqbXAsCi0Jc3RydWN0IHhmc19tb3VudF9hcmdzCSptbnRhcmdzLAotCWludAkJCWZsYWdzKQotewotCXJldHVybiB4ZnNfbW91bnRmcyhtcCwgZmxhZ3MpOwotfQotCi14ZnNfaW9vcHNfdAl4ZnNfaW9jb3JlX3hmcyA9IHsKLQkueGZzX2lvaW5pdAkJPSAoeGZzX2lvaW5pdF90KSB4ZnNfaW9pbml0LAotCS54ZnNfYm1hcGlfZnVuYwkJPSAoeGZzX2JtYXBpX3QpIHhmc19ibWFwaSwKLQkueGZzX2J1bm1hcGlfZnVuYwk9ICh4ZnNfYnVubWFwaV90KSB4ZnNfYnVubWFwaSwKLQkueGZzX2JtYXBfZW9mX2Z1bmMJPSAoeGZzX2JtYXBfZW9mX3QpIHhmc19ibWFwX2VvZiwKLQkueGZzX2lvbWFwX3dyaXRlX2RpcmVjdCA9Ci0JCQkoeGZzX2lvbWFwX3dyaXRlX2RpcmVjdF90KSB4ZnNfaW9tYXBfd3JpdGVfZGlyZWN0LAotCS54ZnNfaW9tYXBfd3JpdGVfZGVsYXkgPQotCQkJKHhmc19pb21hcF93cml0ZV9kZWxheV90KSB4ZnNfaW9tYXBfd3JpdGVfZGVsYXksCi0JLnhmc19pb21hcF93cml0ZV9hbGxvY2F0ZSA9Ci0JCQkoeGZzX2lvbWFwX3dyaXRlX2FsbG9jYXRlX3QpIHhmc19pb21hcF93cml0ZV9hbGxvY2F0ZSwKLQkueGZzX2lvbWFwX3dyaXRlX3Vud3JpdHRlbiA9Ci0JCQkoeGZzX2lvbWFwX3dyaXRlX3Vud3JpdHRlbl90KSB4ZnNfaW9tYXBfd3JpdGVfdW53cml0dGVuLAotCS54ZnNfaWxvY2sJCT0gKHhmc19sb2NrX3QpIHhmc19pbG9jaywKLQkueGZzX2xja19tYXBfc2hhcmVkCT0gKHhmc19sY2tfbWFwX3NoYXJlZF90KSB4ZnNfaWxvY2tfbWFwX3NoYXJlZCwKLQkueGZzX2lsb2NrX2RlbW90ZQk9ICh4ZnNfbG9ja19kZW1vdGVfdCkgeGZzX2lsb2NrX2RlbW90ZSwKLQkueGZzX2lsb2NrX25vd2FpdAk9ICh4ZnNfbG9ja19ub3dhaXRfdCkgeGZzX2lsb2NrX25vd2FpdCwKLQkueGZzX3VubG9jawkJPSAoeGZzX3VubGtfdCkgeGZzX2l1bmxvY2ssCi0JLnhmc19zaXplX2Z1bmMJCT0gKHhmc19zaXplX3QpIHhmc19zaXplX2ZuLAotCS54ZnNfaW9kb25lCQk9ICh4ZnNfaW9kb25lX3QpIGZzX25vZXJyLAotCS54ZnNfc3dhcF9leHRlbnRzX2Z1bmMJPSAoeGZzX3N3YXBfZXh0ZW50c190KSB4ZnNfc3dhcF9leHRlbnRzLAotfTsKLQotdm9pZAoteGZzX2lvY29yZV9pbm9kZV9yZWluaXQoCi0JeGZzX2lub2RlX3QJKmlwKQotewotCXhmc19pb2NvcmVfdAkqaW8gPSAmaXAtPmlfaW9jb3JlOwotCi0JaW8tPmlvX2ZsYWdzID0gMDsKLQlpZiAoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpCi0JCWlvLT5pb19mbGFncyB8PSBYRlNfSU9DT1JFX1JUOwotCWlvLT5pb19kbWV2bWFzayA9IGlwLT5pX2QuZGlfZG1ldm1hc2s7Ci0JaW8tPmlvX2Rtc3RhdGUgPSBpcC0+aV9kLmRpX2Rtc3RhdGU7Ci19Ci0KLXZvaWQKLXhmc19pb2NvcmVfaW5vZGVfaW5pdCgKLQl4ZnNfaW5vZGVfdAkqaXApCi17Ci0JeGZzX2lvY29yZV90CSppbyA9ICZpcC0+aV9pb2NvcmU7Ci0JeGZzX21vdW50X3QJKm1wID0gaXAtPmlfbW91bnQ7Ci0KLQlpby0+aW9fbW91bnQgPSBtcDsKLSNpZmRlZiBERUJVRwotCWlvLT5pb19sb2NrID0gJmlwLT5pX2xvY2s7Ci0JaW8tPmlvX2lvbG9jayA9ICZpcC0+aV9pb2xvY2s7Ci0jZW5kaWYKLQotCWlvLT5pb19vYmogPSAodm9pZCAqKWlwOwotCi0JeGZzX2lvY29yZV9pbm9kZV9yZWluaXQoaXApOwotfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pb21hcC5jIGIvZnMveGZzL3hmc19pb21hcC5jCmluZGV4IDcyNzg2ZTMuLmZkZTM3ZjggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW9tYXAuYworKysgYi9mcy94ZnMveGZzX2lvbWFwLmMKQEAgLTUzLDEyICs1MywxMCBAQAogdm9pZAogeGZzX2lvbWFwX2VudGVyX3RyYWNlKAogCWludAkJdGFnLAotCXhmc19pb2NvcmVfdAkqaW8sCisJeGZzX2lub2RlX3QJKmlwLAogCXhmc19vZmZfdAlvZmZzZXQsCiAJc3NpemVfdAkJY291bnQpCiB7Ci0JeGZzX2lub2RlX3QJKmlwID0gWEZTX0lPX0lOT0RFKGlvKTsKLQogCWlmICghaXAtPmlfcnd0cmFjZSkKIAkJcmV0dXJuOwogCkBAIC03MCw4ICs2OCw4IEBACiAJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKSgob2Zmc2V0ID4+IDMyKSAmIDB4ZmZmZmZmZmYpKSwKIAkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKG9mZnNldCAmIDB4ZmZmZmZmZmYpKSwKIAkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpY291bnQpLAotCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoKGlvLT5pb19uZXdfc2l6ZSA+PiAzMikgJiAweGZmZmZmZmZmKSksCi0JCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShpby0+aW9fbmV3X3NpemUgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKSgoaXAtPmlfbmV3X3NpemUgPj4gMzIpICYgMHhmZmZmZmZmZikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoaXAtPmlfbmV3X3NpemUgJiAweGZmZmZmZmZmKSksCiAJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKWN1cnJlbnRfcGlkKCkpLAogCQkodm9pZCAqKU5VTEwsCiAJCSh2b2lkICopTlVMTCwKQEAgLTg0LDE1ICs4MiwxMyBAQAogdm9pZAogeGZzX2lvbWFwX21hcF90cmFjZSgKIAlpbnQJCXRhZywKLQl4ZnNfaW9jb3JlX3QJKmlvLAorCXhmc19pbm9kZV90CSppcCwKIAl4ZnNfb2ZmX3QJb2Zmc2V0LAogCXNzaXplX3QJCWNvdW50LAogCXhmc19pb21hcF90CSppb21hcHAsCiAJeGZzX2JtYnRfaXJlY190CSppbWFwcCwKIAlpbnQJCWZsYWdzKQogewotCXhmc19pbm9kZV90CSppcCA9IFhGU19JT19JTk9ERShpbyk7Ci0KIAlpZiAoIWlwLT5pX3J3dHJhY2UpCiAJCXJldHVybjsKIApAQCAtMTI2LDcgKzEyMiw3IEBACiAKIFNUQVRJQyBpbnQKIHhmc19pbWFwX3RvX2JtYXAoCi0JeGZzX2lvY29yZV90CSppbywKKwl4ZnNfaW5vZGVfdAkqaXAsCiAJeGZzX29mZl90CW9mZnNldCwKIAl4ZnNfYm1idF9pcmVjX3QgKmltYXAsCiAJeGZzX2lvbWFwX3QJKmlvbWFwcCwKQEAgLTEzNCwxMSArMTMwLDEwIEBACiAJaW50CQlpb21hcHMsCQkJLyogTnVtYmVyIG9mIGlvbWFwIGVudHJpZXMgKi8KIAlpbnQJCWZsYWdzKQogewotCXhmc19tb3VudF90CSptcDsKKwl4ZnNfbW91bnRfdAkqbXAgPSBpcC0+aV9tb3VudDsKIAlpbnQJCXBibTsKIAl4ZnNfZnNibG9ja190CXN0YXJ0X2Jsb2NrOwogCi0JbXAgPSBpby0+aW9fbW91bnQ7CiAKIAlmb3IgKHBibSA9IDA7IGltYXBzICYmIHBibSA8IGlvbWFwczsgaW1hcHMtLSwgaW9tYXBwKyssIGltYXArKywgcGJtKyspIHsKIAkJaW9tYXBwLT5pb21hcF9vZmZzZXQgPSBYRlNfRlNCX1RPX0IobXAsIGltYXAtPmJyX3N0YXJ0b2ZmKTsKQEAgLTE0Niw3ICsxNDEsNyBAQAogCQlpb21hcHAtPmlvbWFwX2JzaXplID0gWEZTX0ZTQl9UT19CKG1wLCBpbWFwLT5icl9ibG9ja2NvdW50KTsKIAkJaW9tYXBwLT5pb21hcF9mbGFncyA9IGZsYWdzOwogCi0JCWlmIChpby0+aW9fZmxhZ3MgJiBYRlNfSU9DT1JFX1JUKSB7CisJCWlmIChYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApKSB7CiAJCQlpb21hcHAtPmlvbWFwX2ZsYWdzIHw9IElPTUFQX1JFQUxUSU1FOwogCQkJaW9tYXBwLT5pb21hcF90YXJnZXQgPSBtcC0+bV9ydGRldl90YXJncDsKIAkJfSBlbHNlIHsKQEAgLTE2MCw3ICsxNTUsNyBAQAogCQkJaW9tYXBwLT5pb21hcF9ibiA9IElPTUFQX0RBRERSX05VTEw7CiAJCQlpb21hcHAtPmlvbWFwX2ZsYWdzIHw9IElPTUFQX0RFTEFZOwogCQl9IGVsc2UgewotCQkJaW9tYXBwLT5pb21hcF9ibiA9IFhGU19GU0JfVE9fREJfSU8oaW8sIHN0YXJ0X2Jsb2NrKTsKKwkJCWlvbWFwcC0+aW9tYXBfYm4gPSBYRlNfRlNCX1RPX0RCKGlwLCBzdGFydF9ibG9jayk7CiAJCQlpZiAoSVNVTldSSVRURU4oaW1hcCkpCiAJCQkJaW9tYXBwLT5pb21hcF9mbGFncyB8PSBJT01BUF9VTldSSVRURU47CiAJCX0KQEAgLTE3MiwxNCArMTY3LDE0IEBACiAKIGludAogeGZzX2lvbWFwKAotCXhmc19pb2NvcmVfdAkqaW8sCisJeGZzX2lub2RlX3QJKmlwLAogCXhmc19vZmZfdAlvZmZzZXQsCiAJc3NpemVfdAkJY291bnQsCiAJaW50CQlmbGFncywKIAl4ZnNfaW9tYXBfdAkqaW9tYXBwLAogCWludAkJKm5pb21hcHMpCiB7Ci0JeGZzX21vdW50X3QJKm1wID0gaW8tPmlvX21vdW50OworCXhmc19tb3VudF90CSptcCA9IGlwLT5pX21vdW50OwogCXhmc19maWxlb2ZmX3QJb2Zmc2V0X2ZzYiwgZW5kX2ZzYjsKIAlpbnQJCWVycm9yID0gMDsKIAlpbnQJCWxvY2ttb2RlID0gMDsKQEAgLTE4OCw0NSArMTgzLDM3IEBACiAJaW50CQlibWFwaV9mbGFncyA9IDA7CiAJaW50CQlpb21hcF9mbGFncyA9IDA7CiAKKwlBU1NFUlQoKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRlJFRyk7CisKIAlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCiAJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKIAotCXN3aXRjaCAoZmxhZ3MgJgotCQkoQk1BUElfUkVBRCB8IEJNQVBJX1dSSVRFIHwgQk1BUElfQUxMT0NBVEUgfAotCQkgQk1BUElfVU5XUklUVEVOIHwgQk1BUElfREVWSUNFKSkgeworCXN3aXRjaCAoZmxhZ3MgJiAoQk1BUElfUkVBRCB8IEJNQVBJX1dSSVRFIHwgQk1BUElfQUxMT0NBVEUpKSB7CiAJY2FzZSBCTUFQSV9SRUFEOgotCQl4ZnNfaW9tYXBfZW50ZXJfdHJhY2UoWEZTX0lPTUFQX1JFQURfRU5URVIsIGlvLCBvZmZzZXQsIGNvdW50KTsKLQkJbG9ja21vZGUgPSBYRlNfTENLX01BUF9TSEFSRUQobXAsIGlvKTsKKwkJeGZzX2lvbWFwX2VudGVyX3RyYWNlKFhGU19JT01BUF9SRUFEX0VOVEVSLCBpcCwgb2Zmc2V0LCBjb3VudCk7CisJCWxvY2ttb2RlID0geGZzX2lsb2NrX21hcF9zaGFyZWQoaXApOwogCQlibWFwaV9mbGFncyA9IFhGU19CTUFQSV9FTlRJUkU7CiAJCWJyZWFrOwogCWNhc2UgQk1BUElfV1JJVEU6Ci0JCXhmc19pb21hcF9lbnRlcl90cmFjZShYRlNfSU9NQVBfV1JJVEVfRU5URVIsIGlvLCBvZmZzZXQsIGNvdW50KTsKKwkJeGZzX2lvbWFwX2VudGVyX3RyYWNlKFhGU19JT01BUF9XUklURV9FTlRFUiwgaXAsIG9mZnNldCwgY291bnQpOwogCQlsb2NrbW9kZSA9IFhGU19JTE9DS19FWENMfFhGU19FWFRTSVpFX1dSOwogCQlpZiAoZmxhZ3MgJiBCTUFQSV9JR05TVEFURSkKIAkJCWJtYXBpX2ZsYWdzIHw9IFhGU19CTUFQSV9JR1NUQVRFfFhGU19CTUFQSV9FTlRJUkU7Ci0JCVhGU19JTE9DSyhtcCwgaW8sIGxvY2ttb2RlKTsKKwkJeGZzX2lsb2NrKGlwLCBsb2NrbW9kZSk7CiAJCWJyZWFrOwogCWNhc2UgQk1BUElfQUxMT0NBVEU6Ci0JCXhmc19pb21hcF9lbnRlcl90cmFjZShYRlNfSU9NQVBfQUxMT0NfRU5URVIsIGlvLCBvZmZzZXQsIGNvdW50KTsKKwkJeGZzX2lvbWFwX2VudGVyX3RyYWNlKFhGU19JT01BUF9BTExPQ19FTlRFUiwgaXAsIG9mZnNldCwgY291bnQpOwogCQlsb2NrbW9kZSA9IFhGU19JTE9DS19TSEFSRUR8WEZTX0VYVFNJWkVfUkQ7CiAJCWJtYXBpX2ZsYWdzID0gWEZTX0JNQVBJX0VOVElSRTsKKwogCQkvKiBBdHRlbXB0IG5vbi1ibG9ja2luZyBsb2NrICovCiAJCWlmIChmbGFncyAmIEJNQVBJX1RSWUxPQ0spIHsKLQkJCWlmICghWEZTX0lMT0NLX05PV0FJVChtcCwgaW8sIGxvY2ttb2RlKSkKKwkJCWlmICgheGZzX2lsb2NrX25vd2FpdChpcCwgbG9ja21vZGUpKQogCQkJCXJldHVybiBYRlNfRVJST1IoRUFHQUlOKTsKIAkJfSBlbHNlIHsKLQkJCVhGU19JTE9DSyhtcCwgaW8sIGxvY2ttb2RlKTsKKwkJCXhmc19pbG9jayhpcCwgbG9ja21vZGUpOwogCQl9CiAJCWJyZWFrOwotCWNhc2UgQk1BUElfVU5XUklUVEVOOgotCQlnb3RvIHBoYXNlMjsKLQljYXNlIEJNQVBJX0RFVklDRToKLQkJbG9ja21vZGUgPSBYRlNfTENLX01BUF9TSEFSRUQobXAsIGlvKTsKLQkJaW9tYXBwLT5pb21hcF90YXJnZXQgPSBpby0+aW9fZmxhZ3MgJiBYRlNfSU9DT1JFX1JUID8KLQkJCW1wLT5tX3J0ZGV2X3RhcmdwIDogbXAtPm1fZGRldl90YXJncDsKLQkJZXJyb3IgPSAwOwotCQkqbmlvbWFwcyA9IDE7Ci0JCWdvdG8gb3V0OwogCWRlZmF1bHQ6CiAJCUJVRygpOwogCX0KQEAgLTIzNyw3ICsyMjQsNyBAQAogCWVuZF9mc2IgPSBYRlNfQl9UT19GU0IobXAsICh4ZnNfdWZzaXplX3Qpb2Zmc2V0ICsgY291bnQpOwogCW9mZnNldF9mc2IgPSBYRlNfQl9UT19GU0JUKG1wLCBvZmZzZXQpOwogCi0JZXJyb3IgPSBYRlNfQk1BUEkobXAsIE5VTEwsIGlvLCBvZmZzZXRfZnNiLAorCWVycm9yID0geGZzX2JtYXBpKE5VTEwsIGlwLCBvZmZzZXRfZnNiLAogCQkJKHhmc19maWxibGtzX3QpKGVuZF9mc2IgLSBvZmZzZXRfZnNiKSwKIAkJCWJtYXBpX2ZsYWdzLCAgTlVMTCwgMCwgJmltYXAsCiAJCQkmbmltYXBzLCBOVUxMLCBOVUxMKTsKQEAgLTI0NSw1NCArMjMyLDQ4IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKIAotcGhhc2UyOgotCXN3aXRjaCAoZmxhZ3MgJiAoQk1BUElfV1JJVEV8Qk1BUElfQUxMT0NBVEV8Qk1BUElfVU5XUklUVEVOKSkgeworCXN3aXRjaCAoZmxhZ3MgJiAoQk1BUElfV1JJVEV8Qk1BUElfQUxMT0NBVEUpKSB7CiAJY2FzZSBCTUFQSV9XUklURToKIAkJLyogSWYgd2UgZm91bmQgYW4gZXh0ZW50LCByZXR1cm4gaXQgKi8KIAkJaWYgKG5pbWFwcyAmJgogCQkgICAgKGltYXAuYnJfc3RhcnRibG9jayAhPSBIT0xFU1RBUlRCTE9DSykgJiYKIAkJICAgIChpbWFwLmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKSkgewotCQkJeGZzX2lvbWFwX21hcF90cmFjZShYRlNfSU9NQVBfV1JJVEVfTUFQLCBpbywKKwkJCXhmc19pb21hcF9tYXBfdHJhY2UoWEZTX0lPTUFQX1dSSVRFX01BUCwgaXAsCiAJCQkJCW9mZnNldCwgY291bnQsIGlvbWFwcCwgJmltYXAsIGZsYWdzKTsKIAkJCWJyZWFrOwogCQl9CiAKIAkJaWYgKGZsYWdzICYgKEJNQVBJX0RJUkVDVHxCTUFQSV9NTUFQKSkgewotCQkJZXJyb3IgPSBYRlNfSU9NQVBfV1JJVEVfRElSRUNUKG1wLCBpbywgb2Zmc2V0LAotCQkJCQljb3VudCwgZmxhZ3MsICZpbWFwLCAmbmltYXBzLCBuaW1hcHMpOworCQkJZXJyb3IgPSB4ZnNfaW9tYXBfd3JpdGVfZGlyZWN0KGlwLCBvZmZzZXQsIGNvdW50LCBmbGFncywKKwkJCQkJCSAgICAgICAmaW1hcCwgJm5pbWFwcywgbmltYXBzKTsKIAkJfSBlbHNlIHsKLQkJCWVycm9yID0gWEZTX0lPTUFQX1dSSVRFX0RFTEFZKG1wLCBpbywgb2Zmc2V0LCBjb3VudCwKLQkJCQkJZmxhZ3MsICZpbWFwLCAmbmltYXBzKTsKKwkJCWVycm9yID0geGZzX2lvbWFwX3dyaXRlX2RlbGF5KGlwLCBvZmZzZXQsIGNvdW50LCBmbGFncywKKwkJCQkJCSAgICAgICZpbWFwLCAmbmltYXBzKTsKIAkJfQogCQlpZiAoIWVycm9yKSB7Ci0JCQl4ZnNfaW9tYXBfbWFwX3RyYWNlKFhGU19JT01BUF9BTExPQ19NQVAsIGlvLAorCQkJeGZzX2lvbWFwX21hcF90cmFjZShYRlNfSU9NQVBfQUxMT0NfTUFQLCBpcCwKIAkJCQkJb2Zmc2V0LCBjb3VudCwgaW9tYXBwLCAmaW1hcCwgZmxhZ3MpOwogCQl9CiAJCWlvbWFwX2ZsYWdzID0gSU9NQVBfTkVXOwogCQlicmVhazsKIAljYXNlIEJNQVBJX0FMTE9DQVRFOgogCQkvKiBJZiB3ZSBmb3VuZCBhbiBleHRlbnQsIHJldHVybiBpdCAqLwotCQlYRlNfSVVOTE9DSyhtcCwgaW8sIGxvY2ttb2RlKTsKKwkJeGZzX2l1bmxvY2soaXAsIGxvY2ttb2RlKTsKIAkJbG9ja21vZGUgPSAwOwogCiAJCWlmIChuaW1hcHMgJiYgIUlTTlVMTFNUQVJUQkxPQ0soaW1hcC5icl9zdGFydGJsb2NrKSkgewotCQkJeGZzX2lvbWFwX21hcF90cmFjZShYRlNfSU9NQVBfV1JJVEVfTUFQLCBpbywKKwkJCXhmc19pb21hcF9tYXBfdHJhY2UoWEZTX0lPTUFQX1dSSVRFX01BUCwgaXAsCiAJCQkJCW9mZnNldCwgY291bnQsIGlvbWFwcCwgJmltYXAsIGZsYWdzKTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJZXJyb3IgPSBYRlNfSU9NQVBfV1JJVEVfQUxMT0NBVEUobXAsIGlvLCBvZmZzZXQsIGNvdW50LAorCQllcnJvciA9IHhmc19pb21hcF93cml0ZV9hbGxvY2F0ZShpcCwgb2Zmc2V0LCBjb3VudCwKIAkJCQkJCSAmaW1hcCwgJm5pbWFwcyk7CiAJCWJyZWFrOwotCWNhc2UgQk1BUElfVU5XUklUVEVOOgotCQlsb2NrbW9kZSA9IDA7Ci0JCWVycm9yID0gWEZTX0lPTUFQX1dSSVRFX1VOV1JJVFRFTihtcCwgaW8sIG9mZnNldCwgY291bnQpOwotCQluaW1hcHMgPSAwOwotCQlicmVhazsKIAl9CiAKIAlpZiAobmltYXBzKSB7Ci0JCSpuaW9tYXBzID0geGZzX2ltYXBfdG9fYm1hcChpbywgb2Zmc2V0LCAmaW1hcCwKKwkJKm5pb21hcHMgPSB4ZnNfaW1hcF90b19ibWFwKGlwLCBvZmZzZXQsICZpbWFwLAogCQkJCQkgICAgaW9tYXBwLCBuaW1hcHMsICpuaW9tYXBzLCBpb21hcF9mbGFncyk7CiAJfSBlbHNlIGlmIChuaW9tYXBzKSB7CiAJCSpuaW9tYXBzID0gMDsKQEAgLTMwMCwxNCArMjgxLDE1IEBACiAKIG91dDoKIAlpZiAobG9ja21vZGUpCi0JCVhGU19JVU5MT0NLKG1wLCBpbywgbG9ja21vZGUpOworCQl4ZnNfaXVubG9jayhpcCwgbG9ja21vZGUpOwogCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOwogfQogCisKIFNUQVRJQyBpbnQKIHhmc19pb21hcF9lb2ZfYWxpZ25fbGFzdF9mc2IoCiAJeGZzX21vdW50X3QJKm1wLAotCXhmc19pb2NvcmVfdAkqaW8sCisJeGZzX2lub2RlX3QJKmlwLAogCXhmc19mc2l6ZV90CWlzaXplLAogCXhmc19leHRsZW5fdAlleHRzaXplLAogCXhmc19maWxlb2ZmX3QJKmxhc3RfZnNiKQpAQCAtMzE2LDcgKzI5OCw3IEBACiAJeGZzX2V4dGxlbl90CWFsaWduOwogCWludAkJZW9mLCBlcnJvcjsKIAotCWlmIChpby0+aW9fZmxhZ3MgJiBYRlNfSU9DT1JFX1JUKQorCWlmIChYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApKQogCQk7CiAJLyoKIAkgKiBJZiBtb3VudGVkIHdpdGggdGhlICItbyBzd2FsbG9jIiBvcHRpb24sIHJvdW5kdXAgdGhlIGFsbG9jYXRpb24KQEAgLTM0Nyw3ICszMjksNyBAQAogCX0KIAogCWlmIChuZXdfbGFzdF9mc2IpIHsKLQkJZXJyb3IgPSBYRlNfQk1BUF9FT0YobXAsIGlvLCBuZXdfbGFzdF9mc2IsIFhGU19EQVRBX0ZPUkssICZlb2YpOworCQllcnJvciA9IHhmc19ibWFwX2VvZihpcCwgbmV3X2xhc3RfZnNiLCBYRlNfREFUQV9GT1JLLCAmZW9mKTsKIAkJaWYgKGVycm9yKQogCQkJcmV0dXJuIGVycm9yOwogCQlpZiAoZW9mKQpAQCAtNDE2LDcgKzM5OCw2IEBACiAJaW50CQlmb3VuZCkKIHsKIAl4ZnNfbW91bnRfdAkqbXAgPSBpcC0+aV9tb3VudDsKLQl4ZnNfaW9jb3JlX3QJKmlvID0gJmlwLT5pX2lvY29yZTsKIAl4ZnNfZmlsZW9mZl90CW9mZnNldF9mc2I7CiAJeGZzX2ZpbGVvZmZfdAlsYXN0X2ZzYjsKIAl4ZnNfZmlsYmxrc190CWNvdW50X2ZzYiwgcmVzYWxpZ25lZDsKQEAgLTQ0NiwxMyArNDI3LDEzIEBACiAJZXh0c3ogPSB4ZnNfZ2V0X2V4dHN6X2hpbnQoaXApOwogCiAJaXNpemUgPSBpcC0+aV9zaXplOwotCWlmIChpby0+aW9fbmV3X3NpemUgPiBpc2l6ZSkKLQkJaXNpemUgPSBpby0+aW9fbmV3X3NpemU7CisJaWYgKGlwLT5pX25ld19zaXplID4gaXNpemUpCisJCWlzaXplID0gaXAtPmlfbmV3X3NpemU7CiAKIAlvZmZzZXRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0KTsKIAlsYXN0X2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgKCh4ZnNfdWZzaXplX3QpKG9mZnNldCArIGNvdW50KSkpOwogCWlmICgob2Zmc2V0ICsgY291bnQpID4gaXNpemUpIHsKLQkJZXJyb3IgPSB4ZnNfaW9tYXBfZW9mX2FsaWduX2xhc3RfZnNiKG1wLCBpbywgaXNpemUsIGV4dHN6LAorCQllcnJvciA9IHhmc19pb21hcF9lb2ZfYWxpZ25fbGFzdF9mc2IobXAsIGlwLCBpc2l6ZSwgZXh0c3osCiAJCQkJCQkJJmxhc3RfZnNiKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBlcnJvcl9vdXQ7CkBAIC01MTksNyArNTAwLDcgQEAKIAkgKi8KIAlYRlNfQk1BUF9JTklUKCZmcmVlX2xpc3QsICZmaXJzdGZzYik7CiAJbmltYXBzID0gMTsKLQllcnJvciA9IFhGU19CTUFQSShtcCwgdHAsIGlvLCBvZmZzZXRfZnNiLCBjb3VudF9mc2IsIGJtYXBpX2ZsYWcsCisJZXJyb3IgPSB4ZnNfYm1hcGkodHAsIGlwLCBvZmZzZXRfZnNiLCBjb3VudF9mc2IsIGJtYXBpX2ZsYWcsCiAJCSZmaXJzdGZzYiwgMCwgJmltYXAsICZuaW1hcHMsICZmcmVlX2xpc3QsIE5VTEwpOwogCWlmIChlcnJvcikKIAkJZ290byBlcnJvcjA7CkBAIC01NDIsNyArNTIzLDggQEAKIAkJZ290byBlcnJvcl9vdXQ7CiAJfQogCi0JaWYgKHVubGlrZWx5KCFpbWFwLmJyX3N0YXJ0YmxvY2sgJiYgIShpby0+aW9fZmxhZ3MgJiBYRlNfSU9DT1JFX1JUKSkpIHsKKwlpZiAodW5saWtlbHkoIWltYXAuYnJfc3RhcnRibG9jayAmJgorCQkgICAgICEoWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKSkpKSB7CiAJCWVycm9yID0geGZzX2Ntbl9lcnJfZnNibG9ja196ZXJvKGlwLCAmaW1hcCk7CiAJCWdvdG8gZXJyb3Jfb3V0OwogCX0KQEAgLTU3Nyw3ICs1NTksNyBAQAogU1RBVElDIGludAogeGZzX2lvbWFwX2VvZl93YW50X3ByZWFsbG9jYXRlKAogCXhmc19tb3VudF90CSptcCwKLQl4ZnNfaW9jb3JlX3QJKmlvLAorCXhmc19pbm9kZV90CSppcCwKIAl4ZnNfZnNpemVfdAlpc2l6ZSwKIAl4ZnNfb2ZmX3QJb2Zmc2V0LAogCXNpemVfdAkJY291bnQsCkBAIC02MDQsNyArNTg2LDcgQEAKIAl3aGlsZSAoY291bnRfZnNiID4gMCkgewogCQlpbWFwcyA9IG5pbWFwczsKIAkJZmlyc3RibG9jayA9IE5VTExGU0JMT0NLOwotCQllcnJvciA9IFhGU19CTUFQSShtcCwgTlVMTCwgaW8sIHN0YXJ0X2ZzYiwgY291bnRfZnNiLCAwLAorCQllcnJvciA9IHhmc19ibWFwaShOVUxMLCBpcCwgc3RhcnRfZnNiLCBjb3VudF9mc2IsIDAsCiAJCQkJICAmZmlyc3RibG9jaywgMCwgaW1hcCwgJmltYXBzLCBOVUxMLCBOVUxMKTsKIAkJaWYgKGVycm9yKQogCQkJcmV0dXJuIGVycm9yOwpAQCAtNjMwLDcgKzYxMiw2IEBACiAJaW50CQkqbm1hcHMpCiB7CiAJeGZzX21vdW50X3QJKm1wID0gaXAtPmlfbW91bnQ7Ci0JeGZzX2lvY29yZV90CSppbyA9ICZpcC0+aV9pb2NvcmU7CiAJeGZzX2ZpbGVvZmZfdAlvZmZzZXRfZnNiOwogCXhmc19maWxlb2ZmX3QJbGFzdF9mc2I7CiAJeGZzX29mZl90CWFsaWduZWRfb2Zmc2V0OwpAQCAtNjU4LDEwICs2MzksMTAgQEAKIAogcmV0cnk6CiAJaXNpemUgPSBpcC0+aV9zaXplOwotCWlmIChpby0+aW9fbmV3X3NpemUgPiBpc2l6ZSkKLQkJaXNpemUgPSBpby0+aW9fbmV3X3NpemU7CisJaWYgKGlwLT5pX25ld19zaXplID4gaXNpemUpCisJCWlzaXplID0gaXAtPmlfbmV3X3NpemU7CiAKLQllcnJvciA9IHhmc19pb21hcF9lb2Zfd2FudF9wcmVhbGxvY2F0ZShtcCwgaW8sIGlzaXplLCBvZmZzZXQsIGNvdW50LAorCWVycm9yID0geGZzX2lvbWFwX2VvZl93YW50X3ByZWFsbG9jYXRlKG1wLCBpcCwgaXNpemUsIG9mZnNldCwgY291bnQsCiAJCQkJaW9mbGFnLCBpbWFwLCBYRlNfV1JJVEVfSU1BUFMsICZwcmVhbGxvYyk7CiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CkBAIC02NzUsNyArNjU2LDcgQEAKIAl9CiAKIAlpZiAocHJlYWxsb2MgfHwgZXh0c3opIHsKLQkJZXJyb3IgPSB4ZnNfaW9tYXBfZW9mX2FsaWduX2xhc3RfZnNiKG1wLCBpbywgaXNpemUsIGV4dHN6LAorCQllcnJvciA9IHhmc19pb21hcF9lb2ZfYWxpZ25fbGFzdF9mc2IobXAsIGlwLCBpc2l6ZSwgZXh0c3osCiAJCQkJCQkJJmxhc3RfZnNiKTsKIAkJaWYgKGVycm9yKQogCQkJcmV0dXJuIGVycm9yOwpAQCAtNjgzLDcgKzY2NCw3IEBACiAKIAluaW1hcHMgPSBYRlNfV1JJVEVfSU1BUFM7CiAJZmlyc3RibG9jayA9IE5VTExGU0JMT0NLOwotCWVycm9yID0gWEZTX0JNQVBJKG1wLCBOVUxMLCBpbywgb2Zmc2V0X2ZzYiwKKwllcnJvciA9IHhmc19ibWFwaShOVUxMLCBpcCwgb2Zmc2V0X2ZzYiwKIAkJCSAgKHhmc19maWxibGtzX3QpKGxhc3RfZnNiIC0gb2Zmc2V0X2ZzYiksCiAJCQkgIFhGU19CTUFQSV9ERUxBWSB8IFhGU19CTUFQSV9XUklURSB8CiAJCQkgIFhGU19CTUFQSV9FTlRJUkUsICZmaXJzdGJsb2NrLCAxLCBpbWFwLApAQCAtNjk3LDcgKzY3OCw3IEBACiAJICovCiAJaWYgKG5pbWFwcyA9PSAwKSB7CiAJCXhmc19pb21hcF9lbnRlcl90cmFjZShYRlNfSU9NQVBfV1JJVEVfTk9TUEFDRSwKLQkJCQkJaW8sIG9mZnNldCwgY291bnQpOworCQkJCQlpcCwgb2Zmc2V0LCBjb3VudCk7CiAJCWlmICh4ZnNfZmx1c2hfc3BhY2UoaXAsICZmc3luY2VkLCAmaW9mbGFnKSkKIAkJCXJldHVybiBYRlNfRVJST1IoRU5PU1BDKTsKIApAQCAtNzA1LDcgKzY4Niw4IEBACiAJCWdvdG8gcmV0cnk7CiAJfQogCi0JaWYgKHVubGlrZWx5KCFpbWFwWzBdLmJyX3N0YXJ0YmxvY2sgJiYgIShpby0+aW9fZmxhZ3MgJiBYRlNfSU9DT1JFX1JUKSkpCisJaWYgKHVubGlrZWx5KCFpbWFwWzBdLmJyX3N0YXJ0YmxvY2sgJiYKKwkJICAgICAhKFhGU19JU19SRUFMVElNRV9JTk9ERShpcCkpKSkKIAkJcmV0dXJuIHhmc19jbW5fZXJyX2ZzYmxvY2tfemVybyhpcCwgJmltYXBbMF0pOwogCiAJKnJldF9pbWFwID0gaW1hcFswXTsKQEAgLTcyMCw2ICs3MDIsOSBAQAogICogdGhlIG9yaWdpbmF0aW5nIGNhbGxlcnMgcmVxdWVzdC4KICAqCiAgKiBDYWxsZWQgd2l0aG91dCBhIGxvY2sgb24gdGhlIGlub2RlLgorICoKKyAqIFdlIG5vIGxvbmdlciBib3RoZXIgdG8gbG9vayBhdCB0aGUgaW5jb21pbmcgbWFwIC0gYWxsIHdlIGhhdmUgdG8KKyAqIGd1YXJhbnRlZSBpcyB0aGF0IHdoYXRldmVyIHdlIGFsbG9jYXRlIGZpbGxzIHRoZSByZXF1aXJlZCByYW5nZS4KICAqLwogaW50CiB4ZnNfaW9tYXBfd3JpdGVfYWxsb2NhdGUoCkBAIC03MzAsMTUgKzcxNSwxNCBAQAogCWludAkJKnJldG1hcCkKIHsKIAl4ZnNfbW91bnRfdAkqbXAgPSBpcC0+aV9tb3VudDsKLQl4ZnNfaW9jb3JlX3QgICAgKmlvID0gJmlwLT5pX2lvY29yZTsKIAl4ZnNfZmlsZW9mZl90CW9mZnNldF9mc2IsIGxhc3RfYmxvY2s7CiAJeGZzX2ZpbGVvZmZfdAllbmRfZnNiLCBtYXBfc3RhcnRfZnNiOwogCXhmc19mc2Jsb2NrX3QJZmlyc3RfYmxvY2s7CiAJeGZzX2JtYXBfZnJlZV90CWZyZWVfbGlzdDsKIAl4ZnNfZmlsYmxrc190CWNvdW50X2ZzYjsKLQl4ZnNfYm1idF9pcmVjX3QJaW1hcFtYRlNfU1RSQVRfV1JJVEVfSU1BUFNdOworCXhmc19ibWJ0X2lyZWNfdAlpbWFwOwogCXhmc190cmFuc190CSp0cDsKLQlpbnQJCWksIG5pbWFwcywgY29tbWl0dGVkOworCWludAkJbmltYXBzLCBjb21taXR0ZWQ7CiAJaW50CQllcnJvciA9IDA7CiAJaW50CQlucmVzOwogCkBAIC03ODUsMTMgKzc2OSwzOCBAQAogCiAJCQlYRlNfQk1BUF9JTklUKCZmcmVlX2xpc3QsICZmaXJzdF9ibG9jayk7CiAKLQkJCW5pbWFwcyA9IFhGU19TVFJBVF9XUklURV9JTUFQUzsKIAkJCS8qCi0JCQkgKiBFbnN1cmUgd2UgZG9uJ3QgZ28gYmV5b25kIGVvZiAtIGl0IGlzIHBvc3NpYmxlCi0JCQkgKiB0aGUgZXh0ZW50cyBjaGFuZ2VkIHNpbmNlIHdlIGRpZCB0aGUgcmVhZCBjYWxsLAotCQkJICogd2UgZHJvcHBlZCB0aGUgaWxvY2sgaW4gdGhlIGludGVyaW0uCisJCQkgKiBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBleHRlbnRzIGhhdmUgY2hhbmdlZCBzaW5jZQorCQkJICogd2UgZGlkIHRoZSByZWFkIGNhbGwgYXMgd2UgZHJvcHBlZCB0aGUgaWxvY2sgZm9yIGEKKwkJCSAqIHdoaWxlLiBXZSBoYXZlIHRvIGJlIGNhcmVmdWwgYWJvdXQgdHJ1bmNhdGVzIG9yIGhvbGUKKwkJCSAqIHB1bmNocyBoZXJlIC0gd2UgYXJlIG5vdCBhbGxvd2VkIHRvIGFsbG9jYXRlCisJCQkgKiBub24tZGVsYWxsb2MgYmxvY2tzIGhlcmUuCisJCQkgKgorCQkJICogVGhlIG9ubHkgcHJvdGVjdGlvbiBhZ2FpbnN0IHRydW5jYXRpb24gaXMgdGhlIHBhZ2VzCisJCQkgKiBmb3IgdGhlIHJhbmdlIHdlIGFyZSBiZWluZyBhc2tlZCB0byBjb252ZXJ0IGFyZQorCQkJICogbG9ja2VkIGFuZCBoZW5jZSBhIHRydW5jYXRlIHdpbGwgYmxvY2sgb24gdGhlbQorCQkJICogZmlyc3QuCisJCQkgKgorCQkJICogQXMgYSByZXN1bHQsIGlmIHdlIGdvIGJleW9uZCB0aGUgcmFuZ2Ugd2UgcmVhbGx5CisJCQkgKiBuZWVkIGFuZCBoaXQgYW4gZGVsYWxsb2MgZXh0ZW50IGJvdW5kYXJ5IGZvbGxvd2VkIGJ5CisJCQkgKiBhIGhvbGUgd2hpbGUgd2UgaGF2ZSBleGNlc3MgYmxvY2tzIGluIHRoZSBtYXAsIHdlCisJCQkgKiB3aWxsIGZpbGwgdGhlIGhvbGUgaW5jb3JyZWN0bHkgYW5kIG92ZXJydW4gdGhlCisJCQkgKiB0cmFuc2FjdGlvbiByZXNlcnZhdGlvbi4KKwkJCSAqCisJCQkgKiBVc2luZyBhIHNpbmdsZSBtYXAgcHJldmVudHMgdGhpcyBhcyB3ZSBhcmUgZm9yY2VkIHRvCisJCQkgKiBjaGVjayBlYWNoIG1hcCB3ZSBsb29rIGZvciBvdmVybGFwIHdpdGggdGhlIGRlc2lyZWQKKwkJCSAqIHJhbmdlIGFuZCBhYm9ydCBhcyBzb29uIGFzIHdlIGZpbmQgaXQuIEFsc28sIGdpdmVuCisJCQkgKiB0aGF0IHdlIG9ubHkgcmV0dXJuIGEgc2luZ2xlIG1hcCwgaGF2aW5nIG9uZSBiZXlvbmQKKwkJCSAqIHdoYXQgd2UgY2FuIHJldHVybiBpcyBwcm9iYWJseSBhIGJpdCBzaWxseS4KKwkJCSAqCisJCQkgKiBXZSBhbHNvIG5lZWQgdG8gY2hlY2sgdGhhdCB3ZSBkb24ndCBnbyBiZXlvbmQgRU9GOworCQkJICogdGhpcyBpcyBhIHRydW5jYXRlIG9wdGltaXNhdGlvbiBhcyBhIHRydW5jYXRlIHNldHMKKwkJCSAqIHRoZSBuZXcgZmlsZSBzaXplIGJlZm9yZSBibG9jayBvbiB0aGUgcGFnZXMgd2UKKwkJCSAqIGN1cnJlbnRseSBoYXZlIGxvY2tlZCB1bmRlciB3cml0ZWJhY2suIEJlY2F1c2UgdGhleQorCQkJICogYXJlIGFib3V0IHRvIGJlIHRvc3NlZCwgd2UgZG9uJ3QgbmVlZCB0byB3cml0ZSB0aGVtCisJCQkgKiBiYWNrLi4uLgogCQkJICovCi0KKwkJCW5pbWFwcyA9IDE7CiAJCQllbmRfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCBpcC0+aV9zaXplKTsKIAkJCXhmc19ibWFwX2xhc3Rfb2Zmc2V0KE5VTEwsIGlwLCAmbGFzdF9ibG9jaywKIAkJCQlYRlNfREFUQV9GT1JLKTsKQEAgLTgwNSw5ICs4MTQsOSBAQAogCQkJfQogCiAJCQkvKiBHbyBnZXQgdGhlIGFjdHVhbCBibG9ja3MgKi8KLQkJCWVycm9yID0gWEZTX0JNQVBJKG1wLCB0cCwgaW8sIG1hcF9zdGFydF9mc2IsIGNvdW50X2ZzYiwKKwkJCWVycm9yID0geGZzX2JtYXBpKHRwLCBpcCwgbWFwX3N0YXJ0X2ZzYiwgY291bnRfZnNiLAogCQkJCQlYRlNfQk1BUElfV1JJVEUsICZmaXJzdF9ibG9jaywgMSwKLQkJCQkJaW1hcCwgJm5pbWFwcywgJmZyZWVfbGlzdCwgTlVMTCk7CisJCQkJCSZpbWFwLCAmbmltYXBzLCAmZnJlZV9saXN0LCBOVUxMKTsKIAkJCWlmIChlcnJvcikKIAkJCQlnb3RvIHRyYW5zX2NhbmNlbDsKIApAQCAtODI2LDI3ICs4MzUsMjQgQEAKIAkJICogU2VlIGlmIHdlIHdlcmUgYWJsZSB0byBhbGxvY2F0ZSBhbiBleHRlbnQgdGhhdAogCQkgKiBjb3ZlcnMgYXQgbGVhc3QgcGFydCBvZiB0aGUgY2FsbGVycyByZXF1ZXN0CiAJCSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgbmltYXBzOyBpKyspIHsKLQkJCWlmICh1bmxpa2VseSghaW1hcFtpXS5icl9zdGFydGJsb2NrICYmCi0JCQkJICAgICAhKGlvLT5pb19mbGFncyAmIFhGU19JT0NPUkVfUlQpKSkKLQkJCQlyZXR1cm4geGZzX2Ntbl9lcnJfZnNibG9ja196ZXJvKGlwLCAmaW1hcFtpXSk7Ci0JCQlpZiAoKG9mZnNldF9mc2IgPj0gaW1hcFtpXS5icl9zdGFydG9mZikgJiYKLQkJCSAgICAob2Zmc2V0X2ZzYiA8IChpbWFwW2ldLmJyX3N0YXJ0b2ZmICsKLQkJCQkJICAgaW1hcFtpXS5icl9ibG9ja2NvdW50KSkpIHsKLQkJCQkqbWFwID0gaW1hcFtpXTsKLQkJCQkqcmV0bWFwID0gMTsKLQkJCQlYRlNfU1RBVFNfSU5DKHhzX3hzdHJhdF9xdWljayk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQljb3VudF9mc2IgLT0gaW1hcFtpXS5icl9ibG9ja2NvdW50OworCQlpZiAodW5saWtlbHkoIWltYXAuYnJfc3RhcnRibG9jayAmJgorCQkJICAgICBYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApKSkKKwkJCXJldHVybiB4ZnNfY21uX2Vycl9mc2Jsb2NrX3plcm8oaXAsICZpbWFwKTsKKwkJaWYgKChvZmZzZXRfZnNiID49IGltYXAuYnJfc3RhcnRvZmYpICYmCisJCSAgICAob2Zmc2V0X2ZzYiA8IChpbWFwLmJyX3N0YXJ0b2ZmICsKKwkJCQkgICBpbWFwLmJyX2Jsb2NrY291bnQpKSkgeworCQkJKm1hcCA9IGltYXA7CisJCQkqcmV0bWFwID0gMTsKKwkJCVhGU19TVEFUU19JTkMoeHNfeHN0cmF0X3F1aWNrKTsKKwkJCXJldHVybiAwOwogCQl9CiAKLQkJLyogU28gZmFyIHdlIGhhdmUgbm90IG1hcHBlZCB0aGUgcmVxdWVzdGVkIHBhcnQgb2YgdGhlCisJCS8qCisJCSAqIFNvIGZhciB3ZSBoYXZlIG5vdCBtYXBwZWQgdGhlIHJlcXVlc3RlZCBwYXJ0IG9mIHRoZQogCQkgKiBmaWxlLCBqdXN0IHN1cnJvdW5kaW5nIGRhdGEsIHRyeSBhZ2Fpbi4KIAkJICovCi0JCW5pbWFwcy0tOwotCQltYXBfc3RhcnRfZnNiID0gaW1hcFtuaW1hcHNdLmJyX3N0YXJ0b2ZmICsKLQkJCQlpbWFwW25pbWFwc10uYnJfYmxvY2tjb3VudDsKKwkJY291bnRfZnNiIC09IGltYXAuYnJfYmxvY2tjb3VudDsKKwkJbWFwX3N0YXJ0X2ZzYiA9IGltYXAuYnJfc3RhcnRvZmYgKyBpbWFwLmJyX2Jsb2NrY291bnQ7CiAJfQogCiB0cmFuc19jYW5jZWw6CkBAIC04NjQsNyArODcwLDYgQEAKIAlzaXplX3QJCWNvdW50KQogewogCXhmc19tb3VudF90CSptcCA9IGlwLT5pX21vdW50OwotCXhmc19pb2NvcmVfdCAgICAqaW8gPSAmaXAtPmlfaW9jb3JlOwogCXhmc19maWxlb2ZmX3QJb2Zmc2V0X2ZzYjsKIAl4ZnNfZmlsYmxrc190CWNvdW50X2ZzYjsKIAl4ZnNfZmlsYmxrc190CW51bWJsa3NfZnNiOwpAQCAtODc3LDggKzg4Miw3IEBACiAJaW50CQljb21taXR0ZWQ7CiAJaW50CQllcnJvcjsKIAotCXhmc19pb21hcF9lbnRlcl90cmFjZShYRlNfSU9NQVBfVU5XUklUVEVOLAotCQkJCSZpcC0+aV9pb2NvcmUsIG9mZnNldCwgY291bnQpOworCXhmc19pb21hcF9lbnRlcl90cmFjZShYRlNfSU9NQVBfVU5XUklUVEVOLCBpcCwgb2Zmc2V0LCBjb3VudCk7CiAKIAlvZmZzZXRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0KTsKIAljb3VudF9mc2IgPSBYRlNfQl9UT19GU0IobXAsICh4ZnNfdWZzaXplX3Qpb2Zmc2V0ICsgY291bnQpOwpAQCAtOTEyLDcgKzkxNiw3IEBACiAJCSAqLwogCQlYRlNfQk1BUF9JTklUKCZmcmVlX2xpc3QsICZmaXJzdGZzYik7CiAJCW5pbWFwcyA9IDE7Ci0JCWVycm9yID0gWEZTX0JNQVBJKG1wLCB0cCwgaW8sIG9mZnNldF9mc2IsIGNvdW50X2ZzYiwKKwkJZXJyb3IgPSB4ZnNfYm1hcGkodHAsIGlwLCBvZmZzZXRfZnNiLCBjb3VudF9mc2IsCiAJCQkJICBYRlNfQk1BUElfV1JJVEV8WEZTX0JNQVBJX0NPTlZFUlQsICZmaXJzdGZzYiwKIAkJCQkgIDEsICZpbWFwLCAmbmltYXBzLCAmZnJlZV9saXN0LCBOVUxMKTsKIAkJaWYgKGVycm9yKQpAQCAtOTI4LDcgKzkzMiw3IEBACiAJCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKIAogCQlpZiAodW5saWtlbHkoIWltYXAuYnJfc3RhcnRibG9jayAmJgotCQkJICAgICAhKGlvLT5pb19mbGFncyAmIFhGU19JT0NPUkVfUlQpKSkKKwkJCSAgICAgIShYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApKSkpCiAJCQlyZXR1cm4geGZzX2Ntbl9lcnJfZnNibG9ja196ZXJvKGlwLCAmaW1hcCk7CiAKIAkJaWYgKChudW1ibGtzX2ZzYiA9IGltYXAuYnJfYmxvY2tjb3VudCkgPT0gMCkgewpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pb21hcC5oIGIvZnMveGZzL3hmc19pb21hcC5oCmluZGV4IGY1YzA5ODguLmVlMWEwYzEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW9tYXAuaAorKysgYi9mcy94ZnMveGZzX2lvbWFwLmgKQEAgLTM2LDE0ICszNiwxMiBAQAogCUJNQVBJX1JFQUQgPSAoMSA8PCAwKSwJCS8qIHJlYWQgZXh0ZW50cyAqLwogCUJNQVBJX1dSSVRFID0gKDEgPDwgMSksCQkvKiBjcmVhdGUgZXh0ZW50cyAqLwogCUJNQVBJX0FMTE9DQVRFID0gKDEgPDwgMiksCS8qIGRlbGF5ZWQgYWxsb2NhdGUgdG8gcmVhbCBleHRlbnRzICovCi0JQk1BUElfVU5XUklUVEVOICA9ICgxIDw8IDMpLAkvKiB1bndyaXR0ZW4gZXh0ZW50cyB0byByZWFsIGV4dGVudHMgKi8KIAkvKiBtb2RpZmllcnMgKi8KIAlCTUFQSV9JR05TVEFURSA9ICgxIDw8IDQpLAkvKiBpZ25vcmUgdW53cml0dGVuIHN0YXRlIG9uIHJlYWQgKi8KIAlCTUFQSV9ESVJFQ1QgPSAoMSA8PCA1KSwJLyogZGlyZWN0IGluc3RlYWQgb2YgYnVmZmVyZWQgd3JpdGUgKi8KIAlCTUFQSV9NTUFQID0gKDEgPDwgNiksCQkvKiBhbGxvY2F0ZSBmb3IgbW1hcCB3cml0ZSAqLwogCUJNQVBJX1NZTkMgPSAoMSA8PCA3KSwJCS8qIHN5bmMgd3JpdGUgdG8gZmx1c2ggZGVsYWxsb2Mgc3BhY2UgKi8KIAlCTUFQSV9UUllMT0NLID0gKDEgPDwgOCksCS8qIG5vbi1ibG9ja2luZyByZXF1ZXN0ICovCi0JQk1BUElfREVWSUNFID0gKDEgPDwgOSksCS8qIHdlIG9ubHkgd2FudCB0byBrbm93IHRoZSBkZXZpY2UgKi8KIH0gYm1hcGlfZmxhZ3NfdDsKIAogCkBAIC03MywxMSArNzEsMTAgQEAKIAlpb21hcF9mbGFnc190CQlpb21hcF9mbGFnczsKIH0geGZzX2lvbWFwX3Q7CiAKLXN0cnVjdCB4ZnNfaW9jb3JlOwogc3RydWN0IHhmc19pbm9kZTsKIHN0cnVjdCB4ZnNfYm1idF9pcmVjOwogCi1leHRlcm4gaW50IHhmc19pb21hcChzdHJ1Y3QgeGZzX2lvY29yZSAqLCB4ZnNfb2ZmX3QsIHNzaXplX3QsIGludCwKK2V4dGVybiBpbnQgeGZzX2lvbWFwKHN0cnVjdCB4ZnNfaW5vZGUgKiwgeGZzX29mZl90LCBzc2l6ZV90LCBpbnQsCiAJCSAgICAgc3RydWN0IHhmc19pb21hcCAqLCBpbnQgKik7CiBleHRlcm4gaW50IHhmc19pb21hcF93cml0ZV9kaXJlY3Qoc3RydWN0IHhmc19pbm9kZSAqLCB4ZnNfb2ZmX3QsIHNpemVfdCwKIAkJCQkgIGludCwgc3RydWN0IHhmc19ibWJ0X2lyZWMgKiwgaW50ICosIGludCk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2l0YWJsZS5jIGIvZnMveGZzL3hmc19pdGFibGUuYwppbmRleCA5ZmM0YzI4Li42NThhYWI2IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2l0YWJsZS5jCisrKyBiL2ZzL3hmcy94ZnNfaXRhYmxlLmMKQEAgLTE3MCw3ICsxNzAsNyBAQAogCWJ1Zi0+YnNfbXRpbWUudHZfbnNlYyA9IGJlMzJfdG9fY3B1KGRpYy0+ZGlfbXRpbWUudF9uc2VjKTsKIAlidWYtPmJzX2N0aW1lLnR2X3NlYyA9IGJlMzJfdG9fY3B1KGRpYy0+ZGlfY3RpbWUudF9zZWMpOwogCWJ1Zi0+YnNfY3RpbWUudHZfbnNlYyA9IGJlMzJfdG9fY3B1KGRpYy0+ZGlfY3RpbWUudF9uc2VjKTsKLQlidWYtPmJzX3hmbGFncyA9IHhmc19kaWMyeGZsYWdzKGRpYyk7CisJYnVmLT5ic194ZmxhZ3MgPSB4ZnNfZGljMnhmbGFncyhkaXApOwogCWJ1Zi0+YnNfZXh0c2l6ZSA9IGJlMzJfdG9fY3B1KGRpYy0+ZGlfZXh0c2l6ZSkgPDwgbXAtPm1fc2Iuc2JfYmxvY2tsb2c7CiAJYnVmLT5ic19leHRlbnRzID0gYmUzMl90b19jcHUoZGljLT5kaV9uZXh0ZW50cyk7CiAJYnVmLT5ic19nZW4gPSBiZTMyX3RvX2NwdShkaWMtPmRpX2dlbik7CkBAIC0yOTEsNyArMjkxLDcgQEAKIAlkaXAgPSAoeGZzX2Rpbm9kZV90ICopCiAJCQl4ZnNfYnVmX29mZnNldChicCwgY2x1c3RpZHggPDwgbXAtPm1fc2Iuc2JfaW5vZGVsb2cpOwogCS8qCi0JICogQ2hlY2sgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBvbi1kaXNrIGlub2RlIGZvciBkaV9ubGluayA9PSAwLgorCSAqIENoZWNrIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgb24tZGlzayBpbm9kZSBmb3IgZGlfbW9kZSA9PSAwLgogCSAqIFRoaXMgaXMgdG8gcHJldmVudCB4ZnNfYnVsa3N0YXQgZnJvbSBwaWNraW5nIHVwIGp1c3QgcmVjbGFpbWVkCiAJICogaW5vZGVzIHRoYXQgaGF2ZSB0aGVpciBpbi1jb3JlIHN0YXRlIGluaXRpYWxpemVkIGJ1dCBub3QgZmx1c2hlZAogCSAqIHRvIGRpc2sgeWV0LiBUaGlzIGlzIGEgdGVtcG9yYXJ5IGhhY2sgdGhhdCB3b3VsZCByZXF1aXJlIGEgcHJvcGVyCkBAIC0yOTksNyArMjk5LDcgQEAKIAkgKi8KIAlpZiAoYmUxNl90b19jcHUoZGlwLT5kaV9jb3JlLmRpX21hZ2ljKSAhPSBYRlNfRElOT0RFX01BR0lDIHx8CiAJICAgICFYRlNfRElOT0RFX0dPT0RfVkVSU0lPTihkaXAtPmRpX2NvcmUuZGlfdmVyc2lvbikgfHwKLQkgICAgIWRpcC0+ZGlfY29yZS5kaV9ubGluaykKKwkgICAgIWRpcC0+ZGlfY29yZS5kaV9tb2RlKQogCQlyZXR1cm4gMDsKIAlpZiAoZmxhZ3MgJiBCVUxLU1RBVF9GR19RVUlDSykgewogCQkqZGlwcCA9IGRpcDsKQEAgLTMwNyw3ICszMDcsNyBAQAogCX0KIAkvKiBCVUxLU1RBVF9GR19JTkxJTkU6IGlmIGF0dHIgZm9yayBpcyBsb2NhbCwgb3Igbm90IHRoZXJlLCB1c2UgaXQgKi8KIAlhZm9ybWF0ID0gZGlwLT5kaV9jb3JlLmRpX2Fmb3JtYXQ7Ci0JaWYgKChYRlNfQ0ZPUktfUSgmZGlwLT5kaV9jb3JlKSA9PSAwKSB8fAorCWlmICgoWEZTX0RGT1JLX1EoZGlwKSA9PSAwKSB8fAogCSAgICAoYWZvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkgfHwKIAkgICAgKGFmb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJiAhZGlwLT5kaV9jb3JlLmRpX2FuZXh0ZW50cykpIHsKIAkJKmRpcHAgPSBkaXA7CkBAIC0zOTksNyArMzk5LDcgQEAKIAkJKFhGU19JTk9ERV9DTFVTVEVSX1NJWkUobXApID4+IG1wLT5tX3NiLnNiX2lub2RlbG9nKTsKIAluaW1hc2sgPSB+KG5pY2x1c3RlciAtIDEpOwogCW5iY2x1c3RlciA9IG5pY2x1c3RlciA+PiBtcC0+bV9zYi5zYl9pbm9wYmxvZzsKLQlpcmJ1ZiA9IGttZW1femFsbG9jX2dyZWVkeSgmaXJic2l6ZSwgTkJQQywgTkJQQyAqIDQsCisJaXJidWYgPSBrbWVtX3phbGxvY19ncmVlZHkoJmlyYnNpemUsIFBBR0VfU0laRSwgUEFHRV9TSVpFICogNCwKIAkJCQkgICBLTV9TTEVFUCB8IEtNX01BWUZBSUwgfCBLTV9MQVJHRSk7CiAJbmlyYnVmID0gaXJic2l6ZSAvIHNpemVvZigqaXJidWYpOwogCkBAIC04MzAsNyArODMwLDcgQEAKIAlhZ2lubyA9IFhGU19JTk9fVE9fQUdJTk8obXAsIGlubyk7CiAJbGVmdCA9ICpjb3VudDsKIAkqY291bnQgPSAwOwotCWJjb3VudCA9IE1JTihsZWZ0LCAoaW50KShOQlBQIC8gc2l6ZW9mKCpidWZmZXIpKSk7CisJYmNvdW50ID0gTUlOKGxlZnQsIChpbnQpKFBBR0VfU0laRSAvIHNpemVvZigqYnVmZmVyKSkpOwogCWJ1ZmZlciA9IGttZW1fYWxsb2MoYmNvdW50ICogc2l6ZW9mKCpidWZmZXIpLCBLTV9TTEVFUCk7CiAJZXJyb3IgPSBidWZpZHggPSAwOwogCWN1ciA9IE5VTEw7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZy5jIGIvZnMveGZzL3hmc19sb2cuYwppbmRleCA3N2MxMjcxLi5iM2FjMzgwIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2xvZy5jCisrKyBiL2ZzL3hmcy94ZnNfbG9nLmMKQEAgLTM5OSwxMCArMzk5LDEwIEBACiB7CiAJeGxvZ190ICpsb2cgPSBtcC0+bV9sb2c7CiAJeGxvZ19pbl9jb3JlX3QJICAqaWNsb2cgPSAoeGxvZ19pbl9jb3JlX3QgKilpY2xvZ19obmRsOwotCWludAlhYm9ydGZsZywgc3BsOworCWludAlhYm9ydGZsZzsKIAogCWNiLT5jYl9uZXh0ID0gTlVMTDsKLQlzcGwgPSBMT0dfTE9DSyhsb2cpOworCXNwaW5fbG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAJYWJvcnRmbGcgPSAoaWNsb2ctPmljX3N0YXRlICYgWExPR19TVEFURV9JT0VSUk9SKTsKIAlpZiAoIWFib3J0ZmxnKSB7CiAJCUFTU0VSVF9BTFdBWVMoKGljbG9nLT5pY19zdGF0ZSA9PSBYTE9HX1NUQVRFX0FDVElWRSkgfHwKQEAgLTQxMSw3ICs0MTEsNyBAQAogCQkqKGljbG9nLT5pY19jYWxsYmFja190YWlsKSA9IGNiOwogCQlpY2xvZy0+aWNfY2FsbGJhY2tfdGFpbCA9ICYoY2ItPmNiX25leHQpOwogCX0KLQlMT0dfVU5MT0NLKGxvZywgc3BsKTsKKwlzcGluX3VubG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAJcmV0dXJuIGFib3J0ZmxnOwogfQkvKiB4ZnNfbG9nX25vdGlmeSAqLwogCkBAIC00OTgsMTEgKzQ5OCwxNCBAQAogICogUmV0dXJuIGVycm9yIG9yIHplcm8uCiAgKi8KIGludAoteGZzX2xvZ19tb3VudCh4ZnNfbW91bnRfdAkqbXAsCi0JICAgICAgeGZzX2J1ZnRhcmdfdAkqbG9nX3RhcmdldCwKLQkgICAgICB4ZnNfZGFkZHJfdAlibGtfb2Zmc2V0LAotCSAgICAgIGludAkJbnVtX2JibGtzKQoreGZzX2xvZ19tb3VudCgKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX2J1ZnRhcmdfdAkqbG9nX3RhcmdldCwKKwl4ZnNfZGFkZHJfdAlibGtfb2Zmc2V0LAorCWludAkJbnVtX2JibGtzKQogeworCWludAkJZXJyb3I7CisKIAlpZiAoIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9OT1JFQ09WRVJZKSkKIAkJY21uX2VycihDRV9OT1RFLCAiWEZTIG1vdW50aW5nIGZpbGVzeXN0ZW0gJXMiLCBtcC0+bV9mc25hbWUpOwogCWVsc2UgewpAQCAtNTE1LDExICs1MTgsMjEgQEAKIAltcC0+bV9sb2cgPSB4bG9nX2FsbG9jX2xvZyhtcCwgbG9nX3RhcmdldCwgYmxrX29mZnNldCwgbnVtX2JibGtzKTsKIAogCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgQUlMIG5vdyB3ZSBoYXZlIGEgbG9nLgorCSAqLworCXNwaW5fbG9ja19pbml0KCZtcC0+bV9haWxfbG9jayk7CisJZXJyb3IgPSB4ZnNfdHJhbnNfYWlsX2luaXQobXApOworCWlmIChlcnJvcikgeworCQljbW5fZXJyKENFX1dBUk4sICJYRlM6IEFJTCBpbml0aWFsaXNhdGlvbiBmYWlsZWQ6IGVycm9yICVkIiwgZXJyb3IpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qCiAJICogc2tpcCBsb2cgcmVjb3Zlcnkgb24gYSBub3JlY292ZXJ5IG1vdW50LiAgcHJldGVuZCBpdCBhbGwKIAkgKiBqdXN0IHdvcmtlZC4KIAkgKi8KIAlpZiAoIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9OT1JFQ09WRVJZKSkgewotCQlpbnQJCWVycm9yLCByZWFkb25seSA9IChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9SRE9OTFkpOworCQlpbnQJcmVhZG9ubHkgPSAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfUkRPTkxZKTsKIAogCQlpZiAocmVhZG9ubHkpCiAJCQltcC0+bV9mbGFncyAmPSB+WEZTX01PVU5UX1JET05MWTsKQEAgLTUzMCw4ICs1NDMsNyBAQAogCQkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX1JET05MWTsKIAkJaWYgKGVycm9yKSB7CiAJCQljbW5fZXJyKENFX1dBUk4sICJYRlM6IGxvZyBtb3VudC9yZWNvdmVyeSBmYWlsZWQ6IGVycm9yICVkIiwgZXJyb3IpOwotCQkJeGxvZ19kZWFsbG9jX2xvZyhtcC0+bV9sb2cpOwotCQkJcmV0dXJuIGVycm9yOworCQkJZ290byBlcnJvcjsKIAkJfQogCX0KIApAQCAtNTQwLDYgKzU1Miw5IEBACiAKIAkvKiBFbmQgbW91bnRpbmcgbWVzc2FnZSBpbiB4ZnNfbG9nX21vdW50X2ZpbmlzaCAqLwogCXJldHVybiAwOworZXJyb3I6CisJeGZzX2xvZ191bm1vdW50X2RlYWxsb2MobXApOworCXJldHVybiBlcnJvcjsKIH0JLyogeGZzX2xvZ19tb3VudCAqLwogCiAvKgpAQCAtNjA2LDcgKzYyMSw2IEBACiAJeGZzX2xvZ190aWNrZXRfdCB0aWMgPSBOVUxMOwogCXhmc19sc25fdAkgbHNuOwogCWludAkJIGVycm9yOwotCVNQTERFQ0wocyk7CiAKIAkvKiB0aGUgZGF0YSBzZWN0aW9uIG11c3QgYmUgMzIgYml0IHNpemUgYWxpZ25lZCAqLwogCXN0cnVjdCB7CkBAIC02NTksMjQgKzY3MywyNCBAQAogCQl9CiAKIAotCQlzID0gTE9HX0xPQ0sobG9nKTsKKwkJc3Bpbl9sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKIAkJaWNsb2cgPSBsb2ctPmxfaWNsb2c7CiAJCWljbG9nLT5pY19yZWZjbnQrKzsKLQkJTE9HX1VOTE9DSyhsb2csIHMpOworCQlzcGluX3VubG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAJCXhsb2dfc3RhdGVfd2FudF9zeW5jKGxvZywgaWNsb2cpOwogCQkodm9pZCkgeGxvZ19zdGF0ZV9yZWxlYXNlX2ljbG9nKGxvZywgaWNsb2cpOwogCi0JCXMgPSBMT0dfTE9DSyhsb2cpOworCQlzcGluX2xvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCQlpZiAoIShpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9BQ1RJVkUgfHwKIAkJICAgICAgaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfRElSVFkpKSB7CiAJCQlpZiAoIVhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpIHsKIAkJCQlzdl93YWl0KCZpY2xvZy0+aWNfZm9yY2VzZW1hLCBQTUVNLAogCQkJCQkmbG9nLT5sX2ljbG9nbG9jaywgcyk7CiAJCQl9IGVsc2UgewotCQkJCUxPR19VTkxPQ0sobG9nLCBzKTsKKwkJCQlzcGluX3VubG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlMT0dfVU5MT0NLKGxvZywgcyk7CisJCQlzcGluX3VubG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAJCX0KIAkJaWYgKHRpYykgewogCQkJeGxvZ190cmFjZV9sb2dncmFudChsb2csIHRpYywgInVubW91bnQgcmVjIik7CkBAIC02OTcsMTUgKzcxMSwxNSBAQAogCQkgKiBhIGZpbGUgc3lzdGVtIHRoYXQgd2VudCBpbnRvIGZvcmNlZF9zaHV0ZG93biBhcwogCQkgKiB0aGUgcmVzdWx0IG9mIGFuIHVubW91bnQuLgogCQkgKi8KLQkJcyA9IExPR19MT0NLKGxvZyk7CisJCXNwaW5fbG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAJCWljbG9nID0gbG9nLT5sX2ljbG9nOwogCQlpY2xvZy0+aWNfcmVmY250Kys7Ci0JCUxPR19VTkxPQ0sobG9nLCBzKTsKKwkJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCiAJCXhsb2dfc3RhdGVfd2FudF9zeW5jKGxvZywgaWNsb2cpOwogCQkodm9pZCkgeGxvZ19zdGF0ZV9yZWxlYXNlX2ljbG9nKGxvZywgaWNsb2cpOwogCi0JCXMgPSBMT0dfTE9DSyhsb2cpOworCQlzcGluX2xvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCiAJCWlmICggISAoICAgaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfQUNUSVZFCiAJCQl8fCBpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9ESVJUWQpAQCAtNzE0LDcgKzcyOCw3IEBACiAJCQkJc3Zfd2FpdCgmaWNsb2ctPmljX2ZvcmNlc2VtYSwgUE1FTSwKIAkJCQkJJmxvZy0+bF9pY2xvZ2xvY2ssIHMpOwogCQl9IGVsc2UgewotCQkJTE9HX1VOTE9DSyhsb2csIHMpOworCQkJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCQl9CiAJfQogCkBAIC03MjMsMTAgKzczNywxNCBAQAogCiAvKgogICogRGVhbGxvY2F0ZSBsb2cgc3RydWN0dXJlcyBmb3IgdW5tb3VudC9yZWxvY2F0aW9uLgorICoKKyAqIFdlIG5lZWQgdG8gc3RvcCB0aGUgYWlsZCBmcm9tIHJ1bm5pbmcgYmVmb3JlIHdlIGRlc3Ryb3kKKyAqIGFuZCBkZWFsbG9jYXRlIHRoZSBsb2cgYXMgdGhlIGFpbGQgcmVmZXJlbmNlcyB0aGUgbG9nLgogICovCiB2b2lkCiB4ZnNfbG9nX3VubW91bnRfZGVhbGxvYyh4ZnNfbW91bnRfdCAqbXApCiB7CisJeGZzX3RyYW5zX2FpbF9kZXN0cm95KG1wKTsKIAl4bG9nX2RlYWxsb2NfbG9nKG1wLT5tX2xvZyk7CiB9CiAKQEAgLTc2MiwyMCArNzgwLDE4IEBACiAJeGxvZ190aWNrZXRfdAkqdGljOwogCXhsb2dfdAkJKmxvZyA9IG1wLT5tX2xvZzsKIAlpbnQJCW5lZWRfYnl0ZXMsIGZyZWVfYnl0ZXMsIGN5Y2xlLCBieXRlczsKLQlTUExERUNMKHMpOwogCiAJaWYgKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpCiAJCXJldHVybjsKLQlBU1NFUlQoIVhGU19GT1JDRURfU0hVVERPV04obXApKTsKIAogCWlmICh0YWlsX2xzbiA9PSAwKSB7CiAJCS8qIG5lZWRlZCBzaW5jZSBzeW5jX2xzbiBpcyA2NCBiaXRzICovCi0JCXMgPSBMT0dfTE9DSyhsb2cpOworCQlzcGluX2xvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCQl0YWlsX2xzbiA9IGxvZy0+bF9sYXN0X3N5bmNfbHNuOwotCQlMT0dfVU5MT0NLKGxvZywgcyk7CisJCXNwaW5fdW5sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKIAl9CiAKLQlzID0gR1JBTlRfTE9DSyhsb2cpOworCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwogCiAJLyogQWxzbyBhbiBpbnZhbGlkIGxzbi4gIDEgaW1wbGllcyB0aGF0IHdlIGFyZW4ndCBwYXNzaW5nIGluIGEgdmFsaWQKIAkgKiB0YWlsX2xzbi4KQEAgLTgyNCw3ICs4NDAsNyBAQAogCQkJdGljID0gdGljLT50X25leHQ7CiAJCX0gd2hpbGUgKHRpYyAhPSBsb2ctPmxfcmVzZXJ2ZV9oZWFkcSk7CiAJfQotCUdSQU5UX1VOTE9DSyhsb2csIHMpOworCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CiB9CS8qIHhmc19sb2dfbW92ZV90YWlsICovCiAKIC8qCkBAIC04MzYsMTQgKzg1MiwxMyBAQAogaW50CiB4ZnNfbG9nX25lZWRfY292ZXJlZCh4ZnNfbW91bnRfdCAqbXApCiB7Ci0JU1BMREVDTChzKTsKIAlpbnQJCW5lZWRlZCA9IDAsIGdlbjsKIAl4bG9nX3QJCSpsb2cgPSBtcC0+bV9sb2c7CiAKIAlpZiAoIXhmc19mc193cml0YWJsZShtcCkpCiAJCXJldHVybiAwOwogCi0JcyA9IExPR19MT0NLKGxvZyk7CisJc3Bpbl9sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKIAlpZiAoKChsb2ctPmxfY292ZXJlZF9zdGF0ZSA9PSBYTE9HX1NUQVRFX0NPVkVSX05FRUQpIHx8CiAJCShsb2ctPmxfY292ZXJlZF9zdGF0ZSA9PSBYTE9HX1NUQVRFX0NPVkVSX05FRUQyKSkKIAkJCSYmICF4ZnNfdHJhbnNfZmlyc3RfYWlsKG1wLCAmZ2VuKQpAQCAtODU2LDcgKzg3MSw3IEBACiAJCX0KIAkJbmVlZGVkID0gMTsKIAl9Ci0JTE9HX1VOTE9DSyhsb2csIHMpOworCXNwaW5fdW5sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKIAlyZXR1cm4gbmVlZGVkOwogfQogCkBAIC04ODEsMTcgKzg5NiwxNiBAQAogeGxvZ19hc3NpZ25fdGFpbF9sc24oeGZzX21vdW50X3QgKm1wKQogewogCXhmc19sc25fdCB0YWlsX2xzbjsKLQlTUExERUNMKHMpOwogCXhsb2dfdAkgICpsb2cgPSBtcC0+bV9sb2c7CiAKIAl0YWlsX2xzbiA9IHhmc190cmFuc190YWlsX2FpbChtcCk7Ci0JcyA9IEdSQU5UX0xPQ0sobG9nKTsKKwlzcGluX2xvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKIAlpZiAodGFpbF9sc24gIT0gMCkgewogCQlsb2ctPmxfdGFpbF9sc24gPSB0YWlsX2xzbjsKIAl9IGVsc2UgewogCQl0YWlsX2xzbiA9IGxvZy0+bF90YWlsX2xzbiA9IGxvZy0+bF9sYXN0X3N5bmNfbHNuOwogCX0KLQlHUkFOVF9VTkxPQ0sobG9nLCBzKTsKKwlzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwogCiAJcmV0dXJuIHRhaWxfbHNuOwogfQkvKiB4bG9nX2Fzc2lnbl90YWlsX2xzbiAqLwpAQCAtOTExLDcgKzkyNSw3IEBACiAgKiB0aGUgdGFpbC4gIFRoZSBkZXRhaWxzIG9mIHRoaXMgY2FzZSBhcmUgZGVzY3JpYmVkIGJlbG93LCBidXQgdGhlIGVuZAogICogcmVzdWx0IGlzIHRoYXQgd2UgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBsb2cgYXMgdGhlIGFtb3VudCBvZiBzcGFjZSBsZWZ0LgogICovCi1pbnQKK1NUQVRJQyBpbnQKIHhsb2dfc3BhY2VfbGVmdCh4bG9nX3QgKmxvZywgaW50IGN5Y2xlLCBpbnQgYnl0ZXMpCiB7CiAJaW50IGZyZWVfYnl0ZXM7CkBAIC0xMTY1LDcgKzExNzksNyBAQAogCWxvZy0+bF9mbGFncwkgICB8PSBYTE9HX0FDVElWRV9SRUNPVkVSWTsKIAogCWxvZy0+bF9wcmV2X2Jsb2NrICA9IC0xOwotCUFTU0lHTl9BTllfTFNOX0hPU1QobG9nLT5sX3RhaWxfbHNuLCAxLCAwKTsKKwlsb2ctPmxfdGFpbF9sc24JICAgPSB4bG9nX2Fzc2lnbl9sc24oMSwgMCk7CiAJLyogbG9nLT5sX3RhaWxfbHNuID0gMHgxMDAwMDAwMDBMTDsgY3ljbGUgPSAxOyBjdXJyZW50IGJsb2NrID0gMCAqLwogCWxvZy0+bF9sYXN0X3N5bmNfbHNuID0gbG9nLT5sX3RhaWxfbHNuOwogCWxvZy0+bF9jdXJyX2N5Y2xlICA9IDE7CSAgICAvKiAwIGlzIGJhZCBzaW5jZSB0aGlzIGlzIGluaXRpYWwgdmFsdWUgKi8KQEAgLTExOTMsOCArMTIwNyw4IEBACiAJQVNTRVJUKFhGU19CVUZfVkFMVVNFTUEoYnApIDw9IDApOwogCWxvZy0+bF94YnVmID0gYnA7CiAKLQlzcGlubG9ja19pbml0KCZsb2ctPmxfaWNsb2dsb2NrLCAiaWNsb2ciKTsKLQlzcGlubG9ja19pbml0KCZsb2ctPmxfZ3JhbnRfbG9jaywgImdyaGVhZF9pY2xvZyIpOworCXNwaW5fbG9ja19pbml0KCZsb2ctPmxfaWNsb2dsb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmbG9nLT5sX2dyYW50X2xvY2spOwogCWluaXRuc2VtYSgmbG9nLT5sX2ZsdXNoc2VtYSwgMCwgImljLWZsdXNoIik7CiAJeGxvZ19zdGF0ZV90aWNrZXRfYWxsb2MobG9nKTsgIC8qIHdhaXQgdW50aWwgYWZ0ZXIgaWNsb2dsb2NrIGluaXRlZCAqLwogCkBAIC0xMjMxLDEyICsxMjQ1LDEyIEBACiAKIAkJaGVhZCA9ICZpY2xvZy0+aWNfaGVhZGVyOwogCQltZW1zZXQoaGVhZCwgMCwgc2l6ZW9mKHhsb2dfcmVjX2hlYWRlcl90KSk7Ci0JCUlOVF9TRVQoaGVhZC0+aF9tYWdpY25vLCBBUkNIX0NPTlZFUlQsIFhMT0dfSEVBREVSX01BR0lDX05VTSk7Ci0JCUlOVF9TRVQoaGVhZC0+aF92ZXJzaW9uLCBBUkNIX0NPTlZFUlQsCisJCWhlYWQtPmhfbWFnaWNubyA9IGNwdV90b19iZTMyKFhMT0dfSEVBREVSX01BR0lDX05VTSk7CisJCWhlYWQtPmhfdmVyc2lvbiA9IGNwdV90b19iZTMyKAogCQkJWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoJmxvZy0+bF9tcC0+bV9zYikgPyAyIDogMSk7Ci0JCUlOVF9TRVQoaGVhZC0+aF9zaXplLCBBUkNIX0NPTlZFUlQsIGxvZy0+bF9pY2xvZ19zaXplKTsKKwkJaGVhZC0+aF9zaXplID0gY3B1X3RvX2JlMzIobG9nLT5sX2ljbG9nX3NpemUpOwogCQkvKiBuZXcgZmllbGRzICovCi0JCUlOVF9TRVQoaGVhZC0+aF9mbXQsIEFSQ0hfQ09OVkVSVCwgWExPR19GTVQpOworCQloZWFkLT5oX2ZtdCA9IGNwdV90b19iZTMyKFhMT0dfRk1UKTsKIAkJbWVtY3B5KCZoZWFkLT5oX2ZzX3V1aWQsICZtcC0+bV9zYi5zYl91dWlkLCBzaXplb2YodXVpZF90KSk7CiAKIApAQCAtMTI5Myw3ICsxMzA3LDcgQEAKICAqIHB1c2hlcyBvbiBhbiBsc24gd2hpY2ggaXMgZnVydGhlciBhbG9uZyBpbiB0aGUgbG9nIG9uY2Ugd2UgcmVhY2ggdGhlIGhpZ2gKICAqIHdhdGVyIG1hcmsuICBJbiB0aGlzIG1hbm5lciwgd2Ugd291bGQgYmUgY3JlYXRpbmcgYSBsb3cgd2F0ZXIgbWFyay4KICAqLwotdm9pZAorU1RBVElDIHZvaWQKIHhsb2dfZ3JhbnRfcHVzaF9haWwoeGZzX21vdW50X3QJKm1wLAogCQkgICAgaW50CQluZWVkX2J5dGVzKQogewpAQCAtMTMwNSwxMSArMTMxOSwxMCBAQAogICAgIGludAkJdGhyZXNob2xkX2Jsb2NrOwkvKiBibG9jayBpbiBsc24gd2UnZCBsaWtlIHRvIGJlIGF0ICovCiAgICAgaW50CQl0aHJlc2hvbGRfY3ljbGU7CS8qIGxzbiBjeWNsZSB3ZSdkIGxpa2UgdG8gYmUgYXQgKi8KICAgICBpbnQJCWZyZWVfdGhyZXNob2xkOwotICAgIFNQTERFQ0wocyk7CiAKICAgICBBU1NFUlQoQlRPQkIobmVlZF9ieXRlcykgPCBsb2ctPmxfbG9nQkJzaXplKTsKIAotICAgIHMgPSBHUkFOVF9MT0NLKGxvZyk7CisgICAgc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CiAgICAgZnJlZV9ieXRlcyA9IHhsb2dfc3BhY2VfbGVmdChsb2csCiAJCQkJIGxvZy0+bF9ncmFudF9yZXNlcnZlX2N5Y2xlLAogCQkJCSBsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyk7CkBAIC0xMzMxLDggKzEzNDQsNyBAQAogCSAgICB0aHJlc2hvbGRfYmxvY2sgLT0gbG9nLT5sX2xvZ0JCc2l6ZTsKIAkgICAgdGhyZXNob2xkX2N5Y2xlICs9IDE7CiAJfQotCUFTU0lHTl9BTllfTFNOX0hPU1QodGhyZXNob2xkX2xzbiwgdGhyZXNob2xkX2N5Y2xlLAotCQkgICAgICAgdGhyZXNob2xkX2Jsb2NrKTsKKwl0aHJlc2hvbGRfbHNuID0geGxvZ19hc3NpZ25fbHNuKHRocmVzaG9sZF9jeWNsZSwgdGhyZXNob2xkX2Jsb2NrKTsKIAogCS8qIERvbid0IHBhc3MgaW4gYW4gbHNuIGdyZWF0ZXIgdGhhbiB0aGUgbHNuIG9mIHRoZSBsYXN0CiAJICogbG9nIHJlY29yZCBrbm93biB0byBiZSBvbiBkaXNrLgpAQCAtMTM0MCw3ICsxMzUyLDcgQEAKIAlpZiAoWEZTX0xTTl9DTVAodGhyZXNob2xkX2xzbiwgbG9nLT5sX2xhc3Rfc3luY19sc24pID4gMCkKIAkgICAgdGhyZXNob2xkX2xzbiA9IGxvZy0+bF9sYXN0X3N5bmNfbHNuOwogICAgIH0KLSAgICBHUkFOVF9VTkxPQ0sobG9nLCBzKTsKKyAgICBzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwogCiAgICAgLyoKICAgICAgKiBHZXQgdGhlIHRyYW5zYWN0aW9uIGxheWVyIHRvIGtpY2sgdGhlIGRpcnR5IGJ1ZmZlcnMgb3V0IHRvCkBAIC0xMzc4LDE5ICsxMzkwLDE4IEBACiAgKiBpcyBhZGRlZCBpbW1lZGlhdGVseSBiZWZvcmUgY2FsbGluZyBid3JpdGUoKS4KICAqLwogCi1pbnQKK1NUQVRJQyBpbnQKIHhsb2dfc3luYyh4bG9nX3QJCSpsb2csCiAJICB4bG9nX2luX2NvcmVfdAkqaWNsb2cpCiB7CiAJeGZzX2NhZGRyX3QJZHB0cjsJCS8qIHBvaW50ZXIgdG8gYnl0ZSBzaXplZCBlbGVtZW50ICovCiAJeGZzX2J1Zl90CSpicDsKLQlpbnQJCWksIG9wczsKKwlpbnQJCWk7CiAJdWludAkJY291bnQ7CQkvKiBieXRlIGNvdW50IG9mIGJ3cml0ZSAqLwogCXVpbnQJCWNvdW50X2luaXQ7CS8qIGluaXRpYWwgY291bnQgYmVmb3JlIHJvdW5kdXAgKi8KIAlpbnQJCXJvdW5kb2ZmOyAgICAgICAvKiByb3VuZG9mZiB0byBCQiBvciBzdHJpcGUgKi8KIAlpbnQJCXNwbGl0ID0gMDsJLyogc3BsaXQgd3JpdGUgaW50byB0d28gcmVnaW9ucyAqLwogCWludAkJZXJyb3I7Ci0JU1BMREVDTChzKTsKIAlpbnQJCXYyID0gWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoJmxvZy0+bF9tcC0+bV9zYik7CiAKIAlYRlNfU1RBVFNfSU5DKHhzX2xvZ193cml0ZXMpOwpAQCAtMTQxNSwzMCArMTQyNiwyNiBAQAogCQkgcm91bmRvZmYgPCBCQlRPQigxKSkpOwogCiAJLyogbW92ZSBncmFudCBoZWFkcyBieSByb3VuZG9mZiBpbiBzeW5jICovCi0JcyA9IEdSQU5UX0xPQ0sobG9nKTsKKwlzcGluX2xvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKIAl4bG9nX2dyYW50X2FkZF9zcGFjZShsb2csIHJvdW5kb2ZmKTsKLQlHUkFOVF9VTkxPQ0sobG9nLCBzKTsKKwlzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwogCiAJLyogcHV0IGN5Y2xlIG51bWJlciBpbiBldmVyeSBibG9jayAqLwogCXhsb2dfcGFja19kYXRhKGxvZywgaWNsb2csIHJvdW5kb2ZmKTsgCiAKIAkvKiByZWFsIGJ5dGUgbGVuZ3RoICovCiAJaWYgKHYyKSB7Ci0JCUlOVF9TRVQoaWNsb2ctPmljX2hlYWRlci5oX2xlbiwgCi0JCQlBUkNIX0NPTlZFUlQsCi0JCQlpY2xvZy0+aWNfb2Zmc2V0ICsgcm91bmRvZmYpOworCQlpY2xvZy0+aWNfaGVhZGVyLmhfbGVuID0KKwkJCWNwdV90b19iZTMyKGljbG9nLT5pY19vZmZzZXQgKyByb3VuZG9mZik7CiAJfSBlbHNlIHsKLQkJSU5UX1NFVChpY2xvZy0+aWNfaGVhZGVyLmhfbGVuLCBBUkNIX0NPTlZFUlQsIGljbG9nLT5pY19vZmZzZXQpOworCQlpY2xvZy0+aWNfaGVhZGVyLmhfbGVuID0KKwkJCWNwdV90b19iZTMyKGljbG9nLT5pY19vZmZzZXQpOwogCX0KIAotCS8qIHB1dCBvcHMgY291bnQgaW4gY29ycmVjdCBvcmRlciAqLwotCW9wcyA9IGljbG9nLT5pY19oZWFkZXIuaF9udW1fbG9nb3BzOwotCUlOVF9TRVQoaWNsb2ctPmljX2hlYWRlci5oX251bV9sb2dvcHMsIEFSQ0hfQ09OVkVSVCwgb3BzKTsKLQogCWJwID0gaWNsb2ctPmljX2JwOwogCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURTIoYnAsIHVuc2lnbmVkIGxvbmcpID09ICh1bnNpZ25lZCBsb25nKTEpOwogCVhGU19CVUZfU0VUX0ZTUFJJVkFURTIoYnAsICh1bnNpZ25lZCBsb25nKTIpOwotCVhGU19CVUZfU0VUX0FERFIoYnAsIEJMT0NLX0xTTihJTlRfR0VUKGljbG9nLT5pY19oZWFkZXIuaF9sc24sIEFSQ0hfQ09OVkVSVCkpKTsKKwlYRlNfQlVGX1NFVF9BRERSKGJwLCBCTE9DS19MU04oYmU2NF90b19jcHUoaWNsb2ctPmljX2hlYWRlci5oX2xzbikpKTsKIAogCVhGU19TVEFUU19BREQoeHNfbG9nX2Jsb2NrcywgQlRPQkIoY291bnQpKTsKIApAQCAtMTUwMSwxMCArMTUwOCwxMCBAQAogCQkgKiBhIG5ldyBjeWNsZS4gIFdhdGNoIG91dCBmb3IgdGhlIGhlYWRlciBtYWdpYyBudW1iZXIKIAkJICogY2FzZSwgdGhvdWdoLgogCQkgKi8KLQkJZm9yIChpPTA7IGk8c3BsaXQ7IGkgKz0gQkJTSVpFKSB7Ci0JCQlJTlRfTU9EKCoodWludCAqKWRwdHIsIEFSQ0hfQ09OVkVSVCwgKzEpOwotCQkJaWYgKElOVF9HRVQoKih1aW50ICopZHB0ciwgQVJDSF9DT05WRVJUKSA9PSBYTE9HX0hFQURFUl9NQUdJQ19OVU0pCi0JCQkJSU5UX01PRCgqKHVpbnQgKilkcHRyLCBBUkNIX0NPTlZFUlQsICsxKTsKKwkJZm9yIChpID0gMDsgaSA8IHNwbGl0OyBpICs9IEJCU0laRSkgeworCQkJYmUzMl9hZGQoKF9fYmUzMiAqKWRwdHIsIDEpOworCQkJaWYgKGJlMzJfdG9fY3B1KCooX19iZTMyICopZHB0cikgPT0gWExPR19IRUFERVJfTUFHSUNfTlVNKQorCQkJCWJlMzJfYWRkKChfX2JlMzIgKilkcHRyLCAxKTsKIAkJCWRwdHIgKz0gQkJTSVpFOwogCQl9CiAKQEAgLTE1MjcsMTQgKzE1MzQsMTMgQEAKIC8qCiAgKiBEZWFsbG9jYXRlIGEgbG9nIHN0cnVjdHVyZQogICovCi12b2lkCitTVEFUSUMgdm9pZAogeGxvZ19kZWFsbG9jX2xvZyh4bG9nX3QgKmxvZykKIHsKIAl4bG9nX2luX2NvcmVfdAkqaWNsb2csICpuZXh0X2ljbG9nOwogCXhsb2dfdGlja2V0X3QJKnRpYywgKm5leHRfdGljOwogCWludAkJaTsKIAotCiAJaWNsb2cgPSBsb2ctPmxfaWNsb2c7CiAJZm9yIChpPTA7IGk8bG9nLT5sX2ljbG9nX2J1ZnM7IGkrKykgewogCQlzdl9kZXN0cm95KCZpY2xvZy0+aWNfZm9yY2VzZW1hKTsKQEAgLTE1NjUsNyArMTU3MSw3IEBACiAJCXRpYyA9IGxvZy0+bF91bm1vdW50X2ZyZWU7CiAJCXdoaWxlICh0aWMpIHsKIAkJCW5leHRfdGljID0gdGljLT50X25leHQ7Ci0JCQlrbWVtX2ZyZWUodGljLCBOQlBQKTsKKwkJCWttZW1fZnJlZSh0aWMsIFBBR0VfU0laRSk7CiAJCQl0aWMgPSBuZXh0X3RpYzsKIAkJfQogCX0KQEAgLTE1OTIsMTQgKzE1OTgsMTIgQEAKIAkJICAgICAgIGludAkJcmVjb3JkX2NudCwKIAkJICAgICAgIGludAkJY29weV9ieXRlcykKIHsKLQlTUExERUNMKHMpOworCXNwaW5fbG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAKLQlzID0gTE9HX0xPQ0sobG9nKTsKLQotCWljbG9nLT5pY19oZWFkZXIuaF9udW1fbG9nb3BzICs9IHJlY29yZF9jbnQ7CisJYmUzMl9hZGQoJmljbG9nLT5pY19oZWFkZXIuaF9udW1fbG9nb3BzLCByZWNvcmRfY250KTsKIAlpY2xvZy0+aWNfb2Zmc2V0ICs9IGNvcHlfYnl0ZXM7CiAKLQlMT0dfVU5MT0NLKGxvZywgcyk7CisJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogfQkvKiB4bG9nX3N0YXRlX2ZpbmlzaF9jb3B5ICovCiAKIApAQCAtMTc1Miw3ICsxNzU2LDcgQEAKICAqCXdlIGRvbid0IHVwZGF0ZSBpY19vZmZzZXQgdW50aWwgdGhlIGVuZCB3aGVuIHdlIGtub3cgZXhhY3RseSBob3cgbWFueQogICoJYnl0ZXMgaGF2ZSBiZWVuIHdyaXR0ZW4gb3V0LgogICovCi1pbnQKK1NUQVRJQyBpbnQKIHhsb2dfd3JpdGUoeGZzX21vdW50X3QgKgltcCwKIAkgICB4ZnNfbG9nX2lvdmVjX3QJcmVnW10sCiAJICAgaW50CQkJbmVudHJpZXMsCkBAIC0xODIzLDcgKzE4MjcsNyBAQAogCiAJLyogc3RhcnRfbHNuIGlzIHRoZSBmaXJzdCBsc24gd3JpdHRlbiB0by4gVGhhdCdzIGFsbCB3ZSBuZWVkLiAqLwogCWlmICghICpzdGFydF9sc24pCi0JICAgICpzdGFydF9sc24gPSBJTlRfR0VUKGljbG9nLT5pY19oZWFkZXIuaF9sc24sIEFSQ0hfQ09OVkVSVCk7CisJICAgICpzdGFydF9sc24gPSBiZTY0X3RvX2NwdShpY2xvZy0+aWNfaGVhZGVyLmhfbHNuKTsKIAogCS8qIFRoaXMgbG9vcCB3cml0ZXMgb3V0IGFzIG1hbnkgcmVnaW9ucyBhcyBjYW4gZml0IGluIHRoZSBhbW91bnQKIAkgKiBvZiBzcGFjZSB3aGljaCB3YXMgYWxsb2NhdGVkIGJ5IHhsb2dfc3RhdGVfZ2V0X2ljbG9nX3NwYWNlKCkuCkBAIC0xODM5LDcgKzE4NDMsNyBAQAogCSAgICAgKi8KIAkgICAgaWYgKHRpY2tldC0+dF9mbGFncyAmIFhMT0dfVElDX0lOSVRFRCkgewogCQlsb2dvcF9oZWFkCQk9ICh4bG9nX29wX2hlYWRlcl90ICopcHRyOwotCQlJTlRfU0VUKGxvZ29wX2hlYWQtPm9oX3RpZCwgQVJDSF9DT05WRVJULCB0aWNrZXQtPnRfdGlkKTsKKwkJbG9nb3BfaGVhZC0+b2hfdGlkCT0gY3B1X3RvX2JlMzIodGlja2V0LT50X3RpZCk7CiAJCWxvZ29wX2hlYWQtPm9oX2NsaWVudGlkID0gdGlja2V0LT50X2NsaWVudGlkOwogCQlsb2dvcF9oZWFkLT5vaF9sZW4JPSAwOwogCQlsb2dvcF9oZWFkLT5vaF9mbGFncyAgICA9IFhMT0dfU1RBUlRfVFJBTlM7CkBAIC0xODUzLDcgKzE4NTcsNyBAQAogCiAJICAgIC8qIENvcHkgbG9nIG9wZXJhdGlvbiBoZWFkZXIgZGlyZWN0bHkgaW50byBkYXRhIHNlY3Rpb24gKi8KIAkgICAgbG9nb3BfaGVhZAkJCT0gKHhsb2dfb3BfaGVhZGVyX3QgKilwdHI7Ci0JICAgIElOVF9TRVQobG9nb3BfaGVhZC0+b2hfdGlkLCBBUkNIX0NPTlZFUlQsIHRpY2tldC0+dF90aWQpOworCSAgICBsb2dvcF9oZWFkLT5vaF90aWQJCT0gY3B1X3RvX2JlMzIodGlja2V0LT50X3RpZCk7CiAJICAgIGxvZ29wX2hlYWQtPm9oX2NsaWVudGlkCT0gdGlja2V0LT50X2NsaWVudGlkOwogCSAgICBsb2dvcF9oZWFkLT5vaF9yZXMyCQk9IDA7CiAKQEAgLTE4ODgsMTMgKzE4OTIsMTQgQEAKIAogCSAgICBjb3B5X29mZiA9IHBhcnRpYWxfY29weV9sZW47CiAJICAgIGlmIChuZWVkX2NvcHkgPD0gaWNsb2ctPmljX3NpemUgLSBsb2dfb2Zmc2V0KSB7IC8qY29tcGxldGUgd3JpdGUgKi8KLQkJSU5UX1NFVChsb2dvcF9oZWFkLT5vaF9sZW4sIEFSQ0hfQ09OVkVSVCwgY29weV9sZW4gPSBuZWVkX2NvcHkpOworCSAgICAgICAgY29weV9sZW4gPSBuZWVkX2NvcHk7CisJCWxvZ29wX2hlYWQtPm9oX2xlbiA9IGNwdV90b19iZTMyKGNvcHlfbGVuKTsKIAkJaWYgKHBhcnRpYWxfY29weSkKIAkJICAgIGxvZ29wX2hlYWQtPm9oX2ZsYWdzfD0gKFhMT0dfRU5EX1RSQU5TfFhMT0dfV0FTX0NPTlRfVFJBTlMpOwogCQlwYXJ0aWFsX2NvcHlfbGVuID0gcGFydGlhbF9jb3B5ID0gMDsKIAkgICAgfSBlbHNlIHsJCQkJCSAgICAvKiBwYXJ0aWFsIHdyaXRlICovCiAJCWNvcHlfbGVuID0gaWNsb2ctPmljX3NpemUgLSBsb2dfb2Zmc2V0OwotCQlJTlRfU0VUKGxvZ29wX2hlYWQtPm9oX2xlbiwgQVJDSF9DT05WRVJULCBjb3B5X2xlbik7CisJCWxvZ29wX2hlYWQtPm9oX2xlbiA9IGNwdV90b19iZTMyKGNvcHlfbGVuKTsKIAkJbG9nb3BfaGVhZC0+b2hfZmxhZ3MgfD0gWExPR19DT05USU5VRV9UUkFOUzsKIAkJaWYgKHBhcnRpYWxfY29weSkKIAkJCWxvZ29wX2hlYWQtPm9oX2ZsYWdzIHw9IFhMT0dfV0FTX0NPTlRfVFJBTlM7CkBAIC0xOTkyLDcgKzE5OTcsOCBAQAogCQkJICogV2UgZG9uJ3QgbmVlZCB0byBjb3ZlciB0aGUgZHVtbXkuCiAJCQkgKi8KIAkJCWlmICghY2hhbmdlZCAmJgotCQkJICAgKElOVF9HRVQoaWNsb2ctPmljX2hlYWRlci5oX251bV9sb2dvcHMsIEFSQ0hfQ09OVkVSVCkgPT0gWExPR19DT1ZFUl9PUFMpKSB7CisJCQkgICAoYmUzMl90b19jcHUoaWNsb2ctPmljX2hlYWRlci5oX251bV9sb2dvcHMpID09CisJCQkgICAJCVhMT0dfQ09WRVJfT1BTKSkgewogCQkJCWNoYW5nZWQgPSAxOwogCQkJfSBlbHNlIHsKIAkJCQkvKgpAQCAtMjA2MCw3ICsyMDY2LDcgQEAKIAlsb3dlc3RfbHNuID0gMDsKIAlkbyB7CiAJICAgIGlmICghKGxzbl9sb2ctPmljX3N0YXRlICYgKFhMT0dfU1RBVEVfQUNUSVZFfFhMT0dfU1RBVEVfRElSVFkpKSkgewotCQlsc24gPSBJTlRfR0VUKGxzbl9sb2ctPmljX2hlYWRlci5oX2xzbiwgQVJDSF9DT05WRVJUKTsKKwkJbHNuID0gYmU2NF90b19jcHUobHNuX2xvZy0+aWNfaGVhZGVyLmhfbHNuKTsKIAkJaWYgKChsc24gJiYgIWxvd2VzdF9sc24pIHx8CiAJCSAgICAoWEZTX0xTTl9DTVAobHNuLCBsb3dlc3RfbHNuKSA8IDApKSB7CiAJCQlsb3dlc3RfbHNuID0gbHNuOwpAQCAtMjA4OSw5ICsyMDk1LDggQEAKIAlpbnQJCSAgIGZ1bmNkaWRjYWxsYmFja3M7IC8qIGZsYWc6IGZ1bmN0aW9uIGRpZCBjYWxsYmFja3MgKi8KIAlpbnQJCSAgIHJlcGVhdHM7CS8qIGZvciBpc3N1aW5nIGNvbnNvbGUgd2FybmluZ3MgaWYKIAkJCQkJICogbG9vcGluZyB0b28gbWFueSB0aW1lcyAqLwotCVNQTERFQ0wocyk7CiAKLQlzID0gTE9HX0xPQ0sobG9nKTsKKwlzcGluX2xvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCWZpcnN0X2ljbG9nID0gaWNsb2cgPSBsb2ctPmxfaWNsb2c7CiAJaW9lcnJvcnMgPSAwOwogCWZ1bmNkaWRjYWxsYmFja3MgPSAwOwpAQCAtMjEzNiw3ICsyMTQxLDcgQEAKIAkJCQkgKiB0byBET19DQUxMQkFDSywgd2Ugd2lsbCBub3QgcHJvY2VzcyBpdCB3aGVuCiAJCQkJICogd2UgcmV0cnkgc2luY2UgYSBwcmV2aW91cyBpY2xvZyBpcyBpbiB0aGUKIAkJCQkgKiBDQUxMQkFDSyBhbmQgdGhlIHN0YXRlIGNhbm5vdCBjaGFuZ2Ugc2luY2UKLQkJCQkgKiB3ZSBhcmUgaG9sZGluZyB0aGUgTE9HX0xPQ0suCisJCQkJICogd2UgYXJlIGhvbGRpbmcgdGhlIGxfaWNsb2dsb2NrLgogCQkJCSAqLwogCQkJCWlmICghKGljbG9nLT5pY19zdGF0ZSAmCiAJCQkJCShYTE9HX1NUQVRFX0RPTkVfU1lOQyB8CkBAIC0yMTYyLDExICsyMTY3LDkgQEAKIAkJCQkgKi8KIAogCQkJCWxvd2VzdF9sc24gPSB4bG9nX2dldF9sb3dlc3RfbHNuKGxvZyk7Ci0JCQkJaWYgKGxvd2VzdF9sc24gJiYgKAotCQkJCQlYRlNfTFNOX0NNUCgKLQkJCQkJCWxvd2VzdF9sc24sCi0JCQkJCQlJTlRfR0VUKGljbG9nLT5pY19oZWFkZXIuaF9sc24sIEFSQ0hfQ09OVkVSVCkKLQkJCQkJKTwwKSkgeworCQkJCWlmIChsb3dlc3RfbHNuICYmCisJCQkJICAgIFhGU19MU05fQ01QKGxvd2VzdF9sc24sCisJCQkJICAgIAkJYmU2NF90b19jcHUoaWNsb2ctPmljX2hlYWRlci5oX2xzbikpIDwgMCkgewogCQkJCQlpY2xvZyA9IGljbG9nLT5pY19uZXh0OwogCQkJCQljb250aW51ZTsgLyogTGVhdmUgdGhpcyBpY2xvZyBmb3IKIAkJCQkJCSAgICogYW5vdGhlciB0aHJlYWQgKi8KQEAgLTIxNzQsMTkgKzIxNzcsMTggQEAKIAogCQkJCWljbG9nLT5pY19zdGF0ZSA9IFhMT0dfU1RBVEVfQ0FMTEJBQ0s7CiAKLQkJCQlMT0dfVU5MT0NLKGxvZywgcyk7CisJCQkJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCiAJCQkJLyogbF9sYXN0X3N5bmNfbHNuIGZpZWxkIHByb3RlY3RlZCBieQotCQkJCSAqIEdSQU5UX0xPQ0suIERvbid0IHdvcnJ5IGFib3V0IGljbG9nJ3MgbHNuLgorCQkJCSAqIGxfZ3JhbnRfbG9jay4gRG9uJ3Qgd29ycnkgYWJvdXQgaWNsb2cncyBsc24uCiAJCQkJICogTm8gb25lIGVsc2UgY2FuIGJlIGhlcmUgZXhjZXB0IHVzLgogCQkJCSAqLwotCQkJCXMgPSBHUkFOVF9MT0NLKGxvZyk7Ci0JCQkJQVNTRVJUKFhGU19MU05fQ01QKAotCQkJCQkJbG9nLT5sX2xhc3Rfc3luY19sc24sCi0JCQkJCQlJTlRfR0VUKGljbG9nLT5pY19oZWFkZXIuaF9sc24sIEFSQ0hfQ09OVkVSVCkKLQkJCQkJKTw9MCk7Ci0JCQkJbG9nLT5sX2xhc3Rfc3luY19sc24gPSBJTlRfR0VUKGljbG9nLT5pY19oZWFkZXIuaF9sc24sIEFSQ0hfQ09OVkVSVCk7Ci0JCQkJR1JBTlRfVU5MT0NLKGxvZywgcyk7CisJCQkJc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CisJCQkJQVNTRVJUKFhGU19MU05fQ01QKGxvZy0+bF9sYXN0X3N5bmNfbHNuLAorCQkJCSAgICAgICBiZTY0X3RvX2NwdShpY2xvZy0+aWNfaGVhZGVyLmhfbHNuKSkgPD0gMCk7CisJCQkJbG9nLT5sX2xhc3Rfc3luY19sc24gPQorCQkJCQliZTY0X3RvX2NwdShpY2xvZy0+aWNfaGVhZGVyLmhfbHNuKTsKKwkJCQlzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwogCiAJCQkJLyoKIAkJCQkgKiBLZWVwIHByb2Nlc3NpbmcgZW50cmllcyBpbiB0aGUgY2FsbGJhY2sgbGlzdApAQCAtMjE5NSw3ICsyMTk3LDcgQEAKIAkJCQkgKiBlbXB0eSBhbmQgY2hhbmdlIHRoZSBzdGF0ZSB0byBESVJUWSBzbyB0aGF0CiAJCQkJICogd2UgZG9uJ3QgbWlzcyBhbnkgbW9yZSBjYWxsYmFja3MgYmVpbmcgYWRkZWQuCiAJCQkJICovCi0JCQkJcyA9IExPR19MT0NLKGxvZyk7CisJCQkJc3Bpbl9sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKIAkJCX0gZWxzZSB7CiAJCQkJaW9lcnJvcnMrKzsKIAkJCX0KQEAgLTIyMDQsMTQgKzIyMDYsMTQgQEAKIAkJCXdoaWxlIChjYikgewogCQkJCWljbG9nLT5pY19jYWxsYmFja190YWlsID0gJihpY2xvZy0+aWNfY2FsbGJhY2spOwogCQkJCWljbG9nLT5pY19jYWxsYmFjayA9IE5VTEw7Ci0JCQkJTE9HX1VOTE9DSyhsb2csIHMpOworCQkJCXNwaW5fdW5sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKIAogCQkJCS8qIHBlcmZvcm0gY2FsbGJhY2tzIGluIHRoZSBvcmRlciBnaXZlbiAqLwogCQkJCWZvciAoOyBjYjsgY2IgPSBjYl9uZXh0KSB7CiAJCQkJCWNiX25leHQgPSBjYi0+Y2JfbmV4dDsKIAkJCQkJY2ItPmNiX2Z1bmMoY2ItPmNiX2FyZywgYWJvcnRlZCk7CiAJCQkJfQotCQkJCXMgPSBMT0dfTE9DSyhsb2cpOworCQkJCXNwaW5fbG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAJCQkJY2IgPSBpY2xvZy0+aWNfY2FsbGJhY2s7CiAJCQl9CiAKQEAgLTIyNTgsNyArMjI2MCw3IEBACiAJCQkgKgogCQkJICogU1lOQ0lORyAtIGkvbyBjb21wbGV0aW9uIHdpbGwgZ28gdGhyb3VnaCBsb2dzCiAJCQkgKiBET05FX1NZTkMgLSBpbnRlcnJ1cHQgdGhyZWFkIHNob3VsZCBiZSB3YWl0aW5nIGZvcgotCQkJICogICAgICAgICAgICAgIExPR19MT0NLCisJCQkgKiAgICAgICAgICAgICAgbF9pY2xvZ2xvY2sKIAkJCSAqIElPRVJST1IgLSBnaXZlIHVwIGhvcGUgYWxsIHllIHdobyBlbnRlciBoZXJlCiAJCQkgKi8KIAkJCWlmIChpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9XQU5UX1NZTkMgfHwKQEAgLTIyNzYsNyArMjI3OCw3IEBACiAJCWZsdXNoY250ID0gbG9nLT5sX2ZsdXNoY250OwogCQlsb2ctPmxfZmx1c2hjbnQgPSAwOwogCX0KLQlMT0dfVU5MT0NLKGxvZywgcyk7CisJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCXdoaWxlIChmbHVzaGNudC0tKQogCQl2c2VtYSgmbG9nLT5sX2ZsdXNoc2VtYSk7CiB9CS8qIHhsb2dfc3RhdGVfZG9fY2FsbGJhY2sgKi8KQEAgLTIyOTYsMTUgKzIyOTgsMTQgQEAKICAqIGdsb2JhbCBzdGF0ZSBtYWNoaW5lIGxvZyBsb2NrLiAgQXNzdW1lIHRoYXQgdGhlIGNhbGxzIHRvIGN2c2VtYSB3b24ndAogICogdGFrZSBhIGxvbmcgdGltZS4gIEF0IGxlYXN0IHdlIGtub3cgaXQgd29uJ3Qgc2xlZXAuCiAgKi8KLXZvaWQKK1NUQVRJQyB2b2lkCiB4bG9nX3N0YXRlX2RvbmVfc3luY2luZygKIAl4bG9nX2luX2NvcmVfdAkqaWNsb2csCiAJaW50CQlhYm9ydGVkKQogewogCXhsb2dfdAkJICAgKmxvZyA9IGljbG9nLT5pY19sb2c7Ci0JU1BMREVDTChzKTsKIAotCXMgPSBMT0dfTE9DSyhsb2cpOworCXNwaW5fbG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAKIAlBU1NFUlQoaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfU1lOQ0lORyB8fAogCSAgICAgICBpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9JT0VSUk9SKTsKQEAgLTIzMjAsNyArMjMyMSw3IEBACiAJICovCiAJaWYgKGljbG9nLT5pY19zdGF0ZSAhPSBYTE9HX1NUQVRFX0lPRVJST1IpIHsKIAkJaWYgKC0taWNsb2ctPmljX2J3cml0ZWNudCA9PSAxKSB7Ci0JCQlMT0dfVU5MT0NLKGxvZywgcyk7CisJCQlzcGluX3VubG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAJCQlyZXR1cm47CiAJCX0KIAkJaWNsb2ctPmljX3N0YXRlID0gWExPR19TVEFURV9ET05FX1NZTkM7CkBAIC0yMzMyLDcgKzIzMzMsNyBAQAogCSAqIEkvTywgdGhlIG90aGVycyBnZXQgdG8gd2FpdCBmb3IgdGhlIHJlc3VsdC4KIAkgKi8KIAlzdl9icm9hZGNhc3QoJmljbG9nLT5pY193cml0ZXNlbWEpOwotCUxPR19VTkxPQ0sobG9nLCBzKTsKKwlzcGluX3VubG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAJeGxvZ19zdGF0ZV9kb19jYWxsYmFjayhsb2csIGFib3J0ZWQsIGljbG9nKTsJLyogYWxzbyBjbGVhbnMgbG9nICovCiB9CS8qIHhsb2dfc3RhdGVfZG9uZV9zeW5jaW5nICovCiAKQEAgLTIzNTcsNyArMjM1OCw3IEBACiAgKgkJbmVlZHMgdG8gYmUgaW5jcmVtZW50ZWQsIGRlcGVuZGluZyBvbiB0aGUgYW1vdW50IG9mIGRhdGEgd2hpY2gKICAqCQlpcyBjb3BpZWQuCiAgKi8KLWludAorU1RBVElDIGludAogeGxvZ19zdGF0ZV9nZXRfaWNsb2dfc3BhY2UoeGxvZ190CSAgKmxvZywKIAkJCSAgIGludAkJICBsZW4sCiAJCQkgICB4bG9nX2luX2NvcmVfdCAqKmljbG9ncCwKQEAgLTIzNjUsMjMgKzIzNjYsMjIgQEAKIAkJCSAgIGludAkJICAqY29udGludWVkX3dyaXRlLAogCQkJICAgaW50CQkgICpsb2dvZmZzZXRwKQogewotCVNQTERFQ0wocyk7CiAJaW50CQkgIGxvZ19vZmZzZXQ7CiAJeGxvZ19yZWNfaGVhZGVyX3QgKmhlYWQ7CiAJeGxvZ19pbl9jb3JlX3QJICAqaWNsb2c7CiAJaW50CQkgIGVycm9yOwogCiByZXN0YXJ0OgotCXMgPSBMT0dfTE9DSyhsb2cpOworCXNwaW5fbG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAJaWYgKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpIHsKLQkJTE9HX1VOTE9DSyhsb2csIHMpOworCQlzcGluX3VubG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKIAl9CiAKIAlpY2xvZyA9IGxvZy0+bF9pY2xvZzsKIAlpZiAoISAoaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfQUNUSVZFKSkgewogCQlsb2ctPmxfZmx1c2hjbnQrKzsKLQkJTE9HX1VOTE9DSyhsb2csIHMpOworCQlzcGluX3VubG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAJCXhsb2dfdHJhY2VfaWNsb2coaWNsb2csIFhMT0dfVFJBQ0VfU0xFRVBfRkxVU0gpOwogCQlYRlNfU1RBVFNfSU5DKHhzX2xvZ19ub2ljbG9ncyk7CiAJCS8qIEVuc3VyZSB0aGF0IGxvZyB3cml0ZXMgaGFwcGVuICovCkBAIC0yNDA0LDggKzI0MDQsOSBAQAogCQl4bG9nX3RpY19hZGRfcmVnaW9uKHRpY2tldCwKIAkJCQkgICAgbG9nLT5sX2ljbG9nX2hzaXplLAogCQkJCSAgICBYTE9HX1JFR19UWVBFX0xSSEVBREVSKTsKLQkJSU5UX1NFVChoZWFkLT5oX2N5Y2xlLCBBUkNIX0NPTlZFUlQsIGxvZy0+bF9jdXJyX2N5Y2xlKTsKLQkJQVNTSUdOX0xTTihoZWFkLT5oX2xzbiwgbG9nKTsKKwkJaGVhZC0+aF9jeWNsZSA9IGNwdV90b19iZTMyKGxvZy0+bF9jdXJyX2N5Y2xlKTsKKwkJaGVhZC0+aF9sc24gPSBjcHVfdG9fYmU2NCgKKwkJCXhsb2dfYXNzaWduX2xzbihsb2ctPmxfY3Vycl9jeWNsZSwgbG9nLT5sX2N1cnJfYmxvY2spKTsKIAkJQVNTRVJUKGxvZy0+bF9jdXJyX2Jsb2NrID49IDApOwogCX0KIApAQCAtMjQyMywxMiArMjQyNCwxMiBAQAogCiAJCS8qIElmIEknbSB0aGUgb25seSBvbmUgd3JpdGluZyB0byB0aGlzIGljbG9nLCBzeW5jIGl0IHRvIGRpc2sgKi8KIAkJaWYgKGljbG9nLT5pY19yZWZjbnQgPT0gMSkgewotCQkJTE9HX1VOTE9DSyhsb2csIHMpOworCQkJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCQkJaWYgKChlcnJvciA9IHhsb2dfc3RhdGVfcmVsZWFzZV9pY2xvZyhsb2csIGljbG9nKSkpCiAJCQkJcmV0dXJuIGVycm9yOwogCQl9IGVsc2UgewogCQkJaWNsb2ctPmljX3JlZmNudC0tOwotCQkJTE9HX1VOTE9DSyhsb2csIHMpOworCQkJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCQl9CiAJCWdvdG8gcmVzdGFydDsKIAl9CkBAIC0yNDQ5LDcgKzI0NTAsNyBAQAogCSppY2xvZ3AgPSBpY2xvZzsKIAogCUFTU0VSVChpY2xvZy0+aWNfb2Zmc2V0IDw9IGljbG9nLT5pY19zaXplKTsKLQlMT0dfVU5MT0NLKGxvZywgcyk7CisJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCiAJKmxvZ29mZnNldHAgPSBsb2dfb2Zmc2V0OwogCXJldHVybiAwOwpAQCAtMjQ2Nyw3ICsyNDY4LDYgQEAKIHsKIAlpbnQJCSBmcmVlX2J5dGVzOwogCWludAkJIG5lZWRfYnl0ZXM7Ci0JU1BMREVDTChzKTsKICNpZmRlZiBERUJVRwogCXhmc19sc25fdAkgdGFpbF9sc247CiAjZW5kaWYKQEAgLTI0NzksNyArMjQ3OSw3IEBACiAjZW5kaWYKIAogCS8qIElzIHRoZXJlIHNwYWNlIG9yIGRvIHdlIG5lZWQgdG8gc2xlZXA/ICovCi0JcyA9IEdSQU5UX0xPQ0sobG9nKTsKKwlzcGluX2xvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKIAl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGljLCAieGxvZ19ncmFudF9sb2dfc3BhY2U6IGVudGVyIik7CiAKIAkvKiBzb21ldGhpbmcgaXMgYWxyZWFkeSBzbGVlcGluZzsgaW5zZXJ0IG5ldyB0cmFuc2FjdGlvbiBhdCBlbmQgKi8KQEAgLTI1MDIsNyArMjUwMiw3IEBACiAJCSAqLwogCQl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGljLAogCQkJCSAgICAieGxvZ19ncmFudF9sb2dfc3BhY2U6IHdha2UgMSIpOwotCQlzID0gR1JBTlRfTE9DSyhsb2cpOworCQlzcGluX2xvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKIAl9CiAJaWYgKHRpYy0+dF9mbGFncyAmIFhGU19MT0dfUEVSTV9SRVNFUlYpCiAJCW5lZWRfYnl0ZXMgPSB0aWMtPnRfdW5pdF9yZXMqdGljLT50X29jbnQ7CkBAIC0yNTI0LDE0ICsyNTI0LDE0IEBACiAJCXN2X3dhaXQoJnRpYy0+dF9zZW1hLCBQSU5PRHxQTFRXQUlULCAmbG9nLT5sX2dyYW50X2xvY2ssIHMpOwogCiAJCWlmIChYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpKSB7Ci0JCQlzID0gR1JBTlRfTE9DSyhsb2cpOworCQkJc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CiAJCQlnb3RvIGVycm9yX3JldHVybjsKIAkJfQogCiAJCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWMsCiAJCQkJICAgICJ4bG9nX2dyYW50X2xvZ19zcGFjZTogd2FrZSAyIik7CiAJCXhsb2dfZ3JhbnRfcHVzaF9haWwobG9nLT5sX21wLCBuZWVkX2J5dGVzKTsKLQkJcyA9IEdSQU5UX0xPQ0sobG9nKTsKKwkJc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CiAJCWdvdG8gcmVkbzsKIAl9IGVsc2UgaWYgKHRpYy0+dF9mbGFncyAmIFhMT0dfVElDX0lOX1EpCiAJCXhsb2dfZGVsX3RpY2tldHEoJmxvZy0+bF9yZXNlcnZlX2hlYWRxLCB0aWMpOwpAQCAtMjU1Myw3ICsyNTUzLDcgQEAKICNlbmRpZgogCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWMsICJ4bG9nX2dyYW50X2xvZ19zcGFjZTogZXhpdCIpOwogCXhsb2dfdmVyaWZ5X2dyYW50X2hlYWQobG9nLCAxKTsKLQlHUkFOVF9VTkxPQ0sobG9nLCBzKTsKKwlzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwogCXJldHVybiAwOwogCiAgZXJyb3JfcmV0dXJuOgpAQCAtMjU2Nyw3ICsyNTY3LDcgQEAKIAkgKi8KIAl0aWMtPnRfY3Vycl9yZXMgPSAwOwogCXRpYy0+dF9jbnQgPSAwOyAvKiB1bmdyYW50IHdpbGwgZ2l2ZSBiYWNrIHVuaXRfcmVzICogdF9jbnQuICovCi0JR1JBTlRfVU5MT0NLKGxvZywgcyk7CisJc3Bpbl91bmxvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKIAlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CiB9CS8qIHhsb2dfZ3JhbnRfbG9nX3NwYWNlICovCiAKQEAgLTI1ODEsNyArMjU4MSw2IEBACiB4bG9nX3JlZ3JhbnRfd3JpdGVfbG9nX3NwYWNlKHhsb2dfdAkgICAqbG9nLAogCQkJICAgICB4bG9nX3RpY2tldF90ICp0aWMpCiB7Ci0JU1BMREVDTChzKTsKIAlpbnQJCWZyZWVfYnl0ZXMsIG5lZWRfYnl0ZXM7CiAJeGxvZ190aWNrZXRfdAkqbnRpYzsKICNpZmRlZiBERUJVRwpAQCAtMjU5OSw3ICsyNTk4LDcgQEAKIAkJcGFuaWMoInJlZ3JhbnQgUmVjb3ZlcnkgcHJvYmxlbSIpOwogI2VuZGlmCiAKLQlzID0gR1JBTlRfTE9DSyhsb2cpOworCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwogCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWMsICJ4bG9nX3JlZ3JhbnRfd3JpdGVfbG9nX3NwYWNlOiBlbnRlciIpOwogCiAJaWYgKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpCkBAIC0yNjM4LDE0ICsyNjM3LDE0IEBACiAJCQkvKiBJZiB3ZSdyZSBzaHV0dGluZyBkb3duLCB0aGlzIHRpYyBpcyBhbHJlYWR5CiAJCQkgKiBvZmYgdGhlIHF1ZXVlICovCiAJCQlpZiAoWExPR19GT1JDRURfU0hVVERPV04obG9nKSkgewotCQkJCXMgPSBHUkFOVF9MT0NLKGxvZyk7CisJCQkJc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CiAJCQkJZ290byBlcnJvcl9yZXR1cm47CiAJCQl9CiAKIAkJCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWMsCiAJCQkJICAgICJ4bG9nX3JlZ3JhbnRfd3JpdGVfbG9nX3NwYWNlOiB3YWtlIDEiKTsKIAkJCXhsb2dfZ3JhbnRfcHVzaF9haWwobG9nLT5sX21wLCB0aWMtPnRfdW5pdF9yZXMpOwotCQkJcyA9IEdSQU5UX0xPQ0sobG9nKTsKKwkJCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwogCQl9CiAJfQogCkBAIC0yNjY1LDE0ICsyNjY0LDE0IEBACiAKIAkJLyogSWYgd2UncmUgc2h1dHRpbmcgZG93biwgdGhpcyB0aWMgaXMgYWxyZWFkeSBvZmYgdGhlIHF1ZXVlICovCiAJCWlmIChYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpKSB7Ci0JCQlzID0gR1JBTlRfTE9DSyhsb2cpOworCQkJc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CiAJCQlnb3RvIGVycm9yX3JldHVybjsKIAkJfQogCiAJCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWMsCiAJCQkJICAgICJ4bG9nX3JlZ3JhbnRfd3JpdGVfbG9nX3NwYWNlOiB3YWtlIDIiKTsKIAkJeGxvZ19ncmFudF9wdXNoX2FpbChsb2ctPmxfbXAsIG5lZWRfYnl0ZXMpOwotCQlzID0gR1JBTlRfTE9DSyhsb2cpOworCQlzcGluX2xvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKIAkJZ290byByZWRvOwogCX0gZWxzZSBpZiAodGljLT50X2ZsYWdzICYgWExPR19USUNfSU5fUSkKIAkJeGxvZ19kZWxfdGlja2V0cSgmbG9nLT5sX3dyaXRlX2hlYWRxLCB0aWMpOwpAQCAtMjY4OSw3ICsyNjg4LDcgQEAKIAogCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWMsICJ4bG9nX3JlZ3JhbnRfd3JpdGVfbG9nX3NwYWNlOiBleGl0Iik7CiAJeGxvZ192ZXJpZnlfZ3JhbnRfaGVhZChsb2csIDEpOwotCUdSQU5UX1VOTE9DSyhsb2csIHMpOworCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CiAJcmV0dXJuIDA7CiAKIApAQCAtMjcwNCw3ICsyNzAzLDcgQEAKIAkgKi8KIAl0aWMtPnRfY3Vycl9yZXMgPSAwOwogCXRpYy0+dF9jbnQgPSAwOyAvKiB1bmdyYW50IHdpbGwgZ2l2ZSBiYWNrIHVuaXRfcmVzICogdF9jbnQuICovCi0JR1JBTlRfVU5MT0NLKGxvZywgcyk7CisJc3Bpbl91bmxvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKIAlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CiB9CS8qIHhsb2dfcmVncmFudF93cml0ZV9sb2dfc3BhY2UgKi8KIApAQCAtMjcyMCwxNCArMjcxOSwxMiBAQAogeGxvZ19yZWdyYW50X3Jlc2VydmVfbG9nX3NwYWNlKHhsb2dfdAkgICAgICpsb2csCiAJCQkgICAgICAgeGxvZ190aWNrZXRfdCAqdGlja2V0KQogewotCVNQTERFQ0wocyk7Ci0KIAl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGlja2V0LAogCQkJICAgICJ4bG9nX3JlZ3JhbnRfcmVzZXJ2ZV9sb2dfc3BhY2U6IGVudGVyIik7CiAJaWYgKHRpY2tldC0+dF9jbnQgPiAwKQogCQl0aWNrZXQtPnRfY250LS07CiAKLQlzID0gR1JBTlRfTE9DSyhsb2cpOworCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwogCXhsb2dfZ3JhbnRfc3ViX3NwYWNlKGxvZywgdGlja2V0LT50X2N1cnJfcmVzKTsKIAl0aWNrZXQtPnRfY3Vycl9yZXMgPSB0aWNrZXQtPnRfdW5pdF9yZXM7CiAJeGxvZ190aWNfcmVzZXRfcmVzKHRpY2tldCk7CkBAIC0yNzM3LDcgKzI3MzQsNyBAQAogCiAJLyoganVzdCByZXR1cm4gaWYgd2Ugc3RpbGwgaGF2ZSBzb21lIG9mIHRoZSBwcmUtcmVzZXJ2ZWQgc3BhY2UgKi8KIAlpZiAodGlja2V0LT50X2NudCA+IDApIHsKLQkJR1JBTlRfVU5MT0NLKGxvZywgcyk7CisJCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTI3NDUsNyArMjc0Miw3IEBACiAJeGxvZ190cmFjZV9sb2dncmFudChsb2csIHRpY2tldCwKIAkJCSAgICAieGxvZ19yZWdyYW50X3Jlc2VydmVfbG9nX3NwYWNlOiBleGl0Iik7CiAJeGxvZ192ZXJpZnlfZ3JhbnRfaGVhZChsb2csIDApOwotCUdSQU5UX1VOTE9DSyhsb2csIHMpOworCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CiAJdGlja2V0LT50X2N1cnJfcmVzID0gdGlja2V0LT50X3VuaXRfcmVzOwogCXhsb2dfdGljX3Jlc2V0X3Jlcyh0aWNrZXQpOwogfQkvKiB4bG9nX3JlZ3JhbnRfcmVzZXJ2ZV9sb2dfc3BhY2UgKi8KQEAgLTI3NjksMTIgKzI3NjYsMTAgQEAKIHhsb2dfdW5ncmFudF9sb2dfc3BhY2UoeGxvZ190CSAgICAgKmxvZywKIAkJICAgICAgIHhsb2dfdGlja2V0X3QgKnRpY2tldCkKIHsKLQlTUExERUNMKHMpOwotCiAJaWYgKHRpY2tldC0+dF9jbnQgPiAwKQogCQl0aWNrZXQtPnRfY250LS07CiAKLQlzID0gR1JBTlRfTE9DSyhsb2cpOworCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwogCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWNrZXQsICJ4bG9nX3VuZ3JhbnRfbG9nX3NwYWNlOiBlbnRlciIpOwogCiAJeGxvZ19ncmFudF9zdWJfc3BhY2UobG9nLCB0aWNrZXQtPnRfY3Vycl9yZXMpOwpAQCAtMjc5MSw3ICsyNzg2LDcgQEAKIAogCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWNrZXQsICJ4bG9nX3VuZ3JhbnRfbG9nX3NwYWNlOiBleGl0Iik7CiAJeGxvZ192ZXJpZnlfZ3JhbnRfaGVhZChsb2csIDEpOwotCUdSQU5UX1VOTE9DSyhsb2csIHMpOworCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CiAJeGZzX2xvZ19tb3ZlX3RhaWwobG9nLT5sX21wLCAxKTsKIH0JLyogeGxvZ191bmdyYW50X2xvZ19zcGFjZSAqLwogCkBAIC0yNzk5LDE1ICsyNzk0LDEzIEBACiAvKgogICogQXRvbWljYWxseSBwdXQgYmFjayB1c2VkIHRpY2tldC4KICAqLwotdm9pZAorU1RBVElDIHZvaWQKIHhsb2dfc3RhdGVfcHV0X3RpY2tldCh4bG9nX3QJICAgICpsb2csCiAJCSAgICAgIHhsb2dfdGlja2V0X3QgKnRpYykKIHsKLQl1bnNpZ25lZCBsb25nIHM7Ci0KLQlzID0gTE9HX0xPQ0sobG9nKTsKKwlzcGluX2xvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCXhsb2dfdGlja2V0X3B1dChsb2csIHRpYyk7Ci0JTE9HX1VOTE9DSyhsb2csIHMpOworCXNwaW5fdW5sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKIH0JLyogeGxvZ19zdGF0ZV9wdXRfdGlja2V0ICovCiAKIC8qCkBAIC0yODE5LDE5ICsyODEyLDE4IEBACiAgKgogICoKICAqLwotaW50CitTVEFUSUMgaW50CiB4bG9nX3N0YXRlX3JlbGVhc2VfaWNsb2coeGxvZ190CQkqbG9nLAogCQkJIHhsb2dfaW5fY29yZV90CSppY2xvZykKIHsKLQlTUExERUNMKHMpOwogCWludAkJc3luYyA9IDA7CS8qIGRvIHdlIHN5bmM/ICovCiAKIAl4bG9nX2Fzc2lnbl90YWlsX2xzbihsb2ctPmxfbXApOwogCi0JcyA9IExPR19MT0NLKGxvZyk7CisJc3Bpbl9sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKIAogCWlmIChpY2xvZy0+aWNfc3RhdGUgJiBYTE9HX1NUQVRFX0lPRVJST1IpIHsKLQkJTE9HX1VOTE9DSyhsb2csIHMpOworCQlzcGluX3VubG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKIAl9CiAKQEAgLTI4NDMsMTIgKzI4MzUsMTIgQEAKIAkgICAgaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfV0FOVF9TWU5DKSB7CiAJCXN5bmMrKzsKIAkJaWNsb2ctPmljX3N0YXRlID0gWExPR19TVEFURV9TWU5DSU5HOwotCQlJTlRfU0VUKGljbG9nLT5pY19oZWFkZXIuaF90YWlsX2xzbiwgQVJDSF9DT05WRVJULCBsb2ctPmxfdGFpbF9sc24pOworCQlpY2xvZy0+aWNfaGVhZGVyLmhfdGFpbF9sc24gPSBjcHVfdG9fYmU2NChsb2ctPmxfdGFpbF9sc24pOwogCQl4bG9nX3ZlcmlmeV90YWlsX2xzbihsb2csIGljbG9nLCBsb2ctPmxfdGFpbF9sc24pOwogCQkvKiBjeWNsZSBpbmNyZW1lbnRlZCB3aGVuIGluY3JlbWVudGluZyBjdXJyX2Jsb2NrICovCiAJfQogCi0JTE9HX1VOTE9DSyhsb2csIHMpOworCXNwaW5fdW5sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKIAogCS8qCiAJICogV2UgbGV0IHRoZSBsb2cgbG9jayBnbywgc28gaXQncyBwb3NzaWJsZSB0aGF0IHdlIGhpdCBhIGxvZyBJL08KQEAgLTI4ODEsNyArMjg3Myw3IEBACiAJaWYgKCFldmVudHVhbF9zaXplKQogCQlldmVudHVhbF9zaXplID0gaWNsb2ctPmljX29mZnNldDsKIAlpY2xvZy0+aWNfc3RhdGUgPSBYTE9HX1NUQVRFX1dBTlRfU1lOQzsKLQlJTlRfU0VUKGljbG9nLT5pY19oZWFkZXIuaF9wcmV2X2Jsb2NrLCBBUkNIX0NPTlZFUlQsIGxvZy0+bF9wcmV2X2Jsb2NrKTsKKwlpY2xvZy0+aWNfaGVhZGVyLmhfcHJldl9ibG9jayA9IGNwdV90b19iZTMyKGxvZy0+bF9wcmV2X2Jsb2NrKTsKIAlsb2ctPmxfcHJldl9ibG9jayA9IGxvZy0+bF9jdXJyX2Jsb2NrOwogCWxvZy0+bF9wcmV2X2N5Y2xlID0gbG9nLT5sX2N1cnJfY3ljbGU7CiAKQEAgLTI5MzksMTMgKzI5MzEsMTIgQEAKIHsKIAl4bG9nX2luX2NvcmVfdAkqaWNsb2c7CiAJeGZzX2xzbl90CWxzbjsKLQlTUExERUNMKHMpOwogCi0JcyA9IExPR19MT0NLKGxvZyk7CisJc3Bpbl9sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKIAogCWljbG9nID0gbG9nLT5sX2ljbG9nOwogCWlmIChpY2xvZy0+aWNfc3RhdGUgJiBYTE9HX1NUQVRFX0lPRVJST1IpIHsKLQkJTE9HX1VOTE9DSyhsb2csIHMpOworCQlzcGluX3VubG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKIAl9CiAKQEAgLTI5NzgsMTUgKzI5NjksMTUgQEAKIAkJCQkgKiB0aGUgcHJldmlvdXMgc3luYy4KIAkJCQkgKi8KIAkJCQlpY2xvZy0+aWNfcmVmY250Kys7Ci0JCQkJbHNuID0gSU5UX0dFVChpY2xvZy0+aWNfaGVhZGVyLmhfbHNuLCBBUkNIX0NPTlZFUlQpOworCQkJCWxzbiA9IGJlNjRfdG9fY3B1KGljbG9nLT5pY19oZWFkZXIuaF9sc24pOwogCQkJCXhsb2dfc3RhdGVfc3dpdGNoX2ljbG9ncyhsb2csIGljbG9nLCAwKTsKLQkJCQlMT0dfVU5MT0NLKGxvZywgcyk7CisJCQkJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCiAJCQkJaWYgKHhsb2dfc3RhdGVfcmVsZWFzZV9pY2xvZyhsb2csIGljbG9nKSkKIAkJCQkJcmV0dXJuIFhGU19FUlJPUihFSU8pOwogCQkJCSpsb2dfZmx1c2hlZCA9IDE7Ci0JCQkJcyA9IExPR19MT0NLKGxvZyk7Ci0JCQkJaWYgKElOVF9HRVQoaWNsb2ctPmljX2hlYWRlci5oX2xzbiwgQVJDSF9DT05WRVJUKSA9PSBsc24gJiYKKwkJCQlzcGluX2xvY2soJmxvZy0+bF9pY2xvZ2xvY2spOworCQkJCWlmIChiZTY0X3RvX2NwdShpY2xvZy0+aWNfaGVhZGVyLmhfbHNuKSA9PSBsc24gJiYKIAkJCQkgICAgaWNsb2ctPmljX3N0YXRlICE9IFhMT0dfU1RBVEVfRElSVFkpCiAJCQkJCWdvdG8gbWF5YmVfc2xlZXA7CiAJCQkJZWxzZQpAQCAtMzAxMSwxMiArMzAwMiwxMiBAQAogCWlmIChmbGFncyAmIFhGU19MT0dfU1lOQykgewogCQkvKgogCQkgKiBXZSBtdXN0IGNoZWNrIGlmIHdlJ3JlIHNodXR0aW5nIGRvd24gaGVyZSwgYmVmb3JlCi0JCSAqIHdlIHdhaXQsIHdoaWxlIHdlJ3JlIGhvbGRpbmcgdGhlIExPR19MT0NLLgorCQkgKiB3ZSB3YWl0LCB3aGlsZSB3ZSdyZSBob2xkaW5nIHRoZSBsX2ljbG9nbG9jay4KIAkJICogVGhlbiB3ZSBjaGVjayBhZ2FpbiBhZnRlciB3YWtpbmcgdXAsIGluIGNhc2Ugb3VyCiAJCSAqIHNsZWVwIHdhcyBkaXN0dXJiZWQgYnkgYSBiYWQgbmV3cy4KIAkJICovCiAJCWlmIChpY2xvZy0+aWNfc3RhdGUgJiBYTE9HX1NUQVRFX0lPRVJST1IpIHsKLQkJCUxPR19VTkxPQ0sobG9nLCBzKTsKKwkJCXNwaW5fdW5sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKIAkJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKIAkJfQogCQlYRlNfU1RBVFNfSU5DKHhzX2xvZ19mb3JjZV9zbGVlcCk7CkBAIC0zMDMzLDcgKzMwMjQsNyBAQAogCX0gZWxzZSB7CiAKIG5vX3NsZWVwOgotCQlMT0dfVU5MT0NLKGxvZywgcyk7CisJCXNwaW5fdW5sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKIAl9CiAJcmV0dXJuIDA7CiB9CS8qIHhsb2dfc3RhdGVfc3luY19hbGwgKi8KQEAgLTMwNTEsNyArMzA0Miw3IEBACiAgKiBJZiBmaWxlc3lzdGVtIGFjdGl2aXR5IGdvZXMgdG8gemVybywgdGhlIGljbG9nIHdpbGwgZ2V0IGZsdXNoZWQgb25seSBieQogICogYmRmbHVzaCgpLgogICovCi1pbnQKK1NUQVRJQyBpbnQKIHhsb2dfc3RhdGVfc3luYyh4bG9nX3QJICAqbG9nLAogCQl4ZnNfbHNuX3QgbHNuLAogCQl1aW50CSAgZmxhZ3MsCkBAIC0zMDU5LDI2ICszMDUwLDI0IEBACiB7CiAgICAgeGxvZ19pbl9jb3JlX3QJKmljbG9nOwogICAgIGludAkJCWFscmVhZHlfc2xlcHQgPSAwOwotICAgIFNQTERFQ0wocyk7Ci0KIAogdHJ5X2FnYWluOgotICAgIHMgPSBMT0dfTE9DSyhsb2cpOworICAgIHNwaW5fbG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAgICAgaWNsb2cgPSBsb2ctPmxfaWNsb2c7CiAKICAgICBpZiAoaWNsb2ctPmljX3N0YXRlICYgWExPR19TVEFURV9JT0VSUk9SKSB7Ci0JICAgIExPR19VTkxPQ0sobG9nLCBzKTsKKwkgICAgc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCSAgICByZXR1cm4gWEZTX0VSUk9SKEVJTyk7CiAgICAgfQogCiAgICAgZG8gewotCWlmIChJTlRfR0VUKGljbG9nLT5pY19oZWFkZXIuaF9sc24sIEFSQ0hfQ09OVkVSVCkgIT0gbHNuKSB7Ci0JICAgIGljbG9nID0gaWNsb2ctPmljX25leHQ7Ci0JICAgIGNvbnRpbnVlOworCWlmIChiZTY0X3RvX2NwdShpY2xvZy0+aWNfaGVhZGVyLmhfbHNuKSAhPSBsc24pIHsKKwkJaWNsb2cgPSBpY2xvZy0+aWNfbmV4dDsKKwkJY29udGludWU7CiAJfQogCiAJaWYgKGljbG9nLT5pY19zdGF0ZSA9PSBYTE9HX1NUQVRFX0RJUlRZKSB7Ci0JCUxPR19VTkxPQ0sobG9nLCBzKTsKKwkJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTMxMTMsMTEgKzMxMDIsMTEgQEAKIAkJfSBlbHNlIHsKIAkJCWljbG9nLT5pY19yZWZjbnQrKzsKIAkJCXhsb2dfc3RhdGVfc3dpdGNoX2ljbG9ncyhsb2csIGljbG9nLCAwKTsKLQkJCUxPR19VTkxPQ0sobG9nLCBzKTsKKwkJCXNwaW5fdW5sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKIAkJCWlmICh4bG9nX3N0YXRlX3JlbGVhc2VfaWNsb2cobG9nLCBpY2xvZykpCiAJCQkJcmV0dXJuIFhGU19FUlJPUihFSU8pOwogCQkJKmxvZ19mbHVzaGVkID0gMTsKLQkJCXMgPSBMT0dfTE9DSyhsb2cpOworCQkJc3Bpbl9sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKIAkJfQogCX0KIApAQCAtMzEyOSw3ICszMTE4LDcgQEAKIAkJICogZ290dGVuIGEgbG9nIHdyaXRlIGVycm9yLgogCQkgKi8KIAkJaWYgKGljbG9nLT5pY19zdGF0ZSAmIFhMT0dfU1RBVEVfSU9FUlJPUikgewotCQkJTE9HX1VOTE9DSyhsb2csIHMpOworCQkJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCQkJcmV0dXJuIFhGU19FUlJPUihFSU8pOwogCQl9CiAJCVhGU19TVEFUU19JTkMoeHNfbG9nX2ZvcmNlX3NsZWVwKTsKQEAgLTMxNDMsMTMgKzMxMzIsMTMgQEAKIAkJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKIAkJKmxvZ19mbHVzaGVkID0gMTsKIAl9IGVsc2UgewkJLyoganVzdCByZXR1cm4gKi8KLQkJTE9HX1VOTE9DSyhsb2csIHMpOworCQlzcGluX3VubG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAJfQogCXJldHVybiAwOwogCiAgICAgfSB3aGlsZSAoaWNsb2cgIT0gbG9nLT5sX2ljbG9nKTsKIAotICAgIExPR19VTkxPQ0sobG9nLCBzKTsKKyAgICBzcGluX3VubG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAgICAgcmV0dXJuIDA7CiB9CS8qIHhsb2dfc3RhdGVfc3luYyAqLwogCkBAIC0zMTU4LDEyICszMTQ3LDEwIEBACiAgKiBDYWxsZWQgd2hlbiB3ZSB3YW50IHRvIG1hcmsgdGhlIGN1cnJlbnQgaWNsb2cgYXMgYmVpbmcgcmVhZHkgdG8gc3luYyB0bwogICogZGlzay4KICAqLwotdm9pZAorU1RBVElDIHZvaWQKIHhsb2dfc3RhdGVfd2FudF9zeW5jKHhsb2dfdCAqbG9nLCB4bG9nX2luX2NvcmVfdCAqaWNsb2cpCiB7Ci0JU1BMREVDTChzKTsKLQotCXMgPSBMT0dfTE9DSyhsb2cpOworCXNwaW5fbG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAKIAlpZiAoaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfQUNUSVZFKSB7CiAJCXhsb2dfc3RhdGVfc3dpdGNoX2ljbG9ncyhsb2csIGljbG9nLCAwKTsKQEAgLTMxNzIsNyArMzE1OSw3IEBACiAJCQkoWExPR19TVEFURV9XQU5UX1NZTkN8WExPR19TVEFURV9JT0VSUk9SKSk7CiAJfQogCi0JTE9HX1VOTE9DSyhsb2csIHMpOworCXNwaW5fdW5sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKIH0JLyogeGxvZ19zdGF0ZV93YW50X3N5bmMgKi8KIAogCkBAIC0zMTkzLDE2ICszMTgwLDE1IEBACiAJeGxvZ190aWNrZXRfdAkqdF9saXN0OwogCXhsb2dfdGlja2V0X3QJKm5leHQ7CiAJeGZzX2NhZGRyX3QJYnVmOwotCXVpbnQJCWkgPSAoTkJQUCAvIHNpemVvZih4bG9nX3RpY2tldF90KSkgLSAyOwotCVNQTERFQ0wocyk7CisJdWludAkJaSA9IChQQUdFX1NJWkUgLyBzaXplb2YoeGxvZ190aWNrZXRfdCkpIC0gMjsKIAogCS8qCiAJICogVGhlIGttZW1femFsbG9jIG1heSBzbGVlcCwgc28gd2Ugc2hvdWxkbid0IGJlIGhvbGRpbmcgdGhlCiAJICogZ2xvYmFsIGxvY2suICBYWFhtaWtlbjogbWF5IHdhbnQgdG8gdXNlIHpvbmUgYWxsb2NhdG9yLgogCSAqLwotCWJ1ZiA9ICh4ZnNfY2FkZHJfdCkga21lbV96YWxsb2MoTkJQUCwgS01fU0xFRVApOworCWJ1ZiA9ICh4ZnNfY2FkZHJfdCkga21lbV96YWxsb2MoUEFHRV9TSVpFLCBLTV9TTEVFUCk7CiAKLQlzID0gTE9HX0xPQ0sobG9nKTsKKwlzcGluX2xvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCiAJLyogQXR0YWNoIDFzdCB0aWNrZXQgdG8gUSwgc28gd2UgY2FuIGtlZXAgdHJhY2sgb2YgYWxsb2NhdGVkIG1lbW9yeSAqLwogCXRfbGlzdCA9ICh4bG9nX3RpY2tldF90ICopYnVmOwpAQCAtMzIzMSw3ICszMjE3LDcgQEAKIAl9CiAJdF9saXN0LT50X25leHQgPSBOVUxMOwogCWxvZy0+bF90YWlsID0gdF9saXN0OwotCUxPR19VTkxPQ0sobG9nLCBzKTsKKwlzcGluX3VubG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiB9CS8qIHhsb2dfc3RhdGVfdGlja2V0X2FsbG9jICovCiAKIApAQCAtMzI3Myw3ICszMjU5LDcgQEAKIC8qCiAgKiBHcmFiIHRpY2tldCBvZmYgZnJlZWxpc3Qgb3IgYWxsb2NhdGlvbiBzb21lIG1vcmUKICAqLwoteGxvZ190aWNrZXRfdCAqCitTVEFUSUMgeGxvZ190aWNrZXRfdCAqCiB4bG9nX3RpY2tldF9nZXQoeGxvZ190CQkqbG9nLAogCQlpbnQJCXVuaXRfYnl0ZXMsCiAJCWludAkJY250LApAQCAtMzI4MiwxNSArMzI2OCwxNCBAQAogewogCXhsb2dfdGlja2V0X3QJKnRpYzsKIAl1aW50CQludW1faGVhZGVyczsKLQlTUExERUNMKHMpOwogCiAgYWxsb2M6CiAJaWYgKGxvZy0+bF9mcmVlbGlzdCA9PSBOVUxMKQogCQl4bG9nX3N0YXRlX3RpY2tldF9hbGxvYyhsb2cpOwkJLyogcG90ZW50aWFsbHkgc2xlZXAgKi8KIAotCXMgPSBMT0dfTE9DSyhsb2cpOworCXNwaW5fbG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAJaWYgKGxvZy0+bF9mcmVlbGlzdCA9PSBOVUxMKSB7Ci0JCUxPR19VTkxPQ0sobG9nLCBzKTsKKwkJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCQlnb3RvIGFsbG9jOwogCX0KIAl0aWMJCT0gbG9nLT5sX2ZyZWVsaXN0OwpAQCAtMzI5OCw3ICszMjgzLDcgQEAKIAlpZiAobG9nLT5sX2ZyZWVsaXN0ID09IE5VTEwpCiAJCWxvZy0+bF90YWlsID0gTlVMTDsKIAlsb2ctPmxfdGlja2V0X2NudC0tOwotCUxPR19VTkxPQ0sobG9nLCBzKTsKKwlzcGluX3VubG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAKIAkvKgogCSAqIFBlcm1hbmVudCByZXNlcnZhdGlvbnMgaGF2ZSB1cCB0byAnY250Jy0xIGFjdGl2ZSBsb2cgb3BlcmF0aW9ucwpAQCAtMzQ3MywxMCArMzQ1OCw5IEBACiAJX191aW50OF90CQljbGllbnRpZDsKIAlpbnQJCQlsZW4sIGksIGosIGssIG9wX2xlbjsKIAlpbnQJCQlpZHg7Ci0JU1BMREVDTChzKTsKIAogCS8qIGNoZWNrIHZhbGlkaXR5IG9mIGljbG9nIHBvaW50ZXJzICovCi0JcyA9IExPR19MT0NLKGxvZyk7CisJc3Bpbl9sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKIAlpY3B0ciA9IGxvZy0+bF9pY2xvZzsKIAlmb3IgKGk9MDsgaSA8IGxvZy0+bF9pY2xvZ19idWZzOyBpKyspIHsKIAkJaWYgKGljcHRyID09IE5VTEwpCkBAIC0zNDg1LDIxICszNDY5LDIxIEBACiAJfQogCWlmIChpY3B0ciAhPSBsb2ctPmxfaWNsb2cpCiAJCXhsb2dfcGFuaWMoInhsb2dfdmVyaWZ5X2ljbG9nOiBjb3JydXB0IGljbG9nIHJpbmciKTsKLQlMT0dfVU5MT0NLKGxvZywgcyk7CisJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCiAJLyogY2hlY2sgbG9nIG1hZ2ljIG51bWJlcnMgKi8KLQlwdHIgPSAoeGZzX2NhZGRyX3QpICYoaWNsb2ctPmljX2hlYWRlcik7Ci0JaWYgKElOVF9HRVQoKih1aW50ICopcHRyLCBBUkNIX0NPTlZFUlQpICE9IFhMT0dfSEVBREVSX01BR0lDX05VTSkKKwlpZiAoYmUzMl90b19jcHUoaWNsb2ctPmljX2hlYWRlci5oX21hZ2ljbm8pICE9IFhMT0dfSEVBREVSX01BR0lDX05VTSkKIAkJeGxvZ19wYW5pYygieGxvZ192ZXJpZnlfaWNsb2c6IGludmFsaWQgbWFnaWMgbnVtIik7CiAKLQlmb3IgKHB0ciArPSBCQlNJWkU7IHB0ciA8ICgoeGZzX2NhZGRyX3QpJihpY2xvZy0+aWNfaGVhZGVyKSkrY291bnQ7CisJcHRyID0gKHhmc19jYWRkcl90KSAmaWNsb2ctPmljX2hlYWRlcjsKKwlmb3IgKHB0ciArPSBCQlNJWkU7IHB0ciA8ICgoeGZzX2NhZGRyX3QpJmljbG9nLT5pY19oZWFkZXIpICsgY291bnQ7CiAJICAgICBwdHIgKz0gQkJTSVpFKSB7Ci0JCWlmIChJTlRfR0VUKCoodWludCAqKXB0ciwgQVJDSF9DT05WRVJUKSA9PSBYTE9HX0hFQURFUl9NQUdJQ19OVU0pCisJCWlmIChiZTMyX3RvX2NwdSgqKF9fYmUzMiAqKXB0cikgPT0gWExPR19IRUFERVJfTUFHSUNfTlVNKQogCQkJeGxvZ19wYW5pYygieGxvZ192ZXJpZnlfaWNsb2c6IHVuZXhwZWN0ZWQgbWFnaWMgbnVtIik7CiAJfQogCiAJLyogY2hlY2sgZmllbGRzICovCi0JbGVuID0gSU5UX0dFVChpY2xvZy0+aWNfaGVhZGVyLmhfbnVtX2xvZ29wcywgQVJDSF9DT05WRVJUKTsKKwlsZW4gPSBiZTMyX3RvX2NwdShpY2xvZy0+aWNfaGVhZGVyLmhfbnVtX2xvZ29wcyk7CiAJcHRyID0gaWNsb2ctPmljX2RhdGFwOwogCWJhc2VfcHRyID0gcHRyOwogCW9waGVhZCA9ICh4bG9nX29wX2hlYWRlcl90ICopcHRyOwpAQCAtMzUxNyw5ICszNTAxLDExIEBACiAJCQlpZiAoaWR4ID49IChYTE9HX0hFQURFUl9DWUNMRV9TSVpFIC8gQkJTSVpFKSkgewogCQkJCWogPSBpZHggLyAoWExPR19IRUFERVJfQ1lDTEVfU0laRSAvIEJCU0laRSk7CiAJCQkJayA9IGlkeCAlIChYTE9HX0hFQURFUl9DWUNMRV9TSVpFIC8gQkJTSVpFKTsKLQkJCQljbGllbnRpZCA9IEdFVF9DTElFTlRfSUQoeGhkcltqXS5oaWNfeGhlYWRlci54aF9jeWNsZV9kYXRhW2tdLCBBUkNIX0NPTlZFUlQpOworCQkJCWNsaWVudGlkID0geGxvZ19nZXRfY2xpZW50X2lkKAorCQkJCQl4aGRyW2pdLmhpY194aGVhZGVyLnhoX2N5Y2xlX2RhdGFba10pOwogCQkJfSBlbHNlIHsKLQkJCQljbGllbnRpZCA9IEdFVF9DTElFTlRfSUQoaWNsb2ctPmljX2hlYWRlci5oX2N5Y2xlX2RhdGFbaWR4XSwgQVJDSF9DT05WRVJUKTsKKwkJCQljbGllbnRpZCA9IHhsb2dfZ2V0X2NsaWVudF9pZCgKKwkJCQkJaWNsb2ctPmljX2hlYWRlci5oX2N5Y2xlX2RhdGFbaWR4XSk7CiAJCQl9CiAJCX0KIAkJaWYgKGNsaWVudGlkICE9IFhGU19UUkFOU0FDVElPTiAmJiBjbGllbnRpZCAhPSBYRlNfTE9HKQpAQCAtMzUzMSwxNiArMzUxNywxNiBAQAogCQlmaWVsZF9vZmZzZXQgPSAoX19wc2ludF90KQogCQkJICAgICAgICgoeGZzX2NhZGRyX3QpJihvcGhlYWQtPm9oX2xlbikgLSBiYXNlX3B0cik7CiAJCWlmIChzeW5jaW5nID09IEJfRkFMU0UgfHwgKGZpZWxkX29mZnNldCAmIDB4MWZmKSkgewotCQkJb3BfbGVuID0gSU5UX0dFVChvcGhlYWQtPm9oX2xlbiwgQVJDSF9DT05WRVJUKTsKKwkJCW9wX2xlbiA9IGJlMzJfdG9fY3B1KG9waGVhZC0+b2hfbGVuKTsKIAkJfSBlbHNlIHsKIAkJCWlkeCA9IEJUT0JCVCgoX19wc2ludF90KSZvcGhlYWQtPm9oX2xlbiAtCiAJCQkJICAgIChfX3BzaW50X3QpaWNsb2ctPmljX2RhdGFwKTsKIAkJCWlmIChpZHggPj0gKFhMT0dfSEVBREVSX0NZQ0xFX1NJWkUgLyBCQlNJWkUpKSB7CiAJCQkJaiA9IGlkeCAvIChYTE9HX0hFQURFUl9DWUNMRV9TSVpFIC8gQkJTSVpFKTsKIAkJCQlrID0gaWR4ICUgKFhMT0dfSEVBREVSX0NZQ0xFX1NJWkUgLyBCQlNJWkUpOwotCQkJCW9wX2xlbiA9IElOVF9HRVQoeGhkcltqXS5oaWNfeGhlYWRlci54aF9jeWNsZV9kYXRhW2tdLCBBUkNIX0NPTlZFUlQpOworCQkJCW9wX2xlbiA9IGJlMzJfdG9fY3B1KHhoZHJbal0uaGljX3hoZWFkZXIueGhfY3ljbGVfZGF0YVtrXSk7CiAJCQl9IGVsc2UgewotCQkJCW9wX2xlbiA9IElOVF9HRVQoaWNsb2ctPmljX2hlYWRlci5oX2N5Y2xlX2RhdGFbaWR4XSwgQVJDSF9DT05WRVJUKTsKKwkJCQlvcF9sZW4gPSBiZTMyX3RvX2NwdShpY2xvZy0+aWNfaGVhZGVyLmhfY3ljbGVfZGF0YVtpZHhdKTsKIAkJCX0KIAkJfQogCQlwdHIgKz0gc2l6ZW9mKHhsb2dfb3BfaGVhZGVyX3QpICsgb3BfbGVuOwpAQCAtMzU0OSw3ICszNTM1LDcgQEAKICNlbmRpZgogCiAvKgotICogTWFyayBhbGwgaWNsb2dzIElPRVJST1IuIExPR19MT0NLIGlzIGhlbGQgYnkgdGhlIGNhbGxlci4KKyAqIE1hcmsgYWxsIGljbG9ncyBJT0VSUk9SLiBsX2ljbG9nbG9jayBpcyBoZWxkIGJ5IHRoZSBjYWxsZXIuCiAgKi8KIFNUQVRJQyBpbnQKIHhsb2dfc3RhdGVfaW9lcnJvcigKQEAgLTM1OTcsOCArMzU4Myw2IEBACiAJeGxvZ190CQkqbG9nOwogCWludAkJcmV0dmFsOwogCWludAkJZHVtbXk7Ci0JU1BMREVDTChzKTsKLQlTUExERUNMKHMyKTsKIAogCWxvZyA9IG1wLT5tX2xvZzsKIApAQCAtMzYyNyw4ICszNjExLDggQEAKIAkgKiBiZWZvcmUgd2UgbWFyayB0aGUgZmlsZXN5c3RlbSBTSFVURE9XTiBhbmQgd2FrZQogCSAqIGV2ZXJ5Ym9keSB1cCB0byB0ZWxsIHRoZSBiYWQgbmV3cy4KIAkgKi8KLQlzID0gR1JBTlRfTE9DSyhsb2cpOwotCXMyID0gTE9HX0xPQ0sobG9nKTsKKwlzcGluX2xvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKKwlzcGluX2xvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9GU19TSFVURE9XTjsKIAlYRlNfQlVGX0RPTkUobXAtPm1fc2JfYnApOwogCS8qCkBAIC0zNjQ0LDcgKzM2MjgsNyBAQAogCSAqLwogCWlmIChsb2dlcnJvcikKIAkJcmV0dmFsID0geGxvZ19zdGF0ZV9pb2Vycm9yKGxvZyk7Ci0JTE9HX1VOTE9DSyhsb2csIHMyKTsKKwlzcGluX3VubG9jaygmbG9nLT5sX2ljbG9nbG9jayk7CiAKIAkvKgogCSAqIFdlIGRvbid0IHdhbnQgYW55Ym9keSB3YWl0aW5nIGZvciBsb2cgcmVzZXJ2YXRpb25zCkBAIC0zNjY3LDcgKzM2NTEsNyBAQAogCQkJdGljID0gdGljLT50X25leHQ7CiAJCX0gd2hpbGUgKHRpYyAhPSBsb2ctPmxfd3JpdGVfaGVhZHEpOwogCX0KLQlHUkFOVF9VTkxPQ0sobG9nLCBzKTsKKwlzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X2xvY2spOwogCiAJaWYgKCEgKGxvZy0+bF9pY2xvZy0+aWNfc3RhdGUgJiBYTE9HX1NUQVRFX0lPRVJST1IpKSB7CiAJCUFTU0VSVCghbG9nZXJyb3IpOwpAQCAtMzY3Niw5ICszNjYwLDkgQEAKIAkJICogbG9nIGRvd24gY29tcGxldGVseS4KIAkJICovCiAJCXhsb2dfc3RhdGVfc3luY19hbGwobG9nLCBYRlNfTE9HX0ZPUkNFfFhGU19MT0dfU1lOQywgJmR1bW15KTsKLQkJczIgPSBMT0dfTE9DSyhsb2cpOworCQlzcGluX2xvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCQlyZXR2YWwgPSB4bG9nX3N0YXRlX2lvZXJyb3IobG9nKTsKLQkJTE9HX1VOTE9DSyhsb2csIHMyKTsKKwkJc3Bpbl91bmxvY2soJmxvZy0+bF9pY2xvZ2xvY2spOwogCX0KIAkvKgogCSAqIFdha2UgdXAgZXZlcnlib2R5IHdhaXRpbmcgb24geGZzX2xvZ19mb3JjZS4KQEAgLTM2OTEsMTMgKzM2NzUsMTMgQEAKIAl7CiAJCXhsb2dfaW5fY29yZV90CSppY2xvZzsKIAotCQlzID0gTE9HX0xPQ0sobG9nKTsKKwkJc3Bpbl9sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKIAkJaWNsb2cgPSBsb2ctPmxfaWNsb2c7CiAJCWRvIHsKIAkJCUFTU0VSVChpY2xvZy0+aWNfY2FsbGJhY2sgPT0gMCk7CiAJCQlpY2xvZyA9IGljbG9nLT5pY19uZXh0OwogCQl9IHdoaWxlIChpY2xvZyAhPSBsb2ctPmxfaWNsb2cpOwotCQlMT0dfVU5MT0NLKGxvZywgcyk7CisJCXNwaW5fdW5sb2NrKCZsb2ctPmxfaWNsb2dsb2NrKTsKIAl9CiAjZW5kaWYKIAkvKiByZXR1cm4gbm9uLXplcm8gaWYgbG9nIElPRVJST1IgdHJhbnNpdGlvbiBoYWQgYWxyZWFkeSBoYXBwZW5lZCAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19sb2cuaCBiL2ZzL3hmcy94ZnNfbG9nLmgKaW5kZXggZWJiZTkzZi4uNGNkYWMwNCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19sb2cuaAorKysgYi9mcy94ZnMveGZzX2xvZy5oCkBAIC0yMiw4ICsyMiw5IEBACiAKICNkZWZpbmUgQ1lDTEVfTFNOKGxzbikgKCh1aW50KSgobHNuKT4+MzIpKQogI2RlZmluZSBCTE9DS19MU04obHNuKSAoKHVpbnQpKGxzbikpCisKIC8qIHRoaXMgaXMgdXNlZCBpbiBhIHNwb3Qgd2hlcmUgd2UgbWlnaHQgb3RoZXJ3aXNlIGRvdWJsZS1lbmRpYW4tZmxpcCAqLwotI2RlZmluZSBDWUNMRV9MU05fRElTSyhsc24pICgoKHVpbnQgKikmKGxzbikpWzBdKQorI2RlZmluZSBDWUNMRV9MU05fRElTSyhsc24pICgoKF9fYmUzMiAqKSYobHNuKSlbMF0pCiAKICNpZmRlZiBfX0tFUk5FTF9fCiAvKgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19sb2dfcHJpdi5oIGIvZnMveGZzL3hmc19sb2dfcHJpdi5oCmluZGV4IDc1MmY5NjQuLmUwMDgyMzMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nX3ByaXYuaAorKysgYi9mcy94ZnMveGZzX2xvZ19wcml2LmgKQEAgLTU1LDMzICs1NSwyMiBAQAogCUJUT0JCKFhMT0dfTUFYX0lDTE9HUyA8PCAoWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoJmxvZy0+bF9tcC0+bV9zYikgPyBcCiAJIFhMT0dfTUFYX1JFQ09SRF9CU0hJRlQgOiBYTE9HX0JJR19SRUNPUkRfQlNISUZUKSkKIAotLyoKLSAqICBzZXQgbHNucwotICovCiAKLSNkZWZpbmUgQVNTSUdOX0FOWV9MU05fSE9TVChsc24sY3ljbGUsYmxvY2spICBcCi0gICAgeyBcCi0JKGxzbikgPSAoKHhmc19sc25fdCkoY3ljbGUpPDwzMil8KGJsb2NrKTsgXAotICAgIH0KLSNkZWZpbmUgQVNTSUdOX0FOWV9MU05fRElTSyhsc24sY3ljbGUsYmxvY2spICBcCi0gICAgeyBcCi0JSU5UX1NFVCgoKHVpbnQgKikmKGxzbikpWzBdLCBBUkNIX0NPTlZFUlQsIChjeWNsZSkpOyBcCi0JSU5UX1NFVCgoKHVpbnQgKikmKGxzbikpWzFdLCBBUkNIX0NPTlZFUlQsIChibG9jaykpOyBcCi0gICAgfQotI2RlZmluZSBBU1NJR05fTFNOKGxzbixsb2cpIFwKLSAgICBBU1NJR05fQU5ZX0xTTl9ESVNLKGxzbiwobG9nKS0+bF9jdXJyX2N5Y2xlLChsb2cpLT5sX2N1cnJfYmxvY2spOworc3RhdGljIGlubGluZSB4ZnNfbHNuX3QgeGxvZ19hc3NpZ25fbHNuKHVpbnQgY3ljbGUsIHVpbnQgYmxvY2spCit7CisJcmV0dXJuICgoeGZzX2xzbl90KWN5Y2xlIDw8IDMyKSB8IGJsb2NrOworfQogCi0jZGVmaW5lIFhMT0dfU0VUKGYsYikJCSgoKGYpICYgKGIpKSA9PSAoYikpCi0KLSNkZWZpbmUgR0VUX0NZQ0xFKHB0ciwgYXJjaCkgXAotICAgIChJTlRfR0VUKCoodWludCAqKShwdHIpLCBhcmNoKSA9PSBYTE9HX0hFQURFUl9NQUdJQ19OVU0gPyBcCi0JIElOVF9HRVQoKigodWludCAqKShwdHIpKzEpLCBhcmNoKSA6IFwKLQkgSU5UX0dFVCgqKHVpbnQgKikocHRyKSwgYXJjaCkgXAotICAgICkKK3N0YXRpYyBpbmxpbmUgdWludCB4bG9nX2dldF9jeWNsZShjaGFyICpwdHIpCit7CisJaWYgKGJlMzJfdG9fY3B1KCooX19iZTMyICopcHRyKSA9PSBYTE9HX0hFQURFUl9NQUdJQ19OVU0pCisJCXJldHVybiBiZTMyX3RvX2NwdSgqKChfX2JlMzIgKilwdHIgKyAxKSk7CisJZWxzZQorCQlyZXR1cm4gYmUzMl90b19jcHUoKihfX2JlMzIgKilwdHIpOworfQogCiAjZGVmaW5lIEJMS19BVkcoYmxrMSwgYmxrMikJKChibGsxK2JsazIpID4+IDEpCiAKLQogI2lmZGVmIF9fS0VSTkVMX18KIAogLyoKQEAgLTk2LDE5ICs4NSwxMCBAQAogICoKICAqIHRoaXMgaGFzIGVuZGlhbiBpc3N1ZXMsIG9mIGNvdXJzZS4KICAqLwotCi0jaWZuZGVmIFhGU19OQVRJVkVfSE9TVAotI2RlZmluZSBHRVRfQ0xJRU5UX0lEKGksYXJjaCkgXAotICAgICgoaSkgJiAweGZmKQotI2Vsc2UKLSNkZWZpbmUgR0VUX0NMSUVOVF9JRChpLGFyY2gpIFwKLSAgICAoKGkpID4+IDI0KQotI2VuZGlmCi0KLSNkZWZpbmUgR1JBTlRfTE9DSyhsb2cpCQltdXRleF9zcGlubG9jaygmKGxvZyktPmxfZ3JhbnRfbG9jaykKLSNkZWZpbmUgR1JBTlRfVU5MT0NLKGxvZywgcykJbXV0ZXhfc3BpbnVubG9jaygmKGxvZyktPmxfZ3JhbnRfbG9jaywgcykKLSNkZWZpbmUgTE9HX0xPQ0sobG9nKQkJbXV0ZXhfc3BpbmxvY2soJihsb2cpLT5sX2ljbG9nbG9jaykKLSNkZWZpbmUgTE9HX1VOTE9DSyhsb2csIHMpCW11dGV4X3NwaW51bmxvY2soJihsb2cpLT5sX2ljbG9nbG9jaywgcykKK3N0YXRpYyBpbmxpbmUgdWludCB4bG9nX2dldF9jbGllbnRfaWQoX19iZTMyIGkpCit7CisJcmV0dXJuIGJlMzJfdG9fY3B1KGkpID4+IDI0OworfQogCiAjZGVmaW5lIHhsb2dfcGFuaWMoYXJncy4uLikJY21uX2VycihDRV9QQU5JQywgIyMgYXJncykKICNkZWZpbmUgeGxvZ19leGl0KGFyZ3MuLi4pCWNtbl9lcnIoQ0VfUEFOSUMsICMjIGFyZ3MpCkBAIC0yODUsMTEgKzI2NSwxMSBAQAogCiAKIHR5cGVkZWYgc3RydWN0IHhsb2dfb3BfaGVhZGVyIHsKLQl4bG9nX3RpZF90IG9oX3RpZDsJLyogdHJhbnNhY3Rpb24gaWQgb2Ygb3BlcmF0aW9uCTogIDQgYiAqLwotCWludAkgICBvaF9sZW47CS8qIGJ5dGVzIGluIGRhdGEgcmVnaW9uCQk6ICA0IGIgKi8KLQlfX3VpbnQ4X3QgIG9oX2NsaWVudGlkOwkvKiB3aG8gc2VudCBtZSB0aGlzCQk6ICAxIGIgKi8KLQlfX3VpbnQ4X3QgIG9oX2ZsYWdzOwkvKgkJCQk6ICAxIGIgKi8KLQl1c2hvcnQJICAgb2hfcmVzMjsJLyogMzIgYml0IGFsaWduCQkJOiAgMiBiICovCisJX19iZTMyCSAgIG9oX3RpZDsJLyogdHJhbnNhY3Rpb24gaWQgb2Ygb3BlcmF0aW9uCTogIDQgYiAqLworCV9fYmUzMgkgICBvaF9sZW47CS8qIGJ5dGVzIGluIGRhdGEgcmVnaW9uCQk6ICA0IGIgKi8KKwlfX3U4CSAgIG9oX2NsaWVudGlkOwkvKiB3aG8gc2VudCBtZSB0aGlzCQk6ICAxIGIgKi8KKwlfX3U4CSAgIG9oX2ZsYWdzOwkvKgkJCQk6ICAxIGIgKi8KKwlfX3UxNgkgICBvaF9yZXMyOwkvKiAzMiBiaXQgYWxpZ24JCQk6ICAyIGIgKi8KIH0geGxvZ19vcF9oZWFkZXJfdDsKIAogCkBAIC0zMDcsMjUgKzI4NywyNSBAQAogI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0IHhsb2dfcmVjX2hlYWRlciB7Ci0JdWludAkgIGhfbWFnaWNubzsJLyogbG9nIHJlY29yZCAoTFIpIGlkZW50aWZpZXIJCTogIDQgKi8KLQl1aW50CSAgaF9jeWNsZTsJLyogd3JpdGUgY3ljbGUgb2YgbG9nCQkJOiAgNCAqLwotCWludAkgIGhfdmVyc2lvbjsJLyogTFIgdmVyc2lvbgkJCQk6ICA0ICovCi0JaW50CSAgaF9sZW47CS8qIGxlbiBpbiBieXRlczsgc2hvdWxkIGJlIDY0LWJpdCBhbGlnbmVkOiA0ICovCi0JeGZzX2xzbl90IGhfbHNuOwkvKiBsc24gb2YgdGhpcyBMUgkJCTogIDggKi8KLQl4ZnNfbHNuX3QgaF90YWlsX2xzbjsJLyogbHNuIG9mIDFzdCBMUiB3LyBidWZmZXJzIG5vdCBjb21taXR0ZWQ6IDggKi8KLQl1aW50CSAgaF9jaGtzdW07CS8qIG1heSBub3QgYmUgdXNlZDsgbm9uLXplcm8gaWYgdXNlZAk6ICA0ICovCi0JaW50CSAgaF9wcmV2X2Jsb2NrOyAvKiBibG9jayBudW1iZXIgdG8gcHJldmlvdXMgTFIJCTogIDQgKi8KLQlpbnQJICBoX251bV9sb2dvcHM7CS8qIG51bWJlciBvZiBsb2cgb3BlcmF0aW9ucyBpbiB0aGlzIExSCTogIDQgKi8KLQl1aW50CSAgaF9jeWNsZV9kYXRhW1hMT0dfSEVBREVSX0NZQ0xFX1NJWkUgLyBCQlNJWkVdOworCV9fYmUzMgkgIGhfbWFnaWNubzsJLyogbG9nIHJlY29yZCAoTFIpIGlkZW50aWZpZXIJCTogIDQgKi8KKwlfX2JlMzIJICBoX2N5Y2xlOwkvKiB3cml0ZSBjeWNsZSBvZiBsb2cJCQk6ICA0ICovCisJX19iZTMyCSAgaF92ZXJzaW9uOwkvKiBMUiB2ZXJzaW9uCQkJCTogIDQgKi8KKwlfX2JlMzIJICBoX2xlbjsJLyogbGVuIGluIGJ5dGVzOyBzaG91bGQgYmUgNjQtYml0IGFsaWduZWQ6IDQgKi8KKwlfX2JlNjQJICBoX2xzbjsJLyogbHNuIG9mIHRoaXMgTFIJCQk6ICA4ICovCisJX19iZTY0CSAgaF90YWlsX2xzbjsJLyogbHNuIG9mIDFzdCBMUiB3LyBidWZmZXJzIG5vdCBjb21taXR0ZWQ6IDggKi8KKwlfX2JlMzIJICBoX2Noa3N1bTsJLyogbWF5IG5vdCBiZSB1c2VkOyBub24temVybyBpZiB1c2VkCTogIDQgKi8KKwlfX2JlMzIJICBoX3ByZXZfYmxvY2s7IC8qIGJsb2NrIG51bWJlciB0byBwcmV2aW91cyBMUgkJOiAgNCAqLworCV9fYmUzMgkgIGhfbnVtX2xvZ29wczsJLyogbnVtYmVyIG9mIGxvZyBvcGVyYXRpb25zIGluIHRoaXMgTFIJOiAgNCAqLworCV9fYmUzMgkgIGhfY3ljbGVfZGF0YVtYTE9HX0hFQURFUl9DWUNMRV9TSVpFIC8gQkJTSVpFXTsKIAkvKiBuZXcgZmllbGRzICovCi0JaW50ICAgICAgIGhfZm10OyAgICAgICAgLyogZm9ybWF0IG9mIGxvZyByZWNvcmQgICAgICAgICAgICAgICAgIDogIDQgKi8KLQl1dWlkX3QgICAgaF9mc191dWlkOyAgICAvKiB1dWlkIG9mIEZTICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxNiAqLwotCWludCAgICAgICBoX3NpemU7CS8qIGljbG9nIHNpemUJCQkJOiAgNCAqLworCV9fYmUzMiAgICBoX2ZtdDsgICAgICAgIC8qIGZvcm1hdCBvZiBsb2cgcmVjb3JkICAgICAgICAgICAgICAgICA6ICA0ICovCisJdXVpZF90CSAgaF9mc191dWlkOyAgICAvKiB1dWlkIG9mIEZTICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxNiAqLworCV9fYmUzMgkgIGhfc2l6ZTsJLyogaWNsb2cgc2l6ZQkJCQk6ICA0ICovCiB9IHhsb2dfcmVjX2hlYWRlcl90OwogCiB0eXBlZGVmIHN0cnVjdCB4bG9nX3JlY19leHRfaGVhZGVyIHsKLQl1aW50CSAgeGhfY3ljbGU7CS8qIHdyaXRlIGN5Y2xlIG9mIGxvZwkJCTogNCAqLwotCXVpbnQJICB4aF9jeWNsZV9kYXRhW1hMT0dfSEVBREVSX0NZQ0xFX1NJWkUgLyBCQlNJWkVdOyAvKgk6IDI1NiAqLworCV9fYmUzMgkgIHhoX2N5Y2xlOwkvKiB3cml0ZSBjeWNsZSBvZiBsb2cJCQk6IDQgKi8KKwlfX2JlMzIJICB4aF9jeWNsZV9kYXRhW1hMT0dfSEVBREVSX0NZQ0xFX1NJWkUgLyBCQlNJWkVdOyAvKgk6IDI1NiAqLwogfSB4bG9nX3JlY19leHRfaGVhZGVyX3Q7CiAKICNpZmRlZiBfX0tFUk5FTF9fCkBAIC00MTUsNyArMzk1LDcgQEAKIAl4bG9nX3RpY2tldF90CQkqbF91bm1vdW50X2ZyZWU7Lyoga21lbV9mcmVlIHRoZXNlIGFkZHJlc3NlcyAqLwogCXhsb2dfdGlja2V0X3QJCSpsX3RhaWw7ICAgICAgICAvKiBmcmVlIGxpc3Qgb2YgdGlja2V0cyAqLwogCXhsb2dfaW5fY29yZV90CQkqbF9pY2xvZzsgICAgICAgLyogaGVhZCBsb2cgcXVldWUJKi8KLQlsb2NrX3QJCQlsX2ljbG9nbG9jazsgICAgLyogZ3JhYiB0byBjaGFuZ2UgaWNsb2cgc3RhdGUgKi8KKwlzcGlubG9ja190CQlsX2ljbG9nbG9jazsgICAgLyogZ3JhYiB0byBjaGFuZ2UgaWNsb2cgc3RhdGUgKi8KIAl4ZnNfbHNuX3QJCWxfdGFpbF9sc247ICAgICAvKiBsc24gb2YgMXN0IExSIHdpdGggdW5mbHVzaGVkCiAJCQkJCQkgKiBidWZmZXJzICovCiAJeGZzX2xzbl90CQlsX2xhc3Rfc3luY19sc247LyogbHNuIG9mIGxhc3QgTFIgb24gZGlzayAqLwpAQCAtNDM5LDcgKzQxOSw3IEBACiAJY2hhcgkJCSpsX2ljbG9nX2Jha1tYTE9HX01BWF9JQ0xPR1NdOwogCiAJLyogVGhlIGZvbGxvd2luZyBibG9jayBvZiBmaWVsZHMgYXJlIGNoYW5nZWQgd2hpbGUgaG9sZGluZyBncmFudF9sb2NrICovCi0JbG9ja190CQkJbF9ncmFudF9sb2NrOworCXNwaW5sb2NrX3QJCWxfZ3JhbnRfbG9jazsKIAl4bG9nX3RpY2tldF90CQkqbF9yZXNlcnZlX2hlYWRxOwogCXhsb2dfdGlja2V0X3QJCSpsX3dyaXRlX2hlYWRxOwogCWludAkJCWxfZ3JhbnRfcmVzZXJ2ZV9jeWNsZTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYyBiL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYwppbmRleCA4NTFlY2E4Li5iODJkNWQ0IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmMKKysrIGIvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jCkBAIC0xOTgsNyArMTk4LDcgQEAKIAljbW5fZXJyKENFX0RFQlVHLCAiICAgIGxvZyA6IHV1aWQgPSAiKTsKIAlmb3IgKGIgPSAwOyBiIDwgMTY7IGIrKykKIAkJY21uX2VycihDRV9ERUJVRywgIiUwMngiLCgodWNoYXJfdCAqKSZoZWFkLT5oX2ZzX3V1aWQpW2JdKTsKLQljbW5fZXJyKENFX0RFQlVHLCAiLCBmbXQgPSAlZFxuIiwgSU5UX0dFVChoZWFkLT5oX2ZtdCwgQVJDSF9DT05WRVJUKSk7CisJY21uX2VycihDRV9ERUJVRywgIiwgZm10ID0gJWRcbiIsIGJlMzJfdG9fY3B1KGhlYWQtPmhfZm10KSk7CiB9CiAjZWxzZQogI2RlZmluZSB4bG9nX2hlYWRlcl9jaGVja19kdW1wKG1wLCBoZWFkKQpAQCAtMjEyLDE0ICsyMTIsMTQgQEAKIAl4ZnNfbW91bnRfdAkJKm1wLAogCXhsb2dfcmVjX2hlYWRlcl90CSpoZWFkKQogewotCUFTU0VSVChJTlRfR0VUKGhlYWQtPmhfbWFnaWNubywgQVJDSF9DT05WRVJUKSA9PSBYTE9HX0hFQURFUl9NQUdJQ19OVU0pOworCUFTU0VSVChiZTMyX3RvX2NwdShoZWFkLT5oX21hZ2ljbm8pID09IFhMT0dfSEVBREVSX01BR0lDX05VTSk7CiAKIAkvKgogCSAqIElSSVggZG9lc24ndCB3cml0ZSB0aGUgaF9mbXQgZmllbGQgYW5kIGxlYXZlcyBpdCB6ZXJvZWQKIAkgKiAoWExPR19GTVRfVU5LTk9XTikuIFRoaXMgc3RvcHMgdXMgZnJvbSB0cnlpbmcgdG8gcmVjb3ZlcgogCSAqIGEgZGlydHkgbG9nIGNyZWF0ZWQgaW4gSVJJWC4KIAkgKi8KLQlpZiAodW5saWtlbHkoSU5UX0dFVChoZWFkLT5oX2ZtdCwgQVJDSF9DT05WRVJUKSAhPSBYTE9HX0ZNVCkpIHsKKwlpZiAodW5saWtlbHkoYmUzMl90b19jcHUoaGVhZC0+aF9mbXQpICE9IFhMT0dfRk1UKSkgewogCQl4bG9nX3dhcm4oCiAJIlhGUzogZGlydHkgbG9nIHdyaXR0ZW4gaW4gaW5jb21wYXRpYmxlIGZvcm1hdCAtIGNhbid0IHJlY292ZXIiKTsKIAkJeGxvZ19oZWFkZXJfY2hlY2tfZHVtcChtcCwgaGVhZCk7CkBAIC0yNDUsNyArMjQ1LDcgQEAKIAl4ZnNfbW91bnRfdAkJKm1wLAogCXhsb2dfcmVjX2hlYWRlcl90CSpoZWFkKQogewotCUFTU0VSVChJTlRfR0VUKGhlYWQtPmhfbWFnaWNubywgQVJDSF9DT05WRVJUKSA9PSBYTE9HX0hFQURFUl9NQUdJQ19OVU0pOworCUFTU0VSVChiZTMyX3RvX2NwdShoZWFkLT5oX21hZ2ljbm8pID09IFhMT0dfSEVBREVSX01BR0lDX05VTSk7CiAKIAlpZiAodXVpZF9pc19uaWwoJmhlYWQtPmhfZnNfdXVpZCkpIHsKIAkJLyoKQEAgLTI5Myw3ICsyOTMsNyBAQAogICogTm90ZSB0aGF0IHRoZSBhbGdvcml0aG0gY2FuIG5vdCBiZSBwZXJmZWN0IGJlY2F1c2UgdGhlIGRpc2sgd2lsbCBub3QKICAqIG5lY2Vzc2FyaWx5IGJlIHBlcmZlY3QuCiAgKi8KLWludAorU1RBVElDIGludAogeGxvZ19maW5kX2N5Y2xlX3N0YXJ0KAogCXhsb2dfdAkJKmxvZywKIAl4ZnNfYnVmX3QJKmJwLApAQCAtMzExLDcgKzMxMSw3IEBACiAJCWlmICgoZXJyb3IgPSB4bG9nX2JyZWFkKGxvZywgbWlkX2JsaywgMSwgYnApKSkKIAkJCXJldHVybiBlcnJvcjsKIAkJb2Zmc2V0ID0geGxvZ19hbGlnbihsb2csIG1pZF9ibGssIDEsIGJwKTsKLQkJbWlkX2N5Y2xlID0gR0VUX0NZQ0xFKG9mZnNldCwgQVJDSF9DT05WRVJUKTsKKwkJbWlkX2N5Y2xlID0geGxvZ19nZXRfY3ljbGUob2Zmc2V0KTsKIAkJaWYgKG1pZF9jeWNsZSA9PSBjeWNsZSkgewogCQkJKmxhc3RfYmxrID0gbWlkX2JsazsKIAkJCS8qIGxhc3RfaGFsZl9jeWNsZSA9PSBtaWRfY3ljbGUgKi8KQEAgLTM3MSw3ICszNzEsNyBAQAogCiAJCWJ1ZiA9IHhsb2dfYWxpZ24obG9nLCBpLCBiY291bnQsIGJwKTsKIAkJZm9yIChqID0gMDsgaiA8IGJjb3VudDsgaisrKSB7Ci0JCQljeWNsZSA9IEdFVF9DWUNMRShidWYsIEFSQ0hfQ09OVkVSVCk7CisJCQljeWNsZSA9IHhsb2dfZ2V0X2N5Y2xlKGJ1Zik7CiAJCQlpZiAoY3ljbGUgPT0gc3RvcF9vbl9jeWNsZV9ubykgewogCQkJCSpuZXdfYmxrID0gaStqOwogCQkJCWdvdG8gb3V0OwpAQCAtNDQ3LDggKzQ0Nyw3IEBACiAKIAkJaGVhZCA9ICh4bG9nX3JlY19oZWFkZXJfdCAqKW9mZnNldDsKIAotCQlpZiAoWExPR19IRUFERVJfTUFHSUNfTlVNID09Ci0JCSAgICBJTlRfR0VUKGhlYWQtPmhfbWFnaWNubywgQVJDSF9DT05WRVJUKSkKKwkJaWYgKFhMT0dfSEVBREVSX01BR0lDX05VTSA9PSBiZTMyX3RvX2NwdShoZWFkLT5oX21hZ2ljbm8pKQogCQkJYnJlYWs7CiAKIAkJaWYgKCFzbWFsbG1lbSkKQEAgLTQ4MCw3ICs0NzksNyBAQAogCSAqIHJlY29yZCBkbyB3ZSB1cGRhdGUgbGFzdF9ibGsuCiAJICovCiAJaWYgKFhGU19TQl9WRVJTSU9OX0hBU0xPR1YyKCZsb2ctPmxfbXAtPm1fc2IpKSB7Ci0JCXVpbnQJaF9zaXplID0gSU5UX0dFVChoZWFkLT5oX3NpemUsIEFSQ0hfQ09OVkVSVCk7CisJCXVpbnQJaF9zaXplID0gYmUzMl90b19jcHUoaGVhZC0+aF9zaXplKTsKIAogCQl4aGRycyA9IGhfc2l6ZSAvIFhMT0dfSEVBREVSX0NZQ0xFX1NJWkU7CiAJCWlmIChoX3NpemUgJSBYTE9HX0hFQURFUl9DWUNMRV9TSVpFKQpAQCAtNDg5LDggKzQ4OCw4IEBACiAJCXhoZHJzID0gMTsKIAl9CiAKLQlpZiAoKmxhc3RfYmxrIC0gaSArIGV4dHJhX2JibGtzCi0JCQkhPSBCVE9CQihJTlRfR0VUKGhlYWQtPmhfbGVuLCBBUkNIX0NPTlZFUlQpKSArIHhoZHJzKQorCWlmICgqbGFzdF9ibGsgLSBpICsgZXh0cmFfYmJsa3MgIT0KKwkgICAgQlRPQkIoYmUzMl90b19jcHUoaGVhZC0+aF9sZW4pKSArIHhoZHJzKQogCQkqbGFzdF9ibGsgPSBpOwogCiBvdXQ6CkBAIC01NTAsMTMgKzU0OSwxMyBAQAogCWlmICgoZXJyb3IgPSB4bG9nX2JyZWFkKGxvZywgMCwgMSwgYnApKSkKIAkJZ290byBicF9lcnI7CiAJb2Zmc2V0ID0geGxvZ19hbGlnbihsb2csIDAsIDEsIGJwKTsKLQlmaXJzdF9oYWxmX2N5Y2xlID0gR0VUX0NZQ0xFKG9mZnNldCwgQVJDSF9DT05WRVJUKTsKKwlmaXJzdF9oYWxmX2N5Y2xlID0geGxvZ19nZXRfY3ljbGUob2Zmc2V0KTsKIAogCWxhc3RfYmxrID0gaGVhZF9ibGsgPSBsb2dfYmJudW0gLSAxOwkvKiBnZXQgY3ljbGUgIyBvZiBsYXN0IGJsb2NrICovCiAJaWYgKChlcnJvciA9IHhsb2dfYnJlYWQobG9nLCBsYXN0X2JsaywgMSwgYnApKSkKIAkJZ290byBicF9lcnI7CiAJb2Zmc2V0ID0geGxvZ19hbGlnbihsb2csIGxhc3RfYmxrLCAxLCBicCk7Ci0JbGFzdF9oYWxmX2N5Y2xlID0gR0VUX0NZQ0xFKG9mZnNldCwgQVJDSF9DT05WRVJUKTsKKwlsYXN0X2hhbGZfY3ljbGUgPSB4bG9nX2dldF9jeWNsZShvZmZzZXQpOwogCUFTU0VSVChsYXN0X2hhbGZfY3ljbGUgIT0gMCk7CiAKIAkvKgpAQCAtODA4LDcgKzgwNyw3IEBACiAJCWlmICgoZXJyb3IgPSB4bG9nX2JyZWFkKGxvZywgMCwgMSwgYnApKSkKIAkJCWdvdG8gYnJlYWRfZXJyOwogCQlvZmZzZXQgPSB4bG9nX2FsaWduKGxvZywgMCwgMSwgYnApOwotCQlpZiAoR0VUX0NZQ0xFKG9mZnNldCwgQVJDSF9DT05WRVJUKSA9PSAwKSB7CisJCWlmICh4bG9nX2dldF9jeWNsZShvZmZzZXQpID09IDApIHsKIAkJCSp0YWlsX2JsayA9IDA7CiAJCQkvKiBsZWF2ZSBhbGwgb3RoZXIgbG9nIGluaXRlZCB2YWx1ZXMgYWxvbmUgKi8KIAkJCWdvdG8gZXhpdDsKQEAgLTgyMyw4ICs4MjIsNyBAQAogCQlpZiAoKGVycm9yID0geGxvZ19icmVhZChsb2csIGksIDEsIGJwKSkpCiAJCQlnb3RvIGJyZWFkX2VycjsKIAkJb2Zmc2V0ID0geGxvZ19hbGlnbihsb2csIGksIDEsIGJwKTsKLQkJaWYgKFhMT0dfSEVBREVSX01BR0lDX05VTSA9PQotCQkgICAgSU5UX0dFVCgqKHVpbnQgKilvZmZzZXQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJaWYgKFhMT0dfSEVBREVSX01BR0lDX05VTSA9PSBiZTMyX3RvX2NwdSgqKF9fYmUzMiAqKW9mZnNldCkpIHsKIAkJCWZvdW5kID0gMTsKIAkJCWJyZWFrOwogCQl9CkBAIC04NDEsNyArODM5LDcgQEAKIAkJCQlnb3RvIGJyZWFkX2VycjsKIAkJCW9mZnNldCA9IHhsb2dfYWxpZ24obG9nLCBpLCAxLCBicCk7CiAJCQlpZiAoWExPR19IRUFERVJfTUFHSUNfTlVNID09Ci0JCQkgICAgSU5UX0dFVCgqKHVpbnQqKW9mZnNldCwgQVJDSF9DT05WRVJUKSkgeworCQkJICAgIGJlMzJfdG9fY3B1KCooX19iZTMyICopb2Zmc2V0KSkgewogCQkJCWZvdW5kID0gMjsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTg1NSw3ICs4NTMsNyBAQAogCiAJLyogZmluZCBibGtfbm8gb2YgdGFpbCBvZiBsb2cgKi8KIAlyaGVhZCA9ICh4bG9nX3JlY19oZWFkZXJfdCAqKW9mZnNldDsKLQkqdGFpbF9ibGsgPSBCTE9DS19MU04oSU5UX0dFVChyaGVhZC0+aF90YWlsX2xzbiwgQVJDSF9DT05WRVJUKSk7CisJKnRhaWxfYmxrID0gQkxPQ0tfTFNOKGJlNjRfdG9fY3B1KHJoZWFkLT5oX3RhaWxfbHNuKSk7CiAKIAkvKgogCSAqIFJlc2V0IGxvZyB2YWx1ZXMgYWNjb3JkaW5nIHRvIHRoZSBzdGF0ZSBvZiB0aGUgbG9nIHdoZW4gd2UKQEAgLTg2OSwxMSArODY3LDExIEBACiAJICovCiAJbG9nLT5sX3ByZXZfYmxvY2sgPSBpOwogCWxvZy0+bF9jdXJyX2Jsb2NrID0gKGludCkqaGVhZF9ibGs7Ci0JbG9nLT5sX2N1cnJfY3ljbGUgPSBJTlRfR0VUKHJoZWFkLT5oX2N5Y2xlLCBBUkNIX0NPTlZFUlQpOworCWxvZy0+bF9jdXJyX2N5Y2xlID0gYmUzMl90b19jcHUocmhlYWQtPmhfY3ljbGUpOwogCWlmIChmb3VuZCA9PSAyKQogCQlsb2ctPmxfY3Vycl9jeWNsZSsrOwotCWxvZy0+bF90YWlsX2xzbiA9IElOVF9HRVQocmhlYWQtPmhfdGFpbF9sc24sIEFSQ0hfQ09OVkVSVCk7Ci0JbG9nLT5sX2xhc3Rfc3luY19sc24gPSBJTlRfR0VUKHJoZWFkLT5oX2xzbiwgQVJDSF9DT05WRVJUKTsKKwlsb2ctPmxfdGFpbF9sc24gPSBiZTY0X3RvX2NwdShyaGVhZC0+aF90YWlsX2xzbik7CisJbG9nLT5sX2xhc3Rfc3luY19sc24gPSBiZTY0X3RvX2NwdShyaGVhZC0+aF9sc24pOwogCWxvZy0+bF9ncmFudF9yZXNlcnZlX2N5Y2xlID0gbG9nLT5sX2N1cnJfY3ljbGU7CiAJbG9nLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXMgPSBCQlRPQihsb2ctPmxfY3Vycl9ibG9jayk7CiAJbG9nLT5sX2dyYW50X3dyaXRlX2N5Y2xlID0gbG9nLT5sX2N1cnJfY3ljbGU7CkBAIC04OTEsOCArODg5LDggQEAKIAkgKiB1bm1vdW50IHJlY29yZCByYXRoZXIgdGhhbiB0aGUgYmxvY2sgYWZ0ZXIgaXQuCiAJICovCiAJaWYgKFhGU19TQl9WRVJTSU9OX0hBU0xPR1YyKCZsb2ctPmxfbXAtPm1fc2IpKSB7Ci0JCWludAloX3NpemUgPSBJTlRfR0VUKHJoZWFkLT5oX3NpemUsIEFSQ0hfQ09OVkVSVCk7Ci0JCWludAloX3ZlcnNpb24gPSBJTlRfR0VUKHJoZWFkLT5oX3ZlcnNpb24sIEFSQ0hfQ09OVkVSVCk7CisJCWludAloX3NpemUgPSBiZTMyX3RvX2NwdShyaGVhZC0+aF9zaXplKTsKKwkJaW50CWhfdmVyc2lvbiA9IGJlMzJfdG9fY3B1KHJoZWFkLT5oX3ZlcnNpb24pOwogCiAJCWlmICgoaF92ZXJzaW9uICYgWExPR19WRVJTSU9OXzIpICYmCiAJCSAgICAoaF9zaXplID4gWExPR19IRUFERVJfQ1lDTEVfU0laRSkpIHsKQEAgLTkwNiwxMCArOTA0LDEwIEBACiAJCWhibGtzID0gMTsKIAl9CiAJYWZ0ZXJfdW1vdW50X2JsayA9IChpICsgaGJsa3MgKyAoaW50KQotCQlCVE9CQihJTlRfR0VUKHJoZWFkLT5oX2xlbiwgQVJDSF9DT05WRVJUKSkpICUgbG9nLT5sX2xvZ0JCc2l6ZTsKKwkJQlRPQkIoYmUzMl90b19jcHUocmhlYWQtPmhfbGVuKSkpICUgbG9nLT5sX2xvZ0JCc2l6ZTsKIAl0YWlsX2xzbiA9IGxvZy0+bF90YWlsX2xzbjsKIAlpZiAoKmhlYWRfYmxrID09IGFmdGVyX3Vtb3VudF9ibGsgJiYKLQkgICAgSU5UX0dFVChyaGVhZC0+aF9udW1fbG9nb3BzLCBBUkNIX0NPTlZFUlQpID09IDEpIHsKKwkgICAgYmUzMl90b19jcHUocmhlYWQtPmhfbnVtX2xvZ29wcykgPT0gMSkgewogCQl1bW91bnRfZGF0YV9ibGsgPSAoaSArIGhibGtzKSAlIGxvZy0+bF9sb2dCQnNpemU7CiAJCWlmICgoZXJyb3IgPSB4bG9nX2JyZWFkKGxvZywgdW1vdW50X2RhdGFfYmxrLCAxLCBicCkpKSB7CiAJCQlnb3RvIGJyZWFkX2VycjsKQEAgLTkyMiwxMCArOTIwLDEyIEBACiAJCQkgKiBsb2cgcmVjb3JkcyB3aWxsIHBvaW50IHJlY292ZXJ5IHRvIGFmdGVyIHRoZQogCQkJICogY3VycmVudCB1bm1vdW50IHJlY29yZC4KIAkJCSAqLwotCQkJQVNTSUdOX0FOWV9MU05fSE9TVChsb2ctPmxfdGFpbF9sc24sIGxvZy0+bF9jdXJyX2N5Y2xlLAotCQkJCQlhZnRlcl91bW91bnRfYmxrKTsKLQkJCUFTU0lHTl9BTllfTFNOX0hPU1QobG9nLT5sX2xhc3Rfc3luY19sc24sIGxvZy0+bF9jdXJyX2N5Y2xlLAotCQkJCQlhZnRlcl91bW91bnRfYmxrKTsKKwkJCWxvZy0+bF90YWlsX2xzbiA9CisJCQkJeGxvZ19hc3NpZ25fbHNuKGxvZy0+bF9jdXJyX2N5Y2xlLAorCQkJCQkJYWZ0ZXJfdW1vdW50X2Jsayk7CisJCQlsb2ctPmxfbGFzdF9zeW5jX2xzbiA9CisJCQkJeGxvZ19hc3NpZ25fbHNuKGxvZy0+bF9jdXJyX2N5Y2xlLAorCQkJCQkJYWZ0ZXJfdW1vdW50X2Jsayk7CiAJCQkqdGFpbF9ibGsgPSBhZnRlcl91bW91bnRfYmxrOwogCiAJCQkvKgpAQCAtOTg2LDcgKzk4Niw3IEBACiAgKgktMSA9PiB1c2UgKmJsa19ubyBhcyB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIGxvZwogICoJPjAgPT4gZXJyb3IgaGFzIG9jY3VycmVkCiAgKi8KLWludAorU1RBVElDIGludAogeGxvZ19maW5kX3plcm9lZCgKIAl4bG9nX3QJCSpsb2csCiAJeGZzX2RhZGRyX3QJKmJsa19ubykKQEAgLTEwMDcsNyArMTAwNyw3IEBACiAJaWYgKChlcnJvciA9IHhsb2dfYnJlYWQobG9nLCAwLCAxLCBicCkpKQogCQlnb3RvIGJwX2VycjsKIAlvZmZzZXQgPSB4bG9nX2FsaWduKGxvZywgMCwgMSwgYnApOwotCWZpcnN0X2N5Y2xlID0gR0VUX0NZQ0xFKG9mZnNldCwgQVJDSF9DT05WRVJUKTsKKwlmaXJzdF9jeWNsZSA9IHhsb2dfZ2V0X2N5Y2xlKG9mZnNldCk7CiAJaWYgKGZpcnN0X2N5Y2xlID09IDApIHsJCS8qIGNvbXBsZXRlbHkgemVyb2VkIGxvZyAqLwogCQkqYmxrX25vID0gMDsKIAkJeGxvZ19wdXRfYnAoYnApOwpAQCAtMTAxOCw3ICsxMDE4LDcgQEAKIAlpZiAoKGVycm9yID0geGxvZ19icmVhZChsb2csIGxvZ19iYm51bS0xLCAxLCBicCkpKQogCQlnb3RvIGJwX2VycjsKIAlvZmZzZXQgPSB4bG9nX2FsaWduKGxvZywgbG9nX2JibnVtLTEsIDEsIGJwKTsKLQlsYXN0X2N5Y2xlID0gR0VUX0NZQ0xFKG9mZnNldCwgQVJDSF9DT05WRVJUKTsKKwlsYXN0X2N5Y2xlID0geGxvZ19nZXRfY3ljbGUob2Zmc2V0KTsKIAlpZiAobGFzdF9jeWNsZSAhPSAwKSB7CQkvKiBsb2cgY29tcGxldGVseSB3cml0dGVuIHRvICovCiAJCXhsb2dfcHV0X2JwKGJwKTsKIAkJcmV0dXJuIDA7CkBAIC0xMDk4LDEzICsxMDk4LDEzIEBACiAJeGxvZ19yZWNfaGVhZGVyX3QJKnJlY3AgPSAoeGxvZ19yZWNfaGVhZGVyX3QgKilidWY7CiAKIAltZW1zZXQoYnVmLCAwLCBCQlNJWkUpOwotCUlOVF9TRVQocmVjcC0+aF9tYWdpY25vLCBBUkNIX0NPTlZFUlQsIFhMT0dfSEVBREVSX01BR0lDX05VTSk7Ci0JSU5UX1NFVChyZWNwLT5oX2N5Y2xlLCBBUkNIX0NPTlZFUlQsIGN5Y2xlKTsKLQlJTlRfU0VUKHJlY3AtPmhfdmVyc2lvbiwgQVJDSF9DT05WRVJULAorCXJlY3AtPmhfbWFnaWNubyA9IGNwdV90b19iZTMyKFhMT0dfSEVBREVSX01BR0lDX05VTSk7CisJcmVjcC0+aF9jeWNsZSA9IGNwdV90b19iZTMyKGN5Y2xlKTsKKwlyZWNwLT5oX3ZlcnNpb24gPSBjcHVfdG9fYmUzMigKIAkJCVhGU19TQl9WRVJTSU9OX0hBU0xPR1YyKCZsb2ctPmxfbXAtPm1fc2IpID8gMiA6IDEpOwotCUFTU0lHTl9BTllfTFNOX0RJU0socmVjcC0+aF9sc24sIGN5Y2xlLCBibG9jayk7Ci0JQVNTSUdOX0FOWV9MU05fRElTSyhyZWNwLT5oX3RhaWxfbHNuLCB0YWlsX2N5Y2xlLCB0YWlsX2Jsb2NrKTsKLQlJTlRfU0VUKHJlY3AtPmhfZm10LCBBUkNIX0NPTlZFUlQsIFhMT0dfRk1UKTsKKwlyZWNwLT5oX2xzbiA9IGNwdV90b19iZTY0KHhsb2dfYXNzaWduX2xzbihjeWNsZSwgYmxvY2spKTsKKwlyZWNwLT5oX3RhaWxfbHNuID0gY3B1X3RvX2JlNjQoeGxvZ19hc3NpZ25fbHNuKHRhaWxfY3ljbGUsIHRhaWxfYmxvY2spKTsKKwlyZWNwLT5oX2ZtdCA9IGNwdV90b19iZTMyKFhMT0dfRk1UKTsKIAltZW1jcHkoJnJlY3AtPmhfZnNfdXVpZCwgJmxvZy0+bF9tcC0+bV9zYi5zYl91dWlkLCBzaXplb2YodXVpZF90KSk7CiB9CiAKQEAgLTIyMTEsNyArMjIxMSw3IEBACiAJICogb3ZlcmxhcCB3aXRoIGZ1dHVyZSByZWFkcyBvZiB0aG9zZSBpbm9kZXMuCiAJICovCiAJaWYgKFhGU19ESU5PREVfTUFHSUMgPT0KLQkgICAgSU5UX0dFVCgqKChfX3VpbnQxNl90ICopKHhmc19idWZfb2Zmc2V0KGJwLCAwKSkpLCBBUkNIX0NPTlZFUlQpICYmCisJICAgIGJlMTZfdG9fY3B1KCooKF9fYmUxNiAqKXhmc19idWZfb2Zmc2V0KGJwLCAwKSkpICYmCiAJICAgIChYRlNfQlVGX0NPVU5UKGJwKSAhPSBNQVgobG9nLT5sX21wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwKIAkJCShfX3VpbnQzMl90KVhGU19JTk9ERV9DTFVTVEVSX1NJWkUobG9nLT5sX21wKSkpKSB7CiAJCVhGU19CVUZfU1RBTEUoYnApOwpAQCAtMjU4MSw4ICsyNTgxLDcgQEAKIAkvKgogCSAqIFRoaXMgdHlwZSBvZiBxdW90YXMgd2FzIHR1cm5lZCBvZmYsIHNvIGlnbm9yZSB0aGlzIHJlY29yZC4KIAkgKi8KLQl0eXBlID0gSU5UX0dFVChyZWNkZHEtPmRfZmxhZ3MsIEFSQ0hfQ09OVkVSVCkgJgotCQkJKFhGU19EUV9VU0VSIHwgWEZTX0RRX1BST0ogfCBYRlNfRFFfR1JPVVApOworCXR5cGUgPSByZWNkZHEtPmRfZmxhZ3MgJiAoWEZTX0RRX1VTRVIgfCBYRlNfRFFfUFJPSiB8IFhGU19EUV9HUk9VUCk7CiAJQVNTRVJUKHR5cGUpOwogCWlmIChsb2ctPmxfcXVvdGFvZmZzX2ZsYWcgJiB0eXBlKQogCQlyZXR1cm4gKDApOwpAQCAtMjY2MCw3ICsyNjU5LDYgQEAKIAl4ZnNfbW91bnRfdAkJKm1wOwogCXhmc19lZmlfbG9nX2l0ZW1fdAkqZWZpcDsKIAl4ZnNfZWZpX2xvZ19mb3JtYXRfdAkqZWZpX2Zvcm1hdHA7Ci0JU1BMREVDTChzKTsKIAogCWlmIChwYXNzID09IFhMT0dfUkVDT1ZFUl9QQVNTMSkgewogCQlyZXR1cm4gMDsKQEAgLTI2NzgsMTEgKzI2NzYsMTEgQEAKIAllZmlwLT5lZmlfbmV4dF9leHRlbnQgPSBlZmlfZm9ybWF0cC0+ZWZpX25leHRlbnRzOwogCWVmaXAtPmVmaV9mbGFncyB8PSBYRlNfRUZJX0NPTU1JVFRFRDsKIAotCUFJTF9MT0NLKG1wLHMpOworCXNwaW5fbG9jaygmbXAtPm1fYWlsX2xvY2spOwogCS8qCiAJICogeGZzX3RyYW5zX3VwZGF0ZV9haWwoKSBkcm9wcyB0aGUgQUlMIGxvY2suCiAJICovCi0JeGZzX3RyYW5zX3VwZGF0ZV9haWwobXAsICh4ZnNfbG9nX2l0ZW1fdCAqKWVmaXAsIGxzbiwgcyk7CisJeGZzX3RyYW5zX3VwZGF0ZV9haWwobXAsICh4ZnNfbG9nX2l0ZW1fdCAqKWVmaXAsIGxzbik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI3MDcsNyArMjcwNSw2IEBACiAJeGZzX2xvZ19pdGVtX3QJCSpsaXA7CiAJaW50CQkJZ2VuOwogCV9fdWludDY0X3QJCWVmaV9pZDsKLQlTUExERUNMKHMpOwogCiAJaWYgKHBhc3MgPT0gWExPR19SRUNPVkVSX1BBU1MxKSB7CiAJCXJldHVybjsKQEAgLTI3MjUsNyArMjcyMiw3IEBACiAJICogaW4gdGhlIEFJTC4KIAkgKi8KIAltcCA9IGxvZy0+bF9tcDsKLQlBSUxfTE9DSyhtcCxzKTsKKwlzcGluX2xvY2soJm1wLT5tX2FpbF9sb2NrKTsKIAlsaXAgPSB4ZnNfdHJhbnNfZmlyc3RfYWlsKG1wLCAmZ2VuKTsKIAl3aGlsZSAobGlwICE9IE5VTEwpIHsKIAkJaWYgKGxpcC0+bGlfdHlwZSA9PSBYRlNfTElfRUZJKSB7CkBAIC0yNzM1LDIyICsyNzMyLDE0IEBACiAJCQkJICogeGZzX3RyYW5zX2RlbGV0ZV9haWwoKSBkcm9wcyB0aGUKIAkJCQkgKiBBSUwgbG9jay4KIAkJCQkgKi8KLQkJCQl4ZnNfdHJhbnNfZGVsZXRlX2FpbChtcCwgbGlwLCBzKTsKLQkJCQlicmVhazsKKwkJCQl4ZnNfdHJhbnNfZGVsZXRlX2FpbChtcCwgbGlwKTsKKwkJCQl4ZnNfZWZpX2l0ZW1fZnJlZShlZmlwKTsKKwkJCQlyZXR1cm47CiAJCQl9CiAJCX0KIAkJbGlwID0geGZzX3RyYW5zX25leHRfYWlsKG1wLCBsaXAsICZnZW4sIE5VTEwpOwogCX0KLQotCS8qCi0JICogSWYgd2UgZm91bmQgaXQsIHRoZW4gZnJlZSBpdCB1cC4gIElmIGl0IHdhc24ndCB0aGVyZSwgaXQKLQkgKiBtdXN0IGhhdmUgYmVlbiBvdmVyd3JpdHRlbiBpbiB0aGUgbG9nLiAgT2ggd2VsbC4KLQkgKi8KLQlpZiAobGlwICE9IE5VTEwpIHsKLQkJeGZzX2VmaV9pdGVtX2ZyZWUoZWZpcCk7Ci0JfSBlbHNlIHsKLQkJQUlMX1VOTE9DSyhtcCwgcyk7Ci0JfQorCXNwaW5fdW5sb2NrKCZtcC0+bV9haWxfbG9jayk7CiB9CiAKIC8qCkBAIC0yODk3LDggKzI4ODYsOCBAQAogCXVuc2lnbmVkIGxvbmcJCWhhc2g7CiAJdWludAkJCWZsYWdzOwogCi0JbHAgPSBkcCArIElOVF9HRVQocmhlYWQtPmhfbGVuLCBBUkNIX0NPTlZFUlQpOwotCW51bV9sb2dvcHMgPSBJTlRfR0VUKHJoZWFkLT5oX251bV9sb2dvcHMsIEFSQ0hfQ09OVkVSVCk7CisJbHAgPSBkcCArIGJlMzJfdG9fY3B1KHJoZWFkLT5oX2xlbik7CisJbnVtX2xvZ29wcyA9IGJlMzJfdG9fY3B1KHJoZWFkLT5oX251bV9sb2dvcHMpOwogCiAJLyogY2hlY2sgdGhlIGxvZyBmb3JtYXQgbWF0Y2hlcyBvdXIgb3duIC0gZWxzZSB3ZSBjYW4ndCByZWNvdmVyICovCiAJaWYgKHhsb2dfaGVhZGVyX2NoZWNrX3JlY292ZXIobG9nLT5sX21wLCByaGVhZCkpCkBAIC0yOTE1LDE1ICsyOTA0LDIwIEBACiAJCQlBU1NFUlQoMCk7CiAJCQlyZXR1cm4gKFhGU19FUlJPUihFSU8pKTsKIAkJfQotCQl0aWQgPSBJTlRfR0VUKG9oZWFkLT5vaF90aWQsIEFSQ0hfQ09OVkVSVCk7CisJCXRpZCA9IGJlMzJfdG9fY3B1KG9oZWFkLT5vaF90aWQpOwogCQloYXNoID0gWExPR19SSEFTSCh0aWQpOwogCQl0cmFucyA9IHhsb2dfcmVjb3Zlcl9maW5kX3RpZChyaGFzaFtoYXNoXSwgdGlkKTsKIAkJaWYgKHRyYW5zID09IE5VTEwpIHsJCSAgIC8qIG5vdCBmb3VuZDsgYWRkIG5ldyB0aWQgKi8KIAkJCWlmIChvaGVhZC0+b2hfZmxhZ3MgJiBYTE9HX1NUQVJUX1RSQU5TKQogCQkJCXhsb2dfcmVjb3Zlcl9uZXdfdGlkKCZyaGFzaFtoYXNoXSwgdGlkLAotCQkJCQlJTlRfR0VUKHJoZWFkLT5oX2xzbiwgQVJDSF9DT05WRVJUKSk7CisJCQkJCWJlNjRfdG9fY3B1KHJoZWFkLT5oX2xzbikpOwogCQl9IGVsc2UgewotCQkJQVNTRVJUKGRwK0lOVF9HRVQob2hlYWQtPm9oX2xlbiwgQVJDSF9DT05WRVJUKSA8PSBscCk7CisJCQlpZiAoZHAgKyBiZTMyX3RvX2NwdShvaGVhZC0+b2hfbGVuKSA+IGxwKSB7CisJCQkJeGxvZ193YXJuKAorCQkJIlhGUzogeGxvZ19yZWNvdmVyX3Byb2Nlc3NfZGF0YTogYmFkIGxlbmd0aCIpOworCQkJCVdBUk5fT04oMSk7CisJCQkJcmV0dXJuIChYRlNfRVJST1IoRUlPKSk7CisJCQl9CiAJCQlmbGFncyA9IG9oZWFkLT5vaF9mbGFncyAmIH5YTE9HX0VORF9UUkFOUzsKIAkJCWlmIChmbGFncyAmIFhMT0dfV0FTX0NPTlRfVFJBTlMpCiAJCQkJZmxhZ3MgJj0gflhMT0dfQ09OVElOVUVfVFJBTlM7CkBAIC0yOTM3LDggKzI5MzEsNyBAQAogCQkJCWJyZWFrOwogCQkJY2FzZSBYTE9HX1dBU19DT05UX1RSQU5TOgogCQkJCWVycm9yID0geGxvZ19yZWNvdmVyX2FkZF90b19jb250X3RyYW5zKHRyYW5zLAotCQkJCQkJZHAsIElOVF9HRVQob2hlYWQtPm9oX2xlbiwKLQkJCQkJCQlBUkNIX0NPTlZFUlQpKTsKKwkJCQkJCWRwLCBiZTMyX3RvX2NwdShvaGVhZC0+b2hfbGVuKSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFhMT0dfU1RBUlRfVFJBTlM6CiAJCQkJeGxvZ193YXJuKApAQCAtMjk0OSw4ICsyOTQyLDcgQEAKIAkJCWNhc2UgMDoKIAkJCWNhc2UgWExPR19DT05USU5VRV9UUkFOUzoKIAkJCQllcnJvciA9IHhsb2dfcmVjb3Zlcl9hZGRfdG9fdHJhbnModHJhbnMsCi0JCQkJCQlkcCwgSU5UX0dFVChvaGVhZC0+b2hfbGVuLAotCQkJCQkJCUFSQ0hfQ09OVkVSVCkpOworCQkJCQkJZHAsIGJlMzJfdG9fY3B1KG9oZWFkLT5vaF9sZW4pKTsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CiAJCQkJeGxvZ193YXJuKApAQCAtMjk2Miw3ICsyOTU0LDcgQEAKIAkJCWlmIChlcnJvcikKIAkJCQlyZXR1cm4gZXJyb3I7CiAJCX0KLQkJZHAgKz0gSU5UX0dFVChvaGVhZC0+b2hfbGVuLCBBUkNIX0NPTlZFUlQpOworCQlkcCArPSBiZTMyX3RvX2NwdShvaGVhZC0+b2hfbGVuKTsKIAkJbnVtX2xvZ29wcy0tOwogCX0KIAlyZXR1cm4gMDsKQEAgLTMwNzUsMTAgKzMwNjcsOSBAQAogCXhmc19lZmlfbG9nX2l0ZW1fdAkqZWZpcDsKIAlpbnQJCQlnZW47CiAJeGZzX21vdW50X3QJCSptcDsKLQlTUExERUNMKHMpOwogCiAJbXAgPSBsb2ctPmxfbXA7Ci0JQUlMX0xPQ0sobXAscyk7CisJc3Bpbl9sb2NrKCZtcC0+bV9haWxfbG9jayk7CiAKIAlsaXAgPSB4ZnNfdHJhbnNfZmlyc3RfYWlsKG1wLCAmZ2VuKTsKIAl3aGlsZSAobGlwICE9IE5VTEwpIHsKQEAgLTMwOTksMTIgKzMwOTAsMTIgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJQUlMX1VOTE9DSyhtcCwgcyk7CisJCXNwaW5fdW5sb2NrKCZtcC0+bV9haWxfbG9jayk7CiAJCXhsb2dfcmVjb3Zlcl9wcm9jZXNzX2VmaShtcCwgZWZpcCk7Ci0JCUFJTF9MT0NLKG1wLHMpOworCQlzcGluX2xvY2soJm1wLT5tX2FpbF9sb2NrKTsKIAkJbGlwID0geGZzX3RyYW5zX25leHRfYWlsKG1wLCBsaXAsICZnZW4sIE5VTEwpOwogCX0KLQlBSUxfVU5MT0NLKG1wLCBzKTsKKwlzcGluX3VubG9jaygmbXAtPm1fYWlsX2xvY2spOwogfQogCiAvKgpAQCAtMzMxNSwxNiArMzMwNiwxNiBAQAogCWludAkJc2l6ZSkKIHsKIAlpbnQJCWk7Ci0JdWludAkJKnVwOworCV9fYmUzMgkJKnVwOwogCXVpbnQJCWNoa3N1bSA9IDA7CiAKLQl1cCA9ICh1aW50ICopaWNsb2ctPmljX2RhdGFwOworCXVwID0gKF9fYmUzMiAqKWljbG9nLT5pY19kYXRhcDsKIAkvKiBkaXZpZGUgbGVuZ3RoIGJ5IDQgdG8gZ2V0ICMgd29yZHMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgKHNpemUgPj4gMik7IGkrKykgewotCQljaGtzdW0gXj0gSU5UX0dFVCgqdXAsIEFSQ0hfQ09OVkVSVCk7CisJCWNoa3N1bSBePSBiZTMyX3RvX2NwdSgqdXApOwogCQl1cCsrOwogCX0KLQlJTlRfU0VUKGljbG9nLT5pY19oZWFkZXIuaF9jaGtzdW0sIEFSQ0hfQ09OVkVSVCwgY2hrc3VtKTsKKwlpY2xvZy0+aWNfaGVhZGVyLmhfY2hrc3VtID0gY3B1X3RvX2JlMzIoY2hrc3VtKTsKIH0KICNlbHNlCiAjZGVmaW5lIHhsb2dfcGFja19kYXRhX2NoZWNrc3VtKGxvZywgaWNsb2csIHNpemUpCkBAIC0zMzQxLDcgKzMzMzIsNyBAQAogewogCWludAkJCWksIGosIGs7CiAJaW50CQkJc2l6ZSA9IGljbG9nLT5pY19vZmZzZXQgKyByb3VuZG9mZjsKLQl1aW50CQkJY3ljbGVfbHNuOworCV9fYmUzMgkJCWN5Y2xlX2xzbjsKIAl4ZnNfY2FkZHJfdAkJZHA7CiAJeGxvZ19pbl9jb3JlXzJfdAkqeGhkcjsKIApAQCAtMzM1Miw4ICszMzQzLDggQEAKIAlkcCA9IGljbG9nLT5pY19kYXRhcDsKIAlmb3IgKGkgPSAwOyBpIDwgQlRPQkIoc2l6ZSkgJiYKIAkJaSA8IChYTE9HX0hFQURFUl9DWUNMRV9TSVpFIC8gQkJTSVpFKTsgaSsrKSB7Ci0JCWljbG9nLT5pY19oZWFkZXIuaF9jeWNsZV9kYXRhW2ldID0gKih1aW50ICopZHA7Ci0JCSoodWludCAqKWRwID0gY3ljbGVfbHNuOworCQlpY2xvZy0+aWNfaGVhZGVyLmhfY3ljbGVfZGF0YVtpXSA9ICooX19iZTMyICopZHA7CisJCSooX19iZTMyICopZHAgPSBjeWNsZV9sc247CiAJCWRwICs9IEJCU0laRTsKIAl9CiAKQEAgLTMzNjIsOCArMzM1Myw4IEBACiAJCWZvciAoIDsgaSA8IEJUT0JCKHNpemUpOyBpKyspIHsKIAkJCWogPSBpIC8gKFhMT0dfSEVBREVSX0NZQ0xFX1NJWkUgLyBCQlNJWkUpOwogCQkJayA9IGkgJSAoWExPR19IRUFERVJfQ1lDTEVfU0laRSAvIEJCU0laRSk7Ci0JCQl4aGRyW2pdLmhpY194aGVhZGVyLnhoX2N5Y2xlX2RhdGFba10gPSAqKHVpbnQgKilkcDsKLQkJCSoodWludCAqKWRwID0gY3ljbGVfbHNuOworCQkJeGhkcltqXS5oaWNfeGhlYWRlci54aF9jeWNsZV9kYXRhW2tdID0gKihfX2JlMzIgKilkcDsKKwkJCSooX19iZTMyICopZHAgPSBjeWNsZV9sc247CiAJCQlkcCArPSBCQlNJWkU7CiAJCX0KIApAQCAtMzM4MCwyMSArMzM3MSwyMSBAQAogCXhmc19jYWRkcl90CQlkcCwKIAl4bG9nX3QJCQkqbG9nKQogewotCXVpbnQJCQkqdXAgPSAodWludCAqKWRwOworCV9fYmUzMgkJCSp1cCA9IChfX2JlMzIgKilkcDsKIAl1aW50CQkJY2hrc3VtID0gMDsKIAlpbnQJCQlpOwogCiAJLyogZGl2aWRlIGxlbmd0aCBieSA0IHRvIGdldCAjIHdvcmRzICovCi0JZm9yIChpPTA7IGkgPCBJTlRfR0VUKHJoZWFkLT5oX2xlbiwgQVJDSF9DT05WRVJUKSA+PiAyOyBpKyspIHsKLQkJY2hrc3VtIF49IElOVF9HRVQoKnVwLCBBUkNIX0NPTlZFUlQpOworCWZvciAoaT0wOyBpIDwgYmUzMl90b19jcHUocmhlYWQtPmhfbGVuKSA+PiAyOyBpKyspIHsKKwkJY2hrc3VtIF49IGJlMzJfdG9fY3B1KCp1cCk7CiAJCXVwKys7CiAJfQotCWlmIChjaGtzdW0gIT0gSU5UX0dFVChyaGVhZC0+aF9jaGtzdW0sIEFSQ0hfQ09OVkVSVCkpIHsKKwlpZiAoY2hrc3VtICE9IGJlMzJfdG9fY3B1KHJoZWFkLT5oX2Noa3N1bSkpIHsKIAkgICAgaWYgKHJoZWFkLT5oX2Noa3N1bSB8fAogCQkoKGxvZy0+bF9mbGFncyAmIFhMT0dfQ0hLU1VNX01JU01BVENIKSA9PSAwKSkgewogCQkgICAgY21uX2VycihDRV9ERUJVRywKIAkJCSJYRlM6IExvZ1IgY2hrc3VtIG1pc21hdGNoOiB3YXMgKDB4JXgpIGlzICgweCV4KVxuIiwKLQkJCSAgICBJTlRfR0VUKHJoZWFkLT5oX2Noa3N1bSwgQVJDSF9DT05WRVJUKSwgY2hrc3VtKTsKKwkJCSAgICBiZTMyX3RvX2NwdShyaGVhZC0+aF9jaGtzdW0pLCBjaGtzdW0pOwogCQkgICAgY21uX2VycihDRV9ERUJVRywKICJYRlM6IERpc3JlZ2FyZCBtZXNzYWdlIGlmIGZpbGVzeXN0ZW0gd2FzIGNyZWF0ZWQgd2l0aCBub24tREVCVUcga2VybmVsIik7CiAJCSAgICBpZiAoWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoJmxvZy0+bF9tcC0+bV9zYikpIHsKQEAgLTM0MTgsMTggKzM0MDksMTggQEAKIAlpbnQJCQlpLCBqLCBrOwogCXhsb2dfaW5fY29yZV8yX3QJKnhoZHI7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQlRPQkIoSU5UX0dFVChyaGVhZC0+aF9sZW4sIEFSQ0hfQ09OVkVSVCkpICYmCisJZm9yIChpID0gMDsgaSA8IEJUT0JCKGJlMzJfdG9fY3B1KHJoZWFkLT5oX2xlbikpICYmCiAJCSAgaSA8IChYTE9HX0hFQURFUl9DWUNMRV9TSVpFIC8gQkJTSVpFKTsgaSsrKSB7Ci0JCSoodWludCAqKWRwID0gKih1aW50ICopJnJoZWFkLT5oX2N5Y2xlX2RhdGFbaV07CisJCSooX19iZTMyICopZHAgPSAqKF9fYmUzMiAqKSZyaGVhZC0+aF9jeWNsZV9kYXRhW2ldOwogCQlkcCArPSBCQlNJWkU7CiAJfQogCiAJaWYgKFhGU19TQl9WRVJTSU9OX0hBU0xPR1YyKCZsb2ctPmxfbXAtPm1fc2IpKSB7CiAJCXhoZHIgPSAoeGxvZ19pbl9jb3JlXzJfdCAqKXJoZWFkOwotCQlmb3IgKCA7IGkgPCBCVE9CQihJTlRfR0VUKHJoZWFkLT5oX2xlbiwgQVJDSF9DT05WRVJUKSk7IGkrKykgeworCQlmb3IgKCA7IGkgPCBCVE9CQihiZTMyX3RvX2NwdShyaGVhZC0+aF9sZW4pKTsgaSsrKSB7CiAJCQlqID0gaSAvIChYTE9HX0hFQURFUl9DWUNMRV9TSVpFIC8gQkJTSVpFKTsKIAkJCWsgPSBpICUgKFhMT0dfSEVBREVSX0NZQ0xFX1NJWkUgLyBCQlNJWkUpOwotCQkJKih1aW50ICopZHAgPSB4aGRyW2pdLmhpY194aGVhZGVyLnhoX2N5Y2xlX2RhdGFba107CisJCQkqKF9fYmUzMiAqKWRwID0geGhkcltqXS5oaWNfeGhlYWRlci54aF9jeWNsZV9kYXRhW2tdOwogCQkJZHAgKz0gQkJTSVpFOwogCQl9CiAJfQpAQCAtMzQ0NSwyNCArMzQzNiwyMSBAQAogewogCWludAkJCWhsZW47CiAKLQlpZiAodW5saWtlbHkoCi0JICAgIChJTlRfR0VUKHJoZWFkLT5oX21hZ2ljbm8sIEFSQ0hfQ09OVkVSVCkgIT0KLQkJCVhMT0dfSEVBREVSX01BR0lDX05VTSkpKSB7CisJaWYgKHVubGlrZWx5KGJlMzJfdG9fY3B1KHJoZWFkLT5oX21hZ2ljbm8pICE9IFhMT0dfSEVBREVSX01BR0lDX05VTSkpIHsKIAkJWEZTX0VSUk9SX1JFUE9SVCgieGxvZ192YWxpZF9yZWNfaGVhZGVyKDEpIiwKIAkJCQlYRlNfRVJSTEVWRUxfTE9XLCBsb2ctPmxfbXApOwogCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CiAJfQogCWlmICh1bmxpa2VseSgKIAkgICAgKCFyaGVhZC0+aF92ZXJzaW9uIHx8Ci0JICAgIChJTlRfR0VUKHJoZWFkLT5oX3ZlcnNpb24sIEFSQ0hfQ09OVkVSVCkgJgotCQkJKH5YTE9HX1ZFUlNJT05fT0tCSVRTKSkgIT0gMCkpKSB7CisJICAgIChiZTMyX3RvX2NwdShyaGVhZC0+aF92ZXJzaW9uKSAmICh+WExPR19WRVJTSU9OX09LQklUUykpKSkpIHsKIAkJeGxvZ193YXJuKCJYRlM6ICVzOiB1bnJlY29nbmlzZWQgbG9nIHZlcnNpb24gKCVkKS4iLAotCQkJX19GVU5DVElPTl9fLCBJTlRfR0VUKHJoZWFkLT5oX3ZlcnNpb24sIEFSQ0hfQ09OVkVSVCkpOworCQkJX19GVU5DVElPTl9fLCBiZTMyX3RvX2NwdShyaGVhZC0+aF92ZXJzaW9uKSk7CiAJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKIAl9CiAKIAkvKiBMUiBib2R5IG11c3QgaGF2ZSBkYXRhIG9yIGl0IHdvdWxkbid0IGhhdmUgYmVlbiB3cml0dGVuICovCi0JaGxlbiA9IElOVF9HRVQocmhlYWQtPmhfbGVuLCBBUkNIX0NPTlZFUlQpOworCWhsZW4gPSBiZTMyX3RvX2NwdShyaGVhZC0+aF9sZW4pOwogCWlmICh1bmxpa2VseSggaGxlbiA8PSAwIHx8IGhsZW4gPiBJTlRfTUFYICkpIHsKIAkJWEZTX0VSUk9SX1JFUE9SVCgieGxvZ192YWxpZF9yZWNfaGVhZGVyKDIpIiwKIAkJCQlYRlNfRVJSTEVWRUxfTE9XLCBsb2ctPmxfbXApOwpAQCAtMzUyMiw5ICszNTEwLDggQEAKIAkJZXJyb3IgPSB4bG9nX3ZhbGlkX3JlY19oZWFkZXIobG9nLCByaGVhZCwgdGFpbF9ibGspOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIGJyZWFkX2VycjE7Ci0JCWhfc2l6ZSA9IElOVF9HRVQocmhlYWQtPmhfc2l6ZSwgQVJDSF9DT05WRVJUKTsKLQkJaWYgKChJTlRfR0VUKHJoZWFkLT5oX3ZlcnNpb24sIEFSQ0hfQ09OVkVSVCkKLQkJCQkmIFhMT0dfVkVSU0lPTl8yKSAmJgorCQloX3NpemUgPSBiZTMyX3RvX2NwdShyaGVhZC0+aF9zaXplKTsKKwkJaWYgKChiZTMyX3RvX2NwdShyaGVhZC0+aF92ZXJzaW9uKSAmIFhMT0dfVkVSU0lPTl8yKSAmJgogCQkgICAgKGhfc2l6ZSA+IFhMT0dfSEVBREVSX0NZQ0xFX1NJWkUpKSB7CiAJCQloYmxrcyA9IGhfc2l6ZSAvIFhMT0dfSEVBREVSX0NZQ0xFX1NJWkU7CiAJCQlpZiAoaF9zaXplICUgWExPR19IRUFERVJfQ1lDTEVfU0laRSkKQEAgLTM1NjEsNyArMzU0OCw3IEBACiAJCQkJZ290byBicmVhZF9lcnIyOwogCiAJCQkvKiBibG9ja3MgaW4gZGF0YSBzZWN0aW9uICovCi0JCQliYmxrcyA9IChpbnQpQlRPQkIoSU5UX0dFVChyaGVhZC0+aF9sZW4sIEFSQ0hfQ09OVkVSVCkpOworCQkJYmJsa3MgPSAoaW50KUJUT0JCKGJlMzJfdG9fY3B1KHJoZWFkLT5oX2xlbikpOwogCQkJZXJyb3IgPSB4bG9nX2JyZWFkKGxvZywgYmxrX25vICsgaGJsa3MsIGJibGtzLCBkYnApOwogCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gYnJlYWRfZXJyMjsKQEAgLTM2MzYsNyArMzYyMyw3IEBACiAJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBicmVhZF9lcnIyOwogCi0JCQliYmxrcyA9IChpbnQpQlRPQkIoSU5UX0dFVChyaGVhZC0+aF9sZW4sIEFSQ0hfQ09OVkVSVCkpOworCQkJYmJsa3MgPSAoaW50KUJUT0JCKGJlMzJfdG9fY3B1KHJoZWFkLT5oX2xlbikpOwogCQkJYmxrX25vICs9IGhibGtzOwogCiAJCQkvKiBSZWFkIGluIGRhdGEgZm9yIGxvZyByZWNvcmQgKi8KQEAgLTM3MDcsNyArMzY5NCw3IEBACiAJCQllcnJvciA9IHhsb2dfdmFsaWRfcmVjX2hlYWRlcihsb2csIHJoZWFkLCBibGtfbm8pOwogCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gYnJlYWRfZXJyMjsKLQkJCWJibGtzID0gKGludClCVE9CQihJTlRfR0VUKHJoZWFkLT5oX2xlbiwgQVJDSF9DT05WRVJUKSk7CisJCQliYmxrcyA9IChpbnQpQlRPQkIoYmUzMl90b19jcHUocmhlYWQtPmhfbGVuKSk7CiAJCQlpZiAoKGVycm9yID0geGxvZ19icmVhZChsb2csIGJsa19ubytoYmxrcywgYmJsa3MsIGRicCkpKQogCQkJCWdvdG8gYnJlYWRfZXJyMjsKIAkJCW9mZnNldCA9IHhsb2dfYWxpZ24obG9nLCBibGtfbm8raGJsa3MsIGJibGtzLCBkYnApOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19tb3VudC5jIGIvZnMveGZzL3hmc19tb3VudC5jCmluZGV4IGViZGI3NmQuLjY0MDliMzcgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbW91bnQuYworKysgYi9mcy94ZnMveGZzX21vdW50LmMKQEAgLTEzNiwxNSArMTM2LDkgQEAKIAkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX05PX1BFUkNQVV9TQjsKIAl9CiAKLQlBSUxfTE9DS0lOSVQoJm1wLT5tX2FpbF9sb2NrLCAieGZzX2FpbCIpOwotCXNwaW5sb2NrX2luaXQoJm1wLT5tX3NiX2xvY2ssICJ4ZnNfc2IiKTsKKwlzcGluX2xvY2tfaW5pdCgmbXAtPm1fc2JfbG9jayk7CiAJbXV0ZXhfaW5pdCgmbXAtPm1faWxvY2spOwogCW11dGV4X2luaXQoJm1wLT5tX2dyb3dsb2NrKTsKLQkvKgotCSAqIEluaXRpYWxpemUgdGhlIEFJTC4KLQkgKi8KLQl4ZnNfdHJhbnNfYWlsX2luaXQobXApOwotCiAJYXRvbWljX3NldCgmbXAtPm1fYWN0aXZlX3RyYW5zLCAwKTsKIAogCXJldHVybiBtcDsKQEAgLTE3MSw3ICsxNjUsNyBAQAogCQkJICBzaXplb2YoeGZzX3BlcmFnX3QpICogbXAtPm1fc2Iuc2JfYWdjb3VudCk7CiAJfQogCi0JQUlMX0xPQ0tfREVTVFJPWSgmbXAtPm1fYWlsX2xvY2spOworCXNwaW5sb2NrX2Rlc3Ryb3koJm1wLT5tX2FpbF9sb2NrKTsKIAlzcGlubG9ja19kZXN0cm95KCZtcC0+bV9zYl9sb2NrKTsKIAltdXRleF9kZXN0cm95KCZtcC0+bV9pbG9jayk7CiAJbXV0ZXhfZGVzdHJveSgmbXAtPm1fZ3Jvd2xvY2spOwpAQCAtNjE2LDcgKzYxMCw3IEBACiAJaW50CWk7CiAKIAltcC0+bV9hZ2Zyb3RvciA9IG1wLT5tX2FnaXJvdG9yID0gMDsKLQlzcGlubG9ja19pbml0KCZtcC0+bV9hZ2lyb3Rvcl9sb2NrLCAibV9hZ2lyb3Rvcl9sb2NrIik7CisJc3Bpbl9sb2NrX2luaXQoJm1wLT5tX2FnaXJvdG9yX2xvY2spOwogCW1wLT5tX21heGFnaSA9IG1wLT5tX3NiLnNiX2FnY291bnQ7CiAJbXAtPm1fYmxrYml0X2xvZyA9IHNicC0+c2JfYmxvY2tsb2cgKyBYRlNfTkJCWUxPRzsKIAltcC0+bV9ibGtiYl9sb2cgPSBzYnAtPnNiX2Jsb2NrbG9nIC0gQkJTSElGVDsKQEAgLTY5Niw3ICs2OTAsNiBAQAogCXVpbnQ2NF90CWJmcmVlbHN0ID0gMDsKIAl1aW50NjRfdAlidHJlZSA9IDA7CiAJaW50CQllcnJvcjsKLQlpbnQJCXM7CiAKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBhZ2NvdW50OyBpbmRleCsrKSB7CiAJCS8qCkBAIC03MjEsMTEgKzcxNCwxMSBAQAogCS8qCiAJICogT3ZlcndyaXRlIGluY29yZSBzdXBlcmJsb2NrIGNvdW50ZXJzIHdpdGgganVzdC1yZWFkIGRhdGEKIAkgKi8KLQlzID0gWEZTX1NCX0xPQ0sobXApOworCXNwaW5fbG9jaygmbXAtPm1fc2JfbG9jayk7CiAJc2JwLT5zYl9pZnJlZSA9IGlmcmVlOwogCXNicC0+c2JfaWNvdW50ID0gaWFsbG9jOwogCXNicC0+c2JfZmRibG9ja3MgPSBiZnJlZSArIGJmcmVlbHN0ICsgYnRyZWU7Ci0JWEZTX1NCX1VOTE9DSyhtcCwgcyk7CisJc3Bpbl91bmxvY2soJm1wLT5tX3NiX2xvY2spOwogCiAJLyogRml4dXAgdGhlIHBlci1jcHUgY291bnRlcnMgYXMgd2VsbC4gKi8KIAl4ZnNfaWNzYl9yZWluaXRfY291bnRlcnMobXApOwpAQCAtNzM0LDQ5ICs3MjcsMTMgQEAKIH0KIAogLyoKLSAqIHhmc19tb3VudGZzCi0gKgotICogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBmb2xsb3dpbmcgb24gYW4gaW5pdGlhbCBtb3VudCBvZiBhIGZpbGUgc3lzdGVtOgotICoJLSByZWFkcyB0aGUgc3VwZXJibG9jayBmcm9tIGRpc2sgYW5kIGluaXQgdGhlIG1vdW50IHN0cnVjdAotICoJLSBpZiB3ZSdyZSBhIDMyLWJpdCBrZXJuZWwsIGRvIGEgc2l6ZSBjaGVjayBvbiB0aGUgc3VwZXJibG9jawotICoJCXNvIHdlIGRvbid0IG1vdW50IHRlcmFieXRlIGZpbGVzeXN0ZW1zCi0gKgktIGluaXQgbW91bnQgc3RydWN0IHJlYWx0aW1lIGZpZWxkcwotICoJLSBhbGxvY2F0ZSBpbm9kZSBoYXNoIHRhYmxlIGZvciBmcwotICoJLSBpbml0IGRpcmVjdG9yeSBtYW5hZ2VyCi0gKgktIHBlcmZvcm0gcmVjb3ZlcnkgYW5kIGluaXQgdGhlIGxvZyBtYW5hZ2VyCisgKiBVcGRhdGUgYWxpZ25tZW50IHZhbHVlcyBiYXNlZCBvbiBtb3VudCBvcHRpb25zIGFuZCBzYiB2YWx1ZXMKICAqLwotaW50Ci14ZnNfbW91bnRmcygKLQl4ZnNfbW91bnRfdAkqbXAsCi0JaW50CQltZnNpX2ZsYWdzKQorU1RBVElDIGludAoreGZzX3VwZGF0ZV9hbGlnbm1lbnQoeGZzX21vdW50X3QgKm1wLCBpbnQgbWZzaV9mbGFncywgX191aW50NjRfdCAqdXBkYXRlX2ZsYWdzKQogewotCXhmc19idWZfdAkqYnA7CiAJeGZzX3NiX3QJKnNicCA9ICYobXAtPm1fc2IpOwotCXhmc19pbm9kZV90CSpyaXA7Ci0JYmh2X3Zub2RlX3QJKnJ2cCA9IE5VTEw7Ci0JaW50CQlyZWFkaW9fbG9nLCB3cml0ZWlvX2xvZzsKLQl4ZnNfZGFkZHJfdAlkOwotCV9fdWludDY0X3QJcmVzYmxrczsKLQlfX2ludDY0X3QJdXBkYXRlX2ZsYWdzOwotCXVpbnQJCXF1b3RhbW91bnQsIHF1b3RhZmxhZ3M7Ci0JaW50CQlhZ25vOwotCWludAkJdXVpZF9tb3VudGVkID0gMDsKLQlpbnQJCWVycm9yID0gMDsKIAotCWlmIChtcC0+bV9zYl9icCA9PSBOVUxMKSB7Ci0JCWlmICgoZXJyb3IgPSB4ZnNfcmVhZHNiKG1wLCBtZnNpX2ZsYWdzKSkpIHsKLQkJCXJldHVybiBlcnJvcjsKLQkJfQotCX0KLQl4ZnNfbW91bnRfY29tbW9uKG1wLCBzYnApOwotCi0JLyoKLQkgKiBDaGVjayBpZiBzYl9hZ2Jsb2NrcyBpcyBhbGlnbmVkIGF0IHN0cmlwZSBib3VuZGFyeQotCSAqIElmIHNiX2FnYmxvY2tzIGlzIE5PVCBhbGlnbmVkIHR1cm4gb2ZmIG1fZGFsaWduIHNpbmNlCi0JICogYWxsb2NhdG9yIGFsaWdubWVudCBpcyB3aXRoaW4gYW4gYWcsIHRoZXJlZm9yZSBhZyBoYXMKLQkgKiB0byBiZSBhbGlnbmVkIGF0IHN0cmlwZSBib3VuZGFyeS4KLQkgKi8KLQl1cGRhdGVfZmxhZ3MgPSAwTEw7CiAJaWYgKG1wLT5tX2RhbGlnbiAmJiAhKG1mc2lfZmxhZ3MgJiBYRlNfTUZTSV9TRUNPTkQpKSB7CiAJCS8qCiAJCSAqIElmIHN0cmlwZSB1bml0IGFuZCBzdHJpcGUgd2lkdGggYXJlIG5vdCBtdWx0aXBsZXMKQEAgLTc4Nyw4ICs3NDQsNyBAQAogCQkJaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1JFVEVSUikgewogCQkJCWNtbl9lcnIoQ0VfV0FSTiwKIAkJCQkJIlhGUzogYWxpZ25tZW50IGNoZWNrIDEgZmFpbGVkIik7Ci0JCQkJZXJyb3IgPSBYRlNfRVJST1IoRUlOVkFMKTsKLQkJCQlnb3RvIGVycm9yMTsKKwkJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CiAJCQl9CiAJCQltcC0+bV9kYWxpZ24gPSBtcC0+bV9zd2lkdGggPSAwOwogCQl9IGVsc2UgewpAQCAtNzk4LDggKzc1NCw3IEBACiAJCQltcC0+bV9kYWxpZ24gPSBYRlNfQkJfVE9fRlNCVChtcCwgbXAtPm1fZGFsaWduKTsKIAkJCWlmIChtcC0+bV9kYWxpZ24gJiYgKHNicC0+c2JfYWdibG9ja3MgJSBtcC0+bV9kYWxpZ24pKSB7CiAJCQkJaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1JFVEVSUikgewotCQkJCQllcnJvciA9IFhGU19FUlJPUihFSU5WQUwpOwotCQkJCQlnb3RvIGVycm9yMTsKKwkJCQkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOwogCQkJCX0KIAkJCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBtcCwKICJzdHJpcGUgYWxpZ25tZW50IHR1cm5lZCBvZmY6IHN1bml0KCVkKS9zd2lkdGgoJWQpIGluY29tcGF0aWJsZSB3aXRoIGFnc2l6ZSglZCkiLApAQCAtODE2LDggKzc3MSw3IEBACiAic3RyaXBlIGFsaWdubWVudCB0dXJuZWQgb2ZmOiBzdW5pdCglZCkgbGVzcyB0aGFuIGJzaXplKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCW1wLT5tX2RhbGlnbiwKIAkJCQkJCW1wLT5tX2Jsb2NrbWFzayArMSk7Ci0JCQkJCWVycm9yID0gWEZTX0VSUk9SKEVJTlZBTCk7Ci0JCQkJCWdvdG8gZXJyb3IxOworCQkJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CiAJCQkJfQogCQkJCW1wLT5tX3N3aWR0aCA9IDA7CiAJCQl9CkBAIC04MzAsMTEgKzc4NCwxMSBAQAogCQlpZiAoWEZTX1NCX1ZFUlNJT05fSEFTREFMSUdOKHNicCkpIHsKIAkJCWlmIChzYnAtPnNiX3VuaXQgIT0gbXAtPm1fZGFsaWduKSB7CiAJCQkJc2JwLT5zYl91bml0ID0gbXAtPm1fZGFsaWduOwotCQkJCXVwZGF0ZV9mbGFncyB8PSBYRlNfU0JfVU5JVDsKKwkJCQkqdXBkYXRlX2ZsYWdzIHw9IFhGU19TQl9VTklUOwogCQkJfQogCQkJaWYgKHNicC0+c2Jfd2lkdGggIT0gbXAtPm1fc3dpZHRoKSB7CiAJCQkJc2JwLT5zYl93aWR0aCA9IG1wLT5tX3N3aWR0aDsKLQkJCQl1cGRhdGVfZmxhZ3MgfD0gWEZTX1NCX1dJRFRIOworCQkJCSp1cGRhdGVfZmxhZ3MgfD0gWEZTX1NCX1dJRFRIOwogCQkJfQogCQl9CiAJfSBlbHNlIGlmICgobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfTk9BTElHTikgIT0gWEZTX01PVU5UX05PQUxJR04gJiYKQEAgLTg0Myw0OSArNzk3LDQ1IEBACiAJCQltcC0+bV9zd2lkdGggPSBzYnAtPnNiX3dpZHRoOwogCX0KIAotCXhmc19hbGxvY19jb21wdXRlX21heGxldmVscyhtcCk7Ci0JeGZzX2JtYXBfY29tcHV0ZV9tYXhsZXZlbHMobXAsIFhGU19EQVRBX0ZPUkspOwotCXhmc19ibWFwX2NvbXB1dGVfbWF4bGV2ZWxzKG1wLCBYRlNfQVRUUl9GT1JLKTsKLQl4ZnNfaWFsbG9jX2NvbXB1dGVfbWF4bGV2ZWxzKG1wKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldCB0aGUgbWF4aW11bSBpbm9kZSBjb3VudCBmb3IgdGhpcyBmaWxlc3lzdGVtCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfc2V0X21heGljb3VudCh4ZnNfbW91bnRfdCAqbXApCit7CisJeGZzX3NiX3QJKnNicCA9ICYobXAtPm1fc2IpOworCV9fdWludDY0X3QJaWNvdW50OwogCiAJaWYgKHNicC0+c2JfaW1heF9wY3QpIHsKLQkJX191aW50NjRfdAlpY291bnQ7Ci0KLQkJLyogTWFrZSBzdXJlIHRoZSBtYXhpbXVtIGlub2RlIGNvdW50IGlzIGEgbXVsdGlwbGUgb2YgdGhlCi0JCSAqIHVuaXRzIHdlIGFsbG9jYXRlIGlub2RlcyBpbi4KKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoZSBtYXhpbXVtIGlub2RlIGNvdW50IGlzIGEgbXVsdGlwbGUKKwkJICogb2YgdGhlIHVuaXRzIHdlIGFsbG9jYXRlIGlub2RlcyBpbi4KIAkJICovCi0KIAkJaWNvdW50ID0gc2JwLT5zYl9kYmxvY2tzICogc2JwLT5zYl9pbWF4X3BjdDsKIAkJZG9fZGl2KGljb3VudCwgMTAwKTsKIAkJZG9fZGl2KGljb3VudCwgbXAtPm1faWFsbG9jX2Jsa3MpOwogCQltcC0+bV9tYXhpY291bnQgPSAoaWNvdW50ICogbXAtPm1faWFsbG9jX2Jsa3MpICA8PAogCQkJCSAgIHNicC0+c2JfaW5vcGJsb2c7Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJbXAtPm1fbWF4aWNvdW50ID0gMDsKLQotCW1wLT5tX21heGlvZmZzZXQgPSB4ZnNfbWF4X2ZpbGVfb2Zmc2V0KHNicC0+c2JfYmxvY2tsb2cpOwotCi0JLyoKLQkgKiBYRlMgdXNlcyB0aGUgdXVpZCBmcm9tIHRoZSBzdXBlcmJsb2NrIGFzIHRoZSB1bmlxdWUKLQkgKiBpZGVudGlmaWVyIGZvciBmc2lkLiAgV2UgY2FuIG5vdCB1c2UgdGhlIHV1aWQgZnJvbSB0aGUgdm9sdW1lCi0JICogc2luY2UgYSBzaW5nbGUgcGFydGl0aW9uIGZpbGVzeXN0ZW0gaXMgaWRlbnRpY2FsIHRvIGEgc2luZ2xlCi0JICogcGFydGl0aW9uIHZvbHVtZS9maWxlc3lzdGVtLgotCSAqLwotCWlmICgobWZzaV9mbGFncyAmIFhGU19NRlNJX1NFQ09ORCkgPT0gMCAmJgotCSAgICAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfTk9VVUlEKSA9PSAwKSB7Ci0JCWlmICh4ZnNfdXVpZF9tb3VudChtcCkpIHsKLQkJCWVycm9yID0gWEZTX0VSUk9SKEVJTlZBTCk7Ci0JCQlnb3RvIGVycm9yMTsKLQkJfQotCQl1dWlkX21vdW50ZWQ9MTsKIAl9Cit9CiAKLQkvKgotCSAqIFNldCB0aGUgZGVmYXVsdCBtaW5pbXVtIHJlYWQgYW5kIHdyaXRlIHNpemVzIHVubGVzcwotCSAqIGFscmVhZHkgc3BlY2lmaWVkIGluIGEgbW91bnQgb3B0aW9uLgotCSAqIFdlIHVzZSBzbWFsbGVyIEkvTyBzaXplcyB3aGVuIHRoZSBmaWxlIHN5c3RlbQotCSAqIGlzIGJlaW5nIHVzZWQgZm9yIE5GUyBzZXJ2aWNlICh3c3luYyBtb3VudCBvcHRpb24pLgotCSAqLworLyoKKyAqIFNldCB0aGUgZGVmYXVsdCBtaW5pbXVtIHJlYWQgYW5kIHdyaXRlIHNpemVzIHVubGVzcworICogYWxyZWFkeSBzcGVjaWZpZWQgaW4gYSBtb3VudCBvcHRpb24uCisgKiBXZSB1c2Ugc21hbGxlciBJL08gc2l6ZXMgd2hlbiB0aGUgZmlsZSBzeXN0ZW0KKyAqIGlzIGJlaW5nIHVzZWQgZm9yIE5GUyBzZXJ2aWNlICh3c3luYyBtb3VudCBvcHRpb24pLgorICovCitTVEFUSUMgdm9pZAoreGZzX3NldF9yd19zaXplcyh4ZnNfbW91bnRfdCAqbXApCit7CisJeGZzX3NiX3QJKnNicCA9ICYobXAtPm1fc2IpOworCWludAkJcmVhZGlvX2xvZywgd3JpdGVpb19sb2c7CisKIAlpZiAoIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9ERkxUX0lPU0laRSkpIHsKIAkJaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1dTWU5DKSB7CiAJCQlyZWFkaW9fbG9nID0gWEZTX1dTWU5DX1JFQURJT19MT0c7CkBAIC05MTEsMTcgKzg2MSwxNCBAQAogCQltcC0+bV93cml0ZWlvX2xvZyA9IHdyaXRlaW9fbG9nOwogCX0KIAltcC0+bV93cml0ZWlvX2Jsb2NrcyA9IDEgPDwgKG1wLT5tX3dyaXRlaW9fbG9nIC0gc2JwLT5zYl9ibG9ja2xvZyk7Cit9CiAKLQkvKgotCSAqIFNldCB0aGUgaW5vZGUgY2x1c3RlciBzaXplLgotCSAqIFRoaXMgbWF5IHN0aWxsIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGZpbGUgc3lzdGVtCi0JICogYmxvY2sgc2l6ZSBpZiBpdCBpcyBsYXJnZXIgdGhhbiB0aGUgY2hvc2VuIGNsdXN0ZXIgc2l6ZS4KLQkgKi8KLQltcC0+bV9pbm9kZV9jbHVzdGVyX3NpemUgPSBYRlNfSU5PREVfQklHX0NMVVNURVJfU0laRTsKLQotCS8qCi0JICogU2V0IHdoZXRoZXIgd2UncmUgdXNpbmcgaW5vZGUgYWxpZ25tZW50LgotCSAqLworLyoKKyAqIFNldCB3aGV0aGVyIHdlJ3JlIHVzaW5nIGlub2RlIGFsaWdubWVudC4KKyAqLworU1RBVElDIHZvaWQKK3hmc19zZXRfaW5vYWxpZ25tZW50KHhmc19tb3VudF90ICptcCkKK3sKIAlpZiAoWEZTX1NCX1ZFUlNJT05fSEFTQUxJR04oJm1wLT5tX3NiKSAmJgogCSAgICBtcC0+bV9zYi5zYl9pbm9hbGlnbm10ID49CiAJICAgIFhGU19CX1RPX0ZTQlQobXAsIG1wLT5tX2lub2RlX2NsdXN0ZXJfc2l6ZSkpCkBAIC05MzcsMTQgKzg4NCwyMiBAQAogCQltcC0+bV9zaW5vYWxpZ24gPSBtcC0+bV9kYWxpZ247CiAJZWxzZQogCQltcC0+bV9zaW5vYWxpZ24gPSAwOwotCS8qCi0JICogQ2hlY2sgdGhhdCB0aGUgZGF0YSAoYW5kIGxvZyBpZiBzZXBhcmF0ZSkgYXJlIGFuIG9rIHNpemUuCi0JICovCit9CisKKy8qCisgKiBDaGVjayB0aGF0IHRoZSBkYXRhIChhbmQgbG9nIGlmIHNlcGFyYXRlKSBhcmUgYW4gb2sgc2l6ZS4KKyAqLworU1RBVElDIGludAoreGZzX2NoZWNrX3NpemVzKHhmc19tb3VudF90ICptcCwgaW50IG1mc2lfZmxhZ3MpCit7CisJeGZzX2J1Zl90CSpicDsKKwl4ZnNfZGFkZHJfdAlkOworCWludAkJZXJyb3I7CisKIAlkID0gKHhmc19kYWRkcl90KVhGU19GU0JfVE9fQkIobXAsIG1wLT5tX3NiLnNiX2RibG9ja3MpOwogCWlmIChYRlNfQkJfVE9fRlNCKG1wLCBkKSAhPSBtcC0+bV9zYi5zYl9kYmxvY2tzKSB7CiAJCWNtbl9lcnIoQ0VfV0FSTiwgIlhGUzogc2l6ZSBjaGVjayAxIGZhaWxlZCIpOwotCQllcnJvciA9IFhGU19FUlJPUihFMkJJRyk7Ci0JCWdvdG8gZXJyb3IxOworCQlyZXR1cm4gWEZTX0VSUk9SKEUyQklHKTsKIAl9CiAJZXJyb3IgPSB4ZnNfcmVhZF9idWYobXAsIG1wLT5tX2RkZXZfdGFyZ3AsCiAJCQkgICAgIGQgLSBYRlNfRlNTX1RPX0JCKG1wLCAxKSwKQEAgLTk1MywxMCArOTA4LDkgQEAKIAkJeGZzX2J1Zl9yZWxzZShicCk7CiAJfSBlbHNlIHsKIAkJY21uX2VycihDRV9XQVJOLCAiWEZTOiBzaXplIGNoZWNrIDIgZmFpbGVkIik7Ci0JCWlmIChlcnJvciA9PSBFTk9TUEMpIHsKKwkJaWYgKGVycm9yID09IEVOT1NQQykKIAkJCWVycm9yID0gWEZTX0VSUk9SKEUyQklHKTsKLQkJfQotCQlnb3RvIGVycm9yMTsKKwkJcmV0dXJuIGVycm9yOwogCX0KIAogCWlmICgoKG1mc2lfZmxhZ3MgJiBYRlNfTUZTSV9DTElFTlQpID09IDApICYmCkBAIC05NjQsOCArOTE4LDcgQEAKIAkJZCA9ICh4ZnNfZGFkZHJfdClYRlNfRlNCX1RPX0JCKG1wLCBtcC0+bV9zYi5zYl9sb2dibG9ja3MpOwogCQlpZiAoWEZTX0JCX1RPX0ZTQihtcCwgZCkgIT0gbXAtPm1fc2Iuc2JfbG9nYmxvY2tzKSB7CiAJCQljbW5fZXJyKENFX1dBUk4sICJYRlM6IHNpemUgY2hlY2sgMyBmYWlsZWQiKTsKLQkJCWVycm9yID0gWEZTX0VSUk9SKEUyQklHKTsKLQkJCWdvdG8gZXJyb3IxOworCQkJcmV0dXJuIFhGU19FUlJPUihFMkJJRyk7CiAJCX0KIAkJZXJyb3IgPSB4ZnNfcmVhZF9idWYobXAsIG1wLT5tX2xvZ2Rldl90YXJncCwKIAkJCQkgICAgIGQgLSBYRlNfRlNCX1RPX0JCKG1wLCAxKSwKQEAgLTk3NCwxNyArOTI3LDExMSBAQAogCQkJeGZzX2J1Zl9yZWxzZShicCk7CiAJCX0gZWxzZSB7CiAJCQljbW5fZXJyKENFX1dBUk4sICJYRlM6IHNpemUgY2hlY2sgMyBmYWlsZWQiKTsKLQkJCWlmIChlcnJvciA9PSBFTk9TUEMpIHsKKwkJCWlmIChlcnJvciA9PSBFTk9TUEMpCiAJCQkJZXJyb3IgPSBYRlNfRVJST1IoRTJCSUcpOwotCQkJfQotCQkJZ290byBlcnJvcjE7CisJCQlyZXR1cm4gZXJyb3I7CiAJCX0KIAl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB4ZnNfbW91bnRmcworICoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgZm9sbG93aW5nIG9uIGFuIGluaXRpYWwgbW91bnQgb2YgYSBmaWxlIHN5c3RlbToKKyAqCS0gcmVhZHMgdGhlIHN1cGVyYmxvY2sgZnJvbSBkaXNrIGFuZCBpbml0IHRoZSBtb3VudCBzdHJ1Y3QKKyAqCS0gaWYgd2UncmUgYSAzMi1iaXQga2VybmVsLCBkbyBhIHNpemUgY2hlY2sgb24gdGhlIHN1cGVyYmxvY2sKKyAqCQlzbyB3ZSBkb24ndCBtb3VudCB0ZXJhYnl0ZSBmaWxlc3lzdGVtcworICoJLSBpbml0IG1vdW50IHN0cnVjdCByZWFsdGltZSBmaWVsZHMKKyAqCS0gYWxsb2NhdGUgaW5vZGUgaGFzaCB0YWJsZSBmb3IgZnMKKyAqCS0gaW5pdCBkaXJlY3RvcnkgbWFuYWdlcgorICoJLSBwZXJmb3JtIHJlY292ZXJ5IGFuZCBpbml0IHRoZSBsb2cgbWFuYWdlcgorICovCitpbnQKK3hmc19tb3VudGZzKAorCXhmc19tb3VudF90CSptcCwKKwlpbnQJCW1mc2lfZmxhZ3MpCit7CisJeGZzX3NiX3QJKnNicCA9ICYobXAtPm1fc2IpOworCXhmc19pbm9kZV90CSpyaXA7CisJYmh2X3Zub2RlX3QJKnJ2cCA9IE5VTEw7CisJX191aW50NjRfdAlyZXNibGtzOworCV9faW50NjRfdAl1cGRhdGVfZmxhZ3MgPSAwTEw7CisJdWludAkJcXVvdGFtb3VudCwgcXVvdGFmbGFnczsKKwlpbnQJCWFnbm87CisJaW50CQl1dWlkX21vdW50ZWQgPSAwOworCWludAkJZXJyb3IgPSAwOworCisJaWYgKG1wLT5tX3NiX2JwID09IE5VTEwpIHsKKwkJZXJyb3IgPSB4ZnNfcmVhZHNiKG1wLCBtZnNpX2ZsYWdzKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCX0KKwl4ZnNfbW91bnRfY29tbW9uKG1wLCBzYnApOworCisJLyoKKwkgKiBDaGVjayBpZiBzYl9hZ2Jsb2NrcyBpcyBhbGlnbmVkIGF0IHN0cmlwZSBib3VuZGFyeQorCSAqIElmIHNiX2FnYmxvY2tzIGlzIE5PVCBhbGlnbmVkIHR1cm4gb2ZmIG1fZGFsaWduIHNpbmNlCisJICogYWxsb2NhdG9yIGFsaWdubWVudCBpcyB3aXRoaW4gYW4gYWcsIHRoZXJlZm9yZSBhZyBoYXMKKwkgKiB0byBiZSBhbGlnbmVkIGF0IHN0cmlwZSBib3VuZGFyeS4KKwkgKi8KKwllcnJvciA9IHhmc191cGRhdGVfYWxpZ25tZW50KG1wLCBtZnNpX2ZsYWdzLCAmdXBkYXRlX2ZsYWdzKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyb3IxOworCisJeGZzX2FsbG9jX2NvbXB1dGVfbWF4bGV2ZWxzKG1wKTsKKwl4ZnNfYm1hcF9jb21wdXRlX21heGxldmVscyhtcCwgWEZTX0RBVEFfRk9SSyk7CisJeGZzX2JtYXBfY29tcHV0ZV9tYXhsZXZlbHMobXAsIFhGU19BVFRSX0ZPUkspOworCXhmc19pYWxsb2NfY29tcHV0ZV9tYXhsZXZlbHMobXApOworCisJeGZzX3NldF9tYXhpY291bnQobXApOworCisJbXAtPm1fbWF4aW9mZnNldCA9IHhmc19tYXhfZmlsZV9vZmZzZXQoc2JwLT5zYl9ibG9ja2xvZyk7CisKKwkvKgorCSAqIFhGUyB1c2VzIHRoZSB1dWlkIGZyb20gdGhlIHN1cGVyYmxvY2sgYXMgdGhlIHVuaXF1ZQorCSAqIGlkZW50aWZpZXIgZm9yIGZzaWQuICBXZSBjYW4gbm90IHVzZSB0aGUgdXVpZCBmcm9tIHRoZSB2b2x1bWUKKwkgKiBzaW5jZSBhIHNpbmdsZSBwYXJ0aXRpb24gZmlsZXN5c3RlbSBpcyBpZGVudGljYWwgdG8gYSBzaW5nbGUKKwkgKiBwYXJ0aXRpb24gdm9sdW1lL2ZpbGVzeXN0ZW0uCisJICovCisJaWYgKChtZnNpX2ZsYWdzICYgWEZTX01GU0lfU0VDT05EKSA9PSAwICYmCisJICAgIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9OT1VVSUQpID09IDApIHsKKwkJaWYgKHhmc191dWlkX21vdW50KG1wKSkgeworCQkJZXJyb3IgPSBYRlNfRVJST1IoRUlOVkFMKTsKKwkJCWdvdG8gZXJyb3IxOworCQl9CisJCXV1aWRfbW91bnRlZD0xOworCX0KKworCS8qCisJICogU2V0IHRoZSBtaW5pbXVtIHJlYWQgYW5kIHdyaXRlIHNpemVzCisJICovCisJeGZzX3NldF9yd19zaXplcyhtcCk7CisKKwkvKgorCSAqIFNldCB0aGUgaW5vZGUgY2x1c3RlciBzaXplLgorCSAqIFRoaXMgbWF5IHN0aWxsIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGZpbGUgc3lzdGVtCisJICogYmxvY2sgc2l6ZSBpZiBpdCBpcyBsYXJnZXIgdGhhbiB0aGUgY2hvc2VuIGNsdXN0ZXIgc2l6ZS4KKwkgKi8KKwltcC0+bV9pbm9kZV9jbHVzdGVyX3NpemUgPSBYRlNfSU5PREVfQklHX0NMVVNURVJfU0laRTsKKworCS8qCisJICogU2V0IGlub2RlIGFsaWdubWVudCBmaWVsZHMKKwkgKi8KKwl4ZnNfc2V0X2lub2FsaWdubWVudChtcCk7CisKKwkvKgorCSAqIENoZWNrIHRoYXQgdGhlIGRhdGEgKGFuZCBsb2cgaWYgc2VwYXJhdGUpIGFyZSBhbiBvayBzaXplLgorCSAqLworCWVycm9yID0geGZzX2NoZWNrX3NpemVzKG1wLCBtZnNpX2ZsYWdzKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyb3IxOwogCiAJLyoKIAkgKiBJbml0aWFsaXplIHJlYWx0aW1lIGZpZWxkcyBpbiB0aGUgbW91bnQgc3RydWN0dXJlCiAJICovCi0JaWYgKChlcnJvciA9IHhmc19ydG1vdW50X2luaXQobXApKSkgeworCWVycm9yID0geGZzX3J0bW91bnRfaW5pdChtcCk7CisJaWYgKGVycm9yKSB7CiAJCWNtbl9lcnIoQ0VfV0FSTiwgIlhGUzogUlQgbW91bnQgZmFpbGVkIik7CiAJCWdvdG8gZXJyb3IxOwogCX0KQEAgLTExMDIsNyArMTE0OSw4IEBACiAJLyoKIAkgKiBJbml0aWFsaXplIHJlYWx0aW1lIGlub2RlIHBvaW50ZXJzIGluIHRoZSBtb3VudCBzdHJ1Y3R1cmUKIAkgKi8KLQlpZiAoKGVycm9yID0geGZzX3J0bW91bnRfaW5vZGVzKG1wKSkpIHsKKwllcnJvciA9IHhmc19ydG1vdW50X2lub2RlcyhtcCk7CisJaWYgKGVycm9yKSB7CiAJCS8qCiAJCSAqIEZyZWUgdXAgdGhlIHJvb3QgaW5vZGUuCiAJCSAqLwpAQCAtMTEyMCw3ICsxMTY4LDggQEAKIAkvKgogCSAqIEluaXRpYWxpc2UgdGhlIFhGUyBxdW90YSBtYW5hZ2VtZW50IHN1YnN5c3RlbSBmb3IgdGhpcyBtb3VudAogCSAqLwotCWlmICgoZXJyb3IgPSBYRlNfUU1fSU5JVChtcCwgJnF1b3RhbW91bnQsICZxdW90YWZsYWdzKSkpCisJZXJyb3IgPSBYRlNfUU1fSU5JVChtcCwgJnF1b3RhbW91bnQsICZxdW90YWZsYWdzKTsKKwlpZiAoZXJyb3IpCiAJCWdvdG8gZXJyb3I0OwogCiAJLyoKQEAgLTExMzcsNyArMTE4Niw4IEBACiAJLyoKIAkgKiBDb21wbGV0ZSB0aGUgcXVvdGEgaW5pdGlhbGlzYXRpb24sIHBvc3QtbG9nLXJlcGxheSBjb21wb25lbnQuCiAJICovCi0JaWYgKChlcnJvciA9IFhGU19RTV9NT1VOVChtcCwgcXVvdGFtb3VudCwgcXVvdGFmbGFncywgbWZzaV9mbGFncykpKQorCWVycm9yID0gWEZTX1FNX01PVU5UKG1wLCBxdW90YW1vdW50LCBxdW90YWZsYWdzLCBtZnNpX2ZsYWdzKTsKKwlpZiAoZXJyb3IpCiAJCWdvdG8gZXJyb3I0OwogCiAJLyoKQEAgLTEyNTUsNyArMTMwNSw2IEBACiAjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChJTkRVQ0VfSU9fRVJST1IpCiAJeGZzX2Vycm9ydGFnX2NsZWFyYWxsKG1wLCAwKTsKICNlbmRpZgotCVhGU19JT0RPTkUobXApOwogCXhmc19tb3VudF9mcmVlKG1wKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE0NDEsNyArMTQ5MCw3IEBACiAgKiBGaWVsZHMgYXJlIG5vdCBhbGxvd2VkIHRvIGRpcCBiZWxvdyB6ZXJvLCBzbyBpZiB0aGUgZGVsdGEgd291bGQKICAqIGRvIHRoaXMgZG8gbm90IGFwcGx5IGl0IGFuZCByZXR1cm4gRUlOVkFMLgogICoKLSAqIFRoZSBTQl9MT0NLIG11c3QgYmUgaGVsZCB3aGVuIHRoaXMgcm91dGluZSBpcyBjYWxsZWQuCisgKiBUaGUgbV9zYl9sb2NrIG11c3QgYmUgaGVsZCB3aGVuIHRoaXMgcm91dGluZSBpcyBjYWxsZWQuCiAgKi8KIGludAogeGZzX21vZF9pbmNvcmVfc2JfdW5sb2NrZWQoCkBAIC0xNjA2LDcgKzE2NTUsNyBAQAogLyoKICAqIHhmc19tb2RfaW5jb3JlX3NiKCkgaXMgdXNlZCB0byBjaGFuZ2UgYSBmaWVsZCBpbiB0aGUgaW4tY29yZQogICogc3VwZXJibG9jayBzdHJ1Y3R1cmUgYnkgdGhlIHNwZWNpZmllZCBkZWx0YS4gIFRoaXMgbW9kaWZpY2F0aW9uCi0gKiBpcyBwcm90ZWN0ZWQgYnkgdGhlIFNCX0xPQ0suICBKdXN0IHVzZSB0aGUgeGZzX21vZF9pbmNvcmVfc2JfdW5sb2NrZWQoKQorICogaXMgcHJvdGVjdGVkIGJ5IHRoZSBtX3NiX2xvY2suICBKdXN0IHVzZSB0aGUgeGZzX21vZF9pbmNvcmVfc2JfdW5sb2NrZWQoKQogICogcm91dGluZSB0byBkbyB0aGUgd29yay4KICAqLwogaW50CkBAIC0xNjE2LDcgKzE2NjUsNiBAQAogCWludDY0X3QJCWRlbHRhLAogCWludAkJcnN2ZCkKIHsKLQl1bnNpZ25lZCBsb25nCXM7CiAJaW50CXN0YXR1czsKIAogCS8qIGNoZWNrIGZvciBwZXItY3B1IGNvdW50ZXJzICovCkBAIC0xNjMzLDkgKzE2ODEsOSBAQAogCQkvKiBGQUxMVEhST1VHSCAqLwogI2VuZGlmCiAJZGVmYXVsdDoKLQkJcyA9IFhGU19TQl9MT0NLKG1wKTsKKwkJc3Bpbl9sb2NrKCZtcC0+bV9zYl9sb2NrKTsKIAkJc3RhdHVzID0geGZzX21vZF9pbmNvcmVfc2JfdW5sb2NrZWQobXAsIGZpZWxkLCBkZWx0YSwgcnN2ZCk7Ci0JCVhGU19TQl9VTkxPQ0sobXAsIHMpOworCQlzcGluX3VubG9jaygmbXAtPm1fc2JfbG9jayk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTY1Niw3ICsxNzA0LDYgQEAKIGludAogeGZzX21vZF9pbmNvcmVfc2JfYmF0Y2goeGZzX21vdW50X3QgKm1wLCB4ZnNfbW9kX3NiX3QgKm1zYiwgdWludCBubXNiLCBpbnQgcnN2ZCkKIHsKLQl1bnNpZ25lZCBsb25nCXM7CiAJaW50CQlzdGF0dXM9MDsKIAl4ZnNfbW9kX3NiX3QJKm1zYnA7CiAKQEAgLTE2NjQsMTAgKzE3MTEsMTAgQEAKIAkgKiBMb29wIHRocm91Z2ggdGhlIGFycmF5IG9mIG1vZCBzdHJ1Y3R1cmVzIGFuZCBhcHBseSBlYWNoCiAJICogaW5kaXZpZHVhbGx5LiAgSWYgYW55IGZhaWwsIHRoZW4gYmFjayBvdXQgYWxsIHRob3NlCiAJICogd2hpY2ggaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZC4gIERvIGFsbCBvZiB0aGlzIHdpdGhpbgotCSAqIHRoZSBzY29wZSBvZiB0aGUgU0JfTE9DSyBzbyB0aGF0IGFsbCBvZiB0aGUgY2hhbmdlcyB3aWxsCisJICogdGhlIHNjb3BlIG9mIHRoZSBtX3NiX2xvY2sgc28gdGhhdCBhbGwgb2YgdGhlIGNoYW5nZXMgd2lsbAogCSAqIGJlIGF0b21pYy4KIAkgKi8KLQlzID0gWEZTX1NCX0xPQ0sobXApOworCXNwaW5fbG9jaygmbXAtPm1fc2JfbG9jayk7CiAJbXNicCA9ICZtc2JbMF07CiAJZm9yIChtc2JwID0gJm1zYnBbMF07IG1zYnAgPCAobXNiICsgbm1zYik7IG1zYnArKykgewogCQkvKgpAQCAtMTY4MSwxMSArMTcyOCwxMSBAQAogCQljYXNlIFhGU19TQlNfSUZSRUU6CiAJCWNhc2UgWEZTX1NCU19GREJMT0NLUzoKIAkJCWlmICghKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX05PX1BFUkNQVV9TQikpIHsKLQkJCQlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKKwkJCQlzcGluX3VubG9jaygmbXAtPm1fc2JfbG9jayk7CiAJCQkJc3RhdHVzID0geGZzX2ljc2JfbW9kaWZ5X2NvdW50ZXJzKG1wLAogCQkJCQkJCW1zYnAtPm1zYl9maWVsZCwKIAkJCQkJCQltc2JwLT5tc2JfZGVsdGEsIHJzdmQpOwotCQkJCXMgPSBYRlNfU0JfTE9DSyhtcCk7CisJCQkJc3Bpbl9sb2NrKCZtcC0+bV9zYl9sb2NrKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCS8qIEZBTExUSFJPVUdIICovCkBAIC0xNzE5LDEyICsxNzY2LDEyIEBACiAJCQljYXNlIFhGU19TQlNfSUZSRUU6CiAJCQljYXNlIFhGU19TQlNfRkRCTE9DS1M6CiAJCQkJaWYgKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfTk9fUEVSQ1BVX1NCKSkgewotCQkJCQlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKKwkJCQkJc3Bpbl91bmxvY2soJm1wLT5tX3NiX2xvY2spOwogCQkJCQlzdGF0dXMgPSB4ZnNfaWNzYl9tb2RpZnlfY291bnRlcnMobXAsCiAJCQkJCQkJbXNicC0+bXNiX2ZpZWxkLAogCQkJCQkJCS0obXNicC0+bXNiX2RlbHRhKSwKIAkJCQkJCQlyc3ZkKTsKLQkJCQkJcyA9IFhGU19TQl9MT0NLKG1wKTsKKwkJCQkJc3Bpbl9sb2NrKCZtcC0+bV9zYl9sb2NrKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCS8qIEZBTExUSFJPVUdIICovCkBAIC0xNzQwLDcgKzE3ODcsNyBAQAogCQkJbXNicC0tOwogCQl9CiAJfQotCVhGU19TQl9VTkxPQ0sobXAsIHMpOworCXNwaW5fdW5sb2NrKCZtcC0+bV9zYl9sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xODg4LDEyICsxOTM1LDEyIEBACiAgKgogICogTG9ja2luZyBydWxlczoKICAqCi0gKiAJMS4gWEZTX1NCX0xPQ0soKSBiZWZvcmUgcGlja2luZyB1cCBwZXItY3B1IGxvY2tzCisgKiAJMS4gbV9zYl9sb2NrIGJlZm9yZSBwaWNraW5nIHVwIHBlci1jcHUgbG9ja3MKICAqIAkyLiBwZXItY3B1IGxvY2tzIGFsd2F5cyBwaWNrZWQgdXAgdmlhIGZvcl9lYWNoX29ubGluZV9jcHUoKSBvcmRlcgotICogCTMuIGFjY3VyYXRlIGNvdW50ZXIgc3luYyByZXF1aXJlcyBYRlNfU0JfTE9DSyArIHBlciBjcHUgbG9ja3MKKyAqIAkzLiBhY2N1cmF0ZSBjb3VudGVyIHN5bmMgcmVxdWlyZXMgbV9zYl9sb2NrICsgcGVyIGNwdSBsb2NrcwogICogCTQuIG1vZGlmeWluZyBwZXItY3B1IGNvdW50ZXJzIHJlcXVpcmVzIGhvbGRpbmcgcGVyLWNwdSBsb2NrCi0gKiAJNS4gbW9kaWZ5aW5nIGdsb2JhbCBjb3VudGVycyByZXF1aXJlcyBob2xkaW5nIFhGU19TQl9MT0NLCi0gKgk2LiBlbmFibGluZyBvciBkaXNhYmxpbmcgYSBjb3VudGVyIHJlcXVpcmVzIGhvbGRpbmcgdGhlIFhGU19TQl9MT0NLCisgKiAJNS4gbW9kaWZ5aW5nIGdsb2JhbCBjb3VudGVycyByZXF1aXJlcyBob2xkaW5nIG1fc2JfbG9jaworICoJNi4gZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGEgY291bnRlciByZXF1aXJlcyBob2xkaW5nIHRoZSBtX3NiX2xvY2sgCiAgKgkgICBhbmQgX25vbmVfIG9mIHRoZSBwZXItY3B1IGxvY2tzLgogICoKICAqIERpc2FibGVkIGNvdW50ZXJzIGFyZSBvbmx5IGV2ZXIgcmUtZW5hYmxlZCBieSBhIGJhbGFuY2Ugb3BlcmF0aW9uCkBAIC0xOTIwLDcgKzE5NjcsNiBAQAogewogCXhmc19pY3NiX2NudHNfdCAqY250cDsKIAl4ZnNfbW91bnRfdAkqbXA7Ci0JaW50CQlzOwogCiAJbXAgPSAoeGZzX21vdW50X3QgKiljb250YWluZXJfb2YobmZiLCB4ZnNfbW91bnRfdCwgbV9pY3NiX25vdGlmaWVyKTsKIAljbnRwID0gKHhmc19pY3NiX2NudHNfdCAqKQpAQCAtMTk0Niw3ICsxOTkyLDcgQEAKIAkJICogY291bnQgaW50byB0aGUgdG90YWwgb24gdGhlIGdsb2JhbCBzdXBlcmJsb2NrIGFuZAogCQkgKiByZS1lbmFibGUgdGhlIGNvdW50ZXJzLiAqLwogCQl4ZnNfaWNzYl9sb2NrKG1wKTsKLQkJcyA9IFhGU19TQl9MT0NLKG1wKTsKKwkJc3Bpbl9sb2NrKCZtcC0+bV9zYl9sb2NrKTsKIAkJeGZzX2ljc2JfZGlzYWJsZV9jb3VudGVyKG1wLCBYRlNfU0JTX0lDT1VOVCk7CiAJCXhmc19pY3NiX2Rpc2FibGVfY291bnRlcihtcCwgWEZTX1NCU19JRlJFRSk7CiAJCXhmc19pY3NiX2Rpc2FibGVfY291bnRlcihtcCwgWEZTX1NCU19GREJMT0NLUyk7CkBAIC0xOTYzLDcgKzIwMDksNyBAQAogCQkJCQkgWEZTX0lDU0JfU0JfTE9DS0VELCAwKTsKIAkJeGZzX2ljc2JfYmFsYW5jZV9jb3VudGVyKG1wLCBYRlNfU0JTX0ZEQkxPQ0tTLAogCQkJCQkgWEZTX0lDU0JfU0JfTE9DS0VELCAwKTsKLQkJWEZTX1NCX1VOTE9DSyhtcCwgcyk7CisJCXNwaW5fdW5sb2NrKCZtcC0+bV9zYl9sb2NrKTsKIAkJeGZzX2ljc2JfdW5sb2NrKG1wKTsKIAkJYnJlYWs7CiAJfQpAQCAtMjE5NCwxMSArMjI0MCwxMCBAQAogCWludAkJZmxhZ3MpCiB7CiAJeGZzX2ljc2JfY250c190CWNudDsKLQlpbnQJCXM7CiAKIAkvKiBQYXNzIDE6IGxvY2sgYWxsIGNvdW50ZXJzICovCiAJaWYgKChmbGFncyAmIFhGU19JQ1NCX1NCX0xPQ0tFRCkgPT0gMCkKLQkJcyA9IFhGU19TQl9MT0NLKG1wKTsKKwkJc3Bpbl9sb2NrKCZtcC0+bV9zYl9sb2NrKTsKIAogCXhmc19pY3NiX2NvdW50KG1wLCAmY250LCBmbGFncyk7CiAKQEAgLTIyMTEsNyArMjI1Niw3IEBACiAJCW1wLT5tX3NiLnNiX2ZkYmxvY2tzID0gY250Lmljc2JfZmRibG9ja3M7CiAKIAlpZiAoKGZsYWdzICYgWEZTX0lDU0JfU0JfTE9DS0VEKSA9PSAwKQotCQlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKKwkJc3Bpbl91bmxvY2soJm1wLT5tX3NiX2xvY2spOwogfQogCiAvKgpAQCAtMjI1MiwxMSArMjI5NywxMCBAQAogewogCXVpbnQ2NF90CWNvdW50LCByZXNpZDsKIAlpbnQJCXdlaWdodCA9IG51bV9vbmxpbmVfY3B1cygpOwotCWludAkJczsKIAl1aW50NjRfdAltaW4gPSAodWludDY0X3QpbWluX3Blcl9jcHU7CiAKIAlpZiAoIShmbGFncyAmIFhGU19JQ1NCX1NCX0xPQ0tFRCkpCi0JCXMgPSBYRlNfU0JfTE9DSyhtcCk7CisJCXNwaW5fbG9jaygmbXAtPm1fc2JfbG9jayk7CiAKIAkvKiBkaXNhYmxlIGNvdW50ZXIgYW5kIHN5bmMgY291bnRlciAqLwogCXhmc19pY3NiX2Rpc2FibGVfY291bnRlcihtcCwgZmllbGQpOwpAQCAtMjI5MCwxMCArMjMzNCwxMCBAQAogCXhmc19pY3NiX2VuYWJsZV9jb3VudGVyKG1wLCBmaWVsZCwgY291bnQsIHJlc2lkKTsKIG91dDoKIAlpZiAoIShmbGFncyAmIFhGU19JQ1NCX1NCX0xPQ0tFRCkpCi0JCVhGU19TQl9VTkxPQ0sobXAsIHMpOworCQlzcGluX3VubG9jaygmbXAtPm1fc2JfbG9jayk7CiB9CiAKLWludAorU1RBVElDIGludAogeGZzX2ljc2JfbW9kaWZ5X2NvdW50ZXJzKAogCXhmc19tb3VudF90CSptcCwKIAl4ZnNfc2JfZmllbGRfdAlmaWVsZCwKQEAgLTIzMDIsNyArMjM0Niw3IEBACiB7CiAJeGZzX2ljc2JfY250c190CSppY3NicDsKIAlsb25nIGxvbmcJbGNvdW50ZXI7CS8qIGxvbmcgY291bnRlciBmb3IgNjQgYml0IGZpZWxkcyAqLwotCWludAkJY3B1LCByZXQgPSAwLCBzOworCWludAkJY3B1LCByZXQgPSAwOwogCiAJbWlnaHRfc2xlZXAoKTsKIGFnYWluOgpAQCAtMjM4MCwxNSArMjQyNCwxNSBAQAogCSAqIHJ1bm5pbmcgYXRvbWljYWxseSBoZXJlLCB3ZSBrbm93IGEgcmViYWxhbmNlIGNhbm5vdAogCSAqIGJlIGluIHByb2dyZXNzLiBIZW5jZSB3ZSBjYW4gZ28gc3RyYWlnaHQgdG8gb3BlcmF0aW5nCiAJICogb24gdGhlIGdsb2JhbCBzdXBlcmJsb2NrLiBXZSBkbyBub3QgY2FsbCB4ZnNfbW9kX2luY29yZV9zYigpCi0JICogaGVyZSBldmVuIHRob3VnaCB3ZSBuZWVkIHRvIGdldCB0aGUgU0JfTE9DSy4gRG9pbmcgc28KKwkgKiBoZXJlIGV2ZW4gdGhvdWdoIHdlIG5lZWQgdG8gZ2V0IHRoZSBtX3NiX2xvY2suIERvaW5nIHNvCiAJICogd2lsbCBjYXVzZSB1cyB0byByZS1lbnRlciB0aGlzIGZ1bmN0aW9uIGFuZCBkZWFkbG9jay4KLQkgKiBIZW5jZSB3ZSBnZXQgdGhlIFNCX0xPQ0sgb3Vyc2VsdmVzIGFuZCB0aGVuIGNhbGwKKwkgKiBIZW5jZSB3ZSBnZXQgdGhlIG1fc2JfbG9jayBvdXJzZWx2ZXMgYW5kIHRoZW4gY2FsbAogCSAqIHhmc19tb2RfaW5jb3JlX3NiX3VubG9ja2VkKCkgYXMgdGhlIHVubG9ja2VkIHBhdGggb3BlcmF0ZXMKIAkgKiBkaXJlY3RseSBvbiB0aGUgZ2xvYmFsIGNvdW50ZXJzLgogCSAqLwotCXMgPSBYRlNfU0JfTE9DSyhtcCk7CisJc3Bpbl9sb2NrKCZtcC0+bV9zYl9sb2NrKTsKIAlyZXQgPSB4ZnNfbW9kX2luY29yZV9zYl91bmxvY2tlZChtcCwgZmllbGQsIGRlbHRhLCByc3ZkKTsKLQlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKKwlzcGluX3VubG9jaygmbXAtPm1fc2JfbG9jayk7CiAKIAkvKgogCSAqIE5vdyB0aGF0IHdlJ3ZlIG1vZGlmaWVkIHRoZSBnbG9iYWwgc3VwZXJibG9jaywgd2UKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbW91bnQuaCBiL2ZzL3hmcy94ZnNfbW91bnQuaAppbmRleCBjNjE4ZjdjLi5mN2M2MjBlIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX21vdW50LmgKKysrIGIvZnMveGZzL3hmc19tb3VudC5oCkBAIC01NiwyMCArNTYsMTIgQEAKIHN0cnVjdCBsb2c7CiBzdHJ1Y3QgeGZzX21vdW50X2FyZ3M7CiBzdHJ1Y3QgeGZzX2lub2RlOwotc3RydWN0IHhmc19pb2NvcmU7CiBzdHJ1Y3QgeGZzX2JtYnRfaXJlYzsKIHN0cnVjdCB4ZnNfYm1hcF9mcmVlOwogc3RydWN0IHhmc19leHRkZWx0YTsKIHN0cnVjdCB4ZnNfc3dhcGV4dDsKIHN0cnVjdCB4ZnNfbXJ1X2NhY2hlOwogCi0jZGVmaW5lCUFJTF9MT0NLX1QJCWxvY2tfdAotI2RlZmluZQlBSUxfTE9DS0lOSVQoeCx5KQlzcGlubG9ja19pbml0KHgseSkKLSNkZWZpbmUJQUlMX0xPQ0tfREVTVFJPWSh4KQlzcGlubG9ja19kZXN0cm95KHgpCi0jZGVmaW5lCUFJTF9MT0NLKG1wLHMpCQlzPW11dGV4X3NwaW5sb2NrKCYobXApLT5tX2FpbF9sb2NrKQotI2RlZmluZQlBSUxfVU5MT0NLKG1wLHMpCW11dGV4X3NwaW51bmxvY2soJihtcCktPm1fYWlsX2xvY2ssIHMpCi0KLQogLyoKICAqIFByb3RvdHlwZXMgYW5kIGZ1bmN0aW9ucyBmb3IgdGhlIERhdGEgTWlncmF0aW9uIHN1YnN5c3RlbS4KICAqLwpAQCAtMTk2LDEwNSArMTg4LDYgQEAKICNkZWZpbmUgWEZTX1FNX1FVT1RBQ1RMKG1wLCBjbWQsIGlkLCBhZGRyKSBcCiAJKCoobXApLT5tX3FtX29wcy0+eGZzX3F1b3RhY3RsKShtcCwgY21kLCBpZCwgYWRkcikKIAotCi0vKgotICogUHJvdG90eXBlcyBhbmQgZnVuY3Rpb25zIGZvciBJL08gY29yZSBtb2R1bGFyaXphdGlvbi4KLSAqLwotCi10eXBlZGVmIGludAkJKCp4ZnNfaW9pbml0X3QpKHN0cnVjdCB4ZnNfbW91bnQgKiwKLQkJCQlzdHJ1Y3QgeGZzX21vdW50X2FyZ3MgKiwgaW50KTsKLXR5cGVkZWYgaW50CQkoKnhmc19ibWFwaV90KShzdHJ1Y3QgeGZzX3RyYW5zICosIHZvaWQgKiwKLQkJCQl4ZnNfZmlsZW9mZl90LCB4ZnNfZmlsYmxrc190LCBpbnQsCi0JCQkJeGZzX2ZzYmxvY2tfdCAqLCB4ZnNfZXh0bGVuX3QsCi0JCQkJc3RydWN0IHhmc19ibWJ0X2lyZWMgKiwgaW50ICosCi0JCQkJc3RydWN0IHhmc19ibWFwX2ZyZWUgKiwgc3RydWN0IHhmc19leHRkZWx0YSAqKTsKLXR5cGVkZWYgaW50CQkoKnhmc19idW5tYXBpX3QpKHN0cnVjdCB4ZnNfdHJhbnMgKiwKLQkJCQl2b2lkICosIHhmc19maWxlb2ZmX3QsCi0JCQkJeGZzX2ZpbGJsa3NfdCwgaW50LCB4ZnNfZXh0bnVtX3QsCi0JCQkJeGZzX2ZzYmxvY2tfdCAqLCBzdHJ1Y3QgeGZzX2JtYXBfZnJlZSAqLAotCQkJCXN0cnVjdCB4ZnNfZXh0ZGVsdGEgKiwgaW50ICopOwotdHlwZWRlZiBpbnQJCSgqeGZzX2JtYXBfZW9mX3QpKHZvaWQgKiwgeGZzX2ZpbGVvZmZfdCwgaW50LCBpbnQgKik7Ci10eXBlZGVmIGludAkJKCp4ZnNfaW9tYXBfd3JpdGVfZGlyZWN0X3QpKAotCQkJCXZvaWQgKiwgeGZzX29mZl90LCBzaXplX3QsIGludCwKLQkJCQlzdHJ1Y3QgeGZzX2JtYnRfaXJlYyAqLCBpbnQgKiwgaW50KTsKLXR5cGVkZWYgaW50CQkoKnhmc19pb21hcF93cml0ZV9kZWxheV90KSgKLQkJCQl2b2lkICosIHhmc19vZmZfdCwgc2l6ZV90LCBpbnQsCi0JCQkJc3RydWN0IHhmc19ibWJ0X2lyZWMgKiwgaW50ICopOwotdHlwZWRlZiBpbnQJCSgqeGZzX2lvbWFwX3dyaXRlX2FsbG9jYXRlX3QpKAotCQkJCXZvaWQgKiwgeGZzX29mZl90LCBzaXplX3QsCi0JCQkJc3RydWN0IHhmc19ibWJ0X2lyZWMgKiwgaW50ICopOwotdHlwZWRlZiBpbnQJCSgqeGZzX2lvbWFwX3dyaXRlX3Vud3JpdHRlbl90KSgKLQkJCQl2b2lkICosIHhmc19vZmZfdCwgc2l6ZV90KTsKLXR5cGVkZWYgdWludAkJKCp4ZnNfbGNrX21hcF9zaGFyZWRfdCkodm9pZCAqKTsKLXR5cGVkZWYgdm9pZAkJKCp4ZnNfbG9ja190KSh2b2lkICosIHVpbnQpOwotdHlwZWRlZiB2b2lkCQkoKnhmc19sb2NrX2RlbW90ZV90KSh2b2lkICosIHVpbnQpOwotdHlwZWRlZiBpbnQJCSgqeGZzX2xvY2tfbm93YWl0X3QpKHZvaWQgKiwgdWludCk7Ci10eXBlZGVmIHZvaWQJCSgqeGZzX3VubGtfdCkodm9pZCAqLCB1bnNpZ25lZCBpbnQpOwotdHlwZWRlZiB4ZnNfZnNpemVfdAkoKnhmc19zaXplX3QpKHZvaWQgKik7Ci10eXBlZGVmIHhmc19mc2l6ZV90CSgqeGZzX2lvZG9uZV90KShzdHJ1Y3QgeGZzX21vdW50ICopOwotdHlwZWRlZiBpbnQJCSgqeGZzX3N3YXBfZXh0ZW50c190KSh2b2lkICosIHZvaWQgKiwKLQkJCQlzdHJ1Y3QgeGZzX3N3YXBleHQqKTsKLQotdHlwZWRlZiBzdHJ1Y3QgeGZzX2lvb3BzIHsKLQl4ZnNfaW9pbml0X3QJCQl4ZnNfaW9pbml0OwotCXhmc19ibWFwaV90CQkJeGZzX2JtYXBpX2Z1bmM7Ci0JeGZzX2J1bm1hcGlfdAkJCXhmc19idW5tYXBpX2Z1bmM7Ci0JeGZzX2JtYXBfZW9mX3QJCQl4ZnNfYm1hcF9lb2ZfZnVuYzsKLQl4ZnNfaW9tYXBfd3JpdGVfZGlyZWN0X3QJeGZzX2lvbWFwX3dyaXRlX2RpcmVjdDsKLQl4ZnNfaW9tYXBfd3JpdGVfZGVsYXlfdAkJeGZzX2lvbWFwX3dyaXRlX2RlbGF5OwotCXhmc19pb21hcF93cml0ZV9hbGxvY2F0ZV90CXhmc19pb21hcF93cml0ZV9hbGxvY2F0ZTsKLQl4ZnNfaW9tYXBfd3JpdGVfdW53cml0dGVuX3QJeGZzX2lvbWFwX3dyaXRlX3Vud3JpdHRlbjsKLQl4ZnNfbG9ja190CQkJeGZzX2lsb2NrOwotCXhmc19sY2tfbWFwX3NoYXJlZF90CQl4ZnNfbGNrX21hcF9zaGFyZWQ7Ci0JeGZzX2xvY2tfZGVtb3RlX3QJCXhmc19pbG9ja19kZW1vdGU7Ci0JeGZzX2xvY2tfbm93YWl0X3QJCXhmc19pbG9ja19ub3dhaXQ7Ci0JeGZzX3VubGtfdAkJCXhmc191bmxvY2s7Ci0JeGZzX3NpemVfdAkJCXhmc19zaXplX2Z1bmM7Ci0JeGZzX2lvZG9uZV90CQkJeGZzX2lvZG9uZTsKLQl4ZnNfc3dhcF9leHRlbnRzX3QJCXhmc19zd2FwX2V4dGVudHNfZnVuYzsKLX0geGZzX2lvb3BzX3Q7Ci0KLSNkZWZpbmUgWEZTX0lPSU5JVChtcCwgYXJncywgZmxhZ3MpIFwKLQkoKihtcCktPm1faW9fb3BzLnhmc19pb2luaXQpKG1wLCBhcmdzLCBmbGFncykKLSNkZWZpbmUgWEZTX0JNQVBJKG1wLCB0cmFucyxpbyxibm8sbGVuLGYsZmlyc3QsdG90LG12YWwsbm1hcCxmbGlzdCxkZWx0YSkgXAotCSgqKG1wKS0+bV9pb19vcHMueGZzX2JtYXBpX2Z1bmMpIFwKLQkJKHRyYW5zLChpbyktPmlvX29iaixibm8sbGVuLGYsZmlyc3QsdG90LG12YWwsbm1hcCxmbGlzdCxkZWx0YSkKLSNkZWZpbmUgWEZTX0JVTk1BUEkobXAsIHRyYW5zLGlvLGJubyxsZW4sZixuZXh0cyxmaXJzdCxmbGlzdCxkZWx0YSxkb25lKSBcCi0JKCoobXApLT5tX2lvX29wcy54ZnNfYnVubWFwaV9mdW5jKSBcCi0JCSh0cmFucywoaW8pLT5pb19vYmosYm5vLGxlbixmLG5leHRzLGZpcnN0LGZsaXN0LGRlbHRhLGRvbmUpCi0jZGVmaW5lIFhGU19CTUFQX0VPRihtcCwgaW8sIGVuZG9mZiwgd2hpY2hmb3JrLCBlb2YpIFwKLQkoKihtcCktPm1faW9fb3BzLnhmc19ibWFwX2VvZl9mdW5jKSBcCi0JCSgoaW8pLT5pb19vYmosIGVuZG9mZiwgd2hpY2hmb3JrLCBlb2YpCi0jZGVmaW5lIFhGU19JT01BUF9XUklURV9ESVJFQ1QobXAsIGlvLCBvZmZzZXQsIGNvdW50LCBmbGFncywgbXZhbCwgbm1hcCwgZm91bmQpXAotCSgqKG1wKS0+bV9pb19vcHMueGZzX2lvbWFwX3dyaXRlX2RpcmVjdCkgXAotCQkoKGlvKS0+aW9fb2JqLCBvZmZzZXQsIGNvdW50LCBmbGFncywgbXZhbCwgbm1hcCwgZm91bmQpCi0jZGVmaW5lIFhGU19JT01BUF9XUklURV9ERUxBWShtcCwgaW8sIG9mZnNldCwgY291bnQsIGZsYWdzLCBtdmFsLCBubWFwKSBcCi0JKCoobXApLT5tX2lvX29wcy54ZnNfaW9tYXBfd3JpdGVfZGVsYXkpIFwKLQkJKChpbyktPmlvX29iaiwgb2Zmc2V0LCBjb3VudCwgZmxhZ3MsIG12YWwsIG5tYXApCi0jZGVmaW5lIFhGU19JT01BUF9XUklURV9BTExPQ0FURShtcCwgaW8sIG9mZnNldCwgY291bnQsIG12YWwsIG5tYXApIFwKLQkoKihtcCktPm1faW9fb3BzLnhmc19pb21hcF93cml0ZV9hbGxvY2F0ZSkgXAotCQkoKGlvKS0+aW9fb2JqLCBvZmZzZXQsIGNvdW50LCBtdmFsLCBubWFwKQotI2RlZmluZSBYRlNfSU9NQVBfV1JJVEVfVU5XUklUVEVOKG1wLCBpbywgb2Zmc2V0LCBjb3VudCkgXAotCSgqKG1wKS0+bV9pb19vcHMueGZzX2lvbWFwX3dyaXRlX3Vud3JpdHRlbikgXAotCQkoKGlvKS0+aW9fb2JqLCBvZmZzZXQsIGNvdW50KQotI2RlZmluZSBYRlNfTENLX01BUF9TSEFSRUQobXAsIGlvKSBcCi0JKCoobXApLT5tX2lvX29wcy54ZnNfbGNrX21hcF9zaGFyZWQpKChpbyktPmlvX29iaikKLSNkZWZpbmUgWEZTX0lMT0NLKG1wLCBpbywgbW9kZSkgXAotCSgqKG1wKS0+bV9pb19vcHMueGZzX2lsb2NrKSgoaW8pLT5pb19vYmosIG1vZGUpCi0jZGVmaW5lIFhGU19JTE9DS19OT1dBSVQobXAsIGlvLCBtb2RlKSBcCi0JKCoobXApLT5tX2lvX29wcy54ZnNfaWxvY2tfbm93YWl0KSgoaW8pLT5pb19vYmosIG1vZGUpCi0jZGVmaW5lIFhGU19JVU5MT0NLKG1wLCBpbywgbW9kZSkgXAotCSgqKG1wKS0+bV9pb19vcHMueGZzX3VubG9jaykoKGlvKS0+aW9fb2JqLCBtb2RlKQotI2RlZmluZSBYRlNfSUxPQ0tfREVNT1RFKG1wLCBpbywgbW9kZSkgXAotCSgqKG1wKS0+bV9pb19vcHMueGZzX2lsb2NrX2RlbW90ZSkoKGlvKS0+aW9fb2JqLCBtb2RlKQotI2RlZmluZSBYRlNfU0laRShtcCwgaW8pIFwKLQkoKihtcCktPm1faW9fb3BzLnhmc19zaXplX2Z1bmMpKChpbyktPmlvX29iaikKLSNkZWZpbmUgWEZTX0lPRE9ORShtcCkgXAotCSgqKG1wKS0+bV9pb19vcHMueGZzX2lvZG9uZSkobXApCi0jZGVmaW5lIFhGU19TV0FQX0VYVEVOVFMobXAsIGlvLCB0aW8sIHN4cCkgXAotCSgqKG1wKS0+bV9pb19vcHMueGZzX3N3YXBfZXh0ZW50c19mdW5jKSBcCi0JCSgoaW8pLT5pb19vYmosICh0aW8pLT5pb19vYmosIHN4cCkKLQogI2lmZGVmIEhBVkVfUEVSQ1BVX1NCCiAKIC8qCkBAIC0zMjYsMTQgKzIxOSwyMCBAQAogI2RlZmluZSB4ZnNfaWNzYl9zeW5jX2NvdW50ZXJzX2ZsYWdzKG1wLCBmbGFncykJZG8geyB9IHdoaWxlICgwKQogI2VuZGlmCiAKK3R5cGVkZWYgc3RydWN0IHhmc19haWwgeworCXhmc19haWxfZW50cnlfdAkJeGFfYWlsOworCXVpbnQJCQl4YV9nZW47CisJc3RydWN0IHRhc2tfc3RydWN0CSp4YV90YXNrOworCXhmc19sc25fdAkJeGFfdGFyZ2V0OworfSB4ZnNfYWlsX3Q7CisKIHR5cGVkZWYgc3RydWN0IHhmc19tb3VudCB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrCSptX3N1cGVyOwogCXhmc190aWRfdAkJbV90aWQ7CQkvKiBuZXh0IHVudXNlZCB0aWQgZm9yIGZzICovCi0JQUlMX0xPQ0tfVAkJbV9haWxfbG9jazsJLyogZnMgQUlMIG11dGV4ICovCi0JeGZzX2FpbF9lbnRyeV90CQltX2FpbDsJCS8qIGZzIGFjdGl2ZSBsb2cgaXRlbSBsaXN0ICovCi0JdWludAkJCW1fYWlsX2dlbjsJLyogZnMgQUlMIGdlbmVyYXRpb24gY291bnQgKi8KKwlzcGlubG9ja190CQltX2FpbF9sb2NrOwkvKiBmcyBBSUwgbXV0ZXggKi8KKwl4ZnNfYWlsX3QJCW1fYWlsOwkJLyogZnMgYWN0aXZlIGxvZyBpdGVtIGxpc3QgKi8KIAl4ZnNfc2JfdAkJbV9zYjsJCS8qIGNvcHkgb2YgZnMgc3VwZXJibG9jayAqLwotCWxvY2tfdAkJCW1fc2JfbG9jazsJLyogc2IgY291bnRlciBtdXRleCAqLworCXNwaW5sb2NrX3QJCW1fc2JfbG9jazsJLyogc2IgY291bnRlciBsb2NrICovCiAJc3RydWN0IHhmc19idWYJCSptX3NiX2JwOwkvKiBidWZmZXIgZm9yIHN1cGVyYmxvY2sgKi8KIAljaGFyCQkJKm1fZnNuYW1lOwkvKiBmaWxlc3lzdGVtIG5hbWUgKi8KIAlpbnQJCQltX2ZzbmFtZV9sZW47CS8qIHN0cmxlbiBvZiBmcyBuYW1lICovCkBAIC0zNDIsNyArMjQxLDcgQEAKIAlpbnQJCQltX2JzaXplOwkvKiBmcyBsb2dpY2FsIGJsb2NrIHNpemUgKi8KIAl4ZnNfYWdudW1iZXJfdAkJbV9hZ2Zyb3RvcjsJLyogbGFzdCBhZyB3aGVyZSBzcGFjZSBmb3VuZCAqLwogCXhmc19hZ251bWJlcl90CQltX2FnaXJvdG9yOwkvKiBsYXN0IGFnIGRpciBpbm9kZSBhbGxvY2VkICovCi0JbG9ja190CQkJbV9hZ2lyb3Rvcl9sb2NrOy8qIC4uIGFuZCBsb2NrIHByb3RlY3RpbmcgaXQgKi8KKwlzcGlubG9ja190CQltX2FnaXJvdG9yX2xvY2s7LyogLi4gYW5kIGxvY2sgcHJvdGVjdGluZyBpdCAqLwogCXhmc19hZ251bWJlcl90CQltX21heGFnaTsJLyogaGlnaGVzdCBpbm9kZSBhbGxvYyBncm91cCAqLwogCXN0cnVjdCB4ZnNfaW5vZGUJKm1faW5vZGVzOwkvKiBhY3RpdmUgaW5vZGUgbGlzdCAqLwogCXN0cnVjdCBsaXN0X2hlYWQJbV9kZWxfaW5vZGVzOwkvKiBpbm9kZXMgdG8gcmVjbGFpbSAqLwpAQCAtNDIzLDcgKzMyMiw2IEBACiAJCQkJCQkgKiBoYXNoIHRhYmxlICovCiAJc3RydWN0IHhmc19kbW9wcwkqbV9kbV9vcHM7CS8qIHZlY3RvciBvZiBETUkgb3BzICovCiAJc3RydWN0IHhmc19xbW9wcwkqbV9xbV9vcHM7CS8qIHZlY3RvciBvZiBYUU0gb3BzICovCi0Jc3RydWN0IHhmc19pb29wcwltX2lvX29wczsJLyogdmVjdG9yIG9mIEkvTyBvcHMgKi8KIAlhdG9taWNfdAkJbV9hY3RpdmVfdHJhbnM7CS8qIG51bWJlciB0cmFucyBmcm96ZW4gKi8KICNpZmRlZiBIQVZFX1BFUkNQVV9TQgogCXhmc19pY3NiX2NudHNfdAkJKm1fc2JfY250czsJLyogcGVyLWNwdSBzdXBlcmJsb2NrIGNvdW50ZXJzICovCkBAIC02MTAsOCArNTA4LDYgQEAKIAogI2RlZmluZQlYRlNfTU9VTlRfSUxPQ0sobXApCW11dGV4X2xvY2soJigobXApLT5tX2lsb2NrKSkKICNkZWZpbmUJWEZTX01PVU5UX0lVTkxPQ0sobXApCW11dGV4X3VubG9jaygmKChtcCktPm1faWxvY2spKQotI2RlZmluZQlYRlNfU0JfTE9DSyhtcCkJCW11dGV4X3NwaW5sb2NrKCYobXApLT5tX3NiX2xvY2spCi0jZGVmaW5lCVhGU19TQl9VTkxPQ0sobXAscykJbXV0ZXhfc3BpbnVubG9jaygmKG1wKS0+bV9zYl9sb2NrLChzKSkKIAogZXh0ZXJuIHhmc19tb3VudF90ICp4ZnNfbW91bnRfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkCXhmc19tb2Rfc2IoeGZzX3RyYW5zX3QgKiwgX19pbnQ2NF90KTsKQEAgLTY0Niw3ICs1NDIsNiBAQAogZXh0ZXJuIHZvaWQJeGZzX3Ftb3BzX3B1dChzdHJ1Y3QgeGZzX21vdW50ICopOwogCiBleHRlcm4gc3RydWN0IHhmc19kbW9wcyB4ZnNfZG1jb3JlX3hmczsKLWV4dGVybiBzdHJ1Y3QgeGZzX2lvb3BzIHhmc19pb2NvcmVfeGZzOwogCiBleHRlcm4gaW50CXhmc19pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQJeGZzX2NsZWFudXAodm9pZCk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX21ydV9jYWNoZS5jIGIvZnMveGZzL3hmc19tcnVfY2FjaGUuYwppbmRleCBlMGIzNThjLi5hMGIyYzBhIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX21ydV9jYWNoZS5jCisrKyBiL2ZzL3hmcy94ZnNfbXJ1X2NhY2hlLmMKQEAgLTIyNSwxMCArMjI1LDE0IEBACiAgKiBsaXN0IG5lZWQgdG8gYmUgZGVsZXRlZC4gIEZvciBlYWNoIGVsZW1lbnQgdGhpcyBpbnZvbHZlcyByZW1vdmluZyBpdCBmcm9tIHRoZQogICogZGF0YSBzdG9yZSwgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgcmVhcCBsaXN0LCBjYWxsaW5nIHRoZSBjbGllbnQncyBmcmVlCiAgKiBmdW5jdGlvbiBhbmQgZGVsZXRpbmcgdGhlIGVsZW1lbnQgZnJvbSB0aGUgZWxlbWVudCB6b25lLgorICoKKyAqIFdlIGdldCBjYWxsZWQgaG9sZGluZyB0aGUgbXJ1LT5sb2NrLCB3aGljaCB3ZSBkcm9wIGFuZCB0aGVuIHJlYWNxdWlyZS4KKyAqIFNwYXJzZSBuZWVkIHNwZWNpYWwgaGVscCB3aXRoIHRoaXMgdG8gdGVsbCBpdCB3ZSBrbm93IHdoYXQgd2UgYXJlIGRvaW5nLgogICovCiBTVEFUSUMgdm9pZAogX3hmc19tcnVfY2FjaGVfY2xlYXJfcmVhcF9saXN0KAotCXhmc19tcnVfY2FjaGVfdAkJKm1ydSkKKwl4ZnNfbXJ1X2NhY2hlX3QJCSptcnUpIF9fcmVsZWFzZXMobXJ1LT5sb2NrKSBfX2FjcXVpcmVzKG1ydS0+bG9jaykKKwogewogCXhmc19tcnVfY2FjaGVfZWxlbV90CSplbGVtLCAqbmV4dDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXRtcDsKQEAgLTI0NSw3ICsyNDksNyBAQAogCQkgKi8KIAkJbGlzdF9tb3ZlKCZlbGVtLT5saXN0X25vZGUsICZ0bXApOwogCX0KLQltdXRleF9zcGludW5sb2NrKCZtcnUtPmxvY2ssIDApOworCXNwaW5fdW5sb2NrKCZtcnUtPmxvY2spOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVsZW0sIG5leHQsICZ0bXAsIGxpc3Rfbm9kZSkgewogCkBAIC0yNTksNyArMjYzLDcgQEAKIAkJa21lbV96b25lX2ZyZWUoeGZzX21ydV9lbGVtX3pvbmUsIGVsZW0pOwogCX0KIAotCW11dGV4X3NwaW5sb2NrKCZtcnUtPmxvY2spOworCXNwaW5fbG9jaygmbXJ1LT5sb2NrKTsKIH0KIAogLyoKQEAgLTI4MCw3ICsyODQsNyBAQAogCWlmICghbXJ1IHx8ICFtcnUtPmxpc3RzKQogCQlyZXR1cm47CiAKLQltdXRleF9zcGlubG9jaygmbXJ1LT5sb2NrKTsKKwlzcGluX2xvY2soJm1ydS0+bG9jayk7CiAJbmV4dCA9IF94ZnNfbXJ1X2NhY2hlX21pZ3JhdGUobXJ1LCBqaWZmaWVzKTsKIAlfeGZzX21ydV9jYWNoZV9jbGVhcl9yZWFwX2xpc3QobXJ1KTsKIApAQCAtMjk0LDcgKzI5OCw3IEBACiAJCXF1ZXVlX2RlbGF5ZWRfd29yayh4ZnNfbXJ1X3JlYXBfd3EsICZtcnUtPndvcmssIG5leHQpOwogCX0KIAotCW11dGV4X3NwaW51bmxvY2soJm1ydS0+bG9jaywgMCk7CisJc3Bpbl91bmxvY2soJm1ydS0+bG9jayk7CiB9CiAKIGludApAQCAtMzY4LDcgKzM3Miw3IEBACiAJICovCiAJSU5JVF9SQURJWF9UUkVFKCZtcnUtPnN0b3JlLCBHRlBfQVRPTUlDKTsKIAlJTklUX0xJU1RfSEVBRCgmbXJ1LT5yZWFwX2xpc3QpOwotCXNwaW5sb2NrX2luaXQoJm1ydS0+bG9jaywgInhmc19tcnVfY2FjaGUiKTsKKwlzcGluX2xvY2tfaW5pdCgmbXJ1LT5sb2NrKTsKIAlJTklUX0RFTEFZRURfV09SSygmbXJ1LT53b3JrLCBfeGZzX21ydV9jYWNoZV9yZWFwKTsKIAogCW1ydS0+Z3JwX3RpbWUgID0gZ3JwX3RpbWU7CkBAIC0zOTgsMTcgKzQwMiwxNyBAQAogCWlmICghbXJ1IHx8ICFtcnUtPmxpc3RzKQogCQlyZXR1cm47CiAKLQltdXRleF9zcGlubG9jaygmbXJ1LT5sb2NrKTsKKwlzcGluX2xvY2soJm1ydS0+bG9jayk7CiAJaWYgKG1ydS0+cXVldWVkKSB7Ci0JCW11dGV4X3NwaW51bmxvY2soJm1ydS0+bG9jaywgMCk7CisJCXNwaW5fdW5sb2NrKCZtcnUtPmxvY2spOwogCQljYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrcXVldWUoeGZzX21ydV9yZWFwX3dxLCAmbXJ1LT53b3JrKTsKLQkJbXV0ZXhfc3BpbmxvY2soJm1ydS0+bG9jayk7CisJCXNwaW5fbG9jaygmbXJ1LT5sb2NrKTsKIAl9CiAKIAlfeGZzX21ydV9jYWNoZV9taWdyYXRlKG1ydSwgamlmZmllcyArIG1ydS0+Z3JwX2NvdW50ICogbXJ1LT5ncnBfdGltZSk7CiAJX3hmc19tcnVfY2FjaGVfY2xlYXJfcmVhcF9saXN0KG1ydSk7CiAKLQltdXRleF9zcGludW5sb2NrKCZtcnUtPmxvY2ssIDApOworCXNwaW5fdW5sb2NrKCZtcnUtPmxvY2spOwogfQogCiB2b2lkCkBAIC00NTQsMTMgKzQ1OCwxMyBAQAogCWVsZW0tPmtleSA9IGtleTsKIAllbGVtLT52YWx1ZSA9IHZhbHVlOwogCi0JbXV0ZXhfc3BpbmxvY2soJm1ydS0+bG9jayk7CisJc3Bpbl9sb2NrKCZtcnUtPmxvY2spOwogCiAJcmFkaXhfdHJlZV9pbnNlcnQoJm1ydS0+c3RvcmUsIGtleSwgZWxlbSk7CiAJcmFkaXhfdHJlZV9wcmVsb2FkX2VuZCgpOwogCV94ZnNfbXJ1X2NhY2hlX2xpc3RfaW5zZXJ0KG1ydSwgZWxlbSk7CiAKLQltdXRleF9zcGludW5sb2NrKCZtcnUtPmxvY2ssIDApOworCXNwaW5fdW5sb2NrKCZtcnUtPmxvY2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00ODMsMTQgKzQ4NywxNCBAQAogCWlmICghbXJ1IHx8ICFtcnUtPmxpc3RzKQogCQlyZXR1cm4gTlVMTDsKIAotCW11dGV4X3NwaW5sb2NrKCZtcnUtPmxvY2spOworCXNwaW5fbG9jaygmbXJ1LT5sb2NrKTsKIAllbGVtID0gcmFkaXhfdHJlZV9kZWxldGUoJm1ydS0+c3RvcmUsIGtleSk7CiAJaWYgKGVsZW0pIHsKIAkJdmFsdWUgPSBlbGVtLT52YWx1ZTsKIAkJbGlzdF9kZWwoJmVsZW0tPmxpc3Rfbm9kZSk7CiAJfQogCi0JbXV0ZXhfc3BpbnVubG9jaygmbXJ1LT5sb2NrLCAwKTsKKwlzcGluX3VubG9jaygmbXJ1LT5sb2NrKTsKIAogCWlmIChlbGVtKQogCQlrbWVtX3pvbmVfZnJlZSh4ZnNfbXJ1X2VsZW1fem9uZSwgZWxlbSk7CkBAIC01MjgsNiArNTMyLDEwIEBACiAgKgogICogSWYgdGhlIGVsZW1lbnQgaXNuJ3QgZm91bmQsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBOVUxMIGFuZCB0aGUgc3BpbmxvY2sgaXMKICAqIHJlbGVhc2VkLiAgeGZzX21ydV9jYWNoZV9kb25lKCkgc2hvdWxkIE5PVCBiZSBjYWxsZWQgd2hlbiB0aGlzIG9jY3Vycy4KKyAqCisgKiBCZWNhdXNlIHNwYXJzZSBpc24ndCBzbWFydCBlbm91Z2ggdG8ga25vdyBhYm91dCBjb25kaXRpb25hbCBsb2NrIHJldHVybgorICogc3RhdHVzLCB3ZSBuZWVkIHRvIGhlbHAgaXQgZ2V0IGl0IHJpZ2h0IGJ5IGFubm90YXRpbmcgdGhlIHBhdGggdGhhdCBkb2VzCisgKiBub3QgcmVsZWFzZSB0aGUgbG9jay4KICAqLwogdm9pZCAqCiB4ZnNfbXJ1X2NhY2hlX2xvb2t1cCgKQEAgLTU0MCwxNCArNTQ4LDE0IEBACiAJaWYgKCFtcnUgfHwgIW1ydS0+bGlzdHMpCiAJCXJldHVybiBOVUxMOwogCi0JbXV0ZXhfc3BpbmxvY2soJm1ydS0+bG9jayk7CisJc3Bpbl9sb2NrKCZtcnUtPmxvY2spOwogCWVsZW0gPSByYWRpeF90cmVlX2xvb2t1cCgmbXJ1LT5zdG9yZSwga2V5KTsKIAlpZiAoZWxlbSkgewogCQlsaXN0X2RlbCgmZWxlbS0+bGlzdF9ub2RlKTsKIAkJX3hmc19tcnVfY2FjaGVfbGlzdF9pbnNlcnQobXJ1LCBlbGVtKTsKLQl9Ci0JZWxzZQotCQltdXRleF9zcGludW5sb2NrKCZtcnUtPmxvY2ssIDApOworCQlfX3JlbGVhc2UobXJ1X2xvY2spOyAvKiBoZWxwIHNwYXJzZSBub3QgYmUgc3R1cGlkICovCisJfSBlbHNlCisJCXNwaW5fdW5sb2NrKCZtcnUtPmxvY2spOwogCiAJcmV0dXJuIGVsZW0gPyBlbGVtLT52YWx1ZSA6IE5VTEw7CiB9CkBAIC01NzEsMTAgKzU3OSwxMiBAQAogCWlmICghbXJ1IHx8ICFtcnUtPmxpc3RzKQogCQlyZXR1cm4gTlVMTDsKIAotCW11dGV4X3NwaW5sb2NrKCZtcnUtPmxvY2spOworCXNwaW5fbG9jaygmbXJ1LT5sb2NrKTsKIAllbGVtID0gcmFkaXhfdHJlZV9sb29rdXAoJm1ydS0+c3RvcmUsIGtleSk7CiAJaWYgKCFlbGVtKQotCQltdXRleF9zcGludW5sb2NrKCZtcnUtPmxvY2ssIDApOworCQlzcGluX3VubG9jaygmbXJ1LT5sb2NrKTsKKwllbHNlCisJCV9fcmVsZWFzZShtcnVfbG9jayk7IC8qIGhlbHAgc3BhcnNlIG5vdCBiZSBzdHVwaWQgKi8KIAogCXJldHVybiBlbGVtID8gZWxlbS0+dmFsdWUgOiBOVUxMOwogfQpAQCAtNTg2LDcgKzU5Niw3IEBACiAgKi8KIHZvaWQKIHhmc19tcnVfY2FjaGVfZG9uZSgKLQl4ZnNfbXJ1X2NhY2hlX3QJKm1ydSkKKwl4ZnNfbXJ1X2NhY2hlX3QJKm1ydSkgX19yZWxlYXNlcyhtcnUtPmxvY2spCiB7Ci0JbXV0ZXhfc3BpbnVubG9jaygmbXJ1LT5sb2NrLCAwKTsKKwlzcGluX3VubG9jaygmbXJ1LT5sb2NrKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfcW1vcHMuYyBiL2ZzL3hmcy94ZnNfcW1vcHMuYwppbmRleCAyZWMxZDhhLi5hMjk0ZTU4IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3Ftb3BzLmMKKysrIGIvZnMveGZzL3hmc19xbW9wcy5jCkBAIC00OSwxOCArNDksMTcgQEAKIHsKIAlpbnQJCQllcnJvcjsKIAl4ZnNfdHJhbnNfdAkJKnRwOwotCXVuc2lnbmVkIGxvbmcJCXM7CiAKIAltcC0+bV9xZmxhZ3MgPSAwOwogCS8qCiAJICogSXQgaXMgT0sgdG8gbG9vayBhdCBzYl9xZmxhZ3MgaGVyZSBpbiBtb3VudCBwYXRoLAotCSAqIHdpdGhvdXQgU0JfTE9DSy4KKwkgKiB3aXRob3V0IG1fc2JfbG9jay4KIAkgKi8KIAlpZiAobXAtPm1fc2Iuc2JfcWZsYWdzID09IDApCiAJCXJldHVybiAwOwotCXMgPSBYRlNfU0JfTE9DSyhtcCk7CisJc3Bpbl9sb2NrKCZtcC0+bV9zYl9sb2NrKTsKIAltcC0+bV9zYi5zYl9xZmxhZ3MgPSAwOwotCVhGU19TQl9VTkxPQ0sobXAsIHMpOworCXNwaW5fdW5sb2NrKCZtcC0+bV9zYl9sb2NrKTsKIAogCS8qCiAJICogaWYgdGhlIGZzIGlzIHJlYWRvbmx5LCBsZXQgdGhlIGluY29yZSBzdXBlcmJsb2NrIHJ1bgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19yZW5hbWUuYyBiL2ZzL3hmcy94ZnNfcmVuYW1lLmMKaW5kZXggNDRlYTBiYS4uN2ViMTU3YSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19yZW5hbWUuYworKysgYi9mcy94ZnMveGZzX3JlbmFtZS5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSAieGZzX3JlZmNhY2hlLmgiCiAjaW5jbHVkZSAieGZzX3V0aWxzLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zX3NwYWNlLmgiCisjaW5jbHVkZSAieGZzX3Zub2Rlb3BzLmgiCiAKIAogLyoKQEAgLTExOCw3ICsxMTksNyBAQAogCWludW0xID0gaXAxLT5pX2lubzsKIAogCUFTU0VSVChpcDEpOwotCUlUUkFDRShpcDEpOworCXhmc19pdHJhY2VfcmVmKGlwMSk7CiAKIAkvKgogCSAqIFVubG9jayBkcDEgYW5kIGxvY2sgZHAyIGlmIHRoZXkgYXJlIGRpZmZlcmVudC4KQEAgLTE0MSw3ICsxNDIsNyBAQAogCQlJUkVMRSAoaXAxKTsKIAkJcmV0dXJuIGVycm9yOwogCX0gZWxzZSB7Ci0JCUlUUkFDRShpcDIpOworCQl4ZnNfaXRyYWNlX3JlZihpcDIpOwogCX0KIAogCS8qCkBAIC0yNDcsOCArMjQ4LDggQEAKIAlpbnQJCXNyY19uYW1lbGVuID0gVk5BTUVMRU4oc3JjX3ZuYW1lKTsKIAlpbnQJCXRhcmdldF9uYW1lbGVuID0gVk5BTUVMRU4odGFyZ2V0X3ZuYW1lKTsKIAotCXZuX3RyYWNlX2VudHJ5KHNyY19kcCwgInhmc19yZW5hbWUiLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7Ci0Jdm5fdHJhY2VfZW50cnkoeGZzX3Z0b2kodGFyZ2V0X2Rpcl92cCksICJ4ZnNfcmVuYW1lIiwgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCXhmc19pdHJhY2VfZW50cnkoc3JjX2RwKTsKKwl4ZnNfaXRyYWNlX2VudHJ5KHhmc192dG9pKHRhcmdldF9kaXJfdnApKTsKIAogCS8qCiAJICogRmluZCB0aGUgWEZTIGJlaGF2aW9yIGRlc2NyaXB0b3IgZm9yIHRoZSB0YXJnZXQgZGlyZWN0b3J5CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3J0YWxsb2MuYyBiL2ZzL3hmcy94ZnNfcnRhbGxvYy5jCmluZGV4IDQ3MDgyYzAuLmNhODNkZGYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfcnRhbGxvYy5jCisrKyBiL2ZzL3hmcy94ZnNfcnRhbGxvYy5jCkBAIC03MywxOCArNzMsNiBAQAogICovCiAKIC8qCi0gKiB4ZnNfbG93Yml0MzI6IGdldCBsb3cgYml0IHNldCBvdXQgb2YgMzItYml0IGFyZ3VtZW50LCAtMSBpZiBub25lIHNldC4KLSAqLwotU1RBVElDIGludAoteGZzX2xvd2JpdDMyKAotCV9fdWludDMyX3QJdikKLXsKLQlpZiAodikKLQkJcmV0dXJuIGZmcyh2KSAtIDE7Ci0JcmV0dXJuIC0xOwotfQotCi0vKgogICogQWxsb2NhdGUgc3BhY2UgdG8gdGhlIGJpdG1hcCBvciBzdW1tYXJ5IGZpbGUsIGFuZCB6ZXJvIGl0LCBmb3IgZ3Jvd2ZzLgogICovCiBTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCkBAIC00NDQsNiArNDMyLDcgQEAKIAl9CiAJYmJubyA9IFhGU19CSVRUT0JMT0NLKG1wLCBibm8pOwogCWkgPSAwOworCUFTU0VSVChtaW5sZW4gIT0gMCk7CiAJbG9nMmxlbiA9IHhmc19oaWdoYml0MzIobWlubGVuKTsKIAkvKgogCSAqIExvb3Agb3ZlciBhbGwgYml0bWFwIGJsb2NrcyAoYmJubyArIGkgaXMgY3VycmVudCBibG9jaykuCkBAIC02MTIsNiArNjAxLDggQEAKIAl4ZnNfc3VtaW5mb190CXN1bTsJCS8qIHN1bW1hcnkgaW5mb3JtYXRpb24gZm9yIGV4dGVudHMgKi8KIAogCUFTU0VSVChtaW5sZW4gJSBwcm9kID09IDAgJiYgbWF4bGVuICUgcHJvZCA9PSAwKTsKKwlBU1NFUlQobWF4bGVuICE9IDApOworCiAJLyoKIAkgKiBMb29wIG92ZXIgYWxsIHRoZSBsZXZlbHMgc3RhcnRpbmcgd2l0aCBtYXhsZW4uCiAJICogQXQgZWFjaCBsZXZlbCwgbG9vayBhdCBhbGwgdGhlIGJpdG1hcCBibG9ja3MsIHRvIHNlZSBpZiB0aGVyZQpAQCAtNjY5LDYgKzY2MCw5IEBACiAJCSpydGJsb2NrID0gTlVMTFJUQkxPQ0s7CiAJCXJldHVybiAwOwogCX0KKwlBU1NFUlQobWlubGVuICE9IDApOworCUFTU0VSVChtYXhsZW4gIT0gMCk7CisKIAkvKgogCSAqIExvb3Agb3ZlciBzaXplcywgZnJvbSBtYXhsZW4gZG93biB0byBtaW5sZW4uCiAJICogVGhpcyB0aW1lLCB3aGVuIHdlIGRvIHRoZSBhbGxvY2F0aW9ucywgYWxsb3cgc21hbGxlciBvbmVzCkBAIC0xOTU0LDYgKzE5NDgsNyBAQAogCQkJCSAgbnNicC0+c2JfYmxvY2tzaXplICogbnNicC0+c2JfcmV4dHNpemUpOwogCQluc2JwLT5zYl9yZXh0ZW50cyA9IG5zYnAtPnNiX3JibG9ja3M7CiAJCWRvX2Rpdihuc2JwLT5zYl9yZXh0ZW50cywgbnNicC0+c2JfcmV4dHNpemUpOworCQlBU1NFUlQobnNicC0+c2JfcmV4dGVudHMgIT0gMCk7CiAJCW5zYnAtPnNiX3JleHRzbG9nID0geGZzX2hpZ2hiaXQzMihuc2JwLT5zYl9yZXh0ZW50cyk7CiAJCW5yc3VtbGV2ZWxzID0gbm1wLT5tX3JzdW1sZXZlbHMgPSBuc2JwLT5zYl9yZXh0c2xvZyArIDE7CiAJCW5yc3Vtc2l6ZSA9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3J0YWxsb2MuaCBiL2ZzL3hmcy94ZnNfcnRhbGxvYy5oCmluZGV4IDc5OWMxZjguLjhkOGRjZDIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfcnRhbGxvYy5oCisrKyBiL2ZzL3hmcy94ZnNfcnRhbGxvYy5oCkBAIC0yMSw4ICsyMSw2IEBACiBzdHJ1Y3QgeGZzX21vdW50Owogc3RydWN0IHhmc190cmFuczsKIAotI2RlZmluZSBYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApICgoaXApLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKQotCiAvKiBNaW4gYW5kIG1heCBydCBleHRlbnQgc2l6ZXMsIHNwZWNpZmllZCBpbiBieXRlcyAqLwogI2RlZmluZQlYRlNfTUFYX1JURVhUU0laRQkoMTAyNCAqIDEwMjQgKiAxMDI0KQkvKiAxR0IgKi8KICNkZWZpbmUJWEZTX0RGTF9SVEVYVFNJWkUJKDY0ICogMTAyNCkJICAgICAgICAvKiA2NEtCICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3J3LmggYi9mcy94ZnMveGZzX3J3LmgKaW5kZXggNDk4NzVlMS4uZjg3ZGI1MyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ydy5oCisrKyBiL2ZzL3hmcy94ZnNfcncuaApAQCAtMzIsMTggKzMyLDEwIEBACiBzdGF0aWMgaW5saW5lIHhmc19kYWRkcl90CiB4ZnNfZnNiX3RvX2RiKHN0cnVjdCB4ZnNfaW5vZGUgKmlwLCB4ZnNfZnNibG9ja190IGZzYikKIHsKLQlyZXR1cm4gKCgoaXApLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKSA/IFwKKwlyZXR1cm4gKFhGU19JU19SRUFMVElNRV9JTk9ERShpcCkgPyBcCiAJCSAoeGZzX2RhZGRyX3QpWEZTX0ZTQl9UT19CQigoaXApLT5pX21vdW50LCAoZnNiKSkgOiBcCiAJCSBYRlNfRlNCX1RPX0RBRERSKChpcCktPmlfbW91bnQsIChmc2IpKSk7CiB9Ci0jZGVmaW5lIFhGU19GU0JfVE9fREJfSU8oaW8sZnNiKSB4ZnNfZnNiX3RvX2RiX2lvKGlvLGZzYikKLXN0YXRpYyBpbmxpbmUgeGZzX2RhZGRyX3QKLXhmc19mc2JfdG9fZGJfaW8oc3RydWN0IHhmc19pb2NvcmUgKmlvLCB4ZnNfZnNibG9ja190IGZzYikKLXsKLQlyZXR1cm4gKCgoaW8pLT5pb19mbGFncyAmIFhGU19JT0NPUkVfUlQpID8gXAotCQkgWEZTX0ZTQl9UT19CQigoaW8pLT5pb19tb3VudCwgKGZzYikpIDogXAotCQkgWEZTX0ZTQl9UT19EQUREUigoaW8pLT5pb19tb3VudCwgKGZzYikpKTsKLX0KIAogLyoKICAqIEZsYWdzIGZvciB4ZnNfZnJlZV9lb2ZibG9ja3MKQEAgLTYxLDcgKzUzLDcgQEAKIHsKIAl4ZnNfZXh0bGVuX3QJZXh0c3o7CiAKLQlpZiAodW5saWtlbHkoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpKSB7CisJaWYgKHVubGlrZWx5KFhGU19JU19SRUFMVElNRV9JTk9ERShpcCkpKSB7CiAJCWV4dHN6ID0gKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX0VYVFNJWkUpCiAJCQkJPyBpcC0+aV9kLmRpX2V4dHNpemUKIAkJCQk6IGlwLT5pX21vdW50LT5tX3NiLnNiX3JleHRzaXplOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFucy5jIGIvZnMveGZzL3hmc190cmFucy5jCmluZGV4IDg4NzgzMjIuLjcxZTRjOGQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnMuYworKysgYi9mcy94ZnMveGZzX3RyYW5zLmMKQEAgLTEzMjIsNyArMTMyMiw2IEBACiAJeGZzX2xzbl90CQlpdGVtX2xzbjsKIAlzdHJ1Y3QgeGZzX21vdW50CSptcDsKIAlpbnQJCQlpOwotCVNQTERFQ0wocyk7CiAKIAlsaWRwID0gbGljcC0+bGljX2Rlc2NzOwogCWZvciAoaSA9IDA7IGkgPCBsaWNwLT5saWNfdW51c2VkOyBpKyssIGxpZHArKykgewpAQCAtMTM2Myw3ICsxMzYyLDcgQEAKIAkJICogdGhlIHRlc3QgYmVsb3cuCiAJCSAqLwogCQltcCA9IGxpcC0+bGlfbW91bnRwOwotCQlBSUxfTE9DSyhtcCxzKTsKKwkJc3Bpbl9sb2NrKCZtcC0+bV9haWxfbG9jayk7CiAJCWlmIChYRlNfTFNOX0NNUChpdGVtX2xzbiwgbGlwLT5saV9sc24pID4gMCkgewogCQkJLyoKIAkJCSAqIFRoaXMgd2lsbCBzZXQgdGhlIGl0ZW0ncyBsc24gdG8gaXRlbV9sc24KQEAgLTEzNzIsOSArMTM3MSw5IEBACiAJCQkgKgogCQkJICogeGZzX3RyYW5zX3VwZGF0ZV9haWwoKSBkcm9wcyB0aGUgQUlMIGxvY2suCiAJCQkgKi8KLQkJCXhmc190cmFuc191cGRhdGVfYWlsKG1wLCBsaXAsIGl0ZW1fbHNuLCBzKTsKKwkJCXhmc190cmFuc191cGRhdGVfYWlsKG1wLCBsaXAsIGl0ZW1fbHNuKTsKIAkJfSBlbHNlIHsKLQkJCUFJTF9VTkxPQ0sobXAsIHMpOworCQkJc3Bpbl91bmxvY2soJm1wLT5tX2FpbF9sb2NrKTsKIAkJfQogCiAJCS8qCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zLmggYi9mcy94ZnMveGZzX3RyYW5zLmgKaW5kZXggMGUyNmU3Mi4uN2Y0MDYyOCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFucy5oCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnMuaApAQCAtOTkyLDggKzk5Miw5IEBACiAJCQkJICBpbnQgKik7CiAjZGVmaW5lIHhmc190cmFuc19jb21taXQodHAsIGZsYWdzKQlfeGZzX3RyYW5zX2NvbW1pdCh0cCwgZmxhZ3MsIE5VTEwpCiB2b2lkCQl4ZnNfdHJhbnNfY2FuY2VsKHhmc190cmFuc190ICosIGludCk7Ci12b2lkCQl4ZnNfdHJhbnNfYWlsX2luaXQoc3RydWN0IHhmc19tb3VudCAqKTsKLXhmc19sc25fdAl4ZnNfdHJhbnNfcHVzaF9haWwoc3RydWN0IHhmc19tb3VudCAqLCB4ZnNfbHNuX3QpOworaW50CQl4ZnNfdHJhbnNfYWlsX2luaXQoc3RydWN0IHhmc19tb3VudCAqKTsKK3ZvaWQJCXhmc190cmFuc19haWxfZGVzdHJveShzdHJ1Y3QgeGZzX21vdW50ICopOwordm9pZAkJeGZzX3RyYW5zX3B1c2hfYWlsKHN0cnVjdCB4ZnNfbW91bnQgKiwgeGZzX2xzbl90KTsKIHhmc19sc25fdAl4ZnNfdHJhbnNfdGFpbF9haWwoc3RydWN0IHhmc19tb3VudCAqKTsKIHZvaWQJCXhmc190cmFuc191bmxvY2tlZF9pdGVtKHN0cnVjdCB4ZnNfbW91bnQgKiwKIAkJCQkJeGZzX2xvZ19pdGVtX3QgKik7CkBAIC0xMDAxLDYgKzEwMDIsOCBAQAogCQkJCQl4ZnNfYWdudW1iZXJfdCBhZywKIAkJCQkJeGZzX2V4dGxlbl90IGlkeCk7CiAKK2V4dGVybiBrbWVtX3pvbmVfdAkqeGZzX3RyYW5zX3pvbmU7CisKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZgkvKiBfX1hGU19UUkFOU19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnNfYWlsLmMgYi9mcy94ZnMveGZzX3RyYW5zX2FpbC5jCmluZGV4IDViMmZmNTkuLjRkNjMzMGUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnNfYWlsLmMKKysrIGIvZnMveGZzL3hmc190cmFuc19haWwuYwpAQCAtMzQsOSArMzQsOSBAQAogU1RBVElDIHhmc19sb2dfaXRlbV90ICogeGZzX2FpbF9uZXh0KHhmc19haWxfZW50cnlfdCAqLCB4ZnNfbG9nX2l0ZW1fdCAqKTsKIAogI2lmZGVmIERFQlVHCi1TVEFUSUMgdm9pZCB4ZnNfYWlsX2NoZWNrKHhmc19haWxfZW50cnlfdCAqKTsKK1NUQVRJQyB2b2lkIHhmc19haWxfY2hlY2soeGZzX2FpbF9lbnRyeV90ICosIHhmc19sb2dfaXRlbV90ICopOwogI2Vsc2UKLSNkZWZpbmUJeGZzX2FpbF9jaGVjayhhKQorI2RlZmluZQl4ZnNfYWlsX2NoZWNrKGEsbCkKICNlbmRpZiAvKiBERUJVRyAqLwogCiAKQEAgLTU1LDE2ICs1NSwxNSBAQAogewogCXhmc19sc25fdAlsc247CiAJeGZzX2xvZ19pdGVtX3QJKmxpcDsKLQlTUExERUNMKHMpOwogCi0JQUlMX0xPQ0sobXAscyk7Ci0JbGlwID0geGZzX2FpbF9taW4oJihtcC0+bV9haWwpKTsKKwlzcGluX2xvY2soJm1wLT5tX2FpbF9sb2NrKTsKKwlsaXAgPSB4ZnNfYWlsX21pbigmKG1wLT5tX2FpbC54YV9haWwpKTsKIAlpZiAobGlwID09IE5VTEwpIHsKIAkJbHNuID0gKHhmc19sc25fdCkwOwogCX0gZWxzZSB7CiAJCWxzbiA9IGxpcC0+bGlfbHNuOwogCX0KLQlBSUxfVU5MT0NLKG1wLCBzKTsKKwlzcGluX3VubG9jaygmbXAtPm1fYWlsX2xvY2spOwogCiAJcmV0dXJuIGxzbjsKIH0KQEAgLTcyLDEyMCArNzEsMTg1IEBACiAvKgogICogeGZzX3RyYW5zX3B1c2hfYWlsCiAgKgotICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBtb3ZlIHRoZSB0YWlsIG9mIHRoZSBBSUwKLSAqIGZvcndhcmQuICBJdCBkb2VzIHRoaXMgYnkgdHJ5aW5nIHRvIGZsdXNoIGl0ZW1zIGluIHRoZSBBSUwKLSAqIHdob3NlIGxzbnMgYXJlIGJlbG93IHRoZSBnaXZlbiB0aHJlc2hvbGRfbHNuLgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBtb3ZlIHRoZSB0YWlsIG9mIHRoZSBBSUwgZm9yd2FyZC4gIEl0IGRvZXMgdGhpcyBieQorICogdHJ5aW5nIHRvIGZsdXNoIGl0ZW1zIGluIHRoZSBBSUwgd2hvc2UgbHNucyBhcmUgYmVsb3cgdGhlIGdpdmVuCisgKiB0aHJlc2hvbGRfbHNuLgogICoKLSAqIFRoZSByb3V0aW5lIHJldHVybnMgdGhlIGxzbiBvZiB0aGUgdGFpbCBvZiB0aGUgbG9nLgorICogdGhlIHB1c2ggaXMgcnVuIGFzeW5jaHJvbm91c2x5IGluIGEgc2VwYXJhdGUgdGhyZWFkLCBzbyB3ZSByZXR1cm4gdGhlIHRhaWwKKyAqIG9mIHRoZSBsb2cgcmlnaHQgbm93IGluc3RlYWQgb2YgdGhlIHRhaWwgYWZ0ZXIgdGhlIHB1c2guIFRoaXMgbWVhbnMgd2Ugd2lsbAorICogZWl0aGVyIGNvbnRpbnVlIHJpZ2h0IGF3YXksIG9yIHdlIHdpbGwgc2xlZXAgd2FpdGluZyBvbiB0aGUgYXN5bmMgdGhyZWFkIHRvCisgKiBkbyBpdCdzIHdvcmsuCisgKgorICogV2UgZG8gdGhpcyB1bmxvY2tlZCAtIHdlIG9ubHkgbmVlZCB0byBrbm93IHdoZXRoZXIgdGhlcmUgaXMgYW55dGhpbmcgaW4gdGhlCisgKiBBSUwgYXQgdGhlIHRpbWUgd2UgYXJlIGNhbGxlZC4gV2UgZG9uJ3QgbmVlZCB0byBhY2Nlc3MgdGhlIGNvbnRlbnRzIG9mCisgKiBhbnkgb2YgdGhlIG9iamVjdHMsIHNvIHRoZSBsb2NrIGlzIG5vdCBuZWVkZWQuCiAgKi8KLXhmc19sc25fdAordm9pZAogeGZzX3RyYW5zX3B1c2hfYWlsKAogCXhmc19tb3VudF90CQkqbXAsCiAJeGZzX2xzbl90CQl0aHJlc2hvbGRfbHNuKQogewotCXhmc19sc25fdAkJbHNuOwogCXhmc19sb2dfaXRlbV90CQkqbGlwOwotCWludAkJCWdlbjsKLQlpbnQJCQlyZXN0YXJ0czsKLQlpbnQJCQlsb2NrX3Jlc3VsdDsKLQlpbnQJCQlmbHVzaF9sb2c7Ci0JU1BMREVDTChzKTsKIAotI2RlZmluZQlYRlNfVFJBTlNfUFVTSF9BSUxfUkVTVEFSVFMJMTAwMAorCWxpcCA9IHhmc19haWxfbWluKCZtcC0+bV9haWwueGFfYWlsKTsKKwlpZiAobGlwICYmICFYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgeworCQlpZiAoWEZTX0xTTl9DTVAodGhyZXNob2xkX2xzbiwgbXAtPm1fYWlsLnhhX3RhcmdldCkgPiAwKQorCQkJeGZzYWlsZF93YWtldXAobXAsIHRocmVzaG9sZF9sc24pOworCX0KK30KIAotCUFJTF9MT0NLKG1wLHMpOwotCWxpcCA9IHhmc190cmFuc19maXJzdF9haWwobXAsICZnZW4pOwotCWlmIChsaXAgPT0gTlVMTCB8fCBYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgeworLyoKKyAqIFJldHVybiB0aGUgaXRlbSBpbiB0aGUgQUlMIHdpdGggdGhlIGN1cnJlbnQgbHNuLgorICogUmV0dXJuIHRoZSBjdXJyZW50IHRyZWUgZ2VuZXJhdGlvbiBudW1iZXIgZm9yIHVzZQorICogaW4gY2FsbHMgdG8geGZzX3RyYW5zX25leHRfYWlsKCkuCisgKi8KK1NUQVRJQyB4ZnNfbG9nX2l0ZW1fdCAqCit4ZnNfdHJhbnNfZmlyc3RfcHVzaF9haWwoCisJeGZzX21vdW50X3QJKm1wLAorCWludAkJKmdlbiwKKwl4ZnNfbHNuX3QJbHNuKQoreworCXhmc19sb2dfaXRlbV90CSpsaXA7CisKKwlsaXAgPSB4ZnNfYWlsX21pbigmKG1wLT5tX2FpbC54YV9haWwpKTsKKwkqZ2VuID0gKGludCltcC0+bV9haWwueGFfZ2VuOworCWlmIChsc24gPT0gMCkKKwkJcmV0dXJuIGxpcDsKKworCXdoaWxlIChsaXAgJiYgKFhGU19MU05fQ01QKGxpcC0+bGlfbHNuLCBsc24pIDwgMCkpCisJCWxpcCA9IGxpcC0+bGlfYWlsLmFpbF9mb3J3OworCisJcmV0dXJuIGxpcDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHRoYXQgZG9lcyB0aGUgd29yayBvZiBwdXNoaW5nIG9uIHRoZSBBSUwKKyAqLworbG9uZworeGZzYWlsZF9wdXNoKAorCXhmc19tb3VudF90CSptcCwKKwl4ZnNfbHNuX3QJKmxhc3RfbHNuKQoreworCWxvbmcJCXRvdXQgPSAxMDAwOyAvKiBtaWxsaXNlY29uZHMgKi8KKwl4ZnNfbHNuX3QJbGFzdF9wdXNoZWRfbHNuID0gKmxhc3RfbHNuOworCXhmc19sc25fdAl0YXJnZXQgPSAgbXAtPm1fYWlsLnhhX3RhcmdldDsKKwl4ZnNfbHNuX3QJbHNuOworCXhmc19sb2dfaXRlbV90CSpsaXA7CisJaW50CQlnZW47CisJaW50CQlyZXN0YXJ0czsKKwlpbnQJCWZsdXNoX2xvZywgY291bnQsIHN0dWNrOworCisjZGVmaW5lCVhGU19UUkFOU19QVVNIX0FJTF9SRVNUQVJUUwkxMAorCisJc3Bpbl9sb2NrKCZtcC0+bV9haWxfbG9jayk7CisJbGlwID0geGZzX3RyYW5zX2ZpcnN0X3B1c2hfYWlsKG1wLCAmZ2VuLCAqbGFzdF9sc24pOworCWlmICghbGlwIHx8IFhGU19GT1JDRURfU0hVVERPV04obXApKSB7CiAJCS8qCi0JCSAqIEp1c3QgcmV0dXJuIGlmIHRoZSBBSUwgaXMgZW1wdHkuCisJCSAqIEFJTCBpcyBlbXB0eSBvciBvdXIgcHVzaCBoYXMgcmVhY2hlZCB0aGUgZW5kLgogCQkgKi8KLQkJQUlMX1VOTE9DSyhtcCwgcyk7Ci0JCXJldHVybiAoeGZzX2xzbl90KTA7CisJCXNwaW5fdW5sb2NrKCZtcC0+bV9haWxfbG9jayk7CisJCWxhc3RfcHVzaGVkX2xzbiA9IDA7CisJCWdvdG8gb3V0OwogCX0KIAogCVhGU19TVEFUU19JTkMoeHNfcHVzaF9haWwpOwogCiAJLyoKIAkgKiBXaGlsZSB0aGUgaXRlbSB3ZSBhcmUgbG9va2luZyBhdCBpcyBiZWxvdyB0aGUgZ2l2ZW4gdGhyZXNob2xkCi0JICogdHJ5IHRvIGZsdXNoIGl0IG91dC4gIE1ha2Ugc3VyZSB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIHRpbWVzCi0JICogd2UgYWxsb3cgeGZzX3RyYW5zX25leHRfYWlsKCkgdG8gcmVzdGFydCBzY2FubmluZyBmcm9tIHRoZQotCSAqIGJlZ2lubmluZyBvZiB0aGUgbGlzdC4gIFdlJ2QgbGlrZSBub3QgdG8gc3RvcCB1bnRpbCB3ZSd2ZSBhdCBsZWFzdAorCSAqIHRyeSB0byBmbHVzaCBpdCBvdXQuIFdlJ2QgbGlrZSBub3QgdG8gc3RvcCB1bnRpbCB3ZSd2ZSBhdCBsZWFzdAogCSAqIHRyaWVkIHRvIHB1c2ggb24gZXZlcnl0aGluZyBpbiB0aGUgQUlMIHdpdGggYW4gTFNOIGxlc3MgdGhhbgotCSAqIHRoZSBnaXZlbiB0aHJlc2hvbGQuIEhvd2V2ZXIsIHdlIG1heSBnaXZlIHVwIGJlZm9yZSB0aGF0IGlmCi0JICogd2UgcmVhbGl6ZSB0aGF0IHdlJ3ZlIGJlZW4gaG9sZGluZyB0aGUgQUlMX0xPQ0sgZm9yICd0b28gbG9uZycsCi0JICogYmxvY2tpbmcgaW50ZXJydXB0cy4gQ3VycmVudGx5LCB0b28gbG9uZyBpcyA8IDUwMHVzIHJvdWdobHkuCisJICogdGhlIGdpdmVuIHRocmVzaG9sZC4KKwkgKgorCSAqIEhvd2V2ZXIsIHdlIHdpbGwgc3RvcCBhZnRlciBhIGNlcnRhaW4gbnVtYmVyIG9mIHB1c2hlcyBhbmQgd2FpdAorCSAqIGZvciBhIHJlZHVjZWQgdGltZW91dCB0byBmaXJlIGJlZm9yZSBwdXNoaW5nIGZ1cnRoZXIuIFRoaXMKKwkgKiBwcmV2ZW50cyB1c2UgZnJvbSBzcGlubmluZyB3aGVuIHdlIGNhbid0IGRvIGFueXRoaW5nIG9yIHRoZXJlIGlzCisJICogbG90cyBvZiBjb250ZW50aW9uIG9uIHRoZSBBSUwgbGlzdHMuCiAJICovCi0JZmx1c2hfbG9nID0gMDsKLQlyZXN0YXJ0cyA9IDA7Ci0Jd2hpbGUgKCgocmVzdGFydHMgPCBYRlNfVFJBTlNfUFVTSF9BSUxfUkVTVEFSVFMpICYmCi0JCShYRlNfTFNOX0NNUChsaXAtPmxpX2xzbiwgdGhyZXNob2xkX2xzbikgPCAwKSkpIHsKKwl0b3V0ID0gMTA7CisJbHNuID0gbGlwLT5saV9sc247CisJZmx1c2hfbG9nID0gc3R1Y2sgPSBjb3VudCA9IHJlc3RhcnRzID0gMDsKKwl3aGlsZSAoKFhGU19MU05fQ01QKGxpcC0+bGlfbHNuLCB0YXJnZXQpIDwgMCkpIHsKKwkJaW50CWxvY2tfcmVzdWx0OwogCQkvKgotCQkgKiBJZiB3ZSBjYW4gbG9jayB0aGUgaXRlbSB3aXRob3V0IHNsZWVwaW5nLCB1bmxvY2sKLQkJICogdGhlIEFJTCBsb2NrIGFuZCBmbHVzaCB0aGUgaXRlbS4gIFRoZW4gcmUtZ3JhYiB0aGUKLQkJICogQUlMIGxvY2sgc28gd2UgY2FuIGxvb2sgZm9yIHRoZSBuZXh0IGl0ZW0gb24gdGhlCi0JCSAqIEFJTC4gIFNpbmNlIHdlIHVubG9jayB0aGUgQUlMIHdoaWxlIHdlIGZsdXNoIHRoZQotCQkgKiBpdGVtLCB0aGUgbmV4dCByb3V0aW5lIG1heSBzdGFydCBvdmVyIGFnYWluIGF0IHRoZQotCQkgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0IGlmIGFueXRoaW5nIGhhcyBjaGFuZ2VkLgotCQkgKiBUaGF0IGlzIHdoYXQgdGhlIGdlbmVyYXRpb24gY291bnQgaXMgZm9yLgorCQkgKiBJZiB3ZSBjYW4gbG9jayB0aGUgaXRlbSB3aXRob3V0IHNsZWVwaW5nLCB1bmxvY2sgdGhlIEFJTAorCQkgKiBsb2NrIGFuZCBmbHVzaCB0aGUgaXRlbS4gIFRoZW4gcmUtZ3JhYiB0aGUgQUlMIGxvY2sgc28gd2UKKwkJICogY2FuIGxvb2sgZm9yIHRoZSBuZXh0IGl0ZW0gb24gdGhlIEFJTC4gTGlzdCBjaGFuZ2VzIGFyZQorCQkgKiBoYW5kbGVkIGJ5IHRoZSBBSUwgbG9va3VwIGZ1bmN0aW9ucyBpbnRlcm5hbGx5CiAJCSAqCi0JCSAqIElmIHdlIGNhbid0IGxvY2sgdGhlIGl0ZW0sIGVpdGhlciBpdHMgaG9sZGVyIHdpbGwgZmx1c2gKLQkJICogaXQgb3IgaXQgaXMgYWxyZWFkeSBiZWluZyBmbHVzaGVkIG9yIGl0IGlzIGJlaW5nIHJlbG9nZ2VkLgotCQkgKiBJbiBhbnkgb2YgdGhlc2UgY2FzZSBpdCBpcyBiZWluZyB0YWtlbiBjYXJlIG9mIGFuZCB3ZQotCQkgKiBjYW4ganVzdCBza2lwIHRvIHRoZSBuZXh0IGl0ZW0gaW4gdGhlIGxpc3QuCisJCSAqIElmIHdlIGNhbid0IGxvY2sgdGhlIGl0ZW0sIGVpdGhlciBpdHMgaG9sZGVyIHdpbGwgZmx1c2ggaXQKKwkJICogb3IgaXQgaXMgYWxyZWFkeSBiZWluZyBmbHVzaGVkIG9yIGl0IGlzIGJlaW5nIHJlbG9nZ2VkLiAgSW4KKwkJICogYW55IG9mIHRoZXNlIGNhc2UgaXQgaXMgYmVpbmcgdGFrZW4gY2FyZSBvZiBhbmQgd2UgY2FuIGp1c3QKKwkJICogc2tpcCB0byB0aGUgbmV4dCBpdGVtIGluIHRoZSBsaXN0LgogCQkgKi8KIAkJbG9ja19yZXN1bHQgPSBJT1BfVFJZTE9DSyhsaXApOworCQlzcGluX3VubG9jaygmbXAtPm1fYWlsX2xvY2spOwogCQlzd2l0Y2ggKGxvY2tfcmVzdWx0KSB7Ci0JCSAgICAgIGNhc2UgWEZTX0lURU1fU1VDQ0VTUzoKLQkJCUFJTF9VTkxPQ0sobXAsIHMpOworCQljYXNlIFhGU19JVEVNX1NVQ0NFU1M6CiAJCQlYRlNfU1RBVFNfSU5DKHhzX3B1c2hfYWlsX3N1Y2Nlc3MpOwogCQkJSU9QX1BVU0gobGlwKTsKLQkJCUFJTF9MT0NLKG1wLHMpOworCQkJbGFzdF9wdXNoZWRfbHNuID0gbHNuOwogCQkJYnJlYWs7CiAKLQkJICAgICAgY2FzZSBYRlNfSVRFTV9QVVNIQlVGOgotCQkJQUlMX1VOTE9DSyhtcCwgcyk7CisJCWNhc2UgWEZTX0lURU1fUFVTSEJVRjoKIAkJCVhGU19TVEFUU19JTkMoeHNfcHVzaF9haWxfcHVzaGJ1Zik7Ci0jaWZkZWYgWEZTUkFDRURFQlVHCi0JCQlkZWxheV9mb3JfaW50cigpOwotCQkJZGVsYXkoMzAwKTsKLSNlbmRpZgotCQkJQVNTRVJUKGxpcC0+bGlfb3BzLT5pb3BfcHVzaGJ1Zik7Ci0JCQlBU1NFUlQobGlwKTsKIAkJCUlPUF9QVVNIQlVGKGxpcCk7Ci0JCQlBSUxfTE9DSyhtcCxzKTsKKwkJCWxhc3RfcHVzaGVkX2xzbiA9IGxzbjsKIAkJCWJyZWFrOwogCi0JCSAgICAgIGNhc2UgWEZTX0lURU1fUElOTkVEOgorCQljYXNlIFhGU19JVEVNX1BJTk5FRDoKIAkJCVhGU19TVEFUU19JTkMoeHNfcHVzaF9haWxfcGlubmVkKTsKKwkJCXN0dWNrKys7CiAJCQlmbHVzaF9sb2cgPSAxOwogCQkJYnJlYWs7CiAKLQkJICAgICAgY2FzZSBYRlNfSVRFTV9MT0NLRUQ6CisJCWNhc2UgWEZTX0lURU1fTE9DS0VEOgogCQkJWEZTX1NUQVRTX0lOQyh4c19wdXNoX2FpbF9sb2NrZWQpOworCQkJbGFzdF9wdXNoZWRfbHNuID0gbHNuOworCQkJc3R1Y2srKzsKIAkJCWJyZWFrOwogCi0JCSAgICAgIGNhc2UgWEZTX0lURU1fRkxVU0hJTkc6CisJCWNhc2UgWEZTX0lURU1fRkxVU0hJTkc6CiAJCQlYRlNfU1RBVFNfSU5DKHhzX3B1c2hfYWlsX2ZsdXNoaW5nKTsKKwkJCWxhc3RfcHVzaGVkX2xzbiA9IGxzbjsKKwkJCXN0dWNrKys7CiAJCQlicmVhazsKIAotCQkgICAgICBkZWZhdWx0OgorCQlkZWZhdWx0OgogCQkJQVNTRVJUKDApOwogCQkJYnJlYWs7CiAJCX0KIAotCQlsaXAgPSB4ZnNfdHJhbnNfbmV4dF9haWwobXAsIGxpcCwgJmdlbiwgJnJlc3RhcnRzKTsKLQkJaWYgKGxpcCA9PSBOVUxMKSB7CisJCXNwaW5fbG9jaygmbXAtPm1fYWlsX2xvY2spOworCQkvKiBzaG91bGQgd2UgYm90aGVyIGNvbnRpbnVpbmc/ICovCisJCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKIAkJCWJyZWFrOwotCQl9Ci0JCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgewotCQkJLyoKLQkJCSAqIEp1c3QgcmV0dXJuIGlmIHdlIHNodXQgZG93biBkdXJpbmcgdGhlIGxhc3QgdHJ5LgotCQkJICovCi0JCQlBSUxfVU5MT0NLKG1wLCBzKTsKLQkJCXJldHVybiAoeGZzX2xzbl90KTA7Ci0JCX0KKwkJQVNTRVJUKG1wLT5tX2xvZyk7CiAKKwkJY291bnQrKzsKKworCQkvKgorCQkgKiBBcmUgdGhlcmUgdG9vIG1hbnkgaXRlbXMgd2UgY2FuJ3QgZG8gYW55dGhpbmcgd2l0aD8KKwkJICogSWYgd2Ugd2UgYXJlIHNraXBwaW5nIHRvbyBtYW55IGl0ZW1zIGJlY2F1c2Ugd2UgY2FuJ3QgZmx1c2gKKwkJICogdGhlbSBvciB0aGV5IGFyZSBhbHJlYWR5IGJlaW5nIGZsdXNoZWQsIHdlIGJhY2sgb2ZmIGFuZAorCQkgKiBnaXZlbiB0aGVtIHRpbWUgdG8gY29tcGxldGUgd2hhdGV2ZXIgb3BlcmF0aW9uIGlzIGJlaW5nCisJCSAqIGRvbmUuIGkuZS4gcmVtb3ZlIHByZXNzdXJlIGZyb20gdGhlIEFJTCB3aGlsZSB3ZSBjYW4ndCBtYWtlCisJCSAqIHByb2dyZXNzIHNvIHRyYXZlcnNhbHMgZG9uJ3Qgc2xvdyBkb3duIGZ1cnRoZXIgaW5zZXJ0cyBhbmQKKwkJICogcmVtb3ZhbHMgdG8vZnJvbSB0aGUgQUlMLgorCQkgKgorCQkgKiBUaGUgdmFsdWUgb2YgMTAwIGlzIGFuIGFyYml0cmFyeSBtYWdpYyBudW1iZXIgYmFzZWQgb24KKwkJICogb2JzZXJ2YXRpb24uCisJCSAqLworCQlpZiAoc3R1Y2sgPiAxMDApCisJCQlicmVhazsKKworCQlsaXAgPSB4ZnNfdHJhbnNfbmV4dF9haWwobXAsIGxpcCwgJmdlbiwgJnJlc3RhcnRzKTsKKwkJaWYgKGxpcCA9PSBOVUxMKQorCQkJYnJlYWs7CisJCWlmIChyZXN0YXJ0cyA+IFhGU19UUkFOU19QVVNIX0FJTF9SRVNUQVJUUykKKwkJCWJyZWFrOworCQlsc24gPSBsaXAtPmxpX2xzbjsKIAl9CisJc3Bpbl91bmxvY2soJm1wLT5tX2FpbF9sb2NrKTsKIAogCWlmIChmbHVzaF9sb2cpIHsKIAkJLyoKQEAgLTE5MywyMiArMjU3LDM1IEBACiAJCSAqIHB1c2ggb3V0IHRoZSBsb2cgc28gaXQgd2lsbCBiZWNvbWUgdW5waW5uZWQgYW5kCiAJCSAqIG1vdmUgZm9yd2FyZCBpbiB0aGUgQUlMLgogCQkgKi8KLQkJQUlMX1VOTE9DSyhtcCwgcyk7CiAJCVhGU19TVEFUU19JTkMoeHNfcHVzaF9haWxfZmx1c2gpOwogCQl4ZnNfbG9nX2ZvcmNlKG1wLCAoeGZzX2xzbl90KTAsIFhGU19MT0dfRk9SQ0UpOwotCQlBSUxfTE9DSyhtcCwgcyk7CiAJfQogCi0JbGlwID0geGZzX2FpbF9taW4oJihtcC0+bV9haWwpKTsKLQlpZiAobGlwID09IE5VTEwpIHsKLQkJbHNuID0gKHhmc19sc25fdCkwOwotCX0gZWxzZSB7Ci0JCWxzbiA9IGxpcC0+bGlfbHNuOworCS8qCisJICogV2UgcmVhY2hlZCB0aGUgdGFyZ2V0IHNvIHdhaXQgYSBiaXQgbG9uZ2VyIGZvciBJL08gdG8gY29tcGxldGUgYW5kCisJICogcmVtb3ZlIHB1c2hlZCBpdGVtcyBmcm9tIHRoZSBBSUwgYmVmb3JlIHdlIHN0YXJ0IHRoZSBuZXh0IHNjYW4gZnJvbQorCSAqIHRoZSBzdGFydCBvZiB0aGUgQUlMLgorCSAqLworCWlmICgoWEZTX0xTTl9DTVAobHNuLCB0YXJnZXQpID49IDApKSB7CisJCXRvdXQgKz0gMjA7CisJCWxhc3RfcHVzaGVkX2xzbiA9IDA7CisJfSBlbHNlIGlmICgocmVzdGFydHMgPiBYRlNfVFJBTlNfUFVTSF9BSUxfUkVTVEFSVFMpIHx8CisJCSAgIChjb3VudCAmJiAoKHN0dWNrICogMTAwKSAvIGNvdW50ID4gOTApKSkgeworCQkvKgorCQkgKiBFaXRoZXIgdGhlcmUgaXMgYSBsb3Qgb2YgY29udGVudGlvbiBvbiB0aGUgQUlMIG9yIHdlCisJCSAqIGFyZSBzdHVjayBkdWUgdG8gb3BlcmF0aW9ucyBpbiBwcm9ncmVzcy4gIlN0dWNrIiBpbiB0aGlzCisJCSAqIGNhc2UgaXMgZGVmaW5lZCBhcyA+OTAlIG9mIHRoZSBpdGVtcyB3ZSB0cmllZCB0byBwdXNoCisJCSAqIHdlcmUgc3R1Y2suCisJCSAqCisJCSAqIEJhY2tvZmYgYSBiaXQgbW9yZSB0byBhbGxvdyBzb21lIEkvTyB0byBjb21wbGV0ZSBiZWZvcmUKKwkJICogY29udGludWluZyBmcm9tIHdoZXJlIHdlIHdlcmUuCisJCSAqLworCQl0b3V0ICs9IDEwOwogCX0KLQotCUFJTF9VTkxPQ0sobXAsIHMpOwotCXJldHVybiBsc247Ci19CS8qIHhmc190cmFuc19wdXNoX2FpbCAqLworb3V0OgorCSpsYXN0X2xzbiA9IGxhc3RfcHVzaGVkX2xzbjsKKwlyZXR1cm4gdG91dDsKK30JLyogeGZzYWlsZF9wdXNoICovCiAKIAogLyoKQEAgLTI0OSw3ICszMjYsNyBAQAogCSAqIHRoZSBjYWxsIHRvIHhmc19sb2dfbW92ZV90YWlsKCkgZG9lc24ndCBkbyBhbnl0aGluZyBpZiB0aGVyZSdzCiAJICogbm90IGVub3VnaCBmcmVlIHNwYWNlIHRvIHdha2UgcGVvcGxlIHVwIHNvIHdlJ3JlIHNhZmUgY2FsbGluZyBpdC4KIAkgKi8KLQltaW5fbGlwID0geGZzX2FpbF9taW4oJm1wLT5tX2FpbCk7CisJbWluX2xpcCA9IHhmc19haWxfbWluKCZtcC0+bV9haWwueGFfYWlsKTsKIAogCWlmIChtaW5fbGlwID09IGxpcCkKIAkJeGZzX2xvZ19tb3ZlX3RhaWwobXAsIDEpOwpAQCAtMjY5LDIxICszNDYsMTkgQEAKICAqIGhhcyBjaGFuZ2VkLgogICoKICAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgQUlMIGxvY2sgaGVsZC4gIFRoZSBsb2NrCi0gKiBpcyBkcm9wcGVkIGJlZm9yZSByZXR1cm5pbmcsIHNvIHRoZSBjYWxsZXIgbXVzdCBwYXNzIGluIHRoZQotICogY29va2llIHJldHVybmVkIGJ5IEFJTF9MT0NLLgorICogaXMgZHJvcHBlZCBiZWZvcmUgcmV0dXJuaW5nLgogICovCiB2b2lkCiB4ZnNfdHJhbnNfdXBkYXRlX2FpbCgKIAl4ZnNfbW91bnRfdAkqbXAsCiAJeGZzX2xvZ19pdGVtX3QJKmxpcCwKLQl4ZnNfbHNuX3QJbHNuLAotCXVuc2lnbmVkIGxvbmcJcykgX19yZWxlYXNlcyhtcC0+bV9haWxfbG9jaykKKwl4ZnNfbHNuX3QJbHNuKSBfX3JlbGVhc2VzKG1wLT5tX2FpbF9sb2NrKQogewogCXhmc19haWxfZW50cnlfdAkJKmFpbHA7CiAJeGZzX2xvZ19pdGVtX3QJCSpkbGlwPU5VTEw7CiAJeGZzX2xvZ19pdGVtX3QJCSptbGlwOwkvKiBwdHIgdG8gbWluaW11bSBsaXAgKi8KIAotCWFpbHAgPSAmKG1wLT5tX2FpbCk7CisJYWlscCA9ICYobXAtPm1fYWlsLnhhX2FpbCk7CiAJbWxpcCA9IHhmc19haWxfbWluKGFpbHApOwogCiAJaWYgKGxpcC0+bGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSB7CkBAIC0yOTYsMTQgKzM3MSwxNCBAQAogCWxpcC0+bGlfbHNuID0gbHNuOwogCiAJeGZzX2FpbF9pbnNlcnQoYWlscCwgbGlwKTsKLQltcC0+bV9haWxfZ2VuKys7CisJbXAtPm1fYWlsLnhhX2dlbisrOwogCiAJaWYgKG1saXAgPT0gZGxpcCkgewotCQltbGlwID0geGZzX2FpbF9taW4oJihtcC0+bV9haWwpKTsKLQkJQUlMX1VOTE9DSyhtcCwgcyk7CisJCW1saXAgPSB4ZnNfYWlsX21pbigmKG1wLT5tX2FpbC54YV9haWwpKTsKKwkJc3Bpbl91bmxvY2soJm1wLT5tX2FpbF9sb2NrKTsKIAkJeGZzX2xvZ19tb3ZlX3RhaWwobXAsIG1saXAtPmxpX2xzbik7CiAJfSBlbHNlIHsKLQkJQUlMX1VOTE9DSyhtcCwgcyk7CisJCXNwaW5fdW5sb2NrKCZtcC0+bV9haWxfbG9jayk7CiAJfQogCiAKQEAgLTMyMiwyMSArMzk3LDE5IEBACiAgKiBoYXMgY2hhbmdlZC4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIEFJTCBsb2NrIGhlbGQuICBUaGUgbG9jawotICogaXMgZHJvcHBlZCBiZWZvcmUgcmV0dXJuaW5nLCBzbyB0aGUgY2FsbGVyIG11c3QgcGFzcyBpbiB0aGUKLSAqIGNvb2tpZSByZXR1cm5lZCBieSBBSUxfTE9DSy4KKyAqIGlzIGRyb3BwZWQgYmVmb3JlIHJldHVybmluZy4KICAqLwogdm9pZAogeGZzX3RyYW5zX2RlbGV0ZV9haWwoCiAJeGZzX21vdW50X3QJKm1wLAotCXhmc19sb2dfaXRlbV90CSpsaXAsCi0JdW5zaWduZWQgbG9uZwlzKSBfX3JlbGVhc2VzKG1wLT5tX2FpbF9sb2NrKQorCXhmc19sb2dfaXRlbV90CSpsaXApIF9fcmVsZWFzZXMobXAtPm1fYWlsX2xvY2spCiB7CiAJeGZzX2FpbF9lbnRyeV90CQkqYWlscDsKIAl4ZnNfbG9nX2l0ZW1fdAkJKmRsaXA7CiAJeGZzX2xvZ19pdGVtX3QJCSptbGlwOwogCiAJaWYgKGxpcC0+bGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSB7Ci0JCWFpbHAgPSAmKG1wLT5tX2FpbCk7CisJCWFpbHAgPSAmKG1wLT5tX2FpbC54YV9haWwpOwogCQltbGlwID0geGZzX2FpbF9taW4oYWlscCk7CiAJCWRsaXAgPSB4ZnNfYWlsX2RlbGV0ZShhaWxwLCBsaXApOwogCQlBU1NFUlQoZGxpcCA9PSBsaXApOwpAQCAtMzQ0LDE0ICs0MTcsMTQgQEAKIAogCQlsaXAtPmxpX2ZsYWdzICY9IH5YRlNfTElfSU5fQUlMOwogCQlsaXAtPmxpX2xzbiA9IDA7Ci0JCW1wLT5tX2FpbF9nZW4rKzsKKwkJbXAtPm1fYWlsLnhhX2dlbisrOwogCiAJCWlmIChtbGlwID09IGRsaXApIHsKLQkJCW1saXAgPSB4ZnNfYWlsX21pbigmKG1wLT5tX2FpbCkpOwotCQkJQUlMX1VOTE9DSyhtcCwgcyk7CisJCQltbGlwID0geGZzX2FpbF9taW4oJihtcC0+bV9haWwueGFfYWlsKSk7CisJCQlzcGluX3VubG9jaygmbXAtPm1fYWlsX2xvY2spOwogCQkJeGZzX2xvZ19tb3ZlX3RhaWwobXAsIChtbGlwID8gbWxpcC0+bGlfbHNuIDogMCkpOwogCQl9IGVsc2UgewotCQkJQUlMX1VOTE9DSyhtcCwgcyk7CisJCQlzcGluX3VubG9jaygmbXAtPm1fYWlsX2xvY2spOwogCQl9CiAJfQogCWVsc2UgewpAQCAtMzYwLDEyICs0MzMsMTIgQEAKIAkJICogc2VyaW91cyB0cm91YmxlIGlmIHdlIGdldCB0byB0aGlzIHN0YWdlLgogCQkgKi8KIAkJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQotCQkJQUlMX1VOTE9DSyhtcCwgcyk7CisJCQlzcGluX3VubG9jaygmbXAtPm1fYWlsX2xvY2spOwogCQllbHNlIHsKIAkJCXhmc19jbW5fZXJyKFhGU19QVEFHX0FJTERFTEVURSwgQ0VfQUxFUlQsIG1wLAogCQkiJXM6IGF0dGVtcHRpbmcgdG8gZGVsZXRlIGEgbG9nIGl0ZW0gdGhhdCBpcyBub3QgaW4gdGhlIEFJTCIsCiAJCQkJCV9fRlVOQ1RJT05fXyk7Ci0JCQlBSUxfVU5MT0NLKG1wLCBzKTsKKwkJCXNwaW5fdW5sb2NrKCZtcC0+bV9haWxfbG9jayk7CiAJCQl4ZnNfZm9yY2Vfc2h1dGRvd24obXAsIFNIVVRET1dOX0NPUlJVUFRfSU5DT1JFKTsKIAkJfQogCX0KQEAgLTM4NSwxMCArNDU4LDEwIEBACiB7CiAJeGZzX2xvZ19pdGVtX3QJKmxpcDsKIAotCWxpcCA9IHhmc19haWxfbWluKCYobXAtPm1fYWlsKSk7Ci0JKmdlbiA9IChpbnQpbXAtPm1fYWlsX2dlbjsKKwlsaXAgPSB4ZnNfYWlsX21pbigmKG1wLT5tX2FpbC54YV9haWwpKTsKKwkqZ2VuID0gKGludCltcC0+bV9haWwueGFfZ2VuOwogCi0JcmV0dXJuIChsaXApOworCXJldHVybiBsaXA7CiB9CiAKIC8qCkBAIC00MDgsMTEgKzQ4MSwxMSBAQAogCXhmc19sb2dfaXRlbV90CSpubGlwOwogCiAJQVNTRVJUKG1wICYmIGxpcCAmJiBnZW4pOwotCWlmIChtcC0+bV9haWxfZ2VuID09ICpnZW4pIHsKLQkJbmxpcCA9IHhmc19haWxfbmV4dCgmKG1wLT5tX2FpbCksIGxpcCk7CisJaWYgKG1wLT5tX2FpbC54YV9nZW4gPT0gKmdlbikgeworCQlubGlwID0geGZzX2FpbF9uZXh0KCYobXAtPm1fYWlsLnhhX2FpbCksIGxpcCk7CiAJfSBlbHNlIHsKLQkJbmxpcCA9IHhmc19haWxfbWluKCYobXAtPm1fYWlsKSk7Ci0JCSpnZW4gPSAoaW50KW1wLT5tX2FpbF9nZW47CisJCW5saXAgPSB4ZnNfYWlsX21pbigmKG1wLT5tX2FpbCkueGFfYWlsKTsKKwkJKmdlbiA9IChpbnQpbXAtPm1fYWlsLnhhX2dlbjsKIAkJaWYgKHJlc3RhcnRzICE9IE5VTEwpIHsKIAkJCVhGU19TVEFUU19JTkMoeHNfcHVzaF9haWxfcmVzdGFydHMpOwogCQkJKCpyZXN0YXJ0cykrKzsKQEAgLTQzNywxMiArNTEwLDIwIEBACiAvKgogICogSW5pdGlhbGl6ZSB0aGUgZG91Ymx5IGxpbmtlZCBsaXN0IHRvIHBvaW50IG9ubHkgdG8gaXRzZWxmLgogICovCi12b2lkCitpbnQKIHhmc190cmFuc19haWxfaW5pdCgKIAl4ZnNfbW91bnRfdAkqbXApCiB7Ci0JbXAtPm1fYWlsLmFpbF9mb3J3ID0gKHhmc19sb2dfaXRlbV90KikmKG1wLT5tX2FpbCk7Ci0JbXAtPm1fYWlsLmFpbF9iYWNrID0gKHhmc19sb2dfaXRlbV90KikmKG1wLT5tX2FpbCk7CisJbXAtPm1fYWlsLnhhX2FpbC5haWxfZm9ydyA9ICh4ZnNfbG9nX2l0ZW1fdCopJm1wLT5tX2FpbC54YV9haWw7CisJbXAtPm1fYWlsLnhhX2FpbC5haWxfYmFjayA9ICh4ZnNfbG9nX2l0ZW1fdCopJm1wLT5tX2FpbC54YV9haWw7CisJcmV0dXJuIHhmc2FpbGRfc3RhcnQobXApOworfQorCit2b2lkCit4ZnNfdHJhbnNfYWlsX2Rlc3Ryb3koCisJeGZzX21vdW50X3QJKm1wKQoreworCXhmc2FpbGRfc3RvcChtcCk7CiB9CiAKIC8qCkBAIC00ODIsNyArNTYzLDcgQEAKIAluZXh0X2xpcC0+bGlfYWlsLmFpbF9mb3J3ID0gbGlwOwogCWxpcC0+bGlfYWlsLmFpbF9mb3J3LT5saV9haWwuYWlsX2JhY2sgPSBsaXA7CiAKLQl4ZnNfYWlsX2NoZWNrKGJhc2UpOworCXhmc19haWxfY2hlY2soYmFzZSwgbGlwKTsKIAlyZXR1cm47CiB9CiAKQEAgLTQ5NiwxMiArNTc3LDEyIEBACiAJeGZzX2xvZ19pdGVtX3QJKmxpcCkKIC8qIEFSR1NVU0VEICovCiB7CisJeGZzX2FpbF9jaGVjayhiYXNlLCBsaXApOwogCWxpcC0+bGlfYWlsLmFpbF9mb3J3LT5saV9haWwuYWlsX2JhY2sgPSBsaXAtPmxpX2FpbC5haWxfYmFjazsKIAlsaXAtPmxpX2FpbC5haWxfYmFjay0+bGlfYWlsLmFpbF9mb3J3ID0gbGlwLT5saV9haWwuYWlsX2Zvcnc7CiAJbGlwLT5saV9haWwuYWlsX2ZvcncgPSBOVUxMOwogCWxpcC0+bGlfYWlsLmFpbF9iYWNrID0gTlVMTDsKIAotCXhmc19haWxfY2hlY2soYmFzZSk7CiAJcmV0dXJuIGxpcDsKIH0KIApAQCAtNTQ1LDEzICs2MjYsMTMgQEAKICAqLwogU1RBVElDIHZvaWQKIHhmc19haWxfY2hlY2soCi0JeGZzX2FpbF9lbnRyeV90ICpiYXNlKQorCXhmc19haWxfZW50cnlfdCAqYmFzZSwKKwl4ZnNfbG9nX2l0ZW1fdAkqbGlwKQogewotCXhmc19sb2dfaXRlbV90CSpsaXA7CiAJeGZzX2xvZ19pdGVtX3QJKnByZXZfbGlwOwogCi0JbGlwID0gYmFzZS0+YWlsX2Zvcnc7Ci0JaWYgKGxpcCA9PSAoeGZzX2xvZ19pdGVtX3QqKWJhc2UpIHsKKwlwcmV2X2xpcCA9IGJhc2UtPmFpbF9mb3J3OworCWlmIChwcmV2X2xpcCA9PSAoeGZzX2xvZ19pdGVtX3QqKWJhc2UpIHsKIAkJLyoKIAkJICogTWFrZSBzdXJlIHRoZSBwb2ludGVycyBhcmUgY29ycmVjdCB3aGVuIHRoZSBsaXN0CiAJCSAqIGlzIGVtcHR5LgpAQCAtNTYxLDkgKzY0MiwyNyBAQAogCX0KIAogCS8qCisJICogQ2hlY2sgdGhlIG5leHQgYW5kIHByZXZpb3VzIGVudHJpZXMgYXJlIHZhbGlkLgorCSAqLworCUFTU0VSVCgobGlwLT5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpICE9IDApOworCXByZXZfbGlwID0gbGlwLT5saV9haWwuYWlsX2JhY2s7CisJaWYgKHByZXZfbGlwICE9ICh4ZnNfbG9nX2l0ZW1fdCopYmFzZSkgeworCQlBU1NFUlQocHJldl9saXAtPmxpX2FpbC5haWxfZm9ydyA9PSBsaXApOworCQlBU1NFUlQoWEZTX0xTTl9DTVAocHJldl9saXAtPmxpX2xzbiwgbGlwLT5saV9sc24pIDw9IDApOworCX0KKwlwcmV2X2xpcCA9IGxpcC0+bGlfYWlsLmFpbF9mb3J3OworCWlmIChwcmV2X2xpcCAhPSAoeGZzX2xvZ19pdGVtX3QqKWJhc2UpIHsKKwkJQVNTRVJUKHByZXZfbGlwLT5saV9haWwuYWlsX2JhY2sgPT0gbGlwKTsKKwkJQVNTRVJUKFhGU19MU05fQ01QKHByZXZfbGlwLT5saV9sc24sIGxpcC0+bGlfbHNuKSA+PSAwKTsKKwl9CisKKworI2lmZGVmIFhGU19UUkFOU19ERUJVRworCS8qCiAJICogV2FsayB0aGUgbGlzdCBjaGVja2luZyBmb3J3YXJkIGFuZCBiYWNrd2FyZCBwb2ludGVycywKIAkgKiBsc24gb3JkZXJpbmcsIGFuZCB0aGF0IGV2ZXJ5IGVudHJ5IGhhcyB0aGUgWEZTX0xJX0lOX0FJTAotCSAqIGZsYWcgc2V0LgorCSAqIGZsYWcgc2V0LiBUaGlzIGlzIHJlYWxseSBleHBlbnNpdmUsIHNvIG9ubHkgZG8gaXQgd2hlbgorCSAqIHNwZWNpZmljYWxseSBkZWJ1Z2dpbmcgdGhlIHRyYW5zYWN0aW9uIHN1YnN5c3RlbS4KIAkgKi8KIAlwcmV2X2xpcCA9ICh4ZnNfbG9nX2l0ZW1fdCopYmFzZTsKIAl3aGlsZSAobGlwICE9ICh4ZnNfbG9nX2l0ZW1fdCopYmFzZSkgewpAQCAtNTc4LDUgKzY3Nyw2IEBACiAJfQogCUFTU0VSVChsaXAgPT0gKHhmc19sb2dfaXRlbV90KiliYXNlKTsKIAlBU1NFUlQoYmFzZS0+YWlsX2JhY2sgPT0gcHJldl9saXApOworI2VuZGlmIC8qIFhGU19UUkFOU19ERUJVRyAqLwogfQogI2VuZGlmIC8qIERFQlVHICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zX2l0ZW0uYyBiL2ZzL3hmcy94ZnNfdHJhbnNfaXRlbS5jCmluZGV4IDI5MTJhYWMuLjY2YTA5ZjAgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnNfaXRlbS5jCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnNfaXRlbS5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSAieGZzX2xvZy5oIgogI2luY2x1ZGUgInhmc19pbnVtLmgiCiAjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKIAogU1RBVElDIGludAl4ZnNfdHJhbnNfdW5sb2NrX2NodW5rKHhmc19sb2dfaXRlbV9jaHVua190ICosCiAJCQkJCWludCwgaW50LCB4ZnNfbHNuX3QpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFuc19wcml2LmggYi9mcy94ZnMveGZzX3RyYW5zX3ByaXYuaAppbmRleCA0NDdhYzQzLi4zYzc0OGM0IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zX3ByaXYuaAorKysgYi9mcy94ZnMveGZzX3RyYW5zX3ByaXYuaApAQCAtNDcsMTUgKzQ3LDIyIEBACiAgKiBGcm9tIHhmc190cmFuc19haWwuYwogICovCiB2b2lkCQkJeGZzX3RyYW5zX3VwZGF0ZV9haWwoc3RydWN0IHhmc19tb3VudCAqbXAsCi0JCQkJICAgICBzdHJ1Y3QgeGZzX2xvZ19pdGVtICpsaXAsIHhmc19sc25fdCBsc24sCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIHMpCisJCQkJICAgICBzdHJ1Y3QgeGZzX2xvZ19pdGVtICpsaXAsIHhmc19sc25fdCBsc24pCiAJCQkJICAgICBfX3JlbGVhc2VzKG1wLT5tX2FpbF9sb2NrKTsKIHZvaWQJCQl4ZnNfdHJhbnNfZGVsZXRlX2FpbChzdHJ1Y3QgeGZzX21vdW50ICptcCwKLQkJCQkgICAgIHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKmxpcCwgdW5zaWduZWQgbG9uZyBzKQorCQkJCSAgICAgc3RydWN0IHhmc19sb2dfaXRlbSAqbGlwKQogCQkJCSAgICAgX19yZWxlYXNlcyhtcC0+bV9haWxfbG9jayk7CiBzdHJ1Y3QgeGZzX2xvZ19pdGVtCSp4ZnNfdHJhbnNfZmlyc3RfYWlsKHN0cnVjdCB4ZnNfbW91bnQgKiwgaW50ICopOwogc3RydWN0IHhmc19sb2dfaXRlbQkqeGZzX3RyYW5zX25leHRfYWlsKHN0cnVjdCB4ZnNfbW91bnQgKiwKIAkJCQkgICAgIHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKiwgaW50ICosIGludCAqKTsKIAogCisvKgorICogQUlMIHB1c2ggdGhyZWFkIHN1cHBvcnQKKyAqLworbG9uZwl4ZnNhaWxkX3B1c2goc3RydWN0IHhmc19tb3VudCAqLCB4ZnNfbHNuX3QgKik7Cit2b2lkCXhmc2FpbGRfd2FrZXVwKHN0cnVjdCB4ZnNfbW91bnQgKiwgeGZzX2xzbl90KTsKK2ludAl4ZnNhaWxkX3N0YXJ0KHN0cnVjdCB4ZnNfbW91bnQgKik7Cit2b2lkCXhmc2FpbGRfc3RvcChzdHJ1Y3QgeGZzX21vdW50ICopOworCiAjZW5kaWYJLyogX19YRlNfVFJBTlNfUFJJVl9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdXRpbHMuYyBiL2ZzL3hmcy94ZnNfdXRpbHMuYwppbmRleCA2NzNiNDA1Li40NWQ3NDBkIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3V0aWxzLmMKKysrIGIvZnMveGZzL3hmc191dGlscy5jCkBAIC03Myw3ICs3Myw3IEBACiB7CiAJaW50CQllcnJvcjsKIAotCXZuX3RyYWNlX2VudHJ5KGRwLCBfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKwl4ZnNfaXRyYWNlX2VudHJ5KGRwKTsKIAogCWVycm9yID0geGZzX2Rpcl9sb29rdXAoTlVMTCwgZHAsIFZOQU1FKGRlbnRyeSksIFZOQU1FTEVOKGRlbnRyeSksIGludW0pOwogCWlmICghZXJyb3IpIHsKQEAgLTMwMiw2ICszMDIsNyBAQAogCiAJQVNTRVJUIChpcC0+aV9kLmRpX25saW5rID4gMCk7CiAJaXAtPmlfZC5kaV9ubGluay0tOworCWRyb3BfbmxpbmsoaXAtPmlfdm5vZGUpOwogCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKIAogCWVycm9yID0gMDsKQEAgLTMzMCw3ICszMzEsNiBAQAogCXhmc19pbm9kZV90CSppcCkKIHsKIAl4ZnNfbW91bnRfdAkqbXA7Ci0JdW5zaWduZWQgbG9uZwkJczsKIAogCUFTU0VSVChpc21ybG9ja2VkICgmaXAtPmlfbG9jaywgTVJfVVBEQVRFKSk7CiAJQVNTRVJUKGlwLT5pX2QuZGlfdmVyc2lvbiA9PSBYRlNfRElOT0RFX1ZFUlNJT05fMSk7CkBAIC0zNDAsMTMgKzM0MCwxMyBAQAogCW1lbXNldCgmKGlwLT5pX2QuZGlfcGFkWzBdKSwgMCwgc2l6ZW9mKGlwLT5pX2QuZGlfcGFkKSk7CiAJbXAgPSB0cC0+dF9tb3VudHA7CiAJaWYgKCFYRlNfU0JfVkVSU0lPTl9IQVNOTElOSygmbXAtPm1fc2IpKSB7Ci0JCXMgPSBYRlNfU0JfTE9DSyhtcCk7CisJCXNwaW5fbG9jaygmbXAtPm1fc2JfbG9jayk7CiAJCWlmICghWEZTX1NCX1ZFUlNJT05fSEFTTkxJTksoJm1wLT5tX3NiKSkgewogCQkJWEZTX1NCX1ZFUlNJT05fQURETkxJTksoJm1wLT5tX3NiKTsKLQkJCVhGU19TQl9VTkxPQ0sobXAsIHMpOworCQkJc3Bpbl91bmxvY2soJm1wLT5tX3NiX2xvY2spOwogCQkJeGZzX21vZF9zYih0cCwgWEZTX1NCX1ZFUlNJT05OVU0pOwogCQl9IGVsc2UgewotCQkJWEZTX1NCX1VOTE9DSyhtcCwgcyk7CisJCQlzcGluX3VubG9jaygmbXAtPm1fc2JfbG9jayk7CiAJCX0KIAl9CiAJLyogQ2FsbGVyIG11c3QgbG9nIHRoZSBpbm9kZSAqLwpAQCAtMzY2LDYgKzM2Niw3IEBACiAKIAlBU1NFUlQoaXAtPmlfZC5kaV9ubGluayA+IDApOwogCWlwLT5pX2QuZGlfbmxpbmsrKzsKKwlpbmNfbmxpbmsoaXAtPmlfdm5vZGUpOwogCWlmICgoaXAtPmlfZC5kaV92ZXJzaW9uID09IFhGU19ESU5PREVfVkVSU0lPTl8xKSAmJgogCSAgICAoaXAtPmlfZC5kaV9ubGluayA+IFhGU19NQVhMSU5LXzEpKSB7CiAJCS8qCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3V0aWxzLmggYi9mcy94ZnMveGZzX3V0aWxzLmgKaW5kZXggYTAwYjI2ZC4uZjg1N2ZjYyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc191dGlscy5oCisrKyBiL2ZzL3hmcy94ZnNfdXRpbHMuaApAQCAtMjAsOCArMjAsNiBAQAogCiAjZGVmaW5lIElSRUxFKGlwKQlWTl9SRUxFKFhGU19JVE9WKGlwKSkKICNkZWZpbmUgSUhPTEQoaXApCVZOX0hPTEQoWEZTX0lUT1YoaXApKQotI2RlZmluZQlJVFJBQ0UoaXApCXZuX3RyYWNlX3JlZihpcCwgX19GSUxFX18sIF9fTElORV9fLCBcCi0JCQkJKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpCiAKIGV4dGVybiBpbnQgeGZzX2dldF9kaXJfZW50cnkgKGJodl92bmFtZV90ICosIHhmc19pbm9kZV90ICoqKTsKIGV4dGVybiBpbnQgeGZzX2Rpcl9sb29rdXBfaW50ICh4ZnNfaW5vZGVfdCAqLCB1aW50LCBiaHZfdm5hbWVfdCAqLCB4ZnNfaW5vX3QgKiwKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdmZzb3BzLmMgYi9mcy94ZnMveGZzX3Zmc29wcy5jCmluZGV4IGExNTQ0NTkuLjQxMzU4N2YgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdmZzb3BzLmMKKysrIGIvZnMveGZzL3hmc192ZnNvcHMuYwpAQCAtNTgsMTcgKzU4LDEyIEBACiAjaW5jbHVkZSAieGZzX3Zmc29wcy5oIgogCiAKLWludAoraW50IF9faW5pdAogeGZzX2luaXQodm9pZCkKIHsKLQlleHRlcm4ga21lbV96b25lX3QJKnhmc19ibWFwX2ZyZWVfaXRlbV96b25lOwotCWV4dGVybiBrbWVtX3pvbmVfdAkqeGZzX2J0cmVlX2N1cl96b25lOwotCWV4dGVybiBrbWVtX3pvbmVfdAkqeGZzX3RyYW5zX3pvbmU7Ci0JZXh0ZXJuIGttZW1fem9uZV90CSp4ZnNfYnVmX2l0ZW1fem9uZTsKLQlleHRlcm4ga21lbV96b25lX3QJKnhmc19kYWJ1Zl96b25lOwogI2lmZGVmIFhGU19EQUJVRl9ERUJVRwotCWV4dGVybiBsb2NrX3QJICAgICAgICB4ZnNfZGFidWZfZ2xvYmFsX2xvY2s7Ci0Jc3BpbmxvY2tfaW5pdCgmeGZzX2RhYnVmX2dsb2JhbF9sb2NrLCAieGZzZGEiKTsKKwlleHRlcm4gc3BpbmxvY2tfdCAgICAgICAgeGZzX2RhYnVmX2dsb2JhbF9sb2NrOworCXNwaW5fbG9ja19pbml0KCZ4ZnNfZGFidWZfZ2xvYmFsX2xvY2spOwogI2VuZGlmCiAKIAkvKgpAQCAtMTUyLDE4ICsxNDcsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZAordm9pZCBfX2V4aXQKIHhmc19jbGVhbnVwKHZvaWQpCiB7Ci0JZXh0ZXJuIGttZW1fem9uZV90CSp4ZnNfYm1hcF9mcmVlX2l0ZW1fem9uZTsKLQlleHRlcm4ga21lbV96b25lX3QJKnhmc19idHJlZV9jdXJfem9uZTsKIAlleHRlcm4ga21lbV96b25lX3QJKnhmc19pbm9kZV96b25lOwotCWV4dGVybiBrbWVtX3pvbmVfdAkqeGZzX3RyYW5zX3pvbmU7Ci0JZXh0ZXJuIGttZW1fem9uZV90CSp4ZnNfZGFfc3RhdGVfem9uZTsKLQlleHRlcm4ga21lbV96b25lX3QJKnhmc19kYWJ1Zl96b25lOwogCWV4dGVybiBrbWVtX3pvbmVfdAkqeGZzX2VmZF96b25lOwogCWV4dGVybiBrbWVtX3pvbmVfdAkqeGZzX2VmaV96b25lOwotCWV4dGVybiBrbWVtX3pvbmVfdAkqeGZzX2J1Zl9pdGVtX3pvbmU7CiAJZXh0ZXJuIGttZW1fem9uZV90CSp4ZnNfaWNsdXN0ZXJfem9uZTsKIAogCXhmc19jbGVhbnVwX3Byb2NmcygpOwpAQCAtNDQ5LDggKzQzOCw2IEBACiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKLQltcC0+bV9pb19vcHMgPSB4ZnNfaW9jb3JlX3hmczsKLQogCWlmIChhcmdzLT5mbGFncyAmIFhGU01OVF9RVUlFVCkKIAkJZmxhZ3MgfD0gWEZTX01GU0lfUVVJRVQ7CiAKQEAgLTU0NCw3ICs1MzEsNyBAQAogCWlmICgoZXJyb3IgPSB4ZnNfZmlsZXN0cmVhbV9tb3VudChtcCkpKQogCQlnb3RvIGVycm9yMjsKIAotCWVycm9yID0gWEZTX0lPSU5JVChtcCwgYXJncywgZmxhZ3MpOworCWVycm9yID0geGZzX21vdW50ZnMobXAsIGZsYWdzKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZXJyb3IyOwogCkBAIC02OTQsNyArNjgxLDcgQEAKICAqIGNhcmUgb2YgdGhlIG1ldGFkYXRhLiBOZXcgdHJhbnNhY3Rpb25zIGFyZSBhbHJlYWR5IGJsb2NrZWQsIHNvIHdlIG5lZWQgdG8KICAqIHdhaXQgZm9yIGFueSByZW1haW5pbmcgdHJhbnNhY3Rpb25zIHRvIGRyYWluIG91dCBiZWZvcmUgcHJvY2VkaW5nLgogICovCi1TVEFUSUMgdm9pZAordm9pZAogeGZzX2F0dHJfcXVpZXNjZSgKIAl4ZnNfbW91bnRfdAkqbXApCiB7CkBAIC04MjEsODAgKzgwOCw2IEBACiB9CiAKIC8qCi0gKiB4ZnNfcm9vdCBleHRyYWN0cyB0aGUgcm9vdCB2bm9kZSBmcm9tIGEgdmZzLgotICoKLSAqIHZmc3AgLS0gdGhlIHZmcyBzdHJ1Y3QgZm9yIHRoZSBkZXNpcmVkIGZpbGUgc3lzdGVtCi0gKiB2cHAgIC0tIGFkZHJlc3Mgb2YgdGhlIGNhbGxlcidzIHZub2RlIHBvaW50ZXIgd2hpY2ggc2hvdWxkIGJlCi0gKiAgICAgICAgIHNldCB0byB0aGUgZGVzaXJlZCBmcyByb290IHZub2RlCi0gKi8KLWludAoteGZzX3Jvb3QoCi0JeGZzX21vdW50X3QJKm1wLAotCWJodl92bm9kZV90CSoqdnBwKQotewotCWJodl92bm9kZV90CSp2cDsKLQotCXZwID0gWEZTX0lUT1YobXAtPm1fcm9vdGlwKTsKLQlWTl9IT0xEKHZwKTsKLQkqdnBwID0gdnA7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiB4ZnNfc3RhdHZmcwotICoKLSAqIEZpbGwgaW4gdGhlIHN0YXR2ZnMgc3RydWN0dXJlIGZvciB0aGUgZ2l2ZW4gZmlsZSBzeXN0ZW0uICBXZSB1c2UKLSAqIHRoZSBzdXBlcmJsb2NrIGxvY2sgaW4gdGhlIG1vdW50IHN0cnVjdHVyZSB0byBlbnN1cmUgYSBjb25zaXN0ZW50Ci0gKiBzbmFwc2hvdCBvZiB0aGUgY291bnRlcnMgcmV0dXJuZWQuCi0gKi8KLWludAoteGZzX3N0YXR2ZnMoCi0JeGZzX21vdW50X3QJKm1wLAotCWJodl9zdGF0dmZzX3QJKnN0YXRwLAotCWJodl92bm9kZV90CSp2cCkKLXsKLQlfX3VpbnQ2NF90CWZha2Vpbm9zOwotCXhmc19leHRsZW5fdAlsc2l6ZTsKLQl4ZnNfc2JfdAkqc2JwOwotCXVuc2lnbmVkIGxvbmcJczsKLQotCXNicCA9ICYobXAtPm1fc2IpOwotCi0Jc3RhdHAtPmZfdHlwZSA9IFhGU19TQl9NQUdJQzsKLQotCXhmc19pY3NiX3N5bmNfY291bnRlcnNfZmxhZ3MobXAsIFhGU19JQ1NCX0xBWllfQ09VTlQpOwotCXMgPSBYRlNfU0JfTE9DSyhtcCk7Ci0Jc3RhdHAtPmZfYnNpemUgPSBzYnAtPnNiX2Jsb2Nrc2l6ZTsKLQlsc2l6ZSA9IHNicC0+c2JfbG9nc3RhcnQgPyBzYnAtPnNiX2xvZ2Jsb2NrcyA6IDA7Ci0Jc3RhdHAtPmZfYmxvY2tzID0gc2JwLT5zYl9kYmxvY2tzIC0gbHNpemU7Ci0Jc3RhdHAtPmZfYmZyZWUgPSBzdGF0cC0+Zl9iYXZhaWwgPQotCQkJCXNicC0+c2JfZmRibG9ja3MgLSBYRlNfQUxMT0NfU0VUX0FTSURFKG1wKTsKLQlmYWtlaW5vcyA9IHN0YXRwLT5mX2JmcmVlIDw8IHNicC0+c2JfaW5vcGJsb2c7Ci0jaWYgWEZTX0JJR19JTlVNUwotCWZha2Vpbm9zICs9IG1wLT5tX2lub2FkZDsKLSNlbmRpZgotCXN0YXRwLT5mX2ZpbGVzID0KLQkgICAgTUlOKHNicC0+c2JfaWNvdW50ICsgZmFrZWlub3MsIChfX3VpbnQ2NF90KVhGU19NQVhJTlVNQkVSKTsKLQlpZiAobXAtPm1fbWF4aWNvdW50KQotI2lmIFhGU19CSUdfSU5VTVMKLQkJaWYgKCFtcC0+bV9pbm9hZGQpCi0jZW5kaWYKLQkJCXN0YXRwLT5mX2ZpbGVzID0gbWluX3QodHlwZW9mKHN0YXRwLT5mX2ZpbGVzKSwKLQkJCQkJCXN0YXRwLT5mX2ZpbGVzLAotCQkJCQkJbXAtPm1fbWF4aWNvdW50KTsKLQlzdGF0cC0+Zl9mZnJlZSA9IHN0YXRwLT5mX2ZpbGVzIC0gKHNicC0+c2JfaWNvdW50IC0gc2JwLT5zYl9pZnJlZSk7Ci0JWEZTX1NCX1VOTE9DSyhtcCwgcyk7Ci0KLQl4ZnNfc3RhdHZmc19mc2lkKHN0YXRwLCBtcCk7Ci0Jc3RhdHAtPmZfbmFtZWxlbiA9IE1BWE5BTUVMRU4gLSAxOwotCi0JaWYgKHZwKQotCQlYRlNfUU1fRFFTVEFUVkZTKHhmc192dG9pKHZwKSwgc3RhdHApOwotCXJldHVybiAwOwotfQotCi0KLS8qCiAgKiB4ZnNfc3luYyBmbHVzaGVzIGFueSBwZW5kaW5nIEkvTyB0byBmaWxlIHN5c3RlbSB2ZnNwLgogICoKICAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdmZzX3N5bmMoKSB0byBtYWtlIHN1cmUgdGhhdCB0aGluZ3MgbWFrZSBpdApAQCAtOTgxLDggKzg5NCw2IEBACiAJaW50ICAgICAgICAgICAgICpieXBhc3NlZCkKIHsKIAl4ZnNfaW5vZGVfdAkqaXAgPSBOVUxMOwotCXhmc19pbm9kZV90CSppcF9uZXh0OwotCXhmc19idWZfdAkqYnA7CiAJYmh2X3Zub2RlX3QJKnZwID0gTlVMTDsKIAlpbnQJCWVycm9yOwogCWludAkJbGFzdF9lcnJvcjsKQEAgLTk5Miw3ICs5MDMsNiBAQAogCWJvb2xlYW5fdAltb3VudF9sb2NrZWQ7CiAJYm9vbGVhbl90CXZub2RlX3JlZmVkOwogCWludAkJcHJlZW1wdDsKLQl4ZnNfZGlub2RlX3QJKmRpcDsKIAl4ZnNfaXB0cl90CSppcG9pbnRlcjsKICNpZmRlZiBERUJVRwogCWJvb2xlYW5fdAlpcG9pbnRlcl9pbiA9IEJfRkFMU0U7CkBAIC0xMDQ1LDYgKzk1NSw4IEBACiAKICNkZWZpbmUgWEZTX1BSRUVNUFRfTUFTSwkweDdmCiAKKwlBU1NFUlQoIShmbGFncyAmIFNZTkNfQkRGTFVTSCkpOworCiAJaWYgKGJ5cGFzc2VkKQogCQkqYnlwYXNzZWQgPSAwOwogCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9SRE9OTFkpCkBAIC0xMDU3LDcgKzk2OSw3IEBACiAJaXBvaW50ZXIgPSAoeGZzX2lwdHJfdCAqKWttZW1femFsbG9jKHNpemVvZih4ZnNfaXB0cl90KSwgS01fU0xFRVApOwogCiAJZmZsYWcgPSBYRlNfQl9BU1lOQzsJCS8qIGRlZmF1bHQgaXMgZG9uJ3Qgd2FpdCAqLwotCWlmIChmbGFncyAmIChTWU5DX0JERkxVU0ggfCBTWU5DX0RFTFdSSSkpCisJaWYgKGZsYWdzICYgU1lOQ19ERUxXUkkpCiAJCWZmbGFnID0gWEZTX0JfREVMV1JJOwogCWlmIChmbGFncyAmIFNZTkNfV0FJVCkKIAkJZmZsYWcgPSAwOwkJLyogc3luY2hyb25vdXMgb3ZlcnJpZGVzIGFsbCAqLwpAQCAtMTE0NywyNCArMTA1OSw2IEBACiAJCX0KIAogCQkvKgotCQkgKiBJZiB0aGlzIGlzIGp1c3QgdmZzX3N5bmMoKSBvciBwZmx1c2hkKCkgY2FsbGluZwotCQkgKiB0aGVuIHdlIGNhbiBza2lwIGlub2RlcyBmb3Igd2hpY2ggaXQgbG9va3MgbGlrZQotCQkgKiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLiAgU2luY2Ugd2UgZG9uJ3QgaGF2ZSB0aGUKLQkJICogaW5vZGUgbG9ja2VkIHRoaXMgaXMgcmFjeSwgYnV0IHRoZXNlIGFyZSBwZXJpb2RpYwotCQkgKiBjYWxscyBzbyBpdCBkb2Vzbid0IG1hdHRlci4gIEZvciB0aGUgb3RoZXJzIHdlIHdhbnQKLQkJICogdG8ga25vdyBmb3Igc3VyZSwgc28gd2UgYXQgbGVhc3QgdHJ5IHRvIGxvY2sgdGhlbS4KLQkJICovCi0JCWlmIChmbGFncyAmIFNZTkNfQkRGTFVTSCkgewotCQkJaWYgKCgoaXAtPmlfaXRlbXAgPT0gTlVMTCkgfHwKLQkJCSAgICAgIShpcC0+aV9pdGVtcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYKLQkJCSAgICAgICBYRlNfSUxPR19BTEwpKSAmJgotCQkJICAgIChpcC0+aV91cGRhdGVfY29yZSA9PSAwKSkgewotCQkJCWlwID0gaXAtPmlfbW5leHQ7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQotCQkvKgogCQkgKiBUcnkgdG8gbG9jayB3aXRob3V0IHNsZWVwaW5nLiAgV2UncmUgb3V0IG9mIG9yZGVyIHdpdGgKIAkJICogdGhlIGlub2RlIGxpc3QgbG9jayBoZXJlLCBzbyBpZiB3ZSBmYWlsIHdlIG5lZWQgdG8gZHJvcAogCQkgKiB0aGUgbW91bnQgbG9jayBhbmQgdHJ5IGFnYWluLiAgSWYgd2UncmUgY2FsbGVkIGZyb20KQEAgLTExODEsNyArMTA3NSw3IEBACiAJCSAqIGl0LgogCQkgKi8KIAkJaWYgKHhmc19pbG9ja19ub3dhaXQoaXAsIGxvY2tfZmxhZ3MpID09IDApIHsKLQkJCWlmICgoZmxhZ3MgJiBTWU5DX0JERkxVU0gpIHx8ICh2cCA9PSBOVUxMKSkgeworCQkJaWYgKHZwID09IE5VTEwpIHsKIAkJCQlpcCA9IGlwLT5pX21uZXh0OwogCQkJCWNvbnRpbnVlOwogCQkJfQpAQCAtMTI0MiwxNjAgKzExMzYsMjcgQEAKIAkJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CiAJCX0KIAotCQlpZiAoZmxhZ3MgJiBTWU5DX0JERkxVU0gpIHsKLQkJCWlmICgoZmxhZ3MgJiBTWU5DX0FUVFIpICYmCi0JCQkgICAgKChpcC0+aV91cGRhdGVfY29yZSkgfHwKLQkJCSAgICAgKChpcC0+aV9pdGVtcCAhPSBOVUxMKSAmJgotCQkJICAgICAgKGlwLT5pX2l0ZW1wLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgIT0gMCkpKSkgeworCQlpZiAoKGZsYWdzICYgU1lOQ19BVFRSKSAmJgorCQkgICAgKGlwLT5pX3VwZGF0ZV9jb3JlIHx8CisJCSAgICAgKGlwLT5pX2l0ZW1wICYmIGlwLT5pX2l0ZW1wLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMpKSkgeworCQkJaWYgKG1vdW50X2xvY2tlZCkKKwkJCQlJUE9JTlRFUl9JTlNFUlQoaXAsIG1wKTsKIAotCQkJCS8qIEluc2VydCBtYXJrZXIgYW5kIGRyb3AgbG9jayBpZiBub3QgYWxyZWFkeQotCQkJCSAqIGRvbmUuCi0JCQkJICovCi0JCQkJaWYgKG1vdW50X2xvY2tlZCkgewotCQkJCQlJUE9JTlRFUl9JTlNFUlQoaXAsIG1wKTsKLQkJCQl9CisJCQlpZiAoZmxhZ3MgJiBTWU5DX1dBSVQpIHsKKwkJCQl4ZnNfaWZsb2NrKGlwKTsKKwkJCQllcnJvciA9IHhmc19pZmx1c2goaXAsIFhGU19JRkxVU0hfU1lOQyk7CiAKLQkJCQkvKgotCQkJCSAqIFdlIGRvbid0IHdhbnQgdGhlIHBlcmlvZGljIGZsdXNoaW5nIG9mIHRoZQotCQkJCSAqIGlub2RlcyBieSB2ZnNfc3luYygpIHRvIGludGVyZmVyZSB3aXRoCi0JCQkJICogSS9PIHRvIHRoZSBmaWxlLCBlc3BlY2lhbGx5IHJlYWQgSS9PCi0JCQkJICogd2hlcmUgaXQgaXMgb25seSB0aGUgYWNjZXNzIHRpbWUgc3RhbXAKLQkJCQkgKiB0aGF0IGlzIGJlaW5nIGZsdXNoZWQgb3V0LiAgVG8gcHJldmVudAotCQkJCSAqIGxvbmcgcGVyaW9kcyB3aGVyZSB3ZSBoYXZlIGJvdGggaW5vZGUKLQkJCQkgKiBsb2NrcyBoZWxkIHNoYXJlZCBoZXJlIHdoaWxlIHJlYWRpbmcgdGhlCi0JCQkJICogaW5vZGUncyBidWZmZXIgaW4gZnJvbSBkaXNrLCB3ZSBkcm9wIHRoZQotCQkJCSAqIGlub2RlIGxvY2sgd2hpbGUgcmVhZGluZyBpbiB0aGUgaW5vZGUKLQkJCQkgKiBidWZmZXIuICBXZSBoYXZlIHRvIHJlbGVhc2UgdGhlIGJ1ZmZlcgotCQkJCSAqIGFuZCByZWFjcXVpcmUgdGhlIGlub2RlIGxvY2sgc28gdGhhdCB0aGV5Ci0JCQkJICogYXJlIGFjcXVpcmVkIGluIHRoZSBwcm9wZXIgb3JkZXIgKGlub2RlCi0JCQkJICogbG9ja3MgZmlyc3QpLiAgVGhlIGJ1ZmZlciB3aWxsIGdvIGF0IHRoZQotCQkJCSAqIGVuZCBvZiB0aGUgbHJ1IGNoYWluLCB0aG91Z2gsIHNvIHdlIGNhbgotCQkJCSAqIGV4cGVjdCBpdCB0byBzdGlsbCBiZSB0aGVyZSB3aGVuIHdlIGdvCi0JCQkJICogZm9yIGl0IGFnYWluIGluIHhmc19pZmx1c2goKS4KLQkJCQkgKi8KLQkJCQlpZiAoKHhmc19pcGluY291bnQoaXApID09IDApICYmCi0JCQkJICAgIHhmc19pZmxvY2tfbm93YWl0KGlwKSkgewotCi0JCQkJCXhmc19pZnVubG9jayhpcCk7Ci0JCQkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKLQotCQkJCQllcnJvciA9IHhmc19pdG9icChtcCwgTlVMTCwgaXAsCi0JCQkJCQkJICAmZGlwLCAmYnAsIDAsIDApOwotCQkJCQlpZiAoIWVycm9yKSB7Ci0JCQkJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8qIEJhaWxpbmcgb3V0LCByZW1vdmUgdGhlCi0JCQkJCQkgKiBtYXJrZXIgYW5kIGZyZWUgaXQuCi0JCQkJCQkgKi8KLQkJCQkJCVhGU19NT1VOVF9JTE9DSyhtcCk7Ci0JCQkJCQlJUE9JTlRFUl9SRU1PVkUoaXAsIG1wKTsKLQkJCQkJCVhGU19NT1VOVF9JVU5MT0NLKG1wKTsKLQotCQkJCQkJQVNTRVJUKCEobG9ja19mbGFncyAmCi0JCQkJCQkJWEZTX0lPTE9DS19TSEFSRUQpKTsKLQotCQkJCQkJa21lbV9mcmVlKGlwb2ludGVyLAotCQkJCQkJCXNpemVvZih4ZnNfaXB0cl90KSk7Ci0JCQkJCQlyZXR1cm4gKDApOwotCQkJCQl9Ci0KLQkJCQkJLyoKLQkJCQkJICogU2luY2Ugd2UgZHJvcHBlZCB0aGUgaW5vZGUgbG9jaywKLQkJCQkJICogdGhlIGlub2RlIG1heSBoYXZlIGJlZW4gcmVjbGFpbWVkLgotCQkJCQkgKiBUaGVyZWZvcmUsIHdlIHJlYWNxdWlyZSB0aGUgbW91bnQKLQkJCQkJICogbG9jayBhbmQgY2hlY2sgdG8gc2VlIGlmIHdlIHdlcmUgdGhlCi0JCQkJCSAqIGlub2RlIHJlY2xhaW1lZC4gSWYgdGhpcyBoYXBwZW5lZAotCQkJCQkgKiB0aGVuIHRoZSBpcG9pbnRlciBtYXJrZXIgd2lsbCBubwotCQkJCQkgKiBsb25nZXIgcG9pbnQgYmFjayBhdCB1cy4gSW4gdGhpcwotCQkJCQkgKiBjYXNlLCBtb3ZlIGlwIGFsb25nIHRvIHRoZSBpbm9kZQotCQkJCQkgKiBhZnRlciB0aGUgbWFya2VyLCByZW1vdmUgdGhlIG1hcmtlcgotCQkJCQkgKiBhbmQgY29udGludWUuCi0JCQkJCSAqLwotCQkJCQlYRlNfTU9VTlRfSUxPQ0sobXApOwotCQkJCQltb3VudF9sb2NrZWQgPSBCX1RSVUU7Ci0KLQkJCQkJaWYgKGlwICE9IGlwb2ludGVyLT5pcF9tcHJldikgewotCQkJCQkJSVBPSU5URVJfUkVNT1ZFKGlwLCBtcCk7Ci0KLQkJCQkJCUFTU0VSVCghdm5vZGVfcmVmZWQpOwotCQkJCQkJQVNTRVJUKCEobG9ja19mbGFncyAmCi0JCQkJCQkJWEZTX0lPTE9DS19TSEFSRUQpKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJQVNTRVJUKGlwLT5pX21vdW50ID09IG1wKTsKLQotCQkJCQlpZiAoeGZzX2lsb2NrX25vd2FpdChpcCwKLQkJCQkJCSAgICBYRlNfSUxPQ0tfU0hBUkVEKSA9PSAwKSB7Ci0JCQkJCQlBU1NFUlQoaXAtPmlfbW91bnQgPT0gbXApOwotCQkJCQkJLyoKLQkJCQkJCSAqIFdlIGZhaWxlZCB0byByZWFjcXVpcmUKLQkJCQkJCSAqIHRoZSBpbm9kZSBsb2NrIHdpdGhvdXQKLQkJCQkJCSAqIHNsZWVwaW5nLCBzbyBqdXN0IHNraXAKLQkJCQkJCSAqIHRoZSBpbm9kZSBmb3Igbm93LiAgV2UKLQkJCQkJCSAqIGNsZWFyIHRoZSBJTE9DSyBiaXQgZnJvbQotCQkJCQkJICogdGhlIGxvY2tfZmxhZ3Mgc28gdGhhdCB3ZQotCQkJCQkJICogd29uJ3QgdHJ5IHRvIGRyb3AgYSBsb2NrCi0JCQkJCQkgKiB3ZSBkb24ndCBob2xkIGJlbG93LgotCQkJCQkJICovCi0JCQkJCQlsb2NrX2ZsYWdzICY9IH5YRlNfSUxPQ0tfU0hBUkVEOwotCQkJCQkJSVBPSU5URVJfUkVNT1ZFKGlwX25leHQsIG1wKTsKLQkJCQkJfSBlbHNlIGlmICgoeGZzX2lwaW5jb3VudChpcCkgPT0gMCkgJiYKLQkJCQkJCSAgIHhmc19pZmxvY2tfbm93YWl0KGlwKSkgewotCQkJCQkJQVNTRVJUKGlwLT5pX21vdW50ID09IG1wKTsKLQkJCQkJCS8qCi0JCQkJCQkgKiBTaW5jZSB0aGlzIGlzIHZmc19zeW5jKCkKLQkJCQkJCSAqIGNhbGxpbmcgd2Ugb25seSBmbHVzaCB0aGUKLQkJCQkJCSAqIGlub2RlIG91dCBpZiB3ZSBjYW4gbG9jawotCQkJCQkJICogaXQgd2l0aG91dCBzbGVlcGluZyBhbmQKLQkJCQkJCSAqIGl0IGlzIG5vdCBwaW5uZWQuICBEcm9wCi0JCQkJCQkgKiB0aGUgbW91bnQgbG9jayBoZXJlIHNvCi0JCQkJCQkgKiB0aGF0IHdlIGRvbid0IGhvbGQgaXQgZm9yCi0JCQkJCQkgKiB0b28gbG9uZy4gV2UgYWxyZWFkeSBoYXZlCi0JCQkJCQkgKiBhIG1hcmtlciBpbiB0aGUgbGlzdCBoZXJlLgotCQkJCQkJICovCi0JCQkJCQlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7Ci0JCQkJCQltb3VudF9sb2NrZWQgPSBCX0ZBTFNFOwotCQkJCQkJZXJyb3IgPSB4ZnNfaWZsdXNoKGlwLAotCQkJCQkJCSAgIFhGU19JRkxVU0hfREVMV1JJKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUFTU0VSVChpcC0+aV9tb3VudCA9PSBtcCk7Ci0JCQkJCQlJUE9JTlRFUl9SRU1PVkUoaXBfbmV4dCwgbXApOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0KLQkJfSBlbHNlIHsKLQkJCWlmICgoZmxhZ3MgJiBTWU5DX0FUVFIpICYmCi0JCQkgICAgKChpcC0+aV91cGRhdGVfY29yZSkgfHwKLQkJCSAgICAgKChpcC0+aV9pdGVtcCAhPSBOVUxMKSAmJgotCQkJICAgICAgKGlwLT5pX2l0ZW1wLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgIT0gMCkpKSkgewotCQkJCWlmIChtb3VudF9sb2NrZWQpIHsKLQkJCQkJSVBPSU5URVJfSU5TRVJUKGlwLCBtcCk7Ci0JCQkJfQotCi0JCQkJaWYgKGZsYWdzICYgU1lOQ19XQUlUKSB7Ci0JCQkJCXhmc19pZmxvY2soaXApOwotCQkJCQllcnJvciA9IHhmc19pZmx1c2goaXAsCi0JCQkJCQkJICAgWEZTX0lGTFVTSF9TWU5DKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvKgotCQkJCQkgKiBJZiB3ZSBjYW4ndCBhY3F1aXJlIHRoZSBmbHVzaAotCQkJCQkgKiBsb2NrLCB0aGVuIHRoZSBpbm9kZSBpcyBhbHJlYWR5Ci0JCQkJCSAqIGJlaW5nIGZsdXNoZWQgc28gZG9uJ3QgYm90aGVyCi0JCQkJCSAqIHdhaXRpbmcuICBJZiB3ZSBjYW4gbG9jayBpdCB0aGVuCi0JCQkJCSAqIGRvIGEgZGVsd3JpIGZsdXNoIHNvIHdlIGNhbgotCQkJCQkgKiBjb21iaW5lIG11bHRpcGxlIGlub2RlIGZsdXNoZXMKLQkJCQkJICogaW4gZWFjaCBkaXNrIHdyaXRlLgotCQkJCQkgKi8KLQkJCQkJaWYgKHhmc19pZmxvY2tfbm93YWl0KGlwKSkgewotCQkJCQkJZXJyb3IgPSB4ZnNfaWZsdXNoKGlwLAotCQkJCQkJCSAgIFhGU19JRkxVU0hfREVMV1JJKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChieXBhc3NlZCkKLQkJCQkJCSgqYnlwYXNzZWQpKys7Ci0JCQkJfQorCQkJLyoKKwkJCSAqIElmIHdlIGNhbid0IGFjcXVpcmUgdGhlIGZsdXNoIGxvY2ssIHRoZW4gdGhlIGlub2RlCisJCQkgKiBpcyBhbHJlYWR5IGJlaW5nIGZsdXNoZWQgc28gZG9uJ3QgYm90aGVyIHdhaXRpbmcuCisJCQkgKgorCQkJICogSWYgd2UgY2FuIGxvY2sgaXQgdGhlbiBkbyBhIGRlbHdyaSBmbHVzaCBzbyB3ZSBjYW4KKwkJCSAqIGNvbWJpbmUgbXVsdGlwbGUgaW5vZGUgZmx1c2hlcyBpbiBlYWNoIGRpc2sgd3JpdGUuCisJCQkgKi8KKwkJCX0gZWxzZSBpZiAoeGZzX2lmbG9ja19ub3dhaXQoaXApKSB7CisJCQkJZXJyb3IgPSB4ZnNfaWZsdXNoKGlwLCBYRlNfSUZMVVNIX0RFTFdSSSk7CisJCQl9IGVsc2UgaWYgKGJ5cGFzc2VkKSB7CisJCQkJKCpieXBhc3NlZCkrKzsKIAkJCX0KIAkJfQogCkBAIC0xNjI3LDQ5OSArMTM4OCwzIEBACiAKIAlyZXR1cm4gWEZTX0VSUk9SKGxhc3RfZXJyb3IpOwogfQotCi0vKgotICogeGZzX3ZnZXQgLSBjYWxsZWQgYnkgRE1BUEkgYW5kIE5GU0QgdG8gZ2V0IHZub2RlIGZyb20gZmlsZSBoYW5kbGUKLSAqLwotaW50Ci14ZnNfdmdldCgKLQl4ZnNfbW91bnRfdAkqbXAsCi0JYmh2X3Zub2RlX3QJKip2cHAsCi0JeGZzX2ZpZF90CSp4ZmlkKQotewotCXhmc19pbm9kZV90CSppcDsKLQlpbnQJCWVycm9yOwotCXhmc19pbm9fdAlpbm87Ci0JdW5zaWduZWQgaW50CWlnZW47Ci0KLQkvKgotCSAqIEludmFsaWQuICBTaW5jZSBoYW5kbGVzIGNhbiBiZSBjcmVhdGVkIGluIHVzZXIgc3BhY2UgYW5kIHBhc3NlZCBpbgotCSAqIHZpYSBnZXRoYW5kbGUoKSwgdGhpcyBpcyBub3QgY2F1c2UgZm9yIGEgcGFuaWMuCi0JICovCi0JaWYgKHhmaWQtPmZpZF9sZW4gIT0gc2l6ZW9mKCp4ZmlkKSAtIHNpemVvZih4ZmlkLT5maWRfbGVuKSkKLQkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOwotCi0JaW5vICA9IHhmaWQtPmZpZF9pbm87Ci0JaWdlbiA9IHhmaWQtPmZpZF9nZW47Ci0KLQkvKgotCSAqIE5GUyBjYW4gc29tZXRpbWVzIHNlbmQgcmVxdWVzdHMgZm9yIGlubyAwLiAgRmFpbCB0aGVtIGdyYWNlZnVsbHkuCi0JICovCi0JaWYgKGlubyA9PSAwKQotCQlyZXR1cm4gWEZTX0VSUk9SKEVTVEFMRSk7Ci0KLQllcnJvciA9IHhmc19pZ2V0KG1wLCBOVUxMLCBpbm8sIDAsIFhGU19JTE9DS19TSEFSRUQsICZpcCwgMCk7Ci0JaWYgKGVycm9yKSB7Ci0JCSp2cHAgPSBOVUxMOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JaWYgKGlwID09IE5VTEwpIHsKLQkJKnZwcCA9IE5VTEw7Ci0JCXJldHVybiBYRlNfRVJST1IoRUlPKTsKLQl9Ci0KLQlpZiAoaXAtPmlfZC5kaV9tb2RlID09IDAgfHwgaXAtPmlfZC5kaV9nZW4gIT0gaWdlbikgewotCQl4ZnNfaXB1dF9uZXcoaXAsIFhGU19JTE9DS19TSEFSRUQpOwotCQkqdnBwID0gTlVMTDsKLQkJcmV0dXJuIFhGU19FUlJPUihFTk9FTlQpOwotCX0KLQotCSp2cHAgPSBYRlNfSVRPVihpcCk7Ci0JeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwotCXJldHVybiAwOwotfQotCi0KLSNkZWZpbmUgTU5UT1BUX0xPR0JVRlMJImxvZ2J1ZnMiCS8qIG51bWJlciBvZiBYRlMgbG9nIGJ1ZmZlcnMgKi8KLSNkZWZpbmUgTU5UT1BUX0xPR0JTSVpFCSJsb2dic2l6ZSIJLyogc2l6ZSBvZiBYRlMgbG9nIGJ1ZmZlcnMgKi8KLSNkZWZpbmUgTU5UT1BUX0xPR0RFVgkibG9nZGV2IgkvKiBsb2cgZGV2aWNlICovCi0jZGVmaW5lIE1OVE9QVF9SVERFVgkicnRkZXYiCQkvKiByZWFsdGltZSBJL08gZGV2aWNlICovCi0jZGVmaW5lIE1OVE9QVF9CSU9TSVpFCSJiaW9zaXplIgkvKiBsb2cyIG9mIHByZWZlcnJlZCBidWZmZXJlZCBpbyBzaXplICovCi0jZGVmaW5lIE1OVE9QVF9XU1lOQwkid3N5bmMiCQkvKiBzYWZlLW1vZGUgbmZzIGNvbXBhdGlibGUgbW91bnQgKi8KLSNkZWZpbmUgTU5UT1BUX0lOTzY0CSJpbm82NCIJCS8qIGZvcmNlIGlub2RlcyBpbnRvIDY0LWJpdCByYW5nZSAqLwotI2RlZmluZSBNTlRPUFRfTk9BTElHTgkibm9hbGlnbiIJLyogdHVybiBvZmYgc3RyaXBlIGFsaWdubWVudCAqLwotI2RlZmluZSBNTlRPUFRfU1dBTExPQwkic3dhbGxvYyIJLyogdHVybiBvbiBzdHJpcGUgd2lkdGggYWxsb2NhdGlvbiAqLwotI2RlZmluZSBNTlRPUFRfU1VOSVQJInN1bml0IgkJLyogZGF0YSB2b2x1bWUgc3RyaXBlIHVuaXQgKi8KLSNkZWZpbmUgTU5UT1BUX1NXSURUSAkic3dpZHRoIgkvKiBkYXRhIHZvbHVtZSBzdHJpcGUgd2lkdGggKi8KLSNkZWZpbmUgTU5UT1BUX05PVVVJRAkibm91dWlkIgkvKiBpZ25vcmUgZmlsZXN5c3RlbSBVVUlEICovCi0jZGVmaW5lIE1OVE9QVF9NVFBUCSJtdHB0IgkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLwotI2RlZmluZSBNTlRPUFRfR1JQSUQJImdycGlkIgkJLyogZ3JvdXAtSUQgZnJvbSBwYXJlbnQgZGlyZWN0b3J5ICovCi0jZGVmaW5lIE1OVE9QVF9OT0dSUElECSJub2dycGlkIgkvKiBncm91cC1JRCBmcm9tIGN1cnJlbnQgcHJvY2VzcyAqLwotI2RlZmluZSBNTlRPUFRfQlNER1JPVVBTICAgICJic2Rncm91cHMiICAgIC8qIGdyb3VwLUlEIGZyb20gcGFyZW50IGRpcmVjdG9yeSAqLwotI2RlZmluZSBNTlRPUFRfU1lTVkdST1VQUyAgICJzeXN2Z3JvdXBzIiAgIC8qIGdyb3VwLUlEIGZyb20gY3VycmVudCBwcm9jZXNzICovCi0jZGVmaW5lIE1OVE9QVF9BTExPQ1NJWkUgICAgImFsbG9jc2l6ZSIgICAgLyogcHJlZmVycmVkIGFsbG9jYXRpb24gc2l6ZSAqLwotI2RlZmluZSBNTlRPUFRfTk9SRUNPVkVSWSAgICJub3JlY292ZXJ5IiAgIC8qIGRvbid0IHJ1biBYRlMgcmVjb3ZlcnkgKi8KLSNkZWZpbmUgTU5UT1BUX0JBUlJJRVIJImJhcnJpZXIiCS8qIHVzZSB3cml0ZXIgYmFycmllcnMgZm9yIGxvZyB3cml0ZSBhbmQKLQkJCQkJICogdW53cml0dGVuIGV4dGVudCBjb252ZXJzaW9uICovCi0jZGVmaW5lIE1OVE9QVF9OT0JBUlJJRVIgIm5vYmFycmllciIJLyogLi4gZGlzYWJsZSAqLwotI2RlZmluZSBNTlRPUFRfT1NZTkNJU09TWU5DICJvc3luY2lzb3N5bmMiIC8qIG9fc3luYyBpcyBSRUFMTFkgb19zeW5jICovCi0jZGVmaW5lIE1OVE9QVF82NEJJVElOT0RFICAgImlub2RlNjQiCS8qIGlub2RlcyBjYW4gYmUgYWxsb2NhdGVkIGFueXdoZXJlICovCi0jZGVmaW5lIE1OVE9QVF9JS0VFUAkiaWtlZXAiCQkvKiBkbyBub3QgZnJlZSBlbXB0eSBpbm9kZSBjbHVzdGVycyAqLwotI2RlZmluZSBNTlRPUFRfTk9JS0VFUAkibm9pa2VlcCIJLyogZnJlZSBlbXB0eSBpbm9kZSBjbHVzdGVycyAqLwotI2RlZmluZSBNTlRPUFRfTEFSR0VJTwkgICAibGFyZ2VpbyIJLyogcmVwb3J0IGxhcmdlIEkvTyBzaXplcyBpbiBzdGF0KCkgKi8KLSNkZWZpbmUgTU5UT1BUX05PTEFSR0VJTyAgICJub2xhcmdlaW8iCS8qIGRvIG5vdCByZXBvcnQgbGFyZ2UgSS9PIHNpemVzCi0JCQkJCSAqIGluIHN0YXQoKS4gKi8KLSNkZWZpbmUgTU5UT1BUX0FUVFIyCSJhdHRyMiIJCS8qIGRvIHVzZSBhdHRyMiBhdHRyaWJ1dGUgZm9ybWF0ICovCi0jZGVmaW5lIE1OVE9QVF9OT0FUVFIyCSJub2F0dHIyIgkvKiBkbyBub3QgdXNlIGF0dHIyIGF0dHJpYnV0ZSBmb3JtYXQgKi8KLSNkZWZpbmUgTU5UT1BUX0ZJTEVTVFJFQU0gICJmaWxlc3RyZWFtcyIgLyogdXNlIGZpbGVzdHJlYW1zIGFsbG9jYXRvciAqLwotI2RlZmluZSBNTlRPUFRfUVVPVEEJInF1b3RhIgkJLyogZGlzayBxdW90YXMgKHVzZXIpICovCi0jZGVmaW5lIE1OVE9QVF9OT1FVT1RBCSJub3F1b3RhIgkvKiBubyBxdW90YXMgKi8KLSNkZWZpbmUgTU5UT1BUX1VTUlFVT1RBCSJ1c3JxdW90YSIJLyogdXNlciBxdW90YSBlbmFibGVkICovCi0jZGVmaW5lIE1OVE9QVF9HUlBRVU9UQQkiZ3JwcXVvdGEiCS8qIGdyb3VwIHF1b3RhIGVuYWJsZWQgKi8KLSNkZWZpbmUgTU5UT1BUX1BSSlFVT1RBCSJwcmpxdW90YSIJLyogcHJvamVjdCBxdW90YSBlbmFibGVkICovCi0jZGVmaW5lIE1OVE9QVF9VUVVPVEEJInVxdW90YSIJLyogdXNlciBxdW90YSAoSVJJWCB2YXJpYW50KSAqLwotI2RlZmluZSBNTlRPUFRfR1FVT1RBCSJncXVvdGEiCS8qIGdyb3VwIHF1b3RhIChJUklYIHZhcmlhbnQpICovCi0jZGVmaW5lIE1OVE9QVF9QUVVPVEEJInBxdW90YSIJLyogcHJvamVjdCBxdW90YSAoSVJJWCB2YXJpYW50KSAqLwotI2RlZmluZSBNTlRPUFRfVVFVT1RBTk9FTkYgInVxbm9lbmZvcmNlIi8qIHVzZXIgcXVvdGEgbGltaXQgZW5mb3JjZW1lbnQgKi8KLSNkZWZpbmUgTU5UT1BUX0dRVU9UQU5PRU5GICJncW5vZW5mb3JjZSIvKiBncm91cCBxdW90YSBsaW1pdCBlbmZvcmNlbWVudCAqLwotI2RlZmluZSBNTlRPUFRfUFFVT1RBTk9FTkYgInBxbm9lbmZvcmNlIi8qIHByb2plY3QgcXVvdGEgbGltaXQgZW5mb3JjZW1lbnQgKi8KLSNkZWZpbmUgTU5UT1BUX1FVT1RBTk9FTkYgICJxbm9lbmZvcmNlIgkvKiBzYW1lIGFzIHVxbm9lbmZvcmNlICovCi0jZGVmaW5lIE1OVE9QVF9ETUFQSQkiZG1hcGkiCQkvKiBETUkgZW5hYmxlZCAoRE1BUEkgLyBYRFNNKSAqLwotI2RlZmluZSBNTlRPUFRfWERTTQkieGRzbSIJCS8qIERNSSBlbmFibGVkIChETUFQSSAvIFhEU00pICovCi0jZGVmaW5lIE1OVE9QVF9ETUkJImRtaSIJCS8qIERNSSBlbmFibGVkIChETUFQSSAvIFhEU00pICovCi0KLVNUQVRJQyB1bnNpZ25lZCBsb25nCi1zdWZmaXhfc3RydG91bChjaGFyICpzLCBjaGFyICoqZW5kcCwgdW5zaWduZWQgaW50IGJhc2UpCi17Ci0JaW50CWxhc3QsIHNoaWZ0X2xlZnRfZmFjdG9yID0gMDsKLQljaGFyCSp2YWx1ZSA9IHM7Ci0KLQlsYXN0ID0gc3RybGVuKHZhbHVlKSAtIDE7Ci0JaWYgKHZhbHVlW2xhc3RdID09ICdLJyB8fCB2YWx1ZVtsYXN0XSA9PSAnaycpIHsKLQkJc2hpZnRfbGVmdF9mYWN0b3IgPSAxMDsKLQkJdmFsdWVbbGFzdF0gPSAnXDAnOwotCX0KLQlpZiAodmFsdWVbbGFzdF0gPT0gJ00nIHx8IHZhbHVlW2xhc3RdID09ICdtJykgewotCQlzaGlmdF9sZWZ0X2ZhY3RvciA9IDIwOwotCQl2YWx1ZVtsYXN0XSA9ICdcMCc7Ci0JfQotCWlmICh2YWx1ZVtsYXN0XSA9PSAnRycgfHwgdmFsdWVbbGFzdF0gPT0gJ2cnKSB7Ci0JCXNoaWZ0X2xlZnRfZmFjdG9yID0gMzA7Ci0JCXZhbHVlW2xhc3RdID0gJ1wwJzsKLQl9Ci0KLQlyZXR1cm4gc2ltcGxlX3N0cnRvdWwoKGNvbnN0IGNoYXIgKilzLCBlbmRwLCBiYXNlKSA8PCBzaGlmdF9sZWZ0X2ZhY3RvcjsKLX0KLQotaW50Ci14ZnNfcGFyc2VhcmdzKAotCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAotCWNoYXIJCQkqb3B0aW9ucywKLQlzdHJ1Y3QgeGZzX21vdW50X2FyZ3MJKmFyZ3MsCi0JaW50CQkJdXBkYXRlKQotewotCWNoYXIJCQkqdGhpc19jaGFyLCAqdmFsdWUsICplb3Y7Ci0JaW50CQkJZHN1bml0LCBkc3dpZHRoLCB2b2xfZHN1bml0LCB2b2xfZHN3aWR0aDsKLQlpbnQJCQlpb3NpemU7Ci0JaW50CQkJaWtlZXAgPSAwOwotCi0JYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX0JBUlJJRVI7Ci0JYXJncy0+ZmxhZ3MyIHw9IFhGU01OVDJfQ09NUEFUX0lPU0laRTsKLQotCWlmICghb3B0aW9ucykKLQkJZ290byBkb25lOwotCi0JaW9zaXplID0gZHN1bml0ID0gZHN3aWR0aCA9IHZvbF9kc3VuaXQgPSB2b2xfZHN3aWR0aCA9IDA7Ci0KLQl3aGlsZSAoKHRoaXNfY2hhciA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgewotCQlpZiAoISp0aGlzX2NoYXIpCi0JCQljb250aW51ZTsKLQkJaWYgKCh2YWx1ZSA9IHN0cmNocih0aGlzX2NoYXIsICc9JykpICE9IE5VTEwpCi0JCQkqdmFsdWUrKyA9IDA7Ci0KLQkJaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTE9HQlVGUykpIHsKLQkJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkgewotCQkJCWNtbl9lcnIoQ0VfV0FSTiwKLQkJCQkJIlhGUzogJXMgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiwKLQkJCQkJdGhpc19jaGFyKTsKLQkJCQlyZXR1cm4gRUlOVkFMOwotCQkJfQotCQkJYXJncy0+bG9nYnVmcyA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCAmZW92LCAxMCk7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9MT0dCU0laRSkpIHsKLQkJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkgewotCQkJCWNtbl9lcnIoQ0VfV0FSTiwKLQkJCQkJIlhGUzogJXMgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiwKLQkJCQkJdGhpc19jaGFyKTsKLQkJCQlyZXR1cm4gRUlOVkFMOwotCQkJfQotCQkJYXJncy0+bG9nYnVmc2l6ZSA9IHN1ZmZpeF9zdHJ0b3VsKHZhbHVlLCAmZW92LCAxMCk7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9MT0dERVYpKSB7Ci0JCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpIHsKLQkJCQljbW5fZXJyKENFX1dBUk4sCi0JCQkJCSJYRlM6ICVzIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIsCi0JCQkJCXRoaXNfY2hhcik7Ci0JCQkJcmV0dXJuIEVJTlZBTDsKLQkJCX0KLQkJCXN0cm5jcHkoYXJncy0+bG9nbmFtZSwgdmFsdWUsIE1BWE5BTUVMRU4pOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTVRQVCkpIHsKLQkJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkgewotCQkJCWNtbl9lcnIoQ0VfV0FSTiwKLQkJCQkJIlhGUzogJXMgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiwKLQkJCQkJdGhpc19jaGFyKTsKLQkJCQlyZXR1cm4gRUlOVkFMOwotCQkJfQotCQkJc3RybmNweShhcmdzLT5tdHB0LCB2YWx1ZSwgTUFYTkFNRUxFTik7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9SVERFVikpIHsKLQkJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkgewotCQkJCWNtbl9lcnIoQ0VfV0FSTiwKLQkJCQkJIlhGUzogJXMgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiwKLQkJCQkJdGhpc19jaGFyKTsKLQkJCQlyZXR1cm4gRUlOVkFMOwotCQkJfQotCQkJc3RybmNweShhcmdzLT5ydG5hbWUsIHZhbHVlLCBNQVhOQU1FTEVOKTsKLQkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0JJT1NJWkUpKSB7Ci0JCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpIHsKLQkJCQljbW5fZXJyKENFX1dBUk4sCi0JCQkJCSJYRlM6ICVzIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIsCi0JCQkJCXRoaXNfY2hhcik7Ci0JCQkJcmV0dXJuIEVJTlZBTDsKLQkJCX0KLQkJCWlvc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCAmZW92LCAxMCk7Ci0JCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfSU9TSVpFOwotCQkJYXJncy0+aW9zaXplbG9nID0gKHVpbnQ4X3QpIGlvc2l6ZTsKLQkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0FMTE9DU0laRSkpIHsKLQkJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkgewotCQkJCWNtbl9lcnIoQ0VfV0FSTiwKLQkJCQkJIlhGUzogJXMgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiwKLQkJCQkJdGhpc19jaGFyKTsKLQkJCQlyZXR1cm4gRUlOVkFMOwotCQkJfQotCQkJaW9zaXplID0gc3VmZml4X3N0cnRvdWwodmFsdWUsICZlb3YsIDEwKTsKLQkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9JT1NJWkU7Ci0JCQlhcmdzLT5pb3NpemVsb2cgPSBmZnMoaW9zaXplKSAtIDE7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9HUlBJRCkgfHwKLQkJCSAgICFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfQlNER1JPVVBTKSkgewotCQkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0dSUElEOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTk9HUlBJRCkgfHwKLQkJCSAgICFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfU1lTVkdST1VQUykpIHsKLQkJCW1wLT5tX2ZsYWdzICY9IH5YRlNfTU9VTlRfR1JQSUQ7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9XU1lOQykpIHsKLQkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9XU1lOQzsKLQkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX09TWU5DSVNPU1lOQykpIHsKLQkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9PU1lOQ0lTT1NZTkM7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9OT1JFQ09WRVJZKSkgewotCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX05PUkVDT1ZFUlk7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9JTk82NCkpIHsKLQkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9JTk82NDsKLSNpZiAhWEZTX0JJR19JTlVNUwotCQkJY21uX2VycihDRV9XQVJOLAotCQkJCSJYRlM6ICVzIG9wdGlvbiBub3QgYWxsb3dlZCBvbiB0aGlzIHN5c3RlbSIsCi0JCQkJdGhpc19jaGFyKTsKLQkJCXJldHVybiBFSU5WQUw7Ci0jZW5kaWYKLQkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX05PQUxJR04pKSB7Ci0JCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfTk9BTElHTjsKLQkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1NXQUxMT0MpKSB7Ci0JCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfU1dBTExPQzsKLQkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1NVTklUKSkgewotCQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKSB7Ci0JCQkJY21uX2VycihDRV9XQVJOLAotCQkJCQkiWEZTOiAlcyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiLAotCQkJCQl0aGlzX2NoYXIpOwotCQkJCXJldHVybiBFSU5WQUw7Ci0JCQl9Ci0JCQlkc3VuaXQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgJmVvdiwgMTApOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfU1dJRFRIKSkgewotCQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKSB7Ci0JCQkJY21uX2VycihDRV9XQVJOLAotCQkJCQkiWEZTOiAlcyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiLAotCQkJCQl0aGlzX2NoYXIpOwotCQkJCXJldHVybiBFSU5WQUw7Ci0JCQl9Ci0JCQlkc3dpZHRoID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsICZlb3YsIDEwKTsKLQkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUXzY0QklUSU5PREUpKSB7Ci0JCQlhcmdzLT5mbGFncyAmPSB+WEZTTU5UXzMyQklUSU5PREVTOwotI2lmICFYRlNfQklHX0lOVU1TCi0JCQljbW5fZXJyKENFX1dBUk4sCi0JCQkJIlhGUzogJXMgb3B0aW9uIG5vdCBhbGxvd2VkIG9uIHRoaXMgc3lzdGVtIiwKLQkJCQl0aGlzX2NoYXIpOwotCQkJcmV0dXJuIEVJTlZBTDsKLSNlbmRpZgotCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTk9VVUlEKSkgewotCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX05PVVVJRDsKLQkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0JBUlJJRVIpKSB7Ci0JCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfQkFSUklFUjsKLQkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX05PQkFSUklFUikpIHsKLQkJCWFyZ3MtPmZsYWdzICY9IH5YRlNNTlRfQkFSUklFUjsKLQkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0lLRUVQKSkgewotCQkJaWtlZXAgPSAxOwotCQkJYXJncy0+ZmxhZ3MgJj0gflhGU01OVF9JREVMRVRFOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTk9JS0VFUCkpIHsKLQkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9JREVMRVRFOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTEFSR0VJTykpIHsKLQkJCWFyZ3MtPmZsYWdzMiAmPSB+WEZTTU5UMl9DT01QQVRfSU9TSVpFOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTk9MQVJHRUlPKSkgewotCQkJYXJncy0+ZmxhZ3MyIHw9IFhGU01OVDJfQ09NUEFUX0lPU0laRTsKLQkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0FUVFIyKSkgewotCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX0FUVFIyOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTk9BVFRSMikpIHsKLQkJCWFyZ3MtPmZsYWdzICY9IH5YRlNNTlRfQVRUUjI7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9GSUxFU1RSRUFNKSkgewotCQkJYXJncy0+ZmxhZ3MyIHw9IFhGU01OVDJfRklMRVNUUkVBTVM7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9OT1FVT1RBKSkgewotCQkJYXJncy0+ZmxhZ3MgJj0gfihYRlNNTlRfVVFVT1RBRU5GfFhGU01OVF9VUVVPVEEpOwotCQkJYXJncy0+ZmxhZ3MgJj0gfihYRlNNTlRfR1FVT1RBRU5GfFhGU01OVF9HUVVPVEEpOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfUVVPVEEpIHx8Ci0JCQkgICAhc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1VRVU9UQSkgfHwKLQkJCSAgICFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfVVNSUVVPVEEpKSB7Ci0JCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfVVFVT1RBIHwgWEZTTU5UX1VRVU9UQUVORjsKLQkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1FVT1RBTk9FTkYpIHx8Ci0JCQkgICAhc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1VRVU9UQU5PRU5GKSkgewotCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX1VRVU9UQTsKLQkJCWFyZ3MtPmZsYWdzICY9IH5YRlNNTlRfVVFVT1RBRU5GOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfUFFVT1RBKSB8fAotCQkJICAgIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9QUkpRVU9UQSkpIHsKLQkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9QUVVPVEEgfCBYRlNNTlRfUFFVT1RBRU5GOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfUFFVT1RBTk9FTkYpKSB7Ci0JCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfUFFVT1RBOwotCQkJYXJncy0+ZmxhZ3MgJj0gflhGU01OVF9QUVVPVEFFTkY7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9HUVVPVEEpIHx8Ci0JCQkgICAhc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0dSUFFVT1RBKSkgewotCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX0dRVU9UQSB8IFhGU01OVF9HUVVPVEFFTkY7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9HUVVPVEFOT0VORikpIHsKLQkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9HUVVPVEE7Ci0JCQlhcmdzLT5mbGFncyAmPSB+WEZTTU5UX0dRVU9UQUVORjsKLQkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0RNQVBJKSkgewotCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX0RNQVBJOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfWERTTSkpIHsKLQkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9ETUFQSTsKLQkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0RNSSkpIHsKLQkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9ETUFQSTsKLQkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgImloYXNoc2l6ZSIpKSB7Ci0JCQljbW5fZXJyKENFX1dBUk4sCi0JIlhGUzogaWhhc2hzaXplIG5vIGxvbmdlciB1c2VkLCBvcHRpb24gaXMgZGVwcmVjYXRlZC4iKTsKLQkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgIm9zeW5jaXNkc3luYyIpKSB7Ci0JCQkvKiBuby1vcCwgdGhpcyBpcyBub3cgdGhlIGRlZmF1bHQgKi8KLQkJCWNtbl9lcnIoQ0VfV0FSTiwKLQkiWEZTOiBvc3luY2lzZHN5bmMgaXMgbm93IHRoZSBkZWZhdWx0LCBvcHRpb24gaXMgZGVwcmVjYXRlZC4iKTsKLQkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgImlyaXhzZ2lkIikpIHsKLQkJCWNtbl9lcnIoQ0VfV0FSTiwKLQkiWEZTOiBpcml4c2dpZCBpcyBub3cgYSBzeXNjdGwoMikgdmFyaWFibGUsIG9wdGlvbiBpcyBkZXByZWNhdGVkLiIpOwotCQl9IGVsc2UgewotCQkJY21uX2VycihDRV9XQVJOLAotCQkJCSJYRlM6IHVua25vd24gbW91bnQgb3B0aW9uIFslc10uIiwgdGhpc19jaGFyKTsKLQkJCXJldHVybiBFSU5WQUw7Ci0JCX0KLQl9Ci0KLQlpZiAoYXJncy0+ZmxhZ3MgJiBYRlNNTlRfTk9SRUNPVkVSWSkgewotCQlpZiAoKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1JET05MWSkgPT0gMCkgewotCQkJY21uX2VycihDRV9XQVJOLAotCQkJCSJYRlM6IG5vLXJlY292ZXJ5IG1vdW50cyBtdXN0IGJlIHJlYWQtb25seS4iKTsKLQkJCXJldHVybiBFSU5WQUw7Ci0JCX0KLQl9Ci0KLQlpZiAoKGFyZ3MtPmZsYWdzICYgWEZTTU5UX05PQUxJR04pICYmIChkc3VuaXQgfHwgZHN3aWR0aCkpIHsKLQkJY21uX2VycihDRV9XQVJOLAotCSJYRlM6IHN1bml0IGFuZCBzd2lkdGggb3B0aW9ucyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgbm9hbGlnbiBvcHRpb24iKTsKLQkJcmV0dXJuIEVJTlZBTDsKLQl9Ci0KLQlpZiAoKGFyZ3MtPmZsYWdzICYgWEZTTU5UX0dRVU9UQSkgJiYgKGFyZ3MtPmZsYWdzICYgWEZTTU5UX1BRVU9UQSkpIHsKLQkJY21uX2VycihDRV9XQVJOLAotCQkJIlhGUzogY2Fubm90IG1vdW50IHdpdGggYm90aCBwcm9qZWN0IGFuZCBncm91cCBxdW90YSIpOwotCQlyZXR1cm4gRUlOVkFMOwotCX0KLQotCWlmICgoYXJncy0+ZmxhZ3MgJiBYRlNNTlRfRE1BUEkpICYmICphcmdzLT5tdHB0ID09ICdcMCcpIHsKLQkJcHJpbnRrKCJYRlM6ICVzIG9wdGlvbiBuZWVkcyB0aGUgbW91bnQgcG9pbnQgb3B0aW9uIGFzIHdlbGxcbiIsCi0JCQlNTlRPUFRfRE1BUEkpOwotCQlyZXR1cm4gRUlOVkFMOwotCX0KLQotCWlmICgoZHN1bml0ICYmICFkc3dpZHRoKSB8fCAoIWRzdW5pdCAmJiBkc3dpZHRoKSkgewotCQljbW5fZXJyKENFX1dBUk4sCi0JCQkiWEZTOiBzdW5pdCBhbmQgc3dpZHRoIG11c3QgYmUgc3BlY2lmaWVkIHRvZ2V0aGVyIik7Ci0JCXJldHVybiBFSU5WQUw7Ci0JfQotCi0JaWYgKGRzdW5pdCAmJiAoZHN3aWR0aCAlIGRzdW5pdCAhPSAwKSkgewotCQljbW5fZXJyKENFX1dBUk4sCi0JIlhGUzogc3RyaXBlIHdpZHRoICglZCkgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBzdHJpcGUgdW5pdCAoJWQpIiwKLQkJCWRzd2lkdGgsIGRzdW5pdCk7Ci0JCXJldHVybiBFSU5WQUw7Ci0JfQotCi0JLyoKLQkgKiBBcHBsaWNhdGlvbnMgdXNpbmcgRE1JIGZpbGVzeXN0ZW1zIG9mdGVuIGV4cGVjdCB0aGUKLQkgKiBpbm9kZSBnZW5lcmF0aW9uIG51bWJlciB0byBiZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuCi0JICogSWYgd2UgZGVsZXRlIGlub2RlIGNodW5rcyB3ZSBicmVhayB0aGlzIGFzc3VtcHRpb24sIHNvCi0JICoga2VlcCB1bnVzZWQgaW5vZGUgY2h1bmtzIG9uIGRpc2sgZm9yIERNSSBmaWxlc3lzdGVtcwotCSAqIHVudGlsIHdlIGNvbWUgdXAgd2l0aCBhIGJldHRlciBzb2x1dGlvbi4KLQkgKiBOb3RlIHRoYXQgaWYgImlrZWVwIiBvciAibm9pa2VlcCIgbW91bnQgb3B0aW9ucyBhcmUKLQkgKiBzdXBwbGllZCwgdGhlbiB0aGV5IGFyZSBob25vcmVkLgotCSAqLwotCWlmICghKGFyZ3MtPmZsYWdzICYgWEZTTU5UX0RNQVBJKSAmJiAhaWtlZXApCi0JCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9JREVMRVRFOwotCi0JaWYgKChhcmdzLT5mbGFncyAmIFhGU01OVF9OT0FMSUdOKSAhPSBYRlNNTlRfTk9BTElHTikgewotCQlpZiAoZHN1bml0KSB7Ci0JCQlhcmdzLT5zdW5pdCA9IGRzdW5pdDsKLQkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9SRVRFUlI7Ci0JCX0gZWxzZSB7Ci0JCQlhcmdzLT5zdW5pdCA9IHZvbF9kc3VuaXQ7Ci0JCX0KLQkJZHN3aWR0aCA/IChhcmdzLT5zd2lkdGggPSBkc3dpZHRoKSA6Ci0JCQkgIChhcmdzLT5zd2lkdGggPSB2b2xfZHN3aWR0aCk7Ci0JfSBlbHNlIHsKLQkJYXJncy0+c3VuaXQgPSBhcmdzLT5zd2lkdGggPSAwOwotCX0KLQotZG9uZToKLQlpZiAoYXJncy0+ZmxhZ3MgJiBYRlNNTlRfMzJCSVRJTk9ERVMpCi0JCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9TTUFMTF9JTlVNUzsKLQlpZiAoYXJncy0+ZmxhZ3MyKQotCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfRkxBR1MyOwotCXJldHVybiAwOwotfQotCi1pbnQKLXhmc19zaG93YXJncygKLQlzdHJ1Y3QgeGZzX21vdW50CSptcCwKLQlzdHJ1Y3Qgc2VxX2ZpbGUJCSptKQotewotCXN0YXRpYyBzdHJ1Y3QgcHJvY194ZnNfaW5mbyB7Ci0JCWludAlmbGFnOwotCQljaGFyCSpzdHI7Ci0JfSB4ZnNfaW5mb1tdID0gewotCQkvKiB0aGUgZmV3IHNpbXBsZSBvbmVzIHdlIGNhbiBnZXQgZnJvbSB0aGUgbW91bnQgc3RydWN0ICovCi0JCXsgWEZTX01PVU5UX1dTWU5DLAkJIiwiIE1OVE9QVF9XU1lOQyB9LAotCQl7IFhGU19NT1VOVF9JTk82NCwJCSIsIiBNTlRPUFRfSU5PNjQgfSwKLQkJeyBYRlNfTU9VTlRfTk9BTElHTiwJCSIsIiBNTlRPUFRfTk9BTElHTiB9LAotCQl7IFhGU19NT1VOVF9TV0FMTE9DLAkJIiwiIE1OVE9QVF9TV0FMTE9DIH0sCi0JCXsgWEZTX01PVU5UX05PVVVJRCwJCSIsIiBNTlRPUFRfTk9VVUlEIH0sCi0JCXsgWEZTX01PVU5UX05PUkVDT1ZFUlksCQkiLCIgTU5UT1BUX05PUkVDT1ZFUlkgfSwKLQkJeyBYRlNfTU9VTlRfT1NZTkNJU09TWU5DLAkiLCIgTU5UT1BUX09TWU5DSVNPU1lOQyB9LAotCQl7IDAsIE5VTEwgfQotCX07Ci0Jc3RydWN0IHByb2NfeGZzX2luZm8JKnhmc19pbmZvcDsKLQotCWZvciAoeGZzX2luZm9wID0geGZzX2luZm87IHhmc19pbmZvcC0+ZmxhZzsgeGZzX2luZm9wKyspIHsKLQkJaWYgKG1wLT5tX2ZsYWdzICYgeGZzX2luZm9wLT5mbGFnKQotCQkJc2VxX3B1dHMobSwgeGZzX2luZm9wLT5zdHIpOwotCX0KLQotCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9ERkxUX0lPU0laRSkKLQkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX0FMTE9DU0laRSAiPSVkayIsCi0JCQkJKGludCkoMSA8PCBtcC0+bV93cml0ZWlvX2xvZykgPj4gMTApOwotCi0JaWYgKG1wLT5tX2xvZ2J1ZnMgPiAwKQotCQlzZXFfcHJpbnRmKG0sICIsIiBNTlRPUFRfTE9HQlVGUyAiPSVkIiwgbXAtPm1fbG9nYnVmcyk7Ci0JaWYgKG1wLT5tX2xvZ2JzaXplID4gMCkKLQkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX0xPR0JTSVpFICI9JWRrIiwgbXAtPm1fbG9nYnNpemUgPj4gMTApOwotCi0JaWYgKG1wLT5tX2xvZ25hbWUpCi0JCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF9MT0dERVYgIj0lcyIsIG1wLT5tX2xvZ25hbWUpOwotCWlmIChtcC0+bV9ydG5hbWUpCi0JCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF9SVERFViAiPSVzIiwgbXAtPm1fcnRuYW1lKTsKLQotCWlmIChtcC0+bV9kYWxpZ24gPiAwKQotCQlzZXFfcHJpbnRmKG0sICIsIiBNTlRPUFRfU1VOSVQgIj0lZCIsCi0JCQkJKGludClYRlNfRlNCX1RPX0JCKG1wLCBtcC0+bV9kYWxpZ24pKTsKLQlpZiAobXAtPm1fc3dpZHRoID4gMCkKLQkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX1NXSURUSCAiPSVkIiwKLQkJCQkoaW50KVhGU19GU0JfVE9fQkIobXAsIG1wLT5tX3N3aWR0aCkpOwotCi0JaWYgKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfSURFTEVURSkpCi0JCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF9JS0VFUCk7Ci0JaWYgKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfQ09NUEFUX0lPU0laRSkpCi0JCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF9MQVJHRUlPKTsKLQotCWlmICghKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1NNQUxMX0lOVU1TKSkKLQkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUXzY0QklUSU5PREUpOwotCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9HUlBJRCkKLQkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX0dSUElEKTsKLQotCWlmIChtcC0+bV9xZmxhZ3MgJiBYRlNfVVFVT1RBX0FDQ1QpIHsKLQkJaWYgKG1wLT5tX3FmbGFncyAmIFhGU19VUVVPVEFfRU5GRCkKLQkJCXNlcV9wdXRzKG0sICIsIiBNTlRPUFRfVVNSUVVPVEEpOwotCQllbHNlCi0JCQlzZXFfcHV0cyhtLCAiLCIgTU5UT1BUX1VRVU9UQU5PRU5GKTsKLQl9Ci0KLQlpZiAobXAtPm1fcWZsYWdzICYgWEZTX1BRVU9UQV9BQ0NUKSB7Ci0JCWlmIChtcC0+bV9xZmxhZ3MgJiBYRlNfT1FVT1RBX0VORkQpCi0JCQlzZXFfcHV0cyhtLCAiLCIgTU5UT1BUX1BSSlFVT1RBKTsKLQkJZWxzZQotCQkJc2VxX3B1dHMobSwgIiwiIE1OVE9QVF9QUVVPVEFOT0VORik7Ci0JfQotCi0JaWYgKG1wLT5tX3FmbGFncyAmIFhGU19HUVVPVEFfQUNDVCkgewotCQlpZiAobXAtPm1fcWZsYWdzICYgWEZTX09RVU9UQV9FTkZEKQotCQkJc2VxX3B1dHMobSwgIiwiIE1OVE9QVF9HUlBRVU9UQSk7Ci0JCWVsc2UKLQkJCXNlcV9wdXRzKG0sICIsIiBNTlRPUFRfR1FVT1RBTk9FTkYpOwotCX0KLQotCWlmICghKG1wLT5tX3FmbGFncyAmIFhGU19BTExfUVVPVEFfQUNDVCkpCi0JCXNlcV9wdXRzKG0sICIsIiBNTlRPUFRfTk9RVU9UQSk7Ci0KLQlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfRE1BUEkpCi0JCXNlcV9wdXRzKG0sICIsIiBNTlRPUFRfRE1BUEkpOwotCXJldHVybiAwOwotfQotCi0vKgotICogU2Vjb25kIHN0YWdlIG9mIGEgZnJlZXplLiBUaGUgZGF0YSBpcyBhbHJlYWR5IGZyb3plbiBzbyB3ZSBvbmx5Ci0gKiBuZWVkIHRvIHRha2UgY2FyZSBvZiB0aGVtZXRhZGF0YS4gT25jZSB0aGF0J3MgZG9uZSB3cml0ZSBhIGR1bW15Ci0gKiByZWNvcmQgdG8gZGlydHkgdGhlIGxvZyBpbiBjYXNlIG9mIGEgY3Jhc2ggd2hpbGUgZnJvemVuLgotICovCi12b2lkCi14ZnNfZnJlZXplKAotCXhmc19tb3VudF90CSptcCkKLXsKLQl4ZnNfYXR0cl9xdWllc2NlKG1wKTsKLQl4ZnNfZnNfbG9nX2R1bW15KG1wKTsKLX0KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdmZzb3BzLmggYi9mcy94ZnMveGZzX3Zmc29wcy5oCmluZGV4IGE1OTJmZTAuLjE2ODg4MTcgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdmZzb3BzLmgKKysrIGIvZnMveGZzL3hmc192ZnNvcHMuaApAQCAtMTMsMTYgKzEzLDkgQEAKIGludCB4ZnNfdW5tb3VudChzdHJ1Y3QgeGZzX21vdW50ICptcCwgaW50IGZsYWdzLCBzdHJ1Y3QgY3JlZCAqY3JlZHApOwogaW50IHhmc19tbnR1cGRhdGUoc3RydWN0IHhmc19tb3VudCAqbXAsIGludCAqZmxhZ3MsCiAJCXN0cnVjdCB4ZnNfbW91bnRfYXJncyAqYXJncyk7Ci1pbnQgeGZzX3Jvb3Qoc3RydWN0IHhmc19tb3VudCAqbXAsIGJodl92bm9kZV90ICoqdnBwKTsKLWludCB4ZnNfc3RhdHZmcyhzdHJ1Y3QgeGZzX21vdW50ICptcCwgc3RydWN0IGtzdGF0ZnMgKnN0YXRwLAotCQliaHZfdm5vZGVfdCAqdnApOwogaW50IHhmc19zeW5jKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBpbnQgZmxhZ3MpOwotaW50IHhmc192Z2V0KHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBiaHZfdm5vZGVfdCAqKnZwcCwgc3RydWN0IHhmc19maWQgKnhmaWQpOwotaW50IHhmc19wYXJzZWFyZ3Moc3RydWN0IHhmc19tb3VudCAqbXAsIGNoYXIgKm9wdGlvbnMsCi0JCXN0cnVjdCB4ZnNfbW91bnRfYXJncyAqYXJncywgaW50IHVwZGF0ZSk7Ci1pbnQgeGZzX3Nob3dhcmdzKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBzdHJ1Y3Qgc2VxX2ZpbGUgKm0pOwotdm9pZCB4ZnNfZnJlZXplKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKIHZvaWQgeGZzX2RvX2ZvcmNlX3NodXRkb3duKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBpbnQgZmxhZ3MsIGNoYXIgKmZuYW1lLAogCQlpbnQgbG5udW0pOwordm9pZCB4ZnNfYXR0cl9xdWllc2NlKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKIAogI2VuZGlmIC8qIF9YRlNfVkZTT1BTX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYyBiL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYwppbmRleCBlZmQ1YWZmLi41MTMwNTI0IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3Zub2Rlb3BzLmMKKysrIGIvZnMveGZzL3hmc192bm9kZW9wcy5jCkBAIC04OCw3ICs4OCw3IEBACiAJYmh2X3Zub2RlX3QJKnZwID0gWEZTX0lUT1YoaXApOwogCXhmc19tb3VudF90CSptcCA9IGlwLT5pX21vdW50OwogCi0Jdm5fdHJhY2VfZW50cnkoaXAsIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCXhmc19pdHJhY2VfZW50cnkoaXApOwogCiAJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQogCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CkBAIC0xMzYsNyArMTM2LDcgQEAKIAlkZWZhdWx0OgogCQl2YXAtPnZhX3JkZXYgPSAwOwogCi0JCWlmICghKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKSkgeworCQlpZiAoIShYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApKSkgewogCQkJdmFwLT52YV9ibG9ja3NpemUgPSB4ZnNfcHJlZmVycmVkX2lvc2l6ZShtcCk7CiAJCX0gZWxzZSB7CiAKQEAgLTIyOCw3ICsyMjgsNyBAQAogCWludAkJCWZpbGVfb3duZXI7CiAJaW50CQkJbmVlZF9pb2xvY2sgPSAxOwogCi0Jdm5fdHJhY2VfZW50cnkoaXAsIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCXhmc19pdHJhY2VfZW50cnkoaXApOwogCiAJaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1JET05MWSkKIAkJcmV0dXJuIFhGU19FUlJPUihFUk9GUyk7CkBAIC01MDgsNyArNTA4LDcgQEAKIAkJICovCiAJCWlmICgoaXAtPmlfZC5kaV9uZXh0ZW50cyB8fCBpcC0+aV9kZWxheWVkX2Jsa3MpICYmCiAJCSAgICAobWFzayAmIFhGU19BVF9YRkxBR1MpICYmCi0JCSAgICAoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpICE9CisJCSAgICAoWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKSkgIT0KIAkJICAgICh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19SRUFMVElNRSkpIHsKIAkJCWNvZGUgPSBYRlNfRVJST1IoRUlOVkFMKTsJLyogRUZCSUc/ICovCiAJCQlnb3RvIGVycm9yX3JldHVybjsKQEAgLTUyMCw3ICs1MjAsNyBAQAogCQlpZiAoKG1hc2sgJiBYRlNfQVRfRVhUU0laRSkgJiYgdmFwLT52YV9leHRzaXplICE9IDApIHsKIAkJCXhmc19leHRsZW5fdAlzaXplOwogCi0JCQlpZiAoKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKSB8fAorCQkJaWYgKFhGU19JU19SRUFMVElNRV9JTk9ERShpcCkgfHwKIAkJCSAgICAoKG1hc2sgJiBYRlNfQVRfWEZMQUdTKSAmJgogCQkJICAgICh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19SRUFMVElNRSkpKSB7CiAJCQkJc2l6ZSA9IG1wLT5tX3NiLnNiX3JleHRzaXplIDw8CkBAIC04MDQsMTIgKzgwNCw4IEBACiAJCQkJaWYgKHZhcC0+dmFfeGZsYWdzICYgWEZTX1hGTEFHX0VYVFNaSU5IRVJJVCkKIAkJCQkJZGlfZmxhZ3MgfD0gWEZTX0RJRkxBR19FWFRTWklOSEVSSVQ7CiAJCQl9IGVsc2UgaWYgKChpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZSRUcpIHsKLQkJCQlpZiAodmFwLT52YV94ZmxhZ3MgJiBYRlNfWEZMQUdfUkVBTFRJTUUpIHsKKwkJCQlpZiAodmFwLT52YV94ZmxhZ3MgJiBYRlNfWEZMQUdfUkVBTFRJTUUpCiAJCQkJCWRpX2ZsYWdzIHw9IFhGU19ESUZMQUdfUkVBTFRJTUU7Ci0JCQkJCWlwLT5pX2lvY29yZS5pb19mbGFncyB8PSBYRlNfSU9DT1JFX1JUOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlwLT5pX2lvY29yZS5pb19mbGFncyAmPSB+WEZTX0lPQ09SRV9SVDsKLQkJCQl9CiAJCQkJaWYgKHZhcC0+dmFfeGZsYWdzICYgWEZTX1hGTEFHX0VYVFNJWkUpCiAJCQkJCWRpX2ZsYWdzIHw9IFhGU19ESUZMQUdfRVhUU0laRTsKIAkJCX0KQEAgLTkwMiwyOCArODk4LDYgQEAKIAlyZXR1cm4gY29kZTsKIH0KIAotCi0vKgotICogeGZzX2FjY2VzcwotICogTnVsbCBjb252ZXJzaW9uIGZyb20gdm5vZGUgbW9kZSBiaXRzIHRvIGlub2RlIG1vZGUgYml0cywgYXMgaW4gZWZzLgotICovCi1pbnQKLXhmc19hY2Nlc3MoCi0JeGZzX2lub2RlX3QJKmlwLAotCWludAkJbW9kZSwKLQljcmVkX3QJCSpjcmVkcCkKLXsKLQlpbnQJCWVycm9yOwotCi0Jdm5fdHJhY2VfZW50cnkoaXAsIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOwotCi0JeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKLQllcnJvciA9IHhmc19pYWNjZXNzKGlwLCBtb2RlLCBjcmVkcCk7Ci0JeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwotCXJldHVybiBlcnJvcjsKLX0KLQotCiAvKgogICogVGhlIG1heGltdW0gcGF0aGxlbiBpcyAxMDI0IGJ5dGVzLiBTaW5jZSB0aGUgbWluaW11bSBmaWxlIHN5c3RlbQogICogYmxvY2tzaXplIGlzIDUxMiBieXRlcywgd2UgY2FuIGdldCBhIG1heCBvZiAyIGV4dGVudHMgYmFjayBmcm9tCkBAIC05ODcsNyArOTYxLDcgQEAKIAlpbnQJCXBhdGhsZW47CiAJaW50CQllcnJvciA9IDA7CiAKLQl2bl90cmFjZV9lbnRyeShpcCwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisJeGZzX2l0cmFjZV9lbnRyeShpcCk7CiAKIAlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCiAJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKQEAgLTEwMzMsNyArMTAwNyw3IEBACiAJaW50CQllcnJvcjsKIAlpbnQJCWxvZ19mbHVzaGVkID0gMCwgY2hhbmdlZCA9IDE7CiAKLQl2bl90cmFjZV9lbnRyeShpcCwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisJeGZzX2l0cmFjZV9lbnRyeShpcCk7CiAKIAlBU1NFUlQoc3RhcnQgPj0gMCAmJiBzdG9wID49IC0xKTsKIApAQCAtMTE0OSw3ICsxMTIzLDcgQEAKIAkJICogSWYgdGhpcyBpbm9kZSBpcyBvbiB0aGUgUlQgZGV2IHdlIG5lZWQgdG8gZmx1c2ggdGhhdAogCQkgKiBjYWNoZSBhcyB3ZWxsLgogCQkgKi8KLQkJaWYgKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKQorCQlpZiAoWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKSkKIAkJCXhmc19ibGtkZXZfaXNzdWVfZmx1c2goaXAtPmlfbW91bnQtPm1fcnRkZXZfdGFyZ3ApOwogCX0KIApAQCAtMTE4OCw3ICsxMTYyLDcgQEAKIAogCW5pbWFwcyA9IDE7CiAJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKLQllcnJvciA9IFhGU19CTUFQSShtcCwgTlVMTCwgJmlwLT5pX2lvY29yZSwgZW5kX2ZzYiwgbWFwX2xlbiwgMCwKKwllcnJvciA9IHhmc19ibWFwaShOVUxMLCBpcCwgZW5kX2ZzYiwgbWFwX2xlbiwgMCwKIAkJCSAgTlVMTCwgMCwgJmltYXAsICZuaW1hcHMsIE5VTEwsIE5VTEwpOwogCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKIApAQCAtMTU2Miw5ICsxNTM2LDYgQEAKIAkJCWVycm9yID0geGZzX2ZyZWVfZW9mYmxvY2tzKG1wLCBpcCwgWEZTX0ZSRUVfRU9GX0xPQ0spOwogCQkJaWYgKGVycm9yKQogCQkJCXJldHVybiBlcnJvcjsKLQkJCS8qIFVwZGF0ZSBsaW51eCBpbm9kZSBibG9jayBjb3VudCBhZnRlciBmcmVlIGFib3ZlICovCi0JCQl2bl90b19pbm9kZSh2cCktPmlfYmxvY2tzID0gWEZTX0ZTQl9UT19CQihtcCwKLQkJCQlpcC0+aV9kLmRpX25ibG9ja3MgKyBpcC0+aV9kZWxheWVkX2Jsa3MpOwogCQl9CiAJfQogCkBAIC0xNTkyLDcgKzE1NjMsNyBAQAogCWludAkJZXJyb3I7CiAJaW50CQl0cnVuY2F0ZTsKIAotCXZuX3RyYWNlX2VudHJ5KGlwLCBfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKwl4ZnNfaXRyYWNlX2VudHJ5KGlwKTsKIAogCS8qCiAJICogSWYgdGhlIGlub2RlIGlzIGFscmVhZHkgZnJlZSwgdGhlbiB0aGVyZSBjYW4gYmUgbm90aGluZwpAQCAtMTYzOCw5ICsxNjA5LDYgQEAKIAkJCWVycm9yID0geGZzX2ZyZWVfZW9mYmxvY2tzKG1wLCBpcCwgWEZTX0ZSRUVfRU9GX0xPQ0spOwogCQkJaWYgKGVycm9yKQogCQkJCXJldHVybiBWTl9JTkFDVElWRV9DQUNIRTsKLQkJCS8qIFVwZGF0ZSBsaW51eCBpbm9kZSBibG9jayBjb3VudCBhZnRlciBmcmVlIGFib3ZlICovCi0JCQl2bl90b19pbm9kZSh2cCktPmlfYmxvY2tzID0gWEZTX0ZTQl9UT19CQihtcCwKLQkJCQlpcC0+aV9kLmRpX25ibG9ja3MgKyBpcC0+aV9kZWxheWVkX2Jsa3MpOwogCQl9CiAJCWdvdG8gb3V0OwogCX0KQEAgLTE4MDUsNyArMTc3Myw3IEBACiAJaW50CQkJZXJyb3I7CiAJdWludAkJCWxvY2tfbW9kZTsKIAotCXZuX3RyYWNlX2VudHJ5KGRwLCBfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKwl4ZnNfaXRyYWNlX2VudHJ5KGRwKTsKIAogCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKGRwLT5pX21vdW50KSkKIAkJcmV0dXJuIFhGU19FUlJPUihFSU8pOwpAQCAtMTgxNCw3ICsxNzgyLDcgQEAKIAllcnJvciA9IHhmc19kaXJfbG9va3VwX2ludChkcCwgbG9ja19tb2RlLCBkZW50cnksICZlX2ludW0sICZpcCk7CiAJaWYgKCFlcnJvcikgewogCQkqdnBwID0gWEZTX0lUT1YoaXApOwotCQlJVFJBQ0UoaXApOworCQl4ZnNfaXRyYWNlX3JlZihpcCk7CiAJfQogCXhmc19pdW5sb2NrX21hcF9zaGFyZWQoZHAsIGxvY2tfbW9kZSk7CiAJcmV0dXJuIGVycm9yOwpAQCAtMTg0OCw3ICsxODE2LDcgQEAKIAlpbnQJCQluYW1lbGVuOwogCiAJQVNTRVJUKCEqdnBwKTsKLQl2bl90cmFjZV9lbnRyeShkcCwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisJeGZzX2l0cmFjZV9lbnRyeShkcCk7CiAKIAluYW1lbGVuID0gVk5BTUVMRU4oZGVudHJ5KTsKIApAQCAtMTkzMCw3ICsxODk4LDcgQEAKIAkJCWdvdG8gZXJyb3JfcmV0dXJuOwogCQlnb3RvIGFib3J0X3JldHVybjsKIAl9Ci0JSVRSQUNFKGlwKTsKKwl4ZnNfaXRyYWNlX3JlZihpcCk7CiAKIAkvKgogCSAqIEF0IHRoaXMgcG9pbnQsIHdlJ3ZlIGdvdHRlbiBhIG5ld2x5IGFsbG9jYXRlZCBpbm9kZS4KQEAgLTIwOTgsNyArMjA2Niw3IEBACiAKIAllX2ludW0gPSBpcC0+aV9pbm87CiAKLQlJVFJBQ0UoaXApOworCXhmc19pdHJhY2VfcmVmKGlwKTsKIAogCS8qCiAJICogV2Ugd2FudCB0byBsb2NrIGluIGluY3JlYXNpbmcgaW51bS4gU2luY2Ugd2UndmUgYWxyZWFkeQpAQCAtMjMyMSw3ICsyMjg5LDcgQEAKIAl1aW50CQkJcmVzYmxrczsKIAlpbnQJCQluYW1lbGVuOwogCi0Jdm5fdHJhY2VfZW50cnkoZHAsIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCXhmc19pdHJhY2VfZW50cnkoZHApOwogCiAJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQogCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CkBAIC0yMzY0LDkgKzIzMzIsOCBAQAogCiAJZG1fZGlfbW9kZSA9IGlwLT5pX2QuZGlfbW9kZTsKIAotCXZuX3RyYWNlX2VudHJ5KGlwLCBfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKLQotCUlUUkFDRShpcCk7CisJeGZzX2l0cmFjZV9lbnRyeShpcCk7CisJeGZzX2l0cmFjZV9yZWYoaXApOwogCiAJZXJyb3IgPSBYRlNfUU1fRFFBVFRBQ0gobXAsIGRwLCAwKTsKIAlpZiAoIWVycm9yICYmIGRwICE9IGlwKQpAQCAtMjQ5OCw4ICsyNDY1LDcgQEAKIAlpZiAobGlua196ZXJvICYmIHhmc19pbm9kZV9pc19maWxlc3RyZWFtKGlwKSkKIAkJeGZzX2ZpbGVzdHJlYW1fZGVhc3NvY2lhdGUoaXApOwogCi0Jdm5fdHJhY2VfZXhpdChpcCwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7Ci0KKwl4ZnNfaXRyYWNlX2V4aXQoaXApOwogCUlSRUxFKGlwKTsKIAogLyoJRmFsbCB0aHJvdWdoIHRvIHN0ZF9yZXR1cm4gd2l0aCBlcnJvciA9IDAgKi8KQEAgLTI1NjIsOCArMjUyOCw4IEBACiAJY2hhcgkJCSp0YXJnZXRfbmFtZSA9IFZOQU1FKGRlbnRyeSk7CiAJaW50CQkJdGFyZ2V0X25hbWVsZW47CiAKLQl2bl90cmFjZV9lbnRyeSh0ZHAsIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOwotCXZuX3RyYWNlX2VudHJ5KHhmc192dG9pKHNyY192cCksIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCXhmc19pdHJhY2VfZW50cnkodGRwKTsKKwl4ZnNfaXRyYWNlX2VudHJ5KHhmc192dG9pKHNyY192cCkpOwogCiAJdGFyZ2V0X25hbWVsZW4gPSBWTkFNRUxFTihkZW50cnkpOwogCUFTU0VSVCghVk5fSVNESVIoc3JjX3ZwKSk7CkBAIC0yNzQ0LDcgKzI3MTAsNyBAQAogCiAJLyogUmV0dXJuIHRocm91Z2ggc3RkX3JldHVybiBhZnRlciB0aGlzIHBvaW50LiAqLwogCi0Jdm5fdHJhY2VfZW50cnkoZHAsIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCXhmc19pdHJhY2VfZW50cnkoZHApOwogCiAJbXAgPSBkcC0+aV9tb3VudDsKIAl1ZHFwID0gZ2RxcCA9IE5VTEw7CkBAIC0yODEwLDcgKzI3NzYsNyBAQAogCQkJZ290byBlcnJvcl9yZXR1cm47CiAJCWdvdG8gYWJvcnRfcmV0dXJuOwogCX0KLQlJVFJBQ0UoY2RwKTsKKwl4ZnNfaXRyYWNlX3JlZihjZHApOwogCiAJLyoKIAkgKiBOb3cgd2UgYWRkIHRoZSBkaXJlY3RvcnkgaW5vZGUgdG8gdGhlIHRyYW5zYWN0aW9uLgpAQCAtMjkzNiw3ICsyOTAyLDcgQEAKIAlpbnQJCQlsYXN0X2NkcF9saW5rOwogCXVpbnQJCQlyZXNibGtzOwogCi0Jdm5fdHJhY2VfZW50cnkoZHAsIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCXhmc19pdHJhY2VfZW50cnkoZHApOwogCiAJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQogCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CkBAIC0zMDQxLDcgKzMwMDcsNyBAQAogCQlWTl9IT0xEKGRpcl92cCk7CiAJfQogCi0JSVRSQUNFKGNkcCk7CisJeGZzX2l0cmFjZV9yZWYoY2RwKTsKIAl4ZnNfdHJhbnNfaWpvaW4odHAsIGNkcCwgWEZTX0lMT0NLX0VYQ0wpOwogCiAJQVNTRVJUKGNkcC0+aV9kLmRpX25saW5rID49IDIpOwpAQCAtMzE4OSw4ICszMTU1LDcgQEAKIAlpcCA9IE5VTEw7CiAJdHAgPSBOVUxMOwogCi0Jdm5fdHJhY2VfZW50cnkoZHAsIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOwotCisJeGZzX2l0cmFjZV9lbnRyeShkcCk7CiAKIAlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCiAJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKQEAgLTMzMTcsNyArMzI4Miw3IEBACiAJCQlnb3RvIGVycm9yX3JldHVybjsKIAkJZ290byBlcnJvcjE7CiAJfQotCUlUUkFDRShpcCk7CisJeGZzX2l0cmFjZV9yZWYoaXApOwogCiAJLyoKIAkgKiBBbiBlcnJvciBhZnRlciB3ZSd2ZSBqb2luZWQgZHAgdG8gdGhlIHRyYW5zYWN0aW9uIHdpbGwgcmVzdWx0IGluIHRoZQpAQCAtMzQ2NSwyNyArMzQzMCw2IEBACiAJZ290byBzdGRfcmV0dXJuOwogfQogCi0KLWludAoteGZzX2ZpZDIoCi0JeGZzX2lub2RlX3QJKmlwLAotCXhmc19maWRfdAkqeGZpZCkKLXsKLQl2bl90cmFjZV9lbnRyeShpcCwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7Ci0KLQl4ZmlkLT5maWRfbGVuID0gc2l6ZW9mKHhmc19maWRfdCkgLSBzaXplb2YoeGZpZC0+ZmlkX2xlbik7Ci0JeGZpZC0+ZmlkX3BhZCA9IDA7Ci0JLyoKLQkgKiB1c2UgbWVtY3B5IGJlY2F1c2UgdGhlIGlub2RlIGlzIGEgbG9uZyBsb25nIGFuZCB0aGVyZSdzIG5vCi0JICogYXNzdXJhbmNlIHRoYXQgeGZpZC0+ZmlkX2lubyBpcyBwcm9wZXJseSBhbGlnbmVkLgotCSAqLwotCW1lbWNweSgmeGZpZC0+ZmlkX2lubywgJmlwLT5pX2lubywgc2l6ZW9mKHhmaWQtPmZpZF9pbm8pKTsKLQl4ZmlkLT5maWRfZ2VuID0gaXAtPmlfZC5kaV9nZW47Ci0KLQlyZXR1cm4gMDsKLX0KLQotCiBpbnQKIHhmc19yd2xvY2soCiAJeGZzX2lub2RlX3QJKmlwLApAQCAtMzU1OCwxMSArMzUwMiwxMSBAQAogCQlpZiAoaWlwICYmIGlpcC0+aWxpX2xhc3RfbHNuKSB7CiAJCQl4bG9nX3QJCSpsb2cgPSBtcC0+bV9sb2c7CiAJCQl4ZnNfbHNuX3QJc3luY19sc247Ci0JCQlpbnQJCXMsIGxvZ19mbGFncyA9IFhGU19MT0dfRk9SQ0U7CisJCQlpbnQJCWxvZ19mbGFncyA9IFhGU19MT0dfRk9SQ0U7CiAKLQkJCXMgPSBHUkFOVF9MT0NLKGxvZyk7CisJCQlzcGluX2xvY2soJmxvZy0+bF9ncmFudF9sb2NrKTsKIAkJCXN5bmNfbHNuID0gbG9nLT5sX2xhc3Rfc3luY19sc247Ci0JCQlHUkFOVF9VTkxPQ0sobG9nLCBzKTsKKwkJCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfbG9jayk7CiAKIAkJCWlmICgoWEZTX0xTTl9DTVAoaWlwLT5pbGlfbGFzdF9sc24sIHN5bmNfbHNuKSA+IDApKSB7CiAJCQkJaWYgKGZsYWdzICYgRkxVU0hfU1lOQykKQEAgLTM2MzcsOCArMzU4MSw4IEBACiAJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CiAJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOwogCi0JaXAtPmlfaW9jb3JlLmlvX2RtZXZtYXNrID0gaXAtPmlfZC5kaV9kbWV2bWFzayA9IGV2bWFzazsKLQlpcC0+aV9pb2NvcmUuaW9fZG1zdGF0ZSAgPSBpcC0+aV9kLmRpX2Rtc3RhdGUgID0gc3RhdGU7CisJaXAtPmlfZC5kaV9kbWV2bWFzayA9IGV2bWFzazsKKwlpcC0+aV9kLmRpX2Rtc3RhdGUgID0gc3RhdGU7CiAKIAl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CiAJSUhPTEQoaXApOwpAQCAtMzY1Myw3ICszNTk3LDcgQEAKIHsKIAliaHZfdm5vZGVfdAkqdnAgPSBYRlNfSVRPVihpcCk7CiAKLQl2bl90cmFjZV9lbnRyeShpcCwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisJeGZzX2l0cmFjZV9lbnRyeShpcCk7CiAKIAlBU1NFUlQoIVZOX01BUFBFRCh2cCkpOwogCkBAIC0zODcxLDcgKzM4MTUsNyBAQAogCWludAkJCWNvbW1pdHRlZDsKIAlpbnQJCQllcnJvcjsKIAotCXZuX3RyYWNlX2VudHJ5KGlwLCBfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKwl4ZnNfaXRyYWNlX2VudHJ5KGlwKTsKIAogCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKIAkJcmV0dXJuIFhGU19FUlJPUihFSU8pOwpAQCAtMzk3Niw3ICszOTIwLDcgQEAKIAkJICogSXNzdWUgdGhlIHhmc19ibWFwaSgpIGNhbGwgdG8gYWxsb2NhdGUgdGhlIGJsb2NrcwogCQkgKi8KIAkJWEZTX0JNQVBfSU5JVCgmZnJlZV9saXN0LCAmZmlyc3Rmc2IpOwotCQllcnJvciA9IFhGU19CTUFQSShtcCwgdHAsICZpcC0+aV9pb2NvcmUsIHN0YXJ0b2Zmc2V0X2ZzYiwKKwkJZXJyb3IgPSB4ZnNfYm1hcGkodHAsIGlwLCBzdGFydG9mZnNldF9mc2IsCiAJCQkJICBhbGxvY2F0ZXNpemVfZnNiLCBibWFwaV9mbGFnLAogCQkJCSAgJmZpcnN0ZnNiLCAwLCBpbWFwcCwgJm5pbWFwcywKIAkJCQkgICZmcmVlX2xpc3QsIE5VTEwpOwpAQCAtNDA1MiwxMyArMzk5NiwxMyBAQAogCWludAkJCWVycm9yID0gMDsKIAogCWJwID0geGZzX2J1Zl9nZXRfbm9hZGRyKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwKLQkJCQlpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSA/CisJCQkJWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKSA/CiAJCQkJbXAtPm1fcnRkZXZfdGFyZ3AgOiBtcC0+bV9kZGV2X3RhcmdwKTsKIAogCWZvciAob2Zmc2V0ID0gc3RhcnRvZmY7IG9mZnNldCA8PSBlbmRvZmY7IG9mZnNldCA9IGxhc3RvZmZzZXQgKyAxKSB7CiAJCW9mZnNldF9mc2IgPSBYRlNfQl9UT19GU0JUKG1wLCBvZmZzZXQpOwogCQluaW1hcCA9IDE7Ci0JCWVycm9yID0gWEZTX0JNQVBJKG1wLCBOVUxMLCAmaXAtPmlfaW9jb3JlLCBvZmZzZXRfZnNiLCAxLCAwLAorCQllcnJvciA9IHhmc19ibWFwaShOVUxMLCBpcCwgb2Zmc2V0X2ZzYiwgMSwgMCwKIAkJCU5VTEwsIDAsICZpbWFwLCAmbmltYXAsIE5VTEwsIE5VTEwpOwogCQlpZiAoZXJyb3IgfHwgbmltYXAgPCAxKQogCQkJYnJlYWs7CkBAIC00MTQxLDcgKzQwODUsNyBAQAogCXZwID0gWEZTX0lUT1YoaXApOwogCW1wID0gaXAtPmlfbW91bnQ7CiAKLQl2bl90cmFjZV9lbnRyeShpcCwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisJeGZzX2l0cmFjZV9lbnRyeShpcCk7CiAKIAlpZiAoKGVycm9yID0gWEZTX1FNX0RRQVRUQUNIKG1wLCBpcCwgMCkpKQogCQlyZXR1cm4gZXJyb3I7CkBAIC00MTQ5LDcgKzQwOTMsNyBAQAogCWVycm9yID0gMDsKIAlpZiAobGVuIDw9IDApCS8qIGlmIG5vdGhpbmcgYmVpbmcgZnJlZWQgKi8KIAkJcmV0dXJuIGVycm9yOwotCXJ0ID0gKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKTsKKwlydCA9IFhGU19JU19SRUFMVElNRV9JTk9ERShpcCk7CiAJc3RhcnRvZmZzZXRfZnNiCT0gWEZTX0JfVE9fRlNCKG1wLCBvZmZzZXQpOwogCWVuZF9kbWlfb2Zmc2V0ID0gb2Zmc2V0ICsgbGVuOwogCWVuZG9mZnNldF9mc2IgPSBYRlNfQl9UT19GU0JUKG1wLCBlbmRfZG1pX29mZnNldCk7CkBAIC00MTcyLDE1ICs0MTE2LDEyIEBACiAJCXZuX2lvd2FpdChpcCk7CS8qIHdhaXQgZm9yIHRoZSBjb21wbGV0aW9uIG9mIGFueSBwZW5kaW5nIERJT3MgKi8KIAl9CiAKLQlyb3VuZGluZyA9IG1heF90KHVpbnQsIDEgPDwgbXAtPm1fc2Iuc2JfYmxvY2tsb2csIE5CUFApOworCXJvdW5kaW5nID0gbWF4X3QodWludCwgMSA8PCBtcC0+bV9zYi5zYl9ibG9ja2xvZywgUEFHRV9DQUNIRV9TSVpFKTsKIAlpb2Zmc2V0ID0gb2Zmc2V0ICYgfihyb3VuZGluZyAtIDEpOwogCiAJaWYgKFZOX0NBQ0hFRCh2cCkgIT0gMCkgewotCQl4ZnNfaW52YWxfY2FjaGVkX3RyYWNlKCZpcC0+aV9pb2NvcmUsIGlvZmZzZXQsIC0xLAotCQkJCWN0b29mZihvZmZ0b2N0KGlvZmZzZXQpKSwgLTEpOwotCQllcnJvciA9IHhmc19mbHVzaGludmFsX3BhZ2VzKGlwLAotCQkJCWN0b29mZihvZmZ0b2N0KGlvZmZzZXQpKSwKLQkJCQktMSwgRklfUkVNQVBGX0xPQ0tFRCk7CisJCXhmc19pbnZhbF9jYWNoZWRfdHJhY2UoaXAsIGlvZmZzZXQsIC0xLCBpb2Zmc2V0LCAtMSk7CisJCWVycm9yID0geGZzX2ZsdXNoaW52YWxfcGFnZXMoaXAsIGlvZmZzZXQsIC0xLCBGSV9SRU1BUEZfTE9DS0VEKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXRfdW5sb2NrX2lvbG9jazsKIAl9CkBAIC00MTkzLDcgKzQxMzQsNyBAQAogCSAqLwogCWlmIChydCAmJiAhWEZTX1NCX1ZFUlNJT05fSEFTRVhURkxHQklUKCZtcC0+bV9zYikpIHsKIAkJbmltYXAgPSAxOwotCQllcnJvciA9IFhGU19CTUFQSShtcCwgTlVMTCwgJmlwLT5pX2lvY29yZSwgc3RhcnRvZmZzZXRfZnNiLAorCQllcnJvciA9IHhmc19ibWFwaShOVUxMLCBpcCwgc3RhcnRvZmZzZXRfZnNiLAogCQkJMSwgMCwgTlVMTCwgMCwgJmltYXAsICZuaW1hcCwgTlVMTCwgTlVMTCk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X3VubG9ja19pb2xvY2s7CkBAIC00MjA4LDcgKzQxNDksNyBAQAogCQkJCXN0YXJ0b2Zmc2V0X2ZzYiArPSBtcC0+bV9zYi5zYl9yZXh0c2l6ZSAtIG1vZDsKIAkJfQogCQluaW1hcCA9IDE7Ci0JCWVycm9yID0gWEZTX0JNQVBJKG1wLCBOVUxMLCAmaXAtPmlfaW9jb3JlLCBlbmRvZmZzZXRfZnNiIC0gMSwKKwkJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIGVuZG9mZnNldF9mc2IgLSAxLAogCQkJMSwgMCwgTlVMTCwgMCwgJmltYXAsICZuaW1hcCwgTlVMTCwgTlVMTCk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X3VubG9ja19pb2xvY2s7CkBAIC00Mjg0LDcgKzQyMjUsNyBAQAogCQkgKiBpc3N1ZSB0aGUgYnVubWFwaSgpIGNhbGwgdG8gZnJlZSB0aGUgYmxvY2tzCiAJCSAqLwogCQlYRlNfQk1BUF9JTklUKCZmcmVlX2xpc3QsICZmaXJzdGZzYik7Ci0JCWVycm9yID0gWEZTX0JVTk1BUEkobXAsIHRwLCAmaXAtPmlfaW9jb3JlLCBzdGFydG9mZnNldF9mc2IsCisJCWVycm9yID0geGZzX2J1bm1hcGkodHAsIGlwLCBzdGFydG9mZnNldF9mc2IsCiAJCQkJICBlbmRvZmZzZXRfZnNiIC0gc3RhcnRvZmZzZXRfZnNiLAogCQkJCSAgMCwgMiwgJmZpcnN0ZnNiLCAmZnJlZV9saXN0LCBOVUxMLCAmZG9uZSk7CiAJCWlmIChlcnJvcikgewpAQCAtNDM0NywyMyArNDI4OCwxMSBAQAogCXhmc190cmFuc190CSp0cDsKIAliaHZfdmF0dHJfdAl2YTsKIAotCXZuX3RyYWNlX2VudHJ5KGlwLCBfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKwl4ZnNfaXRyYWNlX2VudHJ5KGlwKTsKIAotCS8qCi0JICogbXVzdCBiZSBhIHJlZ3VsYXIgZmlsZSBhbmQgaGF2ZSB3cml0ZSBwZXJtaXNzaW9uCi0JICovCiAJaWYgKCFTX0lTUkVHKGlwLT5pX2QuZGlfbW9kZSkpCiAJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKIAotCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7Ci0KLQlpZiAoKGVycm9yID0geGZzX2lhY2Nlc3MoaXAsIFNfSVdVU1IsIGNyZWRwKSkpIHsKLQkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOwotCiAJc3dpdGNoIChiZi0+bF93aGVuY2UpIHsKIAljYXNlIDA6IC8qU0VFS19TRVQqLwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdm5vZGVvcHMuaCBiL2ZzL3hmcy94ZnNfdm5vZGVvcHMuaAppbmRleCBiN2U0NjFjLi40ZTM5NzBmMCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc192bm9kZW9wcy5oCisrKyBiL2ZzL3hmcy94ZnNfdm5vZGVvcHMuaApAQCAtMTgsNyArMTgsNiBAQAogaW50IHhmc19nZXRhdHRyKHN0cnVjdCB4ZnNfaW5vZGUgKmlwLCBzdHJ1Y3QgYmh2X3ZhdHRyICp2YXAsIGludCBmbGFncyk7CiBpbnQgeGZzX3NldGF0dHIoc3RydWN0IHhmc19pbm9kZSAqaXAsIHN0cnVjdCBiaHZfdmF0dHIgKnZhcCwgaW50IGZsYWdzLAogCQlzdHJ1Y3QgY3JlZCAqY3JlZHApOwotaW50IHhmc19hY2Nlc3Moc3RydWN0IHhmc19pbm9kZSAqaXAsIGludCBtb2RlLCBzdHJ1Y3QgY3JlZCAqY3JlZHApOwogaW50IHhmc19yZWFkbGluayhzdHJ1Y3QgeGZzX2lub2RlICppcCwgY2hhciAqbGluayk7CiBpbnQgeGZzX2ZzeW5jKHN0cnVjdCB4ZnNfaW5vZGUgKmlwLCBpbnQgZmxhZywgeGZzX29mZl90IHN0YXJ0LAogCQl4ZnNfb2ZmX3Qgc3RvcCk7CkBAIC0zOSw3ICszOCw2IEBACiBpbnQgeGZzX3N5bWxpbmsoc3RydWN0IHhmc19pbm9kZSAqZHAsIGJodl92bmFtZV90ICpkZW50cnksCiAJCWNoYXIgKnRhcmdldF9wYXRoLCBtb2RlX3QgbW9kZSwgYmh2X3Zub2RlX3QgKip2cHAsCiAJCXN0cnVjdCBjcmVkICpjcmVkcCk7Ci1pbnQgeGZzX2ZpZDIoc3RydWN0IHhmc19pbm9kZSAqaXAsIHN0cnVjdCB4ZnNfZmlkICp4ZmlkKTsKIGludCB4ZnNfcndsb2NrKHN0cnVjdCB4ZnNfaW5vZGUgKmlwLCBiaHZfdnJ3bG9ja190IGxvY2t0eXBlKTsKIHZvaWQgeGZzX3J3dW5sb2NrKHN0cnVjdCB4ZnNfaW5vZGUgKmlwLCBiaHZfdnJ3bG9ja190IGxvY2t0eXBlKTsKIGludCB4ZnNfaW5vZGVfZmx1c2goc3RydWN0IHhmc19pbm9kZSAqaXAsIGludCBmbGFncyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNnbG9iYWwuaCBiL2luY2x1ZGUvYWNwaS9hY2dsb2JhbC5oCmluZGV4IDM0N2E5MTEuLjQ3YTFmZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY2dsb2JhbC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY2dsb2JhbC5oCkBAIC0xMTcsMTAgKzExNyw2IEBACiAKIGV4dGVybiB1MzIgYWNwaV9nYmxfbmVzdGluZ19sZXZlbDsKIAotLyogRXZlbnQgY291bnRlcnMgKi8KLQotQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ3BlX2NvdW50OwotCiAvKiBTdXBwb3J0IGZvciBkeW5hbWljIGNvbnRyb2wgbWV0aG9kIHRyYWNpbmcgbWVjaGFuaXNtICovCiAKIEFDUElfRVhURVJOIHUzMiBhY3BpX2dibF9vcmlnaW5hbF9kYmdfbGV2ZWw7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNtYWNyb3MuaCBiL2luY2x1ZGUvYWNwaS9hY21hY3Jvcy5oCmluZGV4IDQ1NjYyZjYuLjk5ZDE3MWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY21hY3Jvcy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY21hY3Jvcy5oCkBAIC00ODYsNyArNDg2LDcgQEAKICNkZWZpbmUgQUNQSV9GVU5DVElPTl9OQU1FKG5hbWUpCiAjZW5kaWYKIAotI2lmZGVmIERFQlVHX0ZVTkNfVFJBQ0UKKyNpZmRlZiBDT05GSUdfQUNQSV9ERUJVR19GVU5DX1RSQUNFCiAKICNkZWZpbmUgQUNQSV9GVU5DVElPTl9UUkFDRShhKSAgICAgICAgICBBQ1BJX0ZVTkNUSU9OX05BTUUoYSkgXAogCQkJICBhY3BpX3V0X3RyYWNlKEFDUElfREVCVUdfUEFSQU1FVEVSUykKQEAgLTU2NSw3ICs1NjUsNyBAQAogCiAjZW5kaWYJCQkJLyogQUNQSV9TSU1QTEVfUkVUVVJOX01BQ1JPUyAqLwogCi0jZWxzZSAvKiAhREVCVUdfRlVOQ19UUkFDRSAqLworI2Vsc2UgLyogIUNPTkZJR19BQ1BJX0RFQlVHX0ZVTkNfVFJBQ0UgKi8KIAogI2RlZmluZSBBQ1BJX0ZVTkNUSU9OX1RSQUNFKGEpCiAjZGVmaW5lIEFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGEsYikKQEAgLTU4NCw3ICs1ODQsNyBAQAogI2RlZmluZSByZXR1cm5fVUlOVDMyKHMpICAgICAgICAgICAgICAgIHJldHVybihzKQogI2RlZmluZSByZXR1cm5fUFRSKHMpICAgICAgICAgICAgICAgICAgIHJldHVybihzKQogCi0jZW5kaWYgLyogREVCVUdfRlVOQ19UUkFDRSAqLworI2VuZGlmIC8qIENPTkZJR19BQ1BJX0RFQlVHX0ZVTkNfVFJBQ0UgKi8KIAogLyogQ29uZGl0aW9uYWwgZXhlY3V0aW9uICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3BpX2J1cy5oIGIvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKaW5kZXggZmI3MTcxYi4uMmYxYzY4YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKQEAgLTMyMSw2ICszMjEsMTEgQEAKIAogZXh0ZXJuIHN0cnVjdCBrb2JqZWN0ICphY3BpX2tvYmo7CiBleHRlcm4gaW50IGFjcGlfYnVzX2dlbmVyYXRlX25ldGxpbmtfZXZlbnQoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCB1OCwgaW50KTsKK3ZvaWQgYWNwaV9idXNfcHJpdmF0ZV9kYXRhX2hhbmRsZXIoYWNwaV9oYW5kbGUsIHUzMiwgdm9pZCAqKTsKK2ludCBhY3BpX2J1c19nZXRfcHJpdmF0ZV9kYXRhKGFjcGlfaGFuZGxlLCB2b2lkICoqKTsKK2V4dGVybiBpbnQgYWNwaV9ub3RpZmllcl9jYWxsX2NoYWluKHN0cnVjdCBhY3BpX2RldmljZSAqLCB1MzIsIHUzMik7CitleHRlcm4gaW50IHJlZ2lzdGVyX2FjcGlfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICopOworZXh0ZXJuIGludCB1bnJlZ2lzdGVyX2FjcGlfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICopOwogLyoKICAqIEV4dGVybmFsIEZ1bmN0aW9ucwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaV9kcml2ZXJzLmggYi9pbmNsdWRlL2FjcGkvYWNwaV9kcml2ZXJzLmgKaW5kZXggZjg1Zjc3YS4uOTc1N2EwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpX2RyaXZlcnMuaApAQCAtNDgsNiArNDgsNyBAQAogI2RlZmluZSBBQ1BJX0JVVFRPTl9ISURfU0xFRVBGCQkiTE5YU0xQQk4iCiAjZGVmaW5lIEFDUElfVklERU9fSElECQkJIkxOWFZJREVPIgogI2RlZmluZSBBQ1BJX0JBWV9ISUQJCQkiTE5YSU9CQVkiCisjZGVmaW5lIEFDUElfRE9DS19ISUQJCQkiTE5YRE9DSyIKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSQpAQCAtNzMsNyArNzQsNiBAQAogCiBhY3BpX3N0YXR1cyBhY3BpX2dldF9wY2lfaWQoYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgYWNwaV9wY2lfaWQgKmlkKTsKIGludCBhY3BpX3BjaV9iaW5kKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKLWludCBhY3BpX3BjaV91bmJpbmQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogaW50IGFjcGlfcGNpX2JpbmRfcm9vdChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgc3RydWN0IGFjcGlfcGNpX2lkICppZCwKIAkJICAgICAgIHN0cnVjdCBwY2lfYnVzICpidXMpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaV9udW1hLmggYi9pbmNsdWRlL2FjcGkvYWNwaV9udW1hLmgKaW5kZXggNjJjNWVlNC4uMTczOTcyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlfbnVtYS5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpX251bWEuaApAQCAtMTUsNyArMTUsNiBAQAogZXh0ZXJuIGludCBub2RlX3RvX3B4bShpbnQpOwogZXh0ZXJuIHZvaWQgX19hY3BpX21hcF9weG1fdG9fbm9kZShpbnQsIGludCk7CiBleHRlcm4gaW50IGFjcGlfbWFwX3B4bV90b19ub2RlKGludCk7Ci1leHRlcm4gdm9pZCBfX2NwdWluaXQgYWNwaV91bm1hcF9weG1fdG9fbm9kZShpbnQpOwogCiAjZW5kaWYJCQkJLyogQ09ORklHX0FDUElfTlVNQSAqLwogI2VuZGlmCQkJCS8qIF9fQUNQX05VTUFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmggYi9pbmNsdWRlL2FjcGkvYWNwaW9zeGYuaAppbmRleCBjYTg4MmI4Li4wMjJhNWZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNwaW9zeGYuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaW9zeGYuaApAQCAtMTgxLDYgKzE4MSw5IEBACiBhY3BpX3N0YXR1cwogYWNwaV9vc19yZW1vdmVfaW50ZXJydXB0X2hhbmRsZXIodTMyIGdzaSwgYWNwaV9vc2RfaGFuZGxlciBzZXJ2aWNlX3JvdXRpbmUpOwogCit2b2lkIGFjcGlfb3NfZ3BlX2NvdW50KHUzMiBncGVfbnVtYmVyKTsKK3ZvaWQgYWNwaV9vc19maXhlZF9ldmVudF9jb3VudCh1MzIgZml4ZWRfZXZlbnRfbnVtYmVyKTsKKwogLyoKICAqIFRocmVhZHMgYW5kIFNjaGVkdWxpbmcKICAqLwpAQCAtMjM5LDggKzI0Miw4IEBACiBhY3BpX3N0YXR1cyBhY3BpX29zaV9pbnZhbGlkYXRlKGNoYXIqIGludGVyZmFjZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX29zX3ZhbGlkYXRlX2FkZHJlc3ModTggc3BhY2VfaWQsCi0JCQkgYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsIGFjcGlfc2l6ZSBsZW5ndGgpOworYWNwaV9vc192YWxpZGF0ZV9hZGRyZXNzKHU4IHNwYWNlX2lkLCBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJCSBhY3BpX3NpemUgbGVuZ3RoLCBjaGFyICpuYW1lKTsKIAogdTY0IGFjcGlfb3NfZ2V0X3RpbWVyKHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmgKaW5kZXggNmUyNTNiNS4uY2RjODAwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaApAQCAtNCw3ICs0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC90aGVybWFsLmg+CiAjaW5jbHVkZSA8YXNtL2FjcGkuaD4KIAogI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9CVVNZX01FVFJJQwkxMApAQCAtMzQsNiArMzQsNyBAQAogCiAjZGVmaW5lIEFDUElfQ1NUQVRFX1NZU1RFTUlPCSgwKQogI2RlZmluZSBBQ1BJX0NTVEFURV9GRkgJCSgxKQorI2RlZmluZSBBQ1BJX0NTVEFURV9IQUxUCSgyKQogCiAvKiBQb3dlciBNYW5hZ2VtZW50ICovCiAKQEAgLTY0LDcgKzY1LDcgQEAKIAl1OCB2YWxpZDsKIAl1OCB0eXBlOwogCXUzMiBhZGRyZXNzOwotCXU4IHNwYWNlX2lkOworCXU4IGVudHJ5X21ldGhvZDsKIAl1OCBpbmRleDsKIAl1MzIgbGF0ZW5jeTsKIAl1MzIgbGF0ZW5jeV90aWNrczsKQEAgLTE3Niw2ICsxNzcsOCBAQAogCXUzMiBhZGRyZXNzOwogCXU4IGR1dHlfb2Zmc2V0OwogCXU4IGR1dHlfd2lkdGg7CisJdTggdHNkX3ZhbGlkX2ZsYWc7CisJdW5zaWduZWQgaW50IHNoYXJlZF90eXBlOwogCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl90eCBzdGF0ZXNbQUNQSV9QUk9DRVNTT1JfTUFYX1RIUk9UVExJTkddOwogfTsKIApAQCAtMjE4LDcgKzIyMSw3IEBACiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlICpwZXJmb3JtYW5jZTsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfdGhyb3R0bGluZyB0aHJvdHRsaW5nOwogCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9saW1pdCBsaW1pdDsKLQorCXN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2OwogCS8qIHRoZSBfUERDIG9iamVjdHMgZm9yIHRoaXMgcHJvY2Vzc29yLCBpZiBhbnkgKi8KIAlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAqcGRjOwogfTsKQEAgLTMxNiw3ICszMTksNyBAQAogaW50IGFjcGlfcHJvY2Vzc29yX2dldF90aHJvdHRsaW5nX2luZm8oc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcik7CiBleHRlcm4gaW50IGFjcGlfcHJvY2Vzc29yX3NldF90aHJvdHRsaW5nKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsIGludCBzdGF0ZSk7CiBleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3Byb2Nlc3Nvcl90aHJvdHRsaW5nX2ZvcHM7Ci0KK2V4dGVybiB2b2lkIGFjcGlfcHJvY2Vzc29yX3Rocm90dGxpbmdfaW5pdCh2b2lkKTsKIC8qIGluIHByb2Nlc3Nvcl9pZGxlLmMgKi8KIGludCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsCiAJCQkgICAgICBzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CkBAIC0zMzAsNyArMzMzLDcgQEAKIC8qIGluIHByb2Nlc3Nvcl90aGVybWFsLmMgKi8KIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfbGltaXRfaW5mbyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKTsKIGV4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfcHJvY2Vzc29yX2xpbWl0X2ZvcHM7Ci0KK2V4dGVybiBzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZV9vcHMgcHJvY2Vzc29yX2Nvb2xpbmdfb3BzOwogI2lmZGVmIENPTkZJR19DUFVfRlJFUQogdm9pZCBhY3BpX3RoZXJtYWxfY3B1ZnJlcV9pbml0KHZvaWQpOwogdm9pZCBhY3BpX3RoZXJtYWxfY3B1ZnJlcV9leGl0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvYS5vdXQtY29yZS5oIGIvaW5jbHVkZS9hc20tYWxwaGEvYS5vdXQtY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMzNlOTIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9hLm91dC1jb3JlLmgKQEAgLTAsMCArMSw4MCBAQAorLyogYS5vdXQgY29yZWR1bXAgcmVnaXN0ZXIgZHVtcGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0FTTV9BX09VVF9DT1JFX0gKKyNkZWZpbmUgX0FTTV9BX09VVF9DT1JFX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KKworLyoKKyAqIEZpbGwgaW4gdGhlIHVzZXIgc3RydWN0dXJlIGZvciBhbiBFQ09GRiBjb3JlIGR1bXAuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhb3V0X2R1bXBfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICpwdCwgc3RydWN0IHVzZXIgKmR1bXApCit7CisJLyogc3dpdGNoIHN0YWNrIGZvbGxvd3MgcmlnaHQgYmVsb3cgcHRfcmVnczogKi8KKwlzdHJ1Y3Qgc3dpdGNoX3N0YWNrICogc3cgPSAoKHN0cnVjdCBzd2l0Y2hfc3RhY2sgKikgcHQpIC0gMTsKKworCWR1bXAtPm1hZ2ljID0gQ01BR0lDOworCWR1bXAtPnN0YXJ0X2NvZGUgID0gY3VycmVudC0+bW0tPnN0YXJ0X2NvZGU7CisJZHVtcC0+c3RhcnRfZGF0YSAgPSBjdXJyZW50LT5tbS0+c3RhcnRfZGF0YTsKKwlkdW1wLT5zdGFydF9zdGFjayA9IHJkdXNwKCkgJiB+KFBBR0VfU0laRSAtIDEpOworCWR1bXAtPnVfdHNpemUgPSAoKGN1cnJlbnQtPm1tLT5lbmRfY29kZSAtIGR1bXAtPnN0YXJ0X2NvZGUpCisJCQkgPj4gUEFHRV9TSElGVCk7CisJZHVtcC0+dV9kc2l6ZSA9ICgoY3VycmVudC0+bW0tPmJyayArIFBBR0VfU0laRS0xIC0gZHVtcC0+c3RhcnRfZGF0YSkKKwkJCSA+PiBQQUdFX1NISUZUKTsKKwlkdW1wLT51X3NzaXplID0gKGN1cnJlbnQtPm1tLT5zdGFydF9zdGFjayAtIGR1bXAtPnN0YXJ0X3N0YWNrCisJCQkgKyBQQUdFX1NJWkUtMSkgPj4gUEFHRV9TSElGVDsKKworCS8qCisJICogV2Ugc3RvcmUgdGhlIHJlZ2lzdGVycyBpbiBhbiBvcmRlci9mb3JtYXQgdGhhdCBpcworCSAqIGNvbXBhdGlibGUgd2l0aCBERUMgVW5peC9PU0YvMSBhcyB0aGlzIG1ha2VzIGxpZmUgZWFzaWVyCisJICogZm9yIGdkYi4KKwkgKi8KKwlkdW1wLT5yZWdzW0VGX1YwXSAgPSBwdC0+cjA7CisJZHVtcC0+cmVnc1tFRl9UMF0gID0gcHQtPnIxOworCWR1bXAtPnJlZ3NbRUZfVDFdICA9IHB0LT5yMjsKKwlkdW1wLT5yZWdzW0VGX1QyXSAgPSBwdC0+cjM7CisJZHVtcC0+cmVnc1tFRl9UM10gID0gcHQtPnI0OworCWR1bXAtPnJlZ3NbRUZfVDRdICA9IHB0LT5yNTsKKwlkdW1wLT5yZWdzW0VGX1Q1XSAgPSBwdC0+cjY7CisJZHVtcC0+cmVnc1tFRl9UNl0gID0gcHQtPnI3OworCWR1bXAtPnJlZ3NbRUZfVDddICA9IHB0LT5yODsKKwlkdW1wLT5yZWdzW0VGX1MwXSAgPSBzdy0+cjk7CisJZHVtcC0+cmVnc1tFRl9TMV0gID0gc3ctPnIxMDsKKwlkdW1wLT5yZWdzW0VGX1MyXSAgPSBzdy0+cjExOworCWR1bXAtPnJlZ3NbRUZfUzNdICA9IHN3LT5yMTI7CisJZHVtcC0+cmVnc1tFRl9TNF0gID0gc3ctPnIxMzsKKwlkdW1wLT5yZWdzW0VGX1M1XSAgPSBzdy0+cjE0OworCWR1bXAtPnJlZ3NbRUZfUzZdICA9IHN3LT5yMTU7CisJZHVtcC0+cmVnc1tFRl9BM10gID0gcHQtPnIxOTsKKwlkdW1wLT5yZWdzW0VGX0E0XSAgPSBwdC0+cjIwOworCWR1bXAtPnJlZ3NbRUZfQTVdICA9IHB0LT5yMjE7CisJZHVtcC0+cmVnc1tFRl9UOF0gID0gcHQtPnIyMjsKKwlkdW1wLT5yZWdzW0VGX1Q5XSAgPSBwdC0+cjIzOworCWR1bXAtPnJlZ3NbRUZfVDEwXSA9IHB0LT5yMjQ7CisJZHVtcC0+cmVnc1tFRl9UMTFdID0gcHQtPnIyNTsKKwlkdW1wLT5yZWdzW0VGX1JBXSAgPSBwdC0+cjI2OworCWR1bXAtPnJlZ3NbRUZfVDEyXSA9IHB0LT5yMjc7CisJZHVtcC0+cmVnc1tFRl9BVF0gID0gcHQtPnIyODsKKwlkdW1wLT5yZWdzW0VGX1NQXSAgPSByZHVzcCgpOworCWR1bXAtPnJlZ3NbRUZfUFNdICA9IHB0LT5wczsKKwlkdW1wLT5yZWdzW0VGX1BDXSAgPSBwdC0+cGM7CisJZHVtcC0+cmVnc1tFRl9HUF0gID0gcHQtPmdwOworCWR1bXAtPnJlZ3NbRUZfQTBdICA9IHB0LT5yMTY7CisJZHVtcC0+cmVnc1tFRl9BMV0gID0gcHQtPnIxNzsKKwlkdW1wLT5yZWdzW0VGX0EyXSAgPSBwdC0+cjE4OworCW1lbWNweSgoY2hhciAqKWR1bXAtPnJlZ3MgKyBFRl9TSVpFLCBzdy0+ZnAsIDMyICogOCk7Cit9CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX0FTTV9BX09VVF9DT1JFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL2Eub3V0LmggYi9pbmNsdWRlL2FzbS1hbHBoYS9hLm91dC5oCmluZGV4IGU0M2NmNjEuLjAyY2U4NDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL2Eub3V0LmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvYS5vdXQuaApAQCAtOTgsMTEgKzk4LDUgQEAKIAlzZXRfcGVyc29uYWxpdHkgKCgoQkZQTS0+c2hfYmFuZyB8fCBFWC5haC5lbnRyeSA8IDB4MTAwMDAwMDAwTCBcCiAJCQkgICA/IEFERFJfTElNSVRfMzJCSVQgOiAwKSB8IFBFUl9PU0Y0KSkKIAotI2RlZmluZSBTVEFDS19UT1AgXAotICAoY3VycmVudC0+cGVyc29uYWxpdHkgJiBBRERSX0xJTUlUXzMyQklUID8gMHg4MDAwMDAwMCA6IDB4MDAxMjAwMDAwMDBVTCkKLQotI2RlZmluZSBTVEFDS19UT1BfTUFYCTB4MDAxMjAwMDAwMDBVTAotCi0jZW5kaWYKLQorI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfX0FfT1VUX0dOVV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL2VsZi5oIGIvaW5jbHVkZS9hc20tYWxwaGEvZWxmLmgKaW5kZXggNGI1MThlMy4uZmMxMDAyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvZWxmLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvZWxmLmgKQEAgLTE0NCw4ICsxNDQsNiBAQAogCTogYW1hc2sgKEFNQVNLX0NJWCkgPyAiZXY2IiA6ICJldjY3Iik7CVwKIH0pCiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0KICNkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKEVYLCBJQkNTMikJCQkJXAogCXNldF9wZXJzb25hbGl0eSgoKEVYKS5lX2ZsYWdzICYgRUZfQUxQSEFfMzJCSVQpCQlcCiAJICAgPyBQRVJfTElOVVhfMzJCSVQgOiAoSUJDUzIpID8gUEVSX1NWUjQgOiBQRVJfTElOVVgpCkBAIC0xNjQsNSArMTYyLDQgQEAKICAgICBORVdfQVVYX0VOVChBVF9MM19DQUNIRVNIQVBFLCBhbHBoYV9sM19jYWNoZXNoYXBlKTsJCVwKICAgfSB3aGlsZSAoMCkKIAotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfX0FTTV9BTFBIQV9FTEZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvcGFnZS5oIGIvaW5jbHVkZS9hc20tYWxwaGEvcGFnZS5oCmluZGV4IDhjYzk3YmYuLjIyZmY5NzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9wYWdlLmgKQEAgLTEsOCArMSw2IEBACiAjaWZuZGVmIF9BTFBIQV9QQUdFX0gKICNkZWZpbmUgX0FMUEhBX1BBR0VfSAogCi0jaWZkZWYgX19LRVJORUxfXwotCiAjaW5jbHVkZSA8bGludXgvY29uc3QuaD4KICNpbmNsdWRlIDxhc20vcGFsLmg+CiAKQEAgLTY0LDYgKzYyLDggQEAKIAogI2VuZGlmIC8qIFNUUklDVF9NTV9UWVBFQ0hFQ0tTICovCiAKK3R5cGVkZWYgc3RydWN0IHBhZ2UgKnBndGFibGVfdDsKKwogI2lmZGVmIFVTRV80OF9CSVRfS1NFRwogI2RlZmluZSBQQUdFX09GRlNFVAkJMHhmZmZmODAwMDAwMDAwMDAwVUwKICNlbHNlCkBAIC05OCw1ICs5OCw0IEBACiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbWVtb3J5X21vZGVsLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGFnZS5oPgogCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9BTFBIQV9QQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL3BhcmFtLmggYi9pbmNsdWRlL2FzbS1hbHBoYS9wYXJhbS5oCmluZGV4IDIxNGU3OTkuLjA5ODJmMWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL3BhcmFtLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvcGFyYW0uaApAQCAtNSwxNSArNSw3IEBACiAgICBoYXJkd2FyZSBpZ25vcmVzIHJlcHJvZ3JhbW1pbmcuICBXZSBhbHNvIG5lZWQgdXNlcmxhbmQgYnV5LWluIHRvIHRoZSAKICAgIGNoYW5nZSBpbiBIWiwgc2luY2UgdGhpcyBpcyB2aXNpYmxlIGluIHRoZSB3YWl0NCByZXNvdXJjZXMgZXRjLiAgKi8KIAotCi0jaWZuZGVmIEhaCi0jIGlmbmRlZiBDT05GSUdfQUxQSEFfUkFXSElERQotIyAgZGVmaW5lIEhaCTEwMjQKLSMgZWxzZQotIyAgZGVmaW5lIEhaCTEyMDAKLSMgZW5kaWYKLSNlbmRpZgotCisjZGVmaW5lIEhaCQlDT05GSUdfSFoKICNkZWZpbmUgVVNFUl9IWgkJSFoKIAogI2RlZmluZSBFWEVDX1BBR0VTSVpFCTgxOTIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL3BnYWxsb2MuaCBiL2luY2x1ZGUvYXNtLWFscGhhL3BnYWxsb2MuaAppbmRleCBmZGJlZGFjLi5mZDA5MDE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS9wZ2FsbG9jLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvcGdhbGxvYy5oCkBAIC0xMSwxMCArMTEsMTEgQEAKICAqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQKLXBtZF9wb3B1bGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcG1kX3QgKnBtZCwgc3RydWN0IHBhZ2UgKnB0ZSkKK3BtZF9wb3B1bGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcG1kX3QgKnBtZCwgcGd0YWJsZV90IHB0ZSkKIHsKIAlwbWRfc2V0KHBtZCwgKHB0ZV90ICopKHBhZ2VfdG9fcGEocHRlKSArIFBBR0VfT0ZGU0VUKSk7CiB9CisjZGVmaW5lIHBtZF9wZ3RhYmxlKHBtZCkgcG1kX3BhZ2UocG1kKQogCiBzdGF0aWMgaW5saW5lIHZvaWQKIHBtZF9wb3B1bGF0ZV9rZXJuZWwoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBtZF90ICpwbWQsIHB0ZV90ICpwdGUpCkBAIC01NywxOCArNTgsMjMgQEAKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcHRlKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqCi1wdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpCitzdGF0aWMgaW5saW5lIHBndGFibGVfdAorcHRlX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewotCXB0ZV90ICpwdGUgPSBwdGVfYWxsb2Nfb25lX2tlcm5lbChtbSwgYWRkcik7Ci0JaWYgKHB0ZSkKLQkJcmV0dXJuIHZpcnRfdG9fcGFnZShwdGUpOwotCXJldHVybiBOVUxMOworCXB0ZV90ICpwdGUgPSBwdGVfYWxsb2Nfb25lX2tlcm5lbChtbSwgYWRkcmVzcyk7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlpZiAoIXB0ZSkKKwkJcmV0dXJuIE5VTEw7CisJcGFnZSA9IHZpcnRfdG9fcGFnZShwdGUpOworCXBndGFibGVfcGFnZV9jdG9yKHBhZ2UpOworCXJldHVybiBwYWdlOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKLXB0ZV9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3B0ZV9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ3RhYmxlX3QgcGFnZSkKIHsKKwlwZ3RhYmxlX3BhZ2VfZHRvcihwYWdlKTsKIAlfX2ZyZWVfcGFnZShwYWdlKTsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1hbHBoYS9wcm9jZXNzb3IuaAppbmRleCA0MjViN2I2Li45NGFmZTU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9wcm9jZXNzb3IuaApAQCAtMjAsNiArMjAsMTEgQEAKICAqLwogI2RlZmluZSBUQVNLX1NJWkUgKDB4NDAwMDAwMDAwMDBVTCkKIAorI2RlZmluZSBTVEFDS19UT1AgXAorICAoY3VycmVudC0+cGVyc29uYWxpdHkgJiBBRERSX0xJTUlUXzMyQklUID8gMHg4MDAwMDAwMCA6IDB4MDAxMjAwMDAwMDBVTCkKKworI2RlZmluZSBTVEFDS19UT1BfTUFYCTB4MDAxMjAwMDAwMDBVTAorCiAvKiBUaGlzIGRlY2lkZXMgd2hlcmUgdGhlIGtlcm5lbCB3aWxsIHNlYXJjaCBmb3IgYSBmcmVlIGNodW5rIG9mIHZtCiAgKiBzcGFjZSBkdXJpbmcgbW1hcCdzLgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLWFscGhhL3N5c3RlbS5oCmluZGV4IGZkOWRjODguLmVkMjIxZDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL3N5c3RlbS5oCkBAIC02ODEsMTMgKzY4MSwxOCBAQAogCXJldHVybiBvbGQ7CiB9CiAKLSNkZWZpbmUgY21weGNoZyhwdHIsbyxuKQkJCQkJCSBcCisjZGVmaW5lIGNtcHhjaGcocHRyLCBvLCBuKQkJCQkJCSBcCiAgICh7CQkJCQkJCQkJIFwKICAgICAgX190eXBlb2ZfXygqKHB0cikpIF9vXyA9IChvKTsJCQkJCSBcCiAgICAgIF9fdHlwZW9mX18oKihwdHIpKSBfbl8gPSAobik7CQkJCQkgXAogICAgICAoX190eXBlb2ZfXygqKHB0cikpKSBfX2NtcHhjaGcoKHB0ciksICh1bnNpZ25lZCBsb25nKV9vXywJCSBcCiAJCQkJICAgICh1bnNpZ25lZCBsb25nKV9uXywgc2l6ZW9mKCoocHRyKSkpOyBcCiAgIH0pCisjZGVmaW5lIGNtcHhjaGc2NChwdHIsIG8sIG4pCQkJCQkJIFwKKyAgKHsJCQkJCQkJCQkgXAorCUJVSUxEX0JVR19PTihzaXplb2YoKihwdHIpKSAhPSA4KTsJCQkJIFwKKwljbXB4Y2hnKChwdHIpLCAobyksIChuKSk7CQkJCQkgXAorICB9KQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKIF9fY21weGNoZ191OF9sb2NhbCh2b2xhdGlsZSBjaGFyICptLCBsb25nIG9sZCwgbG9uZyBuZXcpCkBAIC04MDMsMTMgKzgwOCwxOSBAQAogCXJldHVybiBvbGQ7CiB9CiAKLSNkZWZpbmUgY21weGNoZ19sb2NhbChwdHIsbyxuKQkJCQkJCSBcCisjZGVmaW5lIGNtcHhjaGdfbG9jYWwocHRyLCBvLCBuKQkJCQkJIFwKICAgKHsJCQkJCQkJCQkgXAogICAgICBfX3R5cGVvZl9fKCoocHRyKSkgX29fID0gKG8pOwkJCQkJIFwKICAgICAgX190eXBlb2ZfXygqKHB0cikpIF9uXyA9IChuKTsJCQkJCSBcCiAgICAgIChfX3R5cGVvZl9fKCoocHRyKSkpIF9fY21weGNoZ19sb2NhbCgocHRyKSwgKHVuc2lnbmVkIGxvbmcpX29fLAkgXAogCQkJCSAgICAodW5zaWduZWQgbG9uZylfbl8sIHNpemVvZigqKHB0cikpKTsgXAogICB9KQorI2RlZmluZSBjbXB4Y2hnNjRfbG9jYWwocHRyLCBvLCBuKQkJCQkJIFwKKyAgKHsJCQkJCQkJCQkgXAorCUJVSUxEX0JVR19PTihzaXplb2YoKihwdHIpKSAhPSA4KTsJCQkJIFwKKwljbXB4Y2hnX2xvY2FsKChwdHIpLCAobyksIChuKSk7CQkJCQkgXAorICB9KQorCiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvdXNlci5oIGIvaW5jbHVkZS9hc20tYWxwaGEvdXNlci5oCmluZGV4IDdlNDE3ZmMuLmE0ZWI2YTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL3VzZXIuaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS91c2VyLmgKQEAgLTM5LDcgKzM5LDcgQEAKIAl1bnNpZ25lZCBsb25nCXN0YXJ0X2RhdGE7CQkvKiBkYXRhIHN0YXJ0aW5nIGFkZHJlc3MgKi8KIAl1bnNpZ25lZCBsb25nCXN0YXJ0X3N0YWNrOwkJLyogc3RhY2sgc3RhcnRpbmcgYWRkcmVzcyAqLwogCWxvbmcgaW50CXNpZ25hbDsJCQkvKiBzaWduYWwgY2F1c2luZyBjb3JlIGR1bXAgKi8KLQlzdHJ1Y3QgcmVncyAqCXVfYXIwOwkJCS8qIGhlbHAgZ2RiIGZpbmQgcmVnaXN0ZXJzICovCisJdW5zaWduZWQgbG9uZwl1X2FyMDsJCQkvKiBoZWxwIGdkYiBmaW5kIHJlZ2lzdGVycyAqLwogCXVuc2lnbmVkIGxvbmcJbWFnaWM7CQkJLyogaWRlbnRpZmllcyBhIGNvcmUgZmlsZSAqLwogCWNoYXIJCXVfY29tbVszMl07CQkvKiB1c2VyIGNvbW1hbmQgbmFtZSAqLwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hLm91dC1jb3JlLmggYi9pbmNsdWRlL2FzbS1hcm0vYS5vdXQtY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZDA0YWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYS5vdXQtY29yZS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIGEub3V0IGNvcmVkdW1wIHJlZ2lzdGVyIGR1bXBlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9BU01fQV9PVVRfQ09SRV9ICisjZGVmaW5lIF9BU01fQV9PVVRfQ09SRV9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC91c2VyLmg+CisjaW5jbHVkZSA8bGludXgvZWxmY29yZS5oPgorCisvKgorICogZmlsbCBpbiB0aGUgdXNlciBzdHJ1Y3R1cmUgZm9yIGFuIGEub3V0IGNvcmUgZHVtcAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYW91dF9kdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHVzZXIgKmR1bXApCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCisJZHVtcC0+bWFnaWMgPSBDTUFHSUM7CisJZHVtcC0+c3RhcnRfY29kZSA9IHRzay0+bW0tPnN0YXJ0X2NvZGU7CisJZHVtcC0+c3RhcnRfc3RhY2sgPSByZWdzLT5BUk1fc3AgJiB+KFBBR0VfU0laRSAtIDEpOworCisJZHVtcC0+dV90c2l6ZSA9ICh0c2stPm1tLT5lbmRfY29kZSAtIHRzay0+bW0tPnN0YXJ0X2NvZGUpID4+IFBBR0VfU0hJRlQ7CisJZHVtcC0+dV9kc2l6ZSA9ICh0c2stPm1tLT5icmsgLSB0c2stPm1tLT5zdGFydF9kYXRhICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKKwlkdW1wLT51X3NzaXplID0gMDsKKworCWR1bXAtPnVfZGVidWdyZWdbMF0gPSB0c2stPnRocmVhZC5kZWJ1Zy5icFswXS5hZGRyZXNzOworCWR1bXAtPnVfZGVidWdyZWdbMV0gPSB0c2stPnRocmVhZC5kZWJ1Zy5icFsxXS5hZGRyZXNzOworCWR1bXAtPnVfZGVidWdyZWdbMl0gPSB0c2stPnRocmVhZC5kZWJ1Zy5icFswXS5pbnNuLmFybTsKKwlkdW1wLT51X2RlYnVncmVnWzNdID0gdHNrLT50aHJlYWQuZGVidWcuYnBbMV0uaW5zbi5hcm07CisJZHVtcC0+dV9kZWJ1Z3JlZ1s0XSA9IHRzay0+dGhyZWFkLmRlYnVnLm5zYXZlZDsKKworCWlmIChkdW1wLT5zdGFydF9zdGFjayA8IDB4MDQwMDAwMDApCisJCWR1bXAtPnVfc3NpemUgPSAoMHgwNDAwMDAwMCAtIGR1bXAtPnN0YXJ0X3N0YWNrKSA+PiBQQUdFX1NISUZUOworCisJZHVtcC0+cmVncyA9ICpyZWdzOworCWR1bXAtPnVfZnB2YWxpZCA9IGR1bXBfZnB1IChyZWdzLCAmZHVtcC0+dV9mcCk7Cit9CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX0FTTV9BX09VVF9DT1JFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hLm91dC5oIGIvaW5jbHVkZS9hc20tYXJtL2Eub3V0LmgKaW5kZXggZDcxNjVlOC4uNzk0ODlmZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2Eub3V0LmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2Eub3V0LmgKQEAgLTI3LDEyICsyNyw2IEBACiAKICNkZWZpbmUgTV9BUk0gMTAzCiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0jZGVmaW5lIFNUQUNLX1RPUAkoKGN1cnJlbnQtPnBlcnNvbmFsaXR5ID09IFBFUl9MSU5VWF8zMkJJVCkgPyBcCi0JCQkgVEFTS19TSVpFIDogVEFTS19TSVpFXzI2KQotI2RlZmluZSBTVEFDS19UT1BfTUFYCVRBU0tfU0laRQotI2VuZGlmCi0KICNpZm5kZWYgTElCUkFSWV9TVEFSVF9URVhUCiAjZGVmaW5lIExJQlJBUllfU1RBUlRfVEVYVAkoMHgwMGMwMDAwMCkKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3B4YTI3eF9rZXlib2FyZC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3B4YTI3eF9rZXlib2FyZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWFmZjkyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9weGEyN3hfa2V5Ym9hcmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSNkZWZpbmUgUFhBS0JEX01BWFJPVwkJOAotI2RlZmluZSBQWEFLQkRfTUFYQ09MCQk4Ci0KLXN0cnVjdCBweGEyN3hfa2V5Ym9hcmRfcGxhdGZvcm1fZGF0YSB7Ci0JaW50IG5yX3Jvd3MsIG5yX2NvbHM7Ci0JaW50IGtleWNvZGVzW1BYQUtCRF9NQVhST1ddW1BYQUtCRF9NQVhDT0xdOwotCWludCBncGlvX21vZGVzW1BYQUtCRF9NQVhST1cgKyBQWEFLQkRfTUFYQ09MXTsKLQotI2lmZGVmIENPTkZJR19QTQotCXUzMiByZWdfa3BjOwotCXUzMiByZWdfa3ByZWM7Ci0jZW5kaWYKLX07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvcHhhMjd4X2tleXBhZC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3B4YTI3eF9rZXlwYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDRmNzYwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3B4YTI3eF9rZXlwYWQuaApAQCAtMCwwICsxLDU2IEBACisjaWZuZGVmIF9fQVNNX0FSQ0hfUFhBMjd4X0tFWVBBRF9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfUFhBMjd4X0tFWVBBRF9ICisKKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorCisjZGVmaW5lIE1BWF9NQVRSSVhfS0VZX1JPV1MJKDgpCisjZGVmaW5lIE1BWF9NQVRSSVhfS0VZX0NPTFMJKDgpCisKKy8qIHB4YTN4eCBrZXlwYWQgcGxhdGZvcm0gc3BlY2lmaWMgcGFyYW1ldGVycworICoKKyAqIE5PVEU6CisgKiAxLiBkaXJlY3Rfa2V5X251bSBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBrZXlzIGluIHRoZSBkaXJlY3Qga2V5cGFkCisgKiAgICBfcGx1c18gdGhlIG51bWJlciBvZiByb3RhcnktZW5jb2RlciBzZW5zb3IgaW5wdXRzLCAgdGhpcyBjYW4gYmUKKyAqICAgIGxlZnQgYXMgMCBpZiBvbmx5IHJvdGFyeSBlbmNvZGVycyBhcmUgZW5hYmxlZCwgIHRoZSBkcml2ZXIgd2lsbAorICogICAgYXV0b21hdGljYWxseSBjYWxjdWxhdGUgdGhpcworICoKKyAqIDIuIGRpcmVjdF9rZXlfbWFwIGlzIHRoZSBrZXkgY29kZSBtYXAgZm9yIHRoZSBkaXJlY3Qga2V5cywgaWYgcm90YXJ5CisgKiAgICBlbmNvZGVyKHMpIGFyZSBlbmFibGVkLCBkaXJlY3Qga2V5IDAvMSgyLzMpIHdpbGwgYmUgaWdub3JlZAorICoKKyAqIDMuIHJvdGFyeSBjYW4gYmUgZWl0aGVyIGludGVycHJldGVkIGFzIGEgcmVsYXRpdmUgaW5wdXQgZXZlbnQgKGUuZy4KKyAqICAgIFJFTF9XSEVFTC9SRUxfSFdIRUVMKSBvciBzcGVjaWZpYyBrZXlzIChlLmcuIFVQL0RPV04vTEVGVC9SSUdIVCkKKyAqCisgKiA0LiBtYXRyaXgga2V5IGFuZCBkaXJlY3Qga2V5IHdpbGwgdXNlIHRoZSBzYW1lIGRlYm91bmNlX2ludGVydmFsIGJ5CisgKiAgICBkZWZhdWx0LCB3aGljaCBzaG91bGQgYmUgc3VmZmljaWVudCBpbiBtb3N0IGNhc2VzCisgKi8KK3N0cnVjdCBweGEyN3hfa2V5cGFkX3BsYXRmb3JtX2RhdGEgeworCisJLyogY29kZSBtYXAgZm9yIHRoZSBtYXRyaXgga2V5cyAqLworCXVuc2lnbmVkIGludAltYXRyaXhfa2V5X3Jvd3M7CisJdW5zaWduZWQgaW50CW1hdHJpeF9rZXlfY29sczsKKwl1bnNpZ25lZCBpbnQJKm1hdHJpeF9rZXlfbWFwOworCWludAkJbWF0cml4X2tleV9tYXBfc2l6ZTsKKworCS8qIGRpcmVjdCBrZXlzICovCisJaW50CQlkaXJlY3Rfa2V5X251bTsKKwl1bnNpZ25lZCBpbnQJZGlyZWN0X2tleV9tYXBbOF07CisKKwkvKiByb3RhcnkgZW5jb2RlcnMgMCAqLworCWludAkJZW5hYmxlX3JvdGFyeTA7CisJaW50CQlyb3RhcnkwX3JlbF9jb2RlOworCWludAkJcm90YXJ5MF91cF9rZXk7CisJaW50CQlyb3RhcnkwX2Rvd25fa2V5OworCisJLyogcm90YXJ5IGVuY29kZXJzIDEgKi8KKwlpbnQJCWVuYWJsZV9yb3RhcnkxOworCWludAkJcm90YXJ5MV9yZWxfY29kZTsKKwlpbnQJCXJvdGFyeTFfdXBfa2V5OworCWludAkJcm90YXJ5MV9kb3duX2tleTsKKworCS8qIGtleSBkZWJvdW5jZSBpbnRlcnZhbCAqLworCXVuc2lnbmVkIGludAlkZWJvdW5jZV9pbnRlcnZhbDsKK307CisKKyNkZWZpbmUgS0VZKHJvdywgY29sLCB2YWwpCSgoKHJvdykgPDwgMjgpIHwgKChjb2wpIDw8IDI0KSB8ICh2YWwpKQorCisjZW5kaWYgLyogX19BU01fQVJDSF9QWEEyN3hfS0VZUEFEX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS90b3NhLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvdG9zYS5oCmluZGV4IGMzMzY0YTIuLmMwNWU0ZmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS90b3NhLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3Rvc2EuaApAQCAtMTYzLDQgKzE2MywzNCBAQAogCiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSB0b3Nhc2Nvb3BfamNfZGV2aWNlOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG9zYXNjb29wX2RldmljZTsKKworI2RlZmluZSBUT1NBX0tFWV9TWU5DCQlLRVlfMTAyTkQgLyogPz8/ICovCisKKworI2lmbmRlZiBDT05GSUdfS0VZQk9BUkRfVE9TQV9VU0VfRVhUX0tFWUNPREVTCisjZGVmaW5lIFRPU0FfS0VZX1JFQ09SRAkJS0VZX1lFTgorI2RlZmluZSBUT1NBX0tFWV9BRERSRVNTQk9PSwlLRVlfS0FUQUtBTkEKKyNkZWZpbmUgVE9TQV9LRVlfQ0FOQ0VMCQlLRVlfRVNDCisjZGVmaW5lIFRPU0FfS0VZX0NFTlRFUgkJS0VZX0hJUkFHQU5BCisjZGVmaW5lIFRPU0FfS0VZX09LCQlLRVlfSEVOS0FOCisjZGVmaW5lIFRPU0FfS0VZX0NBTEVOREFSCUtFWV9LQVRBS0FOQUhJUkFHQU5BCisjZGVmaW5lIFRPU0FfS0VZX0hPTUVQQUdFCUtFWV9IQU5HRVVMCisjZGVmaW5lIFRPU0FfS0VZX0xJR0hUCQlLRVlfTVVIRU5LQU4KKyNkZWZpbmUgVE9TQV9LRVlfTUVOVQkJS0VZX0hBTkpBCisjZGVmaW5lIFRPU0FfS0VZX0ZOCQlLRVlfUklHSFRBTFQKKyNkZWZpbmUgVE9TQV9LRVlfTUFJTAkJS0VZX1pFTktBS1VIQU5LQUtVCisjZWxzZQorI2RlZmluZSBUT1NBX0tFWV9SRUNPUkQJCUtFWV9SRUNPUkQKKyNkZWZpbmUgVE9TQV9LRVlfQUREUkVTU0JPT0sJS0VZX0FERFJFU1NCT09LCisjZGVmaW5lIFRPU0FfS0VZX0NBTkNFTAkJS0VZX0NBTkNFTAorI2RlZmluZSBUT1NBX0tFWV9DRU5URVIJCUtFWV9TRUxFQ1QgLyogPz8/ICovCisjZGVmaW5lIFRPU0FfS0VZX09LCQlLRVlfT0sKKyNkZWZpbmUgVE9TQV9LRVlfQ0FMRU5EQVIJS0VZX0NBTEVOREFSCisjZGVmaW5lIFRPU0FfS0VZX0hPTUVQQUdFCUtFWV9IT01FUEFHRQorI2RlZmluZSBUT1NBX0tFWV9MSUdIVAkJS0VZX0tCRElMTFVNVE9HR0xFCisjZGVmaW5lIFRPU0FfS0VZX01FTlUJCUtFWV9NRU5VCisjZGVmaW5lIFRPU0FfS0VZX0ZOCQlLRVlfRk4KKyNkZWZpbmUgVE9TQV9LRVlfTUFJTAkJS0VZX01BSUwKKyNlbmRpZgorCiAjZW5kaWYgLyogX0FTTV9BUkNIX1RPU0FfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9lbGYuaCBiL2luY2x1ZGUvYXNtLWFybS9lbGYuaAppbmRleCBlYzFjNjg1Li40Y2E3NTE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vZWxmLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2VsZi5oCkBAIC00MSw3ICs0MSw2IEBACiAjZW5kaWYKICNkZWZpbmUgRUxGX0FSQ0gJRU1fQVJNCiAKLSNpZmRlZiBfX0tFUk5FTF9fCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogLyoKICAqIFRoaXMgeWllbGRzIGEgc3RyaW5nIHRoYXQgbGQuc28gd2lsbCB1c2UgdG8gbG9hZCBpbXBsZW1lbnRhdGlvbgpAQCAtMTE1LDUgKzExNCwzIEBACiAJfSB3aGlsZSAoMCkKIAogI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL211dGV4LmggYi9pbmNsdWRlL2FzbS1hcm0vbXV0ZXguaAppbmRleCBjYjI5ZDg0Li4wMjBiZDk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vbXV0ZXguaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vbXV0ZXguaApAQCAtMjQsNyArMjQsNyBAQAogICogcmVhdHRlbXB0ZWQgdW50aWwgaXQgc3VjY2VlZHMuCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZAotX19tdXRleF9mYXN0cGF0aF9sb2NrKGF0b21pY190ICpjb3VudCwgZmFzdGNhbGwgdm9pZCAoKmZhaWxfZm4pKGF0b21pY190ICopKQorX19tdXRleF9mYXN0cGF0aF9sb2NrKGF0b21pY190ICpjb3VudCwgdm9pZCAoKmZhaWxfZm4pKGF0b21pY190ICopKQogewogCWludCBfX2V4X2ZsYWcsIF9fcmVzOwogCkBAIC00NCw3ICs0NCw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1fX211dGV4X2Zhc3RwYXRoX2xvY2tfcmV0dmFsKGF0b21pY190ICpjb3VudCwgZmFzdGNhbGwgaW50ICgqZmFpbF9mbikoYXRvbWljX3QgKikpCitfX211dGV4X2Zhc3RwYXRoX2xvY2tfcmV0dmFsKGF0b21pY190ICpjb3VudCwgaW50ICgqZmFpbF9mbikoYXRvbWljX3QgKikpCiB7CiAJaW50IF9fZXhfZmxhZywgX19yZXM7CiAKQEAgLTcwLDcgKzcwLDcgQEAKICAqIGJldHRlciBnZW5lcmF0ZWQgYXNzZW1ibHkuCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZAotX19tdXRleF9mYXN0cGF0aF91bmxvY2soYXRvbWljX3QgKmNvdW50LCBmYXN0Y2FsbCB2b2lkICgqZmFpbF9mbikoYXRvbWljX3QgKikpCitfX211dGV4X2Zhc3RwYXRoX3VubG9jayhhdG9taWNfdCAqY291bnQsIHZvaWQgKCpmYWlsX2ZuKShhdG9taWNfdCAqKSkKIHsKIAlpbnQgX19leF9mbGFnLCBfX3JlcywgX19vcmlnOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vcGFnZS5oIGIvaW5jbHVkZS9hc20tYXJtL3BhZ2UuaAppbmRleCA3ZTg1ZGI3Li5jODZmNjhlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9wYWdlLmgKQEAgLTEwLDkgKzEwLDYgQEAKICNpZm5kZWYgX0FTTUFSTV9QQUdFX0gKICNkZWZpbmUgX0FTTUFSTV9QQUdFX0gKIAotCi0jaWZkZWYgX19LRVJORUxfXwotCiAvKiBQQUdFX1NISUZUIGRldGVybWluZXMgdGhlIHBhZ2Ugc2l6ZSAqLwogI2RlZmluZSBQQUdFX1NISUZUCQkxMgogI2RlZmluZSBQQUdFX1NJWkUJCSgxVUwgPDwgUEFHRV9TSElGVCkKQEAgLTE3NCw2ICsxNzEsOCBAQAogCiAjZW5kaWYgLyogU1RSSUNUX01NX1RZUEVDSEVDS1MgKi8KIAordHlwZWRlZiBzdHJ1Y3QgcGFnZSAqcGd0YWJsZV90OworCiAjZW5kaWYgLyogQ09ORklHX01NVSAqLwogCiAjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgpAQCAtMTkyLDYgKzE5MSw0IEBACiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wYWdlLmg+CiAKLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3BnYWxsb2MuaCBiL2luY2x1ZGUvYXNtLWFybS9wZ2FsbG9jLmgKaW5kZXggZmI2YzZlMy4uMTYzYjAzMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3BnYWxsb2MuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vcGdhbGxvYy5oCkBAIC02Niw3ICs2Niw3IEBACiAJcmV0dXJuIHB0ZTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqCitzdGF0aWMgaW5saW5lIHBndGFibGVfdAogcHRlX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKQogewogCXN0cnVjdCBwYWdlICpwdGU7CkBAIC03NSw2ICs3NSw3IEBACiAJaWYgKHB0ZSkgewogCQl2b2lkICpwYWdlID0gcGFnZV9hZGRyZXNzKHB0ZSk7CiAJCWNsZWFuX2RjYWNoZV9hcmVhKHBhZ2UsIHNpemVvZihwdGVfdCkgKiBQVFJTX1BFUl9QVEUpOworCQlwZ3RhYmxlX3BhZ2VfY3RvcihwdGUpOwogCX0KIAogCXJldHVybiBwdGU7CkBAIC05MSw4ICs5Miw5IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBwYWdlICpwdGUpCitzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBndGFibGVfdCBwdGUpCiB7CisJcGd0YWJsZV9wYWdlX2R0b3IocHRlKTsKIAlfX2ZyZWVfcGFnZShwdGUpOwogfQogCkBAIC0xMjMsMTAgKzEyNSwxMSBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKLXBtZF9wb3B1bGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcG1kX3QgKnBtZHAsIHN0cnVjdCBwYWdlICpwdGVwKQorcG1kX3BvcHVsYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqcG1kcCwgcGd0YWJsZV90IHB0ZXApCiB7CiAJX19wbWRfcG9wdWxhdGUocG1kcCwgcGFnZV90b19wZm4ocHRlcCkgPDwgUEFHRV9TSElGVCB8IF9QQUdFX1VTRVJfVEFCTEUpOwogfQorI2RlZmluZSBwbWRfcGd0YWJsZShwbWQpIHBtZF9wYWdlKHBtZCkKIAogI2VuZGlmIC8qIENPTkZJR19NTVUgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3Bvc2l4X3R5cGVzLmggYi9pbmNsdWRlL2FzbS1hcm0vcG9zaXhfdHlwZXMuaAppbmRleCBlMTQyYTJhLi5jMzczNzlkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vcG9zaXhfdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vcG9zaXhfdHlwZXMuaApAQCAtNTEsMTQgKzUxLDEwIEBACiAjZW5kaWYKIAogdHlwZWRlZiBzdHJ1Y3QgewotI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgZGVmaW5lZChfX1VTRV9BTEwpCiAJaW50CXZhbFsyXTsKLSNlbHNlIC8qICFkZWZpbmVkKF9fS0VSTkVMX18pICYmICFkZWZpbmVkKF9fVVNFX0FMTCkgKi8KLQlpbnQJX192YWxbMl07Ci0jZW5kaWYgLyogIWRlZmluZWQoX19LRVJORUxfXykgJiYgIWRlZmluZWQoX19VU0VfQUxMKSAqLwogfSBfX2tlcm5lbF9mc2lkX3Q7CiAKLSNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8ICFkZWZpbmVkKF9fR0xJQkNfXykgfHwgKF9fR0xJQkNfXyA8IDIpCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKQogCiAjdW5kZWYJX19GRF9TRVQKICNkZWZpbmUgX19GRF9TRVQoZmQsIGZkc2V0cCkgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tYXJtL3Byb2Nlc3Nvci5oCmluZGV4IDFiYmYxNjE4Li5iZDgwMjllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL3Byb2Nlc3Nvci5oCkBAIC0yMiw2ICsyMiwxMiBAQAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KIAorI2lmZGVmIF9fS0VSTkVMX18KKyNkZWZpbmUgU1RBQ0tfVE9QCSgoY3VycmVudC0+cGVyc29uYWxpdHkgPT0gUEVSX0xJTlVYXzMyQklUKSA/IFwKKwkJCSBUQVNLX1NJWkUgOiBUQVNLX1NJWkVfMjYpCisjZGVmaW5lIFNUQUNLX1RPUF9NQVgJVEFTS19TSVpFCisjZW5kaWYKKwogdW5pb24gZGVidWdfaW5zbiB7CiAJdTMyCWFybTsKIAl1MTYJdGh1bWI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1hcm0vc3lzdGVtLmgKaW5kZXggMjg0MjVjNC4uNjMzNWRlOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9zeXN0ZW0uaApAQCAtMzYzLDYgKzM2MywyMSBAQAogZXh0ZXJuIHZvaWQgZGlzYWJsZV9obHQodm9pZCk7CiBleHRlcm4gdm9pZCBlbmFibGVfaGx0KHZvaWQpOwogCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvY21weGNoZy1sb2NhbC5oPgorCisvKgorICogY21weGNoZ19sb2NhbCBhbmQgY21weGNoZzY0X2xvY2FsIGFyZSBhdG9taWMgd3J0IGN1cnJlbnQgQ1BVLiBBbHdheXMgbWFrZQorICogdGhlbSBhdmFpbGFibGUuCisgKi8KKyNkZWZpbmUgY21weGNoZ19sb2NhbChwdHIsIG8sIG4pCQkJCSAgCSAgICAgICBcCisJKChfX3R5cGVvZl9fKCoocHRyKSkpX19jbXB4Y2hnX2xvY2FsX2dlbmVyaWMoKHB0ciksICh1bnNpZ25lZCBsb25nKShvKSxcCisJCQkodW5zaWduZWQgbG9uZykobiksIHNpemVvZigqKHB0cikpKSkKKyNkZWZpbmUgY21weGNoZzY0X2xvY2FsKHB0ciwgbywgbikgX19jbXB4Y2hnNjRfbG9jYWxfZ2VuZXJpYygocHRyKSwgKG8pLCAobikpCisKKyNpZm5kZWYgQ09ORklHX1NNUAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NtcHhjaGcuaD4KKyNlbmRpZgorCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNkZWZpbmUgYXJjaF9hbGlnbl9zdGFjayh4KSAoeCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS91c2VyLmggYi9pbmNsdWRlL2FzbS1hcm0vdXNlci5oCmluZGV4IDNlOGIwZjguLjgyNWMxZTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS91c2VyLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL3VzZXIuaApAQCAtNjcsNyArNjcsNyBAQAogCQkJCSAgIGVzcCByZWdpc3Rlci4gICovCiAgIGxvbmcgaW50IHNpZ25hbDsgICAgIAkJLyogU2lnbmFsIHRoYXQgY2F1c2VkIHRoZSBjb3JlIGR1bXAuICovCiAgIGludCByZXNlcnZlZDsJCQkvKiBObyBsb25nZXIgdXNlZCAqLwotICBzdHJ1Y3QgcHRfcmVncyAqIHVfYXIwOwkvKiBVc2VkIGJ5IGdkYiB0byBoZWxwIGZpbmQgdGhlIHZhbHVlcyBmb3IgKi8KKyAgdW5zaWduZWQgbG9uZyB1X2FyMDsJCS8qIFVzZWQgYnkgZ2RiIHRvIGhlbHAgZmluZCB0aGUgdmFsdWVzIGZvciAqLwogCQkJCS8qIHRoZSByZWdpc3RlcnMuICovCiAgIHVuc2lnbmVkIGxvbmcgbWFnaWM7CQkvKiBUbyB1bmlxdWVseSBpZGVudGlmeSBhIGNvcmUgZmlsZSAqLwogICBjaGFyIHVfY29tbVszMl07CQkvKiBVc2VyIGNvbW1hbmQgdGhhdCB3YXMgcmVzcG9uc2libGUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL2Eub3V0LmggYi9pbmNsdWRlL2FzbS1hdnIzMi9hLm91dC5oCmluZGV4IDlmMzk4YWIuLmU0NjM3NWEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi9hLm91dC5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL2Eub3V0LmgKQEAgLTE3LDExICsxNyw0IEBACiAjZGVmaW5lIE5fRFJTSVpFKGEpCSgoYSkuYV9kcnNpemUpCiAjZGVmaW5lIE5fU1lNU0laRShhKQkoKGEpLmFfc3ltcykKIAotI2lmZGVmIF9fS0VSTkVMX18KLQotI2RlZmluZSBTVEFDS19UT1AJVEFTS19TSVpFCi0jZGVmaW5lIFNUQUNLX1RPUF9NQVgJU1RBQ0tfVE9QCi0KLSNlbmRpZgotCiAjZW5kaWYgLyogX19BU01fQVZSMzJfQV9PVVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvYm9hcmQuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL2JvYXJkLmgKaW5kZXggZDY5OTNhNi4uNzU5N2IwYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvYm9hcmQuaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9ib2FyZC5oCkBAIC01MSw2ICs1MSw5IEBACiBhdDMyX2FkZF9kZXZpY2VfaWRlKHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IGV4dGludCwKIAkJICAgIHN0cnVjdCBpZGVfcGxhdGZvcm1fZGF0YSAqZGF0YSk7CiAKKy8qIG1hc2sgc2F5cyB3aGljaCBQV00gY2hhbm5lbHMgdG8gbXV4ICovCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphdDMyX2FkZF9kZXZpY2VfcHdtKHUzMiBtYXNrKTsKKwogLyogZGVwZW5kaW5nIG9uIHdoYXQncyBob29rZWQgdXAsIG5vdCBhbGwgU1NDIHBpbnMgd2lsbCBiZSB1c2VkICovCiAjZGVmaW5lCUFUTUVMX1NTQ19USwkJMHgwMQogI2RlZmluZQlBVE1FTF9TU0NfVEYJCTB4MDIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL2VsZi5oIGIvaW5jbHVkZS9hc20tYXZyMzIvZWxmLmgKaW5kZXggZDMzNGI0OS4uNjRjZTQwZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvZWxmLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvZWxmLmgKQEAgLTEwMyw4ICsxMDMsNiBAQAogCiAjZGVmaW5lIEVMRl9QTEFURk9STSAgKE5VTEwpCiAKLSNpZmRlZiBfX0tFUk5FTF9fCiAjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCwgaWJjczIpIHNldF9wZXJzb25hbGl0eShQRVJfTElOVVhfMzJCSVQpCi0jZW5kaWYKIAogI2VuZGlmIC8qIF9fQVNNX0FWUjMyX0VMRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9wYWdlLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9wYWdlLmgKaW5kZXggMGY2MzBiMy4uNTU4Mjk2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL3BhZ2UuaApAQCAtOCw4ICs4LDYgQEAKICNpZm5kZWYgX19BU01fQVZSMzJfUEFHRV9ICiAjZGVmaW5lIF9fQVNNX0FWUjMyX1BBR0VfSAogCi0jaWZkZWYgX19LRVJORUxfXwotCiAvKiBQQUdFX1NISUZUIGRldGVybWluZXMgdGhlIHBhZ2Ugc2l6ZSAqLwogI2RlZmluZSBQQUdFX1NISUZUCTEyCiAjaWZkZWYgX19BU1NFTUJMWV9fCkBAIC0zNiw2ICszNCw3IEBACiB0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcHRlOyB9IHB0ZV90OwogdHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBsb25nIHBnZDsgfSBwZ2RfdDsKIHR5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBwZ3Byb3Q7IH0gcGdwcm90X3Q7Cit0eXBlZGVmIHN0cnVjdCBwYWdlICpwZ3RhYmxlX3Q7CiAKICNkZWZpbmUgcHRlX3ZhbCh4KQkJKCh4KS5wdGUpCiAjZGVmaW5lIHBnZF92YWwoeCkJCSgoeCkucGdkKQpAQCAtMTA3LDYgKzEwNiw0IEBACiAgKi8KICNkZWZpbmUgSElHSE1FTV9TVEFSVAkJMHgyMDAwMDAwMFVMCiAKLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KICNlbmRpZiAvKiBfX0FTTV9BVlIzMl9QQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL3BnYWxsb2MuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL3BnYWxsb2MuaAppbmRleCBiNzdlMzY0Li41MWZjMWY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi9wZ2FsbG9jLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvcGdhbGxvYy5oCkBAIC0xNywxMCArMTcsMTEgQEAKIAlzZXRfcG1kKHBtZCwgX19wbWQoX1BBR0VfVEFCTEUgKyBfX3BhKHB0ZSkpKQogCiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHBtZF9wb3B1bGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcG1kX3QgKnBtZCwKLQkJCQkgICAgc3RydWN0IHBhZ2UgKnB0ZSkKKwkJCQkgICAgcGd0YWJsZV90IHB0ZSkKIHsKIAlzZXRfcG1kKHBtZCwgX19wbWQoX1BBR0VfVEFCTEUgKyBwYWdlX3RvX3BoeXMocHRlKSkpOwogfQorI2RlZmluZSBwbWRfcGd0YWJsZShwbWQpIHBtZF9wYWdlKHBtZCkKIAogLyoKICAqIEFsbG9jYXRlIGFuZCBmcmVlIHBhZ2UgdGFibGVzCkBAIC01MSw3ICs1Miw5IEBACiAJc3RydWN0IHBhZ2UgKnB0ZTsKIAogCXB0ZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCB8IF9fR0ZQX1JFUEVBVCB8IF9fR0ZQX1pFUk8pOwotCisJaWYgKCFwdGUpCisJCXJldHVybiBOVUxMOworCXBndGFibGVfcGFnZV9jdG9yKHB0ZSk7CiAJcmV0dXJuIHB0ZTsKIH0KIApAQCAtNjAsMTIgKzYzLDE3IEBACiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXB0ZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwdGVfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHBhZ2UgKnB0ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdGVfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcGd0YWJsZV90IHB0ZSkKIHsKKwlwZ3RhYmxlX3BhZ2VfZHRvcihwdGUpOwogCV9fZnJlZV9wYWdlKHB0ZSk7CiB9CiAKLSNkZWZpbmUgX19wdGVfZnJlZV90bGIodGxiLHB0ZSkgdGxiX3JlbW92ZV9wYWdlKCh0bGIpLChwdGUpKQorI2RlZmluZSBfX3B0ZV9mcmVlX3RsYih0bGIscHRlKQkJCQlcCitkbyB7CQkJCQkJCVwKKwlwZ3RhYmxlX3BhZ2VfZHRvcihwdGUpOwkJCQlcCisJdGxiX3JlbW92ZV9wYWdlKCh0bGIpLCBwdGUpOwkJCVwKK30gd2hpbGUgKDApCiAKICNkZWZpbmUgY2hlY2tfcGd0X2NhY2hlKCkgZG8geyB9IHdoaWxlKDApCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL3Bvc2l4X3R5cGVzLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9wb3NpeF90eXBlcy5oCmluZGV4IDllMjU1YjkuLmZlMGMwYzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWF2cjMyL3Bvc2l4X3R5cGVzLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvcG9zaXhfdHlwZXMuaApAQCAtNDYsMTEgKzQ2LDcgQEAKICNlbmRpZgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0jaWYgZGVmaW5lZChfX0tFUk5FTF9fKSB8fCBkZWZpbmVkKF9fVVNFX0FMTCkKICAgICBpbnQgICAgIHZhbFsyXTsKLSNlbHNlIC8qICFkZWZpbmVkKF9fS0VSTkVMX18pICYmICFkZWZpbmVkKF9fVVNFX0FMTCkgKi8KLSAgICBpbnQgICAgIF9fdmFsWzJdOwotI2VuZGlmIC8qICFkZWZpbmVkKF9fS0VSTkVMX18pICYmICFkZWZpbmVkKF9fVVNFX0FMTCkgKi8KIH0gX19rZXJuZWxfZnNpZF90OwogCiAjaWYgZGVmaW5lZChfX0tFUk5FTF9fKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9wcm9jZXNzb3IuaAppbmRleCA0MjEyNTUxLi40OWE4OGY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9wcm9jZXNzb3IuaApAQCAtMTMsNiArMTMsMTEgQEAKIAogI2RlZmluZSBUQVNLX1NJWkUJMHg4MDAwMDAwMAogCisjaWZkZWYgX19LRVJORUxfXworI2RlZmluZSBTVEFDS19UT1AJVEFTS19TSVpFCisjZGVmaW5lIFNUQUNLX1RPUF9NQVgJU1RBQ0tfVE9QCisjZW5kaWYKKwogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogc3RhdGljIGlubGluZSB2b2lkICpjdXJyZW50X3RleHRfYWRkcih2b2lkKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9zeXN0ZW0uaAppbmRleCBjNjAwY2MxLi45NzAyYzIyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvc3lzdGVtLmgKQEAgLTE0NSw2ICsxNDUsMjkgQEAKIAkJCQkgICAodW5zaWduZWQgbG9uZykobmV3KSwJXAogCQkJCSAgIHNpemVvZigqKHB0cikpKSkKIAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NtcHhjaGctbG9jYWwuaD4KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fY21weGNoZ19sb2NhbCh2b2xhdGlsZSB2b2lkICpwdHIsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBvbGQsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBuZXcsIGludCBzaXplKQoreworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgNDoKKwkJcmV0dXJuIF9fY21weGNoZ191MzIocHRyLCBvbGQsIG5ldyk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIF9fY21weGNoZ19sb2NhbF9nZW5lcmljKHB0ciwgb2xkLCBuZXcsIHNpemUpOworCX0KKworCXJldHVybiBvbGQ7Cit9CisKKyNkZWZpbmUgY21weGNoZ19sb2NhbChwdHIsIG9sZCwgbmV3KQkJCQkJXAorCSgodHlwZW9mKCoocHRyKSkpX19jbXB4Y2hnX2xvY2FsKChwdHIpLCAodW5zaWduZWQgbG9uZykob2xkKSwJXAorCQkJCSAgICh1bnNpZ25lZCBsb25nKShuZXcpLAkJXAorCQkJCSAgIHNpemVvZigqKHB0cikpKSkKKworI2RlZmluZSBjbXB4Y2hnNjRfbG9jYWwocHRyLCBvLCBuKSBfX2NtcHhjaGc2NF9sb2NhbF9nZW5lcmljKChwdHIpLCAobyksIChuKSkKKwogc3RydWN0IHB0X3JlZ3M7CiB2b2lkIE5PUkVUX1RZUEUgZGllKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyKTsKIHZvaWQgX2V4Y2VwdGlvbihsb25nIHNpZ25yLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGNvZGUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi91c2VyLmggYi9pbmNsdWRlL2FzbS1hdnIzMi91c2VyLmgKaW5kZXggMDYwZmIzYS4uN2U5MTUyZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvdXNlci5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL3VzZXIuaApAQCAtNTEsNyArNTEsNyBAQAogCXVuc2lnbmVkIGxvbmcJc3RhcnRfZGF0YTsJCS8qIGRhdGEgc3RhcnRpbmcgYWRkcmVzcyAqLwogCXVuc2lnbmVkIGxvbmcJc3RhcnRfc3RhY2s7CQkvKiBzdGFjayBzdGFydGluZyBhZGRyZXNzICovCiAJbG9uZyBpbnQJc2lnbmFsOwkJCS8qIHNpZ25hbCBjYXVzaW5nIGNvcmUgZHVtcCAqLwotCXN0cnVjdCByZWdzICoJdV9hcjA7CQkJLyogaGVscCBnZGIgZmluZCByZWdpc3RlcnMgKi8KKwl1bnNpZ25lZCBsb25nCXVfYXIwOwkJCS8qIGhlbHAgZ2RiIGZpbmQgcmVnaXN0ZXJzICovCiAJdW5zaWduZWQgbG9uZwltYWdpYzsJCQkvKiBpZGVudGlmaWVzIGEgY29yZSBmaWxlICovCiAJY2hhcgkJdV9jb21tWzMyXTsJCS8qIHVzZXIgY29tbWFuZCBuYW1lICovCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYmxhY2tmaW4vYS5vdXQuaCBiL2luY2x1ZGUvYXNtLWJsYWNrZmluL2Eub3V0LmgKaW5kZXggZDM3YTY4NC4uNmMzZDY1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYmxhY2tmaW4vYS5vdXQuaAorKysgYi9pbmNsdWRlL2FzbS1ibGFja2Zpbi9hLm91dC5oCkBAIC0xNiwxMCArMTYsNCBAQAogI2RlZmluZSBOX0RSU0laRShhKQkoKGEpLmFfZHJzaXplKQogI2RlZmluZSBOX1NZTVNJWkUoYSkJKChhKS5hX3N5bXMpCiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNkZWZpbmUgU1RBQ0tfVE9QCVRBU0tfU0laRQotCi0jZW5kaWYKLQogI2VuZGlmCQkJCS8qIF9fQkZJTl9BX09VVF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWJsYWNrZmluL2JmaW4tZ2xvYmFsLmggYi9pbmNsdWRlL2FzbS1ibGFja2Zpbi9iZmluLWdsb2JhbC5oCmluZGV4IDZhZTA2MTkuLjVkYmEzYTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWJsYWNrZmluL2JmaW4tZ2xvYmFsLmgKKysrIGIvaW5jbHVkZS9hc20tYmxhY2tmaW4vYmZpbi1nbG9iYWwuaApAQCAtNzAsNiArNzAsNyBAQAogZXh0ZXJuIHZvaWQgZXZ0MTRfc29mdGlycSh2b2lkKTsKIGV4dGVybiBhc21saW5rYWdlIHZvaWQgYXNtX2RvX0lSUSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBleHRlcm4gdm9pZCBiZmluX2dwaW9faW50ZXJydXB0X3NldHVwKGludCBpcnEsIGludCBpcnFfcGZ4LCBpbnQgdHlwZSk7CitleHRlcm4gaW50IGJmaW5faW50ZXJuYWxfc2V0X3dha2UodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHN0YXRlKTsKIAogZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBmaW5pc2hfYXRvbWljX3NlY3Rpb25zIChzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBleHRlcm4gY2hhciBmaXhlZF9jb2RlX3N0YXJ0OwpAQCAtMTIxLDYgKzEyMiw3IEBACiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHRhYmxlX3N0YXJ0LCB0YWJsZV9lbmQ7CiAKK2V4dGVybiB1bnNpZ25lZCBsb25nIGJmaW5fc2ljX2l3cltdOwogZXh0ZXJuIHUxNiBfYmZpbl9zd3JzdDsgLyogc2hhZG93IGZvciBTb2Z0d2FyZSBSZXNldCBSZWdpc3RlciAoU1dSU1QpICovCiBleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkcG1jX2ZvcHM7CiBleHRlcm4gY2hhciBfc3RhcnQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1ibGFja2Zpbi9iZmluNXh4X3NwaS5oIGIvaW5jbHVkZS9hc20tYmxhY2tmaW4vYmZpbjV4eF9zcGkuaAppbmRleCAxYTBiNTdmLi45ZmExOTE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1ibGFja2Zpbi9iZmluNXh4X3NwaS5oCisrKyBiL2luY2x1ZGUvYXNtLWJsYWNrZmluL2JmaW41eHhfc3BpLmgKQEAgLTEsNiArMSw2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIENvcHlyaWdodCAoQykgMjAwNCwgQW5hbG9nIERldmljZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCwgQW5hbG9nIERldmljZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICoKICogRklMRSBiZmluNXh4X3NwaS5oCiAqIFBST0dSQU1NRVIoUyk6IEx1a2UgWWFuZyAoQW5hbG9nIERldmljZXMgSW5jLikKQEAgLTMyLDQyICszMiw2IEBACiAjZGVmaW5lIFNQSV9CQVVEX09GRiAgICAgICAgICAgIDB4MTQKICNkZWZpbmUgU1BJX1NIQVdfT0ZGICAgICAgICAgICAgMHgxOAogCi0jZGVmaW5lIENNRF9TUElfT1VUX0VOQUJMRSAgICAxCi0jZGVmaW5lIENNRF9TUElfU0VUX0JBVURSQVRFICAyCi0jZGVmaW5lIENNRF9TUElfU0VUX1BPTEFSICAgICAzCi0jZGVmaW5lIENNRF9TUElfU0VUX1BIQVNFICAgICA0Ci0jZGVmaW5lIENNRF9TUElfU0VUX01BU1RFUiAgICA1Ci0jZGVmaW5lIENNRF9TUElfU0VUX1NFTkRPUFQgICA2Ci0jZGVmaW5lIENNRF9TUElfU0VUX1JFQ1ZPUFQgICA3Ci0jZGVmaW5lIENNRF9TUElfU0VUX09SREVSICAgICA4Ci0jZGVmaW5lIENNRF9TUElfU0VUX0xFTkdUSDE2ICA5Ci0jZGVmaW5lIENNRF9TUElfR0VUX1NUQVQgICAgICAxMQotI2RlZmluZSBDTURfU1BJX0dFVF9DRkcgICAgICAgMTIKLSNkZWZpbmUgQ01EX1NQSV9TRVRfQ1NBVkFJTCAgIDEzCi0jZGVmaW5lIENNRF9TUElfU0VUX0NTSElHSCAgICAxNAkvKiBDUyB1bmF2YWlsICovCi0jZGVmaW5lIENNRF9TUElfU0VUX0NTTE9XICAgICAxNQkvKiBDUyBhdmFpbCAqLwotI2RlZmluZSBDTURfU1BJX01JU09fRU5BQkxFICAgMTYKLSNkZWZpbmUgQ01EX1NQSV9TRVRfQ1NFTkFCTEUgIDE3Ci0jZGVmaW5lIENNRF9TUElfU0VUX0NTRElTQUJMRSAxOAotCi0jZGVmaW5lIENNRF9TUElfU0VUX1RSSUdHRVJfTU9ERSAgMTkKLSNkZWZpbmUgQ01EX1NQSV9TRVRfVFJJR0dFUl9TRU5TRSAyMAotI2RlZmluZSBDTURfU1BJX1NFVF9UUklHR0VSX0VER0UgIDIxCi0jZGVmaW5lIENNRF9TUElfU0VUX1RSSUdHRVJfTEVWRUwgMjIKLQotI2RlZmluZSBDTURfU1BJX1NFVF9USU1FX1NQUyAJICAyMwotI2RlZmluZSBDTURfU1BJX1NFVF9USU1FX1NBTVBMRVMgIDI0Ci0jZGVmaW5lIENNRF9TUElfR0VUX1NZU1RFTUNMT0NLICAgMjUKLQotI2RlZmluZSBDTURfU1BJX1NFVF9XUklURUNPTlRJTlVPVVMgICAgIDI2Ci0jZGVmaW5lIENNRF9TUElfU0VUX1NLRlMgICAgCQkyNwotCi0jZGVmaW5lIENNRF9TUElfR0VUX0FMTENPTkZJRyAzMgkvKiBGb3IgZGVidWcgKi8KLQotI2RlZmluZSBTUElfREVGQVVMVF9CQVJEICAgIDB4MDEwMAotCi0jZGVmaW5lIFNQSTBfSVJRX05VTSAgICAgICAgSVJRX1NQSQotI2RlZmluZSBTUElfRVJSX1RSSUcJICAgLTEKIAogI2RlZmluZSBCSVRfQ1RMX0VOQUJMRSAgICAgIDB4NDAwMAogI2RlZmluZSBCSVRfQ1RMX09QRU5EUkFJTiAgIDB4MjAwMApAQCAtMTQ4LDYgKzExMiwxMCBAQAogI2RlZmluZSBDRkdfU1BJX0NTNlZBTFVFICAgIDYKICNkZWZpbmUgQ0ZHX1NQSV9DUzdWQUxVRSAgICA3CiAKKyNkZWZpbmUgQ01EX1NQSV9TRVRfQkFVRFJBVEUgIDIKKyNkZWZpbmUgQ01EX1NQSV9HRVRfU1lTVEVNQ0xPQ0sgICAyNQorI2RlZmluZSBDTURfU1BJX1NFVF9XUklURUNPTlRJTlVPVVMgICAgIDI2CisKIC8qIGRldmljZS5wbGF0Zm9ybV9kYXRhIGZvciBTU1AgY29udHJvbGxlciBkZXZpY2VzICovCiBzdHJ1Y3QgYmZpbjV4eF9zcGlfbWFzdGVyIHsKIAl1MTYgbnVtX2NoaXBzZWxlY3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1ibGFja2Zpbi9kcG1jLmggYi9pbmNsdWRlL2FzbS1ibGFja2Zpbi9kcG1jLmgKaW5kZXggZjE2MmVkYi4uNjg2Y2Y4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYmxhY2tmaW4vZHBtYy5oCisrKyBiL2luY2x1ZGUvYXNtLWJsYWNrZmluL2RwbWMuaApAQCAtNTMsMTAgKzUzLDEwIEBACiB2b2lkIGNoYW5nZV9iYXVkKGludCBiYXVkKTsKIHZvaWQgZnVsbG9uX21vZGUodm9pZCk7CiB2b2lkIGFjdGl2ZV9tb2RlKHZvaWQpOwotdm9pZCBzbGVlcF9tb2RlKHUzMiBzaWNfaXdyKTsKLXZvaWQgZGVlcF9zbGVlcCh1MzIgc2ljX2l3cik7Ci12b2lkIGhpYmVybmF0ZV9tb2RlKHUzMiBzaWNfaXdyKTsKLXZvaWQgc2xlZXBfZGVlcGVyKHUzMiBzaWNfaXdyKTsKK3ZvaWQgc2xlZXBfbW9kZSh1MzIgc2ljX2l3cjAsIHUzMiBzaWNfaXdyMSwgdTMyIHNpY19pd3IyKTsKK3ZvaWQgZGVlcF9zbGVlcCh1MzIgc2ljX2l3cjAsIHUzMiBzaWNfaXdyMSwgdTMyIHNpY19pd3IyKTsKK3ZvaWQgaGliZXJuYXRlX21vZGUodTMyIHNpY19pd3IwLCB1MzIgc2ljX2l3cjEsIHUzMiBzaWNfaXdyMik7Cit2b2lkIHNsZWVwX2RlZXBlcih1MzIgc2ljX2l3cjAsIHUzMiBzaWNfaXdyMSwgdTMyIHNpY19pd3IyKTsKIHZvaWQgcHJvZ3JhbV93ZG9nX3RpbWVyKHVuc2lnbmVkIGxvbmcpOwogdm9pZCB1bm1hc2tfd2RvZ193YWtldXBfZXZ0KHZvaWQpOwogdm9pZCBjbGVhcl93ZG9nX3dha2V1cF9ldnQodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1ibGFja2Zpbi9lbGYuaCBiL2luY2x1ZGUvYXNtLWJsYWNrZmluL2VsZi5oCmluZGV4IDUyNjRiNTUuLjMwMzAzZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWJsYWNrZmluL2VsZi5oCisrKyBiL2luY2x1ZGUvYXNtLWJsYWNrZmluL2VsZi5oCkBAIC0xMjAsOCArMTIwLDYgQEAKIAogI2RlZmluZSBFTEZfUExBVEZPUk0gIChOVUxMKQogCi0jaWZkZWYgX19LRVJORUxfXwogI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgsIGliY3MyKSBzZXRfcGVyc29uYWxpdHkoKGliY3MyKT9QRVJfU1ZSNDpQRVJfTElOVVgpCi0jZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1ibGFja2Zpbi9ncGlvLmggYi9pbmNsdWRlL2FzbS1ibGFja2Zpbi9ncGlvLmgKaW5kZXggZDA0MjZjMS4uMjdmZjUzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYmxhY2tmaW4vZ3Bpby5oCisrKyBiL2luY2x1ZGUvYXNtLWJsYWNrZmluL2dwaW8uaApAQCAtMzc2LDE2ICszNzYsMTkgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BNCit1bnNpZ25lZCBpbnQgYmZpbl9wbV9zZXR1cCh2b2lkKTsKK3ZvaWQgYmZpbl9wbV9yZXN0b3JlKHZvaWQpOworCisjaWZuZGVmIENPTkZJR19CRjU0eAogI2RlZmluZSBQTV9XQUtFX1JJU0lORwkweDEKICNkZWZpbmUgUE1fV0FLRV9GQUxMSU5HCTB4MgogI2RlZmluZSBQTV9XQUtFX0hJR0gJMHg0CiAjZGVmaW5lIFBNX1dBS0VfTE9XCTB4OAogI2RlZmluZSBQTV9XQUtFX0JPVEhfRURHRVMJKFBNX1dBS0VfUklTSU5HIHwgUE1fV0FLRV9GQUxMSU5HKQorI2RlZmluZSBQTV9XQUtFX0lHTk9SRQkweEYwCiAKIGludCBncGlvX3BtX3dha2V1cF9yZXF1ZXN0KHVuc2lnbmVkIGdwaW8sIHVuc2lnbmVkIGNoYXIgdHlwZSk7CiB2b2lkIGdwaW9fcG1fd2FrZXVwX2ZyZWUodW5zaWduZWQgZ3Bpbyk7Ci11bnNpZ25lZCBpbnQgZ3Bpb19wbV9zZXR1cCh2b2lkKTsKLXZvaWQgZ3Bpb19wbV9yZXN0b3JlKHZvaWQpOwogCiBzdHJ1Y3QgZ3Bpb19wb3J0X3MgewogCXVuc2lnbmVkIHNob3J0IGRhdGE7CkBAIC00MDksNiArNDEyLDcgQEAKIAl1bnNpZ25lZCBzaG9ydCBmZXI7CiAJdW5zaWduZWQgc2hvcnQgcmVzZXJ2ZWQ7CiB9OworI2VuZGlmIC8qQ09ORklHX0JGNTR4Ki8KICNlbmRpZiAvKkNPTkZJR19QTSovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjU0OC9ibGFja2Zpbi5oIGIvaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjU0OC9ibGFja2Zpbi5oCmluZGV4IDE5ZTg0ZGQuLjNiZDY3ZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NDgvYmxhY2tmaW4uaAorKysgYi9pbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTQ4L2JsYWNrZmluLmgKQEAgLTQ2LDYgKzQ2LDEwIEBACiAjaW5jbHVkZSAiZGVmQkY1NDQuaCIKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0JGNTQ3CisjaW5jbHVkZSAiZGVmQkY1NDcuaCIKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX0JGNTQ4CiAjaW5jbHVkZSAiZGVmQkY1NDguaCIKICNlbmRpZgpAQCAtNTgsMTAgKzYyLDEyIEBACiAjaWZkZWYgQ09ORklHX0JGNTQyCiAjaW5jbHVkZSAiY2RlZkJGNTQyLmgiCiAjZW5kaWYKLQogI2lmZGVmIENPTkZJR19CRjU0NAogI2luY2x1ZGUgImNkZWZCRjU0NC5oIgogI2VuZGlmCisjaWZkZWYgQ09ORklHX0JGNTQ3CisjaW5jbHVkZSAiY2RlZkJGNTQ3LmgiCisjZW5kaWYKICNpZmRlZiBDT05GSUdfQkY1NDgKICNpbmNsdWRlICJjZGVmQkY1NDguaCIKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjU0OC9jZGVmQkY1NDcuaCBiL2luY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NDgvY2RlZkJGNTQ3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBhMjAwYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NDgvY2RlZkJGNTQ3LmgKQEAgLTAsMCArMSw4NjUgQEAKKy8qCisgKiBGaWxlOiAgICAgICAgIGluY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NDgvY2RlZkJGNTQ3LmgKKyAqIEJhc2VkIG9uOgorICogQXV0aG9yOgorICoKKyAqIENyZWF0ZWQ6CisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBSZXY6CisgKgorICogTW9kaWZpZWQ6CisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfQ0RFRl9CRjU0OF9ICisjZGVmaW5lIF9DREVGX0JGNTQ4X0gKKworLyogaW5jbHVkZSBhbGwgQ29yZSByZWdpc3RlcnMgYW5kIGJpdCBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgImRlZkJGNTQ4LmgiCisKKy8qIGluY2x1ZGUgY29yZSBzYmZpbl9yZWFkXygpZWNpZmljIHJlZ2lzdGVyIHBvaW50ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxhc20vbWFjaC1jb21tb24vY2RlZl9MUEJsYWNrZmluLmg+CisKKy8qIFNZU1RFTSAmIE1NUiBBRERSRVNTIERFRklOSVRJT05TIEZPUiBBRFNQLUJGNTQ4ICovCisKKy8qIGluY2x1ZGUgY2RlZkJGNTR4X2Jhc2UuaCBmb3IgdGhlIHNldCBvZiAjZGVmaW5lcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIEFEU1AtQkY1NHggYmZpbl9yZWFkXygpcm9jZXNzb3JzICovCisjaW5jbHVkZSAiY2RlZkJGNTR4X2Jhc2UuaCIKKworLyogVGhlIGZvbGxvd2luZyBhcmUgdGhlICNkZWZpbmVzIG5lZWRlZCBieSBBRFNQLUJGNTQ4IHRoYXQgYXJlIG5vdCBpbiB0aGUgY29tbW9uIGhlYWRlciAqLworCisvKiBUaW1lciBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBiZmluX3JlYWRfVElNRVI4X0NPTkZJRygpCWJmaW5fcmVhZDE2KFRJTUVSOF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI4X0NPTkZJRyh2YWwpCWJmaW5fd3JpdGUxNihUSU1FUjhfQ09ORklHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjhfQ09VTlRFUigpCWJmaW5fcmVhZDMyKFRJTUVSOF9DT1VOVEVSKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSOF9DT1VOVEVSKHZhbCkJYmZpbl93cml0ZTMyKFRJTUVSOF9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjhfUEVSSU9EKCkJYmZpbl9yZWFkMzIoVElNRVI4X1BFUklPRCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjhfUEVSSU9EKHZhbCkJYmZpbl93cml0ZTMyKFRJTUVSOF9QRVJJT0QsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSOF9XSURUSCgpCWJmaW5fcmVhZDMyKFRJTUVSOF9XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjhfV0lEVEgodmFsKQliZmluX3dyaXRlMzIoVElNRVI4X1dJRFRILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjlfQ09ORklHKCkJYmZpbl9yZWFkMTYoVElNRVI5X0NPTkZJRykKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjlfQ09ORklHKHZhbCkJYmZpbl93cml0ZTE2KFRJTUVSOV9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSOV9DT1VOVEVSKCkJYmZpbl9yZWFkMzIoVElNRVI5X0NPVU5URVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVI5X0NPVU5URVIodmFsKQliZmluX3dyaXRlMzIoVElNRVI5X0NPVU5URVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSOV9QRVJJT0QoKQliZmluX3JlYWQzMihUSU1FUjlfUEVSSU9EKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSOV9QRVJJT0QodmFsKQliZmluX3dyaXRlMzIoVElNRVI5X1BFUklPRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVI5X1dJRFRIKCkJYmZpbl9yZWFkMzIoVElNRVI5X1dJRFRIKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSOV9XSURUSCh2YWwpCWJmaW5fd3JpdGUzMihUSU1FUjlfV0lEVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMTBfQ09ORklHKCkJYmZpbl9yZWFkMTYoVElNRVIxMF9DT05GSUcpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVIxMF9DT05GSUcodmFsKQliZmluX3dyaXRlMTYoVElNRVIxMF9DT05GSUcsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSMTBfQ09VTlRFUigpCWJmaW5fcmVhZDMyKFRJTUVSMTBfQ09VTlRFUikKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjEwX0NPVU5URVIodmFsKQliZmluX3dyaXRlMzIoVElNRVIxMF9DT1VOVEVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjEwX1BFUklPRCgpCWJmaW5fcmVhZDMyKFRJTUVSMTBfUEVSSU9EKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSMTBfUEVSSU9EKHZhbCkJYmZpbl93cml0ZTMyKFRJTUVSMTBfUEVSSU9ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9USU1FUjEwX1dJRFRIKCkJYmZpbl9yZWFkMzIoVElNRVIxMF9XSURUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUjEwX1dJRFRIKHZhbCkJYmZpbl93cml0ZTMyKFRJTUVSMTBfV0lEVEgsIHZhbCkKKworLyogVGltZXIgR3JvdWJmaW5fcmVhZF8oKSBvZiAzICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX1RJTUVSX0VOQUJMRTEoKQliZmluX3JlYWQxNihUSU1FUl9FTkFCTEUxKQorI2RlZmluZSBiZmluX3dyaXRlX1RJTUVSX0VOQUJMRTEodmFsKQliZmluX3dyaXRlMTYoVElNRVJfRU5BQkxFMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVJfRElTQUJMRTEoKQliZmluX3JlYWQxNihUSU1FUl9ESVNBQkxFMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9USU1FUl9ESVNBQkxFMSh2YWwpCWJmaW5fd3JpdGUxNihUSU1FUl9ESVNBQkxFMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVElNRVJfU1RBVFVTMSgpCWJmaW5fcmVhZDMyKFRJTUVSX1NUQVRVUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfVElNRVJfU1RBVFVTMSh2YWwpCWJmaW5fd3JpdGUzMihUSU1FUl9TVEFUVVMxLCB2YWwpCisKKy8qIFNQT1JUMCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1RDUjEoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX1RDUjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RDUjEodmFsKQliZmluX3dyaXRlMTYoU1BPUlQwX1RDUjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UQ1IyKCkJCWJmaW5fcmVhZDE2KFNQT1JUMF9UQ1IyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UQ1IyKHZhbCkJYmZpbl93cml0ZTE2KFNQT1JUMF9UQ1IyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVENMS0RJVigpCWJmaW5fcmVhZDE2KFNQT1JUMF9UQ0xLRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9UQ0xLRElWKHZhbCkJYmZpbl93cml0ZTE2KFNQT1JUMF9UQ0xLRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfVEZTRElWKCkJYmZpbl9yZWFkMTYoU1BPUlQwX1RGU0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfVEZTRElWKHZhbCkJYmZpbl93cml0ZTE2KFNQT1JUMF9URlNESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9UWCgpCQliZmluX3JlYWQzMihTUE9SVDBfVFgpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1RYKHZhbCkJYmZpbl93cml0ZTMyKFNQT1JUMF9UWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JYKCkJCWJmaW5fcmVhZDMyKFNQT1JUMF9SWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUlgodmFsKQliZmluX3dyaXRlMzIoU1BPUlQwX1JYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfUkNSMSgpCQliZmluX3JlYWQxNihTUE9SVDBfUkNSMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfUkNSMSh2YWwpCWJmaW5fd3JpdGUxNihTUE9SVDBfUkNSMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1JDUjIoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX1JDUjIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JDUjIodmFsKQliZmluX3dyaXRlMTYoU1BPUlQwX1JDUjIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SQ0xLRElWKCkJYmZpbl9yZWFkMTYoU1BPUlQwX1JDTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1JDTEtESVYodmFsKQliZmluX3dyaXRlMTYoU1BPUlQwX1JDTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9SRlNESVYoKQliZmluX3JlYWQxNihTUE9SVDBfUkZTRElWKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9SRlNESVYodmFsKQliZmluX3dyaXRlMTYoU1BPUlQwX1JGU0RJViwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX1NUQVQoKQkJYmZpbl9yZWFkMTYoU1BPUlQwX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX1NUQVQodmFsKQliZmluX3dyaXRlMTYoU1BPUlQwX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9DSE5MKCkJCWJmaW5fcmVhZDE2KFNQT1JUMF9DSE5MKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9DSE5MKHZhbCkJYmZpbl93cml0ZTE2KFNQT1JUMF9DSE5MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTUNNQzEoKQliZmluX3JlYWQxNihTUE9SVDBfTUNNQzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01DTUMxKHZhbCkJYmZpbl93cml0ZTE2KFNQT1JUMF9NQ01DMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01DTUMyKCkJYmZpbl9yZWFkMTYoU1BPUlQwX01DTUMyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NQ01DMih2YWwpCWJmaW5fd3JpdGUxNihTUE9SVDBfTUNNQzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NVENTMCgpCWJmaW5fcmVhZDMyKFNQT1JUMF9NVENTMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVRDUzAodmFsKQliZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVRDUzEoKQliZmluX3JlYWQzMihTUE9SVDBfTVRDUzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01UQ1MxKHZhbCkJYmZpbl93cml0ZTMyKFNQT1JUMF9NVENTMSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01UQ1MyKCkJYmZpbl9yZWFkMzIoU1BPUlQwX01UQ1MyKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NVENTMih2YWwpCWJmaW5fd3JpdGUzMihTUE9SVDBfTVRDUzIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NVENTMygpCWJmaW5fcmVhZDMyKFNQT1JUMF9NVENTMykKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVRDUzModmFsKQliZmluX3dyaXRlMzIoU1BPUlQwX01UQ1MzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzAoKQliZmluX3JlYWQzMihTUE9SVDBfTVJDUzApCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01SQ1MwKHZhbCkJYmZpbl93cml0ZTMyKFNQT1JUMF9NUkNTMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BPUlQwX01SQ1MxKCkJYmZpbl9yZWFkMzIoU1BPUlQwX01SQ1MxKQorI2RlZmluZSBiZmluX3dyaXRlX1NQT1JUMF9NUkNTMSh2YWwpCWJmaW5fd3JpdGUzMihTUE9SVDBfTVJDUzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQT1JUMF9NUkNTMigpCWJmaW5fcmVhZDMyKFNQT1JUMF9NUkNTMikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUE9SVDBfTVJDUzIodmFsKQliZmluX3dyaXRlMzIoU1BPUlQwX01SQ1MyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUE9SVDBfTVJDUzMoKQliZmluX3JlYWQzMihTUE9SVDBfTVJDUzMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BPUlQwX01SQ1MzKHZhbCkJYmZpbl93cml0ZTMyKFNQT1JUMF9NUkNTMywgdmFsKQorCisvKiBFUFBJMCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBiZmluX3JlYWRfRVBQSTBfU1RBVFVTKCkJYmZpbl9yZWFkMTYoRVBQSTBfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX0VQUEkwX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihFUFBJMF9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VQUEkwX0hDT1VOVCgpCWJmaW5fcmVhZDE2KEVQUEkwX0hDT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FUFBJMF9IQ09VTlQodmFsKQliZmluX3dyaXRlMTYoRVBQSTBfSENPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FUFBJMF9IREVMQVkoKQliZmluX3JlYWQxNihFUFBJMF9IREVMQVkpCisjZGVmaW5lIGJmaW5fd3JpdGVfRVBQSTBfSERFTEFZKHZhbCkJYmZpbl93cml0ZTE2KEVQUEkwX0hERUxBWSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRVBQSTBfVkNPVU5UKCkJYmZpbl9yZWFkMTYoRVBQSTBfVkNPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX0VQUEkwX1ZDT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihFUFBJMF9WQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VQUEkwX1ZERUxBWSgpCWJmaW5fcmVhZDE2KEVQUEkwX1ZERUxBWSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FUFBJMF9WREVMQVkodmFsKQliZmluX3dyaXRlMTYoRVBQSTBfVkRFTEFZLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FUFBJMF9GUkFNRSgpCQliZmluX3JlYWQxNihFUFBJMF9GUkFNRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9FUFBJMF9GUkFNRSh2YWwpCWJmaW5fd3JpdGUxNihFUFBJMF9GUkFNRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRVBQSTBfTElORSgpCQliZmluX3JlYWQxNihFUFBJMF9MSU5FKQorI2RlZmluZSBiZmluX3dyaXRlX0VQUEkwX0xJTkUodmFsKQliZmluX3dyaXRlMTYoRVBQSTBfTElORSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRVBQSTBfQ0xLRElWKCkJYmZpbl9yZWFkMTYoRVBQSTBfQ0xLRElWKQorI2RlZmluZSBiZmluX3dyaXRlX0VQUEkwX0NMS0RJVih2YWwpCWJmaW5fd3JpdGUxNihFUFBJMF9DTEtESVYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VQUEkwX0NPTlRST0woKQliZmluX3JlYWQzMihFUFBJMF9DT05UUk9MKQorI2RlZmluZSBiZmluX3dyaXRlX0VQUEkwX0NPTlRST0wodmFsKQliZmluX3dyaXRlMzIoRVBQSTBfQ09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRVBQSTBfRlMxV19IQkwoKQliZmluX3JlYWQzMihFUFBJMF9GUzFXX0hCTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9FUFBJMF9GUzFXX0hCTCh2YWwpCWJmaW5fd3JpdGUzMihFUFBJMF9GUzFXX0hCTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfRVBQSTBfRlMxUF9BVlBMKCkJYmZpbl9yZWFkMzIoRVBQSTBfRlMxUF9BVlBMKQorI2RlZmluZSBiZmluX3dyaXRlX0VQUEkwX0ZTMVBfQVZQTCh2YWwpCWJmaW5fd3JpdGUzMihFUFBJMF9GUzFQX0FWUEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VQUEkwX0ZTMldfTFZCKCkJYmZpbl9yZWFkMzIoRVBQSTBfRlMyV19MVkIpCisjZGVmaW5lIGJmaW5fd3JpdGVfRVBQSTBfRlMyV19MVkIodmFsKQliZmluX3dyaXRlMzIoRVBQSTBfRlMyV19MVkIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0VQUEkwX0ZTMlBfTEFWRigpCWJmaW5fcmVhZDMyKEVQUEkwX0ZTMlBfTEFWRikKKyNkZWZpbmUgYmZpbl93cml0ZV9FUFBJMF9GUzJQX0xBVkYodmFsKQliZmluX3dyaXRlMzIoRVBQSTBfRlMyUF9MQVZGLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9FUFBJMF9DTElQKCkJCWJmaW5fcmVhZDMyKEVQUEkwX0NMSVApCisjZGVmaW5lIGJmaW5fd3JpdGVfRVBQSTBfQ0xJUCh2YWwpCWJmaW5fd3JpdGUzMihFUFBJMF9DTElQLCB2YWwpCisKKy8qIFVBUlQyIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMl9ETEwoKQkJYmZpbl9yZWFkMTYoVUFSVDJfRExMKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQyX0RMTCh2YWwpCWJmaW5fd3JpdGUxNihVQVJUMl9ETEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX0RMSCgpCQliZmluX3JlYWQxNihVQVJUMl9ETEgpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDJfRExIKHZhbCkJYmZpbl93cml0ZTE2KFVBUlQyX0RMSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDJfR0NUTCgpCQliZmluX3JlYWQxNihVQVJUMl9HQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQyX0dDVEwodmFsKQliZmluX3dyaXRlMTYoVUFSVDJfR0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDJfTENSKCkJCWJmaW5fcmVhZDE2KFVBUlQyX0xDUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMl9MQ1IodmFsKQliZmluX3dyaXRlMTYoVUFSVDJfTENSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMl9NQ1IoKQkJYmZpbl9yZWFkMTYoVUFSVDJfTUNSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQyX01DUih2YWwpCWJmaW5fd3JpdGUxNihVQVJUMl9NQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX0xTUigpCQliZmluX3JlYWQxNihVQVJUMl9MU1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDJfTFNSKHZhbCkJYmZpbl93cml0ZTE2KFVBUlQyX0xTUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDJfTVNSKCkJCWJmaW5fcmVhZDE2KFVBUlQyX01TUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VQVJUMl9NU1IodmFsKQliZmluX3dyaXRlMTYoVUFSVDJfTVNSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VQVJUMl9TQ1IoKQkJYmZpbl9yZWFkMTYoVUFSVDJfU0NSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQyX1NDUih2YWwpCWJmaW5fd3JpdGUxNihVQVJUMl9TQ1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX0lFUl9TRVQoKQliZmluX3JlYWQxNihVQVJUMl9JRVJfU0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQyX0lFUl9TRVQodmFsKQliZmluX3dyaXRlMTYoVUFSVDJfSUVSX1NFVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVUFSVDJfSUVSX0NMRUFSKCkJYmZpbl9yZWFkMTYoVUFSVDJfSUVSX0NMRUFSKQorI2RlZmluZSBiZmluX3dyaXRlX1VBUlQyX0lFUl9DTEVBUih2YWwpCWJmaW5fd3JpdGUxNihVQVJUMl9JRVJfQ0xFQVIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VBUlQyX1JCUigpCQliZmluX3JlYWQxNihVQVJUMl9SQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVUFSVDJfUkJSKHZhbCkJYmZpbl93cml0ZTE2KFVBUlQyX1JCUiwgdmFsKQorCisvKiBUd28gV2lyZSBJbnRlcmZhY2UgUmVnaXN0ZXJzIChUV0kxKSAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX0NMS0RJVigpCQkJYmZpbl9yZWFkMTYoVFdJMV9DTEtESVYpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMV9DTEtESVYodmFsKQkJYmZpbl93cml0ZTE2KFRXSTFfQ0xLRElWLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX0NPTlRST0woKQkJYmZpbl9yZWFkMTYoVFdJMV9DT05UUk9MKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTFfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoVFdJMV9DT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX1NMQVZFX0NUUkwoKQkJYmZpbl9yZWFkMTYoVFdJMV9TTEFWRV9DVFJMKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTFfU0xBVkVfQ1RSTCh2YWwpCQliZmluX3dyaXRlMTYoVFdJMV9TTEFWRV9DVFJMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX1NMQVZFX1NUQVQoKQkJYmZpbl9yZWFkMTYoVFdJMV9TTEFWRV9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTFfU0xBVkVfU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoVFdJMV9TTEFWRV9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX1NMQVZFX0FERFIoKQkJYmZpbl9yZWFkMTYoVFdJMV9TTEFWRV9BRERSKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTFfU0xBVkVfQUREUih2YWwpCQliZmluX3dyaXRlMTYoVFdJMV9TTEFWRV9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX01BU1RFUl9DVFJMKCkJCWJmaW5fcmVhZDE2KFRXSTFfTUFTVEVSX0NUUkwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMV9NQVNURVJfQ1RSTCh2YWwpCWJmaW5fd3JpdGUxNihUV0kxX01BU1RFUl9DVFJMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX01BU1RFUl9TVEFUKCkJCWJmaW5fcmVhZDE2KFRXSTFfTUFTVEVSX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMV9NQVNURVJfU1RBVCh2YWwpCWJmaW5fd3JpdGUxNihUV0kxX01BU1RFUl9TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX01BU1RFUl9BRERSKCkJCWJmaW5fcmVhZDE2KFRXSTFfTUFTVEVSX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMV9NQVNURVJfQUREUih2YWwpCWJmaW5fd3JpdGUxNihUV0kxX01BU1RFUl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX0lOVF9TVEFUKCkJCWJmaW5fcmVhZDE2KFRXSTFfSU5UX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMV9JTlRfU1RBVCh2YWwpCQliZmluX3dyaXRlMTYoVFdJMV9JTlRfU1RBVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMV9JTlRfTUFTSygpCQliZmluX3JlYWQxNihUV0kxX0lOVF9NQVNLKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTFfSU5UX01BU0sodmFsKQkJYmZpbl93cml0ZTE2KFRXSTFfSU5UX01BU0ssIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTFfRklGT19DVFJMKCkJCWJmaW5fcmVhZDE2KFRXSTFfRklGT19DVFJMKQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTFfRklGT19DVFJMKHZhbCkJCWJmaW5fd3JpdGUxNihUV0kxX0ZJRk9fQ1RSTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMV9GSUZPX1NUQVQoKQkJYmZpbl9yZWFkMTYoVFdJMV9GSUZPX1NUQVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMV9GSUZPX1NUQVQodmFsKQkJYmZpbl93cml0ZTE2KFRXSTFfRklGT19TVEFULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9UV0kxX1hNVF9EQVRBOCgpCQliZmluX3JlYWQxNihUV0kxX1hNVF9EQVRBOCkKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kxX1hNVF9EQVRBOCh2YWwpCQliZmluX3dyaXRlMTYoVFdJMV9YTVRfREFUQTgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTFfWE1UX0RBVEExNigpCQliZmluX3JlYWQxNihUV0kxX1hNVF9EQVRBMTYpCisjZGVmaW5lIGJmaW5fd3JpdGVfVFdJMV9YTVRfREFUQTE2KHZhbCkJCWJmaW5fd3JpdGUxNihUV0kxX1hNVF9EQVRBMTYsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1RXSTFfUkNWX0RBVEE4KCkJCWJmaW5fcmVhZDE2KFRXSTFfUkNWX0RBVEE4KQorI2RlZmluZSBiZmluX3dyaXRlX1RXSTFfUkNWX0RBVEE4KHZhbCkJCWJmaW5fd3JpdGUxNihUV0kxX1JDVl9EQVRBOCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVFdJMV9SQ1ZfREFUQTE2KCkJCWJmaW5fcmVhZDE2KFRXSTFfUkNWX0RBVEExNikKKyNkZWZpbmUgYmZpbl93cml0ZV9UV0kxX1JDVl9EQVRBMTYodmFsKQkJYmZpbl93cml0ZTE2KFRXSTFfUkNWX0RBVEExNiwgdmFsKQorCisvKiBTUEkyICBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBiZmluX3JlYWRfU1BJMl9DVEwoKQkJYmZpbl9yZWFkMTYoU1BJMl9DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMl9DVEwodmFsKQliZmluX3dyaXRlMTYoU1BJMl9DVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSTJfRkxHKCkJCWJmaW5fcmVhZDE2KFNQSTJfRkxHKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSTJfRkxHKHZhbCkJYmZpbl93cml0ZTE2KFNQSTJfRkxHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkyX1NUQVQoKQkJYmZpbl9yZWFkMTYoU1BJMl9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSTJfU1RBVCh2YWwpCWJmaW5fd3JpdGUxNihTUEkyX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSTJfVERCUigpCQliZmluX3JlYWQxNihTUEkyX1REQlIpCisjZGVmaW5lIGJmaW5fd3JpdGVfU1BJMl9UREJSKHZhbCkJYmZpbl93cml0ZTE2KFNQSTJfVERCUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU1BJMl9SREJSKCkJCWJmaW5fcmVhZDE2KFNQSTJfUkRCUikKKyNkZWZpbmUgYmZpbl93cml0ZV9TUEkyX1JEQlIodmFsKQliZmluX3dyaXRlMTYoU1BJMl9SREJSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TUEkyX0JBVUQoKQkJYmZpbl9yZWFkMTYoU1BJMl9CQVVEKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSTJfQkFVRCh2YWwpCWJmaW5fd3JpdGUxNihTUEkyX0JBVUQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NQSTJfU0hBRE9XKCkJCWJmaW5fcmVhZDE2KFNQSTJfU0hBRE9XKQorI2RlZmluZSBiZmluX3dyaXRlX1NQSTJfU0hBRE9XKHZhbCkJYmZpbl93cml0ZTE2KFNQSTJfU0hBRE9XLCB2YWwpCisKKy8qIEFUQVBJIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9BVEFQSV9DT05UUk9MKCkJCWJmaW5fcmVhZDE2KEFUQVBJX0NPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfQVRBUElfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoQVRBUElfQ09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQVRBUElfU1RBVFVTKCkJCWJmaW5fcmVhZDE2KEFUQVBJX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9BVEFQSV9TVEFUVVModmFsKQkJYmZpbl93cml0ZTE2KEFUQVBJX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQVRBUElfREVWX0FERFIoKQkJYmZpbl9yZWFkMTYoQVRBUElfREVWX0FERFIpCisjZGVmaW5lIGJmaW5fd3JpdGVfQVRBUElfREVWX0FERFIodmFsKQkJYmZpbl93cml0ZTE2KEFUQVBJX0RFVl9BRERSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9BVEFQSV9ERVZfVFhCVUYoKQkJYmZpbl9yZWFkMTYoQVRBUElfREVWX1RYQlVGKQorI2RlZmluZSBiZmluX3dyaXRlX0FUQVBJX0RFVl9UWEJVRih2YWwpCQliZmluX3dyaXRlMTYoQVRBUElfREVWX1RYQlVGLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9BVEFQSV9ERVZfUlhCVUYoKQkJYmZpbl9yZWFkMTYoQVRBUElfREVWX1JYQlVGKQorI2RlZmluZSBiZmluX3dyaXRlX0FUQVBJX0RFVl9SWEJVRih2YWwpCQliZmluX3dyaXRlMTYoQVRBUElfREVWX1JYQlVGLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9BVEFQSV9JTlRfTUFTSygpCQliZmluX3JlYWQxNihBVEFQSV9JTlRfTUFTSykKKyNkZWZpbmUgYmZpbl93cml0ZV9BVEFQSV9JTlRfTUFTSyh2YWwpCQliZmluX3dyaXRlMTYoQVRBUElfSU5UX01BU0ssIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0FUQVBJX0lOVF9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoQVRBUElfSU5UX1NUQVRVUykKKyNkZWZpbmUgYmZpbl93cml0ZV9BVEFQSV9JTlRfU1RBVFVTKHZhbCkJYmZpbl93cml0ZTE2KEFUQVBJX0lOVF9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0FUQVBJX1hGRVJfTEVOKCkJCWJmaW5fcmVhZDE2KEFUQVBJX1hGRVJfTEVOKQorI2RlZmluZSBiZmluX3dyaXRlX0FUQVBJX1hGRVJfTEVOKHZhbCkJCWJmaW5fd3JpdGUxNihBVEFQSV9YRkVSX0xFTiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQVRBUElfTElORV9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoQVRBUElfTElORV9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfQVRBUElfTElORV9TVEFUVVModmFsKQliZmluX3dyaXRlMTYoQVRBUElfTElORV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0FUQVBJX1NNX1NUQVRFKCkJCWJmaW5fcmVhZDE2KEFUQVBJX1NNX1NUQVRFKQorI2RlZmluZSBiZmluX3dyaXRlX0FUQVBJX1NNX1NUQVRFKHZhbCkJCWJmaW5fd3JpdGUxNihBVEFQSV9TTV9TVEFURSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQVRBUElfVEVSTUlOQVRFKCkJCWJmaW5fcmVhZDE2KEFUQVBJX1RFUk1JTkFURSkKKyNkZWZpbmUgYmZpbl93cml0ZV9BVEFQSV9URVJNSU5BVEUodmFsKQkJYmZpbl93cml0ZTE2KEFUQVBJX1RFUk1JTkFURSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQVRBUElfUElPX1RGUkNOVCgpCQliZmluX3JlYWQxNihBVEFQSV9QSU9fVEZSQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX0FUQVBJX1BJT19URlJDTlQodmFsKQliZmluX3dyaXRlMTYoQVRBUElfUElPX1RGUkNOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQVRBUElfRE1BX1RGUkNOVCgpCQliZmluX3JlYWQxNihBVEFQSV9ETUFfVEZSQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX0FUQVBJX0RNQV9URlJDTlQodmFsKQliZmluX3dyaXRlMTYoQVRBUElfRE1BX1RGUkNOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQVRBUElfVU1BSU5fVEZSQ05UKCkJCWJmaW5fcmVhZDE2KEFUQVBJX1VNQUlOX1RGUkNOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9BVEFQSV9VTUFJTl9URlJDTlQodmFsKQliZmluX3dyaXRlMTYoQVRBUElfVU1BSU5fVEZSQ05ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9BVEFQSV9VRE1BT1VUX1RGUkNOVCgpCWJmaW5fcmVhZDE2KEFUQVBJX1VETUFPVVRfVEZSQ05UKQorI2RlZmluZSBiZmluX3dyaXRlX0FUQVBJX1VETUFPVVRfVEZSQ05UKHZhbCkJYmZpbl93cml0ZTE2KEFUQVBJX1VETUFPVVRfVEZSQ05ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9BVEFQSV9SRUdfVElNXzAoKQkJYmZpbl9yZWFkMTYoQVRBUElfUkVHX1RJTV8wKQorI2RlZmluZSBiZmluX3dyaXRlX0FUQVBJX1JFR19USU1fMCh2YWwpCQliZmluX3dyaXRlMTYoQVRBUElfUkVHX1RJTV8wLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9BVEFQSV9QSU9fVElNXzAoKQkJYmZpbl9yZWFkMTYoQVRBUElfUElPX1RJTV8wKQorI2RlZmluZSBiZmluX3dyaXRlX0FUQVBJX1BJT19USU1fMCh2YWwpCQliZmluX3dyaXRlMTYoQVRBUElfUElPX1RJTV8wLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9BVEFQSV9QSU9fVElNXzEoKQkJYmZpbl9yZWFkMTYoQVRBUElfUElPX1RJTV8xKQorI2RlZmluZSBiZmluX3dyaXRlX0FUQVBJX1BJT19USU1fMSh2YWwpCQliZmluX3dyaXRlMTYoQVRBUElfUElPX1RJTV8xLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9BVEFQSV9NVUxUSV9USU1fMCgpCQliZmluX3JlYWQxNihBVEFQSV9NVUxUSV9USU1fMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9BVEFQSV9NVUxUSV9USU1fMCh2YWwpCWJmaW5fd3JpdGUxNihBVEFQSV9NVUxUSV9USU1fMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQVRBUElfTVVMVElfVElNXzEoKQkJYmZpbl9yZWFkMTYoQVRBUElfTVVMVElfVElNXzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQVRBUElfTVVMVElfVElNXzEodmFsKQliZmluX3dyaXRlMTYoQVRBUElfTVVMVElfVElNXzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0FUQVBJX01VTFRJX1RJTV8yKCkJCWJmaW5fcmVhZDE2KEFUQVBJX01VTFRJX1RJTV8yKQorI2RlZmluZSBiZmluX3dyaXRlX0FUQVBJX01VTFRJX1RJTV8yKHZhbCkJYmZpbl93cml0ZTE2KEFUQVBJX01VTFRJX1RJTV8yLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9BVEFQSV9VTFRSQV9USU1fMCgpCQliZmluX3JlYWQxNihBVEFQSV9VTFRSQV9USU1fMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9BVEFQSV9VTFRSQV9USU1fMCh2YWwpCWJmaW5fd3JpdGUxNihBVEFQSV9VTFRSQV9USU1fMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfQVRBUElfVUxUUkFfVElNXzEoKQkJYmZpbl9yZWFkMTYoQVRBUElfVUxUUkFfVElNXzEpCisjZGVmaW5lIGJmaW5fd3JpdGVfQVRBUElfVUxUUkFfVElNXzEodmFsKQliZmluX3dyaXRlMTYoQVRBUElfVUxUUkFfVElNXzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0FUQVBJX1VMVFJBX1RJTV8yKCkJCWJmaW5fcmVhZDE2KEFUQVBJX1VMVFJBX1RJTV8yKQorI2RlZmluZSBiZmluX3dyaXRlX0FUQVBJX1VMVFJBX1RJTV8yKHZhbCkJYmZpbl93cml0ZTE2KEFUQVBJX1VMVFJBX1RJTV8yLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9BVEFQSV9VTFRSQV9USU1fMygpCQliZmluX3JlYWQxNihBVEFQSV9VTFRSQV9USU1fMykKKyNkZWZpbmUgYmZpbl93cml0ZV9BVEFQSV9VTFRSQV9USU1fMyh2YWwpCWJmaW5fd3JpdGUxNihBVEFQSV9VTFRSQV9USU1fMywgdmFsKQorCisvKiBTREggUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX1NESF9QV1JfQ1RMKCkJCWJmaW5fcmVhZDE2KFNESF9QV1JfQ1RMKQorI2RlZmluZSBiZmluX3dyaXRlX1NESF9QV1JfQ1RMKHZhbCkJYmZpbl93cml0ZTE2KFNESF9QV1JfQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TREhfQ0xLX0NUTCgpCQliZmluX3JlYWQxNihTREhfQ0xLX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TREhfQ0xLX0NUTCh2YWwpCWJmaW5fd3JpdGUxNihTREhfQ0xLX0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0RIX0FSR1VNRU5UKCkJYmZpbl9yZWFkMzIoU0RIX0FSR1VNRU5UKQorI2RlZmluZSBiZmluX3dyaXRlX1NESF9BUkdVTUVOVCh2YWwpCWJmaW5fd3JpdGUzMihTREhfQVJHVU1FTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NESF9DT01NQU5EKCkJCWJmaW5fcmVhZDE2KFNESF9DT01NQU5EKQorI2RlZmluZSBiZmluX3dyaXRlX1NESF9DT01NQU5EKHZhbCkJYmZpbl93cml0ZTE2KFNESF9DT01NQU5ELCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TREhfUkVTUF9DTUQoKQliZmluX3JlYWQxNihTREhfUkVTUF9DTUQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0RIX1JFU1BfQ01EKHZhbCkJYmZpbl93cml0ZTE2KFNESF9SRVNQX0NNRCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0RIX1JFU1BPTlNFMCgpCWJmaW5fcmVhZDMyKFNESF9SRVNQT05TRTApCisjZGVmaW5lIGJmaW5fd3JpdGVfU0RIX1JFU1BPTlNFMCh2YWwpCWJmaW5fd3JpdGUzMihTREhfUkVTUE9OU0UwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TREhfUkVTUE9OU0UxKCkJYmZpbl9yZWFkMzIoU0RIX1JFU1BPTlNFMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9TREhfUkVTUE9OU0UxKHZhbCkJYmZpbl93cml0ZTMyKFNESF9SRVNQT05TRTEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NESF9SRVNQT05TRTIoKQliZmluX3JlYWQzMihTREhfUkVTUE9OU0UyKQorI2RlZmluZSBiZmluX3dyaXRlX1NESF9SRVNQT05TRTIodmFsKQliZmluX3dyaXRlMzIoU0RIX1JFU1BPTlNFMiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0RIX1JFU1BPTlNFMygpCWJmaW5fcmVhZDMyKFNESF9SRVNQT05TRTMpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0RIX1JFU1BPTlNFMyh2YWwpCWJmaW5fd3JpdGUzMihTREhfUkVTUE9OU0UzLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TREhfREFUQV9USU1FUigpCWJmaW5fcmVhZDMyKFNESF9EQVRBX1RJTUVSKQorI2RlZmluZSBiZmluX3dyaXRlX1NESF9EQVRBX1RJTUVSKHZhbCkJYmZpbl93cml0ZTMyKFNESF9EQVRBX1RJTUVSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TREhfREFUQV9MR1RIKCkJYmZpbl9yZWFkMTYoU0RIX0RBVEFfTEdUSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TREhfREFUQV9MR1RIKHZhbCkJYmZpbl93cml0ZTE2KFNESF9EQVRBX0xHVEgsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NESF9EQVRBX0NUTCgpCWJmaW5fcmVhZDE2KFNESF9EQVRBX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TREhfREFUQV9DVEwodmFsKQliZmluX3dyaXRlMTYoU0RIX0RBVEFfQ1RMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TREhfREFUQV9DTlQoKQliZmluX3JlYWQxNihTREhfREFUQV9DTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0RIX0RBVEFfQ05UKHZhbCkJYmZpbl93cml0ZTE2KFNESF9EQVRBX0NOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0RIX1NUQVRVUygpCQliZmluX3JlYWQzMihTREhfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX1NESF9TVEFUVVModmFsKQliZmluX3dyaXRlMzIoU0RIX1NUQVRVUywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0RIX1NUQVRVU19DTFIoKQliZmluX3JlYWQxNihTREhfU1RBVFVTX0NMUikKKyNkZWZpbmUgYmZpbl93cml0ZV9TREhfU1RBVFVTX0NMUih2YWwpCWJmaW5fd3JpdGUxNihTREhfU1RBVFVTX0NMUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0RIX01BU0swKCkJCWJmaW5fcmVhZDMyKFNESF9NQVNLMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TREhfTUFTSzAodmFsKQliZmluX3dyaXRlMzIoU0RIX01BU0swLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TREhfTUFTSzEoKQkJYmZpbl9yZWFkMzIoU0RIX01BU0sxKQorI2RlZmluZSBiZmluX3dyaXRlX1NESF9NQVNLMSh2YWwpCWJmaW5fd3JpdGUzMihTREhfTUFTSzEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NESF9GSUZPX0NOVCgpCWJmaW5fcmVhZDE2KFNESF9GSUZPX0NOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TREhfRklGT19DTlQodmFsKQliZmluX3dyaXRlMTYoU0RIX0ZJRk9fQ05ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TREhfRklGTygpCQliZmluX3JlYWQzMihTREhfRklGTykKKyNkZWZpbmUgYmZpbl93cml0ZV9TREhfRklGTyh2YWwpCWJmaW5fd3JpdGUzMihTREhfRklGTywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0RIX0VfU1RBVFVTKCkJYmZpbl9yZWFkMTYoU0RIX0VfU1RBVFVTKQorI2RlZmluZSBiZmluX3dyaXRlX1NESF9FX1NUQVRVUyh2YWwpCWJmaW5fd3JpdGUxNihTREhfRV9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NESF9FX01BU0soKQkJYmZpbl9yZWFkMTYoU0RIX0VfTUFTSykKKyNkZWZpbmUgYmZpbl93cml0ZV9TREhfRV9NQVNLKHZhbCkJYmZpbl93cml0ZTE2KFNESF9FX01BU0ssIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NESF9DRkcoKQkJYmZpbl9yZWFkMTYoU0RIX0NGRykKKyNkZWZpbmUgYmZpbl93cml0ZV9TREhfQ0ZHKHZhbCkJCWJmaW5fd3JpdGUxNihTREhfQ0ZHLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TREhfUkRfV0FJVF9FTigpCWJmaW5fcmVhZDE2KFNESF9SRF9XQUlUX0VOKQorI2RlZmluZSBiZmluX3dyaXRlX1NESF9SRF9XQUlUX0VOKHZhbCkJYmZpbl93cml0ZTE2KFNESF9SRF9XQUlUX0VOLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TREhfUElEMCgpCQliZmluX3JlYWQxNihTREhfUElEMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9TREhfUElEMCh2YWwpCWJmaW5fd3JpdGUxNihTREhfUElEMCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0RIX1BJRDEoKQkJYmZpbl9yZWFkMTYoU0RIX1BJRDEpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0RIX1BJRDEodmFsKQliZmluX3dyaXRlMTYoU0RIX1BJRDEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NESF9QSUQyKCkJCWJmaW5fcmVhZDE2KFNESF9QSUQyKQorI2RlZmluZSBiZmluX3dyaXRlX1NESF9QSUQyKHZhbCkJYmZpbl93cml0ZTE2KFNESF9QSUQyLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TREhfUElEMygpCQliZmluX3JlYWQxNihTREhfUElEMykKKyNkZWZpbmUgYmZpbl93cml0ZV9TREhfUElEMyh2YWwpCWJmaW5fd3JpdGUxNihTREhfUElEMywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0RIX1BJRDQoKQkJYmZpbl9yZWFkMTYoU0RIX1BJRDQpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0RIX1BJRDQodmFsKQliZmluX3dyaXRlMTYoU0RIX1BJRDQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1NESF9QSUQ1KCkJCWJmaW5fcmVhZDE2KFNESF9QSUQ1KQorI2RlZmluZSBiZmluX3dyaXRlX1NESF9QSUQ1KHZhbCkJYmZpbl93cml0ZTE2KFNESF9QSUQ1LCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9TREhfUElENigpCQliZmluX3JlYWQxNihTREhfUElENikKKyNkZWZpbmUgYmZpbl93cml0ZV9TREhfUElENih2YWwpCWJmaW5fd3JpdGUxNihTREhfUElENiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0RIX1BJRDcoKQkJYmZpbl9yZWFkMTYoU0RIX1BJRDcpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0RIX1BJRDcodmFsKQliZmluX3dyaXRlMTYoU0RIX1BJRDcsIHZhbCkKKworLyogSE9TVCBQb3J0IFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9IT1NUX0NPTlRST0woKQliZmluX3JlYWQxNihIT1NUX0NPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE9TVF9DT05UUk9MKHZhbCkJYmZpbl93cml0ZTE2KEhPU1RfQ09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE9TVF9TVEFUVVMoKQkJYmZpbl9yZWFkMTYoSE9TVF9TVEFUVVMpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE9TVF9TVEFUVVModmFsKQliZmluX3dyaXRlMTYoSE9TVF9TVEFUVVMsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hPU1RfVElNRU9VVCgpCWJmaW5fcmVhZDE2KEhPU1RfVElNRU9VVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9IT1NUX1RJTUVPVVQodmFsKQliZmluX3dyaXRlMTYoSE9TVF9USU1FT1VULCB2YWwpCisKKy8qIFVTQiBDb250cm9sIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRkFERFIoKQkJYmZpbl9yZWFkMTYoVVNCX0ZBRERSKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9GQUREUih2YWwpCWJmaW5fd3JpdGUxNihVU0JfRkFERFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9QT1dFUigpCQliZmluX3JlYWQxNihVU0JfUE9XRVIpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX1BPV0VSKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9QT1dFUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0lOVFJUWCgpCQliZmluX3JlYWQxNihVU0JfSU5UUlRYKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9JTlRSVFgodmFsKQliZmluX3dyaXRlMTYoVVNCX0lOVFJUWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0lOVFJSWCgpCQliZmluX3JlYWQxNihVU0JfSU5UUlJYKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9JTlRSUlgodmFsKQliZmluX3dyaXRlMTYoVVNCX0lOVFJSWCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0lOVFJUWEUoKQkJYmZpbl9yZWFkMTYoVVNCX0lOVFJUWEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0lOVFJUWEUodmFsKQliZmluX3dyaXRlMTYoVVNCX0lOVFJUWEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9JTlRSUlhFKCkJCWJmaW5fcmVhZDE2KFVTQl9JTlRSUlhFKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9JTlRSUlhFKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9JTlRSUlhFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfSU5UUlVTQigpCQliZmluX3JlYWQxNihVU0JfSU5UUlVTQikKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfSU5UUlVTQih2YWwpCWJmaW5fd3JpdGUxNihVU0JfSU5UUlVTQiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0lOVFJVU0JFKCkJYmZpbl9yZWFkMTYoVVNCX0lOVFJVU0JFKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9JTlRSVVNCRSh2YWwpCWJmaW5fd3JpdGUxNihVU0JfSU5UUlVTQkUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9GUkFNRSgpCQliZmluX3JlYWQxNihVU0JfRlJBTUUpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0ZSQU1FKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9GUkFNRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0lOREVYKCkJCWJmaW5fcmVhZDE2KFVTQl9JTkRFWCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfSU5ERVgodmFsKQliZmluX3dyaXRlMTYoVVNCX0lOREVYLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfVEVTVE1PREUoKQliZmluX3JlYWQxNihVU0JfVEVTVE1PREUpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX1RFU1RNT0RFKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9URVNUTU9ERSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0dMT0JJTlRSKCkJYmZpbl9yZWFkMTYoVVNCX0dMT0JJTlRSKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9HTE9CSU5UUih2YWwpCWJmaW5fd3JpdGUxNihVU0JfR0xPQklOVFIsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9HTE9CQUxfQ1RMKCkJYmZpbl9yZWFkMTYoVVNCX0dMT0JBTF9DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0dMT0JBTF9DVEwodmFsKQkJYmZpbl93cml0ZTE2KFVTQl9HTE9CQUxfQ1RMLCB2YWwpCisKKy8qIFVTQiBQYWNrZXQgQ29udHJvbCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBiZmluX3JlYWRfVVNCX1RYX01BWF9QQUNLRVQoKQkJYmZpbl9yZWFkMTYoVVNCX1RYX01BWF9QQUNLRVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX1RYX01BWF9QQUNLRVQodmFsKQliZmluX3dyaXRlMTYoVVNCX1RYX01BWF9QQUNLRVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9DU1IwKCkJCWJmaW5fcmVhZDE2KFVTQl9DU1IwKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9DU1IwKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9DU1IwLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfVFhDU1IoKQkJYmZpbl9yZWFkMTYoVVNCX1RYQ1NSKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9UWENTUih2YWwpCWJmaW5fd3JpdGUxNihVU0JfVFhDU1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9SWF9NQVhfUEFDS0VUKCkJCWJmaW5fcmVhZDE2KFVTQl9SWF9NQVhfUEFDS0VUKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9SWF9NQVhfUEFDS0VUKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9SWF9NQVhfUEFDS0VULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfUlhDU1IoKQkJYmZpbl9yZWFkMTYoVVNCX1JYQ1NSKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9SWENTUih2YWwpCWJmaW5fd3JpdGUxNihVU0JfUlhDU1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9DT1VOVDAoKQkJYmZpbl9yZWFkMTYoVVNCX0NPVU5UMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfQ09VTlQwKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9DT1VOVDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9SWENPVU5UKCkJCWJmaW5fcmVhZDE2KFVTQl9SWENPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9SWENPVU5UKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9SWENPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfVFhUWVBFKCkJCWJmaW5fcmVhZDE2KFVTQl9UWFRZUEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX1RYVFlQRSh2YWwpCWJmaW5fd3JpdGUxNihVU0JfVFhUWVBFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfTkFLTElNSVQwKCkJYmZpbl9yZWFkMTYoVVNCX05BS0xJTUlUMCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfTkFLTElNSVQwKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9OQUtMSU1JVDAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9UWElOVEVSVkFMKCkJYmZpbl9yZWFkMTYoVVNCX1RYSU5URVJWQUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX1RYSU5URVJWQUwodmFsKQliZmluX3dyaXRlMTYoVVNCX1RYSU5URVJWQUwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9SWFRZUEUoKQkJYmZpbl9yZWFkMTYoVVNCX1JYVFlQRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfUlhUWVBFKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9SWFRZUEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9SWElOVEVSVkFMKCkJYmZpbl9yZWFkMTYoVVNCX1JYSU5URVJWQUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX1JYSU5URVJWQUwodmFsKQliZmluX3dyaXRlMTYoVVNCX1JYSU5URVJWQUwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9UWENPVU5UKCkJCWJmaW5fcmVhZDE2KFVTQl9UWENPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9UWENPVU5UKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9UWENPVU5ULCB2YWwpCisKKy8qIFVTQiBFbmRiZmluX3JlYWRfKClvaW50IEZJRk8gUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUDBfRklGTygpCWJmaW5fcmVhZDE2KFVTQl9FUDBfRklGTykKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVAwX0ZJRk8odmFsKQliZmluX3dyaXRlMTYoVVNCX0VQMF9GSUZPLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVAxX0ZJRk8oKQliZmluX3JlYWQxNihVU0JfRVAxX0ZJRk8pCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQMV9GSUZPKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUDFfRklGTywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQMl9GSUZPKCkJYmZpbl9yZWFkMTYoVVNCX0VQMl9GSUZPKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUDJfRklGTyh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVAyX0ZJRk8sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUDNfRklGTygpCWJmaW5fcmVhZDE2KFVTQl9FUDNfRklGTykKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVAzX0ZJRk8odmFsKQliZmluX3dyaXRlMTYoVVNCX0VQM19GSUZPLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVA0X0ZJRk8oKQliZmluX3JlYWQxNihVU0JfRVA0X0ZJRk8pCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQNF9GSUZPKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUDRfRklGTywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQNV9GSUZPKCkJYmZpbl9yZWFkMTYoVVNCX0VQNV9GSUZPKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUDVfRklGTyh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVA1X0ZJRk8sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUDZfRklGTygpCWJmaW5fcmVhZDE2KFVTQl9FUDZfRklGTykKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVA2X0ZJRk8odmFsKQliZmluX3dyaXRlMTYoVVNCX0VQNl9GSUZPLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVA3X0ZJRk8oKQliZmluX3JlYWQxNihVU0JfRVA3X0ZJRk8pCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQN19GSUZPKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUDdfRklGTywgdmFsKQorCisvKiBVU0IgT1RHIENvbnRyb2wgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9PVEdfREVWX0NUTCgpCQliZmluX3JlYWQxNihVU0JfT1RHX0RFVl9DVEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX09UR19ERVZfQ1RMKHZhbCkJCWJmaW5fd3JpdGUxNihVU0JfT1RHX0RFVl9DVEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9PVEdfVkJVU19JUlEoKQkJYmZpbl9yZWFkMTYoVVNCX09UR19WQlVTX0lSUSkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfT1RHX1ZCVVNfSVJRKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9PVEdfVkJVU19JUlEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9PVEdfVkJVU19NQVNLKCkJCWJmaW5fcmVhZDE2KFVTQl9PVEdfVkJVU19NQVNLKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9PVEdfVkJVU19NQVNLKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9PVEdfVkJVU19NQVNLLCB2YWwpCisKKy8qIFVTQiBQaHkgQ29udHJvbCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBiZmluX3JlYWRfVVNCX0xJTktJTkZPKCkJYmZpbl9yZWFkMTYoVVNCX0xJTktJTkZPKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9MSU5LSU5GTyh2YWwpCWJmaW5fd3JpdGUxNihVU0JfTElOS0lORk8sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9WUExFTigpCQliZmluX3JlYWQxNihVU0JfVlBMRU4pCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX1ZQTEVOKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9WUExFTiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0hTX0VPRjEoKQkJYmZpbl9yZWFkMTYoVVNCX0hTX0VPRjEpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0hTX0VPRjEodmFsKQliZmluX3dyaXRlMTYoVVNCX0hTX0VPRjEsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9GU19FT0YxKCkJCWJmaW5fcmVhZDE2KFVTQl9GU19FT0YxKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9GU19FT0YxKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9GU19FT0YxLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfTFNfRU9GMSgpCQliZmluX3JlYWQxNihVU0JfTFNfRU9GMSkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfTFNfRU9GMSh2YWwpCWJmaW5fd3JpdGUxNihVU0JfTFNfRU9GMSwgdmFsKQorCisvKiAoQVBIWV9DTlRSTCBpcyBmb3IgQURJIHVzYWdlIG9ubHkpICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9BUEhZX0NOVFJMKCkJCWJmaW5fcmVhZDE2KFVTQl9BUEhZX0NOVFJMKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9BUEhZX0NOVFJMKHZhbCkJCWJmaW5fd3JpdGUxNihVU0JfQVBIWV9DTlRSTCwgdmFsKQorCisvKiAoQVBIWV9DQUxJQiBpcyBmb3IgQURJIHVzYWdlIG9ubHkpICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9BUEhZX0NBTElCKCkJCWJmaW5fcmVhZDE2KFVTQl9BUEhZX0NBTElCKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9BUEhZX0NBTElCKHZhbCkJCWJmaW5fd3JpdGUxNihVU0JfQVBIWV9DQUxJQiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0FQSFlfQ05UUkwyKCkJCWJmaW5fcmVhZDE2KFVTQl9BUEhZX0NOVFJMMikKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfQVBIWV9DTlRSTDIodmFsKQkJYmZpbl93cml0ZTE2KFVTQl9BUEhZX0NOVFJMMiwgdmFsKQorCisvKiAoUEhZX1RFU1QgaXMgZm9yIEFESSB1c2FnZSBvbmx5KSAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfUEhZX1RFU1QoKQkJYmZpbl9yZWFkMTYoVVNCX1BIWV9URVNUKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9QSFlfVEVTVCh2YWwpCQliZmluX3dyaXRlMTYoVVNCX1BIWV9URVNULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfUExMT1NDX0NUUkwoKQkJYmZpbl9yZWFkMTYoVVNCX1BMTE9TQ19DVFJMKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9QTExPU0NfQ1RSTCh2YWwpCQliZmluX3dyaXRlMTYoVVNCX1BMTE9TQ19DVFJMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfU1JQX0NMS0RJVigpCQliZmluX3JlYWQxNihVU0JfU1JQX0NMS0RJVikKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfU1JQX0NMS0RJVih2YWwpCQliZmluX3dyaXRlMTYoVVNCX1NSUF9DTEtESVYsIHZhbCkKKworLyogVVNCIEVuZGJmaW5fcmVhZF8oKW9pbnQgMCBDb250cm9sIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkkwX1RYTUFYUCgpCQliZmluX3JlYWQxNihVU0JfRVBfTkkwX1RYTUFYUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkkwX1RYTUFYUCh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkkwX1RYTUFYUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JMF9UWENTUigpCQliZmluX3JlYWQxNihVU0JfRVBfTkkwX1RYQ1NSKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTBfVFhDU1IodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JMF9UWENTUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JMF9SWE1BWFAoKQkJYmZpbl9yZWFkMTYoVVNCX0VQX05JMF9SWE1BWFApCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JMF9SWE1BWFAodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JMF9SWE1BWFAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTBfUlhDU1IoKQkJYmZpbl9yZWFkMTYoVVNCX0VQX05JMF9SWENTUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkkwX1JYQ1NSKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTBfUlhDU1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTBfUlhDT1VOVCgpCQliZmluX3JlYWQxNihVU0JfRVBfTkkwX1JYQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JMF9SWENPVU5UKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTBfUlhDT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JMF9UWFRZUEUoKQkJYmZpbl9yZWFkMTYoVVNCX0VQX05JMF9UWFRZUEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JMF9UWFRZUEUodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JMF9UWFRZUEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTBfVFhJTlRFUlZBTCgpCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTBfVFhJTlRFUlZBTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkkwX1RYSU5URVJWQUwodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JMF9UWElOVEVSVkFMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkkwX1JYVFlQRSgpCQliZmluX3JlYWQxNihVU0JfRVBfTkkwX1JYVFlQRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkkwX1JYVFlQRSh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkkwX1JYVFlQRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JMF9SWElOVEVSVkFMKCkJYmZpbl9yZWFkMTYoVVNCX0VQX05JMF9SWElOVEVSVkFMKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTBfUlhJTlRFUlZBTCh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkkwX1JYSU5URVJWQUwsIHZhbCkKKworLyogVVNCIEVuZGJmaW5fcmVhZF8oKW9pbnQgMSBDb250cm9sIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkkwX1RYQ09VTlQoKQkJYmZpbl9yZWFkMTYoVVNCX0VQX05JMF9UWENPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTBfVFhDT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkkwX1RYQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTFfVFhNQVhQKCkJCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTFfVFhNQVhQKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTFfVFhNQVhQKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTFfVFhNQVhQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkkxX1RYQ1NSKCkJCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTFfVFhDU1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JMV9UWENTUih2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkkxX1RYQ1NSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkkxX1JYTUFYUCgpCQliZmluX3JlYWQxNihVU0JfRVBfTkkxX1JYTUFYUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkkxX1JYTUFYUCh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkkxX1JYTUFYUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JMV9SWENTUigpCQliZmluX3JlYWQxNihVU0JfRVBfTkkxX1JYQ1NSKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTFfUlhDU1IodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JMV9SWENTUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JMV9SWENPVU5UKCkJCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTFfUlhDT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkkxX1JYQ09VTlQodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JMV9SWENPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkkxX1RYVFlQRSgpCQliZmluX3JlYWQxNihVU0JfRVBfTkkxX1RYVFlQRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkkxX1RYVFlQRSh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkkxX1RYVFlQRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JMV9UWElOVEVSVkFMKCkJYmZpbl9yZWFkMTYoVVNCX0VQX05JMV9UWElOVEVSVkFMKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTFfVFhJTlRFUlZBTCh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkkxX1RYSU5URVJWQUwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTFfUlhUWVBFKCkJCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTFfUlhUWVBFKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTFfUlhUWVBFKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTFfUlhUWVBFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkkxX1JYSU5URVJWQUwoKQliZmluX3JlYWQxNihVU0JfRVBfTkkxX1JYSU5URVJWQUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JMV9SWElOVEVSVkFMKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTFfUlhJTlRFUlZBTCwgdmFsKQorCisvKiBVU0IgRW5kYmZpbl9yZWFkXygpb2ludCAyIENvbnRyb2wgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTFfVFhDT1VOVCgpCQliZmluX3JlYWQxNihVU0JfRVBfTkkxX1RYQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JMV9UWENPVU5UKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTFfVFhDT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JMl9UWE1BWFAoKQkJYmZpbl9yZWFkMTYoVVNCX0VQX05JMl9UWE1BWFApCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JMl9UWE1BWFAodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JMl9UWE1BWFAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTJfVFhDU1IoKQkJYmZpbl9yZWFkMTYoVVNCX0VQX05JMl9UWENTUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkkyX1RYQ1NSKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTJfVFhDU1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTJfUlhNQVhQKCkJCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTJfUlhNQVhQKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTJfUlhNQVhQKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTJfUlhNQVhQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkkyX1JYQ1NSKCkJCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTJfUlhDU1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JMl9SWENTUih2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkkyX1JYQ1NSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkkyX1JYQ09VTlQoKQkJYmZpbl9yZWFkMTYoVVNCX0VQX05JMl9SWENPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTJfUlhDT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkkyX1JYQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTJfVFhUWVBFKCkJCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTJfVFhUWVBFKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTJfVFhUWVBFKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTJfVFhUWVBFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkkyX1RYSU5URVJWQUwoKQliZmluX3JlYWQxNihVU0JfRVBfTkkyX1RYSU5URVJWQUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JMl9UWElOVEVSVkFMKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTJfVFhJTlRFUlZBTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JMl9SWFRZUEUoKQkJYmZpbl9yZWFkMTYoVVNCX0VQX05JMl9SWFRZUEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JMl9SWFRZUEUodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JMl9SWFRZUEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTJfUlhJTlRFUlZBTCgpCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTJfUlhJTlRFUlZBTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkkyX1JYSU5URVJWQUwodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JMl9SWElOVEVSVkFMLCB2YWwpCisKKy8qIFVTQiBFbmRiZmluX3JlYWRfKClvaW50IDMgQ29udHJvbCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JMl9UWENPVU5UKCkJCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTJfVFhDT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkkyX1RYQ09VTlQodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JMl9UWENPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkkzX1RYTUFYUCgpCQliZmluX3JlYWQxNihVU0JfRVBfTkkzX1RYTUFYUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkkzX1RYTUFYUCh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkkzX1RYTUFYUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JM19UWENTUigpCQliZmluX3JlYWQxNihVU0JfRVBfTkkzX1RYQ1NSKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTNfVFhDU1IodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JM19UWENTUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JM19SWE1BWFAoKQkJYmZpbl9yZWFkMTYoVVNCX0VQX05JM19SWE1BWFApCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JM19SWE1BWFAodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JM19SWE1BWFAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTNfUlhDU1IoKQkJYmZpbl9yZWFkMTYoVVNCX0VQX05JM19SWENTUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkkzX1JYQ1NSKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTNfUlhDU1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTNfUlhDT1VOVCgpCQliZmluX3JlYWQxNihVU0JfRVBfTkkzX1JYQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JM19SWENPVU5UKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTNfUlhDT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JM19UWFRZUEUoKQkJYmZpbl9yZWFkMTYoVVNCX0VQX05JM19UWFRZUEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JM19UWFRZUEUodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JM19UWFRZUEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTNfVFhJTlRFUlZBTCgpCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTNfVFhJTlRFUlZBTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkkzX1RYSU5URVJWQUwodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JM19UWElOVEVSVkFMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkkzX1JYVFlQRSgpCQliZmluX3JlYWQxNihVU0JfRVBfTkkzX1JYVFlQRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkkzX1JYVFlQRSh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkkzX1JYVFlQRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JM19SWElOVEVSVkFMKCkJYmZpbl9yZWFkMTYoVVNCX0VQX05JM19SWElOVEVSVkFMKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTNfUlhJTlRFUlZBTCh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkkzX1JYSU5URVJWQUwsIHZhbCkKKworLyogVVNCIEVuZGJmaW5fcmVhZF8oKW9pbnQgNCBDb250cm9sIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkkzX1RYQ09VTlQoKQkJYmZpbl9yZWFkMTYoVVNCX0VQX05JM19UWENPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTNfVFhDT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkkzX1RYQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTRfVFhNQVhQKCkJCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTRfVFhNQVhQKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTRfVFhNQVhQKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTRfVFhNQVhQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkk0X1RYQ1NSKCkJCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTRfVFhDU1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JNF9UWENTUih2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkk0X1RYQ1NSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkk0X1JYTUFYUCgpCQliZmluX3JlYWQxNihVU0JfRVBfTkk0X1JYTUFYUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkk0X1JYTUFYUCh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkk0X1JYTUFYUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JNF9SWENTUigpCQliZmluX3JlYWQxNihVU0JfRVBfTkk0X1JYQ1NSKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTRfUlhDU1IodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JNF9SWENTUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JNF9SWENPVU5UKCkJCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTRfUlhDT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkk0X1JYQ09VTlQodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JNF9SWENPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkk0X1RYVFlQRSgpCQliZmluX3JlYWQxNihVU0JfRVBfTkk0X1RYVFlQRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkk0X1RYVFlQRSh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkk0X1RYVFlQRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JNF9UWElOVEVSVkFMKCkJYmZpbl9yZWFkMTYoVVNCX0VQX05JNF9UWElOVEVSVkFMKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTRfVFhJTlRFUlZBTCh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkk0X1RYSU5URVJWQUwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTRfUlhUWVBFKCkJCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTRfUlhUWVBFKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTRfUlhUWVBFKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTRfUlhUWVBFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkk0X1JYSU5URVJWQUwoKQliZmluX3JlYWQxNihVU0JfRVBfTkk0X1JYSU5URVJWQUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JNF9SWElOVEVSVkFMKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTRfUlhJTlRFUlZBTCwgdmFsKQorCisvKiBVU0IgRW5kYmZpbl9yZWFkXygpb2ludCA1IENvbnRyb2wgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTRfVFhDT1VOVCgpCQliZmluX3JlYWQxNihVU0JfRVBfTkk0X1RYQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JNF9UWENPVU5UKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTRfVFhDT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JNV9UWE1BWFAoKQkJYmZpbl9yZWFkMTYoVVNCX0VQX05JNV9UWE1BWFApCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JNV9UWE1BWFAodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JNV9UWE1BWFAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTVfVFhDU1IoKQkJYmZpbl9yZWFkMTYoVVNCX0VQX05JNV9UWENTUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkk1X1RYQ1NSKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTVfVFhDU1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTVfUlhNQVhQKCkJCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTVfUlhNQVhQKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTVfUlhNQVhQKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTVfUlhNQVhQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkk1X1JYQ1NSKCkJCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTVfUlhDU1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JNV9SWENTUih2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkk1X1JYQ1NSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkk1X1JYQ09VTlQoKQkJYmZpbl9yZWFkMTYoVVNCX0VQX05JNV9SWENPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTVfUlhDT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkk1X1JYQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTVfVFhUWVBFKCkJCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTVfVFhUWVBFKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTVfVFhUWVBFKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTVfVFhUWVBFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkk1X1RYSU5URVJWQUwoKQliZmluX3JlYWQxNihVU0JfRVBfTkk1X1RYSU5URVJWQUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JNV9UWElOVEVSVkFMKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTVfVFhJTlRFUlZBTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JNV9SWFRZUEUoKQkJYmZpbl9yZWFkMTYoVVNCX0VQX05JNV9SWFRZUEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JNV9SWFRZUEUodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JNV9SWFRZUEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTVfUlhJTlRFUlZBTCgpCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTVfUlhJTlRFUlZBTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkk1X1JYSU5URVJWQUwodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JNV9SWElOVEVSVkFMLCB2YWwpCisKKy8qIFVTQiBFbmRiZmluX3JlYWRfKClvaW50IDYgQ29udHJvbCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JNV9UWENPVU5UKCkJCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTVfVFhDT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkk1X1RYQ09VTlQodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JNV9UWENPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkk2X1RYTUFYUCgpCQliZmluX3JlYWQxNihVU0JfRVBfTkk2X1RYTUFYUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkk2X1RYTUFYUCh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkk2X1RYTUFYUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JNl9UWENTUigpCQliZmluX3JlYWQxNihVU0JfRVBfTkk2X1RYQ1NSKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTZfVFhDU1IodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JNl9UWENTUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JNl9SWE1BWFAoKQkJYmZpbl9yZWFkMTYoVVNCX0VQX05JNl9SWE1BWFApCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JNl9SWE1BWFAodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JNl9SWE1BWFAsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTZfUlhDU1IoKQkJYmZpbl9yZWFkMTYoVVNCX0VQX05JNl9SWENTUikKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkk2X1JYQ1NSKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTZfUlhDU1IsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTZfUlhDT1VOVCgpCQliZmluX3JlYWQxNihVU0JfRVBfTkk2X1JYQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JNl9SWENPVU5UKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTZfUlhDT1VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JNl9UWFRZUEUoKQkJYmZpbl9yZWFkMTYoVVNCX0VQX05JNl9UWFRZUEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JNl9UWFRZUEUodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JNl9UWFRZUEUsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTZfVFhJTlRFUlZBTCgpCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTZfVFhJTlRFUlZBTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkk2X1RYSU5URVJWQUwodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JNl9UWElOVEVSVkFMLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkk2X1JYVFlQRSgpCQliZmluX3JlYWQxNihVU0JfRVBfTkk2X1JYVFlQRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkk2X1JYVFlQRSh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkk2X1JYVFlQRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JNl9SWElOVEVSVkFMKCkJYmZpbl9yZWFkMTYoVVNCX0VQX05JNl9SWElOVEVSVkFMKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTZfUlhJTlRFUlZBTCh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkk2X1JYSU5URVJWQUwsIHZhbCkKKworLyogVVNCIEVuZGJmaW5fcmVhZF8oKW9pbnQgNyBDb250cm9sIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkk2X1RYQ09VTlQoKQkJYmZpbl9yZWFkMTYoVVNCX0VQX05JNl9UWENPVU5UKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTZfVFhDT1VOVCh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkk2X1RYQ09VTlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTdfVFhNQVhQKCkJCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTdfVFhNQVhQKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTdfVFhNQVhQKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTdfVFhNQVhQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkk3X1RYQ1NSKCkJCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTdfVFhDU1IpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JN19UWENTUih2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkk3X1RYQ1NSLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkk3X1JYTUFYUCgpCQliZmluX3JlYWQxNihVU0JfRVBfTkk3X1JYTUFYUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkk3X1JYTUFYUCh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkk3X1JYTUFYUCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JN19SWENTUigpCQliZmluX3JlYWQxNihVU0JfRVBfTkk3X1JYQ1NSKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTdfUlhDU1IodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JN19SWENTUiwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JN19SWENPVU5UKCkJCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTdfUlhDT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkk3X1JYQ09VTlQodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JN19SWENPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkk3X1RYVFlQRSgpCQliZmluX3JlYWQxNihVU0JfRVBfTkk3X1RYVFlQRSkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkk3X1RYVFlQRSh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkk3X1RYVFlQRSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JN19UWElOVEVSVkFMKCkJYmZpbl9yZWFkMTYoVVNCX0VQX05JN19UWElOVEVSVkFMKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTdfVFhJTlRFUlZBTCh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRVBfTkk3X1RYSU5URVJWQUwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9FUF9OSTdfUlhUWVBFKCkJCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTdfUlhUWVBFKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9FUF9OSTdfUlhUWVBFKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTdfUlhUWVBFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRVBfTkk3X1JYSU5URVJWQUwoKQliZmluX3JlYWQxNihVU0JfRVBfTkk3X1JYSU5URVJWQUwpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0VQX05JN19SWElOVEVSVkFMKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9FUF9OSTdfUlhJTlRFUlZBTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0VQX05JN19UWENPVU5UKCkJCWJmaW5fcmVhZDE2KFVTQl9FUF9OSTdfVFhDT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRVBfTkk3X1RYQ09VTlQodmFsKQliZmluX3dyaXRlMTYoVVNCX0VQX05JN19UWENPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRE1BX0lOVEVSUlVQVCgpCQliZmluX3JlYWQxNihVU0JfRE1BX0lOVEVSUlVQVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRE1BX0lOVEVSUlVQVCh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRE1BX0lOVEVSUlVQVCwgdmFsKQorCisvKiBVU0IgQ2hhbm5lbCAwIENvbmZpZyBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBiZmluX3JlYWRfVVNCX0RNQTBDT05UUk9MKCkJCWJmaW5fcmVhZDE2KFVTQl9ETUEwQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRE1BMENPTlRST0wodmFsKQkJYmZpbl93cml0ZTE2KFVTQl9ETUEwQ09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0RNQTBBRERSTE9XKCkJCWJmaW5fcmVhZDE2KFVTQl9ETUEwQUREUkxPVykKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRE1BMEFERFJMT1codmFsKQkJYmZpbl93cml0ZTE2KFVTQl9ETUEwQUREUkxPVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0RNQTBBRERSSElHSCgpCQliZmluX3JlYWQxNihVU0JfRE1BMEFERFJISUdIKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9ETUEwQUREUkhJR0godmFsKQliZmluX3dyaXRlMTYoVVNCX0RNQTBBRERSSElHSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0RNQTBDT1VOVExPVygpCQliZmluX3JlYWQxNihVU0JfRE1BMENPVU5UTE9XKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9ETUEwQ09VTlRMT1codmFsKQliZmluX3dyaXRlMTYoVVNCX0RNQTBDT1VOVExPVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0RNQTBDT1VOVEhJR0goKQkJYmZpbl9yZWFkMTYoVVNCX0RNQTBDT1VOVEhJR0gpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0RNQTBDT1VOVEhJR0godmFsKQliZmluX3dyaXRlMTYoVVNCX0RNQTBDT1VOVEhJR0gsIHZhbCkKKworLyogVVNCIENoYW5uZWwgMSBDb25maWcgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9ETUExQ09OVFJPTCgpCQliZmluX3JlYWQxNihVU0JfRE1BMUNPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0RNQTFDT05UUk9MKHZhbCkJCWJmaW5fd3JpdGUxNihVU0JfRE1BMUNPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9ETUExQUREUkxPVygpCQliZmluX3JlYWQxNihVU0JfRE1BMUFERFJMT1cpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0RNQTFBRERSTE9XKHZhbCkJCWJmaW5fd3JpdGUxNihVU0JfRE1BMUFERFJMT1csIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9ETUExQUREUkhJR0goKQkJYmZpbl9yZWFkMTYoVVNCX0RNQTFBRERSSElHSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRE1BMUFERFJISUdIKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9ETUExQUREUkhJR0gsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9ETUExQ09VTlRMT1coKQkJYmZpbl9yZWFkMTYoVVNCX0RNQTFDT1VOVExPVykKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRE1BMUNPVU5UTE9XKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9ETUExQ09VTlRMT1csIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9ETUExQ09VTlRISUdIKCkJCWJmaW5fcmVhZDE2KFVTQl9ETUExQ09VTlRISUdIKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9ETUExQ09VTlRISUdIKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9ETUExQ09VTlRISUdILCB2YWwpCisKKy8qIFVTQiBDaGFubmVsIDIgQ29uZmlnIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRE1BMkNPTlRST0woKQkJYmZpbl9yZWFkMTYoVVNCX0RNQTJDT05UUk9MKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9ETUEyQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoVVNCX0RNQTJDT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRE1BMkFERFJMT1coKQkJYmZpbl9yZWFkMTYoVVNCX0RNQTJBRERSTE9XKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9ETUEyQUREUkxPVyh2YWwpCQliZmluX3dyaXRlMTYoVVNCX0RNQTJBRERSTE9XLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRE1BMkFERFJISUdIKCkJCWJmaW5fcmVhZDE2KFVTQl9ETUEyQUREUkhJR0gpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0RNQTJBRERSSElHSCh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRE1BMkFERFJISUdILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRE1BMkNPVU5UTE9XKCkJCWJmaW5fcmVhZDE2KFVTQl9ETUEyQ09VTlRMT1cpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0RNQTJDT1VOVExPVyh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRE1BMkNPVU5UTE9XLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRE1BMkNPVU5USElHSCgpCQliZmluX3JlYWQxNihVU0JfRE1BMkNPVU5USElHSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRE1BMkNPVU5USElHSCh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRE1BMkNPVU5USElHSCwgdmFsKQorCisvKiBVU0IgQ2hhbm5lbCAzIENvbmZpZyBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBiZmluX3JlYWRfVVNCX0RNQTNDT05UUk9MKCkJCWJmaW5fcmVhZDE2KFVTQl9ETUEzQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRE1BM0NPTlRST0wodmFsKQkJYmZpbl93cml0ZTE2KFVTQl9ETUEzQ09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0RNQTNBRERSTE9XKCkJCWJmaW5fcmVhZDE2KFVTQl9ETUEzQUREUkxPVykKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRE1BM0FERFJMT1codmFsKQkJYmZpbl93cml0ZTE2KFVTQl9ETUEzQUREUkxPVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0RNQTNBRERSSElHSCgpCQliZmluX3JlYWQxNihVU0JfRE1BM0FERFJISUdIKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9ETUEzQUREUkhJR0godmFsKQliZmluX3dyaXRlMTYoVVNCX0RNQTNBRERSSElHSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0RNQTNDT1VOVExPVygpCQliZmluX3JlYWQxNihVU0JfRE1BM0NPVU5UTE9XKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9ETUEzQ09VTlRMT1codmFsKQliZmluX3dyaXRlMTYoVVNCX0RNQTNDT1VOVExPVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0RNQTNDT1VOVEhJR0goKQkJYmZpbl9yZWFkMTYoVVNCX0RNQTNDT1VOVEhJR0gpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0RNQTNDT1VOVEhJR0godmFsKQliZmluX3dyaXRlMTYoVVNCX0RNQTNDT1VOVEhJR0gsIHZhbCkKKworLyogVVNCIENoYW5uZWwgNCBDb25maWcgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9ETUE0Q09OVFJPTCgpCQliZmluX3JlYWQxNihVU0JfRE1BNENPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0RNQTRDT05UUk9MKHZhbCkJCWJmaW5fd3JpdGUxNihVU0JfRE1BNENPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9ETUE0QUREUkxPVygpCQliZmluX3JlYWQxNihVU0JfRE1BNEFERFJMT1cpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0RNQTRBRERSTE9XKHZhbCkJCWJmaW5fd3JpdGUxNihVU0JfRE1BNEFERFJMT1csIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9ETUE0QUREUkhJR0goKQkJYmZpbl9yZWFkMTYoVVNCX0RNQTRBRERSSElHSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRE1BNEFERFJISUdIKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9ETUE0QUREUkhJR0gsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9ETUE0Q09VTlRMT1coKQkJYmZpbl9yZWFkMTYoVVNCX0RNQTRDT1VOVExPVykKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRE1BNENPVU5UTE9XKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9ETUE0Q09VTlRMT1csIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9ETUE0Q09VTlRISUdIKCkJCWJmaW5fcmVhZDE2KFVTQl9ETUE0Q09VTlRISUdIKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9ETUE0Q09VTlRISUdIKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9ETUE0Q09VTlRISUdILCB2YWwpCisKKy8qIFVTQiBDaGFubmVsIDUgQ29uZmlnIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRE1BNUNPTlRST0woKQkJYmZpbl9yZWFkMTYoVVNCX0RNQTVDT05UUk9MKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9ETUE1Q09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoVVNCX0RNQTVDT05UUk9MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRE1BNUFERFJMT1coKQkJYmZpbl9yZWFkMTYoVVNCX0RNQTVBRERSTE9XKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9ETUE1QUREUkxPVyh2YWwpCQliZmluX3dyaXRlMTYoVVNCX0RNQTVBRERSTE9XLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRE1BNUFERFJISUdIKCkJCWJmaW5fcmVhZDE2KFVTQl9ETUE1QUREUkhJR0gpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0RNQTVBRERSSElHSCh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRE1BNUFERFJISUdILCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRE1BNUNPVU5UTE9XKCkJCWJmaW5fcmVhZDE2KFVTQl9ETUE1Q09VTlRMT1cpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0RNQTVDT1VOVExPVyh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRE1BNUNPVU5UTE9XLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9VU0JfRE1BNUNPVU5USElHSCgpCQliZmluX3JlYWQxNihVU0JfRE1BNUNPVU5USElHSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRE1BNUNPVU5USElHSCh2YWwpCWJmaW5fd3JpdGUxNihVU0JfRE1BNUNPVU5USElHSCwgdmFsKQorCisvKiBVU0IgQ2hhbm5lbCA2IENvbmZpZyBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBiZmluX3JlYWRfVVNCX0RNQTZDT05UUk9MKCkJCWJmaW5fcmVhZDE2KFVTQl9ETUE2Q09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRE1BNkNPTlRST0wodmFsKQkJYmZpbl93cml0ZTE2KFVTQl9ETUE2Q09OVFJPTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0RNQTZBRERSTE9XKCkJCWJmaW5fcmVhZDE2KFVTQl9ETUE2QUREUkxPVykKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRE1BNkFERFJMT1codmFsKQkJYmZpbl93cml0ZTE2KFVTQl9ETUE2QUREUkxPVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0RNQTZBRERSSElHSCgpCQliZmluX3JlYWQxNihVU0JfRE1BNkFERFJISUdIKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9ETUE2QUREUkhJR0godmFsKQliZmluX3dyaXRlMTYoVVNCX0RNQTZBRERSSElHSCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0RNQTZDT1VOVExPVygpCQliZmluX3JlYWQxNihVU0JfRE1BNkNPVU5UTE9XKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9ETUE2Q09VTlRMT1codmFsKQliZmluX3dyaXRlMTYoVVNCX0RNQTZDT1VOVExPVywgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfVVNCX0RNQTZDT1VOVEhJR0goKQkJYmZpbl9yZWFkMTYoVVNCX0RNQTZDT1VOVEhJR0gpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0RNQTZDT1VOVEhJR0godmFsKQliZmluX3dyaXRlMTYoVVNCX0RNQTZDT1VOVEhJR0gsIHZhbCkKKworLyogVVNCIENoYW5uZWwgNyBDb25maWcgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9ETUE3Q09OVFJPTCgpCQliZmluX3JlYWQxNihVU0JfRE1BN0NPTlRST0wpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0RNQTdDT05UUk9MKHZhbCkJCWJmaW5fd3JpdGUxNihVU0JfRE1BN0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9ETUE3QUREUkxPVygpCQliZmluX3JlYWQxNihVU0JfRE1BN0FERFJMT1cpCisjZGVmaW5lIGJmaW5fd3JpdGVfVVNCX0RNQTdBRERSTE9XKHZhbCkJCWJmaW5fd3JpdGUxNihVU0JfRE1BN0FERFJMT1csIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9ETUE3QUREUkhJR0goKQkJYmZpbl9yZWFkMTYoVVNCX0RNQTdBRERSSElHSCkKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRE1BN0FERFJISUdIKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9ETUE3QUREUkhJR0gsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9ETUE3Q09VTlRMT1coKQkJYmZpbl9yZWFkMTYoVVNCX0RNQTdDT1VOVExPVykKKyNkZWZpbmUgYmZpbl93cml0ZV9VU0JfRE1BN0NPVU5UTE9XKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9ETUE3Q09VTlRMT1csIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1VTQl9ETUE3Q09VTlRISUdIKCkJCWJmaW5fcmVhZDE2KFVTQl9ETUE3Q09VTlRISUdIKQorI2RlZmluZSBiZmluX3dyaXRlX1VTQl9ETUE3Q09VTlRISUdIKHZhbCkJYmZpbl93cml0ZTE2KFVTQl9ETUE3Q09VTlRISUdILCB2YWwpCisKKy8qIEtleWJmaW5fcmVhZF8oKWFkIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9LUEFEX0NUTCgpCQliZmluX3JlYWQxNihLUEFEX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9LUEFEX0NUTCh2YWwpCWJmaW5fd3JpdGUxNihLUEFEX0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfS1BBRF9QUkVTQ0FMRSgpCWJmaW5fcmVhZDE2KEtQQURfUFJFU0NBTEUpCisjZGVmaW5lIGJmaW5fd3JpdGVfS1BBRF9QUkVTQ0FMRSh2YWwpCWJmaW5fd3JpdGUxNihLUEFEX1BSRVNDQUxFLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9LUEFEX01TRUwoKQkJYmZpbl9yZWFkMTYoS1BBRF9NU0VMKQorI2RlZmluZSBiZmluX3dyaXRlX0tQQURfTVNFTCh2YWwpCWJmaW5fd3JpdGUxNihLUEFEX01TRUwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0tQQURfUk9XQ09MKCkJCWJmaW5fcmVhZDE2KEtQQURfUk9XQ09MKQorI2RlZmluZSBiZmluX3dyaXRlX0tQQURfUk9XQ09MKHZhbCkJYmZpbl93cml0ZTE2KEtQQURfUk9XQ09MLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9LUEFEX1NUQVQoKQkJYmZpbl9yZWFkMTYoS1BBRF9TVEFUKQorI2RlZmluZSBiZmluX3dyaXRlX0tQQURfU1RBVCh2YWwpCWJmaW5fd3JpdGUxNihLUEFEX1NUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0tQQURfU09GVEVWQUwoKQliZmluX3JlYWQxNihLUEFEX1NPRlRFVkFMKQorI2RlZmluZSBiZmluX3dyaXRlX0tQQURfU09GVEVWQUwodmFsKQliZmluX3dyaXRlMTYoS1BBRF9TT0ZURVZBTCwgdmFsKQorCisvKiBQaXhlbCBDb21iZmluX3JlYWRfKClvc2l0b3IgKFBJWEMpIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9QSVhDX0NUTCgpCQliZmluX3JlYWQxNihQSVhDX0NUTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QSVhDX0NUTCh2YWwpCWJmaW5fd3JpdGUxNihQSVhDX0NUTCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUElYQ19QUEwoKQkJYmZpbl9yZWFkMTYoUElYQ19QUEwpCisjZGVmaW5lIGJmaW5fd3JpdGVfUElYQ19QUEwodmFsKQliZmluX3dyaXRlMTYoUElYQ19QUEwsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BJWENfTFBGKCkJCWJmaW5fcmVhZDE2KFBJWENfTFBGKQorI2RlZmluZSBiZmluX3dyaXRlX1BJWENfTFBGKHZhbCkJYmZpbl93cml0ZTE2KFBJWENfTFBGLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QSVhDX0FIU1RBUlQoKQliZmluX3JlYWQxNihQSVhDX0FIU1RBUlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUElYQ19BSFNUQVJUKHZhbCkJYmZpbl93cml0ZTE2KFBJWENfQUhTVEFSVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUElYQ19BSEVORCgpCQliZmluX3JlYWQxNihQSVhDX0FIRU5EKQorI2RlZmluZSBiZmluX3dyaXRlX1BJWENfQUhFTkQodmFsKQliZmluX3dyaXRlMTYoUElYQ19BSEVORCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUElYQ19BVlNUQVJUKCkJYmZpbl9yZWFkMTYoUElYQ19BVlNUQVJUKQorI2RlZmluZSBiZmluX3dyaXRlX1BJWENfQVZTVEFSVCh2YWwpCWJmaW5fd3JpdGUxNihQSVhDX0FWU1RBUlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BJWENfQVZFTkQoKQkJYmZpbl9yZWFkMTYoUElYQ19BVkVORCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QSVhDX0FWRU5EKHZhbCkJYmZpbl93cml0ZTE2KFBJWENfQVZFTkQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BJWENfQVRSQU5TUCgpCWJmaW5fcmVhZDE2KFBJWENfQVRSQU5TUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QSVhDX0FUUkFOU1AodmFsKQliZmluX3dyaXRlMTYoUElYQ19BVFJBTlNQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QSVhDX0JIU1RBUlQoKQliZmluX3JlYWQxNihQSVhDX0JIU1RBUlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfUElYQ19CSFNUQVJUKHZhbCkJYmZpbl93cml0ZTE2KFBJWENfQkhTVEFSVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUElYQ19CSEVORCgpCQliZmluX3JlYWQxNihQSVhDX0JIRU5EKQorI2RlZmluZSBiZmluX3dyaXRlX1BJWENfQkhFTkQodmFsKQliZmluX3dyaXRlMTYoUElYQ19CSEVORCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfUElYQ19CVlNUQVJUKCkJYmZpbl9yZWFkMTYoUElYQ19CVlNUQVJUKQorI2RlZmluZSBiZmluX3dyaXRlX1BJWENfQlZTVEFSVCh2YWwpCWJmaW5fd3JpdGUxNihQSVhDX0JWU1RBUlQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BJWENfQlZFTkQoKQkJYmZpbl9yZWFkMTYoUElYQ19CVkVORCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QSVhDX0JWRU5EKHZhbCkJYmZpbl93cml0ZTE2KFBJWENfQlZFTkQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BJWENfQlRSQU5TUCgpCWJmaW5fcmVhZDE2KFBJWENfQlRSQU5TUCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QSVhDX0JUUkFOU1AodmFsKQliZmluX3dyaXRlMTYoUElYQ19CVFJBTlNQLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QSVhDX0lOVFJTVEFUKCkJYmZpbl9yZWFkMTYoUElYQ19JTlRSU1RBVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9QSVhDX0lOVFJTVEFUKHZhbCkJYmZpbl93cml0ZTE2KFBJWENfSU5UUlNUQVQsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BJWENfUllDT04oKQkJYmZpbl9yZWFkMzIoUElYQ19SWUNPTikKKyNkZWZpbmUgYmZpbl93cml0ZV9QSVhDX1JZQ09OKHZhbCkJYmZpbl93cml0ZTMyKFBJWENfUllDT04sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BJWENfR1VDT04oKQkJYmZpbl9yZWFkMzIoUElYQ19HVUNPTikKKyNkZWZpbmUgYmZpbl93cml0ZV9QSVhDX0dVQ09OKHZhbCkJYmZpbl93cml0ZTMyKFBJWENfR1VDT04sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BJWENfQlZDT04oKQkJYmZpbl9yZWFkMzIoUElYQ19CVkNPTikKKyNkZWZpbmUgYmZpbl93cml0ZV9QSVhDX0JWQ09OKHZhbCkJYmZpbl93cml0ZTMyKFBJWENfQlZDT04sIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX1BJWENfQ0NCSUFTKCkJCWJmaW5fcmVhZDMyKFBJWENfQ0NCSUFTKQorI2RlZmluZSBiZmluX3dyaXRlX1BJWENfQ0NCSUFTKHZhbCkJYmZpbl93cml0ZTMyKFBJWENfQ0NCSUFTLCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9QSVhDX1RDKCkJCWJmaW5fcmVhZDMyKFBJWENfVEMpCisjZGVmaW5lIGJmaW5fd3JpdGVfUElYQ19UQyh2YWwpCQliZmluX3dyaXRlMzIoUElYQ19UQywgdmFsKQorCisvKiBIYW5kc2hha2UgTURNQSAwIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfQ09OVFJPTCgpCQliZmluX3JlYWQxNihITURNQTBfQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9FQ0lOSVQoKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0VDSU5JVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfRUNJTklUKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTBfRUNJTklULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfQkNJTklUKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9CQ0lOSVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0JDSU5JVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0JDSU5JVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0VDVVJHRU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9FQ1VSR0VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfRUNVUkdFTlQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMF9FQ1VSR0VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUEwX0VDT1ZFUkZMT1coKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0VDT1ZFUkZMT1cpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0VDT1ZFUkZMT1codmFsKQliZmluX3dyaXRlMTYoSE1ETUEwX0VDT1ZFUkZMT1csIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMF9FQ09VTlQoKQkJYmZpbl9yZWFkMTYoSE1ETUEwX0VDT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTBfRUNPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTBfRUNPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTBfQkNPVU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMF9CQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUEwX0JDT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUEwX0JDT1VOVCwgdmFsKQorCisvKiBIYW5kc2hha2UgTURNQSAxIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfQ09OVFJPTCgpCQliZmluX3JlYWQxNihITURNQTFfQ09OVFJPTCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfQ09OVFJPTCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0NPTlRST0wsIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9FQ0lOSVQoKQkJYmZpbl9yZWFkMTYoSE1ETUExX0VDSU5JVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfRUNJTklUKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTFfRUNJTklULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfQkNJTklUKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9CQ0lOSVQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0JDSU5JVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0JDSU5JVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0VDVVJHRU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9FQ1VSR0VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfRUNVUkdFTlQodmFsKQkJYmZpbl93cml0ZTE2KEhNRE1BMV9FQ1VSR0VOVCwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfSE1ETUExX0VDT1ZFUkZMT1coKQkJYmZpbl9yZWFkMTYoSE1ETUExX0VDT1ZFUkZMT1cpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0VDT1ZFUkZMT1codmFsKQliZmluX3dyaXRlMTYoSE1ETUExX0VDT1ZFUkZMT1csIHZhbCkKKyNkZWZpbmUgYmZpbl9yZWFkX0hNRE1BMV9FQ09VTlQoKQkJYmZpbl9yZWFkMTYoSE1ETUExX0VDT1VOVCkKKyNkZWZpbmUgYmZpbl93cml0ZV9ITURNQTFfRUNPVU5UKHZhbCkJCWJmaW5fd3JpdGUxNihITURNQTFfRUNPVU5ULCB2YWwpCisjZGVmaW5lIGJmaW5fcmVhZF9ITURNQTFfQkNPVU5UKCkJCWJmaW5fcmVhZDE2KEhNRE1BMV9CQ09VTlQpCisjZGVmaW5lIGJmaW5fd3JpdGVfSE1ETUExX0JDT1VOVCh2YWwpCQliZmluX3dyaXRlMTYoSE1ETUExX0JDT1VOVCwgdmFsKQorCisjZW5kaWYgLyogX0NERUZfQkY1NDhfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjU0OC9kZWZCRjU0Ny5oIGIvaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjU0OC9kZWZCRjU0Ny5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhM2ExOGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTQ4L2RlZkJGNTQ3LmgKQEAgLTAsMCArMSwxMjQ0IEBACisvKgorICogRmlsZTogICAgICAgICBpbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTQ4L2RlZkJGNTQ3LmgKKyAqIEJhc2VkIG9uOgorICogQXV0aG9yOgorICoKKyAqIENyZWF0ZWQ6CisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBSZXY6CisgKgorICogTW9kaWZpZWQ6CisgKgorICogQnVnczogICAgICAgICBFbnRlciBidWdzIGF0IGh0dHA6Ly9ibGFja2Zpbi51Y2xpbnV4Lm9yZy8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfREVGX0JGNTQ4X0gKKyNkZWZpbmUgX0RFRl9CRjU0OF9ICisKKy8qIEluY2x1ZGUgYWxsIENvcmUgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxhc20vbWFjaC1jb21tb24vZGVmX0xQQmxhY2tmaW4uaD4KKworLyogU1lTVEVNICYgTU1SIEFERFJFU1MgREVGSU5JVElPTlMgRk9SIEFEU1AtQkY1NDggKi8KKworLyogSW5jbHVkZSBkZWZCRjU0eF9iYXNlLmggZm9yIHRoZSBzZXQgb2YgI2RlZmluZXMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBBRFNQLUJGNTR4IHByb2Nlc3NvcnMgKi8KKyNpbmNsdWRlICJkZWZCRjU0eF9iYXNlLmgiCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSAjZGVmaW5lcyBuZWVkZWQgYnkgQURTUC1CRjU0OCB0aGF0IGFyZSBub3QgaW4gdGhlIGNvbW1vbiBoZWFkZXIgKi8KKworLyogVGltZXIgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFRJTUVSOF9DT05GSUcgIDB4ZmZjMDA2MDAgICAvKiBUaW1lciA4IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgVElNRVI4X0NPVU5URVIgIDB4ZmZjMDA2MDQgICAvKiBUaW1lciA4IENvdW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFRJTUVSOF9QRVJJT0QgIDB4ZmZjMDA2MDggICAvKiBUaW1lciA4IFBlcmlvZCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIFRJTUVSOF9XSURUSCAgMHhmZmMwMDYwYyAgIC8qIFRpbWVyIDggV2lkdGggUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFRJTUVSOV9DT05GSUcgIDB4ZmZjMDA2MTAgICAvKiBUaW1lciA5IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgVElNRVI5X0NPVU5URVIgIDB4ZmZjMDA2MTQgICAvKiBUaW1lciA5IENvdW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFRJTUVSOV9QRVJJT0QgIDB4ZmZjMDA2MTggICAvKiBUaW1lciA5IFBlcmlvZCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIFRJTUVSOV9XSURUSCAgMHhmZmMwMDYxYyAgIC8qIFRpbWVyIDkgV2lkdGggUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgVElNRVIxMF9DT05GSUcgIDB4ZmZjMDA2MjAgICAvKiBUaW1lciAxMCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgVElNRVIxMF9DT1VOVEVSICAweGZmYzAwNjI0ICAgLyogVGltZXIgMTAgQ291bnRlciBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBUSU1FUjEwX1BFUklPRCAgMHhmZmMwMDYyOCAgIC8qIFRpbWVyIDEwIFBlcmlvZCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgVElNRVIxMF9XSURUSCAgMHhmZmMwMDYyYyAgIC8qIFRpbWVyIDEwIFdpZHRoIFJlZ2lzdGVyICovCisKKy8qIFRpbWVyIEdyb3VwIG9mIDMgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFRJTUVSX0VOQUJMRTEgIDB4ZmZjMDA2NDAgICAvKiBUaW1lciBHcm91cCBvZiAzIEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBUSU1FUl9ESVNBQkxFMSAgMHhmZmMwMDY0NCAgIC8qIFRpbWVyIEdyb3VwIG9mIDMgRGlzYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgVElNRVJfU1RBVFVTMSAgMHhmZmMwMDY0OCAgIC8qIFRpbWVyIEdyb3VwIG9mIDMgU3RhdHVzIFJlZ2lzdGVyICovCisKKy8qIFNQT1JUMCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBTUE9SVDBfVENSMSAgMHhmZmMwMDgwMCAgIC8qIFNQT1JUMCBUcmFuc21pdCBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgU1BPUlQwX1RDUjIgIDB4ZmZjMDA4MDQgICAvKiBTUE9SVDAgVHJhbnNtaXQgQ29uZmlndXJhdGlvbiAyIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFNQT1JUMF9UQ0xLRElWICAweGZmYzAwODA4ICAgLyogU1BPUlQwIFRyYW5zbWl0IFNlcmlhbCBDbG9jayBEaXZpZGVyIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBTUE9SVDBfVEZTRElWICAweGZmYzAwODBjICAgLyogU1BPUlQwIFRyYW5zbWl0IEZyYW1lIFN5bmMgRGl2aWRlciBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIFNQT1JUMF9UWCAgMHhmZmMwMDgxMCAgIC8qIFNQT1JUMCBUcmFuc21pdCBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgU1BPUlQwX1JYICAweGZmYzAwODE4ICAgLyogU1BPUlQwIFJlY2VpdmUgRGF0YSBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBTUE9SVDBfUkNSMSAgMHhmZmMwMDgyMCAgIC8qIFNQT1JUMCBSZWNlaXZlIENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBTUE9SVDBfUkNSMiAgMHhmZmMwMDgyNCAgIC8qIFNQT1JUMCBSZWNlaXZlIENvbmZpZ3VyYXRpb24gMiBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBTUE9SVDBfUkNMS0RJViAgMHhmZmMwMDgyOCAgIC8qIFNQT1JUMCBSZWNlaXZlIFNlcmlhbCBDbG9jayBEaXZpZGVyIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBTUE9SVDBfUkZTRElWICAweGZmYzAwODJjICAgLyogU1BPUlQwIFJlY2VpdmUgRnJhbWUgU3luYyBEaXZpZGVyIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIFNQT1JUMF9TVEFUICAweGZmYzAwODMwICAgLyogU1BPUlQwIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBTUE9SVDBfQ0hOTCAgMHhmZmMwMDgzNCAgIC8qIFNQT1JUMCBDdXJyZW50IENoYW5uZWwgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBTUE9SVDBfTUNNQzEgIDB4ZmZjMDA4MzggICAvKiBTUE9SVDAgTXVsdGkgY2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBTUE9SVDBfTUNNQzIgIDB4ZmZjMDA4M2MgICAvKiBTUE9SVDAgTXVsdGkgY2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBTUE9SVDBfTVRDUzAgIDB4ZmZjMDA4NDAgICAvKiBTUE9SVDAgTXVsdGkgY2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIFNQT1JUMF9NVENTMSAgMHhmZmMwMDg0NCAgIC8qIFNQT1JUMCBNdWx0aSBjaGFubmVsIFRyYW5zbWl0IFNlbGVjdCBSZWdpc3RlciAxICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgU1BPUlQwX01UQ1MyICAweGZmYzAwODQ4ICAgLyogU1BPUlQwIE11bHRpIGNoYW5uZWwgVHJhbnNtaXQgU2VsZWN0IFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBTUE9SVDBfTVRDUzMgIDB4ZmZjMDA4NGMgICAvKiBTUE9SVDAgTXVsdGkgY2hhbm5lbCBUcmFuc21pdCBTZWxlY3QgUmVnaXN0ZXIgMyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIFNQT1JUMF9NUkNTMCAgMHhmZmMwMDg1MCAgIC8qIFNQT1JUMCBNdWx0aSBjaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBTUE9SVDBfTVJDUzEgIDB4ZmZjMDA4NTQgICAvKiBTUE9SVDAgTXVsdGkgY2hhbm5lbCBSZWNlaXZlIFNlbGVjdCBSZWdpc3RlciAxICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgU1BPUlQwX01SQ1MyICAweGZmYzAwODU4ICAgLyogU1BPUlQwIE11bHRpIGNoYW5uZWwgUmVjZWl2ZSBTZWxlY3QgUmVnaXN0ZXIgMiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIFNQT1JUMF9NUkNTMyAgMHhmZmMwMDg1YyAgIC8qIFNQT1JUMCBNdWx0aSBjaGFubmVsIFJlY2VpdmUgU2VsZWN0IFJlZ2lzdGVyIDMgKi8KKworLyogRVBQSTAgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBFUFBJMF9TVEFUVVMgIDB4ZmZjMDEwMDAgICAvKiBFUFBJMCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBFUFBJMF9IQ09VTlQgIDB4ZmZjMDEwMDQgICAvKiBFUFBJMCBIb3Jpem9udGFsIFRyYW5zZmVyIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgRVBQSTBfSERFTEFZICAweGZmYzAxMDA4ICAgLyogRVBQSTAgSG9yaXpvbnRhbCBEZWxheSBDb3VudCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEVQUEkwX1ZDT1VOVCAgMHhmZmMwMTAwYyAgIC8qIEVQUEkwIFZlcnRpY2FsIFRyYW5zZmVyIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgRVBQSTBfVkRFTEFZICAweGZmYzAxMDEwICAgLyogRVBQSTAgVmVydGljYWwgRGVsYXkgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgRVBQSTBfRlJBTUUgIDB4ZmZjMDEwMTQgICAvKiBFUFBJMCBMaW5lcyBwZXIgRnJhbWUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEVQUEkwX0xJTkUgIDB4ZmZjMDEwMTggICAvKiBFUFBJMCBTYW1wbGVzIHBlciBMaW5lIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgRVBQSTBfQ0xLRElWICAweGZmYzAxMDFjICAgLyogRVBQSTAgQ2xvY2sgRGl2aWRlIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBFUFBJMF9DT05UUk9MICAweGZmYzAxMDIwICAgLyogRVBQSTAgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBFUFBJMF9GUzFXX0hCTCAgMHhmZmMwMTAyNCAgIC8qIEVQUEkwIEZTMSBXaWR0aCBSZWdpc3RlciAvIEVQUEkwIEhvcml6b250YWwgQmxhbmtpbmcgU2FtcGxlcyBQZXIgTGluZSBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEVQUEkwX0ZTMVBfQVZQTCAgMHhmZmMwMTAyOCAgIC8qIEVQUEkwIEZTMSBQZXJpb2QgUmVnaXN0ZXIgLyBFUFBJMCBBY3RpdmUgVmlkZW8gU2FtcGxlcyBQZXIgTGluZSBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBFUFBJMF9GUzJXX0xWQiAgMHhmZmMwMTAyYyAgIC8qIEVQUEkwIEZTMiBXaWR0aCBSZWdpc3RlciAvIEVQUEkwIExpbmVzIG9mIFZlcnRpY2FsIEJsYW5raW5nIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgRVBQSTBfRlMyUF9MQVZGICAweGZmYzAxMDMwICAgLyogRVBQSTAgRlMyIFBlcmlvZCBSZWdpc3Rlci8gRVBQSTAgTGluZXMgb2YgQWN0aXZlIFZpZGVvIFBlciBGaWVsZCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgRVBQSTBfQ0xJUCAgMHhmZmMwMTAzNCAgIC8qIEVQUEkwIENsaXBwaW5nIFJlZ2lzdGVyICovCisKKy8qIFVBUlQyIFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgVUFSVDJfRExMICAweGZmYzAyMTAwICAgLyogRGl2aXNvciBMYXRjaCBMb3cgQnl0ZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIFVBUlQyX0RMSCAgMHhmZmMwMjEwNCAgIC8qIERpdmlzb3IgTGF0Y2ggSGlnaCBCeXRlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBVQVJUMl9HQ1RMICAweGZmYzAyMTA4ICAgLyogR2xvYmFsIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBVQVJUMl9MQ1IgIDB4ZmZjMDIxMGMgICAvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBVQVJUMl9NQ1IgIDB4ZmZjMDIxMTAgICAvKiBNb2RlbSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgVUFSVDJfTFNSICAweGZmYzAyMTE0ICAgLyogTGluZSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBVQVJUMl9NU1IgIDB4ZmZjMDIxMTggICAvKiBNb2RlbSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBVQVJUMl9TQ1IgIDB4ZmZjMDIxMWMgICAvKiBTY3JhdGNoIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBVQVJUMl9JRVJfU0VUICAweGZmYzAyMTIwICAgLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciBTZXQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBVQVJUMl9JRVJfQ0xFQVIgIDB4ZmZjMDIxMjQgICAvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIENsZWFyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgVUFSVDJfUkJSICAweGZmYzAyMTJjICAgLyogUmVjZWl2ZSBCdWZmZXIgUmVnaXN0ZXIgKi8KKworLyogVHdvIFdpcmUgSW50ZXJmYWNlIFJlZ2lzdGVycyAoVFdJMSkgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIFRXSTFfUkVHQkFTRSAgMHhmZmMwMjIwMAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBUV0kxX0NMS0RJViAgMHhmZmMwMjIwMCAgIC8qIENsb2NrIERpdmlkZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBUV0kxX0NPTlRST0wgIDB4ZmZjMDIyMDQgICAvKiBUV0kgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIFRXSTFfU0xBVkVfQ1RSTCAgMHhmZmMwMjIwOCAgIC8qIFRXSSBTbGF2ZSBNb2RlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBUV0kxX1NMQVZFX1NUQVQgIDB4ZmZjMDIyMGMgICAvKiBUV0kgU2xhdmUgTW9kZSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBUV0kxX1NMQVZFX0FERFIgIDB4ZmZjMDIyMTAgICAvKiBUV0kgU2xhdmUgTW9kZSBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBUV0kxX01BU1RFUl9DVFJMICAweGZmYzAyMjE0ICAgLyogVFdJIE1hc3RlciBNb2RlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIFRXSTFfTUFTVEVSX1NUQVQgIDB4ZmZjMDIyMTggICAvKiBUV0kgTWFzdGVyIE1vZGUgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBUV0kxX01BU1RFUl9BRERSICAweGZmYzAyMjFjICAgLyogVFdJIE1hc3RlciBNb2RlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFRXSTFfSU5UX1NUQVQgIDB4ZmZjMDIyMjAgICAvKiBUV0kgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgVFdJMV9JTlRfTUFTSyAgMHhmZmMwMjIyNCAgIC8qIFRXSSBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBUV0kxX0ZJRk9fQ1RSTCAgMHhmZmMwMjIyOCAgIC8qIFRXSSBGSUZPIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgVFdJMV9GSUZPX1NUQVQgIDB4ZmZjMDIyMmMgICAvKiBUV0kgRklGTyBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgVFdJMV9YTVRfREFUQTggIDB4ZmZjMDIyODAgICAvKiBUV0kgRklGTyBUcmFuc21pdCBEYXRhIFNpbmdsZSBCeXRlIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgVFdJMV9YTVRfREFUQTE2ICAweGZmYzAyMjg0ICAgLyogVFdJIEZJRk8gVHJhbnNtaXQgRGF0YSBEb3VibGUgQnl0ZSBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBUV0kxX1JDVl9EQVRBOCAgMHhmZmMwMjI4OCAgIC8qIFRXSSBGSUZPIFJlY2VpdmUgRGF0YSBTaW5nbGUgQnl0ZSBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIFRXSTFfUkNWX0RBVEExNiAgMHhmZmMwMjI4YyAgIC8qIFRXSSBGSUZPIFJlY2VpdmUgRGF0YSBEb3VibGUgQnl0ZSBSZWdpc3RlciAqLworCisvKiBTUEkyICBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIFNQSTJfUkVHQkFTRSAgMHhmZmMwMjQwMAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBTUEkyX0NUTCAgMHhmZmMwMjQwMCAgIC8qIFNQSTIgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBTUEkyX0ZMRyAgMHhmZmMwMjQwNCAgIC8qIFNQSTIgRmxhZyBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIFNQSTJfU1RBVCAgMHhmZmMwMjQwOCAgIC8qIFNQSTIgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgU1BJMl9UREJSICAweGZmYzAyNDBjICAgLyogU1BJMiBUcmFuc21pdCBEYXRhIEJ1ZmZlciBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIFNQSTJfUkRCUiAgMHhmZmMwMjQxMCAgIC8qIFNQSTIgUmVjZWl2ZSBEYXRhIEJ1ZmZlciBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIFNQSTJfQkFVRCAgMHhmZmMwMjQxNCAgIC8qIFNQSTIgQmF1ZCBSYXRlIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIFNQSTJfU0hBRE9XICAweGZmYzAyNDE4ICAgLyogU1BJMiBSZWNlaXZlIERhdGEgQnVmZmVyIFNoYWRvdyBSZWdpc3RlciAqLworCisvKiBBVEFQSSBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgQVRBUElfQ09OVFJPTCAgMHhmZmMwMzgwMCAgIC8qIEFUQVBJIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBBVEFQSV9TVEFUVVMgIDB4ZmZjMDM4MDQgICAvKiBBVEFQSSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgQVRBUElfREVWX0FERFIgIDB4ZmZjMDM4MDggICAvKiBBVEFQSSBEZXZpY2UgUmVnaXN0ZXIgQWRkcmVzcyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEFUQVBJX0RFVl9UWEJVRiAgMHhmZmMwMzgwYyAgIC8qIEFUQVBJIERldmljZSBSZWdpc3RlciBXcml0ZSBEYXRhICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgQVRBUElfREVWX1JYQlVGICAweGZmYzAzODEwICAgLyogQVRBUEkgRGV2aWNlIFJlZ2lzdGVyIFJlYWQgRGF0YSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBBVEFQSV9JTlRfTUFTSyAgMHhmZmMwMzgxNCAgIC8qIEFUQVBJIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBBVEFQSV9JTlRfU1RBVFVTICAweGZmYzAzODE4ICAgLyogQVRBUEkgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBBVEFQSV9YRkVSX0xFTiAgMHhmZmMwMzgxYyAgIC8qIEFUQVBJIExlbmd0aCBvZiBUcmFuc2ZlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICBBVEFQSV9MSU5FX1NUQVRVUyAgMHhmZmMwMzgyMCAgIC8qIEFUQVBJIExpbmUgU3RhdHVzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIEFUQVBJX1NNX1NUQVRFICAweGZmYzAzODI0ICAgLyogQVRBUEkgU3RhdGUgTWFjaGluZSBTdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBBVEFQSV9URVJNSU5BVEUgIDB4ZmZjMDM4MjggICAvKiBBVEFQSSBIb3N0IFRlcm1pbmF0ZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgQVRBUElfUElPX1RGUkNOVCAgMHhmZmMwMzgyYyAgIC8qIEFUQVBJIFBJTyBtb2RlIHRyYW5zZmVyIGNvdW50ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBBVEFQSV9ETUFfVEZSQ05UICAweGZmYzAzODMwICAgLyogQVRBUEkgRE1BIG1vZGUgdHJhbnNmZXIgY291bnQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICBBVEFQSV9VTUFJTl9URlJDTlQgIDB4ZmZjMDM4MzQgICAvKiBBVEFQSSBVRE1BSU4gdHJhbnNmZXIgY291bnQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgQVRBUElfVURNQU9VVF9URlJDTlQgIDB4ZmZjMDM4MzggICAvKiBBVEFQSSBVRE1BT1VUIHRyYW5zZmVyIGNvdW50ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgQVRBUElfUkVHX1RJTV8wICAweGZmYzAzODQwICAgLyogQVRBUEkgUmVnaXN0ZXIgVHJhbnNmZXIgVGltaW5nIDAgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBBVEFQSV9QSU9fVElNXzAgIDB4ZmZjMDM4NDQgICAvKiBBVEFQSSBQSU8gVGltaW5nIDAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBBVEFQSV9QSU9fVElNXzEgIDB4ZmZjMDM4NDggICAvKiBBVEFQSSBQSU8gVGltaW5nIDEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgQVRBUElfTVVMVElfVElNXzAgIDB4ZmZjMDM4NTAgICAvKiBBVEFQSSBNdWx0aS1ETUEgVGltaW5nIDAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgQVRBUElfTVVMVElfVElNXzEgIDB4ZmZjMDM4NTQgICAvKiBBVEFQSSBNdWx0aS1ETUEgVGltaW5nIDEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgQVRBUElfTVVMVElfVElNXzIgIDB4ZmZjMDM4NTggICAvKiBBVEFQSSBNdWx0aS1ETUEgVGltaW5nIDIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgQVRBUElfVUxUUkFfVElNXzAgIDB4ZmZjMDM4NjAgICAvKiBBVEFQSSBVbHRyYS1ETUEgVGltaW5nIDAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgQVRBUElfVUxUUkFfVElNXzEgIDB4ZmZjMDM4NjQgICAvKiBBVEFQSSBVbHRyYS1ETUEgVGltaW5nIDEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgQVRBUElfVUxUUkFfVElNXzIgIDB4ZmZjMDM4NjggICAvKiBBVEFQSSBVbHRyYS1ETUEgVGltaW5nIDIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgQVRBUElfVUxUUkFfVElNXzMgIDB4ZmZjMDM4NmMgICAvKiBBVEFQSSBVbHRyYS1ETUEgVGltaW5nIDMgUmVnaXN0ZXIgKi8KKworLyogU0RIIFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIFNESF9QV1JfQ1RMICAweGZmYzAzOTAwICAgLyogU0RIIFBvd2VyIENvbnRyb2wgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgU0RIX0NMS19DVEwgIDB4ZmZjMDM5MDQgICAvKiBTREggQ2xvY2sgQ29udHJvbCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIFNESF9BUkdVTUVOVCAgMHhmZmMwMzkwOCAgIC8qIFNESCBBcmd1bWVudCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBTREhfQ09NTUFORCAgMHhmZmMwMzkwYyAgIC8qIFNESCBDb21tYW5kICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgU0RIX1JFU1BfQ01EICAweGZmYzAzOTEwICAgLyogU0RIIFJlc3BvbnNlIENvbW1hbmQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFNESF9SRVNQT05TRTAgIDB4ZmZjMDM5MTQgICAvKiBTREggUmVzcG9uc2UwICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBTREhfUkVTUE9OU0UxICAweGZmYzAzOTE4ICAgLyogU0RIIFJlc3BvbnNlMSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgU0RIX1JFU1BPTlNFMiAgMHhmZmMwMzkxYyAgIC8qIFNESCBSZXNwb25zZTIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFNESF9SRVNQT05TRTMgIDB4ZmZjMDM5MjAgICAvKiBTREggUmVzcG9uc2UzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFNESF9EQVRBX1RJTUVSICAweGZmYzAzOTI0ICAgLyogU0RIIERhdGEgVGltZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFNESF9EQVRBX0xHVEggIDB4ZmZjMDM5MjggICAvKiBTREggRGF0YSBMZW5ndGggKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBTREhfREFUQV9DVEwgIDB4ZmZjMDM5MmMgICAvKiBTREggRGF0YSBDb250cm9sICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgU0RIX0RBVEFfQ05UICAweGZmYzAzOTMwICAgLyogU0RIIERhdGEgQ291bnRlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgU0RIX1NUQVRVUyAgMHhmZmMwMzkzNCAgIC8qIFNESCBTdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0RIX1NUQVRVU19DTFIgIDB4ZmZjMDM5MzggICAvKiBTREggU3RhdHVzIENsZWFyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgU0RIX01BU0swICAweGZmYzAzOTNjICAgLyogU0RIIEludGVycnVwdDAgTWFzayAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIFNESF9NQVNLMSAgMHhmZmMwMzk0MCAgIC8qIFNESCBJbnRlcnJ1cHQxIE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBTREhfRklGT19DTlQgIDB4ZmZjMDM5NDggICAvKiBTREggRklGTyBDb3VudGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIFNESF9GSUZPICAweGZmYzAzOTgwICAgLyogU0RIIERhdGEgRklGTyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIFNESF9FX1NUQVRVUyAgMHhmZmMwMzljMCAgIC8qIFNESCBFeGNlcHRpb24gU3RhdHVzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBTREhfRV9NQVNLICAweGZmYzAzOWM0ICAgLyogU0RIIEV4Y2VwdGlvbiBNYXNrICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgICBTREhfQ0ZHICAweGZmYzAzOWM4ICAgLyogU0RIIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgU0RIX1JEX1dBSVRfRU4gIDB4ZmZjMDM5Y2MgICAvKiBTREggUmVhZCBXYWl0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBTREhfUElEMCAgMHhmZmMwMzlkMCAgIC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uMCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBTREhfUElEMSAgMHhmZmMwMzlkNCAgIC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uMSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBTREhfUElEMiAgMHhmZmMwMzlkOCAgIC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uMiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBTREhfUElEMyAgMHhmZmMwMzlkYyAgIC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uMyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBTREhfUElENCAgMHhmZmMwMzllMCAgIC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uNCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBTREhfUElENSAgMHhmZmMwMzllNCAgIC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uNSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBTREhfUElENiAgMHhmZmMwMzllOCAgIC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uNiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBTREhfUElENyAgMHhmZmMwMzllYyAgIC8qIFNESCBQZXJpcGhlcmFsIElkZW50aWZpY2F0aW9uNyAqLworCisvKiBIT1NUIFBvcnQgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBIT1NUX0NPTlRST0wgIDB4ZmZjMDNhMDAgICAvKiBIT1NUIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSE9TVF9TVEFUVVMgIDB4ZmZjMDNhMDQgICAvKiBIT1NUIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEhPU1RfVElNRU9VVCAgMHhmZmMwM2EwOCAgIC8qIEhPU1QgQWNrbm93bGVkZ2UgTW9kZSBUaW1lb3V0IFJlZ2lzdGVyICovCisKKy8qIFVTQiBDb250cm9sIFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgVVNCX0ZBRERSICAweGZmYzAzYzAwICAgLyogRnVuY3Rpb24gYWRkcmVzcyByZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIFVTQl9QT1dFUiAgMHhmZmMwM2MwNCAgIC8qIFBvd2VyIG1hbmFnZW1lbnQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIFVTQl9JTlRSVFggIDB4ZmZjMDNjMDggICAvKiBJbnRlcnJ1cHQgcmVnaXN0ZXIgZm9yIGVuZHBvaW50IDAgYW5kIFR4IGVuZHBvaW50IDEgdG8gNyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgVVNCX0lOVFJSWCAgMHhmZmMwM2MwYyAgIC8qIEludGVycnVwdCByZWdpc3RlciBmb3IgUnggZW5kcG9pbnRzIDEgdG8gNyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBVU0JfSU5UUlRYRSAgMHhmZmMwM2MxMCAgIC8qIEludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgZm9yIEludHJUeCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBVU0JfSU5UUlJYRSAgMHhmZmMwM2MxNCAgIC8qIEludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgZm9yIEludHJSeCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBVU0JfSU5UUlVTQiAgMHhmZmMwM2MxOCAgIC8qIEludGVycnVwdCByZWdpc3RlciBmb3IgY29tbW9uIFVTQiBpbnRlcnJ1cHRzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgVVNCX0lOVFJVU0JFICAweGZmYzAzYzFjICAgLyogSW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciBmb3IgSW50clVTQiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIFVTQl9GUkFNRSAgMHhmZmMwM2MyMCAgIC8qIFVTQiBmcmFtZSBudW1iZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBVU0JfSU5ERVggIDB4ZmZjMDNjMjQgICAvKiBJbmRleCByZWdpc3RlciBmb3Igc2VsZWN0aW5nIHRoZSBpbmRleGVkIGVuZHBvaW50IHJlZ2lzdGVycyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIFVTQl9URVNUTU9ERSAgMHhmZmMwM2MyOCAgIC8qIEVuYWJsZWQgVVNCIDIwIHRlc3QgbW9kZXMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBVU0JfR0xPQklOVFIgIDB4ZmZjMDNjMmMgICAvKiBHbG9iYWwgSW50ZXJydXB0IE1hc2sgcmVnaXN0ZXIgYW5kIFdha2V1cCBFeGNlcHRpb24gSW50ZXJydXB0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFVTQl9HTE9CQUxfQ1RMICAweGZmYzAzYzMwICAgLyogR2xvYmFsIENsb2NrIENvbnRyb2wgZm9yIHRoZSBjb3JlICovCisKKy8qIFVTQiBQYWNrZXQgQ29udHJvbCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICBVU0JfVFhfTUFYX1BBQ0tFVCAgMHhmZmMwM2M0MCAgIC8qIE1heGltdW0gcGFja2V0IHNpemUgZm9yIEhvc3QgVHggZW5kcG9pbnQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgVVNCX0NTUjAgIDB4ZmZjMDNjNDQgICAvKiBDb250cm9sIFN0YXR1cyByZWdpc3RlciBmb3IgZW5kcG9pbnQgMCBhbmQgQ29udHJvbCBTdGF0dXMgcmVnaXN0ZXIgZm9yIEhvc3QgVHggZW5kcG9pbnQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBVU0JfVFhDU1IgIDB4ZmZjMDNjNDQgICAvKiBDb250cm9sIFN0YXR1cyByZWdpc3RlciBmb3IgZW5kcG9pbnQgMCBhbmQgQ29udHJvbCBTdGF0dXMgcmVnaXN0ZXIgZm9yIEhvc3QgVHggZW5kcG9pbnQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgVVNCX1JYX01BWF9QQUNLRVQgIDB4ZmZjMDNjNDggICAvKiBNYXhpbXVtIHBhY2tldCBzaXplIGZvciBIb3N0IFJ4IGVuZHBvaW50ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgVVNCX1JYQ1NSICAweGZmYzAzYzRjICAgLyogQ29udHJvbCBTdGF0dXMgcmVnaXN0ZXIgZm9yIEhvc3QgUnggZW5kcG9pbnQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIFVTQl9DT1VOVDAgIDB4ZmZjMDNjNTAgICAvKiBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgaW4gZW5kcG9pbnQgMCBGSUZPIGFuZCBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgaW4gSG9zdCBUeCBlbmRwb2ludCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBVU0JfUlhDT1VOVCAgMHhmZmMwM2M1MCAgIC8qIE51bWJlciBvZiBieXRlcyByZWNlaXZlZCBpbiBlbmRwb2ludCAwIEZJRk8gYW5kIE51bWJlciBvZiBieXRlcyByZWNlaXZlZCBpbiBIb3N0IFR4IGVuZHBvaW50ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBVU0JfVFhUWVBFICAweGZmYzAzYzU0ICAgLyogU2V0cyB0aGUgdHJhbnNhY3Rpb24gcHJvdG9jb2wgYW5kIHBlcmlwaGVyYWwgZW5kcG9pbnQgbnVtYmVyIGZvciB0aGUgSG9zdCBUeCBlbmRwb2ludCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgVVNCX05BS0xJTUlUMCAgMHhmZmMwM2M1OCAgIC8qIFNldHMgdGhlIE5BSyByZXNwb25zZSB0aW1lb3V0IG9uIEVuZHBvaW50IDAgYW5kIG9uIEJ1bGsgdHJhbnNmZXJzIGZvciBIb3N0IFR4IGVuZHBvaW50ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFVTQl9UWElOVEVSVkFMICAweGZmYzAzYzU4ICAgLyogU2V0cyB0aGUgTkFLIHJlc3BvbnNlIHRpbWVvdXQgb24gRW5kcG9pbnQgMCBhbmQgb24gQnVsayB0cmFuc2ZlcnMgZm9yIEhvc3QgVHggZW5kcG9pbnQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIFVTQl9SWFRZUEUgIDB4ZmZjMDNjNWMgICAvKiBTZXRzIHRoZSB0cmFuc2FjdGlvbiBwcm90b2NvbCBhbmQgcGVyaXBoZXJhbCBlbmRwb2ludCBudW1iZXIgZm9yIHRoZSBIb3N0IFJ4IGVuZHBvaW50ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFVTQl9SWElOVEVSVkFMICAweGZmYzAzYzYwICAgLyogU2V0cyB0aGUgcG9sbGluZyBpbnRlcnZhbCBmb3IgSW50ZXJydXB0IGFuZCBJc29jaHJvbm91cyB0cmFuc2ZlcnMgb3IgdGhlIE5BSyByZXNwb25zZSB0aW1lb3V0IG9uIEJ1bGsgdHJhbnNmZXJzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIFVTQl9UWENPVU5UICAweGZmYzAzYzY4ICAgLyogTnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHNlbGVjdGVkIGVuZHBvaW50IFR4IEZJRk8gKi8KKworLyogVVNCIEVuZHBvaW50IEZJRk8gUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBVU0JfRVAwX0ZJRk8gIDB4ZmZjMDNjODAgICAvKiBFbmRwb2ludCAwIEZJRk8gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBVU0JfRVAxX0ZJRk8gIDB4ZmZjMDNjODggICAvKiBFbmRwb2ludCAxIEZJRk8gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBVU0JfRVAyX0ZJRk8gIDB4ZmZjMDNjOTAgICAvKiBFbmRwb2ludCAyIEZJRk8gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBVU0JfRVAzX0ZJRk8gIDB4ZmZjMDNjOTggICAvKiBFbmRwb2ludCAzIEZJRk8gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBVU0JfRVA0X0ZJRk8gIDB4ZmZjMDNjYTAgICAvKiBFbmRwb2ludCA0IEZJRk8gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBVU0JfRVA1X0ZJRk8gIDB4ZmZjMDNjYTggICAvKiBFbmRwb2ludCA1IEZJRk8gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBVU0JfRVA2X0ZJRk8gIDB4ZmZjMDNjYjAgICAvKiBFbmRwb2ludCA2IEZJRk8gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBVU0JfRVA3X0ZJRk8gIDB4ZmZjMDNjYjggICAvKiBFbmRwb2ludCA3IEZJRk8gKi8KKworLyogVVNCIE9URyBDb250cm9sIFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgVVNCX09UR19ERVZfQ1RMICAweGZmYzAzZDAwICAgLyogT1RHIERldmljZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBVU0JfT1RHX1ZCVVNfSVJRICAweGZmYzAzZDA0ICAgLyogT1RHIFZCVVMgQ29udHJvbCBJbnRlcnJ1cHRzICovCisjZGVmaW5lICAgICAgICAgICAgICAgIFVTQl9PVEdfVkJVU19NQVNLICAweGZmYzAzZDA4ICAgLyogVkJVUyBDb250cm9sIEludGVycnVwdCBFbmFibGUgKi8KKworLyogVVNCIFBoeSBDb250cm9sIFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgVVNCX0xJTktJTkZPICAweGZmYzAzZDQ4ICAgLyogRW5hYmxlcyBwcm9ncmFtbWluZyBvZiBzb21lIFBIWS1zaWRlIGRlbGF5cyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIFVTQl9WUExFTiAgMHhmZmMwM2Q0YyAgIC8qIERldGVybWluZXMgZHVyYXRpb24gb2YgVkJVUyBwdWxzZSBmb3IgVkJVUyBjaGFyZ2luZyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBVU0JfSFNfRU9GMSAgMHhmZmMwM2Q1MCAgIC8qIFRpbWUgYnVmZmVyIGZvciBIaWdoLVNwZWVkIHRyYW5zYWN0aW9ucyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBVU0JfRlNfRU9GMSAgMHhmZmMwM2Q1NCAgIC8qIFRpbWUgYnVmZmVyIGZvciBGdWxsLVNwZWVkIHRyYW5zYWN0aW9ucyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBVU0JfTFNfRU9GMSAgMHhmZmMwM2Q1OCAgIC8qIFRpbWUgYnVmZmVyIGZvciBMb3ctU3BlZWQgdHJhbnNhY3Rpb25zICovCisKKy8qIChBUEhZX0NOVFJMIGlzIGZvciBBREkgdXNhZ2Ugb25seSkgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICBVU0JfQVBIWV9DTlRSTCAgMHhmZmMwM2RlMCAgIC8qIFJlZ2lzdGVyIHRoYXQgaW5jcmVhc2VzIHZpc2liaWxpdHkgb2YgQW5hbG9nIFBIWSAqLworCisvKiAoQVBIWV9DQUxJQiBpcyBmb3IgQURJIHVzYWdlIG9ubHkpICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgVVNCX0FQSFlfQ0FMSUIgIDB4ZmZjMDNkZTQgICAvKiBSZWdpc3RlciB1c2VkIHRvIHNldCBzb21lIGNhbGlicmF0aW9uIHZhbHVlcyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIFVTQl9BUEhZX0NOVFJMMiAgMHhmZmMwM2RlOCAgIC8qIFJlZ2lzdGVyIHVzZWQgdG8gcHJldmVudCByZS1lbnVtZXJhdGlvbiBvbmNlIE1vYWIgZ29lcyBpbnRvIGhpYmVybmF0ZSBtb2RlICovCisKKy8qIChQSFlfVEVTVCBpcyBmb3IgQURJIHVzYWdlIG9ubHkpICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBVU0JfUEhZX1RFU1QgIDB4ZmZjMDNkZWMgICAvKiBVc2VkIGZvciByZWR1Y2luZyBzaW11bGF0aW9uIHRpbWUgYW5kIHNpbXBsaWZpZXMgRklGTyB0ZXN0YWJpbGl0eSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIFVTQl9QTExPU0NfQ1RSTCAgMHhmZmMwM2RmMCAgIC8qIFVzZWQgdG8gcHJvZ3JhbSBkaWZmZXJlbnQgcGFyYW1ldGVycyBmb3IgVVNCIFBMTCBhbmQgT3NjaWxsYXRvciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBVU0JfU1JQX0NMS0RJViAgMHhmZmMwM2RmNCAgIC8qIFVzZWQgdG8gcHJvZ3JhbSBjbG9jayBkaXZpZGUgdmFsdWUgZm9yIHRoZSBjbG9jayBmZWQgdG8gdGhlIFNSUCBkZXRlY3Rpb24gbG9naWMgKi8KKworLyogVVNCIEVuZHBvaW50IDAgQ29udHJvbCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICBVU0JfRVBfTkkwX1RYTUFYUCAgMHhmZmMwM2UwMCAgIC8qIE1heGltdW0gcGFja2V0IHNpemUgZm9yIEhvc3QgVHggZW5kcG9pbnQwICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBVU0JfRVBfTkkwX1RYQ1NSICAweGZmYzAzZTA0ICAgLyogQ29udHJvbCBTdGF0dXMgcmVnaXN0ZXIgZm9yIGVuZHBvaW50IDAgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgVVNCX0VQX05JMF9SWE1BWFAgIDB4ZmZjMDNlMDggICAvKiBNYXhpbXVtIHBhY2tldCBzaXplIGZvciBIb3N0IFJ4IGVuZHBvaW50MCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgVVNCX0VQX05JMF9SWENTUiAgMHhmZmMwM2UwYyAgIC8qIENvbnRyb2wgU3RhdHVzIHJlZ2lzdGVyIGZvciBIb3N0IFJ4IGVuZHBvaW50MCAqLworI2RlZmluZSAgICAgICAgICAgICAgIFVTQl9FUF9OSTBfUlhDT1VOVCAgMHhmZmMwM2UxMCAgIC8qIE51bWJlciBvZiBieXRlcyByZWNlaXZlZCBpbiBlbmRwb2ludCAwIEZJRk8gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgVVNCX0VQX05JMF9UWFRZUEUgIDB4ZmZjMDNlMTQgICAvKiBTZXRzIHRoZSB0cmFuc2FjdGlvbiBwcm90b2NvbCBhbmQgcGVyaXBoZXJhbCBlbmRwb2ludCBudW1iZXIgZm9yIHRoZSBIb3N0IFR4IGVuZHBvaW50MCAqLworI2RlZmluZSAgICAgICAgICAgIFVTQl9FUF9OSTBfVFhJTlRFUlZBTCAgMHhmZmMwM2UxOCAgIC8qIFNldHMgdGhlIE5BSyByZXNwb25zZSB0aW1lb3V0IG9uIEVuZHBvaW50IDAgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgVVNCX0VQX05JMF9SWFRZUEUgIDB4ZmZjMDNlMWMgICAvKiBTZXRzIHRoZSB0cmFuc2FjdGlvbiBwcm90b2NvbCBhbmQgcGVyaXBoZXJhbCBlbmRwb2ludCBudW1iZXIgZm9yIHRoZSBIb3N0IFJ4IGVuZHBvaW50MCAqLworI2RlZmluZSAgICAgICAgICAgIFVTQl9FUF9OSTBfUlhJTlRFUlZBTCAgMHhmZmMwM2UyMCAgIC8qIFNldHMgdGhlIHBvbGxpbmcgaW50ZXJ2YWwgZm9yIEludGVycnVwdC9Jc29jaHJvbm91cyB0cmFuc2ZlcnMgb3IgdGhlIE5BSyByZXNwb25zZSB0aW1lb3V0IG9uIEJ1bGsgdHJhbnNmZXJzIGZvciBIb3N0IFJ4IGVuZHBvaW50MCAqLworCisvKiBVU0IgRW5kcG9pbnQgMSBDb250cm9sIFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgVVNCX0VQX05JMF9UWENPVU5UICAweGZmYzAzZTI4ICAgLyogTnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGVuZHBvaW50MCBUeCBGSUZPICovCisjZGVmaW5lICAgICAgICAgICAgICAgIFVTQl9FUF9OSTFfVFhNQVhQICAweGZmYzAzZTQwICAgLyogTWF4aW11bSBwYWNrZXQgc2l6ZSBmb3IgSG9zdCBUeCBlbmRwb2ludDEgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIFVTQl9FUF9OSTFfVFhDU1IgIDB4ZmZjMDNlNDQgICAvKiBDb250cm9sIFN0YXR1cyByZWdpc3RlciBmb3IgZW5kcG9pbnQxICovCisjZGVmaW5lICAgICAgICAgICAgICAgIFVTQl9FUF9OSTFfUlhNQVhQICAweGZmYzAzZTQ4ICAgLyogTWF4aW11bSBwYWNrZXQgc2l6ZSBmb3IgSG9zdCBSeCBlbmRwb2ludDEgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIFVTQl9FUF9OSTFfUlhDU1IgIDB4ZmZjMDNlNGMgICAvKiBDb250cm9sIFN0YXR1cyByZWdpc3RlciBmb3IgSG9zdCBSeCBlbmRwb2ludDEgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICBVU0JfRVBfTkkxX1JYQ09VTlQgIDB4ZmZjMDNlNTAgICAvKiBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgaW4gZW5kcG9pbnQxIEZJRk8gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgVVNCX0VQX05JMV9UWFRZUEUgIDB4ZmZjMDNlNTQgICAvKiBTZXRzIHRoZSB0cmFuc2FjdGlvbiBwcm90b2NvbCBhbmQgcGVyaXBoZXJhbCBlbmRwb2ludCBudW1iZXIgZm9yIHRoZSBIb3N0IFR4IGVuZHBvaW50MSAqLworI2RlZmluZSAgICAgICAgICAgIFVTQl9FUF9OSTFfVFhJTlRFUlZBTCAgMHhmZmMwM2U1OCAgIC8qIFNldHMgdGhlIE5BSyByZXNwb25zZSB0aW1lb3V0IG9uIEVuZHBvaW50MSAqLworI2RlZmluZSAgICAgICAgICAgICAgICBVU0JfRVBfTkkxX1JYVFlQRSAgMHhmZmMwM2U1YyAgIC8qIFNldHMgdGhlIHRyYW5zYWN0aW9uIHByb3RvY29sIGFuZCBwZXJpcGhlcmFsIGVuZHBvaW50IG51bWJlciBmb3IgdGhlIEhvc3QgUnggZW5kcG9pbnQxICovCisjZGVmaW5lICAgICAgICAgICAgVVNCX0VQX05JMV9SWElOVEVSVkFMICAweGZmYzAzZTYwICAgLyogU2V0cyB0aGUgcG9sbGluZyBpbnRlcnZhbCBmb3IgSW50ZXJydXB0L0lzb2Nocm9ub3VzIHRyYW5zZmVycyBvciB0aGUgTkFLIHJlc3BvbnNlIHRpbWVvdXQgb24gQnVsayB0cmFuc2ZlcnMgZm9yIEhvc3QgUnggZW5kcG9pbnQxICovCisKKy8qIFVTQiBFbmRwb2ludCAyIENvbnRyb2wgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICBVU0JfRVBfTkkxX1RYQ09VTlQgIDB4ZmZjMDNlNjggICAvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbiB0byB0aGUrSDEwMiBlbmRwb2ludDEgVHggRklGTyAqLworI2RlZmluZSAgICAgICAgICAgICAgICBVU0JfRVBfTkkyX1RYTUFYUCAgMHhmZmMwM2U4MCAgIC8qIE1heGltdW0gcGFja2V0IHNpemUgZm9yIEhvc3QgVHggZW5kcG9pbnQyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBVU0JfRVBfTkkyX1RYQ1NSICAweGZmYzAzZTg0ICAgLyogQ29udHJvbCBTdGF0dXMgcmVnaXN0ZXIgZm9yIGVuZHBvaW50MiAqLworI2RlZmluZSAgICAgICAgICAgICAgICBVU0JfRVBfTkkyX1JYTUFYUCAgMHhmZmMwM2U4OCAgIC8qIE1heGltdW0gcGFja2V0IHNpemUgZm9yIEhvc3QgUnggZW5kcG9pbnQyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBVU0JfRVBfTkkyX1JYQ1NSICAweGZmYzAzZThjICAgLyogQ29udHJvbCBTdGF0dXMgcmVnaXN0ZXIgZm9yIEhvc3QgUnggZW5kcG9pbnQyICovCisjZGVmaW5lICAgICAgICAgICAgICAgVVNCX0VQX05JMl9SWENPVU5UICAweGZmYzAzZTkwICAgLyogTnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIGluIGVuZHBvaW50MiBGSUZPICovCisjZGVmaW5lICAgICAgICAgICAgICAgIFVTQl9FUF9OSTJfVFhUWVBFICAweGZmYzAzZTk0ICAgLyogU2V0cyB0aGUgdHJhbnNhY3Rpb24gcHJvdG9jb2wgYW5kIHBlcmlwaGVyYWwgZW5kcG9pbnQgbnVtYmVyIGZvciB0aGUgSG9zdCBUeCBlbmRwb2ludDIgKi8KKyNkZWZpbmUgICAgICAgICAgICBVU0JfRVBfTkkyX1RYSU5URVJWQUwgIDB4ZmZjMDNlOTggICAvKiBTZXRzIHRoZSBOQUsgcmVzcG9uc2UgdGltZW91dCBvbiBFbmRwb2ludDIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgVVNCX0VQX05JMl9SWFRZUEUgIDB4ZmZjMDNlOWMgICAvKiBTZXRzIHRoZSB0cmFuc2FjdGlvbiBwcm90b2NvbCBhbmQgcGVyaXBoZXJhbCBlbmRwb2ludCBudW1iZXIgZm9yIHRoZSBIb3N0IFJ4IGVuZHBvaW50MiAqLworI2RlZmluZSAgICAgICAgICAgIFVTQl9FUF9OSTJfUlhJTlRFUlZBTCAgMHhmZmMwM2VhMCAgIC8qIFNldHMgdGhlIHBvbGxpbmcgaW50ZXJ2YWwgZm9yIEludGVycnVwdC9Jc29jaHJvbm91cyB0cmFuc2ZlcnMgb3IgdGhlIE5BSyByZXNwb25zZSB0aW1lb3V0IG9uIEJ1bGsgdHJhbnNmZXJzIGZvciBIb3N0IFJ4IGVuZHBvaW50MiAqLworCisvKiBVU0IgRW5kcG9pbnQgMyBDb250cm9sIFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgVVNCX0VQX05JMl9UWENPVU5UICAweGZmYzAzZWE4ICAgLyogTnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGVuZHBvaW50MiBUeCBGSUZPICovCisjZGVmaW5lICAgICAgICAgICAgICAgIFVTQl9FUF9OSTNfVFhNQVhQICAweGZmYzAzZWMwICAgLyogTWF4aW11bSBwYWNrZXQgc2l6ZSBmb3IgSG9zdCBUeCBlbmRwb2ludDMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIFVTQl9FUF9OSTNfVFhDU1IgIDB4ZmZjMDNlYzQgICAvKiBDb250cm9sIFN0YXR1cyByZWdpc3RlciBmb3IgZW5kcG9pbnQzICovCisjZGVmaW5lICAgICAgICAgICAgICAgIFVTQl9FUF9OSTNfUlhNQVhQICAweGZmYzAzZWM4ICAgLyogTWF4aW11bSBwYWNrZXQgc2l6ZSBmb3IgSG9zdCBSeCBlbmRwb2ludDMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIFVTQl9FUF9OSTNfUlhDU1IgIDB4ZmZjMDNlY2MgICAvKiBDb250cm9sIFN0YXR1cyByZWdpc3RlciBmb3IgSG9zdCBSeCBlbmRwb2ludDMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICBVU0JfRVBfTkkzX1JYQ09VTlQgIDB4ZmZjMDNlZDAgICAvKiBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgaW4gZW5kcG9pbnQzIEZJRk8gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgVVNCX0VQX05JM19UWFRZUEUgIDB4ZmZjMDNlZDQgICAvKiBTZXRzIHRoZSB0cmFuc2FjdGlvbiBwcm90b2NvbCBhbmQgcGVyaXBoZXJhbCBlbmRwb2ludCBudW1iZXIgZm9yIHRoZSBIb3N0IFR4IGVuZHBvaW50MyAqLworI2RlZmluZSAgICAgICAgICAgIFVTQl9FUF9OSTNfVFhJTlRFUlZBTCAgMHhmZmMwM2VkOCAgIC8qIFNldHMgdGhlIE5BSyByZXNwb25zZSB0aW1lb3V0IG9uIEVuZHBvaW50MyAqLworI2RlZmluZSAgICAgICAgICAgICAgICBVU0JfRVBfTkkzX1JYVFlQRSAgMHhmZmMwM2VkYyAgIC8qIFNldHMgdGhlIHRyYW5zYWN0aW9uIHByb3RvY29sIGFuZCBwZXJpcGhlcmFsIGVuZHBvaW50IG51bWJlciBmb3IgdGhlIEhvc3QgUnggZW5kcG9pbnQzICovCisjZGVmaW5lICAgICAgICAgICAgVVNCX0VQX05JM19SWElOVEVSVkFMICAweGZmYzAzZWUwICAgLyogU2V0cyB0aGUgcG9sbGluZyBpbnRlcnZhbCBmb3IgSW50ZXJydXB0L0lzb2Nocm9ub3VzIHRyYW5zZmVycyBvciB0aGUgTkFLIHJlc3BvbnNlIHRpbWVvdXQgb24gQnVsayB0cmFuc2ZlcnMgZm9yIEhvc3QgUnggZW5kcG9pbnQzICovCisKKy8qIFVTQiBFbmRwb2ludCA0IENvbnRyb2wgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICBVU0JfRVBfTkkzX1RYQ09VTlQgIDB4ZmZjMDNlZTggICAvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbiB0byB0aGUgSDEyNGVuZHBvaW50MyBUeCBGSUZPICovCisjZGVmaW5lICAgICAgICAgICAgICAgIFVTQl9FUF9OSTRfVFhNQVhQICAweGZmYzAzZjAwICAgLyogTWF4aW11bSBwYWNrZXQgc2l6ZSBmb3IgSG9zdCBUeCBlbmRwb2ludDQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIFVTQl9FUF9OSTRfVFhDU1IgIDB4ZmZjMDNmMDQgICAvKiBDb250cm9sIFN0YXR1cyByZWdpc3RlciBmb3IgZW5kcG9pbnQ0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgIFVTQl9FUF9OSTRfUlhNQVhQICAweGZmYzAzZjA4ICAgLyogTWF4aW11bSBwYWNrZXQgc2l6ZSBmb3IgSG9zdCBSeCBlbmRwb2ludDQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIFVTQl9FUF9OSTRfUlhDU1IgIDB4ZmZjMDNmMGMgICAvKiBDb250cm9sIFN0YXR1cyByZWdpc3RlciBmb3IgSG9zdCBSeCBlbmRwb2ludDQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICBVU0JfRVBfTkk0X1JYQ09VTlQgIDB4ZmZjMDNmMTAgICAvKiBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgaW4gZW5kcG9pbnQ0IEZJRk8gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgVVNCX0VQX05JNF9UWFRZUEUgIDB4ZmZjMDNmMTQgICAvKiBTZXRzIHRoZSB0cmFuc2FjdGlvbiBwcm90b2NvbCBhbmQgcGVyaXBoZXJhbCBlbmRwb2ludCBudW1iZXIgZm9yIHRoZSBIb3N0IFR4IGVuZHBvaW50NCAqLworI2RlZmluZSAgICAgICAgICAgIFVTQl9FUF9OSTRfVFhJTlRFUlZBTCAgMHhmZmMwM2YxOCAgIC8qIFNldHMgdGhlIE5BSyByZXNwb25zZSB0aW1lb3V0IG9uIEVuZHBvaW50NCAqLworI2RlZmluZSAgICAgICAgICAgICAgICBVU0JfRVBfTkk0X1JYVFlQRSAgMHhmZmMwM2YxYyAgIC8qIFNldHMgdGhlIHRyYW5zYWN0aW9uIHByb3RvY29sIGFuZCBwZXJpcGhlcmFsIGVuZHBvaW50IG51bWJlciBmb3IgdGhlIEhvc3QgUnggZW5kcG9pbnQ0ICovCisjZGVmaW5lICAgICAgICAgICAgVVNCX0VQX05JNF9SWElOVEVSVkFMICAweGZmYzAzZjIwICAgLyogU2V0cyB0aGUgcG9sbGluZyBpbnRlcnZhbCBmb3IgSW50ZXJydXB0L0lzb2Nocm9ub3VzIHRyYW5zZmVycyBvciB0aGUgTkFLIHJlc3BvbnNlIHRpbWVvdXQgb24gQnVsayB0cmFuc2ZlcnMgZm9yIEhvc3QgUnggZW5kcG9pbnQ0ICovCisKKy8qIFVTQiBFbmRwb2ludCA1IENvbnRyb2wgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICBVU0JfRVBfTkk0X1RYQ09VTlQgIDB4ZmZjMDNmMjggICAvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbiB0byB0aGUgZW5kcG9pbnQ0IFR4IEZJRk8gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgVVNCX0VQX05JNV9UWE1BWFAgIDB4ZmZjMDNmNDAgICAvKiBNYXhpbXVtIHBhY2tldCBzaXplIGZvciBIb3N0IFR4IGVuZHBvaW50NSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgVVNCX0VQX05JNV9UWENTUiAgMHhmZmMwM2Y0NCAgIC8qIENvbnRyb2wgU3RhdHVzIHJlZ2lzdGVyIGZvciBlbmRwb2ludDUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgVVNCX0VQX05JNV9SWE1BWFAgIDB4ZmZjMDNmNDggICAvKiBNYXhpbXVtIHBhY2tldCBzaXplIGZvciBIb3N0IFJ4IGVuZHBvaW50NSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgVVNCX0VQX05JNV9SWENTUiAgMHhmZmMwM2Y0YyAgIC8qIENvbnRyb2wgU3RhdHVzIHJlZ2lzdGVyIGZvciBIb3N0IFJ4IGVuZHBvaW50NSAqLworI2RlZmluZSAgICAgICAgICAgICAgIFVTQl9FUF9OSTVfUlhDT1VOVCAgMHhmZmMwM2Y1MCAgIC8qIE51bWJlciBvZiBieXRlcyByZWNlaXZlZCBpbiBlbmRwb2ludDUgRklGTyAqLworI2RlZmluZSAgICAgICAgICAgICAgICBVU0JfRVBfTkk1X1RYVFlQRSAgMHhmZmMwM2Y1NCAgIC8qIFNldHMgdGhlIHRyYW5zYWN0aW9uIHByb3RvY29sIGFuZCBwZXJpcGhlcmFsIGVuZHBvaW50IG51bWJlciBmb3IgdGhlIEhvc3QgVHggZW5kcG9pbnQ1ICovCisjZGVmaW5lICAgICAgICAgICAgVVNCX0VQX05JNV9UWElOVEVSVkFMICAweGZmYzAzZjU4ICAgLyogU2V0cyB0aGUgTkFLIHJlc3BvbnNlIHRpbWVvdXQgb24gRW5kcG9pbnQ1ICovCisjZGVmaW5lICAgICAgICAgICAgICAgIFVTQl9FUF9OSTVfUlhUWVBFICAweGZmYzAzZjVjICAgLyogU2V0cyB0aGUgdHJhbnNhY3Rpb24gcHJvdG9jb2wgYW5kIHBlcmlwaGVyYWwgZW5kcG9pbnQgbnVtYmVyIGZvciB0aGUgSG9zdCBSeCBlbmRwb2ludDUgKi8KKyNkZWZpbmUgICAgICAgICAgICBVU0JfRVBfTkk1X1JYSU5URVJWQUwgIDB4ZmZjMDNmNjAgICAvKiBTZXRzIHRoZSBwb2xsaW5nIGludGVydmFsIGZvciBJbnRlcnJ1cHQvSXNvY2hyb25vdXMgdHJhbnNmZXJzIG9yIHRoZSBOQUsgcmVzcG9uc2UgdGltZW91dCBvbiBCdWxrIHRyYW5zZmVycyBmb3IgSG9zdCBSeCBlbmRwb2ludDUgKi8KKworLyogVVNCIEVuZHBvaW50IDYgQ29udHJvbCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgIFVTQl9FUF9OSTVfVFhDT1VOVCAgMHhmZmMwM2Y2OCAgIC8qIE51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuIHRvIHRoZSBIMTQ1ZW5kcG9pbnQ1IFR4IEZJRk8gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgVVNCX0VQX05JNl9UWE1BWFAgIDB4ZmZjMDNmODAgICAvKiBNYXhpbXVtIHBhY2tldCBzaXplIGZvciBIb3N0IFR4IGVuZHBvaW50NiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgVVNCX0VQX05JNl9UWENTUiAgMHhmZmMwM2Y4NCAgIC8qIENvbnRyb2wgU3RhdHVzIHJlZ2lzdGVyIGZvciBlbmRwb2ludDYgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgVVNCX0VQX05JNl9SWE1BWFAgIDB4ZmZjMDNmODggICAvKiBNYXhpbXVtIHBhY2tldCBzaXplIGZvciBIb3N0IFJ4IGVuZHBvaW50NiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgVVNCX0VQX05JNl9SWENTUiAgMHhmZmMwM2Y4YyAgIC8qIENvbnRyb2wgU3RhdHVzIHJlZ2lzdGVyIGZvciBIb3N0IFJ4IGVuZHBvaW50NiAqLworI2RlZmluZSAgICAgICAgICAgICAgIFVTQl9FUF9OSTZfUlhDT1VOVCAgMHhmZmMwM2Y5MCAgIC8qIE51bWJlciBvZiBieXRlcyByZWNlaXZlZCBpbiBlbmRwb2ludDYgRklGTyAqLworI2RlZmluZSAgICAgICAgICAgICAgICBVU0JfRVBfTkk2X1RYVFlQRSAgMHhmZmMwM2Y5NCAgIC8qIFNldHMgdGhlIHRyYW5zYWN0aW9uIHByb3RvY29sIGFuZCBwZXJpcGhlcmFsIGVuZHBvaW50IG51bWJlciBmb3IgdGhlIEhvc3QgVHggZW5kcG9pbnQ2ICovCisjZGVmaW5lICAgICAgICAgICAgVVNCX0VQX05JNl9UWElOVEVSVkFMICAweGZmYzAzZjk4ICAgLyogU2V0cyB0aGUgTkFLIHJlc3BvbnNlIHRpbWVvdXQgb24gRW5kcG9pbnQ2ICovCisjZGVmaW5lICAgICAgICAgICAgICAgIFVTQl9FUF9OSTZfUlhUWVBFICAweGZmYzAzZjljICAgLyogU2V0cyB0aGUgdHJhbnNhY3Rpb24gcHJvdG9jb2wgYW5kIHBlcmlwaGVyYWwgZW5kcG9pbnQgbnVtYmVyIGZvciB0aGUgSG9zdCBSeCBlbmRwb2ludDYgKi8KKyNkZWZpbmUgICAgICAgICAgICBVU0JfRVBfTkk2X1JYSU5URVJWQUwgIDB4ZmZjMDNmYTAgICAvKiBTZXRzIHRoZSBwb2xsaW5nIGludGVydmFsIGZvciBJbnRlcnJ1cHQvSXNvY2hyb25vdXMgdHJhbnNmZXJzIG9yIHRoZSBOQUsgcmVzcG9uc2UgdGltZW91dCBvbiBCdWxrIHRyYW5zZmVycyBmb3IgSG9zdCBSeCBlbmRwb2ludDYgKi8KKworLyogVVNCIEVuZHBvaW50IDcgQ29udHJvbCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgIFVTQl9FUF9OSTZfVFhDT1VOVCAgMHhmZmMwM2ZhOCAgIC8qIE51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuIHRvIHRoZSBlbmRwb2ludDYgVHggRklGTyAqLworI2RlZmluZSAgICAgICAgICAgICAgICBVU0JfRVBfTkk3X1RYTUFYUCAgMHhmZmMwM2ZjMCAgIC8qIE1heGltdW0gcGFja2V0IHNpemUgZm9yIEhvc3QgVHggZW5kcG9pbnQ3ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBVU0JfRVBfTkk3X1RYQ1NSICAweGZmYzAzZmM0ICAgLyogQ29udHJvbCBTdGF0dXMgcmVnaXN0ZXIgZm9yIGVuZHBvaW50NyAqLworI2RlZmluZSAgICAgICAgICAgICAgICBVU0JfRVBfTkk3X1JYTUFYUCAgMHhmZmMwM2ZjOCAgIC8qIE1heGltdW0gcGFja2V0IHNpemUgZm9yIEhvc3QgUnggZW5kcG9pbnQ3ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBVU0JfRVBfTkk3X1JYQ1NSICAweGZmYzAzZmNjICAgLyogQ29udHJvbCBTdGF0dXMgcmVnaXN0ZXIgZm9yIEhvc3QgUnggZW5kcG9pbnQ3ICovCisjZGVmaW5lICAgICAgICAgICAgICAgVVNCX0VQX05JN19SWENPVU5UICAweGZmYzAzZmQwICAgLyogTnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIGluIGVuZHBvaW50NyBGSUZPICovCisjZGVmaW5lICAgICAgICAgICAgICAgIFVTQl9FUF9OSTdfVFhUWVBFICAweGZmYzAzZmQ0ICAgLyogU2V0cyB0aGUgdHJhbnNhY3Rpb24gcHJvdG9jb2wgYW5kIHBlcmlwaGVyYWwgZW5kcG9pbnQgbnVtYmVyIGZvciB0aGUgSG9zdCBUeCBlbmRwb2ludDcgKi8KKyNkZWZpbmUgICAgICAgICAgICBVU0JfRVBfTkk3X1RYSU5URVJWQUwgIDB4ZmZjMDNmZDggICAvKiBTZXRzIHRoZSBOQUsgcmVzcG9uc2UgdGltZW91dCBvbiBFbmRwb2ludDcgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgVVNCX0VQX05JN19SWFRZUEUgIDB4ZmZjMDNmZGMgICAvKiBTZXRzIHRoZSB0cmFuc2FjdGlvbiBwcm90b2NvbCBhbmQgcGVyaXBoZXJhbCBlbmRwb2ludCBudW1iZXIgZm9yIHRoZSBIb3N0IFJ4IGVuZHBvaW50NyAqLworI2RlZmluZSAgICAgICAgICAgIFVTQl9FUF9OSTdfUlhJTlRFUlZBTCAgMHhmZmMwM2ZmMCAgIC8qIFNldHMgdGhlIHBvbGxpbmcgaW50ZXJ2YWwgZm9yIEludGVycnVwdC9Jc29jaHJvbm91cyB0cmFuc2ZlcnMgb3IgdGhlIE5BSyByZXNwb25zZSB0aW1lb3V0IG9uIEJ1bGsgdHJhbnNmZXJzIGZvciBIb3N0IFJ4IGVuZHBvaW50NyAqLworI2RlZmluZSAgICAgICAgICAgICAgIFVTQl9FUF9OSTdfVFhDT1VOVCAgMHhmZmMwM2ZmOCAgIC8qIE51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuIHRvIHRoZSBlbmRwb2ludDcgVHggRklGTyAqLworI2RlZmluZSAgICAgICAgICAgICAgICBVU0JfRE1BX0lOVEVSUlVQVCAgMHhmZmMwNDAwMCAgIC8qIEluZGljYXRlcyBwZW5kaW5nIGludGVycnVwdHMgZm9yIHRoZSBETUEgY2hhbm5lbHMgKi8KKworLyogVVNCIENoYW5uZWwgMCBDb25maWcgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBVU0JfRE1BMENPTlRST0wgIDB4ZmZjMDQwMDQgICAvKiBETUEgbWFzdGVyIGNoYW5uZWwgMCBjb25maWd1cmF0aW9uICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgVVNCX0RNQTBBRERSTE9XICAweGZmYzA0MDA4ICAgLyogTG93ZXIgMTYtYml0cyBvZiBtZW1vcnkgc291cmNlL2Rlc3RpbmF0aW9uIGFkZHJlc3MgZm9yIERNQSBtYXN0ZXIgY2hhbm5lbCAwICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBVU0JfRE1BMEFERFJISUdIICAweGZmYzA0MDBjICAgLyogVXBwZXIgMTYtYml0cyBvZiBtZW1vcnkgc291cmNlL2Rlc3RpbmF0aW9uIGFkZHJlc3MgZm9yIERNQSBtYXN0ZXIgY2hhbm5lbCAwICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBVU0JfRE1BMENPVU5UTE9XICAweGZmYzA0MDEwICAgLyogTG93ZXIgMTYtYml0cyBvZiBieXRlIGNvdW50IG9mIERNQSB0cmFuc2ZlciBmb3IgRE1BIG1hc3RlciBjaGFubmVsIDAgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgVVNCX0RNQTBDT1VOVEhJR0ggIDB4ZmZjMDQwMTQgICAvKiBVcHBlciAxNi1iaXRzIG9mIGJ5dGUgY291bnQgb2YgRE1BIHRyYW5zZmVyIGZvciBETUEgbWFzdGVyIGNoYW5uZWwgMCAqLworCisvKiBVU0IgQ2hhbm5lbCAxIENvbmZpZyBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgIFVTQl9ETUExQ09OVFJPTCAgMHhmZmMwNDAyNCAgIC8qIERNQSBtYXN0ZXIgY2hhbm5lbCAxIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBVU0JfRE1BMUFERFJMT1cgIDB4ZmZjMDQwMjggICAvKiBMb3dlciAxNi1iaXRzIG9mIG1lbW9yeSBzb3VyY2UvZGVzdGluYXRpb24gYWRkcmVzcyBmb3IgRE1BIG1hc3RlciBjaGFubmVsIDEgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIFVTQl9ETUExQUREUkhJR0ggIDB4ZmZjMDQwMmMgICAvKiBVcHBlciAxNi1iaXRzIG9mIG1lbW9yeSBzb3VyY2UvZGVzdGluYXRpb24gYWRkcmVzcyBmb3IgRE1BIG1hc3RlciBjaGFubmVsIDEgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIFVTQl9ETUExQ09VTlRMT1cgIDB4ZmZjMDQwMzAgICAvKiBMb3dlciAxNi1iaXRzIG9mIGJ5dGUgY291bnQgb2YgRE1BIHRyYW5zZmVyIGZvciBETUEgbWFzdGVyIGNoYW5uZWwgMSAqLworI2RlZmluZSAgICAgICAgICAgICAgICBVU0JfRE1BMUNPVU5USElHSCAgMHhmZmMwNDAzNCAgIC8qIFVwcGVyIDE2LWJpdHMgb2YgYnl0ZSBjb3VudCBvZiBETUEgdHJhbnNmZXIgZm9yIERNQSBtYXN0ZXIgY2hhbm5lbCAxICovCisKKy8qIFVTQiBDaGFubmVsIDIgQ29uZmlnIFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgVVNCX0RNQTJDT05UUk9MICAweGZmYzA0MDQ0ICAgLyogRE1BIG1hc3RlciBjaGFubmVsIDIgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIFVTQl9ETUEyQUREUkxPVyAgMHhmZmMwNDA0OCAgIC8qIExvd2VyIDE2LWJpdHMgb2YgbWVtb3J5IHNvdXJjZS9kZXN0aW5hdGlvbiBhZGRyZXNzIGZvciBETUEgbWFzdGVyIGNoYW5uZWwgMiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgVVNCX0RNQTJBRERSSElHSCAgMHhmZmMwNDA0YyAgIC8qIFVwcGVyIDE2LWJpdHMgb2YgbWVtb3J5IHNvdXJjZS9kZXN0aW5hdGlvbiBhZGRyZXNzIGZvciBETUEgbWFzdGVyIGNoYW5uZWwgMiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgVVNCX0RNQTJDT1VOVExPVyAgMHhmZmMwNDA1MCAgIC8qIExvd2VyIDE2LWJpdHMgb2YgYnl0ZSBjb3VudCBvZiBETUEgdHJhbnNmZXIgZm9yIERNQSBtYXN0ZXIgY2hhbm5lbCAyICovCisjZGVmaW5lICAgICAgICAgICAgICAgIFVTQl9ETUEyQ09VTlRISUdIICAweGZmYzA0MDU0ICAgLyogVXBwZXIgMTYtYml0cyBvZiBieXRlIGNvdW50IG9mIERNQSB0cmFuc2ZlciBmb3IgRE1BIG1hc3RlciBjaGFubmVsIDIgKi8KKworLyogVVNCIENoYW5uZWwgMyBDb25maWcgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBVU0JfRE1BM0NPTlRST0wgIDB4ZmZjMDQwNjQgICAvKiBETUEgbWFzdGVyIGNoYW5uZWwgMyBjb25maWd1cmF0aW9uICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgVVNCX0RNQTNBRERSTE9XICAweGZmYzA0MDY4ICAgLyogTG93ZXIgMTYtYml0cyBvZiBtZW1vcnkgc291cmNlL2Rlc3RpbmF0aW9uIGFkZHJlc3MgZm9yIERNQSBtYXN0ZXIgY2hhbm5lbCAzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBVU0JfRE1BM0FERFJISUdIICAweGZmYzA0MDZjICAgLyogVXBwZXIgMTYtYml0cyBvZiBtZW1vcnkgc291cmNlL2Rlc3RpbmF0aW9uIGFkZHJlc3MgZm9yIERNQSBtYXN0ZXIgY2hhbm5lbCAzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBVU0JfRE1BM0NPVU5UTE9XICAweGZmYzA0MDcwICAgLyogTG93ZXIgMTYtYml0cyBvZiBieXRlIGNvdW50IG9mIERNQSB0cmFuc2ZlciBmb3IgRE1BIG1hc3RlciBjaGFubmVsIDMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgVVNCX0RNQTNDT1VOVEhJR0ggIDB4ZmZjMDQwNzQgICAvKiBVcHBlciAxNi1iaXRzIG9mIGJ5dGUgY291bnQgb2YgRE1BIHRyYW5zZmVyIGZvciBETUEgbWFzdGVyIGNoYW5uZWwgMyAqLworCisvKiBVU0IgQ2hhbm5lbCA0IENvbmZpZyBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgIFVTQl9ETUE0Q09OVFJPTCAgMHhmZmMwNDA4NCAgIC8qIERNQSBtYXN0ZXIgY2hhbm5lbCA0IGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBVU0JfRE1BNEFERFJMT1cgIDB4ZmZjMDQwODggICAvKiBMb3dlciAxNi1iaXRzIG9mIG1lbW9yeSBzb3VyY2UvZGVzdGluYXRpb24gYWRkcmVzcyBmb3IgRE1BIG1hc3RlciBjaGFubmVsIDQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIFVTQl9ETUE0QUREUkhJR0ggIDB4ZmZjMDQwOGMgICAvKiBVcHBlciAxNi1iaXRzIG9mIG1lbW9yeSBzb3VyY2UvZGVzdGluYXRpb24gYWRkcmVzcyBmb3IgRE1BIG1hc3RlciBjaGFubmVsIDQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIFVTQl9ETUE0Q09VTlRMT1cgIDB4ZmZjMDQwOTAgICAvKiBMb3dlciAxNi1iaXRzIG9mIGJ5dGUgY291bnQgb2YgRE1BIHRyYW5zZmVyIGZvciBETUEgbWFzdGVyIGNoYW5uZWwgNCAqLworI2RlZmluZSAgICAgICAgICAgICAgICBVU0JfRE1BNENPVU5USElHSCAgMHhmZmMwNDA5NCAgIC8qIFVwcGVyIDE2LWJpdHMgb2YgYnl0ZSBjb3VudCBvZiBETUEgdHJhbnNmZXIgZm9yIERNQSBtYXN0ZXIgY2hhbm5lbCA0ICovCisKKy8qIFVTQiBDaGFubmVsIDUgQ29uZmlnIFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgVVNCX0RNQTVDT05UUk9MICAweGZmYzA0MGE0ICAgLyogRE1BIG1hc3RlciBjaGFubmVsIDUgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIFVTQl9ETUE1QUREUkxPVyAgMHhmZmMwNDBhOCAgIC8qIExvd2VyIDE2LWJpdHMgb2YgbWVtb3J5IHNvdXJjZS9kZXN0aW5hdGlvbiBhZGRyZXNzIGZvciBETUEgbWFzdGVyIGNoYW5uZWwgNSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgVVNCX0RNQTVBRERSSElHSCAgMHhmZmMwNDBhYyAgIC8qIFVwcGVyIDE2LWJpdHMgb2YgbWVtb3J5IHNvdXJjZS9kZXN0aW5hdGlvbiBhZGRyZXNzIGZvciBETUEgbWFzdGVyIGNoYW5uZWwgNSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgVVNCX0RNQTVDT1VOVExPVyAgMHhmZmMwNDBiMCAgIC8qIExvd2VyIDE2LWJpdHMgb2YgYnl0ZSBjb3VudCBvZiBETUEgdHJhbnNmZXIgZm9yIERNQSBtYXN0ZXIgY2hhbm5lbCA1ICovCisjZGVmaW5lICAgICAgICAgICAgICAgIFVTQl9ETUE1Q09VTlRISUdIICAweGZmYzA0MGI0ICAgLyogVXBwZXIgMTYtYml0cyBvZiBieXRlIGNvdW50IG9mIERNQSB0cmFuc2ZlciBmb3IgRE1BIG1hc3RlciBjaGFubmVsIDUgKi8KKworLyogVVNCIENoYW5uZWwgNiBDb25maWcgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBVU0JfRE1BNkNPTlRST0wgIDB4ZmZjMDQwYzQgICAvKiBETUEgbWFzdGVyIGNoYW5uZWwgNiBjb25maWd1cmF0aW9uICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgVVNCX0RNQTZBRERSTE9XICAweGZmYzA0MGM4ICAgLyogTG93ZXIgMTYtYml0cyBvZiBtZW1vcnkgc291cmNlL2Rlc3RpbmF0aW9uIGFkZHJlc3MgZm9yIERNQSBtYXN0ZXIgY2hhbm5lbCA2ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBVU0JfRE1BNkFERFJISUdIICAweGZmYzA0MGNjICAgLyogVXBwZXIgMTYtYml0cyBvZiBtZW1vcnkgc291cmNlL2Rlc3RpbmF0aW9uIGFkZHJlc3MgZm9yIERNQSBtYXN0ZXIgY2hhbm5lbCA2ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBVU0JfRE1BNkNPVU5UTE9XICAweGZmYzA0MGQwICAgLyogTG93ZXIgMTYtYml0cyBvZiBieXRlIGNvdW50IG9mIERNQSB0cmFuc2ZlciBmb3IgRE1BIG1hc3RlciBjaGFubmVsIDYgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgVVNCX0RNQTZDT1VOVEhJR0ggIDB4ZmZjMDQwZDQgICAvKiBVcHBlciAxNi1iaXRzIG9mIGJ5dGUgY291bnQgb2YgRE1BIHRyYW5zZmVyIGZvciBETUEgbWFzdGVyIGNoYW5uZWwgNiAqLworCisvKiBVU0IgQ2hhbm5lbCA3IENvbmZpZyBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgIFVTQl9ETUE3Q09OVFJPTCAgMHhmZmMwNDBlNCAgIC8qIERNQSBtYXN0ZXIgY2hhbm5lbCA3IGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBVU0JfRE1BN0FERFJMT1cgIDB4ZmZjMDQwZTggICAvKiBMb3dlciAxNi1iaXRzIG9mIG1lbW9yeSBzb3VyY2UvZGVzdGluYXRpb24gYWRkcmVzcyBmb3IgRE1BIG1hc3RlciBjaGFubmVsIDcgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIFVTQl9ETUE3QUREUkhJR0ggIDB4ZmZjMDQwZWMgICAvKiBVcHBlciAxNi1iaXRzIG9mIG1lbW9yeSBzb3VyY2UvZGVzdGluYXRpb24gYWRkcmVzcyBmb3IgRE1BIG1hc3RlciBjaGFubmVsIDcgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIFVTQl9ETUE3Q09VTlRMT1cgIDB4ZmZjMDQwZjAgICAvKiBMb3dlciAxNi1iaXRzIG9mIGJ5dGUgY291bnQgb2YgRE1BIHRyYW5zZmVyIGZvciBETUEgbWFzdGVyIGNoYW5uZWwgNyAqLworI2RlZmluZSAgICAgICAgICAgICAgICBVU0JfRE1BN0NPVU5USElHSCAgMHhmZmMwNDBmNCAgIC8qIFVwcGVyIDE2LWJpdHMgb2YgYnl0ZSBjb3VudCBvZiBETUEgdHJhbnNmZXIgZm9yIERNQSBtYXN0ZXIgY2hhbm5lbCA3ICovCisKKy8qIEtleXBhZCBSZWdpc3RlcnMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICBLUEFEX0NUTCAgMHhmZmMwNDEwMCAgIC8qIENvbnRyb2xzIGtleXBhZCBtb2R1bGUgZW5hYmxlIGFuZCBkaXNhYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBLUEFEX1BSRVNDQUxFICAweGZmYzA0MTA0ICAgLyogRXN0YWJsaXNoIGEgdGltZSBiYXNlIGZvciBwcm9ncmFtaW5nIHRoZSBLUEFEX01TRUwgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBLUEFEX01TRUwgIDB4ZmZjMDQxMDggICAvKiBTZWxlY3RzIGRlbGF5IHBhcmFtZXRlcnMgZm9yIGtleXBhZCBpbnRlcmZhY2Ugc2Vuc2l0aXZpdHkgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgS1BBRF9ST1dDT0wgIDB4ZmZjMDQxMGMgICAvKiBDYXB0dXJlcyB0aGUgcm93IGFuZCBjb2x1bW4gb3V0cHV0IHZhbHVlcyBvZiB0aGUga2V5cyBwcmVzc2VkICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgS1BBRF9TVEFUICAweGZmYzA0MTEwICAgLyogSG9sZHMgYW5kIGNsZWFycyB0aGUgc3RhdHVzIG9mIHRoZSBrZXlwYWQgaW50ZXJmYWNlIGludGVycnVwdCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgS1BBRF9TT0ZURVZBTCAgMHhmZmMwNDExNCAgIC8qIExldHMgc29mdHdhcmUgZm9yY2Uga2V5cGFkIGludGVyZmFjZSB0byBjaGVjayBmb3Iga2V5cyBiZWluZyBwcmVzc2VkICovCisKKy8qIFBpeGVsIENvbXBvc2l0b3IgKFBJWEMpIFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIFBJWENfQ1RMICAweGZmYzA0NDAwICAgLyogT3ZlcmxheSBlbmFibGUsIHJlc2FtcGxpbmcgbW9kZSwgSS9PIGRhdGEgZm9ybWF0LCB0cmFuc3BhcmVuY3kgZW5hYmxlLCB3YXRlcm1hcmsgbGV2ZWwsIEZJRk8gc3RhdHVzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgIFBJWENfUFBMICAweGZmYzA0NDA0ICAgLyogSG9sZHMgdGhlIG51bWJlciBvZiBwaXhlbHMgcGVyIGxpbmUgb2YgdGhlIGRpc3BsYXkgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgUElYQ19MUEYgIDB4ZmZjMDQ0MDggICAvKiBIb2xkcyB0aGUgbnVtYmVyIG9mIGxpbmVzIHBlciBmcmFtZSBvZiB0aGUgZGlzcGxheSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIFBJWENfQUhTVEFSVCAgMHhmZmMwNDQwYyAgIC8qIENvbnRhaW5zIGhvcml6b250YWwgc3RhcnQgcGl4ZWwgaW5mb3JtYXRpb24gb2YgdGhlIG92ZXJsYXkgZGF0YSAoc2V0IEEpICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBQSVhDX0FIRU5EICAweGZmYzA0NDEwICAgLyogQ29udGFpbnMgaG9yaXpvbnRhbCBlbmQgcGl4ZWwgaW5mb3JtYXRpb24gb2YgdGhlIG92ZXJsYXkgZGF0YSAoc2V0IEEpICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgUElYQ19BVlNUQVJUICAweGZmYzA0NDE0ICAgLyogQ29udGFpbnMgdmVydGljYWwgc3RhcnQgcGl4ZWwgaW5mb3JtYXRpb24gb2YgdGhlIG92ZXJsYXkgZGF0YSAoc2V0IEEpICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBQSVhDX0FWRU5EICAweGZmYzA0NDE4ICAgLyogQ29udGFpbnMgdmVydGljYWwgZW5kIHBpeGVsIGluZm9ybWF0aW9uIG9mIHRoZSBvdmVybGF5IGRhdGEgKHNldCBBKSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIFBJWENfQVRSQU5TUCAgMHhmZmMwNDQxYyAgIC8qIENvbnRhaW5zIHRoZSB0cmFuc3BhcmVuY3kgcmF0aW8gKHNldCBBKSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIFBJWENfQkhTVEFSVCAgMHhmZmMwNDQyMCAgIC8qIENvbnRhaW5zIGhvcml6b250YWwgc3RhcnQgcGl4ZWwgaW5mb3JtYXRpb24gb2YgdGhlIG92ZXJsYXkgZGF0YSAoc2V0IEIpICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBQSVhDX0JIRU5EICAweGZmYzA0NDI0ICAgLyogQ29udGFpbnMgaG9yaXpvbnRhbCBlbmQgcGl4ZWwgaW5mb3JtYXRpb24gb2YgdGhlIG92ZXJsYXkgZGF0YSAoc2V0IEIpICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgUElYQ19CVlNUQVJUICAweGZmYzA0NDI4ICAgLyogQ29udGFpbnMgdmVydGljYWwgc3RhcnQgcGl4ZWwgaW5mb3JtYXRpb24gb2YgdGhlIG92ZXJsYXkgZGF0YSAoc2V0IEIpICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBQSVhDX0JWRU5EICAweGZmYzA0NDJjICAgLyogQ29udGFpbnMgdmVydGljYWwgZW5kIHBpeGVsIGluZm9ybWF0aW9uIG9mIHRoZSBvdmVybGF5IGRhdGEgKHNldCBCKSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIFBJWENfQlRSQU5TUCAgMHhmZmMwNDQzMCAgIC8qIENvbnRhaW5zIHRoZSB0cmFuc3BhcmVuY3kgcmF0aW8gKHNldCBCKSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgUElYQ19JTlRSU1RBVCAgMHhmZmMwNDQzYyAgIC8qIE92ZXJsYXkgaW50ZXJydXB0IGNvbmZpZ3VyYXRpb24vc3RhdHVzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBQSVhDX1JZQ09OICAweGZmYzA0NDQwICAgLyogQ29sb3Igc3BhY2UgY29udmVyc2lvbiBtYXRyaXggcmVnaXN0ZXIuIENvbnRhaW5zIHRoZSBSL1kgY29udmVyc2lvbiBjb2VmZmljaWVudHMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIFBJWENfR1VDT04gIDB4ZmZjMDQ0NDQgICAvKiBDb2xvciBzcGFjZSBjb252ZXJzaW9uIG1hdHJpeCByZWdpc3Rlci4gQ29udGFpbnMgdGhlIEcvVSBjb252ZXJzaW9uIGNvZWZmaWNpZW50cyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgUElYQ19CVkNPTiAgMHhmZmMwNDQ0OCAgIC8qIENvbG9yIHNwYWNlIGNvbnZlcnNpb24gbWF0cml4IHJlZ2lzdGVyLiBDb250YWlucyB0aGUgQi9WIGNvbnZlcnNpb24gY29lZmZpY2llbnRzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIFBJWENfQ0NCSUFTICAweGZmYzA0NDRjICAgLyogQmlhcyB2YWx1ZXMgZm9yIHRoZSBjb2xvciBzcGFjZSBjb252ZXJzaW9uIG1hdHJpeCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgICAgUElYQ19UQyAgMHhmZmMwNDQ1MCAgIC8qIEhvbGRzIHRoZSB0cmFuc3BhcmVudCBjb2xvciB2YWx1ZSAqLworCisvKiBIYW5kc2hha2UgTURNQSAwIFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIEhNRE1BMF9DT05UUk9MICAweGZmYzA0NTAwICAgLyogSGFuZHNoYWtlIE1ETUEwIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEhNRE1BMF9FQ0lOSVQgIDB4ZmZjMDQ1MDQgICAvKiBIYW5kc2hha2UgTURNQTAgSW5pdGlhbCBFZGdlIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBITURNQTBfQkNJTklUICAweGZmYzA0NTA4ICAgLyogSGFuZHNoYWtlIE1ETUEwIEluaXRpYWwgQmxvY2sgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBITURNQTBfRUNVUkdFTlQgIDB4ZmZjMDQ1MGMgICAvKiBIYW5kc2hha2UgTURNQTAgVXJnZW50IEVkZ2UgQ291bnQgVGhyZXNoaG9sZCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICBITURNQTBfRUNPVkVSRkxPVyAgMHhmZmMwNDUxMCAgIC8qIEhhbmRzaGFrZSBNRE1BMCBFZGdlIENvdW50IE92ZXJmbG93IEludGVycnVwdCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgSE1ETUEwX0VDT1VOVCAgMHhmZmMwNDUxNCAgIC8qIEhhbmRzaGFrZSBNRE1BMCBDdXJyZW50IEVkZ2UgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEhNRE1BMF9CQ09VTlQgIDB4ZmZjMDQ1MTggICAvKiBIYW5kc2hha2UgTURNQTAgQ3VycmVudCBCbG9jayBDb3VudCBSZWdpc3RlciAqLworCisvKiBIYW5kc2hha2UgTURNQSAxIFJlZ2lzdGVycyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIEhNRE1BMV9DT05UUk9MICAweGZmYzA0NTQwICAgLyogSGFuZHNoYWtlIE1ETUExIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEhNRE1BMV9FQ0lOSVQgIDB4ZmZjMDQ1NDQgICAvKiBIYW5kc2hha2UgTURNQTEgSW5pdGlhbCBFZGdlIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBITURNQTFfQkNJTklUICAweGZmYzA0NTQ4ICAgLyogSGFuZHNoYWtlIE1ETUExIEluaXRpYWwgQmxvY2sgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBITURNQTFfRUNVUkdFTlQgIDB4ZmZjMDQ1NGMgICAvKiBIYW5kc2hha2UgTURNQTEgVXJnZW50IEVkZ2UgQ291bnQgVGhyZXNoaG9sZCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICBITURNQTFfRUNPVkVSRkxPVyAgMHhmZmMwNDU1MCAgIC8qIEhhbmRzaGFrZSBNRE1BMSBFZGdlIENvdW50IE92ZXJmbG93IEludGVycnVwdCBSZWdpc3RlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgSE1ETUExX0VDT1VOVCAgMHhmZmMwNDU1NCAgIC8qIEhhbmRzaGFrZSBNRE1BMSBDdXJyZW50IEVkZ2UgQ291bnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEhNRE1BMV9CQ09VTlQgIDB4ZmZjMDQ1NTggICAvKiBIYW5kc2hha2UgTURNQTEgQ3VycmVudCBCbG9jayBDb3VudCBSZWdpc3RlciAqLworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICAgICBTSU5HTEUgQklUIE1BQ1JPIFBBSVJTIChiaXQgbWFzayBhbmQgbmVnYXRlZCBvbmUpICAgICAgKi8KKy8qICAgICBhbmQgTVVMVEkgQklUIFJFQUQgTUFDUk9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyogQml0IG1hc2tzIGZvciBQSVhDX0NUTCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFBJWENfRU4gIDB4MSAgICAgICAgLyogUGl4ZWwgQ29tcG9zaXRvciBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBPVlJfQV9FTiAgMHgyICAgICAgICAvKiBPdmVybGF5IEEgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgT1ZSX0JfRU4gIDB4NCAgICAgICAgLyogT3ZlcmxheSBCIEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIElNR19GT1JNICAweDggICAgICAgIC8qIEltYWdlIERhdGEgRm9ybWF0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgT1ZSX0ZPUk0gIDB4MTAgICAgICAgLyogT3ZlcmxheSBEYXRhIEZvcm1hdCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIE9VVF9GT1JNICAweDIwICAgICAgIC8qIE91dHB1dCBEYXRhIEZvcm1hdCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBVRFNfTU9EICAweDQwICAgICAgIC8qIFJlc2FtcGxpbmcgTW9kZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIFRDX0VOICAweDgwICAgICAgIC8qIFRyYW5zcGFyZW50IENvbG9yIEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIElNR19TVEFUICAweDMwMCAgICAgIC8qIEltYWdlIEZJRk8gU3RhdHVzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgT1ZSX1NUQVQgIDB4YzAwICAgICAgLyogT3ZlcmxheSBGSUZPIFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgV01fTFZMICAweDMwMDAgICAgIC8qIEZJRk8gV2F0ZXJtYXJrIExldmVsICovCisKKy8qIEJpdCBtYXNrcyBmb3IgUElYQ19BSFNUQVJUICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBBX0hTVEFSVCAgMHhmZmYgICAgICAvKiBIb3Jpem9udGFsIFN0YXJ0IENvb3JkaW5hdGVzICovCisKKy8qIEJpdCBtYXNrcyBmb3IgUElYQ19BSEVORCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBBX0hFTkQgIDB4ZmZmICAgICAgLyogSG9yaXpvbnRhbCBFbmQgQ29vcmRpbmF0ZXMgKi8KKworLyogQml0IG1hc2tzIGZvciBQSVhDX0FWU1RBUlQgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgIEFfVlNUQVJUICAweDNmZiAgICAgIC8qIFZlcnRpY2FsIFN0YXJ0IENvb3JkaW5hdGVzICovCisKKy8qIEJpdCBtYXNrcyBmb3IgUElYQ19BVkVORCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBBX1ZFTkQgIDB4M2ZmICAgICAgLyogVmVydGljYWwgRW5kIENvb3JkaW5hdGVzICovCisKKy8qIEJpdCBtYXNrcyBmb3IgUElYQ19BVFJBTlNQICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBBX1RSQU5TUCAgMHhmICAgICAgICAvKiBUcmFuc3BhcmVuY3kgVmFsdWUgKi8KKworLyogQml0IG1hc2tzIGZvciBQSVhDX0JIU1RBUlQgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgIEJfSFNUQVJUICAweGZmZiAgICAgIC8qIEhvcml6b250YWwgU3RhcnQgQ29vcmRpbmF0ZXMgKi8KKworLyogQml0IG1hc2tzIGZvciBQSVhDX0JIRU5EICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEJfSEVORCAgMHhmZmYgICAgICAvKiBIb3Jpem9udGFsIEVuZCBDb29yZGluYXRlcyAqLworCisvKiBCaXQgbWFza3MgZm9yIFBJWENfQlZTVEFSVCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgQl9WU1RBUlQgIDB4M2ZmICAgICAgLyogVmVydGljYWwgU3RhcnQgQ29vcmRpbmF0ZXMgKi8KKworLyogQml0IG1hc2tzIGZvciBQSVhDX0JWRU5EICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEJfVkVORCAgMHgzZmYgICAgICAvKiBWZXJ0aWNhbCBFbmQgQ29vcmRpbmF0ZXMgKi8KKworLyogQml0IG1hc2tzIGZvciBQSVhDX0JUUkFOU1AgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgIEJfVFJBTlNQICAweGYgICAgICAgIC8qIFRyYW5zcGFyZW5jeSBWYWx1ZSAqLworCisvKiBCaXQgbWFza3MgZm9yIFBJWENfSU5UUlNUQVQgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICBPVlJfSU5UX0VOICAweDEgICAgICAgIC8qIEludGVycnVwdCBhdCBFbmQgb2YgTGFzdCBWYWxpZCBPdmVybGF5ICovCisjZGVmaW5lICAgICAgICAgICAgICAgIEZSTV9JTlRfRU4gIDB4MiAgICAgICAgLyogSW50ZXJydXB0IGF0IEVuZCBvZiBGcmFtZSAqLworI2RlZmluZSAgICAgICAgICAgICAgT1ZSX0lOVF9TVEFUICAweDQgICAgICAgIC8qIE92ZXJsYXkgSW50ZXJydXB0IFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICAgICAgRlJNX0lOVF9TVEFUICAweDggICAgICAgIC8qIEZyYW1lIEludGVycnVwdCBTdGF0dXMgKi8KKworLyogQml0IG1hc2tzIGZvciBQSVhDX1JZQ09OICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEExMSAgMHgzZmYgICAgICAvKiBBMTEgaW4gdGhlIENvZWZmaWNpZW50IE1hdHJpeCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgQTEyICAweGZmYzAwICAgIC8qIEExMiBpbiB0aGUgQ29lZmZpY2llbnQgTWF0cml4ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBBMTMgIDB4M2ZmMDAwMDAgLyogQTEzIGluIHRoZSBDb2VmZmljaWVudCBNYXRyaXggKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBSWV9NVUxUNCAgMHg0MDAwMDAwMCAvKiBNdWx0aXBseSBSb3cgYnkgNCAqLworCisvKiBCaXQgbWFza3MgZm9yIFBJWENfR1VDT04gKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgQTIxICAweDNmZiAgICAgIC8qIEEyMSBpbiB0aGUgQ29lZmZpY2llbnQgTWF0cml4ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBBMjIgIDB4ZmZjMDAgICAgLyogQTIyIGluIHRoZSBDb2VmZmljaWVudCBNYXRyaXggKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEEyMyAgMHgzZmYwMDAwMCAvKiBBMjMgaW4gdGhlIENvZWZmaWNpZW50IE1hdHJpeCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEdVX01VTFQ0ICAweDQwMDAwMDAwIC8qIE11bHRpcGx5IFJvdyBieSA0ICovCisKKy8qIEJpdCBtYXNrcyBmb3IgUElYQ19CVkNPTiAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBBMzEgIDB4M2ZmICAgICAgLyogQTMxIGluIHRoZSBDb2VmZmljaWVudCBNYXRyaXggKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEEzMiAgMHhmZmMwMCAgICAvKiBBMzIgaW4gdGhlIENvZWZmaWNpZW50IE1hdHJpeCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgQTMzICAweDNmZjAwMDAwIC8qIEEzMyBpbiB0aGUgQ29lZmZpY2llbnQgTWF0cml4ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgQlZfTVVMVDQgIDB4NDAwMDAwMDAgLyogTXVsdGlwbHkgUm93IGJ5IDQgKi8KKworLyogQml0IG1hc2tzIGZvciBQSVhDX0NDQklBUyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBBMTQgIDB4M2ZmICAgICAgLyogQTE0IGluIHRoZSBCaWFzIFZlY3RvciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgQTI0ICAweGZmYzAwICAgIC8qIEEyNCBpbiB0aGUgQmlhcyBWZWN0b3IgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEEzNCAgMHgzZmYwMDAwMCAvKiBBMzQgaW4gdGhlIEJpYXMgVmVjdG9yICovCisKKy8qIEJpdCBtYXNrcyBmb3IgUElYQ19UQyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgUllfVFJBTlMgIDB4ZmYgICAgICAgLyogVHJhbnNwYXJlbnQgQ29sb3IgLSBSL1kgQ29tcG9uZW50ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgR1VfVFJBTlMgIDB4ZmYwMCAgICAgLyogVHJhbnNwYXJlbnQgQ29sb3IgLSBHL1UgQ29tcG9uZW50ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgQlZfVFJBTlMgIDB4ZmYwMDAwICAgLyogVHJhbnNwYXJlbnQgQ29sb3IgLSBCL1YgQ29tcG9uZW50ICovCisKKy8qIEJpdCBtYXNrcyBmb3IgSE9TVF9DT05UUk9MICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgSE9TVF9FTiAgMHgxICAgICAgICAvKiBIb3N0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEhPU1RfRU5EICAweDIgICAgICAgIC8qIEhvc3QgRW5kaWFuZXNzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBEQVRBX1NJWkUgIDB4NCAgICAgICAgLyogRGF0YSBTaXplICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9SU1QgIDB4OCAgICAgICAgLyogSG9zdCBSZXNldCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEhSRFlfT1ZSICAweDIwICAgICAgIC8qIEhvc3QgUmVhZHkgT3ZlcnJpZGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBJTlRfTU9ERSAgMHg0MCAgICAgICAvKiBJbnRlcnJ1cHQgTW9kZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEJUX0VOICAweDgwICAgICAgIC8qIEJ1cyBUaW1lb3V0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgRUhXICAweDEwMCAgICAgIC8qIEVuYWJsZSBIb3N0IFdyaXRlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBFSFIgIDB4MjAwICAgICAgLyogRW5hYmxlIEhvc3QgUmVhZCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgQkRSICAweDQwMCAgICAgIC8qIEJ1cnN0IERNQSBSZXF1ZXN0cyAqLworCisvKiBCaXQgbWFza3MgZm9yIEhPU1RfU1RBVFVTICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgIERNQV9SRUFEWSAgMHgxICAgICAgICAvKiBETUEgUmVhZHkgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBGSUZPRlVMTCAgMHgyICAgICAgICAvKiBGSUZPIEZ1bGwgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIEZJRk9FTVBUWSAgMHg0ICAgICAgICAvKiBGSUZPIEVtcHR5ICovCisjZGVmaW5lICAgICAgICAgICAgICBETUFfQ09NUExFVEUgIDB4OCAgICAgICAgLyogRE1BIENvbXBsZXRlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIEhTSEsgIDB4MTAgICAgICAgLyogSG9zdCBIYW5kc2hha2UgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIEhTVElNRU9VVCAgMHgyMCAgICAgICAvKiBIb3N0IFRpbWVvdXQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSElSUSAgMHg0MCAgICAgICAvKiBIb3N0IEludGVycnVwdCBSZXF1ZXN0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgIEFMTE9XX0NORkcgIDB4ODAgICAgICAgLyogQWxsb3cgTmV3IENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgRE1BX0RJUiAgMHgxMDAgICAgICAvKiBETUEgRGlyZWN0aW9uICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBCVEUgIDB4MjAwICAgICAgLyogQnVzIFRpbWVvdXQgRW5hYmxlZCAqLworCisvKiBCaXQgbWFza3MgZm9yIEhPU1RfVElNRU9VVCAqLworCisjZGVmaW5lICAgICAgICAgICAgIENPVU5UX1RJTUVPVVQgIDB4N2ZmICAgICAgLyogSG9zdCBUaW1lb3V0IGNvdW50ICovCisKKy8qIEJpdCBtYXNrcyBmb3IgS1BBRF9DVEwgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICBLUEFEX0VOICAweDEgICAgICAgIC8qIEtleXBhZCBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgIEtQQURfSVJRTU9ERSAgMHg2ICAgICAgICAvKiBLZXkgUHJlc3MgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICBLUEFEX1JPV0VOICAweDFjMDAgICAgIC8qIFJvdyBFbmFibGUgV2lkdGggKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgS1BBRF9DT0xFTiAgMHhlMDAwICAgICAvKiBDb2x1bW4gRW5hYmxlIFdpZHRoICovCisKKy8qIEJpdCBtYXNrcyBmb3IgS1BBRF9QUkVTQ0FMRSAqLworCisjZGVmaW5lICAgICAgICAgS1BBRF9QUkVTQ0FMRV9WQUwgIDB4M2YgICAgICAgLyogS2V5IFByZXNjYWxlIFZhbHVlICovCisKKy8qIEJpdCBtYXNrcyBmb3IgS1BBRF9NU0VMICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgREJPTl9TQ0FMRSAgMHhmZiAgICAgICAvKiBEZWJvdW5jZSBTY2FsZSBWYWx1ZSAqLworI2RlZmluZSAgICAgICAgICAgICAgQ09MRFJWX1NDQUxFICAweGZmMDAgICAgIC8qIENvbHVtbiBEcml2ZXIgU2NhbGUgVmFsdWUgKi8KKworLyogQml0IG1hc2tzIGZvciBLUEFEX1JPV0NPTCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgS1BBRF9ST1cgIDB4ZmYgICAgICAgLyogUm93cyBQcmVzc2VkICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgS1BBRF9DT0wgIDB4ZmYwMCAgICAgLyogQ29sdW1ucyBQcmVzc2VkICovCisKKy8qIEJpdCBtYXNrcyBmb3IgS1BBRF9TVEFUICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBLUEFEX0lSUSAgMHgxICAgICAgICAvKiBLZXlwYWQgSW50ZXJydXB0IFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICAgICAgS1BBRF9NUk9XQ09MICAweDYgICAgICAgIC8qIE11bHRpcGxlIFJvdy9Db2x1bW4gS2V5cHJlc3MgU3RhdHVzICovCisjZGVmaW5lICAgICAgICAgICAgICBLUEFEX1BSRVNTRUQgIDB4OCAgICAgICAgLyogS2V5IHByZXNzIGN1cnJlbnQgc3RhdHVzICovCisKKy8qIEJpdCBtYXNrcyBmb3IgS1BBRF9TT0ZURVZBTCAqLworCisjZGVmaW5lICAgICAgICAgICBLUEFEX1NPRlRFVkFMX0UgIDB4MiAgICAgICAgLyogU29mdHdhcmUgUHJvZ3JhbW1hYmxlIEZvcmNlIEV2YWx1YXRlICovCisKKy8qIEJpdCBtYXNrcyBmb3IgU0RIX0NPTU1BTkQgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICBDTURfSURYICAweDNmICAgICAgIC8qIENvbW1hbmQgSW5kZXggKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgQ01EX1JTUCAgMHg0MCAgICAgICAvKiBSZXNwb25zZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgQ01EX0xfUlNQICAweDgwICAgICAgIC8qIExvbmcgUmVzcG9uc2UgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIENNRF9JTlRfRSAgMHgxMDAgICAgICAvKiBDb21tYW5kIEludGVycnVwdCAqLworI2RlZmluZSAgICAgICAgICAgICAgICBDTURfUEVORF9FICAweDIwMCAgICAgIC8qIENvbW1hbmQgUGVuZGluZyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIENNRF9FICAweDQwMCAgICAgIC8qIENvbW1hbmQgRW5hYmxlICovCisKKy8qIEJpdCBtYXNrcyBmb3IgU0RIX1BXUl9DVEwgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgUFdSX09OICAweDMgICAgICAgIC8qIFBvd2VyIE9uICovCisjaWYgMAorI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgVEJEICAweDNjICAgICAgIC8qIFRCRCAqLworI2VuZGlmCisjZGVmaW5lICAgICAgICAgICAgICAgICBTRF9DTURfT0QgIDB4NDAgICAgICAgLyogT3BlbiBEcmFpbiBPdXRwdXQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgUk9EX0NUTCAgMHg4MCAgICAgICAvKiBSb2QgQ29udHJvbCAqLworCisvKiBCaXQgbWFza3MgZm9yIFNESF9DTEtfQ1RMICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIENMS0RJViAgMHhmZiAgICAgICAvKiBNQ19DTEsgRGl2aXNvciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIENMS19FICAweDEwMCAgICAgIC8qIE1DX0NMSyBCdXMgQ2xvY2sgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgUFdSX1NWX0UgIDB4MjAwICAgICAgLyogUG93ZXIgU2F2ZSBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgQ0xLRElWX0JZUEFTUyAgMHg0MDAgICAgICAvKiBCeXBhc3MgRGl2aXNvciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIFdJREVfQlVTICAweDgwMCAgICAgIC8qIFdpZGUgQnVzIE1vZGUgRW5hYmxlICovCisKKy8qIEJpdCBtYXNrcyBmb3IgU0RIX1JFU1BfQ01EICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBSRVNQX0NNRCAgMHgzZiAgICAgICAvKiBSZXNwb25zZSBDb21tYW5kICovCisKKy8qIEJpdCBtYXNrcyBmb3IgU0RIX0RBVEFfQ1RMICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBEVFhfRSAgMHgxICAgICAgICAvKiBEYXRhIFRyYW5zZmVyIEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBEVFhfRElSICAweDIgICAgICAgIC8qIERhdGEgVHJhbnNmZXIgRGlyZWN0aW9uICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgRFRYX01PREUgIDB4NCAgICAgICAgLyogRGF0YSBUcmFuc2ZlciBNb2RlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBEVFhfRE1BX0UgIDB4OCAgICAgICAgLyogRGF0YSBUcmFuc2ZlciBETUEgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICBEVFhfQkxLX0xHVEggIDB4ZjAgICAgICAgLyogRGF0YSBUcmFuc2ZlciBCbG9jayBMZW5ndGggKi8KKworLyogQml0IG1hc2tzIGZvciBTREhfU1RBVFVTICovCisKKyNkZWZpbmUgICAgICAgICAgICAgIENNRF9DUkNfRkFJTCAgMHgxICAgICAgICAvKiBDTUQgQ1JDIEZhaWwgKi8KKyNkZWZpbmUgICAgICAgICAgICAgIERBVF9DUkNfRkFJTCAgMHgyICAgICAgICAvKiBEYXRhIENSQyBGYWlsICovCisjZGVmaW5lICAgICAgICAgICAgICAgQ01EX1RJTUVfT1VUICAweDQgICAgICAgIC8qIENNRCBUaW1lIE91dCAqLworI2RlZmluZSAgICAgICAgICAgICAgIERBVF9USU1FX09VVCAgMHg4ICAgICAgICAvKiBEYXRhIFRpbWUgT3V0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgVFhfVU5ERVJSVU4gIDB4MTAgICAgICAgLyogVHJhbnNtaXQgVW5kZXJydW4gKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgUlhfT1ZFUlJVTiAgMHgyMCAgICAgICAvKiBSZWNlaXZlIE92ZXJydW4gKi8KKyNkZWZpbmUgICAgICAgICAgICAgIENNRF9SRVNQX0VORCAgMHg0MCAgICAgICAvKiBDTUQgUmVzcG9uc2UgRW5kICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgQ01EX1NFTlQgIDB4ODAgICAgICAgLyogQ01EIFNlbnQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgREFUX0VORCAgMHgxMDAgICAgICAvKiBEYXRhIEVuZCAqLworI2RlZmluZSAgICAgICAgICAgICBTVEFSVF9CSVRfRVJSICAweDIwMCAgICAgIC8qIFN0YXJ0IEJpdCBFcnJvciAqLworI2RlZmluZSAgICAgICAgICAgICAgIERBVF9CTEtfRU5EICAweDQwMCAgICAgIC8qIERhdGEgQmxvY2sgRW5kICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIENNRF9BQ1QgIDB4ODAwICAgICAgLyogQ01EIEFjdGl2ZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgVFhfQUNUICAweDEwMDAgICAgIC8qIFRyYW5zbWl0IEFjdGl2ZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgUlhfQUNUICAweDIwMDAgICAgIC8qIFJlY2VpdmUgQWN0aXZlICovCisjZGVmaW5lICAgICAgICAgICAgICBUWF9GSUZPX1NUQVQgIDB4NDAwMCAgICAgLyogVHJhbnNtaXQgRklGTyBTdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgIFJYX0ZJRk9fU1RBVCAgMHg4MDAwICAgICAvKiBSZWNlaXZlIEZJRk8gU3RhdHVzICovCisjZGVmaW5lICAgICAgICAgICAgICBUWF9GSUZPX0ZVTEwgIDB4MTAwMDAgICAgLyogVHJhbnNtaXQgRklGTyBGdWxsICovCisjZGVmaW5lICAgICAgICAgICAgICBSWF9GSUZPX0ZVTEwgIDB4MjAwMDAgICAgLyogUmVjZWl2ZSBGSUZPIEZ1bGwgKi8KKyNkZWZpbmUgICAgICAgICAgICAgIFRYX0ZJRk9fWkVSTyAgMHg0MDAwMCAgICAvKiBUcmFuc21pdCBGSUZPIEVtcHR5ICovCisjZGVmaW5lICAgICAgICAgICAgICAgUlhfREFUX1pFUk8gIDB4ODAwMDAgICAgLyogUmVjZWl2ZSBGSUZPIEVtcHR5ICovCisjZGVmaW5lICAgICAgICAgICAgICAgIFRYX0RBVF9SRFkgIDB4MTAwMDAwICAgLyogVHJhbnNtaXQgRGF0YSBBdmFpbGFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICBSWF9GSUZPX1JEWSAgMHgyMDAwMDAgICAvKiBSZWNlaXZlIERhdGEgQXZhaWxhYmxlICovCisKKy8qIEJpdCBtYXNrcyBmb3IgU0RIX1NUQVRVU19DTFIgKi8KKworI2RlZmluZSAgICAgICAgIENNRF9DUkNfRkFJTF9TVEFUICAweDEgICAgICAgIC8qIENNRCBDUkMgRmFpbCBTdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICBEQVRfQ1JDX0ZBSUxfU1RBVCAgMHgyICAgICAgICAvKiBEYXRhIENSQyBGYWlsIFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICBDTURfVElNRU9VVF9TVEFUICAweDQgICAgICAgIC8qIENNRCBUaW1lIE91dCBTdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICAgREFUX1RJTUVPVVRfU1RBVCAgMHg4ICAgICAgICAvKiBEYXRhIFRpbWUgT3V0IHN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICBUWF9VTkRFUlJVTl9TVEFUICAweDEwICAgICAgIC8qIFRyYW5zbWl0IFVuZGVycnVuIFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICAgUlhfT1ZFUlJVTl9TVEFUICAweDIwICAgICAgIC8qIFJlY2VpdmUgT3ZlcnJ1biBTdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICBDTURfUkVTUF9FTkRfU1RBVCAgMHg0MCAgICAgICAvKiBDTUQgUmVzcG9uc2UgRW5kIFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICAgICBDTURfU0VOVF9TVEFUICAweDgwICAgICAgIC8qIENNRCBTZW50IFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICAgICAgREFUX0VORF9TVEFUICAweDEwMCAgICAgIC8qIERhdGEgRW5kIFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgU1RBUlRfQklUX0VSUl9TVEFUICAweDIwMCAgICAgIC8qIFN0YXJ0IEJpdCBFcnJvciBTdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICAgREFUX0JMS19FTkRfU1RBVCAgMHg0MDAgICAgICAvKiBEYXRhIEJsb2NrIEVuZCBTdGF0dXMgKi8KKworLyogQml0IG1hc2tzIGZvciBTREhfTUFTSzAgKi8KKworI2RlZmluZSAgICAgICAgIENNRF9DUkNfRkFJTF9NQVNLICAweDEgICAgICAgIC8qIENNRCBDUkMgRmFpbCBNYXNrICovCisjZGVmaW5lICAgICAgICAgREFUX0NSQ19GQUlMX01BU0sgIDB4MiAgICAgICAgLyogRGF0YSBDUkMgRmFpbCBNYXNrICovCisjZGVmaW5lICAgICAgICAgIENNRF9USU1FT1VUX01BU0sgIDB4NCAgICAgICAgLyogQ01EIFRpbWUgT3V0IE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICAgREFUX1RJTUVPVVRfTUFTSyAgMHg4ICAgICAgICAvKiBEYXRhIFRpbWUgT3V0IE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICAgVFhfVU5ERVJSVU5fTUFTSyAgMHgxMCAgICAgICAvKiBUcmFuc21pdCBVbmRlcnJ1biBNYXNrICovCisjZGVmaW5lICAgICAgICAgICBSWF9PVkVSUlVOX01BU0sgIDB4MjAgICAgICAgLyogUmVjZWl2ZSBPdmVycnVuIE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICBDTURfUkVTUF9FTkRfTUFTSyAgMHg0MCAgICAgICAvKiBDTUQgUmVzcG9uc2UgRW5kIE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICAgICAgQ01EX1NFTlRfTUFTSyAgMHg4MCAgICAgICAvKiBDTUQgU2VudCBNYXNrICovCisjZGVmaW5lICAgICAgICAgICAgICBEQVRfRU5EX01BU0sgIDB4MTAwICAgICAgLyogRGF0YSBFbmQgTWFzayAqLworI2RlZmluZSAgICAgICAgU1RBUlRfQklUX0VSUl9NQVNLICAweDIwMCAgICAgIC8qIFN0YXJ0IEJpdCBFcnJvciBNYXNrICovCisjZGVmaW5lICAgICAgICAgIERBVF9CTEtfRU5EX01BU0sgIDB4NDAwICAgICAgLyogRGF0YSBCbG9jayBFbmQgTWFzayAqLworI2RlZmluZSAgICAgICAgICAgICAgQ01EX0FDVF9NQVNLICAweDgwMCAgICAgIC8qIENNRCBBY3RpdmUgTWFzayAqLworI2RlZmluZSAgICAgICAgICAgICAgIFRYX0FDVF9NQVNLICAweDEwMDAgICAgIC8qIFRyYW5zbWl0IEFjdGl2ZSBNYXNrICovCisjZGVmaW5lICAgICAgICAgICAgICAgUlhfQUNUX01BU0sgIDB4MjAwMCAgICAgLyogUmVjZWl2ZSBBY3RpdmUgTWFzayAqLworI2RlZmluZSAgICAgICAgIFRYX0ZJRk9fU1RBVF9NQVNLICAweDQwMDAgICAgIC8qIFRyYW5zbWl0IEZJRk8gU3RhdHVzIE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICBSWF9GSUZPX1NUQVRfTUFTSyAgMHg4MDAwICAgICAvKiBSZWNlaXZlIEZJRk8gU3RhdHVzIE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICBUWF9GSUZPX0ZVTExfTUFTSyAgMHgxMDAwMCAgICAvKiBUcmFuc21pdCBGSUZPIEZ1bGwgTWFzayAqLworI2RlZmluZSAgICAgICAgIFJYX0ZJRk9fRlVMTF9NQVNLICAweDIwMDAwICAgIC8qIFJlY2VpdmUgRklGTyBGdWxsIE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICBUWF9GSUZPX1pFUk9fTUFTSyAgMHg0MDAwMCAgICAvKiBUcmFuc21pdCBGSUZPIEVtcHR5IE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICAgUlhfREFUX1pFUk9fTUFTSyAgMHg4MDAwMCAgICAvKiBSZWNlaXZlIEZJRk8gRW1wdHkgTWFzayAqLworI2RlZmluZSAgICAgICAgICAgVFhfREFUX1JEWV9NQVNLICAweDEwMDAwMCAgIC8qIFRyYW5zbWl0IERhdGEgQXZhaWxhYmxlIE1hc2sgKi8KKyNkZWZpbmUgICAgICAgICAgUlhfRklGT19SRFlfTUFTSyAgMHgyMDAwMDAgICAvKiBSZWNlaXZlIERhdGEgQXZhaWxhYmxlIE1hc2sgKi8KKworLyogQml0IG1hc2tzIGZvciBTREhfRklGT19DTlQgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICBGSUZPX0NPVU5UICAweDdmZmYgICAgIC8qIEZJRk8gQ291bnQgKi8KKworLyogQml0IG1hc2tzIGZvciBTREhfRV9TVEFUVVMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgU0RJT19JTlRfREVUICAweDIgICAgICAgIC8qIFNESU8gSW50IERldGVjdGVkICovCisjZGVmaW5lICAgICAgICAgICAgICAgU0RfQ0FSRF9ERVQgIDB4MTAgICAgICAgLyogU0QgQ2FyZCBEZXRlY3QgKi8KKworLyogQml0IG1hc2tzIGZvciBTREhfRV9NQVNLICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBTRElPX01TSyAgMHgyICAgICAgICAvKiBNYXNrIFNESU8gSW50IERldGVjdGVkICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFNDRF9NU0sgIDB4NDAgICAgICAgLyogTWFzayBDYXJkIERldGVjdCAqLworCisvKiBCaXQgbWFza3MgZm9yIFNESF9DRkcgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICBDTEtTX0VOICAweDEgICAgICAgIC8qIENsb2NrcyBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgU0Q0RSAgMHg0ICAgICAgICAvKiBTRElPIDQtQml0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgTVdFICAweDggICAgICAgIC8qIE1vdmluZyBXaW5kb3cgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBTRF9SU1QgIDB4MTAgICAgICAgLyogU0RNTUMgUmVzZXQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIFBVUF9TRERBVCAgMHgyMCAgICAgICAvKiBQdWxsLXVwIFNEX0RBVCAqLworI2RlZmluZSAgICAgICAgICAgICAgICBQVVBfU0REQVQzICAweDQwICAgICAgIC8qIFB1bGwtdXAgU0RfREFUMyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgUERfU0REQVQzICAweDgwICAgICAgIC8qIFB1bGwtZG93biBTRF9EQVQzICovCisKKy8qIEJpdCBtYXNrcyBmb3IgU0RIX1JEX1dBSVRfRU4gKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgUldSICAweDEgICAgICAgIC8qIFJlYWQgV2FpdCBSZXF1ZXN0ICovCisKKy8qIEJpdCBtYXNrcyBmb3IgQVRBUElfQ09OVFJPTCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICBQSU9fU1RBUlQgIDB4MSAgICAgICAgLyogU3RhcnQgUElPL1JlZyBPcCAqLworI2RlZmluZSAgICAgICAgICAgICAgIE1VTFRJX1NUQVJUICAweDIgICAgICAgIC8qIFN0YXJ0IE11bHRpLURNQSBPcCAqLworI2RlZmluZSAgICAgICAgICAgICAgIFVMVFJBX1NUQVJUICAweDQgICAgICAgIC8qIFN0YXJ0IFVsdHJhLURNQSBPcCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIFhGRVJfRElSICAweDggICAgICAgIC8qIFRyYW5zZmVyIERpcmVjdGlvbiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIElPUkRZX0VOICAweDEwICAgICAgIC8qIElPUkRZIEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICBGSUZPX0ZMVVNIICAweDIwICAgICAgIC8qIEZsdXNoIEZJRk9zICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgU09GVF9SU1QgIDB4NDAgICAgICAgLyogU29mdCBSZXNldCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBERVZfUlNUICAweDgwICAgICAgIC8qIERldmljZSBSZXNldCAqLworI2RlZmluZSAgICAgICAgICAgICAgICBURlJDTlRfUlNUICAweDEwMCAgICAgIC8qIFRyYW5zIENvdW50IFJlc2V0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgRU5EX09OX1RFUk0gIDB4MjAwICAgICAgLyogRW5kL1Rlcm1pbmF0ZSBTZWxlY3QgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICBQSU9fVVNFX0RNQSAgMHg0MDAgICAgICAvKiBQSU8tRE1BIEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICBVRE1BSU5fRklGT19USFJTICAweGYwMDAgICAgIC8qIFVsdHJhIERNQS1JTiBGSUZPIFRocmVzaG9sZCAqLworCisvKiBCaXQgbWFza3MgZm9yIEFUQVBJX1NUQVRVUyAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgUElPX1hGRVJfT04gIDB4MSAgICAgICAgLyogUElPIHRyYW5zZmVyIGluIHByb2dyZXNzICovCisjZGVmaW5lICAgICAgICAgICAgIE1VTFRJX1hGRVJfT04gIDB4MiAgICAgICAgLyogTXVsdGktd29yZCBETUEgdHJhbnNmZXIgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgICAgICAgICAgICAgVUxUUkFfWEZFUl9PTiAgMHg0ICAgICAgICAvKiBVbHRyYSBETUEgdHJhbnNmZXIgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICBVTFRSQV9JTl9GTCAgMHhmMCAgICAgICAvKiBVbHRyYSBETUEgSW5wdXQgRklGTyBMZXZlbCAqLworCisvKiBCaXQgbWFza3MgZm9yIEFUQVBJX0RFVl9BRERSICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBERVZfQUREUiAgMHgxZiAgICAgICAvKiBEZXZpY2UgQWRkcmVzcyAqLworCisvKiBCaXQgbWFza3MgZm9yIEFUQVBJX0lOVF9NQVNLICovCisKKyNkZWZpbmUgICAgICAgIEFUQVBJX0RFVl9JTlRfTUFTSyAgMHgxICAgICAgICAvKiBEZXZpY2UgaW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUgICAgICAgICAgICAgUElPX0RPTkVfTUFTSyAgMHgyICAgICAgICAvKiBQSU8gdHJhbnNmZXIgZG9uZSBpbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSAgICAgICAgICAgTVVMVElfRE9ORV9NQVNLICAweDQgICAgICAgIC8qIE11bHRpLURNQSB0cmFuc2ZlciBkb25lIGludGVycnVwdCBtYXNrICovCisjZGVmaW5lICAgICAgICAgIFVETUFJTl9ET05FX01BU0sgIDB4OCAgICAgICAgLyogVWx0cmEtRE1BIGluIHRyYW5zZmVyIGRvbmUgaW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUgICAgICAgICBVRE1BT1VUX0RPTkVfTUFTSyAgMHgxMCAgICAgICAvKiBVbHRyYS1ETUEgb3V0IHRyYW5zZmVyIGRvbmUgaW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUgICAgICAgSE9TVF9URVJNX1hGRVJfTUFTSyAgMHgyMCAgICAgICAvKiBIb3N0IHRlcm1pbmF0ZSBjdXJyZW50IHRyYW5zZmVyIGludGVycnVwdCBtYXNrICovCisjZGVmaW5lICAgICAgICAgICBNVUxUSV9URVJNX01BU0sgIDB4NDAgICAgICAgLyogRGV2aWNlIHRlcm1pbmF0ZSBNdWx0aS1ETUEgdHJhbnNmZXIgaW50ZXJydXB0IG1hc2sgKi8KKyNkZWZpbmUgICAgICAgICAgVURNQUlOX1RFUk1fTUFTSyAgMHg4MCAgICAgICAvKiBEZXZpY2UgdGVybWluYXRlIFVsdHJhLURNQS1pbiB0cmFuc2ZlciBpbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSAgICAgICAgIFVETUFPVVRfVEVSTV9NQVNLICAweDEwMCAgICAgIC8qIERldmljZSB0ZXJtaW5hdGUgVWx0cmEtRE1BLW91dCB0cmFuc2ZlciBpbnRlcnJ1cHQgbWFzayAqLworCisvKiBCaXQgbWFza3MgZm9yIEFUQVBJX0lOVF9TVEFUVVMgKi8KKworI2RlZmluZSAgICAgICAgICAgICBBVEFQSV9ERVZfSU5UICAweDEgICAgICAgIC8qIERldmljZSBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lICAgICAgICAgICAgICBQSU9fRE9ORV9JTlQgIDB4MiAgICAgICAgLyogUElPIHRyYW5zZmVyIGRvbmUgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICAgIE1VTFRJX0RPTkVfSU5UICAweDQgICAgICAgIC8qIE11bHRpLURNQSB0cmFuc2ZlciBkb25lIGludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICAgIFVETUFJTl9ET05FX0lOVCAgMHg4ICAgICAgICAvKiBVbHRyYS1ETUEgaW4gdHJhbnNmZXIgZG9uZSBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lICAgICAgICAgIFVETUFPVVRfRE9ORV9JTlQgIDB4MTAgICAgICAgLyogVWx0cmEtRE1BIG91dCB0cmFuc2ZlciBkb25lIGludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgIEhPU1RfVEVSTV9YRkVSX0lOVCAgMHgyMCAgICAgICAvKiBIb3N0IHRlcm1pbmF0ZSBjdXJyZW50IHRyYW5zZmVyIGludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICAgICBNVUxUSV9URVJNX0lOVCAgMHg0MCAgICAgICAvKiBEZXZpY2UgdGVybWluYXRlIE11bHRpLURNQSB0cmFuc2ZlciBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lICAgICAgICAgICBVRE1BSU5fVEVSTV9JTlQgIDB4ODAgICAgICAgLyogRGV2aWNlIHRlcm1pbmF0ZSBVbHRyYS1ETUEtaW4gdHJhbnNmZXIgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICBVRE1BT1VUX1RFUk1fSU5UICAweDEwMCAgICAgIC8qIERldmljZSB0ZXJtaW5hdGUgVWx0cmEtRE1BLW91dCB0cmFuc2ZlciBpbnRlcnJ1cHQgc3RhdHVzICovCisKKy8qIEJpdCBtYXNrcyBmb3IgQVRBUElfTElORV9TVEFUVVMgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICBBVEFQSV9JTlRSICAweDEgICAgICAgIC8qIERldmljZSBpbnRlcnJ1cHQgdG8gaG9zdCBsaW5lIHN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICAgICAgICBBVEFQSV9EQVNQICAweDIgICAgICAgIC8qIERldmljZSBkYXNwIHRvIGhvc3QgbGluZSBzdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgQVRBUElfQ1MwTiAgMHg0ICAgICAgICAvKiBBVEFQSSBjaGlwIHNlbGVjdCAwIGxpbmUgc3RhdHVzICovCisjZGVmaW5lICAgICAgICAgICAgICAgIEFUQVBJX0NTMU4gIDB4OCAgICAgICAgLyogQVRBUEkgY2hpcCBzZWxlY3QgMSBsaW5lIHN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICAgICAgICBBVEFQSV9BRERSICAweDcwICAgICAgIC8qIEFUQVBJIGFkZHJlc3MgbGluZSBzdGF0dXMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgIEFUQVBJX0RNQVJFUSAgMHg4MCAgICAgICAvKiBBVEFQSSBETUEgcmVxdWVzdCBsaW5lIHN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICAgICBBVEFQSV9ETUFBQ0tOICAweDEwMCAgICAgIC8qIEFUQVBJIERNQSBhY2tub3dsZWRnZSBsaW5lIHN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICAgICAgIEFUQVBJX0RJT1dOICAweDIwMCAgICAgIC8qIEFUQVBJIHdyaXRlIGxpbmUgc3RhdHVzICovCisjZGVmaW5lICAgICAgICAgICAgICAgQVRBUElfRElPUk4gIDB4NDAwICAgICAgLyogQVRBUEkgcmVhZCBsaW5lIHN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICAgICAgIEFUQVBJX0lPUkRZICAweDgwMCAgICAgIC8qIEFUQVBJIElPUkRZIGxpbmUgc3RhdHVzICovCisKKy8qIEJpdCBtYXNrcyBmb3IgQVRBUElfU01fU1RBVEUgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICBQSU9fQ1NUQVRFICAweGYgICAgICAgIC8qIFBJTyBtb2RlIHN0YXRlIG1hY2hpbmUgY3VycmVudCBzdGF0ZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICBETUFfQ1NUQVRFICAweGYwICAgICAgIC8qIERNQSBtb2RlIHN0YXRlIG1hY2hpbmUgY3VycmVudCBzdGF0ZSAqLworI2RlZmluZSAgICAgICAgICAgICBVRE1BSU5fQ1NUQVRFICAweGYwMCAgICAgIC8qIFVsdHJhIERNQS1JbiBtb2RlIHN0YXRlIG1hY2hpbmUgY3VycmVudCBzdGF0ZSAqLworI2RlZmluZSAgICAgICAgICAgIFVETUFPVVRfQ1NUQVRFICAweGYwMDAgICAgIC8qIEFUQVBJIElPUkRZIGxpbmUgc3RhdHVzICovCisKKy8qIEJpdCBtYXNrcyBmb3IgQVRBUElfVEVSTUlOQVRFICovCisKKyNkZWZpbmUgICAgICAgICAgIEFUQVBJX0hPU1RfVEVSTSAgMHgxICAgICAgICAvKiBIb3N0IHRlcm1pbmF0aW9uYXRpb24gKi8KKworLyogQml0IG1hc2tzIGZvciBBVEFQSV9SRUdfVElNXzAgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgVDJfUkVHICAweGZmICAgICAgIC8qIEVuZCBvZiBjeWNsZSB0aW1lIGZvciByZWdpc3RlciBhY2Nlc3MgdHJhbnNmZXJzICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgVEVPQ19SRUcgIDB4ZmYwMCAgICAgLyogU2VsZWN0cyBESU9SL0RJT1cgcHVsc2V3aWR0aCAqLworCisvKiBCaXQgbWFza3MgZm9yIEFUQVBJX1BJT19USU1fMCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBUMV9SRUcgIDB4ZiAgICAgICAgLyogVGltZSBmcm9tIGFkZHJlc3MgdmFsaWQgdG8gRElPUi9ESU9XICovCisjZGVmaW5lICAgICAgICAgICAgICAgIFQyX1JFR19QSU8gIDB4ZmYwICAgICAgLyogRElPUi9ESU9XIHB1bHNld2lkdGggKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFQ0X1JFRyAgMHhmMDAwICAgICAvKiBESU9XIGRhdGEgaG9sZCAqLworCisvKiBCaXQgbWFza3MgZm9yIEFUQVBJX1BJT19USU1fMSAqLworCisjZGVmaW5lICAgICAgICAgICAgICBURU9DX1JFR19QSU8gIDB4ZmYgICAgICAgLyogRW5kIG9mIGN5Y2xlIHRpbWUgZm9yIFBJTyBhY2Nlc3MgdHJhbnNmZXJzLiAqLworCisvKiBCaXQgbWFza3MgZm9yIEFUQVBJX01VTFRJX1RJTV8wICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBURCAgMHhmZiAgICAgICAvKiBESU9SL0RJT1cgYXNzZXJ0ZWQgcHVsc2V3aWR0aCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIFRNICAweGZmMDAgICAgIC8qIFRpbWUgZnJvbSBhZGRyZXNzIHZhbGlkIHRvIERJT1IvRElPVyAqLworCisvKiBCaXQgbWFza3MgZm9yIEFUQVBJX01VTFRJX1RJTV8xICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIFRLVyAgMHhmZiAgICAgICAvKiBTZWxlY3RzIERJT1cgbmVnYXRlZCBwdWxzZXdpZHRoICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBUS1IgIDB4ZmYwMCAgICAgLyogU2VsZWN0cyBESU9SIG5lZ2F0ZWQgcHVsc2V3aWR0aCAqLworCisvKiBCaXQgbWFza3MgZm9yIEFUQVBJX01VTFRJX1RJTV8yICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICBUSCAgMHhmZiAgICAgICAvKiBTZWxlY3RzIERJT1cgZGF0YSBob2xkICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIFRFT0MgIDB4ZmYwMCAgICAgLyogU2VsZWN0cyBlbmQgb2YgY3ljbGUgZm9yIERNQSAqLworCisvKiBCaXQgbWFza3MgZm9yIEFUQVBJX1VMVFJBX1RJTV8wICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgVEFDSyAgMHhmZiAgICAgICAvKiBTZWxlY3RzIHNldHVwIGFuZCBob2xkIHRpbWVzIGZvciBUQUNLICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIFRFTlYgIDB4ZmYwMCAgICAgLyogU2VsZWN0cyBlbnZlbG9wZSB0aW1lICovCisKKy8qIEJpdCBtYXNrcyBmb3IgQVRBUElfVUxUUkFfVElNXzEgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBURFZTICAweGZmICAgICAgIC8qIFNlbGVjdHMgZGF0YSB2YWxpZCBzZXR1cCB0aW1lICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBUQ1lDX1REVlMgIDB4ZmYwMCAgICAgLyogU2VsZWN0cyBjeWNsZSB0aW1lIC0gVERWUyB0aW1lICovCisKKy8qIEJpdCBtYXNrcyBmb3IgQVRBUElfVUxUUkFfVElNXzIgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgVFNTICAweGZmICAgICAgIC8qIFNlbGVjdHMgdGltZSBmcm9tIFNUUk9CRSBlZGdlIHRvIG5lZ2F0aW9uIG9mIERNQVJRIG9yIGFzc2VydGlvbiBvZiBTVE9QICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIFRNTEkgIDB4ZmYwMCAgICAgLyogU2VsZWN0cyBpbnRlcmxvY2sgdGltZSAqLworCisvKiBCaXQgbWFza3MgZm9yIEFUQVBJX1VMVFJBX1RJTV8zICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgVFpBSCAgMHhmZiAgICAgICAvKiBTZWxlY3RzIG1pbmltdW0gZGVsYXkgcmVxdWlyZWQgZm9yIG91dHB1dCAqLworI2RlZmluZSAgICAgICAgICAgICAgIFJFQURZX1BBVVNFICAweGZmMDAgICAgIC8qIFNlbGVjdHMgcmVhZHkgdG8gcGF1c2UgKi8KKworLyogQml0IG1hc2tzIGZvciBUSU1FUl9FTkFCTEUxICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFRJTUVOOCAgMHgxICAgICAgICAvKiBUaW1lciA4IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgVElNRU45ICAweDIgICAgICAgIC8qIFRpbWVyIDkgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFRJTUVOMTAgIDB4NCAgICAgICAgLyogVGltZXIgMTAgRW5hYmxlICovCisKKy8qIEJpdCBtYXNrcyBmb3IgVElNRVJfRElTQUJMRTEgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICBUSU1ESVM4ICAweDEgICAgICAgIC8qIFRpbWVyIDggRGlzYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBUSU1ESVM5ICAweDIgICAgICAgIC8qIFRpbWVyIDkgRGlzYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIFRJTURJUzEwICAweDQgICAgICAgIC8qIFRpbWVyIDEwIERpc2FibGUgKi8KKworLyogQml0IG1hc2tzIGZvciBUSU1FUl9TVEFUVVMxICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIFRJTUlMOCAgMHgxICAgICAgICAvKiBUaW1lciA4IEludGVycnVwdCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgVElNSUw5ICAweDIgICAgICAgIC8qIFRpbWVyIDkgSW50ZXJydXB0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIFRJTUlMMTAgIDB4NCAgICAgICAgLyogVGltZXIgMTAgSW50ZXJydXB0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBUT1ZGX0VSUjggIDB4MTAgICAgICAgLyogVGltZXIgOCBDb3VudGVyIE92ZXJmbG93ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBUT1ZGX0VSUjkgIDB4MjAgICAgICAgLyogVGltZXIgOSBDb3VudGVyIE92ZXJmbG93ICovCisjZGVmaW5lICAgICAgICAgICAgICAgIFRPVkZfRVJSMTAgIDB4NDAgICAgICAgLyogVGltZXIgMTAgQ291bnRlciBPdmVyZmxvdyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIFRSVU44ICAweDEwMDAgICAgIC8qIFRpbWVyIDggU2xhdmUgRW5hYmxlIFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIFRSVU45ICAweDIwMDAgICAgIC8qIFRpbWVyIDkgU2xhdmUgRW5hYmxlIFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgVFJVTjEwICAweDQwMDAgICAgIC8qIFRpbWVyIDEwIFNsYXZlIEVuYWJsZSBTdGF0dXMgKi8KKworLyogQml0IG1hc2tzIGZvciBFUFBJMCBhcmUgb2J0YWluZWQgZnJvbSBjb21tb24gYmFzZSBoZWFkZXIgZm9yIEVQUEl4IChFUFBJMSBhbmQgRVBQSTIpICovCisKKy8qIEJpdCBtYXNrcyBmb3IgVVNCX0ZBRERSICovCisKKyNkZWZpbmUgICAgICAgICAgRlVOQ1RJT05fQUREUkVTUyAgMHg3ZiAgICAgICAvKiBGdW5jdGlvbiBhZGRyZXNzICovCisKKy8qIEJpdCBtYXNrcyBmb3IgVVNCX1BPV0VSICovCisKKyNkZWZpbmUgICAgICAgICAgIEVOQUJMRV9TVVNQRU5ETSAgMHgxICAgICAgICAvKiBlbmFibGUgU3VzcGVuZE0gb3V0cHV0ICovCisjZGVmaW5lICAgICAgICAgICAgICBTVVNQRU5EX01PREUgIDB4MiAgICAgICAgLyogU3VzcGVuZCBNb2RlIGluZGljYXRvciAqLworI2RlZmluZSAgICAgICAgICAgICAgIFJFU1VNRV9NT0RFICAweDQgICAgICAgIC8qIERNQSBNb2RlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgUkVTRVQgIDB4OCAgICAgICAgLyogUmVzZXQgaW5kaWNhdG9yICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgIEhTX01PREUgIDB4MTAgICAgICAgLyogSGlnaCBTcGVlZCBtb2RlIGluZGljYXRvciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgSFNfRU5BQkxFICAweDIwICAgICAgIC8qIGhpZ2ggU3BlZWQgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBTT0ZUX0NPTk4gIDB4NDAgICAgICAgLyogU29mdCBjb25uZWN0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgIElTT19VUERBVEUgIDB4ODAgICAgICAgLyogSXNvY2hyb25vdXMgdXBkYXRlICovCisKKy8qIEJpdCBtYXNrcyBmb3IgVVNCX0lOVFJUWCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBFUDBfVFggIDB4MSAgICAgICAgLyogVHggRW5kcG9pbnQgMCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEVQMV9UWCAgMHgyICAgICAgICAvKiBUeCBFbmRwb2ludCAxIGludGVycnVwdCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgRVAyX1RYICAweDQgICAgICAgIC8qIFR4IEVuZHBvaW50IDIgaW50ZXJydXB0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBFUDNfVFggIDB4OCAgICAgICAgLyogVHggRW5kcG9pbnQgMyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEVQNF9UWCAgMHgxMCAgICAgICAvKiBUeCBFbmRwb2ludCA0IGludGVycnVwdCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgRVA1X1RYICAweDIwICAgICAgIC8qIFR4IEVuZHBvaW50IDUgaW50ZXJydXB0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBFUDZfVFggIDB4NDAgICAgICAgLyogVHggRW5kcG9pbnQgNiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEVQN19UWCAgMHg4MCAgICAgICAvKiBUeCBFbmRwb2ludCA3IGludGVycnVwdCAqLworCisvKiBCaXQgbWFza3MgZm9yIFVTQl9JTlRSUlggKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgRVAxX1JYICAweDIgICAgICAgIC8qIFJ4IEVuZHBvaW50IDEgaW50ZXJydXB0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBFUDJfUlggIDB4NCAgICAgICAgLyogUnggRW5kcG9pbnQgMiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEVQM19SWCAgMHg4ICAgICAgICAvKiBSeCBFbmRwb2ludCAzIGludGVycnVwdCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgRVA0X1JYICAweDEwICAgICAgIC8qIFJ4IEVuZHBvaW50IDQgaW50ZXJydXB0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBFUDVfUlggIDB4MjAgICAgICAgLyogUnggRW5kcG9pbnQgNSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIEVQNl9SWCAgMHg0MCAgICAgICAvKiBSeCBFbmRwb2ludCA2IGludGVycnVwdCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgRVA3X1JYICAweDgwICAgICAgIC8qIFJ4IEVuZHBvaW50IDcgaW50ZXJydXB0ICovCisKKy8qIEJpdCBtYXNrcyBmb3IgVVNCX0lOVFJUWEUgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgIEVQMF9UWF9FICAweDEgICAgICAgIC8qIEVuZHBvaW50IDAgaW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEVQMV9UWF9FICAweDIgICAgICAgIC8qIFR4IEVuZHBvaW50IDEgaW50ZXJydXB0ICBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBFUDJfVFhfRSAgMHg0ICAgICAgICAvKiBUeCBFbmRwb2ludCAyIGludGVycnVwdCAgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgRVAzX1RYX0UgIDB4OCAgICAgICAgLyogVHggRW5kcG9pbnQgMyBpbnRlcnJ1cHQgIEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEVQNF9UWF9FICAweDEwICAgICAgIC8qIFR4IEVuZHBvaW50IDQgaW50ZXJydXB0ICBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBFUDVfVFhfRSAgMHgyMCAgICAgICAvKiBUeCBFbmRwb2ludCA1IGludGVycnVwdCAgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgRVA2X1RYX0UgIDB4NDAgICAgICAgLyogVHggRW5kcG9pbnQgNiBpbnRlcnJ1cHQgIEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEVQN19UWF9FICAweDgwICAgICAgIC8qIFR4IEVuZHBvaW50IDcgaW50ZXJydXB0ICBFbmFibGUgKi8KKworLyogQml0IG1hc2tzIGZvciBVU0JfSU5UUlJYRSAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgRVAxX1JYX0UgIDB4MiAgICAgICAgLyogUnggRW5kcG9pbnQgMSBpbnRlcnJ1cHQgIEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEVQMl9SWF9FICAweDQgICAgICAgIC8qIFJ4IEVuZHBvaW50IDIgaW50ZXJydXB0ICBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBFUDNfUlhfRSAgMHg4ICAgICAgICAvKiBSeCBFbmRwb2ludCAzIGludGVycnVwdCAgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgRVA0X1JYX0UgIDB4MTAgICAgICAgLyogUnggRW5kcG9pbnQgNCBpbnRlcnJ1cHQgIEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIEVQNV9SWF9FICAweDIwICAgICAgIC8qIFJ4IEVuZHBvaW50IDUgaW50ZXJydXB0ICBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBFUDZfUlhfRSAgMHg0MCAgICAgICAvKiBSeCBFbmRwb2ludCA2IGludGVycnVwdCAgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgRVA3X1JYX0UgIDB4ODAgICAgICAgLyogUnggRW5kcG9pbnQgNyBpbnRlcnJ1cHQgIEVuYWJsZSAqLworCisvKiBCaXQgbWFza3MgZm9yIFVTQl9JTlRSVVNCICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgIFNVU1BFTkRfQiAgMHgxICAgICAgICAvKiBTdXNwZW5kIGluZGljYXRvciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIFJFU1VNRV9CICAweDIgICAgICAgIC8qIFJlc3VtZSBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgICAgICAgICAgUkVTRVRfT1JfQkFCTEVfQiAgMHg0ICAgICAgICAvKiBSZXNldC9iYWJibGUgaW5kaWNhdG9yICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgU09GX0IgIDB4OCAgICAgICAgLyogU3RhcnQgb2YgZnJhbWUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgIENPTk5fQiAgMHgxMCAgICAgICAvKiBDb25uZWN0aW9uIGluZGljYXRvciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIERJU0NPTl9CICAweDIwICAgICAgIC8qIERpc2Nvbm5lY3QgaW5kaWNhdG9yICovCisjZGVmaW5lICAgICAgICAgICAgIFNFU1NJT05fUkVRX0IgIDB4NDAgICAgICAgLyogU2Vzc2lvbiBSZXF1ZXN0ICovCisjZGVmaW5lICAgICAgICAgICAgICBWQlVTX0VSUk9SX0IgIDB4ODAgICAgICAgLyogVmJ1cyB0aHJlc2hvbGQgaW5kaWNhdG9yICovCisKKy8qIEJpdCBtYXNrcyBmb3IgVVNCX0lOVFJVU0JFICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgU1VTUEVORF9CRSAgMHgxICAgICAgICAvKiBTdXNwZW5kIGluZGljYXRvciBpbnQgZW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBSRVNVTUVfQkUgIDB4MiAgICAgICAgLyogUmVzdW1lIGluZGljYXRvciBpbnQgZW5hYmxlICovCisjZGVmaW5lICAgICAgICAgUkVTRVRfT1JfQkFCTEVfQkUgIDB4NCAgICAgICAgLyogUmVzZXQvYmFiYmxlIGluZGljYXRvciBpbnQgZW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICBTT0ZfQkUgIDB4OCAgICAgICAgLyogU3RhcnQgb2YgZnJhbWUgaW50IGVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBDT05OX0JFICAweDEwICAgICAgIC8qIENvbm5lY3Rpb24gaW5kaWNhdG9yIGludCBlbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIERJU0NPTl9CRSAgMHgyMCAgICAgICAvKiBEaXNjb25uZWN0IGluZGljYXRvciBpbnQgZW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgU0VTU0lPTl9SRVFfQkUgIDB4NDAgICAgICAgLyogU2Vzc2lvbiBSZXF1ZXN0IGludCBlbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgVkJVU19FUlJPUl9CRSAgMHg4MCAgICAgICAvKiBWYnVzIHRocmVzaG9sZCBpbmRpY2F0b3IgaW50IGVuYWJsZSAqLworCisvKiBCaXQgbWFza3MgZm9yIFVTQl9GUkFNRSAqLworCisjZGVmaW5lICAgICAgICAgICAgICBGUkFNRV9OVU1CRVIgIDB4N2ZmICAgICAgLyogRnJhbWUgbnVtYmVyICovCisKKy8qIEJpdCBtYXNrcyBmb3IgVVNCX0lOREVYICovCisKKyNkZWZpbmUgICAgICAgICBTRUxFQ1RFRF9FTkRQT0lOVCAgMHhmICAgICAgICAvKiBzZWxlY3RlZCBlbmRwb2ludCAqLworCisvKiBCaXQgbWFza3MgZm9yIFVTQl9HTE9CQUxfQ1RMICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgR0xPQkFMX0VOQSAgMHgxICAgICAgICAvKiBlbmFibGVzIFVTQiBtb2R1bGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgRVAxX1RYX0VOQSAgMHgyICAgICAgICAvKiBUcmFuc21pdCBlbmRwb2ludCAxIGVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICBFUDJfVFhfRU5BICAweDQgICAgICAgIC8qIFRyYW5zbWl0IGVuZHBvaW50IDIgZW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgIEVQM19UWF9FTkEgIDB4OCAgICAgICAgLyogVHJhbnNtaXQgZW5kcG9pbnQgMyBlbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgRVA0X1RYX0VOQSAgMHgxMCAgICAgICAvKiBUcmFuc21pdCBlbmRwb2ludCA0IGVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICBFUDVfVFhfRU5BICAweDIwICAgICAgIC8qIFRyYW5zbWl0IGVuZHBvaW50IDUgZW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgIEVQNl9UWF9FTkEgIDB4NDAgICAgICAgLyogVHJhbnNtaXQgZW5kcG9pbnQgNiBlbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgRVA3X1RYX0VOQSAgMHg4MCAgICAgICAvKiBUcmFuc21pdCBlbmRwb2ludCA3IGVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICBFUDFfUlhfRU5BICAweDEwMCAgICAgIC8qIFJlY2VpdmUgZW5kcG9pbnQgMSBlbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgRVAyX1JYX0VOQSAgMHgyMDAgICAgICAvKiBSZWNlaXZlIGVuZHBvaW50IDIgZW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgIEVQM19SWF9FTkEgIDB4NDAwICAgICAgLyogUmVjZWl2ZSBlbmRwb2ludCAzIGVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICBFUDRfUlhfRU5BICAweDgwMCAgICAgIC8qIFJlY2VpdmUgZW5kcG9pbnQgNCBlbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgRVA1X1JYX0VOQSAgMHgxMDAwICAgICAvKiBSZWNlaXZlIGVuZHBvaW50IDUgZW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgIEVQNl9SWF9FTkEgIDB4MjAwMCAgICAgLyogUmVjZWl2ZSBlbmRwb2ludCA2IGVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICBFUDdfUlhfRU5BICAweDQwMDAgICAgIC8qIFJlY2VpdmUgZW5kcG9pbnQgNyBlbmFibGUgKi8KKworLyogQml0IG1hc2tzIGZvciBVU0JfT1RHX0RFVl9DVEwgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICBTRVNTSU9OICAweDEgICAgICAgIC8qIHNlc3Npb24gaW5kaWNhdG9yICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgSE9TVF9SRVEgIDB4MiAgICAgICAgLyogSG9zdCBuZWdvdGlhdGlvbiByZXF1ZXN0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBIT1NUX01PREUgIDB4NCAgICAgICAgLyogaW5kaWNhdGVzIFVTQkRSQyBpcyBhIGhvc3QgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBWQlVTMCAgMHg4ICAgICAgICAvKiBWYnVzIGxldmVsIGluZGljYXRvclswXSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIFZCVVMxICAweDEwICAgICAgIC8qIFZidXMgbGV2ZWwgaW5kaWNhdG9yWzFdICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgTFNERVYgIDB4MjAgICAgICAgLyogTG93LXNwZWVkIGluZGljYXRvciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIEZTREVWICAweDQwICAgICAgIC8qIEZ1bGwgb3IgSGlnaC1zcGVlZCBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBCX0RFVklDRSAgMHg4MCAgICAgICAvKiBBJyBvciAnQicgZGV2aWNlIGluZGljYXRvciAqLworCisvKiBCaXQgbWFza3MgZm9yIFVTQl9PVEdfVkJVU19JUlEgKi8KKworI2RlZmluZSAgICAgICAgICAgICBEUklWRV9WQlVTX09OICAweDEgICAgICAgIC8qIGluZGljYXRvciB0byBkcml2ZSBWQlVTIGNvbnRyb2wgY2lyY3VpdCAqLworI2RlZmluZSAgICAgICAgICAgIERSSVZFX1ZCVVNfT0ZGICAweDIgICAgICAgIC8qIGluZGljYXRvciB0byBzaHV0IG9mZiBjaGFyZ2UgcHVtcCAqLworI2RlZmluZSAgICAgICAgICAgQ0hSR19WQlVTX1NUQVJUICAweDQgICAgICAgIC8qIGluZGljYXRvciBmb3IgZXh0ZXJuYWwgY2lyY3VpdCB0byBzdGFydCBjaGFyZ2luZyBWQlVTICovCisjZGVmaW5lICAgICAgICAgICAgIENIUkdfVkJVU19FTkQgIDB4OCAgICAgICAgLyogaW5kaWNhdG9yIGZvciBleHRlcm5hbCBjaXJjdWl0IHRvIGVuZCBjaGFyZ2luZyBWQlVTICovCisjZGVmaW5lICAgICAgICBESVNDSFJHX1ZCVVNfU1RBUlQgIDB4MTAgICAgICAgLyogaW5kaWNhdG9yIHRvIHN0YXJ0IGRpc2NoYXJnaW5nIFZCVVMgKi8KKyNkZWZpbmUgICAgICAgICAgRElTQ0hSR19WQlVTX0VORCAgMHgyMCAgICAgICAvKiBpbmRpY2F0b3IgdG8gc3RvcCBkaXNjaGFyZ2luZyBWQlVTICovCisKKy8qIEJpdCBtYXNrcyBmb3IgVVNCX09UR19WQlVTX01BU0sgKi8KKworI2RlZmluZSAgICAgICAgIERSSVZFX1ZCVVNfT05fRU5BICAweDEgICAgICAgIC8qIGVuYWJsZSBEUklWRV9WQlVTX09OIGludGVycnVwdCAqLworI2RlZmluZSAgICAgICAgRFJJVkVfVkJVU19PRkZfRU5BICAweDIgICAgICAgIC8qIGVuYWJsZSBEUklWRV9WQlVTX09GRiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICAgICAgQ0hSR19WQlVTX1NUQVJUX0VOQSAgMHg0ICAgICAgICAvKiBlbmFibGUgQ0hSR19WQlVTX1NUQVJUIGludGVycnVwdCAqLworI2RlZmluZSAgICAgICAgIENIUkdfVkJVU19FTkRfRU5BICAweDggICAgICAgIC8qIGVuYWJsZSBDSFJHX1ZCVVNfRU5EIGludGVycnVwdCAqLworI2RlZmluZSAgICBESVNDSFJHX1ZCVVNfU1RBUlRfRU5BICAweDEwICAgICAgIC8qIGVuYWJsZSBESVNDSFJHX1ZCVVNfU1RBUlQgaW50ZXJydXB0ICovCisjZGVmaW5lICAgICAgRElTQ0hSR19WQlVTX0VORF9FTkEgIDB4MjAgICAgICAgLyogZW5hYmxlIERJU0NIUkdfVkJVU19FTkQgaW50ZXJydXB0ICovCisKKy8qIEJpdCBtYXNrcyBmb3IgVVNCX0NTUjAgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgIFJYUEtUUkRZICAweDEgICAgICAgIC8qIGRhdGEgcGFja2V0IHJlY2VpdmUgaW5kaWNhdG9yICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgVFhQS1RSRFkgIDB4MiAgICAgICAgLyogZGF0YSBwYWNrZXQgaW4gRklGTyBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgU1RBTExfU0VOVCAgMHg0ICAgICAgICAvKiBTVEFMTCBoYW5kc2hha2Ugc2VudCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBEQVRBRU5EICAweDggICAgICAgIC8qIERhdGEgZW5kIGluZGljYXRvciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIFNFVFVQRU5EICAweDEwICAgICAgIC8qIFNldHVwIGVuZCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgU0VORFNUQUxMICAweDIwICAgICAgIC8qIFNlbmQgU1RBTEwgaGFuZHNoYWtlICovCisjZGVmaW5lICAgICAgICAgU0VSVklDRURfUlhQS1RSRFkgIDB4NDAgICAgICAgLyogdXNlZCB0byBjbGVhciB0aGUgUnhQa3RSZHkgYml0ICovCisjZGVmaW5lICAgICAgICAgU0VSVklDRURfU0VUVVBFTkQgIDB4ODAgICAgICAgLyogdXNlZCB0byBjbGVhciB0aGUgU2V0dXBFbmQgYml0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBGTFVTSEZJRk8gIDB4MTAwICAgICAgLyogZmx1c2ggZW5kcG9pbnQgRklGTyAqLworI2RlZmluZSAgICAgICAgICBTVEFMTF9SRUNFSVZFRF9IICAweDQgICAgICAgIC8qIFNUQUxMIGhhbmRzaGFrZSByZWNlaXZlZCBob3N0IG1vZGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgU0VUVVBQS1RfSCAgMHg4ICAgICAgICAvKiBzZW5kIFNldHVwIHRva2VuIGhvc3QgbW9kZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBFUlJPUl9IICAweDEwICAgICAgIC8qIHRpbWVvdXQgZXJyb3IgaW5kaWNhdG9yIGhvc3QgbW9kZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIFJFUVBLVF9IICAweDIwICAgICAgIC8qIFJlcXVlc3QgYW4gSU4gdHJhbnNhY3Rpb24gaG9zdCBtb2RlICovCisjZGVmaW5lICAgICAgICAgICAgICAgU1RBVFVTUEtUX0ggIDB4NDAgICAgICAgLyogU3RhdHVzIHN0YWdlIHRyYW5zYWN0aW9uIGhvc3QgbW9kZSAqLworI2RlZmluZSAgICAgICAgICAgICBOQUtfVElNRU9VVF9IICAweDgwICAgICAgIC8qIEVQMCBoYWx0ZWQgYWZ0ZXIgYSBOQUsgaG9zdCBtb2RlICovCisKKy8qIEJpdCBtYXNrcyBmb3IgVVNCX0NPVU5UMCAqLworCisjZGVmaW5lICAgICAgICAgICAgICBFUDBfUlhfQ09VTlQgIDB4N2YgICAgICAgLyogbnVtYmVyIG9mIHJlY2VpdmVkIGJ5dGVzIGluIEVQMCBGSUZPICovCisKKy8qIEJpdCBtYXNrcyBmb3IgVVNCX05BS0xJTUlUMCAqLworCisjZGVmaW5lICAgICAgICAgICAgIEVQMF9OQUtfTElNSVQgIDB4MWYgICAgICAgLyogbnVtYmVyIG9mIGZyYW1lcy9taWNybyBmcmFtZXMgYWZ0ZXIgd2hpY2ggRVAwIHRpbWVvdXRzICovCisKKy8qIEJpdCBtYXNrcyBmb3IgVVNCX1RYX01BWF9QQUNLRVQgKi8KKworI2RlZmluZSAgICAgICAgIE1BWF9QQUNLRVRfU0laRV9UICAweDdmZiAgICAgIC8qIG1heGltdW0gZGF0YSBwYXkgbG9hZCBpbiBhIGZyYW1lICovCisKKy8qIEJpdCBtYXNrcyBmb3IgVVNCX1JYX01BWF9QQUNLRVQgKi8KKworI2RlZmluZSAgICAgICAgIE1BWF9QQUNLRVRfU0laRV9SICAweDdmZiAgICAgIC8qIG1heGltdW0gZGF0YSBwYXkgbG9hZCBpbiBhIGZyYW1lICovCisKKy8qIEJpdCBtYXNrcyBmb3IgVVNCX1RYQ1NSICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgVFhQS1RSRFlfVCAgMHgxICAgICAgICAvKiBkYXRhIHBhY2tldCBpbiBGSUZPIGluZGljYXRvciAqLworI2RlZmluZSAgICAgICAgICBGSUZPX05PVF9FTVBUWV9UICAweDIgICAgICAgIC8qIEZJRk8gbm90IGVtcHR5ICovCisjZGVmaW5lICAgICAgICAgICAgICAgIFVOREVSUlVOX1QgIDB4NCAgICAgICAgLyogVHhQa3RSZHkgbm90IHNldCAgZm9yIGFuIElOIHRva2VuICovCisjZGVmaW5lICAgICAgICAgICAgICAgRkxVU0hGSUZPX1QgIDB4OCAgICAgICAgLyogZmx1c2ggZW5kcG9pbnQgRklGTyAqLworI2RlZmluZSAgICAgICAgICAgICAgU1RBTExfU0VORF9UICAweDEwICAgICAgIC8qIGlzc3VlIGEgU3RhbGwgaGFuZHNoYWtlICovCisjZGVmaW5lICAgICAgICAgICAgICBTVEFMTF9TRU5UX1QgIDB4MjAgICAgICAgLyogU3RhbGwgaGFuZHNoYWtlIHRyYW5zbWl0dGVkICovCisjZGVmaW5lICAgICAgICBDTEVBUl9EQVRBVE9HR0xFX1QgIDB4NDAgICAgICAgLyogY2xlYXIgZW5kcG9pbnQgZGF0YSB0b2dnbGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgSU5DT01QVFhfVCAgMHg4MCAgICAgICAvKiBpbmRpY2F0ZXMgdGhhdCBhIGxhcmdlIHBhY2tldCBpcyBzcGxpdCAqLworI2RlZmluZSAgICAgICAgICAgICAgRE1BUkVRTU9ERV9UICAweDQwMCAgICAgIC8qIERNQSBtb2RlICgwIG9yIDEpIHNlbGVjdGlvbiAqLworI2RlZmluZSAgICAgICAgRk9SQ0VfREFUQVRPR0dMRV9UICAweDgwMCAgICAgIC8qIEZvcmNlIGRhdGEgdG9nZ2xlICovCisjZGVmaW5lICAgICAgICAgICAgICBETUFSRVFfRU5BX1QgIDB4MTAwMCAgICAgLyogRW5hYmxlIERNQSByZXF1ZXN0IGZvciBUeCBFUCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIElTT19UICAweDQwMDAgICAgIC8qIGVuYWJsZSBJc29jaHJvbm91cyB0cmFuc2ZlcnMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIEFVVE9TRVRfVCAgMHg4MDAwICAgICAvKiBhbGxvd3MgVHhQa3RSZHkgdG8gYmUgc2V0IGF1dG9tYXRpY2FsbHkgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBFUlJPUl9USCAgMHg0ICAgICAgICAvKiBlcnJvciBjb25kaXRpb24gaG9zdCBtb2RlICovCisjZGVmaW5lICAgICAgICAgU1RBTExfUkVDRUlWRURfVEggIDB4MjAgICAgICAgLyogU3RhbGwgaGFuZHNoYWtlIHJlY2VpdmVkIGhvc3QgbW9kZSAqLworI2RlZmluZSAgICAgICAgICAgIE5BS19USU1FT1VUX1RIICAweDgwICAgICAgIC8qIE5BSyB0aW1lb3V0IGhvc3QgbW9kZSAqLworCisvKiBCaXQgbWFza3MgZm9yIFVTQl9UWENPVU5UICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICBUWF9DT1VOVCAgMHgxZmZmICAgICAvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbiB0byB0aGUgc2VsZWN0ZWQgZW5kcG9pbnQgVHggRklGTyAqLworCisvKiBCaXQgbWFza3MgZm9yIFVTQl9SWENTUiAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgIFJYUEtUUkRZX1IgIDB4MSAgICAgICAgLyogZGF0YSBwYWNrZXQgaW4gRklGTyBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICBGSUZPX0ZVTExfUiAgMHgyICAgICAgICAvKiBGSUZPIG5vdCBlbXB0eSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgT1ZFUlJVTl9SICAweDQgICAgICAgIC8qIFR4UGt0UmR5IG5vdCBzZXQgIGZvciBhbiBJTiB0b2tlbiAqLworI2RlZmluZSAgICAgICAgICAgICAgIERBVEFFUlJPUl9SICAweDggICAgICAgIC8qIE91dCBwYWNrZXQgY2Fubm90IGJlIGxvYWRlZCBpbnRvIFJ4ICBGSUZPICovCisjZGVmaW5lICAgICAgICAgICAgICAgRkxVU0hGSUZPX1IgIDB4MTAgICAgICAgLyogZmx1c2ggZW5kcG9pbnQgRklGTyAqLworI2RlZmluZSAgICAgICAgICAgICAgU1RBTExfU0VORF9SICAweDIwICAgICAgIC8qIGlzc3VlIGEgU3RhbGwgaGFuZHNoYWtlICovCisjZGVmaW5lICAgICAgICAgICAgICBTVEFMTF9TRU5UX1IgIDB4NDAgICAgICAgLyogU3RhbGwgaGFuZHNoYWtlIHRyYW5zbWl0dGVkICovCisjZGVmaW5lICAgICAgICBDTEVBUl9EQVRBVE9HR0xFX1IgIDB4ODAgICAgICAgLyogY2xlYXIgZW5kcG9pbnQgZGF0YSB0b2dnbGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgSU5DT01QUlhfUiAgMHgxMDAgICAgICAvKiBpbmRpY2F0ZXMgdGhhdCBhIGxhcmdlIHBhY2tldCBpcyBzcGxpdCAqLworI2RlZmluZSAgICAgICAgICAgICAgRE1BUkVRTU9ERV9SICAweDgwMCAgICAgIC8qIERNQSBtb2RlICgwIG9yIDEpIHNlbGVjdGlvbiAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgRElTTllFVF9SICAweDEwMDAgICAgIC8qIGRpc2FibGUgTnlldCBoYW5kc2hha2VzICovCisjZGVmaW5lICAgICAgICAgICAgICBETUFSRVFfRU5BX1IgIDB4MjAwMCAgICAgLyogRW5hYmxlIERNQSByZXF1ZXN0IGZvciBUeCBFUCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgIElTT19SICAweDQwMDAgICAgIC8qIGVuYWJsZSBJc29jaHJvbm91cyB0cmFuc2ZlcnMgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICBBVVRPQ0xFQVJfUiAgMHg4MDAwICAgICAvKiBhbGxvd3MgVHhQa3RSZHkgdG8gYmUgc2V0IGF1dG9tYXRpY2FsbHkgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBFUlJPUl9SSCAgMHg0ICAgICAgICAvKiBUeFBrdFJkeSBub3Qgc2V0ICBmb3IgYW4gSU4gdG9rZW4gaG9zdCBtb2RlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICBSRVFQS1RfUkggIDB4MjAgICAgICAgLyogcmVxdWVzdCBhbiBJTiB0cmFuc2FjdGlvbiBob3N0IG1vZGUgKi8KKyNkZWZpbmUgICAgICAgICBTVEFMTF9SRUNFSVZFRF9SSCAgMHg0MCAgICAgICAvKiBTdGFsbCBoYW5kc2hha2UgcmVjZWl2ZWQgaG9zdCBtb2RlICovCisjZGVmaW5lICAgICAgICAgICAgICAgSU5DT01QUlhfUkggIDB4MTAwICAgICAgLyogaW5kaWNhdGVzIHRoYXQgYSBsYXJnZSBwYWNrZXQgaXMgc3BsaXQgaG9zdCBtb2RlICovCisjZGVmaW5lICAgICAgICAgICAgIERNQVJFUU1PREVfUkggIDB4ODAwICAgICAgLyogRE1BIG1vZGUgKDAgb3IgMSkgc2VsZWN0aW9uIGhvc3QgbW9kZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICBBVVRPUkVRX1JIICAweDQwMDAgICAgIC8qIHNldHMgUmVxUGt0IGF1dG9tYXRpY2FsbHkgaG9zdCBtb2RlICovCisKKy8qIEJpdCBtYXNrcyBmb3IgVVNCX1JYQ09VTlQgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgIFJYX0NPVU5UICAweDFmZmYgICAgIC8qIE51bWJlciBvZiByZWNlaXZlZCBieXRlcyBpbiB0aGUgcGFja2V0IGluIHRoZSBSeCBGSUZPICovCisKKy8qIEJpdCBtYXNrcyBmb3IgVVNCX1RYVFlQRSAqLworCisjZGVmaW5lICAgICAgICAgICAgVEFSR0VUX0VQX05PX1QgIDB4ZiAgICAgICAgLyogRVAgbnVtYmVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgIFBST1RPQ09MX1QgIDB4YyAgICAgICAgLyogdHJhbnNmZXIgdHlwZSAqLworCisvKiBCaXQgbWFza3MgZm9yIFVTQl9UWElOVEVSVkFMICovCisKKyNkZWZpbmUgICAgICAgICAgVFhfUE9MTF9JTlRFUlZBTCAgMHhmZiAgICAgICAvKiBwb2xsaW5nIGludGVydmFsIGZvciBzZWxlY3RlZCBUeCBFUCAqLworCisvKiBCaXQgbWFza3MgZm9yIFVTQl9SWFRZUEUgKi8KKworI2RlZmluZSAgICAgICAgICAgIFRBUkdFVF9FUF9OT19SICAweGYgICAgICAgIC8qIEVQIG51bWJlciAqLworI2RlZmluZSAgICAgICAgICAgICAgICBQUk9UT0NPTF9SICAweGMgICAgICAgIC8qIHRyYW5zZmVyIHR5cGUgKi8KKworLyogQml0IG1hc2tzIGZvciBVU0JfUlhJTlRFUlZBTCAqLworCisjZGVmaW5lICAgICAgICAgIFJYX1BPTExfSU5URVJWQUwgIDB4ZmYgICAgICAgLyogcG9sbGluZyBpbnRlcnZhbCBmb3Igc2VsZWN0ZWQgUnggRVAgKi8KKworLyogQml0IG1hc2tzIGZvciBVU0JfRE1BX0lOVEVSUlVQVCAqLworCisjZGVmaW5lICAgICAgICAgICAgICAgICAgRE1BMF9JTlQgIDB4MSAgICAgICAgLyogRE1BMCBwZW5kaW5nIGludGVycnVwdCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIERNQTFfSU5UICAweDIgICAgICAgIC8qIERNQTEgcGVuZGluZyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBETUEyX0lOVCAgMHg0ICAgICAgICAvKiBETUEyIHBlbmRpbmcgaW50ZXJydXB0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgRE1BM19JTlQgIDB4OCAgICAgICAgLyogRE1BMyBwZW5kaW5nIGludGVycnVwdCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIERNQTRfSU5UICAweDEwICAgICAgIC8qIERNQTQgcGVuZGluZyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBETUE1X0lOVCAgMHgyMCAgICAgICAvKiBETUE1IHBlbmRpbmcgaW50ZXJydXB0ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgRE1BNl9JTlQgIDB4NDAgICAgICAgLyogRE1BNiBwZW5kaW5nIGludGVycnVwdCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgIERNQTdfSU5UICAweDgwICAgICAgIC8qIERNQTcgcGVuZGluZyBpbnRlcnJ1cHQgKi8KKworLyogQml0IG1hc2tzIGZvciBVU0JfRE1BeENPTlRST0wgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgICAgICBETUFfRU5BICAweDEgICAgICAgIC8qIERNQSBlbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgIERJUkVDVElPTiAgMHgyICAgICAgICAvKiBkaXJlY3Rpb24gb2YgRE1BIHRyYW5zZmVyICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgIE1PREUgIDB4NCAgICAgICAgLyogRE1BIEJ1cyBlcnJvciAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICBJTlRfRU5BICAweDggICAgICAgIC8qIEludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICBFUE5VTSAgMHhmMCAgICAgICAvKiBFUCBudW1iZXIgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICBCVVNFUlJPUiAgMHgxMDAgICAgICAvKiBETUEgQnVzIGVycm9yICovCisKKy8qIEJpdCBtYXNrcyBmb3IgVVNCX0RNQXhBRERSSElHSCAqLworCisjZGVmaW5lICAgICAgICAgICAgIERNQV9BRERSX0hJR0ggIDB4ZmZmZiAgICAgLyogVXBwZXIgMTYtYml0cyBvZiBtZW1vcnkgc291cmNlL2Rlc3RpbmF0aW9uIGFkZHJlc3MgZm9yIHRoZSBETUEgbWFzdGVyIGNoYW5uZWwgKi8KKworLyogQml0IG1hc2tzIGZvciBVU0JfRE1BeEFERFJMT1cgKi8KKworI2RlZmluZSAgICAgICAgICAgICAgRE1BX0FERFJfTE9XICAweGZmZmYgICAgIC8qIExvd2VyIDE2LWJpdHMgb2YgbWVtb3J5IHNvdXJjZS9kZXN0aW5hdGlvbiBhZGRyZXNzIGZvciB0aGUgRE1BIG1hc3RlciBjaGFubmVsICovCisKKy8qIEJpdCBtYXNrcyBmb3IgVVNCX0RNQXhDT1VOVEhJR0ggKi8KKworI2RlZmluZSAgICAgICAgICAgIERNQV9DT1VOVF9ISUdIICAweGZmZmYgICAgIC8qIFVwcGVyIDE2LWJpdHMgb2YgYnl0ZSBjb3VudCBvZiBETUEgdHJhbnNmZXIgZm9yIERNQSBtYXN0ZXIgY2hhbm5lbCAqLworCisvKiBCaXQgbWFza3MgZm9yIFVTQl9ETUF4Q09VTlRMT1cgKi8KKworI2RlZmluZSAgICAgICAgICAgICBETUFfQ09VTlRfTE9XICAweGZmZmYgICAgIC8qIExvd2VyIDE2LWJpdHMgb2YgYnl0ZSBjb3VudCBvZiBETUEgdHJhbnNmZXIgZm9yIERNQSBtYXN0ZXIgY2hhbm5lbCAqLworCisvKiBCaXQgbWFza3MgZm9yIEhNRE1BeF9DT05UUk9MICovCisKKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgSE1ETUFFTiAgMHgxICAgICAgICAvKiBIYW5kc2hha2UgTURNQSBFbmFibGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIFJFUCAgMHgyICAgICAgICAvKiBIYW5kc2hha2UgTURNQSBSZXF1ZXN0IFBvbGFyaXR5ICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBVVEUgIDB4OCAgICAgICAgLyogVXJnZW5jeSBUaHJlc2hvbGQgRW5hYmxlICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICBPSUUgIDB4MTAgICAgICAgLyogT3ZlcmZsb3cgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBCRElFICAweDIwICAgICAgIC8qIEJsb2NrIERvbmUgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBNQkRJICAweDQwICAgICAgIC8qIE1hc2sgQmxvY2sgRG9uZSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIERSUSAgMHgzMDAgICAgICAvKiBIYW5kc2hha2UgTURNQSBSZXF1ZXN0IFR5cGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIFJCQyAgMHgxMDAwICAgICAvKiBGb3JjZSBSZWxvYWQgb2YgQkNPVU5UICovCisjZGVmaW5lICAgICAgICAgICAgICAgICAgICAgICAgUFMgIDB4MjAwMCAgICAgLyogUGluIFN0YXR1cyAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICAgIE9JICAweDQwMDAgICAgIC8qIE92ZXJmbG93IEludGVycnVwdCBHZW5lcmF0ZWQgKi8KKyNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgIEJESSAgMHg4MDAwICAgICAvKiBCbG9jayBEb25lIEludGVycnVwdCBHZW5lcmF0ZWQgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogICAgIE1VTFRJIEJJVCBNQUNSTyBFTlVNRVJBVElPTlMgICAgICAgICAgICAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisKKyNlbmRpZiAvKiBfREVGX0JGNTQ4X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NDgvZGVmQkY1NDguaCBiL2luY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NDgvZGVmQkY1NDguaAppbmRleCBlNDZmNTY4Li4xZDdjOTZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTQ4L2RlZkJGNTQ4LmgKKysrIGIvaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjU0OC9kZWZCRjU0OC5oCkBAIC0xMDEwLDkgKzEwMTAsOSBAQAogI2RlZmluZSAgICAgICAgICAgICAgICAgRE1BX1JFQURZICAweDEgICAgICAgIC8qIERNQSBSZWFkeSAqLwogI2RlZmluZSAgICAgICAgICAgICAgICAgIEZJRk9GVUxMICAweDIgICAgICAgIC8qIEZJRk8gRnVsbCAqLwogI2RlZmluZSAgICAgICAgICAgICAgICAgRklGT0VNUFRZICAweDQgICAgICAgIC8qIEZJRk8gRW1wdHkgKi8KLSNkZWZpbmUgICAgICAgICAgICAgICAgICBDT01QTEVURSAgMHg4ICAgICAgICAvKiBETUEgQ29tcGxldGUgKi8KKyNkZWZpbmUgICAgICAgICAgICAgIERNQV9DT01QTEVURSAgMHg4ICAgICAgICAvKiBETUEgQ29tcGxldGUgKi8KICNkZWZpbmUgICAgICAgICAgICAgICAgICAgICAgSFNISyAgMHgxMCAgICAgICAvKiBIb3N0IEhhbmRzaGFrZSAqLwotI2RlZmluZSAgICAgICAgICAgICAgICAgICBUSU1FT1VUICAweDIwICAgICAgIC8qIEhvc3QgVGltZW91dCAqLworI2RlZmluZSAgICAgICAgICAgICAgICAgSFNUSU1FT1VUICAweDIwICAgICAgIC8qIEhvc3QgVGltZW91dCAqLwogI2RlZmluZSAgICAgICAgICAgICAgICAgICAgICBISVJRICAweDQwICAgICAgIC8qIEhvc3QgSW50ZXJydXB0IFJlcXVlc3QgKi8KICNkZWZpbmUgICAgICAgICAgICAgICAgQUxMT1dfQ05GRyAgMHg4MCAgICAgICAvKiBBbGxvdyBOZXcgQ29uZmlndXJhdGlvbiAqLwogI2RlZmluZSAgICAgICAgICAgICAgICAgICBETUFfRElSICAweDEwMCAgICAgIC8qIERNQSBEaXJlY3Rpb24gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NDgvZG1hLmggYi9pbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTQ4L2RtYS5oCmluZGV4IDRkOTdkM2EuLjQ2ZmYzMWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NDgvZG1hLmgKKysrIGIvaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjU0OC9kbWEuaApAQCAtNTEsOSArNTEsMTMgQEAKICNkZWZpbmUgQ0hfUElYQ19PVkVSTEFZCQkxNgogI2RlZmluZSBDSF9QSVhDX09VVFBVVAkJMTcKICNkZWZpbmUgQ0hfU1BPUlQyX1JYCQkxOAorI2RlZmluZSBDSF9VQVJUMl9SWAkJMTgKICNkZWZpbmUgQ0hfU1BPUlQyX1RYCQkxOQorI2RlZmluZSBDSF9VQVJUMl9UWAkJMTkKICNkZWZpbmUgQ0hfU1BPUlQzX1JYCQkyMAorI2RlZmluZSBDSF9VQVJUM19SWAkJMjAKICNkZWZpbmUgQ0hfU1BPUlQzX1RYCQkyMQorI2RlZmluZSBDSF9VQVJUM19UWAkJMjEKICNkZWZpbmUgQ0hfU0RICQkJMjIKICNkZWZpbmUgQ0hfTkZDCQkJMjIKICNkZWZpbmUgQ0hfU1BJMgkJCTIzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTQ4L2lycS5oIGIvaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjU0OC9pcnEuaAppbmRleCBjMzQ1MDdhLi5hZDM4MGQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTQ4L2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NDgvaXJxLmgKQEAgLTk5LDkgKzk5LDEzIEBACiAjZGVmaW5lIElSUV9VQVJUMl9FUlJPUgkJQkZJTl9JUlEoMzEpCS8qIFVBUlQyIFN0YXR1cyAoRXJyb3IpIEludGVycnVwdCAqLwogI2RlZmluZSBJUlFfQ0FOMF9FUlJPUgkJQkZJTl9JUlEoMzIpCS8qIENBTjAgU3RhdHVzIChFcnJvcikgSW50ZXJydXB0ICovCiAjZGVmaW5lIElSUV9TUE9SVDJfUlgJCUJGSU5fSVJRKDMzKQkvKiBTUE9SVDIgUlggKERNQTE4KSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX1VBUlQyX1JYCQlCRklOX0lSUSgzMykJLyogVUFSVDIgUlggKERNQTE4KSBJbnRlcnJ1cHQgKi8KICNkZWZpbmUgSVJRX1NQT1JUMl9UWAkJQkZJTl9JUlEoMzQpCS8qIFNQT1JUMiBUWCAoRE1BMTkpIEludGVycnVwdCAqLworI2RlZmluZSBJUlFfVUFSVDJfVFgJCUJGSU5fSVJRKDM0KQkvKiBVQVJUMiBUWCAoRE1BMTkpIEludGVycnVwdCAqLwogI2RlZmluZSBJUlFfU1BPUlQzX1JYCQlCRklOX0lSUSgzNSkJLyogU1BPUlQzIFJYIChETUEyMCkgSW50ZXJydXB0ICovCisjZGVmaW5lIElSUV9VQVJUM19SWAkJQkZJTl9JUlEoMzUpCS8qIFVBUlQzIFJYIChETUEyMCkgSW50ZXJydXB0ICovCiAjZGVmaW5lIElSUV9TUE9SVDNfVFgJCUJGSU5fSVJRKDM2KQkvKiBTUE9SVDMgVFggKERNQTIxKSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX1VBUlQzX1RYCQlCRklOX0lSUSgzNikJLyogVUFSVDMgVFggKERNQTIxKSBJbnRlcnJ1cHQgKi8KICNkZWZpbmUgSVJRX0VQUEkxCQlCRklOX0lSUSgzNykJLyogRVBQMSAoRE1BMTMpIEludGVycnVwdCAqLwogI2RlZmluZSBJUlFfRVBQSTIJCUJGSU5fSVJRKDM4KQkvKiBFUFAyIChETUExNCkgSW50ZXJydXB0ICovCiAjZGVmaW5lIElSUV9TUEkxCQlCRklOX0lSUSgzOSkJLyogU1BJMSAoRE1BNSkgSW50ZXJydXB0ICovCkBAIC00MjEsOSArNDI1LDEzIEBACiAvKiBJQVI0IEJJVCBGSUxFRFMgKi8KICNkZWZpbmUgSVJRX0NBTjBfRVJSX1BPUwkwCiAjZGVmaW5lIElSUV9TUE9SVDJfUlhfUE9TCTQKKyNkZWZpbmUgSVJRX1VBUlQyX1JYX1BPUwk0CiAjZGVmaW5lIElSUV9TUE9SVDJfVFhfUE9TCTgKKyNkZWZpbmUgSVJRX1VBUlQyX1RYX1BPUwk4CiAjZGVmaW5lIElSUV9TUE9SVDNfUlhfUE9TCTEyCisjZGVmaW5lIElSUV9VQVJUM19SWF9QT1MJMTIKICNkZWZpbmUgSVJRX1NQT1JUM19UWF9QT1MJMTYKKyNkZWZpbmUgSVJRX1VBUlQzX1RYX1BPUwkxNgogI2RlZmluZSBJUlFfRVBQSTFfUE9TCQkyMAogI2RlZmluZSBJUlFfRVBQSTJfUE9TCQkyNAogI2RlZmluZSBJUlFfU1BJMV9QT1MJCTI4CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTYxL2JsYWNrZmluLmggYi9pbmNsdWRlL2FzbS1ibGFja2Zpbi9tYWNoLWJmNTYxL2JsYWNrZmluLmgKaW5kZXggNTYyYWVlMy4uMzYyNjE3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYmxhY2tmaW4vbWFjaC1iZjU2MS9ibGFja2Zpbi5oCisrKyBiL2luY2x1ZGUvYXNtLWJsYWNrZmluL21hY2gtYmY1NjEvYmxhY2tmaW4uaApAQCAtNDksNCArNDksMjQgQEAKICNkZWZpbmUgYmZpbl9yZWFkX0ZJT19JTkVOKCkgYmZpbl9yZWFkX0ZJTzBfSU5FTigpCiAjZGVmaW5lIGJmaW5fd3JpdGVfRklPX0lORU4odmFsKSBiZmluX3dyaXRlX0ZJTzBfSU5FTih2YWwpCiAKKworI2RlZmluZSBTSUNfSUFSMCBTSUNBX0lBUjAKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSU1BU0swIGJmaW5fd3JpdGVfU0lDQV9JTUFTSzAKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSU1BU0sxIGJmaW5fd3JpdGVfU0lDQV9JTUFTSzEKKyNkZWZpbmUgYmZpbl93cml0ZV9TSUNfSVdSMCAgIGJmaW5fd3JpdGVfU0lDQV9JV1IwCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lXUjEgICBiZmluX3dyaXRlX1NJQ0FfSVdSMQorCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSU1BU0swIGJmaW5fcmVhZF9TSUNBX0lNQVNLMAorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lNQVNLMSBiZmluX3JlYWRfU0lDQV9JTUFTSzEKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JV1IwICAgYmZpbl9yZWFkX1NJQ0FfSVdSMAorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lXUjEgICBiZmluX3JlYWRfU0lDQV9JV1IxCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSVNSMCAgIGJmaW5fcmVhZF9TSUNBX0lTUjAKKyNkZWZpbmUgYmZpbl9yZWFkX1NJQ19JU1IxICAgYmZpbl9yZWFkX1NJQ0FfSVNSMQorCisjZGVmaW5lIGJmaW5fcmVhZF9TSUNfSU1BU0soeCkJCWJmaW5fcmVhZDMyKFNJQ0FfSU1BU0swICsgKHggPDwgMikpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lNQVNLKHgsIHZhbCkJYmZpbl93cml0ZTMyKChTSUNBX0lNQVNLMCArICh4IDw8IDIpKSwgdmFsKQorI2RlZmluZSBiZmluX3JlYWRfU0lDX0lTUih4KQkJYmZpbl9yZWFkMzIoU0lDQV9JU1IwICsgKHggPDwgMikpCisjZGVmaW5lIGJmaW5fd3JpdGVfU0lDX0lTUih4LCB2YWwpCWJmaW5fd3JpdGUzMigoU0lDQV9JU1IwICsgKHggPDwgMikpLCB2YWwpCisKKwogI2VuZGlmCQkJCS8qIF9NQUNIX0JMQUNLRklOX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1ibGFja2Zpbi9wYWdlLmggYi9pbmNsdWRlL2FzbS1ibGFja2Zpbi9wYWdlLmgKaW5kZXggOGJjODY3MS4uYzdkYjAyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYmxhY2tmaW4vcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLWJsYWNrZmluL3BhZ2UuaApAQCAtMTEsOCArMTEsNiBAQAogI2VuZGlmCiAjZGVmaW5lIFBBR0VfTUFTSwkofihQQUdFX1NJWkUtMSkpCiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KQEAgLTQxLDYgKzM5LDcgQEAKIHR5cGVkZWYgc3RydWN0IHsKIAl1bnNpZ25lZCBsb25nIHBncHJvdDsKIH0gcGdwcm90X3Q7Cit0eXBlZGVmIHN0cnVjdCBwYWdlICpwZ3RhYmxlX3Q7CiAKICNkZWZpbmUgcHRlX3ZhbCh4KQkoKHgpLnB0ZSkKICNkZWZpbmUgcG1kX3ZhbCh4KQkoKCZ4KS0+cG1kWzBdKQpAQCAtODgsNiArODcsNSBAQAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BhZ2UuaD4KIAogI2VuZGlmCQkJCS8qIF9fQVNTRU1CTFlfXyAqLwotI2VuZGlmCQkJCS8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmCQkJCS8qIF9CTEFDS0ZJTl9QQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWJsYWNrZmluL3Bvc2l4X3R5cGVzLmggYi9pbmNsdWRlL2FzbS1ibGFja2Zpbi9wb3NpeF90eXBlcy5oCmluZGV4IGMzZmE1MGYuLjIzYWExZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWJsYWNrZmluL3Bvc2l4X3R5cGVzLmgKKysrIGIvaW5jbHVkZS9hc20tYmxhY2tmaW4vcG9zaXhfdHlwZXMuaApAQCAtMzksMTQgKzM5LDEwIEBACiAjZW5kaWYKIAogdHlwZWRlZiBzdHJ1Y3QgewotI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgZGVmaW5lZChfX1VTRV9BTEwpCiAJaW50IHZhbFsyXTsKLSNlbHNlCQkJCS8qICFkZWZpbmVkKF9fS0VSTkVMX18pICYmICFkZWZpbmVkKF9fVVNFX0FMTCkgKi8KLQlpbnQgX192YWxbMl07Ci0jZW5kaWYJCQkJLyogIWRlZmluZWQoX19LRVJORUxfXykgJiYgIWRlZmluZWQoX19VU0VfQUxMKSAqLwogfSBfX2tlcm5lbF9mc2lkX3Q7CiAKLSNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8ICFkZWZpbmVkKF9fR0xJQkNfXykgfHwgKF9fR0xJQkNfXyA8IDIpCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKQogCiAjdW5kZWYJX19GRF9TRVQKICNkZWZpbmUJX19GRF9TRVQoZCwgc2V0KQkoKHNldCktPmZkc19iaXRzW19fRkRFTFQoZCldIHw9IF9fRkRNQVNLKGQpKQpAQCAtNjAsNiArNTYsNiBAQAogI3VuZGVmCV9fRkRfWkVSTwogI2RlZmluZSBfX0ZEX1pFUk8oZmRzZXRwKSAobWVtc2V0IChmZHNldHAsIDAsIHNpemVvZigqKGZkX3NldCAqKWZkc2V0cCkpKQogCi0jZW5kaWYJCQkJLyogZGVmaW5lZChfX0tFUk5FTF9fKSB8fCAhZGVmaW5lZChfX0dMSUJDX18pIHx8IChfX0dMSUJDX18gPCAyKSAqLworI2VuZGlmCQkJCS8qIGRlZmluZWQoX19LRVJORUxfXykgKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1ibGFja2Zpbi9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLWJsYWNrZmluL3Byb2Nlc3Nvci5oCmluZGV4IGM1NzFlOTUuLjEwMzNlNWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWJsYWNrZmluL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLWJsYWNrZmluL3Byb2Nlc3Nvci5oCkBAIC0zMCw2ICszMCwxMCBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWVtb3J5X2VuZDsKICNkZWZpbmUgVEFTS19TSVpFCShtZW1vcnlfZW5kKQogCisjaWZkZWYgX19LRVJORUxfXworI2RlZmluZSBTVEFDS19UT1AJVEFTS19TSVpFCisjZW5kaWYKKwogI2RlZmluZSBUQVNLX1VOTUFQUEVEX0JBU0UJMAogCiBzdHJ1Y3QgdGhyZWFkX3N0cnVjdCB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1ibGFja2Zpbi9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLWJsYWNrZmluL3N5c3RlbS5oCmluZGV4IDRhOTI3MzcuLjUxNDk0ZWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWJsYWNrZmluL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLWJsYWNrZmluL3N5c3RlbS5oCkBAIC0xODMsNTUgKzE4MywyMCBAQAogCXJldHVybiB0bXA7CiB9CiAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jbXB4Y2hnLWxvY2FsLmg+CisKIC8qCi0gKiBBdG9taWMgY29tcGFyZSBhbmQgZXhjaGFuZ2UuICBDb21wYXJlIE9MRCB3aXRoIE1FTSwgaWYgaWRlbnRpY2FsLAotICogc3RvcmUgTkVXIGluIE1FTS4gIFJldHVybiB0aGUgaW5pdGlhbCB2YWx1ZSBpbiBNRU0uICBTdWNjZXNzIGlzCi0gKiBpbmRpY2F0ZWQgYnkgY29tcGFyaW5nIFJFVFVSTiB3aXRoIE9MRC4KKyAqIGNtcHhjaGdfbG9jYWwgYW5kIGNtcHhjaGc2NF9sb2NhbCBhcmUgYXRvbWljIHdydCBjdXJyZW50IENQVS4gQWx3YXlzIG1ha2UKKyAqIHRoZW0gYXZhaWxhYmxlLgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19jbXB4Y2hnKHZvbGF0aWxlIHZvaWQgKnB0ciwgdW5zaWduZWQgbG9uZyBvbGQsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBuZXcsIGludCBzaXplKQotewotCXVuc2lnbmVkIGxvbmcgdG1wID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKyNkZWZpbmUgY21weGNoZ19sb2NhbChwdHIsIG8sIG4pCQkJCSAgCSAgICAgICBcCisJKChfX3R5cGVvZl9fKCoocHRyKSkpX19jbXB4Y2hnX2xvY2FsX2dlbmVyaWMoKHB0ciksICh1bnNpZ25lZCBsb25nKShvKSxcCisJCQkodW5zaWduZWQgbG9uZykobiksIHNpemVvZigqKHB0cikpKSkKKyNkZWZpbmUgY21weGNoZzY0X2xvY2FsKHB0ciwgbywgbikgX19jbXB4Y2hnNjRfbG9jYWxfZ2VuZXJpYygocHRyKSwgKG8pLCAobikpCiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQlzd2l0Y2ggKHNpemUpIHsKLQljYXNlIDE6Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fCi0JCQkoIiUwID0gYiUzICh6KTtcblx0IgotCQkJICJDQyA9ICUxID09ICUwO1xuXHQiCi0JCQkgIklGICFDQyBKVU1QIDFmO1xuXHQiCi0JCQkgImIlMyA9ICUyO1xuXHQiCi0JCQkgIjE6XG5cdCIKLQkJCSA6ICI9JmQiICh0bXApIDogImQiIChvbGQpLCAiZCIgKG5ldyksICJtIiAoKl9feGcocHRyKSkgOiAibWVtb3J5Iik7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18KLQkJCSgiJTAgPSB3JTMgKHopO1xuXHQiCi0JCQkgIkNDID0gJTEgPT0gJTA7XG5cdCIKLQkJCSAiSUYgIUNDIEpVTVAgMWY7XG5cdCIKLQkJCSAidyUzID0gJTI7XG5cdCIKLQkJCSAiMTpcblx0IgotCQkJIDogIj0mZCIgKHRtcCkgOiAiZCIgKG9sZCksICJkIiAobmV3KSwgIm0iICgqX194ZyhwdHIpKSA6ICJtZW1vcnkiKTsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXwotCQkJKCIlMCA9ICUzO1xuXHQiCi0JCQkgIkNDID0gJTEgPT0gJTA7XG5cdCIKLQkJCSAiSUYgIUNDIEpVTVAgMWY7XG5cdCIKLQkJCSAiJTMgPSAlMjtcblx0IgotCQkJICIxOlxuXHQiCi0JCQkgOiAiPSZkIiAodG1wKSA6ICJkIiAob2xkKSwgImQiIChuZXcpLCAibSIgKCpfX3hnKHB0cikpIDogIm1lbW9yeSIpOwotCQlicmVhazsKLQl9Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXJldHVybiB0bXA7Ci19Ci0KLSNkZWZpbmUgY21weGNoZyhwdHIsbyxuKVwKLSAgICAgICAgKChfX3R5cGVvZl9fKCoocHRyKSkpX19jbXB4Y2hnKChwdHIpLCh1bnNpZ25lZCBsb25nKShvKSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKG4pLHNpemVvZigqKHB0cikpKSkKKyNpZm5kZWYgQ09ORklHX1NNUAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NtcHhjaGcuaD4KKyNlbmRpZgogCiAjZGVmaW5lIHByZXBhcmVfdG9fc3dpdGNoKCkgICAgIGRvIHsgfSB3aGlsZSgwKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1ibGFja2Zpbi90ZXJtaW9zLmggYi9pbmNsdWRlL2FzbS1ibGFja2Zpbi90ZXJtaW9zLmgKaW5kZXggZTMxZmU4NS4uZDUwZDA2MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYmxhY2tmaW4vdGVybWlvcy5oCisrKyBiL2luY2x1ZGUvYXNtLWJsYWNrZmluL3Rlcm1pb3MuaApAQCAtMzksMjQgKzM5LDYgQEAKIAogLyogaW9jdGwgKGZkLCBUSU9DU0VSR0VUTFNSLCAmcmVzdWx0KSB3aGVyZSByZXN1bHQgbWF5IGJlIGFzIGJlbG93ICovCiAKLS8qIGxpbmUgZGlzY2lwbGluZXMgKi8KLSNkZWZpbmUgTl9UVFkJCTAKLSNkZWZpbmUgTl9TTElQCQkxCi0jZGVmaW5lIE5fTU9VU0UJCTIKLSNkZWZpbmUgTl9QUFAJCTMKLSNkZWZpbmUgTl9TVFJJUAkJNAotI2RlZmluZSBOX0FYMjUJCTUKLSNkZWZpbmUgTl9YMjUJCTYJLyogWC4yNSBhc3luYyAqLwotI2RlZmluZSBOXzZQQUNLCQk3Ci0jZGVmaW5lIE5fTUFTQwkJOAkvKiBSZXNlcnZlZCBmb3IgTW9iaXRleCBtb2R1bGUgPGthekBjYWZlLm5ldD4gKi8KLSNkZWZpbmUgTl9SMzk2NAkJOQkvKiBSZXNlcnZlZCBmb3IgU2ltYXRpYyBSMzk2NCBtb2R1bGUgKi8KLSNkZWZpbmUgTl9QUk9GSUJVU19GREwJMTAJLyogUmVzZXJ2ZWQgZm9yIFByb2ZpYnVzIDxEYXZlQG12aGkuY29tPiAqLwotI2RlZmluZSBOX0lSREEJCTExCS8qIExpbnV4IElSIC0gaHR0cDovL2lyZGEuc291cmNlZm9yZ2UubmV0LyAqLwotI2RlZmluZSBOX1NNU0JMT0NLCTEyCS8qIFNNUyBibG9jayBtb2RlIC0gZm9yIHRhbGtpbmcgdG8gR1NNIGRhdGEgY2FyZHMgYWJvdXQgU01TIG1lc3NhZ2VzICovCi0jZGVmaW5lIE5fSERMQwkJMTMJLyogc3luY2hyb25vdXMgSERMQyAqLwotI2RlZmluZSBOX1NZTkNfUFBQCTE0CS8qIHN5bmNocm9ub3VzIFBQUCAqLwotI2RlZmluZSBOX0hDSQkJMTUJLyogQmx1ZXRvb3RoIEhDSSBVQVJUICovCi0KICNpZmRlZiBfX0tFUk5FTF9fCiAKIC8qCWludHI9XkMJCXF1aXQ9XlwJCWVyYXNlPWRlbAlraWxsPV5VCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1ibGFja2Zpbi90cmFjZS5oIGIvaW5jbHVkZS9hc20tYmxhY2tmaW4vdHJhY2UuaAppbmRleCA2MzEzYWFjLi5lZjE4YWZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1ibGFja2Zpbi90cmFjZS5oCisrKyBiL2luY2x1ZGUvYXNtLWJsYWNrZmluL3RyYWNlLmgKQEAgLTQ2LDQyICs0Niw0NyBAQAogCiAjaWZkZWYgQ09ORklHX0RFQlVHX0JGSU5fSFdUUkFDRV9PTgogCi0jZGVmaW5lIFRSQUNFX0JVRkZFUl9TVEFSVChwcmVnLCBkcmVnKSB0cmFjZV9idWZmZXJfc3RhcnQocHJlZywgZHJlZykKLSNkZWZpbmUgVFJBQ0VfQlVGRkVSX1NUT1AocHJlZywgZHJlZykgIHRyYWNlX2J1ZmZlcl9zdG9wKHByZWcsIGRyZWcpCi0KICNkZWZpbmUgdHJhY2VfYnVmZmVyX3N0b3AocHJlZywgZHJlZykJXAogCXByZWcuTCA9IExPKFRCVUZDVEwpOwkJXAogCXByZWcuSCA9IEhJKFRCVUZDVEwpOwkJXAogCWRyZWcgPSAweDE7CQkJXAogCVtwcmVnXSA9IGRyZWc7CiAKLSNkZWZpbmUgdHJhY2VfYnVmZmVyX3N0YXJ0KHByZWcsIGRyZWcpCVwKLQlwcmVnLkwgPSBMTyhUQlVGQ1RMKTsJCVwKLQlwcmVnLkggPSBISShUQlVGQ1RMKTsJCVwKLQlkcmVnID0gQkZJTl9UUkFDRV9PTjsJCVwKLQlbcHJlZ10gPSBkcmVnOwotCiAjZGVmaW5lIHRyYWNlX2J1ZmZlcl9pbml0KHByZWcsIGRyZWcpIFwKIAlwcmVnLkwgPSBMTyhUQlVGQ1RMKTsgICAgICAgICBcCiAJcHJlZy5IID0gSEkoVEJVRkNUTCk7ICAgICAgICAgXAogCWRyZWcgPSBCRklOX1RSQUNFX0lOSVQ7ICAgICAgIFwKIAlbcHJlZ10gPSBkcmVnOwogCisjZGVmaW5lIHRyYWNlX2J1ZmZlcl9zYXZlKHByZWcsIGRyZWcpIFwKKwlwcmVnLkwgPSBMTyhUQlVGQ1RMKTsgXAorCXByZWcuSCA9IEhJKFRCVUZDVEwpOyBcCisJZHJlZyA9IFtwcmVnXTsgXAorCVtzcCsrXSA9IGRyZWc7IFwKKwlkcmVnID0gMHgxOyBcCisJW3ByZWddID0gZHJlZzsKKworI2RlZmluZSB0cmFjZV9idWZmZXJfcmVzdG9yZShwcmVnLCBkcmVnKSBcCisJcHJlZy5MID0gTE8oVEJVRkNUTCk7IFwKKwlwcmVnLkggPSBISShUQlVGQ1RMKTsgXAorCWRyZWcgPSBbc3AtLV07IFwKKwlbcHJlZ10gPSBkcmVnOworCiAjZWxzZSAvKiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX09OICovCiAKICNkZWZpbmUgdHJhY2VfYnVmZmVyX3N0b3AocHJlZywgZHJlZykKLSNkZWZpbmUgdHJhY2VfYnVmZmVyX3N0YXJ0KHByZWcsIGRyZWcpCiAjZGVmaW5lIHRyYWNlX2J1ZmZlcl9pbml0KHByZWcsIGRyZWcpCisjZGVmaW5lIHRyYWNlX2J1ZmZlcl9zYXZlKHByZWcsIGRyZWcpCisjZGVmaW5lIHRyYWNlX2J1ZmZlcl9yZXN0b3JlKHByZWcsIGRyZWcpCiAKICNlbmRpZiAvKiBDT05GSUdfREVCVUdfQkZJTl9IV1RSQUNFX09OICovCiAKICNpZmRlZiBDT05GSUdfREVCVUdfQkZJTl9OT19LRVJOX0hXVFJBQ0UKLSMgZGVmaW5lIERFQlVHX1NUQVJUX0hXVFJBQ0UocHJlZywgZHJlZykgdHJhY2VfYnVmZmVyX3N0YXJ0KHByZWcsIGRyZWcpCi0jIGRlZmluZSBERUJVR19TVE9QX0hXVFJBQ0UocHJlZywgZHJlZykgdHJhY2VfYnVmZmVyX3N0b3AocHJlZywgZHJlZykKLQorIyBkZWZpbmUgREVCVUdfSFdUUkFDRV9TQVZFKHByZWcsIGRyZWcpICAgIHRyYWNlX2J1ZmZlcl9zYXZlKHByZWcsIGRyZWcpCisjIGRlZmluZSBERUJVR19IV1RSQUNFX1JFU1RPUkUocHJlZywgZHJlZykgdHJhY2VfYnVmZmVyX3Jlc3RvcmUocHJlZywgZHJlZykKICNlbHNlCi0jIGRlZmluZSBERUJVR19TVEFSVF9IV1RSQUNFKHByZWcsIGRyZWcpCi0jIGRlZmluZSBERUJVR19TVE9QX0hXVFJBQ0UocHJlZywgZHJlZykKKyMgZGVmaW5lIERFQlVHX0hXVFJBQ0VfU0FWRShwcmVnLCBkcmVnKQorIyBkZWZpbmUgREVCVUdfSFdUUkFDRV9SRVNUT1JFKHByZWcsIGRyZWcpCiAjZW5kaWYKIAogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYmxhY2tmaW4vdXNlci5oIGIvaW5jbHVkZS9hc20tYmxhY2tmaW4vdXNlci5oCmluZGV4IGFiYzM0NjIuLmFmZTZhMGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWJsYWNrZmluL3VzZXIuaAorKysgYi9pbmNsdWRlL2FzbS1ibGFja2Zpbi91c2VyLmgKQEAgLTc1LDcgKzc1LDcgQEAKIAkJCQkJICAgZXNwIHJlZ2lzdGVyLiAgKi8KIAlsb25nIGludCBzaWduYWw7CS8qIFNpZ25hbCB0aGF0IGNhdXNlZCB0aGUgY29yZSBkdW1wLiAqLwogCWludCByZXNlcnZlZDsJCS8qIE5vIGxvbmdlciB1c2VkICovCi0Jc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QgKnVfYXIwOworCXVuc2lnbmVkIGxvbmcgdV9hcjA7CiAJLyogVXNlZCBieSBnZGIgdG8gaGVscCBmaW5kIHRoZSB2YWx1ZXMgZm9yICovCiAJLyogdGhlIHJlZ2lzdGVycy4gKi8KIAl1bnNpZ25lZCBsb25nIG1hZ2ljOwkvKiBUbyB1bmlxdWVseSBpZGVudGlmeSBhIGNvcmUgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9LYnVpbGQgYi9pbmNsdWRlL2FzbS1jcmlzL0tidWlsZAppbmRleCAxNDQ5OGQ1Li4xNzQ1NTQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL0tidWlsZAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL0tidWlsZApAQCAtMSw1ICsxLDExIEBACiBpbmNsdWRlIGluY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkLmFzbQogCi1oZWFkZXIteSArPSBhcmNoLXYxMC8gYXJjaC12MzIvCitoZWFkZXItJChDT05GSUdfRVRSQVhfQVJDSF9WMTApICs9IGFyY2gtdjEwLworaGVhZGVyLSQoQ09ORklHX0VUUkFYX0FSQ0hfVjMyKSArPSBhcmNoLXYzMi8KIAoraGVhZGVyLXkgKz0gZXRoZXJuZXQuaAoraGVhZGVyLXkgKz0gcnRjLmgKK2hlYWRlci15ICs9IHN5bmNfc2VyaWFsLmgKKwordW5pZmRlZi15ICs9IGV0cmF4Z3Bpby5oCiB1bmlmZGVmLXkgKz0gcnM0ODUuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hLm91dC5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hLm91dC5oCmluZGV4IDkxOWIzNGEuLmM4MmU5ZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvYS5vdXQuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2Eub3V0LmgKQEAgLTYsMTEgKzYsNiBAQAogICogd2FudHMgdG8ga25vdyBhYm91dCBhLm91dCBldmVuIGlmIHRoZXJlIGlzIG5vIGludGVycHJldGVyIGF2YWlsYWJsZS4uLgogICovCiAKLS8qIGdyYWJiZWQgZnJvbSB0aGUgaW50ZWwgc3R1ZmYgICovICAgCi0jZGVmaW5lIFNUQUNLX1RPUCBUQVNLX1NJWkUKLSNkZWZpbmUgU1RBQ0tfVE9QX01BWAlTVEFDS19UT1AKLQotCiBzdHJ1Y3QgZXhlYwogewogICB1bnNpZ25lZCBsb25nIGFfaW5mbzsJCS8qIFVzZSBtYWNyb3MgTl9NQUdJQywgZXRjIGZvciBhY2Nlc3MgKi8KQEAgLTI4LDUgKzIzLDQgQEAKICNkZWZpbmUgTl9EUlNJWkUoYSkJKChhKS5hX2Ryc2l6ZSkKICNkZWZpbmUgTl9TWU1TSVpFKGEpCSgoYSkuYV9zeW1zKQogCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYxMC9LYnVpbGQgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjEwL0tidWlsZAppbmRleCBkN2YyN2RjLi42MGU3ZTFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjEwL0tidWlsZAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjEwL0tidWlsZApAQCAtMSwyICsxLDUgQEAKIGhlYWRlci15ICs9IHB0cmFjZS5oCiBoZWFkZXIteSArPSB1c2VyLmgKK2hlYWRlci15ICs9IHN2aW50by5oCitoZWFkZXIteSArPSBzdl9hZGRyX2FnLmgKK2hlYWRlci15ICs9IHN2X2FkZHIuYWdoCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjEwL2J1Zy5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYxMC9idWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDg1ZDZiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYxMC9idWcuaApAQCAtMCwwICsxLDY2IEBACisjaWZuZGVmIF9fQVNNX0NSSVN2MTBfQVJDSF9CVUdfSAorI2RlZmluZSBfX0FTTV9DUklTdjEwX0FSQ0hfQlVHX0gKKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorCisjaWZkZWYgQ09ORklHX0JVRworI2lmZGVmIENPTkZJR19ERUJVR19CVUdWRVJCT1NFCisvKiBUaGUgQlVHKCkgbWFjcm8gaXMgdXNlZCBmb3IgbWFya2luZyBvYnZpb3VzbHkgaW5jb3JyZWN0IGNvZGUgcGF0aHMuCisgKiBJdCB3aWxsIGNhdXNlIGEgbWVzc2FnZSB3aXRoIHRoZSBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIHRvIGJlIHByaW50ZWQsCisgKiBhbmQgdGhlbiBjYXVzZSBhbiBvb3BzLiAgVGhlIG1lc3NhZ2UgaXMgYWN0dWFsbHkgcHJpbnRlZCBieSBoYW5kbGVfQlVHKCkKKyAqIGluIGFyY2gvY3Jpcy9rZXJuZWwvdHJhcHMuYywgYW5kIHRoZSByZWFzb24gd2UgdXNlIHRoaXMgbWV0aG9kIG9mIHN0b3JpbmcKKyAqIHRoZSBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGlzIHRoYXQgd2UgZG8gbm90IHdhbnQgdG8gYWZmZWN0IHRoZSByZWdpc3RlcnMKKyAqIGJ5IGNhbGxpbmcgcHJpbnRrKCkgYmVmb3JlIGNhdXNpbmcgdGhlIG9vcHMuCisgKi8KKworI2RlZmluZSBCVUdfUFJFRklYIDB4MEQ3RgorI2RlZmluZSBCVUdfTUFHSUMgIDB4MDAwMDEyMzQKKworc3RydWN0IGJ1Z19mcmFtZSB7CisJdW5zaWduZWQgc2hvcnQgcHJlZml4OworCXVuc2lnbmVkIGludCBtYWdpYzsKKwl1bnNpZ25lZCBzaG9ydCBjbGVhcjsKKwl1bnNpZ25lZCBzaG9ydCBtb3Z1OworCXVuc2lnbmVkIHNob3J0IGxpbmU7CisJdW5zaWduZWQgc2hvcnQganVtcDsKKwl1bnNpZ25lZCBjaGFyICpmaWxlbmFtZTsKK307CisKKyNpZiAwCisvKiBVbmZvcnR1bmF0ZWx5IHRoaXMgdmVyc2lvbiBvZiB0aGUgbWFjcm8gZG9lcyBub3Qgd29yayBkdWUgdG8gYSBwcm9ibGVtCisgKiB3aXRoIHRoZSBjb21waWxlciAoYWthIGEgYnVnKSB3aGVuIGNvbXBpbGluZyB3aXRoIC1PMiwgd2hpY2ggc29tZXRpbWVzCisgKiBlcnJvbmVvdXNseSBjYXVzZXMgdGhlIHNlY29uZCBpbnB1dCB0byBiZSBzdG9yZWQgaW4gYSByZWdpc3Rlci4uLgorICovCisjZGVmaW5lIEJVRygpCQkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJjbGVhci5kIFsiIF9fc3RyaW5naWZ5KEJVR19NQUdJQykgIl1cblx0IlwKKwkJCQkibW92dS53ICUwLCRyMFxuXHQiCQkJXAorCQkJCSJqdW1wICUxXG5cdCIJCQkJXAorCQkJCTogOiAiaSIgKF9fTElORV9fKSwgImkiIChfX0ZJTEVfXykpCisjZWxzZQorLyogVGhpcyB2ZXJzaW9uIHdpbGwgaGF2ZSB0byBkbyBmb3Igbm93LCB1bnRpbCB0aGUgY29tcGlsZXIgaXMgZml4ZWQuCisgKiBUaGUgZHJhd2JhY2tzIG9mIHRoaXMgdmVyc2lvbiBhcmUgdGhhdCB0aGUgZmlsZSBuYW1lIHdpbGwgYXBwZWFyIG11bHRpcGxlCisgKiB0aW1lcyBpbiB0aGUgLnJvZGF0YSBzZWN0aW9uLCBhbmQgdGhhdCBfX0xJTkVfXyBhbmQgX19GSUxFX18gY2FuIHByb2JhYmx5CisgKiBub3QgYmUgdXNlZCBsaWtlIHRoaXMgd2l0aCBuZXdlciB2ZXJzaW9ucyBvZiBnY2MuCisgKi8KKyNkZWZpbmUgQlVHKCkJCQkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImNsZWFyLmQgWyIgX19zdHJpbmdpZnkoQlVHX01BR0lDKSAiXVxuXHQiXAorCQkJICAgICAgIm1vdnUudyAiIF9fc3RyaW5naWZ5KF9fTElORV9fKSAiLCRyMFxuXHQiXAorCQkJICAgICAgImp1bXAgMGZcblx0IgkJCQlcCisJCQkgICAgICAiLnNlY3Rpb24gLnJvZGF0YVxuIgkJCVwKKwkJCSAgICAgICIwOlx0LnN0cmluZyBcIiIgX19GSUxFX18gIlwiXG5cdCIJXAorCQkJICAgICAgIi5wcmV2aW91cyIpCisjZW5kaWYKKworI2Vsc2UKKworLyogVGhpcyBqdXN0IGNhdXNlcyBhbiBvb3BzLiAqLworI2RlZmluZSBCVUcoKSAoKihpbnQgKikwID0gMCkKKworI2VuZGlmCisKKyNkZWZpbmUgSEFWRV9BUkNIX0JVRworI2VuZGlmCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9idWcuaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjEwL2lvLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjEwL2lvLmgKaW5kZXggMTFlZjViNS4uYzA4YzI0MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYxMC9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MTAvaW8uaApAQCAtMjMsNyArMjMsNyBAQAogZXh0ZXJuIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnBvcnRfY3NwMF9hZGRyOwogZXh0ZXJuIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnBvcnRfY3NwNF9hZGRyOwogCi0vKiBtYWNybyBmb3Igc2V0dGluZyByZWdzIHRocm91Z2ggYSBzaGFkb3cgLSAKKy8qIG1hY3JvIGZvciBzZXR0aW5nIHJlZ3MgdGhyb3VnaCBhIHNoYWRvdyAtCiAgKiByID0gcmVnaXN0ZXIgbmFtZSAobGlrZSBSX1BPUlRfUEFfREFUQSkKICAqIHMgPSBzaGFkb3cgbmFtZSAobGlrZSBwb3J0X3BhX2RhdGFfc2hhZG93KQogICogYiA9IGJpdCBudW1iZXIKQEAgLTM4LDgzICszOCw4OSBAQAogI3VuZGVmIENPTkZJR19FVFJBWF9QQV9MRURTCiAjdW5kZWYgQ09ORklHX0VUUkFYX1BCX0xFRFMKICN1bmRlZiBDT05GSUdfRVRSQVhfQ1NQMF9MRURTCi0jZGVmaW5lIExFRF9ORVRXT1JLX1NFVF9HKHgpCi0jZGVmaW5lIExFRF9ORVRXT1JLX1NFVF9SKHgpCi0jZGVmaW5lIExFRF9BQ1RJVkVfU0VUX0coeCkKLSNkZWZpbmUgTEVEX0FDVElWRV9TRVRfUih4KQotI2RlZmluZSBMRURfRElTS19XUklURSh4KQotI2RlZmluZSBMRURfRElTS19SRUFEKHgpCisjZGVmaW5lIENSSVNfTEVEX05FVFdPUktfU0VUX0coeCkKKyNkZWZpbmUgQ1JJU19MRURfTkVUV09SS19TRVRfUih4KQorI2RlZmluZSBDUklTX0xFRF9BQ1RJVkVfU0VUX0coeCkKKyNkZWZpbmUgQ1JJU19MRURfQUNUSVZFX1NFVF9SKHgpCisjZGVmaW5lIENSSVNfTEVEX0RJU0tfV1JJVEUoeCkKKyNkZWZpbmUgQ1JJU19MRURfRElTS19SRUFEKHgpCiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKENPTkZJR19FVFJBWF9DU1AwX0xFRFMpCi0jZGVmaW5lIExFRF9CSVRfU0VUKHgpCi0jZGVmaW5lIExFRF9CSVRfQ0xSKHgpCisjZGVmaW5lIENSSVNfTEVEX0JJVF9TRVQoeCkKKyNkZWZpbmUgQ1JJU19MRURfQklUX0NMUih4KQogI2VuZGlmCiAKLSNkZWZpbmUgTEVEX09GRiAgICAweDAwCi0jZGVmaW5lIExFRF9HUkVFTiAgMHgwMQotI2RlZmluZSBMRURfUkVEICAgIDB4MDIKLSNkZWZpbmUgTEVEX09SQU5HRSAoTEVEX0dSRUVOIHwgTEVEX1JFRCkKKyNkZWZpbmUgQ1JJU19MRURfT0ZGICAgIDB4MDAKKyNkZWZpbmUgQ1JJU19MRURfR1JFRU4gIDB4MDEKKyNkZWZpbmUgQ1JJU19MRURfUkVEICAgIDB4MDIKKyNkZWZpbmUgQ1JJU19MRURfT1JBTkdFIChDUklTX0xFRF9HUkVFTiB8IENSSVNfTEVEX1JFRCkKIAotI2lmIENPTkZJR19FVFJBWF9MRUQxRyA9PSBDT05GSUdfRVRSQVhfTEVEMVIgCi0jZGVmaW5lIExFRF9ORVRXT1JLX1NFVCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2lmIGRlZmluZWQoQ09ORklHX0VUUkFYX05PX0xFRFMpCisjZGVmaW5lIENSSVNfTEVEX05FVFdPUktfU0VUKHgpCisjZWxzZQorI2lmIENPTkZJR19FVFJBWF9MRUQxRyA9PSBDT05GSUdfRVRSQVhfTEVEMVIKKyNkZWZpbmUgQ1JJU19MRURfTkVUV09SS19TRVQoeCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAlkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJTEVEX05FVFdPUktfU0VUX0coKHgpICYgTEVEX0dSRUVOKTsgXAorCQlDUklTX0xFRF9ORVRXT1JLX1NFVF9HKCh4KSAmIENSSVNfTEVEX0dSRUVOKTsgXAogCX0gd2hpbGUgKDApCiAjZWxzZQotI2RlZmluZSBMRURfTkVUV09SS19TRVQoeCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgQ1JJU19MRURfTkVUV09SS19TRVQoeCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAlkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJTEVEX05FVFdPUktfU0VUX0coKHgpICYgTEVEX0dSRUVOKTsgXAotCQlMRURfTkVUV09SS19TRVRfUigoeCkgJiBMRURfUkVEKTsgICBcCisJCUNSSVNfTEVEX05FVFdPUktfU0VUX0coKHgpICYgQ1JJU19MRURfR1JFRU4pOyBcCisJCUNSSVNfTEVEX05FVFdPUktfU0VUX1IoKHgpICYgQ1JJU19MRURfUkVEKTsgICBcCiAJfSB3aGlsZSAoMCkKICNlbmRpZgotI2lmIENPTkZJR19FVFJBWF9MRUQyRyA9PSBDT05GSUdfRVRSQVhfTEVEMlIgCi0jZGVmaW5lIExFRF9BQ1RJVkVfU0VUKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2lmIENPTkZJR19FVFJBWF9MRUQyRyA9PSBDT05GSUdfRVRSQVhfTEVEMlIKKyNkZWZpbmUgQ1JJU19MRURfQUNUSVZFX1NFVCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAlkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJTEVEX0FDVElWRV9TRVRfRygoeCkgJiBMRURfR1JFRU4pOyAgXAorCQlDUklTX0xFRF9BQ1RJVkVfU0VUX0coKHgpICYgQ1JJU19MRURfR1JFRU4pOyAgXAogCX0gd2hpbGUgKDApCiAjZWxzZQotI2RlZmluZSBMRURfQUNUSVZFX1NFVCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgQ1JJU19MRURfQUNUSVZFX1NFVCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAlkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJTEVEX0FDVElWRV9TRVRfRygoeCkgJiBMRURfR1JFRU4pOyAgXAotCQlMRURfQUNUSVZFX1NFVF9SKCh4KSAmIExFRF9SRUQpOyAgICBcCisJCUNSSVNfTEVEX0FDVElWRV9TRVRfRygoeCkgJiBDUklTX0xFRF9HUkVFTik7ICBcCisJCUNSSVNfTEVEX0FDVElWRV9TRVRfUigoeCkgJiBDUklTX0xFRF9SRUQpOyAgICBcCiAJfSB3aGlsZSAoMCkKICNlbmRpZgorI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfRVRSQVhfUEFfTEVEUwotI2RlZmluZSBMRURfTkVUV09SS19TRVRfRyh4KSBcCisjZGVmaW5lIENSSVNfTEVEX05FVFdPUktfU0VUX0coeCkgXAogICAgICAgICAgUkVHX1NIQURPV19TRVQoUl9QT1JUX1BBX0RBVEEsIHBvcnRfcGFfZGF0YV9zaGFkb3csIENPTkZJR19FVFJBWF9MRUQxRywgISh4KSkKLSNkZWZpbmUgTEVEX05FVFdPUktfU0VUX1IoeCkgXAorI2RlZmluZSBDUklTX0xFRF9ORVRXT1JLX1NFVF9SKHgpIFwKICAgICAgICAgIFJFR19TSEFET1dfU0VUKFJfUE9SVF9QQV9EQVRBLCBwb3J0X3BhX2RhdGFfc2hhZG93LCBDT05GSUdfRVRSQVhfTEVEMVIsICEoeCkpCi0jZGVmaW5lIExFRF9BQ1RJVkVfU0VUX0coeCkgXAorI2RlZmluZSBDUklTX0xFRF9BQ1RJVkVfU0VUX0coeCkgXAogICAgICAgICAgUkVHX1NIQURPV19TRVQoUl9QT1JUX1BBX0RBVEEsIHBvcnRfcGFfZGF0YV9zaGFkb3csIENPTkZJR19FVFJBWF9MRUQyRywgISh4KSkKLSNkZWZpbmUgTEVEX0FDVElWRV9TRVRfUih4KSBcCisjZGVmaW5lIENSSVNfTEVEX0FDVElWRV9TRVRfUih4KSBcCiAgICAgICAgICBSRUdfU0hBRE9XX1NFVChSX1BPUlRfUEFfREFUQSwgcG9ydF9wYV9kYXRhX3NoYWRvdywgQ09ORklHX0VUUkFYX0xFRDJSLCAhKHgpKQotI2RlZmluZSBMRURfRElTS19XUklURSh4KSBcCisjZGVmaW5lIENSSVNfTEVEX0RJU0tfV1JJVEUoeCkgXAogICAgICAgICAgZG97XAogICAgICAgICAgICAgICAgIFJFR19TSEFET1dfU0VUKFJfUE9SVF9QQV9EQVRBLCBwb3J0X3BhX2RhdGFfc2hhZG93LCBDT05GSUdfRVRSQVhfTEVEM0csICEoeCkpO1wKICAgICAgICAgICAgICAgICBSRUdfU0hBRE9XX1NFVChSX1BPUlRfUEFfREFUQSwgcG9ydF9wYV9kYXRhX3NoYWRvdywgQ09ORklHX0VUUkFYX0xFRDNSLCAhKHgpKTtcCiAgICAgICAgIH13aGlsZSgwKQotI2RlZmluZSBMRURfRElTS19SRUFEKHgpIFwKLSAgICAgICAgIFJFR19TSEFET1dfU0VUKFJfUE9SVF9QQV9EQVRBLCBwb3J0X3BhX2RhdGFfc2hhZG93LCBDT05GSUdfRVRSQVhfTEVEM0csICEoeCkpIAorI2RlZmluZSBDUklTX0xFRF9ESVNLX1JFQUQoeCkgXAorCVJFR19TSEFET1dfU0VUKFJfUE9SVF9QQV9EQVRBLCBwb3J0X3BhX2RhdGFfc2hhZG93LCBcCisJCUNPTkZJR19FVFJBWF9MRUQzRywgISh4KSkKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0VUUkFYX1BCX0xFRFMKLSNkZWZpbmUgTEVEX05FVFdPUktfU0VUX0coeCkgXAorI2RlZmluZSBDUklTX0xFRF9ORVRXT1JLX1NFVF9HKHgpIFwKICAgICAgICAgIFJFR19TSEFET1dfU0VUKFJfUE9SVF9QQl9EQVRBLCBwb3J0X3BiX2RhdGFfc2hhZG93LCBDT05GSUdfRVRSQVhfTEVEMUcsICEoeCkpCi0jZGVmaW5lIExFRF9ORVRXT1JLX1NFVF9SKHgpIFwKKyNkZWZpbmUgQ1JJU19MRURfTkVUV09SS19TRVRfUih4KSBcCiAgICAgICAgICBSRUdfU0hBRE9XX1NFVChSX1BPUlRfUEJfREFUQSwgcG9ydF9wYl9kYXRhX3NoYWRvdywgQ09ORklHX0VUUkFYX0xFRDFSLCAhKHgpKQotI2RlZmluZSBMRURfQUNUSVZFX1NFVF9HKHgpIFwKKyNkZWZpbmUgQ1JJU19MRURfQUNUSVZFX1NFVF9HKHgpIFwKICAgICAgICAgIFJFR19TSEFET1dfU0VUKFJfUE9SVF9QQl9EQVRBLCBwb3J0X3BiX2RhdGFfc2hhZG93LCBDT05GSUdfRVRSQVhfTEVEMkcsICEoeCkpCi0jZGVmaW5lIExFRF9BQ1RJVkVfU0VUX1IoeCkgXAorI2RlZmluZSBDUklTX0xFRF9BQ1RJVkVfU0VUX1IoeCkgXAogICAgICAgICAgUkVHX1NIQURPV19TRVQoUl9QT1JUX1BCX0RBVEEsIHBvcnRfcGJfZGF0YV9zaGFkb3csIENPTkZJR19FVFJBWF9MRUQyUiwgISh4KSkKLSNkZWZpbmUgTEVEX0RJU0tfV1JJVEUoeCkgXAorI2RlZmluZSBDUklTX0xFRF9ESVNLX1dSSVRFKHgpIFwKICAgICAgICAgZG97XAogICAgICAgICAgICAgICAgIFJFR19TSEFET1dfU0VUKFJfUE9SVF9QQl9EQVRBLCBwb3J0X3BiX2RhdGFfc2hhZG93LCBDT05GSUdfRVRSQVhfTEVEM0csICEoeCkpO1wKICAgICAgICAgICAgICAgICBSRUdfU0hBRE9XX1NFVChSX1BPUlRfUEJfREFUQSwgcG9ydF9wYl9kYXRhX3NoYWRvdywgQ09ORklHX0VUUkFYX0xFRDNSLCAhKHgpKTtcCiAgICAgICAgIH13aGlsZSgwKQotI2RlZmluZSBMRURfRElTS19SRUFEKHgpIFwKLSAgICAgICAgIFJFR19TSEFET1dfU0VUKFJfUE9SVF9QQl9EQVRBLCBwb3J0X3BiX2RhdGFfc2hhZG93LCBDT05GSUdfRVRSQVhfTEVEM0csICEoeCkpICAgICAKKyNkZWZpbmUgQ1JJU19MRURfRElTS19SRUFEKHgpIFwKKwlSRUdfU0hBRE9XX1NFVChSX1BPUlRfUEJfREFUQSwgcG9ydF9wYl9kYXRhX3NoYWRvdywgXAorCQlDT05GSUdfRVRSQVhfTEVEM0csICEoeCkpCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19FVFJBWF9DU1AwX0xFRFMKQEAgLTEzMCwyNyArMTM2LDI3IEBACiAgICAgICAgICAoMSA8PCBDT05GSUdfRVRSQVhfTEVEMTBZICkgfCgxIDw8IENPTkZJR19FVFJBWF9MRUQxMVkgKXxcCiAgICAgICAgICAoMSA8PCBDT05GSUdfRVRSQVhfTEVEMTJSICkpCiAKLSNkZWZpbmUgTEVEX05FVFdPUktfU0VUX0coeCkgXAorI2RlZmluZSBDUklTX0xFRF9ORVRXT1JLX1NFVF9HKHgpIFwKICAgICAgICAgIFJFR19TSEFET1dfU0VUKHBvcnRfY3NwMF9hZGRyLCBwb3J0X2NzcDBfc2hhZG93LCBDT05GSUdfRVRSQVhfTEVEMUcsICEoeCkpCi0jZGVmaW5lIExFRF9ORVRXT1JLX1NFVF9SKHgpIFwKKyNkZWZpbmUgQ1JJU19MRURfTkVUV09SS19TRVRfUih4KSBcCiAgICAgICAgICBSRUdfU0hBRE9XX1NFVChwb3J0X2NzcDBfYWRkciwgcG9ydF9jc3AwX3NoYWRvdywgQ09ORklHX0VUUkFYX0xFRDFSLCAhKHgpKQotI2RlZmluZSBMRURfQUNUSVZFX1NFVF9HKHgpIFwKKyNkZWZpbmUgQ1JJU19MRURfQUNUSVZFX1NFVF9HKHgpIFwKICAgICAgICAgIFJFR19TSEFET1dfU0VUKHBvcnRfY3NwMF9hZGRyLCBwb3J0X2NzcDBfc2hhZG93LCBDT05GSUdfRVRSQVhfTEVEMkcsICEoeCkpCi0jZGVmaW5lIExFRF9BQ1RJVkVfU0VUX1IoeCkgXAorI2RlZmluZSBDUklTX0xFRF9BQ1RJVkVfU0VUX1IoeCkgXAogICAgICAgICAgUkVHX1NIQURPV19TRVQocG9ydF9jc3AwX2FkZHIsIHBvcnRfY3NwMF9zaGFkb3csIENPTkZJR19FVFJBWF9MRUQyUiwgISh4KSkKLSNkZWZpbmUgTEVEX0RJU0tfV1JJVEUoeCkgXAorI2RlZmluZSBDUklTX0xFRF9ESVNLX1dSSVRFKHgpIFwKICAgICAgICAgZG97XAogICAgICAgICAgICAgICAgIFJFR19TSEFET1dfU0VUKHBvcnRfY3NwMF9hZGRyLCBwb3J0X2NzcDBfc2hhZG93LCBDT05GSUdfRVRSQVhfTEVEM0csICEoeCkpO1wKICAgICAgICAgICAgICAgICBSRUdfU0hBRE9XX1NFVChwb3J0X2NzcDBfYWRkciwgcG9ydF9jc3AwX3NoYWRvdywgQ09ORklHX0VUUkFYX0xFRDNSLCAhKHgpKTtcCiAgICAgICAgIH13aGlsZSgwKQotI2RlZmluZSBMRURfRElTS19SRUFEKHgpIFwKKyNkZWZpbmUgQ1JJU19MRURfRElTS19SRUFEKHgpIFwKICAgICAgICAgIFJFR19TSEFET1dfU0VUKHBvcnRfY3NwMF9hZGRyLCBwb3J0X2NzcDBfc2hhZG93LCBDT05GSUdfRVRSQVhfTEVEM0csICEoeCkpCi0jZGVmaW5lIExFRF9CSVRfU0VUKHgpXAorI2RlZmluZSBDUklTX0xFRF9CSVRfU0VUKHgpXAogICAgICAgICBkb3tcCiAgICAgICAgICAgICAgICAgaWYoKCggMSA8PCB4KSAmIENPTkZJR1VSQUJMRV9MRURTKSAgIT0gMClcCiAgICAgICAgICAgICAgICAgICAgICAgIFJFR19TSEFET1dfU0VUKHBvcnRfY3NwMF9hZGRyLCBwb3J0X2NzcDBfc2hhZG93LCB4LCAxKTtcCiAgICAgICAgIH13aGlsZSgwKQotI2RlZmluZSBMRURfQklUX0NMUih4KVwKKyNkZWZpbmUgQ1JJU19MRURfQklUX0NMUih4KVwKICAgICAgICAgZG97XAogICAgICAgICAgICAgICAgIGlmKCgoIDEgPDwgeCkgJiBDT05GSUdVUkFCTEVfTEVEUykgICE9IDApXAogICAgICAgICAgICAgICAgICAgICAgICBSRUdfU0hBRE9XX1NFVChwb3J0X2NzcDBfYWRkciwgcG9ydF9jc3AwX3NoYWRvdywgeCwgMCk7XApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYxMC9wYWdlLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjEwL3BhZ2UuaAppbmRleCA3ZDgzMDdhLi5mZmFmYzk5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjEwL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjEwL3BhZ2UuaApAQCAtMTIsOCArMTIsOCBAQAogI2VuZGlmCiAKIC8qIG1hY3JvcyB0byBjb252ZXJ0IGJldHdlZW4gcmVhbGx5IHBoeXNpY2FsIGFuZCB2aXJ0dWFsIGFkZHJlc3NlcwotICogYnkgc3RyaXBwaW5nIGEgc2VsZWN0ZWQgYml0LCB3ZSBjYW4gY29udmVydCBiZXR3ZWVuIEtTRUdfeCBhbmQgMHg0MDAwMDAwMCB3aGVyZQotICogdGhlIERSQU0gcmVhbGx5IHJlc2lkZXMKKyAqIGJ5IHN0cmlwcGluZyBhIHNlbGVjdGVkIGJpdCwgd2UgY2FuIGNvbnZlcnQgYmV0d2VlbiBLU0VHX3ggYW5kCisgKiAweDQwMDAwMDAwIHdoZXJlIHRoZSBEUkFNIHJlYWxseSByZXNpZGVzCiAgKi8KIAogI2lmZGVmIENPTkZJR19DUklTX0xPV19NQVAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvS2J1aWxkIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9LYnVpbGQKaW5kZXggZDdmMjdkYy4uYTBlYzU0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9LYnVpbGQKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9LYnVpbGQKQEAgLTEsMiArMSwzIEBACiBoZWFkZXIteSArPSBwdHJhY2UuaAogaGVhZGVyLXkgKz0gdXNlci5oCitoZWFkZXIteSArPSBjcnlwdG9jb3AuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvYXRvbWljLmgKaW5kZXggYmJmYjdhNS4uODUyY2VmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9hdG9taWMuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL2F0b21pYy5oCkBAIC0xLDcgKzEsNyBAQAogI2lmbmRlZiBfX0FTTV9DUklTX0FSQ0hfQVRPTUlDX18KICNkZWZpbmUgX19BU01fQ1JJU19BUkNIX0FUT01JQ19fCiAKLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2tfdHlwZXMuaD4KIAogZXh0ZXJuIHZvaWQgY3Jpc19zcGluX3VubG9jayh2b2lkICpsLCBpbnQgdmFsKTsKIGV4dGVybiB2b2lkIGNyaXNfc3Bpbl9sb2NrKHZvaWQgKmwpOwpAQCAtMTgsMTUgKzE4LDE1IEBACiAKICNkZWZpbmUgY3Jpc19hdG9taWNfc2F2ZShhZGRyLCBmbGFncykgXAogICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7IFwKLSAgY3Jpc19zcGluX2xvY2soKHZvaWQqKSZjcmlzX2F0b21pY19sb2Nrc1tIQVNIX0FERFIoYWRkcildLmxvY2spOworICBjcmlzX3NwaW5fbG9jaygodm9pZCAqKSZjcmlzX2F0b21pY19sb2Nrc1tIQVNIX0FERFIoYWRkcildLnJhd19sb2NrLnNsb2NrKTsKIAogI2RlZmluZSBjcmlzX2F0b21pY19yZXN0b3JlKGFkZHIsIGZsYWdzKSBcCiAgIHsgXAogICAgIHNwaW5sb2NrX3QgKmxvY2sgPSAodm9pZCopJmNyaXNfYXRvbWljX2xvY2tzW0hBU0hfQUREUihhZGRyKV07IFwKICAgICBfX2FzbV9fIHZvbGF0aWxlICgibW92ZS5kICUxLCUwIiBcCi0JICAgICAgICAgICAgICAgICAgOiAiPW0iIChsb2NrLT5sb2NrKSBcCi0JCQkgIDogInIiICgxKSBcCi0JCQkgIDogIm1lbW9yeSIpOyBcCisJCQk6ICI9bSIgKGxvY2stPnJhd19sb2NrLnNsb2NrKSBcCisJCQk6ICJyIiAoMSkgXAorCQkJOiAibWVtb3J5Iik7IFwKICAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IFwKICAgfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL2J1Zy5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9idWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjIxMWUxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9idWcuaApAQCAtMCwwICsxLDMzIEBACisjaWZuZGVmIF9fQVNNX0NSSVN2MzJfQVJDSF9CVUdfSAorI2RlZmluZSBfX0FTTV9DUklTdjMyX0FSQ0hfQlVHX0gKKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorCisjaWZkZWYgQ09ORklHX0JVRworI2lmZGVmIENPTkZJR19ERUJVR19CVUdWRVJCT1NFCisvKgorICogVGhlIHBlbmFsdHkgZm9yIHRoZSBpbi1iYW5kIGNvZGUgcGF0aCB3aWxsIGJlIHRoZSBzaXplIG9mIGJyZWFrIDE0LgorICogQWxsIG90aGVyIHN0dWZmIGlzIGRvbmUgb3V0LW9mLWJhbmQgd2l0aCBleGNlcHRpb24gaGFuZGxlcnMuCisgKi8KKyNkZWZpbmUgQlVHKCkJCQkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIjA6IGJyZWFrIDE0XG5cdCIJCQkJXAorCQkJICAgICAgIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIJCVwKKwkJCSAgICAgICIxOlxuXHQiCQkJCQlcCisJCQkgICAgICAibW92ZS5kICUwLCAkcjEwXG5cdCIJCQlcCisJCQkgICAgICAibW92ZS5kICUxLCAkcjExXG5cdCIJCQlcCisJCQkgICAgICAianVtcCBkb19CVUdcblx0IgkJCQlcCisJCQkgICAgICAibm9wXG5cdCIJCQkJCVwKKwkJCSAgICAgICIucHJldmlvdXNcblx0IgkJCQlcCisJCQkgICAgICAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuXHQiCQlcCisJCQkgICAgICAiLmR3b3JkIDBiLCAxYlxuXHQiCQkJXAorCQkJICAgICAgIi5wcmV2aW91c1xuXHQiCQkJCVwKKwkJCSAgICAgIDogOiAicmkiIChfX0ZJTEVfXyksICJpIiAoX19MSU5FX18pKQorI2Vsc2UKKyNkZWZpbmUgQlVHKCkgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJicmVhayAxNFxuXHQiKQorI2VuZGlmCisKKyNkZWZpbmUgSEFWRV9BUkNIX0JVRworI2VuZGlmCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9idWcuaD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9jYWNoZS5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9jYWNoZS5oCmluZGV4IDgwYjIzNmIuLmIzZDc1MmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvY2FjaGUuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL2NhY2hlLmgKQEAgLTEsOCArMSwxOSBAQAogI2lmbmRlZiBfQVNNX0NSSVNfQVJDSF9DQUNIRV9ICiAjZGVmaW5lIF9BU01fQ1JJU19BUkNIX0NBQ0hFX0gKIAorI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9kbWEuaD4KKwogLyogQSBjYWNoZS1saW5lIGlzIDMyIGJ5dGVzLiAqLwogI2RlZmluZSBMMV9DQUNIRV9CWVRFUyAzMgogI2RlZmluZSBMMV9DQUNIRV9TSElGVCA1CiAKK3ZvaWQgZmx1c2hfZG1hX2xpc3QoZG1hX2Rlc2NyX2RhdGEgKmRlc2NyKTsKK3ZvaWQgZmx1c2hfZG1hX2Rlc2NyKGRtYV9kZXNjcl9kYXRhICpkZXNjciwgaW50IGZsdXNoX2J1Zik7CisKKyNkZWZpbmUgZmx1c2hfZG1hX2NvbnRleHQoYykgXAorICBmbHVzaF9kbWFfbGlzdChwaHlzX3RvX3ZpcnQoKGMpLT5zYXZlZF9kYXRhKSk7CisKK3ZvaWQgY3Jpc19mbHVzaF9jYWNoZV9yYW5nZSh2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuKTsKK3ZvaWQgY3Jpc19mbHVzaF9jYWNoZSh2b2lkKTsKKwogI2VuZGlmIC8qIF9BU01fQ1JJU19BUkNIX0NBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvZGVsYXkuaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvZGVsYXkuaAppbmRleCBiNmU5NDFlLi5lOWZkYTAzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL2RlbGF5LmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9kZWxheS5oCkBAIC0xLDYgKzEsMTYgQEAKICNpZm5kZWYgX0FTTV9DUklTX0FSQ0hfREVMQVlfSAogI2RlZmluZSBfQVNNX0NSSVNfQVJDSF9ERUxBWV9ICiAKK2V4dGVybiB2b2lkIGNyaXNfZGVsYXkxMG5zKHUzMiBuMTBucyk7CisjZGVmaW5lIHVkZWxheSh1KSBjcmlzX2RlbGF5MTBucygodSkqMTAwKQorI2RlZmluZSBuZGVsYXkobikgY3Jpc19kZWxheTEwbnMoKChuKSs5KS8xMCkKKworLyoKKyAqIE5vdCB1c2VkIGFueW1vcmUgZm9yIHVkZWxheSBvciBuZGVsYXkuICBSZWZlcmVuY2VkIGJ5CisgKiBlLmcuIGluaXQvY2FsaWJyYXRlLmMuICBBbGwgb3RoZXIgcmVmZXJlbmNlcyBhcmUgbGlrZWx5IGJ1Z3M7CisgKiBzaG91bGQgYmUgcmVwbGFjZWQgYnkgbWRlbGF5LCB1ZGVsYXkgb3IgbmRlbGF5LgorICovCisKIHN0YXRpYyBpbmxpbmUgdm9pZAogX19kZWxheShpbnQgbG9vcHMpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL2h3cmVncy9NYWtlZmlsZSBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvaHdyZWdzL01ha2VmaWxlCmluZGV4IGM5MTYwZjkuLmY5YTA1ZDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvaHdyZWdzL01ha2VmaWxlCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvaHdyZWdzL01ha2VmaWxlCkBAIC0xLDQgKzEsMyBAQAotIyAkSWQ6IE1ha2VmaWxlLHYgMS44IDIwMDQvMDEvMDcgMjE6MTY6MTggam9oYW5hIEV4cCAkCiAjIE1ha2VmaWxlIHRvIGdlbmVyYXRlIG9yIGNvcHkgdGhlIGxhdGVzdCByZWdpc3RlciBkZWZpbml0aW9ucwogIyBhbmQgcmVsYXRlZCBkYXRhc3RydWN0dXJlcyBhbmQgaGVscGVybWFjcm9zLgogIyBUaGUgb2ZmaWNhbCBwbGFjZSBmb3IgdGhlc2UgZmlsZXMgaXMgYXQ6CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL2h3cmVncy9kbWEuaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvaHdyZWdzL2RtYS5oCmluZGV4IGMzMTgzMmQuLjNjZTMyMmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvaHdyZWdzL2RtYS5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvaHdyZWdzL2RtYS5oCkBAIC0xLDUgKzEsNCBAQAotLyogJElkOiBkbWEuaCx2IDEuNyAyMDA1LzA0LzI0IDE4OjMwOjU4IHN0YXJ2aWsgRXhwICQKLSAqCisvKgogICogRE1BIEMgZGVmaW5pdGlvbnMgYW5kIGhlbHAgbWFjcm9zCiAgKgogICovCkBAIC05OCwxMSArOTcsMTEgQEAKIAogLy8gZ2l2ZSBzdHJlYW0gY29tbWFuZAogI2RlZmluZSBETUFfV1JfQ01EKCBpbnN0LCBjbWRfcGFyICkgXAotICAgZG8geyByZWdfZG1hX3J3X3N0cmVhbV9jbWQgciA9IHswfTsgXAotICAgICAgICBkbyB7IHIgPSBSRUdfUkQoIGRtYSwgaW5zdCwgcndfc3RyZWFtX2NtZCApOyB9IHdoaWxlKCByLmJ1c3kgKTsgXAotICAgICAgICByLmNtZCA9IChjbWRfcGFyKTsgXAotICAgICAgICBSRUdfV1IoIGRtYSwgaW5zdCwgcndfc3RyZWFtX2NtZCwgciApOyBcCi0gICAgICB9IHdoaWxlKCAwICkKKyAgIGRvIHsgcmVnX2RtYV9yd19zdHJlYW1fY21kIF9feCA9IHswfTsgXAorCWRvIHsgX194ID0gUkVHX1JEKGRtYSwgaW5zdCwgcndfc3RyZWFtX2NtZCk7IH0gd2hpbGUgKF9feC5idXN5KTsgXAorCV9feC5jbWQgPSAoY21kX3Bhcik7IFwKKwlSRUdfV1IoZG1hLCBpbnN0LCByd19zdHJlYW1fY21kLCBfX3gpOyBcCisgICB9IHdoaWxlICgwKQogCiAvLyBsb2FkOiBnLGMsZDpidXJzdAogI2RlZmluZSBETUFfU1RBUlRfR1JPVVAoIGluc3QsIGdyb3VwX2Rlc2NyICkgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9od3JlZ3MvZXRoX2RlZnMuaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvaHdyZWdzL2V0aF9kZWZzLmgKaW5kZXggMTE5NmQ3Yy4uOTBmZThhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9od3JlZ3MvZXRoX2RlZnMuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL2h3cmVncy9ldGhfZGVmcy5oCkBAIC0zLDEyICszLDEyIEBACiAKIC8qCiAgKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCi0gKiAgIGZpbGU6ICAgICAgICAgICAuLi8uLi9pbnN0L2V0aC9ydGwvZXRoX3JlZ3MucgotICogICAgIGlkOiAgICAgICAgICAgZXRoX3JlZ3Mucix2IDEuMTEgMjAwNS8wMi8wOSAxMDo0ODozOCBrcmlza24gRXhwCi0gKiAgICAgbGFzdCBtb2RmaWVkOiBNb24gQXByIDExIDE2OjA3OjAzIDIwMDUKKyAqICAgZmlsZTogICAgICAgICAgIGV0aC5yCisgKiAgICAgaWQ6ICAgICAgICAgICBldGhfcmVncy5yLHYgMS4xNiAyMDA1LzA1LzIwIDE1OjQxOjIyIHBlcnogRXhwCisgKiAgICAgbGFzdCBtb2RmaWVkOiBNb24gSmFuICA5IDA2OjA2OjQxIDIwMDYKICAqCi0gKiAgIGJ5IC9uL2FzaWMvZGVzaWduL3Rvb2xzL3JkZXNjL3NyYy9yZGVzMmMgLS1vdXRmaWxlIGV0aF9kZWZzLmggLi4vLi4vaW5zdC9ldGgvcnRsL2V0aF9yZWdzLnIKLSAqICAgICAgaWQ6ICRJZDogZXRoX2RlZnMuaCx2IDEuNiAyMDA1LzA0LzI0IDE4OjMwOjU4IHN0YXJ2aWsgRXhwICQKKyAqICAgYnkgL24vYXNpYy9kZXNpZ24vdG9vbHMvcmRlc2MvcmRlczJjIGV0aC5yCisgKiAgICAgIGlkOiAkSWQ6IGV0aF9kZWZzLmgsdiAxLjcgMjAwNi8wMS8yNiAxMzo0NTozMCBrYXJsam9wZSBFeHAgJAogICogQW55IGNoYW5nZXMgaGVyZSB3aWxsIGJlIGxvc3QuCiAgKgogICogLSotIGJ1ZmZlci1yZWFkLW9ubHk6IHQgLSotCkBAIC0xMTYsMjYgKzExNiwyOCBAQAogCiAvKiBSZWdpc3RlciByd19nYV9sbywgc2NvcGUgZXRoLCB0eXBlIHJ3ICovCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGludCB0YWJsZSA6IDMyOworICB1bnNpZ25lZCBpbnQgdGJsIDogMzI7CiB9IHJlZ19ldGhfcndfZ2FfbG87CiAjZGVmaW5lIFJFR19SRF9BRERSX2V0aF9yd19nYV9sbyAxNgogI2RlZmluZSBSRUdfV1JfQUREUl9ldGhfcndfZ2FfbG8gMTYKIAogLyogUmVnaXN0ZXIgcndfZ2FfaGksIHNjb3BlIGV0aCwgdHlwZSBydyAqLwogdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBpbnQgdGFibGUgOiAzMjsKKyAgdW5zaWduZWQgaW50IHRibCA6IDMyOwogfSByZWdfZXRoX3J3X2dhX2hpOwogI2RlZmluZSBSRUdfUkRfQUREUl9ldGhfcndfZ2FfaGkgMjAKICNkZWZpbmUgUkVHX1dSX0FERFJfZXRoX3J3X2dhX2hpIDIwCiAKIC8qIFJlZ2lzdGVyIHJ3X2dlbl9jdHJsLCBzY29wZSBldGgsIHR5cGUgcncgKi8KIHR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgaW50IGVuICAgICAgICAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgcGh5ICAgICAgICAgICA6IDI7Ci0gIHVuc2lnbmVkIGludCBwcm90b2NvbCAgICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGxvb3BiYWNrICAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgZmxvd19jdHJsX2RpcyA6IDE7Ci0gIHVuc2lnbmVkIGludCBkdW1teTEgICAgICAgIDogMjY7CisgIHVuc2lnbmVkIGludCBlbiAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHBoeSAgICAgICAgOiAyOworICB1bnNpZ25lZCBpbnQgcHJvdG9jb2wgICA6IDE7CisgIHVuc2lnbmVkIGludCBsb29wYmFjayAgIDogMTsKKyAgdW5zaWduZWQgaW50IGZsb3dfY3RybCAgOiAxOworICB1bnNpZ25lZCBpbnQgZ3R4Y2xrX291dCA6IDE7CisgIHVuc2lnbmVkIGludCBwaHlyc3RfbiAgIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgOiAyNDsKIH0gcmVnX2V0aF9yd19nZW5fY3RybDsKICNkZWZpbmUgUkVHX1JEX0FERFJfZXRoX3J3X2dlbl9jdHJsIDI0CiAjZGVmaW5lIFJFR19XUl9BRERSX2V0aF9yd19nZW5fY3RybCAyNApAQCAtMTUwLDIyICsxNTIsMjMgQEAKICAgdW5zaWduZWQgaW50IG92ZXJzaXplICAgOiAxOwogICB1bnNpZ25lZCBpbnQgYmFkX2NyYyAgICA6IDE7CiAgIHVuc2lnbmVkIGludCBkdXBsZXggICAgIDogMTsKLSAgdW5zaWduZWQgaW50IG1heF9zaXplICAgOiAxOwotICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICA6IDIzOworICB1bnNpZ25lZCBpbnQgbWF4X3NpemUgICA6IDE2OworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICA6IDg7CiB9IHJlZ19ldGhfcndfcmVjX2N0cmw7CiAjZGVmaW5lIFJFR19SRF9BRERSX2V0aF9yd19yZWNfY3RybCAyOAogI2RlZmluZSBSRUdfV1JfQUREUl9ldGhfcndfcmVjX2N0cmwgMjgKIAogLyogUmVnaXN0ZXIgcndfdHJfY3RybCwgc2NvcGUgZXRoLCB0eXBlIHJ3ICovCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGludCBjcmMgICAgICAgIDogMTsKLSAgdW5zaWduZWQgaW50IHBhZCAgICAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgcmV0cnkgICAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBpZ25vcmVfY29sIDogMTsKLSAgdW5zaWduZWQgaW50IGNhbmNlbCAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgaHNoX2RlbGF5ICA6IDE7Ci0gIHVuc2lnbmVkIGludCBpZ25vcmVfY3JzIDogMTsKLSAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgOiAyNTsKKyAgdW5zaWduZWQgaW50IGNyYyAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHBhZCAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHJldHJ5ICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGlnbm9yZV9jb2wgIDogMTsKKyAgdW5zaWduZWQgaW50IGNhbmNlbCAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGhzaF9kZWxheSAgIDogMTsKKyAgdW5zaWduZWQgaW50IGlnbm9yZV9jcnMgIDogMTsKKyAgdW5zaWduZWQgaW50IGNhcnJpZXJfZXh0IDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgIDogMjQ7CiB9IHJlZ19ldGhfcndfdHJfY3RybDsKICNkZWZpbmUgUkVHX1JEX0FERFJfZXRoX3J3X3RyX2N0cmwgMzIKICNkZWZpbmUgUkVHX1dSX0FERFJfZXRoX3J3X3RyX2N0cmwgMzIKQEAgLTE4MCwxMyArMTgzLDEwIEBACiAKIC8qIFJlZ2lzdGVyIHJ3X21nbV9jdHJsLCBzY29wZSBldGgsIHR5cGUgcncgKi8KIHR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgaW50IG1kaW8gICA6IDE7Ci0gIHVuc2lnbmVkIGludCBtZG9lICAgOiAxOwotICB1bnNpZ25lZCBpbnQgbWRjICAgIDogMTsKLSAgdW5zaWduZWQgaW50IHBoeWNsayA6IDE7Ci0gIHVuc2lnbmVkIGludCB0eGRhdGEgOiA0OwotICB1bnNpZ25lZCBpbnQgdHhlbiAgIDogMTsKLSAgdW5zaWduZWQgaW50IGR1bW15MSA6IDIzOworICB1bnNpZ25lZCBpbnQgbWRpbyA6IDE7CisgIHVuc2lnbmVkIGludCBtZG9lIDogMTsKKyAgdW5zaWduZWQgaW50IG1kYyAgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjk7CiB9IHJlZ19ldGhfcndfbWdtX2N0cmw7CiAjZGVmaW5lIFJFR19SRF9BRERSX2V0aF9yd19tZ21fY3RybCA0MAogI2RlZmluZSBSRUdfV1JfQUREUl9ldGhfcndfbWdtX2N0cmwgNDAKQEAgLTE5NiwxNyArMTk2LDggQEAKICAgdW5zaWduZWQgaW50IG1kaW8gICAgOiAxOwogICB1bnNpZ25lZCBpbnQgZXhjX2NvbCA6IDE7CiAgIHVuc2lnbmVkIGludCB1cnVuICAgIDogMTsKLSAgdW5zaWduZWQgaW50IHBoeWNsayAgOiAxOwotICB1bnNpZ25lZCBpbnQgdHhkYXRhICA6IDQ7Ci0gIHVuc2lnbmVkIGludCB0eGVuICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGNvbCAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgY3JzICAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCB0eGNsayAgIDogMTsKLSAgdW5zaWduZWQgaW50IHJ4ZGF0YSAgOiA0OwotICB1bnNpZ25lZCBpbnQgcnhlciAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCByeGR2ICAgIDogMTsKLSAgdW5zaWduZWQgaW50IHJ4Y2xrICAgOiAxOwotICB1bnNpZ25lZCBpbnQgZHVtbXkxICA6IDEzOworICB1bnNpZ25lZCBpbnQgY2xrXzEyNSA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgIDogMjg7CiB9IHJlZ19ldGhfcl9zdGF0OwogI2RlZmluZSBSRUdfUkRfQUREUl9ldGhfcl9zdGF0IDQ0CiAKQEAgLTI3NCw4MyArMjY1LDgzIEBACiAKIC8qIFJlZ2lzdGVyIHJ3X2ludHJfbWFzaywgc2NvcGUgZXRoLCB0eXBlIHJ3ICovCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGludCBjcmMgICAgICAgICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGFsaWduICAgICAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgb3ZlcnNpemUgICAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBjb25nZXN0aW9uICAgIDogMTsKLSAgdW5zaWduZWQgaW50IHNpbmdsZV9jb2wgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgbXVsdF9jb2wgICAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBsYXRlX2NvbCAgICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGRlZmVycmVkICAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgY2Fycmllcl9sb3NzICA6IDE7Ci0gIHVuc2lnbmVkIGludCBzcWVfdGVzdF9lcnIgIDogMTsKLSAgdW5zaWduZWQgaW50IG9ydW4gICAgICAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgdXJ1biAgICAgICAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBleGNlc3NpdmVfY29sIDogMTsKLSAgdW5zaWduZWQgaW50IG1kaW8gICAgICAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICAgICA6IDE4OworICB1bnNpZ25lZCBpbnQgY3JjICAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGFsaWduICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBvdmVyc2l6ZSAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgY29uZ2VzdGlvbiAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNpbmdsZV9jb2wgICA6IDE7CisgIHVuc2lnbmVkIGludCBtdWx0X2NvbCAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbGF0ZV9jb2wgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRlZmVycmVkICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBjYXJyaWVyX2xvc3MgOiAxOworICB1bnNpZ25lZCBpbnQgc3FlX3Rlc3RfZXJyIDogMTsKKyAgdW5zaWduZWQgaW50IG9ydW4gICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB1cnVuICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZXhjX2NvbCAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG1kaW8gICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICAgOiAxODsKIH0gcmVnX2V0aF9yd19pbnRyX21hc2s7CiAjZGVmaW5lIFJFR19SRF9BRERSX2V0aF9yd19pbnRyX21hc2sgNzYKICNkZWZpbmUgUkVHX1dSX0FERFJfZXRoX3J3X2ludHJfbWFzayA3NgogCiAvKiBSZWdpc3RlciByd19hY2tfaW50ciwgc2NvcGUgZXRoLCB0eXBlIHJ3ICovCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGludCBjcmMgICAgICAgICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGFsaWduICAgICAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgb3ZlcnNpemUgICAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBjb25nZXN0aW9uICAgIDogMTsKLSAgdW5zaWduZWQgaW50IHNpbmdsZV9jb2wgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgbXVsdF9jb2wgICAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBsYXRlX2NvbCAgICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGRlZmVycmVkICAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgY2Fycmllcl9sb3NzICA6IDE7Ci0gIHVuc2lnbmVkIGludCBzcWVfdGVzdF9lcnIgIDogMTsKLSAgdW5zaWduZWQgaW50IG9ydW4gICAgICAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgdXJ1biAgICAgICAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBleGNlc3NpdmVfY29sIDogMTsKLSAgdW5zaWduZWQgaW50IG1kaW8gICAgICAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICAgICA6IDE4OworICB1bnNpZ25lZCBpbnQgY3JjICAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGFsaWduICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBvdmVyc2l6ZSAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgY29uZ2VzdGlvbiAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNpbmdsZV9jb2wgICA6IDE7CisgIHVuc2lnbmVkIGludCBtdWx0X2NvbCAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbGF0ZV9jb2wgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRlZmVycmVkICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBjYXJyaWVyX2xvc3MgOiAxOworICB1bnNpZ25lZCBpbnQgc3FlX3Rlc3RfZXJyIDogMTsKKyAgdW5zaWduZWQgaW50IG9ydW4gICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB1cnVuICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZXhjX2NvbCAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG1kaW8gICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICAgOiAxODsKIH0gcmVnX2V0aF9yd19hY2tfaW50cjsKICNkZWZpbmUgUkVHX1JEX0FERFJfZXRoX3J3X2Fja19pbnRyIDgwCiAjZGVmaW5lIFJFR19XUl9BRERSX2V0aF9yd19hY2tfaW50ciA4MAogCiAvKiBSZWdpc3RlciByX2ludHIsIHNjb3BlIGV0aCwgdHlwZSByICovCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGludCBjcmMgICAgICAgICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGFsaWduICAgICAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgb3ZlcnNpemUgICAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBjb25nZXN0aW9uICAgIDogMTsKLSAgdW5zaWduZWQgaW50IHNpbmdsZV9jb2wgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgbXVsdF9jb2wgICAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBsYXRlX2NvbCAgICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGRlZmVycmVkICAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgY2Fycmllcl9sb3NzICA6IDE7Ci0gIHVuc2lnbmVkIGludCBzcWVfdGVzdF9lcnIgIDogMTsKLSAgdW5zaWduZWQgaW50IG9ydW4gICAgICAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgdXJ1biAgICAgICAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBleGNlc3NpdmVfY29sIDogMTsKLSAgdW5zaWduZWQgaW50IG1kaW8gICAgICAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICAgICA6IDE4OworICB1bnNpZ25lZCBpbnQgY3JjICAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGFsaWduICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBvdmVyc2l6ZSAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgY29uZ2VzdGlvbiAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNpbmdsZV9jb2wgICA6IDE7CisgIHVuc2lnbmVkIGludCBtdWx0X2NvbCAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbGF0ZV9jb2wgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRlZmVycmVkICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBjYXJyaWVyX2xvc3MgOiAxOworICB1bnNpZ25lZCBpbnQgc3FlX3Rlc3RfZXJyIDogMTsKKyAgdW5zaWduZWQgaW50IG9ydW4gICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB1cnVuICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZXhjX2NvbCAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG1kaW8gICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICAgOiAxODsKIH0gcmVnX2V0aF9yX2ludHI7CiAjZGVmaW5lIFJFR19SRF9BRERSX2V0aF9yX2ludHIgODQKIAogLyogUmVnaXN0ZXIgcl9tYXNrZWRfaW50ciwgc2NvcGUgZXRoLCB0eXBlIHIgKi8KIHR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgaW50IGNyYyAgICAgICAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgYWxpZ24gICAgICAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBvdmVyc2l6ZSAgICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGNvbmdlc3Rpb24gICAgOiAxOwotICB1bnNpZ25lZCBpbnQgc2luZ2xlX2NvbCAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBtdWx0X2NvbCAgICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGxhdGVfY29sICAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgZGVmZXJyZWQgICAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBjYXJyaWVyX2xvc3MgIDogMTsKLSAgdW5zaWduZWQgaW50IHNxZV90ZXN0X2VyciAgOiAxOwotICB1bnNpZ25lZCBpbnQgb3J1biAgICAgICAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCB1cnVuICAgICAgICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGV4Y2Vzc2l2ZV9jb2wgOiAxOwotICB1bnNpZ25lZCBpbnQgbWRpbyAgICAgICAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBkdW1teTEgICAgICAgIDogMTg7CisgIHVuc2lnbmVkIGludCBjcmMgICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgYWxpZ24gICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG92ZXJzaXplICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBjb25nZXN0aW9uICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2luZ2xlX2NvbCAgIDogMTsKKyAgdW5zaWduZWQgaW50IG11bHRfY29sICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBsYXRlX2NvbCAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZGVmZXJyZWQgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGNhcnJpZXJfbG9zcyA6IDE7CisgIHVuc2lnbmVkIGludCBzcWVfdGVzdF9lcnIgOiAxOworICB1bnNpZ25lZCBpbnQgb3J1biAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHVydW4gICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBleGNfY29sICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbWRpbyAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgICA6IDE4OwogfSByZWdfZXRoX3JfbWFza2VkX2ludHI7CiAjZGVmaW5lIFJFR19SRF9BRERSX2V0aF9yX21hc2tlZF9pbnRyIDg4CiAKQEAgLTM2MCwxMiArMzUxLDE1IEBACiAgIHJlZ2tfZXRoX2Rpc2NhcmQgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAogICByZWdrX2V0aF9ldGhlciAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKICAgcmVna19ldGhfZnVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfZXRoX2dtaWkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAzLAorICByZWdrX2V0aF9ndHhjbGsgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKICAgcmVna19ldGhfaGFsZiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCiAgIHJlZ2tfZXRoX2hzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAogICByZWdrX2V0aF9taWkgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19ldGhfbWlpX2FyZWMgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIsCiAgIHJlZ2tfZXRoX21paV9jbGsgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAotICByZWdrX2V0aF9taWlfcmVjICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKICAgcmVna19ldGhfbm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfZXRoX3BoeXJzdCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAogICByZWdrX2V0aF9yZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKICAgcmVna19ldGhfcndfZ2FfaGlfZGVmYXVsdCAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCiAgIHJlZ2tfZXRoX3J3X2dhX2xvX2RlZmF1bHQgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLApAQCAtMzc3LDggKzM3MSw4IEBACiAgIHJlZ2tfZXRoX3J3X21hMV9sb19kZWZhdWx0ICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAogICByZWdrX2V0aF9yd19tZ21fY3RybF9kZWZhdWx0ICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKICAgcmVna19ldGhfcndfdGVzdF9jdHJsX2RlZmF1bHQgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCi0gIHJlZ2tfZXRoX3NpemUxNTE4ICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAotICByZWdrX2V0aF9zaXplMTUyMiAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19ldGhfc2l6ZTE1MTggICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDA1ZWUsCisgIHJlZ2tfZXRoX3NpemUxNTIyICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwNWYyLAogICByZWdrX2V0aF95ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMQogfTsKICNlbmRpZiAvKiBfX2V0aF9kZWZzX2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvaHdyZWdzL2ludHJfdmVjdF9kZWZzLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL2h3cmVncy9pbnRyX3ZlY3RfZGVmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzVhYWYxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvaHdyZWdzL2ludHJfdmVjdF9kZWZzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotI2lmbmRlZiBfX2ludHJfdmVjdF9kZWZzX2gKLSNkZWZpbmUgX19pbnRyX3ZlY3RfZGVmc19oCi0KLS8qCi0gKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCi0gKiAgIGZpbGU6ICAgICAgICAgICAuLi8uLi9pbnN0L2ludHJfdmVjdC9ydGwvZ3Vpbm5lc3MvaXZtYXNrLmNvbmZpZy5yCi0gKiAgICAgaWQ6ICAgICAgICAgICBpdm1hc2suY29uZmlnLnIsdiAxLjQgMjAwNS8wMi8xNSAxNjowNTozOCBzdGVmYW5zIEV4cAotICogICAgIGxhc3QgbW9kZmllZDogTW9uIEFwciAxMSAxNjowODowMyAyMDA1Ci0gKgotICogICBieSAvbi9hc2ljL2Rlc2lnbi90b29scy9yZGVzYy9zcmMvcmRlczJjIC0tb3V0ZmlsZSBpbnRyX3ZlY3RfZGVmcy5oIC4uLy4uL2luc3QvaW50cl92ZWN0L3J0bC9ndWlubmVzcy9pdm1hc2suY29uZmlnLnIKLSAqICAgICAgaWQ6ICRJZDogaW50cl92ZWN0X2RlZnMuaCx2IDEuOCAyMDA1LzA0LzI0IDE4OjMwOjU4IHN0YXJ2aWsgRXhwICQKLSAqIEFueSBjaGFuZ2VzIGhlcmUgd2lsbCBiZSBsb3N0LgotICoKLSAqIC0qLSBidWZmZXItcmVhZC1vbmx5OiB0IC0qLQotICovCi0vKiBNYWluIGFjY2VzcyBtYWNyb3MgKi8KLSNpZm5kZWYgUkVHX1JECi0jZGVmaW5lIFJFR19SRCggc2NvcGUsIGluc3QsIHJlZyApIFwKLSAgUkVHX1JFQUQoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKLSAgICAgICAgICAgIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCi0jZW5kaWYKLQotI2lmbmRlZiBSRUdfV1IKLSNkZWZpbmUgUkVHX1dSKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCi0gIFJFR19XUklURSggcmVnXyMjc2NvcGUjI18jI3JlZywgXAotICAgICAgICAgICAgIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQotI2VuZGlmCi0KLSNpZm5kZWYgUkVHX1JEX1ZFQ1QKLSNkZWZpbmUgUkVHX1JEX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAotICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAotICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAotCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCi0jZW5kaWYKLQotI2lmbmRlZiBSRUdfV1JfVkVDVAotI2RlZmluZSBSRUdfV1JfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXgsIHZhbCApIFwKLSAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCi0gICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAotCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKLSNlbmRpZgotCi0jaWZuZGVmIFJFR19SRF9JTlQKLSNkZWZpbmUgUkVHX1JEX0lOVCggc2NvcGUsIGluc3QsIHJlZyApIFwKLSAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKLSNlbmRpZgotCi0jaWZuZGVmIFJFR19XUl9JTlQKLSNkZWZpbmUgUkVHX1dSX0lOVCggc2NvcGUsIGluc3QsIHJlZywgdmFsICkgXAotICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCi0jZW5kaWYKLQotI2lmbmRlZiBSRUdfUkRfSU5UX1ZFQ1QKLSNkZWZpbmUgUkVHX1JEX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKLSAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAotCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCi0jZW5kaWYKLQotI2lmbmRlZiBSRUdfV1JfSU5UX1ZFQ1QKLSNkZWZpbmUgUkVHX1dSX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAotICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAotCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKLSNlbmRpZgotCi0jaWZuZGVmIFJFR19UWVBFX0NPTlYKLSNkZWZpbmUgUkVHX1RZUEVfQ09OViggdHlwZSwgb3JndHlwZSwgdmFsICkgXAotICAoIHsgdW5pb24geyBvcmd0eXBlIG87IHR5cGUgbjsgfSByOyByLm8gPSB2YWw7IHIubjsgfSApCi0jZW5kaWYKLQotI2lmbmRlZiByZWdfcGFnZV9zaXplCi0jZGVmaW5lIHJlZ19wYWdlX3NpemUgODE5MgotI2VuZGlmCi0KLSNpZm5kZWYgUkVHX0FERFIKLSNkZWZpbmUgUkVHX0FERFIoIHNjb3BlLCBpbnN0LCByZWcgKSBcCi0gICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKLSNlbmRpZgotCi0jaWZuZGVmIFJFR19BRERSX1ZFQ1QKLSNkZWZpbmUgUkVHX0FERFJfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCi0gICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAotICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKLSNlbmRpZgotCi0vKiBDLWNvZGUgZm9yIHJlZ2lzdGVyIHNjb3BlIGludHJfdmVjdCAqLwotCi0vKiBSZWdpc3RlciByd19tYXNrLCBzY29wZSBpbnRyX3ZlY3QsIHR5cGUgcncgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgaW50IG1lbWFyYiAgOiAxOwotICB1bnNpZ25lZCBpbnQgZ2VuX2lvICA6IDE7Ci0gIHVuc2lnbmVkIGludCBpb3AwICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGlvcDEgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgaW9wMiAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBpb3AzICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGRtYTAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgZG1hMSAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBkbWEyICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGRtYTMgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgZG1hNCAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBkbWE1ICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGRtYTYgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgZG1hNyAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBkbWE4ICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGRtYTkgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgYXRhICAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBzc2VyMCAgIDogMTsKLSAgdW5zaWduZWQgaW50IHNzZXIxICAgOiAxOwotICB1bnNpZ25lZCBpbnQgc2VyMCAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBzZXIxICAgIDogMTsKLSAgdW5zaWduZWQgaW50IHNlcjIgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgc2VyMyAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBwMjEgICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGV0aDAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgZXRoMSAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCB0aW1lciAgIDogMTsKLSAgdW5zaWduZWQgaW50IGJpZl9hcmIgOiAxOwotICB1bnNpZ25lZCBpbnQgYmlmX2RtYSA6IDE7Ci0gIHVuc2lnbmVkIGludCBleHQgICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGR1bW15MSAgOiAyOwotfSByZWdfaW50cl92ZWN0X3J3X21hc2s7Ci0jZGVmaW5lIFJFR19SRF9BRERSX2ludHJfdmVjdF9yd19tYXNrIDAKLSNkZWZpbmUgUkVHX1dSX0FERFJfaW50cl92ZWN0X3J3X21hc2sgMAotCi0vKiBSZWdpc3RlciByX3ZlY3QsIHNjb3BlIGludHJfdmVjdCwgdHlwZSByICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGludCBtZW1hcmIgIDogMTsKLSAgdW5zaWduZWQgaW50IGdlbl9pbyAgOiAxOwotICB1bnNpZ25lZCBpbnQgaW9wMCAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBpb3AxICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGlvcDIgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgaW9wMyAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBkbWEwICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGRtYTEgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgZG1hMiAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBkbWEzICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGRtYTQgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgZG1hNSAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBkbWE2ICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGRtYTcgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgZG1hOCAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBkbWE5ICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGF0YSAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgc3NlcjAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBzc2VyMSAgIDogMTsKLSAgdW5zaWduZWQgaW50IHNlcjAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgc2VyMSAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBzZXIyICAgIDogMTsKLSAgdW5zaWduZWQgaW50IHNlcjMgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgcDIxICAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBldGgwICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGV0aDEgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgdGltZXIgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBiaWZfYXJiIDogMTsKLSAgdW5zaWduZWQgaW50IGJpZl9kbWEgOiAxOwotICB1bnNpZ25lZCBpbnQgZXh0ICAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBkdW1teTEgIDogMjsKLX0gcmVnX2ludHJfdmVjdF9yX3ZlY3Q7Ci0jZGVmaW5lIFJFR19SRF9BRERSX2ludHJfdmVjdF9yX3ZlY3QgNAotCi0vKiBSZWdpc3RlciByX21hc2tlZF92ZWN0LCBzY29wZSBpbnRyX3ZlY3QsIHR5cGUgciAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBpbnQgbWVtYXJiICA6IDE7Ci0gIHVuc2lnbmVkIGludCBnZW5faW8gIDogMTsKLSAgdW5zaWduZWQgaW50IGlvcDAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgaW9wMSAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBpb3AyICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGlvcDMgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgZG1hMCAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBkbWExICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGRtYTIgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgZG1hMyAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBkbWE0ICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGRtYTUgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgZG1hNiAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBkbWE3ICAgIDogMTsKLSAgdW5zaWduZWQgaW50IGRtYTggICAgOiAxOwotICB1bnNpZ25lZCBpbnQgZG1hOSAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBhdGEgICAgIDogMTsKLSAgdW5zaWduZWQgaW50IHNzZXIwICAgOiAxOwotICB1bnNpZ25lZCBpbnQgc3NlcjEgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBzZXIwICAgIDogMTsKLSAgdW5zaWduZWQgaW50IHNlcjEgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgc2VyMiAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBzZXIzICAgIDogMTsKLSAgdW5zaWduZWQgaW50IHAyMSAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgZXRoMCAgICA6IDE7Ci0gIHVuc2lnbmVkIGludCBldGgxICAgIDogMTsKLSAgdW5zaWduZWQgaW50IHRpbWVyICAgOiAxOwotICB1bnNpZ25lZCBpbnQgYmlmX2FyYiA6IDE7Ci0gIHVuc2lnbmVkIGludCBiaWZfZG1hIDogMTsKLSAgdW5zaWduZWQgaW50IGV4dCAgICAgOiAxOwotICB1bnNpZ25lZCBpbnQgZHVtbXkxICA6IDI7Ci19IHJlZ19pbnRyX3ZlY3Rfcl9tYXNrZWRfdmVjdDsKLSNkZWZpbmUgUkVHX1JEX0FERFJfaW50cl92ZWN0X3JfbWFza2VkX3ZlY3QgOAotCi0vKiBSZWdpc3RlciByX25taSwgc2NvcGUgaW50cl92ZWN0LCB0eXBlIHIgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgaW50IGV4dCAgICAgIDogMTsKLSAgdW5zaWduZWQgaW50IHdhdGNoZG9nIDogMTsKLSAgdW5zaWduZWQgaW50IGR1bW15MSAgIDogMzA7Ci19IHJlZ19pbnRyX3ZlY3Rfcl9ubWk7Ci0jZGVmaW5lIFJFR19SRF9BRERSX2ludHJfdmVjdF9yX25taSAxMgotCi0vKiBSZWdpc3RlciByX2d1cnUsIHNjb3BlIGludHJfdmVjdCwgdHlwZSByICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGludCBqdGFnIDogMTsKLSAgdW5zaWduZWQgaW50IGR1bW15MSA6IDMxOwotfSByZWdfaW50cl92ZWN0X3JfZ3VydTsKLSNkZWZpbmUgUkVHX1JEX0FERFJfaW50cl92ZWN0X3JfZ3VydSAxNgotCi0vKiBSZWdpc3RlciByd19pcGksIHNjb3BlIGludHJfdmVjdCwgdHlwZSBydyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgaW50IHZlY3RvcjsKLX0gcmVnX2ludHJfdmVjdF9yd19pcGk7Ci0jZGVmaW5lIFJFR19SRF9BRERSX2ludHJfdmVjdF9yd19pcGkgMjAKLSNkZWZpbmUgUkVHX1dSX0FERFJfaW50cl92ZWN0X3J3X2lwaSAyMAotCi0vKiBDb25zdGFudHMgKi8KLWVudW0gewotICByZWdrX2ludHJfdmVjdF9vZmYgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKLSAgcmVna19pbnRyX3ZlY3Rfb24gICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCi0gIHJlZ2tfaW50cl92ZWN0X3J3X21hc2tfZGVmYXVsdCAgICAgICAgICAgPSAweDAwMDAwMDAwCi19OwotI2VuZGlmIC8qIF9faW50cl92ZWN0X2RlZnNfaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9od3JlZ3MvcmVnX21hcC5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9od3JlZ3MvcmVnX21hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzE1MDI4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvaHdyZWdzL3JlZ19tYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0jaWZuZGVmIF9fcmVnX21hcF9oCi0jZGVmaW5lIF9fcmVnX21hcF9oCi0KLS8qCi0gKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCi0gKiAgIGZpbGU6ICAgICAgICAgICAgLi4vLi4vbW9kL2Zha2VyZWcucm1hcAotICogICAgIGlkOiAgICAgICAgICAgIGZha2VyZWcucm1hcCx2IDEuMyAyMDA0LzAyLzExIDE5OjUzOjIyIHJvbm55IEV4cAotICogICAgIGxhc3QgbW9kaWZpZWQ6IFdlZCBGZWIgMTEgMjA6NTM6MjUgMjAwNAotICogICBmaWxlOiAgICAgICAgICAgIC4uLy4uL3J0bC9nbG9iYWwucm1hcAotICogICAgIGlkOiAgICAgICAgICAgIGdsb2JhbC5ybWFwLHYgMS4zIDIwMDMvMDgvMTggMTU6MDg6MjMgbWlrYWVsbiBFeHAKLSAqICAgICBsYXN0IG1vZGlmaWVkOiBNb24gQXVnIDE4IDE3OjA4OjIzIDIwMDMKLSAqICAgZmlsZTogICAgICAgICAgICAuLi8uLi9tb2QvbW9kcmVnLnJtYXAKLSAqICAgICBpZDogICAgICAgICAgICBtb2RyZWcucm1hcCx2IDEuMzEgMjAwNC8wMi8yMCAxNTo0MDowNCBzdGVmYW5zIEV4cAotICogICAgIGxhc3QgbW9kaWZpZWQ6IEZyaSBGZWIgMjAgMTY6NDA6MDQgMjAwNAotICoKLSAqICAgYnkgL24vYXNpYy9kZXNpZ24vdG9vbHMvcmRlc2Mvc3JjL3JkZXMyYyAtbWFwIC1iYXNlIDB4YjAwMDAwMDAgLi4vLi4vcnRsL2dsb2JhbC5ybWFwIC4uLy4uL21vZC9tb2RyZWcucm1hcCAuLi8uLi9pbnN0L2lvX3Byb2MvcnRsL2d1aW5uZXNzL2lvcF90b3AuciAuLi8uLi9pbnN0L21lbWFyYi9ydGwvZ3Vpbm5lc3MvbWFyYl90b3AuciAuLi8uLi9tb2QvZmFrZXJlZy5ybWFwCi0gKiAgICAgIGlkOiAkSWQ6IHJlZ19tYXAuaCx2IDEuNyAyMDA1LzA0LzI0IDE4OjMwOjU4IHN0YXJ2aWsgRXhwICQKLSAqIEFueSBjaGFuZ2VzIGhlcmUgd2lsbCBiZSBsb3N0LgotICoKLSAqIC0qLSBidWZmZXItcmVhZC1vbmx5OiB0IC0qLQotICovCi10eXBlZGVmIGVudW0gewotICByZWdpX2F0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAzMjAwMCwKLSAgcmVnaV9iaWZfY29yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMTQwMDAsCi0gIHJlZ2lfYmlmX2RtYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDE2MDAwLAotICByZWdpX2JpZl9zbGF2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAxODAwMCwKLSAgcmVnaV9jb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwM2MwMDAsCi0gIHJlZ2lfZG1hMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDAwMDAwLAotICByZWdpX2RtYTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAwMjAwMCwKLSAgcmVnaV9kbWEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMDQwMDAsCi0gIHJlZ2lfZG1hMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDA2MDAwLAotICByZWdpX2RtYTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAwODAwMCwKLSAgcmVnaV9kbWE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMGEwMDAsCi0gIHJlZ2lfZG1hNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDBjMDAwLAotICByZWdpX2RtYTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAwZTAwMCwKLSAgcmVnaV9kbWE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMTAwMDAsCi0gIHJlZ2lfZG1hOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDEyMDAwLAotICByZWdpX2V0aDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAzNDAwMCwKLSAgcmVnaV9ldGgxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMzYwMDAsCi0gIHJlZ2lfZ2lvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDFhMDAwLAotICByZWdpX2lvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMDAwMCwKLSAgcmVnaV9pb3BfdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjAwMDAsCi0gIHJlZ2lfaW9wX2ZpZm9faW4wX2V4dHJhICAgICAgICAgICAgICAgICAgPSAweGIwMDIwMDQwLAotICByZWdpX2lvcF9maWZvX2luMV9leHRyYSAgICAgICAgICAgICAgICAgID0gMHhiMDAyMDA4MCwKLSAgcmVnaV9pb3BfZmlmb19vdXQwX2V4dHJhICAgICAgICAgICAgICAgICA9IDB4YjAwMjAwYzAsCi0gIHJlZ2lfaW9wX2ZpZm9fb3V0MV9leHRyYSAgICAgICAgICAgICAgICAgPSAweGIwMDIwMTAwLAotICByZWdpX2lvcF90cmlnZ2VyX2dycDAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMDE0MCwKLSAgcmVnaV9pb3BfdHJpZ2dlcl9ncnAxICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjAxODAsCi0gIHJlZ2lfaW9wX3RyaWdnZXJfZ3JwMiAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIwMWMwLAotICByZWdpX2lvcF90cmlnZ2VyX2dycDMgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMDIwMCwKLSAgcmVnaV9pb3BfdHJpZ2dlcl9ncnA0ICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjAyNDAsCi0gIHJlZ2lfaW9wX3RyaWdnZXJfZ3JwNSAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIwMjgwLAotICByZWdpX2lvcF90cmlnZ2VyX2dycDYgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMDJjMCwKLSAgcmVnaV9pb3BfdHJpZ2dlcl9ncnA3ICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjAzMDAsCi0gIHJlZ2lfaW9wX2NyY19wYXIwICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIwMzgwLAotICByZWdpX2lvcF9jcmNfcGFyMSAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMDQwMCwKLSAgcmVnaV9pb3BfZG1jX2luMCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjA0ODAsCi0gIHJlZ2lfaW9wX2RtY19pbjEgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIwNTAwLAotICByZWdpX2lvcF9kbWNfb3V0MCAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMDU4MCwKLSAgcmVnaV9pb3BfZG1jX291dDEgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjA2MDAsCi0gIHJlZ2lfaW9wX2ZpZm9faW4wICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIwNjgwLAotICByZWdpX2lvcF9maWZvX2luMSAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMDcwMCwKLSAgcmVnaV9pb3BfZmlmb19vdXQwICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjA3ODAsCi0gIHJlZ2lfaW9wX2ZpZm9fb3V0MSAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIwODAwLAotICByZWdpX2lvcF9zY3JjX2luMCAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMDg4MCwKLSAgcmVnaV9pb3Bfc2NyY19pbjEgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjA5MDAsCi0gIHJlZ2lfaW9wX3NjcmNfb3V0MCAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIwOTgwLAotICByZWdpX2lvcF9zY3JjX291dDEgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMGEwMCwKLSAgcmVnaV9pb3BfdGltZXJfZ3JwMCAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjBhODAsCi0gIHJlZ2lfaW9wX3RpbWVyX2dycDEgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIwYjAwLAotICByZWdpX2lvcF90aW1lcl9ncnAyICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMGI4MCwKLSAgcmVnaV9pb3BfdGltZXJfZ3JwMyAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjBjMDAsCi0gIHJlZ2lfaW9wX3NhcF9pbiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIwZDAwLAotICByZWdpX2lvcF9zYXBfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMGUwMCwKLSAgcmVnaV9pb3Bfc3B1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjBmMDAsCi0gIHJlZ2lfaW9wX3NwdTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIxMDAwLAotICByZWdpX2lvcF9zd19jZmcgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMTEwMCwKLSAgcmVnaV9pb3Bfc3dfY3B1ICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjEyMDAsCi0gIHJlZ2lfaW9wX3N3X21wdSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIxMzAwLAotICByZWdpX2lvcF9zd19zcHUwICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMTQwMCwKLSAgcmVnaV9pb3Bfc3dfc3B1MSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjE1MDAsCi0gIHJlZ2lfaW9wX21wdSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIxNjAwLAotICByZWdpX2lycSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAxYzAwMCwKLSAgcmVnaV9pcnEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwNWMwMDAsCi0gIHJlZ2lfbWFyYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDNlMDAwLAotICByZWdpX21hcmJfYnAwICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAzZTI0MCwKLSAgcmVnaV9tYXJiX2JwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwM2UyODAsCi0gIHJlZ2lfbWFyYl9icDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDNlMmMwLAotICByZWdpX21hcmJfYnAzICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAzZTMwMCwKLSAgcmVnaV9waW5tdXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMzgwMDAsCi0gIHJlZ2lfc2VyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDI2MDAwLAotICByZWdpX3NlcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyODAwMCwKLSAgcmVnaV9zZXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMmEwMDAsCi0gIHJlZ2lfc2VyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDJjMDAwLAotICByZWdpX3NzZXIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMjAwMCwKLSAgcmVnaV9zc2VyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjQwMDAsCi0gIHJlZ2lfc3RyY29wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDMwMDAwLAotICByZWdpX3N0cm11eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAzYTAwMCwKLSAgcmVnaV90aW1lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMWUwMDAsCi0gIHJlZ2lfdGltZXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDVlMDAwLAotICByZWdpX3RyYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDA0MDAwMCwKLX0gcmVnX3Njb3BlX2luc3RhbmNlczsKLSNlbmRpZiAvKiBfX3JlZ19tYXBfaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9od3JlZ3MvcmVnX3Jkd3IuaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvaHdyZWdzL3JlZ19yZHdyLmgKaW5kZXggNDRlNjAyMy4uMjM2ZjkxZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9od3JlZ3MvcmVnX3Jkd3IuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL2h3cmVncy9yZWdfcmR3ci5oCkBAIC0xLDE1ICsxLDE3IEBACi0vKiAkSWQ6IHJlZ19yZHdyLmgsdiAxLjYgMjAwNS8wNC8yNCAxODozMDo1OCBzdGFydmlrIEV4cCAkCi0gKgorLyoKICAqIFJlYWQvd3JpdGUgcmVnaXN0ZXIgbWFjcm9zIHVzZWQgYnkgKl9kZWZzLmgKICAqLwogCiAjaWZuZGVmIHJlZ19yZHdyX2gKICNkZWZpbmUgcmVnX3Jkd3JfaAogCisjaWZuZGVmIFJFR19SRUFECisjZGVmaW5lIFJFR19SRUFEKHR5cGUsIGFkZHIpICgqKCh2b2xhdGlsZSB0eXBlICopIChhZGRyKSkpCisjZW5kaWYKIAotI2RlZmluZSBSRUdfUkVBRCh0eXBlLCBhZGRyKSAqKCh2b2xhdGlsZSB0eXBlICopIChhZGRyKSkKLQorI2lmbmRlZiBSRUdfV1JJVEUKICNkZWZpbmUgUkVHX1dSSVRFKHR5cGUsIGFkZHIsIHZhbCkgXAogICAgZG8geyAqKCh2b2xhdGlsZSB0eXBlICopIChhZGRyKSkgPSAodmFsKTsgfSB3aGlsZSgwKQorI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9od3JlZ3MvdGltZXJfZGVmcy5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9od3JlZ3MvdGltZXJfZGVmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGM4Yzg5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvaHdyZWdzL3RpbWVyX2RlZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0jaWZuZGVmIF9fdGltZXJfZGVmc19oCi0jZGVmaW5lIF9fdGltZXJfZGVmc19oCi0KLS8qCi0gKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCi0gKiAgIGZpbGU6ICAgICAgICAgICAuLi8uLi9pbnN0L3RpbWVyL3J0bC90aW1lcl9yZWdzLnIKLSAqICAgICBpZDogICAgICAgICAgIHRpbWVyX3JlZ3Mucix2IDEuNyAyMDAzLzAzLzExIDExOjE2OjU5IHBlcnogRXhwCi0gKiAgICAgbGFzdCBtb2RmaWVkOiBNb24gQXByIDExIDE2OjA5OjUzIDIwMDUKLSAqCi0gKiAgIGJ5IC9uL2FzaWMvZGVzaWduL3Rvb2xzL3JkZXNjL3NyYy9yZGVzMmMgLS1vdXRmaWxlIHRpbWVyX2RlZnMuaCAuLi8uLi9pbnN0L3RpbWVyL3J0bC90aW1lcl9yZWdzLnIKLSAqICAgICAgaWQ6ICRJZDogdGltZXJfZGVmcy5oLHYgMS42IDIwMDUvMDQvMjQgMTg6MzA6NTggc3RhcnZpayBFeHAgJAotICogQW55IGNoYW5nZXMgaGVyZSB3aWxsIGJlIGxvc3QuCi0gKgotICogLSotIGJ1ZmZlci1yZWFkLW9ubHk6IHQgLSotCi0gKi8KLS8qIE1haW4gYWNjZXNzIG1hY3JvcyAqLwotI2lmbmRlZiBSRUdfUkQKLSNkZWZpbmUgUkVHX1JEKCBzY29wZSwgaW5zdCwgcmVnICkgXAotICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAotICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKLSNlbmRpZgotCi0jaWZuZGVmIFJFR19XUgotI2RlZmluZSBSRUdfV1IoIHNjb3BlLCBpbnN0LCByZWcsIHZhbCApIFwKLSAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCi0gICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCi0jZW5kaWYKLQotI2lmbmRlZiBSRUdfUkRfVkVDVAotI2RlZmluZSBSRUdfUkRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCi0gIFJFR19SRUFEKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCi0gICAgICAgICAgICAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCi0JICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKLSNlbmRpZgotCi0jaWZuZGVmIFJFR19XUl9WRUNUCi0jZGVmaW5lIFJFR19XUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAotICBSRUdfV1JJVEUoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKLSAgICAgICAgICAgICAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCi0JICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQotI2VuZGlmCi0KLSNpZm5kZWYgUkVHX1JEX0lOVAotI2RlZmluZSBSRUdfUkRfSU5UKCBzY29wZSwgaW5zdCwgcmVnICkgXAotICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQotI2VuZGlmCi0KLSNpZm5kZWYgUkVHX1dSX0lOVAotI2RlZmluZSBSRUdfV1JfSU5UKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCi0gIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKLSNlbmRpZgotCi0jaWZuZGVmIFJFR19SRF9JTlRfVkVDVAotI2RlZmluZSBSRUdfUkRfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAotICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCi0JICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKLSNlbmRpZgotCi0jaWZuZGVmIFJFR19XUl9JTlRfVkVDVAotI2RlZmluZSBSRUdfV1JfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4LCB2YWwgKSBcCi0gIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCi0JICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQotI2VuZGlmCi0KLSNpZm5kZWYgUkVHX1RZUEVfQ09OVgotI2RlZmluZSBSRUdfVFlQRV9DT05WKCB0eXBlLCBvcmd0eXBlLCB2YWwgKSBcCi0gICggeyB1bmlvbiB7IG9yZ3R5cGUgbzsgdHlwZSBuOyB9IHI7IHIubyA9IHZhbDsgci5uOyB9ICkKLSNlbmRpZgotCi0jaWZuZGVmIHJlZ19wYWdlX3NpemUKLSNkZWZpbmUgcmVnX3BhZ2Vfc2l6ZSA4MTkyCi0jZW5kaWYKLQotI2lmbmRlZiBSRUdfQUREUgotI2RlZmluZSBSRUdfQUREUiggc2NvcGUsIGluc3QsIHJlZyApIFwKLSAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQotI2VuZGlmCi0KLSNpZm5kZWYgUkVHX0FERFJfVkVDVAotI2RlZmluZSBSRUdfQUREUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKLSAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCi0gICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQotI2VuZGlmCi0KLS8qIEMtY29kZSBmb3IgcmVnaXN0ZXIgc2NvcGUgdGltZXIgKi8KLQotLyogUmVnaXN0ZXIgcndfdG1yMF9kaXYsIHNjb3BlIHRpbWVyLCB0eXBlIHJ3ICovCi10eXBlZGVmIHVuc2lnbmVkIGludCByZWdfdGltZXJfcndfdG1yMF9kaXY7Ci0jZGVmaW5lIFJFR19SRF9BRERSX3RpbWVyX3J3X3RtcjBfZGl2IDAKLSNkZWZpbmUgUkVHX1dSX0FERFJfdGltZXJfcndfdG1yMF9kaXYgMAotCi0vKiBSZWdpc3RlciByX3RtcjBfZGF0YSwgc2NvcGUgdGltZXIsIHR5cGUgciAqLwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVnX3RpbWVyX3JfdG1yMF9kYXRhOwotI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yX3RtcjBfZGF0YSA0Ci0KLS8qIFJlZ2lzdGVyIHJ3X3RtcjBfY3RybCwgc2NvcGUgdGltZXIsIHR5cGUgcncgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgaW50IG9wICAgOiAyOwotICB1bnNpZ25lZCBpbnQgZnJlcSA6IDM7Ci0gIHVuc2lnbmVkIGludCBkdW1teTEgOiAyNzsKLX0gcmVnX3RpbWVyX3J3X3RtcjBfY3RybDsKLSNkZWZpbmUgUkVHX1JEX0FERFJfdGltZXJfcndfdG1yMF9jdHJsIDgKLSNkZWZpbmUgUkVHX1dSX0FERFJfdGltZXJfcndfdG1yMF9jdHJsIDgKLQotLyogUmVnaXN0ZXIgcndfdG1yMV9kaXYsIHNjb3BlIHRpbWVyLCB0eXBlIHJ3ICovCi10eXBlZGVmIHVuc2lnbmVkIGludCByZWdfdGltZXJfcndfdG1yMV9kaXY7Ci0jZGVmaW5lIFJFR19SRF9BRERSX3RpbWVyX3J3X3RtcjFfZGl2IDE2Ci0jZGVmaW5lIFJFR19XUl9BRERSX3RpbWVyX3J3X3RtcjFfZGl2IDE2Ci0KLS8qIFJlZ2lzdGVyIHJfdG1yMV9kYXRhLCBzY29wZSB0aW1lciwgdHlwZSByICovCi10eXBlZGVmIHVuc2lnbmVkIGludCByZWdfdGltZXJfcl90bXIxX2RhdGE7Ci0jZGVmaW5lIFJFR19SRF9BRERSX3RpbWVyX3JfdG1yMV9kYXRhIDIwCi0KLS8qIFJlZ2lzdGVyIHJ3X3RtcjFfY3RybCwgc2NvcGUgdGltZXIsIHR5cGUgcncgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgaW50IG9wICAgOiAyOwotICB1bnNpZ25lZCBpbnQgZnJlcSA6IDM7Ci0gIHVuc2lnbmVkIGludCBkdW1teTEgOiAyNzsKLX0gcmVnX3RpbWVyX3J3X3RtcjFfY3RybDsKLSNkZWZpbmUgUkVHX1JEX0FERFJfdGltZXJfcndfdG1yMV9jdHJsIDI0Ci0jZGVmaW5lIFJFR19XUl9BRERSX3RpbWVyX3J3X3RtcjFfY3RybCAyNAotCi0vKiBSZWdpc3RlciByc19jbnRfZGF0YSwgc2NvcGUgdGltZXIsIHR5cGUgcnMgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgaW50IHRtciA6IDI0OwotICB1bnNpZ25lZCBpbnQgY250IDogODsKLX0gcmVnX3RpbWVyX3JzX2NudF9kYXRhOwotI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yc19jbnRfZGF0YSAzMgotCi0vKiBSZWdpc3RlciByX2NudF9kYXRhLCBzY29wZSB0aW1lciwgdHlwZSByICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGludCB0bXIgOiAyNDsKLSAgdW5zaWduZWQgaW50IGNudCA6IDg7Ci19IHJlZ190aW1lcl9yX2NudF9kYXRhOwotI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yX2NudF9kYXRhIDM2Ci0KLS8qIFJlZ2lzdGVyIHJ3X2NudF9jZmcsIHNjb3BlIHRpbWVyLCB0eXBlIHJ3ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGludCBjbGsgOiAyOwotICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMzA7Ci19IHJlZ190aW1lcl9yd19jbnRfY2ZnOwotI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yd19jbnRfY2ZnIDQwCi0jZGVmaW5lIFJFR19XUl9BRERSX3RpbWVyX3J3X2NudF9jZmcgNDAKLQotLyogUmVnaXN0ZXIgcndfdHJpZywgc2NvcGUgdGltZXIsIHR5cGUgcncgKi8KLXR5cGVkZWYgdW5zaWduZWQgaW50IHJlZ190aW1lcl9yd190cmlnOwotI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yd190cmlnIDQ4Ci0jZGVmaW5lIFJFR19XUl9BRERSX3RpbWVyX3J3X3RyaWcgNDgKLQotLyogUmVnaXN0ZXIgcndfdHJpZ19jZmcsIHNjb3BlIHRpbWVyLCB0eXBlIHJ3ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGludCB0bXIgOiAyOwotICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMzA7Ci19IHJlZ190aW1lcl9yd190cmlnX2NmZzsKLSNkZWZpbmUgUkVHX1JEX0FERFJfdGltZXJfcndfdHJpZ19jZmcgNTIKLSNkZWZpbmUgUkVHX1dSX0FERFJfdGltZXJfcndfdHJpZ19jZmcgNTIKLQotLyogUmVnaXN0ZXIgcl90aW1lLCBzY29wZSB0aW1lciwgdHlwZSByICovCi10eXBlZGVmIHVuc2lnbmVkIGludCByZWdfdGltZXJfcl90aW1lOwotI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yX3RpbWUgNTYKLQotLyogUmVnaXN0ZXIgcndfb3V0LCBzY29wZSB0aW1lciwgdHlwZSBydyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBpbnQgdG1yIDogMjsKLSAgdW5zaWduZWQgaW50IGR1bW15MSA6IDMwOwotfSByZWdfdGltZXJfcndfb3V0OwotI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yd19vdXQgNjAKLSNkZWZpbmUgUkVHX1dSX0FERFJfdGltZXJfcndfb3V0IDYwCi0KLS8qIFJlZ2lzdGVyIHJ3X3dkX2N0cmwsIHNjb3BlIHRpbWVyLCB0eXBlIHJ3ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGludCBjbnQgOiA4OwotICB1bnNpZ25lZCBpbnQgY21kIDogMTsKLSAgdW5zaWduZWQgaW50IGtleSA6IDc7Ci0gIHVuc2lnbmVkIGludCBkdW1teTEgOiAxNjsKLX0gcmVnX3RpbWVyX3J3X3dkX2N0cmw7Ci0jZGVmaW5lIFJFR19SRF9BRERSX3RpbWVyX3J3X3dkX2N0cmwgNjQKLSNkZWZpbmUgUkVHX1dSX0FERFJfdGltZXJfcndfd2RfY3RybCA2NAotCi0vKiBSZWdpc3RlciByX3dkX3N0YXQsIHNjb3BlIHRpbWVyLCB0eXBlIHIgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgaW50IGNudCA6IDg7Ci0gIHVuc2lnbmVkIGludCBjbWQgOiAxOwotICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjM7Ci19IHJlZ190aW1lcl9yX3dkX3N0YXQ7Ci0jZGVmaW5lIFJFR19SRF9BRERSX3RpbWVyX3Jfd2Rfc3RhdCA2OAotCi0vKiBSZWdpc3RlciByd19pbnRyX21hc2ssIHNjb3BlIHRpbWVyLCB0eXBlIHJ3ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGludCB0bXIwIDogMTsKLSAgdW5zaWduZWQgaW50IHRtcjEgOiAxOwotICB1bnNpZ25lZCBpbnQgY250ICA6IDE7Ci0gIHVuc2lnbmVkIGludCB0cmlnIDogMTsKLSAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI4OwotfSByZWdfdGltZXJfcndfaW50cl9tYXNrOwotI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yd19pbnRyX21hc2sgNzIKLSNkZWZpbmUgUkVHX1dSX0FERFJfdGltZXJfcndfaW50cl9tYXNrIDcyCi0KLS8qIFJlZ2lzdGVyIHJ3X2Fja19pbnRyLCBzY29wZSB0aW1lciwgdHlwZSBydyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBpbnQgdG1yMCA6IDE7Ci0gIHVuc2lnbmVkIGludCB0bXIxIDogMTsKLSAgdW5zaWduZWQgaW50IGNudCAgOiAxOwotICB1bnNpZ25lZCBpbnQgdHJpZyA6IDE7Ci0gIHVuc2lnbmVkIGludCBkdW1teTEgOiAyODsKLX0gcmVnX3RpbWVyX3J3X2Fja19pbnRyOwotI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yd19hY2tfaW50ciA3NgotI2RlZmluZSBSRUdfV1JfQUREUl90aW1lcl9yd19hY2tfaW50ciA3NgotCi0vKiBSZWdpc3RlciByX2ludHIsIHNjb3BlIHRpbWVyLCB0eXBlIHIgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgaW50IHRtcjAgOiAxOwotICB1bnNpZ25lZCBpbnQgdG1yMSA6IDE7Ci0gIHVuc2lnbmVkIGludCBjbnQgIDogMTsKLSAgdW5zaWduZWQgaW50IHRyaWcgOiAxOwotICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjg7Ci19IHJlZ190aW1lcl9yX2ludHI7Ci0jZGVmaW5lIFJFR19SRF9BRERSX3RpbWVyX3JfaW50ciA4MAotCi0vKiBSZWdpc3RlciByX21hc2tlZF9pbnRyLCBzY29wZSB0aW1lciwgdHlwZSByICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGludCB0bXIwIDogMTsKLSAgdW5zaWduZWQgaW50IHRtcjEgOiAxOwotICB1bnNpZ25lZCBpbnQgY250ICA6IDE7Ci0gIHVuc2lnbmVkIGludCB0cmlnIDogMTsKLSAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI4OwotfSByZWdfdGltZXJfcl9tYXNrZWRfaW50cjsKLSNkZWZpbmUgUkVHX1JEX0FERFJfdGltZXJfcl9tYXNrZWRfaW50ciA4NAotCi0vKiBSZWdpc3RlciByd190ZXN0LCBzY29wZSB0aW1lciwgdHlwZSBydyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBpbnQgZGlzIDogMTsKLSAgdW5zaWduZWQgaW50IGVuICA6IDE7Ci0gIHVuc2lnbmVkIGludCBkdW1teTEgOiAzMDsKLX0gcmVnX3RpbWVyX3J3X3Rlc3Q7Ci0jZGVmaW5lIFJFR19SRF9BRERSX3RpbWVyX3J3X3Rlc3QgODgKLSNkZWZpbmUgUkVHX1dSX0FERFJfdGltZXJfcndfdGVzdCA4OAotCi0KLS8qIENvbnN0YW50cyAqLwotZW51bSB7Ci0gIHJlZ2tfdGltZXJfZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAotICByZWdrX3RpbWVyX2YxMDAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNywKLSAgcmVna190aW1lcl9mMjlfNDkzICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDQsCi0gIHJlZ2tfdGltZXJfZjMyICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA1LAotICByZWdrX3RpbWVyX2YzMl83NjggICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNiwKLSAgcmVna190aW1lcl9ob2xkICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCi0gIHJlZ2tfdGltZXJfbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAotICByZWdrX3RpbWVyX25vICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKLSAgcmVna190aW1lcl9vZmYgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCi0gIHJlZ2tfdGltZXJfcnVuICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAotICByZWdrX3RpbWVyX3J3X2NudF9jZmdfZGVmYXVsdCAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKLSAgcmVna190aW1lcl9yd19pbnRyX21hc2tfZGVmYXVsdCAgICAgICAgICA9IDB4MDAwMDAwMDAsCi0gIHJlZ2tfdGltZXJfcndfb3V0X2RlZmF1bHQgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAotICByZWdrX3RpbWVyX3J3X3Rlc3RfZGVmYXVsdCAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKLSAgcmVna190aW1lcl9yd190bXIwX2N0cmxfZGVmYXVsdCAgICAgICAgICA9IDB4MDAwMDAwMDAsCi0gIHJlZ2tfdGltZXJfcndfdG1yMV9jdHJsX2RlZmF1bHQgICAgICAgICAgPSAweDAwMDAwMDAwLAotICByZWdrX3RpbWVyX3J3X3RyaWdfY2ZnX2RlZmF1bHQgICAgICAgICAgID0gMHgwMDAwMDAwMCwKLSAgcmVna190aW1lcl9zdGFydCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCi0gIHJlZ2tfdGltZXJfc3RvcCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAotICByZWdrX3RpbWVyX3RpbWUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKLSAgcmVna190aW1lcl90bXIwICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIsCi0gIHJlZ2tfdGltZXJfdG1yMSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAzLAotICByZWdrX3RpbWVyX3llcyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMQotfTsKLSNlbmRpZiAvKiBfX3RpbWVyX2RlZnNfaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9pby5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9pby5oCmluZGV4IDVlZmU0ZDkuLjZiMzg5MTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL2lvLmgKQEAgLTEsOSArMSwxMCBAQAogI2lmbmRlZiBfQVNNX0FSQ0hfQ1JJU19JT19ICiAjZGVmaW5lIF9BU01fQVJDSF9DUklTX0lPX0gKIAotI2luY2x1ZGUgPGFzbS9hcmNoL2h3cmVncy9yZWdfbWFwLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL3JlZ19yZHdyLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL2dpb19kZWZzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxod3JlZ3MvcmVnX21hcC5oPgorI2luY2x1ZGUgPGh3cmVncy9yZWdfcmR3ci5oPgorI2luY2x1ZGUgPGh3cmVncy9naW9fZGVmcy5oPgogCiBlbnVtIGNyaXN2MzJfaW9fZGlyCiB7CkBAIC0xMywxMCArMTQsMTEgQEAKIAogc3RydWN0IGNyaXN2MzJfaW9wb3J0CiB7Ci0gIHVuc2lnbmVkIGxvbmcqIG9lOwotICB1bnNpZ25lZCBsb25nKiBkYXRhOwotICB1bnNpZ25lZCBsb25nKiBkYXRhX2luOworICB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpvZTsKKyAgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqZGF0YTsKKyAgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqZGF0YV9pbjsKICAgdW5zaWduZWQgaW50IHBpbl9jb3VudDsKKyAgc3BpbmxvY2tfdCBsb2NrOwogfTsKIAogc3RydWN0IGNyaXN2MzJfaW9waW4KQEAgLTM0LDIyICszNiwzNiBAQAogZXh0ZXJuIHN0cnVjdCBjcmlzdjMyX2lvcGluIGNyaXN2MzJfbGVkM19ncmVlbjsKIGV4dGVybiBzdHJ1Y3QgY3Jpc3YzMl9pb3BpbiBjcmlzdjMyX2xlZDNfcmVkOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgY3Jpc3YzMl9pb19zZXQoc3RydWN0IGNyaXN2MzJfaW9waW4qIGlvcGluLAotCQkJICAgaW50IHZhbCkKK2V4dGVybiBzdHJ1Y3QgY3Jpc3YzMl9pb3BpbiBjcmlzdjMyX2xlZF9uZXQwX2dyZWVuOworZXh0ZXJuIHN0cnVjdCBjcmlzdjMyX2lvcGluIGNyaXN2MzJfbGVkX25ldDBfcmVkOworZXh0ZXJuIHN0cnVjdCBjcmlzdjMyX2lvcGluIGNyaXN2MzJfbGVkX25ldDFfZ3JlZW47CitleHRlcm4gc3RydWN0IGNyaXN2MzJfaW9waW4gY3Jpc3YzMl9sZWRfbmV0MV9yZWQ7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcmlzdjMyX2lvX3NldChzdHJ1Y3QgY3Jpc3YzMl9pb3BpbiAqaW9waW4sIGludCB2YWwpCiB7CisJbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9waW4tPnBvcnQtPmxvY2ssIGZsYWdzKTsKKwogCWlmICh2YWwpCiAJCSppb3Bpbi0+cG9ydC0+ZGF0YSB8PSBpb3Bpbi0+Yml0OwogCWVsc2UKIAkJKmlvcGluLT5wb3J0LT5kYXRhICY9IH5pb3Bpbi0+Yml0OworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9waW4tPnBvcnQtPmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNyaXN2MzJfaW9fc2V0X2RpcihzdHJ1Y3QgY3Jpc3YzMl9pb3BpbiogaW9waW4sCiAJCQkgICAgICAgZW51bSBjcmlzdjMyX2lvX2RpciBkaXIpCiB7CisJbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9waW4tPnBvcnQtPmxvY2ssIGZsYWdzKTsKKwogCWlmIChkaXIgPT0gY3Jpc3YzMl9pb19kaXJfaW4pCiAJCSppb3Bpbi0+cG9ydC0+b2UgJj0gfmlvcGluLT5iaXQ7CiAJZWxzZQogCQkqaW9waW4tPnBvcnQtPm9lIHw9IGlvcGluLT5iaXQ7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb3Bpbi0+cG9ydC0+bG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBjcmlzdjMyX2lvX3JkKHN0cnVjdCBjcmlzdjMyX2lvcGluKiBpb3BpbikKQEAgLTYwLDM4ICs3Niw2MSBAQAogaW50IGNyaXN2MzJfaW9fZ2V0KHN0cnVjdCBjcmlzdjMyX2lvcGluKiBpb3BpbiwKICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcG9ydCwgdW5zaWduZWQgaW50IHBpbik7CiBpbnQgY3Jpc3YzMl9pb19nZXRfbmFtZShzdHJ1Y3QgY3Jpc3YzMl9pb3BpbiogaW9waW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogbmFtZSk7CisJCQljb25zdCBjaGFyICpuYW1lKTsKIAotI2RlZmluZSBMRURfT0ZGICAgIDB4MDAKLSNkZWZpbmUgTEVEX0dSRUVOICAweDAxCi0jZGVmaW5lIExFRF9SRUQgICAgMHgwMgotI2RlZmluZSBMRURfT1JBTkdFIChMRURfR1JFRU4gfCBMRURfUkVEKQorI2RlZmluZSBDUklTX0xFRF9PRkYgICAgMHgwMAorI2RlZmluZSBDUklTX0xFRF9HUkVFTiAgMHgwMQorI2RlZmluZSBDUklTX0xFRF9SRUQgICAgMHgwMgorI2RlZmluZSBDUklTX0xFRF9PUkFOR0UgKENSSVNfTEVEX0dSRUVOIHwgQ1JJU19MRURfUkVEKQogCi0jZGVmaW5lIExFRF9ORVRXT1JLX1NFVCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQlMRURfTkVUV09SS19TRVRfRygoeCkgJiBMRURfR1JFRU4pOyBcCi0JCUxFRF9ORVRXT1JLX1NFVF9SKCh4KSAmIExFRF9SRUQpOyAgIFwKKyNpZiAoZGVmaW5lZChDT05GSUdfRVRSQVhfTkJSX0xFRF9HUlBfT05FKSB8fCBkZWZpbmVkKENPTkZJR19FVFJBWF9OQlJfTEVEX0dSUF9UV08pKQorI2RlZmluZSBDUklTX0xFRF9ORVRXT1JLX0dSUDBfU0VUKHgpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJQ1JJU19MRURfTkVUV09SS19HUlAwX1NFVF9HKCh4KSAmIENSSVNfTEVEX0dSRUVOKTsgXAorCQlDUklTX0xFRF9ORVRXT1JLX0dSUDBfU0VUX1IoKHgpICYgQ1JJU19MRURfUkVEKTsgICBcCiAJfSB3aGlsZSAoMCkKLSNkZWZpbmUgTEVEX0FDVElWRV9TRVQoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjZWxzZQorI2RlZmluZSBDUklTX0xFRF9ORVRXT1JLX0dSUDBfU0VUKHgpIHdoaWxlICgwKSB7fQorI2VuZGlmCisKKyNkZWZpbmUgQ1JJU19MRURfTkVUV09SS19HUlAwX1NFVF9HKHgpIFwKKwljcmlzdjMyX2lvX3NldCgmY3Jpc3YzMl9sZWRfbmV0MF9ncmVlbiwgISh4KSk7CisKKyNkZWZpbmUgQ1JJU19MRURfTkVUV09SS19HUlAwX1NFVF9SKHgpIFwKKwljcmlzdjMyX2lvX3NldCgmY3Jpc3YzMl9sZWRfbmV0MF9yZWQsICEoeCkpOworCisjaWYgZGVmaW5lZChDT05GSUdfRVRSQVhfTkJSX0xFRF9HUlBfVFdPKQorI2RlZmluZSBDUklTX0xFRF9ORVRXT1JLX0dSUDFfU0VUKHgpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJQ1JJU19MRURfTkVUV09SS19HUlAxX1NFVF9HKCh4KSAmIENSSVNfTEVEX0dSRUVOKTsgXAorCQlDUklTX0xFRF9ORVRXT1JLX0dSUDFfU0VUX1IoKHgpICYgQ1JJU19MRURfUkVEKTsgICBcCisJfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIENSSVNfTEVEX05FVFdPUktfR1JQMV9TRVQoeCkgd2hpbGUgKDApIHt9CisjZW5kaWYKKworI2RlZmluZSBDUklTX0xFRF9ORVRXT1JLX0dSUDFfU0VUX0coeCkgXAorCWNyaXN2MzJfaW9fc2V0KCZjcmlzdjMyX2xlZF9uZXQxX2dyZWVuLCAhKHgpKTsKKworI2RlZmluZSBDUklTX0xFRF9ORVRXT1JLX0dSUDFfU0VUX1IoeCkgXAorCWNyaXN2MzJfaW9fc2V0KCZjcmlzdjMyX2xlZF9uZXQxX3JlZCwgISh4KSk7CisKKyNkZWZpbmUgQ1JJU19MRURfQUNUSVZFX1NFVCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAlkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJTEVEX0FDVElWRV9TRVRfRygoeCkgJiBMRURfR1JFRU4pOyAgXAotCQlMRURfQUNUSVZFX1NFVF9SKCh4KSAmIExFRF9SRUQpOyAgICBcCisJCUNSSVNfTEVEX0FDVElWRV9TRVRfRygoeCkgJiBDUklTX0xFRF9HUkVFTik7ICBcCisJCUNSSVNfTEVEX0FDVElWRV9TRVRfUigoeCkgJiBDUklTX0xFRF9SRUQpOyAgICBcCiAJfSB3aGlsZSAoMCkKIAotI2RlZmluZSBMRURfTkVUV09SS19TRVRfRyh4KSBcCi0JY3Jpc3YzMl9pb19zZXQoJmNyaXN2MzJfbGVkMV9ncmVlbiwgISh4KSk7Ci0jZGVmaW5lIExFRF9ORVRXT1JLX1NFVF9SKHgpIFwKLQljcmlzdjMyX2lvX3NldCgmY3Jpc3YzMl9sZWQxX3JlZCwgISh4KSk7Ci0jZGVmaW5lIExFRF9BQ1RJVkVfU0VUX0coeCkgXAorI2RlZmluZSBDUklTX0xFRF9BQ1RJVkVfU0VUX0coeCkgXAogCWNyaXN2MzJfaW9fc2V0KCZjcmlzdjMyX2xlZDJfZ3JlZW4sICEoeCkpOwotI2RlZmluZSBMRURfQUNUSVZFX1NFVF9SKHgpIFwKKyNkZWZpbmUgQ1JJU19MRURfQUNUSVZFX1NFVF9SKHgpIFwKIAljcmlzdjMyX2lvX3NldCgmY3Jpc3YzMl9sZWQyX3JlZCwgISh4KSk7Ci0jZGVmaW5lIExFRF9ESVNLX1dSSVRFKHgpIFwKKyNkZWZpbmUgQ1JJU19MRURfRElTS19XUklURSh4KSBcCiAgICAgICAgICBkb3tcCiAJCWNyaXN2MzJfaW9fc2V0KCZjcmlzdjMyX2xlZDNfZ3JlZW4sICEoeCkpOyBcCiAJCWNyaXN2MzJfaW9fc2V0KCZjcmlzdjMyX2xlZDNfcmVkLCAhKHgpKTsgICBcCiAgICAgICAgIH13aGlsZSgwKQotI2RlZmluZSBMRURfRElTS19SRUFEKHgpIFwKKyNkZWZpbmUgQ1JJU19MRURfRElTS19SRUFEKHgpIFwKIAljcmlzdjMyX2lvX3NldCgmY3Jpc3YzMl9sZWQzX2dyZWVuLCAhKHgpKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL2lycS5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9pcnEuaAppbmRleCBiYWM5NGVlLi45ZTRjOWZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvaXJxLmgKQEAgLTEsMTIgKzEsMTcgQEAKICNpZm5kZWYgX0FTTV9BUkNIX0lSUV9ICiAjZGVmaW5lIF9BU01fQVJDSF9JUlFfSAogCi0jaW5jbHVkZSAiaHdyZWdzL2ludHJfdmVjdC5oIgorI2luY2x1ZGUgPGh3cmVncy9pbnRyX3ZlY3QuaD4KIAogLyogTnVtYmVyIG9mIG5vbi1jcHUgaW50ZXJydXB0cy4gKi8KLSNkZWZpbmUgTlJfSVJRUyAweDUwIC8qIEV4Y2VwdGlvbnMgKyBJUlFzICovCi0jZGVmaW5lIE5SX1JFQUxfSVJRUyAweDIwIC8qIElSUXMgKi8KKyNkZWZpbmUgTlJfSVJRUyBOQlJfSU5UUl9WRUNUIC8qIEV4Y2VwdGlvbnMgKyBJUlFzICovCiAjZGVmaW5lIEZJUlNUX0lSUSAweDMxIC8qIEV4Y2VwdGlvbiBudW1iZXIgZm9yIGZpcnN0IElSUSAqLworI2RlZmluZSBOUl9SRUFMX0lSUVMgKE5CUl9JTlRSX1ZFQ1QgLSBGSVJTVF9JUlEpIC8qIElSUXMgKi8KKyNpZiBOUl9SRUFMX0lSUVMgPiAzMgorI2RlZmluZSBNQUNIX0lSUVMgNjQKKyNlbHNlCisjZGVmaW5lIE1BQ0hfSVJRUyAzMgorI2VuZGlmCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAvKiBHbG9iYWwgSVJRIHZlY3Rvci4gKi8KQEAgLTczLDcgKzc4LDcgQEAKICAqIHdoaWNoIHdpbGwgYWNrbm93bGVkZ2UgdGhlIGludGVycnVwdCwgaXMgcnVuLiBUaGUgYWN0dWFsIGJsb2NraW5nIGlzIG1hZGUKICAqIGJ5IGNyaXN2MzJfZG9fSVJRLgogICovCi0jZGVmaW5lIEJVSUxEX0lSUShuciwgbWFzaykJCVwKKyNkZWZpbmUgQlVJTERfSVJRKG5yKQkJICAgICAgICBcCiB2b2lkIElSUV9OQU1FKG5yKTsJCQlcCiBfX2FzbV9fICgJCQkJXAogCSIudGV4dFxuXHQiCQkJXApAQCAtODEsNyArODYsNyBAQAogCVNBVkVfQUxMCQkJXAogCUtHREJfRklYVVAgICAgICAgICAgICAgICAgICAgICAgXAogCSJtb3ZlLmQgIiNuciIsJHIxMFxuXHQiCQlcCi0JIm1vdmUuZCAkc3AsJHIxMlxuXHQiCQlcCisJIm1vdmUuZCAkc3AsICRyMTJcblx0IiAgICAgICAgICBcCiAJImpzciBjcmlzdjMyX2RvX0lSUVxuXHQiICAgICAgIAlcCiAJIm1vdmVxIDEsICRyMTFcblx0IgkJXAogCSJqdW1wIHJldF9mcm9tX2ludHJcblx0IglcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL2p1bGlldHRlLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL2p1bGlldHRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZjgxNzIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9qdWxpZXR0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLSNpZm5kZWYgX0FTTV9KVUxJRVRURV9ICi0jZGVmaW5lIF9BU01fSlVMSUVUVEVfSAotCi0vKiBqdWxpZXR0ZSBfSU9DX1RZUEUsIGJpdHMgOCB0byAxNSBpbiBpb2N0bCBjbWQgKi8KLQotI2RlZmluZSBKVUxJT0NUWVBFIDQyCi0KLS8qIHN1cHBvcnRlZCBpb2N0bCBfSU9DX05SJ3MgKi8KLQotI2RlZmluZSBKVUxTVEFSVERNQSAgICAgIDB4MSAgICAgICAgLyogc3RhcnQgYSBwaWN0dXJlIGFzeW5jaHJvbm91c2x5ICovCi0KLS8qIHNldCBwYXJhbWV0ZXJzICovCi0KLSNkZWZpbmUgU0VUREVGQVVMVCAgICAgICAgMHgyIC8qIENDRC9WSURFTy9TUzFNICovCi0jZGVmaW5lIFNFVFBBUkFNRVRFUlMgICAgIDB4MyAvKiBDQ0QvVklERU8gICAgICAqLwotI2RlZmluZSBTRVRTSVpFICAgICAgICAgICAweDQgLyogQ0NEL1ZJREVPL1NTMU0gKi8KLSNkZWZpbmUgU0VUQ09NUFJFU1NJT04gICAgMHg1IC8qIENDRC9WSURFTy9TUzFNICovCi0jZGVmaW5lIFNFVENPTE9STEVWRUwgICAgIDB4NiAvKiBDQ0QvVklERU8gICAgICAqLwotI2RlZmluZSBTRVRCUklHSFRORVNTICAgICAweDcgLyogQ0NEICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0VUUk9UQVRJT04gICAgICAgMHg4IC8qIENDRCAgICAgICAgICAgICovCi0jZGVmaW5lIFNFVFRFWFQgICAgICAgICAgIDB4OSAvKiBDQ0QvVklERU8vU1MxTSAqLwotI2RlZmluZSBTRVRDTE9DSyAgICAgICAgICAweGEgLyogQ0NEL1ZJREVPL1NTMU0gKi8KLSNkZWZpbmUgU0VUREFURSAgICAgICAgICAgMHhiIC8qIENDRC9WSURFTy9TUzFNICovCi0jZGVmaW5lIFNFVFRJTUVGT1JNQVQgICAgIDB4YyAvKiBDQ0QvVklERU8vU1MxTSAqLwotI2RlZmluZSBTRVREQVRFRk9STUFUICAgICAweGQgLyogICAgIFZJREVPICAgICAgKi8KLSNkZWZpbmUgU0VUVEVYVEFMSUdOTUVOVCAgMHhlIC8qICAgICBWSURFTyAgICAgICovCi0jZGVmaW5lIFNFVEZQUyAgICAgICAgICAgIDB4ZiAvKiBDQ0QvVklERU8vU1MxTSAqLwotI2RlZmluZSBTRVRWR0EgICAgICAgICAgIDB4ZmYgLyogICAgIFZJREVPICAgICAgKi8KLSNkZWZpbmUgU0VUQ09NTUVOVCAgICAgICAweGZlIC8qIENDRC9WSURFTyAgICAgICovCi0KLS8qIGdldCBwYXJhbWV0ZXJzICovCi0KLSNkZWZpbmUgR0VURFJJVkVSVFlQRSAgICAweDEwIC8qIENDRC9WSURFTy9TUzFNICovCi0jZGVmaW5lIEdFVE5CUk9GQ0FNRVJBUyAgMHgxMSAvKiBDQ0QvVklERU8vU1MxTSAqLwotI2RlZmluZSBHRVRQQVJBTUVURVJTICAgIDB4MTIgLyogQ0NEL1ZJREVPL1NTMU0gKi8KLSNkZWZpbmUgR0VUQlVGRkVSU0laRSAgICAweDEzIC8qIENDRC9WSURFTy9TUzFNICovCi0jZGVmaW5lIEdFVFZJREVPVFlQRSAgICAgMHgxNCAvKiAgICAgVklERU8vU1MxTSAqLwotI2RlZmluZSBHRVRWSURFT1NJR05BTCAgIDB4MTUgLyogICAgIFZJREVPICAgICAgKi8KLSNkZWZpbmUgR0VUTU9EVUxBVElPTiAgICAweDE2IC8qICAgICBWSURFTyAgICAgICovCi0jZGVmaW5lIEdFVERDWVZBTFVFUyAgICAgMHhhMCAvKiBDQ0QgICAgICAvU1MxTSAqLwotI2RlZmluZSBHRVREQ1lXSURUSCAgICAgIDB4YTEgLyogQ0NEICAgICAgL1NTMU0gKi8KLSNkZWZpbmUgR0VURENZSEVJR0hUICAgICAweGEyIC8qIENDRCAgICAgIC9TUzFNICovCi0jZGVmaW5lIEdFVFNJWkUgICAgICAgICAgMHhhMyAvKiBDQ0QvVklERU8gICAgICAqLwotI2RlZmluZSBHRVRDT01QUkVTU0lPTiAgIDB4YTQgLyogQ0NEL1ZJREVPICAgICAgKi8KLQotLyogZGV0ZWN0IGFuZCBnZXQgcGFyYW1ldGVycyAqLwotCi0jZGVmaW5lIERFVEVDVE1PRFVMQVRJT04gIDB4MTcgLyogICAgIFZJREVPICAgICAgKi8KLSNkZWZpbmUgREVURUNUVklERU9UWVBFICAgMHgxOCAvKiAgICAgVklERU8gICAgICAqLwotI2RlZmluZSBERVRFQ1RWSURFT1NJR05BTCAweDE5IC8qICAgICBWSURFTyAgICAgICovCi0KLS8qIGNvbmZpZ3VyZSBkZWZhdWx0IHBhcmFtZXRlcnMgKi8KLQotI2RlZmluZSBDT05GSUdVUkVERUZBVUxUICAweDIwIC8qIENDRC9WSURFTy9TUzFNICovCi0jZGVmaW5lIERFRlNJWkUgICAgICAgICAgIDB4MjEgLyogQ0NEL1ZJREVPL1NTMU0gKi8KLSNkZWZpbmUgREVGQ09NUFJFU1NJT04gICAgMHgyMiAvKiBDQ0QvVklERU8vU1MxTSAqLwotI2RlZmluZSBERUZDT0xPUkxFVkVMICAgICAweDIzIC8qIENDRC9WSURFTyAgICAgICovCi0jZGVmaW5lIERFRkJSSUdIVE5FU1MgICAgIDB4MjQgLyogQ0NEICAgICAgICAgICAgKi8KLSNkZWZpbmUgREVGUk9UQVRJT04gICAgICAgMHgyNSAvKiBDQ0QgICAgICAgICAgICAqLwotI2RlZmluZSBERUZXSElURUJBTEFOQ0UgICAweDI2IC8qIENDRCAgICAgICAgICAgICovCi0jZGVmaW5lIERFRkVYUE9TVVJFICAgICAgIDB4MjcgLyogQ0NEICAgICAgICAgICAgKi8KLSNkZWZpbmUgREVGQVVUT0VYUFdJTkRPVyAgMHgyOCAvKiBDQ0QgICAgICAgICAgICAqLwotI2RlZmluZSBERUZURVhUICAgICAgICAgICAweDI5IC8qIENDRC9WSURFTy9TUzFNICovCi0jZGVmaW5lIERFRkNMT0NLICAgICAgICAgIDB4MmEgLyogQ0NEL1ZJREVPL1NTMU0gKi8KLSNkZWZpbmUgREVGREFURSAgICAgICAgICAgMHgyYiAvKiBDQ0QvVklERU8vU1MxTSAqLwotI2RlZmluZSBERUZUSU1FRk9STUFUICAgICAweDJjIC8qIENDRC9WSURFTy9TUzFNICovCi0jZGVmaW5lIERFRkRBVEVGT1JNQVQgICAgIDB4MmQgLyogICAgIFZJREVPICAgICAgKi8KLSNkZWZpbmUgREVGVEVYVEFMSUdOTUVOVCAgMHgyZSAvKiAgICAgVklERU8gICAgICAqLwotI2RlZmluZSBERUZGUFMgICAgICAgICAgICAweDJmIC8qIENDRC9WSURFTy9TUzFNICovCi0jZGVmaW5lIERFRlRFWFRTVFJJTkcgICAgIDB4MzAgLyogQ0NEL1ZJREVPL1NTMU0gKi8KLSNkZWZpbmUgREVGSEVBREVSSU5GTyAgICAgMHgzMSAvKiBDQ0QvVklERU8vU1MxTSAqLwotI2RlZmluZSBERUZXRVhBUiAgICAgICAgICAweDMyIC8qIENDRCAgICAgICAgICAgICovCi0jZGVmaW5lIERFRkxJTkVERUxBWSAgICAgIDB4MzMgLyogQ0NEICAgICAgICAgICAgKi8KLSNkZWZpbmUgREVGRElTQUJMRURWSURFTyAgMHgzNCAvKiAgICAgVklERU8gICAgICAqLwotI2RlZmluZSBERUZWSURFT1RZUEUgICAgICAweDM1IC8qICAgICBWSURFTyAgICAgICovCi0jZGVmaW5lIERFRk1PRFVMQVRJT04gICAgIDB4MzYgLyogICAgIFZJREVPICAgICAgKi8KLSNkZWZpbmUgREVGWE9GRlNFVCAgICAgICAgMHgzNyAvKiAgICAgVklERU8gICAgICAqLwotI2RlZmluZSBERUZZT0ZGU0VUICAgICAgICAweDM4IC8qICAgICBWSURFTyAgICAgICovCi0jZGVmaW5lIERFRllDTU9ERSAgICAgICAgIDB4MzkgLyogICAgIFZJREVPICAgICAgKi8KLSNkZWZpbmUgREVGVkNSTU9ERSAgICAgICAgMHgzYSAvKiAgICAgVklERU8gICAgICAqLwotI2RlZmluZSBERUZTVE9SRURDWVZBTFVFUyAweDNiIC8qIENDRC9WSURFTy9TUzFNICovCi0jZGVmaW5lIERFRldDRFMgICAgICAgICAgIDB4M2MgLyogQ0NEICAgICAgICAgICAgKi8KLSNkZWZpbmUgREVGVkdBICAgICAgICAgICAgMHgzZCAvKiAgICAgVklERU8gICAgICAqLwotI2RlZmluZSBERUZDT01NRU5UICAgICAgICAweDNlIC8qIENDRC9WSURFTyAgICAgICovCi0jZGVmaW5lIERFRkNPTU1FTlRTSVpFICAgIDB4M2YgLyogQ0NEL1ZJREVPICAgICAgKi8KLSNkZWZpbmUgREVGQ09NTUVOVFRFWFQgICAgMHg1MCAvKiBDQ0QvVklERU8gICAgICAqLwotI2RlZmluZSBERUZTVE9SRURDWVRFWFQgICAweDUxIC8qICAgICBWSURFTyAgICAgICovCi0KLQotI2RlZmluZSBKVUxBQk9SVERNQSAgICAgICAweDcwIC8qIEFib3J0IGN1cnJlbnQgRE1BIHRyYW5zZmVyICovCi0KLS8qIGp1bGlldHRlIGdlbmVyYWwgaS9vIHBvcnQgKi8KLQotI2RlZmluZSBKSU9fUkVBREJJVFMgICAgICAweDQwIC8qIHJlYWQgYW5kIHJldHVybiBjdXJyZW50IHBvcnQgYml0cyAqLwotI2RlZmluZSBKSU9fU0VUQklUUyAgICAgICAweDQxIC8qIHNldCBiaXRzIG1hcmtlZCBieSAxIGluIHRoZSBhcmd1bWVudCAqLwotI2RlZmluZSBKSU9fQ0xSQklUUyAgICAgICAweDQyIC8qIGNsciBiaXRzIG1hcmtlZCBieSAxIGluIHRoZSBhcmd1bWVudCAqLwotI2RlZmluZSBKSU9fUkVBRERJUiAgICAgICAweDQzIC8qIHJlYWQgZGlyZWN0aW9uLCAwPWlucHV0IDE9b3V0cHV0ICovCi0jZGVmaW5lIEpJT19TRVRJTlBVVCAgICAgIDB4NDQgLyogc2V0IGRpcmVjdGlvbiwgMD11bmNoYW5nZWQgMT1pbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgY3VycmVudCBkaXIgKi8KLSNkZWZpbmUgSklPX1NFVE9VVFBVVCAgICAgMHg0NSAvKiBzZXQgZGlyZWN0aW9uLCAwPXVuY2hhbmdlZCAxPW91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgY3VycmVudCBkaXIgKi8KLQotLyoqKiogWXVtWXVtIGludGVybmFsIGFkcmVzc2VzICoqKiovCi0KLS8qIEp1bGlldHRlIGJ1ZmZlciBhZGRyZXNzZXMgKi8KLQotI2RlZmluZSBCVUZGRVIxX1ZJREVPICAgMHgxMTAwCi0jZGVmaW5lIEJVRkZFUjJfVklERU8gICAweDI4MDAKLSNkZWZpbmUgQUNEQ19CVUZGX1ZJREVPIDB4MGFhYQotI2RlZmluZSBCVUZGRVIxICAgICAgICAgMHgxNzAwCi0jZGVmaW5lIEJVRkZFUjIgICAgICAgICAweDJiMDEKLSNkZWZpbmUgQUNEQ19CVUZGRVIgICAgIDB4MTIwMAotI2RlZmluZSBCVUZGRVIxX1NTMU0gICAgMHgxMTAwCi0jZGVmaW5lIEJVRkZFUjJfU1MxTSAgICAweDI4MDAKLSNkZWZpbmUgQUNEQ19CVUZGX1NTMU0gIDB4MDkwMAotCi0vKiBKdWxpZXR0ZSBwYXJhbWV0ZXIgbWVtb3J5IGFkZHJlc3NlcyAqLwotCi0jZGVmaW5lIFBBX0JVRkZFUl9DTlQgICAgIDB4M2YwOSAvKiBDQ0QvVklERU8gKi8KLSNkZWZpbmUgUEFfQ0NEX0JVRkZFUiAgICAgMHgzZjEwIC8qIENDRCAgICAgICAqLwotI2RlZmluZSBQQV9WSURFT19CVUZGRVIgICAweDNmMTAgLyogICAgIFZJREVPICovCi0jZGVmaW5lIFBBX0RDVF9CVUZGRVIgICAgIDB4M2YxMSAvKiBDQ0QvVklERU8gKi8KLSNkZWZpbmUgUEFfVEVNUCAgICAgICAgICAgMHgzZjEyIC8qIENDRC9WSURFTyAqLwotI2RlZmluZSBQQV9WSURFT0xJTkVfUkQgICAweDNmMTMgLyogICAgIFZJREVPICovCi0jZGVmaW5lIFBBX1ZJREVPTElORV9XUiAgIDB4M2YxNCAvKiAgICAgVklERU8gKi8KLSNkZWZpbmUgUEFfVklfSERFTEFZMCAgICAgMHgzZjE1IC8qICAgICBWSURFTyAqLwotI2RlZmluZSBQQV9WSV9WREVMQVkwICAgICAweDNmMTYgLyogICAgIFZJREVPICovCi0jZGVmaW5lIFBBX1ZJX0hERUxBWTEgICAgIDB4M2YxNyAvKiAgICAgVklERU8gKi8KLSNkZWZpbmUgUEFfVklfVkRFTEFZMSAgICAgMHgzZjE4IC8qICAgICBWSURFTyAqLwotI2RlZmluZSBQQV9WSV9IREVMQVkyICAgICAweDNmMTkgLyogICAgIFZJREVPICovCi0jZGVmaW5lIFBBX1ZJX1ZERUxBWTIgICAgIDB4M2YxYSAvKiAgICAgVklERU8gKi8KLSNkZWZpbmUgUEFfVklfSERFTEFZMyAgICAgMHgzZjFiIC8qICAgICBWSURFTyAqLwotI2RlZmluZSBQQV9WSV9WREVMQVkzICAgICAweDNmMWMgLyogICAgIFZJREVPICovCi0jZGVmaW5lIFBBX1ZJX0NUUkwgICAgICAgIDB4M2YyMCAvKiAgICAgVklERU8gKi8KLSNkZWZpbmUgUEFfSlBFR19DVFJMICAgICAgMHgzZjIyIC8qIENDRC9WSURFTyAqLwotI2RlZmluZSBQQV9CVUZGRVJfU0laRSAgICAweDNmMjQgLyogQ0NEL1ZJREVPICovCi0jZGVmaW5lIFBBX1BBTF9OVFNDICAgICAgIDB4M2YyNSAvKiAgICAgVklERU8gKi8KLSNkZWZpbmUgUEFfTUFDUk9CTE9DS1MgICAgMHgzZjI2IC8qIENDRC9WSURFTyAqLwotI2RlZmluZSBQQV9DT0xPUiAgICAgICAgICAweDNmMjcgLyogICAgIFZJREVPICovCi0jZGVmaW5lIFBBX01FTUNIMUNOVDIgICAgIDB4M2YyOCAvKiBDQ0QvVklERU8gKi8KLSNkZWZpbmUgUEFfTUVNQ0gxQ05UMyAgICAgMHgzZjI5IC8qICAgICBWSURFTyAqLwotI2RlZmluZSBQQV9NRU1DSDFTVFIyICAgICAweDNmMmEgLyogQ0NEL1ZJREVPICovCi0jZGVmaW5lIFBBX01FTUNIMVNUUjMgICAgIDB4M2YyYiAvKiAgICAgVklERU8gKi8KLSNkZWZpbmUgUEFfQlVGRkVSUyAgICAgICAgMHgzZjJjIC8qIENDRC9WSURFTyAqLwotI2RlZmluZSBQQV9QUk9HUkFNICAgICAgICAweDNmMmQgLyogQ0NEL1ZJREVPICovCi0jZGVmaW5lIFBBX1JPVEFUSU9OICAgICAgIDB4M2YyZSAvKiBDQ0QgICAgICAgKi8KLSNkZWZpbmUgUEFfUEMgICAgICAgICAgICAgMHgzZjMwIC8qIENDRC9WSURFTyAqLwotI2RlZmluZSBQQV9QQzIgICAgICAgICAgICAweDNmMzEgLyogICAgIFZJREVPICovCi0jZGVmaW5lIFBBX09ERF9MSU5FICAgICAgIDB4M2YzMiAvKiAgICAgVklERU8gKi8KLSNkZWZpbmUgUEFfRVhQX0RFTEFZICAgICAgMHgzZjM0IC8qIENDRCAgICAgICAqLwotI2RlZmluZSBQQV9NQUNST0JMT0NLX0NOVCAweDNmMzUgLyogQ0NEL1ZJREVPICovCi0jZGVmaW5lIFBBX0RSQU1fUFRSMV9MICAgIDB4M2YzNiAvKiBDQ0QvVklERU8gKi8KLSNkZWZpbmUgUEFfQ0xQT0JfQ05UICAgICAgMHgzZjM3IC8qIENDRCAgICAgICAqLwotI2RlZmluZSBQQV9EUkFNX1BUUjFfSCAgICAweDNmMzggLyogQ0NEL1ZJREVPICovCi0jZGVmaW5lIFBBX0RSQU1fUFRSMl9MICAgIDB4M2YzYSAvKiAgICAgVklERU8gKi8KLSNkZWZpbmUgUEFfRFJBTV9QVFIyX0ggICAgMHgzZjNjIC8qICAgICBWSURFTyAqLwotI2RlZmluZSBQQV9DQ0RfTElORV9DTlQgICAweDNmM2YgLyogQ0NEICAgICAgICovCi0jZGVmaW5lIFBBX1ZJREVPX0xJTkVfQ05UIDB4M2YzZiAvKiAgICAgVklERU8gKi8KLSNkZWZpbmUgUEFfVEVYVCAgICAgICAgICAgMHgzZjQxIC8qIENDRC9WSURFTyAqLwotI2RlZmluZSBQQV9DQU1FUkFfQ0hBTkdFRCAweDNmNDIgLyogICAgIFZJREVPICovCi0jZGVmaW5lIFBBX1RFWFRBTElHTk1FTlQgIDB4M2Y0MyAvKiAgICAgVklERU8gKi8KLSNkZWZpbmUgUEFfRElTQUJMRUQgICAgICAgMHgzZjQ0IC8qICAgICBWSURFTyAqLwotI2RlZmluZSBQQV9NQUNST0JMT0NLVEVYVCAweDNmNDUgLyogICAgIFZJREVPICovCi0jZGVmaW5lIFBBX1ZHQSAgICAgICAgICAgIDB4M2Y0NiAvKiAgICAgVklERU8gKi8KLSNkZWZpbmUgUEFfWkVSTyAgICAgICAgICAgMHgzZmZlIC8qICAgICBWSURFTyAqLwotI2RlZmluZSBQQV9OVUxMICAgICAgICAgICAweDNmZmYgLyogQ0NEL1ZJREVPICovCi0KLXR5cGVkZWYgZW51bSB7Ci0JanBlZyAgPSAwLAotCWR1bW15ID0gMQotfSByZXF1ZXN0X3R5cGU7Ci0KLXR5cGVkZWYgZW51bSB7Ci0JaHVnZXNpemUgID0gMCwKLQlmdWxsc2l6ZSAgPSAxLAotCWhhbGZzaXplICA9IDIsCi0JZmllbGRzaXplID0gMwotfSBzaXplX3R5cGU7Ci0KLXR5cGVkZWYgZW51bSB7Ci0JbWluICAgICAgID0gMCwKLQlsb3cgICAgICAgPSAxLAotCW1lZGl1bSAgICA9IDIsCi0JaGlnaCAgICAgID0gMywKLQl2ZXJ5X2hpZ2ggPSA0LAotCXZlcnlfbG93ICA9IDUsCi0JcTEgICAgICAgID0gNiwKLQlxMiAgICAgICAgPSA3LAotCXEzICAgICAgICA9IDgsCi0JcTQgICAgICAgID0gOSwKLQlxNSAgICAgICAgPSAxMCwKLQlxNiAgICAgICAgPSAxMQotfSBjb21wcl90eXBlOwotCi10eXBlZGVmIGVudW0gewotCWRlZ18wICAgPSAwLAotCWRlZ18xODAgPSAxLAotCWRlZ185MCAgPSAyLAotCWRlZ18yNzAgPSAzCi19IHJvdGF0aW9uX3R5cGU7Ci0KLXR5cGVkZWYgZW51bSB7Ci0JYXV0b193aGl0ZSAgICA9IDAsCi0JaG9sZCAgICAgICAgICA9IDEsCi0JZml4ZWRfb3V0ZG9vciA9IDIsCi0JZml4ZWRfaW5kb29yICA9IDMsCi0JZml4ZWRfZmx1b3IgICA9IDQKLX0gd2hpdGVfYmFsYW5jZV90eXBlOwotCi10eXBlZGVmIGVudW0gewotCWF1dG9fZXhwICA9IDAsCi0JZml4ZWRfZXhwID0gMQotfSBleHBvc3VyZV90eXBlOwotCi10eXBlZGVmIGVudW0gewotCW5vX3dpbmRvdyA9IDAsCi0JY2VudGVyICAgID0gMSwKLQl0b3AgICAgICAgPSAyLAotCWxvd2VyICAgICA9IDMsCi0JbGVmdCAgICAgID0gNCwKLQlyaWdodCAgICAgPSA1LAotCXNwb3QgICAgICA9IDYsCi0JY3cgICAgICAgID0gNwotfSBleHBfd2luZG93X3R5cGU7Ci0KLXR5cGVkZWYgZW51bSB7Ci0JaF8yNCA9IDAsCi0JaF8xMiA9IDEsCi0JaF8yNFAgPSAyCi19IGhvdXJfdHlwZTsKLQotdHlwZWRlZiBlbnVtIHsKLQlzdGFuZGFyZCA9IDAsCi0JWVlZWV9NTV9ERCA9IDEsCi0JV3d3X01tbV9ERF9ZWVlZID0gMiwKLQlXd3dfRERfTU1fWVlZWSA9IDMKLX0gZGF0ZV90eXBlOwotCi10eXBlZGVmIGVudW0gewotCWxlZnRfYWxpZ24gPSAwLAotCWNlbnRlcl9hbGlnbiA9IDEsCi0JcmlnaHRfYWxpZ24gPSAyCi19IGFsaWdubWVudF90eXBlOwotCi10eXBlZGVmIGVudW0gewotCW9mZiA9IDAsCi0Jb24gID0gMSwKLQlubyAgPSAwLAotCXllcyA9IDEKLX0gZW5hYmxlX3R5cGU7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gICAgICAgICBkaXNhYmxlZCA9IDAsCi0gICAgICAgICBlbmFibGVkICA9IDEsCi0gICAgICAgICBleHRlbmRlZCA9IDIKLX0gY29tbWVudF90eXBlOwotCi10eXBlZGVmIGVudW0gewotCXBhbCAgPSAwLAotCW50c2MgPSAxCi19IHZpZGVvX3R5cGU7Ci0KLXR5cGVkZWYgZW51bSB7Ci0JcGFsX2JnaGlfbnRzY19tICAgICAgICAgICAgICA9IDAsCi0JbnRzY180XzQzXzUwaHpfcGFsXzRfNDNfNjBoeiA9IDEsCi0JcGFsX25fbnRzY180XzQzXzYwaHogICAgICAgICA9IDIsCi0JbnRzY19uX3BhbF9tICAgICAgICAgICAgICAgICA9IDMsCi0Jc2VjYW1fcGFsXzRfNDNfNjBoeiAgICAgICAgICA9IDQKLX0gbW9kdWxhdGlvbl90eXBlOwotCi10eXBlZGVmIGVudW0gewotCWNhbTAgPSAwLAotCWNhbTEgPSAxLAotCWNhbTIgPSAyLAotCWNhbTMgPSAzLAotCXF1YWQgPSAzMgotfSBjYW1lcmFfdHlwZTsKLQotdHlwZWRlZiBlbnVtIHsKLQl2aWRlb19kcml2ZXIgPSAwLAotCWNjZF9kcml2ZXIgICA9IDEKLX0gZHJpdmVyX3R5cGU7Ci0KLXN0cnVjdCBqdWxfcGFyYW0gewotCXJlcXVlc3RfdHlwZSByZXFfdHlwZTsKLQlzaXplX3R5cGUgc2l6ZTsKLQljb21wcl90eXBlIGNvbXByZXNzaW9uOwotCXJvdGF0aW9uX3R5cGUgcm90YXRpb247Ci0JaW50IGNvbG9yX2xldmVsOwotCWludCBicmlnaHRuZXNzOwotCXdoaXRlX2JhbGFuY2VfdHlwZSB3aGl0ZV9iYWxhbmNlOwotCWV4cG9zdXJlX3R5cGUgZXhwb3N1cmU7Ci0gICAgICAgIGV4cF93aW5kb3dfdHlwZSBhdXRvX2V4cF93aW5kb3c7Ci0JaG91cl90eXBlIHRpbWVfZm9ybWF0OwotCWRhdGVfdHlwZSBkYXRlX2Zvcm1hdDsKLQlhbGlnbm1lbnRfdHlwZSB0ZXh0X2FsaWdubWVudDsKLQllbmFibGVfdHlwZSB0ZXh0OwotCWVuYWJsZV90eXBlIGNsb2NrOwotCWVuYWJsZV90eXBlIGRhdGU7Ci0JZW5hYmxlX3R5cGUgZnBzOwotICAgICAgICBlbmFibGVfdHlwZSB2Z2E7Ci0gICAgICAgIGVuYWJsZV90eXBlIGNvbW1lbnQ7Ci19OwotCi1zdHJ1Y3QgdmlkZW9fcGFyYW0gewotCWVuYWJsZV90eXBlIGRpc2FibGVkOwotCW1vZHVsYXRpb25fdHlwZSBtb2R1bGF0aW9uOwotCXZpZGVvX3R5cGUgdmlkZW87Ci0JZW5hYmxlX3R5cGUgc2lnbmFsOwotCWVuYWJsZV90eXBlIHZjcjsKLQlpbnQgeG9mZnNldDsKLQlpbnQgeW9mZnNldDsKLX07Ci0KLS8qIFRoZSBqdWxpZXR0ZV9yZXF1ZXN0IHN0cnVjdHVyZSBpcyB1c2VkIGR1cmluZyB0aGUgSlVMU1RBUlRETUEgYXN5bmNocm9ub3VzCi0gKiBwaWN0dXJlLXRha2luZyBpb2N0bCBjYWxsIGFzIGFuIGFyZ3VtZW50IHRvIHNwZWNpZnkgYSBidWZmZXIgd2hpY2ggd2lsbCBnZXQKLSAqIHRoZSBmaW5hbCBwaWN0dXJlLgotICovCi0KLXN0cnVjdCBqdWxpZXR0ZV9yZXF1ZXN0IHsKLQljaGFyICpidWY7ICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gaG9sZCBwaWN0dXJlIGRhdGEgKi8KLQl1bnNpZ25lZCBpbnQgYnVmbGVuOyAgICAvKiBMZW5ndGggb2YgdGhlIGFib3ZlIGJ1ZmZlciAqLwotCXVuc2lnbmVkIGludCBzaXplOyAgICAgIC8qIFJlc3VsdGluZyBsZW5ndGgsIDAgaWYgdGhlIHBpY3R1cmUgaXMgbm90IHJlYWR5ICovCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9hcmJpdGVyLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvYXJiaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZTlkNmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvYXJiaXRlci5oCkBAIC0wLDAgKzEsMzQgQEAKKyNpZm5kZWYgX0FTTV9DUklTX0FSQ0hfQVJCSVRFUl9ICisjZGVmaW5lIF9BU01fQ1JJU19BUkNIX0FSQklURVJfSAorCisjZGVmaW5lIEVYVF9SRUdJT04gMAorI2RlZmluZSBJTlRfUkVHSU9OIDEKKwordHlwZWRlZiB2b2lkICh3YXRjaF9jYWxsYmFjaykodm9pZCk7CisKK2VudW0geworCWFyYml0ZXJfYWxsX2RtYXMgPSAweDdmZSwKKwlhcmJpdGVyX2NwdSA9IDB4MTgwMCwKKwlhcmJpdGVyX2FsbF9jbGllbnRzID0gMHg3ZmZmCit9OworCitlbnVtIHsKKwlhcmJpdGVyX2Jhcl9hbGxfY2xpZW50cyA9IDB4MWZmCit9OworCitlbnVtIHsKKwlhcmJpdGVyX2FsbF9yZWFkID0gMHg1NSwKKwlhcmJpdGVyX2FsbF93cml0ZSA9IDB4YWEsCisJYXJiaXRlcl9hbGxfYWNjZXNzZXMgPSAweGZmCit9OworCisjZGVmaW5lIE1BUkJfQ0xJRU5UUyhmb29fY2xpLCBiYXJfY2xpKSAoKChiYXJfY2xpKSA8PCAxNikgfCAoZm9vX2NsaSkpCisKK2ludCBjcmlzdjMyX2FyYml0ZXJfYWxsb2NhdGVfYmFuZHdpZHRoKGludCBjbGllbnQsIGludCByZWdpb24sCisJCXVuc2lnbmVkIGxvbmcgYmFuZHdpZHRoKTsKK2ludCBjcmlzdjMyX2FyYml0ZXJfd2F0Y2godW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplLAorCQl1bnNpZ25lZCBsb25nIGNsaWVudHMsIHVuc2lnbmVkIGxvbmcgYWNjZXNzZXMsCisJCXdhdGNoX2NhbGxiYWNrICogY2IpOworaW50IGNyaXN2MzJfYXJiaXRlcl91bndhdGNoKGludCBpZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2RtYS5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2RtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllOGViMTMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvZG1hLmgKQEAgLTAsMCArMSwzMSBAQAorI2lmbmRlZiBfQVNNX0FSQ0hfQ1JJU19ETUFfSAorI2RlZmluZSBfQVNNX0FSQ0hfQ1JJU19ETUFfSAorCisvKiBEZWZpbmVzIGZvciB1c2luZyBhbmQgYWxsb2NhdGluZyBkbWEgY2hhbm5lbHMuICovCisKKyNkZWZpbmUgTUFYX0RNQV9DSEFOTkVMUwkxMiAvKiA4IGFuZCAxMCBub3QgdXNlZC4gKi8KKworZW51bSBkbWFfb3duZXIgeworCWRtYV9ldGgsCisJZG1hX3NlcjAsCisJZG1hX3NlcjEsCisJZG1hX3NlcjIsCisJZG1hX3NlcjMsCisJZG1hX3NlcjQsCisJZG1hX2lvcCwKKwlkbWFfc3NlciwKKwlkbWFfc3RycCwKKwlkbWFfaDI2NCwKKwlkbWFfanBlZworfTsKKworaW50IGNyaXN2MzJfcmVxdWVzdF9kbWEodW5zaWduZWQgaW50IGRtYW5yLCBjb25zdCBjaGFyICpkZXZpY2VfaWQsCisJdW5zaWduZWQgb3B0aW9ucywgdW5zaWduZWQgYmFuZHdpZHRoLCBlbnVtIGRtYV9vd25lciBvd25lcik7Cit2b2lkIGNyaXN2MzJfZnJlZV9kbWEodW5zaWduZWQgaW50IGRtYW5yKTsKKworLyogTWFza3MgdXNlZCBieSBjcmlzdjMyX3JlcXVlc3RfZG1hIG9wdGlvbnM6ICovCisjZGVmaW5lIERNQV9WRVJCT1NFX09OX0VSUk9SIDEKKyNkZWZpbmUgRE1BX1BBTklDX09OX0VSUk9SICgyfERNQV9WRVJCT1NFX09OX0VSUk9SKQorI2RlZmluZSBETUFfSU5UX01FTSA0CisKKyNlbmRpZiAvKiBfQVNNX0FSQ0hfQ1JJU19ETUFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9hc20vY2xrZ2VuX2RlZnNfYXNtLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2FzbS9jbGtnZW5fZGVmc19hc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjg1NWFkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9hc20vY2xrZ2VuX2RlZnNfYXNtLmgKQEAgLTAsMCArMSwxNjQgQEAKKyNpZm5kZWYgX19jbGtnZW5fZGVmc19hc21faAorI2RlZmluZSBfX2Nsa2dlbl9kZWZzX2FzbV9oCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCisgKiAgIGZpbGU6ICAgICAgICAgICBjbGtnZW4ucgorICoKKyAqICAgYnkgLi4vLi4vLi4vdG9vbHMvcmRlc2MvYmluL3JkZXMyYyAtYXNtIC1vdXRmaWxlIGNsa2dlbl9kZWZzX2FzbS5oIGNsa2dlbi5yCisgKiBBbnkgY2hhbmdlcyBoZXJlIHdpbGwgYmUgbG9zdC4KKyAqCisgKiAtKi0gYnVmZmVyLXJlYWQtb25seTogdCAtKi0KKyAqLworCisjaWZuZGVmIFJFR19GSUVMRAorI2RlZmluZSBSRUdfRklFTEQoIHNjb3BlLCByZWcsIGZpZWxkLCB2YWx1ZSApIFwKKwlSRUdfRklFTERfWF8oIHZhbHVlLCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX19sc2IgKQorI2RlZmluZSBSRUdfRklFTERfWF8oIHZhbHVlLCBzaGlmdCApICgodmFsdWUpIDw8IHNoaWZ0KQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1NUQVRFCisjZGVmaW5lIFJFR19TVEFURSggc2NvcGUsIHJlZywgZmllbGQsIHN5bWJvbGljX3ZhbHVlICkgXAorCVJFR19TVEFURV9YXyggcmVna18jI3Njb3BlIyNfIyNzeW1ib2xpY192YWx1ZSwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX1NUQVRFX1hfKCBrLCBzaGlmdCApIChrIDw8IHNoaWZ0KQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX01BU0sKKyNkZWZpbmUgUkVHX01BU0soIHNjb3BlLCByZWcsIGZpZWxkICkgXAorCVJFR19NQVNLX1hfKCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX193aWR0aCwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX01BU0tfWF8oIHdpZHRoLCBsc2IgKSAoKCgxIDw8IHdpZHRoKS0xKSA8PCBsc2IpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfTFNCCisjZGVmaW5lIFJFR19MU0IoIHNjb3BlLCByZWcsIGZpZWxkICkgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQklUCisjZGVmaW5lIFJFR19CSVQoIHNjb3BlLCByZWcsIGZpZWxkICkgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fYml0CisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUgorI2RlZmluZSBSRUdfQUREUiggc2NvcGUsIGluc3QsIHJlZyApIFJFR19BRERSX1hfKGluc3QsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19vZmZzZXQpCisjZGVmaW5lIFJFR19BRERSX1hfKCBpbnN0LCBvZmZzICkgKChpbnN0KSArIG9mZnMpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUl9WRUNUCisjZGVmaW5lIFJFR19BRERSX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorCVJFR19BRERSX1ZFQ1RfWF8oaW5zdCwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX29mZnNldCwgaW5kZXgsIFwKKwkJCSBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNkZWZpbmUgUkVHX0FERFJfVkVDVF9YXyggaW5zdCwgb2ZmcywgaW5kZXgsIHN0cmlkZSApIFwKKwkoKGluc3QpICsgb2ZmcyArIChpbmRleCkgKiBzdHJpZGUpCisjZW5kaWYKKworLyogUmVnaXN0ZXIgcl9ib290c2VsLCBzY29wZSBjbGtnZW4sIHR5cGUgciAqLworI2RlZmluZSByZWdfY2xrZ2VuX3JfYm9vdHNlbF9fX2Jvb3RfbW9kZV9fX2xzYiAwCisjZGVmaW5lIHJlZ19jbGtnZW5fcl9ib290c2VsX19fYm9vdF9tb2RlX19fd2lkdGggNQorI2RlZmluZSByZWdfY2xrZ2VuX3JfYm9vdHNlbF9fX2ludGVybl9tYWluX2Nsa19fX2xzYiA1CisjZGVmaW5lIHJlZ19jbGtnZW5fcl9ib290c2VsX19faW50ZXJuX21haW5fY2xrX19fd2lkdGggMQorI2RlZmluZSByZWdfY2xrZ2VuX3JfYm9vdHNlbF9fX2ludGVybl9tYWluX2Nsa19fX2JpdCA1CisjZGVmaW5lIHJlZ19jbGtnZW5fcl9ib290c2VsX19fZXh0ZXJuX3VzYjJfY2xrX19fbHNiIDYKKyNkZWZpbmUgcmVnX2Nsa2dlbl9yX2Jvb3RzZWxfX19leHRlcm5fdXNiMl9jbGtfX193aWR0aCAxCisjZGVmaW5lIHJlZ19jbGtnZW5fcl9ib290c2VsX19fZXh0ZXJuX3VzYjJfY2xrX19fYml0IDYKKyNkZWZpbmUgcmVnX2Nsa2dlbl9yX2Jvb3RzZWxfb2Zmc2V0IDAKKworLyogUmVnaXN0ZXIgcndfY2xrX2N0cmwsIHNjb3BlIGNsa2dlbiwgdHlwZSBydyAqLworI2RlZmluZSByZWdfY2xrZ2VuX3J3X2Nsa19jdHJsX19fcGxsX19fbHNiIDAKKyNkZWZpbmUgcmVnX2Nsa2dlbl9yd19jbGtfY3RybF9fX3BsbF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2Nsa2dlbl9yd19jbGtfY3RybF9fX3BsbF9fX2JpdCAwCisjZGVmaW5lIHJlZ19jbGtnZW5fcndfY2xrX2N0cmxfX19jcHVfX19sc2IgMQorI2RlZmluZSByZWdfY2xrZ2VuX3J3X2Nsa19jdHJsX19fY3B1X19fd2lkdGggMQorI2RlZmluZSByZWdfY2xrZ2VuX3J3X2Nsa19jdHJsX19fY3B1X19fYml0IDEKKyNkZWZpbmUgcmVnX2Nsa2dlbl9yd19jbGtfY3RybF9fX2lvcF91c2JfX19sc2IgMgorI2RlZmluZSByZWdfY2xrZ2VuX3J3X2Nsa19jdHJsX19faW9wX3VzYl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2Nsa2dlbl9yd19jbGtfY3RybF9fX2lvcF91c2JfX19iaXQgMgorI2RlZmluZSByZWdfY2xrZ2VuX3J3X2Nsa19jdHJsX19fdmluX19fbHNiIDMKKyNkZWZpbmUgcmVnX2Nsa2dlbl9yd19jbGtfY3RybF9fX3Zpbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2Nsa2dlbl9yd19jbGtfY3RybF9fX3Zpbl9fX2JpdCAzCisjZGVmaW5lIHJlZ19jbGtnZW5fcndfY2xrX2N0cmxfX19zY2xyX19fbHNiIDQKKyNkZWZpbmUgcmVnX2Nsa2dlbl9yd19jbGtfY3RybF9fX3NjbHJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19jbGtnZW5fcndfY2xrX2N0cmxfX19zY2xyX19fYml0IDQKKyNkZWZpbmUgcmVnX2Nsa2dlbl9yd19jbGtfY3RybF9fX2gyNjRfX19sc2IgNQorI2RlZmluZSByZWdfY2xrZ2VuX3J3X2Nsa19jdHJsX19faDI2NF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2Nsa2dlbl9yd19jbGtfY3RybF9fX2gyNjRfX19iaXQgNQorI2RlZmluZSByZWdfY2xrZ2VuX3J3X2Nsa19jdHJsX19fZGRyMl9fX2xzYiA2CisjZGVmaW5lIHJlZ19jbGtnZW5fcndfY2xrX2N0cmxfX19kZHIyX19fd2lkdGggMQorI2RlZmluZSByZWdfY2xrZ2VuX3J3X2Nsa19jdHJsX19fZGRyMl9fX2JpdCA2CisjZGVmaW5lIHJlZ19jbGtnZW5fcndfY2xrX2N0cmxfX192b3V0X2hpc3RfX19sc2IgNworI2RlZmluZSByZWdfY2xrZ2VuX3J3X2Nsa19jdHJsX19fdm91dF9oaXN0X19fd2lkdGggMQorI2RlZmluZSByZWdfY2xrZ2VuX3J3X2Nsa19jdHJsX19fdm91dF9oaXN0X19fYml0IDcKKyNkZWZpbmUgcmVnX2Nsa2dlbl9yd19jbGtfY3RybF9fX2V0aF9fX2xzYiA4CisjZGVmaW5lIHJlZ19jbGtnZW5fcndfY2xrX2N0cmxfX19ldGhfX193aWR0aCAxCisjZGVmaW5lIHJlZ19jbGtnZW5fcndfY2xrX2N0cmxfX19ldGhfX19iaXQgOAorI2RlZmluZSByZWdfY2xrZ2VuX3J3X2Nsa19jdHJsX19fY2NkX3RnXzIwMF9fX2xzYiA5CisjZGVmaW5lIHJlZ19jbGtnZW5fcndfY2xrX2N0cmxfX19jY2RfdGdfMjAwX19fd2lkdGggMQorI2RlZmluZSByZWdfY2xrZ2VuX3J3X2Nsa19jdHJsX19fY2NkX3RnXzIwMF9fX2JpdCA5CisjZGVmaW5lIHJlZ19jbGtnZW5fcndfY2xrX2N0cmxfX19kbWEwXzFfZXRoX19fbHNiIDEwCisjZGVmaW5lIHJlZ19jbGtnZW5fcndfY2xrX2N0cmxfX19kbWEwXzFfZXRoX19fd2lkdGggMQorI2RlZmluZSByZWdfY2xrZ2VuX3J3X2Nsa19jdHJsX19fZG1hMF8xX2V0aF9fX2JpdCAxMAorI2RlZmluZSByZWdfY2xrZ2VuX3J3X2Nsa19jdHJsX19fY2NkX3RnXzEwMF9fX2xzYiAxMQorI2RlZmluZSByZWdfY2xrZ2VuX3J3X2Nsa19jdHJsX19fY2NkX3RnXzEwMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2Nsa2dlbl9yd19jbGtfY3RybF9fX2NjZF90Z18xMDBfX19iaXQgMTEKKyNkZWZpbmUgcmVnX2Nsa2dlbl9yd19jbGtfY3RybF9fX2pwZWdfX19sc2IgMTIKKyNkZWZpbmUgcmVnX2Nsa2dlbl9yd19jbGtfY3RybF9fX2pwZWdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19jbGtnZW5fcndfY2xrX2N0cmxfX19qcGVnX19fYml0IDEyCisjZGVmaW5lIHJlZ19jbGtnZW5fcndfY2xrX2N0cmxfX19zc2VyX3Nlcl9kbWE2XzdfX19sc2IgMTMKKyNkZWZpbmUgcmVnX2Nsa2dlbl9yd19jbGtfY3RybF9fX3NzZXJfc2VyX2RtYTZfN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2Nsa2dlbl9yd19jbGtfY3RybF9fX3NzZXJfc2VyX2RtYTZfN19fX2JpdCAxMworI2RlZmluZSByZWdfY2xrZ2VuX3J3X2Nsa19jdHJsX19fc3RyZG1hMF8yX3ZpZGVvX19fbHNiIDE0CisjZGVmaW5lIHJlZ19jbGtnZW5fcndfY2xrX2N0cmxfX19zdHJkbWEwXzJfdmlkZW9fX193aWR0aCAxCisjZGVmaW5lIHJlZ19jbGtnZW5fcndfY2xrX2N0cmxfX19zdHJkbWEwXzJfdmlkZW9fX19iaXQgMTQKKyNkZWZpbmUgcmVnX2Nsa2dlbl9yd19jbGtfY3RybF9fX2RtYTJfM19zdHJjb3BfX19sc2IgMTUKKyNkZWZpbmUgcmVnX2Nsa2dlbl9yd19jbGtfY3RybF9fX2RtYTJfM19zdHJjb3BfX193aWR0aCAxCisjZGVmaW5lIHJlZ19jbGtnZW5fcndfY2xrX2N0cmxfX19kbWEyXzNfc3RyY29wX19fYml0IDE1CisjZGVmaW5lIHJlZ19jbGtnZW5fcndfY2xrX2N0cmxfX19kbWE0XzVfaW9wX19fbHNiIDE2CisjZGVmaW5lIHJlZ19jbGtnZW5fcndfY2xrX2N0cmxfX19kbWE0XzVfaW9wX19fd2lkdGggMQorI2RlZmluZSByZWdfY2xrZ2VuX3J3X2Nsa19jdHJsX19fZG1hNF81X2lvcF9fX2JpdCAxNgorI2RlZmluZSByZWdfY2xrZ2VuX3J3X2Nsa19jdHJsX19fZG1hOV8xMV9fX2xzYiAxNworI2RlZmluZSByZWdfY2xrZ2VuX3J3X2Nsa19jdHJsX19fZG1hOV8xMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2Nsa2dlbl9yd19jbGtfY3RybF9fX2RtYTlfMTFfX19iaXQgMTcKKyNkZWZpbmUgcmVnX2Nsa2dlbl9yd19jbGtfY3RybF9fX21lbWFyYl9iYXJfZGRyX19fbHNiIDE4CisjZGVmaW5lIHJlZ19jbGtnZW5fcndfY2xrX2N0cmxfX19tZW1hcmJfYmFyX2Rkcl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2Nsa2dlbl9yd19jbGtfY3RybF9fX21lbWFyYl9iYXJfZGRyX19fYml0IDE4CisjZGVmaW5lIHJlZ19jbGtnZW5fcndfY2xrX2N0cmxfX19zY2xyX2gyNjRfX19sc2IgMTkKKyNkZWZpbmUgcmVnX2Nsa2dlbl9yd19jbGtfY3RybF9fX3NjbHJfaDI2NF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2Nsa2dlbl9yd19jbGtfY3RybF9fX3NjbHJfaDI2NF9fX2JpdCAxOQorI2RlZmluZSByZWdfY2xrZ2VuX3J3X2Nsa19jdHJsX29mZnNldCA0CisKKworLyogQ29uc3RhbnRzICovCisjZGVmaW5lIHJlZ2tfY2xrZ2VuX2V0aDEwMDBfcnggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGMKKyNkZWZpbmUgcmVna19jbGtnZW5fZXRoMTAwMF90eCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwZQorI2RlZmluZSByZWdrX2Nsa2dlbl9ldGgxMDBfcnggICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFkCisjZGVmaW5lIHJlZ2tfY2xrZ2VuX2V0aDEwMF9yeF9oYWxmICAgICAgICAgICAgICAgIDB4MDAwMDAwMWMKKyNkZWZpbmUgcmVna19jbGtnZW5fZXRoMTAwX3R4ICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxZgorI2RlZmluZSByZWdrX2Nsa2dlbl9ldGgxMDBfdHhfaGFsZiAgICAgICAgICAgICAgICAweDAwMDAwMDFlCisjZGVmaW5lIHJlZ2tfY2xrZ2VuX25hbmRfM18yICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19jbGtnZW5fbmFuZF8zXzJfMHgzMCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX2Nsa2dlbl9uYW5kXzNfMl8weDMwX3BsbCAgICAgICAgICAgICAweDAwMDAwMDEyCisjZGVmaW5lIHJlZ2tfY2xrZ2VuX25hbmRfM18yX3BsbCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgcmVna19jbGtnZW5fbmFuZF8zXzMgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2Nsa2dlbl9uYW5kXzNfM18weDMwICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIHJlZ2tfY2xrZ2VuX25hbmRfM18zXzB4MzBfcGxsICAgICAgICAgICAgIDB4MDAwMDAwMTMKKyNkZWZpbmUgcmVna19jbGtnZW5fbmFuZF8zXzNfcGxsICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMQorI2RlZmluZSByZWdrX2Nsa2dlbl9uYW5kXzRfMiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIHJlZ2tfY2xrZ2VuX25hbmRfNF8yXzB4MzAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgcmVna19jbGtnZW5fbmFuZF80XzJfMHgzMF9wbGwgICAgICAgICAgICAgMHgwMDAwMDAxNgorI2RlZmluZSByZWdrX2Nsa2dlbl9uYW5kXzRfMl9wbGwgICAgICAgICAgICAgICAgICAweDAwMDAwMDE0CisjZGVmaW5lIHJlZ2tfY2xrZ2VuX25hbmRfNF8zICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgcmVna19jbGtnZW5fbmFuZF80XzNfMHgzMCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSByZWdrX2Nsa2dlbl9uYW5kXzRfM18weDMwX3BsbCAgICAgICAgICAgICAweDAwMDAwMDE3CisjZGVmaW5lIHJlZ2tfY2xrZ2VuX25hbmRfNF8zX3BsbCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTUKKyNkZWZpbmUgcmVna19jbGtnZW5fbmFuZF81XzIgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSByZWdrX2Nsa2dlbl9uYW5kXzVfMl8weDMwICAgICAgICAgICAgICAgICAweDAwMDAwMDBhCisjZGVmaW5lIHJlZ2tfY2xrZ2VuX25hbmRfNV8yXzB4MzBfcGxsICAgICAgICAgICAgIDB4MDAwMDAwMWEKKyNkZWZpbmUgcmVna19jbGtnZW5fbmFuZF81XzJfcGxsICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxOAorI2RlZmluZSByZWdrX2Nsa2dlbl9uYW5kXzVfMyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA5CisjZGVmaW5lIHJlZ2tfY2xrZ2VuX25hbmRfNV8zXzB4MzAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGIKKyNkZWZpbmUgcmVna19jbGtnZW5fbmFuZF81XzNfMHgzMF9wbGwgICAgICAgICAgICAgMHgwMDAwMDAxYgorI2RlZmluZSByZWdrX2Nsa2dlbl9uYW5kXzVfM19wbGwgICAgICAgICAgICAgICAgICAweDAwMDAwMDE5CisjZGVmaW5lIHJlZ2tfY2xrZ2VuX25vICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19jbGtnZW5fcndfY2xrX2N0cmxfZGVmYXVsdCAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX2Nsa2dlbl9zZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBkCisjZGVmaW5lIHJlZ2tfY2xrZ2VuX3Nlcl9wbGwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgcmVna19jbGtnZW5feWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2VuZGlmIC8qIF9fY2xrZ2VuX2RlZnNfYXNtX2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvYXNtL2RkcjJfZGVmc19hc20uaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvYXNtL2RkcjJfZGVmc19hc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTJiZTAzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9hc20vZGRyMl9kZWZzX2FzbS5oCkBAIC0wLDAgKzEsMjY2IEBACisjaWZuZGVmIF9fZGRyMl9kZWZzX2FzbV9oCisjZGVmaW5lIF9fZGRyMl9kZWZzX2FzbV9oCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCisgKiAgIGZpbGU6ICAgICAgICAgICBkZHIyLnIKKyAqCisgKiAgIGJ5IC4uLy4uLy4uL3Rvb2xzL3JkZXNjL2Jpbi9yZGVzMmMgLWFzbSAtb3V0ZmlsZSBkZHIyX2RlZnNfYXNtLmggZGRyMi5yCisgKiBBbnkgY2hhbmdlcyBoZXJlIHdpbGwgYmUgbG9zdC4KKyAqCisgKiAtKi0gYnVmZmVyLXJlYWQtb25seTogdCAtKi0KKyAqLworCisjaWZuZGVmIFJFR19GSUVMRAorI2RlZmluZSBSRUdfRklFTEQoIHNjb3BlLCByZWcsIGZpZWxkLCB2YWx1ZSApIFwKKwlSRUdfRklFTERfWF8oIHZhbHVlLCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX19sc2IgKQorI2RlZmluZSBSRUdfRklFTERfWF8oIHZhbHVlLCBzaGlmdCApICgodmFsdWUpIDw8IHNoaWZ0KQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1NUQVRFCisjZGVmaW5lIFJFR19TVEFURSggc2NvcGUsIHJlZywgZmllbGQsIHN5bWJvbGljX3ZhbHVlICkgXAorCVJFR19TVEFURV9YXyggcmVna18jI3Njb3BlIyNfIyNzeW1ib2xpY192YWx1ZSwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX1NUQVRFX1hfKCBrLCBzaGlmdCApIChrIDw8IHNoaWZ0KQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX01BU0sKKyNkZWZpbmUgUkVHX01BU0soIHNjb3BlLCByZWcsIGZpZWxkICkgXAorCVJFR19NQVNLX1hfKCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX193aWR0aCwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX01BU0tfWF8oIHdpZHRoLCBsc2IgKSAoKCgxIDw8IHdpZHRoKS0xKSA8PCBsc2IpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfTFNCCisjZGVmaW5lIFJFR19MU0IoIHNjb3BlLCByZWcsIGZpZWxkICkgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQklUCisjZGVmaW5lIFJFR19CSVQoIHNjb3BlLCByZWcsIGZpZWxkICkgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fYml0CisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUgorI2RlZmluZSBSRUdfQUREUiggc2NvcGUsIGluc3QsIHJlZyApIFJFR19BRERSX1hfKGluc3QsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19vZmZzZXQpCisjZGVmaW5lIFJFR19BRERSX1hfKCBpbnN0LCBvZmZzICkgKChpbnN0KSArIG9mZnMpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUl9WRUNUCisjZGVmaW5lIFJFR19BRERSX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorCVJFR19BRERSX1ZFQ1RfWF8oaW5zdCwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX29mZnNldCwgaW5kZXgsIFwKKwkJCSBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNkZWZpbmUgUkVHX0FERFJfVkVDVF9YXyggaW5zdCwgb2ZmcywgaW5kZXgsIHN0cmlkZSApIFwKKwkoKGluc3QpICsgb2ZmcyArIChpbmRleCkgKiBzdHJpZGUpCisjZW5kaWYKKworLyogUmVnaXN0ZXIgcndfY2ZnLCBzY29wZSBkZHIyLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19kZHIyX3J3X2NmZ19fX2NvbF93aWR0aF9fX2xzYiAwCisjZGVmaW5lIHJlZ19kZHIyX3J3X2NmZ19fX2NvbF93aWR0aF9fX3dpZHRoIDQKKyNkZWZpbmUgcmVnX2RkcjJfcndfY2ZnX19fbnJfYmFua3NfX19sc2IgNAorI2RlZmluZSByZWdfZGRyMl9yd19jZmdfX19ucl9iYW5rc19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2RkcjJfcndfY2ZnX19fbnJfYmFua3NfX19iaXQgNAorI2RlZmluZSByZWdfZGRyMl9yd19jZmdfX19id19fX2xzYiA1CisjZGVmaW5lIHJlZ19kZHIyX3J3X2NmZ19fX2J3X19fd2lkdGggMQorI2RlZmluZSByZWdfZGRyMl9yd19jZmdfX19id19fX2JpdCA1CisjZGVmaW5lIHJlZ19kZHIyX3J3X2NmZ19fX25yX3JlZl9fX2xzYiA2CisjZGVmaW5lIHJlZ19kZHIyX3J3X2NmZ19fX25yX3JlZl9fX3dpZHRoIDQKKyNkZWZpbmUgcmVnX2RkcjJfcndfY2ZnX19fcmVmX2ludGVydmFsX19fbHNiIDEwCisjZGVmaW5lIHJlZ19kZHIyX3J3X2NmZ19fX3JlZl9pbnRlcnZhbF9fX3dpZHRoIDExCisjZGVmaW5lIHJlZ19kZHIyX3J3X2NmZ19fX29kdF9jdHJsX19fbHNiIDIxCisjZGVmaW5lIHJlZ19kZHIyX3J3X2NmZ19fX29kdF9jdHJsX19fd2lkdGggMgorI2RlZmluZSByZWdfZGRyMl9yd19jZmdfX19vZHRfbWVtX19fbHNiIDIzCisjZGVmaW5lIHJlZ19kZHIyX3J3X2NmZ19fX29kdF9tZW1fX193aWR0aCAxCisjZGVmaW5lIHJlZ19kZHIyX3J3X2NmZ19fX29kdF9tZW1fX19iaXQgMjMKKyNkZWZpbmUgcmVnX2RkcjJfcndfY2ZnX19faW1wX3N0cmVuZ3RoX19fbHNiIDI0CisjZGVmaW5lIHJlZ19kZHIyX3J3X2NmZ19fX2ltcF9zdHJlbmd0aF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2RkcjJfcndfY2ZnX19faW1wX3N0cmVuZ3RoX19fYml0IDI0CisjZGVmaW5lIHJlZ19kZHIyX3J3X2NmZ19fX2F1dG9faW1wX2NhbF9fX2xzYiAyNQorI2RlZmluZSByZWdfZGRyMl9yd19jZmdfX19hdXRvX2ltcF9jYWxfX193aWR0aCAxCisjZGVmaW5lIHJlZ19kZHIyX3J3X2NmZ19fX2F1dG9faW1wX2NhbF9fX2JpdCAyNQorI2RlZmluZSByZWdfZGRyMl9yd19jZmdfX19pbXBfY2FsX292ZXJyaWRlX19fbHNiIDI2CisjZGVmaW5lIHJlZ19kZHIyX3J3X2NmZ19fX2ltcF9jYWxfb3ZlcnJpZGVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19kZHIyX3J3X2NmZ19fX2ltcF9jYWxfb3ZlcnJpZGVfX19iaXQgMjYKKyNkZWZpbmUgcmVnX2RkcjJfcndfY2ZnX19fZGxsX292ZXJyaWRlX19fbHNiIDI3CisjZGVmaW5lIHJlZ19kZHIyX3J3X2NmZ19fX2RsbF9vdmVycmlkZV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2RkcjJfcndfY2ZnX19fZGxsX292ZXJyaWRlX19fYml0IDI3CisjZGVmaW5lIHJlZ19kZHIyX3J3X2NmZ19vZmZzZXQgMAorCisvKiBSZWdpc3RlciByd190aW1pbmcsIHNjb3BlIGRkcjIsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2RkcjJfcndfdGltaW5nX19fd3JfX19sc2IgMAorI2RlZmluZSByZWdfZGRyMl9yd190aW1pbmdfX193cl9fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2RkcjJfcndfdGltaW5nX19fcmNkX19fbHNiIDMKKyNkZWZpbmUgcmVnX2RkcjJfcndfdGltaW5nX19fcmNkX19fd2lkdGggMworI2RlZmluZSByZWdfZGRyMl9yd190aW1pbmdfX19ycF9fX2xzYiA2CisjZGVmaW5lIHJlZ19kZHIyX3J3X3RpbWluZ19fX3JwX19fd2lkdGggMworI2RlZmluZSByZWdfZGRyMl9yd190aW1pbmdfX19yYXNfX19sc2IgOQorI2RlZmluZSByZWdfZGRyMl9yd190aW1pbmdfX19yYXNfX193aWR0aCA0CisjZGVmaW5lIHJlZ19kZHIyX3J3X3RpbWluZ19fX3JmY19fX2xzYiAxMworI2RlZmluZSByZWdfZGRyMl9yd190aW1pbmdfX19yZmNfX193aWR0aCA3CisjZGVmaW5lIHJlZ19kZHIyX3J3X3RpbWluZ19fX3JjX19fbHNiIDIwCisjZGVmaW5lIHJlZ19kZHIyX3J3X3RpbWluZ19fX3JjX19fd2lkdGggNQorI2RlZmluZSByZWdfZGRyMl9yd190aW1pbmdfX19ydHBfX19sc2IgMjUKKyNkZWZpbmUgcmVnX2RkcjJfcndfdGltaW5nX19fcnRwX19fd2lkdGggMgorI2RlZmluZSByZWdfZGRyMl9yd190aW1pbmdfX19ydHdfX19sc2IgMjcKKyNkZWZpbmUgcmVnX2RkcjJfcndfdGltaW5nX19fcnR3X19fd2lkdGggMworI2RlZmluZSByZWdfZGRyMl9yd190aW1pbmdfX193dHJfX19sc2IgMzAKKyNkZWZpbmUgcmVnX2RkcjJfcndfdGltaW5nX19fd3RyX19fd2lkdGggMgorI2RlZmluZSByZWdfZGRyMl9yd190aW1pbmdfb2Zmc2V0IDQKKworLyogUmVnaXN0ZXIgcndfbGF0ZW5jeSwgc2NvcGUgZGRyMiwgdHlwZSBydyAqLworI2RlZmluZSByZWdfZGRyMl9yd19sYXRlbmN5X19fY2FzX19fbHNiIDAKKyNkZWZpbmUgcmVnX2RkcjJfcndfbGF0ZW5jeV9fX2Nhc19fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2RkcjJfcndfbGF0ZW5jeV9fX2FkZGl0aXZlX19fbHNiIDMKKyNkZWZpbmUgcmVnX2RkcjJfcndfbGF0ZW5jeV9fX2FkZGl0aXZlX19fd2lkdGggMworI2RlZmluZSByZWdfZGRyMl9yd19sYXRlbmN5X29mZnNldCA4CisKKy8qIFJlZ2lzdGVyIHJ3X3BoeV9jZmcsIHNjb3BlIGRkcjIsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2RkcjJfcndfcGh5X2NmZ19fX2VuX19fbHNiIDAKKyNkZWZpbmUgcmVnX2RkcjJfcndfcGh5X2NmZ19fX2VuX19fd2lkdGggMQorI2RlZmluZSByZWdfZGRyMl9yd19waHlfY2ZnX19fZW5fX19iaXQgMAorI2RlZmluZSByZWdfZGRyMl9yd19waHlfY2ZnX29mZnNldCAxMgorCisvKiBSZWdpc3RlciByd19waHlfY3RybCwgc2NvcGUgZGRyMiwgdHlwZSBydyAqLworI2RlZmluZSByZWdfZGRyMl9yd19waHlfY3RybF9fX3JzdF9fX2xzYiAwCisjZGVmaW5lIHJlZ19kZHIyX3J3X3BoeV9jdHJsX19fcnN0X19fd2lkdGggMQorI2RlZmluZSByZWdfZGRyMl9yd19waHlfY3RybF9fX3JzdF9fX2JpdCAwCisjZGVmaW5lIHJlZ19kZHIyX3J3X3BoeV9jdHJsX19fY2FsX3JzdF9fX2xzYiAxCisjZGVmaW5lIHJlZ19kZHIyX3J3X3BoeV9jdHJsX19fY2FsX3JzdF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2RkcjJfcndfcGh5X2N0cmxfX19jYWxfcnN0X19fYml0IDEKKyNkZWZpbmUgcmVnX2RkcjJfcndfcGh5X2N0cmxfX19jYWxfc3RhcnRfX19sc2IgMgorI2RlZmluZSByZWdfZGRyMl9yd19waHlfY3RybF9fX2NhbF9zdGFydF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2RkcjJfcndfcGh5X2N0cmxfX19jYWxfc3RhcnRfX19iaXQgMgorI2RlZmluZSByZWdfZGRyMl9yd19waHlfY3RybF9vZmZzZXQgMTYKKworLyogUmVnaXN0ZXIgcndfY3RybCwgc2NvcGUgZGRyMiwgdHlwZSBydyAqLworI2RlZmluZSByZWdfZGRyMl9yd19jdHJsX19fbXJzX2RhdGFfX19sc2IgMAorI2RlZmluZSByZWdfZGRyMl9yd19jdHJsX19fbXJzX2RhdGFfX193aWR0aCAxNgorI2RlZmluZSByZWdfZGRyMl9yd19jdHJsX19fY21kX19fbHNiIDE2CisjZGVmaW5lIHJlZ19kZHIyX3J3X2N0cmxfX19jbWRfX193aWR0aCA4CisjZGVmaW5lIHJlZ19kZHIyX3J3X2N0cmxfb2Zmc2V0IDIwCisKKy8qIFJlZ2lzdGVyIHJ3X3B3cl9kb3duLCBzY29wZSBkZHIyLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19kZHIyX3J3X3B3cl9kb3duX19fc2VsZl9yZWZfX19sc2IgMAorI2RlZmluZSByZWdfZGRyMl9yd19wd3JfZG93bl9fX3NlbGZfcmVmX19fd2lkdGggMgorI2RlZmluZSByZWdfZGRyMl9yd19wd3JfZG93bl9fX3BoeV9lbl9fX2xzYiAyCisjZGVmaW5lIHJlZ19kZHIyX3J3X3B3cl9kb3duX19fcGh5X2VuX19fd2lkdGggMQorI2RlZmluZSByZWdfZGRyMl9yd19wd3JfZG93bl9fX3BoeV9lbl9fX2JpdCAyCisjZGVmaW5lIHJlZ19kZHIyX3J3X3B3cl9kb3duX29mZnNldCAyNAorCisvKiBSZWdpc3RlciByX3N0YXQsIHNjb3BlIGRkcjIsIHR5cGUgciAqLworI2RlZmluZSByZWdfZGRyMl9yX3N0YXRfX19kbGxfbG9ja19fX2xzYiAwCisjZGVmaW5lIHJlZ19kZHIyX3Jfc3RhdF9fX2RsbF9sb2NrX19fd2lkdGggMQorI2RlZmluZSByZWdfZGRyMl9yX3N0YXRfX19kbGxfbG9ja19fX2JpdCAwCisjZGVmaW5lIHJlZ19kZHIyX3Jfc3RhdF9fX2RsbF9kZWxheV9jb2RlX19fbHNiIDEKKyNkZWZpbmUgcmVnX2RkcjJfcl9zdGF0X19fZGxsX2RlbGF5X2NvZGVfX193aWR0aCA3CisjZGVmaW5lIHJlZ19kZHIyX3Jfc3RhdF9fX2ltcF9jYWxfZG9uZV9fX2xzYiA4CisjZGVmaW5lIHJlZ19kZHIyX3Jfc3RhdF9fX2ltcF9jYWxfZG9uZV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2RkcjJfcl9zdGF0X19faW1wX2NhbF9kb25lX19fYml0IDgKKyNkZWZpbmUgcmVnX2RkcjJfcl9zdGF0X19faW1wX2NhbF9mYXVsdF9fX2xzYiA5CisjZGVmaW5lIHJlZ19kZHIyX3Jfc3RhdF9fX2ltcF9jYWxfZmF1bHRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19kZHIyX3Jfc3RhdF9fX2ltcF9jYWxfZmF1bHRfX19iaXQgOQorI2RlZmluZSByZWdfZGRyMl9yX3N0YXRfX19jYWxfaW1wX3B1X19fbHNiIDEwCisjZGVmaW5lIHJlZ19kZHIyX3Jfc3RhdF9fX2NhbF9pbXBfcHVfX193aWR0aCA0CisjZGVmaW5lIHJlZ19kZHIyX3Jfc3RhdF9fX2NhbF9pbXBfcGRfX19sc2IgMTQKKyNkZWZpbmUgcmVnX2RkcjJfcl9zdGF0X19fY2FsX2ltcF9wZF9fX3dpZHRoIDQKKyNkZWZpbmUgcmVnX2RkcjJfcl9zdGF0X29mZnNldCAyOAorCisvKiBSZWdpc3RlciByd19pbXBfY3RybCwgc2NvcGUgZGRyMiwgdHlwZSBydyAqLworI2RlZmluZSByZWdfZGRyMl9yd19pbXBfY3RybF9fX2ltcF9wdV9fX2xzYiAwCisjZGVmaW5lIHJlZ19kZHIyX3J3X2ltcF9jdHJsX19faW1wX3B1X19fd2lkdGggNAorI2RlZmluZSByZWdfZGRyMl9yd19pbXBfY3RybF9fX2ltcF9wZF9fX2xzYiA0CisjZGVmaW5lIHJlZ19kZHIyX3J3X2ltcF9jdHJsX19faW1wX3BkX19fd2lkdGggNAorI2RlZmluZSByZWdfZGRyMl9yd19pbXBfY3RybF9vZmZzZXQgMzIKKworI2RlZmluZSBTVFJJREVfZGRyMl9yd19kbGxfY3RybCA0CisvKiBSZWdpc3RlciByd19kbGxfY3RybCwgc2NvcGUgZGRyMiwgdHlwZSBydyAqLworI2RlZmluZSByZWdfZGRyMl9yd19kbGxfY3RybF9fX21vZGVfX19sc2IgMAorI2RlZmluZSByZWdfZGRyMl9yd19kbGxfY3RybF9fX21vZGVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19kZHIyX3J3X2RsbF9jdHJsX19fbW9kZV9fX2JpdCAwCisjZGVmaW5lIHJlZ19kZHIyX3J3X2RsbF9jdHJsX19fY2xrX2RlbGF5X19fbHNiIDEKKyNkZWZpbmUgcmVnX2RkcjJfcndfZGxsX2N0cmxfX19jbGtfZGVsYXlfX193aWR0aCA3CisjZGVmaW5lIHJlZ19kZHIyX3J3X2RsbF9jdHJsX29mZnNldCAzNgorCisjZGVmaW5lIFNUUklERV9kZHIyX3J3X2Rxc19kbGxfY3RybCA0CisvKiBSZWdpc3RlciByd19kcXNfZGxsX2N0cmwsIHNjb3BlIGRkcjIsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2RkcjJfcndfZHFzX2RsbF9jdHJsX19fZHFzOTBfZGVsYXlfX19sc2IgMAorI2RlZmluZSByZWdfZGRyMl9yd19kcXNfZGxsX2N0cmxfX19kcXM5MF9kZWxheV9fX3dpZHRoIDcKKyNkZWZpbmUgcmVnX2RkcjJfcndfZHFzX2RsbF9jdHJsX19fZHFzMTgwX2RlbGF5X19fbHNiIDcKKyNkZWZpbmUgcmVnX2RkcjJfcndfZHFzX2RsbF9jdHJsX19fZHFzMTgwX2RlbGF5X19fd2lkdGggNworI2RlZmluZSByZWdfZGRyMl9yd19kcXNfZGxsX2N0cmxfX19kcXMyNzBfZGVsYXlfX19sc2IgMTQKKyNkZWZpbmUgcmVnX2RkcjJfcndfZHFzX2RsbF9jdHJsX19fZHFzMjcwX2RlbGF5X19fd2lkdGggNworI2RlZmluZSByZWdfZGRyMl9yd19kcXNfZGxsX2N0cmxfX19kcXMzNjBfZGVsYXlfX19sc2IgMjEKKyNkZWZpbmUgcmVnX2RkcjJfcndfZHFzX2RsbF9jdHJsX19fZHFzMzYwX2RlbGF5X19fd2lkdGggNworI2RlZmluZSByZWdfZGRyMl9yd19kcXNfZGxsX2N0cmxfb2Zmc2V0IDUyCisKKworLyogQ29uc3RhbnRzICovCisjZGVmaW5lIHJlZ2tfZGRyMl9hbDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19kZHIyX2FsMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSByZWdrX2RkcjJfYWwyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIHJlZ2tfZGRyMl9hbDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTgKKyNkZWZpbmUgcmVna19kZHIyX2FsNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSByZWdrX2RkcjJfYXV0byAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIHJlZ2tfZGRyMl9iYW5rNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19kZHIyX2Jhbms4ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2RkcjJfYmw0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIHJlZ2tfZGRyMl9ibDggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgcmVna19kZHIyX2J0X2lsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSByZWdrX2RkcjJfYnRfc2VxICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfZGRyMl9idzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna19kZHIyX2J3MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2RkcjJfY2FzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIHJlZ2tfZGRyMl9jYXMzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMzAKKyNkZWZpbmUgcmVna19kZHIyX2NhczQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSByZWdrX2RkcjJfY2FzNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDUwCisjZGVmaW5lIHJlZ2tfZGRyMl9kZXNlbGVjdCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwYzAKKyNkZWZpbmUgcmVna19kZHIyX2RpY193ZWFrICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX2RkcjJfZGlyZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfZGRyMl9kaXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19kZHIyX2RsbF9kaXMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2RkcjJfZGxsX2VuICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfZGRyMl9kbGxfcnN0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgcmVna19kZHIyX2VtcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MQorI2RlZmluZSByZWdrX2RkcjJfZW1yczIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgyCisjZGVmaW5lIHJlZ2tfZGRyMl9lbXJzMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODMKKyNkZWZpbmUgcmVna19kZHIyX2Z1bGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2RkcjJfaGlfcmVmX3JhdGUgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIHJlZ2tfZGRyMl9tcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgcmVna19kZHIyX25vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2RkcjJfbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMGI4CisjZGVmaW5lIHJlZ2tfZGRyMl9vY2RfYWRqICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgcmVna19kZHIyX29jZF9kZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDM4MAorI2RlZmluZSByZWdrX2RkcjJfb2NkX2RyaXZlMCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIHJlZ2tfZGRyMl9vY2RfZHJpdmUxICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgcmVna19kZHIyX29jZF9leGl0ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2RkcjJfb2R0X2RpcyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfZGRyMl9vZmZzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19kZHIyX3ByZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA5MAorI2RlZmluZSByZWdrX2RkcjJfcHJlX2FsbCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIHJlZ2tfZGRyMl9wd3JfZG93bl9mYXN0ICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19kZHIyX3B3cl9kb3duX3Nsb3cgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSByZWdrX2RkcjJfcmVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDg4CisjZGVmaW5lIHJlZ2tfZGRyMl9ydHQxNTAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgcmVna19kZHIyX3J0dDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0NAorI2RlZmluZSByZWdrX2RkcjJfcnR0NzUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIHJlZ2tfZGRyMl9yd19jZmdfZGVmYXVsdCAgICAgICAgICAgICAgICAgIDB4MDAxODYwMDAKKyNkZWZpbmUgcmVna19kZHIyX3J3X2RsbF9jdHJsX2RlZmF1bHQgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2RkcjJfcndfZGxsX2N0cmxfc2l6ZSAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIHJlZ2tfZGRyMl9yd19kcXNfZGxsX2N0cmxfZGVmYXVsdCAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19kZHIyX3J3X2Rxc19kbGxfY3RybF9zaXplICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSByZWdrX2RkcjJfcndfbGF0ZW5jeV9kZWZhdWx0ICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfZGRyMl9yd19waHlfY2ZnX2RlZmF1bHQgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19kZHIyX3J3X3B3cl9kb3duX2RlZmF1bHQgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2RkcjJfcndfdGltaW5nX2RlZmF1bHQgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfZGRyMl9zMUdiICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMWEKKyNkZWZpbmUgcmVna19kZHIyX3MyNTZNYiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwZgorI2RlZmluZSByZWdrX2RkcjJfczJHYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDI3CisjZGVmaW5lIHJlZ2tfZGRyMl9zNEdiICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDIKKyNkZWZpbmUgcmVna19kZHIyX3M1MTJNYiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxNQorI2RlZmluZSByZWdrX2RkcjJfdGVtcDBfODUgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNjE4CisjZGVmaW5lIHJlZ2tfZGRyMl90ZW1wODVfOTUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMGMKKyNkZWZpbmUgcmVna19kZHIyX3Rlcm0xNTAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX2RkcjJfdGVybTUwICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIHJlZ2tfZGRyMl90ZXJtNzUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna19kZHIyX3Rlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSByZWdrX2RkcjJfd2VhayAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfZGRyMl93cjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgcmVna19kZHIyX3dyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSByZWdrX2RkcjJfeWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZW5kaWYgLyogX19kZHIyX2RlZnNfYXNtX2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvYXNtL2dpb19kZWZzX2FzbS5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9hc20vZ2lvX2RlZnNfYXNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY2NzE0ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvYXNtL2dpb19kZWZzX2FzbS5oCkBAIC0wLDAgKzEsODQ5IEBACisjaWZuZGVmIF9fZ2lvX2RlZnNfYXNtX2gKKyNkZWZpbmUgX19naW9fZGVmc19hc21faAorCisvKgorICogVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQgZnJvbQorICogICBmaWxlOiAgICAgICAgICAgZ2lvLnIKKyAqIAorICogICBieSAuLi8uLi8uLi90b29scy9yZGVzYy9iaW4vcmRlczJjIC1hc20gLW91dGZpbGUgZ2lvX2RlZnNfYXNtLmggZ2lvLnIKKyAqIEFueSBjaGFuZ2VzIGhlcmUgd2lsbCBiZSBsb3N0LgorICoKKyAqIC0qLSBidWZmZXItcmVhZC1vbmx5OiB0IC0qLQorICovCisKKyNpZm5kZWYgUkVHX0ZJRUxECisjZGVmaW5lIFJFR19GSUVMRCggc2NvcGUsIHJlZywgZmllbGQsIHZhbHVlICkgXAorICBSRUdfRklFTERfWF8oIHZhbHVlLCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX19sc2IgKQorI2RlZmluZSBSRUdfRklFTERfWF8oIHZhbHVlLCBzaGlmdCApICgodmFsdWUpIDw8IHNoaWZ0KQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1NUQVRFCisjZGVmaW5lIFJFR19TVEFURSggc2NvcGUsIHJlZywgZmllbGQsIHN5bWJvbGljX3ZhbHVlICkgXAorICBSRUdfU1RBVEVfWF8oIHJlZ2tfIyNzY29wZSMjXyMjc3ltYm9saWNfdmFsdWUsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19fXyMjZmllbGQjI19fX2xzYiApCisjZGVmaW5lIFJFR19TVEFURV9YXyggaywgc2hpZnQgKSAoayA8PCBzaGlmdCkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19NQVNLCisjZGVmaW5lIFJFR19NQVNLKCBzY29wZSwgcmVnLCBmaWVsZCApIFwKKyAgUkVHX01BU0tfWF8oIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19fXyMjZmllbGQjI19fX3dpZHRoLCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX19sc2IgKQorI2RlZmluZSBSRUdfTUFTS19YXyggd2lkdGgsIGxzYiApICgoKDEgPDwgd2lkdGgpLTEpIDw8IGxzYikKKyNlbmRpZgorCisjaWZuZGVmIFJFR19MU0IKKyNkZWZpbmUgUkVHX0xTQiggc2NvcGUsIHJlZywgZmllbGQgKSByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX19sc2IKKyNlbmRpZgorCisjaWZuZGVmIFJFR19CSVQKKyNkZWZpbmUgUkVHX0JJVCggc2NvcGUsIHJlZywgZmllbGQgKSByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX19iaXQKKyNlbmRpZgorCisjaWZuZGVmIFJFR19BRERSCisjZGVmaW5lIFJFR19BRERSKCBzY29wZSwgaW5zdCwgcmVnICkgUkVHX0FERFJfWF8oaW5zdCwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX29mZnNldCkKKyNkZWZpbmUgUkVHX0FERFJfWF8oIGluc3QsIG9mZnMgKSAoKGluc3QpICsgb2ZmcykKKyNlbmRpZgorCisjaWZuZGVmIFJFR19BRERSX1ZFQ1QKKyNkZWZpbmUgUkVHX0FERFJfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgICAgICAgICBSRUdfQUREUl9WRUNUX1hfKGluc3QsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19vZmZzZXQsIGluZGV4LCBcCisJCQkgU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZGVmaW5lIFJFR19BRERSX1ZFQ1RfWF8oIGluc3QsIG9mZnMsIGluZGV4LCBzdHJpZGUgKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW5zdCkgKyBvZmZzICsgKGluZGV4KSAqIHN0cmlkZSkKKyNlbmRpZgorCisvKiBSZWdpc3RlciByX3BhX2Rpbiwgc2NvcGUgZ2lvLCB0eXBlIHIgKi8KKyNkZWZpbmUgcmVnX2dpb19yX3BhX2Rpbl9fX2RhdGFfX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3JfcGFfZGluX19fZGF0YV9fX3dpZHRoIDMyCisjZGVmaW5lIHJlZ19naW9fcl9wYV9kaW5fb2Zmc2V0IDAKKworLyogUmVnaXN0ZXIgcndfcGFfZG91dCwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19naW9fcndfcGFfZG91dF9fX2RhdGFfX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3J3X3BhX2RvdXRfX19kYXRhX19fd2lkdGggMzIKKyNkZWZpbmUgcmVnX2dpb19yd19wYV9kb3V0X29mZnNldCA0CisKKy8qIFJlZ2lzdGVyIHJ3X3BhX29lLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2dpb19yd19wYV9vZV9fX29lX19fbHNiIDAKKyNkZWZpbmUgcmVnX2dpb19yd19wYV9vZV9fX29lX19fd2lkdGggMzIKKyNkZWZpbmUgcmVnX2dpb19yd19wYV9vZV9vZmZzZXQgOAorCisvKiBSZWdpc3RlciByd19wYV9ieXRlMF9kb3V0LCBzY29wZSBnaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2dpb19yd19wYV9ieXRlMF9kb3V0X19fZGF0YV9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfcGFfYnl0ZTBfZG91dF9fX2RhdGFfX193aWR0aCA4CisjZGVmaW5lIHJlZ19naW9fcndfcGFfYnl0ZTBfZG91dF9vZmZzZXQgMTIKKworLyogUmVnaXN0ZXIgcndfcGFfYnl0ZTBfb2UsIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X3BhX2J5dGUwX29lX19fb2VfX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3J3X3BhX2J5dGUwX29lX19fb2VfX193aWR0aCA4CisjZGVmaW5lIHJlZ19naW9fcndfcGFfYnl0ZTBfb2Vfb2Zmc2V0IDE2CisKKy8qIFJlZ2lzdGVyIHJ3X3BhX2J5dGUxX2RvdXQsIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X3BhX2J5dGUxX2RvdXRfX19kYXRhX19fbHNiIDAKKyNkZWZpbmUgcmVnX2dpb19yd19wYV9ieXRlMV9kb3V0X19fZGF0YV9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX2dpb19yd19wYV9ieXRlMV9kb3V0X29mZnNldCAyMAorCisvKiBSZWdpc3RlciByd19wYV9ieXRlMV9vZSwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19naW9fcndfcGFfYnl0ZTFfb2VfX19vZV9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfcGFfYnl0ZTFfb2VfX19vZV9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX2dpb19yd19wYV9ieXRlMV9vZV9vZmZzZXQgMjQKKworLyogUmVnaXN0ZXIgcndfcGFfYnl0ZTJfZG91dCwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19naW9fcndfcGFfYnl0ZTJfZG91dF9fX2RhdGFfX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3J3X3BhX2J5dGUyX2RvdXRfX19kYXRhX19fd2lkdGggOAorI2RlZmluZSByZWdfZ2lvX3J3X3BhX2J5dGUyX2RvdXRfb2Zmc2V0IDI4CisKKy8qIFJlZ2lzdGVyIHJ3X3BhX2J5dGUyX29lLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2dpb19yd19wYV9ieXRlMl9vZV9fX29lX19fbHNiIDAKKyNkZWZpbmUgcmVnX2dpb19yd19wYV9ieXRlMl9vZV9fX29lX19fd2lkdGggOAorI2RlZmluZSByZWdfZ2lvX3J3X3BhX2J5dGUyX29lX29mZnNldCAzMgorCisvKiBSZWdpc3RlciByd19wYV9ieXRlM19kb3V0LCBzY29wZSBnaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2dpb19yd19wYV9ieXRlM19kb3V0X19fZGF0YV9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfcGFfYnl0ZTNfZG91dF9fX2RhdGFfX193aWR0aCA4CisjZGVmaW5lIHJlZ19naW9fcndfcGFfYnl0ZTNfZG91dF9vZmZzZXQgMzYKKworLyogUmVnaXN0ZXIgcndfcGFfYnl0ZTNfb2UsIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X3BhX2J5dGUzX29lX19fb2VfX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3J3X3BhX2J5dGUzX29lX19fb2VfX193aWR0aCA4CisjZGVmaW5lIHJlZ19naW9fcndfcGFfYnl0ZTNfb2Vfb2Zmc2V0IDQwCisKKy8qIFJlZ2lzdGVyIHJfcGJfZGluLCBzY29wZSBnaW8sIHR5cGUgciAqLworI2RlZmluZSByZWdfZ2lvX3JfcGJfZGluX19fZGF0YV9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcl9wYl9kaW5fX19kYXRhX19fd2lkdGggMzIKKyNkZWZpbmUgcmVnX2dpb19yX3BiX2Rpbl9vZmZzZXQgNDQKKworLyogUmVnaXN0ZXIgcndfcGJfZG91dCwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19naW9fcndfcGJfZG91dF9fX2RhdGFfX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3J3X3BiX2RvdXRfX19kYXRhX19fd2lkdGggMzIKKyNkZWZpbmUgcmVnX2dpb19yd19wYl9kb3V0X29mZnNldCA0OAorCisvKiBSZWdpc3RlciByd19wYl9vZSwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19naW9fcndfcGJfb2VfX19vZV9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfcGJfb2VfX19vZV9fX3dpZHRoIDMyCisjZGVmaW5lIHJlZ19naW9fcndfcGJfb2Vfb2Zmc2V0IDUyCisKKy8qIFJlZ2lzdGVyIHJ3X3BiX2J5dGUwX2RvdXQsIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X3BiX2J5dGUwX2RvdXRfX19kYXRhX19fbHNiIDAKKyNkZWZpbmUgcmVnX2dpb19yd19wYl9ieXRlMF9kb3V0X19fZGF0YV9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX2dpb19yd19wYl9ieXRlMF9kb3V0X29mZnNldCA1NgorCisvKiBSZWdpc3RlciByd19wYl9ieXRlMF9vZSwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19naW9fcndfcGJfYnl0ZTBfb2VfX19vZV9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfcGJfYnl0ZTBfb2VfX19vZV9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX2dpb19yd19wYl9ieXRlMF9vZV9vZmZzZXQgNjAKKworLyogUmVnaXN0ZXIgcndfcGJfYnl0ZTFfZG91dCwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19naW9fcndfcGJfYnl0ZTFfZG91dF9fX2RhdGFfX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3J3X3BiX2J5dGUxX2RvdXRfX19kYXRhX19fd2lkdGggOAorI2RlZmluZSByZWdfZ2lvX3J3X3BiX2J5dGUxX2RvdXRfb2Zmc2V0IDY0CisKKy8qIFJlZ2lzdGVyIHJ3X3BiX2J5dGUxX29lLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2dpb19yd19wYl9ieXRlMV9vZV9fX29lX19fbHNiIDAKKyNkZWZpbmUgcmVnX2dpb19yd19wYl9ieXRlMV9vZV9fX29lX19fd2lkdGggOAorI2RlZmluZSByZWdfZ2lvX3J3X3BiX2J5dGUxX29lX29mZnNldCA2OAorCisvKiBSZWdpc3RlciByd19wYl9ieXRlMl9kb3V0LCBzY29wZSBnaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2dpb19yd19wYl9ieXRlMl9kb3V0X19fZGF0YV9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfcGJfYnl0ZTJfZG91dF9fX2RhdGFfX193aWR0aCA4CisjZGVmaW5lIHJlZ19naW9fcndfcGJfYnl0ZTJfZG91dF9vZmZzZXQgNzIKKworLyogUmVnaXN0ZXIgcndfcGJfYnl0ZTJfb2UsIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X3BiX2J5dGUyX29lX19fb2VfX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3J3X3BiX2J5dGUyX29lX19fb2VfX193aWR0aCA4CisjZGVmaW5lIHJlZ19naW9fcndfcGJfYnl0ZTJfb2Vfb2Zmc2V0IDc2CisKKy8qIFJlZ2lzdGVyIHJ3X3BiX2J5dGUzX2RvdXQsIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X3BiX2J5dGUzX2RvdXRfX19kYXRhX19fbHNiIDAKKyNkZWZpbmUgcmVnX2dpb19yd19wYl9ieXRlM19kb3V0X19fZGF0YV9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX2dpb19yd19wYl9ieXRlM19kb3V0X29mZnNldCA4MAorCisvKiBSZWdpc3RlciByd19wYl9ieXRlM19vZSwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19naW9fcndfcGJfYnl0ZTNfb2VfX19vZV9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfcGJfYnl0ZTNfb2VfX19vZV9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX2dpb19yd19wYl9ieXRlM19vZV9vZmZzZXQgODQKKworLyogUmVnaXN0ZXIgcl9wY19kaW4sIHNjb3BlIGdpbywgdHlwZSByICovCisjZGVmaW5lIHJlZ19naW9fcl9wY19kaW5fX19kYXRhX19fbHNiIDAKKyNkZWZpbmUgcmVnX2dpb19yX3BjX2Rpbl9fX2RhdGFfX193aWR0aCAxNgorI2RlZmluZSByZWdfZ2lvX3JfcGNfZGluX29mZnNldCA4OAorCisvKiBSZWdpc3RlciByd19wY19kb3V0LCBzY29wZSBnaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2dpb19yd19wY19kb3V0X19fZGF0YV9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfcGNfZG91dF9fX2RhdGFfX193aWR0aCAxNgorI2RlZmluZSByZWdfZ2lvX3J3X3BjX2RvdXRfb2Zmc2V0IDkyCisKKy8qIFJlZ2lzdGVyIHJ3X3BjX29lLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2dpb19yd19wY19vZV9fX29lX19fbHNiIDAKKyNkZWZpbmUgcmVnX2dpb19yd19wY19vZV9fX29lX19fd2lkdGggMTYKKyNkZWZpbmUgcmVnX2dpb19yd19wY19vZV9vZmZzZXQgOTYKKworLyogUmVnaXN0ZXIgcndfcGNfYnl0ZTBfZG91dCwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19naW9fcndfcGNfYnl0ZTBfZG91dF9fX2RhdGFfX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3J3X3BjX2J5dGUwX2RvdXRfX19kYXRhX19fd2lkdGggOAorI2RlZmluZSByZWdfZ2lvX3J3X3BjX2J5dGUwX2RvdXRfb2Zmc2V0IDEwMAorCisvKiBSZWdpc3RlciByd19wY19ieXRlMF9vZSwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19naW9fcndfcGNfYnl0ZTBfb2VfX19vZV9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfcGNfYnl0ZTBfb2VfX19vZV9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX2dpb19yd19wY19ieXRlMF9vZV9vZmZzZXQgMTA0CisKKy8qIFJlZ2lzdGVyIHJ3X3BjX2J5dGUxX2RvdXQsIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X3BjX2J5dGUxX2RvdXRfX19kYXRhX19fbHNiIDAKKyNkZWZpbmUgcmVnX2dpb19yd19wY19ieXRlMV9kb3V0X19fZGF0YV9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX2dpb19yd19wY19ieXRlMV9kb3V0X29mZnNldCAxMDgKKworLyogUmVnaXN0ZXIgcndfcGNfYnl0ZTFfb2UsIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X3BjX2J5dGUxX29lX19fb2VfX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3J3X3BjX2J5dGUxX29lX19fb2VfX193aWR0aCA4CisjZGVmaW5lIHJlZ19naW9fcndfcGNfYnl0ZTFfb2Vfb2Zmc2V0IDExMgorCisvKiBSZWdpc3RlciByX3BkX2Rpbiwgc2NvcGUgZ2lvLCB0eXBlIHIgKi8KKyNkZWZpbmUgcmVnX2dpb19yX3BkX2Rpbl9fX2RhdGFfX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3JfcGRfZGluX19fZGF0YV9fX3dpZHRoIDMyCisjZGVmaW5lIHJlZ19naW9fcl9wZF9kaW5fb2Zmc2V0IDExNgorCisvKiBSZWdpc3RlciByd19pbnRyX2NmZywgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9jZmdfX19pbnRyMF9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9jZmdfX19pbnRyMF9fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX2NmZ19fX2ludHIxX19fbHNiIDMKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX2NmZ19fX2ludHIxX19fd2lkdGggMworI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfY2ZnX19faW50cjJfX19sc2IgNgorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfY2ZnX19faW50cjJfX193aWR0aCAzCisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9jZmdfX19pbnRyM19fX2xzYiA5CisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9jZmdfX19pbnRyM19fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX2NmZ19fX2ludHI0X19fbHNiIDEyCisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9jZmdfX19pbnRyNF9fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX2NmZ19fX2ludHI1X19fbHNiIDE1CisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9jZmdfX19pbnRyNV9fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX2NmZ19fX2ludHI2X19fbHNiIDE4CisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9jZmdfX19pbnRyNl9fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX2NmZ19fX2ludHI3X19fbHNiIDIxCisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9jZmdfX19pbnRyN19fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX2NmZ19vZmZzZXQgMTIwCisKKy8qIFJlZ2lzdGVyIHJ3X2ludHJfcGlucywgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9waW5zX19faW50cjBfX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfcGluc19fX2ludHIwX19fd2lkdGggNAorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfcGluc19fX2ludHIxX19fbHNiIDQKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX3BpbnNfX19pbnRyMV9fX3dpZHRoIDQKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX3BpbnNfX19pbnRyMl9fX2xzYiA4CisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9waW5zX19faW50cjJfX193aWR0aCA0CisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9waW5zX19faW50cjNfX19sc2IgMTIKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX3BpbnNfX19pbnRyM19fX3dpZHRoIDQKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX3BpbnNfX19pbnRyNF9fX2xzYiAxNgorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfcGluc19fX2ludHI0X19fd2lkdGggNAorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfcGluc19fX2ludHI1X19fbHNiIDIwCisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9waW5zX19faW50cjVfX193aWR0aCA0CisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9waW5zX19faW50cjZfX19sc2IgMjQKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX3BpbnNfX19pbnRyNl9fX3dpZHRoIDQKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX3BpbnNfX19pbnRyN19fX2xzYiAyOAorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfcGluc19fX2ludHI3X19fd2lkdGggNAorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfcGluc19vZmZzZXQgMTI0CisKKy8qIFJlZ2lzdGVyIHJ3X2ludHJfbWFzaywgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9tYXNrX19faW50cjBfX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfbWFza19fX2ludHIwX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfbWFza19fX2ludHIwX19fYml0IDAKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX21hc2tfX19pbnRyMV9fX2xzYiAxCisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9tYXNrX19faW50cjFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9tYXNrX19faW50cjFfX19iaXQgMQorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfbWFza19fX2ludHIyX19fbHNiIDIKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX21hc2tfX19pbnRyMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX21hc2tfX19pbnRyMl9fX2JpdCAyCisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9tYXNrX19faW50cjNfX19sc2IgMworI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfbWFza19fX2ludHIzX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfbWFza19fX2ludHIzX19fYml0IDMKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX21hc2tfX19pbnRyNF9fX2xzYiA0CisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9tYXNrX19faW50cjRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9tYXNrX19faW50cjRfX19iaXQgNAorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfbWFza19fX2ludHI1X19fbHNiIDUKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX21hc2tfX19pbnRyNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX21hc2tfX19pbnRyNV9fX2JpdCA1CisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9tYXNrX19faW50cjZfX19sc2IgNgorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfbWFza19fX2ludHI2X19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfbWFza19fX2ludHI2X19fYml0IDYKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX21hc2tfX19pbnRyN19fX2xzYiA3CisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9tYXNrX19faW50cjdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9tYXNrX19faW50cjdfX19iaXQgNworI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfbWFza19fX2kyYzBfZG9uZV9fX2xzYiA4CisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9tYXNrX19faTJjMF9kb25lX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfbWFza19fX2kyYzBfZG9uZV9fX2JpdCA4CisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9tYXNrX19faTJjMV9kb25lX19fbHNiIDkKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX21hc2tfX19pMmMxX2RvbmVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9tYXNrX19faTJjMV9kb25lX19fYml0IDkKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX21hc2tfb2Zmc2V0IDEyOAorCisvKiBSZWdpc3RlciByd19hY2tfaW50ciwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19naW9fcndfYWNrX2ludHJfX19pbnRyMF9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfYWNrX2ludHJfX19pbnRyMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19hY2tfaW50cl9fX2ludHIwX19fYml0IDAKKyNkZWZpbmUgcmVnX2dpb19yd19hY2tfaW50cl9fX2ludHIxX19fbHNiIDEKKyNkZWZpbmUgcmVnX2dpb19yd19hY2tfaW50cl9fX2ludHIxX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2Fja19pbnRyX19faW50cjFfX19iaXQgMQorI2RlZmluZSByZWdfZ2lvX3J3X2Fja19pbnRyX19faW50cjJfX19sc2IgMgorI2RlZmluZSByZWdfZ2lvX3J3X2Fja19pbnRyX19faW50cjJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfYWNrX2ludHJfX19pbnRyMl9fX2JpdCAyCisjZGVmaW5lIHJlZ19naW9fcndfYWNrX2ludHJfX19pbnRyM19fX2xzYiAzCisjZGVmaW5lIHJlZ19naW9fcndfYWNrX2ludHJfX19pbnRyM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19hY2tfaW50cl9fX2ludHIzX19fYml0IDMKKyNkZWZpbmUgcmVnX2dpb19yd19hY2tfaW50cl9fX2ludHI0X19fbHNiIDQKKyNkZWZpbmUgcmVnX2dpb19yd19hY2tfaW50cl9fX2ludHI0X19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2Fja19pbnRyX19faW50cjRfX19iaXQgNAorI2RlZmluZSByZWdfZ2lvX3J3X2Fja19pbnRyX19faW50cjVfX19sc2IgNQorI2RlZmluZSByZWdfZ2lvX3J3X2Fja19pbnRyX19faW50cjVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfYWNrX2ludHJfX19pbnRyNV9fX2JpdCA1CisjZGVmaW5lIHJlZ19naW9fcndfYWNrX2ludHJfX19pbnRyNl9fX2xzYiA2CisjZGVmaW5lIHJlZ19naW9fcndfYWNrX2ludHJfX19pbnRyNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19hY2tfaW50cl9fX2ludHI2X19fYml0IDYKKyNkZWZpbmUgcmVnX2dpb19yd19hY2tfaW50cl9fX2ludHI3X19fbHNiIDcKKyNkZWZpbmUgcmVnX2dpb19yd19hY2tfaW50cl9fX2ludHI3X19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2Fja19pbnRyX19faW50cjdfX19iaXQgNworI2RlZmluZSByZWdfZ2lvX3J3X2Fja19pbnRyX19faTJjMF9kb25lX19fbHNiIDgKKyNkZWZpbmUgcmVnX2dpb19yd19hY2tfaW50cl9fX2kyYzBfZG9uZV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19hY2tfaW50cl9fX2kyYzBfZG9uZV9fX2JpdCA4CisjZGVmaW5lIHJlZ19naW9fcndfYWNrX2ludHJfX19pMmMxX2RvbmVfX19sc2IgOQorI2RlZmluZSByZWdfZ2lvX3J3X2Fja19pbnRyX19faTJjMV9kb25lX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2Fja19pbnRyX19faTJjMV9kb25lX19fYml0IDkKKyNkZWZpbmUgcmVnX2dpb19yd19hY2tfaW50cl9vZmZzZXQgMTMyCisKKy8qIFJlZ2lzdGVyIHJfaW50ciwgc2NvcGUgZ2lvLCB0eXBlIHIgKi8KKyNkZWZpbmUgcmVnX2dpb19yX2ludHJfX19pbnRyMF9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcl9pbnRyX19faW50cjBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcl9pbnRyX19faW50cjBfX19iaXQgMAorI2RlZmluZSByZWdfZ2lvX3JfaW50cl9fX2ludHIxX19fbHNiIDEKKyNkZWZpbmUgcmVnX2dpb19yX2ludHJfX19pbnRyMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yX2ludHJfX19pbnRyMV9fX2JpdCAxCisjZGVmaW5lIHJlZ19naW9fcl9pbnRyX19faW50cjJfX19sc2IgMgorI2RlZmluZSByZWdfZ2lvX3JfaW50cl9fX2ludHIyX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3JfaW50cl9fX2ludHIyX19fYml0IDIKKyNkZWZpbmUgcmVnX2dpb19yX2ludHJfX19pbnRyM19fX2xzYiAzCisjZGVmaW5lIHJlZ19naW9fcl9pbnRyX19faW50cjNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcl9pbnRyX19faW50cjNfX19iaXQgMworI2RlZmluZSByZWdfZ2lvX3JfaW50cl9fX2ludHI0X19fbHNiIDQKKyNkZWZpbmUgcmVnX2dpb19yX2ludHJfX19pbnRyNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yX2ludHJfX19pbnRyNF9fX2JpdCA0CisjZGVmaW5lIHJlZ19naW9fcl9pbnRyX19faW50cjVfX19sc2IgNQorI2RlZmluZSByZWdfZ2lvX3JfaW50cl9fX2ludHI1X19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3JfaW50cl9fX2ludHI1X19fYml0IDUKKyNkZWZpbmUgcmVnX2dpb19yX2ludHJfX19pbnRyNl9fX2xzYiA2CisjZGVmaW5lIHJlZ19naW9fcl9pbnRyX19faW50cjZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcl9pbnRyX19faW50cjZfX19iaXQgNgorI2RlZmluZSByZWdfZ2lvX3JfaW50cl9fX2ludHI3X19fbHNiIDcKKyNkZWZpbmUgcmVnX2dpb19yX2ludHJfX19pbnRyN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yX2ludHJfX19pbnRyN19fX2JpdCA3CisjZGVmaW5lIHJlZ19naW9fcl9pbnRyX19faTJjMF9kb25lX19fbHNiIDgKKyNkZWZpbmUgcmVnX2dpb19yX2ludHJfX19pMmMwX2RvbmVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcl9pbnRyX19faTJjMF9kb25lX19fYml0IDgKKyNkZWZpbmUgcmVnX2dpb19yX2ludHJfX19pMmMxX2RvbmVfX19sc2IgOQorI2RlZmluZSByZWdfZ2lvX3JfaW50cl9fX2kyYzFfZG9uZV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yX2ludHJfX19pMmMxX2RvbmVfX19iaXQgOQorI2RlZmluZSByZWdfZ2lvX3JfaW50cl9vZmZzZXQgMTM2CisKKy8qIFJlZ2lzdGVyIHJfbWFza2VkX2ludHIsIHNjb3BlIGdpbywgdHlwZSByICovCisjZGVmaW5lIHJlZ19naW9fcl9tYXNrZWRfaW50cl9fX2ludHIwX19fbHNiIDAKKyNkZWZpbmUgcmVnX2dpb19yX21hc2tlZF9pbnRyX19faW50cjBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcl9tYXNrZWRfaW50cl9fX2ludHIwX19fYml0IDAKKyNkZWZpbmUgcmVnX2dpb19yX21hc2tlZF9pbnRyX19faW50cjFfX19sc2IgMQorI2RlZmluZSByZWdfZ2lvX3JfbWFza2VkX2ludHJfX19pbnRyMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yX21hc2tlZF9pbnRyX19faW50cjFfX19iaXQgMQorI2RlZmluZSByZWdfZ2lvX3JfbWFza2VkX2ludHJfX19pbnRyMl9fX2xzYiAyCisjZGVmaW5lIHJlZ19naW9fcl9tYXNrZWRfaW50cl9fX2ludHIyX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3JfbWFza2VkX2ludHJfX19pbnRyMl9fX2JpdCAyCisjZGVmaW5lIHJlZ19naW9fcl9tYXNrZWRfaW50cl9fX2ludHIzX19fbHNiIDMKKyNkZWZpbmUgcmVnX2dpb19yX21hc2tlZF9pbnRyX19faW50cjNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcl9tYXNrZWRfaW50cl9fX2ludHIzX19fYml0IDMKKyNkZWZpbmUgcmVnX2dpb19yX21hc2tlZF9pbnRyX19faW50cjRfX19sc2IgNAorI2RlZmluZSByZWdfZ2lvX3JfbWFza2VkX2ludHJfX19pbnRyNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yX21hc2tlZF9pbnRyX19faW50cjRfX19iaXQgNAorI2RlZmluZSByZWdfZ2lvX3JfbWFza2VkX2ludHJfX19pbnRyNV9fX2xzYiA1CisjZGVmaW5lIHJlZ19naW9fcl9tYXNrZWRfaW50cl9fX2ludHI1X19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3JfbWFza2VkX2ludHJfX19pbnRyNV9fX2JpdCA1CisjZGVmaW5lIHJlZ19naW9fcl9tYXNrZWRfaW50cl9fX2ludHI2X19fbHNiIDYKKyNkZWZpbmUgcmVnX2dpb19yX21hc2tlZF9pbnRyX19faW50cjZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcl9tYXNrZWRfaW50cl9fX2ludHI2X19fYml0IDYKKyNkZWZpbmUgcmVnX2dpb19yX21hc2tlZF9pbnRyX19faW50cjdfX19sc2IgNworI2RlZmluZSByZWdfZ2lvX3JfbWFza2VkX2ludHJfX19pbnRyN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yX21hc2tlZF9pbnRyX19faW50cjdfX19iaXQgNworI2RlZmluZSByZWdfZ2lvX3JfbWFza2VkX2ludHJfX19pMmMwX2RvbmVfX19sc2IgOAorI2RlZmluZSByZWdfZ2lvX3JfbWFza2VkX2ludHJfX19pMmMwX2RvbmVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcl9tYXNrZWRfaW50cl9fX2kyYzBfZG9uZV9fX2JpdCA4CisjZGVmaW5lIHJlZ19naW9fcl9tYXNrZWRfaW50cl9fX2kyYzFfZG9uZV9fX2xzYiA5CisjZGVmaW5lIHJlZ19naW9fcl9tYXNrZWRfaW50cl9fX2kyYzFfZG9uZV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yX21hc2tlZF9pbnRyX19faTJjMV9kb25lX19fYml0IDkKKyNkZWZpbmUgcmVnX2dpb19yX21hc2tlZF9pbnRyX29mZnNldCAxNDAKKworLyogUmVnaXN0ZXIgcndfaTJjMF9zdGFydCwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9zdGFydF9fX3J1bl9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9zdGFydF9fX3J1bl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMwX3N0YXJ0X19fcnVuX19fYml0IDAKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMwX3N0YXJ0X29mZnNldCAxNDQKKworLyogUmVnaXN0ZXIgcndfaTJjMF9jZmcsIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfY2ZnX19fZW5fX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfY2ZnX19fZW5fX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9jZmdfX19lbl9fX2JpdCAwCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9jZmdfX19iaXRfb3JkZXJfX19sc2IgMQorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfY2ZnX19fYml0X29yZGVyX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfY2ZnX19fYml0X29yZGVyX19fYml0IDEKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMwX2NmZ19fX3NjbF9pb19fX2xzYiAyCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9jZmdfX19zY2xfaW9fX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9jZmdfX19zY2xfaW9fX19iaXQgMgorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfY2ZnX19fc2NsX2ludl9fX2xzYiAzCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9jZmdfX19zY2xfaW52X19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfY2ZnX19fc2NsX2ludl9fX2JpdCAzCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9jZmdfX19zZGFfaW9fX19sc2IgNAorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfY2ZnX19fc2RhX2lvX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfY2ZnX19fc2RhX2lvX19fYml0IDQKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMwX2NmZ19fX3NkYV9pZGxlX19fbHNiIDUKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMwX2NmZ19fX3NkYV9pZGxlX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfY2ZnX19fc2RhX2lkbGVfX19iaXQgNQorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfY2ZnX29mZnNldCAxNDgKKworLyogUmVnaXN0ZXIgcndfaTJjMF9jdHJsLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2dpb19yd19pMmMwX2N0cmxfX190cmZfYml0c19fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9jdHJsX19fdHJmX2JpdHNfX193aWR0aCA2CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9jdHJsX19fc3dpdGNoX2Rpcl9fX2xzYiA2CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9jdHJsX19fc3dpdGNoX2Rpcl9fX3dpZHRoIDYKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMwX2N0cmxfX19leHRyYV9zdGFydF9fX2xzYiAxMgorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfY3RybF9fX2V4dHJhX3N0YXJ0X19fd2lkdGggMworI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfY3RybF9fX2Vhcmx5X2VuZF9fX2xzYiAxNQorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfY3RybF9fX2Vhcmx5X2VuZF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMwX2N0cmxfX19lYXJseV9lbmRfX19iaXQgMTUKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMwX2N0cmxfX19zdGFydF9zdG9wX19fbHNiIDE2CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9jdHJsX19fc3RhcnRfc3RvcF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMwX2N0cmxfX19zdGFydF9zdG9wX19fYml0IDE2CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9jdHJsX19fYWNrX2RpcjBfX19sc2IgMTcKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMwX2N0cmxfX19hY2tfZGlyMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMwX2N0cmxfX19hY2tfZGlyMF9fX2JpdCAxNworI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfY3RybF9fX2Fja19kaXIxX19fbHNiIDE4CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9jdHJsX19fYWNrX2RpcjFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9jdHJsX19fYWNrX2RpcjFfX19iaXQgMTgKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMwX2N0cmxfX19hY2tfZGlyMl9fX2xzYiAxOQorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfY3RybF9fX2Fja19kaXIyX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfY3RybF9fX2Fja19kaXIyX19fYml0IDE5CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9jdHJsX19fYWNrX2RpcjNfX19sc2IgMjAKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMwX2N0cmxfX19hY2tfZGlyM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMwX2N0cmxfX19hY2tfZGlyM19fX2JpdCAyMAorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfY3RybF9fX2Fja19kaXI0X19fbHNiIDIxCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9jdHJsX19fYWNrX2RpcjRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9jdHJsX19fYWNrX2RpcjRfX19iaXQgMjEKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMwX2N0cmxfX19hY2tfZGlyNV9fX2xzYiAyMgorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfY3RybF9fX2Fja19kaXI1X19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfY3RybF9fX2Fja19kaXI1X19fYml0IDIyCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9jdHJsX19fYWNrX2JpdF9fX2xzYiAyMworI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfY3RybF9fX2Fja19iaXRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9jdHJsX19fYWNrX2JpdF9fX2JpdCAyMworI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfY3RybF9fX3N0YXJ0X2JpdF9fX2xzYiAyNAorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfY3RybF9fX3N0YXJ0X2JpdF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMwX2N0cmxfX19zdGFydF9iaXRfX19iaXQgMjQKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMwX2N0cmxfX19mcmVxX19fbHNiIDI1CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9jdHJsX19fZnJlcV9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMwX2N0cmxfb2Zmc2V0IDE1MgorCisvKiBSZWdpc3RlciByd19pMmMwX2RhdGEsIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfZGF0YV9fX2RhdGEwX19fbHNiIDAKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMwX2RhdGFfX19kYXRhMF9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMwX2RhdGFfX19kYXRhMV9fX2xzYiA4CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9kYXRhX19fZGF0YTFfX193aWR0aCA4CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9kYXRhX19fZGF0YTJfX19sc2IgMTYKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMwX2RhdGFfX19kYXRhMl9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMwX2RhdGFfX19kYXRhM19fX2xzYiAyNAorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfZGF0YV9fX2RhdGEzX19fd2lkdGggOAorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfZGF0YV9vZmZzZXQgMTU2CisKKy8qIFJlZ2lzdGVyIHJ3X2kyYzBfZGF0YTIsIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfZGF0YTJfX19kYXRhNF9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9kYXRhMl9fX2RhdGE0X19fd2lkdGggOAorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfZGF0YTJfX19kYXRhNV9fX2xzYiA4CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9kYXRhMl9fX2RhdGE1X19fd2lkdGggOAorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfZGF0YTJfX19zdGFydF92YWxfX19sc2IgMTYKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMwX2RhdGEyX19fc3RhcnRfdmFsX19fd2lkdGggNgorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzBfZGF0YTJfX19hY2tfdmFsX19fbHNiIDIyCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9kYXRhMl9fX2Fja192YWxfX193aWR0aCA2CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMF9kYXRhMl9vZmZzZXQgMTYwCisKKy8qIFJlZ2lzdGVyIHJ3X2kyYzFfc3RhcnQsIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfc3RhcnRfX19ydW5fX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfc3RhcnRfX19ydW5fX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9zdGFydF9fX3J1bl9fX2JpdCAwCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9zdGFydF9vZmZzZXQgMTY0CisKKy8qIFJlZ2lzdGVyIHJ3X2kyYzFfY2ZnLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2NmZ19fX2VuX19fbHNiIDAKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2NmZ19fX2VuX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY2ZnX19fZW5fX19iaXQgMAorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY2ZnX19fYml0X29yZGVyX19fbHNiIDEKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2NmZ19fX2JpdF9vcmRlcl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2NmZ19fX2JpdF9vcmRlcl9fX2JpdCAxCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jZmdfX19zY2xfaW9fX19sc2IgMgorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY2ZnX19fc2NsX2lvX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY2ZnX19fc2NsX2lvX19fYml0IDIKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2NmZ19fX3NjbF9pbnZfX19sc2IgMworI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY2ZnX19fc2NsX2ludl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2NmZ19fX3NjbF9pbnZfX19iaXQgMworI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY2ZnX19fc2RhMF9pb19fX2xzYiA0CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jZmdfX19zZGEwX2lvX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY2ZnX19fc2RhMF9pb19fX2JpdCA0CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jZmdfX19zZGEwX2lkbGVfX19sc2IgNQorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY2ZnX19fc2RhMF9pZGxlX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY2ZnX19fc2RhMF9pZGxlX19fYml0IDUKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2NmZ19fX3NkYTFfaW9fX19sc2IgNgorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY2ZnX19fc2RhMV9pb19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2NmZ19fX3NkYTFfaW9fX19iaXQgNgorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY2ZnX19fc2RhMV9pZGxlX19fbHNiIDcKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2NmZ19fX3NkYTFfaWRsZV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2NmZ19fX3NkYTFfaWRsZV9fX2JpdCA3CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jZmdfX19zZGEyX2lvX19fbHNiIDgKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2NmZ19fX3NkYTJfaW9fX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jZmdfX19zZGEyX2lvX19fYml0IDgKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2NmZ19fX3NkYTJfaWRsZV9fX2xzYiA5CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jZmdfX19zZGEyX2lkbGVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jZmdfX19zZGEyX2lkbGVfX19iaXQgOQorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY2ZnX19fc2RhM19pb19fX2xzYiAxMAorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY2ZnX19fc2RhM19pb19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2NmZ19fX3NkYTNfaW9fX19iaXQgMTAKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2NmZ19fX3NkYTNfaWRsZV9fX2xzYiAxMQorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY2ZnX19fc2RhM19pZGxlX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY2ZnX19fc2RhM19pZGxlX19fYml0IDExCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jZmdfX19zZGFfc2VsX19fbHNiIDEyCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jZmdfX19zZGFfc2VsX19fd2lkdGggMgorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY2ZnX19fc2VuX2lkbGVfX19sc2IgMTQKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2NmZ19fX3Nlbl9pZGxlX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY2ZnX19fc2VuX2lkbGVfX19iaXQgMTQKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2NmZ19fX3Nlbl9pbnZfX19sc2IgMTUKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2NmZ19fX3Nlbl9pbnZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jZmdfX19zZW5faW52X19fYml0IDE1CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jZmdfX19zZW5fc2VsX19fbHNiIDE2CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jZmdfX19zZW5fc2VsX19fd2lkdGggMgorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY2ZnX29mZnNldCAxNjgKKworLyogUmVnaXN0ZXIgcndfaTJjMV9jdHJsLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2N0cmxfX190cmZfYml0c19fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jdHJsX19fdHJmX2JpdHNfX193aWR0aCA2CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jdHJsX19fc3dpdGNoX2Rpcl9fX2xzYiA2CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jdHJsX19fc3dpdGNoX2Rpcl9fX3dpZHRoIDYKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2N0cmxfX19leHRyYV9zdGFydF9fX2xzYiAxMgorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY3RybF9fX2V4dHJhX3N0YXJ0X19fd2lkdGggMworI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY3RybF9fX2Vhcmx5X2VuZF9fX2xzYiAxNQorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY3RybF9fX2Vhcmx5X2VuZF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2N0cmxfX19lYXJseV9lbmRfX19iaXQgMTUKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2N0cmxfX19zdGFydF9zdG9wX19fbHNiIDE2CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jdHJsX19fc3RhcnRfc3RvcF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2N0cmxfX19zdGFydF9zdG9wX19fYml0IDE2CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jdHJsX19fYWNrX2RpcjBfX19sc2IgMTcKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2N0cmxfX19hY2tfZGlyMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2N0cmxfX19hY2tfZGlyMF9fX2JpdCAxNworI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY3RybF9fX2Fja19kaXIxX19fbHNiIDE4CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jdHJsX19fYWNrX2RpcjFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jdHJsX19fYWNrX2RpcjFfX19iaXQgMTgKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2N0cmxfX19hY2tfZGlyMl9fX2xzYiAxOQorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY3RybF9fX2Fja19kaXIyX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY3RybF9fX2Fja19kaXIyX19fYml0IDE5CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jdHJsX19fYWNrX2RpcjNfX19sc2IgMjAKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2N0cmxfX19hY2tfZGlyM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2N0cmxfX19hY2tfZGlyM19fX2JpdCAyMAorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY3RybF9fX2Fja19kaXI0X19fbHNiIDIxCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jdHJsX19fYWNrX2RpcjRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jdHJsX19fYWNrX2RpcjRfX19iaXQgMjEKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2N0cmxfX19hY2tfZGlyNV9fX2xzYiAyMgorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY3RybF9fX2Fja19kaXI1X19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY3RybF9fX2Fja19kaXI1X19fYml0IDIyCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jdHJsX19fYWNrX2JpdF9fX2xzYiAyMworI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY3RybF9fX2Fja19iaXRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jdHJsX19fYWNrX2JpdF9fX2JpdCAyMworI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY3RybF9fX3N0YXJ0X2JpdF9fX2xzYiAyNAorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfY3RybF9fX3N0YXJ0X2JpdF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2N0cmxfX19zdGFydF9iaXRfX19iaXQgMjQKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2N0cmxfX19mcmVxX19fbHNiIDI1CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9jdHJsX19fZnJlcV9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2N0cmxfb2Zmc2V0IDE3MgorCisvKiBSZWdpc3RlciByd19pMmMxX2RhdGEsIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfZGF0YV9fX2RhdGEwX19fbHNiIDAKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2RhdGFfX19kYXRhMF9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2RhdGFfX19kYXRhMV9fX2xzYiA4CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9kYXRhX19fZGF0YTFfX193aWR0aCA4CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9kYXRhX19fZGF0YTJfX19sc2IgMTYKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2RhdGFfX19kYXRhMl9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2RhdGFfX19kYXRhM19fX2xzYiAyNAorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfZGF0YV9fX2RhdGEzX19fd2lkdGggOAorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfZGF0YV9vZmZzZXQgMTc2CisKKy8qIFJlZ2lzdGVyIHJ3X2kyYzFfZGF0YTIsIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfZGF0YTJfX19kYXRhNF9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9kYXRhMl9fX2RhdGE0X19fd2lkdGggOAorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfZGF0YTJfX19kYXRhNV9fX2xzYiA4CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9kYXRhMl9fX2RhdGE1X19fd2lkdGggOAorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfZGF0YTJfX19zdGFydF92YWxfX19sc2IgMTYKKyNkZWZpbmUgcmVnX2dpb19yd19pMmMxX2RhdGEyX19fc3RhcnRfdmFsX19fd2lkdGggNgorI2RlZmluZSByZWdfZ2lvX3J3X2kyYzFfZGF0YTJfX19hY2tfdmFsX19fbHNiIDIyCisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9kYXRhMl9fX2Fja192YWxfX193aWR0aCA2CisjZGVmaW5lIHJlZ19naW9fcndfaTJjMV9kYXRhMl9vZmZzZXQgMTgwCisKKy8qIFJlZ2lzdGVyIHJfcHB3bV9zdGF0LCBzY29wZSBnaW8sIHR5cGUgciAqLworI2RlZmluZSByZWdfZ2lvX3JfcHB3bV9zdGF0X19fZnJlcV9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcl9wcHdtX3N0YXRfX19mcmVxX19fd2lkdGggMgorI2RlZmluZSByZWdfZ2lvX3JfcHB3bV9zdGF0X29mZnNldCAxODQKKworLyogUmVnaXN0ZXIgcndfcHB3bV9kYXRhLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2dpb19yd19wcHdtX2RhdGFfX19kYXRhX19fbHNiIDAKKyNkZWZpbmUgcmVnX2dpb19yd19wcHdtX2RhdGFfX19kYXRhX19fd2lkdGggOAorI2RlZmluZSByZWdfZ2lvX3J3X3Bwd21fZGF0YV9vZmZzZXQgMTg4CisKKy8qIFJlZ2lzdGVyIHJ3X3B3bTBfY3RybCwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19naW9fcndfcHdtMF9jdHJsX19fbW9kZV9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfcHdtMF9jdHJsX19fbW9kZV9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2dpb19yd19wd20wX2N0cmxfX19jY2Rfb3ZlcnJpZGVfX19sc2IgMgorI2RlZmluZSByZWdfZ2lvX3J3X3B3bTBfY3RybF9fX2NjZF9vdmVycmlkZV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19wd20wX2N0cmxfX19jY2Rfb3ZlcnJpZGVfX19iaXQgMgorI2RlZmluZSByZWdfZ2lvX3J3X3B3bTBfY3RybF9fX2NjZF92YWxfX19sc2IgMworI2RlZmluZSByZWdfZ2lvX3J3X3B3bTBfY3RybF9fX2NjZF92YWxfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfcHdtMF9jdHJsX19fY2NkX3ZhbF9fX2JpdCAzCisjZGVmaW5lIHJlZ19naW9fcndfcHdtMF9jdHJsX29mZnNldCAxOTIKKworLyogUmVnaXN0ZXIgcndfcHdtMF92YXIsIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X3B3bTBfdmFyX19fbG9fX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3J3X3B3bTBfdmFyX19fbG9fX193aWR0aCAxMworI2RlZmluZSByZWdfZ2lvX3J3X3B3bTBfdmFyX19faGlfX19sc2IgMTMKKyNkZWZpbmUgcmVnX2dpb19yd19wd20wX3Zhcl9fX2hpX19fd2lkdGggMTMKKyNkZWZpbmUgcmVnX2dpb19yd19wd20wX3Zhcl9vZmZzZXQgMTk2CisKKy8qIFJlZ2lzdGVyIHJ3X3B3bTBfZGF0YSwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19naW9fcndfcHdtMF9kYXRhX19fZGF0YV9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfcHdtMF9kYXRhX19fZGF0YV9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX2dpb19yd19wd20wX2RhdGFfb2Zmc2V0IDIwMAorCisvKiBSZWdpc3RlciByd19wd20xX2N0cmwsIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X3B3bTFfY3RybF9fX21vZGVfX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3J3X3B3bTFfY3RybF9fX21vZGVfX193aWR0aCAyCisjZGVmaW5lIHJlZ19naW9fcndfcHdtMV9jdHJsX19fY2NkX292ZXJyaWRlX19fbHNiIDIKKyNkZWZpbmUgcmVnX2dpb19yd19wd20xX2N0cmxfX19jY2Rfb3ZlcnJpZGVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfcHdtMV9jdHJsX19fY2NkX292ZXJyaWRlX19fYml0IDIKKyNkZWZpbmUgcmVnX2dpb19yd19wd20xX2N0cmxfX19jY2RfdmFsX19fbHNiIDMKKyNkZWZpbmUgcmVnX2dpb19yd19wd20xX2N0cmxfX19jY2RfdmFsX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X3B3bTFfY3RybF9fX2NjZF92YWxfX19iaXQgMworI2RlZmluZSByZWdfZ2lvX3J3X3B3bTFfY3RybF9vZmZzZXQgMjA0CisKKy8qIFJlZ2lzdGVyIHJ3X3B3bTFfdmFyLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2dpb19yd19wd20xX3Zhcl9fX2xvX19fbHNiIDAKKyNkZWZpbmUgcmVnX2dpb19yd19wd20xX3Zhcl9fX2xvX19fd2lkdGggMTMKKyNkZWZpbmUgcmVnX2dpb19yd19wd20xX3Zhcl9fX2hpX19fbHNiIDEzCisjZGVmaW5lIHJlZ19naW9fcndfcHdtMV92YXJfX19oaV9fX3dpZHRoIDEzCisjZGVmaW5lIHJlZ19naW9fcndfcHdtMV92YXJfb2Zmc2V0IDIwOAorCisvKiBSZWdpc3RlciByd19wd20xX2RhdGEsIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X3B3bTFfZGF0YV9fX2RhdGFfX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3J3X3B3bTFfZGF0YV9fX2RhdGFfX193aWR0aCA4CisjZGVmaW5lIHJlZ19naW9fcndfcHdtMV9kYXRhX29mZnNldCAyMTIKKworLyogUmVnaXN0ZXIgcndfcHdtMl9jdHJsLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2dpb19yd19wd20yX2N0cmxfX19tb2RlX19fbHNiIDAKKyNkZWZpbmUgcmVnX2dpb19yd19wd20yX2N0cmxfX19tb2RlX19fd2lkdGggMgorI2RlZmluZSByZWdfZ2lvX3J3X3B3bTJfY3RybF9fX2NjZF9vdmVycmlkZV9fX2xzYiAyCisjZGVmaW5lIHJlZ19naW9fcndfcHdtMl9jdHJsX19fY2NkX292ZXJyaWRlX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X3B3bTJfY3RybF9fX2NjZF9vdmVycmlkZV9fX2JpdCAyCisjZGVmaW5lIHJlZ19naW9fcndfcHdtMl9jdHJsX19fY2NkX3ZhbF9fX2xzYiAzCisjZGVmaW5lIHJlZ19naW9fcndfcHdtMl9jdHJsX19fY2NkX3ZhbF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19wd20yX2N0cmxfX19jY2RfdmFsX19fYml0IDMKKyNkZWZpbmUgcmVnX2dpb19yd19wd20yX2N0cmxfb2Zmc2V0IDIxNgorCisvKiBSZWdpc3RlciByd19wd20yX3Zhciwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19naW9fcndfcHdtMl92YXJfX19sb19fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfcHdtMl92YXJfX19sb19fX3dpZHRoIDEzCisjZGVmaW5lIHJlZ19naW9fcndfcHdtMl92YXJfX19oaV9fX2xzYiAxMworI2RlZmluZSByZWdfZ2lvX3J3X3B3bTJfdmFyX19faGlfX193aWR0aCAxMworI2RlZmluZSByZWdfZ2lvX3J3X3B3bTJfdmFyX29mZnNldCAyMjAKKworLyogUmVnaXN0ZXIgcndfcHdtMl9kYXRhLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2dpb19yd19wd20yX2RhdGFfX19kYXRhX19fbHNiIDAKKyNkZWZpbmUgcmVnX2dpb19yd19wd20yX2RhdGFfX19kYXRhX19fd2lkdGggOAorI2RlZmluZSByZWdfZ2lvX3J3X3B3bTJfZGF0YV9vZmZzZXQgMjI0CisKKy8qIFJlZ2lzdGVyIHJ3X3B3bV9pbl9jZmcsIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X3B3bV9pbl9jZmdfX19waW5fX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3J3X3B3bV9pbl9jZmdfX19waW5fX193aWR0aCAzCisjZGVmaW5lIHJlZ19naW9fcndfcHdtX2luX2NmZ19vZmZzZXQgMjI4CisKKy8qIFJlZ2lzdGVyIHJfcHdtX2luX2xvLCBzY29wZSBnaW8sIHR5cGUgciAqLworI2RlZmluZSByZWdfZ2lvX3JfcHdtX2luX2xvX19fZGF0YV9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcl9wd21faW5fbG9fX19kYXRhX19fd2lkdGggMzIKKyNkZWZpbmUgcmVnX2dpb19yX3B3bV9pbl9sb19vZmZzZXQgMjMyCisKKy8qIFJlZ2lzdGVyIHJfcHdtX2luX2hpLCBzY29wZSBnaW8sIHR5cGUgciAqLworI2RlZmluZSByZWdfZ2lvX3JfcHdtX2luX2hpX19fZGF0YV9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcl9wd21faW5faGlfX19kYXRhX19fd2lkdGggMzIKKyNkZWZpbmUgcmVnX2dpb19yX3B3bV9pbl9oaV9vZmZzZXQgMjM2CisKKy8qIFJlZ2lzdGVyIHJfcHdtX2luX2NudCwgc2NvcGUgZ2lvLCB0eXBlIHIgKi8KKyNkZWZpbmUgcmVnX2dpb19yX3B3bV9pbl9jbnRfX19kYXRhX19fbHNiIDAKKyNkZWZpbmUgcmVnX2dpb19yX3B3bV9pbl9jbnRfX19kYXRhX19fd2lkdGggMzIKKyNkZWZpbmUgcmVnX2dpb19yX3B3bV9pbl9jbnRfb2Zmc2V0IDI0MAorCisKKy8qIENvbnN0YW50cyAqLworI2RlZmluZSByZWdrX2dpb19hbnllZGdlICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIHJlZ2tfZ2lvX2YxMDBrICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19naW9fZjE1NjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2dpb19mMTk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIHJlZ2tfZ2lvX2YxbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgcmVna19naW9fZjM5MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX2dpb19mNDAwayAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfZ2lvX2Y1bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgcmVna19naW9fZjc4MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2dpb19oaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfZ2lvX2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19naW9faW50cl9wYTAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2dpb19pbnRyX3BhMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGExMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna19naW9faW50cl9wYTExICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2dpb19pbnRyX3BhMTIgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGExMyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna19naW9faW50cl9wYTE0ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2dpb19pbnRyX3BhMTUgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGExNiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgcmVna19naW9faW50cl9wYTE3ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX2dpb19pbnRyX3BhMTggICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGExOSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgcmVna19naW9faW50cl9wYTIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2dpb19pbnRyX3BhMjAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGEyMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgcmVna19naW9faW50cl9wYTIyICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX2dpb19pbnRyX3BhMjMgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGEyNCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgcmVna19naW9faW50cl9wYTI1ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSByZWdrX2dpb19pbnRyX3BhMjYgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGEyNyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgcmVna19naW9faW50cl9wYTI4ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSByZWdrX2dpb19pbnRyX3BhMjkgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGEzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19naW9faW50cl9wYTMwICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSByZWdrX2dpb19pbnRyX3BhMzEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGE0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19naW9faW50cl9wYTUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2dpb19pbnRyX3BhNiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGE3ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19naW9faW50cl9wYTggICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2dpb19pbnRyX3BhOSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGIwICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgcmVna19naW9faW50cl9wYjEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSByZWdrX2dpb19pbnRyX3BiMTAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA1CisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGIxMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgcmVna19naW9faW50cl9wYjEyICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNQorI2RlZmluZSByZWdrX2dpb19pbnRyX3BiMTMgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA1CisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGIxNCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgcmVna19naW9faW50cl9wYjE1ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNQorI2RlZmluZSByZWdrX2dpb19pbnRyX3BiMTYgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2CisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGIxNyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgcmVna19naW9faW50cl9wYjE4ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgorI2RlZmluZSByZWdrX2dpb19pbnRyX3BiMTkgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2CisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGIyICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgcmVna19naW9faW50cl9wYjIwICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgorI2RlZmluZSByZWdrX2dpb19pbnRyX3BiMjEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2CisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGIyMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgcmVna19naW9faW50cl9wYjIzICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgorI2RlZmluZSByZWdrX2dpb19pbnRyX3BiMjQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGIyNSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgcmVna19naW9faW50cl9wYjI2ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSByZWdrX2dpb19pbnRyX3BiMjcgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGIyOCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgcmVna19naW9faW50cl9wYjI5ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSByZWdrX2dpb19pbnRyX3BiMyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGIzMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgcmVna19naW9faW50cl9wYjMxICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSByZWdrX2dpb19pbnRyX3BiNCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGI1ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgcmVna19naW9faW50cl9wYjYgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSByZWdrX2dpb19pbnRyX3BiNyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGI4ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgcmVna19naW9faW50cl9wYjkgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNQorI2RlZmluZSByZWdrX2dpb19pbnRyX3BjMCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGMxICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgcmVna19naW9faW50cl9wYzEwICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOQorI2RlZmluZSByZWdrX2dpb19pbnRyX3BjMTEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA5CisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGMxMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDkKKyNkZWZpbmUgcmVna19naW9faW50cl9wYzEzICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOQorI2RlZmluZSByZWdrX2dpb19pbnRyX3BjMTQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA5CisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGMxNSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDkKKyNkZWZpbmUgcmVna19naW9faW50cl9wYzIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSByZWdrX2dpb19pbnRyX3BjMyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGM0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgcmVna19naW9faW50cl9wYzUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSByZWdrX2dpb19pbnRyX3BjNiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGM3ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgcmVna19naW9faW50cl9wYzggICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOQorI2RlZmluZSByZWdrX2dpb19pbnRyX3BjOSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA5CisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGQwICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGMKKyNkZWZpbmUgcmVna19naW9faW50cl9wZDEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwYworI2RlZmluZSByZWdrX2dpb19pbnRyX3BkMTAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBkCisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGQxMSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGQKKyNkZWZpbmUgcmVna19naW9faW50cl9wZDEyICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwZAorI2RlZmluZSByZWdrX2dpb19pbnRyX3BkMTMgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBkCisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGQxNCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGQKKyNkZWZpbmUgcmVna19naW9faW50cl9wZDE1ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwZAorI2RlZmluZSByZWdrX2dpb19pbnRyX3BkMTYgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBlCisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGQxNyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGUKKyNkZWZpbmUgcmVna19naW9faW50cl9wZDE4ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwZQorI2RlZmluZSByZWdrX2dpb19pbnRyX3BkMTkgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBlCisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGQyICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGMKKyNkZWZpbmUgcmVna19naW9faW50cl9wZDIwICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwZQorI2RlZmluZSByZWdrX2dpb19pbnRyX3BkMjEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBlCisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGQyMiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGUKKyNkZWZpbmUgcmVna19naW9faW50cl9wZDIzICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwZQorI2RlZmluZSByZWdrX2dpb19pbnRyX3BkMjQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGQyNSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgcmVna19naW9faW50cl9wZDI2ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwZgorI2RlZmluZSByZWdrX2dpb19pbnRyX3BkMjcgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGQyOCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgcmVna19naW9faW50cl9wZDI5ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwZgorI2RlZmluZSByZWdrX2dpb19pbnRyX3BkMyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBjCisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGQzMCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgcmVna19naW9faW50cl9wZDMxICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwZgorI2RlZmluZSByZWdrX2dpb19pbnRyX3BkNCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBjCisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGQ1ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGMKKyNkZWZpbmUgcmVna19naW9faW50cl9wZDYgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwYworI2RlZmluZSByZWdrX2dpb19pbnRyX3BkNyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBjCisjZGVmaW5lIHJlZ2tfZ2lvX2ludHJfcGQ4ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGQKKyNkZWZpbmUgcmVna19naW9faW50cl9wZDkgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwZAorI2RlZmluZSByZWdrX2dpb19sbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIHJlZ2tfZ2lvX2xzYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19naW9fbXNiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2dpb19uZWdlZGdlICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2CisjZGVmaW5lIHJlZ2tfZ2lvX25vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19naW9fbm9fc3dpdGNoICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAzZgorI2RlZmluZSByZWdrX2dpb19ub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIHJlZ2tfZ2lvX29mZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19naW9fb3BlbmRyYWluICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2dpb19vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfZ2lvX3Bvc2VkZ2UgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgcmVna19naW9fcHdtX2hmcCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX2dpb19wd21fcGEwICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfZ2lvX3B3bV9wYTE5ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgcmVna19naW9fcHdtX3BhNiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX2dpb19wd21fcGE3ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIHJlZ2tfZ2lvX3B3bV9wYjI2ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgcmVna19naW9fcHdtX3BkMjMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgorI2RlZmluZSByZWdrX2dpb19wd21fcGQzMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIHJlZ2tfZ2lvX3B3bV9zdGQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna19naW9fcHdtX3ZhciAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSByZWdrX2dpb19yd19pMmMwX2NmZ19kZWZhdWx0ICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIHJlZ2tfZ2lvX3J3X2kyYzBfY3RybF9kZWZhdWx0ICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgcmVna19naW9fcndfaTJjMF9zdGFydF9kZWZhdWx0ICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2dpb19yd19pMmMxX2NmZ19kZWZhdWx0ICAgICAgICAgICAgICAweDAwMDAwYWEwCisjZGVmaW5lIHJlZ2tfZ2lvX3J3X2kyYzFfY3RybF9kZWZhdWx0ICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgcmVna19naW9fcndfaTJjMV9zdGFydF9kZWZhdWx0ICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2dpb19yd19pbnRyX2NmZ19kZWZhdWx0ICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfZ2lvX3J3X2ludHJfbWFza19kZWZhdWx0ICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19naW9fcndfcGFfb2VfZGVmYXVsdCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2dpb19yd19wYl9vZV9kZWZhdWx0ICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfZ2lvX3J3X3BjX29lX2RlZmF1bHQgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19naW9fcndfcHB3bV9kYXRhX2RlZmF1bHQgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2dpb19yd19wd20wX2N0cmxfZGVmYXVsdCAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfZ2lvX3J3X3B3bTFfY3RybF9kZWZhdWx0ICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19naW9fcndfcHdtMl9jdHJsX2RlZmF1bHQgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2dpb19yd19wd21faW5fY2ZnX2RlZmF1bHQgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfZ2lvX3NkYTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19naW9fc2RhMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2dpb19zZGEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIHJlZ2tfZ2lvX3NkYTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgcmVna19naW9fc2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2dpb19zZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIHJlZ2tfZ2lvX3llcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNlbmRpZiAvKiBfX2dpb19kZWZzX2FzbV9oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2FzbS9waW5tdXhfZGVmc19hc20uaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvYXNtL3Bpbm11eF9kZWZzX2FzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZGM5YzYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2FzbS9waW5tdXhfZGVmc19hc20uaApAQCAtMCwwICsxLDU3MiBAQAorI2lmbmRlZiBfX3Bpbm11eF9kZWZzX2FzbV9oCisjZGVmaW5lIF9fcGlubXV4X2RlZnNfYXNtX2gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGZyb20KKyAqICAgZmlsZTogICAgICAgICAgIHBpbm11eC5yCisgKiAKKyAqICAgYnkgLi4vLi4vLi4vdG9vbHMvcmRlc2MvYmluL3JkZXMyYyAtYXNtIC1vdXRmaWxlIHBpbm11eF9kZWZzX2FzbS5oIHBpbm11eC5yCisgKiBBbnkgY2hhbmdlcyBoZXJlIHdpbGwgYmUgbG9zdC4KKyAqCisgKiAtKi0gYnVmZmVyLXJlYWQtb25seTogdCAtKi0KKyAqLworCisjaWZuZGVmIFJFR19GSUVMRAorI2RlZmluZSBSRUdfRklFTEQoIHNjb3BlLCByZWcsIGZpZWxkLCB2YWx1ZSApIFwKKyAgUkVHX0ZJRUxEX1hfKCB2YWx1ZSwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX0ZJRUxEX1hfKCB2YWx1ZSwgc2hpZnQgKSAoKHZhbHVlKSA8PCBzaGlmdCkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19TVEFURQorI2RlZmluZSBSRUdfU1RBVEUoIHNjb3BlLCByZWcsIGZpZWxkLCBzeW1ib2xpY192YWx1ZSApIFwKKyAgUkVHX1NUQVRFX1hfKCByZWdrXyMjc2NvcGUjI18jI3N5bWJvbGljX3ZhbHVlLCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX19sc2IgKQorI2RlZmluZSBSRUdfU1RBVEVfWF8oIGssIHNoaWZ0ICkgKGsgPDwgc2hpZnQpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfTUFTSworI2RlZmluZSBSRUdfTUFTSyggc2NvcGUsIHJlZywgZmllbGQgKSBcCisgIFJFR19NQVNLX1hfKCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX193aWR0aCwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX01BU0tfWF8oIHdpZHRoLCBsc2IgKSAoKCgxIDw8IHdpZHRoKS0xKSA8PCBsc2IpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfTFNCCisjZGVmaW5lIFJFR19MU0IoIHNjb3BlLCByZWcsIGZpZWxkICkgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQklUCisjZGVmaW5lIFJFR19CSVQoIHNjb3BlLCByZWcsIGZpZWxkICkgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fYml0CisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUgorI2RlZmluZSBSRUdfQUREUiggc2NvcGUsIGluc3QsIHJlZyApIFJFR19BRERSX1hfKGluc3QsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19vZmZzZXQpCisjZGVmaW5lIFJFR19BRERSX1hfKCBpbnN0LCBvZmZzICkgKChpbnN0KSArIG9mZnMpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUl9WRUNUCisjZGVmaW5lIFJFR19BRERSX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICAgICAgICAgUkVHX0FERFJfVkVDVF9YXyhpbnN0LCByZWdfIyNzY29wZSMjXyMjcmVnIyNfb2Zmc2V0LCBpbmRleCwgXAorCQkJIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2RlZmluZSBSRUdfQUREUl9WRUNUX1hfKCBpbnN0LCBvZmZzLCBpbmRleCwgc3RyaWRlICkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKGluc3QpICsgb2ZmcyArIChpbmRleCkgKiBzdHJpZGUpCisjZW5kaWYKKworLyogUmVnaXN0ZXIgcndfaHdwcm90LCBzY29wZSBwaW5tdXgsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19ldGhfX19sc2IgMAorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX2V0aF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19ldGhfX19iaXQgMAorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX2V0aF9tZGlvX19fbHNiIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19ldGhfbWRpb19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19ldGhfbWRpb19fX2JpdCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fZ2V0aF9fX2xzYiAyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fZ2V0aF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19nZXRoX19fYml0IDIKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX190Z19fX2xzYiAzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fdGdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fdGdfX19iaXQgMworI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX3RnX2Nsa19fX2xzYiA0CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fdGdfY2xrX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX3RnX2Nsa19fX2JpdCA0CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fdm91dF9fX2xzYiA1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fdm91dF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX192b3V0X19fYml0IDUKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX192b3V0X3N5bmNfX19sc2IgNgorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX3ZvdXRfc3luY19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX192b3V0X3N5bmNfX19iaXQgNgorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX3NlcjFfX19sc2IgNworI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX3NlcjFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fc2VyMV9fX2JpdCA3CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fc2VyMl9fX2xzYiA4CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fc2VyMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19zZXIyX19fYml0IDgKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19zZXIzX19fbHNiIDkKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19zZXIzX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX3NlcjNfX19iaXQgOQorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX3NlcjRfX19sc2IgMTAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19zZXI0X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX3NlcjRfX19iaXQgMTAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19zc2VyX19fbHNiIDExCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fc3Nlcl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19zc2VyX19fYml0IDExCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fcHdtMF9fX2xzYiAxMgorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX3B3bTBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fcHdtMF9fX2JpdCAxMgorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX3B3bTFfX19sc2IgMTMKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19wd20xX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX3B3bTFfX19iaXQgMTMKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19wd20yX19fbHNiIDE0CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fcHdtMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19wd20yX19fYml0IDE0CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fdGltZXIwX19fbHNiIDE1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fdGltZXIwX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX3RpbWVyMF9fX2JpdCAxNQorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX3RpbWVyMV9fX2xzYiAxNgorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX3RpbWVyMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX190aW1lcjFfX19iaXQgMTYKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19waW9fX19sc2IgMTcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19waW9fX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fcGlvX19fYml0IDE3CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19faTJjMF9fX2xzYiAxOAorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX2kyYzBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19faTJjMF9fX2JpdCAxOAorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX2kyYzFfX19sc2IgMTkKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19pMmMxX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX2kyYzFfX19iaXQgMTkKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19pMmMxX3NkYTFfX19sc2IgMjAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19pMmMxX3NkYTFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19faTJjMV9zZGExX19fYml0IDIwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19faTJjMV9zZGEyX19fbHNiIDIxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19faTJjMV9zZGEyX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX2kyYzFfc2RhMl9fX2JpdCAyMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX2kyYzFfc2RhM19fX2xzYiAyMgorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX2kyYzFfc2RhM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19pMmMxX3NkYTNfX19iaXQgMjIKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19pMmMxX3Nlbl9fX2xzYiAyMworI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX2kyYzFfc2VuX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX2kyYzFfc2VuX19fYml0IDIzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X29mZnNldCAwCisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19wYSwgc2NvcGUgcGlubXV4LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGEwX19fbHNiIDAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGEwX19fYml0IDAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTFfX19sc2IgMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTFfX19iaXQgMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhMl9fX2xzYiAyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGEyX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhMl9fX2JpdCAyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGEzX19fbHNiIDMKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGEzX19fYml0IDMKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTRfX19sc2IgNAorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTRfX19iaXQgNAorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhNV9fX2xzYiA1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGE1X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhNV9fX2JpdCA1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGE2X19fbHNiIDYKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGE2X19fYml0IDYKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTdfX19sc2IgNworI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTdfX19iaXQgNworI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhOF9fX2xzYiA4CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGE4X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhOF9fX2JpdCA4CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGE5X19fbHNiIDkKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTlfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGE5X19fYml0IDkKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTEwX19fbHNiIDEwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGExMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTEwX19fYml0IDEwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGExMV9fX2xzYiAxMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhMTFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGExMV9fX2JpdCAxMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhMTJfX19sc2IgMTIKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTEyX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhMTJfX19iaXQgMTIKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTEzX19fbHNiIDEzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGExM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTEzX19fYml0IDEzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGExNF9fX2xzYiAxNAorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhMTRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGExNF9fX2JpdCAxNAorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhMTVfX19sc2IgMTUKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTE1X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhMTVfX19iaXQgMTUKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTE2X19fbHNiIDE2CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGExNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTE2X19fYml0IDE2CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGExN19fX2xzYiAxNworI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhMTdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGExN19fX2JpdCAxNworI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhMThfX19sc2IgMTgKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTE4X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhMThfX19iaXQgMTgKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTE5X19fbHNiIDE5CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGExOV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTE5X19fYml0IDE5CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGEyMF9fX2xzYiAyMAorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhMjBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGEyMF9fX2JpdCAyMAorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhMjFfX19sc2IgMjEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTIxX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhMjFfX19iaXQgMjEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTIyX19fbHNiIDIyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGEyMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTIyX19fYml0IDIyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGEyM19fX2xzYiAyMworI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhMjNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGEyM19fX2JpdCAyMworI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhMjRfX19sc2IgMjQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTI0X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhMjRfX19iaXQgMjQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTI1X19fbHNiIDI1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGEyNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTI1X19fYml0IDI1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGEyNl9fX2xzYiAyNgorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhMjZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGEyNl9fX2JpdCAyNgorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhMjdfX19sc2IgMjcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTI3X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhMjdfX19iaXQgMjcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTI4X19fbHNiIDI4CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGEyOF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTI4X19fYml0IDI4CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGEyOV9fX2xzYiAyOQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhMjlfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGEyOV9fX2JpdCAyOQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhMzBfX19sc2IgMzAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTMwX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYV9fX3BhMzBfX19iaXQgMzAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTMxX19fbHNiIDMxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX19fcGEzMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGFfX19wYTMxX19fYml0IDMxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BhX29mZnNldCA0CisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19wYiwgc2NvcGUgcGlubXV4LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIwX19fbHNiIDAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIwX19fYml0IDAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjFfX19sc2IgMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjFfX19iaXQgMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiMl9fX2xzYiAyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIyX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiMl9fX2JpdCAyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIzX19fbHNiIDMKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIzX19fYml0IDMKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjRfX19sc2IgNAorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjRfX19iaXQgNAorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiNV9fX2xzYiA1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGI1X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiNV9fX2JpdCA1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGI2X19fbHNiIDYKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGI2X19fYml0IDYKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjdfX19sc2IgNworI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjdfX19iaXQgNworI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiOF9fX2xzYiA4CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGI4X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiOF9fX2JpdCA4CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGI5X19fbHNiIDkKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjlfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGI5X19fYml0IDkKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjEwX19fbHNiIDEwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIxMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjEwX19fYml0IDEwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIxMV9fX2xzYiAxMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiMTFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIxMV9fX2JpdCAxMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiMTJfX19sc2IgMTIKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjEyX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiMTJfX19iaXQgMTIKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjEzX19fbHNiIDEzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIxM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjEzX19fYml0IDEzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIxNF9fX2xzYiAxNAorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiMTRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIxNF9fX2JpdCAxNAorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiMTVfX19sc2IgMTUKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjE1X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiMTVfX19iaXQgMTUKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjE2X19fbHNiIDE2CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIxNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjE2X19fYml0IDE2CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIxN19fX2xzYiAxNworI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiMTdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIxN19fX2JpdCAxNworI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiMThfX19sc2IgMTgKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjE4X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiMThfX19iaXQgMTgKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjE5X19fbHNiIDE5CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIxOV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjE5X19fYml0IDE5CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIyMF9fX2xzYiAyMAorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiMjBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIyMF9fX2JpdCAyMAorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiMjFfX19sc2IgMjEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjIxX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiMjFfX19iaXQgMjEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjIyX19fbHNiIDIyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIyMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjIyX19fYml0IDIyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIyM19fX2xzYiAyMworI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiMjNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIyM19fX2JpdCAyMworI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiMjRfX19sc2IgMjQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjI0X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiMjRfX19iaXQgMjQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjI1X19fbHNiIDI1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIyNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjI1X19fYml0IDI1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIyNl9fX2xzYiAyNgorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiMjZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIyNl9fX2JpdCAyNgorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiMjdfX19sc2IgMjcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjI3X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiMjdfX19iaXQgMjcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjI4X19fbHNiIDI4CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIyOF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjI4X19fYml0IDI4CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIyOV9fX2xzYiAyOQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiMjlfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIyOV9fX2JpdCAyOQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiMzBfX19sc2IgMzAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjMwX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wYl9fX3BiMzBfX19iaXQgMzAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjMxX19fbHNiIDMxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX19fcGIzMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGJfX19wYjMxX19fYml0IDMxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BiX29mZnNldCA4CisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19wYywgc2NvcGUgcGlubXV4LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BjX19fcGMwX19fbHNiIDAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGNfX19wYzBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BjX19fcGMwX19fYml0IDAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGNfX19wYzFfX19sc2IgMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wY19fX3BjMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGNfX19wYzFfX19iaXQgMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wY19fX3BjMl9fX2xzYiAyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BjX19fcGMyX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wY19fX3BjMl9fX2JpdCAyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BjX19fcGMzX19fbHNiIDMKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGNfX19wYzNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BjX19fcGMzX19fYml0IDMKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGNfX19wYzRfX19sc2IgNAorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wY19fX3BjNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGNfX19wYzRfX19iaXQgNAorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wY19fX3BjNV9fX2xzYiA1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BjX19fcGM1X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wY19fX3BjNV9fX2JpdCA1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BjX19fcGM2X19fbHNiIDYKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGNfX19wYzZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BjX19fcGM2X19fYml0IDYKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGNfX19wYzdfX19sc2IgNworI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wY19fX3BjN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGNfX19wYzdfX19iaXQgNworI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wY19fX3BjOF9fX2xzYiA4CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BjX19fcGM4X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wY19fX3BjOF9fX2JpdCA4CisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BjX19fcGM5X19fbHNiIDkKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGNfX19wYzlfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BjX19fcGM5X19fYml0IDkKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGNfX19wYzEwX19fbHNiIDEwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BjX19fcGMxMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGNfX19wYzEwX19fYml0IDEwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BjX19fcGMxMV9fX2xzYiAxMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wY19fX3BjMTFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BjX19fcGMxMV9fX2JpdCAxMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wY19fX3BjMTJfX19sc2IgMTIKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGNfX19wYzEyX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wY19fX3BjMTJfX19iaXQgMTIKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGNfX19wYzEzX19fbHNiIDEzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BjX19fcGMxM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGNfX19wYzEzX19fYml0IDEzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BjX19fcGMxNF9fX2xzYiAxNAorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wY19fX3BjMTRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfZ2lvX3BjX19fcGMxNF9fX2JpdCAxNAorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wY19fX3BjMTVfX19sc2IgMTUKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGNfX19wYzE1X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2dpb19wY19fX3BjMTVfX19iaXQgMTUKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19naW9fcGNfb2Zmc2V0IDEyCisKKy8qIFJlZ2lzdGVyIHJ3X2lvcF9wYSwgc2NvcGUgcGlubXV4LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGEwX19fbHNiIDAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGEwX19fYml0IDAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTFfX19sc2IgMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTFfX19iaXQgMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhMl9fX2xzYiAyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGEyX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhMl9fX2JpdCAyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGEzX19fbHNiIDMKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGEzX19fYml0IDMKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTRfX19sc2IgNAorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTRfX19iaXQgNAorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhNV9fX2xzYiA1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGE1X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhNV9fX2JpdCA1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGE2X19fbHNiIDYKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGE2X19fYml0IDYKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTdfX19sc2IgNworI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTdfX19iaXQgNworI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhOF9fX2xzYiA4CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGE4X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhOF9fX2JpdCA4CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGE5X19fbHNiIDkKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTlfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGE5X19fYml0IDkKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTEwX19fbHNiIDEwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGExMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTEwX19fYml0IDEwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGExMV9fX2xzYiAxMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhMTFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGExMV9fX2JpdCAxMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhMTJfX19sc2IgMTIKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTEyX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhMTJfX19iaXQgMTIKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTEzX19fbHNiIDEzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGExM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTEzX19fYml0IDEzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGExNF9fX2xzYiAxNAorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhMTRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGExNF9fX2JpdCAxNAorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhMTVfX19sc2IgMTUKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTE1X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhMTVfX19iaXQgMTUKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTE2X19fbHNiIDE2CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGExNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTE2X19fYml0IDE2CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGExN19fX2xzYiAxNworI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhMTdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGExN19fX2JpdCAxNworI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhMThfX19sc2IgMTgKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTE4X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhMThfX19iaXQgMTgKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTE5X19fbHNiIDE5CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGExOV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTE5X19fYml0IDE5CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGEyMF9fX2xzYiAyMAorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhMjBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGEyMF9fX2JpdCAyMAorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhMjFfX19sc2IgMjEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTIxX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhMjFfX19iaXQgMjEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTIyX19fbHNiIDIyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGEyMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTIyX19fYml0IDIyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGEyM19fX2xzYiAyMworI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhMjNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGEyM19fX2JpdCAyMworI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhMjRfX19sc2IgMjQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTI0X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhMjRfX19iaXQgMjQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTI1X19fbHNiIDI1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGEyNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTI1X19fYml0IDI1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGEyNl9fX2xzYiAyNgorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhMjZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGEyNl9fX2JpdCAyNgorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhMjdfX19sc2IgMjcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTI3X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhMjdfX19iaXQgMjcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTI4X19fbHNiIDI4CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGEyOF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTI4X19fYml0IDI4CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGEyOV9fX2xzYiAyOQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhMjlfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGEyOV9fX2JpdCAyOQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhMzBfX19sc2IgMzAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTMwX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYV9fX3BhMzBfX19iaXQgMzAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTMxX19fbHNiIDMxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX19fcGEzMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGFfX19wYTMxX19fYml0IDMxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BhX29mZnNldCAxNgorCisvKiBSZWdpc3RlciByd19pb3BfcGIsIHNjb3BlIHBpbm11eCwgdHlwZSBydyAqLworI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYl9fX3BiMF9fX2xzYiAwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BiX19fcGIwX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYl9fX3BiMF9fX2JpdCAwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BiX19fcGIxX19fbHNiIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGJfX19wYjFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BiX19fcGIxX19fYml0IDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGJfX19wYjJfX19sc2IgMgorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYl9fX3BiMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGJfX19wYjJfX19iaXQgMgorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYl9fX3BiM19fX2xzYiAzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BiX19fcGIzX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYl9fX3BiM19fX2JpdCAzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BiX19fcGI0X19fbHNiIDQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGJfX19wYjRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BiX19fcGI0X19fYml0IDQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGJfX19wYjVfX19sc2IgNQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYl9fX3BiNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGJfX19wYjVfX19iaXQgNQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYl9fX3BiNl9fX2xzYiA2CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BiX19fcGI2X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9wYl9fX3BiNl9fX2JpdCA2CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BiX19fcGI3X19fbHNiIDcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGJfX19wYjdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3BiX19fcGI3X19fYml0IDcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGJfb2Zmc2V0IDIwCisKKy8qIFJlZ2lzdGVyIHJ3X2lvcF9waW8sIHNjb3BlIHBpbm11eCwgdHlwZSBydyAqLworI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9waW9fX19kMF9fX2xzYiAwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3Bpb19fX2QwX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9waW9fX19kMF9fX2JpdCAwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3Bpb19fX2QxX19fbHNiIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGlvX19fZDFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3Bpb19fX2QxX19fYml0IDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGlvX19fZDJfX19sc2IgMgorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9waW9fX19kMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGlvX19fZDJfX19iaXQgMgorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9waW9fX19kM19fX2xzYiAzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3Bpb19fX2QzX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9waW9fX19kM19fX2JpdCAzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3Bpb19fX2Q0X19fbHNiIDQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGlvX19fZDRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3Bpb19fX2Q0X19fYml0IDQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGlvX19fZDVfX19sc2IgNQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9waW9fX19kNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGlvX19fZDVfX19iaXQgNQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9waW9fX19kNl9fX2xzYiA2CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3Bpb19fX2Q2X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9waW9fX19kNl9fX2JpdCA2CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3Bpb19fX2Q3X19fbHNiIDcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGlvX19fZDdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3Bpb19fX2Q3X19fYml0IDcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGlvX19fcmRfbl9fX2xzYiA4CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3Bpb19fX3JkX25fX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3Bpb19fX3JkX25fX19iaXQgOAorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9waW9fX193cl9uX19fbHNiIDkKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGlvX19fd3Jfbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGlvX19fd3Jfbl9fX2JpdCA5CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3Bpb19fX2EwX19fbHNiIDEwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3Bpb19fX2EwX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9waW9fX19hMF9fX2JpdCAxMAorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9waW9fX19hMV9fX2xzYiAxMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9waW9fX19hMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGlvX19fYTFfX19iaXQgMTEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGlvX19fY2UwX25fX19sc2IgMTIKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGlvX19fY2UwX25fX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3Bpb19fX2NlMF9uX19fYml0IDEyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3Bpb19fX2NlMV9uX19fbHNiIDEzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3Bpb19fX2NlMV9uX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9waW9fX19jZTFfbl9fX2JpdCAxMworI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9waW9fX19jZTJfbl9fX2xzYiAxNAorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF9waW9fX19jZTJfbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGlvX19fY2UyX25fX19iaXQgMTQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGlvX19fcmR5X19fbHNiIDE1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3Bpb19fX3JkeV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfcGlvX19fcmR5X19fYml0IDE1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3Bpb19vZmZzZXQgMjQKKworLyogUmVnaXN0ZXIgcndfaW9wX3VzYiwgc2NvcGUgcGlubXV4LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaW9wX3VzYl9fX3VzYjBfX19sc2IgMAorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF91c2JfX191c2IwX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2lvcF91c2JfX191c2IwX19fYml0IDAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19pb3BfdXNiX29mZnNldCAyOAorCisKKy8qIENvbnN0YW50cyAqLworI2RlZmluZSByZWdrX3Bpbm11eF9ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfcGlubXV4X3J3X2dpb19wYV9kZWZhdWx0ICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19waW5tdXhfcndfZ2lvX3BiX2RlZmF1bHQgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX3Bpbm11eF9yd19naW9fcGNfZGVmYXVsdCAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfcGlubXV4X3J3X2h3cHJvdF9kZWZhdWx0ICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19waW5tdXhfcndfaW9wX3BhX2RlZmF1bHQgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX3Bpbm11eF9yd19pb3BfcGJfZGVmYXVsdCAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfcGlubXV4X3J3X2lvcF9waW9fZGVmYXVsdCAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19waW5tdXhfcndfaW9wX3VzYl9kZWZhdWx0ICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX3Bpbm11eF95ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZW5kaWYgLyogX19waW5tdXhfZGVmc19hc21faCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9hc20vcGlvX2RlZnNfYXNtLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2FzbS9waW9fZGVmc19hc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTA3ZWY0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9hc20vcGlvX2RlZnNfYXNtLmgKQEAgLTAsMCArMSwzMzcgQEAKKyNpZm5kZWYgX19waW9fZGVmc19hc21faAorI2RlZmluZSBfX3Bpb19kZWZzX2FzbV9oCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCisgKiAgIGZpbGU6ICAgICAgICAgICBwaW8ucgorICogCisgKiAgIGJ5IC4uLy4uLy4uL3Rvb2xzL3JkZXNjL2Jpbi9yZGVzMmMgLWFzbSAtb3V0ZmlsZSBwaW9fZGVmc19hc20uaCBwaW8ucgorICogQW55IGNoYW5nZXMgaGVyZSB3aWxsIGJlIGxvc3QuCisgKgorICogLSotIGJ1ZmZlci1yZWFkLW9ubHk6IHQgLSotCisgKi8KKworI2lmbmRlZiBSRUdfRklFTEQKKyNkZWZpbmUgUkVHX0ZJRUxEKCBzY29wZSwgcmVnLCBmaWVsZCwgdmFsdWUgKSBcCisgIFJFR19GSUVMRF9YXyggdmFsdWUsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19fXyMjZmllbGQjI19fX2xzYiApCisjZGVmaW5lIFJFR19GSUVMRF9YXyggdmFsdWUsIHNoaWZ0ICkgKCh2YWx1ZSkgPDwgc2hpZnQpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfU1RBVEUKKyNkZWZpbmUgUkVHX1NUQVRFKCBzY29wZSwgcmVnLCBmaWVsZCwgc3ltYm9saWNfdmFsdWUgKSBcCisgIFJFR19TVEFURV9YXyggcmVna18jI3Njb3BlIyNfIyNzeW1ib2xpY192YWx1ZSwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX1NUQVRFX1hfKCBrLCBzaGlmdCApIChrIDw8IHNoaWZ0KQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX01BU0sKKyNkZWZpbmUgUkVHX01BU0soIHNjb3BlLCByZWcsIGZpZWxkICkgXAorICBSRUdfTUFTS19YXyggcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fd2lkdGgsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19fXyMjZmllbGQjI19fX2xzYiApCisjZGVmaW5lIFJFR19NQVNLX1hfKCB3aWR0aCwgbHNiICkgKCgoMSA8PCB3aWR0aCktMSkgPDwgbHNiKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0xTQgorI2RlZmluZSBSRUdfTFNCKCBzY29wZSwgcmVnLCBmaWVsZCApIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19fXyMjZmllbGQjI19fX2xzYgorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0JJVAorI2RlZmluZSBSRUdfQklUKCBzY29wZSwgcmVnLCBmaWVsZCApIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19fXyMjZmllbGQjI19fX2JpdAorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFIKKyNkZWZpbmUgUkVHX0FERFIoIHNjb3BlLCBpbnN0LCByZWcgKSBSRUdfQUREUl9YXyhpbnN0LCByZWdfIyNzY29wZSMjXyMjcmVnIyNfb2Zmc2V0KQorI2RlZmluZSBSRUdfQUREUl9YXyggaW5zdCwgb2ZmcyApICgoaW5zdCkgKyBvZmZzKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFJfVkVDVAorI2RlZmluZSBSRUdfQUREUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgICAgICAgIFJFR19BRERSX1ZFQ1RfWF8oaW5zdCwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX29mZnNldCwgaW5kZXgsIFwKKwkJCSBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNkZWZpbmUgUkVHX0FERFJfVkVDVF9YXyggaW5zdCwgb2ZmcywgaW5kZXgsIHN0cmlkZSApIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnN0KSArIG9mZnMgKyAoaW5kZXgpICogc3RyaWRlKQorI2VuZGlmCisKKy8qIFJlZ2lzdGVyIHJ3X2RhdGEsIHNjb3BlIHBpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfcGlvX3J3X2RhdGFfb2Zmc2V0IDY0CisKKy8qIFJlZ2lzdGVyIHJ3X2lvX2FjY2VzczAsIHNjb3BlIHBpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfcGlvX3J3X2lvX2FjY2VzczBfX19kYXRhX19fbHNiIDAKKyNkZWZpbmUgcmVnX3Bpb19yd19pb19hY2Nlc3MwX19fZGF0YV9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX3Bpb19yd19pb19hY2Nlc3MwX29mZnNldCAwCisKKy8qIFJlZ2lzdGVyIHJ3X2lvX2FjY2VzczEsIHNjb3BlIHBpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfcGlvX3J3X2lvX2FjY2VzczFfX19kYXRhX19fbHNiIDAKKyNkZWZpbmUgcmVnX3Bpb19yd19pb19hY2Nlc3MxX19fZGF0YV9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX3Bpb19yd19pb19hY2Nlc3MxX29mZnNldCA0CisKKy8qIFJlZ2lzdGVyIHJ3X2lvX2FjY2VzczIsIHNjb3BlIHBpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfcGlvX3J3X2lvX2FjY2VzczJfX19kYXRhX19fbHNiIDAKKyNkZWZpbmUgcmVnX3Bpb19yd19pb19hY2Nlc3MyX19fZGF0YV9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX3Bpb19yd19pb19hY2Nlc3MyX29mZnNldCA4CisKKy8qIFJlZ2lzdGVyIHJ3X2lvX2FjY2VzczMsIHNjb3BlIHBpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfcGlvX3J3X2lvX2FjY2VzczNfX19kYXRhX19fbHNiIDAKKyNkZWZpbmUgcmVnX3Bpb19yd19pb19hY2Nlc3MzX19fZGF0YV9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX3Bpb19yd19pb19hY2Nlc3MzX29mZnNldCAxMgorCisvKiBSZWdpc3RlciByd19pb19hY2Nlc3M0LCBzY29wZSBwaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX3Bpb19yd19pb19hY2Nlc3M0X19fZGF0YV9fX2xzYiAwCisjZGVmaW5lIHJlZ19waW9fcndfaW9fYWNjZXNzNF9fX2RhdGFfX193aWR0aCA4CisjZGVmaW5lIHJlZ19waW9fcndfaW9fYWNjZXNzNF9vZmZzZXQgMTYKKworLyogUmVnaXN0ZXIgcndfaW9fYWNjZXNzNSwgc2NvcGUgcGlvLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19waW9fcndfaW9fYWNjZXNzNV9fX2RhdGFfX19sc2IgMAorI2RlZmluZSByZWdfcGlvX3J3X2lvX2FjY2VzczVfX19kYXRhX19fd2lkdGggOAorI2RlZmluZSByZWdfcGlvX3J3X2lvX2FjY2VzczVfb2Zmc2V0IDIwCisKKy8qIFJlZ2lzdGVyIHJ3X2lvX2FjY2VzczYsIHNjb3BlIHBpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfcGlvX3J3X2lvX2FjY2VzczZfX19kYXRhX19fbHNiIDAKKyNkZWZpbmUgcmVnX3Bpb19yd19pb19hY2Nlc3M2X19fZGF0YV9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX3Bpb19yd19pb19hY2Nlc3M2X29mZnNldCAyNAorCisvKiBSZWdpc3RlciByd19pb19hY2Nlc3M3LCBzY29wZSBwaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX3Bpb19yd19pb19hY2Nlc3M3X19fZGF0YV9fX2xzYiAwCisjZGVmaW5lIHJlZ19waW9fcndfaW9fYWNjZXNzN19fX2RhdGFfX193aWR0aCA4CisjZGVmaW5lIHJlZ19waW9fcndfaW9fYWNjZXNzN19vZmZzZXQgMjgKKworLyogUmVnaXN0ZXIgcndfaW9fYWNjZXNzOCwgc2NvcGUgcGlvLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19waW9fcndfaW9fYWNjZXNzOF9fX2RhdGFfX19sc2IgMAorI2RlZmluZSByZWdfcGlvX3J3X2lvX2FjY2VzczhfX19kYXRhX19fd2lkdGggOAorI2RlZmluZSByZWdfcGlvX3J3X2lvX2FjY2Vzczhfb2Zmc2V0IDMyCisKKy8qIFJlZ2lzdGVyIHJ3X2lvX2FjY2VzczksIHNjb3BlIHBpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfcGlvX3J3X2lvX2FjY2VzczlfX19kYXRhX19fbHNiIDAKKyNkZWZpbmUgcmVnX3Bpb19yd19pb19hY2Nlc3M5X19fZGF0YV9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX3Bpb19yd19pb19hY2Nlc3M5X29mZnNldCAzNgorCisvKiBSZWdpc3RlciByd19pb19hY2Nlc3MxMCwgc2NvcGUgcGlvLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19waW9fcndfaW9fYWNjZXNzMTBfX19kYXRhX19fbHNiIDAKKyNkZWZpbmUgcmVnX3Bpb19yd19pb19hY2Nlc3MxMF9fX2RhdGFfX193aWR0aCA4CisjZGVmaW5lIHJlZ19waW9fcndfaW9fYWNjZXNzMTBfb2Zmc2V0IDQwCisKKy8qIFJlZ2lzdGVyIHJ3X2lvX2FjY2VzczExLCBzY29wZSBwaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX3Bpb19yd19pb19hY2Nlc3MxMV9fX2RhdGFfX19sc2IgMAorI2RlZmluZSByZWdfcGlvX3J3X2lvX2FjY2VzczExX19fZGF0YV9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX3Bpb19yd19pb19hY2Nlc3MxMV9vZmZzZXQgNDQKKworLyogUmVnaXN0ZXIgcndfaW9fYWNjZXNzMTIsIHNjb3BlIHBpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfcGlvX3J3X2lvX2FjY2VzczEyX19fZGF0YV9fX2xzYiAwCisjZGVmaW5lIHJlZ19waW9fcndfaW9fYWNjZXNzMTJfX19kYXRhX19fd2lkdGggOAorI2RlZmluZSByZWdfcGlvX3J3X2lvX2FjY2VzczEyX29mZnNldCA0OAorCisvKiBSZWdpc3RlciByd19pb19hY2Nlc3MxMywgc2NvcGUgcGlvLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19waW9fcndfaW9fYWNjZXNzMTNfX19kYXRhX19fbHNiIDAKKyNkZWZpbmUgcmVnX3Bpb19yd19pb19hY2Nlc3MxM19fX2RhdGFfX193aWR0aCA4CisjZGVmaW5lIHJlZ19waW9fcndfaW9fYWNjZXNzMTNfb2Zmc2V0IDUyCisKKy8qIFJlZ2lzdGVyIHJ3X2lvX2FjY2VzczE0LCBzY29wZSBwaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX3Bpb19yd19pb19hY2Nlc3MxNF9fX2RhdGFfX19sc2IgMAorI2RlZmluZSByZWdfcGlvX3J3X2lvX2FjY2VzczE0X19fZGF0YV9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX3Bpb19yd19pb19hY2Nlc3MxNF9vZmZzZXQgNTYKKworLyogUmVnaXN0ZXIgcndfaW9fYWNjZXNzMTUsIHNjb3BlIHBpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfcGlvX3J3X2lvX2FjY2VzczE1X19fZGF0YV9fX2xzYiAwCisjZGVmaW5lIHJlZ19waW9fcndfaW9fYWNjZXNzMTVfX19kYXRhX19fd2lkdGggOAorI2RlZmluZSByZWdfcGlvX3J3X2lvX2FjY2VzczE1X29mZnNldCA2MAorCisvKiBSZWdpc3RlciByd19jZTBfY2ZnLCBzY29wZSBwaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX3Bpb19yd19jZTBfY2ZnX19fbHdfX19sc2IgMAorI2RlZmluZSByZWdfcGlvX3J3X2NlMF9jZmdfX19sd19fX3dpZHRoIDYKKyNkZWZpbmUgcmVnX3Bpb19yd19jZTBfY2ZnX19fZXdfX19sc2IgNgorI2RlZmluZSByZWdfcGlvX3J3X2NlMF9jZmdfX19ld19fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX3Bpb19yd19jZTBfY2ZnX19fendfX19sc2IgOQorI2RlZmluZSByZWdfcGlvX3J3X2NlMF9jZmdfX196d19fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX3Bpb19yd19jZTBfY2ZnX19fYXdfX19sc2IgMTIKKyNkZWZpbmUgcmVnX3Bpb19yd19jZTBfY2ZnX19fYXdfX193aWR0aCAyCisjZGVmaW5lIHJlZ19waW9fcndfY2UwX2NmZ19fX21vZGVfX19sc2IgMTQKKyNkZWZpbmUgcmVnX3Bpb19yd19jZTBfY2ZnX19fbW9kZV9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX3Bpb19yd19jZTBfY2ZnX29mZnNldCA2OAorCisvKiBSZWdpc3RlciByd19jZTFfY2ZnLCBzY29wZSBwaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX3Bpb19yd19jZTFfY2ZnX19fbHdfX19sc2IgMAorI2RlZmluZSByZWdfcGlvX3J3X2NlMV9jZmdfX19sd19fX3dpZHRoIDYKKyNkZWZpbmUgcmVnX3Bpb19yd19jZTFfY2ZnX19fZXdfX19sc2IgNgorI2RlZmluZSByZWdfcGlvX3J3X2NlMV9jZmdfX19ld19fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX3Bpb19yd19jZTFfY2ZnX19fendfX19sc2IgOQorI2RlZmluZSByZWdfcGlvX3J3X2NlMV9jZmdfX196d19fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX3Bpb19yd19jZTFfY2ZnX19fYXdfX19sc2IgMTIKKyNkZWZpbmUgcmVnX3Bpb19yd19jZTFfY2ZnX19fYXdfX193aWR0aCAyCisjZGVmaW5lIHJlZ19waW9fcndfY2UxX2NmZ19fX21vZGVfX19sc2IgMTQKKyNkZWZpbmUgcmVnX3Bpb19yd19jZTFfY2ZnX19fbW9kZV9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX3Bpb19yd19jZTFfY2ZnX29mZnNldCA3MgorCisvKiBSZWdpc3RlciByd19jZTJfY2ZnLCBzY29wZSBwaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX3Bpb19yd19jZTJfY2ZnX19fbHdfX19sc2IgMAorI2RlZmluZSByZWdfcGlvX3J3X2NlMl9jZmdfX19sd19fX3dpZHRoIDYKKyNkZWZpbmUgcmVnX3Bpb19yd19jZTJfY2ZnX19fZXdfX19sc2IgNgorI2RlZmluZSByZWdfcGlvX3J3X2NlMl9jZmdfX19ld19fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX3Bpb19yd19jZTJfY2ZnX19fendfX19sc2IgOQorI2RlZmluZSByZWdfcGlvX3J3X2NlMl9jZmdfX196d19fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX3Bpb19yd19jZTJfY2ZnX19fYXdfX19sc2IgMTIKKyNkZWZpbmUgcmVnX3Bpb19yd19jZTJfY2ZnX19fYXdfX193aWR0aCAyCisjZGVmaW5lIHJlZ19waW9fcndfY2UyX2NmZ19fX21vZGVfX19sc2IgMTQKKyNkZWZpbmUgcmVnX3Bpb19yd19jZTJfY2ZnX19fbW9kZV9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX3Bpb19yd19jZTJfY2ZnX29mZnNldCA3NgorCisvKiBSZWdpc3RlciByd19kb3V0LCBzY29wZSBwaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX3Bpb19yd19kb3V0X19fZGF0YV9fX2xzYiAwCisjZGVmaW5lIHJlZ19waW9fcndfZG91dF9fX2RhdGFfX193aWR0aCA4CisjZGVmaW5lIHJlZ19waW9fcndfZG91dF9fX3JkX25fX19sc2IgOAorI2RlZmluZSByZWdfcGlvX3J3X2RvdXRfX19yZF9uX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlvX3J3X2RvdXRfX19yZF9uX19fYml0IDgKKyNkZWZpbmUgcmVnX3Bpb19yd19kb3V0X19fd3Jfbl9fX2xzYiA5CisjZGVmaW5lIHJlZ19waW9fcndfZG91dF9fX3dyX25fX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW9fcndfZG91dF9fX3dyX25fX19iaXQgOQorI2RlZmluZSByZWdfcGlvX3J3X2RvdXRfX19hMF9fX2xzYiAxMAorI2RlZmluZSByZWdfcGlvX3J3X2RvdXRfX19hMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpb19yd19kb3V0X19fYTBfX19iaXQgMTAKKyNkZWZpbmUgcmVnX3Bpb19yd19kb3V0X19fYTFfX19sc2IgMTEKKyNkZWZpbmUgcmVnX3Bpb19yd19kb3V0X19fYTFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW9fcndfZG91dF9fX2ExX19fYml0IDExCisjZGVmaW5lIHJlZ19waW9fcndfZG91dF9fX2NlMF9uX19fbHNiIDEyCisjZGVmaW5lIHJlZ19waW9fcndfZG91dF9fX2NlMF9uX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlvX3J3X2RvdXRfX19jZTBfbl9fX2JpdCAxMgorI2RlZmluZSByZWdfcGlvX3J3X2RvdXRfX19jZTFfbl9fX2xzYiAxMworI2RlZmluZSByZWdfcGlvX3J3X2RvdXRfX19jZTFfbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpb19yd19kb3V0X19fY2UxX25fX19iaXQgMTMKKyNkZWZpbmUgcmVnX3Bpb19yd19kb3V0X19fY2UyX25fX19sc2IgMTQKKyNkZWZpbmUgcmVnX3Bpb19yd19kb3V0X19fY2UyX25fX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW9fcndfZG91dF9fX2NlMl9uX19fYml0IDE0CisjZGVmaW5lIHJlZ19waW9fcndfZG91dF9fX3JkeV9fX2xzYiAxNQorI2RlZmluZSByZWdfcGlvX3J3X2RvdXRfX19yZHlfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW9fcndfZG91dF9fX3JkeV9fX2JpdCAxNQorI2RlZmluZSByZWdfcGlvX3J3X2RvdXRfb2Zmc2V0IDgwCisKKy8qIFJlZ2lzdGVyIHJ3X29lLCBzY29wZSBwaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX3Bpb19yd19vZV9fX2RhdGFfX19sc2IgMAorI2RlZmluZSByZWdfcGlvX3J3X29lX19fZGF0YV9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX3Bpb19yd19vZV9fX3JkX25fX19sc2IgOAorI2RlZmluZSByZWdfcGlvX3J3X29lX19fcmRfbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpb19yd19vZV9fX3JkX25fX19iaXQgOAorI2RlZmluZSByZWdfcGlvX3J3X29lX19fd3Jfbl9fX2xzYiA5CisjZGVmaW5lIHJlZ19waW9fcndfb2VfX193cl9uX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlvX3J3X29lX19fd3Jfbl9fX2JpdCA5CisjZGVmaW5lIHJlZ19waW9fcndfb2VfX19hMF9fX2xzYiAxMAorI2RlZmluZSByZWdfcGlvX3J3X29lX19fYTBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW9fcndfb2VfX19hMF9fX2JpdCAxMAorI2RlZmluZSByZWdfcGlvX3J3X29lX19fYTFfX19sc2IgMTEKKyNkZWZpbmUgcmVnX3Bpb19yd19vZV9fX2ExX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlvX3J3X29lX19fYTFfX19iaXQgMTEKKyNkZWZpbmUgcmVnX3Bpb19yd19vZV9fX2NlMF9uX19fbHNiIDEyCisjZGVmaW5lIHJlZ19waW9fcndfb2VfX19jZTBfbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpb19yd19vZV9fX2NlMF9uX19fYml0IDEyCisjZGVmaW5lIHJlZ19waW9fcndfb2VfX19jZTFfbl9fX2xzYiAxMworI2RlZmluZSByZWdfcGlvX3J3X29lX19fY2UxX25fX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW9fcndfb2VfX19jZTFfbl9fX2JpdCAxMworI2RlZmluZSByZWdfcGlvX3J3X29lX19fY2UyX25fX19sc2IgMTQKKyNkZWZpbmUgcmVnX3Bpb19yd19vZV9fX2NlMl9uX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlvX3J3X29lX19fY2UyX25fX19iaXQgMTQKKyNkZWZpbmUgcmVnX3Bpb19yd19vZV9fX3JkeV9fX2xzYiAxNQorI2RlZmluZSByZWdfcGlvX3J3X29lX19fcmR5X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlvX3J3X29lX19fcmR5X19fYml0IDE1CisjZGVmaW5lIHJlZ19waW9fcndfb2Vfb2Zmc2V0IDg0CisKKy8qIFJlZ2lzdGVyIHJ3X21hbl9jdHJsLCBzY29wZSBwaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX3Bpb19yd19tYW5fY3RybF9fX2RhdGFfX19sc2IgMAorI2RlZmluZSByZWdfcGlvX3J3X21hbl9jdHJsX19fZGF0YV9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX3Bpb19yd19tYW5fY3RybF9fX3JkX25fX19sc2IgOAorI2RlZmluZSByZWdfcGlvX3J3X21hbl9jdHJsX19fcmRfbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpb19yd19tYW5fY3RybF9fX3JkX25fX19iaXQgOAorI2RlZmluZSByZWdfcGlvX3J3X21hbl9jdHJsX19fd3Jfbl9fX2xzYiA5CisjZGVmaW5lIHJlZ19waW9fcndfbWFuX2N0cmxfX193cl9uX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlvX3J3X21hbl9jdHJsX19fd3Jfbl9fX2JpdCA5CisjZGVmaW5lIHJlZ19waW9fcndfbWFuX2N0cmxfX19hMF9fX2xzYiAxMAorI2RlZmluZSByZWdfcGlvX3J3X21hbl9jdHJsX19fYTBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW9fcndfbWFuX2N0cmxfX19hMF9fX2JpdCAxMAorI2RlZmluZSByZWdfcGlvX3J3X21hbl9jdHJsX19fYTFfX19sc2IgMTEKKyNkZWZpbmUgcmVnX3Bpb19yd19tYW5fY3RybF9fX2ExX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlvX3J3X21hbl9jdHJsX19fYTFfX19iaXQgMTEKKyNkZWZpbmUgcmVnX3Bpb19yd19tYW5fY3RybF9fX2NlMF9uX19fbHNiIDEyCisjZGVmaW5lIHJlZ19waW9fcndfbWFuX2N0cmxfX19jZTBfbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpb19yd19tYW5fY3RybF9fX2NlMF9uX19fYml0IDEyCisjZGVmaW5lIHJlZ19waW9fcndfbWFuX2N0cmxfX19jZTFfbl9fX2xzYiAxMworI2RlZmluZSByZWdfcGlvX3J3X21hbl9jdHJsX19fY2UxX25fX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW9fcndfbWFuX2N0cmxfX19jZTFfbl9fX2JpdCAxMworI2RlZmluZSByZWdfcGlvX3J3X21hbl9jdHJsX19fY2UyX25fX19sc2IgMTQKKyNkZWZpbmUgcmVnX3Bpb19yd19tYW5fY3RybF9fX2NlMl9uX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlvX3J3X21hbl9jdHJsX19fY2UyX25fX19iaXQgMTQKKyNkZWZpbmUgcmVnX3Bpb19yd19tYW5fY3RybF9fX3JkeV9fX2xzYiAxNQorI2RlZmluZSByZWdfcGlvX3J3X21hbl9jdHJsX19fcmR5X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlvX3J3X21hbl9jdHJsX19fcmR5X19fYml0IDE1CisjZGVmaW5lIHJlZ19waW9fcndfbWFuX2N0cmxfb2Zmc2V0IDg4CisKKy8qIFJlZ2lzdGVyIHJfZGluLCBzY29wZSBwaW8sIHR5cGUgciAqLworI2RlZmluZSByZWdfcGlvX3JfZGluX19fZGF0YV9fX2xzYiAwCisjZGVmaW5lIHJlZ19waW9fcl9kaW5fX19kYXRhX19fd2lkdGggOAorI2RlZmluZSByZWdfcGlvX3JfZGluX19fcmRfbl9fX2xzYiA4CisjZGVmaW5lIHJlZ19waW9fcl9kaW5fX19yZF9uX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlvX3JfZGluX19fcmRfbl9fX2JpdCA4CisjZGVmaW5lIHJlZ19waW9fcl9kaW5fX193cl9uX19fbHNiIDkKKyNkZWZpbmUgcmVnX3Bpb19yX2Rpbl9fX3dyX25fX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW9fcl9kaW5fX193cl9uX19fYml0IDkKKyNkZWZpbmUgcmVnX3Bpb19yX2Rpbl9fX2EwX19fbHNiIDEwCisjZGVmaW5lIHJlZ19waW9fcl9kaW5fX19hMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpb19yX2Rpbl9fX2EwX19fYml0IDEwCisjZGVmaW5lIHJlZ19waW9fcl9kaW5fX19hMV9fX2xzYiAxMQorI2RlZmluZSByZWdfcGlvX3JfZGluX19fYTFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW9fcl9kaW5fX19hMV9fX2JpdCAxMQorI2RlZmluZSByZWdfcGlvX3JfZGluX19fY2UwX25fX19sc2IgMTIKKyNkZWZpbmUgcmVnX3Bpb19yX2Rpbl9fX2NlMF9uX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlvX3JfZGluX19fY2UwX25fX19iaXQgMTIKKyNkZWZpbmUgcmVnX3Bpb19yX2Rpbl9fX2NlMV9uX19fbHNiIDEzCisjZGVmaW5lIHJlZ19waW9fcl9kaW5fX19jZTFfbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpb19yX2Rpbl9fX2NlMV9uX19fYml0IDEzCisjZGVmaW5lIHJlZ19waW9fcl9kaW5fX19jZTJfbl9fX2xzYiAxNAorI2RlZmluZSByZWdfcGlvX3JfZGluX19fY2UyX25fX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW9fcl9kaW5fX19jZTJfbl9fX2JpdCAxNAorI2RlZmluZSByZWdfcGlvX3JfZGluX19fcmR5X19fbHNiIDE1CisjZGVmaW5lIHJlZ19waW9fcl9kaW5fX19yZHlfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW9fcl9kaW5fX19yZHlfX19iaXQgMTUKKyNkZWZpbmUgcmVnX3Bpb19yX2Rpbl9vZmZzZXQgOTIKKworLyogUmVnaXN0ZXIgcl9zdGF0LCBzY29wZSBwaW8sIHR5cGUgciAqLworI2RlZmluZSByZWdfcGlvX3Jfc3RhdF9fX2J1c3lfX19sc2IgMAorI2RlZmluZSByZWdfcGlvX3Jfc3RhdF9fX2J1c3lfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW9fcl9zdGF0X19fYnVzeV9fX2JpdCAwCisjZGVmaW5lIHJlZ19waW9fcl9zdGF0X29mZnNldCA5NgorCisvKiBSZWdpc3RlciByd19pbnRyX21hc2ssIHNjb3BlIHBpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfcGlvX3J3X2ludHJfbWFza19fX3JkeV9fX2xzYiAwCisjZGVmaW5lIHJlZ19waW9fcndfaW50cl9tYXNrX19fcmR5X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlvX3J3X2ludHJfbWFza19fX3JkeV9fX2JpdCAwCisjZGVmaW5lIHJlZ19waW9fcndfaW50cl9tYXNrX29mZnNldCAxMDAKKworLyogUmVnaXN0ZXIgcndfYWNrX2ludHIsIHNjb3BlIHBpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfcGlvX3J3X2Fja19pbnRyX19fcmR5X19fbHNiIDAKKyNkZWZpbmUgcmVnX3Bpb19yd19hY2tfaW50cl9fX3JkeV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpb19yd19hY2tfaW50cl9fX3JkeV9fX2JpdCAwCisjZGVmaW5lIHJlZ19waW9fcndfYWNrX2ludHJfb2Zmc2V0IDEwNAorCisvKiBSZWdpc3RlciByX2ludHIsIHNjb3BlIHBpbywgdHlwZSByICovCisjZGVmaW5lIHJlZ19waW9fcl9pbnRyX19fcmR5X19fbHNiIDAKKyNkZWZpbmUgcmVnX3Bpb19yX2ludHJfX19yZHlfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW9fcl9pbnRyX19fcmR5X19fYml0IDAKKyNkZWZpbmUgcmVnX3Bpb19yX2ludHJfb2Zmc2V0IDEwOAorCisvKiBSZWdpc3RlciByX21hc2tlZF9pbnRyLCBzY29wZSBwaW8sIHR5cGUgciAqLworI2RlZmluZSByZWdfcGlvX3JfbWFza2VkX2ludHJfX19yZHlfX19sc2IgMAorI2RlZmluZSByZWdfcGlvX3JfbWFza2VkX2ludHJfX19yZHlfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW9fcl9tYXNrZWRfaW50cl9fX3JkeV9fX2JpdCAwCisjZGVmaW5lIHJlZ19waW9fcl9tYXNrZWRfaW50cl9vZmZzZXQgMTEyCisKKworLyogQ29uc3RhbnRzICovCisjZGVmaW5lIHJlZ2tfcGlvX2EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgcmVna19waW9fbm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX3Bpb19ub3JtYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfcGlvX3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna19waW9fcndfY2UwX2NmZ19kZWZhdWx0ICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX3Bpb19yd19jZTFfY2ZnX2RlZmF1bHQgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfcGlvX3J3X2NlMl9jZmdfZGVmYXVsdCAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19waW9fcndfaW50cl9tYXNrX2RlZmF1bHQgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX3Bpb19yd19tYW5fY3RybF9kZWZhdWx0ICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfcGlvX3J3X29lX2RlZmF1bHQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19waW9fd3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX3Bpb193cl9jZTIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIHJlZ2tfcGlvX3llcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna19waW9feWVzX2FsbCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBmZgorI2VuZGlmIC8qIF9fcGlvX2RlZnNfYXNtX2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvYXNtL3JlZ19tYXBfYXNtLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2FzbS9yZWdfbWFwX2FzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NDM5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2FzbS9yZWdfbWFwX2FzbS5oCkBAIC0wLDAgKzEsOTkgQEAKKyNpZm5kZWYgX19yZWdfbWFwX2FzbV9oCisjZGVmaW5lIF9fcmVnX21hcF9hc21faAorCisvKgorICogVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQgZnJvbQorICogICBmaWxlOiAgICAgICAgICAgIHJlZy5ybWFwCisgKiAKKyAqICAgYnkgLi4vLi4vLi4vdG9vbHMvcmRlc2MvYmluL3JkZXMyYyAtYXNtIC1iYXNlIDB4YjAwMDAwMDAgLW1hcCBtYXJiX2Jhci5yIG1hcmJfZm9vLnIgY2NkX3RvcC5yIGNjZF9zdGF0LnIgY2NkX3RnLnIgY2NkX2RwLnIgY2NkLnIgaW9wX3NhcF9pbi5yIGlvcF9zYXBfb3V0LnIgaW9wX3N3X2NmZy5yIGlvcF9zd19jcHUuciBpb3Bfc3dfbXB1LnIgaW9wX3N3X3NwdS5yIGlvcF92ZXJzaW9uLnIgaW9wX2NyY19wYXIuciBpb3BfZG1jX2luLnIgaW9wX2RtY19vdXQuciBpb3BfZmlmb19pbl9leHRyYS5yIGlvcF9maWZvX2luLnIgaW9wX2ZpZm9fb3V0X2V4dHJhLnIgaW9wX2ZpZm9fb3V0LnIgaW9wX21jLnIgaW9wX21wdS5yIGlvcF9zY3JjX2luLnIgaW9wX3NjcmNfb3V0LnIgaW9wX3NwdS5yIGlvcF90aW1lcl9ncnAuciBpb3BfdHJpZ2dlcl9ncnAuciBpb3AuciAtb3V0ZmlsZSByZWdfbWFwX2FzbS5oIHJlZy5ybWFwCisgKiBBbnkgY2hhbmdlcyBoZXJlIHdpbGwgYmUgbG9zdC4KKyAqCisgKiAtKi0gYnVmZmVyLXJlYWQtb25seTogdCAtKi0KKyAqLworI2RlZmluZSByZWdpX2NjZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDAwMDAwCisjZGVmaW5lIHJlZ2lfY2NkX3RvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMDAwMDAKKyNkZWZpbmUgcmVnaV9jY2RfZHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAwMDQwMAorI2RlZmluZSByZWdpX2NjZF9zdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDAwODAwCisjZGVmaW5lIHJlZ2lfY2NkX3RnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMDEwMDAKKyNkZWZpbmUgcmVnaV9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAwMjAwMAorI2RlZmluZSByZWdpX2Nsa2dlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDA0MDAwCisjZGVmaW5lIHJlZ2lfZGRyMl9jdHJsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMDYwMDAKKyNkZWZpbmUgcmVnaV9kbWEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAwODAwMAorI2RlZmluZSByZWdpX2RtYTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDBhMDAwCisjZGVmaW5lIHJlZ2lfZG1hMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMGMwMDAKKyNkZWZpbmUgcmVnaV9kbWEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAwZTAwMAorI2RlZmluZSByZWdpX2RtYTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDEwMDAwCisjZGVmaW5lIHJlZ2lfZG1hNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMTIwMDAKKyNkZWZpbmUgcmVnaV9kbWE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAxNDAwMAorI2RlZmluZSByZWdpX2RtYTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDE2MDAwCisjZGVmaW5lIHJlZ2lfZG1hNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMTgwMDAKKyNkZWZpbmUgcmVnaV9kbWE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAxYTAwMAorI2RlZmluZSByZWdpX2V0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDFjMDAwCisjZGVmaW5lIHJlZ2lfZ2lvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMjAwMDAKKyNkZWZpbmUgcmVnaV9oMjY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAyMjAwMAorI2RlZmluZSByZWdpX2hpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDI2MDAwCisjZGVmaW5lIHJlZ2lfaW9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMjgwMDAKKyNkZWZpbmUgcmVnaV9pb3BfdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAyODAwMAorI2RlZmluZSByZWdpX2lvcF9maWZvX2luX2V4dHJhICAgICAgICAgICAgICAgICAgICAweGIwMDI4MDQwCisjZGVmaW5lIHJlZ2lfaW9wX2ZpZm9fb3V0X2V4dHJhICAgICAgICAgICAgICAgICAgIDB4YjAwMjgwODAKKyNkZWZpbmUgcmVnaV9pb3BfdHJpZ2dlcl9ncnAwICAgICAgICAgICAgICAgICAgICAgMHhiMDAyODBjMAorI2RlZmluZSByZWdpX2lvcF90cmlnZ2VyX2dycDEgICAgICAgICAgICAgICAgICAgICAweGIwMDI4MTAwCisjZGVmaW5lIHJlZ2lfaW9wX3RyaWdnZXJfZ3JwMiAgICAgICAgICAgICAgICAgICAgIDB4YjAwMjgxNDAKKyNkZWZpbmUgcmVnaV9pb3BfdHJpZ2dlcl9ncnAzICAgICAgICAgICAgICAgICAgICAgMHhiMDAyODE4MAorI2RlZmluZSByZWdpX2lvcF90cmlnZ2VyX2dycDQgICAgICAgICAgICAgICAgICAgICAweGIwMDI4MWMwCisjZGVmaW5lIHJlZ2lfaW9wX3RyaWdnZXJfZ3JwNSAgICAgICAgICAgICAgICAgICAgIDB4YjAwMjgyMDAKKyNkZWZpbmUgcmVnaV9pb3BfdHJpZ2dlcl9ncnA2ICAgICAgICAgICAgICAgICAgICAgMHhiMDAyODI0MAorI2RlZmluZSByZWdpX2lvcF90cmlnZ2VyX2dycDcgICAgICAgICAgICAgICAgICAgICAweGIwMDI4MjgwCisjZGVmaW5lIHJlZ2lfaW9wX2NyY19wYXIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMjgzMDAKKyNkZWZpbmUgcmVnaV9pb3BfZG1jX2luICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAyODM4MAorI2RlZmluZSByZWdpX2lvcF9kbWNfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDI4NDAwCisjZGVmaW5lIHJlZ2lfaW9wX2ZpZm9faW4gICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMjg0ODAKKyNkZWZpbmUgcmVnaV9pb3BfZmlmb19vdXQgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAyODUwMAorI2RlZmluZSByZWdpX2lvcF9zY3JjX2luICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDI4NTgwCisjZGVmaW5lIHJlZ2lfaW9wX3NjcmNfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMjg2MDAKKyNkZWZpbmUgcmVnaV9pb3BfdGltZXJfZ3JwMCAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAyODY4MAorI2RlZmluZSByZWdpX2lvcF90aW1lcl9ncnAxICAgICAgICAgICAgICAgICAgICAgICAweGIwMDI4NzAwCisjZGVmaW5lIHJlZ2lfaW9wX3NhcF9pbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMjg4MDAKKyNkZWZpbmUgcmVnaV9pb3Bfc2FwX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAyODkwMAorI2RlZmluZSByZWdpX2lvcF9zcHUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDI4YTAwCisjZGVmaW5lIHJlZ2lfaW9wX3N3X2NmZyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMjhiMDAKKyNkZWZpbmUgcmVnaV9pb3Bfc3dfY3B1ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAyOGMwMAorI2RlZmluZSByZWdpX2lvcF9zd19tcHUgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDI4ZDAwCisjZGVmaW5lIHJlZ2lfaW9wX3N3X3NwdSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMjhlMDAKKyNkZWZpbmUgcmVnaV9pb3BfbXB1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAyOTAwMAorI2RlZmluZSByZWdpX2lycSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDJhMDAwCisjZGVmaW5lIHJlZ2lfanBlZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMmMwMDAKKyNkZWZpbmUgcmVnaV9sMmNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAzMDAwMAorI2RlZmluZSByZWdpX21hcmJfYmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDMyMDAwCisjZGVmaW5lIHJlZ2lfbWFyYl9iYXJfYnAwICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMzIxNDAKKyNkZWZpbmUgcmVnaV9tYXJiX2Jhcl9icDEgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAzMjE4MAorI2RlZmluZSByZWdpX21hcmJfYmFyX2JwMiAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDMyMWMwCisjZGVmaW5lIHJlZ2lfbWFyYl9iYXJfYnAzICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMzIyMDAKKyNkZWZpbmUgcmVnaV9tYXJiX2ZvbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAzNDAwMAorI2RlZmluZSByZWdpX21hcmJfZm9vX2JwMCAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDM0MjgwCisjZGVmaW5lIHJlZ2lfbWFyYl9mb29fYnAxICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMzQyYzAKKyNkZWZpbmUgcmVnaV9tYXJiX2Zvb19icDIgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAzNDMwMAorI2RlZmluZSByZWdpX21hcmJfZm9vX2JwMyAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDM0MzQwCisjZGVmaW5lIHJlZ2lfcGlubXV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMzgwMDAKKyNkZWZpbmUgcmVnaV9waW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAzNjAwMAorI2RlZmluZSByZWdpX3NjbHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDNhMDAwCisjZGVmaW5lIHJlZ2lfc2Nscl9maWZvICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwM2MwMDAKKyNkZWZpbmUgcmVnaV9zZXIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAzZTAwMAorI2RlZmluZSByZWdpX3NlcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDQwMDAwCisjZGVmaW5lIHJlZ2lfc2VyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwNDIwMDAKKyNkZWZpbmUgcmVnaV9zZXIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDA0NDAwMAorI2RlZmluZSByZWdpX3NlcjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDQ2MDAwCisjZGVmaW5lIHJlZ2lfc3NlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwNDgwMDAKKyNkZWZpbmUgcmVnaV9zdHJjb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDA0YTAwMAorI2RlZmluZSByZWdpX3N0cmRtYTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDRlMDAwCisjZGVmaW5lIHJlZ2lfc3RyZG1hMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwNTAwMDAKKyNkZWZpbmUgcmVnaV9zdHJkbWEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDA1MjAwMAorI2RlZmluZSByZWdpX3N0cmRtYTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDU0MDAwCisjZGVmaW5lIHJlZ2lfc3RyZG1hNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwNTYwMDAKKyNkZWZpbmUgcmVnaV9zdHJtdXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDA0YzAwMAorI2RlZmluZSByZWdpX3RpbWVyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDU4MDAwCisjZGVmaW5lIHJlZ2lfdGltZXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwNWEwMDAKKyNkZWZpbmUgcmVnaV90cmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDA1YzAwMAorI2RlZmluZSByZWdpX3ZpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDVlMDAwCisjZGVmaW5lIHJlZ2lfdm91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwNjAwMDAKKyNlbmRpZiAvKiBfX3JlZ19tYXBfYXNtX2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvYXNtL3RpbWVyX2RlZnNfYXNtLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2FzbS90aW1lcl9kZWZzX2FzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMjllODIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2FzbS90aW1lcl9kZWZzX2FzbS5oCkBAIC0wLDAgKzEsMjI4IEBACisjaWZuZGVmIF9fdGltZXJfZGVmc19hc21faAorI2RlZmluZSBfX3RpbWVyX2RlZnNfYXNtX2gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGZyb20KKyAqICAgZmlsZTogICAgICAgICAgIHRpbWVyLnIKKyAqIAorICogICBieSAuLi8uLi8uLi90b29scy9yZGVzYy9iaW4vcmRlczJjIC1hc20gLW91dGZpbGUgdGltZXJfZGVmc19hc20uaCB0aW1lci5yCisgKiBBbnkgY2hhbmdlcyBoZXJlIHdpbGwgYmUgbG9zdC4KKyAqCisgKiAtKi0gYnVmZmVyLXJlYWQtb25seTogdCAtKi0KKyAqLworCisjaWZuZGVmIFJFR19GSUVMRAorI2RlZmluZSBSRUdfRklFTEQoIHNjb3BlLCByZWcsIGZpZWxkLCB2YWx1ZSApIFwKKyAgUkVHX0ZJRUxEX1hfKCB2YWx1ZSwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX0ZJRUxEX1hfKCB2YWx1ZSwgc2hpZnQgKSAoKHZhbHVlKSA8PCBzaGlmdCkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19TVEFURQorI2RlZmluZSBSRUdfU1RBVEUoIHNjb3BlLCByZWcsIGZpZWxkLCBzeW1ib2xpY192YWx1ZSApIFwKKyAgUkVHX1NUQVRFX1hfKCByZWdrXyMjc2NvcGUjI18jI3N5bWJvbGljX3ZhbHVlLCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX19sc2IgKQorI2RlZmluZSBSRUdfU1RBVEVfWF8oIGssIHNoaWZ0ICkgKGsgPDwgc2hpZnQpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfTUFTSworI2RlZmluZSBSRUdfTUFTSyggc2NvcGUsIHJlZywgZmllbGQgKSBcCisgIFJFR19NQVNLX1hfKCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX193aWR0aCwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX01BU0tfWF8oIHdpZHRoLCBsc2IgKSAoKCgxIDw8IHdpZHRoKS0xKSA8PCBsc2IpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfTFNCCisjZGVmaW5lIFJFR19MU0IoIHNjb3BlLCByZWcsIGZpZWxkICkgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQklUCisjZGVmaW5lIFJFR19CSVQoIHNjb3BlLCByZWcsIGZpZWxkICkgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fYml0CisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUgorI2RlZmluZSBSRUdfQUREUiggc2NvcGUsIGluc3QsIHJlZyApIFJFR19BRERSX1hfKGluc3QsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19vZmZzZXQpCisjZGVmaW5lIFJFR19BRERSX1hfKCBpbnN0LCBvZmZzICkgKChpbnN0KSArIG9mZnMpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUl9WRUNUCisjZGVmaW5lIFJFR19BRERSX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICAgICAgICAgUkVHX0FERFJfVkVDVF9YXyhpbnN0LCByZWdfIyNzY29wZSMjXyMjcmVnIyNfb2Zmc2V0LCBpbmRleCwgXAorCQkJIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2RlZmluZSBSRUdfQUREUl9WRUNUX1hfKCBpbnN0LCBvZmZzLCBpbmRleCwgc3RyaWRlICkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKGluc3QpICsgb2ZmcyArIChpbmRleCkgKiBzdHJpZGUpCisjZW5kaWYKKworLyogUmVnaXN0ZXIgcndfdG1yMF9kaXYsIHNjb3BlIHRpbWVyLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ190aW1lcl9yd190bXIwX2Rpdl9vZmZzZXQgMAorCisvKiBSZWdpc3RlciByX3RtcjBfZGF0YSwgc2NvcGUgdGltZXIsIHR5cGUgciAqLworI2RlZmluZSByZWdfdGltZXJfcl90bXIwX2RhdGFfb2Zmc2V0IDQKKworLyogUmVnaXN0ZXIgcndfdG1yMF9jdHJsLCBzY29wZSB0aW1lciwgdHlwZSBydyAqLworI2RlZmluZSByZWdfdGltZXJfcndfdG1yMF9jdHJsX19fb3BfX19sc2IgMAorI2RlZmluZSByZWdfdGltZXJfcndfdG1yMF9jdHJsX19fb3BfX193aWR0aCAyCisjZGVmaW5lIHJlZ190aW1lcl9yd190bXIwX2N0cmxfX19mcmVxX19fbHNiIDIKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X3RtcjBfY3RybF9fX2ZyZXFfX193aWR0aCAzCisjZGVmaW5lIHJlZ190aW1lcl9yd190bXIwX2N0cmxfb2Zmc2V0IDgKKworLyogUmVnaXN0ZXIgcndfdG1yMV9kaXYsIHNjb3BlIHRpbWVyLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ190aW1lcl9yd190bXIxX2Rpdl9vZmZzZXQgMTYKKworLyogUmVnaXN0ZXIgcl90bXIxX2RhdGEsIHNjb3BlIHRpbWVyLCB0eXBlIHIgKi8KKyNkZWZpbmUgcmVnX3RpbWVyX3JfdG1yMV9kYXRhX29mZnNldCAyMAorCisvKiBSZWdpc3RlciByd190bXIxX2N0cmwsIHNjb3BlIHRpbWVyLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ190aW1lcl9yd190bXIxX2N0cmxfX19vcF9fX2xzYiAwCisjZGVmaW5lIHJlZ190aW1lcl9yd190bXIxX2N0cmxfX19vcF9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X3RtcjFfY3RybF9fX2ZyZXFfX19sc2IgMgorI2RlZmluZSByZWdfdGltZXJfcndfdG1yMV9jdHJsX19fZnJlcV9fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X3RtcjFfY3RybF9vZmZzZXQgMjQKKworLyogUmVnaXN0ZXIgcnNfY250X2RhdGEsIHNjb3BlIHRpbWVyLCB0eXBlIHJzICovCisjZGVmaW5lIHJlZ190aW1lcl9yc19jbnRfZGF0YV9fX3Rtcl9fX2xzYiAwCisjZGVmaW5lIHJlZ190aW1lcl9yc19jbnRfZGF0YV9fX3Rtcl9fX3dpZHRoIDI0CisjZGVmaW5lIHJlZ190aW1lcl9yc19jbnRfZGF0YV9fX2NudF9fX2xzYiAyNAorI2RlZmluZSByZWdfdGltZXJfcnNfY250X2RhdGFfX19jbnRfX193aWR0aCA4CisjZGVmaW5lIHJlZ190aW1lcl9yc19jbnRfZGF0YV9vZmZzZXQgMzIKKworLyogUmVnaXN0ZXIgcl9jbnRfZGF0YSwgc2NvcGUgdGltZXIsIHR5cGUgciAqLworI2RlZmluZSByZWdfdGltZXJfcl9jbnRfZGF0YV9fX3Rtcl9fX2xzYiAwCisjZGVmaW5lIHJlZ190aW1lcl9yX2NudF9kYXRhX19fdG1yX19fd2lkdGggMjQKKyNkZWZpbmUgcmVnX3RpbWVyX3JfY250X2RhdGFfX19jbnRfX19sc2IgMjQKKyNkZWZpbmUgcmVnX3RpbWVyX3JfY250X2RhdGFfX19jbnRfX193aWR0aCA4CisjZGVmaW5lIHJlZ190aW1lcl9yX2NudF9kYXRhX29mZnNldCAzNgorCisvKiBSZWdpc3RlciByd19jbnRfY2ZnLCBzY29wZSB0aW1lciwgdHlwZSBydyAqLworI2RlZmluZSByZWdfdGltZXJfcndfY250X2NmZ19fX2Nsa19fX2xzYiAwCisjZGVmaW5lIHJlZ190aW1lcl9yd19jbnRfY2ZnX19fY2xrX19fd2lkdGggMgorI2RlZmluZSByZWdfdGltZXJfcndfY250X2NmZ19vZmZzZXQgNDAKKworLyogUmVnaXN0ZXIgcndfdHJpZywgc2NvcGUgdGltZXIsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX3RpbWVyX3J3X3RyaWdfb2Zmc2V0IDQ4CisKKy8qIFJlZ2lzdGVyIHJ3X3RyaWdfY2ZnLCBzY29wZSB0aW1lciwgdHlwZSBydyAqLworI2RlZmluZSByZWdfdGltZXJfcndfdHJpZ19jZmdfX190bXJfX19sc2IgMAorI2RlZmluZSByZWdfdGltZXJfcndfdHJpZ19jZmdfX190bXJfX193aWR0aCAyCisjZGVmaW5lIHJlZ190aW1lcl9yd190cmlnX2NmZ19vZmZzZXQgNTIKKworLyogUmVnaXN0ZXIgcl90aW1lLCBzY29wZSB0aW1lciwgdHlwZSByICovCisjZGVmaW5lIHJlZ190aW1lcl9yX3RpbWVfb2Zmc2V0IDU2CisKKy8qIFJlZ2lzdGVyIHJ3X291dCwgc2NvcGUgdGltZXIsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX3RpbWVyX3J3X291dF9fX3Rtcl9fX2xzYiAwCisjZGVmaW5lIHJlZ190aW1lcl9yd19vdXRfX190bXJfX193aWR0aCAyCisjZGVmaW5lIHJlZ190aW1lcl9yd19vdXRfb2Zmc2V0IDYwCisKKy8qIFJlZ2lzdGVyIHJ3X3dkX2N0cmwsIHNjb3BlIHRpbWVyLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ190aW1lcl9yd193ZF9jdHJsX19fY250X19fbHNiIDAKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X3dkX2N0cmxfX19jbnRfX193aWR0aCA4CisjZGVmaW5lIHJlZ190aW1lcl9yd193ZF9jdHJsX19fY21kX19fbHNiIDgKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X3dkX2N0cmxfX19jbWRfX193aWR0aCAxCisjZGVmaW5lIHJlZ190aW1lcl9yd193ZF9jdHJsX19fY21kX19fYml0IDgKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X3dkX2N0cmxfX19rZXlfX19sc2IgOQorI2RlZmluZSByZWdfdGltZXJfcndfd2RfY3RybF9fX2tleV9fX3dpZHRoIDcKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X3dkX2N0cmxfb2Zmc2V0IDY0CisKKy8qIFJlZ2lzdGVyIHJfd2Rfc3RhdCwgc2NvcGUgdGltZXIsIHR5cGUgciAqLworI2RlZmluZSByZWdfdGltZXJfcl93ZF9zdGF0X19fY250X19fbHNiIDAKKyNkZWZpbmUgcmVnX3RpbWVyX3Jfd2Rfc3RhdF9fX2NudF9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX3RpbWVyX3Jfd2Rfc3RhdF9fX2NtZF9fX2xzYiA4CisjZGVmaW5lIHJlZ190aW1lcl9yX3dkX3N0YXRfX19jbWRfX193aWR0aCAxCisjZGVmaW5lIHJlZ190aW1lcl9yX3dkX3N0YXRfX19jbWRfX19iaXQgOAorI2RlZmluZSByZWdfdGltZXJfcl93ZF9zdGF0X29mZnNldCA2OAorCisvKiBSZWdpc3RlciByd19pbnRyX21hc2ssIHNjb3BlIHRpbWVyLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ190aW1lcl9yd19pbnRyX21hc2tfX190bXIwX19fbHNiIDAKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X2ludHJfbWFza19fX3RtcjBfX193aWR0aCAxCisjZGVmaW5lIHJlZ190aW1lcl9yd19pbnRyX21hc2tfX190bXIwX19fYml0IDAKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X2ludHJfbWFza19fX3RtcjFfX19sc2IgMQorI2RlZmluZSByZWdfdGltZXJfcndfaW50cl9tYXNrX19fdG1yMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X2ludHJfbWFza19fX3RtcjFfX19iaXQgMQorI2RlZmluZSByZWdfdGltZXJfcndfaW50cl9tYXNrX19fY250X19fbHNiIDIKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X2ludHJfbWFza19fX2NudF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X2ludHJfbWFza19fX2NudF9fX2JpdCAyCisjZGVmaW5lIHJlZ190aW1lcl9yd19pbnRyX21hc2tfX190cmlnX19fbHNiIDMKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X2ludHJfbWFza19fX3RyaWdfX193aWR0aCAxCisjZGVmaW5lIHJlZ190aW1lcl9yd19pbnRyX21hc2tfX190cmlnX19fYml0IDMKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X2ludHJfbWFza19vZmZzZXQgNzIKKworLyogUmVnaXN0ZXIgcndfYWNrX2ludHIsIHNjb3BlIHRpbWVyLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ190aW1lcl9yd19hY2tfaW50cl9fX3RtcjBfX19sc2IgMAorI2RlZmluZSByZWdfdGltZXJfcndfYWNrX2ludHJfX190bXIwX19fd2lkdGggMQorI2RlZmluZSByZWdfdGltZXJfcndfYWNrX2ludHJfX190bXIwX19fYml0IDAKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X2Fja19pbnRyX19fdG1yMV9fX2xzYiAxCisjZGVmaW5lIHJlZ190aW1lcl9yd19hY2tfaW50cl9fX3RtcjFfX193aWR0aCAxCisjZGVmaW5lIHJlZ190aW1lcl9yd19hY2tfaW50cl9fX3RtcjFfX19iaXQgMQorI2RlZmluZSByZWdfdGltZXJfcndfYWNrX2ludHJfX19jbnRfX19sc2IgMgorI2RlZmluZSByZWdfdGltZXJfcndfYWNrX2ludHJfX19jbnRfX193aWR0aCAxCisjZGVmaW5lIHJlZ190aW1lcl9yd19hY2tfaW50cl9fX2NudF9fX2JpdCAyCisjZGVmaW5lIHJlZ190aW1lcl9yd19hY2tfaW50cl9fX3RyaWdfX19sc2IgMworI2RlZmluZSByZWdfdGltZXJfcndfYWNrX2ludHJfX190cmlnX19fd2lkdGggMQorI2RlZmluZSByZWdfdGltZXJfcndfYWNrX2ludHJfX190cmlnX19fYml0IDMKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X2Fja19pbnRyX29mZnNldCA3NgorCisvKiBSZWdpc3RlciByX2ludHIsIHNjb3BlIHRpbWVyLCB0eXBlIHIgKi8KKyNkZWZpbmUgcmVnX3RpbWVyX3JfaW50cl9fX3RtcjBfX19sc2IgMAorI2RlZmluZSByZWdfdGltZXJfcl9pbnRyX19fdG1yMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3RpbWVyX3JfaW50cl9fX3RtcjBfX19iaXQgMAorI2RlZmluZSByZWdfdGltZXJfcl9pbnRyX19fdG1yMV9fX2xzYiAxCisjZGVmaW5lIHJlZ190aW1lcl9yX2ludHJfX190bXIxX19fd2lkdGggMQorI2RlZmluZSByZWdfdGltZXJfcl9pbnRyX19fdG1yMV9fX2JpdCAxCisjZGVmaW5lIHJlZ190aW1lcl9yX2ludHJfX19jbnRfX19sc2IgMgorI2RlZmluZSByZWdfdGltZXJfcl9pbnRyX19fY250X19fd2lkdGggMQorI2RlZmluZSByZWdfdGltZXJfcl9pbnRyX19fY250X19fYml0IDIKKyNkZWZpbmUgcmVnX3RpbWVyX3JfaW50cl9fX3RyaWdfX19sc2IgMworI2RlZmluZSByZWdfdGltZXJfcl9pbnRyX19fdHJpZ19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3RpbWVyX3JfaW50cl9fX3RyaWdfX19iaXQgMworI2RlZmluZSByZWdfdGltZXJfcl9pbnRyX29mZnNldCA4MAorCisvKiBSZWdpc3RlciByX21hc2tlZF9pbnRyLCBzY29wZSB0aW1lciwgdHlwZSByICovCisjZGVmaW5lIHJlZ190aW1lcl9yX21hc2tlZF9pbnRyX19fdG1yMF9fX2xzYiAwCisjZGVmaW5lIHJlZ190aW1lcl9yX21hc2tlZF9pbnRyX19fdG1yMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3RpbWVyX3JfbWFza2VkX2ludHJfX190bXIwX19fYml0IDAKKyNkZWZpbmUgcmVnX3RpbWVyX3JfbWFza2VkX2ludHJfX190bXIxX19fbHNiIDEKKyNkZWZpbmUgcmVnX3RpbWVyX3JfbWFza2VkX2ludHJfX190bXIxX19fd2lkdGggMQorI2RlZmluZSByZWdfdGltZXJfcl9tYXNrZWRfaW50cl9fX3RtcjFfX19iaXQgMQorI2RlZmluZSByZWdfdGltZXJfcl9tYXNrZWRfaW50cl9fX2NudF9fX2xzYiAyCisjZGVmaW5lIHJlZ190aW1lcl9yX21hc2tlZF9pbnRyX19fY250X19fd2lkdGggMQorI2RlZmluZSByZWdfdGltZXJfcl9tYXNrZWRfaW50cl9fX2NudF9fX2JpdCAyCisjZGVmaW5lIHJlZ190aW1lcl9yX21hc2tlZF9pbnRyX19fdHJpZ19fX2xzYiAzCisjZGVmaW5lIHJlZ190aW1lcl9yX21hc2tlZF9pbnRyX19fdHJpZ19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3RpbWVyX3JfbWFza2VkX2ludHJfX190cmlnX19fYml0IDMKKyNkZWZpbmUgcmVnX3RpbWVyX3JfbWFza2VkX2ludHJfb2Zmc2V0IDg0CisKKy8qIFJlZ2lzdGVyIHJ3X3Rlc3QsIHNjb3BlIHRpbWVyLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ190aW1lcl9yd190ZXN0X19fZGlzX19fbHNiIDAKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X3Rlc3RfX19kaXNfX193aWR0aCAxCisjZGVmaW5lIHJlZ190aW1lcl9yd190ZXN0X19fZGlzX19fYml0IDAKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X3Rlc3RfX19lbl9fX2xzYiAxCisjZGVmaW5lIHJlZ190aW1lcl9yd190ZXN0X19fZW5fX193aWR0aCAxCisjZGVmaW5lIHJlZ190aW1lcl9yd190ZXN0X19fZW5fX19iaXQgMQorI2RlZmluZSByZWdfdGltZXJfcndfdGVzdF9vZmZzZXQgODgKKworCisvKiBDb25zdGFudHMgKi8KKyNkZWZpbmUgcmVna190aW1lcl9leHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX3RpbWVyX2YxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIHJlZ2tfdGltZXJfZjI5XzQ5MyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgcmVna190aW1lcl9mMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNQorI2RlZmluZSByZWdrX3RpbWVyX2YzMl83NjggICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2CisjZGVmaW5lIHJlZ2tfdGltZXJfZjkwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgcmVna190aW1lcl9ob2xkICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX3RpbWVyX2xkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfdGltZXJfbm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna190aW1lcl9vZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX3RpbWVyX3J1biAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIHJlZ2tfdGltZXJfcndfY250X2NmZ19kZWZhdWx0ICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna190aW1lcl9yd19pbnRyX21hc2tfZGVmYXVsdCAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX3RpbWVyX3J3X291dF9kZWZhdWx0ICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfdGltZXJfcndfdGVzdF9kZWZhdWx0ICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna190aW1lcl9yd190bXIwX2N0cmxfZGVmYXVsdCAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX3RpbWVyX3J3X3RtcjFfY3RybF9kZWZhdWx0ICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfdGltZXJfcndfdHJpZ19jZmdfZGVmYXVsdCAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna190aW1lcl9zdGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX3RpbWVyX3N0b3AgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfdGltZXJfdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna190aW1lcl90bXIwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX3RpbWVyX3RtcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIHJlZ2tfdGltZXJfdmNsayAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgcmVna190aW1lcl95ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2VuZGlmIC8qIF9fdGltZXJfZGVmc19hc21faCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9jbGtnZW5fZGVmcy5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9jbGtnZW5fZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZTliYTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2Nsa2dlbl9kZWZzLmgKQEAgLTAsMCArMSwxNTkgQEAKKyNpZm5kZWYgX19jbGtnZW5fZGVmc19oCisjZGVmaW5lIF9fY2xrZ2VuX2RlZnNfaAorCisvKgorICogVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQgZnJvbQorICogICBmaWxlOiAgICAgICAgICAgY2xrZ2VuLnIKKyAqIAorICogICBieSAuLi8uLi8uLi90b29scy9yZGVzYy9iaW4vcmRlczJjIC1vdXRmaWxlIGNsa2dlbl9kZWZzLmggY2xrZ2VuLnIKKyAqIEFueSBjaGFuZ2VzIGhlcmUgd2lsbCBiZSBsb3N0LgorICoKKyAqIC0qLSBidWZmZXItcmVhZC1vbmx5OiB0IC0qLQorICovCisvKiBNYWluIGFjY2VzcyBtYWNyb3MgKi8KKyNpZm5kZWYgUkVHX1JECisjZGVmaW5lIFJFR19SRCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1IKKyNkZWZpbmUgUkVHX1dSKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfVkVDVAorI2RlZmluZSBSRUdfV1JfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXgsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlQKKyNkZWZpbmUgUkVHX1JEX0lOVCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlQKKyNkZWZpbmUgUkVHX1dSX0lOVCggc2NvcGUsIGluc3QsIHJlZywgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1dSX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19UWVBFX0NPTlYKKyNkZWZpbmUgUkVHX1RZUEVfQ09OViggdHlwZSwgb3JndHlwZSwgdmFsICkgXAorICAoIHsgdW5pb24geyBvcmd0eXBlIG87IHR5cGUgbjsgfSByOyByLm8gPSB2YWw7IHIubjsgfSApCisjZW5kaWYKKworI2lmbmRlZiByZWdfcGFnZV9zaXplCisjZGVmaW5lIHJlZ19wYWdlX3NpemUgODE5MgorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFIKKyNkZWZpbmUgUkVHX0FERFIoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19BRERSX1ZFQ1QKKyNkZWZpbmUgUkVHX0FERFJfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisvKiBDLWNvZGUgZm9yIHJlZ2lzdGVyIHNjb3BlIGNsa2dlbiAqLworCisvKiBSZWdpc3RlciByX2Jvb3RzZWwsIHNjb3BlIGNsa2dlbiwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBib290X21vZGUgICAgICAgOiA1OworICB1bnNpZ25lZCBpbnQgaW50ZXJuX21haW5fY2xrIDogMTsKKyAgdW5zaWduZWQgaW50IGV4dGVybl91c2IyX2NsayA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICAgICAgOiAyNTsKK30gcmVnX2Nsa2dlbl9yX2Jvb3RzZWw7CisjZGVmaW5lIFJFR19SRF9BRERSX2Nsa2dlbl9yX2Jvb3RzZWwgMAorCisvKiBSZWdpc3RlciByd19jbGtfY3RybCwgc2NvcGUgY2xrZ2VuLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBwbGwgICAgICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgY3B1ICAgICAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGlvcF91c2IgICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB2aW4gICAgICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2NsciAgICAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGgyNjQgICAgICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkZHIyICAgICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdm91dF9oaXN0ICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGV0aCAgICAgICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBjY2RfdGdfMjAwICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMF8xX2V0aCAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGNjZF90Z18xMDAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBqcGVnICAgICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc3Nlcl9zZXJfZG1hNl83IDogMTsKKyAgdW5zaWduZWQgaW50IHN0cmRtYTBfMl92aWRlbyA6IDE7CisgIHVuc2lnbmVkIGludCBkbWEyXzNfc3RyY29wICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNF81X2lvcCAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTlfMTEgICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBtZW1hcmJfYmFyX2RkciAgOiAxOworICB1bnNpZ25lZCBpbnQgc2Nscl9oMjY0ICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgICAgICA6IDEyOworfSByZWdfY2xrZ2VuX3J3X2Nsa19jdHJsOworI2RlZmluZSBSRUdfUkRfQUREUl9jbGtnZW5fcndfY2xrX2N0cmwgNAorI2RlZmluZSBSRUdfV1JfQUREUl9jbGtnZW5fcndfY2xrX2N0cmwgNAorCisKKy8qIENvbnN0YW50cyAqLworZW51bSB7CisgIHJlZ2tfY2xrZ2VuX2V0aDEwMDBfcnggICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDBjLAorICByZWdrX2Nsa2dlbl9ldGgxMDAwX3R4ICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwZSwKKyAgcmVna19jbGtnZW5fZXRoMTAwX3J4ICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMWQsCisgIHJlZ2tfY2xrZ2VuX2V0aDEwMF9yeF9oYWxmICAgICAgICAgICAgICAgPSAweDAwMDAwMDFjLAorICByZWdrX2Nsa2dlbl9ldGgxMDBfdHggICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAxZiwKKyAgcmVna19jbGtnZW5fZXRoMTAwX3R4X2hhbGYgICAgICAgICAgICAgICA9IDB4MDAwMDAwMWUsCisgIHJlZ2tfY2xrZ2VuX25hbmRfM18yICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2Nsa2dlbl9uYW5kXzNfMl8weDMwICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19jbGtnZW5fbmFuZF8zXzJfMHgzMF9wbGwgICAgICAgICAgICA9IDB4MDAwMDAwMTIsCisgIHJlZ2tfY2xrZ2VuX25hbmRfM18yX3BsbCAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDEwLAorICByZWdrX2Nsa2dlbl9uYW5kXzNfMyAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19jbGtnZW5fbmFuZF8zXzNfMHgzMCAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfY2xrZ2VuX25hbmRfM18zXzB4MzBfcGxsICAgICAgICAgICAgPSAweDAwMDAwMDEzLAorICByZWdrX2Nsa2dlbl9uYW5kXzNfM19wbGwgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAxMSwKKyAgcmVna19jbGtnZW5fbmFuZF80XzIgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDQsCisgIHJlZ2tfY2xrZ2VuX25hbmRfNF8yXzB4MzAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA2LAorICByZWdrX2Nsa2dlbl9uYW5kXzRfMl8weDMwX3BsbCAgICAgICAgICAgID0gMHgwMDAwMDAxNiwKKyAgcmVna19jbGtnZW5fbmFuZF80XzJfcGxsICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMTQsCisgIHJlZ2tfY2xrZ2VuX25hbmRfNF8zICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA1LAorICByZWdrX2Nsa2dlbl9uYW5kXzRfM18weDMwICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNywKKyAgcmVna19jbGtnZW5fbmFuZF80XzNfMHgzMF9wbGwgICAgICAgICAgICA9IDB4MDAwMDAwMTcsCisgIHJlZ2tfY2xrZ2VuX25hbmRfNF8zX3BsbCAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDE1LAorICByZWdrX2Nsa2dlbl9uYW5kXzVfMiAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwOCwKKyAgcmVna19jbGtnZW5fbmFuZF81XzJfMHgzMCAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMGEsCisgIHJlZ2tfY2xrZ2VuX25hbmRfNV8yXzB4MzBfcGxsICAgICAgICAgICAgPSAweDAwMDAwMDFhLAorICByZWdrX2Nsa2dlbl9uYW5kXzVfMl9wbGwgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAxOCwKKyAgcmVna19jbGtnZW5fbmFuZF81XzMgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDksCisgIHJlZ2tfY2xrZ2VuX25hbmRfNV8zXzB4MzAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDBiLAorICByZWdrX2Nsa2dlbl9uYW5kXzVfM18weDMwX3BsbCAgICAgICAgICAgID0gMHgwMDAwMDAxYiwKKyAgcmVna19jbGtnZW5fbmFuZF81XzNfcGxsICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMTksCisgIHJlZ2tfY2xrZ2VuX25vICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2Nsa2dlbl9yd19jbGtfY3RybF9kZWZhdWx0ICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19jbGtnZW5fc2VyICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMGQsCisgIHJlZ2tfY2xrZ2VuX3Nlcl9wbGwgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDBmLAorICByZWdrX2Nsa2dlbl95ZXMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMQorfTsKKyNlbmRpZiAvKiBfX2Nsa2dlbl9kZWZzX2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvZGRyMl9kZWZzLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2RkcjJfZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMzBlOGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2RkcjJfZGVmcy5oCkBAIC0wLDAgKzEsMjgxIEBACisjaWZuZGVmIF9fZGRyMl9kZWZzX2gKKyNkZWZpbmUgX19kZHIyX2RlZnNfaAorCisvKgorICogVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQgZnJvbQorICogICBmaWxlOiAgICAgICAgICAgZGRyMi5yCisgKiAKKyAqICAgYnkgLi4vLi4vLi4vdG9vbHMvcmRlc2MvYmluL3JkZXMyYyAtb3V0ZmlsZSBkZHIyX2RlZnMuaCBkZHIyLnIKKyAqIEFueSBjaGFuZ2VzIGhlcmUgd2lsbCBiZSBsb3N0LgorICoKKyAqIC0qLSBidWZmZXItcmVhZC1vbmx5OiB0IC0qLQorICovCisvKiBNYWluIGFjY2VzcyBtYWNyb3MgKi8KKyNpZm5kZWYgUkVHX1JECisjZGVmaW5lIFJFR19SRCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1IKKyNkZWZpbmUgUkVHX1dSKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfVkVDVAorI2RlZmluZSBSRUdfV1JfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXgsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlQKKyNkZWZpbmUgUkVHX1JEX0lOVCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlQKKyNkZWZpbmUgUkVHX1dSX0lOVCggc2NvcGUsIGluc3QsIHJlZywgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1dSX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19UWVBFX0NPTlYKKyNkZWZpbmUgUkVHX1RZUEVfQ09OViggdHlwZSwgb3JndHlwZSwgdmFsICkgXAorICAoIHsgdW5pb24geyBvcmd0eXBlIG87IHR5cGUgbjsgfSByOyByLm8gPSB2YWw7IHIubjsgfSApCisjZW5kaWYKKworI2lmbmRlZiByZWdfcGFnZV9zaXplCisjZGVmaW5lIHJlZ19wYWdlX3NpemUgODE5MgorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFIKKyNkZWZpbmUgUkVHX0FERFIoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19BRERSX1ZFQ1QKKyNkZWZpbmUgUkVHX0FERFJfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisvKiBDLWNvZGUgZm9yIHJlZ2lzdGVyIHNjb3BlIGRkcjIgKi8KKworLyogUmVnaXN0ZXIgcndfY2ZnLCBzY29wZSBkZHIyLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBjb2xfd2lkdGggICAgICAgIDogNDsKKyAgdW5zaWduZWQgaW50IG5yX2JhbmtzICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgYncgICAgICAgICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBucl9yZWYgICAgICAgICAgIDogNDsKKyAgdW5zaWduZWQgaW50IHJlZl9pbnRlcnZhbCAgICAgOiAxMTsKKyAgdW5zaWduZWQgaW50IG9kdF9jdHJsICAgICAgICAgOiAyOworICB1bnNpZ25lZCBpbnQgb2R0X21lbSAgICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBpbXBfc3RyZW5ndGggICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGF1dG9faW1wX2NhbCAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaW1wX2NhbF9vdmVycmlkZSA6IDE7CisgIHVuc2lnbmVkIGludCBkbGxfb3ZlcnJpZGUgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgICAgICAgOiA0OworfSByZWdfZGRyMl9yd19jZmc7CisjZGVmaW5lIFJFR19SRF9BRERSX2RkcjJfcndfY2ZnIDAKKyNkZWZpbmUgUkVHX1dSX0FERFJfZGRyMl9yd19jZmcgMAorCisvKiBSZWdpc3RlciByd190aW1pbmcsIHNjb3BlIGRkcjIsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHdyICA6IDM7CisgIHVuc2lnbmVkIGludCByY2QgOiAzOworICB1bnNpZ25lZCBpbnQgcnAgIDogMzsKKyAgdW5zaWduZWQgaW50IHJhcyA6IDQ7CisgIHVuc2lnbmVkIGludCByZmMgOiA3OworICB1bnNpZ25lZCBpbnQgcmMgIDogNTsKKyAgdW5zaWduZWQgaW50IHJ0cCA6IDI7CisgIHVuc2lnbmVkIGludCBydHcgOiAzOworICB1bnNpZ25lZCBpbnQgd3RyIDogMjsKK30gcmVnX2RkcjJfcndfdGltaW5nOworI2RlZmluZSBSRUdfUkRfQUREUl9kZHIyX3J3X3RpbWluZyA0CisjZGVmaW5lIFJFR19XUl9BRERSX2RkcjJfcndfdGltaW5nIDQKKworLyogUmVnaXN0ZXIgcndfbGF0ZW5jeSwgc2NvcGUgZGRyMiwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgY2FzICAgICAgOiAzOworICB1bnNpZ25lZCBpbnQgYWRkaXRpdmUgOiAzOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgOiAyNjsKK30gcmVnX2RkcjJfcndfbGF0ZW5jeTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZGRyMl9yd19sYXRlbmN5IDgKKyNkZWZpbmUgUkVHX1dSX0FERFJfZGRyMl9yd19sYXRlbmN5IDgKKworLyogUmVnaXN0ZXIgcndfcGh5X2NmZywgc2NvcGUgZGRyMiwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZW4gOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMzE7Cit9IHJlZ19kZHIyX3J3X3BoeV9jZmc7CisjZGVmaW5lIFJFR19SRF9BRERSX2RkcjJfcndfcGh5X2NmZyAxMgorI2RlZmluZSBSRUdfV1JfQUREUl9kZHIyX3J3X3BoeV9jZmcgMTIKKworLyogUmVnaXN0ZXIgcndfcGh5X2N0cmwsIHNjb3BlIGRkcjIsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHJzdCAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBjYWxfcnN0ICAgOiAxOworICB1bnNpZ25lZCBpbnQgY2FsX3N0YXJ0IDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICA6IDI5OworfSByZWdfZGRyMl9yd19waHlfY3RybDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZGRyMl9yd19waHlfY3RybCAxNgorI2RlZmluZSBSRUdfV1JfQUREUl9kZHIyX3J3X3BoeV9jdHJsIDE2CisKKy8qIFJlZ2lzdGVyIHJ3X2N0cmwsIHNjb3BlIGRkcjIsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IG1yc19kYXRhIDogMTY7CisgIHVuc2lnbmVkIGludCBjbWQgICAgICA6IDg7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICA6IDg7Cit9IHJlZ19kZHIyX3J3X2N0cmw7CisjZGVmaW5lIFJFR19SRF9BRERSX2RkcjJfcndfY3RybCAyMAorI2RlZmluZSBSRUdfV1JfQUREUl9kZHIyX3J3X2N0cmwgMjAKKworLyogUmVnaXN0ZXIgcndfcHdyX2Rvd24sIHNjb3BlIGRkcjIsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHNlbGZfcmVmIDogMjsKKyAgdW5zaWduZWQgaW50IHBoeV9lbiAgIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgIDogMjk7Cit9IHJlZ19kZHIyX3J3X3B3cl9kb3duOworI2RlZmluZSBSRUdfUkRfQUREUl9kZHIyX3J3X3B3cl9kb3duIDI0CisjZGVmaW5lIFJFR19XUl9BRERSX2RkcjJfcndfcHdyX2Rvd24gMjQKKworLyogUmVnaXN0ZXIgcl9zdGF0LCBzY29wZSBkZHIyLCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRsbF9sb2NrICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRsbF9kZWxheV9jb2RlIDogNzsKKyAgdW5zaWduZWQgaW50IGltcF9jYWxfZG9uZSAgIDogMTsKKyAgdW5zaWduZWQgaW50IGltcF9jYWxfZmF1bHQgIDogMTsKKyAgdW5zaWduZWQgaW50IGNhbF9pbXBfcHUgICAgIDogNDsKKyAgdW5zaWduZWQgaW50IGNhbF9pbXBfcGQgICAgIDogNDsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgICAgIDogMTQ7Cit9IHJlZ19kZHIyX3Jfc3RhdDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZGRyMl9yX3N0YXQgMjgKKworLyogUmVnaXN0ZXIgcndfaW1wX2N0cmwsIHNjb3BlIGRkcjIsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGltcF9wdSA6IDQ7CisgIHVuc2lnbmVkIGludCBpbXBfcGQgOiA0OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjQ7Cit9IHJlZ19kZHIyX3J3X2ltcF9jdHJsOworI2RlZmluZSBSRUdfUkRfQUREUl9kZHIyX3J3X2ltcF9jdHJsIDMyCisjZGVmaW5lIFJFR19XUl9BRERSX2RkcjJfcndfaW1wX2N0cmwgMzIKKworI2RlZmluZSBTVFJJREVfZGRyMl9yd19kbGxfY3RybCA0CisvKiBSZWdpc3RlciByd19kbGxfY3RybCwgc2NvcGUgZGRyMiwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgbW9kZSAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGNsa19kZWxheSA6IDc7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgOiAyNDsKK30gcmVnX2RkcjJfcndfZGxsX2N0cmw7CisjZGVmaW5lIFJFR19SRF9BRERSX2RkcjJfcndfZGxsX2N0cmwgMzYKKyNkZWZpbmUgUkVHX1dSX0FERFJfZGRyMl9yd19kbGxfY3RybCAzNgorCisjZGVmaW5lIFNUUklERV9kZHIyX3J3X2Rxc19kbGxfY3RybCA0CisvKiBSZWdpc3RlciByd19kcXNfZGxsX2N0cmwsIHNjb3BlIGRkcjIsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRxczkwX2RlbGF5ICA6IDc7CisgIHVuc2lnbmVkIGludCBkcXMxODBfZGVsYXkgOiA3OworICB1bnNpZ25lZCBpbnQgZHFzMjcwX2RlbGF5IDogNzsKKyAgdW5zaWduZWQgaW50IGRxczM2MF9kZWxheSA6IDc7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICAgOiA0OworfSByZWdfZGRyMl9yd19kcXNfZGxsX2N0cmw7CisjZGVmaW5lIFJFR19SRF9BRERSX2RkcjJfcndfZHFzX2RsbF9jdHJsIDUyCisjZGVmaW5lIFJFR19XUl9BRERSX2RkcjJfcndfZHFzX2RsbF9jdHJsIDUyCisKKworLyogQ29uc3RhbnRzICovCitlbnVtIHsKKyAgcmVna19kZHIyX2FsMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfZGRyMl9hbDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA4LAorICByZWdrX2RkcjJfYWwyICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAxMCwKKyAgcmVna19kZHIyX2FsMyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMTgsCisgIHJlZ2tfZGRyMl9hbDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDIwLAorICByZWdrX2RkcjJfYXV0byAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMywKKyAgcmVna19kZHIyX2Jhbms0ICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfZGRyMl9iYW5rOCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2RkcjJfYmw0ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19kZHIyX2JsOCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfZGRyMl9idF9pbCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA4LAorICByZWdrX2RkcjJfYnRfc2VxICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19kZHIyX2J3MTYgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfZGRyMl9idzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2RkcjJfY2FzMiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAyMCwKKyAgcmVna19kZHIyX2NhczMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMzAsCisgIHJlZ2tfZGRyMl9jYXM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDQwLAorICByZWdrX2RkcjJfY2FzNSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDA1MCwKKyAgcmVna19kZHIyX2Rlc2VsZWN0ICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwYzAsCisgIHJlZ2tfZGRyMl9kaWNfd2VhayAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX2RkcjJfZGlyZWN0ICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19kZHIyX2RpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfZGRyMl9kbGxfZGlzICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2RkcjJfZGxsX2VuICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19kZHIyX2RsbF9yc3QgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAxMDAsCisgIHJlZ2tfZGRyMl9lbXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDgxLAorICByZWdrX2RkcjJfZW1yczIgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDA4MiwKKyAgcmVna19kZHIyX2VtcnMzICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwODMsCisgIHJlZ2tfZGRyMl9mdWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2RkcjJfaGlfcmVmX3JhdGUgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDA4MCwKKyAgcmVna19kZHIyX21ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwODAsCisgIHJlZ2tfZGRyMl9ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2RkcjJfbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDBiOCwKKyAgcmVna19kZHIyX29jZF9hZGogICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAyMDAsCisgIHJlZ2tfZGRyMl9vY2RfZGVmYXVsdCAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMzgwLAorICByZWdrX2RkcjJfb2NkX2RyaXZlMCAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDEwMCwKKyAgcmVna19kZHIyX29jZF9kcml2ZTEgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwODAsCisgIHJlZ2tfZGRyMl9vY2RfZXhpdCAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2RkcjJfb2R0X2RpcyAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19kZHIyX29mZnMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfZGRyMl9wcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDkwLAorICByZWdrX2RkcjJfcHJlX2FsbCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDQwMCwKKyAgcmVna19kZHIyX3B3cl9kb3duX2Zhc3QgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfZGRyMl9wd3JfZG93bl9zbG93ICAgICAgICAgICAgICAgICAgPSAweDAwMDAxMDAwLAorICByZWdrX2RkcjJfcmVmICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDA4OCwKKyAgcmVna19kZHIyX3J0dDE1MCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwNDAsCisgIHJlZ2tfZGRyMl9ydHQ1MCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDQ0LAorICByZWdrX2RkcjJfcnR0NzUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNCwKKyAgcmVna19kZHIyX3J3X2NmZ19kZWZhdWx0ICAgICAgICAgICAgICAgICA9IDB4MDAxODYwMDAsCisgIHJlZ2tfZGRyMl9yd19kbGxfY3RybF9kZWZhdWx0ICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2RkcjJfcndfZGxsX2N0cmxfc2l6ZSAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNCwKKyAgcmVna19kZHIyX3J3X2Rxc19kbGxfY3RybF9kZWZhdWx0ICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfZGRyMl9yd19kcXNfZGxsX2N0cmxfc2l6ZSAgICAgICAgICAgPSAweDAwMDAwMDA0LAorICByZWdrX2RkcjJfcndfbGF0ZW5jeV9kZWZhdWx0ICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19kZHIyX3J3X3BoeV9jZmdfZGVmYXVsdCAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfZGRyMl9yd19wd3JfZG93bl9kZWZhdWx0ICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2RkcjJfcndfdGltaW5nX2RlZmF1bHQgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19kZHIyX3MxR2IgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMWEsCisgIHJlZ2tfZGRyMl9zMjU2TWIgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDBmLAorICByZWdrX2RkcjJfczJHYiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAyNywKKyAgcmVna19kZHIyX3M0R2IgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwNDIsCisgIHJlZ2tfZGRyMl9zNTEyTWIgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDE1LAorICByZWdrX2RkcjJfdGVtcDBfODUgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDYxOCwKKyAgcmVna19kZHIyX3RlbXA4NV85NSAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAzMGMsCisgIHJlZ2tfZGRyMl90ZXJtMTUwICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX2RkcjJfdGVybTUwICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMywKKyAgcmVna19kZHIyX3Rlcm03NSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfZGRyMl90ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDgwLAorICByZWdrX2RkcjJfd2VhayAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19kZHIyX3dyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAyMDAsCisgIHJlZ2tfZGRyMl93cjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwNDAwLAorICByZWdrX2RkcjJfeWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMQorfTsKKyNlbmRpZiAvKiBfX2RkcjJfZGVmc19oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2dpb19kZWZzLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2dpb19kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ4OGUwZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvZ2lvX2RlZnMuaApAQCAtMCwwICsxLDgzNyBAQAorI2lmbmRlZiBfX2dpb19kZWZzX2gKKyNkZWZpbmUgX19naW9fZGVmc19oCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCisgKiAgIGZpbGU6ICAgICAgICAgICBnaW8ucgorICogCisgKiAgIGJ5IC4uLy4uLy4uL3Rvb2xzL3JkZXNjL2Jpbi9yZGVzMmMgLW91dGZpbGUgZ2lvX2RlZnMuaCBnaW8ucgorICogQW55IGNoYW5nZXMgaGVyZSB3aWxsIGJlIGxvc3QuCisgKgorICogLSotIGJ1ZmZlci1yZWFkLW9ubHk6IHQgLSotCisgKi8KKy8qIE1haW4gYWNjZXNzIG1hY3JvcyAqLworI2lmbmRlZiBSRUdfUkQKKyNkZWZpbmUgUkVHX1JEKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUgorI2RlZmluZSBSRUdfV1IoIHNjb3BlLCBpbnN0LCByZWcsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfVkVDVAorI2RlZmluZSBSRUdfUkRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgIFJFR19SRUFEKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9WRUNUCisjZGVmaW5lIFJFR19XUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgICAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX0lOVAorI2RlZmluZSBSRUdfUkRfSU5UKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSX0lOVAorI2RlZmluZSBSRUdfV1JfSU5UKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlRfVkVDVAorI2RlZmluZSBSRUdfUkRfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlRfVkVDVAorI2RlZmluZSBSRUdfV1JfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4LCB2YWwgKSBcCisgIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1RZUEVfQ09OVgorI2RlZmluZSBSRUdfVFlQRV9DT05WKCB0eXBlLCBvcmd0eXBlLCB2YWwgKSBcCisgICggeyB1bmlvbiB7IG9yZ3R5cGUgbzsgdHlwZSBuOyB9IHI7IHIubyA9IHZhbDsgci5uOyB9ICkKKyNlbmRpZgorCisjaWZuZGVmIHJlZ19wYWdlX3NpemUKKyNkZWZpbmUgcmVnX3BhZ2Vfc2l6ZSA4MTkyCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUgorI2RlZmluZSBSRUdfQUREUiggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFJfVkVDVAorI2RlZmluZSBSRUdfQUREUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKy8qIEMtY29kZSBmb3IgcmVnaXN0ZXIgc2NvcGUgZ2lvICovCisKKy8qIFJlZ2lzdGVyIHJfcGFfZGluLCBzY29wZSBnaW8sIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZGF0YSA6IDMyOworfSByZWdfZ2lvX3JfcGFfZGluOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcl9wYV9kaW4gMAorCisvKiBSZWdpc3RlciByd19wYV9kb3V0LCBzY29wZSBnaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRhdGEgOiAzMjsKK30gcmVnX2dpb19yd19wYV9kb3V0OworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfcGFfZG91dCA0CisjZGVmaW5lIFJFR19XUl9BRERSX2dpb19yd19wYV9kb3V0IDQKKworLyogUmVnaXN0ZXIgcndfcGFfb2UsIHNjb3BlIGdpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgb2UgOiAzMjsKK30gcmVnX2dpb19yd19wYV9vZTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZ2lvX3J3X3BhX29lIDgKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X3BhX29lIDgKKworLyogUmVnaXN0ZXIgcndfcGFfYnl0ZTBfZG91dCwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkYXRhIDogODsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI0OworfSByZWdfZ2lvX3J3X3BhX2J5dGUwX2RvdXQ7CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yd19wYV9ieXRlMF9kb3V0IDEyCisjZGVmaW5lIFJFR19XUl9BRERSX2dpb19yd19wYV9ieXRlMF9kb3V0IDEyCisKKy8qIFJlZ2lzdGVyIHJ3X3BhX2J5dGUwX29lLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IG9lIDogODsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI0OworfSByZWdfZ2lvX3J3X3BhX2J5dGUwX29lOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfcGFfYnl0ZTBfb2UgMTYKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X3BhX2J5dGUwX29lIDE2CisKKy8qIFJlZ2lzdGVyIHJ3X3BhX2J5dGUxX2RvdXQsIHNjb3BlIGdpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZGF0YSA6IDg7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyNDsKK30gcmVnX2dpb19yd19wYV9ieXRlMV9kb3V0OworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfcGFfYnl0ZTFfZG91dCAyMAorI2RlZmluZSBSRUdfV1JfQUREUl9naW9fcndfcGFfYnl0ZTFfZG91dCAyMAorCisvKiBSZWdpc3RlciByd19wYV9ieXRlMV9vZSwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBvZSA6IDg7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyNDsKK30gcmVnX2dpb19yd19wYV9ieXRlMV9vZTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZ2lvX3J3X3BhX2J5dGUxX29lIDI0CisjZGVmaW5lIFJFR19XUl9BRERSX2dpb19yd19wYV9ieXRlMV9vZSAyNAorCisvKiBSZWdpc3RlciByd19wYV9ieXRlMl9kb3V0LCBzY29wZSBnaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRhdGEgOiA4OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjQ7Cit9IHJlZ19naW9fcndfcGFfYnl0ZTJfZG91dDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZ2lvX3J3X3BhX2J5dGUyX2RvdXQgMjgKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X3BhX2J5dGUyX2RvdXQgMjgKKworLyogUmVnaXN0ZXIgcndfcGFfYnl0ZTJfb2UsIHNjb3BlIGdpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgb2UgOiA4OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjQ7Cit9IHJlZ19naW9fcndfcGFfYnl0ZTJfb2U7CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yd19wYV9ieXRlMl9vZSAzMgorI2RlZmluZSBSRUdfV1JfQUREUl9naW9fcndfcGFfYnl0ZTJfb2UgMzIKKworLyogUmVnaXN0ZXIgcndfcGFfYnl0ZTNfZG91dCwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkYXRhIDogODsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI0OworfSByZWdfZ2lvX3J3X3BhX2J5dGUzX2RvdXQ7CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yd19wYV9ieXRlM19kb3V0IDM2CisjZGVmaW5lIFJFR19XUl9BRERSX2dpb19yd19wYV9ieXRlM19kb3V0IDM2CisKKy8qIFJlZ2lzdGVyIHJ3X3BhX2J5dGUzX29lLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IG9lIDogODsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI0OworfSByZWdfZ2lvX3J3X3BhX2J5dGUzX29lOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfcGFfYnl0ZTNfb2UgNDAKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X3BhX2J5dGUzX29lIDQwCisKKy8qIFJlZ2lzdGVyIHJfcGJfZGluLCBzY29wZSBnaW8sIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZGF0YSA6IDMyOworfSByZWdfZ2lvX3JfcGJfZGluOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcl9wYl9kaW4gNDQKKworLyogUmVnaXN0ZXIgcndfcGJfZG91dCwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkYXRhIDogMzI7Cit9IHJlZ19naW9fcndfcGJfZG91dDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZ2lvX3J3X3BiX2RvdXQgNDgKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X3BiX2RvdXQgNDgKKworLyogUmVnaXN0ZXIgcndfcGJfb2UsIHNjb3BlIGdpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgb2UgOiAzMjsKK30gcmVnX2dpb19yd19wYl9vZTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZ2lvX3J3X3BiX29lIDUyCisjZGVmaW5lIFJFR19XUl9BRERSX2dpb19yd19wYl9vZSA1MgorCisvKiBSZWdpc3RlciByd19wYl9ieXRlMF9kb3V0LCBzY29wZSBnaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRhdGEgOiA4OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjQ7Cit9IHJlZ19naW9fcndfcGJfYnl0ZTBfZG91dDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZ2lvX3J3X3BiX2J5dGUwX2RvdXQgNTYKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X3BiX2J5dGUwX2RvdXQgNTYKKworLyogUmVnaXN0ZXIgcndfcGJfYnl0ZTBfb2UsIHNjb3BlIGdpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgb2UgOiA4OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjQ7Cit9IHJlZ19naW9fcndfcGJfYnl0ZTBfb2U7CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yd19wYl9ieXRlMF9vZSA2MAorI2RlZmluZSBSRUdfV1JfQUREUl9naW9fcndfcGJfYnl0ZTBfb2UgNjAKKworLyogUmVnaXN0ZXIgcndfcGJfYnl0ZTFfZG91dCwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkYXRhIDogODsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI0OworfSByZWdfZ2lvX3J3X3BiX2J5dGUxX2RvdXQ7CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yd19wYl9ieXRlMV9kb3V0IDY0CisjZGVmaW5lIFJFR19XUl9BRERSX2dpb19yd19wYl9ieXRlMV9kb3V0IDY0CisKKy8qIFJlZ2lzdGVyIHJ3X3BiX2J5dGUxX29lLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IG9lIDogODsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI0OworfSByZWdfZ2lvX3J3X3BiX2J5dGUxX29lOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfcGJfYnl0ZTFfb2UgNjgKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X3BiX2J5dGUxX29lIDY4CisKKy8qIFJlZ2lzdGVyIHJ3X3BiX2J5dGUyX2RvdXQsIHNjb3BlIGdpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZGF0YSA6IDg7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyNDsKK30gcmVnX2dpb19yd19wYl9ieXRlMl9kb3V0OworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfcGJfYnl0ZTJfZG91dCA3MgorI2RlZmluZSBSRUdfV1JfQUREUl9naW9fcndfcGJfYnl0ZTJfZG91dCA3MgorCisvKiBSZWdpc3RlciByd19wYl9ieXRlMl9vZSwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBvZSA6IDg7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyNDsKK30gcmVnX2dpb19yd19wYl9ieXRlMl9vZTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZ2lvX3J3X3BiX2J5dGUyX29lIDc2CisjZGVmaW5lIFJFR19XUl9BRERSX2dpb19yd19wYl9ieXRlMl9vZSA3NgorCisvKiBSZWdpc3RlciByd19wYl9ieXRlM19kb3V0LCBzY29wZSBnaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRhdGEgOiA4OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjQ7Cit9IHJlZ19naW9fcndfcGJfYnl0ZTNfZG91dDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZ2lvX3J3X3BiX2J5dGUzX2RvdXQgODAKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X3BiX2J5dGUzX2RvdXQgODAKKworLyogUmVnaXN0ZXIgcndfcGJfYnl0ZTNfb2UsIHNjb3BlIGdpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgb2UgOiA4OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjQ7Cit9IHJlZ19naW9fcndfcGJfYnl0ZTNfb2U7CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yd19wYl9ieXRlM19vZSA4NAorI2RlZmluZSBSRUdfV1JfQUREUl9naW9fcndfcGJfYnl0ZTNfb2UgODQKKworLyogUmVnaXN0ZXIgcl9wY19kaW4sIHNjb3BlIGdpbywgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkYXRhIDogMTY7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxNjsKK30gcmVnX2dpb19yX3BjX2RpbjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZ2lvX3JfcGNfZGluIDg4CisKKy8qIFJlZ2lzdGVyIHJ3X3BjX2RvdXQsIHNjb3BlIGdpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZGF0YSA6IDE2OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTY7Cit9IHJlZ19naW9fcndfcGNfZG91dDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZ2lvX3J3X3BjX2RvdXQgOTIKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X3BjX2RvdXQgOTIKKworLyogUmVnaXN0ZXIgcndfcGNfb2UsIHNjb3BlIGdpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgb2UgOiAxNjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDE2OworfSByZWdfZ2lvX3J3X3BjX29lOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfcGNfb2UgOTYKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X3BjX29lIDk2CisKKy8qIFJlZ2lzdGVyIHJ3X3BjX2J5dGUwX2RvdXQsIHNjb3BlIGdpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZGF0YSA6IDg7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyNDsKK30gcmVnX2dpb19yd19wY19ieXRlMF9kb3V0OworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfcGNfYnl0ZTBfZG91dCAxMDAKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X3BjX2J5dGUwX2RvdXQgMTAwCisKKy8qIFJlZ2lzdGVyIHJ3X3BjX2J5dGUwX29lLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IG9lIDogODsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI0OworfSByZWdfZ2lvX3J3X3BjX2J5dGUwX29lOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfcGNfYnl0ZTBfb2UgMTA0CisjZGVmaW5lIFJFR19XUl9BRERSX2dpb19yd19wY19ieXRlMF9vZSAxMDQKKworLyogUmVnaXN0ZXIgcndfcGNfYnl0ZTFfZG91dCwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkYXRhIDogODsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI0OworfSByZWdfZ2lvX3J3X3BjX2J5dGUxX2RvdXQ7CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yd19wY19ieXRlMV9kb3V0IDEwOAorI2RlZmluZSBSRUdfV1JfQUREUl9naW9fcndfcGNfYnl0ZTFfZG91dCAxMDgKKworLyogUmVnaXN0ZXIgcndfcGNfYnl0ZTFfb2UsIHNjb3BlIGdpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgb2UgOiA4OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjQ7Cit9IHJlZ19naW9fcndfcGNfYnl0ZTFfb2U7CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yd19wY19ieXRlMV9vZSAxMTIKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X3BjX2J5dGUxX29lIDExMgorCisvKiBSZWdpc3RlciByX3BkX2Rpbiwgc2NvcGUgZ2lvLCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRhdGEgOiAzMjsKK30gcmVnX2dpb19yX3BkX2RpbjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZ2lvX3JfcGRfZGluIDExNgorCisvKiBSZWdpc3RlciByd19pbnRyX2NmZywgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBpbnRyMCA6IDM7CisgIHVuc2lnbmVkIGludCBpbnRyMSA6IDM7CisgIHVuc2lnbmVkIGludCBpbnRyMiA6IDM7CisgIHVuc2lnbmVkIGludCBpbnRyMyA6IDM7CisgIHVuc2lnbmVkIGludCBpbnRyNCA6IDM7CisgIHVuc2lnbmVkIGludCBpbnRyNSA6IDM7CisgIHVuc2lnbmVkIGludCBpbnRyNiA6IDM7CisgIHVuc2lnbmVkIGludCBpbnRyNyA6IDM7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiA4OworfSByZWdfZ2lvX3J3X2ludHJfY2ZnOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfaW50cl9jZmcgMTIwCisjZGVmaW5lIFJFR19XUl9BRERSX2dpb19yd19pbnRyX2NmZyAxMjAKKworLyogUmVnaXN0ZXIgcndfaW50cl9waW5zLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGludHIwIDogNDsKKyAgdW5zaWduZWQgaW50IGludHIxIDogNDsKKyAgdW5zaWduZWQgaW50IGludHIyIDogNDsKKyAgdW5zaWduZWQgaW50IGludHIzIDogNDsKKyAgdW5zaWduZWQgaW50IGludHI0IDogNDsKKyAgdW5zaWduZWQgaW50IGludHI1IDogNDsKKyAgdW5zaWduZWQgaW50IGludHI2IDogNDsKKyAgdW5zaWduZWQgaW50IGludHI3IDogNDsKK30gcmVnX2dpb19yd19pbnRyX3BpbnM7CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yd19pbnRyX3BpbnMgMTI0CisjZGVmaW5lIFJFR19XUl9BRERSX2dpb19yd19pbnRyX3BpbnMgMTI0CisKKy8qIFJlZ2lzdGVyIHJ3X2ludHJfbWFzaywgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBpbnRyMCAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjEgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHIyICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMyAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjQgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHI1ICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyNiAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjcgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGkyYzBfZG9uZSA6IDE7CisgIHVuc2lnbmVkIGludCBpMmMxX2RvbmUgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgIDogMjI7Cit9IHJlZ19naW9fcndfaW50cl9tYXNrOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfaW50cl9tYXNrIDEyOAorI2RlZmluZSBSRUdfV1JfQUREUl9naW9fcndfaW50cl9tYXNrIDEyOAorCisvKiBSZWdpc3RlciByd19hY2tfaW50ciwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBpbnRyMCAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjEgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHIyICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMyAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjQgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHI1ICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyNiAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjcgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGkyYzBfZG9uZSA6IDE7CisgIHVuc2lnbmVkIGludCBpMmMxX2RvbmUgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgIDogMjI7Cit9IHJlZ19naW9fcndfYWNrX2ludHI7CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yd19hY2tfaW50ciAxMzIKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X2Fja19pbnRyIDEzMgorCisvKiBSZWdpc3RlciByX2ludHIsIHNjb3BlIGdpbywgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBpbnRyMCAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjEgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHIyICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMyAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjQgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHI1ICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyNiAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjcgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGkyYzBfZG9uZSA6IDE7CisgIHVuc2lnbmVkIGludCBpMmMxX2RvbmUgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgIDogMjI7Cit9IHJlZ19naW9fcl9pbnRyOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcl9pbnRyIDEzNgorCisvKiBSZWdpc3RlciByX21hc2tlZF9pbnRyLCBzY29wZSBnaW8sIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgaW50cjAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHIxICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMiAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjMgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHI0ICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyNSAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjYgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHI3ICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBpMmMwX2RvbmUgOiAxOworICB1bnNpZ25lZCBpbnQgaTJjMV9kb25lIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICA6IDIyOworfSByZWdfZ2lvX3JfbWFza2VkX2ludHI7CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yX21hc2tlZF9pbnRyIDE0MAorCisvKiBSZWdpc3RlciByd19pMmMwX3N0YXJ0LCBzY29wZSBnaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHJ1biA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAzMTsKK30gcmVnX2dpb19yd19pMmMwX3N0YXJ0OworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfaTJjMF9zdGFydCAxNDQKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X2kyYzBfc3RhcnQgMTQ0CisKKy8qIFJlZ2lzdGVyIHJ3X2kyYzBfY2ZnLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGVuICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBiaXRfb3JkZXIgOiAxOworICB1bnNpZ25lZCBpbnQgc2NsX2lvICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNjbF9pbnYgICA6IDE7CisgIHVuc2lnbmVkIGludCBzZGFfaW8gICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2RhX2lkbGUgIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICA6IDI2OworfSByZWdfZ2lvX3J3X2kyYzBfY2ZnOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfaTJjMF9jZmcgMTQ4CisjZGVmaW5lIFJFR19XUl9BRERSX2dpb19yd19pMmMwX2NmZyAxNDgKKworLyogUmVnaXN0ZXIgcndfaTJjMF9jdHJsLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHRyZl9iaXRzICAgIDogNjsKKyAgdW5zaWduZWQgaW50IHN3aXRjaF9kaXIgIDogNjsKKyAgdW5zaWduZWQgaW50IGV4dHJhX3N0YXJ0IDogMzsKKyAgdW5zaWduZWQgaW50IGVhcmx5X2VuZCAgIDogMTsKKyAgdW5zaWduZWQgaW50IHN0YXJ0X3N0b3AgIDogMTsKKyAgdW5zaWduZWQgaW50IGFja19kaXIwICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGFja19kaXIxICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGFja19kaXIyICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGFja19kaXIzICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGFja19kaXI0ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGFja19kaXI1ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGFja19iaXQgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHN0YXJ0X2JpdCAgIDogMTsKKyAgdW5zaWduZWQgaW50IGZyZXEgICAgICAgIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgIDogNTsKK30gcmVnX2dpb19yd19pMmMwX2N0cmw7CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yd19pMmMwX2N0cmwgMTUyCisjZGVmaW5lIFJFR19XUl9BRERSX2dpb19yd19pMmMwX2N0cmwgMTUyCisKKy8qIFJlZ2lzdGVyIHJ3X2kyYzBfZGF0YSwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkYXRhMCA6IDg7CisgIHVuc2lnbmVkIGludCBkYXRhMSA6IDg7CisgIHVuc2lnbmVkIGludCBkYXRhMiA6IDg7CisgIHVuc2lnbmVkIGludCBkYXRhMyA6IDg7Cit9IHJlZ19naW9fcndfaTJjMF9kYXRhOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfaTJjMF9kYXRhIDE1NgorI2RlZmluZSBSRUdfV1JfQUREUl9naW9fcndfaTJjMF9kYXRhIDE1NgorCisvKiBSZWdpc3RlciByd19pMmMwX2RhdGEyLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRhdGE0ICAgICA6IDg7CisgIHVuc2lnbmVkIGludCBkYXRhNSAgICAgOiA4OworICB1bnNpZ25lZCBpbnQgc3RhcnRfdmFsIDogNjsKKyAgdW5zaWduZWQgaW50IGFja192YWwgICA6IDY7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgOiA0OworfSByZWdfZ2lvX3J3X2kyYzBfZGF0YTI7CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yd19pMmMwX2RhdGEyIDE2MAorI2RlZmluZSBSRUdfV1JfQUREUl9naW9fcndfaTJjMF9kYXRhMiAxNjAKKworLyogUmVnaXN0ZXIgcndfaTJjMV9zdGFydCwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBydW4gOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMzE7Cit9IHJlZ19naW9fcndfaTJjMV9zdGFydDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZ2lvX3J3X2kyYzFfc3RhcnQgMTY0CisjZGVmaW5lIFJFR19XUl9BRERSX2dpb19yd19pMmMxX3N0YXJ0IDE2NAorCisvKiBSZWdpc3RlciByd19pMmMxX2NmZywgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBlbiAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgYml0X29yZGVyIDogMTsKKyAgdW5zaWduZWQgaW50IHNjbF9pbyAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzY2xfaW52ICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2RhMF9pbyAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNkYTBfaWRsZSA6IDE7CisgIHVuc2lnbmVkIGludCBzZGExX2lvICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2RhMV9pZGxlIDogMTsKKyAgdW5zaWduZWQgaW50IHNkYTJfaW8gICA6IDE7CisgIHVuc2lnbmVkIGludCBzZGEyX2lkbGUgOiAxOworICB1bnNpZ25lZCBpbnQgc2RhM19pbyAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNkYTNfaWRsZSA6IDE7CisgIHVuc2lnbmVkIGludCBzZGFfc2VsICAgOiAyOworICB1bnNpZ25lZCBpbnQgc2VuX2lkbGUgIDogMTsKKyAgdW5zaWduZWQgaW50IHNlbl9pbnYgICA6IDE7CisgIHVuc2lnbmVkIGludCBzZW5fc2VsICAgOiAyOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgIDogMTQ7Cit9IHJlZ19naW9fcndfaTJjMV9jZmc7CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yd19pMmMxX2NmZyAxNjgKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X2kyYzFfY2ZnIDE2OAorCisvKiBSZWdpc3RlciByd19pMmMxX2N0cmwsIHNjb3BlIGdpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgdHJmX2JpdHMgICAgOiA2OworICB1bnNpZ25lZCBpbnQgc3dpdGNoX2RpciAgOiA2OworICB1bnNpZ25lZCBpbnQgZXh0cmFfc3RhcnQgOiAzOworICB1bnNpZ25lZCBpbnQgZWFybHlfZW5kICAgOiAxOworICB1bnNpZ25lZCBpbnQgc3RhcnRfc3RvcCAgOiAxOworICB1bnNpZ25lZCBpbnQgYWNrX2RpcjAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgYWNrX2RpcjEgICAgOiAxOworICB1bnNpZ25lZCBpbnQgYWNrX2RpcjIgICAgOiAxOworICB1bnNpZ25lZCBpbnQgYWNrX2RpcjMgICAgOiAxOworICB1bnNpZ25lZCBpbnQgYWNrX2RpcjQgICAgOiAxOworICB1bnNpZ25lZCBpbnQgYWNrX2RpcjUgICAgOiAxOworICB1bnNpZ25lZCBpbnQgYWNrX2JpdCAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc3RhcnRfYml0ICAgOiAxOworICB1bnNpZ25lZCBpbnQgZnJlcSAgICAgICAgOiAyOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICAgOiA1OworfSByZWdfZ2lvX3J3X2kyYzFfY3RybDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZ2lvX3J3X2kyYzFfY3RybCAxNzIKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X2kyYzFfY3RybCAxNzIKKworLyogUmVnaXN0ZXIgcndfaTJjMV9kYXRhLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRhdGEwIDogODsKKyAgdW5zaWduZWQgaW50IGRhdGExIDogODsKKyAgdW5zaWduZWQgaW50IGRhdGEyIDogODsKKyAgdW5zaWduZWQgaW50IGRhdGEzIDogODsKK30gcmVnX2dpb19yd19pMmMxX2RhdGE7CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yd19pMmMxX2RhdGEgMTc2CisjZGVmaW5lIFJFR19XUl9BRERSX2dpb19yd19pMmMxX2RhdGEgMTc2CisKKy8qIFJlZ2lzdGVyIHJ3X2kyYzFfZGF0YTIsIHNjb3BlIGdpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZGF0YTQgICAgIDogODsKKyAgdW5zaWduZWQgaW50IGRhdGE1ICAgICA6IDg7CisgIHVuc2lnbmVkIGludCBzdGFydF92YWwgOiA2OworICB1bnNpZ25lZCBpbnQgYWNrX3ZhbCAgIDogNjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICA6IDQ7Cit9IHJlZ19naW9fcndfaTJjMV9kYXRhMjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZ2lvX3J3X2kyYzFfZGF0YTIgMTgwCisjZGVmaW5lIFJFR19XUl9BRERSX2dpb19yd19pMmMxX2RhdGEyIDE4MAorCisvKiBSZWdpc3RlciByX3Bwd21fc3RhdCwgc2NvcGUgZ2lvLCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGZyZXEgOiAyOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMzA7Cit9IHJlZ19naW9fcl9wcHdtX3N0YXQ7CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yX3Bwd21fc3RhdCAxODQKKworLyogUmVnaXN0ZXIgcndfcHB3bV9kYXRhLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRhdGEgOiA4OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjQ7Cit9IHJlZ19naW9fcndfcHB3bV9kYXRhOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfcHB3bV9kYXRhIDE4OAorI2RlZmluZSBSRUdfV1JfQUREUl9naW9fcndfcHB3bV9kYXRhIDE4OAorCisvKiBSZWdpc3RlciByd19wd20wX2N0cmwsIHNjb3BlIGdpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgbW9kZSAgICAgICAgIDogMjsKKyAgdW5zaWduZWQgaW50IGNjZF9vdmVycmlkZSA6IDE7CisgIHVuc2lnbmVkIGludCBjY2RfdmFsICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICAgIDogMjg7Cit9IHJlZ19naW9fcndfcHdtMF9jdHJsOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfcHdtMF9jdHJsIDE5MgorI2RlZmluZSBSRUdfV1JfQUREUl9naW9fcndfcHdtMF9jdHJsIDE5MgorCisvKiBSZWdpc3RlciByd19wd20wX3Zhciwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBsbyA6IDEzOworICB1bnNpZ25lZCBpbnQgaGkgOiAxMzsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDY7Cit9IHJlZ19naW9fcndfcHdtMF92YXI7CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yd19wd20wX3ZhciAxOTYKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X3B3bTBfdmFyIDE5NgorCisvKiBSZWdpc3RlciByd19wd20wX2RhdGEsIHNjb3BlIGdpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZGF0YSA6IDg7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyNDsKK30gcmVnX2dpb19yd19wd20wX2RhdGE7CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yd19wd20wX2RhdGEgMjAwCisjZGVmaW5lIFJFR19XUl9BRERSX2dpb19yd19wd20wX2RhdGEgMjAwCisKKy8qIFJlZ2lzdGVyIHJ3X3B3bTFfY3RybCwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBtb2RlICAgICAgICAgOiAyOworICB1bnNpZ25lZCBpbnQgY2NkX292ZXJyaWRlIDogMTsKKyAgdW5zaWduZWQgaW50IGNjZF92YWwgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICAgOiAyODsKK30gcmVnX2dpb19yd19wd20xX2N0cmw7CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yd19wd20xX2N0cmwgMjA0CisjZGVmaW5lIFJFR19XUl9BRERSX2dpb19yd19wd20xX2N0cmwgMjA0CisKKy8qIFJlZ2lzdGVyIHJ3X3B3bTFfdmFyLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGxvIDogMTM7CisgIHVuc2lnbmVkIGludCBoaSA6IDEzOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogNjsKK30gcmVnX2dpb19yd19wd20xX3ZhcjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZ2lvX3J3X3B3bTFfdmFyIDIwOAorI2RlZmluZSBSRUdfV1JfQUREUl9naW9fcndfcHdtMV92YXIgMjA4CisKKy8qIFJlZ2lzdGVyIHJ3X3B3bTFfZGF0YSwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkYXRhIDogODsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI0OworfSByZWdfZ2lvX3J3X3B3bTFfZGF0YTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZ2lvX3J3X3B3bTFfZGF0YSAyMTIKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X3B3bTFfZGF0YSAyMTIKKworLyogUmVnaXN0ZXIgcndfcHdtMl9jdHJsLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IG1vZGUgICAgICAgICA6IDI7CisgIHVuc2lnbmVkIGludCBjY2Rfb3ZlcnJpZGUgOiAxOworICB1bnNpZ25lZCBpbnQgY2NkX3ZhbCAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgICA6IDI4OworfSByZWdfZ2lvX3J3X3B3bTJfY3RybDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZ2lvX3J3X3B3bTJfY3RybCAyMTYKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X3B3bTJfY3RybCAyMTYKKworLyogUmVnaXN0ZXIgcndfcHdtMl92YXIsIHNjb3BlIGdpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgbG8gOiAxMzsKKyAgdW5zaWduZWQgaW50IGhpIDogMTM7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiA2OworfSByZWdfZ2lvX3J3X3B3bTJfdmFyOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfcHdtMl92YXIgMjIwCisjZGVmaW5lIFJFR19XUl9BRERSX2dpb19yd19wd20yX3ZhciAyMjAKKworLyogUmVnaXN0ZXIgcndfcHdtMl9kYXRhLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRhdGEgOiA4OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjQ7Cit9IHJlZ19naW9fcndfcHdtMl9kYXRhOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfcHdtMl9kYXRhIDIyNAorI2RlZmluZSBSRUdfV1JfQUREUl9naW9fcndfcHdtMl9kYXRhIDIyNAorCisvKiBSZWdpc3RlciByd19wd21faW5fY2ZnLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHBpbiA6IDM7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyOTsKK30gcmVnX2dpb19yd19wd21faW5fY2ZnOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfcHdtX2luX2NmZyAyMjgKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X3B3bV9pbl9jZmcgMjI4CisKKy8qIFJlZ2lzdGVyIHJfcHdtX2luX2xvLCBzY29wZSBnaW8sIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZGF0YSA6IDMyOworfSByZWdfZ2lvX3JfcHdtX2luX2xvOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcl9wd21faW5fbG8gMjMyCisKKy8qIFJlZ2lzdGVyIHJfcHdtX2luX2hpLCBzY29wZSBnaW8sIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZGF0YSA6IDMyOworfSByZWdfZ2lvX3JfcHdtX2luX2hpOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcl9wd21faW5faGkgMjM2CisKKy8qIFJlZ2lzdGVyIHJfcHdtX2luX2NudCwgc2NvcGUgZ2lvLCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRhdGEgOiAzMjsKK30gcmVnX2dpb19yX3B3bV9pbl9jbnQ7CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yX3B3bV9pbl9jbnQgMjQwCisKKworLyogQ29uc3RhbnRzICovCitlbnVtIHsKKyAgcmVna19naW9fYW55ZWRnZSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDcsCisgIHJlZ2tfZ2lvX2YxMDBrICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2dpb19mMTU2MiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19naW9fZjE5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfZ2lvX2YxbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX2dpb19mMzkwICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19naW9fZjQwMGsgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfZ2lvX2Y1bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAzLAorICByZWdrX2dpb19mNzgxICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19naW9faGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfZ2lvX2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2dpb19pbnRyX3BhMCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19naW9faW50cl9wYTEgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfZ2lvX2ludHJfcGExMCAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2dpb19pbnRyX3BhMTEgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19naW9faW50cl9wYTEyICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfZ2lvX2ludHJfcGExMyAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2dpb19pbnRyX3BhMTQgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19naW9faW50cl9wYTE1ICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfZ2lvX2ludHJfcGExNiAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX2dpb19pbnRyX3BhMTcgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19naW9faW50cl9wYTE4ICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIsCisgIHJlZ2tfZ2lvX2ludHJfcGExOSAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX2dpb19pbnRyX3BhMiAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19naW9faW50cl9wYTIwICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIsCisgIHJlZ2tfZ2lvX2ludHJfcGEyMSAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX2dpb19pbnRyX3BhMjIgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19naW9faW50cl9wYTIzICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIsCisgIHJlZ2tfZ2lvX2ludHJfcGEyNCAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAzLAorICByZWdrX2dpb19pbnRyX3BhMjUgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMywKKyAgcmVna19naW9faW50cl9wYTI2ICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfZ2lvX2ludHJfcGEyNyAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAzLAorICByZWdrX2dpb19pbnRyX3BhMjggICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMywKKyAgcmVna19naW9faW50cl9wYTI5ICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfZ2lvX2ludHJfcGEzICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2dpb19pbnRyX3BhMzAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMywKKyAgcmVna19naW9faW50cl9wYTMxICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfZ2lvX2ludHJfcGE0ICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2dpb19pbnRyX3BhNSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19naW9faW50cl9wYTYgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfZ2lvX2ludHJfcGE3ICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2dpb19pbnRyX3BhOCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19naW9faW50cl9wYTkgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfZ2lvX2ludHJfcGIwICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA0LAorICByZWdrX2dpb19pbnRyX3BiMSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNCwKKyAgcmVna19naW9faW50cl9wYjEwICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDUsCisgIHJlZ2tfZ2lvX2ludHJfcGIxMSAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA1LAorICByZWdrX2dpb19pbnRyX3BiMTIgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNSwKKyAgcmVna19naW9faW50cl9wYjEzICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDUsCisgIHJlZ2tfZ2lvX2ludHJfcGIxNCAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA1LAorICByZWdrX2dpb19pbnRyX3BiMTUgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNSwKKyAgcmVna19naW9faW50cl9wYjE2ICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDYsCisgIHJlZ2tfZ2lvX2ludHJfcGIxNyAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA2LAorICByZWdrX2dpb19pbnRyX3BiMTggICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNiwKKyAgcmVna19naW9faW50cl9wYjE5ICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDYsCisgIHJlZ2tfZ2lvX2ludHJfcGIyICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA0LAorICByZWdrX2dpb19pbnRyX3BiMjAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNiwKKyAgcmVna19naW9faW50cl9wYjIxICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDYsCisgIHJlZ2tfZ2lvX2ludHJfcGIyMiAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA2LAorICByZWdrX2dpb19pbnRyX3BiMjMgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNiwKKyAgcmVna19naW9faW50cl9wYjI0ICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDcsCisgIHJlZ2tfZ2lvX2ludHJfcGIyNSAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA3LAorICByZWdrX2dpb19pbnRyX3BiMjYgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNywKKyAgcmVna19naW9faW50cl9wYjI3ICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDcsCisgIHJlZ2tfZ2lvX2ludHJfcGIyOCAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA3LAorICByZWdrX2dpb19pbnRyX3BiMjkgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNywKKyAgcmVna19naW9faW50cl9wYjMgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDQsCisgIHJlZ2tfZ2lvX2ludHJfcGIzMCAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA3LAorICByZWdrX2dpb19pbnRyX3BiMzEgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNywKKyAgcmVna19naW9faW50cl9wYjQgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDQsCisgIHJlZ2tfZ2lvX2ludHJfcGI1ICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA0LAorICByZWdrX2dpb19pbnRyX3BiNiAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNCwKKyAgcmVna19naW9faW50cl9wYjcgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDQsCisgIHJlZ2tfZ2lvX2ludHJfcGI4ICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA1LAorICByZWdrX2dpb19pbnRyX3BiOSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNSwKKyAgcmVna19naW9faW50cl9wYzAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDgsCisgIHJlZ2tfZ2lvX2ludHJfcGMxICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA4LAorICByZWdrX2dpb19pbnRyX3BjMTAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwOSwKKyAgcmVna19naW9faW50cl9wYzExICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDksCisgIHJlZ2tfZ2lvX2ludHJfcGMxMiAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA5LAorICByZWdrX2dpb19pbnRyX3BjMTMgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwOSwKKyAgcmVna19naW9faW50cl9wYzE0ICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDksCisgIHJlZ2tfZ2lvX2ludHJfcGMxNSAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA5LAorICByZWdrX2dpb19pbnRyX3BjMiAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwOCwKKyAgcmVna19naW9faW50cl9wYzMgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDgsCisgIHJlZ2tfZ2lvX2ludHJfcGM0ICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA4LAorICByZWdrX2dpb19pbnRyX3BjNSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwOCwKKyAgcmVna19naW9faW50cl9wYzYgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDgsCisgIHJlZ2tfZ2lvX2ludHJfcGM3ICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA4LAorICByZWdrX2dpb19pbnRyX3BjOCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwOSwKKyAgcmVna19naW9faW50cl9wYzkgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDksCisgIHJlZ2tfZ2lvX2ludHJfcGQwICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDBjLAorICByZWdrX2dpb19pbnRyX3BkMSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwYywKKyAgcmVna19naW9faW50cl9wZDEwICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMGQsCisgIHJlZ2tfZ2lvX2ludHJfcGQxMSAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDBkLAorICByZWdrX2dpb19pbnRyX3BkMTIgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwZCwKKyAgcmVna19naW9faW50cl9wZDEzICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMGQsCisgIHJlZ2tfZ2lvX2ludHJfcGQxNCAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDBkLAorICByZWdrX2dpb19pbnRyX3BkMTUgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwZCwKKyAgcmVna19naW9faW50cl9wZDE2ICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMGUsCisgIHJlZ2tfZ2lvX2ludHJfcGQxNyAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDBlLAorICByZWdrX2dpb19pbnRyX3BkMTggICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwZSwKKyAgcmVna19naW9faW50cl9wZDE5ICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMGUsCisgIHJlZ2tfZ2lvX2ludHJfcGQyICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDBjLAorICByZWdrX2dpb19pbnRyX3BkMjAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwZSwKKyAgcmVna19naW9faW50cl9wZDIxICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMGUsCisgIHJlZ2tfZ2lvX2ludHJfcGQyMiAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDBlLAorICByZWdrX2dpb19pbnRyX3BkMjMgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwZSwKKyAgcmVna19naW9faW50cl9wZDI0ICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMGYsCisgIHJlZ2tfZ2lvX2ludHJfcGQyNSAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDBmLAorICByZWdrX2dpb19pbnRyX3BkMjYgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwZiwKKyAgcmVna19naW9faW50cl9wZDI3ICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMGYsCisgIHJlZ2tfZ2lvX2ludHJfcGQyOCAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDBmLAorICByZWdrX2dpb19pbnRyX3BkMjkgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwZiwKKyAgcmVna19naW9faW50cl9wZDMgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMGMsCisgIHJlZ2tfZ2lvX2ludHJfcGQzMCAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDBmLAorICByZWdrX2dpb19pbnRyX3BkMzEgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwZiwKKyAgcmVna19naW9faW50cl9wZDQgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMGMsCisgIHJlZ2tfZ2lvX2ludHJfcGQ1ICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDBjLAorICByZWdrX2dpb19pbnRyX3BkNiAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwYywKKyAgcmVna19naW9faW50cl9wZDcgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMGMsCisgIHJlZ2tfZ2lvX2ludHJfcGQ4ICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDBkLAorICByZWdrX2dpb19pbnRyX3BkOSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwZCwKKyAgcmVna19naW9fbG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIsCisgIHJlZ2tfZ2lvX2xzYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2dpb19tc2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19naW9fbmVnZWRnZSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDYsCisgIHJlZ2tfZ2lvX25vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2dpb19ub19zd2l0Y2ggICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAzZiwKKyAgcmVna19naW9fbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDcsCisgIHJlZ2tfZ2lvX29mZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2dpb19vcGVuZHJhaW4gICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19naW9fb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfZ2lvX3Bvc2VkZ2UgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA1LAorICByZWdrX2dpb19wd21faGZwICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19naW9fcHdtX3BhMCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfZ2lvX3B3bV9wYTE5ICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA0LAorICByZWdrX2dpb19wd21fcGE2ICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19naW9fcHdtX3BhNyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfZ2lvX3B3bV9wYjI2ICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA1LAorICByZWdrX2dpb19wd21fcGQyMyAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNiwKKyAgcmVna19naW9fcHdtX3BkMzEgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDcsCisgIHJlZ2tfZ2lvX3B3bV9zdGQgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2dpb19wd21fdmFyICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMywKKyAgcmVna19naW9fcndfaTJjMF9jZmdfZGVmYXVsdCAgICAgICAgICAgICA9IDB4MDAwMDAwMjAsCisgIHJlZ2tfZ2lvX3J3X2kyYzBfY3RybF9kZWZhdWx0ICAgICAgICAgICAgPSAweDAwMDEwMDAwLAorICByZWdrX2dpb19yd19pMmMwX3N0YXJ0X2RlZmF1bHQgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19naW9fcndfaTJjMV9jZmdfZGVmYXVsdCAgICAgICAgICAgICA9IDB4MDAwMDBhYTAsCisgIHJlZ2tfZ2lvX3J3X2kyYzFfY3RybF9kZWZhdWx0ICAgICAgICAgICAgPSAweDAwMDEwMDAwLAorICByZWdrX2dpb19yd19pMmMxX3N0YXJ0X2RlZmF1bHQgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19naW9fcndfaW50cl9jZmdfZGVmYXVsdCAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfZ2lvX3J3X2ludHJfbWFza19kZWZhdWx0ICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2dpb19yd19wYV9vZV9kZWZhdWx0ICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19naW9fcndfcGJfb2VfZGVmYXVsdCAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfZ2lvX3J3X3BjX29lX2RlZmF1bHQgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2dpb19yd19wcHdtX2RhdGFfZGVmYXVsdCAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19naW9fcndfcHdtMF9jdHJsX2RlZmF1bHQgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfZ2lvX3J3X3B3bTFfY3RybF9kZWZhdWx0ICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2dpb19yd19wd20yX2N0cmxfZGVmYXVsdCAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19naW9fcndfcHdtX2luX2NmZ19kZWZhdWx0ICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfZ2lvX3NkYTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2dpb19zZGExICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19naW9fc2RhMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIsCisgIHJlZ2tfZ2lvX3NkYTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAzLAorICByZWdrX2dpb19zZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19naW9fc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfZ2lvX3llcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxCit9OworI2VuZGlmIC8qIF9fZ2lvX2RlZnNfaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9pbnRyX3ZlY3QuaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvaW50cl92ZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVhNjk5YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvaW50cl92ZWN0LmgKQEAgLTAsMCArMSw0NiBAQAorLyogSW50ZXJydXB0IHZlY3RvciBudW1iZXJzIGF1dG9nZW5lcmF0ZWQgYnkgLi4vLi4vLi4vdG9vbHMvcmRlc2MvYmluL3JkZXMyaW50ciAKKyAgIGZyb20gaW50cl92ZWN0LnIgKi8KKworI2lmbmRlZiBfSU5UUl9WRUNUX1IKKyNkZWZpbmUgX0lOVFJfVkVDVF9SIAorI2RlZmluZSBUSU1FUjBfSU5UUl9WRUNUCTB4MzEKKyNkZWZpbmUgVElNRVIxX0lOVFJfVkVDVAkweDMyCisjZGVmaW5lIERNQTBfSU5UUl9WRUNUCTB4MzMKKyNkZWZpbmUgRE1BMV9JTlRSX1ZFQ1QJMHgzNAorI2RlZmluZSBETUEyX0lOVFJfVkVDVAkweDM1CisjZGVmaW5lIERNQTNfSU5UUl9WRUNUCTB4MzYKKyNkZWZpbmUgRE1BNF9JTlRSX1ZFQ1QJMHgzNworI2RlZmluZSBETUE1X0lOVFJfVkVDVAkweDM4CisjZGVmaW5lIERNQTZfSU5UUl9WRUNUCTB4MzkKKyNkZWZpbmUgRE1BN19JTlRSX1ZFQ1QJMHgzYQorI2RlZmluZSBETUE5X0lOVFJfVkVDVAkweDNiCisjZGVmaW5lIERNQTExX0lOVFJfVkVDVAkweDNjCisjZGVmaW5lIEdJT19JTlRSX1ZFQ1QJMHgzZAorI2RlZmluZSBJT1AwX0lOVFJfVkVDVAkweDNlCisjZGVmaW5lIElPUDFfSU5UUl9WRUNUCTB4M2YKKyNkZWZpbmUgU0VSMF9JTlRSX1ZFQ1QJMHg0MAorI2RlZmluZSBTRVIxX0lOVFJfVkVDVAkweDQxCisjZGVmaW5lIFNFUjJfSU5UUl9WRUNUCTB4NDIKKyNkZWZpbmUgU0VSM19JTlRSX1ZFQ1QJMHg0MworI2RlZmluZSBTRVI0X0lOVFJfVkVDVAkweDQ0CisjZGVmaW5lIFNTRVJfSU5UUl9WRUNUCTB4NDUKKyNkZWZpbmUgU1RSRE1BMF9JTlRSX1ZFQ1QJMHg0NgorI2RlZmluZSBTVFJETUExX0lOVFJfVkVDVAkweDQ3CisjZGVmaW5lIFNUUkRNQTJfSU5UUl9WRUNUCTB4NDgKKyNkZWZpbmUgU1RSRE1BM19JTlRSX1ZFQ1QJMHg0OQorI2RlZmluZSBTVFJETUE1X0lOVFJfVkVDVAkweDRhCisjZGVmaW5lIFZJTl9JTlRSX1ZFQ1QJMHg0YgorI2RlZmluZSBWT1VUX0lOVFJfVkVDVAkweDRjCisjZGVmaW5lIEpQRUdfSU5UUl9WRUNUCTB4NGQKKyNkZWZpbmUgSDI2NF9JTlRSX1ZFQ1QJMHg0ZQorI2RlZmluZSBISVNUT19JTlRSX1ZFQ1QJMHg0ZgorI2RlZmluZSBDQ0RfSU5UUl9WRUNUCTB4NTAKKyNkZWZpbmUgRVRIX0lOVFJfVkVDVAkweDUxCisjZGVmaW5lIE1FTUFSQl9CQVJfSU5UUl9WRUNUCTB4NTIKKyNkZWZpbmUgTUVNQVJCX0ZPT19JTlRSX1ZFQ1QJMHg1MworI2RlZmluZSBQSU9fSU5UUl9WRUNUCTB4NTQKKyNkZWZpbmUgU0NMUl9JTlRSX1ZFQ1QJMHg1NQorI2RlZmluZSBTQ0xSX0ZJRk9fSU5UUl9WRUNUCTB4NTYKKyNkZWZpbmUgSVBJX0lOVFJfVkVDVCAgIDB4NTcKKyNkZWZpbmUgTkJSX0lOVFJfVkVDVCAgIDB4NTgKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9pbnRyX3ZlY3RfZGVmcy5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9pbnRyX3ZlY3RfZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MjBmNjMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2ludHJfdmVjdF9kZWZzLmgKQEAgLTAsMCArMSwzNDEgQEAKKyNpZm5kZWYgX19pbnRyX3ZlY3RfZGVmc19oCisjZGVmaW5lIF9faW50cl92ZWN0X2RlZnNfaAorCisvKgorICogVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQgZnJvbQorICogICBmaWxlOiAgICAgICAgICAgaW50cl92ZWN0LnIKKyAqIAorICogICBieSAuLi8uLi8uLi90b29scy9yZGVzYy9iaW4vcmRlczJjIC1vdXRmaWxlIGludHJfdmVjdF9kZWZzLmggaW50cl92ZWN0LnIKKyAqIEFueSBjaGFuZ2VzIGhlcmUgd2lsbCBiZSBsb3N0LgorICoKKyAqIC0qLSBidWZmZXItcmVhZC1vbmx5OiB0IC0qLQorICovCisvKiBNYWluIGFjY2VzcyBtYWNyb3MgKi8KKyNpZm5kZWYgUkVHX1JECisjZGVmaW5lIFJFR19SRCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1IKKyNkZWZpbmUgUkVHX1dSKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfVkVDVAorI2RlZmluZSBSRUdfV1JfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXgsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlQKKyNkZWZpbmUgUkVHX1JEX0lOVCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlQKKyNkZWZpbmUgUkVHX1dSX0lOVCggc2NvcGUsIGluc3QsIHJlZywgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1dSX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19UWVBFX0NPTlYKKyNkZWZpbmUgUkVHX1RZUEVfQ09OViggdHlwZSwgb3JndHlwZSwgdmFsICkgXAorICAoIHsgdW5pb24geyBvcmd0eXBlIG87IHR5cGUgbjsgfSByOyByLm8gPSB2YWw7IHIubjsgfSApCisjZW5kaWYKKworI2lmbmRlZiByZWdfcGFnZV9zaXplCisjZGVmaW5lIHJlZ19wYWdlX3NpemUgODE5MgorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFIKKyNkZWZpbmUgUkVHX0FERFIoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19BRERSX1ZFQ1QKKyNkZWZpbmUgUkVHX0FERFJfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisvKiBDLWNvZGUgZm9yIHJlZ2lzdGVyIHNjb3BlIGludHJfdmVjdCAqLworCisKKyNkZWZpbmUgU1RSSURFX2ludHJfdmVjdF9yd19tYXNrIDQKKy8qIFJlZ2lzdGVyIHJ3X21hc2swLCBzY29wZSBpbnRyX3ZlY3QsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHRpbWVyMCAgOiAxOworICB1bnNpZ25lZCBpbnQgdGltZXIxICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWEwICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTEgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMiAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWEzICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTQgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNSAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE2ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTcgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hOSAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWExMSAgIDogMTsKKyAgdW5zaWduZWQgaW50IGdpbyAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaW9wMCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBpb3AxICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNlcjAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2VyMSAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzZXIyICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNlcjMgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2VyNCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzc2VyICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHN0cmRtYTAgOiAxOworICB1bnNpZ25lZCBpbnQgc3RyZG1hMSA6IDE7CisgIHVuc2lnbmVkIGludCBzdHJkbWEyIDogMTsKKyAgdW5zaWduZWQgaW50IHN0cmRtYTMgOiAxOworICB1bnNpZ25lZCBpbnQgc3RyZG1hNSA6IDE7CisgIHVuc2lnbmVkIGludCB2aW4gICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHZvdXQgICAgOiAxOworICB1bnNpZ25lZCBpbnQganBlZyAgICA6IDE7CisgIHVuc2lnbmVkIGludCBoMjY0ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGhpc3RvICAgOiAxOworICB1bnNpZ25lZCBpbnQgY2NkICAgICA6IDE7Cit9IHJlZ19pbnRyX3ZlY3RfcndfbWFzazA7CisjZGVmaW5lIHJlZ19pbnRyX3ZlY3RfcndfbWFzayByZWdfaW50cl92ZWN0X3J3X21hc2swCisjZGVmaW5lIFJFR19SRF9BRERSX2ludHJfdmVjdF9yd19tYXNrIDAKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW50cl92ZWN0X3J3X21hc2sgMAorI2RlZmluZSBSRUdfUkRfQUREUl9pbnRyX3ZlY3RfcndfbWFzazAgMAorI2RlZmluZSBSRUdfV1JfQUREUl9pbnRyX3ZlY3RfcndfbWFzazAgMAorCisjZGVmaW5lIFNUUklERV9pbnRyX3ZlY3Rfcl92ZWN0IDQKKy8qIFJlZ2lzdGVyIHJfdmVjdDAsIHNjb3BlIGludHJfdmVjdCwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCB0aW1lcjAgIDogMTsKKyAgdW5zaWduZWQgaW50IHRpbWVyMSAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWExICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTIgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMyAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE0ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTUgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNiAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE3ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTkgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMTEgICA6IDE7CisgIHVuc2lnbmVkIGludCBnaW8gICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGlvcDAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaW9wMSAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzZXIwICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNlcjEgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2VyMiAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzZXIzICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNlcjQgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc3NlciAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzdHJkbWEwIDogMTsKKyAgdW5zaWduZWQgaW50IHN0cmRtYTEgOiAxOworICB1bnNpZ25lZCBpbnQgc3RyZG1hMiA6IDE7CisgIHVuc2lnbmVkIGludCBzdHJkbWEzIDogMTsKKyAgdW5zaWduZWQgaW50IHN0cmRtYTUgOiAxOworICB1bnNpZ25lZCBpbnQgdmluICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB2b3V0ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGpwZWcgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaDI2NCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBoaXN0byAgIDogMTsKKyAgdW5zaWduZWQgaW50IGNjZCAgICAgOiAxOworfSByZWdfaW50cl92ZWN0X3JfdmVjdDA7CisjZGVmaW5lIHJlZ19pbnRyX3ZlY3Rfcl92ZWN0IHJlZ19pbnRyX3ZlY3Rfcl92ZWN0MAorI2RlZmluZSBSRUdfUkRfQUREUl9pbnRyX3ZlY3Rfcl92ZWN0IDgKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW50cl92ZWN0X3JfdmVjdDAgOAorCisjZGVmaW5lIFNUUklERV9pbnRyX3ZlY3Rfcl9tYXNrZWRfdmVjdCA0CisvKiBSZWdpc3RlciByX21hc2tlZF92ZWN0MCwgc2NvcGUgaW50cl92ZWN0LCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHRpbWVyMCAgOiAxOworICB1bnNpZ25lZCBpbnQgdGltZXIxICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWEwICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTEgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMiAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWEzICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTQgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNSAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE2ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTcgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hOSAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWExMSAgIDogMTsKKyAgdW5zaWduZWQgaW50IGdpbyAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaW9wMCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBpb3AxICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNlcjAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2VyMSAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzZXIyICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNlcjMgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2VyNCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzc2VyICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHN0cmRtYTAgOiAxOworICB1bnNpZ25lZCBpbnQgc3RyZG1hMSA6IDE7CisgIHVuc2lnbmVkIGludCBzdHJkbWEyIDogMTsKKyAgdW5zaWduZWQgaW50IHN0cmRtYTMgOiAxOworICB1bnNpZ25lZCBpbnQgc3RyZG1hNSA6IDE7CisgIHVuc2lnbmVkIGludCB2aW4gICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHZvdXQgICAgOiAxOworICB1bnNpZ25lZCBpbnQganBlZyAgICA6IDE7CisgIHVuc2lnbmVkIGludCBoMjY0ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGhpc3RvICAgOiAxOworICB1bnNpZ25lZCBpbnQgY2NkICAgICA6IDE7Cit9IHJlZ19pbnRyX3ZlY3Rfcl9tYXNrZWRfdmVjdDA7CisjZGVmaW5lIHJlZ19pbnRyX3ZlY3Rfcl9tYXNrZWRfdmVjdCByZWdfaW50cl9tYXNrZWRfdmVjdF9yX3ZlY3QwCisjZGVmaW5lIFJFR19SRF9BRERSX2ludHJfdmVjdF9yX21hc2tlZF92ZWN0MCAxNgorI2RlZmluZSBSRUdfUkRfQUREUl9pbnRyX3ZlY3Rfcl9tYXNrZWRfdmVjdCAxNgorCisjZGVmaW5lIFNUUklERV9pbnRyX3ZlY3RfcndfeG1hc2sgNAorLyogUmVnaXN0ZXIgcndfeG1hc2swLCBzY29wZSBpbnRyX3ZlY3QsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHRpbWVyMCAgOiAxOworICB1bnNpZ25lZCBpbnQgdGltZXIxICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWEwICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTEgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMiAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWEzICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTQgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNSAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE2ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTcgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hOSAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWExMSAgIDogMTsKKyAgdW5zaWduZWQgaW50IGdpbyAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaW9wMCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBpb3AxICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNlcjAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2VyMSAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzZXIyICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNlcjMgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2VyNCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzc2VyICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHN0cmRtYTAgOiAxOworICB1bnNpZ25lZCBpbnQgc3RyZG1hMSA6IDE7CisgIHVuc2lnbmVkIGludCBzdHJkbWEyIDogMTsKKyAgdW5zaWduZWQgaW50IHN0cmRtYTMgOiAxOworICB1bnNpZ25lZCBpbnQgc3RyZG1hNSA6IDE7CisgIHVuc2lnbmVkIGludCB2aW4gICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHZvdXQgICAgOiAxOworICB1bnNpZ25lZCBpbnQganBlZyAgICA6IDE7CisgIHVuc2lnbmVkIGludCBoMjY0ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGhpc3RvICAgOiAxOworICB1bnNpZ25lZCBpbnQgY2NkICAgICA6IDE7Cit9IHJlZ19pbnRyX3ZlY3RfcndfeG1hc2swOworI2RlZmluZSByZWdfaW50cl92ZWN0X3J3X3htYXNrIHJlZ19pbnRyX3ZlY3RfcndfeG1hc2swCisjZGVmaW5lIFJFR19SRF9BRERSX2ludHJfdmVjdF9yd194bWFzazAgMjQKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW50cl92ZWN0X3J3X3htYXNrMCAyNAorI2RlZmluZSBSRUdfUkRfQUREUl9pbnRyX3ZlY3RfcndfeG1hc2sgMjQKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW50cl92ZWN0X3J3X3htYXNrIDI0CisKKy8qIFJlZ2lzdGVyIHJ3X21hc2sxLCBzY29wZSBpbnRyX3ZlY3QsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGV0aCAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbWVtYXJiX2JhciA6IDE7CisgIHVuc2lnbmVkIGludCBtZW1hcmJfZm9vIDogMTsKKyAgdW5zaWduZWQgaW50IHBpbyAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2NsciAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzY2xyX2ZpZm8gIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgOiAyNjsKK30gcmVnX2ludHJfdmVjdF9yd19tYXNrMTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW50cl92ZWN0X3J3X21hc2sxIDQKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW50cl92ZWN0X3J3X21hc2sxIDQKKworLyogUmVnaXN0ZXIgcl92ZWN0MSwgc2NvcGUgaW50cl92ZWN0LCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGV0aCAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbWVtYXJiX2JhciA6IDE7CisgIHVuc2lnbmVkIGludCBtZW1hcmJfZm9vIDogMTsKKyAgdW5zaWduZWQgaW50IHBpbyAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2NsciAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzY2xyX2ZpZm8gIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgOiAyNjsKK30gcmVnX2ludHJfdmVjdF9yX3ZlY3QxOworI2RlZmluZSBSRUdfUkRfQUREUl9pbnRyX3ZlY3Rfcl92ZWN0MSAxMgorCisvKiBSZWdpc3RlciByX21hc2tlZF92ZWN0MSwgc2NvcGUgaW50cl92ZWN0LCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGV0aCAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbWVtYXJiX2JhciA6IDE7CisgIHVuc2lnbmVkIGludCBtZW1hcmJfZm9vIDogMTsKKyAgdW5zaWduZWQgaW50IHBpbyAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2NsciAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzY2xyX2ZpZm8gIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgOiAyNjsKK30gcmVnX2ludHJfdmVjdF9yX21hc2tlZF92ZWN0MTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW50cl92ZWN0X3JfbWFza2VkX3ZlY3QxIDIwCisKKy8qIFJlZ2lzdGVyIHJ3X3htYXNrMSwgc2NvcGUgaW50cl92ZWN0LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBldGggICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG1lbWFyYl9iYXIgOiAxOworICB1bnNpZ25lZCBpbnQgbWVtYXJiX2ZvbyA6IDE7CisgIHVuc2lnbmVkIGludCBwaW8gICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNjbHIgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2Nscl9maWZvICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgIDogMjY7Cit9IHJlZ19pbnRyX3ZlY3RfcndfeG1hc2sxOworI2RlZmluZSBSRUdfUkRfQUREUl9pbnRyX3ZlY3RfcndfeG1hc2sxIDI4CisjZGVmaW5lIFJFR19XUl9BRERSX2ludHJfdmVjdF9yd194bWFzazEgMjgKKworLyogUmVnaXN0ZXIgcndfeG1hc2tfY3RybCwgc2NvcGUgaW50cl92ZWN0LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBlbiA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAzMTsKK30gcmVnX2ludHJfdmVjdF9yd194bWFza19jdHJsOworI2RlZmluZSBSRUdfUkRfQUREUl9pbnRyX3ZlY3RfcndfeG1hc2tfY3RybCAzMgorI2RlZmluZSBSRUdfV1JfQUREUl9pbnRyX3ZlY3RfcndfeG1hc2tfY3RybCAzMgorCisvKiBSZWdpc3RlciByX25taSwgc2NvcGUgaW50cl92ZWN0LCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHdhdGNoZG9nMCA6IDE7CisgIHVuc2lnbmVkIGludCB3YXRjaGRvZzEgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgIDogMzA7Cit9IHJlZ19pbnRyX3ZlY3Rfcl9ubWk7CisjZGVmaW5lIFJFR19SRF9BRERSX2ludHJfdmVjdF9yX25taSA2NAorCisvKiBSZWdpc3RlciByX2d1cnUsIHNjb3BlIGludHJfdmVjdCwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBqdGFnIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDMxOworfSByZWdfaW50cl92ZWN0X3JfZ3VydTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW50cl92ZWN0X3JfZ3VydSA2OAorCisKKy8qIFJlZ2lzdGVyIHJ3X2lwaSwgc2NvcGUgaW50cl92ZWN0LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgdW5zaWduZWQgaW50IHZlY3RvcjsKK30gcmVnX2ludHJfdmVjdF9yd19pcGk7CisjZGVmaW5lIFJFR19SRF9BRERSX2ludHJfdmVjdF9yd19pcGkgNzIKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW50cl92ZWN0X3J3X2lwaSA3MgorCisvKiBDb25zdGFudHMgKi8KK2VudW0geworICByZWdrX2ludHJfdmVjdF9ubyAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pbnRyX3ZlY3RfcndfbWFzazBfZGVmYXVsdCAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW50cl92ZWN0X3J3X21hc2sxX2RlZmF1bHQgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2ludHJfdmVjdF9yd194bWFzazBfZGVmYXVsdCAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pbnRyX3ZlY3RfcndfeG1hc2sxX2RlZmF1bHQgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW50cl92ZWN0X3J3X3htYXNrX2N0cmxfZGVmYXVsdCAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2ludHJfdmVjdF95ZXMgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMQorfTsKKyNlbmRpZiAvKiBfX2ludHJfdmVjdF9kZWZzX2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvaW9wL2FzbS9pb3BfcmVnX3NwYWNlX2FzbS5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9pb3AvYXNtL2lvcF9yZWdfc3BhY2VfYXNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1YTc0ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvaW9wL2FzbS9pb3BfcmVnX3NwYWNlX2FzbS5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qIEF1dG9nZW5lcmF0ZWQgQ2hhbmdlcyBoZXJlIHdpbGwgYmUgbG9zdCEKKyAqIGdlbmVyYXRlZCBieSAuL2dlbl9zdy5wbCBXZWQgRmViIDE0IDA5OjI3OjQ4IDIwMDcgaW9wX3N3LmNmZyAKKyAqLworI2RlZmluZSBpb3BfdmVyc2lvbiAwCisjZGVmaW5lIGlvcF9maWZvX2luX2V4dHJhIDY0CisjZGVmaW5lIGlvcF9maWZvX291dF9leHRyYSAxMjgKKyNkZWZpbmUgaW9wX3RyaWdnZXJfZ3JwMCAxOTIKKyNkZWZpbmUgaW9wX3RyaWdnZXJfZ3JwMSAyNTYKKyNkZWZpbmUgaW9wX3RyaWdnZXJfZ3JwMiAzMjAKKyNkZWZpbmUgaW9wX3RyaWdnZXJfZ3JwMyAzODQKKyNkZWZpbmUgaW9wX3RyaWdnZXJfZ3JwNCA0NDgKKyNkZWZpbmUgaW9wX3RyaWdnZXJfZ3JwNSA1MTIKKyNkZWZpbmUgaW9wX3RyaWdnZXJfZ3JwNiA1NzYKKyNkZWZpbmUgaW9wX3RyaWdnZXJfZ3JwNyA2NDAKKyNkZWZpbmUgaW9wX2NyY19wYXIgNzY4CisjZGVmaW5lIGlvcF9kbWNfaW4gODk2CisjZGVmaW5lIGlvcF9kbWNfb3V0IDEwMjQKKyNkZWZpbmUgaW9wX2ZpZm9faW4gMTE1MgorI2RlZmluZSBpb3BfZmlmb19vdXQgMTI4MAorI2RlZmluZSBpb3Bfc2NyY19pbiAxNDA4CisjZGVmaW5lIGlvcF9zY3JjX291dCAxNTM2CisjZGVmaW5lIGlvcF90aW1lcl9ncnAwIDE2NjQKKyNkZWZpbmUgaW9wX3RpbWVyX2dycDEgMTc5MgorI2RlZmluZSBpb3Bfc2FwX2luIDIwNDgKKyNkZWZpbmUgaW9wX3NhcF9vdXQgMjMwNAorI2RlZmluZSBpb3Bfc3B1IDI1NjAKKyNkZWZpbmUgaW9wX3N3X2NmZyAyODE2CisjZGVmaW5lIGlvcF9zd19jcHUgMzA3MgorI2RlZmluZSBpb3Bfc3dfbXB1IDMzMjgKKyNkZWZpbmUgaW9wX3N3X3NwdSAzNTg0CisjZGVmaW5lIGlvcF9tcHUgNDA5NgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9pb3AvYXNtL2lvcF9zYXBfaW5fZGVmc19hc20uaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvaW9wL2FzbS9pb3Bfc2FwX2luX2RlZnNfYXNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y5MGI1YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvaW9wL2FzbS9pb3Bfc2FwX2luX2RlZnNfYXNtLmgKQEAgLTAsMCArMSwxMDkgQEAKKyNpZm5kZWYgX19pb3Bfc2FwX2luX2RlZnNfYXNtX2gKKyNkZWZpbmUgX19pb3Bfc2FwX2luX2RlZnNfYXNtX2gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGZyb20KKyAqICAgZmlsZTogICAgICAgICAgIGlvcF9zYXBfaW4ucgorICogCisgKiAgIGJ5IC4uLy4uLy4uL3Rvb2xzL3JkZXNjL2Jpbi9yZGVzMmMgLWFzbSAtb3V0ZmlsZSBpb3Bfc2FwX2luX2RlZnNfYXNtLmggaW9wX3NhcF9pbi5yCisgKiBBbnkgY2hhbmdlcyBoZXJlIHdpbGwgYmUgbG9zdC4KKyAqCisgKiAtKi0gYnVmZmVyLXJlYWQtb25seTogdCAtKi0KKyAqLworCisjaWZuZGVmIFJFR19GSUVMRAorI2RlZmluZSBSRUdfRklFTEQoIHNjb3BlLCByZWcsIGZpZWxkLCB2YWx1ZSApIFwKKyAgUkVHX0ZJRUxEX1hfKCB2YWx1ZSwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX0ZJRUxEX1hfKCB2YWx1ZSwgc2hpZnQgKSAoKHZhbHVlKSA8PCBzaGlmdCkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19TVEFURQorI2RlZmluZSBSRUdfU1RBVEUoIHNjb3BlLCByZWcsIGZpZWxkLCBzeW1ib2xpY192YWx1ZSApIFwKKyAgUkVHX1NUQVRFX1hfKCByZWdrXyMjc2NvcGUjI18jI3N5bWJvbGljX3ZhbHVlLCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX19sc2IgKQorI2RlZmluZSBSRUdfU1RBVEVfWF8oIGssIHNoaWZ0ICkgKGsgPDwgc2hpZnQpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfTUFTSworI2RlZmluZSBSRUdfTUFTSyggc2NvcGUsIHJlZywgZmllbGQgKSBcCisgIFJFR19NQVNLX1hfKCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX193aWR0aCwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX01BU0tfWF8oIHdpZHRoLCBsc2IgKSAoKCgxIDw8IHdpZHRoKS0xKSA8PCBsc2IpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfTFNCCisjZGVmaW5lIFJFR19MU0IoIHNjb3BlLCByZWcsIGZpZWxkICkgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQklUCisjZGVmaW5lIFJFR19CSVQoIHNjb3BlLCByZWcsIGZpZWxkICkgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fYml0CisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUgorI2RlZmluZSBSRUdfQUREUiggc2NvcGUsIGluc3QsIHJlZyApIFJFR19BRERSX1hfKGluc3QsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19vZmZzZXQpCisjZGVmaW5lIFJFR19BRERSX1hfKCBpbnN0LCBvZmZzICkgKChpbnN0KSArIG9mZnMpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUl9WRUNUCisjZGVmaW5lIFJFR19BRERSX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICAgICAgICAgUkVHX0FERFJfVkVDVF9YXyhpbnN0LCByZWdfIyNzY29wZSMjXyMjcmVnIyNfb2Zmc2V0LCBpbmRleCwgXAorCQkJIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2RlZmluZSBSRUdfQUREUl9WRUNUX1hfKCBpbnN0LCBvZmZzLCBpbmRleCwgc3RyaWRlICkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKGluc3QpICsgb2ZmcyArIChpbmRleCkgKiBzdHJpZGUpCisjZW5kaWYKKworI2RlZmluZSBTVFJJREVfaW9wX3NhcF9pbl9yd19idXNfYnl0ZSA0CisvKiBSZWdpc3RlciByd19idXNfYnl0ZSwgc2NvcGUgaW9wX3NhcF9pbiwgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3NhcF9pbl9yd19idXNfYnl0ZV9fX3N5bmNfc2VsX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zYXBfaW5fcndfYnVzX2J5dGVfX19zeW5jX3NlbF9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zYXBfaW5fcndfYnVzX2J5dGVfX19zeW5jX2V4dF9zcmNfX19sc2IgMgorI2RlZmluZSByZWdfaW9wX3NhcF9pbl9yd19idXNfYnl0ZV9fX3N5bmNfZXh0X3NyY19fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2lvcF9zYXBfaW5fcndfYnVzX2J5dGVfX19zeW5jX2VkZ2VfX19sc2IgNQorI2RlZmluZSByZWdfaW9wX3NhcF9pbl9yd19idXNfYnl0ZV9fX3N5bmNfZWRnZV9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zYXBfaW5fcndfYnVzX2J5dGVfX19kZWxheV9fX2xzYiA3CisjZGVmaW5lIHJlZ19pb3Bfc2FwX2luX3J3X2J1c19ieXRlX19fZGVsYXlfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc2FwX2luX3J3X2J1c19ieXRlX29mZnNldCAwCisKKyNkZWZpbmUgU1RSSURFX2lvcF9zYXBfaW5fcndfZ2lvIDQKKy8qIFJlZ2lzdGVyIHJ3X2dpbywgc2NvcGUgaW9wX3NhcF9pbiwgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3NhcF9pbl9yd19naW9fX19zeW5jX3NlbF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc2FwX2luX3J3X2dpb19fX3N5bmNfc2VsX19fd2lkdGggMgorI2RlZmluZSByZWdfaW9wX3NhcF9pbl9yd19naW9fX19zeW5jX2V4dF9zcmNfX19sc2IgMgorI2RlZmluZSByZWdfaW9wX3NhcF9pbl9yd19naW9fX19zeW5jX2V4dF9zcmNfX193aWR0aCAzCisjZGVmaW5lIHJlZ19pb3Bfc2FwX2luX3J3X2dpb19fX3N5bmNfZWRnZV9fX2xzYiA1CisjZGVmaW5lIHJlZ19pb3Bfc2FwX2luX3J3X2dpb19fX3N5bmNfZWRnZV9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zYXBfaW5fcndfZ2lvX19fZGVsYXlfX19sc2IgNworI2RlZmluZSByZWdfaW9wX3NhcF9pbl9yd19naW9fX19kZWxheV9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zYXBfaW5fcndfZ2lvX19fbG9naWNfX19sc2IgOQorI2RlZmluZSByZWdfaW9wX3NhcF9pbl9yd19naW9fX19sb2dpY19fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zYXBfaW5fcndfZ2lvX29mZnNldCAxNgorCisKKy8qIENvbnN0YW50cyAqLworI2RlZmluZSByZWdrX2lvcF9zYXBfaW5fYW5kICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIHJlZ2tfaW9wX3NhcF9pbl9leHRfY2xrMjAwICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgcmVna19pb3Bfc2FwX2luX2dpbzAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zYXBfaW5fZ2lvMTIgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIHJlZ2tfaW9wX3NhcF9pbl9naW8xNiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgcmVna19pb3Bfc2FwX2luX2dpbzIwICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNQorI2RlZmluZSByZWdrX2lvcF9zYXBfaW5fZ2lvMjQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2CisjZGVmaW5lIHJlZ2tfaW9wX3NhcF9pbl9naW8yOCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgcmVna19pb3Bfc2FwX2luX2dpbzQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2lvcF9zYXBfaW5fZ2lvOCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIHJlZ2tfaW9wX3NhcF9pbl9pbnYgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna19pb3Bfc2FwX2luX25lZyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX2lvcF9zYXBfaW5fbm8gICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3NhcF9pbl9ub19kZWxfZXh0X2NsazIwMCAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgcmVna19pb3Bfc2FwX2luX25vbmUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zYXBfaW5fb25lICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfaW9wX3NhcF9pbl9vciAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgcmVna19pb3Bfc2FwX2luX3BvcyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2lvcF9zYXBfaW5fcG9zX25lZyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIHJlZ2tfaW9wX3NhcF9pbl9yd19idXNfYnl0ZV9kZWZhdWx0ICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc2FwX2luX3J3X2J1c19ieXRlX3NpemUgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSByZWdrX2lvcF9zYXBfaW5fcndfZ2lvX2RlZmF1bHQgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3NhcF9pbl9yd19naW9fc2l6ZSAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgcmVna19pb3Bfc2FwX2luX3RpbWVyX2dycDBfdG1yMyAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zYXBfaW5fdGltZXJfZ3JwMV90bXIzICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfaW9wX3NhcF9pbl90bXJfY2xrMjAwICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna19pb3Bfc2FwX2luX3R3byAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX2lvcF9zYXBfaW5fdHdvX2NsazIwMCAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZW5kaWYgLyogX19pb3Bfc2FwX2luX2RlZnNfYXNtX2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvaW9wL2FzbS9pb3Bfc2FwX291dF9kZWZzX2FzbS5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9pb3AvYXNtL2lvcF9zYXBfb3V0X2RlZnNfYXNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk5YmQ2NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvaW9wL2FzbS9pb3Bfc2FwX291dF9kZWZzX2FzbS5oCkBAIC0wLDAgKzEsMjc2IEBACisjaWZuZGVmIF9faW9wX3NhcF9vdXRfZGVmc19hc21faAorI2RlZmluZSBfX2lvcF9zYXBfb3V0X2RlZnNfYXNtX2gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGZyb20KKyAqICAgZmlsZTogICAgICAgICAgIGlvcF9zYXBfb3V0LnIKKyAqIAorICogICBieSAuLi8uLi8uLi90b29scy9yZGVzYy9iaW4vcmRlczJjIC1hc20gLW91dGZpbGUgaW9wX3NhcF9vdXRfZGVmc19hc20uaCBpb3Bfc2FwX291dC5yCisgKiBBbnkgY2hhbmdlcyBoZXJlIHdpbGwgYmUgbG9zdC4KKyAqCisgKiAtKi0gYnVmZmVyLXJlYWQtb25seTogdCAtKi0KKyAqLworCisjaWZuZGVmIFJFR19GSUVMRAorI2RlZmluZSBSRUdfRklFTEQoIHNjb3BlLCByZWcsIGZpZWxkLCB2YWx1ZSApIFwKKyAgUkVHX0ZJRUxEX1hfKCB2YWx1ZSwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX0ZJRUxEX1hfKCB2YWx1ZSwgc2hpZnQgKSAoKHZhbHVlKSA8PCBzaGlmdCkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19TVEFURQorI2RlZmluZSBSRUdfU1RBVEUoIHNjb3BlLCByZWcsIGZpZWxkLCBzeW1ib2xpY192YWx1ZSApIFwKKyAgUkVHX1NUQVRFX1hfKCByZWdrXyMjc2NvcGUjI18jI3N5bWJvbGljX3ZhbHVlLCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX19sc2IgKQorI2RlZmluZSBSRUdfU1RBVEVfWF8oIGssIHNoaWZ0ICkgKGsgPDwgc2hpZnQpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfTUFTSworI2RlZmluZSBSRUdfTUFTSyggc2NvcGUsIHJlZywgZmllbGQgKSBcCisgIFJFR19NQVNLX1hfKCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX193aWR0aCwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX01BU0tfWF8oIHdpZHRoLCBsc2IgKSAoKCgxIDw8IHdpZHRoKS0xKSA8PCBsc2IpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfTFNCCisjZGVmaW5lIFJFR19MU0IoIHNjb3BlLCByZWcsIGZpZWxkICkgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQklUCisjZGVmaW5lIFJFR19CSVQoIHNjb3BlLCByZWcsIGZpZWxkICkgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fYml0CisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUgorI2RlZmluZSBSRUdfQUREUiggc2NvcGUsIGluc3QsIHJlZyApIFJFR19BRERSX1hfKGluc3QsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19vZmZzZXQpCisjZGVmaW5lIFJFR19BRERSX1hfKCBpbnN0LCBvZmZzICkgKChpbnN0KSArIG9mZnMpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUl9WRUNUCisjZGVmaW5lIFJFR19BRERSX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICAgICAgICAgUkVHX0FERFJfVkVDVF9YXyhpbnN0LCByZWdfIyNzY29wZSMjXyMjcmVnIyNfb2Zmc2V0LCBpbmRleCwgXAorCQkJIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2RlZmluZSBSRUdfQUREUl9WRUNUX1hfKCBpbnN0LCBvZmZzLCBpbmRleCwgc3RyaWRlICkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKGluc3QpICsgb2ZmcyArIChpbmRleCkgKiBzdHJpZGUpCisjZW5kaWYKKworLyogUmVnaXN0ZXIgcndfZ2VuX2dhdGVkLCBzY29wZSBpb3Bfc2FwX291dCwgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfZ2VuX2dhdGVkX19fY2xrMF9zcmNfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfZ2VuX2dhdGVkX19fY2xrMF9zcmNfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19nZW5fZ2F0ZWRfX19jbGswX2dhdGVfc3JjX19fbHNiIDIKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2dlbl9nYXRlZF9fX2NsazBfZ2F0ZV9zcmNfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19nZW5fZ2F0ZWRfX19jbGswX2ZvcmNlX3NyY19fX2xzYiA0CisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19nZW5fZ2F0ZWRfX19jbGswX2ZvcmNlX3NyY19fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2dlbl9nYXRlZF9fX2NsazFfc3JjX19fbHNiIDcKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2dlbl9nYXRlZF9fX2NsazFfc3JjX19fd2lkdGggMgorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfZ2VuX2dhdGVkX19fY2xrMV9nYXRlX3NyY19fX2xzYiA5CisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19nZW5fZ2F0ZWRfX19jbGsxX2dhdGVfc3JjX19fd2lkdGggMgorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfZ2VuX2dhdGVkX19fY2xrMV9mb3JjZV9zcmNfX19sc2IgMTEKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2dlbl9nYXRlZF9fX2NsazFfZm9yY2Vfc3JjX19fd2lkdGggMworI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfZ2VuX2dhdGVkX29mZnNldCAwCisKKy8qIFJlZ2lzdGVyIHJ3X2J1cywgc2NvcGUgaW9wX3NhcF9vdXQsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19fX2J5dGUwX2Nsa19zZWxfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX19fYnl0ZTBfY2xrX3NlbF9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19fX2J5dGUwX2Nsa19leHRfX19sc2IgMgorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX19fYnl0ZTBfY2xrX2V4dF9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19fX2J5dGUwX2dhdGVkX2Nsa19fX2xzYiA0CisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfX19ieXRlMF9nYXRlZF9jbGtfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfX19ieXRlMF9nYXRlZF9jbGtfX19iaXQgNAorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX19fYnl0ZTBfY2xrX2ludl9fX2xzYiA1CisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfX19ieXRlMF9jbGtfaW52X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX19fYnl0ZTBfY2xrX2ludl9fX2JpdCA1CisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfX19ieXRlMF9kZWxheV9fX2xzYiA2CisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfX19ieXRlMF9kZWxheV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19fX2J5dGUwX2RlbGF5X19fYml0IDYKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19fX2J5dGUxX2Nsa19zZWxfX19sc2IgNworI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX19fYnl0ZTFfY2xrX3NlbF9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19fX2J5dGUxX2Nsa19leHRfX19sc2IgOQorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX19fYnl0ZTFfY2xrX2V4dF9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19fX2J5dGUxX2dhdGVkX2Nsa19fX2xzYiAxMQorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX19fYnl0ZTFfZ2F0ZWRfY2xrX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX19fYnl0ZTFfZ2F0ZWRfY2xrX19fYml0IDExCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfX19ieXRlMV9jbGtfaW52X19fbHNiIDEyCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfX19ieXRlMV9jbGtfaW52X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX19fYnl0ZTFfY2xrX2ludl9fX2JpdCAxMgorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX19fYnl0ZTFfZGVsYXlfX19sc2IgMTMKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19fX2J5dGUxX2RlbGF5X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX19fYnl0ZTFfZGVsYXlfX19iaXQgMTMKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19fX2J5dGUyX2Nsa19zZWxfX19sc2IgMTQKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19fX2J5dGUyX2Nsa19zZWxfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfX19ieXRlMl9jbGtfZXh0X19fbHNiIDE2CisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfX19ieXRlMl9jbGtfZXh0X19fd2lkdGggMgorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX19fYnl0ZTJfZ2F0ZWRfY2xrX19fbHNiIDE4CisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfX19ieXRlMl9nYXRlZF9jbGtfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfX19ieXRlMl9nYXRlZF9jbGtfX19iaXQgMTgKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19fX2J5dGUyX2Nsa19pbnZfX19sc2IgMTkKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19fX2J5dGUyX2Nsa19pbnZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfX19ieXRlMl9jbGtfaW52X19fYml0IDE5CisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfX19ieXRlMl9kZWxheV9fX2xzYiAyMAorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX19fYnl0ZTJfZGVsYXlfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfX19ieXRlMl9kZWxheV9fX2JpdCAyMAorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX19fYnl0ZTNfY2xrX3NlbF9fX2xzYiAyMQorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX19fYnl0ZTNfY2xrX3NlbF9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19fX2J5dGUzX2Nsa19leHRfX19sc2IgMjMKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19fX2J5dGUzX2Nsa19leHRfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfX19ieXRlM19nYXRlZF9jbGtfX19sc2IgMjUKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19fX2J5dGUzX2dhdGVkX2Nsa19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19fX2J5dGUzX2dhdGVkX2Nsa19fX2JpdCAyNQorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX19fYnl0ZTNfY2xrX2ludl9fX2xzYiAyNgorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX19fYnl0ZTNfY2xrX2ludl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19fX2J5dGUzX2Nsa19pbnZfX19iaXQgMjYKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19fX2J5dGUzX2RlbGF5X19fbHNiIDI3CisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfX19ieXRlM19kZWxheV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19fX2J5dGUzX2RlbGF5X19fYml0IDI3CisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfb2Zmc2V0IDQKKworLyogUmVnaXN0ZXIgcndfYnVzX2xvX29lLCBzY29wZSBpb3Bfc2FwX291dCwgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2xvX29lX19fYnl0ZTBfY2xrX3NlbF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfbG9fb2VfX19ieXRlMF9jbGtfc2VsX19fd2lkdGggMgorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2xvX29lX19fYnl0ZTBfY2xrX2V4dF9fX2xzYiAyCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfbG9fb2VfX19ieXRlMF9jbGtfZXh0X19fd2lkdGggMgorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2xvX29lX19fYnl0ZTBfZ2F0ZWRfY2xrX19fbHNiIDQKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19sb19vZV9fX2J5dGUwX2dhdGVkX2Nsa19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19sb19vZV9fX2J5dGUwX2dhdGVkX2Nsa19fX2JpdCA0CisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfbG9fb2VfX19ieXRlMF9jbGtfaW52X19fbHNiIDUKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19sb19vZV9fX2J5dGUwX2Nsa19pbnZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfbG9fb2VfX19ieXRlMF9jbGtfaW52X19fYml0IDUKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19sb19vZV9fX2J5dGUwX2RlbGF5X19fbHNiIDYKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19sb19vZV9fX2J5dGUwX2RlbGF5X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2xvX29lX19fYnl0ZTBfZGVsYXlfX19iaXQgNgorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2xvX29lX19fYnl0ZTBfbG9naWNfX19sc2IgNworI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2xvX29lX19fYnl0ZTBfbG9naWNfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfbG9fb2VfX19ieXRlMF9sb2dpY19zcmNfX19sc2IgOQorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2xvX29lX19fYnl0ZTBfbG9naWNfc3JjX19fd2lkdGggMgorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2xvX29lX19fYnl0ZTFfY2xrX3NlbF9fX2xzYiAxMQorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2xvX29lX19fYnl0ZTFfY2xrX3NlbF9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19sb19vZV9fX2J5dGUxX2Nsa19leHRfX19sc2IgMTMKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19sb19vZV9fX2J5dGUxX2Nsa19leHRfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfbG9fb2VfX19ieXRlMV9nYXRlZF9jbGtfX19sc2IgMTUKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19sb19vZV9fX2J5dGUxX2dhdGVkX2Nsa19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19sb19vZV9fX2J5dGUxX2dhdGVkX2Nsa19fX2JpdCAxNQorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2xvX29lX19fYnl0ZTFfY2xrX2ludl9fX2xzYiAxNgorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2xvX29lX19fYnl0ZTFfY2xrX2ludl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19sb19vZV9fX2J5dGUxX2Nsa19pbnZfX19iaXQgMTYKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19sb19vZV9fX2J5dGUxX2RlbGF5X19fbHNiIDE3CisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfbG9fb2VfX19ieXRlMV9kZWxheV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19sb19vZV9fX2J5dGUxX2RlbGF5X19fYml0IDE3CisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfbG9fb2VfX19ieXRlMV9sb2dpY19fX2xzYiAxOAorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2xvX29lX19fYnl0ZTFfbG9naWNfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfbG9fb2VfX19ieXRlMV9sb2dpY19zcmNfX19sc2IgMjAKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19sb19vZV9fX2J5dGUxX2xvZ2ljX3NyY19fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19sb19vZV9vZmZzZXQgOAorCisvKiBSZWdpc3RlciByd19idXNfaGlfb2UsIHNjb3BlIGlvcF9zYXBfb3V0LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfaGlfb2VfX19ieXRlMl9jbGtfc2VsX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19oaV9vZV9fX2J5dGUyX2Nsa19zZWxfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfaGlfb2VfX19ieXRlMl9jbGtfZXh0X19fbHNiIDIKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19oaV9vZV9fX2J5dGUyX2Nsa19leHRfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfaGlfb2VfX19ieXRlMl9nYXRlZF9jbGtfX19sc2IgNAorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2hpX29lX19fYnl0ZTJfZ2F0ZWRfY2xrX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2hpX29lX19fYnl0ZTJfZ2F0ZWRfY2xrX19fYml0IDQKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19oaV9vZV9fX2J5dGUyX2Nsa19pbnZfX19sc2IgNQorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2hpX29lX19fYnl0ZTJfY2xrX2ludl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19oaV9vZV9fX2J5dGUyX2Nsa19pbnZfX19iaXQgNQorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2hpX29lX19fYnl0ZTJfZGVsYXlfX19sc2IgNgorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2hpX29lX19fYnl0ZTJfZGVsYXlfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfaGlfb2VfX19ieXRlMl9kZWxheV9fX2JpdCA2CisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfaGlfb2VfX19ieXRlMl9sb2dpY19fX2xzYiA3CisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfaGlfb2VfX19ieXRlMl9sb2dpY19fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19oaV9vZV9fX2J5dGUyX2xvZ2ljX3NyY19fX2xzYiA5CisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfaGlfb2VfX19ieXRlMl9sb2dpY19zcmNfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfaGlfb2VfX19ieXRlM19jbGtfc2VsX19fbHNiIDExCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfaGlfb2VfX19ieXRlM19jbGtfc2VsX19fd2lkdGggMgorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2hpX29lX19fYnl0ZTNfY2xrX2V4dF9fX2xzYiAxMworI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2hpX29lX19fYnl0ZTNfY2xrX2V4dF9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19oaV9vZV9fX2J5dGUzX2dhdGVkX2Nsa19fX2xzYiAxNQorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2hpX29lX19fYnl0ZTNfZ2F0ZWRfY2xrX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2hpX29lX19fYnl0ZTNfZ2F0ZWRfY2xrX19fYml0IDE1CisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfaGlfb2VfX19ieXRlM19jbGtfaW52X19fbHNiIDE2CisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfaGlfb2VfX19ieXRlM19jbGtfaW52X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2hpX29lX19fYnl0ZTNfY2xrX2ludl9fX2JpdCAxNgorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2hpX29lX19fYnl0ZTNfZGVsYXlfX19sc2IgMTcKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19oaV9vZV9fX2J5dGUzX2RlbGF5X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2hpX29lX19fYnl0ZTNfZGVsYXlfX19iaXQgMTcKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19oaV9vZV9fX2J5dGUzX2xvZ2ljX19fbHNiIDE4CisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19idXNfaGlfb2VfX19ieXRlM19sb2dpY19fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19oaV9vZV9fX2J5dGUzX2xvZ2ljX3NyY19fX2xzYiAyMAorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2hpX29lX19fYnl0ZTNfbG9naWNfc3JjX19fd2lkdGggMgorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfYnVzX2hpX29lX29mZnNldCAxMgorCisjZGVmaW5lIFNUUklERV9pb3Bfc2FwX291dF9yd19naW8gNAorLyogUmVnaXN0ZXIgcndfZ2lvLCBzY29wZSBpb3Bfc2FwX291dCwgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfZ2lvX19fb3V0X2Nsa19zZWxfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfZ2lvX19fb3V0X2Nsa19zZWxfX193aWR0aCAzCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19naW9fX19vdXRfY2xrX2V4dF9fX2xzYiAzCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19naW9fX19vdXRfY2xrX2V4dF9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2dpb19fX291dF9nYXRlZF9jbGtfX19sc2IgNQorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfZ2lvX19fb3V0X2dhdGVkX2Nsa19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2dpb19fX291dF9nYXRlZF9jbGtfX19iaXQgNQorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfZ2lvX19fb3V0X2Nsa19pbnZfX19sc2IgNgorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfZ2lvX19fb3V0X2Nsa19pbnZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19naW9fX19vdXRfY2xrX2ludl9fX2JpdCA2CisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19naW9fX19vdXRfZGVsYXlfX19sc2IgNworI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfZ2lvX19fb3V0X2RlbGF5X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfZ2lvX19fb3V0X2RlbGF5X19fYml0IDcKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2dpb19fX291dF9sb2dpY19fX2xzYiA4CisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19naW9fX19vdXRfbG9naWNfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19naW9fX19vdXRfbG9naWNfc3JjX19fbHNiIDEwCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19naW9fX19vdXRfbG9naWNfc3JjX19fd2lkdGggMgorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfZ2lvX19fb2VfY2xrX3NlbF9fX2xzYiAxMgorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfZ2lvX19fb2VfY2xrX3NlbF9fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2dpb19fX29lX2Nsa19leHRfX19sc2IgMTUKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2dpb19fX29lX2Nsa19leHRfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19naW9fX19vZV9nYXRlZF9jbGtfX19sc2IgMTcKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2dpb19fX29lX2dhdGVkX2Nsa19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2dpb19fX29lX2dhdGVkX2Nsa19fX2JpdCAxNworI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfZ2lvX19fb2VfY2xrX2ludl9fX2xzYiAxOAorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfZ2lvX19fb2VfY2xrX2ludl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2dpb19fX29lX2Nsa19pbnZfX19iaXQgMTgKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2dpb19fX29lX2RlbGF5X19fbHNiIDE5CisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19naW9fX19vZV9kZWxheV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2dpb19fX29lX2RlbGF5X19fYml0IDE5CisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19naW9fX19vZV9sb2dpY19fX2xzYiAyMAorI2RlZmluZSByZWdfaW9wX3NhcF9vdXRfcndfZ2lvX19fb2VfbG9naWNfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc2FwX291dF9yd19naW9fX19vZV9sb2dpY19zcmNfX19sc2IgMjIKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2dpb19fX29lX2xvZ2ljX3NyY19fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zYXBfb3V0X3J3X2dpb19vZmZzZXQgMTYKKworCisvKiBDb25zdGFudHMgKi8KKyNkZWZpbmUgcmVna19pb3Bfc2FwX291dF9hbHdheXMgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2lvcF9zYXBfb3V0X2FuZCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIHJlZ2tfaW9wX3NhcF9vdXRfY2xrMCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc2FwX291dF9jbGsxICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2lvcF9zYXBfb3V0X2NsazEyICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIHJlZ2tfaW9wX3NhcF9vdXRfY2xrMjAwICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc2FwX291dF9leHQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX2lvcF9zYXBfb3V0X2dhdGVkICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIHJlZ2tfaW9wX3NhcF9vdXRfZ2lvMCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc2FwX291dF9naW8xICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zYXBfb3V0X2dpbzE2ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIHJlZ2tfaW9wX3NhcF9vdXRfZ2lvMTcgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgcmVna19pb3Bfc2FwX291dF9naW8yNCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSByZWdrX2lvcF9zYXBfb3V0X2dpbzI1ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIHJlZ2tfaW9wX3NhcF9vdXRfZ2lvOCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna19pb3Bfc2FwX291dF9naW85ICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2lvcF9zYXBfb3V0X2dpb19vdXQxMCAgICAgICAgICAgICAgICAweDAwMDAwMDA1CisjZGVmaW5lIHJlZ2tfaW9wX3NhcF9vdXRfZ2lvX291dDE4ICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgcmVna19pb3Bfc2FwX291dF9naW9fb3V0MiAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSByZWdrX2lvcF9zYXBfb3V0X2dpb19vdXQyNiAgICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIHJlZ2tfaW9wX3NhcF9vdXRfaW52ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna19pb3Bfc2FwX291dF9uYW5kICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSByZWdrX2lvcF9zYXBfb3V0X25vICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3NhcF9vdXRfbm9uZSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc2FwX291dF9vbmUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2lvcF9zYXBfb3V0X3J3X2J1c19kZWZhdWx0ICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3NhcF9vdXRfcndfYnVzX2hpX29lX2RlZmF1bHQgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc2FwX291dF9yd19idXNfbG9fb2VfZGVmYXVsdCAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zYXBfb3V0X3J3X2dlbl9nYXRlZF9kZWZhdWx0ICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3NhcF9vdXRfcndfZ2lvX2RlZmF1bHQgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc2FwX291dF9yd19naW9fc2l6ZSAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSByZWdrX2lvcF9zYXBfb3V0X3NwdV9naW82ICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIHJlZ2tfaW9wX3NhcF9vdXRfc3B1X2dpbzcgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgcmVna19pb3Bfc2FwX291dF90aW1lcl9ncnAwX3RtcjIgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zYXBfb3V0X3RpbWVyX2dycDBfdG1yMyAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfaW9wX3NhcF9vdXRfdGltZXJfZ3JwMV90bXIyICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgcmVna19pb3Bfc2FwX291dF90aW1lcl9ncnAxX3RtcjMgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSByZWdrX2lvcF9zYXBfb3V0X3RtcjIwMCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfaW9wX3NhcF9vdXRfeWVzICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNlbmRpZiAvKiBfX2lvcF9zYXBfb3V0X2RlZnNfYXNtX2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvaW9wL2FzbS9pb3Bfc3dfY2ZnX2RlZnNfYXNtLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2lvcC9hc20vaW9wX3N3X2NmZ19kZWZzX2FzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMzk0OWIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2lvcC9hc20vaW9wX3N3X2NmZ19kZWZzX2FzbS5oCkBAIC0wLDAgKzEsNzM5IEBACisjaWZuZGVmIF9faW9wX3N3X2NmZ19kZWZzX2FzbV9oCisjZGVmaW5lIF9faW9wX3N3X2NmZ19kZWZzX2FzbV9oCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCisgKiAgIGZpbGU6ICAgICAgICAgICBpb3Bfc3dfY2ZnLnIKKyAqIAorICogICBieSAuLi8uLi8uLi90b29scy9yZGVzYy9iaW4vcmRlczJjIC1hc20gLW91dGZpbGUgaW9wX3N3X2NmZ19kZWZzX2FzbS5oIGlvcF9zd19jZmcucgorICogQW55IGNoYW5nZXMgaGVyZSB3aWxsIGJlIGxvc3QuCisgKgorICogLSotIGJ1ZmZlci1yZWFkLW9ubHk6IHQgLSotCisgKi8KKworI2lmbmRlZiBSRUdfRklFTEQKKyNkZWZpbmUgUkVHX0ZJRUxEKCBzY29wZSwgcmVnLCBmaWVsZCwgdmFsdWUgKSBcCisgIFJFR19GSUVMRF9YXyggdmFsdWUsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19fXyMjZmllbGQjI19fX2xzYiApCisjZGVmaW5lIFJFR19GSUVMRF9YXyggdmFsdWUsIHNoaWZ0ICkgKCh2YWx1ZSkgPDwgc2hpZnQpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfU1RBVEUKKyNkZWZpbmUgUkVHX1NUQVRFKCBzY29wZSwgcmVnLCBmaWVsZCwgc3ltYm9saWNfdmFsdWUgKSBcCisgIFJFR19TVEFURV9YXyggcmVna18jI3Njb3BlIyNfIyNzeW1ib2xpY192YWx1ZSwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX1NUQVRFX1hfKCBrLCBzaGlmdCApIChrIDw8IHNoaWZ0KQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX01BU0sKKyNkZWZpbmUgUkVHX01BU0soIHNjb3BlLCByZWcsIGZpZWxkICkgXAorICBSRUdfTUFTS19YXyggcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fd2lkdGgsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19fXyMjZmllbGQjI19fX2xzYiApCisjZGVmaW5lIFJFR19NQVNLX1hfKCB3aWR0aCwgbHNiICkgKCgoMSA8PCB3aWR0aCktMSkgPDwgbHNiKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0xTQgorI2RlZmluZSBSRUdfTFNCKCBzY29wZSwgcmVnLCBmaWVsZCApIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19fXyMjZmllbGQjI19fX2xzYgorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0JJVAorI2RlZmluZSBSRUdfQklUKCBzY29wZSwgcmVnLCBmaWVsZCApIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19fXyMjZmllbGQjI19fX2JpdAorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFIKKyNkZWZpbmUgUkVHX0FERFIoIHNjb3BlLCBpbnN0LCByZWcgKSBSRUdfQUREUl9YXyhpbnN0LCByZWdfIyNzY29wZSMjXyMjcmVnIyNfb2Zmc2V0KQorI2RlZmluZSBSRUdfQUREUl9YXyggaW5zdCwgb2ZmcyApICgoaW5zdCkgKyBvZmZzKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFJfVkVDVAorI2RlZmluZSBSRUdfQUREUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgICAgICAgIFJFR19BRERSX1ZFQ1RfWF8oaW5zdCwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX29mZnNldCwgaW5kZXgsIFwKKwkJCSBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNkZWZpbmUgUkVHX0FERFJfVkVDVF9YXyggaW5zdCwgb2ZmcywgaW5kZXgsIHN0cmlkZSApIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnN0KSArIG9mZnMgKyAoaW5kZXgpICogc3RyaWRlKQorI2VuZGlmCisKKy8qIFJlZ2lzdGVyIHJ3X2NyY19wYXJfb3duZXIsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfY3JjX3Bhcl9vd25lcl9fX2NmZ19fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2NyY19wYXJfb3duZXJfX19jZmdfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2NyY19wYXJfb3duZXJfb2Zmc2V0IDAKKworLyogUmVnaXN0ZXIgcndfZG1jX2luX293bmVyLCBzY29wZSBpb3Bfc3dfY2ZnLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2RtY19pbl9vd25lcl9fX2NmZ19fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2RtY19pbl9vd25lcl9fX2NmZ19fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZG1jX2luX293bmVyX29mZnNldCA0CisKKy8qIFJlZ2lzdGVyIHJ3X2RtY19vdXRfb3duZXIsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZG1jX291dF9vd25lcl9fX2NmZ19fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2RtY19vdXRfb3duZXJfX19jZmdfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2RtY19vdXRfb3duZXJfb2Zmc2V0IDgKKworLyogUmVnaXN0ZXIgcndfZmlmb19pbl9vd25lciwgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19maWZvX2luX293bmVyX19fY2ZnX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZmlmb19pbl9vd25lcl9fX2NmZ19fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZmlmb19pbl9vd25lcl9vZmZzZXQgMTIKKworLyogUmVnaXN0ZXIgcndfZmlmb19pbl9leHRyYV9vd25lciwgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19maWZvX2luX2V4dHJhX293bmVyX19fY2ZnX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZmlmb19pbl9leHRyYV9vd25lcl9fX2NmZ19fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZmlmb19pbl9leHRyYV9vd25lcl9vZmZzZXQgMTYKKworLyogUmVnaXN0ZXIgcndfZmlmb19vdXRfb3duZXIsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZmlmb19vdXRfb3duZXJfX19jZmdfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19maWZvX291dF9vd25lcl9fX2NmZ19fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZmlmb19vdXRfb3duZXJfb2Zmc2V0IDIwCisKKy8qIFJlZ2lzdGVyIHJ3X2ZpZm9fb3V0X2V4dHJhX293bmVyLCBzY29wZSBpb3Bfc3dfY2ZnLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2ZpZm9fb3V0X2V4dHJhX293bmVyX19fY2ZnX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZmlmb19vdXRfZXh0cmFfb3duZXJfX19jZmdfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2ZpZm9fb3V0X2V4dHJhX293bmVyX29mZnNldCAyNAorCisvKiBSZWdpc3RlciByd19zYXBfaW5fb3duZXIsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfc2FwX2luX293bmVyX19fY2ZnX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfc2FwX2luX293bmVyX19fY2ZnX19fd2lkdGggMgorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19zYXBfaW5fb3duZXJfb2Zmc2V0IDI4CisKKy8qIFJlZ2lzdGVyIHJ3X3NhcF9vdXRfb3duZXIsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfc2FwX291dF9vd25lcl9fX2NmZ19fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3NhcF9vdXRfb3duZXJfX19jZmdfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3NhcF9vdXRfb3duZXJfb2Zmc2V0IDMyCisKKy8qIFJlZ2lzdGVyIHJ3X3NjcmNfaW5fb3duZXIsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfc2NyY19pbl9vd25lcl9fX2NmZ19fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3NjcmNfaW5fb3duZXJfX19jZmdfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3NjcmNfaW5fb3duZXJfb2Zmc2V0IDM2CisKKy8qIFJlZ2lzdGVyIHJ3X3NjcmNfb3V0X293bmVyLCBzY29wZSBpb3Bfc3dfY2ZnLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3NjcmNfb3V0X293bmVyX19fY2ZnX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfc2NyY19vdXRfb3duZXJfX19jZmdfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3NjcmNfb3V0X293bmVyX29mZnNldCA0MAorCisvKiBSZWdpc3RlciByd19zcHVfb3duZXIsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfc3B1X293bmVyX19fY2ZnX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfc3B1X293bmVyX19fY2ZnX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19zcHVfb3duZXJfX19jZmdfX19iaXQgMAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19zcHVfb3duZXJfb2Zmc2V0IDQ0CisKKy8qIFJlZ2lzdGVyIHJ3X3RpbWVyX2dycDBfb3duZXIsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdGltZXJfZ3JwMF9vd25lcl9fX2NmZ19fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDBfb3duZXJfX19jZmdfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDBfb3duZXJfb2Zmc2V0IDQ4CisKKy8qIFJlZ2lzdGVyIHJ3X3RpbWVyX2dycDFfb3duZXIsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdGltZXJfZ3JwMV9vd25lcl9fX2NmZ19fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDFfb3duZXJfX19jZmdfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDFfb3duZXJfb2Zmc2V0IDUyCisKKy8qIFJlZ2lzdGVyIHJ3X3RyaWdnZXJfZ3JwMF9vd25lciwgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycDBfb3duZXJfX19jZmdfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycDBfb3duZXJfX19jZmdfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3JwMF9vd25lcl9vZmZzZXQgNTYKKworLyogUmVnaXN0ZXIgcndfdHJpZ2dlcl9ncnAxX293bmVyLCBzY29wZSBpb3Bfc3dfY2ZnLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3JwMV9vd25lcl9fX2NmZ19fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3JwMV9vd25lcl9fX2NmZ19fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnAxX293bmVyX29mZnNldCA2MAorCisvKiBSZWdpc3RlciByd190cmlnZ2VyX2dycDJfb3duZXIsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnAyX293bmVyX19fY2ZnX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnAyX293bmVyX19fY2ZnX19fd2lkdGggMgorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycDJfb3duZXJfb2Zmc2V0IDY0CisKKy8qIFJlZ2lzdGVyIHJ3X3RyaWdnZXJfZ3JwM19vd25lciwgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycDNfb3duZXJfX19jZmdfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycDNfb3duZXJfX19jZmdfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3JwM19vd25lcl9vZmZzZXQgNjgKKworLyogUmVnaXN0ZXIgcndfdHJpZ2dlcl9ncnA0X293bmVyLCBzY29wZSBpb3Bfc3dfY2ZnLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3JwNF9vd25lcl9fX2NmZ19fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3JwNF9vd25lcl9fX2NmZ19fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnA0X293bmVyX29mZnNldCA3MgorCisvKiBSZWdpc3RlciByd190cmlnZ2VyX2dycDVfb3duZXIsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnA1X293bmVyX19fY2ZnX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnA1X293bmVyX19fY2ZnX19fd2lkdGggMgorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycDVfb3duZXJfb2Zmc2V0IDc2CisKKy8qIFJlZ2lzdGVyIHJ3X3RyaWdnZXJfZ3JwNl9vd25lciwgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycDZfb3duZXJfX19jZmdfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycDZfb3duZXJfX19jZmdfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3JwNl9vd25lcl9vZmZzZXQgODAKKworLyogUmVnaXN0ZXIgcndfdHJpZ2dlcl9ncnA3X293bmVyLCBzY29wZSBpb3Bfc3dfY2ZnLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3JwN19vd25lcl9fX2NmZ19fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3JwN19vd25lcl9fX2NmZ19fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnA3X293bmVyX29mZnNldCA4NAorCisvKiBSZWdpc3RlciByd19idXNfbWFzaywgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19idXNfbWFza19fX2J5dGUwX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfYnVzX21hc2tfX19ieXRlMF9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfYnVzX21hc2tfX19ieXRlMV9fX2xzYiA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2J1c19tYXNrX19fYnl0ZTFfX193aWR0aCA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2J1c19tYXNrX19fYnl0ZTJfX19sc2IgMTYKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfYnVzX21hc2tfX19ieXRlMl9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfYnVzX21hc2tfX19ieXRlM19fX2xzYiAyNAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19idXNfbWFza19fX2J5dGUzX19fd2lkdGggOAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19idXNfbWFza19vZmZzZXQgODgKKworLyogUmVnaXN0ZXIgcndfYnVzX29lX21hc2ssIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfYnVzX29lX21hc2tfX19ieXRlMF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2J1c19vZV9tYXNrX19fYnl0ZTBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2J1c19vZV9tYXNrX19fYnl0ZTBfX19iaXQgMAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19idXNfb2VfbWFza19fX2J5dGUxX19fbHNiIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfYnVzX29lX21hc2tfX19ieXRlMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfYnVzX29lX21hc2tfX19ieXRlMV9fX2JpdCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2J1c19vZV9tYXNrX19fYnl0ZTJfX19sc2IgMgorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19idXNfb2VfbWFza19fX2J5dGUyX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19idXNfb2VfbWFza19fX2J5dGUyX19fYml0IDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfYnVzX29lX21hc2tfX19ieXRlM19fX2xzYiAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2J1c19vZV9tYXNrX19fYnl0ZTNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2J1c19vZV9tYXNrX19fYnl0ZTNfX19iaXQgMworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19idXNfb2VfbWFza19vZmZzZXQgOTIKKworLyogUmVnaXN0ZXIgcndfZ2lvX21hc2ssIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX21hc2tfX192YWxfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fbWFza19fX3ZhbF9fX3dpZHRoIDMyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19tYXNrX29mZnNldCA5NgorCisvKiBSZWdpc3RlciByd19naW9fb2VfbWFzaywgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb2VfbWFza19fX3ZhbF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vZV9tYXNrX19fdmFsX19fd2lkdGggMzIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX29lX21hc2tfb2Zmc2V0IDEwMAorCisvKiBSZWdpc3RlciByd19waW5tYXBwaW5nLCBzY29wZSBpb3Bfc3dfY2ZnLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3Bpbm1hcHBpbmdfX19idXNfYnl0ZTBfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19waW5tYXBwaW5nX19fYnVzX2J5dGUwX19fd2lkdGggMgorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19waW5tYXBwaW5nX19fYnVzX2J5dGUxX19fbHNiIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfcGlubWFwcGluZ19fX2J1c19ieXRlMV9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfcGlubWFwcGluZ19fX2J1c19ieXRlMl9fX2xzYiA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3Bpbm1hcHBpbmdfX19idXNfYnl0ZTJfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3Bpbm1hcHBpbmdfX19idXNfYnl0ZTNfX19sc2IgNgorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19waW5tYXBwaW5nX19fYnVzX2J5dGUzX19fd2lkdGggMgorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19waW5tYXBwaW5nX19fZ2lvM18wX19fbHNiIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfcGlubWFwcGluZ19fX2dpbzNfMF9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfcGlubWFwcGluZ19fX2dpbzdfNF9fX2xzYiAxMAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19waW5tYXBwaW5nX19fZ2lvN180X19fd2lkdGggMgorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19waW5tYXBwaW5nX19fZ2lvMTFfOF9fX2xzYiAxMgorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19waW5tYXBwaW5nX19fZ2lvMTFfOF9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfcGlubWFwcGluZ19fX2dpbzE1XzEyX19fbHNiIDE0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3Bpbm1hcHBpbmdfX19naW8xNV8xMl9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfcGlubWFwcGluZ19fX2dpbzE5XzE2X19fbHNiIDE2CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3Bpbm1hcHBpbmdfX19naW8xOV8xNl9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfcGlubWFwcGluZ19fX2dpbzIzXzIwX19fbHNiIDE4CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3Bpbm1hcHBpbmdfX19naW8yM18yMF9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfcGlubWFwcGluZ19fX2dpbzI3XzI0X19fbHNiIDIwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3Bpbm1hcHBpbmdfX19naW8yN18yNF9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfcGlubWFwcGluZ19fX2dpbzMxXzI4X19fbHNiIDIyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3Bpbm1hcHBpbmdfX19naW8zMV8yOF9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfcGlubWFwcGluZ19vZmZzZXQgMTA0CisKKy8qIFJlZ2lzdGVyIHJ3X2J1c19vdXRfY2ZnLCBzY29wZSBpb3Bfc3dfY2ZnLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2J1c19vdXRfY2ZnX19fYnVzX2xvX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfYnVzX291dF9jZmdfX19idXNfbG9fX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2J1c19vdXRfY2ZnX19fYnVzX2hpX19fbHNiIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfYnVzX291dF9jZmdfX19idXNfaGlfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2J1c19vdXRfY2ZnX19fYnVzX2xvX29lX19fbHNiIDQKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfYnVzX291dF9jZmdfX19idXNfbG9fb2VfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2J1c19vdXRfY2ZnX19fYnVzX2hpX29lX19fbHNiIDYKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfYnVzX291dF9jZmdfX19idXNfaGlfb2VfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2J1c19vdXRfY2ZnX29mZnNldCAxMDgKKworLyogUmVnaXN0ZXIgcndfZ2lvX291dF9ncnAwX2NmZywgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDBfY2ZnX19fZ2lvMF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMF9jZmdfX19naW8wX19fd2lkdGggMworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDBfY2ZnX19fZ2lvMF9vZV9fX2xzYiAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMF9jZmdfX19naW8wX29lX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDBfY2ZnX19fZ2lvMF9vZV9fX2JpdCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMF9jZmdfX19naW8xX19fbHNiIDQKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAwX2NmZ19fX2dpbzFfX193aWR0aCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMF9jZmdfX19naW8xX29lX19fbHNiIDcKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAwX2NmZ19fX2dpbzFfb2VfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMF9jZmdfX19naW8xX29lX19fYml0IDcKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAwX2NmZ19fX2dpbzJfX19sc2IgOAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDBfY2ZnX19fZ2lvMl9fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAwX2NmZ19fX2dpbzJfb2VfX19sc2IgMTEKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAwX2NmZ19fX2dpbzJfb2VfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMF9jZmdfX19naW8yX29lX19fYml0IDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMF9jZmdfX19naW8zX19fbHNiIDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMF9jZmdfX19naW8zX19fd2lkdGggMworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDBfY2ZnX19fZ2lvM19vZV9fX2xzYiAxNQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDBfY2ZnX19fZ2lvM19vZV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAwX2NmZ19fX2dpbzNfb2VfX19iaXQgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAwX2NmZ19vZmZzZXQgMTEyCisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19vdXRfZ3JwMV9jZmcsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAxX2NmZ19fX2dpbzRfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDFfY2ZnX19fZ2lvNF9fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAxX2NmZ19fX2dpbzRfb2VfX19sc2IgMworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDFfY2ZnX19fZ2lvNF9vZV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAxX2NmZ19fX2dpbzRfb2VfX19iaXQgMworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDFfY2ZnX19fZ2lvNV9fX2xzYiA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMV9jZmdfX19naW81X19fd2lkdGggMworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDFfY2ZnX19fZ2lvNV9vZV9fX2xzYiA3CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMV9jZmdfX19naW81X29lX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDFfY2ZnX19fZ2lvNV9vZV9fX2JpdCA3CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMV9jZmdfX19naW82X19fbHNiIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAxX2NmZ19fX2dpbzZfX193aWR0aCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMV9jZmdfX19naW82X29lX19fbHNiIDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMV9jZmdfX19naW82X29lX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDFfY2ZnX19fZ2lvNl9vZV9fX2JpdCAxMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDFfY2ZnX19fZ2lvN19fX2xzYiAxMgorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDFfY2ZnX19fZ2lvN19fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAxX2NmZ19fX2dpbzdfb2VfX19sc2IgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAxX2NmZ19fX2dpbzdfb2VfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMV9jZmdfX19naW83X29lX19fYml0IDE1CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMV9jZmdfb2Zmc2V0IDExNgorCisvKiBSZWdpc3RlciByd19naW9fb3V0X2dycDJfY2ZnLCBzY29wZSBpb3Bfc3dfY2ZnLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMl9jZmdfX19naW84X19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAyX2NmZ19fX2dpbzhfX193aWR0aCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMl9jZmdfX19naW84X29lX19fbHNiIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAyX2NmZ19fX2dpbzhfb2VfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMl9jZmdfX19naW84X29lX19fYml0IDMKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAyX2NmZ19fX2dpbzlfX19sc2IgNAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDJfY2ZnX19fZ2lvOV9fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAyX2NmZ19fX2dpbzlfb2VfX19sc2IgNworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDJfY2ZnX19fZ2lvOV9vZV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAyX2NmZ19fX2dpbzlfb2VfX19iaXQgNworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDJfY2ZnX19fZ2lvMTBfX19sc2IgOAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDJfY2ZnX19fZ2lvMTBfX193aWR0aCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMl9jZmdfX19naW8xMF9vZV9fX2xzYiAxMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDJfY2ZnX19fZ2lvMTBfb2VfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMl9jZmdfX19naW8xMF9vZV9fX2JpdCAxMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDJfY2ZnX19fZ2lvMTFfX19sc2IgMTIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAyX2NmZ19fX2dpbzExX19fd2lkdGggMworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDJfY2ZnX19fZ2lvMTFfb2VfX19sc2IgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAyX2NmZ19fX2dpbzExX29lX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDJfY2ZnX19fZ2lvMTFfb2VfX19iaXQgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAyX2NmZ19vZmZzZXQgMTIwCisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19vdXRfZ3JwM19jZmcsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAzX2NmZ19fX2dpbzEyX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAzX2NmZ19fX2dpbzEyX19fd2lkdGggMworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDNfY2ZnX19fZ2lvMTJfb2VfX19sc2IgMworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDNfY2ZnX19fZ2lvMTJfb2VfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwM19jZmdfX19naW8xMl9vZV9fX2JpdCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwM19jZmdfX19naW8xM19fX2xzYiA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwM19jZmdfX19naW8xM19fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAzX2NmZ19fX2dpbzEzX29lX19fbHNiIDcKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAzX2NmZ19fX2dpbzEzX29lX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDNfY2ZnX19fZ2lvMTNfb2VfX19iaXQgNworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDNfY2ZnX19fZ2lvMTRfX19sc2IgOAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDNfY2ZnX19fZ2lvMTRfX193aWR0aCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwM19jZmdfX19naW8xNF9vZV9fX2xzYiAxMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDNfY2ZnX19fZ2lvMTRfb2VfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwM19jZmdfX19naW8xNF9vZV9fX2JpdCAxMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDNfY2ZnX19fZ2lvMTVfX19sc2IgMTIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAzX2NmZ19fX2dpbzE1X19fd2lkdGggMworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDNfY2ZnX19fZ2lvMTVfb2VfX19sc2IgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAzX2NmZ19fX2dpbzE1X29lX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDNfY2ZnX19fZ2lvMTVfb2VfX19iaXQgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAzX2NmZ19vZmZzZXQgMTI0CisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19vdXRfZ3JwNF9jZmcsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA0X2NmZ19fX2dpbzE2X19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA0X2NmZ19fX2dpbzE2X19fd2lkdGggMworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDRfY2ZnX19fZ2lvMTZfb2VfX19sc2IgMworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDRfY2ZnX19fZ2lvMTZfb2VfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwNF9jZmdfX19naW8xNl9vZV9fX2JpdCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwNF9jZmdfX19naW8xN19fX2xzYiA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwNF9jZmdfX19naW8xN19fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA0X2NmZ19fX2dpbzE3X29lX19fbHNiIDcKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA0X2NmZ19fX2dpbzE3X29lX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDRfY2ZnX19fZ2lvMTdfb2VfX19iaXQgNworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDRfY2ZnX19fZ2lvMThfX19sc2IgOAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDRfY2ZnX19fZ2lvMThfX193aWR0aCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwNF9jZmdfX19naW8xOF9vZV9fX2xzYiAxMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDRfY2ZnX19fZ2lvMThfb2VfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwNF9jZmdfX19naW8xOF9vZV9fX2JpdCAxMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDRfY2ZnX19fZ2lvMTlfX19sc2IgMTIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA0X2NmZ19fX2dpbzE5X19fd2lkdGggMworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDRfY2ZnX19fZ2lvMTlfb2VfX19sc2IgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA0X2NmZ19fX2dpbzE5X29lX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDRfY2ZnX19fZ2lvMTlfb2VfX19iaXQgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA0X2NmZ19vZmZzZXQgMTI4CisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19vdXRfZ3JwNV9jZmcsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA1X2NmZ19fX2dpbzIwX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA1X2NmZ19fX2dpbzIwX19fd2lkdGggMworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDVfY2ZnX19fZ2lvMjBfb2VfX19sc2IgMworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDVfY2ZnX19fZ2lvMjBfb2VfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwNV9jZmdfX19naW8yMF9vZV9fX2JpdCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwNV9jZmdfX19naW8yMV9fX2xzYiA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwNV9jZmdfX19naW8yMV9fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA1X2NmZ19fX2dpbzIxX29lX19fbHNiIDcKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA1X2NmZ19fX2dpbzIxX29lX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDVfY2ZnX19fZ2lvMjFfb2VfX19iaXQgNworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDVfY2ZnX19fZ2lvMjJfX19sc2IgOAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDVfY2ZnX19fZ2lvMjJfX193aWR0aCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwNV9jZmdfX19naW8yMl9vZV9fX2xzYiAxMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDVfY2ZnX19fZ2lvMjJfb2VfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwNV9jZmdfX19naW8yMl9vZV9fX2JpdCAxMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDVfY2ZnX19fZ2lvMjNfX19sc2IgMTIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA1X2NmZ19fX2dpbzIzX19fd2lkdGggMworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDVfY2ZnX19fZ2lvMjNfb2VfX19sc2IgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA1X2NmZ19fX2dpbzIzX29lX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDVfY2ZnX19fZ2lvMjNfb2VfX19iaXQgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA1X2NmZ19vZmZzZXQgMTMyCisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19vdXRfZ3JwNl9jZmcsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA2X2NmZ19fX2dpbzI0X19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA2X2NmZ19fX2dpbzI0X19fd2lkdGggMworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDZfY2ZnX19fZ2lvMjRfb2VfX19sc2IgMworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDZfY2ZnX19fZ2lvMjRfb2VfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwNl9jZmdfX19naW8yNF9vZV9fX2JpdCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwNl9jZmdfX19naW8yNV9fX2xzYiA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwNl9jZmdfX19naW8yNV9fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA2X2NmZ19fX2dpbzI1X29lX19fbHNiIDcKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA2X2NmZ19fX2dpbzI1X29lX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDZfY2ZnX19fZ2lvMjVfb2VfX19iaXQgNworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDZfY2ZnX19fZ2lvMjZfX19sc2IgOAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDZfY2ZnX19fZ2lvMjZfX193aWR0aCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwNl9jZmdfX19naW8yNl9vZV9fX2xzYiAxMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDZfY2ZnX19fZ2lvMjZfb2VfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwNl9jZmdfX19naW8yNl9vZV9fX2JpdCAxMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDZfY2ZnX19fZ2lvMjdfX19sc2IgMTIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA2X2NmZ19fX2dpbzI3X19fd2lkdGggMworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDZfY2ZnX19fZ2lvMjdfb2VfX19sc2IgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA2X2NmZ19fX2dpbzI3X29lX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDZfY2ZnX19fZ2lvMjdfb2VfX19iaXQgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA2X2NmZ19vZmZzZXQgMTM2CisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19vdXRfZ3JwN19jZmcsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA3X2NmZ19fX2dpbzI4X19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA3X2NmZ19fX2dpbzI4X19fd2lkdGggMworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDdfY2ZnX19fZ2lvMjhfb2VfX19sc2IgMworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDdfY2ZnX19fZ2lvMjhfb2VfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwN19jZmdfX19naW8yOF9vZV9fX2JpdCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwN19jZmdfX19naW8yOV9fX2xzYiA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwN19jZmdfX19naW8yOV9fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA3X2NmZ19fX2dpbzI5X29lX19fbHNiIDcKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA3X2NmZ19fX2dpbzI5X29lX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDdfY2ZnX19fZ2lvMjlfb2VfX19iaXQgNworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDdfY2ZnX19fZ2lvMzBfX19sc2IgOAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDdfY2ZnX19fZ2lvMzBfX193aWR0aCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwN19jZmdfX19naW8zMF9vZV9fX2xzYiAxMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDdfY2ZnX19fZ2lvMzBfb2VfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwN19jZmdfX19naW8zMF9vZV9fX2JpdCAxMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDdfY2ZnX19fZ2lvMzFfX19sc2IgMTIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA3X2NmZ19fX2dpbzMxX19fd2lkdGggMworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDdfY2ZnX19fZ2lvMzFfb2VfX19sc2IgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA3X2NmZ19fX2dpbzMxX29lX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDdfY2ZnX19fZ2lvMzFfb2VfX19iaXQgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA3X2NmZ19vZmZzZXQgMTQwCisKKy8qIFJlZ2lzdGVyIHJ3X3NwdV9jZmcsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfc3B1X2NmZ19fX2J1czBfaW5fX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19zcHVfY2ZnX19fYnVzMF9pbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfc3B1X2NmZ19fX2J1czBfaW5fX19iaXQgMAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19zcHVfY2ZnX19fYnVzMV9pbl9fX2xzYiAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3NwdV9jZmdfX19idXMxX2luX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19zcHVfY2ZnX19fYnVzMV9pbl9fX2JpdCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3NwdV9jZmdfb2Zmc2V0IDE0NAorCisvKiBSZWdpc3RlciByd190aW1lcl9ncnAwX2NmZywgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190aW1lcl9ncnAwX2NmZ19fX2V4dF9jbGtfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190aW1lcl9ncnAwX2NmZ19fX2V4dF9jbGtfX193aWR0aCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDBfY2ZnX19fdG1yMF9lbl9fX2xzYiAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDBfY2ZnX19fdG1yMF9lbl9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdGltZXJfZ3JwMF9jZmdfX190bXIxX2VuX19fbHNiIDUKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdGltZXJfZ3JwMF9jZmdfX190bXIxX2VuX19fd2lkdGggMgorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190aW1lcl9ncnAwX2NmZ19fX3RtcjJfZW5fX19sc2IgNworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190aW1lcl9ncnAwX2NmZ19fX3RtcjJfZW5fX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDBfY2ZnX19fdG1yM19lbl9fX2xzYiA5CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDBfY2ZnX19fdG1yM19lbl9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdGltZXJfZ3JwMF9jZmdfX190bXIwX2Rpc19fX2xzYiAxMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190aW1lcl9ncnAwX2NmZ19fX3RtcjBfZGlzX19fd2lkdGggMgorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190aW1lcl9ncnAwX2NmZ19fX3RtcjFfZGlzX19fbHNiIDEzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDBfY2ZnX19fdG1yMV9kaXNfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDBfY2ZnX19fdG1yMl9kaXNfX19sc2IgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdGltZXJfZ3JwMF9jZmdfX190bXIyX2Rpc19fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdGltZXJfZ3JwMF9jZmdfX190bXIzX2Rpc19fX2xzYiAxNworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190aW1lcl9ncnAwX2NmZ19fX3RtcjNfZGlzX19fd2lkdGggMgorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190aW1lcl9ncnAwX2NmZ19vZmZzZXQgMTQ4CisKKy8qIFJlZ2lzdGVyIHJ3X3RpbWVyX2dycDFfY2ZnLCBzY29wZSBpb3Bfc3dfY2ZnLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDFfY2ZnX19fZXh0X2Nsa19fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDFfY2ZnX19fZXh0X2Nsa19fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdGltZXJfZ3JwMV9jZmdfX190bXIwX2VuX19fbHNiIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdGltZXJfZ3JwMV9jZmdfX190bXIwX2VuX19fd2lkdGggMgorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190aW1lcl9ncnAxX2NmZ19fX3RtcjFfZW5fX19sc2IgNQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190aW1lcl9ncnAxX2NmZ19fX3RtcjFfZW5fX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDFfY2ZnX19fdG1yMl9lbl9fX2xzYiA3CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDFfY2ZnX19fdG1yMl9lbl9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdGltZXJfZ3JwMV9jZmdfX190bXIzX2VuX19fbHNiIDkKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdGltZXJfZ3JwMV9jZmdfX190bXIzX2VuX19fd2lkdGggMgorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190aW1lcl9ncnAxX2NmZ19fX3RtcjBfZGlzX19fbHNiIDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDFfY2ZnX19fdG1yMF9kaXNfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDFfY2ZnX19fdG1yMV9kaXNfX19sc2IgMTMKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdGltZXJfZ3JwMV9jZmdfX190bXIxX2Rpc19fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdGltZXJfZ3JwMV9jZmdfX190bXIyX2Rpc19fX2xzYiAxNQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190aW1lcl9ncnAxX2NmZ19fX3RtcjJfZGlzX19fd2lkdGggMgorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190aW1lcl9ncnAxX2NmZ19fX3RtcjNfZGlzX19fbHNiIDE3CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDFfY2ZnX19fdG1yM19kaXNfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDFfY2ZnX29mZnNldCAxNTIKKworLyogUmVnaXN0ZXIgcndfdHJpZ2dlcl9ncnBzX2NmZywgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycHNfY2ZnX19fZ3JwMF9kaXNfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycHNfY2ZnX19fZ3JwMF9kaXNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3Jwc19jZmdfX19ncnAwX2Rpc19fX2JpdCAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3Jwc19jZmdfX19ncnAwX2VuX19fbHNiIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnBzX2NmZ19fX2dycDBfZW5fX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3Jwc19jZmdfX19ncnAwX2VuX19fYml0IDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnBzX2NmZ19fX2dycDFfZGlzX19fbHNiIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnBzX2NmZ19fX2dycDFfZGlzX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycHNfY2ZnX19fZ3JwMV9kaXNfX19iaXQgMgorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycHNfY2ZnX19fZ3JwMV9lbl9fX2xzYiAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3Jwc19jZmdfX19ncnAxX2VuX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycHNfY2ZnX19fZ3JwMV9lbl9fX2JpdCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3Jwc19jZmdfX19ncnAyX2Rpc19fX2xzYiA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3Jwc19jZmdfX19ncnAyX2Rpc19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnBzX2NmZ19fX2dycDJfZGlzX19fYml0IDQKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnBzX2NmZ19fX2dycDJfZW5fX19sc2IgNQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycHNfY2ZnX19fZ3JwMl9lbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnBzX2NmZ19fX2dycDJfZW5fX19iaXQgNQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycHNfY2ZnX19fZ3JwM19kaXNfX19sc2IgNgorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycHNfY2ZnX19fZ3JwM19kaXNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3Jwc19jZmdfX19ncnAzX2Rpc19fX2JpdCA2CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3Jwc19jZmdfX19ncnAzX2VuX19fbHNiIDcKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnBzX2NmZ19fX2dycDNfZW5fX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3Jwc19jZmdfX19ncnAzX2VuX19fYml0IDcKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnBzX2NmZ19fX2dycDRfZGlzX19fbHNiIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnBzX2NmZ19fX2dycDRfZGlzX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycHNfY2ZnX19fZ3JwNF9kaXNfX19iaXQgOAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycHNfY2ZnX19fZ3JwNF9lbl9fX2xzYiA5CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3Jwc19jZmdfX19ncnA0X2VuX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycHNfY2ZnX19fZ3JwNF9lbl9fX2JpdCA5CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3Jwc19jZmdfX19ncnA1X2Rpc19fX2xzYiAxMAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycHNfY2ZnX19fZ3JwNV9kaXNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3Jwc19jZmdfX19ncnA1X2Rpc19fX2JpdCAxMAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycHNfY2ZnX19fZ3JwNV9lbl9fX2xzYiAxMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycHNfY2ZnX19fZ3JwNV9lbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnBzX2NmZ19fX2dycDVfZW5fX19iaXQgMTEKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnBzX2NmZ19fX2dycDZfZGlzX19fbHNiIDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3Jwc19jZmdfX19ncnA2X2Rpc19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnBzX2NmZ19fX2dycDZfZGlzX19fYml0IDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3Jwc19jZmdfX19ncnA2X2VuX19fbHNiIDEzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3Jwc19jZmdfX19ncnA2X2VuX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycHNfY2ZnX19fZ3JwNl9lbl9fX2JpdCAxMworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycHNfY2ZnX19fZ3JwN19kaXNfX19sc2IgMTQKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnBzX2NmZ19fX2dycDdfZGlzX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycHNfY2ZnX19fZ3JwN19kaXNfX19iaXQgMTQKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnBzX2NmZ19fX2dycDdfZW5fX19sc2IgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnBzX2NmZ19fX2dycDdfZW5fX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3Jwc19jZmdfX19ncnA3X2VuX19fYml0IDE1CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3Jwc19jZmdfb2Zmc2V0IDE1NgorCisvKiBSZWdpc3RlciByd19wZHBfY2ZnLCBzY29wZSBpb3Bfc3dfY2ZnLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3BkcF9jZmdfX19vdXRfc3RyYl9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3BkcF9jZmdfX19vdXRfc3RyYl9fX3dpZHRoIDQKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfcGRwX2NmZ19fX2luX3NyY19fX2xzYiA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3BkcF9jZmdfX19pbl9zcmNfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3BkcF9jZmdfX19pbl9zaXplX19fbHNiIDYKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfcGRwX2NmZ19fX2luX3NpemVfX193aWR0aCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3BkcF9jZmdfX19pbl9sYXN0X19fbHNiIDkKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfcGRwX2NmZ19fX2luX2xhc3RfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3BkcF9jZmdfX19pbl9zdHJiX19fbHNiIDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3BkcF9jZmdfX19pbl9zdHJiX19fd2lkdGggNAorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19wZHBfY2ZnX29mZnNldCAxNjAKKworLyogUmVnaXN0ZXIgcndfc2RwX2NmZywgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19zZHBfY2ZnX19fc2RwX291dF9zdHJiX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfc2RwX2NmZ19fX3NkcF9vdXRfc3RyYl9fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfc2RwX2NmZ19fX3NkcF9pbl9kYXRhX19fbHNiIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfc2RwX2NmZ19fX3NkcF9pbl9kYXRhX19fd2lkdGggMworI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19zZHBfY2ZnX19fc2RwX2luX2xhc3RfX19sc2IgNgorI2RlZmluZSByZWdfaW9wX3N3X2NmZ19yd19zZHBfY2ZnX19fc2RwX2luX2xhc3RfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3NkcF9jZmdfX19zZHBfaW5fc3RyYl9fX2xzYiA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfY2ZnX3J3X3NkcF9jZmdfX19zZHBfaW5fc3RyYl9fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19jZmdfcndfc2RwX2NmZ19vZmZzZXQgMTY0CisKKworLyogQ29uc3RhbnRzICovCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19hICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX2IgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfYnVzICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19idXNfcm90MTYgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX2J1c19yb3QyNCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSByZWdrX2lvcF9zd19jZmdfYnVzX3JvdDggICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19jbGsxMiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX2NwdSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfZ2F0ZWRfY2xrMCAgICAgICAgICAgICAgICAweDAwMDAwMDBlCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19nYXRlZF9jbGsxICAgICAgICAgICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX2dpbzAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfZ2lvMSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19naW8yICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX2dpbzMgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfZ2lvNCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2CisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19naW81ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX2dpbzYgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSByZWdrX2lvcF9zd19jZmdfZ2lvNyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19naW9faW4xOCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX2dpb19pbjE5ICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSByZWdrX2lvcF9zd19jZmdfZ2lvX2luMjAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19naW9faW4yMSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX2dpb19pbjI2ICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfZ2lvX2luMjcgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19naW9faW40ICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX2dpb19pbjUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfbGFzdF90aW1lcl9ncnAwX3RtcjIgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19sYXN0X3RpbWVyX2dycDFfdG1yMiAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX2xhc3RfdGltZXJfZ3JwMV90bXIzICAgICAgMHgwMDAwMDAwMworI2RlZmluZSByZWdrX2lvcF9zd19jZmdfbXB1ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19ub25lICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3BkcF9vdXQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfcGRwX291dF9oaSAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19wZHBfb3V0X2xvICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3J3X2J1c19tYXNrX2RlZmF1bHQgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfcndfYnVzX29lX21hc2tfZGVmYXVsdCAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19yd19idXNfb3V0X2NmZ19kZWZhdWx0ICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3J3X2NyY19wYXJfb3duZXJfZGVmYXVsdCAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfcndfZG1jX2luX293bmVyX2RlZmF1bHQgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19yd19kbWNfb3V0X293bmVyX2RlZmF1bHQgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3J3X2ZpZm9faW5fZXh0cmFfb3duZXJfZGVmYXVsdCAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfcndfZmlmb19pbl9vd25lcl9kZWZhdWx0ICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19yd19maWZvX291dF9leHRyYV9vd25lcl9kZWZhdWx0ICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19yd19maWZvX291dF9vd25lcl9kZWZhdWx0ICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19yd19naW9fbWFza19kZWZhdWx0ICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3J3X2dpb19vZV9tYXNrX2RlZmF1bHQgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAwX2NmZ19kZWZhdWx0ICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDFfY2ZnX2RlZmF1bHQgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMl9jZmdfZGVmYXVsdCAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAzX2NmZ19kZWZhdWx0ICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDRfY2ZnX2RlZmF1bHQgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwNV9jZmdfZGVmYXVsdCAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA2X2NmZ19kZWZhdWx0ICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDdfY2ZnX2RlZmF1bHQgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3J3X3BkcF9jZmdfZGVmYXVsdCAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfcndfcGlubWFwcGluZ19kZWZhdWx0ICAgICAweDAwNTU1NTU1CisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19yd19zYXBfaW5fb3duZXJfZGVmYXVsdCAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3J3X3NhcF9vdXRfb3duZXJfZGVmYXVsdCAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfcndfc2NyY19pbl9vd25lcl9kZWZhdWx0ICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19yd19zY3JjX291dF9vd25lcl9kZWZhdWx0ICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19yd19zZHBfY2ZnX2RlZmF1bHQgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3J3X3NwdV9jZmdfZGVmYXVsdCAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfcndfc3B1X293bmVyX2RlZmF1bHQgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19yd190aW1lcl9ncnAwX2NmZ19kZWZhdWx0ICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19yd190aW1lcl9ncnAwX293bmVyX2RlZmF1bHQgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDFfY2ZnX2RlZmF1bHQgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDFfb3duZXJfZGVmYXVsdCAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnAwX293bmVyX2RlZmF1bHQgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3JwMV9vd25lcl9kZWZhdWx0ICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycDJfb3duZXJfZGVmYXVsdCAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnAzX293bmVyX2RlZmF1bHQgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3JwNF9vd25lcl9kZWZhdWx0ICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycDVfb3duZXJfZGVmYXVsdCAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnA2X293bmVyX2RlZmF1bHQgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3JwN19vd25lcl9kZWZhdWx0ICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycHNfY2ZnX2RlZmF1bHQgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3NkcF9vdXQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfc2l6ZTE2ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19zaXplMjQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3NpemUzMiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfc2l6ZTggICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19zcHUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3NwdV9idXNfb3V0MF9oaSAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfc3B1X2J1c19vdXQwX2xvICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19zcHVfYnVzX291dDFfaGkgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3NwdV9idXNfb3V0MV9sbyAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSByZWdrX2lvcF9zd19jZmdfc3B1X2cwICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZzEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3NwdV9nMiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSByZWdrX2lvcF9zd19jZmdfc3B1X2czICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZzQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3NwdV9nNSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSByZWdrX2lvcF9zd19jZmdfc3B1X2c2ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZzcgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW8wICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfc3B1X2dpbzEgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvNSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW82ICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfc3B1X2dpbzcgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvX291dDAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9fb3V0MSAgICAgICAgICAgICAgMHgwMDAwMDAwOQorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfc3B1X2dpb19vdXQyICAgICAgICAgICAgICAweDAwMDAwMDBhCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvX291dDMgICAgICAgICAgICAgIDB4MDAwMDAwMGIKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9fb3V0NCAgICAgICAgICAgICAgMHgwMDAwMDAwYworI2RlZmluZSByZWdrX2lvcF9zd19jZmdfc3B1X2dpb19vdXQ1ICAgICAgICAgICAgICAweDAwMDAwMDBkCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvX291dDYgICAgICAgICAgICAgIDB4MDAwMDAwMGUKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9fb3V0NyAgICAgICAgICAgICAgMHgwMDAwMDAwZgorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfc3B1X2dpb291dDAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvb3V0MSAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9vdXQxMCAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSByZWdrX2lvcF9zd19jZmdfc3B1X2dpb291dDExICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvb3V0MTIgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9vdXQxMyAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSByZWdrX2lvcF9zd19jZmdfc3B1X2dpb291dDE0ICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvb3V0MTUgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9vdXQxNiAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSByZWdrX2lvcF9zd19jZmdfc3B1X2dpb291dDE3ICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvb3V0MTggICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9vdXQxOSAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSByZWdrX2lvcF9zd19jZmdfc3B1X2dpb291dDIgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvb3V0MjAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9vdXQyMSAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSByZWdrX2lvcF9zd19jZmdfc3B1X2dpb291dDIyICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvb3V0MjMgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9vdXQyNCAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSByZWdrX2lvcF9zd19jZmdfc3B1X2dpb291dDI1ICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvb3V0MjYgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9vdXQyNyAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSByZWdrX2lvcF9zd19jZmdfc3B1X2dpb291dDI4ICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvb3V0MjkgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9vdXQzICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfc3B1X2dpb291dDMwICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvb3V0MzEgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9vdXQ0ICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfc3B1X2dpb291dDUgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvb3V0NiAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9vdXQ3ICAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSByZWdrX2lvcF9zd19jZmdfc3B1X2dpb291dDggICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvb3V0OSAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3N0cmJfdGltZXJfZ3JwMF90bXIwICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfc3RyYl90aW1lcl9ncnAwX3RtcjEgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ19zdHJiX3RpbWVyX2dycDFfdG1yMCAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3N0cmJfdGltZXJfZ3JwMV90bXIxICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfdGltZXJfZ3JwMCAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ190aW1lcl9ncnAwX3JvdCAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3RpbWVyX2dycDBfc3RyYjAgICAgICAgICAgMHgwMDAwMDAwNQorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfdGltZXJfZ3JwMF9zdHJiMSAgICAgICAgICAweDAwMDAwMDA1CisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ190aW1lcl9ncnAwX3N0cmIyICAgICAgICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3RpbWVyX2dycDBfc3RyYjMgICAgICAgICAgMHgwMDAwMDAwNQorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfdGltZXJfZ3JwMF90bXIwICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ190aW1lcl9ncnAxICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3RpbWVyX2dycDFfcm90ICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfdGltZXJfZ3JwMV9zdHJiMCAgICAgICAgICAweDAwMDAwMDA2CisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ190aW1lcl9ncnAxX3N0cmIxICAgICAgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3RpbWVyX2dycDFfc3RyYjIgICAgICAgICAgMHgwMDAwMDAwNgorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfdGltZXJfZ3JwMV9zdHJiMyAgICAgICAgICAweDAwMDAwMDA2CisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ190aW1lcl9ncnAxX3RtcjAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3RyaWcwXzAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfdHJpZzBfMSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ190cmlnMF8yICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3RyaWcwXzMgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfdHJpZzFfMCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ190cmlnMV8xICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3RyaWcxXzIgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfdHJpZzFfMyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ190cmlnMl8wICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3RyaWcyXzEgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfdHJpZzJfMiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ190cmlnMl8zICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3RyaWczXzAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfdHJpZzNfMSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ190cmlnM18yICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3RyaWczXzMgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfdHJpZzRfMCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ190cmlnNF8xICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3RyaWc0XzIgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfdHJpZzRfMyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ190cmlnNV8wICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3RyaWc1XzEgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX2lvcF9zd19jZmdfdHJpZzVfMiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ190cmlnNV8zICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3RyaWc2XzAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSByZWdrX2lvcF9zd19jZmdfdHJpZzZfMSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ190cmlnNl8yICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3RyaWc2XzMgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSByZWdrX2lvcF9zd19jZmdfdHJpZzdfMCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NmZ190cmlnN18xICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgcmVna19pb3Bfc3dfY2ZnX3RyaWc3XzIgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSByZWdrX2lvcF9zd19jZmdfdHJpZzdfMyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZW5kaWYgLyogX19pb3Bfc3dfY2ZnX2RlZnNfYXNtX2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvaW9wL2FzbS9pb3Bfc3dfY3B1X2RlZnNfYXNtLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2lvcC9hc20vaW9wX3N3X2NwdV9kZWZzX2FzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNGZlMWIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2lvcC9hc20vaW9wX3N3X2NwdV9kZWZzX2FzbS5oCkBAIC0wLDAgKzEsOTUwIEBACisjaWZuZGVmIF9faW9wX3N3X2NwdV9kZWZzX2FzbV9oCisjZGVmaW5lIF9faW9wX3N3X2NwdV9kZWZzX2FzbV9oCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCisgKiAgIGZpbGU6ICAgICAgICAgICBpb3Bfc3dfY3B1LnIKKyAqIAorICogICBieSAuLi8uLi8uLi90b29scy9yZGVzYy9iaW4vcmRlczJjIC1hc20gLW91dGZpbGUgaW9wX3N3X2NwdV9kZWZzX2FzbS5oIGlvcF9zd19jcHUucgorICogQW55IGNoYW5nZXMgaGVyZSB3aWxsIGJlIGxvc3QuCisgKgorICogLSotIGJ1ZmZlci1yZWFkLW9ubHk6IHQgLSotCisgKi8KKworI2lmbmRlZiBSRUdfRklFTEQKKyNkZWZpbmUgUkVHX0ZJRUxEKCBzY29wZSwgcmVnLCBmaWVsZCwgdmFsdWUgKSBcCisgIFJFR19GSUVMRF9YXyggdmFsdWUsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19fXyMjZmllbGQjI19fX2xzYiApCisjZGVmaW5lIFJFR19GSUVMRF9YXyggdmFsdWUsIHNoaWZ0ICkgKCh2YWx1ZSkgPDwgc2hpZnQpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfU1RBVEUKKyNkZWZpbmUgUkVHX1NUQVRFKCBzY29wZSwgcmVnLCBmaWVsZCwgc3ltYm9saWNfdmFsdWUgKSBcCisgIFJFR19TVEFURV9YXyggcmVna18jI3Njb3BlIyNfIyNzeW1ib2xpY192YWx1ZSwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX1NUQVRFX1hfKCBrLCBzaGlmdCApIChrIDw8IHNoaWZ0KQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX01BU0sKKyNkZWZpbmUgUkVHX01BU0soIHNjb3BlLCByZWcsIGZpZWxkICkgXAorICBSRUdfTUFTS19YXyggcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fd2lkdGgsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19fXyMjZmllbGQjI19fX2xzYiApCisjZGVmaW5lIFJFR19NQVNLX1hfKCB3aWR0aCwgbHNiICkgKCgoMSA8PCB3aWR0aCktMSkgPDwgbHNiKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0xTQgorI2RlZmluZSBSRUdfTFNCKCBzY29wZSwgcmVnLCBmaWVsZCApIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19fXyMjZmllbGQjI19fX2xzYgorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0JJVAorI2RlZmluZSBSRUdfQklUKCBzY29wZSwgcmVnLCBmaWVsZCApIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19fXyMjZmllbGQjI19fX2JpdAorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFIKKyNkZWZpbmUgUkVHX0FERFIoIHNjb3BlLCBpbnN0LCByZWcgKSBSRUdfQUREUl9YXyhpbnN0LCByZWdfIyNzY29wZSMjXyMjcmVnIyNfb2Zmc2V0KQorI2RlZmluZSBSRUdfQUREUl9YXyggaW5zdCwgb2ZmcyApICgoaW5zdCkgKyBvZmZzKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFJfVkVDVAorI2RlZmluZSBSRUdfQUREUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgICAgICAgIFJFR19BRERSX1ZFQ1RfWF8oaW5zdCwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX29mZnNldCwgaW5kZXgsIFwKKwkJCSBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNkZWZpbmUgUkVHX0FERFJfVkVDVF9YXyggaW5zdCwgb2ZmcywgaW5kZXgsIHN0cmlkZSApIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnN0KSArIG9mZnMgKyAoaW5kZXgpICogc3RyaWRlKQorI2VuZGlmCisKKy8qIFJlZ2lzdGVyIHJfbXB1X3RyYWNlLCBzY29wZSBpb3Bfc3dfY3B1LCB0eXBlIHIgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tcHVfdHJhY2Vfb2Zmc2V0IDAKKworLyogUmVnaXN0ZXIgcl9zcHVfdHJhY2UsIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgciAqLworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX3NwdV90cmFjZV9vZmZzZXQgNAorCisvKiBSZWdpc3RlciByX3NwdV9mc21fdHJhY2UsIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgciAqLworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX3NwdV9mc21fdHJhY2Vfb2Zmc2V0IDgKKworLyogUmVnaXN0ZXIgcndfbWNfY3RybCwgc2NvcGUgaW9wX3N3X2NwdSwgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19tY19jdHJsX19fa2VlcF9vd25lcl9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X21jX2N0cmxfX19rZWVwX293bmVyX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19tY19jdHJsX19fa2VlcF9vd25lcl9fX2JpdCAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X21jX2N0cmxfX19jbWRfX19sc2IgMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19tY19jdHJsX19fY21kX19fd2lkdGggMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19tY19jdHJsX19fc2l6ZV9fX2xzYiAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X21jX2N0cmxfX19zaXplX19fd2lkdGggMworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19tY19jdHJsX19fd3Jfc3B1X21lbV9fX2xzYiA2CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X21jX2N0cmxfX193cl9zcHVfbWVtX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19tY19jdHJsX19fd3Jfc3B1X21lbV9fX2JpdCA2CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X21jX2N0cmxfb2Zmc2V0IDEyCisKKy8qIFJlZ2lzdGVyIHJ3X21jX2RhdGEsIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfbWNfZGF0YV9fX3ZhbF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X21jX2RhdGFfX192YWxfX193aWR0aCAzMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19tY19kYXRhX29mZnNldCAxNgorCisvKiBSZWdpc3RlciByd19tY19hZGRyLCBzY29wZSBpb3Bfc3dfY3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X21jX2FkZHJfb2Zmc2V0IDIwCisKKy8qIFJlZ2lzdGVyIHJzX21jX2RhdGEsIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgcnMgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcnNfbWNfZGF0YV9vZmZzZXQgMjQKKworLyogUmVnaXN0ZXIgcl9tY19kYXRhLCBzY29wZSBpb3Bfc3dfY3B1LCB0eXBlIHIgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tY19kYXRhX29mZnNldCAyOAorCisvKiBSZWdpc3RlciByX21jX3N0YXQsIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgciAqLworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21jX3N0YXRfX19idXN5X2NwdV9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWNfc3RhdF9fX2J1c3lfY3B1X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21jX3N0YXRfX19idXN5X2NwdV9fX2JpdCAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWNfc3RhdF9fX2J1c3lfbXB1X19fbHNiIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tY19zdGF0X19fYnVzeV9tcHVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWNfc3RhdF9fX2J1c3lfbXB1X19fYml0IDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tY19zdGF0X19fYnVzeV9zcHVfX19sc2IgMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21jX3N0YXRfX19idXN5X3NwdV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tY19zdGF0X19fYnVzeV9zcHVfX19iaXQgMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21jX3N0YXRfX19vd25lZF9ieV9jcHVfX19sc2IgMworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21jX3N0YXRfX19vd25lZF9ieV9jcHVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWNfc3RhdF9fX293bmVkX2J5X2NwdV9fX2JpdCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWNfc3RhdF9fX293bmVkX2J5X21wdV9fX2xzYiA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWNfc3RhdF9fX293bmVkX2J5X21wdV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tY19zdGF0X19fb3duZWRfYnlfbXB1X19fYml0IDQKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tY19zdGF0X19fb3duZWRfYnlfc3B1X19fbHNiIDUKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tY19zdGF0X19fb3duZWRfYnlfc3B1X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21jX3N0YXRfX19vd25lZF9ieV9zcHVfX19iaXQgNQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21jX3N0YXRfb2Zmc2V0IDMyCisKKy8qIFJlZ2lzdGVyIHJ3X2J1c19jbHJfbWFzaywgc2NvcGUgaW9wX3N3X2NwdSwgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19idXNfY2xyX21hc2tfX19ieXRlMF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2J1c19jbHJfbWFza19fX2J5dGUwX19fd2lkdGggOAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19idXNfY2xyX21hc2tfX19ieXRlMV9fX2xzYiA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2J1c19jbHJfbWFza19fX2J5dGUxX19fd2lkdGggOAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19idXNfY2xyX21hc2tfX19ieXRlMl9fX2xzYiAxNgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19idXNfY2xyX21hc2tfX19ieXRlMl9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYnVzX2Nscl9tYXNrX19fYnl0ZTNfX19sc2IgMjQKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYnVzX2Nscl9tYXNrX19fYnl0ZTNfX193aWR0aCA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2J1c19jbHJfbWFza19vZmZzZXQgMzYKKworLyogUmVnaXN0ZXIgcndfYnVzX3NldF9tYXNrLCBzY29wZSBpb3Bfc3dfY3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2J1c19zZXRfbWFza19fX2J5dGUwX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYnVzX3NldF9tYXNrX19fYnl0ZTBfX193aWR0aCA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2J1c19zZXRfbWFza19fX2J5dGUxX19fbHNiIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYnVzX3NldF9tYXNrX19fYnl0ZTFfX193aWR0aCA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2J1c19zZXRfbWFza19fX2J5dGUyX19fbHNiIDE2CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2J1c19zZXRfbWFza19fX2J5dGUyX19fd2lkdGggOAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19idXNfc2V0X21hc2tfX19ieXRlM19fX2xzYiAyNAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19idXNfc2V0X21hc2tfX19ieXRlM19fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYnVzX3NldF9tYXNrX29mZnNldCA0MAorCisvKiBSZWdpc3RlciByd19idXNfb2VfY2xyX21hc2ssIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYnVzX29lX2Nscl9tYXNrX19fYnl0ZTBfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19idXNfb2VfY2xyX21hc2tfX19ieXRlMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYnVzX29lX2Nscl9tYXNrX19fYnl0ZTBfX19iaXQgMAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19idXNfb2VfY2xyX21hc2tfX19ieXRlMV9fX2xzYiAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2J1c19vZV9jbHJfbWFza19fX2J5dGUxX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19idXNfb2VfY2xyX21hc2tfX19ieXRlMV9fX2JpdCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2J1c19vZV9jbHJfbWFza19fX2J5dGUyX19fbHNiIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYnVzX29lX2Nscl9tYXNrX19fYnl0ZTJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2J1c19vZV9jbHJfbWFza19fX2J5dGUyX19fYml0IDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYnVzX29lX2Nscl9tYXNrX19fYnl0ZTNfX19sc2IgMworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19idXNfb2VfY2xyX21hc2tfX19ieXRlM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYnVzX29lX2Nscl9tYXNrX19fYnl0ZTNfX19iaXQgMworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19idXNfb2VfY2xyX21hc2tfb2Zmc2V0IDQ0CisKKy8qIFJlZ2lzdGVyIHJ3X2J1c19vZV9zZXRfbWFzaywgc2NvcGUgaW9wX3N3X2NwdSwgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19idXNfb2Vfc2V0X21hc2tfX19ieXRlMF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2J1c19vZV9zZXRfbWFza19fX2J5dGUwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19idXNfb2Vfc2V0X21hc2tfX19ieXRlMF9fX2JpdCAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2J1c19vZV9zZXRfbWFza19fX2J5dGUxX19fbHNiIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYnVzX29lX3NldF9tYXNrX19fYnl0ZTFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2J1c19vZV9zZXRfbWFza19fX2J5dGUxX19fYml0IDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYnVzX29lX3NldF9tYXNrX19fYnl0ZTJfX19sc2IgMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19idXNfb2Vfc2V0X21hc2tfX19ieXRlMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYnVzX29lX3NldF9tYXNrX19fYnl0ZTJfX19iaXQgMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19idXNfb2Vfc2V0X21hc2tfX19ieXRlM19fX2xzYiAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2J1c19vZV9zZXRfbWFza19fX2J5dGUzX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19idXNfb2Vfc2V0X21hc2tfX19ieXRlM19fX2JpdCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2J1c19vZV9zZXRfbWFza19vZmZzZXQgNDgKKworLyogUmVnaXN0ZXIgcl9idXNfaW4sIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgciAqLworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2J1c19pbl9vZmZzZXQgNTIKKworLyogUmVnaXN0ZXIgcndfZ2lvX2Nscl9tYXNrLCBzY29wZSBpb3Bfc3dfY3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2dpb19jbHJfbWFza19fX3ZhbF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2dpb19jbHJfbWFza19fX3ZhbF9fX3dpZHRoIDMyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2dpb19jbHJfbWFza19vZmZzZXQgNTYKKworLyogUmVnaXN0ZXIgcndfZ2lvX3NldF9tYXNrLCBzY29wZSBpb3Bfc3dfY3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2dpb19zZXRfbWFza19fX3ZhbF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2dpb19zZXRfbWFza19fX3ZhbF9fX3dpZHRoIDMyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2dpb19zZXRfbWFza19vZmZzZXQgNjAKKworLyogUmVnaXN0ZXIgcndfZ2lvX29lX2Nscl9tYXNrLCBzY29wZSBpb3Bfc3dfY3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2dpb19vZV9jbHJfbWFza19fX3ZhbF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2dpb19vZV9jbHJfbWFza19fX3ZhbF9fX3dpZHRoIDMyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2dpb19vZV9jbHJfbWFza19vZmZzZXQgNjQKKworLyogUmVnaXN0ZXIgcndfZ2lvX29lX3NldF9tYXNrLCBzY29wZSBpb3Bfc3dfY3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2dpb19vZV9zZXRfbWFza19fX3ZhbF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2dpb19vZV9zZXRfbWFza19fX3ZhbF9fX3dpZHRoIDMyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2dpb19vZV9zZXRfbWFza19vZmZzZXQgNjgKKworLyogUmVnaXN0ZXIgcl9naW9faW4sIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgciAqLworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2dpb19pbl9vZmZzZXQgNzIKKworLyogUmVnaXN0ZXIgcndfaW50cjBfbWFzaywgc2NvcGUgaW9wX3N3X2NwdSwgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fbXB1XzBfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fbXB1XzBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19tcHVfMF9fX2JpdCAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19tcHVfMV9fX2xzYiAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19tcHVfMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX21wdV8xX19fYml0IDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX21wdV8yX19fbHNiIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX21wdV8yX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fbXB1XzJfX19iaXQgMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fbXB1XzNfX19sc2IgMworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fbXB1XzNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19tcHVfM19fX2JpdCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19tcHVfNF9fX2xzYiA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19tcHVfNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX21wdV80X19fYml0IDQKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX21wdV81X19fbHNiIDUKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX21wdV81X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fbXB1XzVfX19iaXQgNQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fbXB1XzZfX19sc2IgNgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fbXB1XzZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19tcHVfNl9fX2JpdCA2CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19tcHVfN19fX2xzYiA3CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19tcHVfN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX21wdV83X19fYml0IDcKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX21wdV84X19fbHNiIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX21wdV84X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fbXB1XzhfX19iaXQgOAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fbXB1XzlfX19sc2IgOQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fbXB1XzlfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19tcHVfOV9fX2JpdCA5CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19tcHVfMTBfX19sc2IgMTAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX21wdV8xMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX21wdV8xMF9fX2JpdCAxMAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fbXB1XzExX19fbHNiIDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19tcHVfMTFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19tcHVfMTFfX19iaXQgMTEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX21wdV8xMl9fX2xzYiAxMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fbXB1XzEyX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fbXB1XzEyX19fYml0IDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19tcHVfMTNfX19sc2IgMTMKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX21wdV8xM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX21wdV8xM19fX2JpdCAxMworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fbXB1XzE0X19fbHNiIDE0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19tcHVfMTRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19tcHVfMTRfX19iaXQgMTQKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX21wdV8xNV9fX2xzYiAxNQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fbXB1XzE1X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fbXB1XzE1X19fYml0IDE1CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19zcHVfMF9fX2xzYiAxNgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fc3B1XzBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19zcHVfMF9fX2JpdCAxNgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fc3B1XzFfX19sc2IgMTcKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX3NwdV8xX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fc3B1XzFfX19iaXQgMTcKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX3NwdV8yX19fbHNiIDE4CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19zcHVfMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX3NwdV8yX19fYml0IDE4CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19zcHVfM19fX2xzYiAxOQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fc3B1XzNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19zcHVfM19fX2JpdCAxOQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fc3B1XzRfX19sc2IgMjAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX3NwdV80X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fc3B1XzRfX19iaXQgMjAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX3NwdV81X19fbHNiIDIxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19zcHVfNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX3NwdV81X19fYml0IDIxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19zcHVfNl9fX2xzYiAyMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fc3B1XzZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19zcHVfNl9fX2JpdCAyMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fc3B1XzdfX19sc2IgMjMKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX3NwdV83X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fc3B1XzdfX19iaXQgMjMKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX3NwdV84X19fbHNiIDI0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19zcHVfOF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX3NwdV84X19fYml0IDI0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19zcHVfOV9fX2xzYiAyNQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fc3B1XzlfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19zcHVfOV9fX2JpdCAyNQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fc3B1XzEwX19fbHNiIDI2CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19zcHVfMTBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19zcHVfMTBfX19iaXQgMjYKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX3NwdV8xMV9fX2xzYiAyNworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fc3B1XzExX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fc3B1XzExX19fYml0IDI3CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19zcHVfMTJfX19sc2IgMjgKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX3NwdV8xMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX3NwdV8xMl9fX2JpdCAyOAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fc3B1XzEzX19fbHNiIDI5CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19zcHVfMTNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19zcHVfMTNfX19iaXQgMjkKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX3NwdV8xNF9fX2xzYiAzMAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fc3B1XzE0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX19fc3B1XzE0X19fYml0IDMwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfX19zcHVfMTVfX19sc2IgMzEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX3NwdV8xNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19fX3NwdV8xNV9fX2JpdCAzMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrX29mZnNldCA3NgorCisvKiBSZWdpc3RlciByd19hY2tfaW50cjAsIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fbXB1XzBfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19tcHVfMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fbXB1XzBfX19iaXQgMAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19tcHVfMV9fX2xzYiAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX21wdV8xX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19tcHVfMV9fX2JpdCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX21wdV8yX19fbHNiIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fbXB1XzJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX21wdV8yX19fYml0IDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fbXB1XzNfX19sc2IgMworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19tcHVfM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fbXB1XzNfX19iaXQgMworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19tcHVfNF9fX2xzYiA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX21wdV80X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19tcHVfNF9fX2JpdCA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX21wdV81X19fbHNiIDUKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fbXB1XzVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX21wdV81X19fYml0IDUKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fbXB1XzZfX19sc2IgNgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19tcHVfNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fbXB1XzZfX19iaXQgNgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19tcHVfN19fX2xzYiA3CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX21wdV83X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19tcHVfN19fX2JpdCA3CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX21wdV84X19fbHNiIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fbXB1XzhfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX21wdV84X19fYml0IDgKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fbXB1XzlfX19sc2IgOQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19tcHVfOV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fbXB1XzlfX19iaXQgOQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19tcHVfMTBfX19sc2IgMTAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fbXB1XzEwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19tcHVfMTBfX19iaXQgMTAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fbXB1XzExX19fbHNiIDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX21wdV8xMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fbXB1XzExX19fYml0IDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX21wdV8xMl9fX2xzYiAxMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19tcHVfMTJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX21wdV8xMl9fX2JpdCAxMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19tcHVfMTNfX19sc2IgMTMKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fbXB1XzEzX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19tcHVfMTNfX19iaXQgMTMKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fbXB1XzE0X19fbHNiIDE0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX21wdV8xNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fbXB1XzE0X19fYml0IDE0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX21wdV8xNV9fX2xzYiAxNQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19tcHVfMTVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX21wdV8xNV9fX2JpdCAxNQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19zcHVfMF9fX2xzYiAxNgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19zcHVfMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fc3B1XzBfX19iaXQgMTYKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fc3B1XzFfX19sc2IgMTcKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fc3B1XzFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX3NwdV8xX19fYml0IDE3CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX3NwdV8yX19fbHNiIDE4CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX3NwdV8yX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19zcHVfMl9fX2JpdCAxOAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19zcHVfM19fX2xzYiAxOQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19zcHVfM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fc3B1XzNfX19iaXQgMTkKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fc3B1XzRfX19sc2IgMjAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fc3B1XzRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX3NwdV80X19fYml0IDIwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX3NwdV81X19fbHNiIDIxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX3NwdV81X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19zcHVfNV9fX2JpdCAyMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19zcHVfNl9fX2xzYiAyMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19zcHVfNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fc3B1XzZfX19iaXQgMjIKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fc3B1XzdfX19sc2IgMjMKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fc3B1XzdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX3NwdV83X19fYml0IDIzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX3NwdV84X19fbHNiIDI0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX3NwdV84X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19zcHVfOF9fX2JpdCAyNAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19zcHVfOV9fX2xzYiAyNQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19zcHVfOV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fc3B1XzlfX19iaXQgMjUKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fc3B1XzEwX19fbHNiIDI2CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX3NwdV8xMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fc3B1XzEwX19fYml0IDI2CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX3NwdV8xMV9fX2xzYiAyNworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19zcHVfMTFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX3NwdV8xMV9fX2JpdCAyNworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19zcHVfMTJfX19sc2IgMjgKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fc3B1XzEyX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19zcHVfMTJfX19iaXQgMjgKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fc3B1XzEzX19fbHNiIDI5CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX3NwdV8xM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fc3B1XzEzX19fYml0IDI5CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX3NwdV8xNF9fX2xzYiAzMAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19zcHVfMTRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMF9fX3NwdV8xNF9fX2JpdCAzMAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19zcHVfMTVfX19sc2IgMzEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX19fc3B1XzE1X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjBfX19zcHVfMTVfX19iaXQgMzEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIwX29mZnNldCA4MAorCisvKiBSZWdpc3RlciByX2ludHIwLCBzY29wZSBpb3Bfc3dfY3B1LCB0eXBlIHIgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX21wdV8wX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX21wdV8wX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fbXB1XzBfX19iaXQgMAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fbXB1XzFfX19sc2IgMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fbXB1XzFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19tcHVfMV9fX2JpdCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19tcHVfMl9fX2xzYiAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19tcHVfMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX21wdV8yX19fYml0IDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX21wdV8zX19fbHNiIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX21wdV8zX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fbXB1XzNfX19iaXQgMworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fbXB1XzRfX19sc2IgNAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fbXB1XzRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19tcHVfNF9fX2JpdCA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19tcHVfNV9fX2xzYiA1CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19tcHVfNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX21wdV81X19fYml0IDUKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX21wdV82X19fbHNiIDYKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX21wdV82X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fbXB1XzZfX19iaXQgNgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fbXB1XzdfX19sc2IgNworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fbXB1XzdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19tcHVfN19fX2JpdCA3CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19tcHVfOF9fX2xzYiA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19tcHVfOF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX21wdV84X19fYml0IDgKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX21wdV85X19fbHNiIDkKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX21wdV85X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fbXB1XzlfX19iaXQgOQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fbXB1XzEwX19fbHNiIDEwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19tcHVfMTBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19tcHVfMTBfX19iaXQgMTAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX21wdV8xMV9fX2xzYiAxMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fbXB1XzExX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fbXB1XzExX19fYml0IDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19tcHVfMTJfX19sc2IgMTIKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX21wdV8xMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX21wdV8xMl9fX2JpdCAxMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fbXB1XzEzX19fbHNiIDEzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19tcHVfMTNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19tcHVfMTNfX19iaXQgMTMKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX21wdV8xNF9fX2xzYiAxNAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fbXB1XzE0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fbXB1XzE0X19fYml0IDE0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19tcHVfMTVfX19sc2IgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX21wdV8xNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX21wdV8xNV9fX2JpdCAxNQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fc3B1XzBfX19sc2IgMTYKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX3NwdV8wX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fc3B1XzBfX19iaXQgMTYKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX3NwdV8xX19fbHNiIDE3CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19zcHVfMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX3NwdV8xX19fYml0IDE3CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19zcHVfMl9fX2xzYiAxOAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fc3B1XzJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19zcHVfMl9fX2JpdCAxOAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fc3B1XzNfX19sc2IgMTkKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX3NwdV8zX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fc3B1XzNfX19iaXQgMTkKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX3NwdV80X19fbHNiIDIwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19zcHVfNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX3NwdV80X19fYml0IDIwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19zcHVfNV9fX2xzYiAyMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fc3B1XzVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19zcHVfNV9fX2JpdCAyMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fc3B1XzZfX19sc2IgMjIKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX3NwdV82X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fc3B1XzZfX19iaXQgMjIKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX3NwdV83X19fbHNiIDIzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19zcHVfN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX3NwdV83X19fYml0IDIzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19zcHVfOF9fX2xzYiAyNAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fc3B1XzhfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19zcHVfOF9fX2JpdCAyNAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fc3B1XzlfX19sc2IgMjUKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX3NwdV85X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fc3B1XzlfX19iaXQgMjUKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX3NwdV8xMF9fX2xzYiAyNgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fc3B1XzEwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fc3B1XzEwX19fYml0IDI2CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19zcHVfMTFfX19sc2IgMjcKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX3NwdV8xMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX3NwdV8xMV9fX2JpdCAyNworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fc3B1XzEyX19fbHNiIDI4CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19zcHVfMTJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19zcHVfMTJfX19iaXQgMjgKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX3NwdV8xM19fX2xzYiAyOQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fc3B1XzEzX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fc3B1XzEzX19fYml0IDI5CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19zcHVfMTRfX19sc2IgMzAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX3NwdV8xNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9fX3NwdV8xNF9fX2JpdCAzMAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIwX19fc3B1XzE1X19fbHNiIDMxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19zcHVfMTVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjBfX19zcHVfMTVfX19iaXQgMzEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMF9vZmZzZXQgODQKKworLyogUmVnaXN0ZXIgcl9tYXNrZWRfaW50cjAsIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgciAqLworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX21wdV8wX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19tcHVfMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19tcHVfMF9fX2JpdCAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fbXB1XzFfX19sc2IgMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX21wdV8xX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX21wdV8xX19fYml0IDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19tcHVfMl9fX2xzYiAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fbXB1XzJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fbXB1XzJfX19iaXQgMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX21wdV8zX19fbHNiIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19tcHVfM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19tcHVfM19fX2JpdCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fbXB1XzRfX19sc2IgNAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX21wdV80X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX21wdV80X19fYml0IDQKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19tcHVfNV9fX2xzYiA1CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fbXB1XzVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fbXB1XzVfX19iaXQgNQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX21wdV82X19fbHNiIDYKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19tcHVfNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19tcHVfNl9fX2JpdCA2CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fbXB1XzdfX19sc2IgNworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX21wdV83X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX21wdV83X19fYml0IDcKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19tcHVfOF9fX2xzYiA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fbXB1XzhfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fbXB1XzhfX19iaXQgOAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX21wdV85X19fbHNiIDkKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19tcHVfOV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19tcHVfOV9fX2JpdCA5CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fbXB1XzEwX19fbHNiIDEwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fbXB1XzEwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX21wdV8xMF9fX2JpdCAxMAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX21wdV8xMV9fX2xzYiAxMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX21wdV8xMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19tcHVfMTFfX19iaXQgMTEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19tcHVfMTJfX19sc2IgMTIKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19tcHVfMTJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fbXB1XzEyX19fYml0IDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fbXB1XzEzX19fbHNiIDEzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fbXB1XzEzX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX21wdV8xM19fX2JpdCAxMworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX21wdV8xNF9fX2xzYiAxNAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX21wdV8xNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19tcHVfMTRfX19iaXQgMTQKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19tcHVfMTVfX19sc2IgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19tcHVfMTVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fbXB1XzE1X19fYml0IDE1CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fc3B1XzBfX19sc2IgMTYKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19zcHVfMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19zcHVfMF9fX2JpdCAxNgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX3NwdV8xX19fbHNiIDE3CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fc3B1XzFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fc3B1XzFfX19iaXQgMTcKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19zcHVfMl9fX2xzYiAxOAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX3NwdV8yX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX3NwdV8yX19fYml0IDE4CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fc3B1XzNfX19sc2IgMTkKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19zcHVfM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19zcHVfM19fX2JpdCAxOQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX3NwdV80X19fbHNiIDIwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fc3B1XzRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fc3B1XzRfX19iaXQgMjAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19zcHVfNV9fX2xzYiAyMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX3NwdV81X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX3NwdV81X19fYml0IDIxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fc3B1XzZfX19sc2IgMjIKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19zcHVfNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19zcHVfNl9fX2JpdCAyMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX3NwdV83X19fbHNiIDIzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fc3B1XzdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fc3B1XzdfX19iaXQgMjMKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19zcHVfOF9fX2xzYiAyNAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX3NwdV84X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX3NwdV84X19fYml0IDI0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fc3B1XzlfX19sc2IgMjUKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19zcHVfOV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19zcHVfOV9fX2JpdCAyNQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX3NwdV8xMF9fX2xzYiAyNgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX3NwdV8xMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19zcHVfMTBfX19iaXQgMjYKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19zcHVfMTFfX19sc2IgMjcKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19zcHVfMTFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fc3B1XzExX19fYml0IDI3CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fc3B1XzEyX19fbHNiIDI4CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fc3B1XzEyX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX3NwdV8xMl9fX2JpdCAyOAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX3NwdV8xM19fX2xzYiAyOQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX3NwdV8xM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19zcHVfMTNfX19iaXQgMjkKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19zcHVfMTRfX19sc2IgMzAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjBfX19zcHVfMTRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fc3B1XzE0X19fYml0IDMwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fc3B1XzE1X19fbHNiIDMxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIwX19fc3B1XzE1X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9fX3NwdV8xNV9fX2JpdCAzMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMF9vZmZzZXQgODgKKworLyogUmVnaXN0ZXIgcndfaW50cjFfbWFzaywgc2NvcGUgaW9wX3N3X2NwdSwgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fbXB1XzE2X19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX21wdV8xNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX21wdV8xNl9fX2JpdCAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX19tcHVfMTdfX19sc2IgMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fbXB1XzE3X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fbXB1XzE3X19fYml0IDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX21wdV8xOF9fX2xzYiAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX19tcHVfMThfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX19tcHVfMThfX19iaXQgMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fbXB1XzE5X19fbHNiIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX21wdV8xOV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX21wdV8xOV9fX2JpdCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX19tcHVfMjBfX19sc2IgNAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fbXB1XzIwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fbXB1XzIwX19fYml0IDQKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX21wdV8yMV9fX2xzYiA1CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX19tcHVfMjFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX19tcHVfMjFfX19iaXQgNQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fbXB1XzIyX19fbHNiIDYKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX21wdV8yMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX21wdV8yMl9fX2JpdCA2CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX19tcHVfMjNfX19sc2IgNworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fbXB1XzIzX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fbXB1XzIzX19fYml0IDcKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX21wdV8yNF9fX2xzYiA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX19tcHVfMjRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX19tcHVfMjRfX19iaXQgOAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fbXB1XzI1X19fbHNiIDkKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX21wdV8yNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX21wdV8yNV9fX2JpdCA5CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX19tcHVfMjZfX19sc2IgMTAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX21wdV8yNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX21wdV8yNl9fX2JpdCAxMAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fbXB1XzI3X19fbHNiIDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX19tcHVfMjdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX19tcHVfMjdfX19iaXQgMTEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX21wdV8yOF9fX2xzYiAxMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fbXB1XzI4X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fbXB1XzI4X19fYml0IDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX19tcHVfMjlfX19sc2IgMTMKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX21wdV8yOV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX21wdV8yOV9fX2JpdCAxMworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fbXB1XzMwX19fbHNiIDE0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX19tcHVfMzBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX19tcHVfMzBfX19iaXQgMTQKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX21wdV8zMV9fX2xzYiAxNQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fbXB1XzMxX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fbXB1XzMxX19fYml0IDE1CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX19kbWNfaW5fX19sc2IgMTYKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX2RtY19pbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX2RtY19pbl9fX2JpdCAxNgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fZG1jX291dF9fX2xzYiAxNworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fZG1jX291dF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX2RtY19vdXRfX19iaXQgMTcKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX2ZpZm9faW5fX19sc2IgMTgKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX2ZpZm9faW5fX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX19maWZvX2luX19fYml0IDE4CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX19maWZvX291dF9fX2xzYiAxOQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fZmlmb19vdXRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX19maWZvX291dF9fX2JpdCAxOQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fZmlmb19pbl9leHRyYV9fX2xzYiAyMAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fZmlmb19pbl9leHRyYV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX2ZpZm9faW5fZXh0cmFfX19iaXQgMjAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX2ZpZm9fb3V0X2V4dHJhX19fbHNiIDIxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX19maWZvX291dF9leHRyYV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX2ZpZm9fb3V0X2V4dHJhX19fYml0IDIxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX190cmlnZ2VyX2dycDBfX19sc2IgMjIKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX3RyaWdnZXJfZ3JwMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX3RyaWdnZXJfZ3JwMF9fX2JpdCAyMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fdHJpZ2dlcl9ncnAxX19fbHNiIDIzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX190cmlnZ2VyX2dycDFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX190cmlnZ2VyX2dycDFfX19iaXQgMjMKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX3RyaWdnZXJfZ3JwMl9fX2xzYiAyNAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fdHJpZ2dlcl9ncnAyX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fdHJpZ2dlcl9ncnAyX19fYml0IDI0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX190cmlnZ2VyX2dycDNfX19sc2IgMjUKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX3RyaWdnZXJfZ3JwM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX3RyaWdnZXJfZ3JwM19fX2JpdCAyNQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fdHJpZ2dlcl9ncnA0X19fbHNiIDI2CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX190cmlnZ2VyX2dycDRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX190cmlnZ2VyX2dycDRfX19iaXQgMjYKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX3RyaWdnZXJfZ3JwNV9fX2xzYiAyNworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fdHJpZ2dlcl9ncnA1X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fdHJpZ2dlcl9ncnA1X19fYml0IDI3CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX190cmlnZ2VyX2dycDZfX19sc2IgMjgKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX3RyaWdnZXJfZ3JwNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX3RyaWdnZXJfZ3JwNl9fX2JpdCAyOAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fdHJpZ2dlcl9ncnA3X19fbHNiIDI5CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX190cmlnZ2VyX2dycDdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX190cmlnZ2VyX2dycDdfX19iaXQgMjkKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX3RpbWVyX2dycDBfX19sc2IgMzAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19fX3RpbWVyX2dycDBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX190aW1lcl9ncnAwX19fYml0IDMwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX190aW1lcl9ncnAxX19fbHNiIDMxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfX190aW1lcl9ncnAxX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX19fdGltZXJfZ3JwMV9fX2JpdCAzMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrX29mZnNldCA5MgorCisvKiBSZWdpc3RlciByd19hY2tfaW50cjEsIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIxX19fbXB1XzE2X19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIxX19fbXB1XzE2X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjFfX19tcHVfMTZfX19iaXQgMAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjFfX19tcHVfMTdfX19sc2IgMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjFfX19tcHVfMTdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMV9fX21wdV8xN19fX2JpdCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMV9fX21wdV8xOF9fX2xzYiAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMV9fX21wdV8xOF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIxX19fbXB1XzE4X19fYml0IDIKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIxX19fbXB1XzE5X19fbHNiIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIxX19fbXB1XzE5X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjFfX19tcHVfMTlfX19iaXQgMworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjFfX19tcHVfMjBfX19sc2IgNAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjFfX19tcHVfMjBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMV9fX21wdV8yMF9fX2JpdCA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMV9fX21wdV8yMV9fX2xzYiA1CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMV9fX21wdV8yMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIxX19fbXB1XzIxX19fYml0IDUKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIxX19fbXB1XzIyX19fbHNiIDYKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIxX19fbXB1XzIyX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjFfX19tcHVfMjJfX19iaXQgNgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjFfX19tcHVfMjNfX19sc2IgNworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjFfX19tcHVfMjNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMV9fX21wdV8yM19fX2JpdCA3CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMV9fX21wdV8yNF9fX2xzYiA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMV9fX21wdV8yNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIxX19fbXB1XzI0X19fYml0IDgKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIxX19fbXB1XzI1X19fbHNiIDkKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIxX19fbXB1XzI1X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjFfX19tcHVfMjVfX19iaXQgOQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjFfX19tcHVfMjZfX19sc2IgMTAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIxX19fbXB1XzI2X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjFfX19tcHVfMjZfX19iaXQgMTAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIxX19fbXB1XzI3X19fbHNiIDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMV9fX21wdV8yN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIxX19fbXB1XzI3X19fYml0IDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMV9fX21wdV8yOF9fX2xzYiAxMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjFfX19tcHVfMjhfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMV9fX21wdV8yOF9fX2JpdCAxMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjFfX19tcHVfMjlfX19sc2IgMTMKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIxX19fbXB1XzI5X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjFfX19tcHVfMjlfX19iaXQgMTMKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIxX19fbXB1XzMwX19fbHNiIDE0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMV9fX21wdV8zMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcndfYWNrX2ludHIxX19fbXB1XzMwX19fYml0IDE0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMV9fX21wdV8zMV9fX2xzYiAxNQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjFfX19tcHVfMzFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3J3X2Fja19pbnRyMV9fX21wdV8zMV9fX2JpdCAxNQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjFfb2Zmc2V0IDk2CisKKy8qIFJlZ2lzdGVyIHJfaW50cjEsIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgciAqLworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fbXB1XzE2X19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX21wdV8xNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX21wdV8xNl9fX2JpdCAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX19tcHVfMTdfX19sc2IgMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fbXB1XzE3X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fbXB1XzE3X19fYml0IDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX21wdV8xOF9fX2xzYiAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX19tcHVfMThfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX19tcHVfMThfX19iaXQgMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fbXB1XzE5X19fbHNiIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX21wdV8xOV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX21wdV8xOV9fX2JpdCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX19tcHVfMjBfX19sc2IgNAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fbXB1XzIwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fbXB1XzIwX19fYml0IDQKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX21wdV8yMV9fX2xzYiA1CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX19tcHVfMjFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX19tcHVfMjFfX19iaXQgNQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fbXB1XzIyX19fbHNiIDYKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX21wdV8yMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX21wdV8yMl9fX2JpdCA2CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX19tcHVfMjNfX19sc2IgNworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fbXB1XzIzX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fbXB1XzIzX19fYml0IDcKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX21wdV8yNF9fX2xzYiA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX19tcHVfMjRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX19tcHVfMjRfX19iaXQgOAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fbXB1XzI1X19fbHNiIDkKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX21wdV8yNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX21wdV8yNV9fX2JpdCA5CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX19tcHVfMjZfX19sc2IgMTAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX21wdV8yNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX21wdV8yNl9fX2JpdCAxMAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fbXB1XzI3X19fbHNiIDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX19tcHVfMjdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX19tcHVfMjdfX19iaXQgMTEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX21wdV8yOF9fX2xzYiAxMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fbXB1XzI4X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fbXB1XzI4X19fYml0IDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX19tcHVfMjlfX19sc2IgMTMKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX21wdV8yOV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX21wdV8yOV9fX2JpdCAxMworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fbXB1XzMwX19fbHNiIDE0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX19tcHVfMzBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX19tcHVfMzBfX19iaXQgMTQKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX21wdV8zMV9fX2xzYiAxNQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fbXB1XzMxX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fbXB1XzMxX19fYml0IDE1CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX19kbWNfaW5fX19sc2IgMTYKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX2RtY19pbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX2RtY19pbl9fX2JpdCAxNgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fZG1jX291dF9fX2xzYiAxNworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fZG1jX291dF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX2RtY19vdXRfX19iaXQgMTcKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX2ZpZm9faW5fX19sc2IgMTgKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX2ZpZm9faW5fX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX19maWZvX2luX19fYml0IDE4CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX19maWZvX291dF9fX2xzYiAxOQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fZmlmb19vdXRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX19maWZvX291dF9fX2JpdCAxOQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fZmlmb19pbl9leHRyYV9fX2xzYiAyMAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fZmlmb19pbl9leHRyYV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX2ZpZm9faW5fZXh0cmFfX19iaXQgMjAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX2ZpZm9fb3V0X2V4dHJhX19fbHNiIDIxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX19maWZvX291dF9leHRyYV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX2ZpZm9fb3V0X2V4dHJhX19fYml0IDIxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX190cmlnZ2VyX2dycDBfX19sc2IgMjIKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX3RyaWdnZXJfZ3JwMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX3RyaWdnZXJfZ3JwMF9fX2JpdCAyMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fdHJpZ2dlcl9ncnAxX19fbHNiIDIzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX190cmlnZ2VyX2dycDFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX190cmlnZ2VyX2dycDFfX19iaXQgMjMKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX3RyaWdnZXJfZ3JwMl9fX2xzYiAyNAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fdHJpZ2dlcl9ncnAyX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fdHJpZ2dlcl9ncnAyX19fYml0IDI0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX190cmlnZ2VyX2dycDNfX19sc2IgMjUKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX3RyaWdnZXJfZ3JwM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX3RyaWdnZXJfZ3JwM19fX2JpdCAyNQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fdHJpZ2dlcl9ncnA0X19fbHNiIDI2CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX190cmlnZ2VyX2dycDRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX190cmlnZ2VyX2dycDRfX19iaXQgMjYKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX3RyaWdnZXJfZ3JwNV9fX2xzYiAyNworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fdHJpZ2dlcl9ncnA1X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fdHJpZ2dlcl9ncnA1X19fYml0IDI3CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX190cmlnZ2VyX2dycDZfX19sc2IgMjgKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX3RyaWdnZXJfZ3JwNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX3RyaWdnZXJfZ3JwNl9fX2JpdCAyOAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fdHJpZ2dlcl9ncnA3X19fbHNiIDI5CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX190cmlnZ2VyX2dycDdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX190cmlnZ2VyX2dycDdfX19iaXQgMjkKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX3RpbWVyX2dycDBfX19sc2IgMzAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9pbnRyMV9fX3RpbWVyX2dycDBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX190aW1lcl9ncnAwX19fYml0IDMwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX190aW1lcl9ncnAxX19fbHNiIDMxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfaW50cjFfX190aW1lcl9ncnAxX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX19fdGltZXJfZ3JwMV9fX2JpdCAzMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX2ludHIxX29mZnNldCAxMDAKKworLyogUmVnaXN0ZXIgcl9tYXNrZWRfaW50cjEsIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgciAqLworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX21wdV8xNl9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fbXB1XzE2X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX21wdV8xNl9fX2JpdCAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fbXB1XzE3X19fbHNiIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX19tcHVfMTdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fbXB1XzE3X19fYml0IDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX19tcHVfMThfX19sc2IgMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX21wdV8xOF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX19tcHVfMThfX19iaXQgMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX21wdV8xOV9fX2xzYiAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fbXB1XzE5X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX21wdV8xOV9fX2JpdCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fbXB1XzIwX19fbHNiIDQKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX19tcHVfMjBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fbXB1XzIwX19fYml0IDQKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX19tcHVfMjFfX19sc2IgNQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX21wdV8yMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX19tcHVfMjFfX19iaXQgNQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX21wdV8yMl9fX2xzYiA2CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fbXB1XzIyX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX21wdV8yMl9fX2JpdCA2CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fbXB1XzIzX19fbHNiIDcKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX19tcHVfMjNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fbXB1XzIzX19fYml0IDcKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX19tcHVfMjRfX19sc2IgOAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX21wdV8yNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX19tcHVfMjRfX19iaXQgOAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX21wdV8yNV9fX2xzYiA5CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fbXB1XzI1X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX21wdV8yNV9fX2JpdCA5CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fbXB1XzI2X19fbHNiIDEwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fbXB1XzI2X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX21wdV8yNl9fX2JpdCAxMAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX21wdV8yN19fX2xzYiAxMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX21wdV8yN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX19tcHVfMjdfX19iaXQgMTEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX19tcHVfMjhfX19sc2IgMTIKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX19tcHVfMjhfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fbXB1XzI4X19fYml0IDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fbXB1XzI5X19fbHNiIDEzCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fbXB1XzI5X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX21wdV8yOV9fX2JpdCAxMworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX21wdV8zMF9fX2xzYiAxNAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX21wdV8zMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX19tcHVfMzBfX19iaXQgMTQKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX19tcHVfMzFfX19sc2IgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX19tcHVfMzFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fbXB1XzMxX19fYml0IDE1CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fZG1jX2luX19fbHNiIDE2CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fZG1jX2luX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX2RtY19pbl9fX2JpdCAxNgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX2RtY19vdXRfX19sc2IgMTcKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX19kbWNfb3V0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX2RtY19vdXRfX19iaXQgMTcKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX19maWZvX2luX19fbHNiIDE4CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fZmlmb19pbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX19maWZvX2luX19fYml0IDE4CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fZmlmb19vdXRfX19sc2IgMTkKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX19maWZvX291dF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX19maWZvX291dF9fX2JpdCAxOQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX2ZpZm9faW5fZXh0cmFfX19sc2IgMjAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX19maWZvX2luX2V4dHJhX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX2ZpZm9faW5fZXh0cmFfX19iaXQgMjAKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX19maWZvX291dF9leHRyYV9fX2xzYiAyMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX2ZpZm9fb3V0X2V4dHJhX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX2ZpZm9fb3V0X2V4dHJhX19fYml0IDIxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fdHJpZ2dlcl9ncnAwX19fbHNiIDIyCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fdHJpZ2dlcl9ncnAwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX3RyaWdnZXJfZ3JwMF9fX2JpdCAyMgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX3RyaWdnZXJfZ3JwMV9fX2xzYiAyMworI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX3RyaWdnZXJfZ3JwMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX190cmlnZ2VyX2dycDFfX19iaXQgMjMKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX190cmlnZ2VyX2dycDJfX19sc2IgMjQKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX190cmlnZ2VyX2dycDJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fdHJpZ2dlcl9ncnAyX19fYml0IDI0CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fdHJpZ2dlcl9ncnAzX19fbHNiIDI1CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fdHJpZ2dlcl9ncnAzX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX3RyaWdnZXJfZ3JwM19fX2JpdCAyNQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX3RyaWdnZXJfZ3JwNF9fX2xzYiAyNgorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX3RyaWdnZXJfZ3JwNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX190cmlnZ2VyX2dycDRfX19iaXQgMjYKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX190cmlnZ2VyX2dycDVfX19sc2IgMjcKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX190cmlnZ2VyX2dycDVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fdHJpZ2dlcl9ncnA1X19fYml0IDI3CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fdHJpZ2dlcl9ncnA2X19fbHNiIDI4CisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fdHJpZ2dlcl9ncnA2X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX3RyaWdnZXJfZ3JwNl9fX2JpdCAyOAorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX3RyaWdnZXJfZ3JwN19fX2xzYiAyOQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX3RyaWdnZXJfZ3JwN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX190cmlnZ2VyX2dycDdfX19iaXQgMjkKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX190aW1lcl9ncnAwX19fbHNiIDMwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fdGltZXJfZ3JwMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjFfX190aW1lcl9ncnAwX19fYml0IDMwCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fdGltZXJfZ3JwMV9fX2xzYiAzMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9fX3RpbWVyX2dycDFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfY3B1X3JfbWFza2VkX2ludHIxX19fdGltZXJfZ3JwMV9fX2JpdCAzMQorI2RlZmluZSByZWdfaW9wX3N3X2NwdV9yX21hc2tlZF9pbnRyMV9vZmZzZXQgMTA0CisKKworLyogQ29uc3RhbnRzICovCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NwdV9jb3B5ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY3B1X25vICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19jcHVfcmQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NwdV9yZWdfY29weSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna19pb3Bfc3dfY3B1X3J3X2J1c19jbHJfbWFza19kZWZhdWx0ICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19jcHVfcndfYnVzX29lX2Nscl9tYXNrX2RlZmF1bHQgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY3B1X3J3X2J1c19vZV9zZXRfbWFza19kZWZhdWx0ICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NwdV9yd19idXNfc2V0X21hc2tfZGVmYXVsdCAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY3B1X3J3X2dpb19jbHJfbWFza19kZWZhdWx0ICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19jcHVfcndfZ2lvX29lX2Nscl9tYXNrX2RlZmF1bHQgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY3B1X3J3X2dpb19vZV9zZXRfbWFza19kZWZhdWx0ICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NwdV9yd19naW9fc2V0X21hc2tfZGVmYXVsdCAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfY3B1X3J3X2ludHIwX21hc2tfZGVmYXVsdCAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19jcHVfcndfaW50cjFfbWFza19kZWZhdWx0ICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X2NwdV93ciAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgcmVna19pb3Bfc3dfY3B1X3llcyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2VuZGlmIC8qIF9faW9wX3N3X2NwdV9kZWZzX2FzbV9oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2lvcC9hc20vaW9wX3N3X21wdV9kZWZzX2FzbS5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9pb3AvYXNtL2lvcF9zd19tcHVfZGVmc19hc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmNjODNiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9pb3AvYXNtL2lvcF9zd19tcHVfZGVmc19hc20uaApAQCAtMCwwICsxLDEwODYgQEAKKyNpZm5kZWYgX19pb3Bfc3dfbXB1X2RlZnNfYXNtX2gKKyNkZWZpbmUgX19pb3Bfc3dfbXB1X2RlZnNfYXNtX2gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGZyb20KKyAqICAgZmlsZTogICAgICAgICAgIGlvcF9zd19tcHUucgorICogCisgKiAgIGJ5IC4uLy4uLy4uL3Rvb2xzL3JkZXNjL2Jpbi9yZGVzMmMgLWFzbSAtb3V0ZmlsZSBpb3Bfc3dfbXB1X2RlZnNfYXNtLmggaW9wX3N3X21wdS5yCisgKiBBbnkgY2hhbmdlcyBoZXJlIHdpbGwgYmUgbG9zdC4KKyAqCisgKiAtKi0gYnVmZmVyLXJlYWQtb25seTogdCAtKi0KKyAqLworCisjaWZuZGVmIFJFR19GSUVMRAorI2RlZmluZSBSRUdfRklFTEQoIHNjb3BlLCByZWcsIGZpZWxkLCB2YWx1ZSApIFwKKyAgUkVHX0ZJRUxEX1hfKCB2YWx1ZSwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX0ZJRUxEX1hfKCB2YWx1ZSwgc2hpZnQgKSAoKHZhbHVlKSA8PCBzaGlmdCkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19TVEFURQorI2RlZmluZSBSRUdfU1RBVEUoIHNjb3BlLCByZWcsIGZpZWxkLCBzeW1ib2xpY192YWx1ZSApIFwKKyAgUkVHX1NUQVRFX1hfKCByZWdrXyMjc2NvcGUjI18jI3N5bWJvbGljX3ZhbHVlLCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX19sc2IgKQorI2RlZmluZSBSRUdfU1RBVEVfWF8oIGssIHNoaWZ0ICkgKGsgPDwgc2hpZnQpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfTUFTSworI2RlZmluZSBSRUdfTUFTSyggc2NvcGUsIHJlZywgZmllbGQgKSBcCisgIFJFR19NQVNLX1hfKCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX193aWR0aCwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX01BU0tfWF8oIHdpZHRoLCBsc2IgKSAoKCgxIDw8IHdpZHRoKS0xKSA8PCBsc2IpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfTFNCCisjZGVmaW5lIFJFR19MU0IoIHNjb3BlLCByZWcsIGZpZWxkICkgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQklUCisjZGVmaW5lIFJFR19CSVQoIHNjb3BlLCByZWcsIGZpZWxkICkgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fYml0CisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUgorI2RlZmluZSBSRUdfQUREUiggc2NvcGUsIGluc3QsIHJlZyApIFJFR19BRERSX1hfKGluc3QsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19vZmZzZXQpCisjZGVmaW5lIFJFR19BRERSX1hfKCBpbnN0LCBvZmZzICkgKChpbnN0KSArIG9mZnMpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUl9WRUNUCisjZGVmaW5lIFJFR19BRERSX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICAgICAgICAgUkVHX0FERFJfVkVDVF9YXyhpbnN0LCByZWdfIyNzY29wZSMjXyMjcmVnIyNfb2Zmc2V0LCBpbmRleCwgXAorCQkJIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2RlZmluZSBSRUdfQUREUl9WRUNUX1hfKCBpbnN0LCBvZmZzLCBpbmRleCwgc3RyaWRlICkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKGluc3QpICsgb2ZmcyArIChpbmRleCkgKiBzdHJpZGUpCisjZW5kaWYKKworLyogUmVnaXN0ZXIgcndfc3dfY2ZnX293bmVyLCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X3N3X2NmZ19vd25lcl9fX2NmZ19fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X3N3X2NmZ19vd25lcl9fX2NmZ19fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfc3dfY2ZnX293bmVyX29mZnNldCAwCisKKy8qIFJlZ2lzdGVyIHJfc3B1X3RyYWNlLCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHIgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9zcHVfdHJhY2Vfb2Zmc2V0IDQKKworLyogUmVnaXN0ZXIgcl9zcHVfZnNtX3RyYWNlLCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHIgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9zcHVfZnNtX3RyYWNlX29mZnNldCA4CisKKy8qIFJlZ2lzdGVyIHJ3X21jX2N0cmwsIHNjb3BlIGlvcF9zd19tcHUsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfbWNfY3RybF9fX2tlZXBfb3duZXJfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19tY19jdHJsX19fa2VlcF9vd25lcl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfbWNfY3RybF9fX2tlZXBfb3duZXJfX19iaXQgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19tY19jdHJsX19fY21kX19fbHNiIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfbWNfY3RybF9fX2NtZF9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfbWNfY3RybF9fX3NpemVfX19sc2IgMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19tY19jdHJsX19fc2l6ZV9fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfbWNfY3RybF9fX3dyX3NwdV9tZW1fX19sc2IgNgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19tY19jdHJsX19fd3Jfc3B1X21lbV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfbWNfY3RybF9fX3dyX3NwdV9tZW1fX19iaXQgNgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19tY19jdHJsX29mZnNldCAxMgorCisvKiBSZWdpc3RlciByd19tY19kYXRhLCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X21jX2RhdGFfX192YWxfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19tY19kYXRhX19fdmFsX19fd2lkdGggMzIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfbWNfZGF0YV9vZmZzZXQgMTYKKworLyogUmVnaXN0ZXIgcndfbWNfYWRkciwgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19tY19hZGRyX29mZnNldCAyMAorCisvKiBSZWdpc3RlciByc19tY19kYXRhLCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHJzICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JzX21jX2RhdGFfb2Zmc2V0IDI0CisKKy8qIFJlZ2lzdGVyIHJfbWNfZGF0YSwgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSByICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWNfZGF0YV9vZmZzZXQgMjgKKworLyogUmVnaXN0ZXIgcl9tY19zdGF0LCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHIgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tY19zdGF0X19fYnVzeV9jcHVfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21jX3N0YXRfX19idXN5X2NwdV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tY19zdGF0X19fYnVzeV9jcHVfX19iaXQgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21jX3N0YXRfX19idXN5X21wdV9fX2xzYiAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWNfc3RhdF9fX2J1c3lfbXB1X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21jX3N0YXRfX19idXN5X21wdV9fX2JpdCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWNfc3RhdF9fX2J1c3lfc3B1X19fbHNiIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tY19zdGF0X19fYnVzeV9zcHVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWNfc3RhdF9fX2J1c3lfc3B1X19fYml0IDIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tY19zdGF0X19fb3duZWRfYnlfY3B1X19fbHNiIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tY19zdGF0X19fb3duZWRfYnlfY3B1X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21jX3N0YXRfX19vd25lZF9ieV9jcHVfX19iaXQgMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21jX3N0YXRfX19vd25lZF9ieV9tcHVfX19sc2IgNAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21jX3N0YXRfX19vd25lZF9ieV9tcHVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWNfc3RhdF9fX293bmVkX2J5X21wdV9fX2JpdCA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWNfc3RhdF9fX293bmVkX2J5X3NwdV9fX2xzYiA1CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWNfc3RhdF9fX293bmVkX2J5X3NwdV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tY19zdGF0X19fb3duZWRfYnlfc3B1X19fYml0IDUKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tY19zdGF0X29mZnNldCAzMgorCisvKiBSZWdpc3RlciByd19idXNfY2xyX21hc2ssIHNjb3BlIGlvcF9zd19tcHUsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYnVzX2Nscl9tYXNrX19fYnl0ZTBfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19idXNfY2xyX21hc2tfX19ieXRlMF9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYnVzX2Nscl9tYXNrX19fYnl0ZTFfX19sc2IgOAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19idXNfY2xyX21hc2tfX19ieXRlMV9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYnVzX2Nscl9tYXNrX19fYnl0ZTJfX19sc2IgMTYKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYnVzX2Nscl9tYXNrX19fYnl0ZTJfX193aWR0aCA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2J1c19jbHJfbWFza19fX2J5dGUzX19fbHNiIDI0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2J1c19jbHJfbWFza19fX2J5dGUzX19fd2lkdGggOAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19idXNfY2xyX21hc2tfb2Zmc2V0IDM2CisKKy8qIFJlZ2lzdGVyIHJ3X2J1c19zZXRfbWFzaywgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19idXNfc2V0X21hc2tfX19ieXRlMF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2J1c19zZXRfbWFza19fX2J5dGUwX19fd2lkdGggOAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19idXNfc2V0X21hc2tfX19ieXRlMV9fX2xzYiA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2J1c19zZXRfbWFza19fX2J5dGUxX19fd2lkdGggOAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19idXNfc2V0X21hc2tfX19ieXRlMl9fX2xzYiAxNgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19idXNfc2V0X21hc2tfX19ieXRlMl9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYnVzX3NldF9tYXNrX19fYnl0ZTNfX19sc2IgMjQKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYnVzX3NldF9tYXNrX19fYnl0ZTNfX193aWR0aCA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2J1c19zZXRfbWFza19vZmZzZXQgNDAKKworLyogUmVnaXN0ZXIgcndfYnVzX29lX2Nscl9tYXNrLCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2J1c19vZV9jbHJfbWFza19fX2J5dGUwX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYnVzX29lX2Nscl9tYXNrX19fYnl0ZTBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2J1c19vZV9jbHJfbWFza19fX2J5dGUwX19fYml0IDAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYnVzX29lX2Nscl9tYXNrX19fYnl0ZTFfX19sc2IgMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19idXNfb2VfY2xyX21hc2tfX19ieXRlMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYnVzX29lX2Nscl9tYXNrX19fYnl0ZTFfX19iaXQgMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19idXNfb2VfY2xyX21hc2tfX19ieXRlMl9fX2xzYiAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2J1c19vZV9jbHJfbWFza19fX2J5dGUyX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19idXNfb2VfY2xyX21hc2tfX19ieXRlMl9fX2JpdCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2J1c19vZV9jbHJfbWFza19fX2J5dGUzX19fbHNiIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYnVzX29lX2Nscl9tYXNrX19fYnl0ZTNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2J1c19vZV9jbHJfbWFza19fX2J5dGUzX19fYml0IDMKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYnVzX29lX2Nscl9tYXNrX29mZnNldCA0NAorCisvKiBSZWdpc3RlciByd19idXNfb2Vfc2V0X21hc2ssIHNjb3BlIGlvcF9zd19tcHUsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYnVzX29lX3NldF9tYXNrX19fYnl0ZTBfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19idXNfb2Vfc2V0X21hc2tfX19ieXRlMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYnVzX29lX3NldF9tYXNrX19fYnl0ZTBfX19iaXQgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19idXNfb2Vfc2V0X21hc2tfX19ieXRlMV9fX2xzYiAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2J1c19vZV9zZXRfbWFza19fX2J5dGUxX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19idXNfb2Vfc2V0X21hc2tfX19ieXRlMV9fX2JpdCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2J1c19vZV9zZXRfbWFza19fX2J5dGUyX19fbHNiIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYnVzX29lX3NldF9tYXNrX19fYnl0ZTJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2J1c19vZV9zZXRfbWFza19fX2J5dGUyX19fYml0IDIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYnVzX29lX3NldF9tYXNrX19fYnl0ZTNfX19sc2IgMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19idXNfb2Vfc2V0X21hc2tfX19ieXRlM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYnVzX29lX3NldF9tYXNrX19fYnl0ZTNfX19iaXQgMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19idXNfb2Vfc2V0X21hc2tfb2Zmc2V0IDQ4CisKKy8qIFJlZ2lzdGVyIHJfYnVzX2luLCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHIgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9idXNfaW5fb2Zmc2V0IDUyCisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19jbHJfbWFzaywgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19naW9fY2xyX21hc2tfX192YWxfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19naW9fY2xyX21hc2tfX192YWxfX193aWR0aCAzMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19naW9fY2xyX21hc2tfb2Zmc2V0IDU2CisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19zZXRfbWFzaywgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19naW9fc2V0X21hc2tfX192YWxfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19naW9fc2V0X21hc2tfX192YWxfX193aWR0aCAzMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19naW9fc2V0X21hc2tfb2Zmc2V0IDYwCisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19vZV9jbHJfbWFzaywgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19naW9fb2VfY2xyX21hc2tfX192YWxfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19naW9fb2VfY2xyX21hc2tfX192YWxfX193aWR0aCAzMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19naW9fb2VfY2xyX21hc2tfb2Zmc2V0IDY0CisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19vZV9zZXRfbWFzaywgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19naW9fb2Vfc2V0X21hc2tfX192YWxfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19naW9fb2Vfc2V0X21hc2tfX192YWxfX193aWR0aCAzMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19naW9fb2Vfc2V0X21hc2tfb2Zmc2V0IDY4CisKKy8qIFJlZ2lzdGVyIHJfZ2lvX2luLCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHIgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9naW9faW5fb2Zmc2V0IDcyCisKKy8qIFJlZ2lzdGVyIHJ3X2NwdV9pbnRyLCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjBfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIwX19fYml0IDAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMV9fX2xzYiAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjFfX19iaXQgMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIyX19fbHNiIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMl9fX2JpdCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjNfX19sc2IgMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIzX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIzX19fYml0IDMKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyNF9fX2xzYiA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjRfX19iaXQgNAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHI1X19fbHNiIDUKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyNV9fX2JpdCA1CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjZfX19sc2IgNgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHI2X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHI2X19fYml0IDYKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyN19fX2xzYiA3CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjdfX19iaXQgNworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHI4X19fbHNiIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyOF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyOF9fX2JpdCA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjlfX19sc2IgOQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHI5X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHI5X19fYml0IDkKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMTBfX19sc2IgMTAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMTBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjEwX19fYml0IDEwCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjExX19fbHNiIDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjExX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIxMV9fX2JpdCAxMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIxMl9fX2xzYiAxMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIxMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMTJfX19iaXQgMTIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMTNfX19sc2IgMTMKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMTNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjEzX19fYml0IDEzCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjE0X19fbHNiIDE0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjE0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIxNF9fX2JpdCAxNAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIxNV9fX2xzYiAxNQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIxNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMTVfX19iaXQgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMTZfX19sc2IgMTYKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMTZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjE2X19fYml0IDE2CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjE3X19fbHNiIDE3CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjE3X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIxN19fX2JpdCAxNworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIxOF9fX2xzYiAxOAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIxOF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMThfX19iaXQgMTgKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMTlfX19sc2IgMTkKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMTlfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjE5X19fYml0IDE5CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjIwX19fbHNiIDIwCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjIwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIyMF9fX2JpdCAyMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIyMV9fX2xzYiAyMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIyMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMjFfX19iaXQgMjEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMjJfX19sc2IgMjIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMjJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjIyX19fYml0IDIyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjIzX19fbHNiIDIzCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjIzX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIyM19fX2JpdCAyMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIyNF9fX2xzYiAyNAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIyNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMjRfX19iaXQgMjQKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMjVfX19sc2IgMjUKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMjVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjI1X19fYml0IDI1CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjI2X19fbHNiIDI2CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjI2X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIyNl9fX2JpdCAyNgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIyN19fX2xzYiAyNworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIyN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMjdfX19iaXQgMjcKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMjhfX19sc2IgMjgKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMjhfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjI4X19fYml0IDI4CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjI5X19fbHNiIDI5CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjI5X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIyOV9fX2JpdCAyOQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIzMF9fX2xzYiAzMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19jcHVfaW50cl9fX2ludHIzMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMzBfX19iaXQgMzAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMzFfX19sc2IgMzEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHJfX19pbnRyMzFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX19faW50cjMxX19fYml0IDMxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2NwdV9pbnRyX29mZnNldCA3NgorCisvKiBSZWdpc3RlciByX2NwdV9pbnRyLCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHIgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIwX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjBfX19iaXQgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjFfX19sc2IgMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMV9fX2JpdCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMl9fX2xzYiAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIyX19fYml0IDIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIzX19fbHNiIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIzX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjNfX19iaXQgMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjRfX19sc2IgNAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyNF9fX2JpdCA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyNV9fX2xzYiA1CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHI1X19fYml0IDUKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHI2X19fbHNiIDYKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHI2X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjZfX19iaXQgNgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjdfX19sc2IgNworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyN19fX2JpdCA3CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyOF9fX2xzYiA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyOF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHI4X19fYml0IDgKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHI5X19fbHNiIDkKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHI5X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjlfX19iaXQgOQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjEwX19fbHNiIDEwCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMTBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMTBfX19iaXQgMTAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIxMV9fX2xzYiAxMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjExX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjExX19fYml0IDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMTJfX19sc2IgMTIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIxMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIxMl9fX2JpdCAxMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjEzX19fbHNiIDEzCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMTNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMTNfX19iaXQgMTMKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIxNF9fX2xzYiAxNAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjE0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjE0X19fYml0IDE0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMTVfX19sc2IgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIxNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIxNV9fX2JpdCAxNQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjE2X19fbHNiIDE2CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMTZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMTZfX19iaXQgMTYKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIxN19fX2xzYiAxNworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjE3X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjE3X19fYml0IDE3CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMThfX19sc2IgMTgKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIxOF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIxOF9fX2JpdCAxOAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjE5X19fbHNiIDE5CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMTlfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMTlfX19iaXQgMTkKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIyMF9fX2xzYiAyMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjIwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjIwX19fYml0IDIwCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMjFfX19sc2IgMjEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIyMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIyMV9fX2JpdCAyMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjIyX19fbHNiIDIyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMjJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMjJfX19iaXQgMjIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIyM19fX2xzYiAyMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjIzX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjIzX19fYml0IDIzCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMjRfX19sc2IgMjQKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIyNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIyNF9fX2JpdCAyNAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjI1X19fbHNiIDI1CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMjVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMjVfX19iaXQgMjUKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIyNl9fX2xzYiAyNgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjI2X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjI2X19fYml0IDI2CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMjdfX19sc2IgMjcKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIyN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIyN19fX2JpdCAyNworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjI4X19fbHNiIDI4CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMjhfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMjhfX19iaXQgMjgKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIyOV9fX2xzYiAyOQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjI5X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjI5X19fYml0IDI5CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMzBfX19sc2IgMzAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIzMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9fX2ludHIzMF9fX2JpdCAzMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyX19faW50cjMxX19fbHNiIDMxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMzFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfY3B1X2ludHJfX19pbnRyMzFfX19iaXQgMzEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9jcHVfaW50cl9vZmZzZXQgODAKKworLyogUmVnaXN0ZXIgcndfaW50cl9ncnAwX21hc2ssIHNjb3BlIGlvcF9zd19tcHUsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAwX21hc2tfX19zcHVfaW50cjBfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDBfbWFza19fX3NwdV9pbnRyMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAwX21hc2tfX19zcHVfaW50cjBfX19iaXQgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDBfbWFza19fX3RyaWdnZXJfZ3JwMF9fX2xzYiAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMF9tYXNrX19fdHJpZ2dlcl9ncnAwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDBfbWFza19fX3RyaWdnZXJfZ3JwMF9fX2JpdCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMF9tYXNrX19fdGltZXJfZ3JwMF9fX2xzYiAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMF9tYXNrX19fdGltZXJfZ3JwMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAwX21hc2tfX190aW1lcl9ncnAwX19fYml0IDIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAwX21hc2tfX19maWZvX291dF9fX2xzYiAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMF9tYXNrX19fZmlmb19vdXRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMF9tYXNrX19fZmlmb19vdXRfX19iaXQgMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDBfbWFza19fX3NwdV9pbnRyMV9fX2xzYiA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMF9tYXNrX19fc3B1X2ludHIxX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDBfbWFza19fX3NwdV9pbnRyMV9fX2JpdCA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMF9tYXNrX19fdHJpZ2dlcl9ncnAxX19fbHNiIDUKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAwX21hc2tfX190cmlnZ2VyX2dycDFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMF9tYXNrX19fdHJpZ2dlcl9ncnAxX19fYml0IDUKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAwX21hc2tfX190aW1lcl9ncnAxX19fbHNiIDYKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAwX21hc2tfX190aW1lcl9ncnAxX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDBfbWFza19fX3RpbWVyX2dycDFfX19iaXQgNgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDBfbWFza19fX2ZpZm9faW5fX19sc2IgNworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDBfbWFza19fX2ZpZm9faW5fX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMF9tYXNrX19fZmlmb19pbl9fX2JpdCA3CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMF9tYXNrX19fc3B1X2ludHIyX19fbHNiIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAwX21hc2tfX19zcHVfaW50cjJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMF9tYXNrX19fc3B1X2ludHIyX19fYml0IDgKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAwX21hc2tfX190cmlnZ2VyX2dycDJfX19sc2IgOQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDBfbWFza19fX3RyaWdnZXJfZ3JwMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAwX21hc2tfX190cmlnZ2VyX2dycDJfX19iaXQgOQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDBfbWFza19fX2ZpZm9fb3V0X2V4dHJhX19fbHNiIDEwCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMF9tYXNrX19fZmlmb19vdXRfZXh0cmFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMF9tYXNrX19fZmlmb19vdXRfZXh0cmFfX19iaXQgMTAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAwX21hc2tfX19kbWNfb3V0X19fbHNiIDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMF9tYXNrX19fZG1jX291dF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAwX21hc2tfX19kbWNfb3V0X19fYml0IDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMF9tYXNrX19fc3B1X2ludHIzX19fbHNiIDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMF9tYXNrX19fc3B1X2ludHIzX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDBfbWFza19fX3NwdV9pbnRyM19fX2JpdCAxMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDBfbWFza19fX3RyaWdnZXJfZ3JwM19fX2xzYiAxMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDBfbWFza19fX3RyaWdnZXJfZ3JwM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAwX21hc2tfX190cmlnZ2VyX2dycDNfX19iaXQgMTMKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAwX21hc2tfX19maWZvX2luX2V4dHJhX19fbHNiIDE0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMF9tYXNrX19fZmlmb19pbl9leHRyYV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAwX21hc2tfX19maWZvX2luX2V4dHJhX19fYml0IDE0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMF9tYXNrX19fZG1jX2luX19fbHNiIDE1CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMF9tYXNrX19fZG1jX2luX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDBfbWFza19fX2RtY19pbl9fX2JpdCAxNQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDBfbWFza19vZmZzZXQgODQKKworLyogUmVnaXN0ZXIgcndfYWNrX2ludHJfZ3JwMCwgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAwX19fc3B1X2ludHIwX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYWNrX2ludHJfZ3JwMF9fX3NwdV9pbnRyMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYWNrX2ludHJfZ3JwMF9fX3NwdV9pbnRyMF9fX2JpdCAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2Fja19pbnRyX2dycDBfX19zcHVfaW50cjFfX19sc2IgNAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAwX19fc3B1X2ludHIxX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAwX19fc3B1X2ludHIxX19fYml0IDQKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYWNrX2ludHJfZ3JwMF9fX3NwdV9pbnRyMl9fX2xzYiA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2Fja19pbnRyX2dycDBfX19zcHVfaW50cjJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2Fja19pbnRyX2dycDBfX19zcHVfaW50cjJfX19iaXQgOAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAwX19fc3B1X2ludHIzX19fbHNiIDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2Fja19pbnRyX2dycDBfX19zcHVfaW50cjNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2Fja19pbnRyX2dycDBfX19zcHVfaW50cjNfX19iaXQgMTIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYWNrX2ludHJfZ3JwMF9vZmZzZXQgODgKKworLyogUmVnaXN0ZXIgcl9pbnRyX2dycDAsIHNjb3BlIGlvcF9zd19tcHUsIHR5cGUgciAqLworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMF9fX3NwdV9pbnRyMF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAwX19fc3B1X2ludHIwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMF9fX3NwdV9pbnRyMF9fX2JpdCAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAwX19fdHJpZ2dlcl9ncnAwX19fbHNiIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDBfX190cmlnZ2VyX2dycDBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAwX19fdHJpZ2dlcl9ncnAwX19fYml0IDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDBfX190aW1lcl9ncnAwX19fbHNiIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDBfX190aW1lcl9ncnAwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMF9fX3RpbWVyX2dycDBfX19iaXQgMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMF9fX2ZpZm9fb3V0X19fbHNiIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDBfX19maWZvX291dF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDBfX19maWZvX291dF9fX2JpdCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAwX19fc3B1X2ludHIxX19fbHNiIDQKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDBfX19zcHVfaW50cjFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAwX19fc3B1X2ludHIxX19fYml0IDQKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDBfX190cmlnZ2VyX2dycDFfX19sc2IgNQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMF9fX3RyaWdnZXJfZ3JwMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDBfX190cmlnZ2VyX2dycDFfX19iaXQgNQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMF9fX3RpbWVyX2dycDFfX19sc2IgNgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMF9fX3RpbWVyX2dycDFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAwX19fdGltZXJfZ3JwMV9fX2JpdCA2CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAwX19fZmlmb19pbl9fX2xzYiA3CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAwX19fZmlmb19pbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDBfX19maWZvX2luX19fYml0IDcKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDBfX19zcHVfaW50cjJfX19sc2IgOAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMF9fX3NwdV9pbnRyMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDBfX19zcHVfaW50cjJfX19iaXQgOAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMF9fX3RyaWdnZXJfZ3JwMl9fX2xzYiA5CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAwX19fdHJpZ2dlcl9ncnAyX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMF9fX3RyaWdnZXJfZ3JwMl9fX2JpdCA5CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAwX19fZmlmb19vdXRfZXh0cmFfX19sc2IgMTAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDBfX19maWZvX291dF9leHRyYV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDBfX19maWZvX291dF9leHRyYV9fX2JpdCAxMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMF9fX2RtY19vdXRfX19sc2IgMTEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDBfX19kbWNfb3V0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMF9fX2RtY19vdXRfX19iaXQgMTEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDBfX19zcHVfaW50cjNfX19sc2IgMTIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDBfX19zcHVfaW50cjNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAwX19fc3B1X2ludHIzX19fYml0IDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAwX19fdHJpZ2dlcl9ncnAzX19fbHNiIDEzCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAwX19fdHJpZ2dlcl9ncnAzX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMF9fX3RyaWdnZXJfZ3JwM19fX2JpdCAxMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMF9fX2ZpZm9faW5fZXh0cmFfX19sc2IgMTQKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDBfX19maWZvX2luX2V4dHJhX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMF9fX2ZpZm9faW5fZXh0cmFfX19iaXQgMTQKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDBfX19kbWNfaW5fX19sc2IgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDBfX19kbWNfaW5fX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAwX19fZG1jX2luX19fYml0IDE1CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAwX29mZnNldCA5MgorCisvKiBSZWdpc3RlciByX21hc2tlZF9pbnRyX2dycDAsIHNjb3BlIGlvcF9zd19tcHUsIHR5cGUgciAqLworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDBfX19zcHVfaW50cjBfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDBfX19zcHVfaW50cjBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMF9fX3NwdV9pbnRyMF9fX2JpdCAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMF9fX3RyaWdnZXJfZ3JwMF9fX2xzYiAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMF9fX3RyaWdnZXJfZ3JwMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAwX19fdHJpZ2dlcl9ncnAwX19fYml0IDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAwX19fdGltZXJfZ3JwMF9fX2xzYiAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMF9fX3RpbWVyX2dycDBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMF9fX3RpbWVyX2dycDBfX19iaXQgMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDBfX19maWZvX291dF9fX2xzYiAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMF9fX2ZpZm9fb3V0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDBfX19maWZvX291dF9fX2JpdCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMF9fX3NwdV9pbnRyMV9fX2xzYiA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMF9fX3NwdV9pbnRyMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAwX19fc3B1X2ludHIxX19fYml0IDQKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAwX19fdHJpZ2dlcl9ncnAxX19fbHNiIDUKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAwX19fdHJpZ2dlcl9ncnAxX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDBfX190cmlnZ2VyX2dycDFfX19iaXQgNQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDBfX190aW1lcl9ncnAxX19fbHNiIDYKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAwX19fdGltZXJfZ3JwMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAwX19fdGltZXJfZ3JwMV9fX2JpdCA2CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMF9fX2ZpZm9faW5fX19sc2IgNworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDBfX19maWZvX2luX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDBfX19maWZvX2luX19fYml0IDcKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAwX19fc3B1X2ludHIyX19fbHNiIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAwX19fc3B1X2ludHIyX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDBfX19zcHVfaW50cjJfX19iaXQgOAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDBfX190cmlnZ2VyX2dycDJfX19sc2IgOQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDBfX190cmlnZ2VyX2dycDJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMF9fX3RyaWdnZXJfZ3JwMl9fX2JpdCA5CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMF9fX2ZpZm9fb3V0X2V4dHJhX19fbHNiIDEwCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMF9fX2ZpZm9fb3V0X2V4dHJhX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDBfX19maWZvX291dF9leHRyYV9fX2JpdCAxMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDBfX19kbWNfb3V0X19fbHNiIDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMF9fX2RtY19vdXRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMF9fX2RtY19vdXRfX19iaXQgMTEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAwX19fc3B1X2ludHIzX19fbHNiIDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMF9fX3NwdV9pbnRyM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAwX19fc3B1X2ludHIzX19fYml0IDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMF9fX3RyaWdnZXJfZ3JwM19fX2xzYiAxMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDBfX190cmlnZ2VyX2dycDNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMF9fX3RyaWdnZXJfZ3JwM19fX2JpdCAxMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDBfX19maWZvX2luX2V4dHJhX19fbHNiIDE0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMF9fX2ZpZm9faW5fZXh0cmFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMF9fX2ZpZm9faW5fZXh0cmFfX19iaXQgMTQKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAwX19fZG1jX2luX19fbHNiIDE1CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMF9fX2RtY19pbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAwX19fZG1jX2luX19fYml0IDE1CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMF9vZmZzZXQgOTYKKworLyogUmVnaXN0ZXIgcndfaW50cl9ncnAxX21hc2ssIHNjb3BlIGlvcF9zd19tcHUsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAxX21hc2tfX19zcHVfaW50cjRfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDFfbWFza19fX3NwdV9pbnRyNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAxX21hc2tfX19zcHVfaW50cjRfX19iaXQgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDFfbWFza19fX3RyaWdnZXJfZ3JwNF9fX2xzYiAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMV9tYXNrX19fdHJpZ2dlcl9ncnA0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDFfbWFza19fX3RyaWdnZXJfZ3JwNF9fX2JpdCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMV9tYXNrX19fZmlmb19vdXRfZXh0cmFfX19sc2IgMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDFfbWFza19fX2ZpZm9fb3V0X2V4dHJhX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDFfbWFza19fX2ZpZm9fb3V0X2V4dHJhX19fYml0IDIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAxX21hc2tfX19kbWNfb3V0X19fbHNiIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAxX21hc2tfX19kbWNfb3V0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDFfbWFza19fX2RtY19vdXRfX19iaXQgMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDFfbWFza19fX3NwdV9pbnRyNV9fX2xzYiA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMV9tYXNrX19fc3B1X2ludHI1X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDFfbWFza19fX3NwdV9pbnRyNV9fX2JpdCA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMV9tYXNrX19fdHJpZ2dlcl9ncnA1X19fbHNiIDUKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAxX21hc2tfX190cmlnZ2VyX2dycDVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMV9tYXNrX19fdHJpZ2dlcl9ncnA1X19fYml0IDUKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAxX21hc2tfX19maWZvX2luX2V4dHJhX19fbHNiIDYKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAxX21hc2tfX19maWZvX2luX2V4dHJhX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDFfbWFza19fX2ZpZm9faW5fZXh0cmFfX19iaXQgNgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDFfbWFza19fX2RtY19pbl9fX2xzYiA3CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMV9tYXNrX19fZG1jX2luX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDFfbWFza19fX2RtY19pbl9fX2JpdCA3CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMV9tYXNrX19fc3B1X2ludHI2X19fbHNiIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAxX21hc2tfX19zcHVfaW50cjZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMV9tYXNrX19fc3B1X2ludHI2X19fYml0IDgKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAxX21hc2tfX190cmlnZ2VyX2dycDZfX19sc2IgOQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDFfbWFza19fX3RyaWdnZXJfZ3JwNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAxX21hc2tfX190cmlnZ2VyX2dycDZfX19iaXQgOQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDFfbWFza19fX3RpbWVyX2dycDBfX19sc2IgMTAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAxX21hc2tfX190aW1lcl9ncnAwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDFfbWFza19fX3RpbWVyX2dycDBfX19iaXQgMTAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAxX21hc2tfX19maWZvX291dF9fX2xzYiAxMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDFfbWFza19fX2ZpZm9fb3V0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDFfbWFza19fX2ZpZm9fb3V0X19fYml0IDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMV9tYXNrX19fc3B1X2ludHI3X19fbHNiIDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMV9tYXNrX19fc3B1X2ludHI3X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDFfbWFza19fX3NwdV9pbnRyN19fX2JpdCAxMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDFfbWFza19fX3RyaWdnZXJfZ3JwN19fX2xzYiAxMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDFfbWFza19fX3RyaWdnZXJfZ3JwN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAxX21hc2tfX190cmlnZ2VyX2dycDdfX19iaXQgMTMKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAxX21hc2tfX190aW1lcl9ncnAxX19fbHNiIDE0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMV9tYXNrX19fdGltZXJfZ3JwMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAxX21hc2tfX190aW1lcl9ncnAxX19fYml0IDE0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMV9tYXNrX19fZmlmb19pbl9fX2xzYiAxNQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDFfbWFza19fX2ZpZm9faW5fX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMV9tYXNrX19fZmlmb19pbl9fX2JpdCAxNQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDFfbWFza19vZmZzZXQgMTAwCisKKy8qIFJlZ2lzdGVyIHJ3X2Fja19pbnRyX2dycDEsIHNjb3BlIGlvcF9zd19tcHUsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYWNrX2ludHJfZ3JwMV9fX3NwdV9pbnRyNF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2Fja19pbnRyX2dycDFfX19zcHVfaW50cjRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2Fja19pbnRyX2dycDFfX19zcHVfaW50cjRfX19iaXQgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAxX19fc3B1X2ludHI1X19fbHNiIDQKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYWNrX2ludHJfZ3JwMV9fX3NwdV9pbnRyNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYWNrX2ludHJfZ3JwMV9fX3NwdV9pbnRyNV9fX2JpdCA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2Fja19pbnRyX2dycDFfX19zcHVfaW50cjZfX19sc2IgOAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAxX19fc3B1X2ludHI2X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAxX19fc3B1X2ludHI2X19fYml0IDgKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYWNrX2ludHJfZ3JwMV9fX3NwdV9pbnRyN19fX2xzYiAxMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAxX19fc3B1X2ludHI3X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAxX19fc3B1X2ludHI3X19fYml0IDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2Fja19pbnRyX2dycDFfb2Zmc2V0IDEwNAorCisvKiBSZWdpc3RlciByX2ludHJfZ3JwMSwgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSByICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAxX19fc3B1X2ludHI0X19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDFfX19zcHVfaW50cjRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAxX19fc3B1X2ludHI0X19fYml0IDAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDFfX190cmlnZ2VyX2dycDRfX19sc2IgMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMV9fX3RyaWdnZXJfZ3JwNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDFfX190cmlnZ2VyX2dycDRfX19iaXQgMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMV9fX2ZpZm9fb3V0X2V4dHJhX19fbHNiIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDFfX19maWZvX291dF9leHRyYV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDFfX19maWZvX291dF9leHRyYV9fX2JpdCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAxX19fZG1jX291dF9fX2xzYiAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAxX19fZG1jX291dF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDFfX19kbWNfb3V0X19fYml0IDMKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDFfX19zcHVfaW50cjVfX19sc2IgNAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMV9fX3NwdV9pbnRyNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDFfX19zcHVfaW50cjVfX19iaXQgNAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMV9fX3RyaWdnZXJfZ3JwNV9fX2xzYiA1CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAxX19fdHJpZ2dlcl9ncnA1X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMV9fX3RyaWdnZXJfZ3JwNV9fX2JpdCA1CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAxX19fZmlmb19pbl9leHRyYV9fX2xzYiA2CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAxX19fZmlmb19pbl9leHRyYV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDFfX19maWZvX2luX2V4dHJhX19fYml0IDYKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDFfX19kbWNfaW5fX19sc2IgNworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMV9fX2RtY19pbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDFfX19kbWNfaW5fX19iaXQgNworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMV9fX3NwdV9pbnRyNl9fX2xzYiA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAxX19fc3B1X2ludHI2X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMV9fX3NwdV9pbnRyNl9fX2JpdCA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAxX19fdHJpZ2dlcl9ncnA2X19fbHNiIDkKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDFfX190cmlnZ2VyX2dycDZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAxX19fdHJpZ2dlcl9ncnA2X19fYml0IDkKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDFfX190aW1lcl9ncnAwX19fbHNiIDEwCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAxX19fdGltZXJfZ3JwMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDFfX190aW1lcl9ncnAwX19fYml0IDEwCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAxX19fZmlmb19vdXRfX19sc2IgMTEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDFfX19maWZvX291dF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDFfX19maWZvX291dF9fX2JpdCAxMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMV9fX3NwdV9pbnRyN19fX2xzYiAxMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMV9fX3NwdV9pbnRyN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDFfX19zcHVfaW50cjdfX19iaXQgMTIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDFfX190cmlnZ2VyX2dycDdfX19sc2IgMTMKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDFfX190cmlnZ2VyX2dycDdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAxX19fdHJpZ2dlcl9ncnA3X19fYml0IDEzCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAxX19fdGltZXJfZ3JwMV9fX2xzYiAxNAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMV9fX3RpbWVyX2dycDFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAxX19fdGltZXJfZ3JwMV9fX2JpdCAxNAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMV9fX2ZpZm9faW5fX19sc2IgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDFfX19maWZvX2luX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMV9fX2ZpZm9faW5fX19iaXQgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDFfb2Zmc2V0IDEwOAorCisvKiBSZWdpc3RlciByX21hc2tlZF9pbnRyX2dycDEsIHNjb3BlIGlvcF9zd19tcHUsIHR5cGUgciAqLworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDFfX19zcHVfaW50cjRfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDFfX19zcHVfaW50cjRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMV9fX3NwdV9pbnRyNF9fX2JpdCAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMV9fX3RyaWdnZXJfZ3JwNF9fX2xzYiAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMV9fX3RyaWdnZXJfZ3JwNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAxX19fdHJpZ2dlcl9ncnA0X19fYml0IDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAxX19fZmlmb19vdXRfZXh0cmFfX19sc2IgMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDFfX19maWZvX291dF9leHRyYV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAxX19fZmlmb19vdXRfZXh0cmFfX19iaXQgMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDFfX19kbWNfb3V0X19fbHNiIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAxX19fZG1jX291dF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAxX19fZG1jX291dF9fX2JpdCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMV9fX3NwdV9pbnRyNV9fX2xzYiA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMV9fX3NwdV9pbnRyNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAxX19fc3B1X2ludHI1X19fYml0IDQKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAxX19fdHJpZ2dlcl9ncnA1X19fbHNiIDUKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAxX19fdHJpZ2dlcl9ncnA1X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDFfX190cmlnZ2VyX2dycDVfX19iaXQgNQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDFfX19maWZvX2luX2V4dHJhX19fbHNiIDYKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAxX19fZmlmb19pbl9leHRyYV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAxX19fZmlmb19pbl9leHRyYV9fX2JpdCA2CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMV9fX2RtY19pbl9fX2xzYiA3CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMV9fX2RtY19pbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAxX19fZG1jX2luX19fYml0IDcKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAxX19fc3B1X2ludHI2X19fbHNiIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAxX19fc3B1X2ludHI2X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDFfX19zcHVfaW50cjZfX19iaXQgOAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDFfX190cmlnZ2VyX2dycDZfX19sc2IgOQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDFfX190cmlnZ2VyX2dycDZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMV9fX3RyaWdnZXJfZ3JwNl9fX2JpdCA5CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMV9fX3RpbWVyX2dycDBfX19sc2IgMTAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAxX19fdGltZXJfZ3JwMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAxX19fdGltZXJfZ3JwMF9fX2JpdCAxMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDFfX19maWZvX291dF9fX2xzYiAxMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDFfX19maWZvX291dF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAxX19fZmlmb19vdXRfX19iaXQgMTEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAxX19fc3B1X2ludHI3X19fbHNiIDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMV9fX3NwdV9pbnRyN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAxX19fc3B1X2ludHI3X19fYml0IDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMV9fX3RyaWdnZXJfZ3JwN19fX2xzYiAxMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDFfX190cmlnZ2VyX2dycDdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMV9fX3RyaWdnZXJfZ3JwN19fX2JpdCAxMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDFfX190aW1lcl9ncnAxX19fbHNiIDE0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMV9fX3RpbWVyX2dycDFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMV9fX3RpbWVyX2dycDFfX19iaXQgMTQKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAxX19fZmlmb19pbl9fX2xzYiAxNQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDFfX19maWZvX2luX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDFfX19maWZvX2luX19fYml0IDE1CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMV9vZmZzZXQgMTEyCisKKy8qIFJlZ2lzdGVyIHJ3X2ludHJfZ3JwMl9tYXNrLCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMl9tYXNrX19fc3B1X2ludHI4X19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAyX21hc2tfX19zcHVfaW50cjhfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMl9tYXNrX19fc3B1X2ludHI4X19fYml0IDAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAyX21hc2tfX190cmlnZ2VyX2dycDBfX19sc2IgMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDJfbWFza19fX3RyaWdnZXJfZ3JwMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAyX21hc2tfX190cmlnZ2VyX2dycDBfX19iaXQgMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDJfbWFza19fX3RpbWVyX2dycDBfX19sc2IgMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDJfbWFza19fX3RpbWVyX2dycDBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMl9tYXNrX19fdGltZXJfZ3JwMF9fX2JpdCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMl9tYXNrX19fZmlmb19vdXRfX19sc2IgMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDJfbWFza19fX2ZpZm9fb3V0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDJfbWFza19fX2ZpZm9fb3V0X19fYml0IDMKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAyX21hc2tfX19zcHVfaW50cjlfX19sc2IgNAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDJfbWFza19fX3NwdV9pbnRyOV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAyX21hc2tfX19zcHVfaW50cjlfX19iaXQgNAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDJfbWFza19fX3RyaWdnZXJfZ3JwMV9fX2xzYiA1CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMl9tYXNrX19fdHJpZ2dlcl9ncnAxX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDJfbWFza19fX3RyaWdnZXJfZ3JwMV9fX2JpdCA1CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMl9tYXNrX19fdGltZXJfZ3JwMV9fX2xzYiA2CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMl9tYXNrX19fdGltZXJfZ3JwMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAyX21hc2tfX190aW1lcl9ncnAxX19fYml0IDYKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAyX21hc2tfX19maWZvX2luX19fbHNiIDcKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAyX21hc2tfX19maWZvX2luX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDJfbWFza19fX2ZpZm9faW5fX19iaXQgNworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDJfbWFza19fX3NwdV9pbnRyMTBfX19sc2IgOAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDJfbWFza19fX3NwdV9pbnRyMTBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMl9tYXNrX19fc3B1X2ludHIxMF9fX2JpdCA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMl9tYXNrX19fdHJpZ2dlcl9ncnAyX19fbHNiIDkKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAyX21hc2tfX190cmlnZ2VyX2dycDJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMl9tYXNrX19fdHJpZ2dlcl9ncnAyX19fYml0IDkKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAyX21hc2tfX19maWZvX291dF9leHRyYV9fX2xzYiAxMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDJfbWFza19fX2ZpZm9fb3V0X2V4dHJhX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDJfbWFza19fX2ZpZm9fb3V0X2V4dHJhX19fYml0IDEwCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMl9tYXNrX19fZG1jX291dF9fX2xzYiAxMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDJfbWFza19fX2RtY19vdXRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMl9tYXNrX19fZG1jX291dF9fX2JpdCAxMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDJfbWFza19fX3NwdV9pbnRyMTFfX19sc2IgMTIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAyX21hc2tfX19zcHVfaW50cjExX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDJfbWFza19fX3NwdV9pbnRyMTFfX19iaXQgMTIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAyX21hc2tfX190cmlnZ2VyX2dycDNfX19sc2IgMTMKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAyX21hc2tfX190cmlnZ2VyX2dycDNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMl9tYXNrX19fdHJpZ2dlcl9ncnAzX19fYml0IDEzCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMl9tYXNrX19fZmlmb19pbl9leHRyYV9fX2xzYiAxNAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDJfbWFza19fX2ZpZm9faW5fZXh0cmFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMl9tYXNrX19fZmlmb19pbl9leHRyYV9fX2JpdCAxNAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDJfbWFza19fX2RtY19pbl9fX2xzYiAxNQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDJfbWFza19fX2RtY19pbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAyX21hc2tfX19kbWNfaW5fX19iaXQgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAyX21hc2tfb2Zmc2V0IDExNgorCisvKiBSZWdpc3RlciByd19hY2tfaW50cl9ncnAyLCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2Fja19pbnRyX2dycDJfX19zcHVfaW50cjhfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAyX19fc3B1X2ludHI4X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAyX19fc3B1X2ludHI4X19fYml0IDAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYWNrX2ludHJfZ3JwMl9fX3NwdV9pbnRyOV9fX2xzYiA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2Fja19pbnRyX2dycDJfX19zcHVfaW50cjlfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2Fja19pbnRyX2dycDJfX19zcHVfaW50cjlfX19iaXQgNAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAyX19fc3B1X2ludHIxMF9fX2xzYiA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2Fja19pbnRyX2dycDJfX19zcHVfaW50cjEwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAyX19fc3B1X2ludHIxMF9fX2JpdCA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2Fja19pbnRyX2dycDJfX19zcHVfaW50cjExX19fbHNiIDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2Fja19pbnRyX2dycDJfX19zcHVfaW50cjExX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAyX19fc3B1X2ludHIxMV9fX2JpdCAxMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAyX29mZnNldCAxMjAKKworLyogUmVnaXN0ZXIgcl9pbnRyX2dycDIsIHNjb3BlIGlvcF9zd19tcHUsIHR5cGUgciAqLworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMl9fX3NwdV9pbnRyOF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAyX19fc3B1X2ludHI4X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMl9fX3NwdV9pbnRyOF9fX2JpdCAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAyX19fdHJpZ2dlcl9ncnAwX19fbHNiIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDJfX190cmlnZ2VyX2dycDBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAyX19fdHJpZ2dlcl9ncnAwX19fYml0IDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDJfX190aW1lcl9ncnAwX19fbHNiIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDJfX190aW1lcl9ncnAwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMl9fX3RpbWVyX2dycDBfX19iaXQgMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMl9fX2ZpZm9fb3V0X19fbHNiIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDJfX19maWZvX291dF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDJfX19maWZvX291dF9fX2JpdCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAyX19fc3B1X2ludHI5X19fbHNiIDQKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDJfX19zcHVfaW50cjlfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAyX19fc3B1X2ludHI5X19fYml0IDQKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDJfX190cmlnZ2VyX2dycDFfX19sc2IgNQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMl9fX3RyaWdnZXJfZ3JwMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDJfX190cmlnZ2VyX2dycDFfX19iaXQgNQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMl9fX3RpbWVyX2dycDFfX19sc2IgNgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMl9fX3RpbWVyX2dycDFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAyX19fdGltZXJfZ3JwMV9fX2JpdCA2CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAyX19fZmlmb19pbl9fX2xzYiA3CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAyX19fZmlmb19pbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDJfX19maWZvX2luX19fYml0IDcKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDJfX19zcHVfaW50cjEwX19fbHNiIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDJfX19zcHVfaW50cjEwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMl9fX3NwdV9pbnRyMTBfX19iaXQgOAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMl9fX3RyaWdnZXJfZ3JwMl9fX2xzYiA5CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAyX19fdHJpZ2dlcl9ncnAyX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMl9fX3RyaWdnZXJfZ3JwMl9fX2JpdCA5CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAyX19fZmlmb19vdXRfZXh0cmFfX19sc2IgMTAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDJfX19maWZvX291dF9leHRyYV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDJfX19maWZvX291dF9leHRyYV9fX2JpdCAxMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMl9fX2RtY19vdXRfX19sc2IgMTEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDJfX19kbWNfb3V0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMl9fX2RtY19vdXRfX19iaXQgMTEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDJfX19zcHVfaW50cjExX19fbHNiIDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAyX19fc3B1X2ludHIxMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDJfX19zcHVfaW50cjExX19fYml0IDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAyX19fdHJpZ2dlcl9ncnAzX19fbHNiIDEzCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAyX19fdHJpZ2dlcl9ncnAzX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMl9fX3RyaWdnZXJfZ3JwM19fX2JpdCAxMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMl9fX2ZpZm9faW5fZXh0cmFfX19sc2IgMTQKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDJfX19maWZvX2luX2V4dHJhX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwMl9fX2ZpZm9faW5fZXh0cmFfX19iaXQgMTQKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDJfX19kbWNfaW5fX19sc2IgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDJfX19kbWNfaW5fX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAyX19fZG1jX2luX19fYml0IDE1CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAyX29mZnNldCAxMjQKKworLyogUmVnaXN0ZXIgcl9tYXNrZWRfaW50cl9ncnAyLCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHIgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAyX19fc3B1X2ludHI4X19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAyX19fc3B1X2ludHI4X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDJfX19zcHVfaW50cjhfX19iaXQgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDJfX190cmlnZ2VyX2dycDBfX19sc2IgMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDJfX190cmlnZ2VyX2dycDBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMl9fX3RyaWdnZXJfZ3JwMF9fX2JpdCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMl9fX3RpbWVyX2dycDBfX19sc2IgMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDJfX190aW1lcl9ncnAwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDJfX190aW1lcl9ncnAwX19fYml0IDIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAyX19fZmlmb19vdXRfX19sc2IgMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDJfX19maWZvX291dF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAyX19fZmlmb19vdXRfX19iaXQgMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDJfX19zcHVfaW50cjlfX19sc2IgNAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDJfX19zcHVfaW50cjlfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMl9fX3NwdV9pbnRyOV9fX2JpdCA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMl9fX3RyaWdnZXJfZ3JwMV9fX2xzYiA1CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMl9fX3RyaWdnZXJfZ3JwMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAyX19fdHJpZ2dlcl9ncnAxX19fYml0IDUKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAyX19fdGltZXJfZ3JwMV9fX2xzYiA2CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMl9fX3RpbWVyX2dycDFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMl9fX3RpbWVyX2dycDFfX19iaXQgNgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDJfX19maWZvX2luX19fbHNiIDcKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAyX19fZmlmb19pbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAyX19fZmlmb19pbl9fX2JpdCA3CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMl9fX3NwdV9pbnRyMTBfX19sc2IgOAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDJfX19zcHVfaW50cjEwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDJfX19zcHVfaW50cjEwX19fYml0IDgKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAyX19fdHJpZ2dlcl9ncnAyX19fbHNiIDkKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAyX19fdHJpZ2dlcl9ncnAyX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDJfX190cmlnZ2VyX2dycDJfX19iaXQgOQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDJfX19maWZvX291dF9leHRyYV9fX2xzYiAxMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDJfX19maWZvX291dF9leHRyYV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAyX19fZmlmb19vdXRfZXh0cmFfX19iaXQgMTAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAyX19fZG1jX291dF9fX2xzYiAxMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDJfX19kbWNfb3V0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDJfX19kbWNfb3V0X19fYml0IDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMl9fX3NwdV9pbnRyMTFfX19sc2IgMTIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAyX19fc3B1X2ludHIxMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAyX19fc3B1X2ludHIxMV9fX2JpdCAxMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDJfX190cmlnZ2VyX2dycDNfX19sc2IgMTMKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAyX19fdHJpZ2dlcl9ncnAzX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDJfX190cmlnZ2VyX2dycDNfX19iaXQgMTMKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAyX19fZmlmb19pbl9leHRyYV9fX2xzYiAxNAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDJfX19maWZvX2luX2V4dHJhX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDJfX19maWZvX2luX2V4dHJhX19fYml0IDE0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMl9fX2RtY19pbl9fX2xzYiAxNQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDJfX19kbWNfaW5fX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwMl9fX2RtY19pbl9fX2JpdCAxNQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDJfb2Zmc2V0IDEyOAorCisvKiBSZWdpc3RlciByd19pbnRyX2dycDNfbWFzaywgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDNfbWFza19fX3NwdV9pbnRyMTJfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDNfbWFza19fX3NwdV9pbnRyMTJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwM19tYXNrX19fc3B1X2ludHIxMl9fX2JpdCAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwM19tYXNrX19fdHJpZ2dlcl9ncnA0X19fbHNiIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAzX21hc2tfX190cmlnZ2VyX2dycDRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwM19tYXNrX19fdHJpZ2dlcl9ncnA0X19fYml0IDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAzX21hc2tfX19maWZvX291dF9leHRyYV9fX2xzYiAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwM19tYXNrX19fZmlmb19vdXRfZXh0cmFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwM19tYXNrX19fZmlmb19vdXRfZXh0cmFfX19iaXQgMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDNfbWFza19fX2RtY19vdXRfX19sc2IgMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDNfbWFza19fX2RtY19vdXRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwM19tYXNrX19fZG1jX291dF9fX2JpdCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwM19tYXNrX19fc3B1X2ludHIxM19fX2xzYiA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwM19tYXNrX19fc3B1X2ludHIxM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAzX21hc2tfX19zcHVfaW50cjEzX19fYml0IDQKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAzX21hc2tfX190cmlnZ2VyX2dycDVfX19sc2IgNQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDNfbWFza19fX3RyaWdnZXJfZ3JwNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAzX21hc2tfX190cmlnZ2VyX2dycDVfX19iaXQgNQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDNfbWFza19fX2ZpZm9faW5fZXh0cmFfX19sc2IgNgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDNfbWFza19fX2ZpZm9faW5fZXh0cmFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwM19tYXNrX19fZmlmb19pbl9leHRyYV9fX2JpdCA2CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwM19tYXNrX19fZG1jX2luX19fbHNiIDcKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAzX21hc2tfX19kbWNfaW5fX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwM19tYXNrX19fZG1jX2luX19fYml0IDcKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAzX21hc2tfX19zcHVfaW50cjE0X19fbHNiIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAzX21hc2tfX19zcHVfaW50cjE0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDNfbWFza19fX3NwdV9pbnRyMTRfX19iaXQgOAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDNfbWFza19fX3RyaWdnZXJfZ3JwNl9fX2xzYiA5CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwM19tYXNrX19fdHJpZ2dlcl9ncnA2X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDNfbWFza19fX3RyaWdnZXJfZ3JwNl9fX2JpdCA5CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwM19tYXNrX19fdGltZXJfZ3JwMF9fX2xzYiAxMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDNfbWFza19fX3RpbWVyX2dycDBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwM19tYXNrX19fdGltZXJfZ3JwMF9fX2JpdCAxMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDNfbWFza19fX2ZpZm9fb3V0X19fbHNiIDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwM19tYXNrX19fZmlmb19vdXRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwM19tYXNrX19fZmlmb19vdXRfX19iaXQgMTEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAzX21hc2tfX19zcHVfaW50cjE1X19fbHNiIDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwM19tYXNrX19fc3B1X2ludHIxNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAzX21hc2tfX19zcHVfaW50cjE1X19fYml0IDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwM19tYXNrX19fdHJpZ2dlcl9ncnA3X19fbHNiIDEzCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwM19tYXNrX19fdHJpZ2dlcl9ncnA3X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDNfbWFza19fX3RyaWdnZXJfZ3JwN19fX2JpdCAxMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDNfbWFza19fX3RpbWVyX2dycDFfX19sc2IgMTQKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAzX21hc2tfX190aW1lcl9ncnAxX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDNfbWFza19fX3RpbWVyX2dycDFfX19iaXQgMTQKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAzX21hc2tfX19maWZvX2luX19fbHNiIDE1CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwM19tYXNrX19fZmlmb19pbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAzX21hc2tfX19maWZvX2luX19fYml0IDE1CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwM19tYXNrX29mZnNldCAxMzIKKworLyogUmVnaXN0ZXIgcndfYWNrX2ludHJfZ3JwMywgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAzX19fc3B1X2ludHIxMl9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2Fja19pbnRyX2dycDNfX19zcHVfaW50cjEyX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAzX19fc3B1X2ludHIxMl9fX2JpdCAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2Fja19pbnRyX2dycDNfX19zcHVfaW50cjEzX19fbHNiIDQKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYWNrX2ludHJfZ3JwM19fX3NwdV9pbnRyMTNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3J3X2Fja19pbnRyX2dycDNfX19zcHVfaW50cjEzX19fYml0IDQKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYWNrX2ludHJfZ3JwM19fX3NwdV9pbnRyMTRfX19sc2IgOAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAzX19fc3B1X2ludHIxNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYWNrX2ludHJfZ3JwM19fX3NwdV9pbnRyMTRfX19iaXQgOAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAzX19fc3B1X2ludHIxNV9fX2xzYiAxMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAzX19fc3B1X2ludHIxNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYWNrX2ludHJfZ3JwM19fX3NwdV9pbnRyMTVfX19iaXQgMTIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcndfYWNrX2ludHJfZ3JwM19vZmZzZXQgMTM2CisKKy8qIFJlZ2lzdGVyIHJfaW50cl9ncnAzLCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHIgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDNfX19zcHVfaW50cjEyX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDNfX19zcHVfaW50cjEyX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwM19fX3NwdV9pbnRyMTJfX19iaXQgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwM19fX3RyaWdnZXJfZ3JwNF9fX2xzYiAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAzX19fdHJpZ2dlcl9ncnA0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwM19fX3RyaWdnZXJfZ3JwNF9fX2JpdCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAzX19fZmlmb19vdXRfZXh0cmFfX19sc2IgMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwM19fX2ZpZm9fb3V0X2V4dHJhX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwM19fX2ZpZm9fb3V0X2V4dHJhX19fYml0IDIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDNfX19kbWNfb3V0X19fbHNiIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDNfX19kbWNfb3V0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwM19fX2RtY19vdXRfX19iaXQgMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwM19fX3NwdV9pbnRyMTNfX19sc2IgNAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwM19fX3NwdV9pbnRyMTNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAzX19fc3B1X2ludHIxM19fX2JpdCA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAzX19fdHJpZ2dlcl9ncnA1X19fbHNiIDUKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDNfX190cmlnZ2VyX2dycDVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAzX19fdHJpZ2dlcl9ncnA1X19fYml0IDUKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDNfX19maWZvX2luX2V4dHJhX19fbHNiIDYKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDNfX19maWZvX2luX2V4dHJhX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwM19fX2ZpZm9faW5fZXh0cmFfX19iaXQgNgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwM19fX2RtY19pbl9fX2xzYiA3CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAzX19fZG1jX2luX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwM19fX2RtY19pbl9fX2JpdCA3CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAzX19fc3B1X2ludHIxNF9fX2xzYiA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAzX19fc3B1X2ludHIxNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDNfX19zcHVfaW50cjE0X19fYml0IDgKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDNfX190cmlnZ2VyX2dycDZfX19sc2IgOQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwM19fX3RyaWdnZXJfZ3JwNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDNfX190cmlnZ2VyX2dycDZfX19iaXQgOQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwM19fX3RpbWVyX2dycDBfX19sc2IgMTAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDNfX190aW1lcl9ncnAwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwM19fX3RpbWVyX2dycDBfX19iaXQgMTAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDNfX19maWZvX291dF9fX2xzYiAxMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwM19fX2ZpZm9fb3V0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwM19fX2ZpZm9fb3V0X19fYml0IDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAzX19fc3B1X2ludHIxNV9fX2xzYiAxMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwM19fX3NwdV9pbnRyMTVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAzX19fc3B1X2ludHIxNV9fX2JpdCAxMgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwM19fX3RyaWdnZXJfZ3JwN19fX2xzYiAxMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwM19fX3RyaWdnZXJfZ3JwN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDNfX190cmlnZ2VyX2dycDdfX19iaXQgMTMKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDNfX190aW1lcl9ncnAxX19fbHNiIDE0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAzX19fdGltZXJfZ3JwMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDNfX190aW1lcl9ncnAxX19fYml0IDE0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAzX19fZmlmb19pbl9fX2xzYiAxNQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwM19fX2ZpZm9faW5fX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAzX19fZmlmb19pbl9fX2JpdCAxNQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX2ludHJfZ3JwM19vZmZzZXQgMTQwCisKKy8qIFJlZ2lzdGVyIHJfbWFza2VkX2ludHJfZ3JwMywgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSByICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwM19fX3NwdV9pbnRyMTJfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDNfX19zcHVfaW50cjEyX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDNfX19zcHVfaW50cjEyX19fYml0IDAKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAzX19fdHJpZ2dlcl9ncnA0X19fbHNiIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAzX19fdHJpZ2dlcl9ncnA0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDNfX190cmlnZ2VyX2dycDRfX19iaXQgMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDNfX19maWZvX291dF9leHRyYV9fX2xzYiAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwM19fX2ZpZm9fb3V0X2V4dHJhX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDNfX19maWZvX291dF9leHRyYV9fX2JpdCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwM19fX2RtY19vdXRfX19sc2IgMworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDNfX19kbWNfb3V0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDNfX19kbWNfb3V0X19fYml0IDMKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAzX19fc3B1X2ludHIxM19fX2xzYiA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwM19fX3NwdV9pbnRyMTNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwM19fX3NwdV9pbnRyMTNfX19iaXQgNAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDNfX190cmlnZ2VyX2dycDVfX19sc2IgNQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDNfX190cmlnZ2VyX2dycDVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwM19fX3RyaWdnZXJfZ3JwNV9fX2JpdCA1CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwM19fX2ZpZm9faW5fZXh0cmFfX19sc2IgNgorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDNfX19maWZvX2luX2V4dHJhX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDNfX19maWZvX2luX2V4dHJhX19fYml0IDYKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAzX19fZG1jX2luX19fbHNiIDcKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAzX19fZG1jX2luX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDNfX19kbWNfaW5fX19iaXQgNworI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDNfX19zcHVfaW50cjE0X19fbHNiIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAzX19fc3B1X2ludHIxNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAzX19fc3B1X2ludHIxNF9fX2JpdCA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwM19fX3RyaWdnZXJfZ3JwNl9fX2xzYiA5CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwM19fX3RyaWdnZXJfZ3JwNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAzX19fdHJpZ2dlcl9ncnA2X19fYml0IDkKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAzX19fdGltZXJfZ3JwMF9fX2xzYiAxMAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDNfX190aW1lcl9ncnAwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDNfX190aW1lcl9ncnAwX19fYml0IDEwCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwM19fX2ZpZm9fb3V0X19fbHNiIDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwM19fX2ZpZm9fb3V0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDNfX19maWZvX291dF9fX2JpdCAxMQorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDNfX19zcHVfaW50cjE1X19fbHNiIDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwM19fX3NwdV9pbnRyMTVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwM19fX3NwdV9pbnRyMTVfX19iaXQgMTIKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAzX19fdHJpZ2dlcl9ncnA3X19fbHNiIDEzCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwM19fX3RyaWdnZXJfZ3JwN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAzX19fdHJpZ2dlcl9ncnA3X19fYml0IDEzCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwM19fX3RpbWVyX2dycDFfX19sc2IgMTQKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAzX19fdGltZXJfZ3JwMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAzX19fdGltZXJfZ3JwMV9fX2JpdCAxNAorI2RlZmluZSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDNfX19maWZvX2luX19fbHNiIDE1CisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwM19fX2ZpZm9faW5fX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfbXB1X3JfbWFza2VkX2ludHJfZ3JwM19fX2ZpZm9faW5fX19iaXQgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAzX29mZnNldCAxNDQKKworCisvKiBDb25zdGFudHMgKi8KKyNkZWZpbmUgcmVna19pb3Bfc3dfbXB1X2NvcHkgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19tcHVfY3B1ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X21wdV9tcHUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna19pb3Bfc3dfbXB1X25vICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19tcHVfbm9wICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X21wdV9yZCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgcmVna19pb3Bfc3dfbXB1X3JlZ19jb3B5ICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2lvcF9zd19tcHVfcndfYnVzX2Nscl9tYXNrX2RlZmF1bHQgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X21wdV9yd19idXNfb2VfY2xyX21hc2tfZGVmYXVsdCAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19tcHVfcndfYnVzX29lX3NldF9tYXNrX2RlZmF1bHQgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfbXB1X3J3X2J1c19zZXRfbWFza19kZWZhdWx0ICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19tcHVfcndfZ2lvX2Nscl9tYXNrX2RlZmF1bHQgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X21wdV9yd19naW9fb2VfY2xyX21hc2tfZGVmYXVsdCAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19tcHVfcndfZ2lvX29lX3NldF9tYXNrX2RlZmF1bHQgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfbXB1X3J3X2dpb19zZXRfbWFza19kZWZhdWx0ICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19tcHVfcndfaW50cl9ncnAwX21hc2tfZGVmYXVsdCAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19tcHVfcndfaW50cl9ncnAxX21hc2tfZGVmYXVsdCAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19tcHVfcndfaW50cl9ncnAyX21hc2tfZGVmYXVsdCAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19tcHVfcndfaW50cl9ncnAzX21hc2tfZGVmYXVsdCAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19tcHVfcndfc3dfY2ZnX293bmVyX2RlZmF1bHQgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X21wdV9zZXQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna19pb3Bfc3dfbXB1X3NwdSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX2lvcF9zd19tcHVfd3IgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIHJlZ2tfaW9wX3N3X21wdV95ZXMgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNlbmRpZiAvKiBfX2lvcF9zd19tcHVfZGVmc19hc21faCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9pb3AvYXNtL2lvcF9zd19zcHVfZGVmc19hc20uaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvaW9wL2FzbS9pb3Bfc3dfc3B1X2RlZnNfYXNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdhNzQ1MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvaW9wL2FzbS9pb3Bfc3dfc3B1X2RlZnNfYXNtLmgKQEAgLTAsMCArMSw1MjMgQEAKKyNpZm5kZWYgX19pb3Bfc3dfc3B1X2RlZnNfYXNtX2gKKyNkZWZpbmUgX19pb3Bfc3dfc3B1X2RlZnNfYXNtX2gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGZyb20KKyAqICAgZmlsZTogICAgICAgICAgIGlvcF9zd19zcHUucgorICogCisgKiAgIGJ5IC4uLy4uLy4uL3Rvb2xzL3JkZXNjL2Jpbi9yZGVzMmMgLWFzbSAtb3V0ZmlsZSBpb3Bfc3dfc3B1X2RlZnNfYXNtLmggaW9wX3N3X3NwdS5yCisgKiBBbnkgY2hhbmdlcyBoZXJlIHdpbGwgYmUgbG9zdC4KKyAqCisgKiAtKi0gYnVmZmVyLXJlYWQtb25seTogdCAtKi0KKyAqLworCisjaWZuZGVmIFJFR19GSUVMRAorI2RlZmluZSBSRUdfRklFTEQoIHNjb3BlLCByZWcsIGZpZWxkLCB2YWx1ZSApIFwKKyAgUkVHX0ZJRUxEX1hfKCB2YWx1ZSwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX0ZJRUxEX1hfKCB2YWx1ZSwgc2hpZnQgKSAoKHZhbHVlKSA8PCBzaGlmdCkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19TVEFURQorI2RlZmluZSBSRUdfU1RBVEUoIHNjb3BlLCByZWcsIGZpZWxkLCBzeW1ib2xpY192YWx1ZSApIFwKKyAgUkVHX1NUQVRFX1hfKCByZWdrXyMjc2NvcGUjI18jI3N5bWJvbGljX3ZhbHVlLCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX19sc2IgKQorI2RlZmluZSBSRUdfU1RBVEVfWF8oIGssIHNoaWZ0ICkgKGsgPDwgc2hpZnQpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfTUFTSworI2RlZmluZSBSRUdfTUFTSyggc2NvcGUsIHJlZywgZmllbGQgKSBcCisgIFJFR19NQVNLX1hfKCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX193aWR0aCwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX01BU0tfWF8oIHdpZHRoLCBsc2IgKSAoKCgxIDw8IHdpZHRoKS0xKSA8PCBsc2IpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfTFNCCisjZGVmaW5lIFJFR19MU0IoIHNjb3BlLCByZWcsIGZpZWxkICkgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQklUCisjZGVmaW5lIFJFR19CSVQoIHNjb3BlLCByZWcsIGZpZWxkICkgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fYml0CisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUgorI2RlZmluZSBSRUdfQUREUiggc2NvcGUsIGluc3QsIHJlZyApIFJFR19BRERSX1hfKGluc3QsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19vZmZzZXQpCisjZGVmaW5lIFJFR19BRERSX1hfKCBpbnN0LCBvZmZzICkgKChpbnN0KSArIG9mZnMpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUl9WRUNUCisjZGVmaW5lIFJFR19BRERSX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICAgICAgICAgUkVHX0FERFJfVkVDVF9YXyhpbnN0LCByZWdfIyNzY29wZSMjXyMjcmVnIyNfb2Zmc2V0LCBpbmRleCwgXAorCQkJIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2RlZmluZSBSRUdfQUREUl9WRUNUX1hfKCBpbnN0LCBvZmZzLCBpbmRleCwgc3RyaWRlICkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKGluc3QpICsgb2ZmcyArIChpbmRleCkgKiBzdHJpZGUpCisjZW5kaWYKKworLyogUmVnaXN0ZXIgcl9tcHVfdHJhY2UsIHNjb3BlIGlvcF9zd19zcHUsIHR5cGUgciAqLworI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX21wdV90cmFjZV9vZmZzZXQgMAorCisvKiBSZWdpc3RlciByd19tY19jdHJsLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X21jX2N0cmxfX19rZWVwX293bmVyX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfbWNfY3RybF9fX2tlZXBfb3duZXJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X21jX2N0cmxfX19rZWVwX293bmVyX19fYml0IDAKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfbWNfY3RybF9fX2NtZF9fX2xzYiAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X21jX2N0cmxfX19jbWRfX193aWR0aCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X21jX2N0cmxfX19zaXplX19fbHNiIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfbWNfY3RybF9fX3NpemVfX193aWR0aCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X21jX2N0cmxfX193cl9zcHVfbWVtX19fbHNiIDYKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfbWNfY3RybF9fX3dyX3NwdV9tZW1fX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X21jX2N0cmxfX193cl9zcHVfbWVtX19fYml0IDYKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfbWNfY3RybF9vZmZzZXQgNAorCisvKiBSZWdpc3RlciByd19tY19kYXRhLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X21jX2RhdGFfX192YWxfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19tY19kYXRhX19fdmFsX19fd2lkdGggMzIKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfbWNfZGF0YV9vZmZzZXQgOAorCisvKiBSZWdpc3RlciByd19tY19hZGRyLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X21jX2FkZHJfb2Zmc2V0IDEyCisKKy8qIFJlZ2lzdGVyIHJzX21jX2RhdGEsIHNjb3BlIGlvcF9zd19zcHUsIHR5cGUgcnMgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcnNfbWNfZGF0YV9vZmZzZXQgMTYKKworLyogUmVnaXN0ZXIgcl9tY19kYXRhLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHIgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9tY19kYXRhX29mZnNldCAyMAorCisvKiBSZWdpc3RlciByX21jX3N0YXQsIHNjb3BlIGlvcF9zd19zcHUsIHR5cGUgciAqLworI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX21jX3N0YXRfX19idXN5X2NwdV9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfbWNfc3RhdF9fX2J1c3lfY3B1X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX21jX3N0YXRfX19idXN5X2NwdV9fX2JpdCAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfbWNfc3RhdF9fX2J1c3lfbXB1X19fbHNiIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9tY19zdGF0X19fYnVzeV9tcHVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfbWNfc3RhdF9fX2J1c3lfbXB1X19fYml0IDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9tY19zdGF0X19fYnVzeV9zcHVfX19sc2IgMgorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX21jX3N0YXRfX19idXN5X3NwdV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9tY19zdGF0X19fYnVzeV9zcHVfX19iaXQgMgorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX21jX3N0YXRfX19vd25lZF9ieV9jcHVfX19sc2IgMworI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX21jX3N0YXRfX19vd25lZF9ieV9jcHVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfbWNfc3RhdF9fX293bmVkX2J5X2NwdV9fX2JpdCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfbWNfc3RhdF9fX293bmVkX2J5X21wdV9fX2xzYiA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfbWNfc3RhdF9fX293bmVkX2J5X21wdV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9tY19zdGF0X19fb3duZWRfYnlfbXB1X19fYml0IDQKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9tY19zdGF0X19fb3duZWRfYnlfc3B1X19fbHNiIDUKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9tY19zdGF0X19fb3duZWRfYnlfc3B1X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX21jX3N0YXRfX19vd25lZF9ieV9zcHVfX19iaXQgNQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX21jX3N0YXRfb2Zmc2V0IDI0CisKKy8qIFJlZ2lzdGVyIHJ3X2J1c19jbHJfbWFzaywgc2NvcGUgaW9wX3N3X3NwdSwgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19idXNfY2xyX21hc2tfX19ieXRlMF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19jbHJfbWFza19fX2J5dGUwX19fd2lkdGggOAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19idXNfY2xyX21hc2tfX19ieXRlMV9fX2xzYiA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19jbHJfbWFza19fX2J5dGUxX19fd2lkdGggOAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19idXNfY2xyX21hc2tfX19ieXRlMl9fX2xzYiAxNgorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19idXNfY2xyX21hc2tfX19ieXRlMl9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfYnVzX2Nscl9tYXNrX19fYnl0ZTNfX19sc2IgMjQKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfYnVzX2Nscl9tYXNrX19fYnl0ZTNfX193aWR0aCA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19jbHJfbWFza19vZmZzZXQgMjgKKworLyogUmVnaXN0ZXIgcndfYnVzX3NldF9tYXNrLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19zZXRfbWFza19fX2J5dGUwX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfYnVzX3NldF9tYXNrX19fYnl0ZTBfX193aWR0aCA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19zZXRfbWFza19fX2J5dGUxX19fbHNiIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfYnVzX3NldF9tYXNrX19fYnl0ZTFfX193aWR0aCA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19zZXRfbWFza19fX2J5dGUyX19fbHNiIDE2CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19zZXRfbWFza19fX2J5dGUyX19fd2lkdGggOAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19idXNfc2V0X21hc2tfX19ieXRlM19fX2xzYiAyNAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19idXNfc2V0X21hc2tfX19ieXRlM19fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfYnVzX3NldF9tYXNrX29mZnNldCAzMgorCisvKiBSZWdpc3RlciByd19idXNfb2VfY2xyX21hc2ssIHNjb3BlIGlvcF9zd19zcHUsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfYnVzX29lX2Nscl9tYXNrX19fYnl0ZTBfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19idXNfb2VfY2xyX21hc2tfX19ieXRlMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfYnVzX29lX2Nscl9tYXNrX19fYnl0ZTBfX19iaXQgMAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19idXNfb2VfY2xyX21hc2tfX19ieXRlMV9fX2xzYiAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19vZV9jbHJfbWFza19fX2J5dGUxX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19idXNfb2VfY2xyX21hc2tfX19ieXRlMV9fX2JpdCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19vZV9jbHJfbWFza19fX2J5dGUyX19fbHNiIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfYnVzX29lX2Nscl9tYXNrX19fYnl0ZTJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19vZV9jbHJfbWFza19fX2J5dGUyX19fYml0IDIKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfYnVzX29lX2Nscl9tYXNrX19fYnl0ZTNfX19sc2IgMworI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19idXNfb2VfY2xyX21hc2tfX19ieXRlM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfYnVzX29lX2Nscl9tYXNrX19fYnl0ZTNfX19iaXQgMworI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19idXNfb2VfY2xyX21hc2tfb2Zmc2V0IDM2CisKKy8qIFJlZ2lzdGVyIHJ3X2J1c19vZV9zZXRfbWFzaywgc2NvcGUgaW9wX3N3X3NwdSwgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19idXNfb2Vfc2V0X21hc2tfX19ieXRlMF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19vZV9zZXRfbWFza19fX2J5dGUwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19idXNfb2Vfc2V0X21hc2tfX19ieXRlMF9fX2JpdCAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19vZV9zZXRfbWFza19fX2J5dGUxX19fbHNiIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfYnVzX29lX3NldF9tYXNrX19fYnl0ZTFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19vZV9zZXRfbWFza19fX2J5dGUxX19fYml0IDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfYnVzX29lX3NldF9tYXNrX19fYnl0ZTJfX19sc2IgMgorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19idXNfb2Vfc2V0X21hc2tfX19ieXRlMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfYnVzX29lX3NldF9tYXNrX19fYnl0ZTJfX19iaXQgMgorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19idXNfb2Vfc2V0X21hc2tfX19ieXRlM19fX2xzYiAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19vZV9zZXRfbWFza19fX2J5dGUzX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19idXNfb2Vfc2V0X21hc2tfX19ieXRlM19fX2JpdCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19vZV9zZXRfbWFza19vZmZzZXQgNDAKKworLyogUmVnaXN0ZXIgcl9idXNfaW4sIHNjb3BlIGlvcF9zd19zcHUsIHR5cGUgciAqLworI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2J1c19pbl9vZmZzZXQgNDQKKworLyogUmVnaXN0ZXIgcndfZ2lvX2Nscl9tYXNrLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19jbHJfbWFza19fX3ZhbF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19jbHJfbWFza19fX3ZhbF9fX3dpZHRoIDMyCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19jbHJfbWFza19vZmZzZXQgNDgKKworLyogUmVnaXN0ZXIgcndfZ2lvX3NldF9tYXNrLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19zZXRfbWFza19fX3ZhbF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19zZXRfbWFza19fX3ZhbF9fX3dpZHRoIDMyCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19zZXRfbWFza19vZmZzZXQgNTIKKworLyogUmVnaXN0ZXIgcndfZ2lvX29lX2Nscl9tYXNrLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19vZV9jbHJfbWFza19fX3ZhbF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19vZV9jbHJfbWFza19fX3ZhbF9fX3dpZHRoIDMyCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19vZV9jbHJfbWFza19vZmZzZXQgNTYKKworLyogUmVnaXN0ZXIgcndfZ2lvX29lX3NldF9tYXNrLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19vZV9zZXRfbWFza19fX3ZhbF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19vZV9zZXRfbWFza19fX3ZhbF9fX3dpZHRoIDMyCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19vZV9zZXRfbWFza19vZmZzZXQgNjAKKworLyogUmVnaXN0ZXIgcl9naW9faW4sIHNjb3BlIGlvcF9zd19zcHUsIHR5cGUgciAqLworI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2dpb19pbl9vZmZzZXQgNjQKKworLyogUmVnaXN0ZXIgcndfYnVzX2Nscl9tYXNrX2xvLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19jbHJfbWFza19sb19fX2J5dGUwX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfYnVzX2Nscl9tYXNrX2xvX19fYnl0ZTBfX193aWR0aCA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19jbHJfbWFza19sb19fX2J5dGUxX19fbHNiIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfYnVzX2Nscl9tYXNrX2xvX19fYnl0ZTFfX193aWR0aCA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19jbHJfbWFza19sb19vZmZzZXQgNjgKKworLyogUmVnaXN0ZXIgcndfYnVzX2Nscl9tYXNrX2hpLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19jbHJfbWFza19oaV9fX2J5dGUyX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfYnVzX2Nscl9tYXNrX2hpX19fYnl0ZTJfX193aWR0aCA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19jbHJfbWFza19oaV9fX2J5dGUzX19fbHNiIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfYnVzX2Nscl9tYXNrX2hpX19fYnl0ZTNfX193aWR0aCA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19jbHJfbWFza19oaV9vZmZzZXQgNzIKKworLyogUmVnaXN0ZXIgcndfYnVzX3NldF9tYXNrX2xvLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19zZXRfbWFza19sb19fX2J5dGUwX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfYnVzX3NldF9tYXNrX2xvX19fYnl0ZTBfX193aWR0aCA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19zZXRfbWFza19sb19fX2J5dGUxX19fbHNiIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfYnVzX3NldF9tYXNrX2xvX19fYnl0ZTFfX193aWR0aCA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19zZXRfbWFza19sb19vZmZzZXQgNzYKKworLyogUmVnaXN0ZXIgcndfYnVzX3NldF9tYXNrX2hpLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19zZXRfbWFza19oaV9fX2J5dGUyX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfYnVzX3NldF9tYXNrX2hpX19fYnl0ZTJfX193aWR0aCA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19zZXRfbWFza19oaV9fX2J5dGUzX19fbHNiIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfYnVzX3NldF9tYXNrX2hpX19fYnl0ZTNfX193aWR0aCA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19zZXRfbWFza19oaV9vZmZzZXQgODAKKworLyogUmVnaXN0ZXIgcndfZ2lvX2Nscl9tYXNrX2xvLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19jbHJfbWFza19sb19fX3ZhbF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19jbHJfbWFza19sb19fX3ZhbF9fX3dpZHRoIDE2CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19jbHJfbWFza19sb19vZmZzZXQgODQKKworLyogUmVnaXN0ZXIgcndfZ2lvX2Nscl9tYXNrX2hpLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19jbHJfbWFza19oaV9fX3ZhbF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19jbHJfbWFza19oaV9fX3ZhbF9fX3dpZHRoIDE2CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19jbHJfbWFza19oaV9vZmZzZXQgODgKKworLyogUmVnaXN0ZXIgcndfZ2lvX3NldF9tYXNrX2xvLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19zZXRfbWFza19sb19fX3ZhbF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19zZXRfbWFza19sb19fX3ZhbF9fX3dpZHRoIDE2CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19zZXRfbWFza19sb19vZmZzZXQgOTIKKworLyogUmVnaXN0ZXIgcndfZ2lvX3NldF9tYXNrX2hpLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19zZXRfbWFza19oaV9fX3ZhbF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19zZXRfbWFza19oaV9fX3ZhbF9fX3dpZHRoIDE2CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19zZXRfbWFza19oaV9vZmZzZXQgOTYKKworLyogUmVnaXN0ZXIgcndfZ2lvX29lX2Nscl9tYXNrX2xvLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19vZV9jbHJfbWFza19sb19fX3ZhbF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19vZV9jbHJfbWFza19sb19fX3ZhbF9fX3dpZHRoIDE2CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19vZV9jbHJfbWFza19sb19vZmZzZXQgMTAwCisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19vZV9jbHJfbWFza19oaSwgc2NvcGUgaW9wX3N3X3NwdSwgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19naW9fb2VfY2xyX21hc2tfaGlfX192YWxfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19naW9fb2VfY2xyX21hc2tfaGlfX192YWxfX193aWR0aCAxNgorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19naW9fb2VfY2xyX21hc2tfaGlfb2Zmc2V0IDEwNAorCisvKiBSZWdpc3RlciByd19naW9fb2Vfc2V0X21hc2tfbG8sIHNjb3BlIGlvcF9zd19zcHUsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfZ2lvX29lX3NldF9tYXNrX2xvX19fdmFsX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfZ2lvX29lX3NldF9tYXNrX2xvX19fdmFsX19fd2lkdGggMTYKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfZ2lvX29lX3NldF9tYXNrX2xvX29mZnNldCAxMDgKKworLyogUmVnaXN0ZXIgcndfZ2lvX29lX3NldF9tYXNrX2hpLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19vZV9zZXRfbWFza19oaV9fX3ZhbF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19vZV9zZXRfbWFza19oaV9fX3ZhbF9fX3dpZHRoIDE2CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19vZV9zZXRfbWFza19oaV9vZmZzZXQgMTEyCisKKy8qIFJlZ2lzdGVyIHJ3X2NwdV9pbnRyLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2NwdV9pbnRyX19faW50cjBfX19sc2IgMAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19jcHVfaW50cl9fX2ludHIwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19jcHVfaW50cl9fX2ludHIwX19fYml0IDAKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfY3B1X2ludHJfX19pbnRyMV9fX2xzYiAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2NwdV9pbnRyX19faW50cjFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2NwdV9pbnRyX19faW50cjFfX19iaXQgMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19jcHVfaW50cl9fX2ludHIyX19fbHNiIDIKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfY3B1X2ludHJfX19pbnRyMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfY3B1X2ludHJfX19pbnRyMl9fX2JpdCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2NwdV9pbnRyX19faW50cjNfX19sc2IgMworI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19jcHVfaW50cl9fX2ludHIzX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19jcHVfaW50cl9fX2ludHIzX19fYml0IDMKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfY3B1X2ludHJfX19pbnRyNF9fX2xzYiA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2NwdV9pbnRyX19faW50cjRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2NwdV9pbnRyX19faW50cjRfX19iaXQgNAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19jcHVfaW50cl9fX2ludHI1X19fbHNiIDUKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfY3B1X2ludHJfX19pbnRyNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfY3B1X2ludHJfX19pbnRyNV9fX2JpdCA1CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2NwdV9pbnRyX19faW50cjZfX19sc2IgNgorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19jcHVfaW50cl9fX2ludHI2X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19jcHVfaW50cl9fX2ludHI2X19fYml0IDYKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfY3B1X2ludHJfX19pbnRyN19fX2xzYiA3CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2NwdV9pbnRyX19faW50cjdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2NwdV9pbnRyX19faW50cjdfX19iaXQgNworI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19jcHVfaW50cl9fX2ludHI4X19fbHNiIDgKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfY3B1X2ludHJfX19pbnRyOF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfY3B1X2ludHJfX19pbnRyOF9fX2JpdCA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2NwdV9pbnRyX19faW50cjlfX19sc2IgOQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19jcHVfaW50cl9fX2ludHI5X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19jcHVfaW50cl9fX2ludHI5X19fYml0IDkKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfY3B1X2ludHJfX19pbnRyMTBfX19sc2IgMTAKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfY3B1X2ludHJfX19pbnRyMTBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2NwdV9pbnRyX19faW50cjEwX19fYml0IDEwCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2NwdV9pbnRyX19faW50cjExX19fbHNiIDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2NwdV9pbnRyX19faW50cjExX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19jcHVfaW50cl9fX2ludHIxMV9fX2JpdCAxMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19jcHVfaW50cl9fX2ludHIxMl9fX2xzYiAxMgorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19jcHVfaW50cl9fX2ludHIxMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfY3B1X2ludHJfX19pbnRyMTJfX19iaXQgMTIKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfY3B1X2ludHJfX19pbnRyMTNfX19sc2IgMTMKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfY3B1X2ludHJfX19pbnRyMTNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2NwdV9pbnRyX19faW50cjEzX19fYml0IDEzCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2NwdV9pbnRyX19faW50cjE0X19fbHNiIDE0CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X2NwdV9pbnRyX19faW50cjE0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19jcHVfaW50cl9fX2ludHIxNF9fX2JpdCAxNAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19jcHVfaW50cl9fX2ludHIxNV9fX2xzYiAxNQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19jcHVfaW50cl9fX2ludHIxNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfY3B1X2ludHJfX19pbnRyMTVfX19iaXQgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfY3B1X2ludHJfb2Zmc2V0IDExNgorCisvKiBSZWdpc3RlciByX2NwdV9pbnRyLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHIgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9jcHVfaW50cl9fX2ludHIwX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9jcHVfaW50cl9fX2ludHIwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2NwdV9pbnRyX19faW50cjBfX19iaXQgMAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2NwdV9pbnRyX19faW50cjFfX19sc2IgMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2NwdV9pbnRyX19faW50cjFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfY3B1X2ludHJfX19pbnRyMV9fX2JpdCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfY3B1X2ludHJfX19pbnRyMl9fX2xzYiAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfY3B1X2ludHJfX19pbnRyMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9jcHVfaW50cl9fX2ludHIyX19fYml0IDIKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9jcHVfaW50cl9fX2ludHIzX19fbHNiIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9jcHVfaW50cl9fX2ludHIzX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2NwdV9pbnRyX19faW50cjNfX19iaXQgMworI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2NwdV9pbnRyX19faW50cjRfX19sc2IgNAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2NwdV9pbnRyX19faW50cjRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfY3B1X2ludHJfX19pbnRyNF9fX2JpdCA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfY3B1X2ludHJfX19pbnRyNV9fX2xzYiA1CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfY3B1X2ludHJfX19pbnRyNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9jcHVfaW50cl9fX2ludHI1X19fYml0IDUKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9jcHVfaW50cl9fX2ludHI2X19fbHNiIDYKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9jcHVfaW50cl9fX2ludHI2X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2NwdV9pbnRyX19faW50cjZfX19iaXQgNgorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2NwdV9pbnRyX19faW50cjdfX19sc2IgNworI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2NwdV9pbnRyX19faW50cjdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfY3B1X2ludHJfX19pbnRyN19fX2JpdCA3CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfY3B1X2ludHJfX19pbnRyOF9fX2xzYiA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfY3B1X2ludHJfX19pbnRyOF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9jcHVfaW50cl9fX2ludHI4X19fYml0IDgKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9jcHVfaW50cl9fX2ludHI5X19fbHNiIDkKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9jcHVfaW50cl9fX2ludHI5X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2NwdV9pbnRyX19faW50cjlfX19iaXQgOQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2NwdV9pbnRyX19faW50cjEwX19fbHNiIDEwCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfY3B1X2ludHJfX19pbnRyMTBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfY3B1X2ludHJfX19pbnRyMTBfX19iaXQgMTAKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9jcHVfaW50cl9fX2ludHIxMV9fX2xzYiAxMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2NwdV9pbnRyX19faW50cjExX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2NwdV9pbnRyX19faW50cjExX19fYml0IDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfY3B1X2ludHJfX19pbnRyMTJfX19sc2IgMTIKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9jcHVfaW50cl9fX2ludHIxMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9jcHVfaW50cl9fX2ludHIxMl9fX2JpdCAxMgorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2NwdV9pbnRyX19faW50cjEzX19fbHNiIDEzCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfY3B1X2ludHJfX19pbnRyMTNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfY3B1X2ludHJfX19pbnRyMTNfX19iaXQgMTMKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9jcHVfaW50cl9fX2ludHIxNF9fX2xzYiAxNAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2NwdV9pbnRyX19faW50cjE0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2NwdV9pbnRyX19faW50cjE0X19fYml0IDE0CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfY3B1X2ludHJfX19pbnRyMTVfX19sc2IgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9jcHVfaW50cl9fX2ludHIxNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9jcHVfaW50cl9fX2ludHIxNV9fX2JpdCAxNQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2NwdV9pbnRyX29mZnNldCAxMjAKKworLyogUmVnaXN0ZXIgcl9od19pbnRyLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHIgKi8KKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9od19pbnRyX19fdHJpZ2dlcl9ncnAwX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9od19pbnRyX19fdHJpZ2dlcl9ncnAwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2h3X2ludHJfX190cmlnZ2VyX2dycDBfX19iaXQgMAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2h3X2ludHJfX190cmlnZ2VyX2dycDFfX19sc2IgMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2h3X2ludHJfX190cmlnZ2VyX2dycDFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfaHdfaW50cl9fX3RyaWdnZXJfZ3JwMV9fX2JpdCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfaHdfaW50cl9fX3RyaWdnZXJfZ3JwMl9fX2xzYiAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfaHdfaW50cl9fX3RyaWdnZXJfZ3JwMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9od19pbnRyX19fdHJpZ2dlcl9ncnAyX19fYml0IDIKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9od19pbnRyX19fdHJpZ2dlcl9ncnAzX19fbHNiIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9od19pbnRyX19fdHJpZ2dlcl9ncnAzX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2h3X2ludHJfX190cmlnZ2VyX2dycDNfX19iaXQgMworI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2h3X2ludHJfX190cmlnZ2VyX2dycDRfX19sc2IgNAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2h3X2ludHJfX190cmlnZ2VyX2dycDRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfaHdfaW50cl9fX3RyaWdnZXJfZ3JwNF9fX2JpdCA0CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfaHdfaW50cl9fX3RyaWdnZXJfZ3JwNV9fX2xzYiA1CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfaHdfaW50cl9fX3RyaWdnZXJfZ3JwNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9od19pbnRyX19fdHJpZ2dlcl9ncnA1X19fYml0IDUKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9od19pbnRyX19fdHJpZ2dlcl9ncnA2X19fbHNiIDYKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9od19pbnRyX19fdHJpZ2dlcl9ncnA2X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2h3X2ludHJfX190cmlnZ2VyX2dycDZfX19iaXQgNgorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2h3X2ludHJfX190cmlnZ2VyX2dycDdfX19sc2IgNworI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2h3X2ludHJfX190cmlnZ2VyX2dycDdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfaHdfaW50cl9fX3RyaWdnZXJfZ3JwN19fX2JpdCA3CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfaHdfaW50cl9fX3RpbWVyX2dycDBfX19sc2IgOAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2h3X2ludHJfX190aW1lcl9ncnAwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2h3X2ludHJfX190aW1lcl9ncnAwX19fYml0IDgKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9od19pbnRyX19fdGltZXJfZ3JwMV9fX2xzYiA5CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfaHdfaW50cl9fX3RpbWVyX2dycDFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfaHdfaW50cl9fX3RpbWVyX2dycDFfX19iaXQgOQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2h3X2ludHJfX19maWZvX291dF9fX2xzYiAxMAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2h3X2ludHJfX19maWZvX291dF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9od19pbnRyX19fZmlmb19vdXRfX19iaXQgMTAKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9od19pbnRyX19fZmlmb19vdXRfZXh0cmFfX19sc2IgMTEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9od19pbnRyX19fZmlmb19vdXRfZXh0cmFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfaHdfaW50cl9fX2ZpZm9fb3V0X2V4dHJhX19fYml0IDExCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfaHdfaW50cl9fX2ZpZm9faW5fX19sc2IgMTIKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9od19pbnRyX19fZmlmb19pbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9od19pbnRyX19fZmlmb19pbl9fX2JpdCAxMgorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2h3X2ludHJfX19maWZvX2luX2V4dHJhX19fbHNiIDEzCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfaHdfaW50cl9fX2ZpZm9faW5fZXh0cmFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfaHdfaW50cl9fX2ZpZm9faW5fZXh0cmFfX19iaXQgMTMKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9od19pbnRyX19fZG1jX291dF9fX2xzYiAxNAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2h3X2ludHJfX19kbWNfb3V0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2h3X2ludHJfX19kbWNfb3V0X19fYml0IDE0CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfaHdfaW50cl9fX2RtY19pbl9fX2xzYiAxNQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2h3X2ludHJfX19kbWNfaW5fX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfaHdfaW50cl9fX2RtY19pbl9fX2JpdCAxNQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX2h3X2ludHJfb2Zmc2V0IDEyNAorCisvKiBSZWdpc3RlciByd19tcHVfaW50ciwgc2NvcGUgaW9wX3N3X3NwdSwgdHlwZSBydyAqLworI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19tcHVfaW50cl9fX2ludHIwX19fbHNiIDAKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfbXB1X2ludHJfX19pbnRyMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfbXB1X2ludHJfX19pbnRyMF9fX2JpdCAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X21wdV9pbnRyX19faW50cjFfX19sc2IgMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19tcHVfaW50cl9fX2ludHIxX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19tcHVfaW50cl9fX2ludHIxX19fYml0IDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfbXB1X2ludHJfX19pbnRyMl9fX2xzYiAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X21wdV9pbnRyX19faW50cjJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X21wdV9pbnRyX19faW50cjJfX19iaXQgMgorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19tcHVfaW50cl9fX2ludHIzX19fbHNiIDMKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfbXB1X2ludHJfX19pbnRyM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfbXB1X2ludHJfX19pbnRyM19fX2JpdCAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X21wdV9pbnRyX19faW50cjRfX19sc2IgNAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19tcHVfaW50cl9fX2ludHI0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19tcHVfaW50cl9fX2ludHI0X19fYml0IDQKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfbXB1X2ludHJfX19pbnRyNV9fX2xzYiA1CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X21wdV9pbnRyX19faW50cjVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X21wdV9pbnRyX19faW50cjVfX19iaXQgNQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19tcHVfaW50cl9fX2ludHI2X19fbHNiIDYKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfbXB1X2ludHJfX19pbnRyNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfbXB1X2ludHJfX19pbnRyNl9fX2JpdCA2CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X21wdV9pbnRyX19faW50cjdfX19sc2IgNworI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19tcHVfaW50cl9fX2ludHI3X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19tcHVfaW50cl9fX2ludHI3X19fYml0IDcKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfbXB1X2ludHJfX19pbnRyOF9fX2xzYiA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X21wdV9pbnRyX19faW50cjhfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X21wdV9pbnRyX19faW50cjhfX19iaXQgOAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19tcHVfaW50cl9fX2ludHI5X19fbHNiIDkKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfbXB1X2ludHJfX19pbnRyOV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfbXB1X2ludHJfX19pbnRyOV9fX2JpdCA5CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X21wdV9pbnRyX19faW50cjEwX19fbHNiIDEwCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X21wdV9pbnRyX19faW50cjEwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19tcHVfaW50cl9fX2ludHIxMF9fX2JpdCAxMAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19tcHVfaW50cl9fX2ludHIxMV9fX2xzYiAxMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19tcHVfaW50cl9fX2ludHIxMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfbXB1X2ludHJfX19pbnRyMTFfX19iaXQgMTEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfbXB1X2ludHJfX19pbnRyMTJfX19sc2IgMTIKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfbXB1X2ludHJfX19pbnRyMTJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X21wdV9pbnRyX19faW50cjEyX19fYml0IDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X21wdV9pbnRyX19faW50cjEzX19fbHNiIDEzCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X21wdV9pbnRyX19faW50cjEzX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19tcHVfaW50cl9fX2ludHIxM19fX2JpdCAxMworI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19tcHVfaW50cl9fX2ludHIxNF9fX2xzYiAxNAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yd19tcHVfaW50cl9fX2ludHIxNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfbXB1X2ludHJfX19pbnRyMTRfX19iaXQgMTQKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfbXB1X2ludHJfX19pbnRyMTVfX19sc2IgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcndfbXB1X2ludHJfX19pbnRyMTVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X21wdV9pbnRyX19faW50cjE1X19fYml0IDE1CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3J3X21wdV9pbnRyX29mZnNldCAxMjgKKworLyogUmVnaXN0ZXIgcl9tcHVfaW50ciwgc2NvcGUgaW9wX3N3X3NwdSwgdHlwZSByICovCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfbXB1X2ludHJfX19pbnRyMF9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfbXB1X2ludHJfX19pbnRyMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9tcHVfaW50cl9fX2ludHIwX19fYml0IDAKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9tcHVfaW50cl9fX2ludHIxX19fbHNiIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9tcHVfaW50cl9fX2ludHIxX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX21wdV9pbnRyX19faW50cjFfX19iaXQgMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX21wdV9pbnRyX19faW50cjJfX19sc2IgMgorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX21wdV9pbnRyX19faW50cjJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfbXB1X2ludHJfX19pbnRyMl9fX2JpdCAyCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfbXB1X2ludHJfX19pbnRyM19fX2xzYiAzCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfbXB1X2ludHJfX19pbnRyM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9tcHVfaW50cl9fX2ludHIzX19fYml0IDMKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9tcHVfaW50cl9fX2ludHI0X19fbHNiIDQKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9tcHVfaW50cl9fX2ludHI0X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX21wdV9pbnRyX19faW50cjRfX19iaXQgNAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX21wdV9pbnRyX19faW50cjVfX19sc2IgNQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX21wdV9pbnRyX19faW50cjVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfbXB1X2ludHJfX19pbnRyNV9fX2JpdCA1CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfbXB1X2ludHJfX19pbnRyNl9fX2xzYiA2CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfbXB1X2ludHJfX19pbnRyNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9tcHVfaW50cl9fX2ludHI2X19fYml0IDYKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9tcHVfaW50cl9fX2ludHI3X19fbHNiIDcKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9tcHVfaW50cl9fX2ludHI3X19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX21wdV9pbnRyX19faW50cjdfX19iaXQgNworI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX21wdV9pbnRyX19faW50cjhfX19sc2IgOAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX21wdV9pbnRyX19faW50cjhfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfbXB1X2ludHJfX19pbnRyOF9fX2JpdCA4CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfbXB1X2ludHJfX19pbnRyOV9fX2xzYiA5CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfbXB1X2ludHJfX19pbnRyOV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9tcHVfaW50cl9fX2ludHI5X19fYml0IDkKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9tcHVfaW50cl9fX2ludHIxMF9fX2xzYiAxMAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX21wdV9pbnRyX19faW50cjEwX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX21wdV9pbnRyX19faW50cjEwX19fYml0IDEwCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfbXB1X2ludHJfX19pbnRyMTFfX19sc2IgMTEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9tcHVfaW50cl9fX2ludHIxMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9tcHVfaW50cl9fX2ludHIxMV9fX2JpdCAxMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX21wdV9pbnRyX19faW50cjEyX19fbHNiIDEyCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfbXB1X2ludHJfX19pbnRyMTJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfbXB1X2ludHJfX19pbnRyMTJfX19iaXQgMTIKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9tcHVfaW50cl9fX2ludHIxM19fX2xzYiAxMworI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX21wdV9pbnRyX19faW50cjEzX19fd2lkdGggMQorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX21wdV9pbnRyX19faW50cjEzX19fYml0IDEzCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfbXB1X2ludHJfX19pbnRyMTRfX19sc2IgMTQKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9tcHVfaW50cl9fX2ludHIxNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9tcHVfaW50cl9fX2ludHIxNF9fX2JpdCAxNAorI2RlZmluZSByZWdfaW9wX3N3X3NwdV9yX21wdV9pbnRyX19faW50cjE1X19fbHNiIDE1CisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfbXB1X2ludHJfX19pbnRyMTVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19pb3Bfc3dfc3B1X3JfbXB1X2ludHJfX19pbnRyMTVfX19iaXQgMTUKKyNkZWZpbmUgcmVnX2lvcF9zd19zcHVfcl9tcHVfaW50cl9vZmZzZXQgMTMyCisKKworLyogQ29uc3RhbnRzICovCisjZGVmaW5lIHJlZ2tfaW9wX3N3X3NwdV9jb3B5ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfc3B1X25vICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19zcHVfbm9wICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X3NwdV9yZCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgcmVna19pb3Bfc3dfc3B1X3JlZ19jb3B5ICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2lvcF9zd19zcHVfcndfYnVzX2Nscl9tYXNrX2RlZmF1bHQgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X3NwdV9yd19idXNfb2VfY2xyX21hc2tfZGVmYXVsdCAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19zcHVfcndfYnVzX29lX3NldF9tYXNrX2RlZmF1bHQgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfc3B1X3J3X2J1c19zZXRfbWFza19kZWZhdWx0ICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19zcHVfcndfZ2lvX2Nscl9tYXNrX2RlZmF1bHQgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfaW9wX3N3X3NwdV9yd19naW9fb2VfY2xyX21hc2tfZGVmYXVsdCAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19zcHVfcndfZ2lvX29lX3NldF9tYXNrX2RlZmF1bHQgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19pb3Bfc3dfc3B1X3J3X2dpb19zZXRfbWFza19kZWZhdWx0ICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2lvcF9zd19zcHVfc2V0ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfaW9wX3N3X3NwdV93ciAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgcmVna19pb3Bfc3dfc3B1X3llcyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2VuZGlmIC8qIF9faW9wX3N3X3NwdV9kZWZzX2FzbV9oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2lvcC9hc20vaW9wX3ZlcnNpb25fZGVmc19hc20uaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvaW9wL2FzbS9pb3BfdmVyc2lvbl9kZWZzX2FzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZDY3MTIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2lvcC9hc20vaW9wX3ZlcnNpb25fZGVmc19hc20uaApAQCAtMCwwICsxLDYxIEBACisjaWZuZGVmIF9faW9wX3ZlcnNpb25fZGVmc19hc21faAorI2RlZmluZSBfX2lvcF92ZXJzaW9uX2RlZnNfYXNtX2gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGZyb20KKyAqICAgZmlsZTogICAgICAgICAgIGlvcF92ZXJzaW9uLnIKKyAqIAorICogICBieSAuLi8uLi8uLi90b29scy9yZGVzYy9iaW4vcmRlczJjIC1hc20gLW91dGZpbGUgaW9wX3ZlcnNpb25fZGVmc19hc20uaCBpb3BfdmVyc2lvbi5yCisgKiBBbnkgY2hhbmdlcyBoZXJlIHdpbGwgYmUgbG9zdC4KKyAqCisgKiAtKi0gYnVmZmVyLXJlYWQtb25seTogdCAtKi0KKyAqLworCisjaWZuZGVmIFJFR19GSUVMRAorI2RlZmluZSBSRUdfRklFTEQoIHNjb3BlLCByZWcsIGZpZWxkLCB2YWx1ZSApIFwKKyAgUkVHX0ZJRUxEX1hfKCB2YWx1ZSwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX0ZJRUxEX1hfKCB2YWx1ZSwgc2hpZnQgKSAoKHZhbHVlKSA8PCBzaGlmdCkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19TVEFURQorI2RlZmluZSBSRUdfU1RBVEUoIHNjb3BlLCByZWcsIGZpZWxkLCBzeW1ib2xpY192YWx1ZSApIFwKKyAgUkVHX1NUQVRFX1hfKCByZWdrXyMjc2NvcGUjI18jI3N5bWJvbGljX3ZhbHVlLCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX19sc2IgKQorI2RlZmluZSBSRUdfU1RBVEVfWF8oIGssIHNoaWZ0ICkgKGsgPDwgc2hpZnQpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfTUFTSworI2RlZmluZSBSRUdfTUFTSyggc2NvcGUsIHJlZywgZmllbGQgKSBcCisgIFJFR19NQVNLX1hfKCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX193aWR0aCwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX01BU0tfWF8oIHdpZHRoLCBsc2IgKSAoKCgxIDw8IHdpZHRoKS0xKSA8PCBsc2IpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfTFNCCisjZGVmaW5lIFJFR19MU0IoIHNjb3BlLCByZWcsIGZpZWxkICkgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQklUCisjZGVmaW5lIFJFR19CSVQoIHNjb3BlLCByZWcsIGZpZWxkICkgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fYml0CisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUgorI2RlZmluZSBSRUdfQUREUiggc2NvcGUsIGluc3QsIHJlZyApIFJFR19BRERSX1hfKGluc3QsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19vZmZzZXQpCisjZGVmaW5lIFJFR19BRERSX1hfKCBpbnN0LCBvZmZzICkgKChpbnN0KSArIG9mZnMpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUl9WRUNUCisjZGVmaW5lIFJFR19BRERSX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICAgICAgICAgUkVHX0FERFJfVkVDVF9YXyhpbnN0LCByZWdfIyNzY29wZSMjXyMjcmVnIyNfb2Zmc2V0LCBpbmRleCwgXAorCQkJIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2RlZmluZSBSRUdfQUREUl9WRUNUX1hfKCBpbnN0LCBvZmZzLCBpbmRleCwgc3RyaWRlICkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKGluc3QpICsgb2ZmcyArIChpbmRleCkgKiBzdHJpZGUpCisjZW5kaWYKKworLyogUmVnaXN0ZXIgcl92ZXJzaW9uLCBzY29wZSBpb3BfdmVyc2lvbiwgdHlwZSByICovCisjZGVmaW5lIHJlZ19pb3BfdmVyc2lvbl9yX3ZlcnNpb25fX19ucl9fX2xzYiAwCisjZGVmaW5lIHJlZ19pb3BfdmVyc2lvbl9yX3ZlcnNpb25fX19ucl9fX3dpZHRoIDgKKyNkZWZpbmUgcmVnX2lvcF92ZXJzaW9uX3JfdmVyc2lvbl9vZmZzZXQgMAorCisKKy8qIENvbnN0YW50cyAqLworI2RlZmluZSByZWdrX2lvcF92ZXJzaW9uX3YyXzAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZW5kaWYgLyogX19pb3BfdmVyc2lvbl9kZWZzX2FzbV9oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2lvcC9pb3BfcmVnX3NwYWNlLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2lvcC9pb3BfcmVnX3NwYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYzMTk2YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvaW9wL2lvcF9yZWdfc3BhY2UuaApAQCAtMCwwICsxLDMxIEBACisvKiBBdXRvZ2VuZXJhdGVkIENoYW5nZXMgaGVyZSB3aWxsIGJlIGxvc3QhCisgKiBnZW5lcmF0ZWQgYnkgLi9nZW5fc3cucGwgV2VkIEZlYiAxNCAwOToyNzo0OCAyMDA3IGlvcF9zdy5jZmcgCisgKi8KKyNkZWZpbmUgcmVnaV9pb3BfdmVyc2lvbiAocmVnaV9pb3AgKyAwKQorI2RlZmluZSByZWdpX2lvcF9maWZvX2luX2V4dHJhIChyZWdpX2lvcCArIDY0KQorI2RlZmluZSByZWdpX2lvcF9maWZvX291dF9leHRyYSAocmVnaV9pb3AgKyAxMjgpCisjZGVmaW5lIHJlZ2lfaW9wX3RyaWdnZXJfZ3JwMCAocmVnaV9pb3AgKyAxOTIpCisjZGVmaW5lIHJlZ2lfaW9wX3RyaWdnZXJfZ3JwMSAocmVnaV9pb3AgKyAyNTYpCisjZGVmaW5lIHJlZ2lfaW9wX3RyaWdnZXJfZ3JwMiAocmVnaV9pb3AgKyAzMjApCisjZGVmaW5lIHJlZ2lfaW9wX3RyaWdnZXJfZ3JwMyAocmVnaV9pb3AgKyAzODQpCisjZGVmaW5lIHJlZ2lfaW9wX3RyaWdnZXJfZ3JwNCAocmVnaV9pb3AgKyA0NDgpCisjZGVmaW5lIHJlZ2lfaW9wX3RyaWdnZXJfZ3JwNSAocmVnaV9pb3AgKyA1MTIpCisjZGVmaW5lIHJlZ2lfaW9wX3RyaWdnZXJfZ3JwNiAocmVnaV9pb3AgKyA1NzYpCisjZGVmaW5lIHJlZ2lfaW9wX3RyaWdnZXJfZ3JwNyAocmVnaV9pb3AgKyA2NDApCisjZGVmaW5lIHJlZ2lfaW9wX2NyY19wYXIgKHJlZ2lfaW9wICsgNzY4KQorI2RlZmluZSByZWdpX2lvcF9kbWNfaW4gKHJlZ2lfaW9wICsgODk2KQorI2RlZmluZSByZWdpX2lvcF9kbWNfb3V0IChyZWdpX2lvcCArIDEwMjQpCisjZGVmaW5lIHJlZ2lfaW9wX2ZpZm9faW4gKHJlZ2lfaW9wICsgMTE1MikKKyNkZWZpbmUgcmVnaV9pb3BfZmlmb19vdXQgKHJlZ2lfaW9wICsgMTI4MCkKKyNkZWZpbmUgcmVnaV9pb3Bfc2NyY19pbiAocmVnaV9pb3AgKyAxNDA4KQorI2RlZmluZSByZWdpX2lvcF9zY3JjX291dCAocmVnaV9pb3AgKyAxNTM2KQorI2RlZmluZSByZWdpX2lvcF90aW1lcl9ncnAwIChyZWdpX2lvcCArIDE2NjQpCisjZGVmaW5lIHJlZ2lfaW9wX3RpbWVyX2dycDEgKHJlZ2lfaW9wICsgMTc5MikKKyNkZWZpbmUgcmVnaV9pb3Bfc2FwX2luIChyZWdpX2lvcCArIDIwNDgpCisjZGVmaW5lIHJlZ2lfaW9wX3NhcF9vdXQgKHJlZ2lfaW9wICsgMjMwNCkKKyNkZWZpbmUgcmVnaV9pb3Bfc3B1IChyZWdpX2lvcCArIDI1NjApCisjZGVmaW5lIHJlZ2lfaW9wX3N3X2NmZyAocmVnaV9pb3AgKyAyODE2KQorI2RlZmluZSByZWdpX2lvcF9zd19jcHUgKHJlZ2lfaW9wICsgMzA3MikKKyNkZWZpbmUgcmVnaV9pb3Bfc3dfbXB1IChyZWdpX2lvcCArIDMzMjgpCisjZGVmaW5lIHJlZ2lfaW9wX3N3X3NwdSAocmVnaV9pb3AgKyAzNTg0KQorI2RlZmluZSByZWdpX2lvcF9tcHUgKHJlZ2lfaW9wICsgNDA5NikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvaW9wL2lvcF9zYXBfaW5fZGVmcy5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9pb3AvaW9wX3NhcF9pbl9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFkZGUwMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvaW9wL2lvcF9zYXBfaW5fZGVmcy5oCkBAIC0wLDAgKzEsMTQxIEBACisjaWZuZGVmIF9faW9wX3NhcF9pbl9kZWZzX2gKKyNkZWZpbmUgX19pb3Bfc2FwX2luX2RlZnNfaAorCisvKgorICogVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQgZnJvbQorICogICBmaWxlOiAgICAgICAgICAgaW9wX3NhcF9pbi5yCisgKiAKKyAqICAgYnkgLi4vLi4vLi4vdG9vbHMvcmRlc2MvYmluL3JkZXMyYyAtb3V0ZmlsZSBpb3Bfc2FwX2luX2RlZnMuaCBpb3Bfc2FwX2luLnIKKyAqIEFueSBjaGFuZ2VzIGhlcmUgd2lsbCBiZSBsb3N0LgorICoKKyAqIC0qLSBidWZmZXItcmVhZC1vbmx5OiB0IC0qLQorICovCisvKiBNYWluIGFjY2VzcyBtYWNyb3MgKi8KKyNpZm5kZWYgUkVHX1JECisjZGVmaW5lIFJFR19SRCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1IKKyNkZWZpbmUgUkVHX1dSKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfVkVDVAorI2RlZmluZSBSRUdfV1JfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXgsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlQKKyNkZWZpbmUgUkVHX1JEX0lOVCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlQKKyNkZWZpbmUgUkVHX1dSX0lOVCggc2NvcGUsIGluc3QsIHJlZywgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1dSX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19UWVBFX0NPTlYKKyNkZWZpbmUgUkVHX1RZUEVfQ09OViggdHlwZSwgb3JndHlwZSwgdmFsICkgXAorICAoIHsgdW5pb24geyBvcmd0eXBlIG87IHR5cGUgbjsgfSByOyByLm8gPSB2YWw7IHIubjsgfSApCisjZW5kaWYKKworI2lmbmRlZiByZWdfcGFnZV9zaXplCisjZGVmaW5lIHJlZ19wYWdlX3NpemUgODE5MgorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFIKKyNkZWZpbmUgUkVHX0FERFIoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19BRERSX1ZFQ1QKKyNkZWZpbmUgUkVHX0FERFJfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisvKiBDLWNvZGUgZm9yIHJlZ2lzdGVyIHNjb3BlIGlvcF9zYXBfaW4gKi8KKworI2RlZmluZSBTVFJJREVfaW9wX3NhcF9pbl9yd19idXNfYnl0ZSA0CisvKiBSZWdpc3RlciByd19idXNfYnl0ZSwgc2NvcGUgaW9wX3NhcF9pbiwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgc3luY19zZWwgICAgIDogMjsKKyAgdW5zaWduZWQgaW50IHN5bmNfZXh0X3NyYyA6IDM7CisgIHVuc2lnbmVkIGludCBzeW5jX2VkZ2UgICAgOiAyOworICB1bnNpZ25lZCBpbnQgZGVsYXkgICAgICAgIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgICA6IDIzOworfSByZWdfaW9wX3NhcF9pbl9yd19idXNfYnl0ZTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3NhcF9pbl9yd19idXNfYnl0ZSAwCisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zYXBfaW5fcndfYnVzX2J5dGUgMAorCisjZGVmaW5lIFNUUklERV9pb3Bfc2FwX2luX3J3X2dpbyA0CisvKiBSZWdpc3RlciByd19naW8sIHNjb3BlIGlvcF9zYXBfaW4sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHN5bmNfc2VsICAgICA6IDI7CisgIHVuc2lnbmVkIGludCBzeW5jX2V4dF9zcmMgOiAzOworICB1bnNpZ25lZCBpbnQgc3luY19lZGdlICAgIDogMjsKKyAgdW5zaWduZWQgaW50IGRlbGF5ICAgICAgICA6IDI7CisgIHVuc2lnbmVkIGludCBsb2dpYyAgICAgICAgOiAyOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICAgIDogMjE7Cit9IHJlZ19pb3Bfc2FwX2luX3J3X2dpbzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3NhcF9pbl9yd19naW8gMTYKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3NhcF9pbl9yd19naW8gMTYKKworCisvKiBDb25zdGFudHMgKi8KK2VudW0geworICByZWdrX2lvcF9zYXBfaW5fYW5kICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19pb3Bfc2FwX2luX2V4dF9jbGsyMDAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfaW9wX3NhcF9pbl9naW8wICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zYXBfaW5fZ2lvMTIgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMywKKyAgcmVna19pb3Bfc2FwX2luX2dpbzE2ICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDQsCisgIHJlZ2tfaW9wX3NhcF9pbl9naW8yMCAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA1LAorICByZWdrX2lvcF9zYXBfaW5fZ2lvMjQgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNiwKKyAgcmVna19pb3Bfc2FwX2luX2dpbzI4ICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDcsCisgIHJlZ2tfaW9wX3NhcF9pbl9naW80ICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2lvcF9zYXBfaW5fZ2lvOCAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19pb3Bfc2FwX2luX2ludiAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfaW9wX3NhcF9pbl9uZWcgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX2lvcF9zYXBfaW5fbm8gICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc2FwX2luX25vX2RlbF9leHRfY2xrMjAwICAgICAgICA9IDB4MDAwMDAwMDIsCisgIHJlZ2tfaW9wX3NhcF9pbl9ub25lICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zYXBfaW5fb25lICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19pb3Bfc2FwX2luX29yICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfaW9wX3NhcF9pbl9wb3MgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2lvcF9zYXBfaW5fcG9zX25lZyAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMywKKyAgcmVna19pb3Bfc2FwX2luX3J3X2J1c19ieXRlX2RlZmF1bHQgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3NhcF9pbl9yd19idXNfYnl0ZV9zaXplICAgICAgICAgPSAweDAwMDAwMDA0LAorICByZWdrX2lvcF9zYXBfaW5fcndfZ2lvX2RlZmF1bHQgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc2FwX2luX3J3X2dpb19zaXplICAgICAgICAgICAgICA9IDB4MDAwMDAwMjAsCisgIHJlZ2tfaW9wX3NhcF9pbl90aW1lcl9ncnAwX3RtcjMgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zYXBfaW5fdGltZXJfZ3JwMV90bXIzICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19pb3Bfc2FwX2luX3Rtcl9jbGsyMDAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfaW9wX3NhcF9pbl90d28gICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX2lvcF9zYXBfaW5fdHdvX2NsazIwMCAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMAorfTsKKyNlbmRpZiAvKiBfX2lvcF9zYXBfaW5fZGVmc19oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2lvcC9pb3Bfc2FwX291dF9kZWZzLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2lvcC9pb3Bfc2FwX291dF9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFmODhiYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvaW9wL2lvcF9zYXBfb3V0X2RlZnMuaApAQCAtMCwwICsxLDIzMSBAQAorI2lmbmRlZiBfX2lvcF9zYXBfb3V0X2RlZnNfaAorI2RlZmluZSBfX2lvcF9zYXBfb3V0X2RlZnNfaAorCisvKgorICogVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQgZnJvbQorICogICBmaWxlOiAgICAgICAgICAgaW9wX3NhcF9vdXQucgorICogCisgKiAgIGJ5IC4uLy4uLy4uL3Rvb2xzL3JkZXNjL2Jpbi9yZGVzMmMgLW91dGZpbGUgaW9wX3NhcF9vdXRfZGVmcy5oIGlvcF9zYXBfb3V0LnIKKyAqIEFueSBjaGFuZ2VzIGhlcmUgd2lsbCBiZSBsb3N0LgorICoKKyAqIC0qLSBidWZmZXItcmVhZC1vbmx5OiB0IC0qLQorICovCisvKiBNYWluIGFjY2VzcyBtYWNyb3MgKi8KKyNpZm5kZWYgUkVHX1JECisjZGVmaW5lIFJFR19SRCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1IKKyNkZWZpbmUgUkVHX1dSKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfVkVDVAorI2RlZmluZSBSRUdfV1JfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXgsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlQKKyNkZWZpbmUgUkVHX1JEX0lOVCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlQKKyNkZWZpbmUgUkVHX1dSX0lOVCggc2NvcGUsIGluc3QsIHJlZywgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1dSX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19UWVBFX0NPTlYKKyNkZWZpbmUgUkVHX1RZUEVfQ09OViggdHlwZSwgb3JndHlwZSwgdmFsICkgXAorICAoIHsgdW5pb24geyBvcmd0eXBlIG87IHR5cGUgbjsgfSByOyByLm8gPSB2YWw7IHIubjsgfSApCisjZW5kaWYKKworI2lmbmRlZiByZWdfcGFnZV9zaXplCisjZGVmaW5lIHJlZ19wYWdlX3NpemUgODE5MgorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFIKKyNkZWZpbmUgUkVHX0FERFIoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19BRERSX1ZFQ1QKKyNkZWZpbmUgUkVHX0FERFJfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisvKiBDLWNvZGUgZm9yIHJlZ2lzdGVyIHNjb3BlIGlvcF9zYXBfb3V0ICovCisKKy8qIFJlZ2lzdGVyIHJ3X2dlbl9nYXRlZCwgc2NvcGUgaW9wX3NhcF9vdXQsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGNsazBfc3JjICAgICAgIDogMjsKKyAgdW5zaWduZWQgaW50IGNsazBfZ2F0ZV9zcmMgIDogMjsKKyAgdW5zaWduZWQgaW50IGNsazBfZm9yY2Vfc3JjIDogMzsKKyAgdW5zaWduZWQgaW50IGNsazFfc3JjICAgICAgIDogMjsKKyAgdW5zaWduZWQgaW50IGNsazFfZ2F0ZV9zcmMgIDogMjsKKyAgdW5zaWduZWQgaW50IGNsazFfZm9yY2Vfc3JjIDogMzsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgICAgIDogMTg7Cit9IHJlZ19pb3Bfc2FwX291dF9yd19nZW5fZ2F0ZWQ7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zYXBfb3V0X3J3X2dlbl9nYXRlZCAwCisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zYXBfb3V0X3J3X2dlbl9nYXRlZCAwCisKKy8qIFJlZ2lzdGVyIHJ3X2J1cywgc2NvcGUgaW9wX3NhcF9vdXQsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGJ5dGUwX2Nsa19zZWwgICA6IDI7CisgIHVuc2lnbmVkIGludCBieXRlMF9jbGtfZXh0ICAgOiAyOworICB1bnNpZ25lZCBpbnQgYnl0ZTBfZ2F0ZWRfY2xrIDogMTsKKyAgdW5zaWduZWQgaW50IGJ5dGUwX2Nsa19pbnYgICA6IDE7CisgIHVuc2lnbmVkIGludCBieXRlMF9kZWxheSAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgYnl0ZTFfY2xrX3NlbCAgIDogMjsKKyAgdW5zaWduZWQgaW50IGJ5dGUxX2Nsa19leHQgICA6IDI7CisgIHVuc2lnbmVkIGludCBieXRlMV9nYXRlZF9jbGsgOiAxOworICB1bnNpZ25lZCBpbnQgYnl0ZTFfY2xrX2ludiAgIDogMTsKKyAgdW5zaWduZWQgaW50IGJ5dGUxX2RlbGF5ICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBieXRlMl9jbGtfc2VsICAgOiAyOworICB1bnNpZ25lZCBpbnQgYnl0ZTJfY2xrX2V4dCAgIDogMjsKKyAgdW5zaWduZWQgaW50IGJ5dGUyX2dhdGVkX2NsayA6IDE7CisgIHVuc2lnbmVkIGludCBieXRlMl9jbGtfaW52ICAgOiAxOworICB1bnNpZ25lZCBpbnQgYnl0ZTJfZGVsYXkgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGJ5dGUzX2Nsa19zZWwgICA6IDI7CisgIHVuc2lnbmVkIGludCBieXRlM19jbGtfZXh0ICAgOiAyOworICB1bnNpZ25lZCBpbnQgYnl0ZTNfZ2F0ZWRfY2xrIDogMTsKKyAgdW5zaWduZWQgaW50IGJ5dGUzX2Nsa19pbnYgICA6IDE7CisgIHVuc2lnbmVkIGludCBieXRlM19kZWxheSAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICAgICAgIDogNDsKK30gcmVnX2lvcF9zYXBfb3V0X3J3X2J1czsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3NhcF9vdXRfcndfYnVzIDQKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3NhcF9vdXRfcndfYnVzIDQKKworLyogUmVnaXN0ZXIgcndfYnVzX2xvX29lLCBzY29wZSBpb3Bfc2FwX291dCwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgYnl0ZTBfY2xrX3NlbCAgIDogMjsKKyAgdW5zaWduZWQgaW50IGJ5dGUwX2Nsa19leHQgICA6IDI7CisgIHVuc2lnbmVkIGludCBieXRlMF9nYXRlZF9jbGsgOiAxOworICB1bnNpZ25lZCBpbnQgYnl0ZTBfY2xrX2ludiAgIDogMTsKKyAgdW5zaWduZWQgaW50IGJ5dGUwX2RlbGF5ICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBieXRlMF9sb2dpYyAgICAgOiAyOworICB1bnNpZ25lZCBpbnQgYnl0ZTBfbG9naWNfc3JjIDogMjsKKyAgdW5zaWduZWQgaW50IGJ5dGUxX2Nsa19zZWwgICA6IDI7CisgIHVuc2lnbmVkIGludCBieXRlMV9jbGtfZXh0ICAgOiAyOworICB1bnNpZ25lZCBpbnQgYnl0ZTFfZ2F0ZWRfY2xrIDogMTsKKyAgdW5zaWduZWQgaW50IGJ5dGUxX2Nsa19pbnYgICA6IDE7CisgIHVuc2lnbmVkIGludCBieXRlMV9kZWxheSAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgYnl0ZTFfbG9naWMgICAgIDogMjsKKyAgdW5zaWduZWQgaW50IGJ5dGUxX2xvZ2ljX3NyYyA6IDI7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICAgICAgOiAxMDsKK30gcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19sb19vZTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3NhcF9vdXRfcndfYnVzX2xvX29lIDgKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3NhcF9vdXRfcndfYnVzX2xvX29lIDgKKworLyogUmVnaXN0ZXIgcndfYnVzX2hpX29lLCBzY29wZSBpb3Bfc2FwX291dCwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgYnl0ZTJfY2xrX3NlbCAgIDogMjsKKyAgdW5zaWduZWQgaW50IGJ5dGUyX2Nsa19leHQgICA6IDI7CisgIHVuc2lnbmVkIGludCBieXRlMl9nYXRlZF9jbGsgOiAxOworICB1bnNpZ25lZCBpbnQgYnl0ZTJfY2xrX2ludiAgIDogMTsKKyAgdW5zaWduZWQgaW50IGJ5dGUyX2RlbGF5ICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBieXRlMl9sb2dpYyAgICAgOiAyOworICB1bnNpZ25lZCBpbnQgYnl0ZTJfbG9naWNfc3JjIDogMjsKKyAgdW5zaWduZWQgaW50IGJ5dGUzX2Nsa19zZWwgICA6IDI7CisgIHVuc2lnbmVkIGludCBieXRlM19jbGtfZXh0ICAgOiAyOworICB1bnNpZ25lZCBpbnQgYnl0ZTNfZ2F0ZWRfY2xrIDogMTsKKyAgdW5zaWduZWQgaW50IGJ5dGUzX2Nsa19pbnYgICA6IDE7CisgIHVuc2lnbmVkIGludCBieXRlM19kZWxheSAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgYnl0ZTNfbG9naWMgICAgIDogMjsKKyAgdW5zaWduZWQgaW50IGJ5dGUzX2xvZ2ljX3NyYyA6IDI7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICAgICAgOiAxMDsKK30gcmVnX2lvcF9zYXBfb3V0X3J3X2J1c19oaV9vZTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3NhcF9vdXRfcndfYnVzX2hpX29lIDEyCisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zYXBfb3V0X3J3X2J1c19oaV9vZSAxMgorCisjZGVmaW5lIFNUUklERV9pb3Bfc2FwX291dF9yd19naW8gNAorLyogUmVnaXN0ZXIgcndfZ2lvLCBzY29wZSBpb3Bfc2FwX291dCwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgb3V0X2Nsa19zZWwgICA6IDM7CisgIHVuc2lnbmVkIGludCBvdXRfY2xrX2V4dCAgIDogMjsKKyAgdW5zaWduZWQgaW50IG91dF9nYXRlZF9jbGsgOiAxOworICB1bnNpZ25lZCBpbnQgb3V0X2Nsa19pbnYgICA6IDE7CisgIHVuc2lnbmVkIGludCBvdXRfZGVsYXkgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG91dF9sb2dpYyAgICAgOiAyOworICB1bnNpZ25lZCBpbnQgb3V0X2xvZ2ljX3NyYyA6IDI7CisgIHVuc2lnbmVkIGludCBvZV9jbGtfc2VsICAgIDogMzsKKyAgdW5zaWduZWQgaW50IG9lX2Nsa19leHQgICAgOiAyOworICB1bnNpZ25lZCBpbnQgb2VfZ2F0ZWRfY2xrICA6IDE7CisgIHVuc2lnbmVkIGludCBvZV9jbGtfaW52ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG9lX2RlbGF5ICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgb2VfbG9naWMgICAgICA6IDI7CisgIHVuc2lnbmVkIGludCBvZV9sb2dpY19zcmMgIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgICAgOiA4OworfSByZWdfaW9wX3NhcF9vdXRfcndfZ2lvOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc2FwX291dF9yd19naW8gMTYKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3NhcF9vdXRfcndfZ2lvIDE2CisKKworLyogQ29uc3RhbnRzICovCitlbnVtIHsKKyAgcmVna19pb3Bfc2FwX291dF9hbHdheXMgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfaW9wX3NhcF9vdXRfYW5kICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX2lvcF9zYXBfb3V0X2NsazAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc2FwX291dF9jbGsxICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfaW9wX3NhcF9vdXRfY2xrMTIgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA0LAorICByZWdrX2lvcF9zYXBfb3V0X2NsazIwMCAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc2FwX291dF9leHQgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIsCisgIHJlZ2tfaW9wX3NhcF9vdXRfZ2F0ZWQgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAzLAorICByZWdrX2lvcF9zYXBfb3V0X2dpbzAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc2FwX291dF9naW8xICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3NhcF9vdXRfZ2lvMTYgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX2lvcF9zYXBfb3V0X2dpbzE3ICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19pb3Bfc2FwX291dF9naW8yNCAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfaW9wX3NhcF9vdXRfZ2lvMjUgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAzLAorICByZWdrX2lvcF9zYXBfb3V0X2dpbzggICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19pb3Bfc2FwX291dF9naW85ICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfaW9wX3NhcF9vdXRfZ2lvX291dDEwICAgICAgICAgICAgICAgPSAweDAwMDAwMDA1LAorICByZWdrX2lvcF9zYXBfb3V0X2dpb19vdXQxOCAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNiwKKyAgcmVna19pb3Bfc2FwX291dF9naW9fb3V0MiAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDQsCisgIHJlZ2tfaW9wX3NhcF9vdXRfZ2lvX291dDI2ICAgICAgICAgICAgICAgPSAweDAwMDAwMDA3LAorICByZWdrX2lvcF9zYXBfb3V0X2ludiAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19pb3Bfc2FwX291dF9uYW5kICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfaW9wX3NhcF9vdXRfbm8gICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zYXBfb3V0X25vbmUgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc2FwX291dF9vbmUgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfaW9wX3NhcF9vdXRfcndfYnVzX2RlZmF1bHQgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zYXBfb3V0X3J3X2J1c19oaV9vZV9kZWZhdWx0ICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc2FwX291dF9yd19idXNfbG9fb2VfZGVmYXVsdCAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3NhcF9vdXRfcndfZ2VuX2dhdGVkX2RlZmF1bHQgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zYXBfb3V0X3J3X2dpb19kZWZhdWx0ICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc2FwX291dF9yd19naW9fc2l6ZSAgICAgICAgICAgICA9IDB4MDAwMDAwMjAsCisgIHJlZ2tfaW9wX3NhcF9vdXRfc3B1X2dpbzYgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX2lvcF9zYXBfb3V0X3NwdV9naW83ICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMywKKyAgcmVna19pb3Bfc2FwX291dF90aW1lcl9ncnAwX3RtcjIgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3NhcF9vdXRfdGltZXJfZ3JwMF90bXIzICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2lvcF9zYXBfb3V0X3RpbWVyX2dycDFfdG1yMiAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19pb3Bfc2FwX291dF90aW1lcl9ncnAxX3RtcjMgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfaW9wX3NhcF9vdXRfdG1yMjAwICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2lvcF9zYXBfb3V0X3llcyAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMQorfTsKKyNlbmRpZiAvKiBfX2lvcF9zYXBfb3V0X2RlZnNfaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9pb3AvaW9wX3N3X2NmZ19kZWZzLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2lvcC9pb3Bfc3dfY2ZnX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGFjOTUyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9pb3AvaW9wX3N3X2NmZ19kZWZzLmgKQEAgLTAsMCArMSw3MjUgQEAKKyNpZm5kZWYgX19pb3Bfc3dfY2ZnX2RlZnNfaAorI2RlZmluZSBfX2lvcF9zd19jZmdfZGVmc19oCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCisgKiAgIGZpbGU6ICAgICAgICAgICBpb3Bfc3dfY2ZnLnIKKyAqIAorICogICBieSAuLi8uLi8uLi90b29scy9yZGVzYy9iaW4vcmRlczJjIC1vdXRmaWxlIGlvcF9zd19jZmdfZGVmcy5oIGlvcF9zd19jZmcucgorICogQW55IGNoYW5nZXMgaGVyZSB3aWxsIGJlIGxvc3QuCisgKgorICogLSotIGJ1ZmZlci1yZWFkLW9ubHk6IHQgLSotCisgKi8KKy8qIE1haW4gYWNjZXNzIG1hY3JvcyAqLworI2lmbmRlZiBSRUdfUkQKKyNkZWZpbmUgUkVHX1JEKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUgorI2RlZmluZSBSRUdfV1IoIHNjb3BlLCBpbnN0LCByZWcsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfVkVDVAorI2RlZmluZSBSRUdfUkRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgIFJFR19SRUFEKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9WRUNUCisjZGVmaW5lIFJFR19XUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgICAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX0lOVAorI2RlZmluZSBSRUdfUkRfSU5UKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSX0lOVAorI2RlZmluZSBSRUdfV1JfSU5UKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlRfVkVDVAorI2RlZmluZSBSRUdfUkRfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlRfVkVDVAorI2RlZmluZSBSRUdfV1JfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4LCB2YWwgKSBcCisgIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1RZUEVfQ09OVgorI2RlZmluZSBSRUdfVFlQRV9DT05WKCB0eXBlLCBvcmd0eXBlLCB2YWwgKSBcCisgICggeyB1bmlvbiB7IG9yZ3R5cGUgbzsgdHlwZSBuOyB9IHI7IHIubyA9IHZhbDsgci5uOyB9ICkKKyNlbmRpZgorCisjaWZuZGVmIHJlZ19wYWdlX3NpemUKKyNkZWZpbmUgcmVnX3BhZ2Vfc2l6ZSA4MTkyCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUgorI2RlZmluZSBSRUdfQUREUiggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFJfVkVDVAorI2RlZmluZSBSRUdfQUREUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKy8qIEMtY29kZSBmb3IgcmVnaXN0ZXIgc2NvcGUgaW9wX3N3X2NmZyAqLworCisvKiBSZWdpc3RlciByd19jcmNfcGFyX293bmVyLCBzY29wZSBpb3Bfc3dfY2ZnLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBjZmcgOiAyOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMzA7Cit9IHJlZ19pb3Bfc3dfY2ZnX3J3X2NyY19wYXJfb3duZXI7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jZmdfcndfY3JjX3Bhcl9vd25lciAwCisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jZmdfcndfY3JjX3Bhcl9vd25lciAwCisKKy8qIFJlZ2lzdGVyIHJ3X2RtY19pbl9vd25lciwgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgY2ZnIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDMwOworfSByZWdfaW9wX3N3X2NmZ19yd19kbWNfaW5fb3duZXI7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jZmdfcndfZG1jX2luX293bmVyIDQKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X2NmZ19yd19kbWNfaW5fb3duZXIgNAorCisvKiBSZWdpc3RlciByd19kbWNfb3V0X293bmVyLCBzY29wZSBpb3Bfc3dfY2ZnLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBjZmcgOiAyOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMzA7Cit9IHJlZ19pb3Bfc3dfY2ZnX3J3X2RtY19vdXRfb3duZXI7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jZmdfcndfZG1jX291dF9vd25lciA4CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jZmdfcndfZG1jX291dF9vd25lciA4CisKKy8qIFJlZ2lzdGVyIHJ3X2ZpZm9faW5fb3duZXIsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGNmZyA6IDI7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAzMDsKK30gcmVnX2lvcF9zd19jZmdfcndfZmlmb19pbl9vd25lcjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X2NmZ19yd19maWZvX2luX293bmVyIDEyCisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jZmdfcndfZmlmb19pbl9vd25lciAxMgorCisvKiBSZWdpc3RlciByd19maWZvX2luX2V4dHJhX293bmVyLCBzY29wZSBpb3Bfc3dfY2ZnLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBjZmcgOiAyOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMzA7Cit9IHJlZ19pb3Bfc3dfY2ZnX3J3X2ZpZm9faW5fZXh0cmFfb3duZXI7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jZmdfcndfZmlmb19pbl9leHRyYV9vd25lciAxNgorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfY2ZnX3J3X2ZpZm9faW5fZXh0cmFfb3duZXIgMTYKKworLyogUmVnaXN0ZXIgcndfZmlmb19vdXRfb3duZXIsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGNmZyA6IDI7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAzMDsKK30gcmVnX2lvcF9zd19jZmdfcndfZmlmb19vdXRfb3duZXI7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jZmdfcndfZmlmb19vdXRfb3duZXIgMjAKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X2NmZ19yd19maWZvX291dF9vd25lciAyMAorCisvKiBSZWdpc3RlciByd19maWZvX291dF9leHRyYV9vd25lciwgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgY2ZnIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDMwOworfSByZWdfaW9wX3N3X2NmZ19yd19maWZvX291dF9leHRyYV9vd25lcjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X2NmZ19yd19maWZvX291dF9leHRyYV9vd25lciAyNAorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfY2ZnX3J3X2ZpZm9fb3V0X2V4dHJhX293bmVyIDI0CisKKy8qIFJlZ2lzdGVyIHJ3X3NhcF9pbl9vd25lciwgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgY2ZnIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDMwOworfSByZWdfaW9wX3N3X2NmZ19yd19zYXBfaW5fb3duZXI7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jZmdfcndfc2FwX2luX293bmVyIDI4CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jZmdfcndfc2FwX2luX293bmVyIDI4CisKKy8qIFJlZ2lzdGVyIHJ3X3NhcF9vdXRfb3duZXIsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGNmZyA6IDI7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAzMDsKK30gcmVnX2lvcF9zd19jZmdfcndfc2FwX291dF9vd25lcjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X2NmZ19yd19zYXBfb3V0X293bmVyIDMyCisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jZmdfcndfc2FwX291dF9vd25lciAzMgorCisvKiBSZWdpc3RlciByd19zY3JjX2luX293bmVyLCBzY29wZSBpb3Bfc3dfY2ZnLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBjZmcgOiAyOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMzA7Cit9IHJlZ19pb3Bfc3dfY2ZnX3J3X3NjcmNfaW5fb3duZXI7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jZmdfcndfc2NyY19pbl9vd25lciAzNgorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfY2ZnX3J3X3NjcmNfaW5fb3duZXIgMzYKKworLyogUmVnaXN0ZXIgcndfc2NyY19vdXRfb3duZXIsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGNmZyA6IDI7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAzMDsKK30gcmVnX2lvcF9zd19jZmdfcndfc2NyY19vdXRfb3duZXI7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jZmdfcndfc2NyY19vdXRfb3duZXIgNDAKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X2NmZ19yd19zY3JjX291dF9vd25lciA0MAorCisvKiBSZWdpc3RlciByd19zcHVfb3duZXIsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGNmZyA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAzMTsKK30gcmVnX2lvcF9zd19jZmdfcndfc3B1X293bmVyOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfY2ZnX3J3X3NwdV9vd25lciA0NAorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfY2ZnX3J3X3NwdV9vd25lciA0NAorCisvKiBSZWdpc3RlciByd190aW1lcl9ncnAwX293bmVyLCBzY29wZSBpb3Bfc3dfY2ZnLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBjZmcgOiAyOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMzA7Cit9IHJlZ19pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDBfb3duZXI7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jZmdfcndfdGltZXJfZ3JwMF9vd25lciA0OAorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDBfb3duZXIgNDgKKworLyogUmVnaXN0ZXIgcndfdGltZXJfZ3JwMV9vd25lciwgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgY2ZnIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDMwOworfSByZWdfaW9wX3N3X2NmZ19yd190aW1lcl9ncnAxX293bmVyOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDFfb3duZXIgNTIKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X2NmZ19yd190aW1lcl9ncnAxX293bmVyIDUyCisKKy8qIFJlZ2lzdGVyIHJ3X3RyaWdnZXJfZ3JwMF9vd25lciwgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgY2ZnIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDMwOworfSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycDBfb3duZXI7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnAwX293bmVyIDU2CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnAwX293bmVyIDU2CisKKy8qIFJlZ2lzdGVyIHJ3X3RyaWdnZXJfZ3JwMV9vd25lciwgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgY2ZnIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDMwOworfSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycDFfb3duZXI7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnAxX293bmVyIDYwCisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnAxX293bmVyIDYwCisKKy8qIFJlZ2lzdGVyIHJ3X3RyaWdnZXJfZ3JwMl9vd25lciwgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgY2ZnIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDMwOworfSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycDJfb3duZXI7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnAyX293bmVyIDY0CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnAyX293bmVyIDY0CisKKy8qIFJlZ2lzdGVyIHJ3X3RyaWdnZXJfZ3JwM19vd25lciwgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgY2ZnIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDMwOworfSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycDNfb3duZXI7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnAzX293bmVyIDY4CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnAzX293bmVyIDY4CisKKy8qIFJlZ2lzdGVyIHJ3X3RyaWdnZXJfZ3JwNF9vd25lciwgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgY2ZnIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDMwOworfSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycDRfb3duZXI7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnA0X293bmVyIDcyCisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnA0X293bmVyIDcyCisKKy8qIFJlZ2lzdGVyIHJ3X3RyaWdnZXJfZ3JwNV9vd25lciwgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgY2ZnIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDMwOworfSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycDVfb3duZXI7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnA1X293bmVyIDc2CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnA1X293bmVyIDc2CisKKy8qIFJlZ2lzdGVyIHJ3X3RyaWdnZXJfZ3JwNl9vd25lciwgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgY2ZnIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDMwOworfSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycDZfb3duZXI7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnA2X293bmVyIDgwCisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnA2X293bmVyIDgwCisKKy8qIFJlZ2lzdGVyIHJ3X3RyaWdnZXJfZ3JwN19vd25lciwgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgY2ZnIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDMwOworfSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycDdfb3duZXI7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnA3X293bmVyIDg0CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnA3X293bmVyIDg0CisKKy8qIFJlZ2lzdGVyIHJ3X2J1c19tYXNrLCBzY29wZSBpb3Bfc3dfY2ZnLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBieXRlMCA6IDg7CisgIHVuc2lnbmVkIGludCBieXRlMSA6IDg7CisgIHVuc2lnbmVkIGludCBieXRlMiA6IDg7CisgIHVuc2lnbmVkIGludCBieXRlMyA6IDg7Cit9IHJlZ19pb3Bfc3dfY2ZnX3J3X2J1c19tYXNrOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfY2ZnX3J3X2J1c19tYXNrIDg4CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jZmdfcndfYnVzX21hc2sgODgKKworLyogUmVnaXN0ZXIgcndfYnVzX29lX21hc2ssIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGJ5dGUwIDogMTsKKyAgdW5zaWduZWQgaW50IGJ5dGUxIDogMTsKKyAgdW5zaWduZWQgaW50IGJ5dGUyIDogMTsKKyAgdW5zaWduZWQgaW50IGJ5dGUzIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI4OworfSByZWdfaW9wX3N3X2NmZ19yd19idXNfb2VfbWFzazsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X2NmZ19yd19idXNfb2VfbWFzayA5MgorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfY2ZnX3J3X2J1c19vZV9tYXNrIDkyCisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19tYXNrLCBzY29wZSBpb3Bfc3dfY2ZnLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCB2YWwgOiAzMjsKK30gcmVnX2lvcF9zd19jZmdfcndfZ2lvX21hc2s7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jZmdfcndfZ2lvX21hc2sgOTYKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X2NmZ19yd19naW9fbWFzayA5NgorCisvKiBSZWdpc3RlciByd19naW9fb2VfbWFzaywgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgdmFsIDogMzI7Cit9IHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vZV9tYXNrOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfY2ZnX3J3X2dpb19vZV9tYXNrIDEwMAorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfY2ZnX3J3X2dpb19vZV9tYXNrIDEwMAorCisvKiBSZWdpc3RlciByd19waW5tYXBwaW5nLCBzY29wZSBpb3Bfc3dfY2ZnLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBidXNfYnl0ZTAgOiAyOworICB1bnNpZ25lZCBpbnQgYnVzX2J5dGUxIDogMjsKKyAgdW5zaWduZWQgaW50IGJ1c19ieXRlMiA6IDI7CisgIHVuc2lnbmVkIGludCBidXNfYnl0ZTMgOiAyOworICB1bnNpZ25lZCBpbnQgZ2lvM18wICAgIDogMjsKKyAgdW5zaWduZWQgaW50IGdpbzdfNCAgICA6IDI7CisgIHVuc2lnbmVkIGludCBnaW8xMV84ICAgOiAyOworICB1bnNpZ25lZCBpbnQgZ2lvMTVfMTIgIDogMjsKKyAgdW5zaWduZWQgaW50IGdpbzE5XzE2ICA6IDI7CisgIHVuc2lnbmVkIGludCBnaW8yM18yMCAgOiAyOworICB1bnNpZ25lZCBpbnQgZ2lvMjdfMjQgIDogMjsKKyAgdW5zaWduZWQgaW50IGdpbzMxXzI4ICA6IDI7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgOiA4OworfSByZWdfaW9wX3N3X2NmZ19yd19waW5tYXBwaW5nOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfY2ZnX3J3X3Bpbm1hcHBpbmcgMTA0CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jZmdfcndfcGlubWFwcGluZyAxMDQKKworLyogUmVnaXN0ZXIgcndfYnVzX291dF9jZmcsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGJ1c19sbyAgICA6IDI7CisgIHVuc2lnbmVkIGludCBidXNfaGkgICAgOiAyOworICB1bnNpZ25lZCBpbnQgYnVzX2xvX29lIDogMjsKKyAgdW5zaWduZWQgaW50IGJ1c19oaV9vZSA6IDI7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgOiAyNDsKK30gcmVnX2lvcF9zd19jZmdfcndfYnVzX291dF9jZmc7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jZmdfcndfYnVzX291dF9jZmcgMTA4CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jZmdfcndfYnVzX291dF9jZmcgMTA4CisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19vdXRfZ3JwMF9jZmcsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGdpbzAgICAgOiAzOworICB1bnNpZ25lZCBpbnQgZ2lvMF9vZSA6IDE7CisgIHVuc2lnbmVkIGludCBnaW8xICAgIDogMzsKKyAgdW5zaWduZWQgaW50IGdpbzFfb2UgOiAxOworICB1bnNpZ25lZCBpbnQgZ2lvMiAgICA6IDM7CisgIHVuc2lnbmVkIGludCBnaW8yX29lIDogMTsKKyAgdW5zaWduZWQgaW50IGdpbzMgICAgOiAzOworICB1bnNpZ25lZCBpbnQgZ2lvM19vZSA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgIDogMTY7Cit9IHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMF9jZmc7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAwX2NmZyAxMTIKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDBfY2ZnIDExMgorCisvKiBSZWdpc3RlciByd19naW9fb3V0X2dycDFfY2ZnLCBzY29wZSBpb3Bfc3dfY2ZnLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBnaW80ICAgIDogMzsKKyAgdW5zaWduZWQgaW50IGdpbzRfb2UgOiAxOworICB1bnNpZ25lZCBpbnQgZ2lvNSAgICA6IDM7CisgIHVuc2lnbmVkIGludCBnaW81X29lIDogMTsKKyAgdW5zaWduZWQgaW50IGdpbzYgICAgOiAzOworICB1bnNpZ25lZCBpbnQgZ2lvNl9vZSA6IDE7CisgIHVuc2lnbmVkIGludCBnaW83ICAgIDogMzsKKyAgdW5zaWduZWQgaW50IGdpbzdfb2UgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICA6IDE2OworfSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDFfY2ZnOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMV9jZmcgMTE2CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAxX2NmZyAxMTYKKworLyogUmVnaXN0ZXIgcndfZ2lvX291dF9ncnAyX2NmZywgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZ2lvOCAgICAgOiAzOworICB1bnNpZ25lZCBpbnQgZ2lvOF9vZSAgOiAxOworICB1bnNpZ25lZCBpbnQgZ2lvOSAgICAgOiAzOworICB1bnNpZ25lZCBpbnQgZ2lvOV9vZSAgOiAxOworICB1bnNpZ25lZCBpbnQgZ2lvMTAgICAgOiAzOworICB1bnNpZ25lZCBpbnQgZ2lvMTBfb2UgOiAxOworICB1bnNpZ25lZCBpbnQgZ2lvMTEgICAgOiAzOworICB1bnNpZ25lZCBpbnQgZ2lvMTFfb2UgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgOiAxNjsKK30gcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAyX2NmZzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDJfY2ZnIDEyMAorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMl9jZmcgMTIwCisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19vdXRfZ3JwM19jZmcsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGdpbzEyICAgIDogMzsKKyAgdW5zaWduZWQgaW50IGdpbzEyX29lIDogMTsKKyAgdW5zaWduZWQgaW50IGdpbzEzICAgIDogMzsKKyAgdW5zaWduZWQgaW50IGdpbzEzX29lIDogMTsKKyAgdW5zaWduZWQgaW50IGdpbzE0ICAgIDogMzsKKyAgdW5zaWduZWQgaW50IGdpbzE0X29lIDogMTsKKyAgdW5zaWduZWQgaW50IGdpbzE1ICAgIDogMzsKKyAgdW5zaWduZWQgaW50IGdpbzE1X29lIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgIDogMTY7Cit9IHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwM19jZmc7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAzX2NmZyAxMjQKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDNfY2ZnIDEyNAorCisvKiBSZWdpc3RlciByd19naW9fb3V0X2dycDRfY2ZnLCBzY29wZSBpb3Bfc3dfY2ZnLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBnaW8xNiAgICA6IDM7CisgIHVuc2lnbmVkIGludCBnaW8xNl9vZSA6IDE7CisgIHVuc2lnbmVkIGludCBnaW8xNyAgICA6IDM7CisgIHVuc2lnbmVkIGludCBnaW8xN19vZSA6IDE7CisgIHVuc2lnbmVkIGludCBnaW8xOCAgICA6IDM7CisgIHVuc2lnbmVkIGludCBnaW8xOF9vZSA6IDE7CisgIHVuc2lnbmVkIGludCBnaW8xOSAgICA6IDM7CisgIHVuc2lnbmVkIGludCBnaW8xOV9vZSA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICA6IDE2OworfSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDRfY2ZnOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwNF9jZmcgMTI4CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA0X2NmZyAxMjgKKworLyogUmVnaXN0ZXIgcndfZ2lvX291dF9ncnA1X2NmZywgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZ2lvMjAgICAgOiAzOworICB1bnNpZ25lZCBpbnQgZ2lvMjBfb2UgOiAxOworICB1bnNpZ25lZCBpbnQgZ2lvMjEgICAgOiAzOworICB1bnNpZ25lZCBpbnQgZ2lvMjFfb2UgOiAxOworICB1bnNpZ25lZCBpbnQgZ2lvMjIgICAgOiAzOworICB1bnNpZ25lZCBpbnQgZ2lvMjJfb2UgOiAxOworICB1bnNpZ25lZCBpbnQgZ2lvMjMgICAgOiAzOworICB1bnNpZ25lZCBpbnQgZ2lvMjNfb2UgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgOiAxNjsKK30gcmVnX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA1X2NmZzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDVfY2ZnIDEzMgorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwNV9jZmcgMTMyCisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19vdXRfZ3JwNl9jZmcsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGdpbzI0ICAgIDogMzsKKyAgdW5zaWduZWQgaW50IGdpbzI0X29lIDogMTsKKyAgdW5zaWduZWQgaW50IGdpbzI1ICAgIDogMzsKKyAgdW5zaWduZWQgaW50IGdpbzI1X29lIDogMTsKKyAgdW5zaWduZWQgaW50IGdpbzI2ICAgIDogMzsKKyAgdW5zaWduZWQgaW50IGdpbzI2X29lIDogMTsKKyAgdW5zaWduZWQgaW50IGdpbzI3ICAgIDogMzsKKyAgdW5zaWduZWQgaW50IGdpbzI3X29lIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgIDogMTY7Cit9IHJlZ19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwNl9jZmc7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA2X2NmZyAxMzYKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDZfY2ZnIDEzNgorCisvKiBSZWdpc3RlciByd19naW9fb3V0X2dycDdfY2ZnLCBzY29wZSBpb3Bfc3dfY2ZnLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBnaW8yOCAgICA6IDM7CisgIHVuc2lnbmVkIGludCBnaW8yOF9vZSA6IDE7CisgIHVuc2lnbmVkIGludCBnaW8yOSAgICA6IDM7CisgIHVuc2lnbmVkIGludCBnaW8yOV9vZSA6IDE7CisgIHVuc2lnbmVkIGludCBnaW8zMCAgICA6IDM7CisgIHVuc2lnbmVkIGludCBnaW8zMF9vZSA6IDE7CisgIHVuc2lnbmVkIGludCBnaW8zMSAgICA6IDM7CisgIHVuc2lnbmVkIGludCBnaW8zMV9vZSA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICA6IDE2OworfSByZWdfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDdfY2ZnOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwN19jZmcgMTQwCisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA3X2NmZyAxNDAKKworLyogUmVnaXN0ZXIgcndfc3B1X2NmZywgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgYnVzMF9pbiA6IDE7CisgIHVuc2lnbmVkIGludCBidXMxX2luIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgOiAzMDsKK30gcmVnX2lvcF9zd19jZmdfcndfc3B1X2NmZzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X2NmZ19yd19zcHVfY2ZnIDE0NAorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfY2ZnX3J3X3NwdV9jZmcgMTQ0CisKKy8qIFJlZ2lzdGVyIHJ3X3RpbWVyX2dycDBfY2ZnLCBzY29wZSBpb3Bfc3dfY2ZnLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBleHRfY2xrICA6IDM7CisgIHVuc2lnbmVkIGludCB0bXIwX2VuICA6IDI7CisgIHVuc2lnbmVkIGludCB0bXIxX2VuICA6IDI7CisgIHVuc2lnbmVkIGludCB0bXIyX2VuICA6IDI7CisgIHVuc2lnbmVkIGludCB0bXIzX2VuICA6IDI7CisgIHVuc2lnbmVkIGludCB0bXIwX2RpcyA6IDI7CisgIHVuc2lnbmVkIGludCB0bXIxX2RpcyA6IDI7CisgIHVuc2lnbmVkIGludCB0bXIyX2RpcyA6IDI7CisgIHVuc2lnbmVkIGludCB0bXIzX2RpcyA6IDI7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICA6IDEzOworfSByZWdfaW9wX3N3X2NmZ19yd190aW1lcl9ncnAwX2NmZzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X2NmZ19yd190aW1lcl9ncnAwX2NmZyAxNDgKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X2NmZ19yd190aW1lcl9ncnAwX2NmZyAxNDgKKworLyogUmVnaXN0ZXIgcndfdGltZXJfZ3JwMV9jZmcsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGV4dF9jbGsgIDogMzsKKyAgdW5zaWduZWQgaW50IHRtcjBfZW4gIDogMjsKKyAgdW5zaWduZWQgaW50IHRtcjFfZW4gIDogMjsKKyAgdW5zaWduZWQgaW50IHRtcjJfZW4gIDogMjsKKyAgdW5zaWduZWQgaW50IHRtcjNfZW4gIDogMjsKKyAgdW5zaWduZWQgaW50IHRtcjBfZGlzIDogMjsKKyAgdW5zaWduZWQgaW50IHRtcjFfZGlzIDogMjsKKyAgdW5zaWduZWQgaW50IHRtcjJfZGlzIDogMjsKKyAgdW5zaWduZWQgaW50IHRtcjNfZGlzIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgIDogMTM7Cit9IHJlZ19pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDFfY2ZnOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDFfY2ZnIDE1MgorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDFfY2ZnIDE1MgorCisvKiBSZWdpc3RlciByd190cmlnZ2VyX2dycHNfY2ZnLCBzY29wZSBpb3Bfc3dfY2ZnLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBncnAwX2RpcyA6IDE7CisgIHVuc2lnbmVkIGludCBncnAwX2VuICA6IDE7CisgIHVuc2lnbmVkIGludCBncnAxX2RpcyA6IDE7CisgIHVuc2lnbmVkIGludCBncnAxX2VuICA6IDE7CisgIHVuc2lnbmVkIGludCBncnAyX2RpcyA6IDE7CisgIHVuc2lnbmVkIGludCBncnAyX2VuICA6IDE7CisgIHVuc2lnbmVkIGludCBncnAzX2RpcyA6IDE7CisgIHVuc2lnbmVkIGludCBncnAzX2VuICA6IDE7CisgIHVuc2lnbmVkIGludCBncnA0X2RpcyA6IDE7CisgIHVuc2lnbmVkIGludCBncnA0X2VuICA6IDE7CisgIHVuc2lnbmVkIGludCBncnA1X2RpcyA6IDE7CisgIHVuc2lnbmVkIGludCBncnA1X2VuICA6IDE7CisgIHVuc2lnbmVkIGludCBncnA2X2RpcyA6IDE7CisgIHVuc2lnbmVkIGludCBncnA2X2VuICA6IDE7CisgIHVuc2lnbmVkIGludCBncnA3X2RpcyA6IDE7CisgIHVuc2lnbmVkIGludCBncnA3X2VuICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICA6IDE2OworfSByZWdfaW9wX3N3X2NmZ19yd190cmlnZ2VyX2dycHNfY2ZnOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3Jwc19jZmcgMTU2CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jZmdfcndfdHJpZ2dlcl9ncnBzX2NmZyAxNTYKKworLyogUmVnaXN0ZXIgcndfcGRwX2NmZywgc2NvcGUgaW9wX3N3X2NmZywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgb3V0X3N0cmIgOiA0OworICB1bnNpZ25lZCBpbnQgaW5fc3JjICAgOiAyOworICB1bnNpZ25lZCBpbnQgaW5fc2l6ZSAgOiAzOworICB1bnNpZ25lZCBpbnQgaW5fbGFzdCAgOiAyOworICB1bnNpZ25lZCBpbnQgaW5fc3RyYiAgOiA0OworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgOiAxNzsKK30gcmVnX2lvcF9zd19jZmdfcndfcGRwX2NmZzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X2NmZ19yd19wZHBfY2ZnIDE2MAorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfY2ZnX3J3X3BkcF9jZmcgMTYwCisKKy8qIFJlZ2lzdGVyIHJ3X3NkcF9jZmcsIHNjb3BlIGlvcF9zd19jZmcsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHNkcF9vdXRfc3RyYiA6IDM7CisgIHVuc2lnbmVkIGludCBzZHBfaW5fZGF0YSAgOiAzOworICB1bnNpZ25lZCBpbnQgc2RwX2luX2xhc3QgIDogMjsKKyAgdW5zaWduZWQgaW50IHNkcF9pbl9zdHJiICA6IDM7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICAgOiAyMTsKK30gcmVnX2lvcF9zd19jZmdfcndfc2RwX2NmZzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X2NmZ19yd19zZHBfY2ZnIDE2NAorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfY2ZnX3J3X3NkcF9jZmcgMTY0CisKKworLyogQ29uc3RhbnRzICovCitlbnVtIHsKKyAgcmVna19pb3Bfc3dfY2ZnX2EgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfaW9wX3N3X2NmZ19iICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX2lvcF9zd19jZmdfYnVzICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX2J1c19yb3QxNiAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIsCisgIHJlZ2tfaW9wX3N3X2NmZ19idXNfcm90MjQgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAzLAorICByZWdrX2lvcF9zd19jZmdfYnVzX3JvdDggICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19pb3Bfc3dfY2ZnX2NsazEyICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X2NmZ19jcHUgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19jZmdfZ2F0ZWRfY2xrMCAgICAgICAgICAgICAgID0gMHgwMDAwMDAwZSwKKyAgcmVna19pb3Bfc3dfY2ZnX2dhdGVkX2NsazEgICAgICAgICAgICAgICA9IDB4MDAwMDAwMGYsCisgIHJlZ2tfaW9wX3N3X2NmZ19naW8wICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA0LAorICByZWdrX2lvcF9zd19jZmdfZ2lvMSAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19pb3Bfc3dfY2ZnX2dpbzIgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDUsCisgIHJlZ2tfaW9wX3N3X2NmZ19naW8zICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX2lvcF9zd19jZmdfZ2lvNCAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNiwKKyAgcmVna19pb3Bfc3dfY2ZnX2dpbzUgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfaW9wX3N3X2NmZ19naW82ICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA3LAorICByZWdrX2lvcF9zd19jZmdfZ2lvNyAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNCwKKyAgcmVna19pb3Bfc3dfY2ZnX2dpb19pbjE4ICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIsCisgIHJlZ2tfaW9wX3N3X2NmZ19naW9faW4xOSAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAzLAorICByZWdrX2lvcF9zd19jZmdfZ2lvX2luMjAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNCwKKyAgcmVna19pb3Bfc3dfY2ZnX2dpb19pbjIxICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDUsCisgIHJlZ2tfaW9wX3N3X2NmZ19naW9faW4yNiAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA2LAorICByZWdrX2lvcF9zd19jZmdfZ2lvX2luMjcgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNywKKyAgcmVna19pb3Bfc3dfY2ZnX2dpb19pbjQgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X2NmZ19naW9faW41ICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2lvcF9zd19jZmdfbGFzdF90aW1lcl9ncnAwX3RtcjIgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19pb3Bfc3dfY2ZnX2xhc3RfdGltZXJfZ3JwMV90bXIyICAgICA9IDB4MDAwMDAwMDIsCisgIHJlZ2tfaW9wX3N3X2NmZ19sYXN0X3RpbWVyX2dycDFfdG1yMyAgICAgPSAweDAwMDAwMDAzLAorICByZWdrX2lvcF9zd19jZmdfbXB1ICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19pb3Bfc3dfY2ZnX25vbmUgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X2NmZ19wZHBfb3V0ICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2lvcF9zd19jZmdfcGRwX291dF9oaSAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19pb3Bfc3dfY2ZnX3BkcF9vdXRfbG8gICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X2NmZ19yd19idXNfbWFza19kZWZhdWx0ICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19jZmdfcndfYnVzX29lX21hc2tfZGVmYXVsdCAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3J3X2J1c19vdXRfY2ZnX2RlZmF1bHQgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X2NmZ19yd19jcmNfcGFyX293bmVyX2RlZmF1bHQgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19jZmdfcndfZG1jX2luX293bmVyX2RlZmF1bHQgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3J3X2RtY19vdXRfb3duZXJfZGVmYXVsdCA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X2NmZ19yd19maWZvX2luX2V4dHJhX293bmVyX2RlZmF1bHQgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19jZmdfcndfZmlmb19pbl9vd25lcl9kZWZhdWx0ID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3J3X2ZpZm9fb3V0X2V4dHJhX293bmVyX2RlZmF1bHQgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19jZmdfcndfZmlmb19vdXRfb3duZXJfZGVmYXVsdCA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X2NmZ19yd19naW9fbWFza19kZWZhdWx0ICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19jZmdfcndfZ2lvX29lX21hc2tfZGVmYXVsdCAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwMF9jZmdfZGVmYXVsdCA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDFfY2ZnX2RlZmF1bHQgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnAyX2NmZ19kZWZhdWx0ID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwM19jZmdfZGVmYXVsdCA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDRfY2ZnX2RlZmF1bHQgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19jZmdfcndfZ2lvX291dF9ncnA1X2NmZ19kZWZhdWx0ID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3J3X2dpb19vdXRfZ3JwNl9jZmdfZGVmYXVsdCA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X2NmZ19yd19naW9fb3V0X2dycDdfY2ZnX2RlZmF1bHQgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19jZmdfcndfcGRwX2NmZ19kZWZhdWx0ICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3J3X3Bpbm1hcHBpbmdfZGVmYXVsdCAgICA9IDB4MDA1NTU1NTUsCisgIHJlZ2tfaW9wX3N3X2NmZ19yd19zYXBfaW5fb3duZXJfZGVmYXVsdCAgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19jZmdfcndfc2FwX291dF9vd25lcl9kZWZhdWx0ID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3J3X3NjcmNfaW5fb3duZXJfZGVmYXVsdCA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X2NmZ19yd19zY3JjX291dF9vd25lcl9kZWZhdWx0ID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3J3X3NkcF9jZmdfZGVmYXVsdCAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X2NmZ19yd19zcHVfY2ZnX2RlZmF1bHQgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19jZmdfcndfc3B1X293bmVyX2RlZmF1bHQgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDBfY2ZnX2RlZmF1bHQgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19jZmdfcndfdGltZXJfZ3JwMF9vd25lcl9kZWZhdWx0ID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3J3X3RpbWVyX2dycDFfY2ZnX2RlZmF1bHQgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19jZmdfcndfdGltZXJfZ3JwMV9vd25lcl9kZWZhdWx0ID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3JwMF9vd25lcl9kZWZhdWx0ID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3JwMV9vd25lcl9kZWZhdWx0ID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3JwMl9vd25lcl9kZWZhdWx0ID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3JwM19vd25lcl9kZWZhdWx0ID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3JwNF9vd25lcl9kZWZhdWx0ID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3JwNV9vd25lcl9kZWZhdWx0ID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3JwNl9vd25lcl9kZWZhdWx0ID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3JwN19vd25lcl9kZWZhdWx0ID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3J3X3RyaWdnZXJfZ3Jwc19jZmdfZGVmYXVsdCA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X2NmZ19zZHBfb3V0ICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA0LAorICByZWdrX2lvcF9zd19jZmdfc2l6ZTE2ICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19pb3Bfc3dfY2ZnX3NpemUyNCAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfaW9wX3N3X2NmZ19zaXplMzIgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA0LAorICByZWdrX2lvcF9zd19jZmdfc2l6ZTggICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19pb3Bfc3dfY2ZnX3NwdSAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIsCisgIHJlZ2tfaW9wX3N3X2NmZ19zcHVfYnVzX291dDBfaGkgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX2lvcF9zd19jZmdfc3B1X2J1c19vdXQwX2xvICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19pb3Bfc3dfY2ZnX3NwdV9idXNfb3V0MV9oaSAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfaW9wX3N3X2NmZ19zcHVfYnVzX291dDFfbG8gICAgICAgICAgPSAweDAwMDAwMDAzLAorICByZWdrX2lvcF9zd19jZmdfc3B1X2cwICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNywKKyAgcmVna19pb3Bfc3dfY2ZnX3NwdV9nMSAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDcsCisgIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZzIgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA3LAorICByZWdrX2lvcF9zd19jZmdfc3B1X2czICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNywKKyAgcmVna19pb3Bfc3dfY2ZnX3NwdV9nNCAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDcsCisgIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZzUgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA3LAorICByZWdrX2lvcF9zd19jZmdfc3B1X2c2ICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNywKKyAgcmVna19pb3Bfc3dfY2ZnX3NwdV9nNyAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDcsCisgIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvMCAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19jZmdfc3B1X2dpbzEgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW81ICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDUsCisgIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvNiAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA2LAorICByZWdrX2lvcF9zd19jZmdfc3B1X2dpbzcgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNywKKyAgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9fb3V0MCAgICAgICAgICAgICA9IDB4MDAwMDAwMDgsCisgIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvX291dDEgICAgICAgICAgICAgPSAweDAwMDAwMDA5LAorICByZWdrX2lvcF9zd19jZmdfc3B1X2dpb19vdXQyICAgICAgICAgICAgID0gMHgwMDAwMDAwYSwKKyAgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9fb3V0MyAgICAgICAgICAgICA9IDB4MDAwMDAwMGIsCisgIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvX291dDQgICAgICAgICAgICAgPSAweDAwMDAwMDBjLAorICByZWdrX2lvcF9zd19jZmdfc3B1X2dpb19vdXQ1ICAgICAgICAgICAgID0gMHgwMDAwMDAwZCwKKyAgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9fb3V0NiAgICAgICAgICAgICA9IDB4MDAwMDAwMGUsCisgIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvX291dDcgICAgICAgICAgICAgPSAweDAwMDAwMDBmLAorICByZWdrX2lvcF9zd19jZmdfc3B1X2dpb291dDAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9vdXQxICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvb3V0MTAgICAgICAgICAgICAgPSAweDAwMDAwMDA3LAorICByZWdrX2lvcF9zd19jZmdfc3B1X2dpb291dDExICAgICAgICAgICAgID0gMHgwMDAwMDAwNywKKyAgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9vdXQxMiAgICAgICAgICAgICA9IDB4MDAwMDAwMDcsCisgIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvb3V0MTMgICAgICAgICAgICAgPSAweDAwMDAwMDA3LAorICByZWdrX2lvcF9zd19jZmdfc3B1X2dpb291dDE0ICAgICAgICAgICAgID0gMHgwMDAwMDAwNywKKyAgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9vdXQxNSAgICAgICAgICAgICA9IDB4MDAwMDAwMDcsCisgIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvb3V0MTYgICAgICAgICAgICAgPSAweDAwMDAwMDA3LAorICByZWdrX2lvcF9zd19jZmdfc3B1X2dpb291dDE3ICAgICAgICAgICAgID0gMHgwMDAwMDAwNywKKyAgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9vdXQxOCAgICAgICAgICAgICA9IDB4MDAwMDAwMDcsCisgIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvb3V0MTkgICAgICAgICAgICAgPSAweDAwMDAwMDA3LAorICByZWdrX2lvcF9zd19jZmdfc3B1X2dpb291dDIgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9vdXQyMCAgICAgICAgICAgICA9IDB4MDAwMDAwMDcsCisgIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvb3V0MjEgICAgICAgICAgICAgPSAweDAwMDAwMDA3LAorICByZWdrX2lvcF9zd19jZmdfc3B1X2dpb291dDIyICAgICAgICAgICAgID0gMHgwMDAwMDAwNywKKyAgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9vdXQyMyAgICAgICAgICAgICA9IDB4MDAwMDAwMDcsCisgIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvb3V0MjQgICAgICAgICAgICAgPSAweDAwMDAwMDA3LAorICByZWdrX2lvcF9zd19jZmdfc3B1X2dpb291dDI1ICAgICAgICAgICAgID0gMHgwMDAwMDAwNywKKyAgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9vdXQyNiAgICAgICAgICAgICA9IDB4MDAwMDAwMDcsCisgIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvb3V0MjcgICAgICAgICAgICAgPSAweDAwMDAwMDA3LAorICByZWdrX2lvcF9zd19jZmdfc3B1X2dpb291dDI4ICAgICAgICAgICAgID0gMHgwMDAwMDAwNywKKyAgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9vdXQyOSAgICAgICAgICAgICA9IDB4MDAwMDAwMDcsCisgIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvb3V0MyAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2lvcF9zd19jZmdfc3B1X2dpb291dDMwICAgICAgICAgICAgID0gMHgwMDAwMDAwNywKKyAgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9vdXQzMSAgICAgICAgICAgICA9IDB4MDAwMDAwMDcsCisgIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvb3V0NCAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX2lvcF9zd19jZmdfc3B1X2dpb291dDUgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9vdXQ2ICAgICAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfaW9wX3N3X2NmZ19zcHVfZ2lvb3V0NyAgICAgICAgICAgICAgPSAweDAwMDAwMDAzLAorICByZWdrX2lvcF9zd19jZmdfc3B1X2dpb291dDggICAgICAgICAgICAgID0gMHgwMDAwMDAwNywKKyAgcmVna19pb3Bfc3dfY2ZnX3NwdV9naW9vdXQ5ICAgICAgICAgICAgICA9IDB4MDAwMDAwMDcsCisgIHJlZ2tfaW9wX3N3X2NmZ19zdHJiX3RpbWVyX2dycDBfdG1yMCAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2lvcF9zd19jZmdfc3RyYl90aW1lcl9ncnAwX3RtcjEgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19pb3Bfc3dfY2ZnX3N0cmJfdGltZXJfZ3JwMV90bXIwICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfaW9wX3N3X2NmZ19zdHJiX3RpbWVyX2dycDFfdG1yMSAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX2lvcF9zd19jZmdfdGltZXJfZ3JwMCAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3RpbWVyX2dycDBfcm90ICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfaW9wX3N3X2NmZ190aW1lcl9ncnAwX3N0cmIwICAgICAgICAgPSAweDAwMDAwMDA1LAorICByZWdrX2lvcF9zd19jZmdfdGltZXJfZ3JwMF9zdHJiMSAgICAgICAgID0gMHgwMDAwMDAwNSwKKyAgcmVna19pb3Bfc3dfY2ZnX3RpbWVyX2dycDBfc3RyYjIgICAgICAgICA9IDB4MDAwMDAwMDUsCisgIHJlZ2tfaW9wX3N3X2NmZ190aW1lcl9ncnAwX3N0cmIzICAgICAgICAgPSAweDAwMDAwMDA1LAorICByZWdrX2lvcF9zd19jZmdfdGltZXJfZ3JwMF90bXIwICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19pb3Bfc3dfY2ZnX3RpbWVyX2dycDEgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X2NmZ190aW1lcl9ncnAxX3JvdCAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2lvcF9zd19jZmdfdGltZXJfZ3JwMV9zdHJiMCAgICAgICAgID0gMHgwMDAwMDAwNiwKKyAgcmVna19pb3Bfc3dfY2ZnX3RpbWVyX2dycDFfc3RyYjEgICAgICAgICA9IDB4MDAwMDAwMDYsCisgIHJlZ2tfaW9wX3N3X2NmZ190aW1lcl9ncnAxX3N0cmIyICAgICAgICAgPSAweDAwMDAwMDA2LAorICByZWdrX2lvcF9zd19jZmdfdGltZXJfZ3JwMV9zdHJiMyAgICAgICAgID0gMHgwMDAwMDAwNiwKKyAgcmVna19pb3Bfc3dfY2ZnX3RpbWVyX2dycDFfdG1yMCAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfaW9wX3N3X2NmZ190cmlnMF8wICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19jZmdfdHJpZzBfMSAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3RyaWcwXzIgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X2NmZ190cmlnMF8zICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19jZmdfdHJpZzFfMCAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3RyaWcxXzEgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X2NmZ190cmlnMV8yICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19jZmdfdHJpZzFfMyAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY2ZnX3RyaWcyXzAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfaW9wX3N3X2NmZ190cmlnMl8xICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2lvcF9zd19jZmdfdHJpZzJfMiAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19pb3Bfc3dfY2ZnX3RyaWcyXzMgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfaW9wX3N3X2NmZ190cmlnM18wICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2lvcF9zd19jZmdfdHJpZzNfMSAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19pb3Bfc3dfY2ZnX3RyaWczXzIgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfaW9wX3N3X2NmZ190cmlnM18zICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2lvcF9zd19jZmdfdHJpZzRfMCAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19pb3Bfc3dfY2ZnX3RyaWc0XzEgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIsCisgIHJlZ2tfaW9wX3N3X2NmZ190cmlnNF8yICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX2lvcF9zd19jZmdfdHJpZzRfMyAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19pb3Bfc3dfY2ZnX3RyaWc1XzAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIsCisgIHJlZ2tfaW9wX3N3X2NmZ190cmlnNV8xICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX2lvcF9zd19jZmdfdHJpZzVfMiAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19pb3Bfc3dfY2ZnX3RyaWc1XzMgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIsCisgIHJlZ2tfaW9wX3N3X2NmZ190cmlnNl8wICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAzLAorICByZWdrX2lvcF9zd19jZmdfdHJpZzZfMSAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMywKKyAgcmVna19pb3Bfc3dfY2ZnX3RyaWc2XzIgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfaW9wX3N3X2NmZ190cmlnNl8zICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAzLAorICByZWdrX2lvcF9zd19jZmdfdHJpZzdfMCAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMywKKyAgcmVna19pb3Bfc3dfY2ZnX3RyaWc3XzEgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfaW9wX3N3X2NmZ190cmlnN18yICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAzLAorICByZWdrX2lvcF9zd19jZmdfdHJpZzdfMyAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMworfTsKKyNlbmRpZiAvKiBfX2lvcF9zd19jZmdfZGVmc19oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2lvcC9pb3Bfc3dfY3B1X2RlZnMuaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvaW9wL2lvcF9zd19jcHVfZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNmY1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2lvcC9pb3Bfc3dfY3B1X2RlZnMuaApAQCAtMCwwICsxLDUyMiBAQAorI2lmbmRlZiBfX2lvcF9zd19jcHVfZGVmc19oCisjZGVmaW5lIF9faW9wX3N3X2NwdV9kZWZzX2gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGZyb20KKyAqICAgZmlsZTogICAgICAgICAgIGlvcF9zd19jcHUucgorICogCisgKiAgIGJ5IC4uLy4uLy4uL3Rvb2xzL3JkZXNjL2Jpbi9yZGVzMmMgLW91dGZpbGUgaW9wX3N3X2NwdV9kZWZzLmggaW9wX3N3X2NwdS5yCisgKiBBbnkgY2hhbmdlcyBoZXJlIHdpbGwgYmUgbG9zdC4KKyAqCisgKiAtKi0gYnVmZmVyLXJlYWQtb25seTogdCAtKi0KKyAqLworLyogTWFpbiBhY2Nlc3MgbWFjcm9zICovCisjaWZuZGVmIFJFR19SRAorI2RlZmluZSBSRUdfUkQoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgIFJFR19SRUFEKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSCisjZGVmaW5lIFJFR19XUiggc2NvcGUsIGluc3QsIHJlZywgdmFsICkgXAorICBSRUdfV1JJVEUoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgICAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9WRUNUCisjZGVmaW5lIFJFR19SRF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgUkVHX1JFQUQoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKwkgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSX1ZFQ1QKKyNkZWZpbmUgUkVHX1dSX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4LCB2YWwgKSBcCisgIFJFR19XUklURSggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKwkgICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfSU5UCisjZGVmaW5lIFJFR19SRF9JTlQoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgIFJFR19SRUFEKCBpbnQsIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfSU5UCisjZGVmaW5lIFJFR19XUl9JTlQoIHNjb3BlLCBpbnN0LCByZWcsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCBpbnQsIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX0lOVF9WRUNUCisjZGVmaW5lIFJFR19SRF9JTlRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgIFJFR19SRUFEKCBpbnQsIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKwkgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSX0lOVF9WRUNUCisjZGVmaW5lIFJFR19XUl9JTlRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXgsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCBpbnQsIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKwkgICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfVFlQRV9DT05WCisjZGVmaW5lIFJFR19UWVBFX0NPTlYoIHR5cGUsIG9yZ3R5cGUsIHZhbCApIFwKKyAgKCB7IHVuaW9uIHsgb3JndHlwZSBvOyB0eXBlIG47IH0gcjsgci5vID0gdmFsOyByLm47IH0gKQorI2VuZGlmCisKKyNpZm5kZWYgcmVnX3BhZ2Vfc2l6ZQorI2RlZmluZSByZWdfcGFnZV9zaXplIDgxOTIKKyNlbmRpZgorCisjaWZuZGVmIFJFR19BRERSCisjZGVmaW5lIFJFR19BRERSKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICAoIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUl9WRUNUCisjZGVmaW5lIFJFR19BRERSX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICAoIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKyAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworLyogQy1jb2RlIGZvciByZWdpc3RlciBzY29wZSBpb3Bfc3dfY3B1ICovCisKKy8qIFJlZ2lzdGVyIHJfbXB1X3RyYWNlLCBzY29wZSBpb3Bfc3dfY3B1LCB0eXBlIHIgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IHJlZ19pb3Bfc3dfY3B1X3JfbXB1X3RyYWNlOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfY3B1X3JfbXB1X3RyYWNlIDAKKworLyogUmVnaXN0ZXIgcl9zcHVfdHJhY2UsIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgciAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVnX2lvcF9zd19jcHVfcl9zcHVfdHJhY2U7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jcHVfcl9zcHVfdHJhY2UgNAorCisvKiBSZWdpc3RlciByX3NwdV9mc21fdHJhY2UsIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgciAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVnX2lvcF9zd19jcHVfcl9zcHVfZnNtX3RyYWNlOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfY3B1X3Jfc3B1X2ZzbV90cmFjZSA4CisKKy8qIFJlZ2lzdGVyIHJ3X21jX2N0cmwsIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGtlZXBfb3duZXIgOiAxOworICB1bnNpZ25lZCBpbnQgY21kICAgICAgICA6IDI7CisgIHVuc2lnbmVkIGludCBzaXplICAgICAgIDogMzsKKyAgdW5zaWduZWQgaW50IHdyX3NwdV9tZW0gOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICA6IDI1OworfSByZWdfaW9wX3N3X2NwdV9yd19tY19jdHJsOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfY3B1X3J3X21jX2N0cmwgMTIKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X2NwdV9yd19tY19jdHJsIDEyCisKKy8qIFJlZ2lzdGVyIHJ3X21jX2RhdGEsIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHZhbCA6IDMyOworfSByZWdfaW9wX3N3X2NwdV9yd19tY19kYXRhOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfY3B1X3J3X21jX2RhdGEgMTYKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X2NwdV9yd19tY19kYXRhIDE2CisKKy8qIFJlZ2lzdGVyIHJ3X21jX2FkZHIsIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgcncgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IHJlZ19pb3Bfc3dfY3B1X3J3X21jX2FkZHI7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jcHVfcndfbWNfYWRkciAyMAorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfY3B1X3J3X21jX2FkZHIgMjAKKworLyogUmVnaXN0ZXIgcnNfbWNfZGF0YSwgc2NvcGUgaW9wX3N3X2NwdSwgdHlwZSBycyAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVnX2lvcF9zd19jcHVfcnNfbWNfZGF0YTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X2NwdV9yc19tY19kYXRhIDI0CisKKy8qIFJlZ2lzdGVyIHJfbWNfZGF0YSwgc2NvcGUgaW9wX3N3X2NwdSwgdHlwZSByICovCit0eXBlZGVmIHVuc2lnbmVkIGludCByZWdfaW9wX3N3X2NwdV9yX21jX2RhdGE7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jcHVfcl9tY19kYXRhIDI4CisKKy8qIFJlZ2lzdGVyIHJfbWNfc3RhdCwgc2NvcGUgaW9wX3N3X2NwdSwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBidXN5X2NwdSAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgYnVzeV9tcHUgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGJ1c3lfc3B1ICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBvd25lZF9ieV9jcHUgOiAxOworICB1bnNpZ25lZCBpbnQgb3duZWRfYnlfbXB1IDogMTsKKyAgdW5zaWduZWQgaW50IG93bmVkX2J5X3NwdSA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICAgOiAyNjsKK30gcmVnX2lvcF9zd19jcHVfcl9tY19zdGF0OworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfY3B1X3JfbWNfc3RhdCAzMgorCisvKiBSZWdpc3RlciByd19idXNfY2xyX21hc2ssIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGJ5dGUwIDogODsKKyAgdW5zaWduZWQgaW50IGJ5dGUxIDogODsKKyAgdW5zaWduZWQgaW50IGJ5dGUyIDogODsKKyAgdW5zaWduZWQgaW50IGJ5dGUzIDogODsKK30gcmVnX2lvcF9zd19jcHVfcndfYnVzX2Nscl9tYXNrOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfY3B1X3J3X2J1c19jbHJfbWFzayAzNgorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfY3B1X3J3X2J1c19jbHJfbWFzayAzNgorCisvKiBSZWdpc3RlciByd19idXNfc2V0X21hc2ssIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGJ5dGUwIDogODsKKyAgdW5zaWduZWQgaW50IGJ5dGUxIDogODsKKyAgdW5zaWduZWQgaW50IGJ5dGUyIDogODsKKyAgdW5zaWduZWQgaW50IGJ5dGUzIDogODsKK30gcmVnX2lvcF9zd19jcHVfcndfYnVzX3NldF9tYXNrOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfY3B1X3J3X2J1c19zZXRfbWFzayA0MAorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfY3B1X3J3X2J1c19zZXRfbWFzayA0MAorCisvKiBSZWdpc3RlciByd19idXNfb2VfY2xyX21hc2ssIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGJ5dGUwIDogMTsKKyAgdW5zaWduZWQgaW50IGJ5dGUxIDogMTsKKyAgdW5zaWduZWQgaW50IGJ5dGUyIDogMTsKKyAgdW5zaWduZWQgaW50IGJ5dGUzIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI4OworfSByZWdfaW9wX3N3X2NwdV9yd19idXNfb2VfY2xyX21hc2s7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jcHVfcndfYnVzX29lX2Nscl9tYXNrIDQ0CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jcHVfcndfYnVzX29lX2Nscl9tYXNrIDQ0CisKKy8qIFJlZ2lzdGVyIHJ3X2J1c19vZV9zZXRfbWFzaywgc2NvcGUgaW9wX3N3X2NwdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgYnl0ZTAgOiAxOworICB1bnNpZ25lZCBpbnQgYnl0ZTEgOiAxOworICB1bnNpZ25lZCBpbnQgYnl0ZTIgOiAxOworICB1bnNpZ25lZCBpbnQgYnl0ZTMgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjg7Cit9IHJlZ19pb3Bfc3dfY3B1X3J3X2J1c19vZV9zZXRfbWFzazsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X2NwdV9yd19idXNfb2Vfc2V0X21hc2sgNDgKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X2NwdV9yd19idXNfb2Vfc2V0X21hc2sgNDgKKworLyogUmVnaXN0ZXIgcl9idXNfaW4sIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgciAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVnX2lvcF9zd19jcHVfcl9idXNfaW47CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jcHVfcl9idXNfaW4gNTIKKworLyogUmVnaXN0ZXIgcndfZ2lvX2Nscl9tYXNrLCBzY29wZSBpb3Bfc3dfY3B1LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCB2YWwgOiAzMjsKK30gcmVnX2lvcF9zd19jcHVfcndfZ2lvX2Nscl9tYXNrOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfY3B1X3J3X2dpb19jbHJfbWFzayA1NgorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfY3B1X3J3X2dpb19jbHJfbWFzayA1NgorCisvKiBSZWdpc3RlciByd19naW9fc2V0X21hc2ssIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHZhbCA6IDMyOworfSByZWdfaW9wX3N3X2NwdV9yd19naW9fc2V0X21hc2s7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jcHVfcndfZ2lvX3NldF9tYXNrIDYwCisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jcHVfcndfZ2lvX3NldF9tYXNrIDYwCisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19vZV9jbHJfbWFzaywgc2NvcGUgaW9wX3N3X2NwdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgdmFsIDogMzI7Cit9IHJlZ19pb3Bfc3dfY3B1X3J3X2dpb19vZV9jbHJfbWFzazsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X2NwdV9yd19naW9fb2VfY2xyX21hc2sgNjQKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X2NwdV9yd19naW9fb2VfY2xyX21hc2sgNjQKKworLyogUmVnaXN0ZXIgcndfZ2lvX29lX3NldF9tYXNrLCBzY29wZSBpb3Bfc3dfY3B1LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCB2YWwgOiAzMjsKK30gcmVnX2lvcF9zd19jcHVfcndfZ2lvX29lX3NldF9tYXNrOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfY3B1X3J3X2dpb19vZV9zZXRfbWFzayA2OAorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfY3B1X3J3X2dpb19vZV9zZXRfbWFzayA2OAorCisvKiBSZWdpc3RlciByX2dpb19pbiwgc2NvcGUgaW9wX3N3X2NwdSwgdHlwZSByICovCit0eXBlZGVmIHVuc2lnbmVkIGludCByZWdfaW9wX3N3X2NwdV9yX2dpb19pbjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X2NwdV9yX2dpb19pbiA3MgorCisvKiBSZWdpc3RlciByd19pbnRyMF9tYXNrLCBzY29wZSBpb3Bfc3dfY3B1LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBtcHVfMCAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzEgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8yICA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfMyAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzQgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV81ICA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfNiAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzcgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV84ICA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfOSAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzEwIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8xMSA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfMTIgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzEzIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8xNCA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfMTUgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1XzAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV8xICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfMiAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1XzMgIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV80ICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfNSAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1XzYgIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV83ICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfOCAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1XzkgIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV8xMCA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfMTEgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1XzEyIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV8xMyA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfMTQgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1XzE1IDogMTsKK30gcmVnX2lvcF9zd19jcHVfcndfaW50cjBfbWFzazsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X2NwdV9yd19pbnRyMF9tYXNrIDc2CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jcHVfcndfaW50cjBfbWFzayA3NgorCisvKiBSZWdpc3RlciByd19hY2tfaW50cjAsIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IG1wdV8wICA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfMSAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzIgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8zICA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfNCAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzUgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV82ICA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfNyAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzggIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV85ICA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfMTAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzExIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8xMiA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfMTMgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzE0IDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8xNSA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfMCAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1XzEgIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV8yICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfMyAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1XzQgIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV81ICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfNiAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1XzcgIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV84ICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfOSAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1XzEwIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV8xMSA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfMTIgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1XzEzIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV8xNCA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfMTUgOiAxOworfSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjA7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jcHVfcndfYWNrX2ludHIwIDgwCisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jcHVfcndfYWNrX2ludHIwIDgwCisKKy8qIFJlZ2lzdGVyIHJfaW50cjAsIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgbXB1XzAgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8xICA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfMiAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzMgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV80ICA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfNSAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzYgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV83ICA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfOCAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzkgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8xMCA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfMTEgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzEyIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8xMyA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfMTQgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzE1IDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV8wICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfMSAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1XzIgIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV8zICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfNCAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1XzUgIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV82ICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfNyAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1XzggIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV85ICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfMTAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1XzExIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV8xMiA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfMTMgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1XzE0IDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV8xNSA6IDE7Cit9IHJlZ19pb3Bfc3dfY3B1X3JfaW50cjA7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jcHVfcl9pbnRyMCA4NAorCisvKiBSZWdpc3RlciByX21hc2tlZF9pbnRyMCwgc2NvcGUgaW9wX3N3X2NwdSwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBtcHVfMCAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzEgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8yICA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfMyAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzQgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV81ICA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfNiAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzcgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV84ICA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfOSAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzEwIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8xMSA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfMTIgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzEzIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8xNCA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfMTUgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1XzAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV8xICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfMiAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1XzMgIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV80ICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfNSAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1XzYgIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV83ICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfOCAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1XzkgIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV8xMCA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfMTEgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1XzEyIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV8xMyA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfMTQgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1XzE1IDogMTsKK30gcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjA7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjAgODgKKworLyogUmVnaXN0ZXIgcndfaW50cjFfbWFzaywgc2NvcGUgaW9wX3N3X2NwdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgbXB1XzE2ICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzE3ICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzE4ICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzE5ICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzIwICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzIxICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzIyICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzIzICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzI0ICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzI1ICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzI2ICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzI3ICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzI4ICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzI5ICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzMwICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzMxICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1jX2luICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1jX291dCAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19pbiAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19vdXQgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19pbl9leHRyYSAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19vdXRfZXh0cmEgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnAwICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnAxICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnAyICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnAzICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnA0ICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnA1ICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnA2ICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnA3ICAgOiAxOworICB1bnNpZ25lZCBpbnQgdGltZXJfZ3JwMCAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdGltZXJfZ3JwMSAgICAgOiAxOworfSByZWdfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2sgOTIKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X2NwdV9yd19pbnRyMV9tYXNrIDkyCisKKy8qIFJlZ2lzdGVyIHJ3X2Fja19pbnRyMSwgc2NvcGUgaW9wX3N3X2NwdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgbXB1XzE2IDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8xNyA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfMTggOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzE5IDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8yMCA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfMjEgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzIyIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8yMyA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfMjQgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzI1IDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8yNiA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfMjcgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzI4IDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8yOSA6IDE7CisgIHVuc2lnbmVkIGludCBtcHVfMzAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzMxIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDE2OworfSByZWdfaW9wX3N3X2NwdV9yd19hY2tfaW50cjE7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jcHVfcndfYWNrX2ludHIxIDk2CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19jcHVfcndfYWNrX2ludHIxIDk2CisKKy8qIFJlZ2lzdGVyIHJfaW50cjEsIHNjb3BlIGlvcF9zd19jcHUsIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgbXB1XzE2ICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzE3ICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzE4ICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzE5ICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzIwICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzIxICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzIyICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzIzICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzI0ICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzI1ICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzI2ICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzI3ICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzI4ICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzI5ICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzMwICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbXB1XzMxICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1jX2luICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1jX291dCAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19pbiAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19vdXQgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19pbl9leHRyYSAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19vdXRfZXh0cmEgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnAwICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnAxICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnAyICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnAzICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnA0ICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnA1ICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnA2ICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnA3ICAgOiAxOworICB1bnNpZ25lZCBpbnQgdGltZXJfZ3JwMCAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdGltZXJfZ3JwMSAgICAgOiAxOworfSByZWdfaW9wX3N3X2NwdV9yX2ludHIxOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfY3B1X3JfaW50cjEgMTAwCisKKy8qIFJlZ2lzdGVyIHJfbWFza2VkX2ludHIxLCBzY29wZSBpb3Bfc3dfY3B1LCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IG1wdV8xNiAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8xNyAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8xOCAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8xOSAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8yMCAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8yMSAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8yMiAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8yMyAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8yNCAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8yNSAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8yNiAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8yNyAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8yOCAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8yOSAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8zMCAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG1wdV8zMSAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtY19pbiAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtY19vdXQgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGZpZm9faW4gICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGZpZm9fb3V0ICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGZpZm9faW5fZXh0cmEgIDogMTsKKyAgdW5zaWduZWQgaW50IGZpZm9fb3V0X2V4dHJhIDogMTsKKyAgdW5zaWduZWQgaW50IHRyaWdnZXJfZ3JwMCAgIDogMTsKKyAgdW5zaWduZWQgaW50IHRyaWdnZXJfZ3JwMSAgIDogMTsKKyAgdW5zaWduZWQgaW50IHRyaWdnZXJfZ3JwMiAgIDogMTsKKyAgdW5zaWduZWQgaW50IHRyaWdnZXJfZ3JwMyAgIDogMTsKKyAgdW5zaWduZWQgaW50IHRyaWdnZXJfZ3JwNCAgIDogMTsKKyAgdW5zaWduZWQgaW50IHRyaWdnZXJfZ3JwNSAgIDogMTsKKyAgdW5zaWduZWQgaW50IHRyaWdnZXJfZ3JwNiAgIDogMTsKKyAgdW5zaWduZWQgaW50IHRyaWdnZXJfZ3JwNyAgIDogMTsKKyAgdW5zaWduZWQgaW50IHRpbWVyX2dycDAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHRpbWVyX2dycDEgICAgIDogMTsKK30gcmVnX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjE7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19jcHVfcl9tYXNrZWRfaW50cjEgMTA0CisKKworLyogQ29uc3RhbnRzICovCitlbnVtIHsKKyAgcmVna19pb3Bfc3dfY3B1X2NvcHkgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X2NwdV9ubyAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19jcHVfcmQgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19pb3Bfc3dfY3B1X3JlZ19jb3B5ICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfaW9wX3N3X2NwdV9yd19idXNfY2xyX21hc2tfZGVmYXVsdCAgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19jcHVfcndfYnVzX29lX2Nscl9tYXNrX2RlZmF1bHQgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19jcHVfcndfYnVzX29lX3NldF9tYXNrX2RlZmF1bHQgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19jcHVfcndfYnVzX3NldF9tYXNrX2RlZmF1bHQgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY3B1X3J3X2dpb19jbHJfbWFza19kZWZhdWx0ICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X2NwdV9yd19naW9fb2VfY2xyX21hc2tfZGVmYXVsdCA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X2NwdV9yd19naW9fb2Vfc2V0X21hc2tfZGVmYXVsdCA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X2NwdV9yd19naW9fc2V0X21hc2tfZGVmYXVsdCAgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19jcHVfcndfaW50cjBfbWFza19kZWZhdWx0ICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfY3B1X3J3X2ludHIxX21hc2tfZGVmYXVsdCAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X2NwdV93ciAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAzLAorICByZWdrX2lvcF9zd19jcHVfeWVzICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMQorfTsKKyNlbmRpZiAvKiBfX2lvcF9zd19jcHVfZGVmc19oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2lvcC9pb3Bfc3dfbXB1X2RlZnMuaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvaW9wL2lvcF9zd19tcHVfZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZTRlMWEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2lvcC9pb3Bfc3dfbXB1X2RlZnMuaApAQCAtMCwwICsxLDY0OCBAQAorI2lmbmRlZiBfX2lvcF9zd19tcHVfZGVmc19oCisjZGVmaW5lIF9faW9wX3N3X21wdV9kZWZzX2gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGZyb20KKyAqICAgZmlsZTogICAgICAgICAgIGlvcF9zd19tcHUucgorICogCisgKiAgIGJ5IC4uLy4uLy4uL3Rvb2xzL3JkZXNjL2Jpbi9yZGVzMmMgLW91dGZpbGUgaW9wX3N3X21wdV9kZWZzLmggaW9wX3N3X21wdS5yCisgKiBBbnkgY2hhbmdlcyBoZXJlIHdpbGwgYmUgbG9zdC4KKyAqCisgKiAtKi0gYnVmZmVyLXJlYWQtb25seTogdCAtKi0KKyAqLworLyogTWFpbiBhY2Nlc3MgbWFjcm9zICovCisjaWZuZGVmIFJFR19SRAorI2RlZmluZSBSRUdfUkQoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgIFJFR19SRUFEKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSCisjZGVmaW5lIFJFR19XUiggc2NvcGUsIGluc3QsIHJlZywgdmFsICkgXAorICBSRUdfV1JJVEUoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgICAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9WRUNUCisjZGVmaW5lIFJFR19SRF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgUkVHX1JFQUQoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKwkgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSX1ZFQ1QKKyNkZWZpbmUgUkVHX1dSX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4LCB2YWwgKSBcCisgIFJFR19XUklURSggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKwkgICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfSU5UCisjZGVmaW5lIFJFR19SRF9JTlQoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgIFJFR19SRUFEKCBpbnQsIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfSU5UCisjZGVmaW5lIFJFR19XUl9JTlQoIHNjb3BlLCBpbnN0LCByZWcsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCBpbnQsIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX0lOVF9WRUNUCisjZGVmaW5lIFJFR19SRF9JTlRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgIFJFR19SRUFEKCBpbnQsIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKwkgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSX0lOVF9WRUNUCisjZGVmaW5lIFJFR19XUl9JTlRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXgsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCBpbnQsIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKwkgICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfVFlQRV9DT05WCisjZGVmaW5lIFJFR19UWVBFX0NPTlYoIHR5cGUsIG9yZ3R5cGUsIHZhbCApIFwKKyAgKCB7IHVuaW9uIHsgb3JndHlwZSBvOyB0eXBlIG47IH0gcjsgci5vID0gdmFsOyByLm47IH0gKQorI2VuZGlmCisKKyNpZm5kZWYgcmVnX3BhZ2Vfc2l6ZQorI2RlZmluZSByZWdfcGFnZV9zaXplIDgxOTIKKyNlbmRpZgorCisjaWZuZGVmIFJFR19BRERSCisjZGVmaW5lIFJFR19BRERSKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICAoIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUl9WRUNUCisjZGVmaW5lIFJFR19BRERSX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICAoIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKyAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworLyogQy1jb2RlIGZvciByZWdpc3RlciBzY29wZSBpb3Bfc3dfbXB1ICovCisKKy8qIFJlZ2lzdGVyIHJ3X3N3X2NmZ19vd25lciwgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgY2ZnIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDMwOworfSByZWdfaW9wX3N3X21wdV9yd19zd19jZmdfb3duZXI7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19tcHVfcndfc3dfY2ZnX293bmVyIDAKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X21wdV9yd19zd19jZmdfb3duZXIgMAorCisvKiBSZWdpc3RlciByX3NwdV90cmFjZSwgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSByICovCit0eXBlZGVmIHVuc2lnbmVkIGludCByZWdfaW9wX3N3X21wdV9yX3NwdV90cmFjZTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X21wdV9yX3NwdV90cmFjZSA0CisKKy8qIFJlZ2lzdGVyIHJfc3B1X2ZzbV90cmFjZSwgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSByICovCit0eXBlZGVmIHVuc2lnbmVkIGludCByZWdfaW9wX3N3X21wdV9yX3NwdV9mc21fdHJhY2U7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19tcHVfcl9zcHVfZnNtX3RyYWNlIDgKKworLyogUmVnaXN0ZXIgcndfbWNfY3RybCwgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQga2VlcF9vd25lciA6IDE7CisgIHVuc2lnbmVkIGludCBjbWQgICAgICAgIDogMjsKKyAgdW5zaWduZWQgaW50IHNpemUgICAgICAgOiAzOworICB1bnNpZ25lZCBpbnQgd3Jfc3B1X21lbSA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgIDogMjU7Cit9IHJlZ19pb3Bfc3dfbXB1X3J3X21jX2N0cmw7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19tcHVfcndfbWNfY3RybCAxMgorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfbXB1X3J3X21jX2N0cmwgMTIKKworLyogUmVnaXN0ZXIgcndfbWNfZGF0YSwgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgdmFsIDogMzI7Cit9IHJlZ19pb3Bfc3dfbXB1X3J3X21jX2RhdGE7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19tcHVfcndfbWNfZGF0YSAxNgorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfbXB1X3J3X21jX2RhdGEgMTYKKworLyogUmVnaXN0ZXIgcndfbWNfYWRkciwgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSBydyAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVnX2lvcF9zd19tcHVfcndfbWNfYWRkcjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X21wdV9yd19tY19hZGRyIDIwCisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19tcHVfcndfbWNfYWRkciAyMAorCisvKiBSZWdpc3RlciByc19tY19kYXRhLCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHJzICovCit0eXBlZGVmIHVuc2lnbmVkIGludCByZWdfaW9wX3N3X21wdV9yc19tY19kYXRhOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfbXB1X3JzX21jX2RhdGEgMjQKKworLyogUmVnaXN0ZXIgcl9tY19kYXRhLCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHIgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IHJlZ19pb3Bfc3dfbXB1X3JfbWNfZGF0YTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X21wdV9yX21jX2RhdGEgMjgKKworLyogUmVnaXN0ZXIgcl9tY19zdGF0LCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGJ1c3lfY3B1ICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBidXN5X21wdSAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgYnVzeV9zcHUgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG93bmVkX2J5X2NwdSA6IDE7CisgIHVuc2lnbmVkIGludCBvd25lZF9ieV9tcHUgOiAxOworICB1bnNpZ25lZCBpbnQgb3duZWRfYnlfc3B1IDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgICA6IDI2OworfSByZWdfaW9wX3N3X21wdV9yX21jX3N0YXQ7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19tcHVfcl9tY19zdGF0IDMyCisKKy8qIFJlZ2lzdGVyIHJ3X2J1c19jbHJfbWFzaywgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgYnl0ZTAgOiA4OworICB1bnNpZ25lZCBpbnQgYnl0ZTEgOiA4OworICB1bnNpZ25lZCBpbnQgYnl0ZTIgOiA4OworICB1bnNpZ25lZCBpbnQgYnl0ZTMgOiA4OworfSByZWdfaW9wX3N3X21wdV9yd19idXNfY2xyX21hc2s7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19tcHVfcndfYnVzX2Nscl9tYXNrIDM2CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19tcHVfcndfYnVzX2Nscl9tYXNrIDM2CisKKy8qIFJlZ2lzdGVyIHJ3X2J1c19zZXRfbWFzaywgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgYnl0ZTAgOiA4OworICB1bnNpZ25lZCBpbnQgYnl0ZTEgOiA4OworICB1bnNpZ25lZCBpbnQgYnl0ZTIgOiA4OworICB1bnNpZ25lZCBpbnQgYnl0ZTMgOiA4OworfSByZWdfaW9wX3N3X21wdV9yd19idXNfc2V0X21hc2s7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19tcHVfcndfYnVzX3NldF9tYXNrIDQwCisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19tcHVfcndfYnVzX3NldF9tYXNrIDQwCisKKy8qIFJlZ2lzdGVyIHJ3X2J1c19vZV9jbHJfbWFzaywgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgYnl0ZTAgOiAxOworICB1bnNpZ25lZCBpbnQgYnl0ZTEgOiAxOworICB1bnNpZ25lZCBpbnQgYnl0ZTIgOiAxOworICB1bnNpZ25lZCBpbnQgYnl0ZTMgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjg7Cit9IHJlZ19pb3Bfc3dfbXB1X3J3X2J1c19vZV9jbHJfbWFzazsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X21wdV9yd19idXNfb2VfY2xyX21hc2sgNDQKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X21wdV9yd19idXNfb2VfY2xyX21hc2sgNDQKKworLyogUmVnaXN0ZXIgcndfYnVzX29lX3NldF9tYXNrLCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBieXRlMCA6IDE7CisgIHVuc2lnbmVkIGludCBieXRlMSA6IDE7CisgIHVuc2lnbmVkIGludCBieXRlMiA6IDE7CisgIHVuc2lnbmVkIGludCBieXRlMyA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyODsKK30gcmVnX2lvcF9zd19tcHVfcndfYnVzX29lX3NldF9tYXNrOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfbXB1X3J3X2J1c19vZV9zZXRfbWFzayA0OAorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfbXB1X3J3X2J1c19vZV9zZXRfbWFzayA0OAorCisvKiBSZWdpc3RlciByX2J1c19pbiwgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSByICovCit0eXBlZGVmIHVuc2lnbmVkIGludCByZWdfaW9wX3N3X21wdV9yX2J1c19pbjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X21wdV9yX2J1c19pbiA1MgorCisvKiBSZWdpc3RlciByd19naW9fY2xyX21hc2ssIHNjb3BlIGlvcF9zd19tcHUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHZhbCA6IDMyOworfSByZWdfaW9wX3N3X21wdV9yd19naW9fY2xyX21hc2s7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19tcHVfcndfZ2lvX2Nscl9tYXNrIDU2CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19tcHVfcndfZ2lvX2Nscl9tYXNrIDU2CisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19zZXRfbWFzaywgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgdmFsIDogMzI7Cit9IHJlZ19pb3Bfc3dfbXB1X3J3X2dpb19zZXRfbWFzazsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X21wdV9yd19naW9fc2V0X21hc2sgNjAKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X21wdV9yd19naW9fc2V0X21hc2sgNjAKKworLyogUmVnaXN0ZXIgcndfZ2lvX29lX2Nscl9tYXNrLCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCB2YWwgOiAzMjsKK30gcmVnX2lvcF9zd19tcHVfcndfZ2lvX29lX2Nscl9tYXNrOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfbXB1X3J3X2dpb19vZV9jbHJfbWFzayA2NAorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfbXB1X3J3X2dpb19vZV9jbHJfbWFzayA2NAorCisvKiBSZWdpc3RlciByd19naW9fb2Vfc2V0X21hc2ssIHNjb3BlIGlvcF9zd19tcHUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHZhbCA6IDMyOworfSByZWdfaW9wX3N3X21wdV9yd19naW9fb2Vfc2V0X21hc2s7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19tcHVfcndfZ2lvX29lX3NldF9tYXNrIDY4CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19tcHVfcndfZ2lvX29lX3NldF9tYXNrIDY4CisKKy8qIFJlZ2lzdGVyIHJfZ2lvX2luLCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHIgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IHJlZ19pb3Bfc3dfbXB1X3JfZ2lvX2luOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfbXB1X3JfZ2lvX2luIDcyCisKKy8qIFJlZ2lzdGVyIHJ3X2NwdV9pbnRyLCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBpbnRyMCAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjEgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHIyICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMyAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjQgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHI1ICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyNiAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjcgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHI4ICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyOSAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjEwIDogMTsKKyAgdW5zaWduZWQgaW50IGludHIxMSA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMTIgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjEzIDogMTsKKyAgdW5zaWduZWQgaW50IGludHIxNCA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMTUgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjE2IDogMTsKKyAgdW5zaWduZWQgaW50IGludHIxNyA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMTggOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjE5IDogMTsKKyAgdW5zaWduZWQgaW50IGludHIyMCA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMjEgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjIyIDogMTsKKyAgdW5zaWduZWQgaW50IGludHIyMyA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMjQgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjI1IDogMTsKKyAgdW5zaWduZWQgaW50IGludHIyNiA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMjcgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjI4IDogMTsKKyAgdW5zaWduZWQgaW50IGludHIyOSA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMzAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjMxIDogMTsKK30gcmVnX2lvcF9zd19tcHVfcndfY3B1X2ludHI7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19tcHVfcndfY3B1X2ludHIgNzYKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X21wdV9yd19jcHVfaW50ciA3NgorCisvKiBSZWdpc3RlciByX2NwdV9pbnRyLCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGludHIwICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMSAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjIgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHIzICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyNCAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjUgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHI2ICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyNyAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjggIDogMTsKKyAgdW5zaWduZWQgaW50IGludHI5ICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMTAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjExIDogMTsKKyAgdW5zaWduZWQgaW50IGludHIxMiA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMTMgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjE0IDogMTsKKyAgdW5zaWduZWQgaW50IGludHIxNSA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMTYgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjE3IDogMTsKKyAgdW5zaWduZWQgaW50IGludHIxOCA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMTkgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjIwIDogMTsKKyAgdW5zaWduZWQgaW50IGludHIyMSA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMjIgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjIzIDogMTsKKyAgdW5zaWduZWQgaW50IGludHIyNCA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMjUgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjI2IDogMTsKKyAgdW5zaWduZWQgaW50IGludHIyNyA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMjggOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjI5IDogMTsKKyAgdW5zaWduZWQgaW50IGludHIzMCA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMzEgOiAxOworfSByZWdfaW9wX3N3X21wdV9yX2NwdV9pbnRyOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfbXB1X3JfY3B1X2ludHIgODAKKworLyogUmVnaXN0ZXIgcndfaW50cl9ncnAwX21hc2ssIHNjb3BlIGlvcF9zd19tcHUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHNwdV9pbnRyMCAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHRyaWdnZXJfZ3JwMCAgIDogMTsKKyAgdW5zaWduZWQgaW50IHRpbWVyX2dycDAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGZpZm9fb3V0ICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV9pbnRyMSAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHRyaWdnZXJfZ3JwMSAgIDogMTsKKyAgdW5zaWduZWQgaW50IHRpbWVyX2dycDEgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGZpZm9faW4gICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV9pbnRyMiAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHRyaWdnZXJfZ3JwMiAgIDogMTsKKyAgdW5zaWduZWQgaW50IGZpZm9fb3V0X2V4dHJhIDogMTsKKyAgdW5zaWduZWQgaW50IGRtY19vdXQgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV9pbnRyMyAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHRyaWdnZXJfZ3JwMyAgIDogMTsKKyAgdW5zaWduZWQgaW50IGZpZm9faW5fZXh0cmEgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtY19pbiAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgICAgIDogMTY7Cit9IHJlZ19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMF9tYXNrOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMF9tYXNrIDg0CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19tcHVfcndfaW50cl9ncnAwX21hc2sgODQKKworLyogUmVnaXN0ZXIgcndfYWNrX2ludHJfZ3JwMCwgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgc3B1X2ludHIwIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICA6IDM7CisgIHVuc2lnbmVkIGludCBzcHVfaW50cjEgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkyICAgIDogMzsKKyAgdW5zaWduZWQgaW50IHNwdV9pbnRyMiA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTMgICAgOiAzOworICB1bnNpZ25lZCBpbnQgc3B1X2ludHIzIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15NCAgICA6IDE5OworfSByZWdfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAwOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfbXB1X3J3X2Fja19pbnRyX2dycDAgODgKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAwIDg4CisKKy8qIFJlZ2lzdGVyIHJfaW50cl9ncnAwLCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHNwdV9pbnRyMCAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHRyaWdnZXJfZ3JwMCAgIDogMTsKKyAgdW5zaWduZWQgaW50IHRpbWVyX2dycDAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGZpZm9fb3V0ICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV9pbnRyMSAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHRyaWdnZXJfZ3JwMSAgIDogMTsKKyAgdW5zaWduZWQgaW50IHRpbWVyX2dycDEgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGZpZm9faW4gICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV9pbnRyMiAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHRyaWdnZXJfZ3JwMiAgIDogMTsKKyAgdW5zaWduZWQgaW50IGZpZm9fb3V0X2V4dHJhIDogMTsKKyAgdW5zaWduZWQgaW50IGRtY19vdXQgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNwdV9pbnRyMyAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHRyaWdnZXJfZ3JwMyAgIDogMTsKKyAgdW5zaWduZWQgaW50IGZpZm9faW5fZXh0cmEgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtY19pbiAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgICAgIDogMTY7Cit9IHJlZ19pb3Bfc3dfbXB1X3JfaW50cl9ncnAwOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfbXB1X3JfaW50cl9ncnAwIDkyCisKKy8qIFJlZ2lzdGVyIHJfbWFza2VkX2ludHJfZ3JwMCwgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBzcHVfaW50cjAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0cmlnZ2VyX2dycDAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0aW1lcl9ncnAwICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBmaWZvX291dCAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfaW50cjEgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0cmlnZ2VyX2dycDEgICA6IDE7CisgIHVuc2lnbmVkIGludCB0aW1lcl9ncnAxICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBmaWZvX2luICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfaW50cjIgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0cmlnZ2VyX2dycDIgICA6IDE7CisgIHVuc2lnbmVkIGludCBmaWZvX291dF9leHRyYSA6IDE7CisgIHVuc2lnbmVkIGludCBkbWNfb3V0ICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfaW50cjMgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0cmlnZ2VyX2dycDMgICA6IDE7CisgIHVuc2lnbmVkIGludCBmaWZvX2luX2V4dHJhICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWNfaW4gICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICAgICA6IDE2OworfSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDA7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAwIDk2CisKKy8qIFJlZ2lzdGVyIHJ3X2ludHJfZ3JwMV9tYXNrLCBzY29wZSBpb3Bfc3dfbXB1LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBzcHVfaW50cjQgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0cmlnZ2VyX2dycDQgICA6IDE7CisgIHVuc2lnbmVkIGludCBmaWZvX291dF9leHRyYSA6IDE7CisgIHVuc2lnbmVkIGludCBkbWNfb3V0ICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfaW50cjUgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0cmlnZ2VyX2dycDUgICA6IDE7CisgIHVuc2lnbmVkIGludCBmaWZvX2luX2V4dHJhICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWNfaW4gICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfaW50cjYgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0cmlnZ2VyX2dycDYgICA6IDE7CisgIHVuc2lnbmVkIGludCB0aW1lcl9ncnAwICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBmaWZvX291dCAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfaW50cjcgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0cmlnZ2VyX2dycDcgICA6IDE7CisgIHVuc2lnbmVkIGludCB0aW1lcl9ncnAxICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBmaWZvX2luICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICAgICA6IDE2OworfSByZWdfaW9wX3N3X21wdV9yd19pbnRyX2dycDFfbWFzazsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X21wdV9yd19pbnRyX2dycDFfbWFzayAxMDAKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X21wdV9yd19pbnRyX2dycDFfbWFzayAxMDAKKworLyogUmVnaXN0ZXIgcndfYWNrX2ludHJfZ3JwMSwgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgc3B1X2ludHI0IDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICA6IDM7CisgIHVuc2lnbmVkIGludCBzcHVfaW50cjUgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkyICAgIDogMzsKKyAgdW5zaWduZWQgaW50IHNwdV9pbnRyNiA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTMgICAgOiAzOworICB1bnNpZ25lZCBpbnQgc3B1X2ludHI3IDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15NCAgICA6IDE5OworfSByZWdfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAxOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfbXB1X3J3X2Fja19pbnRyX2dycDEgMTA0CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19tcHVfcndfYWNrX2ludHJfZ3JwMSAxMDQKKworLyogUmVnaXN0ZXIgcl9pbnRyX2dycDEsIHNjb3BlIGlvcF9zd19tcHUsIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgc3B1X2ludHI0ICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnA0ICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19vdXRfZXh0cmEgOiAxOworICB1bnNpZ25lZCBpbnQgZG1jX291dCAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1X2ludHI1ICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnA1ICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19pbl9leHRyYSAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1jX2luICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1X2ludHI2ICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnA2ICAgOiAxOworICB1bnNpZ25lZCBpbnQgdGltZXJfZ3JwMCAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19vdXQgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1X2ludHI3ICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnA3ICAgOiAxOworICB1bnNpZ25lZCBpbnQgdGltZXJfZ3JwMSAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19pbiAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICAgICAgOiAxNjsKK30gcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDE7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19tcHVfcl9pbnRyX2dycDEgMTA4CisKKy8qIFJlZ2lzdGVyIHJfbWFza2VkX2ludHJfZ3JwMSwgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBzcHVfaW50cjQgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0cmlnZ2VyX2dycDQgICA6IDE7CisgIHVuc2lnbmVkIGludCBmaWZvX291dF9leHRyYSA6IDE7CisgIHVuc2lnbmVkIGludCBkbWNfb3V0ICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfaW50cjUgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0cmlnZ2VyX2dycDUgICA6IDE7CisgIHVuc2lnbmVkIGludCBmaWZvX2luX2V4dHJhICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWNfaW4gICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfaW50cjYgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0cmlnZ2VyX2dycDYgICA6IDE7CisgIHVuc2lnbmVkIGludCB0aW1lcl9ncnAwICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBmaWZvX291dCAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfaW50cjcgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0cmlnZ2VyX2dycDcgICA6IDE7CisgIHVuc2lnbmVkIGludCB0aW1lcl9ncnAxICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBmaWZvX2luICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICAgICA6IDE2OworfSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDE7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAxIDExMgorCisvKiBSZWdpc3RlciByd19pbnRyX2dycDJfbWFzaywgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgc3B1X2ludHI4ICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnAwICAgOiAxOworICB1bnNpZ25lZCBpbnQgdGltZXJfZ3JwMCAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19vdXQgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1X2ludHI5ICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnAxICAgOiAxOworICB1bnNpZ25lZCBpbnQgdGltZXJfZ3JwMSAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19pbiAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1X2ludHIxMCAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnAyICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19vdXRfZXh0cmEgOiAxOworICB1bnNpZ25lZCBpbnQgZG1jX291dCAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1X2ludHIxMSAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnAzICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19pbl9leHRyYSAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1jX2luICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICAgICAgOiAxNjsKK30gcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAyX21hc2s7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19tcHVfcndfaW50cl9ncnAyX21hc2sgMTE2CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19tcHVfcndfaW50cl9ncnAyX21hc2sgMTE2CisKKy8qIFJlZ2lzdGVyIHJ3X2Fja19pbnRyX2dycDIsIHNjb3BlIGlvcF9zd19tcHUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHNwdV9pbnRyOCAgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICA6IDM7CisgIHVuc2lnbmVkIGludCBzcHVfaW50cjkgIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MiAgICAgOiAzOworICB1bnNpZ25lZCBpbnQgc3B1X2ludHIxMCA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTMgICAgIDogMzsKKyAgdW5zaWduZWQgaW50IHNwdV9pbnRyMTEgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXk0ICAgICA6IDE5OworfSByZWdfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAyOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfbXB1X3J3X2Fja19pbnRyX2dycDIgMTIwCisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19tcHVfcndfYWNrX2ludHJfZ3JwMiAxMjAKKworLyogUmVnaXN0ZXIgcl9pbnRyX2dycDIsIHNjb3BlIGlvcF9zd19tcHUsIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgc3B1X2ludHI4ICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnAwICAgOiAxOworICB1bnNpZ25lZCBpbnQgdGltZXJfZ3JwMCAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19vdXQgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1X2ludHI5ICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnAxICAgOiAxOworICB1bnNpZ25lZCBpbnQgdGltZXJfZ3JwMSAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19pbiAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1X2ludHIxMCAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnAyICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19vdXRfZXh0cmEgOiAxOworICB1bnNpZ25lZCBpbnQgZG1jX291dCAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1X2ludHIxMSAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnAzICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19pbl9leHRyYSAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1jX2luICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICAgICAgOiAxNjsKK30gcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDI7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19tcHVfcl9pbnRyX2dycDIgMTI0CisKKy8qIFJlZ2lzdGVyIHJfbWFza2VkX2ludHJfZ3JwMiwgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBzcHVfaW50cjggICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0cmlnZ2VyX2dycDAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0aW1lcl9ncnAwICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBmaWZvX291dCAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfaW50cjkgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0cmlnZ2VyX2dycDEgICA6IDE7CisgIHVuc2lnbmVkIGludCB0aW1lcl9ncnAxICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBmaWZvX2luICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfaW50cjEwICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0cmlnZ2VyX2dycDIgICA6IDE7CisgIHVuc2lnbmVkIGludCBmaWZvX291dF9leHRyYSA6IDE7CisgIHVuc2lnbmVkIGludCBkbWNfb3V0ICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfaW50cjExICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0cmlnZ2VyX2dycDMgICA6IDE7CisgIHVuc2lnbmVkIGludCBmaWZvX2luX2V4dHJhICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWNfaW4gICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICAgICA6IDE2OworfSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDI7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAyIDEyOAorCisvKiBSZWdpc3RlciByd19pbnRyX2dycDNfbWFzaywgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgc3B1X2ludHIxMiAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnA0ICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19vdXRfZXh0cmEgOiAxOworICB1bnNpZ25lZCBpbnQgZG1jX291dCAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1X2ludHIxMyAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnA1ICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19pbl9leHRyYSAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1jX2luICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1X2ludHIxNCAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnA2ICAgOiAxOworICB1bnNpZ25lZCBpbnQgdGltZXJfZ3JwMCAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19vdXQgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1X2ludHIxNSAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnA3ICAgOiAxOworICB1bnNpZ25lZCBpbnQgdGltZXJfZ3JwMSAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19pbiAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICAgICAgOiAxNjsKK30gcmVnX2lvcF9zd19tcHVfcndfaW50cl9ncnAzX21hc2s7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19tcHVfcndfaW50cl9ncnAzX21hc2sgMTMyCisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19tcHVfcndfaW50cl9ncnAzX21hc2sgMTMyCisKKy8qIFJlZ2lzdGVyIHJ3X2Fja19pbnRyX2dycDMsIHNjb3BlIGlvcF9zd19tcHUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHNwdV9pbnRyMTIgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICA6IDM7CisgIHVuc2lnbmVkIGludCBzcHVfaW50cjEzIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MiAgICAgOiAzOworICB1bnNpZ25lZCBpbnQgc3B1X2ludHIxNCA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTMgICAgIDogMzsKKyAgdW5zaWduZWQgaW50IHNwdV9pbnRyMTUgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXk0ICAgICA6IDE5OworfSByZWdfaW9wX3N3X21wdV9yd19hY2tfaW50cl9ncnAzOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfbXB1X3J3X2Fja19pbnRyX2dycDMgMTM2CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19tcHVfcndfYWNrX2ludHJfZ3JwMyAxMzYKKworLyogUmVnaXN0ZXIgcl9pbnRyX2dycDMsIHNjb3BlIGlvcF9zd19tcHUsIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgc3B1X2ludHIxMiAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnA0ICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19vdXRfZXh0cmEgOiAxOworICB1bnNpZ25lZCBpbnQgZG1jX291dCAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1X2ludHIxMyAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnA1ICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19pbl9leHRyYSAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1jX2luICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1X2ludHIxNCAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnA2ICAgOiAxOworICB1bnNpZ25lZCBpbnQgdGltZXJfZ3JwMCAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19vdXQgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc3B1X2ludHIxNSAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnA3ICAgOiAxOworICB1bnNpZ25lZCBpbnQgdGltZXJfZ3JwMSAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19pbiAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICAgICAgOiAxNjsKK30gcmVnX2lvcF9zd19tcHVfcl9pbnRyX2dycDM7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19tcHVfcl9pbnRyX2dycDMgMTQwCisKKy8qIFJlZ2lzdGVyIHJfbWFza2VkX2ludHJfZ3JwMywgc2NvcGUgaW9wX3N3X21wdSwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBzcHVfaW50cjEyICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0cmlnZ2VyX2dycDQgICA6IDE7CisgIHVuc2lnbmVkIGludCBmaWZvX291dF9leHRyYSA6IDE7CisgIHVuc2lnbmVkIGludCBkbWNfb3V0ICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfaW50cjEzICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0cmlnZ2VyX2dycDUgICA6IDE7CisgIHVuc2lnbmVkIGludCBmaWZvX2luX2V4dHJhICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWNfaW4gICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfaW50cjE0ICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0cmlnZ2VyX2dycDYgICA6IDE7CisgIHVuc2lnbmVkIGludCB0aW1lcl9ncnAwICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBmaWZvX291dCAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzcHVfaW50cjE1ICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0cmlnZ2VyX2dycDcgICA6IDE7CisgIHVuc2lnbmVkIGludCB0aW1lcl9ncnAxICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBmaWZvX2luICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICAgICA6IDE2OworfSByZWdfaW9wX3N3X21wdV9yX21hc2tlZF9pbnRyX2dycDM7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19tcHVfcl9tYXNrZWRfaW50cl9ncnAzIDE0NAorCisKKy8qIENvbnN0YW50cyAqLworZW51bSB7CisgIHJlZ2tfaW9wX3N3X21wdV9jb3B5ICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19tcHVfY3B1ICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfbXB1X21wdSAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfaW9wX3N3X21wdV9ubyAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19tcHVfbm9wICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfbXB1X3JkICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIsCisgIHJlZ2tfaW9wX3N3X21wdV9yZWdfY29weSAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2lvcF9zd19tcHVfcndfYnVzX2Nscl9tYXNrX2RlZmF1bHQgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfbXB1X3J3X2J1c19vZV9jbHJfbWFza19kZWZhdWx0ID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfbXB1X3J3X2J1c19vZV9zZXRfbWFza19kZWZhdWx0ID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfbXB1X3J3X2J1c19zZXRfbWFza19kZWZhdWx0ICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X21wdV9yd19naW9fY2xyX21hc2tfZGVmYXVsdCAgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19tcHVfcndfZ2lvX29lX2Nscl9tYXNrX2RlZmF1bHQgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19tcHVfcndfZ2lvX29lX3NldF9tYXNrX2RlZmF1bHQgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19tcHVfcndfZ2lvX3NldF9tYXNrX2RlZmF1bHQgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwMF9tYXNrX2RlZmF1bHQgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19tcHVfcndfaW50cl9ncnAxX21hc2tfZGVmYXVsdCA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X21wdV9yd19pbnRyX2dycDJfbWFza19kZWZhdWx0ID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfbXB1X3J3X2ludHJfZ3JwM19tYXNrX2RlZmF1bHQgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19tcHVfcndfc3dfY2ZnX293bmVyX2RlZmF1bHQgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfbXB1X3NldCAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfaW9wX3N3X21wdV9zcHUgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX2lvcF9zd19tcHVfd3IgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMywKKyAgcmVna19pb3Bfc3dfbXB1X3llcyAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEKK307CisjZW5kaWYgLyogX19pb3Bfc3dfbXB1X2RlZnNfaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9pb3AvaW9wX3N3X3NwdV9kZWZzLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2lvcC9pb3Bfc3dfc3B1X2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODU2MGI4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9pb3AvaW9wX3N3X3NwdV9kZWZzLmgKQEAgLTAsMCArMSw0NDEgQEAKKyNpZm5kZWYgX19pb3Bfc3dfc3B1X2RlZnNfaAorI2RlZmluZSBfX2lvcF9zd19zcHVfZGVmc19oCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCisgKiAgIGZpbGU6ICAgICAgICAgICBpb3Bfc3dfc3B1LnIKKyAqIAorICogICBieSAuLi8uLi8uLi90b29scy9yZGVzYy9iaW4vcmRlczJjIC1vdXRmaWxlIGlvcF9zd19zcHVfZGVmcy5oIGlvcF9zd19zcHUucgorICogQW55IGNoYW5nZXMgaGVyZSB3aWxsIGJlIGxvc3QuCisgKgorICogLSotIGJ1ZmZlci1yZWFkLW9ubHk6IHQgLSotCisgKi8KKy8qIE1haW4gYWNjZXNzIG1hY3JvcyAqLworI2lmbmRlZiBSRUdfUkQKKyNkZWZpbmUgUkVHX1JEKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUgorI2RlZmluZSBSRUdfV1IoIHNjb3BlLCBpbnN0LCByZWcsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfVkVDVAorI2RlZmluZSBSRUdfUkRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgIFJFR19SRUFEKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9WRUNUCisjZGVmaW5lIFJFR19XUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgICAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX0lOVAorI2RlZmluZSBSRUdfUkRfSU5UKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSX0lOVAorI2RlZmluZSBSRUdfV1JfSU5UKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlRfVkVDVAorI2RlZmluZSBSRUdfUkRfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlRfVkVDVAorI2RlZmluZSBSRUdfV1JfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4LCB2YWwgKSBcCisgIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1RZUEVfQ09OVgorI2RlZmluZSBSRUdfVFlQRV9DT05WKCB0eXBlLCBvcmd0eXBlLCB2YWwgKSBcCisgICggeyB1bmlvbiB7IG9yZ3R5cGUgbzsgdHlwZSBuOyB9IHI7IHIubyA9IHZhbDsgci5uOyB9ICkKKyNlbmRpZgorCisjaWZuZGVmIHJlZ19wYWdlX3NpemUKKyNkZWZpbmUgcmVnX3BhZ2Vfc2l6ZSA4MTkyCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUgorI2RlZmluZSBSRUdfQUREUiggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFJfVkVDVAorI2RlZmluZSBSRUdfQUREUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKy8qIEMtY29kZSBmb3IgcmVnaXN0ZXIgc2NvcGUgaW9wX3N3X3NwdSAqLworCisvKiBSZWdpc3RlciByX21wdV90cmFjZSwgc2NvcGUgaW9wX3N3X3NwdSwgdHlwZSByICovCit0eXBlZGVmIHVuc2lnbmVkIGludCByZWdfaW9wX3N3X3NwdV9yX21wdV90cmFjZTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X3NwdV9yX21wdV90cmFjZSAwCisKKy8qIFJlZ2lzdGVyIHJ3X21jX2N0cmwsIHNjb3BlIGlvcF9zd19zcHUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGtlZXBfb3duZXIgOiAxOworICB1bnNpZ25lZCBpbnQgY21kICAgICAgICA6IDI7CisgIHVuc2lnbmVkIGludCBzaXplICAgICAgIDogMzsKKyAgdW5zaWduZWQgaW50IHdyX3NwdV9tZW0gOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICA6IDI1OworfSByZWdfaW9wX3N3X3NwdV9yd19tY19jdHJsOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfc3B1X3J3X21jX2N0cmwgNAorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfc3B1X3J3X21jX2N0cmwgNAorCisvKiBSZWdpc3RlciByd19tY19kYXRhLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCB2YWwgOiAzMjsKK30gcmVnX2lvcF9zd19zcHVfcndfbWNfZGF0YTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X3NwdV9yd19tY19kYXRhIDgKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X3NwdV9yd19tY19kYXRhIDgKKworLyogUmVnaXN0ZXIgcndfbWNfYWRkciwgc2NvcGUgaW9wX3N3X3NwdSwgdHlwZSBydyAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVnX2lvcF9zd19zcHVfcndfbWNfYWRkcjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X3NwdV9yd19tY19hZGRyIDEyCisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19zcHVfcndfbWNfYWRkciAxMgorCisvKiBSZWdpc3RlciByc19tY19kYXRhLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJzICovCit0eXBlZGVmIHVuc2lnbmVkIGludCByZWdfaW9wX3N3X3NwdV9yc19tY19kYXRhOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfc3B1X3JzX21jX2RhdGEgMTYKKworLyogUmVnaXN0ZXIgcl9tY19kYXRhLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHIgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IHJlZ19pb3Bfc3dfc3B1X3JfbWNfZGF0YTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X3NwdV9yX21jX2RhdGEgMjAKKworLyogUmVnaXN0ZXIgcl9tY19zdGF0LCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGJ1c3lfY3B1ICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBidXN5X21wdSAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgYnVzeV9zcHUgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG93bmVkX2J5X2NwdSA6IDE7CisgIHVuc2lnbmVkIGludCBvd25lZF9ieV9tcHUgOiAxOworICB1bnNpZ25lZCBpbnQgb3duZWRfYnlfc3B1IDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgICA6IDI2OworfSByZWdfaW9wX3N3X3NwdV9yX21jX3N0YXQ7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19zcHVfcl9tY19zdGF0IDI0CisKKy8qIFJlZ2lzdGVyIHJ3X2J1c19jbHJfbWFzaywgc2NvcGUgaW9wX3N3X3NwdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgYnl0ZTAgOiA4OworICB1bnNpZ25lZCBpbnQgYnl0ZTEgOiA4OworICB1bnNpZ25lZCBpbnQgYnl0ZTIgOiA4OworICB1bnNpZ25lZCBpbnQgYnl0ZTMgOiA4OworfSByZWdfaW9wX3N3X3NwdV9yd19idXNfY2xyX21hc2s7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19zcHVfcndfYnVzX2Nscl9tYXNrIDI4CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19zcHVfcndfYnVzX2Nscl9tYXNrIDI4CisKKy8qIFJlZ2lzdGVyIHJ3X2J1c19zZXRfbWFzaywgc2NvcGUgaW9wX3N3X3NwdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgYnl0ZTAgOiA4OworICB1bnNpZ25lZCBpbnQgYnl0ZTEgOiA4OworICB1bnNpZ25lZCBpbnQgYnl0ZTIgOiA4OworICB1bnNpZ25lZCBpbnQgYnl0ZTMgOiA4OworfSByZWdfaW9wX3N3X3NwdV9yd19idXNfc2V0X21hc2s7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19zcHVfcndfYnVzX3NldF9tYXNrIDMyCisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19zcHVfcndfYnVzX3NldF9tYXNrIDMyCisKKy8qIFJlZ2lzdGVyIHJ3X2J1c19vZV9jbHJfbWFzaywgc2NvcGUgaW9wX3N3X3NwdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgYnl0ZTAgOiAxOworICB1bnNpZ25lZCBpbnQgYnl0ZTEgOiAxOworICB1bnNpZ25lZCBpbnQgYnl0ZTIgOiAxOworICB1bnNpZ25lZCBpbnQgYnl0ZTMgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjg7Cit9IHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19vZV9jbHJfbWFzazsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X3NwdV9yd19idXNfb2VfY2xyX21hc2sgMzYKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X3NwdV9yd19idXNfb2VfY2xyX21hc2sgMzYKKworLyogUmVnaXN0ZXIgcndfYnVzX29lX3NldF9tYXNrLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBieXRlMCA6IDE7CisgIHVuc2lnbmVkIGludCBieXRlMSA6IDE7CisgIHVuc2lnbmVkIGludCBieXRlMiA6IDE7CisgIHVuc2lnbmVkIGludCBieXRlMyA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyODsKK30gcmVnX2lvcF9zd19zcHVfcndfYnVzX29lX3NldF9tYXNrOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfc3B1X3J3X2J1c19vZV9zZXRfbWFzayA0MAorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfc3B1X3J3X2J1c19vZV9zZXRfbWFzayA0MAorCisvKiBSZWdpc3RlciByX2J1c19pbiwgc2NvcGUgaW9wX3N3X3NwdSwgdHlwZSByICovCit0eXBlZGVmIHVuc2lnbmVkIGludCByZWdfaW9wX3N3X3NwdV9yX2J1c19pbjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X3NwdV9yX2J1c19pbiA0NAorCisvKiBSZWdpc3RlciByd19naW9fY2xyX21hc2ssIHNjb3BlIGlvcF9zd19zcHUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHZhbCA6IDMyOworfSByZWdfaW9wX3N3X3NwdV9yd19naW9fY2xyX21hc2s7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19zcHVfcndfZ2lvX2Nscl9tYXNrIDQ4CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19zcHVfcndfZ2lvX2Nscl9tYXNrIDQ4CisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19zZXRfbWFzaywgc2NvcGUgaW9wX3N3X3NwdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgdmFsIDogMzI7Cit9IHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19zZXRfbWFzazsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X3NwdV9yd19naW9fc2V0X21hc2sgNTIKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X3NwdV9yd19naW9fc2V0X21hc2sgNTIKKworLyogUmVnaXN0ZXIgcndfZ2lvX29lX2Nscl9tYXNrLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCB2YWwgOiAzMjsKK30gcmVnX2lvcF9zd19zcHVfcndfZ2lvX29lX2Nscl9tYXNrOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfc3B1X3J3X2dpb19vZV9jbHJfbWFzayA1NgorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfc3B1X3J3X2dpb19vZV9jbHJfbWFzayA1NgorCisvKiBSZWdpc3RlciByd19naW9fb2Vfc2V0X21hc2ssIHNjb3BlIGlvcF9zd19zcHUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHZhbCA6IDMyOworfSByZWdfaW9wX3N3X3NwdV9yd19naW9fb2Vfc2V0X21hc2s7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19zcHVfcndfZ2lvX29lX3NldF9tYXNrIDYwCisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19zcHVfcndfZ2lvX29lX3NldF9tYXNrIDYwCisKKy8qIFJlZ2lzdGVyIHJfZ2lvX2luLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHIgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IHJlZ19pb3Bfc3dfc3B1X3JfZ2lvX2luOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfc3B1X3JfZ2lvX2luIDY0CisKKy8qIFJlZ2lzdGVyIHJ3X2J1c19jbHJfbWFza19sbywgc2NvcGUgaW9wX3N3X3NwdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgYnl0ZTAgOiA4OworICB1bnNpZ25lZCBpbnQgYnl0ZTEgOiA4OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTY7Cit9IHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19jbHJfbWFza19sbzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X3NwdV9yd19idXNfY2xyX21hc2tfbG8gNjgKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X3NwdV9yd19idXNfY2xyX21hc2tfbG8gNjgKKworLyogUmVnaXN0ZXIgcndfYnVzX2Nscl9tYXNrX2hpLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBieXRlMiA6IDg7CisgIHVuc2lnbmVkIGludCBieXRlMyA6IDg7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxNjsKK30gcmVnX2lvcF9zd19zcHVfcndfYnVzX2Nscl9tYXNrX2hpOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfc3B1X3J3X2J1c19jbHJfbWFza19oaSA3MgorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfc3B1X3J3X2J1c19jbHJfbWFza19oaSA3MgorCisvKiBSZWdpc3RlciByd19idXNfc2V0X21hc2tfbG8sIHNjb3BlIGlvcF9zd19zcHUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGJ5dGUwIDogODsKKyAgdW5zaWduZWQgaW50IGJ5dGUxIDogODsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDE2OworfSByZWdfaW9wX3N3X3NwdV9yd19idXNfc2V0X21hc2tfbG87CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19zcHVfcndfYnVzX3NldF9tYXNrX2xvIDc2CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19zcHVfcndfYnVzX3NldF9tYXNrX2xvIDc2CisKKy8qIFJlZ2lzdGVyIHJ3X2J1c19zZXRfbWFza19oaSwgc2NvcGUgaW9wX3N3X3NwdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgYnl0ZTIgOiA4OworICB1bnNpZ25lZCBpbnQgYnl0ZTMgOiA4OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTY7Cit9IHJlZ19pb3Bfc3dfc3B1X3J3X2J1c19zZXRfbWFza19oaTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X3NwdV9yd19idXNfc2V0X21hc2tfaGkgODAKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X3NwdV9yd19idXNfc2V0X21hc2tfaGkgODAKKworLyogUmVnaXN0ZXIgcndfZ2lvX2Nscl9tYXNrX2xvLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCB2YWwgOiAxNjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDE2OworfSByZWdfaW9wX3N3X3NwdV9yd19naW9fY2xyX21hc2tfbG87CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19zcHVfcndfZ2lvX2Nscl9tYXNrX2xvIDg0CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19zcHVfcndfZ2lvX2Nscl9tYXNrX2xvIDg0CisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19jbHJfbWFza19oaSwgc2NvcGUgaW9wX3N3X3NwdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgdmFsIDogMTY7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxNjsKK30gcmVnX2lvcF9zd19zcHVfcndfZ2lvX2Nscl9tYXNrX2hpOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfc3B1X3J3X2dpb19jbHJfbWFza19oaSA4OAorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfc3B1X3J3X2dpb19jbHJfbWFza19oaSA4OAorCisvKiBSZWdpc3RlciByd19naW9fc2V0X21hc2tfbG8sIHNjb3BlIGlvcF9zd19zcHUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHZhbCA6IDE2OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTY7Cit9IHJlZ19pb3Bfc3dfc3B1X3J3X2dpb19zZXRfbWFza19sbzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X3NwdV9yd19naW9fc2V0X21hc2tfbG8gOTIKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X3NwdV9yd19naW9fc2V0X21hc2tfbG8gOTIKKworLyogUmVnaXN0ZXIgcndfZ2lvX3NldF9tYXNrX2hpLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCB2YWwgOiAxNjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDE2OworfSByZWdfaW9wX3N3X3NwdV9yd19naW9fc2V0X21hc2tfaGk7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19zcHVfcndfZ2lvX3NldF9tYXNrX2hpIDk2CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19zcHVfcndfZ2lvX3NldF9tYXNrX2hpIDk2CisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19vZV9jbHJfbWFza19sbywgc2NvcGUgaW9wX3N3X3NwdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgdmFsIDogMTY7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxNjsKK30gcmVnX2lvcF9zd19zcHVfcndfZ2lvX29lX2Nscl9tYXNrX2xvOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfc3B1X3J3X2dpb19vZV9jbHJfbWFza19sbyAxMDAKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X3NwdV9yd19naW9fb2VfY2xyX21hc2tfbG8gMTAwCisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19vZV9jbHJfbWFza19oaSwgc2NvcGUgaW9wX3N3X3NwdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgdmFsIDogMTY7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxNjsKK30gcmVnX2lvcF9zd19zcHVfcndfZ2lvX29lX2Nscl9tYXNrX2hpOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfc3B1X3J3X2dpb19vZV9jbHJfbWFza19oaSAxMDQKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X3NwdV9yd19naW9fb2VfY2xyX21hc2tfaGkgMTA0CisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19vZV9zZXRfbWFza19sbywgc2NvcGUgaW9wX3N3X3NwdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgdmFsIDogMTY7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxNjsKK30gcmVnX2lvcF9zd19zcHVfcndfZ2lvX29lX3NldF9tYXNrX2xvOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfc3B1X3J3X2dpb19vZV9zZXRfbWFza19sbyAxMDgKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X3NwdV9yd19naW9fb2Vfc2V0X21hc2tfbG8gMTA4CisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19vZV9zZXRfbWFza19oaSwgc2NvcGUgaW9wX3N3X3NwdSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgdmFsIDogMTY7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxNjsKK30gcmVnX2lvcF9zd19zcHVfcndfZ2lvX29lX3NldF9tYXNrX2hpOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfc3B1X3J3X2dpb19vZV9zZXRfbWFza19oaSAxMTIKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW9wX3N3X3NwdV9yd19naW9fb2Vfc2V0X21hc2tfaGkgMTEyCisKKy8qIFJlZ2lzdGVyIHJ3X2NwdV9pbnRyLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBpbnRyMCAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjEgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHIyICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMyAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjQgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHI1ICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyNiAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjcgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHI4ICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyOSAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjEwIDogMTsKKyAgdW5zaWduZWQgaW50IGludHIxMSA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMTIgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjEzIDogMTsKKyAgdW5zaWduZWQgaW50IGludHIxNCA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMTUgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTY7Cit9IHJlZ19pb3Bfc3dfc3B1X3J3X2NwdV9pbnRyOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfc3B1X3J3X2NwdV9pbnRyIDExNgorI2RlZmluZSBSRUdfV1JfQUREUl9pb3Bfc3dfc3B1X3J3X2NwdV9pbnRyIDExNgorCisvKiBSZWdpc3RlciByX2NwdV9pbnRyLCBzY29wZSBpb3Bfc3dfc3B1LCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGludHIwICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMSAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjIgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHIzICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyNCAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjUgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHI2ICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyNyAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjggIDogMTsKKyAgdW5zaWduZWQgaW50IGludHI5ICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMTAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjExIDogMTsKKyAgdW5zaWduZWQgaW50IGludHIxMiA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMTMgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjE0IDogMTsKKyAgdW5zaWduZWQgaW50IGludHIxNSA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxNjsKK30gcmVnX2lvcF9zd19zcHVfcl9jcHVfaW50cjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3N3X3NwdV9yX2NwdV9pbnRyIDEyMAorCisvKiBSZWdpc3RlciByX2h3X2ludHIsIHNjb3BlIGlvcF9zd19zcHUsIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnAwICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnAxICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnAyICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnAzICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnA0ICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnA1ICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnA2ICAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZ2dlcl9ncnA3ICAgOiAxOworICB1bnNpZ25lZCBpbnQgdGltZXJfZ3JwMCAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdGltZXJfZ3JwMSAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19vdXQgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19vdXRfZXh0cmEgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19pbiAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZmlmb19pbl9leHRyYSAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1jX291dCAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1jX2luICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICAgICAgOiAxNjsKK30gcmVnX2lvcF9zd19zcHVfcl9od19pbnRyOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfc3B1X3JfaHdfaW50ciAxMjQKKworLyogUmVnaXN0ZXIgcndfbXB1X2ludHIsIHNjb3BlIGlvcF9zd19zcHUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGludHIwICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMSAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjIgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHIzICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyNCAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjUgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHI2ICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyNyAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjggIDogMTsKKyAgdW5zaWduZWQgaW50IGludHI5ICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMTAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjExIDogMTsKKyAgdW5zaWduZWQgaW50IGludHIxMiA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMTMgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjE0IDogMTsKKyAgdW5zaWduZWQgaW50IGludHIxNSA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxNjsKK30gcmVnX2lvcF9zd19zcHVfcndfbXB1X2ludHI7CisjZGVmaW5lIFJFR19SRF9BRERSX2lvcF9zd19zcHVfcndfbXB1X2ludHIgMTI4CisjZGVmaW5lIFJFR19XUl9BRERSX2lvcF9zd19zcHVfcndfbXB1X2ludHIgMTI4CisKKy8qIFJlZ2lzdGVyIHJfbXB1X2ludHIsIHNjb3BlIGlvcF9zd19zcHUsIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgaW50cjAgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHIxICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMiAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjMgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHI0ICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyNSAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjYgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHI3ICA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyOCAgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjkgIDogMTsKKyAgdW5zaWduZWQgaW50IGludHIxMCA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMTEgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjEyIDogMTsKKyAgdW5zaWduZWQgaW50IGludHIxMyA6IDE7CisgIHVuc2lnbmVkIGludCBpbnRyMTQgOiAxOworICB1bnNpZ25lZCBpbnQgaW50cjE1IDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDE2OworfSByZWdfaW9wX3N3X3NwdV9yX21wdV9pbnRyOworI2RlZmluZSBSRUdfUkRfQUREUl9pb3Bfc3dfc3B1X3JfbXB1X2ludHIgMTMyCisKKworLyogQ29uc3RhbnRzICovCitlbnVtIHsKKyAgcmVna19pb3Bfc3dfc3B1X2NvcHkgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X3NwdV9ubyAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19zcHVfbm9wICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfc3B1X3JkICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIsCisgIHJlZ2tfaW9wX3N3X3NwdV9yZWdfY29weSAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2lvcF9zd19zcHVfcndfYnVzX2Nscl9tYXNrX2RlZmF1bHQgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfc3B1X3J3X2J1c19vZV9jbHJfbWFza19kZWZhdWx0ID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfc3B1X3J3X2J1c19vZV9zZXRfbWFza19kZWZhdWx0ID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfc3B1X3J3X2J1c19zZXRfbWFza19kZWZhdWx0ICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfaW9wX3N3X3NwdV9yd19naW9fY2xyX21hc2tfZGVmYXVsdCAgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19zcHVfcndfZ2lvX29lX2Nscl9tYXNrX2RlZmF1bHQgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19zcHVfcndfZ2lvX29lX3NldF9tYXNrX2RlZmF1bHQgPSAweDAwMDAwMDAwLAorICByZWdrX2lvcF9zd19zcHVfcndfZ2lvX3NldF9tYXNrX2RlZmF1bHQgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pb3Bfc3dfc3B1X3NldCAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfaW9wX3N3X3NwdV93ciAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAzLAorICByZWdrX2lvcF9zd19zcHVfeWVzICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMQorfTsKKyNlbmRpZiAvKiBfX2lvcF9zd19zcHVfZGVmc19oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2lvcC9pb3BfdmVyc2lvbl9kZWZzLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL2lvcC9pb3BfdmVyc2lvbl9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBkZTQyNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvaW9wL2lvcF92ZXJzaW9uX2RlZnMuaApAQCAtMCwwICsxLDk2IEBACisjaWZuZGVmIF9faW9wX3ZlcnNpb25fZGVmc19oCisjZGVmaW5lIF9faW9wX3ZlcnNpb25fZGVmc19oCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCisgKiAgIGZpbGU6ICAgICAgICAgICBpb3BfdmVyc2lvbi5yCisgKiAKKyAqICAgYnkgLi4vLi4vLi4vdG9vbHMvcmRlc2MvYmluL3JkZXMyYyAtb3V0ZmlsZSBpb3BfdmVyc2lvbl9kZWZzLmggaW9wX3ZlcnNpb24ucgorICogQW55IGNoYW5nZXMgaGVyZSB3aWxsIGJlIGxvc3QuCisgKgorICogLSotIGJ1ZmZlci1yZWFkLW9ubHk6IHQgLSotCisgKi8KKy8qIE1haW4gYWNjZXNzIG1hY3JvcyAqLworI2lmbmRlZiBSRUdfUkQKKyNkZWZpbmUgUkVHX1JEKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUgorI2RlZmluZSBSRUdfV1IoIHNjb3BlLCBpbnN0LCByZWcsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfVkVDVAorI2RlZmluZSBSRUdfUkRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgIFJFR19SRUFEKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9WRUNUCisjZGVmaW5lIFJFR19XUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgICAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX0lOVAorI2RlZmluZSBSRUdfUkRfSU5UKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSX0lOVAorI2RlZmluZSBSRUdfV1JfSU5UKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlRfVkVDVAorI2RlZmluZSBSRUdfUkRfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlRfVkVDVAorI2RlZmluZSBSRUdfV1JfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4LCB2YWwgKSBcCisgIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1RZUEVfQ09OVgorI2RlZmluZSBSRUdfVFlQRV9DT05WKCB0eXBlLCBvcmd0eXBlLCB2YWwgKSBcCisgICggeyB1bmlvbiB7IG9yZ3R5cGUgbzsgdHlwZSBuOyB9IHI7IHIubyA9IHZhbDsgci5uOyB9ICkKKyNlbmRpZgorCisjaWZuZGVmIHJlZ19wYWdlX3NpemUKKyNkZWZpbmUgcmVnX3BhZ2Vfc2l6ZSA4MTkyCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUgorI2RlZmluZSBSRUdfQUREUiggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFJfVkVDVAorI2RlZmluZSBSRUdfQUREUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKy8qIEMtY29kZSBmb3IgcmVnaXN0ZXIgc2NvcGUgaW9wX3ZlcnNpb24gKi8KKworLyogUmVnaXN0ZXIgcl92ZXJzaW9uLCBzY29wZSBpb3BfdmVyc2lvbiwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBuciA6IDg7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyNDsKK30gcmVnX2lvcF92ZXJzaW9uX3JfdmVyc2lvbjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW9wX3ZlcnNpb25fcl92ZXJzaW9uIDAKKworCisvKiBDb25zdGFudHMgKi8KK2VudW0geworICByZWdrX2lvcF92ZXJzaW9uX3YyXzAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMgorfTsKKyNlbmRpZiAvKiBfX2lvcF92ZXJzaW9uX2RlZnNfaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9sMmNhY2hlX2RlZnMuaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvbDJjYWNoZV9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQzYWMzYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvbDJjYWNoZV9kZWZzLmgKQEAgLTAsMCArMSwxNDIgQEAKKyNpZm5kZWYgX19sMmNhY2hlX2RlZnNfaAorI2RlZmluZSBfX2wyY2FjaGVfZGVmc19oCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCisgKiAgIGZpbGU6ICAgICAgICAgICBsMmNhY2hlLnIKKyAqIAorICogICBieSAuLi8uLi8uLi90b29scy9yZGVzYy9iaW4vcmRlczJjIC1vdXRmaWxlIGwyY2FjaGVfZGVmcy5oIGwyY2FjaGUucgorICogQW55IGNoYW5nZXMgaGVyZSB3aWxsIGJlIGxvc3QuCisgKgorICogLSotIGJ1ZmZlci1yZWFkLW9ubHk6IHQgLSotCisgKi8KKy8qIE1haW4gYWNjZXNzIG1hY3JvcyAqLworI2lmbmRlZiBSRUdfUkQKKyNkZWZpbmUgUkVHX1JEKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUgorI2RlZmluZSBSRUdfV1IoIHNjb3BlLCBpbnN0LCByZWcsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfVkVDVAorI2RlZmluZSBSRUdfUkRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgIFJFR19SRUFEKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9WRUNUCisjZGVmaW5lIFJFR19XUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgICAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX0lOVAorI2RlZmluZSBSRUdfUkRfSU5UKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSX0lOVAorI2RlZmluZSBSRUdfV1JfSU5UKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlRfVkVDVAorI2RlZmluZSBSRUdfUkRfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlRfVkVDVAorI2RlZmluZSBSRUdfV1JfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4LCB2YWwgKSBcCisgIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1RZUEVfQ09OVgorI2RlZmluZSBSRUdfVFlQRV9DT05WKCB0eXBlLCBvcmd0eXBlLCB2YWwgKSBcCisgICggeyB1bmlvbiB7IG9yZ3R5cGUgbzsgdHlwZSBuOyB9IHI7IHIubyA9IHZhbDsgci5uOyB9ICkKKyNlbmRpZgorCisjaWZuZGVmIHJlZ19wYWdlX3NpemUKKyNkZWZpbmUgcmVnX3BhZ2Vfc2l6ZSA4MTkyCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUgorI2RlZmluZSBSRUdfQUREUiggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFJfVkVDVAorI2RlZmluZSBSRUdfQUREUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKy8qIEMtY29kZSBmb3IgcmVnaXN0ZXIgc2NvcGUgbDJjYWNoZSAqLworCisvKiBSZWdpc3RlciByd19jZmcsIHNjb3BlIGwyY2FjaGUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGVuIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDMxOworfSByZWdfbDJjYWNoZV9yd19jZmc7CisjZGVmaW5lIFJFR19SRF9BRERSX2wyY2FjaGVfcndfY2ZnIDAKKyNkZWZpbmUgUkVHX1dSX0FERFJfbDJjYWNoZV9yd19jZmcgMAorCisvKiBSZWdpc3RlciByd19jdHJsLCBzY29wZSBsMmNhY2hlLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiA3OworICB1bnNpZ25lZCBpbnQgY2Jhc2UgOiA5OworICB1bnNpZ25lZCBpbnQgZHVtbXkyIDogNDsKKyAgdW5zaWduZWQgaW50IGNzaXplIDogMTA7CisgIHVuc2lnbmVkIGludCBkdW1teTMgOiAyOworfSByZWdfbDJjYWNoZV9yd19jdHJsOworI2RlZmluZSBSRUdfUkRfQUREUl9sMmNhY2hlX3J3X2N0cmwgNAorI2RlZmluZSBSRUdfV1JfQUREUl9sMmNhY2hlX3J3X2N0cmwgNAorCisvKiBSZWdpc3RlciByd19pZHhvcCwgc2NvcGUgbDJjYWNoZSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgaWR4IDogMTA7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxNDsKKyAgdW5zaWduZWQgaW50IHdheSA6IDM7CisgIHVuc2lnbmVkIGludCBkdW1teTIgOiAyOworICB1bnNpZ25lZCBpbnQgY21kIDogMzsKK30gcmVnX2wyY2FjaGVfcndfaWR4b3A7CisjZGVmaW5lIFJFR19SRF9BRERSX2wyY2FjaGVfcndfaWR4b3AgOAorI2RlZmluZSBSRUdfV1JfQUREUl9sMmNhY2hlX3J3X2lkeG9wIDgKKworLyogUmVnaXN0ZXIgcndfYWRkcm9wX2FkZHIsIHNjb3BlIGwyY2FjaGUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGFkZHIgOiAzMjsKK30gcmVnX2wyY2FjaGVfcndfYWRkcm9wX2FkZHI7CisjZGVmaW5lIFJFR19SRF9BRERSX2wyY2FjaGVfcndfYWRkcm9wX2FkZHIgMTIKKyNkZWZpbmUgUkVHX1dSX0FERFJfbDJjYWNoZV9yd19hZGRyb3BfYWRkciAxMgorCisvKiBSZWdpc3RlciByd19hZGRyb3BfY3RybCwgc2NvcGUgbDJjYWNoZSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgc2l6ZSA6IDE2OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTM7CisgIHVuc2lnbmVkIGludCBjbWQgIDogMzsKK30gcmVnX2wyY2FjaGVfcndfYWRkcm9wX2N0cmw7CisjZGVmaW5lIFJFR19SRF9BRERSX2wyY2FjaGVfcndfYWRkcm9wX2N0cmwgMTYKKyNkZWZpbmUgUkVHX1dSX0FERFJfbDJjYWNoZV9yd19hZGRyb3BfY3RybCAxNgorCisKKy8qIENvbnN0YW50cyAqLworZW51bSB7CisgIHJlZ2tfbDJjYWNoZV9mbHVzaCAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2wyY2FjaGVfbm8gICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19sMmNhY2hlX3J3X2FkZHJvcF9hZGRyX2RlZmF1bHQgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfbDJjYWNoZV9yd19hZGRyb3BfY3RybF9kZWZhdWx0ICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2wyY2FjaGVfcndfY2ZnX2RlZmF1bHQgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19sMmNhY2hlX3J3X2N0cmxfZGVmYXVsdCAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfbDJjYWNoZV9yd19pZHhvcF9kZWZhdWx0ICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2wyY2FjaGVfeWVzICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMQorfTsKKyNlbmRpZiAvKiBfX2wyY2FjaGVfZGVmc19oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL21hcmJfYmFyX2RlZnMuaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvbWFyYl9iYXJfZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZTc2MjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL21hcmJfYmFyX2RlZnMuaApAQCAtMCwwICsxLDQ4MiBAQAorI2lmbmRlZiBfX21hcmJfYmFyX2RlZnNfaAorI2RlZmluZSBfX21hcmJfYmFyX2RlZnNfaAorCisvKgorICogVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQgZnJvbQorICogICBmaWxlOiAgICAgICAgICAgbWFyYl9iYXIucgorICogCisgKiAgIGJ5IC4uLy4uLy4uL3Rvb2xzL3JkZXNjL2Jpbi9yZGVzMmMgLW91dGZpbGUgbWFyYl9iYXJfZGVmcy5oIG1hcmJfYmFyLnIKKyAqIEFueSBjaGFuZ2VzIGhlcmUgd2lsbCBiZSBsb3N0LgorICoKKyAqIC0qLSBidWZmZXItcmVhZC1vbmx5OiB0IC0qLQorICovCisvKiBNYWluIGFjY2VzcyBtYWNyb3MgKi8KKyNpZm5kZWYgUkVHX1JECisjZGVmaW5lIFJFR19SRCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1IKKyNkZWZpbmUgUkVHX1dSKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfVkVDVAorI2RlZmluZSBSRUdfV1JfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXgsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlQKKyNkZWZpbmUgUkVHX1JEX0lOVCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlQKKyNkZWZpbmUgUkVHX1dSX0lOVCggc2NvcGUsIGluc3QsIHJlZywgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1dSX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19UWVBFX0NPTlYKKyNkZWZpbmUgUkVHX1RZUEVfQ09OViggdHlwZSwgb3JndHlwZSwgdmFsICkgXAorICAoIHsgdW5pb24geyBvcmd0eXBlIG87IHR5cGUgbjsgfSByOyByLm8gPSB2YWw7IHIubjsgfSApCisjZW5kaWYKKworI2lmbmRlZiByZWdfcGFnZV9zaXplCisjZGVmaW5lIHJlZ19wYWdlX3NpemUgODE5MgorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFIKKyNkZWZpbmUgUkVHX0FERFIoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19BRERSX1ZFQ1QKKyNkZWZpbmUgUkVHX0FERFJfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisvKiBDLWNvZGUgZm9yIHJlZ2lzdGVyIHNjb3BlIG1hcmJfYmFyICovCisKKyNkZWZpbmUgU1RSSURFX21hcmJfYmFyX3J3X2RkcjJfc2xvdHMgNAorLyogUmVnaXN0ZXIgcndfZGRyMl9zbG90cywgc2NvcGUgbWFyYl9iYXIsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IG93bmVyIDogNDsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI4OworfSByZWdfbWFyYl9iYXJfcndfZGRyMl9zbG90czsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9iYXJfcndfZGRyMl9zbG90cyAwCisjZGVmaW5lIFJFR19XUl9BRERSX21hcmJfYmFyX3J3X2RkcjJfc2xvdHMgMAorCisvKiBSZWdpc3RlciByd19oMjY0X3JkX2J1cnN0LCBzY29wZSBtYXJiX2JhciwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZGRyMl9ic2l6ZSA6IDI7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgIDogMzA7Cit9IHJlZ19tYXJiX2Jhcl9yd19oMjY0X3JkX2J1cnN0OworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2Jhcl9yd19oMjY0X3JkX2J1cnN0IDI1NgorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX2Jhcl9yd19oMjY0X3JkX2J1cnN0IDI1NgorCisvKiBSZWdpc3RlciByd19oMjY0X3dyX2J1cnN0LCBzY29wZSBtYXJiX2JhciwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZGRyMl9ic2l6ZSA6IDI7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgIDogMzA7Cit9IHJlZ19tYXJiX2Jhcl9yd19oMjY0X3dyX2J1cnN0OworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2Jhcl9yd19oMjY0X3dyX2J1cnN0IDI2MAorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX2Jhcl9yd19oMjY0X3dyX2J1cnN0IDI2MAorCisvKiBSZWdpc3RlciByd19jY2RfYnVyc3QsIHNjb3BlIG1hcmJfYmFyLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkZHIyX2JzaXplIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgOiAzMDsKK30gcmVnX21hcmJfYmFyX3J3X2NjZF9idXJzdDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9iYXJfcndfY2NkX2J1cnN0IDI2NAorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX2Jhcl9yd19jY2RfYnVyc3QgMjY0CisKKy8qIFJlZ2lzdGVyIHJ3X3Zpbl93cl9idXJzdCwgc2NvcGUgbWFyYl9iYXIsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRkcjJfYnNpemUgOiAyOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICA6IDMwOworfSByZWdfbWFyYl9iYXJfcndfdmluX3dyX2J1cnN0OworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2Jhcl9yd192aW5fd3JfYnVyc3QgMjY4CisjZGVmaW5lIFJFR19XUl9BRERSX21hcmJfYmFyX3J3X3Zpbl93cl9idXJzdCAyNjgKKworLyogUmVnaXN0ZXIgcndfdmluX3JkX2J1cnN0LCBzY29wZSBtYXJiX2JhciwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZGRyMl9ic2l6ZSA6IDI7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgIDogMzA7Cit9IHJlZ19tYXJiX2Jhcl9yd192aW5fcmRfYnVyc3Q7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfYmFyX3J3X3Zpbl9yZF9idXJzdCAyNzIKKyNkZWZpbmUgUkVHX1dSX0FERFJfbWFyYl9iYXJfcndfdmluX3JkX2J1cnN0IDI3MgorCisvKiBSZWdpc3RlciByd19zY2xyX3JkX2J1cnN0LCBzY29wZSBtYXJiX2JhciwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZGRyMl9ic2l6ZSA6IDI7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgIDogMzA7Cit9IHJlZ19tYXJiX2Jhcl9yd19zY2xyX3JkX2J1cnN0OworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2Jhcl9yd19zY2xyX3JkX2J1cnN0IDI3NgorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX2Jhcl9yd19zY2xyX3JkX2J1cnN0IDI3NgorCisvKiBSZWdpc3RlciByd192b3V0X2J1cnN0LCBzY29wZSBtYXJiX2JhciwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZGRyMl9ic2l6ZSA6IDI7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgIDogMzA7Cit9IHJlZ19tYXJiX2Jhcl9yd192b3V0X2J1cnN0OworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2Jhcl9yd192b3V0X2J1cnN0IDI4MAorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX2Jhcl9yd192b3V0X2J1cnN0IDI4MAorCisvKiBSZWdpc3RlciByd19zY2xyX2ZpZm9fYnVyc3QsIHNjb3BlIG1hcmJfYmFyLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkZHIyX2JzaXplIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgOiAzMDsKK30gcmVnX21hcmJfYmFyX3J3X3NjbHJfZmlmb19idXJzdDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9iYXJfcndfc2Nscl9maWZvX2J1cnN0IDI4NAorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX2Jhcl9yd19zY2xyX2ZpZm9fYnVyc3QgMjg0CisKKy8qIFJlZ2lzdGVyIHJ3X2wyY2FjaGVfYnVyc3QsIHNjb3BlIG1hcmJfYmFyLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkZHIyX2JzaXplIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgOiAzMDsKK30gcmVnX21hcmJfYmFyX3J3X2wyY2FjaGVfYnVyc3Q7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfYmFyX3J3X2wyY2FjaGVfYnVyc3QgMjg4CisjZGVmaW5lIFJFR19XUl9BRERSX21hcmJfYmFyX3J3X2wyY2FjaGVfYnVyc3QgMjg4CisKKy8qIFJlZ2lzdGVyIHJ3X2ludHJfbWFzaywgc2NvcGUgbWFyYl9iYXIsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGJwMCA6IDE7CisgIHVuc2lnbmVkIGludCBicDEgOiAxOworICB1bnNpZ25lZCBpbnQgYnAyIDogMTsKKyAgdW5zaWduZWQgaW50IGJwMyA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyODsKK30gcmVnX21hcmJfYmFyX3J3X2ludHJfbWFzazsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9iYXJfcndfaW50cl9tYXNrIDI5MgorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX2Jhcl9yd19pbnRyX21hc2sgMjkyCisKKy8qIFJlZ2lzdGVyIHJ3X2Fja19pbnRyLCBzY29wZSBtYXJiX2JhciwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgYnAwIDogMTsKKyAgdW5zaWduZWQgaW50IGJwMSA6IDE7CisgIHVuc2lnbmVkIGludCBicDIgOiAxOworICB1bnNpZ25lZCBpbnQgYnAzIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI4OworfSByZWdfbWFyYl9iYXJfcndfYWNrX2ludHI7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfYmFyX3J3X2Fja19pbnRyIDI5NgorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX2Jhcl9yd19hY2tfaW50ciAyOTYKKworLyogUmVnaXN0ZXIgcl9pbnRyLCBzY29wZSBtYXJiX2JhciwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBicDAgOiAxOworICB1bnNpZ25lZCBpbnQgYnAxIDogMTsKKyAgdW5zaWduZWQgaW50IGJwMiA6IDE7CisgIHVuc2lnbmVkIGludCBicDMgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjg7Cit9IHJlZ19tYXJiX2Jhcl9yX2ludHI7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfYmFyX3JfaW50ciAzMDAKKworLyogUmVnaXN0ZXIgcl9tYXNrZWRfaW50ciwgc2NvcGUgbWFyYl9iYXIsIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgYnAwIDogMTsKKyAgdW5zaWduZWQgaW50IGJwMSA6IDE7CisgIHVuc2lnbmVkIGludCBicDIgOiAxOworICB1bnNpZ25lZCBpbnQgYnAzIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI4OworfSByZWdfbWFyYl9iYXJfcl9tYXNrZWRfaW50cjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9iYXJfcl9tYXNrZWRfaW50ciAzMDQKKworLyogUmVnaXN0ZXIgcndfc3RvcF9tYXNrLCBzY29wZSBtYXJiX2JhciwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgaDI2NF9yZCAgIDogMTsKKyAgdW5zaWduZWQgaW50IGgyNjRfd3IgICA6IDE7CisgIHVuc2lnbmVkIGludCBjY2QgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdmluX3dyICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHZpbl9yZCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzY2xyX3JkICAgOiAxOworICB1bnNpZ25lZCBpbnQgdm91dCAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNjbHJfZmlmbyA6IDE7CisgIHVuc2lnbmVkIGludCBsMmNhY2hlICAgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgIDogMjM7Cit9IHJlZ19tYXJiX2Jhcl9yd19zdG9wX21hc2s7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfYmFyX3J3X3N0b3BfbWFzayAzMDgKKyNkZWZpbmUgUkVHX1dSX0FERFJfbWFyYl9iYXJfcndfc3RvcF9tYXNrIDMwOAorCisvKiBSZWdpc3RlciByX3N0b3BwZWQsIHNjb3BlIG1hcmJfYmFyLCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGgyNjRfcmQgICA6IDE7CisgIHVuc2lnbmVkIGludCBoMjY0X3dyICAgOiAxOworICB1bnNpZ25lZCBpbnQgY2NkICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHZpbl93ciAgICA6IDE7CisgIHVuc2lnbmVkIGludCB2aW5fcmQgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2Nscl9yZCAgIDogMTsKKyAgdW5zaWduZWQgaW50IHZvdXQgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzY2xyX2ZpZm8gOiAxOworICB1bnNpZ25lZCBpbnQgbDJjYWNoZSAgIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICA6IDIzOworfSByZWdfbWFyYl9iYXJfcl9zdG9wcGVkOworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2Jhcl9yX3N0b3BwZWQgMzEyCisKKy8qIFJlZ2lzdGVyIHJ3X25vX3Nub29wLCBzY29wZSBtYXJiX2JhciwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgaDI2NF9yZCAgIDogMTsKKyAgdW5zaWduZWQgaW50IGgyNjRfd3IgICA6IDE7CisgIHVuc2lnbmVkIGludCBjY2QgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdmluX3dyICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHZpbl9yZCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzY2xyX3JkICAgOiAxOworICB1bnNpZ25lZCBpbnQgdm91dCAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNjbHJfZmlmbyA6IDE7CisgIHVuc2lnbmVkIGludCBsMmNhY2hlICAgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgIDogMjM7Cit9IHJlZ19tYXJiX2Jhcl9yd19ub19zbm9vcDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9iYXJfcndfbm9fc25vb3AgNTc2CisjZGVmaW5lIFJFR19XUl9BRERSX21hcmJfYmFyX3J3X25vX3Nub29wIDU3NgorCisKKy8qIENvbnN0YW50cyAqLworZW51bSB7CisgIHJlZ2tfbWFyYl9iYXJfY2NkICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX21hcmJfYmFyX2gyNjRfcmQgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19tYXJiX2Jhcl9oMjY0X3dyICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfbWFyYl9iYXJfbDJjYWNoZSAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA4LAorICByZWdrX21hcmJfYmFyX25vICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19tYXJiX2Jhcl9yX3N0b3BwZWRfZGVmYXVsdCAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfbWFyYl9iYXJfcndfY2NkX2J1cnN0X2RlZmF1bHQgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX21hcmJfYmFyX3J3X2RkcjJfc2xvdHNfZGVmYXVsdCAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19tYXJiX2Jhcl9yd19kZHIyX3Nsb3RzX3NpemUgICAgICAgICA9IDB4MDAwMDAwNDAsCisgIHJlZ2tfbWFyYl9iYXJfcndfaDI2NF9yZF9idXJzdF9kZWZhdWx0ICAgPSAweDAwMDAwMDAwLAorICByZWdrX21hcmJfYmFyX3J3X2gyNjRfd3JfYnVyc3RfZGVmYXVsdCAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19tYXJiX2Jhcl9yd19pbnRyX21hc2tfZGVmYXVsdCAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfbWFyYl9iYXJfcndfbDJjYWNoZV9idXJzdF9kZWZhdWx0ICAgPSAweDAwMDAwMDAwLAorICByZWdrX21hcmJfYmFyX3J3X25vX3Nub29wX2RlZmF1bHQgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19tYXJiX2Jhcl9yd19zY2xyX2ZpZm9fYnVyc3RfZGVmYXVsdCA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfbWFyYl9iYXJfcndfc2Nscl9yZF9idXJzdF9kZWZhdWx0ICAgPSAweDAwMDAwMDAwLAorICByZWdrX21hcmJfYmFyX3J3X3N0b3BfbWFza19kZWZhdWx0ICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19tYXJiX2Jhcl9yd192aW5fcmRfYnVyc3RfZGVmYXVsdCAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfbWFyYl9iYXJfcndfdmluX3dyX2J1cnN0X2RlZmF1bHQgICAgPSAweDAwMDAwMDAwLAorICByZWdrX21hcmJfYmFyX3J3X3ZvdXRfYnVyc3RfZGVmYXVsdCAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19tYXJiX2Jhcl9zY2xyX2ZpZm8gICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDcsCisgIHJlZ2tfbWFyYl9iYXJfc2Nscl9yZCAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA1LAorICByZWdrX21hcmJfYmFyX3Zpbl9yZCAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNCwKKyAgcmVna19tYXJiX2Jhcl92aW5fd3IgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfbWFyYl9iYXJfdm91dCAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA2LAorICByZWdrX21hcmJfYmFyX3llcyAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMQorfTsKKyNlbmRpZiAvKiBfX21hcmJfYmFyX2RlZnNfaCAqLworI2lmbmRlZiBfX21hcmJfYmFyX2JwX2RlZnNfaAorI2RlZmluZSBfX21hcmJfYmFyX2JwX2RlZnNfaAorCisvKgorICogVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQgZnJvbQorICogICBmaWxlOiAgICAgICAgICAgbWFyYl9iYXIucgorICogCisgKiAgIGJ5IC4uLy4uLy4uL3Rvb2xzL3JkZXNjL2Jpbi9yZGVzMmMgLW91dGZpbGUgbWFyYl9iYXJfZGVmcy5oIG1hcmJfYmFyLnIKKyAqIEFueSBjaGFuZ2VzIGhlcmUgd2lsbCBiZSBsb3N0LgorICoKKyAqIC0qLSBidWZmZXItcmVhZC1vbmx5OiB0IC0qLQorICovCisvKiBNYWluIGFjY2VzcyBtYWNyb3MgKi8KKyNpZm5kZWYgUkVHX1JECisjZGVmaW5lIFJFR19SRCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1IKKyNkZWZpbmUgUkVHX1dSKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfVkVDVAorI2RlZmluZSBSRUdfV1JfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXgsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlQKKyNkZWZpbmUgUkVHX1JEX0lOVCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlQKKyNkZWZpbmUgUkVHX1dSX0lOVCggc2NvcGUsIGluc3QsIHJlZywgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1dSX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19UWVBFX0NPTlYKKyNkZWZpbmUgUkVHX1RZUEVfQ09OViggdHlwZSwgb3JndHlwZSwgdmFsICkgXAorICAoIHsgdW5pb24geyBvcmd0eXBlIG87IHR5cGUgbjsgfSByOyByLm8gPSB2YWw7IHIubjsgfSApCisjZW5kaWYKKworI2lmbmRlZiByZWdfcGFnZV9zaXplCisjZGVmaW5lIHJlZ19wYWdlX3NpemUgODE5MgorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFIKKyNkZWZpbmUgUkVHX0FERFIoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19BRERSX1ZFQ1QKKyNkZWZpbmUgUkVHX0FERFJfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisvKiBDLWNvZGUgZm9yIHJlZ2lzdGVyIHNjb3BlIG1hcmJfYmFyX2JwICovCisKKy8qIFJlZ2lzdGVyIHJ3X2ZpcnN0X2FkZHIsIHNjb3BlIG1hcmJfYmFyX2JwLCB0eXBlIHJ3ICovCit0eXBlZGVmIHVuc2lnbmVkIGludCByZWdfbWFyYl9iYXJfYnBfcndfZmlyc3RfYWRkcjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9iYXJfYnBfcndfZmlyc3RfYWRkciAwCisjZGVmaW5lIFJFR19XUl9BRERSX21hcmJfYmFyX2JwX3J3X2ZpcnN0X2FkZHIgMAorCisvKiBSZWdpc3RlciByd19sYXN0X2FkZHIsIHNjb3BlIG1hcmJfYmFyX2JwLCB0eXBlIHJ3ICovCit0eXBlZGVmIHVuc2lnbmVkIGludCByZWdfbWFyYl9iYXJfYnBfcndfbGFzdF9hZGRyOworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2Jhcl9icF9yd19sYXN0X2FkZHIgNAorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX2Jhcl9icF9yd19sYXN0X2FkZHIgNAorCisvKiBSZWdpc3RlciByd19vcCwgc2NvcGUgbWFyYl9iYXJfYnAsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHJkICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgd3IgICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCByZF9leGNsICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHByaV93ciAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdXNfcmQgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB1c193ciAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHVzX3JkX2V4Y2wgOiAxOworICB1bnNpZ25lZCBpbnQgdXNfcHJpX3dyICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgIDogMjQ7Cit9IHJlZ19tYXJiX2Jhcl9icF9yd19vcDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9iYXJfYnBfcndfb3AgOAorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX2Jhcl9icF9yd19vcCA4CisKKy8qIFJlZ2lzdGVyIHJ3X2NsaWVudHMsIHNjb3BlIG1hcmJfYmFyX2JwLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBoMjY0X3JkICAgOiAxOworICB1bnNpZ25lZCBpbnQgaDI2NF93ciAgIDogMTsKKyAgdW5zaWduZWQgaW50IGNjZCAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB2aW5fd3IgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdmluX3JkICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNjbHJfcmQgICA6IDE7CisgIHVuc2lnbmVkIGludCB2b3V0ICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2Nscl9maWZvIDogMTsKKyAgdW5zaWduZWQgaW50IGwyY2FjaGUgICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgOiAyMzsKK30gcmVnX21hcmJfYmFyX2JwX3J3X2NsaWVudHM7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfYmFyX2JwX3J3X2NsaWVudHMgMTIKKyNkZWZpbmUgUkVHX1dSX0FERFJfbWFyYl9iYXJfYnBfcndfY2xpZW50cyAxMgorCisvKiBSZWdpc3RlciByd19vcHRpb25zLCBzY29wZSBtYXJiX2Jhcl9icCwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgd3JhcCA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAzMTsKK30gcmVnX21hcmJfYmFyX2JwX3J3X29wdGlvbnM7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfYmFyX2JwX3J3X29wdGlvbnMgMTYKKyNkZWZpbmUgUkVHX1dSX0FERFJfbWFyYl9iYXJfYnBfcndfb3B0aW9ucyAxNgorCisvKiBSZWdpc3RlciByX2Jya19hZGRyLCBzY29wZSBtYXJiX2Jhcl9icCwgdHlwZSByICovCit0eXBlZGVmIHVuc2lnbmVkIGludCByZWdfbWFyYl9iYXJfYnBfcl9icmtfYWRkcjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9iYXJfYnBfcl9icmtfYWRkciAyMAorCisvKiBSZWdpc3RlciByX2Jya19vcCwgc2NvcGUgbWFyYl9iYXJfYnAsIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgcmQgICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB3ciAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHJkX2V4Y2wgICAgOiAxOworICB1bnNpZ25lZCBpbnQgcHJpX3dyICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB1c19yZCAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHVzX3dyICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdXNfcmRfZXhjbCA6IDE7CisgIHVuc2lnbmVkIGludCB1c19wcmlfd3IgIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgOiAyNDsKK30gcmVnX21hcmJfYmFyX2JwX3JfYnJrX29wOworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2Jhcl9icF9yX2Jya19vcCAyNAorCisvKiBSZWdpc3RlciByX2Jya19jbGllbnRzLCBzY29wZSBtYXJiX2Jhcl9icCwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBoMjY0X3JkICAgOiAxOworICB1bnNpZ25lZCBpbnQgaDI2NF93ciAgIDogMTsKKyAgdW5zaWduZWQgaW50IGNjZCAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB2aW5fd3IgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdmluX3JkICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNjbHJfcmQgICA6IDE7CisgIHVuc2lnbmVkIGludCB2b3V0ICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2Nscl9maWZvIDogMTsKKyAgdW5zaWduZWQgaW50IGwyY2FjaGUgICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgOiAyMzsKK30gcmVnX21hcmJfYmFyX2JwX3JfYnJrX2NsaWVudHM7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfYmFyX2JwX3JfYnJrX2NsaWVudHMgMjgKKworLyogUmVnaXN0ZXIgcl9icmtfZmlyc3RfY2xpZW50LCBzY29wZSBtYXJiX2Jhcl9icCwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBoMjY0X3JkICAgOiAxOworICB1bnNpZ25lZCBpbnQgaDI2NF93ciAgIDogMTsKKyAgdW5zaWduZWQgaW50IGNjZCAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB2aW5fd3IgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdmluX3JkICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNjbHJfcmQgICA6IDE7CisgIHVuc2lnbmVkIGludCB2b3V0ICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2Nscl9maWZvIDogMTsKKyAgdW5zaWduZWQgaW50IGwyY2FjaGUgICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgOiAyMzsKK30gcmVnX21hcmJfYmFyX2JwX3JfYnJrX2ZpcnN0X2NsaWVudDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9iYXJfYnBfcl9icmtfZmlyc3RfY2xpZW50IDMyCisKKy8qIFJlZ2lzdGVyIHJfYnJrX3NpemUsIHNjb3BlIG1hcmJfYmFyX2JwLCB0eXBlIHIgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IHJlZ19tYXJiX2Jhcl9icF9yX2Jya19zaXplOworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2Jhcl9icF9yX2Jya19zaXplIDM2CisKKy8qIFJlZ2lzdGVyIHJ3X2Fjaywgc2NvcGUgbWFyYl9iYXJfYnAsIHR5cGUgcncgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IHJlZ19tYXJiX2Jhcl9icF9yd19hY2s7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfYmFyX2JwX3J3X2FjayA0MAorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX2Jhcl9icF9yd19hY2sgNDAKKworCisvKiBDb25zdGFudHMgKi8KK2VudW0geworICByZWdrX21hcmJfYmFyX2JwX25vICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19tYXJiX2Jhcl9icF9yd19vcF9kZWZhdWx0ICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfbWFyYl9iYXJfYnBfcndfb3B0aW9uc19kZWZhdWx0ICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX21hcmJfYmFyX2JwX3llcyAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMQorfTsKKyNlbmRpZiAvKiBfX21hcmJfYmFyX2JwX2RlZnNfaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9tYXJiX2Zvb19kZWZzLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL21hcmJfZm9vX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmFhODMzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9tYXJiX2Zvb19kZWZzLmgKQEAgLTAsMCArMSw2MjYgQEAKKyNpZm5kZWYgX19tYXJiX2Zvb19kZWZzX2gKKyNkZWZpbmUgX19tYXJiX2Zvb19kZWZzX2gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGZyb20KKyAqICAgZmlsZTogICAgICAgICAgIG1hcmJfZm9vLnIKKyAqIAorICogICBieSAuLi8uLi8uLi90b29scy9yZGVzYy9iaW4vcmRlczJjIC1vdXRmaWxlIG1hcmJfZm9vX2RlZnMuaCBtYXJiX2Zvby5yCisgKiBBbnkgY2hhbmdlcyBoZXJlIHdpbGwgYmUgbG9zdC4KKyAqCisgKiAtKi0gYnVmZmVyLXJlYWQtb25seTogdCAtKi0KKyAqLworLyogTWFpbiBhY2Nlc3MgbWFjcm9zICovCisjaWZuZGVmIFJFR19SRAorI2RlZmluZSBSRUdfUkQoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgIFJFR19SRUFEKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSCisjZGVmaW5lIFJFR19XUiggc2NvcGUsIGluc3QsIHJlZywgdmFsICkgXAorICBSRUdfV1JJVEUoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgICAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9WRUNUCisjZGVmaW5lIFJFR19SRF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgUkVHX1JFQUQoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKwkgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSX1ZFQ1QKKyNkZWZpbmUgUkVHX1dSX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4LCB2YWwgKSBcCisgIFJFR19XUklURSggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKwkgICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfSU5UCisjZGVmaW5lIFJFR19SRF9JTlQoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgIFJFR19SRUFEKCBpbnQsIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfSU5UCisjZGVmaW5lIFJFR19XUl9JTlQoIHNjb3BlLCBpbnN0LCByZWcsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCBpbnQsIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX0lOVF9WRUNUCisjZGVmaW5lIFJFR19SRF9JTlRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgIFJFR19SRUFEKCBpbnQsIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKwkgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSX0lOVF9WRUNUCisjZGVmaW5lIFJFR19XUl9JTlRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXgsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCBpbnQsIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKwkgICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfVFlQRV9DT05WCisjZGVmaW5lIFJFR19UWVBFX0NPTlYoIHR5cGUsIG9yZ3R5cGUsIHZhbCApIFwKKyAgKCB7IHVuaW9uIHsgb3JndHlwZSBvOyB0eXBlIG47IH0gcjsgci5vID0gdmFsOyByLm47IH0gKQorI2VuZGlmCisKKyNpZm5kZWYgcmVnX3BhZ2Vfc2l6ZQorI2RlZmluZSByZWdfcGFnZV9zaXplIDgxOTIKKyNlbmRpZgorCisjaWZuZGVmIFJFR19BRERSCisjZGVmaW5lIFJFR19BRERSKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICAoIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUl9WRUNUCisjZGVmaW5lIFJFR19BRERSX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICAoIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKyAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworLyogQy1jb2RlIGZvciByZWdpc3RlciBzY29wZSBtYXJiX2ZvbyAqLworCisjZGVmaW5lIFNUUklERV9tYXJiX2Zvb19yd19pbnRtX3Nsb3RzIDQKKy8qIFJlZ2lzdGVyIHJ3X2ludG1fc2xvdHMsIHNjb3BlIG1hcmJfZm9vLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBvd25lciA6IDQ7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyODsKK30gcmVnX21hcmJfZm9vX3J3X2ludG1fc2xvdHM7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfZm9vX3J3X2ludG1fc2xvdHMgMAorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX2Zvb19yd19pbnRtX3Nsb3RzIDAKKworI2RlZmluZSBTVFJJREVfbWFyYl9mb29fcndfbDJfc2xvdHMgNAorLyogUmVnaXN0ZXIgcndfbDJfc2xvdHMsIHNjb3BlIG1hcmJfZm9vLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBvd25lciA6IDQ7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyODsKK30gcmVnX21hcmJfZm9vX3J3X2wyX3Nsb3RzOworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2Zvb19yd19sMl9zbG90cyAyNTYKKyNkZWZpbmUgUkVHX1dSX0FERFJfbWFyYl9mb29fcndfbDJfc2xvdHMgMjU2CisKKyNkZWZpbmUgU1RSSURFX21hcmJfZm9vX3J3X3JlZ3Nfc2xvdHMgNAorLyogUmVnaXN0ZXIgcndfcmVnc19zbG90cywgc2NvcGUgbWFyYl9mb28sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IG93bmVyIDogNDsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI4OworfSByZWdfbWFyYl9mb29fcndfcmVnc19zbG90czsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9mb29fcndfcmVnc19zbG90cyA1MTIKKyNkZWZpbmUgUkVHX1dSX0FERFJfbWFyYl9mb29fcndfcmVnc19zbG90cyA1MTIKKworLyogUmVnaXN0ZXIgcndfc2Nscl9idXJzdCwgc2NvcGUgbWFyYl9mb28sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGludG1fYnNpemUgOiAyOworICB1bnNpZ25lZCBpbnQgbDJfYnNpemUgICA6IDI7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgIDogMjg7Cit9IHJlZ19tYXJiX2Zvb19yd19zY2xyX2J1cnN0OworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2Zvb19yd19zY2xyX2J1cnN0IDUyOAorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX2Zvb19yd19zY2xyX2J1cnN0IDUyOAorCisvKiBSZWdpc3RlciByd19kbWEwX2J1cnN0LCBzY29wZSBtYXJiX2ZvbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgaW50bV9ic2l6ZSA6IDI7CisgIHVuc2lnbmVkIGludCBsMl9ic2l6ZSAgIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgOiAyODsKK30gcmVnX21hcmJfZm9vX3J3X2RtYTBfYnVyc3Q7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfZm9vX3J3X2RtYTBfYnVyc3QgNTMyCisjZGVmaW5lIFJFR19XUl9BRERSX21hcmJfZm9vX3J3X2RtYTBfYnVyc3QgNTMyCisKKy8qIFJlZ2lzdGVyIHJ3X2RtYTFfYnVyc3QsIHNjb3BlIG1hcmJfZm9vLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBpbnRtX2JzaXplIDogMjsKKyAgdW5zaWduZWQgaW50IGwyX2JzaXplICAgOiAyOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICA6IDI4OworfSByZWdfbWFyYl9mb29fcndfZG1hMV9idXJzdDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9mb29fcndfZG1hMV9idXJzdCA1MzYKKyNkZWZpbmUgUkVHX1dSX0FERFJfbWFyYl9mb29fcndfZG1hMV9idXJzdCA1MzYKKworLyogUmVnaXN0ZXIgcndfZG1hMl9idXJzdCwgc2NvcGUgbWFyYl9mb28sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGludG1fYnNpemUgOiAyOworICB1bnNpZ25lZCBpbnQgbDJfYnNpemUgICA6IDI7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgIDogMjg7Cit9IHJlZ19tYXJiX2Zvb19yd19kbWEyX2J1cnN0OworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2Zvb19yd19kbWEyX2J1cnN0IDU0MAorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX2Zvb19yd19kbWEyX2J1cnN0IDU0MAorCisvKiBSZWdpc3RlciByd19kbWEzX2J1cnN0LCBzY29wZSBtYXJiX2ZvbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgaW50bV9ic2l6ZSA6IDI7CisgIHVuc2lnbmVkIGludCBsMl9ic2l6ZSAgIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgOiAyODsKK30gcmVnX21hcmJfZm9vX3J3X2RtYTNfYnVyc3Q7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfZm9vX3J3X2RtYTNfYnVyc3QgNTQ0CisjZGVmaW5lIFJFR19XUl9BRERSX21hcmJfZm9vX3J3X2RtYTNfYnVyc3QgNTQ0CisKKy8qIFJlZ2lzdGVyIHJ3X2RtYTRfYnVyc3QsIHNjb3BlIG1hcmJfZm9vLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBpbnRtX2JzaXplIDogMjsKKyAgdW5zaWduZWQgaW50IGwyX2JzaXplICAgOiAyOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICA6IDI4OworfSByZWdfbWFyYl9mb29fcndfZG1hNF9idXJzdDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9mb29fcndfZG1hNF9idXJzdCA1NDgKKyNkZWZpbmUgUkVHX1dSX0FERFJfbWFyYl9mb29fcndfZG1hNF9idXJzdCA1NDgKKworLyogUmVnaXN0ZXIgcndfZG1hNV9idXJzdCwgc2NvcGUgbWFyYl9mb28sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGludG1fYnNpemUgOiAyOworICB1bnNpZ25lZCBpbnQgbDJfYnNpemUgICA6IDI7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgIDogMjg7Cit9IHJlZ19tYXJiX2Zvb19yd19kbWE1X2J1cnN0OworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2Zvb19yd19kbWE1X2J1cnN0IDU1MgorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX2Zvb19yd19kbWE1X2J1cnN0IDU1MgorCisvKiBSZWdpc3RlciByd19kbWE2X2J1cnN0LCBzY29wZSBtYXJiX2ZvbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgaW50bV9ic2l6ZSA6IDI7CisgIHVuc2lnbmVkIGludCBsMl9ic2l6ZSAgIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgOiAyODsKK30gcmVnX21hcmJfZm9vX3J3X2RtYTZfYnVyc3Q7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfZm9vX3J3X2RtYTZfYnVyc3QgNTU2CisjZGVmaW5lIFJFR19XUl9BRERSX21hcmJfZm9vX3J3X2RtYTZfYnVyc3QgNTU2CisKKy8qIFJlZ2lzdGVyIHJ3X2RtYTdfYnVyc3QsIHNjb3BlIG1hcmJfZm9vLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBpbnRtX2JzaXplIDogMjsKKyAgdW5zaWduZWQgaW50IGwyX2JzaXplICAgOiAyOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICA6IDI4OworfSByZWdfbWFyYl9mb29fcndfZG1hN19idXJzdDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9mb29fcndfZG1hN19idXJzdCA1NjAKKyNkZWZpbmUgUkVHX1dSX0FERFJfbWFyYl9mb29fcndfZG1hN19idXJzdCA1NjAKKworLyogUmVnaXN0ZXIgcndfZG1hOV9idXJzdCwgc2NvcGUgbWFyYl9mb28sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGludG1fYnNpemUgOiAyOworICB1bnNpZ25lZCBpbnQgbDJfYnNpemUgICA6IDI7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgIDogMjg7Cit9IHJlZ19tYXJiX2Zvb19yd19kbWE5X2J1cnN0OworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2Zvb19yd19kbWE5X2J1cnN0IDU2NAorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX2Zvb19yd19kbWE5X2J1cnN0IDU2NAorCisvKiBSZWdpc3RlciByd19kbWExMV9idXJzdCwgc2NvcGUgbWFyYl9mb28sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGludG1fYnNpemUgOiAyOworICB1bnNpZ25lZCBpbnQgbDJfYnNpemUgICA6IDI7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgIDogMjg7Cit9IHJlZ19tYXJiX2Zvb19yd19kbWExMV9idXJzdDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9mb29fcndfZG1hMTFfYnVyc3QgNTY4CisjZGVmaW5lIFJFR19XUl9BRERSX21hcmJfZm9vX3J3X2RtYTExX2J1cnN0IDU2OAorCisvKiBSZWdpc3RlciByd19jcHVpX2J1cnN0LCBzY29wZSBtYXJiX2ZvbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgaW50bV9ic2l6ZSA6IDI7CisgIHVuc2lnbmVkIGludCBsMl9ic2l6ZSAgIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgOiAyODsKK30gcmVnX21hcmJfZm9vX3J3X2NwdWlfYnVyc3Q7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfZm9vX3J3X2NwdWlfYnVyc3QgNTcyCisjZGVmaW5lIFJFR19XUl9BRERSX21hcmJfZm9vX3J3X2NwdWlfYnVyc3QgNTcyCisKKy8qIFJlZ2lzdGVyIHJ3X2NwdWRfYnVyc3QsIHNjb3BlIG1hcmJfZm9vLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBpbnRtX2JzaXplIDogMjsKKyAgdW5zaWduZWQgaW50IGwyX2JzaXplICAgOiAyOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICA6IDI4OworfSByZWdfbWFyYl9mb29fcndfY3B1ZF9idXJzdDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9mb29fcndfY3B1ZF9idXJzdCA1NzYKKyNkZWZpbmUgUkVHX1dSX0FERFJfbWFyYl9mb29fcndfY3B1ZF9idXJzdCA1NzYKKworLyogUmVnaXN0ZXIgcndfaW9wX2J1cnN0LCBzY29wZSBtYXJiX2ZvbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgaW50bV9ic2l6ZSA6IDI7CisgIHVuc2lnbmVkIGludCBsMl9ic2l6ZSAgIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgOiAyODsKK30gcmVnX21hcmJfZm9vX3J3X2lvcF9idXJzdDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9mb29fcndfaW9wX2J1cnN0IDU4MAorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX2Zvb19yd19pb3BfYnVyc3QgNTgwCisKKy8qIFJlZ2lzdGVyIHJ3X2NjZHN0YXRfYnVyc3QsIHNjb3BlIG1hcmJfZm9vLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBpbnRtX2JzaXplIDogMjsKKyAgdW5zaWduZWQgaW50IGwyX2JzaXplICAgOiAyOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICA6IDI4OworfSByZWdfbWFyYl9mb29fcndfY2Nkc3RhdF9idXJzdDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9mb29fcndfY2Nkc3RhdF9idXJzdCA1ODQKKyNkZWZpbmUgUkVHX1dSX0FERFJfbWFyYl9mb29fcndfY2Nkc3RhdF9idXJzdCA1ODQKKworLyogUmVnaXN0ZXIgcndfaW50cl9tYXNrLCBzY29wZSBtYXJiX2ZvbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgYnAwIDogMTsKKyAgdW5zaWduZWQgaW50IGJwMSA6IDE7CisgIHVuc2lnbmVkIGludCBicDIgOiAxOworICB1bnNpZ25lZCBpbnQgYnAzIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI4OworfSByZWdfbWFyYl9mb29fcndfaW50cl9tYXNrOworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2Zvb19yd19pbnRyX21hc2sgNTg4CisjZGVmaW5lIFJFR19XUl9BRERSX21hcmJfZm9vX3J3X2ludHJfbWFzayA1ODgKKworLyogUmVnaXN0ZXIgcndfYWNrX2ludHIsIHNjb3BlIG1hcmJfZm9vLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBicDAgOiAxOworICB1bnNpZ25lZCBpbnQgYnAxIDogMTsKKyAgdW5zaWduZWQgaW50IGJwMiA6IDE7CisgIHVuc2lnbmVkIGludCBicDMgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjg7Cit9IHJlZ19tYXJiX2Zvb19yd19hY2tfaW50cjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9mb29fcndfYWNrX2ludHIgNTkyCisjZGVmaW5lIFJFR19XUl9BRERSX21hcmJfZm9vX3J3X2Fja19pbnRyIDU5MgorCisvKiBSZWdpc3RlciByX2ludHIsIHNjb3BlIG1hcmJfZm9vLCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGJwMCA6IDE7CisgIHVuc2lnbmVkIGludCBicDEgOiAxOworICB1bnNpZ25lZCBpbnQgYnAyIDogMTsKKyAgdW5zaWduZWQgaW50IGJwMyA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyODsKK30gcmVnX21hcmJfZm9vX3JfaW50cjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9mb29fcl9pbnRyIDU5NgorCisvKiBSZWdpc3RlciByX21hc2tlZF9pbnRyLCBzY29wZSBtYXJiX2ZvbywgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBicDAgOiAxOworICB1bnNpZ25lZCBpbnQgYnAxIDogMTsKKyAgdW5zaWduZWQgaW50IGJwMiA6IDE7CisgIHVuc2lnbmVkIGludCBicDMgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjg7Cit9IHJlZ19tYXJiX2Zvb19yX21hc2tlZF9pbnRyOworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2Zvb19yX21hc2tlZF9pbnRyIDYwMAorCisvKiBSZWdpc3RlciByd19zdG9wX21hc2ssIHNjb3BlIG1hcmJfZm9vLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBzY2xyICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMSAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWEyICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTMgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE1ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTYgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNyAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE5ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTExICAgOiAxOworICB1bnNpZ25lZCBpbnQgY3B1aSAgICA6IDE7CisgIHVuc2lnbmVkIGludCBjcHVkICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGlvcCAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgY2Nkc3RhdCA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgIDogMTc7Cit9IHJlZ19tYXJiX2Zvb19yd19zdG9wX21hc2s7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfZm9vX3J3X3N0b3BfbWFzayA2MDQKKyNkZWZpbmUgUkVHX1dSX0FERFJfbWFyYl9mb29fcndfc3RvcF9tYXNrIDYwNAorCisvKiBSZWdpc3RlciByX3N0b3BwZWQsIHNjb3BlIG1hcmJfZm9vLCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHNjbHIgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWExICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTIgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMyAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE0ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTUgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNiAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE3ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTkgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMTEgICA6IDE7CisgIHVuc2lnbmVkIGludCBjcHVpICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGNwdWQgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaW9wICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBjY2RzdGF0IDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgOiAxNzsKK30gcmVnX21hcmJfZm9vX3Jfc3RvcHBlZDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9mb29fcl9zdG9wcGVkIDYwOAorCisvKiBSZWdpc3RlciByd19ub19zbm9vcCwgc2NvcGUgbWFyYl9mb28sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHNjbHIgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWExICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTIgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMyAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE0ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTUgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNiAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE3ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTkgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMTEgICA6IDE7CisgIHVuc2lnbmVkIGludCBjcHVpICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGNwdWQgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaW9wICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBjY2RzdGF0IDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgOiAxNzsKK30gcmVnX21hcmJfZm9vX3J3X25vX3Nub29wOworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2Zvb19yd19ub19zbm9vcCA4OTYKKyNkZWZpbmUgUkVHX1dSX0FERFJfbWFyYl9mb29fcndfbm9fc25vb3AgODk2CisKKy8qIFJlZ2lzdGVyIHJ3X25vX3Nub29wX3JxLCBzY29wZSBtYXJiX2ZvbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTE7CisgIHVuc2lnbmVkIGludCBjcHVpIDogMTsKKyAgdW5zaWduZWQgaW50IGNwdWQgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkyIDogMTk7Cit9IHJlZ19tYXJiX2Zvb19yd19ub19zbm9vcF9ycTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9mb29fcndfbm9fc25vb3BfcnEgOTAwCisjZGVmaW5lIFJFR19XUl9BRERSX21hcmJfZm9vX3J3X25vX3Nub29wX3JxIDkwMAorCisKKy8qIENvbnN0YW50cyAqLworZW51bSB7CisgIHJlZ2tfbWFyYl9mb29fY2Nkc3RhdCAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDBlLAorICByZWdrX21hcmJfZm9vX2NwdWQgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwYywKKyAgcmVna19tYXJiX2Zvb19jcHVpICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMGIsCisgIHJlZ2tfbWFyYl9mb29fZG1hMCAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX21hcmJfZm9vX2RtYTEgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19tYXJiX2Zvb19kbWExMSAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMGEsCisgIHJlZ2tfbWFyYl9mb29fZG1hMiAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAzLAorICByZWdrX21hcmJfZm9vX2RtYTMgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNCwKKyAgcmVna19tYXJiX2Zvb19kbWE0ICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDUsCisgIHJlZ2tfbWFyYl9mb29fZG1hNSAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA2LAorICByZWdrX21hcmJfZm9vX2RtYTYgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNywKKyAgcmVna19tYXJiX2Zvb19kbWE3ICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDgsCisgIHJlZ2tfbWFyYl9mb29fZG1hOSAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA5LAorICByZWdrX21hcmJfZm9vX2lvcCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwZCwKKyAgcmVna19tYXJiX2Zvb19ubyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfbWFyYl9mb29fcl9zdG9wcGVkX2RlZmF1bHQgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX21hcmJfZm9vX3J3X2NjZHN0YXRfYnVyc3RfZGVmYXVsdCAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19tYXJiX2Zvb19yd19jcHVkX2J1cnN0X2RlZmF1bHQgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfbWFyYl9mb29fcndfY3B1aV9idXJzdF9kZWZhdWx0ICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX21hcmJfZm9vX3J3X2RtYTBfYnVyc3RfZGVmYXVsdCAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19tYXJiX2Zvb19yd19kbWExMV9idXJzdF9kZWZhdWx0ICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfbWFyYl9mb29fcndfZG1hMV9idXJzdF9kZWZhdWx0ICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX21hcmJfZm9vX3J3X2RtYTJfYnVyc3RfZGVmYXVsdCAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19tYXJiX2Zvb19yd19kbWEzX2J1cnN0X2RlZmF1bHQgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfbWFyYl9mb29fcndfZG1hNF9idXJzdF9kZWZhdWx0ICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX21hcmJfZm9vX3J3X2RtYTVfYnVyc3RfZGVmYXVsdCAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19tYXJiX2Zvb19yd19kbWE2X2J1cnN0X2RlZmF1bHQgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfbWFyYl9mb29fcndfZG1hN19idXJzdF9kZWZhdWx0ICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX21hcmJfZm9vX3J3X2RtYTlfYnVyc3RfZGVmYXVsdCAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19tYXJiX2Zvb19yd19pbnRtX3Nsb3RzX2RlZmF1bHQgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfbWFyYl9mb29fcndfaW50bV9zbG90c19zaXplICAgICAgICAgPSAweDAwMDAwMDQwLAorICByZWdrX21hcmJfZm9vX3J3X2ludHJfbWFza19kZWZhdWx0ICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19tYXJiX2Zvb19yd19pb3BfYnVyc3RfZGVmYXVsdCAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfbWFyYl9mb29fcndfbDJfc2xvdHNfZGVmYXVsdCAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX21hcmJfZm9vX3J3X2wyX3Nsb3RzX3NpemUgICAgICAgICAgID0gMHgwMDAwMDA0MCwKKyAgcmVna19tYXJiX2Zvb19yd19ub19zbm9vcF9kZWZhdWx0ICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfbWFyYl9mb29fcndfbm9fc25vb3BfcnFfZGVmYXVsdCAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX21hcmJfZm9vX3J3X3JlZ3Nfc2xvdHNfZGVmYXVsdCAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19tYXJiX2Zvb19yd19yZWdzX3Nsb3RzX3NpemUgICAgICAgICA9IDB4MDAwMDAwMDQsCisgIHJlZ2tfbWFyYl9mb29fcndfc2Nscl9idXJzdF9kZWZhdWx0ICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX21hcmJfZm9vX3J3X3N0b3BfbWFza19kZWZhdWx0ICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19tYXJiX2Zvb19zY2xyICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfbWFyYl9mb29feWVzICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxCit9OworI2VuZGlmIC8qIF9fbWFyYl9mb29fZGVmc19oICovCisjaWZuZGVmIF9fbWFyYl9mb29fYnBfZGVmc19oCisjZGVmaW5lIF9fbWFyYl9mb29fYnBfZGVmc19oCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCisgKiAgIGZpbGU6ICAgICAgICAgICBtYXJiX2Zvby5yCisgKiAKKyAqICAgYnkgLi4vLi4vLi4vdG9vbHMvcmRlc2MvYmluL3JkZXMyYyAtb3V0ZmlsZSBtYXJiX2Zvb19kZWZzLmggbWFyYl9mb28ucgorICogQW55IGNoYW5nZXMgaGVyZSB3aWxsIGJlIGxvc3QuCisgKgorICogLSotIGJ1ZmZlci1yZWFkLW9ubHk6IHQgLSotCisgKi8KKy8qIE1haW4gYWNjZXNzIG1hY3JvcyAqLworI2lmbmRlZiBSRUdfUkQKKyNkZWZpbmUgUkVHX1JEKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUgorI2RlZmluZSBSRUdfV1IoIHNjb3BlLCBpbnN0LCByZWcsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfVkVDVAorI2RlZmluZSBSRUdfUkRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgIFJFR19SRUFEKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9WRUNUCisjZGVmaW5lIFJFR19XUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgICAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX0lOVAorI2RlZmluZSBSRUdfUkRfSU5UKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSX0lOVAorI2RlZmluZSBSRUdfV1JfSU5UKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlRfVkVDVAorI2RlZmluZSBSRUdfUkRfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlRfVkVDVAorI2RlZmluZSBSRUdfV1JfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4LCB2YWwgKSBcCisgIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1RZUEVfQ09OVgorI2RlZmluZSBSRUdfVFlQRV9DT05WKCB0eXBlLCBvcmd0eXBlLCB2YWwgKSBcCisgICggeyB1bmlvbiB7IG9yZ3R5cGUgbzsgdHlwZSBuOyB9IHI7IHIubyA9IHZhbDsgci5uOyB9ICkKKyNlbmRpZgorCisjaWZuZGVmIHJlZ19wYWdlX3NpemUKKyNkZWZpbmUgcmVnX3BhZ2Vfc2l6ZSA4MTkyCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUgorI2RlZmluZSBSRUdfQUREUiggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFJfVkVDVAorI2RlZmluZSBSRUdfQUREUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKy8qIEMtY29kZSBmb3IgcmVnaXN0ZXIgc2NvcGUgbWFyYl9mb29fYnAgKi8KKworLyogUmVnaXN0ZXIgcndfZmlyc3RfYWRkciwgc2NvcGUgbWFyYl9mb29fYnAsIHR5cGUgcncgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IHJlZ19tYXJiX2Zvb19icF9yd19maXJzdF9hZGRyOworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2Zvb19icF9yd19maXJzdF9hZGRyIDAKKyNkZWZpbmUgUkVHX1dSX0FERFJfbWFyYl9mb29fYnBfcndfZmlyc3RfYWRkciAwCisKKy8qIFJlZ2lzdGVyIHJ3X2xhc3RfYWRkciwgc2NvcGUgbWFyYl9mb29fYnAsIHR5cGUgcncgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IHJlZ19tYXJiX2Zvb19icF9yd19sYXN0X2FkZHI7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfZm9vX2JwX3J3X2xhc3RfYWRkciA0CisjZGVmaW5lIFJFR19XUl9BRERSX21hcmJfZm9vX2JwX3J3X2xhc3RfYWRkciA0CisKKy8qIFJlZ2lzdGVyIHJ3X29wLCBzY29wZSBtYXJiX2Zvb19icCwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgcmQgICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB3ciAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHJkX2V4Y2wgICAgOiAxOworICB1bnNpZ25lZCBpbnQgcHJpX3dyICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB1c19yZCAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHVzX3dyICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdXNfcmRfZXhjbCA6IDE7CisgIHVuc2lnbmVkIGludCB1c19wcmlfd3IgIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgOiAyNDsKK30gcmVnX21hcmJfZm9vX2JwX3J3X29wOworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2Zvb19icF9yd19vcCA4CisjZGVmaW5lIFJFR19XUl9BRERSX21hcmJfZm9vX2JwX3J3X29wIDgKKworLyogUmVnaXN0ZXIgcndfY2xpZW50cywgc2NvcGUgbWFyYl9mb29fYnAsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHNjbHIgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWExICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTIgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMyAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE0ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTUgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNiAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE3ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTkgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMTEgICA6IDE7CisgIHVuc2lnbmVkIGludCBjcHVpICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGNwdWQgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaW9wICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBjY2RzdGF0IDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgOiAxNzsKK30gcmVnX21hcmJfZm9vX2JwX3J3X2NsaWVudHM7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfZm9vX2JwX3J3X2NsaWVudHMgMTIKKyNkZWZpbmUgUkVHX1dSX0FERFJfbWFyYl9mb29fYnBfcndfY2xpZW50cyAxMgorCisvKiBSZWdpc3RlciByd19vcHRpb25zLCBzY29wZSBtYXJiX2Zvb19icCwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgd3JhcCA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAzMTsKK30gcmVnX21hcmJfZm9vX2JwX3J3X29wdGlvbnM7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfZm9vX2JwX3J3X29wdGlvbnMgMTYKKyNkZWZpbmUgUkVHX1dSX0FERFJfbWFyYl9mb29fYnBfcndfb3B0aW9ucyAxNgorCisvKiBSZWdpc3RlciByX2Jya19hZGRyLCBzY29wZSBtYXJiX2Zvb19icCwgdHlwZSByICovCit0eXBlZGVmIHVuc2lnbmVkIGludCByZWdfbWFyYl9mb29fYnBfcl9icmtfYWRkcjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9mb29fYnBfcl9icmtfYWRkciAyMAorCisvKiBSZWdpc3RlciByX2Jya19vcCwgc2NvcGUgbWFyYl9mb29fYnAsIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgcmQgICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB3ciAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHJkX2V4Y2wgICAgOiAxOworICB1bnNpZ25lZCBpbnQgcHJpX3dyICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB1c19yZCAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHVzX3dyICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdXNfcmRfZXhjbCA6IDE7CisgIHVuc2lnbmVkIGludCB1c19wcmlfd3IgIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgOiAyNDsKK30gcmVnX21hcmJfZm9vX2JwX3JfYnJrX29wOworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2Zvb19icF9yX2Jya19vcCAyNAorCisvKiBSZWdpc3RlciByX2Jya19jbGllbnRzLCBzY29wZSBtYXJiX2Zvb19icCwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBzY2xyICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMSAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWEyICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTMgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE1ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTYgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNyAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE5ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTExICAgOiAxOworICB1bnNpZ25lZCBpbnQgY3B1aSAgICA6IDE7CisgIHVuc2lnbmVkIGludCBjcHVkICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGlvcCAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgY2Nkc3RhdCA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgIDogMTc7Cit9IHJlZ19tYXJiX2Zvb19icF9yX2Jya19jbGllbnRzOworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2Zvb19icF9yX2Jya19jbGllbnRzIDI4CisKKy8qIFJlZ2lzdGVyIHJfYnJrX2ZpcnN0X2NsaWVudCwgc2NvcGUgbWFyYl9mb29fYnAsIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgc2NsciAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWEwICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTEgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMiAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWEzICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTQgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNSAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE2ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTcgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hOSAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWExMSAgIDogMTsKKyAgdW5zaWduZWQgaW50IGNwdWkgICAgOiAxOworICB1bnNpZ25lZCBpbnQgY3B1ZCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBpb3AgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGNjZHN0YXQgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICA6IDE3OworfSByZWdfbWFyYl9mb29fYnBfcl9icmtfZmlyc3RfY2xpZW50OworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2Zvb19icF9yX2Jya19maXJzdF9jbGllbnQgMzIKKworLyogUmVnaXN0ZXIgcl9icmtfc2l6ZSwgc2NvcGUgbWFyYl9mb29fYnAsIHR5cGUgciAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVnX21hcmJfZm9vX2JwX3JfYnJrX3NpemU7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfZm9vX2JwX3JfYnJrX3NpemUgMzYKKworLyogUmVnaXN0ZXIgcndfYWNrLCBzY29wZSBtYXJiX2Zvb19icCwgdHlwZSBydyAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVnX21hcmJfZm9vX2JwX3J3X2FjazsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9mb29fYnBfcndfYWNrIDQwCisjZGVmaW5lIFJFR19XUl9BRERSX21hcmJfZm9vX2JwX3J3X2FjayA0MAorCisKKy8qIENvbnN0YW50cyAqLworZW51bSB7CisgIHJlZ2tfbWFyYl9mb29fYnBfbm8gICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX21hcmJfZm9vX2JwX3J3X29wX2RlZmF1bHQgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19tYXJiX2Zvb19icF9yd19vcHRpb25zX2RlZmF1bHQgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfbWFyYl9mb29fYnBfeWVzICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxCit9OworI2VuZGlmIC8qIF9fbWFyYl9mb29fYnBfZGVmc19oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL3Bpbm11eF9kZWZzLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL3Bpbm11eF9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI5NmNkMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvcGlubXV4X2RlZnMuaApAQCAtMCwwICsxLDMxMiBAQAorI2lmbmRlZiBfX3Bpbm11eF9kZWZzX2gKKyNkZWZpbmUgX19waW5tdXhfZGVmc19oCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCisgKiAgIGZpbGU6ICAgICAgICAgICBwaW5tdXgucgorICogCisgKiAgIGJ5IC4uLy4uLy4uL3Rvb2xzL3JkZXNjL2Jpbi9yZGVzMmMgLW91dGZpbGUgcGlubXV4X2RlZnMuaCBwaW5tdXgucgorICogQW55IGNoYW5nZXMgaGVyZSB3aWxsIGJlIGxvc3QuCisgKgorICogLSotIGJ1ZmZlci1yZWFkLW9ubHk6IHQgLSotCisgKi8KKy8qIE1haW4gYWNjZXNzIG1hY3JvcyAqLworI2lmbmRlZiBSRUdfUkQKKyNkZWZpbmUgUkVHX1JEKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUgorI2RlZmluZSBSRUdfV1IoIHNjb3BlLCBpbnN0LCByZWcsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfVkVDVAorI2RlZmluZSBSRUdfUkRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgIFJFR19SRUFEKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9WRUNUCisjZGVmaW5lIFJFR19XUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgICAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX0lOVAorI2RlZmluZSBSRUdfUkRfSU5UKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSX0lOVAorI2RlZmluZSBSRUdfV1JfSU5UKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlRfVkVDVAorI2RlZmluZSBSRUdfUkRfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlRfVkVDVAorI2RlZmluZSBSRUdfV1JfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4LCB2YWwgKSBcCisgIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1RZUEVfQ09OVgorI2RlZmluZSBSRUdfVFlQRV9DT05WKCB0eXBlLCBvcmd0eXBlLCB2YWwgKSBcCisgICggeyB1bmlvbiB7IG9yZ3R5cGUgbzsgdHlwZSBuOyB9IHI7IHIubyA9IHZhbDsgci5uOyB9ICkKKyNlbmRpZgorCisjaWZuZGVmIHJlZ19wYWdlX3NpemUKKyNkZWZpbmUgcmVnX3BhZ2Vfc2l6ZSA4MTkyCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUgorI2RlZmluZSBSRUdfQUREUiggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFJfVkVDVAorI2RlZmluZSBSRUdfQUREUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKy8qIEMtY29kZSBmb3IgcmVnaXN0ZXIgc2NvcGUgcGlubXV4ICovCisKKy8qIFJlZ2lzdGVyIHJ3X2h3cHJvdCwgc2NvcGUgcGlubXV4LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBldGggICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZXRoX21kaW8gIDogMTsKKyAgdW5zaWduZWQgaW50IGdldGggICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0ZyAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdGdfY2xrICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHZvdXQgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB2b3V0X3N5bmMgOiAxOworICB1bnNpZ25lZCBpbnQgc2VyMSAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNlcjIgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzZXIzICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2VyNCAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNzZXIgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBwd20wICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgcHdtMSAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHB3bTIgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0aW1lcjAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdGltZXIxICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHBpbyAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBpMmMwICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaTJjMSAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGkyYzFfc2RhMSA6IDE7CisgIHVuc2lnbmVkIGludCBpMmMxX3NkYTIgOiAxOworICB1bnNpZ25lZCBpbnQgaTJjMV9zZGEzIDogMTsKKyAgdW5zaWduZWQgaW50IGkyYzFfc2VuICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgOiA4OworfSByZWdfcGlubXV4X3J3X2h3cHJvdDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfcGlubXV4X3J3X2h3cHJvdCAwCisjZGVmaW5lIFJFR19XUl9BRERSX3Bpbm11eF9yd19od3Byb3QgMAorCisvKiBSZWdpc3RlciByd19naW9fcGEsIHNjb3BlIHBpbm11eCwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgcGEwICA6IDE7CisgIHVuc2lnbmVkIGludCBwYTEgIDogMTsKKyAgdW5zaWduZWQgaW50IHBhMiAgOiAxOworICB1bnNpZ25lZCBpbnQgcGEzICA6IDE7CisgIHVuc2lnbmVkIGludCBwYTQgIDogMTsKKyAgdW5zaWduZWQgaW50IHBhNSAgOiAxOworICB1bnNpZ25lZCBpbnQgcGE2ICA6IDE7CisgIHVuc2lnbmVkIGludCBwYTcgIDogMTsKKyAgdW5zaWduZWQgaW50IHBhOCAgOiAxOworICB1bnNpZ25lZCBpbnQgcGE5ICA6IDE7CisgIHVuc2lnbmVkIGludCBwYTEwIDogMTsKKyAgdW5zaWduZWQgaW50IHBhMTEgOiAxOworICB1bnNpZ25lZCBpbnQgcGExMiA6IDE7CisgIHVuc2lnbmVkIGludCBwYTEzIDogMTsKKyAgdW5zaWduZWQgaW50IHBhMTQgOiAxOworICB1bnNpZ25lZCBpbnQgcGExNSA6IDE7CisgIHVuc2lnbmVkIGludCBwYTE2IDogMTsKKyAgdW5zaWduZWQgaW50IHBhMTcgOiAxOworICB1bnNpZ25lZCBpbnQgcGExOCA6IDE7CisgIHVuc2lnbmVkIGludCBwYTE5IDogMTsKKyAgdW5zaWduZWQgaW50IHBhMjAgOiAxOworICB1bnNpZ25lZCBpbnQgcGEyMSA6IDE7CisgIHVuc2lnbmVkIGludCBwYTIyIDogMTsKKyAgdW5zaWduZWQgaW50IHBhMjMgOiAxOworICB1bnNpZ25lZCBpbnQgcGEyNCA6IDE7CisgIHVuc2lnbmVkIGludCBwYTI1IDogMTsKKyAgdW5zaWduZWQgaW50IHBhMjYgOiAxOworICB1bnNpZ25lZCBpbnQgcGEyNyA6IDE7CisgIHVuc2lnbmVkIGludCBwYTI4IDogMTsKKyAgdW5zaWduZWQgaW50IHBhMjkgOiAxOworICB1bnNpZ25lZCBpbnQgcGEzMCA6IDE7CisgIHVuc2lnbmVkIGludCBwYTMxIDogMTsKK30gcmVnX3Bpbm11eF9yd19naW9fcGE7CisjZGVmaW5lIFJFR19SRF9BRERSX3Bpbm11eF9yd19naW9fcGEgNAorI2RlZmluZSBSRUdfV1JfQUREUl9waW5tdXhfcndfZ2lvX3BhIDQKKworLyogUmVnaXN0ZXIgcndfZ2lvX3BiLCBzY29wZSBwaW5tdXgsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHBiMCAgOiAxOworICB1bnNpZ25lZCBpbnQgcGIxICA6IDE7CisgIHVuc2lnbmVkIGludCBwYjIgIDogMTsKKyAgdW5zaWduZWQgaW50IHBiMyAgOiAxOworICB1bnNpZ25lZCBpbnQgcGI0ICA6IDE7CisgIHVuc2lnbmVkIGludCBwYjUgIDogMTsKKyAgdW5zaWduZWQgaW50IHBiNiAgOiAxOworICB1bnNpZ25lZCBpbnQgcGI3ICA6IDE7CisgIHVuc2lnbmVkIGludCBwYjggIDogMTsKKyAgdW5zaWduZWQgaW50IHBiOSAgOiAxOworICB1bnNpZ25lZCBpbnQgcGIxMCA6IDE7CisgIHVuc2lnbmVkIGludCBwYjExIDogMTsKKyAgdW5zaWduZWQgaW50IHBiMTIgOiAxOworICB1bnNpZ25lZCBpbnQgcGIxMyA6IDE7CisgIHVuc2lnbmVkIGludCBwYjE0IDogMTsKKyAgdW5zaWduZWQgaW50IHBiMTUgOiAxOworICB1bnNpZ25lZCBpbnQgcGIxNiA6IDE7CisgIHVuc2lnbmVkIGludCBwYjE3IDogMTsKKyAgdW5zaWduZWQgaW50IHBiMTggOiAxOworICB1bnNpZ25lZCBpbnQgcGIxOSA6IDE7CisgIHVuc2lnbmVkIGludCBwYjIwIDogMTsKKyAgdW5zaWduZWQgaW50IHBiMjEgOiAxOworICB1bnNpZ25lZCBpbnQgcGIyMiA6IDE7CisgIHVuc2lnbmVkIGludCBwYjIzIDogMTsKKyAgdW5zaWduZWQgaW50IHBiMjQgOiAxOworICB1bnNpZ25lZCBpbnQgcGIyNSA6IDE7CisgIHVuc2lnbmVkIGludCBwYjI2IDogMTsKKyAgdW5zaWduZWQgaW50IHBiMjcgOiAxOworICB1bnNpZ25lZCBpbnQgcGIyOCA6IDE7CisgIHVuc2lnbmVkIGludCBwYjI5IDogMTsKKyAgdW5zaWduZWQgaW50IHBiMzAgOiAxOworICB1bnNpZ25lZCBpbnQgcGIzMSA6IDE7Cit9IHJlZ19waW5tdXhfcndfZ2lvX3BiOworI2RlZmluZSBSRUdfUkRfQUREUl9waW5tdXhfcndfZ2lvX3BiIDgKKyNkZWZpbmUgUkVHX1dSX0FERFJfcGlubXV4X3J3X2dpb19wYiA4CisKKy8qIFJlZ2lzdGVyIHJ3X2dpb19wYywgc2NvcGUgcGlubXV4LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBwYzAgIDogMTsKKyAgdW5zaWduZWQgaW50IHBjMSAgOiAxOworICB1bnNpZ25lZCBpbnQgcGMyICA6IDE7CisgIHVuc2lnbmVkIGludCBwYzMgIDogMTsKKyAgdW5zaWduZWQgaW50IHBjNCAgOiAxOworICB1bnNpZ25lZCBpbnQgcGM1ICA6IDE7CisgIHVuc2lnbmVkIGludCBwYzYgIDogMTsKKyAgdW5zaWduZWQgaW50IHBjNyAgOiAxOworICB1bnNpZ25lZCBpbnQgcGM4ICA6IDE7CisgIHVuc2lnbmVkIGludCBwYzkgIDogMTsKKyAgdW5zaWduZWQgaW50IHBjMTAgOiAxOworICB1bnNpZ25lZCBpbnQgcGMxMSA6IDE7CisgIHVuc2lnbmVkIGludCBwYzEyIDogMTsKKyAgdW5zaWduZWQgaW50IHBjMTMgOiAxOworICB1bnNpZ25lZCBpbnQgcGMxNCA6IDE7CisgIHVuc2lnbmVkIGludCBwYzE1IDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDE2OworfSByZWdfcGlubXV4X3J3X2dpb19wYzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfcGlubXV4X3J3X2dpb19wYyAxMgorI2RlZmluZSBSRUdfV1JfQUREUl9waW5tdXhfcndfZ2lvX3BjIDEyCisKKy8qIFJlZ2lzdGVyIHJ3X2lvcF9wYSwgc2NvcGUgcGlubXV4LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBwYTAgIDogMTsKKyAgdW5zaWduZWQgaW50IHBhMSAgOiAxOworICB1bnNpZ25lZCBpbnQgcGEyICA6IDE7CisgIHVuc2lnbmVkIGludCBwYTMgIDogMTsKKyAgdW5zaWduZWQgaW50IHBhNCAgOiAxOworICB1bnNpZ25lZCBpbnQgcGE1ICA6IDE7CisgIHVuc2lnbmVkIGludCBwYTYgIDogMTsKKyAgdW5zaWduZWQgaW50IHBhNyAgOiAxOworICB1bnNpZ25lZCBpbnQgcGE4ICA6IDE7CisgIHVuc2lnbmVkIGludCBwYTkgIDogMTsKKyAgdW5zaWduZWQgaW50IHBhMTAgOiAxOworICB1bnNpZ25lZCBpbnQgcGExMSA6IDE7CisgIHVuc2lnbmVkIGludCBwYTEyIDogMTsKKyAgdW5zaWduZWQgaW50IHBhMTMgOiAxOworICB1bnNpZ25lZCBpbnQgcGExNCA6IDE7CisgIHVuc2lnbmVkIGludCBwYTE1IDogMTsKKyAgdW5zaWduZWQgaW50IHBhMTYgOiAxOworICB1bnNpZ25lZCBpbnQgcGExNyA6IDE7CisgIHVuc2lnbmVkIGludCBwYTE4IDogMTsKKyAgdW5zaWduZWQgaW50IHBhMTkgOiAxOworICB1bnNpZ25lZCBpbnQgcGEyMCA6IDE7CisgIHVuc2lnbmVkIGludCBwYTIxIDogMTsKKyAgdW5zaWduZWQgaW50IHBhMjIgOiAxOworICB1bnNpZ25lZCBpbnQgcGEyMyA6IDE7CisgIHVuc2lnbmVkIGludCBwYTI0IDogMTsKKyAgdW5zaWduZWQgaW50IHBhMjUgOiAxOworICB1bnNpZ25lZCBpbnQgcGEyNiA6IDE7CisgIHVuc2lnbmVkIGludCBwYTI3IDogMTsKKyAgdW5zaWduZWQgaW50IHBhMjggOiAxOworICB1bnNpZ25lZCBpbnQgcGEyOSA6IDE7CisgIHVuc2lnbmVkIGludCBwYTMwIDogMTsKKyAgdW5zaWduZWQgaW50IHBhMzEgOiAxOworfSByZWdfcGlubXV4X3J3X2lvcF9wYTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfcGlubXV4X3J3X2lvcF9wYSAxNgorI2RlZmluZSBSRUdfV1JfQUREUl9waW5tdXhfcndfaW9wX3BhIDE2CisKKy8qIFJlZ2lzdGVyIHJ3X2lvcF9wYiwgc2NvcGUgcGlubXV4LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBwYjAgOiAxOworICB1bnNpZ25lZCBpbnQgcGIxIDogMTsKKyAgdW5zaWduZWQgaW50IHBiMiA6IDE7CisgIHVuc2lnbmVkIGludCBwYjMgOiAxOworICB1bnNpZ25lZCBpbnQgcGI0IDogMTsKKyAgdW5zaWduZWQgaW50IHBiNSA6IDE7CisgIHVuc2lnbmVkIGludCBwYjYgOiAxOworICB1bnNpZ25lZCBpbnQgcGI3IDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI0OworfSByZWdfcGlubXV4X3J3X2lvcF9wYjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfcGlubXV4X3J3X2lvcF9wYiAyMAorI2RlZmluZSBSRUdfV1JfQUREUl9waW5tdXhfcndfaW9wX3BiIDIwCisKKy8qIFJlZ2lzdGVyIHJ3X2lvcF9waW8sIHNjb3BlIHBpbm11eCwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZDAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZDEgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZDIgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZDMgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZDQgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZDUgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZDYgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZDcgICAgOiAxOworICB1bnNpZ25lZCBpbnQgcmRfbiAgOiAxOworICB1bnNpZ25lZCBpbnQgd3JfbiAgOiAxOworICB1bnNpZ25lZCBpbnQgYTAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgYTEgICAgOiAxOworICB1bnNpZ25lZCBpbnQgY2UwX24gOiAxOworICB1bnNpZ25lZCBpbnQgY2UxX24gOiAxOworICB1bnNpZ25lZCBpbnQgY2UyX24gOiAxOworICB1bnNpZ25lZCBpbnQgcmR5ICAgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTY7Cit9IHJlZ19waW5tdXhfcndfaW9wX3BpbzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfcGlubXV4X3J3X2lvcF9waW8gMjQKKyNkZWZpbmUgUkVHX1dSX0FERFJfcGlubXV4X3J3X2lvcF9waW8gMjQKKworLyogUmVnaXN0ZXIgcndfaW9wX3VzYiwgc2NvcGUgcGlubXV4LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCB1c2IwIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDMxOworfSByZWdfcGlubXV4X3J3X2lvcF91c2I7CisjZGVmaW5lIFJFR19SRF9BRERSX3Bpbm11eF9yd19pb3BfdXNiIDI4CisjZGVmaW5lIFJFR19XUl9BRERSX3Bpbm11eF9yd19pb3BfdXNiIDI4CisKKworLyogQ29uc3RhbnRzICovCitlbnVtIHsKKyAgcmVna19waW5tdXhfbm8gICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfcGlubXV4X3J3X2dpb19wYV9kZWZhdWx0ICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX3Bpbm11eF9yd19naW9fcGJfZGVmYXVsdCAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19waW5tdXhfcndfZ2lvX3BjX2RlZmF1bHQgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfcGlubXV4X3J3X2h3cHJvdF9kZWZhdWx0ICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX3Bpbm11eF9yd19pb3BfcGFfZGVmYXVsdCAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19waW5tdXhfcndfaW9wX3BiX2RlZmF1bHQgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfcGlubXV4X3J3X2lvcF9waW9fZGVmYXVsdCAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX3Bpbm11eF9yd19pb3BfdXNiX2RlZmF1bHQgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19waW5tdXhfeWVzICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEKK307CisjZW5kaWYgLyogX19waW5tdXhfZGVmc19oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL3Bpb19kZWZzLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL3Bpb19kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ4ZTRiNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvcGlvX2RlZnMuaApAQCAtMCwwICsxLDM3MSBAQAorI2lmbmRlZiBfX3Bpb19kZWZzX2gKKyNkZWZpbmUgX19waW9fZGVmc19oCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCisgKiAgIGZpbGU6ICAgICAgICAgICBwaW8ucgorICogCisgKiAgIGJ5IC4uLy4uLy4uL3Rvb2xzL3JkZXNjL2Jpbi9yZGVzMmMgLW91dGZpbGUgcGlvX2RlZnMuaCBwaW8ucgorICogQW55IGNoYW5nZXMgaGVyZSB3aWxsIGJlIGxvc3QuCisgKgorICogLSotIGJ1ZmZlci1yZWFkLW9ubHk6IHQgLSotCisgKi8KKy8qIE1haW4gYWNjZXNzIG1hY3JvcyAqLworI2lmbmRlZiBSRUdfUkQKKyNkZWZpbmUgUkVHX1JEKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUgorI2RlZmluZSBSRUdfV1IoIHNjb3BlLCBpbnN0LCByZWcsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfVkVDVAorI2RlZmluZSBSRUdfUkRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgIFJFR19SRUFEKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9WRUNUCisjZGVmaW5lIFJFR19XUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgICAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX0lOVAorI2RlZmluZSBSRUdfUkRfSU5UKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSX0lOVAorI2RlZmluZSBSRUdfV1JfSU5UKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlRfVkVDVAorI2RlZmluZSBSRUdfUkRfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlRfVkVDVAorI2RlZmluZSBSRUdfV1JfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4LCB2YWwgKSBcCisgIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1RZUEVfQ09OVgorI2RlZmluZSBSRUdfVFlQRV9DT05WKCB0eXBlLCBvcmd0eXBlLCB2YWwgKSBcCisgICggeyB1bmlvbiB7IG9yZ3R5cGUgbzsgdHlwZSBuOyB9IHI7IHIubyA9IHZhbDsgci5uOyB9ICkKKyNlbmRpZgorCisjaWZuZGVmIHJlZ19wYWdlX3NpemUKKyNkZWZpbmUgcmVnX3BhZ2Vfc2l6ZSA4MTkyCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUgorI2RlZmluZSBSRUdfQUREUiggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFJfVkVDVAorI2RlZmluZSBSRUdfQUREUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKy8qIEMtY29kZSBmb3IgcmVnaXN0ZXIgc2NvcGUgcGlvICovCisKKy8qIFJlZ2lzdGVyIHJ3X2RhdGEsIHNjb3BlIHBpbywgdHlwZSBydyAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVnX3Bpb19yd19kYXRhOworI2RlZmluZSBSRUdfUkRfQUREUl9waW9fcndfZGF0YSA2NAorI2RlZmluZSBSRUdfV1JfQUREUl9waW9fcndfZGF0YSA2NAorCisvKiBSZWdpc3RlciByd19pb19hY2Nlc3MwLCBzY29wZSBwaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRhdGEgOiA4OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjQ7Cit9IHJlZ19waW9fcndfaW9fYWNjZXNzMDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfcGlvX3J3X2lvX2FjY2VzczAgMAorI2RlZmluZSBSRUdfV1JfQUREUl9waW9fcndfaW9fYWNjZXNzMCAwCisKKy8qIFJlZ2lzdGVyIHJ3X2lvX2FjY2VzczEsIHNjb3BlIHBpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZGF0YSA6IDg7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyNDsKK30gcmVnX3Bpb19yd19pb19hY2Nlc3MxOworI2RlZmluZSBSRUdfUkRfQUREUl9waW9fcndfaW9fYWNjZXNzMSA0CisjZGVmaW5lIFJFR19XUl9BRERSX3Bpb19yd19pb19hY2Nlc3MxIDQKKworLyogUmVnaXN0ZXIgcndfaW9fYWNjZXNzMiwgc2NvcGUgcGlvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkYXRhIDogODsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI0OworfSByZWdfcGlvX3J3X2lvX2FjY2VzczI7CisjZGVmaW5lIFJFR19SRF9BRERSX3Bpb19yd19pb19hY2Nlc3MyIDgKKyNkZWZpbmUgUkVHX1dSX0FERFJfcGlvX3J3X2lvX2FjY2VzczIgOAorCisvKiBSZWdpc3RlciByd19pb19hY2Nlc3MzLCBzY29wZSBwaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRhdGEgOiA4OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjQ7Cit9IHJlZ19waW9fcndfaW9fYWNjZXNzMzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfcGlvX3J3X2lvX2FjY2VzczMgMTIKKyNkZWZpbmUgUkVHX1dSX0FERFJfcGlvX3J3X2lvX2FjY2VzczMgMTIKKworLyogUmVnaXN0ZXIgcndfaW9fYWNjZXNzNCwgc2NvcGUgcGlvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkYXRhIDogODsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI0OworfSByZWdfcGlvX3J3X2lvX2FjY2VzczQ7CisjZGVmaW5lIFJFR19SRF9BRERSX3Bpb19yd19pb19hY2Nlc3M0IDE2CisjZGVmaW5lIFJFR19XUl9BRERSX3Bpb19yd19pb19hY2Nlc3M0IDE2CisKKy8qIFJlZ2lzdGVyIHJ3X2lvX2FjY2VzczUsIHNjb3BlIHBpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZGF0YSA6IDg7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyNDsKK30gcmVnX3Bpb19yd19pb19hY2Nlc3M1OworI2RlZmluZSBSRUdfUkRfQUREUl9waW9fcndfaW9fYWNjZXNzNSAyMAorI2RlZmluZSBSRUdfV1JfQUREUl9waW9fcndfaW9fYWNjZXNzNSAyMAorCisvKiBSZWdpc3RlciByd19pb19hY2Nlc3M2LCBzY29wZSBwaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRhdGEgOiA4OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjQ7Cit9IHJlZ19waW9fcndfaW9fYWNjZXNzNjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfcGlvX3J3X2lvX2FjY2VzczYgMjQKKyNkZWZpbmUgUkVHX1dSX0FERFJfcGlvX3J3X2lvX2FjY2VzczYgMjQKKworLyogUmVnaXN0ZXIgcndfaW9fYWNjZXNzNywgc2NvcGUgcGlvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkYXRhIDogODsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI0OworfSByZWdfcGlvX3J3X2lvX2FjY2Vzczc7CisjZGVmaW5lIFJFR19SRF9BRERSX3Bpb19yd19pb19hY2Nlc3M3IDI4CisjZGVmaW5lIFJFR19XUl9BRERSX3Bpb19yd19pb19hY2Nlc3M3IDI4CisKKy8qIFJlZ2lzdGVyIHJ3X2lvX2FjY2VzczgsIHNjb3BlIHBpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZGF0YSA6IDg7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyNDsKK30gcmVnX3Bpb19yd19pb19hY2Nlc3M4OworI2RlZmluZSBSRUdfUkRfQUREUl9waW9fcndfaW9fYWNjZXNzOCAzMgorI2RlZmluZSBSRUdfV1JfQUREUl9waW9fcndfaW9fYWNjZXNzOCAzMgorCisvKiBSZWdpc3RlciByd19pb19hY2Nlc3M5LCBzY29wZSBwaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRhdGEgOiA4OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjQ7Cit9IHJlZ19waW9fcndfaW9fYWNjZXNzOTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfcGlvX3J3X2lvX2FjY2VzczkgMzYKKyNkZWZpbmUgUkVHX1dSX0FERFJfcGlvX3J3X2lvX2FjY2VzczkgMzYKKworLyogUmVnaXN0ZXIgcndfaW9fYWNjZXNzMTAsIHNjb3BlIHBpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZGF0YSA6IDg7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyNDsKK30gcmVnX3Bpb19yd19pb19hY2Nlc3MxMDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfcGlvX3J3X2lvX2FjY2VzczEwIDQwCisjZGVmaW5lIFJFR19XUl9BRERSX3Bpb19yd19pb19hY2Nlc3MxMCA0MAorCisvKiBSZWdpc3RlciByd19pb19hY2Nlc3MxMSwgc2NvcGUgcGlvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkYXRhIDogODsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI0OworfSByZWdfcGlvX3J3X2lvX2FjY2VzczExOworI2RlZmluZSBSRUdfUkRfQUREUl9waW9fcndfaW9fYWNjZXNzMTEgNDQKKyNkZWZpbmUgUkVHX1dSX0FERFJfcGlvX3J3X2lvX2FjY2VzczExIDQ0CisKKy8qIFJlZ2lzdGVyIHJ3X2lvX2FjY2VzczEyLCBzY29wZSBwaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRhdGEgOiA4OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjQ7Cit9IHJlZ19waW9fcndfaW9fYWNjZXNzMTI7CisjZGVmaW5lIFJFR19SRF9BRERSX3Bpb19yd19pb19hY2Nlc3MxMiA0OAorI2RlZmluZSBSRUdfV1JfQUREUl9waW9fcndfaW9fYWNjZXNzMTIgNDgKKworLyogUmVnaXN0ZXIgcndfaW9fYWNjZXNzMTMsIHNjb3BlIHBpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZGF0YSA6IDg7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyNDsKK30gcmVnX3Bpb19yd19pb19hY2Nlc3MxMzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfcGlvX3J3X2lvX2FjY2VzczEzIDUyCisjZGVmaW5lIFJFR19XUl9BRERSX3Bpb19yd19pb19hY2Nlc3MxMyA1MgorCisvKiBSZWdpc3RlciByd19pb19hY2Nlc3MxNCwgc2NvcGUgcGlvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkYXRhIDogODsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI0OworfSByZWdfcGlvX3J3X2lvX2FjY2VzczE0OworI2RlZmluZSBSRUdfUkRfQUREUl9waW9fcndfaW9fYWNjZXNzMTQgNTYKKyNkZWZpbmUgUkVHX1dSX0FERFJfcGlvX3J3X2lvX2FjY2VzczE0IDU2CisKKy8qIFJlZ2lzdGVyIHJ3X2lvX2FjY2VzczE1LCBzY29wZSBwaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRhdGEgOiA4OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjQ7Cit9IHJlZ19waW9fcndfaW9fYWNjZXNzMTU7CisjZGVmaW5lIFJFR19SRF9BRERSX3Bpb19yd19pb19hY2Nlc3MxNSA2MAorI2RlZmluZSBSRUdfV1JfQUREUl9waW9fcndfaW9fYWNjZXNzMTUgNjAKKworLyogUmVnaXN0ZXIgcndfY2UwX2NmZywgc2NvcGUgcGlvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBsdyAgIDogNjsKKyAgdW5zaWduZWQgaW50IGV3ICAgOiAzOworICB1bnNpZ25lZCBpbnQgencgICA6IDM7CisgIHVuc2lnbmVkIGludCBhdyAgIDogMjsKKyAgdW5zaWduZWQgaW50IG1vZGUgOiAyOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTY7Cit9IHJlZ19waW9fcndfY2UwX2NmZzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfcGlvX3J3X2NlMF9jZmcgNjgKKyNkZWZpbmUgUkVHX1dSX0FERFJfcGlvX3J3X2NlMF9jZmcgNjgKKworLyogUmVnaXN0ZXIgcndfY2UxX2NmZywgc2NvcGUgcGlvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBsdyAgIDogNjsKKyAgdW5zaWduZWQgaW50IGV3ICAgOiAzOworICB1bnNpZ25lZCBpbnQgencgICA6IDM7CisgIHVuc2lnbmVkIGludCBhdyAgIDogMjsKKyAgdW5zaWduZWQgaW50IG1vZGUgOiAyOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTY7Cit9IHJlZ19waW9fcndfY2UxX2NmZzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfcGlvX3J3X2NlMV9jZmcgNzIKKyNkZWZpbmUgUkVHX1dSX0FERFJfcGlvX3J3X2NlMV9jZmcgNzIKKworLyogUmVnaXN0ZXIgcndfY2UyX2NmZywgc2NvcGUgcGlvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBsdyAgIDogNjsKKyAgdW5zaWduZWQgaW50IGV3ICAgOiAzOworICB1bnNpZ25lZCBpbnQgencgICA6IDM7CisgIHVuc2lnbmVkIGludCBhdyAgIDogMjsKKyAgdW5zaWduZWQgaW50IG1vZGUgOiAyOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTY7Cit9IHJlZ19waW9fcndfY2UyX2NmZzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfcGlvX3J3X2NlMl9jZmcgNzYKKyNkZWZpbmUgUkVHX1dSX0FERFJfcGlvX3J3X2NlMl9jZmcgNzYKKworLyogUmVnaXN0ZXIgcndfZG91dCwgc2NvcGUgcGlvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkYXRhICA6IDg7CisgIHVuc2lnbmVkIGludCByZF9uICA6IDE7CisgIHVuc2lnbmVkIGludCB3cl9uICA6IDE7CisgIHVuc2lnbmVkIGludCBhMCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBhMSAgICA6IDE7CisgIHVuc2lnbmVkIGludCBjZTBfbiA6IDE7CisgIHVuc2lnbmVkIGludCBjZTFfbiA6IDE7CisgIHVuc2lnbmVkIGludCBjZTJfbiA6IDE7CisgIHVuc2lnbmVkIGludCByZHkgICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxNjsKK30gcmVnX3Bpb19yd19kb3V0OworI2RlZmluZSBSRUdfUkRfQUREUl9waW9fcndfZG91dCA4MAorI2RlZmluZSBSRUdfV1JfQUREUl9waW9fcndfZG91dCA4MAorCisvKiBSZWdpc3RlciByd19vZSwgc2NvcGUgcGlvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkYXRhICA6IDg7CisgIHVuc2lnbmVkIGludCByZF9uICA6IDE7CisgIHVuc2lnbmVkIGludCB3cl9uICA6IDE7CisgIHVuc2lnbmVkIGludCBhMCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBhMSAgICA6IDE7CisgIHVuc2lnbmVkIGludCBjZTBfbiA6IDE7CisgIHVuc2lnbmVkIGludCBjZTFfbiA6IDE7CisgIHVuc2lnbmVkIGludCBjZTJfbiA6IDE7CisgIHVuc2lnbmVkIGludCByZHkgICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxNjsKK30gcmVnX3Bpb19yd19vZTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfcGlvX3J3X29lIDg0CisjZGVmaW5lIFJFR19XUl9BRERSX3Bpb19yd19vZSA4NAorCisvKiBSZWdpc3RlciByd19tYW5fY3RybCwgc2NvcGUgcGlvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkYXRhICA6IDg7CisgIHVuc2lnbmVkIGludCByZF9uICA6IDE7CisgIHVuc2lnbmVkIGludCB3cl9uICA6IDE7CisgIHVuc2lnbmVkIGludCBhMCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBhMSAgICA6IDE7CisgIHVuc2lnbmVkIGludCBjZTBfbiA6IDE7CisgIHVuc2lnbmVkIGludCBjZTFfbiA6IDE7CisgIHVuc2lnbmVkIGludCBjZTJfbiA6IDE7CisgIHVuc2lnbmVkIGludCByZHkgICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxNjsKK30gcmVnX3Bpb19yd19tYW5fY3RybDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfcGlvX3J3X21hbl9jdHJsIDg4CisjZGVmaW5lIFJFR19XUl9BRERSX3Bpb19yd19tYW5fY3RybCA4OAorCisvKiBSZWdpc3RlciByX2Rpbiwgc2NvcGUgcGlvLCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRhdGEgIDogODsKKyAgdW5zaWduZWQgaW50IHJkX24gIDogMTsKKyAgdW5zaWduZWQgaW50IHdyX24gIDogMTsKKyAgdW5zaWduZWQgaW50IGEwICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGExICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGNlMF9uIDogMTsKKyAgdW5zaWduZWQgaW50IGNlMV9uIDogMTsKKyAgdW5zaWduZWQgaW50IGNlMl9uIDogMTsKKyAgdW5zaWduZWQgaW50IHJkeSAgIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDE2OworfSByZWdfcGlvX3JfZGluOworI2RlZmluZSBSRUdfUkRfQUREUl9waW9fcl9kaW4gOTIKKworLyogUmVnaXN0ZXIgcl9zdGF0LCBzY29wZSBwaW8sIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgYnVzeSA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAzMTsKK30gcmVnX3Bpb19yX3N0YXQ7CisjZGVmaW5lIFJFR19SRF9BRERSX3Bpb19yX3N0YXQgOTYKKworLyogUmVnaXN0ZXIgcndfaW50cl9tYXNrLCBzY29wZSBwaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHJkeSA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAzMTsKK30gcmVnX3Bpb19yd19pbnRyX21hc2s7CisjZGVmaW5lIFJFR19SRF9BRERSX3Bpb19yd19pbnRyX21hc2sgMTAwCisjZGVmaW5lIFJFR19XUl9BRERSX3Bpb19yd19pbnRyX21hc2sgMTAwCisKKy8qIFJlZ2lzdGVyIHJ3X2Fja19pbnRyLCBzY29wZSBwaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHJkeSA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAzMTsKK30gcmVnX3Bpb19yd19hY2tfaW50cjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfcGlvX3J3X2Fja19pbnRyIDEwNAorI2RlZmluZSBSRUdfV1JfQUREUl9waW9fcndfYWNrX2ludHIgMTA0CisKKy8qIFJlZ2lzdGVyIHJfaW50ciwgc2NvcGUgcGlvLCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHJkeSA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAzMTsKK30gcmVnX3Bpb19yX2ludHI7CisjZGVmaW5lIFJFR19SRF9BRERSX3Bpb19yX2ludHIgMTA4CisKKy8qIFJlZ2lzdGVyIHJfbWFza2VkX2ludHIsIHNjb3BlIHBpbywgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCByZHkgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMzE7Cit9IHJlZ19waW9fcl9tYXNrZWRfaW50cjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfcGlvX3JfbWFza2VkX2ludHIgMTEyCisKKworLyogQ29uc3RhbnRzICovCitlbnVtIHsKKyAgcmVna19waW9fYTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfcGlvX25vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX3Bpb19ub3JtYWwgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19waW9fcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfcGlvX3J3X2NlMF9jZmdfZGVmYXVsdCAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX3Bpb19yd19jZTFfY2ZnX2RlZmF1bHQgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19waW9fcndfY2UyX2NmZ19kZWZhdWx0ICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfcGlvX3J3X2ludHJfbWFza19kZWZhdWx0ICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX3Bpb19yd19tYW5fY3RybF9kZWZhdWx0ICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19waW9fcndfb2VfZGVmYXVsdCAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfcGlvX3dyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX3Bpb193cl9jZTIgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMywKKyAgcmVna19waW9feWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfcGlvX3llc19hbGwgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMGZmCit9OworI2VuZGlmIC8qIF9fcGlvX2RlZnNfaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9yZWdfbWFwLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvaHdyZWdzL3JlZ19tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmU1OWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9yZWdfbWFwLmgKQEAgLTAsMCArMSwxMDMgQEAKKyNpZm5kZWYgX19yZWdfbWFwX2gKKyNkZWZpbmUgX19yZWdfbWFwX2gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGZyb20KKyAqICAgZmlsZTogICAgICAgICAgICByZWcucm1hcAorICogCisgKiAgIGJ5IC4uLy4uLy4uL3Rvb2xzL3JkZXNjL2Jpbi9yZGVzMmMgLWJhc2UgMHhiMDAwMDAwMCAtbWFwIG1hcmJfYmFyLnIgbWFyYl9mb28uciBjY2RfdG9wLnIgY2NkX3N0YXQuciBjY2RfdGcuciBjY2RfZHAuciBjY2QuciBpb3Bfc2FwX2luLnIgaW9wX3NhcF9vdXQuciBpb3Bfc3dfY2ZnLnIgaW9wX3N3X2NwdS5yIGlvcF9zd19tcHUuciBpb3Bfc3dfc3B1LnIgaW9wX3ZlcnNpb24uciBpb3BfY3JjX3Bhci5yIGlvcF9kbWNfaW4uciBpb3BfZG1jX291dC5yIGlvcF9maWZvX2luX2V4dHJhLnIgaW9wX2ZpZm9faW4uciBpb3BfZmlmb19vdXRfZXh0cmEuciBpb3BfZmlmb19vdXQuciBpb3BfbWMuciBpb3BfbXB1LnIgaW9wX3NjcmNfaW4uciBpb3Bfc2NyY19vdXQuciBpb3Bfc3B1LnIgaW9wX3RpbWVyX2dycC5yIGlvcF90cmlnZ2VyX2dycC5yIGlvcC5yIC1vdXRmaWxlIHJlZ19tYXAuaCByZWcucm1hcAorICogQW55IGNoYW5nZXMgaGVyZSB3aWxsIGJlIGxvc3QuCisgKgorICogLSotIGJ1ZmZlci1yZWFkLW9ubHk6IHQgLSotCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIHJlZ2lfY2NkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDAwMDAwLAorICByZWdpX2NjZF90b3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAwMDAwMCwKKyAgcmVnaV9jY2RfZHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMDA0MDAsCisgIHJlZ2lfY2NkX3N0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDAwODAwLAorICByZWdpX2NjZF90ZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAwMTAwMCwKKyAgcmVnaV9jZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMDIwMDAsCisgIHJlZ2lfY2xrZ2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDA0MDAwLAorICByZWdpX2RkcjJfY3RybCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAwNjAwMCwKKyAgcmVnaV9kbWEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMDgwMDAsCisgIHJlZ2lfZG1hMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDBhMDAwLAorICByZWdpX2RtYTExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAwYzAwMCwKKyAgcmVnaV9kbWEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMGUwMDAsCisgIHJlZ2lfZG1hMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDEwMDAwLAorICByZWdpX2RtYTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAxMjAwMCwKKyAgcmVnaV9kbWE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMTQwMDAsCisgIHJlZ2lfZG1hNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDE2MDAwLAorICByZWdpX2RtYTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAxODAwMCwKKyAgcmVnaV9kbWE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMWEwMDAsCisgIHJlZ2lfZXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDFjMDAwLAorICByZWdpX2dpbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMDAwMCwKKyAgcmVnaV9oMjY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjIwMDAsCisgIHJlZ2lfaGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDI2MDAwLAorICByZWdpX2lvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyODAwMCwKKyAgcmVnaV9pb3BfdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjgwMDAsCisgIHJlZ2lfaW9wX2ZpZm9faW5fZXh0cmEgICAgICAgICAgICAgICAgICAgPSAweGIwMDI4MDQwLAorICByZWdpX2lvcF9maWZvX291dF9leHRyYSAgICAgICAgICAgICAgICAgID0gMHhiMDAyODA4MCwKKyAgcmVnaV9pb3BfdHJpZ2dlcl9ncnAwICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjgwYzAsCisgIHJlZ2lfaW9wX3RyaWdnZXJfZ3JwMSAgICAgICAgICAgICAgICAgICAgPSAweGIwMDI4MTAwLAorICByZWdpX2lvcF90cmlnZ2VyX2dycDIgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyODE0MCwKKyAgcmVnaV9pb3BfdHJpZ2dlcl9ncnAzICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjgxODAsCisgIHJlZ2lfaW9wX3RyaWdnZXJfZ3JwNCAgICAgICAgICAgICAgICAgICAgPSAweGIwMDI4MWMwLAorICByZWdpX2lvcF90cmlnZ2VyX2dycDUgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyODIwMCwKKyAgcmVnaV9pb3BfdHJpZ2dlcl9ncnA2ICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjgyNDAsCisgIHJlZ2lfaW9wX3RyaWdnZXJfZ3JwNyAgICAgICAgICAgICAgICAgICAgPSAweGIwMDI4MjgwLAorICByZWdpX2lvcF9jcmNfcGFyICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyODMwMCwKKyAgcmVnaV9pb3BfZG1jX2luICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjgzODAsCisgIHJlZ2lfaW9wX2RtY19vdXQgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDI4NDAwLAorICByZWdpX2lvcF9maWZvX2luICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyODQ4MCwKKyAgcmVnaV9pb3BfZmlmb19vdXQgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjg1MDAsCisgIHJlZ2lfaW9wX3NjcmNfaW4gICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDI4NTgwLAorICByZWdpX2lvcF9zY3JjX291dCAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyODYwMCwKKyAgcmVnaV9pb3BfdGltZXJfZ3JwMCAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjg2ODAsCisgIHJlZ2lfaW9wX3RpbWVyX2dycDEgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDI4NzAwLAorICByZWdpX2lvcF9zYXBfaW4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyODgwMCwKKyAgcmVnaV9pb3Bfc2FwX291dCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjg5MDAsCisgIHJlZ2lfaW9wX3NwdSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDI4YTAwLAorICByZWdpX2lvcF9zd19jZmcgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyOGIwMCwKKyAgcmVnaV9pb3Bfc3dfY3B1ICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjhjMDAsCisgIHJlZ2lfaW9wX3N3X21wdSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDI4ZDAwLAorICByZWdpX2lvcF9zd19zcHUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyOGUwMCwKKyAgcmVnaV9pb3BfbXB1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjkwMDAsCisgIHJlZ2lfaXJxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDJhMDAwLAorICByZWdpX2lycTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDA2YTAwMCwKKyAgcmVnaV9qcGVnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMmMwMDAsCisgIHJlZ2lfbDJjYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDMwMDAwLAorICByZWdpX21hcmJfYmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAzMjAwMCwKKyAgcmVnaV9tYXJiX2Jhcl9icDAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMzIxNDAsCisgIHJlZ2lfbWFyYl9iYXJfYnAxICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDMyMTgwLAorICByZWdpX21hcmJfYmFyX2JwMiAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAzMjFjMCwKKyAgcmVnaV9tYXJiX2Jhcl9icDMgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMzIyMDAsCisgIHJlZ2lfbWFyYl9mb28gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDM0MDAwLAorICByZWdpX21hcmJfZm9vX2JwMCAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAzNDI4MCwKKyAgcmVnaV9tYXJiX2Zvb19icDEgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMzQyYzAsCisgIHJlZ2lfbWFyYl9mb29fYnAyICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDM0MzAwLAorICByZWdpX21hcmJfZm9vX2JwMyAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAzNDM0MCwKKyAgcmVnaV9waW5tdXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMzgwMDAsCisgIHJlZ2lfcGlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDM2MDAwLAorICByZWdpX3NjbHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAzYTAwMCwKKyAgcmVnaV9zY2xyX2ZpZm8gICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwM2MwMDAsCisgIHJlZ2lfc2VyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDNlMDAwLAorICByZWdpX3NlcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDA0MDAwMCwKKyAgcmVnaV9zZXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwNDIwMDAsCisgIHJlZ2lfc2VyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDQ0MDAwLAorICByZWdpX3NlcjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDA0NjAwMCwKKyAgcmVnaV9zc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwNDgwMDAsCisgIHJlZ2lfc3RyY29wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDRhMDAwLAorICByZWdpX3N0cmRtYTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDA0ZTAwMCwKKyAgcmVnaV9zdHJkbWExICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwNTAwMDAsCisgIHJlZ2lfc3RyZG1hMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDUyMDAwLAorICByZWdpX3N0cmRtYTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDA1NDAwMCwKKyAgcmVnaV9zdHJkbWE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwNTYwMDAsCisgIHJlZ2lfc3RybXV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDRjMDAwLAorICByZWdpX3RpbWVyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDA1ODAwMCwKKyAgcmVnaV90aW1lcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwNWEwMDAsCisgIHJlZ2lfdGltZXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDZlMDAwLAorICByZWdpX3RyYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDA1YzAwMCwKKyAgcmVnaV92aW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwNWUwMDAsCisgIHJlZ2lfdm91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDYwMDAwCit9IHJlZ19zY29wZV9pbnN0YW5jZXM7CisjZW5kaWYgLyogX19yZWdfbWFwX2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3Mvc3RybXV4X2RlZnMuaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3Mvc3RybXV4X2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGY3MThhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy9zdHJtdXhfZGVmcy5oCkBAIC0wLDAgKzEsMTIwIEBACisjaWZuZGVmIF9fc3RybXV4X2RlZnNfaAorI2RlZmluZSBfX3N0cm11eF9kZWZzX2gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGZyb20KKyAqICAgZmlsZTogICAgICAgICAgIHN0cm11eC5yCisgKiAKKyAqICAgYnkgLi4vLi4vLi4vdG9vbHMvcmRlc2MvYmluL3JkZXMyYyAtb3V0ZmlsZSBzdHJtdXhfZGVmcy5oIHN0cm11eC5yCisgKiBBbnkgY2hhbmdlcyBoZXJlIHdpbGwgYmUgbG9zdC4KKyAqCisgKiAtKi0gYnVmZmVyLXJlYWQtb25seTogdCAtKi0KKyAqLworLyogTWFpbiBhY2Nlc3MgbWFjcm9zICovCisjaWZuZGVmIFJFR19SRAorI2RlZmluZSBSRUdfUkQoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgIFJFR19SRUFEKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSCisjZGVmaW5lIFJFR19XUiggc2NvcGUsIGluc3QsIHJlZywgdmFsICkgXAorICBSRUdfV1JJVEUoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgICAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9WRUNUCisjZGVmaW5lIFJFR19SRF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgUkVHX1JFQUQoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKwkgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSX1ZFQ1QKKyNkZWZpbmUgUkVHX1dSX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4LCB2YWwgKSBcCisgIFJFR19XUklURSggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKwkgICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfSU5UCisjZGVmaW5lIFJFR19SRF9JTlQoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgIFJFR19SRUFEKCBpbnQsIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfSU5UCisjZGVmaW5lIFJFR19XUl9JTlQoIHNjb3BlLCBpbnN0LCByZWcsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCBpbnQsIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX0lOVF9WRUNUCisjZGVmaW5lIFJFR19SRF9JTlRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgIFJFR19SRUFEKCBpbnQsIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKwkgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSX0lOVF9WRUNUCisjZGVmaW5lIFJFR19XUl9JTlRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXgsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCBpbnQsIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKwkgICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfVFlQRV9DT05WCisjZGVmaW5lIFJFR19UWVBFX0NPTlYoIHR5cGUsIG9yZ3R5cGUsIHZhbCApIFwKKyAgKCB7IHVuaW9uIHsgb3JndHlwZSBvOyB0eXBlIG47IH0gcjsgci5vID0gdmFsOyByLm47IH0gKQorI2VuZGlmCisKKyNpZm5kZWYgcmVnX3BhZ2Vfc2l6ZQorI2RlZmluZSByZWdfcGFnZV9zaXplIDgxOTIKKyNlbmRpZgorCisjaWZuZGVmIFJFR19BRERSCisjZGVmaW5lIFJFR19BRERSKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICAoIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUl9WRUNUCisjZGVmaW5lIFJFR19BRERSX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICAoIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKyAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworLyogQy1jb2RlIGZvciByZWdpc3RlciBzY29wZSBzdHJtdXggKi8KKworLyogUmVnaXN0ZXIgcndfY2ZnLCBzY29wZSBzdHJtdXgsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRtYTAgIDogMjsKKyAgdW5zaWduZWQgaW50IGRtYTEgIDogMjsKKyAgdW5zaWduZWQgaW50IGRtYTIgIDogMjsKKyAgdW5zaWduZWQgaW50IGRtYTMgIDogMjsKKyAgdW5zaWduZWQgaW50IGRtYTQgIDogMjsKKyAgdW5zaWduZWQgaW50IGRtYTUgIDogMjsKKyAgdW5zaWduZWQgaW50IGRtYTYgIDogMjsKKyAgdW5zaWduZWQgaW50IGRtYTcgIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI7CisgIHVuc2lnbmVkIGludCBkbWE5ICA6IDI7CisgIHVuc2lnbmVkIGludCBkdW1teTIgOiAyOworICB1bnNpZ25lZCBpbnQgZG1hMTEgOiAyOworICB1bnNpZ25lZCBpbnQgZHVtbXkzIDogODsKK30gcmVnX3N0cm11eF9yd19jZmc7CisjZGVmaW5lIFJFR19SRF9BRERSX3N0cm11eF9yd19jZmcgMAorI2RlZmluZSBSRUdfV1JfQUREUl9zdHJtdXhfcndfY2ZnIDAKKworCisvKiBDb25zdGFudHMgKi8KK2VudW0geworICByZWdrX3N0cm11eF9ldGggICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19zdHJtdXhfaDI2NCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfc3RybXV4X2lvcCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX3N0cm11eF9qcGVnICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19zdHJtdXhfb2ZmICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfc3RybXV4X3J3X2NmZ19kZWZhdWx0ICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX3N0cm11eF9zZXIwICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19zdHJtdXhfc2VyMSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIsCisgIHJlZ2tfc3RybXV4X3NlcjIgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX3N0cm11eF9zZXIzICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19zdHJtdXhfc2VyNCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIsCisgIHJlZ2tfc3RybXV4X3NzZXIgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX3N0cm11eF9zdHJjb3AgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMQorfTsKKyNlbmRpZiAvKiBfX3N0cm11eF9kZWZzX2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvdGltZXJfZGVmcy5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL2h3cmVncy90aW1lcl9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMzM2UwOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9od3JlZ3MvdGltZXJfZGVmcy5oCkBAIC0wLDAgKzEsMjY1IEBACisjaWZuZGVmIF9fdGltZXJfZGVmc19oCisjZGVmaW5lIF9fdGltZXJfZGVmc19oCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCisgKiAgIGZpbGU6ICAgICAgICAgICB0aW1lci5yCisgKiAKKyAqICAgYnkgLi4vLi4vLi4vdG9vbHMvcmRlc2MvYmluL3JkZXMyYyAtb3V0ZmlsZSB0aW1lcl9kZWZzLmggdGltZXIucgorICogQW55IGNoYW5nZXMgaGVyZSB3aWxsIGJlIGxvc3QuCisgKgorICogLSotIGJ1ZmZlci1yZWFkLW9ubHk6IHQgLSotCisgKi8KKy8qIE1haW4gYWNjZXNzIG1hY3JvcyAqLworI2lmbmRlZiBSRUdfUkQKKyNkZWZpbmUgUkVHX1JEKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUgorI2RlZmluZSBSRUdfV1IoIHNjb3BlLCBpbnN0LCByZWcsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfVkVDVAorI2RlZmluZSBSRUdfUkRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgIFJFR19SRUFEKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9WRUNUCisjZGVmaW5lIFJFR19XUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgICAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX0lOVAorI2RlZmluZSBSRUdfUkRfSU5UKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSX0lOVAorI2RlZmluZSBSRUdfV1JfSU5UKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlRfVkVDVAorI2RlZmluZSBSRUdfUkRfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlRfVkVDVAorI2RlZmluZSBSRUdfV1JfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4LCB2YWwgKSBcCisgIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1RZUEVfQ09OVgorI2RlZmluZSBSRUdfVFlQRV9DT05WKCB0eXBlLCBvcmd0eXBlLCB2YWwgKSBcCisgICggeyB1bmlvbiB7IG9yZ3R5cGUgbzsgdHlwZSBuOyB9IHI7IHIubyA9IHZhbDsgci5uOyB9ICkKKyNlbmRpZgorCisjaWZuZGVmIHJlZ19wYWdlX3NpemUKKyNkZWZpbmUgcmVnX3BhZ2Vfc2l6ZSA4MTkyCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUgorI2RlZmluZSBSRUdfQUREUiggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFJfVkVDVAorI2RlZmluZSBSRUdfQUREUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKy8qIEMtY29kZSBmb3IgcmVnaXN0ZXIgc2NvcGUgdGltZXIgKi8KKworLyogUmVnaXN0ZXIgcndfdG1yMF9kaXYsIHNjb3BlIHRpbWVyLCB0eXBlIHJ3ICovCit0eXBlZGVmIHVuc2lnbmVkIGludCByZWdfdGltZXJfcndfdG1yMF9kaXY7CisjZGVmaW5lIFJFR19SRF9BRERSX3RpbWVyX3J3X3RtcjBfZGl2IDAKKyNkZWZpbmUgUkVHX1dSX0FERFJfdGltZXJfcndfdG1yMF9kaXYgMAorCisvKiBSZWdpc3RlciByX3RtcjBfZGF0YSwgc2NvcGUgdGltZXIsIHR5cGUgciAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVnX3RpbWVyX3JfdG1yMF9kYXRhOworI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yX3RtcjBfZGF0YSA0CisKKy8qIFJlZ2lzdGVyIHJ3X3RtcjBfY3RybCwgc2NvcGUgdGltZXIsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IG9wICAgOiAyOworICB1bnNpZ25lZCBpbnQgZnJlcSA6IDM7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyNzsKK30gcmVnX3RpbWVyX3J3X3RtcjBfY3RybDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfdGltZXJfcndfdG1yMF9jdHJsIDgKKyNkZWZpbmUgUkVHX1dSX0FERFJfdGltZXJfcndfdG1yMF9jdHJsIDgKKworLyogUmVnaXN0ZXIgcndfdG1yMV9kaXYsIHNjb3BlIHRpbWVyLCB0eXBlIHJ3ICovCit0eXBlZGVmIHVuc2lnbmVkIGludCByZWdfdGltZXJfcndfdG1yMV9kaXY7CisjZGVmaW5lIFJFR19SRF9BRERSX3RpbWVyX3J3X3RtcjFfZGl2IDE2CisjZGVmaW5lIFJFR19XUl9BRERSX3RpbWVyX3J3X3RtcjFfZGl2IDE2CisKKy8qIFJlZ2lzdGVyIHJfdG1yMV9kYXRhLCBzY29wZSB0aW1lciwgdHlwZSByICovCit0eXBlZGVmIHVuc2lnbmVkIGludCByZWdfdGltZXJfcl90bXIxX2RhdGE7CisjZGVmaW5lIFJFR19SRF9BRERSX3RpbWVyX3JfdG1yMV9kYXRhIDIwCisKKy8qIFJlZ2lzdGVyIHJ3X3RtcjFfY3RybCwgc2NvcGUgdGltZXIsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IG9wICAgOiAyOworICB1bnNpZ25lZCBpbnQgZnJlcSA6IDM7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyNzsKK30gcmVnX3RpbWVyX3J3X3RtcjFfY3RybDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfdGltZXJfcndfdG1yMV9jdHJsIDI0CisjZGVmaW5lIFJFR19XUl9BRERSX3RpbWVyX3J3X3RtcjFfY3RybCAyNAorCisvKiBSZWdpc3RlciByc19jbnRfZGF0YSwgc2NvcGUgdGltZXIsIHR5cGUgcnMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHRtciA6IDI0OworICB1bnNpZ25lZCBpbnQgY250IDogODsKK30gcmVnX3RpbWVyX3JzX2NudF9kYXRhOworI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yc19jbnRfZGF0YSAzMgorCisvKiBSZWdpc3RlciByX2NudF9kYXRhLCBzY29wZSB0aW1lciwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCB0bXIgOiAyNDsKKyAgdW5zaWduZWQgaW50IGNudCA6IDg7Cit9IHJlZ190aW1lcl9yX2NudF9kYXRhOworI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yX2NudF9kYXRhIDM2CisKKy8qIFJlZ2lzdGVyIHJ3X2NudF9jZmcsIHNjb3BlIHRpbWVyLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBjbGsgOiAyOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMzA7Cit9IHJlZ190aW1lcl9yd19jbnRfY2ZnOworI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yd19jbnRfY2ZnIDQwCisjZGVmaW5lIFJFR19XUl9BRERSX3RpbWVyX3J3X2NudF9jZmcgNDAKKworLyogUmVnaXN0ZXIgcndfdHJpZywgc2NvcGUgdGltZXIsIHR5cGUgcncgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IHJlZ190aW1lcl9yd190cmlnOworI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yd190cmlnIDQ4CisjZGVmaW5lIFJFR19XUl9BRERSX3RpbWVyX3J3X3RyaWcgNDgKKworLyogUmVnaXN0ZXIgcndfdHJpZ19jZmcsIHNjb3BlIHRpbWVyLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCB0bXIgOiAyOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMzA7Cit9IHJlZ190aW1lcl9yd190cmlnX2NmZzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfdGltZXJfcndfdHJpZ19jZmcgNTIKKyNkZWZpbmUgUkVHX1dSX0FERFJfdGltZXJfcndfdHJpZ19jZmcgNTIKKworLyogUmVnaXN0ZXIgcl90aW1lLCBzY29wZSB0aW1lciwgdHlwZSByICovCit0eXBlZGVmIHVuc2lnbmVkIGludCByZWdfdGltZXJfcl90aW1lOworI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yX3RpbWUgNTYKKworLyogUmVnaXN0ZXIgcndfb3V0LCBzY29wZSB0aW1lciwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgdG1yIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDMwOworfSByZWdfdGltZXJfcndfb3V0OworI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yd19vdXQgNjAKKyNkZWZpbmUgUkVHX1dSX0FERFJfdGltZXJfcndfb3V0IDYwCisKKy8qIFJlZ2lzdGVyIHJ3X3dkX2N0cmwsIHNjb3BlIHRpbWVyLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBjbnQgOiA4OworICB1bnNpZ25lZCBpbnQgY21kIDogMTsKKyAgdW5zaWduZWQgaW50IGtleSA6IDc7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxNjsKK30gcmVnX3RpbWVyX3J3X3dkX2N0cmw7CisjZGVmaW5lIFJFR19SRF9BRERSX3RpbWVyX3J3X3dkX2N0cmwgNjQKKyNkZWZpbmUgUkVHX1dSX0FERFJfdGltZXJfcndfd2RfY3RybCA2NAorCisvKiBSZWdpc3RlciByX3dkX3N0YXQsIHNjb3BlIHRpbWVyLCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGNudCA6IDg7CisgIHVuc2lnbmVkIGludCBjbWQgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjM7Cit9IHJlZ190aW1lcl9yX3dkX3N0YXQ7CisjZGVmaW5lIFJFR19SRF9BRERSX3RpbWVyX3Jfd2Rfc3RhdCA2OAorCisvKiBSZWdpc3RlciByd19pbnRyX21hc2ssIHNjb3BlIHRpbWVyLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCB0bXIwIDogMTsKKyAgdW5zaWduZWQgaW50IHRtcjEgOiAxOworICB1bnNpZ25lZCBpbnQgY250ICA6IDE7CisgIHVuc2lnbmVkIGludCB0cmlnIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI4OworfSByZWdfdGltZXJfcndfaW50cl9tYXNrOworI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yd19pbnRyX21hc2sgNzIKKyNkZWZpbmUgUkVHX1dSX0FERFJfdGltZXJfcndfaW50cl9tYXNrIDcyCisKKy8qIFJlZ2lzdGVyIHJ3X2Fja19pbnRyLCBzY29wZSB0aW1lciwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgdG1yMCA6IDE7CisgIHVuc2lnbmVkIGludCB0bXIxIDogMTsKKyAgdW5zaWduZWQgaW50IGNudCAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZyA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyODsKK30gcmVnX3RpbWVyX3J3X2Fja19pbnRyOworI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yd19hY2tfaW50ciA3NgorI2RlZmluZSBSRUdfV1JfQUREUl90aW1lcl9yd19hY2tfaW50ciA3NgorCisvKiBSZWdpc3RlciByX2ludHIsIHNjb3BlIHRpbWVyLCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHRtcjAgOiAxOworICB1bnNpZ25lZCBpbnQgdG1yMSA6IDE7CisgIHVuc2lnbmVkIGludCBjbnQgIDogMTsKKyAgdW5zaWduZWQgaW50IHRyaWcgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjg7Cit9IHJlZ190aW1lcl9yX2ludHI7CisjZGVmaW5lIFJFR19SRF9BRERSX3RpbWVyX3JfaW50ciA4MAorCisvKiBSZWdpc3RlciByX21hc2tlZF9pbnRyLCBzY29wZSB0aW1lciwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCB0bXIwIDogMTsKKyAgdW5zaWduZWQgaW50IHRtcjEgOiAxOworICB1bnNpZ25lZCBpbnQgY250ICA6IDE7CisgIHVuc2lnbmVkIGludCB0cmlnIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI4OworfSByZWdfdGltZXJfcl9tYXNrZWRfaW50cjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfdGltZXJfcl9tYXNrZWRfaW50ciA4NAorCisvKiBSZWdpc3RlciByd190ZXN0LCBzY29wZSB0aW1lciwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZGlzIDogMTsKKyAgdW5zaWduZWQgaW50IGVuICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAzMDsKK30gcmVnX3RpbWVyX3J3X3Rlc3Q7CisjZGVmaW5lIFJFR19SRF9BRERSX3RpbWVyX3J3X3Rlc3QgODgKKyNkZWZpbmUgUkVHX1dSX0FERFJfdGltZXJfcndfdGVzdCA4OAorCisKKy8qIENvbnN0YW50cyAqLworZW51bSB7CisgIHJlZ2tfdGltZXJfZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX3RpbWVyX2YxMDAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNywKKyAgcmVna190aW1lcl9mMjlfNDkzICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDQsCisgIHJlZ2tfdGltZXJfZjMyICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA1LAorICByZWdrX3RpbWVyX2YzMl83NjggICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNiwKKyAgcmVna190aW1lcl9mOTAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfdGltZXJfaG9sZCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX3RpbWVyX2xkICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna190aW1lcl9ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfdGltZXJfb2ZmICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX3RpbWVyX3J1biAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna190aW1lcl9yd19jbnRfY2ZnX2RlZmF1bHQgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfdGltZXJfcndfaW50cl9tYXNrX2RlZmF1bHQgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX3RpbWVyX3J3X291dF9kZWZhdWx0ICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna190aW1lcl9yd190ZXN0X2RlZmF1bHQgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfdGltZXJfcndfdG1yMF9jdHJsX2RlZmF1bHQgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX3RpbWVyX3J3X3RtcjFfY3RybF9kZWZhdWx0ICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna190aW1lcl9yd190cmlnX2NmZ19kZWZhdWx0ICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfdGltZXJfc3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX3RpbWVyX3N0b3AgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna190aW1lcl90aW1lICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfdGltZXJfdG1yMCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX3RpbWVyX3RtcjEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMywKKyAgcmVna190aW1lcl92Y2xrICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIsCisgIHJlZ2tfdGltZXJfeWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxCit9OworI2VuZGlmIC8qIF9fdGltZXJfZGVmc19oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvbWVtbWFwLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtYTMvbWVtbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UxNWM5ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9tZW1tYXAuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9BU01fQVJDSF9NRU1NQVBfSAorI2RlZmluZSBfQVNNX0FSQ0hfTUVNTUFQX0gKKworI2RlZmluZSBNRU1fSU5UTUVNX1NUQVJUICgweDM4MDAwMDAwKQorI2RlZmluZSBNRU1fSU5UTUVNX1NJWkUgKDB4MDAwMTgwMDApCisjZGVmaW5lIE1FTV9EUkFNX1NUQVJUICgweDQwMDAwMDAwKQorCisjZGVmaW5lIE1FTV9OT05fQ0FDSEVBQkxFICgweDgwMDAwMDAwKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9waW5tdXguaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9waW5tdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjQyYTcyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL3Bpbm11eC5oCkBAIC0wLDAgKzEsNDUgQEAKKyNpZm5kZWYgX0FTTV9DUklTX0FSQ0hfUElOTVVYX0gKKyNkZWZpbmUgX0FTTV9DUklTX0FSQ0hfUElOTVVYX0gKKworI2RlZmluZSBQT1JUX0EgMAorI2RlZmluZSBQT1JUX0IgMQorI2RlZmluZSBQT1JUX0MgMgorCitlbnVtIHBpbl9tb2RlIHsKKwlwaW5tdXhfbm9uZSA9IDAsCisJcGlubXV4X2ZpeGVkLAorCXBpbm11eF9ncGlvLAorCXBpbm11eF9pb3AKK307CisKK2VudW0gZml4ZWRfZnVuY3Rpb24geworCXBpbm11eF9ldGgsCisJcGlubXV4X2dldGgsCisJcGlubXV4X3RnX2NjZCwKKwlwaW5tdXhfdGdfY21vcywKKwlwaW5tdXhfdm91dCwKKwlwaW5tdXhfc2VyMSwKKwlwaW5tdXhfc2VyMiwKKwlwaW5tdXhfc2VyMywKKwlwaW5tdXhfc2VyNCwKKwlwaW5tdXhfc3NlciwKKwlwaW5tdXhfcGlvLAorCXBpbm11eF9wd20wLAorCXBpbm11eF9wd20xLAorCXBpbm11eF9wd20yLAorCXBpbm11eF9pMmMwLAorCXBpbm11eF9pMmMxLAorCXBpbm11eF9pMmMxXzN3aXJlLAorCXBpbm11eF9pMmMxX3NkYTEsCisJcGlubXV4X2kyYzFfc2RhMiwKKwlwaW5tdXhfaTJjMV9zZGEzLAorfTsKKworaW50IGNyaXN2MzJfcGlubXV4X2luaXQodm9pZCk7CitpbnQgY3Jpc3YzMl9waW5tdXhfYWxsb2MoaW50IHBvcnQsIGludCBmaXJzdF9waW4sIGludCBsYXN0X3BpbiwgZW51bSBwaW5fbW9kZSk7CitpbnQgY3Jpc3YzMl9waW5tdXhfYWxsb2NfZml4ZWQoZW51bSBmaXhlZF9mdW5jdGlvbiBmdW5jdGlvbik7CitpbnQgY3Jpc3YzMl9waW5tdXhfZGVhbGxvYyhpbnQgcG9ydCwgaW50IGZpcnN0X3BpbiwgaW50IGxhc3RfcGluKTsKK2ludCBjcmlzdjMyX3Bpbm11eF9kZWFsbG9jX2ZpeGVkKGVudW0gZml4ZWRfZnVuY3Rpb24gZnVuY3Rpb24pOwordm9pZCBjcmlzdjMyX3Bpbm11eF9kdW1wKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9zdGFydHVwLmluYyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1hMy9zdGFydHVwLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjIzZTVlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWEzL3N0YXJ0dXAuaW5jCkBAIC0wLDAgKzEsNjAgQEAKKyNpbmNsdWRlIDxod3JlZ3MvYXNtL3JlZ19tYXBfYXNtLmg+CisjaW5jbHVkZSA8aHdyZWdzL2FzbS9naW9fZGVmc19hc20uaD4KKyNpbmNsdWRlIDxod3JlZ3MvYXNtL3Bpb19kZWZzX2FzbS5oPgorI2luY2x1ZGUgPGh3cmVncy9hc20vY2xrZ2VuX2RlZnNfYXNtLmg+CisjaW5jbHVkZSA8aHdyZWdzL2FzbS9waW5tdXhfZGVmc19hc20uaD4KKworCS5tYWNybyBHSU9fSU5JVAorCW1vdmUuZAlDT05GSUdfRVRSQVhfREVGX0dJT19QQV9PVVQsICRyMAorCW1vdmUuZAlSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByd19wYV9kb3V0KSwgJHIxCisJbW92ZS5kCSRyMCwgWyRyMV0KKworCW1vdmUuZAlDT05GSUdfRVRSQVhfREVGX0dJT19QQV9PRSwgJHIwCisJbW92ZS5kCVJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3BhX29lKSwgJHIxCisJbW92ZS5kCSRyMCwgWyRyMV0KKworCW1vdmUuZAlDT05GSUdfRVRSQVhfREVGX0dJT19QQl9PVVQsICRyMAorCW1vdmUuZAlSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByd19wYl9kb3V0KSwgJHIxCisJbW92ZS5kCSRyMCwgWyRyMV0KKworCW1vdmUuZAlDT05GSUdfRVRSQVhfREVGX0dJT19QQl9PRSwgJHIwCisJbW92ZS5kCVJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3BiX29lKSwgJHIxCisJbW92ZS5kCSRyMCwgWyRyMV0KKworCW1vdmUuZAlDT05GSUdfRVRSQVhfREVGX0dJT19QQ19PVVQsICRyMAorCW1vdmUuZAlSRUdfQUREUihnaW8sIHJlZ2lfZ2lvLCByd19wY19kb3V0KSwgJHIxCisJbW92ZS5kCSRyMCwgWyRyMV0KKworCW1vdmUuZAlDT05GSUdfRVRSQVhfREVGX0dJT19QQ19PRSwgJHIwCisJbW92ZS5kCVJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3BjX29lKSwgJHIxCisJbW92ZS5kCSRyMCwgWyRyMV0KKworCW1vdmUuZAkweEZGRkZGRkZGLCAkcjAKKwltb3ZlLmQJUkVHX0FERFIocGlubXV4LCByZWdpX3Bpbm11eCwgcndfZ2lvX3BhKSwgJHIxCisJbW92ZS5kCSRyMCwgWyRyMV0KKwltb3ZlLmQJUkVHX0FERFIocGlubXV4LCByZWdpX3Bpbm11eCwgcndfZ2lvX3BiKSwgJHIxCisJbW92ZS5kCSRyMCwgWyRyMV0KKwltb3ZlLmQJUkVHX0FERFIocGlubXV4LCByZWdpX3Bpbm11eCwgcndfZ2lvX3BjKSwgJHIxCisJbW92ZS5kCSRyMCwgWyRyMV0KKwkuZW5kbQorCisJLm1hY3JvIFNUQVJUX0NMT0NLUworCW1vdmUuZCBSRUdfQUREUihjbGtnZW4sIHJlZ2lfY2xrZ2VuLCByd19jbGtfY3RybCksICRyMQorCW1vdmUuZCBbJHIxXSwgJHIwCisJb3IuZCBSRUdfU1RBVEUoY2xrZ2VuLCByd19jbGtfY3RybCwgY3B1LCB5ZXMpIHwgXAorCSAgICAgUkVHX1NUQVRFKGNsa2dlbiwgcndfY2xrX2N0cmwsIGRkcjIsIHllcykgfCBcCisJICAgICBSRUdfU1RBVEUoY2xrZ2VuLCByd19jbGtfY3RybCwgbWVtYXJiX2Jhcl9kZHIsIHllcyksICRyMAorCW1vdmUuZCAkcjAsIFskcjFdCisJLmVuZG0KKworCS5tYWNybyBTRVRVUF9XQUlUX1NUQVRFUworCW1vdmUuZCBSRUdfQUREUihwaW8sIHJlZ2lfcGlvLCByd19jZTBfY2ZnKSwgJHIwCisJbW92ZS5kIENPTkZJR19FVFJBWF9QSU9fQ0UwX0NGRywgJHIxCisJbW92ZS5kICRyMSwgWyRyMF0KKwltb3ZlLmQgUkVHX0FERFIocGlvLCByZWdpX3BpbywgcndfY2UxX2NmZyksICRyMAorCW1vdmUuZCBDT05GSUdfRVRSQVhfUElPX0NFMV9DRkcsICRyMQorCW1vdmUuZCAkcjEsIFskcjBdCisJbW92ZS5kIFJFR19BRERSKHBpbywgcmVnaV9waW8sIHJ3X2NlMl9jZmcpLCAkcjAKKwltb3ZlLmQgQ09ORklHX0VUUkFYX1BJT19DRTJfQ0ZHLCAkcjEKKwltb3ZlLmQgJHIxLCBbJHIwXQorCS5lbmRtCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvYXJiaXRlci5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2FyYml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmUwZWM4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2FyYml0ZXIuaApAQCAtMCwwICsxLDI4IEBACisjaWZuZGVmIF9BU01fQ1JJU19BUkNIX0FSQklURVJfSAorI2RlZmluZSBfQVNNX0NSSVNfQVJDSF9BUkJJVEVSX0gKKworI2RlZmluZSBFWFRfUkVHSU9OIDAKKyNkZWZpbmUgSU5UX1JFR0lPTiAxCisKK3R5cGVkZWYgdm9pZCAod2F0Y2hfY2FsbGJhY2spKHZvaWQpOworCitlbnVtIHsKKwlhcmJpdGVyX2FsbF9kbWFzID0gMHgzZmYsCisJYXJiaXRlcl9jcHUgPSAweGMwMCwKKwlhcmJpdGVyX2FsbF9jbGllbnRzID0gMHgzZmZmCit9OworCitlbnVtIHsKKwlhcmJpdGVyX2FsbF9yZWFkID0gMHg1NSwKKwlhcmJpdGVyX2FsbF93cml0ZSA9IDB4YWEsCisJYXJiaXRlcl9hbGxfYWNjZXNzZXMgPSAweGZmCit9OworCitpbnQgY3Jpc3YzMl9hcmJpdGVyX2FsbG9jYXRlX2JhbmR3aWR0aChpbnQgY2xpZW50LCBpbnQgcmVnaW9uLAorCQl1bnNpZ25lZCBsb25nIGJhbmR3aWR0aCk7CitpbnQgY3Jpc3YzMl9hcmJpdGVyX3dhdGNoKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJdW5zaWduZWQgbG9uZyBjbGllbnRzLCB1bnNpZ25lZCBsb25nIGFjY2Vzc2VzLAorCQl3YXRjaF9jYWxsYmFjayAqIGNiKTsKK2ludCBjcmlzdjMyX2FyYml0ZXJfdW53YXRjaChpbnQgaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1mcy9od3JlZ3MvYXNtL2JpZl9jb3JlX2RlZnNfYXNtLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdyZWdzL2FzbS9iaWZfY29yZV9kZWZzX2FzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNDA5YzkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdyZWdzL2FzbS9iaWZfY29yZV9kZWZzX2FzbS5oCkBAIC0wLDAgKzEsMzE5IEBACisjaWZuZGVmIF9fYmlmX2NvcmVfZGVmc19hc21faAorI2RlZmluZSBfX2JpZl9jb3JlX2RlZnNfYXNtX2gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGZyb20KKyAqICAgZmlsZTogICAgICAgICAgIC4uLy4uL2luc3QvYmlmL3J0bC9iaWZfY29yZV9yZWdzLnIKKyAqICAgICBpZDogICAgICAgICAgIGJpZl9jb3JlX3JlZ3Mucix2IDEuMTcgMjAwNS8wMi8wNCAxMzoyODoyMiBucCBFeHAgCisgKiAgICAgbGFzdCBtb2RmaWVkOiBNb24gQXByIDExIDE2OjA2OjMzIDIwMDUKKyAqIAorICogICBieSAvbi9hc2ljL2Rlc2lnbi90b29scy9yZGVzYy9zcmMvcmRlczJjIC1hc20gLS1vdXRmaWxlIGFzbS9iaWZfY29yZV9kZWZzX2FzbS5oIC4uLy4uL2luc3QvYmlmL3J0bC9iaWZfY29yZV9yZWdzLnIKKyAqICAgICAgaWQ6ICRJZDogYmlmX2NvcmVfZGVmc19hc20uaCx2IDEuMSAyMDA3LzAyLzEzIDExOjU1OjMwIHN0YXJ2aWsgRXhwICQKKyAqIEFueSBjaGFuZ2VzIGhlcmUgd2lsbCBiZSBsb3N0LgorICoKKyAqIC0qLSBidWZmZXItcmVhZC1vbmx5OiB0IC0qLQorICovCisKKyNpZm5kZWYgUkVHX0ZJRUxECisjZGVmaW5lIFJFR19GSUVMRCggc2NvcGUsIHJlZywgZmllbGQsIHZhbHVlICkgXAorICBSRUdfRklFTERfWF8oIHZhbHVlLCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX19sc2IgKQorI2RlZmluZSBSRUdfRklFTERfWF8oIHZhbHVlLCBzaGlmdCApICgodmFsdWUpIDw8IHNoaWZ0KQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1NUQVRFCisjZGVmaW5lIFJFR19TVEFURSggc2NvcGUsIHJlZywgZmllbGQsIHN5bWJvbGljX3ZhbHVlICkgXAorICBSRUdfU1RBVEVfWF8oIHJlZ2tfIyNzY29wZSMjXyMjc3ltYm9saWNfdmFsdWUsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19fXyMjZmllbGQjI19fX2xzYiApCisjZGVmaW5lIFJFR19TVEFURV9YXyggaywgc2hpZnQgKSAoayA8PCBzaGlmdCkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19NQVNLCisjZGVmaW5lIFJFR19NQVNLKCBzY29wZSwgcmVnLCBmaWVsZCApIFwKKyAgUkVHX01BU0tfWF8oIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19fXyMjZmllbGQjI19fX3dpZHRoLCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX19sc2IgKQorI2RlZmluZSBSRUdfTUFTS19YXyggd2lkdGgsIGxzYiApICgoKDEgPDwgd2lkdGgpLTEpIDw8IGxzYikKKyNlbmRpZgorCisjaWZuZGVmIFJFR19MU0IKKyNkZWZpbmUgUkVHX0xTQiggc2NvcGUsIHJlZywgZmllbGQgKSByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX19sc2IKKyNlbmRpZgorCisjaWZuZGVmIFJFR19CSVQKKyNkZWZpbmUgUkVHX0JJVCggc2NvcGUsIHJlZywgZmllbGQgKSByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX19iaXQKKyNlbmRpZgorCisjaWZuZGVmIFJFR19BRERSCisjZGVmaW5lIFJFR19BRERSKCBzY29wZSwgaW5zdCwgcmVnICkgUkVHX0FERFJfWF8oaW5zdCwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX29mZnNldCkKKyNkZWZpbmUgUkVHX0FERFJfWF8oIGluc3QsIG9mZnMgKSAoKGluc3QpICsgb2ZmcykKKyNlbmRpZgorCisjaWZuZGVmIFJFR19BRERSX1ZFQ1QKKyNkZWZpbmUgUkVHX0FERFJfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgICAgICAgICBSRUdfQUREUl9WRUNUX1hfKGluc3QsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19vZmZzZXQsIGluZGV4LCBcCisJCQkgU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZGVmaW5lIFJFR19BRERSX1ZFQ1RfWF8oIGluc3QsIG9mZnMsIGluZGV4LCBzdHJpZGUgKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW5zdCkgKyBvZmZzICsgKGluZGV4KSAqIHN0cmlkZSkKKyNlbmRpZgorCisvKiBSZWdpc3RlciByd19ncnAxX2NmZywgc2NvcGUgYmlmX2NvcmUsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDFfY2ZnX19fbHdfX19sc2IgMAorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwMV9jZmdfX19sd19fX3dpZHRoIDYKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDFfY2ZnX19fZXdfX19sc2IgNgorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwMV9jZmdfX19ld19fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDFfY2ZnX19fendfX19sc2IgOQorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwMV9jZmdfX196d19fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDFfY2ZnX19fYXdfX19sc2IgMTIKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDFfY2ZnX19fYXdfX193aWR0aCAyCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAxX2NmZ19fX2R3X19fbHNiIDE0CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAxX2NmZ19fX2R3X19fd2lkdGggMgorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwMV9jZmdfX19ld2JfX19sc2IgMTYKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDFfY2ZnX19fZXdiX19fd2lkdGggMgorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwMV9jZmdfX19id19fX2xzYiAxOAorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwMV9jZmdfX19id19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDFfY2ZnX19fYndfX19iaXQgMTgKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDFfY2ZnX19fd3JfZXh0ZW5kX19fbHNiIDE5CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAxX2NmZ19fX3dyX2V4dGVuZF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDFfY2ZnX19fd3JfZXh0ZW5kX19fYml0IDE5CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAxX2NmZ19fX2VyY19lbl9fX2xzYiAyMAorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwMV9jZmdfX19lcmNfZW5fX193aWR0aCAxCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAxX2NmZ19fX2VyY19lbl9fX2JpdCAyMAorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwMV9jZmdfX19tb2RlX19fbHNiIDIxCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAxX2NmZ19fX21vZGVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAxX2NmZ19fX21vZGVfX19iaXQgMjEKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDFfY2ZnX29mZnNldCAwCisKKy8qIFJlZ2lzdGVyIHJ3X2dycDJfY2ZnLCBzY29wZSBiaWZfY29yZSwgdHlwZSBydyAqLworI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwMl9jZmdfX19sd19fX2xzYiAwCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAyX2NmZ19fX2x3X19fd2lkdGggNgorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwMl9jZmdfX19ld19fX2xzYiA2CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAyX2NmZ19fX2V3X19fd2lkdGggMworI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwMl9jZmdfX196d19fX2xzYiA5CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAyX2NmZ19fX3p3X19fd2lkdGggMworI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwMl9jZmdfX19hd19fX2xzYiAxMgorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwMl9jZmdfX19hd19fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDJfY2ZnX19fZHdfX19sc2IgMTQKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDJfY2ZnX19fZHdfX193aWR0aCAyCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAyX2NmZ19fX2V3Yl9fX2xzYiAxNgorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwMl9jZmdfX19ld2JfX193aWR0aCAyCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAyX2NmZ19fX2J3X19fbHNiIDE4CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAyX2NmZ19fX2J3X19fd2lkdGggMQorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwMl9jZmdfX19id19fX2JpdCAxOAorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwMl9jZmdfX193cl9leHRlbmRfX19sc2IgMTkKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDJfY2ZnX19fd3JfZXh0ZW5kX19fd2lkdGggMQorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwMl9jZmdfX193cl9leHRlbmRfX19iaXQgMTkKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDJfY2ZnX19fZXJjX2VuX19fbHNiIDIwCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAyX2NmZ19fX2VyY19lbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDJfY2ZnX19fZXJjX2VuX19fYml0IDIwCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAyX2NmZ19fX21vZGVfX19sc2IgMjEKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDJfY2ZnX19fbW9kZV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDJfY2ZnX19fbW9kZV9fX2JpdCAyMQorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwMl9jZmdfb2Zmc2V0IDQKKworLyogUmVnaXN0ZXIgcndfZ3JwM19jZmcsIHNjb3BlIGJpZl9jb3JlLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAzX2NmZ19fX2x3X19fbHNiIDAKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDNfY2ZnX19fbHdfX193aWR0aCA2CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAzX2NmZ19fX2V3X19fbHNiIDYKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDNfY2ZnX19fZXdfX193aWR0aCAzCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAzX2NmZ19fX3p3X19fbHNiIDkKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDNfY2ZnX19fendfX193aWR0aCAzCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAzX2NmZ19fX2F3X19fbHNiIDEyCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAzX2NmZ19fX2F3X19fd2lkdGggMgorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwM19jZmdfX19kd19fX2xzYiAxNAorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwM19jZmdfX19kd19fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDNfY2ZnX19fZXdiX19fbHNiIDE2CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAzX2NmZ19fX2V3Yl9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDNfY2ZnX19fYndfX19sc2IgMTgKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDNfY2ZnX19fYndfX193aWR0aCAxCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAzX2NmZ19fX2J3X19fYml0IDE4CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAzX2NmZ19fX3dyX2V4dGVuZF9fX2xzYiAxOQorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwM19jZmdfX193cl9leHRlbmRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAzX2NmZ19fX3dyX2V4dGVuZF9fX2JpdCAxOQorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwM19jZmdfX19lcmNfZW5fX19sc2IgMjAKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDNfY2ZnX19fZXJjX2VuX19fd2lkdGggMQorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwM19jZmdfX19lcmNfZW5fX19iaXQgMjAKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDNfY2ZnX19fbW9kZV9fX2xzYiAyMQorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwM19jZmdfX19tb2RlX19fd2lkdGggMQorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwM19jZmdfX19tb2RlX19fYml0IDIxCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAzX2NmZ19fX2dhdGVkX2NzcDBfX19sc2IgMjQKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDNfY2ZnX19fZ2F0ZWRfY3NwMF9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDNfY2ZnX19fZ2F0ZWRfY3NwMV9fX2xzYiAyNgorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwM19jZmdfX19nYXRlZF9jc3AxX19fd2lkdGggMgorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwM19jZmdfX19nYXRlZF9jc3AyX19fbHNiIDI4CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAzX2NmZ19fX2dhdGVkX2NzcDJfX193aWR0aCAyCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnAzX2NmZ19fX2dhdGVkX2NzcDNfX19sc2IgMzAKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDNfY2ZnX19fZ2F0ZWRfY3NwM19fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDNfY2ZnX29mZnNldCA4CisKKy8qIFJlZ2lzdGVyIHJ3X2dycDRfY2ZnLCBzY29wZSBiaWZfY29yZSwgdHlwZSBydyAqLworI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwNF9jZmdfX19sd19fX2xzYiAwCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnA0X2NmZ19fX2x3X19fd2lkdGggNgorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwNF9jZmdfX19ld19fX2xzYiA2CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnA0X2NmZ19fX2V3X19fd2lkdGggMworI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwNF9jZmdfX196d19fX2xzYiA5CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnA0X2NmZ19fX3p3X19fd2lkdGggMworI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwNF9jZmdfX19hd19fX2xzYiAxMgorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwNF9jZmdfX19hd19fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDRfY2ZnX19fZHdfX19sc2IgMTQKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDRfY2ZnX19fZHdfX193aWR0aCAyCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnA0X2NmZ19fX2V3Yl9fX2xzYiAxNgorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwNF9jZmdfX19ld2JfX193aWR0aCAyCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnA0X2NmZ19fX2J3X19fbHNiIDE4CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnA0X2NmZ19fX2J3X19fd2lkdGggMQorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwNF9jZmdfX19id19fX2JpdCAxOAorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwNF9jZmdfX193cl9leHRlbmRfX19sc2IgMTkKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDRfY2ZnX19fd3JfZXh0ZW5kX19fd2lkdGggMQorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwNF9jZmdfX193cl9leHRlbmRfX19iaXQgMTkKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDRfY2ZnX19fZXJjX2VuX19fbHNiIDIwCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnA0X2NmZ19fX2VyY19lbl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDRfY2ZnX19fZXJjX2VuX19fYml0IDIwCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnA0X2NmZ19fX21vZGVfX19sc2IgMjEKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDRfY2ZnX19fbW9kZV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDRfY2ZnX19fbW9kZV9fX2JpdCAyMQorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwNF9jZmdfX19nYXRlZF9jc3A0X19fbHNiIDI2CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnA0X2NmZ19fX2dhdGVkX2NzcDRfX193aWR0aCAyCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19ncnA0X2NmZ19fX2dhdGVkX2NzcDVfX19sc2IgMjgKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDRfY2ZnX19fZ2F0ZWRfY3NwNV9fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X2dycDRfY2ZnX19fZ2F0ZWRfY3NwNl9fX2xzYiAzMAorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwNF9jZmdfX19nYXRlZF9jc3A2X19fd2lkdGggMgorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfZ3JwNF9jZmdfb2Zmc2V0IDEyCisKKy8qIFJlZ2lzdGVyIHJ3X3NkcmFtX2NmZ19ncnAwLCBzY29wZSBiaWZfY29yZSwgdHlwZSBydyAqLworI2RlZmluZSByZWdfYmlmX2NvcmVfcndfc2RyYW1fY2ZnX2dycDBfX19iYW5rX3NlbF9fX2xzYiAwCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV9jZmdfZ3JwMF9fX2Jhbmtfc2VsX19fd2lkdGggNQorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfc2RyYW1fY2ZnX2dycDBfX19jYV9fX2xzYiA1CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV9jZmdfZ3JwMF9fX2NhX19fd2lkdGggMworI2RlZmluZSByZWdfYmlmX2NvcmVfcndfc2RyYW1fY2ZnX2dycDBfX190eXBlX19fbHNiIDgKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X3NkcmFtX2NmZ19ncnAwX19fdHlwZV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X3NkcmFtX2NmZ19ncnAwX19fdHlwZV9fX2JpdCA4CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV9jZmdfZ3JwMF9fX2J3X19fbHNiIDkKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X3NkcmFtX2NmZ19ncnAwX19fYndfX193aWR0aCAxCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV9jZmdfZ3JwMF9fX2J3X19fYml0IDkKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X3NkcmFtX2NmZ19ncnAwX19fc2hfX19sc2IgMTAKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X3NkcmFtX2NmZ19ncnAwX19fc2hfX193aWR0aCAzCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV9jZmdfZ3JwMF9fX3dtbV9fX2xzYiAxMworI2RlZmluZSByZWdfYmlmX2NvcmVfcndfc2RyYW1fY2ZnX2dycDBfX193bW1fX193aWR0aCAxCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV9jZmdfZ3JwMF9fX3dtbV9fX2JpdCAxMworI2RlZmluZSByZWdfYmlmX2NvcmVfcndfc2RyYW1fY2ZnX2dycDBfX19zaDE2X19fbHNiIDE0CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV9jZmdfZ3JwMF9fX3NoMTZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV9jZmdfZ3JwMF9fX3NoMTZfX19iaXQgMTQKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X3NkcmFtX2NmZ19ncnAwX19fZ3JwX3NlbF9fX2xzYiAxNQorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfc2RyYW1fY2ZnX2dycDBfX19ncnBfc2VsX19fd2lkdGggNQorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfc2RyYW1fY2ZnX2dycDBfb2Zmc2V0IDE2CisKKy8qIFJlZ2lzdGVyIHJ3X3NkcmFtX2NmZ19ncnAxLCBzY29wZSBiaWZfY29yZSwgdHlwZSBydyAqLworI2RlZmluZSByZWdfYmlmX2NvcmVfcndfc2RyYW1fY2ZnX2dycDFfX19iYW5rX3NlbF9fX2xzYiAwCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV9jZmdfZ3JwMV9fX2Jhbmtfc2VsX19fd2lkdGggNQorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfc2RyYW1fY2ZnX2dycDFfX19jYV9fX2xzYiA1CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV9jZmdfZ3JwMV9fX2NhX19fd2lkdGggMworI2RlZmluZSByZWdfYmlmX2NvcmVfcndfc2RyYW1fY2ZnX2dycDFfX190eXBlX19fbHNiIDgKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X3NkcmFtX2NmZ19ncnAxX19fdHlwZV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X3NkcmFtX2NmZ19ncnAxX19fdHlwZV9fX2JpdCA4CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV9jZmdfZ3JwMV9fX2J3X19fbHNiIDkKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X3NkcmFtX2NmZ19ncnAxX19fYndfX193aWR0aCAxCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV9jZmdfZ3JwMV9fX2J3X19fYml0IDkKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X3NkcmFtX2NmZ19ncnAxX19fc2hfX19sc2IgMTAKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X3NkcmFtX2NmZ19ncnAxX19fc2hfX193aWR0aCAzCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV9jZmdfZ3JwMV9fX3dtbV9fX2xzYiAxMworI2RlZmluZSByZWdfYmlmX2NvcmVfcndfc2RyYW1fY2ZnX2dycDFfX193bW1fX193aWR0aCAxCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV9jZmdfZ3JwMV9fX3dtbV9fX2JpdCAxMworI2RlZmluZSByZWdfYmlmX2NvcmVfcndfc2RyYW1fY2ZnX2dycDFfX19zaDE2X19fbHNiIDE0CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV9jZmdfZ3JwMV9fX3NoMTZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV9jZmdfZ3JwMV9fX3NoMTZfX19iaXQgMTQKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X3NkcmFtX2NmZ19ncnAxX29mZnNldCAyMAorCisvKiBSZWdpc3RlciByd19zZHJhbV90aW1pbmcsIHNjb3BlIGJpZl9jb3JlLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV90aW1pbmdfX19jbF9fX2xzYiAwCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV90aW1pbmdfX19jbF9fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X3NkcmFtX3RpbWluZ19fX3JjZF9fX2xzYiAzCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV90aW1pbmdfX19yY2RfX193aWR0aCAzCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV90aW1pbmdfX19ycF9fX2xzYiA2CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV90aW1pbmdfX19ycF9fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X3NkcmFtX3RpbWluZ19fX3JjX19fbHNiIDkKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X3NkcmFtX3RpbWluZ19fX3JjX19fd2lkdGggMgorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfc2RyYW1fdGltaW5nX19fZHBsX19fbHNiIDExCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV90aW1pbmdfX19kcGxfX193aWR0aCAyCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV90aW1pbmdfX19wZGVfX19sc2IgMTMKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X3NkcmFtX3RpbWluZ19fX3BkZV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X3NkcmFtX3RpbWluZ19fX3BkZV9fX2JpdCAxMworI2RlZmluZSByZWdfYmlmX2NvcmVfcndfc2RyYW1fdGltaW5nX19fcmVmX19fbHNiIDE0CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV90aW1pbmdfX19yZWZfX193aWR0aCAyCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV90aW1pbmdfX19jcGRfX19sc2IgMTYKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X3NkcmFtX3RpbWluZ19fX2NwZF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X3NkcmFtX3RpbWluZ19fX2NwZF9fX2JpdCAxNgorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfc2RyYW1fdGltaW5nX19fc2Rja2VfX19sc2IgMTcKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X3NkcmFtX3RpbWluZ19fX3NkY2tlX19fd2lkdGggMQorI2RlZmluZSByZWdfYmlmX2NvcmVfcndfc2RyYW1fdGltaW5nX19fc2Rja2VfX19iaXQgMTcKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X3NkcmFtX3RpbWluZ19fX3NkY2xrX19fbHNiIDE4CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV90aW1pbmdfX19zZGNsa19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X3NkcmFtX3RpbWluZ19fX3NkY2xrX19fYml0IDE4CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV90aW1pbmdfb2Zmc2V0IDI0CisKKy8qIFJlZ2lzdGVyIHJ3X3NkcmFtX2NtZCwgc2NvcGUgYmlmX2NvcmUsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3J3X3NkcmFtX2NtZF9fX2NtZF9fX2xzYiAwCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV9jbWRfX19jbWRfX193aWR0aCAzCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV9jbWRfX19tcnNfZGF0YV9fX2xzYiAzCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV9jbWRfX19tcnNfZGF0YV9fX3dpZHRoIDE1CisjZGVmaW5lIHJlZ19iaWZfY29yZV9yd19zZHJhbV9jbWRfb2Zmc2V0IDI4CisKKy8qIFJlZ2lzdGVyIHJzX3NkcmFtX3JlZl9zdGF0LCBzY29wZSBiaWZfY29yZSwgdHlwZSBycyAqLworI2RlZmluZSByZWdfYmlmX2NvcmVfcnNfc2RyYW1fcmVmX3N0YXRfX19va19fX2xzYiAwCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yc19zZHJhbV9yZWZfc3RhdF9fX29rX19fd2lkdGggMQorI2RlZmluZSByZWdfYmlmX2NvcmVfcnNfc2RyYW1fcmVmX3N0YXRfX19va19fX2JpdCAwCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yc19zZHJhbV9yZWZfc3RhdF9vZmZzZXQgMzIKKworLyogUmVnaXN0ZXIgcl9zZHJhbV9yZWZfc3RhdCwgc2NvcGUgYmlmX2NvcmUsIHR5cGUgciAqLworI2RlZmluZSByZWdfYmlmX2NvcmVfcl9zZHJhbV9yZWZfc3RhdF9fX29rX19fbHNiIDAKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3Jfc2RyYW1fcmVmX3N0YXRfX19va19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2JpZl9jb3JlX3Jfc2RyYW1fcmVmX3N0YXRfX19va19fX2JpdCAwCisjZGVmaW5lIHJlZ19iaWZfY29yZV9yX3NkcmFtX3JlZl9zdGF0X29mZnNldCAzNgorCisKKy8qIENvbnN0YW50cyAqLworI2RlZmluZSByZWdrX2JpZl9jb3JlX2JhbmsyICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfYmlmX2NvcmVfYmFuazQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna19iaWZfY29yZV9iaXQxMCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwYQorI2RlZmluZSByZWdrX2JpZl9jb3JlX2JpdDExICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBiCisjZGVmaW5lIHJlZ2tfYmlmX2NvcmVfYml0MTIgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGMKKyNkZWZpbmUgcmVna19iaWZfY29yZV9iaXQxMyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwZAorI2RlZmluZSByZWdrX2JpZl9jb3JlX2JpdDE0ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBlCisjZGVmaW5lIHJlZ2tfYmlmX2NvcmVfYml0MTUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgcmVna19iaWZfY29yZV9iaXQxNiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSByZWdrX2JpZl9jb3JlX2JpdDE3ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDExCisjZGVmaW5lIHJlZ2tfYmlmX2NvcmVfYml0MTggICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTIKKyNkZWZpbmUgcmVna19iaWZfY29yZV9iaXQxOSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMworI2RlZmluZSByZWdrX2JpZl9jb3JlX2JpdDIwICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE0CisjZGVmaW5lIHJlZ2tfYmlmX2NvcmVfYml0MjEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTUKKyNkZWZpbmUgcmVna19iaWZfY29yZV9iaXQyMiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxNgorI2RlZmluZSByZWdrX2JpZl9jb3JlX2JpdDIzICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE3CisjZGVmaW5lIHJlZ2tfYmlmX2NvcmVfYml0MjQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTgKKyNkZWZpbmUgcmVna19iaWZfY29yZV9iaXQyNSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxOQorI2RlZmluZSByZWdrX2JpZl9jb3JlX2JpdDI2ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFhCisjZGVmaW5lIHJlZ2tfYmlmX2NvcmVfYml0MjcgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMWIKKyNkZWZpbmUgcmVna19iaWZfY29yZV9iaXQyOCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxYworI2RlZmluZSByZWdrX2JpZl9jb3JlX2JpdDI5ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFkCisjZGVmaW5lIHJlZ2tfYmlmX2NvcmVfYml0OSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDkKKyNkZWZpbmUgcmVna19iaWZfY29yZV9idzE2ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2JpZl9jb3JlX2J3MzIgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfYmlmX2NvcmVfYndlICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19iaWZfY29yZV9jd2UgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2JpZl9jb3JlX2UxNXVzICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfYmlmX2NvcmVfZTc4MDBucyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgcmVna19iaWZfY29yZV9ncnAwICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2JpZl9jb3JlX2dycDEgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfYmlmX2NvcmVfbXJzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgcmVna19iaWZfY29yZV9ubyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2JpZl9jb3JlX25vbmUgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfYmlmX2NvcmVfbm9wICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19iaWZfY29yZV9vZmYgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2JpZl9jb3JlX3ByZSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIHJlZ2tfYmlmX2NvcmVfcl9zZHJhbV9yZWZfc3RhdF9kZWZhdWx0ICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna19iaWZfY29yZV9yZCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX2JpZl9jb3JlX3JlZiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfYmlmX2NvcmVfcnNfc2RyYW1fcmVmX3N0YXRfZGVmYXVsdCAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna19iaWZfY29yZV9yd19ncnAxX2NmZ19kZWZhdWx0ICAgICAgICAgMHgwMDAwMDZjZgorI2RlZmluZSByZWdrX2JpZl9jb3JlX3J3X2dycDJfY2ZnX2RlZmF1bHQgICAgICAgICAweDAwMDAwNmNmCisjZGVmaW5lIHJlZ2tfYmlmX2NvcmVfcndfZ3JwM19jZmdfZGVmYXVsdCAgICAgICAgIDB4MDAwMDA2Y2YKKyNkZWZpbmUgcmVna19iaWZfY29yZV9yd19ncnA0X2NmZ19kZWZhdWx0ICAgICAgICAgMHgwMDAwMDZjZgorI2RlZmluZSByZWdrX2JpZl9jb3JlX3J3X3NkcmFtX2NmZ19ncnAxX2RlZmF1bHQgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfYmlmX2NvcmVfc2xmICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgcmVna19iaWZfY29yZV93ciAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX2JpZl9jb3JlX3llcyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZW5kaWYgLyogX19iaWZfY29yZV9kZWZzX2FzbV9oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdyZWdzL2FzbS9jb25maWdfZGVmc19hc20uaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1mcy9od3JlZ3MvYXNtL2NvbmZpZ19kZWZzX2FzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OTA4ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdyZWdzL2FzbS9jb25maWdfZGVmc19hc20uaApAQCAtMCwwICsxLDEzMSBAQAorI2lmbmRlZiBfX2NvbmZpZ19kZWZzX2FzbV9oCisjZGVmaW5lIF9fY29uZmlnX2RlZnNfYXNtX2gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGZyb20KKyAqICAgZmlsZTogICAgICAgICAgIC4uLy4uL3J0bC9jb25maWdfcmVncy5yCisgKiAgICAgaWQ6ICAgICAgICAgICBjb25maWdfcmVncy5yLHYgMS4yMyAyMDA0LzAzLzA0IDExOjM0OjQyIG1pa2FlbG4gRXhwIAorICogICAgIGxhc3QgbW9kZmllZDogVGh1IE1hciAgNCAxMjozNDozOSAyMDA0CisgKiAKKyAqICAgYnkgL24vYXNpYy9kZXNpZ24vdG9vbHMvcmRlc2Mvc3JjL3JkZXMyYyAtYXNtIC0tb3V0ZmlsZSBhc20vY29uZmlnX2RlZnNfYXNtLmggLi4vLi4vcnRsL2NvbmZpZ19yZWdzLnIKKyAqICAgICAgaWQ6ICRJZDogY29uZmlnX2RlZnNfYXNtLmgsdiAxLjEgMjAwNy8wMi8xMyAxMTo1NTozMCBzdGFydmlrIEV4cCAkCisgKiBBbnkgY2hhbmdlcyBoZXJlIHdpbGwgYmUgbG9zdC4KKyAqCisgKiAtKi0gYnVmZmVyLXJlYWQtb25seTogdCAtKi0KKyAqLworCisjaWZuZGVmIFJFR19GSUVMRAorI2RlZmluZSBSRUdfRklFTEQoIHNjb3BlLCByZWcsIGZpZWxkLCB2YWx1ZSApIFwKKyAgUkVHX0ZJRUxEX1hfKCB2YWx1ZSwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX0ZJRUxEX1hfKCB2YWx1ZSwgc2hpZnQgKSAoKHZhbHVlKSA8PCBzaGlmdCkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19TVEFURQorI2RlZmluZSBSRUdfU1RBVEUoIHNjb3BlLCByZWcsIGZpZWxkLCBzeW1ib2xpY192YWx1ZSApIFwKKyAgUkVHX1NUQVRFX1hfKCByZWdrXyMjc2NvcGUjI18jI3N5bWJvbGljX3ZhbHVlLCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX19sc2IgKQorI2RlZmluZSBSRUdfU1RBVEVfWF8oIGssIHNoaWZ0ICkgKGsgPDwgc2hpZnQpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfTUFTSworI2RlZmluZSBSRUdfTUFTSyggc2NvcGUsIHJlZywgZmllbGQgKSBcCisgIFJFR19NQVNLX1hfKCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX193aWR0aCwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX01BU0tfWF8oIHdpZHRoLCBsc2IgKSAoKCgxIDw8IHdpZHRoKS0xKSA8PCBsc2IpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfTFNCCisjZGVmaW5lIFJFR19MU0IoIHNjb3BlLCByZWcsIGZpZWxkICkgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQklUCisjZGVmaW5lIFJFR19CSVQoIHNjb3BlLCByZWcsIGZpZWxkICkgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fYml0CisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUgorI2RlZmluZSBSRUdfQUREUiggc2NvcGUsIGluc3QsIHJlZyApIFJFR19BRERSX1hfKGluc3QsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19vZmZzZXQpCisjZGVmaW5lIFJFR19BRERSX1hfKCBpbnN0LCBvZmZzICkgKChpbnN0KSArIG9mZnMpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUl9WRUNUCisjZGVmaW5lIFJFR19BRERSX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICAgICAgICAgUkVHX0FERFJfVkVDVF9YXyhpbnN0LCByZWdfIyNzY29wZSMjXyMjcmVnIyNfb2Zmc2V0LCBpbmRleCwgXAorCQkJIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2RlZmluZSBSRUdfQUREUl9WRUNUX1hfKCBpbnN0LCBvZmZzLCBpbmRleCwgc3RyaWRlICkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKGluc3QpICsgb2ZmcyArIChpbmRleCkgKiBzdHJpZGUpCisjZW5kaWYKKworLyogUmVnaXN0ZXIgcl9ib290c2VsLCBzY29wZSBjb25maWcsIHR5cGUgciAqLworI2RlZmluZSByZWdfY29uZmlnX3JfYm9vdHNlbF9fX2Jvb3RfbW9kZV9fX2xzYiAwCisjZGVmaW5lIHJlZ19jb25maWdfcl9ib290c2VsX19fYm9vdF9tb2RlX19fd2lkdGggMworI2RlZmluZSByZWdfY29uZmlnX3JfYm9vdHNlbF9fX2Z1bGxfZHVwbGV4X19fbHNiIDMKKyNkZWZpbmUgcmVnX2NvbmZpZ19yX2Jvb3RzZWxfX19mdWxsX2R1cGxleF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2NvbmZpZ19yX2Jvb3RzZWxfX19mdWxsX2R1cGxleF9fX2JpdCAzCisjZGVmaW5lIHJlZ19jb25maWdfcl9ib290c2VsX19fdXNlcl9fX2xzYiA0CisjZGVmaW5lIHJlZ19jb25maWdfcl9ib290c2VsX19fdXNlcl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2NvbmZpZ19yX2Jvb3RzZWxfX191c2VyX19fYml0IDQKKyNkZWZpbmUgcmVnX2NvbmZpZ19yX2Jvb3RzZWxfX19wbGxfX19sc2IgNQorI2RlZmluZSByZWdfY29uZmlnX3JfYm9vdHNlbF9fX3BsbF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2NvbmZpZ19yX2Jvb3RzZWxfX19wbGxfX19iaXQgNQorI2RlZmluZSByZWdfY29uZmlnX3JfYm9vdHNlbF9fX2ZsYXNoX2J3X19fbHNiIDYKKyNkZWZpbmUgcmVnX2NvbmZpZ19yX2Jvb3RzZWxfX19mbGFzaF9id19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2NvbmZpZ19yX2Jvb3RzZWxfX19mbGFzaF9id19fX2JpdCA2CisjZGVmaW5lIHJlZ19jb25maWdfcl9ib290c2VsX29mZnNldCAwCisKKy8qIFJlZ2lzdGVyIHJ3X2Nsa19jdHJsLCBzY29wZSBjb25maWcsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2NvbmZpZ19yd19jbGtfY3RybF9fX3BsbF9fX2xzYiAwCisjZGVmaW5lIHJlZ19jb25maWdfcndfY2xrX2N0cmxfX19wbGxfX193aWR0aCAxCisjZGVmaW5lIHJlZ19jb25maWdfcndfY2xrX2N0cmxfX19wbGxfX19iaXQgMAorI2RlZmluZSByZWdfY29uZmlnX3J3X2Nsa19jdHJsX19fY3B1X19fbHNiIDEKKyNkZWZpbmUgcmVnX2NvbmZpZ19yd19jbGtfY3RybF9fX2NwdV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2NvbmZpZ19yd19jbGtfY3RybF9fX2NwdV9fX2JpdCAxCisjZGVmaW5lIHJlZ19jb25maWdfcndfY2xrX2N0cmxfX19pb3BfX19sc2IgMgorI2RlZmluZSByZWdfY29uZmlnX3J3X2Nsa19jdHJsX19faW9wX19fd2lkdGggMQorI2RlZmluZSByZWdfY29uZmlnX3J3X2Nsa19jdHJsX19faW9wX19fYml0IDIKKyNkZWZpbmUgcmVnX2NvbmZpZ19yd19jbGtfY3RybF9fX2RtYTAxX2V0aDBfX19sc2IgMworI2RlZmluZSByZWdfY29uZmlnX3J3X2Nsa19jdHJsX19fZG1hMDFfZXRoMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2NvbmZpZ19yd19jbGtfY3RybF9fX2RtYTAxX2V0aDBfX19iaXQgMworI2RlZmluZSByZWdfY29uZmlnX3J3X2Nsa19jdHJsX19fZG1hMjNfX19sc2IgNAorI2RlZmluZSByZWdfY29uZmlnX3J3X2Nsa19jdHJsX19fZG1hMjNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19jb25maWdfcndfY2xrX2N0cmxfX19kbWEyM19fX2JpdCA0CisjZGVmaW5lIHJlZ19jb25maWdfcndfY2xrX2N0cmxfX19kbWE0NV9fX2xzYiA1CisjZGVmaW5lIHJlZ19jb25maWdfcndfY2xrX2N0cmxfX19kbWE0NV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2NvbmZpZ19yd19jbGtfY3RybF9fX2RtYTQ1X19fYml0IDUKKyNkZWZpbmUgcmVnX2NvbmZpZ19yd19jbGtfY3RybF9fX2RtYTY3X19fbHNiIDYKKyNkZWZpbmUgcmVnX2NvbmZpZ19yd19jbGtfY3RybF9fX2RtYTY3X19fd2lkdGggMQorI2RlZmluZSByZWdfY29uZmlnX3J3X2Nsa19jdHJsX19fZG1hNjdfX19iaXQgNgorI2RlZmluZSByZWdfY29uZmlnX3J3X2Nsa19jdHJsX19fZG1hODlfc3RyY29wX19fbHNiIDcKKyNkZWZpbmUgcmVnX2NvbmZpZ19yd19jbGtfY3RybF9fX2RtYTg5X3N0cmNvcF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2NvbmZpZ19yd19jbGtfY3RybF9fX2RtYTg5X3N0cmNvcF9fX2JpdCA3CisjZGVmaW5lIHJlZ19jb25maWdfcndfY2xrX2N0cmxfX19iaWZfX19sc2IgOAorI2RlZmluZSByZWdfY29uZmlnX3J3X2Nsa19jdHJsX19fYmlmX19fd2lkdGggMQorI2RlZmluZSByZWdfY29uZmlnX3J3X2Nsa19jdHJsX19fYmlmX19fYml0IDgKKyNkZWZpbmUgcmVnX2NvbmZpZ19yd19jbGtfY3RybF9fX2ZpeF9pb19fX2xzYiA5CisjZGVmaW5lIHJlZ19jb25maWdfcndfY2xrX2N0cmxfX19maXhfaW9fX193aWR0aCAxCisjZGVmaW5lIHJlZ19jb25maWdfcndfY2xrX2N0cmxfX19maXhfaW9fX19iaXQgOQorI2RlZmluZSByZWdfY29uZmlnX3J3X2Nsa19jdHJsX29mZnNldCA0CisKKy8qIFJlZ2lzdGVyIHJ3X3BhZF9jdHJsLCBzY29wZSBjb25maWcsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2NvbmZpZ19yd19wYWRfY3RybF9fX3VzYl9zdXNwX19fbHNiIDAKKyNkZWZpbmUgcmVnX2NvbmZpZ19yd19wYWRfY3RybF9fX3VzYl9zdXNwX19fd2lkdGggMQorI2RlZmluZSByZWdfY29uZmlnX3J3X3BhZF9jdHJsX19fdXNiX3N1c3BfX19iaXQgMAorI2RlZmluZSByZWdfY29uZmlnX3J3X3BhZF9jdHJsX19fcGh5cnN0X25fX19sc2IgMQorI2RlZmluZSByZWdfY29uZmlnX3J3X3BhZF9jdHJsX19fcGh5cnN0X25fX193aWR0aCAxCisjZGVmaW5lIHJlZ19jb25maWdfcndfcGFkX2N0cmxfX19waHlyc3Rfbl9fX2JpdCAxCisjZGVmaW5lIHJlZ19jb25maWdfcndfcGFkX2N0cmxfb2Zmc2V0IDgKKworCisvKiBDb25zdGFudHMgKi8KKyNkZWZpbmUgcmVna19jb25maWdfYncxNiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2NvbmZpZ19idzMyICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfY29uZmlnX21hc3RlciAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgcmVna19jb25maWdfbmFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSByZWdrX2NvbmZpZ19uZXRfcnggICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfY29uZmlnX25ldF90eF9yeCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgcmVna19jb25maWdfbm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2NvbmZpZ19ub25lICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIHJlZ2tfY29uZmlnX25vciAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19jb25maWdfcndfY2xrX2N0cmxfZGVmYXVsdCAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX2NvbmZpZ19yd19wYWRfY3RybF9kZWZhdWx0ICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfY29uZmlnX3NlciAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgcmVna19jb25maWdfc2xhdmUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgorI2RlZmluZSByZWdrX2NvbmZpZ195ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZW5kaWYgLyogX19jb25maWdfZGVmc19hc21faCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2h3cmVncy9hc20vZ2lvX2RlZnNfYXNtLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdyZWdzL2FzbS9naW9fZGVmc19hc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTRjNjM5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2h3cmVncy9hc20vZ2lvX2RlZnNfYXNtLmgKQEAgLTAsMCArMSwyNzYgQEAKKyNpZm5kZWYgX19naW9fZGVmc19hc21faAorI2RlZmluZSBfX2dpb19kZWZzX2FzbV9oCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCisgKiAgIGZpbGU6ICAgICAgICAgICAuLi8uLi9pbnN0L2dpby9ydGwvZ2lvX3JlZ3MucgorICogICAgIGlkOiAgICAgICAgICAgZ2lvX3JlZ3Mucix2IDEuNSAyMDA1LzAyLzA0IDA5OjQzOjIxIHBlcnogRXhwIAorICogICAgIGxhc3QgbW9kZmllZDogTW9uIEFwciAxMSAxNjowNzo0NyAyMDA1CisgKiAKKyAqICAgYnkgL24vYXNpYy9kZXNpZ24vdG9vbHMvcmRlc2Mvc3JjL3JkZXMyYyAtYXNtIC0tb3V0ZmlsZSBhc20vZ2lvX2RlZnNfYXNtLmggLi4vLi4vaW5zdC9naW8vcnRsL2dpb19yZWdzLnIKKyAqICAgICAgaWQ6ICRJZDogZ2lvX2RlZnNfYXNtLmgsdiAxLjEgMjAwNy8wMi8xMyAxMTo1NTozMCBzdGFydmlrIEV4cCAkCisgKiBBbnkgY2hhbmdlcyBoZXJlIHdpbGwgYmUgbG9zdC4KKyAqCisgKiAtKi0gYnVmZmVyLXJlYWQtb25seTogdCAtKi0KKyAqLworCisjaWZuZGVmIFJFR19GSUVMRAorI2RlZmluZSBSRUdfRklFTEQoIHNjb3BlLCByZWcsIGZpZWxkLCB2YWx1ZSApIFwKKyAgUkVHX0ZJRUxEX1hfKCB2YWx1ZSwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX0ZJRUxEX1hfKCB2YWx1ZSwgc2hpZnQgKSAoKHZhbHVlKSA8PCBzaGlmdCkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19TVEFURQorI2RlZmluZSBSRUdfU1RBVEUoIHNjb3BlLCByZWcsIGZpZWxkLCBzeW1ib2xpY192YWx1ZSApIFwKKyAgUkVHX1NUQVRFX1hfKCByZWdrXyMjc2NvcGUjI18jI3N5bWJvbGljX3ZhbHVlLCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX19sc2IgKQorI2RlZmluZSBSRUdfU1RBVEVfWF8oIGssIHNoaWZ0ICkgKGsgPDwgc2hpZnQpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfTUFTSworI2RlZmluZSBSRUdfTUFTSyggc2NvcGUsIHJlZywgZmllbGQgKSBcCisgIFJFR19NQVNLX1hfKCByZWdfIyNzY29wZSMjXyMjcmVnIyNfX18jI2ZpZWxkIyNfX193aWR0aCwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX01BU0tfWF8oIHdpZHRoLCBsc2IgKSAoKCgxIDw8IHdpZHRoKS0xKSA8PCBsc2IpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfTFNCCisjZGVmaW5lIFJFR19MU0IoIHNjb3BlLCByZWcsIGZpZWxkICkgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQklUCisjZGVmaW5lIFJFR19CSVQoIHNjb3BlLCByZWcsIGZpZWxkICkgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fYml0CisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUgorI2RlZmluZSBSRUdfQUREUiggc2NvcGUsIGluc3QsIHJlZyApIFJFR19BRERSX1hfKGluc3QsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19vZmZzZXQpCisjZGVmaW5lIFJFR19BRERSX1hfKCBpbnN0LCBvZmZzICkgKChpbnN0KSArIG9mZnMpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUl9WRUNUCisjZGVmaW5lIFJFR19BRERSX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICAgICAgICAgUkVHX0FERFJfVkVDVF9YXyhpbnN0LCByZWdfIyNzY29wZSMjXyMjcmVnIyNfb2Zmc2V0LCBpbmRleCwgXAorCQkJIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2RlZmluZSBSRUdfQUREUl9WRUNUX1hfKCBpbnN0LCBvZmZzLCBpbmRleCwgc3RyaWRlICkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKGluc3QpICsgb2ZmcyArIChpbmRleCkgKiBzdHJpZGUpCisjZW5kaWYKKworLyogUmVnaXN0ZXIgcndfcGFfZG91dCwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19naW9fcndfcGFfZG91dF9fX2RhdGFfX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3J3X3BhX2RvdXRfX19kYXRhX19fd2lkdGggOAorI2RlZmluZSByZWdfZ2lvX3J3X3BhX2RvdXRfb2Zmc2V0IDAKKworLyogUmVnaXN0ZXIgcl9wYV9kaW4sIHNjb3BlIGdpbywgdHlwZSByICovCisjZGVmaW5lIHJlZ19naW9fcl9wYV9kaW5fX19kYXRhX19fbHNiIDAKKyNkZWZpbmUgcmVnX2dpb19yX3BhX2Rpbl9fX2RhdGFfX193aWR0aCA4CisjZGVmaW5lIHJlZ19naW9fcl9wYV9kaW5fb2Zmc2V0IDQKKworLyogUmVnaXN0ZXIgcndfcGFfb2UsIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X3BhX29lX19fb2VfX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3J3X3BhX29lX19fb2VfX193aWR0aCA4CisjZGVmaW5lIHJlZ19naW9fcndfcGFfb2Vfb2Zmc2V0IDgKKworLyogUmVnaXN0ZXIgcndfaW50cl9jZmcsIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfY2ZnX19fcGEwX19fbHNiIDAKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX2NmZ19fX3BhMF9fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX2NmZ19fX3BhMV9fX2xzYiAzCisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9jZmdfX19wYTFfX193aWR0aCAzCisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9jZmdfX19wYTJfX19sc2IgNgorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfY2ZnX19fcGEyX19fd2lkdGggMworI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfY2ZnX19fcGEzX19fbHNiIDkKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX2NmZ19fX3BhM19fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX2NmZ19fX3BhNF9fX2xzYiAxMgorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfY2ZnX19fcGE0X19fd2lkdGggMworI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfY2ZnX19fcGE1X19fbHNiIDE1CisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9jZmdfX19wYTVfX193aWR0aCAzCisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9jZmdfX19wYTZfX19sc2IgMTgKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX2NmZ19fX3BhNl9fX3dpZHRoIDMKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX2NmZ19fX3BhN19fX2xzYiAyMQorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfY2ZnX19fcGE3X19fd2lkdGggMworI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfY2ZnX29mZnNldCAxMgorCisvKiBSZWdpc3RlciByd19pbnRyX21hc2ssIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfbWFza19fX3BhMF9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9tYXNrX19fcGEwX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfbWFza19fX3BhMF9fX2JpdCAwCisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9tYXNrX19fcGExX19fbHNiIDEKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX21hc2tfX19wYTFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9tYXNrX19fcGExX19fYml0IDEKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX21hc2tfX19wYTJfX19sc2IgMgorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfbWFza19fX3BhMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX21hc2tfX19wYTJfX19iaXQgMgorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfbWFza19fX3BhM19fX2xzYiAzCisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9tYXNrX19fcGEzX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfbWFza19fX3BhM19fX2JpdCAzCisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9tYXNrX19fcGE0X19fbHNiIDQKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX21hc2tfX19wYTRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9tYXNrX19fcGE0X19fYml0IDQKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX21hc2tfX19wYTVfX19sc2IgNQorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfbWFza19fX3BhNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX21hc2tfX19wYTVfX19iaXQgNQorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfbWFza19fX3BhNl9fX2xzYiA2CisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9tYXNrX19fcGE2X19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2ludHJfbWFza19fX3BhNl9fX2JpdCA2CisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9tYXNrX19fcGE3X19fbHNiIDcKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX21hc2tfX19wYTdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfaW50cl9tYXNrX19fcGE3X19fYml0IDcKKyNkZWZpbmUgcmVnX2dpb19yd19pbnRyX21hc2tfb2Zmc2V0IDE2CisKKy8qIFJlZ2lzdGVyIHJ3X2Fja19pbnRyLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2dpb19yd19hY2tfaW50cl9fX3BhMF9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfYWNrX2ludHJfX19wYTBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfYWNrX2ludHJfX19wYTBfX19iaXQgMAorI2RlZmluZSByZWdfZ2lvX3J3X2Fja19pbnRyX19fcGExX19fbHNiIDEKKyNkZWZpbmUgcmVnX2dpb19yd19hY2tfaW50cl9fX3BhMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19hY2tfaW50cl9fX3BhMV9fX2JpdCAxCisjZGVmaW5lIHJlZ19naW9fcndfYWNrX2ludHJfX19wYTJfX19sc2IgMgorI2RlZmluZSByZWdfZ2lvX3J3X2Fja19pbnRyX19fcGEyX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2Fja19pbnRyX19fcGEyX19fYml0IDIKKyNkZWZpbmUgcmVnX2dpb19yd19hY2tfaW50cl9fX3BhM19fX2xzYiAzCisjZGVmaW5lIHJlZ19naW9fcndfYWNrX2ludHJfX19wYTNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfYWNrX2ludHJfX19wYTNfX19iaXQgMworI2RlZmluZSByZWdfZ2lvX3J3X2Fja19pbnRyX19fcGE0X19fbHNiIDQKKyNkZWZpbmUgcmVnX2dpb19yd19hY2tfaW50cl9fX3BhNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19hY2tfaW50cl9fX3BhNF9fX2JpdCA0CisjZGVmaW5lIHJlZ19naW9fcndfYWNrX2ludHJfX19wYTVfX19sc2IgNQorI2RlZmluZSByZWdfZ2lvX3J3X2Fja19pbnRyX19fcGE1X19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3J3X2Fja19pbnRyX19fcGE1X19fYml0IDUKKyNkZWZpbmUgcmVnX2dpb19yd19hY2tfaW50cl9fX3BhNl9fX2xzYiA2CisjZGVmaW5lIHJlZ19naW9fcndfYWNrX2ludHJfX19wYTZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcndfYWNrX2ludHJfX19wYTZfX19iaXQgNgorI2RlZmluZSByZWdfZ2lvX3J3X2Fja19pbnRyX19fcGE3X19fbHNiIDcKKyNkZWZpbmUgcmVnX2dpb19yd19hY2tfaW50cl9fX3BhN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yd19hY2tfaW50cl9fX3BhN19fX2JpdCA3CisjZGVmaW5lIHJlZ19naW9fcndfYWNrX2ludHJfb2Zmc2V0IDIwCisKKy8qIFJlZ2lzdGVyIHJfaW50ciwgc2NvcGUgZ2lvLCB0eXBlIHIgKi8KKyNkZWZpbmUgcmVnX2dpb19yX2ludHJfX19wYTBfX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3JfaW50cl9fX3BhMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yX2ludHJfX19wYTBfX19iaXQgMAorI2RlZmluZSByZWdfZ2lvX3JfaW50cl9fX3BhMV9fX2xzYiAxCisjZGVmaW5lIHJlZ19naW9fcl9pbnRyX19fcGExX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3JfaW50cl9fX3BhMV9fX2JpdCAxCisjZGVmaW5lIHJlZ19naW9fcl9pbnRyX19fcGEyX19fbHNiIDIKKyNkZWZpbmUgcmVnX2dpb19yX2ludHJfX19wYTJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcl9pbnRyX19fcGEyX19fYml0IDIKKyNkZWZpbmUgcmVnX2dpb19yX2ludHJfX19wYTNfX19sc2IgMworI2RlZmluZSByZWdfZ2lvX3JfaW50cl9fX3BhM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yX2ludHJfX19wYTNfX19iaXQgMworI2RlZmluZSByZWdfZ2lvX3JfaW50cl9fX3BhNF9fX2xzYiA0CisjZGVmaW5lIHJlZ19naW9fcl9pbnRyX19fcGE0X19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3JfaW50cl9fX3BhNF9fX2JpdCA0CisjZGVmaW5lIHJlZ19naW9fcl9pbnRyX19fcGE1X19fbHNiIDUKKyNkZWZpbmUgcmVnX2dpb19yX2ludHJfX19wYTVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcl9pbnRyX19fcGE1X19fYml0IDUKKyNkZWZpbmUgcmVnX2dpb19yX2ludHJfX19wYTZfX19sc2IgNgorI2RlZmluZSByZWdfZ2lvX3JfaW50cl9fX3BhNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yX2ludHJfX19wYTZfX19iaXQgNgorI2RlZmluZSByZWdfZ2lvX3JfaW50cl9fX3BhN19fX2xzYiA3CisjZGVmaW5lIHJlZ19naW9fcl9pbnRyX19fcGE3X19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3JfaW50cl9fX3BhN19fX2JpdCA3CisjZGVmaW5lIHJlZ19naW9fcl9pbnRyX29mZnNldCAyNAorCisvKiBSZWdpc3RlciByX21hc2tlZF9pbnRyLCBzY29wZSBnaW8sIHR5cGUgciAqLworI2RlZmluZSByZWdfZ2lvX3JfbWFza2VkX2ludHJfX19wYTBfX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3JfbWFza2VkX2ludHJfX19wYTBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcl9tYXNrZWRfaW50cl9fX3BhMF9fX2JpdCAwCisjZGVmaW5lIHJlZ19naW9fcl9tYXNrZWRfaW50cl9fX3BhMV9fX2xzYiAxCisjZGVmaW5lIHJlZ19naW9fcl9tYXNrZWRfaW50cl9fX3BhMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yX21hc2tlZF9pbnRyX19fcGExX19fYml0IDEKKyNkZWZpbmUgcmVnX2dpb19yX21hc2tlZF9pbnRyX19fcGEyX19fbHNiIDIKKyNkZWZpbmUgcmVnX2dpb19yX21hc2tlZF9pbnRyX19fcGEyX19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3JfbWFza2VkX2ludHJfX19wYTJfX19iaXQgMgorI2RlZmluZSByZWdfZ2lvX3JfbWFza2VkX2ludHJfX19wYTNfX19sc2IgMworI2RlZmluZSByZWdfZ2lvX3JfbWFza2VkX2ludHJfX19wYTNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcl9tYXNrZWRfaW50cl9fX3BhM19fX2JpdCAzCisjZGVmaW5lIHJlZ19naW9fcl9tYXNrZWRfaW50cl9fX3BhNF9fX2xzYiA0CisjZGVmaW5lIHJlZ19naW9fcl9tYXNrZWRfaW50cl9fX3BhNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yX21hc2tlZF9pbnRyX19fcGE0X19fYml0IDQKKyNkZWZpbmUgcmVnX2dpb19yX21hc2tlZF9pbnRyX19fcGE1X19fbHNiIDUKKyNkZWZpbmUgcmVnX2dpb19yX21hc2tlZF9pbnRyX19fcGE1X19fd2lkdGggMQorI2RlZmluZSByZWdfZ2lvX3JfbWFza2VkX2ludHJfX19wYTVfX19iaXQgNQorI2RlZmluZSByZWdfZ2lvX3JfbWFza2VkX2ludHJfX19wYTZfX19sc2IgNgorI2RlZmluZSByZWdfZ2lvX3JfbWFza2VkX2ludHJfX19wYTZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19naW9fcl9tYXNrZWRfaW50cl9fX3BhNl9fX2JpdCA2CisjZGVmaW5lIHJlZ19naW9fcl9tYXNrZWRfaW50cl9fX3BhN19fX2xzYiA3CisjZGVmaW5lIHJlZ19naW9fcl9tYXNrZWRfaW50cl9fX3BhN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX2dpb19yX21hc2tlZF9pbnRyX19fcGE3X19fYml0IDcKKyNkZWZpbmUgcmVnX2dpb19yX21hc2tlZF9pbnRyX29mZnNldCAyOAorCisvKiBSZWdpc3RlciByd19wYl9kb3V0LCBzY29wZSBnaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2dpb19yd19wYl9kb3V0X19fZGF0YV9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfcGJfZG91dF9fX2RhdGFfX193aWR0aCAxOAorI2RlZmluZSByZWdfZ2lvX3J3X3BiX2RvdXRfb2Zmc2V0IDMyCisKKy8qIFJlZ2lzdGVyIHJfcGJfZGluLCBzY29wZSBnaW8sIHR5cGUgciAqLworI2RlZmluZSByZWdfZ2lvX3JfcGJfZGluX19fZGF0YV9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcl9wYl9kaW5fX19kYXRhX19fd2lkdGggMTgKKyNkZWZpbmUgcmVnX2dpb19yX3BiX2Rpbl9vZmZzZXQgMzYKKworLyogUmVnaXN0ZXIgcndfcGJfb2UsIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X3BiX29lX19fb2VfX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3J3X3BiX29lX19fb2VfX193aWR0aCAxOAorI2RlZmluZSByZWdfZ2lvX3J3X3BiX29lX29mZnNldCA0MAorCisvKiBSZWdpc3RlciByd19wY19kb3V0LCBzY29wZSBnaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2dpb19yd19wY19kb3V0X19fZGF0YV9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfcGNfZG91dF9fX2RhdGFfX193aWR0aCAxOAorI2RlZmluZSByZWdfZ2lvX3J3X3BjX2RvdXRfb2Zmc2V0IDQ4CisKKy8qIFJlZ2lzdGVyIHJfcGNfZGluLCBzY29wZSBnaW8sIHR5cGUgciAqLworI2RlZmluZSByZWdfZ2lvX3JfcGNfZGluX19fZGF0YV9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcl9wY19kaW5fX19kYXRhX19fd2lkdGggMTgKKyNkZWZpbmUgcmVnX2dpb19yX3BjX2Rpbl9vZmZzZXQgNTIKKworLyogUmVnaXN0ZXIgcndfcGNfb2UsIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X3BjX29lX19fb2VfX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3J3X3BjX29lX19fb2VfX193aWR0aCAxOAorI2RlZmluZSByZWdfZ2lvX3J3X3BjX29lX29mZnNldCA1NgorCisvKiBSZWdpc3RlciByd19wZF9kb3V0LCBzY29wZSBnaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2dpb19yd19wZF9kb3V0X19fZGF0YV9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfcGRfZG91dF9fX2RhdGFfX193aWR0aCAxOAorI2RlZmluZSByZWdfZ2lvX3J3X3BkX2RvdXRfb2Zmc2V0IDY0CisKKy8qIFJlZ2lzdGVyIHJfcGRfZGluLCBzY29wZSBnaW8sIHR5cGUgciAqLworI2RlZmluZSByZWdfZ2lvX3JfcGRfZGluX19fZGF0YV9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcl9wZF9kaW5fX19kYXRhX19fd2lkdGggMTgKKyNkZWZpbmUgcmVnX2dpb19yX3BkX2Rpbl9vZmZzZXQgNjgKKworLyogUmVnaXN0ZXIgcndfcGRfb2UsIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X3BkX29lX19fb2VfX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3J3X3BkX29lX19fb2VfX193aWR0aCAxOAorI2RlZmluZSByZWdfZ2lvX3J3X3BkX29lX29mZnNldCA3MgorCisvKiBSZWdpc3RlciByd19wZV9kb3V0LCBzY29wZSBnaW8sIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX2dpb19yd19wZV9kb3V0X19fZGF0YV9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcndfcGVfZG91dF9fX2RhdGFfX193aWR0aCAxOAorI2RlZmluZSByZWdfZ2lvX3J3X3BlX2RvdXRfb2Zmc2V0IDgwCisKKy8qIFJlZ2lzdGVyIHJfcGVfZGluLCBzY29wZSBnaW8sIHR5cGUgciAqLworI2RlZmluZSByZWdfZ2lvX3JfcGVfZGluX19fZGF0YV9fX2xzYiAwCisjZGVmaW5lIHJlZ19naW9fcl9wZV9kaW5fX19kYXRhX19fd2lkdGggMTgKKyNkZWZpbmUgcmVnX2dpb19yX3BlX2Rpbl9vZmZzZXQgODQKKworLyogUmVnaXN0ZXIgcndfcGVfb2UsIHNjb3BlIGdpbywgdHlwZSBydyAqLworI2RlZmluZSByZWdfZ2lvX3J3X3BlX29lX19fb2VfX19sc2IgMAorI2RlZmluZSByZWdfZ2lvX3J3X3BlX29lX19fb2VfX193aWR0aCAxOAorI2RlZmluZSByZWdfZ2lvX3J3X3BlX29lX29mZnNldCA4OAorCisKKy8qIENvbnN0YW50cyAqLworI2RlZmluZSByZWdrX2dpb19hbnllZGdlICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIHJlZ2tfZ2lvX2hpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna19naW9fbG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSByZWdrX2dpb19uZWdlZGdlICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2CisjZGVmaW5lIHJlZ2tfZ2lvX25vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19naW9fb2ZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2dpb19wb3NlZGdlICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA1CisjZGVmaW5lIHJlZ2tfZ2lvX3J3X2ludHJfY2ZnX2RlZmF1bHQgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19naW9fcndfaW50cl9tYXNrX2RlZmF1bHQgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2dpb19yd19wYV9vZV9kZWZhdWx0ICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfZ2lvX3J3X3BiX29lX2RlZmF1bHQgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19naW9fcndfcGNfb2VfZGVmYXVsdCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX2dpb19yd19wZF9vZV9kZWZhdWx0ICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfZ2lvX3J3X3BlX29lX2RlZmF1bHQgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19naW9fc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSByZWdrX2dpb195ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZW5kaWYgLyogX19naW9fZGVmc19hc21faCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2h3cmVncy9hc20vcGlubXV4X2RlZnNfYXNtLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdyZWdzL2FzbS9waW5tdXhfZGVmc19hc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGNmNWE5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2h3cmVncy9hc20vcGlubXV4X2RlZnNfYXNtLmgKQEAgLTAsMCArMSw2MzIgQEAKKyNpZm5kZWYgX19waW5tdXhfZGVmc19hc21faAorI2RlZmluZSBfX3Bpbm11eF9kZWZzX2FzbV9oCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCisgKiAgIGZpbGU6ICAgICAgICAgICAuLi8uLi9pbnN0L3Bpbm11eC9ydGwvZ3Vpbm5lc3MvcGlubXV4X3JlZ3MucgorICogICAgIGlkOiAgICAgICAgICAgcGlubXV4X3JlZ3Mucix2IDEuNDAgMjAwNS8wMi8wOSAxNjoyMjo1OSBwZXJ6IEV4cCAKKyAqICAgICBsYXN0IG1vZGZpZWQ6IE1vbiBBcHIgMTEgMTY6MDk6MTEgMjAwNQorICogCisgKiAgIGJ5IC9uL2FzaWMvZGVzaWduL3Rvb2xzL3JkZXNjL3NyYy9yZGVzMmMgLWFzbSAtLW91dGZpbGUgYXNtL3Bpbm11eF9kZWZzX2FzbS5oIC4uLy4uL2luc3QvcGlubXV4L3J0bC9ndWlubmVzcy9waW5tdXhfcmVncy5yCisgKiAgICAgIGlkOiAkSWQ6IHBpbm11eF9kZWZzX2FzbS5oLHYgMS4xIDIwMDcvMDQvMTEgMTE6MDA6MzkgcmljYXJkdyBFeHAgJAorICogQW55IGNoYW5nZXMgaGVyZSB3aWxsIGJlIGxvc3QuCisgKgorICogLSotIGJ1ZmZlci1yZWFkLW9ubHk6IHQgLSotCisgKi8KKworI2lmbmRlZiBSRUdfRklFTEQKKyNkZWZpbmUgUkVHX0ZJRUxEKCBzY29wZSwgcmVnLCBmaWVsZCwgdmFsdWUgKSBcCisgIFJFR19GSUVMRF9YXyggdmFsdWUsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19fXyMjZmllbGQjI19fX2xzYiApCisjZGVmaW5lIFJFR19GSUVMRF9YXyggdmFsdWUsIHNoaWZ0ICkgKCh2YWx1ZSkgPDwgc2hpZnQpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfU1RBVEUKKyNkZWZpbmUgUkVHX1NUQVRFKCBzY29wZSwgcmVnLCBmaWVsZCwgc3ltYm9saWNfdmFsdWUgKSBcCisgIFJFR19TVEFURV9YXyggcmVna18jI3Njb3BlIyNfIyNzeW1ib2xpY192YWx1ZSwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX1NUQVRFX1hfKCBrLCBzaGlmdCApIChrIDw8IHNoaWZ0KQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX01BU0sKKyNkZWZpbmUgUkVHX01BU0soIHNjb3BlLCByZWcsIGZpZWxkICkgXAorICBSRUdfTUFTS19YXyggcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fd2lkdGgsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19fXyMjZmllbGQjI19fX2xzYiApCisjZGVmaW5lIFJFR19NQVNLX1hfKCB3aWR0aCwgbHNiICkgKCgoMSA8PCB3aWR0aCktMSkgPDwgbHNiKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0xTQgorI2RlZmluZSBSRUdfTFNCKCBzY29wZSwgcmVnLCBmaWVsZCApIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19fXyMjZmllbGQjI19fX2xzYgorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0JJVAorI2RlZmluZSBSRUdfQklUKCBzY29wZSwgcmVnLCBmaWVsZCApIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19fXyMjZmllbGQjI19fX2JpdAorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFIKKyNkZWZpbmUgUkVHX0FERFIoIHNjb3BlLCBpbnN0LCByZWcgKSBSRUdfQUREUl9YXyhpbnN0LCByZWdfIyNzY29wZSMjXyMjcmVnIyNfb2Zmc2V0KQorI2RlZmluZSBSRUdfQUREUl9YXyggaW5zdCwgb2ZmcyApICgoaW5zdCkgKyBvZmZzKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFJfVkVDVAorI2RlZmluZSBSRUdfQUREUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgICAgICAgIFJFR19BRERSX1ZFQ1RfWF8oaW5zdCwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX29mZnNldCwgaW5kZXgsIFwKKwkJCSBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNkZWZpbmUgUkVHX0FERFJfVkVDVF9YXyggaW5zdCwgb2ZmcywgaW5kZXgsIHN0cmlkZSApIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnN0KSArIG9mZnMgKyAoaW5kZXgpICogc3RyaWRlKQorI2VuZGlmCisKKy8qIFJlZ2lzdGVyIHJ3X3BhLCBzY29wZSBwaW5tdXgsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYV9fX3BhMF9fX2xzYiAwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGFfX19wYTBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGFfX19wYTBfX19iaXQgMAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BhX19fcGExX19fbHNiIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYV9fX3BhMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYV9fX3BhMV9fX2JpdCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGFfX19wYTJfX19sc2IgMgorI2RlZmluZSByZWdfcGlubXV4X3J3X3BhX19fcGEyX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BhX19fcGEyX19fYml0IDIKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYV9fX3BhM19fX2xzYiAzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGFfX19wYTNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGFfX19wYTNfX19iaXQgMworI2RlZmluZSByZWdfcGlubXV4X3J3X3BhX19fcGE0X19fbHNiIDQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYV9fX3BhNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYV9fX3BhNF9fX2JpdCA0CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGFfX19wYTVfX19sc2IgNQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BhX19fcGE1X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BhX19fcGE1X19fYml0IDUKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYV9fX3BhNl9fX2xzYiA2CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGFfX19wYTZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGFfX19wYTZfX19iaXQgNgorI2RlZmluZSByZWdfcGlubXV4X3J3X3BhX19fcGE3X19fbHNiIDcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYV9fX3BhN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYV9fX3BhN19fX2JpdCA3CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGFfX19jc3AyX25fX19sc2IgOAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BhX19fY3NwMl9uX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BhX19fY3NwMl9uX19fYml0IDgKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYV9fX2NzcDNfbl9fX2xzYiA5CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGFfX19jc3AzX25fX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGFfX19jc3AzX25fX19iaXQgOQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BhX19fY3NwNV9uX19fbHNiIDEwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGFfX19jc3A1X25fX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGFfX19jc3A1X25fX19iaXQgMTAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYV9fX2NzcDZfbl9fX2xzYiAxMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BhX19fY3NwNl9uX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BhX19fY3NwNl9uX19fYml0IDExCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGFfX19oc2g0X19fbHNiIDEyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGFfX19oc2g0X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BhX19faHNoNF9fX2JpdCAxMgorI2RlZmluZSByZWdfcGlubXV4X3J3X3BhX19faHNoNV9fX2xzYiAxMworI2RlZmluZSByZWdfcGlubXV4X3J3X3BhX19faHNoNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYV9fX2hzaDVfX19iaXQgMTMKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYV9fX2hzaDZfX19sc2IgMTQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYV9fX2hzaDZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGFfX19oc2g2X19fYml0IDE0CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGFfX19oc2g3X19fbHNiIDE1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGFfX19oc2g3X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BhX19faHNoN19fX2JpdCAxNQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BhX29mZnNldCAwCisKKy8qIFJlZ2lzdGVyIHJ3X2h3cHJvdCwgc2NvcGUgcGlubXV4LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fc2VyMV9fX2xzYiAwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fc2VyMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19zZXIxX19fYml0IDAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19zZXIyX19fbHNiIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19zZXIyX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX3NlcjJfX19iaXQgMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX3NlcjNfX19sc2IgMgorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX3NlcjNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fc2VyM19fX2JpdCAyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fc3NlcjBfX19sc2IgMworI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX3NzZXIwX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX3NzZXIwX19fYml0IDMKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19zc2VyMV9fX2xzYiA0CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fc3NlcjFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fc3NlcjFfX19iaXQgNAorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX2F0YTBfX19sc2IgNQorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX2F0YTBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fYXRhMF9fX2JpdCA1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fYXRhMV9fX2xzYiA2CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fYXRhMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19hdGExX19fYml0IDYKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19hdGEyX19fbHNiIDcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19hdGEyX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX2F0YTJfX19iaXQgNworI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX2F0YTNfX19sc2IgOAorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX2F0YTNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fYXRhM19fX2JpdCA4CisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fYXRhX19fbHNiIDkKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19hdGFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fYXRhX19fYml0IDkKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19ldGgxX19fbHNiIDEwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fZXRoMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19ldGgxX19fYml0IDEwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fZXRoMV9tZ21fX19sc2IgMTEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19ldGgxX21nbV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19ldGgxX21nbV9fX2JpdCAxMQorI2RlZmluZSByZWdfcGlubXV4X3J3X2h3cHJvdF9fX3RpbWVyX19fbHNiIDEyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fdGltZXJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fdGltZXJfX19iaXQgMTIKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19wMjFfX19sc2IgMTMKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19od3Byb3RfX19wMjFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X19fcDIxX19fYml0IDEzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfaHdwcm90X29mZnNldCA0CisKKy8qIFJlZ2lzdGVyIHJ3X3BiX2dpbywgc2NvcGUgcGlubXV4LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfZ2lvX19fcGIwX19fbHNiIDAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9naW9fX19wYjBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfZ2lvX19fcGIwX19fYml0IDAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9naW9fX19wYjFfX19sc2IgMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2dpb19fX3BiMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9naW9fX19wYjFfX19iaXQgMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2dpb19fX3BiMl9fX2xzYiAyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfZ2lvX19fcGIyX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2dpb19fX3BiMl9fX2JpdCAyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfZ2lvX19fcGIzX19fbHNiIDMKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9naW9fX19wYjNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfZ2lvX19fcGIzX19fYml0IDMKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9naW9fX19wYjRfX19sc2IgNAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2dpb19fX3BiNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9naW9fX19wYjRfX19iaXQgNAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2dpb19fX3BiNV9fX2xzYiA1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfZ2lvX19fcGI1X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2dpb19fX3BiNV9fX2JpdCA1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfZ2lvX19fcGI2X19fbHNiIDYKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9naW9fX19wYjZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfZ2lvX19fcGI2X19fYml0IDYKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9naW9fX19wYjdfX19sc2IgNworI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2dpb19fX3BiN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9naW9fX19wYjdfX19iaXQgNworI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2dpb19fX3BiOF9fX2xzYiA4CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfZ2lvX19fcGI4X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2dpb19fX3BiOF9fX2JpdCA4CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfZ2lvX19fcGI5X19fbHNiIDkKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9naW9fX19wYjlfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfZ2lvX19fcGI5X19fYml0IDkKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9naW9fX19wYjEwX19fbHNiIDEwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfZ2lvX19fcGIxMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9naW9fX19wYjEwX19fYml0IDEwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfZ2lvX19fcGIxMV9fX2xzYiAxMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2dpb19fX3BiMTFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfZ2lvX19fcGIxMV9fX2JpdCAxMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2dpb19fX3BiMTJfX19sc2IgMTIKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9naW9fX19wYjEyX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2dpb19fX3BiMTJfX19iaXQgMTIKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9naW9fX19wYjEzX19fbHNiIDEzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfZ2lvX19fcGIxM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9naW9fX19wYjEzX19fYml0IDEzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfZ2lvX19fcGIxNF9fX2xzYiAxNAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2dpb19fX3BiMTRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfZ2lvX19fcGIxNF9fX2JpdCAxNAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2dpb19fX3BiMTVfX19sc2IgMTUKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9naW9fX19wYjE1X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2dpb19fX3BiMTVfX19iaXQgMTUKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9naW9fX19wYjE2X19fbHNiIDE2CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfZ2lvX19fcGIxNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9naW9fX19wYjE2X19fYml0IDE2CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfZ2lvX19fcGIxN19fX2xzYiAxNworI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2dpb19fX3BiMTdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfZ2lvX19fcGIxN19fX2JpdCAxNworI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2dpb19vZmZzZXQgOAorCisvKiBSZWdpc3RlciByd19wYl9pb3AsIHNjb3BlIHBpbm11eCwgdHlwZSBydyAqLworI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2lvcF9fX3BiMF9fX2xzYiAwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfaW9wX19fcGIwX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2lvcF9fX3BiMF9fX2JpdCAwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfaW9wX19fcGIxX19fbHNiIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9pb3BfX19wYjFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfaW9wX19fcGIxX19fYml0IDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9pb3BfX19wYjJfX19sc2IgMgorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2lvcF9fX3BiMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9pb3BfX19wYjJfX19iaXQgMgorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2lvcF9fX3BiM19fX2xzYiAzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfaW9wX19fcGIzX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2lvcF9fX3BiM19fX2JpdCAzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfaW9wX19fcGI0X19fbHNiIDQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9pb3BfX19wYjRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfaW9wX19fcGI0X19fYml0IDQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9pb3BfX19wYjVfX19sc2IgNQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2lvcF9fX3BiNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9pb3BfX19wYjVfX19iaXQgNQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2lvcF9fX3BiNl9fX2xzYiA2CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfaW9wX19fcGI2X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2lvcF9fX3BiNl9fX2JpdCA2CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfaW9wX19fcGI3X19fbHNiIDcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9pb3BfX19wYjdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfaW9wX19fcGI3X19fYml0IDcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9pb3BfX19wYjhfX19sc2IgOAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2lvcF9fX3BiOF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9pb3BfX19wYjhfX19iaXQgOAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2lvcF9fX3BiOV9fX2xzYiA5CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfaW9wX19fcGI5X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2lvcF9fX3BiOV9fX2JpdCA5CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfaW9wX19fcGIxMF9fX2xzYiAxMAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2lvcF9fX3BiMTBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfaW9wX19fcGIxMF9fX2JpdCAxMAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2lvcF9fX3BiMTFfX19sc2IgMTEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9pb3BfX19wYjExX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2lvcF9fX3BiMTFfX19iaXQgMTEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9pb3BfX19wYjEyX19fbHNiIDEyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfaW9wX19fcGIxMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9pb3BfX19wYjEyX19fYml0IDEyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfaW9wX19fcGIxM19fX2xzYiAxMworI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2lvcF9fX3BiMTNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfaW9wX19fcGIxM19fX2JpdCAxMworI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2lvcF9fX3BiMTRfX19sc2IgMTQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9pb3BfX19wYjE0X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2lvcF9fX3BiMTRfX19iaXQgMTQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9pb3BfX19wYjE1X19fbHNiIDE1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfaW9wX19fcGIxNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9pb3BfX19wYjE1X19fYml0IDE1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfaW9wX19fcGIxNl9fX2xzYiAxNgorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2lvcF9fX3BiMTZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGJfaW9wX19fcGIxNl9fX2JpdCAxNgorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2lvcF9fX3BiMTdfX19sc2IgMTcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9pb3BfX19wYjE3X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BiX2lvcF9fX3BiMTdfX19iaXQgMTcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wYl9pb3Bfb2Zmc2V0IDEyCisKKy8qIFJlZ2lzdGVyIHJ3X3BjX2dpbywgc2NvcGUgcGlubXV4LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfZ2lvX19fcGMwX19fbHNiIDAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19naW9fX19wYzBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfZ2lvX19fcGMwX19fYml0IDAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19naW9fX19wYzFfX19sc2IgMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2dpb19fX3BjMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19naW9fX19wYzFfX19iaXQgMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2dpb19fX3BjMl9fX2xzYiAyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfZ2lvX19fcGMyX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2dpb19fX3BjMl9fX2JpdCAyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfZ2lvX19fcGMzX19fbHNiIDMKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19naW9fX19wYzNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfZ2lvX19fcGMzX19fYml0IDMKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19naW9fX19wYzRfX19sc2IgNAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2dpb19fX3BjNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19naW9fX19wYzRfX19iaXQgNAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2dpb19fX3BjNV9fX2xzYiA1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfZ2lvX19fcGM1X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2dpb19fX3BjNV9fX2JpdCA1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfZ2lvX19fcGM2X19fbHNiIDYKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19naW9fX19wYzZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfZ2lvX19fcGM2X19fYml0IDYKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19naW9fX19wYzdfX19sc2IgNworI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2dpb19fX3BjN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19naW9fX19wYzdfX19iaXQgNworI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2dpb19fX3BjOF9fX2xzYiA4CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfZ2lvX19fcGM4X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2dpb19fX3BjOF9fX2JpdCA4CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfZ2lvX19fcGM5X19fbHNiIDkKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19naW9fX19wYzlfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfZ2lvX19fcGM5X19fYml0IDkKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19naW9fX19wYzEwX19fbHNiIDEwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfZ2lvX19fcGMxMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19naW9fX19wYzEwX19fYml0IDEwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfZ2lvX19fcGMxMV9fX2xzYiAxMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2dpb19fX3BjMTFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfZ2lvX19fcGMxMV9fX2JpdCAxMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2dpb19fX3BjMTJfX19sc2IgMTIKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19naW9fX19wYzEyX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2dpb19fX3BjMTJfX19iaXQgMTIKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19naW9fX19wYzEzX19fbHNiIDEzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfZ2lvX19fcGMxM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19naW9fX19wYzEzX19fYml0IDEzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfZ2lvX19fcGMxNF9fX2xzYiAxNAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2dpb19fX3BjMTRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfZ2lvX19fcGMxNF9fX2JpdCAxNAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2dpb19fX3BjMTVfX19sc2IgMTUKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19naW9fX19wYzE1X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2dpb19fX3BjMTVfX19iaXQgMTUKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19naW9fX19wYzE2X19fbHNiIDE2CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfZ2lvX19fcGMxNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19naW9fX19wYzE2X19fYml0IDE2CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfZ2lvX19fcGMxN19fX2xzYiAxNworI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2dpb19fX3BjMTdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfZ2lvX19fcGMxN19fX2JpdCAxNworI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2dpb19vZmZzZXQgMTYKKworLyogUmVnaXN0ZXIgcndfcGNfaW9wLCBzY29wZSBwaW5tdXgsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19pb3BfX19wYzBfX19sc2IgMAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2lvcF9fX3BjMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19pb3BfX19wYzBfX19iaXQgMAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2lvcF9fX3BjMV9fX2xzYiAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfaW9wX19fcGMxX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2lvcF9fX3BjMV9fX2JpdCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfaW9wX19fcGMyX19fbHNiIDIKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19pb3BfX19wYzJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfaW9wX19fcGMyX19fYml0IDIKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19pb3BfX19wYzNfX19sc2IgMworI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2lvcF9fX3BjM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19pb3BfX19wYzNfX19iaXQgMworI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2lvcF9fX3BjNF9fX2xzYiA0CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfaW9wX19fcGM0X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2lvcF9fX3BjNF9fX2JpdCA0CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfaW9wX19fcGM1X19fbHNiIDUKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19pb3BfX19wYzVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfaW9wX19fcGM1X19fYml0IDUKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19pb3BfX19wYzZfX19sc2IgNgorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2lvcF9fX3BjNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19pb3BfX19wYzZfX19iaXQgNgorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2lvcF9fX3BjN19fX2xzYiA3CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfaW9wX19fcGM3X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2lvcF9fX3BjN19fX2JpdCA3CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfaW9wX19fcGM4X19fbHNiIDgKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19pb3BfX19wYzhfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfaW9wX19fcGM4X19fYml0IDgKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19pb3BfX19wYzlfX19sc2IgOQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2lvcF9fX3BjOV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19pb3BfX19wYzlfX19iaXQgOQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2lvcF9fX3BjMTBfX19sc2IgMTAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19pb3BfX19wYzEwX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2lvcF9fX3BjMTBfX19iaXQgMTAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19pb3BfX19wYzExX19fbHNiIDExCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfaW9wX19fcGMxMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19pb3BfX19wYzExX19fYml0IDExCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfaW9wX19fcGMxMl9fX2xzYiAxMgorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2lvcF9fX3BjMTJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfaW9wX19fcGMxMl9fX2JpdCAxMgorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2lvcF9fX3BjMTNfX19sc2IgMTMKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19pb3BfX19wYzEzX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2lvcF9fX3BjMTNfX19iaXQgMTMKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19pb3BfX19wYzE0X19fbHNiIDE0CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfaW9wX19fcGMxNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19pb3BfX19wYzE0X19fYml0IDE0CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfaW9wX19fcGMxNV9fX2xzYiAxNQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2lvcF9fX3BjMTVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfaW9wX19fcGMxNV9fX2JpdCAxNQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2lvcF9fX3BjMTZfX19sc2IgMTYKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19pb3BfX19wYzE2X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BjX2lvcF9fX3BjMTZfX19iaXQgMTYKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19pb3BfX19wYzE3X19fbHNiIDE3CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfaW9wX19fcGMxN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wY19pb3BfX19wYzE3X19fYml0IDE3CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGNfaW9wX29mZnNldCAyMAorCisvKiBSZWdpc3RlciByd19wZF9naW8sIHNjb3BlIHBpbm11eCwgdHlwZSBydyAqLworI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2dpb19fX3BkMF9fX2xzYiAwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfZ2lvX19fcGQwX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2dpb19fX3BkMF9fX2JpdCAwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfZ2lvX19fcGQxX19fbHNiIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9naW9fX19wZDFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfZ2lvX19fcGQxX19fYml0IDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9naW9fX19wZDJfX19sc2IgMgorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2dpb19fX3BkMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9naW9fX19wZDJfX19iaXQgMgorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2dpb19fX3BkM19fX2xzYiAzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfZ2lvX19fcGQzX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2dpb19fX3BkM19fX2JpdCAzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfZ2lvX19fcGQ0X19fbHNiIDQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9naW9fX19wZDRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfZ2lvX19fcGQ0X19fYml0IDQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9naW9fX19wZDVfX19sc2IgNQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2dpb19fX3BkNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9naW9fX19wZDVfX19iaXQgNQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2dpb19fX3BkNl9fX2xzYiA2CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfZ2lvX19fcGQ2X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2dpb19fX3BkNl9fX2JpdCA2CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfZ2lvX19fcGQ3X19fbHNiIDcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9naW9fX19wZDdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfZ2lvX19fcGQ3X19fYml0IDcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9naW9fX19wZDhfX19sc2IgOAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2dpb19fX3BkOF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9naW9fX19wZDhfX19iaXQgOAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2dpb19fX3BkOV9fX2xzYiA5CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfZ2lvX19fcGQ5X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2dpb19fX3BkOV9fX2JpdCA5CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfZ2lvX19fcGQxMF9fX2xzYiAxMAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2dpb19fX3BkMTBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfZ2lvX19fcGQxMF9fX2JpdCAxMAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2dpb19fX3BkMTFfX19sc2IgMTEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9naW9fX19wZDExX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2dpb19fX3BkMTFfX19iaXQgMTEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9naW9fX19wZDEyX19fbHNiIDEyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfZ2lvX19fcGQxMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9naW9fX19wZDEyX19fYml0IDEyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfZ2lvX19fcGQxM19fX2xzYiAxMworI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2dpb19fX3BkMTNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfZ2lvX19fcGQxM19fX2JpdCAxMworI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2dpb19fX3BkMTRfX19sc2IgMTQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9naW9fX19wZDE0X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2dpb19fX3BkMTRfX19iaXQgMTQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9naW9fX19wZDE1X19fbHNiIDE1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfZ2lvX19fcGQxNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9naW9fX19wZDE1X19fYml0IDE1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfZ2lvX19fcGQxNl9fX2xzYiAxNgorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2dpb19fX3BkMTZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfZ2lvX19fcGQxNl9fX2JpdCAxNgorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2dpb19fX3BkMTdfX19sc2IgMTcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9naW9fX19wZDE3X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2dpb19fX3BkMTdfX19iaXQgMTcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9naW9fb2Zmc2V0IDI0CisKKy8qIFJlZ2lzdGVyIHJ3X3BkX2lvcCwgc2NvcGUgcGlubXV4LCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfaW9wX19fcGQwX19fbHNiIDAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9pb3BfX19wZDBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfaW9wX19fcGQwX19fYml0IDAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9pb3BfX19wZDFfX19sc2IgMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2lvcF9fX3BkMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9pb3BfX19wZDFfX19iaXQgMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2lvcF9fX3BkMl9fX2xzYiAyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfaW9wX19fcGQyX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2lvcF9fX3BkMl9fX2JpdCAyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfaW9wX19fcGQzX19fbHNiIDMKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9pb3BfX19wZDNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfaW9wX19fcGQzX19fYml0IDMKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9pb3BfX19wZDRfX19sc2IgNAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2lvcF9fX3BkNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9pb3BfX19wZDRfX19iaXQgNAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2lvcF9fX3BkNV9fX2xzYiA1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfaW9wX19fcGQ1X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2lvcF9fX3BkNV9fX2JpdCA1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfaW9wX19fcGQ2X19fbHNiIDYKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9pb3BfX19wZDZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfaW9wX19fcGQ2X19fYml0IDYKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9pb3BfX19wZDdfX19sc2IgNworI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2lvcF9fX3BkN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9pb3BfX19wZDdfX19iaXQgNworI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2lvcF9fX3BkOF9fX2xzYiA4CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfaW9wX19fcGQ4X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2lvcF9fX3BkOF9fX2JpdCA4CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfaW9wX19fcGQ5X19fbHNiIDkKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9pb3BfX19wZDlfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfaW9wX19fcGQ5X19fYml0IDkKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9pb3BfX19wZDEwX19fbHNiIDEwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfaW9wX19fcGQxMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9pb3BfX19wZDEwX19fYml0IDEwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfaW9wX19fcGQxMV9fX2xzYiAxMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2lvcF9fX3BkMTFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfaW9wX19fcGQxMV9fX2JpdCAxMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2lvcF9fX3BkMTJfX19sc2IgMTIKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9pb3BfX19wZDEyX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2lvcF9fX3BkMTJfX19iaXQgMTIKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9pb3BfX19wZDEzX19fbHNiIDEzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfaW9wX19fcGQxM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9pb3BfX19wZDEzX19fYml0IDEzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfaW9wX19fcGQxNF9fX2xzYiAxNAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2lvcF9fX3BkMTRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfaW9wX19fcGQxNF9fX2JpdCAxNAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2lvcF9fX3BkMTVfX19sc2IgMTUKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9pb3BfX19wZDE1X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2lvcF9fX3BkMTVfX19iaXQgMTUKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9pb3BfX19wZDE2X19fbHNiIDE2CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfaW9wX19fcGQxNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZF9pb3BfX19wZDE2X19fYml0IDE2CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfaW9wX19fcGQxN19fX2xzYiAxNworI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2lvcF9fX3BkMTdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGRfaW9wX19fcGQxN19fX2JpdCAxNworI2RlZmluZSByZWdfcGlubXV4X3J3X3BkX2lvcF9vZmZzZXQgMjgKKworLyogUmVnaXN0ZXIgcndfcGVfZ2lvLCBzY29wZSBwaW5tdXgsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9naW9fX19wZTBfX19sc2IgMAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2dpb19fX3BlMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9naW9fX19wZTBfX19iaXQgMAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2dpb19fX3BlMV9fX2xzYiAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfZ2lvX19fcGUxX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2dpb19fX3BlMV9fX2JpdCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfZ2lvX19fcGUyX19fbHNiIDIKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9naW9fX19wZTJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfZ2lvX19fcGUyX19fYml0IDIKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9naW9fX19wZTNfX19sc2IgMworI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2dpb19fX3BlM19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9naW9fX19wZTNfX19iaXQgMworI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2dpb19fX3BlNF9fX2xzYiA0CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfZ2lvX19fcGU0X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2dpb19fX3BlNF9fX2JpdCA0CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfZ2lvX19fcGU1X19fbHNiIDUKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9naW9fX19wZTVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfZ2lvX19fcGU1X19fYml0IDUKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9naW9fX19wZTZfX19sc2IgNgorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2dpb19fX3BlNl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9naW9fX19wZTZfX19iaXQgNgorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2dpb19fX3BlN19fX2xzYiA3CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfZ2lvX19fcGU3X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2dpb19fX3BlN19fX2JpdCA3CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfZ2lvX19fcGU4X19fbHNiIDgKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9naW9fX19wZThfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfZ2lvX19fcGU4X19fYml0IDgKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9naW9fX19wZTlfX19sc2IgOQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2dpb19fX3BlOV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9naW9fX19wZTlfX19iaXQgOQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2dpb19fX3BlMTBfX19sc2IgMTAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9naW9fX19wZTEwX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2dpb19fX3BlMTBfX19iaXQgMTAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9naW9fX19wZTExX19fbHNiIDExCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfZ2lvX19fcGUxMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9naW9fX19wZTExX19fYml0IDExCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfZ2lvX19fcGUxMl9fX2xzYiAxMgorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2dpb19fX3BlMTJfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfZ2lvX19fcGUxMl9fX2JpdCAxMgorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2dpb19fX3BlMTNfX19sc2IgMTMKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9naW9fX19wZTEzX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2dpb19fX3BlMTNfX19iaXQgMTMKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9naW9fX19wZTE0X19fbHNiIDE0CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfZ2lvX19fcGUxNF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9naW9fX19wZTE0X19fYml0IDE0CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfZ2lvX19fcGUxNV9fX2xzYiAxNQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2dpb19fX3BlMTVfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfZ2lvX19fcGUxNV9fX2JpdCAxNQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2dpb19fX3BlMTZfX19sc2IgMTYKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9naW9fX19wZTE2X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2dpb19fX3BlMTZfX19iaXQgMTYKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9naW9fX19wZTE3X19fbHNiIDE3CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfZ2lvX19fcGUxN19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9naW9fX19wZTE3X19fYml0IDE3CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfZ2lvX29mZnNldCAzMgorCisvKiBSZWdpc3RlciByd19wZV9pb3AsIHNjb3BlIHBpbm11eCwgdHlwZSBydyAqLworI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2lvcF9fX3BlMF9fX2xzYiAwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfaW9wX19fcGUwX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2lvcF9fX3BlMF9fX2JpdCAwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfaW9wX19fcGUxX19fbHNiIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9pb3BfX19wZTFfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfaW9wX19fcGUxX19fYml0IDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9pb3BfX19wZTJfX19sc2IgMgorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2lvcF9fX3BlMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9pb3BfX19wZTJfX19iaXQgMgorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2lvcF9fX3BlM19fX2xzYiAzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfaW9wX19fcGUzX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2lvcF9fX3BlM19fX2JpdCAzCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfaW9wX19fcGU0X19fbHNiIDQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9pb3BfX19wZTRfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfaW9wX19fcGU0X19fYml0IDQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9pb3BfX19wZTVfX19sc2IgNQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2lvcF9fX3BlNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9pb3BfX19wZTVfX19iaXQgNQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2lvcF9fX3BlNl9fX2xzYiA2CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfaW9wX19fcGU2X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2lvcF9fX3BlNl9fX2JpdCA2CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfaW9wX19fcGU3X19fbHNiIDcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9pb3BfX19wZTdfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfaW9wX19fcGU3X19fYml0IDcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9pb3BfX19wZThfX19sc2IgOAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2lvcF9fX3BlOF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9pb3BfX19wZThfX19iaXQgOAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2lvcF9fX3BlOV9fX2xzYiA5CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfaW9wX19fcGU5X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2lvcF9fX3BlOV9fX2JpdCA5CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfaW9wX19fcGUxMF9fX2xzYiAxMAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2lvcF9fX3BlMTBfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfaW9wX19fcGUxMF9fX2JpdCAxMAorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2lvcF9fX3BlMTFfX19sc2IgMTEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9pb3BfX19wZTExX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2lvcF9fX3BlMTFfX19iaXQgMTEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9pb3BfX19wZTEyX19fbHNiIDEyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfaW9wX19fcGUxMl9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9pb3BfX19wZTEyX19fYml0IDEyCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfaW9wX19fcGUxM19fX2xzYiAxMworI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2lvcF9fX3BlMTNfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfaW9wX19fcGUxM19fX2JpdCAxMworI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2lvcF9fX3BlMTRfX19sc2IgMTQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9pb3BfX19wZTE0X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2lvcF9fX3BlMTRfX19iaXQgMTQKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9pb3BfX19wZTE1X19fbHNiIDE1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfaW9wX19fcGUxNV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9pb3BfX19wZTE1X19fYml0IDE1CisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfaW9wX19fcGUxNl9fX2xzYiAxNgorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2lvcF9fX3BlMTZfX193aWR0aCAxCisjZGVmaW5lIHJlZ19waW5tdXhfcndfcGVfaW9wX19fcGUxNl9fX2JpdCAxNgorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2lvcF9fX3BlMTdfX19sc2IgMTcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9pb3BfX19wZTE3X19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3BlX2lvcF9fX3BlMTdfX19iaXQgMTcKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd19wZV9pb3Bfb2Zmc2V0IDM2CisKKy8qIFJlZ2lzdGVyIHJ3X3VzYl9waHksIHNjb3BlIHBpbm11eCwgdHlwZSBydyAqLworI2RlZmluZSByZWdfcGlubXV4X3J3X3VzYl9waHlfX19lbl91c2IwX19fbHNiIDAKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd191c2JfcGh5X19fZW5fdXNiMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd191c2JfcGh5X19fZW5fdXNiMF9fX2JpdCAwCisjZGVmaW5lIHJlZ19waW5tdXhfcndfdXNiX3BoeV9fX2VuX3VzYjFfX19sc2IgMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3VzYl9waHlfX19lbl91c2IxX19fd2lkdGggMQorI2RlZmluZSByZWdfcGlubXV4X3J3X3VzYl9waHlfX19lbl91c2IxX19fYml0IDEKKyNkZWZpbmUgcmVnX3Bpbm11eF9yd191c2JfcGh5X29mZnNldCA0MAorCisKKy8qIENvbnN0YW50cyAqLworI2RlZmluZSByZWdrX3Bpbm11eF9ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfcGlubXV4X3J3X2h3cHJvdF9kZWZhdWx0ICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19waW5tdXhfcndfcGFfZGVmYXVsdCAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX3Bpbm11eF9yd19wYl9naW9fZGVmYXVsdCAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfcGlubXV4X3J3X3BiX2lvcF9kZWZhdWx0ICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19waW5tdXhfcndfcGNfZ2lvX2RlZmF1bHQgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX3Bpbm11eF9yd19wY19pb3BfZGVmYXVsdCAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfcGlubXV4X3J3X3BkX2dpb19kZWZhdWx0ICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19waW5tdXhfcndfcGRfaW9wX2RlZmF1bHQgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX3Bpbm11eF9yd19wZV9naW9fZGVmYXVsdCAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfcGlubXV4X3J3X3BlX2lvcF9kZWZhdWx0ICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna19waW5tdXhfcndfdXNiX3BoeV9kZWZhdWx0ICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX3Bpbm11eF95ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZW5kaWYgLyogX19waW5tdXhfZGVmc19hc21faCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2h3cmVncy9hc20vcmVnX21hcF9hc20uaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1mcy9od3JlZ3MvYXNtL3JlZ19tYXBfYXNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc1MTdhZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1mcy9od3JlZ3MvYXNtL3JlZ19tYXBfYXNtLmgKQEAgLTAsMCArMSw5NiBAQAorI2lmbmRlZiBfX3JlZ19tYXBfaAorI2RlZmluZSBfX3JlZ19tYXBfaAorCisvKgorICogVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQgZnJvbQorICogICBmaWxlOiAgICAgICAgICAgIC4uLy4uL21vZC9mYWtlcmVnLnJtYXAKKyAqICAgICBpZDogICAgICAgICAgICBmYWtlcmVnLnJtYXAsdiAxLjMgMjAwNC8wMi8xMSAxOTo1MzoyMiByb25ueSBFeHAgCisgKiAgICAgbGFzdCBtb2RpZmllZDogV2VkIEZlYiAxMSAyMDo1MzoyNSAyMDA0CisgKiAgIGZpbGU6ICAgICAgICAgICAgLi4vLi4vcnRsL2dsb2JhbC5ybWFwCisgKiAgICAgaWQ6ICAgICAgICAgICAgZ2xvYmFsLnJtYXAsdiAxLjMgMjAwMy8wOC8xOCAxNTowODoyMyBtaWthZWxuIEV4cCAKKyAqICAgICBsYXN0IG1vZGlmaWVkOiBNb24gQXVnIDE4IDE3OjA4OjIzIDIwMDMKKyAqICAgZmlsZTogICAgICAgICAgICAuLi8uLi9tb2QvbW9kcmVnLnJtYXAKKyAqICAgICBpZDogICAgICAgICAgICBtb2RyZWcucm1hcCx2IDEuMzEgMjAwNC8wMi8yMCAxNTo0MDowNCBzdGVmYW5zIEV4cCAKKyAqICAgICBsYXN0IG1vZGlmaWVkOiBGcmkgRmViIDIwIDE2OjQwOjA0IDIwMDQKKyAqIAorICogICBieSAvbi9hc2ljL2Rlc2lnbi90b29scy9yZGVzYy9zcmMvcmRlczJjIC1hc20gLS1vdXRmaWxlIGFzbS9yZWdfbWFwX2FzbS5oIC1iYXNlIDB4YjAwMDAwMDAgLi4vLi4vcnRsL2dsb2JhbC5ybWFwIC4uLy4uL21vZC9tb2RyZWcucm1hcCAuLi8uLi9pbnN0L21lbWFyYi9ydGwvZ3Vpbm5lc3MvbWFyYl90b3AuciAuLi8uLi9tb2QvZmFrZXJlZy5ybWFwCisgKiAgICAgIGlkOiAkSWQ6IHJlZ19tYXBfYXNtLmgsdiAxLjEgMjAwNy8wMi8xMyAxMTo1NTozMCBzdGFydmlrIEV4cCAkIAorICogQW55IGNoYW5nZXMgaGVyZSB3aWxsIGJlIGxvc3QuCisgKgorICogLSotIGJ1ZmZlci1yZWFkLW9ubHk6IHQgLSotCisgKi8KKyNkZWZpbmUgcmVnaV9hcnRwZWNfbW9kICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiNzA0NDAwMAorI2RlZmluZSByZWdpX2F0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDMyMDAwCisjZGVmaW5lIHJlZ2lfYXRhX21vZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjcwMDYwMDAKKyNkZWZpbmUgcmVnaV9iYXJiZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiNzAxYTAwMAorI2RlZmluZSByZWdpX2JpZl9jb3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDE0MDAwCisjZGVmaW5lIHJlZ2lfYmlmX2RtYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMTYwMDAKKyNkZWZpbmUgcmVnaV9iaWZfc2xhdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAxODAwMAorI2RlZmluZSByZWdpX2JpZl9zbGF2ZV9leHQgICAgICAgICAgICAgICAgICAgICAgICAweGFjMDAwMDAwCisjZGVmaW5lIHJlZ2lfYnVzX21hc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjcwM2MwMDAKKyNkZWZpbmUgcmVnaV9jb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAzYzAwMAorI2RlZmluZSByZWdpX2RtYTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDAwMDAwCisjZGVmaW5lIHJlZ2lfZG1hMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMDIwMDAKKyNkZWZpbmUgcmVnaV9kbWEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAwNDAwMAorI2RlZmluZSByZWdpX2RtYTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDA2MDAwCisjZGVmaW5lIHJlZ2lfZG1hNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMDgwMDAKKyNkZWZpbmUgcmVnaV9kbWE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAwYTAwMAorI2RlZmluZSByZWdpX2RtYTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDBjMDAwCisjZGVmaW5lIHJlZ2lfZG1hNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMGUwMDAKKyNkZWZpbmUgcmVnaV9kbWE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAxMDAwMAorI2RlZmluZSByZWdpX2RtYTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDEyMDAwCisjZGVmaW5lIHJlZ2lfZXRoMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMzQwMDAKKyNkZWZpbmUgcmVnaV9ldGgxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAzNjAwMAorI2RlZmluZSByZWdpX2V0aF9tb2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGI3MDA0MDAwCisjZGVmaW5lIHJlZ2lfZXRoX21vZDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjcwMWMwMDAKKyNkZWZpbmUgcmVnaV9ldGhfc3RybW9kICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiNzAwODAwMAorI2RlZmluZSByZWdpX2V0aF9zdHJtb2QxICAgICAgICAgICAgICAgICAgICAgICAgICAweGI3MDMyMDAwCisjZGVmaW5lIHJlZ2lfZXh0X2RtYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjcwM2EwMDAKKyNkZWZpbmUgcmVnaV9leHRfbWVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiNzA0NjAwMAorI2RlZmluZSByZWdpX2dlbl9pbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGI3MDE2MDAwCisjZGVmaW5lIHJlZ2lfZ2lvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMWEwMDAKKyNkZWZpbmUgcmVnaV9ob29rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiNzAwMDAwMAorI2RlZmluZSByZWdpX2lvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDIwMDAwCisjZGVmaW5lIHJlZ2lfaXJxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMWMwMDAKKyNkZWZpbmUgcmVnaV9pcnFfbm1pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiNzAxZTAwMAorI2RlZmluZSByZWdpX21hcmIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDNlMDAwCisjZGVmaW5lIHJlZ2lfbWFyYl9icDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwM2UyNDAKKyNkZWZpbmUgcmVnaV9tYXJiX2JwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAzZTI4MAorI2RlZmluZSByZWdpX21hcmJfYnAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDNlMmMwCisjZGVmaW5lIHJlZ2lfbWFyYl9icDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwM2UzMDAKKyNkZWZpbmUgcmVnaV9uYW5kX21vZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiNzAxNDAwMAorI2RlZmluZSByZWdpX3AyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDJlMDAwCisjZGVmaW5lIHJlZ2lfcDIxX21vZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjcwNDIwMDAKKyNkZWZpbmUgcmVnaV9wY2lfbW9kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiNzAxMDAwMAorI2RlZmluZSByZWdpX3Bpbl90ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGI3MDE4MDAwCisjZGVmaW5lIHJlZ2lfcGlubXV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMzgwMDAKKyNkZWZpbmUgcmVnaV9zZHJhbV9jaGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiNzAzZTAwMAorI2RlZmluZSByZWdpX3NkcmFtX21vZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGI3MDEyMDAwCisjZGVmaW5lIHJlZ2lfc2VyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMjYwMDAKKyNkZWZpbmUgcmVnaV9zZXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAyODAwMAorI2RlZmluZSByZWdpX3NlcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDJhMDAwCisjZGVmaW5lIHJlZ2lfc2VyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMmMwMDAKKyNkZWZpbmUgcmVnaV9zZXJfbW9kMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiNzAyMDAwMAorI2RlZmluZSByZWdpX3Nlcl9tb2QxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGI3MDIyMDAwCisjZGVmaW5lIHJlZ2lfc2VyX21vZDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjcwMjQwMDAKKyNkZWZpbmUgcmVnaV9zZXJfbW9kMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiNzAyNjAwMAorI2RlZmluZSByZWdpX3NtaWZfc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGI3MDBlMDAwCisjZGVmaW5lIHJlZ2lfc3NlcjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjAwMjIwMDAKKyNkZWZpbmUgcmVnaV9zc2VyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAyNDAwMAorI2RlZmluZSByZWdpX3NzZXJfbW9kMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGI3MDBhMDAwCisjZGVmaW5lIHJlZ2lfc3Nlcl9tb2QxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjcwMGMwMDAKKyNkZWZpbmUgcmVnaV9zdHJjb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDAzMDAwMAorI2RlZmluZSByZWdpX3N0cm11eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDNhMDAwCisjZGVmaW5lIHJlZ2lfc3RybXV4X3RzdCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjcwNDAwMDAKKyNkZWZpbmUgcmVnaV90YXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiNzAwMjAwMAorI2RlZmluZSByZWdpX3RpbWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGIwMDFlMDAwCisjZGVmaW5lIHJlZ2lfdGltZXJfbW9kICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjcwMzQwMDAKKyNkZWZpbmUgcmVnaV90cmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiMDA0MDAwMAorI2RlZmluZSByZWdpX3VzYjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGI3MDI4MDAwCisjZGVmaW5lIHJlZ2lfdXNiMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjcwMmEwMDAKKyNkZWZpbmUgcmVnaV91c2IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiNzAyYzAwMAorI2RlZmluZSByZWdpX3VzYjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGI3MDJlMDAwCisjZGVmaW5lIHJlZ2lfdXNiX2RldiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjcwMzAwMDAKKyNkZWZpbmUgcmVnaV91dG1pX21vZDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiNzAzNjAwMAorI2RlZmluZSByZWdpX3V0bWlfbW9kMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGI3MDM4MDAwCisjZW5kaWYgLyogX19yZWdfbWFwX2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1mcy9od3JlZ3MvYXNtL3RpbWVyX2RlZnNfYXNtLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdyZWdzL2FzbS90aW1lcl9kZWZzX2FzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMTk3MTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdyZWdzL2FzbS90aW1lcl9kZWZzX2FzbS5oCkBAIC0wLDAgKzEsMjI5IEBACisjaWZuZGVmIF9fdGltZXJfZGVmc19hc21faAorI2RlZmluZSBfX3RpbWVyX2RlZnNfYXNtX2gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGZyb20KKyAqICAgZmlsZTogICAgICAgICAgIC4uLy4uL2luc3QvdGltZXIvcnRsL3RpbWVyX3JlZ3MucgorICogICAgIGlkOiAgICAgICAgICAgdGltZXJfcmVncy5yLHYgMS43IDIwMDMvMDMvMTEgMTE6MTY6NTkgcGVyeiBFeHAgCisgKiAgICAgbGFzdCBtb2RmaWVkOiBNb24gQXByIDExIDE2OjA5OjUzIDIwMDUKKyAqIAorICogICBieSAvbi9hc2ljL2Rlc2lnbi90b29scy9yZGVzYy9zcmMvcmRlczJjIC1hc20gLS1vdXRmaWxlIGFzbS90aW1lcl9kZWZzX2FzbS5oIC4uLy4uL2luc3QvdGltZXIvcnRsL3RpbWVyX3JlZ3MucgorICogICAgICBpZDogJElkOiB0aW1lcl9kZWZzX2FzbS5oLHYgMS4xIDIwMDcvMDQvMTEgMTM6NTE6MDEgcmljYXJkdyBFeHAgJAorICogQW55IGNoYW5nZXMgaGVyZSB3aWxsIGJlIGxvc3QuCisgKgorICogLSotIGJ1ZmZlci1yZWFkLW9ubHk6IHQgLSotCisgKi8KKworI2lmbmRlZiBSRUdfRklFTEQKKyNkZWZpbmUgUkVHX0ZJRUxEKCBzY29wZSwgcmVnLCBmaWVsZCwgdmFsdWUgKSBcCisgIFJFR19GSUVMRF9YXyggdmFsdWUsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19fXyMjZmllbGQjI19fX2xzYiApCisjZGVmaW5lIFJFR19GSUVMRF9YXyggdmFsdWUsIHNoaWZ0ICkgKCh2YWx1ZSkgPDwgc2hpZnQpCisjZW5kaWYKKworI2lmbmRlZiBSRUdfU1RBVEUKKyNkZWZpbmUgUkVHX1NUQVRFKCBzY29wZSwgcmVnLCBmaWVsZCwgc3ltYm9saWNfdmFsdWUgKSBcCisgIFJFR19TVEFURV9YXyggcmVna18jI3Njb3BlIyNfIyNzeW1ib2xpY192YWx1ZSwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fbHNiICkKKyNkZWZpbmUgUkVHX1NUQVRFX1hfKCBrLCBzaGlmdCApIChrIDw8IHNoaWZ0KQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX01BU0sKKyNkZWZpbmUgUkVHX01BU0soIHNjb3BlLCByZWcsIGZpZWxkICkgXAorICBSRUdfTUFTS19YXyggcmVnXyMjc2NvcGUjI18jI3JlZyMjX19fIyNmaWVsZCMjX19fd2lkdGgsIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19fXyMjZmllbGQjI19fX2xzYiApCisjZGVmaW5lIFJFR19NQVNLX1hfKCB3aWR0aCwgbHNiICkgKCgoMSA8PCB3aWR0aCktMSkgPDwgbHNiKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0xTQgorI2RlZmluZSBSRUdfTFNCKCBzY29wZSwgcmVnLCBmaWVsZCApIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19fXyMjZmllbGQjI19fX2xzYgorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0JJVAorI2RlZmluZSBSRUdfQklUKCBzY29wZSwgcmVnLCBmaWVsZCApIHJlZ18jI3Njb3BlIyNfIyNyZWcjI19fXyMjZmllbGQjI19fX2JpdAorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFIKKyNkZWZpbmUgUkVHX0FERFIoIHNjb3BlLCBpbnN0LCByZWcgKSBSRUdfQUREUl9YXyhpbnN0LCByZWdfIyNzY29wZSMjXyMjcmVnIyNfb2Zmc2V0KQorI2RlZmluZSBSRUdfQUREUl9YXyggaW5zdCwgb2ZmcyApICgoaW5zdCkgKyBvZmZzKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFJfVkVDVAorI2RlZmluZSBSRUdfQUREUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgICAgICAgIFJFR19BRERSX1ZFQ1RfWF8oaW5zdCwgcmVnXyMjc2NvcGUjI18jI3JlZyMjX29mZnNldCwgaW5kZXgsIFwKKwkJCSBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNkZWZpbmUgUkVHX0FERFJfVkVDVF9YXyggaW5zdCwgb2ZmcywgaW5kZXgsIHN0cmlkZSApIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnN0KSArIG9mZnMgKyAoaW5kZXgpICogc3RyaWRlKQorI2VuZGlmCisKKy8qIFJlZ2lzdGVyIHJ3X3RtcjBfZGl2LCBzY29wZSB0aW1lciwgdHlwZSBydyAqLworI2RlZmluZSByZWdfdGltZXJfcndfdG1yMF9kaXZfb2Zmc2V0IDAKKworLyogUmVnaXN0ZXIgcl90bXIwX2RhdGEsIHNjb3BlIHRpbWVyLCB0eXBlIHIgKi8KKyNkZWZpbmUgcmVnX3RpbWVyX3JfdG1yMF9kYXRhX29mZnNldCA0CisKKy8qIFJlZ2lzdGVyIHJ3X3RtcjBfY3RybCwgc2NvcGUgdGltZXIsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX3RpbWVyX3J3X3RtcjBfY3RybF9fX29wX19fbHNiIDAKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X3RtcjBfY3RybF9fX29wX19fd2lkdGggMgorI2RlZmluZSByZWdfdGltZXJfcndfdG1yMF9jdHJsX19fZnJlcV9fX2xzYiAyCisjZGVmaW5lIHJlZ190aW1lcl9yd190bXIwX2N0cmxfX19mcmVxX19fd2lkdGggMworI2RlZmluZSByZWdfdGltZXJfcndfdG1yMF9jdHJsX29mZnNldCA4CisKKy8qIFJlZ2lzdGVyIHJ3X3RtcjFfZGl2LCBzY29wZSB0aW1lciwgdHlwZSBydyAqLworI2RlZmluZSByZWdfdGltZXJfcndfdG1yMV9kaXZfb2Zmc2V0IDE2CisKKy8qIFJlZ2lzdGVyIHJfdG1yMV9kYXRhLCBzY29wZSB0aW1lciwgdHlwZSByICovCisjZGVmaW5lIHJlZ190aW1lcl9yX3RtcjFfZGF0YV9vZmZzZXQgMjAKKworLyogUmVnaXN0ZXIgcndfdG1yMV9jdHJsLCBzY29wZSB0aW1lciwgdHlwZSBydyAqLworI2RlZmluZSByZWdfdGltZXJfcndfdG1yMV9jdHJsX19fb3BfX19sc2IgMAorI2RlZmluZSByZWdfdGltZXJfcndfdG1yMV9jdHJsX19fb3BfX193aWR0aCAyCisjZGVmaW5lIHJlZ190aW1lcl9yd190bXIxX2N0cmxfX19mcmVxX19fbHNiIDIKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X3RtcjFfY3RybF9fX2ZyZXFfX193aWR0aCAzCisjZGVmaW5lIHJlZ190aW1lcl9yd190bXIxX2N0cmxfb2Zmc2V0IDI0CisKKy8qIFJlZ2lzdGVyIHJzX2NudF9kYXRhLCBzY29wZSB0aW1lciwgdHlwZSBycyAqLworI2RlZmluZSByZWdfdGltZXJfcnNfY250X2RhdGFfX190bXJfX19sc2IgMAorI2RlZmluZSByZWdfdGltZXJfcnNfY250X2RhdGFfX190bXJfX193aWR0aCAyNAorI2RlZmluZSByZWdfdGltZXJfcnNfY250X2RhdGFfX19jbnRfX19sc2IgMjQKKyNkZWZpbmUgcmVnX3RpbWVyX3JzX2NudF9kYXRhX19fY250X19fd2lkdGggOAorI2RlZmluZSByZWdfdGltZXJfcnNfY250X2RhdGFfb2Zmc2V0IDMyCisKKy8qIFJlZ2lzdGVyIHJfY250X2RhdGEsIHNjb3BlIHRpbWVyLCB0eXBlIHIgKi8KKyNkZWZpbmUgcmVnX3RpbWVyX3JfY250X2RhdGFfX190bXJfX19sc2IgMAorI2RlZmluZSByZWdfdGltZXJfcl9jbnRfZGF0YV9fX3Rtcl9fX3dpZHRoIDI0CisjZGVmaW5lIHJlZ190aW1lcl9yX2NudF9kYXRhX19fY250X19fbHNiIDI0CisjZGVmaW5lIHJlZ190aW1lcl9yX2NudF9kYXRhX19fY250X19fd2lkdGggOAorI2RlZmluZSByZWdfdGltZXJfcl9jbnRfZGF0YV9vZmZzZXQgMzYKKworLyogUmVnaXN0ZXIgcndfY250X2NmZywgc2NvcGUgdGltZXIsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX3RpbWVyX3J3X2NudF9jZmdfX19jbGtfX19sc2IgMAorI2RlZmluZSByZWdfdGltZXJfcndfY250X2NmZ19fX2Nsa19fX3dpZHRoIDIKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X2NudF9jZmdfb2Zmc2V0IDQwCisKKy8qIFJlZ2lzdGVyIHJ3X3RyaWcsIHNjb3BlIHRpbWVyLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ190aW1lcl9yd190cmlnX29mZnNldCA0OAorCisvKiBSZWdpc3RlciByd190cmlnX2NmZywgc2NvcGUgdGltZXIsIHR5cGUgcncgKi8KKyNkZWZpbmUgcmVnX3RpbWVyX3J3X3RyaWdfY2ZnX19fdG1yX19fbHNiIDAKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X3RyaWdfY2ZnX19fdG1yX19fd2lkdGggMgorI2RlZmluZSByZWdfdGltZXJfcndfdHJpZ19jZmdfb2Zmc2V0IDUyCisKKy8qIFJlZ2lzdGVyIHJfdGltZSwgc2NvcGUgdGltZXIsIHR5cGUgciAqLworI2RlZmluZSByZWdfdGltZXJfcl90aW1lX29mZnNldCA1NgorCisvKiBSZWdpc3RlciByd19vdXQsIHNjb3BlIHRpbWVyLCB0eXBlIHJ3ICovCisjZGVmaW5lIHJlZ190aW1lcl9yd19vdXRfX190bXJfX19sc2IgMAorI2RlZmluZSByZWdfdGltZXJfcndfb3V0X19fdG1yX19fd2lkdGggMgorI2RlZmluZSByZWdfdGltZXJfcndfb3V0X29mZnNldCA2MAorCisvKiBSZWdpc3RlciByd193ZF9jdHJsLCBzY29wZSB0aW1lciwgdHlwZSBydyAqLworI2RlZmluZSByZWdfdGltZXJfcndfd2RfY3RybF9fX2NudF9fX2xzYiAwCisjZGVmaW5lIHJlZ190aW1lcl9yd193ZF9jdHJsX19fY250X19fd2lkdGggOAorI2RlZmluZSByZWdfdGltZXJfcndfd2RfY3RybF9fX2NtZF9fX2xzYiA4CisjZGVmaW5lIHJlZ190aW1lcl9yd193ZF9jdHJsX19fY21kX19fd2lkdGggMQorI2RlZmluZSByZWdfdGltZXJfcndfd2RfY3RybF9fX2NtZF9fX2JpdCA4CisjZGVmaW5lIHJlZ190aW1lcl9yd193ZF9jdHJsX19fa2V5X19fbHNiIDkKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X3dkX2N0cmxfX19rZXlfX193aWR0aCA3CisjZGVmaW5lIHJlZ190aW1lcl9yd193ZF9jdHJsX29mZnNldCA2NAorCisvKiBSZWdpc3RlciByX3dkX3N0YXQsIHNjb3BlIHRpbWVyLCB0eXBlIHIgKi8KKyNkZWZpbmUgcmVnX3RpbWVyX3Jfd2Rfc3RhdF9fX2NudF9fX2xzYiAwCisjZGVmaW5lIHJlZ190aW1lcl9yX3dkX3N0YXRfX19jbnRfX193aWR0aCA4CisjZGVmaW5lIHJlZ190aW1lcl9yX3dkX3N0YXRfX19jbWRfX19sc2IgOAorI2RlZmluZSByZWdfdGltZXJfcl93ZF9zdGF0X19fY21kX19fd2lkdGggMQorI2RlZmluZSByZWdfdGltZXJfcl93ZF9zdGF0X19fY21kX19fYml0IDgKKyNkZWZpbmUgcmVnX3RpbWVyX3Jfd2Rfc3RhdF9vZmZzZXQgNjgKKworLyogUmVnaXN0ZXIgcndfaW50cl9tYXNrLCBzY29wZSB0aW1lciwgdHlwZSBydyAqLworI2RlZmluZSByZWdfdGltZXJfcndfaW50cl9tYXNrX19fdG1yMF9fX2xzYiAwCisjZGVmaW5lIHJlZ190aW1lcl9yd19pbnRyX21hc2tfX190bXIwX19fd2lkdGggMQorI2RlZmluZSByZWdfdGltZXJfcndfaW50cl9tYXNrX19fdG1yMF9fX2JpdCAwCisjZGVmaW5lIHJlZ190aW1lcl9yd19pbnRyX21hc2tfX190bXIxX19fbHNiIDEKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X2ludHJfbWFza19fX3RtcjFfX193aWR0aCAxCisjZGVmaW5lIHJlZ190aW1lcl9yd19pbnRyX21hc2tfX190bXIxX19fYml0IDEKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X2ludHJfbWFza19fX2NudF9fX2xzYiAyCisjZGVmaW5lIHJlZ190aW1lcl9yd19pbnRyX21hc2tfX19jbnRfX193aWR0aCAxCisjZGVmaW5lIHJlZ190aW1lcl9yd19pbnRyX21hc2tfX19jbnRfX19iaXQgMgorI2RlZmluZSByZWdfdGltZXJfcndfaW50cl9tYXNrX19fdHJpZ19fX2xzYiAzCisjZGVmaW5lIHJlZ190aW1lcl9yd19pbnRyX21hc2tfX190cmlnX19fd2lkdGggMQorI2RlZmluZSByZWdfdGltZXJfcndfaW50cl9tYXNrX19fdHJpZ19fX2JpdCAzCisjZGVmaW5lIHJlZ190aW1lcl9yd19pbnRyX21hc2tfb2Zmc2V0IDcyCisKKy8qIFJlZ2lzdGVyIHJ3X2Fja19pbnRyLCBzY29wZSB0aW1lciwgdHlwZSBydyAqLworI2RlZmluZSByZWdfdGltZXJfcndfYWNrX2ludHJfX190bXIwX19fbHNiIDAKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X2Fja19pbnRyX19fdG1yMF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X2Fja19pbnRyX19fdG1yMF9fX2JpdCAwCisjZGVmaW5lIHJlZ190aW1lcl9yd19hY2tfaW50cl9fX3RtcjFfX19sc2IgMQorI2RlZmluZSByZWdfdGltZXJfcndfYWNrX2ludHJfX190bXIxX19fd2lkdGggMQorI2RlZmluZSByZWdfdGltZXJfcndfYWNrX2ludHJfX190bXIxX19fYml0IDEKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X2Fja19pbnRyX19fY250X19fbHNiIDIKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X2Fja19pbnRyX19fY250X19fd2lkdGggMQorI2RlZmluZSByZWdfdGltZXJfcndfYWNrX2ludHJfX19jbnRfX19iaXQgMgorI2RlZmluZSByZWdfdGltZXJfcndfYWNrX2ludHJfX190cmlnX19fbHNiIDMKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X2Fja19pbnRyX19fdHJpZ19fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X2Fja19pbnRyX19fdHJpZ19fX2JpdCAzCisjZGVmaW5lIHJlZ190aW1lcl9yd19hY2tfaW50cl9vZmZzZXQgNzYKKworLyogUmVnaXN0ZXIgcl9pbnRyLCBzY29wZSB0aW1lciwgdHlwZSByICovCisjZGVmaW5lIHJlZ190aW1lcl9yX2ludHJfX190bXIwX19fbHNiIDAKKyNkZWZpbmUgcmVnX3RpbWVyX3JfaW50cl9fX3RtcjBfX193aWR0aCAxCisjZGVmaW5lIHJlZ190aW1lcl9yX2ludHJfX190bXIwX19fYml0IDAKKyNkZWZpbmUgcmVnX3RpbWVyX3JfaW50cl9fX3RtcjFfX19sc2IgMQorI2RlZmluZSByZWdfdGltZXJfcl9pbnRyX19fdG1yMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3RpbWVyX3JfaW50cl9fX3RtcjFfX19iaXQgMQorI2RlZmluZSByZWdfdGltZXJfcl9pbnRyX19fY250X19fbHNiIDIKKyNkZWZpbmUgcmVnX3RpbWVyX3JfaW50cl9fX2NudF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3RpbWVyX3JfaW50cl9fX2NudF9fX2JpdCAyCisjZGVmaW5lIHJlZ190aW1lcl9yX2ludHJfX190cmlnX19fbHNiIDMKKyNkZWZpbmUgcmVnX3RpbWVyX3JfaW50cl9fX3RyaWdfX193aWR0aCAxCisjZGVmaW5lIHJlZ190aW1lcl9yX2ludHJfX190cmlnX19fYml0IDMKKyNkZWZpbmUgcmVnX3RpbWVyX3JfaW50cl9vZmZzZXQgODAKKworLyogUmVnaXN0ZXIgcl9tYXNrZWRfaW50ciwgc2NvcGUgdGltZXIsIHR5cGUgciAqLworI2RlZmluZSByZWdfdGltZXJfcl9tYXNrZWRfaW50cl9fX3RtcjBfX19sc2IgMAorI2RlZmluZSByZWdfdGltZXJfcl9tYXNrZWRfaW50cl9fX3RtcjBfX193aWR0aCAxCisjZGVmaW5lIHJlZ190aW1lcl9yX21hc2tlZF9pbnRyX19fdG1yMF9fX2JpdCAwCisjZGVmaW5lIHJlZ190aW1lcl9yX21hc2tlZF9pbnRyX19fdG1yMV9fX2xzYiAxCisjZGVmaW5lIHJlZ190aW1lcl9yX21hc2tlZF9pbnRyX19fdG1yMV9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3RpbWVyX3JfbWFza2VkX2ludHJfX190bXIxX19fYml0IDEKKyNkZWZpbmUgcmVnX3RpbWVyX3JfbWFza2VkX2ludHJfX19jbnRfX19sc2IgMgorI2RlZmluZSByZWdfdGltZXJfcl9tYXNrZWRfaW50cl9fX2NudF9fX3dpZHRoIDEKKyNkZWZpbmUgcmVnX3RpbWVyX3JfbWFza2VkX2ludHJfX19jbnRfX19iaXQgMgorI2RlZmluZSByZWdfdGltZXJfcl9tYXNrZWRfaW50cl9fX3RyaWdfX19sc2IgMworI2RlZmluZSByZWdfdGltZXJfcl9tYXNrZWRfaW50cl9fX3RyaWdfX193aWR0aCAxCisjZGVmaW5lIHJlZ190aW1lcl9yX21hc2tlZF9pbnRyX19fdHJpZ19fX2JpdCAzCisjZGVmaW5lIHJlZ190aW1lcl9yX21hc2tlZF9pbnRyX29mZnNldCA4NAorCisvKiBSZWdpc3RlciByd190ZXN0LCBzY29wZSB0aW1lciwgdHlwZSBydyAqLworI2RlZmluZSByZWdfdGltZXJfcndfdGVzdF9fX2Rpc19fX2xzYiAwCisjZGVmaW5lIHJlZ190aW1lcl9yd190ZXN0X19fZGlzX19fd2lkdGggMQorI2RlZmluZSByZWdfdGltZXJfcndfdGVzdF9fX2Rpc19fX2JpdCAwCisjZGVmaW5lIHJlZ190aW1lcl9yd190ZXN0X19fZW5fX19sc2IgMQorI2RlZmluZSByZWdfdGltZXJfcndfdGVzdF9fX2VuX19fd2lkdGggMQorI2RlZmluZSByZWdfdGltZXJfcndfdGVzdF9fX2VuX19fYml0IDEKKyNkZWZpbmUgcmVnX3RpbWVyX3J3X3Rlc3Rfb2Zmc2V0IDg4CisKKworLyogQ29uc3RhbnRzICovCisjZGVmaW5lIHJlZ2tfdGltZXJfZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgcmVna190aW1lcl9mMTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSByZWdrX3RpbWVyX2YyOV80OTMgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIHJlZ2tfdGltZXJfZjMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgcmVna190aW1lcl9mMzJfNzY4ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgorI2RlZmluZSByZWdrX3RpbWVyX2hvbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfdGltZXJfbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna190aW1lcl9ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX3RpbWVyX29mZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfdGltZXJfcnVuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgcmVna190aW1lcl9yd19jbnRfY2ZnX2RlZmF1bHQgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX3RpbWVyX3J3X2ludHJfbWFza19kZWZhdWx0ICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfdGltZXJfcndfb3V0X2RlZmF1bHQgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna190aW1lcl9yd190ZXN0X2RlZmF1bHQgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX3RpbWVyX3J3X3RtcjBfY3RybF9kZWZhdWx0ICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIHJlZ2tfdGltZXJfcndfdG1yMV9jdHJsX2RlZmF1bHQgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna190aW1lcl9yd190cmlnX2NmZ19kZWZhdWx0ICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSByZWdrX3RpbWVyX3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIHJlZ2tfdGltZXJfc3RvcCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgcmVna190aW1lcl90aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSByZWdrX3RpbWVyX3RtcjAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIHJlZ2tfdGltZXJfdG1yMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgcmVna190aW1lcl95ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2VuZGlmIC8qIF9fdGltZXJfZGVmc19hc21faCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2h3cmVncy9iaWZfY29yZV9kZWZzLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdyZWdzL2JpZl9jb3JlX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDM2MmE2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2h3cmVncy9iaWZfY29yZV9kZWZzLmgKQEAgLTAsMCArMSwyODQgQEAKKyNpZm5kZWYgX19iaWZfY29yZV9kZWZzX2gKKyNkZWZpbmUgX19iaWZfY29yZV9kZWZzX2gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGZyb20KKyAqICAgZmlsZTogICAgICAgICAgIC4uLy4uL2luc3QvYmlmL3J0bC9iaWZfY29yZV9yZWdzLnIKKyAqICAgICBpZDogICAgICAgICAgIGJpZl9jb3JlX3JlZ3Mucix2IDEuMTcgMjAwNS8wMi8wNCAxMzoyODoyMiBucCBFeHAgCisgKiAgICAgbGFzdCBtb2RmaWVkOiBNb24gQXByIDExIDE2OjA2OjMzIDIwMDUKKyAqIAorICogICBieSAvbi9hc2ljL2Rlc2lnbi90b29scy9yZGVzYy9zcmMvcmRlczJjIC0tb3V0ZmlsZSBiaWZfY29yZV9kZWZzLmggLi4vLi4vaW5zdC9iaWYvcnRsL2JpZl9jb3JlX3JlZ3MucgorICogICAgICBpZDogJElkOiBiaWZfY29yZV9kZWZzLmgsdiAxLjEgMjAwNy8wMi8xMyAxMTo1NTozMCBzdGFydmlrIEV4cCAkCisgKiBBbnkgY2hhbmdlcyBoZXJlIHdpbGwgYmUgbG9zdC4KKyAqCisgKiAtKi0gYnVmZmVyLXJlYWQtb25seTogdCAtKi0KKyAqLworLyogTWFpbiBhY2Nlc3MgbWFjcm9zICovCisjaWZuZGVmIFJFR19SRAorI2RlZmluZSBSRUdfUkQoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgIFJFR19SRUFEKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSCisjZGVmaW5lIFJFR19XUiggc2NvcGUsIGluc3QsIHJlZywgdmFsICkgXAorICBSRUdfV1JJVEUoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgICAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9WRUNUCisjZGVmaW5lIFJFR19SRF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgUkVHX1JFQUQoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKwkgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSX1ZFQ1QKKyNkZWZpbmUgUkVHX1dSX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4LCB2YWwgKSBcCisgIFJFR19XUklURSggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKwkgICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfSU5UCisjZGVmaW5lIFJFR19SRF9JTlQoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgIFJFR19SRUFEKCBpbnQsIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfSU5UCisjZGVmaW5lIFJFR19XUl9JTlQoIHNjb3BlLCBpbnN0LCByZWcsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCBpbnQsIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX0lOVF9WRUNUCisjZGVmaW5lIFJFR19SRF9JTlRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgIFJFR19SRUFEKCBpbnQsIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKwkgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSX0lOVF9WRUNUCisjZGVmaW5lIFJFR19XUl9JTlRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXgsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCBpbnQsIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKwkgICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfVFlQRV9DT05WCisjZGVmaW5lIFJFR19UWVBFX0NPTlYoIHR5cGUsIG9yZ3R5cGUsIHZhbCApIFwKKyAgKCB7IHVuaW9uIHsgb3JndHlwZSBvOyB0eXBlIG47IH0gcjsgci5vID0gdmFsOyByLm47IH0gKQorI2VuZGlmCisKKyNpZm5kZWYgcmVnX3BhZ2Vfc2l6ZQorI2RlZmluZSByZWdfcGFnZV9zaXplIDgxOTIKKyNlbmRpZgorCisjaWZuZGVmIFJFR19BRERSCisjZGVmaW5lIFJFR19BRERSKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICAoIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUl9WRUNUCisjZGVmaW5lIFJFR19BRERSX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICAoIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKyAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworLyogQy1jb2RlIGZvciByZWdpc3RlciBzY29wZSBiaWZfY29yZSAqLworCisvKiBSZWdpc3RlciByd19ncnAxX2NmZywgc2NvcGUgYmlmX2NvcmUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGx3ICAgICAgICA6IDY7CisgIHVuc2lnbmVkIGludCBldyAgICAgICAgOiAzOworICB1bnNpZ25lZCBpbnQgencgICAgICAgIDogMzsKKyAgdW5zaWduZWQgaW50IGF3ICAgICAgICA6IDI7CisgIHVuc2lnbmVkIGludCBkdyAgICAgICAgOiAyOworICB1bnNpZ25lZCBpbnQgZXdiICAgICAgIDogMjsKKyAgdW5zaWduZWQgaW50IGJ3ICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB3cl9leHRlbmQgOiAxOworICB1bnNpZ25lZCBpbnQgZXJjX2VuICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG1vZGUgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgOiAxMDsKK30gcmVnX2JpZl9jb3JlX3J3X2dycDFfY2ZnOworI2RlZmluZSBSRUdfUkRfQUREUl9iaWZfY29yZV9yd19ncnAxX2NmZyAwCisjZGVmaW5lIFJFR19XUl9BRERSX2JpZl9jb3JlX3J3X2dycDFfY2ZnIDAKKworLyogUmVnaXN0ZXIgcndfZ3JwMl9jZmcsIHNjb3BlIGJpZl9jb3JlLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBsdyAgICAgICAgOiA2OworICB1bnNpZ25lZCBpbnQgZXcgICAgICAgIDogMzsKKyAgdW5zaWduZWQgaW50IHp3ICAgICAgICA6IDM7CisgIHVuc2lnbmVkIGludCBhdyAgICAgICAgOiAyOworICB1bnNpZ25lZCBpbnQgZHcgICAgICAgIDogMjsKKyAgdW5zaWduZWQgaW50IGV3YiAgICAgICA6IDI7CisgIHVuc2lnbmVkIGludCBidyAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgd3JfZXh0ZW5kIDogMTsKKyAgdW5zaWduZWQgaW50IGVyY19lbiAgICA6IDE7CisgIHVuc2lnbmVkIGludCBtb2RlICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgIDogMTA7Cit9IHJlZ19iaWZfY29yZV9yd19ncnAyX2NmZzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX2NvcmVfcndfZ3JwMl9jZmcgNAorI2RlZmluZSBSRUdfV1JfQUREUl9iaWZfY29yZV9yd19ncnAyX2NmZyA0CisKKy8qIFJlZ2lzdGVyIHJ3X2dycDNfY2ZnLCBzY29wZSBiaWZfY29yZSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgbHcgICAgICAgICA6IDY7CisgIHVuc2lnbmVkIGludCBldyAgICAgICAgIDogMzsKKyAgdW5zaWduZWQgaW50IHp3ICAgICAgICAgOiAzOworICB1bnNpZ25lZCBpbnQgYXcgICAgICAgICA6IDI7CisgIHVuc2lnbmVkIGludCBkdyAgICAgICAgIDogMjsKKyAgdW5zaWduZWQgaW50IGV3YiAgICAgICAgOiAyOworICB1bnNpZ25lZCBpbnQgYncgICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB3cl9leHRlbmQgIDogMTsKKyAgdW5zaWduZWQgaW50IGVyY19lbiAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgbW9kZSAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgIDogMjsKKyAgdW5zaWduZWQgaW50IGdhdGVkX2NzcDAgOiAyOworICB1bnNpZ25lZCBpbnQgZ2F0ZWRfY3NwMSA6IDI7CisgIHVuc2lnbmVkIGludCBnYXRlZF9jc3AyIDogMjsKKyAgdW5zaWduZWQgaW50IGdhdGVkX2NzcDMgOiAyOworfSByZWdfYmlmX2NvcmVfcndfZ3JwM19jZmc7CisjZGVmaW5lIFJFR19SRF9BRERSX2JpZl9jb3JlX3J3X2dycDNfY2ZnIDgKKyNkZWZpbmUgUkVHX1dSX0FERFJfYmlmX2NvcmVfcndfZ3JwM19jZmcgOAorCisvKiBSZWdpc3RlciByd19ncnA0X2NmZywgc2NvcGUgYmlmX2NvcmUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGx3ICAgICAgICAgOiA2OworICB1bnNpZ25lZCBpbnQgZXcgICAgICAgICA6IDM7CisgIHVuc2lnbmVkIGludCB6dyAgICAgICAgIDogMzsKKyAgdW5zaWduZWQgaW50IGF3ICAgICAgICAgOiAyOworICB1bnNpZ25lZCBpbnQgZHcgICAgICAgICA6IDI7CisgIHVuc2lnbmVkIGludCBld2IgICAgICAgIDogMjsKKyAgdW5zaWduZWQgaW50IGJ3ICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgd3JfZXh0ZW5kICA6IDE7CisgIHVuc2lnbmVkIGludCBlcmNfZW4gICAgIDogMTsKKyAgdW5zaWduZWQgaW50IG1vZGUgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICA6IDQ7CisgIHVuc2lnbmVkIGludCBnYXRlZF9jc3A0IDogMjsKKyAgdW5zaWduZWQgaW50IGdhdGVkX2NzcDUgOiAyOworICB1bnNpZ25lZCBpbnQgZ2F0ZWRfY3NwNiA6IDI7Cit9IHJlZ19iaWZfY29yZV9yd19ncnA0X2NmZzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX2NvcmVfcndfZ3JwNF9jZmcgMTIKKyNkZWZpbmUgUkVHX1dSX0FERFJfYmlmX2NvcmVfcndfZ3JwNF9jZmcgMTIKKworLyogUmVnaXN0ZXIgcndfc2RyYW1fY2ZnX2dycDAsIHNjb3BlIGJpZl9jb3JlLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBiYW5rX3NlbCA6IDU7CisgIHVuc2lnbmVkIGludCBjYSAgICAgICA6IDM7CisgIHVuc2lnbmVkIGludCB0eXBlICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBidyAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzaCAgICAgICA6IDM7CisgIHVuc2lnbmVkIGludCB3bW0gICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzaDE2ICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBncnBfc2VsICA6IDU7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICA6IDEyOworfSByZWdfYmlmX2NvcmVfcndfc2RyYW1fY2ZnX2dycDA7CisjZGVmaW5lIFJFR19SRF9BRERSX2JpZl9jb3JlX3J3X3NkcmFtX2NmZ19ncnAwIDE2CisjZGVmaW5lIFJFR19XUl9BRERSX2JpZl9jb3JlX3J3X3NkcmFtX2NmZ19ncnAwIDE2CisKKy8qIFJlZ2lzdGVyIHJ3X3NkcmFtX2NmZ19ncnAxLCBzY29wZSBiaWZfY29yZSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgYmFua19zZWwgOiA1OworICB1bnNpZ25lZCBpbnQgY2EgICAgICAgOiAzOworICB1bnNpZ25lZCBpbnQgdHlwZSAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgYncgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2ggICAgICAgOiAzOworICB1bnNpZ25lZCBpbnQgd21tICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2gxNiAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgOiAxNzsKK30gcmVnX2JpZl9jb3JlX3J3X3NkcmFtX2NmZ19ncnAxOworI2RlZmluZSBSRUdfUkRfQUREUl9iaWZfY29yZV9yd19zZHJhbV9jZmdfZ3JwMSAyMAorI2RlZmluZSBSRUdfV1JfQUREUl9iaWZfY29yZV9yd19zZHJhbV9jZmdfZ3JwMSAyMAorCisvKiBSZWdpc3RlciByd19zZHJhbV90aW1pbmcsIHNjb3BlIGJpZl9jb3JlLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBjbCAgICA6IDM7CisgIHVuc2lnbmVkIGludCByY2QgICA6IDM7CisgIHVuc2lnbmVkIGludCBycCAgICA6IDM7CisgIHVuc2lnbmVkIGludCByYyAgICA6IDI7CisgIHVuc2lnbmVkIGludCBkcGwgICA6IDI7CisgIHVuc2lnbmVkIGludCBwZGUgICA6IDE7CisgIHVuc2lnbmVkIGludCByZWYgICA6IDI7CisgIHVuc2lnbmVkIGludCBjcGQgICA6IDE7CisgIHVuc2lnbmVkIGludCBzZGNrZSA6IDE7CisgIHVuc2lnbmVkIGludCBzZGNsayA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxMzsKK30gcmVnX2JpZl9jb3JlX3J3X3NkcmFtX3RpbWluZzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX2NvcmVfcndfc2RyYW1fdGltaW5nIDI0CisjZGVmaW5lIFJFR19XUl9BRERSX2JpZl9jb3JlX3J3X3NkcmFtX3RpbWluZyAyNAorCisvKiBSZWdpc3RlciByd19zZHJhbV9jbWQsIHNjb3BlIGJpZl9jb3JlLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBjbWQgICAgICA6IDM7CisgIHVuc2lnbmVkIGludCBtcnNfZGF0YSA6IDE1OworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgOiAxNDsKK30gcmVnX2JpZl9jb3JlX3J3X3NkcmFtX2NtZDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX2NvcmVfcndfc2RyYW1fY21kIDI4CisjZGVmaW5lIFJFR19XUl9BRERSX2JpZl9jb3JlX3J3X3NkcmFtX2NtZCAyOAorCisvKiBSZWdpc3RlciByc19zZHJhbV9yZWZfc3RhdCwgc2NvcGUgYmlmX2NvcmUsIHR5cGUgcnMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IG9rIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDMxOworfSByZWdfYmlmX2NvcmVfcnNfc2RyYW1fcmVmX3N0YXQ7CisjZGVmaW5lIFJFR19SRF9BRERSX2JpZl9jb3JlX3JzX3NkcmFtX3JlZl9zdGF0IDMyCisKKy8qIFJlZ2lzdGVyIHJfc2RyYW1fcmVmX3N0YXQsIHNjb3BlIGJpZl9jb3JlLCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IG9rIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDMxOworfSByZWdfYmlmX2NvcmVfcl9zZHJhbV9yZWZfc3RhdDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX2NvcmVfcl9zZHJhbV9yZWZfc3RhdCAzNgorCisKKy8qIENvbnN0YW50cyAqLworZW51bSB7CisgIHJlZ2tfYmlmX2NvcmVfYmFuazIgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2JpZl9jb3JlX2Jhbms0ICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19iaWZfY29yZV9iaXQxMCAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMGEsCisgIHJlZ2tfYmlmX2NvcmVfYml0MTEgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDBiLAorICByZWdrX2JpZl9jb3JlX2JpdDEyICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwYywKKyAgcmVna19iaWZfY29yZV9iaXQxMyAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMGQsCisgIHJlZ2tfYmlmX2NvcmVfYml0MTQgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDBlLAorICByZWdrX2JpZl9jb3JlX2JpdDE1ICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwZiwKKyAgcmVna19iaWZfY29yZV9iaXQxNiAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMTAsCisgIHJlZ2tfYmlmX2NvcmVfYml0MTcgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDExLAorICByZWdrX2JpZl9jb3JlX2JpdDE4ICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAxMiwKKyAgcmVna19iaWZfY29yZV9iaXQxOSAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMTMsCisgIHJlZ2tfYmlmX2NvcmVfYml0MjAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDE0LAorICByZWdrX2JpZl9jb3JlX2JpdDIxICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAxNSwKKyAgcmVna19iaWZfY29yZV9iaXQyMiAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMTYsCisgIHJlZ2tfYmlmX2NvcmVfYml0MjMgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDE3LAorICByZWdrX2JpZl9jb3JlX2JpdDI0ICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAxOCwKKyAgcmVna19iaWZfY29yZV9iaXQyNSAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMTksCisgIHJlZ2tfYmlmX2NvcmVfYml0MjYgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDFhLAorICByZWdrX2JpZl9jb3JlX2JpdDI3ICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAxYiwKKyAgcmVna19iaWZfY29yZV9iaXQyOCAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMWMsCisgIHJlZ2tfYmlmX2NvcmVfYml0MjkgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDFkLAorICByZWdrX2JpZl9jb3JlX2JpdDkgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwOSwKKyAgcmVna19iaWZfY29yZV9idzE2ICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfYmlmX2NvcmVfYnczMiAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2JpZl9jb3JlX2J3ZSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19iaWZfY29yZV9jd2UgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfYmlmX2NvcmVfZTE1dXMgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2JpZl9jb3JlX2U3ODAwbnMgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19iaWZfY29yZV9ncnAwICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfYmlmX2NvcmVfZ3JwMSAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2JpZl9jb3JlX21ycyAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMywKKyAgcmVna19iaWZfY29yZV9ubyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfYmlmX2NvcmVfbm9uZSAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2JpZl9jb3JlX25vcCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19iaWZfY29yZV9vZmYgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfYmlmX2NvcmVfcHJlICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX2JpZl9jb3JlX3Jfc2RyYW1fcmVmX3N0YXRfZGVmYXVsdCAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19iaWZfY29yZV9yZCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIsCisgIHJlZ2tfYmlmX2NvcmVfcmVmICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2JpZl9jb3JlX3JzX3NkcmFtX3JlZl9zdGF0X2RlZmF1bHQgID0gMHgwMDAwMDAwMSwKKyAgcmVna19iaWZfY29yZV9yd19ncnAxX2NmZ19kZWZhdWx0ICAgICAgICA9IDB4MDAwMDA2Y2YsCisgIHJlZ2tfYmlmX2NvcmVfcndfZ3JwMl9jZmdfZGVmYXVsdCAgICAgICAgPSAweDAwMDAwNmNmLAorICByZWdrX2JpZl9jb3JlX3J3X2dycDNfY2ZnX2RlZmF1bHQgICAgICAgID0gMHgwMDAwMDZjZiwKKyAgcmVna19iaWZfY29yZV9yd19ncnA0X2NmZ19kZWZhdWx0ICAgICAgICA9IDB4MDAwMDA2Y2YsCisgIHJlZ2tfYmlmX2NvcmVfcndfc2RyYW1fY2ZnX2dycDFfZGVmYXVsdCAgPSAweDAwMDAwMDAwLAorICByZWdrX2JpZl9jb3JlX3NsZiAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNCwKKyAgcmVna19iaWZfY29yZV93ciAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfYmlmX2NvcmVfeWVzICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxCit9OworI2VuZGlmIC8qIF9fYmlmX2NvcmVfZGVmc19oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdyZWdzL2JpZl9kbWFfZGVmcy5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2h3cmVncy9iaWZfZG1hX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2I1MWEwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2h3cmVncy9iaWZfZG1hX2RlZnMuaApAQCAtMCwwICsxLDQ3MyBAQAorI2lmbmRlZiBfX2JpZl9kbWFfZGVmc19oCisjZGVmaW5lIF9fYmlmX2RtYV9kZWZzX2gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGZyb20KKyAqICAgZmlsZTogICAgICAgICAgIC4uLy4uL2luc3QvYmlmL3J0bC9iaWZfZG1hX3JlZ3MucgorICogICAgIGlkOiAgICAgICAgICAgYmlmX2RtYV9yZWdzLnIsdiAxLjYgMjAwNS8wMi8wNCAxMzoyODozMSBwZXJ6IEV4cCAKKyAqICAgICBsYXN0IG1vZGZpZWQ6IE1vbiBBcHIgMTEgMTY6MDY6MzMgMjAwNQorICogCisgKiAgIGJ5IC9uL2FzaWMvZGVzaWduL3Rvb2xzL3JkZXNjL3NyYy9yZGVzMmMgLS1vdXRmaWxlIGJpZl9kbWFfZGVmcy5oIC4uLy4uL2luc3QvYmlmL3J0bC9iaWZfZG1hX3JlZ3MucgorICogICAgICBpZDogJElkOiBiaWZfZG1hX2RlZnMuaCx2IDEuMSAyMDA3LzAyLzEzIDExOjU1OjMwIHN0YXJ2aWsgRXhwICQKKyAqIEFueSBjaGFuZ2VzIGhlcmUgd2lsbCBiZSBsb3N0LgorICoKKyAqIC0qLSBidWZmZXItcmVhZC1vbmx5OiB0IC0qLQorICovCisvKiBNYWluIGFjY2VzcyBtYWNyb3MgKi8KKyNpZm5kZWYgUkVHX1JECisjZGVmaW5lIFJFR19SRCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1IKKyNkZWZpbmUgUkVHX1dSKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfVkVDVAorI2RlZmluZSBSRUdfV1JfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXgsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlQKKyNkZWZpbmUgUkVHX1JEX0lOVCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlQKKyNkZWZpbmUgUkVHX1dSX0lOVCggc2NvcGUsIGluc3QsIHJlZywgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1dSX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19UWVBFX0NPTlYKKyNkZWZpbmUgUkVHX1RZUEVfQ09OViggdHlwZSwgb3JndHlwZSwgdmFsICkgXAorICAoIHsgdW5pb24geyBvcmd0eXBlIG87IHR5cGUgbjsgfSByOyByLm8gPSB2YWw7IHIubjsgfSApCisjZW5kaWYKKworI2lmbmRlZiByZWdfcGFnZV9zaXplCisjZGVmaW5lIHJlZ19wYWdlX3NpemUgODE5MgorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFIKKyNkZWZpbmUgUkVHX0FERFIoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19BRERSX1ZFQ1QKKyNkZWZpbmUgUkVHX0FERFJfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisvKiBDLWNvZGUgZm9yIHJlZ2lzdGVyIHNjb3BlIGJpZl9kbWEgKi8KKworLyogUmVnaXN0ZXIgcndfY2gwX2N0cmwsIHNjb3BlIGJpZl9kbWEsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGJ3ICAgICAgICAgOiAyOworICB1bnNpZ25lZCBpbnQgYnVyc3RfbGVuICA6IDE7CisgIHVuc2lnbmVkIGludCBjb250ICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGVuZF9wYWQgICAgOiAxOworICB1bnNpZ25lZCBpbnQgY250ICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkcmVxX3BpbiAgIDogMzsKKyAgdW5zaWduZWQgaW50IGRyZXFfbW9kZSAgOiAyOworICB1bnNpZ25lZCBpbnQgdGNfaW5fcGluICA6IDM7CisgIHVuc2lnbmVkIGludCB0Y19pbl9tb2RlIDogMjsKKyAgdW5zaWduZWQgaW50IGJ1c19tb2RlICAgOiAyOworICB1bnNpZ25lZCBpbnQgcmF0ZV9lbiAgICA6IDE7CisgIHVuc2lnbmVkIGludCB3cl9hbGwgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgOiAxMjsKK30gcmVnX2JpZl9kbWFfcndfY2gwX2N0cmw7CisjZGVmaW5lIFJFR19SRF9BRERSX2JpZl9kbWFfcndfY2gwX2N0cmwgMAorI2RlZmluZSBSRUdfV1JfQUREUl9iaWZfZG1hX3J3X2NoMF9jdHJsIDAKKworLyogUmVnaXN0ZXIgcndfY2gwX2FkZHIsIHNjb3BlIGJpZl9kbWEsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGFkZHIgOiAzMjsKK30gcmVnX2JpZl9kbWFfcndfY2gwX2FkZHI7CisjZGVmaW5lIFJFR19SRF9BRERSX2JpZl9kbWFfcndfY2gwX2FkZHIgNAorI2RlZmluZSBSRUdfV1JfQUREUl9iaWZfZG1hX3J3X2NoMF9hZGRyIDQKKworLyogUmVnaXN0ZXIgcndfY2gwX3N0YXJ0LCBzY29wZSBiaWZfZG1hLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBydW4gOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMzE7Cit9IHJlZ19iaWZfZG1hX3J3X2NoMF9zdGFydDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX2RtYV9yd19jaDBfc3RhcnQgOAorI2RlZmluZSBSRUdfV1JfQUREUl9iaWZfZG1hX3J3X2NoMF9zdGFydCA4CisKKy8qIFJlZ2lzdGVyIHJ3X2NoMF9jbnQsIHNjb3BlIGJpZl9kbWEsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHN0YXJ0X2NudCA6IDE2OworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgIDogMTY7Cit9IHJlZ19iaWZfZG1hX3J3X2NoMF9jbnQ7CisjZGVmaW5lIFJFR19SRF9BRERSX2JpZl9kbWFfcndfY2gwX2NudCAxMgorI2RlZmluZSBSRUdfV1JfQUREUl9iaWZfZG1hX3J3X2NoMF9jbnQgMTIKKworLyogUmVnaXN0ZXIgcl9jaDBfc3RhdCwgc2NvcGUgYmlmX2RtYSwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBjbnQgOiAxNjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDE1OworICB1bnNpZ25lZCBpbnQgcnVuIDogMTsKK30gcmVnX2JpZl9kbWFfcl9jaDBfc3RhdDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX2RtYV9yX2NoMF9zdGF0IDE2CisKKy8qIFJlZ2lzdGVyIHJ3X2NoMV9jdHJsLCBzY29wZSBiaWZfZG1hLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBidyAgICAgICAgICA6IDI7CisgIHVuc2lnbmVkIGludCBidXJzdF9sZW4gICA6IDE7CisgIHVuc2lnbmVkIGludCBjb250ICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBlbmRfZGlzY2FyZCA6IDE7CisgIHVuc2lnbmVkIGludCBjbnQgICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkcmVxX3BpbiAgICA6IDM7CisgIHVuc2lnbmVkIGludCBkcmVxX21vZGUgICA6IDI7CisgIHVuc2lnbmVkIGludCB0Y19pbl9waW4gICA6IDM7CisgIHVuc2lnbmVkIGludCB0Y19pbl9tb2RlICA6IDI7CisgIHVuc2lnbmVkIGludCBidXNfbW9kZSAgICA6IDI7CisgIHVuc2lnbmVkIGludCByYXRlX2VuICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICA6IDEzOworfSByZWdfYmlmX2RtYV9yd19jaDFfY3RybDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX2RtYV9yd19jaDFfY3RybCAzMgorI2RlZmluZSBSRUdfV1JfQUREUl9iaWZfZG1hX3J3X2NoMV9jdHJsIDMyCisKKy8qIFJlZ2lzdGVyIHJ3X2NoMV9hZGRyLCBzY29wZSBiaWZfZG1hLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBhZGRyIDogMzI7Cit9IHJlZ19iaWZfZG1hX3J3X2NoMV9hZGRyOworI2RlZmluZSBSRUdfUkRfQUREUl9iaWZfZG1hX3J3X2NoMV9hZGRyIDM2CisjZGVmaW5lIFJFR19XUl9BRERSX2JpZl9kbWFfcndfY2gxX2FkZHIgMzYKKworLyogUmVnaXN0ZXIgcndfY2gxX3N0YXJ0LCBzY29wZSBiaWZfZG1hLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBydW4gOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMzE7Cit9IHJlZ19iaWZfZG1hX3J3X2NoMV9zdGFydDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX2RtYV9yd19jaDFfc3RhcnQgNDAKKyNkZWZpbmUgUkVHX1dSX0FERFJfYmlmX2RtYV9yd19jaDFfc3RhcnQgNDAKKworLyogUmVnaXN0ZXIgcndfY2gxX2NudCwgc2NvcGUgYmlmX2RtYSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgc3RhcnRfY250IDogMTY7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgOiAxNjsKK30gcmVnX2JpZl9kbWFfcndfY2gxX2NudDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX2RtYV9yd19jaDFfY250IDQ0CisjZGVmaW5lIFJFR19XUl9BRERSX2JpZl9kbWFfcndfY2gxX2NudCA0NAorCisvKiBSZWdpc3RlciByX2NoMV9zdGF0LCBzY29wZSBiaWZfZG1hLCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGNudCA6IDE2OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTU7CisgIHVuc2lnbmVkIGludCBydW4gOiAxOworfSByZWdfYmlmX2RtYV9yX2NoMV9zdGF0OworI2RlZmluZSBSRUdfUkRfQUREUl9iaWZfZG1hX3JfY2gxX3N0YXQgNDgKKworLyogUmVnaXN0ZXIgcndfY2gyX2N0cmwsIHNjb3BlIGJpZl9kbWEsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGJ3ICAgICAgICAgOiAyOworICB1bnNpZ25lZCBpbnQgYnVyc3RfbGVuICA6IDE7CisgIHVuc2lnbmVkIGludCBjb250ICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGVuZF9wYWQgICAgOiAxOworICB1bnNpZ25lZCBpbnQgY250ICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkcmVxX3BpbiAgIDogMzsKKyAgdW5zaWduZWQgaW50IGRyZXFfbW9kZSAgOiAyOworICB1bnNpZ25lZCBpbnQgdGNfaW5fcGluICA6IDM7CisgIHVuc2lnbmVkIGludCB0Y19pbl9tb2RlIDogMjsKKyAgdW5zaWduZWQgaW50IGJ1c19tb2RlICAgOiAyOworICB1bnNpZ25lZCBpbnQgcmF0ZV9lbiAgICA6IDE7CisgIHVuc2lnbmVkIGludCB3cl9hbGwgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgOiAxMjsKK30gcmVnX2JpZl9kbWFfcndfY2gyX2N0cmw7CisjZGVmaW5lIFJFR19SRF9BRERSX2JpZl9kbWFfcndfY2gyX2N0cmwgNjQKKyNkZWZpbmUgUkVHX1dSX0FERFJfYmlmX2RtYV9yd19jaDJfY3RybCA2NAorCisvKiBSZWdpc3RlciByd19jaDJfYWRkciwgc2NvcGUgYmlmX2RtYSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgYWRkciA6IDMyOworfSByZWdfYmlmX2RtYV9yd19jaDJfYWRkcjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX2RtYV9yd19jaDJfYWRkciA2OAorI2RlZmluZSBSRUdfV1JfQUREUl9iaWZfZG1hX3J3X2NoMl9hZGRyIDY4CisKKy8qIFJlZ2lzdGVyIHJ3X2NoMl9zdGFydCwgc2NvcGUgYmlmX2RtYSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgcnVuIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDMxOworfSByZWdfYmlmX2RtYV9yd19jaDJfc3RhcnQ7CisjZGVmaW5lIFJFR19SRF9BRERSX2JpZl9kbWFfcndfY2gyX3N0YXJ0IDcyCisjZGVmaW5lIFJFR19XUl9BRERSX2JpZl9kbWFfcndfY2gyX3N0YXJ0IDcyCisKKy8qIFJlZ2lzdGVyIHJ3X2NoMl9jbnQsIHNjb3BlIGJpZl9kbWEsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHN0YXJ0X2NudCA6IDE2OworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgIDogMTY7Cit9IHJlZ19iaWZfZG1hX3J3X2NoMl9jbnQ7CisjZGVmaW5lIFJFR19SRF9BRERSX2JpZl9kbWFfcndfY2gyX2NudCA3NgorI2RlZmluZSBSRUdfV1JfQUREUl9iaWZfZG1hX3J3X2NoMl9jbnQgNzYKKworLyogUmVnaXN0ZXIgcl9jaDJfc3RhdCwgc2NvcGUgYmlmX2RtYSwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBjbnQgOiAxNjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDE1OworICB1bnNpZ25lZCBpbnQgcnVuIDogMTsKK30gcmVnX2JpZl9kbWFfcl9jaDJfc3RhdDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX2RtYV9yX2NoMl9zdGF0IDgwCisKKy8qIFJlZ2lzdGVyIHJ3X2NoM19jdHJsLCBzY29wZSBiaWZfZG1hLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBidyAgICAgICAgICA6IDI7CisgIHVuc2lnbmVkIGludCBidXJzdF9sZW4gICA6IDE7CisgIHVuc2lnbmVkIGludCBjb250ICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBlbmRfZGlzY2FyZCA6IDE7CisgIHVuc2lnbmVkIGludCBjbnQgICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkcmVxX3BpbiAgICA6IDM7CisgIHVuc2lnbmVkIGludCBkcmVxX21vZGUgICA6IDI7CisgIHVuc2lnbmVkIGludCB0Y19pbl9waW4gICA6IDM7CisgIHVuc2lnbmVkIGludCB0Y19pbl9tb2RlICA6IDI7CisgIHVuc2lnbmVkIGludCBidXNfbW9kZSAgICA6IDI7CisgIHVuc2lnbmVkIGludCByYXRlX2VuICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICA6IDEzOworfSByZWdfYmlmX2RtYV9yd19jaDNfY3RybDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX2RtYV9yd19jaDNfY3RybCA5NgorI2RlZmluZSBSRUdfV1JfQUREUl9iaWZfZG1hX3J3X2NoM19jdHJsIDk2CisKKy8qIFJlZ2lzdGVyIHJ3X2NoM19hZGRyLCBzY29wZSBiaWZfZG1hLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBhZGRyIDogMzI7Cit9IHJlZ19iaWZfZG1hX3J3X2NoM19hZGRyOworI2RlZmluZSBSRUdfUkRfQUREUl9iaWZfZG1hX3J3X2NoM19hZGRyIDEwMAorI2RlZmluZSBSRUdfV1JfQUREUl9iaWZfZG1hX3J3X2NoM19hZGRyIDEwMAorCisvKiBSZWdpc3RlciByd19jaDNfc3RhcnQsIHNjb3BlIGJpZl9kbWEsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHJ1biA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAzMTsKK30gcmVnX2JpZl9kbWFfcndfY2gzX3N0YXJ0OworI2RlZmluZSBSRUdfUkRfQUREUl9iaWZfZG1hX3J3X2NoM19zdGFydCAxMDQKKyNkZWZpbmUgUkVHX1dSX0FERFJfYmlmX2RtYV9yd19jaDNfc3RhcnQgMTA0CisKKy8qIFJlZ2lzdGVyIHJ3X2NoM19jbnQsIHNjb3BlIGJpZl9kbWEsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHN0YXJ0X2NudCA6IDE2OworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgIDogMTY7Cit9IHJlZ19iaWZfZG1hX3J3X2NoM19jbnQ7CisjZGVmaW5lIFJFR19SRF9BRERSX2JpZl9kbWFfcndfY2gzX2NudCAxMDgKKyNkZWZpbmUgUkVHX1dSX0FERFJfYmlmX2RtYV9yd19jaDNfY250IDEwOAorCisvKiBSZWdpc3RlciByX2NoM19zdGF0LCBzY29wZSBiaWZfZG1hLCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGNudCA6IDE2OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTU7CisgIHVuc2lnbmVkIGludCBydW4gOiAxOworfSByZWdfYmlmX2RtYV9yX2NoM19zdGF0OworI2RlZmluZSBSRUdfUkRfQUREUl9iaWZfZG1hX3JfY2gzX3N0YXQgMTEyCisKKy8qIFJlZ2lzdGVyIHJ3X2ludHJfbWFzaywgc2NvcGUgYmlmX2RtYSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZXh0X2RtYTAgOiAxOworICB1bnNpZ25lZCBpbnQgZXh0X2RtYTEgOiAxOworICB1bnNpZ25lZCBpbnQgZXh0X2RtYTIgOiAxOworICB1bnNpZ25lZCBpbnQgZXh0X2RtYTMgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgOiAyODsKK30gcmVnX2JpZl9kbWFfcndfaW50cl9tYXNrOworI2RlZmluZSBSRUdfUkRfQUREUl9iaWZfZG1hX3J3X2ludHJfbWFzayAxMjgKKyNkZWZpbmUgUkVHX1dSX0FERFJfYmlmX2RtYV9yd19pbnRyX21hc2sgMTI4CisKKy8qIFJlZ2lzdGVyIHJ3X2Fja19pbnRyLCBzY29wZSBiaWZfZG1hLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBleHRfZG1hMCA6IDE7CisgIHVuc2lnbmVkIGludCBleHRfZG1hMSA6IDE7CisgIHVuc2lnbmVkIGludCBleHRfZG1hMiA6IDE7CisgIHVuc2lnbmVkIGludCBleHRfZG1hMyA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICA6IDI4OworfSByZWdfYmlmX2RtYV9yd19hY2tfaW50cjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX2RtYV9yd19hY2tfaW50ciAxMzIKKyNkZWZpbmUgUkVHX1dSX0FERFJfYmlmX2RtYV9yd19hY2tfaW50ciAxMzIKKworLyogUmVnaXN0ZXIgcl9pbnRyLCBzY29wZSBiaWZfZG1hLCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGV4dF9kbWEwIDogMTsKKyAgdW5zaWduZWQgaW50IGV4dF9kbWExIDogMTsKKyAgdW5zaWduZWQgaW50IGV4dF9kbWEyIDogMTsKKyAgdW5zaWduZWQgaW50IGV4dF9kbWEzIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgIDogMjg7Cit9IHJlZ19iaWZfZG1hX3JfaW50cjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX2RtYV9yX2ludHIgMTM2CisKKy8qIFJlZ2lzdGVyIHJfbWFza2VkX2ludHIsIHNjb3BlIGJpZl9kbWEsIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZXh0X2RtYTAgOiAxOworICB1bnNpZ25lZCBpbnQgZXh0X2RtYTEgOiAxOworICB1bnNpZ25lZCBpbnQgZXh0X2RtYTIgOiAxOworICB1bnNpZ25lZCBpbnQgZXh0X2RtYTMgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgOiAyODsKK30gcmVnX2JpZl9kbWFfcl9tYXNrZWRfaW50cjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX2RtYV9yX21hc2tlZF9pbnRyIDE0MAorCisvKiBSZWdpc3RlciByd19waW4wX2NmZywgc2NvcGUgYmlmX2RtYSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgbWFzdGVyX2NoICAgOiAyOworICB1bnNpZ25lZCBpbnQgbWFzdGVyX21vZGUgOiAzOworICB1bnNpZ25lZCBpbnQgc2xhdmVfY2ggICAgOiAyOworICB1bnNpZ25lZCBpbnQgc2xhdmVfbW9kZSAgOiAzOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICAgOiAyMjsKK30gcmVnX2JpZl9kbWFfcndfcGluMF9jZmc7CisjZGVmaW5lIFJFR19SRF9BRERSX2JpZl9kbWFfcndfcGluMF9jZmcgMTYwCisjZGVmaW5lIFJFR19XUl9BRERSX2JpZl9kbWFfcndfcGluMF9jZmcgMTYwCisKKy8qIFJlZ2lzdGVyIHJ3X3BpbjFfY2ZnLCBzY29wZSBiaWZfZG1hLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBtYXN0ZXJfY2ggICA6IDI7CisgIHVuc2lnbmVkIGludCBtYXN0ZXJfbW9kZSA6IDM7CisgIHVuc2lnbmVkIGludCBzbGF2ZV9jaCAgICA6IDI7CisgIHVuc2lnbmVkIGludCBzbGF2ZV9tb2RlICA6IDM7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICA6IDIyOworfSByZWdfYmlmX2RtYV9yd19waW4xX2NmZzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX2RtYV9yd19waW4xX2NmZyAxNjQKKyNkZWZpbmUgUkVHX1dSX0FERFJfYmlmX2RtYV9yd19waW4xX2NmZyAxNjQKKworLyogUmVnaXN0ZXIgcndfcGluMl9jZmcsIHNjb3BlIGJpZl9kbWEsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IG1hc3Rlcl9jaCAgIDogMjsKKyAgdW5zaWduZWQgaW50IG1hc3Rlcl9tb2RlIDogMzsKKyAgdW5zaWduZWQgaW50IHNsYXZlX2NoICAgIDogMjsKKyAgdW5zaWduZWQgaW50IHNsYXZlX21vZGUgIDogMzsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgIDogMjI7Cit9IHJlZ19iaWZfZG1hX3J3X3BpbjJfY2ZnOworI2RlZmluZSBSRUdfUkRfQUREUl9iaWZfZG1hX3J3X3BpbjJfY2ZnIDE2OAorI2RlZmluZSBSRUdfV1JfQUREUl9iaWZfZG1hX3J3X3BpbjJfY2ZnIDE2OAorCisvKiBSZWdpc3RlciByd19waW4zX2NmZywgc2NvcGUgYmlmX2RtYSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgbWFzdGVyX2NoICAgOiAyOworICB1bnNpZ25lZCBpbnQgbWFzdGVyX21vZGUgOiAzOworICB1bnNpZ25lZCBpbnQgc2xhdmVfY2ggICAgOiAyOworICB1bnNpZ25lZCBpbnQgc2xhdmVfbW9kZSAgOiAzOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICAgOiAyMjsKK30gcmVnX2JpZl9kbWFfcndfcGluM19jZmc7CisjZGVmaW5lIFJFR19SRF9BRERSX2JpZl9kbWFfcndfcGluM19jZmcgMTcyCisjZGVmaW5lIFJFR19XUl9BRERSX2JpZl9kbWFfcndfcGluM19jZmcgMTcyCisKKy8qIFJlZ2lzdGVyIHJ3X3BpbjRfY2ZnLCBzY29wZSBiaWZfZG1hLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBtYXN0ZXJfY2ggICA6IDI7CisgIHVuc2lnbmVkIGludCBtYXN0ZXJfbW9kZSA6IDM7CisgIHVuc2lnbmVkIGludCBzbGF2ZV9jaCAgICA6IDI7CisgIHVuc2lnbmVkIGludCBzbGF2ZV9tb2RlICA6IDM7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICA6IDIyOworfSByZWdfYmlmX2RtYV9yd19waW40X2NmZzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX2RtYV9yd19waW40X2NmZyAxNzYKKyNkZWZpbmUgUkVHX1dSX0FERFJfYmlmX2RtYV9yd19waW40X2NmZyAxNzYKKworLyogUmVnaXN0ZXIgcndfcGluNV9jZmcsIHNjb3BlIGJpZl9kbWEsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IG1hc3Rlcl9jaCAgIDogMjsKKyAgdW5zaWduZWQgaW50IG1hc3Rlcl9tb2RlIDogMzsKKyAgdW5zaWduZWQgaW50IHNsYXZlX2NoICAgIDogMjsKKyAgdW5zaWduZWQgaW50IHNsYXZlX21vZGUgIDogMzsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgIDogMjI7Cit9IHJlZ19iaWZfZG1hX3J3X3BpbjVfY2ZnOworI2RlZmluZSBSRUdfUkRfQUREUl9iaWZfZG1hX3J3X3BpbjVfY2ZnIDE4MAorI2RlZmluZSBSRUdfV1JfQUREUl9iaWZfZG1hX3J3X3BpbjVfY2ZnIDE4MAorCisvKiBSZWdpc3RlciByd19waW42X2NmZywgc2NvcGUgYmlmX2RtYSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgbWFzdGVyX2NoICAgOiAyOworICB1bnNpZ25lZCBpbnQgbWFzdGVyX21vZGUgOiAzOworICB1bnNpZ25lZCBpbnQgc2xhdmVfY2ggICAgOiAyOworICB1bnNpZ25lZCBpbnQgc2xhdmVfbW9kZSAgOiAzOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICAgOiAyMjsKK30gcmVnX2JpZl9kbWFfcndfcGluNl9jZmc7CisjZGVmaW5lIFJFR19SRF9BRERSX2JpZl9kbWFfcndfcGluNl9jZmcgMTg0CisjZGVmaW5lIFJFR19XUl9BRERSX2JpZl9kbWFfcndfcGluNl9jZmcgMTg0CisKKy8qIFJlZ2lzdGVyIHJ3X3BpbjdfY2ZnLCBzY29wZSBiaWZfZG1hLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBtYXN0ZXJfY2ggICA6IDI7CisgIHVuc2lnbmVkIGludCBtYXN0ZXJfbW9kZSA6IDM7CisgIHVuc2lnbmVkIGludCBzbGF2ZV9jaCAgICA6IDI7CisgIHVuc2lnbmVkIGludCBzbGF2ZV9tb2RlICA6IDM7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICA6IDIyOworfSByZWdfYmlmX2RtYV9yd19waW43X2NmZzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX2RtYV9yd19waW43X2NmZyAxODgKKyNkZWZpbmUgUkVHX1dSX0FERFJfYmlmX2RtYV9yd19waW43X2NmZyAxODgKKworLyogUmVnaXN0ZXIgcl9waW5fc3RhdCwgc2NvcGUgYmlmX2RtYSwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBwaW4wIDogMTsKKyAgdW5zaWduZWQgaW50IHBpbjEgOiAxOworICB1bnNpZ25lZCBpbnQgcGluMiA6IDE7CisgIHVuc2lnbmVkIGludCBwaW4zIDogMTsKKyAgdW5zaWduZWQgaW50IHBpbjQgOiAxOworICB1bnNpZ25lZCBpbnQgcGluNSA6IDE7CisgIHVuc2lnbmVkIGludCBwaW42IDogMTsKKyAgdW5zaWduZWQgaW50IHBpbjcgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjQ7Cit9IHJlZ19iaWZfZG1hX3JfcGluX3N0YXQ7CisjZGVmaW5lIFJFR19SRF9BRERSX2JpZl9kbWFfcl9waW5fc3RhdCAxOTIKKworCisvKiBDb25zdGFudHMgKi8KK2VudW0geworICByZWdrX2JpZl9kbWFfYXNfbWFzdGVyICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19iaWZfZG1hX2FzX3NsYXZlICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfYmlmX2RtYV9idXJzdDEgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2JpZl9kbWFfYnVyc3Q4ICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19iaWZfZG1hX2J3MTYgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfYmlmX2RtYV9idzMyICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX2JpZl9kbWFfYnc4ICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19iaWZfZG1hX2RhY2sgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDYsCisgIHJlZ2tfYmlmX2RtYV9kYWNrX2ludiAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA3LAorICByZWdrX2JpZl9kbWFfZm9yY2UgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19iaWZfZG1hX2hpICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfYmlmX2RtYV9pbnYgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAzLAorICByZWdrX2JpZl9kbWFfbG8gICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19iaWZfZG1hX21hc3RlciAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfYmlmX2RtYV9ubyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2JpZl9kbWFfbm9ybSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19iaWZfZG1hX29mZiAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfYmlmX2RtYV9yd19jaDBfY3RybF9kZWZhdWx0ICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2JpZl9kbWFfcndfY2gwX3N0YXJ0X2RlZmF1bHQgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19iaWZfZG1hX3J3X2NoMV9jdHJsX2RlZmF1bHQgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfYmlmX2RtYV9yd19jaDFfc3RhcnRfZGVmYXVsdCAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2JpZl9kbWFfcndfY2gyX2N0cmxfZGVmYXVsdCAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19iaWZfZG1hX3J3X2NoMl9zdGFydF9kZWZhdWx0ICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfYmlmX2RtYV9yd19jaDNfY3RybF9kZWZhdWx0ICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2JpZl9kbWFfcndfY2gzX3N0YXJ0X2RlZmF1bHQgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19iaWZfZG1hX3J3X2ludHJfbWFza19kZWZhdWx0ICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfYmlmX2RtYV9yd19waW4wX2NmZ19kZWZhdWx0ICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2JpZl9kbWFfcndfcGluMV9jZmdfZGVmYXVsdCAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19iaWZfZG1hX3J3X3BpbjJfY2ZnX2RlZmF1bHQgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfYmlmX2RtYV9yd19waW4zX2NmZ19kZWZhdWx0ICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2JpZl9kbWFfcndfcGluNF9jZmdfZGVmYXVsdCAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19iaWZfZG1hX3J3X3BpbjVfY2ZnX2RlZmF1bHQgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfYmlmX2RtYV9yd19waW42X2NmZ19kZWZhdWx0ICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2JpZl9kbWFfcndfcGluN19jZmdfZGVmYXVsdCAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19iaWZfZG1hX3NsYXZlICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIsCisgIHJlZ2tfYmlmX2RtYV9zcmVxICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA2LAorICByZWdrX2JpZl9kbWFfc3JlcV9pbnYgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNywKKyAgcmVna19iaWZfZG1hX3RjICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDQsCisgIHJlZ2tfYmlmX2RtYV90Y19pbnYgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA1LAorICByZWdrX2JpZl9kbWFfeWVzICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMQorfTsKKyNlbmRpZiAvKiBfX2JpZl9kbWFfZGVmc19oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdyZWdzL2JpZl9zbGF2ZV9kZWZzLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdyZWdzL2JpZl9zbGF2ZV9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM0MzQ1OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1mcy9od3JlZ3MvYmlmX3NsYXZlX2RlZnMuaApAQCAtMCwwICsxLDI0OSBAQAorI2lmbmRlZiBfX2JpZl9zbGF2ZV9kZWZzX2gKKyNkZWZpbmUgX19iaWZfc2xhdmVfZGVmc19oCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCisgKiAgIGZpbGU6ICAgICAgICAgICAuLi8uLi9pbnN0L2JpZi9ydGwvYmlmX3NsYXZlX3JlZ3MucgorICogICAgIGlkOiAgICAgICAgICAgYmlmX3NsYXZlX3JlZ3Mucix2IDEuNSAyMDA1LzAyLzA0IDEzOjU1OjI4IHBlcnogRXhwIAorICogICAgIGxhc3QgbW9kZmllZDogTW9uIEFwciAxMSAxNjowNjozNCAyMDA1CisgKiAKKyAqICAgYnkgL24vYXNpYy9kZXNpZ24vdG9vbHMvcmRlc2Mvc3JjL3JkZXMyYyAtLW91dGZpbGUgYmlmX3NsYXZlX2RlZnMuaCAuLi8uLi9pbnN0L2JpZi9ydGwvYmlmX3NsYXZlX3JlZ3MucgorICogICAgICBpZDogJElkOiBiaWZfc2xhdmVfZGVmcy5oLHYgMS4xIDIwMDcvMDIvMTMgMTE6NTU6MzAgc3RhcnZpayBFeHAgJAorICogQW55IGNoYW5nZXMgaGVyZSB3aWxsIGJlIGxvc3QuCisgKgorICogLSotIGJ1ZmZlci1yZWFkLW9ubHk6IHQgLSotCisgKi8KKy8qIE1haW4gYWNjZXNzIG1hY3JvcyAqLworI2lmbmRlZiBSRUdfUkQKKyNkZWZpbmUgUkVHX1JEKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUgorI2RlZmluZSBSRUdfV1IoIHNjb3BlLCBpbnN0LCByZWcsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfVkVDVAorI2RlZmluZSBSRUdfUkRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgIFJFR19SRUFEKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9WRUNUCisjZGVmaW5lIFJFR19XUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgICAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX0lOVAorI2RlZmluZSBSRUdfUkRfSU5UKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSX0lOVAorI2RlZmluZSBSRUdfV1JfSU5UKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlRfVkVDVAorI2RlZmluZSBSRUdfUkRfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlRfVkVDVAorI2RlZmluZSBSRUdfV1JfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4LCB2YWwgKSBcCisgIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1RZUEVfQ09OVgorI2RlZmluZSBSRUdfVFlQRV9DT05WKCB0eXBlLCBvcmd0eXBlLCB2YWwgKSBcCisgICggeyB1bmlvbiB7IG9yZ3R5cGUgbzsgdHlwZSBuOyB9IHI7IHIubyA9IHZhbDsgci5uOyB9ICkKKyNlbmRpZgorCisjaWZuZGVmIHJlZ19wYWdlX3NpemUKKyNkZWZpbmUgcmVnX3BhZ2Vfc2l6ZSA4MTkyCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUgorI2RlZmluZSBSRUdfQUREUiggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFJfVkVDVAorI2RlZmluZSBSRUdfQUREUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKy8qIEMtY29kZSBmb3IgcmVnaXN0ZXIgc2NvcGUgYmlmX3NsYXZlICovCisKKy8qIFJlZ2lzdGVyIHJ3X3NsYXZlX2NmZywgc2NvcGUgYmlmX3NsYXZlLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBzbGF2ZV9pZCAgICAgOiAzOworICB1bnNpZ25lZCBpbnQgdXNlX3NsYXZlX2lkIDogMTsKKyAgdW5zaWduZWQgaW50IGJvb3RfcmR5ICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBsb29wYmFjayAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZGlzICAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgICA6IDI1OworfSByZWdfYmlmX3NsYXZlX3J3X3NsYXZlX2NmZzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX3NsYXZlX3J3X3NsYXZlX2NmZyAwCisjZGVmaW5lIFJFR19XUl9BRERSX2JpZl9zbGF2ZV9yd19zbGF2ZV9jZmcgMAorCisvKiBSZWdpc3RlciByX3NsYXZlX21vZGUsIHNjb3BlIGJpZl9zbGF2ZSwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBjaDBfbW9kZSA6IDE7CisgIHVuc2lnbmVkIGludCBjaDFfbW9kZSA6IDE7CisgIHVuc2lnbmVkIGludCBjaDJfbW9kZSA6IDE7CisgIHVuc2lnbmVkIGludCBjaDNfbW9kZSA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICA6IDI4OworfSByZWdfYmlmX3NsYXZlX3Jfc2xhdmVfbW9kZTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX3NsYXZlX3Jfc2xhdmVfbW9kZSA0CisKKy8qIFJlZ2lzdGVyIHJ3X2NoMF9jZmcsIHNjb3BlIGJpZl9zbGF2ZSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgcmRfaG9sZCAgICAgOiAyOworICB1bnNpZ25lZCBpbnQgYWNjZXNzX21vZGUgOiAxOworICB1bnNpZ25lZCBpbnQgYWNjZXNzX2N0cmwgOiAxOworICB1bnNpZ25lZCBpbnQgZGF0YV9jcyAgICAgOiAyOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICAgOiAyNjsKK30gcmVnX2JpZl9zbGF2ZV9yd19jaDBfY2ZnOworI2RlZmluZSBSRUdfUkRfQUREUl9iaWZfc2xhdmVfcndfY2gwX2NmZyAxNgorI2RlZmluZSBSRUdfV1JfQUREUl9iaWZfc2xhdmVfcndfY2gwX2NmZyAxNgorCisvKiBSZWdpc3RlciByd19jaDFfY2ZnLCBzY29wZSBiaWZfc2xhdmUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHJkX2hvbGQgICAgIDogMjsKKyAgdW5zaWduZWQgaW50IGFjY2Vzc19tb2RlIDogMTsKKyAgdW5zaWduZWQgaW50IGFjY2Vzc19jdHJsIDogMTsKKyAgdW5zaWduZWQgaW50IGRhdGFfY3MgICAgIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgIDogMjY7Cit9IHJlZ19iaWZfc2xhdmVfcndfY2gxX2NmZzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX3NsYXZlX3J3X2NoMV9jZmcgMjAKKyNkZWZpbmUgUkVHX1dSX0FERFJfYmlmX3NsYXZlX3J3X2NoMV9jZmcgMjAKKworLyogUmVnaXN0ZXIgcndfY2gyX2NmZywgc2NvcGUgYmlmX3NsYXZlLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCByZF9ob2xkICAgICA6IDI7CisgIHVuc2lnbmVkIGludCBhY2Nlc3NfbW9kZSA6IDE7CisgIHVuc2lnbmVkIGludCBhY2Nlc3NfY3RybCA6IDE7CisgIHVuc2lnbmVkIGludCBkYXRhX2NzICAgICA6IDI7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICA6IDI2OworfSByZWdfYmlmX3NsYXZlX3J3X2NoMl9jZmc7CisjZGVmaW5lIFJFR19SRF9BRERSX2JpZl9zbGF2ZV9yd19jaDJfY2ZnIDI0CisjZGVmaW5lIFJFR19XUl9BRERSX2JpZl9zbGF2ZV9yd19jaDJfY2ZnIDI0CisKKy8qIFJlZ2lzdGVyIHJ3X2NoM19jZmcsIHNjb3BlIGJpZl9zbGF2ZSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgcmRfaG9sZCAgICAgOiAyOworICB1bnNpZ25lZCBpbnQgYWNjZXNzX21vZGUgOiAxOworICB1bnNpZ25lZCBpbnQgYWNjZXNzX2N0cmwgOiAxOworICB1bnNpZ25lZCBpbnQgZGF0YV9jcyAgICAgOiAyOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICAgOiAyNjsKK30gcmVnX2JpZl9zbGF2ZV9yd19jaDNfY2ZnOworI2RlZmluZSBSRUdfUkRfQUREUl9iaWZfc2xhdmVfcndfY2gzX2NmZyAyOAorI2RlZmluZSBSRUdfV1JfQUREUl9iaWZfc2xhdmVfcndfY2gzX2NmZyAyOAorCisvKiBSZWdpc3RlciByd19hcmJfY2ZnLCBzY29wZSBiaWZfc2xhdmUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGJyaW5fbW9kZSAgIDogMTsKKyAgdW5zaWduZWQgaW50IGJyb3V0X21vZGUgIDogMzsKKyAgdW5zaWduZWQgaW50IGJnX21vZGUgICAgIDogMzsKKyAgdW5zaWduZWQgaW50IHJlbGVhc2UgICAgIDogMjsKKyAgdW5zaWduZWQgaW50IGFjcXVpcmUgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNldHRsZV90aW1lIDogMjsKKyAgdW5zaWduZWQgaW50IGRyYW1fY3RybCAgIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgIDogMTk7Cit9IHJlZ19iaWZfc2xhdmVfcndfYXJiX2NmZzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX3NsYXZlX3J3X2FyYl9jZmcgMzIKKyNkZWZpbmUgUkVHX1dSX0FERFJfYmlmX3NsYXZlX3J3X2FyYl9jZmcgMzIKKworLyogUmVnaXN0ZXIgcl9hcmJfc3RhdCwgc2NvcGUgYmlmX3NsYXZlLCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGluaXRfbW9kZSA6IDE7CisgIHVuc2lnbmVkIGludCBtb2RlICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgYnJpbiAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGJyb3V0ICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBiZyAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgIDogMjc7Cit9IHJlZ19iaWZfc2xhdmVfcl9hcmJfc3RhdDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX3NsYXZlX3JfYXJiX3N0YXQgMzYKKworLyogUmVnaXN0ZXIgcndfaW50cl9tYXNrLCBzY29wZSBiaWZfc2xhdmUsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGJ1c19yZWxlYXNlIDogMTsKKyAgdW5zaWduZWQgaW50IGJ1c19hY3F1aXJlIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgIDogMzA7Cit9IHJlZ19iaWZfc2xhdmVfcndfaW50cl9tYXNrOworI2RlZmluZSBSRUdfUkRfQUREUl9iaWZfc2xhdmVfcndfaW50cl9tYXNrIDY0CisjZGVmaW5lIFJFR19XUl9BRERSX2JpZl9zbGF2ZV9yd19pbnRyX21hc2sgNjQKKworLyogUmVnaXN0ZXIgcndfYWNrX2ludHIsIHNjb3BlIGJpZl9zbGF2ZSwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgYnVzX3JlbGVhc2UgOiAxOworICB1bnNpZ25lZCBpbnQgYnVzX2FjcXVpcmUgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICAgOiAzMDsKK30gcmVnX2JpZl9zbGF2ZV9yd19hY2tfaW50cjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX3NsYXZlX3J3X2Fja19pbnRyIDY4CisjZGVmaW5lIFJFR19XUl9BRERSX2JpZl9zbGF2ZV9yd19hY2tfaW50ciA2OAorCisvKiBSZWdpc3RlciByX2ludHIsIHNjb3BlIGJpZl9zbGF2ZSwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBidXNfcmVsZWFzZSA6IDE7CisgIHVuc2lnbmVkIGludCBidXNfYWNxdWlyZSA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICA6IDMwOworfSByZWdfYmlmX3NsYXZlX3JfaW50cjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfYmlmX3NsYXZlX3JfaW50ciA3MgorCisvKiBSZWdpc3RlciByX21hc2tlZF9pbnRyLCBzY29wZSBiaWZfc2xhdmUsIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgYnVzX3JlbGVhc2UgOiAxOworICB1bnNpZ25lZCBpbnQgYnVzX2FjcXVpcmUgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICAgOiAzMDsKK30gcmVnX2JpZl9zbGF2ZV9yX21hc2tlZF9pbnRyOworI2RlZmluZSBSRUdfUkRfQUREUl9iaWZfc2xhdmVfcl9tYXNrZWRfaW50ciA3NgorCisKKy8qIENvbnN0YW50cyAqLworZW51bSB7CisgIHJlZ2tfYmlmX3NsYXZlX2FjdGl2ZV9oaSAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAzLAorICByZWdrX2JpZl9zbGF2ZV9hY3RpdmVfbG8gICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19iaWZfc2xhdmVfYWRkciAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfYmlmX3NsYXZlX2Fsd2F5cyAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2JpZl9zbGF2ZV9hdF9pZGxlICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19iaWZfc2xhdmVfYnVyc3RfZW5kICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfYmlmX3NsYXZlX2RtYSAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2JpZl9zbGF2ZV9oaSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMywKKyAgcmVna19iaWZfc2xhdmVfaW52ICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfYmlmX3NsYXZlX2xvICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX2JpZl9zbGF2ZV9sb2NhbCAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19iaWZfc2xhdmVfbWFzdGVyICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfYmlmX3NsYXZlX21vZGVfcmVnICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2JpZl9zbGF2ZV9ubyAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19iaWZfc2xhdmVfbm9ybSAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfYmlmX3NsYXZlX29uX2FjY2VzcyAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2JpZl9zbGF2ZV9yd19hcmJfY2ZnX2RlZmF1bHQgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19iaWZfc2xhdmVfcndfY2gwX2NmZ19kZWZhdWx0ICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfYmlmX3NsYXZlX3J3X2NoMV9jZmdfZGVmYXVsdCAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2JpZl9zbGF2ZV9yd19jaDJfY2ZnX2RlZmF1bHQgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19iaWZfc2xhdmVfcndfY2gzX2NmZ19kZWZhdWx0ICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfYmlmX3NsYXZlX3J3X2ludHJfbWFza19kZWZhdWx0ICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2JpZl9zbGF2ZV9yd19zbGF2ZV9jZmdfZGVmYXVsdCAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19iaWZfc2xhdmVfc2hhcmVkICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfYmlmX3NsYXZlX3NsYXZlICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2JpZl9zbGF2ZV90MG5zICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMywKKyAgcmVna19iaWZfc2xhdmVfdDEwbnMgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIsCisgIHJlZ2tfYmlmX3NsYXZlX3QyMG5zICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAzLAorICByZWdrX2JpZl9zbGF2ZV90MzBucyAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19iaWZfc2xhdmVfdDQwbnMgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfYmlmX3NsYXZlX3Q1MG5zICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2JpZl9zbGF2ZV95ZXMgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19iaWZfc2xhdmVfeiAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDQKK307CisjZW5kaWYgLyogX19iaWZfc2xhdmVfZGVmc19oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdyZWdzL2NvbmZpZ19kZWZzLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdyZWdzL2NvbmZpZ19kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJjNWYyMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1mcy9od3JlZ3MvY29uZmlnX2RlZnMuaApAQCAtMCwwICsxLDE0MiBAQAorI2lmbmRlZiBfX2NvbmZpZ19kZWZzX2gKKyNkZWZpbmUgX19jb25maWdfZGVmc19oCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCisgKiAgIGZpbGU6ICAgICAgICAgICAuLi8uLi9ydGwvY29uZmlnX3JlZ3MucgorICogICAgIGlkOiAgICAgICAgICAgY29uZmlnX3JlZ3Mucix2IDEuMjMgMjAwNC8wMy8wNCAxMTozNDo0MiBtaWthZWxuIEV4cCAKKyAqICAgICBsYXN0IG1vZGZpZWQ6IFRodSBNYXIgIDQgMTI6MzQ6MzkgMjAwNAorICogCisgKiAgIGJ5IC9uL2FzaWMvZGVzaWduL3Rvb2xzL3JkZXNjL3NyYy9yZGVzMmMgLS1vdXRmaWxlIGNvbmZpZ19kZWZzLmggLi4vLi4vcnRsL2NvbmZpZ19yZWdzLnIKKyAqICAgICAgaWQ6ICRJZDogY29uZmlnX2RlZnMuaCx2IDEuMSAyMDA3LzAyLzEzIDExOjU1OjMwIHN0YXJ2aWsgRXhwICQKKyAqIEFueSBjaGFuZ2VzIGhlcmUgd2lsbCBiZSBsb3N0LgorICoKKyAqIC0qLSBidWZmZXItcmVhZC1vbmx5OiB0IC0qLQorICovCisvKiBNYWluIGFjY2VzcyBtYWNyb3MgKi8KKyNpZm5kZWYgUkVHX1JECisjZGVmaW5lIFJFR19SRCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1IKKyNkZWZpbmUgUkVHX1dSKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfVkVDVAorI2RlZmluZSBSRUdfV1JfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXgsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlQKKyNkZWZpbmUgUkVHX1JEX0lOVCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlQKKyNkZWZpbmUgUkVHX1dSX0lOVCggc2NvcGUsIGluc3QsIHJlZywgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1dSX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19UWVBFX0NPTlYKKyNkZWZpbmUgUkVHX1RZUEVfQ09OViggdHlwZSwgb3JndHlwZSwgdmFsICkgXAorICAoIHsgdW5pb24geyBvcmd0eXBlIG87IHR5cGUgbjsgfSByOyByLm8gPSB2YWw7IHIubjsgfSApCisjZW5kaWYKKworI2lmbmRlZiByZWdfcGFnZV9zaXplCisjZGVmaW5lIHJlZ19wYWdlX3NpemUgODE5MgorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFIKKyNkZWZpbmUgUkVHX0FERFIoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19BRERSX1ZFQ1QKKyNkZWZpbmUgUkVHX0FERFJfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisvKiBDLWNvZGUgZm9yIHJlZ2lzdGVyIHNjb3BlIGNvbmZpZyAqLworCisvKiBSZWdpc3RlciByX2Jvb3RzZWwsIHNjb3BlIGNvbmZpZywgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBib290X21vZGUgICA6IDM7CisgIHVuc2lnbmVkIGludCBmdWxsX2R1cGxleCA6IDE7CisgIHVuc2lnbmVkIGludCB1c2VyICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBwbGwgICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBmbGFzaF9idyAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICA6IDI1OworfSByZWdfY29uZmlnX3JfYm9vdHNlbDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfY29uZmlnX3JfYm9vdHNlbCAwCisKKy8qIFJlZ2lzdGVyIHJ3X2Nsa19jdHJsLCBzY29wZSBjb25maWcsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHBsbCAgICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBjcHUgICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaW9wICAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTAxX2V0aDAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWEyMyAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNDUgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTY3ICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE4OV9zdHJjb3AgOiAxOworICB1bnNpZ25lZCBpbnQgYmlmICAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGZpeF9pbyAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICAgOiAyMjsKK30gcmVnX2NvbmZpZ19yd19jbGtfY3RybDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfY29uZmlnX3J3X2Nsa19jdHJsIDQKKyNkZWZpbmUgUkVHX1dSX0FERFJfY29uZmlnX3J3X2Nsa19jdHJsIDQKKworLyogUmVnaXN0ZXIgcndfcGFkX2N0cmwsIHNjb3BlIGNvbmZpZywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgdXNiX3N1c3AgOiAxOworICB1bnNpZ25lZCBpbnQgcGh5cnN0X24gOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgOiAzMDsKK30gcmVnX2NvbmZpZ19yd19wYWRfY3RybDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfY29uZmlnX3J3X3BhZF9jdHJsIDgKKyNkZWZpbmUgUkVHX1dSX0FERFJfY29uZmlnX3J3X3BhZF9jdHJsIDgKKworCisvKiBDb25zdGFudHMgKi8KK2VudW0geworICByZWdrX2NvbmZpZ19idzE2ICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19jb25maWdfYnczMiAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfY29uZmlnX21hc3RlciAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA1LAorICByZWdrX2NvbmZpZ19uYW5kICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMywKKyAgcmVna19jb25maWdfbmV0X3J4ICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfY29uZmlnX25ldF90eF9yeCAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX2NvbmZpZ19ubyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19jb25maWdfbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDcsCisgIHJlZ2tfY29uZmlnX25vciAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2NvbmZpZ19yd19jbGtfY3RybF9kZWZhdWx0ICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19jb25maWdfcndfcGFkX2N0cmxfZGVmYXVsdCAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfY29uZmlnX3NlciAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA0LAorICByZWdrX2NvbmZpZ19zbGF2ZSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNiwKKyAgcmVna19jb25maWdfeWVzICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEKK307CisjZW5kaWYgLyogX19jb25maWdfZGVmc19oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdyZWdzL2dpb19kZWZzLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdyZWdzL2dpb19kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZhYTNlZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1mcy9od3JlZ3MvZ2lvX2RlZnMuaApAQCAtMCwwICsxLDI5NSBAQAorI2lmbmRlZiBfX2dpb19kZWZzX2gKKyNkZWZpbmUgX19naW9fZGVmc19oCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCisgKiAgIGZpbGU6ICAgICAgICAgICAuLi8uLi9pbnN0L2dpby9ydGwvZ2lvX3JlZ3MucgorICogICAgIGlkOiAgICAgICAgICAgZ2lvX3JlZ3Mucix2IDEuNSAyMDA1LzAyLzA0IDA5OjQzOjIxIHBlcnogRXhwIAorICogICAgIGxhc3QgbW9kZmllZDogTW9uIEFwciAxMSAxNjowNzo0NyAyMDA1CisgKiAKKyAqICAgYnkgL24vYXNpYy9kZXNpZ24vdG9vbHMvcmRlc2Mvc3JjL3JkZXMyYyAtLW91dGZpbGUgZ2lvX2RlZnMuaCAuLi8uLi9pbnN0L2dpby9ydGwvZ2lvX3JlZ3MucgorICogICAgICBpZDogJElkOiBnaW9fZGVmcy5oLHYgMS4xIDIwMDcvMDIvMTMgMTE6NTU6MzAgc3RhcnZpayBFeHAgJAorICogQW55IGNoYW5nZXMgaGVyZSB3aWxsIGJlIGxvc3QuCisgKgorICogLSotIGJ1ZmZlci1yZWFkLW9ubHk6IHQgLSotCisgKi8KKy8qIE1haW4gYWNjZXNzIG1hY3JvcyAqLworI2lmbmRlZiBSRUdfUkQKKyNkZWZpbmUgUkVHX1JEKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUgorI2RlZmluZSBSRUdfV1IoIHNjb3BlLCBpbnN0LCByZWcsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfVkVDVAorI2RlZmluZSBSRUdfUkRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgIFJFR19SRUFEKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9WRUNUCisjZGVmaW5lIFJFR19XUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgICAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX0lOVAorI2RlZmluZSBSRUdfUkRfSU5UKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSX0lOVAorI2RlZmluZSBSRUdfV1JfSU5UKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlRfVkVDVAorI2RlZmluZSBSRUdfUkRfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlRfVkVDVAorI2RlZmluZSBSRUdfV1JfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4LCB2YWwgKSBcCisgIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1RZUEVfQ09OVgorI2RlZmluZSBSRUdfVFlQRV9DT05WKCB0eXBlLCBvcmd0eXBlLCB2YWwgKSBcCisgICggeyB1bmlvbiB7IG9yZ3R5cGUgbzsgdHlwZSBuOyB9IHI7IHIubyA9IHZhbDsgci5uOyB9ICkKKyNlbmRpZgorCisjaWZuZGVmIHJlZ19wYWdlX3NpemUKKyNkZWZpbmUgcmVnX3BhZ2Vfc2l6ZSA4MTkyCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUgorI2RlZmluZSBSRUdfQUREUiggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFJfVkVDVAorI2RlZmluZSBSRUdfQUREUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKy8qIEMtY29kZSBmb3IgcmVnaXN0ZXIgc2NvcGUgZ2lvICovCisKKy8qIFJlZ2lzdGVyIHJ3X3BhX2RvdXQsIHNjb3BlIGdpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZGF0YSA6IDg7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyNDsKK30gcmVnX2dpb19yd19wYV9kb3V0OworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfcGFfZG91dCAwCisjZGVmaW5lIFJFR19XUl9BRERSX2dpb19yd19wYV9kb3V0IDAKKworLyogUmVnaXN0ZXIgcl9wYV9kaW4sIHNjb3BlIGdpbywgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkYXRhIDogODsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI0OworfSByZWdfZ2lvX3JfcGFfZGluOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcl9wYV9kaW4gNAorCisvKiBSZWdpc3RlciByd19wYV9vZSwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBvZSA6IDg7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyNDsKK30gcmVnX2dpb19yd19wYV9vZTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZ2lvX3J3X3BhX29lIDgKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X3BhX29lIDgKKworLyogUmVnaXN0ZXIgcndfaW50cl9jZmcsIHNjb3BlIGdpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgcGEwIDogMzsKKyAgdW5zaWduZWQgaW50IHBhMSA6IDM7CisgIHVuc2lnbmVkIGludCBwYTIgOiAzOworICB1bnNpZ25lZCBpbnQgcGEzIDogMzsKKyAgdW5zaWduZWQgaW50IHBhNCA6IDM7CisgIHVuc2lnbmVkIGludCBwYTUgOiAzOworICB1bnNpZ25lZCBpbnQgcGE2IDogMzsKKyAgdW5zaWduZWQgaW50IHBhNyA6IDM7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiA4OworfSByZWdfZ2lvX3J3X2ludHJfY2ZnOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfaW50cl9jZmcgMTIKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X2ludHJfY2ZnIDEyCisKKy8qIFJlZ2lzdGVyIHJ3X2ludHJfbWFzaywgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBwYTAgOiAxOworICB1bnNpZ25lZCBpbnQgcGExIDogMTsKKyAgdW5zaWduZWQgaW50IHBhMiA6IDE7CisgIHVuc2lnbmVkIGludCBwYTMgOiAxOworICB1bnNpZ25lZCBpbnQgcGE0IDogMTsKKyAgdW5zaWduZWQgaW50IHBhNSA6IDE7CisgIHVuc2lnbmVkIGludCBwYTYgOiAxOworICB1bnNpZ25lZCBpbnQgcGE3IDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI0OworfSByZWdfZ2lvX3J3X2ludHJfbWFzazsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZ2lvX3J3X2ludHJfbWFzayAxNgorI2RlZmluZSBSRUdfV1JfQUREUl9naW9fcndfaW50cl9tYXNrIDE2CisKKy8qIFJlZ2lzdGVyIHJ3X2Fja19pbnRyLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHBhMCA6IDE7CisgIHVuc2lnbmVkIGludCBwYTEgOiAxOworICB1bnNpZ25lZCBpbnQgcGEyIDogMTsKKyAgdW5zaWduZWQgaW50IHBhMyA6IDE7CisgIHVuc2lnbmVkIGludCBwYTQgOiAxOworICB1bnNpZ25lZCBpbnQgcGE1IDogMTsKKyAgdW5zaWduZWQgaW50IHBhNiA6IDE7CisgIHVuc2lnbmVkIGludCBwYTcgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjQ7Cit9IHJlZ19naW9fcndfYWNrX2ludHI7CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yd19hY2tfaW50ciAyMAorI2RlZmluZSBSRUdfV1JfQUREUl9naW9fcndfYWNrX2ludHIgMjAKKworLyogUmVnaXN0ZXIgcl9pbnRyLCBzY29wZSBnaW8sIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgcGEwIDogMTsKKyAgdW5zaWduZWQgaW50IHBhMSA6IDE7CisgIHVuc2lnbmVkIGludCBwYTIgOiAxOworICB1bnNpZ25lZCBpbnQgcGEzIDogMTsKKyAgdW5zaWduZWQgaW50IHBhNCA6IDE7CisgIHVuc2lnbmVkIGludCBwYTUgOiAxOworICB1bnNpZ25lZCBpbnQgcGE2IDogMTsKKyAgdW5zaWduZWQgaW50IHBhNyA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyNDsKK30gcmVnX2dpb19yX2ludHI7CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yX2ludHIgMjQKKworLyogUmVnaXN0ZXIgcl9tYXNrZWRfaW50ciwgc2NvcGUgZ2lvLCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHBhMCA6IDE7CisgIHVuc2lnbmVkIGludCBwYTEgOiAxOworICB1bnNpZ25lZCBpbnQgcGEyIDogMTsKKyAgdW5zaWduZWQgaW50IHBhMyA6IDE7CisgIHVuc2lnbmVkIGludCBwYTQgOiAxOworICB1bnNpZ25lZCBpbnQgcGE1IDogMTsKKyAgdW5zaWduZWQgaW50IHBhNiA6IDE7CisgIHVuc2lnbmVkIGludCBwYTcgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjQ7Cit9IHJlZ19naW9fcl9tYXNrZWRfaW50cjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZ2lvX3JfbWFza2VkX2ludHIgMjgKKworLyogUmVnaXN0ZXIgcndfcGJfZG91dCwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkYXRhIDogMTg7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxNDsKK30gcmVnX2dpb19yd19wYl9kb3V0OworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfcGJfZG91dCAzMgorI2RlZmluZSBSRUdfV1JfQUREUl9naW9fcndfcGJfZG91dCAzMgorCisvKiBSZWdpc3RlciByX3BiX2Rpbiwgc2NvcGUgZ2lvLCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRhdGEgOiAxODsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDE0OworfSByZWdfZ2lvX3JfcGJfZGluOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcl9wYl9kaW4gMzYKKworLyogUmVnaXN0ZXIgcndfcGJfb2UsIHNjb3BlIGdpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgb2UgOiAxODsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDE0OworfSByZWdfZ2lvX3J3X3BiX29lOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfcGJfb2UgNDAKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X3BiX29lIDQwCisKKy8qIFJlZ2lzdGVyIHJ3X3BjX2RvdXQsIHNjb3BlIGdpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZGF0YSA6IDE4OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTQ7Cit9IHJlZ19naW9fcndfcGNfZG91dDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZ2lvX3J3X3BjX2RvdXQgNDgKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X3BjX2RvdXQgNDgKKworLyogUmVnaXN0ZXIgcl9wY19kaW4sIHNjb3BlIGdpbywgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkYXRhIDogMTg7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxNDsKK30gcmVnX2dpb19yX3BjX2RpbjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZ2lvX3JfcGNfZGluIDUyCisKKy8qIFJlZ2lzdGVyIHJ3X3BjX29lLCBzY29wZSBnaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IG9lIDogMTg7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxNDsKK30gcmVnX2dpb19yd19wY19vZTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfZ2lvX3J3X3BjX29lIDU2CisjZGVmaW5lIFJFR19XUl9BRERSX2dpb19yd19wY19vZSA1NgorCisvKiBSZWdpc3RlciByd19wZF9kb3V0LCBzY29wZSBnaW8sIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRhdGEgOiAxODsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDE0OworfSByZWdfZ2lvX3J3X3BkX2RvdXQ7CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yd19wZF9kb3V0IDY0CisjZGVmaW5lIFJFR19XUl9BRERSX2dpb19yd19wZF9kb3V0IDY0CisKKy8qIFJlZ2lzdGVyIHJfcGRfZGluLCBzY29wZSBnaW8sIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZGF0YSA6IDE4OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTQ7Cit9IHJlZ19naW9fcl9wZF9kaW47CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yX3BkX2RpbiA2OAorCisvKiBSZWdpc3RlciByd19wZF9vZSwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBvZSA6IDE4OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTQ7Cit9IHJlZ19naW9fcndfcGRfb2U7CisjZGVmaW5lIFJFR19SRF9BRERSX2dpb19yd19wZF9vZSA3MgorI2RlZmluZSBSRUdfV1JfQUREUl9naW9fcndfcGRfb2UgNzIKKworLyogUmVnaXN0ZXIgcndfcGVfZG91dCwgc2NvcGUgZ2lvLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkYXRhIDogMTg7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxNDsKK30gcmVnX2dpb19yd19wZV9kb3V0OworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfcGVfZG91dCA4MAorI2RlZmluZSBSRUdfV1JfQUREUl9naW9fcndfcGVfZG91dCA4MAorCisvKiBSZWdpc3RlciByX3BlX2Rpbiwgc2NvcGUgZ2lvLCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRhdGEgOiAxODsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDE0OworfSByZWdfZ2lvX3JfcGVfZGluOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcl9wZV9kaW4gODQKKworLyogUmVnaXN0ZXIgcndfcGVfb2UsIHNjb3BlIGdpbywgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgb2UgOiAxODsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDE0OworfSByZWdfZ2lvX3J3X3BlX29lOworI2RlZmluZSBSRUdfUkRfQUREUl9naW9fcndfcGVfb2UgODgKKyNkZWZpbmUgUkVHX1dSX0FERFJfZ2lvX3J3X3BlX29lIDg4CisKKworLyogQ29uc3RhbnRzICovCitlbnVtIHsKKyAgcmVna19naW9fYW55ZWRnZSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDcsCisgIHJlZ2tfZ2lvX2hpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX2dpb19sbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19naW9fbmVnZWRnZSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDYsCisgIHJlZ2tfZ2lvX25vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2dpb19vZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19naW9fcG9zZWRnZSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDUsCisgIHJlZ2tfZ2lvX3J3X2ludHJfY2ZnX2RlZmF1bHQgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2dpb19yd19pbnRyX21hc2tfZGVmYXVsdCAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19naW9fcndfcGFfb2VfZGVmYXVsdCAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfZ2lvX3J3X3BiX29lX2RlZmF1bHQgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2dpb19yd19wY19vZV9kZWZhdWx0ICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19naW9fcndfcGRfb2VfZGVmYXVsdCAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfZ2lvX3J3X3BlX29lX2RlZmF1bHQgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX2dpb19zZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMywKKyAgcmVna19naW9feWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEKK307CisjZW5kaWYgLyogX19naW9fZGVmc19oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdyZWdzL2ludHJfdmVjdC5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2h3cmVncy9pbnRyX3ZlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWNjMmE4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2h3cmVncy9pbnRyX3ZlY3QuaApAQCAtMCwwICsxLDQxIEBACisvKiBJbnRlcnJ1cHQgdmVjdG9yIG51bWJlcnMgYXV0b2dlbmVyYXRlZCBieSAvbi9hc2ljL2Rlc2lnbi90b29scy9yZGVzYy9zcmMvcmRlczJpbnRyIHZlcnNpb24KKyBmcm9tIC4uLy4uL2luc3QvaW50cl92ZWN0L3J0bC9ndWlubmVzcy9pdm1hc2suY29uZmlnLnIKK3ZlcnNpb24gLiAqLworCisjaWZuZGVmIF9fX19fX19JTlNUX0lOVFJfVkVDVF9SVExfR1VJTk5FU1NfSVZNQVNLX0NPTkZJR19SCisjZGVmaW5lIF9fX19fX19JTlNUX0lOVFJfVkVDVF9SVExfR1VJTk5FU1NfSVZNQVNLX0NPTkZJR19SIAorI2RlZmluZSBNRU1BUkJfSU5UUl9WRUNUCTB4MzEKKyNkZWZpbmUgR0VOX0lPX0lOVFJfVkVDVAkweDMyCisjZGVmaW5lIEdJT19JTlRSX1ZFQ1QgICAgICAgICAgIEdFTl9JT19JTlRSX1ZFQ1QKKyNkZWZpbmUgSU9QMF9JTlRSX1ZFQ1QJMHgzMworI2RlZmluZSBJT1AxX0lOVFJfVkVDVAkweDM0CisjZGVmaW5lIElPUDJfSU5UUl9WRUNUCTB4MzUKKyNkZWZpbmUgSU9QM19JTlRSX1ZFQ1QJMHgzNgorI2RlZmluZSBETUEwX0lOVFJfVkVDVAkweDM3CisjZGVmaW5lIERNQTFfSU5UUl9WRUNUCTB4MzgKKyNkZWZpbmUgRE1BMl9JTlRSX1ZFQ1QJMHgzOQorI2RlZmluZSBETUEzX0lOVFJfVkVDVAkweDNhCisjZGVmaW5lIERNQTRfSU5UUl9WRUNUCTB4M2IKKyNkZWZpbmUgRE1BNV9JTlRSX1ZFQ1QJMHgzYworI2RlZmluZSBETUE2X0lOVFJfVkVDVAkweDNkCisjZGVmaW5lIERNQTdfSU5UUl9WRUNUCTB4M2UKKyNkZWZpbmUgRE1BOF9JTlRSX1ZFQ1QJMHgzZgorI2RlZmluZSBETUE5X0lOVFJfVkVDVAkweDQwCisjZGVmaW5lIEFUQV9JTlRSX1ZFQ1QJMHg0MQorI2RlZmluZSBTU0VSMF9JTlRSX1ZFQ1QJMHg0MgorI2RlZmluZSBTU0VSMV9JTlRSX1ZFQ1QJMHg0MworI2RlZmluZSBTRVIwX0lOVFJfVkVDVAkweDQ0CisjZGVmaW5lIFNFUjFfSU5UUl9WRUNUCTB4NDUKKyNkZWZpbmUgU0VSMl9JTlRSX1ZFQ1QJMHg0NgorI2RlZmluZSBTRVIzX0lOVFJfVkVDVAkweDQ3CisjZGVmaW5lIFAyMV9JTlRSX1ZFQ1QJMHg0OAorI2RlZmluZSBFVEgwX0lOVFJfVkVDVAkweDQ5CisjZGVmaW5lIEVUSDFfSU5UUl9WRUNUCTB4NGEKKyNkZWZpbmUgVElNRVJfSU5UUl9WRUNUCTB4NGIKKyNkZWZpbmUgVElNRVIwX0lOVFJfVkVDVAlUSU1FUl9JTlRSX1ZFQ1QKKyNkZWZpbmUgQklGX0FSQl9JTlRSX1ZFQ1QJMHg0YworI2RlZmluZSBCSUZfRE1BX0lOVFJfVkVDVAkweDRkCisjZGVmaW5lIEVYVF9JTlRSX1ZFQ1QJMHg0ZQorI2RlZmluZSBJUElfSU5UUl9WRUNUCTB4NGYKKyNkZWZpbmUgTkJSX0lOVFJfVkVDVCAgIDB4NTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2h3cmVncy9pbnRyX3ZlY3RfZGVmcy5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2h3cmVncy9pbnRyX3ZlY3RfZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNjUxMjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdyZWdzL2ludHJfdmVjdF9kZWZzLmgKQEAgLTAsMCArMSwyMjggQEAKKyNpZm5kZWYgX19pbnRyX3ZlY3RfZGVmc19oCisjZGVmaW5lIF9faW50cl92ZWN0X2RlZnNfaAorCisvKgorICogVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQgZnJvbQorICogICBmaWxlOiAgICAgICAgICAgLi4vLi4vaW5zdC9pbnRyX3ZlY3QvcnRsL2d1aW5uZXNzL2l2bWFzay5jb25maWcucgorICogICAgIGlkOiAgICAgICAgICAgaXZtYXNrLmNvbmZpZy5yLHYgMS40IDIwMDUvMDIvMTUgMTY6MDU6Mzggc3RlZmFucyBFeHAgCisgKiAgICAgbGFzdCBtb2RmaWVkOiBNb24gQXByIDExIDE2OjA4OjAzIDIwMDUKKyAqIAorICogICBieSAvbi9hc2ljL2Rlc2lnbi90b29scy9yZGVzYy9zcmMvcmRlczJjIC0tb3V0ZmlsZSBpbnRyX3ZlY3RfZGVmcy5oIC4uLy4uL2luc3QvaW50cl92ZWN0L3J0bC9ndWlubmVzcy9pdm1hc2suY29uZmlnLnIKKyAqICAgICAgaWQ6ICRJZDogaW50cl92ZWN0X2RlZnMuaCx2IDEuMSAyMDA3LzAyLzEzIDExOjU1OjMwIHN0YXJ2aWsgRXhwICQKKyAqIEFueSBjaGFuZ2VzIGhlcmUgd2lsbCBiZSBsb3N0LgorICoKKyAqIC0qLSBidWZmZXItcmVhZC1vbmx5OiB0IC0qLQorICovCisvKiBNYWluIGFjY2VzcyBtYWNyb3MgKi8KKyNpZm5kZWYgUkVHX1JECisjZGVmaW5lIFJFR19SRCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1IKKyNkZWZpbmUgUkVHX1dSKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfVkVDVAorI2RlZmluZSBSRUdfV1JfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXgsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlQKKyNkZWZpbmUgUkVHX1JEX0lOVCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlQKKyNkZWZpbmUgUkVHX1dSX0lOVCggc2NvcGUsIGluc3QsIHJlZywgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1dSX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19UWVBFX0NPTlYKKyNkZWZpbmUgUkVHX1RZUEVfQ09OViggdHlwZSwgb3JndHlwZSwgdmFsICkgXAorICAoIHsgdW5pb24geyBvcmd0eXBlIG87IHR5cGUgbjsgfSByOyByLm8gPSB2YWw7IHIubjsgfSApCisjZW5kaWYKKworI2lmbmRlZiByZWdfcGFnZV9zaXplCisjZGVmaW5lIHJlZ19wYWdlX3NpemUgODE5MgorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFIKKyNkZWZpbmUgUkVHX0FERFIoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19BRERSX1ZFQ1QKKyNkZWZpbmUgUkVHX0FERFJfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisvKiBDLWNvZGUgZm9yIHJlZ2lzdGVyIHNjb3BlIGludHJfdmVjdCAqLworCisjZGVmaW5lIFNUUklERV9pbnRyX3ZlY3RfcndfbWFzayAwCisvKiBSZWdpc3RlciByd19tYXNrLCBzY29wZSBpbnRyX3ZlY3QsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IG1lbWFyYiAgOiAxOworICB1bnNpZ25lZCBpbnQgZ2VuX2lvICA6IDE7CisgIHVuc2lnbmVkIGludCBpb3AwICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGlvcDEgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaW9wMiAgICA6IDE7CisgIHVuc2lnbmVkIGludCBpb3AzICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMSAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWEyICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTMgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE1ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTYgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNyAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE4ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTkgICAgOiAxOworICB1bnNpZ25lZCBpbnQgYXRhICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzc2VyMCAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNzZXIxICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2VyMCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzZXIxICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNlcjIgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2VyMyAgICA6IDE7CisgIHVuc2lnbmVkIGludCBwMjEgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGV0aDAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZXRoMSAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0aW1lcjAgIDogMTsKKyAgdW5zaWduZWQgaW50IGJpZl9hcmIgOiAxOworICB1bnNpZ25lZCBpbnQgYmlmX2RtYSA6IDE7CisgIHVuc2lnbmVkIGludCBleHQgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgOiAyOworfSByZWdfaW50cl92ZWN0X3J3X21hc2s7CisjZGVmaW5lIFJFR19SRF9BRERSX2ludHJfdmVjdF9yd19tYXNrIDAKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW50cl92ZWN0X3J3X21hc2sgMAorCisjZGVmaW5lIFNUUklERV9pbnRyX3ZlY3Rfcl92ZWN0IDAKKy8qIFJlZ2lzdGVyIHJfdmVjdCwgc2NvcGUgaW50cl92ZWN0LCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IG1lbWFyYiAgOiAxOworICB1bnNpZ25lZCBpbnQgZ2VuX2lvICA6IDE7CisgIHVuc2lnbmVkIGludCBpb3AwICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGlvcDEgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaW9wMiAgICA6IDE7CisgIHVuc2lnbmVkIGludCBpb3AzICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMSAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWEyICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTMgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE1ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTYgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNyAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE4ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTkgICAgOiAxOworICB1bnNpZ25lZCBpbnQgYXRhICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzc2VyMCAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNzZXIxICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2VyMCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzZXIxICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNlcjIgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2VyMyAgICA6IDE7CisgIHVuc2lnbmVkIGludCBwMjEgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGV0aDAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZXRoMSAgICA6IDE7CisgIHVuc2lnbmVkIGludCB0aW1lciAgIDogMTsKKyAgdW5zaWduZWQgaW50IGJpZl9hcmIgOiAxOworICB1bnNpZ25lZCBpbnQgYmlmX2RtYSA6IDE7CisgIHVuc2lnbmVkIGludCBleHQgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgOiAyOworfSByZWdfaW50cl92ZWN0X3JfdmVjdDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW50cl92ZWN0X3JfdmVjdCA0CisKKyNkZWZpbmUgU1RSSURFX2ludHJfdmVjdF9yX21hc2tlZF92ZWN0IDAKKy8qIFJlZ2lzdGVyIHJfbWFza2VkX3ZlY3QsIHNjb3BlIGludHJfdmVjdCwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBtZW1hcmIgIDogMTsKKyAgdW5zaWduZWQgaW50IGdlbl9pbyAgOiAxOworICB1bnNpZ25lZCBpbnQgaW9wMCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBpb3AxICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGlvcDIgICAgOiAxOworICB1bnNpZ25lZCBpbnQgaW9wMyAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWEwICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTEgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMiAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWEzICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTQgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNSAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE2ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTcgICAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hOCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE5ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGF0YSAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc3NlcjAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzc2VyMSAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNlcjAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2VyMSAgICA6IDE7CisgIHVuc2lnbmVkIGludCBzZXIyICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNlcjMgICAgOiAxOworICB1bnNpZ25lZCBpbnQgcDIxICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBldGgwICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGV0aDEgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdGltZXIgICA6IDE7CisgIHVuc2lnbmVkIGludCBiaWZfYXJiIDogMTsKKyAgdW5zaWduZWQgaW50IGJpZl9kbWEgOiAxOworICB1bnNpZ25lZCBpbnQgZXh0ICAgICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgIDogMjsKK30gcmVnX2ludHJfdmVjdF9yX21hc2tlZF92ZWN0OworI2RlZmluZSBSRUdfUkRfQUREUl9pbnRyX3ZlY3Rfcl9tYXNrZWRfdmVjdCA4CisKKy8qIFJlZ2lzdGVyIHJfbm1pLCBzY29wZSBpbnRyX3ZlY3QsIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZXh0ICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgd2F0Y2hkb2cgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgOiAzMDsKK30gcmVnX2ludHJfdmVjdF9yX25taTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfaW50cl92ZWN0X3Jfbm1pIDEyCisKKy8qIFJlZ2lzdGVyIHJfZ3VydSwgc2NvcGUgaW50cl92ZWN0LCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGp0YWcgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMzE7Cit9IHJlZ19pbnRyX3ZlY3Rfcl9ndXJ1OworI2RlZmluZSBSRUdfUkRfQUREUl9pbnRyX3ZlY3Rfcl9ndXJ1IDE2CisKKy8qIFJlZ2lzdGVyIHJ3X2lwaSwgc2NvcGUgaW50cl92ZWN0LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgdW5zaWduZWQgaW50IHZlY3RvcjsKK30gcmVnX2ludHJfdmVjdF9yd19pcGk7CisjZGVmaW5lIFJFR19SRF9BRERSX2ludHJfdmVjdF9yd19pcGkgMjAKKyNkZWZpbmUgUkVHX1dSX0FERFJfaW50cl92ZWN0X3J3X2lwaSAyMAorCisvKiBDb25zdGFudHMgKi8KK2VudW0geworICByZWdrX2ludHJfdmVjdF9vZmYgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19pbnRyX3ZlY3Rfb24gICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfaW50cl92ZWN0X3J3X21hc2tfZGVmYXVsdCAgICAgICAgICAgPSAweDAwMDAwMDAwCit9OworI2VuZGlmIC8qIF9faW50cl92ZWN0X2RlZnNfaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2h3cmVncy9tYXJiX2JwX2RlZnMuaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1mcy9od3JlZ3MvbWFyYl9icF9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNhYWVjNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1mcy9od3JlZ3MvbWFyYl9icF9kZWZzLmgKQEAgLTAsMCArMSwyMDUgQEAKKyNpZm5kZWYgX19tYXJiX2JwX2RlZnNfaAorI2RlZmluZSBfX21hcmJfYnBfZGVmc19oCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCisgKiAgIGZpbGU6ICAgICAgICAgICAuLi8uLi9pbnN0L21lbWFyYi9ydGwvZ3Vpbm5lc3MvbWFyYl90b3AucgorICogICAgIGlkOiAgICAgICAgICAgPG5vdCBmb3VuZD4KKyAqICAgICBsYXN0IG1vZGZpZWQ6IEZyaSBOb3YgIDcgMTU6MzY6MDQgMjAwMworICogCisgKiAgIGJ5IC9uL2FzaWMvcHJvamVjdHMvZ3Vpbm5lc3MvZGVzaWduL3RvcC9pbnN0L3JkZXNjL3JkZXMyYyAuLi8uLi9ydGwvZ2xvYmFsLnJtYXAgLi4vLi4vbW9kL21vZHJlZy5ybWFwIC1iYXNlIDB4YjAwMDAwMDAgLi4vLi4vaW5zdC9tZW1hcmIvcnRsL2d1aW5uZXNzL21hcmJfdG9wLnIKKyAqICAgICAgaWQ6ICRJZDogbWFyYl9icF9kZWZzLmgsdiAxLjEgMjAwNy8wMi8xMyAxMTo1NTozMCBzdGFydmlrIEV4cCAkCisgKiBBbnkgY2hhbmdlcyBoZXJlIHdpbGwgYmUgbG9zdC4KKyAqCisgKiAtKi0gYnVmZmVyLXJlYWQtb25seTogdCAtKi0KKyAqLworLyogTWFpbiBhY2Nlc3MgbWFjcm9zICovCisjaWZuZGVmIFJFR19SRAorI2RlZmluZSBSRUdfUkQoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgIFJFR19SRUFEKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSCisjZGVmaW5lIFJFR19XUiggc2NvcGUsIGluc3QsIHJlZywgdmFsICkgXAorICBSRUdfV1JJVEUoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgICAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9WRUNUCisjZGVmaW5lIFJFR19SRF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgUkVHX1JFQUQoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKwkgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSX1ZFQ1QKKyNkZWZpbmUgUkVHX1dSX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4LCB2YWwgKSBcCisgIFJFR19XUklURSggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKwkgICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfSU5UCisjZGVmaW5lIFJFR19SRF9JTlQoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgIFJFR19SRUFEKCBpbnQsIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfSU5UCisjZGVmaW5lIFJFR19XUl9JTlQoIHNjb3BlLCBpbnN0LCByZWcsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCBpbnQsIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX0lOVF9WRUNUCisjZGVmaW5lIFJFR19SRF9JTlRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgIFJFR19SRUFEKCBpbnQsIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKwkgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSX0lOVF9WRUNUCisjZGVmaW5lIFJFR19XUl9JTlRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXgsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCBpbnQsIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZyArIFwKKwkgICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfVFlQRV9DT05WCisjZGVmaW5lIFJFR19UWVBFX0NPTlYoIHR5cGUsIG9yZ3R5cGUsIHZhbCApIFwKKyAgKCB7IHVuaW9uIHsgb3JndHlwZSBvOyB0eXBlIG47IH0gcjsgci5vID0gdmFsOyByLm47IH0gKQorI2VuZGlmCisKKyNpZm5kZWYgcmVnX3BhZ2Vfc2l6ZQorI2RlZmluZSByZWdfcGFnZV9zaXplIDgxOTIKKyNlbmRpZgorCisvKiBDLWNvZGUgZm9yIHJlZ2lzdGVyIHNjb3BlIG1hcmJfYnAgKi8KKworLyogUmVnaXN0ZXIgcndfZmlyc3RfYWRkciwgc2NvcGUgbWFyYl9icCwgdHlwZSBydyAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVnX21hcmJfYnBfcndfZmlyc3RfYWRkcjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9icF9yd19maXJzdF9hZGRyIDAKKyNkZWZpbmUgUkVHX1dSX0FERFJfbWFyYl9icF9yd19maXJzdF9hZGRyIDAKKworLyogUmVnaXN0ZXIgcndfbGFzdF9hZGRyLCBzY29wZSBtYXJiX2JwLCB0eXBlIHJ3ICovCit0eXBlZGVmIHVuc2lnbmVkIGludCByZWdfbWFyYl9icF9yd19sYXN0X2FkZHI7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfYnBfcndfbGFzdF9hZGRyIDQKKyNkZWZpbmUgUkVHX1dSX0FERFJfbWFyYl9icF9yd19sYXN0X2FkZHIgNAorCisvKiBSZWdpc3RlciByd19vcCwgc2NvcGUgbWFyYl9icCwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgcmVhZCAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHdyaXRlICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCByZWFkX2V4Y2wgICAgOiAxOworICB1bnNpZ25lZCBpbnQgcHJpX3dyaXRlICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHVzX3JlYWQgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB1c193cml0ZSAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdXNfcmVhZF9leGNsIDogMTsKKyAgdW5zaWduZWQgaW50IHVzX3ByaV93cml0ZSA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgICAgICAgOiAyNDsKK30gcmVnX21hcmJfYnBfcndfb3A7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfYnBfcndfb3AgOAorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX2JwX3J3X29wIDgKKworLyogUmVnaXN0ZXIgcndfY2xpZW50cywgc2NvcGUgbWFyYl9icCwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZG1hMCAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMSAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMiAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMyAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNCAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNSAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNiAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNyAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hOCAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hOSAgOiAxOworICB1bnNpZ25lZCBpbnQgY3B1aSAgOiAxOworICB1bnNpZ25lZCBpbnQgY3B1ZCAgOiAxOworICB1bnNpZ25lZCBpbnQgaW9wICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2xhdmUgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTg7Cit9IHJlZ19tYXJiX2JwX3J3X2NsaWVudHM7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfYnBfcndfY2xpZW50cyAxMgorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX2JwX3J3X2NsaWVudHMgMTIKKworLyogUmVnaXN0ZXIgcndfb3B0aW9ucywgc2NvcGUgbWFyYl9icCwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgd3JhcCA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAzMTsKK30gcmVnX21hcmJfYnBfcndfb3B0aW9uczsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9icF9yd19vcHRpb25zIDE2CisjZGVmaW5lIFJFR19XUl9BRERSX21hcmJfYnBfcndfb3B0aW9ucyAxNgorCisvKiBSZWdpc3RlciByX2JyZWFrX2FkZHIsIHNjb3BlIG1hcmJfYnAsIHR5cGUgciAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVnX21hcmJfYnBfcl9icmVha19hZGRyOworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2JwX3JfYnJlYWtfYWRkciAyMAorCisvKiBSZWdpc3RlciByX2JyZWFrX29wLCBzY29wZSBtYXJiX2JwLCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHJlYWQgICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB3cml0ZSAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgcmVhZF9leGNsICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHByaV93cml0ZSAgICA6IDE7CisgIHVuc2lnbmVkIGludCB1c19yZWFkICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdXNfd3JpdGUgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHVzX3JlYWRfZXhjbCA6IDE7CisgIHVuc2lnbmVkIGludCB1c19wcmlfd3JpdGUgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICAgIDogMjQ7Cit9IHJlZ19tYXJiX2JwX3JfYnJlYWtfb3A7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfYnBfcl9icmVha19vcCAyNAorCisvKiBSZWdpc3RlciByX2JyZWFrX2NsaWVudHMsIHNjb3BlIG1hcmJfYnAsIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZG1hMCAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMSAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMiAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMyAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNCAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNSAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNiAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNyAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hOCAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hOSAgOiAxOworICB1bnNpZ25lZCBpbnQgY3B1aSAgOiAxOworICB1bnNpZ25lZCBpbnQgY3B1ZCAgOiAxOworICB1bnNpZ25lZCBpbnQgaW9wICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2xhdmUgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTg7Cit9IHJlZ19tYXJiX2JwX3JfYnJlYWtfY2xpZW50czsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9icF9yX2JyZWFrX2NsaWVudHMgMjgKKworLyogUmVnaXN0ZXIgcl9icmVha19maXJzdF9jbGllbnQsIHNjb3BlIG1hcmJfYnAsIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZG1hMCAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMSAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMiAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMyAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNCAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNSAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNiAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNyAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hOCAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hOSAgOiAxOworICB1bnNpZ25lZCBpbnQgY3B1aSAgOiAxOworICB1bnNpZ25lZCBpbnQgY3B1ZCAgOiAxOworICB1bnNpZ25lZCBpbnQgaW9wICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2xhdmUgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTg7Cit9IHJlZ19tYXJiX2JwX3JfYnJlYWtfZmlyc3RfY2xpZW50OworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2JwX3JfYnJlYWtfZmlyc3RfY2xpZW50IDMyCisKKy8qIFJlZ2lzdGVyIHJfYnJlYWtfc2l6ZSwgc2NvcGUgbWFyYl9icCwgdHlwZSByICovCit0eXBlZGVmIHVuc2lnbmVkIGludCByZWdfbWFyYl9icF9yX2JyZWFrX3NpemU7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfYnBfcl9icmVha19zaXplIDM2CisKKy8qIFJlZ2lzdGVyIHJ3X2Fjaywgc2NvcGUgbWFyYl9icCwgdHlwZSBydyAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVnX21hcmJfYnBfcndfYWNrOworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2JwX3J3X2FjayA0MAorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX2JwX3J3X2FjayA0MAorCisKKy8qIENvbnN0YW50cyAqLworZW51bSB7CisgIHJlZ2tfbWFyYl9icF9ubyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX21hcmJfYnBfcndfb3BfZGVmYXVsdCAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19tYXJiX2JwX3J3X29wdGlvbnNfZGVmYXVsdCAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfbWFyYl9icF95ZXMgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxCit9OworI2VuZGlmIC8qIF9fbWFyYl9icF9kZWZzX2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1mcy9od3JlZ3MvbWFyYl9kZWZzLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdyZWdzL21hcmJfZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NGRhMDgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdyZWdzL21hcmJfZGVmcy5oCkBAIC0wLDAgKzEsNDc1IEBACisjaWZuZGVmIF9fbWFyYl9kZWZzX2gKKyNkZWZpbmUgX19tYXJiX2RlZnNfaAorCisvKgorICogVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQgZnJvbQorICogICBmaWxlOiAgICAgICAgICAgLi4vLi4vaW5zdC9tZW1hcmIvcnRsL2d1aW5uZXNzL21hcmJfdG9wLnIKKyAqICAgICBpZDogICAgICAgICAgIDxub3QgZm91bmQ+CisgKiAgICAgbGFzdCBtb2RmaWVkOiBNb24gQXByIDExIDE2OjEyOjE2IDIwMDUKKyAqIAorICogICBieSAvbi9hc2ljL2Rlc2lnbi90b29scy9yZGVzYy9zcmMvcmRlczJjIC0tb3V0ZmlsZSBtYXJiX2RlZnMuaCAuLi8uLi9pbnN0L21lbWFyYi9ydGwvZ3Vpbm5lc3MvbWFyYl90b3AucgorICogICAgICBpZDogJElkOiBtYXJiX2RlZnMuaCx2IDEuMSAyMDA3LzAyLzEzIDExOjU1OjMwIHN0YXJ2aWsgRXhwICQKKyAqIEFueSBjaGFuZ2VzIGhlcmUgd2lsbCBiZSBsb3N0LgorICoKKyAqIC0qLSBidWZmZXItcmVhZC1vbmx5OiB0IC0qLQorICovCisvKiBNYWluIGFjY2VzcyBtYWNyb3MgKi8KKyNpZm5kZWYgUkVHX1JECisjZGVmaW5lIFJFR19SRCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1IKKyNkZWZpbmUgUkVHX1dSKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfVkVDVAorI2RlZmluZSBSRUdfV1JfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXgsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlQKKyNkZWZpbmUgUkVHX1JEX0lOVCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlQKKyNkZWZpbmUgUkVHX1dSX0lOVCggc2NvcGUsIGluc3QsIHJlZywgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1dSX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19UWVBFX0NPTlYKKyNkZWZpbmUgUkVHX1RZUEVfQ09OViggdHlwZSwgb3JndHlwZSwgdmFsICkgXAorICAoIHsgdW5pb24geyBvcmd0eXBlIG87IHR5cGUgbjsgfSByOyByLm8gPSB2YWw7IHIubjsgfSApCisjZW5kaWYKKworI2lmbmRlZiByZWdfcGFnZV9zaXplCisjZGVmaW5lIHJlZ19wYWdlX3NpemUgODE5MgorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFIKKyNkZWZpbmUgUkVHX0FERFIoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19BRERSX1ZFQ1QKKyNkZWZpbmUgUkVHX0FERFJfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisvKiBDLWNvZGUgZm9yIHJlZ2lzdGVyIHNjb3BlIG1hcmIgKi8KKworI2RlZmluZSBTVFJJREVfbWFyYl9yd19pbnRfc2xvdHMgNAorLyogUmVnaXN0ZXIgcndfaW50X3Nsb3RzLCBzY29wZSBtYXJiLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBvd25lciA6IDQ7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyODsKK30gcmVnX21hcmJfcndfaW50X3Nsb3RzOworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX3J3X2ludF9zbG90cyAwCisjZGVmaW5lIFJFR19XUl9BRERSX21hcmJfcndfaW50X3Nsb3RzIDAKKworI2RlZmluZSBTVFJJREVfbWFyYl9yd19leHRfc2xvdHMgNAorLyogUmVnaXN0ZXIgcndfZXh0X3Nsb3RzLCBzY29wZSBtYXJiLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBvd25lciA6IDQ7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyODsKK30gcmVnX21hcmJfcndfZXh0X3Nsb3RzOworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX3J3X2V4dF9zbG90cyAyNTYKKyNkZWZpbmUgUkVHX1dSX0FERFJfbWFyYl9yd19leHRfc2xvdHMgMjU2CisKKyNkZWZpbmUgU1RSSURFX21hcmJfcndfcmVnc19zbG90cyA0CisvKiBSZWdpc3RlciByd19yZWdzX3Nsb3RzLCBzY29wZSBtYXJiLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBvd25lciA6IDQ7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyODsKK30gcmVnX21hcmJfcndfcmVnc19zbG90czsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9yd19yZWdzX3Nsb3RzIDUxMgorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX3J3X3JlZ3Nfc2xvdHMgNTEyCisKKy8qIFJlZ2lzdGVyIHJ3X2ludHJfbWFzaywgc2NvcGUgbWFyYiwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgYnAwIDogMTsKKyAgdW5zaWduZWQgaW50IGJwMSA6IDE7CisgIHVuc2lnbmVkIGludCBicDIgOiAxOworICB1bnNpZ25lZCBpbnQgYnAzIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI4OworfSByZWdfbWFyYl9yd19pbnRyX21hc2s7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfcndfaW50cl9tYXNrIDUyOAorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX3J3X2ludHJfbWFzayA1MjgKKworLyogUmVnaXN0ZXIgcndfYWNrX2ludHIsIHNjb3BlIG1hcmIsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGJwMCA6IDE7CisgIHVuc2lnbmVkIGludCBicDEgOiAxOworICB1bnNpZ25lZCBpbnQgYnAyIDogMTsKKyAgdW5zaWduZWQgaW50IGJwMyA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyODsKK30gcmVnX21hcmJfcndfYWNrX2ludHI7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfcndfYWNrX2ludHIgNTMyCisjZGVmaW5lIFJFR19XUl9BRERSX21hcmJfcndfYWNrX2ludHIgNTMyCisKKy8qIFJlZ2lzdGVyIHJfaW50ciwgc2NvcGUgbWFyYiwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBicDAgOiAxOworICB1bnNpZ25lZCBpbnQgYnAxIDogMTsKKyAgdW5zaWduZWQgaW50IGJwMiA6IDE7CisgIHVuc2lnbmVkIGludCBicDMgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjg7Cit9IHJlZ19tYXJiX3JfaW50cjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9yX2ludHIgNTM2CisKKy8qIFJlZ2lzdGVyIHJfbWFza2VkX2ludHIsIHNjb3BlIG1hcmIsIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgYnAwIDogMTsKKyAgdW5zaWduZWQgaW50IGJwMSA6IDE7CisgIHVuc2lnbmVkIGludCBicDIgOiAxOworICB1bnNpZ25lZCBpbnQgYnAzIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI4OworfSByZWdfbWFyYl9yX21hc2tlZF9pbnRyOworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX3JfbWFza2VkX2ludHIgNTQwCisKKy8qIFJlZ2lzdGVyIHJ3X3N0b3BfbWFzaywgc2NvcGUgbWFyYiwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZG1hMCAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMSAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMiAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMyAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNCAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNSAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNiAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNyAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hOCAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hOSAgOiAxOworICB1bnNpZ25lZCBpbnQgY3B1aSAgOiAxOworICB1bnNpZ25lZCBpbnQgY3B1ZCAgOiAxOworICB1bnNpZ25lZCBpbnQgaW9wICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2xhdmUgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTg7Cit9IHJlZ19tYXJiX3J3X3N0b3BfbWFzazsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9yd19zdG9wX21hc2sgNTQ0CisjZGVmaW5lIFJFR19XUl9BRERSX21hcmJfcndfc3RvcF9tYXNrIDU0NAorCisvKiBSZWdpc3RlciByX3N0b3BwZWQsIHNjb3BlIG1hcmIsIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZG1hMCAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMSAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMiAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMyAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNCAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNSAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNiAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNyAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hOCAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hOSAgOiAxOworICB1bnNpZ25lZCBpbnQgY3B1aSAgOiAxOworICB1bnNpZ25lZCBpbnQgY3B1ZCAgOiAxOworICB1bnNpZ25lZCBpbnQgaW9wICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2xhdmUgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTg7Cit9IHJlZ19tYXJiX3Jfc3RvcHBlZDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9yX3N0b3BwZWQgNTQ4CisKKy8qIFJlZ2lzdGVyIHJ3X25vX3Nub29wLCBzY29wZSBtYXJiLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkbWEwICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWExICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWEyICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWEzICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE0ICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE1ICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE2ICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE3ICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE4ICA6IDE7CisgIHVuc2lnbmVkIGludCBkbWE5ICA6IDE7CisgIHVuc2lnbmVkIGludCBjcHVpICA6IDE7CisgIHVuc2lnbmVkIGludCBjcHVkICA6IDE7CisgIHVuc2lnbmVkIGludCBpb3AgICA6IDE7CisgIHVuc2lnbmVkIGludCBzbGF2ZSA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxODsKK30gcmVnX21hcmJfcndfbm9fc25vb3A7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfcndfbm9fc25vb3AgODMyCisjZGVmaW5lIFJFR19XUl9BRERSX21hcmJfcndfbm9fc25vb3AgODMyCisKKy8qIFJlZ2lzdGVyIHJ3X25vX3Nub29wX3JxLCBzY29wZSBtYXJiLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxMDsKKyAgdW5zaWduZWQgaW50IGNwdWkgOiAxOworICB1bnNpZ25lZCBpbnQgY3B1ZCA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTIgOiAyMDsKK30gcmVnX21hcmJfcndfbm9fc25vb3BfcnE7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfcndfbm9fc25vb3BfcnEgODM2CisjZGVmaW5lIFJFR19XUl9BRERSX21hcmJfcndfbm9fc25vb3BfcnEgODM2CisKKworLyogQ29uc3RhbnRzICovCitlbnVtIHsKKyAgcmVna19tYXJiX2NwdWQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMGIsCisgIHJlZ2tfbWFyYl9jcHVpICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDBhLAorICByZWdrX21hcmJfZG1hMCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19tYXJiX2RtYTEgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfbWFyYl9kbWEyICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX21hcmJfZG1hMyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMywKKyAgcmVna19tYXJiX2RtYTQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDQsCisgIHJlZ2tfbWFyYl9kbWE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA1LAorICByZWdrX21hcmJfZG1hNiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNiwKKyAgcmVna19tYXJiX2RtYTcgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDcsCisgIHJlZ2tfbWFyYl9kbWE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA4LAorICByZWdrX21hcmJfZG1hOSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwOSwKKyAgcmVna19tYXJiX2lvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMGMsCisgIHJlZ2tfbWFyYl9ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX21hcmJfcl9zdG9wcGVkX2RlZmF1bHQgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19tYXJiX3J3X2V4dF9zbG90c19kZWZhdWx0ICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfbWFyYl9yd19leHRfc2xvdHNfc2l6ZSAgICAgICAgICAgICAgPSAweDAwMDAwMDQwLAorICByZWdrX21hcmJfcndfaW50X3Nsb3RzX2RlZmF1bHQgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19tYXJiX3J3X2ludF9zbG90c19zaXplICAgICAgICAgICAgICA9IDB4MDAwMDAwNDAsCisgIHJlZ2tfbWFyYl9yd19pbnRyX21hc2tfZGVmYXVsdCAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX21hcmJfcndfbm9fc25vb3BfZGVmYXVsdCAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19tYXJiX3J3X25vX3Nub29wX3JxX2RlZmF1bHQgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfbWFyYl9yd19yZWdzX3Nsb3RzX2RlZmF1bHQgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX21hcmJfcndfcmVnc19zbG90c19zaXplICAgICAgICAgICAgID0gMHgwMDAwMDAwNCwKKyAgcmVna19tYXJiX3J3X3N0b3BfbWFza19kZWZhdWx0ICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfbWFyYl9zbGF2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDBkLAorICByZWdrX21hcmJfeWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMQorfTsKKyNlbmRpZiAvKiBfX21hcmJfZGVmc19oICovCisjaWZuZGVmIF9fbWFyYl9icF9kZWZzX2gKKyNkZWZpbmUgX19tYXJiX2JwX2RlZnNfaAorCisvKgorICogVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQgZnJvbQorICogICBmaWxlOiAgICAgICAgICAgLi4vLi4vaW5zdC9tZW1hcmIvcnRsL2d1aW5uZXNzL21hcmJfdG9wLnIKKyAqICAgICBpZDogICAgICAgICAgIDxub3QgZm91bmQ+CisgKiAgICAgbGFzdCBtb2RmaWVkOiBNb24gQXByIDExIDE2OjEyOjE2IDIwMDUKKyAqIAorICogICBieSAvbi9hc2ljL2Rlc2lnbi90b29scy9yZGVzYy9zcmMvcmRlczJjIC0tb3V0ZmlsZSBtYXJiX2RlZnMuaCAuLi8uLi9pbnN0L21lbWFyYi9ydGwvZ3Vpbm5lc3MvbWFyYl90b3AucgorICogICAgICBpZDogJElkOiBtYXJiX2RlZnMuaCx2IDEuMSAyMDA3LzAyLzEzIDExOjU1OjMwIHN0YXJ2aWsgRXhwICQKKyAqIEFueSBjaGFuZ2VzIGhlcmUgd2lsbCBiZSBsb3N0LgorICoKKyAqIC0qLSBidWZmZXItcmVhZC1vbmx5OiB0IC0qLQorICovCisvKiBNYWluIGFjY2VzcyBtYWNyb3MgKi8KKyNpZm5kZWYgUkVHX1JECisjZGVmaW5lIFJFR19SRCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1IKKyNkZWZpbmUgUkVHX1dSKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfVkVDVAorI2RlZmluZSBSRUdfV1JfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXgsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlQKKyNkZWZpbmUgUkVHX1JEX0lOVCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlQKKyNkZWZpbmUgUkVHX1dSX0lOVCggc2NvcGUsIGluc3QsIHJlZywgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1dSX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19UWVBFX0NPTlYKKyNkZWZpbmUgUkVHX1RZUEVfQ09OViggdHlwZSwgb3JndHlwZSwgdmFsICkgXAorICAoIHsgdW5pb24geyBvcmd0eXBlIG87IHR5cGUgbjsgfSByOyByLm8gPSB2YWw7IHIubjsgfSApCisjZW5kaWYKKworI2lmbmRlZiByZWdfcGFnZV9zaXplCisjZGVmaW5lIHJlZ19wYWdlX3NpemUgODE5MgorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFIKKyNkZWZpbmUgUkVHX0FERFIoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19BRERSX1ZFQ1QKKyNkZWZpbmUgUkVHX0FERFJfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisvKiBDLWNvZGUgZm9yIHJlZ2lzdGVyIHNjb3BlIG1hcmJfYnAgKi8KKworLyogUmVnaXN0ZXIgcndfZmlyc3RfYWRkciwgc2NvcGUgbWFyYl9icCwgdHlwZSBydyAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVnX21hcmJfYnBfcndfZmlyc3RfYWRkcjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9icF9yd19maXJzdF9hZGRyIDAKKyNkZWZpbmUgUkVHX1dSX0FERFJfbWFyYl9icF9yd19maXJzdF9hZGRyIDAKKworLyogUmVnaXN0ZXIgcndfbGFzdF9hZGRyLCBzY29wZSBtYXJiX2JwLCB0eXBlIHJ3ICovCit0eXBlZGVmIHVuc2lnbmVkIGludCByZWdfbWFyYl9icF9yd19sYXN0X2FkZHI7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfYnBfcndfbGFzdF9hZGRyIDQKKyNkZWZpbmUgUkVHX1dSX0FERFJfbWFyYl9icF9yd19sYXN0X2FkZHIgNAorCisvKiBSZWdpc3RlciByd19vcCwgc2NvcGUgbWFyYl9icCwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgcmQgICAgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB3ciAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHJkX2V4Y2wgICAgOiAxOworICB1bnNpZ25lZCBpbnQgcHJpX3dyICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB1c19yZCAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHVzX3dyICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdXNfcmRfZXhjbCA6IDE7CisgIHVuc2lnbmVkIGludCB1c19wcmlfd3IgIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgICAgOiAyNDsKK30gcmVnX21hcmJfYnBfcndfb3A7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfYnBfcndfb3AgOAorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX2JwX3J3X29wIDgKKworLyogUmVnaXN0ZXIgcndfY2xpZW50cywgc2NvcGUgbWFyYl9icCwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZG1hMCAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMSAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMiAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hMyAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNCAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNSAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNiAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hNyAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hOCAgOiAxOworICB1bnNpZ25lZCBpbnQgZG1hOSAgOiAxOworICB1bnNpZ25lZCBpbnQgY3B1aSAgOiAxOworICB1bnNpZ25lZCBpbnQgY3B1ZCAgOiAxOworICB1bnNpZ25lZCBpbnQgaW9wICAgOiAxOworICB1bnNpZ25lZCBpbnQgc2xhdmUgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTg7Cit9IHJlZ19tYXJiX2JwX3J3X2NsaWVudHM7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfYnBfcndfY2xpZW50cyAxMgorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX2JwX3J3X2NsaWVudHMgMTIKKworLyogUmVnaXN0ZXIgcndfb3B0aW9ucywgc2NvcGUgbWFyYl9icCwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgd3JhcCA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAzMTsKK30gcmVnX21hcmJfYnBfcndfb3B0aW9uczsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9icF9yd19vcHRpb25zIDE2CisjZGVmaW5lIFJFR19XUl9BRERSX21hcmJfYnBfcndfb3B0aW9ucyAxNgorCisvKiBSZWdpc3RlciByX2Jya19hZGRyLCBzY29wZSBtYXJiX2JwLCB0eXBlIHIgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IHJlZ19tYXJiX2JwX3JfYnJrX2FkZHI7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfYnBfcl9icmtfYWRkciAyMAorCisvKiBSZWdpc3RlciByX2Jya19vcCwgc2NvcGUgbWFyYl9icCwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCByZCAgICAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHdyICAgICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgcmRfZXhjbCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBwcmlfd3IgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHVzX3JkICAgICAgOiAxOworICB1bnNpZ25lZCBpbnQgdXNfd3IgICAgICA6IDE7CisgIHVuc2lnbmVkIGludCB1c19yZF9leGNsIDogMTsKKyAgdW5zaWduZWQgaW50IHVzX3ByaV93ciAgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxICAgICA6IDI0OworfSByZWdfbWFyYl9icF9yX2Jya19vcDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9icF9yX2Jya19vcCAyNAorCisvKiBSZWdpc3RlciByX2Jya19jbGllbnRzLCBzY29wZSBtYXJiX2JwLCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRtYTAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTEgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTIgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTMgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTQgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTUgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTYgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTcgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTggIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTkgIDogMTsKKyAgdW5zaWduZWQgaW50IGNwdWkgIDogMTsKKyAgdW5zaWduZWQgaW50IGNwdWQgIDogMTsKKyAgdW5zaWduZWQgaW50IGlvcCAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNsYXZlIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDE4OworfSByZWdfbWFyYl9icF9yX2Jya19jbGllbnRzOworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2JwX3JfYnJrX2NsaWVudHMgMjgKKworLyogUmVnaXN0ZXIgcl9icmtfZmlyc3RfY2xpZW50LCBzY29wZSBtYXJiX2JwLCB0eXBlIHIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRtYTAgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTEgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTIgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTMgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTQgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTUgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTYgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTcgIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTggIDogMTsKKyAgdW5zaWduZWQgaW50IGRtYTkgIDogMTsKKyAgdW5zaWduZWQgaW50IGNwdWkgIDogMTsKKyAgdW5zaWduZWQgaW50IGNwdWQgIDogMTsKKyAgdW5zaWduZWQgaW50IGlvcCAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNsYXZlIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDE4OworfSByZWdfbWFyYl9icF9yX2Jya19maXJzdF9jbGllbnQ7CisjZGVmaW5lIFJFR19SRF9BRERSX21hcmJfYnBfcl9icmtfZmlyc3RfY2xpZW50IDMyCisKKy8qIFJlZ2lzdGVyIHJfYnJrX3NpemUsIHNjb3BlIG1hcmJfYnAsIHR5cGUgciAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVnX21hcmJfYnBfcl9icmtfc2l6ZTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfbWFyYl9icF9yX2Jya19zaXplIDM2CisKKy8qIFJlZ2lzdGVyIHJ3X2Fjaywgc2NvcGUgbWFyYl9icCwgdHlwZSBydyAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVnX21hcmJfYnBfcndfYWNrOworI2RlZmluZSBSRUdfUkRfQUREUl9tYXJiX2JwX3J3X2FjayA0MAorI2RlZmluZSBSRUdfV1JfQUREUl9tYXJiX2JwX3J3X2FjayA0MAorCisKKy8qIENvbnN0YW50cyAqLworZW51bSB7CisgIHJlZ2tfbWFyYl9icF9ubyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX21hcmJfYnBfcndfb3BfZGVmYXVsdCAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19tYXJiX2JwX3J3X29wdGlvbnNfZGVmYXVsdCAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfbWFyYl9icF95ZXMgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxCit9OworI2VuZGlmIC8qIF9fbWFyYl9icF9kZWZzX2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1mcy9od3JlZ3MvcGlubXV4X2RlZnMuaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1mcy9od3JlZ3MvcGlubXV4X2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTFlYWI1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2h3cmVncy9waW5tdXhfZGVmcy5oCkBAIC0wLDAgKzEsMzU3IEBACisjaWZuZGVmIF9fcGlubXV4X2RlZnNfaAorI2RlZmluZSBfX3Bpbm11eF9kZWZzX2gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGZyb20KKyAqICAgZmlsZTogICAgICAgICAgIC4uLy4uL2luc3QvcGlubXV4L3J0bC9ndWlubmVzcy9waW5tdXhfcmVncy5yCisgKiAgICAgaWQ6ICAgICAgICAgICBwaW5tdXhfcmVncy5yLHYgMS40MCAyMDA1LzAyLzA5IDE2OjIyOjU5IHBlcnogRXhwIAorICogICAgIGxhc3QgbW9kZmllZDogTW9uIEFwciAxMSAxNjowOToxMSAyMDA1CisgKiAKKyAqICAgYnkgL24vYXNpYy9kZXNpZ24vdG9vbHMvcmRlc2Mvc3JjL3JkZXMyYyAtLW91dGZpbGUgcGlubXV4X2RlZnMuaCAuLi8uLi9pbnN0L3Bpbm11eC9ydGwvZ3Vpbm5lc3MvcGlubXV4X3JlZ3MucgorICogICAgICBpZDogJElkOiBwaW5tdXhfZGVmcy5oLHYgMS4xIDIwMDcvMDIvMTMgMTE6NTU6MzAgc3RhcnZpayBFeHAgJAorICogQW55IGNoYW5nZXMgaGVyZSB3aWxsIGJlIGxvc3QuCisgKgorICogLSotIGJ1ZmZlci1yZWFkLW9ubHk6IHQgLSotCisgKi8KKy8qIE1haW4gYWNjZXNzIG1hY3JvcyAqLworI2lmbmRlZiBSRUdfUkQKKyNkZWZpbmUgUkVHX1JEKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUgorI2RlZmluZSBSRUdfV1IoIHNjb3BlLCBpbnN0LCByZWcsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfVkVDVAorI2RlZmluZSBSRUdfUkRfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgIFJFR19SRUFEKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9WRUNUCisjZGVmaW5lIFJFR19XUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgICAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX0lOVAorI2RlZmluZSBSRUdfUkRfSU5UKCBzY29wZSwgaW5zdCwgcmVnICkgXAorICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1dSX0lOVAorI2RlZmluZSBSRUdfV1JfSU5UKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlRfVkVDVAorI2RlZmluZSBSRUdfUkRfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggaW50LCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlRfVkVDVAorI2RlZmluZSBSRUdfV1JfSU5UX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4LCB2YWwgKSBcCisgIFJFR19XUklURSggaW50LCAoaW5zdCkgKyBSRUdfV1JfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisJICAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1RZUEVfQ09OVgorI2RlZmluZSBSRUdfVFlQRV9DT05WKCB0eXBlLCBvcmd0eXBlLCB2YWwgKSBcCisgICggeyB1bmlvbiB7IG9yZ3R5cGUgbzsgdHlwZSBuOyB9IHI7IHIubyA9IHZhbDsgci5uOyB9ICkKKyNlbmRpZgorCisjaWZuZGVmIHJlZ19wYWdlX3NpemUKKyNkZWZpbmUgcmVnX3BhZ2Vfc2l6ZSA4MTkyCisjZW5kaWYKKworI2lmbmRlZiBSRUdfQUREUgorI2RlZmluZSBSRUdfQUREUiggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFJfVkVDVAorI2RlZmluZSBSRUdfQUREUl9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgKCAoaW5zdCkgKyBSRUdfUkRfQUREUl8jI3Njb3BlIyNfIyNyZWcgKyBcCisgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcgKQorI2VuZGlmCisKKy8qIEMtY29kZSBmb3IgcmVnaXN0ZXIgc2NvcGUgcGlubXV4ICovCisKKy8qIFJlZ2lzdGVyIHJ3X3BhLCBzY29wZSBwaW5tdXgsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHBhMCAgICA6IDE7CisgIHVuc2lnbmVkIGludCBwYTEgICAgOiAxOworICB1bnNpZ25lZCBpbnQgcGEyICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHBhMyAgICA6IDE7CisgIHVuc2lnbmVkIGludCBwYTQgICAgOiAxOworICB1bnNpZ25lZCBpbnQgcGE1ICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHBhNiAgICA6IDE7CisgIHVuc2lnbmVkIGludCBwYTcgICAgOiAxOworICB1bnNpZ25lZCBpbnQgY3NwMl9uIDogMTsKKyAgdW5zaWduZWQgaW50IGNzcDNfbiA6IDE7CisgIHVuc2lnbmVkIGludCBjc3A1X24gOiAxOworICB1bnNpZ25lZCBpbnQgY3NwNl9uIDogMTsKKyAgdW5zaWduZWQgaW50IGhzaDQgICA6IDE7CisgIHVuc2lnbmVkIGludCBoc2g1ICAgOiAxOworICB1bnNpZ25lZCBpbnQgaHNoNiAgIDogMTsKKyAgdW5zaWduZWQgaW50IGhzaDcgICA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxNjsKK30gcmVnX3Bpbm11eF9yd19wYTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfcGlubXV4X3J3X3BhIDAKKyNkZWZpbmUgUkVHX1dSX0FERFJfcGlubXV4X3J3X3BhIDAKKworLyogUmVnaXN0ZXIgcndfaHdwcm90LCBzY29wZSBwaW5tdXgsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHNlcjEgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNlcjIgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNlcjMgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNzZXIwICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHNzZXIxICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGF0YTAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGF0YTEgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGF0YTIgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGF0YTMgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGF0YSAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGV0aDEgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGV0aDFfbWdtIDogMTsKKyAgdW5zaWduZWQgaW50IHRpbWVyICAgIDogMTsKKyAgdW5zaWduZWQgaW50IHAyMSAgICAgIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgIDogMTg7Cit9IHJlZ19waW5tdXhfcndfaHdwcm90OworI2RlZmluZSBSRUdfUkRfQUREUl9waW5tdXhfcndfaHdwcm90IDQKKyNkZWZpbmUgUkVHX1dSX0FERFJfcGlubXV4X3J3X2h3cHJvdCA0CisKKy8qIFJlZ2lzdGVyIHJ3X3BiX2dpbywgc2NvcGUgcGlubXV4LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBwYjAgIDogMTsKKyAgdW5zaWduZWQgaW50IHBiMSAgOiAxOworICB1bnNpZ25lZCBpbnQgcGIyICA6IDE7CisgIHVuc2lnbmVkIGludCBwYjMgIDogMTsKKyAgdW5zaWduZWQgaW50IHBiNCAgOiAxOworICB1bnNpZ25lZCBpbnQgcGI1ICA6IDE7CisgIHVuc2lnbmVkIGludCBwYjYgIDogMTsKKyAgdW5zaWduZWQgaW50IHBiNyAgOiAxOworICB1bnNpZ25lZCBpbnQgcGI4ICA6IDE7CisgIHVuc2lnbmVkIGludCBwYjkgIDogMTsKKyAgdW5zaWduZWQgaW50IHBiMTAgOiAxOworICB1bnNpZ25lZCBpbnQgcGIxMSA6IDE7CisgIHVuc2lnbmVkIGludCBwYjEyIDogMTsKKyAgdW5zaWduZWQgaW50IHBiMTMgOiAxOworICB1bnNpZ25lZCBpbnQgcGIxNCA6IDE7CisgIHVuc2lnbmVkIGludCBwYjE1IDogMTsKKyAgdW5zaWduZWQgaW50IHBiMTYgOiAxOworICB1bnNpZ25lZCBpbnQgcGIxNyA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxNDsKK30gcmVnX3Bpbm11eF9yd19wYl9naW87CisjZGVmaW5lIFJFR19SRF9BRERSX3Bpbm11eF9yd19wYl9naW8gOAorI2RlZmluZSBSRUdfV1JfQUREUl9waW5tdXhfcndfcGJfZ2lvIDgKKworLyogUmVnaXN0ZXIgcndfcGJfaW9wLCBzY29wZSBwaW5tdXgsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHBiMCAgOiAxOworICB1bnNpZ25lZCBpbnQgcGIxICA6IDE7CisgIHVuc2lnbmVkIGludCBwYjIgIDogMTsKKyAgdW5zaWduZWQgaW50IHBiMyAgOiAxOworICB1bnNpZ25lZCBpbnQgcGI0ICA6IDE7CisgIHVuc2lnbmVkIGludCBwYjUgIDogMTsKKyAgdW5zaWduZWQgaW50IHBiNiAgOiAxOworICB1bnNpZ25lZCBpbnQgcGI3ICA6IDE7CisgIHVuc2lnbmVkIGludCBwYjggIDogMTsKKyAgdW5zaWduZWQgaW50IHBiOSAgOiAxOworICB1bnNpZ25lZCBpbnQgcGIxMCA6IDE7CisgIHVuc2lnbmVkIGludCBwYjExIDogMTsKKyAgdW5zaWduZWQgaW50IHBiMTIgOiAxOworICB1bnNpZ25lZCBpbnQgcGIxMyA6IDE7CisgIHVuc2lnbmVkIGludCBwYjE0IDogMTsKKyAgdW5zaWduZWQgaW50IHBiMTUgOiAxOworICB1bnNpZ25lZCBpbnQgcGIxNiA6IDE7CisgIHVuc2lnbmVkIGludCBwYjE3IDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDE0OworfSByZWdfcGlubXV4X3J3X3BiX2lvcDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfcGlubXV4X3J3X3BiX2lvcCAxMgorI2RlZmluZSBSRUdfV1JfQUREUl9waW5tdXhfcndfcGJfaW9wIDEyCisKKy8qIFJlZ2lzdGVyIHJ3X3BjX2dpbywgc2NvcGUgcGlubXV4LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBwYzAgIDogMTsKKyAgdW5zaWduZWQgaW50IHBjMSAgOiAxOworICB1bnNpZ25lZCBpbnQgcGMyICA6IDE7CisgIHVuc2lnbmVkIGludCBwYzMgIDogMTsKKyAgdW5zaWduZWQgaW50IHBjNCAgOiAxOworICB1bnNpZ25lZCBpbnQgcGM1ICA6IDE7CisgIHVuc2lnbmVkIGludCBwYzYgIDogMTsKKyAgdW5zaWduZWQgaW50IHBjNyAgOiAxOworICB1bnNpZ25lZCBpbnQgcGM4ICA6IDE7CisgIHVuc2lnbmVkIGludCBwYzkgIDogMTsKKyAgdW5zaWduZWQgaW50IHBjMTAgOiAxOworICB1bnNpZ25lZCBpbnQgcGMxMSA6IDE7CisgIHVuc2lnbmVkIGludCBwYzEyIDogMTsKKyAgdW5zaWduZWQgaW50IHBjMTMgOiAxOworICB1bnNpZ25lZCBpbnQgcGMxNCA6IDE7CisgIHVuc2lnbmVkIGludCBwYzE1IDogMTsKKyAgdW5zaWduZWQgaW50IHBjMTYgOiAxOworICB1bnNpZ25lZCBpbnQgcGMxNyA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxNDsKK30gcmVnX3Bpbm11eF9yd19wY19naW87CisjZGVmaW5lIFJFR19SRF9BRERSX3Bpbm11eF9yd19wY19naW8gMTYKKyNkZWZpbmUgUkVHX1dSX0FERFJfcGlubXV4X3J3X3BjX2dpbyAxNgorCisvKiBSZWdpc3RlciByd19wY19pb3AsIHNjb3BlIHBpbm11eCwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgcGMwICA6IDE7CisgIHVuc2lnbmVkIGludCBwYzEgIDogMTsKKyAgdW5zaWduZWQgaW50IHBjMiAgOiAxOworICB1bnNpZ25lZCBpbnQgcGMzICA6IDE7CisgIHVuc2lnbmVkIGludCBwYzQgIDogMTsKKyAgdW5zaWduZWQgaW50IHBjNSAgOiAxOworICB1bnNpZ25lZCBpbnQgcGM2ICA6IDE7CisgIHVuc2lnbmVkIGludCBwYzcgIDogMTsKKyAgdW5zaWduZWQgaW50IHBjOCAgOiAxOworICB1bnNpZ25lZCBpbnQgcGM5ICA6IDE7CisgIHVuc2lnbmVkIGludCBwYzEwIDogMTsKKyAgdW5zaWduZWQgaW50IHBjMTEgOiAxOworICB1bnNpZ25lZCBpbnQgcGMxMiA6IDE7CisgIHVuc2lnbmVkIGludCBwYzEzIDogMTsKKyAgdW5zaWduZWQgaW50IHBjMTQgOiAxOworICB1bnNpZ25lZCBpbnQgcGMxNSA6IDE7CisgIHVuc2lnbmVkIGludCBwYzE2IDogMTsKKyAgdW5zaWduZWQgaW50IHBjMTcgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTQ7Cit9IHJlZ19waW5tdXhfcndfcGNfaW9wOworI2RlZmluZSBSRUdfUkRfQUREUl9waW5tdXhfcndfcGNfaW9wIDIwCisjZGVmaW5lIFJFR19XUl9BRERSX3Bpbm11eF9yd19wY19pb3AgMjAKKworLyogUmVnaXN0ZXIgcndfcGRfZ2lvLCBzY29wZSBwaW5tdXgsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHBkMCAgOiAxOworICB1bnNpZ25lZCBpbnQgcGQxICA6IDE7CisgIHVuc2lnbmVkIGludCBwZDIgIDogMTsKKyAgdW5zaWduZWQgaW50IHBkMyAgOiAxOworICB1bnNpZ25lZCBpbnQgcGQ0ICA6IDE7CisgIHVuc2lnbmVkIGludCBwZDUgIDogMTsKKyAgdW5zaWduZWQgaW50IHBkNiAgOiAxOworICB1bnNpZ25lZCBpbnQgcGQ3ICA6IDE7CisgIHVuc2lnbmVkIGludCBwZDggIDogMTsKKyAgdW5zaWduZWQgaW50IHBkOSAgOiAxOworICB1bnNpZ25lZCBpbnQgcGQxMCA6IDE7CisgIHVuc2lnbmVkIGludCBwZDExIDogMTsKKyAgdW5zaWduZWQgaW50IHBkMTIgOiAxOworICB1bnNpZ25lZCBpbnQgcGQxMyA6IDE7CisgIHVuc2lnbmVkIGludCBwZDE0IDogMTsKKyAgdW5zaWduZWQgaW50IHBkMTUgOiAxOworICB1bnNpZ25lZCBpbnQgcGQxNiA6IDE7CisgIHVuc2lnbmVkIGludCBwZDE3IDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDE0OworfSByZWdfcGlubXV4X3J3X3BkX2dpbzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfcGlubXV4X3J3X3BkX2dpbyAyNAorI2RlZmluZSBSRUdfV1JfQUREUl9waW5tdXhfcndfcGRfZ2lvIDI0CisKKy8qIFJlZ2lzdGVyIHJ3X3BkX2lvcCwgc2NvcGUgcGlubXV4LCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBwZDAgIDogMTsKKyAgdW5zaWduZWQgaW50IHBkMSAgOiAxOworICB1bnNpZ25lZCBpbnQgcGQyICA6IDE7CisgIHVuc2lnbmVkIGludCBwZDMgIDogMTsKKyAgdW5zaWduZWQgaW50IHBkNCAgOiAxOworICB1bnNpZ25lZCBpbnQgcGQ1ICA6IDE7CisgIHVuc2lnbmVkIGludCBwZDYgIDogMTsKKyAgdW5zaWduZWQgaW50IHBkNyAgOiAxOworICB1bnNpZ25lZCBpbnQgcGQ4ICA6IDE7CisgIHVuc2lnbmVkIGludCBwZDkgIDogMTsKKyAgdW5zaWduZWQgaW50IHBkMTAgOiAxOworICB1bnNpZ25lZCBpbnQgcGQxMSA6IDE7CisgIHVuc2lnbmVkIGludCBwZDEyIDogMTsKKyAgdW5zaWduZWQgaW50IHBkMTMgOiAxOworICB1bnNpZ25lZCBpbnQgcGQxNCA6IDE7CisgIHVuc2lnbmVkIGludCBwZDE1IDogMTsKKyAgdW5zaWduZWQgaW50IHBkMTYgOiAxOworICB1bnNpZ25lZCBpbnQgcGQxNyA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAxNDsKK30gcmVnX3Bpbm11eF9yd19wZF9pb3A7CisjZGVmaW5lIFJFR19SRF9BRERSX3Bpbm11eF9yd19wZF9pb3AgMjgKKyNkZWZpbmUgUkVHX1dSX0FERFJfcGlubXV4X3J3X3BkX2lvcCAyOAorCisvKiBSZWdpc3RlciByd19wZV9naW8sIHNjb3BlIHBpbm11eCwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgcGUwICA6IDE7CisgIHVuc2lnbmVkIGludCBwZTEgIDogMTsKKyAgdW5zaWduZWQgaW50IHBlMiAgOiAxOworICB1bnNpZ25lZCBpbnQgcGUzICA6IDE7CisgIHVuc2lnbmVkIGludCBwZTQgIDogMTsKKyAgdW5zaWduZWQgaW50IHBlNSAgOiAxOworICB1bnNpZ25lZCBpbnQgcGU2ICA6IDE7CisgIHVuc2lnbmVkIGludCBwZTcgIDogMTsKKyAgdW5zaWduZWQgaW50IHBlOCAgOiAxOworICB1bnNpZ25lZCBpbnQgcGU5ICA6IDE7CisgIHVuc2lnbmVkIGludCBwZTEwIDogMTsKKyAgdW5zaWduZWQgaW50IHBlMTEgOiAxOworICB1bnNpZ25lZCBpbnQgcGUxMiA6IDE7CisgIHVuc2lnbmVkIGludCBwZTEzIDogMTsKKyAgdW5zaWduZWQgaW50IHBlMTQgOiAxOworICB1bnNpZ25lZCBpbnQgcGUxNSA6IDE7CisgIHVuc2lnbmVkIGludCBwZTE2IDogMTsKKyAgdW5zaWduZWQgaW50IHBlMTcgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTQ7Cit9IHJlZ19waW5tdXhfcndfcGVfZ2lvOworI2RlZmluZSBSRUdfUkRfQUREUl9waW5tdXhfcndfcGVfZ2lvIDMyCisjZGVmaW5lIFJFR19XUl9BRERSX3Bpbm11eF9yd19wZV9naW8gMzIKKworLyogUmVnaXN0ZXIgcndfcGVfaW9wLCBzY29wZSBwaW5tdXgsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHBlMCAgOiAxOworICB1bnNpZ25lZCBpbnQgcGUxICA6IDE7CisgIHVuc2lnbmVkIGludCBwZTIgIDogMTsKKyAgdW5zaWduZWQgaW50IHBlMyAgOiAxOworICB1bnNpZ25lZCBpbnQgcGU0ICA6IDE7CisgIHVuc2lnbmVkIGludCBwZTUgIDogMTsKKyAgdW5zaWduZWQgaW50IHBlNiAgOiAxOworICB1bnNpZ25lZCBpbnQgcGU3ICA6IDE7CisgIHVuc2lnbmVkIGludCBwZTggIDogMTsKKyAgdW5zaWduZWQgaW50IHBlOSAgOiAxOworICB1bnNpZ25lZCBpbnQgcGUxMCA6IDE7CisgIHVuc2lnbmVkIGludCBwZTExIDogMTsKKyAgdW5zaWduZWQgaW50IHBlMTIgOiAxOworICB1bnNpZ25lZCBpbnQgcGUxMyA6IDE7CisgIHVuc2lnbmVkIGludCBwZTE0IDogMTsKKyAgdW5zaWduZWQgaW50IHBlMTUgOiAxOworICB1bnNpZ25lZCBpbnQgcGUxNiA6IDE7CisgIHVuc2lnbmVkIGludCBwZTE3IDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDE0OworfSByZWdfcGlubXV4X3J3X3BlX2lvcDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfcGlubXV4X3J3X3BlX2lvcCAzNgorI2RlZmluZSBSRUdfV1JfQUREUl9waW5tdXhfcndfcGVfaW9wIDM2CisKKy8qIFJlZ2lzdGVyIHJ3X3VzYl9waHksIHNjb3BlIHBpbm11eCwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZW5fdXNiMCA6IDE7CisgIHVuc2lnbmVkIGludCBlbl91c2IxIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSAgOiAzMDsKK30gcmVnX3Bpbm11eF9yd191c2JfcGh5OworI2RlZmluZSBSRUdfUkRfQUREUl9waW5tdXhfcndfdXNiX3BoeSA0MAorI2RlZmluZSBSRUdfV1JfQUREUl9waW5tdXhfcndfdXNiX3BoeSA0MAorCisKKy8qIENvbnN0YW50cyAqLworZW51bSB7CisgIHJlZ2tfcGlubXV4X25vICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX3Bpbm11eF9yd19od3Byb3RfZGVmYXVsdCAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19waW5tdXhfcndfcGFfZGVmYXVsdCAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfcGlubXV4X3J3X3BiX2dpb19kZWZhdWx0ICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX3Bpbm11eF9yd19wYl9pb3BfZGVmYXVsdCAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19waW5tdXhfcndfcGNfZ2lvX2RlZmF1bHQgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfcGlubXV4X3J3X3BjX2lvcF9kZWZhdWx0ICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX3Bpbm11eF9yd19wZF9naW9fZGVmYXVsdCAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19waW5tdXhfcndfcGRfaW9wX2RlZmF1bHQgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfcGlubXV4X3J3X3BlX2dpb19kZWZhdWx0ICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX3Bpbm11eF9yd19wZV9pb3BfZGVmYXVsdCAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna19waW5tdXhfcndfdXNiX3BoeV9kZWZhdWx0ICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfcGlubXV4X3llcyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxCit9OworI2VuZGlmIC8qIF9fcGlubXV4X2RlZnNfaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2h3cmVncy9yZWdfbWFwLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdyZWdzL3JlZ19tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTQ2OTczCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2h3cmVncy9yZWdfbWFwLmgKQEAgLTAsMCArMSwxMDQgQEAKKyNpZm5kZWYgX19yZWdfbWFwX2gKKyNkZWZpbmUgX19yZWdfbWFwX2gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGZyb20KKyAqICAgZmlsZTogICAgICAgICAgICAuLi8uLi9tb2QvZmFrZXJlZy5ybWFwCisgKiAgICAgaWQ6ICAgICAgICAgICAgZmFrZXJlZy5ybWFwLHYgMS4zIDIwMDQvMDIvMTEgMTk6NTM6MjIgcm9ubnkgRXhwIAorICogICAgIGxhc3QgbW9kaWZpZWQ6IFdlZCBGZWIgMTEgMjA6NTM6MjUgMjAwNAorICogICBmaWxlOiAgICAgICAgICAgIC4uLy4uL3J0bC9nbG9iYWwucm1hcAorICogICAgIGlkOiAgICAgICAgICAgIGdsb2JhbC5ybWFwLHYgMS4zIDIwMDMvMDgvMTggMTU6MDg6MjMgbWlrYWVsbiBFeHAgCisgKiAgICAgbGFzdCBtb2RpZmllZDogTW9uIEF1ZyAxOCAxNzowODoyMyAyMDAzCisgKiAgIGZpbGU6ICAgICAgICAgICAgLi4vLi4vbW9kL21vZHJlZy5ybWFwCisgKiAgICAgaWQ6ICAgICAgICAgICAgbW9kcmVnLnJtYXAsdiAxLjMxIDIwMDQvMDIvMjAgMTU6NDA6MDQgc3RlZmFucyBFeHAgCisgKiAgICAgbGFzdCBtb2RpZmllZDogRnJpIEZlYiAyMCAxNjo0MDowNCAyMDA0CisgKiAKKyAqICAgYnkgL24vYXNpYy9kZXNpZ24vdG9vbHMvcmRlc2Mvc3JjL3JkZXMyYyAtbWFwIC1iYXNlIDB4YjAwMDAwMDAgLi4vLi4vcnRsL2dsb2JhbC5ybWFwIC4uLy4uL21vZC9tb2RyZWcucm1hcCAuLi8uLi9pbnN0L2lvX3Byb2MvcnRsL2d1aW5uZXNzL2lvcF90b3AuciAuLi8uLi9pbnN0L21lbWFyYi9ydGwvZ3Vpbm5lc3MvbWFyYl90b3AuciAuLi8uLi9tb2QvZmFrZXJlZy5ybWFwCisgKiAgICAgIGlkOiAkSWQ6IHJlZ19tYXAuaCx2IDEuMSAyMDA3LzAyLzEzIDExOjU1OjMwIHN0YXJ2aWsgRXhwICQgCisgKiBBbnkgY2hhbmdlcyBoZXJlIHdpbGwgYmUgbG9zdC4KKyAqCisgKiAtKi0gYnVmZmVyLXJlYWQtb25seTogdCAtKi0KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgcmVnaV9hdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMzIwMDAsCisgIHJlZ2lfYmlmX2NvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDE0MDAwLAorICByZWdpX2JpZl9kbWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAxNjAwMCwKKyAgcmVnaV9iaWZfc2xhdmUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMTgwMDAsCisgIHJlZ2lfY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDNjMDAwLAorICByZWdpX2RtYTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAwMDAwMCwKKyAgcmVnaV9kbWExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMDIwMDAsCisgIHJlZ2lfZG1hMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDA0MDAwLAorICByZWdpX2RtYTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAwNjAwMCwKKyAgcmVnaV9kbWE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMDgwMDAsCisgIHJlZ2lfZG1hNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDBhMDAwLAorICByZWdpX2RtYTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAwYzAwMCwKKyAgcmVnaV9kbWE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMGUwMDAsCisgIHJlZ2lfZG1hOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDEwMDAwLAorICByZWdpX2RtYTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAxMjAwMCwKKyAgcmVnaV9ldGgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMzQwMDAsCisgIHJlZ2lfZXRoMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDM2MDAwLAorICByZWdpX2dpbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAxYTAwMCwKKyAgcmVnaV9pb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjAwMDAsCisgIHJlZ2lfaW9wX3ZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIwMDAwLAorICByZWdpX2lvcF9maWZvX2luMF9leHRyYSAgICAgICAgICAgICAgICAgID0gMHhiMDAyMDA0MCwKKyAgcmVnaV9pb3BfZmlmb19pbjFfZXh0cmEgICAgICAgICAgICAgICAgICA9IDB4YjAwMjAwODAsCisgIHJlZ2lfaW9wX2ZpZm9fb3V0MF9leHRyYSAgICAgICAgICAgICAgICAgPSAweGIwMDIwMGMwLAorICByZWdpX2lvcF9maWZvX291dDFfZXh0cmEgICAgICAgICAgICAgICAgID0gMHhiMDAyMDEwMCwKKyAgcmVnaV9pb3BfdHJpZ2dlcl9ncnAwICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjAxNDAsCisgIHJlZ2lfaW9wX3RyaWdnZXJfZ3JwMSAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIwMTgwLAorICByZWdpX2lvcF90cmlnZ2VyX2dycDIgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMDFjMCwKKyAgcmVnaV9pb3BfdHJpZ2dlcl9ncnAzICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjAyMDAsCisgIHJlZ2lfaW9wX3RyaWdnZXJfZ3JwNCAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIwMjQwLAorICByZWdpX2lvcF90cmlnZ2VyX2dycDUgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMDI4MCwKKyAgcmVnaV9pb3BfdHJpZ2dlcl9ncnA2ICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjAyYzAsCisgIHJlZ2lfaW9wX3RyaWdnZXJfZ3JwNyAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIwMzAwLAorICByZWdpX2lvcF9jcmNfcGFyMCAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMDM4MCwKKyAgcmVnaV9pb3BfY3JjX3BhcjEgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjA0MDAsCisgIHJlZ2lfaW9wX2RtY19pbjAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIwNDgwLAorICByZWdpX2lvcF9kbWNfaW4xICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMDUwMCwKKyAgcmVnaV9pb3BfZG1jX291dDAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjA1ODAsCisgIHJlZ2lfaW9wX2RtY19vdXQxICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIwNjAwLAorICByZWdpX2lvcF9maWZvX2luMCAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMDY4MCwKKyAgcmVnaV9pb3BfZmlmb19pbjEgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjA3MDAsCisgIHJlZ2lfaW9wX2ZpZm9fb3V0MCAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIwNzgwLAorICByZWdpX2lvcF9maWZvX291dDEgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMDgwMCwKKyAgcmVnaV9pb3Bfc2NyY19pbjAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjA4ODAsCisgIHJlZ2lfaW9wX3NjcmNfaW4xICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIwOTAwLAorICByZWdpX2lvcF9zY3JjX291dDAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMDk4MCwKKyAgcmVnaV9pb3Bfc2NyY19vdXQxICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjBhMDAsCisgIHJlZ2lfaW9wX3RpbWVyX2dycDAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIwYTgwLAorICByZWdpX2lvcF90aW1lcl9ncnAxICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMGIwMCwKKyAgcmVnaV9pb3BfdGltZXJfZ3JwMiAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjBiODAsCisgIHJlZ2lfaW9wX3RpbWVyX2dycDMgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIwYzAwLAorICByZWdpX2lvcF9zYXBfaW4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMGQwMCwKKyAgcmVnaV9pb3Bfc2FwX291dCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjBlMDAsCisgIHJlZ2lfaW9wX3NwdTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIwZjAwLAorICByZWdpX2lvcF9zcHUxICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMTAwMCwKKyAgcmVnaV9pb3Bfc3dfY2ZnICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjExMDAsCisgIHJlZ2lfaW9wX3N3X2NwdSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIxMjAwLAorICByZWdpX2lvcF9zd19tcHUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMTMwMCwKKyAgcmVnaV9pb3Bfc3dfc3B1MCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjE0MDAsCisgIHJlZ2lfaW9wX3N3X3NwdTEgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDIxNTAwLAorICByZWdpX2lvcF9tcHUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyMTYwMCwKKyAgcmVnaV9pcnEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMWMwMDAsCisgIHJlZ2lfaXJxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDVjMDAwLAorICByZWdpX21hcmIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAzZTAwMCwKKyAgcmVnaV9tYXJiX2JwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwM2UyNDAsCisgIHJlZ2lfbWFyYl9icDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDNlMjgwLAorICByZWdpX21hcmJfYnAyICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAzZTJjMCwKKyAgcmVnaV9tYXJiX2JwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwM2UzMDAsCisgIHJlZ2lfcGlubXV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDM4MDAwLAorICByZWdpX3NlcjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyNjAwMCwKKyAgcmVnaV9zZXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjgwMDAsCisgIHJlZ2lfc2VyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDJhMDAwLAorICByZWdpX3NlcjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAyYzAwMCwKKyAgcmVnaV9zc2VyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwMjIwMDAsCisgIHJlZ2lfc3NlcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDI0MDAwLAorICByZWdpX3N0cmNvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAzMDAwMCwKKyAgcmVnaV9zdHJtdXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwM2EwMDAsCisgIHJlZ2lfdGltZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDFlMDAwLAorICByZWdpX3RpbWVyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHhiMDAxZTAwMCwKKyAgcmVnaV90aW1lcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4YjAwNWUwMDAsCisgIHJlZ2lfdHJhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweGIwMDQwMDAwLAorfSByZWdfc2NvcGVfaW5zdGFuY2VzOworI2VuZGlmIC8qIF9fcmVnX21hcF9oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdyZWdzL3N0cm11eF9kZWZzLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdyZWdzL3N0cm11eF9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JmYWE4NgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1mcy9od3JlZ3Mvc3RybXV4X2RlZnMuaApAQCAtMCwwICsxLDEyNyBAQAorI2lmbmRlZiBfX3N0cm11eF9kZWZzX2gKKyNkZWZpbmUgX19zdHJtdXhfZGVmc19oCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXV0b2dlbmVyYXRlZCBmcm9tCisgKiAgIGZpbGU6ICAgICAgICAgICAuLi8uLi9pbnN0L3N0cm11eC9ydGwvZ3Vpbm5lc3Mvc3RybXV4X3JlZ3MucgorICogICAgIGlkOiAgICAgICAgICAgc3RybXV4X3JlZ3Mucix2IDEuMTAgMjAwNS8wMi8xMCAxMDoxMDo0NiBwZXJ6IEV4cCAKKyAqICAgICBsYXN0IG1vZGZpZWQ6IE1vbiBBcHIgMTEgMTY6MDk6NDMgMjAwNQorICogCisgKiAgIGJ5IC9uL2FzaWMvZGVzaWduL3Rvb2xzL3JkZXNjL3NyYy9yZGVzMmMgLS1vdXRmaWxlIHN0cm11eF9kZWZzLmggLi4vLi4vaW5zdC9zdHJtdXgvcnRsL2d1aW5uZXNzL3N0cm11eF9yZWdzLnIKKyAqICAgICAgaWQ6ICRJZDogc3RybXV4X2RlZnMuaCx2IDEuMSAyMDA3LzAyLzEzIDExOjU1OjMwIHN0YXJ2aWsgRXhwICQKKyAqIEFueSBjaGFuZ2VzIGhlcmUgd2lsbCBiZSBsb3N0LgorICoKKyAqIC0qLSBidWZmZXItcmVhZC1vbmx5OiB0IC0qLQorICovCisvKiBNYWluIGFjY2VzcyBtYWNyb3MgKi8KKyNpZm5kZWYgUkVHX1JECisjZGVmaW5lIFJFR19SRCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1IKKyNkZWZpbmUgUkVHX1dSKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfVkVDVAorI2RlZmluZSBSRUdfV1JfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXgsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlQKKyNkZWZpbmUgUkVHX1JEX0lOVCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlQKKyNkZWZpbmUgUkVHX1dSX0lOVCggc2NvcGUsIGluc3QsIHJlZywgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1dSX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19UWVBFX0NPTlYKKyNkZWZpbmUgUkVHX1RZUEVfQ09OViggdHlwZSwgb3JndHlwZSwgdmFsICkgXAorICAoIHsgdW5pb24geyBvcmd0eXBlIG87IHR5cGUgbjsgfSByOyByLm8gPSB2YWw7IHIubjsgfSApCisjZW5kaWYKKworI2lmbmRlZiByZWdfcGFnZV9zaXplCisjZGVmaW5lIHJlZ19wYWdlX3NpemUgODE5MgorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFIKKyNkZWZpbmUgUkVHX0FERFIoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19BRERSX1ZFQ1QKKyNkZWZpbmUgUkVHX0FERFJfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisvKiBDLWNvZGUgZm9yIHJlZ2lzdGVyIHNjb3BlIHN0cm11eCAqLworCisvKiBSZWdpc3RlciByd19jZmcsIHNjb3BlIHN0cm11eCwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZG1hMCA6IDM7CisgIHVuc2lnbmVkIGludCBkbWExIDogMzsKKyAgdW5zaWduZWQgaW50IGRtYTIgOiAzOworICB1bnNpZ25lZCBpbnQgZG1hMyA6IDM7CisgIHVuc2lnbmVkIGludCBkbWE0IDogMzsKKyAgdW5zaWduZWQgaW50IGRtYTUgOiAzOworICB1bnNpZ25lZCBpbnQgZG1hNiA6IDM7CisgIHVuc2lnbmVkIGludCBkbWE3IDogMzsKKyAgdW5zaWduZWQgaW50IGRtYTggOiAzOworICB1bnNpZ25lZCBpbnQgZG1hOSA6IDM7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyOworfSByZWdfc3RybXV4X3J3X2NmZzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfc3RybXV4X3J3X2NmZyAwCisjZGVmaW5lIFJFR19XUl9BRERSX3N0cm11eF9yd19jZmcgMAorCisKKy8qIENvbnN0YW50cyAqLworZW51bSB7CisgIHJlZ2tfc3RybXV4X2F0YSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAzLAorICByZWdrX3N0cm11eF9ldGgwICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19zdHJtdXhfZXRoMSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDQsCisgIHJlZ2tfc3RybXV4X2V4dDAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX3N0cm11eF9leHQxICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna19zdHJtdXhfZXh0MiAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfc3RybXV4X2V4dDMgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX3N0cm11eF9pb3AwICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19zdHJtdXhfaW9wMSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfc3RybXV4X29mZiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX3N0cm11eF9wMjEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNCwKKyAgcmVna19zdHJtdXhfcndfY2ZnX2RlZmF1bHQgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfc3RybXV4X3NlcjAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX3N0cm11eF9zZXIxICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna19zdHJtdXhfc2VyMiAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDQsCisgIHJlZ2tfc3RybXV4X3NlcjMgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAzLAorICByZWdrX3N0cm11eF9zc2VyMCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMywKKyAgcmVna19zdHJtdXhfc3NlcjEgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDMsCisgIHJlZ2tfc3RybXV4X3N0cmNvcCAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyCit9OworI2VuZGlmIC8qIF9fc3RybXV4X2RlZnNfaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2h3cmVncy90aW1lcl9kZWZzLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvaHdyZWdzL3RpbWVyX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmJjYzU5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL2h3cmVncy90aW1lcl9kZWZzLmgKQEAgLTAsMCArMSwyNjYgQEAKKyNpZm5kZWYgX190aW1lcl9kZWZzX2gKKyNkZWZpbmUgX190aW1lcl9kZWZzX2gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGZyb20KKyAqICAgZmlsZTogICAgICAgICAgIC4uLy4uL2luc3QvdGltZXIvcnRsL3RpbWVyX3JlZ3MucgorICogICAgIGlkOiAgICAgICAgICAgdGltZXJfcmVncy5yLHYgMS43IDIwMDMvMDMvMTEgMTE6MTY6NTkgcGVyeiBFeHAgCisgKiAgICAgbGFzdCBtb2RmaWVkOiBNb24gQXByIDExIDE2OjA5OjUzIDIwMDUKKyAqIAorICogICBieSAvbi9hc2ljL2Rlc2lnbi90b29scy9yZGVzYy9zcmMvcmRlczJjIC0tb3V0ZmlsZSB0aW1lcl9kZWZzLmggLi4vLi4vaW5zdC90aW1lci9ydGwvdGltZXJfcmVncy5yCisgKiAgICAgIGlkOiAkSWQ6IHRpbWVyX2RlZnMuaCx2IDEuMSAyMDA3LzA0LzExIDEzOjUxOjAxIHJpY2FyZHcgRXhwICQKKyAqIEFueSBjaGFuZ2VzIGhlcmUgd2lsbCBiZSBsb3N0LgorICoKKyAqIC0qLSBidWZmZXItcmVhZC1vbmx5OiB0IC0qLQorICovCisvKiBNYWluIGFjY2VzcyBtYWNyb3MgKi8KKyNpZm5kZWYgUkVHX1JECisjZGVmaW5lIFJFR19SRCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIHJlZ18jI3Njb3BlIyNfIyNyZWcsIFwKKyAgICAgICAgICAgIChpbnN0KSArIFJFR19SRF9BRERSXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1IKKyNkZWZpbmUgUkVHX1dSKCBzY29wZSwgaW5zdCwgcmVnLCB2YWwgKSBcCisgIFJFR19XUklURSggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgIChpbnN0KSArIFJFR19XUl9BRERSXyMjc2NvcGUjI18jI3JlZywgKHZhbCkgKQorI2VuZGlmCisKKyNpZm5kZWYgUkVHX1JEX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX1ZFQ1QoIHNjb3BlLCBpbnN0LCByZWcsIGluZGV4ICkgXAorICBSRUdfUkVBRCggcmVnXyMjc2NvcGUjI18jI3JlZywgXAorICAgICAgICAgICAgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfVkVDVAorI2RlZmluZSBSRUdfV1JfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXgsIHZhbCApIFwKKyAgUkVHX1dSSVRFKCByZWdfIyNzY29wZSMjXyMjcmVnLCBcCisgICAgICAgICAgICAgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19SRF9JTlQKKyNkZWZpbmUgUkVHX1JEX0lOVCggc2NvcGUsIGluc3QsIHJlZyApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19XUl9JTlQKKyNkZWZpbmUgUkVHX1dSX0lOVCggc2NvcGUsIGluc3QsIHJlZywgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnLCAodmFsKSApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfUkRfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1JEX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCApIFwKKyAgUkVHX1JFQUQoIGludCwgKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAoaW5kZXgpICogU1RSSURFXyMjc2NvcGUjI18jI3JlZyApCisjZW5kaWYKKworI2lmbmRlZiBSRUdfV1JfSU5UX1ZFQ1QKKyNkZWZpbmUgUkVHX1dSX0lOVF9WRUNUKCBzY29wZSwgaW5zdCwgcmVnLCBpbmRleCwgdmFsICkgXAorICBSRUdfV1JJVEUoIGludCwgKGluc3QpICsgUkVHX1dSX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorCSAgICAgKGluZGV4KSAqIFNUUklERV8jI3Njb3BlIyNfIyNyZWcsICh2YWwpICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19UWVBFX0NPTlYKKyNkZWZpbmUgUkVHX1RZUEVfQ09OViggdHlwZSwgb3JndHlwZSwgdmFsICkgXAorICAoIHsgdW5pb24geyBvcmd0eXBlIG87IHR5cGUgbjsgfSByOyByLm8gPSB2YWw7IHIubjsgfSApCisjZW5kaWYKKworI2lmbmRlZiByZWdfcGFnZV9zaXplCisjZGVmaW5lIHJlZ19wYWdlX3NpemUgODE5MgorI2VuZGlmCisKKyNpZm5kZWYgUkVHX0FERFIKKyNkZWZpbmUgUkVHX0FERFIoIHNjb3BlLCBpbnN0LCByZWcgKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisjaWZuZGVmIFJFR19BRERSX1ZFQ1QKKyNkZWZpbmUgUkVHX0FERFJfVkVDVCggc2NvcGUsIGluc3QsIHJlZywgaW5kZXggKSBcCisgICggKGluc3QpICsgUkVHX1JEX0FERFJfIyNzY29wZSMjXyMjcmVnICsgXAorICAgIChpbmRleCkgKiBTVFJJREVfIyNzY29wZSMjXyMjcmVnICkKKyNlbmRpZgorCisvKiBDLWNvZGUgZm9yIHJlZ2lzdGVyIHNjb3BlIHRpbWVyICovCisKKy8qIFJlZ2lzdGVyIHJ3X3RtcjBfZGl2LCBzY29wZSB0aW1lciwgdHlwZSBydyAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVnX3RpbWVyX3J3X3RtcjBfZGl2OworI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yd190bXIwX2RpdiAwCisjZGVmaW5lIFJFR19XUl9BRERSX3RpbWVyX3J3X3RtcjBfZGl2IDAKKworLyogUmVnaXN0ZXIgcl90bXIwX2RhdGEsIHNjb3BlIHRpbWVyLCB0eXBlIHIgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IHJlZ190aW1lcl9yX3RtcjBfZGF0YTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfdGltZXJfcl90bXIwX2RhdGEgNAorCisvKiBSZWdpc3RlciByd190bXIwX2N0cmwsIHNjb3BlIHRpbWVyLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBvcCAgIDogMjsKKyAgdW5zaWduZWQgaW50IGZyZXEgOiAzOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjc7Cit9IHJlZ190aW1lcl9yd190bXIwX2N0cmw7CisjZGVmaW5lIFJFR19SRF9BRERSX3RpbWVyX3J3X3RtcjBfY3RybCA4CisjZGVmaW5lIFJFR19XUl9BRERSX3RpbWVyX3J3X3RtcjBfY3RybCA4CisKKy8qIFJlZ2lzdGVyIHJ3X3RtcjFfZGl2LCBzY29wZSB0aW1lciwgdHlwZSBydyAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVnX3RpbWVyX3J3X3RtcjFfZGl2OworI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yd190bXIxX2RpdiAxNgorI2RlZmluZSBSRUdfV1JfQUREUl90aW1lcl9yd190bXIxX2RpdiAxNgorCisvKiBSZWdpc3RlciByX3RtcjFfZGF0YSwgc2NvcGUgdGltZXIsIHR5cGUgciAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVnX3RpbWVyX3JfdG1yMV9kYXRhOworI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yX3RtcjFfZGF0YSAyMAorCisvKiBSZWdpc3RlciByd190bXIxX2N0cmwsIHNjb3BlIHRpbWVyLCB0eXBlIHJ3ICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBvcCAgIDogMjsKKyAgdW5zaWduZWQgaW50IGZyZXEgOiAzOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjc7Cit9IHJlZ190aW1lcl9yd190bXIxX2N0cmw7CisjZGVmaW5lIFJFR19SRF9BRERSX3RpbWVyX3J3X3RtcjFfY3RybCAyNAorI2RlZmluZSBSRUdfV1JfQUREUl90aW1lcl9yd190bXIxX2N0cmwgMjQKKworLyogUmVnaXN0ZXIgcnNfY250X2RhdGEsIHNjb3BlIHRpbWVyLCB0eXBlIHJzICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCB0bXIgOiAyNDsKKyAgdW5zaWduZWQgaW50IGNudCA6IDg7Cit9IHJlZ190aW1lcl9yc19jbnRfZGF0YTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfdGltZXJfcnNfY250X2RhdGEgMzIKKworLyogUmVnaXN0ZXIgcl9jbnRfZGF0YSwgc2NvcGUgdGltZXIsIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgdG1yIDogMjQ7CisgIHVuc2lnbmVkIGludCBjbnQgOiA4OworfSByZWdfdGltZXJfcl9jbnRfZGF0YTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfdGltZXJfcl9jbnRfZGF0YSAzNgorCisvKiBSZWdpc3RlciByd19jbnRfY2ZnLCBzY29wZSB0aW1lciwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgY2xrIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDMwOworfSByZWdfdGltZXJfcndfY250X2NmZzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfdGltZXJfcndfY250X2NmZyA0MAorI2RlZmluZSBSRUdfV1JfQUREUl90aW1lcl9yd19jbnRfY2ZnIDQwCisKKy8qIFJlZ2lzdGVyIHJ3X3RyaWcsIHNjb3BlIHRpbWVyLCB0eXBlIHJ3ICovCit0eXBlZGVmIHVuc2lnbmVkIGludCByZWdfdGltZXJfcndfdHJpZzsKKyNkZWZpbmUgUkVHX1JEX0FERFJfdGltZXJfcndfdHJpZyA0OAorI2RlZmluZSBSRUdfV1JfQUREUl90aW1lcl9yd190cmlnIDQ4CisKKy8qIFJlZ2lzdGVyIHJ3X3RyaWdfY2ZnLCBzY29wZSB0aW1lciwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgdG1yIDogMjsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDMwOworfSByZWdfdGltZXJfcndfdHJpZ19jZmc7CisjZGVmaW5lIFJFR19SRF9BRERSX3RpbWVyX3J3X3RyaWdfY2ZnIDUyCisjZGVmaW5lIFJFR19XUl9BRERSX3RpbWVyX3J3X3RyaWdfY2ZnIDUyCisKKy8qIFJlZ2lzdGVyIHJfdGltZSwgc2NvcGUgdGltZXIsIHR5cGUgciAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgcmVnX3RpbWVyX3JfdGltZTsKKyNkZWZpbmUgUkVHX1JEX0FERFJfdGltZXJfcl90aW1lIDU2CisKKy8qIFJlZ2lzdGVyIHJ3X291dCwgc2NvcGUgdGltZXIsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHRtciA6IDI7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAzMDsKK30gcmVnX3RpbWVyX3J3X291dDsKKyNkZWZpbmUgUkVHX1JEX0FERFJfdGltZXJfcndfb3V0IDYwCisjZGVmaW5lIFJFR19XUl9BRERSX3RpbWVyX3J3X291dCA2MAorCisvKiBSZWdpc3RlciByd193ZF9jdHJsLCBzY29wZSB0aW1lciwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgY250IDogODsKKyAgdW5zaWduZWQgaW50IGNtZCA6IDE7CisgIHVuc2lnbmVkIGludCBrZXkgOiA3OworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMTY7Cit9IHJlZ190aW1lcl9yd193ZF9jdHJsOworI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yd193ZF9jdHJsIDY0CisjZGVmaW5lIFJFR19XUl9BRERSX3RpbWVyX3J3X3dkX2N0cmwgNjQKKworLyogUmVnaXN0ZXIgcl93ZF9zdGF0LCBzY29wZSB0aW1lciwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBjbnQgOiA4OworICB1bnNpZ25lZCBpbnQgY21kIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDIzOworfSByZWdfdGltZXJfcl93ZF9zdGF0OworI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yX3dkX3N0YXQgNjgKKworLyogUmVnaXN0ZXIgcndfaW50cl9tYXNrLCBzY29wZSB0aW1lciwgdHlwZSBydyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgdG1yMCA6IDE7CisgIHVuc2lnbmVkIGludCB0bXIxIDogMTsKKyAgdW5zaWduZWQgaW50IGNudCAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZyA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyODsKK30gcmVnX3RpbWVyX3J3X2ludHJfbWFzazsKKyNkZWZpbmUgUkVHX1JEX0FERFJfdGltZXJfcndfaW50cl9tYXNrIDcyCisjZGVmaW5lIFJFR19XUl9BRERSX3RpbWVyX3J3X2ludHJfbWFzayA3MgorCisvKiBSZWdpc3RlciByd19hY2tfaW50ciwgc2NvcGUgdGltZXIsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IHRtcjAgOiAxOworICB1bnNpZ25lZCBpbnQgdG1yMSA6IDE7CisgIHVuc2lnbmVkIGludCBjbnQgIDogMTsKKyAgdW5zaWduZWQgaW50IHRyaWcgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMjg7Cit9IHJlZ190aW1lcl9yd19hY2tfaW50cjsKKyNkZWZpbmUgUkVHX1JEX0FERFJfdGltZXJfcndfYWNrX2ludHIgNzYKKyNkZWZpbmUgUkVHX1dSX0FERFJfdGltZXJfcndfYWNrX2ludHIgNzYKKworLyogUmVnaXN0ZXIgcl9pbnRyLCBzY29wZSB0aW1lciwgdHlwZSByICovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCB0bXIwIDogMTsKKyAgdW5zaWduZWQgaW50IHRtcjEgOiAxOworICB1bnNpZ25lZCBpbnQgY250ICA6IDE7CisgIHVuc2lnbmVkIGludCB0cmlnIDogMTsKKyAgdW5zaWduZWQgaW50IGR1bW15MSA6IDI4OworfSByZWdfdGltZXJfcl9pbnRyOworI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yX2ludHIgODAKKworLyogUmVnaXN0ZXIgcl9tYXNrZWRfaW50ciwgc2NvcGUgdGltZXIsIHR5cGUgciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgdG1yMCA6IDE7CisgIHVuc2lnbmVkIGludCB0bXIxIDogMTsKKyAgdW5zaWduZWQgaW50IGNudCAgOiAxOworICB1bnNpZ25lZCBpbnQgdHJpZyA6IDE7CisgIHVuc2lnbmVkIGludCBkdW1teTEgOiAyODsKK30gcmVnX3RpbWVyX3JfbWFza2VkX2ludHI7CisjZGVmaW5lIFJFR19SRF9BRERSX3RpbWVyX3JfbWFza2VkX2ludHIgODQKKworLyogUmVnaXN0ZXIgcndfdGVzdCwgc2NvcGUgdGltZXIsIHR5cGUgcncgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGRpcyA6IDE7CisgIHVuc2lnbmVkIGludCBlbiAgOiAxOworICB1bnNpZ25lZCBpbnQgZHVtbXkxIDogMzA7Cit9IHJlZ190aW1lcl9yd190ZXN0OworI2RlZmluZSBSRUdfUkRfQUREUl90aW1lcl9yd190ZXN0IDg4CisjZGVmaW5lIFJFR19XUl9BRERSX3RpbWVyX3J3X3Rlc3QgODgKKworCisvKiBDb25zdGFudHMgKi8KK2VudW0geworICByZWdrX3RpbWVyX2V4dCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwKKyAgcmVna190aW1lcl9mMTAwICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDcsCisgIHJlZ2tfdGltZXJfZjI5XzQ5MyAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA0LAorICByZWdrX3RpbWVyX2YzMiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNSwKKyAgcmVna190aW1lcl9mMzJfNzY4ICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDYsCisgIHJlZ2tfdGltZXJfaG9sZCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX3RpbWVyX2xkICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna190aW1lcl9ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfdGltZXJfb2ZmICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX3RpbWVyX3J1biAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMiwKKyAgcmVna190aW1lcl9yd19jbnRfY2ZnX2RlZmF1bHQgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfdGltZXJfcndfaW50cl9tYXNrX2RlZmF1bHQgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX3RpbWVyX3J3X291dF9kZWZhdWx0ICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna190aW1lcl9yd190ZXN0X2RlZmF1bHQgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfdGltZXJfcndfdG1yMF9jdHJsX2RlZmF1bHQgICAgICAgICAgPSAweDAwMDAwMDAwLAorICByZWdrX3RpbWVyX3J3X3RtcjFfY3RybF9kZWZhdWx0ICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna190aW1lcl9yd190cmlnX2NmZ19kZWZhdWx0ICAgICAgICAgICA9IDB4MDAwMDAwMDAsCisgIHJlZ2tfdGltZXJfc3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAxLAorICByZWdrX3RpbWVyX3N0b3AgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwKKyAgcmVna190aW1lcl90aW1lICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEsCisgIHJlZ2tfdGltZXJfdG1yMCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAorICByZWdrX3RpbWVyX3RtcjEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMywKKyAgcmVna190aW1lcl95ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEKK307CisjZW5kaWYgLyogX190aW1lcl9kZWZzX2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1mcy9waW5tdXguaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvbWFjaC1mcy9waW5tdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmIzMDM2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL3Bpbm11eC5oCkBAIC0wLDAgKzEsMzggQEAKKyNpZm5kZWYgX0FTTV9DUklTX0FSQ0hfUElOTVVYX0gKKyNkZWZpbmUgX0FTTV9DUklTX0FSQ0hfUElOTVVYX0gKKworI2RlZmluZSBQT1JUX0IgMAorI2RlZmluZSBQT1JUX0MgMQorI2RlZmluZSBQT1JUX0QgMgorI2RlZmluZSBQT1JUX0UgMworCitlbnVtIHBpbl9tb2RlIHsKKyAgcGlubXV4X25vbmUgPSAwLAorICBwaW5tdXhfZml4ZWQsCisgIHBpbm11eF9ncGlvLAorICBwaW5tdXhfaW9wCit9OworCitlbnVtIGZpeGVkX2Z1bmN0aW9uIHsKKyAgcGlubXV4X3NlcjEsCisgIHBpbm11eF9zZXIyLAorICBwaW5tdXhfc2VyMywKKyAgcGlubXV4X3NzZXIwLAorICBwaW5tdXhfc3NlcjEsCisgIHBpbm11eF9hdGEwLAorICBwaW5tdXhfYXRhMSwKKyAgcGlubXV4X2F0YTIsCisgIHBpbm11eF9hdGEzLAorICBwaW5tdXhfYXRhLAorICBwaW5tdXhfZXRoMSwKKyAgcGlubXV4X3RpbWVyCit9OworCitpbnQgY3Jpc3YzMl9waW5tdXhfaW5pdCh2b2lkKTsKK2ludCBjcmlzdjMyX3Bpbm11eF9hbGxvYyhpbnQgcG9ydCwgaW50IGZpcnN0X3BpbiwgaW50IGxhc3RfcGluLCBlbnVtIHBpbl9tb2RlKTsKK2ludCBjcmlzdjMyX3Bpbm11eF9hbGxvY19maXhlZChlbnVtIGZpeGVkX2Z1bmN0aW9uIGZ1bmN0aW9uKTsKK2ludCBjcmlzdjMyX3Bpbm11eF9kZWFsbG9jKGludCBwb3J0LCBpbnQgZmlyc3RfcGluLCBpbnQgbGFzdF9waW4pOworaW50IGNyaXN2MzJfcGlubXV4X2RlYWxsb2NfZml4ZWQoZW51bSBmaXhlZF9mdW5jdGlvbiBmdW5jdGlvbik7Cit2b2lkIGNyaXN2MzJfcGlubXV4X2R1bXAodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL3N0YXJ0dXAuaW5jIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9tYWNoLWZzL3N0YXJ0dXAuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMTBjY2IKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL21hY2gtZnMvc3RhcnR1cC5pbmMKQEAgLTAsMCArMSw3NyBAQAorI2luY2x1ZGUgPGh3cmVncy9hc20vcmVnX21hcF9hc20uaD4KKyNpbmNsdWRlIDxod3JlZ3MvYXNtL2JpZl9jb3JlX2RlZnNfYXNtLmg+CisjaW5jbHVkZSA8aHdyZWdzL2FzbS9naW9fZGVmc19hc20uaD4KKyNpbmNsdWRlIDxod3JlZ3MvYXNtL2NvbmZpZ19kZWZzX2FzbS5oPgorCisJLm1hY3JvIEdJT19JTklUCisJbW92ZS5kCUNPTkZJR19FVFJBWF9ERUZfR0lPX1BBX09VVCwgJHIwCisJbW92ZS5kCVJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3BhX2RvdXQpLCAkcjEKKwltb3ZlLmQJJHIwLCBbJHIxXQorCisJbW92ZS5kCUNPTkZJR19FVFJBWF9ERUZfR0lPX1BBX09FLCAkcjAKKwltb3ZlLmQJUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcndfcGFfb2UpLCAkcjEKKwltb3ZlLmQJJHIwLCBbJHIxXQorCisJbW92ZS5kCUNPTkZJR19FVFJBWF9ERUZfR0lPX1BCX09VVCwgJHIwCisJbW92ZS5kCVJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3BiX2RvdXQpLCAkcjEKKwltb3ZlLmQJJHIwLCBbJHIxXQorCisJbW92ZS5kCUNPTkZJR19FVFJBWF9ERUZfR0lPX1BCX09FLCAkcjAKKwltb3ZlLmQJUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcndfcGJfb2UpLCAkcjEKKwltb3ZlLmQJJHIwLCBbJHIxXQorCisJbW92ZS5kCUNPTkZJR19FVFJBWF9ERUZfR0lPX1BDX09VVCwgJHIwCisJbW92ZS5kCVJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3BjX2RvdXQpLCAkcjEKKwltb3ZlLmQJJHIwLCBbJHIxXQorCisJbW92ZS5kCUNPTkZJR19FVFJBWF9ERUZfR0lPX1BDX09FLCAkcjAKKwltb3ZlLmQJUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcndfcGNfb2UpLCAkcjEKKwltb3ZlLmQJJHIwLCBbJHIxXQorCisJbW92ZS5kCUNPTkZJR19FVFJBWF9ERUZfR0lPX1BEX09VVCwgJHIwCisJbW92ZS5kCVJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3BkX2RvdXQpLCAkcjEKKwltb3ZlLmQJJHIwLCBbJHIxXQorCisJbW92ZS5kCUNPTkZJR19FVFJBWF9ERUZfR0lPX1BEX09FLCAkcjAKKwltb3ZlLmQJUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcndfcGRfb2UpLCAkcjEKKwltb3ZlLmQJJHIwLCBbJHIxXQorCisJbW92ZS5kCUNPTkZJR19FVFJBWF9ERUZfR0lPX1BFX09VVCwgJHIwCisJbW92ZS5kCVJFR19BRERSKGdpbywgcmVnaV9naW8sIHJ3X3BlX2RvdXQpLCAkcjEKKwltb3ZlLmQJJHIwLCBbJHIxXQorCisJbW92ZS5kCUNPTkZJR19FVFJBWF9ERUZfR0lPX1BFX09FLCAkcjAKKwltb3ZlLmQJUkVHX0FERFIoZ2lvLCByZWdpX2dpbywgcndfcGVfb2UpLCAkcjEKKwltb3ZlLmQJJHIwLCBbJHIxXQorCS5lbmRtCisKKwkubWFjcm8gU1RBUlRfQ0xPQ0tTCisJbW92ZS5kIFJFR19BRERSKGNvbmZpZywgcmVnaV9jb25maWcsIHJ3X2Nsa19jdHJsKSwgJHIxCisJbW92ZS5kIFskcjFdLCAkcjAKKwlvci5kICAgUkVHX1NUQVRFKGNvbmZpZywgcndfY2xrX2N0cmwsIGNwdSwgeWVzKSB8IFwKKwkgICAgICAgUkVHX1NUQVRFKGNvbmZpZywgcndfY2xrX2N0cmwsIGJpZiwgeWVzKSB8IFwKKwkgICAgICAgUkVHX1NUQVRFKGNvbmZpZywgcndfY2xrX2N0cmwsIGZpeF9pbywgeWVzKSwgJHIwCisJbW92ZS5kICRyMCwgWyRyMV0KKwkuZW5kbQorCisJLm1hY3JvIFNFVFVQX1dBSVRfU1RBVEVTCisJOzsgU2V0IHVwIHdhaXRzdGF0ZXMgZXRjCisJbW92ZS5kICAgUkVHX0FERFIoYmlmX2NvcmUsIHJlZ2lfYmlmX2NvcmUsIHJ3X2dycDFfY2ZnKSwgJHIwCisJbW92ZS5kICAgQ09ORklHX0VUUkFYX01FTV9HUlAxX0NPTkZJRywgJHIxCisJbW92ZS5kICAgJHIxLCBbJHIwXQorCW1vdmUuZCAgIFJFR19BRERSKGJpZl9jb3JlLCByZWdpX2JpZl9jb3JlLCByd19ncnAyX2NmZyksICRyMAorCW1vdmUuZCAgIENPTkZJR19FVFJBWF9NRU1fR1JQMl9DT05GSUcsICRyMQorCW1vdmUuZCAgICRyMSwgWyRyMF0KKwltb3ZlLmQgICBSRUdfQUREUihiaWZfY29yZSwgcmVnaV9iaWZfY29yZSwgcndfZ3JwM19jZmcpLCAkcjAKKwltb3ZlLmQgICBDT05GSUdfRVRSQVhfTUVNX0dSUDNfQ09ORklHLCAkcjEKKwltb3ZlLmQgICAkcjEsIFskcjBdCisJbW92ZS5kICAgUkVHX0FERFIoYmlmX2NvcmUsIHJlZ2lfYmlmX2NvcmUsIHJ3X2dycDRfY2ZnKSwgJHIwCisJbW92ZS5kICAgQ09ORklHX0VUUkFYX01FTV9HUlA0X0NPTkZJRywgJHIxCisJbW92ZS5kICAgJHIxLCBbJHIwXQorI2lmZGVmIENPTkZJR19FVFJBWF9WQ1NfU0lNCisJOzsgU2V0IHVwIG1pbmltYWwgZmxhc2ggd2FpdHN0YXRlcworCW1vdmUuZCAwLCAkcjEwCisJbW92ZS5kIFJFR19BRERSKGJpZl9jb3JlLCByZWdpX2JpZl9jb3JlLCByd19ncnAxX2NmZyksICRyMTEKKwltb3ZlLmQgJHIxMCwgWyRyMTFdCisjZW5kaWYKKwkuZW5kbQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9vZmZzZXQuaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvb2Zmc2V0LmgKaW5kZXggNTk3NDE5Yi4uNDQ0MmM0YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9vZmZzZXQuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL29mZnNldC5oCkBAIC0yNyw3ICsyNyw3IEBACiAjZGVmaW5lIFRIUkVBRF91c3AgNCAvKiBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCwgdXNwKSAqLwogI2RlZmluZSBUSFJFQURfY2NzIDggLyogb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9zdHJ1Y3QsIGNjcykgKi8KIAotI2RlZmluZSBUQVNLX3BpZCAxNDkgLyogb2Zmc2V0b2Yoc3RydWN0IHRhc2tfc3RydWN0LCBwaWQpICovCisjZGVmaW5lIFRBU0tfcGlkIDE1MSAvKiBvZmZzZXRvZihzdHJ1Y3QgdGFza19zdHJ1Y3QsIHBpZCkgKi8KIAogI2RlZmluZSBMQ0xPTkVfVk0gMjU2IC8qIENMT05FX1ZNICovCiAjZGVmaW5lIExDTE9ORV9VTlRSQUNFRCA4Mzg4NjA4IC8qIENMT05FX1VOVFJBQ0VEICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvcGFnZS5oCmluZGV4IGZhNDU0ZmUuLjIwZjFiNDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvcGFnZS5oCkBAIC03LDExICs3LDExIEBACiAjZGVmaW5lIFBBR0VfT0ZGU0VUIEtTRUdfQwkvKiBrc2VnX2MgaXMgbWFwcGVkIHRvIHBoeXNpY2FsIHJhbS4gKi8KIAogLyoKLSAqIE1hY3JvcyB0byBjb252ZXJ0IGJldHdlZW4gcGh5c2ljYWwgYW5kIHZpcnR1YWwgYWRkcmVzc2VzLiBCeSBzdHJpcGlpbmcgYQorICogTWFjcm9zIHRvIGNvbnZlcnQgYmV0d2VlbiBwaHlzaWNhbCBhbmQgdmlydHVhbCBhZGRyZXNzZXMuIEJ5IHN0cmlwcGluZyBhCiAgKiBzZWxlY3RlZCBiaXQgaXQncyBwb3NzaWJsZSB0byBjb252ZXJ0IGJldHdlZW4gS1NFR194IGFuZCAweDQwMDAwMDAwIHdoZXJlIHRoZQogICogRFJBTSByZWFsbHkgcmVzaWRlcy4gRFJBTSBpcyB2aXJ0dWFsbHkgYXQgMHhjLgogICovCi0jaWZuZGVmIENPTkZJR19FVFJBWEZTX1NJTQorI2lmbmRlZiBDT05GSUdfRVRSQVhfVkNTX1NJTQogI2RlZmluZSBfX3BhKHgpICgodW5zaWduZWQgbG9uZykoeCkgJiAweDdmZmZmZmZmKQogI2RlZmluZSBfX3ZhKHgpICgodm9pZCAqKSgodW5zaWduZWQgbG9uZykoeCkgfCAweDgwMDAwMDAwKSkKICNlbHNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL3Bpbm11eC5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9waW5tdXguaAppbmRleCBhNjZkYzk5Li5iYjA5YmNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL3Bpbm11eC5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvcGlubXV4LmgKQEAgLTM0LDYgKzM0LDcgQEAKIGludCBjcmlzdjMyX3Bpbm11eF9hbGxvYyhpbnQgcG9ydCwgaW50IGZpcnN0X3BpbiwgaW50IGxhc3RfcGluLCBlbnVtIHBpbl9tb2RlKTsKIGludCBjcmlzdjMyX3Bpbm11eF9hbGxvY19maXhlZChlbnVtIGZpeGVkX2Z1bmN0aW9uIGZ1bmN0aW9uKTsKIGludCBjcmlzdjMyX3Bpbm11eF9kZWFsbG9jKGludCBwb3J0LCBpbnQgZmlyc3RfcGluLCBpbnQgbGFzdF9waW4pOworaW50IGNyaXN2MzJfcGlubXV4X2RlYWxsb2NfZml4ZWQoZW51bSBmaXhlZF9mdW5jdGlvbiBmdW5jdGlvbik7CiB2b2lkIGNyaXN2MzJfcGlubXV4X2R1bXAodm9pZCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvcHJvY2Vzc29yLmgKaW5kZXggNTU1M2IwYy4uZjgwYjQ3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL3Byb2Nlc3Nvci5oCkBAIC0yMyw3ICsyMyw3IEBACiAgKiBVc2VyLXNwYWNlIHByb2Nlc3Mgc2l6ZS4gVGhpcyBpcyBoYXJkY29kZWQgaW50byBhIGZldyBwbGFjZXMsIHNvIGRvbid0CiAgKiBjaGFuZ2VkIGl0IHVubGVzcyBldmVyeXRoaW5nJ3MgY2xlYXIhCiAgKi8KLSNpZm5kZWYgQ09ORklHX0VUUkFYRlNfU0lNCisjaWZuZGVmIENPTkZJR19FVFJBWF9WQ1NfU0lNCiAjZGVmaW5lIFRBU0tfU0laRQkoMHhCMDAwMDAwMFVMKQogI2Vsc2UKICNkZWZpbmUgVEFTS19TSVpFCSgweEEwMDAwMDAwVUwpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL3NwaW5sb2NrLmggYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL3NwaW5sb2NrLmgKaW5kZXggNWY0M2RmMC4uMGQ1NzA5YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9zcGlubG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvc3BpbmxvY2suaApAQCAtMSw0MCArMSw0NyBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX1NQSU5MT0NLX0gKICNkZWZpbmUgX19BU01fQVJDSF9TUElOTE9DS19ICiAKLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2tfdHlwZXMuaD4KIAogI2RlZmluZSBSV19MT0NLX0JJQVMgMHgwMTAwMDAwMAotI2RlZmluZSBTUElOX0xPQ0tfVU5MT0NLRUQgKHNwaW5sb2NrX3QpIHsgMSB9Ci0jZGVmaW5lIHNwaW5fbG9ja19pbml0KHgpCWRvIHsgKih4KSA9IFNQSU5fTE9DS19VTkxPQ0tFRDsgfSB3aGlsZSgwKQotCi0jZGVmaW5lIHNwaW5faXNfbG9ja2VkKHgpCSgqKHZvbGF0aWxlIHNpZ25lZCBjaGFyICopKCYoeCktPmxvY2spIDw9IDApCi0jZGVmaW5lIHNwaW5fdW5sb2NrX3dhaXQoeCkJZG8geyBiYXJyaWVyKCk7IH0gd2hpbGUoc3Bpbl9pc19sb2NrZWQoeCkpCiAKIGV4dGVybiB2b2lkIGNyaXNfc3Bpbl91bmxvY2sodm9pZCAqbCwgaW50IHZhbCk7CiBleHRlcm4gdm9pZCBjcmlzX3NwaW5fbG9jayh2b2lkICpsKTsKLWV4dGVybiBpbnQgY3Jpc19zcGluX3RyeWxvY2sodm9pZCogbCk7CitleHRlcm4gaW50IGNyaXNfc3Bpbl90cnlsb2NrKHZvaWQgKmwpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19zcGluX3VubG9jayhzcGlubG9ja190ICpsb2NrKQorc3RhdGljIGlubGluZSBpbnQgX19yYXdfc3Bpbl9pc19sb2NrZWQocmF3X3NwaW5sb2NrX3QgKngpCit7CisJcmV0dXJuICoodm9sYXRpbGUgc2lnbmVkIGNoYXIgKikoJih4KS0+c2xvY2spIDw9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX3VubG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKIHsKIAlfX2FzbV9fIHZvbGF0aWxlICgibW92ZS5kICUxLCUwIiBcCi0JICAgICAgICAgICAgICAgICAgOiAiPW0iIChsb2NrLT5sb2NrKSBcCisJCQkgIDogIj1tIiAobG9jay0+c2xvY2spIFwKIAkJCSAgOiAiciIgKDEpIFwKIAkJCSAgOiAibWVtb3J5Iik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IF9yYXdfc3Bpbl90cnlsb2NrKHNwaW5sb2NrX3QgKmxvY2spCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl91bmxvY2tfd2FpdChyYXdfc3BpbmxvY2tfdCAqbG9jaykKIHsKLQlyZXR1cm4gY3Jpc19zcGluX3RyeWxvY2soKHZvaWQqKSZsb2NrLT5sb2NrKTsKKwl3aGlsZSAoX19yYXdfc3Bpbl9pc19sb2NrZWQobG9jaykpCisJCWNwdV9yZWxheCgpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX3Jhd19zcGluX2xvY2soc3BpbmxvY2tfdCAqbG9jaykKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3NwaW5fdHJ5bG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKIHsKLQljcmlzX3NwaW5fbG9jaygodm9pZCopJmxvY2stPmxvY2spOworCXJldHVybiBjcmlzX3NwaW5fdHJ5bG9jaygodm9pZCAqKSZsb2NrLT5zbG9jayk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfcmF3X3NwaW5fbG9ja19mbGFncyAoc3BpbmxvY2tfdCAqbG9jaywgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX2xvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7Ci0gIF9yYXdfc3Bpbl9sb2NrKGxvY2spOworCWNyaXNfc3Bpbl9sb2NrKCh2b2lkICopJmxvY2stPnNsb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX3Jhd19zcGluX2xvY2tfZmxhZ3MocmF3X3NwaW5sb2NrX3QgKmxvY2ssIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJX19yYXdfc3Bpbl9sb2NrKGxvY2spOwogfQogCiAvKgpAQCAtNDYsMTE5ICs1Myw3NCBAQAogICogY2FuICJtaXgiIGlycS1zYWZlIGxvY2tzIC0gYW55IHdyaXRlciBuZWVkcyB0byBnZXQgYQogICogaXJxLXNhZmUgd3JpdGUtbG9jaywgYnV0IHJlYWRlcnMgY2FuIGdldCBub24taXJxc2FmZQogICogcmVhZC1sb2Nrcy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCXNwaW5sb2NrX3QgbG9jazsKLQl2b2xhdGlsZSBpbnQgY291bnRlcjsKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotCXVuc2lnbmVkIGludCBicmVha19sb2NrOwotI2VuZGlmCi19IHJ3bG9ja190OwotCi0jZGVmaW5lIFJXX0xPQ0tfVU5MT0NLRUQgKHJ3bG9ja190KSB7IHsxfSwgMCB9Ci0KLSNkZWZpbmUgcndsb2NrX2luaXQobHApCWRvIHsgKihscCkgPSBSV19MT0NLX1VOTE9DS0VEOyB9IHdoaWxlICgwKQotCi0vKioKLSAqIHJlYWRfY2FuX2xvY2sgLSB3b3VsZCByZWFkX3RyeWxvY2soKSBzdWNjZWVkPwotICogQGxvY2s6IHRoZSByd2xvY2sgaW4gcXVlc3Rpb24uCi0gKi8KLSNkZWZpbmUgcmVhZF9jYW5fbG9jayh4KSAoKGludCkoeCktPmNvdW50ZXIgPj0gMCkKLQotLyoqCi0gKiB3cml0ZV9jYW5fbG9jayAtIHdvdWxkIHdyaXRlX3RyeWxvY2soKSBzdWNjZWVkPwotICogQGxvY2s6IHRoZSByd2xvY2sgaW4gcXVlc3Rpb24uCi0gKi8KLSNkZWZpbmUgd3JpdGVfY2FuX2xvY2soeCkgKCh4KS0+Y291bnRlciA9PSAwKQotCi0jZGVmaW5lIF9yYXdfcmVhZF90cnlsb2NrKGxvY2spIGdlbmVyaWNfcmF3X3JlYWRfdHJ5bG9jayhsb2NrKQotCi0vKiByZWFkX2xvY2ssIHJlYWRfdW5sb2NrIGFyZSBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkLiAgT2YgY291cnNlIGl0IHNvbWVob3cKLSAqIHN1Y2tzIHdlIGVuZCB1cCBzYXZpbmcvcmVzdG9yaW5nIGZsYWdzIHR3aWNlIGZvciByZWFkX2xvY2tfaXJxc2F2ZSBhc28uICovCi0KLXN0YXRpYyAgX19pbmxpbmVfXyB2b2lkIF9yYXdfcmVhZF9sb2NrKHJ3bG9ja190ICpydykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlfcmF3X3NwaW5fbG9jaygmcnctPmxvY2spOwotCi0JcnctPmNvdW50ZXIrKzsKLQotCV9yYXdfc3Bpbl91bmxvY2soJnJ3LT5sb2NrKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyAgX19pbmxpbmVfXyB2b2lkIF9yYXdfcmVhZF91bmxvY2socndsb2NrX3QgKnJ3KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCV9yYXdfc3Bpbl9sb2NrKCZydy0+bG9jayk7Ci0KLQlydy0+Y291bnRlci0tOwotCi0JX3Jhd19zcGluX3VubG9jaygmcnctPmxvY2spOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotLyogd3JpdGVfbG9jayBpcyBsZXNzIHRyaXZpYWwuICBXZSBvcHRpbWlzdGljYWxseSBncmFiIHRoZSBsb2NrIGFuZCBjaGVjawotICogaWYgd2Ugc3VycHJpc2VkIGFueSByZWFkZXJzLiAgSWYgc28gd2UgcmVsZWFzZSB0aGUgbG9jayBhbmQgd2FpdCB0aWxsCi0gKiB0aGV5J3JlIGFsbCBnb25lIGJlZm9yZSB0cnlpbmcgYWdhaW4KICAqCi0gKiBBbHNvIG5vdGUgdGhhdCB3ZSBkb24ndCB1c2UgdGhlIF9pcnFzYXZlIC8gX2lycXJlc3RvcmUgc3VmZml4ZXMgaGVyZS4KLSAqIElmIHdlJ3JlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZW5hYmxlZCBhbmQgd2UndmUgZ290IHJlYWRlcnMgKG9yIG90aGVyCi0gKiB3cml0ZXJzKSBpbiBpbnRlcnJ1cHQgaGFuZGxlcnMgc29tZW9uZSBmdWNrZWQgdXAgYW5kIHdlJ2QgZGVhZC1sb2NrCi0gKiBzb29uZXIgb3IgbGF0ZXIgYW55d2F5LiAgIHBydW1wZiAqLworICovCiAKLXN0YXRpYyAgX19pbmxpbmVfXyB2b2lkIF9yYXdfd3JpdGVfbG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd19yZWFkX2Nhbl9sb2NrKHJhd19yd2xvY2tfdCAqeCkKIHsKLXJldHJ5OgotCV9yYXdfc3Bpbl9sb2NrKCZydy0+bG9jayk7Ci0KLQlpZihydy0+Y291bnRlciAhPSAwKSB7Ci0JCS8qIHRoaXMgYmFzaWNhbGx5IG5ldmVyIGhhcHBlbnMgKi8KLQkJX3Jhd19zcGluX3VubG9jaygmcnctPmxvY2spOwotCi0JCXdoaWxlKHJ3LT5jb3VudGVyICE9IDApOwotCi0JCWdvdG8gcmV0cnk7Ci0JfQotCi0JLyogZ290IGl0LiAgbm93IGxlYXZlIHdpdGhvdXQgdW5sb2NraW5nICovCi0JcnctPmNvdW50ZXIgPSAtMTsgLyogcmVtZW1iZXIgd2UgYXJlIGxvY2tlZCAqLworCXJldHVybiAoaW50KSh4KS0+bG9jayA+IDA7CiB9CiAKLS8qIHdyaXRlX3VubG9jayBpcyBhYnNvbHV0ZWx5IHRyaXZpYWwgLSB3ZSBkb24ndCBoYXZlIHRvIHdhaXQgZm9yIGFueXRoaW5nICovCi0KLXN0YXRpYyAgX19pbmxpbmVfXyB2b2lkIF9yYXdfd3JpdGVfdW5sb2NrKHJ3bG9ja190ICpydykKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3dyaXRlX2Nhbl9sb2NrKHJhd19yd2xvY2tfdCAqeCkKIHsKLQlydy0+Y291bnRlciA9IDA7Ci0JX3Jhd19zcGluX3VubG9jaygmcnctPmxvY2spOworCXJldHVybiAoeCktPmxvY2sgPT0gUldfTE9DS19CSUFTOwogfQogCi1zdGF0aWMgIF9faW5saW5lX18gaW50IF9yYXdfd3JpdGVfdHJ5bG9jayhyd2xvY2tfdCAqcncpCitzdGF0aWMgIGlubGluZSB2b2lkIF9fcmF3X3JlYWRfbG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewotCV9yYXdfc3Bpbl9sb2NrKCZydy0+bG9jayk7Ci0JaWYgKHJ3LT5jb3VudGVyICE9IDApIHsKLQkJLyogdGhpcyBiYXNpY2FsbHkgbmV2ZXIgaGFwcGVucyAqLwotCQlfcmF3X3NwaW5fdW5sb2NrKCZydy0+bG9jayk7CisJX19yYXdfc3Bpbl9sb2NrKCZydy0+c2xvY2spOworCXdoaWxlIChydy0+bG9jayA9PSAwKTsKKwlydy0+bG9jay0tOworCV9fcmF3X3NwaW5fdW5sb2NrKCZydy0+c2xvY2spOworfQogCi0JCXJldHVybiAwOworc3RhdGljICBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZV9sb2NrKHJhd19yd2xvY2tfdCAqcncpCit7CisJX19yYXdfc3Bpbl9sb2NrKCZydy0+c2xvY2spOworCXdoaWxlIChydy0+bG9jayAhPSBSV19MT0NLX0JJQVMpOworCXJ3LT5sb2NrID09IDA7CisJX19yYXdfc3Bpbl91bmxvY2soJnJ3LT5zbG9jayk7Cit9CisKK3N0YXRpYyAgaW5saW5lIHZvaWQgX19yYXdfcmVhZF91bmxvY2socmF3X3J3bG9ja190ICpydykKK3sKKwlfX3Jhd19zcGluX2xvY2soJnJ3LT5zbG9jayk7CisJcnctPmxvY2srKzsKKwlfX3Jhd19zcGluX3VubG9jaygmcnctPnNsb2NrKTsKK30KKworc3RhdGljICBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZV91bmxvY2socmF3X3J3bG9ja190ICpydykKK3sKKwlfX3Jhd19zcGluX2xvY2soJnJ3LT5zbG9jayk7CisJd2hpbGUgKHJ3LT5sb2NrICE9IFJXX0xPQ0tfQklBUyk7CisJcnctPmxvY2sgPT0gUldfTE9DS19CSUFTOworCV9fcmF3X3NwaW5fdW5sb2NrKCZydy0+c2xvY2spOworfQorCitzdGF0aWMgIGlubGluZSBpbnQgX19yYXdfcmVhZF90cnlsb2NrKHJhd19yd2xvY2tfdCAqcncpCit7CisJaW50IHJldCA9IDA7CisJX19yYXdfc3Bpbl9sb2NrKCZydy0+c2xvY2spOworCWlmIChydy0+bG9jayAhPSAwKSB7CisJCXJ3LT5sb2NrLS07CisJCXJldCA9IDE7CiAJfQorCV9fcmF3X3NwaW5fdW5sb2NrKCZydy0+c2xvY2spOworCXJldHVybiByZXQ7Cit9CiAKLQkvKiBnb3QgaXQuICBub3cgbGVhdmUgd2l0aG91dCB1bmxvY2tpbmcgKi8KLQlydy0+Y291bnRlciA9IC0xOyAvKiByZW1lbWJlciB3ZSBhcmUgbG9ja2VkICovCitzdGF0aWMgIGlubGluZSBpbnQgX19yYXdfd3JpdGVfdHJ5bG9jayhyYXdfcndsb2NrX3QgKnJ3KQoreworCWludCByZXQgPSAwOworCV9fcmF3X3NwaW5fbG9jaygmcnctPnNsb2NrKTsKKwlpZiAocnctPmxvY2sgPT0gUldfTE9DS19CSUFTKSB7CisJCXJ3LT5sb2NrID09IDA7CisJCXJldCA9IDE7CisJfQorCV9fcmF3X3NwaW5fdW5sb2NrKCZydy0+c2xvY2spOwogCXJldHVybiAxOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgaXNfcmVhZF9sb2NrZWQocndsb2NrX3QgKnJ3KQotewotCXJldHVybiBydy0+Y291bnRlciA+IDA7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIGludCBpc193cml0ZV9sb2NrZWQocndsb2NrX3QgKnJ3KQotewotCXJldHVybiBydy0+Y291bnRlciA8IDA7Ci19CiAKICNkZWZpbmUgX3Jhd19zcGluX3JlbGF4KGxvY2spCWNwdV9yZWxheCgpCiAjZGVmaW5lIF9yYXdfcmVhZF9yZWxheChsb2NrKQljcHVfcmVsYXgoKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvc3lzdGVtLmgKaW5kZXggZDIwZTJkNi4uNmNhOTBmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL3N5c3RlbS5oCkBAIC02NiwxMyArNjYsNCBAQAogI2RlZmluZSBsb2NhbF9pcnFfc2F2ZSh4KSBcCiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZlICRjY3MsICUwXG5cdGRpIiA6ICI9cm0iICh4KSA6IDogIm1lbW9yeSIpOwogCi0jaWZkZWYgQ09ORklHX1NNUAotdHlwZWRlZiBzdHJ1Y3QgewotCXZvbGF0aWxlIHVuc2lnbmVkIGludCBsb2NrIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDQpKSk7Ci0jaWZkZWYgQ09ORklHX1BSRUVNUFQKLQl1bnNpZ25lZCBpbnQgYnJlYWtfbG9jazsKLSNlbmRpZgotfSBzcGlubG9ja190OwotI2VuZGlmCi0KICNlbmRpZiAvKiBfQVNNX0NSSVNfQVJDSF9TWVNURU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi90aW1leC5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi90aW1leC5oCmluZGV4IDVhNGFhMjguLjI1OTFkM2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvdGltZXguaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL3RpbWV4LmgKQEAgLTEsOSArMSw5IEBACiAjaWZuZGVmIF9BU01fQ1JJU19BUkNIX1RJTUVYX0gKICNkZWZpbmUgX0FTTV9DUklTX0FSQ0hfVElNRVhfSAogCi0jaW5jbHVkZSA8YXNtL2FyY2gvaHdyZWdzL3JlZ19tYXAuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvcmVnX3Jkd3IuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9od3JlZ3MvdGltZXJfZGVmcy5oPgorI2luY2x1ZGUgPGh3cmVncy9yZWdfbWFwLmg+CisjaW5jbHVkZSA8aHdyZWdzL3JlZ19yZHdyLmg+CisjaW5jbHVkZSA8aHdyZWdzL3RpbWVyX2RlZnMuaD4KIAogLyoKICAqIFRoZSBjbG9jayBydW5zIGF0IDEwME1Ieiwgd2UgZGl2aWRlIGl0IGJ5IDEwMDAwMDAuIElmIHlvdSBjaGFuZ2UgYW55dGhpbmcKQEAgLTE4LDcgKzE4LDcgQEAKIAogLyogQ29udmVydCB0aGUgdmFsdWUgaW4gc3RlcCBvZiAxMCBucyB0byAxdXMgd2l0aG91dCBvdmVyZmxvdzogKi8KICNkZWZpbmUgR0VUX0pJRkZJRVNfVVNFQygpIFwKLSAgKCAoVElNRVIwX0RJViAtIFJFR19SRCh0aW1lciwgcmVnaV90aW1lciwgcl90bXIwX2RhdGEpKSAvMTAwICkKKwkoKFRJTUVSMF9ESVYgLSBSRUdfUkQodGltZXIsIHJlZ2lfdGltZXIwLCByX3RtcjBfZGF0YSkpIC8gMTAwKQogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfbnNfaW5famlmZmllKHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tY3Jpcy9hcmNoLXYzMi91bmlzdGQuaAppbmRleCA1ZDM2OWQ0Li4wMDUxMTE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL2FyY2gtdjMyL3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYXJjaC12MzIvdW5pc3RkLmgKQEAgLTE2LDcgKzE2LDggQEAKIAkJCSIuZW5kaWZcblx0IiBcCiAJCQkiYnJlYWsgMTMiIFwKIAkJCTogIj1yIiAoX19hKSBcCi0JCQk6ICJyIiAoX19uXykpOyBcCisJCQk6ICJyIiAoX19uXykgXAorCQkJOiAibWVtb3J5Iik7IFwKICAgaWYgKF9fYSA+PSAwKSBcCiAgICAgIHJldHVybiAodHlwZSkgX19hOyBcCiAgIGVycm5vID0gLV9fYTsgXApAQCAtMzMsNyArMzQsOCBAQAogCQkJIi5lbmRpZlxuXHQiIFwKIAkJCSJicmVhayAxMyIgXAogCQkJOiAiPXIiIChfX2EpIFwKLQkJCTogInIiIChfX25fKSwgIjAiIChfX2EpKTsgXAorCQkJOiAiciIgKF9fbl8pLCAiMCIgKF9fYSkgXAorCQkJOiAibWVtb3J5Iik7IFwKICAgaWYgKF9fYSA+PSAwKSBcCiAgICAgIHJldHVybiAodHlwZSkgX19hOyBcCiAgIGVycm5vID0gLV9fYTsgXApAQCAtNTEsNyArNTMsOCBAQAogCQkJIi5lbmRpZlxuXHQiIFwKIAkJCSJicmVhayAxMyIgXAogCQkJOiAiPXIiIChfX2EpIFwKLQkJCTogInIiIChfX25fKSwgIjAiIChfX2EpLCAiciIgKF9fYikpOyBcCisJCQk6ICJyIiAoX19uXyksICIwIiAoX19hKSwgInIiIChfX2IpIFwKKwkJCTogIm1lbW9yeSIpOyBcCiAgIGlmIChfX2EgPj0gMCkgXAogICAgICByZXR1cm4gKHR5cGUpIF9fYTsgXAogICBlcnJubyA9IC1fX2E7IFwKQEAgLTcwLDcgKzczLDggQEAKIAkJCSIuZW5kaWZcblx0IiBcCiAJCQkiYnJlYWsgMTMiIFwKIAkJCTogIj1yIiAoX19hKSBcCi0JCQk6ICJyIiAoX19uXyksICIwIiAoX19hKSwgInIiIChfX2IpLCAiciIgKF9fYykpOyBcCisJCQk6ICJyIiAoX19uXyksICIwIiAoX19hKSwgInIiIChfX2IpLCAiciIgKF9fYykgXAorCQkJOiAibWVtb3J5Iik7IFwKICAgaWYgKF9fYSA+PSAwKSBcCiAgICAgIHJldHVybiAodHlwZSkgX19hOyBcCiAgIGVycm5vID0gLV9fYTsgXApAQCAtOTEsNyArOTUsOCBAQAogCQkJImJyZWFrIDEzIiBcCiAJCQk6ICI9ciIgKF9fYSkgXAogCQkJOiAiciIgKF9fbl8pLCAiMCIgKF9fYSksICJyIiAoX19iKSwgXAotCQkJICAiciIgKF9fYyksICJyIiAoX19kKSk7IFwKKwkJCSAgInIiIChfX2MpLCAiciIgKF9fZClcCisJCQk6ICJtZW1vcnkiKTsgXAogICBpZiAoX19hID49IDApIFwKICAgICAgcmV0dXJuICh0eXBlKSBfX2E7IFwKICAgZXJybm8gPSAtX19hOyBcCkBAIC0xMTQsNyArMTE5LDggQEAKIAkJCSJicmVhayAxMyIgXAogCQkJOiAiPXIiIChfX2EpIFwKIAkJCTogInIiIChfX25fKSwgIjAiIChfX2EpLCAiciIgKF9fYiksIFwKLQkJCSAgInIiIChfX2MpLCAiciIgKF9fZCksICJoIiAoX19lKSk7IFwKKwkJCSAgInIiIChfX2MpLCAiciIgKF9fZCksICJoIiAoX19lKSBcCisJCQk6ICJtZW1vcnkiKTsgXAogICBpZiAoX19hID49IDApIFwKICAgICAgcmV0dXJuICh0eXBlKSBfX2E7IFwKICAgZXJybm8gPSAtX19hOyBcCkBAIC0xMzgsNyArMTQ0LDggQEAKIAkJCSJicmVhayAxMyIgXAogCQkJOiAiPXIiIChfX2EpIFwKIAkJCTogInIiIChfX25fKSwgIjAiIChfX2EpLCAiciIgKF9fYiksIFwKLQkJCSAgInIiIChfX2MpLCAiciIgKF9fZCksICJoIiAoX19lKSwgIngiIChfX2YpKTsgXAorCQkJICAiciIgKF9fYyksICJyIiAoX19kKSwgImgiIChfX2UpLCAieCIgKF9fZikgXAorCQkJOiAibWVtb3J5Iik7IFwKICAgaWYgKF9fYSA+PSAwKSBcCiAgICAgIHJldHVybiAodHlwZSkgX19hOyBcCiAgIGVycm5vID0gLV9fYTsgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLWNyaXMvYXRvbWljLmgKaW5kZXggMjk0OWE5NC4uNWZjODc3NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9hdG9taWMuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2F0b21pYy5oCkBAIC05MSw3ICs5MSw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0dmFsOwogCWNyaXNfYXRvbWljX3NhdmUodiwgZmxhZ3MpOwotCXJldHZhbCA9ICh2LT5jb3VudGVyKSsrOworCXJldHZhbCA9ICsrKHYtPmNvdW50ZXIpOwogCWNyaXNfYXRvbWljX3Jlc3RvcmUodiwgZmxhZ3MpOwogCXJldHVybiByZXR2YWw7CiB9CkBAIC0xMDEsNyArMTAxLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXR2YWw7CiAJY3Jpc19hdG9taWNfc2F2ZSh2LCBmbGFncyk7Ci0JcmV0dmFsID0gKHYtPmNvdW50ZXIpLS07CisJcmV0dmFsID0gLS0odi0+Y291bnRlcik7CiAJY3Jpc19hdG9taWNfcmVzdG9yZSh2LCBmbGFncyk7CiAJcmV0dXJuIHJldHZhbDsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvYXhpc2ZsYXNobWFwLmggYi9pbmNsdWRlL2FzbS1jcmlzL2F4aXNmbGFzaG1hcC5oCmluZGV4IDdhOGQzMTEuLjAxNWNhNTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvYXhpc2ZsYXNobWFwLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9heGlzZmxhc2htYXAuaApAQCAtMTAsMjMgKzEwLDIzIEBACiAgKi8KIAogI2RlZmluZSBQQVJUSVRJT05fVEFCTEVfT0ZGU0VUIDEwCi0jZGVmaW5lIFBBUlRJVElPTl9UQUJMRV9NQUdJQyAweGJlZWYgLyogTm90IGEgZ29vZCBtYWdpYyAqLworI2RlZmluZSBQQVJUSVRJT05fVEFCTEVfTUFHSUMgMHhiZWVmCS8qIE5vdCBhIGdvb2QgbWFnaWMgKi8KIAogLyogVGhlIHBhcnRpdGlvbnRhYmxlX2hlYWQgaXMgbG9jYXRlZCBhdCBvZmZzZXQgKzEwOiAqLwogc3RydWN0IHBhcnRpdGlvbnRhYmxlX2hlYWQgewotCV9fdTE2IG1hZ2ljOyAvKiBQQVJUSVRJT05fVEFCTEVfTUFHSUMgKi8gCi0JX191MTYgc2l6ZTsgIC8qIExlbmd0aCBvZiBwdGFibGUgYmxvY2sgKG5vdCBoZWFkZXIpICovCi0JX191MzIgY2hlY2tzdW07IC8qIHNpbXBsZSBsb25nd29yZCBzdW0gKi8KKwlfX3UxNiBtYWdpYzsJLyogUEFSVElUSU9OX1RBQkxFX01BR0lDICovCisJX191MTYgc2l6ZTsJLyogTGVuZ3RoIG9mIHB0YWJsZSBibG9jayAoZW50cmllcyArIGVuZCBtYXJrZXIpICovCisJX191MzIgY2hlY2tzdW07CS8qIHNpbXBsZSBsb25nd29yZCBzdW0sIG92ZXIgZW50cmllcyArIGVuZCBtYXJrZXIgICovCiB9OwogCiAvKiBBbmQgZm9sbG93ZWQgYnkgcGFydGl0aW9uIHRhYmxlIGVudHJpZXMgKi8KIHN0cnVjdCBwYXJ0aXRpb250YWJsZV9lbnRyeSB7Ci0JX191MzIgb2Zmc2V0OyAgIC8qIE9mZnNldCBpcyByZWxhdGl2ZSB0byB0aGUgc2VjdG9yIHRoZSBwdGFibGUgaXMgaW4gKi8KLQlfX3UzMiBzaXplOwotCV9fdTMyIGNoZWNrc3VtOyAvKiBzaW1wbGUgbG9uZ3dvcmQgc3VtICovCi0JX191MTYgdHlwZTsKLQlfX3UxNiBmbGFnczsgICAvKiBiaXQgMDogcm8vcncgPSAxLzAgKi8KLQlfX3UzMiBmdXR1cmUwOyAvKiAxNiBieXRlcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworCV9fdTMyIG9mZnNldDsJCS8qIHJlbGF0aXZlIHRvIHRoZSBzZWN0b3IgdGhlIHB0YWJsZSBpcyBpbiAqLworCV9fdTMyIHNpemU7CQkvKiBpbiBieXRlcyAqLworCV9fdTMyIGNoZWNrc3VtOwkJLyogc2ltcGxlIGxvbmd3b3JkIHN1bSAqLworCV9fdTE2IHR5cGU7CQkvKiBzZWUgdHlwZSBjb2RlcyBiZWxvdyAqLworCV9fdTE2IGZsYWdzOwkJLyogYml0IDA6IHJvL3J3ID0gMS8wICovCisJX191MzIgZnV0dXJlMDsJCS8qIDE2IGJ5dGVzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCiAJX191MzIgZnV0dXJlMTsKIAlfX3UzMiBmdXR1cmUyOwogCV9fdTMyIGZ1dHVyZTM7CkBAIC0zNSwxMiArMzUsMjcgQEAKICNkZWZpbmUgUEFSVElUSU9OVEFCTEVfRU5EX01BUktFUiAweEZGRkZGRkZGCiAjZGVmaW5lIFBBUlRJVElPTlRBQkxFX0VORF9NQVJLRVJfU0laRSA0CiAKLS8qI2RlZmluZSBQQVJUSVRJT05fVFlQRV9SRVNDVUUgMHgwMDAwPyovICAvKiBOb3QgdXNlZCwgbWF5YmUgaXQgc2hvdWxkPyAqLworI2RlZmluZSBQQVJUSVRJT05UQUJMRV9FTkRfUEFECTEwCisKKy8qIENvbXBsZXRlIHN0cnVjdHVyZSBmb3Igd2hvbGUgcGFydGl0aW9uIHRhYmxlICovCisvKiBub3RlIHRoYXQgdGFibGUgbWF5IGVuZCBiZWZvcmUgQ09ORklHX0VUUkFYX1BUQUJMRV9FTlRSSUVTIGJ5IHNldHRpbmcKKyAqIG9mZnNldCBvZiB0aGUgbGFzdCBlbnRyeSArIDEgdG8gUEFSVElUSU9OVEFCTEVfRU5EX01BUktFUi4KKyAqLworc3RydWN0IHBhcnRpdGlvbnRhYmxlIHsKKwlfX3U4IHNraXBbUEFSVElUSU9OX1RBQkxFX09GRlNFVF07CisJc3RydWN0IHBhcnRpdGlvbnRhYmxlX2hlYWQgaGVhZDsKKwlzdHJ1Y3QgcGFydGl0aW9udGFibGVfZW50cnkgZW50cmllc1tdOworfTsKKwogI2RlZmluZSBQQVJUSVRJT05fVFlQRV9QQVJBTSAgMHgwMDAxCiAjZGVmaW5lIFBBUlRJVElPTl9UWVBFX0tFUk5FTCAweDAwMDIKICNkZWZpbmUgUEFSVElUSU9OX1RZUEVfSkZGUyAgIDB4MDAwMworI2RlZmluZSBQQVJUSVRJT05fVFlQRV9KRkZTMiAgMHgwMDAwCisKKyNkZWZpbmUJUEFSVElUSU9OX0ZMQUdTX1JFQURPTkxZX01BU0sJMHgwMDAxCisjZGVmaW5lCVBBUlRJVElPTl9GTEFHU19SRUFET05MWQkweDAwMDEKIAogLyogVGhlIG1hc3RlciBtdGQgZm9yIHRoZSBlbnRpcmUgZmxhc2guICovCi1leHRlcm4gc3RydWN0IG10ZF9pbmZvKiBheGlzZmxhc2hfbXRkOworZXh0ZXJuIHN0cnVjdCBtdGRfaW5mbyAqYXhpc2ZsYXNoX210ZDsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2J1Zy5oIGIvaW5jbHVkZS9hc20tY3Jpcy9idWcuaAppbmRleCA4ZGQ2YjIzLi5mZWUxMmQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL2J1Zy5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvYnVnLmgKQEAgLTEsNCArMSw0IEBACiAjaWZuZGVmIF9DUklTX0JVR19ICiAjZGVmaW5lIF9DUklTX0JVR19ICi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvYnVnLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYnVnLmg+CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvZGVsYXkuaCBiL2luY2x1ZGUvYXNtLWNyaXMvZGVsYXkuaAppbmRleCBkM2EzOTc4Li4xMjNlMTlhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL2RlbGF5LmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9kZWxheS5oCkBAIC0xMywxMCArMTMsMTMgQEAKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9vcHNfcGVyX3VzZWM7IC8qIGFyY2gvY3Jpcy9tbS9pbml0LmMgKi8KIAorLyogTWF5IGJlIGRlZmluZWQgYnkgYXJjaC9kZWxheS5oLiAqLworI2lmbmRlZiB1ZGVsYXkKIHN0YXRpYyBpbmxpbmUgdm9pZCB1ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjcykKIHsKIAlfX2RlbGF5KHVzZWNzICogbG9vcHNfcGVyX3VzZWMpOwogfQorI2VuZGlmCiAKICNlbmRpZiAvKiBkZWZpbmVkKF9DUklTX0RFTEFZX0gpICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvYXNtLWNyaXMvZG1hLW1hcHBpbmcuaAppbmRleCA2NjJjZWE3Li5lZGM4ZDFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL2RtYS1tYXBwaW5nLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9kbWEtbWFwcGluZy5oCkBAIC0xNjQsMTYgKzE2NCw1IEBACiB7CiB9CiAKLSNkZWZpbmUgQVJDSF9IQVNfRE1BX0RFQ0xBUkVfQ09IRVJFTlRfTUVNT1JZCi1leHRlcm4gaW50Ci1kbWFfZGVjbGFyZV9jb2hlcmVudF9tZW1vcnkoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGJ1c19hZGRyLAotCQkJICAgIGRtYV9hZGRyX3QgZGV2aWNlX2FkZHIsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpOwotCi1leHRlcm4gdm9pZAotZG1hX3JlbGVhc2VfZGVjbGFyZWRfbWVtb3J5KHN0cnVjdCBkZXZpY2UgKmRldik7Ci0KLWV4dGVybiB2b2lkICoKLWRtYV9tYXJrX2RlY2xhcmVkX21lbW9yeV9vY2N1cGllZChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICBkbWFfYWRkcl90IGRldmljZV9hZGRyLCBzaXplX3Qgc2l6ZSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9lbGYuaCBiL2luY2x1ZGUvYXNtLWNyaXMvZWxmLmgKaW5kZXggOTZhNDBjMS4uMDAxZjY0YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9lbGYuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL2VsZi5oCkBAIC00NSw3ICs0NSw2IEBACiAjZGVmaW5lIEVMRl9EQVRBCUVMRkRBVEEyTFNCCiAjZGVmaW5lIEVMRl9BUkNICUVNX0NSSVMKIAotI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxhc20vYXJjaC9lbGYuaD4KIAogLyogVGhlIG1hc3RlciBmb3IgdGhlc2UgZGVmaW5pdGlvbnMgaXMge2JpbnV0aWxzfS9pbmNsdWRlL2VsZi9jcmlzLmg6ICAqLwpAQCAtOTEsNiArOTAsNCBAQAogCiAjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCwgaWJjczIpIHNldF9wZXJzb25hbGl0eSgoaWJjczIpP1BFUl9TVlI0OlBFUl9MSU5VWCkKIAotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2V0cmF4Z3Bpby5oIGIvaW5jbHVkZS9hc20tY3Jpcy9ldHJheGdwaW8uaAppbmRleCA1ZDAwMjhkLi4zOGYxYzhlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL2V0cmF4Z3Bpby5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvZXRyYXhncGlvLmgKQEAgLTEsMjUgKzEsMzQgQEAKLS8qICRJZDogZXRyYXhncGlvLmgsdiAxLjggMjAwMi8wNi8xNyAxNTo1MzowNyBqb2hhbmEgRXhwICQgKi8KIC8qCiAgKiBUaGUgZm9sbG93aW5nIGRldmljZXMgYXJlIGFjY2Vzc2FibGUgdXNpbmcgdGhpcyBkcml2ZXIgdXNpbmcKLSAqIEdQSU9fTUFKT1IgKDEyMCkgYW5kIGEgY291cGxlIG9mIG1pbm9yIG51bWJlcnM6Ci0gKiBGb3IgRVRSQVggMTAwTFggKEFSQ0hfVjEwKToKKyAqIEdQSU9fTUFKT1IgKDEyMCkgYW5kIGEgY291cGxlIG9mIG1pbm9yIG51bWJlcnMuCisgKgorICogRm9yIEVUUkFYIDEwMExYIChDT05GSUdfRVRSQVhfQVJDSF9WMTApOgogICogL2Rldi9ncGlvYSAgbWlub3IgMCwgOCBiaXQgR1BJTywgZWFjaCBiaXQgY2FuIGNoYW5nZSBkaXJlY3Rpb24KICAqIC9kZXYvZ3Bpb2IgIG1pbm9yIDEsIDggYml0IEdQSU8sIGVhY2ggYml0IGNhbiBjaGFuZ2UgZGlyZWN0aW9uCiAgKiAvZGV2L2xlZHMgICBtaW5vciAyLCBBY2Nlc3MgdG8gbGVkcyBkZXBlbmRpbmcgb24ga2VybmVsY29uZmlnCiAgKiAvZGV2L2dwaW9nICBtaW5vciAzCi0gICAgICAgICBnMGRpciwgZzhfMTVkaXIsIGcxNl8yM2RpciwgZzI0IGRpciBjb25maWd1cmFibGUgaW4gUl9HRU5fQ09ORklHCi0gICAgICAgICBnMS1nNyBhbmQgZzI1LWczMSBpcyBib3RoIGlucHV0IGFuZCBvdXRwdXRzIGJ1dCBvbiBkaWZmZXJlbnQgcGlucwotICAgICAgICAgQWxzbyBub3RlIHRoYXQgc29tZSBiaXRzIGNoYW5nZSBwaW5zIGRlcGVuZGluZyBvbiB3aGF0IGludGVyZmFjZXMgCi0gICAgICAgICBhcmUgZW5hYmxlZC4KKyAqICAgICAgIGcwZGlyLCBnOF8xNWRpciwgZzE2XzIzZGlyLCBnMjQgZGlyIGNvbmZpZ3VyYWJsZSBpbiBSX0dFTl9DT05GSUcKKyAqICAgICAgIGcxLWc3IGFuZCBnMjUtZzMxIGlzIGJvdGggaW5wdXQgYW5kIG91dHB1dHMgYnV0IG9uIGRpZmZlcmVudCBwaW5zCisgKiAgICAgICBBbHNvIG5vdGUgdGhhdCBzb21lIGJpdHMgY2hhbmdlIHBpbnMgZGVwZW5kaW5nIG9uIHdoYXQgaW50ZXJmYWNlcworICogICAgICAgYXJlIGVuYWJsZWQuCiAgKgotICoKLSAqIEZvciBFVFJBWCBGUyAoQVJDSF9WMzIpOgorICogRm9yIEVUUkFYIEZTIChDT05GSUdfRVRSQVhGUyk6CiAgKiAvZGV2L2dwaW9hICBtaW5vciAwLCAgOCBiaXQgR1BJTywgZWFjaCBiaXQgY2FuIGNoYW5nZSBkaXJlY3Rpb24KICAqIC9kZXYvZ3Bpb2IgIG1pbm9yIDEsIDE4IGJpdCBHUElPLCBlYWNoIGJpdCBjYW4gY2hhbmdlIGRpcmVjdGlvbgotICogL2Rldi9ncGlvYyAgbWlub3IgMiwgMTggYml0IEdQSU8sIGVhY2ggYml0IGNhbiBjaGFuZ2UgZGlyZWN0aW9uCi0gKiAvZGV2L2dwaW9kICBtaW5vciAzLCAxOCBiaXQgR1BJTywgZWFjaCBiaXQgY2FuIGNoYW5nZSBkaXJlY3Rpb24KLSAqIC9kZXYvZ3Bpb2UgIG1pbm9yIDQsIDE4IGJpdCBHUElPLCBlYWNoIGJpdCBjYW4gY2hhbmdlIGRpcmVjdGlvbgotICogL2Rldi9sZWRzICAgbWlub3IgNSwgQWNjZXNzIHRvIGxlZHMgZGVwZW5kaW5nIG9uIGtlcm5lbGNvbmZpZworICogL2Rldi9ncGlvYyAgbWlub3IgMywgMTggYml0IEdQSU8sIGVhY2ggYml0IGNhbiBjaGFuZ2UgZGlyZWN0aW9uCisgKiAvZGV2L2dwaW9kICBtaW5vciA0LCAxOCBiaXQgR1BJTywgZWFjaCBiaXQgY2FuIGNoYW5nZSBkaXJlY3Rpb24KKyAqIC9kZXYvZ3Bpb2UgIG1pbm9yIDUsIDE4IGJpdCBHUElPLCBlYWNoIGJpdCBjYW4gY2hhbmdlIGRpcmVjdGlvbgorICogL2Rldi9sZWRzICAgbWlub3IgMiwgQWNjZXNzIHRvIGxlZHMgZGVwZW5kaW5nIG9uIGtlcm5lbGNvbmZpZworICoKKyAqIEZvciBBUlRQRUMtMyAoQ09ORklHX0NSSVNfTUFDSF9BUlRQRUMzKToKKyAqIC9kZXYvZ3Bpb2EgIG1pbm9yIDAsICA4IGJpdCBHUElPLCBlYWNoIGJpdCBjYW4gY2hhbmdlIGRpcmVjdGlvbgorICogL2Rldi9ncGlvYiAgbWlub3IgMSwgMTggYml0IEdQSU8sIGVhY2ggYml0IGNhbiBjaGFuZ2UgZGlyZWN0aW9uCisgKiAvZGV2L2dwaW9jICBtaW5vciAzLCAxOCBiaXQgR1BJTywgZWFjaCBiaXQgY2FuIGNoYW5nZSBkaXJlY3Rpb24KKyAqIC9kZXYvZ3Bpb2QgIG1pbm9yIDQsIDE4IGJpdCBHUElPLCBlYWNoIGJpdCBjYW4gY2hhbmdlIGRpcmVjdGlvbgorICogL2Rldi9sZWRzICAgbWlub3IgMiwgQWNjZXNzIHRvIGxlZHMgZGVwZW5kaW5nIG9uIGtlcm5lbGNvbmZpZworICogL2Rldi9wd20wICAgbWlub3IgMTYsIFBXTSBjaGFubmVsIDAgb24gUEEzMAorICogL2Rldi9wd20xICAgbWlub3IgMTcsIFBXTSBjaGFubmVsIDEgb24gUEEzMQorICogL2Rldi9wd20yICAgbWlub3IgMTgsIFBXTSBjaGFubmVsIDIgb24gUEIyNgogICoKICAqLwogI2lmbmRlZiBfQVNNX0VUUkFYR1BJT19ICkBAIC0zNCw3ICs0Myw4IEBACiAjZGVmaW5lIEdQSU9fTUlOT1JfRyAzCiAjZGVmaW5lIEdQSU9fTUlOT1JfTEFTVCAzCiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfRVRSQVhfQVJDSF9WMzIKKworI2lmZGVmIENPTkZJR19FVFJBWEZTCiAjZGVmaW5lIEVUUkFYR1BJT19JT0NUWVBFIDQzCiAjZGVmaW5lIEdQSU9fTUlOT1JfQSAwCiAjZGVmaW5lIEdQSU9fTUlOT1JfQiAxCkBAIC00Miw4ICs1MiwzMiBAQAogI2RlZmluZSBHUElPX01JTk9SX0MgMwogI2RlZmluZSBHUElPX01JTk9SX0QgNAogI2RlZmluZSBHUElPX01JTk9SX0UgNQorI2lmZGVmIENPTkZJR19FVFJBWF9WSVJUVUFMX0dQSU8KKyNkZWZpbmUgR1BJT19NSU5PUl9WIDYKKyNkZWZpbmUgR1BJT19NSU5PUl9MQVNUIDYKKyNlbHNlCiAjZGVmaW5lIEdQSU9fTUlOT1JfTEFTVCA1CiAjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NSSVNfTUFDSF9BUlRQRUMzCisjZGVmaW5lIEVUUkFYR1BJT19JT0NUWVBFIDQzCisjZGVmaW5lIEdQSU9fTUlOT1JfQSAwCisjZGVmaW5lIEdQSU9fTUlOT1JfQiAxCisjZGVmaW5lIEdQSU9fTUlOT1JfTEVEUyAyCisjZGVmaW5lIEdQSU9fTUlOT1JfQyAzCisjZGVmaW5lIEdQSU9fTUlOT1JfRCA0CisjaWZkZWYgQ09ORklHX0VUUkFYX1ZJUlRVQUxfR1BJTworI2RlZmluZSBHUElPX01JTk9SX1YgNgorI2RlZmluZSBHUElPX01JTk9SX0xBU1QgNgorI2Vsc2UKKyNkZWZpbmUgR1BJT19NSU5PUl9MQVNUIDQKKyNlbmRpZgorI2RlZmluZSBHUElPX01JTk9SX1BXTTAgMTYKKyNkZWZpbmUgR1BJT19NSU5PUl9QV00xIDE3CisjZGVmaW5lIEdQSU9fTUlOT1JfUFdNMiAxOAorI2RlZmluZSBHUElPX01JTk9SX0xBU1RfUFdNIEdQSU9fTUlOT1JfUFdNMgorI2VuZGlmCiAKIC8qIHN1cHBvcnRlZCBpb2N0bCBfSU9DX05SJ3MgKi8KIApAQCAtNjMsNyArOTcsNyBAQAogCiAvKiBHUElPIGRpcmVjdGlvbiBpb2N0bCdzICovCiAjZGVmaW5lIElPX1JFQURESVIgICAgMHg4ICAvKiBSZWFkIGRpcmVjdGlvbiAwPWlucHV0IDE9b3V0cHV0ICAob2Jzb2xldGUpICovCi0jZGVmaW5lIElPX1NFVElOUFVUICAgMHg5ICAvKiBTZXQgZGlyZWN0aW9uIGZvciBiaXRzIHNldCwgMD11bmNoYW5nZWQgMT1pbnB1dCwgCisjZGVmaW5lIElPX1NFVElOUFVUICAgMHg5ICAvKiBTZXQgZGlyZWN0aW9uIGZvciBiaXRzIHNldCwgMD11bmNoYW5nZWQgMT1pbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgbWFzayB3aXRoIGN1cnJlbnQgaW5wdXRzIChvYnNvbGV0ZSkgKi8KICNkZWZpbmUgSU9fU0VUT1VUUFVUICAweEEgIC8qIFNldCBkaXJlY3Rpb24gZm9yIGJpdHMgc2V0LCAwPXVuY2hhbmdlZCAxPW91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgbWFzayB3aXRoIGN1cnJlbnQgb3V0cHV0cyAob2Jzb2xldGUpKi8KQEAgLTc3LDEzICsxMTEsMTMgQEAKICNkZWZpbmUgSU9fR0VUX1BXUl9CVCAweEUKIAogLyogQml0IHRvZ2dsaW5nIGluIGRyaXZlciBzZXR0aW5ncyAqLwotLyogYml0IHNldCBpbiBsb3cgYnl0ZTAgaXMgQ0xLIG1hc2sgKDB4MDBGRiksIAotICAgYml0IHNldCBpbiBieXRlMSBpcyBEQVRBIG1hc2sgICAgKDB4RkYwMCkgCisvKiBiaXQgc2V0IGluIGxvdyBieXRlMCBpcyBDTEsgbWFzayAoMHgwMEZGKSwKKyAgIGJpdCBzZXQgaW4gYnl0ZTEgaXMgREFUQSBtYXNrICAgICgweEZGMDApCiAgICBtc2IsIGRhdGFfbWFza1s3OjBdICwgY2xrX21hc2tbNzowXQogICovCi0jZGVmaW5lIElPX0NGR19XUklURV9NT0RFIDB4RiAKKyNkZWZpbmUgSU9fQ0ZHX1dSSVRFX01PREUgMHhGCiAjZGVmaW5lIElPX0NGR19XUklURV9NT0RFX1ZBTFVFKG1zYiwgZGF0YV9tYXNrLCBjbGtfbWFzaykgXAotICAoICgoKG1zYikmMSkgPDwgMTYpIHwgKCgoZGF0YV9tYXNrKSAmMHhGRikgPDwgOCkgfCAoKGNsa19tYXNrKSAmIDB4RkYpICkKKwkoICgoKG1zYikmMSkgPDwgMTYpIHwgKCgoZGF0YV9tYXNrKSAmMHhGRikgPDwgOCkgfCAoKGNsa19tYXNrKSAmIDB4RkYpICkKIAogLyogVGhlIGZvbGxvd2luZyA0IGlvY3RsJ3MgdGFrZSBhIHBvaW50ZXIgYXMgYXJndW1lbnQgYW5kIGhhbmRsZXMKICAqIDMyIGJpdCBwb3J0cyAocG9ydCBHKSBwcm9wZXJseS4KQEAgLTk4LDYgKzEzMiw0OCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKmFyZyB1cGRhdGVkIHdpdGggY3VycmVudCBvdXRwdXQgcGlucy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCisvKiBUaGUgZm9sbG93aW5nIGlvY3RsJ3MgYXJlIGFwcGxpY2FibGUgdG8gdGhlIFBXTSBjaGFubmVscyBvbmx5ICovCiAKKyNkZWZpbmUgSU9fUFdNX1NFVF9NT0RFICAgICAweDIwCisKK2VudW0gaW9fcHdtX21vZGUgeworCVBXTV9PRkYgPSAwLAkJLyogZGlzYWJsZWQsIGRlYWxsb2NhdGVkICovCisJUFdNX1NUQU5EQVJEID0gMSwJLyogMzkwIGtIeiwgZHV0eSBjeWNsZSAwLi4yNTUvMjU2ICovCisJUFdNX0ZBU1QgPSAyLAkJLyogdmFyaWFibGUgZnJlcSwgdy8gMTBucyBhY3RpdmUgcHVsc2UgbGVuICovCisJUFdNX1ZBUkZSRVEgPSAzCQkvKiBpbmRpdmlkdWFsbHkgY29uZmlndXJhYmxlIGhpZ2gvbG93IHBlcmlvZHMgKi8KK307CisKK3N0cnVjdCBpb19wd21fc2V0X21vZGUgeworCWVudW0gaW9fcHdtX21vZGUgbW9kZTsKK307CisKKy8qIE9ubHkgZm9yIG1vZGUgUFdNX1ZBUkZSRVEuIFBlcmlvZCBsby9oaWdoIHNldCBpbiBpbmNyZW1lbnRzIG9mIDEwbnMKKyAqIGZyb20gMTBucyAodmFsdWUgPSAwKSB0byA4MTkyMG5zICh2YWx1ZSA9IDgxOTEpCisgKiAoUmVzdWx0aW5nIGZyZXF1ZW5jaWVzIHJhbmdlIGZyb20gNTAgTUh6ICgxMG5zICsgMTBucykgZG93biB0bworICogNi4xIGtIeiAoODE5MjBucyArIDgxOTIwbnMpIGF0IDUwJSBkdXR5IGN5Y2xlLCB0byAxMi4yIGtIeiBhdCBtaW4vbWF4IGR1dHkKKyAqIGN5Y2xlICg4MTkyMCArIDEwbnMgb3IgMTBucyArIDgxOTIwbnMsIHJlc3BlY3RpdmVseSkuKQorICovCisjZGVmaW5lIElPX1BXTV9TRVRfUEVSSU9EICAgMHgyMQorCitzdHJ1Y3QgaW9fcHdtX3NldF9wZXJpb2QgeworCXVuc2lnbmVkIGludCBsbzsJCS8qIDAuLjgxOTEgKi8KKwl1bnNpZ25lZCBpbnQgaGk7CQkvKiAwLi44MTkxICovCit9OworCisvKiBPbmx5IGZvciBtb2RlcyBQV01fU1RBTkRBUkQgYW5kIFBXTV9GQVNULgorICogRm9yIFBXTV9TVEFOREFSRCwgc2V0IGR1dHkgY3ljbGUgb2YgMzkwIGtIeiBQV00gb3V0cHV0IHNpZ25hbCwgZnJvbQorICogMCAodmFsdWUgPSAwKSB0byAyNTUvMjU2ICh2YWx1ZSA9IDI1NSkuCisgKiBGb3IgUFdNX0ZBU1QsIHNldCBkdXR5IGN5Y2xlIG9mIFBXTSBvdXRwdXQgc2lnbmFsIGZyb20KKyAqIDAlICh2YWx1ZSA9IDApIHRvIDEwMCUgKHZhbHVlID0gMjU1KS4gT3V0cHV0IHNpZ25hbCBpbiB0aGlzIG1vZGUKKyAqIGlzIGEgMTBucyBwdWxzZSBzdXJyb3VuZGVkIGJ5IGEgaGlnaCBvciBsb3cgbGV2ZWwgZGVwZW5kaW5nIG9uIGR1dHkKKyAqIGN5Y2xlIChleGNlcHQgZm9yIDAlIGFuZCAxMDAlIHdoaWNoIHJlc3VsdCBpbiBhIGNvbnN0YW50IG91dHB1dCkuCisgKiBSZXN1bHRpbmcgb3V0cHV0IGZyZXF1ZW5jeSB2YXJpZXMgZnJvbSA1MCBNSHogYXQgNTAlIGR1dHkgY3ljbGUsCisgKiBkb3duIHRvIDM5MCBrSHogYXQgbWluL21heCBkdXR5IGN5Y2xlLgorICovCisjZGVmaW5lIElPX1BXTV9TRVRfRFVUWSAgICAgMHgyMgorCitzdHJ1Y3QgaW9fcHdtX3NldF9kdXR5IHsKKwlpbnQgZHV0eTsJCS8qIDAuLjI1NSAqLworfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL2lvLmggYi9pbmNsdWRlL2FzbS1jcmlzL2lvLmgKaW5kZXggZDE5NmRkNi4uYjg3Y2U2MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvaW8uaApAQCAtMTIyLDggKzEyMiw4IEBACiAjZGVmaW5lIG1lbWNweV90b2lvKGEsYixjKQltZW1jcHkoKHZvaWQgKikoYSksKGIpLChjKSkKIAogCi0vKiBUaGUgZm9sbG93aW5nIGlzIGp1bmsgbmVlZGVkIGZvciB0aGUgYXJjaC1pbmRlcGVuZGVudCBjb2RlIGJ1dCB3aGljaAotICogd2UgbmV2ZXIgdXNlIGluIHRoZSBDUklTIHBvcnQKKy8qIEkvTyBwb3J0IGFjY2Vzcy4gTm9ybWFsbHkgdGhlcmUgaXMgbm8gSS9PIHNwYWNlIG9uIENSSVMgYnV0IHdoZW4KKyAqIENhcmRidXMvUENJIGlzIGVuYWJsZWQgdGhlIHJlcXVlc3QgaXMgcGFzc2VkIHRocm91Z2ggdGhlIGJyaWRnZS4KICAqLwogCiAjZGVmaW5lIElPX1NQQUNFX0xJTUlUIDB4ZmZmZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9wYWdlLmggYi9pbmNsdWRlL2FzbS1jcmlzL3BhZ2UuaAppbmRleCBiODQzNTNlLi5jNDViYjFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL3BhZ2UuaApAQCAtMSw4ICsxLDYgQEAKICNpZm5kZWYgX0NSSVNfUEFHRV9ICiAjZGVmaW5lIF9DUklTX1BBR0VfSAogCi0jaWZkZWYgX19LRVJORUxfXwotCiAjaW5jbHVkZSA8YXNtL2FyY2gvcGFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnN0Lmg+CiAKQEAgLTI4LDYgKzI2LDcgQEAKIHR5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBwdGU7IH0gcHRlX3Q7CiB0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcGdkOyB9IHBnZF90OwogdHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBsb25nIHBncHJvdDsgfSBwZ3Byb3RfdDsKK3R5cGVkZWYgc3RydWN0IHBhZ2UgKnBndGFibGVfdDsKICNlbmRpZgogCiAjZGVmaW5lIHB0ZV92YWwoeCkJKCh4KS5wdGUpCkBAIC03NCw3ICs3Myw1IEBACiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbWVtb3J5X21vZGVsLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGFnZS5oPgogCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCiAjZW5kaWYgLyogX0NSSVNfUEFHRV9IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvcGFyYW0uaCBiL2luY2x1ZGUvYXNtLWNyaXMvcGFyYW0uaAppbmRleCBiMjQ5NzI2Li4wZTQ3OTk0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL3BhcmFtLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9wYXJhbS5oCkBAIC0zLDcgKzMsNyBAQAogCiAvKiBDdXJyZW50bHkgd2UgYXNzdW1lIHRoYXQgSFo9MTAwIGlzIGdvb2QgZm9yIENSSVMuICovCiAjaWZkZWYgX19LRVJORUxfXwotIyBkZWZpbmUgSFoJCTEwMAkJLyogSW50ZXJuYWwga2VybmVsIHRpbWVyIGZyZXF1ZW5jeSAqLworIyBkZWZpbmUgSFoJCUNPTkZJR19IWgkvKiBJbnRlcm5hbCBrZXJuZWwgdGltZXIgZnJlcXVlbmN5ICovCiAjIGRlZmluZSBVU0VSX0haCTEwMAkJLyogLi4gc29tZSB1c2VyIGludGVyZmFjZXMgYXJlIGluICJ0aWNrcyIgKi8KICMgZGVmaW5lIENMT0NLU19QRVJfU0VDCShVU0VSX0haKQkvKiBsaWtlIHRpbWVzKCkgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9wZ2FsbG9jLmggYi9pbmNsdWRlL2FzbS1jcmlzL3BnYWxsb2MuaAppbmRleCA4ZGRkNjZmLi5hMWJhNzYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL3BnYWxsb2MuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL3BnYWxsb2MuaApAQCAtNiw2ICs2LDcgQEAKIAogI2RlZmluZSBwbWRfcG9wdWxhdGVfa2VybmVsKG1tLCBwbWQsIHB0ZSkgcG1kX3NldChwbWQsIHB0ZSkKICNkZWZpbmUgcG1kX3BvcHVsYXRlKG1tLCBwbWQsIHB0ZSkgcG1kX3NldChwbWQsIHBhZ2VfYWRkcmVzcyhwdGUpKQorI2RlZmluZSBwbWRfcGd0YWJsZShwbWQpIHBtZF9wYWdlKHBtZCkKIAogLyoKICAqIEFsbG9jYXRlIGFuZCBmcmVlIHBhZ2UgdGFibGVzLgpAQCAtMjcsMTAgKzI4LDExIEBACiAgCXJldHVybiBwdGU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnB0ZV9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3N0YXRpYyBpbmxpbmUgcGd0YWJsZV90IHB0ZV9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKIAlzdHJ1Y3QgcGFnZSAqcHRlOwogCXB0ZSA9IGFsbG9jX3BhZ2VzKEdGUF9LRVJORUx8X19HRlBfUkVQRUFUfF9fR0ZQX1pFUk8sIDApOworCXBndGFibGVfcGFnZV9jdG9yKHB0ZSk7CiAJcmV0dXJuIHB0ZTsKIH0KIApAQCAtMzksMTMgKzQxLDE3IEBACiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXB0ZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwdGVfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHBhZ2UgKnB0ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdGVfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcGd0YWJsZV90IHB0ZSkKIHsKKwlwZ3RhYmxlX3BhZ2VfZHRvcihwdGUpOwogCV9fZnJlZV9wYWdlKHB0ZSk7CiB9CiAKLQotI2RlZmluZSBfX3B0ZV9mcmVlX3RsYih0bGIscHRlKSB0bGJfcmVtb3ZlX3BhZ2UoKHRsYiksKHB0ZSkpCisjZGVmaW5lIF9fcHRlX2ZyZWVfdGxiKHRsYixwdGUpCQkJCVwKK2RvIHsJCQkJCQkJXAorCXBndGFibGVfcGFnZV9kdG9yKHB0ZSk7CQkJCVwKKwl0bGJfcmVtb3ZlX3BhZ2UoKHRsYiksIHB0ZSk7CQkJXAorfSB3aGlsZSAoMCkKIAogI2RlZmluZSBjaGVja19wZ3RfY2FjaGUoKSAgICAgICAgICBkbyB7IH0gd2hpbGUgKDApCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tY3Jpcy9wZ3RhYmxlLmgKaW5kZXggNDE3ZjcxMS4uYTI2MDc1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9wZ3RhYmxlLmgKQEAgLTI0OSw3ICsyNDksNyBAQAogI2RlZmluZSBwdGVfdW5tYXAocHRlKSBkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIHB0ZV91bm1hcF9uZXN0ZWQocHRlKSBkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIHB0ZV9wZm4oeCkJCSgodW5zaWduZWQgbG9uZykoX192YSgoeCkucHRlKSkgPj4gUEFHRV9TSElGVCkKLSNkZWZpbmUgcGZuX3B0ZShwZm4sIHByb3QpCV9fcHRlKChfX3BhKChwZm4pIDw8IFBBR0VfU0hJRlQpKSB8IHBncHJvdF92YWwocHJvdCkpCisjZGVmaW5lIHBmbl9wdGUocGZuLCBwcm90KQlfX3B0ZSgoKHBmbikgPDwgUEFHRV9TSElGVCkgfCBwZ3Byb3RfdmFsKHByb3QpKQogCiAjZGVmaW5lIHB0ZV9FUlJPUihlKSBcCiAgICAgICAgIHByaW50aygiJXM6JWQ6IGJhZCBwdGUgJXAoJTA4bHgpLlxuIiwgX19GSUxFX18sIF9fTElORV9fLCAmKGUpLCBwdGVfdmFsKGUpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9wb3NpeF90eXBlcy5oIGIvaW5jbHVkZS9hc20tY3Jpcy9wb3NpeF90eXBlcy5oCmluZGV4IDNhNWU0YzQuLmNlM2ZiMjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvcG9zaXhfdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL3Bvc2l4X3R5cGVzLmgKQEAgLTQ0LDExICs0NCw3IEBACiAjZW5kaWYKIAogdHlwZWRlZiBzdHJ1Y3QgewotI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgZGVmaW5lZChfX1VTRV9BTEwpCiAJaW50CXZhbFsyXTsKLSNlbHNlIC8qICFkZWZpbmVkKF9fS0VSTkVMX18pICYmICFkZWZpbmVkKF9fVVNFX0FMTCkgKi8KLQlpbnQJX192YWxbMl07Ci0jZW5kaWYgLyogIWRlZmluZWQoX19LRVJORUxfXykgJiYgIWRlZmluZWQoX19VU0VfQUxMKSAqLwogfSBfX2tlcm5lbF9mc2lkX3Q7CiAKICNpZmRlZiBfX0tFUk5FTF9fCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1jcmlzL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tY3Jpcy9wcm9jZXNzb3IuaAppbmRleCA1NjhkYTFkLi5jZGMwYzFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLWNyaXMvcHJvY2Vzc29yLmgKQEAgLTE3LDYgKzE3LDkgQEAKIAogc3RydWN0IHRhc2tfc3RydWN0OwogCisjZGVmaW5lIFNUQUNLX1RPUAlUQVNLX1NJWkUKKyNkZWZpbmUgU1RBQ0tfVE9QX01BWAlTVEFDS19UT1AKKwogLyogVGhpcyBkZWNpZGVzIHdoZXJlIHRoZSBrZXJuZWwgd2lsbCBzZWFyY2ggZm9yIGEgZnJlZSBjaHVuayBvZiB2bQogICogc3BhY2UgZHVyaW5nIG1tYXAncy4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9ydGMuaCBiL2luY2x1ZGUvYXNtLWNyaXMvcnRjLmgKaW5kZXggY2I0YmY5Mi4uMTdkMzAxOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9ydGMuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL3J0Yy5oCkBAIC0xLDEwICsxLDcgQEAKLS8qICRJZDogcnRjLmgsdiAxLjcgMjAwMi8xMS8wNCAwNzozMjowOSBzdGFydmlrIEV4cCAkICovCiAKICNpZm5kZWYgX19SVENfSF9fCiAjZGVmaW5lIF9fUlRDX0hfXwogCi0KLQogI2lmZGVmIENPTkZJR19FVFJBWF9EUzEzMDIKICAgIC8qIERhbGxhcyBEUzEzMDIgY2xvY2svY2FsZW5kYXIgcmVnaXN0ZXIgbnVtYmVycy4gKi8KICMgIGRlZmluZSBSVENfU0VDT05EUyAgICAgIDAKQEAgLTE3LDE3ICsxNCwxNyBAQAogIyAgZGVmaW5lIFJUQ19DT05UUk9MICAgICAgNwogCiAgICAvKiBCaXRzIGluIENPTlRST0wgcmVnaXN0ZXIuICovCi0jICBkZWZpbmUgUlRDX0NPTlRST0xfV1JJVEVQUk9URUNUIAkweDgwCi0jICBkZWZpbmUgUlRDX1RSSUNLTEVDSEFSR0VSIAkJOAotICAKKyMgIGRlZmluZSBSVENfQ09OVFJPTF9XUklURVBST1RFQ1QJMHg4MAorIyAgZGVmaW5lIFJUQ19UUklDS0xFQ0hBUkdFUgkJOAorCiAgIC8qIEJpdHMgaW4gVFJJQ0tMRUNIQVJHRVIgcmVnaXN0ZXIgVENTIFRDUyBUQ1MgVENTIERTIERTIFJTIFJTLiAqLwotIyAgZGVmaW5lIFJUQ19UQ1JfUEFUVEVSTiAJMHhBMAkvKiAxMDEweHh4eCAqLwotIyAgZGVmaW5lIFJUQ19UQ1JfMURJT0QgCTB4MDQJLyogeHh4eDAxeHggKi8KLSMgIGRlZmluZSBSVENfVENSXzJESU9EIAkweDA4CS8qIHh4eHgxMHh4ICovCi0jICBkZWZpbmUgUlRDX1RDUl9ESVNBQkxFRCAJMHgwMAkvKiB4eHh4eHgwMCBEaXNhYmxlZCAqLwotIyAgZGVmaW5lIFJUQ19UQ1JfMktPSE0gCTB4MDEJLyogeHh4eHh4MDEgMktPaG0gKi8KLSMgIGRlZmluZSBSVENfVENSXzRLT0hNIAkweDAyCS8qIHh4eHh4eDEwIDRrT2htICovCi0jICBkZWZpbmUgUlRDX1RDUl84S09ITSAJMHgwMwkvKiB4eHh4eHgxMSA4a09obSAqLworIyAgZGVmaW5lIFJUQ19UQ1JfUEFUVEVSTgkweEEwCS8qIDEwMTB4eHh4ICovCisjICBkZWZpbmUgUlRDX1RDUl8xRElPRAkJMHgwNAkvKiB4eHh4MDF4eCAqLworIyAgZGVmaW5lIFJUQ19UQ1JfMkRJT0QJCTB4MDgJLyogeHh4eDEweHggKi8KKyMgIGRlZmluZSBSVENfVENSX0RJU0FCTEVECTB4MDAJLyogeHh4eHh4MDAgRGlzYWJsZWQgKi8KKyMgIGRlZmluZSBSVENfVENSXzJLT0hNCQkweDAxCS8qIHh4eHh4eDAxIDJLT2htICovCisjICBkZWZpbmUgUlRDX1RDUl80S09ITQkJMHgwMgkvKiB4eHh4eHgxMCA0a09obSAqLworIyAgZGVmaW5lIFJUQ19UQ1JfOEtPSE0JCTB4MDMJLyogeHh4eHh4MTEgOGtPaG0gKi8KIAogI2VsaWYgZGVmaW5lZChDT05GSUdfRVRSQVhfUENGODU2MykKICAgIC8qIEkyQyBidXMgc2xhdmUgcmVnaXN0ZXJzLiAqLwpAQCAtNzksNyArNzYsNyBAQAogCiAvKgogICogVGhlIHN0cnVjdCB1c2VkIHRvIHBhc3MgZGF0YSB2aWEgdGhlIGZvbGxvd2luZyBpb2N0bC4gU2ltaWxhciB0byB0aGUKLSAqIHN0cnVjdCB0bSBpbiA8dGltZS5oPiwgYnV0IGl0IG5lZWRzIHRvIGJlIGhlcmUgc28gdGhhdCB0aGUga2VybmVsIAorICogc3RydWN0IHRtIGluIDx0aW1lLmg+LCBidXQgaXQgbmVlZHMgdG8gYmUgaGVyZSBzbyB0aGF0IHRoZSBrZXJuZWwKICAqIHNvdXJjZSBpcyBzZWxmIGNvbnRhaW5lZCwgYWxsb3dpbmcgY3Jvc3MtY29tcGlsZXMsIGV0Yy4gZXRjLgogICovCiBzdHJ1Y3QgcnRjX3RpbWUgewpAQCAtOTYsMTEgKzkzLDE1IEBACiAKIC8qIGlvY3RsKCkgY2FsbHMgdGhhdCBhcmUgcGVybWl0dGVkIHRvIHRoZSAvZGV2L3J0YyBpbnRlcmZhY2UuICovCiAjZGVmaW5lIFJUQ19NQUdJQyAncCcKLSNkZWZpbmUgUlRDX1JEX1RJTUUJCV9JT1IoUlRDX01BR0lDLCAweDA5LCBzdHJ1Y3QgcnRjX3RpbWUpCS8qIFJlYWQgUlRDIHRpbWUuICovCi0jZGVmaW5lIFJUQ19TRVRfVElNRQkJX0lPVyhSVENfTUFHSUMsIDB4MGEsIHN0cnVjdCBydGNfdGltZSkJLyogU2V0IFJUQyB0aW1lLiAqLwotI2RlZmluZSBSVENfU0VUX0NIQVJHRSAgCV9JT1coUlRDX01BR0lDLCAweDBiLCBpbnQpIAkJCi0jZGVmaW5lIFJUQ19WTE9XX1JEICAgICBfSU9SKFJUQ19NQUdJQywgMHgxMSwgaW50KSAgLyogVm9sdGFnZSBMb3cgZGV0ZWN0b3IgKi8KLSNkZWZpbmUgUlRDX1ZMT1dfU0VUICAgIF9JTyhSVENfTUFHSUMsIDB4MTIpICAgICAgICAvKiBDbGVhciB2b2x0YWdlIGxvdyBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBSVENfTUFYX0lPQ1RMIDB4MTIKKy8qIFJlYWQgUlRDIHRpbWUuICovCisjZGVmaW5lIFJUQ19SRF9USU1FCQlfSU9SKFJUQ19NQUdJQywgMHgwOSwgc3RydWN0IHJ0Y190aW1lKQorLyogU2V0IFJUQyB0aW1lLiAqLworI2RlZmluZSBSVENfU0VUX1RJTUUJCV9JT1coUlRDX01BR0lDLCAweDBhLCBzdHJ1Y3QgcnRjX3RpbWUpCisjZGVmaW5lIFJUQ19TRVRfQ0hBUkdFCQlfSU9XKFJUQ19NQUdJQywgMHgwYiwgaW50KQorLyogVm9sdGFnZSBsb3cgZGV0ZWN0b3IgKi8KKyNkZWZpbmUgUlRDX1ZMX1JFQUQJCV9JT1IoUlRDX01BR0lDLCAweDEzLCBpbnQpCisvKiBDbGVhciB2b2x0YWdlIGxvdyBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBSVENfVkxfQ0xSCQlfSU8oUlRDX01BR0lDLCAweDE0KQorI2RlZmluZSBSVENfTUFYX0lPQ1RMIDB4MTQKIAogI2VuZGlmIC8qIF9fUlRDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9zbXAuaCBiL2luY2x1ZGUvYXNtLWNyaXMvc21wLmgKaW5kZXggZGNhNWVmMS4uZGJhMzNhYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9zbXAuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL3NtcC5oCkBAIC00LDggKzQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KIAogZXh0ZXJuIGNwdW1hc2tfdCBwaHlzX2NwdV9wcmVzZW50X21hcDsKLSNkZWZpbmUgY3B1X3Bvc3NpYmxlX21hcCBwaHlzX2NwdV9wcmVzZW50X21hcAorZXh0ZXJuIGNwdW1hc2tfdCBjcHVfcG9zc2libGVfbWFwOwogCi0jZGVmaW5lIF9fc21wX3Byb2Nlc3Nvcl9pZCgpIChjdXJyZW50X3RocmVhZF9pbmZvKCktPmNwdSkKKyNkZWZpbmUgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSAoY3VycmVudF90aHJlYWRfaW5mbygpLT5jcHUpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy9zeW5jX3NlcmlhbC5oIGIvaW5jbHVkZS9hc20tY3Jpcy9zeW5jX3NlcmlhbC5oCmluZGV4IGY5MzBiNmUuLmQ4N2MyNGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvc3luY19zZXJpYWwuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL3N5bmNfc2VyaWFsLmgKQEAgLTY3LDYgKzY3LDcgQEAKIC8qIFZhbHVlcyBmb3IgU1NQX0ZSQU1FX1NZTkMgKi8KICNkZWZpbmUgTk9STUFMX1NZTkMgICAgICAgICAgICAgICAgMQogI2RlZmluZSBFQVJMWV9TWU5DICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFNFQ09ORF9XT1JEX1NZTkMgICAgIDB4NDAwMDAKIAogI2RlZmluZSBCSVRfU1lOQyAgICAgICAgICAgICAgICAgICA0CiAjZGVmaW5lIFdPUkRfU1lOQyAgICAgICAgICAgICAgICAgIDgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1jcmlzL3N5c3RlbS5oCmluZGV4IGZlYTBlOGQuLjViY2ZlNWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9zeXN0ZW0uaApAQCAtNjYsNiArNjYsMjEgQEAKICAgcmV0dXJuIHg7CiB9CiAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jbXB4Y2hnLWxvY2FsLmg+CisKKy8qCisgKiBjbXB4Y2hnX2xvY2FsIGFuZCBjbXB4Y2hnNjRfbG9jYWwgYXJlIGF0b21pYyB3cnQgY3VycmVudCBDUFUuIEFsd2F5cyBtYWtlCisgKiB0aGVtIGF2YWlsYWJsZS4KKyAqLworI2RlZmluZSBjbXB4Y2hnX2xvY2FsKHB0ciwgbywgbikJCQkJIAkgICAgICAgXAorCSgoX190eXBlb2ZfXygqKHB0cikpKV9fY21weGNoZ19sb2NhbF9nZW5lcmljKChwdHIpLCAodW5zaWduZWQgbG9uZykobyksXAorCQkJKHVuc2lnbmVkIGxvbmcpKG4pLCBzaXplb2YoKihwdHIpKSkpCisjZGVmaW5lIGNtcHhjaGc2NF9sb2NhbChwdHIsIG8sIG4pIF9fY21weGNoZzY0X2xvY2FsX2dlbmVyaWMoKHB0ciksIChvKSwgKG4pKQorCisjaWZuZGVmIENPTkZJR19TTVAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jbXB4Y2hnLmg+CisjZW5kaWYKKwogI2RlZmluZSBhcmNoX2FsaWduX3N0YWNrKHgpICh4KQogCiB2b2lkIGRlZmF1bHRfaWRsZSh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1jcmlzL3VuaXN0ZC5oCmluZGV4IGJkNTdhNzkuLjAwN2NiMTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWNyaXMvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy91bmlzdGQuaApAQCAtMzI2LDkgKzMyNiwxMSBAQAogI2RlZmluZSBfX05SX2Vwb2xsX3B3YWl0CTMxOQogI2RlZmluZSBfX05SX3V0aW1lbnNhdAkJMzIwCiAjZGVmaW5lIF9fTlJfc2lnbmFsZmQJCTMyMQotI2RlZmluZSBfX05SX3RpbWVyZmQJCTMyMgorI2RlZmluZSBfX05SX3RpbWVyZmRfY3JlYXRlCTMyMgogI2RlZmluZSBfX05SX2V2ZW50ZmQJCTMyMwogI2RlZmluZSBfX05SX2ZhbGxvY2F0ZQkJMzI0CisjZGVmaW5lIF9fTlJfdGltZXJmZF9zZXR0aW1lICAgIDMxNQorI2RlZmluZSBfX05SX3RpbWVyZmRfZ2V0dGltZSAgICAzMTYKIAogI2lmZGVmIF9fS0VSTkVMX18KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tY3Jpcy91c2VyLmggYi9pbmNsdWRlL2FzbS1jcmlzL3VzZXIuaAppbmRleCAyNTM4ZTJhLi43M2U2MGZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1jcmlzL3VzZXIuaAorKysgYi9pbmNsdWRlL2FzbS1jcmlzL3VzZXIuaApAQCAtMzgsNyArMzgsNyBAQAogCXVuc2lnbmVkIGxvbmcJc3RhcnRfZGF0YTsJCS8qIGRhdGEgc3RhcnRpbmcgYWRkcmVzcyAqLwogCXVuc2lnbmVkIGxvbmcJc3RhcnRfc3RhY2s7CQkvKiBzdGFjayBzdGFydGluZyBhZGRyZXNzICovCiAJbG9uZyBpbnQJc2lnbmFsOwkJCS8qIHNpZ25hbCBjYXVzaW5nIGNvcmUgZHVtcCAqLwotCXN0cnVjdCByZWdzICoJdV9hcjA7CQkJLyogaGVscCBnZGIgZmluZCByZWdpc3RlcnMgKi8KKwl1bnNpZ25lZCBsb25nCXVfYXIwOwkJCS8qIGhlbHAgZ2RiIGZpbmQgcmVnaXN0ZXJzICovCiAJdW5zaWduZWQgbG9uZwltYWdpYzsJCQkvKiBpZGVudGlmaWVzIGEgY29yZSBmaWxlICovCiAJY2hhcgkJdV9jb21tWzMyXTsJCS8qIHVzZXIgY29tbWFuZCBuYW1lICovCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L0tidWlsZCBiL2luY2x1ZGUvYXNtLWZydi9LYnVpbGQKaW5kZXggOTY2YTk4My4uYmMzZjEyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L0tidWlsZAorKysgYi9pbmNsdWRlL2FzbS1mcnYvS2J1aWxkCkBAIC00LDQgKzQsMyBAQAogCiB1bmlmZGVmLXkgKz0gdGVybWlvcy5oCiB1bmlmZGVmLXkgKz0gcHRyYWNlLmgKLXVuaWZkZWYteSArPSBwYWdlLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi9hLm91dC5oIGIvaW5jbHVkZS9hc20tZnJ2L2Eub3V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkM2I3ZTUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L2Eub3V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLS8qCi0gKiBGUlYgZG9lc24ndCBkbyBBT1VUIGZvcm1hdC4gVGhpcyBoZWFkZXIgZmlsZSBzaG91bGQgYmUgcmVtb3ZlZCBhcwotICogc29vbiBhcyBmcy9leGVjLmMgYW5kIGZzL3Byb2Mva2NvcmUuYyBhbmQgdGhlIGFyY2hzIHRoYXQgcmVxdWlyZQotICogdGhlbSB0byBpbmNsdWRlIGxpbnV4L2Eub3V0LmggYXJlIGZpeGVkLgotICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvYXRvbWljLmggYi9pbmNsdWRlL2FzbS1mcnYvYXRvbWljLmgKaW5kZXggNmVjNDk0YS4uNDZkNjk2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L2F0b21pYy5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9hdG9taWMuaApAQCAtMTI1LDg3ICsxMjUsNiBAQAogI2RlZmluZSBhdG9taWNfZGVjX2FuZF90ZXN0KHYpCQkoYXRvbWljX3N1Yl9yZXR1cm4oMSwgKHYpKSA9PSAwKQogI2RlZmluZSBhdG9taWNfaW5jX2FuZF90ZXN0KHYpCQkoYXRvbWljX2FkZF9yZXR1cm4oMSwgKHYpKSA9PSAwKQogCi0jaWZuZGVmIENPTkZJR19GUlZfT1VUT0ZMSU5FX0FUT01JQ19PUFMKLXN0YXRpYyBpbmxpbmUKLXVuc2lnbmVkIGxvbmcgYXRvbWljX3Rlc3RfYW5kX0FORE5PVF9tYXNrKHVuc2lnbmVkIGxvbmcgbWFzaywgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqdikKLXsKLQl1bnNpZ25lZCBsb25nIG9sZCwgdG1wOwotCi0JYXNtIHZvbGF0aWxlKAotCQkiMDoJCQkJCQlcbiIKLQkJIglvcmNjCQlncjAsZ3IwLGdyMCxpY2MzCVxuIgkvKiBzZXQgSUNDMy5aICovCi0JCSIJY2tlcQkJaWNjMyxjYzcJCVxuIgotCQkiCWxkLnAJCSVNMCwlMQkJCVxuIgkvKiBMRC5QL09SQ1IgYXJlIGF0b21pYyAqLwotCQkiCW9yY3IJCWNjNyxjYzcsY2MzCQlcbiIJLyogc2V0IENDMyB0byB0cnVlICovCi0JCSIJYW5kJUkzCQklMSwlMywlMgkJXG4iCi0JCSIJY3N0LnAJCSUyLCVNMAkJLGNjMywjMQlcbiIJLyogaWYgc3RvcmUgaGFwcGVucy4uLiAqLwotCQkiCWNvcmNjCQlncjI5LGdyMjksZ3IwCSxjYzMsIzEJXG4iCS8qIC4uLiBjbGVhciBJQ0MzLlogKi8KLQkJIgliZXEJCWljYzMsIzAsMGIJCVxuIgotCQk6ICIrVSIoKnYpLCAiPSZyIihvbGQpLCAiPXIiKHRtcCkKLQkJOiAiTlByIih+bWFzaykKLQkJOiAibWVtb3J5IiwgImNjNyIsICJjYzMiLCAiaWNjMyIKLQkJKTsKLQotCXJldHVybiBvbGQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUKLXVuc2lnbmVkIGxvbmcgYXRvbWljX3Rlc3RfYW5kX09SX21hc2sodW5zaWduZWQgbG9uZyBtYXNrLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICp2KQotewotCXVuc2lnbmVkIGxvbmcgb2xkLCB0bXA7Ci0KLQlhc20gdm9sYXRpbGUoCi0JCSIwOgkJCQkJCVxuIgotCQkiCW9yY2MJCWdyMCxncjAsZ3IwLGljYzMJXG4iCS8qIHNldCBJQ0MzLlogKi8KLQkJIglja2VxCQlpY2MzLGNjNwkJXG4iCi0JCSIJbGQucAkJJU0wLCUxCQkJXG4iCS8qIExELlAvT1JDUiBhcmUgYXRvbWljICovCi0JCSIJb3JjcgkJY2M3LGNjNyxjYzMJCVxuIgkvKiBzZXQgQ0MzIHRvIHRydWUgKi8KLQkJIglvciVJMwkJJTEsJTMsJTIJCVxuIgotCQkiCWNzdC5wCQklMiwlTTAJCSxjYzMsIzEJXG4iCS8qIGlmIHN0b3JlIGhhcHBlbnMuLi4gKi8KLQkJIgljb3JjYwkJZ3IyOSxncjI5LGdyMAksY2MzLCMxCVxuIgkvKiAuLi4gY2xlYXIgSUNDMy5aICovCi0JCSIJYmVxCQlpY2MzLCMwLDBiCQlcbiIKLQkJOiAiK1UiKCp2KSwgIj0mciIob2xkKSwgIj1yIih0bXApCi0JCTogIk5QciIobWFzaykKLQkJOiAibWVtb3J5IiwgImNjNyIsICJjYzMiLCAiaWNjMyIKLQkJKTsKLQotCXJldHVybiBvbGQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUKLXVuc2lnbmVkIGxvbmcgYXRvbWljX3Rlc3RfYW5kX1hPUl9tYXNrKHVuc2lnbmVkIGxvbmcgbWFzaywgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqdikKLXsKLQl1bnNpZ25lZCBsb25nIG9sZCwgdG1wOwotCi0JYXNtIHZvbGF0aWxlKAotCQkiMDoJCQkJCQlcbiIKLQkJIglvcmNjCQlncjAsZ3IwLGdyMCxpY2MzCVxuIgkvKiBzZXQgSUNDMy5aICovCi0JCSIJY2tlcQkJaWNjMyxjYzcJCVxuIgotCQkiCWxkLnAJCSVNMCwlMQkJCVxuIgkvKiBMRC5QL09SQ1IgYXJlIGF0b21pYyAqLwotCQkiCW9yY3IJCWNjNyxjYzcsY2MzCQlcbiIJLyogc2V0IENDMyB0byB0cnVlICovCi0JCSIJeG9yJUkzCQklMSwlMywlMgkJXG4iCi0JCSIJY3N0LnAJCSUyLCVNMAkJLGNjMywjMQlcbiIJLyogaWYgc3RvcmUgaGFwcGVucy4uLiAqLwotCQkiCWNvcmNjCQlncjI5LGdyMjksZ3IwCSxjYzMsIzEJXG4iCS8qIC4uLiBjbGVhciBJQ0MzLlogKi8KLQkJIgliZXEJCWljYzMsIzAsMGIJCVxuIgotCQk6ICIrVSIoKnYpLCAiPSZyIihvbGQpLCAiPXIiKHRtcCkKLQkJOiAiTlByIihtYXNrKQotCQk6ICJtZW1vcnkiLCAiY2M3IiwgImNjMyIsICJpY2MzIgotCQkpOwotCi0JcmV0dXJuIG9sZDsKLX0KLQotI2Vsc2UKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYXRvbWljX3Rlc3RfYW5kX0FORE5PVF9tYXNrKHVuc2lnbmVkIGxvbmcgbWFzaywgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqdik7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBhdG9taWNfdGVzdF9hbmRfT1JfbWFzayh1bnNpZ25lZCBsb25nIG1hc2ssIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnYpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYXRvbWljX3Rlc3RfYW5kX1hPUl9tYXNrKHVuc2lnbmVkIGxvbmcgbWFzaywgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqdik7Ci0KLSNlbmRpZgotCi0jZGVmaW5lIGF0b21pY19jbGVhcl9tYXNrKG1hc2ssIHYpCWF0b21pY190ZXN0X2FuZF9BTkROT1RfbWFzaygobWFzayksICh2KSkKLSNkZWZpbmUgYXRvbWljX3NldF9tYXNrKG1hc2ssIHYpCWF0b21pY190ZXN0X2FuZF9PUl9tYXNrKChtYXNrKSwgKHYpKQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogZXhjaGFuZ2UgdmFsdWUgd2l0aCBtZW1vcnkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi9iaXRvcHMuaCBiL2luY2x1ZGUvYXNtLWZydi9iaXRvcHMuaAppbmRleCA1Zjg2Yjg3Li4zOTQ1NmJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvYml0b3BzLmgKKysrIGIvaW5jbHVkZS9hc20tZnJ2L2JpdG9wcy5oCkBAIC0xNiw4ICsxNiw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCiAjaWZkZWYgX19LRVJORUxfXwogCkBAIC0zMyw2ICszMSw4NyBAQAogI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKQliYXJyaWVyKCkKICNkZWZpbmUgc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKQliYXJyaWVyKCkKIAorI2lmbmRlZiBDT05GSUdfRlJWX09VVE9GTElORV9BVE9NSUNfT1BTCitzdGF0aWMgaW5saW5lCit1bnNpZ25lZCBsb25nIGF0b21pY190ZXN0X2FuZF9BTkROT1RfbWFzayh1bnNpZ25lZCBsb25nIG1hc2ssIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnYpCit7CisJdW5zaWduZWQgbG9uZyBvbGQsIHRtcDsKKworCWFzbSB2b2xhdGlsZSgKKwkJIjA6CQkJCQkJXG4iCisJCSIJb3JjYwkJZ3IwLGdyMCxncjAsaWNjMwlcbiIJLyogc2V0IElDQzMuWiAqLworCQkiCWNrZXEJCWljYzMsY2M3CQlcbiIKKwkJIglsZC5wCQklTTAsJTEJCQlcbiIJLyogTEQuUC9PUkNSIGFyZSBhdG9taWMgKi8KKwkJIglvcmNyCQljYzcsY2M3LGNjMwkJXG4iCS8qIHNldCBDQzMgdG8gdHJ1ZSAqLworCQkiCWFuZCVJMwkJJTEsJTMsJTIJCVxuIgorCQkiCWNzdC5wCQklMiwlTTAJCSxjYzMsIzEJXG4iCS8qIGlmIHN0b3JlIGhhcHBlbnMuLi4gKi8KKwkJIgljb3JjYwkJZ3IyOSxncjI5LGdyMAksY2MzLCMxCVxuIgkvKiAuLi4gY2xlYXIgSUNDMy5aICovCisJCSIJYmVxCQlpY2MzLCMwLDBiCQlcbiIKKwkJOiAiK1UiKCp2KSwgIj0mciIob2xkKSwgIj1yIih0bXApCisJCTogIk5QciIofm1hc2spCisJCTogIm1lbW9yeSIsICJjYzciLCAiY2MzIiwgImljYzMiCisJCSk7CisKKwlyZXR1cm4gb2xkOworfQorCitzdGF0aWMgaW5saW5lCit1bnNpZ25lZCBsb25nIGF0b21pY190ZXN0X2FuZF9PUl9tYXNrKHVuc2lnbmVkIGxvbmcgbWFzaywgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqdikKK3sKKwl1bnNpZ25lZCBsb25nIG9sZCwgdG1wOworCisJYXNtIHZvbGF0aWxlKAorCQkiMDoJCQkJCQlcbiIKKwkJIglvcmNjCQlncjAsZ3IwLGdyMCxpY2MzCVxuIgkvKiBzZXQgSUNDMy5aICovCisJCSIJY2tlcQkJaWNjMyxjYzcJCVxuIgorCQkiCWxkLnAJCSVNMCwlMQkJCVxuIgkvKiBMRC5QL09SQ1IgYXJlIGF0b21pYyAqLworCQkiCW9yY3IJCWNjNyxjYzcsY2MzCQlcbiIJLyogc2V0IENDMyB0byB0cnVlICovCisJCSIJb3IlSTMJCSUxLCUzLCUyCQlcbiIKKwkJIgljc3QucAkJJTIsJU0wCQksY2MzLCMxCVxuIgkvKiBpZiBzdG9yZSBoYXBwZW5zLi4uICovCisJCSIJY29yY2MJCWdyMjksZ3IyOSxncjAJLGNjMywjMQlcbiIJLyogLi4uIGNsZWFyIElDQzMuWiAqLworCQkiCWJlcQkJaWNjMywjMCwwYgkJXG4iCisJCTogIitVIigqdiksICI9JnIiKG9sZCksICI9ciIodG1wKQorCQk6ICJOUHIiKG1hc2spCisJCTogIm1lbW9yeSIsICJjYzciLCAiY2MzIiwgImljYzMiCisJCSk7CisKKwlyZXR1cm4gb2xkOworfQorCitzdGF0aWMgaW5saW5lCit1bnNpZ25lZCBsb25nIGF0b21pY190ZXN0X2FuZF9YT1JfbWFzayh1bnNpZ25lZCBsb25nIG1hc2ssIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnYpCit7CisJdW5zaWduZWQgbG9uZyBvbGQsIHRtcDsKKworCWFzbSB2b2xhdGlsZSgKKwkJIjA6CQkJCQkJXG4iCisJCSIJb3JjYwkJZ3IwLGdyMCxncjAsaWNjMwlcbiIJLyogc2V0IElDQzMuWiAqLworCQkiCWNrZXEJCWljYzMsY2M3CQlcbiIKKwkJIglsZC5wCQklTTAsJTEJCQlcbiIJLyogTEQuUC9PUkNSIGFyZSBhdG9taWMgKi8KKwkJIglvcmNyCQljYzcsY2M3LGNjMwkJXG4iCS8qIHNldCBDQzMgdG8gdHJ1ZSAqLworCQkiCXhvciVJMwkJJTEsJTMsJTIJCVxuIgorCQkiCWNzdC5wCQklMiwlTTAJCSxjYzMsIzEJXG4iCS8qIGlmIHN0b3JlIGhhcHBlbnMuLi4gKi8KKwkJIgljb3JjYwkJZ3IyOSxncjI5LGdyMAksY2MzLCMxCVxuIgkvKiAuLi4gY2xlYXIgSUNDMy5aICovCisJCSIJYmVxCQlpY2MzLCMwLDBiCQlcbiIKKwkJOiAiK1UiKCp2KSwgIj0mciIob2xkKSwgIj1yIih0bXApCisJCTogIk5QciIobWFzaykKKwkJOiAibWVtb3J5IiwgImNjNyIsICJjYzMiLCAiaWNjMyIKKwkJKTsKKworCXJldHVybiBvbGQ7Cit9CisKKyNlbHNlCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIGF0b21pY190ZXN0X2FuZF9BTkROT1RfbWFzayh1bnNpZ25lZCBsb25nIG1hc2ssIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnYpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYXRvbWljX3Rlc3RfYW5kX09SX21hc2sodW5zaWduZWQgbG9uZyBtYXNrLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICp2KTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGF0b21pY190ZXN0X2FuZF9YT1JfbWFzayh1bnNpZ25lZCBsb25nIG1hc2ssIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnYpOworCisjZW5kaWYKKworI2RlZmluZSBhdG9taWNfY2xlYXJfbWFzayhtYXNrLCB2KQlhdG9taWNfdGVzdF9hbmRfQU5ETk9UX21hc2soKG1hc2spLCAodikpCisjZGVmaW5lIGF0b21pY19zZXRfbWFzayhtYXNrLCB2KQlhdG9taWNfdGVzdF9hbmRfT1JfbWFzaygobWFzayksICh2KSkKKwogc3RhdGljIGlubGluZSBpbnQgdGVzdF9hbmRfY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqYWRkcikKIHsKIAl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpwdHIgPSBhZGRyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L2VsZi5oIGIvaW5jbHVkZS9hc20tZnJ2L2VsZi5oCmluZGV4IDdkZjU4YTMuLjlmYjk0NmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWZydi9lbGYuaAorKysgYi9pbmNsdWRlL2FzbS1mcnYvZWxmLmgKQEAgLTEzNyw4ICsxMzcsNiBAQAogCiAjZGVmaW5lIEVMRl9QTEFURk9STSAgKE5VTEwpCiAKLSNpZmRlZiBfX0tFUk5FTF9fCiAjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCwgaWJjczIpIHNldF9wZXJzb25hbGl0eSgoaWJjczIpP1BFUl9TVlI0OlBFUl9MSU5VWCkKLSNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi9wYWdlLmggYi9pbmNsdWRlL2FzbS1mcnYvcGFnZS5oCmluZGV4IGJkOWJkMmQuLmMyYzFlODkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWZydi9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tZnJ2L3BhZ2UuaApAQCAtMSw4ICsxLDYgQEAKICNpZm5kZWYgX0FTTV9QQUdFX0gKICNkZWZpbmUgX0FTTV9QQUdFX0gKIAotI2lmZGVmIF9fS0VSTkVMX18KLQogI2luY2x1ZGUgPGFzbS92aXJ0Y29udmVydC5oPgogI2luY2x1ZGUgPGFzbS9tZW0tbGF5b3V0Lmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CkBAIC0yNyw2ICsyNSw3IEBACiB0eXBlZGVmIHN0cnVjdCB7IHBtZF90CQlwdWVbMV07IH0gcHVkX3Q7CiB0eXBlZGVmIHN0cnVjdCB7IHB1ZF90CQlwZ2VbMV07CX0gcGdkX3Q7CiB0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcJcGdwcm90Owl9IHBncHJvdF90OwordHlwZWRlZiBzdHJ1Y3QgcGFnZSAqcGd0YWJsZV90OwogCiAjZGVmaW5lIHB0ZV92YWwoeCkJKCh4KS5wdGUpCiAjZGVmaW5lIHBtZF92YWwoeCkJKCh4KS5zdGVbMF0pCkBAIC03OSw2ICs3OCw0IEBACiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbWVtb3J5X21vZGVsLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGFnZS5oPgogCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCiAjZW5kaWYgLyogX0FTTV9QQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi9wYXJhbS5oIGIvaW5jbHVkZS9hc20tZnJ2L3BhcmFtLmgKaW5kZXggMzY1NjUzYi4uNjg1OWRkNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L3BhcmFtLmgKKysrIGIvaW5jbHVkZS9hc20tZnJ2L3BhcmFtLmgKQEAgLTIsNyArMiw3IEBACiAjZGVmaW5lIF9BU01fUEFSQU1fSAogCiAjaWZkZWYgX19LRVJORUxfXwotI2RlZmluZSBIWgkJMTAwMAkJLyogSW50ZXJuYWwga2VybmVsIHRpbWVyIGZyZXF1ZW5jeSAqLworI2RlZmluZSBIWgkJQ09ORklHX0haCS8qIEludGVybmFsIGtlcm5lbCB0aW1lciBmcmVxdWVuY3kgKi8KICNkZWZpbmUgVVNFUl9IWgkJMTAwCQkvKiAuLiBzb21lIHVzZXIgaW50ZXJmYWNlcyBhcmUgaW4gInRpY2tzIiAqLwogI2RlZmluZSBDTE9DS1NfUEVSX1NFQwkoVVNFUl9IWikJLyogbGlrZSB0aW1lcygpICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi9wZ2FsbG9jLmggYi9pbmNsdWRlL2FzbS1mcnYvcGdhbGxvYy5oCmluZGV4IGU4OTYyMGUuLjk3MWU2YWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWZydi9wZ2FsbG9jLmgKKysrIGIvaW5jbHVkZS9hc20tZnJ2L3BnYWxsb2MuaApAQCAtMjUsNiArMjUsNyBAQAogZG8gewkJCQkJCQkJCQlcCiAJX19zZXRfcG1kKChQTUQpLCBwYWdlX3RvX3BmbihQQUdFKSA8PCBQQUdFX1NISUZUIHwgX1BBR0VfVEFCTEUpOwlcCiB9IHdoaWxlKDApCisjZGVmaW5lIHBtZF9wZ3RhYmxlKHBtZCkgcG1kX3BhZ2UocG1kKQogCiAvKgogICogQWxsb2NhdGUgYW5kIGZyZWUgcGFnZSB0YWJsZXMuCkBAIC0zNSwxOSArMzYsMjQgQEAKIAogZXh0ZXJuIHB0ZV90ICpwdGVfYWxsb2Nfb25lX2tlcm5lbChzdHJ1Y3QgbW1fc3RydWN0ICosIHVuc2lnbmVkIGxvbmcpOwogCi1leHRlcm4gc3RydWN0IHBhZ2UgKnB0ZV9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiBwZ3RhYmxlX3QgcHRlX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICosIHVuc2lnbmVkIGxvbmcpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdGVfdCAqcHRlKQogewogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwdGUpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBwYWdlICpwdGUpCitzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBndGFibGVfdCBwdGUpCiB7CisJcGd0YWJsZV9wYWdlX2R0b3IocHRlKTsKIAlfX2ZyZWVfcGFnZShwdGUpOwogfQogCi0jZGVmaW5lIF9fcHRlX2ZyZWVfdGxiKHRsYixwdGUpCQl0bGJfcmVtb3ZlX3BhZ2UoKHRsYiksKHB0ZSkpCisjZGVmaW5lIF9fcHRlX2ZyZWVfdGxiKHRsYixwdGUpCQkJCVwKK2RvIHsJCQkJCQkJXAorCXBndGFibGVfcGFnZV9kdG9yKHB0ZSk7CQkJCVwKKwl0bGJfcmVtb3ZlX3BhZ2UoKHRsYiksKHB0ZSkpOwkJCVwKK30gd2hpbGUgKDApCiAKIC8qCiAgKiBhbGxvY2F0aW5nIGFuZCBmcmVlaW5nIGEgcG1kIGlzIHRyaXZpYWw6IHRoZSAxLWVudHJ5IHBtZCBpcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L3Bvc2l4X3R5cGVzLmggYi9pbmNsdWRlL2FzbS1mcnYvcG9zaXhfdHlwZXMuaAppbmRleCA3M2MyYmE4Li5hOWYxZjViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvcG9zaXhfdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS1mcnYvcG9zaXhfdHlwZXMuaApAQCAtMzksMTQgKzM5LDEwIEBACiAjZW5kaWYKIAogdHlwZWRlZiBzdHJ1Y3QgewotI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgZGVmaW5lZChfX1VTRV9BTEwpCiAJaW50CXZhbFsyXTsKLSNlbHNlIC8qICFkZWZpbmVkKF9fS0VSTkVMX18pICYmICFkZWZpbmVkKF9fVVNFX0FMTCkgKi8KLQlpbnQJX192YWxbMl07Ci0jZW5kaWYgLyogIWRlZmluZWQoX19LRVJORUxfXykgJiYgIWRlZmluZWQoX19VU0VfQUxMKSAqLwogfSBfX2tlcm5lbF9mc2lkX3Q7CiAKLSNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8ICFkZWZpbmVkKF9fR0xJQkNfXykgfHwgKF9fR0xJQkNfXyA8IDIpCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKQogCiAjdW5kZWYJX19GRF9TRVQKICNkZWZpbmUJX19GRF9TRVQoZCwgc2V0KQkoKHNldCktPmZkc19iaXRzW19fRkRFTFQoZCldIHw9IF9fRkRNQVNLKGQpKQpAQCAtNjAsNyArNTYsNyBAQAogI3VuZGVmCV9fRkRfWkVSTwogI2RlZmluZSBfX0ZEX1pFUk8oZmRzZXRwKSAobWVtc2V0IChmZHNldHAsIDAsIHNpemVvZigqKGZkX3NldCAqKWZkc2V0cCkpKQogCi0jZW5kaWYgLyogZGVmaW5lZChfX0tFUk5FTF9fKSB8fCAhZGVmaW5lZChfX0dMSUJDX18pIHx8IChfX0dMSUJDX18gPCAyKSAqLworI2VuZGlmIC8qIGRlZmluZWQoX19LRVJORUxfXykgKi8KIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLWZydi9zeXN0ZW0uaAppbmRleCA5ZjU2NjNiLi5iNDAwY2VhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tZnJ2L3N5c3RlbS5oCkBAIC0xNCw2ICsxNCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KIAogc3RydWN0IHRocmVhZF9zdHJ1Y3Q7CiAKQEAgLTI2OCw1ICsyNjksMjkgQEAKIAogI2VuZGlmCiAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jbXB4Y2hnLWxvY2FsLmg+CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2NtcHhjaGdfbG9jYWwodm9sYXRpbGUgdm9pZCAqcHRyLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2xkLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbmV3LCBpbnQgc2l6ZSkKK3sKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIDQ6CisJCXJldHVybiBjbXB4Y2hnKCh1bnNpZ25lZCBsb25nICopcHRyLCBvbGQsIG5ldyk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIF9fY21weGNoZ19sb2NhbF9nZW5lcmljKHB0ciwgb2xkLCBuZXcsIHNpemUpOworCX0KKworCXJldHVybiBvbGQ7Cit9CisKKy8qCisgKiBjbXB4Y2hnX2xvY2FsIGFuZCBjbXB4Y2hnNjRfbG9jYWwgYXJlIGF0b21pYyB3cnQgY3VycmVudCBDUFUuIEFsd2F5cyBtYWtlCisgKiB0aGVtIGF2YWlsYWJsZS4KKyAqLworI2RlZmluZSBjbXB4Y2hnX2xvY2FsKHB0ciwgbywgbikJCQkJICAJXAorCSgoX190eXBlb2ZfXygqKHB0cikpKV9fY21weGNoZ19sb2NhbCgocHRyKSwgKHVuc2lnbmVkIGxvbmcpKG8pLAlcCisJCQkodW5zaWduZWQgbG9uZykobiksIHNpemVvZigqKHB0cikpKSkKKyNkZWZpbmUgY21weGNoZzY0X2xvY2FsKHB0ciwgbywgbikgX19jbXB4Y2hnNjRfbG9jYWxfZ2VuZXJpYygocHRyKSwgKG8pLCAobikpCiAKICNlbmRpZiAvKiBfQVNNX1NZU1RFTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20gYi9pbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20KaW5kZXggOGZkODE3MS4uZmQ5ZGNmZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9LYnVpbGQuYXNtCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkLmFzbQpAQCAtMSw0ICsxLDYgQEAKK2lmZXEgKCQod2lsZGNhcmQgaW5jbHVkZS9hc20tJChTUkNBUkNIKS9hLm91dC5oKSxpbmNsdWRlL2FzbS0kKFNSQ0FSQ0gpL2Eub3V0LmgpCiB1bmlmZGVmLXkgKz0gYS5vdXQuaAorZW5kaWYKIHVuaWZkZWYteSArPSBhdXh2ZWMuaAogdW5pZmRlZi15ICs9IGJ5dGVvcmRlci5oCiB1bmlmZGVmLXkgKz0gZXJybm8uaApAQCAtMjcsOCArMjksMyBAQAogdW5pZmRlZi15ICs9IHRlcm1pb3MuaAogdW5pZmRlZi15ICs9IHR5cGVzLmgKIHVuaWZkZWYteSArPSB1bmlzdGQuaAotdW5pZmRlZi15ICs9IHVzZXIuaAotCi0jIFRoZXNlIHByb2JhYmx5IHNob3VsZG4ndCBiZSBleHBvcnRlZAotdW5pZmRlZi15ICs9IGVsZi5oCi11bmlmZGVmLXkgKz0gcGFnZS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2NtcHhjaGctbG9jYWwuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvY21weGNoZy1sb2NhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYmEyZmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2NtcHhjaGctbG9jYWwuaApAQCAtMCwwICsxLDY1IEBACisjaWZuZGVmIF9fQVNNX0dFTkVSSUNfQ01QWENIR19MT0NBTF9ICisjZGVmaW5lIF9fQVNNX0dFTkVSSUNfQ01QWENIR19MT0NBTF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitleHRlcm4gdW5zaWduZWQgbG9uZyB3cm9uZ19zaXplX2NtcHhjaGcodm9sYXRpbGUgdm9pZCAqcHRyKTsKKworLyoKKyAqIEdlbmVyaWMgdmVyc2lvbiBvZiBfX2NtcHhjaGdfbG9jYWwgKGRpc2FibGVzIGludGVycnVwdHMpLiBUYWtlcyBhbiB1bnNpZ25lZAorICogbG9uZyBwYXJhbWV0ZXIsIHN1cHBvcnRpbmcgdmFyaW91cyB0eXBlcyBvZiBhcmNoaXRlY3R1cmVzLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19jbXB4Y2hnX2xvY2FsX2dlbmVyaWModm9sYXRpbGUgdm9pZCAqcHRyLAorCQl1bnNpZ25lZCBsb25nIG9sZCwgdW5zaWduZWQgbG9uZyBuZXcsIGludCBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHByZXY7CisKKwkvKgorCSAqIFNhbml0eSBjaGVja2luZywgY29tcGlsZS10aW1lLgorCSAqLworCWlmIChzaXplID09IDggJiYgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICE9IDgpCisJCXdyb25nX3NpemVfY21weGNoZyhwdHIpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgMTogcHJldiA9ICoodTggKilwdHI7CisJCWlmIChwcmV2ID09IG9sZCkKKwkJCSoodTggKilwdHIgPSAodTgpbmV3OworCQlicmVhazsKKwljYXNlIDI6IHByZXYgPSAqKHUxNiAqKXB0cjsKKwkJaWYgKHByZXYgPT0gb2xkKQorCQkJKih1MTYgKilwdHIgPSAodTE2KW5ldzsKKwkJYnJlYWs7CisJY2FzZSA0OiBwcmV2ID0gKih1MzIgKilwdHI7CisJCWlmIChwcmV2ID09IG9sZCkKKwkJCSoodTMyICopcHRyID0gKHUzMiluZXc7CisJCWJyZWFrOworCWNhc2UgODogcHJldiA9ICoodTY0ICopcHRyOworCQlpZiAocHJldiA9PSBvbGQpCisJCQkqKHU2NCAqKXB0ciA9ICh1NjQpbmV3OworCQlicmVhazsKKwlkZWZhdWx0OgorCQl3cm9uZ19zaXplX2NtcHhjaGcocHRyKTsKKwl9CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiBwcmV2OworfQorCisvKgorICogR2VuZXJpYyB2ZXJzaW9uIG9mIF9fY21weGNoZzY0X2xvY2FsLiBUYWtlcyBhbiB1NjQgcGFyYW1ldGVyLgorICovCitzdGF0aWMgaW5saW5lIHU2NCBfX2NtcHhjaGc2NF9sb2NhbF9nZW5lcmljKHZvbGF0aWxlIHZvaWQgKnB0ciwKKwkJdTY0IG9sZCwgdTY0IG5ldykKK3sKKwl1NjQgcHJldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXByZXYgPSAqKHU2NCAqKXB0cjsKKwlpZiAocHJldiA9PSBvbGQpCisJCSoodTY0ICopcHRyID0gbmV3OworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gcHJldjsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2NtcHhjaGcuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvY21weGNoZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxM2FjNmUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2NtcHhjaGcuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9fQVNNX0dFTkVSSUNfQ01QWENIR19ICisjZGVmaW5lIF9fQVNNX0dFTkVSSUNfQ01QWENIR19ICisKKy8qCisgKiBHZW5lcmljIGNtcHhjaGcKKyAqCisgKiBVc2VzIHRoZSBsb2NhbCBjbXB4Y2hnLiBEb2VzIG5vdCBzdXBwb3J0IFNNUC4KKyAqLworI2lmZGVmIENPTkZJR19TTVAKKyNlcnJvciAiQ2Fubm90IHVzZSBnZW5lcmljIGNtcHhjaGcgb24gU01QIgorI2VuZGlmCisKKy8qCisgKiBBdG9taWMgY29tcGFyZSBhbmQgZXhjaGFuZ2UuCisgKgorICogRG8gbm90IGRlZmluZSBfX0hBVkVfQVJDSF9DTVBYQ0hHIGJlY2F1c2Ugd2Ugd2FudCB0byB1c2UgaXQgdG8gY2hlY2sgd2hldGhlcgorICogYSBjbXB4Y2hnIHByaW1pdGl2ZSBmYXN0ZXIgdGhhbiByZXBlYXRlZCBsb2NhbCBpcnEgc2F2ZS9yZXN0b3JlIGV4aXN0cy4KKyAqLworI2RlZmluZSBjbXB4Y2hnKHB0ciwgbywgbikJY21weGNoZ19sb2NhbCgocHRyKSwgKG8pLCAobikpCisjZGVmaW5lIGNtcHhjaGc2NChwdHIsIG8sIG4pCWNtcHhjaGc2NF9sb2NhbCgocHRyKSwgKG8pLCAobikpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9pb21hcC5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9pb21hcC5oCmluZGV4IGNkZTU5MmYuLjY3ZGM4NGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvaW9tYXAuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2lvbWFwLmgKQEAgLTI1LDE3ICsyNSwxNyBAQAogICogaW4gdGhlIGxvdyBhZGRyZXNzIHJhbmdlLiBBcmNoaXRlY3R1cmVzIGZvciB3aGljaCB0aGlzIGlzIG5vdAogICogdHJ1ZSBjYW4ndCB1c2UgdGhpcyBnZW5lcmljIGltcGxlbWVudGF0aW9uLgogICovCi1leHRlcm4gdW5zaWduZWQgaW50IGZhc3RjYWxsIGlvcmVhZDgodm9pZCBfX2lvbWVtICopOwotZXh0ZXJuIHVuc2lnbmVkIGludCBmYXN0Y2FsbCBpb3JlYWQxNih2b2lkIF9faW9tZW0gKik7Ci1leHRlcm4gdW5zaWduZWQgaW50IGZhc3RjYWxsIGlvcmVhZDE2YmUodm9pZCBfX2lvbWVtICopOwotZXh0ZXJuIHVuc2lnbmVkIGludCBmYXN0Y2FsbCBpb3JlYWQzMih2b2lkIF9faW9tZW0gKik7Ci1leHRlcm4gdW5zaWduZWQgaW50IGZhc3RjYWxsIGlvcmVhZDMyYmUodm9pZCBfX2lvbWVtICopOworZXh0ZXJuIHVuc2lnbmVkIGludCBpb3JlYWQ4KHZvaWQgX19pb21lbSAqKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgaW9yZWFkMTYodm9pZCBfX2lvbWVtICopOworZXh0ZXJuIHVuc2lnbmVkIGludCBpb3JlYWQxNmJlKHZvaWQgX19pb21lbSAqKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgaW9yZWFkMzIodm9pZCBfX2lvbWVtICopOworZXh0ZXJuIHVuc2lnbmVkIGludCBpb3JlYWQzMmJlKHZvaWQgX19pb21lbSAqKTsKIAotZXh0ZXJuIHZvaWQgZmFzdGNhbGwgaW93cml0ZTgodTgsIHZvaWQgX19pb21lbSAqKTsKLWV4dGVybiB2b2lkIGZhc3RjYWxsIGlvd3JpdGUxNih1MTYsIHZvaWQgX19pb21lbSAqKTsKLWV4dGVybiB2b2lkIGZhc3RjYWxsIGlvd3JpdGUxNmJlKHUxNiwgdm9pZCBfX2lvbWVtICopOwotZXh0ZXJuIHZvaWQgZmFzdGNhbGwgaW93cml0ZTMyKHUzMiwgdm9pZCBfX2lvbWVtICopOwotZXh0ZXJuIHZvaWQgZmFzdGNhbGwgaW93cml0ZTMyYmUodTMyLCB2b2lkIF9faW9tZW0gKik7CitleHRlcm4gdm9pZCBpb3dyaXRlOCh1OCwgdm9pZCBfX2lvbWVtICopOworZXh0ZXJuIHZvaWQgaW93cml0ZTE2KHUxNiwgdm9pZCBfX2lvbWVtICopOworZXh0ZXJuIHZvaWQgaW93cml0ZTE2YmUodTE2LCB2b2lkIF9faW9tZW0gKik7CitleHRlcm4gdm9pZCBpb3dyaXRlMzIodTMyLCB2b2lkIF9faW9tZW0gKik7CitleHRlcm4gdm9pZCBpb3dyaXRlMzJiZSh1MzIsIHZvaWQgX19pb21lbSAqKTsKIAogLyoKICAqICJzdHJpbmciIHZlcnNpb25zIG9mIHRoZSBhYm92ZS4gTm90ZSB0aGF0IHRoZXkKQEAgLTQ4LDEzICs0OCwxMyBAQAogICogbWVtb3J5IGFjcm9zcyBtdWx0aXBsZSBwb3J0cywgdXNlICJtZW1jcHlfdG9pbygpIgogICogYW5kIGZyaWVuZHMuCiAgKi8KLWV4dGVybiB2b2lkIGZhc3RjYWxsIGlvcmVhZDhfcmVwKHZvaWQgX19pb21lbSAqcG9ydCwgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIGZhc3RjYWxsIGlvcmVhZDE2X3JlcCh2b2lkIF9faW9tZW0gKnBvcnQsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci1leHRlcm4gdm9pZCBmYXN0Y2FsbCBpb3JlYWQzMl9yZXAodm9pZCBfX2lvbWVtICpwb3J0LCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgY291bnQpOworZXh0ZXJuIHZvaWQgaW9yZWFkOF9yZXAodm9pZCBfX2lvbWVtICpwb3J0LCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgY291bnQpOworZXh0ZXJuIHZvaWQgaW9yZWFkMTZfcmVwKHZvaWQgX19pb21lbSAqcG9ydCwgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKK2V4dGVybiB2b2lkIGlvcmVhZDMyX3JlcCh2b2lkIF9faW9tZW0gKnBvcnQsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBjb3VudCk7CiAKLWV4dGVybiB2b2lkIGZhc3RjYWxsIGlvd3JpdGU4X3JlcCh2b2lkIF9faW9tZW0gKnBvcnQsIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci1leHRlcm4gdm9pZCBmYXN0Y2FsbCBpb3dyaXRlMTZfcmVwKHZvaWQgX19pb21lbSAqcG9ydCwgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIGZhc3RjYWxsIGlvd3JpdGUzMl9yZXAodm9pZCBfX2lvbWVtICpwb3J0LCBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgY291bnQpOworZXh0ZXJuIHZvaWQgaW93cml0ZThfcmVwKHZvaWQgX19pb21lbSAqcG9ydCwgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKK2V4dGVybiB2b2lkIGlvd3JpdGUxNl9yZXAodm9pZCBfX2lvbWVtICpwb3J0LCBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgY291bnQpOworZXh0ZXJuIHZvaWQgaW93cml0ZTMyX3JlcCh2b2lkIF9faW9tZW0gKnBvcnQsIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBjb3VudCk7CiAKIC8qIENyZWF0ZSBhIHZpcnR1YWwgbWFwcGluZyBjb29raWUgZm9yIGFuIElPIHBvcnQgcmFuZ2UgKi8KIGV4dGVybiB2b2lkIF9faW9tZW0gKmlvcG9ydF9tYXAodW5zaWduZWQgbG9uZyBwb3J0LCB1bnNpZ25lZCBpbnQgbnIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9tdXRleC1kZWMuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvbXV0ZXgtZGVjLmgKaW5kZXggMDEzNDE1MS4uZWQxMDhiZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9tdXRleC1kZWMuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL211dGV4LWRlYy5oCkBAIC0xOCw3ICsxOCw3IEBACiAgKiAxIGV2ZW4gd2hlbiB0aGUgIjEiIGFzc2VydGlvbiB3YXNuJ3QgdHJ1ZS4KICAqLwogc3RhdGljIGlubGluZSB2b2lkCi1fX211dGV4X2Zhc3RwYXRoX2xvY2soYXRvbWljX3QgKmNvdW50LCBmYXN0Y2FsbCB2b2lkICgqZmFpbF9mbikoYXRvbWljX3QgKikpCitfX211dGV4X2Zhc3RwYXRoX2xvY2soYXRvbWljX3QgKmNvdW50LCB2b2lkICgqZmFpbF9mbikoYXRvbWljX3QgKikpCiB7CiAJaWYgKHVubGlrZWx5KGF0b21pY19kZWNfcmV0dXJuKGNvdW50KSA8IDApKQogCQlmYWlsX2ZuKGNvdW50KTsKQEAgLTM3LDcgKzM3LDcgQEAKICAqIG9yIGFueXRoaW5nIHRoZSBzbG93IHBhdGggZnVuY3Rpb24gcmV0dXJucy4KICAqLwogc3RhdGljIGlubGluZSBpbnQKLV9fbXV0ZXhfZmFzdHBhdGhfbG9ja19yZXR2YWwoYXRvbWljX3QgKmNvdW50LCBmYXN0Y2FsbCBpbnQgKCpmYWlsX2ZuKShhdG9taWNfdCAqKSkKK19fbXV0ZXhfZmFzdHBhdGhfbG9ja19yZXR2YWwoYXRvbWljX3QgKmNvdW50LCBpbnQgKCpmYWlsX2ZuKShhdG9taWNfdCAqKSkKIHsKIAlpZiAodW5saWtlbHkoYXRvbWljX2RlY19yZXR1cm4oY291bnQpIDwgMCkpCiAJCXJldHVybiBmYWlsX2ZuKGNvdW50KTsKQEAgLTYxLDcgKzYxLDcgQEAKICAqIHRvIHJldHVybiAwIG90aGVyd2lzZS4KICAqLwogc3RhdGljIGlubGluZSB2b2lkCi1fX211dGV4X2Zhc3RwYXRoX3VubG9jayhhdG9taWNfdCAqY291bnQsIGZhc3RjYWxsIHZvaWQgKCpmYWlsX2ZuKShhdG9taWNfdCAqKSkKK19fbXV0ZXhfZmFzdHBhdGhfdW5sb2NrKGF0b21pY190ICpjb3VudCwgdm9pZCAoKmZhaWxfZm4pKGF0b21pY190ICopKQogewogCXNtcF9tYigpOwogCWlmICh1bmxpa2VseShhdG9taWNfaW5jX3JldHVybihjb3VudCkgPD0gMCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL211dGV4LXhjaGcuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvbXV0ZXgteGNoZy5oCmluZGV4IDZhN2U4YzEuLjdiOWNkMmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvbXV0ZXgteGNoZy5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvbXV0ZXgteGNoZy5oCkBAIC0yMyw3ICsyMyw3IEBACiAgKiBldmVuIHdoZW4gdGhlICIxIiBhc3NlcnRpb24gd2Fzbid0IHRydWUuCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZAotX19tdXRleF9mYXN0cGF0aF9sb2NrKGF0b21pY190ICpjb3VudCwgZmFzdGNhbGwgdm9pZCAoKmZhaWxfZm4pKGF0b21pY190ICopKQorX19tdXRleF9mYXN0cGF0aF9sb2NrKGF0b21pY190ICpjb3VudCwgdm9pZCAoKmZhaWxfZm4pKGF0b21pY190ICopKQogewogCWlmICh1bmxpa2VseShhdG9taWNfeGNoZyhjb3VudCwgMCkgIT0gMSkpCiAJCWZhaWxfZm4oY291bnQpOwpAQCAtNDIsNyArNDIsNyBAQAogICogb3IgYW55dGhpbmcgdGhlIHNsb3cgcGF0aCBmdW5jdGlvbiByZXR1cm5zCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50Ci1fX211dGV4X2Zhc3RwYXRoX2xvY2tfcmV0dmFsKGF0b21pY190ICpjb3VudCwgZmFzdGNhbGwgaW50ICgqZmFpbF9mbikoYXRvbWljX3QgKikpCitfX211dGV4X2Zhc3RwYXRoX2xvY2tfcmV0dmFsKGF0b21pY190ICpjb3VudCwgaW50ICgqZmFpbF9mbikoYXRvbWljX3QgKikpCiB7CiAJaWYgKHVubGlrZWx5KGF0b21pY194Y2hnKGNvdW50LCAwKSAhPSAxKSkKIAkJcmV0dXJuIGZhaWxfZm4oY291bnQpOwpAQCAtNjUsNyArNjUsNyBAQAogICogdG8gcmV0dXJuIDAgb3RoZXJ3aXNlLgogICovCiBzdGF0aWMgaW5saW5lIHZvaWQKLV9fbXV0ZXhfZmFzdHBhdGhfdW5sb2NrKGF0b21pY190ICpjb3VudCwgZmFzdGNhbGwgdm9pZCAoKmZhaWxfZm4pKGF0b21pY190ICopKQorX19tdXRleF9mYXN0cGF0aF91bmxvY2soYXRvbWljX3QgKmNvdW50LCB2b2lkICgqZmFpbF9mbikoYXRvbWljX3QgKikpCiB7CiAJc21wX21iKCk7CiAJaWYgKHVubGlrZWx5KGF0b21pY194Y2hnKGNvdW50LCAxKSAhPSAwKSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdGVybWlvcy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy90ZXJtaW9zLmgKaW5kZXggMzNkY2EzMC4uN2QzOWVjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy90ZXJtaW9zLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy90ZXJtaW9zLmgKQEAgLTYxLDggKzYxLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZm5kZWYgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zCiAjZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBjb3B5X2Zyb21fdXNlcihrLCB1LCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQorI2VuZGlmCisKKyNpZm5kZWYga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zCiAjZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcyh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNlbmRpZgorCiAjZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvc18xKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCiAjZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvc18xKHUsIGspIGNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC9hLm91dC5oIGIvaW5jbHVkZS9hc20taDgzMDAvYS5vdXQuaAppbmRleCBhYTVkMjI3Li5kZWQ3ODBmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1oODMwMC9hLm91dC5oCisrKyBiL2luY2x1ZGUvYXNtLWg4MzAwL2Eub3V0LmgKQEAgLTE3LDExICsxNyw0IEBACiAjZGVmaW5lIE5fRFJTSVpFKGEpCSgoYSkuYV9kcnNpemUpCiAjZGVmaW5lIE5fU1lNU0laRShhKQkoKGEpLmFfc3ltcykKIAotI2lmZGVmIF9fS0VSTkVMX18KLQotI2RlZmluZSBTVEFDS19UT1AJVEFTS19TSVpFCi0jZGVmaW5lIFNUQUNLX1RPUF9NQVgJU1RBQ0tfVE9QCi0KLSNlbmRpZgotCiAjZW5kaWYgLyogX19IODMwMF9BX09VVF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL2VsZi5oIGIvaW5jbHVkZS9hc20taDgzMDAvZWxmLmgKaW5kZXggN2JhNmEwYS4uMjZiZmM3ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taDgzMDAvZWxmLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvZWxmLmgKQEAgLTU1LDkgKzU1LDcgQEAKIAogI2RlZmluZSBFTEZfUExBVEZPUk0gIChOVUxMKQogCi0jaWZkZWYgX19LRVJORUxfXwogI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgsIGliY3MyKSBzZXRfcGVyc29uYWxpdHkoUEVSX0xJTlVYKQotI2VuZGlmCiAKICNkZWZpbmUgUl9IOF9OT05FICAgICAgIDAKICNkZWZpbmUgUl9IOF9ESVIzMiAgICAgIDEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLWg4MzAwL3BhZ2UuaAppbmRleCBjOGNjODFhLi5kNmEzZWFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1oODMwMC9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvcGFnZS5oCkBAIC0xLDggKzEsNiBAQAogI2lmbmRlZiBfSDgzMDBfUEFHRV9ICiAjZGVmaW5lIF9IODMwMF9QQUdFX0gKIAotI2lmZGVmIF9fS0VSTkVMX18KLQogLyogUEFHRV9TSElGVCBkZXRlcm1pbmVzIHRoZSBwYWdlIHNpemUgKi8KIAogI2RlZmluZSBQQUdFX1NISUZUCSgxMikKQEAgLTMzLDYgKzMxLDcgQEAKIHR5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBwbWRbMTZdOyB9IHBtZF90OwogdHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBsb25nIHBnZDsgfSBwZ2RfdDsKIHR5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBwZ3Byb3Q7IH0gcGdwcm90X3Q7Cit0eXBlZGVmIHN0cnVjdCBwYWdlICpwZ3RhYmxlX3Q7CiAKICNkZWZpbmUgcHRlX3ZhbCh4KQkoKHgpLnB0ZSkKICNkZWZpbmUgcG1kX3ZhbCh4KQkoKCZ4KS0+cG1kWzBdKQpAQCAtNzksNiArNzgsNCBAQAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL21lbW9yeV9tb2RlbC5oPgogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BhZ2UuaD4KIAotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQogI2VuZGlmIC8qIF9IODMwMF9QQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3BhcmFtLmggYi9pbmNsdWRlL2FzbS1oODMwMC9wYXJhbS5oCmluZGV4IGMyNTgwNmUuLjA0ZjY0ZjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL3BhcmFtLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvcGFyYW0uaApAQCAtMyw3ICszLDcgQEAKIAogCiAjaWZuZGVmIEhaCi0jZGVmaW5lIEhaIDEwMAorI2RlZmluZSBIWiBDT05GSUdfSFoKICNlbmRpZgogCiAjaWZkZWYgX19LRVJORUxfXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taDgzMDAvcG9zaXhfdHlwZXMuaCBiL2luY2x1ZGUvYXNtLWg4MzAwL3Bvc2l4X3R5cGVzLmgKaW5kZXggN2RlOTRiMS4uNWM1NTM5MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taDgzMDAvcG9zaXhfdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS1oODMwMC9wb3NpeF90eXBlcy5oCkBAIC0zOCwxNCArMzgsMTAgQEAKICNlbmRpZgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0jaWYgZGVmaW5lZChfX0tFUk5FTF9fKSB8fCBkZWZpbmVkKF9fVVNFX0FMTCkKIAlpbnQJdmFsWzJdOwotI2Vsc2UgLyogIWRlZmluZWQoX19LRVJORUxfXykgJiYgIWRlZmluZWQoX19VU0VfQUxMKSAqLwotCWludAlfX3ZhbFsyXTsKLSNlbmRpZiAvKiAhZGVmaW5lZChfX0tFUk5FTF9fKSAmJiAhZGVmaW5lZChfX1VTRV9BTEwpICovCiB9IF9fa2VybmVsX2ZzaWRfdDsKIAotI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgIWRlZmluZWQoX19HTElCQ19fKSB8fCAoX19HTElCQ19fIDwgMikKKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pCiAKICN1bmRlZglfX0ZEX1NFVAogI2RlZmluZQlfX0ZEX1NFVChkLCBzZXQpCSgoc2V0KS0+ZmRzX2JpdHNbX19GREVMVChkKV0gfD0gX19GRE1BU0soZCkpCkBAIC01OSw2ICs1NSw2IEBACiAjdW5kZWYJX19GRF9aRVJPCiAjZGVmaW5lIF9fRkRfWkVSTyhmZHNldHApIChtZW1zZXQgKGZkc2V0cCwgMCwgc2l6ZW9mKCooZmRfc2V0ICopZmRzZXRwKSkpCiAKLSNlbmRpZiAvKiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8ICFkZWZpbmVkKF9fR0xJQkNfXykgfHwgKF9fR0xJQkNfXyA8IDIpICovCisjZW5kaWYgLyogZGVmaW5lZChfX0tFUk5FTF9fKSAqLwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20taDgzMDAvcHJvY2Vzc29yLmgKaW5kZXggNDlmYzg4Ni4uNjllOGEzNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taDgzMDAvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvcHJvY2Vzc29yLmgKQEAgLTM5LDYgKzM5LDExIEBACiAgKi8KICNkZWZpbmUgVEFTS19TSVpFCSgweEZGRkZGRkZGVUwpCiAKKyNpZmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lIFNUQUNLX1RPUAlUQVNLX1NJWkUKKyNkZWZpbmUgU1RBQ0tfVE9QX01BWAlTVEFDS19UT1AKKyNlbmRpZgorCiAvKgogICogVGhpcyBkZWNpZGVzIHdoZXJlIHRoZSBrZXJuZWwgd2lsbCBzZWFyY2ggZm9yIGEgZnJlZSBjaHVuayBvZiB2bQogICogc3BhY2UgZHVyaW5nIG1tYXAncy4gV2Ugd29uJ3QgYmUgdXNpbmcgaXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20taDgzMDAvc3lzdGVtLmgKaW5kZXggMmMxZTgzZi4uNGI4ZTQ3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taDgzMDAvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvc3lzdGVtLmgKQEAgLTEzOCw2ICsxMzgsMjEgQEAKICAgICAgICAgYXNtKCJqbXAgQEAwIik7CQkJXAogfSkKIAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NtcHhjaGctbG9jYWwuaD4KKworLyoKKyAqIGNtcHhjaGdfbG9jYWwgYW5kIGNtcHhjaGc2NF9sb2NhbCBhcmUgYXRvbWljIHdydCBjdXJyZW50IENQVS4gQWx3YXlzIG1ha2UKKyAqIHRoZW0gYXZhaWxhYmxlLgorICovCisjZGVmaW5lIGNtcHhjaGdfbG9jYWwocHRyLCBvLCBuKQkJCQkgIAkgICAgICAgXAorCSgoX190eXBlb2ZfXygqKHB0cikpKV9fY21weGNoZ19sb2NhbF9nZW5lcmljKChwdHIpLCAodW5zaWduZWQgbG9uZykobyksXAorCQkJKHVuc2lnbmVkIGxvbmcpKG4pLCBzaXplb2YoKihwdHIpKSkpCisjZGVmaW5lIGNtcHhjaGc2NF9sb2NhbChwdHIsIG8sIG4pIF9fY21weGNoZzY0X2xvY2FsX2dlbmVyaWMoKHB0ciksIChvKSwgKG4pKQorCisjaWZuZGVmIENPTkZJR19TTVAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jbXB4Y2hnLmg+CisjZW5kaWYKKwogI2RlZmluZSBhcmNoX2FsaWduX3N0YWNrKHgpICh4KQogCiAjZW5kaWYgLyogX0g4MzAwX1NZU1RFTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC91c2VyLmggYi9pbmNsdWRlL2FzbS1oODMwMC91c2VyLmgKaW5kZXggNmM2NGY5OS4uMTRhOWUxOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taDgzMDAvdXNlci5oCisrKyBiL2luY2x1ZGUvYXNtLWg4MzAwL3VzZXIuaApAQCAtNjIsOCArNjIsNyBAQAogCQkJCSAgIGVzcCByZWdpc3Rlci4gICovCiAgIGxvbmcgaW50IHNpZ25hbDsgICAgIAkJLyogU2lnbmFsIHRoYXQgY2F1c2VkIHRoZSBjb3JlIGR1bXAuICovCiAgIGludCByZXNlcnZlZDsJCQkvKiBObyBsb25nZXIgdXNlZCAqLwotICBzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCAqdV9hcjA7Ci0JCQkJLyogVXNlZCBieSBnZGIgdG8gaGVscCBmaW5kIHRoZSB2YWx1ZXMgZm9yICovCisgIHVuc2lnbmVkIGxvbmcgdV9hcjA7CQkvKiBVc2VkIGJ5IGdkYiB0byBoZWxwIGZpbmQgdGhlIHZhbHVlcyBmb3IgKi8KIAkJCQkvKiB0aGUgcmVnaXN0ZXJzLiAqLwogICB1bnNpZ25lZCBsb25nIG1hZ2ljOwkJLyogVG8gdW5pcXVlbHkgaWRlbnRpZnkgYSBjb3JlIGZpbGUgKi8KICAgY2hhciB1X2NvbW1bMzJdOwkJLyogVXNlciBjb21tYW5kIHRoYXQgd2FzIHJlc3BvbnNpYmxlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2Eub3V0LmggYi9pbmNsdWRlL2FzbS1pYTY0L2Eub3V0LmgKaW5kZXggNzI5M2FjMS4uMTkzZGNmYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9hLm91dC5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvYS5vdXQuaApAQCAtMjksNyArMjksNCBAQAogI2RlZmluZSBOX1NZTVNJWkUoeCkJMAogI2RlZmluZSBOX1RYVE9GRih4KQkwCiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0jaW5jbHVkZSA8YXNtL3VzdGFjay5oPgotI2VuZGlmCiAjZW5kaWYgLyogX0FTTV9JQTY0X0FfT1VUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvZWxmLmggYi9pbmNsdWRlL2FzbS1pYTY0L2VsZi5oCmluZGV4IGYxMGUyOWIuLmY4ZTgzZWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvZWxmLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9lbGYuaApAQCAtMTc3LDcgKzE3Nyw2IEBACiAgICByZWxldmFudCB1bnRpbCB3ZSBoYXZlIHJlYWwgaGFyZHdhcmUgdG8gcGxheSB3aXRoLi4uICovCiAjZGVmaW5lIEVMRl9QTEFURk9STQlOVUxMCiAKLSNpZmRlZiBfX0tFUk5FTF9fCiAjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCwgaWJjczIpCXNldF9wZXJzb25hbGl0eShQRVJfTElOVVgpCiAjZGVmaW5lIGVsZl9yZWFkX2ltcGxpZXNfZXhlYyhleCwgZXhlY3V0YWJsZV9zdGFjaykJCQkJCVwKIAkoKGV4ZWN1dGFibGVfc3RhY2shPUVYU1RBQ0tfRElTQUJMRV9YKSAmJiAoKGV4KS5lX2ZsYWdzICYgRUZfSUFfNjRfTElOVVhfRVhFQ1VUQUJMRV9TVEFDSykgIT0gMCkKQEAgLTI0OCw2ICsyNDcsNCBAQAogCX0JCQkJCQkJCVwKIH0gd2hpbGUgKDApCiAKLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KICNlbmRpZiAvKiBfQVNNX0lBNjRfRUxGX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvaW50cmluc2ljcy5oIGIvaW5jbHVkZS9hc20taWE2NC9pbnRyaW5zaWNzLmgKaW5kZXggM2E5NWFhNC4uZjExMzViNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9pbnRyaW5zaWNzLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9pbnRyaW5zaWNzLmgKQEAgLTE1MywxMSArMTUzLDE3IEBACiAJKF9fdHlwZW9mX18ob2xkKSkgX3JfOwkJCQkJCQkJXAogfSkKIAotI2RlZmluZSBjbXB4Y2hnX2FjcShwdHIsbyxuKQlpYTY0X2NtcHhjaGcoYWNxLCAocHRyKSwgKG8pLCAobiksIHNpemVvZigqKHB0cikpKQotI2RlZmluZSBjbXB4Y2hnX3JlbChwdHIsbyxuKQlpYTY0X2NtcHhjaGcocmVsLCAocHRyKSwgKG8pLCAobiksIHNpemVvZigqKHB0cikpKQorI2RlZmluZSBjbXB4Y2hnX2FjcShwdHIsIG8sIG4pCVwKKwlpYTY0X2NtcHhjaGcoYWNxLCAocHRyKSwgKG8pLCAobiksIHNpemVvZigqKHB0cikpKQorI2RlZmluZSBjbXB4Y2hnX3JlbChwdHIsIG8sIG4pCVwKKwlpYTY0X2NtcHhjaGcocmVsLCAocHRyKSwgKG8pLCAobiksIHNpemVvZigqKHB0cikpKQogCiAvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIHBsYXRmb3JtczogKi8KLSNkZWZpbmUgY21weGNoZyhwdHIsbyxuKQljbXB4Y2hnX2FjcShwdHIsbyxuKQorI2RlZmluZSBjbXB4Y2hnKHB0ciwgbywgbikJY21weGNoZ19hY3EoKHB0ciksIChvKSwgKG4pKQorI2RlZmluZSBjbXB4Y2hnNjQocHRyLCBvLCBuKQljbXB4Y2hnX2FjcSgocHRyKSwgKG8pLCAobikpCisKKyNkZWZpbmUgY21weGNoZ19sb2NhbAkJY21weGNoZworI2RlZmluZSBjbXB4Y2hnNjRfbG9jYWwJCWNtcHhjaGc2NAogCiAjaWZkZWYgQ09ORklHX0lBNjRfREVCVUdfQ01QWENIRwogIyBkZWZpbmUgQ01QWENIR19CVUdDSEVDS19ERUNMCWludCBfY21weGNoZ19idWdjaGVja19jb3VudCA9IDEyODsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvcGFnZS5oIGIvaW5jbHVkZS9hc20taWE2NC9wYWdlLmgKaW5kZXggZDYzNDU0Ni4uNDk5OWE2YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9wYWdlLmgKQEAgLTcsOCArNyw2IEBACiAgKglEYXZpZCBNb3NiZXJnZXItVGFuZyA8ZGF2aWRtQGhwbC5ocC5jb20+CiAgKi8KIAotIyBpZmRlZiBfX0tFUk5FTF9fCi0KICNpbmNsdWRlIDxhc20vaW50cmluc2ljcy5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogCkBAIC0xODcsNiArMTg1LDcgQEAKICNlbmRpZgogICB0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcGdkOyB9IHBnZF90OwogICB0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcGdwcm90OyB9IHBncHJvdF90OworICB0eXBlZGVmIHN0cnVjdCBwYWdlICpwZ3RhYmxlX3Q7CiAKICMgZGVmaW5lIHB0ZV92YWwoeCkJKCh4KS5wdGUpCiAjIGRlZmluZSBwbWRfdmFsKHgpCSgoeCkucG1kKQpAQCAtMjA4LDYgKzIwNyw3IEBACiAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIHBtZF90OwogICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBwZ2RfdDsKICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgcGdwcm90X3Q7CisgICAgdHlwZWRlZiBzdHJ1Y3QgcGFnZSAqcGd0YWJsZV90OwogIyBlbmRpZgogCiAjIGRlZmluZSBwdGVfdmFsKHgpCSh4KQpAQCAtMjI3LDUgKzIyNyw0IEBACiAJCQkJCSAoKChjdXJyZW50LT5wZXJzb25hbGl0eSAmIFJFQURfSU1QTElFU19FWEVDKSAhPSAwKQlcCiAJCQkJCSAgPyBWTV9FWEVDIDogMCkpCiAKLSMgZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9BU01fSUE2NF9QQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvcGdhbGxvYy5oIGIvaW5jbHVkZS9hc20taWE2NC9wZ2FsbG9jLmgKaW5kZXggNTU2ZDk4OC4uYjlhYzFhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9wZ2FsbG9jLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9wZ2FsbG9jLmgKQEAgLTcwLDEwICs3MCwxMSBAQAogI2RlZmluZSBfX3BtZF9mcmVlX3RsYih0bGIsIHBtZCkJcG1kX2ZyZWUoKHRsYiktPm1tLCBwbWQpCiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotcG1kX3BvcHVsYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqIHBtZF9lbnRyeSwgc3RydWN0IHBhZ2UgKnB0ZSkKK3BtZF9wb3B1bGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcG1kX3QgKiBwbWRfZW50cnksIHBndGFibGVfdCBwdGUpCiB7CiAJcG1kX3ZhbCgqcG1kX2VudHJ5KSA9IHBhZ2VfdG9fcGh5cyhwdGUpOwogfQorI2RlZmluZSBwbWRfcGd0YWJsZShwbWQpIHBtZF9wYWdlKHBtZCkKIAogc3RhdGljIGlubGluZSB2b2lkCiBwbWRfcG9wdWxhdGVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqIHBtZF9lbnRyeSwgcHRlX3QgKiBwdGUpCkBAIC04MSwxMSArODIsMTcgQEAKIAlwbWRfdmFsKCpwbWRfZW50cnkpID0gX19wYShwdGUpOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpwdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAotCQkJCQkgdW5zaWduZWQgbG9uZyBhZGRyKQorc3RhdGljIGlubGluZSBwZ3RhYmxlX3QgcHRlX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKQogewotCXZvaWQgKnBnID0gcXVpY2tsaXN0X2FsbG9jKDAsIEdGUF9LRVJORUwsIE5VTEwpOwotCXJldHVybiBwZyA/IHZpcnRfdG9fcGFnZShwZykgOiBOVUxMOworCXN0cnVjdCBwYWdlICpwYWdlOworCXZvaWQgKnBnOworCisJcGcgPSBxdWlja2xpc3RfYWxsb2MoMCwgR0ZQX0tFUk5FTCwgTlVMTCk7CisJaWYgKCFwZykKKwkJcmV0dXJuIE5VTEw7CisJcGFnZSA9IHZpcnRfdG9fcGFnZShwZyk7CisJcGd0YWJsZV9wYWdlX2N0b3IocGFnZSk7CisJcmV0dXJuIHBhZ2U7CiB9CiAKIHN0YXRpYyBpbmxpbmUgcHRlX3QgKnB0ZV9hbGxvY19vbmVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLApAQCAtOTQsOCArMTAxLDkgQEAKIAlyZXR1cm4gcXVpY2tsaXN0X2FsbG9jKDAsIEdGUF9LRVJORUwsIE5VTEwpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBwYWdlICpwdGUpCitzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBndGFibGVfdCBwdGUpCiB7CisJcGd0YWJsZV9wYWdlX2R0b3IocHRlKTsKIAlxdWlja2xpc3RfZnJlZV9wYWdlKDAsIE5VTEwsIHB0ZSk7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvcHRyYWNlLmggYi9pbmNsdWRlL2FzbS1pYTY0L3B0cmFjZS5oCmluZGV4IGY0ZWY4N2EuLjBiZGNlN2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvcHRyYWNlLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9wdHJhY2UuaApAQCAtMjkyLDYgKzI5Miw3IEBACiAJCQkgdW5zaWduZWQgbG9uZywgbG9uZyk7CiAgIGV4dGVybiB2b2lkIGlhNjRfZmx1c2hfZnBoIChzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CiAgIGV4dGVybiB2b2lkIGlhNjRfc3luY19mcGggKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKKyAgZXh0ZXJuIHZvaWQgaWE2NF9zeW5jX2tyYnModm9pZCk7CiAgIGV4dGVybiBsb25nIGlhNjRfc3luY191c2VyX3JicyAoc3RydWN0IHRhc2tfc3RydWN0ICosIHN0cnVjdCBzd2l0Y2hfc3RhY2sgKiwKIAkJCQkgIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwogCkBAIC0zMDMsNiArMzA0LDE2IEBACiAgIGV4dGVybiB2b2lkIGlhNjRfaW5jcmVtZW50X2lwIChzdHJ1Y3QgcHRfcmVncyAqcHQpOwogICBleHRlcm4gdm9pZCBpYTY0X2RlY3JlbWVudF9pcCAoc3RydWN0IHB0X3JlZ3MgKnB0KTsKIAorICBleHRlcm4gdm9pZCBpYTY0X3B0cmFjZV9zdG9wKHZvaWQpOworICAjZGVmaW5lIGFyY2hfcHRyYWNlX3N0b3AoY29kZSwgaW5mbykgXAorCWlhNjRfcHRyYWNlX3N0b3AoKQorICAjZGVmaW5lIGFyY2hfcHRyYWNlX3N0b3BfbmVlZGVkKGNvZGUsIGluZm8pIFwKKwkoIXRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfUlNFKSkKKworICBleHRlcm4gdm9pZCBwdHJhY2VfYXR0YWNoX3N5bmNfdXNlcl9yYnMgKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKKyAgI2RlZmluZSBhcmNoX3B0cmFjZV9hdHRhY2goY2hpbGQpIFwKKwlwdHJhY2VfYXR0YWNoX3N5bmNfdXNlcl9yYnMoY2hpbGQpCisKICNlbmRpZiAvKiAhX19LRVJORUxfXyAqLwogCiAvKiBwdF9hbGxfdXNlcl9yZWdzIGlzIHVzZWQgZm9yIFBUUkFDRV9HRVRSRUdTIFBUUkFDRV9TRVRSRUdTICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1pYTY0L3RocmVhZF9pbmZvLmgKaW5kZXggZDE2MDMxZS4uOTNkODNjYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvdGhyZWFkX2luZm8uaApAQCAtNzEsNiArNzEsOSBAQAogI2RlZmluZSBhbGxvY190YXNrX3N0cnVjdCgpCSgoc3RydWN0IHRhc2tfc3RydWN0ICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMIHwgX19HRlBfQ09NUCwgS0VSTkVMX1NUQUNLX1NJWkVfT1JERVIpKQogI2RlZmluZSBmcmVlX3Rhc2tfc3RydWN0KHRzaykJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgKHRzayksIEtFUk5FTF9TVEFDS19TSVpFX09SREVSKQogCisjZGVmaW5lIHRza19zZXRfbm90aWZ5X3Jlc3VtZSh0c2spIFwKKwlzZXRfdGlfdGhyZWFkX2ZsYWcodGFza190aHJlYWRfaW5mbyh0c2spLCBUSUZfTk9USUZZX1JFU1VNRSkKK2V4dGVybiB2b2lkIHRza19jbGVhcl9ub3RpZnlfcmVzdW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKICNlbmRpZiAvKiAhX19BU1NFTUJMWSAqLwogCiAvKgpAQCAtODUsMjggKzg4LDMwIEBACiAjZGVmaW5lIFRJRl9TWVNDQUxMX0FVRElUCTMJLyogc3lzY2FsbCBhdWRpdGluZyBhY3RpdmUgKi8KICNkZWZpbmUgVElGX1NJTkdMRVNURVAJCTQJLyogcmVzdG9yZSBzaW5nbGVzdGVwIG9uIHJldHVybiB0byB1c2VyIG1vZGUgKi8KICNkZWZpbmUgVElGX1JFU1RPUkVfU0lHTUFTSwk1CS8qIHJlc3RvcmUgc2lnbmFsIG1hc2sgaW4gZG9fc2lnbmFsKCkgKi8KLSNkZWZpbmUgVElGX1BFUkZNT05fV09SSwk2CS8qIHdvcmsgZm9yIHBmbV9oYW5kbGVfd29yaygpICovCisjZGVmaW5lIFRJRl9OT1RJRllfUkVTVU1FCTYJLyogcmVzdW1wdGlvbiBub3RpZmljYXRpb24gcmVxdWVzdGVkICovCiAjZGVmaW5lIFRJRl9QT0xMSU5HX05SRkxBRwkxNgkvKiB0cnVlIGlmIHBvbGxfaWRsZSgpIGlzIHBvbGxpbmcgVElGX05FRURfUkVTQ0hFRCAqLwogI2RlZmluZSBUSUZfTUVNRElFCQkxNwogI2RlZmluZSBUSUZfTUNBX0lOSVQJCTE4CS8qIHRoaXMgdGFzayBpcyBwcm9jZXNzaW5nIE1DQSBvciBJTklUICovCiAjZGVmaW5lIFRJRl9EQl9ESVNBQkxFRAkJMTkJLyogZGVidWcgdHJhcCBkaXNhYmxlZCBmb3IgZnN5c2NhbGwgKi8KICNkZWZpbmUgVElGX0ZSRUVaRQkJMjAJLyogaXMgZnJlZXppbmcgZm9yIHN1c3BlbmQgKi8KKyNkZWZpbmUgVElGX1JFU1RPUkVfUlNFCQkyMQkvKiB1c2VyIFJCUyBpcyBuZXdlciB0aGFuIGtlcm5lbCBSQlMgKi8KIAogI2RlZmluZSBfVElGX1NZU0NBTExfVFJBQ0UJKDEgPDwgVElGX1NZU0NBTExfVFJBQ0UpCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9BVURJVAkoMSA8PCBUSUZfU1lTQ0FMTF9BVURJVCkKICNkZWZpbmUgX1RJRl9TSU5HTEVTVEVQCQkoMSA8PCBUSUZfU0lOR0xFU1RFUCkKICNkZWZpbmUgX1RJRl9TWVNDQUxMX1RSQUNFQVVESVQJKF9USUZfU1lTQ0FMTF9UUkFDRXxfVElGX1NZU0NBTExfQVVESVR8X1RJRl9TSU5HTEVTVEVQKQogI2RlZmluZSBfVElGX1JFU1RPUkVfU0lHTUFTSwkoMSA8PCBUSUZfUkVTVE9SRV9TSUdNQVNLKQotI2RlZmluZSBfVElGX1BFUkZNT05fV09SSwkoMSA8PCBUSUZfUEVSRk1PTl9XT1JLKQorI2RlZmluZSBfVElGX05PVElGWV9SRVNVTUUJKDEgPDwgVElGX05PVElGWV9SRVNVTUUpCiAjZGVmaW5lIF9USUZfU0lHUEVORElORwkJKDEgPDwgVElGX1NJR1BFTkRJTkcpCiAjZGVmaW5lIF9USUZfTkVFRF9SRVNDSEVECSgxIDw8IFRJRl9ORUVEX1JFU0NIRUQpCiAjZGVmaW5lIF9USUZfUE9MTElOR19OUkZMQUcJKDEgPDwgVElGX1BPTExJTkdfTlJGTEFHKQogI2RlZmluZSBfVElGX01DQV9JTklUCQkoMSA8PCBUSUZfTUNBX0lOSVQpCiAjZGVmaW5lIF9USUZfREJfRElTQUJMRUQJKDEgPDwgVElGX0RCX0RJU0FCTEVEKQogI2RlZmluZSBfVElGX0ZSRUVaRQkJKDEgPDwgVElGX0ZSRUVaRSkKKyNkZWZpbmUgX1RJRl9SRVNUT1JFX1JTRQkoMSA8PCBUSUZfUkVTVE9SRV9SU0UpCiAKIC8qICJ3b3JrIHRvIGRvIG9uIHVzZXItcmV0dXJuIiBiaXRzICovCi0jZGVmaW5lIFRJRl9BTExXT1JLX01BU0sJKF9USUZfU0lHUEVORElOR3xfVElGX1BFUkZNT05fV09SS3xfVElGX1NZU0NBTExfQVVESVR8XAorI2RlZmluZSBUSUZfQUxMV09SS19NQVNLCShfVElGX1NJR1BFTkRJTkd8X1RJRl9OT1RJRllfUkVTVU1FfF9USUZfU1lTQ0FMTF9BVURJVHxcCiAJCQkJIF9USUZfTkVFRF9SRVNDSEVEfCBfVElGX1NZU0NBTExfVFJBQ0V8XAogCQkJCSBfVElGX1JFU1RPUkVfU0lHTUFTSykKIC8qIGxpa2UgVElGX0FMTFdPUktfQklUUyBidXQgc2FucyBUSUZfU1lTQ0FMTF9UUkFDRSBvciBUSUZfU1lTQ0FMTF9BVURJVCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLWlhNjQvdW5pc3RkLmgKaW5kZXggMzE1ZjhkZS4uZTYwMzE0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3VuaXN0ZC5oCkBAIC0yOTksMTEgKzI5OSwxNCBAQAogI2RlZmluZSBfX05SX3NpZ25hbGZkCQkJMTMwNwogI2RlZmluZSBfX05SX3RpbWVyZmQJCQkxMzA4CiAjZGVmaW5lIF9fTlJfZXZlbnRmZAkJCTEzMDkKKyNkZWZpbmUgX19OUl90aW1lcmZkX2NyZWF0ZQkJMTMxMAorI2RlZmluZSBfX05SX3RpbWVyZmRfc2V0dGltZQkJMTMxMQorI2RlZmluZSBfX05SX3RpbWVyZmRfZ2V0dGltZQkJMTMxMgogCiAjaWZkZWYgX19LRVJORUxfXwogCiAKLSNkZWZpbmUgTlJfc3lzY2FsbHMJCQkyODYgLyogbGVuZ3RoIG9mIHN5c2NhbGwgdGFibGUgKi8KKyNkZWZpbmUgTlJfc3lzY2FsbHMJCQkyODkgLyogbGVuZ3RoIG9mIHN5c2NhbGwgdGFibGUgKi8KIAogLyoKICAqIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBzdG9wIHNjcmlwdHMvY2hlY2tzeXNjYWxscy5zaCBmcm9tIGNvbXBsYWluaW5nIGFib3V0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3VzZXIuaCBiL2luY2x1ZGUvYXNtLWlhNjQvdXNlci5oCmluZGV4IDc4ZTVhMjAuLjhiOTgyMTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvdXNlci5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvdXNlci5oCkBAIC00NCw3ICs0NCw3IEBACiAJdW5zaWduZWQgbG9uZwlzdGFydF9kYXRhOwkJLyogZGF0YSBzdGFydGluZyBhZGRyZXNzICovCiAJdW5zaWduZWQgbG9uZwlzdGFydF9zdGFjazsJCS8qIHN0YWNrIHN0YXJ0aW5nIGFkZHJlc3MgKi8KIAlsb25nIGludAlzaWduYWw7CQkJLyogc2lnbmFsIGNhdXNpbmcgY29yZSBkdW1wICovCi0Jc3RydWN0IHJlZ3MgKgl1X2FyMDsJCQkvKiBoZWxwIGdkYiBmaW5kIHJlZ2lzdGVycyAqLworCXVuc2lnbmVkIGxvbmcJdV9hcjA7CQkJLyogaGVscCBnZGIgZmluZCByZWdpc3RlcnMgKi8KIAl1bnNpZ25lZCBsb25nCW1hZ2ljOwkJCS8qIGlkZW50aWZpZXMgYSBjb3JlIGZpbGUgKi8KIAljaGFyCQl1X2NvbW1bMzJdOwkJLyogdXNlciBjb21tYW5kIG5hbWUgKi8KIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL2Eub3V0LmggYi9pbmNsdWRlL2FzbS1tMzJyL2Eub3V0LmgKaW5kZXggNmExYjVkNC4uYWIxNTBmNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9hLm91dC5oCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvYS5vdXQuaApAQCAtMTcsMTEgKzE3LDQgQEAKICNkZWZpbmUgTl9EUlNJWkUoYSkJKChhKS5hX2Ryc2l6ZSkKICNkZWZpbmUgTl9TWU1TSVpFKGEpCSgoYSkuYV9zeW1zKQogCi0jaWZkZWYgX19LRVJORUxfXwotCi0jZGVmaW5lIFNUQUNLX1RPUAlUQVNLX1NJWkUKLSNkZWZpbmUgU1RBQ0tfVE9QX01BWAlTVEFDS19UT1AKLQotI2VuZGlmCi0KICNlbmRpZiAvKiBfQVNNX00zMlJfQV9PVVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9lbGYuaCBiL2luY2x1ZGUvYXNtLW0zMnIvZWxmLmgKaW5kZXggYmJlZThiMi4uNjdiY2Q3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9lbGYuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL2VsZi5oCkBAIC0xMjksOCArMTI5LDYgQEAKICAgIGludGVudCB0aGFuIHBva2luZyBhdCB1bmFtZSBvciAvcHJvYy9jcHVpbmZvLiAgKi8KICNkZWZpbmUgRUxGX1BMQVRGT1JNCShOVUxMKQogCi0jaWZkZWYgX19LRVJORUxfXwogI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgsIGliY3MyKSBzZXRfcGVyc29uYWxpdHkoUEVSX0xJTlVYKQotI2VuZGlmCiAKICNlbmRpZiAgLyogX0FTTV9NMzJSX19FTEZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9sb2NhbC5oIGIvaW5jbHVkZS9hc20tbTMyci9sb2NhbC5oCmluZGV4IGRlZjI5ZDAuLjIyMjU2ZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvbG9jYWwuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL2xvY2FsLmgKQEAgLTEsNiArMSwzNjYgQEAKICNpZm5kZWYgX19NMzJSX0xPQ0FMX0gKICNkZWZpbmUgX19NMzJSX0xPQ0FMX0gKIAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2xvY2FsLmg+CisvKgorICogIGxpbnV4L2luY2x1ZGUvYXNtLW0zMnIvbG9jYWwuaAorICoKKyAqICBNMzJSIHZlcnNpb246CisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgIEhpdG9zaGkgWWFtYW1vdG8KKyAqICAgIENvcHlyaWdodCAoQykgMjAwNCAgSGlyb2thenUgVGFrYXRhIDx0YWthdGEgYXQgbGludXgtbTMyci5vcmc+CisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDcgIE1hdGhpZXUgRGVzbm95ZXJzIDxtYXRoaWV1LmRlc25veWVyc0Bwb2x5bXRsLmNhPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9sb2NhbC5oPgorCisvKgorICogQXRvbWljIG9wZXJhdGlvbnMgdGhhdCBDIGNhbid0IGd1YXJhbnRlZSB1cy4gIFVzZWZ1bCBmb3IKKyAqIHJlc291cmNlIGNvdW50aW5nIGV0Yy4uCisgKi8KKworLyoKKyAqIE1ha2Ugc3VyZSBnY2MgZG9lc24ndCB0cnkgdG8gYmUgY2xldmVyIGFuZCBtb3ZlIHRoaW5ncyBhcm91bmQKKyAqIG9uIHVzLiBXZSBuZWVkIHRvIHVzZSBfZXhhY3RseV8gdGhlIGFkZHJlc3MgdGhlIHVzZXIgZ2F2ZSB1cywKKyAqIG5vdCBzb21lIGFsaWFzIHRoYXQgY29udGFpbnMgdGhlIHNhbWUgaW5mb3JtYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgaW50IGNvdW50ZXI7IH0gbG9jYWxfdDsKKworI2RlZmluZSBMT0NBTF9JTklUKGkpCXsgKGkpIH0KKworLyoqCisgKiBsb2NhbF9yZWFkIC0gcmVhZCBsb2NhbCB2YXJpYWJsZQorICogQGw6IHBvaW50ZXIgb2YgdHlwZSBsb2NhbF90CisgKgorICogQXRvbWljYWxseSByZWFkcyB0aGUgdmFsdWUgb2YgQGwuCisgKi8KKyNkZWZpbmUgbG9jYWxfcmVhZChsKQkoKGwpLT5jb3VudGVyKQorCisvKioKKyAqIGxvY2FsX3NldCAtIHNldCBsb2NhbCB2YXJpYWJsZQorICogQGw6IHBvaW50ZXIgb2YgdHlwZSBsb2NhbF90CisgKiBAaTogcmVxdWlyZWQgdmFsdWUKKyAqCisgKiBBdG9taWNhbGx5IHNldHMgdGhlIHZhbHVlIG9mIEBsIHRvIEBpLgorICovCisjZGVmaW5lIGxvY2FsX3NldChsLCBpKQkoKChsKS0+Y291bnRlcikgPSAoaSkpCisKKy8qKgorICogbG9jYWxfYWRkX3JldHVybiAtIGFkZCBsb25nIHRvIGxvY2FsIHZhcmlhYmxlIGFuZCByZXR1cm4gaXQKKyAqIEBpOiBsb25nIHZhbHVlIHRvIGFkZAorICogQGw6IHBvaW50ZXIgb2YgdHlwZSBsb2NhbF90CisgKgorICogQXRvbWljYWxseSBhZGRzIEBpIHRvIEBsIGFuZCByZXR1cm4gKEBpICsgQGwpLgorICovCitzdGF0aWMgaW5saW5lIGxvbmcgbG9jYWxfYWRkX3JldHVybihsb25nIGksIGxvY2FsX3QgKmwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlsb25nIHJlc3VsdDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSIjIGxvY2FsX2FkZF9yZXR1cm4JCVxuXHQiCisJCURDQUNIRV9DTEVBUigiJTAiLCAicjQiLCAiJTEiKQorCQkibGQgJTAsIEAlMTsJCQlcblx0IgorCQkiYWRkCSUwLCAlMjsJCQlcblx0IgorCQkic3QgJTAsIEAlMTsJCQlcblx0IgorCQk6ICI9JnIiIChyZXN1bHQpCisJCTogInIiICgmbC0+Y291bnRlciksICJyIiAoaSkKKwkJOiAibWVtb3J5IgorI2lmZGVmIENPTkZJR19DSElQX00zMjcwMF9UUzEKKwkJLCAicjQiCisjZW5kaWYJLyogQ09ORklHX0NISVBfTTMyNzAwX1RTMSAqLworCSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBsb2NhbF9zdWJfcmV0dXJuIC0gc3VidHJhY3QgbG9uZyBmcm9tIGxvY2FsIHZhcmlhYmxlIGFuZCByZXR1cm4gaXQKKyAqIEBpOiBsb25nIHZhbHVlIHRvIHN1YnRyYWN0CisgKiBAbDogcG9pbnRlciBvZiB0eXBlIGxvY2FsX3QKKyAqCisgKiBBdG9taWNhbGx5IHN1YnRyYWN0cyBAaSBmcm9tIEBsIGFuZCByZXR1cm4gKEBsIC0gQGkpLgorICovCitzdGF0aWMgaW5saW5lIGxvbmcgbG9jYWxfc3ViX3JldHVybihsb25nIGksIGxvY2FsX3QgKmwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlsb25nIHJlc3VsdDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSIjIGxvY2FsX3N1Yl9yZXR1cm4JCVxuXHQiCisJCURDQUNIRV9DTEVBUigiJTAiLCAicjQiLCAiJTEiKQorCQkibGQgJTAsIEAlMTsJCQlcblx0IgorCQkic3ViCSUwLCAlMjsJCQlcblx0IgorCQkic3QgJTAsIEAlMTsJCQlcblx0IgorCQk6ICI9JnIiIChyZXN1bHQpCisJCTogInIiICgmbC0+Y291bnRlciksICJyIiAoaSkKKwkJOiAibWVtb3J5IgorI2lmZGVmIENPTkZJR19DSElQX00zMjcwMF9UUzEKKwkJLCAicjQiCisjZW5kaWYJLyogQ09ORklHX0NISVBfTTMyNzAwX1RTMSAqLworCSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBsb2NhbF9hZGQgLSBhZGQgbG9uZyB0byBsb2NhbCB2YXJpYWJsZQorICogQGk6IGxvbmcgdmFsdWUgdG8gYWRkCisgKiBAbDogcG9pbnRlciBvZiB0eXBlIGxvY2FsX3QKKyAqCisgKiBBdG9taWNhbGx5IGFkZHMgQGkgdG8gQGwuCisgKi8KKyNkZWZpbmUgbG9jYWxfYWRkKGksIGwpICgodm9pZCkgbG9jYWxfYWRkX3JldHVybigoaSksIChsKSkpCisKKy8qKgorICogbG9jYWxfc3ViIC0gc3VidHJhY3QgdGhlIGxvY2FsIHZhcmlhYmxlCisgKiBAaTogbG9uZyB2YWx1ZSB0byBzdWJ0cmFjdAorICogQGw6IHBvaW50ZXIgb2YgdHlwZSBsb2NhbF90CisgKgorICogQXRvbWljYWxseSBzdWJ0cmFjdHMgQGkgZnJvbSBAbC4KKyAqLworI2RlZmluZSBsb2NhbF9zdWIoaSwgbCkgKCh2b2lkKSBsb2NhbF9zdWJfcmV0dXJuKChpKSwgKGwpKSkKKworLyoqCisgKiBsb2NhbF9zdWJfYW5kX3Rlc3QgLSBzdWJ0cmFjdCB2YWx1ZSBmcm9tIHZhcmlhYmxlIGFuZCB0ZXN0IHJlc3VsdAorICogQGk6IGludGVnZXIgdmFsdWUgdG8gc3VidHJhY3QKKyAqIEBsOiBwb2ludGVyIG9mIHR5cGUgbG9jYWxfdAorICoKKyAqIEF0b21pY2FsbHkgc3VidHJhY3RzIEBpIGZyb20gQGwgYW5kIHJldHVybnMKKyAqIHRydWUgaWYgdGhlIHJlc3VsdCBpcyB6ZXJvLCBvciBmYWxzZSBmb3IgYWxsCisgKiBvdGhlciBjYXNlcy4KKyAqLworI2RlZmluZSBsb2NhbF9zdWJfYW5kX3Rlc3QoaSwgbCkgKGxvY2FsX3N1Yl9yZXR1cm4oKGkpLCAobCkpID09IDApCisKKy8qKgorICogbG9jYWxfaW5jX3JldHVybiAtIGluY3JlbWVudCBsb2NhbCB2YXJpYWJsZSBhbmQgcmV0dXJuIGl0CisgKiBAbDogcG9pbnRlciBvZiB0eXBlIGxvY2FsX3QKKyAqCisgKiBBdG9taWNhbGx5IGluY3JlbWVudHMgQGwgYnkgMSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICovCitzdGF0aWMgaW5saW5lIGxvbmcgbG9jYWxfaW5jX3JldHVybihsb2NhbF90ICpsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJbG9uZyByZXN1bHQ7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiIyBsb2NhbF9pbmNfcmV0dXJuCQlcblx0IgorCQlEQ0FDSEVfQ0xFQVIoIiUwIiwgInI0IiwgIiUxIikKKwkJImxkICUwLCBAJTE7CQkJXG5cdCIKKwkJImFkZGkJJTAsICMxOwkJCVxuXHQiCisJCSJzdCAlMCwgQCUxOwkJCVxuXHQiCisJCTogIj0mciIgKHJlc3VsdCkKKwkJOiAiciIgKCZsLT5jb3VudGVyKQorCQk6ICJtZW1vcnkiCisjaWZkZWYgQ09ORklHX0NISVBfTTMyNzAwX1RTMQorCQksICJyNCIKKyNlbmRpZgkvKiBDT05GSUdfQ0hJUF9NMzI3MDBfVFMxICovCisJKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIGxvY2FsX2RlY19yZXR1cm4gLSBkZWNyZW1lbnQgbG9jYWwgdmFyaWFibGUgYW5kIHJldHVybiBpdAorICogQGw6IHBvaW50ZXIgb2YgdHlwZSBsb2NhbF90CisgKgorICogQXRvbWljYWxseSBkZWNyZW1lbnRzIEBsIGJ5IDEgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KKyAqLworc3RhdGljIGlubGluZSBsb25nIGxvY2FsX2RlY19yZXR1cm4obG9jYWxfdCAqbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWxvbmcgcmVzdWx0OworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIiMgbG9jYWxfZGVjX3JldHVybgkJXG5cdCIKKwkJRENBQ0hFX0NMRUFSKCIlMCIsICJyNCIsICIlMSIpCisJCSJsZCAlMCwgQCUxOwkJCVxuXHQiCisJCSJhZGRpCSUwLCAjLTE7CQlcblx0IgorCQkic3QgJTAsIEAlMTsJCQlcblx0IgorCQk6ICI9JnIiIChyZXN1bHQpCisJCTogInIiICgmbC0+Y291bnRlcikKKwkJOiAibWVtb3J5IgorI2lmZGVmIENPTkZJR19DSElQX00zMjcwMF9UUzEKKwkJLCAicjQiCisjZW5kaWYJLyogQ09ORklHX0NISVBfTTMyNzAwX1RTMSAqLworCSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBsb2NhbF9pbmMgLSBpbmNyZW1lbnQgbG9jYWwgdmFyaWFibGUKKyAqIEBsOiBwb2ludGVyIG9mIHR5cGUgbG9jYWxfdAorICoKKyAqIEF0b21pY2FsbHkgaW5jcmVtZW50cyBAbCBieSAxLgorICovCisjZGVmaW5lIGxvY2FsX2luYyhsKSAoKHZvaWQpbG9jYWxfaW5jX3JldHVybihsKSkKKworLyoqCisgKiBsb2NhbF9kZWMgLSBkZWNyZW1lbnQgbG9jYWwgdmFyaWFibGUKKyAqIEBsOiBwb2ludGVyIG9mIHR5cGUgbG9jYWxfdAorICoKKyAqIEF0b21pY2FsbHkgZGVjcmVtZW50cyBAbCBieSAxLgorICovCisjZGVmaW5lIGxvY2FsX2RlYyhsKSAoKHZvaWQpbG9jYWxfZGVjX3JldHVybihsKSkKKworLyoqCisgKiBsb2NhbF9pbmNfYW5kX3Rlc3QgLSBpbmNyZW1lbnQgYW5kIHRlc3QKKyAqIEBsOiBwb2ludGVyIG9mIHR5cGUgbG9jYWxfdAorICoKKyAqIEF0b21pY2FsbHkgaW5jcmVtZW50cyBAbCBieSAxCisgKiBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSByZXN1bHQgaXMgemVybywgb3IgZmFsc2UgZm9yIGFsbAorICogb3RoZXIgY2FzZXMuCisgKi8KKyNkZWZpbmUgbG9jYWxfaW5jX2FuZF90ZXN0KGwpIChsb2NhbF9pbmNfcmV0dXJuKGwpID09IDApCisKKy8qKgorICogbG9jYWxfZGVjX2FuZF90ZXN0IC0gZGVjcmVtZW50IGFuZCB0ZXN0CisgKiBAbDogcG9pbnRlciBvZiB0eXBlIGxvY2FsX3QKKyAqCisgKiBBdG9taWNhbGx5IGRlY3JlbWVudHMgQGwgYnkgMSBhbmQKKyAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgcmVzdWx0IGlzIDAsIG9yIGZhbHNlIGZvciBhbGwKKyAqIG90aGVyIGNhc2VzLgorICovCisjZGVmaW5lIGxvY2FsX2RlY19hbmRfdGVzdChsKSAobG9jYWxfZGVjX3JldHVybihsKSA9PSAwKQorCisvKioKKyAqIGxvY2FsX2FkZF9uZWdhdGl2ZSAtIGFkZCBhbmQgdGVzdCBpZiBuZWdhdGl2ZQorICogQGw6IHBvaW50ZXIgb2YgdHlwZSBsb2NhbF90CisgKiBAaTogaW50ZWdlciB2YWx1ZSB0byBhZGQKKyAqCisgKiBBdG9taWNhbGx5IGFkZHMgQGkgdG8gQGwgYW5kIHJldHVybnMgdHJ1ZQorICogaWYgdGhlIHJlc3VsdCBpcyBuZWdhdGl2ZSwgb3IgZmFsc2Ugd2hlbgorICogcmVzdWx0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB6ZXJvLgorICovCisjZGVmaW5lIGxvY2FsX2FkZF9uZWdhdGl2ZShpLCBsKSAobG9jYWxfYWRkX3JldHVybigoaSksIChsKSkgPCAwKQorCisjZGVmaW5lIGxvY2FsX2NtcHhjaGcobCwgbywgbikgKGNtcHhjaGdfbG9jYWwoJigobCktPmNvdW50ZXIpLCAobyksIChuKSkpCisjZGVmaW5lIGxvY2FsX3hjaGcodiwgbmV3KSAoeGNoZ19sb2NhbCgmKChsKS0+Y291bnRlciksIG5ldykpCisKKy8qKgorICogbG9jYWxfYWRkX3VubGVzcyAtIGFkZCB1bmxlc3MgdGhlIG51bWJlciBpcyBhIGdpdmVuIHZhbHVlCisgKiBAbDogcG9pbnRlciBvZiB0eXBlIGxvY2FsX3QKKyAqIEBhOiB0aGUgYW1vdW50IHRvIGFkZCB0byBsLi4uCisgKiBAdTogLi4udW5sZXNzIGwgaXMgZXF1YWwgdG8gdS4KKyAqCisgKiBBdG9taWNhbGx5IGFkZHMgQGEgdG8gQGwsIHNvIGxvbmcgYXMgaXQgd2FzIG5vdCBAdS4KKyAqIFJldHVybnMgbm9uLXplcm8gaWYgQGwgd2FzIG5vdCBAdSwgYW5kIHplcm8gb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW5saW5lIGludCBsb2NhbF9hZGRfdW5sZXNzKGxvY2FsX3QgKmwsIGxvbmcgYSwgbG9uZyB1KQoreworCWxvbmcgYywgb2xkOworCWMgPSBsb2NhbF9yZWFkKGwpOworCWZvciAoOzspIHsKKwkJaWYgKHVubGlrZWx5KGMgPT0gKHUpKSkKKwkJCWJyZWFrOworCQlvbGQgPSBsb2NhbF9jbXB4Y2hnKChsKSwgYywgYyArIChhKSk7CisJCWlmIChsaWtlbHkob2xkID09IGMpKQorCQkJYnJlYWs7CisJCWMgPSBvbGQ7CisJfQorCXJldHVybiBjICE9ICh1KTsKK30KKworI2RlZmluZSBsb2NhbF9pbmNfbm90X3plcm8obCkgbG9jYWxfYWRkX3VubGVzcygobCksIDEsIDApCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2NhbF9jbGVhcl9tYXNrKHVuc2lnbmVkIGxvbmcgIG1hc2ssIGxvY2FsX3QgKmFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSIjIGxvY2FsX2NsZWFyX21hc2sJCVxuXHQiCisJCURDQUNIRV9DTEVBUigiJTAiLCAicjUiLCAiJTEiKQorCQkibGQgJTAsIEAlMTsJCQlcblx0IgorCQkiYW5kCSUwLCAlMjsJCQlcblx0IgorCQkic3QgJTAsIEAlMTsJCQlcblx0IgorCQk6ICI9JnIiICh0bXApCisJCTogInIiIChhZGRyKSwgInIiICh+bWFzaykKKwkJOiAibWVtb3J5IgorI2lmZGVmIENPTkZJR19DSElQX00zMjcwMF9UUzEKKwkJLCAicjUiCisjZW5kaWYJLyogQ09ORklHX0NISVBfTTMyNzAwX1RTMSAqLworCSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbG9jYWxfc2V0X21hc2sodW5zaWduZWQgbG9uZyAgbWFzaywgbG9jYWxfdCAqYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIiMgbG9jYWxfc2V0X21hc2sJCVxuXHQiCisJCURDQUNIRV9DTEVBUigiJTAiLCAicjUiLCAiJTEiKQorCQkibGQgJTAsIEAlMTsJCQlcblx0IgorCQkib3IJJTAsICUyOwkJCVxuXHQiCisJCSJzdCAlMCwgQCUxOwkJCVxuXHQiCisJCTogIj0mciIgKHRtcCkKKwkJOiAiciIgKGFkZHIpLCAiciIgKG1hc2spCisJCTogIm1lbW9yeSIKKyNpZmRlZiBDT05GSUdfQ0hJUF9NMzI3MDBfVFMxCisJCSwgInI1IgorI2VuZGlmCS8qIENPTkZJR19DSElQX00zMjcwMF9UUzEgKi8KKwkpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyogQXRvbWljIG9wZXJhdGlvbnMgYXJlIGFscmVhZHkgc2VyaWFsaXppbmcgb24gbTMyciAqLworI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9sb2NhbF9kZWMoKQliYXJyaWVyKCkKKyNkZWZpbmUgc21wX21iX19hZnRlcl9sb2NhbF9kZWMoKQliYXJyaWVyKCkKKyNkZWZpbmUgc21wX21iX19iZWZvcmVfbG9jYWxfaW5jKCkJYmFycmllcigpCisjZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfbG9jYWxfaW5jKCkJYmFycmllcigpCisKKy8qIFVzZSB0aGVzZSBmb3IgcGVyLWNwdSBsb2NhbF90IHZhcmlhYmxlczogb24gc29tZSBhcmNocyB0aGV5IGFyZQorICogbXVjaCBtb3JlIGVmZmljaWVudCB0aGFuIHRoZXNlIG5haXZlIGltcGxlbWVudGF0aW9ucy4gIE5vdGUgdGhleSB0YWtlCisgKiBhIHZhcmlhYmxlLCBub3QgYW4gYWRkcmVzcy4KKyAqLworCisjZGVmaW5lIF9fbG9jYWxfaW5jKGwpCQkoKGwpLT5hLmNvdW50ZXIrKykKKyNkZWZpbmUgX19sb2NhbF9kZWMobCkJCSgobCktPmEuY291bnRlcisrKQorI2RlZmluZSBfX2xvY2FsX2FkZChpLCBsKQkoKGwpLT5hLmNvdW50ZXIgKz0gKGkpKQorI2RlZmluZSBfX2xvY2FsX3N1YihpLCBsKQkoKGwpLT5hLmNvdW50ZXIgLT0gKGkpKQorCisvKiBVc2UgdGhlc2UgZm9yIHBlci1jcHUgbG9jYWxfdCB2YXJpYWJsZXM6IG9uIHNvbWUgYXJjaHMgdGhleSBhcmUKKyAqIG11Y2ggbW9yZSBlZmZpY2llbnQgdGhhbiB0aGVzZSBuYWl2ZSBpbXBsZW1lbnRhdGlvbnMuICBOb3RlIHRoZXkgdGFrZQorICogYSB2YXJpYWJsZSwgbm90IGFuIGFkZHJlc3MuCisgKi8KKworLyogTmVlZCB0byBkaXNhYmxlIHByZWVtcHRpb24gZm9yIHRoZSBjcHUgbG9jYWwgY291bnRlcnMgb3RoZXJ3aXNlIHdlIGNvdWxkCisgICBzdGlsbCBhY2Nlc3MgYSB2YXJpYWJsZSBvZiBhIHByZXZpb3VzIENQVSBpbiBhIG5vbiBsb2NhbCB3YXkuICovCisjZGVmaW5lIGNwdV9sb2NhbF93cmFwX3YobCkJIAlcCisJKHsgbG9jYWxfdCByZXNfXzsJCVwKKwkgICBwcmVlbXB0X2Rpc2FibGUoKTsgCQlcCisJICAgcmVzX18gPSAobCk7CQkJXAorCSAgIHByZWVtcHRfZW5hYmxlKCk7CQlcCisJICAgcmVzX187IH0pCisjZGVmaW5lIGNwdV9sb2NhbF93cmFwKGwpCQlcCisJKHsgcHJlZW1wdF9kaXNhYmxlKCk7CQlcCisJICAgbDsJCQkJXAorCSAgIHByZWVtcHRfZW5hYmxlKCk7IH0pCQlcCisKKyNkZWZpbmUgY3B1X2xvY2FsX3JlYWQobCkgICAgY3B1X2xvY2FsX3dyYXBfdihsb2NhbF9yZWFkKCZfX2dldF9jcHVfdmFyKGwpKSkKKyNkZWZpbmUgY3B1X2xvY2FsX3NldChsLCBpKSAgY3B1X2xvY2FsX3dyYXAobG9jYWxfc2V0KCZfX2dldF9jcHVfdmFyKGwpLCAoaSkpKQorI2RlZmluZSBjcHVfbG9jYWxfaW5jKGwpICAgICBjcHVfbG9jYWxfd3JhcChsb2NhbF9pbmMoJl9fZ2V0X2NwdV92YXIobCkpKQorI2RlZmluZSBjcHVfbG9jYWxfZGVjKGwpICAgICBjcHVfbG9jYWxfd3JhcChsb2NhbF9kZWMoJl9fZ2V0X2NwdV92YXIobCkpKQorI2RlZmluZSBjcHVfbG9jYWxfYWRkKGksIGwpICBjcHVfbG9jYWxfd3JhcChsb2NhbF9hZGQoKGkpLCAmX19nZXRfY3B1X3ZhcihsKSkpCisjZGVmaW5lIGNwdV9sb2NhbF9zdWIoaSwgbCkgIGNwdV9sb2NhbF93cmFwKGxvY2FsX3N1YigoaSksICZfX2dldF9jcHVfdmFyKGwpKSkKKworI2RlZmluZSBfX2NwdV9sb2NhbF9pbmMobCkJY3B1X2xvY2FsX2luYyhsKQorI2RlZmluZSBfX2NwdV9sb2NhbF9kZWMobCkJY3B1X2xvY2FsX2RlYyhsKQorI2RlZmluZSBfX2NwdV9sb2NhbF9hZGQoaSwgbCkJY3B1X2xvY2FsX2FkZCgoaSksIChsKSkKKyNkZWZpbmUgX19jcHVfbG9jYWxfc3ViKGksIGwpCWNwdV9sb2NhbF9zdWIoKGkpLCAobCkpCiAKICNlbmRpZiAvKiBfX00zMlJfTE9DQUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9wYWdlLmggYi9pbmNsdWRlL2FzbS1tMzJyL3BhZ2UuaAppbmRleCAwNGZkMTgzLi44YTY3N2YzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL3BhZ2UuaApAQCAtNiw3ICs2LDYgQEAKICNkZWZpbmUgUEFHRV9TSVpFCSgxVUwgPDwgUEFHRV9TSElGVCkKICNkZWZpbmUgUEFHRV9NQVNLCSh+KFBBR0VfU0laRS0xKSkKIAotI2lmZGVmIF9fS0VSTkVMX18KICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKIGV4dGVybiB2b2lkIGNsZWFyX3BhZ2Uodm9pZCAqdG8pOwpAQCAtMjksNiArMjgsNyBAQAogI2RlZmluZSBQVEVfTUFTSwlQQUdFX01BU0sKIAogdHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBsb25nIHBncHJvdDsgfSBwZ3Byb3RfdDsKK3R5cGVkZWYgc3RydWN0IHBhZ2UgKnBndGFibGVfdDsKIAogI2RlZmluZSBwbWRfdmFsKHgpCSgoeCkucG1kKQogI2RlZmluZSBwZ2RfdmFsKHgpCSgoeCkucGdkKQpAQCAtODcsNSArODcsNCBAQAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL21lbW9yeV9tb2RlbC5oPgogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BhZ2UuaD4KIAotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfQVNNX00zMlJfUEFHRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL3BhcmFtLmggYi9pbmNsdWRlL2FzbS1tMzJyL3BhcmFtLmgKaW5kZXggM2UxNDAyNi4uOTRjNzcwMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9wYXJhbS5oCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvcGFyYW0uaApAQCAtMiw3ICsyLDcgQEAKICNkZWZpbmUgX0FTTV9NMzJSX1BBUkFNX0gKIAogI2lmZGVmIF9fS0VSTkVMX18KLSMgZGVmaW5lIEhaCQkxMDAJCS8qIEludGVybmFsIGtlcm5lbCB0aW1lciBmcmVxdWVuY3kgKi8KKyMgZGVmaW5lIEhaCQlDT05GSUdfSFoJLyogSW50ZXJuYWwga2VybmVsIHRpbWVyIGZyZXF1ZW5jeSAqLwogIyBkZWZpbmUgVVNFUl9IWgkxMDAJCS8qIC4uIHNvbWUgdXNlciBpbnRlcmZhY2VzIGFyZSBpbiAidGlja3MiICovCiAjIGRlZmluZSBDTE9DS1NfUEVSX1NFQwkoVVNFUl9IWikJLyogbGlrZSB0aW1lcygpICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvcGdhbGxvYy5oIGIvaW5jbHVkZS9hc20tbTMyci9wZ2FsbG9jLmgKaW5kZXggZTU5MjFhZC4uZjExYTJiOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9wZ2FsbG9jLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci9wZ2FsbG9jLmgKQEAgLTksMTAgKzksMTEgQEAKIAlzZXRfcG1kKHBtZCwgX19wbWQoX1BBR0VfVEFCTEUgKyBfX3BhKHB0ZSkpKQogCiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHBtZF9wb3B1bGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcG1kX3QgKnBtZCwKLQlzdHJ1Y3QgcGFnZSAqcHRlKQorCXBndGFibGVfdCBwdGUpCiB7CiAJc2V0X3BtZChwbWQsIF9fcG1kKF9QQUdFX1RBQkxFICsgcGFnZV90b19waHlzKHB0ZSkpKTsKIH0KKyNkZWZpbmUgcG1kX3BndGFibGUocG1kKSBwbWRfcGFnZShwbWQpCiAKIC8qCiAgKiBBbGxvY2F0ZSBhbmQgZnJlZSBwYWdlIHRhYmxlcy4KQEAgLTM3LDEyICszOCwxMiBAQAogCXJldHVybiBwdGU7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBwYWdlICpwdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorc3RhdGljIF9faW5saW5lX18gcGd0YWJsZV90IHB0ZV9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewogCXN0cnVjdCBwYWdlICpwdGUgPSBhbGxvY19wYWdlKEdGUF9LRVJORUx8X19HRlBfWkVSTyk7CiAKLQorCXBndGFibGVfcGFnZV9jdG9yKHB0ZSk7CiAJcmV0dXJuIHB0ZTsKIH0KIApAQCAtNTEsOCArNTIsOSBAQAogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwdGUpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBwYWdlICpwdGUpCitzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBndGFibGVfdCBwdGUpCiB7CisJcGd0YWJsZV9wYWdlX2R0b3IocHRlKTsKIAlfX2ZyZWVfcGFnZShwdGUpOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL3Bvc2l4X3R5cGVzLmggYi9pbmNsdWRlL2FzbS1tMzJyL3Bvc2l4X3R5cGVzLmgKaW5kZXggMWNhYWM2NS4uYjMwOWM1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9wb3NpeF90eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvcG9zaXhfdHlwZXMuaApAQCAtMzksMTQgKzM5LDEwIEBACiAjZW5kaWYKIAogdHlwZWRlZiBzdHJ1Y3QgewotI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgZGVmaW5lZChfX1VTRV9BTEwpCiAJaW50CXZhbFsyXTsKLSNlbHNlIC8qICFkZWZpbmVkKF9fS0VSTkVMX18pICYmICFkZWZpbmVkKF9fVVNFX0FMTCkgKi8KLQlpbnQJX192YWxbMl07Ci0jZW5kaWYgLyogIWRlZmluZWQoX19LRVJORUxfXykgJiYgIWRlZmluZWQoX19VU0VfQUxMKSAqLwogfSBfX2tlcm5lbF9mc2lkX3Q7CiAKLSNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8ICFkZWZpbmVkKF9fR0xJQkNfXykgfHwgKF9fR0xJQkNfXyA8IDIpCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKQogCiAjdW5kZWYJX19GRF9TRVQKIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgX19GRF9TRVQodW5zaWduZWQgbG9uZyBfX2ZkLCBfX2tlcm5lbF9mZF9zZXQgKl9fZmRzZXRwKQpAQCAtMTE3LDYgKzExMyw2IEBACiAJfQogfQogCi0jZW5kaWYgLyogZGVmaW5lZChfX0tFUk5FTF9fKSB8fCAhZGVmaW5lZChfX0dMSUJDX18pIHx8IChfX0dMSUJDX18gPCAyKSAqLworI2VuZGlmIC8qIGRlZmluZWQoX19LRVJORUxfXykgKi8KIAogI2VuZGlmICAvKiBfQVNNX00zMlJfUE9TSVhfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLW0zMnIvcHJvY2Vzc29yLmgKaW5kZXggMzI3NTViZi4uMWE5OTdmYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL3Byb2Nlc3Nvci5oCkBAIC02MCw2ICs2MCwxMSBAQAogI2RlZmluZSBUQVNLX1NJWkUgICgweDAwNDAwMDAwVUwpCiAjZW5kaWYKIAorI2lmZGVmIF9fS0VSTkVMX18KKyNkZWZpbmUgU1RBQ0tfVE9QCVRBU0tfU0laRQorI2RlZmluZSBTVEFDS19UT1BfTUFYCVNUQUNLX1RPUAorI2VuZGlmCisKIC8qIFRoaXMgZGVjaWRlcyB3aGVyZSB0aGUga2VybmVsIHdpbGwgc2VhcmNoIGZvciBhIGZyZWUgY2h1bmsgb2Ygdm0KICAqIHNwYWNlIGR1cmluZyBtbWFwJ3MuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1tMzJyL3N5c3RlbS5oCmluZGV4IDIzNjVkZTUuLjcwYTU3YzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci9zeXN0ZW0uaApAQCAtMTIxLDEyICsxMjEsMTMgQEAKIAogI2RlZmluZSBub3AoKQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm5vcCIgOiA6ICkKIAotI2RlZmluZSB4Y2hnKHB0cix4KSBcCi0JKChfX3R5cGVvZl9fKCoocHRyKSkpX194Y2hnKCh1bnNpZ25lZCBsb25nKSh4KSwocHRyKSxzaXplb2YoKihwdHIpKSkpCisjZGVmaW5lIHhjaGcocHRyLCB4KQkJCQkJCQlcCisJKChfX3R5cGVvZl9fKCoocHRyKSkpX194Y2hnKCh1bnNpZ25lZCBsb25nKSh4KSwgKHB0ciksIHNpemVvZigqKHB0cikpKSkKKyNkZWZpbmUgeGNoZ19sb2NhbChwdHIsIHgpCQkJCQkJXAorCSgoX190eXBlb2ZfXygqKHB0cikpKV9feGNoZ19sb2NhbCgodW5zaWduZWQgbG9uZykoeCksIChwdHIpLAlcCisJCQlzaXplb2YoKihwdHIpKSkpCiAKLSNpZmRlZiBDT05GSUdfU01QCiBleHRlcm4gdm9pZCAgX194Y2hnX2NhbGxlZF93aXRoX2JhZF9wb2ludGVyKHZvaWQpOwotI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQ0hJUF9NMzI3MDBfVFMxCiAjZGVmaW5lIERDQUNIRV9DTEVBUihyZWcwLCByZWcxLCBhZGRyKQkJCQlcCkBAIC0xNDYsNyArMTQ3LDcgQEAKICNlbmRpZgkvKiBDT05GSUdfQ0hJUF9NMzI3MDBfVFMxICovCiAKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgbG9uZwotX194Y2hnKHVuc2lnbmVkIGxvbmcgeCwgdm9sYXRpbGUgdm9pZCAqIHB0ciwgaW50IHNpemUpCitfX3hjaGcodW5zaWduZWQgbG9uZyB4LCB2b2xhdGlsZSB2b2lkICpwdHIsIGludCBzaXplKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyB0bXAgPSAwOwpAQCAtMTg2LDkgKzE4Nyw0NSBAQAogI2VuZGlmCS8qIENPTkZJR19DSElQX00zMjcwMF9UUzEgKi8KIAkJKTsKIAkJYnJlYWs7CisjZW5kaWYgIC8qIENPTkZJR19TTVAgKi8KIAlkZWZhdWx0OgogCQlfX3hjaGdfY2FsbGVkX3dpdGhfYmFkX3BvaW50ZXIoKTsKLSNlbmRpZiAgLyogQ09ORklHX1NNUCAqLworCX0KKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiAodG1wKTsKK30KKworc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nCitfX3hjaGdfbG9jYWwodW5zaWduZWQgbG9uZyB4LCB2b2xhdGlsZSB2b2lkICpwdHIsIGludCBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyB0bXAgPSAwOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSAxOgorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCQkibGRiCSUwLCBAJTIgXG5cdCIKKwkJCSJzdGIJJTEsIEAlMiBcblx0IgorCQkJOiAiPSZyIiAodG1wKSA6ICJyIiAoeCksICJyIiAocHRyKSA6ICJtZW1vcnkiKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCQkibGRoCSUwLCBAJTIgXG5cdCIKKwkJCSJzdGgJJTEsIEAlMiBcblx0IgorCQkJOiAiPSZyIiAodG1wKSA6ICJyIiAoeCksICJyIiAocHRyKSA6ICJtZW1vcnkiKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCQkibGQJJTAsIEAlMiBcblx0IgorCQkJInN0CSUxLCBAJTIgXG5cdCIKKwkJCTogIj0mciIgKHRtcCkgOiAiciIgKHgpLCAiciIgKHB0cikgOiAibWVtb3J5Iik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCV9feGNoZ19jYWxsZWRfd2l0aF9iYWRfcG9pbnRlcigpOwogCX0KIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKQEAgLTIyOCw2ICsyNjUsMzcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK19fY21weGNoZ19sb2NhbF91MzIodm9sYXRpbGUgdW5zaWduZWQgaW50ICpwLCB1bnNpZ25lZCBpbnQgb2xkLAorCQkJdW5zaWduZWQgaW50IG5ldykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCByZXR2YWw7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkJRENBQ0hFX0NMRUFSKCIlMCIsICJyNCIsICIlMSIpCisJCQkibGQgJTAsIEAlMTsJCVxuIgorCQkiCWJuZQklMCwgJTIsIDFmOwlcbiIKKwkJCSJzdCAlMywgQCUxOwkJXG4iCisJCSIJYnJhCTJmOwkJXG4iCisJCSIgICAgICAgLmZpbGxpbnNuCQlcbiIKKwkJIjE6IgorCQkJInN0ICUwLCBAJTE7CQlcbiIKKwkJIiAgICAgICAuZmlsbGluc24JCVxuIgorCQkiMjoiCisJCQk6ICI9JnIiIChyZXR2YWwpCisJCQk6ICJyIiAocCksICJyIiAob2xkKSwgInIiIChuZXcpCisJCQk6ICJjYml0IiwgIm1lbW9yeSIKKyNpZmRlZiBDT05GSUdfQ0hJUF9NMzI3MDBfVFMxCisJCQksICJyNCIKKyNlbmRpZiAgLyogQ09ORklHX0NISVBfTTMyNzAwX1RTMSAqLworCQkpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKIC8qIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBleGlzdCwgc28geW91J2xsIGdldCBhIGxpbmtlciBlcnJvcgogICAgaWYgc29tZXRoaW5nIHRyaWVzIHRvIGRvIGFuIGludmFsaWQgY21weGNoZygpLiAgKi8KIGV4dGVybiB2b2lkIF9fY21weGNoZ19jYWxsZWRfd2l0aF9iYWRfcG9pbnRlcih2b2lkKTsKQEAgLTI0NywxMyArMzE1LDM0IEBACiAJcmV0dXJuIG9sZDsKIH0KIAotI2RlZmluZSBjbXB4Y2hnKHB0cixvLG4pCQkJCQkJIFwKLSAgKHsJCQkJCQkJCQkgXAotICAgICBfX3R5cGVvZl9fKCoocHRyKSkgX29fID0gKG8pOwkJCQkJIFwKLSAgICAgX190eXBlb2ZfXygqKHB0cikpIF9uXyA9IChuKTsJCQkJCSBcCi0gICAgIChfX3R5cGVvZl9fKCoocHRyKSkpIF9fY21weGNoZygocHRyKSwgKHVuc2lnbmVkIGxvbmcpX29fLAkJIFwKLQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpX25fLCBzaXplb2YoKihwdHIpKSk7IFwKLSAgfSkKKyNkZWZpbmUgY21weGNoZyhwdHIsIG8sIG4pCQkJCQkJIFwKKwkoKF9fdHlwZW9mX18oKihwdHIpKSkgX19jbXB4Y2hnKChwdHIpLCAodW5zaWduZWQgbG9uZykobyksCSBcCisJCQkodW5zaWduZWQgbG9uZykobiksIHNpemVvZigqKHB0cikpKSkKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NtcHhjaGctbG9jYWwuaD4KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fY21weGNoZ19sb2NhbCh2b2xhdGlsZSB2b2lkICpwdHIsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBvbGQsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBuZXcsIGludCBzaXplKQoreworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgNDoKKwkJcmV0dXJuIF9fY21weGNoZ19sb2NhbF91MzIocHRyLCBvbGQsIG5ldyk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIF9fY21weGNoZ19sb2NhbF9nZW5lcmljKHB0ciwgb2xkLCBuZXcsIHNpemUpOworCX0KKworCXJldHVybiBvbGQ7Cit9CisKKy8qCisgKiBjbXB4Y2hnX2xvY2FsIGFuZCBjbXB4Y2hnNjRfbG9jYWwgYXJlIGF0b21pYyB3cnQgY3VycmVudCBDUFUuIEFsd2F5cyBtYWtlCisgKiB0aGVtIGF2YWlsYWJsZS4KKyAqLworI2RlZmluZSBjbXB4Y2hnX2xvY2FsKHB0ciwgbywgbikJCQkJICAJICAgIFwKKwkoKF9fdHlwZW9mX18oKihwdHIpKSlfX2NtcHhjaGdfbG9jYWwoKHB0ciksICh1bnNpZ25lZCBsb25nKShvKSwJICAgIFwKKwkJCSh1bnNpZ25lZCBsb25nKShuKSwgc2l6ZW9mKCoocHRyKSkpKQorI2RlZmluZSBjbXB4Y2hnNjRfbG9jYWwocHRyLCBvLCBuKSBfX2NtcHhjaGc2NF9sb2NhbF9nZW5lcmljKChwdHIpLCAobyksIChuKSkKIAogI2VuZGlmICAvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvdXNlci5oIGIvaW5jbHVkZS9hc20tbTMyci91c2VyLmgKaW5kZXggMDM1MjU4ZC4uMDNiM2MxMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci91c2VyLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci91c2VyLmgKQEAgLTM4LDcgKzM4LDcgQEAKIAl1bnNpZ25lZCBsb25nCXN0YXJ0X2RhdGE7CQkvKiBkYXRhIHN0YXJ0aW5nIGFkZHJlc3MgKi8KIAl1bnNpZ25lZCBsb25nCXN0YXJ0X3N0YWNrOwkJLyogc3RhY2sgc3RhcnRpbmcgYWRkcmVzcyAqLwogCWxvbmcgaW50CXNpZ25hbDsJCQkvKiBzaWduYWwgY2F1c2luZyBjb3JlIGR1bXAgKi8KLQlzdHJ1Y3QgcmVncyAqCXVfYXIwOwkJCS8qIGhlbHAgZ2RiIGZpbmQgcmVnaXN0ZXJzICovCisJdW5zaWduZWQgbG9uZwl1X2FyMDsJCQkvKiBoZWxwIGdkYiBmaW5kIHJlZ2lzdGVycyAqLwogCXVuc2lnbmVkIGxvbmcJbWFnaWM7CQkJLyogaWRlbnRpZmllcyBhIGNvcmUgZmlsZSAqLwogCWNoYXIJCXVfY29tbVszMl07CQkvKiB1c2VyIGNvbW1hbmQgbmFtZSAqLwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvYS5vdXQtY29yZS5oIGIvaW5jbHVkZS9hc20tbTY4ay9hLm91dC1jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZiZmMxZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvYS5vdXQtY29yZS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qIGEub3V0IGNvcmVkdW1wIHJlZ2lzdGVyIGR1bXBlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9BU01fQV9PVVRfQ09SRV9ICisjZGVmaW5lIF9BU01fQV9PVVRfQ09SRV9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC91c2VyLmg+CisjaW5jbHVkZSA8bGludXgvZWxmY29yZS5oPgorCisvKgorICogZmlsbCBpbiB0aGUgdXNlciBzdHJ1Y3R1cmUgZm9yIGFuIGEub3V0IGNvcmUgZHVtcAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYW91dF9kdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHVzZXIgKmR1bXApCit7CisJc3RydWN0IHN3aXRjaF9zdGFjayAqc3c7CisKKy8qIGNoYW5nZWQgdGhlIHNpemUgY2FsY3VsYXRpb25zIC0gc2hvdWxkIGhvcGVmdWxseSB3b3JrIGJldHRlci4gbGJ0ICovCisJZHVtcC0+bWFnaWMgPSBDTUFHSUM7CisJZHVtcC0+c3RhcnRfY29kZSA9IDA7CisJZHVtcC0+c3RhcnRfc3RhY2sgPSByZHVzcCgpICYgfihQQUdFX1NJWkUgLSAxKTsKKwlkdW1wLT51X3RzaXplID0gKCh1bnNpZ25lZCBsb25nKSBjdXJyZW50LT5tbS0+ZW5kX2NvZGUpID4+IFBBR0VfU0hJRlQ7CisJZHVtcC0+dV9kc2l6ZSA9ICgodW5zaWduZWQgbG9uZykgKGN1cnJlbnQtPm1tLT5icmsgKworCQkJCQkgIChQQUdFX1NJWkUtMSkpKSA+PiBQQUdFX1NISUZUOworCWR1bXAtPnVfZHNpemUgLT0gZHVtcC0+dV90c2l6ZTsKKwlkdW1wLT51X3NzaXplID0gMDsKKworCWlmIChkdW1wLT5zdGFydF9zdGFjayA8IFRBU0tfU0laRSkKKwkJZHVtcC0+dV9zc2l6ZSA9ICgodW5zaWduZWQgbG9uZykgKFRBU0tfU0laRSAtIGR1bXAtPnN0YXJ0X3N0YWNrKSkgPj4gUEFHRV9TSElGVDsKKworCWR1bXAtPnVfYXIwID0gb2Zmc2V0b2Yoc3RydWN0IHVzZXIsIHJlZ3MpOworCXN3ID0gKChzdHJ1Y3Qgc3dpdGNoX3N0YWNrICopcmVncykgLSAxOworCWR1bXAtPnJlZ3MuZDEgPSByZWdzLT5kMTsKKwlkdW1wLT5yZWdzLmQyID0gcmVncy0+ZDI7CisJZHVtcC0+cmVncy5kMyA9IHJlZ3MtPmQzOworCWR1bXAtPnJlZ3MuZDQgPSByZWdzLT5kNDsKKwlkdW1wLT5yZWdzLmQ1ID0gcmVncy0+ZDU7CisJZHVtcC0+cmVncy5kNiA9IHN3LT5kNjsKKwlkdW1wLT5yZWdzLmQ3ID0gc3ctPmQ3OworCWR1bXAtPnJlZ3MuYTAgPSByZWdzLT5hMDsKKwlkdW1wLT5yZWdzLmExID0gcmVncy0+YTE7CisJZHVtcC0+cmVncy5hMiA9IHJlZ3MtPmEyOworCWR1bXAtPnJlZ3MuYTMgPSBzdy0+YTM7CisJZHVtcC0+cmVncy5hNCA9IHN3LT5hNDsKKwlkdW1wLT5yZWdzLmE1ID0gc3ctPmE1OworCWR1bXAtPnJlZ3MuYTYgPSBzdy0+YTY7CisJZHVtcC0+cmVncy5kMCA9IHJlZ3MtPmQwOworCWR1bXAtPnJlZ3Mub3JpZ19kMCA9IHJlZ3MtPm9yaWdfZDA7CisJZHVtcC0+cmVncy5zdGthZGogPSByZWdzLT5zdGthZGo7CisJZHVtcC0+cmVncy5zciA9IHJlZ3MtPnNyOworCWR1bXAtPnJlZ3MucGMgPSByZWdzLT5wYzsKKwlkdW1wLT5yZWdzLmZtdHZlYyA9IChyZWdzLT5mb3JtYXQgPDwgMTIpIHwgcmVncy0+dmVjdG9yOworCS8qIGR1bXAgZmxvYXRpbmcgcG9pbnQgc3R1ZmYgKi8KKwlkdW1wLT51X2ZwdmFsaWQgPSBkdW1wX2ZwdSAocmVncywgJmR1bXAtPm02OGtmcCk7Cit9CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX0FTTV9BX09VVF9DT1JFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvYS5vdXQuaCBiL2luY2x1ZGUvYXNtLW02OGsvYS5vdXQuaAppbmRleCA2ZmM4NmEyLi4zODg1ZmU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2Eub3V0LmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9hLm91dC5oCkBAIC0xNywxMSArMTcsNCBAQAogI2RlZmluZSBOX0RSU0laRShhKQkoKGEpLmFfZHJzaXplKQogI2RlZmluZSBOX1NZTVNJWkUoYSkJKChhKS5hX3N5bXMpCiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNkZWZpbmUgU1RBQ0tfVE9QCVRBU0tfU0laRQotI2RlZmluZSBTVEFDS19UT1BfTUFYCVNUQUNLX1RPUAotCi0jZW5kaWYKLQogI2VuZGlmIC8qIF9fTTY4S19BX09VVF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvZWxmLmggYi9pbmNsdWRlL2FzbS1tNjhrL2VsZi5oCmluZGV4IGViNjNiODUuLjE0ZWE0MjE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2VsZi5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvZWxmLmgKQEAgLTExNCw4ICsxMTQsNiBAQAogCiAjZGVmaW5lIEVMRl9QTEFURk9STSAgKE5VTEwpCiAKLSNpZmRlZiBfX0tFUk5FTF9fCiAjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCwgaWJjczIpIHNldF9wZXJzb25hbGl0eSgoaWJjczIpP1BFUl9TVlI0OlBFUl9MSU5VWCkKLSNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvbW90b3JvbGFfcGdhbGxvYy5oIGIvaW5jbHVkZS9hc20tbTY4ay9tb3Rvcm9sYV9wZ2FsbG9jLmgKaW5kZXggNTAwZWM5Yi4uZDA4YmY2MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9tb3Rvcm9sYV9wZ2FsbG9jLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9tb3Rvcm9sYV9wZ2FsbG9jLmgKQEAgLTcsNyArNyw2IEBACiBleHRlcm4gcG1kX3QgKmdldF9wb2ludGVyX3RhYmxlKHZvaWQpOwogZXh0ZXJuIGludCBmcmVlX3BvaW50ZXJfdGFibGUocG1kX3QgKik7CiAKLQogc3RhdGljIGlubGluZSBwdGVfdCAqcHRlX2FsbG9jX29uZV9rZXJuZWwoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKIAlwdGVfdCAqcHRlOwpAQCAtMjgsNyArMjcsNyBAQAogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcHRlKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqcHRlX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQorc3RhdGljIGlubGluZSBwZ3RhYmxlX3QgcHRlX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewogCXN0cnVjdCBwYWdlICpwYWdlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTHxfX0dGUF9SRVBFQVR8X19HRlBfWkVSTywgMCk7CiAJcHRlX3QgKnB0ZTsKQEAgLTQzLDE5ICs0MiwyMSBAQAogCQlub2NhY2hlX3BhZ2UocHRlKTsKIAl9CiAJa3VubWFwKHB0ZSk7Ci0KKwlwZ3RhYmxlX3BhZ2VfY3RvcihwYWdlKTsKIAlyZXR1cm4gcGFnZTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHB0ZV9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdGVfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcGd0YWJsZV90IHBhZ2UpCiB7CisJcGd0YWJsZV9wYWdlX2R0b3IocGFnZSk7CiAJY2FjaGVfcGFnZShrbWFwKHBhZ2UpKTsKIAlrdW5tYXAocGFnZSk7CiAJX19mcmVlX3BhZ2UocGFnZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3B0ZV9mcmVlX3RsYihzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3B0ZV9mcmVlX3RsYihzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCBwZ3RhYmxlX3QgcGFnZSkKIHsKKwlwZ3RhYmxlX3BhZ2VfZHRvcihwYWdlKTsKIAljYWNoZV9wYWdlKGttYXAocGFnZSkpOwogCWt1bm1hcChwYWdlKTsKIAlfX2ZyZWVfcGFnZShwYWdlKTsKQEAgLTk0LDEwICs5NSwxMSBAQAogCXBtZF9zZXQocG1kLCBwdGUpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcG1kX3BvcHVsYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqcG1kLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbWRfcG9wdWxhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBtZF90ICpwbWQsIHBndGFibGVfdCBwYWdlKQogewogCXBtZF9zZXQocG1kLCBwYWdlX2FkZHJlc3MocGFnZSkpOwogfQorI2RlZmluZSBwbWRfcGd0YWJsZShwbWQpIHBtZF9wYWdlKHBtZCkKIAogc3RhdGljIGlubGluZSB2b2lkIHBnZF9wb3B1bGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcGdkX3QgKnBnZCwgcG1kX3QgKnBtZCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvbW90b3JvbGFfcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tbTY4ay9tb3Rvcm9sYV9wZ3RhYmxlLmgKaW5kZXggZDAyOWI3NS4uMTMxMzVkNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9tb3Rvcm9sYV9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9tb3Rvcm9sYV9wZ3RhYmxlLmgKQEAgLTE5MSw3ICsxOTEsOCBAQAogI2RlZmluZSBwZ2RfaW5kZXgoYWRkcmVzcykgICAgICgoYWRkcmVzcykgPj4gUEdESVJfU0hJRlQpCiAKIC8qIHRvIGZpbmQgYW4gZW50cnkgaW4gYSBwYWdlLXRhYmxlLWRpcmVjdG9yeSAqLwotc3RhdGljIGlubGluZSBwZ2RfdCAqcGdkX29mZnNldChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQorc3RhdGljIGlubGluZSBwZ2RfdCAqcGdkX29mZnNldChjb25zdCBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQl1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7CiAJcmV0dXJuIG1tLT5wZ2QgKyBwZ2RfaW5kZXgoYWRkcmVzcyk7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLW02OGsvcGFnZS5oCmluZGV4IDE0MzFlYTAuLjg4MGMyY2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvcGFnZS5oCkBAIC0xLDkgKzEsNiBAQAogI2lmbmRlZiBfTTY4S19QQUdFX0gKICNkZWZpbmUgX002OEtfUEFHRV9ICiAKLQotI2lmZGVmIF9fS0VSTkVMX18KLQogI2luY2x1ZGUgPGxpbnV4L2NvbnN0Lmg+CiAKIC8qIFBBR0VfU0hJRlQgZGV0ZXJtaW5lcyB0aGUgcGFnZSBzaXplICovCkBAIC05NCw2ICs5MSw3IEBACiB0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcG1kWzE2XTsgfSBwbWRfdDsKIHR5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBwZ2Q7IH0gcGdkX3Q7CiB0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcGdwcm90OyB9IHBncHJvdF90OwordHlwZWRlZiBzdHJ1Y3QgcGFnZSAqcGd0YWJsZV90OwogCiAjZGVmaW5lIHB0ZV92YWwoeCkJKCh4KS5wdGUpCiAjZGVmaW5lIHBtZF92YWwoeCkJKCgmeCktPnBtZFswXSkKQEAgLTIzMCw2ICsyMjgsNCBAQAogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGFnZS5oPgogCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCiAjZW5kaWYgLyogX002OEtfUEFHRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3BhcmFtLmggYi9pbmNsdWRlL2FzbS1tNjhrL3BhcmFtLmgKaW5kZXggNjBmNDA5ZC4uNTM2YTI3OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9wYXJhbS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvcGFyYW0uaApAQCAtMiw3ICsyLDcgQEAKICNkZWZpbmUgX002OEtfUEFSQU1fSAogCiAjaWZkZWYgX19LRVJORUxfXwotIyBkZWZpbmUgSFoJCTEwMAkJLyogSW50ZXJuYWwga2VybmVsIHRpbWVyIGZyZXF1ZW5jeSAqLworIyBkZWZpbmUgSFoJCUNPTkZJR19IWgkvKiBJbnRlcm5hbCBrZXJuZWwgdGltZXIgZnJlcXVlbmN5ICovCiAjIGRlZmluZSBVU0VSX0haCTEwMAkJLyogLi4gc29tZSB1c2VyIGludGVyZmFjZXMgYXJlIGluICJ0aWNrcyIgKi8KICMgZGVmaW5lIENMT0NLU19QRVJfU0VDCShVU0VSX0haKQkvKiBsaWtlIHRpbWVzKCkgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9wb3NpeF90eXBlcy5oIGIvaW5jbHVkZS9hc20tbTY4ay9wb3NpeF90eXBlcy5oCmluZGV4IGZhMTY2ZWUuLjYzY2RjYzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvcG9zaXhfdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL3Bvc2l4X3R5cGVzLmgKQEAgLTM5LDE0ICszOSwxMCBAQAogI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0IHsKLSNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8IGRlZmluZWQoX19VU0VfQUxMKQogCWludAl2YWxbMl07Ci0jZWxzZSAvKiAhZGVmaW5lZChfX0tFUk5FTF9fKSAmJiAhZGVmaW5lZChfX1VTRV9BTEwpICovCi0JaW50CV9fdmFsWzJdOwotI2VuZGlmIC8qICFkZWZpbmVkKF9fS0VSTkVMX18pICYmICFkZWZpbmVkKF9fVVNFX0FMTCkgKi8KIH0gX19rZXJuZWxfZnNpZF90OwogCi0jaWYgZGVmaW5lZChfX0tFUk5FTF9fKSB8fCAhZGVmaW5lZChfX0dMSUJDX18pIHx8IChfX0dMSUJDX18gPCAyKQorI2lmIGRlZmluZWQoX19LRVJORUxfXykKIAogI3VuZGVmCV9fRkRfU0VUCiAjZGVmaW5lCV9fRkRfU0VUKGQsIHNldCkJKChzZXQpLT5mZHNfYml0c1tfX0ZERUxUKGQpXSB8PSBfX0ZETUFTSyhkKSkKQEAgLTYwLDYgKzU2LDYgQEAKICN1bmRlZglfX0ZEX1pFUk8KICNkZWZpbmUgX19GRF9aRVJPKGZkc2V0cCkgKG1lbXNldCAoZmRzZXRwLCAwLCBzaXplb2YoKihmZF9zZXQgKilmZHNldHApKSkKIAotI2VuZGlmIC8qIGRlZmluZWQoX19LRVJORUxfXykgfHwgIWRlZmluZWQoX19HTElCQ19fKSB8fCAoX19HTElCQ19fIDwgMikgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKF9fS0VSTkVMX18pICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLW02OGsvcHJvY2Vzc29yLmgKaW5kZXggNDQ1M2VjMy4uMWY2MWVmNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL3Byb2Nlc3Nvci5oCkBAIC00MSw2ICs0MSwxMSBAQAogI2RlZmluZSBUQVNLX1NJWkUJKDB4MEUwMDAwMDBVTCkKICNlbmRpZgogCisjaWZkZWYgX19LRVJORUxfXworI2RlZmluZSBTVEFDS19UT1AJVEFTS19TSVpFCisjZGVmaW5lIFNUQUNLX1RPUF9NQVgJU1RBQ0tfVE9QCisjZW5kaWYKKwogLyogVGhpcyBkZWNpZGVzIHdoZXJlIHRoZSBrZXJuZWwgd2lsbCBzZWFyY2ggZm9yIGEgZnJlZSBjaHVuayBvZiB2bQogICogc3BhY2UgZHVyaW5nIG1tYXAncy4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9zdW4zX3BnYWxsb2MuaCBiL2luY2x1ZGUvYXNtLW02OGsvc3VuM19wZ2FsbG9jLmgKaW5kZXggYTVhOTFlNy4uZDRjODNmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9zdW4zX3BnYWxsb2MuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL3N1bjNfcGdhbGxvYy5oCkBAIC0yNiwxMiArMjYsMTcgQEAKICAgICAgICAgZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwdGUpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBwYWdlICpwYWdlKQorc3RhdGljIGlubGluZSB2b2lkIHB0ZV9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ3RhYmxlX3QgcGFnZSkKIHsKKwlwZ3RhYmxlX3BhZ2VfZHRvcihwYWdlKTsKICAgICAgICAgX19mcmVlX3BhZ2UocGFnZSk7CiB9CiAKLSNkZWZpbmUgX19wdGVfZnJlZV90bGIodGxiLHB0ZSkgdGxiX3JlbW92ZV9wYWdlKCh0bGIpLChwdGUpKQorI2RlZmluZSBfX3B0ZV9mcmVlX3RsYih0bGIscHRlKQkJCQlcCitkbyB7CQkJCQkJCVwKKwlwZ3RhYmxlX3BhZ2VfZHRvcihwdGUpOwkJCQlcCisJdGxiX3JlbW92ZV9wYWdlKCh0bGIpLCBwdGUpOwkJCVwKK30gd2hpbGUgKDApCiAKIHN0YXRpYyBpbmxpbmUgcHRlX3QgKnB0ZV9hbGxvY19vbmVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCQkgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKQEAgLTQ1LDggKzUwLDggQEAKIAlyZXR1cm4gKHB0ZV90ICopIChwYWdlKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqcHRlX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwKLQkJCQkJIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3N0YXRpYyBpbmxpbmUgcGd0YWJsZV90IHB0ZV9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKICAgICAgICAgc3RydWN0IHBhZ2UgKnBhZ2UgPSBhbGxvY19wYWdlcyhHRlBfS0VSTkVMfF9fR0ZQX1JFUEVBVCwgMCk7CiAKQEAgLTU0LDYgKzU5LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAljbGVhcl9oaWdocGFnZShwYWdlKTsKKwlwZ3RhYmxlX3BhZ2VfY3RvcihwYWdlKTsKIAlyZXR1cm4gcGFnZTsKIAogfQpAQCAtNjMsMTAgKzY5LDExIEBACiAJcG1kX3ZhbCgqcG1kKSA9IF9fcGEoKHVuc2lnbmVkIGxvbmcpcHRlKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHBtZF9wb3B1bGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcG1kX3QgKnBtZCwgc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgaW5saW5lIHZvaWQgcG1kX3BvcHVsYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqcG1kLCBwZ3RhYmxlX3QgcGFnZSkKIHsKIAlwbWRfdmFsKCpwbWQpID0gX19wYSgodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSkpOwogfQorI2RlZmluZSBwbWRfcGd0YWJsZShwbWQpIHBtZF9wYWdlKHBtZCkKIAogLyoKICAqIGFsbG9jYXRpbmcgYW5kIGZyZWVpbmcgYSBwbWQgaXMgdHJpdmlhbDogdGhlIDEtZW50cnkgcG1kIGlzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tbTY4ay9zeXN0ZW0uaAppbmRleCBjYWE5YjE2Li5kYmI2NTE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvc3lzdGVtLmgKQEAgLTE1NCw2ICsxNTQsMTAgQEAKIH0KICNlbmRpZgogCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvY21weGNoZy1sb2NhbC5oPgorCisjZGVmaW5lIGNtcHhjaGc2NF9sb2NhbChwdHIsIG8sIG4pIF9fY21weGNoZzY0X2xvY2FsX2dlbmVyaWMoKHB0ciksIChvKSwgKG4pKQorCiAvKgogICogQXRvbWljIGNvbXBhcmUgYW5kIGV4Y2hhbmdlLiAgQ29tcGFyZSBPTEQgd2l0aCBNRU0sIGlmIGlkZW50aWNhbCwKICAqIHN0b3JlIE5FVyBpbiBNRU0uICBSZXR1cm4gdGhlIGluaXRpYWwgdmFsdWUgaW4gTUVNLiAgU3VjY2VzcyBpcwpAQCAtMTg1LDkgKzE4OSwyNiBAQAogCXJldHVybiBvbGQ7CiB9CiAKLSNkZWZpbmUgY21weGNoZyhwdHIsbyxuKVwKLQkoKF9fdHlwZW9mX18oKihwdHIpKSlfX2NtcHhjaGcoKHB0ciksKHVuc2lnbmVkIGxvbmcpKG8pLFwKLQkJCQkJKHVuc2lnbmVkIGxvbmcpKG4pLHNpemVvZigqKHB0cikpKSkKKyNkZWZpbmUgY21weGNoZyhwdHIsIG8sIG4pCQkJCQkJICAgIFwKKwkoKF9fdHlwZW9mX18oKihwdHIpKSlfX2NtcHhjaGcoKHB0ciksICh1bnNpZ25lZCBsb25nKShvKSwJICAgIFwKKwkJCSh1bnNpZ25lZCBsb25nKShuKSwgc2l6ZW9mKCoocHRyKSkpKQorI2RlZmluZSBjbXB4Y2hnX2xvY2FsKHB0ciwgbywgbikJCQkJCSAgICBcCisJKChfX3R5cGVvZl9fKCoocHRyKSkpX19jbXB4Y2hnKChwdHIpLCAodW5zaWduZWQgbG9uZykobyksCSAgICBcCisJCQkodW5zaWduZWQgbG9uZykobiksIHNpemVvZigqKHB0cikpKSkKKyNlbHNlCisKKy8qCisgKiBjbXB4Y2hnX2xvY2FsIGFuZCBjbXB4Y2hnNjRfbG9jYWwgYXJlIGF0b21pYyB3cnQgY3VycmVudCBDUFUuIEFsd2F5cyBtYWtlCisgKiB0aGVtIGF2YWlsYWJsZS4KKyAqLworI2RlZmluZSBjbXB4Y2hnX2xvY2FsKHB0ciwgbywgbikJCQkJICAJICAgICAgIFwKKwkoKF9fdHlwZW9mX18oKihwdHIpKSlfX2NtcHhjaGdfbG9jYWxfZ2VuZXJpYygocHRyKSwgKHVuc2lnbmVkIGxvbmcpKG8pLFwKKwkJCSh1bnNpZ25lZCBsb25nKShuKSwgc2l6ZW9mKCoocHRyKSkpKQorCisjaWZuZGVmIENPTkZJR19TTVAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jbXB4Y2hnLmg+CisjZW5kaWYKKwogI2VuZGlmCiAKICNkZWZpbmUgYXJjaF9hbGlnbl9zdGFjayh4KSAoeCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvdXNlci5oIGIvaW5jbHVkZS9hc20tbTY4ay91c2VyLmgKaW5kZXggOGM1NmNjYS4uZjFmNDc4ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay91c2VyLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay91c2VyLmgKQEAgLTcyLDggKzcyLDcgQEAKIAkJCQkgICBlc3AgcmVnaXN0ZXIuICAqLwogICBsb25nIGludCBzaWduYWw7CQkvKiBTaWduYWwgdGhhdCBjYXVzZWQgdGhlIGNvcmUgZHVtcC4gKi8KICAgaW50IHJlc2VydmVkOwkJCS8qIE5vIGxvbmdlciB1c2VkICovCi0gIHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0ICp1X2FyMDsKLQkJCQkvKiBVc2VkIGJ5IGdkYiB0byBoZWxwIGZpbmQgdGhlIHZhbHVlcyBmb3IgKi8KKyAgdW5zaWduZWQgbG9uZyB1X2FyMDsJCS8qIFVzZWQgYnkgZ2RiIHRvIGhlbHAgZmluZCB0aGUgdmFsdWVzIGZvciAqLwogCQkJCS8qIHRoZSByZWdpc3RlcnMuICovCiAgIHN0cnVjdCB1c2VyX202OGtmcF9zdHJ1Y3QqIHVfZnBzdGF0ZTsJLyogTWF0aCBDby1wcm9jZXNzb3IgcG9pbnRlci4gKi8KICAgdW5zaWduZWQgbG9uZyBtYWdpYzsJCS8qIFRvIHVuaXF1ZWx5IGlkZW50aWZ5IGEgY29yZSBmaWxlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvZWxmLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvZWxmLmgKaW5kZXggNDBiMWVkNi4uMjdmMGVjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L2VsZi5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9lbGYuaApAQCAtMTA1LDggKzEwNSw2IEBACiAKICNkZWZpbmUgRUxGX1BMQVRGT1JNICAoTlVMTCkKIAotI2lmZGVmIF9fS0VSTkVMX18KICNkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKGV4LCBpYmNzMikgc2V0X3BlcnNvbmFsaXR5KChpYmNzMik/UEVSX1NWUjQ6UEVSX0xJTlVYKQotI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L3BhZ2UuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9wYWdlLmgKaW5kZXggOWVmYTBhOS4uMWU4MmViYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvcGFnZS5oCkBAIC0xLDggKzEsNiBAQAogI2lmbmRlZiBfTTY4S05PTU1VX1BBR0VfSAogI2RlZmluZSBfTTY4S05PTU1VX1BBR0VfSAogCi0jaWZkZWYgX19LRVJORUxfXwotCiAvKiBQQUdFX1NISUZUIGRldGVybWluZXMgdGhlIHBhZ2Ugc2l6ZSAqLwogCiAjZGVmaW5lIFBBR0VfU0hJRlQJKDEyKQpAQCAtMzMsNiArMzEsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBsb25nIHBtZFsxNl07IH0gcG1kX3Q7CiB0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcGdkOyB9IHBnZF90OwogdHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBsb25nIHBncHJvdDsgfSBwZ3Byb3RfdDsKK3R5cGVkZWYgc3RydWN0IHBhZ2UgKnBndGFibGVfdDsKIAogI2RlZmluZSBwdGVfdmFsKHgpCSgoeCkucHRlKQogI2RlZmluZSBwbWRfdmFsKHgpCSgoJngpLT5wbWRbMF0pCkBAIC03OCw2ICs3Nyw0IEBACiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wYWdlLmg+CiAKLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KICNlbmRpZiAvKiBfTTY4S05PTU1VX1BBR0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L3BhcmFtLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvcGFyYW0uaAppbmRleCA0Yzk5MDRkLi45NmM0NTEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvcGFyYW0uaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvcGFyYW0uaApAQCAtMSwxMyArMSw3IEBACiAjaWZuZGVmIF9NNjhLTk9NTVVfUEFSQU1fSAogI2RlZmluZSBfTTY4S05PTU1VX1BBUkFNX0gKIAotCi0jaWYgZGVmaW5lZChDT05GSUdfQ0xFT1BBVFJBKQotI2RlZmluZQlIWiAxMDAwCi0jZW5kaWYKLSNpZm5kZWYgSFoKLSNkZWZpbmUJSFogMTAwCi0jZW5kaWYKKyNkZWZpbmUgSFogQ09ORklHX0haCiAKICNpZmRlZiBfX0tFUk5FTF9fCiAjZGVmaW5lCVVTRVJfSFoJCUhaCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvc3lzdGVtLmgKaW5kZXggZWUyZGMwNy4uMDM5YWIzZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9zeXN0ZW0uaApAQCAtMTg2LDI2ICsxODYsMjAgQEAKIH0KICNlbmRpZgogCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvY21weGNoZy1sb2NhbC5oPgorCiAvKgotICogQXRvbWljIGNvbXBhcmUgYW5kIGV4Y2hhbmdlLiAgQ29tcGFyZSBPTEQgd2l0aCBNRU0sIGlmIGlkZW50aWNhbCwKLSAqIHN0b3JlIE5FVyBpbiBNRU0uICBSZXR1cm4gdGhlIGluaXRpYWwgdmFsdWUgaW4gTUVNLiAgU3VjY2VzcyBpcwotICogaW5kaWNhdGVkIGJ5IGNvbXBhcmluZyBSRVRVUk4gd2l0aCBPTEQuCisgKiBjbXB4Y2hnX2xvY2FsIGFuZCBjbXB4Y2hnNjRfbG9jYWwgYXJlIGF0b21pYyB3cnQgY3VycmVudCBDUFUuIEFsd2F5cyBtYWtlCisgKiB0aGVtIGF2YWlsYWJsZS4KICAqLwotI2RlZmluZSBfX0hBVkVfQVJDSF9DTVBYQ0hHCTEKKyNkZWZpbmUgY21weGNoZ19sb2NhbChwdHIsIG8sIG4pCQkJCSAgCSAgICAgICBcCisJKChfX3R5cGVvZl9fKCoocHRyKSkpX19jbXB4Y2hnX2xvY2FsX2dlbmVyaWMoKHB0ciksICh1bnNpZ25lZCBsb25nKShvKSxcCisJCQkodW5zaWduZWQgbG9uZykobiksIHNpemVvZigqKHB0cikpKSkKKyNkZWZpbmUgY21weGNoZzY0X2xvY2FsKHB0ciwgbywgbikgX19jbXB4Y2hnNjRfbG9jYWxfZ2VuZXJpYygocHRyKSwgKG8pLCAobikpCiAKLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcKLWNtcHhjaGcodm9sYXRpbGUgaW50ICpwLCBpbnQgb2xkLCBpbnQgbmV3KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHByZXY7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JaWYgKChwcmV2ID0gKnApID09IG9sZCkKLQkJKnAgPSBuZXc7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXJldHVybihwcmV2KTsKLX0KLQorI2lmbmRlZiBDT05GSUdfU01QCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvY21weGNoZy5oPgorI2VuZGlmCiAKICNpZiBkZWZpbmVkKCBDT05GSUdfTTY4MzI4ICkgfHwgZGVmaW5lZCggQ09ORklHX002OEVaMzI4ICkgfHwgXAogCWRlZmluZWQgKENPTkZJR19NNjgzNjApIHx8IGRlZmluZWQoIENPTkZJR19NNjhWWjMyOCApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2Eub3V0LmggYi9pbmNsdWRlL2FzbS1taXBzL2Eub3V0LmgKaW5kZXggYmY1NWE1Yi4uY2FkODM3MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9hLm91dC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvYS5vdXQuaApAQCAtMzIsMTcgKzMyLDQgQEAKICNkZWZpbmUgTl9EUlNJWkUoYSkJKChhKS5hX2Ryc2l6ZSkKICNkZWZpbmUgTl9TWU1TSVpFKGEpCSgoYSkuYV9zeW1zKQogCi0jaWZkZWYgX19LRVJORUxfXwotCi0jaWZkZWYgQ09ORklHXzMyQklUCi0jZGVmaW5lIFNUQUNLX1RPUAlUQVNLX1NJWkUKLSNlbmRpZgotI2lmZGVmIENPTkZJR182NEJJVAotI2RlZmluZSBTVEFDS19UT1AJXAotICAgICAgKHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUX0FERFIpID8gVEFTS19TSVpFMzIgOiBUQVNLX1NJWkUpCi0jZW5kaWYKLSNkZWZpbmUgU1RBQ0tfVE9QX01BWAlUQVNLX1NJWkUKLQotI2VuZGlmCi0KICNlbmRpZiAvKiBfQVNNX0FfT1VUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvY21weGNoZy5oIGIvaW5jbHVkZS9hc20tbWlwcy9jbXB4Y2hnLmgKaW5kZXggYTVlYzBlNS4uNGE4MTJjMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9jbXB4Y2hnLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9jbXB4Y2hnLmgKQEAgLTEwNCw0ICsxMDQsMjEgQEAKICNkZWZpbmUgY21weGNoZyhwdHIsIG9sZCwgbmV3KQkJX19jbXB4Y2hnKHB0ciwgb2xkLCBuZXcsIHNtcF9sbHNjX21iKCkpCiAjZGVmaW5lIGNtcHhjaGdfbG9jYWwocHRyLCBvbGQsIG5ldykJX19jbXB4Y2hnKHB0ciwgb2xkLCBuZXcsICkKIAorI2RlZmluZSBjbXB4Y2hnNjQocHRyLCBvLCBuKQkJCQkJCVwKKyAgKHsJCQkJCQkJCQlcCisJQlVJTERfQlVHX09OKHNpemVvZigqKHB0cikpICE9IDgpOwkJCQlcCisJY21weGNoZygocHRyKSwgKG8pLCAobikpOwkJCQkJXAorICB9KQorCisjaWZkZWYgQ09ORklHXzY0QklUCisjZGVmaW5lIGNtcHhjaGc2NF9sb2NhbChwdHIsIG8sIG4pCQkJCQlcCisgICh7CQkJCQkJCQkJXAorCUJVSUxEX0JVR19PTihzaXplb2YoKihwdHIpKSAhPSA4KTsJCQkJXAorCWNtcHhjaGdfbG9jYWwoKHB0ciksIChvKSwgKG4pKTsJCQkJCVwKKyAgfSkKKyNlbHNlCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvY21weGNoZy1sb2NhbC5oPgorI2RlZmluZSBjbXB4Y2hnNjRfbG9jYWwocHRyLCBvLCBuKSBfX2NtcHhjaGc2NF9sb2NhbF9nZW5lcmljKChwdHIpLCAobyksIChuKSkKKyNlbmRpZgorCiAjZW5kaWYgLyogX19BU01fQ01QWENIR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2VsZi5oIGIvaW5jbHVkZS9hc20tbWlwcy9lbGYuaAppbmRleCA3NjZmOTFhLi5mNjlmN2FjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2VsZi5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvZWxmLmgKQEAgLTIzOSw4ICsyMzksNiBAQAogCiAjZW5kaWYgLyogIWRlZmluZWQoRUxGX0FSQ0gpICovCiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0KIHN0cnVjdCBtaXBzX2FiaTsKIAogZXh0ZXJuIHN0cnVjdCBtaXBzX2FiaSBtaXBzX2FiaTsKQEAgLTMyOCw4ICszMjYsNiBAQAogI2RlZmluZSBFTEZfQ09SRV9DT1BZX0ZQUkVHUyh0c2ssIGVsZl9mcHJlZ3MpCQkJXAogCWR1bXBfdGFza19mcHUodHNrLCBlbGZfZnByZWdzKQogCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCiAjZGVmaW5lIFVTRV9FTEZfQ09SRV9EVU1QCiAjZGVmaW5lIEVMRl9FWEVDX1BBR0VTSVpFCVBBR0VfU0laRQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLW1pcHMvcGFnZS5oCmluZGV4IGQyZWE5ODMuLjg3MzVhYTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvcGFnZS5oCkBAIC05LDkgKzksNiBAQAogI2lmbmRlZiBfQVNNX1BBR0VfSAogI2RlZmluZSBfQVNNX1BBR0VfSAogCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KICNpbmNsdWRlIDxzcGFjZXMuaD4KIAogLyoKQEAgLTkzLDYgKzkwLDcgQEAKICNkZWZpbmUgcHRlX3ZhbCh4KQkoKHgpLnB0ZSkKICNkZWZpbmUgX19wdGUoeCkJKChwdGVfdCkgeyAoeCkgfSApCiAjZW5kaWYKK3R5cGVkZWYgc3RydWN0IHBhZ2UgKnBndGFibGVfdDsKIAogLyoKICAqIEZvciAzLWxldmVsIHBhZ2V0YWJsZXMgd2UgZGVmaW5lcyB0aGVzZSBvdXJzZWx2ZXMsIGZvciAyLWxldmVsIHRoZQpAQCAtMTkwLDYgKzE4OCw0IEBACiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbWVtb3J5X21vZGVsLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGFnZS5oPgogCi0jZW5kaWYgLyogZGVmaW5lZCAoX19LRVJORUxfXykgKi8KLQogI2VuZGlmIC8qIF9BU01fUEFHRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3BnYWxsb2MuaCBiL2luY2x1ZGUvYXNtLW1pcHMvcGdhbGxvYy5oCmluZGV4IGM0ZWZlY2UuLjEyNzU4MzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvcGdhbGxvYy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvcGdhbGxvYy5oCkBAIC0yMCwxMCArMjAsMTEgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHBtZF9wb3B1bGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcG1kX3QgKnBtZCwKLQlzdHJ1Y3QgcGFnZSAqcHRlKQorCXBndGFibGVfdCBwdGUpCiB7CiAJc2V0X3BtZChwbWQsIF9fcG1kKCh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwdGUpKSk7CiB9CisjZGVmaW5lIHBtZF9wZ3RhYmxlKHBtZCkgcG1kX3BhZ2UocG1kKQogCiAvKgogICogSW5pdGlhbGl6ZSBhIG5ldyBwbWQgdGFibGUgd2l0aCBpbnZhbGlkIHBvaW50ZXJzLgpAQCAtNzksOSArODAsMTAgQEAKIAlzdHJ1Y3QgcGFnZSAqcHRlOwogCiAJcHRlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTCB8IF9fR0ZQX1JFUEVBVCwgUFRFX09SREVSKTsKLQlpZiAocHRlKQorCWlmIChwdGUpIHsKIAkJY2xlYXJfaGlnaHBhZ2UocHRlKTsKLQorCQlwZ3RhYmxlX3BhZ2VfY3RvcihwdGUpOworCX0KIAlyZXR1cm4gcHRlOwogfQogCkBAIC05MCwxMiArOTIsMTcgQEAKIAlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXB0ZSwgUFRFX09SREVSKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHB0ZV9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgcGFnZSAqcHRlKQorc3RhdGljIGlubGluZSB2b2lkIHB0ZV9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ3RhYmxlX3QgcHRlKQogeworCXBndGFibGVfcGFnZV9kdG9yKHB0ZSk7CiAJX19mcmVlX3BhZ2VzKHB0ZSwgUFRFX09SREVSKTsKIH0KIAotI2RlZmluZSBfX3B0ZV9mcmVlX3RsYih0bGIsIHB0ZSkJdGxiX3JlbW92ZV9wYWdlKCh0bGIpLCAocHRlKSkKKyNkZWZpbmUgX19wdGVfZnJlZV90bGIodGxiLHB0ZSkJCQkJXAorZG8gewkJCQkJCQlcCisJcGd0YWJsZV9wYWdlX2R0b3IocHRlKTsJCQkJXAorCXRsYl9yZW1vdmVfcGFnZSgodGxiKSwgcHRlKTsJCQlcCit9IHdoaWxlICgwKQogCiAjaWZkZWYgQ09ORklHXzMyQklUCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcG9zaXhfdHlwZXMuaCBiL2luY2x1ZGUvYXNtLW1pcHMvcG9zaXhfdHlwZXMuaAppbmRleCBjMmU4YTAwLi5jMjAwMTAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3Bvc2l4X3R5cGVzLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9wb3NpeF90eXBlcy5oCkBAIC02OSw3ICs2OSw3IEBACiAjZW5kaWYKIH0gX19rZXJuZWxfZnNpZF90OwogCi0jaWYgZGVmaW5lZChfX0tFUk5FTF9fKSB8fCAhZGVmaW5lZChfX0dMSUJDX18pIHx8IChfX0dMSUJDX18gPCAyKQorI2lmIGRlZmluZWQoX19LRVJORUxfXykKIAogI3VuZGVmIF9fRkRfU0VUCiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fRkRfU0VUKHVuc2lnbmVkIGxvbmcgX19mZCwgX19rZXJuZWxfZmRfc2V0ICpfX2Zkc2V0cCkKQEAgLTEzOSw2ICsxMzksNiBAQAogCX0KIH0KIAotI2VuZGlmIC8qIGRlZmluZWQoX19LRVJORUxfXykgfHwgIWRlZmluZWQoX19HTElCQ19fKSB8fCAoX19HTElCQ19fIDwgMikgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKF9fS0VSTkVMX18pICovCiAKICNlbmRpZiAvKiBfQVNNX1BPU0lYX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1taXBzL3Byb2Nlc3Nvci5oCmluZGV4IDM2ZjQyZGUuLjU4Y2JhYzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9wcm9jZXNzb3IuaApAQCAtMzksNiArMzksNyBAQAogICogc28gZG9uJ3QgY2hhbmdlIGl0IHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCiAgKi8KICNkZWZpbmUgVEFTS19TSVpFCTB4N2ZmZjgwMDBVTAorI2RlZmluZSBTVEFDS19UT1AJVEFTS19TSVpFCiAKIC8qCiAgKiBUaGlzIGRlY2lkZXMgd2hlcmUgdGhlIGtlcm5lbCB3aWxsIHNlYXJjaCBmb3IgYSBmcmVlIGNodW5rIG9mIHZtCkBAIC01Nyw2ICs1OCw4IEBACiAgKi8KICNkZWZpbmUgVEFTS19TSVpFMzIJMHg3ZmZmODAwMFVMCiAjZGVmaW5lIFRBU0tfU0laRQkweDEwMDAwMDAwMDAwVUwKKyNkZWZpbmUgU1RBQ0tfVE9QCVwKKyAgICAgICh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVF9BRERSKSA/IFRBU0tfU0laRTMyIDogVEFTS19TSVpFKQogCiAvKgogICogVGhpcyBkZWNpZGVzIHdoZXJlIHRoZSBrZXJuZWwgd2lsbCBzZWFyY2ggZm9yIGEgZnJlZSBjaHVuayBvZiB2bQpAQCAtNjksNiArNzIsMTAgQEAKIAkodGVzdF90c2tfdGhyZWFkX2ZsYWcodHNrLCBUSUZfMzJCSVRfQUREUikgPyBUQVNLX1NJWkUzMiA6IFRBU0tfU0laRSkKICNlbmRpZgogCisjaWZkZWYgX19LRVJORUxfXworI2RlZmluZSBTVEFDS19UT1BfTUFYCVRBU0tfU0laRQorI2VuZGlmCisKICNkZWZpbmUgTlVNX0ZQVV9SRUdTCTMyCiAKIHR5cGVkZWYgX191NjQgZnB1cmVnX3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3VzZXIuaCBiL2luY2x1ZGUvYXNtLW1pcHMvdXNlci5oCmluZGV4IDYxZjJhMDkuLmFmYTgzYTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvdXNlci5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvdXNlci5oCkBAIC04LDggKzgsNiBAQAogI2lmbmRlZiBfQVNNX1VTRVJfSAogI2RlZmluZSBfQVNNX1VTRVJfSAogCi0jaWZkZWYgX19LRVJORUxfXwotCiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcmVnLmg+CiAKQEAgLTQ2LDcgKzQ0LDcgQEAKIAl1bnNpZ25lZCBsb25nCXN0YXJ0X2RhdGE7CQkvKiBkYXRhIHN0YXJ0aW5nIGFkZHJlc3MgKi8KIAl1bnNpZ25lZCBsb25nCXN0YXJ0X3N0YWNrOwkJLyogc3RhY2sgc3RhcnRpbmcgYWRkcmVzcyAqLwogCWxvbmcgaW50CXNpZ25hbDsJCQkvKiBzaWduYWwgY2F1c2luZyBjb3JlIGR1bXAgKi8KLQlzdHJ1Y3QgcmVncyAqCXVfYXIwOwkJCS8qIGhlbHAgZ2RiIGZpbmQgcmVnaXN0ZXJzICovCisJdW5zaWduZWQgbG9uZwl1X2FyMDsJCQkvKiBoZWxwIGdkYiBmaW5kIHJlZ2lzdGVycyAqLwogCXVuc2lnbmVkIGxvbmcJbWFnaWM7CQkJLyogaWRlbnRpZmllcyBhIGNvcmUgZmlsZSAqLwogCWNoYXIJCXVfY29tbVszMl07CQkvKiB1c2VyIGNvbW1hbmQgbmFtZSAqLwogfTsKQEAgLTU3LDYgKzU1LDQgQEAKICNkZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIJKHUuc3RhcnRfZGF0YSkKICNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUgkodS5zdGFydF9zdGFjayArIHUudV9zc2l6ZSAqIE5CUEcpCiAKLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KICNlbmRpZiAvKiBfQVNNX1VTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC8uZ2l0aWdub3JlIGIvaW5jbHVkZS9hc20tbW4xMDMwMC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmODdiYTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwLy5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACitwcm9jCit1bml0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL0tidWlsZCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5Mzg0YzUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL0tidWlsZApAQCAtMCwwICsxLDUgQEAKK2luY2x1ZGUgaW5jbHVkZS9hc20tZ2VuZXJpYy9LYnVpbGQuYXNtCisKK3VuaWZkZWYteSArPSB0ZXJtaW9zLmgKK3VuaWZkZWYteSArPSBwdHJhY2UuaAordW5pZmRlZi15ICs9IHBhZ2UuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvYXRvbWljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdjOTY5MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvYXRvbWljLmgKQEAgLTAsMCArMSwxNjYgQEAKKy8qIE1OMTAzMDAgQXRvbWljIGNvdW50ZXIgb3BlcmF0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfQVNNX0FUT01JQ19ICisjZGVmaW5lIF9BU01fQVRPTUlDX0gKKworI2lmZGVmIENPTkZJR19TTVAKKyNlcnJvciBub3QgU01QIHNhZmUKKyNlbmRpZgorCisvKgorICogQXRvbWljIG9wZXJhdGlvbnMgdGhhdCBDIGNhbid0IGd1YXJhbnRlZSB1cy4gIFVzZWZ1bCBmb3IKKyAqIHJlc291cmNlIGNvdW50aW5nIGV0Yy4uCisgKi8KKworLyoKKyAqIE1ha2Ugc3VyZSBnY2MgZG9lc24ndCB0cnkgdG8gYmUgY2xldmVyIGFuZCBtb3ZlIHRoaW5ncyBhcm91bmQKKyAqIG9uIHVzLiBXZSBuZWVkIHRvIHVzZSBfZXhhY3RseV8gdGhlIGFkZHJlc3MgdGhlIHVzZXIgZ2F2ZSB1cywKKyAqIG5vdCBzb21lIGFsaWFzIHRoYXQgY29udGFpbnMgdGhlIHNhbWUgaW5mb3JtYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQJY291bnRlcjsKK30gYXRvbWljX3Q7CisKKyNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIGF0b21pY19yZWFkIC0gcmVhZCBhdG9taWMgdmFyaWFibGUKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqCisgKiBBdG9taWNhbGx5IHJlYWRzIHRoZSB2YWx1ZSBvZiBAdi4gIE5vdGUgdGhhdCB0aGUgZ3VhcmFudGVlZAorICogdXNlZnVsIHJhbmdlIG9mIGFuIGF0b21pY190IGlzIG9ubHkgMjQgYml0cy4KKyAqLworI2RlZmluZSBhdG9taWNfcmVhZCh2KQkoKHYpLT5jb3VudGVyKQorCisvKioKKyAqIGF0b21pY19zZXQgLSBzZXQgYXRvbWljIHZhcmlhYmxlCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKiBAaTogcmVxdWlyZWQgdmFsdWUKKyAqCisgKiBBdG9taWNhbGx5IHNldHMgdGhlIHZhbHVlIG9mIEB2IHRvIEBpLiAgTm90ZSB0aGF0IHRoZSBndWFyYW50ZWVkCisgKiB1c2VmdWwgcmFuZ2Ugb2YgYW4gYXRvbWljX3QgaXMgb25seSAyNCBiaXRzLgorICovCisjZGVmaW5lIGF0b21pY19zZXQodiwgaSkgKCgodiktPmNvdW50ZXIpID0gKGkpKQorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisvKioKKyAqIGF0b21pY19hZGRfcmV0dXJuIC0gYWRkIGludGVnZXIgdG8gYXRvbWljIHZhcmlhYmxlCisgKiBAaTogaW50ZWdlciB2YWx1ZSB0byBhZGQKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqCisgKiBBdG9taWNhbGx5IGFkZHMgQGkgdG8gQHYgYW5kIHJldHVybnMgdGhlIHJlc3VsdAorICogTm90ZSB0aGF0IHRoZSBndWFyYW50ZWVkIHVzZWZ1bCByYW5nZSBvZiBhbiBhdG9taWNfdCBpcyBvbmx5IDI0IGJpdHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19hZGRfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB0ZW1wOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXRlbXAgPSB2LT5jb3VudGVyOworCXRlbXAgKz0gaTsKKwl2LT5jb3VudGVyID0gdGVtcDsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gdGVtcDsKK30KKworLyoqCisgKiBhdG9taWNfc3ViX3JldHVybiAtIHN1YnRyYWN0IGludGVnZXIgZnJvbSBhdG9taWMgdmFyaWFibGUKKyAqIEBpOiBpbnRlZ2VyIHZhbHVlIHRvIHN1YnRyYWN0CisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKgorICogQXRvbWljYWxseSBzdWJ0cmFjdHMgQGkgZnJvbSBAdiBhbmQgcmV0dXJucyB0aGUgcmVzdWx0CisgKiBOb3RlIHRoYXQgdGhlIGd1YXJhbnRlZWQgdXNlZnVsIHJhbmdlIG9mIGFuIGF0b21pY190IGlzIG9ubHkgMjQgYml0cy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYXRvbWljX3N1Yl9yZXR1cm4oaW50IGksIGF0b21pY190ICp2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHRlbXA7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJdGVtcCA9IHYtPmNvdW50ZXI7CisJdGVtcCAtPSBpOworCXYtPmNvdW50ZXIgPSB0ZW1wOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiB0ZW1wOworfQorCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfYWRkX25lZ2F0aXZlKGludCBpLCBhdG9taWNfdCAqdikKK3sKKwlyZXR1cm4gYXRvbWljX2FkZF9yZXR1cm4oaSwgdikgPCAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2FkZChpbnQgaSwgYXRvbWljX3QgKnYpCit7CisJYXRvbWljX2FkZF9yZXR1cm4oaSwgdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfc3ViKGludCBpLCBhdG9taWNfdCAqdikKK3sKKwlhdG9taWNfc3ViX3JldHVybihpLCB2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19pbmMoYXRvbWljX3QgKnYpCit7CisJYXRvbWljX2FkZF9yZXR1cm4oMSwgdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfZGVjKGF0b21pY190ICp2KQoreworCWF0b21pY19zdWJfcmV0dXJuKDEsIHYpOworfQorCisjZGVmaW5lIGF0b21pY19kZWNfcmV0dXJuKHYpCQlhdG9taWNfc3ViX3JldHVybigxLCAodikpCisjZGVmaW5lIGF0b21pY19pbmNfcmV0dXJuKHYpCQlhdG9taWNfYWRkX3JldHVybigxLCAodikpCisKKyNkZWZpbmUgYXRvbWljX3N1Yl9hbmRfdGVzdChpLCB2KQkoYXRvbWljX3N1Yl9yZXR1cm4oKGkpLCAodikpID09IDApCisjZGVmaW5lIGF0b21pY19kZWNfYW5kX3Rlc3QodikJCShhdG9taWNfc3ViX3JldHVybigxLCAodikpID09IDApCisjZGVmaW5lIGF0b21pY19pbmNfYW5kX3Rlc3QodikJCShhdG9taWNfYWRkX3JldHVybigxLCAodikpID09IDApCisKKyNkZWZpbmUgYXRvbWljX2FkZF91bmxlc3ModiwgYSwgdSkJCQkJXAorKHsJCQkJCQkJCVwKKwlpbnQgYywgb2xkOwkJCQkJCVwKKwljID0gYXRvbWljX3JlYWQodik7CQkJCQlcCisJd2hpbGUgKGMgIT0gKHUpICYmIChvbGQgPSBhdG9taWNfY21weGNoZygodiksIGMsIGMgKyAoYSkpKSAhPSBjKSBcCisJCWMgPSBvbGQ7CQkJCQlcCisJYyAhPSAodSk7CQkJCQkJXAorfSkKKworI2RlZmluZSBhdG9taWNfaW5jX25vdF96ZXJvKHYpIGF0b21pY19hZGRfdW5sZXNzKCh2KSwgMSwgMCkKKworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19jbGVhcl9tYXNrKHVuc2lnbmVkIGxvbmcgbWFzaywgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbWFzayA9IH5tYXNrOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkqYWRkciAmPSBtYXNrOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworI2RlZmluZSBhdG9taWNfeGNoZyhwdHIsIHYpCQkoeGNoZygmKHB0ciktPmNvdW50ZXIsICh2KSkpCisjZGVmaW5lIGF0b21pY19jbXB4Y2hnKHYsIG9sZCwgbmV3KQkoY21weGNoZygmKCh2KS0+Y291bnRlciksIChvbGQpLCAobmV3KSkpCisKKy8qIEF0b21pYyBvcGVyYXRpb25zIGFyZSBhbHJlYWR5IHNlcmlhbGl6aW5nIG9uIE1OMTAzMDA/Pz8gKi8KKyNkZWZpbmUgc21wX21iX19iZWZvcmVfYXRvbWljX2RlYygpCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfbWJfX2FmdGVyX2F0b21pY19kZWMoKQliYXJyaWVyKCkKKyNkZWZpbmUgc21wX21iX19iZWZvcmVfYXRvbWljX2luYygpCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfbWJfX2FmdGVyX2F0b21pY19pbmMoKQliYXJyaWVyKCkKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2F0b21pYy5oPgorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9BU01fQVRPTUlDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvYXV4dmVjLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2F1eHZlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZGI2MGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2F1eHZlYy5oCkBAIC0wLDAgKzEsNCBAQAorI2lmbmRlZiBfQVNNX0FVWFZFQ19ICisjZGVmaW5lIF9BU01fQVVYVkVDX0gKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL2JpdG9wcy5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9iaXRvcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzZkNDBjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9iaXRvcHMuaApAQCAtMCwwICsxLDIyOSBAQAorLyogTU4xMDMwMCBiaXQgb3BlcmF0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGVzZSBoYXZlIHRvIGJlIGRvbmUgd2l0aCBpbmxpbmUgYXNzZW1ibHk6IHRoYXQgd2F5IHRoZSBiaXQtc2V0dGluZworICogaXMgZ3VhcmFudGVlZCB0byBiZSBhdG9taWMuIEFsbCBiaXQgb3BlcmF0aW9ucyByZXR1cm4gMCBpZiB0aGUgYml0CisgKiB3YXMgY2xlYXJlZCBiZWZvcmUgdGhlIG9wZXJhdGlvbiBhbmQgIT0gMCBpZiBpdCB3YXMgbm90LgorICoKKyAqIGJpdCAwIGlzIHRoZSBMU0Igb2YgYWRkcjsgYml0IDMyIGlzIHRoZSBMU0Igb2YgKGFkZHIrMSkuCisgKi8KKyNpZm5kZWYgX19BU01fQklUT1BTX0gKKyNkZWZpbmUgX19BU01fQklUT1BTX0gKKworI2luY2x1ZGUgPGFzbS9jcHUtcmVncy5oPgorCisjZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpCWJhcnJpZXIoKQorCisvKgorICogc2V0IGJpdAorICovCisjZGVmaW5lIF9fc2V0X2JpdChuciwgYWRkcikJCQkJCVwKKyh7CQkJCQkJCQlcCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqX2EgPSAodW5zaWduZWQgY2hhciAqKShhZGRyKTsJXAorCWNvbnN0IHVuc2lnbmVkIHNoaWZ0ID0gKG5yKSAmIDc7CQkJXAorCV9hICs9IChucikgPj4gMzsJCQkJCVwKKwkJCQkJCQkJXAorCWFzbSB2b2xhdGlsZSgiYnNldCAlMiwoJTEpICMgc2V0X2JpdCByZWciCQlcCisJCSAgICAgOiAiPW0iKCpfYSkJCQkJXAorCQkgICAgIDogImEiKF9hKSwgImQiKDEgPDwgc2hpZnQpLCAgIm0iKCpfYSkJXAorCQkgICAgIDogIm1lbW9yeSIsICJjYyIpOwkJCQlcCit9KQorCisjZGVmaW5lIHNldF9iaXQobnIsIGFkZHIpIF9fc2V0X2JpdCgobnIpLCAoYWRkcikpCisKKy8qCisgKiBjbGVhciBiaXQKKyAqLworI2RlZmluZSBfX19jbGVhcl9iaXQobnIsIGFkZHIpCQkJCQlcCisoewkJCQkJCQkJXAorCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKl9hID0gKHVuc2lnbmVkIGNoYXIgKikoYWRkcik7CVwKKwljb25zdCB1bnNpZ25lZCBzaGlmdCA9IChucikgJiA3OwkJCVwKKwlfYSArPSAobnIpID4+IDM7CQkJCQlcCisJCQkJCQkJCVwKKwlhc20gdm9sYXRpbGUoImJjbHIgJTIsKCUxKSAjIGNsZWFyX2JpdCByZWciCQlcCisJCSAgICAgOiAiPW0iKCpfYSkJCQkJXAorCQkgICAgIDogImEiKF9hKSwgImQiKDEgPDwgc2hpZnQpLCAibSIoKl9hKQlcCisJCSAgICAgOiAibWVtb3J5IiwgImNjIik7CQkJCVwKK30pCisKKyNkZWZpbmUgY2xlYXJfYml0KG5yLCBhZGRyKSBfX19jbGVhcl9iaXQoKG5yKSwgKGFkZHIpKQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2NsZWFyX2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKmFkZHIpCit7CisJdW5zaWduZWQgaW50ICphID0gKHVuc2lnbmVkIGludCAqKSBhZGRyOworCWludCBtYXNrOworCisJYSArPSBuciA+PiA1OworCW1hc2sgPSAxIDw8IChuciAmIDB4MWYpOworCSphICY9IH5tYXNrOworfQorCisvKgorICogdGVzdCBiaXQKKyAqLworc3RhdGljIGlubGluZSBpbnQgdGVzdF9iaXQoaW50IG5yLCBjb25zdCB2b2xhdGlsZSB2b2lkICphZGRyKQoreworCXJldHVybiAxVUwgJiAoKChjb25zdCB1bnNpZ25lZCBpbnQgKikgYWRkcilbbnIgPj4gNV0gPj4gKG5yICYgMzEpKTsKK30KKworLyoKKyAqIGNoYW5nZSBiaXQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKmFkZHIpCit7CisJaW50CW1hc2s7CisJdW5zaWduZWQgaW50ICphID0gKHVuc2lnbmVkIGludCAqKSBhZGRyOworCisJYSArPSBuciA+PiA1OworCW1hc2sgPSAxIDw8IChuciAmIDB4MWYpOworCSphIF49IG1hc2s7Cit9CisKK2V4dGVybiB2b2lkIGNoYW5nZV9iaXQoaW50IG5yLCB2b2xhdGlsZSB2b2lkICphZGRyKTsKKworLyoKKyAqIHRlc3QgYW5kIHNldCBiaXQKKyAqLworI2RlZmluZSBfX3Rlc3RfYW5kX3NldF9iaXQobnIsYWRkcikJCQkJXAorKHsJCQkJCQkJCVwKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpfYSA9ICh1bnNpZ25lZCBjaGFyICopKGFkZHIpOwlcCisJY29uc3QgdW5zaWduZWQgc2hpZnQgPSAobnIpICYgNzsJCQlcCisJdW5zaWduZWQgZXBzdzsJCQkJCQlcCisJX2EgKz0gKG5yKSA+PiAzOwkJCQkJXAorCQkJCQkJCQlcCisJYXNtIHZvbGF0aWxlKCJic2V0ICUzLCglMikgIyB0ZXN0X3NldF9iaXQgcmVnXG4iCVwKKwkJICAgICAibW92IGVwc3csJTEiCQkJCVwKKwkJICAgICA6ICI9bSIoKl9hKSwgIj1kIihlcHN3KQkJCVwKKwkJICAgICA6ICJhIihfYSksICJkIigxIDw8IHNoaWZ0KSwgIm0iKCpfYSkJXAorCQkgICAgIDogIm1lbW9yeSIsICJjYyIpOwkJCQlcCisJCQkJCQkJCVwKKwkhKGVwc3cgJiBFUFNXX0ZMQUdfWik7CQkJCQlcCit9KQorCisjZGVmaW5lIHRlc3RfYW5kX3NldF9iaXQobnIsIGFkZHIpIF9fdGVzdF9hbmRfc2V0X2JpdCgobnIpLCAoYWRkcikpCisKKy8qCisgKiB0ZXN0IGFuZCBjbGVhciBiaXQKKyAqLworI2RlZmluZSBfX3Rlc3RfYW5kX2NsZWFyX2JpdChuciwgYWRkcikJCQkJXAorKHsJCQkJCQkJCVwKKyAgICAgICAgdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqX2EgPSAodW5zaWduZWQgY2hhciAqKShhZGRyKTsJXAorCWNvbnN0IHVuc2lnbmVkIHNoaWZ0ID0gKG5yKSAmIDc7CQkJXAorCXVuc2lnbmVkIGVwc3c7CQkJCQkJXAorCV9hICs9IChucikgPj4gMzsJCQkJCVwKKwkJCQkJCQkJXAorCWFzbSB2b2xhdGlsZSgiYmNsciAlMywoJTIpICMgdGVzdF9jbGVhcl9iaXQgcmVnXG4iCVwKKwkJICAgICAibW92IGVwc3csJTEiCQkJCVwKKwkJICAgICA6ICI9bSIoKl9hKSwgIj1kIihlcHN3KQkJCVwKKwkJICAgICA6ICJhIihfYSksICJkIigxIDw8IHNoaWZ0KSwgIm0iKCpfYSkJXAorCQkgICAgIDogIm1lbW9yeSIsICJjYyIpOwkJCQlcCisJCQkJCQkJCVwKKwkhKGVwc3cgJiBFUFNXX0ZMQUdfWik7CQkJCQlcCit9KQorCisjZGVmaW5lIHRlc3RfYW5kX2NsZWFyX2JpdChuciwgYWRkcikgX190ZXN0X2FuZF9jbGVhcl9iaXQoKG5yKSwgKGFkZHIpKQorCisvKgorICogdGVzdCBhbmQgY2hhbmdlIGJpdAorICovCitzdGF0aWMgaW5saW5lIGludCBfX3Rlc3RfYW5kX2NoYW5nZV9iaXQoaW50IG5yLCB2b2xhdGlsZSB2b2lkICphZGRyKQoreworCWludAltYXNrLCByZXR2YWw7CisJdW5zaWduZWQgaW50ICphID0gKHVuc2lnbmVkIGludCAqKWFkZHI7CisKKwlhICs9IG5yID4+IDU7CisJbWFzayA9IDEgPDwgKG5yICYgMHgxZik7CisJcmV0dmFsID0gKG1hc2sgJiAqYSkgIT0gMDsKKwkqYSBePSBtYXNrOworCisJcmV0dXJuIHJldHZhbDsKK30KKworZXh0ZXJuIGludCB0ZXN0X2FuZF9jaGFuZ2VfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqYWRkcik7CisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvbG9jay5oPgorCisjaWZkZWYgX19LRVJORUxfXworCisvKioKKyAqIF9fZmZzIC0gZmluZCBmaXJzdCBiaXQgc2V0CisgKiBAeDogdGhlIHdvcmQgdG8gc2VhcmNoCisgKgorICogLSByZXR1cm4gMzEuLjAgdG8gaW5kaWNhdGUgYml0IDMxLi4wIG1vc3QgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHNldAorICogLSBpZiBubyBiaXRzIGFyZSBzZXQgaW4geCwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQKKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpCit1bnNpZ25lZCBsb25nIF9fZmZzKHVuc2lnbmVkIGxvbmcgeCkKK3sKKwlpbnQgYml0OworCWFzbSgiYnNjaCAlMiwlMCIgOiAiPXIiKGJpdCkgOiAiMCIoMCksICJyIih4ICYgLXgpKTsKKwlyZXR1cm4gYml0OworfQorCisvKgorICogc3BlY2lhbCBzbGltbGluZSB2ZXJzaW9uIG9mIGZscygpIGZvciBjYWxjdWxhdGluZyBpbG9nMl91MzIoKQorICogLSBub3RlOiBubyBwcm90ZWN0aW9uIGFnYWluc3QgbiA9PSAwCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXygoY29uc3QpKQoraW50IF9faWxvZzJfdTMyKHUzMiBuKQoreworCWludCBiaXQ7CisJYXNtKCJic2NoICUyLCUwIiA6ICI9ciIoYml0KSA6ICIwIigwKSwgInIiKG4pKTsKKwlyZXR1cm4gYml0OworfQorCisvKioKKyAqIGZscyAtIGZpbmQgbGFzdCBiaXQgc2V0CisgKiBAeDogdGhlIHdvcmQgdG8gc2VhcmNoCisgKgorICogVGhpcyBpcyBkZWZpbmVkIHRoZSBzYW1lIHdheSBhcyBmZnM6CisgKiAtIHJldHVybiAzMi4uMSB0byBpbmRpY2F0ZSBiaXQgMzEuLjAgbW9zdCBzaWduaWZpY2FudCBiaXQgc2V0CisgKiAtIHJldHVybiAwIHRvIGluZGljYXRlIG5vIGJpdHMgc2V0CisgKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXygoY29uc3QpKQoraW50IGZscyhpbnQgeCkKK3sKKwlyZXR1cm4gKHggIT0gMCkgPyBfX2lsb2cyX3UzMih4KSArIDEgOiAwOworfQorCisvKioKKyAqIGZmcyAtIGZpbmQgZmlyc3QgYml0IHNldAorICogQHg6IHRoZSB3b3JkIHRvIHNlYXJjaAorICoKKyAqIC0gcmV0dXJuIDMyLi4xIHRvIGluZGljYXRlIGJpdCAzMS4uMCBtb3N0IGxlYXN0IHNpZ25pZmljYW50IGJpdCBzZXQKKyAqIC0gcmV0dXJuIDAgdG8gaW5kaWNhdGUgbm8gYml0cyBzZXQKKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpCitpbnQgZmZzKGludCB4KQoreworCS8qIE5vdGU6ICh4ICYgLXgpIGdpdmVzIHVzIGEgbWFzayB0aGF0IGlzIHRoZSBsZWFzdCBzaWduaWZpY2FudAorCSAqIChyaWdodG1vc3QpIDEtYml0IG9mIHRoZSB2YWx1ZSBpbiB4LgorCSAqLworCXJldHVybiBmbHMoeCAmIC14KTsKK30KKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9mZnouaD4KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvZmxzNjQuaD4KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvZmluZC5oPgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9od2VpZ2h0Lmg+CisKKyNkZWZpbmUgZXh0Ml9zZXRfYml0X2F0b21pYyhsb2NrLCBuciwgYWRkcikgXAorCXRlc3RfYW5kX3NldF9iaXQoKG5yKSBeIDB4MTgsIChhZGRyKSkKKyNkZWZpbmUgZXh0Ml9jbGVhcl9iaXRfYXRvbWljKGxvY2ssIG5yLCBhZGRyKSBcCisJdGVzdF9hbmRfY2xlYXJfYml0KChucikgXiAweDE4LCAoYWRkcikpCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvZXh0Mi1ub24tYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL21pbml4LWxlLmg+CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX19BU01fQklUT1BTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvYnVnLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2J1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmY2YzMzgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2J1Zy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIE1OMTAzMDAgS2VybmVsIGJ1ZyByZXBvcnRpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9CVUdfSAorI2RlZmluZSBfQVNNX0JVR19ICisKKy8qCisgKiBUZWxsIHRoZSB1c2VyIHRoZXJlIGlzIHNvbWUgcHJvYmxlbS4KKyAqLworI2RlZmluZSBfZGVidWdfYnVnX3RyYXAoKQkJCQkJXAorZG8gewkJCQkJCQkJXAorCWFzbSB2b2xhdGlsZSgJCQkJCQlcCisJCSIJc3lzY2FsbCAxNQkJCVxuIglcCisJCSIwOgkJCQkJXG4iCVwKKwkJIgkuc2VjdGlvbiBfX2J1Z190YWJsZSxcImFcIglcbiIJXAorCQkiCS5sb25nIDBiLCUwLCUxCQkJXG4iCVwKKwkJIgkucHJldmlvdXMJCQlcbiIJXAorCQk6CQkJCQkJXAorCQk6ICJpIihfX0ZJTEVfXyksICJpIihfX0xJTkVfXykJCQlcCisJCSk7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBCVUcoKSBfZGVidWdfYnVnX3RyYXAoKQorCisjZGVmaW5lIEhBVkVfQVJDSF9CVUcKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9idWcuaD4KKworI2VuZGlmIC8qIF9BU01fQlVHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvYnVncy5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9idWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFjOGJjNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvYnVncy5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qIE1OMTAzMDAgQ2hlY2tzIGZvciBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGJ1Z3MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9CVUdTX0gKKyNkZWZpbmUgX0FTTV9CVUdTX0gKKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBjaGVja19idWdzKHZvaWQpCit7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0JVR1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9idXNjdGwtcmVncy5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9idXNjdGwtcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MzJhZWYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2J1c2N0bC1yZWdzLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qIEFNMzN2MiBvbi1ib2FyZCBidXMgY29udHJvbGxlciByZWdpc3RlcnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfQVNNX0JVU0NUTF9SRUdTX0gKKyNkZWZpbmUgX0FTTV9CVVNDVExfUkVHU19ICisKKyNpbmNsdWRlIDxhc20vY3B1LXJlZ3MuaD4KKworI2lmZGVmIF9fS0VSTkVMX18KKworLyogYnVzIGNvbnRyb2xsZXIgcmVnaXN0ZXJzICovCisjZGVmaW5lIEJDQ1IJCQlfX1NZU1JFRygweGMwMDAyMDAwLCB1MzIpCS8qIGJ1cyBjb250cm9sbGVyIGNvbnRyb2wgcmVnICovCisjZGVmaW5lIEJDQ1JfQjBBRAkJMHgwMDAwMDAwMwkvKiBibG9jayAwICg4MDAwMDAwMC04M2ZmZmZmZikgYnVzIGFsbG9jYXRpb24gKi8KKyNkZWZpbmUgQkNDUl9CMUFECQkweDAwMDAwMDBjCS8qIGJsb2NrIDEgKDg0MDAwMDAwLTg3ZmZmZmZmKSBidXMgYWxsb2NhdGlvbiAqLworI2RlZmluZSBCQ0NSX0IyQUQJCTB4MDAwMDAwMzAJLyogYmxvY2sgMiAoODgwMDAwMDAtOGJmZmZmZmYpIGJ1cyBhbGxvY2F0aW9uICovCisjZGVmaW5lIEJDQ1JfQjNBRAkJMHgwMDAwMDBjMAkvKiBibG9jayAzICg4YzAwMDAwMC04ZmZmZmZmZikgYnVzIGFsbG9jYXRpb24gKi8KKyNkZWZpbmUgQkNDUl9CNEFECQkweDAwMDAwMzAwCS8qIGJsb2NrIDQgKDkwMDAwMDAwLTkzZmZmZmZmKSBidXMgYWxsb2NhdGlvbiAqLworI2RlZmluZSBCQ0NSX0I1QUQJCTB4MDAwMDBjMDAJLyogYmxvY2sgNSAoOTQwMDAwMDAtOTdmZmZmZmYpIGJ1cyBhbGxvY2F0aW9uICovCisjZGVmaW5lIEJDQ1JfQjZBRAkJMHgwMDAwMzAwMAkvKiBibG9jayA2ICg5ODAwMDAwMC05YmZmZmZmZikgYnVzIGFsbG9jYXRpb24gKi8KKyNkZWZpbmUgQkNDUl9CN0FECQkweDAwMDBjMDAwCS8qIGJsb2NrIDcgKDljMDAwMDAwLTlmZmZmZmZmKSBidXMgYWxsb2NhdGlvbiAqLworI2RlZmluZSBCQ0NSX0J4QURfRVhCVVMJCTB4MAkJLyogLSBkaXJlY3QgdG8gc3lzdGVtIGJ1cyBjb250cm9sbGVyICovCisjZGVmaW5lIEJDQ1JfQnhBRF9PUEVYQlVTCTB4MQkJLyogLSBkaXJlY3QgdG8gbWVtb3J5IGJ1cyBjb250cm9sbGVyICovCisjZGVmaW5lIEJDQ1JfQnhBRF9PQ01CVVMJMHgyCQkvKiAtIGRpcmVjdCB0byBvbiBjaGlwIG1lbW9yeSAqLworI2RlZmluZSBCQ0NSX0FQSQkJMHgwMDA3MDAwMAkvKiBidXMgYXJiaXRyYXRpb24gcHJpb3JpdHkgKi8KKyNkZWZpbmUgQkNDUl9BUElfRE1BQ0lDRAkweDAwMDAwMDAwCS8qIC0gRE1BID4gQ0kgPiBDRCAqLworI2RlZmluZSBCQ0NSX0FQSV9ETUFDRENJCTB4MDAwMTAwMDAJLyogLSBETUEgPiBDRCA+IENJICovCisjZGVmaW5lIEJDQ1JfQVBJX0NJQ0RETUEJMHgwMDAyMDAwMAkvKiAtIENJID4gQ0QgPiBETUEgKi8KKyNkZWZpbmUgQkNDUl9BUElfQ0RDSURNQQkweDAwMDMwMDAwCS8qIC0gQ0QgPiBDSSA+IERNQSAqLworI2RlZmluZSBCQ0NSX0FQSV9ST1VORFJPQklOCTB4MDAwNDAwMDAJLyogLSByb3VuZCByb2JpbiAqLworI2RlZmluZSBCQ0NSX0JFUFJJX0RNQUNJQ0QJMHgwMGMwMDAwMAkvKiBidXMgZXJyb3IgYWRkcmVzcyBwcmlvcml0eSAqLworI2RlZmluZSBCQ0NSX0JFUFJJX0RNQUNEQ0kJMHgwMDAwMDAwMAkvKiAtIERNQSA+IENJID4gQ0QgKi8KKyNkZWZpbmUgQkNDUl9CRVBSSV9DSUNERE1BCTB4MDA0MDAwMDAJLyogLSBETUEgPiBDRCA+IENJICovCisjZGVmaW5lIEJDQ1JfQkVQUklfQ0RDSURNQQkweDAwODAwMDAwCS8qIC0gQ0kgPiBDRCA+IERNQSAqLworI2RlZmluZSBCQ0NSX0JFUFJJCQkweDAwYzAwMDAwCS8qIC0gQ0QgPiBDSSA+IERNQSAqLworI2RlZmluZSBCQ0NSX1RNT04JCTB4MDMwMDAwMDAJLyogdGltZW91dCB2YWx1ZSBzZXR0aW5ncyAqLworI2RlZmluZSBCQ0NSX1RNT05fMTZJT0NMSwkweDAwMDAwMDAwCS8qIC0gMTYgSU9DTEsgY3ljbGVzICovCisjZGVmaW5lIEJDQ1JfVE1PTl8yNTZJT0NMSwkweDAxMDAwMDAwCS8qIC0gMjU2IElPQ0xLIGN5Y2xlcyAqLworI2RlZmluZSBCQ0NSX1RNT05fNDA5NklPQ0xLCTB4MDIwMDAwMDAJLyogLSA0MDk2IElPQ0xLIGN5Y2xlcyAqLworI2RlZmluZSBCQ0NSX1RNT05fNjU1MzZJT0NMSwkweDAzMDAwMDAwCS8qIC0gNjU1MzYgSU9DTEsgY3ljbGVzICovCisjZGVmaW5lIEJDQ1JfVE1PRQkJMHgxMDAwMDAwMAkvKiB0aW1lb3V0IGRldGVjdGlvbiBlbmFibGUgKi8KKworI2RlZmluZSBCQ0JFUlIJCQlfX1NZU1JFRygweGMwMDAyMDEwLCB1MzIpCS8qIGJ1cyBlcnJvciBzb3VyY2UgcmVnICovCisjZGVmaW5lIEJDQkVSUl9CRVNCCQkweDAwMDAwMDFmCS8qIGVycm9uZW91cyBhY2Nlc3MgZGVzdGluYXRpb24gc3BhY2UgKi8KKyNkZWZpbmUgQkNCRVJSX0JFU0JfTU9OCQkweDAwMDAwMDAxCS8qIC0gbW9uaXRvciBzcGFjZSAqLworI2RlZmluZSBCQ0JFUlJfQkVTQl9JTwkJMHgwMDAwMDAwMgkvKiAtIElPIGJ1cyAqLworI2RlZmluZSBCQ0JFUlJfQkVTQl9FWAkJMHgwMDAwMDAwNAkvKiAtIEVYIGJ1cyAqLworI2RlZmluZSBCQ0JFUlJfQkVTQl9PUEVYCTB4MDAwMDAwMDgJLyogLSBPcEVYIGJ1cyAqLworI2RlZmluZSBCQ0JFUlJfQkVTQl9PQ00JCTB4MDAwMDAwMTAJLyogLSBvbiBjaGlwIG1lbW9yeSAqLworI2RlZmluZSBCQ0JFUlJfQkVSVwkJMHgwMDAwMDEwMAkvKiB0eXBlIG9mIGFjY2VzcyAqLworI2RlZmluZSBCQ0JFUlJfQkVSV19XUklURQkweDAwMDAwMDAwCS8qIC0gd3JpdGUgKi8KKyNkZWZpbmUgQkNCRVJSX0JFUldfUkVBRAkweDAwMDAwMTAwCS8qIC0gcmVhZCAqLworI2RlZmluZSBCQ0JFUlJfQkVTRAkJMHgwMDAwMDIwMAkvKiBlcnJvciBkZXRlY3RvciAqLworI2RlZmluZSBCQ0JFUlJfQkVTRF9CQ1UJCTB4MDAwMDAwMDAJLyogLSBCQ1UgZGV0ZWN0ZWQgZXJyb3IgKi8KKyNkZWZpbmUgQkNCRVJSX0JFU0RfU0xBVkVfQlVTCTB4MDAwMDAyMDAJLyogLSBzbGF2ZSBidXMgZGV0ZWN0ZWQgZXJyb3IgKi8KKyNkZWZpbmUgQkNCRVJSX0JFQlNUCQkweDAwMDAwNDAwCS8qIHR5cGUgb2YgYWNjZXNzICovCisjZGVmaW5lIEJDQkVSUl9CRUJTVF9TSU5HTEUJMHgwMDAwMDAwMAkvKiAtIHNpbmdsZSAqLworI2RlZmluZSBCQ0JFUlJfQkVCU1RfQlVSU1QJMHgwMDAwMDQwMAkvKiAtIGJ1cnN0ICovCisjZGVmaW5lIEJDQkVSUl9CRU1FCQkweDAwMDAwODAwCS8qIG11bHRpcGxlIGJ1cyBlcnJvciBmbGFnICovCisjZGVmaW5lIEJDQkVSUl9CRU1SCQkweDAwMDA3MDAwCS8qIG1hc3RlciBidXMgdGhhdCBjYXVzZWQgdGhlIGVycm9yICovCisjZGVmaW5lIEJDQkVSUl9CRU1SX05PRVJST1IJMHgwMDAwMDAwMAkvKiAtIG5vIGVycm9yICovCisjZGVmaW5lIEJDQkVSUl9CRU1SX0NJCQkweDAwMDAxMDAwCS8qIC0gQ1BVIGluc3RydWN0aW9uIGZldGNoIGJ1cyBjYXVzZWQgZXJyb3IgKi8KKyNkZWZpbmUgQkNCRVJSX0JFTVJfQ0QJCTB4MDAwMDIwMDAJLyogLSBDUFUgZGF0YSBidXMgY2F1c2VkIGVycm9yICovCisjZGVmaW5lIEJDQkVSUl9CRU1SX0RNQQkJMHgwMDAwNDAwMAkvKiAtIERNQSBidXMgY2F1c2VkIGVycm9yICovCisKKyNkZWZpbmUgQkNCRUFSCQkJX19TWVNSRUdDKDB4YzAwMDIwMjAsIHUzMikJLyogYnVzIGVycm9yIGFkZHJlc3MgcmVnICovCisKKy8qIHN5c3RlbSBidXMgY29udHJvbGxlciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU0JCQVNFKFgpCQlfX1NZU1JFRygweGQ4YzAwMTAwICsgKFgpICogMHgxMCwgdTMyKQkvKiBTQkMgYmFzZSBhZGRyIHJlZ3MgKi8KKyNkZWZpbmUgU0JCQVNFX0JFCQkweDAwMDAwMDAxCS8qIGJhbmsgZW5hYmxlICovCisjZGVmaW5lIFNCQkFTRV9CQU0JCTB4MDAwMGZmZmUJLyogYmFuayBhZGRyZXNzIG1hc2sgWzMxOjE3XSAqLworI2RlZmluZSBTQkJBU0VfQkJBCQkweGZmZmUwMDAwCS8qIGJhbmsgYmFzZSBhZGRyZXNzIFszMToxN10gKi8KKworI2RlZmluZSBTQkNOVFJMMChYKQkJX19TWVNSRUcoMHhkOGMwMDIwMCArIChYKSAqIDB4MTAsIHUzMikJLyogU0JDIGJhbmsgY3RybDAgcmVncyAqLworI2RlZmluZSBTQkNOVFJMMF9XRUgJCTB4MDAwMDBmMDAJLyogd3JpdGUgZW5hYmxlIGhvbGQgKi8KKyNkZWZpbmUgU0JDTlRSTDBfUkVICQkweDAwMDBmMDAwCS8qIHJlYWQgZW5hYmxlIGhvbGQgKi8KKyNkZWZpbmUgU0JDTlRSTDBfUldICQkweDAwMGYwMDAwCS8qIFNSVyBzaWduYWwgaG9sZCAqLworI2RlZmluZSBTQkNOVFJMMF9DU0gJCTB4MDBmMDAwMDAJLyogY2hpcCBzZWxlY3QgaG9sZCAqLworI2RlZmluZSBTQkNOVFJMMF9EQUgJCTB4MGYwMDAwMDAJLyogZGF0YSBob2xkICovCisjZGVmaW5lIFNCQ05UUkwwX0FESAkJMHhmMDAwMDAwMAkvKiBhZGRyZXNzIGhvbGQgKi8KKworI2RlZmluZSBTQkNOVFJMMShYKQkJX19TWVNSRUcoMHhkOGMwMDIwNCArIChYKSAqIDB4MTAsIHUzMikJLyogU0JDIGJhbmsgY3RybDEgcmVncyAqLworI2RlZmluZSBTQkNOVFJMMV9XRUQJCTB4MDAwMDBmMDAJLyogd3JpdGUgZW5hYmxlIGRlbGF5ICovCisjZGVmaW5lIFNCQ05UUkwxX1JFRAkJMHgwMDAwZjAwMAkvKiByZWFkIGVuYWJsZSBkZWxheSAqLworI2RlZmluZSBTQkNOVFJMMV9SV0QJCTB4MDAwZjAwMDAJLyogU1JXIHNpZ25hbCBkZWxheSAqLworI2RlZmluZSBTQkNOVFJMMV9BU1cJCTB4MDBmMDAwMDAJLyogYWRkcmVzcyBzdHJvYmUgd2lkdGggKi8KKyNkZWZpbmUgU0JDTlRSTDFfQ1NECQkweDBmMDAwMDAwCS8qIGNoaXAgc2VsZWN0IGRlbGF5ICovCisjZGVmaW5lIFNCQ05UUkwxX0FTRAkJMHhmMDAwMDAwMAkvKiBhZGRyZXNzIHN0cm9iZSBkZWxheSAqLworCisjZGVmaW5lIFNCQ05UUkwyKFgpCQlfX1NZU1JFRygweGQ4YzAwMjA4ICsgKFgpICogMHgxMCwgdTMyKQkvKiBTQkMgYmFuayBjdHJsMiByZWdzICovCisjZGVmaW5lIFNCQ05UUkwyX1dDCQkweDAwMDAwMGZmCS8qIHdhaXQgY291bnQgKi8KKyNkZWZpbmUgU0JDTlRSTDJfQldDCQkweDAwMDAwZjAwCS8qIGJ1cnN0IHdhaXQgY291bnQgKi8KKyNkZWZpbmUgU0JDTlRSTDJfV00JCTB4MDEwMDAwMDAJLyogd2FpdCBtb2RlIHNldHRpbmcgKi8KKyNkZWZpbmUgU0JDTlRSTDJfV01fRklYRURXQUlUCTB4MDAwMDAwMDAJLyogLSBmaXhlZCB3YWl0IGFjY2VzcyAqLworI2RlZmluZSBTQkNOVFJMMl9XTV9IQU5EU0hBS0UJMHgwMTAwMDAwMAkvKiAtIGhhbmRzaGFrZSBhY2Nlc3MgKi8KKyNkZWZpbmUgU0JDTlRSTDJfQk0JCTB4MDIwMDAwMDAJLyogYnVzIHN5bmNocm9uaXNhdGlvbiBtb2RlICovCisjZGVmaW5lIFNCQ05UUkwyX0JNX1NZTkMJMHgwMDAwMDAwMAkvKiAtIHN5bmNocm9ub3VzIG1vZGUgKi8KKyNkZWZpbmUgU0JDTlRSTDJfQk1fQVNZTkMJMHgwMjAwMDAwMAkvKiAtIGFzeW5jaHJvbm91cyBtb2RlICovCisjZGVmaW5lIFNCQ05UUkwyX0JXCQkweDA0MDAwMDAwCS8qIGJ1cyB3aWR0aCAqLworI2RlZmluZSBTQkNOVFJMMl9CV18zMgkJMHgwMDAwMDAwMAkvKiAtIDMyIGJpdHMgKi8KKyNkZWZpbmUgU0JDTlRSTDJfQldfMTYJCTB4MDQwMDAwMDAJLyogLSAxNiBiaXRzICovCisjZGVmaW5lIFNCQ05UUkwyX1JXSU5WCQkweDA4MDAwMDAwCS8qIFIvVyBzaWduYWwgaW52ZXJ0IHBvbGFyaXR5ICovCisjZGVmaW5lIFNCQ05UUkwyX1JXSU5WX05PUk0JMHgwMDAwMDAwMAkvKiAtIG5vcm1hbCAocmVhZCBoaWdoKSAqLworI2RlZmluZSBTQkNOVFJMMl9SV0lOVl9JTlYJMHgwODAwMDAwMAkvKiAtIGludmVydGVkIChyZWFkIGxvdykgKi8KKyNkZWZpbmUgU0JDTlRSTDJfQlQJCTB4NzAwMDAwMDAJLyogYnVzIHR5cGUgc2V0dGluZyAqLworI2RlZmluZSBTQkNOVFJMMl9CVF9TUkFNCTB4MDAwMDAwMDAJLyogLSBTUkFNIGludGVyZmFjZSAqLworI2RlZmluZSBTQkNOVFJMMl9CVF9BRE1VWAkweDAwMDAwMDAwCS8qIC0gYWRkci9kYXRhIG11bHRpcGxleGVkIGludGVyZmFjZSAqLworI2RlZmluZSBTQkNOVFJMMl9CVF9CUk9NCTB4MDAwMDAwMDAJLyogLSBidXJzdCBST00gaW50ZXJmYWNlICovCisjZGVmaW5lIFNCQ05UUkwyX0JUU0UJCTB4ODAwMDAwMDAJLyogYnVyc3QgZW5hYmxlICovCisKKy8qIG1lbW9yeSBidXMgY29udHJvbGxlciAqLworI2RlZmluZSBTREJBU0UoWCkJCV9fU1lTUkVHKDB4ZGEwMDAwMDggKyAoWCkgKiAweDQsIHUzMikJLyogTUJDIGJhc2UgYWRkciByZWdzICovCisjZGVmaW5lIFNEQkFTRV9DRQkJMHgwMDAwMDAwMQkvKiBjaGlwIGVuYWJsZSAqLworI2RlZmluZSBTREJBU0VfQ0JBTQkJMHgwMDAwZmZmMAkvKiBjaGlwIGJhc2UgYWRkcmVzcyBtYXNrIFszMToyMF0gKi8KKyNkZWZpbmUgU0RCQVNFX0NCQU1fU0hJRlQJMTYKKyNkZWZpbmUgU0RCQVNFX0NCQQkJMHhmZmYwMDAwMAkvKiBjaGlwIGJhc2UgYWRkcmVzcyBbMzE6MjBdICovCisKKyNkZWZpbmUgU0RSQU1CVVMJCV9fU1lTUkVHKDB4ZGEwMDAwMDAsIHUzMikJLyogYnVzIG1vZGUgY29udHJvbCByZWcgKi8KKyNkZWZpbmUgU0RSQU1CVVNfUkVGRU4JCTB4MDAwMDAwMDQJLyogcmVmcmVzaCBlbmFibGUgKi8KKyNkZWZpbmUgU0RSQU1CVVNfVFJDCQkweDAwMDAwMDE4CS8qIHJlZnJlc2ggY29tbWFuZCBkZWxheSB0aW1lICovCisjZGVmaW5lIFNEUkFNQlVTX0JTVFBUCQkweDAwMDAwMDIwCS8qIGJ1cnN0IHN0b3AgY29tbWFuZCBlbmFibGUgKi8KKyNkZWZpbmUgU0RSQU1CVVNfUE9OU0VRCQkweDAwMDAwMDQwCS8qIHBvd2VyIG9uIHNlcXVlbmNlICovCisjZGVmaW5lIFNEUkFNQlVTX1NFTEZSRVEJMHgwMDAwMDA4MAkvKiBzZWxmLXJlZnJlc2ggbW9kZSByZXF1ZXN0ICovCisjZGVmaW5lIFNEUkFNQlVTX1NFTEZPTgkJMHgwMDAwMDEwMAkvKiBzZWxmLXJlZnJlc2ggbW9kZSBvbiAqLworI2RlZmluZSBTRFJBTUJVU19TSVpFCQkweDAwMDMwMDAwCS8qIFNEUkFNIHNpemUgKi8KKyNkZWZpbmUgU0RSQU1CVVNfU0laRV82NE1iaXQJMHgwMDAxMDAwMAkvKiA2NE1iaXQgU0RSQU0gKHgxNikgKi8KKyNkZWZpbmUgU0RSQU1CVVNfU0laRV8xMjhNYml0CTB4MDAwMjAwMDAJLyogMTI4TWJpdCBTRFJBTSAoeDE2KSAqLworI2RlZmluZSBTRFJBTUJVU19TSVpFXzI1Nk1iaXQJMHgwMDAzMDAwMAkvKiAyNTZNYml0IFNEUkFNICh4MTYpICovCisjZGVmaW5lIFNEUkFNQlVTX1RSQVNXQUlUCTB4MDAwYzAwMDAJLyogcm93IGFkZHJlc3MgcHJlY2hhcmdlIGNvbW1hbmQgY3ljbGUgbnVtYmVyICovCisjZGVmaW5lIFNEUkFNQlVTX1JFRk5VTQkJMHgwMDMwMDAwMAkvKiByZWZyZXNoIGNvbW1hbmQgbnVtYmVyICovCisjZGVmaW5lIFNEUkFNQlVTX0JTVFdBSVQJMHgwMGMwMDAwMAkvKiBidXJzdCBzdG9wIGNvbW1hbmQgY3ljbGUgKi8KKyNkZWZpbmUgU0RSQU1CVVNfU0VUV0FJVAkweDAzMDAwMDAwCS8qIG1vZGUgcmVnaXN0ZXIgc2V0dGluZyBjb21tYW5kIGN5Y2xlICovCisjZGVmaW5lIFNEUkFNQlVTX1BSRVdBSVQJMHgwYzAwMDAwMAkvKiBwcmVjaGFyZ2UgY29tbWFuZCBjeWNsZSAqLworI2RlZmluZSBTRFJBTUJVU19SQVNMQVRFCTB4MzAwMDAwMDAJLyogUkFTIGxhdGVuY3kgKi8KKyNkZWZpbmUgU0RSQU1CVVNfQ0FTTEFURQkweGMwMDAwMDAwCS8qIENBUyBsYXRlbmN5ICovCisKKyNkZWZpbmUgU0RSRUZDTlQJCV9fU1lTUkVHKDB4ZGEwMDAwMDQsIHUzMikJLyogcmVmcmVzaCBwZXJpb2QgcmVnICovCisjZGVmaW5lIFNEUkVGQ05UX1BFUkkJCTB4MDAwMDBmZmYJLyogcmVmcmVzaCBwZXJpb2QgKi8KKworI2RlZmluZSBTRFNIRFcJCQlfX1NZU1JFRygweGRhMDAwMDEwLCB1MzIpCS8qIHRlc3QgcmVnICovCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfQVNNX0JVU0NUTF9SRUdTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvYnl0ZW9yZGVyLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2J5dGVvcmRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOTkzY2MKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2J5dGVvcmRlci5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIE1OMTAzMDAgQnl0ZS1vcmRlciBwcmltaXRpdmUgY29uc3RydWN0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fQllURU9SREVSX0gKKyNkZWZpbmUgX0FTTV9CWVRFT1JERVJfSAorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpZmRlZiBfX0dOVUNfXworCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKGNvbnN0KSkKK19fdTMyIF9fX2FyY2hfX3N3YWIzMihfX3UzMiB4KQoreworCV9fdTMyIHJldDsKKwlhc20oInN3YXAgJTEsJTAiIDogIj1yIiAocmV0KSA6ICJyIiAoeCkpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXygoY29uc3QpKQorX191MTYgX19fYXJjaF9fc3dhYjE2KF9fdTE2IHgpCit7CisJX191MTYgcmV0OworCWFzbSgic3dhcGggJTEsJTAiIDogIj1yIiAocmV0KSA6ICJyIiAoeCkpOworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgX19hcmNoX19zd2FiMzIoeCkgX19fYXJjaF9fc3dhYjMyKHgpCisjZGVmaW5lIF9fYXJjaF9fc3dhYjE2KHgpIF9fX2FyY2hfX3N3YWIxNih4KQorCisjaWYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSB8fCBkZWZpbmVkKF9fS0VSTkVMX18pCisjICBkZWZpbmUgX19CWVRFT1JERVJfSEFTX1U2NF9fCisjICBkZWZpbmUgX19TV0FCXzY0X1RIUlVfMzJfXworI2VuZGlmCisKKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworCisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaD4KKworI2VuZGlmIC8qIF9BU01fQllURU9SREVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvY2FjaGUuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvY2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTAxMTIyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9jYWNoZS5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qIE1OMTAzMDAgY2FjaGUgbWFuYWdlbWVudCByZWdpc3RlcnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfQVNNX0NBQ0hFX0gKKyNkZWZpbmUgX0FTTV9DQUNIRV9ICisKKyNpbmNsdWRlIDxhc20vY3B1LXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vcHJvYy9jYWNoZS5oPgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2RlZmluZSBMMV9DQUNIRV9ESVNQQVJJVFkJKEwxX0NBQ0hFX05FTlRSSUVTICogTDFfQ0FDSEVfQllURVMpCisjZWxzZQorI2RlZmluZSBMMV9DQUNIRV9ESVNQQVJJVFkJTDFfQ0FDSEVfTkVOVFJJRVMgKiBMMV9DQUNIRV9CWVRFUworI2VuZGlmCisKKy8qIGRhdGEgY2FjaGUgcHVyZ2UgcmVnaXN0ZXJzCisgKiAtIHJlYWQgZnJvbSB0aGUgcmVnaXN0ZXIgdG8gdW5jb25kaXRpb25hbGx5IHB1cmdlIHRoYXQgY2FjaGUgbGluZQorICogLSB3cml0ZSBhZGRyZXNzICYgMHhmZmZmZmYwMCB0byBjb25kaXRpb25hbGx5IHB1cmdlIHRoYXQgY2FjaGUgbGluZQorICogICAtIGNsZWFyIExTQiB0byByZXF1ZXN0IGludmFsaWRhdGlvbiBhcyB3ZWxsCisgKi8KKyNkZWZpbmUgRENBQ0hFX1BVUkdFKFdBWSwgRU5UUlkpIFwKKwlfX1NZU1JFRygweGM4NDAwMDAwICsgKFdBWSkgKiBMMV9DQUNIRV9XQVlESVNQICsgXAorCQkgKEVOVFJZKSAqIEwxX0NBQ0hFX0JZVEVTLCB1MzIpCisKKyNkZWZpbmUgRENBQ0hFX1BVUkdFX1dBWTAoRU5UUlkpIFwKKwlfX1NZU1JFRygweGM4NDAwMDAwICsgMCAqIEwxX0NBQ0hFX1dBWURJU1AgKyAoRU5UUlkpICogTDFfQ0FDSEVfQllURVMsIHUzMikKKyNkZWZpbmUgRENBQ0hFX1BVUkdFX1dBWTEoRU5UUlkpIFwKKwlfX1NZU1JFRygweGM4NDAwMDAwICsgMSAqIEwxX0NBQ0hFX1dBWURJU1AgKyAoRU5UUlkpICogTDFfQ0FDSEVfQllURVMsIHUzMikKKyNkZWZpbmUgRENBQ0hFX1BVUkdFX1dBWTIoRU5UUlkpIFwKKwlfX1NZU1JFRygweGM4NDAwMDAwICsgMiAqIEwxX0NBQ0hFX1dBWURJU1AgKyAoRU5UUlkpICogTDFfQ0FDSEVfQllURVMsIHUzMikKKyNkZWZpbmUgRENBQ0hFX1BVUkdFX1dBWTMoRU5UUlkpIFwKKwlfX1NZU1JFRygweGM4NDAwMDAwICsgMyAqIEwxX0NBQ0hFX1dBWURJU1AgKyAoRU5UUlkpICogTDFfQ0FDSEVfQllURVMsIHUzMikKKworLyogaW5zdHJ1Y3Rpb24gY2FjaGUgYWNjZXNzIHJlZ2lzdGVycyAqLworI2RlZmluZSBJQ0FDSEVfREFUQShXQVksIEVOVFJZLCBPRkYpIFwKKwlfX1NZU1JFRygweGM4MDAwMDAwICsgKFdBWSkgKiBMMV9DQUNIRV9XQVlESVNQICsgKEVOVFJZKSAqIDB4MTAgKyAoT0ZGKSAqIDQsIHUzMikKKyNkZWZpbmUgSUNBQ0hFX1RBRyhXQVksIEVOVFJZKQkgXAorCV9fU1lTUkVHKDB4YzgxMDAwMDAgKyAoV0FZKSAqIEwxX0NBQ0hFX1dBWURJU1AgKyAoRU5UUlkpICogMHgxMCwgdTMyKQorCisvKiBpbnN0cnVjdGlvbiBjYWNoZSBhY2Nlc3MgcmVnaXN0ZXJzICovCisjZGVmaW5lIERDQUNIRV9EQVRBKFdBWSwgRU5UUlksIE9GRikgXAorCV9fU1lTUkVHKDB4YzgyMDAwMDAgKyAoV0FZKSAqIEwxX0NBQ0hFX1dBWURJU1AgKyAoRU5UUlkpICogMHgxMCArIChPRkYpICogNCwgdTMyKQorI2RlZmluZSBEQ0FDSEVfVEFHKFdBWSwgRU5UUlkpCSBcCisJX19TWVNSRUcoMHhjODMwMDAwMCArIChXQVkpICogTDFfQ0FDSEVfV0FZRElTUCArIChFTlRSWSkgKiAweDEwLCB1MzIpCisKKyNlbmRpZiAvKiBfQVNNX0NBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvY2FjaGVmbHVzaC5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9jYWNoZWZsdXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRiNzQ2YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvY2FjaGVmbHVzaC5oCkBAIC0wLDAgKzEsMTE2IEBACisvKiBNTjEwMzAwIENhY2hlIGZsdXNoaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fQ0FDSEVGTFVTSF9ICisjZGVmaW5lIF9BU01fQ0FDSEVGTFVTSF9ICisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKy8qIEtlZXAgaW5jbHVkZXMgdGhlIHNhbWUgYWNyb3NzIGFyY2hlcy4gICovCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworLyoKKyAqIHZpcnR1YWxseS1pbmRleGVkIGNhY2hlIG1hbmFnbWVudCAob3VyIGNhY2hlIGlzIHBoeXNpY2FsbHkgaW5kZXhlZCkKKyAqLworI2RlZmluZSBmbHVzaF9jYWNoZV9hbGwoKQkJCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBmbHVzaF9jYWNoZV9tbShtbSkJCQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgZmx1c2hfY2FjaGVfZHVwX21tKG1tKQkJCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBmbHVzaF9jYWNoZV9yYW5nZShtbSwgc3RhcnQsIGVuZCkJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGZsdXNoX2NhY2hlX3BhZ2Uodm1hLCB2bWFkZHIsIHBmbikJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGZsdXNoX2NhY2hlX3ZtYXAoc3RhcnQsIGVuZCkJCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBmbHVzaF9jYWNoZV92dW5tYXAoc3RhcnQsIGVuZCkJCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBmbHVzaF9kY2FjaGVfcGFnZShwYWdlKQkJCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBmbHVzaF9kY2FjaGVfbW1hcF9sb2NrKG1hcHBpbmcpCQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgZmx1c2hfZGNhY2hlX21tYXBfdW5sb2NrKG1hcHBpbmcpCWRvIHt9IHdoaWxlICgwKQorCisvKgorICogcGh5c2ljYWxseS1pbmRleGVkIGNhY2hlIG1hbmFnbWVudAorICovCisjaWZuZGVmIENPTkZJR19NTjEwMzAwX0NBQ0hFX0RJU0FCTEVECisKK2V4dGVybiB2b2lkIGZsdXNoX2ljYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CitleHRlcm4gdm9pZCBmbHVzaF9pY2FjaGVfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKnBnKTsKKworI2Vsc2UKKworI2RlZmluZSBmbHVzaF9pY2FjaGVfcmFuZ2Uoc3RhcnQsIGVuZCkJCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBmbHVzaF9pY2FjaGVfcGFnZSh2bWEsIHBnKQkJZG8ge30gd2hpbGUgKDApCisKKyNlbmRpZgorCisjZGVmaW5lIGZsdXNoX2ljYWNoZV91c2VyX3JhbmdlKHZtYSwgcGcsIGFkciwgbGVuKSBcCisJZmx1c2hfaWNhY2hlX3JhbmdlKGFkciwgYWRyICsgbGVuKQorCisjZGVmaW5lIGNvcHlfdG9fdXNlcl9wYWdlKHZtYSwgcGFnZSwgdmFkZHIsIGRzdCwgc3JjLCBsZW4pIFwKKwlkbyB7CQkJCQlcCisJCW1lbWNweShkc3QsIHNyYywgbGVuKTsJCVwKKwkJZmx1c2hfaWNhY2hlX3BhZ2Uodm1hLCBwYWdlKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgY29weV9mcm9tX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIHZhZGRyLCBkc3QsIHNyYywgbGVuKSBcCisJbWVtY3B5KGRzdCwgc3JjLCBsZW4pCisKKy8qCisgKiBwcmltaXRpdmUgcm91dGluZXMKKyAqLworI2lmbmRlZiBDT05GSUdfTU4xMDMwMF9DQUNIRV9ESVNBQkxFRAorZXh0ZXJuIHZvaWQgbW4xMDMwMF9pY2FjaGVfaW52KHZvaWQpOworZXh0ZXJuIHZvaWQgbW4xMDMwMF9kY2FjaGVfaW52KHZvaWQpOworZXh0ZXJuIHZvaWQgbW4xMDMwMF9kY2FjaGVfaW52X3BhZ2UodW5zaWduZWQgc3RhcnQpOworZXh0ZXJuIHZvaWQgbW4xMDMwMF9kY2FjaGVfaW52X3JhbmdlKHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBlbmQpOworZXh0ZXJuIHZvaWQgbW4xMDMwMF9kY2FjaGVfaW52X3JhbmdlMih1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgc2l6ZSk7CisjaWZkZWYgQ09ORklHX01OMTAzMDBfQ0FDSEVfV0JBQ0sKK2V4dGVybiB2b2lkIG1uMTAzMDBfZGNhY2hlX2ZsdXNoKHZvaWQpOworZXh0ZXJuIHZvaWQgbW4xMDMwMF9kY2FjaGVfZmx1c2hfcGFnZSh1bnNpZ25lZCBzdGFydCk7CitleHRlcm4gdm9pZCBtbjEwMzAwX2RjYWNoZV9mbHVzaF9yYW5nZSh1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgZW5kKTsKK2V4dGVybiB2b2lkIG1uMTAzMDBfZGNhY2hlX2ZsdXNoX3JhbmdlMih1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgc2l6ZSk7CitleHRlcm4gdm9pZCBtbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnYodm9pZCk7CitleHRlcm4gdm9pZCBtbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnZfcGFnZSh1bnNpZ25lZCBzdGFydCk7CitleHRlcm4gdm9pZCBtbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnZfcmFuZ2UodW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGVuZCk7CitleHRlcm4gdm9pZCBtbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnZfcmFuZ2UyKHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBzaXplKTsKKyNlbHNlCisjZGVmaW5lIG1uMTAzMDBfZGNhY2hlX2ZsdXNoKCkJCQkJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIG1uMTAzMDBfZGNhY2hlX2ZsdXNoX3BhZ2Uoc3RhcnQpCQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgbW4xMDMwMF9kY2FjaGVfZmx1c2hfcmFuZ2Uoc3RhcnQsIGVuZCkJCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBtbjEwMzAwX2RjYWNoZV9mbHVzaF9yYW5nZTIoc3RhcnQsIHNpemUpCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBtbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnYoKQkJCW1uMTAzMDBfZGNhY2hlX2ludigpCisjZGVmaW5lIG1uMTAzMDBfZGNhY2hlX2ZsdXNoX2ludl9wYWdlKHN0YXJ0KSBcCisJbW4xMDMwMF9kY2FjaGVfaW52X3BhZ2UoKHN0YXJ0KSkKKyNkZWZpbmUgbW4xMDMwMF9kY2FjaGVfZmx1c2hfaW52X3JhbmdlKHN0YXJ0LCBlbmQpIFwKKwltbjEwMzAwX2RjYWNoZV9pbnZfcmFuZ2UoKHN0YXJ0KSwgKGVuZCkpCisjZGVmaW5lIG1uMTAzMDBfZGNhY2hlX2ZsdXNoX2ludl9yYW5nZTIoc3RhcnQsIHNpemUpIFwKKwltbjEwMzAwX2RjYWNoZV9pbnZfcmFuZ2UyKChzdGFydCksIChzaXplKSkKKyNlbmRpZiAvKiBDT05GSUdfTU4xMDMwMF9DQUNIRV9XQkFDSyAqLworI2Vsc2UKKyNkZWZpbmUgbW4xMDMwMF9pY2FjaGVfaW52KCkJCQkJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIG1uMTAzMDBfZGNhY2hlX2ludigpCQkJCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBtbjEwMzAwX2RjYWNoZV9pbnZfcGFnZShzdGFydCkJCQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgbW4xMDMwMF9kY2FjaGVfaW52X3JhbmdlKHN0YXJ0LCBlbmQpCQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgbW4xMDMwMF9kY2FjaGVfaW52X3JhbmdlMihzdGFydCwgc2l6ZSkJCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBtbjEwMzAwX2RjYWNoZV9mbHVzaCgpCQkJCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBtbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnZfcGFnZShzdGFydCkJCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBtbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnYoKQkJCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBtbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnZfcmFuZ2Uoc3RhcnQsIGVuZCkJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIG1uMTAzMDBfZGNhY2hlX2ZsdXNoX2ludl9yYW5nZTIoc3RhcnQsIHNpemUpCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBtbjEwMzAwX2RjYWNoZV9mbHVzaF9wYWdlKHN0YXJ0KQkJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIG1uMTAzMDBfZGNhY2hlX2ZsdXNoX3JhbmdlKHN0YXJ0LCBlbmQpCQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgbW4xMDMwMF9kY2FjaGVfZmx1c2hfcmFuZ2UyKHN0YXJ0LCBzaXplKQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBDT05GSUdfTU4xMDMwMF9DQUNIRV9ESVNBQkxFRCAqLworCisvKgorICogaW50ZXJuYWwgZGVidWdnaW5nIGZ1bmN0aW9uCisgKi8KKyNpZmRlZiBDT05GSUdfREVCVUdfUEFHRUFMTE9DCitleHRlcm4gdm9pZCBrZXJuZWxfbWFwX3BhZ2VzKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbnVtcGFnZXMsIGludCBlbmFibGUpOworI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qIF9BU01fQ0FDSEVGTFVTSF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2NoZWNrc3VtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZiMmE4ZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvY2hlY2tzdW0uaApAQCAtMCwwICsxLDg2IEBACisvKiBNTjEwMzAwIE9wdGltaXNlZCBjaGVja3N1bW1pbmcgY29kZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfQVNNX0NIRUNLU1VNX0gKKyNkZWZpbmUgX0FTTV9DSEVDS1NVTV9ICisKK2V4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4sIF9fd3N1bSBzdW0pOworZXh0ZXJuIF9fd3N1bSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorCQkJCQlpbnQgbGVuLCBfX3dzdW0gc3VtKTsKK2V4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbV91c2VyKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LAorCQkJCQkgIGludCBsZW4sIF9fd3N1bSBzdW0sCisJCQkJCSAgaW50ICplcnJfcHRyKTsKK2V4dGVybiBfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpOworZXh0ZXJuIF9fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSk7CitleHRlcm4gX19zdW0xNiBpcF9jb21wdXRlX2NzdW0oY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbik7CisKKyNkZWZpbmUgY3N1bV9wYXJ0aWFsX2NvcHlfZnJvbXVzZXIgY3N1bV9wYXJ0aWFsX2NvcHkKK2V4dGVybiBfX3dzdW0gY3N1bV9wYXJ0aWFsX2NvcHkoY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkc3QsIGludCBsZW4sCisJCQkJX193c3VtIHN1bSk7CisKK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX2ZvbGQoX193c3VtIHN1bSkKK3sKKwlhc20oCisJCSIJYWRkCSUxLCUwCQlcbiIKKwkJIglhZGRjCTB4ZmZmZiwlMAlcbiIKKwkJOiAiPXIiIChzdW0pCisJCTogInIiIChzdW0gPDwgMTYpLCAiMCIgKHN1bSAmIDB4ZmZmZjAwMDApCisJCTogImNjIgorCSAgICApOworCXJldHVybiAofnN1bSkgPj4gMTY7Cit9CisKK3N0YXRpYyBpbmxpbmUgX193c3VtIGNzdW1fdGNwdWRwX25vZm9sZCh1bnNpZ25lZCBsb25nIHNhZGRyLAorCQkJCQl1bnNpZ25lZCBsb25nIGRhZGRyLAorCQkJCQl1bnNpZ25lZCBzaG9ydCBsZW4sCisJCQkJCXVuc2lnbmVkIHNob3J0IHByb3RvLAorCQkJCQlfX3dzdW0gc3VtKQoreworCV9fd3N1bSB0bXA7CisKKwl0bXAgPSAoX193c3VtKSBudG9ocyhsZW4pIDw8IDE2OworCXRtcCArPSAoX193c3VtKSBwcm90byA8PCA4OworCisJYXNtKAorCQkiCWFkZAklMSwlMAkJXG4iCisJCSIJYWRkYwklMiwlMAkJXG4iCisJCSIJYWRkYwklMywlMAkJXG4iCisJCSIJYWRkYwkwLCUwCQlcbiIKKwkJOiAiPXIiIChzdW0pCisJCTogInIiIChkYWRkciksICJyIihzYWRkciksICJyIih0bXApLCAiMCIoc3VtKQorCQk6ICJjYyIKKwkgICAgKTsKKwlyZXR1cm4gc3VtOworfQorCisvKgorICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIHRoZSBUQ1AvVURQIHBzZXVkby1oZWFkZXIKKyAqIHJldHVybnMgYSAxNi1iaXQgY2hlY2tzdW0sIGFscmVhZHkgY29tcGxlbWVudGVkCisgKi8KK3N0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX3RjcHVkcF9tYWdpYyh1bnNpZ25lZCBsb25nIHNhZGRyLAorCQkJCQl1bnNpZ25lZCBsb25nIGRhZGRyLAorCQkJCQl1bnNpZ25lZCBzaG9ydCBsZW4sCisJCQkJCXVuc2lnbmVkIHNob3J0IHByb3RvLAorCQkJCQlfX3dzdW0gc3VtKQoreworCXJldHVybiBjc3VtX2ZvbGQoY3N1bV90Y3B1ZHBfbm9mb2xkKHNhZGRyLCBkYWRkciwgbGVuLCBwcm90bywgc3VtKSk7Cit9CisKKyN1bmRlZiBfSEFWRV9BUkNIX0lQVjZfQ1NVTQorCisvKgorICoJQ29weSBhbmQgY2hlY2tzdW0gdG8gdXNlcgorICovCisjZGVmaW5lIEhBVkVfQ1NVTV9DT1BZX1VTRVIKK2V4dGVybiBfX3dzdW0gY3N1bV9hbmRfY29weV90b191c2VyKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLAorCQkJCSAgICBfX3dzdW0gc3VtLCBpbnQgKmVycl9wdHIpOworCisKKyNlbmRpZiAvKiBfQVNNX0NIRUNLU1VNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvY3B1LXJlZ3MuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvY3B1LXJlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTdlOWI1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9jcHUtcmVncy5oCkBAIC0wLDAgKzEsMjkwIEBACisvKiBNTjEwMzAwIENvcmUgc3lzdGVtIHJlZ2lzdGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfQVNNX0NQVV9SRUdTX0gKKyNkZWZpbmUgX0FTTV9DUFVfUkVHU19ICisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01OMTAzMDBfQ1BVX0FNMzNWMgorLyogd2UgdGVsbCB0aGUgY29tcGlsZXIgdG8gcHJldGVuZCB0byBiZSBBTTMzIHNvIHRoYXQgaXQgZG9lc24ndCB0cnkgYW5kIHVzZQorICogdGhlIEZQIHJlZ3MsIGJ1dCB0ZWxsIHRoZSBhc3NlbWJsZXIgdGhhdCB3ZSdyZSBhY3R1YWxseSBhbGxvd2VkIEFNMzN2MgorICogaW5zdHJ1Y3Rpb25zICovCisjaWZuZGVmIF9fQVNTRU1CTFlfXworYXNtKCIgLmFtMzNfMlxuIik7CisjZWxzZQorLmFtMzNfMgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKyNkZWZpbmUgX19TWVNSRUcoQUREUiwgVFlQRSkgKCoodm9sYXRpbGUgVFlQRSAqKShBRERSKSkKKyNkZWZpbmUgX19TWVNSRUdDKEFERFIsIFRZUEUpICgqKGNvbnN0IHZvbGF0aWxlIFRZUEUgKikoQUREUikpCisjZWxzZQorI2RlZmluZSBfX1NZU1JFRyhBRERSLCBUWVBFKSBBRERSCisjZGVmaW5lIF9fU1lTUkVHQyhBRERSLCBUWVBFKSBBRERSCisjZW5kaWYKKworLyogQ1BVIHJlZ2lzdGVycyAqLworI2RlZmluZSBFUFNXX0ZMQUdfWgkJMHgwMDAwMDAwMQkvKiB6ZXJvIGZsYWcgKi8KKyNkZWZpbmUgRVBTV19GTEFHX04JCTB4MDAwMDAwMDIJLyogbmVnYXRpdmUgZmxhZyAqLworI2RlZmluZSBFUFNXX0ZMQUdfQwkJMHgwMDAwMDAwNAkvKiBjYXJyeSBmbGFnICovCisjZGVmaW5lIEVQU1dfRkxBR19WCQkweDAwMDAwMDA4CS8qIG92ZXJmbG93IGZsYWcgKi8KKyNkZWZpbmUgRVBTV19JTQkJCTB4MDAwMDA3MDAJLyogaW50ZXJydXB0IG1vZGUgKi8KKyNkZWZpbmUgRVBTV19JTV8wCQkweDAwMDAwMDAwCS8qIGludGVycnVwdCBtb2RlIDAgKi8KKyNkZWZpbmUgRVBTV19JTV8xCQkweDAwMDAwMTAwCS8qIGludGVycnVwdCBtb2RlIDEgKi8KKyNkZWZpbmUgRVBTV19JTV8yCQkweDAwMDAwMjAwCS8qIGludGVycnVwdCBtb2RlIDIgKi8KKyNkZWZpbmUgRVBTV19JTV8zCQkweDAwMDAwMzAwCS8qIGludGVycnVwdCBtb2RlIDMgKi8KKyNkZWZpbmUgRVBTV19JTV80CQkweDAwMDAwNDAwCS8qIGludGVycnVwdCBtb2RlIDQgKi8KKyNkZWZpbmUgRVBTV19JTV81CQkweDAwMDAwNTAwCS8qIGludGVycnVwdCBtb2RlIDUgKi8KKyNkZWZpbmUgRVBTV19JTV82CQkweDAwMDAwNjAwCS8qIGludGVycnVwdCBtb2RlIDYgKi8KKyNkZWZpbmUgRVBTV19JTV83CQkweDAwMDAwNzAwCS8qIGludGVycnVwdCBtb2RlIDcgKi8KKyNkZWZpbmUgRVBTV19JRQkJCTB4MDAwMDA4MDAJLyogaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBFUFNXX1MJCQkweDAwMDAzMDAwCS8qIHNvZnR3YXJlIGF1eGlsbGlhcnkgYml0cyAqLworI2RlZmluZSBFUFNXX1QJCQkweDAwMDA4MDAwCS8qIHRyYWNlIGVuYWJsZSAqLworI2RlZmluZSBFUFNXX25TTAkJMHgwMDAxMDAwMAkvKiBub3Qgc3VwZXJ2aXNvciBsZXZlbCAqLworI2RlZmluZSBFUFNXX05NSUQJCTB4MDAwMjAwMDAJLyogbm9ubWFza2FibGUgaW50ZXJydXB0IGRpc2FibGUgKi8KKyNkZWZpbmUgRVBTV19uQVIJCTB4MDAwNDAwMDAJLyogcmVnaXN0ZXIgYmFuayBjb250cm9sICovCisjZGVmaW5lIEVQU1dfTUwJCQkweDAwMDgwMDAwCS8qIG1vbml0b3IgbGV2ZWwgKi8KKyNkZWZpbmUgRVBTV19GRQkJCTB4MDAxMDAwMDAJLyogRlBVIGVuYWJsZSAqLworCisvKiBGUFUgcmVnaXN0ZXJzICovCisjZGVmaW5lIEZQQ1JfRUZfSQkJMHgwMDAwMDAwMQkvKiBpbmV4YWN0IHJlc3VsdCBGUFUgZXhjZXB0aW9uIGZsYWcgKi8KKyNkZWZpbmUgRlBDUl9FRl9VCQkweDAwMDAwMDAyCS8qIHVuZGVyZmxvdyBGUFUgZXhjZXB0aW9uIGZsYWcgKi8KKyNkZWZpbmUgRlBDUl9FRl9PCQkweDAwMDAwMDA0CS8qIG92ZXJmbG93IEZQVSBleGNlcHRpb24gZmxhZyAqLworI2RlZmluZSBGUENSX0VGX1oJCTB4MDAwMDAwMDgJLyogemVybyBkaXZpZGUgRlBVIGV4Y2VwdGlvbiBmbGFnICovCisjZGVmaW5lIEZQQ1JfRUZfVgkJMHgwMDAwMDAxMAkvKiBpbnZhbGlkIG9wZXJhbmQgRlBVIGV4Y2VwdGlvbiBmbGFnICovCisjZGVmaW5lIEZQQ1JfRUVfSQkJMHgwMDAwMDAyMAkvKiBpbmV4YWN0IHJlc3VsdCBGUFUgZXhjZXB0aW9uIGVuYWJsZSAqLworI2RlZmluZSBGUENSX0VFX1UJCTB4MDAwMDAwNDAJLyogdW5kZXJmbG93IEZQVSBleGNlcHRpb24gZW5hYmxlICovCisjZGVmaW5lIEZQQ1JfRUVfTwkJMHgwMDAwMDA4MAkvKiBvdmVyZmxvdyBGUFUgZXhjZXB0aW9uIGVuYWJsZSAqLworI2RlZmluZSBGUENSX0VFX1oJCTB4MDAwMDAxMDAJLyogemVybyBkaXZpZGUgRlBVIGV4Y2VwdGlvbiBlbmFibGUgKi8KKyNkZWZpbmUgRlBDUl9FRV9WCQkweDAwMDAwMjAwCS8qIGludmFsaWQgb3BlcmFuZCBGUFUgZXhjZXB0aW9uIGVuYWJsZSAqLworI2RlZmluZSBGUENSX0VDX0kJCTB4MDAwMDA0MDAJLyogaW5leGFjdCByZXN1bHQgRlBVIGV4Y2VwdGlvbiBjYXVzZSAqLworI2RlZmluZSBGUENSX0VDX1UJCTB4MDAwMDA4MDAJLyogdW5kZXJmbG93IEZQVSBleGNlcHRpb24gY2F1c2UgKi8KKyNkZWZpbmUgRlBDUl9FQ19PCQkweDAwMDAxMDAwCS8qIG92ZXJmbG93IEZQVSBleGNlcHRpb24gY2F1c2UgKi8KKyNkZWZpbmUgRlBDUl9FQ19aCQkweDAwMDAyMDAwCS8qIHplcm8gZGl2aWRlIEZQVSBleGNlcHRpb24gY2F1c2UgKi8KKyNkZWZpbmUgRlBDUl9FQ19WCQkweDAwMDA0MDAwCS8qIGludmFsaWQgb3BlcmFuZCBGUFUgZXhjZXB0aW9uIGNhdXNlICovCisjZGVmaW5lIEZQQ1JfUk0JCQkweDAwMDMwMDAwCS8qIHJvdW5kaW5nIG1vZGUgKi8KKyNkZWZpbmUgRlBDUl9STV9ORUFSRVNUCQkweDAwMDAwMDAwCS8qIC0gcm91bmQgdG8gbmVhcmVzdCB2YWx1ZSAqLworI2RlZmluZSBGUENSX0ZDQ19VCQkweDAwMDQwMDAwCS8qIEZQVSB1bm9yZGVyZWQgY29uZGl0aW9uIGNvZGUgKi8KKyNkZWZpbmUgRlBDUl9GQ0NfRQkJMHgwMDA4MDAwMAkvKiBGUFUgZXF1YWwgY29uZGl0aW9uIGNvZGUgKi8KKyNkZWZpbmUgRlBDUl9GQ0NfRwkJMHgwMDEwMDAwMAkvKiBGUFUgZ3JlYXRlciB0aGFuIGNvbmRpdGlvbiBjb2RlICovCisjZGVmaW5lIEZQQ1JfRkNDX0wJCTB4MDAyMDAwMDAJLyogRlBVIGxlc3MgdGhhbiBjb25kaXRpb24gY29kZSAqLworI2RlZmluZSBGUENSX0lOSVQJCTB4MDAwMDAwMDAJLyogbm8gZXhjZXB0aW9ucywgcm91bmRpbmcgdG8gbmVhcmVzdCAqLworCisvKiBDUFUgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQ1BVUAkJCV9fU1lTUkVHKDB4YzAwMDAwMjAsIHUxNikJLyogQ1BVIHBpcGVsaW5lIHJlZ2lzdGVyICovCisjZGVmaW5lIENQVVBfRFdCRAkJMHgwMDIwCQkvKiB3cml0ZSBidWZmZXIgZGlzYWJsZSBmbGFnICovCisjZGVmaW5lIENQVVBfSVBGRAkJMHgwMDQwCQkvKiBpbnN0cnVjdGlvbiBwcmVmZXRjaCBkaXNhYmxlIGZsYWcgKi8KKyNkZWZpbmUgQ1BVUF9FWE0JCTB4MDA4MAkJLyogZXhjZXB0aW9uIG9wZXJhdGlvbiBtb2RlICovCisjZGVmaW5lIENQVVBfRVhNX0FNMzNWMQkJMHgwMDAwCQkvKiAtIEFNMzMgdjEgZXhjZXB0aW9uIG1vZGUgKi8KKyNkZWZpbmUgQ1BVUF9FWE1fQU0zM1YyCQkweDAwODAJCS8qIC0gQU0zMyB2MiBleGNlcHRpb24gbW9kZSAqLworCisjZGVmaW5lIENQVU0JCQlfX1NZU1JFRygweGMwMDAwMDQwLCB1MTYpCS8qIENQVSBtb2RlIHJlZ2lzdGVyICovCisjZGVmaW5lIENQVU1fU0xFRVAJCTB4MDAwNAkJLyogc2V0IHRvIGVudGVyIHNsZWVwIHN0YXRlICovCisjZGVmaW5lIENQVU1fSEFMVAkJMHgwMDA4CQkvKiBzZXQgdG8gZW50ZXIgaGFsdCBzdGF0ZSAqLworI2RlZmluZSBDUFVNX1NUT1AJCTB4MDAxMAkJLyogc2V0IHRvIGVudGVyIHN0b3Agc3RhdGUgKi8KKworI2RlZmluZSBDUFVSRVYJCQlfX1NZU1JFR0MoMHhjMDAwMDA1MCwgdTMyKQkvKiBDUFUgcmV2aXNpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ1BVUkVWX1RZUEUJCTB4MDAwMDAwMGYJLyogQ1BVIHR5cGUgKi8KKyNkZWZpbmUgQ1BVUkVWX1RZUEVfUwkJMAorI2RlZmluZSBDUFVSRVZfVFlQRV9BTTMzVjEJMHgwMDAwMDAwMAkvKiAtIEFNMzMgVjEgY29yZSwgQU0zMy8xLjAwIGFyY2ggKi8KKyNkZWZpbmUgQ1BVUkVWX1RZUEVfQU0zM1YyCTB4MDAwMDAwMDEJLyogLSBBTTMzIFYyIGNvcmUsIEFNMzMvMi4wMCBhcmNoICovCisjZGVmaW5lIENQVVJFVl9UWVBFX0FNMzRWMQkweDAwMDAwMDAyCS8qIC0gQU0zNCBWMSBjb3JlLCBBTTMzLzIuMDAgYXJjaCAqLworI2RlZmluZSBDUFVSRVZfUkVWSVNJT04JCTB4MDAwMDAwZjAJLyogQ1BVIHJldmlzaW9uICovCisjZGVmaW5lIENQVVJFVl9SRVZJU0lPTl9TCTQKKyNkZWZpbmUgQ1BVUkVWX0lDV0FZCQkweDAwMDAwZjAwCS8qIG51bWJlciBvZiBpbnN0cnVjdGlvbiBjYWNoZSB3YXlzICovCisjZGVmaW5lIENQVVJFVl9JQ1dBWV9TCQk4CisjZGVmaW5lIENQVVJFVl9JQ1NJWkUJCTB4MDAwMGYwMDAJLyogaW5zdHJ1Y3Rpb24gY2FjaGUgd2F5IHNpemUgKi8KKyNkZWZpbmUgQ1BVUkVWX0lDU0laRV9TCQkxMgorI2RlZmluZSBDUFVSRVZfRENXQVkJCTB4MDAwZjAwMDAJLyogbnVtYmVyIG9mIGRhdGEgY2FjaGUgd2F5cyAqLworI2RlZmluZSBDUFVSRVZfRENXQVlfUwkJMTYKKyNkZWZpbmUgQ1BVUkVWX0RDU0laRQkJMHgwMGYwMDAwMAkvKiBkYXRhIGNhY2hlIHdheSBzaXplICovCisjZGVmaW5lIENQVVJFVl9EQ1NJWkVfUwkJMjAKKyNkZWZpbmUgQ1BVUkVWX0ZQVVRZUEUJCTB4MGYwMDAwMDAJLyogRlBVIGNvcmUgdHlwZSAqLworI2RlZmluZSBDUFVSRVZfRlBVVFlQRV9OT05FCTB4MDAwMDAwMDAJLyogLSBubyBGUFUgY29yZSBpbXBsZW1lbnRlZCAqLworI2RlZmluZSBDUFVSRVZfT0NEQ1RHCQkweGYwMDAwMDAwCS8qIG9uLWNoaXAgZGVidWcgZnVuY3Rpb24gY2F0ZWdvcnkgKi8KKworI2RlZmluZSBEQ1IJCQlfX1NZU1JFRygweGMwMDAwMDMwLCB1MTYpCS8qIERlYnVnIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKworLyogaW50ZXJydXB0L2V4Y2VwdGlvbiBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBJVkFSMAkJCV9fU1lTUkVHKDB4YzAwMDAwMDAsIHUxNikJLyogaW50ZXJydXB0IHZlY3RvciAwICovCisjZGVmaW5lIElWQVIxCQkJX19TWVNSRUcoMHhjMDAwMDAwNCwgdTE2KQkvKiBpbnRlcnJ1cHQgdmVjdG9yIDEgKi8KKyNkZWZpbmUgSVZBUjIJCQlfX1NZU1JFRygweGMwMDAwMDA4LCB1MTYpCS8qIGludGVycnVwdCB2ZWN0b3IgMiAqLworI2RlZmluZSBJVkFSMwkJCV9fU1lTUkVHKDB4YzAwMDAwMGMsIHUxNikJLyogaW50ZXJydXB0IHZlY3RvciAzICovCisjZGVmaW5lIElWQVI0CQkJX19TWVNSRUcoMHhjMDAwMDAxMCwgdTE2KQkvKiBpbnRlcnJ1cHQgdmVjdG9yIDQgKi8KKyNkZWZpbmUgSVZBUjUJCQlfX1NZU1JFRygweGMwMDAwMDE0LCB1MTYpCS8qIGludGVycnVwdCB2ZWN0b3IgNSAqLworI2RlZmluZSBJVkFSNgkJCV9fU1lTUkVHKDB4YzAwMDAwMTgsIHUxNikJLyogaW50ZXJydXB0IHZlY3RvciA2ICovCisKKyNkZWZpbmUgVEJSCQkJX19TWVNSRUcoMHhjMDAwMDAyNCwgdTMyKQkvKiBUcmFwIHRhYmxlIGJhc2UgKi8KKyNkZWZpbmUgVEJSX1RCCQkJMHhmZjAwMDAwMAkvKiB0YWJsZSBiYXNlIGFkZHJlc3MgYml0cyAzMS0yNCAqLworI2RlZmluZSBUQlJfSU5UX0NPREUJCTB4MDBmZmZmZmYJLyogaW50ZXJydXB0IGNvZGUgKi8KKworI2RlZmluZSBERUFSCQkJX19TWVNSRUcoMHhjMDAwMDAzOCwgdTMyKQkvKiBEYXRhIGFjY2VzcyBleGNlcHRpb24gYWRkcmVzcyAqLworCisjZGVmaW5lIHNJU1IJCQlfX1NZU1JFRygweGMwMDAwMDQ0LCB1MzIpCS8qIFN1cGVydmlzb3IgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZQlzSVNSX0lSUUlDRQkJMHgwMDAwMDAwMQkvKiBJQ0UgaW50ZXJydXB0ICovCisjZGVmaW5lCXNJU1JfSVNURVAJCTB4MDAwMDAwMDIJLyogc2luZ2xlIHN0ZXAgaW50ZXJydXB0ICovCisjZGVmaW5lCXNJU1JfTUlTU0EJCTB4MDAwMDAwMDQJLyogbWVtb3J5IGFjY2VzcyBhZGRyZXNzIG1pc2FsaWdubWVudCBmYXVsdCAqLworI2RlZmluZQlzSVNSX1VOSU1QCQkweDAwMDAwMDA4CS8qIHVuaW1wbGVtZW50ZWQgaW5zdHJ1Y3Rpb24gZXhlY3V0aW9uIGZhdWx0ICovCisjZGVmaW5lCXNJU1JfUElFWEUJCTB4MDAwMDAwMTAJLyogcHJvZ3JhbSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJc0lTUl9NRU1FUlIJCTB4MDAwMDAwMjAJLyogaWxsZWdhbCBtZW1vcnkgYWNjZXNzIGZhdWx0ICovCisjZGVmaW5lCXNJU1JfSUJSRUFLCQkweDAwMDAwMDQwCS8qIGluc3RyYWN0aW9uIGJyZWFrIGludGVycnVwdCAqLworI2RlZmluZQlzSVNSX0RCU1JMCQkweDAwMDAwMDgwCS8qIGRlYnVnIHNlcmlhbCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJc0lTUl9QRVJJREIJCTB4MDAwMDAxMDAJLyogcGVyaXBoZXJhbCBkZWJ1ZyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUJc0lTUl9FWFVOSU1QCQkweDAwMDAwMjAwCS8qIHVuaW1wbGVtZW50ZWQgZXgtaW5zdHJ1Y3Rpb24gZXhlY3V0aW9uIGZhdWx0ICovCisjZGVmaW5lCXNJU1JfT0JSRUFLCQkweDAwMDAwNDAwCS8qIG9wZXJhbmQgYnJlYWsgaW50ZXJydXB0ICovCisjZGVmaW5lCXNJU1JfUFJJVgkJMHgwMDAwMDgwMAkvKiBwcml2aWxlZ2VkIGluc3RydWN0aW9uIGV4ZWN1dGlvbiBmYXVsdCAqLworI2RlZmluZQlzSVNSX0JVU0VSUgkJMHgwMDAwMTAwMAkvKiBidXMgZXJyb3IgZmF1bHQgKi8KKyNkZWZpbmUJc0lTUl9EQkxGVAkJMHgwMDAwMjAwMAkvKiBkb3VibGUgZmF1bHQgKi8KKyNkZWZpbmUJc0lTUl9EQkcJCTB4MDAwMDgwMDAJLyogZGVidWcgcmVzZXJ2ZWQgaW50ZXJydXB0ICovCisjZGVmaW5lIHNJU1JfSVRNSVNTCQkweDAwMDEwMDAwCS8qIGluc3RydWN0aW9uIFRMQiBtaXNzICovCisjZGVmaW5lIHNJU1JfRFRNSVNTCQkweDAwMDIwMDAwCS8qIGRhdGEgVExCIG1pc3MgKi8KKyNkZWZpbmUgc0lTUl9JVEVYCQkweDAwMDQwMDAwCS8qIGluc3RydWN0aW9uIFRMQiBhY2Nlc3MgZXhjZXB0aW9uICovCisjZGVmaW5lIHNJU1JfRFRFWAkJMHgwMDA4MDAwMAkvKiBkYXRhIFRMQiBhY2Nlc3MgZXhjZXB0aW9uICovCisjZGVmaW5lIHNJU1JfSUxHSUEJCTB4MDAxMDAwMDAJLyogaWxsZWdhbCBpbnN0cnVjdGlvbiBhY2Nlc3MgZXhjZXB0aW9uICovCisjZGVmaW5lIHNJU1JfSUxHREEJCTB4MDAyMDAwMDAJLyogaWxsZWdhbCBkYXRhIGFjY2VzcyBleGNlcHRpb24gKi8KKyNkZWZpbmUgc0lTUl9JT0lBCQkweDAwNDAwMDAwCS8qIGludGVybmFsIEkvTyBzcGFjZSBpbnN0cnVjdGlvbiBhY2Nlc3MgZXhjZXAgKi8KKyNkZWZpbmUgc0lTUl9QUklWQQkJMHgwMDgwMDAwMAkvKiBwcml2aWxlZ2VkIHNwYWNlIGluc3RydWN0aW9uIGFjY2VzcyBleGNlcCAqLworI2RlZmluZSBzSVNSX1BSSURBCQkweDAxMDAwMDAwCS8qIHByaXZpbGVnZWQgc3BhY2UgZGF0YSBhY2Nlc3MgZXhjZXAgKi8KKyNkZWZpbmUgc0lTUl9ESVNBCQkweDAyMDAwMDAwCS8qIGRhdGEgc3BhY2UgaW5zdHJ1Y3Rpb24gYWNjZXNzIGV4Y2VwICovCisjZGVmaW5lIHNJU1JfU1lTQwkJMHgwNDAwMDAwMAkvKiBzeXN0ZW0gY2FsbCBpbnN0cnVjdGlvbiBleGNlcCAqLworI2RlZmluZSBzSVNSX0ZQVUQJCTB4MDgwMDAwMDAJLyogRlBVIGRpc2FibGVkIGV4Y2VwICovCisjZGVmaW5lIHNJU1JfRlBVVUkJCTB4MTAwMDAwMDAJLyogRlBVIHVuaW1wbGVtZW50ZWQgaW5zdHJ1Y3Rpb24gZXhjZXAgKi8KKyNkZWZpbmUgc0lTUl9GUFVPUAkJMHgyMDAwMDAwMAkvKiBGUFUgb3BlcmF0aW9uIGV4Y2VwICovCisjZGVmaW5lIHNJU1JfTkUJCQkweDgwMDAwMDAwCS8qIG11bHRpcGxlIHN5bmNocm9ub3VzIGV4Y2VwdGlvbnMgZXhjZXAgKi8KKworLyogY2FjaGUgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQ0hDVFIJCQlfX1NZU1JFRygweGMwMDAwMDcwLCB1MTYpCS8qIGNhY2hlIGNvbnRyb2wgKi8KKyNkZWZpbmUgQ0hDVFJfSUNFTgkJMHgwMDAxCQkvKiBpbnN0cnVjdGlvbiBjYWNoZSBlbmFibGUgKi8KKyNkZWZpbmUgQ0hDVFJfRENFTgkJMHgwMDAyCQkvKiBkYXRhIGNhY2hlIGVuYWJsZSAqLworI2RlZmluZSBDSENUUl9JQ0JVU1kJCTB4MDAwNAkJLyogaW5zdHJ1Y3Rpb24gY2FjaGUgYnVzeSAqLworI2RlZmluZSBDSENUUl9EQ0JVU1kJCTB4MDAwOAkJLyogZGF0YSBjYWNoZSBidXN5ICovCisjZGVmaW5lIENIQ1RSX0lDSU5WCQkweDAwMTAJCS8qIGluc3RydWN0aW9uIGNhY2hlIGludmFsaWRhdGUgKi8KKyNkZWZpbmUgQ0hDVFJfRENJTlYJCTB4MDAyMAkJLyogZGF0YSBjYWNoZSBpbnZhbGlkYXRlICovCisjZGVmaW5lIENIQ1RSX0RDV1RNRAkJMHgwMDQwCQkvKiBkYXRhIGNhY2hlIHdyaXRpbmcgbW9kZSAqLworI2RlZmluZSBDSENUUl9EQ1dUTURfV1JCQUNLCTB4MDAwMAkJLyogLSB3cml0ZSBiYWNrIG1vZGUgKi8KKyNkZWZpbmUgQ0hDVFJfRENXVE1EX1dSVEhST1VHSAkweDAwNDAJCS8qIC0gd3JpdGUgdGhyb3VnaCBtb2RlICovCisjZGVmaW5lIENIQ1RSX0RDQUxNRAkJMHgwMDgwCQkvKiBkYXRhIGNhY2hlIGFsbG9jYXRpb24gbW9kZSAqLworI2RlZmluZSBDSENUUl9JQ1dNRAkJMHgwZjAwCQkvKiBpbnN0cnVjdGlvbiBjYWNoZSB3YXkgbW9kZSAqLworI2RlZmluZSBDSENUUl9EQ1dNRAkJMHhmMDAwCQkvKiBkYXRhIGNhY2hlIHdheSBtb2RlICovCisKKy8qIE1NVSBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBNTVVDVFIJCQlfX1NZU1JFRygweGMwMDAwMDkwLCB1MzIpCS8qIE1NVSBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIE1NVUNUUl9JUlAJCTB4MDAwMDAwM2YJLyogaW5zdHJ1Y3Rpb24gVExCIHJlcGxhY2UgcG9pbnRlciAqLworI2RlZmluZSBNTVVDVFJfSVRFCQkweDAwMDAwMDQwCS8qIGluc3RydWN0aW9uIFRMQiBlbmFibGUgKi8KKyNkZWZpbmUgTU1VQ1RSX0lJVgkJMHgwMDAwMDA4MAkvKiBpbnN0cnVjdGlvbiBUTEIgaW52YWxpZGF0ZSAqLworI2RlZmluZSBNTVVDVFJfSVRMCQkweDAwMDAwNzAwCS8qIGluc3RydWN0aW9uIFRMQiBsb2NrIHBvaW50ZXIgKi8KKyNkZWZpbmUgTU1VQ1RSX0lUTF9OT0xPQ0sJMHgwMDAwMDAwMAkvKiAtIG5vIGxvY2sgKi8KKyNkZWZpbmUgTU1VQ1RSX0lUTF9MT0NLMAkweDAwMDAwMTAwCS8qIC0gZW50cnkgMCBsb2NrZWQgKi8KKyNkZWZpbmUgTU1VQ1RSX0lUTF9MT0NLMF8xCTB4MDAwMDAyMDAJLyogLSBlbnRyeSAwLTEgbG9ja2VkICovCisjZGVmaW5lIE1NVUNUUl9JVExfTE9DSzBfMwkweDAwMDAwMzAwCS8qIC0gZW50cnkgMC0zIGxvY2tlZCAqLworI2RlZmluZSBNTVVDVFJfSVRMX0xPQ0swXzcJMHgwMDAwMDQwMAkvKiAtIGVudHJ5IDAtNyBsb2NrZWQgKi8KKyNkZWZpbmUgTU1VQ1RSX0lUTF9MT0NLMF8xNQkweDAwMDAwNTAwCS8qIC0gZW50cnkgMC0xNSBsb2NrZWQgKi8KKyNkZWZpbmUgTU1VQ1RSX0NFCQkweDAwMDA4MDAwCS8qIGNhY2hlYWJsZSBiaXQgZW5hYmxlICovCisjZGVmaW5lIE1NVUNUUl9EUlAJCTB4MDAzZjAwMDAJLyogZGF0YSBUTEIgcmVwbGFjZSBwb2ludGVyICovCisjZGVmaW5lIE1NVUNUUl9EVEUJCTB4MDA0MDAwMDAJLyogZGF0YSBUTEIgZW5hYmxlICovCisjZGVmaW5lIE1NVUNUUl9ESVYJCTB4MDA4MDAwMDAJLyogZGF0YSBUTEIgaW52YWxpZGF0ZSAqLworI2RlZmluZSBNTVVDVFJfRFRMCQkweDA3MDAwMDAwCS8qIGRhdGEgVExCIGxvY2sgcG9pbnRlciAqLworI2RlZmluZSBNTVVDVFJfRFRMX05PTE9DSwkweDAwMDAwMDAwCS8qIC0gbm8gbG9jayAqLworI2RlZmluZSBNTVVDVFJfRFRMX0xPQ0swCTB4MDEwMDAwMDAJLyogLSBlbnRyeSAwIGxvY2tlZCAqLworI2RlZmluZSBNTVVDVFJfRFRMX0xPQ0swXzEJMHgwMjAwMDAwMAkvKiAtIGVudHJ5IDAtMSBsb2NrZWQgKi8KKyNkZWZpbmUgTU1VQ1RSX0RUTF9MT0NLMF8zCTB4MDMwMDAwMDAJLyogLSBlbnRyeSAwLTMgbG9ja2VkICovCisjZGVmaW5lIE1NVUNUUl9EVExfTE9DSzBfNwkweDA0MDAwMDAwCS8qIC0gZW50cnkgMC03IGxvY2tlZCAqLworI2RlZmluZSBNTVVDVFJfRFRMX0xPQ0swXzE1CTB4MDUwMDAwMDAJLyogLSBlbnRyeSAwLTE1IGxvY2tlZCAqLworCisjZGVmaW5lIFBJRFIJCQlfX1NZU1JFRygweGMwMDAwMDk0LCB1MTYpCS8qIFBJRCByZWdpc3RlciAqLworI2RlZmluZSBQSURSX1BJRAkJMHgwMGZmCQkvKiBwcm9jZXNzIGlkZW50aWZpZXIgKi8KKworI2RlZmluZSBQVEJSCQkJX19TWVNSRUcoMHhjMDAwMDA5OCwgdW5zaWduZWQgbG9uZykgLyogUGFnZSB0YWJsZSBiYXNlIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgSVBURUwJCQlfX1NZU1JFRygweGMwMDAwMGEwLCB1MzIpCS8qIGluc3RydWN0aW9uIFRMQiBlbnRyeSAqLworI2RlZmluZSBEUFRFTAkJCV9fU1lTUkVHKDB4YzAwMDAwYjAsIHUzMikJLyogZGF0YSBUTEIgZW50cnkgKi8KKyNkZWZpbmUgeFBURUxfVgkJCTB4MDAwMDAwMDEJLyogVExCIGVudHJ5IHZhbGlkICovCisjZGVmaW5lIHhQVEVMX1VOVVNFRDEJCTB4MDAwMDAwMDIJLyogdW51c2VkIGJpdCAqLworI2RlZmluZSB4UFRFTF9VTlVTRUQyCQkweDAwMDAwMDA0CS8qIHVudXNlZCBiaXQgKi8KKyNkZWZpbmUgeFBURUxfQwkJCTB4MDAwMDAwMDgJLyogY2FjaGVkIGlmIHNldCAqLworI2RlZmluZSB4UFRFTF9QVgkJMHgwMDAwMDAxMAkvKiBwYWdlIHZhbGlkICovCisjZGVmaW5lIHhQVEVMX0QJCQkweDAwMDAwMDIwCS8qIGRpcnR5ICovCisjZGVmaW5lIHhQVEVMX1BSCQkweDAwMDAwMWMwCS8qIHBhZ2UgcHJvdGVjdGlvbiAqLworI2RlZmluZSB4UFRFTF9QUl9ST0sJCTB4MDAwMDAwMDAJLyogLSBSL08ga2VybmVsICovCisjZGVmaW5lIHhQVEVMX1BSX1JXSwkJMHgwMDAwMDEwMAkvKiAtIFIvVyBrZXJuZWwgKi8KKyNkZWZpbmUgeFBURUxfUFJfUk9LX1JPVQkweDAwMDAwMDgwCS8qIC0gUi9PIGtlcm5lbCBhbmQgUi9PIHVzZXIgKi8KKyNkZWZpbmUgeFBURUxfUFJfUldLX1JPVQkweDAwMDAwMTgwCS8qIC0gUi9XIGtlcm5lbCBhbmQgUi9PIHVzZXIgKi8KKyNkZWZpbmUgeFBURUxfUFJfUldLX1JXVQkweDAwMDAwMWMwCS8qIC0gUi9XIGtlcm5lbCBhbmQgUi9XIHVzZXIgKi8KKyNkZWZpbmUgeFBURUxfRwkJCTB4MDAwMDAyMDAJLyogZ2xvYmFsICh1c2UgUElEIGlmIDApICovCisjZGVmaW5lIHhQVEVMX1BTCQkweDAwMDAwYzAwCS8qIHBhZ2Ugc2l6ZSAqLworI2RlZmluZSB4UFRFTF9QU180S2IJCTB4MDAwMDAwMDAJLyogLSA0S2IgcGFnZSAqLworI2RlZmluZSB4UFRFTF9QU18xMjhLYgkJMHgwMDAwMDQwMAkvKiAtIDEyOEtiIHBhZ2UgKi8KKyNkZWZpbmUgeFBURUxfUFNfMUtiCQkweDAwMDAwODAwCS8qIC0gMUtiIHBhZ2UgKi8KKyNkZWZpbmUgeFBURUxfUFNfNE1iCQkweDAwMDAwYzAwCS8qIC0gNE1iIHBhZ2UgKi8KKyNkZWZpbmUgeFBURUxfUFBOCQkweGZmZmZmMDA2CS8qIHBoeXNpY2FsIHBhZ2UgbnVtYmVyICovCisKKyNkZWZpbmUgeFBURUxfVl9CSVQJCTAJLyogYml0IG51bWJlcnMgY29ycmVzcG9uZGluZyB0byBhYm92ZSBtYXNrcyAqLworI2RlZmluZSB4UFRFTF9VTlVTRUQxX0JJVAkxCisjZGVmaW5lIHhQVEVMX1VOVVNFRDJfQklUCTIKKyNkZWZpbmUgeFBURUxfQ19CSVQJCTMKKyNkZWZpbmUgeFBURUxfUFZfQklUCQk0CisjZGVmaW5lIHhQVEVMX0RfQklUCQk1CisjZGVmaW5lIHhQVEVMX0dfQklUCQk5CisKKyNkZWZpbmUgSVBURVUJCQlfX1NZU1JFRygweGMwMDAwMGE0LCB1MzIpCS8qIGluc3RydWN0aW9uIFRMQiB2aXJ0dWFsIGFkZHIgKi8KKyNkZWZpbmUgRFBURVUJCQlfX1NZU1JFRygweGMwMDAwMGI0LCB1MzIpCS8qIGRhdGEgVExCIHZpcnR1YWwgYWRkciAqLworI2RlZmluZSB4UFRFVV9WUE4JCTB4ZmZmZmZjMDAJLyogdmlydHVhbCBwYWdlIG51bWJlciAqLworI2RlZmluZSB4UFRFVV9QSUQJCTB4MDAwMDAwZmYJLyogcHJvY2VzcyBpZGVudGlmaWVyIHRvIHdoaWNoIGFwcGxpY2FibGUgKi8KKworI2RlZmluZSBJUFRFTDIJCQlfX1NZU1JFRygweGMwMDAwMGE4LCB1MzIpCS8qIGluc3RydWN0aW9uIFRMQiBlbnRyeSAqLworI2RlZmluZSBEUFRFTDIJCQlfX1NZU1JFRygweGMwMDAwMGI4LCB1MzIpCS8qIGRhdGEgVExCIGVudHJ5ICovCisjZGVmaW5lIHhQVEVMMl9WCQkweDAwMDAwMDAxCS8qIFRMQiBlbnRyeSB2YWxpZCAqLworI2RlZmluZSB4UFRFTDJfQwkJMHgwMDAwMDAwMgkvKiBjYWNoZWFibGUgKi8KKyNkZWZpbmUgeFBURUwyX1BWCQkweDAwMDAwMDA0CS8qIHBhZ2UgdmFsaWQgKi8KKyNkZWZpbmUgeFBURUwyX0QJCTB4MDAwMDAwMDgJLyogZGlydHkgKi8KKyNkZWZpbmUgeFBURUwyX1BSCQkweDAwMDAwMDcwCS8qIHBhZ2UgcHJvdGVjdGlvbiAqLworI2RlZmluZSB4UFRFTDJfUFJfUk9LCQkweDAwMDAwMDAwCS8qIC0gUi9PIGtlcm5lbCAqLworI2RlZmluZSB4UFRFTDJfUFJfUldLCQkweDAwMDAwMDQwCS8qIC0gUi9XIGtlcm5lbCAqLworI2RlZmluZSB4UFRFTDJfUFJfUk9LX1JPVQkweDAwMDAwMDIwCS8qIC0gUi9PIGtlcm5lbCBhbmQgUi9PIHVzZXIgKi8KKyNkZWZpbmUgeFBURUwyX1BSX1JXS19ST1UJMHgwMDAwMDA2MAkvKiAtIFIvVyBrZXJuZWwgYW5kIFIvTyB1c2VyICovCisjZGVmaW5lIHhQVEVMMl9QUl9SV0tfUldVCTB4MDAwMDAwNzAJLyogLSBSL1cga2VybmVsIGFuZCBSL1cgdXNlciAqLworI2RlZmluZSB4UFRFTDJfRwkJMHgwMDAwMDA4MAkvKiBnbG9iYWwgKHVzZSBQSUQgaWYgMCkgKi8KKyNkZWZpbmUgeFBURUwyX1BTCQkweDAwMDAwMzAwCS8qIHBhZ2Ugc2l6ZSAqLworI2RlZmluZSB4UFRFTDJfUFNfNEtiCQkweDAwMDAwMDAwCS8qIC0gNEtiIHBhZ2UgKi8KKyNkZWZpbmUgeFBURUwyX1BTXzEyOEtiCQkweDAwMDAwMTAwCS8qIC0gMTI4S2IgcGFnZSAqLworI2RlZmluZSB4UFRFTDJfUFNfMUtiCQkweDAwMDAwMjAwCS8qIC0gMUtiIHBhZ2UgKi8KKyNkZWZpbmUgeFBURUwyX1BTXzRNYgkJMHgwMDAwMDMwMAkvKiAtIDRNYiBwYWdlICovCisjZGVmaW5lIHhQVEVMMl9QUE4JCTB4ZmZmZmZjMDAJLyogcGh5c2ljYWwgcGFnZSBudW1iZXIgKi8KKworI2RlZmluZSBNTVVGQ1IJCQlfX1NZU1JFR0MoMHhjMDAwMDA5YywgdTMyKQkvKiBNTVUgZXhjZXB0aW9uIGNhdXNlICovCisjZGVmaW5lIE1NVUZDUl9JRkMJCV9fU1lTUkVHQygweGMwMDAwMDljLCB1MTYpCS8qIE1NVSBpbnN0cnVjdGlvbiBleGNlcCBjYXVzZSAqLworI2RlZmluZSBNTVVGQ1JfREZDCQlfX1NZU1JFR0MoMHhjMDAwMDA5ZSwgdTE2KQkvKiBNTVUgZGF0YSBleGNlcHRpb24gY2F1c2UgKi8KKyNkZWZpbmUgTU1VRkNSX3hGQ19UTEJNSVNTCTB4MDAwMQkJLyogVExCIG1pc3MgZmxhZyAqLworI2RlZmluZSBNTVVGQ1JfeEZDX0lOSVRXUgkweDAwMDIJCS8qIGluaXRpYWwgd3JpdGUgZXhjZXAgZmxhZyAqLworI2RlZmluZSBNTVVGQ1JfeEZDX1BHSU5WQUwJMHgwMDA0CQkvKiBwYWdlIGludmFsaWQgZXhjZXAgZmxhZyAqLworI2RlZmluZSBNTVVGQ1JfeEZDX1BST1RWSU9MCTB4MDAwOAkJLyogcHJvdGVjdGlvbiB2aW9sYXRpb24gZXhjZXAgZmxhZyAqLworI2RlZmluZSBNTVVGQ1JfeEZDX0FDQ0VTUwkweDAwMTAJCS8qIGFjY2VzcyBsZXZlbCBmbGFnICovCisjZGVmaW5lIE1NVUZDUl94RkNfQUNDRVNTX1VTUgkweDAwMDAJCS8qIC0gdXNlciBtb2RlICovCisjZGVmaW5lIE1NVUZDUl94RkNfQUNDRVNTX1NSCTB4MDAxMAkJLyogLSBzdXBlcnZpc29yIG1vZGUgKi8KKyNkZWZpbmUgTU1VRkNSX3hGQ19UWVBFCQkweDAwMjAJCS8qIGFjY2VzcyB0eXBlIGZsYWcgKi8KKyNkZWZpbmUgTU1VRkNSX3hGQ19UWVBFX1JFQUQJMHgwMDAwCQkvKiAtIHJlYWQgKi8KKyNkZWZpbmUgTU1VRkNSX3hGQ19UWVBFX1dSSVRFCTB4MDAyMAkJLyogLSB3cml0ZSAqLworI2RlZmluZSBNTVVGQ1JfeEZDX1BSCQkweDAxYzAJCS8qIHBhZ2UgcHJvdGVjdGlvbiBmbGFnICovCisjZGVmaW5lIE1NVUZDUl94RkNfUFJfUk9LCTB4MDAwMAkJLyogLSBSL08ga2VybmVsICovCisjZGVmaW5lIE1NVUZDUl94RkNfUFJfUldLCTB4MDEwMAkJLyogLSBSL1cga2VybmVsICovCisjZGVmaW5lIE1NVUZDUl94RkNfUFJfUk9LX1JPVQkweDAwODAJCS8qIC0gUi9PIGtlcm5lbCBhbmQgUi9PIHVzZXIgKi8KKyNkZWZpbmUgTU1VRkNSX3hGQ19QUl9SV0tfUk9VCTB4MDE4MAkJLyogLSBSL1cga2VybmVsIGFuZCBSL08gdXNlciAqLworI2RlZmluZSBNTVVGQ1JfeEZDX1BSX1JXS19SV1UJMHgwMWMwCQkvKiAtIFIvVyBrZXJuZWwgYW5kIFIvVyB1c2VyICovCisjZGVmaW5lIE1NVUZDUl94RkNfSUxMQUREUgkweDAyMDAJCS8qIGlsbGVnYWwgYWRkcmVzcyBleGNlcCBmbGFnICovCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfQVNNX0NQVV9SRUdTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvY3B1dGltZS5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9jcHV0aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ2OGFkNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvY3B1dGltZS5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jcHV0aW1lLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL2N1cnJlbnQuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvY3VycmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNjAyN2QKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2N1cnJlbnQuaApAQCAtMCwwICsxLDM3IEBACisvKiBNTjEwMzAwIEN1cnJlbnQgdGFzayBzdHJ1Y3R1cmUgYWNjZXNzb3IKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9DVVJSRU5UX0gKKyNkZWZpbmUgX0FTTV9DVVJSRU5UX0gKKworI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CisKKy8qCisgKiBkZWRpY2F0ZSBFMiB0byBrZWVwaW5nIHRoZSBjdXJyZW50IHRhc2sgcG9pbnRlcgorICovCisjaWZkZWYgQ09ORklHX01OMTAzMDBfQ1VSUkVOVF9JTl9FMgorCityZWdpc3RlciBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNvbnN0IGN1cnJlbnQgYXNtKCJlMiIpIF9fYXR0cmlidXRlX18oKHVzZWQpKTsKKworI2RlZmluZSBnZXRfY3VycmVudCgpIGN1cnJlbnQKKworZXh0ZXJuIHN0cnVjdCB0YXNrX3N0cnVjdCAqX19jdXJyZW50OworCisjZWxzZQorc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpCitzdHJ1Y3QgdGFza19zdHJ1Y3QgKmdldF9jdXJyZW50KHZvaWQpCit7CisJcmV0dXJuIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+dGFzazsKK30KKworI2RlZmluZSBjdXJyZW50IGdldF9jdXJyZW50KCkKKyNlbmRpZgorCisjZW5kaWYgLyogX0FTTV9DVVJSRU5UX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvZGVsYXkuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvZGVsYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDUxN2IzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9kZWxheS5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qIE1OMTAzMDAgVW5pbnRlcnJ1cHRpYmxlIGRlbGF5IHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fREVMQVlfSAorI2RlZmluZSBfQVNNX0RFTEFZX0gKKworZXh0ZXJuIHZvaWQgX191ZGVsYXkodW5zaWduZWQgbG9uZyB1c2Vjcyk7CitleHRlcm4gdm9pZCBfX2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpOworCisjZGVmaW5lIHVkZWxheShuKSBfX3VkZWxheShuKQorCisjZW5kaWYgLyogX0FTTV9ERUxBWV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL2RldmljZS5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGE0YzI1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9kZXZpY2UuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL2RpdjY0LmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2RpdjY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY5YzUxNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvZGl2NjQuaApAQCAtMCwwICsxLDEwMyBAQAorLyogTU4xMDMwMCA2NC1iaXQgZGl2aXNpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9ESVY2NAorI2RlZmluZSBfQVNNX0RJVjY0CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitleHRlcm4gdm9pZCBfX19fdW5oYW5kbGVkX3NpemVfaW5fZG9fZGl2X19fKHZvaWQpOworCisvKgorICogZGl2aWRlIG4gYnkgYmFzZSwgbGVhdmluZyB0aGUgcmVzdWx0IGluIG4gYW5kIHJldHVybmluZyB0aGUgcmVtYWluZGVyCisgKiAtIHdlIGNhbiBkbyB0aGlzIHF1aXRlIGVmZmljaWVudGx5IG9uIHRoZSBNTjEwMzAwIGJ5IGNhc2NhZGluZyB0aGUgZGl2aWRlcworICogICB0aHJvdWdoIHRoZSBNRFIgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBkb19kaXYobiwgYmFzZSkJCQkJCQkJXAorKHsJCQkJCQkJCQlcCisJdW5zaWduZWQgX19yZW0gPSAwOwkJCQkJCVwKKwlpZiAoc2l6ZW9mKG4pIDw9IDQpIHsJCQkJCQlcCisJCWFzbSgibW92CSUxLG1kcglcbiIJCQkJXAorCQkgICAgImRpdnUJJTIsJTAJXG4iCQkJCVwKKwkJICAgICJtb3YJbWRyLCUxCVxuIgkJCQlcCisJCSAgICA6ICIrciIobiksICI9ZCIoX19yZW0pCQkJCVwKKwkJICAgIDogInIiKGJhc2UpLCAiMSIoX19yZW0pCQkJCVwKKwkJICAgIDogImNjIgkJCQkJCVwKKwkJICAgICk7CQkJCQkJCVwKKwl9IGVsc2UgaWYgKHNpemVvZihuKSA8PSA4KSB7CQkJCQlcCisJCXVuaW9uIHsJCQkJCQkJXAorCQkJdW5zaWduZWQgbG9uZyBsb25nIGw7CQkJCVwKKwkJCXUzMiB3WzJdOwkJCQkJXAorCQl9IF9fcXVvdDsJCQkJCQlcCisJCV9fcXVvdC5sID0gbjsJCQkJCQlcCisJCWFzbSgibW92CSUwLG1kcglcbiIJLyogTURSID0gMCAqLwkJXAorCQkgICAgImRpdnUJJTMsJTEJXG4iCQkJCVwKKwkJICAgIC8qIF9fcXVvdC5NU0wgPSBfX2Rpdi5NU0wgLyBiYXNlLCAqLwkJXAorCQkgICAgLyogTURSID0gTURSOl9fZGl2Lk1TTCAlIGJhc2UgKi8JCQlcCisJCSAgICAiZGl2dQklMywlMglcbiIJCQkJXAorCQkgICAgLyogX19xdW90LkxTTCA9IE1EUjpfX2Rpdi5MU0wgLyBiYXNlLCAqLwkJXAorCQkgICAgLyogTURSID0gTURSOl9fZGl2LkxTTCAlIGJhc2UgKi8JCQlcCisJCSAgICAibW92CW1kciwlMAlcbiIJCQkJXAorCQkgICAgOiAiPWQiKF9fcmVtKSwgIj1yIihfX3F1b3Qud1sxXSksICI9ciIoX19xdW90LndbMF0pCVwKKwkJICAgIDogInIiKGJhc2UpLCAiMCIoX19yZW0pLCAiMSIoX19xdW90LndbMV0pLAkJXAorCQkgICAgICAiMiIoX19xdW90LndbMF0pCQkJCQlcCisJCSAgICA6ICJjYyIJCQkJCQlcCisJCSAgICApOwkJCQkJCQlcCisJCW4gPSBfX3F1b3QubDsJCQkJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQlfX19fdW5oYW5kbGVkX3NpemVfaW5fZG9fZGl2X19fKCk7CQkJXAorCX0JCQkJCQkJCVwKKwlfX3JlbTsJCQkJCQkJCVwKK30pCisKKy8qCisgKiBkbyBhbiB1bnNpZ25lZCAzMi1iaXQgbXVsdGlwbHkgYW5kIGRpdmlkZSB3aXRoIGludGVybWVkaWF0ZSA2NC1iaXQgcHJvZHVjdAorICogc28gYXMgbm90IHRvIGxvc2UgYWNjdXJhY3kKKyAqIC0gd2UgdXNlIHRoZSBNRFIgcmVnaXN0ZXIgdG8gaG9sZCB0aGUgTVNXIG9mIHRoZSBwcm9kdWN0CisgKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfXygoY29uc3QpKQordW5zaWduZWQgX19tdWxkaXY2NHUodW5zaWduZWQgdmFsLCB1bnNpZ25lZCBtdWx0LCB1bnNpZ25lZCBkaXYpCit7CisJdW5zaWduZWQgcmVzdWx0OworCisJYXNtKCJtdWx1CSUyLCUwCVxuIgkvKiBNRFI6dmFsID0gdmFsKm11bHQgKi8KKwkgICAgImRpdnUJJTMsJTAJXG4iCS8qIHZhbCA9IE1EUjp2YWwvZGl2OworCQkJCQkgKiBNRFIgPSBNRFI6dmFsJWRpdiAqLworCSAgICA6ICI9ciIocmVzdWx0KQorCSAgICA6ICIwIih2YWwpLCAiaXIiKG11bHQpLCAiciIoZGl2KQorCSAgICApOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIGRvIGEgc2lnbmVkIDMyLWJpdCBtdWx0aXBseSBhbmQgZGl2aWRlIHdpdGggaW50ZXJtZWRpYXRlIDY0LWJpdCBwcm9kdWN0IHNvCisgKiBhcyBub3QgdG8gbG9zZSBhY2N1cmFjeQorICogLSB3ZSB1c2UgdGhlIE1EUiByZWdpc3RlciB0byBob2xkIHRoZSBNU1cgb2YgdGhlIHByb2R1Y3QKKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpCitzaWduZWQgX19tdWxkaXY2NHMoc2lnbmVkIHZhbCwgc2lnbmVkIG11bHQsIHNpZ25lZCBkaXYpCit7CisJc2lnbmVkIHJlc3VsdDsKKworCWFzbSgibXVsCSUyLCUwCVxuIgkvKiBNRFI6dmFsID0gdmFsKm11bHQgKi8KKwkgICAgImRpdgklMywlMAlcbiIJLyogdmFsID0gTURSOnZhbC9kaXY7CisJCQkJCSAqIE1EUiA9IE1EUjp2YWwlZGl2ICovCisJICAgIDogIj1yIihyZXN1bHQpCisJICAgIDogIjAiKHZhbCksICJpciIobXVsdCksICJyIihkaXYpCisJICAgICk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitleHRlcm4gX19hdHRyaWJ1dGVfXygoY29uc3QpKQordWludDY0X3QgZGl2NjRfNjQodWludDY0X3QgZGl2aWRlbmQsIHVpbnQ2NF90IGRpdmlzb3IpOworCisjZW5kaWYgLyogX0FTTV9ESVY2NCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9kbWEtbWFwcGluZy5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9kbWEtbWFwcGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjODgyZmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2RtYS1tYXBwaW5nLmgKQEAgLTAsMCArMSwyMzQgQEAKKy8qIERNQSBtYXBwaW5nIHJvdXRpbmVzIGZvciB0aGUgTU4xMDMwMCBhcmNoCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fRE1BX01BUFBJTkdfSAorI2RlZmluZSBfQVNNX0RNQV9NQVBQSU5HX0gKKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCitleHRlcm4gdm9pZCAqZG1hX2FsbG9jX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkJZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgaW50IGZsYWcpOworCitleHRlcm4gdm9pZCBkbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJICAgICAgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSk7CisKKyNkZWZpbmUgZG1hX2FsbG9jX25vbmNvaGVyZW50KGQsIHMsIGgsIGYpIGRtYV9hbGxvY19jb2hlcmVudCgoZCksIChzKSwgKGgpLCAoZikpCisjZGVmaW5lIGRtYV9mcmVlX25vbmNvaGVyZW50KGQsIHMsIHYsIGgpICBkbWFfZnJlZV9jb2hlcmVudCgoZCksIChzKSwgKHYpLCAoaCkpCisKKy8qCisgKiBNYXAgYSBzaW5nbGUgYnVmZmVyIG9mIHRoZSBpbmRpY2F0ZWQgc2l6ZSBmb3IgRE1BIGluIHN0cmVhbWluZyBtb2RlLiAgVGhlCisgKiAzMi1iaXQgYnVzIGFkZHJlc3MgdG8gdXNlIGlzIHJldHVybmVkLgorICoKKyAqIE9uY2UgdGhlIGRldmljZSBpcyBnaXZlbiB0aGUgZG1hIGFkZHJlc3MsIHRoZSBkZXZpY2Ugb3ducyB0aGlzIG1lbW9yeSB1bnRpbAorICogZWl0aGVyIHBjaV91bm1hcF9zaW5nbGUgb3IgcGNpX2RtYV9zeW5jX3NpbmdsZSBpcyBwZXJmb3JtZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUKK2RtYV9hZGRyX3QgZG1hX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwdHIsIHNpemVfdCBzaXplLAorCQkJICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJQlVHX09OKGRpcmVjdGlvbiA9PSBETUFfTk9ORSk7CisJbW4xMDMwMF9kY2FjaGVfZmx1c2hfaW52KCk7CisJcmV0dXJuIHZpcnRfdG9fYnVzKHB0cik7Cit9CisKKy8qCisgKiBVbm1hcCBhIHNpbmdsZSBzdHJlYW1pbmcgbW9kZSBETUEgdHJhbnNsYXRpb24uICBUaGUgZG1hX2FkZHIgYW5kIHNpemUgbXVzdAorICogbWF0Y2ggd2hhdCB3YXMgcHJvdmlkZWQgZm9yIGluIGEgcHJldmlvdXMgcGNpX21hcF9zaW5nbGUgY2FsbC4gIEFsbCBvdGhlcgorICogdXNhZ2VzIGFyZSB1bmRlZmluZWQuCisgKgorICogQWZ0ZXIgdGhpcyBjYWxsLCByZWFkcyBieSB0aGUgY3B1IHRvIHRoZSBidWZmZXIgYXJlIGd1YXJlbnRlZWQgdG8gc2VlCisgKiB3aGF0ZXZlciB0aGUgZGV2aWNlIHdyb3RlIHRoZXJlLgorICovCitzdGF0aWMgaW5saW5lCit2b2lkIGRtYV91bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwKKwkJICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCUJVR19PTihkaXJlY3Rpb24gPT0gRE1BX05PTkUpOworfQorCisvKgorICogTWFwIGEgc2V0IG9mIGJ1ZmZlcnMgZGVzY3JpYmVkIGJ5IHNjYXR0ZXJsaXN0IGluIHN0cmVhbWluZyBtb2RlIGZvciBETUEuCisgKiBUaGlzIGlzIHRoZSBzY2F0aGVyLWdhdGhlciB2ZXJzaW9uIG9mIHRoZSBhYm92ZSBwY2lfbWFwX3NpbmdsZSBpbnRlcmZhY2UuCisgKiBIZXJlIHRoZSBzY2F0dGVyIGdhdGhlciBsaXN0IGVsZW1lbnRzIGFyZSBlYWNoIHRhZ2dlZCB3aXRoIHRoZSBhcHByb3ByaWF0ZQorICogZG1hIGFkZHJlc3MgYW5kIGxlbmd0aC4gIFRoZXkgYXJlIG9idGFpbmVkIHZpYSBzZ19kbWFfe2FkZHJlc3MsbGVuZ3RofShTRykuCisgKgorICogTk9URTogQW4gaW1wbGVtZW50YXRpb24gbWF5IGJlIGFibGUgdG8gdXNlIGEgc21hbGxlciBudW1iZXIgb2YgRE1BCisgKiAgICAgICBhZGRyZXNzL2xlbmd0aCBwYWlycyB0aGFuIHRoZXJlIGFyZSBTRyB0YWJsZSBlbGVtZW50cy4gIChmb3IgZXhhbXBsZQorICogICAgICAgdmlhIHZpcnR1YWwgbWFwcGluZyBjYXBhYmlsaXRpZXMpIFRoZSByb3V0aW5lIHJldHVybnMgdGhlIG51bWJlciBvZgorICogICAgICAgYWRkci9sZW5ndGggcGFpcnMgYWN0dWFsbHkgdXNlZCwgYXQgbW9zdCBuZW50cy4KKyAqCisgKiBEZXZpY2Ugb3duZXJzaGlwIGlzc3VlcyBhcyBtZW50aW9uZWQgYWJvdmUgZm9yIHBjaV9tYXBfc2luZ2xlIGFyZSB0aGUgc2FtZQorICogaGVyZS4KKyAqLworc3RhdGljIGlubGluZQoraW50IGRtYV9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgaW50IG5lbnRzLAorCSAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlpbnQgaTsKKworCUJVR19PTighdmFsaWRfZG1hX2RpcmVjdGlvbihkaXJlY3Rpb24pKTsKKwlXQVJOX09OKG5lbnRzID09IDAgfHwgc2dsaXN0WzBdLmxlbmd0aCA9PSAwKTsKKworCWZvcl9lYWNoX3NnKHNnbGlzdCwgc2csIG5lbnRzLCBpKSB7CisJCUJVR19PTighc2dfcGFnZShzZykpOworCisJCXNnLT5kbWFfYWRkcmVzcyA9IHNnX3BoeXMoc2cpOworCX0KKworCW1uMTAzMDBfZGNhY2hlX2ZsdXNoX2ludigpOworCXJldHVybiBuZW50czsKK30KKworLyoKKyAqIFVubWFwIGEgc2V0IG9mIHN0cmVhbWluZyBtb2RlIERNQSB0cmFuc2xhdGlvbnMuCisgKiBBZ2FpbiwgY3B1IHJlYWQgcnVsZXMgY29uY2VybmluZyBjYWxscyBoZXJlIGFyZSB0aGUgc2FtZSBhcyBmb3IKKyAqIHBjaV91bm1hcF9zaW5nbGUoKSBhYm92ZS4KKyAqLworc3RhdGljIGlubGluZQordm9pZCBkbWFfdW5tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmh3ZW50cmllcywKKwkJICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJQlVHX09OKCF2YWxpZF9kbWFfZGlyZWN0aW9uKGRpcmVjdGlvbikpOworfQorCisvKgorICogcGNpX3ttYXAsdW5tYXB9X3NpbmdsZV9wYWdlIG1hcHMgYSBrZXJuZWwgcGFnZSB0byBhIGRtYV9hZGRyX3QuIGlkZW50aWNhbAorICogdG8gcGNpX21hcF9zaW5nbGUsIGJ1dCB0YWtlcyBhIHN0cnVjdCBwYWdlIGluc3RlYWQgb2YgYSB2aXJ0dWFsIGFkZHJlc3MKKyAqLworc3RhdGljIGlubGluZQorZG1hX2FkZHJfdCBkbWFfbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKwkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwlCVUdfT04oZGlyZWN0aW9uID09IERNQV9OT05FKTsKKwlyZXR1cm4gcGFnZV90b19idXMocGFnZSkgKyBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgZG1hX3VubWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyZXNzLCBzaXplX3Qgc2l6ZSwKKwkJICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwlCVUdfT04oZGlyZWN0aW9uID09IERNQV9OT05FKTsKK30KKworLyoKKyAqIE1ha2UgcGh5c2ljYWwgbWVtb3J5IGNvbnNpc3RlbnQgZm9yIGEgc2luZ2xlIHN0cmVhbWluZyBtb2RlIERNQSB0cmFuc2xhdGlvbgorICogYWZ0ZXIgYSB0cmFuc2Zlci4KKyAqCisgKiBJZiB5b3UgcGVyZm9ybSBhIHBjaV9tYXBfc2luZ2xlKCkgYnV0IHdpc2ggdG8gaW50ZXJyb2dhdGUgdGhlIGJ1ZmZlciB1c2luZworICogdGhlIGNwdSwgeWV0IGRvIG5vdCB3aXNoIHRvIHRlYXJkb3duIHRoZSBQQ0kgZG1hIG1hcHBpbmcsIHlvdSBtdXN0IGNhbGwgdGhpcworICogZnVuY3Rpb24gYmVmb3JlIGRvaW5nIHNvLiAgQXQgdGhlIG5leHQgcG9pbnQgeW91IGdpdmUgdGhlIFBDSSBkbWEgYWRkcmVzcworICogYmFjayB0byB0aGUgY2FyZCwgdGhlIGRldmljZSBhZ2FpbiBvd25zIHRoZSBidWZmZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCisJCQkgICAgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCisJCQkJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwltbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnYoKTsKK30KKworc3RhdGljIGlubGluZQordm9pZCBkbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKKwkJCQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCisJCQkJICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2RtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLAorCQkJCSB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCisJCQkJIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwltbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnYoKTsKK30KKworCisvKgorICogTWFrZSBwaHlzaWNhbCBtZW1vcnkgY29uc2lzdGVudCBmb3IgYSBzZXQgb2Ygc3RyZWFtaW5nIG1vZGUgRE1BIHRyYW5zbGF0aW9ucworICogYWZ0ZXIgYSB0cmFuc2Zlci4KKyAqCisgKiBUaGUgc2FtZSBhcyBwY2lfZG1hX3N5bmNfc2luZ2xlIGJ1dCBmb3IgYSBzY2F0dGVyLWdhdGhlciBsaXN0LCBzYW1lIHJ1bGVzCisgKiBhbmQgdXNhZ2UuCisgKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgZG1hX3N5bmNfc2dfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkgaW50IG5lbGVtcywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworfQorCitzdGF0aWMgaW5saW5lCit2b2lkIGRtYV9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJICAgIGludCBuZWxlbXMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwltbjEwMzAwX2RjYWNoZV9mbHVzaF9pbnYoKTsKK30KKworc3RhdGljIGlubGluZQoraW50IGRtYV9tYXBwaW5nX2Vycm9yKGRtYV9hZGRyX3QgZG1hX2FkZHIpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gUENJIGRldmljZSBETUEgYWRkcmVzcyBtYXNrIGNhbiBiZSBzdXBwb3J0ZWQKKyAqIHByb3Blcmx5LiAgRm9yIGV4YW1wbGUsIGlmIHlvdXIgZGV2aWNlIGNhbiBvbmx5IGRyaXZlIHRoZSBsb3cgMjQtYml0cyBkdXJpbmcKKyAqIFBDSSBidXMgbWFzdGVyaW5nLCB0aGVuIHlvdSB3b3VsZCBwYXNzIDB4MDBmZmZmZmYgYXMgdGhlIG1hc2sgdG8gdGhpcworICogZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUKK2ludCBkbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spCit7CisJLyoKKwkgKiB3ZSBmYWxsIGJhY2sgdG8gR0ZQX0RNQSB3aGVuIHRoZSBtYXNrIGlzbid0IGFsbCAxcywgc28gd2UgY2FuJ3QKKwkgKiBndWFyYW50ZWUgYWxsb2NhdGlvbnMgdGhhdCBtdXN0IGJlIHdpdGhpbiBhIHRpZ2h0ZXIgcmFuZ2UgdGhhbgorCSAqIEdGUF9ETUEKKwkgKi8KKwlpZiAobWFzayA8IDB4MDBmZmZmZmYpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lCitpbnQgZG1hX3NldF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spCit7CisJaWYgKCFkZXYtPmRtYV9tYXNrIHx8ICFkbWFfc3VwcG9ydGVkKGRldiwgbWFzaykpCisJCXJldHVybiAtRUlPOworCisJKmRldi0+ZG1hX21hc2sgPSBtYXNrOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lCitpbnQgZG1hX2dldF9jYWNoZV9hbGlnbm1lbnQodm9pZCkKK3sKKwlyZXR1cm4gMSA8PCBMMV9DQUNIRV9TSElGVDsKK30KKworI2RlZmluZSBkbWFfaXNfY29uc2lzdGVudChkKQkoMSkKKworc3RhdGljIGlubGluZQordm9pZCBkbWFfY2FjaGVfc3luYyh2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsCisJCSAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJbW4xMDMwMF9kY2FjaGVfZmx1c2hfaW52KCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9kbWEuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvZG1hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk4ZGYyZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvZG1hLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qIE1OMTAzMDAgSVNBIERNQSBoYW5kbGVycyBhbmQgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWF0c3VzaGl0YSBFbGVjdHJpYyBJbmR1c3RyaWFsIENvLiwgTHRkLgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fRE1BX0gKKyNkZWZpbmUgX0FTTV9ETUFfSAorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI3VuZGVmIE1BWF9ETUFfQ0hBTk5FTFMJCS8qIHN3aXRjaCBvZmYgbGludXgva2VybmVsL2RtYS5jICovCisjZGVmaW5lIE1BWF9ETUFfQUREUkVTUwkJMHhiZmZmZmZmZgorCitleHRlcm4gc3BpbmxvY2tfdCBkbWFfc3Bpbl9sb2NrOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY2xhaW1fZG1hX2xvY2sodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFfc3Bpbl9sb2NrLCBmbGFncyk7CisJcmV0dXJuIGZsYWdzOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVsZWFzZV9kbWFfbG9jayh1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYV9zcGluX2xvY2ssIGZsYWdzKTsKK30KKworLyogZW5hYmxlL2Rpc2FibGUgYSBzcGVjaWZpYyBETUEgY2hhbm5lbCAqLworc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9kbWEodW5zaWduZWQgaW50IGRtYW5yKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9kbWEodW5zaWduZWQgaW50IGRtYW5yKQoreworfQorCisvKiBDbGVhciB0aGUgJ0RNQSBQb2ludGVyIEZsaXAgRmxvcCcuCisgKiBXcml0ZSAwIGZvciBMU0IvTVNCLCAxIGZvciBNU0IvTFNCIGFjY2Vzcy4KKyAqIFVzZSB0aGlzIG9uY2UgdG8gaW5pdGlhbGl6ZSB0aGUgRkYgdG8gYSBrbm93biBzdGF0ZS4KKyAqIEFmdGVyIHRoYXQsIGtlZXAgdHJhY2sgb2YgaXQuIDotKQorICogLS0tIEluIG9yZGVyIHRvIGRvIHRoYXQsIHRoZSBETUEgcm91dGluZXMgYmVsb3cgc2hvdWxkIC0tLQorICogLS0tIG9ubHkgYmUgdXNlZCB3aGlsZSBob2xkaW5nIHRoZSBETUEgbG9jayAhIC0tLQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfZG1hX2ZmKHVuc2lnbmVkIGludCBkbWFucikKK3sKK30KKworLyogc2V0IG1vZGUgKGFib3ZlKSBmb3IgYSBzcGVjaWZpYyBETUEgY2hhbm5lbCAqLworc3RhdGljIGlubGluZSB2b2lkIHNldF9kbWFfbW9kZSh1bnNpZ25lZCBpbnQgZG1hbnIsIGNoYXIgbW9kZSkKK3sKK30KKworLyogU2V0IG9ubHkgdGhlIHBhZ2UgcmVnaXN0ZXIgYml0cyBvZiB0aGUgdHJhbnNmZXIgYWRkcmVzcy4KKyAqIFRoaXMgaXMgdXNlZCBmb3Igc3VjY2Vzc2l2ZSB0cmFuc2ZlcnMgd2hlbiB3ZSBrbm93IHRoZSBjb250ZW50cyBvZgorICogdGhlIGxvd2VyIDE2IGJpdHMgb2YgdGhlIERNQSBjdXJyZW50IGFkZHJlc3MgcmVnaXN0ZXIsIGJ1dCBhIDY0ayBib3VuZGFyeQorICogbWF5IGhhdmUgYmVlbiBjcm9zc2VkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RtYV9wYWdlKHVuc2lnbmVkIGludCBkbWFuciwgY2hhciBwYWdlbnIpCit7Cit9CisKKworLyogU2V0IHRyYW5zZmVyIGFkZHJlc3MgJiBwYWdlIGJpdHMgZm9yIHNwZWNpZmljIERNQSBjaGFubmVsLgorICogQXNzdW1lcyBkbWEgZmxpcGZsb3AgaXMgY2xlYXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZG1hX2FkZHIodW5zaWduZWQgaW50IGRtYW5yLCB1bnNpZ25lZCBpbnQgYSkKK3sKK30KKworCisvKiBTZXQgdHJhbnNmZXIgc2l6ZSAobWF4IDY0ayBmb3IgRE1BMS4uMywgMTI4ayBmb3IgRE1BNS4uNykgZm9yCisgKiBhIHNwZWNpZmljIERNQSBjaGFubmVsLgorICogWW91IG11c3QgZW5zdXJlIHRoZSBwYXJhbWV0ZXJzIGFyZSB2YWxpZC4KKyAqIE5PVEU6IGZyb20gYSBtYW51YWw6ICJ0aGUgbnVtYmVyIG9mIHRyYW5zZmVycyBpcyBvbmUgbW9yZQorICogdGhhbiB0aGUgaW5pdGlhbCB3b3JkIGNvdW50IiEgVGhpcyBpcyB0YWtlbiBpbnRvIGFjY291bnQuCisgKiBBc3N1bWVzIGRtYSBmbGlwLWZsb3AgaXMgY2xlYXIuCisgKiBOT1RFIDI6ICJjb3VudCIgcmVwcmVzZW50cyBfYnl0ZXNfIGFuZCBtdXN0IGJlIGV2ZW4gZm9yIGNoYW5uZWxzIDUtNy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNldF9kbWFfY291bnQodW5zaWduZWQgaW50IGRtYW5yLCB1bnNpZ25lZCBpbnQgY291bnQpCit7Cit9CisKKworLyogR2V0IERNQSByZXNpZHVlIGNvdW50LiBBZnRlciBhIERNQSB0cmFuc2ZlciwgdGhpcworICogc2hvdWxkIHJldHVybiB6ZXJvLiBSZWFkaW5nIHRoaXMgd2hpbGUgYSBETUEgdHJhbnNmZXIgaXMKKyAqIHN0aWxsIGluIHByb2dyZXNzIHdpbGwgcmV0dXJuIHVucHJlZGljdGFibGUgcmVzdWx0cy4KKyAqIElmIGNhbGxlZCBiZWZvcmUgdGhlIGNoYW5uZWwgaGFzIGJlZW4gdXNlZCwgaXQgbWF5IHJldHVybiAxLgorICogT3RoZXJ3aXNlLCBpdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgX2J5dGVzXyBsZWZ0IHRvIHRyYW5zZmVyLgorICoKKyAqIEFzc3VtZXMgRE1BIGZsaXAtZmxvcCBpcyBjbGVhci4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZ2V0X2RtYV9yZXNpZHVlKHVuc2lnbmVkIGludCBkbWFucikKK3sKKwlyZXR1cm4gMDsKK30KKworCisvKiBUaGVzZSBhcmUgaW4ga2VybmVsL2RtYS5jOiAqLworZXh0ZXJuIGludCByZXF1ZXN0X2RtYSh1bnNpZ25lZCBpbnQgZG1hbnIsIGNvbnN0IGNoYXIgKmRldmljZV9pZCk7CitleHRlcm4gdm9pZCBmcmVlX2RtYSh1bnNpZ25lZCBpbnQgZG1hbnIpOworCisvKiBGcm9tIFBDSSAqLworCisjaWZkZWYgQ09ORklHX1BDSQorZXh0ZXJuIGludCBpc2FfZG1hX2JyaWRnZV9idWdneTsKKyNlbHNlCisjZGVmaW5lIGlzYV9kbWFfYnJpZGdlX2J1Z2d5IAkoMCkKKyNlbmRpZgorCisjZW5kaWYgLyogX0FTTV9ETUFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9kbWFjdGwtcmVncy5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9kbWFjdGwtcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YTE5OWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2RtYWN0bC1yZWdzLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qIE1OMTAzMDAgb24tYm9hcmQgRE1BIGNvbnRyb2xsZXIgcmVnaXN0ZXJzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fRE1BQ1RMX1JFR1NfSAorI2RlZmluZSBfQVNNX0RNQUNUTF9SRUdTX0gKKworI2luY2x1ZGUgPGFzbS9jcHUtcmVncy5oPgorCisjaWZkZWYgX19LRVJORUxfXworCisvKiBETUEgcmVnaXN0ZXJzICovCisjZGVmaW5lCURNeENUUihOKQkJX19TWVNSRUcoMHhkMjAwMDAwMCArICgoTikgKiAweDEwMCksIHUzMikJLyogY29udHJvbCByZWcgKi8KKyNkZWZpbmUJRE14Q1RSX0JHCQkweDAwMDAwMDFmCS8qIHRyYW5zZmVyIHJlcXVlc3Qgc291cmNlICovCisjZGVmaW5lCURNeENUUl9CR19TT0ZUCQkweDAwMDAwMDAwCS8qIC0gc29mdHdhcmUgc291cmNlICovCisjZGVmaW5lCURNeENUUl9CR19TQzBUWAkJMHgwMDAwMDAwMgkvKiAtIHNlcmlhbCBwb3J0IDAgdHJhbnNtaXNzaW9uICovCisjZGVmaW5lCURNeENUUl9CR19TQzBSWAkJMHgwMDAwMDAwMwkvKiAtIHNlcmlhbCBwb3J0IDAgcmVjZXB0aW9uICovCisjZGVmaW5lCURNeENUUl9CR19TQzFUWAkJMHgwMDAwMDAwNAkvKiAtIHNlcmlhbCBwb3J0IDEgdHJhbnNtaXNzaW9uICovCisjZGVmaW5lCURNeENUUl9CR19TQzFSWAkJMHgwMDAwMDAwNQkvKiAtIHNlcmlhbCBwb3J0IDEgcmVjZXB0aW9uICovCisjZGVmaW5lCURNeENUUl9CR19TQzJUWAkJMHgwMDAwMDAwNgkvKiAtIHNlcmlhbCBwb3J0IDIgdHJhbnNtaXNzaW9uICovCisjZGVmaW5lCURNeENUUl9CR19TQzJSWAkJMHgwMDAwMDAwNwkvKiAtIHNlcmlhbCBwb3J0IDIgcmVjZXB0aW9uICovCisjZGVmaW5lCURNeENUUl9CR19UTTBVRkxPVwkweDAwMDAwMDA4CS8qIC0gdGltZXIgMCB1bmRlcmZsb3cgKi8KKyNkZWZpbmUJRE14Q1RSX0JHX1RNMVVGTE9XCTB4MDAwMDAwMDkJLyogLSB0aW1lciAxIHVuZGVyZmxvdyAqLworI2RlZmluZQlETXhDVFJfQkdfVE0yVUZMT1cJMHgwMDAwMDAwYQkvKiAtIHRpbWVyIDIgdW5kZXJmbG93ICovCisjZGVmaW5lCURNeENUUl9CR19UTTNVRkxPVwkweDAwMDAwMDBiCS8qIC0gdGltZXIgMyB1bmRlcmZsb3cgKi8KKyNkZWZpbmUJRE14Q1RSX0JHX1RNNkFDTVBDQVAJMHgwMDAwMDAwYwkvKiAtIHRpbWVyIDZBIGNvbXBhcmUvY2FwdHVyZSAqLworI2RlZmluZQlETXhDVFJfQkdfQUZFCQkweDAwMDAwMDBkCS8qIC0gYW5hbG9ndWUgZnJvbnQtZW5kIGludGVycnVwdCBzb3VyY2UgKi8KKyNkZWZpbmUJRE14Q1RSX0JHX0FEQwkJMHgwMDAwMDAwZQkvKiAtIEEvRCBjb252ZXJzaW9uIGVuZCBpbnRlcnJ1cHQgc291cmNlICovCisjZGVmaW5lCURNeENUUl9CR19JUkRBCQkweDAwMDAwMDBmCS8qIC0gSXJEQSBpbnRlcnJ1cHQgc291cmNlICovCisjZGVmaW5lCURNeENUUl9CR19SVEMJCTB4MDAwMDAwMTAJLyogLSBSVEMgaW50ZXJydXB0IHNvdXJjZSAqLworI2RlZmluZQlETXhDVFJfQkdfWElSUTAJCTB4MDAwMDAwMTEJLyogLSBYSVJRMCBwaW4gaW50ZXJydXB0IHNvdXJjZSAqLworI2RlZmluZQlETXhDVFJfQkdfWElSUTEJCTB4MDAwMDAwMTIJLyogLSBYSVJRMSBwaW4gaW50ZXJydXB0IHNvdXJjZSAqLworI2RlZmluZQlETXhDVFJfQkdfWERNUjAJCTB4MDAwMDAwMTMJLyogLSBleHRlcm5hbCByZXF1ZXN0IDAgc291cmNlIChYRE1SMCBwaW4pICovCisjZGVmaW5lCURNeENUUl9CR19YRE1SMQkJMHgwMDAwMDAxNAkvKiAtIGV4dGVybmFsIHJlcXVlc3QgMSBzb3VyY2UgKFhETVIxIHBpbikgKi8KKyNkZWZpbmUJRE14Q1RSX1NBTQkJMHgwMDAwMDBlMAkvKiBETUEgdHJhbnNmZXIgc3JjIGFkZHIgbW9kZSAqLworI2RlZmluZQlETXhDVFJfU0FNX0lOQ1IJCTB4MDAwMDAwMDAJLyogLSBpbmNyZW1lbnQgKi8KKyNkZWZpbmUJRE14Q1RSX1NBTV9ERUNSCQkweDAwMDAwMDIwCS8qIC0gZGVjcmVtZW50ICovCisjZGVmaW5lCURNeENUUl9TQU1fRklYRUQJMHgwMDAwMDA0MAkvKiAtIGZpeGVkICovCisjZGVmaW5lCURNeENUUl9EQU0JCTB4MDAwMDAwMDAJLyogRE1BIHRyYW5zZmVyIGRlc3QgYWRkciBtb2RlICovCisjZGVmaW5lCURNeENUUl9EQU1fSU5DUgkJMHgwMDAwMDAwMAkvKiAtIGluY3JlbWVudCAqLworI2RlZmluZQlETXhDVFJfREFNX0RFQ1IJCTB4MDAwMDAxMDAJLyogLSBkZWNyZW1lbnQgKi8KKyNkZWZpbmUJRE14Q1RSX0RBTV9GSVhFRAkweDAwMDAwMjAwCS8qIC0gZml4ZWQgKi8KKyNkZWZpbmUJRE14Q1RSX1RNCQkweDAwMDAxODAwCS8qIERNQSB0cmFuc2ZlciBtb2RlICovCisjZGVmaW5lCURNeENUUl9UTV9CQVRDSAkJMHgwMDAwMDAwMAkvKiAtIGJhdGNoIHRyYW5zZmVyICovCisjZGVmaW5lCURNeENUUl9UTV9JTlRFUk0JMHgwMDAwMTAwMAkvKiAtIGludGVybWl0dGVudCB0cmFuc2ZlciAqLworI2RlZmluZQlETXhDVFJfVVQJCTB4MDAwMDYwMDAJLyogRE1BIHRyYW5zZmVyIHVuaXQgKi8KKyNkZWZpbmUJRE14Q1RSX1VUXzEJCTB4MDAwMDAwMDAJLyogLSAxIGJ5dGUgKi8KKyNkZWZpbmUJRE14Q1RSX1VUXzIJCTB4MDAwMDIwMDAJLyogLSAyIGJ5dGUgKi8KKyNkZWZpbmUJRE14Q1RSX1VUXzQJCTB4MDAwMDQwMDAJLyogLSA0IGJ5dGUgKi8KKyNkZWZpbmUJRE14Q1RSX1VUXzE2CQkweDAwMDA2MDAwCS8qIC0gMTYgYnl0ZSAqLworI2RlZmluZQlETXhDVFJfVEVOCQkweDAwMDEwMDAwCS8qIERNQSBjaGFubmVsIHRyYW5zZmVyIGVuYWJsZSAqLworI2RlZmluZQlETXhDVFJfUlFNCQkweDAwMDYwMDAwCS8qIGV4dGVybmFsIHJlcXVlc3QgaW5wdXQgc291cmNlIG1vZGUgKi8KKyNkZWZpbmUJRE14Q1RSX1JRTV9GQUxMRURHRQkweDAwMDAwMDAwCS8qIC0gZmFsbGluZyBlZGdlICovCisjZGVmaW5lCURNeENUUl9SUU1fUklTRUVER0UJMHgwMDAyMDAwMAkvKiAtIHJpc2luZyBlZGdlICovCisjZGVmaW5lCURNeENUUl9SUU1fTE9MRVZFTAkweDAwMDQwMDAwCS8qIC0gbG93IGxldmVsICovCisjZGVmaW5lCURNeENUUl9SUU1fSElMRVZFTAkweDAwMDYwMDAwCS8qIC0gaGlnaCBsZXZlbCAqLworI2RlZmluZQlETXhDVFJfUlFGCQkweDAxMDAwMDAwCS8qIERNQSB0cmFuc2ZlciByZXF1ZXN0IGZsYWcgKi8KKyNkZWZpbmUJRE14Q1RSX1hFTkQJCTB4ODAwMDAwMDAJLyogRE1BIHRyYW5zZmVyIGVuZCBmbGFnICovCisKKyNkZWZpbmUJRE14U1JDKE4pCQlfX1NZU1JFRygweGQyMDAwMDA0ICsgKChOKSAqIDB4MTAwKSwgdTMyKQkvKiBjb250cm9sIHJlZyAqLworCisjZGVmaW5lCURNeERTVChOKQkJX19TWVNSRUcoMHhkMjAwMDAwOCArICgoTikgKiAweDEwMCksIHUzMikJLyogc3JjIGFkZHIgcmVnICovCisKKyNkZWZpbmUJRE14U0laKE4pCQlfX1NZU1JFRygweGQyMDAwMDBjICsgKChOKSAqIDB4MTAwKSwgdTMyKQkvKiBkZXN0IGFkZHIgcmVnICovCisjZGVmaW5lIERNeFNJWl9DVAkJMHgwMDBmZmZmZgkvKiBudW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIgKi8KKworI2RlZmluZQlETXhDWUMoTikJCV9fU1lTUkVHKDB4ZDIwMDAwMTAgKyAoKE4pICogMHgxMDApLCB1MzIpCS8qIGludGVybWl0dGVudAorCQkJCQkJCQkJCSAqIHNpemUgcmVnICovCisjZGVmaW5lIERNeENZQ19DWUMJCTB4MDAwMDAwZmYJLyogbnVtYmVyIG9mIGludGVycm1pdHRlbnQgdHJhbnNmZXJzIC0xICovCisKKyNkZWZpbmUgRE0wSVJRCQkJMTYJCS8qIERNQSBjaGFubmVsIDAgY29tcGxldGUgSVJRICovCisjZGVmaW5lIERNMUlSUQkJCTE3CQkvKiBETUEgY2hhbm5lbCAxIGNvbXBsZXRlIElSUSAqLworI2RlZmluZSBETTJJUlEJCQkxOAkJLyogRE1BIGNoYW5uZWwgMiBjb21wbGV0ZSBJUlEgKi8KKyNkZWZpbmUgRE0zSVJRCQkJMTkJCS8qIERNQSBjaGFubmVsIDMgY29tcGxldGUgSVJRICovCisKKyNkZWZpbmUJRE0wSUNSCQkJR3hJQ1IoRE0wSVJRKQkvKiBETUEgY2hhbm5lbCAwIGNvbXBsZXRlIGludHIgY3RybCByZWcgKi8KKyNkZWZpbmUJRE0xSUNSCQkJR3hJQ1IoRE0wSVIxKQkvKiBETUEgY2hhbm5lbCAxIGNvbXBsZXRlIGludHIgY3RybCByZWcgKi8KKyNkZWZpbmUJRE0ySUNSCQkJR3hJQ1IoRE0wSVIyKQkvKiBETUEgY2hhbm5lbCAyIGNvbXBsZXRlIGludHIgY3RybCByZWcgKi8KKyNkZWZpbmUJRE0zSUNSCQkJR3hJQ1IoRE0wSVIzKQkvKiBETUEgY2hhbm5lbCAzIGNvbXBsZXRlIGludHIgY3RybCByZWcgKi8KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworc3RydWN0IG1uMTAzMDBfZG1hY3RsX3JlZ3MgeworCXUzMgkJY3RyOworCWNvbnN0IHZvaWQJKnNyYzsKKwl2b2lkCQkqZHN0OworCXUzMgkJc2l6OworCXUzMgkJY3ljOworfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDB4MTAwKSkpOworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfQVNNX0RNQUNUTF9SRUdTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvZWxmLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2VsZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NmE3MDQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2VsZi5oCkBAIC0wLDAgKzEsMTQ3IEBACisvKiBNTjEwMzAwIEVMRiBjb25zdGFudCBhbmQgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWF0c3VzaGl0YSBFbGVjdHJpYyBJbmR1c3RyaWFsIENvLiwgTHRkLgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fRUxGX0gKKyNkZWZpbmUgX0FTTV9FTEZfSAorCisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdXNlci5oPgorCisvKgorICogQU0zMyByZWxvY2F0aW9ucworICovCisjZGVmaW5lIFJfTU4xMDMwMF9OT05FCQkwCS8qIE5vIHJlbG9jLiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwXzMyCQkxCS8qIERpcmVjdCAzMiBiaXQuICAqLworI2RlZmluZSBSX01OMTAzMDBfMTYJCTIJLyogRGlyZWN0IDE2IGJpdC4gICovCisjZGVmaW5lIFJfTU4xMDMwMF84CQkzCS8qIERpcmVjdCA4IGJpdC4gICovCisjZGVmaW5lIFJfTU4xMDMwMF9QQ1JFTDMyCTQJLyogUEMtcmVsYXRpdmUgMzItYml0LiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX1BDUkVMMTYJNQkvKiBQQy1yZWxhdGl2ZSAxNi1iaXQgc2lnbmVkLiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX1BDUkVMOAk2CS8qIFBDLXJlbGF0aXZlIDgtYml0IHNpZ25lZC4gICovCisjZGVmaW5lIFJfTU4xMDMwMF8yNAkJOQkvKiBEaXJlY3QgMjQgYml0LiAgKi8KKyNkZWZpbmUgUl9NTjEwMzAwX1JFTEFUSVZFCTIzCS8qIEFkanVzdCBieSBwcm9ncmFtIGJhc2UuICAqLworCisvKgorICogRUxGIHJlZ2lzdGVyIGRlZmluaXRpb25zLi4KKyAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGVsZl9ncmVnX3Q7CisKKyNkZWZpbmUgRUxGX05HUkVHIChzaXplb2YgKHN0cnVjdCBwdF9yZWdzKSAvIHNpemVvZihlbGZfZ3JlZ190KSkKK3R5cGVkZWYgZWxmX2dyZWdfdCBlbGZfZ3JlZ3NldF90W0VMRl9OR1JFR107CisKKyNkZWZpbmUgRUxGX05GUFJFRyAzMgordHlwZWRlZiBmbG9hdCBlbGZfZnByZWdfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWVsZl9mcHJlZ190CWZwcmVnc1tFTEZfTkZQUkVHXTsKKwl1X2ludDMyX3QJZnBjcjsKK30gZWxmX2ZwcmVnc2V0X3Q7CisKK2V4dGVybiBpbnQgZHVtcF9mcHUoc3RydWN0IHB0X3JlZ3MgKiwgZWxmX2ZwcmVnc2V0X3QgKik7CisKKy8qCisgKiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHdlIGRvbid0IGxvYWQgc29tZXRoaW5nIGZvciB0aGUgd3JvbmcgYXJjaGl0ZWN0dXJlCisgKi8KKyNkZWZpbmUgZWxmX2NoZWNrX2FyY2goeCkgXAorCSgoKHgpLT5lX21hY2hpbmUgPT0gRU1fQ1lHTlVTX01OMTAzMDApIHx8CVwKKwkgKCh4KS0+ZV9tYWNoaW5lID09IEVNX01OMTAzMDApKQorCisvKgorICogVGhlc2UgYXJlIHVzZWQgdG8gc2V0IHBhcmFtZXRlcnMgaW4gdGhlIGNvcmUgZHVtcHMuCisgKi8KKyNkZWZpbmUgRUxGX0NMQVNTCUVMRkNMQVNTMzIKKyNkZWZpbmUgRUxGX0RBVEEJRUxGREFUQTJMU0IKKyNkZWZpbmUgRUxGX0FSQ0gJRU1fTU4xMDMwMAorCisvKgorICogRUxGIHByb2Nlc3MgaW5pdGlhbGlzZXIKKyAqLworI2RlZmluZSBFTEZfUExBVF9JTklUKF9yLCBsb2FkX2FkZHIpCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXN0cnVjdCBwdF9yZWdzICpfdXIgPSBjdXJyZW50LT50aHJlYWQudXJlZ3M7CQkJXAorCV91ci0+YTMgICA9IDA7CV91ci0+YTIgICA9IDA7CV91ci0+ZDMgICA9IDA7CV91ci0+ZDIgICA9IDA7CVwKKwlfdXItPm1jdmYgPSAwOwlfdXItPm1jcmwgPSAwOwlfdXItPm1jcmggPSAwOwlfdXItPm1kcnEgPSAwOwlcCisJX3VyLT5lMSAgID0gMDsJX3VyLT5lMCAgID0gMDsJX3VyLT5lNyAgID0gMDsJX3VyLT5lNiAgID0gMDsJXAorCV91ci0+ZTUgICA9IDA7CV91ci0+ZTQgICA9IDA7CV91ci0+ZTMgICA9IDA7CV91ci0+ZTIgICA9IDA7CVwKKwlfdXItPmxhciAgPSAwOwlfdXItPmxpciAgPSAwOwlfdXItPm1kciAgPSAwOwkJCVwKKwlfdXItPmExICAgPSAwOwlfdXItPmEwICAgPSAwOwlfdXItPmQxICAgPSAwOwlfdXItPmQwICAgPSAwOwlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFVTRV9FTEZfQ09SRV9EVU1QCisjZGVmaW5lIEVMRl9FWEVDX1BBR0VTSVpFCTQwOTYKKworLyoKKyAqIFRoaXMgaXMgdGhlIGxvY2F0aW9uIHRoYXQgYW4gRVRfRFlOIHByb2dyYW0gaXMgbG9hZGVkIGlmIGV4ZWMnZWQuICBUeXBpY2FsCisgKiB1c2Ugb2YgdGhpcyBpcyB0byBpbnZva2UgIi4vbGQuc28gc29tZXByb2ciIHRvIHRlc3Qgb3V0IGEgbmV3IHZlcnNpb24gb2YKKyAqIHRoZSBsb2FkZXIuICBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIG91dCBvZiB0aGUgd2F5IG9mIHRoZSBwcm9ncmFtCisgKiB0aGF0IGl0IHdpbGwgImV4ZWMiLCBhbmQgdGhhdCB0aGVyZSBpcyBzdWZmaWNpZW50IHJvb20gZm9yIHRoZSBicmsuCisgKiAtIG11c3QgY2xlYXIgdGhlIFZNQUxMT0MgYXJlYQorICovCisjZGVmaW5lIEVMRl9FVF9EWU5fQkFTRSAgICAgICAgIDB4MDQwMDAwMDAKKworLyoKKyAqIHJlZ3MgaXMgc3RydWN0IHB0X3JlZ3MsIHByX3JlZyBpcyBlbGZfZ3JlZ3NldF90ICh3aGljaCBpcworICogbm93IHN0cnVjdCB1c2VyX3JlZ3MsIHRoZXkgYXJlIGRpZmZlcmVudCkKKyAqIC0gRUxGX0NPUkVfQ09QWV9SRUdTIGhhcyBiZWVuIGd1ZXNzZWQsIGFuZCBtYXkgYmUgd3JvbmcKKyAqLworI2RlZmluZSBFTEZfQ09SRV9DT1BZX1JFR1MocHJfcmVnLCByZWdzKQlcCitkbyB7CQkJCQkJXAorCXByX3JlZ1swXQk9IHJlZ3MtPmEzOwkJXAorCXByX3JlZ1sxXQk9IHJlZ3MtPmEyOwkJXAorCXByX3JlZ1syXQk9IHJlZ3MtPmQzOwkJXAorCXByX3JlZ1szXQk9IHJlZ3MtPmQyOwkJXAorCXByX3JlZ1s0XQk9IHJlZ3MtPm1jdmY7CQlcCisJcHJfcmVnWzVdCT0gcmVncy0+bWNybDsJCVwKKwlwcl9yZWdbNl0JPSByZWdzLT5tY3JoOwkJXAorCXByX3JlZ1s3XQk9IHJlZ3MtPm1kcnE7CQlcCisJcHJfcmVnWzhdCT0gcmVncy0+ZTE7CQlcCisJcHJfcmVnWzldCT0gcmVncy0+ZTA7CQlcCisJcHJfcmVnWzEwXQk9IHJlZ3MtPmU3OwkJXAorCXByX3JlZ1sxMV0JPSByZWdzLT5lNjsJCVwKKwlwcl9yZWdbMTJdCT0gcmVncy0+ZTU7CQlcCisJcHJfcmVnWzEzXQk9IHJlZ3MtPmU0OwkJXAorCXByX3JlZ1sxNF0JPSByZWdzLT5lMzsJCVwKKwlwcl9yZWdbMTVdCT0gcmVncy0+ZTI7CQlcCisJcHJfcmVnWzE2XQk9IHJlZ3MtPnNwOwkJXAorCXByX3JlZ1sxN10JPSByZWdzLT5sYXI7CQlcCisJcHJfcmVnWzE4XQk9IHJlZ3MtPmxpcjsJCVwKKwlwcl9yZWdbMTldCT0gcmVncy0+bWRyOwkJXAorCXByX3JlZ1syMF0JPSByZWdzLT5hMTsJCVwKKwlwcl9yZWdbMjFdCT0gcmVncy0+YTA7CQlcCisJcHJfcmVnWzIyXQk9IHJlZ3MtPmQxOwkJXAorCXByX3JlZ1syM10JPSByZWdzLT5kMDsJCVwKKwlwcl9yZWdbMjRdCT0gcmVncy0+b3JpZ19kMDsJXAorCXByX3JlZ1syNV0JPSByZWdzLT5lcHN3OwkJXAorCXByX3JlZ1syNl0JPSByZWdzLT5wYzsJCVwKK30gd2hpbGUgKDApOworCisvKgorICogVGhpcyB5aWVsZHMgYSBtYXNrIHRoYXQgdXNlciBwcm9ncmFtcyBjYW4gdXNlIHRvIGZpZ3VyZSBvdXQgd2hhdAorICogaW5zdHJ1Y3Rpb24gc2V0IHRoaXMgQ1BVIHN1cHBvcnRzLiAgVGhpcyBjb3VsZCBiZSBkb25lIGluIHVzZXIgc3BhY2UsCisgKiBidXQgaXQncyBub3QgZWFzeSwgYW5kIHdlJ3ZlIGFscmVhZHkgZG9uZSBpdCBoZXJlLgorICovCisjZGVmaW5lIEVMRl9IV0NBUAkoMCkKKworLyoKKyAqIFRoaXMgeWllbGRzIGEgc3RyaW5nIHRoYXQgbGQuc28gd2lsbCB1c2UgdG8gbG9hZCBpbXBsZW1lbnRhdGlvbgorICogc3BlY2lmaWMgbGlicmFyaWVzIGZvciBvcHRpbWl6YXRpb24uICBUaGlzIGlzIG1vcmUgc3BlY2lmaWMgaW4KKyAqIGludGVudCB0aGFuIHBva2luZyBhdCB1bmFtZSBvciAvcHJvYy9jcHVpbmZvLgorICoKKyAqIEZvciB0aGUgbW9tZW50LCB3ZSBoYXZlIG9ubHkgb3B0aW1pemF0aW9ucyBmb3IgdGhlIEludGVsIGdlbmVyYXRpb25zLAorICogYnV0IHRoYXQgY291bGQgY2hhbmdlLi4uCisgKi8KKyNkZWZpbmUgRUxGX1BMQVRGT1JNICAoTlVMTCkKKworI2lmZGVmIF9fS0VSTkVMX18KKyNkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKGV4LCBpYmNzMikgc2V0X3BlcnNvbmFsaXR5KFBFUl9MSU5VWCkKKyNlbmRpZgorCisjZW5kaWYgLyogX0FTTV9FTEZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9lbWVyZ2VuY3ktcmVzdGFydC5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9lbWVyZ2VuY3ktcmVzdGFydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MTFiZDkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2VtZXJnZW5jeS1yZXN0YXJ0LmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2VtZXJnZW5jeS1yZXN0YXJ0Lmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL2Vycm5vLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2Vycm5vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM4MmI1MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvZXJybm8uaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZXJybm8uaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvZXhjZXB0aW9ucy5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9leGNlcHRpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmExNjQ2NgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvZXhjZXB0aW9ucy5oCkBAIC0wLDAgKzEsMTIxIEBACisvKiBNTjEwMzAwIE1pY3JvY29udHJvbGxlciBjb3JlIGV4Y2VwdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9FWENFUFRJT05TX0gKKyNkZWZpbmUgX0FTTV9FWENFUFRJT05TX0gKKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKworLyoKKyAqIGRlZmluZSB0aGUgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiBvcGNvZGUgdG8gdXNlCisgKiAtIG5vdGUgdGhhdCB0aGUgSlRBRyB1bml0IHN0ZWFscyAweEZGLCBzbyB3ZSB3YW50IHRvIGF2b2lkIHRoYXQgaWYgd2UgY2FuCisgKiAgIChjYW4gdXNlIDB4RjcpCisgKi8KKyNkZWZpbmUgR0RCU1RVQl9CS1BUCQkweEZGCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKy8qCisgKiBlbnVtZXJhdGlvbiBvZiBleGNlcHRpb24gY29kZXMgKGFzIGV4dHJhY3RlZCBmcm9tIFRCUiBNU1cpCisgKi8KK2VudW0gZXhjZXB0aW9uX2NvZGUgeworCUVYQ0VQX1JFU0VUCQk9IDB4MDAwMDAwLAkvKiByZXNldCAqLworCisJLyogTU1VIGV4Y2VwdGlvbnMgKi8KKwlFWENFUF9JVExCTUlTUwkJPSAweDAwMDEwMCwJLyogaW5zdHJ1Y3Rpb24gVExCIG1pc3MgKi8KKwlFWENFUF9EVExCTUlTUwkJPSAweDAwMDEwOCwJLyogZGF0YSBUTEIgbWlzcyAqLworCUVYQ0VQX0lBRVJST1IJCT0gMHgwMDAxMTAsCS8qIGluc3RydWN0aW9uIGFkZHJlc3MgKi8KKwlFWENFUF9EQUVSUk9SCQk9IDB4MDAwMTE4LAkvKiBkYXRhIGFkZHJlc3MgKi8KKworCS8qIHN5c3RlbSBleGNlcHRpb25zICovCisJRVhDRVBfVFJBUAkJPSAweDAwMDEyOCwJLyogcHJvZ3JhbSBpbnRlcnJ1cHQgKFBJIGluc3RydWN0aW9uKSAqLworCUVYQ0VQX0lTVEVQCQk9IDB4MDAwMTMwLAkvKiBzaW5nbGUgc3RlcCAqLworCUVYQ0VQX0lCUkVBSwkJPSAweDAwMDE1MCwJLyogaW5zdHJ1Y3Rpb24gYnJlYWtwb2ludCAqLworCUVYQ0VQX09CUkVBSwkJPSAweDAwMDE1OCwJLyogb3BlcmFuZCBicmVha3BvaW50ICovCisJRVhDRVBfUFJJVklOUwkJPSAweDAwMDE2MCwJLyogcHJpdmlsZWdlZCBpbnN0cnVjdGlvbiBleGVjdXRpb24gKi8KKwlFWENFUF9VTklNUElOUwkJPSAweDAwMDE2OCwJLyogdW5pbXBsZW1lbnRlZCBpbnN0cnVjdGlvbiBleGVjdXRpb24gKi8KKwlFWENFUF9VTklNUEVYSU5TCT0gMHgwMDAxNzAsCS8qIHVuaW1wbGVtZW50ZWQgZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gZXhlY3V0aW9uICovCisJRVhDRVBfTUVNRVJSCQk9IDB4MDAwMTc4LAkvKiBpbGxlZ2FsIG1lbW9yeSBhY2Nlc3MgKi8KKwlFWENFUF9NSVNBTElHTgkJPSAweDAwMDE4MCwJLyogbWlzYWxpZ25tZW50ICovCisJRVhDRVBfQlVTRVJST1IJCT0gMHgwMDAxODgsCS8qIGJ1cyBlcnJvciAqLworCUVYQ0VQX0lMTElOU0FDQwkJPSAweDAwMDE5MCwJLyogaWxsZWdhbCBpbnN0cnVjdGlvbiBhY2Nlc3MgKi8KKwlFWENFUF9JTExEQVRBQ0MJCT0gMHgwMDAxOTgsCS8qIGlsbGVnYWwgZGF0YSBhY2Nlc3MgKi8KKwlFWENFUF9JT0lOU0FDQwkJPSAweDAwMDFhMCwJLyogSS9PIHNwYWNlIGluc3RydWN0aW9uIGFjY2VzcyAqLworCUVYQ0VQX1BSSVZJTlNBQ0MJPSAweDAwMDFhOCwJLyogcHJpdmlsZWdlZCBzcGFjZSBpbnN0cnVjdGlvbiBhY2Nlc3MgKi8KKwlFWENFUF9QUklWREFUQUNDCT0gMHgwMDAxYjAsCS8qIHByaXZpbGVnZWQgc3BhY2UgZGF0YSBhY2Nlc3MgKi8KKwlFWENFUF9EQVRJTlNBQ0MJCT0gMHgwMDAxYjgsCS8qIGRhdGEgc3BhY2UgaW5zdHJ1Y3Rpb24gYWNjZXNzICovCisJRVhDRVBfRE9VQkxFX0ZBVUxUCT0gMHgwMDAyMDAsCS8qIGRvdWJsZSBmYXVsdCAqLworCisJLyogRlBVIGV4Y2VwdGlvbnMgKi8KKwlFWENFUF9GUFVfRElTQUJMRUQJPSAweDAwMDFjMCwJLyogRlBVIGRpc2FibGVkICovCisJRVhDRVBfRlBVX1VOSU1QSU5TCT0gMHgwMDAxYzgsCS8qIEZQVSB1bmltcGxlbWVudGVkIG9wZXJhdGlvbiAqLworCUVYQ0VQX0ZQVV9PUEVSQVRJT04JPSAweDAwMDFkMCwJLyogRlBVIG9wZXJhdGlvbiAqLworCisJLyogaW50ZXJydXB0cyAqLworCUVYQ0VQX1dEVAkJPSAweDAwMDI0MCwJLyogd2F0Y2hkb2cgdGltZXIgb3ZlcmZsb3cgKi8KKwlFWENFUF9OTUkJCT0gMHgwMDAyNDgsCS8qIG5vbi1tYXNrYWJsZSBpbnRlcnJ1cHQgKi8KKwlFWENFUF9JUlFfTEVWRUwwCT0gMHgwMDAyODAsCS8qIGxldmVsIDAgbWFza2FibGUgaW50ZXJydXB0ICovCisJRVhDRVBfSVJRX0xFVkVMMQk9IDB4MDAwMjg4LAkvKiBsZXZlbCAxIG1hc2thYmxlIGludGVycnVwdCAqLworCUVYQ0VQX0lSUV9MRVZFTDIJPSAweDAwMDI5MCwJLyogbGV2ZWwgMiBtYXNrYWJsZSBpbnRlcnJ1cHQgKi8KKwlFWENFUF9JUlFfTEVWRUwzCT0gMHgwMDAyOTgsCS8qIGxldmVsIDMgbWFza2FibGUgaW50ZXJydXB0ICovCisJRVhDRVBfSVJRX0xFVkVMNAk9IDB4MDAwMmEwLAkvKiBsZXZlbCA0IG1hc2thYmxlIGludGVycnVwdCAqLworCUVYQ0VQX0lSUV9MRVZFTDUJPSAweDAwMDJhOCwJLyogbGV2ZWwgNSBtYXNrYWJsZSBpbnRlcnJ1cHQgKi8KKwlFWENFUF9JUlFfTEVWRUw2CT0gMHgwMDAyYjAsCS8qIGxldmVsIDYgbWFza2FibGUgaW50ZXJydXB0ICovCisKKwkvKiBzeXN0ZW0gY2FsbHMgKi8KKwlFWENFUF9TWVNDQUxMMAkJPSAweDAwMDMwMCwJLyogc3lzdGVtIGNhbGwgMCAqLworCUVYQ0VQX1NZU0NBTEwxCQk9IDB4MDAwMzA4LAkvKiBzeXN0ZW0gY2FsbCAxICovCisJRVhDRVBfU1lTQ0FMTDIJCT0gMHgwMDAzMTAsCS8qIHN5c3RlbSBjYWxsIDIgKi8KKwlFWENFUF9TWVNDQUxMMwkJPSAweDAwMDMxOCwJLyogc3lzdGVtIGNhbGwgMyAqLworCUVYQ0VQX1NZU0NBTEw0CQk9IDB4MDAwMzIwLAkvKiBzeXN0ZW0gY2FsbCA0ICovCisJRVhDRVBfU1lTQ0FMTDUJCT0gMHgwMDAzMjgsCS8qIHN5c3RlbSBjYWxsIDUgKi8KKwlFWENFUF9TWVNDQUxMNgkJPSAweDAwMDMzMCwJLyogc3lzdGVtIGNhbGwgNiAqLworCUVYQ0VQX1NZU0NBTEw3CQk9IDB4MDAwMzM4LAkvKiBzeXN0ZW0gY2FsbCA3ICovCisJRVhDRVBfU1lTQ0FMTDgJCT0gMHgwMDAzNDAsCS8qIHN5c3RlbSBjYWxsIDggKi8KKwlFWENFUF9TWVNDQUxMOQkJPSAweDAwMDM0OCwJLyogc3lzdGVtIGNhbGwgOSAqLworCUVYQ0VQX1NZU0NBTEwxMAkJPSAweDAwMDM1MCwJLyogc3lzdGVtIGNhbGwgMTAgKi8KKwlFWENFUF9TWVNDQUxMMTEJCT0gMHgwMDAzNTgsCS8qIHN5c3RlbSBjYWxsIDExICovCisJRVhDRVBfU1lTQ0FMTDEyCQk9IDB4MDAwMzYwLAkvKiBzeXN0ZW0gY2FsbCAxMiAqLworCUVYQ0VQX1NZU0NBTEwxMwkJPSAweDAwMDM2OCwJLyogc3lzdGVtIGNhbGwgMTMgKi8KKwlFWENFUF9TWVNDQUxMMTQJCT0gMHgwMDAzNzAsCS8qIHN5c3RlbSBjYWxsIDE0ICovCisJRVhDRVBfU1lTQ0FMTDE1CQk9IDB4MDAwMzc4LAkvKiBzeXN0ZW0gY2FsbCAxNSAqLworfTsKKworZXh0ZXJuIHZvaWQgX19zZXRfaW50cl9zdHViKGVudW0gZXhjZXB0aW9uX2NvZGUgY29kZSwgdm9pZCAqaGFuZGxlcik7CitleHRlcm4gdm9pZCBzZXRfaW50cl9zdHViKGVudW0gZXhjZXB0aW9uX2NvZGUgY29kZSwgdm9pZCAqaGFuZGxlcik7CitleHRlcm4gdm9pZCBzZXRfanRhZ19zdHViKGVudW0gZXhjZXB0aW9uX2NvZGUgY29kZSwgdm9pZCAqaGFuZGxlcik7CisKK3N0cnVjdCBwdF9yZWdzOworCitleHRlcm4gYXNtbGlua2FnZSB2b2lkIF9fY29tbW9uX2V4Y2VwdGlvbih2b2lkKTsKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgaXRsYl9taXNzKHZvaWQpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBkdGxiX21pc3Modm9pZCk7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIGl0bGJfYWVycm9yKHZvaWQpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBkdGxiX2FlcnJvcih2b2lkKTsKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgcmF3X2J1c19lcnJvcih2b2lkKTsKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgZG91YmxlX2ZhdWx0KHZvaWQpOworZXh0ZXJuIGFzbWxpbmthZ2UgaW50ICBzeXN0ZW1fY2FsbChzdHJ1Y3QgcHRfcmVncyAqKTsKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgZnB1X2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqLCBlbnVtIGV4Y2VwdGlvbl9jb2RlKTsKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgbm1pKHN0cnVjdCBwdF9yZWdzICosIGVudW0gZXhjZXB0aW9uX2NvZGUpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCB1bmluaXRpYWxpc2VkX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqLAorCQkJCQkgICAgICAgZW51bSBleGNlcHRpb25fY29kZSk7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIGlycV9oYW5kbGVyKHZvaWQpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBwcm9maWxlX2hhbmRsZXIodm9pZCk7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIG5taV9oYW5kbGVyKHZvaWQpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBtaXNhbGlnbm1lbnQoc3RydWN0IHB0X3JlZ3MgKiwgZW51bSBleGNlcHRpb25fY29kZSk7CisKK2V4dGVybiB2b2lkIGRpZShjb25zdCBjaGFyICosIHN0cnVjdCBwdF9yZWdzICosIGVudW0gZXhjZXB0aW9uX2NvZGUpCisJQVRUUklCX05PUkVUOworCitleHRlcm4gaW50IGRpZV9pZl9ub19maXh1cChjb25zdCBjaGFyICosIHN0cnVjdCBwdF9yZWdzICosIGVudW0gZXhjZXB0aW9uX2NvZGUpOworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfQVNNX0VYQ0VQVElPTlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9mYi5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9mYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5N2IyNGEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2ZiLmgKQEAgLTAsMCArMSwyMyBAQAorLyogTU4xMDMwMCBGcmFtZSBidWZmZXIgc3R1ZmYKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9GQl9ICisjZGVmaW5lIF9BU01fRkJfSAorCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKworI2RlZmluZSBmYl9wZ3Byb3RlY3QoLi4uKSBkbyB7fSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgZmJfaXNfcHJpbWFyeV9kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBfQVNNX0ZCX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvZmNudGwuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvZmNudGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmFiMTJkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9mY250bC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mY250bC5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9mcHUuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvZnB1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRhMmI4MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvZnB1LmgKQEAgLTAsMCArMSw4NSBAQAorLyogTU4xMDMwMCBGUFUgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICogRGVyaXZlZCBmcm9tIGluY2x1ZGUvYXNtLWkzODYvaTM4Ny5oOiBDb3B5cmlnaHQgKEMpIDE5OTQgTGludXMgVG9ydmFsZHMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fRlBVX0gKKyNkZWZpbmUgX0FTTV9GUFVfSAorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9zaWdjb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL3VzZXIuaD4KKworI2lmZGVmIF9fS0VSTkVMX18KKworLyogdGhlIHRhc2sgdGhhdCBvd25zIHRoZSBGUFUgc3RhdGUgKi8KK2V4dGVybiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmZwdV9zdGF0ZV9vd25lcjsKKworI2RlZmluZSBzZXRfdXNpbmdfZnB1KHRzaykJCQkJXAorZG8gewkJCQkJCQlcCisJKHRzayktPnRocmVhZC5mcHVfZmxhZ3MgfD0gVEhSRUFEX1VTSU5HX0ZQVTsJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBjbGVhcl91c2luZ19mcHUodHNrKQkJCQlcCitkbyB7CQkJCQkJCVwKKwkodHNrKS0+dGhyZWFkLmZwdV9mbGFncyAmPSB+VEhSRUFEX1VTSU5HX0ZQVTsJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBpc191c2luZ19mcHUodHNrKSAoKHRzayktPnRocmVhZC5mcHVfZmxhZ3MgJiBUSFJFQURfVVNJTkdfRlBVKQorCisjZGVmaW5lIHVubGF6eV9mcHUodHNrKQkJCQkJXAorZG8gewkJCQkJCQlcCisJcHJlZW1wdF9kaXNhYmxlKCk7CQkJCVwKKwlpZiAoZnB1X3N0YXRlX293bmVyID09ICh0c2spKQkJCVwKKwkJZnB1X3NhdmUoJnRzay0+dGhyZWFkLmZwdV9zdGF0ZSk7CVwKKwlwcmVlbXB0X2VuYWJsZSgpOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGV4aXRfZnB1KCkJCQkJXAorZG8gewkJCQkJCVwKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKl9fdHNrID0gY3VycmVudDsJXAorCXByZWVtcHRfZGlzYWJsZSgpOwkJCVwKKwlpZiAoZnB1X3N0YXRlX293bmVyID09IF9fdHNrKQkJXAorCQlmcHVfc3RhdGVfb3duZXIgPSBOVUxMOwkJXAorCXByZWVtcHRfZW5hYmxlKCk7CQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBmbHVzaF9mcHUoKQkJCQkJXAorZG8gewkJCQkJCQlcCisJc3RydWN0IHRhc2tfc3RydWN0ICpfX3RzayA9IGN1cnJlbnQ7CQlcCisJcHJlZW1wdF9kaXNhYmxlKCk7CQkJCVwKKwlpZiAoZnB1X3N0YXRlX293bmVyID09IF9fdHNrKSB7CQkJXAorCQlmcHVfc3RhdGVfb3duZXIgPSBOVUxMOwkJCVwKKwkJX190c2stPnRocmVhZC51cmVncy0+ZXBzdyAmPSB+RVBTV19GRTsJXAorCX0JCQkJCQlcCisJcHJlZW1wdF9lbmFibGUoKTsJCQkJXAorCWNsZWFyX3VzaW5nX2ZwdShfX3Rzayk7CQkJCVwKK30gd2hpbGUgKDApCisKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgZnB1X2luaXRfc3RhdGUodm9pZCk7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIGZwdV9raWxsX3N0YXRlKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgZnB1X2Rpc2FibGVkKHN0cnVjdCBwdF9yZWdzICosIGVudW0gZXhjZXB0aW9uX2NvZGUpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBmcHVfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICosIGVudW0gZXhjZXB0aW9uX2NvZGUpOworCisjaWZkZWYgQ09ORklHX0ZQVQorZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBmcHVfc2F2ZShzdHJ1Y3QgZnB1X3N0YXRlX3N0cnVjdCAqKTsKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgZnB1X3Jlc3RvcmUoc3RydWN0IGZwdV9zdGF0ZV9zdHJ1Y3QgKik7CisjZWxzZQorI2RlZmluZSBmcHVfc2F2ZShhKQorI2RlZmluZSBmcHVfcmVzdG9yZShhKQorI2VuZGlmIC8qIENPTkZJR19GUFUgICovCisKKy8qCisgKiBzaWduYWwgZnJhbWUgaGFuZGxlcnMKKyAqLworZXh0ZXJuIGludCBmcHVfc2V0dXBfc2lnY29udGV4dChzdHJ1Y3QgZnB1Y29udGV4dCAqYnVmKTsKK2V4dGVybiBpbnQgZnB1X3Jlc3RvcmVfc2lnY29udGV4dChzdHJ1Y3QgZnB1Y29udGV4dCAqYnVmKTsKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfQVNNX0ZQVV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL2ZyYW1lLmluYyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvZnJhbWUuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMTk0OWIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2ZyYW1lLmluYwpAQCAtMCwwICsxLDkxIEBACisvKiBNTjEwMzAwIE1pY3JvY29udHJvbGxlciBjb3JlIHN5c3RlbSByZWdpc3RlciBkZWZpbml0aW9ucyAtKi0gYXNtIC0qLQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfQVNNX0ZSQU1FX0lOQworI2RlZmluZSBfQVNNX0ZSQU1FX0lOQworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2Vycm9yIG5vdCBmb3IgdXNlIGluIEMgZmlsZXMKKyNlbmRpZgorCisjaWZuZGVmIF9fQVNNX09GRlNFVFNfSF9fCisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjZW5kaWYKKworI2RlZmluZSBwaSBicmVhaworCisjZGVmaW5lIGZwIGEzCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgYnVpbGQgYSBzdGFjayBmcmFtZSBmcm9tIHRoZSByZWdpc3RlcnMKKyMgLSB0aGUgY2FsbGVyIGhhcyBzdWJ0cmFjdGVkIDQgZnJvbSBTUCBiZWZvcmUgY29taW5nIGhlcmUKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy5tYWNybyBTQVZFX0FMTAorCWFkZAktNCxzcAkJCQkjIG5leHQgZXhjZXB0aW9uIGZyYW1lIHB0ciBzYXZlIGFyZWEKKwltb3ZtCVtvdGhlcl0sKHNwKQorCW1vdgl1c3AsYTEKKwltb3YJYTEsKHNwKQkJCQkjIFVTUCBpbiBNT1ZNW290aGVyXSBkdW1teSBzbG90CisJbW92bQlbZDIsZDMsYTIsYTMsZXhyZWcwLGV4cmVnMSxleG90aGVyXSwoc3ApCisJbW92CXNwLGZwCQkJCSMgRlJBTUUgcG9pbnRlciBpbiBBMworCWFkZAktMTIsc3AJCQkJIyBhbGxvdyBmb3IgY2FsbHMgdG8gYmUgbWFkZQorCW1vdgkoX19mcmFtZSksYTEKKwltb3YJYTEsKFJFR19ORVhULGZwKQorCW1vdglmcCwoX19mcmFtZSkKKworCWFuZAl+RVBTV19GRSxlcHN3CQkJIyBkaXNhYmxlIHRoZSBGUFUgaW5zaWRlIHRoZSBrZXJuZWwKKworCSMgd2UgbWF5IGJlIGhvbGRpbmcgY3VycmVudCBpbiBFMgorI2lmZGVmIENPTkZJR19NTjEwMzAwX0NVUlJFTlRfSU5fRTIKKwltb3YJKF9fY3VycmVudCksZTIKKyNlbmRpZgorLmVuZG0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyByZXN0b3JlIHRoZSByZWdpc3RlcnMgZnJvbSBhIHN0YWNrIGZyYW1lCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisubWFjcm8gUkVTVE9SRV9BTEwKKwkjIHBlZWwgYmFjayB0aGUgc3RhY2sgdG8gdGhlIGNhbGxpbmcgZnJhbWUKKwkjIC0gdGhpcyBwZXJtaXRzIGV4ZWN2ZSgpIHRvIGRpc2NhcmQgZXh0cmEgZnJhbWVzIGR1ZSB0byBrZXJuZWwgc3lzY2FsbHMKKwltb3YJKF9fZnJhbWUpLGZwCisJbW92CWZwLHNwCisJbW92CShSRUdfTkVYVCxmcCksZDAgICAgICAgICAgICAgICAgIyB1c2Vyc3BhY2UgaGFzIHJlZ3MtPm5leHQgPT0gMAorCW1vdglkMCwoX19mcmFtZSkKKworI2lmbmRlZiBDT05GSUdfTU4xMDMwMF9VU0lOR19KVEFHCisJbW92CShSRUdfRVBTVyxmcCksZDAKKwlidHN0CUVQU1dfVCxkMAorCWJlcQk5OWYKKworCW9yCUVQU1dfTk1JRCxlcHN3CisJbW92aHUJKERDUiksZDEKKwlvcgkweDAwMDEsIGQxCisJbW92aHUJZDEsKERDUikKKworOTk6CisjZW5kaWYKKwltb3ZtCShzcCksW2QyLGQzLGEyLGEzLGV4cmVnMCxleHJlZzEsZXhvdGhlcl0KKworCSMgbXVzdCByZXN0b3JlIHVzcCBldmVuIGlmIHJldHVybmluZyB0byBrZXJuZWwgc3BhY2UsCisJIyB3aGVuIENPTkZJR19QUkVFTVBUIGlzIGVuYWJsZWQuCisJbW92CShzcCksYTEJCQkJIyBVU1AgaW4gTU9WTVtvdGhlcl0gZHVtbXkgc2xvdAorCW1vdglhMSx1c3AKKworCW1vdm0JKHNwKSxbb3RoZXJdCisJYWRkCTgsc3AKKwlydGkKKworLmVuZG0KKworCisjZW5kaWYgLyogX0FTTV9GUkFNRV9JTkMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvZnV0ZXguaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvZnV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjc0NTgyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9mdXRleC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mdXRleC5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9nZGItc3R1Yi5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9nZGItc3R1Yi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YTYzNjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2dkYi1zdHViLmgKQEAgLTAsMCArMSwxODMgQEAKKy8qIE1OMTAzMDAgS2VybmVsIEdEQiBzdHViIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqIC0gRGVyaXZlZCBmcm9tIGFzbS1taXBzL2dkYi1zdHViLmggKGMpIDE5OTUgQW5kcmVhcyBCdXNzZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9HREJfU1RVQl9ICisjZGVmaW5lIF9BU01fR0RCX1NUVUJfSAorCisjaW5jbHVkZSA8YXNtL2V4Y2VwdGlvbnMuaD4KKworLyoKKyAqIHJlZ2lzdGVyIElEIG51bWJlcnMgaW4gR0RCIHJlbW90ZSBwcm90b2NvbAorICovCisKKyNkZWZpbmUgR0RCX1JFR0lEX1BDCQk5CisjZGVmaW5lIEdEQl9SRUdJRF9GUAkJNworI2RlZmluZSBHREJfUkVHSURfU1AJCTgKKworLyoKKyAqIHZpcnR1YWwgc3RhY2sgbGF5b3V0IGZvciB0aGUgR0RCIGV4Y2VwdGlvbiBoYW5kbGVyCisgKi8KKyNkZWZpbmUgTlVNUkVHUwkJCTY0CisKKyNkZWZpbmUgR0RCX0ZSX0QwCQkoMCAqIDQpCisjZGVmaW5lIEdEQl9GUl9EMQkJKDEgKiA0KQorI2RlZmluZSBHREJfRlJfRDIJCSgyICogNCkKKyNkZWZpbmUgR0RCX0ZSX0QzCQkoMyAqIDQpCisjZGVmaW5lIEdEQl9GUl9BMAkJKDQgKiA0KQorI2RlZmluZSBHREJfRlJfQTEJCSg1ICogNCkKKyNkZWZpbmUgR0RCX0ZSX0EyCQkoNiAqIDQpCisjZGVmaW5lIEdEQl9GUl9BMwkJKDcgKiA0KQorCisjZGVmaW5lIEdEQl9GUl9TUAkJKDggKiA0KQorI2RlZmluZSBHREJfRlJfUEMJCSg5ICogNCkKKyNkZWZpbmUgR0RCX0ZSX01EUgkJKDEwICogNCkKKyNkZWZpbmUgR0RCX0ZSX0VQU1cJCSgxMSAqIDQpCisjZGVmaW5lIEdEQl9GUl9MSVIJCSgxMiAqIDQpCisjZGVmaW5lIEdEQl9GUl9MQVIJCSgxMyAqIDQpCisjZGVmaW5lIEdEQl9GUl9NRFJRCQkoMTQgKiA0KQorCisjZGVmaW5lIEdEQl9GUl9FMAkJKDE1ICogNCkKKyNkZWZpbmUgR0RCX0ZSX0UxCQkoMTYgKiA0KQorI2RlZmluZSBHREJfRlJfRTIJCSgxNyAqIDQpCisjZGVmaW5lIEdEQl9GUl9FMwkJKDE4ICogNCkKKyNkZWZpbmUgR0RCX0ZSX0U0CQkoMTkgKiA0KQorI2RlZmluZSBHREJfRlJfRTUJCSgyMCAqIDQpCisjZGVmaW5lIEdEQl9GUl9FNgkJKDIxICogNCkKKyNkZWZpbmUgR0RCX0ZSX0U3CQkoMjIgKiA0KQorCisjZGVmaW5lIEdEQl9GUl9TU1AJCSgyMyAqIDQpCisjZGVmaW5lIEdEQl9GUl9NU1AJCSgyNCAqIDQpCisjZGVmaW5lIEdEQl9GUl9VU1AJCSgyNSAqIDQpCisjZGVmaW5lIEdEQl9GUl9NQ1JICQkoMjYgKiA0KQorI2RlZmluZSBHREJfRlJfTUNSTAkJKDI3ICogNCkKKyNkZWZpbmUgR0RCX0ZSX01DVkYJCSgyOCAqIDQpCisKKyNkZWZpbmUgR0RCX0ZSX0ZQQ1IJCSgyOSAqIDQpCisjZGVmaW5lIEdEQl9GUl9EVU1NWTAJCSgzMCAqIDQpCisjZGVmaW5lIEdEQl9GUl9EVU1NWTEJCSgzMSAqIDQpCisKKyNkZWZpbmUgR0RCX0ZSX0ZTMAkJKDMyICogNCkKKworI2RlZmluZSBHREJfRlJfU0laRQkJKE5VTVJFR1MgKiA0KQorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisvKgorICogVGhpcyBpcyB0aGUgc2FtZSBhcyBhYm92ZSwgYnV0IGZvciB0aGUgaGlnaC1sZXZlbAorICogcGFydCBvZiB0aGUgR0RCIHN0dWIuCisgKi8KKworc3RydWN0IGdkYl9yZWdzIHsKKwkvKiBzYXZlZCBtYWluIHByb2Nlc3NvciByZWdpc3RlcnMgKi8KKwl1MzIJZDAsIGQxLCBkMiwgZDMsIGEwLCBhMSwgYTIsIGEzOworCXUzMglzcCwgcGMsIG1kciwgZXBzdywgbGlyLCBsYXIsIG1kcnE7CisJdTMyCWUwLCBlMSwgZTIsIGUzLCBlNCwgZTUsIGU2LCBlNzsKKwl1MzIJc3NwLCBtc3AsIHVzcCwgbWNyaCwgbWNybCwgbWN2ZjsKKworCS8qIHNhdmVkIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyAqLworCXUzMglmcGNyLCBfZHVtbXkwLCBfZHVtbXkxOworCXUzMglmczAsICBmczEsICBmczIsICBmczMsICBmczQsICBmczUsICBmczYsICBmczc7CisJdTMyCWZzOCwgIGZzOSwgIGZzMTAsIGZzMTEsIGZzMTIsIGZzMTMsIGZzMTQsIGZzMTU7CisJdTMyCWZzMTYsIGZzMTcsIGZzMTgsIGZzMTksIGZzMjAsIGZzMjEsIGZzMjIsIGZzMjM7CisJdTMyCWZzMjQsIGZzMjUsIGZzMjYsIGZzMjcsIGZzMjgsIGZzMjksIGZzMzAsIGZzMzE7Cit9OworCisvKgorICogUHJvdG90eXBlcworICovCitleHRlcm4gdm9pZCBzaG93X3JlZ2lzdGVyc19vbmx5KHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBnZGJzdHViX2luaXQodm9pZCk7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIGdkYnN0dWJfZXhpdChpbnQgc3RhdHVzKTsKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgZ2Ric3R1Yl9pb19pbml0KHZvaWQpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBnZGJzdHViX2lvX3NldF9iYXVkKHVuc2lnbmVkIGJhdWQpOworZXh0ZXJuIGFzbWxpbmthZ2UgaW50ICBnZGJzdHViX2lvX3J4X2NoYXIodW5zaWduZWQgY2hhciAqX2NoLCBpbnQgbm9uYmxvY2spOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBnZGJzdHViX2lvX3R4X2NoYXIodW5zaWduZWQgY2hhciBjaCk7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIGdkYnN0dWJfaW9fdHhfZmx1c2godm9pZCk7CisKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgZ2Ric3R1Yl9pb19yeF9oYW5kbGVyKHZvaWQpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBnZGJzdHViX3J4X2lycShzdHJ1Y3QgcHRfcmVncyAqLCBlbnVtIGV4Y2VwdGlvbl9jb2RlKTsKK2V4dGVybiBhc21saW5rYWdlIGludCAgZ2Ric3R1Yl9pbnRlcmNlcHQoc3RydWN0IHB0X3JlZ3MgKiwgZW51bSBleGNlcHRpb25fY29kZSk7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIGdkYnN0dWJfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICosIGVudW0gZXhjZXB0aW9uX2NvZGUpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBfX2dkYnN0dWJfYnVnX3RyYXAodm9pZCk7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIF9fZ2Ric3R1Yl9wYXVzZSh2b2lkKTsKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgc3RhcnRfa2VybmVsKHZvaWQpOworCisjaWZuZGVmIENPTkZJR19NTjEwMzAwX0NBQ0hFX0RJU0FCTEVECitleHRlcm4gYXNtbGlua2FnZSB2b2lkIGdkYnN0dWJfcHVyZ2VfY2FjaGUodm9pZCk7CisjZWxzZQorI2RlZmluZSBnZGJzdHViX3B1cmdlX2NhY2hlKCkJZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworLyogVXNlZCB0byBwcmV2ZW50IGNyYXNoZXMgaW4gbWVtb3J5IGFjY2VzcyAqLworZXh0ZXJuIGFzbWxpbmthZ2UgaW50ICBnZGJzdHViX3JlYWRfYnl0ZShjb25zdCB1OCAqLCB1OCAqKTsKK2V4dGVybiBhc21saW5rYWdlIGludCAgZ2Ric3R1Yl9yZWFkX3dvcmQoY29uc3QgdTggKiwgdTggKik7CitleHRlcm4gYXNtbGlua2FnZSBpbnQgIGdkYnN0dWJfcmVhZF9kd29yZChjb25zdCB1OCAqLCB1OCAqKTsKK2V4dGVybiBhc21saW5rYWdlIGludCAgZ2Ric3R1Yl93cml0ZV9ieXRlKHUzMiwgdTggKik7CitleHRlcm4gYXNtbGlua2FnZSBpbnQgIGdkYnN0dWJfd3JpdGVfd29yZCh1MzIsIHU4ICopOworZXh0ZXJuIGFzbWxpbmthZ2UgaW50ICBnZGJzdHViX3dyaXRlX2R3b3JkKHUzMiwgdTggKik7CisKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgZ2Ric3R1Yl9yZWFkX2J5dGVfZ3VhcmQodm9pZCk7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIGdkYnN0dWJfcmVhZF9ieXRlX2NvbnQodm9pZCk7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIGdkYnN0dWJfcmVhZF93b3JkX2d1YXJkKHZvaWQpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBnZGJzdHViX3JlYWRfd29yZF9jb250KHZvaWQpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBnZGJzdHViX3JlYWRfZHdvcmRfZ3VhcmQodm9pZCk7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIGdkYnN0dWJfcmVhZF9kd29yZF9jb250KHZvaWQpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBnZGJzdHViX3dyaXRlX2J5dGVfZ3VhcmQodm9pZCk7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIGdkYnN0dWJfd3JpdGVfYnl0ZV9jb250KHZvaWQpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBnZGJzdHViX3dyaXRlX3dvcmRfZ3VhcmQodm9pZCk7CitleHRlcm4gYXNtbGlua2FnZSB2b2lkIGdkYnN0dWJfd3JpdGVfd29yZF9jb250KHZvaWQpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBnZGJzdHViX3dyaXRlX2R3b3JkX2d1YXJkKHZvaWQpOworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBnZGJzdHViX3dyaXRlX2R3b3JkX2NvbnQodm9pZCk7CisKK2V4dGVybiB1OAlnZGJzdHViX3J4X2J1ZmZlcltQQUdFX1NJWkVdOworZXh0ZXJuIHUzMglnZGJzdHViX3J4X2lucDsKK2V4dGVybiB1MzIJZ2Ric3R1Yl9yeF9vdXRwOworZXh0ZXJuIHU4CWdkYnN0dWJfcnhfb3ZlcmZsb3c7CitleHRlcm4gdTgJZ2Ric3R1Yl9idXN5OworZXh0ZXJuIHU4CWdkYnN0dWJfcnhfdW5nZXQ7CisKKyNpZmRlZiBDT05GSUdfR0RCU1RVQl9ERUJVR0dJTkcKK2V4dGVybiB2b2lkIGdkYnN0dWJfcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorCV9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDEsIDIpKSk7CisjZWxzZQorc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpCit2b2lkIGdkYnN0dWJfcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfR0RCU1RVQl9ERUJVR19FTlRSWQorI2RlZmluZSBnZGJzdHViX2VudHJ5KEZNVCwgLi4uKSBnZGJzdHViX3ByaW50ayhGTVQsICMjX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBnZGJzdHViX2VudHJ5KEZNVCwgLi4uKSAoeyAwOyB9KQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfR0RCU1RVQl9ERUJVR19QUk9UT0NPTAorI2RlZmluZSBnZGJzdHViX3Byb3RvKEZNVCwgLi4uKSBnZGJzdHViX3ByaW50ayhGTVQsICMjX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBnZGJzdHViX3Byb3RvKEZNVCwgLi4uKSAoeyAwOyB9KQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfR0RCU1RVQl9ERUJVR19JTworI2RlZmluZSBnZGJzdHViX2lvKEZNVCwgLi4uKSBnZGJzdHViX3ByaW50ayhGTVQsICMjX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBnZGJzdHViX2lvKEZNVCwgLi4uKSAoeyAwOyB9KQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfR0RCU1RVQl9ERUJVR19CUkVBS1BPSU5UCisjZGVmaW5lIGdkYnN0dWJfYmtwdChGTVQsIC4uLikgZ2Ric3R1Yl9wcmludGsoRk1ULCAjI19fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgZ2Ric3R1Yl9ia3B0KEZNVCwgLi4uKSAoeyAwOyB9KQorI2VuZGlmCisKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisjZW5kaWYgLyogX0FTTV9HREJfU1RVQl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL2hhcmRpcnEuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvaGFyZGlycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZDk1MDEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2hhcmRpcnEuaApAQCAtMCwwICsxLDQ4IEBACisvKiBNTjEwMzAwIEhhcmR3YXJlIElSUSBzdGF0aXN0aWNzIGFuZCBtYW5hZ2VtZW50CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1hdHN1c2hpdGEgRWxlY3RyaWMgSW5kdXN0cmlhbCBDby4sIEx0ZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBNb2RpZmllZCBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9IQVJESVJRX0gKKyNkZWZpbmUgX0FTTV9IQVJESVJRX0gKKworI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vZXhjZXB0aW9ucy5oPgorCisvKiBhc3NlbWJseSBjb2RlIGluIHNvZnRpcnEuaCBpcyBzZW5zaXRpdmUgdG8gdGhlIG9mZnNldHMgb2YgdGhlc2UgZmllbGRzICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50CV9fc29mdGlycV9wZW5kaW5nOworCXVuc2lnbmVkIGxvbmcJaWRsZV90aW1lc3RhbXA7CisJdW5zaWduZWQgaW50CV9fbm1pX2NvdW50OwkvKiBhcmNoIGRlcGVuZGVudCAqLworCXVuc2lnbmVkIGludAlfX2lycV9jb3VudDsJLyogYXJjaCBkZXBlbmRlbnQgKi8KK30gX19fX2NhY2hlbGluZV9hbGlnbmVkIGlycV9jcHVzdGF0X3Q7CisKKyNpbmNsdWRlIDxsaW51eC9pcnFfY3B1c3RhdC5oPgkvKiBTdGFuZGFyZCBtYXBwaW5ncyBmb3IgaXJxX2NwdXN0YXRfdCBhYm92ZSAqLworCitleHRlcm4gdm9pZCBhY2tfYmFkX2lycShpbnQgaXJxKTsKKworLyoKKyAqIG1hbmlwdWxhdGUgc3R1YnMgaW4gdGhlIE1OMTAzMDAgQ1BVIFRyYXAvSW50ZXJydXB0IFZlY3RvciB0YWJsZQorICogLSB0aGVzZSBzaG91bGQganVtcCB0byBfX2NvbW1vbl9leGNlcHRpb24gaW4gZW50cnkuUyB1bmxlc3MgdGhlcmUncyBhIGdvb2QKKyAqICAgcmVhc29uIHRvIGRvIG90aGVyd2lzZSAoc2VlIHRyYXBfcHJlaW5pdCgpIGluIHRyYXBzLmMpCisgKi8KK3R5cGVkZWYgdm9pZCAoKmludHJfc3R1Yl9mbngpKHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJICAgICAgZW51bSBleGNlcHRpb25fY29kZSBpbnRjb2RlKTsKKworLyoKKyAqIG1hbmlwdWxhdGUgcG9pbnRlcnMgaW4gdGhlIEV4Y2VwdGlvbiB0YWJsZSAoc2VlIGVudHJ5LlMpCisgKiAtIHRoZXNlIGFyZSBpbmRleGVkIGJ5IGRlY29kaW5nIHRoZSBsb3dlciAyNCBiaXRzIG9mIHRoZSBUQlIgcmVnaXN0ZXIKKyAqIC0gbm90ZSB0aGF0IHRoZSBNTjEwM0UwMTAgZG9lc24ndCBhbHdheXMgdHJhcCB0aHJvdWdoIHRoZSBjb3JyZWN0IHZlY3RvciwKKyAqICAgYnV0IGRvZXMgYWx3YXlzIHNldCB0aGUgVEJSIGNvcnJlY3RseQorICovCitleHRlcm4gYXNtbGlua2FnZSB2b2lkIHNldF9leGNwX3ZlY3RvcihlbnVtIGV4Y2VwdGlvbl9jb2RlIGNvZGUsCisJCQkJICAgICAgIGludHJfc3R1Yl9mbnggaGFuZGxlcik7CisKKyNlbmRpZiAvKiBfQVNNX0hBUkRJUlFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9oaWdobWVtLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2hpZ2htZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODNjMGM0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9oaWdobWVtLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qIE1OMTAzMDAgVmlydHVhbCBrZXJuZWwgbWVtb3J5IG1hcHBpbmdzIGZvciBoaWdoIG1lbW9yeQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKiAtIERlcml2ZWQgZnJvbSBpbmNsdWRlL2FzbS1pMzg2L2hpZ2htZW0uaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9ISUdITUVNX0gKKyNkZWZpbmUgX0FTTV9ISUdITUVNX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20va21hcF90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisKKy8qIHVuZGVmIGZvciBwcm9kdWN0aW9uICovCisjdW5kZWYgSElHSE1FTV9ERUJVRworCisvKiBkZWNsYXJhdGlvbnMgZm9yIGhpZ2htZW0uYyAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaGlnaHN0YXJ0X3BmbiwgaGlnaGVuZF9wZm47CisKK2V4dGVybiBwdGVfdCAqa21hcF9wdGU7CitleHRlcm4gcGdwcm90X3Qga21hcF9wcm90OworZXh0ZXJuIHB0ZV90ICpwa21hcF9wYWdlX3RhYmxlOworCitleHRlcm4gdm9pZCBfX2luaXQga21hcF9pbml0KHZvaWQpOworCisvKgorICogUmlnaHQgbm93IHdlIGluaXRpYWxpemUgb25seSBhIHNpbmdsZSBwdGUgdGFibGUuIEl0IGNhbiBiZSBleHRlbmRlZAorICogZWFzaWx5LCBzdWJzZXF1ZW50IHB0ZSB0YWJsZXMgaGF2ZSB0byBiZSBhbGxvY2F0ZWQgaW4gb25lIHBoeXNpY2FsCisgKiBjaHVuayBvZiBSQU0uCisgKi8KKyNkZWZpbmUgUEtNQVBfQkFTRQkweGZlMDAwMDAwVUwKKyNkZWZpbmUgTEFTVF9QS01BUAkxMDI0CisjZGVmaW5lIExBU1RfUEtNQVBfTUFTSyAoTEFTVF9QS01BUCAtIDEpCisjZGVmaW5lIFBLTUFQX05SKHZpcnQpICAoKHZpcnQgLSBQS01BUF9CQVNFKSA+PiBQQUdFX1NISUZUKQorI2RlZmluZSBQS01BUF9BRERSKG5yKSAgKFBLTUFQX0JBU0UgKyAoKG5yKSA8PCBQQUdFX1NISUZUKSkKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19mYXN0Y2FsbCBrbWFwX2hpZ2goc3RydWN0IHBhZ2UgKnBhZ2UpOworZXh0ZXJuIHZvaWQgX19mYXN0Y2FsbCBrdW5tYXBfaGlnaChzdHJ1Y3QgcGFnZSAqcGFnZSk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBrbWFwKHN0cnVjdCBwYWdlICpwYWdlKQoreworCWlmIChpbl9pbnRlcnJ1cHQoKSkKKwkJQlVHKCk7CisJaWYgKHBhZ2UgPCBoaWdobWVtX3N0YXJ0X3BhZ2UpCisJCXJldHVybiBwYWdlX2FkZHJlc3MocGFnZSk7CisJcmV0dXJuIGttYXBfaGlnaChwYWdlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGt1bm1hcChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlpZiAoaW5faW50ZXJydXB0KCkpCisJCUJVRygpOworCWlmIChwYWdlIDwgaGlnaG1lbV9zdGFydF9wYWdlKQorCQlyZXR1cm47CisJa3VubWFwX2hpZ2gocGFnZSk7Cit9CisKKy8qCisgKiBUaGUgdXNlIG9mIGttYXBfYXRvbWljL2t1bm1hcF9hdG9taWMgaXMgZGlzY291cmFnZWQgLSBrbWFwL2t1bm1hcAorICogZ2l2ZXMgYSBtb3JlIGdlbmVyaWMgKGFuZCBjYWNoaW5nKSBpbnRlcmZhY2UuIEJ1dCBrbWFwX2F0b21pYyBjYW4KKyAqIGJlIHVzZWQgaW4gSVJRIGNvbnRleHRzLCBzbyBpbiBzb21lICh2ZXJ5IGxpbWl0ZWQpIGNhc2VzIHdlIG5lZWQKKyAqIGl0LgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcga21hcF9hdG9taWMoc3RydWN0IHBhZ2UgKnBhZ2UsIGVudW0ga21fdHlwZSB0eXBlKQoreworCWVudW0gZml4ZWRfYWRkcmVzc2VzIGlkeDsKKwl1bnNpZ25lZCBsb25nIHZhZGRyOworCisJaWYgKHBhZ2UgPCBoaWdobWVtX3N0YXJ0X3BhZ2UpCisJCXJldHVybiBwYWdlX2FkZHJlc3MocGFnZSk7CisKKwlpZHggPSB0eXBlICsgS01fVFlQRV9OUiAqIHNtcF9wcm9jZXNzb3JfaWQoKTsKKwl2YWRkciA9IF9fZml4X3RvX3ZpcnQoRklYX0tNQVBfQkVHSU4gKyBpZHgpOworI2lmIEhJR0hNRU1fREVCVUcKKwlpZiAoIXB0ZV9ub25lKCooa21hcF9wdGUgLSBpZHgpKSkKKwkJQlVHKCk7CisjZW5kaWYKKwlzZXRfcHRlKGttYXBfcHRlIC0gaWR4LCBta19wdGUocGFnZSwga21hcF9wcm90KSk7CisJX19mbHVzaF90bGJfb25lKHZhZGRyKTsKKworCXJldHVybiB2YWRkcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGt1bm1hcF9hdG9taWModW5zaWduZWQgbG9uZyB2YWRkciwgZW51bSBrbV90eXBlIHR5cGUpCit7CisjaWYgSElHSE1FTV9ERUJVRworCWVudW0gZml4ZWRfYWRkcmVzc2VzIGlkeCA9IHR5cGUgKyBLTV9UWVBFX05SICogc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJaWYgKHZhZGRyIDwgRklYQUREUl9TVEFSVCkgLyogRklYTUUgKi8KKwkJcmV0dXJuOworCisJaWYgKHZhZGRyICE9IF9fZml4X3RvX3ZpcnQoRklYX0tNQVBfQkVHSU4gKyBpZHgpKQorCQlCVUcoKTsKKworCS8qCisJICogZm9yY2Ugb3RoZXIgbWFwcGluZ3MgdG8gT29wcyBpZiB0aGV5J2xsIHRyeSB0byBhY2Nlc3MKKwkgKiB0aGlzIHB0ZSB3aXRob3V0IGZpcnN0IHJlbWFwIGl0CisJICovCisJcHRlX2NsZWFyKGttYXBfcHRlIC0gaWR4KTsKKwlfX2ZsdXNoX3RsYl9vbmUodmFkZHIpOworI2VuZGlmCit9CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfQVNNX0hJR0hNRU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9od19pcnEuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvaHdfaXJxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2MTk5MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvaHdfaXJxLmgKQEAgLTAsMCArMSwxNCBAQAorLyogTU4xMDMwMCBIYXJkd2FyZSBpbnRlcnJ1cHQgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9IV19JUlFfSAorI2RlZmluZSBfQVNNX0hXX0lSUV9ICisKKyNlbmRpZiAvKiBfQVNNX0hXX0lSUV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL2lkZS5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9pZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzIzNTEyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9pZGUuaApAQCAtMCwwICsxLDQzIEBACisvKiBNTjEwMzAwIEFyY2gtc3BlY2lmaWMgSURFIGNvZGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICogLSBEZXJpdmVkIGZyb20gaW5jbHVkZS9hc20taTM4Ni9pZGUuaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfQVNNX0lERV9ICisjZGVmaW5lIF9BU01fSURFX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGFzbS9pbnRjdGwtcmVncy5oPgorCisjdW5kZWYgU1VQUE9SVF9TTE9XX0RBVEFfUE9SVFMKKyNkZWZpbmUgU1VQUE9SVF9TTE9XX0RBVEFfUE9SVFMgMAorCisjdW5kZWYgU1VQUE9SVF9WTEJfU1lOQworI2RlZmluZSBTVVBQT1JUX1ZMQl9TWU5DIDAKKworI2lmbmRlZiBNQVhfSFdJRlMKKyNkZWZpbmUgTUFYX0hXSUZTIDgKKyNlbmRpZgorCisvKgorICogc29tZSBiaXRzIG5lZWRlZCBmb3IgcGFydHMgb2YgdGhlIElERSBzdWJzeXN0ZW0gdG8gY29tcGlsZQorICovCisjZGVmaW5lIF9faWRlX21tX2luc3cocG9ydCwgYWRkciwgbikgXAorCWluc3coKHVuc2lnbmVkIGxvbmcpIChwb3J0KSwgKGFkZHIpLCAobikpCisjZGVmaW5lIF9faWRlX21tX2luc2wocG9ydCwgYWRkciwgbikgXAorCWluc2woKHVuc2lnbmVkIGxvbmcpIChwb3J0KSwgKGFkZHIpLCAobikpCisjZGVmaW5lIF9faWRlX21tX291dHN3KHBvcnQsIGFkZHIsIG4pIFwKKwlvdXRzdygodW5zaWduZWQgbG9uZykgKHBvcnQpLCAoYWRkciksIChuKSkKKyNkZWZpbmUgX19pZGVfbW1fb3V0c2wocG9ydCwgYWRkciwgbikgXAorCW91dHNsKCh1bnNpZ25lZCBsb25nKSAocG9ydCksIChhZGRyKSwgKG4pKQorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9BU01fSURFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvaW50Y3RsLXJlZ3MuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvaW50Y3RsLXJlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTU0NGM3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9pbnRjdGwtcmVncy5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qIE1OMTAzMDAgT24tYm9hcmQgaW50ZXJydXB0IGNvbnRyb2xsZXIgcmVnaXN0ZXJzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fSU5UQ1RMX1JFR1NfSAorI2RlZmluZSBfQVNNX0lOVENUTF9SRUdTX0gKKworI2luY2x1ZGUgPGFzbS9jcHUtcmVncy5oPgorCisjaWZkZWYgX19LRVJORUxfXworCisvKiBpbnRlcnJ1cHQgY29udHJvbGxlciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgR3hJQ1IoWCkJCV9fU1lTUkVHKDB4ZDQwMDAwMDAgKyAoWCkgKiA0LCB1MTYpCS8qIGdyb3VwIGlycSBjdHJsIHJlZ3MgKi8KKworI2RlZmluZSBJQUdSCQkJX19TWVNSRUcoMHhkNDAwMDEwMCwgdTE2KQkvKiBpbnRyIGFjY2VwdGFuY2UgZ3JvdXAgcmVnICovCisjZGVmaW5lIElBR1JfR04JCQkweDAwZmMJCS8qIGdyb3VwIG51bWJlciByZWdpc3RlcgorCQkJCQkJICogKGRvY3VtZW50YXRpb24gX2hhc18gdG8gYmUgd3JvbmcpCisJCQkJCQkgKi8KKworI2RlZmluZSBFWFRNRAkJCV9fU1lTUkVHKDB4ZDQwMDAyMDAsIHUxNikJLyogZXh0ZXJuYWwgcGluIGludHIgc3BlYyByZWcgKi8KKyNkZWZpbmUgR0VUX1hJUlFfVFJJR0dFUihYKSAoKEVYVE1EID4+ICgoWCkgKiAyKSkgJiAzKQorCisjZGVmaW5lIFNFVF9YSVJRX1RSSUdHRVIoWCxZKQkJCVwKK2RvIHsJCQkJCQlcCisJdTE2IHggPSBFWFRNRDsJCQkJXAorCXggJj0gfigzIDw8ICgoWCkgKiAyKSk7CQkJXAorCXggfD0gKChZKSAmIDMpIDw8ICgoWCkgKiAyKTsJCVwKKwlFWFRNRCA9IHg7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgWElSUV9UUklHR0VSX0xPV0xFVkVMCTAKKyNkZWZpbmUgWElSUV9UUklHR0VSX0hJTEVWRUwJMQorI2RlZmluZSBYSVJRX1RSSUdHRVJfTkVHRURHRQkyCisjZGVmaW5lIFhJUlFfVFJJR0dFUl9QT1NFREdFCTMKKworLyogbm9uLW1hc2thYmxlIGludGVycnVwdCBjb250cm9sICovCisjZGVmaW5lIE5NSUlSUQkJCTAKKyNkZWZpbmUgTk1JQ1IJCQlHeElDUihOTUlJUlEpCS8qIE5NSSBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIE5NSUNSX05NSUYJCTB4MDAwMQkJLyogTk1JIHBpbiBpbnRlcnJ1cHQgZmxhZyAqLworI2RlZmluZSBOTUlDUl9XRElGCQkweDAwMDIJCS8qIHdhdGNoZG9nIHRpbWVyIG92ZXJmbG93IGZsYWcgKi8KKyNkZWZpbmUgTk1JQ1JfQUJVU0VSUgkJMHgwMDA4CQkvKiBhc3luYyBidXMgZXJyb3IgZmxhZyAqLworCisvKiBtYXNrYWJsZSBpbnRlcnJ1cHQgY29udHJvbCAqLworI2RlZmluZSBHeElDUl9ERVRFQ1QJCTB4MDAwMQkJLyogaW50ZXJydXB0IGRldGVjdCBmbGFnICovCisjZGVmaW5lIEd4SUNSX1JFUVVFU1QJCTB4MDAxMAkJLyogaW50ZXJydXB0IHJlcXVlc3QgZmxhZyAqLworI2RlZmluZSBHeElDUl9FTkFCTEUJCTB4MDEwMAkJLyogaW50ZXJydXB0IGVuYWJsZSBmbGFnICovCisjZGVmaW5lIEd4SUNSX0xFVkVMCQkweDcwMDAJCS8qIGludGVycnVwdCBwcmlvcml0eSBsZXZlbCAqLworI2RlZmluZSBHeElDUl9MRVZFTF8wCQkweDAwMDAJCS8qIC0gbGV2ZWwgMCAqLworI2RlZmluZSBHeElDUl9MRVZFTF8xCQkweDEwMDAJCS8qIC0gbGV2ZWwgMSAqLworI2RlZmluZSBHeElDUl9MRVZFTF8yCQkweDIwMDAJCS8qIC0gbGV2ZWwgMiAqLworI2RlZmluZSBHeElDUl9MRVZFTF8zCQkweDMwMDAJCS8qIC0gbGV2ZWwgMyAqLworI2RlZmluZSBHeElDUl9MRVZFTF80CQkweDQwMDAJCS8qIC0gbGV2ZWwgNCAqLworI2RlZmluZSBHeElDUl9MRVZFTF81CQkweDUwMDAJCS8qIC0gbGV2ZWwgNSAqLworI2RlZmluZSBHeElDUl9MRVZFTF82CQkweDYwMDAJCS8qIC0gbGV2ZWwgNiAqLworI2RlZmluZSBHeElDUl9MRVZFTF9TSElGVAkxMgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworZXh0ZXJuIHZvaWQgc2V0X2ludHJfbGV2ZWwoaW50IGlycSwgdTE2IGxldmVsKTsKK2V4dGVybiB2b2lkIHNldF9pbnRyX3Bvc3RhY2thYmxlKGludCBpcnEpOworI2VuZGlmCisKKy8qIGV4dGVybmFsIGludGVycnVwdHMgKi8KKyNkZWZpbmUgWElSUXhJQ1IoWCkJCUd4SUNSKChYKSkJLyogZXh0ZXJuYWwgaW50ZXJydXB0IGNvbnRyb2wgcmVncyAqLworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgLyogX0FTTV9JTlRDVExfUkVHU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL2lvLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhiNmRjOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvaW8uaApAQCAtMCwwICsxLDI5OSBAQAorLyogTU4xMDMwMCBJL08gcG9ydCBlbXVsYXRpb24gYW5kIG1lbW9yeS1tYXBwZWQgSS9PCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fSU9fSAorI2RlZmluZSBfQVNNX0lPX0gKKworI2luY2x1ZGUgPGFzbS9wYWdlLmg+IC8qIEkvTyBpcyBhbGwgZG9uZSB0aHJvdWdoIG1lbW9yeSBhY2Nlc3NlcyAqLworI2luY2x1ZGUgPGFzbS9jcHUtcmVncy5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisKKyNkZWZpbmUgbW1pb3diKCkgZG8ge30gd2hpbGUgKDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiByZWFkWC93cml0ZVgoKSBhcmUgdXNlZCB0byBhY2Nlc3MgbWVtb3J5IG1hcHBlZCBkZXZpY2VzLiBPbiBzb21lCisgKiBhcmNoaXRlY3R1cmVzIHRoZSBtZW1vcnkgbWFwcGVkIElPIHN0dWZmIG5lZWRzIHRvIGJlIGFjY2Vzc2VkCisgKiBkaWZmZXJlbnRseS4gT24gdGhlIHg4NiBhcmNoaXRlY3R1cmUsIHdlIGp1c3QgcmVhZC93cml0ZSB0aGUKKyAqIG1lbW9yeSBsb2NhdGlvbiBkaXJlY3RseS4KKyAqLworc3RhdGljIGlubGluZSB1OCByZWFkYihjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJcmV0dXJuICooY29uc3Qgdm9sYXRpbGUgdTggKikgYWRkcjsKK30KKworc3RhdGljIGlubGluZSB1MTYgcmVhZHcoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQoreworCXJldHVybiAqKGNvbnN0IHZvbGF0aWxlIHUxNiAqKSBhZGRyOworfQorCitzdGF0aWMgaW5saW5lIHUzMiByZWFkbChjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJcmV0dXJuICooY29uc3Qgdm9sYXRpbGUgdTMyICopIGFkZHI7Cit9CisKKyNkZWZpbmUgX19yYXdfcmVhZGIgcmVhZGIKKyNkZWZpbmUgX19yYXdfcmVhZHcgcmVhZHcKKyNkZWZpbmUgX19yYXdfcmVhZGwgcmVhZGwKKworI2RlZmluZSByZWFkYl9yZWxheGVkIHJlYWRiCisjZGVmaW5lIHJlYWR3X3JlbGF4ZWQgcmVhZHcKKyNkZWZpbmUgcmVhZGxfcmVsYXhlZCByZWFkbAorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGViKHU4IGIsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwkqKHZvbGF0aWxlIHU4ICopIGFkZHIgPSBiOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGV3KHUxNiBiLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJKih2b2xhdGlsZSB1MTYgKikgYWRkciA9IGI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZWwodTMyIGIsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwkqKHZvbGF0aWxlIHUzMiAqKSBhZGRyID0gYjsKK30KKworI2RlZmluZSBfX3Jhd193cml0ZWIgd3JpdGViCisjZGVmaW5lIF9fcmF3X3dyaXRldyB3cml0ZXcKKyNkZWZpbmUgX19yYXdfd3JpdGVsIHdyaXRlbAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogdHJhZGl0aW9uYWwgaW5wdXQvb3V0cHV0IGZ1bmN0aW9ucworICovCitzdGF0aWMgaW5saW5lIHU4IGluYl9sb2NhbCh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJcmV0dXJuIHJlYWRiKCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKikgYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvdXRiX2xvY2FsKHU4IGIsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlyZXR1cm4gd3JpdGViKGIsICh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKikgYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggaW5iKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlyZXR1cm4gcmVhZGIoKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqKSBhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB1MTYgaW53KHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlyZXR1cm4gcmVhZHcoKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqKSBhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgaW5sKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlyZXR1cm4gcmVhZGwoKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqKSBhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG91dGIodTggYiwgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCXJldHVybiB3cml0ZWIoYiwgKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqKSBhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG91dHcodTE2IGIsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlyZXR1cm4gd3JpdGV3KGIsICh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKikgYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvdXRsKHUzMiBiLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJcmV0dXJuIHdyaXRlbChiLCAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICopIGFkZHIpOworfQorCisjZGVmaW5lIGluYl9wKGFkZHIpCWluYihhZGRyKQorI2RlZmluZSBpbndfcChhZGRyKQlpbncoYWRkcikKKyNkZWZpbmUgaW5sX3AoYWRkcikJaW5sKGFkZHIpCisjZGVmaW5lIG91dGJfcCh4LCBhZGRyKQlvdXRiKCh4KSwgKGFkZHIpKQorI2RlZmluZSBvdXR3X3AoeCwgYWRkcikJb3V0dygoeCksIChhZGRyKSkKKyNkZWZpbmUgb3V0bF9wKHgsIGFkZHIpCW91dGwoKHgpLCAoYWRkcikpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnNiKHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqYnVmZmVyLCBpbnQgY291bnQpCit7CisJaWYgKGNvdW50KSB7CisJCXU4ICpidWYgPSBidWZmZXI7CisJCWRvIHsKKwkJCXU4IHggPSBpbmIoYWRkcik7CisJCQkqYnVmKysgPSB4OworCQl9IHdoaWxlICgtLWNvdW50KTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnN3KHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqYnVmZmVyLCBpbnQgY291bnQpCit7CisJaWYgKGNvdW50KSB7CisJCXUxNiAqYnVmID0gYnVmZmVyOworCQlkbyB7CisJCQl1MTYgeCA9IGludyhhZGRyKTsKKwkJCSpidWYrKyA9IHg7CisJCX0gd2hpbGUgKC0tY291bnQpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGluc2wodW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpidWZmZXIsIGludCBjb3VudCkKK3sKKwlpZiAoY291bnQpIHsKKwkJdTMyICpidWYgPSBidWZmZXI7CisJCWRvIHsKKwkJCXUzMiB4ID0gaW5sKGFkZHIpOworCQkJKmJ1ZisrID0geDsKKwkJfSB3aGlsZSAoLS1jb3VudCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb3V0c2IodW5zaWduZWQgbG9uZyBhZGRyLCBjb25zdCB2b2lkICpidWZmZXIsIGludCBjb3VudCkKK3sKKwlpZiAoY291bnQpIHsKKwkJY29uc3QgdTggKmJ1ZiA9IGJ1ZmZlcjsKKwkJZG8geworCQkJb3V0YigqYnVmKyssIGFkZHIpOworCQl9IHdoaWxlICgtLWNvdW50KTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvdXRzdyh1bnNpZ25lZCBsb25nIGFkZHIsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgaW50IGNvdW50KQoreworCWlmIChjb3VudCkgeworCQljb25zdCB1MTYgKmJ1ZiA9IGJ1ZmZlcjsKKwkJZG8geworCQkJb3V0dygqYnVmKyssIGFkZHIpOworCQl9IHdoaWxlICgtLWNvdW50KTsKKwl9Cit9CisKK2V4dGVybiB2b2lkIF9fb3V0c2wodW5zaWduZWQgbG9uZyBhZGRyLCBjb25zdCB2b2lkICpidWZmZXIsIGludCBjb3VudCk7CitzdGF0aWMgaW5saW5lIHZvaWQgb3V0c2wodW5zaWduZWQgbG9uZyBhZGRyLCBjb25zdCB2b2lkICpidWZmZXIsIGludCBjb3VudCkKK3sKKwlpZiAoKHVuc2lnbmVkIGxvbmcpIGJ1ZmZlciAmIDB4MykKKwkJcmV0dXJuIF9fb3V0c2woYWRkciwgYnVmZmVyLCBjb3VudCk7CisKKwlpZiAoY291bnQpIHsKKwkJY29uc3QgdTMyICpidWYgPSBidWZmZXI7CisJCWRvIHsKKwkJCW91dGwoKmJ1ZisrLCBhZGRyKTsKKwkJfSB3aGlsZSAoLS1jb3VudCk7CisJfQorfQorCisjZGVmaW5lIGlvcmVhZDgoYWRkcikJCXJlYWRiKGFkZHIpCisjZGVmaW5lIGlvcmVhZDE2KGFkZHIpCQlyZWFkdyhhZGRyKQorI2RlZmluZSBpb3JlYWQzMihhZGRyKQkJcmVhZGwoYWRkcikKKworI2RlZmluZSBpb3dyaXRlOCh2LCBhZGRyKQl3cml0ZWIoKHYpLCAoYWRkcikpCisjZGVmaW5lIGlvd3JpdGUxNih2LCBhZGRyKQl3cml0ZXcoKHYpLCAoYWRkcikpCisjZGVmaW5lIGlvd3JpdGUzMih2LCBhZGRyKQl3cml0ZWwoKHYpLCAoYWRkcikpCisKKyNkZWZpbmUgaW9yZWFkOF9yZXAocCwgZHN0LCBjb3VudCkgXAorCWluc2IoKHVuc2lnbmVkIGxvbmcpIChwKSwgKGRzdCksIChjb3VudCkpCisjZGVmaW5lIGlvcmVhZDE2X3JlcChwLCBkc3QsIGNvdW50KSBcCisJaW5zdygodW5zaWduZWQgbG9uZykgKHApLCAoZHN0KSwgKGNvdW50KSkKKyNkZWZpbmUgaW9yZWFkMzJfcmVwKHAsIGRzdCwgY291bnQpIFwKKwlpbnNsKCh1bnNpZ25lZCBsb25nKSAocCksIChkc3QpLCAoY291bnQpKQorCisjZGVmaW5lIGlvd3JpdGU4X3JlcChwLCBzcmMsIGNvdW50KSBcCisJb3V0c2IoKHVuc2lnbmVkIGxvbmcpIChwKSwgKHNyYyksIChjb3VudCkpCisjZGVmaW5lIGlvd3JpdGUxNl9yZXAocCwgc3JjLCBjb3VudCkgXAorCW91dHN3KCh1bnNpZ25lZCBsb25nKSAocCksIChzcmMpLCAoY291bnQpKQorI2RlZmluZSBpb3dyaXRlMzJfcmVwKHAsIHNyYywgY291bnQpIFwKKwlvdXRzbCgodW5zaWduZWQgbG9uZykgKHApLCAoc3JjKSwgKGNvdW50KSkKKworCisjZGVmaW5lIElPX1NQQUNFX0xJTUlUIDB4ZmZmZmZmZmYKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNkZWZpbmUgX19pb192aXJ0KHgpICgodm9pZCAqKSAoeCkpCisKKy8qIENyZWF0ZSBhIHZpcnR1YWwgbWFwcGluZyBjb29raWUgZm9yIGEgUENJIEJBUiAobWVtb3J5IG9yIElPKSAqLworc3RydWN0IHBjaV9kZXY7CitleHRlcm4gdm9pZCBfX2lvbWVtICpwY2lfaW9tYXAoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGJhciwgdW5zaWduZWQgbG9uZyBtYXgpOworc3RhdGljIGlubGluZSB2b2lkIHBjaV9pb3VubWFwKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHZvaWQgX19pb21lbSAqcCkKK3sKK30KKworLyoKKyAqIENoYW5nZSB2aXJ0dWFsIGFkZHJlc3NlcyB0byBwaHlzaWNhbCBhZGRyZXNzZXMgYW5kIHZ2LgorICogVGhlc2UgYXJlIHByZXR0eSB0cml2aWFsCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB2aXJ0X3RvX3BoeXModm9sYXRpbGUgdm9pZCAqYWRkcmVzcykKK3sKKwlyZXR1cm4gX19wYShhZGRyZXNzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpwaHlzX3RvX3ZpcnQodW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXJldHVybiBfX3ZhKGFkZHJlc3MpOworfQorCisvKgorICogQ2hhbmdlICJzdHJ1Y3QgcGFnZSIgdG8gcGh5c2ljYWwgYWRkcmVzcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICpfX2lvcmVtYXAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJcmV0dXJuICh2b2lkICopIG9mZnNldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkICppb3JlbWFwKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJcmV0dXJuICh2b2lkICopIG9mZnNldDsKK30KKworLyoKKyAqIFRoaXMgb25lIG1hcHMgaGlnaCBhZGRyZXNzIGRldmljZSBtZW1vcnkgYW5kIHR1cm5zIG9mZiBjYWNoaW5nIGZvciB0aGF0CisgKiBhcmVhLiAgaXQncyB1c2VmdWwgaWYgc29tZSBjb250cm9sIHJlZ2lzdGVycyBhcmUgaW4gc3VjaCBhbiBhcmVhIGFuZCB3cml0ZQorICogY29tYmluaW5nIG9yIHJlYWQgY2FjaGluZyBpcyBub3QgZGVzaXJhYmxlOgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKmlvcmVtYXBfbm9jYWNoZSh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXJldHVybiAodm9pZCAqKSAob2Zmc2V0IHwgMHgyMDAwMDAwMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb3VubWFwKHZvaWQgKmFkZHIpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICppb3BvcnRfbWFwKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgaW50IG5yKQoreworCXJldHVybiAodm9pZCBfX2lvbWVtICopIHBvcnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb3BvcnRfdW5tYXAodm9pZCBfX2lvbWVtICpwKQoreworfQorCisjZGVmaW5lIHhsYXRlX2Rldl9rbWVtX3B0cihwKQkoKHZvaWQgKikgKHApKQorI2RlZmluZSB4bGF0ZV9kZXZfbWVtX3B0cihwKQkoKHZvaWQgKikgKHApKQorCisvKgorICogUENJIGJ1cyBpb21lbSBhZGRyZXNzZXMgbXVzdCBiZSBpbiB0aGUgcmVnaW9uIDB4ODAwMDAwMDAtMHg5ZmZmZmZmZgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdmlydF90b19idXModm9sYXRpbGUgdm9pZCAqYWRkcmVzcykKK3sKKwlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKSBhZGRyZXNzKSAmIH4weDIwMDAwMDAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmJ1c190b192aXJ0KHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlyZXR1cm4gKHZvaWQgKikgYWRkcmVzczsKK30KKworI2RlZmluZSBwYWdlX3RvX2J1cyBwYWdlX3RvX3BoeXMKKworI2RlZmluZSBtZW1zZXRfaW8oYSwgYiwgYykJbWVtc2V0KF9faW9fdmlydChhKSwgKGIpLCAoYykpCisjZGVmaW5lIG1lbWNweV9mcm9taW8oYSwgYiwgYykJbWVtY3B5KChhKSwgX19pb192aXJ0KGIpLCAoYykpCisjZGVmaW5lIG1lbWNweV90b2lvKGEsIGIsIGMpCW1lbWNweShfX2lvX3ZpcnQoYSksIChiKSwgKGMpKQorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgLyogX0FTTV9JT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL2lvY3RsLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI3OWZlMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvaW9jdGwuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaW9jdGwuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvaW9jdGxzLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2lvY3Rscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYmZiNDUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2lvY3Rscy5oCkBAIC0wLDAgKzEsODggQEAKKyNpZm5kZWYgX0FTTV9JT0NUTFNfSAorI2RlZmluZSBfQVNNX0lPQ1RMU19ICisKKyNpbmNsdWRlIDxhc20vaW9jdGwuaD4KKworLyogMHg1NCBpcyBqdXN0IGEgbWFnaWMgbnVtYmVyIHRvIG1ha2UgdGhlc2UgcmVsYXRpdmVseSB1bmlxdWUgKCdUJykgKi8KKworI2RlZmluZSBUQ0dFVFMJCTB4NTQwMQorI2RlZmluZSBUQ1NFVFMJCTB4NTQwMgorI2RlZmluZSBUQ1NFVFNXCQkweDU0MDMKKyNkZWZpbmUgVENTRVRTRgkJMHg1NDA0CisjZGVmaW5lIFRDR0VUQQkJMHg1NDA1CisjZGVmaW5lIFRDU0VUQQkJMHg1NDA2CisjZGVmaW5lIFRDU0VUQVcJCTB4NTQwNworI2RlZmluZSBUQ1NFVEFGCQkweDU0MDgKKyNkZWZpbmUgVENTQlJLCQkweDU0MDkKKyNkZWZpbmUgVENYT05DCQkweDU0MEEKKyNkZWZpbmUgVENGTFNICQkweDU0MEIKKyNkZWZpbmUgVElPQ0VYQ0wJMHg1NDBDCisjZGVmaW5lIFRJT0NOWENMCTB4NTQwRAorI2RlZmluZSBUSU9DU0NUVFkJMHg1NDBFCisjZGVmaW5lIFRJT0NHUEdSUAkweDU0MEYKKyNkZWZpbmUgVElPQ1NQR1JQCTB4NTQxMAorI2RlZmluZSBUSU9DT1VUUQkweDU0MTEKKyNkZWZpbmUgVElPQ1NUSQkJMHg1NDEyCisjZGVmaW5lIFRJT0NHV0lOU1oJMHg1NDEzCisjZGVmaW5lIFRJT0NTV0lOU1oJMHg1NDE0CisjZGVmaW5lIFRJT0NNR0VUCTB4NTQxNQorI2RlZmluZSBUSU9DTUJJUwkweDU0MTYKKyNkZWZpbmUgVElPQ01CSUMJMHg1NDE3CisjZGVmaW5lIFRJT0NNU0VUCTB4NTQxOAorI2RlZmluZSBUSU9DR1NPRlRDQVIJMHg1NDE5CisjZGVmaW5lIFRJT0NTU09GVENBUgkweDU0MUEKKyNkZWZpbmUgRklPTlJFQUQJMHg1NDFCCisjZGVmaW5lIFRJT0NJTlEJCUZJT05SRUFECisjZGVmaW5lIFRJT0NMSU5VWAkweDU0MUMKKyNkZWZpbmUgVElPQ0NPTlMJMHg1NDFECisjZGVmaW5lIFRJT0NHU0VSSUFMCTB4NTQxRQorI2RlZmluZSBUSU9DU1NFUklBTAkweDU0MUYKKyNkZWZpbmUgVElPQ1BLVAkJMHg1NDIwCisjZGVmaW5lIEZJT05CSU8JCTB4NTQyMQorI2RlZmluZSBUSU9DTk9UVFkJMHg1NDIyCisjZGVmaW5lIFRJT0NTRVRECTB4NTQyMworI2RlZmluZSBUSU9DR0VURAkweDU0MjQKKyNkZWZpbmUgVENTQlJLUAkJMHg1NDI1CS8qIE5lZWRlZCBmb3IgUE9TSVggdGNzZW5kYnJlYWsoKSAqLworLyogI2RlZmluZSBUSU9DVFRZR1NUUlVDVCAweDU0MjYgLSBGb3JtZXIgZGVidWdnaW5nLW9ubHkgaW9jdGwgKi8KKyNkZWZpbmUgVElPQ1NCUksJMHg1NDI3ICAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBUSU9DQ0JSSwkweDU0MjggIC8qIEJTRCBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFRJT0NHU0lECTB4NTQyOSAgLyogUmV0dXJuIHRoZSBzZXNzaW9uIElEIG9mIEZEICovCisjZGVmaW5lIFRDR0VUUzIJCV9JT1IoJ1QnLCAweDJBLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUUzIJCV9JT1coJ1QnLCAweDJCLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU1cyCV9JT1coJ1QnLCAweDJDLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUU0YyCV9JT1coJ1QnLCAweDJELCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRJT0NHUFROCV9JT1IoJ1QnLCAweDMwLCB1bnNpZ25lZCBpbnQpIC8qIEdldCBQdHkgTnVtYmVyCisJCQkJCQkgICAgICAgKiAob2YgcHR5LW11eCBkZXZpY2UpICovCisjZGVmaW5lIFRJT0NTUFRMQ0sJX0lPVygnVCcsIDB4MzEsIGludCkgIC8qIExvY2svdW5sb2NrIFB0eSAqLworCisjZGVmaW5lIEZJT05DTEVYCTB4NTQ1MAorI2RlZmluZSBGSU9DTEVYCQkweDU0NTEKKyNkZWZpbmUgRklPQVNZTkMJMHg1NDUyCisjZGVmaW5lIFRJT0NTRVJDT05GSUcJMHg1NDUzCisjZGVmaW5lIFRJT0NTRVJHV0lMRAkweDU0NTQKKyNkZWZpbmUgVElPQ1NFUlNXSUxECTB4NTQ1NQorI2RlZmluZSBUSU9DR0xDS1RSTUlPUwkweDU0NTYKKyNkZWZpbmUgVElPQ1NMQ0tUUk1JT1MJMHg1NDU3CisjZGVmaW5lIFRJT0NTRVJHU1RSVUNUCTB4NTQ1OCAvKiBGb3IgZGVidWdnaW5nIG9ubHkgKi8KKyNkZWZpbmUgVElPQ1NFUkdFVExTUiAgIDB4NTQ1OSAvKiBHZXQgbGluZSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVElPQ1NFUkdFVE1VTFRJIDB4NTQ1QSAvKiBHZXQgbXVsdGlwb3J0IGNvbmZpZyAgKi8KKyNkZWZpbmUgVElPQ1NFUlNFVE1VTFRJIDB4NTQ1QiAvKiBTZXQgbXVsdGlwb3J0IGNvbmZpZyAqLworCisjZGVmaW5lIFRJT0NNSVdBSVQJMHg1NDVDCS8qIHdhaXQgZm9yIGEgY2hhbmdlIG9uIHNlcmlhbCBpbnB1dCBsaW5lKHMpICovCisjZGVmaW5lIFRJT0NHSUNPVU5UCTB4NTQ1RAkvKiByZWFkIHNlcmlhbCBwb3J0IGlubGluZSBpbnRlcnJ1cHQgY291bnRzICovCisjZGVmaW5lIFRJT0NHSEFZRVNFU1AgICAweDU0NUUgIC8qIEdldCBIYXllcyBFU1AgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBUSU9DU0hBWUVTRVNQICAgMHg1NDVGICAvKiBTZXQgSGF5ZXMgRVNQIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgRklPUVNJWkUJMHg1NDYwCisKKy8qIFVzZWQgZm9yIHBhY2tldCBtb2RlICovCisjZGVmaW5lIFRJT0NQS1RfREFUQQkJIDAKKyNkZWZpbmUgVElPQ1BLVF9GTFVTSFJFQUQJIDEKKyNkZWZpbmUgVElPQ1BLVF9GTFVTSFdSSVRFCSAyCisjZGVmaW5lIFRJT0NQS1RfU1RPUAkJIDQKKyNkZWZpbmUgVElPQ1BLVF9TVEFSVAkJIDgKKyNkZWZpbmUgVElPQ1BLVF9OT1NUT1AJCTE2CisjZGVmaW5lIFRJT0NQS1RfRE9TVE9QCQkzMgorCisjZGVmaW5lIFRJT0NTRVJfVEVNVCAgICAweDAxCS8qIFRyYW5zbWl0dGVyIHBoeXNpY2FsbHkgZW1wdHkgKi8KKworI2VuZGlmIC8qIF9BU01fSU9DVExTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvaXBjLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2lwYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NmUzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2lwYy5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pcGMuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvaXBjYnVmLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2lwY2J1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYmJlZjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2lwY2J1Zi5oCkBAIC0wLDAgKzEsMjkgQEAKKyNpZm5kZWYgX0FTTV9JUENCVUZfSF8KKyNkZWZpbmUgX0FTTV9JUENCVUZfSAorCisvKgorICogVGhlIGlwYzY0X3Blcm0gc3RydWN0dXJlIGZvciBNTjEwMzAwIGFyY2hpdGVjdHVyZS4KKyAqIE5vdGUgZXh0cmEgcGFkZGluZyBiZWNhdXNlIHRoaXMgc3RydWN0dXJlIGlzIHBhc3NlZCBiYWNrIGFuZCBmb3J0aAorICogYmV0d2VlbiBrZXJuZWwgYW5kIHVzZXIgc3BhY2UuCisgKgorICogUGFkIHNwYWNlIGlzIGxlZnQgZm9yOgorICogLSAzMi1iaXQgbW9kZV90IGFuZCBzZXEKKyAqIC0gMiBtaXNjZWxsYW5lb3VzIDMyLWJpdCB2YWx1ZXMKKyAqLworCitzdHJ1Y3QgaXBjNjRfcGVybQoreworCV9fa2VybmVsX2tleV90CQlrZXk7CisJX19rZXJuZWxfdWlkMzJfdAl1aWQ7CisJX19rZXJuZWxfZ2lkMzJfdAlnaWQ7CisJX19rZXJuZWxfdWlkMzJfdAljdWlkOworCV9fa2VybmVsX2dpZDMyX3QJY2dpZDsKKwlfX2tlcm5lbF9tb2RlX3QJCW1vZGU7CisJdW5zaWduZWQgc2hvcnQJCV9fcGFkMTsKKwl1bnNpZ25lZCBzaG9ydAkJc2VxOworCXVuc2lnbmVkIHNob3J0CQlfX3BhZDI7CisJdW5zaWduZWQgbG9uZwkJX191bnVzZWQxOworCXVuc2lnbmVkIGxvbmcJCV9fdW51c2VkMjsKK307CisKKyNlbmRpZiAvKiBfQVNNX0lQQ0JVRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL2lycS5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9pcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2IzODAxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9pcnEuaApAQCAtMCwwICsxLDMyIEBACisvKiBNTjEwMzAwIEhhcmR3YXJlIGludGVycnVwdCBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNYXRzdXNoaXRhIEVsZWN0cmljIEluZHVzdHJpYWwgQ28uLCBMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogTW9kaWZpZWQgYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqIC0gRGVyaXZlZCBmcm9tIGluY2x1ZGUvYXNtLWkzODYvaXJxLmg6CisgKiAgIC0gKEMpIDE5OTIsIDE5OTMgTGludXMgVG9ydmFsZHMsIChDKSAxOTk3IEluZ28gTW9sbmFyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfQVNNX0lSUV9ICisjZGVmaW5lIF9BU01fSVJRX0gKKworI2luY2x1ZGUgPGFzbS9pbnRjdGwtcmVncy5oPgorI2luY2x1ZGUgPGFzbS9yZXNldC1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL3Byb2MvaXJxLmg+CisKKy8qIHRoaXMgbnVtYmVyIGlzIHVzZWQgd2hlbiBubyBpbnRlcnJ1cHQgaGFzIGJlZW4gYXNzaWduZWQgKi8KKyNkZWZpbmUgTk9fSVJRCQlJTlRfTUFYCisKKy8qIGhhcmR3YXJlIGlycSBudW1iZXJzICovCisjZGVmaW5lIE5SX0lSUVMJCUd4SUNSX05VTV9JUlFTCisKKy8qIGV4dGVybmFsIGhhcmR3YXJlIGlycSBudW1iZXJzICovCisjZGVmaW5lIE5SX1hJUlFTCUd4SUNSX05VTV9YSVJRUworCisjZGVmaW5lIGlycV9jYW5vbmljYWxpemUoSVJRKSAoSVJRKQorCisjZW5kaWYgLyogX0FTTV9JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9pcnFfcmVncy5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9pcnFfcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NDhjZDIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2lycV9yZWdzLmgKQEAgLTAsMCArMSwyNCBAQAorLyogTU4xMDMwMCBJUlEgcmVnaXN0ZXJzIHBvaW50ZXIgZGVmaW5pdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfQVNNX0lSUV9SRUdTX0gKKyNkZWZpbmUgX0FTTV9JUlFfUkVHU19ICisKKy8qCisgKiBQZXItY3B1IGN1cnJlbnQgZnJhbWUgcG9pbnRlciAtIHRoZSBsb2NhdGlvbiBvZiB0aGUgbGFzdCBleGNlcHRpb24gZnJhbWUgb24KKyAqIHRoZSBzdGFjaworICovCisjZGVmaW5lIEFSQ0hfSEFTX09XTl9JUlFfUkVHUworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2RlZmluZSBnZXRfaXJxX3JlZ3MoKSAoX19mcmFtZSkKKyNlbmRpZgorCisjZW5kaWYgLyogX0FTTV9JUlFfUkVHU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL2tkZWJ1Zy5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9rZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjQ3ZTExCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9rZGVidWcuaApAQCAtMCwwICsxLDIyIEBACisvKiBNTjEwMzAwIEluLWtlcm5lbCBkZWF0aCBrbmVsbHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfQVNNX0tERUJVR19ICisjZGVmaW5lIF9BU01fS0RFQlVHX0gKKworLyogR3Jvc3NseSBtaXNuYW1lZC4gKi8KK2VudW0gZGllX3ZhbCB7CisJRElFX09PUFMgPSAxLAorCURJRV9CUkVBS1BPSU5ULAorCURJRV9HUEYsCit9OworCisjZW5kaWYgLyogX0FTTV9LREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9rbWFwX3R5cGVzLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL2ttYXBfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzk4ZjlmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9rbWFwX3R5cGVzLmgKQEAgLTAsMCArMSwzMSBAQAorLyogTU4xMDMwMCBrbWFwX2F0b21pYygpIHNsb3QgSURzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fS01BUF9UWVBFU19ICisjZGVmaW5lIF9BU01fS01BUF9UWVBFU19ICisKK2VudW0ga21fdHlwZSB7CisJS01fQk9VTkNFX1JFQUQsCisJS01fU0tCX1NVTlJQQ19EQVRBLAorCUtNX1NLQl9EQVRBX1NPRlRJUlEsCisJS01fVVNFUjAsCisJS01fVVNFUjEsCisJS01fQklPX1NSQ19JUlEsCisJS01fQklPX0RTVF9JUlEsCisJS01fUFRFMCwKKwlLTV9QVEUxLAorCUtNX0lSUTAsCisJS01fSVJRMSwKKwlLTV9TT0ZUSVJRMCwKKwlLTV9TT0ZUSVJRMSwKKwlLTV9UWVBFX05SCit9OworCisjZW5kaWYgLyogX0FTTV9LTUFQX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAva3Byb2Jlcy5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9rcHJvYmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgwMGI1OQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAva3Byb2Jlcy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qIE1OMTAzMDAgS2VybmVsIFByb2JlcyBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgTWFyayBTYWx0ZXIgKG1zYWx0ZXJAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2VuY2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworI2lmbmRlZiBfQVNNX0tQUk9CRVNfSAorI2RlZmluZSBfQVNNX0tQUk9CRVNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKworc3RydWN0IGtwcm9iZTsKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIGtwcm9iZV9vcGNvZGVfdDsKKyNkZWZpbmUgQlJFQUtQT0lOVF9JTlNUUlVDVElPTgkweGZmCisjZGVmaW5lIE1BWF9JTlNOX1NJWkUgOAorI2RlZmluZSBNQVhfU1RBQ0tfU0laRSAxMjgKKworLyogQXJjaGl0ZWN0dXJlIHNwZWNpZmljIGNvcHkgb2Ygb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gKi8KK3N0cnVjdCBhcmNoX3NwZWNpZmljX2luc24geworCS8qICBjb3B5IG9mIG9yaWdpbmFsIGluc3RydWN0aW9uCisJICovCisJa3Byb2JlX29wY29kZV90IGluc25bTUFYX0lOU05fU0laRV07Cit9OworCitleHRlcm4gY29uc3QgaW50IGtyZXRwcm9iZV9ibGFja2xpc3Rfc2l6ZTsKKworZXh0ZXJuIGludCBrcHJvYmVfZXhjZXB0aW9uc19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSk7CisKKyNkZWZpbmUgZmx1c2hfaW5zbl9zbG90KHApICBkbyB7fSB3aGlsZSAoMCkKKworZXh0ZXJuIHZvaWQgYXJjaF9yZW1vdmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApOworCisjZW5kaWYgLyogX0FTTV9LUFJPQkVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvbGlua2FnZS5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9saW5rYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlhMzJlNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvbGlua2FnZS5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qIE1OMTAzMDAgTGlua2FnZSBhbmQgY2FsbGluZy1jb252ZW50aW9uIG92ZXJyaWRlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfQVNNX0xJTktBR0VfSAorI2RlZmluZSBfQVNNX0xJTktBR0VfSAorCisvKiBkb24ndCBvdmVycmlkZSBhbnl0aGluZyAqLworI2RlZmluZSBhc21saW5rYWdlCisjZGVmaW5lIEZBU1RDQUxMKHgpIHgKKyNkZWZpbmUgZmFzdGNhbGwKKworI2RlZmluZSBfX0FMSUdOCQkuYWxpZ24gNCwweGNiCisjZGVmaW5lIF9fQUxJR05fU1RSCSIuYWxpZ24gNCwweGNiIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvbG9jYWwuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvbG9jYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTFjNTMwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9sb2NhbC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9sb2NhbC5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9tYzE0NjgxOHJ0Yy5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9tYzE0NjgxOHJ0Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNmJjNmUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL21jMTQ2ODE4cnRjLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS9ydGMtcmVncy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9tbWFuLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzk4NmI2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9tbWFuLmgKQEAgLTAsMCArMSwyOCBAQAorLyogTU4xMDMwMCBDb25zdGFudHMgZm9yIG1tYXAgYW5kIGNvLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNYXRzdXNoaXRhIEVsZWN0cmljIEluZHVzdHJpYWwgQ28uLCBMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogLSBEZXJpdmVkIGZyb20gYXNtLXg4Ni9tbWFuLmgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fTU1BTl9ICisjZGVmaW5lIF9BU01fTU1BTl9ICisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tbWFuLmg+CisKKyNkZWZpbmUgTUFQX0dST1dTRE9XTgkweDAxMDAJCS8qIHN0YWNrLWxpa2Ugc2VnbWVudCAqLworI2RlZmluZSBNQVBfREVOWVdSSVRFCTB4MDgwMAkJLyogRVRYVEJTWSAqLworI2RlZmluZSBNQVBfRVhFQ1VUQUJMRQkweDEwMDAJCS8qIG1hcmsgaXQgYXMgYW4gZXhlY3V0YWJsZSAqLworI2RlZmluZSBNQVBfTE9DS0VECTB4MjAwMAkJLyogcGFnZXMgYXJlIGxvY2tlZCAqLworI2RlZmluZSBNQVBfTk9SRVNFUlZFCTB4NDAwMAkJLyogZG9uJ3QgY2hlY2sgZm9yIHJlc2VydmF0aW9ucyAqLworI2RlZmluZSBNQVBfUE9QVUxBVEUJMHg4MDAwCQkvKiBwb3B1bGF0ZSAocHJlZmF1bHQpIHBhZ2V0YWJsZXMgKi8KKyNkZWZpbmUgTUFQX05PTkJMT0NLCTB4MTAwMDAJCS8qIGRvIG5vdCBibG9jayBvbiBJTyAqLworCisjZGVmaW5lIE1DTF9DVVJSRU5UCTEJCS8qIGxvY2sgYWxsIGN1cnJlbnQgbWFwcGluZ3MgKi8KKyNkZWZpbmUgTUNMX0ZVVFVSRQkyCQkvKiBsb2NrIGFsbCBmdXR1cmUgbWFwcGluZ3MgKi8KKworI2VuZGlmIC8qIF9BU01fTU1BTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL21tdS5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9tbXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDJkMDk3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9tbXUuaApAQCAtMCwwICsxLDE5IEBACisvKiBNTjEwMzAwIE1lbW9yeSBtYW5hZ2VtZW50IGNvbnRleHQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICogLSBEZXJpdmVkIGZyb20gaW5jbHVkZS9hc20tZnJ2L21tdS5oCisgKi8KKworI2lmbmRlZiBfQVNNX01NVV9ICisjZGVmaW5lIF9BU01fTU1VX0gKKworLyoKKyAqIE1NVSBjb250ZXh0CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nCXRsYnBpZFtOUl9DUFVTXTsJLyogVExCIFBJRCBmb3IgdGhpcyBwcm9jZXNzIG9uCisJCQkJCQkgKiBlYWNoIENQVSAqLworfSBtbV9jb250ZXh0X3Q7CisKKyNlbmRpZiAvKiBfQVNNX01NVV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL21tdV9jb250ZXh0LmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL21tdV9jb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTllMmUzNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvbW11X2NvbnRleHQuaApAQCAtMCwwICsxLDEzOCBAQAorLyogTU4xMDMwMCBNTVUgY29udGV4dCBtYW5hZ2VtZW50CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIE1vZGlmaWVkIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKiAtIERlcml2ZWQgZnJvbSBpbmNsdWRlL2FzbS1tMzJyL21tdV9jb250ZXh0LmgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCisgKiBUaGlzIGltcGxlbWVudHMgYW4gYWxnb3JpdGhtIHRvIHByb3ZpZGUgVExCIFBJRCBtYXBwaW5ncyB0byBwcm92aWRlCisgKiBzZWxlY3RpdmUgYWNjZXNzIHRvIHRoZSBUTEIgZm9yIHByb2Nlc3NlcywgdGh1cyByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIFRMQgorICogZmx1c2hlcyByZXF1aXJlZC4KKyAqCisgKiBOb3RlLCBob3dldmVyLCB0aGF0IHRoZSBNMzJSIGFsZ29yaXRobSBpcyB0ZWNobmljYWxseSBicm9rZW4gYXMgaXQgZG9lcyBub3QKKyAqIGhhbmRsZSB2ZXJzaW9uIHdyYXAtYXJvdW5kLCBhbmQgY291bGQsIHRoZW9yZXRpY2FsbHksIGhhdmUgYSBwcm9ibGVtIHdpdGggYQorICogdmVyeSBsb25nIGxpdmVkIHByb2dyYW0gdGhhdCBzbGVlcHMgbG9uZyBlbm91Z2ggZm9yIHRoZSB2ZXJzaW9uIG51bWJlciB0bworICogd3JhcCBhbGwgdGhlIHdheSBhcm91bmQgc28gdGhhdCBpdHMgVExCIG1hcHBpbmdzIGFwcGVhciB2YWxpZCBvbmNlIGFnYWluLgorICovCisjaWZuZGVmIF9BU01fTU1VX0NPTlRFWFRfSAorI2RlZmluZSBfQVNNX01NVV9DT05URVhUX0gKKworI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL21tX2hvb2tzLmg+CisKKyNkZWZpbmUgTU1VX0NPTlRFWFRfVExCUElEX01BU0sJCTB4MDAwMDAwZmZVTAorI2RlZmluZSBNTVVfQ09OVEVYVF9WRVJTSU9OX01BU0sJMHhmZmZmZmYwMFVMCisjZGVmaW5lIE1NVV9DT05URVhUX0ZJUlNUX1ZFUlNJT04JMHgwMDAwMDEwMFVMCisjZGVmaW5lIE1NVV9OT19DT05URVhUCQkJMHgwMDAwMDAwMFVMCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIG1tdV9jb250ZXh0X2NhY2hlW05SX0NQVVNdOworI2RlZmluZSBtbV9jb250ZXh0KG1tKQkobW0tPmNvbnRleHQudGxicGlkW3NtcF9wcm9jZXNzb3JfaWQoKV0pCisKKyNkZWZpbmUgZW50ZXJfbGF6eV90bGIobW0sIHRzaykJZG8ge30gd2hpbGUgKDApCisKKyNpZmRlZiBDT05GSUdfU01QCisjZGVmaW5lIGNwdV9yYW5fdm0oY3B1LCB0YXNrKSBcCisJY3B1X3NldCgoY3B1KSwgKHRhc2spLT5jcHVfdm1fbWFzaykKKyNkZWZpbmUgY3B1X21heWJlX3Jhbl92bShjcHUsIHRhc2spIFwKKwljcHVfdGVzdF9hbmRfc2V0KChjcHUpLCAodGFzayktPmNwdV92bV9tYXNrKQorI2Vsc2UKKyNkZWZpbmUgY3B1X3Jhbl92bShjcHUsIHRhc2spCQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgY3B1X21heWJlX3Jhbl92bShjcHUsIHRhc2spCXRydWUKKyNlbmRpZiAvKiBDT05GSUdfU01QICovCisKKy8qCisgKiBhbGxvY2F0ZSBhbiBNTVUgY29udGV4dAorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYWxsb2NhdGVfbW11X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJdW5zaWduZWQgbG9uZyAqcG1jID0gJm1tdV9jb250ZXh0X2NhY2hlW3NtcF9wcm9jZXNzb3JfaWQoKV07CisJdW5zaWduZWQgbG9uZyBtYyA9ICsrKCpwbWMpOworCisJaWYgKCEobWMgJiBNTVVfQ09OVEVYVF9UTEJQSURfTUFTSykpIHsKKwkJLyogd2UgZXhoYXVzdGVkIHRoZSBUTEIgUElEcyBvZiB0aGlzIHZlcnNpb24gb24gdGhpcyBDUFUsIHNvIHdlCisJCSAqIGZsdXNoIHRoaXMgQ1BVJ3MgVExCIGluIGl0cyBlbnRpcmV0eSBhbmQgc3RhcnQgbmV3IGN5Y2xlICovCisJCWZsdXNoX3RsYl9hbGwoKTsKKworCQkvKiBmaXggdGhlIFRMQiB2ZXJzaW9uIGlmIG5lZWRlZCAod2UgYXZvaWQgdmVyc2lvbiAjMCBzbyBhcyB0bworCQkgKiBkaXN0aW5ndXNoIE1NVV9OT19DT05URVhUKSAqLworCQlpZiAoIW1jKQorCQkJKnBtYyA9IG1jID0gTU1VX0NPTlRFWFRfRklSU1RfVkVSU0lPTjsKKwl9CisJbW1fY29udGV4dChtbSkgPSBtYzsKKwlyZXR1cm4gbWM7Cit9CisKKy8qCisgKiBnZXQgYW4gTU1VIGNvbnRleHQgaWYgb25lIGlzIG5lZWRlZAorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X21tdV9jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXVuc2lnbmVkIGxvbmcgbWMgPSBNTVVfTk9fQ09OVEVYVCwgY2FjaGU7CisKKwlpZiAobW0pIHsKKwkJY2FjaGUgPSBtbXVfY29udGV4dF9jYWNoZVtzbXBfcHJvY2Vzc29yX2lkKCldOworCQltYyA9IG1tX2NvbnRleHQobW0pOworCisJCS8qIGlmIHdlIGhhdmUgYW4gb2xkIHZlcnNpb24gb2YgdGhlIGNvbnRleHQsIHJlcGxhY2UgaXQgKi8KKwkJaWYgKChtYyBeIGNhY2hlKSAmIE1NVV9DT05URVhUX1ZFUlNJT05fTUFTSykKKwkJCW1jID0gYWxsb2NhdGVfbW11X2NvbnRleHQobW0pOworCX0KKwlyZXR1cm4gbWM7Cit9CisKKy8qCisgKiBpbml0aWFsaXNlIHRoZSBjb250ZXh0IHJlbGF0ZWQgaW5mbyBmb3IgYSBuZXcgbW1fc3RydWN0IGluc3RhbmNlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGluaXRfbmV3X2NvbnRleHQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCisJCQkJICAgc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJaW50IG51bV9jcHVzID0gTlJfQ1BVUywgaTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fY3B1czsgaSsrKQorCQltbS0+Y29udGV4dC50bGJwaWRbaV0gPSBNTVVfTk9fQ09OVEVYVDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGRlc3Ryb3kgY29udGV4dCByZWxhdGVkIGluZm8gZm9yIGFuIG1tX3N0cnVjdCB0aGF0IGlzIGFib3V0IHRvIGJlIHB1dCB0bworICogcmVzdAorICovCisjZGVmaW5lIGRlc3Ryb3lfY29udGV4dChtbSkJZG8geyB9IHdoaWxlICgwKQorCisvKgorICogYWZ0ZXIgd2UgaGF2ZSBzZXQgY3VycmVudC0+bW0gdG8gYSBuZXcgdmFsdWUsIHRoaXMgYWN0aXZhdGVzIHRoZSBjb250ZXh0IGZvcgorICogdGhlIG5ldyBtbSBzbyB3ZSBzZWUgdGhlIG5ldyBtYXBwaW5ncy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGFjdGl2YXRlX2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIGludCBjcHUpCit7CisJUElEUiA9IGdldF9tbXVfY29udGV4dChtbSkgJiBNTVVfQ09OVEVYVF9UTEJQSURfTUFTSzsKK30KKworLyoKKyAqIGNoYW5nZSBiZXR3ZWVuIHZpcnR1YWwgbWVtb3J5IHNldHMKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHN3aXRjaF9tbShzdHJ1Y3QgbW1fc3RydWN0ICpwcmV2LCBzdHJ1Y3QgbW1fc3RydWN0ICpuZXh0LAorCQkJICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJaWYgKHByZXYgIT0gbmV4dCkgeworCQljcHVfcmFuX3ZtKGNwdSwgbmV4dCk7CisJCWFjdGl2YXRlX2NvbnRleHQobmV4dCwgY3B1KTsKKwkJUFRCUiA9ICh1bnNpZ25lZCBsb25nKSBuZXh0LT5wZ2Q7CisJfSBlbHNlIGlmICghY3B1X21heWJlX3Jhbl92bShjcHUsIG5leHQpKSB7CisJCWFjdGl2YXRlX2NvbnRleHQobmV4dCwgY3B1KTsKKwl9Cit9CisKKyNkZWZpbmUgZGVhY3RpdmF0ZV9tbSh0c2ssIG1tKQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgYWN0aXZhdGVfbW0ocHJldiwgbmV4dCkJc3dpdGNoX21tKChwcmV2KSwgKG5leHQpLCBOVUxMKQorCisjZW5kaWYgLyogX0FTTV9NTVVfQ09OVEVYVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL21vZHVsZS5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9tb2R1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDcwNTdkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9tb2R1bGUuaApAQCAtMCwwICsxLDI3IEBACisvKiBNTjEwMzAwIEFyY2gtc3BlY2lmaWMgbW9kdWxlIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgTWFyayBTYWx0ZXIgKG1zYWx0ZXJAcmVkaGF0LmNvbSkKKyAqIERlcml2ZWQgZnJvbSBpbmNsdWRlL2FzbS1pMzg2L21vZHVsZS5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfQVNNX01PRFVMRV9ICisjZGVmaW5lIF9BU01fTU9EVUxFX0gKKworc3RydWN0IG1vZF9hcmNoX3NwZWNpZmljIHsKK307CisKKyNkZWZpbmUgRWxmX1NoZHIJRWxmMzJfU2hkcgorI2RlZmluZSBFbGZfU3ltCQlFbGYzMl9TeW0KKyNkZWZpbmUgRWxmX0VoZHIJRWxmMzJfRWhkcgorCisvKgorICogSW5jbHVkZSB0aGUgTU4xMDMwMCBhcmNoaXRlY3R1cmUgdmVyc2lvbi4KKyAqLworI2RlZmluZSBNT0RVTEVfQVJDSF9WRVJNQUdJQyBfX3N0cmluZ2lmeShQUk9DRVNTT1JfTU9ERUxfTkFNRSkgIiAiCisKKyNlbmRpZiAvKiBfQVNNX01PRFVMRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL21zZ2J1Zi5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9tc2didWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjYwMjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9tc2didWYuaApAQCAtMCwwICsxLDMxIEBACisjaWZuZGVmIF9BU01fTVNHQlVGX0gKKyNkZWZpbmUgX0FTTV9NU0dCVUZfSAorCisvKgorICogVGhlIG1zcWlkNjRfZHMgc3RydWN0dXJlIGZvciBNTjEwMzAwIGFyY2hpdGVjdHVyZS4KKyAqIE5vdGUgZXh0cmEgcGFkZGluZyBiZWNhdXNlIHRoaXMgc3RydWN0dXJlIGlzIHBhc3NlZCBiYWNrIGFuZCBmb3J0aAorICogYmV0d2VlbiBrZXJuZWwgYW5kIHVzZXIgc3BhY2UuCisgKgorICogUGFkIHNwYWNlIGlzIGxlZnQgZm9yOgorICogLSA2NC1iaXQgdGltZV90IHRvIHNvbHZlIHkyMDM4IHByb2JsZW0KKyAqIC0gMiBtaXNjZWxsYW5lb3VzIDMyLWJpdCB2YWx1ZXMKKyAqLworCitzdHJ1Y3QgbXNxaWQ2NF9kcyB7CisJc3RydWN0IGlwYzY0X3Blcm0JbXNnX3Blcm07CisJX19rZXJuZWxfdGltZV90CQltc2dfc3RpbWU7CS8qIGxhc3QgbXNnc25kIHRpbWUgKi8KKwl1bnNpZ25lZCBsb25nCQlfX3VudXNlZDE7CisJX19rZXJuZWxfdGltZV90CQltc2dfcnRpbWU7CS8qIGxhc3QgbXNncmN2IHRpbWUgKi8KKwl1bnNpZ25lZCBsb25nCQlfX3VudXNlZDI7CisJX19rZXJuZWxfdGltZV90CQltc2dfY3RpbWU7CS8qIGxhc3QgY2hhbmdlIHRpbWUgKi8KKwl1bnNpZ25lZCBsb25nCQlfX3VudXNlZDM7CisJdW5zaWduZWQgbG9uZwkJbXNnX2NieXRlczsJLyogY3VycmVudCBudW1iZXIgb2YgYnl0ZXMgb24gcXVldWUgKi8KKwl1bnNpZ25lZCBsb25nCQltc2dfcW51bTsJLyogbnVtYmVyIG9mIG1lc3NhZ2VzIGluIHF1ZXVlICovCisJdW5zaWduZWQgbG9uZwkJbXNnX3FieXRlczsJLyogbWF4IG51bWJlciBvZiBieXRlcyBvbiBxdWV1ZSAqLworCV9fa2VybmVsX3BpZF90CQltc2dfbHNwaWQ7CS8qIHBpZCBvZiBsYXN0IG1zZ3NuZCAqLworCV9fa2VybmVsX3BpZF90CQltc2dfbHJwaWQ7CS8qIGxhc3QgcmVjZWl2ZSBwaWQgKi8KKwl1bnNpZ25lZCBsb25nCQlfX3VudXNlZDQ7CisJdW5zaWduZWQgbG9uZwkJX191bnVzZWQ1OworfTsKKworI2VuZGlmIC8qIF9BU01fTVNHQlVGX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvbXV0ZXguaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvbXV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGY1NDkwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9tdXRleC5oCkBAIC0wLDAgKzEsMTYgQEAKKy8qIE1OMTAzMDAgTXV0ZXggZmFzdHBhdGgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoKKyAqIFRPRE86IGltcGxlbWVudCBvcHRpbWl6ZWQgcHJpbWl0aXZlcyBpbnN0ZWFkLCBvciBsZWF2ZSB0aGUgZ2VuZXJpYworICogaW1wbGVtZW50YXRpb24gaW4gcGxhY2UsIG9yIHBpY2sgdGhlIGF0b21pY194Y2hnKCkgYmFzZWQgZ2VuZXJpYworICogaW1wbGVtZW50YXRpb24uIChzZWUgYXNtLWdlbmVyaWMvbXV0ZXgteGNoZy5oIGZvciBkZXRhaWxzKQorICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbXV0ZXgtbnVsbC5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9uYW1laS5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9uYW1laS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOWNlOTQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL25hbWVpLmgKQEAgLTAsMCArMSwyMiBAQAorLyogRW11bGF0aW9uIHN0dWZmCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0FTTV9OQU1FSV9ICisjZGVmaW5lIF9BU01fTkFNRUlfSAorCisvKiBUaGlzIGR1bW15IHJvdXRpbmUgbWF5YmUgY2hhbmdlZCB0byBzb21ldGhpbmcgdXNlZnVsCisgKiBmb3IgL3Vzci9nbmVtdWwvIGVtdWxhdGlvbiBzdHVmZi4KKyAqIExvb2sgYXQgYXNtLXNwYXJjL25hbWVpLmggZm9yIGRldGFpbHMuCisgKi8KKworI2RlZmluZSBfX2VtdWxfcHJlZml4KCkgTlVMTAorCisjZW5kaWYgLyogX0FTTV9OQU1FSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL25taS5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9ubWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzY3MWNiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9ubWkuaApAQCAtMCwwICsxLDE0IEBACisvKiBNTjEwMzAwIE5NSSBoYW5kbGluZworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfQVNNX05NSV9ICisjZGVmaW5lIF9BU01fTk1JX0gKKworI2VuZGlmIC8qIF9BU01fTk1JX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvcGFnZS5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9wYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI0OTcxYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvcGFnZS5oCkBAIC0wLDAgKzEsMTMxIEBACisvKiBNTjEwMzAwIFBhZ2UgdGFibGUgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9QQUdFX0gKKyNkZWZpbmUgX0FTTV9QQUdFX0gKKworLyogUEFHRV9TSElGVCBkZXRlcm1pbmVzIHRoZSBwYWdlIHNpemUgKi8KKyNkZWZpbmUgUEFHRV9TSElGVAkxMgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2RlZmluZSBQQUdFX1NJWkUJKDFVTCA8PCBQQUdFX1NISUZUKQorI2RlZmluZSBQQUdFX01BU0sJKH4oUEFHRV9TSVpFIC0gMSkpCisjZWxzZQorI2RlZmluZSBQQUdFX1NJWkUJKygxIDw8IFBBR0VfU0hJRlQpCS8qIHVuYXJ5IHBsdXMgbWFya3MgYW4KKwkJCQkJCSAqIGltbWVkaWF0ZSB2YWwgbm90IGFuIGFkZHIgKi8KKyNkZWZpbmUgUEFHRV9NQVNLCSsofihQQUdFX1NJWkUgLSAxKSkKKyNlbmRpZgorCisjaWZkZWYgX19LRVJORUxfXworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2RlZmluZSBjbGVhcl9wYWdlKHBhZ2UpCW1lbXNldCgodm9pZCAqKShwYWdlKSwgMCwgUEFHRV9TSVpFKQorI2RlZmluZSBjb3B5X3BhZ2UodG8sIGZyb20pCW1lbWNweSgodm9pZCAqKSh0byksICh2b2lkICopKGZyb20pLCBQQUdFX1NJWkUpCisKKyNkZWZpbmUgY2xlYXJfdXNlcl9wYWdlKGFkZHIsIHZhZGRyLCBwYWdlKQljbGVhcl9wYWdlKGFkZHIpCisjZGVmaW5lIGNvcHlfdXNlcl9wYWdlKHZ0bywgdmZyb20sIHZhZGRyLCB0bykJY29weV9wYWdlKHZ0bywgdmZyb20pCisKKy8qCisgKiBUaGVzZSBhcmUgdXNlZCB0byBtYWtlIHVzZSBvZiBDIHR5cGUtY2hlY2tpbmcuLgorICovCit0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcHRlOyB9IHB0ZV90OwordHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBsb25nIHBnZDsgfSBwZ2RfdDsKK3R5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBwZ3Byb3Q7IH0gcGdwcm90X3Q7Cit0eXBlZGVmIHN0cnVjdCBwYWdlICpwZ3RhYmxlX3Q7CisKKyNkZWZpbmUgUFRFX01BU0sJUEFHRV9NQVNLCisjZGVmaW5lIEhQQUdFX1NISUZUCTIyCisKKyNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFCisjZGVmaW5lIEhQQUdFX1NJWkUJCSgoMVVMKSA8PCBIUEFHRV9TSElGVCkKKyNkZWZpbmUgSFBBR0VfTUFTSwkJKH4oSFBBR0VfU0laRSAtIDEpKQorI2RlZmluZSBIVUdFVExCX1BBR0VfT1JERVIJKEhQQUdFX1NISUZUIC0gUEFHRV9TSElGVCkKKyNlbmRpZgorCisjZGVmaW5lIHB0ZV92YWwoeCkJKCh4KS5wdGUpCisjZGVmaW5lIHBnZF92YWwoeCkJKCh4KS5wZ2QpCisjZGVmaW5lIHBncHJvdF92YWwoeCkJKCh4KS5wZ3Byb3QpCisKKyNkZWZpbmUgX19wdGUoeCkJKChwdGVfdCkgeyAoeCkgfSkKKyNkZWZpbmUgX19wZ2QoeCkJKChwZ2RfdCkgeyAoeCkgfSkKKyNkZWZpbmUgX19wZ3Byb3QoeCkJKChwZ3Byb3RfdCkgeyAoeCkgfSkKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BndGFibGUtbm9wbWQuaD4KKworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworLyogdG8gYWxpZ24gdGhlIHBvaW50ZXIgdG8gdGhlIChuZXh0KSBwYWdlIGJvdW5kYXJ5ICovCisjZGVmaW5lIFBBR0VfQUxJR04oYWRkcikJKCgoYWRkcikgKyBQQUdFX1NJWkUgLSAxKSAmIFBBR0VfTUFTSykKKworLyoKKyAqIFRoaXMgaGFuZGxlcyB0aGUgbWVtb3J5IG1hcC4uIFdlIGNvdWxkIG1ha2UgdGhpcyBhIGNvbmZpZworICogb3B0aW9uLCBidXQgdG9vIG1hbnkgcGVvcGxlIHNjcmV3IGl0IHVwLCBhbmQgdG9vIGZldyBuZWVkCisgKiBpdC4KKyAqCisgKiBBIF9fUEFHRV9PRkZTRVQgb2YgMHhDMDAwMDAwMCBtZWFucyB0aGF0IHRoZSBrZXJuZWwgaGFzCisgKiBhIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSBvZiBvbmUgZ2lnYWJ5dGUsIHdoaWNoIGxpbWl0cyB0aGUKKyAqIGFtb3VudCBvZiBwaHlzaWNhbCBtZW1vcnkgeW91IGNhbiB1c2UgdG8gYWJvdXQgOTUwTUIuCisgKi8KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworLyogUHVyZSAyXm4gdmVyc2lvbiBvZiBnZXRfb3JkZXIgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdldF9vcmRlcih1bnNpZ25lZCBsb25nIHNpemUpIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7CitzdGF0aWMgaW5saW5lIGludCBnZXRfb3JkZXIodW5zaWduZWQgbG9uZyBzaXplKQoreworCWludCBvcmRlcjsKKworCXNpemUgPSAoc2l6ZSAtIDEpID4+IChQQUdFX1NISUZUIC0gMSk7CisJb3JkZXIgPSAtMTsKKwlkbyB7CisJCXNpemUgPj49IDE7CisJCW9yZGVyKys7CisJfSB3aGlsZSAoc2l6ZSk7CisJcmV0dXJuIG9yZGVyOworfQorCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKyNpbmNsdWRlIDxhc20vcGFnZV9vZmZzZXQuaD4KKworI2RlZmluZSBfX1BBR0VfT0ZGU0VUCQkoUEFHRV9PRkZTRVRfUkFXKQorI2RlZmluZSBQQUdFX09GRlNFVAkJKCh1bnNpZ25lZCBsb25nKSBfX1BBR0VfT0ZGU0VUKQorCisvKgorICogbWFpbiBSQU0gYW5kIGtlcm5lbCB3b3JraW5nIHNwYWNlIGFyZSBjb2luY2lkZW50IGF0IDB4OTAwMDAwMDAsIGJ1dCB0byBtYWtlCisgKiBsaWZlIG1vcmUgaW50ZXJlc3RpbmcsIHRoZXJlJ3MgYWxzbyBhbiB1bmNhY2hlZCB2aXJ0dWFsIHNoYWRvdyBhdCAweGIwMDAwMDAwCisgKiAtIHRoZXNlIG1hcHBpbmdzIGFyZSBmaXhlZCBpbiB0aGUgTU1VCisgKi8KKyNkZWZpbmUgX19wZm5fZGlzcAkJKENPTkZJR19LRVJORUxfUkFNX0JBU0VfQUREUkVTUyA+PiBQQUdFX1NISUZUKQorCisjZGVmaW5lIF9fcGEoeCkJCQkoKHVuc2lnbmVkIGxvbmcpKHgpKQorI2RlZmluZSBfX3ZhKHgpCQkJKCh2b2lkICopKHVuc2lnbmVkIGxvbmcpKHgpKQorI2RlZmluZSBwZm5fdG9fa2FkZHIocGZuKQlfX3ZhKChwZm4pIDw8IFBBR0VfU0hJRlQpCisjZGVmaW5lIHBmbl90b19wYWdlKHBmbikJKG1lbV9tYXAgKyAoKHBmbikgLSBfX3Bmbl9kaXNwKSkKKyNkZWZpbmUgcGFnZV90b19wZm4ocGFnZSkJKCh1bnNpZ25lZCBsb25nKSgocGFnZSkgLSBtZW1fbWFwKSArIF9fcGZuX2Rpc3ApCisKKyNkZWZpbmUgcGZuX3ZhbGlkKHBmbikJCQkJCVwKKyh7CQkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIF9fcGZuID0gKHBmbikgLSBfX3Bmbl9kaXNwOwlcCisJX19wZm4gPCBtYXhfbWFwbnI7CQkJCVwKK30pCisKKyNkZWZpbmUgdmlydF90b19wYWdlKGthZGRyKQlwZm5fdG9fcGFnZShfX3BhKGthZGRyKSA+PiBQQUdFX1NISUZUKQorI2RlZmluZSB2aXJ0X2FkZHJfdmFsaWQoa2FkZHIpCXBmbl92YWxpZChfX3BhKGthZGRyKSA+PiBQQUdFX1NISUZUKQorI2RlZmluZSBwYWdlX3RvX3BoeXMocGFnZSkJKHBhZ2VfdG9fcGZuKHBhZ2UpIDw8IFBBR0VfU0hJRlQpCisKKyNkZWZpbmUgVk1fREFUQV9ERUZBVUxUX0ZMQUdTIFwKKwkoVk1fUkVBRCB8IFZNX1dSSVRFIHwgXAorCSgoY3VycmVudC0+cGVyc29uYWxpdHkgJiBSRUFEX0lNUExJRVNfRVhFQykgPyBWTV9FWEVDIDogMCkgfCBcCisJCSBWTV9NQVlSRUFEIHwgVk1fTUFZV1JJVEUgfCBWTV9NQVlFWEVDKQorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgLyogX0FTTV9QQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvcGFnZV9vZmZzZXQuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvcGFnZV9vZmZzZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWI1YjE2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9wYWdlX29mZnNldC5oCkBAIC0wLDAgKzEsMTEgQEAKKy8qIE1OMTAzMDAgS2VybmVsIGJhc2UgYWRkcmVzcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKi8KKyNpZm5kZWYgX0FTTV9QQUdFX09GRlNFVF9ICisjZGVmaW5lIF9BU01fUEFHRV9PRkZTRVRfSAorCisjZGVmaW5lIFBBR0VfT0ZGU0VUX1JBVyBDT05GSUdfS0VSTkVMX1JBTV9CQVNFX0FERFJFU1MKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL3BhcmFtLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3BhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRiODgzZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvcGFyYW0uaApAQCAtMCwwICsxLDM0IEBACisvKiBNTjEwMzAwIEtlcm5lbCBwYXJhbWV0ZXJzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1hdHN1c2hpdGEgRWxlY3RyaWMgSW5kdXN0cmlhbCBDby4sIEx0ZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfQVNNX1BBUkFNX0gKKyNkZWZpbmUgX0FTTV9QQVJBTV9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lIEhaCQkxMDAwCQkvKiBJbnRlcm5hbCBrZXJuZWwgdGltZXIgZnJlcXVlbmN5ICovCisjZGVmaW5lIFVTRVJfSFoJCTEwMAkJLyogLi4gc29tZSB1c2VyIGludGVyZmFjZXMgYXJlIGluCisJCQkJCSAqICJ0aWNrcyIgKi8KKyNkZWZpbmUgQ0xPQ0tTX1BFUl9TRUMJKFVTRVJfSFopCS8qIGxpa2UgdGltZXMoKSAqLworI2VuZGlmCisKKyNpZm5kZWYgSFoKKyNkZWZpbmUgSFoJCTEwMAorI2VuZGlmCisKKyNkZWZpbmUgRVhFQ19QQUdFU0laRQk0MDk2CisKKyNpZm5kZWYgTk9HUk9VUAorI2RlZmluZSBOT0dST1VQCQkoLTEpCisjZW5kaWYKKworI2RlZmluZSBNQVhIT1NUTkFNRUxFTgk2NAkvKiBtYXggbGVuZ3RoIG9mIGhvc3RuYW1lICovCisjZGVmaW5lIENPTU1BTkRfTElORV9TSVpFIDI1NgorCisjZW5kaWYgLyogX0FTTV9QQVJBTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL3BjaS5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9wY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDUxOTJjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9wY2kuaApAQCAtMCwwICsxLDEzMyBAQAorLyogTU4xMDMwMCBQQ0kgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9QQ0lfSAorI2RlZmluZSBfQVNNX1BDSV9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvbW0uaD4JCS8qIGZvciBzdHJ1Y3QgcGFnZSAqLworCisjaWYgMAorI2RlZmluZSBfX3BjYmRlYnVnKEZNVCwgQUREUiwgLi4uKSBcCisJcHJpbnRrKEtFUk5fREVCVUcgIlBDSUJSSURHRVslMDh4XTogIkZNVCJcbiIsIFwKKwkgICAgICAgKHUzMikoQUREUiksICMjX19WQV9BUkdTX18pCisKKyNkZWZpbmUgX19wY2lkZWJ1ZyhGTVQsIEJVUywgREVWRk4sIFdIRVJFLC4uLikJCVwKK2RvIHsJCQkJCQkJXAorCXByaW50ayhLRVJOX0RFQlVHICJQQ0lbJTAyeDolMDJ4LiV4ICsgJTAyeF06ICJGTVQiXG4iLAlcCisJICAgICAgIChCVVMpLT5udW1iZXIsCQkJCQlcCisJICAgICAgIFBDSV9TTE9UKERFVkZOKSwJCQkJCVwKKwkgICAgICAgUENJX0ZVTkMoREVWRk4pLAkJCQkJXAorCSAgICAgICAodTMyKShXSEVSRSksICMjX19WQV9BUkdTX18pOwkJCVwKK30gd2hpbGUgKDApCisKKyNlbHNlCisjZGVmaW5lIF9fcGNiZGVidWcoRk1ULCBBRERSLCAuLi4pCQlkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgX19wY2lkZWJ1ZyhGTVQsIEJVUywgREVWRk4sIFdIRVJFLCAuLi4pCWRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIENhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBsb2dpYyBpbiBwY2lfc2Nhbl9idXMgZm9yIHNraXBwaW5nCisgKiBhbHJlYWR5LWNvbmZpZ3VyZWQgYnVzIG51bWJlcnMgLSB0byBiZSB1c2VkIGZvciBidWdneSBCSU9TZXMgb3IKKyAqIGFyY2hpdGVjdHVyZXMgd2l0aCBpbmNvbXBsZXRlIFBDSSBzZXR1cCBieSB0aGUgbG9hZGVyICovCisKKyNpZmRlZiBDT05GSUdfUENJCisjZGVmaW5lIHBjaWJpb3NfYXNzaWduX2FsbF9idXNzZXMoKQkxCitleHRlcm4gdm9pZCB1bml0X3BjaV9pbml0KHZvaWQpOworI2Vsc2UKKyNkZWZpbmUgcGNpYmlvc19hc3NpZ25fYWxsX2J1c3NlcygpCTAKKyNlbmRpZgorCitleHRlcm4gdW5zaWduZWQgbG9uZyBwY2lfbWVtX3N0YXJ0OworI2RlZmluZSBQQ0lCSU9TX01JTl9JTwkJMHhCRTAwMDAwNAorI2RlZmluZSBQQ0lCSU9TX01JTl9NRU0JCTB4QjgwMDAwMDAKKwordm9pZCBwY2liaW9zX3NldF9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldik7Cit2b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxKTsKKworLyogRHluYW1pYyBETUEgbWFwcGluZyBzdHVmZi4KKyAqIGkzODYgaGFzIGV2ZXJ5dGhpbmcgbWFwcGVkIHN0YXRpY2FsbHkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK3N0cnVjdCBwY2lfZGV2OworCisvKiBUaGUgUENJIGFkZHJlc3Mgc3BhY2UgZG9lcyBlcXVhbCB0aGUgcGh5c2ljYWwgbWVtb3J5CisgKiBhZGRyZXNzIHNwYWNlLiAgVGhlIG5ldHdvcmtpbmcgYW5kIGJsb2NrIGRldmljZSBsYXllcnMgdXNlCisgKiB0aGlzIGJvb2xlYW4gZm9yIGJvdW5jZSBidWZmZXIgZGVjaXNpb25zLgorICovCisjZGVmaW5lIFBDSV9ETUFfQlVTX0lTX1BIWVMJKDEpCisKKworLyogVGhpcyBpcyBhbHdheXMgZmluZS4gKi8KKyNkZWZpbmUgcGNpX2RhY19kbWFfc3VwcG9ydGVkKHBjaV9kZXYsIG1hc2spCSgwKQorCisvKgorICogVGhlc2UgbWFjcm9zIHNob3VsZCBiZSB1c2VkIGFmdGVyIGEgcGNpX21hcF9zZyBjYWxsIGhhcyBiZWVuIGRvbmUKKyAqIHRvIGdldCBidXMgYWRkcmVzc2VzIG9mIGVhY2ggb2YgdGhlIFNHIGVudHJpZXMgYW5kIHRoZWlyIGxlbmd0aHMuCisgKiBZb3Ugc2hvdWxkIG9ubHkgd29yayB3aXRoIHRoZSBudW1iZXIgb2Ygc2cgZW50cmllcyBwY2lfbWFwX3NnCisgKiByZXR1cm5zLgorICovCisjZGVmaW5lIHNnX2RtYV9hZGRyZXNzKHNnKQkoKHNnKS0+ZG1hX2FkZHJlc3MpCisjZGVmaW5lIHNnX2RtYV9sZW4oc2cpCQkoKHNnKS0+bGVuZ3RoKQorCisvKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBQQ0kgY29udHJvbGxlciBmb3IgZGV2aWNlLiAqLworc3RhdGljIGlubGluZSBpbnQgcGNpX2NvbnRyb2xsZXJfbnVtKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgSEFWRV9QQ0lfTU1BUAorZXh0ZXJuIGludCBwY2lfbW1hcF9wYWdlX3JhbmdlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJICAgICAgIGVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSwKKwkJCSAgICAgICBpbnQgd3JpdGVfY29tYmluZSk7CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKy8qIGltcGxlbWVudCB0aGUgcGNpXyBETUEgQVBJIGluIHRlcm1zIG9mIHRoZSBnZW5lcmljIGRldmljZSBkbWFfIG9uZSAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BjaS1kbWEtY29tcGF0Lmg+CisKKy8qKgorICogcGNpYmlvc19yZXNvdXJjZV90b19idXMgLSBjb252ZXJ0IHJlc291cmNlIHRvIFBDSSBidXMgYWRkcmVzcworICogQGRldjogZGV2aWNlIHdoaWNoIG93bnMgdGhpcyByZXNvdXJjZQorICogQHJlZ2lvbjogY29udmVydGVkIGJ1cy1jZW50cmljIHJlZ2lvbiAoc3RhcnQsZW5kKQorICogQHJlczogcmVzb3VyY2UgdG8gY29udmVydAorICoKKyAqIENvbnZlcnQgYSByZXNvdXJjZSB0byBhIFBDSSBkZXZpY2UgYnVzIGFkZHJlc3Mgb3IgYnVzIHdpbmRvdy4KKyAqLworZXh0ZXJuIHZvaWQgcGNpYmlvc19yZXNvdXJjZV90b19idXMoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkgICAgc3RydWN0IHBjaV9idXNfcmVnaW9uICpyZWdpb24sCisJCQkJICAgIHN0cnVjdCByZXNvdXJjZSAqcmVzKTsKKworZXh0ZXJuIHZvaWQgcGNpYmlvc19idXNfdG9fcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkgICAgc3RydWN0IHJlc291cmNlICpyZXMsCisJCQkJICAgIHN0cnVjdCBwY2lfYnVzX3JlZ2lvbiAqcmVnaW9uKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVzb3VyY2UgKgorcGNpYmlvc19zZWxlY3Rfcm9vdChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHJlc291cmNlICpyZXMpCit7CisJc3RydWN0IHJlc291cmNlICpyb290ID0gTlVMTDsKKworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKwkJcm9vdCA9ICZpb3BvcnRfcmVzb3VyY2U7CisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKKwkJcm9vdCA9ICZpb21lbV9yZXNvdXJjZTsKKworCXJldHVybiByb290OworfQorCisjZGVmaW5lIHBjaWJpb3Nfc2Nhbl9hbGxfZm5zKGEsIGIpCTAKKworI2VuZGlmIC8qIF9BU01fUENJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvcGVyY3B1LmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3BlcmNwdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YTk1OWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3BlcmNwdS5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wZXJjcHUuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvcGdhbGxvYy5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9wZ2FsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMwNTdlMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvcGdhbGxvYy5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qIE1OMTAzMDAgUGFnZSBhbmQgcGFnZSB0YWJsZS9kaXJlY3RvcnkgYWxsb2NhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfQVNNX1BHQUxMT0NfSAorI2RlZmluZSBfQVNNX1BHQUxMT0NfSAorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CQkvKiBmb3Igc3RydWN0IHBhZ2UgKi8KKworc3RydWN0IG1tX3N0cnVjdDsKK3N0cnVjdCBwYWdlOworCisvKiBhdHRhY2ggYSBwYWdlIHRhYmxlIHRvIGEgUE1EIGVudHJ5ICovCisjZGVmaW5lIHBtZF9wb3B1bGF0ZV9rZXJuZWwobW0sIHBtZCwgcHRlKSBcCisJc2V0X3BtZChwbWQsIF9fcG1kKF9fcGEocHRlKSB8IF9QQUdFX1RBQkxFKSkKKworc3RhdGljIGlubGluZQordm9pZCBwbWRfcG9wdWxhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBtZF90ICpwbWQsIHN0cnVjdCBwYWdlICpwdGUpCit7CisJc2V0X3BtZChwbWQsIF9fcG1kKChwYWdlX3RvX3BmbihwdGUpIDw8IFBBR0VfU0hJRlQpIHwgX1BBR0VfVEFCTEUpKTsKK30KKyNkZWZpbmUgcG1kX3BndGFibGUocG1kKSBwbWRfcGFnZShwbWQpCisKKy8qCisgKiBBbGxvY2F0ZSBhbmQgZnJlZSBwYWdlIHRhYmxlcy4KKyAqLworCitleHRlcm4gcGdkX3QgKnBnZF9hbGxvYyhzdHJ1Y3QgbW1fc3RydWN0ICopOworZXh0ZXJuIHZvaWQgcGdkX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqLCBwZ2RfdCAqKTsKKworZXh0ZXJuIHB0ZV90ICpwdGVfYWxsb2Nfb25lX2tlcm5lbChzdHJ1Y3QgbW1fc3RydWN0ICosIHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIHN0cnVjdCBwYWdlICpwdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKiwgdW5zaWduZWQgbG9uZyk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdGVfZnJlZV9rZXJuZWwoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHB0ZV90ICpwdGUpCit7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwdGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBwYWdlICpwdGUpCit7CisJX19mcmVlX3BhZ2UocHRlKTsKK30KKworCisjZGVmaW5lIF9fcHRlX2ZyZWVfdGxiKHRsYiwgcHRlKSB0bGJfcmVtb3ZlX3BhZ2UoKHRsYiksIChwdGUpKQorCisjZW5kaWYgLyogX0FTTV9QR0FMTE9DX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9wZ3RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1YzQ5NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvcGd0YWJsZS5oCkBAIC0wLDAgKzEsNDg5IEBACisvKiBNTjEwMzAwIFBhZ2UgdGFibGUgbWFuaXB1bGF0b3JzIGFuZCBjb25zdGFudHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoKKyAqIFRoZSBMaW51eCBtZW1vcnkgbWFuYWdlbWVudCBhc3N1bWVzIGEgdGhyZWUtbGV2ZWwgcGFnZSB0YWJsZSBzZXR1cC4gT24KKyAqIHRoZSBpMzg2LCB3ZSB1c2UgdGhhdCwgYnV0ICJmb2xkIiB0aGUgbWlkIGxldmVsIGludG8gdGhlIHRvcC1sZXZlbCBwYWdlCisgKiB0YWJsZSwgc28gdGhhdCB3ZSBwaHlzaWNhbGx5IGhhdmUgdGhlIHNhbWUgdHdvLWxldmVsIHBhZ2UgdGFibGUgYXMgdGhlCisgKiBpMzg2IG1tdSBleHBlY3RzLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZnVuY3Rpb25zIGFuZCBkZWZpbmVzIG5lY2Vzc2FyeSB0byBtb2RpZnkgYW5kIHVzZQorICogdGhlIGkzODYgcGFnZSB0YWJsZSB0cmVlIGZvciB0aGUgcHVycG9zZXMgb2YgdGhlIE1OMTAzMDAgVExCIGhhbmRsZXIKKyAqIGZ1bmN0aW9ucy4KKyAqLworI2lmbmRlZiBfQVNNX1BHVEFCTEVfSAorI2RlZmluZSBfQVNNX1BHVEFCTEVfSAorCisjaW5jbHVkZSA8YXNtL2NwdS1yZWdzLmg+CisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KKworI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworLyoKKyAqIFpFUk9fUEFHRSBpcyBhIGdsb2JhbCBzaGFyZWQgcGFnZSB0aGF0IGlzIGFsd2F5cyB6ZXJvOiB1c2VkCisgKiBmb3IgemVyby1tYXBwZWQgbWVtb3J5IGFyZWFzIGV0Yy4uCisgKi8KKyNkZWZpbmUgWkVST19QQUdFKHZhZGRyKSAodmlydF90b19wYWdlKGVtcHR5X3plcm9fcGFnZSkpCitleHRlcm4gdW5zaWduZWQgbG9uZyBlbXB0eV96ZXJvX3BhZ2VbMTAyNF07CitleHRlcm4gc3BpbmxvY2tfdCBwZ2RfbG9jazsKK2V4dGVybiBzdHJ1Y3QgcGFnZSAqcGdkX2xpc3Q7CisKK2V4dGVybiB2b2lkIHBtZF9jdG9yKHZvaWQgKiwgc3RydWN0IGttZW1fY2FjaGUgKiwgdW5zaWduZWQgbG9uZyk7CitleHRlcm4gdm9pZCBwZ3RhYmxlX2NhY2hlX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBwYWdpbmdfaW5pdCh2b2lkKTsKKworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworLyoKKyAqIFRoZSBMaW51eCBtbjEwMzAwIHBhZ2luZyBhcmNoaXRlY3R1cmUgb25seSBpbXBsZW1lbnRzIGJvdGggdGhlIHRyYWRpdGlvbmFsCisgKiAyLWxldmVsIHBhZ2UgdGFibGVzCisgKi8KKyNkZWZpbmUgUEdESVJfU0hJRlQJMjIKKyNkZWZpbmUgUFRSU19QRVJfUEdECTEwMjQKKyNkZWZpbmUgUFRSU19QRVJfUFVECTEJLyogd2UgZG9uJ3QgcmVhbGx5IGhhdmUgYW55IFBVRCBwaHlzaWNhbGx5ICovCisjZGVmaW5lIFBUUlNfUEVSX1BNRAkxCS8qIHdlIGRvbid0IHJlYWxseSBoYXZlIGFueSBQTUQgcGh5c2ljYWxseSAqLworI2RlZmluZSBQVFJTX1BFUl9QVEUJMTAyNAorCisjZGVmaW5lIFBHRF9TSVpFCVBBR0VfU0laRQorI2RlZmluZSBQTURfU0laRQkoMVVMIDw8IFBNRF9TSElGVCkKKyNkZWZpbmUgUEdESVJfU0laRQkoMVVMIDw8IFBHRElSX1NISUZUKQorI2RlZmluZSBQR0RJUl9NQVNLCSh+KFBHRElSX1NJWkUgLSAxKSkKKworI2RlZmluZSBVU0VSX1BUUlNfUEVSX1BHRAkoVEFTS19TSVpFIC8gUEdESVJfU0laRSkKKyNkZWZpbmUgRklSU1RfVVNFUl9BRERSRVNTCTAKKworI2RlZmluZSBVU0VSX1BHRF9QVFJTCQkoUEFHRV9PRkZTRVQgPj4gUEdESVJfU0hJRlQpCisjZGVmaW5lIEtFUk5FTF9QR0RfUFRSUwkJKFBUUlNfUEVSX1BHRCAtIFVTRVJfUEdEX1BUUlMpCisKKyNkZWZpbmUgVFdPTEVWRUxfUEdESVJfU0hJRlQJMjIKKyNkZWZpbmUgQk9PVF9VU0VSX1BHRF9QVFJTCShfX1BBR0VfT0ZGU0VUID4+IFRXT0xFVkVMX1BHRElSX1NISUZUKQorI2RlZmluZSBCT09UX0tFUk5FTF9QR0RfUFRSUwkoMTAyNCAtIEJPT1RfVVNFUl9QR0RfUFRSUykKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KK2V4dGVybiBwZ2RfdCBzd2FwcGVyX3BnX2RpcltQVFJTX1BFUl9QR0RdOworI2VuZGlmCisKKy8qCisgKiBVbmZvcnR1bmF0ZWx5LCBkdWUgdG8gdGhlIHdheSB0aGUgTU1VIHdvcmtzIG9uIHRoZSBNTjEwMzAwLCB0aGUgdm1hbGxvYyBWTQorICogYXJlYSBoYXMgdG8gYmUgaW4gdGhlIGxvd2VyIGhhbGYgb2YgdGhlIHZpcnR1YWwgYWRkcmVzcyByYW5nZSAodGhlIHVwcGVyCisgKiBoYWxmIGlzIG5vdCB0cmFuc2xhdGVkIHRocm91Z2ggdGhlIFRMQikuCisgKgorICogU28gaW4gdGhpcyBjYXNlLCB0aGUgdm1hbGxvYyBhcmVhIGdvZXMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgYWRkcmVzcyBtYXAKKyAqIChsZWF2aW5nIGEgaG9sZSBhdCB0aGUgdmVyeSBib3R0b20gdG8gY2F0Y2ggYWRkcmVzc2luZyBlcnJvcnMpLCBhbmQKKyAqIHVzZXJzcGFjZSBzdGFydHMgaW1tZWRpYXRlbHkgYWJvdmUuCisgKgorICogVGhlIHZtYWxsb2MoKSByb3V0aW5lcyBhbHNvIGxlYXZlcyBhIGhvbGUgb2YgNGtCIGJldHdlZW4gZWFjaCB2bWFsbG9jZWQKKyAqIGFyZWEgdG8gY2F0Y2ggYWRkcmVzc2luZyBlcnJvcnMuCisgKi8KKyNkZWZpbmUgVk1BTExPQ19PRkZTRVQJKDggKiAxMDI0ICogMTAyNCkKKyNkZWZpbmUgVk1BTExPQ19TVEFSVAkoMHg3MDAwMDAwMCkKKyNkZWZpbmUgVk1BTExPQ19FTkQJKDB4N0MwMDAwMDApCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCitleHRlcm4gcHRlX3Qga2VybmVsX3ZtYWxsb2NfcHRlc1soVk1BTExPQ19FTkQgLSBWTUFMTE9DX1NUQVJUKSAvIFBBR0VfU0laRV07CisjZW5kaWYKKworLyogSVBURUwvRFBURUwgYml0IGFzc2lnbm1lbnRzICovCisjZGVmaW5lIF9QQUdFX0JJVF9WQUxJRAkJeFBURUxfVl9CSVQKKyNkZWZpbmUgX1BBR0VfQklUX0FDQ0VTU0VECXhQVEVMX1VOVVNFRDFfQklUCS8qIG11c3RuJ3QgYmUgbG9hZGVkIGludG8gSVBURUwvRFBURUwgKi8KKyNkZWZpbmUgX1BBR0VfQklUX05YCQl4UFRFTF9VTlVTRUQyX0JJVAkvKiBtdXN0bid0IGJlIGxvYWRlZCBpbnRvIElQVEVML0RQVEVMICovCisjZGVmaW5lIF9QQUdFX0JJVF9DQUNIRQkJeFBURUxfQ19CSVQKKyNkZWZpbmUgX1BBR0VfQklUX1BSRVNFTlQJeFBURUxfUFZfQklUCisjZGVmaW5lIF9QQUdFX0JJVF9ESVJUWQkJeFBURUxfRF9CSVQKKyNkZWZpbmUgX1BBR0VfQklUX0dMT0JBTAl4UFRFTF9HX0JJVAorCisjZGVmaW5lIF9QQUdFX1ZBTElECQl4UFRFTF9WCisjZGVmaW5lIF9QQUdFX0FDQ0VTU0VECQl4UFRFTF9VTlVTRUQxCisjZGVmaW5lIF9QQUdFX05YCQl4UFRFTF9VTlVTRUQyCQkvKiBuby1leGVjdXRlIGJpdCAqLworI2RlZmluZSBfUEFHRV9DQUNIRQkJeFBURUxfQworI2RlZmluZSBfUEFHRV9QUkVTRU5UCQl4UFRFTF9QVgorI2RlZmluZSBfUEFHRV9ESVJUWQkJeFBURUxfRAorI2RlZmluZSBfUEFHRV9QUk9UCQl4UFRFTF9QUgorI2RlZmluZSBfUEFHRV9QUk9UX1JLTlUJCXhQVEVMX1BSX1JPSworI2RlZmluZSBfUEFHRV9QUk9UX1dLTlUJCXhQVEVMX1BSX1JXSworI2RlZmluZSBfUEFHRV9QUk9UX1JLUlUJCXhQVEVMX1BSX1JPS19ST1UKKyNkZWZpbmUgX1BBR0VfUFJPVF9XS1JVCQl4UFRFTF9QUl9SV0tfUk9VCisjZGVmaW5lIF9QQUdFX1BST1RfV0tXVQkJeFBURUxfUFJfUldLX1JXVQorI2RlZmluZSBfUEFHRV9HTE9CQUwJCXhQVEVMX0cKKyNkZWZpbmUgX1BBR0VfUFNFCQl4UFRFTF9QU180TWIJCS8qIDRNQiBwYWdlICovCisKKyNkZWZpbmUgX1BBR0VfRklMRQkJeFBURUxfVU5VU0VEMV9CSVQJLyogc2V0OnBhZ2VjYWNoZSB1bnNldDpzd2FwICovCisKKyNkZWZpbmUgX19QQUdFX1BST1RfVVdBVVgJMHgwNDAKKyNkZWZpbmUgX19QQUdFX1BST1RfVVNFUgkweDA4MAorI2RlZmluZSBfX1BBR0VfUFJPVF9XUklURQkweDEwMAorCisjZGVmaW5lIF9QQUdFX1BSRVNFTlRWCQkoX1BBR0VfUFJFU0VOVHxfUEFHRV9WQUxJRCkKKyNkZWZpbmUgX1BBR0VfUFJPVE5PTkUJCTB4MDAwCS8qIElmIG5vdCBwcmVzZW50ICovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNkZWZpbmUgVk1BTExPQ19WTUFERFIoeCkgKCh1bnNpZ25lZCBsb25nKSh4KSkKKworI2RlZmluZSBfUEFHRV9UQUJMRQkoX1BBR0VfUFJFU0VOVFYgfCBfUEFHRV9QUk9UX1dLTlUgfCBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0RJUlRZKQorI2RlZmluZSBfUEFHRV9DSEdfTUFTSwkoUFRFX01BU0sgfCBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0RJUlRZKQorCisjZGVmaW5lIF9fUEFHRV9OT05FCShfUEFHRV9QUkVTRU5UViB8IF9QQUdFX1BST1RfUktOVSB8IF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfQ0FDSEUpCisjZGVmaW5lIF9fUEFHRV9TSEFSRUQJKF9QQUdFX1BSRVNFTlRWIHwgX1BBR0VfUFJPVF9XS1dVIHwgX1BBR0VfQUNDRVNTRUQgfCBfUEFHRV9DQUNIRSkKKyNkZWZpbmUgX19QQUdFX0NPUFkJKF9QQUdFX1BSRVNFTlRWIHwgX1BBR0VfUFJPVF9SS1JVIHwgX1BBR0VfQUNDRVNTRUQgfCBfUEFHRV9DQUNIRSkKKyNkZWZpbmUgX19QQUdFX1JFQURPTkxZCShfUEFHRV9QUkVTRU5UViB8IF9QQUdFX1BST1RfUktSVSB8IF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfQ0FDSEUpCisKKyNkZWZpbmUgUEFHRV9OT05FCQlfX3BncHJvdChfX1BBR0VfTk9ORSAgICAgfCBfUEFHRV9OWCkKKyNkZWZpbmUgUEFHRV9TSEFSRURfTk9FWEVDCV9fcGdwcm90KF9fUEFHRV9TSEFSRUQgICB8IF9QQUdFX05YKQorI2RlZmluZSBQQUdFX0NPUFlfTk9FWEVDCV9fcGdwcm90KF9fUEFHRV9DT1BZICAgICB8IF9QQUdFX05YKQorI2RlZmluZSBQQUdFX1JFQURPTkxZX05PRVhFQwlfX3BncHJvdChfX1BBR0VfUkVBRE9OTFkgfCBfUEFHRV9OWCkKKyNkZWZpbmUgUEFHRV9TSEFSRURfRVhFQwlfX3BncHJvdChfX1BBR0VfU0hBUkVEKQorI2RlZmluZSBQQUdFX0NPUFlfRVhFQwkJX19wZ3Byb3QoX19QQUdFX0NPUFkpCisjZGVmaW5lIFBBR0VfUkVBRE9OTFlfRVhFQwlfX3BncHJvdChfX1BBR0VfUkVBRE9OTFkpCisjZGVmaW5lIFBBR0VfQ09QWQkJUEFHRV9DT1BZX05PRVhFQworI2RlZmluZSBQQUdFX1JFQURPTkxZCQlQQUdFX1JFQURPTkxZX05PRVhFQworI2RlZmluZSBQQUdFX1NIQVJFRAkJUEFHRV9TSEFSRURfRVhFQworCisjZGVmaW5lIF9fUEFHRV9LRVJORUxfQkFTRSAoX1BBR0VfUFJFU0VOVFYgfCBfUEFHRV9ESVJUWSB8IF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfR0xPQkFMKQorCisjZGVmaW5lIF9fUEFHRV9LRVJORUwJCShfX1BBR0VfS0VSTkVMX0JBU0UgfCBfUEFHRV9QUk9UX1dLTlUgfCBfUEFHRV9DQUNIRSB8IF9QQUdFX05YKQorI2RlZmluZSBfX1BBR0VfS0VSTkVMX05PQ0FDSEUJKF9fUEFHRV9LRVJORUxfQkFTRSB8IF9QQUdFX1BST1RfV0tOVSB8IF9QQUdFX05YKQorI2RlZmluZSBfX1BBR0VfS0VSTkVMX0VYRUMJKF9fUEFHRV9LRVJORUwgJiB+X1BBR0VfTlgpCisjZGVmaW5lIF9fUEFHRV9LRVJORUxfUk8JKF9fUEFHRV9LRVJORUxfQkFTRSB8IF9QQUdFX1BST1RfUktOVSB8IF9QQUdFX0NBQ0hFIHwgX1BBR0VfTlgpCisjZGVmaW5lIF9fUEFHRV9LRVJORUxfTEFSR0UJKF9fUEFHRV9LRVJORUwgfCBfUEFHRV9QU0UpCisjZGVmaW5lIF9fUEFHRV9LRVJORUxfTEFSR0VfRVhFQyAoX19QQUdFX0tFUk5FTF9FWEVDIHwgX1BBR0VfUFNFKQorCisjZGVmaW5lIFBBR0VfS0VSTkVMCQlfX3BncHJvdChfX1BBR0VfS0VSTkVMKQorI2RlZmluZSBQQUdFX0tFUk5FTF9STwkJX19wZ3Byb3QoX19QQUdFX0tFUk5FTF9STykKKyNkZWZpbmUgUEFHRV9LRVJORUxfRVhFQwlfX3BncHJvdChfX1BBR0VfS0VSTkVMX0VYRUMpCisjZGVmaW5lIFBBR0VfS0VSTkVMX05PQ0FDSEUJX19wZ3Byb3QoX19QQUdFX0tFUk5FTF9OT0NBQ0hFKQorI2RlZmluZSBQQUdFX0tFUk5FTF9MQVJHRQlfX3BncHJvdChfX1BBR0VfS0VSTkVMX0xBUkdFKQorI2RlZmluZSBQQUdFX0tFUk5FTF9MQVJHRV9FWEVDCV9fcGdwcm90KF9fUEFHRV9LRVJORUxfTEFSR0VfRVhFQykKKworLyoKKyAqIFdoaWxzdCB0aGUgTU4xMDMwMCBjYW4gZG8gcGFnZSBwcm90ZWN0aW9uIGZvciBleGVjdXRlIChnaXZlbiBzZXBhcmF0ZSBkYXRhCisgKiBhbmQgaW5zbiBUTEJzKSwgd2UgYXJlIG5vdCBzdXBwb3J0aW5nIGl0IGF0IHRoZSBtb21lbnQuIFdyaXRlIHBlcm1pc3Npb24sCisgKiBob3dldmVyLCBhbHdheXMgaW1wbGllcyByZWFkIHBlcm1pc3Npb24gKGJ1dCBub3QgZXhlY3V0ZSBwZXJtaXNzaW9uKS4KKyAqLworI2RlZmluZSBfX1AwMDAJUEFHRV9OT05FCisjZGVmaW5lIF9fUDAwMQlQQUdFX1JFQURPTkxZX05PRVhFQworI2RlZmluZSBfX1AwMTAJUEFHRV9DT1BZX05PRVhFQworI2RlZmluZSBfX1AwMTEJUEFHRV9DT1BZX05PRVhFQworI2RlZmluZSBfX1AxMDAJUEFHRV9SRUFET05MWV9FWEVDCisjZGVmaW5lIF9fUDEwMQlQQUdFX1JFQURPTkxZX0VYRUMKKyNkZWZpbmUgX19QMTEwCVBBR0VfQ09QWV9FWEVDCisjZGVmaW5lIF9fUDExMQlQQUdFX0NPUFlfRVhFQworCisjZGVmaW5lIF9fUzAwMAlQQUdFX05PTkUKKyNkZWZpbmUgX19TMDAxCVBBR0VfUkVBRE9OTFlfTk9FWEVDCisjZGVmaW5lIF9fUzAxMAlQQUdFX1NIQVJFRF9OT0VYRUMKKyNkZWZpbmUgX19TMDExCVBBR0VfU0hBUkVEX05PRVhFQworI2RlZmluZSBfX1MxMDAJUEFHRV9SRUFET05MWV9FWEVDCisjZGVmaW5lIF9fUzEwMQlQQUdFX1JFQURPTkxZX0VYRUMKKyNkZWZpbmUgX19TMTEwCVBBR0VfU0hBUkVEX0VYRUMKKyNkZWZpbmUgX19TMTExCVBBR0VfU0hBUkVEX0VYRUMKKworLyoKKyAqIERlZmluZSB0aGlzIHRvIHdhcm4gYWJvdXQga2VybmVsIG1lbW9yeSBhY2Nlc3NlcyB0aGF0IGFyZQorICogZG9uZSB3aXRob3V0IGEgJ3ZlcmlmeV9hcmVhKFZFUklGWV9XUklURSwuLiknCisgKi8KKyN1bmRlZiBURVNUX1ZFUklGWV9BUkVBCisKKyNkZWZpbmUgcHRlX3ByZXNlbnQoeCkJKHB0ZV92YWwoeCkgJiBfUEFHRV9WQUxJRCkKKyNkZWZpbmUgcHRlX2NsZWFyKG1tLCBhZGRyLCB4cCkJCQkJXAorZG8gewkJCQkJCQlcCisJc2V0X3B0ZV9hdCgobW0pLCAoYWRkciksICh4cCksIF9fcHRlKDApKTsJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBwbWRfbm9uZSh4KQkoIXBtZF92YWwoeCkpCisjZGVmaW5lIHBtZF9wcmVzZW50KHgpCSghcG1kX25vbmUoeCkpCisjZGVmaW5lIHBtZF9jbGVhcih4cCkJZG8geyBzZXRfcG1kKHhwLCBfX3BtZCgwKSk7IH0gd2hpbGUgKDApCisjZGVmaW5lCXBtZF9iYWQoeCkJMAorCisKKyNkZWZpbmUgcGFnZXNfdG9fbWIoeCkgKCh4KSA+PiAoMjAgLSBQQUdFX1NISUZUKSkKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KKyAqIFVuZGVmaW5lZCBiZWhhdmlvdXIgaWYgbm90Li4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcHRlX3VzZXIocHRlX3QgcHRlKQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfX1BBR0VfUFJPVF9VU0VSOyB9CitzdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9fUEFHRV9QUk9UX1VTRVI7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0RJUlRZOyB9CitzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9BQ0NFU1NFRDsgfQorc3RhdGljIGlubGluZSBpbnQgcHRlX3dyaXRlKHB0ZV90IHB0ZSkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX19QQUdFX1BST1RfV1JJVEU7IH0KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgb25seSB3b3JrcyBpZiBwdGVfcHJlc2VudCgpIGlzIG5vdCB0cnVlLgorICovCitzdGF0aWMgaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0ZJTEU7IH0KKworc3RhdGljIGlubGluZSBwdGVfdCBwdGVfcmRwcm90ZWN0KHB0ZV90IHB0ZSkKK3sKKwlwdGVfdmFsKHB0ZSkgJj0gfihfX1BBR0VfUFJPVF9VU0VSfF9fUEFHRV9QUk9UX1VXQVVYKTsgcmV0dXJuIHB0ZTsKK30KK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX2V4cHJvdGVjdChwdGVfdCBwdGUpCit7CisJcHRlX3ZhbChwdGUpIHw9IF9QQUdFX05YOyByZXR1cm4gcHRlOworfQorCitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKQoreworCXB0ZV92YWwocHRlKSAmPSB+KF9fUEFHRV9QUk9UX1dSSVRFfF9fUEFHRV9QUk9UX1VXQVVYKTsgcmV0dXJuIHB0ZTsKK30KKworc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtjbGVhbihwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9ESVJUWTsgcmV0dXJuIHB0ZTsgfQorc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtvbGQocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9ESVJUWTsgcmV0dXJuIHB0ZTsgfQorc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt5b3VuZyhwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0FDQ0VTU0VEOyByZXR1cm4gcHRlOyB9CitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSAmPSB+X1BBR0VfTlg7IHJldHVybiBwdGU7IH0KKworc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkKK3sKKwlwdGVfdmFsKHB0ZSkgfD0gX19QQUdFX1BST1RfVVNFUjsKKwlpZiAocHRlX3dyaXRlKHB0ZSkpCisJCXB0ZV92YWwocHRlKSB8PSBfX1BBR0VfUFJPVF9VV0FVWDsKKwlyZXR1cm4gcHRlOworfQorc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt3cml0ZShwdGVfdCBwdGUpCit7CisJcHRlX3ZhbChwdGUpIHw9IF9fUEFHRV9QUk9UX1dSSVRFOworCWlmIChwdGVfdmFsKHB0ZSkgJiBfX1BBR0VfUFJPVF9VU0VSKQorCQlwdGVfdmFsKHB0ZSkgfD0gX19QQUdFX1BST1RfVVdBVVg7CisJcmV0dXJuIHB0ZTsKK30KKworI2RlZmluZSBwdGVfRVJST1IoZSkgXAorCXByaW50ayhLRVJOX0VSUiAiJXM6JWQ6IGJhZCBwdGUgJTA4bHguXG4iLCBcCisJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgcHRlX3ZhbChlKSkKKyNkZWZpbmUgcGdkX0VSUk9SKGUpIFwKKwlwcmludGsoS0VSTl9FUlIgIiVzOiVkOiBiYWQgcGdkICUwOGx4LlxuIiwgXAorCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIHBnZF92YWwoZSkpCisKKy8qCisgKiBUaGUgInBnZF94eHgoKSIgZnVuY3Rpb25zIGhlcmUgYXJlIHRyaXZpYWwgZm9yIGEgZm9sZGVkIHR3by1sZXZlbAorICogc2V0dXA6IHRoZSBwZ2QgaXMgbmV2ZXIgYmFkLCBhbmQgYSBwbWQgYWx3YXlzIGV4aXN0cyAoYXMgaXQncyBmb2xkZWQKKyAqIGludG8gdGhlIHBnZCBlbnRyeSkKKyAqLworI2RlZmluZSBwZ2RfY2xlYXIoeHApCQkJCWRvIHsgfSB3aGlsZSAoMCkKKworLyoKKyAqIENlcnRhaW4gYXJjaGl0ZWN0dXJlcyBuZWVkIHRvIGRvIHNwZWNpYWwgdGhpbmdzIHdoZW4gUFRFcworICogd2l0aGluIGEgcGFnZSB0YWJsZSBhcmUgZGlyZWN0bHkgbW9kaWZpZWQuICBUaHVzLCB0aGUgZm9sbG93aW5nCisgKiBob29rIGlzIG1hZGUgYXZhaWxhYmxlLgorICovCisjZGVmaW5lIHNldF9wdGUocHRlcHRyLCBwdGV2YWwpCQkJKCoocHRlcHRyKSA9IHB0ZXZhbCkKKyNkZWZpbmUgc2V0X3B0ZV9hdChtbSwgYWRkciwgcHRlcCwgcHRldmFsKQlzZXRfcHRlKChwdGVwKSwgKHB0ZXZhbCkpCisjZGVmaW5lIHNldF9wdGVfYXRvbWljKHB0ZXB0ciwgcHRldmFsKQkJc2V0X3B0ZSgocHRlcHRyKSwgKHB0ZXZhbCkpCisKKy8qCisgKiAocG1kcyBhcmUgZm9sZGVkIGludG8gcGdkcyBzbyB0aGlzIGRvZXNuJ3QgZ2V0IGFjdHVhbGx5IGNhbGxlZCwKKyAqIGJ1dCB0aGUgZGVmaW5lIGlzIG5lZWRlZCBmb3IgYSBnZW5lcmljIGlubGluZSBmdW5jdGlvbi4pCisgKi8KKyNkZWZpbmUgc2V0X3BtZChwbWRwdHIsIHBtZHZhbCkgKCoocG1kcHRyKSA9IHBtZHZhbCkKKworI2RlZmluZSBwdGVwX2dldF9hbmRfY2xlYXIobW0sIGFkZHIsIHB0ZXApIFwKKwlfX3B0ZSh4Y2hnKCYocHRlcCktPnB0ZSwgMCkpCisjZGVmaW5lIHB0ZV9zYW1lKGEsIGIpCQkocHRlX3ZhbChhKSA9PSBwdGVfdmFsKGIpKQorI2RlZmluZSBwdGVfcGFnZSh4KQkJcGZuX3RvX3BhZ2UocHRlX3Bmbih4KSkKKyNkZWZpbmUgcHRlX25vbmUoeCkJCSghcHRlX3ZhbCh4KSkKKyNkZWZpbmUgcHRlX3Bmbih4KQkJKCh1bnNpZ25lZCBsb25nKSAocHRlX3ZhbCh4KSA+PiBQQUdFX1NISUZUKSkKKyNkZWZpbmUgX19wZm5fYWRkcihwZm4pCQkoKHBmbikgPDwgUEFHRV9TSElGVCkKKyNkZWZpbmUgcGZuX3B0ZShwZm4sIHByb3QpCV9fcHRlKF9fcGZuX2FkZHIocGZuKSB8IHBncHJvdF92YWwocHJvdCkpCisjZGVmaW5lIHBmbl9wbWQocGZuLCBwcm90KQlfX3BtZChfX3Bmbl9hZGRyKHBmbikgfCBwZ3Byb3RfdmFsKHByb3QpKQorCisvKgorICogQWxsIHByZXNlbnQgdXNlciBwYWdlcyBhcmUgdXNlci1leGVjdXRhYmxlOgorICovCitzdGF0aWMgaW5saW5lIGludCBwdGVfZXhlYyhwdGVfdCBwdGUpCit7CisJcmV0dXJuIHB0ZV91c2VyKHB0ZSk7Cit9CisKKy8qCisgKiBBbGwgcHJlc2VudCBwYWdlcyBhcmUga2VybmVsLWV4ZWN1dGFibGU6CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjX2tlcm5lbChwdGVfdCBwdGUpCit7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBCaXRzIDAgYW5kIDEgYXJlIHRha2VuLCBzcGxpdCB1cCB0aGUgMjkgYml0cyBvZiBvZmZzZXQKKyAqIGludG8gdGhpcyByYW5nZToKKyAqLworI2RlZmluZSBQVEVfRklMRV9NQVhfQklUUwkyOQorCisjZGVmaW5lIHB0ZV90b19wZ29mZihwdGUpCShwdGVfdmFsKHB0ZSkgPj4gMikKKyNkZWZpbmUgcGdvZmZfdG9fcHRlKG9mZikJX19wdGUoKG9mZikgPDwgMiB8IF9QQUdFX0ZJTEUpCisKKy8qIEVuY29kZSBhbmQgZGUtY29kZSBhIHN3YXAgZW50cnkgKi8KKyNkZWZpbmUgX19zd3BfdHlwZSh4KQkJCSgoKHgpLnZhbCA+PiAyKSAmIDB4M2YpCisjZGVmaW5lIF9fc3dwX29mZnNldCh4KQkJCSgoeCkudmFsID4+IDgpCisjZGVmaW5lIF9fc3dwX2VudHJ5KHR5cGUsIG9mZnNldCkgXAorCSgoc3dwX2VudHJ5X3QpIHsgKCh0eXBlKSA8PCAyKSB8ICgob2Zmc2V0KSA8PCA4KSB9KQorI2RlZmluZSBfX3B0ZV90b19zd3BfZW50cnkocHRlKQkJKChzd3BfZW50cnlfdCkgeyBwdGVfdmFsKHB0ZSkgfSkKKyNkZWZpbmUgX19zd3BfZW50cnlfdG9fcHRlKHgpCQlfX3B0ZSgoeCkudmFsKQorCitzdGF0aWMgaW5saW5lCitpbnQgcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJICAgICAgcHRlX3QgKnB0ZXApCit7CisJaWYgKCFwdGVfZGlydHkoKnB0ZXApKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gdGVzdF9hbmRfY2xlYXJfYml0KF9QQUdFX0JJVF9ESVJUWSwgJnB0ZXAtPnB0ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUKK2ludCBwdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkgICAgICBwdGVfdCAqcHRlcCkKK3sKKwlpZiAoIXB0ZV95b3VuZygqcHRlcCkpCisJCXJldHVybiAwOworCXJldHVybiB0ZXN0X2FuZF9jbGVhcl9iaXQoX1BBR0VfQklUX0FDQ0VTU0VELCAmcHRlcC0+cHRlKTsKK30KKworc3RhdGljIGlubGluZQordm9pZCBwdGVwX3NldF93cnByb3RlY3Qoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCit7CisJcHRlX3ZhbCgqcHRlcCkgJj0gfihfX1BBR0VfUFJPVF9XUklURXxfX1BBR0VfUFJPVF9VV0FVWCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdGVwX21rZGlydHkocHRlX3QgKnB0ZXApCit7CisJc2V0X2JpdChfUEFHRV9CSVRfRElSVFksICZwdGVwLT5wdGUpOworfQorCisvKgorICogTWFjcm8gdG8gbWFyayBhIHBhZ2UgcHJvdGVjdGlvbiB2YWx1ZSBhcyAidW5jYWNoZWFibGUiLiAgT24gcHJvY2Vzc29ycyB3aGljaAorICogZG8gbm90IHN1cHBvcnQgaXQsIHRoaXMgaXMgYSBuby1vcC4KKyAqLworI2RlZmluZSBwZ3Byb3Rfbm9uY2FjaGVkKHByb3QpCV9fcGdwcm90KHBncHJvdF92YWwocHJvdCkgfCBfUEFHRV9DQUNIRSkKKworCisvKgorICogQ29udmVyc2lvbiBmdW5jdGlvbnM6IGNvbnZlcnQgYSBwYWdlIGFuZCBwcm90ZWN0aW9uIHRvIGEgcGFnZSBlbnRyeSwKKyAqIGFuZCBhIHBhZ2UgZW50cnkgYW5kIHBhZ2UgZGlyZWN0b3J5IHRvIHRoZSBwYWdlIHRoZXkgcmVmZXIgdG8uCisgKi8KKworI2RlZmluZSBta19wdGUocGFnZSwgcGdwcm90KQlwZm5fcHRlKHBhZ2VfdG9fcGZuKHBhZ2UpLCAocGdwcm90KSkKKyNkZWZpbmUgbWtfcHRlX2h1Z2UoZW50cnkpIFwKKwkoKGVudHJ5KS5wdGUgfD0gX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1BTRSB8IF9QQUdFX1ZBTElEKQorCitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9tb2RpZnkocHRlX3QgcHRlLCBwZ3Byb3RfdCBuZXdwcm90KQoreworCXB0ZV92YWwocHRlKSAmPSBfUEFHRV9DSEdfTUFTSzsKKwlwdGVfdmFsKHB0ZSkgfD0gcGdwcm90X3ZhbChuZXdwcm90KTsKKwlyZXR1cm4gcHRlOworfQorCisjZGVmaW5lIHBhZ2VfcHRlKHBhZ2UpCXBhZ2VfcHRlX3Byb3QoKHBhZ2UpLCBfX3BncHJvdCgwKSkKKworI2RlZmluZSBwbWRfcGFnZV9rZXJuZWwocG1kKSBcCisJKCh1bnNpZ25lZCBsb25nKSBfX3ZhKHBtZF92YWwocG1kKSAmIFBBR0VfTUFTSykpCisKKyNkZWZpbmUgcG1kX3BhZ2UocG1kKQlwZm5fdG9fcGFnZShwbWRfdmFsKHBtZCkgPj4gUEFHRV9TSElGVCkKKworI2RlZmluZSBwbWRfbGFyZ2UocG1kKSBcCisJKChwbWRfdmFsKHBtZCkgJiAoX1BBR0VfUFNFIHwgX1BBR0VfUFJFU0VOVCkpID09IFwKKwkgKF9QQUdFX1BTRSB8IF9QQUdFX1BSRVNFTlQpKQorCisvKgorICogdGhlIHBnZCBwYWdlIGNhbiBiZSB0aG91Z2h0IG9mIGFuIGFycmF5IGxpa2UgdGhpczogcGdkX3RbUFRSU19QRVJfUEdEXQorICoKKyAqIHRoaXMgbWFjcm8gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGVudHJ5IGluIHRoZSBwZ2QgcGFnZSB3aGljaCB3b3VsZAorICogY29udHJvbCB0aGUgZ2l2ZW4gdmlydHVhbCBhZGRyZXNzCisgKi8KKyNkZWZpbmUgcGdkX2luZGV4KGFkZHJlc3MpICgoKGFkZHJlc3MpID4+IFBHRElSX1NISUZUKSAmIChQVFJTX1BFUl9QR0QgLSAxKSkKKworLyoKKyAqIHBnZF9vZmZzZXQoKSByZXR1cm5zIGEgKHBnZF90ICopCisgKiBwZ2RfaW5kZXgoKSBpcyB1c2VkIGdldCB0aGUgb2Zmc2V0IGludG8gdGhlIHBnZCBwYWdlJ3MgYXJyYXkgb2YgcGdkX3QnczsKKyAqLworI2RlZmluZSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyZXNzKQkoKG1tKS0+cGdkICsgcGdkX2luZGV4KGFkZHJlc3MpKQorCisvKgorICogYSBzaG9ydGN1dCB3aGljaCBpbXBsaWVzIHRoZSB1c2Ugb2YgdGhlIGtlcm5lbCdzIHBnZCwgaW5zdGVhZAorICogb2YgYSBwcm9jZXNzJ3MKKyAqLworI2RlZmluZSBwZ2Rfb2Zmc2V0X2soYWRkcmVzcykJcGdkX29mZnNldCgmaW5pdF9tbSwgYWRkcmVzcykKKworLyoKKyAqIHRoZSBwbWQgcGFnZSBjYW4gYmUgdGhvdWdodCBvZiBhbiBhcnJheSBsaWtlIHRoaXM6IHBtZF90W1BUUlNfUEVSX1BNRF0KKyAqCisgKiB0aGlzIG1hY3JvIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBlbnRyeSBpbiB0aGUgcG1kIHBhZ2Ugd2hpY2ggd291bGQKKyAqIGNvbnRyb2wgdGhlIGdpdmVuIHZpcnR1YWwgYWRkcmVzcworICovCisjZGVmaW5lIHBtZF9pbmRleChhZGRyZXNzKSBcCisJKCgoYWRkcmVzcykgPj4gUE1EX1NISUZUKSAmIChQVFJTX1BFUl9QTUQgLSAxKSkKKworLyoKKyAqIHRoZSBwdGUgcGFnZSBjYW4gYmUgdGhvdWdodCBvZiBhbiBhcnJheSBsaWtlIHRoaXM6IHB0ZV90W1BUUlNfUEVSX1BURV0KKyAqCisgKiB0aGlzIG1hY3JvIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBlbnRyeSBpbiB0aGUgcHRlIHBhZ2Ugd2hpY2ggd291bGQKKyAqIGNvbnRyb2wgdGhlIGdpdmVuIHZpcnR1YWwgYWRkcmVzcworICovCisjZGVmaW5lIHB0ZV9pbmRleChhZGRyZXNzKSBcCisJKCgoYWRkcmVzcykgPj4gUEFHRV9TSElGVCkgJiAoUFRSU19QRVJfUFRFIC0gMSkpCisKKyNkZWZpbmUgcHRlX29mZnNldF9rZXJuZWwoZGlyLCBhZGRyZXNzKSBcCisJKChwdGVfdCAqKSBwbWRfcGFnZV9rZXJuZWwoKihkaXIpKSArICBwdGVfaW5kZXgoYWRkcmVzcykpCisKKy8qCisgKiBNYWtlIGEgZ2l2ZW4ga2VybmVsIHRleHQgcGFnZSBleGVjdXRhYmxlL25vbi1leGVjdXRhYmxlLgorICogUmV0dXJucyB0aGUgcHJldmlvdXMgZXhlY3V0YWJpbGl0eSBzZXR0aW5nIG9mIHRoYXQgcGFnZSAod2hpY2gKKyAqIGlzIHVzZWQgdG8gcmVzdG9yZSB0aGUgcHJldmlvdXMgc3RhdGUpLiBVc2VkIGJ5IHRoZSBTTVAgYm9vdHVwIGNvZGUuCisgKiBOT1RFOiB0aGlzIGlzIGFuIF9faW5pdCBmdW5jdGlvbiBmb3Igc2VjdXJpdHkgcmVhc29ucy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgc2V0X2tlcm5lbF9leGVjKHVuc2lnbmVkIGxvbmcgdmFkZHIsIGludCBlbmFibGUpCit7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgcHRlX29mZnNldF9tYXAoZGlyLCBhZGRyZXNzKSBcCisJKChwdGVfdCAqKSBwYWdlX2FkZHJlc3MocG1kX3BhZ2UoKihkaXIpKSkgKyBwdGVfaW5kZXgoYWRkcmVzcykpCisjZGVmaW5lIHB0ZV9vZmZzZXRfbWFwX25lc3RlZChkaXIsIGFkZHJlc3MpIHB0ZV9vZmZzZXRfbWFwKGRpciwgYWRkcmVzcykKKyNkZWZpbmUgcHRlX3VubWFwKHB0ZSkJCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBwdGVfdW5tYXBfbmVzdGVkKHB0ZSkJZG8ge30gd2hpbGUgKDApCisKKy8qCisgKiBUaGUgTU4xMDMwMCBoYXMgZXh0ZXJuYWwgTU1VIGluZm8gaW4gdGhlIGZvcm0gb2YgYSBUTEI6IHRoaXMgaXMgYWRhcHRlZCBmcm9tCisgKiB0aGUga2VybmVsIHBhZ2UgdGFibGVzIGNvbnRhaW5pbmcgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBieSB0bGItbW4xMDMwMC5TCisgKi8KK2V4dGVybiB2b2lkIHVwZGF0ZV9tbXVfY2FjaGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgcHRlKTsKKworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworI2RlZmluZSBrZXJuX2FkZHJfdmFsaWQoYWRkcikJKDEpCisKKyNkZWZpbmUgaW9fcmVtYXBfcGZuX3JhbmdlKHZtYSwgdmFkZHIsIHBmbiwgc2l6ZSwgcHJvdCkgXAorCXJlbWFwX3Bmbl9yYW5nZSgodm1hKSwgKHZhZGRyKSwgKHBmbiksIChzaXplKSwgKHByb3QpKQorCisjZGVmaW5lIE1LX0lPU1BBQ0VfUEZOKHNwYWNlLCBwZm4pCShwZm4pCisjZGVmaW5lIEdFVF9JT1NQQUNFKHBmbikJCTAKKyNkZWZpbmUgR0VUX1BGTihwZm4pCQkJKHBmbikKKworI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX1RFU1RfQU5EX0NMRUFSX1lPVU5HCisjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfRElSVFkKKyNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9HRVRfQU5EX0NMRUFSCisjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfU0VUX1dSUFJPVEVDVAorI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX01LRElSVFkKKyNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFX1NBTUUKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wZ3RhYmxlLmg+CisKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfQVNNX1BHVEFCTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9waW8tcmVncy5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9waW8tcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YmM4MTgyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9waW8tcmVncy5oCkBAIC0wLDAgKzEsMjMzIEBACisvKiBNTjEwMzAwIE9uLWJvYXJkIEkvTyBwb3J0IG1vZHVsZSByZWdpc3RlcnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9QSU9fUkVHU19ICisjZGVmaW5lIF9BU01fUElPX1JFR1NfSAorCisjaW5jbHVkZSA8YXNtL2NwdS1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL2ludGN0bC1yZWdzLmg+CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qIEkvTyBwb3J0IDAgKi8KKyNkZWZpbmUJUDBNRAkJCV9fU1lTUkVHKDB4ZGIwMDAwMDAsIHUxNikJLyogbW9kZSByZWcgKi8KKyNkZWZpbmUgUDBNRF8wCQkJMHgwMDAzCS8qIG1hc2sgKi8KKyNkZWZpbmUgUDBNRF8wX0lOCQkweDAwMDAJLyogaW5wdXQgbW9kZSAqLworI2RlZmluZSBQME1EXzBfT1VUCQkweDAwMDEJLyogb3V0cHV0IG1vZGUgKi8KKyNkZWZpbmUgUDBNRF8wX1RNMElPCQkweDAwMDIJLyogdGltZXIgMCBJL08gbW9kZSAqLworI2RlZmluZSBQME1EXzBfRVlFQ0xLCQkweDAwMDMJLyogdGVzdCBzaWduYWwgb3V0cHV0IChjbG9jaykgKi8KKyNkZWZpbmUgUDBNRF8xCQkJMHgwMDBjCisjZGVmaW5lIFAwTURfMV9JTgkJMHgwMDAwCisjZGVmaW5lIFAwTURfMV9PVVQJCTB4MDAwNAorI2RlZmluZSBQME1EXzFfVE0xSU8JCTB4MDAwOAkvKiB0aW1lciAxIEkvTyBtb2RlICovCisjZGVmaW5lIFAwTURfMV9FWUVECQkweDAwMGMJLyogdGVzdCBzaWduYWwgb3V0cHV0IChkYXRhKSAqLworI2RlZmluZSBQME1EXzIJCQkweDAwMzAKKyNkZWZpbmUgUDBNRF8yX0lOCQkweDAwMDAKKyNkZWZpbmUgUDBNRF8yX09VVAkJMHgwMDEwCisjZGVmaW5lIFAwTURfMl9UTTJJTwkJMHgwMDIwCS8qIHRpbWVyIDIgSS9PIG1vZGUgKi8KKyNkZWZpbmUgUDBNRF8zCQkJMHgwMGMwCisjZGVmaW5lIFAwTURfM19JTgkJMHgwMDAwCisjZGVmaW5lIFAwTURfM19PVVQJCTB4MDA0MAorI2RlZmluZSBQME1EXzNfVE0zSU8JCTB4MDA4MAkvKiB0aW1lciAzIEkvTyBtb2RlICovCisjZGVmaW5lIFAwTURfNAkJCTB4MDMwMAorI2RlZmluZSBQME1EXzRfSU4JCTB4MDAwMAorI2RlZmluZSBQME1EXzRfT1VUCQkweDAxMDAKKyNkZWZpbmUgUDBNRF80X1RNNElPCQkweDAyMDAJLyogdGltZXIgNCBJL08gbW9kZSAqLworI2RlZmluZSBQME1EXzRfWENUUwkJMHgwMzAwCS8qIFhDVFMgaW5wdXQgZm9yIHNlcmlhbCBwb3J0IDIgKi8KKyNkZWZpbmUgUDBNRF81CQkJMHgwYzAwCisjZGVmaW5lIFAwTURfNV9JTgkJMHgwMDAwCisjZGVmaW5lIFAwTURfNV9PVVQJCTB4MDQwMAorI2RlZmluZSBQME1EXzVfVE01SU8JCTB4MDgwMAkvKiB0aW1lciA1IEkvTyBtb2RlICovCisjZGVmaW5lIFAwTURfNgkJCTB4MzAwMAorI2RlZmluZSBQME1EXzZfSU4JCTB4MDAwMAorI2RlZmluZSBQME1EXzZfT1VUCQkweDEwMDAKKyNkZWZpbmUgUDBNRF82X1RNNklPQQkJMHgyMDAwCS8qIHRpbWVyIDYgSS9PIG1vZGUgQSAqLworI2RlZmluZSBQME1EXzcJCQkweGMwMDAKKyNkZWZpbmUgUDBNRF83X0lOCQkweDAwMDAKKyNkZWZpbmUgUDBNRF83X09VVAkJMHg0MDAwCisjZGVmaW5lIFAwTURfN19UTTZJT0IJCTB4ODAwMAkvKiB0aW1lciA2IEkvTyBtb2RlIEIgKi8KKworI2RlZmluZQlQMElOCQkJX19TWVNSRUcoMHhkYjAwMDAwNCwgdTgpCS8qIGluIHJlZyAqLworI2RlZmluZQlQME9VVAkJCV9fU1lTUkVHKDB4ZGIwMDAwMDgsIHU4KQkvKiBvdXQgcmVnICovCisKKyNkZWZpbmUJUDBUTUlPCQkJX19TWVNSRUcoMHhkYjAwMDAwYywgdTgpCS8qIFRNIHBpbiBJL08gY29udHJvbCByZWcgKi8KKyNkZWZpbmUgUDBUTUlPX1RNMF9JTgkJMHgwMAorI2RlZmluZSBQMFRNSU9fVE0wX09VVAkJMHgwMQorI2RlZmluZSBQMFRNSU9fVE0xX0lOCQkweDAwCisjZGVmaW5lIFAwVE1JT19UTTFfT1VUCQkweDAyCisjZGVmaW5lIFAwVE1JT19UTTJfSU4JCTB4MDAKKyNkZWZpbmUgUDBUTUlPX1RNMl9PVVQJCTB4MDQKKyNkZWZpbmUgUDBUTUlPX1RNM19JTgkJMHgwMAorI2RlZmluZSBQMFRNSU9fVE0zX09VVAkJMHgwOAorI2RlZmluZSBQMFRNSU9fVE00X0lOCQkweDAwCisjZGVmaW5lIFAwVE1JT19UTTRfT1VUCQkweDEwCisjZGVmaW5lIFAwVE1JT19UTTVfSU4JCTB4MDAKKyNkZWZpbmUgUDBUTUlPX1RNNV9PVVQJCTB4MjAKKyNkZWZpbmUgUDBUTUlPX1RNNkFfSU4JCTB4MDAKKyNkZWZpbmUgUDBUTUlPX1RNNkFfT1VUCQkweDQwCisjZGVmaW5lIFAwVE1JT19UTTZCX0lOCQkweDAwCisjZGVmaW5lIFAwVE1JT19UTTZCX09VVAkJMHg4MAorCisvKiBJL08gcG9ydCAxICovCisjZGVmaW5lCVAxTUQJCQlfX1NZU1JFRygweGRiMDAwMTAwLCB1MTYpCS8qIG1vZGUgcmVnICovCisjZGVmaW5lIFAxTURfMAkJCTB4MDAwMwkvKiBtYXNrICovCisjZGVmaW5lIFAxTURfMF9JTgkJMHgwMDAwCS8qIGlucHV0IG1vZGUgKi8KKyNkZWZpbmUgUDFNRF8wX09VVAkJMHgwMDAxCS8qIG91dHB1dCBtb2RlICovCisjZGVmaW5lIFAxTURfMF9UTTdJTwkJMHgwMDAyCS8qIHRpbWVyIDcgSS9PIG1vZGUgKi8KKyNkZWZpbmUgUDFNRF8wX0FEVFJHCQkweDAwMDMJLyogQS9EIGNvbnZlcnRlciB0cmlnZ2VyIG1vZGUgKi8KKyNkZWZpbmUgUDFNRF8xCQkJMHgwMDBjCisjZGVmaW5lIFAxTURfMV9JTgkJMHgwMDAwCisjZGVmaW5lIFAxTURfMV9PVVQJCTB4MDAwNAorI2RlZmluZSBQMU1EXzFfVE04SU8JCTB4MDAwOAkvKiB0aW1lciA4IEkvTyBtb2RlICovCisjZGVmaW5lIFAxTURfMV9YRE1SMAkJMHgwMDBjCS8qIERNQSByZXF1ZXN0IGlucHV0IDAgbW9kZSAqLworI2RlZmluZSBQMU1EXzIJCQkweDAwMzAKKyNkZWZpbmUgUDFNRF8yX0lOCQkweDAwMDAKKyNkZWZpbmUgUDFNRF8yX09VVAkJMHgwMDEwCisjZGVmaW5lIFAxTURfMl9UTTlJTwkJMHgwMDIwCS8qIHRpbWVyIDkgSS9PIG1vZGUgKi8KKyNkZWZpbmUgUDFNRF8yX1hETVIxCQkweDAwMzAJLyogRE1BIHJlcXVlc3QgaW5wdXQgMSBtb2RlICovCisjZGVmaW5lIFAxTURfMwkJCTB4MDBjMAorI2RlZmluZSBQMU1EXzNfSU4JCTB4MDAwMAorI2RlZmluZSBQMU1EXzNfT1VUCQkweDAwNDAKKyNkZWZpbmUgUDFNRF8zX1RNMTBJTwkJMHgwMDgwCS8qIHRpbWVyIDEwIEkvTyBtb2RlICovCisjZGVmaW5lIFAxTURfM19GUlFTMAkJMHgwMGMwCS8qIENQVSBjbG9jayBtdWx0aXBsaWVyIHNldHRpbmcgaW5wdXQgMCBtb2RlICovCisjZGVmaW5lIFAxTURfNAkJCTB4MDMwMAorI2RlZmluZSBQMU1EXzRfSU4JCTB4MDAwMAorI2RlZmluZSBQMU1EXzRfT1VUCQkweDAxMDAKKyNkZWZpbmUgUDFNRF80X1RNMTFJTwkJMHgwMjAwCS8qIHRpbWVyIDExIEkvTyBtb2RlICovCisjZGVmaW5lIFAxTURfNF9GUlFTMQkJMHgwMzAwCS8qIENQVSBjbG9jayBtdWx0aXBsaWVyIHNldHRpbmcgaW5wdXQgMSBtb2RlICovCisKKyNkZWZpbmUJUDFJTgkJCV9fU1lTUkVHKDB4ZGIwMDAxMDQsIHU4KQkvKiBpbiByZWcgKi8KKyNkZWZpbmUJUDFPVVQJCQlfX1NZU1JFRygweGRiMDAwMTA4LCB1OCkJLyogb3V0IHJlZyAqLworI2RlZmluZQlQMVRNSU8JCQlfX1NZU1JFRygweGRiMDAwMTBjLCB1OCkJLyogVE0gcGluIEkvTyBjb250cm9sIHJlZyAqLworI2RlZmluZSBQMVRNSU9fVE0xMV9JTgkJMHgwMAorI2RlZmluZSBQMVRNSU9fVE0xMV9PVVQJCTB4MDEKKyNkZWZpbmUgUDFUTUlPX1RNMTBfSU4JCTB4MDAKKyNkZWZpbmUgUDFUTUlPX1RNMTBfT1VUCQkweDAyCisjZGVmaW5lIFAxVE1JT19UTTlfSU4JCTB4MDAKKyNkZWZpbmUgUDFUTUlPX1RNOV9PVVQJCTB4MDQKKyNkZWZpbmUgUDFUTUlPX1RNOF9JTgkJMHgwMAorI2RlZmluZSBQMVRNSU9fVE04X09VVAkJMHgwOAorI2RlZmluZSBQMVRNSU9fVE03X0lOCQkweDAwCisjZGVmaW5lIFAxVE1JT19UTTdfT1VUCQkweDEwCisKKy8qIEkvTyBwb3J0IDIgKi8KKyNkZWZpbmUJUDJNRAkJCV9fU1lTUkVHKDB4ZGIwMDAyMDAsIHUxNikJLyogbW9kZSByZWcgKi8KKyNkZWZpbmUgUDJNRF8wCQkJMHgwMDAzCS8qIG1hc2sgKi8KKyNkZWZpbmUgUDJNRF8wX0lOCQkweDAwMDAJLyogaW5wdXQgbW9kZSAqLworI2RlZmluZSBQMk1EXzBfT1VUCQkweDAwMDEJLyogb3V0cHV0IG1vZGUgKi8KKyNkZWZpbmUgUDJNRF8wX0JPT1RCVwkJMHgwMDAzCS8qIGJvb3QgYnVzIHdpZHRoIHNlbGVjdG9yIG1vZGUgKi8KKyNkZWZpbmUgUDJNRF8xCQkJMHgwMDBjCisjZGVmaW5lIFAyTURfMV9JTgkJMHgwMDAwCisjZGVmaW5lIFAyTURfMV9PVVQJCTB4MDAwNAorI2RlZmluZSBQMk1EXzFfQk9PVFNFTAkJMHgwMDBjCS8qIGJvb3QgZGV2aWNlIHNlbGVjdG9yIG1vZGUgKi8KKyNkZWZpbmUgUDJNRF8yCQkJMHgwMDMwCisjZGVmaW5lIFAyTURfMl9JTgkJMHgwMDAwCisjZGVmaW5lIFAyTURfMl9PVVQJCTB4MDAxMAorI2RlZmluZSBQMk1EXzMJCQkweDAwYzAKKyNkZWZpbmUgUDJNRF8zX0lOCQkweDAwMDAKKyNkZWZpbmUgUDJNRF8zX09VVAkJMHgwMDQwCisjZGVmaW5lIFAyTURfM19DS0lPCQkweDAwYzAJLyogbW9kZSAqLworI2RlZmluZSBQMk1EXzQJCQkweDAzMDAKKyNkZWZpbmUgUDJNRF80X0lOCQkweDAwMDAKKyNkZWZpbmUgUDJNRF80X09VVAkJMHgwMTAwCisjZGVmaW5lIFAyTURfNF9DTU9ECQkweDAzMDAJLyogbW9kZSAqLworCisjZGVmaW5lCVAySU4JCQlfX1NZU1JFRygweGRiMDAwMjA0LCB1OCkJLyogaW4gcmVnICovCisjZGVmaW5lCVAyT1VUCQkJX19TWVNSRUcoMHhkYjAwMDIwOCwgdTgpCS8qIG91dCByZWcgKi8KKyNkZWZpbmUJUDJUTUlPCQkJX19TWVNSRUcoMHhkYjAwMDIwYywgdTgpCS8qIFRNIHBpbiBJL08gY29udHJvbCByZWcgKi8KKworLyogSS9PIHBvcnQgMyAqLworI2RlZmluZQlQM01ECQkJX19TWVNSRUcoMHhkYjAwMDMwMCwgdTE2KQkvKiBtb2RlIHJlZyAqLworI2RlZmluZSBQM01EXzAJCQkweDAwMDMJLyogbWFzayAqLworI2RlZmluZSBQM01EXzBfSU4JCTB4MDAwMAkvKiBpbnB1dCBtb2RlICovCisjZGVmaW5lIFAzTURfMF9PVVQJCTB4MDAwMQkvKiBvdXRwdXQgbW9kZSAqLworI2RlZmluZSBQM01EXzBfQUZSWEQJCTB4MDAwMgkvKiBBRlIgaW50ZXJmYWNlIG1vZGUgKi8KKyNkZWZpbmUgUDNNRF8xCQkJMHgwMDBjCisjZGVmaW5lIFAzTURfMV9JTgkJMHgwMDAwCisjZGVmaW5lIFAzTURfMV9PVVQJCTB4MDAwNAorI2RlZmluZSBQM01EXzFfQUZUWEQJCTB4MDAwOAkvKiBBRlIgaW50ZXJmYWNlIG1vZGUgKi8KKyNkZWZpbmUgUDNNRF8yCQkJMHgwMDMwCisjZGVmaW5lIFAzTURfMl9JTgkJMHgwMDAwCisjZGVmaW5lIFAzTURfMl9PVVQJCTB4MDAxMAorI2RlZmluZSBQM01EXzJfQUZTQ0xLCQkweDAwMjAJLyogQUZSIGludGVyZmFjZSBtb2RlICovCisjZGVmaW5lIFAzTURfMwkJCTB4MDBjMAorI2RlZmluZSBQM01EXzNfSU4JCTB4MDAwMAorI2RlZmluZSBQM01EXzNfT1VUCQkweDAwNDAKKyNkZWZpbmUgUDNNRF8zX0FGRlMJCTB4MDA4MAkvKiBBRlIgaW50ZXJmYWNlIG1vZGUgKi8KKyNkZWZpbmUgUDNNRF80CQkJMHgwMzAwCisjZGVmaW5lIFAzTURfNF9JTgkJMHgwMDAwCisjZGVmaW5lIFAzTURfNF9PVVQJCTB4MDEwMAorI2RlZmluZSBQM01EXzRfQUZFSEMJCTB4MDIwMAkvKiBBRlIgaW50ZXJmYWNlIG1vZGUgKi8KKworI2RlZmluZQlQM0lOCQkJX19TWVNSRUcoMHhkYjAwMDMwNCwgdTgpCS8qIGluIHJlZyAqLworI2RlZmluZQlQM09VVAkJCV9fU1lTUkVHKDB4ZGIwMDAzMDgsIHU4KQkvKiBvdXQgcmVnICovCisKKy8qIEkvTyBwb3J0IDQgKi8KKyNkZWZpbmUJUDRNRAkJCV9fU1lTUkVHKDB4ZGIwMDA0MDAsIHUxNikJLyogbW9kZSByZWcgKi8KKyNkZWZpbmUgUDRNRF8wCQkJMHgwMDAzCS8qIG1hc2sgKi8KKyNkZWZpbmUgUDRNRF8wX0lOCQkweDAwMDAJLyogaW5wdXQgbW9kZSAqLworI2RlZmluZSBQNE1EXzBfT1VUCQkweDAwMDEJLyogb3V0cHV0IG1vZGUgKi8KKyNkZWZpbmUgUDRNRF8wX1NDTDAJCTB4MDAwMgkvKiBJMkMvc2VyaWFsIG1vZGUgKi8KKyNkZWZpbmUgUDRNRF8xCQkJMHgwMDBjCisjZGVmaW5lIFA0TURfMV9JTgkJMHgwMDAwCisjZGVmaW5lIFA0TURfMV9PVVQJCTB4MDAwNAorI2RlZmluZSBQNE1EXzFfU0RBMAkJMHgwMDA4CisjZGVmaW5lIFA0TURfMgkJCTB4MDAzMAorI2RlZmluZSBQNE1EXzJfSU4JCTB4MDAwMAorI2RlZmluZSBQNE1EXzJfT1VUCQkweDAwMTAKKyNkZWZpbmUgUDRNRF8yX1NDTDEJCTB4MDAyMAorI2RlZmluZSBQNE1EXzMJCQkweDAwYzAKKyNkZWZpbmUgUDRNRF8zX0lOCQkweDAwMDAKKyNkZWZpbmUgUDRNRF8zX09VVAkJMHgwMDQwCisjZGVmaW5lIFA0TURfM19TREExCQkweDAwODAKKyNkZWZpbmUgUDRNRF80CQkJMHgwMzAwCisjZGVmaW5lIFA0TURfNF9JTgkJMHgwMDAwCisjZGVmaW5lIFA0TURfNF9PVVQJCTB4MDEwMAorI2RlZmluZSBQNE1EXzRfU0JPMAkJMHgwMjAwCisjZGVmaW5lIFA0TURfNQkJCTB4MGMwMAorI2RlZmluZSBQNE1EXzVfSU4JCTB4MDAwMAorI2RlZmluZSBQNE1EXzVfT1VUCQkweDA0MDAKKyNkZWZpbmUgUDRNRF81X1NCTzEJCTB4MDgwMAorI2RlZmluZSBQNE1EXzYJCQkweDMwMDAKKyNkZWZpbmUgUDRNRF82X0lOCQkweDAwMDAKKyNkZWZpbmUgUDRNRF82X09VVAkJMHgxMDAwCisjZGVmaW5lIFA0TURfNl9TQlQwCQkweDIwMDAKKyNkZWZpbmUgUDRNRF83CQkJMHhjMDAwCisjZGVmaW5lIFA0TURfN19JTgkJMHgwMDAwCisjZGVmaW5lIFA0TURfN19PVVQJCTB4NDAwMAorI2RlZmluZSBQNE1EXzdfU0JUMQkJMHg4MDAwCisKKyNkZWZpbmUJUDRJTgkJCV9fU1lTUkVHKDB4ZGIwMDA0MDQsIHU4KQkvKiBpbiByZWcgKi8KKyNkZWZpbmUJUDRPVVQJCQlfX1NZU1JFRygweGRiMDAwNDA4LCB1OCkJLyogb3V0IHJlZyAqLworCisvKiBJL08gcG9ydCA1ICovCisjZGVmaW5lCVA1TUQJCQlfX1NZU1JFRygweGRiMDAwNTAwLCB1MTYpCS8qIG1vZGUgcmVnICovCisjZGVmaW5lIFA1TURfMAkJCTB4MDAwMwkvKiBtYXNrICovCisjZGVmaW5lIFA1TURfMF9JTgkJMHgwMDAwCS8qIGlucHV0IG1vZGUgKi8KKyNkZWZpbmUgUDVNRF8wX09VVAkJMHgwMDAxCS8qIG91dHB1dCBtb2RlICovCisjZGVmaW5lIFA1TURfMF9JUlRYRAkJMHgwMDAyCS8qIElyREEgbW9kZSAqLworI2RlZmluZSBQNU1EXzBfU09VVAkJMHgwMDA0CS8qIHNlcmlhbCBtb2RlICovCisjZGVmaW5lIFA1TURfMQkJCTB4MDAwYworI2RlZmluZSBQNU1EXzFfSU4JCTB4MDAwMAorI2RlZmluZSBQNU1EXzFfT1VUCQkweDAwMDQKKyNkZWZpbmUgUDVNRF8xX0lSUlhEUwkJMHgwMDA4CS8qIElyREEgbW9kZSAqLworI2RlZmluZSBQNU1EXzFfU0lOCQkweDAwMGMJLyogc2VyaWFsIG1vZGUgKi8KKyNkZWZpbmUgUDVNRF8yCQkJMHgwMDMwCisjZGVmaW5lIFA1TURfMl9JTgkJMHgwMDAwCisjZGVmaW5lIFA1TURfMl9PVVQJCTB4MDAxMAorI2RlZmluZSBQNU1EXzJfSVJSWERGCQkweDAwMjAJLyogSXJEQSBtb2RlICovCisKKyNkZWZpbmUJUDVJTgkJCV9fU1lTUkVHKDB4ZGIwMDA1MDQsIHU4KQkvKiBpbiByZWcgKi8KKyNkZWZpbmUJUDVPVVQJCQlfX1NZU1JFRygweGRiMDAwNTA4LCB1OCkJLyogb3V0IHJlZyAqLworCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfQVNNX1BJT19SRUdTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvcG9sbC5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9wb2xsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk4NTA5ZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvcG9sbC5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wb2xsLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL3Bvc2l4X3R5cGVzLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3Bvc2l4X3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3NTY3YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvcG9zaXhfdHlwZXMuaApAQCAtMCwwICsxLDEzMiBAQAorLyogTU4xMDMwMCBQT1NJWCB0eXBlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNYXRzdXNoaXRhIEVsZWN0cmljIEluZHVzdHJpYWwgQ28uLCBMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9QT1NJWF9UWVBFU19ICisjZGVmaW5lIF9BU01fUE9TSVhfVFlQRVNfSAorCisvKgorICogVGhpcyBmaWxlIGlzIGdlbmVyYWxseSB1c2VkIGJ5IHVzZXItbGV2ZWwgc29mdHdhcmUsIHNvIHlvdSBuZWVkIHRvCisgKiBiZSBhIGxpdHRsZSBjYXJlZnVsIGFib3V0IG5hbWVzcGFjZSBwb2xsdXRpb24gZXRjLiAgQWxzbywgd2UgY2Fubm90CisgKiBhc3N1bWUgR0NDIGlzIGJlaW5nIHVzZWQuCisgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBsb25nCV9fa2VybmVsX2lub190OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9tb2RlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX25saW5rX3Q7Cit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX29mZl90OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX3BpZF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9pcGNfcGlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX3VpZF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9naWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwlfX2tlcm5lbF9zaXplX3Q7Cit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX3NzaXplX3Q7Cit0eXBlZGVmIGludAkJX19rZXJuZWxfcHRyZGlmZl90OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF90aW1lX3Q7Cit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX3N1c2Vjb25kc190OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF9jbG9ja190OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX3RpbWVyX3Q7Cit0eXBlZGVmIGludAkJX19rZXJuZWxfY2xvY2tpZF90OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX2RhZGRyX3Q7Cit0eXBlZGVmIGNoYXIgKgkJX19rZXJuZWxfY2FkZHJfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfdWlkMTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfZ2lkMTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CV9fa2VybmVsX3VpZDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAlfX2tlcm5lbF9naWQzMl90OworCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX29sZF91aWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfb2xkX2dpZF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9vbGRfZGV2X3Q7CisKKyNpZmRlZiBfX0dOVUNfXwordHlwZWRlZiBsb25nIGxvbmcJX19rZXJuZWxfbG9mZl90OworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8IGRlZmluZWQoX19VU0VfQUxMKQorCWludAl2YWxbMl07CisjZWxzZSAvKiAhZGVmaW5lZChfX0tFUk5FTF9fKSAmJiAhZGVmaW5lZChfX1VTRV9BTEwpICovCisJaW50CV9fdmFsWzJdOworI2VuZGlmIC8qICFkZWZpbmVkKF9fS0VSTkVMX18pICYmICFkZWZpbmVkKF9fVVNFX0FMTCkgKi8KK30gX19rZXJuZWxfZnNpZF90OworCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKSB8fCAhZGVmaW5lZChfX0dMSUJDX18pIHx8IChfX0dMSUJDX18gPCAyKQorCisjdW5kZWYJX19GRF9TRVQKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX0ZEX1NFVCh1bnNpZ25lZCBsb25nIF9fZmQsIF9fa2VybmVsX2ZkX3NldCAqX19mZHNldHApCit7CisJdW5zaWduZWQgbG9uZyBfX3RtcCA9IF9fZmQgLyBfX05GREJJVFM7CisJdW5zaWduZWQgbG9uZyBfX3JlbSA9IF9fZmQgJSBfX05GREJJVFM7CisJX19mZHNldHAtPmZkc19iaXRzW19fdG1wXSB8PSAoMVVMPDxfX3JlbSk7Cit9CisKKyN1bmRlZglfX0ZEX0NMUgorc3RhdGljIGlubGluZSB2b2lkIF9fRkRfQ0xSKHVuc2lnbmVkIGxvbmcgX19mZCwgX19rZXJuZWxfZmRfc2V0ICpfX2Zkc2V0cCkKK3sKKwl1bnNpZ25lZCBsb25nIF9fdG1wID0gX19mZCAvIF9fTkZEQklUUzsKKwl1bnNpZ25lZCBsb25nIF9fcmVtID0gX19mZCAlIF9fTkZEQklUUzsKKwlfX2Zkc2V0cC0+ZmRzX2JpdHNbX190bXBdICY9IH4oMVVMPDxfX3JlbSk7Cit9CisKKworI3VuZGVmCV9fRkRfSVNTRVQKK3N0YXRpYyBpbmxpbmUgaW50IF9fRkRfSVNTRVQodW5zaWduZWQgbG9uZyBfX2ZkLCBjb25zdCBfX2tlcm5lbF9mZF9zZXQgKl9fcCkKK3sKKwl1bnNpZ25lZCBsb25nIF9fdG1wID0gX19mZCAvIF9fTkZEQklUUzsKKwl1bnNpZ25lZCBsb25nIF9fcmVtID0gX19mZCAlIF9fTkZEQklUUzsKKwlyZXR1cm4gKF9fcC0+ZmRzX2JpdHNbX190bXBdICYgKDFVTDw8X19yZW0pKSAhPSAwOworfQorCisvKgorICogVGhpcyB3aWxsIHVucm9sbCB0aGUgbG9vcCBmb3IgdGhlIG5vcm1hbCBjb25zdGFudCBjYXNlICg4IGludHMsCisgKiBmb3IgYSAyNTYtYml0IGZkX3NldCkKKyAqLworI3VuZGVmCV9fRkRfWkVSTworc3RhdGljIGlubGluZSB2b2lkIF9fRkRfWkVSTyhfX2tlcm5lbF9mZF9zZXQgKl9fcCkKK3sKKwl1bnNpZ25lZCBsb25nICpfX3RtcCA9IF9fcC0+ZmRzX2JpdHM7CisJaW50IF9faTsKKworCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChfX0ZEU0VUX0xPTkdTKSkgeworCQlzd2l0Y2ggKF9fRkRTRVRfTE9OR1MpIHsKKwkJY2FzZSAxNjoKKwkJCV9fdG1wWyAwXSA9IDA7IF9fdG1wWyAxXSA9IDA7CisJCQlfX3RtcFsgMl0gPSAwOyBfX3RtcFsgM10gPSAwOworCQkJX190bXBbIDRdID0gMDsgX190bXBbIDVdID0gMDsKKwkJCV9fdG1wWyA2XSA9IDA7IF9fdG1wWyA3XSA9IDA7CisJCQlfX3RtcFsgOF0gPSAwOyBfX3RtcFsgOV0gPSAwOworCQkJX190bXBbMTBdID0gMDsgX190bXBbMTFdID0gMDsKKwkJCV9fdG1wWzEyXSA9IDA7IF9fdG1wWzEzXSA9IDA7CisJCQlfX3RtcFsxNF0gPSAwOyBfX3RtcFsxNV0gPSAwOworCQkJcmV0dXJuOworCisJCWNhc2UgODoKKwkJCV9fdG1wWyAwXSA9IDA7IF9fdG1wWyAxXSA9IDA7CisJCQlfX3RtcFsgMl0gPSAwOyBfX3RtcFsgM10gPSAwOworCQkJX190bXBbIDRdID0gMDsgX190bXBbIDVdID0gMDsKKwkJCV9fdG1wWyA2XSA9IDA7IF9fdG1wWyA3XSA9IDA7CisJCQlyZXR1cm47CisKKwkJY2FzZSA0OgorCQkJX190bXBbIDBdID0gMDsgX190bXBbIDFdID0gMDsKKwkJCV9fdG1wWyAyXSA9IDA7IF9fdG1wWyAzXSA9IDA7CisJCQlyZXR1cm47CisJCX0KKwl9CisJX19pID0gX19GRFNFVF9MT05HUzsKKwl3aGlsZSAoX19pKSB7CisJCV9faS0tOworCQkqX190bXAgPSAwOworCQlfX3RtcCsrOworCX0KK30KKworI2VuZGlmIC8qIGRlZmluZWQoX19LRVJORUxfXykgfHwgIWRlZmluZWQoX19HTElCQ19fKSB8fCAoX19HTElCQ19fIDwgMikgKi8KKworI2VuZGlmIC8qIF9BU01fUE9TSVhfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9wcm9jLW1uMTAzZTAxMC9jYWNoZS5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9wcm9jLW1uMTAzZTAxMC9jYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYzFmOWEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3Byb2MtbW4xMDNlMDEwL2NhY2hlLmgKQEAgLTAsMCArMSwzMyBAQAorLyogTU4xMDNFMDEwIENhY2hlIHNwZWNpZmljYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9QUk9DX0NBQ0hFX0gKKyNkZWZpbmUgX0FTTV9QUk9DX0NBQ0hFX0gKKworLyogTDEgY2FjaGUgKi8KKworI2RlZmluZSBMMV9DQUNIRV9OV0FZUwkJNAkvKiBudW1iZXIgb2Ygd2F5cyBpbiBjYWNoZXMgKi8KKyNkZWZpbmUgTDFfQ0FDSEVfTkVOVFJJRVMJMjU2CS8qIG51bWJlciBvZiBlbnRyaWVzIGluIGVhY2ggd2F5ICovCisjZGVmaW5lIEwxX0NBQ0hFX0JZVEVTCQkxNgkvKiBieXRlcyBwZXIgZW50cnkgKi8KKyNkZWZpbmUgTDFfQ0FDSEVfU0hJRlQJCTQJLyogc2hpZnQgZm9yIGJ5dGVzIHBlciBlbnRyeSAqLworI2RlZmluZSBMMV9DQUNIRV9XQVlESVNQCTB4MTAwMAkvKiBkaXNwbGFjZW1lbnQgb2Ygb25lIHdheSBmcm9tIHRoZSBuZXh0ICovCisKKyNkZWZpbmUgTDFfQ0FDSEVfVEFHX1ZBTElECTB4MDAwMDAwMDEJLyogY2FjaGUgdGFnIHZhbGlkIGJpdCAqLworI2RlZmluZSBMMV9DQUNIRV9UQUdfRElSVFkJMHgwMDAwMDAwOAkvKiBkYXRhIGNhY2hlIHRhZyBkaXJ0eSBiaXQgKi8KKyNkZWZpbmUgTDFfQ0FDSEVfVEFHX0VOVFJZCTB4MDAwMDBmZjAJLyogY2FjaGUgdGFnIGVudHJ5IGFkZHJlc3MgbWFzayAqLworI2RlZmluZSBMMV9DQUNIRV9UQUdfQUREUkVTUwkweGZmZmZmMDAwCS8qIGNhY2hlIHRhZyBsaW5lIGFkZHJlc3MgbWFzayAqLworCisvKgorICogc3BlY2lmaWNhdGlvbiBvZiB0aGUgaW50ZXJ2YWwgYmV0d2VlbiBpbnRlcnJ1cHQgY2hlY2tpbmcgaW50ZXJ2YWxzIHdoaWxzdAorICogbWFuYWdpbmcgdGhlIGNhY2hlIHdpdGggdGhlIGludGVycnVwdHMgZGlzYWJsZWQKKyAqLworI2RlZmluZSBNTjEwMzAwX0RDQUNIRV9JTlZfUkFOR0VfSU5UUl9MT0cyX0lOVEVSVkFMCTQKKworI2VuZGlmIC8qIF9BU01fUFJPQ19DQUNIRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL3Byb2MtbW4xMDNlMDEwL2Nsb2NrLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3Byb2MtbW4xMDNlMDEwL2Nsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FmOTk4MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvcHJvYy1tbjEwM2UwMTAvY2xvY2suaApAQCAtMCwwICsxLDE4IEBACisvKiBNTjEwM0UwMTAtc3BlY2lmaWMgY2xvY2tzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fUFJPQ19DTE9DS19ICisjZGVmaW5lIF9BU01fUFJPQ19DTE9DS19ICisKKyNpbmNsdWRlIDxhc20vdW5pdC9jbG9jay5oPgorCisjZGVmaW5lIE1OMTAzMDBfV0RDTEsJCU1OMTAzMDBfSU9DTEsKKworI2VuZGlmIC8qIF9BU01fUFJPQ19DTE9DS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL3Byb2MtbW4xMDNlMDEwL2lycS5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9wcm9jLW1uMTAzZTAxMC9pcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTZlZThmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9wcm9jLW1uMTAzZTAxMC9pcnEuaApAQCAtMCwwICsxLDM0IEBACisvKiBNTjEwM0UwMTAgT24tYm9hcmQgaW50ZXJydXB0IGNvbnRyb2xsZXIgbnVtYmVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9BU01fUFJPQ19JUlFfSAorI2RlZmluZSBfQVNNX1BST0NfSVJRX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBHeElDUl9OVU1fSVJRUwkJNDIKKworI2RlZmluZSBHeElDUl9OVU1fWElSUVMJCTgKKworI2RlZmluZSBYSVJRMAkJMzQKKyNkZWZpbmUgWElSUTEJCTM1CisjZGVmaW5lIFhJUlEyCQkzNgorI2RlZmluZSBYSVJRMwkJMzcKKyNkZWZpbmUgWElSUTQJCTM4CisjZGVmaW5lIFhJUlE1CQkzOQorI2RlZmluZSBYSVJRNgkJNDAKKyNkZWZpbmUgWElSUTcJCTQxCisKKyNkZWZpbmUgWElSUTJJUlEobnVtKQkoWElSUTAgKyBudW0pCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfQVNNX1BST0NfSVJRX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvcHJvYy1tbjEwM2UwMTAvcHJvYy5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9wcm9jLW1uMTAzZTAxMC9wcm9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhMmI5MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvcHJvYy1tbjEwM2UwMTAvcHJvYy5oCkBAIC0wLDAgKzEsMTggQEAKKy8qIE1OMTAzRTAxMCBQcm9jZXNzb3IgZGVzY3JpcHRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfQVNNX1BST0NfUFJPQ19ICisjZGVmaW5lIF9BU01fUFJPQ19QUk9DX0gKKworI2RlZmluZSBQUk9DRVNTT1JfVkVORE9SX05BTUUJIk1hdHN1c2hpdGEiCisjZGVmaW5lIFBST0NFU1NPUl9NT0RFTF9OQU1FCSJtbjEwM2UwMTAiCisKKyNlbmRpZiAvKiBfQVNNX1BST0NfUFJPQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9wcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWIwODFmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9wcm9jZXNzb3IuaApAQCAtMCwwICsxLDE4NiBAQAorLyogTU4xMDMwMCBQcm9jZXNzb3Igc3BlY2lmaWNzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1hdHN1c2hpdGEgRWxlY3RyaWMgSW5kdXN0cmlhbCBDby4sIEx0ZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9BU01fUFJPQ0VTU09SX0gKKyNkZWZpbmUgX0FTTV9QUk9DRVNTT1JfSAorCisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL2NwdS1yZWdzLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uLCBhIHN0cmFuZ2UgQyB0aGluZyAqLworc3RydWN0IHRhc2tfc3RydWN0Oworc3RydWN0IG1tX3N0cnVjdDsKKworLyoKKyAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgbWFjcm8gdGhhdCByZXR1cm5zIGN1cnJlbnQKKyAqIGluc3RydWN0aW9uIHBvaW50ZXIgKCJwcm9ncmFtIGNvdW50ZXIiKS4KKyAqLworI2RlZmluZSBjdXJyZW50X3RleHRfYWRkcigpCQkJXAorKHsJCQkJCQlcCisJdm9pZCAqX19wYzsJCQkJXAorCWFzbSgibW92IHBjLCUwIiA6ICI9YSIoX19wYykpOwkJXAorCV9fcGM7CQkJCQlcCit9KQorCitleHRlcm4gdm9pZCBzaG93X3JlZ2lzdGVycyhzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKy8qCisgKiAgQ1BVIHR5cGUgYW5kIGhhcmR3YXJlIGJ1ZyBmbGFncy4gS2VwdCBzZXBhcmF0ZWx5IGZvciBlYWNoIENQVS4KKyAqICBNZW1iZXJzIG9mIHRoaXMgc3RydWN0dXJlIGFyZSByZWZlcmVuY2VkIGluIGhlYWQuUywgc28gdGhpbmsgdHdpY2UKKyAqICBiZWZvcmUgdG91Y2hpbmcgdGhlbS4gW21qXQorICovCisKK3N0cnVjdCBtbjEwMzAwX2NwdWluZm8geworCWludAkJdHlwZTsKKwl1bnNpZ25lZCBsb25nCWxvb3BzX3Blcl9zZWM7CisJY2hhcgkJaGFyZF9tYXRoOworCXVuc2lnbmVkIGxvbmcJKnBnZF9xdWljazsKKwl1bnNpZ25lZCBsb25nCSpwdGVfcXVpY2s7CisJdW5zaWduZWQgbG9uZwlwZ3RhYmxlX2NhY2hlX3N6OworfTsKKworZXh0ZXJuIHN0cnVjdCBtbjEwMzAwX2NwdWluZm8gYm9vdF9jcHVfZGF0YTsKKworI2RlZmluZSBjcHVfZGF0YSAmYm9vdF9jcHVfZGF0YQorI2RlZmluZSBjdXJyZW50X2NwdV9kYXRhIGJvb3RfY3B1X2RhdGEKKworZXh0ZXJuIHZvaWQgaWRlbnRpZnlfY3B1KHN0cnVjdCBtbjEwMzAwX2NwdWluZm8gKik7CitleHRlcm4gdm9pZCBwcmludF9jcHVfaW5mbyhzdHJ1Y3QgbW4xMDMwMF9jcHVpbmZvICopOworZXh0ZXJuIHZvaWQgZG9kZ3lfdHNjKHZvaWQpOworI2RlZmluZSBjcHVfcmVsYXgoKSBkbyB7fSB3aGlsZSAoMCkKKworLyoKKyAqIFVzZXIgc3BhY2UgcHJvY2VzcyBzaXplOiAxLjc1R0IgKGRlZmF1bHQpLgorICovCisjZGVmaW5lIFRBU0tfU0laRQkJMHg3MDAwMDAwMAorCisvKgorICogV2hlcmUgdG8gcHV0IHRoZSB1c2Vyc3BhY2Ugc3RhY2sgYnkgZGVmYXVsdAorICovCisjZGVmaW5lIFNUQUNLX1RPUAkJMHg3MDAwMDAwMAorI2RlZmluZSBTVEFDS19UT1BfTUFYCQlTVEFDS19UT1AKKworLyogVGhpcyBkZWNpZGVzIHdoZXJlIHRoZSBrZXJuZWwgd2lsbCBzZWFyY2ggZm9yIGEgZnJlZSBjaHVuayBvZiB2bQorICogc3BhY2UgZHVyaW5nIG1tYXAncy4KKyAqLworI2RlZmluZSBUQVNLX1VOTUFQUEVEX0JBU0UJMHgzMDAwMDAwMAorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZwlzZWc7Cit9IG1tX3NlZ21lbnRfdDsKKworc3RydWN0IGZwdV9zdGF0ZV9zdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcJZnNbMzJdOwkJLyogZnB1IHJlZ2lzdGVycyAqLworCXVuc2lnbmVkIGxvbmcJZnBjcjsJCS8qIGZwdSBjb250cm9sIHJlZ2lzdGVyICovCit9OworCitzdHJ1Y3QgdGhyZWFkX3N0cnVjdCB7CisJc3RydWN0IHB0X3JlZ3MJCSp1cmVnczsJCS8qIHVzZXJzcGFjZSByZWdpc3RlciBmcmFtZSAqLworCXVuc2lnbmVkIGxvbmcJCXBjOwkJLyoga2VybmVsIFBDICovCisJdW5zaWduZWQgbG9uZwkJc3A7CQkvKiBrZXJuZWwgU1AgKi8KKwl1bnNpZ25lZCBsb25nCQlhMzsJCS8qIGtlcm5lbCBGUCAqLworCXVuc2lnbmVkIGxvbmcJCXdjaGFuOworCXVuc2lnbmVkIGxvbmcJCXVzcDsKKwlzdHJ1Y3QgcHRfcmVncwkJKl9fZnJhbWU7CisJdW5zaWduZWQgbG9uZwkJZnB1X2ZsYWdzOworI2RlZmluZSBUSFJFQURfVVNJTkdfRlBVCTB4MDAwMDAwMDEJLyogVCBpZiB0aGlzIHRhc2sgaXMgdXNpbmcgdGhlIEZQVSAqLworCXN0cnVjdCBmcHVfc3RhdGVfc3RydWN0CWZwdV9zdGF0ZTsKK307CisKKyNkZWZpbmUgSU5JVF9USFJFQUQJCQkJXAorewkJCQkJCVwKKwkudXJlZ3MJCT0gaW5pdF91cmVncywJCVwKKwkucGMJCT0gMCwJCQlcCisJLnNwCQk9IDAsCQkJXAorCS5hMwkJPSAwLAkJCVwKKwkud2NoYW4JCT0gMCwJCQlcCisJLl9fZnJhbWUJPSBOVUxMLAkJCVwKK30KKworI2RlZmluZSBJTklUX01NQVAgXAoreyAmaW5pdF9tbSwgMCwgMCwgTlVMTCwgUEFHRV9TSEFSRUQsIFZNX1JFQUQgfCBWTV9XUklURSB8IFZNX0VYRUMsIDEsIFwKKyAgTlVMTCwgTlVMTCB9CisKKy8qCisgKiBkbyBuZWNlc3Nhcnkgc2V0dXAgdG8gc3RhcnQgdXAgYSBuZXdseSBleGVjdXRlZCB0aHJlYWQKKyAqIC0gbmVlZCB0byBkaXNjYXJkIHRoZSBmcmFtZSBzdGFja2VkIGJ5IHRoZSBrZXJuZWwgdGhyZWFkIGludm9raW5nIHRoZSBleGVjdmUKKyAqICAgc3lzY2FsbCAoc2VlIFJFU1RPUkVfQUxMIG1hY3JvKQorICovCisjZGVmaW5lIHN0YXJ0X3RocmVhZChyZWdzLCBuZXdfcGMsIG5ld19zcCkgZG8gewkJXAorCXNldF9mcyhVU0VSX0RTKTsJCQkJXAorCV9fZnJhbWUgPSBjdXJyZW50LT50aHJlYWQudXJlZ3M7CQlcCisJX19mcmFtZS0+ZXBzdyA9IEVQU1dfblNMIHwgRVBTV19JRSB8IEVQU1dfSU07CVwKKwlfX2ZyYW1lLT5wYyA9IG5ld19wYzsJCQkJXAorCV9fZnJhbWUtPnNwID0gbmV3X3NwOwkJCQlcCit9IHdoaWxlICgwKQorCisvKiBGcmVlIGFsbCByZXNvdXJjZXMgaGVsZCBieSBhIHRocmVhZC4gKi8KK2V4dGVybiB2b2lkIHJlbGVhc2VfdGhyZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKKworLyogUHJlcGFyZSB0byBjb3B5IHRocmVhZCBzdGF0ZSAtIHVubGF6eSBhbGwgbGF6eSBzdGF0dXMgKi8KK2V4dGVybiB2b2lkIHByZXBhcmVfdG9fY29weShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CisKKy8qCisgKiBjcmVhdGUgYSBrZXJuZWwgdGhyZWFkIHdpdGhvdXQgcmVtb3ZpbmcgaXQgZnJvbSB0YXNrbGlzdHMKKyAqLworZXh0ZXJuIGludCBrZXJuZWxfdGhyZWFkKGludCAoKmZuKSh2b2lkICopLCB2b2lkICphcmcsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCisvKgorICogUmV0dXJuIHNhdmVkIFBDIG9mIGEgYmxvY2tlZCB0aHJlYWQuCisgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIHRocmVhZF9zYXZlZF9wYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CisKK3Vuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CisKKyNkZWZpbmUgdGFza19wdF9yZWdzKHRhc2spCQkJCQkJXAorKHsJCQkJCQkJCQlcCisgICAgICAgc3RydWN0IHB0X3JlZ3MgKl9fcmVnc19fOwkJCQkJXAorICAgICAgIF9fcmVnc19fID0gKHN0cnVjdCBwdF9yZWdzICopIChLU1RLX1RPUCh0YXNrX3N0YWNrX3BhZ2UodGFzaykpIC0gOCk7IFwKKyAgICAgICBfX3JlZ3NfXyAtIDE7CQkJCQkJCVwKK30pCisKKyNkZWZpbmUgS1NUS19FSVAodGFzaykgKHRhc2tfcHRfcmVncyh0YXNrKS0+cGMpCisjZGVmaW5lIEtTVEtfRVNQKHRhc2spICh0YXNrX3B0X3JlZ3ModGFzayktPnNwKQorCisjZGVmaW5lIEtTVEtfVE9QKGluZm8pCQkJCVwKKyh7CQkJCQkJXAorCSh1bnNpZ25lZCBsb25nKShpbmZvKSArIFRIUkVBRF9TSVpFOwlcCit9KQorCisjZGVmaW5lIEFSQ0hfSEFTX1BSRUZFVENICisjZGVmaW5lIEFSQ0hfSEFTX1BSRUZFVENIVworCitzdGF0aWMgaW5saW5lIHZvaWQgcHJlZmV0Y2goY29uc3Qgdm9pZCAqeCkKK3sKKyNpZm5kZWYgQ09ORklHX01OMTAzMDBfQ0FDSEVfRElTQUJMRUQKKyNpZmRlZiBDT05GSUdfTU4xMDMwMF9QUk9DX01OMTAzRTAxMAorCWFzbSB2b2xhdGlsZSAoIm5vcDsgbm9wOyBkY3BmICglMCkiIDogOiAiciIoeCkpOworI2Vsc2UKKwlhc20gdm9sYXRpbGUgKCJkY3BmICglMCkiIDogOiAiciIoeCkpOworI2VuZGlmCisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIHByZWZldGNodyhjb25zdCB2b2lkICp4KQoreworI2lmbmRlZiBDT05GSUdfTU4xMDMwMF9DQUNIRV9ESVNBQkxFRAorI2lmZGVmIENPTkZJR19NTjEwMzAwX1BST0NfTU4xMDNFMDEwCisJYXNtIHZvbGF0aWxlICgibm9wOyBub3A7IGRjcGYgKCUwKSIgOiA6ICJyIih4KSk7CisjZWxzZQorCWFzbSB2b2xhdGlsZSAoImRjcGYgKCUwKSIgOiA6ICJyIih4KSk7CisjZW5kaWYKKyNlbmRpZgorfQorCisjZW5kaWYgLyogX0FTTV9QUk9DRVNTT1JfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9wdHJhY2UuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvcHRyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM2ODQ2OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvcHRyYWNlLmgKQEAgLTAsMCArMSw5OSBAQAorLyogTU4xMDMwMCBFeGNlcHRpb24gZnJhbWUgbGF5b3V0IGFuZCBwdHJhY2UgY29uc3RhbnRzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fUFRSQUNFX0gKKyNkZWZpbmUgX0FTTV9QVFJBQ0VfSAorCisjZGVmaW5lIFBUX0EzCQkwCisjZGVmaW5lIFBUX0EyCQkxCisjZGVmaW5lIFBUX0QzCQkyCisjZGVmaW5lCVBUX0QyCQkzCisjZGVmaW5lIFBUX01DVkYJCTQKKyNkZWZpbmUJUFRfTUNSTAkJNQorI2RlZmluZSBQVF9NQ1JICQk2CisjZGVmaW5lCVBUX01EUlEJCTcKKyNkZWZpbmUJUFRfRTEJCTgKKyNkZWZpbmUJUFRfRTAJCTkKKyNkZWZpbmUJUFRfRTcJCTEwCisjZGVmaW5lCVBUX0U2CQkxMQorI2RlZmluZQlQVF9FNQkJMTIKKyNkZWZpbmUJUFRfRTQJCTEzCisjZGVmaW5lCVBUX0UzCQkxNAorI2RlZmluZQlQVF9FMgkJMTUKKyNkZWZpbmUJUFRfU1AJCTE2CisjZGVmaW5lCVBUX0xBUgkJMTcKKyNkZWZpbmUJUFRfTElSCQkxOAorI2RlZmluZQlQVF9NRFIJCTE5CisjZGVmaW5lCVBUX0ExCQkyMAorI2RlZmluZQlQVF9BMAkJMjEKKyNkZWZpbmUJUFRfRDEJCTIyCisjZGVmaW5lCVBUX0QwCQkyMworI2RlZmluZSBQVF9PUklHX0QwCTI0CisjZGVmaW5lCVBUX0VQU1cJCTI1CisjZGVmaW5lCVBUX1BDCQkyNgorI2RlZmluZSBOUl9QVFJFR1MJMjcKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKy8qCisgKiBUaGlzIGRlZmluZXMgdGhlIHdheSByZWdpc3RlcnMgYXJlIHN0b3JlZCBpbiB0aGUgZXZlbnQgb2YgYW4gZXhjZXB0aW9uCisgKiAtIHRoZSBzdHJhbmdlIG9yZGVyIGlzIGR1ZSB0byB0aGUgTU9WTSBpbnN0cnVjdGlvbgorICovCitzdHJ1Y3QgcHRfcmVncyB7CisJdW5zaWduZWQgbG9uZwkJYTM7CQkvKiBzeXNjYWxsIGFyZyAzICovCisJdW5zaWduZWQgbG9uZwkJYTI7CQkvKiBzeXNjYWxsIGFyZyA0ICovCisJdW5zaWduZWQgbG9uZwkJZDM7CQkvKiBzeXNjYWxsIGFyZyA1ICovCisJdW5zaWduZWQgbG9uZwkJZDI7CQkvKiBzeXNjYWxsIGFyZyA2ICovCisJdW5zaWduZWQgbG9uZwkJbWN2ZjsKKwl1bnNpZ25lZCBsb25nCQltY3JsOworCXVuc2lnbmVkIGxvbmcJCW1jcmg7CisJdW5zaWduZWQgbG9uZwkJbWRycTsKKwl1bnNpZ25lZCBsb25nCQllMTsKKwl1bnNpZ25lZCBsb25nCQllMDsKKwl1bnNpZ25lZCBsb25nCQllNzsKKwl1bnNpZ25lZCBsb25nCQllNjsKKwl1bnNpZ25lZCBsb25nCQllNTsKKwl1bnNpZ25lZCBsb25nCQllNDsKKwl1bnNpZ25lZCBsb25nCQllMzsKKwl1bnNpZ25lZCBsb25nCQllMjsKKwl1bnNpZ25lZCBsb25nCQlzcDsKKwl1bnNpZ25lZCBsb25nCQlsYXI7CisJdW5zaWduZWQgbG9uZwkJbGlyOworCXVuc2lnbmVkIGxvbmcJCW1kcjsKKwl1bnNpZ25lZCBsb25nCQlhMTsKKwl1bnNpZ25lZCBsb25nCQlhMDsJCS8qIHN5c2NhbGwgYXJnIDEgKi8KKwl1bnNpZ25lZCBsb25nCQlkMTsJCS8qIHN5c2NhbGwgYXJnIDIgKi8KKwl1bnNpZ25lZCBsb25nCQlkMDsJCS8qIHN5c2NhbGwgcmV0ICovCisJc3RydWN0IHB0X3JlZ3MJCSpuZXh0OwkJLyogbmV4dCBmcmFtZSBwb2ludGVyICovCisJdW5zaWduZWQgbG9uZwkJb3JpZ19kMDsJLyogc3lzY2FsbCBudW1iZXIgKi8KKwl1bnNpZ25lZCBsb25nCQllcHN3OworCXVuc2lnbmVkIGxvbmcJCXBjOworfTsKKyNlbmRpZgorCitleHRlcm4gc3RydWN0IHB0X3JlZ3MgKl9fZnJhbWU7IC8qIGN1cnJlbnQgZnJhbWUgcG9pbnRlciAqLworCisvKiBBcmJpdHJhcmlseSBjaG9vc2UgdGhlIHNhbWUgcHRyYWNlIG51bWJlcnMgYXMgdXNlZCBieSB0aGUgU3BhcmMgY29kZS4gKi8KKyNkZWZpbmUgUFRSQUNFX0dFVFJFR1MgICAgICAgICAgICAxMgorI2RlZmluZSBQVFJBQ0VfU0VUUkVHUyAgICAgICAgICAgIDEzCisjZGVmaW5lIFBUUkFDRV9HRVRGUFJFR1MgICAgICAgICAgMTQKKyNkZWZpbmUgUFRSQUNFX1NFVEZQUkVHUyAgICAgICAgICAxNQorCisvKiBvcHRpb25zIHNldCB1c2luZyBQVFJBQ0VfU0VUT1BUSU9OUyAqLworI2RlZmluZSBQVFJBQ0VfT19UUkFDRVNZU0dPT0QgICAgIDB4MDAwMDAwMDEKKworI2lmIGRlZmluZWQoX19LRVJORUxfXykgJiYgIWRlZmluZWQoX19BU1NFTUJMWV9fKQorI2RlZmluZSB1c2VyX21vZGUocmVncykJCQkoKChyZWdzKS0+ZXBzdyAmIEVQU1dfblNMKSA9PSBFUFNXX25TTCkKKyNkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKQkoKHJlZ3MpLT5wYykKK2V4dGVybiB2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqKTsKKyNlbmRpZgorCisjZGVmaW5lIHByb2ZpbGVfcGMocmVncykgKChyZWdzKS0+cGMpCisKKyNlbmRpZiAvKiBfQVNNX1BUUkFDRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL3Jlc2V0LXJlZ3MuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvcmVzZXQtcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NDUyM2QKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3Jlc2V0LXJlZ3MuaApAQCAtMCwwICsxLDY0IEBACisvKiBNTjEwMzAwIFJlc2V0IGNvbnRyb2xsZXIgYW5kIHdhdGNoZG9nIHRpbWVyIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0FTTV9SRVNFVF9SRUdTX0gKKyNkZWZpbmUgX0FTTV9SRVNFVF9SRUdTX0gKKworI2luY2x1ZGUgPGFzbS9jcHUtcmVncy5oPgorI2luY2x1ZGUgPGFzbS9leGNlcHRpb25zLmg+CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpZmRlZiBDT05GSUdfTU4xMDMwMF9XRF9USU1FUgorI2RlZmluZSBBUkNIX0hBU19OTUlfV0FUQ0hET0cJCS8qIFNlZSBpbmNsdWRlL2xpbnV4L25taS5oICovCisjZW5kaWYKKworLyoKKyAqIHdhdGNoZG9nIHRpbWVyIHJlZ2lzdGVycworICovCisjZGVmaW5lIFdEQkMJCQlfX1NZU1JFR0MoMHhjMDAwMTAwMCwgdTgpIC8qIHdhdGNoZG9nIGJpbmFyeSBjb3VudGVyIHJlZyAqLworCisjZGVmaW5lIFdEQ1RSCQkJX19TWVNSRUcoMHhjMDAwMTAwMiwgdTgpICAvKiB3YXRjaGRvZyB0aW1lciBjb250cm9sIHJlZyAqLworI2RlZmluZSBXRENUUl9XRENLCQkweDA3CS8qIGNsb2NrIHNvdXJjZSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgV0RDVFJfV0RDS18yNTZ0aAkweDAwCS8qIC0gT1NDSS8yNTYgKi8KKyNkZWZpbmUgV0RDVFJfV0RDS18xMDI0dGgJMHgwMQkvKiAtIE9TQ0kvMTAyNCAqLworI2RlZmluZSBXRENUUl9XRENLXzIwNDh0aAkweDAyCS8qIC0gT1NDSS8yMDQ4ICovCisjZGVmaW5lIFdEQ1RSX1dEQ0tfMTYzODR0aAkweDAzCS8qIC0gT1NDSS8xNjM4NCAqLworI2RlZmluZSBXRENUUl9XRENLXzY1NTM2dGgJMHgwNAkvKiAtIE9TQ0kvNjU1MzYgKi8KKyNkZWZpbmUgV0RDVFJfV0RSU1QJCTB4NDAJLyogYmluYXJ5IGNvdW50ZXIgcmVzZXQgKi8KKyNkZWZpbmUgV0RDVFJfV0RDTkUJCTB4ODAJLyogd2F0Y2hkb2cgdGltZXIgZW5hYmxlICovCisKKyNkZWZpbmUgUlNUQ1RSCQkJX19TWVNSRUcoMHhjMDAwMTAwNCwgdTgpIC8qIHJlc2V0IGNvbnRyb2wgcmVnICovCisjZGVmaW5lIFJTVENUUl9DSElQUlNUCQkweDAxCS8qIGNoaXAgcmVzZXQgKi8KKyNkZWZpbmUgUlNUQ1RSX0RCRlJTVAkJMHgwMgkvKiBkb3VibGUgZmF1bHQgcmVzZXQgZmxhZyAqLworI2RlZmluZSBSU1RDVFJfV0RUUlNUCQkweDA0CS8qIHdhdGNoZG9nIHRpbWVyIHJlc2V0IGZsYWcgKi8KKyNkZWZpbmUgUlNUQ1RSX1dEUkVOCQkweDA4CS8qIHdhdGNoZG9nIHRpbWVyIHJlc2V0IGVuYWJsZSAqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCitzdGF0aWMgaW5saW5lIHZvaWQgbW4xMDMwMF9wcm9jX2hhcmRfcmVzZXQodm9pZCkKK3sKKwlSU1RDVFIgJj0gflJTVENUUl9DSElQUlNUOworCVJTVENUUiB8PSBSU1RDVFJfQ0hJUFJTVDsKK30KKworZXh0ZXJuIHVuc2lnbmVkIGludCB3YXRjaGRvZ19hbGVydF9jb3VudGVyOworCitleHRlcm4gdm9pZCB3YXRjaGRvZ19nbyh2b2lkKTsKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgd2F0Y2hkb2dfaGFuZGxlcih2b2lkKTsKK2V4dGVybiBhc21saW5rYWdlCit2b2lkIHdhdGNoZG9nX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqLCBlbnVtIGV4Y2VwdGlvbl9jb2RlKTsKKworI2VuZGlmCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfQVNNX1JFU0VUX1JFR1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9yZXNvdXJjZS5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9yZXNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YmM0ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3Jlc291cmNlLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3Jlc291cmNlLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL3J0Yy1yZWdzLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3J0Yy1yZWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQyZGVlZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvcnRjLXJlZ3MuaApAQCAtMCwwICsxLDg2IEBACisvKiBNTjEwMzAwIG9uLWNoaXAgUmVhbC1UaW1lIENsb2NrIHJlZ2lzdGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfQVNNX1JUQ19SRUdTX0gKKyNkZWZpbmUgX0FTTV9SVENfUkVHU19ICisKKyNpbmNsdWRlIDxhc20vaW50Y3RsLXJlZ3MuaD4KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBSVFNDUgkJCV9fU1lTUkVHKDB4ZDg2MDAwMDAsIHU4KSAvKiBSVEMgc2Vjb25kcyBjb3VudCByZWcgKi8KKyNkZWZpbmUgUlRTQVIJCQlfX1NZU1JFRygweGQ4NjAwMDAxLCB1OCkgLyogUlRDIHNlY29uZHMgYWxhcm0gcmVnICovCisjZGVmaW5lIFJUTUNSCQkJX19TWVNSRUcoMHhkODYwMDAwMiwgdTgpIC8qIFJUQyBtaW51dGVzIGNvdW50IHJlZyAqLworI2RlZmluZSBSVE1BUgkJCV9fU1lTUkVHKDB4ZDg2MDAwMDMsIHU4KSAvKiBSVEMgbWludXRlcyBhbGFybSByZWcgKi8KKyNkZWZpbmUgUlRIQ1IJCQlfX1NZU1JFRygweGQ4NjAwMDA0LCB1OCkgLyogUlRDIGhvdXJzIGNvdW50IHJlZyAqLworI2RlZmluZSBSVEhBUgkJCV9fU1lTUkVHKDB4ZDg2MDAwMDUsIHU4KSAvKiBSVEMgaG91cnMgYWxhcm0gcmVnICovCisjZGVmaW5lIFJURFdDUgkJCV9fU1lTUkVHKDB4ZDg2MDAwMDYsIHU4KSAvKiBSVEMgZGF5IG9mIHRoZSB3ZWVrIGNvdW50IHJlZyAqLworI2RlZmluZSBSVERNQ1IJCQlfX1NZU1JFRygweGQ4NjAwMDA3LCB1OCkgLyogUlRDIGRheXMgY291bnQgcmVnICovCisjZGVmaW5lIFJUTVRDUgkJCV9fU1lTUkVHKDB4ZDg2MDAwMDgsIHU4KSAvKiBSVEMgbW9udGhzIGNvdW50IHJlZyAqLworI2RlZmluZSBSVFlDUgkJCV9fU1lTUkVHKDB4ZDg2MDAwMDksIHU4KSAvKiBSVEMgeWVhcnMgY291bnQgcmVnICovCisKKyNkZWZpbmUgUlRDUkEJCQlfX1NZU1JFRygweGQ4NjAwMDBhLCB1OCkvKiBSVEMgY29udHJvbCByZWcgQSAqLworI2RlZmluZSBSVENSQV9SUwkJMHgwZgkvKiBwZXJpb2RpYyB0aW1lciBpbnRlcnJ1cHQgY3ljbGUgc2V0dGluZyAqLworI2RlZmluZSBSVENSQV9SU19OT05FCQkweDAwCS8qIC0gb2ZmICovCisjZGVmaW5lIFJUQ1JBX1JTXzNfOTA2MjVtcwkweDAxCS8qIC0gMy45MDYyNW1zCSgxLzI1NnMpICovCisjZGVmaW5lIFJUQ1JBX1JTXzdfODEyNW1zCTB4MDIJLyogLSA3LjgxMjVtcwkoMS8xMjhzKSAqLworI2RlZmluZSBSVENSQV9SU18xMjJfMDcwdXMJMHgwMwkvKiAtIDEyMi4wNzB1cwkoMS84MTkycykgKi8KKyNkZWZpbmUgUlRDUkFfUlNfMjQ0XzE0MXVzCTB4MDQJLyogLSAyNDQuMTQxdXMJKDEvNDA5NnMpICovCisjZGVmaW5lIFJUQ1JBX1JTXzQ4OF8yODF1cwkweDA1CS8qIC0gNDg4LjI4MXVzCSgxLzIwNDhzKSAqLworI2RlZmluZSBSVENSQV9SU185NzZfNTYyNXVzCTB4MDYJLyogLSA5NzYuNTYyNXVzCSgxLzEwMjRzKSAqLworI2RlZmluZSBSVENSQV9SU18xXzk1MzEyNW1zCTB4MDcJLyogLSAxLjk1MzEyNW1zCSgxLzUxMnMpICovCisjZGVmaW5lIFJUQ1JBX1JTXzNfOTA2MjRtcwkweDA4CS8qIC0gMy45MDYyNG1zCSgxLzI1NnMpICovCisjZGVmaW5lIFJUQ1JBX1JTXzdfODEyNW1zX2IJMHgwOQkvKiAtIDcuODEyNW1zCSgxLzEyOHMpICovCisjZGVmaW5lIFJUQ1JBX1JTXzE1XzYyNW1zCTB4MGEJLyogLSAxNS42MjVtcwkoMS82NHMpICovCisjZGVmaW5lIFJUQ1JBX1JTXzMxXzI1bXMJMHgwYgkvKiAtIDMxLjI1bXMJKDEvMzJzKSAqLworI2RlZmluZSBSVENSQV9SU182Ml81bXMJCTB4MGMJLyogLSA2Mi41bXMJKDEvMTZzKSAqLworI2RlZmluZSBSVENSQV9SU18xMjVtcwkJMHgwZAkvKiAtIDEyNW1zCSgxLzhzKSAqLworI2RlZmluZSBSVENSQV9SU18yNTBtcwkJMHgwZQkvKiAtIDI1MG1zCSgxLzRzKSAqLworI2RlZmluZSBSVENSQV9SU181MDBtcwkJMHgwZgkvKiAtIDUwMG1zCSgxLzJzKSAqLworI2RlZmluZSBSVENSQV9EVlIJCTB4NDAJLyogZGl2aWRlciByZXNldCAqLworI2RlZmluZSBSVENSQV9VSVAJCTB4ODAJLyogY2xvY2sgdXBkYXRlIGZsYWcgKi8KKworI2RlZmluZSBSVENSQgkJCV9fU1lTUkVHKDB4ZDg2MDAwMGIsIHU4KSAvKiBSVEMgY29udHJvbCByZWcgQiAqLworI2RlZmluZSBSVENSQl9EU0UJCTB4MDEJLyogZGF5bGlnaHQgc2F2aW5ncyB0aW1lIGVuYWJsZSAqLworI2RlZmluZSBSVENSQl9UTQkJMHgwMgkvKiB0aW1lIGZvcm1hdCAqLworI2RlZmluZSBSVENSQl9UTV8xMkhSCQkweDAwCS8qIC0gMTIgaG91ciBmb3JtYXQgKi8KKyNkZWZpbmUgUlRDUkJfVE1fMjRIUgkJMHgwMgkvKiAtIDI0IGhvdXIgZm9ybWF0ICovCisjZGVmaW5lIFJUQ1JCX0RNCQkweDA0CS8qIG51bWVyaWMgdmFsdWUgZm9ybWF0ICovCisjZGVmaW5lIFJUQ1JCX0RNX0JDRAkJMHgwMAkvKiAtIEJDRCAqLworI2RlZmluZSBSVENSQl9ETV9CSU5BUlkJCTB4MDQJLyogLSBiaW5hcnkgKi8KKyNkZWZpbmUgUlRDUkJfVUlFCQkweDEwCS8qIHVwZGF0ZSBpbnRlcnJ1cHQgZGlzYWJsZSAqLworI2RlZmluZSBSVENSQl9BSUUJCTB4MjAJLyogYWxhcm0gaW50ZXJydXB0IGRpc2FibGUgKi8KKyNkZWZpbmUgUlRDUkJfUElFCQkweDQwCS8qIHBlcmlvZGljIGludGVycnVwdCBkaXNhYmxlICovCisjZGVmaW5lIFJUQ1JCX1NFVAkJMHg4MAkvKiBjbG9jayB1cGRhdGUgZW5hYmxlICovCisKKyNkZWZpbmUgUlRTUkMJCQlfX1NZU1JFRygweGQ4NjAwMDBjLCB1OCkgLyogUlRDIHN0YXR1cyByZWcgQyAqLworI2RlZmluZSBSVFNSQ19VRgkJMHgxMAkvKiB1cGRhdGUgZW5kIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFJUU1JDX0FGCQkweDIwCS8qIGFsYXJtIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFJUU1JDX1BGCQkweDQwCS8qIHBlcmlvZGljIGludGVycnVwdCBmbGFnICovCisjZGVmaW5lIFJUU1JDX0lSUUYJCTB4ODAJLyogaW50ZXJydXB0IGZsYWcgKi8KKworI2RlZmluZSBSVElSUQkJCTMyCisjZGVmaW5lIFJUSUNSCQkJR3hJQ1IoUlRJUlEpCisKKy8qCisgKiBNQzE0NjgxOCBSVEMgY29tcGF0aWJpbGl0eSBkZWZzIGZvciB0aGUgTU4xMDMwMCBvbi1jaGlwIFJUQworICovCisjZGVmaW5lIFJUQ19QT1JUKHgpCQkweGQ4NjAwMDAwCisjZGVmaW5lIFJUQ19BTFdBWVNfQkNECQkxCS8qIFJUQyBvcGVyYXRlcyBpbiBiaW5hcnkgbW9kZSAqLworCisjZGVmaW5lIENNT1NfUkVBRChhZGRyKQkJX19TWVNSRUcoMHhkODYwMDAwMCArIChhZGRyKSwgdTgpCisjZGVmaW5lIENNT1NfV1JJVEUodmFsLCBhZGRyKQlcCisJZG8geyBfX1NZU1JFRygweGQ4NjAwMDAwICsgKGFkZHIpLCB1OCkgPSB2YWw7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgUlRDX0lSUQkJCVJUSVJRCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfQVNNX1JUQ19SRUdTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvcnRjLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3J0Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyOTUxOTQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3J0Yy5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qIE1OMTAzMDAgUmVhbCB0aW1lIGNsb2NrIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1hdHN1c2hpdGEgRWxlY3RyaWMgSW5kdXN0cmlhbCBDby4sIEx0ZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfQVNNX1JUQ19ICisjZGVmaW5lIF9BU01fUlRDX0gKKworI2lmZGVmIENPTkZJR19NTjEwMzAwX1JUQworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCitleHRlcm4gdm9pZCBjaGVja19ydGNfdGltZSh2b2lkKTsKK2V4dGVybiB2b2lkIF9faW5pdCBjYWxpYnJhdGVfY2xvY2sodm9pZCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBfX2luaXQgZ2V0X2luaXRpYWxfcnRjX3RpbWUodm9pZCk7CisKKyNlbHNlIC8qICFDT05GSUdfTU4xMDMwMF9SVEMgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX3J0Y190aW1lKHZvaWQpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjYWxpYnJhdGVfY2xvY2sodm9pZCkKK3sKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9pbml0aWFsX3J0Y190aW1lKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiAhQ09ORklHX01OMTAzMDBfUlRDICovCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ydGMuaD4KKworI2VuZGlmIC8qIF9BU01fUlRDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvc2NhdHRlcmxpc3QuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvc2NhdHRlcmxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjlkOTFkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9zY2F0dGVybGlzdC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIE1OMTAzMDAgU2NhdHRlcmxpc3QgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWF0c3VzaGl0YSBFbGVjdHJpYyBJbmR1c3RyaWFsIENvLiwgTHRkLgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fU0NBVFRFUkxJU1RfSAorI2RlZmluZSBfQVNNX1NDQVRURVJMSVNUX0gKKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisvKgorICogRHJpdmVycyBtdXN0IHNldCBlaXRoZXIgLT5hZGRyZXNzIG9yIChwcmVmZXJyZWQpIHBhZ2UgYW5kIC0+b2Zmc2V0CisgKiB0byBpbmRpY2F0ZSB3aGVyZSBkYXRhIG11c3QgYmUgdHJhbnNmZXJyZWQgdG8vZnJvbS4KKyAqCisgKiBVc2luZyBwYWdlIGlzIHJlY29tbWVuZGVkIHNpbmNlIGl0IGhhbmRsZXMgaGlnaG1lbSBkYXRhIGFzIHdlbGwgYXMKKyAqIGxvdyBtZW0uIC0+YWRkcmVzcyBpcyByZXN0cmljdGVkIHRvIGRhdGEgd2hpY2ggaGFzIGEgdmlydHVhbCBtYXBwaW5nLCBhbmQKKyAqIGl0IHdpbGwgZ28gYXdheSBpbiB0aGUgZnV0dXJlLiBVcGRhdGluZyB0byBwYWdlIGNhbiBiZSBhdXRvbWF0ZWQgdmVyeQorICogZWFzaWx5IC0tIHNvbWV0aGluZyBsaWtlCisgKgorICogc2ctPmFkZHJlc3MgPSBzb21lX3B0cjsKKyAqCisgKiBjYW4gYmUgcmV3cml0dGVuIGFzCisgKgorICogc2dfc2V0X3BhZ2UodmlydF90b19wYWdlKHNvbWVfcHRyKSk7CisgKiBzZy0+b2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpIHNvbWVfcHRyICYgflBBR0VfTUFTSzsKKyAqCisgKiBhbmQgdGhhdCdzIGl0LiBUaGVyZSdzIG5vIGV4Y3VzZSBmb3Igbm90IGhpZ2htZW0gZW5hYmxpbmcgWU9VUiBkcml2ZXIuIC9qZW5zCisgKi8KK3N0cnVjdCBzY2F0dGVybGlzdCB7CisjaWZkZWYgQ09ORklHX0RFQlVHX1NHCisJdW5zaWduZWQgbG9uZwlzZ19tYWdpYzsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcJcGFnZV9saW5rOworCXVuc2lnbmVkIGludAlvZmZzZXQ7CQkvKiBmb3IgaGlnaG1lbSwgcGFnZSBvZmZzZXQgKi8KKwlkbWFfYWRkcl90CWRtYV9hZGRyZXNzOworCXVuc2lnbmVkIGludAlsZW5ndGg7Cit9OworCisjZGVmaW5lIElTQV9ETUFfVEhSRVNIT0xEICgweDAwZmZmZmZmKQorCisjZW5kaWYgLyogX0FTTV9TQ0FUVEVSTElTVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL3NlY3Rpb25zLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3NlY3Rpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI4YzUxNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvc2VjdGlvbnMuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2VjdGlvbnMuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvc2VtYXBob3JlLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3NlbWFwaG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOWUxYWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3NlbWFwaG9yZS5oCkBAIC0wLDAgKzEsMTY5IEBACisvKiBNTjEwMzAwIFNlbWFwaG9yZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9TRU1BUEhPUkVfSAorI2RlZmluZSBfQVNNX1NFTUFQSE9SRV9ICisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKworI2RlZmluZSBTRU1BUEhPUkVfREVCVUcJCTAKKworLyoKKyAqIHRoZSBzZW1hcGhvcmUgZGVmaW5pdGlvbgorICogLSBpZiBjb3VudCBpcyA+MCB0aGVuIHRoZXJlIGFyZSB0b2tlbnMgYXZhaWxhYmxlIG9uIHRoZSBzZW1hcGhvcmUgZm9yIGRvd24KKyAqICAgdG8gY29sbGVjdAorICogLSBpZiBjb3VudCBpcyA8PTAgdGhlbiB0aGVyZSBhcmUgbm8gc3BhcmUgdG9rZW5zLCBhbmQgYW55b25lIHRoYXQgd2FudHMgb25lCisgKiAgIG11c3Qgd2FpdAorICogLSBpZiB3YWl0X2xpc3QgaXMgbm90IGVtcHR5LCB0aGVuIHRoZXJlIGFyZSBwcm9jZXNzZXMgd2FpdGluZyBmb3IgdGhlCisgKiAgIHNlbWFwaG9yZQorICovCitzdHJ1Y3Qgc2VtYXBob3JlIHsKKwlhdG9taWNfdAkJY291bnQ7CQkvKiBpdCdzIG5vdCByZWFsbHkgYXRvbWljLCBpdCdzCisJCQkJCQkgKiBqdXN0IHRoYXQgY2VydGFpbiBtb2R1bGVzCisJCQkJCQkgKiBleHBlY3QgdG8gYmUgYWJsZSB0byBhY2Nlc3MKKwkJCQkJCSAqIGl0IGRpcmVjdGx5ICovCisJc3BpbmxvY2tfdAkJd2FpdF9sb2NrOworCXN0cnVjdCBsaXN0X2hlYWQJd2FpdF9saXN0OworI2lmIFNFTUFQSE9SRV9ERUJVRworCXVuc2lnbmVkCQlfX21hZ2ljOworI2VuZGlmCit9OworCisjaWYgU0VNQVBIT1JFX0RFQlVHCisjIGRlZmluZSBfX1NFTV9ERUJVR19JTklUKG5hbWUpICwgKGxvbmcpJihuYW1lKS5fX21hZ2ljCisjZWxzZQorIyBkZWZpbmUgX19TRU1fREVCVUdfSU5JVChuYW1lKQorI2VuZGlmCisKKworI2RlZmluZSBfX1NFTUFQSE9SRV9JTklUSUFMSVpFUihuYW1lLCBpbml0X2NvdW50KQkJCVwKK3sJCQkJCQkJCQlcCisJLmNvdW50CQk9IEFUT01JQ19JTklUKGluaXRfY291bnQpLAkJCVwKKwkud2FpdF9sb2NrCT0gX19TUElOX0xPQ0tfVU5MT0NLRUQoKG5hbWUpLndhaXRfbG9jayksCVwKKwkud2FpdF9saXN0CT0gTElTVF9IRUFEX0lOSVQoKG5hbWUpLndhaXRfbGlzdCkJCVwKKwlfX1NFTV9ERUJVR19JTklUKG5hbWUpCQkJCQkJXAorfQorCisjZGVmaW5lIF9fREVDTEFSRV9TRU1BUEhPUkVfR0VORVJJQyhuYW1lLGNvdW50KSBcCisJc3RydWN0IHNlbWFwaG9yZSBuYW1lID0gX19TRU1BUEhPUkVfSU5JVElBTElaRVIobmFtZSwgY291bnQpCisKKyNkZWZpbmUgREVDTEFSRV9NVVRFWChuYW1lKSBfX0RFQ0xBUkVfU0VNQVBIT1JFX0dFTkVSSUMobmFtZSwgMSkKKyNkZWZpbmUgREVDTEFSRV9NVVRFWF9MT0NLRUQobmFtZSkgX19ERUNMQVJFX1NFTUFQSE9SRV9HRU5FUklDKG5hbWUsIDApCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZW1hX2luaXQoc3RydWN0IHNlbWFwaG9yZSAqc2VtLCBpbnQgdmFsKQoreworCSpzZW0gPSAoc3RydWN0IHNlbWFwaG9yZSkgX19TRU1BUEhPUkVfSU5JVElBTElaRVIoKnNlbSwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGluaXRfTVVURVgoc3RydWN0IHNlbWFwaG9yZSAqc2VtKQoreworCXNlbWFfaW5pdChzZW0sIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9NVVRFWF9MT0NLRUQoc3RydWN0IHNlbWFwaG9yZSAqc2VtKQoreworCXNlbWFfaW5pdChzZW0sIDApOworfQorCitleHRlcm4gdm9pZCBfX2Rvd24oc3RydWN0IHNlbWFwaG9yZSAqc2VtLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2V4dGVybiBpbnQgIF9fZG93bl9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBzZW1hcGhvcmUgKnNlbSwgdW5zaWduZWQgbG9uZyBmbGFncyk7CitleHRlcm4gdm9pZCBfX3VwKHN0cnVjdCBzZW1hcGhvcmUgKnNlbSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb3duKHN0cnVjdCBzZW1hcGhvcmUgKnNlbSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjb3VudDsKKworI2lmIFNFTUFQSE9SRV9ERUJVRworCUNIRUNLX01BR0lDKHNlbS0+X19tYWdpYyk7CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZW0tPndhaXRfbG9jaywgZmxhZ3MpOworCWNvdW50ID0gYXRvbWljX3JlYWQoJnNlbS0+Y291bnQpOworCWlmIChsaWtlbHkoY291bnQgPiAwKSkgeworCQlhdG9taWNfc2V0KCZzZW0tPmNvdW50LCBjb3VudCAtIDEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZW0tPndhaXRfbG9jaywgZmxhZ3MpOworCX0gZWxzZSB7CisJCV9fZG93bihzZW0sIGZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRvd25faW50ZXJydXB0aWJsZShzdHJ1Y3Qgc2VtYXBob3JlICpzZW0pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY291bnQsIHJldCA9IDA7CisKKyNpZiBTRU1BUEhPUkVfREVCVUcKKwlDSEVDS19NQUdJQyhzZW0tPl9fbWFnaWMpOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VtLT53YWl0X2xvY2ssIGZsYWdzKTsKKwljb3VudCA9IGF0b21pY19yZWFkKCZzZW0tPmNvdW50KTsKKwlpZiAobGlrZWx5KGNvdW50ID4gMCkpIHsKKwkJYXRvbWljX3NldCgmc2VtLT5jb3VudCwgY291bnQgLSAxKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VtLT53YWl0X2xvY2ssIGZsYWdzKTsKKwl9IGVsc2UgeworCQlyZXQgPSBfX2Rvd25faW50ZXJydXB0aWJsZShzZW0sIGZsYWdzKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIG5vbi1ibG9ja2luZ2x5IGF0dGVtcHQgdG8gZG93bigpIGEgc2VtYXBob3JlLgorICogLSByZXR1cm5zIHplcm8gaWYgd2UgYWNxdWlyZWQgaXQKKyAqLworc3RhdGljIGlubGluZSBpbnQgZG93bl90cnlsb2NrKHN0cnVjdCBzZW1hcGhvcmUgKnNlbSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjb3VudCwgc3VjY2VzcyA9IDA7CisKKyNpZiBTRU1BUEhPUkVfREVCVUcKKwlDSEVDS19NQUdJQyhzZW0tPl9fbWFnaWMpOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VtLT53YWl0X2xvY2ssIGZsYWdzKTsKKwljb3VudCA9IGF0b21pY19yZWFkKCZzZW0tPmNvdW50KTsKKwlpZiAobGlrZWx5KGNvdW50ID4gMCkpIHsKKwkJYXRvbWljX3NldCgmc2VtLT5jb3VudCwgY291bnQgLSAxKTsKKwkJc3VjY2VzcyA9IDE7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbS0+d2FpdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuICFzdWNjZXNzOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdXAoc3RydWN0IHNlbWFwaG9yZSAqc2VtKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZiBTRU1BUEhPUkVfREVCVUcKKwlDSEVDS19NQUdJQyhzZW0tPl9fbWFnaWMpOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VtLT53YWl0X2xvY2ssIGZsYWdzKTsKKwlpZiAoIWxpc3RfZW1wdHkoJnNlbS0+d2FpdF9saXN0KSkKKwkJX191cChzZW0pOworCWVsc2UKKwkJYXRvbWljX3NldCgmc2VtLT5jb3VudCwgYXRvbWljX3JlYWQoJnNlbS0+Y291bnQpICsgMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VtLT53YWl0X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2VtX2dldGNvdW50KHN0cnVjdCBzZW1hcGhvcmUgKnNlbSkKK3sKKwlyZXR1cm4gYXRvbWljX3JlYWQoJnNlbS0+Y291bnQpOworfQorCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9zZW1idWYuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvc2VtYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAxZjNmOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvc2VtYnVmLmgKQEAgLTAsMCArMSwyNSBAQAorI2lmbmRlZiBfQVNNX1NFTUJVRl9ICisjZGVmaW5lIF9BU01fU0VNQlVGX0gKKworLyoKKyAqIFRoZSBzZW1pZDY0X2RzIHN0cnVjdHVyZSBmb3IgTU4xMDMwMCBhcmNoaXRlY3R1cmUuCisgKiBOb3RlIGV4dHJhIHBhZGRpbmcgYmVjYXVzZSB0aGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgYmFjayBhbmQgZm9ydGgKKyAqIGJldHdlZW4ga2VybmVsIGFuZCB1c2VyIHNwYWNlLgorICoKKyAqIFBhZCBzcGFjZSBpcyBsZWZ0IGZvcjoKKyAqIC0gNjQtYml0IHRpbWVfdCB0byBzb2x2ZSB5MjAzOCBwcm9ibGVtCisgKiAtIDIgbWlzY2VsbGFuZW91cyAzMi1iaXQgdmFsdWVzCisgKi8KKworc3RydWN0IHNlbWlkNjRfZHMgeworCXN0cnVjdCBpcGM2NF9wZXJtIHNlbV9wZXJtOwkJLyogcGVybWlzc2lvbnMgLi4gc2VlIGlwYy5oICovCisJX19rZXJuZWxfdGltZV90CXNlbV9vdGltZTsJCS8qIGxhc3Qgc2Vtb3AgdGltZSAqLworCXVuc2lnbmVkIGxvbmcJX191bnVzZWQxOworCV9fa2VybmVsX3RpbWVfdAlzZW1fY3RpbWU7CQkvKiBsYXN0IGNoYW5nZSB0aW1lICovCisJdW5zaWduZWQgbG9uZwlfX3VudXNlZDI7CisJdW5zaWduZWQgbG9uZwlzZW1fbnNlbXM7CQkvKiBuby4gb2Ygc2VtYXBob3JlcyBpbiBhcnJheSAqLworCXVuc2lnbmVkIGxvbmcJX191bnVzZWQzOworCXVuc2lnbmVkIGxvbmcJX191bnVzZWQ0OworfTsKKworI2VuZGlmIC8qIF9BU01fU0VNQlVGX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvc2VyaWFsLXJlZ3MuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvc2VyaWFsLXJlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDk4NDY5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9zZXJpYWwtcmVncy5oCkBAIC0wLDAgKzEsMTYwIEBACisvKiBNTjEwMzAwIG9uLWJvYXJkIHNlcmlhbCBwb3J0IG1vZHVsZSByZWdpc3RlcnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfQVNNX1NFUklBTF9SRUdTX0gKKyNkZWZpbmUgX0FTTV9TRVJJQUxfUkVHU19ICisKKyNpbmNsdWRlIDxhc20vY3B1LXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vaW50Y3RsLXJlZ3MuaD4KKworI2lmZGVmIF9fS0VSTkVMX18KKworLyogc2VyaWFsIHBvcnQgMCAqLworI2RlZmluZQlTQzBDVFIJCQlfX1NZU1JFRygweGQ0MDAyMDAwLCB1MTYpCS8qIGNvbnRyb2wgcmVnICovCisjZGVmaW5lCVNDMDFDVFJfQ0sJCTB4MDAwNwkvKiBjbG9jayBzb3VyY2Ugc2VsZWN0ICovCisjZGVmaW5lCVNDMENUUl9DS19UTThVRkxPV184CTB4MDAwMAkvKiAtIDEvOCB0aW1lciA4IHVuZGVyZmxvdyAoc2VyaWFsIHBvcnQgMCBvbmx5KSAqLworI2RlZmluZQlTQzFDVFJfQ0tfVE05VUZMT1dfOAkweDAwMDAJLyogLSAxLzggdGltZXIgOSB1bmRlcmZsb3cgKHNlcmlhbCBwb3J0IDEgb25seSkgKi8KKyNkZWZpbmUJU0MwMUNUUl9DS19JT0NMS184CTB4MDAwMQkvKiAtIDEvOCBJT0NMSyAqLworI2RlZmluZQlTQzAxQ1RSX0NLX0lPQ0xLXzMyCTB4MDAwMgkvKiAtIDEvMzIgSU9DTEsgKi8KKyNkZWZpbmUJU0MwQ1RSX0NLX1RNMlVGTE9XXzIJMHgwMDAzCS8qIC0gMS8yIHRpbWVyIDIgdW5kZXJmbG93IChzZXJpYWwgcG9ydCAwIG9ubHkpICovCisjZGVmaW5lCVNDMUNUUl9DS19UTTNVRkxPV18yCTB4MDAwMwkvKiAtIDEvMiB0aW1lciAzIHVuZGVyZmxvdyAoc2VyaWFsIHBvcnQgMSBvbmx5KSAqLworI2RlZmluZQlTQzBDVFJfQ0tfVE0wVUZMT1dfOAkweDAwMDQJLyogLSAxLzggdGltZXIgMSB1bmRlcmZsb3cgKHNlcmlhbCBwb3J0IDAgb25seSkgKi8KKyNkZWZpbmUJU0MxQ1RSX0NLX1RNMVVGTE9XXzgJMHgwMDA0CS8qIC0gMS84IHRpbWVyIDIgdW5kZXJmbG93IChzZXJpYWwgcG9ydCAxIG9ubHkpICovCisjZGVmaW5lCVNDMENUUl9DS19UTTJVRkxPV184CTB4MDAwNQkvKiAtIDEvOCB0aW1lciAyIHVuZGVyZmxvdyAoc2VyaWFsIHBvcnQgMCBvbmx5KSAqLworI2RlZmluZQlTQzFDVFJfQ0tfVE0zVUZMT1dfOAkweDAwMDUJLyogLSAxLzggdGltZXIgMyB1bmRlcmZsb3cgKHNlcmlhbCBwb3J0IDEgb25seSkgKi8KKyNkZWZpbmUJU0MwMUNUUl9DS19FWFRFUk5fOAkweDAwMDYJLyogLSAxLzggZXh0ZXJuYWwgY2xvc2sgKi8KKyNkZWZpbmUJU0MwMUNUUl9DS19FWFRFUk4JMHgwMDA3CS8qIC0gZXh0ZXJuYWwgY2xvc2sgKi8KKyNkZWZpbmUJU0MwMUNUUl9TVEIJCTB4MDAwOAkvKiBzdG9wIGJpdCBzZWxlY3QgKi8KKyNkZWZpbmUJU0MwMUNUUl9TVEJfMUJJVAkweDAwMDAJLyogLSAxIHN0b3AgYml0ICovCisjZGVmaW5lCVNDMDFDVFJfU1RCXzJCSVQJMHgwMDA4CS8qIC0gMiBzdG9wIGJpdHMgKi8KKyNkZWZpbmUJU0MwMUNUUl9QQgkJMHgwMDcwCS8qIHBhcml0eSBiaXQgc2VsZWN0ICovCisjZGVmaW5lCVNDMDFDVFJfUEJfTk9ORQkJMHgwMDAwCS8qIC0gbm8gcGFyaXR5ICovCisjZGVmaW5lCVNDMDFDVFJfUEJfRklYRUQwCTB4MDA0MAkvKiAtIGZpeGVkIGF0IDAgKi8KKyNkZWZpbmUJU0MwMUNUUl9QQl9GSVhFRDEJMHgwMDUwCS8qIC0gZml4ZWQgYXQgMSAqLworI2RlZmluZQlTQzAxQ1RSX1BCX0VWRU4JCTB4MDA2MAkvKiAtIGV2ZW4gcGFyaXR5ICovCisjZGVmaW5lCVNDMDFDVFJfUEJfT0RECQkweDAwNzAJLyogLSBvZGQgcGFyaXR5ICovCisjZGVmaW5lCVNDMDFDVFJfQ0xOCQkweDAwODAJLyogY2hhcmFjdGVyIGxlbmd0aCAqLworI2RlZmluZQlTQzAxQ1RSX0NMTl83QklUCTB4MDAwMAkvKiAtIDcgYml0IGNoYXJzICovCisjZGVmaW5lCVNDMDFDVFJfQ0xOXzhCSVQJMHgwMDgwCS8qIC0gOCBiaXQgY2hhcnMgKi8KKyNkZWZpbmUJU0MwMUNUUl9UT0UJCTB4MDEwMAkvKiBUIGlucHV0IG91dHB1dCBlbmFibGUgKi8KKyNkZWZpbmUJU0MwMUNUUl9PRAkJMHgwMjAwCS8qIGJpdCBvcmRlciBzZWxlY3QgKi8KKyNkZWZpbmUJU0MwMUNUUl9PRF9MU0JGSVJTVAkweDAwMDAJLyogLSBMU0IgZmlyc3QgKi8KKyNkZWZpbmUJU0MwMUNUUl9PRF9NU0JGSVJTVAkweDAyMDAJLyogLSBNU0IgZmlyc3QgKi8KKyNkZWZpbmUJU0MwMUNUUl9NRAkJMHgwYzAwCS8qIG1vZGUgc2VsZWN0ICovCisjZGVmaW5lIFNDMDFDVFJfTURfU1RTVF9TWU5DCTB4MDAwMAkvKiAtIHN0YXJ0LXN0b3Agc3luY2hyb25vdXMgKi8KKyNkZWZpbmUgU0MwMUNUUl9NRF9DTE9DS19TWU5DMQkweDA0MDAJLyogLSBjbG9jayBzeW5jaHJvbm91cyAxICovCisjZGVmaW5lIFNDMDFDVFJfTURfSTJDCQkweDA4MDAJLyogLSBJMkMgbW9kZSAqLworI2RlZmluZSBTQzAxQ1RSX01EX0NMT0NLX1NZTkMyCTB4MGMwMAkvKiAtIGNsb2NrIHN5bmNocm9ub3VzIDIgKi8KKyNkZWZpbmUJU0MwMUNUUl9JSUMJCTB4MTAwMAkvKiBJMkMgbW9kZSBzZWxlY3QgKi8KKyNkZWZpbmUJU0MwMUNUUl9CS0UJCTB4MjAwMAkvKiBicmVhayB0cmFuc21pdCBlbmFibGUgKi8KKyNkZWZpbmUJU0MwMUNUUl9SWEUJCTB4NDAwMAkvKiByZWNlaXZlIGVuYWJsZSAqLworI2RlZmluZQlTQzAxQ1RSX1RYRQkJMHg4MDAwCS8qIHRyYW5zbWl0IGVuYWJsZSAqLworCisjZGVmaW5lCVNDMElDUgkJCV9fU1lTUkVHKDB4ZDQwMDIwMDQsIHU4KQkvKiBpbnRlcnJ1cHQgY29udHJvbCByZWcgKi8KKyNkZWZpbmUgU0MwMUlDUl9ETUQJCTB4ODAJLyogb3V0cHV0IGRhdGEgbW9kZSAqLworI2RlZmluZSBTQzAxSUNSX1RECQkweDIwCS8qIHRyYW5zbWl0IERNQSB0cmlnZ2VyIGNhdXNlICovCisjZGVmaW5lIFNDMDFJQ1JfVEkJCTB4MTAJLyogdHJhbnNtaXQgaW50ZXJydXB0IGNhdXNlICovCisjZGVmaW5lIFNDMDFJQ1JfUkVTCQkweDA0CS8qIHJlY2VpdmUgZXJyb3Igc2VsZWN0ICovCisjZGVmaW5lIFNDMDFJQ1JfUkkJCTB4MDEJLyogcmVjZWl2ZSBpbnRlcnJ1cHQgY2F1c2UgKi8KKworI2RlZmluZQlTQzBUWEIJCQlfX1NZU1JFRygweGQ0MDAyMDA4LCB1OCkJLyogdHJhbnNtaXQgYnVmZmVyIHJlZyAqLworI2RlZmluZQlTQzBSWEIJCQlfX1NZU1JFRygweGQ0MDAyMDA5LCB1OCkJLyogcmVjZWl2ZSBidWZmZXIgcmVnICovCisKKyNkZWZpbmUJU0MwU1RSCQkJX19TWVNSRUcoMHhkNDAwMjAwYywgdTE2KQkvKiBzdGF0dXMgcmVnICovCisjZGVmaW5lIFNDMDFTVFJfT0VGCQkweDAwMDEJLyogb3ZlcnJ1biBlcnJvciBmb3VuZCAqLworI2RlZmluZSBTQzAxU1RSX1BFRgkJMHgwMDAyCS8qIHBhcml0eSBlcnJvciBmb3VuZCAqLworI2RlZmluZSBTQzAxU1RSX0ZFRgkJMHgwMDA0CS8qIGZyYW1pbmcgZXJyb3IgZm91bmQgKi8KKyNkZWZpbmUgU0MwMVNUUl9SQkYJCTB4MDAxMAkvKiByZWNlaXZlIGJ1ZmZlciBzdGF0dXMgKi8KKyNkZWZpbmUgU0MwMVNUUl9UQkYJCTB4MDAyMAkvKiB0cmFuc21pdCBidWZmZXIgc3RhdHVzICovCisjZGVmaW5lIFNDMDFTVFJfUlhGCQkweDAwNDAJLyogcmVjZWl2ZSBzdGF0dXMgKi8KKyNkZWZpbmUgU0MwMVNUUl9UWEYJCTB4MDA4MAkvKiB0cmFuc21pdCBzdGF0dXMgKi8KKyNkZWZpbmUgU0MwMVNUUl9TVEYJCTB4MDEwMAkvKiBJMkMgc3RhcnQgc2VxdWVuY2UgZm91bmQgKi8KKyNkZWZpbmUgU0MwMVNUUl9TUEYJCTB4MDIwMAkvKiBJMkMgc3RvcCBzZXF1ZW5jZSBmb3VuZCAqLworCisjZGVmaW5lIFNDMFJYSVJRCQkyMAkvKiB0aW1lciAwIFJlY2VpdmUgSVJRICovCisjZGVmaW5lIFNDMFRYSVJRCQkyMQkvKiB0aW1lciAwIFRyYW5zbWl0IElSUSAqLworCisjZGVmaW5lCVNDMFJYSUNSCQlHeElDUihTQzBSWElSUSkJLyogc2VyaWFsIDAgcmVjZWl2ZSBpbnRyIGN0cmwgcmVnICovCisjZGVmaW5lCVNDMFRYSUNSCQlHeElDUihTQzBUWElSUSkJLyogc2VyaWFsIDAgdHJhbnNtaXQgaW50ciBjdHJsIHJlZyAqLworCisvKiBzZXJpYWwgcG9ydCAxICovCisjZGVmaW5lCVNDMUNUUgkJCV9fU1lTUkVHKDB4ZDQwMDIwMTAsIHUxNikJLyogc2VyaWFsIHBvcnQgMSBjb250cm9sICovCisjZGVmaW5lCVNDMUlDUgkJCV9fU1lTUkVHKDB4ZDQwMDIwMTQsIHU4KQkvKiBpbnRlcnJ1cHQgY29udHJvbCByZWcgKi8KKyNkZWZpbmUJU0MxVFhCCQkJX19TWVNSRUcoMHhkNDAwMjAxOCwgdTgpCS8qIHRyYW5zbWl0IGJ1ZmZlciByZWcgKi8KKyNkZWZpbmUJU0MxUlhCCQkJX19TWVNSRUcoMHhkNDAwMjAxOSwgdTgpCS8qIHJlY2VpdmUgYnVmZmVyIHJlZyAqLworI2RlZmluZQlTQzFTVFIJCQlfX1NZU1JFRygweGQ0MDAyMDFjLCB1MTYpCS8qIHN0YXR1cyByZWcgKi8KKworI2RlZmluZSBTQzFSWElSUQkJMjIJLyogdGltZXIgMSBSZWNlaXZlIElSUSAqLworI2RlZmluZSBTQzFUWElSUQkJMjMJLyogdGltZXIgMSBUcmFuc21pdCBJUlEgKi8KKworI2RlZmluZQlTQzFSWElDUgkJR3hJQ1IoU0MxUlhJUlEpCS8qIHNlcmlhbCAxIHJlY2VpdmUgaW50ciBjdHJsIHJlZyAqLworI2RlZmluZQlTQzFUWElDUgkJR3hJQ1IoU0MxVFhJUlEpCS8qIHNlcmlhbCAxIHRyYW5zbWl0IGludHIgY3RybCByZWcgKi8KKworLyogc2VyaWFsIHBvcnQgMiAqLworI2RlZmluZQlTQzJDVFIJCQlfX1NZU1JFRygweGQ0MDAyMDIwLCB1MTYpCS8qIGNvbnRyb2wgcmVnICovCisjZGVmaW5lCVNDMkNUUl9DSwkJMHgwMDAzCS8qIGNsb2NrIHNvdXJjZSBzZWxlY3QgKi8KKyNkZWZpbmUJU0MyQ1RSX0NLX1RNMTBVRkxPVwkweDAwMDAJLyogLSB0aW1lciAxMCB1bmRlcmZsb3cgKi8KKyNkZWZpbmUJU0MyQ1RSX0NLX1RNMlVGTE9XCTB4MDAwMQkvKiAtIHRpbWVyIDIgdW5kZXJmbG93ICovCisjZGVmaW5lCVNDMkNUUl9DS19FWFRFUk4JMHgwMDAyCS8qIC0gZXh0ZXJuYWwgY2xvc2sgKi8KKyNkZWZpbmUJU0MyQ1RSX0NLX1RNM1VGTE9XCTB4MDAwMwkvKiAtIHRpbWVyIDMgdW5kZXJmbG93ICovCisjZGVmaW5lCVNDMkNUUl9TVEIJCTB4MDAwOAkvKiBzdG9wIGJpdCBzZWxlY3QgKi8KKyNkZWZpbmUJU0MyQ1RSX1NUQl8xQklUCQkweDAwMDAJLyogLSAxIHN0b3AgYml0ICovCisjZGVmaW5lCVNDMkNUUl9TVEJfMkJJVAkJMHgwMDA4CS8qIC0gMiBzdG9wIGJpdHMgKi8KKyNkZWZpbmUJU0MyQ1RSX1BCCQkweDAwNzAJLyogcGFyaXR5IGJpdCBzZWxlY3QgKi8KKyNkZWZpbmUJU0MyQ1RSX1BCX05PTkUJCTB4MDAwMAkvKiAtIG5vIHBhcml0eSAqLworI2RlZmluZQlTQzJDVFJfUEJfRklYRUQwCTB4MDA0MAkvKiAtIGZpeGVkIGF0IDAgKi8KKyNkZWZpbmUJU0MyQ1RSX1BCX0ZJWEVEMQkweDAwNTAJLyogLSBmaXhlZCBhdCAxICovCisjZGVmaW5lCVNDMkNUUl9QQl9FVkVOCQkweDAwNjAJLyogLSBldmVuIHBhcml0eSAqLworI2RlZmluZQlTQzJDVFJfUEJfT0RECQkweDAwNzAJLyogLSBvZGQgcGFyaXR5ICovCisjZGVmaW5lCVNDMkNUUl9DTE4JCTB4MDA4MAkvKiBjaGFyYWN0ZXIgbGVuZ3RoICovCisjZGVmaW5lCVNDMkNUUl9DTE5fN0JJVAkJMHgwMDAwCS8qIC0gNyBiaXQgY2hhcnMgKi8KKyNkZWZpbmUJU0MyQ1RSX0NMTl84QklUCQkweDAwODAJLyogLSA4IGJpdCBjaGFycyAqLworI2RlZmluZQlTQzJDVFJfVFdFCQkweDAxMDAJLyogdHJhbnNtaXQgd2FpdCBlbmFibGUgKGVuYWJsZSBYQ1RTIGNvbnRyb2wpICovCisjZGVmaW5lCVNDMkNUUl9PRAkJMHgwMjAwCS8qIGJpdCBvcmRlciBzZWxlY3QgKi8KKyNkZWZpbmUJU0MyQ1RSX09EX0xTQkZJUlNUCTB4MDAwMAkvKiAtIExTQiBmaXJzdCAqLworI2RlZmluZQlTQzJDVFJfT0RfTVNCRklSU1QJMHgwMjAwCS8qIC0gTVNCIGZpcnN0ICovCisjZGVmaW5lCVNDMkNUUl9UV1MJCTB4MTAwMAkvKiB0cmFuc21pdCB3YWl0IHNlbGVjdCAqLworI2RlZmluZQlTQzJDVFJfVFdTX1hDVFNfSElHSAkweDAwMDAJLyogLSBpbnRlcnJ1cHQgVFggd2hlbiBYQ1RTIGhpZ2ggKi8KKyNkZWZpbmUJU0MyQ1RSX1RXU19YQ1RTX0xPVwkweDEwMDAJLyogLSBpbnRlcnJ1cHQgVFggd2hlbiBYQ1RTIGxvdyAqLworI2RlZmluZQlTQzJDVFJfQktFCQkweDIwMDAJLyogYnJlYWsgdHJhbnNtaXQgZW5hYmxlICovCisjZGVmaW5lCVNDMkNUUl9SWEUJCTB4NDAwMAkvKiByZWNlaXZlIGVuYWJsZSAqLworI2RlZmluZQlTQzJDVFJfVFhFCQkweDgwMDAJLyogdHJhbnNtaXQgZW5hYmxlICovCisKKyNkZWZpbmUJU0MySUNSCQkJX19TWVNSRUcoMHhkNDAwMjAyNCwgdTgpCS8qIGludGVycnVwdCBjb250cm9sIHJlZyAqLworI2RlZmluZSBTQzJJQ1JfVEQJCTB4MjAJLyogdHJhbnNtaXQgRE1BIHRyaWdnZXIgY2F1c2UgKi8KKyNkZWZpbmUgU0MySUNSX1RJCQkweDEwCS8qIHRyYW5zbWl0IGludGVycnVwdCBjYXVzZSAqLworI2RlZmluZSBTQzJJQ1JfUkVTCQkweDA0CS8qIHJlY2VpdmUgZXJyb3Igc2VsZWN0ICovCisjZGVmaW5lIFNDMklDUl9SSQkJMHgwMQkvKiByZWNlaXZlIGludGVycnVwdCBjYXVzZSAqLworCisjZGVmaW5lCVNDMlRYQgkJCV9fU1lTUkVHKDB4ZDQwMDIwMTgsIHU4KQkvKiB0cmFuc21pdCBidWZmZXIgcmVnICovCisjZGVmaW5lCVNDMlJYQgkJCV9fU1lTUkVHKDB4ZDQwMDIwMTksIHU4KQkvKiByZWNlaXZlIGJ1ZmZlciByZWcgKi8KKyNkZWZpbmUJU0MyU1RSCQkJX19TWVNSRUcoMHhkNDAwMjAxYywgdTgpCS8qIHN0YXR1cyByZWcgKi8KKyNkZWZpbmUgU0MyU1RSX09FRgkJMHgwMDAxCS8qIG92ZXJydW4gZXJyb3IgZm91bmQgKi8KKyNkZWZpbmUgU0MyU1RSX1BFRgkJMHgwMDAyCS8qIHBhcml0eSBlcnJvciBmb3VuZCAqLworI2RlZmluZSBTQzJTVFJfRkVGCQkweDAwMDQJLyogZnJhbWluZyBlcnJvciBmb3VuZCAqLworI2RlZmluZSBTQzJTVFJfQ1RTCQkweDAwMDgJLyogWENUUyBpbnB1dCBwaW4gc3RhdHVzICgwIG1lYW5zIGhpZ2gpICovCisjZGVmaW5lIFNDMlNUUl9SQkYJCTB4MDAxMAkvKiByZWNlaXZlIGJ1ZmZlciBzdGF0dXMgKi8KKyNkZWZpbmUgU0MyU1RSX1RCRgkJMHgwMDIwCS8qIHRyYW5zbWl0IGJ1ZmZlciBzdGF0dXMgKi8KKyNkZWZpbmUgU0MyU1RSX1JYRgkJMHgwMDQwCS8qIHJlY2VpdmUgc3RhdHVzICovCisjZGVmaW5lIFNDMlNUUl9UWEYJCTB4MDA4MAkvKiB0cmFuc21pdCBzdGF0dXMgKi8KKworI2RlZmluZQlTQzJUSU0JCQlfX1NZU1JFRygweGQ0MDAyMDJkLCB1OCkJLyogc3RhdHVzIHJlZyAqLworCisjZGVmaW5lIFNDMlJYSVJRCQkyNAkvKiBzZXJpYWwgMiBSZWNlaXZlIElSUSAqLworI2RlZmluZSBTQzJUWElSUQkJMjUJLyogc2VyaWFsIDIgVHJhbnNtaXQgSVJRICovCisKKyNkZWZpbmUJU0MyUlhJQ1IJCUd4SUNSKFNDMlJYSVJRKQkvKiBzZXJpYWwgMiByZWNlaXZlIGludHIgY3RybCByZWcgKi8KKyNkZWZpbmUJU0MyVFhJQ1IJCUd4SUNSKFNDMlRYSVJRKQkvKiBzZXJpYWwgMiB0cmFuc21pdCBpbnRyIGN0cmwgcmVnICovCisKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmIC8qIF9BU01fU0VSSUFMX1JFR1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9zZXJpYWwuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvc2VyaWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3ODVhOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvc2VyaWFsLmgKQEAgLTAsMCArMSwzNiBAQAorLyogU3RhbmRhcmQgVUFSVCBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisvKgorICogVGhlIEFTQjIzMDUgaGFzIGFuIDE4LjQzMiBNSHogY2xvY2sgdGhlIFVBUlQKKyAqLworI2RlZmluZSBCQVNFX0JBVUQJKDE4NDMyMDAwIC8gMTYpCisKKy8qIFN0YW5kYXJkIENPTSBmbGFncyAoZXhjZXB0IGZvciBDT000LCBiZWNhdXNlIG9mIHRoZSA4NTE0IHByb2JsZW0pICovCisjaWZkZWYgQ09ORklHX1NFUklBTF9ERVRFQ1RfSVJRCisjZGVmaW5lIFNURF9DT01fRkxBR1MJKEFTWU5DX0JPT1RfQVVUT0NPTkYgfCBBU1lOQ19TS0lQX1RFU1QgfCBBU1lOQ19BVVRPX0lSUSkKKyNkZWZpbmUgU1REX0NPTTRfRkxBR1MJKEFTWU5DX0JPT1RfQVVUT0NPTkYgfCBBU1lOQ19BVVRPX0lSUSkKKyNlbHNlCisjZGVmaW5lIFNURF9DT01fRkxBR1MJKEFTWU5DX0JPT1RfQVVUT0NPTkYgfCBBU1lOQ19TS0lQX1RFU1QpCisjZGVmaW5lIFNURF9DT000X0ZMQUdTCUFTWU5DX0JPT1RfQVVUT0NPTkYKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NFUklBTF9NQU5ZX1BPUlRTCisjZGVmaW5lIEZPVVJQT1JUX0ZMQUdTCUFTWU5DX0ZPVVJQT1JUCisjZGVmaW5lIEFDQ0VOVF9GTEFHUwkwCisjZGVmaW5lIEJPQ0FfRkxBR1MJMAorI2RlZmluZSBIVUI2X0ZMQUdTCTAKKyNkZWZpbmUgUlNfVEFCTEVfU0laRQk2NAorI2Vsc2UKKyNkZWZpbmUgUlNfVEFCTEVfU0laRQorI2VuZGlmCisKKyNpbmNsdWRlIDxhc20vdW5pdC9zZXJpYWwuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvc2V0dXAuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvc2V0dXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODM1NmM4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9zZXR1cC5oCkBAIC0wLDAgKzEsMTcgQEAKKy8qIE1OMTAzMDAgU2V0dXAgZGVjbGFyYXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fU0VUVVBfSAorI2RlZmluZSBfQVNNX1NFVFVQX0gKKworZXh0ZXJuIHZvaWQgX19pbml0IHVuaXRfc2V0dXAodm9pZCk7CitleHRlcm4gdm9pZCBfX2luaXQgdW5pdF9pbml0X0lSUSh2b2lkKTsKKworI2VuZGlmIC8qIF9BU01fU0VUVVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9zaG1idWYuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvc2htYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYzMDBjYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvc2htYnVmLmgKQEAgLTAsMCArMSw0MiBAQAorI2lmbmRlZiBfQVNNX1NITUJVRl9ICisjZGVmaW5lIF9BU01fU0hNQlVGX0gKKworLyoKKyAqIFRoZSBzaG1pZDY0X2RzIHN0cnVjdHVyZSBmb3IgTU4xMDMwMCBhcmNoaXRlY3R1cmUuCisgKiBOb3RlIGV4dHJhIHBhZGRpbmcgYmVjYXVzZSB0aGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgYmFjayBhbmQgZm9ydGgKKyAqIGJldHdlZW4ga2VybmVsIGFuZCB1c2VyIHNwYWNlLgorICoKKyAqIFBhZCBzcGFjZSBpcyBsZWZ0IGZvcjoKKyAqIC0gNjQtYml0IHRpbWVfdCB0byBzb2x2ZSB5MjAzOCBwcm9ibGVtCisgKiAtIDIgbWlzY2VsbGFuZW91cyAzMi1iaXQgdmFsdWVzCisgKi8KKworc3RydWN0IHNobWlkNjRfZHMgeworCXN0cnVjdCBpcGM2NF9wZXJtCXNobV9wZXJtOwkvKiBvcGVyYXRpb24gcGVybXMgKi8KKwlzaXplX3QJCQlzaG1fc2Vnc3o7CS8qIHNpemUgb2Ygc2VnbWVudCAoYnl0ZXMpICovCisJX19rZXJuZWxfdGltZV90CQlzaG1fYXRpbWU7CS8qIGxhc3QgYXR0YWNoIHRpbWUgKi8KKwl1bnNpZ25lZCBsb25nCQlfX3VudXNlZDE7CisJX19rZXJuZWxfdGltZV90CQlzaG1fZHRpbWU7CS8qIGxhc3QgZGV0YWNoIHRpbWUgKi8KKwl1bnNpZ25lZCBsb25nCQlfX3VudXNlZDI7CisJX19rZXJuZWxfdGltZV90CQlzaG1fY3RpbWU7CS8qIGxhc3QgY2hhbmdlIHRpbWUgKi8KKwl1bnNpZ25lZCBsb25nCQlfX3VudXNlZDM7CisJX19rZXJuZWxfcGlkX3QJCXNobV9jcGlkOwkvKiBwaWQgb2YgY3JlYXRvciAqLworCV9fa2VybmVsX3BpZF90CQlzaG1fbHBpZDsJLyogcGlkIG9mIGxhc3Qgb3BlcmF0b3IgKi8KKwl1bnNpZ25lZCBsb25nCQlzaG1fbmF0dGNoOwkvKiBuby4gb2YgY3VycmVudCBhdHRhY2hlcyAqLworCXVuc2lnbmVkIGxvbmcJCV9fdW51c2VkNDsKKwl1bnNpZ25lZCBsb25nCQlfX3VudXNlZDU7Cit9OworCitzdHJ1Y3Qgc2htaW5mbzY0IHsKKwl1bnNpZ25lZCBsb25nCXNobW1heDsKKwl1bnNpZ25lZCBsb25nCXNobW1pbjsKKwl1bnNpZ25lZCBsb25nCXNobW1uaTsKKwl1bnNpZ25lZCBsb25nCXNobXNlZzsKKwl1bnNpZ25lZCBsb25nCXNobWFsbDsKKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkMTsKKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkMjsKKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkMzsKKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkNDsKK307CisKKyNlbmRpZiAvKiBfQVNNX1NITUJVRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL3NobXBhcmFtLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3NobXBhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2NjZlZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvc2htcGFyYW0uaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX0FTTV9TSE1QQVJBTV9ICisjZGVmaW5lIF9BU01fU0hNUEFSQU1fSAorCisjZGVmaW5lCVNITUxCQSBQQUdFX1NJWkUJCSAvKiBhdHRhY2ggYWRkciBhIG11bHRpcGxlIG9mIHRoaXMgKi8KKworI2VuZGlmIC8qIF9BU01fU0hNUEFSQU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9zaWdjb250ZXh0LmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3NpZ2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGUzYWZmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9zaWdjb250ZXh0LmgKQEAgLTAsMCArMSw1MiBAQAorLyogTU4xMDMwMCBVc2Vyc3BhY2Ugc2lnbmFsIGNvbnRleHQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9TSUdDT05URVhUX0gKKyNkZWZpbmUgX0FTTV9TSUdDT05URVhUX0gKKworc3RydWN0IGZwdWNvbnRleHQgeworCS8qIFJlZ3VsYXIgRlBVIGVudmlyb25tZW50ICovCisJdW5zaWduZWQgbG9uZwlmc1szMl07CQkvKiBmcHUgcmVnaXN0ZXJzICovCisJdW5zaWduZWQgbG9uZwlmcGNyOwkJLyogZnB1IGNvbnRyb2wgcmVnaXN0ZXIgKi8KK307CisKK3N0cnVjdCBzaWdjb250ZXh0IHsKKwl1bnNpZ25lZCBsb25nCWQwOworCXVuc2lnbmVkIGxvbmcJZDE7CisJdW5zaWduZWQgbG9uZwlkMjsKKwl1bnNpZ25lZCBsb25nCWQzOworCXVuc2lnbmVkIGxvbmcJYTA7CisJdW5zaWduZWQgbG9uZwlhMTsKKwl1bnNpZ25lZCBsb25nCWEyOworCXVuc2lnbmVkIGxvbmcJYTM7CisJdW5zaWduZWQgbG9uZwllMDsKKwl1bnNpZ25lZCBsb25nCWUxOworCXVuc2lnbmVkIGxvbmcJZTI7CisJdW5zaWduZWQgbG9uZwllMzsKKwl1bnNpZ25lZCBsb25nCWU0OworCXVuc2lnbmVkIGxvbmcJZTU7CisJdW5zaWduZWQgbG9uZwllNjsKKwl1bnNpZ25lZCBsb25nCWU3OworCXVuc2lnbmVkIGxvbmcJbGFyOworCXVuc2lnbmVkIGxvbmcJbGlyOworCXVuc2lnbmVkIGxvbmcJbWRyOworCXVuc2lnbmVkIGxvbmcJbWN2ZjsKKwl1bnNpZ25lZCBsb25nCW1jcmw7CisJdW5zaWduZWQgbG9uZwltY3JoOworCXVuc2lnbmVkIGxvbmcJbWRycTsKKwl1bnNpZ25lZCBsb25nCXNwOworCXVuc2lnbmVkIGxvbmcJZXBzdzsKKwl1bnNpZ25lZCBsb25nCXBjOworCXN0cnVjdCBmcHVjb250ZXh0ICpmcHVjb250ZXh0OworCXVuc2lnbmVkIGxvbmcJb2xkbWFzazsKK307CisKKworI2VuZGlmIC8qIF9BU01fU0lHQ09OVEVYVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL3NpZ2luZm8uaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvc2lnaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MTVkMjkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3NpZ2luZm8uaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2lnaW5mby5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9zaWduYWwuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk4ODE3YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvc2lnbmFsLmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qIE1OMTAzMDAgU2lnbmFsIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1hdHN1c2hpdGEgRWxlY3RyaWMgSW5kdXN0cmlhbCBDby4sIEx0ZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfQVNNX1NJR05BTF9ICisjZGVmaW5lIF9BU01fU0lHTkFMX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIEF2b2lkIHRvbyBtYW55IGhlYWRlciBvcmRlcmluZyBwcm9ibGVtcy4gICovCitzdHJ1Y3Qgc2lnaW5mbzsKKworI2lmZGVmIF9fS0VSTkVMX18KKy8qIE1vc3QgdGhpbmdzIHNob3VsZCBiZSBjbGVhbiBlbm91Z2ggdG8gcmVkZWZpbmUgdGhpcyBhdCB3aWxsLCBpZiBjYXJlCisgICBpcyB0YWtlbiB0byBtYWtlIGxpYmMgbWF0Y2guICAqLworCisjZGVmaW5lIF9OU0lHCQk2NAorI2RlZmluZSBfTlNJR19CUFcJMzIKKyNkZWZpbmUgX05TSUdfV09SRFMJKF9OU0lHIC8gX05TSUdfQlBXKQorCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgb2xkX3NpZ3NldF90OwkJLyogYXQgbGVhc3QgMzIgYml0cyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZwlzaWdbX05TSUdfV09SRFNdOworfSBzaWdzZXRfdDsKKworI2Vsc2UKKy8qIEhlcmUgd2UgbXVzdCBjYXRlciB0byBsaWJjcyB0aGF0IHBva2UgYWJvdXQgaW4ga2VybmVsIGhlYWRlcnMuICAqLworCisjZGVmaW5lIE5TSUcJCTMyCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgc2lnc2V0X3Q7CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNkZWZpbmUgU0lHSFVQCQkgMQorI2RlZmluZSBTSUdJTlQJCSAyCisjZGVmaW5lIFNJR1FVSVQJCSAzCisjZGVmaW5lIFNJR0lMTAkJIDQKKyNkZWZpbmUgU0lHVFJBUAkJIDUKKyNkZWZpbmUgU0lHQUJSVAkJIDYKKyNkZWZpbmUgU0lHSU9UCQkgNgorI2RlZmluZSBTSUdCVVMJCSA3CisjZGVmaW5lIFNJR0ZQRQkJIDgKKyNkZWZpbmUgU0lHS0lMTAkJIDkKKyNkZWZpbmUgU0lHVVNSMQkJMTAKKyNkZWZpbmUgU0lHU0VHVgkJMTEKKyNkZWZpbmUgU0lHVVNSMgkJMTIKKyNkZWZpbmUgU0lHUElQRQkJMTMKKyNkZWZpbmUgU0lHQUxSTQkJMTQKKyNkZWZpbmUgU0lHVEVSTQkJMTUKKyNkZWZpbmUgU0lHU1RLRkxUCTE2CisjZGVmaW5lIFNJR0NITEQJCTE3CisjZGVmaW5lIFNJR0NPTlQJCTE4CisjZGVmaW5lIFNJR1NUT1AJCTE5CisjZGVmaW5lIFNJR1RTVFAJCTIwCisjZGVmaW5lIFNJR1RUSU4JCTIxCisjZGVmaW5lIFNJR1RUT1UJCTIyCisjZGVmaW5lIFNJR1VSRwkJMjMKKyNkZWZpbmUgU0lHWENQVQkJMjQKKyNkZWZpbmUgU0lHWEZTWgkJMjUKKyNkZWZpbmUgU0lHVlRBTFJNCTI2CisjZGVmaW5lIFNJR1BST0YJCTI3CisjZGVmaW5lIFNJR1dJTkNICTI4CisjZGVmaW5lIFNJR0lPCQkyOQorI2RlZmluZSBTSUdQT0xMCQlTSUdJTworLyoKKyNkZWZpbmUgU0lHTE9TVAkJMjkKKyovCisjZGVmaW5lIFNJR1BXUgkJMzAKKyNkZWZpbmUgU0lHU1lTCQkzMQorI2RlZmluZQlTSUdVTlVTRUQJMzEKKworLyogVGhlc2Ugc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGNvbnN0YW50cyBmcm9tIHVzZXJsYW5kLiAgKi8KKyNkZWZpbmUgU0lHUlRNSU4JMzIKKyNkZWZpbmUgU0lHUlRNQVgJKF9OU0lHLTEpCisKKy8qCisgKiBTQV9GTEFHUyB2YWx1ZXM6CisgKgorICogU0FfT05TVEFDSyBpbmRpY2F0ZXMgdGhhdCBhIHJlZ2lzdGVyZWQgc3RhY2tfdCB3aWxsIGJlIHVzZWQuCisgKiBTQV9SRVNUQVJUIGZsYWcgdG8gZ2V0IHJlc3RhcnRpbmcgc2lnbmFscyAod2hpY2ggd2VyZSB0aGUgZGVmYXVsdCBsb25nIGFnbykKKyAqIFNBX05PQ0xEU1RPUCBmbGFnIHRvIHR1cm4gb2ZmIFNJR0NITEQgd2hlbiBjaGlsZHJlbiBzdG9wLgorICogU0FfUkVTRVRIQU5EIGNsZWFycyB0aGUgaGFuZGxlciB3aGVuIHRoZSBzaWduYWwgaXMgZGVsaXZlcmVkLgorICogU0FfTk9DTERXQUlUIGZsYWcgb24gU0lHQ0hMRCB0byBpbmhpYml0IHpvbWJpZXMuCisgKiBTQV9OT0RFRkVSIHByZXZlbnRzIHRoZSBjdXJyZW50IHNpZ25hbCBmcm9tIGJlaW5nIG1hc2tlZCBpbiB0aGUgaGFuZGxlci4KKyAqCisgKiBTQV9PTkVTSE9UIGFuZCBTQV9OT01BU0sgYXJlIHRoZSBoaXN0b3JpY2FsIExpbnV4IG5hbWVzIGZvciB0aGUgU2luZ2xlCisgKiBVbml4IG5hbWVzIFJFU0VUSEFORCBhbmQgTk9ERUZFUiByZXNwZWN0aXZlbHkuCisgKi8KKyNkZWZpbmUgU0FfTk9DTERTVE9QCTB4MDAwMDAwMDFVCisjZGVmaW5lIFNBX05PQ0xEV0FJVAkweDAwMDAwMDAyVQorI2RlZmluZSBTQV9TSUdJTkZPCTB4MDAwMDAwMDRVCisjZGVmaW5lIFNBX09OU1RBQ0sJMHgwODAwMDAwMFUKKyNkZWZpbmUgU0FfUkVTVEFSVAkweDEwMDAwMDAwVQorI2RlZmluZSBTQV9OT0RFRkVSCTB4NDAwMDAwMDBVCisjZGVmaW5lIFNBX1JFU0VUSEFORAkweDgwMDAwMDAwVQorCisjZGVmaW5lIFNBX05PTUFTSwlTQV9OT0RFRkVSCisjZGVmaW5lIFNBX09ORVNIT1QJU0FfUkVTRVRIQU5ECisKKyNkZWZpbmUgU0FfUkVTVE9SRVIJMHgwNDAwMDAwMAorCisvKgorICogc2lnYWx0c3RhY2sgY29udHJvbHMKKyAqLworI2RlZmluZSBTU19PTlNUQUNLCTEKKyNkZWZpbmUgU1NfRElTQUJMRQkyCisKKyNkZWZpbmUgTUlOU0lHU1RLU1oJMjA0OAorI2RlZmluZSBTSUdTVEtTWgk4MTkyCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zaWduYWwuaD4KKworI2lmZGVmIF9fS0VSTkVMX18KK3N0cnVjdCBvbGRfc2lnYWN0aW9uIHsKKwlfX3NpZ2hhbmRsZXJfdCBzYV9oYW5kbGVyOworCW9sZF9zaWdzZXRfdCBzYV9tYXNrOworCXVuc2lnbmVkIGxvbmcgc2FfZmxhZ3M7CisJX19zaWdyZXN0b3JlX3Qgc2FfcmVzdG9yZXI7Cit9OworCitzdHJ1Y3Qgc2lnYWN0aW9uIHsKKwlfX3NpZ2hhbmRsZXJfdCBzYV9oYW5kbGVyOworCXVuc2lnbmVkIGxvbmcgc2FfZmxhZ3M7CisJX19zaWdyZXN0b3JlX3Qgc2FfcmVzdG9yZXI7CisJc2lnc2V0X3Qgc2FfbWFzazsJCS8qIG1hc2sgbGFzdCBmb3IgZXh0ZW5zaWJpbGl0eSAqLworfTsKKworc3RydWN0IGtfc2lnYWN0aW9uIHsKKwlzdHJ1Y3Qgc2lnYWN0aW9uIHNhOworfTsKKyNlbHNlCisvKiBIZXJlIHdlIG11c3QgY2F0ZXIgdG8gbGliY3MgdGhhdCBwb2tlIGFib3V0IGluIGtlcm5lbCBoZWFkZXJzLiAgKi8KKworc3RydWN0IHNpZ2FjdGlvbiB7CisJdW5pb24geworCSAgX19zaWdoYW5kbGVyX3QgX3NhX2hhbmRsZXI7CisJICB2b2lkICgqX3NhX3NpZ2FjdGlvbikoaW50LCBzdHJ1Y3Qgc2lnaW5mbyAqLCB2b2lkICopOworCX0gX3U7CisJc2lnc2V0X3Qgc2FfbWFzazsKKwl1bnNpZ25lZCBsb25nIHNhX2ZsYWdzOworCXZvaWQgKCpzYV9yZXN0b3Jlcikodm9pZCk7Cit9OworCisjZGVmaW5lIHNhX2hhbmRsZXIJX3UuX3NhX2hhbmRsZXIKKyNkZWZpbmUgc2Ffc2lnYWN0aW9uCV91Ll9zYV9zaWdhY3Rpb24KKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc2lnYWx0c3RhY2sgeworCXZvaWQgX191c2VyCSpzc19zcDsKKwlpbnQJCXNzX2ZsYWdzOworCXNpemVfdAkJc3Nfc2l6ZTsKK30gc3RhY2tfdDsKKworI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxhc20vc2lnY29udGV4dC5oPgorCisKK3N0cnVjdCBwdF9yZWdzOworI2RlZmluZSBwdHJhY2Vfc2lnbmFsX2RlbGl2ZXIocmVncywgY29va2llKSBkbyB7IH0gd2hpbGUgKDApCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfQVNNX1NJR05BTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL3NtcC5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9zbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWI4YzYxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9zbXAuaApAQCAtMCwwICsxLDE4IEBACisvKiBNTjEwMzAwIFNNUCBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fU01QX0gKKyNkZWZpbmUgX0FTTV9TTVBfSAorCisjaWZkZWYgQ09ORklHX1NNUAorI2Vycm9yIFNNUCBub3QgeWV0IHN1cHBvcnRlZCBmb3IgTU4xMDMwMAorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9zb2NrZXQuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTljYTY0OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvc29ja2V0LmgKQEAgLTAsMCArMSw1NSBAQAorI2lmbmRlZiBfQVNNX1NPQ0tFVF9ICisjZGVmaW5lIF9BU01fU09DS0VUX0gKKworI2luY2x1ZGUgPGFzbS9zb2NraW9zLmg+CisKKy8qIEZvciBzZXRzb2Nrb3B0KDIpICovCisjZGVmaW5lIFNPTF9TT0NLRVQJMQorCisjZGVmaW5lIFNPX0RFQlVHCTEKKyNkZWZpbmUgU09fUkVVU0VBRERSCTIKKyNkZWZpbmUgU09fVFlQRQkJMworI2RlZmluZSBTT19FUlJPUgk0CisjZGVmaW5lIFNPX0RPTlRST1VURQk1CisjZGVmaW5lIFNPX0JST0FEQ0FTVAk2CisjZGVmaW5lIFNPX1NOREJVRgk3CisjZGVmaW5lIFNPX1JDVkJVRgk4CisjZGVmaW5lIFNPX1NOREJVRkZPUkNFCTMyCisjZGVmaW5lIFNPX1JDVkJVRkZPUkNFCTMzCisjZGVmaW5lIFNPX0tFRVBBTElWRQk5CisjZGVmaW5lIFNPX09PQklOTElORQkxMAorI2RlZmluZSBTT19OT19DSEVDSwkxMQorI2RlZmluZSBTT19QUklPUklUWQkxMgorI2RlZmluZSBTT19MSU5HRVIJMTMKKyNkZWZpbmUgU09fQlNEQ09NUEFUCTE0CisvKiBUbyBhZGQgOiNkZWZpbmUgU09fUkVVU0VQT1JUIDE1ICovCisjZGVmaW5lIFNPX1BBU1NDUkVECTE2CisjZGVmaW5lIFNPX1BFRVJDUkVECTE3CisjZGVmaW5lIFNPX1JDVkxPV0FUCTE4CisjZGVmaW5lIFNPX1NORExPV0FUCTE5CisjZGVmaW5lIFNPX1JDVlRJTUVPCTIwCisjZGVmaW5lIFNPX1NORFRJTUVPCTIxCisKKy8qIFNlY3VyaXR5IGxldmVscyAtIGFzIHBlciBOUkwgSVB2NiAtIGRvbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nICovCisjZGVmaW5lIFNPX1NFQ1VSSVRZX0FVVEhFTlRJQ0FUSU9OCQkyMgorI2RlZmluZSBTT19TRUNVUklUWV9FTkNSWVBUSU9OX1RSQU5TUE9SVAkyMworI2RlZmluZSBTT19TRUNVUklUWV9FTkNSWVBUSU9OX05FVFdPUksJCTI0CisKKyNkZWZpbmUgU09fQklORFRPREVWSUNFCTI1CisKKy8qIFNvY2tldCBmaWx0ZXJpbmcgKi8KKyNkZWZpbmUgU09fQVRUQUNIX0ZJTFRFUiAgICAgICAgMjYKKyNkZWZpbmUgU09fREVUQUNIX0ZJTFRFUiAgICAgICAgMjcKKworI2RlZmluZSBTT19QRUVSTkFNRQkJMjgKKyNkZWZpbmUgU09fVElNRVNUQU1QCQkyOQorI2RlZmluZSBTQ01fVElNRVNUQU1QCQlTT19USU1FU1RBTVAKKworI2RlZmluZSBTT19BQ0NFUFRDT05OCQkzMAorCisjZGVmaW5lIFNPX1BFRVJTRUMJCTMxCisjZGVmaW5lIFNPX1BBU1NTRUMJCTM0CisjZGVmaW5lIFNPX1RJTUVTVEFNUE5TCQkzNQorI2RlZmluZSBTQ01fVElNRVNUQU1QTlMJCVNPX1RJTUVTVEFNUE5TCisKKyNlbmRpZiAvKiBfQVNNX1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL3NvY2tpb3MuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvc29ja2lvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMzA0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3NvY2tpb3MuaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIF9BU01fU09DS0lPU19ICisjZGVmaW5lIF9BU01fU09DS0lPU19ICisKKy8qIFNvY2tldC1sZXZlbCBJL08gY29udHJvbCBjYWxscy4gKi8KKyNkZWZpbmUgRklPU0VUT1dOIAkweDg5MDEKKyNkZWZpbmUgU0lPQ1NQR1JQCTB4ODkwMgorI2RlZmluZSBGSU9HRVRPV04JMHg4OTAzCisjZGVmaW5lIFNJT0NHUEdSUAkweDg5MDQKKyNkZWZpbmUgU0lPQ0FUTUFSSwkweDg5MDUKKyNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAqLworI2RlZmluZSBTSU9DR1NUQU1QTlMJMHg4OTA3CQkvKiBHZXQgc3RhbXAgKHRpbWVzcGVjKSAqLworCisjZW5kaWYgLyogX0FTTV9TT0NLSU9TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvc3BpbmxvY2suaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvc3BpbmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmY5YzhiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9zcGlubG9jay5oCkBAIC0wLDAgKzEsMTYgQEAKKy8qIE1OMTAzMDAgc3BpbmxvY2sgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfQVNNX1NQSU5MT0NLX0gKKyNkZWZpbmUgX0FTTV9TUElOTE9DS19ICisKKyNlcnJvciBTTVAgc3BpbmxvY2tzIG5vdCBpbXBsZW1lbnRlZCBmb3IgTU4xMDMwMAorCisjZW5kaWYgLyogX0FTTV9TUElOTE9DS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL3N0YXQuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZmY4MzcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3N0YXQuaApAQCAtMCwwICsxLDc4IEBACisjaWZuZGVmIF9BU01fU1RBVF9ICisjZGVmaW5lIF9BU01fU1RBVF9ICisKK3N0cnVjdCBfX29sZF9rZXJuZWxfc3RhdCB7CisJdW5zaWduZWQgc2hvcnQgc3RfZGV2OworCXVuc2lnbmVkIHNob3J0IHN0X2lubzsKKwl1bnNpZ25lZCBzaG9ydCBzdF9tb2RlOworCXVuc2lnbmVkIHNob3J0IHN0X25saW5rOworCXVuc2lnbmVkIHNob3J0IHN0X3VpZDsKKwl1bnNpZ25lZCBzaG9ydCBzdF9naWQ7CisJdW5zaWduZWQgc2hvcnQgc3RfcmRldjsKKwl1bnNpZ25lZCBsb25nICBzdF9zaXplOworCXVuc2lnbmVkIGxvbmcgIHN0X2F0aW1lOworCXVuc2lnbmVkIGxvbmcgIHN0X210aW1lOworCXVuc2lnbmVkIGxvbmcgIHN0X2N0aW1lOworfTsKKworc3RydWN0IHN0YXQgeworCXVuc2lnbmVkIGxvbmcgIHN0X2RldjsKKwl1bnNpZ25lZCBsb25nICBzdF9pbm87CisJdW5zaWduZWQgc2hvcnQgc3RfbW9kZTsKKwl1bnNpZ25lZCBzaG9ydCBzdF9ubGluazsKKwl1bnNpZ25lZCBzaG9ydCBzdF91aWQ7CisJdW5zaWduZWQgc2hvcnQgc3RfZ2lkOworCXVuc2lnbmVkIGxvbmcgIHN0X3JkZXY7CisJdW5zaWduZWQgbG9uZyAgc3Rfc2l6ZTsKKwl1bnNpZ25lZCBsb25nICBzdF9ibGtzaXplOworCXVuc2lnbmVkIGxvbmcgIHN0X2Jsb2NrczsKKwl1bnNpZ25lZCBsb25nICBzdF9hdGltZTsKKwl1bnNpZ25lZCBsb25nICBzdF9hdGltZV9uc2VjOworCXVuc2lnbmVkIGxvbmcgIHN0X210aW1lOworCXVuc2lnbmVkIGxvbmcgIHN0X210aW1lX25zZWM7CisJdW5zaWduZWQgbG9uZyAgc3RfY3RpbWU7CisJdW5zaWduZWQgbG9uZyAgc3RfY3RpbWVfbnNlYzsKKwl1bnNpZ25lZCBsb25nICBfX3VudXNlZDQ7CisJdW5zaWduZWQgbG9uZyAgX191bnVzZWQ1OworfTsKKworLyogVGhpcyBtYXRjaGVzIHN0cnVjdCBzdGF0NjQgaW4gZ2xpYmMyLjEsIGhlbmNlIHRoZSBhYnNvbHV0ZWx5CisgKiBpbnNhbmUgYW1vdW50cyBvZiBwYWRkaW5nIGFyb3VuZCBkZXZfdCdzLgorICovCitzdHJ1Y3Qgc3RhdDY0IHsKKwl1bnNpZ25lZCBsb25nIGxvbmcJc3RfZGV2OworCXVuc2lnbmVkIGNoYXIJX19wYWQwWzRdOworCisjZGVmaW5lIFNUQVQ2NF9IQVNfQlJPS0VOX1NUX0lOTwkxCisJdW5zaWduZWQgbG9uZwlfX3N0X2lubzsKKworCXVuc2lnbmVkIGludAlzdF9tb2RlOworCXVuc2lnbmVkIGludAlzdF9ubGluazsKKworCXVuc2lnbmVkIGxvbmcJc3RfdWlkOworCXVuc2lnbmVkIGxvbmcJc3RfZ2lkOworCisJdW5zaWduZWQgbG9uZyBsb25nCXN0X3JkZXY7CisJdW5zaWduZWQgY2hhcglfX3BhZDNbNF07CisKKwlsb25nIGxvbmcJc3Rfc2l6ZTsKKwl1bnNpZ25lZCBsb25nCXN0X2Jsa3NpemU7CisKKwl1bnNpZ25lZCBsb25nCXN0X2Jsb2NrczsJLyogTnVtYmVyIDUxMi1ieXRlIGJsb2NrcyBhbGxvY2F0ZWQuICovCisJdW5zaWduZWQgbG9uZwlfX3BhZDQ7CQkvKiBmdXR1cmUgcG9zc2libGUgc3RfYmxvY2tzIGhpZ2ggYml0cyAqLworCisJdW5zaWduZWQgbG9uZwlzdF9hdGltZTsKKwl1bnNpZ25lZCBsb25nCXN0X2F0aW1lX25zZWM7CisKKwl1bnNpZ25lZCBsb25nCXN0X210aW1lOworCXVuc2lnbmVkIGludAlzdF9tdGltZV9uc2VjOworCisJdW5zaWduZWQgbG9uZwlzdF9jdGltZTsKKwl1bnNpZ25lZCBsb25nCXN0X2N0aW1lX25zZWM7CisKKwl1bnNpZ25lZCBsb25nIGxvbmcJc3RfaW5vOworfTsKKworI2RlZmluZSBTVEFUX0hBVkVfTlNFQyAxCisKKyNlbmRpZiAvKiBfQVNNX1NUQVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9zdGF0ZnMuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvc3RhdGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI5MWZlMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvc3RhdGZzLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3N0YXRmcy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC9zdHJpbmcuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdkYmQ0MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvc3RyaW5nLmgKQEAgLTAsMCArMSwzMiBAQAorLyogTU4xMDMwMCBPcHRpbWlzZWQgc3RyaW5nIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNYXRzdXNoaXRhIEVsZWN0cmljIEluZHVzdHJpYWwgQ28uLCBMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogTW9kaWZpZWQgYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fU1RSSU5HX0gKKyNkZWZpbmUgX0FTTV9TVFJJTkdfSAorCisjZGVmaW5lIF9fSEFWRV9BUkNIX01FTVNFVAorI2RlZmluZSBfX0hBVkVfQVJDSF9NRU1DUFkKKyNkZWZpbmUgX19IQVZFX0FSQ0hfTUVNTU9WRQorCitleHRlcm4gdm9pZCAqbWVtc2V0KHZvaWQgKmRlc3QsIGludCBjaCwgc2l6ZV90IGNvdW50KTsKK2V4dGVybiB2b2lkICptZW1jcHkodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgY291bnQpOworZXh0ZXJuIHZvaWQgKm1lbW1vdmUodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgY291bnQpOworCisKK2V4dGVybiB2b2lkIF9fc3RydWN0X2NweV9idWcodm9pZCk7CisjZGVmaW5lIHN0cnVjdF9jcHkoeCwgeSkJCQlcCisoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKHNpemVvZigqKHgpKSAhPSBzaXplb2YoKih5KSkpICAgICAgIFwKKwkJX19zdHJ1Y3RfY3B5X2J1ZzsgICAgICAgICAgICAgICBcCisJbWVtY3B5KHgsIHksIHNpemVvZigqKHgpKSk7ICAgICAgICAgICAgIFwKK30pCisKKyNlbmRpZiAvKiBfQVNNX1NUUklOR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9zeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjE0ZmI3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC9zeXN0ZW0uaApAQCAtMCwwICsxLDIzNyBAQAorLyogTU4xMDMwMCBTeXN0ZW0gZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9TWVNURU1fSAorI2RlZmluZSBfQVNNX1NZU1RFTV9ICisKKyNpbmNsdWRlIDxhc20vY3B1LXJlZ3MuaD4KKworI2lmZGVmIF9fS0VSTkVMX18KKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworc3RydWN0IHRhc2tfc3RydWN0Oworc3RydWN0IHRocmVhZF9zdHJ1Y3Q7CisKK2V4dGVybiBhc21saW5rYWdlCitzdHJ1Y3QgdGFza19zdHJ1Y3QgKl9fc3dpdGNoX3RvKHN0cnVjdCB0aHJlYWRfc3RydWN0ICpwcmV2LAorCQkJCXN0cnVjdCB0aHJlYWRfc3RydWN0ICpuZXh0LAorCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldl90YXNrKTsKKworLyogY29udGV4dCBzd2l0Y2hpbmcgaXMgbm93IHBlcmZvcm1lZCBvdXQtb2YtbGluZSBpbiBzd2l0Y2hfdG8uUyAqLworI2RlZmluZSBzd2l0Y2hfdG8ocHJldiwgbmV4dCwgbGFzdCkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJY3VycmVudC0+dGhyZWFkLndjaGFuID0gKHVfbG9uZykgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOwlcCisJKGxhc3QpID0gX19zd2l0Y2hfdG8oJihwcmV2KS0+dGhyZWFkLCAmKG5leHQpLT50aHJlYWQsIChwcmV2KSk7CVwKKwltYigpOwkJCQkJCQkJXAorCWN1cnJlbnQtPnRocmVhZC53Y2hhbiA9IDA7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGFyY2hfYWxpZ25fc3RhY2soeCkgKHgpCisKKyNkZWZpbmUgbm9wKCkgYXNtIHZvbGF0aWxlICgibm9wIikKKworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworLyoKKyAqIEZvcmNlIHN0cmljdCBDUFUgb3JkZXJpbmcuCisgKiBBbmQgeWVzLCB0aGlzIGlzIHJlcXVpcmVkIG9uIFVQIHRvbyB3aGVuIHdlJ3JlIHRhbGtpbmcKKyAqIHRvIGRldmljZXMuCisgKgorICogRm9yIG5vdywgIndtYigpIiBkb2Vzbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nLCBhcyBhbGwKKyAqIEludGVsIENQVSdzIGZvbGxvdyB3aGF0IEludGVsIGNhbGxzIGEgKlByb2Nlc3NvciBPcmRlciosCisgKiBpbiB3aGljaCBhbGwgd3JpdGVzIGFyZSBzZWVuIGluIHRoZSBwcm9ncmFtIG9yZGVyIGV2ZW4KKyAqIG91dHNpZGUgdGhlIENQVS4KKyAqCisgKiBJIGV4cGVjdCBmdXR1cmUgSW50ZWwgQ1BVJ3MgdG8gaGF2ZSBhIHdlYWtlciBvcmRlcmluZywKKyAqIGJ1dCBJJ2QgYWxzbyBleHBlY3QgdGhlbSB0byBmaW5hbGx5IGdldCB0aGVpciBhY3QgdG9nZXRoZXIKKyAqIGFuZCBhZGQgc29tZSByZWFsIG1lbW9yeSBiYXJyaWVycyBpZiBzby4KKyAqCisgKiBTb21lIG5vbiBpbnRlbCBjbG9uZXMgc3VwcG9ydCBvdXQgb2Ygb3JkZXIgc3RvcmUuIHdtYigpIGNlYXNlcyB0byBiZSBhCisgKiBub3AgZm9yIHRoZXNlLgorICovCisKKyNkZWZpbmUgbWIoKQlhc20gdm9sYXRpbGUgKCIiOiA6IDoibWVtb3J5IikKKyNkZWZpbmUgcm1iKCkJbWIoKQorI2RlZmluZSB3bWIoKQlhc20gdm9sYXRpbGUgKCIiOiA6IDoibWVtb3J5IikKKworI2lmZGVmIENPTkZJR19TTVAKKyNkZWZpbmUgc21wX21iKCkJbWIoKQorI2RlZmluZSBzbXBfcm1iKCkJcm1iKCkKKyNkZWZpbmUgc21wX3dtYigpCXdtYigpCisjZWxzZQorI2RlZmluZSBzbXBfbWIoKQliYXJyaWVyKCkKKyNkZWZpbmUgc21wX3JtYigpCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfd21iKCkJYmFycmllcigpCisjZW5kaWYKKworI2RlZmluZSBzZXRfbWIodmFyLCB2YWx1ZSkgIGRvIHsgdmFyID0gdmFsdWU7ICBtYigpOyB9IHdoaWxlICgwKQorI2RlZmluZSBzZXRfd21iKHZhciwgdmFsdWUpIGRvIHsgdmFyID0gdmFsdWU7IHdtYigpOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIHJlYWRfYmFycmllcl9kZXBlbmRzKCkJCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlkbyB7fSB3aGlsZSAoMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGludGVycnVwdCBjb250cm9sCisgKiAtICJkaXNhYmxlZCI6IHJ1biBpbiBJTTEvMgorICogICAtIGxldmVsIDAgLSBHREIgc3R1YgorICogICAtIGxldmVsIDEgLSB2aXJ0dWFsIHNlcmlhbCBETUEgKGlmIHByZXNlbnQpCisgKiAgIC0gbGV2ZWwgNSAtIG5vcm1hbCBpbnRlcnJ1cHQgcHJpb3JpdHkKKyAqICAgLSBsZXZlbCA2IC0gdGltZXIgaW50ZXJydXB0CisgKiAtICJlbmFibGVkIjogIHJ1biBpbiBJTTcKKyAqLworI2lmZGVmIENPTkZJR19NTjEwMzAwX1RUWVNNCisjZGVmaW5lIE1OMTAzMDBfQ0xJX0xFVkVMCUVQU1dfSU1fMgorI2Vsc2UKKyNkZWZpbmUgTU4xMDMwMF9DTElfTEVWRUwJRVBTV19JTV8xCisjZW5kaWYKKworI2RlZmluZSBsb2NhbF9zYXZlX2ZsYWdzKHgpCQkJXAorZG8gewkJCQkJCVwKKwl0eXBlY2hlY2sodW5zaWduZWQgbG9uZywgeCk7CQlcCisJYXNtIHZvbGF0aWxlKAkJCQlcCisJCSIJbW92IGVwc3csJTAJXG4iCVwKKwkJOiAiPWQiKHgpCQkJXAorCQkpOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGxvY2FsX2lycV9kaXNhYmxlKCkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWFzbSB2b2xhdGlsZSgJCQkJCQkJXAorCQkiCWFuZCAlMCxlcHN3CVxuIgkJCQlcCisJCSIJb3IgJTEsZXBzdwlcbiIJCQkJXAorCQkiCW5vcAkJXG4iCQkJCVwKKwkJIglub3AJCVxuIgkJCQlcCisJCSIJbm9wCQlcbiIJCQkJXAorCQk6CQkJCQkJCVwKKwkJOiAiaSIofkVQU1dfSU0pLCAiaSIoRVBTV19JRSB8IE1OMTAzMDBfQ0xJX0xFVkVMKQlcCisJCSk7CQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgbG9jYWxfaXJxX3NhdmUoeCkJCQlcCitkbyB7CQkJCQkJXAorCWxvY2FsX3NhdmVfZmxhZ3MoeCk7CQkJXAorCWxvY2FsX2lycV9kaXNhYmxlKCk7CQkJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIHdlIG1ha2Ugc3VyZSBsb2NhbF9pcnFfZW5hYmxlKCkgZG9lc24ndCBjYXVzZSBwcmlvcml0eSBpbnZlcnNpb24KKyAqLworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19tbjEwMzAwX2lycV9lbmFibGVkX2Vwc3c7CisKKyNlbmRpZgorCisjZGVmaW5lIGxvY2FsX2lycV9lbmFibGUoKQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyB0bXA7CQkJCQkJXAorCQkJCQkJCQkJXAorCWFzbSB2b2xhdGlsZSgJCQkJCQkJXAorCQkiCW1vdgllcHN3LCUwCQlcbiIJCQlcCisJCSIJYW5kCSUxLCUwCQlcbiIJCQlcCisJCSIJb3IJJTIsJTAJCVxuIgkJCVwKKwkJIgltb3YJJTAsZXBzdwkJXG4iCQkJXAorCQk6ICI9JmQiKHRtcCkJCQkJCQlcCisJCTogImkiKH5FUFNXX0lNKSwgInIiKF9fbW4xMDMwMF9pcnFfZW5hYmxlZF9lcHN3KQlcCisJCSk7CQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgbG9jYWxfaXJxX3Jlc3RvcmUoeCkJCQlcCitkbyB7CQkJCQkJXAorCXR5cGVjaGVjayh1bnNpZ25lZCBsb25nLCB4KTsJCVwKKwlhc20gdm9sYXRpbGUoCQkJCVwKKwkJIgltb3YgJTAsZXBzdwlcbiIJXAorCQkiCW5vcAkJXG4iCVwKKwkJIglub3AJCVxuIglcCisJCSIJbm9wCQlcbiIJXAorCQk6CQkJCVwKKwkJOiAiZCIoeCkJCQlcCisJCTogIm1lbW9yeSIsICJjYyIJCVwKKwkJKTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBpcnFzX2Rpc2FibGVkKCkJCQkJXAorKHsJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBmbGFnczsJCQlcCisJbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7CQlcCisJKGZsYWdzICYgRVBTV19JTSkgPD0gTU4xMDMwMF9DTElfTEVWRUw7CVwKK30pCisKKy8qIGhvb2sgdG8gc2F2ZSBwb3dlciBieSBoYWx0aW5nIHRoZSBDUFUKKyAqIC0gY2FsbGVkIGZyb20gdGhlIGlkbGUgbG9vcAorICogLSBtdXN0IHJlZW5hYmxlIGludGVycnVwdHMgKHdoaWNoIHRha2VzIHRocmVlIGluc3RydWN0aW9uIGN5Y2xlcyB0byBjb21wbGV0ZSkKKyAqLworI2RlZmluZSBzYWZlX2hhbHQoKQkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWFzbSB2b2xhdGlsZSgiCW9yCSUwLGVwc3cJXG4iCQkJCVwKKwkJICAgICAiCW5vcAkJXG4iCQkJCVwKKwkJICAgICAiCW5vcAkJXG4iCQkJCVwKKwkJICAgICAiCWJzZXQJJTIsKCUxKQlcbiIJCQkJXAorCQkgICAgIDoJCQkJCQkJXAorCQkgICAgIDogImkiKEVQU1dfSUV8RVBTV19JTSksICJuIigmQ1BVTSksICJpIihDUFVNX1NMRUVQKVwKKwkJICAgICA6ICJjYyIJCQkJCQlcCisJCSAgICAgKTsJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTVEkJb3IgRVBTV19JRXxFUFNXX0lNLGVwc3cKKyNkZWZpbmUgQ0xJCWFuZCB+RVBTV19JTSxlcHN3OyBvciBFUFNXX0lFfE1OMTAzMDBfQ0xJX0xFVkVMLGVwc3c7IG5vcDsgbm9wOyBub3AKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIE1OMTAzMDAgZG9lc24ndCBhY3R1YWxseSBoYXZlIGFuIGV4Y2hhbmdlIGluc3RydWN0aW9uCisgKi8KKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKK3N0cnVjdCBfX3hjaGdfZHVtbXkgeyB1bnNpZ25lZCBsb25nIGFbMTAwXTsgfTsKKyNkZWZpbmUgX194Zyh4KSAoKHN0cnVjdCBfX3hjaGdfZHVtbXkgKikoeCkpCisKK3N0YXRpYyBpbmxpbmUKK3Vuc2lnbmVkIGxvbmcgX194Y2hnKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKm0sIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgcmV0dmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJcmV0dmFsID0gKm07CisJKm0gPSB2YWw7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKKyNkZWZpbmUgeGNoZyhwdHIsIHYpCQkJCQkJXAorCSgoX190eXBlb2ZfXygqKHB0cikpKSBfX3hjaGcoKHVuc2lnbmVkIGxvbmcgKikocHRyKSwJXAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpKHYpKSkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fY21weGNoZyh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICptLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2xkLCB1bnNpZ25lZCBsb25nIG5ldykKK3sKKwl1bnNpZ25lZCBsb25nIHJldHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXJldHZhbCA9ICptOworCWlmIChyZXR2YWwgPT0gb2xkKQorCQkqbSA9IG5ldzsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworI2RlZmluZSBjbXB4Y2hnKHB0ciwgbywgbikJCQkJCVwKKwkoKF9fdHlwZW9mX18oKihwdHIpKSkgX19jbXB4Y2hnKCh1bnNpZ25lZCBsb25nICopKHB0ciksIFwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpKG8pLAlcCisJCQkJCSh1bnNpZ25lZCBsb25nKShuKSkpCisKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX0FTTV9TWVNURU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC90ZXJtYml0cy5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC90ZXJtYml0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMmIwZGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3Rlcm1iaXRzLmgKQEAgLTAsMCArMSwyMDAgQEAKKyNpZm5kZWYgX0FTTV9URVJNQklUU19ICisjZGVmaW5lIF9BU01fVEVSTUJJVFNfSAorCisjaW5jbHVkZSA8bGludXgvcG9zaXhfdHlwZXMuaD4KKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCWNjX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAlzcGVlZF90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJdGNmbGFnX3Q7CisKKyNkZWZpbmUgTkNDUyAxOQorc3RydWN0IHRlcm1pb3MgeworCXRjZmxhZ190IGNfaWZsYWc7CQkvKiBpbnB1dCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19vZmxhZzsJCS8qIG91dHB1dCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19jZmxhZzsJCS8qIGNvbnRyb2wgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfbGZsYWc7CQkvKiBsb2NhbCBtb2RlIGZsYWdzICovCisJY2NfdCBjX2xpbmU7CQkJLyogbGluZSBkaXNjaXBsaW5lICovCisJY2NfdCBjX2NjW05DQ1NdOwkJLyogY29udHJvbCBjaGFyYWN0ZXJzICovCit9OworCitzdHJ1Y3QgdGVybWlvczIgeworCXRjZmxhZ190IGNfaWZsYWc7CQkvKiBpbnB1dCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19vZmxhZzsJCS8qIG91dHB1dCBtb2RlIGZsYWdzICovCisJdGNmbGFnX3QgY19jZmxhZzsJCS8qIGNvbnRyb2wgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfbGZsYWc7CQkvKiBsb2NhbCBtb2RlIGZsYWdzICovCisJY2NfdCBjX2xpbmU7CQkJLyogbGluZSBkaXNjaXBsaW5lICovCisJY2NfdCBjX2NjW05DQ1NdOwkJLyogY29udHJvbCBjaGFyYWN0ZXJzICovCisJc3BlZWRfdCBjX2lzcGVlZDsJCS8qIGlucHV0IHNwZWVkICovCisJc3BlZWRfdCBjX29zcGVlZDsJCS8qIG91dHB1dCBzcGVlZCAqLworfTsKKworc3RydWN0IGt0ZXJtaW9zIHsKKwl0Y2ZsYWdfdCBjX2lmbGFnOwkJLyogaW5wdXQgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfb2ZsYWc7CQkvKiBvdXRwdXQgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfY2ZsYWc7CQkvKiBjb250cm9sIG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2xmbGFnOwkJLyogbG9jYWwgbW9kZSBmbGFncyAqLworCWNjX3QgY19saW5lOwkJCS8qIGxpbmUgZGlzY2lwbGluZSAqLworCWNjX3QgY19jY1tOQ0NTXTsJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLworCXNwZWVkX3QgY19pc3BlZWQ7CQkvKiBpbnB1dCBzcGVlZCAqLworCXNwZWVkX3QgY19vc3BlZWQ7CQkvKiBvdXRwdXQgc3BlZWQgKi8KK307CisKKy8qIGNfY2MgY2hhcmFjdGVycyAqLworI2RlZmluZSBWSU5UUiAwCisjZGVmaW5lIFZRVUlUIDEKKyNkZWZpbmUgVkVSQVNFIDIKKyNkZWZpbmUgVktJTEwgMworI2RlZmluZSBWRU9GIDQKKyNkZWZpbmUgVlRJTUUgNQorI2RlZmluZSBWTUlOIDYKKyNkZWZpbmUgVlNXVEMgNworI2RlZmluZSBWU1RBUlQgOAorI2RlZmluZSBWU1RPUCA5CisjZGVmaW5lIFZTVVNQIDEwCisjZGVmaW5lIFZFT0wgMTEKKyNkZWZpbmUgVlJFUFJJTlQgMTIKKyNkZWZpbmUgVkRJU0NBUkQgMTMKKyNkZWZpbmUgVldFUkFTRSAxNAorI2RlZmluZSBWTE5FWFQgMTUKKyNkZWZpbmUgVkVPTDIgMTYKKworCisvKiBjX2lmbGFnIGJpdHMgKi8KKyNkZWZpbmUgSUdOQlJLCTAwMDAwMDEKKyNkZWZpbmUgQlJLSU5UCTAwMDAwMDIKKyNkZWZpbmUgSUdOUEFSCTAwMDAwMDQKKyNkZWZpbmUgUEFSTVJLCTAwMDAwMTAKKyNkZWZpbmUgSU5QQ0sJMDAwMDAyMAorI2RlZmluZSBJU1RSSVAJMDAwMDA0MAorI2RlZmluZSBJTkxDUgkwMDAwMTAwCisjZGVmaW5lIElHTkNSCTAwMDAyMDAKKyNkZWZpbmUgSUNSTkwJMDAwMDQwMAorI2RlZmluZSBJVUNMQwkwMDAxMDAwCisjZGVmaW5lIElYT04JMDAwMjAwMAorI2RlZmluZSBJWEFOWQkwMDA0MDAwCisjZGVmaW5lIElYT0ZGCTAwMTAwMDAKKyNkZWZpbmUgSU1BWEJFTAkwMDIwMDAwCisjZGVmaW5lIElVVEY4CTAwNDAwMDAKKworLyogY19vZmxhZyBiaXRzICovCisjZGVmaW5lIE9QT1NUCTAwMDAwMDEKKyNkZWZpbmUgT0xDVUMJMDAwMDAwMgorI2RlZmluZSBPTkxDUgkwMDAwMDA0CisjZGVmaW5lIE9DUk5MCTAwMDAwMTAKKyNkZWZpbmUgT05PQ1IJMDAwMDAyMAorI2RlZmluZSBPTkxSRVQJMDAwMDA0MAorI2RlZmluZSBPRklMTAkwMDAwMTAwCisjZGVmaW5lIE9GREVMCTAwMDAyMDAKKyNkZWZpbmUgTkxETFkJMDAwMDQwMAorI2RlZmluZSAgIE5MMAkwMDAwMDAwCisjZGVmaW5lICAgTkwxCTAwMDA0MDAKKyNkZWZpbmUgQ1JETFkJMDAwMzAwMAorI2RlZmluZSAgIENSMAkwMDAwMDAwCisjZGVmaW5lICAgQ1IxCTAwMDEwMDAKKyNkZWZpbmUgICBDUjIJMDAwMjAwMAorI2RlZmluZSAgIENSMwkwMDAzMDAwCisjZGVmaW5lIFRBQkRMWQkwMDE0MDAwCisjZGVmaW5lICAgVEFCMAkwMDAwMDAwCisjZGVmaW5lICAgVEFCMQkwMDA0MDAwCisjZGVmaW5lICAgVEFCMgkwMDEwMDAwCisjZGVmaW5lICAgVEFCMwkwMDE0MDAwCisjZGVmaW5lICAgWFRBQlMJMDAxNDAwMAorI2RlZmluZSBCU0RMWQkwMDIwMDAwCisjZGVmaW5lICAgQlMwCTAwMDAwMDAKKyNkZWZpbmUgICBCUzEJMDAyMDAwMAorI2RlZmluZSBWVERMWQkwMDQwMDAwCisjZGVmaW5lICAgVlQwCTAwMDAwMDAKKyNkZWZpbmUgICBWVDEJMDA0MDAwMAorI2RlZmluZSBGRkRMWQkwMTAwMDAwCisjZGVmaW5lICAgRkYwCTAwMDAwMDAKKyNkZWZpbmUgICBGRjEJMDEwMDAwMAorCisvKiBjX2NmbGFnIGJpdCBtZWFuaW5nICovCisjZGVmaW5lIENCQVVECTAwMTAwMTcKKyNkZWZpbmUgIEIwCTAwMDAwMDAJCS8qIGhhbmcgdXAgKi8KKyNkZWZpbmUgIEI1MAkwMDAwMDAxCisjZGVmaW5lICBCNzUJMDAwMDAwMgorI2RlZmluZSAgQjExMAkwMDAwMDAzCisjZGVmaW5lICBCMTM0CTAwMDAwMDQKKyNkZWZpbmUgIEIxNTAJMDAwMDAwNQorI2RlZmluZSAgQjIwMAkwMDAwMDA2CisjZGVmaW5lICBCMzAwCTAwMDAwMDcKKyNkZWZpbmUgIEI2MDAJMDAwMDAxMAorI2RlZmluZSAgQjEyMDAJMDAwMDAxMQorI2RlZmluZSAgQjE4MDAJMDAwMDAxMgorI2RlZmluZSAgQjI0MDAJMDAwMDAxMworI2RlZmluZSAgQjQ4MDAJMDAwMDAxNAorI2RlZmluZSAgQjk2MDAJMDAwMDAxNQorI2RlZmluZSAgQjE5MjAwCTAwMDAwMTYKKyNkZWZpbmUgIEIzODQwMAkwMDAwMDE3CisjZGVmaW5lIEVYVEEgQjE5MjAwCisjZGVmaW5lIEVYVEIgQjM4NDAwCisjZGVmaW5lIENTSVpFCTAwMDAwNjAKKyNkZWZpbmUgICBDUzUJMDAwMDAwMAorI2RlZmluZSAgIENTNgkwMDAwMDIwCisjZGVmaW5lICAgQ1M3CTAwMDAwNDAKKyNkZWZpbmUgICBDUzgJMDAwMDA2MAorI2RlZmluZSBDU1RPUEIJMDAwMDEwMAorI2RlZmluZSBDUkVBRAkwMDAwMjAwCisjZGVmaW5lIFBBUkVOQgkwMDAwNDAwCisjZGVmaW5lIFBBUk9ERAkwMDAxMDAwCisjZGVmaW5lIEhVUENMCTAwMDIwMDAKKyNkZWZpbmUgQ0xPQ0FMCTAwMDQwMDAKKyNkZWZpbmUgQ0JBVURFWCAwMDEwMDAwCisjZGVmaW5lICAgQk9USEVSICAwMDEwMDAwCisjZGVmaW5lICAgIEI1NzYwMCAwMDEwMDAxCisjZGVmaW5lICAgQjExNTIwMCAwMDEwMDAyCisjZGVmaW5lICAgQjIzMDQwMCAwMDEwMDAzCisjZGVmaW5lICAgQjQ2MDgwMCAwMDEwMDA0CisjZGVmaW5lICAgQjUwMDAwMCAwMDEwMDA1CisjZGVmaW5lICAgQjU3NjAwMCAwMDEwMDA2CisjZGVmaW5lICAgQjkyMTYwMCAwMDEwMDA3CisjZGVmaW5lICBCMTAwMDAwMCAwMDEwMDEwCisjZGVmaW5lICBCMTE1MjAwMCAwMDEwMDExCisjZGVmaW5lICBCMTUwMDAwMCAwMDEwMDEyCisjZGVmaW5lICBCMjAwMDAwMCAwMDEwMDEzCisjZGVmaW5lICBCMjUwMDAwMCAwMDEwMDE0CisjZGVmaW5lICBCMzAwMDAwMCAwMDEwMDE1CisjZGVmaW5lICBCMzUwMDAwMCAwMDEwMDE2CisjZGVmaW5lICBCNDAwMDAwMCAwMDEwMDE3CisjZGVmaW5lIENJQkFVRAkgIDAwMjAwMzYwMDAwMAkvKiBpbnB1dCBiYXVkIHJhdGUgKG5vdCB1c2VkKSAqLworI2RlZmluZSBDVFZCCSAgMDA0MDAwMDAwMDAwCQkvKiBWaXNpb0JyYWlsbGUgVGVybWluYWwgZmxvdyBjb250cm9sICovCisjZGVmaW5lIENNU1BBUgkgIDAxMDAwMDAwMDAwMAkJLyogbWFyayBvciBzcGFjZSAoc3RpY2spIHBhcml0eSAqLworI2RlZmluZSBDUlRTQ1RTCSAgMDIwMDAwMDAwMDAwCQkvKiBmbG93IGNvbnRyb2wgKi8KKworI2RlZmluZSBJQlNISUZUCSAgMTYJCS8qIFNoaWZ0IGZyb20gQ0JBVUQgdG8gQ0lCQVVEICovCisKKy8qIGNfbGZsYWcgYml0cyAqLworI2RlZmluZSBJU0lHCTAwMDAwMDEKKyNkZWZpbmUgSUNBTk9OCTAwMDAwMDIKKyNkZWZpbmUgWENBU0UJMDAwMDAwNAorI2RlZmluZSBFQ0hPCTAwMDAwMTAKKyNkZWZpbmUgRUNIT0UJMDAwMDAyMAorI2RlZmluZSBFQ0hPSwkwMDAwMDQwCisjZGVmaW5lIEVDSE9OTAkwMDAwMTAwCisjZGVmaW5lIE5PRkxTSAkwMDAwMjAwCisjZGVmaW5lIFRPU1RPUAkwMDAwNDAwCisjZGVmaW5lIEVDSE9DVEwJMDAwMTAwMAorI2RlZmluZSBFQ0hPUFJUCTAwMDIwMDAKKyNkZWZpbmUgRUNIT0tFCTAwMDQwMDAKKyNkZWZpbmUgRkxVU0hPCTAwMTAwMDAKKyNkZWZpbmUgUEVORElOCTAwNDAwMDAKKyNkZWZpbmUgSUVYVEVOCTAxMDAwMDAKKworLyogdGNmbG93KCkgYW5kIFRDWE9OQyB1c2UgdGhlc2UgKi8KKyNkZWZpbmUJVENPT0ZGCQkwCisjZGVmaW5lCVRDT09OCQkxCisjZGVmaW5lCVRDSU9GRgkJMgorI2RlZmluZQlUQ0lPTgkJMworCisvKiB0Y2ZsdXNoKCkgYW5kIFRDRkxTSCB1c2UgdGhlc2UgKi8KKyNkZWZpbmUJVENJRkxVU0gJMAorI2RlZmluZQlUQ09GTFVTSAkxCisjZGVmaW5lCVRDSU9GTFVTSAkyCisKKy8qIHRjc2V0YXR0ciB1c2VzIHRoZXNlICovCisjZGVmaW5lCVRDU0FOT1cJCTAKKyNkZWZpbmUJVENTQURSQUlOCTEKKyNkZWZpbmUJVENTQUZMVVNICTIKKworI2VuZGlmIC8qIF9BU01fVEVSTUJJVFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC90ZXJtaW9zLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3Rlcm1pb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDdjZjYxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC90ZXJtaW9zLmgKQEAgLTAsMCArMSw5MiBAQAorI2lmbmRlZiBfQVNNX1RFUk1JT1NfSAorI2RlZmluZSBfQVNNX1RFUk1JT1NfSAorCisjaW5jbHVkZSA8YXNtL3Rlcm1iaXRzLmg+CisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgorCitzdHJ1Y3Qgd2luc2l6ZSB7CisJdW5zaWduZWQgc2hvcnQgd3Nfcm93OworCXVuc2lnbmVkIHNob3J0IHdzX2NvbDsKKwl1bnNpZ25lZCBzaG9ydCB3c194cGl4ZWw7CisJdW5zaWduZWQgc2hvcnQgd3NfeXBpeGVsOworfTsKKworI2RlZmluZSBOQ0MgOAorc3RydWN0IHRlcm1pbyB7CisJdW5zaWduZWQgc2hvcnQgY19pZmxhZzsJCS8qIGlucHV0IG1vZGUgZmxhZ3MgKi8KKwl1bnNpZ25lZCBzaG9ydCBjX29mbGFnOwkJLyogb3V0cHV0IG1vZGUgZmxhZ3MgKi8KKwl1bnNpZ25lZCBzaG9ydCBjX2NmbGFnOwkJLyogY29udHJvbCBtb2RlIGZsYWdzICovCisJdW5zaWduZWQgc2hvcnQgY19sZmxhZzsJCS8qIGxvY2FsIG1vZGUgZmxhZ3MgKi8KKwl1bnNpZ25lZCBjaGFyIGNfbGluZTsJCS8qIGxpbmUgZGlzY2lwbGluZSAqLworCXVuc2lnbmVkIGNoYXIgY19jY1tOQ0NdOwkvKiBjb250cm9sIGNoYXJhY3RlcnMgKi8KK307CisKKyNpZmRlZiBfX0tFUk5FTF9fCisvKglpbnRyPV5DCQlxdWl0PV58CQllcmFzZT1kZWwJa2lsbD1eVQorCWVvZj1eRAkJdnRpbWU9XDAJdm1pbj1cMQkJc3h0Yz1cMAorCXN0YXJ0PV5RCXN0b3A9XlMJCXN1c3A9XloJCWVvbD1cMAorCXJlcHJpbnQ9XlIJZGlzY2FyZD1eVQl3ZXJhc2U9XlcJbG5leHQ9XlYKKwllb2wyPVwwCisqLworI2RlZmluZSBJTklUX0NfQ0MgIlwwMDNcMDM0XDE3N1wwMjVcMDA0XDBcMVwwXDAyMVwwMjNcMDMyXDBcMDIyXDAxN1wwMjdcMDI2XDAiCisjZW5kaWYKKworLyogbW9kZW0gbGluZXMgKi8KKyNkZWZpbmUgVElPQ01fTEUJMHgwMDEKKyNkZWZpbmUgVElPQ01fRFRSCTB4MDAyCisjZGVmaW5lIFRJT0NNX1JUUwkweDAwNAorI2RlZmluZSBUSU9DTV9TVAkweDAwOAorI2RlZmluZSBUSU9DTV9TUgkweDAxMAorI2RlZmluZSBUSU9DTV9DVFMJMHgwMjAKKyNkZWZpbmUgVElPQ01fQ0FSCTB4MDQwCisjZGVmaW5lIFRJT0NNX1JORwkweDA4MAorI2RlZmluZSBUSU9DTV9EU1IJMHgxMDAKKyNkZWZpbmUgVElPQ01fQ0QJVElPQ01fQ0FSCisjZGVmaW5lIFRJT0NNX1JJCVRJT0NNX1JORworI2RlZmluZSBUSU9DTV9PVVQxCTB4MjAwMAorI2RlZmluZSBUSU9DTV9PVVQyCTB4NDAwMAorI2RlZmluZSBUSU9DTV9MT09QCTB4ODAwMAorCisjZGVmaW5lIFRJT0NNX01PREVNX0JJVFMgICAgICAgVElPQ01fT1VUMiAgICAgIC8qIElSREEgc3VwcG9ydCAqLworCisvKgorICogVHJhbnNsYXRlIGEgInRlcm1pbyIgc3RydWN0dXJlIGludG8gYSAidGVybWlvcyIuIFVnaC4KKyAqLworI2RlZmluZSBTRVRfTE9XX1RFUk1JT1NfQklUUyh0ZXJtaW9zLCB0ZXJtaW8sIHgpIHsgXAorCXVuc2lnbmVkIHNob3J0IF9fdG1wOyBcCisJZ2V0X3VzZXIoX190bXAsICYodGVybWlvKS0+eCk7IFwKKwkqKHVuc2lnbmVkIHNob3J0ICopICYodGVybWlvcyktPnggPSBfX3RtcDsgXAorfQorCisjZGVmaW5lIHVzZXJfdGVybWlvX3RvX2tlcm5lbF90ZXJtaW9zKHRlcm1pb3MsIHRlcm1pbykgXAorKHsgXAorCVNFVF9MT1dfVEVSTUlPU19CSVRTKHRlcm1pb3MsIHRlcm1pbywgY19pZmxhZyk7IFwKKwlTRVRfTE9XX1RFUk1JT1NfQklUUyh0ZXJtaW9zLCB0ZXJtaW8sIGNfb2ZsYWcpOyBcCisJU0VUX0xPV19URVJNSU9TX0JJVFModGVybWlvcywgdGVybWlvLCBjX2NmbGFnKTsgXAorCVNFVF9MT1dfVEVSTUlPU19CSVRTKHRlcm1pb3MsIHRlcm1pbywgY19sZmxhZyk7IFwKKwljb3B5X2Zyb21fdXNlcigodGVybWlvcyktPmNfY2MsICh0ZXJtaW8pLT5jX2NjLCBOQ0MpOyBcCit9KQorCisvKgorICogVHJhbnNsYXRlIGEgInRlcm1pb3MiIHN0cnVjdHVyZSBpbnRvIGEgInRlcm1pbyIuIFVnaC4KKyAqLworI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pbyh0ZXJtaW8sIHRlcm1pb3MpIFwKKyh7IFwKKwlwdXRfdXNlcigodGVybWlvcyktPmNfaWZsYWcsICYodGVybWlvKS0+Y19pZmxhZyk7IFwKKwlwdXRfdXNlcigodGVybWlvcyktPmNfb2ZsYWcsICYodGVybWlvKS0+Y19vZmxhZyk7IFwKKwlwdXRfdXNlcigodGVybWlvcyktPmNfY2ZsYWcsICYodGVybWlvKS0+Y19jZmxhZyk7IFwKKwlwdXRfdXNlcigodGVybWlvcyktPmNfbGZsYWcsICYodGVybWlvKS0+Y19sZmxhZyk7IFwKKwlwdXRfdXNlcigodGVybWlvcyktPmNfbGluZSwgICYodGVybWlvKS0+Y19saW5lKTsgXAorCWNvcHlfdG9fdXNlcigodGVybWlvKS0+Y19jYywgKHRlcm1pb3MpLT5jX2NjLCBOQ0MpOyBcCit9KQorCisjZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBcCisJY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zMikpCisjZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcyh1LCBrKSBcCisJY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3NfMShrLCB1KSBcCisJY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKyNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zXzEodSwgaykgXAorCWNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQorCisjZW5kaWYJLyogX0FTTV9URVJNSU9TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvdGhyZWFkX2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzk3ZTcxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC90aHJlYWRfaW5mby5oCkBAIC0wLDAgKzEsMTY4IEBACisvKiBNTjEwMzAwIExvdy1sZXZlbCB0aHJlYWQgaW5mb3JtYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfQVNNX1RIUkVBRF9JTkZPX0gKKyNkZWZpbmUgX0FTTV9USFJFQURfSU5GT19ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNlbmRpZgorCisjZGVmaW5lIFBSRUVNUFRfQUNUSVZFCQkweDEwMDAwMDAwCisKKyNpZmRlZiBDT05GSUdfNEtTVEFDS1MKKyNkZWZpbmUgVEhSRUFEX1NJWkUJCSg0MDk2KQorI2Vsc2UKKyNkZWZpbmUgVEhSRUFEX1NJWkUJCSg4MTkyKQorI2VuZGlmCisKKyNkZWZpbmUgU1RBQ0tfV0FSTgkJKFRIUkVBRF9TSVpFIC8gOCkKKworLyoKKyAqIGxvdyBsZXZlbCB0YXNrIGRhdGEgdGhhdCBlbnRyeS5TIG5lZWRzIGltbWVkaWF0ZSBhY2Nlc3MgdG8KKyAqIC0gdGhpcyBzdHJ1Y3Qgc2hvdWxkIGZpdCBlbnRpcmVseSBpbnNpZGUgb2Ygb25lIGNhY2hlIGxpbmUKKyAqIC0gdGhpcyBzdHJ1Y3Qgc2hhcmVzIHRoZSBzdXBlcnZpc29yIHN0YWNrIHBhZ2VzCisgKiAtIGlmIHRoZSBjb250ZW50cyBvZiB0aGlzIHN0cnVjdHVyZSBhcmUgY2hhbmdlZCwgdGhlIGFzc2VtYmx5IGNvbnN0YW50cworICogICBtdXN0IGFsc28gYmUgY2hhbmdlZAorICovCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCitzdHJ1Y3QgdGhyZWFkX2luZm8geworCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGFzazsJCS8qIG1haW4gdGFzayBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgZXhlY19kb21haW4JKmV4ZWNfZG9tYWluOwkvKiBleGVjdXRpb24gZG9tYWluICovCisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CQkvKiBsb3cgbGV2ZWwgZmxhZ3MgKi8KKwlfX3UzMgkJCWNwdTsJCS8qIGN1cnJlbnQgQ1BVICovCisJX19zMzIJCQlwcmVlbXB0X2NvdW50OwkvKiAwID0+IHByZWVtcHRhYmxlLCA8MCA9PiBCVUcgKi8KKworCW1tX3NlZ21lbnRfdAkJYWRkcl9saW1pdDsJLyogdGhyZWFkIGFkZHJlc3Mgc3BhY2U6CisJCQkJCQkgICAwLTB4QkZGRkZGRkYgZm9yIHVzZXItdGhlYWQKKwkJCQkJCSAgIDAtMHhGRkZGRkZGRiBmb3Iga2VybmVsLXRocmVhZAorCQkJCQkJKi8KKwlzdHJ1Y3QgcmVzdGFydF9ibG9jayAgICByZXN0YXJ0X2Jsb2NrOworCisJX191OAkJCXN1cGVydmlzb3Jfc3RhY2tbMF07Cit9OworCisjZWxzZSAvKiAhX19BU1NFTUJMWV9fICovCisKKyNpZm5kZWYgX19BU01fT0ZGU0VUU19IX18KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKyNlbmRpZgorCisjZW5kaWYKKworLyoKKyAqIG1hY3Jvcy9mdW5jdGlvbnMgZm9yIGdhaW5pbmcgYWNjZXNzIHRvIHRoZSB0aHJlYWQgaW5mb3JtYXRpb24gc3RydWN0dXJlCisgKgorICogcHJlZW1wdF9jb3VudCBuZWVkcyB0byBiZSAxIGluaXRpYWxseSwgdW50aWwgdGhlIHNjaGVkdWxlciBpcyBmdW5jdGlvbmFsLgorICovCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjZGVmaW5lIElOSVRfVEhSRUFEX0lORk8odHNrKQkJCVwKK3sJCQkJCQlcCisJLnRhc2sJCT0gJnRzaywJCQlcCisJLmV4ZWNfZG9tYWluCT0gJmRlZmF1bHRfZXhlY19kb21haW4sCVwKKwkuZmxhZ3MJCT0gMCwJCQlcCisJLmNwdQkJPSAwLAkJCVwKKwkucHJlZW1wdF9jb3VudAk9IDEsCQkJXAorCS5hZGRyX2xpbWl0CT0gS0VSTkVMX0RTLAkJXAorCS5yZXN0YXJ0X2Jsb2NrID0gewkJCVwKKwkJLmZuID0gZG9fbm9fcmVzdGFydF9zeXNjYWxsLAlcCisJfSwJCQkJCVwKK30KKworI2RlZmluZSBpbml0X3RocmVhZF9pbmZvCShpbml0X3RocmVhZF91bmlvbi50aHJlYWRfaW5mbykKKyNkZWZpbmUgaW5pdF9zdGFjawkJKGluaXRfdGhyZWFkX3VuaW9uLnN0YWNrKQorI2RlZmluZSBpbml0X3VyZWdzCQkJCQkJCVwKKwkoKHN0cnVjdCBwdF9yZWdzICopCQkJCQkJXAorCSAoKHVuc2lnbmVkIGxvbmcpIGluaXRfc3RhY2sgKyBUSFJFQURfU0laRSAtIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpKQorCitleHRlcm4gc3RydWN0IHRocmVhZF9pbmZvICpfX2N1cnJlbnRfdGk7CisKKy8qIGhvdyB0byBnZXQgdGhlIHRocmVhZCBpbmZvcm1hdGlvbiBzdHJ1Y3QgZnJvbSBDICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX18oKGNvbnN0KSkKK3N0cnVjdCB0aHJlYWRfaW5mbyAqY3VycmVudF90aHJlYWRfaW5mbyh2b2lkKQoreworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGk7CisJYXNtKCJtb3Ygc3AsJTBcbiIKKwkgICAgImFuZCAlMSwlMFxuIgorCSAgICA6ICI9ZCIgKHRpKQorCSAgICA6ICJpIiAofihUSFJFQURfU0laRSAtIDEpKQorCSAgICA6ICJjYyIpOworCXJldHVybiB0aTsKK30KKworLyogaG93IHRvIGdldCB0aGUgY3VycmVudCBzdGFjayBwb2ludGVyIGZyb20gQyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGN1cnJlbnRfc3RhY2tfcG9pbnRlcih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc3A7CisJYXNtKCJtb3Ygc3AsJTA7ICI6Ij1yIiAoc3ApKTsKKwlyZXR1cm4gc3A7Cit9CisKKy8qIHRocmVhZCBpbmZvcm1hdGlvbiBhbGxvY2F0aW9uICovCisjaWZkZWYgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFCisjZGVmaW5lIGFsbG9jX3RocmVhZF9pbmZvKHRzaykga3phbGxvYyhUSFJFQURfU0laRSwgR0ZQX0tFUk5FTCkKKyNlbHNlCisjZGVmaW5lIGFsbG9jX3RocmVhZF9pbmZvKHRzaykga21hbGxvYyhUSFJFQURfU0laRSwgR0ZQX0tFUk5FTCkKKyNlbmRpZgorCisjZGVmaW5lIGZyZWVfdGhyZWFkX2luZm8odGkpCWtmcmVlKCh0aSkpCisjZGVmaW5lIGdldF90aHJlYWRfaW5mbyh0aSkJZ2V0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCisjZGVmaW5lIHB1dF90aHJlYWRfaW5mbyh0aSkJcHV0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCisKKyNlbHNlIC8qICFfX0FTU0VNQkxZX18gKi8KKworI2lmbmRlZiBfX1ZNTElOVVhfTERTX18KKy8qIGhvdyB0byBnZXQgdGhlIHRocmVhZCBpbmZvcm1hdGlvbiBzdHJ1Y3QgZnJvbSBBU00gKi8KKy5tYWNybyBHRVRfVEhSRUFEX0lORk8gcmVnCisJbW92CXNwLFxyZWcKKwlhbmQJLVRIUkVBRF9TSVpFLFxyZWcKKy5lbmRtCisjZW5kaWYKKyNlbmRpZgorCisvKgorICogdGhyZWFkIGluZm9ybWF0aW9uIGZsYWdzCisgKiAtIHRoZXNlIGFyZSBwcm9jZXNzIHN0YXRlIGZsYWdzIHRoYXQgdmFyaW91cyBhc3NlbWJseSBmaWxlcyBtYXkgbmVlZCB0bworICogICBhY2Nlc3MKKyAqIC0gcGVuZGluZyB3b3JrLXRvLWJlLWRvbmUgZmxhZ3MgYXJlIGluIExTVworICogLSBvdGhlciBmbGFncyBpbiBNU1cKKyAqLworI2RlZmluZSBUSUZfU1lTQ0FMTF9UUkFDRQkwCS8qIHN5c2NhbGwgdHJhY2UgYWN0aXZlICovCisjZGVmaW5lIFRJRl9OT1RJRllfUkVTVU1FCTEJLyogcmVzdW1wdGlvbiBub3RpZmljYXRpb24gcmVxdWVzdGVkICovCisjZGVmaW5lIFRJRl9TSUdQRU5ESU5HCQkyCS8qIHNpZ25hbCBwZW5kaW5nICovCisjZGVmaW5lIFRJRl9ORUVEX1JFU0NIRUQJMwkvKiByZXNjaGVkdWxpbmcgbmVjZXNzYXJ5ICovCisjZGVmaW5lIFRJRl9TSU5HTEVTVEVQCQk0CS8qIHJlc3RvcmUgc2luZ2xlc3RlcCBvbiByZXR1cm4gdG8gdXNlciBtb2RlICovCisjZGVmaW5lIFRJRl9SRVNUT1JFX1NJR01BU0sJNQkvKiByZXN0b3JlIHNpZ25hbCBtYXNrIGluIGRvX3NpZ25hbCgpICovCisjZGVmaW5lIFRJRl9QT0xMSU5HX05SRkxBRwkxNgkvKiB0cnVlIGlmIHBvbGxfaWRsZSgpIGlzIHBvbGxpbmcgVElGX05FRURfUkVTQ0hFRCAqLworI2RlZmluZSBUSUZfTUVNRElFCQkxNwkvKiBPT00ga2lsbGVyIGtpbGxlZCBwcm9jZXNzICovCisjZGVmaW5lIFRJRl9GUkVFWkUJCTE4CS8qIGZyZWV6aW5nIGZvciBzdXNwZW5kICovCisKKyNkZWZpbmUgX1RJRl9TWVNDQUxMX1RSQUNFCSsoMSA8PCBUSUZfU1lTQ0FMTF9UUkFDRSkKKyNkZWZpbmUgX1RJRl9OT1RJRllfUkVTVU1FCSsoMSA8PCBUSUZfTk9USUZZX1JFU1VNRSkKKyNkZWZpbmUgX1RJRl9TSUdQRU5ESU5HCQkrKDEgPDwgVElGX1NJR1BFTkRJTkcpCisjZGVmaW5lIF9USUZfTkVFRF9SRVNDSEVECSsoMSA8PCBUSUZfTkVFRF9SRVNDSEVEKQorI2RlZmluZSBfVElGX1NJTkdMRVNURVAJCSsoMSA8PCBUSUZfU0lOR0xFU1RFUCkKKyNkZWZpbmUgX1RJRl9SRVNUT1JFX1NJR01BU0sJKygxIDw8IFRJRl9SRVNUT1JFX1NJR01BU0spCisjZGVmaW5lIF9USUZfUE9MTElOR19OUkZMQUcJKygxIDw8IFRJRl9QT0xMSU5HX05SRkxBRykKKyNkZWZpbmUgX1RJRl9GUkVFWkUJCSsoMSA8PCBUSUZfRlJFRVpFKQorCisjZGVmaW5lIF9USUZfV09SS19NQVNLCQkweDAwMDBGRkZFCS8qIHdvcmsgdG8gZG8gb24gaW50ZXJydXB0L2V4Y2VwdGlvbiByZXR1cm4gKi8KKyNkZWZpbmUgX1RJRl9BTExXT1JLX01BU0sJMHgwMDAwRkZGRgkvKiB3b3JrIHRvIGRvIG9uIGFueSByZXR1cm4gdG8gdS1zcGFjZSAqLworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgLyogX0FTTV9USFJFQURfSU5GT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL3RpbWVyLXJlZ3MuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvdGltZXItcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkODgzYjcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3RpbWVyLXJlZ3MuaApAQCAtMCwwICsxLDI5MyBAQAorLyogQU0zM3YyIG9uLWJvYXJkIHRpbWVyIG1vZHVsZSByZWdpc3RlcnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfQVNNX1RJTUVSX1JFR1NfSAorI2RlZmluZSBfQVNNX1RJTUVSX1JFR1NfSAorCisjaW5jbHVkZSA8YXNtL2NwdS1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL2ludGN0bC1yZWdzLmg+CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qIHRpbWVyIHByZXNjYWxhciBjb250cm9sICovCisjZGVmaW5lCVRNUFNDTlQJCQlfX1NZU1JFRygweGQ0MDAzMDcxLCB1OCkgLyogdGltZXIgcHJlc2NhbGVyIGNvbnRyb2wgKi8KKyNkZWZpbmUJVE1QU0NOVF9FTkFCTEUJCTB4ODAJLyogdGltZXIgcHJlc2NhbGVyIGVuYWJsZSAqLworI2RlZmluZQlUTVBTQ05UX0RJU0FCTEUJCTB4MDAJLyogdGltZXIgcHJlc2NhbGVyIGRpc2FibGUgKi8KKworLyogOCBiaXQgdGltZXJzICovCisjZGVmaW5lCVRNME1ECQkJX19TWVNSRUcoMHhkNDAwMzAwMCwgdTgpIC8qIHRpbWVyIDAgbW9kZSByZWdpc3RlciAqLworI2RlZmluZQlUTTBNRF9TUkMJCTB4MDcJLyogdGltZXIgc291cmNlICovCisjZGVmaW5lCVRNME1EX1NSQ19JT0NMSwkJMHgwMAkvKiAtIElPQ0xLICovCisjZGVmaW5lCVRNME1EX1NSQ19JT0NMS184CTB4MDEJLyogLSAxLzggSU9DTEsgKi8KKyNkZWZpbmUJVE0wTURfU1JDX0lPQ0xLXzMyCTB4MDIJLyogLSAxLzMyIElPQ0xLICovCisjZGVmaW5lCVRNME1EX1NSQ19UTTJJTwkJMHgwMwkvKiAtIFRNMklPIHBpbiBpbnB1dCAqLworI2RlZmluZQlUTTBNRF9TUkNfVE0xVUZMT1cJMHgwNQkvKiAtIHRpbWVyIDEgdW5kZXJmbG93ICovCisjZGVmaW5lCVRNME1EX1NSQ19UTTJVRkxPVwkweDA2CS8qIC0gdGltZXIgMiB1bmRlcmZsb3cgKi8KKyNkZWZpbmUJVE0wTURfU1JDX1RNMElPCQkweDA3CS8qIC0gVE0wSU8gcGluIGlucHV0ICovCisjZGVmaW5lCVRNME1EX0lOSVRfQ09VTlRFUgkweDQwCS8qIGluaXRpYWxpemUgVE1uQkMgPSBUTW5CUiAqLworI2RlZmluZQlUTTBNRF9DT1VOVF9FTkFCTEUJMHg4MAkvKiB0aW1lciBjb3VudCBlbmFibGUgKi8KKworI2RlZmluZQlUTTFNRAkJCV9fU1lTUkVHKDB4ZDQwMDMwMDEsIHU4KSAvKiB0aW1lciAxIG1vZGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJVE0xTURfU1JDCQkweDA3CS8qIHRpbWVyIHNvdXJjZSAqLworI2RlZmluZQlUTTFNRF9TUkNfSU9DTEsJCTB4MDAJLyogLSBJT0NMSyAqLworI2RlZmluZQlUTTFNRF9TUkNfSU9DTEtfOAkweDAxCS8qIC0gMS84IElPQ0xLICovCisjZGVmaW5lCVRNMU1EX1NSQ19JT0NMS18zMgkweDAyCS8qIC0gMS8zMiBJT0NMSyAqLworI2RlZmluZQlUTTFNRF9TUkNfVE0wQ0FTQ0FERQkweDAzCS8qIC0gY2FzY2FkZSB3aXRoIHRpbWVyIDAgKi8KKyNkZWZpbmUJVE0xTURfU1JDX1RNMFVGTE9XCTB4MDQJLyogLSB0aW1lciAwIHVuZGVyZmxvdyAqLworI2RlZmluZQlUTTFNRF9TUkNfVE0yVUZMT1cJMHgwNgkvKiAtIHRpbWVyIDIgdW5kZXJmbG93ICovCisjZGVmaW5lCVRNMU1EX1NSQ19UTTFJTwkJMHgwNwkvKiAtIFRNMUlPIHBpbiBpbnB1dCAqLworI2RlZmluZQlUTTFNRF9JTklUX0NPVU5URVIJMHg0MAkvKiBpbml0aWFsaXplIFRNbkJDID0gVE1uQlIgKi8KKyNkZWZpbmUJVE0xTURfQ09VTlRfRU5BQkxFCTB4ODAJLyogdGltZXIgY291bnQgZW5hYmxlICovCisKKyNkZWZpbmUJVE0yTUQJCQlfX1NZU1JFRygweGQ0MDAzMDAyLCB1OCkgLyogdGltZXIgMiBtb2RlIHJlZ2lzdGVyICovCisjZGVmaW5lCVRNMk1EX1NSQwkJMHgwNwkvKiB0aW1lciBzb3VyY2UgKi8KKyNkZWZpbmUJVE0yTURfU1JDX0lPQ0xLCQkweDAwCS8qIC0gSU9DTEsgKi8KKyNkZWZpbmUJVE0yTURfU1JDX0lPQ0xLXzgJMHgwMQkvKiAtIDEvOCBJT0NMSyAqLworI2RlZmluZQlUTTJNRF9TUkNfSU9DTEtfMzIJMHgwMgkvKiAtIDEvMzIgSU9DTEsgKi8KKyNkZWZpbmUJVE0yTURfU1JDX1RNMUNBU0NBREUJMHgwMwkvKiAtIGNhc2NhZGUgd2l0aCB0aW1lciAxICovCisjZGVmaW5lCVRNMk1EX1NSQ19UTTBVRkxPVwkweDA0CS8qIC0gdGltZXIgMCB1bmRlcmZsb3cgKi8KKyNkZWZpbmUJVE0yTURfU1JDX1RNMVVGTE9XCTB4MDUJLyogLSB0aW1lciAxIHVuZGVyZmxvdyAqLworI2RlZmluZQlUTTJNRF9TUkNfVE0ySU8JCTB4MDcJLyogLSBUTTJJTyBwaW4gaW5wdXQgKi8KKyNkZWZpbmUJVE0yTURfSU5JVF9DT1VOVEVSCTB4NDAJLyogaW5pdGlhbGl6ZSBUTW5CQyA9IFRNbkJSICovCisjZGVmaW5lCVRNMk1EX0NPVU5UX0VOQUJMRQkweDgwCS8qIHRpbWVyIGNvdW50IGVuYWJsZSAqLworCisjZGVmaW5lCVRNM01ECQkJX19TWVNSRUcoMHhkNDAwMzAwMywgdTgpIC8qIHRpbWVyIDMgbW9kZSByZWdpc3RlciAqLworI2RlZmluZQlUTTNNRF9TUkMJCTB4MDcJLyogdGltZXIgc291cmNlICovCisjZGVmaW5lCVRNM01EX1NSQ19JT0NMSwkJMHgwMAkvKiAtIElPQ0xLICovCisjZGVmaW5lCVRNM01EX1NSQ19JT0NMS184CTB4MDEJLyogLSAxLzggSU9DTEsgKi8KKyNkZWZpbmUJVE0zTURfU1JDX0lPQ0xLXzMyCTB4MDIJLyogLSAxLzMyIElPQ0xLICovCisjZGVmaW5lCVRNM01EX1NSQ19UTTFDQVNDQURFCTB4MDMJLyogLSBjYXNjYWRlIHdpdGggdGltZXIgMiAqLworI2RlZmluZQlUTTNNRF9TUkNfVE0wVUZMT1cJMHgwNAkvKiAtIHRpbWVyIDAgdW5kZXJmbG93ICovCisjZGVmaW5lCVRNM01EX1NSQ19UTTFVRkxPVwkweDA1CS8qIC0gdGltZXIgMSB1bmRlcmZsb3cgKi8KKyNkZWZpbmUJVE0zTURfU1JDX1RNMlVGTE9XCTB4MDYJLyogLSB0aW1lciAyIHVuZGVyZmxvdyAqLworI2RlZmluZQlUTTNNRF9TUkNfVE0zSU8JCTB4MDcJLyogLSBUTTNJTyBwaW4gaW5wdXQgKi8KKyNkZWZpbmUJVE0zTURfSU5JVF9DT1VOVEVSCTB4NDAJLyogaW5pdGlhbGl6ZSBUTW5CQyA9IFRNbkJSICovCisjZGVmaW5lCVRNM01EX0NPVU5UX0VOQUJMRQkweDgwCS8qIHRpbWVyIGNvdW50IGVuYWJsZSAqLworCisjZGVmaW5lCVRNMDFNRAkJCV9fU1lTUkVHKDB4ZDQwMDMwMDAsIHUxNikgIC8qIHRpbWVyIDA6MSBtb2RlIHJlZ2lzdGVyICovCisKKyNkZWZpbmUJVE0wQlIJCQlfX1NZU1JFRygweGQ0MDAzMDEwLCB1OCkgICAvKiB0aW1lciAwIGJhc2UgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJVE0xQlIJCQlfX1NZU1JFRygweGQ0MDAzMDExLCB1OCkgICAvKiB0aW1lciAxIGJhc2UgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJVE0yQlIJCQlfX1NZU1JFRygweGQ0MDAzMDEyLCB1OCkgICAvKiB0aW1lciAyIGJhc2UgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJVE0zQlIJCQlfX1NZU1JFRygweGQ0MDAzMDEzLCB1OCkgICAvKiB0aW1lciAzIGJhc2UgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJVE0wMUJSCQkJX19TWVNSRUcoMHhkNDAwMzAxMCwgdTE2KSAgLyogdGltZXIgMDoxIGJhc2UgcmVnaXN0ZXIgKi8KKworI2RlZmluZQlUTTBCQwkJCV9fU1lTUkVHQygweGQ0MDAzMDIwLCB1OCkgIC8qIHRpbWVyIDAgYmluYXJ5IGNvdW50ZXIgKi8KKyNkZWZpbmUJVE0xQkMJCQlfX1NZU1JFR0MoMHhkNDAwMzAyMSwgdTgpICAvKiB0aW1lciAxIGJpbmFyeSBjb3VudGVyICovCisjZGVmaW5lCVRNMkJDCQkJX19TWVNSRUdDKDB4ZDQwMDMwMjIsIHU4KSAgLyogdGltZXIgMiBiaW5hcnkgY291bnRlciAqLworI2RlZmluZQlUTTNCQwkJCV9fU1lTUkVHQygweGQ0MDAzMDIzLCB1OCkgIC8qIHRpbWVyIDMgYmluYXJ5IGNvdW50ZXIgKi8KKyNkZWZpbmUJVE0wMUJDCQkJX19TWVNSRUdDKDB4ZDQwMDMwMjAsIHUxNikgLyogdGltZXIgMDoxIGJpbmFyeSBjb3VudGVyICovCisKKyNkZWZpbmUgVE0wSVJRCQkJMgkvKiB0aW1lciAwIElSUSAqLworI2RlZmluZSBUTTFJUlEJCQkzCS8qIHRpbWVyIDEgSVJRICovCisjZGVmaW5lIFRNMklSUQkJCTQJLyogdGltZXIgMiBJUlEgKi8KKyNkZWZpbmUgVE0zSVJRCQkJNQkvKiB0aW1lciAzIElSUSAqLworCisjZGVmaW5lCVRNMElDUgkJCUd4SUNSKFRNMElSUSkJLyogdGltZXIgMCB1ZmxvdyBpbnRyIGN0cmwgcmVnICovCisjZGVmaW5lCVRNMUlDUgkJCUd4SUNSKFRNMUlSUSkJLyogdGltZXIgMSB1ZmxvdyBpbnRyIGN0cmwgcmVnICovCisjZGVmaW5lCVRNMklDUgkJCUd4SUNSKFRNMklSUSkJLyogdGltZXIgMiB1ZmxvdyBpbnRyIGN0cmwgcmVnICovCisjZGVmaW5lCVRNM0lDUgkJCUd4SUNSKFRNM0lSUSkJLyogdGltZXIgMyB1ZmxvdyBpbnRyIGN0cmwgcmVnICovCisKKy8qIDE2LWJpdCB0aW1lcnMgNCw1ICYgNy0xMSAqLworI2RlZmluZQlUTTRNRAkJCV9fU1lTUkVHKDB4ZDQwMDMwODAsIHU4KSAgIC8qIHRpbWVyIDQgbW9kZSByZWdpc3RlciAqLworI2RlZmluZQlUTTRNRF9TUkMJCTB4MDcJLyogdGltZXIgc291cmNlICovCisjZGVmaW5lCVRNNE1EX1NSQ19JT0NMSwkJMHgwMAkvKiAtIElPQ0xLICovCisjZGVmaW5lCVRNNE1EX1NSQ19JT0NMS184CTB4MDEJLyogLSAxLzggSU9DTEsgKi8KKyNkZWZpbmUJVE00TURfU1JDX0lPQ0xLXzMyCTB4MDIJLyogLSAxLzMyIElPQ0xLICovCisjZGVmaW5lCVRNNE1EX1NSQ19UTTBVRkxPVwkweDA0CS8qIC0gdGltZXIgMCB1bmRlcmZsb3cgKi8KKyNkZWZpbmUJVE00TURfU1JDX1RNMVVGTE9XCTB4MDUJLyogLSB0aW1lciAxIHVuZGVyZmxvdyAqLworI2RlZmluZQlUTTRNRF9TUkNfVE0yVUZMT1cJMHgwNgkvKiAtIHRpbWVyIDIgdW5kZXJmbG93ICovCisjZGVmaW5lCVRNNE1EX1NSQ19UTTRJTwkJMHgwNwkvKiAtIFRNNElPIHBpbiBpbnB1dCAqLworI2RlZmluZQlUTTRNRF9JTklUX0NPVU5URVIJMHg0MAkvKiBpbml0aWFsaXplIFRNbkJDID0gVE1uQlIgKi8KKyNkZWZpbmUJVE00TURfQ09VTlRfRU5BQkxFCTB4ODAJLyogdGltZXIgY291bnQgZW5hYmxlICovCisKKyNkZWZpbmUJVE01TUQJCQlfX1NZU1JFRygweGQ0MDAzMDgyLCB1OCkgICAvKiB0aW1lciA1IG1vZGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJVE01TURfU1JDCQkweDA3CS8qIHRpbWVyIHNvdXJjZSAqLworI2RlZmluZQlUTTVNRF9TUkNfSU9DTEsJCTB4MDAJLyogLSBJT0NMSyAqLworI2RlZmluZQlUTTVNRF9TUkNfSU9DTEtfOAkweDAxCS8qIC0gMS84IElPQ0xLICovCisjZGVmaW5lCVRNNU1EX1NSQ19JT0NMS18zMgkweDAyCS8qIC0gMS8zMiBJT0NMSyAqLworI2RlZmluZQlUTTVNRF9TUkNfVE00Q0FTQ0FERQkweDAzCS8qIC0gY2FzY2FkZSB3aXRoIHRpbWVyIDQgKi8KKyNkZWZpbmUJVE01TURfU1JDX1RNMFVGTE9XCTB4MDQJLyogLSB0aW1lciAwIHVuZGVyZmxvdyAqLworI2RlZmluZQlUTTVNRF9TUkNfVE0xVUZMT1cJMHgwNQkvKiAtIHRpbWVyIDEgdW5kZXJmbG93ICovCisjZGVmaW5lCVRNNU1EX1NSQ19UTTJVRkxPVwkweDA2CS8qIC0gdGltZXIgMiB1bmRlcmZsb3cgKi8KKyNkZWZpbmUJVE01TURfU1JDX1RNNUlPCQkweDA3CS8qIC0gVE01SU8gcGluIGlucHV0ICovCisjZGVmaW5lCVRNNU1EX0lOSVRfQ09VTlRFUgkweDQwCS8qIGluaXRpYWxpemUgVE1uQkMgPSBUTW5CUiAqLworI2RlZmluZQlUTTVNRF9DT1VOVF9FTkFCTEUJMHg4MAkvKiB0aW1lciBjb3VudCBlbmFibGUgKi8KKworI2RlZmluZQlUTTdNRAkJCV9fU1lTUkVHKDB4ZDQwMDMwODYsIHU4KSAgIC8qIHRpbWVyIDcgbW9kZSByZWdpc3RlciAqLworI2RlZmluZQlUTTdNRF9TUkMJCTB4MDcJLyogdGltZXIgc291cmNlICovCisjZGVmaW5lCVRNN01EX1NSQ19JT0NMSwkJMHgwMAkvKiAtIElPQ0xLICovCisjZGVmaW5lCVRNN01EX1NSQ19JT0NMS184CTB4MDEJLyogLSAxLzggSU9DTEsgKi8KKyNkZWZpbmUJVE03TURfU1JDX0lPQ0xLXzMyCTB4MDIJLyogLSAxLzMyIElPQ0xLICovCisjZGVmaW5lCVRNN01EX1NSQ19UTTBVRkxPVwkweDA0CS8qIC0gdGltZXIgMCB1bmRlcmZsb3cgKi8KKyNkZWZpbmUJVE03TURfU1JDX1RNMVVGTE9XCTB4MDUJLyogLSB0aW1lciAxIHVuZGVyZmxvdyAqLworI2RlZmluZQlUTTdNRF9TUkNfVE0yVUZMT1cJMHgwNgkvKiAtIHRpbWVyIDIgdW5kZXJmbG93ICovCisjZGVmaW5lCVRNN01EX1NSQ19UTTdJTwkJMHgwNwkvKiAtIFRNN0lPIHBpbiBpbnB1dCAqLworI2RlZmluZQlUTTdNRF9JTklUX0NPVU5URVIJMHg0MAkvKiBpbml0aWFsaXplIFRNbkJDID0gVE1uQlIgKi8KKyNkZWZpbmUJVE03TURfQ09VTlRfRU5BQkxFCTB4ODAJLyogdGltZXIgY291bnQgZW5hYmxlICovCisKKyNkZWZpbmUJVE04TUQJCQlfX1NZU1JFRygweGQ0MDAzMDg4LCB1OCkgICAvKiB0aW1lciA4IG1vZGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJVE04TURfU1JDCQkweDA3CS8qIHRpbWVyIHNvdXJjZSAqLworI2RlZmluZQlUTThNRF9TUkNfSU9DTEsJCTB4MDAJLyogLSBJT0NMSyAqLworI2RlZmluZQlUTThNRF9TUkNfSU9DTEtfOAkweDAxCS8qIC0gMS84IElPQ0xLICovCisjZGVmaW5lCVRNOE1EX1NSQ19JT0NMS18zMgkweDAyCS8qIC0gMS8zMiBJT0NMSyAqLworI2RlZmluZQlUTThNRF9TUkNfVE03Q0FTQ0FERQkweDAzCS8qIC0gY2FzY2FkZSB3aXRoIHRpbWVyIDcgKi8KKyNkZWZpbmUJVE04TURfU1JDX1RNMFVGTE9XCTB4MDQJLyogLSB0aW1lciAwIHVuZGVyZmxvdyAqLworI2RlZmluZQlUTThNRF9TUkNfVE0xVUZMT1cJMHgwNQkvKiAtIHRpbWVyIDEgdW5kZXJmbG93ICovCisjZGVmaW5lCVRNOE1EX1NSQ19UTTJVRkxPVwkweDA2CS8qIC0gdGltZXIgMiB1bmRlcmZsb3cgKi8KKyNkZWZpbmUJVE04TURfU1JDX1RNOElPCQkweDA3CS8qIC0gVE04SU8gcGluIGlucHV0ICovCisjZGVmaW5lCVRNOE1EX0lOSVRfQ09VTlRFUgkweDQwCS8qIGluaXRpYWxpemUgVE1uQkMgPSBUTW5CUiAqLworI2RlZmluZQlUTThNRF9DT1VOVF9FTkFCTEUJMHg4MAkvKiB0aW1lciBjb3VudCBlbmFibGUgKi8KKworI2RlZmluZQlUTTlNRAkJCV9fU1lTUkVHKDB4ZDQwMDMwOGEsIHU4KSAgIC8qIHRpbWVyIDkgbW9kZSByZWdpc3RlciAqLworI2RlZmluZQlUTTlNRF9TUkMJCTB4MDcJLyogdGltZXIgc291cmNlICovCisjZGVmaW5lCVRNOU1EX1NSQ19JT0NMSwkJMHgwMAkvKiAtIElPQ0xLICovCisjZGVmaW5lCVRNOU1EX1NSQ19JT0NMS184CTB4MDEJLyogLSAxLzggSU9DTEsgKi8KKyNkZWZpbmUJVE05TURfU1JDX0lPQ0xLXzMyCTB4MDIJLyogLSAxLzMyIElPQ0xLICovCisjZGVmaW5lCVRNOU1EX1NSQ19UTThDQVNDQURFCTB4MDMJLyogLSBjYXNjYWRlIHdpdGggdGltZXIgOCAqLworI2RlZmluZQlUTTlNRF9TUkNfVE0wVUZMT1cJMHgwNAkvKiAtIHRpbWVyIDAgdW5kZXJmbG93ICovCisjZGVmaW5lCVRNOU1EX1NSQ19UTTFVRkxPVwkweDA1CS8qIC0gdGltZXIgMSB1bmRlcmZsb3cgKi8KKyNkZWZpbmUJVE05TURfU1JDX1RNMlVGTE9XCTB4MDYJLyogLSB0aW1lciAyIHVuZGVyZmxvdyAqLworI2RlZmluZQlUTTlNRF9TUkNfVE05SU8JCTB4MDcJLyogLSBUTTlJTyBwaW4gaW5wdXQgKi8KKyNkZWZpbmUJVE05TURfSU5JVF9DT1VOVEVSCTB4NDAJLyogaW5pdGlhbGl6ZSBUTW5CQyA9IFRNbkJSICovCisjZGVmaW5lCVRNOU1EX0NPVU5UX0VOQUJMRQkweDgwCS8qIHRpbWVyIGNvdW50IGVuYWJsZSAqLworCisjZGVmaW5lCVRNMTBNRAkJCV9fU1lTUkVHKDB4ZDQwMDMwOGMsIHU4KSAgIC8qIHRpbWVyIDEwIG1vZGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJVE0xME1EX1NSQwkJMHgwNwkvKiB0aW1lciBzb3VyY2UgKi8KKyNkZWZpbmUJVE0xME1EX1NSQ19JT0NMSwkweDAwCS8qIC0gSU9DTEsgKi8KKyNkZWZpbmUJVE0xME1EX1NSQ19JT0NMS184CTB4MDEJLyogLSAxLzggSU9DTEsgKi8KKyNkZWZpbmUJVE0xME1EX1NSQ19JT0NMS18zMgkweDAyCS8qIC0gMS8zMiBJT0NMSyAqLworI2RlZmluZQlUTTEwTURfU1JDX1RNOUNBU0NBREUJMHgwMwkvKiAtIGNhc2NhZGUgd2l0aCB0aW1lciA5ICovCisjZGVmaW5lCVRNMTBNRF9TUkNfVE0wVUZMT1cJMHgwNAkvKiAtIHRpbWVyIDAgdW5kZXJmbG93ICovCisjZGVmaW5lCVRNMTBNRF9TUkNfVE0xVUZMT1cJMHgwNQkvKiAtIHRpbWVyIDEgdW5kZXJmbG93ICovCisjZGVmaW5lCVRNMTBNRF9TUkNfVE0yVUZMT1cJMHgwNgkvKiAtIHRpbWVyIDIgdW5kZXJmbG93ICovCisjZGVmaW5lCVRNMTBNRF9TUkNfVE0xMElPCTB4MDcJLyogLSBUTTEwSU8gcGluIGlucHV0ICovCisjZGVmaW5lCVRNMTBNRF9JTklUX0NPVU5URVIJMHg0MAkvKiBpbml0aWFsaXplIFRNbkJDID0gVE1uQlIgKi8KKyNkZWZpbmUJVE0xME1EX0NPVU5UX0VOQUJMRQkweDgwCS8qIHRpbWVyIGNvdW50IGVuYWJsZSAqLworCisjZGVmaW5lCVRNMTFNRAkJCV9fU1lTUkVHKDB4ZDQwMDMwOGUsIHU4KSAgIC8qIHRpbWVyIDExIG1vZGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJVE0xMU1EX1NSQwkJMHgwNwkvKiB0aW1lciBzb3VyY2UgKi8KKyNkZWZpbmUJVE0xMU1EX1NSQ19JT0NMSwkweDAwCS8qIC0gSU9DTEsgKi8KKyNkZWZpbmUJVE0xMU1EX1NSQ19JT0NMS184CTB4MDEJLyogLSAxLzggSU9DTEsgKi8KKyNkZWZpbmUJVE0xMU1EX1NSQ19JT0NMS18zMgkweDAyCS8qIC0gMS8zMiBJT0NMSyAqLworI2RlZmluZQlUTTExTURfU1JDX1RNN0NBU0NBREUJMHgwMwkvKiAtIGNhc2NhZGUgd2l0aCB0aW1lciA3ICovCisjZGVmaW5lCVRNMTFNRF9TUkNfVE0wVUZMT1cJMHgwNAkvKiAtIHRpbWVyIDAgdW5kZXJmbG93ICovCisjZGVmaW5lCVRNMTFNRF9TUkNfVE0xVUZMT1cJMHgwNQkvKiAtIHRpbWVyIDEgdW5kZXJmbG93ICovCisjZGVmaW5lCVRNMTFNRF9TUkNfVE0yVUZMT1cJMHgwNgkvKiAtIHRpbWVyIDIgdW5kZXJmbG93ICovCisjZGVmaW5lCVRNMTFNRF9TUkNfVE0xMUlPCTB4MDcJLyogLSBUTTExSU8gcGluIGlucHV0ICovCisjZGVmaW5lCVRNMTFNRF9JTklUX0NPVU5URVIJMHg0MAkvKiBpbml0aWFsaXplIFRNbkJDID0gVE1uQlIgKi8KKyNkZWZpbmUJVE0xMU1EX0NPVU5UX0VOQUJMRQkweDgwCS8qIHRpbWVyIGNvdW50IGVuYWJsZSAqLworCisjZGVmaW5lCVRNNEJSCQkJX19TWVNSRUcoMHhkNDAwMzA5MCwgdTE2KSAgLyogdGltZXIgNCBiYXNlIHJlZ2lzdGVyICovCisjZGVmaW5lCVRNNUJSCQkJX19TWVNSRUcoMHhkNDAwMzA5MiwgdTE2KSAgLyogdGltZXIgNSBiYXNlIHJlZ2lzdGVyICovCisjZGVmaW5lCVRNN0JSCQkJX19TWVNSRUcoMHhkNDAwMzA5NiwgdTE2KSAgLyogdGltZXIgNyBiYXNlIHJlZ2lzdGVyICovCisjZGVmaW5lCVRNOEJSCQkJX19TWVNSRUcoMHhkNDAwMzA5OCwgdTE2KSAgLyogdGltZXIgOCBiYXNlIHJlZ2lzdGVyICovCisjZGVmaW5lCVRNOUJSCQkJX19TWVNSRUcoMHhkNDAwMzA5YSwgdTE2KSAgLyogdGltZXIgOSBiYXNlIHJlZ2lzdGVyICovCisjZGVmaW5lCVRNMTBCUgkJCV9fU1lTUkVHKDB4ZDQwMDMwOWMsIHUxNikgIC8qIHRpbWVyIDEwIGJhc2UgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJVE0xMUJSCQkJX19TWVNSRUcoMHhkNDAwMzA5ZSwgdTE2KSAgLyogdGltZXIgMTEgYmFzZSByZWdpc3RlciAqLworI2RlZmluZQlUTTQ1QlIJCQlfX1NZU1JFRygweGQ0MDAzMDkwLCB1MzIpICAvKiB0aW1lciA0OjUgYmFzZSByZWdpc3RlciAqLworCisjZGVmaW5lCVRNNEJDCQkJX19TWVNSRUcoMHhkNDAwMzBhMCwgdTE2KSAgLyogdGltZXIgNCBiaW5hcnkgY291bnRlciAqLworI2RlZmluZQlUTTVCQwkJCV9fU1lTUkVHKDB4ZDQwMDMwYTIsIHUxNikgIC8qIHRpbWVyIDUgYmluYXJ5IGNvdW50ZXIgKi8KKyNkZWZpbmUJVE00NUJDCQkJX19TWVNSRUcoMHhkNDAwMzBhMCwgdTMyKSAgLyogdGltZXIgNDo1IGJpbmFyeSBjb3VudGVyICovCisKKyNkZWZpbmUJVE03QkMJCQlfX1NZU1JFRygweGQ0MDAzMGE2LCB1MTYpICAvKiB0aW1lciA3IGJpbmFyeSBjb3VudGVyICovCisjZGVmaW5lCVRNOEJDCQkJX19TWVNSRUcoMHhkNDAwMzBhOCwgdTE2KSAgLyogdGltZXIgOCBiaW5hcnkgY291bnRlciAqLworI2RlZmluZQlUTTlCQwkJCV9fU1lTUkVHKDB4ZDQwMDMwYWEsIHUxNikgIC8qIHRpbWVyIDkgYmluYXJ5IGNvdW50ZXIgKi8KKyNkZWZpbmUJVE0xMEJDCQkJX19TWVNSRUcoMHhkNDAwMzBhYywgdTE2KSAgLyogdGltZXIgMTAgYmluYXJ5IGNvdW50ZXIgKi8KKyNkZWZpbmUJVE0xMUJDCQkJX19TWVNSRUcoMHhkNDAwMzBhZSwgdTE2KSAgLyogdGltZXIgMTEgYmluYXJ5IGNvdW50ZXIgKi8KKworI2RlZmluZSBUTTRJUlEJCQk2CS8qIHRpbWVyIDQgSVJRICovCisjZGVmaW5lIFRNNUlSUQkJCTcJLyogdGltZXIgNSBJUlEgKi8KKyNkZWZpbmUgVE03SVJRCQkJMTEJLyogdGltZXIgNyBJUlEgKi8KKyNkZWZpbmUgVE04SVJRCQkJMTIJLyogdGltZXIgOCBJUlEgKi8KKyNkZWZpbmUgVE05SVJRCQkJMTMJLyogdGltZXIgOSBJUlEgKi8KKyNkZWZpbmUgVE0xMElSUQkJCTE0CS8qIHRpbWVyIDEwIElSUSAqLworI2RlZmluZSBUTTExSVJRCQkJMTUJLyogdGltZXIgMTEgSVJRICovCisKKyNkZWZpbmUJVE00SUNSCQkJR3hJQ1IoVE00SVJRKQkvKiB0aW1lciA0IHVmbG93IGludHIgY3RybCByZWcgKi8KKyNkZWZpbmUJVE01SUNSCQkJR3hJQ1IoVE01SVJRKQkvKiB0aW1lciA1IHVmbG93IGludHIgY3RybCByZWcgKi8KKyNkZWZpbmUJVE03SUNSCQkJR3hJQ1IoVE03SVJRKQkvKiB0aW1lciA3IHVmbG93IGludHIgY3RybCByZWcgKi8KKyNkZWZpbmUJVE04SUNSCQkJR3hJQ1IoVE04SVJRKQkvKiB0aW1lciA4IHVmbG93IGludHIgY3RybCByZWcgKi8KKyNkZWZpbmUJVE05SUNSCQkJR3hJQ1IoVE05SVJRKQkvKiB0aW1lciA5IHVmbG93IGludHIgY3RybCByZWcgKi8KKyNkZWZpbmUJVE0xMElDUgkJCUd4SUNSKFRNMTBJUlEpCS8qIHRpbWVyIDEwIHVmbG93IGludHIgY3RybCByZWcgKi8KKyNkZWZpbmUJVE0xMUlDUgkJCUd4SUNSKFRNMTFJUlEpCS8qIHRpbWVyIDExIHVmbG93IGludHIgY3RybCByZWcgKi8KKworLyogMTYtYml0IHRpbWVyIDYgKi8KKyNkZWZpbmUJVE02TUQJCQlfX1NZU1JFRygweGQ0MDAzMDg0LCB1MTYpICAvKiB0aW1lcjYgbW9kZSByZWdpc3RlciAqLworI2RlZmluZQlUTTZNRF9TUkMJCTB4MDAwNwkvKiB0aW1lciBzb3VyY2UgKi8KKyNkZWZpbmUJVE02TURfU1JDX0lPQ0xLCQkweDAwMDAJLyogLSBJT0NMSyAqLworI2RlZmluZQlUTTZNRF9TUkNfSU9DTEtfOAkweDAwMDEJLyogLSAxLzggSU9DTEsgKi8KKyNkZWZpbmUJVE02TURfU1JDX0lPQ0xLXzMyCTB4MDAwMgkvKiAtIDEvMzIgSU9DTEsgKi8KKyNkZWZpbmUJVE02TURfU1JDX1RNMFVGTE9XCTB4MDAwNAkvKiAtIHRpbWVyIDAgdW5kZXJmbG93ICovCisjZGVmaW5lCVRNNk1EX1NSQ19UTTFVRkxPVwkweDAwMDUJLyogLSB0aW1lciAxIHVuZGVyZmxvdyAqLworI2RlZmluZQlUTTZNRF9TUkNfVE02SU9CX0JPVEgJMHgwMDA2CS8qIC0gVE02SU9CIHBpbiBpbnB1dCAoYm90aCBlZGdlcykgKi8KKyNkZWZpbmUJVE02TURfU1JDX1RNNklPQl9TSU5HTEUJMHgwMDA3CS8qIC0gVE02SU9CIHBpbiBpbnB1dCAoc2luZ2xlIGVkZ2UpICovCisjZGVmaW5lCVRNNk1EX0NMUl9FTkFCTEUJMHgwMDEwCS8qIGNsZWFyIGNvdW50IGVuYWJsZSAqLworI2RlZmluZQlUTTZNRF9PTkVTSE9UX0VOQUJMRQkweDAwNDAJLyogb25lc2hvdCBjb3VudCAqLworI2RlZmluZQlUTTZNRF9UUklHX0VOQUJMRQkweDAwODAJLyogVE02SU9CIHBpbiB0cmlnZ2VyIGVuYWJsZSAqLworI2RlZmluZSBUTTZNRF9QV00JCTB4MzgwMAkvKiBQV00gb3V0cHV0IG1vZGUgKi8KKyNkZWZpbmUgVE02TURfUFdNX0RJUwkJMHgwMDAwCS8qIC0gZGlzYWJsZWQgKi8KKyNkZWZpbmUJVE02TURfUFdNXzEwQklUCQkweDEwMDAJLyogLSAxMCBiaXRzIG1vZGUgKi8KKyNkZWZpbmUJVE02TURfUFdNXzExQklUCQkweDE4MDAJLyogLSAxMSBiaXRzIG1vZGUgKi8KKyNkZWZpbmUJVE02TURfUFdNXzEyQklUCQkweDMwMDAJLyogLSAxMiBiaXRzIG1vZGUgKi8KKyNkZWZpbmUJVE02TURfUFdNXzE0QklUCQkweDM4MDAJLyogLSAxNCBiaXRzIG1vZGUgKi8KKyNkZWZpbmUJVE02TURfSU5JVF9DT1VOVEVSCTB4NDAwMAkvKiBpbml0aWFsaXplIFRNbkJDIHRvIHplcm8gKi8KKyNkZWZpbmUJVE02TURfQ09VTlRfRU5BQkxFCTB4ODAwMAkvKiB0aW1lciBjb3VudCBlbmFibGUgKi8KKworI2RlZmluZQlUTTZNREEJCQlfX1NZU1JFRygweGQ0MDAzMGI0LCB1OCkgICAvKiB0aW1lcjYgY21wL2NhcCBBIG1vZGUgcmVnICovCisjZGVmaW5lIFRNNk1EQV9PVVQJCTB4MDcJLyogb3V0cHV0IHNlbGVjdCAqLworI2RlZmluZQlUTTZNREFfT1VUX1NFVEFfUkVTRVRCCTB4MDAJLyogLSBzZXQgYXQgbWF0Y2ggQSwgcmVzZXQgYXQgbWF0Y2ggQiAqLworI2RlZmluZQlUTTZNREFfT1VUX1NFVEFfUkVTRVRPVgkweDAxCS8qIC0gc2V0IGF0IG1hdGNoIEEsIHJlc2V0IGF0IG92ZXJmbG93ICovCisjZGVmaW5lCVRNNk1EQV9PVVRfU0VUQQkJMHgwMgkvKiAtIHNldCBhdCBtYXRjaCBBICovCisjZGVmaW5lCVRNNk1EQV9PVVRfUkVTRVRBCTB4MDMJLyogLSByZXNldCBhdCBtYXRjaCBBICovCisjZGVmaW5lCVRNNk1EQV9PVVRfVE9HR0xFCTB4MDQJLyogLSB0b2dnbGUgb24gbWF0Y2ggQSAqLworI2RlZmluZSBUTTZNREFfTU9ERQkJMHhjMAkvKiBjb21wYXJlIEEgcmVnaXN0ZXIgbW9kZSAqLworI2RlZmluZQlUTTZNREFfTU9ERV9DTVBfU0lOR0xFCTB4MDAJLyogLSBjb21wYXJlLCBzaW5nbGUgYnVmZmVyIG1vZGUgKi8KKyNkZWZpbmUJVE02TURBX01PREVfQ01QX0RPVUJMRQkweDQwCS8qIC0gY29tcGFyZSwgZG91YmxlIGJ1ZmZlciBtb2RlICovCisjZGVmaW5lCVRNNk1EQV9NT0RFX0NBUF9TX0VER0UJMHg4MAkvKiAtIGNhcHR1cmUsIHNpbmdsZSBlZGdlIG1vZGUgKi8KKyNkZWZpbmUJVE02TURBX01PREVfQ0FQX0RfRURHRQkweGMwCS8qIC0gY2FwdHVyZSwgZG91YmxlIGVkZ2UgbW9kZSAqLworI2RlZmluZSBUTTZNREFfRURHRQkJMHgyMAkvKiBjb21wYXJlIEEgZWRnZSBzZWxlY3QgKi8KKyNkZWZpbmUJVE02TURBX0VER0VfRkFMTElORwkweDAwCS8qIGNhcHR1cmUgb24gZmFsbGluZyBlZGdlICovCisjZGVmaW5lCVRNNk1EQV9FREdFX1JJU0lORwkweDIwCS8qIGNhcHR1cmUgb24gcmlzaW5nIGVkZ2UgKi8KKyNkZWZpbmUJVE02TURBX0NBUFRVUkVfRU5BQkxFCTB4MTAJLyogY2FwdHVyZSBlbmFibGUgKi8KKworI2RlZmluZQlUTTZNREIJCQlfX1NZU1JFRygweGQ0MDAzMGI1LCB1OCkgICAvKiB0aW1lcjYgY21wL2NhcCBCIG1vZGUgcmVnICovCisjZGVmaW5lIFRNNk1EQl9PVVQJCTB4MDcJLyogb3V0cHV0IHNlbGVjdCAqLworI2RlZmluZQlUTTZNREJfT1VUX1NFVEJfUkVTRVRBCTB4MDAJLyogLSBzZXQgYXQgbWF0Y2ggQiwgcmVzZXQgYXQgbWF0Y2ggQSAqLworI2RlZmluZQlUTTZNREJfT1VUX1NFVEJfUkVTRVRPVgkweDAxCS8qIC0gc2V0IGF0IG1hdGNoIEIgKi8KKyNkZWZpbmUJVE02TURCX09VVF9SRVNFVEIJMHgwMwkvKiAtIHJlc2V0IGF0IG1hdGNoIEIgKi8KKyNkZWZpbmUJVE02TURCX09VVF9UT0dHTEUJMHgwNAkvKiAtIHRvZ2dsZSBvbiBtYXRjaCBCICovCisjZGVmaW5lIFRNNk1EQl9NT0RFCQkweGMwCS8qIGNvbXBhcmUgQiByZWdpc3RlciBtb2RlICovCisjZGVmaW5lCVRNNk1EQl9NT0RFX0NNUF9TSU5HTEUJMHgwMAkvKiAtIGNvbXBhcmUsIHNpbmdsZSBidWZmZXIgbW9kZSAqLworI2RlZmluZQlUTTZNREJfTU9ERV9DTVBfRE9VQkxFCTB4NDAJLyogLSBjb21wYXJlLCBkb3VibGUgYnVmZmVyIG1vZGUgKi8KKyNkZWZpbmUJVE02TURCX01PREVfQ0FQX1NfRURHRQkweDgwCS8qIC0gY2FwdHVyZSwgc2luZ2xlIGVkZ2UgbW9kZSAqLworI2RlZmluZQlUTTZNREJfTU9ERV9DQVBfRF9FREdFCTB4YzAJLyogLSBjYXB0dXJlLCBkb3VibGUgZWRnZSBtb2RlICovCisjZGVmaW5lIFRNNk1EQl9FREdFCQkweDIwCS8qIGNvbXBhcmUgQiBlZGdlIHNlbGVjdCAqLworI2RlZmluZQlUTTZNREJfRURHRV9GQUxMSU5HCTB4MDAJLyogY2FwdHVyZSBvbiBmYWxsaW5nIGVkZ2UgKi8KKyNkZWZpbmUJVE02TURCX0VER0VfUklTSU5HCTB4MjAJLyogY2FwdHVyZSBvbiByaXNpbmcgZWRnZSAqLworI2RlZmluZQlUTTZNREJfQ0FQVFVSRV9FTkFCTEUJMHgxMAkvKiBjYXB0dXJlIGVuYWJsZSAqLworCisjZGVmaW5lCVRNNkNBCQkJX19TWVNSRUcoMHhkNDAwMzBjNCwgdTE2KSAgIC8qIHRpbWVyNiBjbXAvY2FwdHVyZSByZWcgQSAqLworI2RlZmluZQlUTTZDQgkJCV9fU1lTUkVHKDB4ZDQwMDMwZDQsIHUxNikgICAvKiB0aW1lcjYgY21wL2NhcHR1cmUgcmVnIEIgKi8KKyNkZWZpbmUJVE02QkMJCQlfX1NZU1JFRygweGQ0MDAzMGE0LCB1MTYpICAgLyogdGltZXI2IGJpbmFyeSBjb3VudGVyICovCisKKyNkZWZpbmUgVE02SVJRCQkJNgkvKiB0aW1lciA2IElSUSAqLworI2RlZmluZSBUTTZBSVJRCQkJOQkvKiB0aW1lciA2QSBJUlEgKi8KKyNkZWZpbmUgVE02QklSUQkJCTEwCS8qIHRpbWVyIDZCIElSUSAqLworCisjZGVmaW5lCVRNNklDUgkJCUd4SUNSKFRNNklSUSkJLyogdGltZXIgNiB1ZmxvdyBpbnRyIGN0cmwgcmVnICovCisjZGVmaW5lCVRNNkFJQ1IJCQlHeElDUihUTTZBSVJRKQkvKiB0aW1lciA2QSBpbnRyIGNvbnRyb2wgcmVnICovCisjZGVmaW5lCVRNNkJJQ1IJCQlHeElDUihUTTZCSVJRKQkvKiB0aW1lciA2QiBpbnRyIGNvbnRyb2wgcmVnICovCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfQVNNX1RJTUVSX1JFR1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC90aW1leC5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC90aW1leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDQyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3RpbWV4LmgKQEAgLTAsMCArMSwzMyBAQAorLyogTU4xMDMwMCBBcmNoaXRlY3R1cmUgdGltZSBtYW5hZ2VtZW50IHNwZWNpZmljYXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fVElNRVhfSAorI2RlZmluZSBfQVNNX1RJTUVYX0gKKworI2luY2x1ZGUgPGFzbS9oYXJkaXJxLmg+CisjaW5jbHVkZSA8YXNtL3VuaXQvdGltZXguaD4KKworI2RlZmluZSBUSUNLX1NJWkUgKHRpY2tfbnNlYyAvIDEwMDApCisKKyNkZWZpbmUgQ0xPQ0tfVElDS19SQVRFIDExOTMxODAgLyogVW5kZXJseWluZyBIWiAtIHRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIHNldAorCQkJCSAqIHRvIHNvbWV0aGluZyBhcHByb3ByaWF0ZSwgYnV0IHdoYXQ/ICovCisKK2V4dGVybiBjeWNsZXNfdCBjYWNoZWZsdXNoX3RpbWU7CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKK3N0YXRpYyBpbmxpbmUgY3ljbGVzX3QgZ2V0X2N5Y2xlcyh2b2lkKQoreworCXJldHVybiByZWFkX3RpbWVzdGFtcF9jb3VudGVyKCk7Cit9CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfQVNNX1RJTUVYX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvdGxiLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3RsYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZDIzMmIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3RsYi5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qIE1OMTAzMDAgVExCIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0FTTV9UTEJfSAorI2RlZmluZSBfQVNNX1RMQl9ICisKKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKworZXh0ZXJuIHZvaWQgY2hlY2tfcGd0X2NhY2hlKHZvaWQpOworCisvKgorICogd2UgZG9uJ3QgbmVlZCBhbnkgc3BlY2lhbCBwZXItcHRlIG9yIHBlci12bWEgaGFuZGxpbmcuLi4KKyAqLworI2RlZmluZSB0bGJfc3RhcnRfdm1hKHRsYiwgdm1hKQkJCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHRsYl9lbmRfdm1hKHRsYiwgdm1hKQkJCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIF9fdGxiX3JlbW92ZV90bGJfZW50cnkodGxiLCBwdGVwLCBhZGRyZXNzKQlkbyB7IH0gd2hpbGUgKDApCisKKy8qCisgKiAuLiBiZWNhdXNlIHdlIGZsdXNoIHRoZSB3aG9sZSBtbSB3aGVuIGl0IGZpbGxzIHVwCisgKi8KKyNkZWZpbmUgdGxiX2ZsdXNoKHRsYikJZmx1c2hfdGxiX21tKCh0bGIpLT5tbSkKKworLyogZm9yIG5vdywganVzdCB1c2UgdGhlIGdlbmVyaWMgc3R1ZmYgKi8KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy90bGIuaD4KKworI2VuZGlmIC8qIF9BU01fVExCX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvdGxiZmx1c2guaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvdGxiZmx1c2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDIzOTg2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC90bGJmbHVzaC5oCkBAIC0wLDAgKzEsODAgQEAKKy8qIE1OMTAzMDAgVExCIGZsdXNoaW5nIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfQVNNX1RMQkZMVVNIX0gKKyNkZWZpbmUgX0FTTV9UTEJGTFVTSF9ICisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKyNkZWZpbmUgX19mbHVzaF90bGIoKQkJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlpbnQgdzsJCQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fCQkJCQlcCisJCSgiCW1vdiAlMSwlMAkJXG4iCQlcCisJCSAiCW9yICUyLCUwCQlcbiIJCVwKKwkJICIJbW92ICUwLCUxCQlcbiIJCVwKKwkJIDogIj1kIih3KQkJCQkJXAorCQkgOiAibSIoTU1VQ1RSKSwgImkiKE1NVUNUUl9JSVZ8TU1VQ1RSX0RJVikJXAorCQkgOiAibWVtb3J5IgkJCQkJXAorCQkgKTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fZmx1c2hfdGxiX2FsbCgpIF9fZmx1c2hfdGxiKCkKKyNkZWZpbmUgX19mbHVzaF90bGJfb25lKGFkZHIpIF9fZmx1c2hfdGxiKCkKKworCisvKgorICogVExCIGZsdXNoaW5nOgorICoKKyAqICAtIGZsdXNoX3RsYigpIGZsdXNoZXMgdGhlIGN1cnJlbnQgbW0gc3RydWN0IFRMQnMKKyAqICAtIGZsdXNoX3RsYl9hbGwoKSBmbHVzaGVzIGFsbCBwcm9jZXNzZXMgVExCcworICogIC0gZmx1c2hfdGxiX21tKG1tKSBmbHVzaGVzIHRoZSBzcGVjaWZpZWQgbW0gY29udGV4dCBUTEIncworICogIC0gZmx1c2hfdGxiX3BhZ2Uodm1hLCB2bWFkZHIpIGZsdXNoZXMgb25lIHBhZ2UKKyAqICAtIGZsdXNoX3RsYl9yYW5nZShtbSwgc3RhcnQsIGVuZCkgZmx1c2hlcyBhIHJhbmdlIG9mIHBhZ2VzCisgKiAgLSBmbHVzaF90bGJfcGd0YWJsZXMobW0sIHN0YXJ0LCBlbmQpIGZsdXNoZXMgYSByYW5nZSBvZiBwYWdlIHRhYmxlcworICovCisjZGVmaW5lIGZsdXNoX3RsYl9hbGwoKQkJCQlcCitkbyB7CQkJCQkJXAorCXByZWVtcHRfZGlzYWJsZSgpOwkJCVwKKwlfX2ZsdXNoX3RsYl9hbGwoKTsJCQlcCisJcHJlZW1wdF9lbmFibGUoKTsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGZsdXNoX3RsYl9tbShtbSkJCQlcCitkbyB7CQkJCQkJXAorCXByZWVtcHRfZGlzYWJsZSgpOwkJCVwKKwlfX2ZsdXNoX3RsYl9hbGwoKTsJCQlcCisJcHJlZW1wdF9lbmFibGUoKTsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGZsdXNoX3RsYl9yYW5nZSh2bWEsIHN0YXJ0LCBlbmQpCQkJXAorZG8gewkJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgX19zIF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0gKHN0YXJ0KTsJXAorCXVuc2lnbmVkIGxvbmcgX19lIF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0gKGVuZCk7CVwKKwlwcmVlbXB0X2Rpc2FibGUoKTsJCQkJCVwKKwlfX2ZsdXNoX3RsYl9hbGwoKTsJCQkJCVwKKwlwcmVlbXB0X2VuYWJsZSgpOwkJCQkJXAorfSB3aGlsZSAoMCkKKworCisjZGVmaW5lIF9fZmx1c2hfdGxiX2dsb2JhbCgpCQkJZmx1c2hfdGxiX2FsbCgpCisjZGVmaW5lIGZsdXNoX3RsYigpCQkJCWZsdXNoX3RsYl9hbGwoKQorI2RlZmluZSBmbHVzaF90bGJfa2VybmVsX3JhbmdlKHN0YXJ0LCBlbmQpCQkJXAorZG8gewkJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgX19zIF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0gKHN0YXJ0KTsJXAorCXVuc2lnbmVkIGxvbmcgX19lIF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0gKGVuZCk7CVwKKwlmbHVzaF90bGJfYWxsKCk7CQkJCQlcCit9IHdoaWxlICgwKQorCitleHRlcm4gdm9pZCBmbHVzaF90bGJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyKTsKKworI2RlZmluZSBmbHVzaF90bGJfcGd0YWJsZXMobW0sIHN0YXJ0LCBlbmQpCWRvIHt9IHdoaWxlICgwKQorCisjZW5kaWYgLyogX0FTTV9UTEJGTFVTSF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL3RvcG9sb2d5LmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3RvcG9sb2d5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQyOGYzMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvdG9wb2xvZ3kuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdG9wb2xvZ3kuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvdHlwZXMuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDBlYTc2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC90eXBlcy5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qIE1OMTAzMDAgQmFzaWMgdHlwZSBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNYXRzdXNoaXRhIEVsZWN0cmljIEluZHVzdHJpYWwgQ28uLCBMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9UWVBFU19ICisjZGVmaW5lIF9BU01fVFlQRVNfSAorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVtb2RlX3Q7CisKKy8qCisgKiBfX3h4IGlzIG9rOiBpdCBkb2Vzbid0IHBvbGx1dGUgdGhlIFBPU0lYIG5hbWVzcGFjZS4gVXNlIHRoZXNlIGluIHRoZQorICogaGVhZGVyIGZpbGVzIGV4cG9ydGVkIHRvIHVzZXIgc3BhY2UKKyAqLworCit0eXBlZGVmIF9fc2lnbmVkX18gY2hhciBfX3M4OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9fdTg7CisKK3R5cGVkZWYgX19zaWduZWRfXyBzaG9ydCBfX3MxNjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgX191MTY7CisKK3R5cGVkZWYgX19zaWduZWRfXyBpbnQgX19zMzI7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBfX3UzMjsKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykKK3R5cGVkZWYgX19zaWduZWRfXyBsb25nIGxvbmcgX19zNjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBfX3U2NDsKKyNlbmRpZgorCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKy8qCisgKiBUaGVzZSBhcmVuJ3QgZXhwb3J0ZWQgb3V0c2lkZSB0aGUga2VybmVsIHRvIGF2b2lkIG5hbWUgc3BhY2UgY2xhc2hlcworICovCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIEJJVFNfUEVSX0xPTkcgMzIKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKwordHlwZWRlZiBzaWduZWQgY2hhciBzODsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1ODsKKwordHlwZWRlZiBzaWduZWQgc2hvcnQgczE2OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1MTY7CisKK3R5cGVkZWYgc2lnbmVkIGludCBzMzI7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1MzI7CisKK3R5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBzNjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1NjQ7CisKKy8qIERtYSBhZGRyZXNzZXMgYXJlIDMyLWJpdHMgd2lkZS4gICovCit0eXBlZGVmIHUzMiBkbWFfYWRkcl90OworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfQVNNX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC91YWNjZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZiOWI2NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvdWFjY2Vzcy5oCkBAIC0wLDAgKzEsNDkwIEBACisvKiBNTjEwMzAwIHVzZXJzcGFjZSBhY2Nlc3MgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fVUFDQ0VTU19ICisjZGVmaW5lIF9BU01fVUFDQ0VTU19ICisKKy8qCisgKiBVc2VyIHNwYWNlIG1lbW9yeSBhY2Nlc3MgZnVuY3Rpb25zCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKworI2RlZmluZSBWRVJJRllfUkVBRCAwCisjZGVmaW5lIFZFUklGWV9XUklURSAxCisKKy8qCisgKiBUaGUgZnMgdmFsdWUgZGV0ZXJtaW5lcyB3aGV0aGVyIGFyZ3VtZW50IHZhbGlkaXR5IGNoZWNraW5nIHNob3VsZCBiZQorICogcGVyZm9ybWVkIG9yIG5vdC4gIElmIGdldF9mcygpID09IFVTRVJfRFMsIGNoZWNraW5nIGlzIHBlcmZvcm1lZCwgd2l0aAorICogZ2V0X2ZzKCkgPT0gS0VSTkVMX0RTLCBjaGVja2luZyBpcyBieXBhc3NlZC4KKyAqCisgKiBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCB0aGVzZSBtYWNyb3MgYXJlIGdyb3NzbHkgbWlzbmFtZWQuCisgKi8KKworI2RlZmluZSBNQUtFX01NX1NFRyhzKQkoKG1tX3NlZ21lbnRfdCkgeyAocykgfSkKKworI2RlZmluZSBLRVJORUxfWERTCU1BS0VfTU1fU0VHKDB4QkZGRkZGRkYpCisjZGVmaW5lIEtFUk5FTF9EUwlNQUtFX01NX1NFRygweDlGRkZGRkZGKQorI2RlZmluZSBVU0VSX0RTCQlNQUtFX01NX1NFRyhUQVNLX1NJWkUpCisKKyNkZWZpbmUgZ2V0X2RzKCkJKEtFUk5FTF9EUykKKyNkZWZpbmUgZ2V0X2ZzKCkJKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+YWRkcl9saW1pdCkKKyNkZWZpbmUgc2V0X2ZzKHgpCShjdXJyZW50X3RocmVhZF9pbmZvKCktPmFkZHJfbGltaXQgPSAoeCkpCisjZGVmaW5lIF9fa2VybmVsX2RzX3AoKSAoY3VycmVudF90aHJlYWRfaW5mbygpLT5hZGRyX2xpbWl0LnNlZyA9PSAweDlGRkZGRkZGKQorCisjZGVmaW5lIHNlZ21lbnRfZXEoYSwgYikgKChhKS5zZWcgPT0gKGIpLnNlZykKKworI2RlZmluZSBfX2FkZHJfb2soYWRkcikgXAorCSgodW5zaWduZWQgbG9uZykoYWRkcikgPCAoY3VycmVudF90aHJlYWRfaW5mbygpLT5hZGRyX2xpbWl0LnNlZykpCisKKy8qCisgKiBjaGVjayB0aGF0IGEgcmFuZ2Ugb2YgYWRkcmVzc2VzIGZhbGxzIHdpdGhpbiB0aGUgY3VycmVudCBhZGRyZXNzIGxpbWl0CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9fX3JhbmdlX29rKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgaW50IHNpemUpCit7CisJaW50IGZsYWcgPSAxLCB0bXA7CisKKwlhc20oIglhZGQJJTMsJTEJXG4iCS8qIHNldCBDLWZsYWcgaWYgYWRkciArIHNpemUgPiA0R2IgKi8KKwkgICAgIgliY3MJMGYJXG4iCisJICAgICIJY21wCSU0LCUxCVxuIgkvKiBqdW1wIGlmIGFkZHIrc2l6ZT5saW1pdCAoZXJyb3IpICovCisJICAgICIJYmhpCTBmCVxuIgorCSAgICAiCWNscgklMAlcbiIJLyogbWFyayBva2F5ICovCisJICAgICIwOgkJCVxuIgorCSAgICA6ICI9ciIoZmxhZyksICI9JnIiKHRtcCkKKwkgICAgOiAiMSIoYWRkciksICJpciIoc2l6ZSksCisJICAgICAgInIiKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+YWRkcl9saW1pdC5zZWcpLCAiMCIoZmxhZykKKwkgICAgOiAiY2MiCisJICAgICk7CisKKwlyZXR1cm4gZmxhZzsKK30KKworI2RlZmluZSBfX3JhbmdlX29rKGFkZHIsIHNpemUpIF9fX3JhbmdlX29rKCh1bnNpZ25lZCBsb25nKShhZGRyKSwgKHUzMikoc2l6ZSkpCisKKyNkZWZpbmUgYWNjZXNzX29rKHR5cGUsIGFkZHIsIHNpemUpIChfX3JhbmdlX29rKChhZGRyKSwgKHNpemUpKSA9PSAwKQorI2RlZmluZSBfX2FjY2Vzc19vayhhZGRyLCBzaXplKSAgICAgKF9fcmFuZ2Vfb2soKGFkZHIpLCAoc2l6ZSkpID09IDApCisKK3N0YXRpYyBpbmxpbmUgaW50IHZlcmlmeV9hcmVhKGludCB0eXBlLCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJcmV0dXJuIGFjY2Vzc19vayh0eXBlLCBhZGRyLCBzaXplKSA/IDAgOiAtRUZBVUxUOworfQorCisKKy8qCisgKiBUaGUgZXhjZXB0aW9uIHRhYmxlIGNvbnNpc3RzIG9mIHBhaXJzIG9mIGFkZHJlc3NlczogdGhlIGZpcnN0IGlzIHRoZQorICogYWRkcmVzcyBvZiBhbiBpbnN0cnVjdGlvbiB0aGF0IGlzIGFsbG93ZWQgdG8gZmF1bHQsIGFuZCB0aGUgc2Vjb25kIGlzCisgKiB0aGUgYWRkcmVzcyBhdCB3aGljaCB0aGUgcHJvZ3JhbSBzaG91bGQgY29udGludWUuICBObyByZWdpc3RlcnMgYXJlCisgKiBtb2RpZmllZCwgc28gaXQgaXMgZW50aXJlbHkgdXAgdG8gdGhlIGNvbnRpbnVhdGlvbiBjb2RlIHRvIGZpZ3VyZSBvdXQKKyAqIHdoYXQgdG8gZG8uCisgKgorICogQWxsIHRoZSByb3V0aW5lcyBiZWxvdyB1c2UgYml0cyBvZiBmaXh1cCBjb2RlIHRoYXQgYXJlIG91dCBvZiBsaW5lCisgKiB3aXRoIHRoZSBtYWluIGluc3RydWN0aW9uIHBhdGguICBUaGlzIG1lYW5zIHdoZW4gZXZlcnl0aGluZyBpcyB3ZWxsLAorICogd2UgZG9uJ3QgZXZlbiBoYXZlIHRvIGp1bXAgb3ZlciB0aGVtLiAgRnVydGhlciwgdGhleSBkbyBub3QgaW50cnVkZQorICogb24gb3VyIGNhY2hlIG9yIHRsYiBlbnRyaWVzLgorICovCisKK3N0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkKK3sKKwl1bnNpZ25lZCBsb25nIGluc24sIGZpeHVwOworfTsKKworLyogUmV0dXJucyAwIGlmIGV4Y2VwdGlvbiBub3QgZm91bmQgYW5kIGZpeHVwIG90aGVyd2lzZS4gICovCitleHRlcm4gaW50IGZpeHVwX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKyNkZWZpbmUgcHV0X3VzZXIoeCwgcHRyKSBfX3B1dF91c2VyX2NoZWNrKCh4KSwgKHB0ciksIHNpemVvZigqKHB0cikpKQorI2RlZmluZSBnZXRfdXNlcih4LCBwdHIpIF9fZ2V0X3VzZXJfY2hlY2soKHgpLCAocHRyKSwgc2l6ZW9mKCoocHRyKSkpCisKKy8qCisgKiBUaGUgIl9feHh4IiB2ZXJzaW9ucyBkbyBub3QgZG8gYWRkcmVzcyBzcGFjZSBjaGVja2luZywgdXNlZnVsIHdoZW4KKyAqIGRvaW5nIG11bHRpcGxlIGFjY2Vzc2VzIHRvIHRoZSBzYW1lIGFyZWEgKHRoZSB1c2VyIGhhcyB0byBkbyB0aGUKKyAqIGNoZWNrcyBieSBoYW5kIHdpdGggImFjY2Vzc19vaygpIikKKyAqLworI2RlZmluZSBfX3B1dF91c2VyKHgsIHB0cikgX19wdXRfdXNlcl9ub2NoZWNrKCh4KSwgKHB0ciksIHNpemVvZigqKHB0cikpKQorI2RlZmluZSBfX2dldF91c2VyKHgsIHB0cikgX19nZXRfdXNlcl9ub2NoZWNrKCh4KSwgKHB0ciksIHNpemVvZigqKHB0cikpKQorCisvKgorICogVGhlICJ4eHhfcmV0IiB2ZXJzaW9ucyByZXR1cm4gY29uc3RhbnQgc3BlY2lmaWVkIGluIHRoaXJkIGFyZ3VtZW50LCBpZgorICogc29tZXRoaW5nIGJhZCBoYXBwZW5zLiBUaGVzZSBtYWNyb3MgY2FuIGJlIG9wdGltaXplZCBmb3IgdGhlCisgKiBjYXNlIG9mIGp1c3QgcmV0dXJuaW5nIGZyb20gdGhlIGZ1bmN0aW9uIHh4eF9yZXQgaXMgdXNlZC4KKyAqLworCisjZGVmaW5lIHB1dF91c2VyX3JldCh4LCBwdHIsIHJldCkgXAorCSh7IGlmIChwdXRfdXNlcigoeCksIChwdHIpKSkJcmV0dXJuIChyZXQpOyB9KQorI2RlZmluZSBnZXRfdXNlcl9yZXQoeCwgcHRyLCByZXQpIFwKKwkoeyBpZiAoZ2V0X3VzZXIoKHgpLCAocHRyKSkpCXJldHVybiAocmV0KTsgfSkKKyNkZWZpbmUgX19wdXRfdXNlcl9yZXQoeCwgcHRyLCByZXQpIFwKKwkoeyBpZiAoX19wdXRfdXNlcigoeCksIChwdHIpKSkJcmV0dXJuIChyZXQpOyB9KQorI2RlZmluZSBfX2dldF91c2VyX3JldCh4LCBwdHIsIHJldCkgXAorCSh7IGlmIChfX2dldF91c2VyKCh4KSwgKHB0cikpKQlyZXR1cm4gKHJldCk7IH0pCisKK3N0cnVjdCBfX2xhcmdlX3N0cnVjdCB7IHVuc2lnbmVkIGxvbmcgYnVmWzEwMF07IH07CisjZGVmaW5lIF9fbSh4KSAoKihzdHJ1Y3QgX19sYXJnZV9zdHJ1Y3QgKikoeCkpCisKKyNkZWZpbmUgX19nZXRfdXNlcl9ub2NoZWNrKHgsIHB0ciwgc2l6ZSkJXAorKHsJCQkJCQlcCisJX190eXBlb2YoKihwdHIpKSBfX2d1X3ZhbDsJCVwKKwl1bnNpZ25lZCBsb25nIF9fZ3VfYWRkcjsJCVwKKwlpbnQgX19ndV9lcnI7CQkJCVwKKwlfX2d1X2FkZHIgPSAodW5zaWduZWQgbG9uZykgKHB0cik7CVwKKwlzd2l0Y2ggKHNpemUpIHsJCQkJXAorCWNhc2UgMTogIF9fZ2V0X3VzZXJfYXNtKCJidSIpOyBicmVhazsJXAorCWNhc2UgMjogIF9fZ2V0X3VzZXJfYXNtKCJodSIpOyBicmVhazsJXAorCWNhc2UgNDogIF9fZ2V0X3VzZXJfYXNtKCIiICApOyBicmVhazsJXAorCWRlZmF1bHQ6IF9fZ2V0X3VzZXJfdW5rbm93bigpOyBicmVhazsJXAorCX0JCQkJCVwKKwl4ID0gKF9fdHlwZW9mX18oKihwdHIpKSkgX19ndV92YWw7CVwKKwlfX2d1X2VycjsJCQkJXAorfSkKKworI2RlZmluZSBfX2dldF91c2VyX2NoZWNrKHgsIHB0ciwgc2l6ZSkJCQlcCisoewkJCQkJCQlcCisJX190eXBlb2ZfXygqKHB0cikpIF9fZ3VfdmFsOwkJCVwKKwl1bnNpZ25lZCBsb25nIF9fZ3VfYWRkcjsJCQlcCisJaW50IF9fZ3VfZXJyOwkJCQkJXAorCV9fZ3VfYWRkciA9ICh1bnNpZ25lZCBsb25nKSAocHRyKTsJCVwKKwlpZiAobGlrZWx5KF9fYWNjZXNzX29rKF9fZ3VfYWRkcixzaXplKSkpIHsJXAorCQlzd2l0Y2ggKHNpemUpIHsJCQkJXAorCQljYXNlIDE6ICBfX2dldF91c2VyX2FzbSgiYnUiKTsgYnJlYWs7CVwKKwkJY2FzZSAyOiAgX19nZXRfdXNlcl9hc20oImh1Iik7IGJyZWFrOwlcCisJCWNhc2UgNDogIF9fZ2V0X3VzZXJfYXNtKCIiICApOyBicmVhazsJXAorCQlkZWZhdWx0OiBfX2dldF91c2VyX3Vua25vd24oKTsgYnJlYWs7CVwKKwkJfQkJCQkJXAorCX0JCQkJCQlcCisJZWxzZSB7CQkJCQkJXAorCQlfX2d1X2VyciA9IC1FRkFVTFQ7CQkJXAorCQlfX2d1X3ZhbCA9IDA7CQkJCVwKKwl9CQkJCQkJXAorCXggPSAoX190eXBlb2ZfXygqKHB0cikpKSBfX2d1X3ZhbDsJCVwKKwlfX2d1X2VycjsJCQkJCVwKK30pCisKKyNkZWZpbmUgX19nZXRfdXNlcl9hc20oSU5TTikJCQkJCVwKKyh7CQkJCQkJCQlcCisJYXNtIHZvbGF0aWxlKAkJCQkJXAorCQkiMTpcbiIJCQkJCQlcCisJCSIJbW92IklOU04iCSUyLCUxXG4iCQlcCisJCSIJbW92CQkwLCUwXG4iCQkJXAorCQkiMjpcbiIJCQkJCQlcCisJCSIJLnNlY3Rpb24JLmZpeHVwLFwiYXhcIlxuIglcCisJCSIzOlxuXHQiCQkJCQlcCisJCSIJbW92CQklMywlMFxuIgkJXAorCQkiCWptcAkJMmJcbiIJCQlcCisJCSIJLnByZXZpb3VzXG4iCQkJCVwKKwkJIgkuc2VjdGlvbglfX2V4X3RhYmxlLFwiYVwiXG4iCVwKKwkJIgkuYmFsaWduCQk0XG4iCQkJXAorCQkiCS5sb25nCQkxYiwgM2JcbiIJCVwKKwkJIgkucHJldmlvdXMiCQkJCVwKKwkJOiAiPSZyIiAoX19ndV9lcnIpLCAiPSZyIiAoX19ndV92YWwpCQlcCisJCTogIm0iIChfX20oX19ndV9hZGRyKSksICJpIiAoLUVGQVVMVCkpOwkJXAorfSkKKworZXh0ZXJuIGludCBfX2dldF91c2VyX3Vua25vd24odm9pZCk7CisKKyNkZWZpbmUgX19wdXRfdXNlcl9ub2NoZWNrKHgsIHB0ciwgc2l6ZSkJCQlcCisoewkJCQkJCQkJXAorCXVuaW9uIHsJCQkJCQkJXAorCQlfX3R5cGVvZl9fKCoocHRyKSkgdmFsOwkJCQlcCisJCXUzMiBiaXRzWzJdOwkJCQkJXAorCX0gX19wdV92YWw7CQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgX19wdV9hZGRyOwkJCQlcCisJaW50IF9fcHVfZXJyOwkJCQkJCVwKKwlfX3B1X3ZhbC52YWwgPSAoeCk7CQkJCQlcCisJX19wdV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIChwdHIpOwkJCVwKKwlzd2l0Y2ggKHNpemUpIHsJCQkJCQlcCisJY2FzZSAxOiAgX19wdXRfdXNlcl9hc20oImJ1Iik7IGJyZWFrOwkJCVwKKwljYXNlIDI6ICBfX3B1dF91c2VyX2FzbSgiaHUiKTsgYnJlYWs7CQkJXAorCWNhc2UgNDogIF9fcHV0X3VzZXJfYXNtKCIiICApOyBicmVhazsJCQlcCisJY2FzZSA4OiAgX19wdXRfdXNlcl9hc204KCk7ICAgIGJyZWFrOwkJCVwKKwlkZWZhdWx0OiBfX3B1X2VyciA9IF9fcHV0X3VzZXJfdW5rbm93bigpOyBicmVhazsJXAorCX0JCQkJCQkJXAorCV9fcHVfZXJyOwkJCQkJCVwKK30pCisKKyNkZWZpbmUgX19wdXRfdXNlcl9jaGVjayh4LCBwdHIsIHNpemUpCQkJCQlcCisoewkJCQkJCQkJCVwKKwl1bmlvbiB7CQkJCQkJCQlcCisJCV9fdHlwZW9mX18oKihwdHIpKSB2YWw7CQkJCQlcCisJCXUzMiBiaXRzWzJdOwkJCQkJCVwKKwl9IF9fcHVfdmFsOwkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBfX3B1X2FkZHI7CQkJCQlcCisJaW50IF9fcHVfZXJyOwkJCQkJCQlcCisJX19wdV92YWwudmFsID0gKHgpOwkJCQkJCVwKKwlfX3B1X2FkZHIgPSAodW5zaWduZWQgbG9uZykgKHB0cik7CQkJCVwKKwlpZiAobGlrZWx5KF9fYWNjZXNzX29rKF9fcHVfYWRkciwgc2l6ZSkpKSB7CQkJXAorCQlzd2l0Y2ggKHNpemUpIHsJCQkJCQlcCisJCWNhc2UgMTogIF9fcHV0X3VzZXJfYXNtKCJidSIpOyBicmVhazsJCQlcCisJCWNhc2UgMjogIF9fcHV0X3VzZXJfYXNtKCJodSIpOyBicmVhazsJCQlcCisJCWNhc2UgNDogIF9fcHV0X3VzZXJfYXNtKCIiICApOyBicmVhazsJCQlcCisJCWNhc2UgODogIF9fcHV0X3VzZXJfYXNtOCgpOyAgICBicmVhazsJCQlcCisJCWRlZmF1bHQ6IF9fcHVfZXJyID0gX19wdXRfdXNlcl91bmtub3duKCk7IGJyZWFrOwlcCisJCX0JCQkJCQkJXAorCX0JCQkJCQkJCVwKKwllbHNlIHsJCQkJCQkJCVwKKwkJX19wdV9lcnIgPSAtRUZBVUxUOwkJCQkJXAorCX0JCQkJCQkJCVwKKwlfX3B1X2VycjsJCQkJCQkJXAorfSkKKworI2RlZmluZSBfX3B1dF91c2VyX2FzbShJTlNOKQkJCQkJXAorKHsJCQkJCQkJCVwKKwlhc20gdm9sYXRpbGUoCQkJCQkJXAorCQkiMTpcbiIJCQkJCQlcCisJCSIJbW92IklOU04iCSUxLCUyXG4iCQlcCisJCSIJbW92CQkwLCUwXG4iCQkJXAorCQkiMjpcbiIJCQkJCQlcCisJCSIJLnNlY3Rpb24JLmZpeHVwLFwiYXhcIlxuIglcCisJCSIzOlxuIgkJCQkJCVwKKwkJIgltb3YJCSUzLCUwXG4iCQlcCisJCSIJam1wCQkyYlxuIgkJCVwKKwkJIgkucHJldmlvdXNcbiIJCQkJXAorCQkiCS5zZWN0aW9uCV9fZXhfdGFibGUsXCJhXCJcbiIJXAorCQkiCS5iYWxpZ24JCTRcbiIJCQlcCisJCSIJLmxvbmcJCTFiLCAzYlxuIgkJXAorCQkiCS5wcmV2aW91cyIJCQkJXAorCQk6ICI9JnIiIChfX3B1X2VycikJCQkJXAorCQk6ICJyIiAoX19wdV92YWwudmFsKSwgIm0iIChfX20oX19wdV9hZGRyKSksCVwKKwkJICAiaSIgKC1FRkFVTFQpCQkJCQlcCisJCSk7CQkJCQkJXAorfSkKKworI2RlZmluZSBfX3B1dF91c2VyX2FzbTgoKQkJCQkJCVwKKyh7CQkJCQkJCQkJXAorCWFzbSB2b2xhdGlsZSgJCQkJCQkJXAorCQkiMToJbW92CQklMSwlMwkJXG4iCQlcCisJCSIyOgltb3YJCSUyLCU0CQlcbiIJCVwKKwkJIgltb3YJCTAsJTAJCVxuIgkJXAorCQkiMzoJCQkJCVxuIgkJXAorCQkiCS5zZWN0aW9uCS5maXh1cCxcImF4XCIJXG4iCQlcCisJCSI0OgkJCQkJXG4iCQlcCisJCSIJbW92CQklNSwlMAkJXG4iCQlcCisJCSIJam1wCQkyYgkJXG4iCQlcCisJCSIJLnByZXZpb3VzCQkJXG4iCQlcCisJCSIJLnNlY3Rpb24JX19leF90YWJsZSxcImFcIlxuIgkJXAorCQkiCS5iYWxpZ24JCTQJCVxuIgkJXAorCQkiCS5sb25nCQkxYiwgNGIJCVxuIgkJXAorCQkiCS5sb25nCQkyYiwgNGIJCVxuIgkJXAorCQkiCS5wcmV2aW91cwkJCVxuIgkJXAorCQk6ICI9JnIiIChfX3B1X2VycikJCQkJCVwKKwkJOiAiciIgKF9fcHVfdmFsLmJpdHNbMF0pLCAiciIgKF9fcHVfdmFsLmJpdHNbMV0pLAlcCisJCSAgIm0iIChfX20oX19wdV9hZGRyKSksICJtIiAoX19tKF9fcHVfYWRkcis0KSksCQlcCisJCSAgImkiICgtRUZBVUxUKQkJCQkJCVwKKwkJKTsJCQkJCQkJXAorfSkKKworZXh0ZXJuIGludCBfX3B1dF91c2VyX3Vua25vd24odm9pZCk7CisKKworLyoKKyAqIENvcHkgVG8vRnJvbSBVc2Vyc3BhY2UKKyAqLworLyogR2VuZXJpYyBhcmJpdHJhcnkgc2l6ZWQgY29weS4gICovCisjZGVmaW5lIF9fY29weV91c2VyKHRvLCBmcm9tLCBzaXplKQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoc2l6ZSkgewkJCQkJCQlcCisJCXZvaWQgKl9fdG8gPSB0bzsJCQkJCVwKKwkJY29uc3Qgdm9pZCAqX19mcm9tID0gZnJvbTsJCQkJXAorCQlpbnQgdzsJCQkJCQkJXAorCQlhc20gdm9sYXRpbGUoCQkJCQkJXAorCQkJIjA6ICAgICBtb3ZidQkoJTApLCUzO1xuIgkJCVwKKwkJCSIxOiAgICAgbW92YnUJJTMsKCUxKTtcbiIJCQlcCisJCQkiCWluYwklMDtcbiIJCQkJXAorCQkJIglpbmMJJTE7XG4iCQkJCVwKKwkJCSIgICAgICAgYWRkCS0xLCUyO1xuIgkJCVwKKwkJCSIgICAgICAgYm5lCTBiO1xuIgkJCQlcCisJCQkiMjpcbiIJCQkJCQlcCisJCQkiCS5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIJCVwKKwkJCSIzOglqbXAJMmJcbiIJCQkJXAorCQkJIgkucHJldmlvdXNcbiIJCQkJXAorCQkJIgkuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCQlcCisJCQkiICAgICAgIC5iYWxpZ24JNFxuIgkJCQlcCisJCQkiICAgICAgIC5sb25nCTBiLDNiXG4iCQkJXAorCQkJIiAgICAgICAubG9uZwkxYiwzYlxuIgkJCVwKKwkJCSIJLnByZXZpb3VzXG4iCQkJCVwKKwkJCTogIj1hIihfX2Zyb20pLCAiPWEiKF9fdG8pLCAiPXIiKHNpemUpLCAiPSZyIih3KVwKKwkJCTogIjAiKF9fZnJvbSksICIxIihfX3RvKSwgIjIiKHNpemUpCQlcCisJCQk6ICJtZW1vcnkiKTsJCQkJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fY29weV91c2VyX3plcm9pbmcodG8sIGZyb20sIHNpemUpCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKHNpemUpIHsJCQkJCQkJXAorCQl2b2lkICpfX3RvID0gdG87CQkJCQlcCisJCWNvbnN0IHZvaWQgKl9fZnJvbSA9IGZyb207CQkJCVwKKwkJaW50IHc7CQkJCQkJCVwKKwkJYXNtIHZvbGF0aWxlKAkJCQkJCVwKKwkJCSIwOiAgICAgbW92YnUJKCUwKSwlMztcbiIJCQlcCisJCQkiMTogICAgIG1vdmJ1CSUzLCglMSk7XG4iCQkJXAorCQkJIglpbmMJJTA7XG4iCQkJCVwKKwkJCSIJaW5jCSUxO1xuIgkJCQlcCisJCQkiICAgICAgIGFkZAktMSwlMjtcbiIJCQlcCisJCQkiICAgICAgIGJuZQkwYjtcbiIJCQkJXAorCQkJIjI6XG4iCQkJCQkJXAorCQkJIgkuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQlcCisJCQkiMzpcbiIJCQkJCQlcCisJCQkiCW1vdgklMiwlMFxuIgkJCVwKKwkJCSIJY2xyCSUzXG4iCQkJCVwKKwkJCSI0OiAgICAgbW92YnUJJTMsKCUxKTtcbiIJCQlcCisJCQkiCWluYwklMTtcbiIJCQkJXAorCQkJIiAgICAgICBhZGQJLTEsJTI7XG4iCQkJXAorCQkJIiAgICAgICBibmUJNGI7XG4iCQkJCVwKKwkJCSIJbW92CSUwLCUyXG4iCQkJXAorCQkJIglqbXAJMmJcbiIJCQkJXAorCQkJIgkucHJldmlvdXNcbiIJCQkJXAorCQkJIgkuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCQlcCisJCQkiICAgICAgIC5iYWxpZ24JNFxuIgkJCQlcCisJCQkiICAgICAgIC5sb25nCTBiLDNiXG4iCQkJXAorCQkJIiAgICAgICAubG9uZwkxYiwzYlxuIgkJCVwKKwkJCSIJLnByZXZpb3VzXG4iCQkJCVwKKwkJCTogIj1hIihfX2Zyb20pLCAiPWEiKF9fdG8pLCAiPXIiKHNpemUpLCAiPSZyIih3KVwKKwkJCTogIjAiKF9fZnJvbSksICIxIihfX3RvKSwgIjIiKHNpemUpCQlcCisJCQk6ICJtZW1vcnkiKTsJCQkJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisvKiBXZSBsZXQgdGhlIF9fIHZlcnNpb25zIG9mIGNvcHlfZnJvbS90b191c2VyIGlubGluZSwgYmVjYXVzZSB0aGV5J3JlIG9mdGVuCisgKiB1c2VkIGluIGZhc3QgcGF0aHMgYW5kIGhhdmUgb25seSBhIHNtYWxsIHNwYWNlIG92ZXJoZWFkLgorICovCitzdGF0aWMgaW5saW5lCit1bnNpZ25lZCBsb25nIF9fZ2VuZXJpY19jb3B5X2Zyb21fdXNlcl9ub2NoZWNrKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLAorCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBuKQoreworCV9fY29weV91c2VyX3plcm9pbmcodG8sIGZyb20sIG4pOworCXJldHVybiBuOworfQorCitzdGF0aWMgaW5saW5lCit1bnNpZ25lZCBsb25nIF9fZ2VuZXJpY19jb3B5X3RvX3VzZXJfbm9jaGVjayh2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nIG4pCit7CisJX19jb3B5X3VzZXIodG8sIGZyb20sIG4pOworCXJldHVybiBuOworfQorCisKKyNpZiAwCisjZXJyb3IgZG9uJ3QgdXNlIC0gdGhlc2UgbWFjcm9zIGRvbid0IGluY3JlbWVudCB0byAmIGZyb20gcG9pbnRlcnMKKy8qIE9wdGltaXplIGp1c3QgYSBsaXR0bGUgYml0IHdoZW4gd2Uga25vdyB0aGUgc2l6ZSBvZiB0aGUgbW92ZS4gKi8KKyNkZWZpbmUgX19jb25zdGFudF9jb3B5X3VzZXIodG8sIGZyb20sIHNpemUpCVwKK2RvIHsJCQkJCQlcCisJYXNtIHZvbGF0aWxlKAkJCQlcCisJCSIgICAgICAgbW92ICUwLGEwO1xuIgkJXAorCQkiMDogICAgIG1vdmJ1ICglMSksZDM7XG4iCVwKKwkJIjE6ICAgICBtb3ZidSBkMywoJTIpO1xuIglcCisJCSIgICAgICAgYWRkIC0xLGEwO1xuIgkJXAorCQkiICAgICAgIGJuZSAwYjtcbiIJCVwKKwkJIjI6OyIJCQkJXAorCQkiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIglcCisJCSIzOglqbXAgMmJcbiIJCVwKKwkJIi5wcmV2aW91c1xuIgkJCVwKKwkJIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIJXAorCQkiICAgICAgIC5iYWxpZ24gNFxuIgkJXAorCQkiICAgICAgIC5sb25nIDBiLDNiXG4iCQlcCisJCSIgICAgICAgLmxvbmcgMWIsM2JcbiIJCVwKKwkJIi5wcmV2aW91cyIJCQlcCisJCToJCQkJXAorCQk6ICJkIihzaXplKSwgImQiKHRvKSwgImQiKGZyb20pCVwKKwkJOiAiZDMiLCAiYTAiKTsJCQlcCit9IHdoaWxlICgwKQorCisvKiBPcHRpbWl6ZSBqdXN0IGEgbGl0dGxlIGJpdCB3aGVuIHdlIGtub3cgdGhlIHNpemUgb2YgdGhlIG1vdmUuICovCisjZGVmaW5lIF9fY29uc3RhbnRfY29weV91c2VyX3plcm9pbmcodG8sIGZyb20sIHNpemUpCVwKK2RvIHsJCQkJCQkJXAorCWFzbSB2b2xhdGlsZSgJCQkJCVwKKwkJIiAgICAgICBtb3YgJTAsYTA7XG4iCQkJXAorCQkiMDogICAgIG1vdmJ1ICglMSksZDM7XG4iCQlcCisJCSIxOiAgICAgbW92YnUgZDMsKCUyKTtcbiIJCVwKKwkJIiAgICAgICBhZGQgLTEsYTA7XG4iCQkJXAorCQkiICAgICAgIGJuZSAwYjtcbiIJCQlcCisJCSIyOjsiCQkJCQlcCisJCSIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQlcCisJCSIzOglqbXAgMmJcbiIJCQlcCisJCSIucHJldmlvdXNcbiIJCQkJXAorCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgkJXAorCQkiICAgICAgIC5iYWxpZ24gNFxuIgkJCVwKKwkJIiAgICAgICAubG9uZyAwYiwzYlxuIgkJCVwKKwkJIiAgICAgICAubG9uZyAxYiwzYlxuIgkJCVwKKwkJIi5wcmV2aW91cyIJCQkJXAorCQk6CQkJCQlcCisJCTogImQiKHNpemUpLCAiZCIodG8pLCAiZCIoZnJvbSkJCVwKKwkJOiAiZDMiLCAiYTAiKTsJCQkJXAorfSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZQordW5zaWduZWQgbG9uZyBfX2NvbnN0YW50X2NvcHlfdG9fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIG4pCit7CisJaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHRvLCBuKSkKKwkJX19jb25zdGFudF9jb3B5X3VzZXIodG8sIGZyb20sIG4pOworCXJldHVybiBuOworfQorCitzdGF0aWMgaW5saW5lCit1bnNpZ25lZCBsb25nIF9fY29uc3RhbnRfY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sCisJCQkJCXVuc2lnbmVkIGxvbmcgbikKK3sKKwlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBuKSkKKwkJX19jb25zdGFudF9jb3B5X3VzZXJfemVyb2luZyh0bywgZnJvbSwgbik7CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbmxpbmUKK3Vuc2lnbmVkIGxvbmcgX19jb25zdGFudF9jb3B5X3RvX3VzZXJfbm9jaGVjayh2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBuKQoreworCV9fY29uc3RhbnRfY29weV91c2VyKHRvLCBmcm9tLCBuKTsKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGlubGluZQordW5zaWduZWQgbG9uZyBfX2NvbnN0YW50X2NvcHlfZnJvbV91c2VyX25vY2hlY2sodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sCisJCQkJCQl1bnNpZ25lZCBsb25nIG4pCit7CisJX19jb25zdGFudF9jb3B5X3VzZXJfemVyb2luZyh0bywgZnJvbSwgbik7CisJcmV0dXJuIG47Cit9CisjZW5kaWYKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19nZW5lcmljX2NvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqLCBjb25zdCB2b2lkICosCisJCQkJCSAgICB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIF9fZ2VuZXJpY19jb3B5X2Zyb21fdXNlcih2b2lkICosIGNvbnN0IHZvaWQgX191c2VyICosCisJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcpOworCisjZGVmaW5lIF9fY29weV90b191c2VyX2luYXRvbWljKHRvLCBmcm9tLCBuKSBcCisJX19nZW5lcmljX2NvcHlfdG9fdXNlcl9ub2NoZWNrKCh0byksIChmcm9tKSwgKG4pKQorI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKHRvLCBmcm9tLCBuKSBcCisJX19nZW5lcmljX2NvcHlfZnJvbV91c2VyX25vY2hlY2soKHRvKSwgKGZyb20pLCAobikpCisKKyNkZWZpbmUgX19jb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pCQkJXAorKHsJCQkJCQkJXAorCW1pZ2h0X3NsZWVwKCk7CQkJCQlcCisJX19jb3B5X3RvX3VzZXJfaW5hdG9taWMoKHRvKSwgKGZyb20pLCAobikpOwlcCit9KQorCisjZGVmaW5lIF9fY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pCQkJXAorKHsJCQkJCQkJXAorCW1pZ2h0X3NsZWVwKCk7CQkJCQlcCisJX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYygodG8pLCAoZnJvbSksIChuKSk7CVwKK30pCisKKworI2RlZmluZSBjb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pICAgX19nZW5lcmljX2NvcHlfdG9fdXNlcigodG8pLCAoZnJvbSksIChuKSkKKyNkZWZpbmUgY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pIF9fZ2VuZXJpY19jb3B5X2Zyb21fdXNlcigodG8pLCAoZnJvbSksIChuKSkKKworZXh0ZXJuIGxvbmcgc3RybmNweV9mcm9tX3VzZXIoY2hhciAqZHN0LCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBsb25nIGNvdW50KTsKK2V4dGVybiBsb25nIF9fc3RybmNweV9mcm9tX3VzZXIoY2hhciAqZHN0LCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBsb25nIGNvdW50KTsKK2V4dGVybiBsb25nIHN0cm5sZW5fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqc3RyLCBsb25nIG4pOworI2RlZmluZSBzdHJsZW5fdXNlcihzdHIpIHN0cm5sZW5fdXNlcihzdHIsIH4wVUwgPj4gMSkKK2V4dGVybiB1bnNpZ25lZCBsb25nIGNsZWFyX3VzZXIodm9pZCBfX3VzZXIgKm1lbSwgdW5zaWduZWQgbG9uZyBsZW4pOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19jbGVhcl91c2VyKHZvaWQgX191c2VyICptZW0sIHVuc2lnbmVkIGxvbmcgbGVuKTsKKworI2VuZGlmIC8qIF9BU01fVUFDQ0VTU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL3Vjb250ZXh0LmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3Vjb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNhYjVjMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvdWNvbnRleHQuaApAQCAtMCwwICsxLDIyIEBACisvKiBNTjEwMzAwIFVzZXIgY29udGV4dAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNYXRzdXNoaXRhIEVsZWN0cmljIEluZHVzdHJpYWwgQ28uLCBMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9VQ09OVEVYVF9ICisjZGVmaW5lIF9BU01fVUNPTlRFWFRfSAorCitzdHJ1Y3QgdWNvbnRleHQgeworCXVuc2lnbmVkIGxvbmcJICB1Y19mbGFnczsKKwlzdHJ1Y3QgdWNvbnRleHQgICp1Y19saW5rOworCXN0YWNrX3QJCSAgdWNfc3RhY2s7CisJc3RydWN0IHNpZ2NvbnRleHQgdWNfbWNvbnRleHQ7CisJc2lnc2V0X3QJICB1Y19zaWdtYXNrOwkvKiBtYXNrIGxhc3QgZm9yIGV4dGVuc2liaWxpdHkgKi8KK307CisKKyNlbmRpZiAvKiBfQVNNX1VDT05URVhUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvdW5hbGlnbmVkLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3VuYWxpZ25lZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZDNhZmIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3VuYWxpZ25lZC5oCkBAIC0wLDAgKzEsMTM2IEBACisvKiBNTjEwMzAwIFVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzIGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fVU5BTElHTkVEX0gKKyNkZWZpbmUgX0FTTV9VTkFMSUdORURfSAorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpZiAwCitleHRlcm4gaW50IF9fYnVnX3VuYWxpZ25lZF94KHZvaWQgKnB0cik7CisKKy8qCisgKiBXaGF0IGlzIHRoZSBtb3N0IGVmZmljaWVudCB3YXkgb2YgbG9hZGluZy9zdG9yaW5nIGFuIHVuYWxpZ25lZCB2YWx1ZT8KKyAqCisgKiBUaGF0IGlzIHRoZSBzdWJqZWN0IG9mIHRoaXMgZmlsZS4gIEVmZmljaWVuY3kgaGVyZSBpcyBkZWZpbmVkIGFzCisgKiBtaW5pbXVtIGNvZGUgc2l6ZSB3aXRoIG1pbmltdW0gcmVnaXN0ZXIgdXNhZ2UgZm9yIHRoZSBjb21tb24gY2FzZXMuCisgKiBJdCBpcyBjdXJyZW50bHkgbm90IGJlbGlldmVkIHRoYXQgbG9uZyBsb25ncyBhcmUgY29tbW9uLCBzbyB3ZQorICogdHJhZGUgZWZmaWNpZW5jeSBmb3IgdGhlIGNoYXJzLCBzaG9ydHMgYW5kIGxvbmdzIGFnYWluc3QgdGhlIGxvbmcKKyAqIGxvbmdzLgorICoKKyAqIEN1cnJlbnQgc3RhdHMgd2l0aCBnY2MgMi43LjIuMiBmb3IgdGhlc2UgZnVuY3Rpb25zOgorICoKKyAqCXB0cnNpemUJZ2V0Ogljb2RlCXJlZ3MJcHV0Ogljb2RlCXJlZ3MKKyAqCTEJCTEJMQkJMQkyCisgKgkyCQkzCTIJCTMJMgorICoJNAkJNwkzCQk3CTMKKyAqCTgJCTIwCTYJCTE2CTYKKyAqCisgKiBnY2MgMi45NS4xIHNlZW1zIHRvIGNvZGUgZGlmZmVyZW50bHk6CisgKgorICoJcHRyc2l6ZQlnZXQ6CWNvZGUJcmVncwlwdXQ6CWNvZGUJcmVncworICoJMQkJMQkxCQkxCTIKKyAqCTIJCTMJMgkJMwkyCisgKgk0CQk3CTQJCTcJNAorICoJOAkJMTkJOAkJMTUJNgorICoKKyAqIHdoaWNoIG1heSBvciBtYXkgbm90IGJlIG1vcmUgZWZmaWNpZW50IChkZXBlbmRpbmcgdXBvbiB3aGV0aGVyCisgKiB5b3UgY2FuIGFmZm9yZCB0aGUgZXh0cmEgcmVnaXN0ZXJzKS4gIEhvcGVmdWxseSB0aGUgZ2NjIDIuOTUKKyAqIGlzIGludGVsaWdlbnQgZW5vdWdoIHRvIGRlY2lkZSBpZiBpdCBpcyBiZXR0ZXIgdG8gdXNlIHRoZQorICogZXh0cmEgcmVnaXN0ZXIsIGJ1dCBldmlkZW5jZSBzbyBmYXIgc2VlbXMgdG8gc3VnZ2VzdCBvdGhlcndpc2UuCisgKgorICogVW5mb3J0dW5hdGVseSwgZ2NjIGlzIG5vdCBhYmxlIHRvIG9wdGltaXNlIHRoZSBoaWdoIHdvcmQKKyAqIG91dCBvZiBsb25nIGxvbmcgPj4gMzIsIG9yIHRoZSBsb3cgd29yZCBmcm9tIGxvbmcgbG9uZyA8PCAzMgorICovCisKKyNkZWZpbmUgX19nZXRfdW5hbGlnbmVkXzIoX19wKQkJCQkJXAorCShfX3BbMF0gfCBfX3BbMV0gPDwgOCkKKworI2RlZmluZSBfX2dldF91bmFsaWduZWRfNChfX3ApCQkJCQlcCisJKF9fcFswXSB8IF9fcFsxXSA8PCA4IHwgX19wWzJdIDw8IDE2IHwgX19wWzNdIDw8IDI0KQorCisjZGVmaW5lIGdldF91bmFsaWduZWQocHRyKQkJCQkJXAorKHsJCQkJCQkJCVwKKwl1bnNpZ25lZCBpbnQgX192MSwgX192MjsJCQkJXAorCV9fdHlwZW9mX18oKihwdHIpKSBfX3Y7CQkJCQlcCisJX191OCAqX19wID0gKF9fdTggKikocHRyKTsJCQkJXAorCQkJCQkJCQlcCisJc3dpdGNoIChzaXplb2YoKihwdHIpKSkgewkJCQlcCisJY2FzZSAxOglfX3YgPSAqKHB0cik7CQkJYnJlYWs7CQlcCisJY2FzZSAyOiBfX3YgPSBfX2dldF91bmFsaWduZWRfMihfX3ApOwlicmVhazsJCVwKKwljYXNlIDQ6IF9fdiA9IF9fZ2V0X3VuYWxpZ25lZF80KF9fcCk7CWJyZWFrOwkJXAorCWNhc2UgODoJCQkJCQkJXAorCQlfX3YyID0gX19nZXRfdW5hbGlnbmVkXzQoKF9fcCs0KSk7CQlcCisJCV9fdjEgPSBfX2dldF91bmFsaWduZWRfNChfX3ApOwkJCVwKKwkJX192ID0gKCh1bnNpZ25lZCBsb25nIGxvbmcpX192MiA8PCAzMiB8IF9fdjEpOwlcCisJCWJyZWFrOwkJCQkJCVwKKwlkZWZhdWx0OiBfX3YgPSBfX2J1Z191bmFsaWduZWRfeChfX3ApOwlicmVhazsJCVwKKwl9CQkJCQkJCVwKKwlfX3Y7CQkJCQkJCVwKK30pCisKKworc3RhdGljIGlubGluZSB2b2lkIF9fcHV0X3VuYWxpZ25lZF8yKF9fdTMyIF9fdiwgcmVnaXN0ZXIgX191OCAqX19wKQoreworCSpfX3ArKyA9IF9fdjsKKwkqX19wKysgPSBfX3YgPj4gODsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fcHV0X3VuYWxpZ25lZF80KF9fdTMyIF9fdiwgcmVnaXN0ZXIgX191OCAqX19wKQoreworCV9fcHV0X3VuYWxpZ25lZF8yKF9fdiA+PiAxNiwgX19wICsgMik7CisJX19wdXRfdW5hbGlnbmVkXzIoX192LCBfX3ApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19wdXRfdW5hbGlnbmVkXzgoY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIF9fdiwgX191OCAqX19wKQoreworCS8qCisJICogdHJhZGVvZmY6IDggYnl0ZXMgb2Ygc3RhY2sgZm9yIGFsbCB1bmFsaWduZWQgcHV0cyAoMgorCSAqIGluc3RydWN0aW9ucyksIG9yIGFuIGV4dHJhIHJlZ2lzdGVyIGluIHRoZSBsb25nIGxvbmcKKwkgKiBjYXNlIC0gZ28gZm9yIHRoZSBleHRyYSByZWdpc3Rlci4KKwkgKi8KKwlfX3B1dF91bmFsaWduZWRfNChfX3YgPj4gMzIsIF9fcCArIDQpOworCV9fcHV0X3VuYWxpZ25lZF80KF9fdiwgX19wKTsKK30KKworLyoKKyAqIFRyeSB0byBzdG9yZSBhbiB1bmFsaWduZWQgdmFsdWUgYXMgZWZmaWNpZW50bHkgYXMgcG9zc2libGUuCisgKi8KKyNkZWZpbmUgcHV0X3VuYWxpZ25lZCh2YWwsIHB0cikJCQkJCQlcCisJKHsJCQkJCQkJCVwKKwkJc3dpdGNoIChzaXplb2YoKihwdHIpKSkgewkJCQlcCisJCWNhc2UgMToJCQkJCQkJXAorCQkJKihwdHIpID0gKHZhbCk7CQkJCQlcCisJCQlicmVhazsJCQkJCQlcCisJCWNhc2UgMjoJCQkJCQkJXAorCQkJX19wdXRfdW5hbGlnbmVkXzIoKHZhbCksIChfX3U4ICopKHB0cikpOwlcCisJCQlicmVhazsJCQkJCQlcCisJCWNhc2UgNDoJCQkJCQkJXAorCQkJX19wdXRfdW5hbGlnbmVkXzQoKHZhbCksIChfX3U4ICopKHB0cikpOwlcCisJCQlicmVhazsJCQkJCQlcCisJCWNhc2UgODoJCQkJCQkJXAorCQkJX19wdXRfdW5hbGlnbmVkXzgoKHZhbCksIChfX3U4ICopKHB0cikpOwlcCisJCQlicmVhazsJCQkJCQlcCisJCWRlZmF1bHQ6CQkJCQkJXAorCQkJX19idWdfdW5hbGlnbmVkX3gocHRyKTsJCQkJXAorCQkJYnJlYWs7CQkJCQkJXAorCQl9CQkJCQkJCVwKKwkJKHZvaWQpIDA7CQkJCQkJXAorCX0pCisKKworI2Vsc2UKKworI2RlZmluZSBnZXRfdW5hbGlnbmVkKHB0cikgKCoocHRyKSkKKyNkZWZpbmUgcHV0X3VuYWxpZ25lZCh2YWwsIHB0cikgKHsgKihwdHIpID0gKHZhbCk7ICh2b2lkKSAwOyB9KQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC91bmlzdGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzIxYWE5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC91bmlzdGQuaApAQCAtMCwwICsxLDM4NCBAQAorLyogTU4xMDMwMCBTeXN0ZW0gY2FsbCBudW1iZXIgbGlzdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBfQVNNX1VOSVNURF9ICisjZGVmaW5lIF9BU01fVU5JU1REX0gKKworI2RlZmluZSBfX05SX3Jlc3RhcnRfc3lzY2FsbCAgICAgIDAKKyNkZWZpbmUgX19OUl9leGl0CQkgIDEKKyNkZWZpbmUgX19OUl9mb3JrCQkgIDIKKyNkZWZpbmUgX19OUl9yZWFkCQkgIDMKKyNkZWZpbmUgX19OUl93cml0ZQkJICA0CisjZGVmaW5lIF9fTlJfb3BlbgkJICA1CisjZGVmaW5lIF9fTlJfY2xvc2UJCSAgNgorI2RlZmluZSBfX05SX3dhaXRwaWQJCSAgNworI2RlZmluZSBfX05SX2NyZWF0CQkgIDgKKyNkZWZpbmUgX19OUl9saW5rCQkgIDkKKyNkZWZpbmUgX19OUl91bmxpbmsJCSAxMAorI2RlZmluZSBfX05SX2V4ZWN2ZQkJIDExCisjZGVmaW5lIF9fTlJfY2hkaXIJCSAxMgorI2RlZmluZSBfX05SX3RpbWUJCSAxMworI2RlZmluZSBfX05SX21rbm9kCQkgMTQKKyNkZWZpbmUgX19OUl9jaG1vZAkJIDE1CisjZGVmaW5lIF9fTlJfbGNob3duCQkgMTYKKyNkZWZpbmUgX19OUl9icmVhawkJIDE3CisjZGVmaW5lIF9fTlJfb2xkc3RhdAkJIDE4CisjZGVmaW5lIF9fTlJfbHNlZWsJCSAxOQorI2RlZmluZSBfX05SX2dldHBpZAkJIDIwCisjZGVmaW5lIF9fTlJfbW91bnQJCSAyMQorI2RlZmluZSBfX05SX3Vtb3VudAkJIDIyCisjZGVmaW5lIF9fTlJfc2V0dWlkCQkgMjMKKyNkZWZpbmUgX19OUl9nZXR1aWQJCSAyNAorI2RlZmluZSBfX05SX3N0aW1lCQkgMjUKKyNkZWZpbmUgX19OUl9wdHJhY2UJCSAyNgorI2RlZmluZSBfX05SX2FsYXJtCQkgMjcKKyNkZWZpbmUgX19OUl9vbGRmc3RhdAkJIDI4CisjZGVmaW5lIF9fTlJfcGF1c2UJCSAyOQorI2RlZmluZSBfX05SX3V0aW1lCQkgMzAKKyNkZWZpbmUgX19OUl9zdHR5CQkgMzEKKyNkZWZpbmUgX19OUl9ndHR5CQkgMzIKKyNkZWZpbmUgX19OUl9hY2Nlc3MJCSAzMworI2RlZmluZSBfX05SX25pY2UJCSAzNAorI2RlZmluZSBfX05SX2Z0aW1lCQkgMzUKKyNkZWZpbmUgX19OUl9zeW5jCQkgMzYKKyNkZWZpbmUgX19OUl9raWxsCQkgMzcKKyNkZWZpbmUgX19OUl9yZW5hbWUJCSAzOAorI2RlZmluZSBfX05SX21rZGlyCQkgMzkKKyNkZWZpbmUgX19OUl9ybWRpcgkJIDQwCisjZGVmaW5lIF9fTlJfZHVwCQkgNDEKKyNkZWZpbmUgX19OUl9waXBlCQkgNDIKKyNkZWZpbmUgX19OUl90aW1lcwkJIDQzCisjZGVmaW5lIF9fTlJfcHJvZgkJIDQ0CisjZGVmaW5lIF9fTlJfYnJrCQkgNDUKKyNkZWZpbmUgX19OUl9zZXRnaWQJCSA0NgorI2RlZmluZSBfX05SX2dldGdpZAkJIDQ3CisjZGVmaW5lIF9fTlJfc2lnbmFsCQkgNDgKKyNkZWZpbmUgX19OUl9nZXRldWlkCQkgNDkKKyNkZWZpbmUgX19OUl9nZXRlZ2lkCQkgNTAKKyNkZWZpbmUgX19OUl9hY2N0CQkgNTEKKyNkZWZpbmUgX19OUl91bW91bnQyCQkgNTIKKyNkZWZpbmUgX19OUl9sb2NrCQkgNTMKKyNkZWZpbmUgX19OUl9pb2N0bAkJIDU0CisjZGVmaW5lIF9fTlJfZmNudGwJCSA1NQorI2RlZmluZSBfX05SX21weAkJIDU2CisjZGVmaW5lIF9fTlJfc2V0cGdpZAkJIDU3CisjZGVmaW5lIF9fTlJfdWxpbWl0CQkgNTgKKyNkZWZpbmUgX19OUl9vbGRvbGR1bmFtZQkgNTkKKyNkZWZpbmUgX19OUl91bWFzawkJIDYwCisjZGVmaW5lIF9fTlJfY2hyb290CQkgNjEKKyNkZWZpbmUgX19OUl91c3RhdAkJIDYyCisjZGVmaW5lIF9fTlJfZHVwMgkJIDYzCisjZGVmaW5lIF9fTlJfZ2V0cHBpZAkJIDY0CisjZGVmaW5lIF9fTlJfZ2V0cGdycAkJIDY1CisjZGVmaW5lIF9fTlJfc2V0c2lkCQkgNjYKKyNkZWZpbmUgX19OUl9zaWdhY3Rpb24JCSA2NworI2RlZmluZSBfX05SX3NnZXRtYXNrCQkgNjgKKyNkZWZpbmUgX19OUl9zc2V0bWFzawkJIDY5CisjZGVmaW5lIF9fTlJfc2V0cmV1aWQJCSA3MAorI2RlZmluZSBfX05SX3NldHJlZ2lkCQkgNzEKKyNkZWZpbmUgX19OUl9zaWdzdXNwZW5kCQkgNzIKKyNkZWZpbmUgX19OUl9zaWdwZW5kaW5nCQkgNzMKKyNkZWZpbmUgX19OUl9zZXRob3N0bmFtZQkgNzQKKyNkZWZpbmUgX19OUl9zZXRybGltaXQJCSA3NQorI2RlZmluZSBfX05SX2dldHJsaW1pdAkJIDc2CS8qIEJhY2sgY29tcGF0aWJsZSAyR2lnIGxpbWl0ZWQgcmxpbWl0ICovCisjZGVmaW5lIF9fTlJfZ2V0cnVzYWdlCQkgNzcKKyNkZWZpbmUgX19OUl9nZXR0aW1lb2ZkYXkJIDc4CisjZGVmaW5lIF9fTlJfc2V0dGltZW9mZGF5CSA3OQorI2RlZmluZSBfX05SX2dldGdyb3VwcwkJIDgwCisjZGVmaW5lIF9fTlJfc2V0Z3JvdXBzCQkgODEKKyNkZWZpbmUgX19OUl9zZWxlY3QJCSA4MgorI2RlZmluZSBfX05SX3N5bWxpbmsJCSA4MworI2RlZmluZSBfX05SX29sZGxzdGF0CQkgODQKKyNkZWZpbmUgX19OUl9yZWFkbGluawkJIDg1CisjZGVmaW5lIF9fTlJfdXNlbGliCQkgODYKKyNkZWZpbmUgX19OUl9zd2Fwb24JCSA4NworI2RlZmluZSBfX05SX3JlYm9vdAkJIDg4CisjZGVmaW5lIF9fTlJfcmVhZGRpcgkJIDg5CisjZGVmaW5lIF9fTlJfbW1hcAkJIDkwCisjZGVmaW5lIF9fTlJfbXVubWFwCQkgOTEKKyNkZWZpbmUgX19OUl90cnVuY2F0ZQkJIDkyCisjZGVmaW5lIF9fTlJfZnRydW5jYXRlCQkgOTMKKyNkZWZpbmUgX19OUl9mY2htb2QJCSA5NAorI2RlZmluZSBfX05SX2ZjaG93bgkJIDk1CisjZGVmaW5lIF9fTlJfZ2V0cHJpb3JpdHkJIDk2CisjZGVmaW5lIF9fTlJfc2V0cHJpb3JpdHkJIDk3CisjZGVmaW5lIF9fTlJfcHJvZmlsCQkgOTgKKyNkZWZpbmUgX19OUl9zdGF0ZnMJCSA5OQorI2RlZmluZSBfX05SX2ZzdGF0ZnMJCTEwMAorI2RlZmluZSBfX05SX2lvcGVybQkJMTAxCisjZGVmaW5lIF9fTlJfc29ja2V0Y2FsbAkJMTAyCisjZGVmaW5lIF9fTlJfc3lzbG9nCQkxMDMKKyNkZWZpbmUgX19OUl9zZXRpdGltZXIJCTEwNAorI2RlZmluZSBfX05SX2dldGl0aW1lcgkJMTA1CisjZGVmaW5lIF9fTlJfc3RhdAkJMTA2CisjZGVmaW5lIF9fTlJfbHN0YXQJCTEwNworI2RlZmluZSBfX05SX2ZzdGF0CQkxMDgKKyNkZWZpbmUgX19OUl9vbGR1bmFtZQkJMTA5CisjZGVmaW5lIF9fTlJfaW9wbAkJMTEwCisjZGVmaW5lIF9fTlJfdmhhbmd1cAkJMTExCisjZGVmaW5lIF9fTlJfaWRsZQkJMTEyCisjZGVmaW5lIF9fTlJfdm04Nm9sZAkJMTEzCisjZGVmaW5lIF9fTlJfd2FpdDQJCTExNAorI2RlZmluZSBfX05SX3N3YXBvZmYJCTExNQorI2RlZmluZSBfX05SX3N5c2luZm8JCTExNgorI2RlZmluZSBfX05SX2lwYwkJMTE3CisjZGVmaW5lIF9fTlJfZnN5bmMJCTExOAorI2RlZmluZSBfX05SX3NpZ3JldHVybgkJMTE5CisjZGVmaW5lIF9fTlJfY2xvbmUJCTEyMAorI2RlZmluZSBfX05SX3NldGRvbWFpbm5hbWUJMTIxCisjZGVmaW5lIF9fTlJfdW5hbWUJCTEyMgorI2RlZmluZSBfX05SX21vZGlmeV9sZHQJCTEyMworI2RlZmluZSBfX05SX2FkanRpbWV4CQkxMjQKKyNkZWZpbmUgX19OUl9tcHJvdGVjdAkJMTI1CisjZGVmaW5lIF9fTlJfc2lncHJvY21hc2sJMTI2CisjZGVmaW5lIF9fTlJfY3JlYXRlX21vZHVsZQkxMjcKKyNkZWZpbmUgX19OUl9pbml0X21vZHVsZQkxMjgKKyNkZWZpbmUgX19OUl9kZWxldGVfbW9kdWxlCTEyOQorI2RlZmluZSBfX05SX2dldF9rZXJuZWxfc3ltcwkxMzAKKyNkZWZpbmUgX19OUl9xdW90YWN0bAkJMTMxCisjZGVmaW5lIF9fTlJfZ2V0cGdpZAkJMTMyCisjZGVmaW5lIF9fTlJfZmNoZGlyCQkxMzMKKyNkZWZpbmUgX19OUl9iZGZsdXNoCQkxMzQKKyNkZWZpbmUgX19OUl9zeXNmcwkJMTM1CisjZGVmaW5lIF9fTlJfcGVyc29uYWxpdHkJMTM2CisjZGVmaW5lIF9fTlJfYWZzX3N5c2NhbGwJMTM3IC8qIFN5c2NhbGwgZm9yIEFuZHJldyBGaWxlIFN5c3RlbSAqLworI2RlZmluZSBfX05SX3NldGZzdWlkCQkxMzgKKyNkZWZpbmUgX19OUl9zZXRmc2dpZAkJMTM5CisjZGVmaW5lIF9fTlJfX2xsc2VlawkJMTQwCisjZGVmaW5lIF9fTlJfZ2V0ZGVudHMJCTE0MQorI2RlZmluZSBfX05SX19uZXdzZWxlY3QJCTE0MgorI2RlZmluZSBfX05SX2Zsb2NrCQkxNDMKKyNkZWZpbmUgX19OUl9tc3luYwkJMTQ0CisjZGVmaW5lIF9fTlJfcmVhZHYJCTE0NQorI2RlZmluZSBfX05SX3dyaXRldgkJMTQ2CisjZGVmaW5lIF9fTlJfZ2V0c2lkCQkxNDcKKyNkZWZpbmUgX19OUl9mZGF0YXN5bmMJCTE0OAorI2RlZmluZSBfX05SX19zeXNjdGwJCTE0OQorI2RlZmluZSBfX05SX21sb2NrCQkxNTAKKyNkZWZpbmUgX19OUl9tdW5sb2NrCQkxNTEKKyNkZWZpbmUgX19OUl9tbG9ja2FsbAkJMTUyCisjZGVmaW5lIF9fTlJfbXVubG9ja2FsbAkJMTUzCisjZGVmaW5lIF9fTlJfc2NoZWRfc2V0cGFyYW0JCTE1NAorI2RlZmluZSBfX05SX3NjaGVkX2dldHBhcmFtCQkxNTUKKyNkZWZpbmUgX19OUl9zY2hlZF9zZXRzY2hlZHVsZXIJCTE1NgorI2RlZmluZSBfX05SX3NjaGVkX2dldHNjaGVkdWxlcgkJMTU3CisjZGVmaW5lIF9fTlJfc2NoZWRfeWllbGQJCTE1OAorI2RlZmluZSBfX05SX3NjaGVkX2dldF9wcmlvcml0eV9tYXgJMTU5CisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbgkxNjAKKyNkZWZpbmUgX19OUl9zY2hlZF9ycl9nZXRfaW50ZXJ2YWwJMTYxCisjZGVmaW5lIF9fTlJfbmFub3NsZWVwCQkxNjIKKyNkZWZpbmUgX19OUl9tcmVtYXAJCTE2MworI2RlZmluZSBfX05SX3NldHJlc3VpZAkJMTY0CisjZGVmaW5lIF9fTlJfZ2V0cmVzdWlkCQkxNjUKKyNkZWZpbmUgX19OUl92bTg2CQkxNjYKKyNkZWZpbmUgX19OUl9xdWVyeV9tb2R1bGUJMTY3CisjZGVmaW5lIF9fTlJfcG9sbAkJMTY4CisjZGVmaW5lIF9fTlJfbmZzc2VydmN0bAkJMTY5CisjZGVmaW5lIF9fTlJfc2V0cmVzZ2lkCQkxNzAKKyNkZWZpbmUgX19OUl9nZXRyZXNnaWQJCTE3MQorI2RlZmluZSBfX05SX3ByY3RsICAgICAgICAgICAgICAxNzIKKyNkZWZpbmUgX19OUl9ydF9zaWdyZXR1cm4JMTczCisjZGVmaW5lIF9fTlJfcnRfc2lnYWN0aW9uCTE3NAorI2RlZmluZSBfX05SX3J0X3NpZ3Byb2NtYXNrCTE3NQorI2RlZmluZSBfX05SX3J0X3NpZ3BlbmRpbmcJMTc2CisjZGVmaW5lIF9fTlJfcnRfc2lndGltZWR3YWl0CTE3NworI2RlZmluZSBfX05SX3J0X3NpZ3F1ZXVlaW5mbwkxNzgKKyNkZWZpbmUgX19OUl9ydF9zaWdzdXNwZW5kCTE3OQorI2RlZmluZSBfX05SX3ByZWFkNjQJCTE4MAorI2RlZmluZSBfX05SX3B3cml0ZTY0CQkxODEKKyNkZWZpbmUgX19OUl9jaG93bgkJMTgyCisjZGVmaW5lIF9fTlJfZ2V0Y3dkCQkxODMKKyNkZWZpbmUgX19OUl9jYXBnZXQJCTE4NAorI2RlZmluZSBfX05SX2NhcHNldAkJMTg1CisjZGVmaW5lIF9fTlJfc2lnYWx0c3RhY2sJMTg2CisjZGVmaW5lIF9fTlJfc2VuZGZpbGUJCTE4NworI2RlZmluZSBfX05SX2dldHBtc2cJCTE4OAkvKiBzb21lIHBlb3BsZSBhY3R1YWxseSB3YW50IHN0cmVhbXMgKi8KKyNkZWZpbmUgX19OUl9wdXRwbXNnCQkxODkJLyogc29tZSBwZW9wbGUgYWN0dWFsbHkgd2FudCBzdHJlYW1zICovCisjZGVmaW5lIF9fTlJfdmZvcmsJCTE5MAorI2RlZmluZSBfX05SX3VnZXRybGltaXQJCTE5MQkvKiBTdVMgY29tcGxpYW50IGdldHJsaW1pdCAqLworI2RlZmluZSBfX05SX21tYXAyCQkxOTIKKyNkZWZpbmUgX19OUl90cnVuY2F0ZTY0CQkxOTMKKyNkZWZpbmUgX19OUl9mdHJ1bmNhdGU2NAkxOTQKKyNkZWZpbmUgX19OUl9zdGF0NjQJCTE5NQorI2RlZmluZSBfX05SX2xzdGF0NjQJCTE5NgorI2RlZmluZSBfX05SX2ZzdGF0NjQJCTE5NworI2RlZmluZSBfX05SX2xjaG93bjMyCQkxOTgKKyNkZWZpbmUgX19OUl9nZXR1aWQzMgkJMTk5CisjZGVmaW5lIF9fTlJfZ2V0Z2lkMzIJCTIwMAorI2RlZmluZSBfX05SX2dldGV1aWQzMgkJMjAxCisjZGVmaW5lIF9fTlJfZ2V0ZWdpZDMyCQkyMDIKKyNkZWZpbmUgX19OUl9zZXRyZXVpZDMyCQkyMDMKKyNkZWZpbmUgX19OUl9zZXRyZWdpZDMyCQkyMDQKKyNkZWZpbmUgX19OUl9nZXRncm91cHMzMgkyMDUKKyNkZWZpbmUgX19OUl9zZXRncm91cHMzMgkyMDYKKyNkZWZpbmUgX19OUl9mY2hvd24zMgkJMjA3CisjZGVmaW5lIF9fTlJfc2V0cmVzdWlkMzIJMjA4CisjZGVmaW5lIF9fTlJfZ2V0cmVzdWlkMzIJMjA5CisjZGVmaW5lIF9fTlJfc2V0cmVzZ2lkMzIJMjEwCisjZGVmaW5lIF9fTlJfZ2V0cmVzZ2lkMzIJMjExCisjZGVmaW5lIF9fTlJfY2hvd24zMgkJMjEyCisjZGVmaW5lIF9fTlJfc2V0dWlkMzIJCTIxMworI2RlZmluZSBfX05SX3NldGdpZDMyCQkyMTQKKyNkZWZpbmUgX19OUl9zZXRmc3VpZDMyCQkyMTUKKyNkZWZpbmUgX19OUl9zZXRmc2dpZDMyCQkyMTYKKyNkZWZpbmUgX19OUl9waXZvdF9yb290CQkyMTcKKyNkZWZpbmUgX19OUl9taW5jb3JlCQkyMTgKKyNkZWZpbmUgX19OUl9tYWR2aXNlCQkyMTkKKyNkZWZpbmUgX19OUl9tYWR2aXNlMQkJMjE5CS8qIGRlbGV0ZSB3aGVuIEMgbGliIHN0dWIgaXMgcmVtb3ZlZCAqLworI2RlZmluZSBfX05SX2dldGRlbnRzNjQJCTIyMAorI2RlZmluZSBfX05SX2ZjbnRsNjQJCTIyMQorLyogMjIzIGlzIHVudXNlZCAqLworI2RlZmluZSBfX05SX2dldHRpZAkJMjI0CisjZGVmaW5lIF9fTlJfcmVhZGFoZWFkCQkyMjUKKyNkZWZpbmUgX19OUl9zZXR4YXR0cgkJMjI2CisjZGVmaW5lIF9fTlJfbHNldHhhdHRyCQkyMjcKKyNkZWZpbmUgX19OUl9mc2V0eGF0dHIJCTIyOAorI2RlZmluZSBfX05SX2dldHhhdHRyCQkyMjkKKyNkZWZpbmUgX19OUl9sZ2V0eGF0dHIJCTIzMAorI2RlZmluZSBfX05SX2ZnZXR4YXR0cgkJMjMxCisjZGVmaW5lIF9fTlJfbGlzdHhhdHRyCQkyMzIKKyNkZWZpbmUgX19OUl9sbGlzdHhhdHRyCQkyMzMKKyNkZWZpbmUgX19OUl9mbGlzdHhhdHRyCQkyMzQKKyNkZWZpbmUgX19OUl9yZW1vdmV4YXR0cgkyMzUKKyNkZWZpbmUgX19OUl9scmVtb3ZleGF0dHIJMjM2CisjZGVmaW5lIF9fTlJfZnJlbW92ZXhhdHRyCTIzNworI2RlZmluZSBfX05SX3RraWxsCQkyMzgKKyNkZWZpbmUgX19OUl9zZW5kZmlsZTY0CQkyMzkKKyNkZWZpbmUgX19OUl9mdXRleAkJMjQwCisjZGVmaW5lIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkJMjQxCisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkJMjQyCisjZGVmaW5lIF9fTlJfc2V0X3RocmVhZF9hcmVhCTI0MworI2RlZmluZSBfX05SX2dldF90aHJlYWRfYXJlYQkyNDQKKyNkZWZpbmUgX19OUl9pb19zZXR1cAkJMjQ1CisjZGVmaW5lIF9fTlJfaW9fZGVzdHJveQkJMjQ2CisjZGVmaW5lIF9fTlJfaW9fZ2V0ZXZlbnRzCTI0NworI2RlZmluZSBfX05SX2lvX3N1Ym1pdAkJMjQ4CisjZGVmaW5lIF9fTlJfaW9fY2FuY2VsCQkyNDkKKyNkZWZpbmUgX19OUl9mYWR2aXNlNjQJCTI1MAorCisjZGVmaW5lIF9fTlJfZXhpdF9ncm91cAkJMjUyCisjZGVmaW5lIF9fTlJfbG9va3VwX2Rjb29raWUJMjUzCisjZGVmaW5lIF9fTlJfZXBvbGxfY3JlYXRlCTI1NAorI2RlZmluZSBfX05SX2Vwb2xsX2N0bAkJMjU1CisjZGVmaW5lIF9fTlJfZXBvbGxfd2FpdAkJMjU2CisjZGVmaW5lIF9fTlJfcmVtYXBfZmlsZV9wYWdlcwkyNTcKKyNkZWZpbmUgX19OUl9zZXRfdGlkX2FkZHJlc3MJMjU4CisjZGVmaW5lIF9fTlJfdGltZXJfY3JlYXRlCTI1OQorI2RlZmluZSBfX05SX3RpbWVyX3NldHRpbWUJKF9fTlJfdGltZXJfY3JlYXRlKzEpCisjZGVmaW5lIF9fTlJfdGltZXJfZ2V0dGltZQkoX19OUl90aW1lcl9jcmVhdGUrMikKKyNkZWZpbmUgX19OUl90aW1lcl9nZXRvdmVycnVuCShfX05SX3RpbWVyX2NyZWF0ZSszKQorI2RlZmluZSBfX05SX3RpbWVyX2RlbGV0ZQkoX19OUl90aW1lcl9jcmVhdGUrNCkKKyNkZWZpbmUgX19OUl9jbG9ja19zZXR0aW1lCShfX05SX3RpbWVyX2NyZWF0ZSs1KQorI2RlZmluZSBfX05SX2Nsb2NrX2dldHRpbWUJKF9fTlJfdGltZXJfY3JlYXRlKzYpCisjZGVmaW5lIF9fTlJfY2xvY2tfZ2V0cmVzCShfX05SX3RpbWVyX2NyZWF0ZSs3KQorI2RlZmluZSBfX05SX2Nsb2NrX25hbm9zbGVlcAkoX19OUl90aW1lcl9jcmVhdGUrOCkKKyNkZWZpbmUgX19OUl9zdGF0ZnM2NAkJMjY4CisjZGVmaW5lIF9fTlJfZnN0YXRmczY0CQkyNjkKKyNkZWZpbmUgX19OUl90Z2tpbGwJCTI3MAorI2RlZmluZSBfX05SX3V0aW1lcwkJMjcxCisjZGVmaW5lIF9fTlJfZmFkdmlzZTY0XzY0CTI3MgorI2RlZmluZSBfX05SX3ZzZXJ2ZXIJCTI3MworI2RlZmluZSBfX05SX21iaW5kCQkyNzQKKyNkZWZpbmUgX19OUl9nZXRfbWVtcG9saWN5CTI3NQorI2RlZmluZSBfX05SX3NldF9tZW1wb2xpY3kJMjc2CisjZGVmaW5lIF9fTlJfbXFfb3BlbiAJCTI3NworI2RlZmluZSBfX05SX21xX3VubGluawkJKF9fTlJfbXFfb3BlbisxKQorI2RlZmluZSBfX05SX21xX3RpbWVkc2VuZAkoX19OUl9tcV9vcGVuKzIpCisjZGVmaW5lIF9fTlJfbXFfdGltZWRyZWNlaXZlCShfX05SX21xX29wZW4rMykKKyNkZWZpbmUgX19OUl9tcV9ub3RpZnkJCShfX05SX21xX29wZW4rNCkKKyNkZWZpbmUgX19OUl9tcV9nZXRzZXRhdHRyCShfX05SX21xX29wZW4rNSkKKyNkZWZpbmUgX19OUl9rZXhlY19sb2FkCQkyODMKKyNkZWZpbmUgX19OUl93YWl0aWQJCTI4NAorI2RlZmluZSBfX05SX2FkZF9rZXkJCTI4NgorI2RlZmluZSBfX05SX3JlcXVlc3Rfa2V5CTI4NworI2RlZmluZSBfX05SX2tleWN0bAkJMjg4CisjZGVmaW5lIF9fTlJfY2FjaGVmbHVzaAkJMjg5CisjZGVmaW5lIF9fTlJfaW9wcmlvX3NldAkJMjkwCisjZGVmaW5lIF9fTlJfaW9wcmlvX2dldAkJMjkxCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9pbml0CTI5MgorI2RlZmluZSBfX05SX2lub3RpZnlfYWRkX3dhdGNoCTI5MworI2RlZmluZSBfX05SX2lub3RpZnlfcm1fd2F0Y2gJMjk0CisjZGVmaW5lIF9fTlJfbWlncmF0ZV9wYWdlcwkyOTUKKyNkZWZpbmUgX19OUl9vcGVuYXQJCTI5NgorI2RlZmluZSBfX05SX21rZGlyYXQJCTI5NworI2RlZmluZSBfX05SX21rbm9kYXQJCTI5OAorI2RlZmluZSBfX05SX2ZjaG93bmF0CQkyOTkKKyNkZWZpbmUgX19OUl9mdXRpbWVzYXQJCTMwMAorI2RlZmluZSBfX05SX2ZzdGF0YXQ2NAkJMzAxCisjZGVmaW5lIF9fTlJfdW5saW5rYXQJCTMwMgorI2RlZmluZSBfX05SX3JlbmFtZWF0CQkzMDMKKyNkZWZpbmUgX19OUl9saW5rYXQJCTMwNAorI2RlZmluZSBfX05SX3N5bWxpbmthdAkJMzA1CisjZGVmaW5lIF9fTlJfcmVhZGxpbmthdAkJMzA2CisjZGVmaW5lIF9fTlJfZmNobW9kYXQJCTMwNworI2RlZmluZSBfX05SX2ZhY2Nlc3NhdAkJMzA4CisjZGVmaW5lIF9fTlJfcHNlbGVjdDYJCTMwOQorI2RlZmluZSBfX05SX3Bwb2xsCQkzMTAKKyNkZWZpbmUgX19OUl91bnNoYXJlCQkzMTEKKyNkZWZpbmUgX19OUl9zZXRfcm9idXN0X2xpc3QJMzEyCisjZGVmaW5lIF9fTlJfZ2V0X3JvYnVzdF9saXN0CTMxMworI2RlZmluZSBfX05SX3NwbGljZQkJMzE0CisjZGVmaW5lIF9fTlJfc3luY19maWxlX3JhbmdlCTMxNQorI2RlZmluZSBfX05SX3RlZQkJMzE2CisjZGVmaW5lIF9fTlJfdm1zcGxpY2UJCTMxNworI2RlZmluZSBfX05SX21vdmVfcGFnZXMJCTMxOAorI2RlZmluZSBfX05SX2dldGNwdQkJMzE5CisjZGVmaW5lIF9fTlJfZXBvbGxfcHdhaXQJMzIwCisjZGVmaW5lIF9fTlJfdXRpbWVuc2F0CQkzMjEKKyNkZWZpbmUgX19OUl9zaWduYWxmZAkJMzIyCisjZGVmaW5lIF9fTlJfdGltZXJmZF9jcmVhdGUJMzIzCisjZGVmaW5lIF9fTlJfZXZlbnRmZAkJMzI0CisjZGVmaW5lIF9fTlJfZmFsbG9jYXRlCQkzMjUKKyNkZWZpbmUgX19OUl90aW1lcmZkX3NldHRpbWUJMzI2CisjZGVmaW5lIF9fTlJfdGltZXJmZF9nZXR0aW1lCTMyNworCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIE5SX3N5c2NhbGxzIDMyNgorCisvKgorICogc3BlY2lmeSB0aGUgZGVwcmVjYXRlZCBzeXNjYWxscyB3ZSB3YW50IHRvIHN1cHBvcnQgb24gdGhpcyBhcmNoCisgKi8KKyNkZWZpbmUgX19BUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KKyNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1JFQURESVIKKyNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1NUQVQKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1RBVDY0CisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19BTEFSTQorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfR0VUSE9TVE5BTUUKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1BBVVNFCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TR0VUTUFTSworI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0lHTkFMCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19USU1FCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19VVElNRQorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfV0FJVFBJRAorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU09DS0VUQ0FMTAorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfRkFEVklTRTY0CisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19HRVRQR1JQCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19MTFNFRUsKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX05JQ0UKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX09MRF9HRVRSTElNSVQKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX09MRFVNT1VOVAorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0lHUEVORElORworI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfU0lHUFJPQ01BU0sKKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1JUX1NJR0FDVElPTgorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfUlRfU0lHU1VTUEVORAorCisvKgorICogIkNvbmRpdGlvbmFsIiBzeXNjYWxscworICoKKyAqIFdoYXQgd2Ugd2FudCBpcyBfX2F0dHJpYnV0ZV9fKCh3ZWFrLGFsaWFzKCJzeXNfbmlfc3lzY2FsbCIpKSksCisgKiBidXQgaXQgZG9lc24ndCB3b3JrIG9uIGFsbCB0b29sY2hhaW5zLCBzbyB3ZSBqdXN0IGRvIGl0IGJ5IGhhbmQKKyAqLworI2lmbmRlZiBjb25kX3N5c2NhbGwKKyNkZWZpbmUgY29uZF9zeXNjYWxsKHgpIGFzbSgiLndlYWtcdCIgI3ggIlxuXHQuc2V0XHQiICN4ICIsc3lzX25pX3N5c2NhbGwiKTsKKyNlbmRpZgorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9BU01fVU5JU1REX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvdW5pdC1hc2IyMzAzL2Nsb2NrLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3VuaXQtYXNiMjMwMy9jbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNDUwZTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3VuaXQtYXNiMjMwMy9jbG9jay5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qIEFTQjIzMDMtc3BlY2lmaWMgY2xvY2tzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0FTTV9VTklUX0NMT0NLX0gKKyNkZWZpbmUgX0FTTV9VTklUX0NMT0NLX0gKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2lmZGVmIENPTkZJR19NTjEwMzAwX1JUQworCitleHRlcm4gdW5zaWduZWQgbG9uZyBtbjEwMzAwX2lvY2xrOwkvKiBJT0NMSyAoY3J5c3RhbCBzcGVlZCkgaW4gSFogKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIG1uMTAzMDBfaW9iY2xrOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbW4xMDMwMF90c2NfcGVyX0haOworCisjZGVmaW5lIE1OMTAzMDBfSU9DTEsJCSgodW5zaWduZWQgbG9uZyltbjEwMzAwX2lvY2xrKQorLyogSWYgdGhpcyBwcm9jZXNzb3JzIGhhcyBhIGFub3RoZXIgY2xvY2ssIHVuY29tbWVudCB0aGUgYmVsb3cuICovCisvKiAjZGVmaW5lIE1OMTAzMDBfSU9CQ0xLCSgodW5zaWduZWQgbG9uZyltbjEwMzAwX2lvYmNsaykgKi8KKworI2Vsc2UgLyogIUNPTkZJR19NTjEwMzAwX1JUQyAqLworCisjZGVmaW5lIE1OMTAzMDBfSU9DTEsJCTMzMzMzMzMzVUwKKy8qICNkZWZpbmUgTU4xMDMwMF9JT0JDTEsJNjY2NjY2NjZVTCAqLworCisjZW5kaWYgLyogIUNPTkZJR19NTjEwMzAwX1JUQyAqLworCisjZGVmaW5lIE1OMTAzMDBfSkNDTEsJCU1OMTAzMDBfSU9DTEsKKyNkZWZpbmUgTU4xMDMwMF9UU0NDTEsJCU1OMTAzMDBfSU9DTEsKKworI2lmZGVmIENPTkZJR19NTjEwMzAwX1JUQworI2RlZmluZSBNTjEwMzAwX1RTQ19QRVJfSFoJKCh1bnNpZ25lZCBsb25nKW1uMTAzMDBfdHNjX3Blcl9IWikKKyNlbHNlIC8qICFDT05GSUdfTU4xMDMwMF9SVEMgKi8KKyNkZWZpbmUgTU4xMDMwMF9UU0NfUEVSX0haCShNTjEwMzAwX1RTQ0NMSy9IWikKKyNlbmRpZiAvKiAhQ09ORklHX01OMTAzMDBfUlRDICovCisKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfQVNNX1VOSVRfQ0xPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC91bml0LWFzYjIzMDMvbGVkcy5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC91bml0LWFzYjIzMDMvbGVkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNzU0M2UKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3VuaXQtYXNiMjMwMy9sZWRzLmgKQEAgLTAsMCArMSw0MyBAQAorLyogQVNCMjMwMy1zcGVjaWZpYyBMRURzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0FTTV9VTklUX0xFRFNfSAorI2RlZmluZSBfQVNNX1VOSVRfTEVEU19ICisKKyNpbmNsdWRlIDxhc20vcGlvLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vY3B1LXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vZXhjZXB0aW9ucy5oPgorCisjZGVmaW5lIEFTQjIzMDNfR1BJTzBERUYJX19TWVNSRUcoMHhEQjAwMDAwMCwgdTMyKQorI2RlZmluZSBBU0IyMzAzXzdTRUdMRURTCV9fU1lTUkVHKDB4REIwMDAwMDgsIHUzMikKKworLyoKKyAqIHVzZSB0aGUgNy1zZWdtZW50IExFRHMgdG8gaW5kaWNhdGUgc3RhdGVzCisgKi8KKworLyogZmxpcCB0aGUgNy1zZWdtZW50IExFRHMgYmV0d2VlbiAiRyIgYW5kICItIiAqLworI2RlZmluZSBtbjEwMzAwX3NldF9nZGJsZWRzKE9OT0ZGKQkJCVwKK2RvIHsJCQkJCQkJXAorCUFTQjIzMDNfN1NFR0xFRFMgPSAoT05PRkYpID8gMHg4NSA6IDB4N2Y7CVwKK30gd2hpbGUgKDApCisKKy8qIGluZGljYXRlIGRvdWJsZS1mYXVsdCBieSBkaXNwbGF5aW5nICJkIiBvbiB0aGUgTEVEcyAqLworI2RlZmluZSBtbjEwMzAwX3NldF9kYmZsZWRzCQkJXAorCW1vdgkweDQzLGQwCQkJOwlcCisJbW92YnUJZDAsKEFTQjIzMDNfN1NFR0xFRFMpCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCitleHRlcm4gdm9pZCBwZXJpcGhlcmFsX2xlZHNfZGlzcGxheV9leGNlcHRpb24oZW51bSBleGNlcHRpb25fY29kZSBjb2RlKTsKK2V4dGVybiB2b2lkIHBlcmlwaGVyYWxfbGVkc19sZWRfY2hhc2Uodm9pZCk7CitleHRlcm4gdm9pZCBkZWJ1Z190b19zZXJpYWwoY29uc3QgY2hhciAqcCwgaW50IG4pOworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisjZW5kaWYgLyogX0FTTV9VTklUX0xFRFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC91bml0LWFzYjIzMDMvc2VyaWFsLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3VuaXQtYXNiMjMwMy9zZXJpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDU1Y2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC91bml0LWFzYjIzMDMvc2VyaWFsLmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qIEFTQjIzMDMtc3BlY2lmaWMgODI1MCBzZXJpYWwgcG9ydHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfQVNNX1VOSVRfU0VSSUFMX0gKKyNkZWZpbmUgX0FTTV9VTklUX1NFUklBTF9ICisKKyNpbmNsdWRlIDxhc20vY3B1LXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vcHJvYy9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisKKyNkZWZpbmUgU0VSSUFMX1BPUlQwX0JBU0VfQUREUkVTUwkweEE2RkIwMDAwCisjZGVmaW5lIFNFUklBTF9QT1JUMV9CQVNFX0FERFJFU1MJMHhBNkZDMDAwMAorCisjZGVmaW5lIFNFUklBTF9JUlEJWElSUTAJLyogRHVhbCBzZXJpYWwgKFBDMTY1NTIpCShIaSkgKi8KKworLyoKKyAqIGRpc3Bvc2Ugb2YgdGhlIC9kZXYvdHR5UzAgYW5kIC9kZXYvdHR5UzEgc2VyaWFsIHBvcnRzCisgKi8KKyNpZm5kZWYgQ09ORklHX0dEQlNUVUJfT05fVFRZU3gKKworI2RlZmluZSBTRVJJQUxfUE9SVF9ERk5TCQkJCQkJXAorCXsJCQkJCQkJCVwKKwkuYmF1ZF9iYXNlCQk9IEJBU0VfQkFVRCwJCQkJXAorCS5pcnEJCQk9IFNFUklBTF9JUlEsCQkJCVwKKwkuZmxhZ3MJCQk9IFNURF9DT01fRkxBR1MsCQkJXAorCS5pb21lbV9iYXNlCQk9ICh1OCAqKSBTRVJJQUxfUE9SVDBfQkFTRV9BRERSRVNTLAlcCisJLmlvbWVtX3JlZ19zaGlmdAk9IDIsCQkJCQlcCisJLmlvX3R5cGUJCT0gU0VSSUFMX0lPX01FTSwJCQlcCisJfSwJCQkJCQkJCVwKKwl7CQkJCQkJCQlcCisJLmJhdWRfYmFzZQkJPSBCQVNFX0JBVUQsCQkJCVwKKwkuaXJxCQkJPSBTRVJJQUxfSVJRLAkJCQlcCisJLmZsYWdzCQkJPSBTVERfQ09NX0ZMQUdTLAkJCVwKKwkuaW9tZW1fYmFzZQkJPSAodTggKikgU0VSSUFMX1BPUlQxX0JBU0VfQUREUkVTUywJXAorCS5pb21lbV9yZWdfc2hpZnQJPSAyLAkJCQkJXAorCS5pb190eXBlCQk9IFNFUklBTF9JT19NRU0sCQkJXAorCX0sCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2RlYnVnX3RvX3NlcmlhbChjb25zdCBjaGFyICpwLCBpbnQgbikKK3sKK30KKworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworI2Vsc2UgLyogQ09ORklHX0dEQlNUVUJfT05fVFRZU3ggKi8KKworI2RlZmluZSBTRVJJQUxfUE9SVF9ERk5TIC8qIGJvdGggc3RvbGVuIGJ5IGdkYi1zdHViIGJlY2F1c2UgdGhleSBzaGFyZSBhbiBJUlEgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0dEQlNUVUJfT05fVFRZUzApCisjZGVmaW5lIEdEQlBPUlRfU0VSSUFMX1JYCV9fU1lTUkVHKFNFUklBTF9QT1JUMF9CQVNFX0FERFJFU1MgKyBVQVJUX1JYICAqIDQsIHU4KQorI2RlZmluZSBHREJQT1JUX1NFUklBTF9UWAlfX1NZU1JFRyhTRVJJQUxfUE9SVDBfQkFTRV9BRERSRVNTICsgVUFSVF9UWCAgKiA0LCB1OCkKKyNkZWZpbmUgR0RCUE9SVF9TRVJJQUxfRExMCV9fU1lTUkVHKFNFUklBTF9QT1JUMF9CQVNFX0FERFJFU1MgKyBVQVJUX0RMTCAqIDQsIHU4KQorI2RlZmluZSBHREJQT1JUX1NFUklBTF9ETE0JX19TWVNSRUcoU0VSSUFMX1BPUlQwX0JBU0VfQUREUkVTUyArIFVBUlRfRExNICogNCwgdTgpCisjZGVmaW5lIEdEQlBPUlRfU0VSSUFMX0lFUglfX1NZU1JFRyhTRVJJQUxfUE9SVDBfQkFTRV9BRERSRVNTICsgVUFSVF9JRVIgKiA0LCB1OCkKKyNkZWZpbmUgR0RCUE9SVF9TRVJJQUxfSUlSCV9fU1lTUkVHKFNFUklBTF9QT1JUMF9CQVNFX0FERFJFU1MgKyBVQVJUX0lJUiAqIDQsIHU4KQorI2RlZmluZSBHREJQT1JUX1NFUklBTF9GQ1IJX19TWVNSRUcoU0VSSUFMX1BPUlQwX0JBU0VfQUREUkVTUyArIFVBUlRfRkNSICogNCwgdTgpCisjZGVmaW5lIEdEQlBPUlRfU0VSSUFMX0xDUglfX1NZU1JFRyhTRVJJQUxfUE9SVDBfQkFTRV9BRERSRVNTICsgVUFSVF9MQ1IgKiA0LCB1OCkKKyNkZWZpbmUgR0RCUE9SVF9TRVJJQUxfTUNSCV9fU1lTUkVHKFNFUklBTF9QT1JUMF9CQVNFX0FERFJFU1MgKyBVQVJUX01DUiAqIDQsIHU4KQorI2RlZmluZSBHREJQT1JUX1NFUklBTF9MU1IJX19TWVNSRUcoU0VSSUFMX1BPUlQwX0JBU0VfQUREUkVTUyArIFVBUlRfTFNSICogNCwgdTgpCisjZGVmaW5lIEdEQlBPUlRfU0VSSUFMX01TUglfX1NZU1JFRyhTRVJJQUxfUE9SVDBfQkFTRV9BRERSRVNTICsgVUFSVF9NU1IgKiA0LCB1OCkKKyNkZWZpbmUgR0RCUE9SVF9TRVJJQUxfU0NSCV9fU1lTUkVHKFNFUklBTF9QT1JUMF9CQVNFX0FERFJFU1MgKyBVQVJUX1NDUiAqIDQsIHU4KQorI2RlZmluZSBHREJQT1JUX1NFUklBTF9JUlEJU0VSSUFMX0lSUQorCisjZWxpZiBkZWZpbmVkKENPTkZJR19HREJTVFVCX09OX1RUWVMxKQorI2RlZmluZSBHREJQT1JUX1NFUklBTF9SWAlfX1NZU1JFRyhTRVJJQUxfUE9SVDFfQkFTRV9BRERSRVNTICsgVUFSVF9SWCAgKiA0LCB1OCkKKyNkZWZpbmUgR0RCUE9SVF9TRVJJQUxfVFgJX19TWVNSRUcoU0VSSUFMX1BPUlQxX0JBU0VfQUREUkVTUyArIFVBUlRfVFggICogNCwgdTgpCisjZGVmaW5lIEdEQlBPUlRfU0VSSUFMX0RMTAlfX1NZU1JFRyhTRVJJQUxfUE9SVDFfQkFTRV9BRERSRVNTICsgVUFSVF9ETEwgKiA0LCB1OCkKKyNkZWZpbmUgR0RCUE9SVF9TRVJJQUxfRExNCV9fU1lTUkVHKFNFUklBTF9QT1JUMV9CQVNFX0FERFJFU1MgKyBVQVJUX0RMTSAqIDQsIHU4KQorI2RlZmluZSBHREJQT1JUX1NFUklBTF9JRVIJX19TWVNSRUcoU0VSSUFMX1BPUlQxX0JBU0VfQUREUkVTUyArIFVBUlRfSUVSICogNCwgdTgpCisjZGVmaW5lIEdEQlBPUlRfU0VSSUFMX0lJUglfX1NZU1JFRyhTRVJJQUxfUE9SVDFfQkFTRV9BRERSRVNTICsgVUFSVF9JSVIgKiA0LCB1OCkKKyNkZWZpbmUgR0RCUE9SVF9TRVJJQUxfRkNSCV9fU1lTUkVHKFNFUklBTF9QT1JUMV9CQVNFX0FERFJFU1MgKyBVQVJUX0ZDUiAqIDQsIHU4KQorI2RlZmluZSBHREJQT1JUX1NFUklBTF9MQ1IJX19TWVNSRUcoU0VSSUFMX1BPUlQxX0JBU0VfQUREUkVTUyArIFVBUlRfTENSICogNCwgdTgpCisjZGVmaW5lIEdEQlBPUlRfU0VSSUFMX01DUglfX1NZU1JFRyhTRVJJQUxfUE9SVDFfQkFTRV9BRERSRVNTICsgVUFSVF9NQ1IgKiA0LCB1OCkKKyNkZWZpbmUgR0RCUE9SVF9TRVJJQUxfTFNSCV9fU1lTUkVHKFNFUklBTF9QT1JUMV9CQVNFX0FERFJFU1MgKyBVQVJUX0xTUiAqIDQsIHU4KQorI2RlZmluZSBHREJQT1JUX1NFUklBTF9NU1IJX19TWVNSRUcoU0VSSUFMX1BPUlQxX0JBU0VfQUREUkVTUyArIFVBUlRfTVNSICogNCwgdTgpCisjZGVmaW5lIEdEQlBPUlRfU0VSSUFMX1NDUglfX1NZU1JFRyhTRVJJQUxfUE9SVDFfQkFTRV9BRERSRVNTICsgVUFSVF9TQ1IgKiA0LCB1OCkKKyNkZWZpbmUgR0RCUE9SVF9TRVJJQUxfSVJRCVNFUklBTF9JUlEKKyNlbmRpZgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjZGVmaW5lIExTUl9XQUlUX0ZPUihTVEFURSkJCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwl3aGlsZSAoIShHREJQT1JUX1NFUklBTF9MU1IgJiBVQVJUX0xTUl8jI1NUQVRFKSkge30JXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgRkxPV0NUTF9XQUlUX0ZPUihMSU5FKQkJCQkJXAorZG8gewkJCQkJCQkJXAorCXdoaWxlICghKEdEQlBPUlRfU0VSSUFMX01TUiAmIFVBUlRfTVNSXyMjTElORSkpIHt9CVwKK30gd2hpbGUgKDApCisjZGVmaW5lIEZMT1dDVExfQ0xFQVIoTElORSkJCQlcCitkbyB7CQkJCQkJXAorCUdEQlBPUlRfU0VSSUFMX01DUiAmPSB+VUFSVF9NQ1JfIyNMSU5FOwlcCit9IHdoaWxlICgwKQorI2RlZmluZSBGTE9XQ1RMX1NFVChMSU5FKQkJCVwKK2RvIHsJCQkJCQlcCisJR0RCUE9SVF9TRVJJQUxfTUNSIHw9IFVBUlRfTUNSXyMjTElORTsJXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgRkxPV0NUTF9RVUVSWShMSU5FKQkoeyBHREJQT1JUX1NFUklBTF9NU1IgJiBVQVJUX01TUl8jI0xJTkU7IH0pCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2RlYnVnX3RvX3NlcmlhbChjb25zdCBjaGFyICpwLCBpbnQgbikKK3sKKwljaGFyIGNoOworCisJRkxPV0NUTF9TRVQoRFRSKTsKKworCWZvciAoOyBuID4gMDsgbi0tKSB7CisJCUxTUl9XQUlUX0ZPUihUSFJFKTsKKwkJRkxPV0NUTF9XQUlUX0ZPUihDVFMpOworCisJCWNoID0gKnArKzsKKwkJaWYgKGNoID09IDB4MGEpIHsKKwkJCUdEQlBPUlRfU0VSSUFMX1RYID0gMHgwZDsKKwkJCUxTUl9XQUlUX0ZPUihUSFJFKTsKKwkJCUZMT1dDVExfV0FJVF9GT1IoQ1RTKTsKKwkJfQorCQlHREJQT1JUX1NFUklBTF9UWCA9IGNoOworCX0KKworCUZMT1dDVExfQ0xFQVIoRFRSKTsKK30KKworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qIENPTkZJR19HREJTVFVCX09OX1RUWVN4ICovCisKKyNlbmRpZiAvKiBfQVNNX1VOSVRfU0VSSUFMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvdW5pdC1hc2IyMzAzL3NtYzkxMTExLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3VuaXQtYXNiMjMwMy9zbWM5MTExMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNDU2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3VuaXQtYXNiMjMwMy9zbWM5MTExMS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qIFN1cHBvcnQgZm9yIHRoZSBTTUM5MUMxMTEgTklDIG9uIGFuIEFTQjIzMDMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9VTklUX1NNQzkxMTExX0gKKyNkZWZpbmUgX0FTTV9VTklUX1NNQzkxMTExX0gKKworI2luY2x1ZGUgPGFzbS9pbnRjdGwtcmVncy5oPgorCisjZGVmaW5lIFNNQzkxMTExX0JBU0UJCTB4QUEwMDAzMDBVTAorI2RlZmluZSBTTUM5MTExMV9CQVNFX0VORAkweEFBMDAwNDAwVUwKKyNkZWZpbmUgU01DOTExMTFfSVJRCQlYSVJRMworCisjZGVmaW5lIFNNQ19DQU5fVVNFXzhCSVQJMAorI2RlZmluZSBTTUNfQ0FOX1VTRV8xNkJJVAkxCisjZGVmaW5lIFNNQ19DQU5fVVNFXzMyQklUCTAKKyNkZWZpbmUgU01DX05PV0FJVAkJMQorI2RlZmluZSBTTUNfSVJRX0ZMQUdTCQkoMCkKKworI2lmIFNNQ19DQU5fVVNFXzhCSVQKKyNkZWZpbmUgU01DX2luYihhLCByKQkJaW5iKCh1bnNpZ25lZCBsb25nKSAoKGEpICsgKHIpKSkKKyNkZWZpbmUgU01DX291dGIodiwgYSwgcikJb3V0Yih2LCAodW5zaWduZWQgbG9uZykgKChhKSArIChyKSkpCisjZW5kaWYKKworI2lmIFNNQ19DQU5fVVNFXzE2QklUCisjZGVmaW5lIFNNQ19pbncoYSwgcikJCWludygodW5zaWduZWQgbG9uZykgKChhKSArIChyKSkpCisjZGVmaW5lIFNNQ19vdXR3KHYsIGEsIHIpCW91dHcodiwgKHVuc2lnbmVkIGxvbmcpICgoYSkgKyAocikpKQorI2RlZmluZSBTTUNfaW5zdyhhLCByLCBwLCBsKQlpbnN3KCh1bnNpZ25lZCBsb25nKSAoKGEpICsgKHIpKSwgKHApLCAobCkpCisjZGVmaW5lIFNNQ19vdXRzdyhhLCByLCBwLCBsKQlvdXRzdygodW5zaWduZWQgbG9uZykgKChhKSArIChyKSksIChwKSwgKGwpKQorI2VuZGlmCisKKyNpZiBTTUNfQ0FOX1VTRV8zMkJJVAorI2RlZmluZSBTTUNfaW5sKGEsIHIpCQlpbmwoKHVuc2lnbmVkIGxvbmcpICgoYSkgKyAocikpKQorI2RlZmluZSBTTUNfb3V0bCh2LCBhLCByKQlvdXRsKHYsICh1bnNpZ25lZCBsb25nKSAoKGEpICsgKHIpKSkKKyNkZWZpbmUgU01DX2luc2woYSwgciwgcCwgbCkJaW5zbCgodW5zaWduZWQgbG9uZykgKChhKSArIChyKSksIChwKSwgKGwpKQorI2RlZmluZSBTTUNfb3V0c2woYSwgciwgcCwgbCkJb3V0c2woKHVuc2lnbmVkIGxvbmcpICgoYSkgKyAocikpLCAocCksIChsKSkKKyNlbmRpZgorCisjZGVmaW5lIFJQQ19MU0FfREVGQVVMVAkJUlBDX0xFRF8xMDBfMTAKKyNkZWZpbmUgUlBDX0xTQl9ERUZBVUxUCQlSUENfTEVEX1RYX1JYCisKKyNkZWZpbmUgc2V0X2lycV90eXBlKGlycSwgdHlwZSkKKworI2VuZGlmIC8qICBfQVNNX1VOSVRfU01DOTExMTFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC91bml0LWFzYjIzMDMvdGltZXguaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvdW5pdC1hc2IyMzAzL3RpbWV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U1NGIwY2YKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3VuaXQtYXNiMjMwMy90aW1leC5oCkBAIC0wLDAgKzEsMTM1IEBACisvKiBBU0IyMzAzLXNwZWNpZmljIHRpbWVyIHNwZWNpZmNhdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9VTklUX1RJTUVYX0gKKyNkZWZpbmUgX0FTTV9VTklUX1RJTUVYX0gKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKworI2luY2x1ZGUgPGFzbS90aW1lci1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL3VuaXQvY2xvY2suaD4KKworLyoKKyAqIGppZmZpZXMgY291bnRlciBzcGVjaWZpY2F0aW9ucworICovCisKKyNkZWZpbmUJVE1KQ0JSX01BWAkJMHhmZmZmCisjZGVmaW5lCVRNSkNCQwkJCVRNMDFCQworCisjZGVmaW5lCVRNSkNNRAkJCVRNMDFNRAorI2RlZmluZQlUTUpDQlIJCQlUTTAxQlIKKyNkZWZpbmUJVE1KQ0lSUQkJCVRNMUlSUQorI2RlZmluZQlUTUpDSUNSCQkJVE0xSUNSCisjZGVmaW5lCVRNSkNJQ1JfTEVWRUwJCUd4SUNSX0xFVkVMXzUKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworc3RhdGljIGlubGluZSB2b2lkIHN0YXJ0dXBfamlmZmllc19jb3VudGVyKHZvaWQpCit7CisJdW5zaWduZWQgcmF0ZTsKKwl1MTYgbWQsIHQxNjsKKworCS8qIHVzZSBhcyBsaXR0bGUgcHJlc2NhbGluZyBhcyBwb3NzaWJsZSB0byBhdm9pZCBsb3NpbmcgYWNjdXJhY3kgKi8KKwltZCA9IFRNME1EX1NSQ19JT0NMSzsKKwlyYXRlID0gTU4xMDMwMF9KQ0NMSyAvIEhaOworCisJaWYgKHJhdGUgPiBUTUpDQlJfTUFYKSB7CisJCW1kID0gVE0wTURfU1JDX0lPQ0xLXzg7CisJCXJhdGUgPSBNTjEwMzAwX0pDQ0xLIC8gOCAvIEhaOworCisJCWlmIChyYXRlID4gVE1KQ0JSX01BWCkgeworCQkJbWQgPSBUTTBNRF9TUkNfSU9DTEtfMzI7CisJCQlyYXRlID0gTU4xMDMwMF9KQ0NMSyAvIDMyIC8gSFo7CisKKwkJCWlmIChyYXRlID4gVE1KQ0JSX01BWCkKKwkJCQlCVUcoKTsKKwkJfQorCX0KKworCVRNSkNCUiA9IHJhdGUgLSAxOworCXQxNiA9IFRNSkNCUjsKKworCVRNSkNNRCA9CisJCW1kIHwKKwkJVE0xTURfU1JDX1RNMENBU0NBREUgPDwgOCB8CisJCVRNME1EX0lOSVRfQ09VTlRFUiB8CisJCVRNMU1EX0lOSVRfQ09VTlRFUiA8PCA4OworCisJVE1KQ01EID0KKwkJbWQgfAorCQlUTTFNRF9TUkNfVE0wQ0FTQ0FERSA8PCA4IHwKKwkJVE0wTURfQ09VTlRfRU5BQkxFIHwKKwkJVE0xTURfQ09VTlRfRU5BQkxFIDw8IDg7CisKKwl0MTYgPSBUTUpDTUQ7CisKKwlUTUpDSUNSIHw9IEd4SUNSX0VOQUJMRSB8IEd4SUNSX0RFVEVDVCB8IEd4SUNSX1JFUVVFU1Q7CisJdDE2ID0gVE1KQ0lDUjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNodXRkb3duX2ppZmZpZXNfY291bnRlcih2b2lkKQoreworfQorCisjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLworCisKKy8qCisgKiB0aW1lc3RhbXAgY291bnRlciBzcGVjaWZpY2F0aW9ucworICovCisKKyNkZWZpbmUJVE1UU0NCUl9NQVgJCTB4ZmZmZmZmZmYKKyNkZWZpbmUJVE1UU0NCQwkJCVRNNDVCQworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCitzdGF0aWMgaW5saW5lIHZvaWQgc3RhcnR1cF90aW1lc3RhbXBfY291bnRlcih2b2lkKQoreworCS8qIHNldCB1cCB0aW1lciA0ICYgNSBjYXNjYWRlZCBhcyBhIDMyLWJpdCBjb3VudGVyIHRvIGNvdW50IHJlYWwgdGltZQorCSAqIC0gY291bnQgZG93biBmcm9tIDRHaWctMSB0byAwIGFuZCB3cmFwIGF0IElPQ0xLIHJhdGUKKwkgKi8KKwlUTTQ1QlIgPSBUTVRTQ0JSX01BWDsKKworCVRNNE1EID0gVE00TURfU1JDX0lPQ0xLOworCVRNNE1EIHw9IFRNNE1EX0lOSVRfQ09VTlRFUjsKKwlUTTRNRCAmPSB+VE00TURfSU5JVF9DT1VOVEVSOworCVRNNElDUiA9IDA7CisKKwlUTTVNRCA9IFRNNU1EX1NSQ19UTTRDQVNDQURFOworCVRNNU1EIHw9IFRNNU1EX0lOSVRfQ09VTlRFUjsKKwlUTTVNRCAmPSB+VE01TURfSU5JVF9DT1VOVEVSOworCVRNNUlDUiA9IDA7CisKKwlUTTVNRCB8PSBUTTVNRF9DT1VOVF9FTkFCTEU7CisJVE00TUQgfD0gVE00TURfQ09VTlRfRU5BQkxFOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2h1dGRvd25fdGltZXN0YW1wX2NvdW50ZXIodm9pZCkKK3sKKwlUTTRNRCA9IDA7CisJVE01TUQgPSAwOworfQorCisvKgorICogd2UgdXNlIGEgY2FzY2FkZWQgcGFpciBvZiAxNi1iaXQgZG93bi1jb3VudGluZyB0aW1lcnMgdG8gY291bnQgSS9PCisgKiBjbG9jayBjeWNsZXMgZm9yIHRoZSBwdXJwb3NlcyBvZiB0aW1lIGtlZXBpbmcKKyAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGN5Y2xlc190OworCitzdGF0aWMgaW5saW5lIGN5Y2xlc190IHJlYWRfdGltZXN0YW1wX2NvdW50ZXIodm9pZCkKK3sKKwlyZXR1cm4gKGN5Y2xlc190KVRNVFNDQkM7Cit9CisKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfQVNNX1VOSVRfVElNRVhfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC91bml0LWFzYjIzMDUvY2xvY2suaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvdW5pdC1hc2IyMzA1L2Nsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q1MTQ4NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvdW5pdC1hc2IyMzA1L2Nsb2NrLmgKQEAgLTAsMCArMSw0NSBAQAorLyogQVNCMjMwNS1zcGVjaWZpYyBjbG9ja3MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfQVNNX1VOSVRfQ0xPQ0tfSAorI2RlZmluZSBfQVNNX1VOSVRfQ0xPQ0tfSAorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjaWZkZWYgQ09ORklHX01OMTAzMDBfUlRDCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIG1uMTAzMDBfaW9jbGs7CS8qIElPQ0xLIChjcnlzdGFsIHNwZWVkKSBpbiBIWiAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbW4xMDMwMF9pb2JjbGs7CitleHRlcm4gdW5zaWduZWQgbG9uZyBtbjEwMzAwX3RzY19wZXJfSFo7CisKKyNkZWZpbmUgTU4xMDMwMF9JT0NMSwkJKCh1bnNpZ25lZCBsb25nKW1uMTAzMDBfaW9jbGspCisvKiBJZiB0aGlzIHByb2Nlc3NvcnMgaGFzIGEgYW5vdGhlciBjbG9jaywgdW5jb21tZW50IHRoZSBiZWxvdy4gKi8KKy8qICNkZWZpbmUgTU4xMDMwMF9JT0JDTEsJKCh1bnNpZ25lZCBsb25nKW1uMTAzMDBfaW9iY2xrKSAqLworCisjZWxzZSAvKiAhQ09ORklHX01OMTAzMDBfUlRDICovCisKKyNkZWZpbmUgTU4xMDMwMF9JT0NMSwkJMzMzMzMzMzNVTAorLyogI2RlZmluZSBNTjEwMzAwX0lPQkNMSwk2NjY2NjY2NlVMICovCisKKyNlbmRpZiAvKiAhQ09ORklHX01OMTAzMDBfUlRDICovCisKKyNkZWZpbmUgTU4xMDMwMF9KQ0NMSwkJTU4xMDMwMF9JT0NMSworI2RlZmluZSBNTjEwMzAwX1RTQ0NMSwkJTU4xMDMwMF9JT0NMSworCisjaWZkZWYgQ09ORklHX01OMTAzMDBfUlRDCisjZGVmaW5lIE1OMTAzMDBfVFNDX1BFUl9IWgkoKHVuc2lnbmVkIGxvbmcpbW4xMDMwMF90c2NfcGVyX0haKQorI2Vsc2UgLyogIUNPTkZJR19NTjEwMzAwX1JUQyAqLworI2RlZmluZSBNTjEwMzAwX1RTQ19QRVJfSFoJKE1OMTAzMDBfVFNDQ0xLL0haKQorI2VuZGlmIC8qICFDT05GSUdfTU4xMDMwMF9SVEMgKi8KKworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qIF9BU01fVU5JVF9DTE9DS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tbjEwMzAwL3VuaXQtYXNiMjMwNS9sZWRzLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3VuaXQtYXNiMjMwNS9sZWRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0NzFmNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvdW5pdC1hc2IyMzA1L2xlZHMuaApAQCAtMCwwICsxLDUxIEBACisvKiBBU0IyMzA1LXNwZWNpZmljIExFRHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfQVNNX1VOSVRfTEVEU19ICisjZGVmaW5lIF9BU01fVU5JVF9MRURTX0gKKworI2luY2x1ZGUgPGFzbS9waW8tcmVncy5oPgorI2luY2x1ZGUgPGFzbS9jcHUtcmVncy5oPgorI2luY2x1ZGUgPGFzbS9leGNlcHRpb25zLmg+CisKKyNkZWZpbmUgQVNCMjMwNV83U0VHTEVEUwlfX1NZU1JFRygweEE2RjkwMDAwLCB1MzIpCisKKy8qIHBlcmZvcm0gYSBoYXJkIHJlc2V0IGJ5IGRyaXZpbmcgUElPMDYgbG93ICovCisjZGVmaW5lIG1uMTAzMDBfdW5pdF9oYXJkX3Jlc2V0KCkJCVwKK2RvIHsJCQkJCQlcCisJUDBPVVQgJj0gMHhiZjsJCQkJXAorCVAwTUQgPSAoUDBNRCAmIFAwTURfNikgfCBQME1EXzZfT1VUOwlcCit9IHdoaWxlICgwKQorCisvKgorICogdXNlIHRoZSA3LXNlZ21lbnQgTEVEcyB0byBpbmRpY2F0ZSBzdGF0ZXMKKyAqLworLyogaW5kaWNhdGUgZG91YmxlLWZhdWx0IGJ5IGRpc3BsYXlpbmcgImRiLWYiIG9uIHRoZSBMRURzICovCisjZGVmaW5lIG1uMTAzMDBfc2V0X2RiZmxlZHMJCQlcCisJbW92CTB4NDMwNzdmMWQsZDAJCTsJXAorCW1vdglkMCwoQVNCMjMwNV83U0VHTEVEUykKKworLyogZmxpcCB0aGUgNy1zZWdtZW50IExFRHMgYmV0d2VlbiAiR2RiLSIgYW5kICItLS0tIiAqLworI2RlZmluZSBtbjEwMzAwX3NldF9nZGJsZWRzKE9OT0ZGKQkJCQlcCitkbyB7CQkJCQkJCQlcCisJQVNCMjMwNV83U0VHTEVEUyA9IChPTk9GRikgPyAweDg1NDMwNzdmIDogMHg3ZjdmN2Y3ZjsJXAorfSB3aGlsZSAoMCkKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KK2V4dGVybiB2b2lkIHBlcmlwaGVyYWxfbGVkc19kaXNwbGF5X2V4Y2VwdGlvbihlbnVtIGV4Y2VwdGlvbl9jb2RlKTsKK2V4dGVybiB2b2lkIHBlcmlwaGVyYWxfbGVkc19sZWRfY2hhc2Uodm9pZCk7CitleHRlcm4gdm9pZCBwZXJpcGhlcmFsX2xlZHM3eDRfZGlzcGxheV9kZWModW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQgcGVyaXBoZXJhbF9sZWRzN3g0X2Rpc3BsYXlfaGV4KHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKK2V4dGVybiB2b2lkIHBlcmlwaGVyYWxfbGVkczd4NF9kaXNwbGF5X21pbnNzZWNzKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKK2V4dGVybiB2b2lkIHBlcmlwaGVyYWxfbGVkczd4NF9kaXNwbGF5X3J0Yyh2b2lkKTsKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qIF9BU01fVU5JVF9MRURTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvdW5pdC1hc2IyMzA1L3NlcmlhbC5oIGIvaW5jbHVkZS9hc20tbW4xMDMwMC91bml0LWFzYjIzMDUvc2VyaWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNkMzFkNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAvdW5pdC1hc2IyMzA1L3NlcmlhbC5oCkBAIC0wLDAgKzEsMTIwIEBACisvKiBBU0IyMzA1LXNwZWNpZmljIDgyNTAgc2VyaWFsIHBvcnRzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fVU5JVF9TRVJJQUxfSAorI2RlZmluZSBfQVNNX1VOSVRfU0VSSUFMX0gKKworI2luY2x1ZGUgPGFzbS9jcHUvY3B1LXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vcHJvYy9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisKKyNkZWZpbmUgU0VSSUFMX1BPUlQwX0JBU0VfQUREUkVTUwkweEE2RkIwMDAwCisjZGVmaW5lIEFTQjIzMDVfREVCVUdfTUNSCV9fU1lTUkVHKDB4QTZGQjAwMDAgKyBVQVJUX01DUiAqIDIsIHU4KQorCisjZGVmaW5lIFNFUklBTF9JUlEJWElSUTAJLyogRHVhbCBzZXJpYWwgKFBDMTY1NTIpCShIaSkgKi8KKworLyoKKyAqIGRpc3Bvc2Ugb2YgdGhlIC9kZXYvdHR5UzAgc2VyaWFsIHBvcnQKKyAqLworI2lmbmRlZiBDT05GSUdfR0RCU1RVQl9PTl9UVFlTeAorCisjZGVmaW5lIFNFUklBTF9QT1JUX0RGTlMJCQkJCQlcCisJewkJCQkJCQkJXAorCS5iYXVkX2Jhc2UJCT0gQkFTRV9CQVVELAkJCQlcCisJLmlycQkJCT0gU0VSSUFMX0lSUSwJCQkJXAorCS5mbGFncwkJCT0gU1REX0NPTV9GTEFHUywJCQlcCisJLmlvbWVtX2Jhc2UJCT0gKHU4ICopIFNFUklBTF9QT1JUMF9CQVNFX0FERFJFU1MsCVwKKwkuaW9tZW1fcmVnX3NoaWZ0CT0gMiwJCQkJCVwKKwkuaW9fdHlwZQkJPSBTRVJJQUxfSU9fTUVNLAkJCVwKKwl9LAorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCitzdGF0aWMgaW5saW5lIHZvaWQgX19kZWJ1Z190b19zZXJpYWwoY29uc3QgY2hhciAqcCwgaW50IG4pCit7Cit9CisKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisKKyNlbHNlIC8qIENPTkZJR19HREJTVFVCX09OX1RUWVN4ICovCisKKyNkZWZpbmUgU0VSSUFMX1BPUlRfREZOUyAvKiBzdG9sZW4gYnkgZ2RiLXN0dWIgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0dEQlNUVUJfT05fVFRZUzApCisjZGVmaW5lIEdEQlBPUlRfU0VSSUFMX1JYCV9fU1lTUkVHKFNFUklBTF9QT1JUMF9CQVNFX0FERFJFU1MgKyBVQVJUX1JYICAqIDQsIHU4KQorI2RlZmluZSBHREJQT1JUX1NFUklBTF9UWAlfX1NZU1JFRyhTRVJJQUxfUE9SVDBfQkFTRV9BRERSRVNTICsgVUFSVF9UWCAgKiA0LCB1OCkKKyNkZWZpbmUgR0RCUE9SVF9TRVJJQUxfRExMCV9fU1lTUkVHKFNFUklBTF9QT1JUMF9CQVNFX0FERFJFU1MgKyBVQVJUX0RMTCAqIDQsIHU4KQorI2RlZmluZSBHREJQT1JUX1NFUklBTF9ETE0JX19TWVNSRUcoU0VSSUFMX1BPUlQwX0JBU0VfQUREUkVTUyArIFVBUlRfRExNICogNCwgdTgpCisjZGVmaW5lIEdEQlBPUlRfU0VSSUFMX0lFUglfX1NZU1JFRyhTRVJJQUxfUE9SVDBfQkFTRV9BRERSRVNTICsgVUFSVF9JRVIgKiA0LCB1OCkKKyNkZWZpbmUgR0RCUE9SVF9TRVJJQUxfSUlSCV9fU1lTUkVHKFNFUklBTF9QT1JUMF9CQVNFX0FERFJFU1MgKyBVQVJUX0lJUiAqIDQsIHU4KQorI2RlZmluZSBHREJQT1JUX1NFUklBTF9GQ1IJX19TWVNSRUcoU0VSSUFMX1BPUlQwX0JBU0VfQUREUkVTUyArIFVBUlRfRkNSICogNCwgdTgpCisjZGVmaW5lIEdEQlBPUlRfU0VSSUFMX0xDUglfX1NZU1JFRyhTRVJJQUxfUE9SVDBfQkFTRV9BRERSRVNTICsgVUFSVF9MQ1IgKiA0LCB1OCkKKyNkZWZpbmUgR0RCUE9SVF9TRVJJQUxfTUNSCV9fU1lTUkVHKFNFUklBTF9QT1JUMF9CQVNFX0FERFJFU1MgKyBVQVJUX01DUiAqIDQsIHU4KQorI2RlZmluZSBHREJQT1JUX1NFUklBTF9MU1IJX19TWVNSRUcoU0VSSUFMX1BPUlQwX0JBU0VfQUREUkVTUyArIFVBUlRfTFNSICogNCwgdTgpCisjZGVmaW5lIEdEQlBPUlRfU0VSSUFMX01TUglfX1NZU1JFRyhTRVJJQUxfUE9SVDBfQkFTRV9BRERSRVNTICsgVUFSVF9NU1IgKiA0LCB1OCkKKyNkZWZpbmUgR0RCUE9SVF9TRVJJQUxfU0NSCV9fU1lTUkVHKFNFUklBTF9QT1JUMF9CQVNFX0FERFJFU1MgKyBVQVJUX1NDUiAqIDQsIHU4KQorI2RlZmluZSBHREJQT1JUX1NFUklBTF9JUlEJU0VSSUFMX0lSUQorCisjZWxpZiBkZWZpbmVkKENPTkZJR19HREJTVFVCX09OX1RUWVMxKQorI2Vycm9yIFRoZSBBU0IyMzA1IGRvZXNudCBoYXZlIGEgL2Rldi90dHlTMQorI2VuZGlmCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNkZWZpbmUgVFRZUzBfVFgJX19TWVNSRUcoU0VSSUFMX1BPUlQwX0JBU0VfQUREUkVTUyArIFVBUlRfVFggICogNCwgdTgpCisjZGVmaW5lIFRUWVMwX01DUglfX1NZU1JFRyhTRVJJQUxfUE9SVDBfQkFTRV9BRERSRVNTICsgVUFSVF9NQ1IgKiA0LCB1OCkKKyNkZWZpbmUgVFRZUzBfTFNSCV9fU1lTUkVHKFNFUklBTF9QT1JUMF9CQVNFX0FERFJFU1MgKyBVQVJUX0xTUiAqIDQsIHU4KQorI2RlZmluZSBUVFlTMF9NU1IJX19TWVNSRUcoU0VSSUFMX1BPUlQwX0JBU0VfQUREUkVTUyArIFVBUlRfTVNSICogNCwgdTgpCisKKyNkZWZpbmUgTFNSX1dBSVRfRk9SKFNUQVRFKQkJCQlcCitkbyB7CQkJCQkJCVwKKwl3aGlsZSAoIShUVFlTMF9MU1IgJiBVQVJUX0xTUl8jI1NUQVRFKSkge30JXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgRkxPV0NUTF9XQUlUX0ZPUihMSU5FKQkJCQlcCitkbyB7CQkJCQkJCVwKKwl3aGlsZSAoIShUVFlTMF9NU1IgJiBVQVJUX01TUl8jI0xJTkUpKSB7fQlcCit9IHdoaWxlICgwKQorI2RlZmluZSBGTE9XQ1RMX0NMRUFSKExJTkUpCQkJXAorZG8gewkJCQkJCVwKKwlUVFlTMF9NQ1IgJj0gflVBUlRfTUNSXyMjTElORTsJCVwKK30gd2hpbGUgKDApCisjZGVmaW5lIEZMT1dDVExfU0VUKExJTkUpCQkJXAorZG8gewkJCQkJCVwKKwlUVFlTMF9NQ1IgfD0gVUFSVF9NQ1JfIyNMSU5FOwkJXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgRkxPV0NUTF9RVUVSWShMSU5FKQkoeyBUVFlTMF9NU1IgJiBVQVJUX01TUl8jI0xJTkU7IH0pCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2RlYnVnX3RvX3NlcmlhbChjb25zdCBjaGFyICpwLCBpbnQgbikKK3sKKwljaGFyIGNoOworCisJRkxPV0NUTF9TRVQoRFRSKTsKKworCWZvciAoOyBuID4gMDsgbi0tKSB7CisJCUxTUl9XQUlUX0ZPUihUSFJFKTsKKwkJRkxPV0NUTF9XQUlUX0ZPUihDVFMpOworCisJCWNoID0gKnArKzsKKwkJaWYgKGNoID09IDB4MGEpIHsKKwkJCVRUWVMwX1RYID0gMHgwZDsKKwkJCUxTUl9XQUlUX0ZPUihUSFJFKTsKKwkJCUZMT1dDVExfV0FJVF9GT1IoQ1RTKTsKKwkJfQorCQlUVFlTMF9UWCA9IGNoOworCX0KKworCUZMT1dDVExfQ0xFQVIoRFRSKTsKK30KKworI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qIENPTkZJR19HREJTVFVCX09OX1RUWVN4ICovCisKKyNlbmRpZiAvKiBfQVNNX1VOSVRfU0VSSUFMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvdW5pdC1hc2IyMzA1L3RpbWV4LmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3VuaXQtYXNiMjMwNS90aW1leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZTFiZmUzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC91bml0LWFzYjIzMDUvdGltZXguaApAQCAtMCwwICsxLDEzNSBAQAorLyogQVNCMjMwNSB0aW1lciBzcGVjaWZjYXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9BU01fVU5JVF9USU1FWF9ICisjZGVmaW5lIF9BU01fVU5JVF9USU1FWF9ICisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKyNpbmNsdWRlIDxhc20vY3B1L3RpbWVyLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vdW5pdC9jbG9jay5oPgorCisvKgorICogamlmZmllcyBjb3VudGVyIHNwZWNpZmljYXRpb25zCisgKi8KKworI2RlZmluZQlUTUpDQlJfTUFYCQkweGZmZmYKKyNkZWZpbmUJVE1KQ0JDCQkJVE0wMUJDCisKKyNkZWZpbmUJVE1KQ01ECQkJVE0wMU1ECisjZGVmaW5lCVRNSkNCUgkJCVRNMDFCUgorI2RlZmluZQlUTUpDSVJRCQkJVE0xSVJRCisjZGVmaW5lCVRNSkNJQ1IJCQlUTTFJQ1IKKyNkZWZpbmUJVE1KQ0lDUl9MRVZFTAkJR3hJQ1JfTEVWRUxfNQorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCitzdGF0aWMgaW5saW5lIHZvaWQgc3RhcnR1cF9qaWZmaWVzX2NvdW50ZXIodm9pZCkKK3sKKwl1bnNpZ25lZCByYXRlOworCXUxNiBtZCwgdDE2OworCisJLyogdXNlIGFzIGxpdHRsZSBwcmVzY2FsaW5nIGFzIHBvc3NpYmxlIHRvIGF2b2lkIGxvc2luZyBhY2N1cmFjeSAqLworCW1kID0gVE0wTURfU1JDX0lPQ0xLOworCXJhdGUgPSBNTjEwMzAwX0pDQ0xLIC8gSFo7CisKKwlpZiAocmF0ZSA+IFRNSkNCUl9NQVgpIHsKKwkJbWQgPSBUTTBNRF9TUkNfSU9DTEtfODsKKwkJcmF0ZSA9IE1OMTAzMDBfSkNDTEsgLyA4IC8gSFo7CisKKwkJaWYgKHJhdGUgPiBUTUpDQlJfTUFYKSB7CisJCQltZCA9IFRNME1EX1NSQ19JT0NMS18zMjsKKwkJCXJhdGUgPSBNTjEwMzAwX0pDQ0xLIC8gMzIgLyBIWjsKKworCQkJaWYgKHJhdGUgPiBUTUpDQlJfTUFYKQorCQkJCUJVRygpOworCQl9CisJfQorCisJVE1KQ0JSID0gcmF0ZSAtIDE7CisJdDE2ID0gVE1KQ0JSOworCisJVE1KQ01EID0KKwkJbWQgfAorCQlUTTFNRF9TUkNfVE0wQ0FTQ0FERSA8PCA4IHwKKwkJVE0wTURfSU5JVF9DT1VOVEVSIHwKKwkJVE0xTURfSU5JVF9DT1VOVEVSIDw8IDg7CisKKwlUTUpDTUQgPQorCQltZCB8CisJCVRNMU1EX1NSQ19UTTBDQVNDQURFIDw8IDggfAorCQlUTTBNRF9DT1VOVF9FTkFCTEUgfAorCQlUTTFNRF9DT1VOVF9FTkFCTEUgPDwgODsKKworCXQxNiA9IFRNSkNNRDsKKworCVRNSkNJQ1IgfD0gR3hJQ1JfRU5BQkxFIHwgR3hJQ1JfREVURUNUIHwgR3hJQ1JfUkVRVUVTVDsKKwl0MTYgPSBUTUpDSUNSOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2h1dGRvd25famlmZmllc19jb3VudGVyKHZvaWQpCit7Cit9CisKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisKKworLyoKKyAqIHRpbWVzdGFtcCBjb3VudGVyIHNwZWNpZmljYXRpb25zCisgKi8KKworI2RlZmluZQlUTVRTQ0JSX01BWAkJMHhmZmZmZmZmZgorI2RlZmluZQlUTVRTQ0JDCQkJVE00NUJDCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdGFydHVwX3RpbWVzdGFtcF9jb3VudGVyKHZvaWQpCit7CisJLyogc2V0IHVwIHRpbWVyIDQgJiA1IGNhc2NhZGVkIGFzIGEgMzItYml0IGNvdW50ZXIgdG8gY291bnQgcmVhbCB0aW1lCisJICogLSBjb3VudCBkb3duIGZyb20gNEdpZy0xIHRvIDAgYW5kIHdyYXAgYXQgSU9DTEsgcmF0ZQorCSAqLworCVRNNDVCUiA9IFRNVFNDQlJfTUFYOworCisJVE00TUQgPSBUTTRNRF9TUkNfSU9DTEs7CisJVE00TUQgfD0gVE00TURfSU5JVF9DT1VOVEVSOworCVRNNE1EICY9IH5UTTRNRF9JTklUX0NPVU5URVI7CisJVE00SUNSID0gMDsKKworCVRNNU1EID0gVE01TURfU1JDX1RNNENBU0NBREU7CisJVE01TUQgfD0gVE01TURfSU5JVF9DT1VOVEVSOworCVRNNU1EICY9IH5UTTVNRF9JTklUX0NPVU5URVI7CisJVE01SUNSID0gMDsKKworCVRNNU1EIHw9IFRNNU1EX0NPVU5UX0VOQUJMRTsKKwlUTTRNRCB8PSBUTTRNRF9DT1VOVF9FTkFCTEU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzaHV0ZG93bl90aW1lc3RhbXBfY291bnRlcih2b2lkKQoreworCVRNNE1EID0gMDsKKwlUTTVNRCA9IDA7Cit9CisKKy8qCisgKiB3ZSB1c2UgYSBjYXNjYWRlZCBwYWlyIG9mIDE2LWJpdCBkb3duLWNvdW50aW5nIHRpbWVycyB0byBjb3VudCBJL08KKyAqIGNsb2NrIGN5Y2xlcyBmb3IgdGhlIHB1cnBvc2VzIG9mIHRpbWUga2VlcGluZworICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgY3ljbGVzX3Q7CisKK3N0YXRpYyBpbmxpbmUgY3ljbGVzX3QgcmVhZF90aW1lc3RhbXBfY291bnRlcih2b2lkKQoreworCXJldHVybiAoY3ljbGVzX3QpIFRNVFNDQkM7Cit9CisKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfQVNNX1VOSVRfVElNRVhfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC91c2VyLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3VzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTE5MzkwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tbW4xMDMwMC91c2VyLmgKQEAgLTAsMCArMSw1MyBAQAorLyogTU4xMDMwMCBVc2VyIHByb2Nlc3MgZGF0YQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNYXRzdXNoaXRhIEVsZWN0cmljIEluZHVzdHJpYWwgQ28uLCBMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgX0FTTV9VU0VSX0gKKyNkZWZpbmUgX0FTTV9VU0VSX0gKKworI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisvKgorICogV2hlbiB0aGUga2VybmVsIGR1bXBzIGNvcmUsIGl0IHN0YXJ0cyBieSBkdW1waW5nIHRoZSB1c2VyIHN0cnVjdCAtIHRoaXMgd2lsbAorICogYmUgdXNlZCBieSBnZGIgdG8gZmlndXJlIG91dCB3aGVyZSB0aGUgZGF0YSBhbmQgc3RhY2sgc2VnbWVudHMgYXJlIHdpdGhpbgorICogdGhlIGZpbGUsIGFuZCB3aGF0IHZpcnR1YWwgYWRkcmVzc2VzIHRvIHVzZS4KKyAqLworc3RydWN0IHVzZXIgeworCS8qIFdlIHN0YXJ0IHdpdGggdGhlIHJlZ2lzdGVycywgdG8gbWltaWMgdGhlIHdheSB0aGF0ICJtZW1vcnkiIGlzCisJICogcmV0dXJuZWQgZnJvbSB0aGUgcHRyYWNlKDMsLi4uKSBmdW5jdGlvbi4KKwkgKi8KKwlzdHJ1Y3QgcHRfcmVncyByZWdzOwkJLyogV2hlcmUgdGhlIHJlZ2lzdGVycyBhcmUgYWN0dWFsbHkgc3RvcmVkICovCisKKwkvKiBUaGUgcmVzdCBvZiB0aGlzIGp1bmsgaXMgdG8gaGVscCBnZGIgZmlndXJlIG91dCB3aGF0IGdvZXMgd2hlcmUgKi8KKwl1bnNpZ25lZCBsb25nIGludCB1X3RzaXplOwkvKiBUZXh0IHNlZ21lbnQgc2l6ZSAocGFnZXMpLiAqLworCXVuc2lnbmVkIGxvbmcgaW50IHVfZHNpemU7CS8qIERhdGEgc2VnbWVudCBzaXplIChwYWdlcykuICovCisJdW5zaWduZWQgbG9uZyBpbnQgdV9zc2l6ZTsJLyogU3RhY2sgc2VnbWVudCBzaXplIChwYWdlcykuICovCisJdW5zaWduZWQgbG9uZyBzdGFydF9jb2RlOwkvKiBTdGFydGluZyB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGV4dC4gKi8KKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3N0YWNrOwkvKiBTdGFydGluZyB2aXJ0dWFsIGFkZHJlc3Mgb2Ygc3RhY2sgYXJlYS4KKwkJCQkJICAgVGhpcyBpcyBhY3R1YWxseSB0aGUgYm90dG9tIG9mIHRoZSBzdGFjaywKKwkJCQkJICAgdGhlIHRvcCBvZiB0aGUgc3RhY2sgaXMgYWx3YXlzIGZvdW5kIGluIHRoZQorCQkJCQkgICBlc3AgcmVnaXN0ZXIuICAqLworCWxvbmcgaW50IHNpZ25hbDsJCS8qIFNpZ25hbCB0aGF0IGNhdXNlZCB0aGUgY29yZSBkdW1wLiAqLworCWludCByZXNlcnZlZDsJCQkvKiBObyBsb25nZXIgdXNlZCAqLworCXN0cnVjdCB1c2VyX3B0X3JlZ3MgKnVfYXIwOwkvKiBVc2VkIGJ5IGdkYiB0byBoZWxwIGZpbmQgdGhlIHZhbHVlcyBmb3IgKi8KKworCS8qIHRoZSByZWdpc3RlcnMgKi8KKwl1bnNpZ25lZCBsb25nIG1hZ2ljOwkJLyogVG8gdW5pcXVlbHkgaWRlbnRpZnkgYSBjb3JlIGZpbGUgKi8KKwljaGFyIHVfY29tbVszMl07CQkvKiBVc2VyIGNvbW1hbmQgdGhhdCB3YXMgcmVzcG9uc2libGUgKi8KK307CisjZW5kaWYKKworI2RlZmluZSBOQlBHIFBBR0VfU0laRQorI2RlZmluZSBVUEFHRVMgMQorI2RlZmluZSBIT1NUX1RFWFRfU1RBUlRfQUREUgkrKHUuc3RhcnRfY29kZSkKKyNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUgkrKHUuc3RhcnRfc3RhY2sgKyB1LnVfc3NpemUgKiBOQlBHKQorCisjZW5kaWYgLyogX0FTTV9VU0VSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1uMTAzMDAvdmdhLmggYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3ZnYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNjNlNTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tbjEwMzAwL3ZnYS5oCkBAIC0wLDAgKzEsMTcgQEAKKy8qIE1OMTAzMDAgVkdBIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0FTTV9WR0FfSAorI2RlZmluZSBfQVNNX1ZHQV9ICisKKworCisjZW5kaWYgLyogX0FTTV9WR0FfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbW4xMDMwMC94b3IuaCBiL2luY2x1ZGUvYXNtLW1uMTAzMDAveG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgyZWIxMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1uMTAzMDAveG9yLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3hvci5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL2Eub3V0LmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvYS5vdXQuaAppbmRleCAyM2UyYzkwLi5lYjA0ZTM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvYS5vdXQuaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvYS5vdXQuaApAQCAtMTcsMTQgKzE3LDQgQEAKICNkZWZpbmUgTl9EUlNJWkUoYSkJKChhKS5hX2Ryc2l6ZSkKICNkZWZpbmUgTl9TWU1TSVpFKGEpCSgoYSkuYV9zeW1zKQogCi0jaWZkZWYgX19LRVJORUxfXwotCi0vKiBYWFg6IFNUQUNLX1RPUCBhY3R1YWxseSBzaG91bGQgYmUgU1RBQ0tfQk9UVE9NIGZvciBwYXJpc2MuCi0gKiBwcnVtcGYgKi8KLQotI2RlZmluZSBTVEFDS19UT1AJVEFTS19TSVpFCi0jZGVmaW5lIFNUQUNLX1RPUF9NQVgJREVGQVVMVF9UQVNLX1NJWkUKLQotI2VuZGlmCi0KICNlbmRpZiAvKiBfX0FfT1VUX0dOVV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9hdG9taWMuaAppbmRleCBlODk0ZWUzLi41N2ZjYzRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL2F0b21pYy5oCkBAIC0xMjIsNiArMTIyLDM5IEBACiAJCQkJICAgICh1bnNpZ25lZCBsb25nKV9uXywgc2l6ZW9mKCoocHRyKSkpOyBcCiAgIH0pCiAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jbXB4Y2hnLWxvY2FsLmg+CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2NtcHhjaGdfbG9jYWwodm9sYXRpbGUgdm9pZCAqcHRyLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2xkLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbmV3XywgaW50IHNpemUpCit7CisJc3dpdGNoIChzaXplKSB7CisjaWZkZWYgQ09ORklHXzY0QklUCisJY2FzZSA4OglyZXR1cm4gX19jbXB4Y2hnX3U2NCgodW5zaWduZWQgbG9uZyAqKXB0ciwgb2xkLCBuZXdfKTsKKyNlbmRpZgorCWNhc2UgNDoJcmV0dXJuIF9fY21weGNoZ191MzIocHRyLCBvbGQsIG5ld18pOworCWRlZmF1bHQ6CisJCXJldHVybiBfX2NtcHhjaGdfbG9jYWxfZ2VuZXJpYyhwdHIsIG9sZCwgbmV3Xywgc2l6ZSk7CisJfQorfQorCisvKgorICogY21weGNoZ19sb2NhbCBhbmQgY21weGNoZzY0X2xvY2FsIGFyZSBhdG9taWMgd3J0IGN1cnJlbnQgQ1BVLiBBbHdheXMgbWFrZQorICogdGhlbSBhdmFpbGFibGUuCisgKi8KKyNkZWZpbmUgY21weGNoZ19sb2NhbChwdHIsIG8sIG4pCQkJCSAgCVwKKwkoKF9fdHlwZW9mX18oKihwdHIpKSlfX2NtcHhjaGdfbG9jYWwoKHB0ciksICh1bnNpZ25lZCBsb25nKShvKSwJXAorCQkJKHVuc2lnbmVkIGxvbmcpKG4pLCBzaXplb2YoKihwdHIpKSkpCisjaWZkZWYgQ09ORklHXzY0QklUCisjZGVmaW5lIGNtcHhjaGc2NF9sb2NhbChwdHIsIG8sIG4pCQkJCQlcCisgICh7CQkJCQkJCQkJXAorCUJVSUxEX0JVR19PTihzaXplb2YoKihwdHIpKSAhPSA4KTsJCQkJXAorCWNtcHhjaGdfbG9jYWwoKHB0ciksIChvKSwgKG4pKTsJCQkJCVwKKyAgfSkKKyNlbHNlCisjZGVmaW5lIGNtcHhjaGc2NF9sb2NhbChwdHIsIG8sIG4pIF9fY21weGNoZzY0X2xvY2FsX2dlbmVyaWMoKHB0ciksIChvKSwgKG4pKQorI2VuZGlmCisKIC8qIE5vdGUgdGhhdCB3ZSBuZWVkIG5vdCBsb2NrIHJlYWQgYWNjZXNzZXMgLSBhbGlnbmVkIHdvcmQgd3JpdGVzL3JlYWRzCiAgKiBhcmUgYXRvbWljLCBzbyBhIHJlYWRlciBuZXZlciBzZWVzIHVuY29uc2lzdGVudCB2YWx1ZXMuCiAgKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL2VsZi5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL2VsZi5oCmluZGV4IDhlNzk0NmEuLmNlMGMwZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9lbGYuaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvZWxmLmgKQEAgLTIzNywxNCArMjM3LDExIEBACiAKICNkZWZpbmUgRUxGX1BMQVRGT1JNICAoIlBBUklTQ1wwIiAvKisoKGJvb3RfY3B1X2RhdGEueDg2LTMpKjUpICovKQogCi0jaWZkZWYgX19LRVJORUxfXwogI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgsIGliY3MyKSBcCiAJY3VycmVudC0+cGVyc29uYWxpdHkgPSBQRVJfTElOVVg7IFwKIAljdXJyZW50LT50aHJlYWQubWFwX2Jhc2UgPSBERUZBVUxUX01BUF9CQVNFOyBcCiAJY3VycmVudC0+dGhyZWFkLnRhc2tfc2l6ZSA9IERFRkFVTFRfVEFTS19TSVpFIFwKIAotI2VuZGlmCi0KIC8qCiAgKiBGaWxsIGluIGdlbmVyYWwgcmVnaXN0ZXJzIGluIGEgY29yZSBkdW1wLiAgVGhpcyBzYXZlcyBwcmV0dHkKICAqIG11Y2ggdGhlIHNhbWUgcmVnaXN0ZXJzIGFzIGhwLXV4LCBhbHRob3VnaCBpbiBhIGRpZmZlcmVudCBvcmRlci4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9wYWdlLmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvcGFnZS5oCmluZGV4IGI1OWExNTA0Li4yN2Q1MGI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9wYWdlLmgKQEAgLTEsOCArMSw2IEBACiAjaWZuZGVmIF9QQVJJU0NfUEFHRV9ICiAjZGVmaW5lIF9QQVJJU0NfUEFHRV9ICiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0KICNpbmNsdWRlIDxsaW51eC9jb25zdC5oPgogCiAjaWYgZGVmaW5lZChDT05GSUdfUEFSSVNDX1BBR0VfU0laRV80S0IpCkBAIC05Myw2ICs5MSw3IEBACiAKICNlbmRpZiAvKiBTVFJJQ1RfTU1fVFlQRUNIRUNLUyAqLwogCit0eXBlZGVmIHN0cnVjdCBwYWdlICpwZ3RhYmxlX3Q7CiAKIHR5cGVkZWYgc3RydWN0IF9fcGh5c21lbV9yYW5nZSB7CiAJdW5zaWduZWQgbG9uZyBzdGFydF9wZm47CkBAIC0xNzUsNiArMTc0LDQgQEAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tZW1vcnlfbW9kZWwuaD4KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wYWdlLmg+CiAKLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KICNlbmRpZiAvKiBfUEFSSVNDX1BBR0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL3BnYWxsb2MuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9wZ2FsbG9jLmgKaW5kZXggYWFiNjZmMS4uMzk5NmRmYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL3BnYWxsb2MuaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvcGdhbGxvYy5oCkBAIC0xMTUsMTEgKzExNSwxNCBAQAogCiAjZGVmaW5lIHBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwdGVfcGFnZSkgXAogCXBtZF9wb3B1bGF0ZV9rZXJuZWwobW0sIHBtZCwgcGFnZV9hZGRyZXNzKHB0ZV9wYWdlKSkKKyNkZWZpbmUgcG1kX3BndGFibGUocG1kKSBwbWRfcGFnZShwbWQpCiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKgorc3RhdGljIGlubGluZSBwZ3RhYmxlX3QKIHB0ZV9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTHxfX0dGUF9SRVBFQVR8X19HRlBfWkVSTyk7CisJaWYgKHBhZ2UpCisJCXBndGFibGVfcGFnZV9jdG9yKHBhZ2UpOwogCXJldHVybiBwYWdlOwogfQogCkBAIC0xMzUsNyArMTM4LDExIEBACiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXB0ZSk7CiB9CiAKLSNkZWZpbmUgcHRlX2ZyZWUobW0sIHBhZ2UpIHB0ZV9mcmVlX2tlcm5lbChwYWdlX2FkZHJlc3MocGFnZSkpCitzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgcGFnZSAqcHRlKQoreworCXBndGFibGVfcGFnZV9kdG9yKHB0ZSk7CisJcHRlX2ZyZWVfa2VybmVsKHBhZ2VfYWRkcmVzcygocHRlKSk7Cit9CiAKICNkZWZpbmUgY2hlY2tfcGd0X2NhY2hlKCkJZG8geyB9IHdoaWxlICgwKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvcG9zaXhfdHlwZXMuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9wb3NpeF90eXBlcy5oCmluZGV4IGI2MzRlM2MuLmJiNzI1YTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9wb3NpeF90eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9wb3NpeF90eXBlcy5oCkBAIC00NywxOCArNDcsMTQgQEAKIHR5cGVkZWYgdW5zaWduZWQgaW50CQlfX2tlcm5lbF9vbGRfZGV2X3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKLSNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8IGRlZmluZWQoX19VU0VfQUxMKQogCWludAl2YWxbMl07Ci0jZWxzZSAvKiAhZGVmaW5lZChfX0tFUk5FTF9fKSAmJiAhZGVmaW5lZChfX1VTRV9BTEwpICovCi0JaW50CV9fdmFsWzJdOwotI2VuZGlmIC8qICFkZWZpbmVkKF9fS0VSTkVMX18pICYmICFkZWZpbmVkKF9fVVNFX0FMTCkgKi8KIH0gX19rZXJuZWxfZnNpZF90OwogCiAvKiBjb21wYXRpYmlsaXR5IHN0dWZmICovCiB0eXBlZGVmIF9fa2VybmVsX3VpZF90IF9fa2VybmVsX29sZF91aWRfdDsKIHR5cGVkZWYgX19rZXJuZWxfZ2lkX3QgX19rZXJuZWxfb2xkX2dpZF90OwogCi0jaWYgZGVmaW5lZChfX0tFUk5FTF9fKSB8fCAhZGVmaW5lZChfX0dMSUJDX18pIHx8IChfX0dMSUJDX18gPCAyKQorI2lmIGRlZmluZWQoX19LRVJORUxfXykKIAogI3VuZGVmIF9fRkRfU0VUCiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fRkRfU0VUKHVuc2lnbmVkIGxvbmcgX19mZCwgX19rZXJuZWxfZmRfc2V0ICpfX2Zkc2V0cCkKQEAgLTEyOCw2ICsxMjQsNiBAQAogCX0KIH0KIAotI2VuZGlmIC8qIGRlZmluZWQoX19LRVJORUxfXykgfHwgIWRlZmluZWQoX19HTElCQ19fKSB8fCAoX19HTElCQ19fIDwgMikgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKF9fS0VSTkVMX18pICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL3Byb2Nlc3Nvci5oCmluZGV4IDNiYjA2ZTguLjNjOWQzNDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvcHJvY2Vzc29yLmgKQEAgLTQ3LDYgKzQ3LDE2IEBACiAjZGVmaW5lIERFRkFVTFRfTUFQX0JBU0UJREVGQVVMVF9NQVBfQkFTRTMyCiAjZW5kaWYKIAorI2lmZGVmIF9fS0VSTkVMX18KKworLyogWFhYOiBTVEFDS19UT1AgYWN0dWFsbHkgc2hvdWxkIGJlIFNUQUNLX0JPVFRPTSBmb3IgcGFyaXNjLgorICogcHJ1bXBmICovCisKKyNkZWZpbmUgU1RBQ0tfVE9QCVRBU0tfU0laRQorI2RlZmluZSBTVEFDS19UT1BfTUFYCURFRkFVTFRfVEFTS19TSVpFCisKKyNlbmRpZgorCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9hLm91dC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9hLm91dC5oCmluZGV4IDVjNWVhODMuLjg5Y2VhZDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvYS5vdXQuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2Eub3V0LmgKQEAgLTE3LDIzICsxNyw0IEBACiAjZGVmaW5lIE5fRFJTSVpFKGEpCSgoYSkuYV9kcnNpemUpCiAjZGVmaW5lIE5fU1lNU0laRShhKQkoKGEpLmFfc3ltcykKIAotI2lmZGVmIF9fS0VSTkVMX18KLSNpZmRlZiBfX3Bvd2VycGM2NF9fCi0KLSNkZWZpbmUgU1RBQ0tfVE9QX1VTRVI2NCBUQVNLX1NJWkVfVVNFUjY0Ci0jZGVmaW5lIFNUQUNLX1RPUF9VU0VSMzIgVEFTS19TSVpFX1VTRVIzMgotCi0jZGVmaW5lIFNUQUNLX1RPUCAodGVzdF90aHJlYWRfZmxhZyhUSUZfMzJCSVQpID8gXAotCQkgICBTVEFDS19UT1BfVVNFUjMyIDogU1RBQ0tfVE9QX1VTRVI2NCkKLQotI2RlZmluZSBTVEFDS19UT1BfTUFYIFNUQUNLX1RPUF9VU0VSNjQKLQotI2Vsc2UgLyogX19wb3dlcnBjNjRfXyAqLwotCi0jZGVmaW5lIFNUQUNLX1RPUCBUQVNLX1NJWkUKLSNkZWZpbmUgU1RBQ0tfVE9QX01BWAlTVEFDS19UT1AKLQotI2VuZGlmIC8qIF9fcG93ZXJwYzY0X18gKi8KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfQV9PVVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9jcHV0YWJsZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jcHV0YWJsZS5oCmluZGV4IDUyOGVmMTguLjFlNzk2NzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY3B1dGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2NwdXRhYmxlLmgKQEAgLTQ2LDcgKzQ2LDcgQEAKIAlQUENfT1BST0ZJTEVfUlM2NCA9IDEsCiAJUFBDX09QUk9GSUxFX1BPV0VSNCA9IDIsCiAJUFBDX09QUk9GSUxFX0c0ID0gMywKLQlQUENfT1BST0ZJTEVfQk9PS0UgPSA0LAorCVBQQ19PUFJPRklMRV9GU0xfRU1CID0gNCwKIAlQUENfT1BST0ZJTEVfQ0VMTCA9IDUsCiAJUFBDX09QUk9GSUxFX1BBNlQgPSA2LAogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZGNyLW5hdGl2ZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9kY3ItbmF0aXZlLmgKaW5kZXggYWY1ZmIzMS4uYmU2Yzg3OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9kY3ItbmF0aXZlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9kY3ItbmF0aXZlLmgKQEAgLTU5LDI1ICs1OSwzNiBAQAogLyogUi9XIG9mIGluZGlyZWN0IERDUnMgbWFrZSB1c2Ugb2Ygc3RhbmRhcmQgbmFtaW5nIGNvbnZlbnRpb25zIGZvciBEQ1JzICovCiBleHRlcm4gc3BpbmxvY2tfdCBkY3JfaW5kX2xvY2s7CiAKLSNkZWZpbmUgbWZkY3JpKGJhc2UsIHJlZykJCQkJXAotKHsJCQkJCQkJXAotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7IAkJCQlcCi0JdW5zaWduZWQgaW50IHZhbDsJCQkJXAotCXNwaW5fbG9ja19pcnFzYXZlKCZkY3JfaW5kX2xvY2ssIGZsYWdzKTsJXAotCW10ZGNyKERDUk5fICMjIGJhc2UgIyMgX0NPTkZJR19BRERSLCByZWcpOwlcCi0JdmFsID0gbWZkY3IoRENSTl8gIyMgYmFzZSAjIyBfQ09ORklHX0RBVEEpOwlcCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGNyX2luZF9sb2NrLCBmbGFncyk7CVwKLQl2YWw7CQkJCQkJXAotfSkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgX19tZmRjcmkoaW50IGJhc2VfYWRkciwgaW50IGJhc2VfZGF0YSwgaW50IHJlZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCB2YWw7CiAKLSNkZWZpbmUgbXRkY3JpKGJhc2UsIHJlZywgZGF0YSkJCQkJXAotZG8gewkJCQkJCQlcCi0JdW5zaWduZWQgbG9uZyBmbGFnczsgCQkJCVwKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGNyX2luZF9sb2NrLCBmbGFncyk7CVwKLQltdGRjcihEQ1JOXyAjIyBiYXNlICMjIF9DT05GSUdfQUREUiwgcmVnKTsJXAotCW10ZGNyKERDUk5fICMjIGJhc2UgIyMgX0NPTkZJR19EQVRBLCBkYXRhKTsJXAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRjcl9pbmRfbG9jaywgZmxhZ3MpOwlcCi19IHdoaWxlICgwKQorCXNwaW5fbG9ja19pcnFzYXZlKCZkY3JfaW5kX2xvY2ssIGZsYWdzKTsKKwlfX210ZGNyKGJhc2VfYWRkciwgcmVnKTsKKwl2YWwgPSBfX21mZGNyKGJhc2VfZGF0YSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGNyX2luZF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fbXRkY3JpKGludCBiYXNlX2FkZHIsIGludCBiYXNlX2RhdGEsIGludCByZWcsCisJCQkgICAgdW5zaWduZWQgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGNyX2luZF9sb2NrLCBmbGFncyk7CisJX19tdGRjcihiYXNlX2FkZHIsIHJlZyk7CisJX19tdGRjcihiYXNlX2RhdGEsIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGNyX2luZF9sb2NrLCBmbGFncyk7Cit9CisKKyNkZWZpbmUgbWZkY3JpKGJhc2UsIHJlZykJX19tZmRjcmkoRENSTl8gIyMgYmFzZSAjIyBfQ09ORklHX0FERFIsCVwKKwkJCQkJIERDUk5fICMjIGJhc2UgIyMgX0NPTkZJR19EQVRBLAlcCisJCQkJCSByZWcpCisKKyNkZWZpbmUgbXRkY3JpKGJhc2UsIHJlZywgZGF0YSkJX19tdGRjcmkoRENSTl8gIyMgYmFzZSAjIyBfQ09ORklHX0FERFIsCVwKKwkJCQkJIERDUk5fICMjIGJhc2UgIyMgX0NPTkZJR19EQVRBLAlcCisJCQkJCSByZWcsIGRhdGEpCiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2VsZi5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9lbGYuaAppbmRleCA2YmQwN2VmLi45MDgwZDg1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2VsZi5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZWxmLmgKQEAgLTE2NSw4ICsxNjUsMTAgQEAKICAqIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgd2UgZG9uJ3QgbG9hZCBzb21ldGhpbmcgZm9yIHRoZSB3cm9uZyBhcmNoaXRlY3R1cmUuCiAgKi8KICNkZWZpbmUgZWxmX2NoZWNrX2FyY2goeCkgKCh4KS0+ZV9tYWNoaW5lID09IEVMRl9BUkNIKQorI2RlZmluZSBjb21wYXRfZWxmX2NoZWNrX2FyY2goeCkJKCh4KS0+ZV9tYWNoaW5lID09IEVNX1BQQykKIAogI2RlZmluZSBVU0VfRUxGX0NPUkVfRFVNUAorI2RlZmluZSBDT1JFX0RVTVBfVVNFX1JFR1NFVAogI2RlZmluZSBFTEZfRVhFQ19QQUdFU0laRQlQQUdFX1NJWkUKIAogLyogVGhpcyBpcyB0aGUgbG9jYXRpb24gdGhhdCBhbiBFVF9EWU4gcHJvZ3JhbSBpcyBsb2FkZWQgaWYgZXhlYydlZC4gIFR5cGljYWwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBjNTEyeC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGM1MTJ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ4YTE2NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBjNTEyeC5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBBdXRob3I6IEpvaG4gUmlnYnksIDxqcmlnYnlAZnJlZXNjYWxlLmNvbT4sIEZyaWRheSBBcHIgMTMgMjAwNworICoKKyAqIERlc2NyaXB0aW9uOgorICogTVBDNTEyMSBQcm90b3R5cGVzIGFuZCBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9fQVNNX1BPV0VSUENfTVBDNTEyeF9IX18KKyNkZWZpbmUgX19BU01fUE9XRVJQQ19NUEM1MTJ4X0hfXworCitleHRlcm4gdW5zaWduZWQgbG9uZyBtcGM1MTJ4X2ZpbmRfaXBzX2ZyZXEoc3RydWN0IGRldmljZV9ub2RlICpub2RlKTsKKworI2VuZGlmIC8qIF9fQVNNX1BPV0VSUENfTVBDNTEyeF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGM1Mnh4X3BzYy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tcGM1Mnh4X3BzYy5oCmluZGV4IGJlYTQyYjkuLjcxMGM1ZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBjNTJ4eF9wc2MuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21wYzUyeHhfcHNjLmgKQEAgLTE5MCw1ICsxOTAsNTMgQEAKIAl1MTYJCXRmbHdmcHRyOwkvKiBQU0MgKyAweDllICovCiB9OwogCisjZGVmaW5lIE1QQzUxMnhfUFNDX0ZJRk9fUkVTRVRfU0xJQ0UJMHg4MAorI2RlZmluZSBNUEM1MTJ4X1BTQ19GSUZPX0VOQUJMRV9TTElDRQkweDAxCisjZGVmaW5lIE1QQzUxMnhfUFNDX0ZJRk9fRU5BQkxFX0RNQQkweDA0CisKKyNkZWZpbmUgTVBDNTEyeF9QU0NfRklGT19FTVBUWQkJMHgxCisjZGVmaW5lIE1QQzUxMnhfUFNDX0ZJRk9fRlVMTAkJMHgyCisjZGVmaW5lIE1QQzUxMnhfUFNDX0ZJRk9fQUxBUk0JCTB4NAorI2RlZmluZSBNUEM1MTJ4X1BTQ19GSUZPX1VSRVJSCQkweDgKKyNkZWZpbmUgTVBDNTEyeF9QU0NfRklGT19PUkVSUgkJMHgwMQorI2RlZmluZSBNUEM1MTJ4X1BTQ19GSUZPX01FTUVSUk9SCTB4MDIKKworc3RydWN0IG1wYzUxMnhfcHNjX2ZpZm8geworCXUzMgkJcmVzZXJ2ZWQxWzEwXTsKKwl1MzIJCXR4Y21kOwkJLyogUFNDICsgMHg4MCAqLworCXUzMgkJdHhhbGFybTsJLyogUFNDICsgMHg4NCAqLworCXUzMgkJdHhzcjsJCS8qIFBTQyArIDB4ODggKi8KKwl1MzIJCXR4aXNyOwkJLyogUFNDICsgMHg4YyAqLworCXUzMgkJdHhpbXI7CQkvKiBQU0MgKyAweDkwICovCisJdTMyCQl0eGNudDsJCS8qIFBTQyArIDB4OTQgKi8KKwl1MzIJCXR4cHRyOwkJLyogUFNDICsgMHg5OCAqLworCXUzMgkJdHhzejsJCS8qIFBTQyArIDB4OWMgKi8KKwl1MzIJCXJlc2VydmVkMls3XTsKKwl1bmlvbiB7CisJCXU4CXR4ZGF0YV84OworCQl1MTYJdHhkYXRhXzE2OworCQl1MzIJdHhkYXRhXzMyOworCX0gdHhkYXRhOyAJCQkvKiBQU0MgKyAweGJjICovCisjZGVmaW5lIHR4ZGF0YV84IHR4ZGF0YS50eGRhdGFfOAorI2RlZmluZSB0eGRhdGFfMTYgdHhkYXRhLnR4ZGF0YV8xNgorI2RlZmluZSB0eGRhdGFfMzIgdHhkYXRhLnR4ZGF0YV8zMgorCXUzMgkJcnhjbWQ7CQkvKiBQU0MgKyAweGMwICovCisJdTMyCQlyeGFsYXJtOwkvKiBQU0MgKyAweGM0ICovCisJdTMyCQlyeHNyOwkJLyogUFNDICsgMHhjOCAqLworCXUzMgkJcnhpc3I7CQkvKiBQU0MgKyAweGNjICovCisJdTMyCQlyeGltcjsJCS8qIFBTQyArIDB4ZDAgKi8KKwl1MzIJCXJ4Y250OwkJLyogUFNDICsgMHhkNCAqLworCXUzMgkJcnhwdHI7CQkvKiBQU0MgKyAweGQ4ICovCisJdTMyCQlyeHN6OwkJLyogUFNDICsgMHhkYyAqLworCXUzMgkJcmVzZXJ2ZWQzWzddOworCXVuaW9uIHsKKwkJdTgJcnhkYXRhXzg7CisJCXUxNglyeGRhdGFfMTY7CisJCXUzMglyeGRhdGFfMzI7CisJfSByeGRhdGE7IAkJCS8qIFBTQyArIDB4ZmMgKi8KKyNkZWZpbmUgcnhkYXRhXzggcnhkYXRhLnJ4ZGF0YV84CisjZGVmaW5lIHJ4ZGF0YV8xNiByeGRhdGEucnhkYXRhXzE2CisjZGVmaW5lIHJ4ZGF0YV8zMiByeGRhdGEucnhkYXRhXzMyCit9OwogCiAjZW5kaWYgIC8qIF9fQVNNX01QQzUyeHhfUFNDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9vcHJvZmlsZV9pbXBsLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL29wcm9maWxlX2ltcGwuaAppbmRleCA5MzhmZWZiLi45NTAzNWM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL29wcm9maWxlX2ltcGwuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL29wcm9maWxlX2ltcGwuaApAQCAtNTQsNyArNTQsNyBAQAogCWludCBudW1fY291bnRlcnM7CiB9OwogCi1leHRlcm4gc3RydWN0IG9wX3Bvd2VycGNfbW9kZWwgb3BfbW9kZWxfZnNsX2Jvb2tlOworZXh0ZXJuIHN0cnVjdCBvcF9wb3dlcnBjX21vZGVsIG9wX21vZGVsX2ZzbF9lbWI7CiBleHRlcm4gc3RydWN0IG9wX3Bvd2VycGNfbW9kZWwgb3BfbW9kZWxfcnM2NDsKIGV4dGVybiBzdHJ1Y3Qgb3BfcG93ZXJwY19tb2RlbCBvcF9tb2RlbF9wb3dlcjQ7CiBleHRlcm4gc3RydWN0IG9wX3Bvd2VycGNfbW9kZWwgb3BfbW9kZWxfNzQ1MDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGFnZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWdlLmgKaW5kZXggMjM2YTkyMS4uZGY0N2JiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWdlLmgKQEAgLTEwLDcgKzEwLDYgQEAKICAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxhc20vYXNtLWNvbXBhdC5oPgogI2luY2x1ZGUgPGFzbS9rZHVtcC5oPgogCkBAIC0xOTEsOSArMTkwLDkgQEAKIAogc3RydWN0IHZtX2FyZWFfc3RydWN0OwogCit0eXBlZGVmIHN0cnVjdCBwYWdlICpwZ3RhYmxlX3Q7CisKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tZW1vcnlfbW9kZWwuaD4KICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQogI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19QQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGFnZV8zMi5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWdlXzMyLmgKaW5kZXggMTcxMTBhZi4uNjVlYTE5ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWdlXzMyLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWdlXzMyLmgKQEAgLTEsNiArMSw1IEBACiAjaWZuZGVmIF9BU01fUE9XRVJQQ19QQUdFXzMyX0gKICNkZWZpbmUgX0FTTV9QT1dFUlBDX1BBR0VfMzJfSAotI2lmZGVmIF9fS0VSTkVMX18KIAogI2RlZmluZSBWTV9EQVRBX0RFRkFVTFRfRkxBR1MJVk1fREFUQV9ERUZBVUxUX0ZMQUdTMzIKIApAQCAtMzIsNSArMzEsNCBAQAogCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX1BBR0VfMzJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWdlXzY0LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BhZ2VfNjQuaAppbmRleCA0ZWU4MmM2Li42NzgzNGVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BhZ2VfNjQuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BhZ2VfNjQuaApAQCAtMSw2ICsxLDUgQEAKICNpZm5kZWYgX0FTTV9QT1dFUlBDX1BBR0VfNjRfSAogI2RlZmluZSBfQVNNX1BPV0VSUENfUEFHRV82NF9ICi0jaWZkZWYgX19LRVJORUxfXwogCiAvKgogICogQ29weXJpZ2h0IChDKSAyMDAxIFBQQzY0IFRlYW0sIElCTSBDb3JwCkBAIC0xODMsNSArMTgyLDQgQEAKIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BhZ2UuaD4KIAotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfUEFHRV82NF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BnYWxsb2MtMzIuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGdhbGxvYy0zMi5oCmluZGV4IGMxNjJhNGMuLjU4YzA3MTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGdhbGxvYy0zMi5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGdhbGxvYy0zMi5oCkBAIC0yMiwxNyArMjIsMTkgQEAKIAkJKHBtZF92YWwoKihwbWQpKSA9IF9fcGEocHRlKSB8IF9QTURfUFJFU0VOVCkKICNkZWZpbmUgcG1kX3BvcHVsYXRlKG1tLCBwbWQsIHB0ZSkJXAogCQkocG1kX3ZhbCgqKHBtZCkpID0gKHBhZ2VfdG9fcGZuKHB0ZSkgPDwgUEFHRV9TSElGVCkgfCBfUE1EX1BSRVNFTlQpCisjZGVmaW5lIHBtZF9wZ3RhYmxlKHBtZCkgcG1kX3BhZ2UocG1kKQogI2Vsc2UKICNkZWZpbmUgcG1kX3BvcHVsYXRlX2tlcm5lbChtbSwgcG1kLCBwdGUpCVwKIAkJKHBtZF92YWwoKihwbWQpKSA9ICh1bnNpZ25lZCBsb25nKXB0ZSB8IF9QTURfUFJFU0VOVCkKICNkZWZpbmUgcG1kX3BvcHVsYXRlKG1tLCBwbWQsIHB0ZSkJXAogCQkocG1kX3ZhbCgqKHBtZCkpID0gKHVuc2lnbmVkIGxvbmcpbG93bWVtX3BhZ2VfYWRkcmVzcyhwdGUpIHwgX1BNRF9QUkVTRU5UKQorI2RlZmluZSBwbWRfcGd0YWJsZShwbWQpIHBtZF9wYWdlKHBtZCkKICNlbmRpZgogCiBleHRlcm4gcHRlX3QgKnB0ZV9hbGxvY19vbmVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpOwotZXh0ZXJuIHN0cnVjdCBwYWdlICpwdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpOworZXh0ZXJuIHBndGFibGVfdCBwdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpOwogZXh0ZXJuIHZvaWQgcHRlX2ZyZWVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdGVfdCAqcHRlKTsKLWV4dGVybiB2b2lkIHB0ZV9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgcGFnZSAqcHRlKTsKK2V4dGVybiB2b2lkIHB0ZV9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ3RhYmxlX3QgcHRlKTsKIAogI2RlZmluZSBfX3B0ZV9mcmVlX3RsYih0bGIsIHB0ZSkJcHRlX2ZyZWUoKHRsYiktPm1tLCAocHRlKSkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ2FsbG9jLTY0LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BnYWxsb2MtNjQuaAppbmRleCA1YWZhZTg1Li42ODk4MDk5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BnYWxsb2MtNjQuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BnYWxsb2MtNjQuaApAQCAtNTgsNiArNTgsNyBAQAogI2RlZmluZSBwbWRfcG9wdWxhdGUobW0sIHBtZCwgcHRlX3BhZ2UpIFwKIAlwbWRfcG9wdWxhdGVfa2VybmVsKG1tLCBwbWQsIHBhZ2VfYWRkcmVzcyhwdGVfcGFnZSkpCiAjZGVmaW5lIHBtZF9wb3B1bGF0ZV9rZXJuZWwobW0sIHBtZCwgcHRlKSBwbWRfc2V0KHBtZCwgKHVuc2lnbmVkIGxvbmcpKHB0ZSkpCisjZGVmaW5lIHBtZF9wZ3RhYmxlKHBtZCkgcG1kX3BhZ2UocG1kKQogCiAKICNlbHNlIC8qIENPTkZJR19QUENfNjRLX1BBR0VTICovCkBAIC03Miw2ICs3Myw3IEBACiAKICNkZWZpbmUgcG1kX3BvcHVsYXRlKG1tLCBwbWQsIHB0ZV9wYWdlKSBcCiAJcG1kX3BvcHVsYXRlX2tlcm5lbChtbSwgcG1kLCBwYWdlX2FkZHJlc3MocHRlX3BhZ2UpKQorI2RlZmluZSBwbWRfcGd0YWJsZShwbWQpIHBtZF9wYWdlKHBtZCkKIAogI2VuZGlmIC8qIENPTkZJR19QUENfNjRLX1BBR0VTICovCiAKQEAgLTkyLDExICs5NCwxOCBAQAogICAgICAgICByZXR1cm4gKHB0ZV90ICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9SRVBFQVQgfCBfX0dGUF9aRVJPKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqcHRlX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwKLQkJCQkJIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3N0YXRpYyBpbmxpbmUgcGd0YWJsZV90IHB0ZV9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKLQlwdGVfdCAqcHRlID0gcHRlX2FsbG9jX29uZV9rZXJuZWwobW0sIGFkZHJlc3MpOwotCXJldHVybiBwdGUgPyB2aXJ0X3RvX3BhZ2UocHRlKSA6IE5VTEw7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJcHRlX3QgKnB0ZTsKKworCXB0ZSA9IHB0ZV9hbGxvY19vbmVfa2VybmVsKG1tLCBhZGRyZXNzKTsKKwlpZiAoIXB0ZSkKKwkJcmV0dXJuIE5VTEw7CisJcGFnZSA9IHZpcnRfdG9fcGFnZShwdGUpOworCXBndGFibGVfcGFnZV9jdG9yKHBhZ2UpOworCXJldHVybiBwYWdlOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdGVfdCAqcHRlKQpAQCAtMTA0LDggKzExMyw5IEBACiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXB0ZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwdGVfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHBhZ2UgKnB0ZXBhZ2UpCitzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBndGFibGVfdCBwdGVwYWdlKQogeworCXBndGFibGVfcGFnZV9kdG9yKHB0ZXBhZ2UpOwogCV9fZnJlZV9wYWdlKHB0ZXBhZ2UpOwogfQogCkBAIC0xMzYsOSArMTQ2LDEyIEBACiAKIGV4dGVybiB2b2lkIHBndGFibGVfZnJlZV90bGIoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgcGd0YWJsZV9mcmVlX3QgcGdmKTsKIAotI2RlZmluZSBfX3B0ZV9mcmVlX3RsYih0bGIsIHB0ZXBhZ2UpCVwKKyNkZWZpbmUgX19wdGVfZnJlZV90bGIodGxiLHB0ZXBhZ2UpCVwKK2RvIHsgXAorCXBndGFibGVfcGFnZV9kdG9yKHB0ZXBhZ2UpOyBcCiAJcGd0YWJsZV9mcmVlX3RsYih0bGIsIHBndGFibGVfZnJlZV9jYWNoZShwYWdlX2FkZHJlc3MocHRlcGFnZSksIFwKLQkJUFRFX05PTkNBQ0hFX05VTSwgUFRFX1RBQkxFX1NJWkUtMSkpCisJCVBURV9OT05DQUNIRV9OVU0sIFBURV9UQUJMRV9TSVpFLTEpKTsgXAorfSB3aGlsZSAoMCkKICNkZWZpbmUgX19wbWRfZnJlZV90bGIodGxiLCBwbWQpIAlcCiAJcGd0YWJsZV9mcmVlX3RsYih0bGIsIHBndGFibGVfZnJlZV9jYWNoZShwbWQsIFwKIAkJUE1EX0NBQ0hFX05VTSwgUE1EX1RBQkxFX1NJWkUtMSkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BtYWNfZmVhdHVyZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wbWFjX2ZlYXR1cmUuaAppbmRleCAyNmJjYjBhLi44NzdjMzVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BtYWNfZmVhdHVyZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcG1hY19mZWF0dXJlLmgKQEAgLTM5Miw2ICszOTIsMTQgQEAKICNkZWZpbmUgVU5fQklTKHIsdikJKFVOX09VVCgociksIFVOX0lOKHIpIHwgKHYpKSkKICNkZWZpbmUgVU5fQklDKHIsdikJKFVOX09VVCgociksIFVOX0lOKHIpICYgfih2KSkpCiAKKy8qIFVuaW5vcnRoIHZhcmlhbnQ6CisgKgorICogMCA9IG5vdCB1bmlub3J0aAorICogMSA9IFUxLnggb3IgVTIueAorICogMyA9IFUzCisgKiA0ID0gVTQKKyAqLworZXh0ZXJuIGludCBwbWFjX2dldF91bmlub3J0aF92YXJpYW50KHZvaWQpOwogCiAjZW5kaWYgLyogX19BU01fUE9XRVJQQ19QTUFDX0ZFQVRVUkVfSCAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcG9zaXhfdHlwZXMuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcG9zaXhfdHlwZXMuaAppbmRleCAyZjIyODhmLi5jNGUzOTZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3Bvc2l4X3R5cGVzLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wb3NpeF90eXBlcy5oCkBAIC02NCw4ICs2NCw3IEBACiAKICNlbHNlIC8qIF9fR05VQ19fICovCiAKLSNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8ICFkZWZpbmVkKF9fR0xJQkNfXykgfHwgKF9fR0xJQkNfXyA8IDIpIFwKLSAgICB8fCAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID09IDApCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKQogLyogV2l0aCBHTlUgQywgdXNlIGlubGluZSBmdW5jdGlvbnMgaW5zdGVhZCBzbyBhcmdzIGFyZSBldmFsdWF0ZWQgb25seSBvbmNlOiAqLwogCiAjdW5kZWYgX19GRF9TRVQKQEAgLTEyNCw2ICsxMjMsNiBAQAogCX0KIH0KIAotI2VuZGlmIC8qIGRlZmluZWQoX19LRVJORUxfXykgfHwgIWRlZmluZWQoX19HTElCQ19fKSB8fCAoX19HTElCQ19fIDwgMikgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKF9fS0VSTkVMX18pICovCiAjZW5kaWYgLyogX19HTlVDX18gKi8KICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfUE9TSVhfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvY2Vzc29yLmgKaW5kZXggMWY0NzY1ZC4uZmQ5OGNhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Byb2Nlc3Nvci5oCkBAIC0xMTMsNiArMTEzLDI1IEBACiAJCVRBU0tfVU5NQVBQRURfQkFTRV9VU0VSMzIgOiBUQVNLX1VOTUFQUEVEX0JBU0VfVVNFUjY0ICkKICNlbmRpZgogCisjaWZkZWYgX19LRVJORUxfXworI2lmZGVmIF9fcG93ZXJwYzY0X18KKworI2RlZmluZSBTVEFDS19UT1BfVVNFUjY0IFRBU0tfU0laRV9VU0VSNjQKKyNkZWZpbmUgU1RBQ0tfVE9QX1VTRVIzMiBUQVNLX1NJWkVfVVNFUjMyCisKKyNkZWZpbmUgU1RBQ0tfVE9QICh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVCkgPyBcCisJCSAgIFNUQUNLX1RPUF9VU0VSMzIgOiBTVEFDS19UT1BfVVNFUjY0KQorCisjZGVmaW5lIFNUQUNLX1RPUF9NQVggU1RBQ0tfVE9QX1VTRVI2NAorCisjZWxzZSAvKiBfX3Bvd2VycGM2NF9fICovCisKKyNkZWZpbmUgU1RBQ0tfVE9QIFRBU0tfU0laRQorI2RlZmluZSBTVEFDS19UT1BfTUFYCVNUQUNLX1RPUAorCisjZW5kaWYgLyogX19wb3dlcnBjNjRfXyAqLworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKwogdHlwZWRlZiBzdHJ1Y3QgewogCXVuc2lnbmVkIGxvbmcgc2VnOwogfSBtbV9zZWdtZW50X3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3B0cmFjZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wdHJhY2UuaAppbmRleCBmZmMxNTBmLi44OTFkNjg5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3B0cmFjZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHRyYWNlLmgKQEAgLTU1LDYgKzU1LDggQEAKIAogI2lmZGVmIF9fcG93ZXJwYzY0X18KIAorI2RlZmluZSBfX0FSQ0hfV0FOVF9DT01QQVRfU1lTX1BUUkFDRQorCiAjZGVmaW5lIFNUQUNLX0ZSQU1FX09WRVJIRUFECTExMgkvKiBzaXplIG9mIG1pbmltdW0gc3RhY2sgZnJhbWUgKi8KIAogLyogU2l6ZSBvZiBkdW1teSBzdGFjayBmcmFtZSBhbGxvY2F0ZWQgd2hlbiBjYWxsaW5nIHNpZ25hbCBoYW5kbGVyLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9yZWcuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcmVnLmgKaW5kZXggMjQwOGEyOS4uMGQ2MjM4OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9yZWcuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3JlZy5oCkBAIC0xOCw2ICsxOCwxMCBAQAogI2luY2x1ZGUgPGFzbS9yZWdfYm9va2UuaD4KICNlbmRpZiAvKiBDT05GSUdfQk9PS0UgfHwgQ09ORklHXzQweCAqLwogCisjaWZkZWYgQ09ORklHX0ZTTF9FTUJfUEVSRk1PTgorI2luY2x1ZGUgPGFzbS9yZWdfZnNsX2VtYi5oPgorI2VuZGlmCisKICNpZmRlZiBDT05GSUdfOHh4CiAjaW5jbHVkZSA8YXNtL3JlZ184eHguaD4KICNlbmRpZiAvKiBDT05GSUdfOHh4ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3JlZ19ib29rZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9yZWdfYm9va2UuaAppbmRleCAwNDA1ZWY0Li5jZjU0YTNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3JlZ19ib29rZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcmVnX2Jvb2tlLmgKQEAgLTksNjggKzksNiBAQAogI2lmbmRlZiBfX0FTTV9QT1dFUlBDX1JFR19CT09LRV9IX18KICNkZWZpbmUgX19BU01fUE9XRVJQQ19SRUdfQk9PS0VfSF9fCiAKLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0vKiBQZXJmb3JtYW5jZSBNb25pdG9yIFJlZ2lzdGVycyAqLwotI2RlZmluZSBtZnBtcihybikJKHt1bnNpZ25lZCBpbnQgcnZhbDsgXAotCQkJYXNtIHZvbGF0aWxlKCJtZnBtciAlMCwiIF9fc3RyaW5naWZ5KHJuKSBcCi0JCQkJICAgICA6ICI9ciIgKHJ2YWwpKTsgcnZhbDt9KQotI2RlZmluZSBtdHBtcihybiwgdikJYXNtIHZvbGF0aWxlKCJtdHBtciAiIF9fc3RyaW5naWZ5KHJuKSAiLCUwIiA6IDogInIiICh2KSkKLSNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KLQotLyogRnJlZXNjYWxlIEJvb2sgRSBQZXJmb3JtYW5jZSBNb25pdG9yIEFQVSBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgUE1STl9QTUMwCTB4MDEwCS8qIFBlcmZvcm1hbmNlIE1vbml0b3IgQ291bnRlciAwICovCi0jZGVmaW5lIFBNUk5fUE1DMQkweDAxMQkvKiBQZXJmb3JtYW5jZSBNb25pdG9yIENvdW50ZXIgMSAqLwotI2RlZmluZSBQTVJOX1BNQzIJMHgwMTIJLyogUGVyZm9ybWFuY2UgTW9uaXRvciBDb3VudGVyIDEgKi8KLSNkZWZpbmUgUE1STl9QTUMzCTB4MDEzCS8qIFBlcmZvcm1hbmNlIE1vbml0b3IgQ291bnRlciAxICovCi0jZGVmaW5lIFBNUk5fUE1MQ0EwCTB4MDkwCS8qIFBNIExvY2FsIENvbnRyb2wgQTAgKi8KLSNkZWZpbmUgUE1STl9QTUxDQTEJMHgwOTEJLyogUE0gTG9jYWwgQ29udHJvbCBBMSAqLwotI2RlZmluZSBQTVJOX1BNTENBMgkweDA5MgkvKiBQTSBMb2NhbCBDb250cm9sIEEyICovCi0jZGVmaW5lIFBNUk5fUE1MQ0EzCTB4MDkzCS8qIFBNIExvY2FsIENvbnRyb2wgQTMgKi8KLQotI2RlZmluZSBQTUxDQV9GQwkweDgwMDAwMDAwCS8qIEZyZWV6ZSBDb3VudGVyICovCi0jZGVmaW5lIFBNTENBX0ZDUwkweDQwMDAwMDAwCS8qIEZyZWV6ZSBpbiBTdXBlcnZpc29yICovCi0jZGVmaW5lIFBNTENBX0ZDVQkweDIwMDAwMDAwCS8qIEZyZWV6ZSBpbiBVc2VyICovCi0jZGVmaW5lIFBNTENBX0ZDTTEJMHgxMDAwMDAwMAkvKiBGcmVlemUgd2hlbiBQTU09PTEgKi8KLSNkZWZpbmUgUE1MQ0FfRkNNMAkweDA4MDAwMDAwCS8qIEZyZWV6ZSB3aGVuIFBNTT09MCAqLwotI2RlZmluZSBQTUxDQV9DRQkweDA0MDAwMDAwCS8qIENvbmRpdGlvbiBFbmFibGUgKi8KLQotI2RlZmluZSBQTUxDQV9FVkVOVF9NQVNLIDB4MDA3ZjAwMDAJLyogRXZlbnQgZmllbGQgKi8KLSNkZWZpbmUgUE1MQ0FfRVZFTlRfU0hJRlQJMTYKLQotI2RlZmluZSBQTVJOX1BNTENCMAkweDExMAkvKiBQTSBMb2NhbCBDb250cm9sIEIwICovCi0jZGVmaW5lIFBNUk5fUE1MQ0IxCTB4MTExCS8qIFBNIExvY2FsIENvbnRyb2wgQjEgKi8KLSNkZWZpbmUgUE1STl9QTUxDQjIJMHgxMTIJLyogUE0gTG9jYWwgQ29udHJvbCBCMiAqLwotI2RlZmluZSBQTVJOX1BNTENCMwkweDExMwkvKiBQTSBMb2NhbCBDb250cm9sIEIzICovCi0KLSNkZWZpbmUgUE1MQ0JfVEhSRVNITVVMX01BU0sJMHgwNzAwCS8qIFRocmVzaGhvbGQgTXVsdGlwbGUgRmllbGQgKi8KLSNkZWZpbmUgUE1MQ0JfVEhSRVNITVVMX1NISUZUCTgKLQotI2RlZmluZSBQTUxDQl9USFJFU0hPTERfTUFTSwkweDAwM2YJLyogVGhyZXNob2xkIEZpZWxkICovCi0jZGVmaW5lIFBNTENCX1RIUkVTSE9MRF9TSElGVAkwCi0KLSNkZWZpbmUgUE1STl9QTUdDMAkweDE5MAkvKiBQTSBHbG9iYWwgQ29udHJvbCAwICovCi0KLSNkZWZpbmUgUE1HQzBfRkFDCTB4ODAwMDAwMDAJLyogRnJlZXplIGFsbCBDb3VudGVycyAqLwotI2RlZmluZSBQTUdDMF9QTUlFCTB4NDAwMDAwMDAJLyogSW50ZXJydXB0IEVuYWJsZSAqLwotI2RlZmluZSBQTUdDMF9GQ0VDRQkweDIwMDAwMDAwCS8qIEZyZWV6ZSBjb3VudGVzIG9uCi0JCQkJCSAgIEVuYWJsZWQgQ29uZGl0aW9uIG9yCi0JCQkJCSAgIEV2ZW50ICovCi0KLSNkZWZpbmUgUE1STl9VUE1DMAkweDAwMAkvKiBVc2VyIFBlcmZvcm1hbmNlIE1vbml0b3IgQ291bnRlciAwICovCi0jZGVmaW5lIFBNUk5fVVBNQzEJMHgwMDEJLyogVXNlciBQZXJmb3JtYW5jZSBNb25pdG9yIENvdW50ZXIgMSAqLwotI2RlZmluZSBQTVJOX1VQTUMyCTB4MDAyCS8qIFVzZXIgUGVyZm9ybWFuY2UgTW9uaXRvciBDb3VudGVyIDEgKi8KLSNkZWZpbmUgUE1STl9VUE1DMwkweDAwMwkvKiBVc2VyIFBlcmZvcm1hbmNlIE1vbml0b3IgQ291bnRlciAxICovCi0jZGVmaW5lIFBNUk5fVVBNTENBMAkweDA4MAkvKiBVc2VyIFBNIExvY2FsIENvbnRyb2wgQTAgKi8KLSNkZWZpbmUgUE1STl9VUE1MQ0ExCTB4MDgxCS8qIFVzZXIgUE0gTG9jYWwgQ29udHJvbCBBMSAqLwotI2RlZmluZSBQTVJOX1VQTUxDQTIJMHgwODIJLyogVXNlciBQTSBMb2NhbCBDb250cm9sIEEyICovCi0jZGVmaW5lIFBNUk5fVVBNTENBMwkweDA4MwkvKiBVc2VyIFBNIExvY2FsIENvbnRyb2wgQTMgKi8KLSNkZWZpbmUgUE1STl9VUE1MQ0IwCTB4MTAwCS8qIFVzZXIgUE0gTG9jYWwgQ29udHJvbCBCMCAqLwotI2RlZmluZSBQTVJOX1VQTUxDQjEJMHgxMDEJLyogVXNlciBQTSBMb2NhbCBDb250cm9sIEIxICovCi0jZGVmaW5lIFBNUk5fVVBNTENCMgkweDEwMgkvKiBVc2VyIFBNIExvY2FsIENvbnRyb2wgQjIgKi8KLSNkZWZpbmUgUE1STl9VUE1MQ0IzCTB4MTAzCS8qIFVzZXIgUE0gTG9jYWwgQ29udHJvbCBCMyAqLwotI2RlZmluZSBQTVJOX1VQTUdDMAkweDE4MAkvKiBVc2VyIFBNIEdsb2JhbCBDb250cm9sIDAgKi8KLQotCiAvKiBNYWNoaW5lIFN0YXRlIFJlZ2lzdGVyIChNU1IpIEZpZWxkcyAqLwogI2RlZmluZSBNU1JfVUNMRQkoMTw8MjYpCS8qIFVzZXItbW9kZSBjYWNoZSBsb2NrIGVuYWJsZSAqLwogI2RlZmluZSBNU1JfU1BFCQkoMTw8MjUpCS8qIEVuYWJsZSBTUEUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcmVnX2ZzbF9lbWIuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcmVnX2ZzbF9lbWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTE4MGE1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9yZWdfZnNsX2VtYi5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb250YWlucyByZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgdGhlIEZyZWVzY2FsZSBFbWJlZGRlZCBQZXJmb3JtYW5jZQorICogTW9uaXRvci4KKyAqLworI2lmZGVmIF9fS0VSTkVMX18KKyNpZm5kZWYgX19BU01fUE9XRVJQQ19SRUdfRlNMX0VNQl9IX18KKyNkZWZpbmUgX19BU01fUE9XRVJQQ19SRUdfRlNMX0VNQl9IX18KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKy8qIFBlcmZvcm1hbmNlIE1vbml0b3IgUmVnaXN0ZXJzICovCisjZGVmaW5lIG1mcG1yKHJuKQkoe3Vuc2lnbmVkIGludCBydmFsOyBcCisJCQlhc20gdm9sYXRpbGUoIm1mcG1yICUwLCIgX19zdHJpbmdpZnkocm4pIFwKKwkJCQkgICAgIDogIj1yIiAocnZhbCkpOyBydmFsO30pCisjZGVmaW5lIG10cG1yKHJuLCB2KQlhc20gdm9sYXRpbGUoIm10cG1yICIgX19zdHJpbmdpZnkocm4pICIsJTAiIDogOiAiciIgKHYpKQorI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisvKiBGcmVlc2NhbGUgQm9vayBFIFBlcmZvcm1hbmNlIE1vbml0b3IgQVBVIFJlZ2lzdGVycyAqLworI2RlZmluZSBQTVJOX1BNQzAJMHgwMTAJLyogUGVyZm9ybWFuY2UgTW9uaXRvciBDb3VudGVyIDAgKi8KKyNkZWZpbmUgUE1STl9QTUMxCTB4MDExCS8qIFBlcmZvcm1hbmNlIE1vbml0b3IgQ291bnRlciAxICovCisjZGVmaW5lIFBNUk5fUE1DMgkweDAxMgkvKiBQZXJmb3JtYW5jZSBNb25pdG9yIENvdW50ZXIgMSAqLworI2RlZmluZSBQTVJOX1BNQzMJMHgwMTMJLyogUGVyZm9ybWFuY2UgTW9uaXRvciBDb3VudGVyIDEgKi8KKyNkZWZpbmUgUE1STl9QTUxDQTAJMHgwOTAJLyogUE0gTG9jYWwgQ29udHJvbCBBMCAqLworI2RlZmluZSBQTVJOX1BNTENBMQkweDA5MQkvKiBQTSBMb2NhbCBDb250cm9sIEExICovCisjZGVmaW5lIFBNUk5fUE1MQ0EyCTB4MDkyCS8qIFBNIExvY2FsIENvbnRyb2wgQTIgKi8KKyNkZWZpbmUgUE1STl9QTUxDQTMJMHgwOTMJLyogUE0gTG9jYWwgQ29udHJvbCBBMyAqLworCisjZGVmaW5lIFBNTENBX0ZDCTB4ODAwMDAwMDAJLyogRnJlZXplIENvdW50ZXIgKi8KKyNkZWZpbmUgUE1MQ0FfRkNTCTB4NDAwMDAwMDAJLyogRnJlZXplIGluIFN1cGVydmlzb3IgKi8KKyNkZWZpbmUgUE1MQ0FfRkNVCTB4MjAwMDAwMDAJLyogRnJlZXplIGluIFVzZXIgKi8KKyNkZWZpbmUgUE1MQ0FfRkNNMQkweDEwMDAwMDAwCS8qIEZyZWV6ZSB3aGVuIFBNTT09MSAqLworI2RlZmluZSBQTUxDQV9GQ00wCTB4MDgwMDAwMDAJLyogRnJlZXplIHdoZW4gUE1NPT0wICovCisjZGVmaW5lIFBNTENBX0NFCTB4MDQwMDAwMDAJLyogQ29uZGl0aW9uIEVuYWJsZSAqLworCisjZGVmaW5lIFBNTENBX0VWRU5UX01BU0sgMHgwMDdmMDAwMAkvKiBFdmVudCBmaWVsZCAqLworI2RlZmluZSBQTUxDQV9FVkVOVF9TSElGVAkxNgorCisjZGVmaW5lIFBNUk5fUE1MQ0IwCTB4MTEwCS8qIFBNIExvY2FsIENvbnRyb2wgQjAgKi8KKyNkZWZpbmUgUE1STl9QTUxDQjEJMHgxMTEJLyogUE0gTG9jYWwgQ29udHJvbCBCMSAqLworI2RlZmluZSBQTVJOX1BNTENCMgkweDExMgkvKiBQTSBMb2NhbCBDb250cm9sIEIyICovCisjZGVmaW5lIFBNUk5fUE1MQ0IzCTB4MTEzCS8qIFBNIExvY2FsIENvbnRyb2wgQjMgKi8KKworI2RlZmluZSBQTUxDQl9USFJFU0hNVUxfTUFTSwkweDA3MDAJLyogVGhyZXNoaG9sZCBNdWx0aXBsZSBGaWVsZCAqLworI2RlZmluZSBQTUxDQl9USFJFU0hNVUxfU0hJRlQJOAorCisjZGVmaW5lIFBNTENCX1RIUkVTSE9MRF9NQVNLCTB4MDAzZgkvKiBUaHJlc2hvbGQgRmllbGQgKi8KKyNkZWZpbmUgUE1MQ0JfVEhSRVNIT0xEX1NISUZUCTAKKworI2RlZmluZSBQTVJOX1BNR0MwCTB4MTkwCS8qIFBNIEdsb2JhbCBDb250cm9sIDAgKi8KKworI2RlZmluZSBQTUdDMF9GQUMJMHg4MDAwMDAwMAkvKiBGcmVlemUgYWxsIENvdW50ZXJzICovCisjZGVmaW5lIFBNR0MwX1BNSUUJMHg0MDAwMDAwMAkvKiBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIFBNR0MwX0ZDRUNFCTB4MjAwMDAwMDAJLyogRnJlZXplIGNvdW50ZXMgb24KKwkJCQkJICAgRW5hYmxlZCBDb25kaXRpb24gb3IKKwkJCQkJICAgRXZlbnQgKi8KKworI2RlZmluZSBQTVJOX1VQTUMwCTB4MDAwCS8qIFVzZXIgUGVyZm9ybWFuY2UgTW9uaXRvciBDb3VudGVyIDAgKi8KKyNkZWZpbmUgUE1STl9VUE1DMQkweDAwMQkvKiBVc2VyIFBlcmZvcm1hbmNlIE1vbml0b3IgQ291bnRlciAxICovCisjZGVmaW5lIFBNUk5fVVBNQzIJMHgwMDIJLyogVXNlciBQZXJmb3JtYW5jZSBNb25pdG9yIENvdW50ZXIgMSAqLworI2RlZmluZSBQTVJOX1VQTUMzCTB4MDAzCS8qIFVzZXIgUGVyZm9ybWFuY2UgTW9uaXRvciBDb3VudGVyIDEgKi8KKyNkZWZpbmUgUE1STl9VUE1MQ0EwCTB4MDgwCS8qIFVzZXIgUE0gTG9jYWwgQ29udHJvbCBBMCAqLworI2RlZmluZSBQTVJOX1VQTUxDQTEJMHgwODEJLyogVXNlciBQTSBMb2NhbCBDb250cm9sIEExICovCisjZGVmaW5lIFBNUk5fVVBNTENBMgkweDA4MgkvKiBVc2VyIFBNIExvY2FsIENvbnRyb2wgQTIgKi8KKyNkZWZpbmUgUE1STl9VUE1MQ0EzCTB4MDgzCS8qIFVzZXIgUE0gTG9jYWwgQ29udHJvbCBBMyAqLworI2RlZmluZSBQTVJOX1VQTUxDQjAJMHgxMDAJLyogVXNlciBQTSBMb2NhbCBDb250cm9sIEIwICovCisjZGVmaW5lIFBNUk5fVVBNTENCMQkweDEwMQkvKiBVc2VyIFBNIExvY2FsIENvbnRyb2wgQjEgKi8KKyNkZWZpbmUgUE1STl9VUE1MQ0IyCTB4MTAyCS8qIFVzZXIgUE0gTG9jYWwgQ29udHJvbCBCMiAqLworI2RlZmluZSBQTVJOX1VQTUxDQjMJMHgxMDMJLyogVXNlciBQTSBMb2NhbCBDb250cm9sIEIzICovCisjZGVmaW5lIFBNUk5fVVBNR0MwCTB4MTgwCS8qIFVzZXIgUE0gR2xvYmFsIENvbnRyb2wgMCAqLworCisKKyNlbmRpZiAvKiBfX0FTTV9QT1dFUlBDX1JFR19GU0xfRU1CX0hfXyAqLworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3N5c3RlbS5oCmluZGV4IGJjOTczOWQuLjI5NTUyZmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXN0ZW0uaApAQCAtNjUsNyArNjUsNyBAQAogc3RydWN0IHRhc2tfc3RydWN0Owogc3RydWN0IHB0X3JlZ3M7CiAKLSNpZmRlZiBDT05GSUdfREVCVUdHRVIKKyNpZiBkZWZpbmVkKENPTkZJR19ERUJVR0dFUikgfHwgZGVmaW5lZChDT05GSUdfS0VYRUMpCiAKIGV4dGVybiBpbnQgKCpfX2RlYnVnZ2VyKShzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBleHRlcm4gaW50ICgqX19kZWJ1Z2dlcl9pcGkpKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKQEAgLTQ2Myw3ICs0NjMsNyBAQAogCXJldHVybiBvbGQ7CiB9CiAKLSNkZWZpbmUgY21weGNoZyhwdHIsbyxuKQkJCQkJCSBcCisjZGVmaW5lIGNtcHhjaGcocHRyLCBvLCBuKQkJCQkJCSBcCiAgICh7CQkJCQkJCQkJIFwKICAgICAgX190eXBlb2ZfXygqKHB0cikpIF9vXyA9IChvKTsJCQkJCSBcCiAgICAgIF9fdHlwZW9mX18oKihwdHIpKSBfbl8gPSAobik7CQkJCQkgXApAQCAtNDcyLDcgKzQ3Miw3IEBACiAgIH0pCiAKIAotI2RlZmluZSBjbXB4Y2hnX2xvY2FsKHB0cixvLG4pCQkJCQkJIFwKKyNkZWZpbmUgY21weGNoZ19sb2NhbChwdHIsIG8sIG4pCQkJCQkgXAogICAoewkJCQkJCQkJCSBcCiAgICAgIF9fdHlwZW9mX18oKihwdHIpKSBfb18gPSAobyk7CQkJCQkgXAogICAgICBfX3R5cGVvZl9fKCoocHRyKSkgX25fID0gKG4pOwkJCQkJIFwKQEAgLTQ5Miw2ICs0OTIsMjAgQEAKICAqLwogI2RlZmluZSBORVRfSVBfQUxJR04JMAogI2RlZmluZSBORVRfU0tCX1BBRAlMMV9DQUNIRV9CWVRFUworCisjZGVmaW5lIGNtcHhjaGc2NChwdHIsIG8sIG4pCQkJCQkJXAorICAoewkJCQkJCQkJCVwKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKCoocHRyKSkgIT0gOCk7CQkJCVwKKwljbXB4Y2hnKChwdHIpLCAobyksIChuKSk7CQkJCQlcCisgIH0pCisjZGVmaW5lIGNtcHhjaGc2NF9sb2NhbChwdHIsIG8sIG4pCQkJCQlcCisgICh7CQkJCQkJCQkJXAorCUJVSUxEX0JVR19PTihzaXplb2YoKihwdHIpKSAhPSA4KTsJCQkJXAorCWNtcHhjaGdfbG9jYWwoKHB0ciksIChvKSwgKG4pKTsJCQkJCVwKKyAgfSkKKyNlbHNlCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvY21weGNoZy1sb2NhbC5oPgorI2RlZmluZSBjbXB4Y2hnNjRfbG9jYWwocHRyLCBvLCBuKSBfX2NtcHhjaGc2NF9sb2NhbF9nZW5lcmljKChwdHIpLCAobyksIChuKSkKICNlbmRpZgogCiAjZGVmaW5lIGFyY2hfYWxpZ25fc3RhY2soeCkgKHgpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3VzZXIuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdXNlci5oCmluZGV4IGU1OWFkZTQuLjNmZDQ1NDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdXNlci5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdXNlci5oCkBAIC0xLDggKzEsNiBAQAogI2lmbmRlZiBfQVNNX1BPV0VSUENfVVNFUl9ICiAjZGVmaW5lIF9BU01fUE9XRVJQQ19VU0VSX0gKIAotI2lmZGVmIF9fS0VSTkVMX18KLQogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogCkBAIC00MCw3ICszOCw3IEBACiAJdW5zaWduZWQgbG9uZwlzdGFydF9kYXRhOwkJLyogZGF0YSBzdGFydGluZyBhZGRyZXNzICovCiAJdW5zaWduZWQgbG9uZwlzdGFydF9zdGFjazsJCS8qIHN0YWNrIHN0YXJ0aW5nIGFkZHJlc3MgKi8KIAlsb25nIGludAlzaWduYWw7CQkJLyogc2lnbmFsIGNhdXNpbmcgY29yZSBkdW1wICovCi0Jc3RydWN0IHJlZ3MgKgl1X2FyMDsJCQkvKiBoZWxwIGdkYiBmaW5kIHJlZ2lzdGVycyAqLworCXVuc2lnbmVkIGxvbmcJdV9hcjA7CQkJLyogaGVscCBnZGIgZmluZCByZWdpc3RlcnMgKi8KIAl1bnNpZ25lZCBsb25nCW1hZ2ljOwkJCS8qIGlkZW50aWZpZXMgYSBjb3JlIGZpbGUgKi8KIAljaGFyCQl1X2NvbW1bMzJdOwkJLyogdXNlciBjb21tYW5kIG5hbWUgKi8KIH07CkBAIC01MCw2ICs0OCw0IEBACiAjZGVmaW5lIEhPU1RfVEVYVF9TVEFSVF9BRERSCSh1LnN0YXJ0X2NvZGUpCiAjZGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSCSh1LnN0YXJ0X2RhdGEpCiAjZGVmaW5lIEhPU1RfU1RBQ0tfRU5EX0FERFIJKHUuc3RhcnRfc3RhY2sgKyB1LnVfc3NpemUgKiBOQlBHKQotCi0jZW5kaWYJLyogX19LRVJORUxfXyAqLwogI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19VU0VSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdmlvLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Zpby5oCmluZGV4IDkyMDRjMTUuLjU2NTEyYTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdmlvLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy92aW8uaApAQCAtNjYsNyArNjYsNyBAQAogCiBzdHJ1Y3QgZGV2aWNlX25vZGU7CiAKLWV4dGVybiBzdHJ1Y3QgdmlvX2RldiAqIF9fZGV2aW5pdCB2aW9fcmVnaXN0ZXJfZGV2aWNlX25vZGUoCitleHRlcm4gc3RydWN0IHZpb19kZXYgKnZpb19yZWdpc3Rlcl9kZXZpY2Vfbm9kZSgKIAkJc3RydWN0IGRldmljZV9ub2RlICpub2RlX3ZkZXYpOwogZXh0ZXJuIGNvbnN0IHZvaWQgKnZpb19nZXRfYXR0cmlidXRlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2LCBjaGFyICp3aGljaCwKIAkJaW50ICpsZW5ndGgpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL3BnYWxsb2MuaCBiL2luY2x1ZGUvYXNtLXBwYy9wZ2FsbG9jLmgKaW5kZXggN2MzOWE5NS4uZmQ0ZDFkNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3BnYWxsb2MuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvcGdhbGxvYy5oCkBAIC0yMywxNyArMjMsMTkgQEAKIAkJKHBtZF92YWwoKihwbWQpKSA9IF9fcGEocHRlKSB8IF9QTURfUFJFU0VOVCkKICNkZWZpbmUgcG1kX3BvcHVsYXRlKG1tLCBwbWQsIHB0ZSkJXAogCQkocG1kX3ZhbCgqKHBtZCkpID0gKHBhZ2VfdG9fcGZuKHB0ZSkgPDwgUEFHRV9TSElGVCkgfCBfUE1EX1BSRVNFTlQpCisjZGVmaW5lIHBtZF9wZ3RhYmxlKHBtZCkgcG1kX3BhZ2UocG1kKQogI2Vsc2UKICNkZWZpbmUgcG1kX3BvcHVsYXRlX2tlcm5lbChtbSwgcG1kLCBwdGUpCVwKIAkJKHBtZF92YWwoKihwbWQpKSA9ICh1bnNpZ25lZCBsb25nKXB0ZSB8IF9QTURfUFJFU0VOVCkKICNkZWZpbmUgcG1kX3BvcHVsYXRlKG1tLCBwbWQsIHB0ZSkJXAogCQkocG1kX3ZhbCgqKHBtZCkpID0gKHVuc2lnbmVkIGxvbmcpbG93bWVtX3BhZ2VfYWRkcmVzcyhwdGUpIHwgX1BNRF9QUkVTRU5UKQorI2RlZmluZSBwbWRfcGd0YWJsZShwbWQpIHBtZF9wYWdlKHBtZCkKICNlbmRpZgogCiBleHRlcm4gcHRlX3QgKnB0ZV9hbGxvY19vbmVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpOwotZXh0ZXJuIHN0cnVjdCBwYWdlICpwdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpOworZXh0ZXJuIHBndGFibGVfdCBwdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpOwogZXh0ZXJuIHZvaWQgcHRlX2ZyZWVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdGVfdCAqcHRlKTsKLWV4dGVybiB2b2lkIHB0ZV9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgcGFnZSAqcHRlKTsKK2V4dGVybiB2b2lkIHB0ZV9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ3RhYmxlX3QgcHRlKTsKIAogI2RlZmluZSBfX3B0ZV9mcmVlX3RsYih0bGIsIHB0ZSkJcHRlX2ZyZWUoKHRsYiktPm1tLCAocHRlKSkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tcHBjL3N5c3RlbS5oCmluZGV4IDUxZGY5NGMuLjA1OTNjYjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvc3lzdGVtLmgKQEAgLTIwOSwxMiArMjA5LDM0IEBACiAJcmV0dXJuIHByZXY7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworX19jbXB4Y2hnX3UzMl9sb2NhbCh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKnAsIHVuc2lnbmVkIGludCBvbGQsCisJdW5zaWduZWQgaW50IG5ldykKK3sKKwl1bnNpZ25lZCBpbnQgcHJldjsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgiXG5cCisxOglsd2FyeAklMCwwLCUyIFxuXAorCWNtcHcJMCwlMCwlMyBcblwKKwlibmUJMmYgXG4iCisJUFBDNDA1X0VSUjc3KDAsJTIpCisiCXN0d2N4LgklNCwwLCUyIFxuXAorCWJuZS0JMWJcbiIKKyIyOiIKKwk6ICI9JnIiIChwcmV2KSwgIj1tIiAoKnApCisJOiAiciIgKHApLCAiciIgKG9sZCksICJyIiAobmV3KSwgIm0iICgqcCkKKwk6ICJjYyIsICJtZW1vcnkiKTsKKworCXJldHVybiBwcmV2OworfQorCiAvKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgZXhpc3QsIHNvIHlvdSdsbCBnZXQgYSBsaW5rZXIgZXJyb3IKICAgIGlmIHNvbWV0aGluZyB0cmllcyB0byBkbyBhbiBpbnZhbGlkIGNtcHhjaGcoKS4gICovCiBleHRlcm4gdm9pZCBfX2NtcHhjaGdfY2FsbGVkX3dpdGhfYmFkX3BvaW50ZXIodm9pZCk7CiAKIHN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcKLV9fY21weGNoZyh2b2xhdGlsZSB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgb2xkLCB1bnNpZ25lZCBsb25nIG5ldywgaW50IHNpemUpCitfX2NtcHhjaGcodm9sYXRpbGUgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIG9sZCwgdW5zaWduZWQgbG9uZyBuZXcsCisJdW5zaWduZWQgaW50IHNpemUpCiB7CiAJc3dpdGNoIChzaXplKSB7CiAJY2FzZSA0OgpAQCAtMjI4LDcgKzI1MCw3IEBACiAJcmV0dXJuIG9sZDsKIH0KIAotI2RlZmluZSBjbXB4Y2hnKHB0cixvLG4pCQkJCQkJIFwKKyNkZWZpbmUgY21weGNoZyhwdHIsIG8sIG4pCQkJCQkJIFwKICAgKHsJCQkJCQkJCQkgXAogICAgICBfX3R5cGVvZl9fKCoocHRyKSkgX29fID0gKG8pOwkJCQkJIFwKICAgICAgX190eXBlb2ZfXygqKHB0cikpIF9uXyA9IChuKTsJCQkJCSBcCkBAIC0yMzYsNiArMjU4LDMxIEBACiAJCQkJICAgICh1bnNpZ25lZCBsb25nKV9uXywgc2l6ZW9mKCoocHRyKSkpOyBcCiAgIH0pCiAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jbXB4Y2hnLWxvY2FsLmg+CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2NtcHhjaGdfbG9jYWwodm9sYXRpbGUgdm9pZCAqcHRyLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2xkLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbmV3LCBpbnQgc2l6ZSkKK3sKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIDQ6CisJCXJldHVybiBfX2NtcHhjaGdfdTMyX2xvY2FsKHB0ciwgb2xkLCBuZXcpOworCWRlZmF1bHQ6CisJCXJldHVybiBfX2NtcHhjaGdfbG9jYWxfZ2VuZXJpYyhwdHIsIG9sZCwgbmV3LCBzaXplKTsKKwl9CisKKwlyZXR1cm4gb2xkOworfQorCisvKgorICogY21weGNoZ19sb2NhbCBhbmQgY21weGNoZzY0X2xvY2FsIGFyZSBhdG9taWMgd3J0IGN1cnJlbnQgQ1BVLiBBbHdheXMgbWFrZQorICogdGhlbSBhdmFpbGFibGUuCisgKi8KKyNkZWZpbmUgY21weGNoZ19sb2NhbChwdHIsIG8sIG4pCQkJCSAgCVwKKwkoKF9fdHlwZW9mX18oKihwdHIpKSlfX2NtcHhjaGdfbG9jYWwoKHB0ciksICh1bnNpZ25lZCBsb25nKShvKSwJXAorCQkJKHVuc2lnbmVkIGxvbmcpKG4pLCBzaXplb2YoKihwdHIpKSkpCisjZGVmaW5lIGNtcHhjaGc2NF9sb2NhbChwdHIsIG8sIG4pIF9fY21weGNoZzY0X2xvY2FsX2dlbmVyaWMoKHB0ciksIChvKSwgKG4pKQorCiAjZGVmaW5lIGFyY2hfYWxpZ25fc3RhY2soeCkgKHgpCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL2Eub3V0LmggYi9pbmNsdWRlL2FzbS1zMzkwL2Eub3V0LmgKaW5kZXggNDYxNThkYy4uOGQ2YmQ5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9hLm91dC5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvYS5vdXQuaApAQCAtMjksMTEgKzI5LDQgQEAKICNkZWZpbmUgTl9EUlNJWkUoYSkJKChhKS5hX2Ryc2l6ZSkKICNkZWZpbmUgTl9TWU1TSVpFKGEpCSgoYSkuYV9zeW1zKQogCi0jaWZkZWYgX19LRVJORUxfXwotCi0jZGVmaW5lIFNUQUNLX1RPUAlUQVNLX1NJWkUKLSNkZWZpbmUgU1RBQ0tfVE9QX01BWAlERUZBVUxUX1RBU0tfU0laRQotCi0jZW5kaWYKLQogI2VuZGlmIC8qIF9fQV9PVVRfR05VX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9lbGYuaCBiL2luY2x1ZGUvYXNtLXMzOTAvZWxmLmgKaW5kZXggOTFkMDYzMi4uYjczYTQyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9lbGYuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL2VsZi5oCkBAIC0xMTMsNyArMTEzLDYgQEAKIHR5cGVkZWYgczM5MF9mcF9yZWdzIGVsZl9mcHJlZ3NldF90OwogdHlwZWRlZiBzMzkwX3JlZ3MgZWxmX2dyZWdzZXRfdDsKIAotI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgkvKiBmb3IgdGFza19zdHJ1Y3QgKi8KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CQkvKiBmb3Igc2F2ZV9hY2Nlc3NfcmVncyAqLwogCkBAIC0yMTQsNiArMjEzLDUgQEAKIAljbGVhcl90aHJlYWRfZmxhZyhUSUZfMzFCSVQpOwkJCVwKIH0gd2hpbGUgKDApCiAjZW5kaWYgLyogX19zMzkweF9fICovCi0jZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL2lvY3Rscy5oIGIvaW5jbHVkZS9hc20tczM5MC9pb2N0bHMuaAppbmRleCAwN2UxOWIyLi40MGU0ODFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL2lvY3Rscy5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvaW9jdGxzLmgKQEAgLTU0LDYgKzU0LDEwIEBACiAjZGVmaW5lIFRJT0NTQlJLCTB4NTQyNyAgLyogQlNEIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgVElPQ0NCUksJMHg1NDI4ICAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLwogI2RlZmluZSBUSU9DR1NJRAkweDU0MjkgIC8qIFJldHVybiB0aGUgc2Vzc2lvbiBJRCBvZiBGRCAqLworI2RlZmluZSBUQ0dFVFMyCQlfSU9SKCdUJywweDJBLCBzdHJ1Y3QgdGVybWlvczIpCisjZGVmaW5lIFRDU0VUUzIJCV9JT1coJ1QnLDB4MkIsIHN0cnVjdCB0ZXJtaW9zMikKKyNkZWZpbmUgVENTRVRTVzIJX0lPVygnVCcsMHgyQywgc3RydWN0IHRlcm1pb3MyKQorI2RlZmluZSBUQ1NFVFNGMglfSU9XKCdUJywweDJELCBzdHJ1Y3QgdGVybWlvczIpCiAjZGVmaW5lIFRJT0NHUFROCV9JT1IoJ1QnLDB4MzAsIHVuc2lnbmVkIGludCkgLyogR2V0IFB0eSBOdW1iZXIgKG9mIHB0eS1tdXggZGV2aWNlKSAqLwogI2RlZmluZSBUSU9DU1BUTENLCV9JT1coJ1QnLDB4MzEsIGludCkgIC8qIExvY2svdW5sb2NrIFB0eSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL2tleGVjLmggYi9pbmNsdWRlL2FzbS1zMzkwL2tleGVjLmgKaW5kZXggNzU5MmFmNy4uZjIxOWM2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9rZXhlYy5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAva2V4ZWMuaApAQCAtMTAsNyArMTAsOSBAQAogI2lmbmRlZiBfUzM5MF9LRVhFQ19ICiAjZGVmaW5lIF9TMzkwX0tFWEVDX0gKIAorI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2VuZGlmCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogLyoKICAqIEtFWEVDX1NPVVJDRV9NRU1PUllfTElNSVQgbWF4aW11bSBwYWdlIGdldF9mcmVlX3BhZ2UgY2FuIHJldHVybi4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvcGFnZS5oIGIvaW5jbHVkZS9hc20tczM5MC9wYWdlLmgKaW5kZXggNTg0ZDBlZS4uN2YyOWE5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9wYWdlLmgKQEAgLTE5LDcgKzE5LDYgQEAKICNkZWZpbmUgUEFHRV9ERUZBVUxUX0FDQwkwCiAjZGVmaW5lIFBBR0VfREVGQVVMVF9LRVkJKFBBR0VfREVGQVVMVF9BQ0MgPDwgNCkKIAotI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKQEAgLTExMCw2ICsxMDksOCBAQAogCiAjZW5kaWYgLyogX19zMzkweF9fICovCiAKK3R5cGVkZWYgc3RydWN0IHBhZ2UgKnBndGFibGVfdDsKKwogI2RlZmluZSBfX3B0ZSh4KSAgICAgICAgKChwdGVfdCkgeyAoeCkgfSApCiAjZGVmaW5lIF9fcG1kKHgpICAgICAgICAoKHBtZF90KSB7ICh4KSB9ICkKICNkZWZpbmUgX19wZ2QoeCkgICAgICAgICgocGdkX3QpIHsgKHgpIH0gKQpAQCAtMTcyLDYgKzE3Myw0IEBACiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbWVtb3J5X21vZGVsLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGFnZS5oPgogCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCiAjZW5kaWYgLyogX1MzOTBfUEFHRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3BnYWxsb2MuaCBiL2luY2x1ZGUvYXNtLXMzOTAvcGdhbGxvYy5oCmluZGV4IDZmNjYxOWIuLjkwMGQ0NDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvcGdhbGxvYy5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvcGdhbGxvYy5oCkBAIC0xMzIsNyArMTMyLDcgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCi1wbWRfcG9wdWxhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBtZF90ICpwbWQsIHN0cnVjdCBwYWdlICpwYWdlKQorcG1kX3BvcHVsYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqcG1kLCBwZ3RhYmxlX3QgcGFnZSkKIHsKIAlwdGVfdCAqcHRlID0gKHB0ZV90ICopcGFnZV90b19waHlzKHBhZ2UpOwogCXBtZF90ICpzaGFkb3dfcG1kID0gZ2V0X3NoYWRvd190YWJsZShwbWQpOwpAQCAtMTQyLDYgKzE0Miw3IEBACiAJaWYgKHNoYWRvd19wbWQgJiYgc2hhZG93X3B0ZSkKIAkJcG1kX3BvcHVsYXRlX2tlcm5lbChtbSwgc2hhZG93X3BtZCwgc2hhZG93X3B0ZSk7CiB9CisjZGVmaW5lIHBtZF9wZ3RhYmxlKHBtZCkgcG1kX3BhZ2UocG1kKQogCiAvKgogICogcGFnZSB0YWJsZSBlbnRyeSBhbGxvY2F0aW9uL2ZyZWUgcm91dGluZXMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tczM5MC9wcm9jZXNzb3IuaAppbmRleCA0Zjc0NDYwLi5lODc4NTYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvcHJvY2Vzc29yLmgKQEAgLTc4LDYgKzc4LDEzIEBACiAKICNlbmRpZiAvKiBfX3MzOTB4X18gKi8KIAorI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBTVEFDS19UT1AJCVRBU0tfU0laRQorI2RlZmluZSBTVEFDS19UT1BfTUFYCQlERUZBVUxUX1RBU0tfU0laRQorCisjZW5kaWYKKwogI2RlZmluZSBIQVZFX0FSQ0hfUElDS19NTUFQX0xBWU9VVAogCiB0eXBlZGVmIHN0cnVjdCB7CkBAIC0xNjEsNiArMTY4LDcgQEAKIC8qIEZvcndhcmQgZGVjbGFyYXRpb24sIGEgc3RyYW5nZSBDIHRoaW5nICovCiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7CiBzdHJ1Y3QgbW1fc3RydWN0Oworc3RydWN0IHNlcV9maWxlOwogCiAvKiBGcmVlIGFsbCByZXNvdXJjZXMgaGVsZCBieSBhIHRocmVhZC4gKi8KIGV4dGVybiB2b2lkIHJlbGVhc2VfdGhyZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKQEAgLTE3Nyw3ICsxODUsNyBAQAogLyoKICAqIFByaW50IHJlZ2lzdGVyIG9mIHRhc2sgaW50byBidWZmZXIuIFVzZWQgaW4gZnMvcHJvYy9hcnJheS5jLgogICovCi1leHRlcm4gY2hhciAqdGFza19zaG93X3JlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICpidWZmZXIpOworZXh0ZXJuIHZvaWQgdGFza19zaG93X3JlZ3Moc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOwogCiBleHRlcm4gdm9pZCBzaG93X3JlZ2lzdGVycyhzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBleHRlcm4gdm9pZCBzaG93X2NvZGUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLXMzOTAvc3lzdGVtLmgKaW5kZXggNDRiZGE3OC4uMTVhYmEzMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3N5c3RlbS5oCkBAIC0yMDEsOSArMjAxLDkgQEAKIAogI2RlZmluZSBfX0hBVkVfQVJDSF9DTVBYQ0hHIDEKIAotI2RlZmluZSBjbXB4Y2hnKHB0cixvLG4pXAotCSgoX190eXBlb2ZfXygqKHB0cikpKV9fY21weGNoZygocHRyKSwodW5zaWduZWQgbG9uZykobyksXAotCQkJCQkodW5zaWduZWQgbG9uZykobiksc2l6ZW9mKCoocHRyKSkpKQorI2RlZmluZSBjbXB4Y2hnKHB0ciwgbywgbikJCQkJCQlcCisJKChfX3R5cGVvZl9fKCoocHRyKSkpX19jbXB4Y2hnKChwdHIpLCAodW5zaWduZWQgbG9uZykobyksCVwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpKG4pLCBzaXplb2YoKihwdHIpKSkpCiAKIGV4dGVybiB2b2lkIF9fY21weGNoZ19jYWxsZWRfd2l0aF9iYWRfcG9pbnRlcih2b2lkKTsKIApAQCAtMzU1LDYgKzM1NSw0NCBAQAogCiAjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KIAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NtcHhjaGctbG9jYWwuaD4KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fY21weGNoZ19sb2NhbCh2b2xhdGlsZSB2b2lkICpwdHIsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBvbGQsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBuZXcsIGludCBzaXplKQoreworCXN3aXRjaCAoc2l6ZSkgeworCWNhc2UgMToKKwljYXNlIDI6CisJY2FzZSA0OgorI2lmZGVmIF9fczM5MHhfXworCWNhc2UgODoKKyNlbmRpZgorCQlyZXR1cm4gX19jbXB4Y2hnKHB0ciwgb2xkLCBuZXcsIHNpemUpOworCWRlZmF1bHQ6CisJCXJldHVybiBfX2NtcHhjaGdfbG9jYWxfZ2VuZXJpYyhwdHIsIG9sZCwgbmV3LCBzaXplKTsKKwl9CisKKwlyZXR1cm4gb2xkOworfQorCisvKgorICogY21weGNoZ19sb2NhbCBhbmQgY21weGNoZzY0X2xvY2FsIGFyZSBhdG9taWMgd3J0IGN1cnJlbnQgQ1BVLiBBbHdheXMgbWFrZQorICogdGhlbSBhdmFpbGFibGUuCisgKi8KKyNkZWZpbmUgY21weGNoZ19sb2NhbChwdHIsIG8sIG4pCQkJCQlcCisJKChfX3R5cGVvZl9fKCoocHRyKSkpX19jbXB4Y2hnX2xvY2FsKChwdHIpLCAodW5zaWduZWQgbG9uZykobyksCVwKKwkJCSh1bnNpZ25lZCBsb25nKShuKSwgc2l6ZW9mKCoocHRyKSkpKQorI2lmZGVmIF9fczM5MHhfXworI2RlZmluZSBjbXB4Y2hnNjRfbG9jYWwocHRyLCBvLCBuKQkJCQkJXAorICAoewkJCQkJCQkJCVwKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKCoocHRyKSkgIT0gOCk7CQkJCVwKKwljbXB4Y2hnX2xvY2FsKChwdHIpLCAobyksIChuKSk7CQkJCQlcCisgIH0pCisjZWxzZQorI2RlZmluZSBjbXB4Y2hnNjRfbG9jYWwocHRyLCBvLCBuKSBfX2NtcHhjaGc2NF9sb2NhbF9nZW5lcmljKChwdHIpLCAobyksIChuKSkKKyNlbmRpZgorCiAvKgogICogVXNlIHRvIHNldCBwc3cgbWFzayBleGNlcHQgZm9yIHRoZSBmaXJzdCBieXRlIHdoaWNoCiAgKiB3b24ndCBiZSBjaGFuZ2VkIGJ5IHRoaXMgZnVuY3Rpb24uCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3Rlcm1iaXRzLmggYi9pbmNsdWRlL2FzbS1zMzkwL3Rlcm1iaXRzLmgKaW5kZXggODExYjlhOS4uNTg3MzE4NTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvdGVybWJpdHMuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3Rlcm1iaXRzLmgKQEAgLTE0OCw2ICsxNDgsNyBAQAogI2RlZmluZSBIVVBDTAkwMDAyMDAwCiAjZGVmaW5lIENMT0NBTAkwMDA0MDAwCiAjZGVmaW5lIENCQVVERVggMDAxMDAwMAorI2RlZmluZSAgQk9USEVSICAwMDEwMDAwCiAjZGVmaW5lICBCNTc2MDAgIDAwMTAwMDEKICNkZWZpbmUgIEIxMTUyMDAgMDAxMDAwMgogI2RlZmluZSAgQjIzMDQwMCAwMDEwMDAzCkBAIC0xNjMsMTAgKzE2NCwxMiBAQAogI2RlZmluZSAgQjMwMDAwMDAgMDAxMDAxNQogI2RlZmluZSAgQjM1MDAwMDAgMDAxMDAxNgogI2RlZmluZSAgQjQwMDAwMDAgMDAxMDAxNwotI2RlZmluZSBDSUJBVUQJICAwMDIwMDM2MDAwMDAJLyogaW5wdXQgYmF1ZCByYXRlIChub3QgdXNlZCkgKi8KKyNkZWZpbmUgQ0lCQVVECSAgMDAyMDAzNjAwMDAwCS8qIGlucHV0IGJhdWQgcmF0ZSAqLwogI2RlZmluZSBDTVNQQVIJICAwMTAwMDAwMDAwMDAJCS8qIG1hcmsgb3Igc3BhY2UgKHN0aWNrKSBwYXJpdHkgKi8KICNkZWZpbmUgQ1JUU0NUUwkgIDAyMDAwMDAwMDAwMAkJLyogZmxvdyBjb250cm9sICovCiAKKyNkZWZpbmUgSUJTSElGVAkgIDE2CQkvKiBTaGlmdCBmcm9tIENCQVVEIHRvIENJQkFVRCAqLworCiAvKiBjX2xmbGFnIGJpdHMgKi8KICNkZWZpbmUgSVNJRwkwMDAwMDAxCiAjZGVmaW5lIElDQU5PTgkwMDAwMDAyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3Rlcm1pb3MuaCBiL2luY2x1ZGUvYXNtLXMzOTAvdGVybWlvcy5oCmluZGV4IGEzNDgwZTIuLjY3ZjY2MjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvdGVybWlvcy5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvdGVybWlvcy5oCkBAIC01Nyw2ICs1Nyw5IEBACiAqLwogI2RlZmluZSBJTklUX0NfQ0MgIlwwMDNcMDM0XDE3N1wwMjVcMDA0XDBcMVwwXDAyMVwwMjNcMDMyXDBcMDIyXDAxN1wwMjdcMDI2XDAiCiAKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKQorCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdGVybWlvcy5oPgogCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC90bGIuaCBiL2luY2x1ZGUvYXNtLXMzOTAvdGxiLmgKaW5kZXggOTg1ZGUyYi4uM2M4MTc3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC90bGIuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3RsYi5oCkBAIC05NSw3ICs5NSw3IEBACiAgKiBwdGVfZnJlZV90bGIgZnJlZXMgYSBwdGUgdGFibGUgYW5kIGNsZWFycyB0aGUgQ1JTVEUgZm9yIHRoZQogICogcGFnZSB0YWJsZSBmcm9tIHRoZSB0bGIuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBwdGVfZnJlZV90bGIoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWVfdGxiKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHBndGFibGVfdCBwYWdlKQogewogCWlmICghdGxiLT5mdWxsbW0pIHsKIAkJdGxiLT5hcnJheVt0bGItPm5yX3B0ZXMrK10gPSBwYWdlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC91c2VyLmggYi9pbmNsdWRlL2FzbS1zMzkwL3VzZXIuaAppbmRleCAxZGM3NGJhLi4xYjA1MGUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3VzZXIuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3VzZXIuaApAQCAtNjMsOCArNjMsNyBAQAogCQkJCSAgIHRoZSB0b3Agb2YgdGhlIHN0YWNrIGlzIGFsd2F5cyBmb3VuZCBpbiB0aGUKIAkJCQkgICBlc3AgcmVnaXN0ZXIuICAqLwogICBsb25nIGludCBzaWduYWw7ICAgICAJCS8qIFNpZ25hbCB0aGF0IGNhdXNlZCB0aGUgY29yZSBkdW1wLiAqLwotICBzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCAqdV9hcjA7Ci0JCQkJLyogVXNlZCBieSBnZGIgdG8gaGVscCBmaW5kIHRoZSB2YWx1ZXMgZm9yICovCisgIHVuc2lnbmVkIGxvbmcgdV9hcjA7CQkvKiBVc2VkIGJ5IGdkYiB0byBoZWxwIGZpbmQgdGhlIHZhbHVlcyBmb3IgKi8KIAkJCQkvKiB0aGUgcmVnaXN0ZXJzLiAqLwogICB1bnNpZ25lZCBsb25nIG1hZ2ljOwkJLyogVG8gdW5pcXVlbHkgaWRlbnRpZnkgYSBjb3JlIGZpbGUgKi8KICAgY2hhciB1X2NvbW1bMzJdOwkJLyogVXNlciBjb21tYW5kIHRoYXQgd2FzIHJlc3BvbnNpYmxlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9hLm91dC5oIGIvaW5jbHVkZS9hc20tc2gvYS5vdXQuaAppbmRleCA2ODVkMGY2Li4xZjkzMTMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9hLm91dC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2Eub3V0LmgKQEAgLTE3LDExICsxNyw0IEBACiAjZGVmaW5lIE5fRFJTSVpFKGEpCSgoYSkuYV9kcnNpemUpCiAjZGVmaW5lIE5fU1lNU0laRShhKQkoKGEpLmFfc3ltcykKIAotI2lmZGVmIF9fS0VSTkVMX18KLQotI2RlZmluZSBTVEFDS19UT1AJVEFTS19TSVpFCi0jZGVmaW5lIFNUQUNLX1RPUF9NQVgJU1RBQ0tfVE9QCi0KLSNlbmRpZgotCiAjZW5kaWYgLyogX19BU01fU0hfQV9PVVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvcGFnZS5oIGIvaW5jbHVkZS9hc20tc2gvcGFnZS5oCmluZGV4IDAwMmU2NGEuLjEzNDU2MmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9wYWdlLmgKQEAgLTcsOCArNyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb25zdC5oPgogCi0jaWZkZWYgX19LRVJORUxfXwotCiAvKiBQQUdFX1NISUZUIGRldGVybWluZXMgdGhlIHBhZ2Ugc2l6ZSAqLwogI2lmIGRlZmluZWQoQ09ORklHX1BBR0VfU0laRV80S0IpCiAjIGRlZmluZSBQQUdFX1NISUZUCTEyCkBAIC0xMDIsNiArMTAwLDggQEAKICNkZWZpbmUgX19wZ2QoeCkgKChwZ2RfdCkgeyAoeCkgfSApCiAjZGVmaW5lIF9fcGdwcm90KHgpCSgocGdwcm90X3QpIHsgKHgpIH0gKQogCit0eXBlZGVmIHN0cnVjdCBwYWdlICpwZ3RhYmxlX3Q7CisKICNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCiAKIC8qCkBAIC0xNzgsNSArMTc4LDQgQEAKICNkZWZpbmUgQVJDSF9TTEFCX01JTkFMSUdOCTgKICNlbmRpZgogCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9fQVNNX1NIX1BBR0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvcGdhbGxvYy5oIGIvaW5jbHVkZS9hc20tc2gvcGdhbGxvYy5oCmluZGV4IDU5Y2ExNmQuLjg0ZGQyZGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3BnYWxsb2MuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9wZ2FsbG9jLmgKQEAgLTE0LDEwICsxNCwxMSBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcG1kX3BvcHVsYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqcG1kLAotCQkJCXN0cnVjdCBwYWdlICpwdGUpCisJCQkJcGd0YWJsZV90IHB0ZSkKIHsKIAlzZXRfcG1kKHBtZCwgX19wbWQoKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHB0ZSkpKTsKIH0KKyNkZWZpbmUgcG1kX3BndGFibGUocG1kKSBwbWRfcGFnZShwbWQpCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwZ2RfY3Rvcih2b2lkICp4KQogewpAQCAtNDcsMTEgKzQ4LDE4IEBACiAJcmV0dXJuIHF1aWNrbGlzdF9hbGxvYyhRVUlDS19QVCwgR0ZQX0tFUk5FTCB8IF9fR0ZQX1JFUEVBVCwgTlVMTCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnB0ZV9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sCi0JCQkJCSB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCitzdGF0aWMgaW5saW5lIHBndGFibGVfdCBwdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCQl1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7Ci0Jdm9pZCAqcGcgPSBxdWlja2xpc3RfYWxsb2MoUVVJQ0tfUFQsIEdGUF9LRVJORUwgfCBfX0dGUF9SRVBFQVQsIE5VTEwpOwotCXJldHVybiBwZyA/IHZpcnRfdG9fcGFnZShwZykgOiBOVUxMOworCXN0cnVjdCBwYWdlICpwYWdlOworCXZvaWQgKnBnOworCisJcGcgPSBxdWlja2xpc3RfYWxsb2MoUVVJQ0tfUFQsIEdGUF9LRVJORUwgfCBfX0dGUF9SRVBFQVQsIE5VTEwpOworCWlmICghcGcpCisJCXJldHVybiBOVUxMOworCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UocGcpOworCXBndGFibGVfcGFnZV9jdG9yKHBhZ2UpOworCXJldHVybiBwYWdlOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdGVfdCAqcHRlKQpAQCAtNTksMTIgKzY3LDE3IEBACiAJcXVpY2tsaXN0X2ZyZWUoUVVJQ0tfUFQsIE5VTEwsIHB0ZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwdGVfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHBhZ2UgKnB0ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdGVfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcGd0YWJsZV90IHB0ZSkKIHsKKwlwZ3RhYmxlX3BhZ2VfZHRvcihwdGUpOwogCXF1aWNrbGlzdF9mcmVlX3BhZ2UoUVVJQ0tfUFQsIE5VTEwsIHB0ZSk7CiB9CiAKLSNkZWZpbmUgX19wdGVfZnJlZV90bGIodGxiLHB0ZSkgdGxiX3JlbW92ZV9wYWdlKCh0bGIpLChwdGUpKQorI2RlZmluZSBfX3B0ZV9mcmVlX3RsYih0bGIscHRlKQkJCQlcCitkbyB7CQkJCQkJCVwKKwlwZ3RhYmxlX3BhZ2VfZHRvcihwdGUpOwkJCQlcCisJdGxiX3JlbW92ZV9wYWdlKCh0bGIpLCAocHRlKSk7CQkJXAorfSB3aGlsZSAoMCkKIAogLyoKICAqIGFsbG9jYXRpbmcgYW5kIGZyZWVpbmcgYSBwbWQgaXMgdHJpdmlhbDogdGhlIDEtZW50cnkgcG1kIGlzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9wcm9jZXNzb3JfMzIuaCBiL2luY2x1ZGUvYXNtLXNoL3Byb2Nlc3Nvcl8zMi5oCmluZGV4IGE3ZWRhYTEuLmRmMmQ1YjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3Byb2Nlc3Nvcl8zMi5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3Byb2Nlc3Nvcl8zMi5oCkBAIC01MCw2ICs1MCw5IEBACiAgKi8KICNkZWZpbmUgVEFTS19TSVpFCTB4N2MwMDAwMDBVTAogCisjZGVmaW5lIFNUQUNLX1RPUAlUQVNLX1NJWkUKKyNkZWZpbmUgU1RBQ0tfVE9QX01BWAlTVEFDS19UT1AKKwogLyogVGhpcyBkZWNpZGVzIHdoZXJlIHRoZSBrZXJuZWwgd2lsbCBzZWFyY2ggZm9yIGEgZnJlZSBjaHVuayBvZiB2bQogICogc3BhY2UgZHVyaW5nIG1tYXAncy4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvcHJvY2Vzc29yXzY0LmggYi9pbmNsdWRlL2FzbS1zaC9wcm9jZXNzb3JfNjQuaAppbmRleCA5OWMyMmIxLi5lZGE0YmVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9wcm9jZXNzb3JfNjQuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9wcm9jZXNzb3JfNjQuaApAQCAtODMsNiArODMsOSBAQAogICovCiAjZGVmaW5lIFRBU0tfU0laRQkweDdmZmZmMDAwVUwKIAorI2RlZmluZSBTVEFDS19UT1AJVEFTS19TSVpFCisjZGVmaW5lIFNUQUNLX1RPUF9NQVgJU1RBQ0tfVE9QCisKIC8qIFRoaXMgZGVjaWRlcyB3aGVyZSB0aGUga2VybmVsIHdpbGwgc2VhcmNoIGZvciBhIGZyZWUgY2h1bmsgb2Ygdm0KICAqIHNwYWNlIGR1cmluZyBtbWFwJ3MuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3VzZXIuaCBiL2luY2x1ZGUvYXNtLXNoL3VzZXIuaAppbmRleCAxYTRmNDNjLi44ZmQzY2Y2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC91c2VyLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvdXNlci5oCkBAIC01Miw3ICs1Miw3IEBACiAJdW5zaWduZWQgbG9uZwlzdGFydF9kYXRhOwkJLyogZGF0YSBzdGFydGluZyBhZGRyZXNzICovCiAJdW5zaWduZWQgbG9uZwlzdGFydF9zdGFjazsJCS8qIHN0YWNrIHN0YXJ0aW5nIGFkZHJlc3MgKi8KIAlsb25nIGludAlzaWduYWw7CQkJLyogc2lnbmFsIGNhdXNpbmcgY29yZSBkdW1wICovCi0Jc3RydWN0IHJlZ3MgKgl1X2FyMDsJCQkvKiBoZWxwIGdkYiBmaW5kIHJlZ2lzdGVycyAqLworCXVuc2lnbmVkIGxvbmcJdV9hcjA7CQkJLyogaGVscCBnZGIgZmluZCByZWdpc3RlcnMgKi8KIAlzdHJ1Y3QgdXNlcl9mcHVfc3RydWN0KiB1X2Zwc3RhdGU7CS8qIE1hdGggQ28tcHJvY2Vzc29yIHBvaW50ZXIgKi8KIAl1bnNpZ25lZCBsb25nCW1hZ2ljOwkJCS8qIGlkZW50aWZpZXMgYSBjb3JlIGZpbGUgKi8KIAljaGFyCQl1X2NvbW1bMzJdOwkJLyogdXNlciBjb21tYW5kIG5hbWUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL2Eub3V0LWNvcmUuaCBiL2luY2x1ZGUvYXNtLXNwYXJjL2Eub3V0LWNvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGZkMzM4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvYS5vdXQtY29yZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIGEub3V0IGNvcmVkdW1wIHJlZ2lzdGVyIGR1bXBlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9BU01fQV9PVVRfQ09SRV9ICisjZGVmaW5lIF9BU01fQV9PVVRfQ09SRV9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC91c2VyLmg+CisKKy8qCisgKiBmaWxsIGluIHRoZSB1c2VyIHN0cnVjdHVyZSBmb3IgYW4gYS5vdXQgY29yZSBkdW1wCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhb3V0X2R1bXBfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3QgdXNlciAqZHVtcCkKK3sKKwl1bnNpZ25lZCBsb25nIGZpcnN0X3N0YWNrX3BhZ2U7CisKKwlkdW1wLT5tYWdpYyA9IFNVTk9TX0NPUkVfTUFHSUM7CisJZHVtcC0+bGVuID0gc2l6ZW9mKHN0cnVjdCB1c2VyKTsKKwlkdW1wLT5yZWdzLnBzciA9IHJlZ3MtPnBzcjsKKwlkdW1wLT5yZWdzLnBjID0gcmVncy0+cGM7CisJZHVtcC0+cmVncy5ucGMgPSByZWdzLT5ucGM7CisJZHVtcC0+cmVncy55ID0gcmVncy0+eTsKKwkvKiBmdWNrIG1lIHBsZW50eSAqLworCW1lbWNweSgmZHVtcC0+cmVncy5yZWdzWzBdLCAmcmVncy0+dV9yZWdzWzFdLCAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogMTUpKTsKKwlkdW1wLT51ZXhlYyA9IGN1cnJlbnQtPnRocmVhZC5jb3JlX2V4ZWM7CisJZHVtcC0+dV90c2l6ZSA9ICgoKHVuc2lnbmVkIGxvbmcpIGN1cnJlbnQtPm1tLT5lbmRfY29kZSkgLQorCQkoKHVuc2lnbmVkIGxvbmcpIGN1cnJlbnQtPm1tLT5zdGFydF9jb2RlKSkgJiB+KFBBR0VfU0laRSAtIDEpOworCWR1bXAtPnVfZHNpemUgPSAoKHVuc2lnbmVkIGxvbmcpIChjdXJyZW50LT5tbS0+YnJrICsgKFBBR0VfU0laRS0xKSkpOworCWR1bXAtPnVfZHNpemUgLT0gZHVtcC0+dV90c2l6ZTsKKwlkdW1wLT51X2RzaXplICY9IH4oUEFHRV9TSVpFIC0gMSk7CisJZmlyc3Rfc3RhY2tfcGFnZSA9IChyZWdzLT51X3JlZ3NbVVJFR19GUF0gJiB+KFBBR0VfU0laRSAtIDEpKTsKKwlkdW1wLT51X3NzaXplID0gKFRBU0tfU0laRSAtIGZpcnN0X3N0YWNrX3BhZ2UpICYgfihQQUdFX1NJWkUgLSAxKTsKKwltZW1jcHkoJmR1bXAtPmZwdS5mcHN0YXR1cy5mcmVncy5yZWdzWzBdLCAmY3VycmVudC0+dGhyZWFkLmZsb2F0X3JlZ3NbMF0sIChzaXplb2YodW5zaWduZWQgbG9uZykgKiAzMikpOworCWR1bXAtPmZwdS5mcHN0YXR1cy5mc3IgPSBjdXJyZW50LT50aHJlYWQuZnNyOworCWR1bXAtPmZwdS5mcHN0YXR1cy5mbGFncyA9IGR1bXAtPmZwdS5mcHN0YXR1cy5leHRyYSA9IDA7CisJZHVtcC0+ZnB1LmZwc3RhdHVzLmZwcV9jb3VudCA9IGN1cnJlbnQtPnRocmVhZC5mcHFkZXB0aDsKKwltZW1jcHkoJmR1bXAtPmZwdS5mcHN0YXR1cy5mcHFbMF0sICZjdXJyZW50LT50aHJlYWQuZnBxdWV1ZVswXSwKKwkgICAgICAgKChzaXplb2YodW5zaWduZWQgbG9uZykgKiAyKSAqIDE2KSk7CisJZHVtcC0+c2lnY29kZSA9IDA7Cit9CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX0FTTV9BX09VVF9DT1JFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL2Eub3V0LmggYi9pbmNsdWRlL2FzbS1zcGFyYy9hLm91dC5oCmluZGV4IDkxN2UwNDIuLjc0NGNmZTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjL2Eub3V0LmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvYS5vdXQuaApAQCAtODcsMTMgKzg3LDQgQEAKIAogI2RlZmluZSBOX1JFTE9DQVRJT05fSU5GT19ERUNMQVJFRCAxCiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotCi0jZGVmaW5lIFNUQUNLX1RPUAkoUEFHRV9PRkZTRVQgLSBQQUdFX1NJWkUpCi0jZGVmaW5lIFNUQUNLX1RPUF9NQVgJU1RBQ0tfVE9QCi0KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KICNlbmRpZiAvKiBfX1NQQVJDX0FfT1VUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvYXRvbWljLmggYi9pbmNsdWRlL2FzbS1zcGFyYy9hdG9taWMuaAppbmRleCAzMzI4OTUwLi41Yzk0NGI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy9hdG9taWMuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYy9hdG9taWMuaApAQCAtMTcsNDIgKzE3LDYgQEAKIAogI2lmZGVmIF9fS0VSTkVMX18KIAotLyogRW11bGF0ZSBjbXB4Y2hnKCkgdGhlIHNhbWUgd2F5IHdlIGVtdWxhdGUgYXRvbWljcywKLSAqIGJ5IGhhc2hpbmcgdGhlIG9iamVjdCBhZGRyZXNzIGFuZCBpbmRleGluZyBpbnRvIGFuIGFycmF5Ci0gKiBvZiBzcGlubG9ja3MgdG8gZ2V0IGEgYml0IG9mIHBlcmZvcm1hbmNlLi4uCi0gKgotICogU2VlIGFyY2gvc3BhcmMvbGliL2F0b21pYzMyLmMgZm9yIGltcGxlbWVudGF0aW9uLgotICoKLSAqIENyaWJiZWQgZnJvbSA8YXNtLXBhcmlzYy9hdG9taWMuaD4KLSAqLwotI2RlZmluZSBfX0hBVkVfQVJDSF9DTVBYQ0hHCTEKLQotLyogYnVnIGNhdGNoZXIgZm9yIHdoZW4gdW5zdXBwb3J0ZWQgc2l6ZSBpcyB1c2VkIC0gd29uJ3QgbGluayAqLwotZXh0ZXJuIHZvaWQgX19jbXB4Y2hnX2NhbGxlZF93aXRoX2JhZF9wb2ludGVyKHZvaWQpOwotLyogd2Ugb25seSBuZWVkIHRvIHN1cHBvcnQgY21weGNoZyBvZiBhIHUzMiBvbiBzcGFyYyAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19jbXB4Y2hnX3UzMih2b2xhdGlsZSB1MzIgKm0sIHUzMiBvbGQsIHUzMiBuZXdfKTsKLQotLyogZG9uJ3Qgd29ycnkuLi5vcHRpbWl6ZXIgd2lsbCBnZXQgcmlkIG9mIG1vc3Qgb2YgdGhpcyAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1fX2NtcHhjaGcodm9sYXRpbGUgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIG9sZCwgdW5zaWduZWQgbG9uZyBuZXdfLCBpbnQgc2l6ZSkKLXsKLQlzd2l0Y2goc2l6ZSkgewotCWNhc2UgNDoKLQkJcmV0dXJuIF9fY21weGNoZ191MzIoKHUzMiAqKXB0ciwgKHUzMilvbGQsICh1MzIpbmV3Xyk7Ci0JZGVmYXVsdDoKLQkJX19jbXB4Y2hnX2NhbGxlZF93aXRoX2JhZF9wb2ludGVyKCk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gb2xkOwotfQotCi0jZGVmaW5lIGNtcHhjaGcocHRyLG8sbikgKHsJCQkJCQlcCi0JX190eXBlb2ZfXygqKHB0cikpIF9vXyA9IChvKTsJCQkJCVwKLQlfX3R5cGVvZl9fKCoocHRyKSkgX25fID0gKG4pOwkJCQkJXAotCShfX3R5cGVvZl9fKCoocHRyKSkpIF9fY21weGNoZygocHRyKSwgKHVuc2lnbmVkIGxvbmcpX29fLAlcCi0JCQkodW5zaWduZWQgbG9uZylfbl8sIHNpemVvZigqKHB0cikpKTsJCVwKLX0pCi0KICNkZWZpbmUgQVRPTUlDX0lOSVQoaSkgIHsgKGkpIH0KIAogZXh0ZXJuIGludCBfX2F0b21pY19hZGRfcmV0dXJuKGludCwgYXRvbWljX3QgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy9lbGYuaCBiL2luY2x1ZGUvYXNtLXNwYXJjL2VsZi5oCmluZGV4IGFhZjZlZjQuLmQyNTE2ZWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjL2VsZi5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjL2VsZi5oCkBAIC02NSw4ICs2NSwxNCBAQAogI2RlZmluZSBIV0NBUF9TUEFSQ19WOQkJMTYKICNkZWZpbmUgSFdDQVBfU1BBUkNfVUxUUkEzCTMyCiAKLS8qIEZvciB0aGUgbW9zdCBwYXJ0IHdlIHByZXNlbnQgY29kZSBkdW1wcyBpbiB0aGUgZm9ybWF0Ci0gKiBTb2xhcmlzIGRvZXMuCisjZGVmaW5lIENPUkVfRFVNUF9VU0VfUkVHU0VUCisKKy8qIEZvcm1hdCBpczoKKyAqIAlHMCAtLT4gRzcKKyAqCU8wIC0tPiBPNworICoJTDAgLS0+IEw3CisgKglJMCAtLT4gSTcKKyAqCVBTUiwgUEMsIG5QQywgWSwgV0lNLCBUQlIKICAqLwogdHlwZWRlZiB1bnNpZ25lZCBsb25nIGVsZl9ncmVnX3Q7CiAjZGVmaW5lIEVMRl9OR1JFRyAzOApAQCAtODUsMzYgKzkxLDcgQEAKIAl1bnNpZ25lZCBpbnQJcHJfcVs2NF07CiB9IGVsZl9mcHJlZ3NldF90OwogCi0jaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGFzbS9tYnVzLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQotLyogRm9ybWF0IGlzOgotICogCUcwIC0tPiBHNwotICoJTzAgLS0+IE83Ci0gKglMMCAtLT4gTDcKLSAqCUkwIC0tPiBJNwotICoJUFNSLCBQQywgblBDLCBZLCBXSU0sIFRCUgotICovCi0jZGVmaW5lIEVMRl9DT1JFX0NPUFlfUkVHUyhfX2VsZl9yZWdzLCBfX3B0X3JlZ3MpCVwKLWRvIHsJdW5zaWduZWQgbG9uZyAqZGVzdCA9ICYoX19lbGZfcmVnc1swXSk7CQlcCi0Jc3RydWN0IHB0X3JlZ3MgKnNyYyA9IChfX3B0X3JlZ3MpOwkJXAotCXVuc2lnbmVkIGxvbmcgX191c2VyICpzcDsJCQlcCi0JbWVtY3B5KCZkZXN0WzBdLCAmc3JjLT51X3JlZ3NbMF0sCQlcCi0JICAgICAgIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDE2KTsJCVwKLQkvKiBEb24ndCB0cnkgdGhpcyBhdCBob21lIGtpZHMuLi4gKi8JCVwKLQlzcCA9ICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBzcmMtPnVfcmVnc1sxNF07CVwKLQljb3B5X2Zyb21fdXNlcigmZGVzdFsxNl0sIHNwLAkJCVwKLQkJICAgICAgIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDE2KTsJXAotCWRlc3RbMzJdID0gc3JjLT5wc3I7CQkJCVwKLQlkZXN0WzMzXSA9IHNyYy0+cGM7CQkJCVwKLQlkZXN0WzM0XSA9IHNyYy0+bnBjOwkJCQlcCi0JZGVzdFszNV0gPSBzcmMtPnk7CQkJCVwKLQlkZXN0WzM2XSA9IGRlc3RbMzddID0gMDsgLyogWFhYICovCQlcCi19IHdoaWxlKDApOyAvKiBKYW5pdG9yczogRG9uJ3QgdG91Y2ggdGhpcyBzZW1pY29sb24uICovCi0KLSNkZWZpbmUgRUxGX0NPUkVfQ09QWV9UQVNLX1JFR1MoX190c2ssIF9fZWxmX3JlZ3MpCVwKLQkoeyBFTEZfQ09SRV9DT1BZX1JFR1MoKCooX19lbGZfcmVncykpLCAoX190c2spLT50aHJlYWQua3JlZ3MpOyAxOyB9KQogCiAvKgogICogVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB3ZSBkb24ndCBsb2FkIHNvbWV0aGluZyBmb3IgdGhlIHdyb25nIGFyY2hpdGVjdHVyZS4KQEAgLTE2Niw2ICsxNDMsNCBAQAogCiAjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCwgaWJjczIpIHNldF9wZXJzb25hbGl0eSgoaWJjczIpP1BFUl9TVlI0OlBFUl9MSU5VWCkKIAotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQogI2VuZGlmIC8qICEoX19BU01TUEFSQ19FTEZfSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLXNwYXJjL3BhZ2UuaAppbmRleCBmZjU3NjQ4Li4zOWNjZjJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvcGFnZS5oCkBAIC04LDggKzgsNiBAQAogI2lmbmRlZiBfU1BBUkNfUEFHRV9ICiAjZGVmaW5lIF9TUEFSQ19QQUdFX0gKIAotI2lmZGVmIF9fS0VSTkVMX18KLQogI2lmZGVmIENPTkZJR19TVU40CiAjZGVmaW5lIFBBR0VfU0hJRlQgICAxMwogI2Vsc2UKQEAgLTEyNSw2ICsxMjMsOCBAQAogCiAjZW5kaWYKIAordHlwZWRlZiBzdHJ1Y3QgcGFnZSAqcGd0YWJsZV90OworCiBleHRlcm4gdW5zaWduZWQgbG9uZyBzcGFyY191bm1hcHBlZF9iYXNlOwogCiBCVEZJWFVQREVGX1NFVEhJKHNwYXJjX3VubWFwcGVkX2Jhc2UpCkBAIC0xNjMsNiArMTYzLDQgQEAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tZW1vcnlfbW9kZWwuaD4KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wYWdlLmg+CiAKLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KICNlbmRpZiAvKiBfU1BBUkNfUEFHRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy9wYXJhbS5oIGIvaW5jbHVkZS9hc20tc3BhcmMvcGFyYW0uaAppbmRleCBiZWFmMDJkLi44NmJhNTlhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy9wYXJhbS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjL3BhcmFtLmgKQEAgLTMsNyArMyw3IEBACiAjZGVmaW5lIF9BU01TUEFSQ19QQVJBTV9ICiAKICNpZmRlZiBfX0tFUk5FTF9fCi0jIGRlZmluZSBIWgkJMTAwCS8qIEludGVybmFsIGtlcm5lbCB0aW1lciBmcmVxdWVuY3kgKi8KKyMgZGVmaW5lIEhaCQlDT05GSUdfSFoJLyogSW50ZXJuYWwga2VybmVsIHRpbWVyIGZyZXF1ZW5jeSAqLwogIyBkZWZpbmUgVVNFUl9IWgkxMDAJLyogLi4gc29tZSB1c2VyIGludGVyZmFjZXMgYXJlIGluICJ0aWNrcyIgKi8KICMgZGVmaW5lIENMT0NLU19QRVJfU0VDIChVU0VSX0haKQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy9wZ2FsbG9jLmggYi9pbmNsdWRlL2FzbS1zcGFyYy9wZ2FsbG9jLmgKaW5kZXggYjVmYmRkMy4uNjI5MmNkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmMvcGdhbGxvYy5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjL3BnYWxsb2MuaApAQCAtNTAsMTAgKzUwLDExIEBACiAKIEJURklYVVBERUZfQ0FMTCh2b2lkLCBwbWRfcG9wdWxhdGUsIHBtZF90ICosIHN0cnVjdCBwYWdlICopCiAjZGVmaW5lIHBtZF9wb3B1bGF0ZShNTSwgUE1ELCBQVEUpICAgICAgICBCVEZJWFVQX0NBTEwocG1kX3BvcHVsYXRlKShQTUQsIFBURSkKKyNkZWZpbmUgcG1kX3BndGFibGUocG1kKSBwbWRfcGFnZShwbWQpCiBCVEZJWFVQREVGX0NBTEwodm9pZCwgcG1kX3NldCwgcG1kX3QgKiwgcHRlX3QgKikKICNkZWZpbmUgcG1kX3BvcHVsYXRlX2tlcm5lbChNTSwgUE1ELCBQVEUpIEJURklYVVBfQ0FMTChwbWRfc2V0KShQTUQsIFBURSkKIAotQlRGSVhVUERFRl9DQUxMKHN0cnVjdCBwYWdlICosIHB0ZV9hbGxvY19vbmUsIHN0cnVjdCBtbV9zdHJ1Y3QgKiwgdW5zaWduZWQgbG9uZykKK0JURklYVVBERUZfQ0FMTChwZ3RhYmxlX3QgLCBwdGVfYWxsb2Nfb25lLCBzdHJ1Y3QgbW1fc3RydWN0ICosIHVuc2lnbmVkIGxvbmcpCiAjZGVmaW5lIHB0ZV9hbGxvY19vbmUobW0sIGFkZHJlc3MpCUJURklYVVBfQ0FMTChwdGVfYWxsb2Nfb25lKShtbSwgYWRkcmVzcykKIEJURklYVVBERUZfQ0FMTChwdGVfdCAqLCBwdGVfYWxsb2Nfb25lX2tlcm5lbCwgc3RydWN0IG1tX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nKQogI2RlZmluZSBwdGVfYWxsb2Nfb25lX2tlcm5lbChtbSwgYWRkcikJQlRGSVhVUF9DQUxMKHB0ZV9hbGxvY19vbmVfa2VybmVsKShtbSwgYWRkcikKQEAgLTYxLDcgKzYyLDcgQEAKIEJURklYVVBERUZfQ0FMTCh2b2lkLCBmcmVlX3B0ZV9mYXN0LCBwdGVfdCAqKQogI2RlZmluZSBwdGVfZnJlZV9rZXJuZWwobW0sIHB0ZSkJQlRGSVhVUF9DQUxMKGZyZWVfcHRlX2Zhc3QpKHB0ZSkKIAotQlRGSVhVUERFRl9DQUxMKHZvaWQsIHB0ZV9mcmVlLCBzdHJ1Y3QgcGFnZSAqKQorQlRGSVhVUERFRl9DQUxMKHZvaWQsIHB0ZV9mcmVlLCBwZ3RhYmxlX3QgKQogI2RlZmluZSBwdGVfZnJlZShtbSwgcHRlKQlCVEZJWFVQX0NBTEwocHRlX2ZyZWUpKHB0ZSkKICNkZWZpbmUgX19wdGVfZnJlZV90bGIodGxiLCBwdGUpCXB0ZV9mcmVlKCh0bGIpLT5tbSwgcHRlKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy9wb3NpeF90eXBlcy5oIGIvaW5jbHVkZS9hc20tc3BhcmMvcG9zaXhfdHlwZXMuaAppbmRleCA2MmM4ZmE3Li5kY2MwN2ViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy9wb3NpeF90eXBlcy5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjL3Bvc2l4X3R5cGVzLmgKQEAgLTM5LDE0ICszOSwxMCBAQAogI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0IHsKLSNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8IGRlZmluZWQoX19VU0VfQUxMKQogCWludAl2YWxbMl07Ci0jZWxzZSAvKiAhZGVmaW5lZChfX0tFUk5FTF9fKSAmJiAhZGVmaW5lZChfX1VTRV9BTEwpICovCi0JaW50ICAgICBfX3ZhbFsyXTsKLSNlbmRpZiAvKiAhZGVmaW5lZChfX0tFUk5FTF9fKSAmJiAhZGVmaW5lZChfX1VTRV9BTEwpICovCiB9IF9fa2VybmVsX2ZzaWRfdDsKIAotI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgIWRlZmluZWQoX19HTElCQ19fKSB8fCAoX19HTElCQ19fIDwgMikKKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pCiAKICN1bmRlZiBfX0ZEX1NFVAogc3RhdGljIGlubGluZSB2b2lkIF9fRkRfU0VUKHVuc2lnbmVkIGxvbmcgZmQsIF9fa2VybmVsX2ZkX3NldCAqZmRzZXRwKQpAQCAtMTE3LDYgKzExMyw2IEBACiAJfQogfQogCi0jZW5kaWYgLyogZGVmaW5lZChfX0tFUk5FTF9fKSB8fCAhZGVmaW5lZChfX0dMSUJDX18pIHx8IChfX0dMSUJDX18gPCAyKSAqLworI2VuZGlmIC8qIGRlZmluZWQoX19LRVJORUxfXykgKi8KIAogI2VuZGlmIC8qICEoX19BUkNIX1NQQVJDX1BPU0lYX1RZUEVTX0gpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXNwYXJjL3Byb2Nlc3Nvci5oCmluZGV4IDZmYmIzZjAuLjQwYjFlNDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjL3Byb2Nlc3Nvci5oCkBAIC0zMyw2ICszMywxMCBAQAogICogd2UgY2FuIG1ha2Ugb3VyIGFjY2Vzc19vayB0ZXN0IGZhc3RlcgogICovCiAjZGVmaW5lIFRBU0tfU0laRQlQQUdFX09GRlNFVAorI2lmZGVmIF9fS0VSTkVMX18KKyNkZWZpbmUgU1RBQ0tfVE9QCShQQUdFX09GRlNFVCAtIFBBR0VfU0laRSkKKyNkZWZpbmUgU1RBQ0tfVE9QX01BWAlTVEFDS19UT1AKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKIHN0cnVjdCB0YXNrX3N0cnVjdDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvcHRyYWNlLmggYi9pbmNsdWRlL2FzbS1zcGFyYy9wdHJhY2UuaAppbmRleCA3MTQ0OTcwLi44MjAxYTdiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYy9wdHJhY2UuaApAQCAtNjEsOCArNjEsNiBAQAogCiAjaWZkZWYgX19LRVJORUxfXwogCi0jZGVmaW5lIF9fQVJDSF9TWVNfUFRSQUNFCTEKLQogI2RlZmluZSB1c2VyX21vZGUocmVncykgKCEoKHJlZ3MpLT5wc3IgJiBQU1JfUFMpKQogI2RlZmluZSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpICgocmVncyktPnBjKQogdW5zaWduZWQgbG9uZyBwcm9maWxlX3BjKHN0cnVjdCBwdF9yZWdzICopOwpAQCAtMTUxLDggKzE0OSw2IEBACiAjZGVmaW5lIFNGX1hYQVJHICAweDVjCiAKIC8qIFN0dWZmIGZvciB0aGUgcHRyYWNlIHN5c3RlbSBjYWxsICovCi0jZGVmaW5lIFBUUkFDRV9TVU5BVFRBQ0gJICAxMAotI2RlZmluZSBQVFJBQ0VfU1VOREVUQUNICSAgMTEKICNkZWZpbmUgUFRSQUNFX0dFVFJFR1MgICAgICAgICAgICAxMgogI2RlZmluZSBQVFJBQ0VfU0VUUkVHUyAgICAgICAgICAgIDEzCiAjZGVmaW5lIFBUUkFDRV9HRVRGUFJFR1MgICAgICAgICAgMTQKQEAgLTE2NCw3ICsxNjAsNCBAQAogI2RlZmluZSBQVFJBQ0VfR0VURlBBUkVHUyAgICAgICAgIDIwCiAjZGVmaW5lIFBUUkFDRV9TRVRGUEFSRUdTICAgICAgICAgMjEKIAotI2RlZmluZSBQVFJBQ0VfR0VUVUNPREUgICAgICAgICAgIDI5ICAvKiBzdHVwaWQgYnNkLWlzbSAqLwotCi0KICNlbmRpZiAvKiAhKF9TUEFSQ19QVFJBQ0VfSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tc3BhcmMvc3lzdGVtLmgKaW5kZXggMjY1NWQxNC4uNDVlNDdjMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmMvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvc3lzdGVtLmgKQEAgLTIyNSw2ICsyMjUsNTQgQEAKIAlyZXR1cm4geDsKIH0KIAorLyogRW11bGF0ZSBjbXB4Y2hnKCkgdGhlIHNhbWUgd2F5IHdlIGVtdWxhdGUgYXRvbWljcywKKyAqIGJ5IGhhc2hpbmcgdGhlIG9iamVjdCBhZGRyZXNzIGFuZCBpbmRleGluZyBpbnRvIGFuIGFycmF5CisgKiBvZiBzcGlubG9ja3MgdG8gZ2V0IGEgYml0IG9mIHBlcmZvcm1hbmNlLi4uCisgKgorICogU2VlIGFyY2gvc3BhcmMvbGliL2F0b21pYzMyLmMgZm9yIGltcGxlbWVudGF0aW9uLgorICoKKyAqIENyaWJiZWQgZnJvbSA8YXNtLXBhcmlzYy9hdG9taWMuaD4KKyAqLworI2RlZmluZSBfX0hBVkVfQVJDSF9DTVBYQ0hHCTEKKworLyogYnVnIGNhdGNoZXIgZm9yIHdoZW4gdW5zdXBwb3J0ZWQgc2l6ZSBpcyB1c2VkIC0gd29uJ3QgbGluayAqLworZXh0ZXJuIHZvaWQgX19jbXB4Y2hnX2NhbGxlZF93aXRoX2JhZF9wb2ludGVyKHZvaWQpOworLyogd2Ugb25seSBuZWVkIHRvIHN1cHBvcnQgY21weGNoZyBvZiBhIHUzMiBvbiBzcGFyYyAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19jbXB4Y2hnX3UzMih2b2xhdGlsZSB1MzIgKm0sIHUzMiBvbGQsIHUzMiBuZXdfKTsKKworLyogZG9uJ3Qgd29ycnkuLi5vcHRpbWl6ZXIgd2lsbCBnZXQgcmlkIG9mIG1vc3Qgb2YgdGhpcyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitfX2NtcHhjaGcodm9sYXRpbGUgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIG9sZCwgdW5zaWduZWQgbG9uZyBuZXdfLCBpbnQgc2l6ZSkKK3sKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIDQ6CisJCXJldHVybiBfX2NtcHhjaGdfdTMyKCh1MzIgKilwdHIsICh1MzIpb2xkLCAodTMyKW5ld18pOworCWRlZmF1bHQ6CisJCV9fY21weGNoZ19jYWxsZWRfd2l0aF9iYWRfcG9pbnRlcigpOworCQlicmVhazsKKwl9CisJcmV0dXJuIG9sZDsKK30KKworI2RlZmluZSBjbXB4Y2hnKHB0ciwgbywgbikJCQkJCQlcCisoewkJCQkJCQkJCVwKKwlfX3R5cGVvZl9fKCoocHRyKSkgX29fID0gKG8pOwkJCQkJXAorCV9fdHlwZW9mX18oKihwdHIpKSBfbl8gPSAobik7CQkJCQlcCisJKF9fdHlwZW9mX18oKihwdHIpKSkgX19jbXB4Y2hnKChwdHIpLCAodW5zaWduZWQgbG9uZylfb18sCVwKKwkJCSh1bnNpZ25lZCBsb25nKV9uXywgc2l6ZW9mKCoocHRyKSkpOwkJXAorfSkKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NtcHhjaGctbG9jYWwuaD4KKworLyoKKyAqIGNtcHhjaGdfbG9jYWwgYW5kIGNtcHhjaGc2NF9sb2NhbCBhcmUgYXRvbWljIHdydCBjdXJyZW50IENQVS4gQWx3YXlzIG1ha2UKKyAqIHRoZW0gYXZhaWxhYmxlLgorICovCisjZGVmaW5lIGNtcHhjaGdfbG9jYWwocHRyLCBvLCBuKQkJCQkgIAkgICAgICAgXAorCSgoX190eXBlb2ZfXygqKHB0cikpKV9fY21weGNoZ19sb2NhbF9nZW5lcmljKChwdHIpLCAodW5zaWduZWQgbG9uZykobyksXAorCQkJKHVuc2lnbmVkIGxvbmcpKG4pLCBzaXplb2YoKihwdHIpKSkpCisjZGVmaW5lIGNtcHhjaGc2NF9sb2NhbChwdHIsIG8sIG4pIF9fY21weGNoZzY0X2xvY2FsX2dlbmVyaWMoKHB0ciksIChvKSwgKG4pKQorCiBleHRlcm4gdm9pZCBkaWVfaWZfa2VybmVsKGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpIF9fYXR0cmlidXRlX18gKChub3JldHVybikpOwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20tc3BhcmMvdWFjY2Vzcy5oCmluZGV4IDNjZjEzMmUuLjM2NmIxMTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjL3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYy91YWNjZXNzLmgKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS92YWMtb3BzLmg+Ci0jaW5jbHVkZSA8YXNtL2Eub3V0Lmg+CiAjZW5kaWYKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvYS5vdXQtY29yZS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9hLm91dC1jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ5OWIzYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvYS5vdXQtY29yZS5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qIGEub3V0IGNvcmVkdW1wIHJlZ2lzdGVyIGR1bXBlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9BU01fQV9PVVRfQ09SRV9ICisjZGVmaW5lIF9BU01fQV9PVVRfQ09SRV9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC91c2VyLmg+CisKKy8qCisgKiBmaWxsIGluIHRoZSB1c2VyIHN0cnVjdHVyZSBmb3IgYW4gYS5vdXQgY29yZSBkdW1wCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhb3V0X2R1bXBfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3QgdXNlciAqZHVtcCkKK3sKKwkvKiBPbmx5IHNob3VsZCBiZSB1c2VkIGZvciBTdW5PUyBhbmQgYW5jaWVudCBhLm91dAorCSAqIFNwYXJjTGludXggYmluYXJpZXMuLi4gIE5vdCB3b3J0aCBpbXBsZW1lbnRpbmcuCisJICovCisJbWVtc2V0KGR1bXAsIDAsIHNpemVvZihzdHJ1Y3QgdXNlcikpOworfQorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9BU01fQV9PVVRfQ09SRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2Eub3V0LmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2Eub3V0LmgKaW5kZXggOTAyZTA3Zi4uNTNjOTViZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9hLm91dC5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvYS5vdXQuaApAQCAtOTMsMTggKzkzLDYgQEAKIAogI2RlZmluZSBOX1JFTE9DQVRJT05fSU5GT19ERUNMQVJFRCAxCiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNkZWZpbmUgU1RBQ0tfVE9QMzIJKCgxVUwgPDwgMzJVTCkgLSBQQUdFX1NJWkUpCi0jZGVmaW5lIFNUQUNLX1RPUDY0CSgweDAwMDAwODAwMDAwMDAwMDBVTCAtICgxVUwgPDwgMzJVTCkpCi0KLSNkZWZpbmUgU1RBQ0tfVE9QICh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVCkgPyBcCi0JCSAgIFNUQUNLX1RPUDMyIDogU1RBQ0tfVE9QNjQpCi0KLSNkZWZpbmUgU1RBQ0tfVE9QX01BWCBTVEFDS19UT1A2NAotCi0jZW5kaWYKLQogI2VuZGlmIC8qICEoX19BU1NFTUJMWV9fKSAqLwogCiAjZW5kaWYgLyogIShfX1NQQVJDNjRfQV9PVVRfSF9fKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9lbGYuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZWxmLmgKaW5kZXggODY1M2U4Ni4uMTFjOGU2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9lbGYuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2VsZi5oCkBAIC03LDExICs3LDkgQEAKICAqLwogCiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vc3BpdGZpcmUuaD4KLSNlbmRpZgogCiAvKgogICogU3BhcmMgc2VjdGlvbiB0eXBlcwpAQCAtNzIsMTggKzcwLDE1IEBACiAjZGVmaW5lIEhXQ0FQX1NQQVJDX0JMS0lOSVQJNjQKICNkZWZpbmUgSFdDQVBfU1BBUkNfTjIJCTEyOAogCisjZGVmaW5lIENPUkVfRFVNUF9VU0VfUkVHU0VUCisKIC8qCiAgKiBUaGVzZSBhcmUgdXNlZCB0byBzZXQgcGFyYW1ldGVycyBpbiB0aGUgY29yZSBkdW1wcy4KICAqLwotI2lmbmRlZiBFTEZfQVJDSAogI2RlZmluZSBFTEZfQVJDSAkJRU1fU1BBUkNWOQogI2RlZmluZSBFTEZfQ0xBU1MJCUVMRkNMQVNTNjQKICNkZWZpbmUgRUxGX0RBVEEJCUVMRkRBVEEyTVNCCiAKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBlbGZfZ3JlZ190OwotCi0jZGVmaW5lIEVMRl9OR1JFRyAzNgotdHlwZWRlZiBlbGZfZ3JlZ190IGVsZl9ncmVnc2V0X3RbRUxGX05HUkVHXTsKIC8qIEZvcm1hdCBvZiA2NC1iaXQgZWxmX2dyZWdzZXRfdCBpczoKICAqIAlHMCAtLT4gRzcKICAqIAlPMCAtLT4gTzcKQEAgLTk0LDI0ICs4OSw5IEBACiAgKglUTlBDCiAgKglZCiAgKi8KLSNkZWZpbmUgRUxGX0NPUkVfQ09QWV9SRUdTKF9fZWxmX3JlZ3MsIF9fcHRfcmVncykJXAotZG8gewl1bnNpZ25lZCBsb25nICpkZXN0ID0gJihfX2VsZl9yZWdzWzBdKTsJCVwKLQlzdHJ1Y3QgcHRfcmVncyAqc3JjID0gKF9fcHRfcmVncyk7CQlcCi0JdW5zaWduZWQgbG9uZyBfX3VzZXIgKnNwOwkJCVwKLQlpbnQgaTsJCQkJCQlcCi0JZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykJCQkJXAotCQlkZXN0W2ldID0gc3JjLT51X3JlZ3NbaV07CQlcCi0JLyogRG9uJ3QgdHJ5IHRoaXMgYXQgaG9tZSBraWRzLi4uICovCQlcCi0Jc3AgPSAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikJCQlcCi0JICgoc3JjLT51X3JlZ3NbMTRdICsgU1RBQ0tfQklBUykJCVwKLQkgICYgMHhmZmZmZmZmZmZmZmZmZmY4VUwpOwkJCVwKLQlmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKQkJCQlcCi0JCV9fZ2V0X3VzZXIoZGVzdFtpKzE2XSwgJnNwW2ldKTsJCVwKLQlkZXN0WzMyXSA9IHNyYy0+dHN0YXRlOwkJCQlcCi0JZGVzdFszM10gPSBzcmMtPnRwYzsJCQkJXAotCWRlc3RbMzRdID0gc3JjLT50bnBjOwkJCQlcCi0JZGVzdFszNV0gPSBzcmMtPnk7CQkJCVwKLX0gd2hpbGUgKDApOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGVsZl9ncmVnX3Q7CisjZGVmaW5lIEVMRl9OR1JFRyAzNgordHlwZWRlZiBlbGZfZ3JlZ190IGVsZl9ncmVnc2V0X3RbRUxGX05HUkVHXTsKIAogdHlwZWRlZiBzdHJ1Y3QgewogCXVuc2lnbmVkIGxvbmcJcHJfcmVnc1szMl07CkBAIC0xMTksMTcgKzk5LDU5IEBACiAJdW5zaWduZWQgbG9uZwlwcl9nc3I7CiAJdW5zaWduZWQgbG9uZwlwcl9mcHJzOwogfSBlbGZfZnByZWdzZXRfdDsKLSNlbmRpZgogCi0jZGVmaW5lIEVMRl9DT1JFX0NPUFlfVEFTS19SRUdTKF9fdHNrLCBfX2VsZl9yZWdzKQlcCi0JKHsgRUxGX0NPUkVfQ09QWV9SRUdTKCgqKF9fZWxmX3JlZ3MpKSwgdGFza19wdF9yZWdzKF9fdHNrKSk7IDE7IH0pCisvKiBGb3JtYXQgb2YgMzItYml0IGVsZl9ncmVnc2V0X3QgaXM6CisgKiAJRzAgLS0+IEc3CisgKglPMCAtLT4gTzcKKyAqCUwwIC0tPiBMNworICoJSTAgLS0+IEk3CisgKglQU1IsIFBDLCBuUEMsIFksIFdJTSwgVEJSCisgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IGNvbXBhdF9lbGZfZ3JlZ190OworI2RlZmluZSBDT01QQVRfRUxGX05HUkVHIDM4Cit0eXBlZGVmIGNvbXBhdF9lbGZfZ3JlZ190IGNvbXBhdF9lbGZfZ3JlZ3NldF90W0NPTVBBVF9FTEZfTkdSRUddOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5pb24geworCQl1bnNpZ25lZCBpbnQJcHJfcmVnc1szMl07CisJCXVuc2lnbmVkIGxvbmcJcHJfZHJlZ3NbMTZdOworCX0gcHJfZnI7CisJdW5zaWduZWQgaW50IF9fdW51c2VkOworCXVuc2lnbmVkIGludAlwcl9mc3I7CisJdW5zaWduZWQgY2hhcglwcl9xY250OworCXVuc2lnbmVkIGNoYXIJcHJfcV9lbnRyeXNpemU7CisJdW5zaWduZWQgY2hhcglwcl9lbjsKKwl1bnNpZ25lZCBpbnQJcHJfcVs2NF07Cit9IGNvbXBhdF9lbGZfZnByZWdzZXRfdDsKKworLyogVWx0cmFTcGFyYyBleHRlbnNpb25zLiAgU3RpbGwgdW51c2VkLCBidXQgd2lsbCBiZSBldmVudHVhbGx5LiAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgcHJfdHlwZTsKKwl1bnNpZ25lZCBpbnQgcHJfYWxpZ247CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdW5pb24geworCQkJCXVuc2lnbmVkIGludAlwcl9yZWdzWzMyXTsKKwkJCQl1bnNpZ25lZCBsb25nCXByX2RyZWdzWzE2XTsKKwkJCQlsb25nIGRvdWJsZQlwcl9xcmVnc1s4XTsKKwkJCX0gcHJfeGZyOworCQl9IHByX3Y4cDsKKwkJdW5zaWduZWQgaW50CXByX3hmc3I7CisJCXVuc2lnbmVkIGludAlwcl9mcHJzOworCQl1bnNpZ25lZCBpbnQJcHJfeGdbOF07CisJCXVuc2lnbmVkIGludAlwcl94b1s4XTsKKwkJdW5zaWduZWQgbG9uZwlwcl90c3RhdGU7CisJCXVuc2lnbmVkIGludAlwcl9maWxsZXJbOF07CisJfSBwcl91bjsKK30gZWxmX3hyZWdzZXRfdDsKIAogLyoKICAqIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgd2UgZG9uJ3QgbG9hZCBzb21ldGhpbmcgZm9yIHRoZSB3cm9uZyBhcmNoaXRlY3R1cmUuCiAgKi8KLSNpZm5kZWYgZWxmX2NoZWNrX2FyY2gKLSNkZWZpbmUgZWxmX2NoZWNrX2FyY2goeCkgKCh4KS0+ZV9tYWNoaW5lID09IEVMRl9BUkNIKQkvKiBNaWdodCBiZSBFTV9TUEFSQ1Y5IG9yIEVNX1NQQVJDICovCi0jZW5kaWYKKyNkZWZpbmUgZWxmX2NoZWNrX2FyY2goeCkJCSgoeCktPmVfbWFjaGluZSA9PSBFTEZfQVJDSCkKKyNkZWZpbmUgY29tcGF0X2VsZl9jaGVja19hcmNoKHgpCSgoeCktPmVfbWFjaGluZSA9PSBFTV9TUEFSQyB8fCBcCisJCQkJCSAoeCktPmVfbWFjaGluZSA9PSBFTV9TUEFSQzMyUExVUykKKyNkZWZpbmUgY29tcGF0X3N0YXJ0X3RocmVhZAkJc3RhcnRfdGhyZWFkMzIKIAogI2RlZmluZSBVU0VfRUxGX0NPUkVfRFVNUAogI2RlZmluZSBFTEZfRVhFQ19QQUdFU0laRQlQQUdFX1NJWkUKQEAgLTEzOSw5ICsxNjEsOCBAQAogICAgdGhlIGxvYWRlci4gIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgb3V0IG9mIHRoZSB3YXkgb2YgdGhlIHByb2dyYW0KICAgIHRoYXQgaXQgd2lsbCAiZXhlYyIsIGFuZCB0aGF0IHRoZXJlIGlzIHN1ZmZpY2llbnQgcm9vbSBmb3IgdGhlIGJyay4gICovCiAKLSNpZm5kZWYgRUxGX0VUX0RZTl9CQVNFCi0jZGVmaW5lIEVMRl9FVF9EWU5fQkFTRSAgICAgICAgIDB4MDAwMDAxMDAwMDAwMDAwMFVMCi0jZW5kaWYKKyNkZWZpbmUgRUxGX0VUX0RZTl9CQVNFCQkweDAwMDAwMTAwMDAwMDAwMDBVTAorI2RlZmluZSBDT01QQVRfRUxGX0VUX0RZTl9CQVNFCTB4MDAwMDAwMDA3MDAwMDAwMFVMCiAKIAogLyogVGhpcyB5aWVsZHMgYSBtYXNrIHRoYXQgdXNlciBwcm9ncmFtcyBjYW4gdXNlIHRvIGZpZ3VyZSBvdXQgd2hhdApAQCAtMTc1LDcgKzE5Niw2IEBACiAKICNkZWZpbmUgRUxGX1BMQVRGT1JNCShOVUxMKQogCi0jaWZkZWYgX19LRVJORUxfXwogI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgsIGliY3MyKQkJCVwKIGRvIHsJdW5zaWduZWQgbG9uZyBuZXdfZmxhZ3MgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzOyBcCiAJbmV3X2ZsYWdzICY9IF9USUZfMzJCSVQ7CQkJXApAQCAtMTk0LDYgKzIxNCw1IEBACiAJZWxzZSBpZiAoY3VycmVudC0+cGVyc29uYWxpdHkgIT0gUEVSX0xJTlVYMzIpCVwKIAkJc2V0X3BlcnNvbmFsaXR5KFBFUl9MSU5VWCk7CQlcCiB9IHdoaWxlICgwKQotI2VuZGlmCiAKICNlbmRpZiAvKiAhKF9fQVNNX1NQQVJDNjRfRUxGX0gpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BhZ2UuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGFnZS5oCmluZGV4IDdhZjEwNzcuLmU5M2E0ODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGFnZS5oCkBAIC0zLDggKzMsNiBAQAogI2lmbmRlZiBfU1BBUkM2NF9QQUdFX0gKICNkZWZpbmUgX1NQQVJDNjRfUEFHRV9ICiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0KICNpbmNsdWRlIDxsaW51eC9jb25zdC5oPgogCiAjaWYgZGVmaW5lZChDT05GSUdfU1BBUkM2NF9QQUdFX1NJWkVfOEtCKQpAQCAtMTA2LDYgKzEwNCw4IEBACiAKICNlbmRpZiAvKiAoU1RSSUNUX01NX1RZUEVDSEVDS1MpICovCiAKK3R5cGVkZWYgc3RydWN0IHBhZ2UgKnBndGFibGVfdDsKKwogI2RlZmluZSBUQVNLX1VOTUFQUEVEX0JBU0UJKHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUKSA/IFwKIAkJCQkgKF9BQygweDAwMDAwMDAwNzAwMDAwMDAsVUwpKSA6IFwKIAkJCQkgKF9BQygweGZmZmZmODAwMDAwMDAwMDAsVUwpICsgKDFVTCA8PCAzMlVMKSkpCkBAIC0xNDMsNSArMTQzLDQgQEAKIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BhZ2UuaD4KIAotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfU1BBUkM2NF9QQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGdhbGxvYy5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wZ2FsbG9jLmgKaW5kZXggYjQ4ZjczYy4uM2VlMmQ0MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wZ2FsbG9jLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wZ2FsbG9jLmgKQEAgLTQzLDExICs0MywxOCBAQAogCXJldHVybiBxdWlja2xpc3RfYWxsb2MoMCwgR0ZQX0tFUk5FTCwgTlVMTCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnB0ZV9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sCi0JCQkJCSB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCitzdGF0aWMgaW5saW5lIHBndGFibGVfdCBwdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCQl1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7Ci0Jdm9pZCAqcGcgPSBxdWlja2xpc3RfYWxsb2MoMCwgR0ZQX0tFUk5FTCwgTlVMTCk7Ci0JcmV0dXJuIHBnID8gdmlydF90b19wYWdlKHBnKSA6IE5VTEw7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdm9pZCAqcGc7CisKKwlwZyA9IHF1aWNrbGlzdF9hbGxvYygwLCBHRlBfS0VSTkVMLCBOVUxMKTsKKwlpZiAoIXBnKQorCQlyZXR1cm4gTlVMTDsKKwlwYWdlID0gdmlydF90b19wYWdlKHBnKTsKKwlwZ3RhYmxlX3BhZ2VfY3RvcihwYWdlKTsKKwlyZXR1cm4gcGFnZTsKIH0KIAkJCiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdGVfdCAqcHRlKQpAQCAtNTUsOCArNjIsOSBAQAogCXF1aWNrbGlzdF9mcmVlKDAsIE5VTEwsIHB0ZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwdGVfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHBhZ2UgKnB0ZXBhZ2UpCitzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBndGFibGVfdCBwdGVwYWdlKQogeworCXBndGFibGVfcGFnZV9kdG9yKHB0ZXBhZ2UpOwogCXF1aWNrbGlzdF9mcmVlX3BhZ2UoMCwgTlVMTCwgcHRlcGFnZSk7CiB9CiAKQEAgLTY0LDYgKzcyLDcgQEAKICNkZWZpbmUgcG1kX3BvcHVsYXRlX2tlcm5lbChNTSwgUE1ELCBQVEUpCXBtZF9zZXQoUE1ELCBQVEUpCiAjZGVmaW5lIHBtZF9wb3B1bGF0ZShNTSxQTUQsUFRFX1BBR0UpCQlcCiAJcG1kX3BvcHVsYXRlX2tlcm5lbChNTSxQTUQscGFnZV9hZGRyZXNzKFBURV9QQUdFKSkKKyNkZWZpbmUgcG1kX3BndGFibGUocG1kKSBwbWRfcGFnZShwbWQpCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19wZ3RfY2FjaGUodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcG9zaXhfdHlwZXMuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcG9zaXhfdHlwZXMuaAppbmRleCAzNDI2YTY1Li40ZWFhYTAxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3Bvc2l4X3R5cGVzLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wb3NpeF90eXBlcy5oCkBAIC00MywxNCArNDMsMTAgQEAKICNlbmRpZgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0jaWYgZGVmaW5lZChfX0tFUk5FTF9fKSB8fCBkZWZpbmVkKF9fVVNFX0FMTCkKIAlpbnQJdmFsWzJdOwotI2Vsc2UgLyogIWRlZmluZWQoX19LRVJORUxfXykgJiYgIWRlZmluZWQoX19VU0VfQUxMKSAqLwotCWludCAgICAgX192YWxbMl07Ci0jZW5kaWYgLyogIWRlZmluZWQoX19LRVJORUxfXykgJiYgIWRlZmluZWQoX19VU0VfQUxMKSAqLwogfSBfX2tlcm5lbF9mc2lkX3Q7CiAKLSNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8ICFkZWZpbmVkKF9fR0xJQkNfXykgfHwgKF9fR0xJQkNfXyA8IDIpCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKQogCiAjdW5kZWYgX19GRF9TRVQKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX0ZEX1NFVCh1bnNpZ25lZCBsb25nIGZkLCBfX2tlcm5lbF9mZF9zZXQgKmZkc2V0cCkKQEAgLTEyMSw2ICsxMTcsNiBAQAogCX0KIH0KIAotI2VuZGlmIC8qIGRlZmluZWQoX19LRVJORUxfXykgfHwgIWRlZmluZWQoX19HTElCQ19fKSB8fCAoX19HTElCQ19fIDwgMikgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKF9fS0VSTkVMX18pICovCiAKICNlbmRpZiAvKiAhKF9fQVJDSF9TUEFSQzY0X1BPU0lYX1RZUEVTX0gpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wcm9jZXNzb3IuaAppbmRleCA2NmRkMmZhLi44ZGE0ODRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcHJvY2Vzc29yLmgKQEAgLTE0LDcgKzE0LDYgQEAKICNkZWZpbmUgY3VycmVudF90ZXh0X2FkZHIoKSAoeyB2b2lkICpwYzsgX19hc21fXygicmQgJSVwYywgJTAiIDogIj1yIiAocGMpKTsgcGM7IH0pCiAKICNpbmNsdWRlIDxhc20vYXNpLmg+Ci0jaW5jbHVkZSA8YXNtL2Eub3V0Lmg+CiAjaW5jbHVkZSA8YXNtL3BzdGF0ZS5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpAQCAtMzYsNyArMzUsMTkgQEAKICNlbHNlCiAjZGVmaW5lIFZQVEVfU0laRQkoMSA8PCAoVkFfQklUUyAtIFBBR0VfU0hJRlQgKyAzKSkKICNlbmRpZgorCiAjZGVmaW5lIFRBU0tfU0laRQkoKHVuc2lnbmVkIGxvbmcpLVZQVEVfU0laRSkKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNkZWZpbmUgU1RBQ0tfVE9QMzIJKCgxVUwgPDwgMzJVTCkgLSBQQUdFX1NJWkUpCisjZGVmaW5lIFNUQUNLX1RPUDY0CSgweDAwMDAwODAwMDAwMDAwMDBVTCAtICgxVUwgPDwgMzJVTCkpCisKKyNkZWZpbmUgU1RBQ0tfVE9QCSh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVCkgPyBcCisJCQkgU1RBQ0tfVE9QMzIgOiBTVEFDS19UT1A2NCkKKworI2RlZmluZSBTVEFDS19UT1BfTUFYCVNUQUNLX1RPUDY0CisKKyNlbmRpZgogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3B0cmFjZS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wdHJhY2UuaAppbmRleCA3ZWJhOTBjLi44NjE3YzNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3B0cmFjZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcHRyYWNlLmgKQEAgLTk1LDcgKzk1LDcgQEAKIAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2RlZmluZSBfX0FSQ0hfU1lTX1BUUkFDRQkxCisjZGVmaW5lIF9fQVJDSF9XQU5UX0NPTVBBVF9TWVNfUFRSQUNFCiAKICNkZWZpbmUgZm9yY2Vfc3VjY2Vzc2Z1bF9zeXNjYWxsX3JldHVybigpCSAgICBcCiBkbyB7CWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3lzY2FsbF9ub2Vycm9yID0gMTsgXApAQCAtMjYxLDggKzI2MSw2IEBACiAjZGVmaW5lIFNGX1hYQVJHICAweDVjCiAKIC8qIFN0dWZmIGZvciB0aGUgcHRyYWNlIHN5c3RlbSBjYWxsICovCi0jZGVmaW5lIFBUUkFDRV9TVU5BVFRBQ0ggICAgICAgICAgMTAKLSNkZWZpbmUgUFRSQUNFX1NVTkRFVEFDSCAgICAgICAgICAxMQogI2RlZmluZSBQVFJBQ0VfR0VUUkVHUyAgICAgICAgICAgIDEyCiAjZGVmaW5lIFBUUkFDRV9TRVRSRUdTICAgICAgICAgICAgMTMKICNkZWZpbmUgUFRSQUNFX0dFVEZQUkVHUyAgICAgICAgICAxNApAQCAtMjg0LDE4ICsyODIsNCBAQAogI2RlZmluZSBQVFJBQ0VfR0VURlBSRUdTNjQJICAyNQogI2RlZmluZSBQVFJBQ0VfU0VURlBSRUdTNjQJICAyNgogCi0jZGVmaW5lIFBUUkFDRV9HRVRVQ09ERSAgICAgICAgICAgMjkgIC8qIHN0dXBpZCBic2QtaXNtICovCi0KLS8qIFRoZXNlIGFyZSBmb3IgMzItYml0IHByb2Nlc3NlcyBkZWJ1Z2dpbmcgNjQtYml0IG9uZXMuCi0gKiBIZXJlIGFkZHIgYW5kIGFkZHIyIGFyZSBwYXNzZWQgaW4gJWcyIGFuZCAlZzMgcmVzcGVjdGl2ZWx5LgotICovCi0jZGVmaW5lIFBUUkFDRV9QRUVLVEVYVDY0ICAgICAgICAgKDMwICsgUFRSQUNFX1BFRUtURVhUKQotI2RlZmluZSBQVFJBQ0VfUE9LRVRFWFQ2NCAgICAgICAgICgzMCArIFBUUkFDRV9QT0tFVEVYVCkKLSNkZWZpbmUgUFRSQUNFX1BFRUtEQVRBNjQgICAgICAgICAoMzAgKyBQVFJBQ0VfUEVFS0RBVEEpCi0jZGVmaW5lIFBUUkFDRV9QT0tFREFUQTY0ICAgICAgICAgKDMwICsgUFRSQUNFX1BPS0VEQVRBKQotI2RlZmluZSBQVFJBQ0VfUkVBRERBVEE2NCAgICAgICAgICgzMCArIFBUUkFDRV9SRUFEREFUQSkKLSNkZWZpbmUgUFRSQUNFX1dSSVRFREFUQTY0ICAgICAgICAoMzAgKyBQVFJBQ0VfV1JJVEVEQVRBKQotI2RlZmluZSBQVFJBQ0VfUkVBRFRFWFQ2NCAgICAgICAgICgzMCArIFBUUkFDRV9SRUFEVEVYVCkKLSNkZWZpbmUgUFRSQUNFX1dSSVRFVEVYVDY0ICAgICAgICAoMzAgKyBQVFJBQ0VfV1JJVEVURVhUKQotCiAjZW5kaWYgLyogIShfU1BBUkM2NF9QVFJBQ0VfSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3N5c3RlbS5oCmluZGV4IDk5YTY2OWMuLjFmYWVmYTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9zeXN0ZW0uaApAQCAtOCw2ICs4LDcgQEAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKICNpbmNsdWRlIDxsaW51eC9pcnFmbGFncy5oPgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NtcHhjaGctbG9jYWwuaD4KIAogLyoKICAqIFNwYXJjIChnZW5lcmFsKSBDUFUgdHlwZXMKQEAgLTMxNSw2ICszMTYsMzQgQEAKIAkJCQkgICAgKHVuc2lnbmVkIGxvbmcpX25fLCBzaXplb2YoKihwdHIpKSk7IFwKICAgfSkKIAorLyoKKyAqIGNtcHhjaGdfbG9jYWwgYW5kIGNtcHhjaGc2NF9sb2NhbCBhcmUgYXRvbWljIHdydCBjdXJyZW50IENQVS4gQWx3YXlzIG1ha2UKKyAqIHRoZW0gYXZhaWxhYmxlLgorICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2NtcHhjaGdfbG9jYWwodm9sYXRpbGUgdm9pZCAqcHRyLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2xkLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbmV3LCBpbnQgc2l6ZSkKK3sKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIDQ6CisJY2FzZSA4OglyZXR1cm4gX19jbXB4Y2hnKHB0ciwgb2xkLCBuZXcsIHNpemUpOworCWRlZmF1bHQ6CisJCXJldHVybiBfX2NtcHhjaGdfbG9jYWxfZ2VuZXJpYyhwdHIsIG9sZCwgbmV3LCBzaXplKTsKKwl9CisKKwlyZXR1cm4gb2xkOworfQorCisjZGVmaW5lIGNtcHhjaGdfbG9jYWwocHRyLCBvLCBuKQkJCQkgIAlcCisJKChfX3R5cGVvZl9fKCoocHRyKSkpX19jbXB4Y2hnX2xvY2FsKChwdHIpLCAodW5zaWduZWQgbG9uZykobyksCVwKKwkJCSh1bnNpZ25lZCBsb25nKShuKSwgc2l6ZW9mKCoocHRyKSkpKQorI2RlZmluZSBjbXB4Y2hnNjRfbG9jYWwocHRyLCBvLCBuKQkJCQkJXAorICAoewkJCQkJCQkJCVwKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKCoocHRyKSkgIT0gOCk7CQkJCVwKKwljbXB4Y2hnX2xvY2FsKChwdHIpLCAobyksIChuKSk7CQkJCQlcCisgIH0pCisKICNlbmRpZiAvKiAhKF9fQVNTRU1CTFlfXykgKi8KIAogI2RlZmluZSBhcmNoX2FsaWduX3N0YWNrKHgpICh4KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3VhY2Nlc3MuaAppbmRleCA5MzcyMGU3Li5kODU0N2I4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3VhY2Nlc3MuaApAQCAtMTAsNyArMTAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxhc20vYS5vdXQuaD4KICNpbmNsdWRlIDxhc20vYXNpLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9zcGl0ZmlyZS5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC91c2VyLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3VzZXIuaAppbmRleCBmY2U0ZTg1Li4wMmIxMzg5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3VzZXIuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3VzZXIuaApAQCAtOCw3ICs4LDcgQEAKICNpZm5kZWYgX1NQQVJDNjRfVVNFUl9ICiAjZGVmaW5lIF9TUEFSQzY0X1VTRVJfSAogCi0jaW5jbHVkZSA8YXNtL2Eub3V0Lmg+CisjaW5jbHVkZSA8bGludXgvYS5vdXQuaD4KIHN0cnVjdCBzdW5vc19yZWdzIHsKIAl1bnNpZ25lZCBpbnQgcHNyLCBwYywgbnBjLCB5OwogCXVuc2lnbmVkIGludCByZWdzWzE1XTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXVtL2Eub3V0LWNvcmUuaCBiL2luY2x1ZGUvYXNtLXVtL2Eub3V0LWNvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTU2NDNiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tdW0vYS5vdXQtY29yZS5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qIGEub3V0IGNvcmVkdW1wIHJlZ2lzdGVyIGR1bXBlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fVU1fQV9PVVRfQ09SRV9ICisjZGVmaW5lIF9fVU1fQV9PVVRfQ09SRV9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC91c2VyLmg+CisKKy8qCisgKiBmaWxsIGluIHRoZSB1c2VyIHN0cnVjdHVyZSBmb3IgYW4gYS5vdXQgY29yZSBkdW1wCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhb3V0X2R1bXBfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3QgdXNlciAqdSkKK3sKK30KKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfX1VNX0FfT1VUX0NPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdW0vYS5vdXQuaCBiL2luY2x1ZGUvYXNtLXVtL2Eub3V0LmgKaW5kZXggZjQyZmYxNDUuLjc1NDE4MWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXVtL2Eub3V0LmgKKysrIGIvaW5jbHVkZS9hc20tdW0vYS5vdXQuaApAQCAtOCwxNSArOCw0IEBACiAKICNpbmNsdWRlICJhc20vYXJjaC9hLm91dC5oIgogCi0jdW5kZWYgU1RBQ0tfVE9QCi0jdW5kZWYgU1RBQ0tfVE9QX01BWAotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBzdGFja3NpemVsaW07Ci0KLSNkZWZpbmUgU1RBQ0tfUk9PTSAoc3RhY2tzaXplbGltKQotCi0jZGVmaW5lIFNUQUNLX1RPUCAoVEFTS19TSVpFIC0gMiAqIFBBR0VfU0laRSkKLQotI2RlZmluZSBTVEFDS19UT1BfTUFYIFNUQUNLX1RPUAotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXVtL2ZpeG1hcC5oIGIvaW5jbHVkZS9hc20tdW0vZml4bWFwLmgKaW5kZXggODlhODdjMS4uOWQyYmU1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdW0vZml4bWFwLmgKKysrIGIvaW5jbHVkZS9hc20tdW0vZml4bWFwLmgKQEAgLTEsNiArMSw3IEBACiAjaWZuZGVmIF9fVU1fRklYTUFQX0gKICNkZWZpbmUgX19VTV9GSVhNQVBfSAogCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20va21hcF90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9hcmNocGFyYW0uaD4KQEAgLTU3LDcgKzU4LDcgQEAKICAqIGF0IHRoZSB0b3Agb2YgbWVtLi4KICAqLwogCi0jZGVmaW5lIEZJWEFERFJfVE9QCShDT05GSUdfVE9QX0FERFIgLSAyICogUEFHRV9TSVpFKQorI2RlZmluZSBGSVhBRERSX1RPUAkoVEFTS19TSVpFIC0gMiAqIFBBR0VfU0laRSkKICNkZWZpbmUgRklYQUREUl9TSVpFCShfX2VuZF9vZl9maXhlZF9hZGRyZXNzZXMgPDwgUEFHRV9TSElGVCkKICNkZWZpbmUgRklYQUREUl9TVEFSVAkoRklYQUREUl9UT1AgLSBGSVhBRERSX1NJWkUpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXVtL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLXVtL3BhZ2UuaAppbmRleCBmZTIzNzRkLi4zODFmOTZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS11bS9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tdW0vcGFnZS5oCkBAIC03OSw2ICs3OSw4IEBACiAKIHR5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBwZ3Byb3Q7IH0gcGdwcm90X3Q7CiAKK3R5cGVkZWYgc3RydWN0IHBhZ2UgKnBndGFibGVfdDsKKwogI2RlZmluZSBwZ2RfdmFsKHgpCSgoeCkucGdkKQogI2RlZmluZSBwZ3Byb3RfdmFsKHgpCSgoeCkucGdwcm90KQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9wZ2FsbG9jLmggYi9pbmNsdWRlL2FzbS11bS9wZ2FsbG9jLmgKaW5kZXggNGYzZTYyYi4uOTA2MmE2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdW0vcGdhbGxvYy5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL3BnYWxsb2MuaApAQCAtMTgsNiArMTgsNyBAQAogCXNldF9wbWQocG1kLCBfX3BtZChfUEFHRV9UQUJMRSArCQkJXAogCQkoKHVuc2lnbmVkIGxvbmcgbG9uZylwYWdlX3RvX3BmbihwdGUpIDw8CVwKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIFBBR0VfU0hJRlQpKSkKKyNkZWZpbmUgcG1kX3BndGFibGUocG1kKSBwbWRfcGFnZShwbWQpCiAKIC8qCiAgKiBBbGxvY2F0ZSBhbmQgZnJlZSBwYWdlIHRhYmxlcy4KQEAgLTI2LDE5ICsyNywyNCBAQAogZXh0ZXJuIHZvaWQgcGdkX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBnZF90ICpwZ2QpOwogCiBleHRlcm4gcHRlX3QgKnB0ZV9hbGxvY19vbmVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKiwgdW5zaWduZWQgbG9uZyk7Ci1leHRlcm4gc3RydWN0IHBhZ2UgKnB0ZV9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiBwZ3RhYmxlX3QgcHRlX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICosIHVuc2lnbmVkIGxvbmcpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdGVfdCAqcHRlKQogewogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcHRlKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHB0ZV9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgcGFnZSAqcHRlKQorc3RhdGljIGlubGluZSB2b2lkIHB0ZV9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ3RhYmxlX3QgcHRlKQogeworCXBndGFibGVfcGFnZV9kdG9yKHB0ZSk7CiAJX19mcmVlX3BhZ2UocHRlKTsKIH0KIAotI2RlZmluZSBfX3B0ZV9mcmVlX3RsYih0bGIscHRlKSB0bGJfcmVtb3ZlX3BhZ2UoKHRsYiksKHB0ZSkpCisjZGVmaW5lIF9fcHRlX2ZyZWVfdGxiKHRsYixwdGUpCQkJCVwKK2RvIHsJCQkJCQkJXAorCXBndGFibGVfcGFnZV9kdG9yKHB0ZSk7CQkJCVwKKwl0bGJfcmVtb3ZlX3BhZ2UoKHRsYiksKHB0ZSkpOwkJCVwKK30gd2hpbGUgKDApCiAKICNpZmRlZiBDT05GSUdfM19MRVZFTF9QR1RBQkxFUwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9wcm9jZXNzb3ItZ2VuZXJpYy5oIGIvaW5jbHVkZS9hc20tdW0vcHJvY2Vzc29yLWdlbmVyaWMuaAppbmRleCBiN2Q5YTE2Li5iZWQ2Njg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS11bS9wcm9jZXNzb3ItZ2VuZXJpYy5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL3Byb2Nlc3Nvci1nZW5lcmljLmgKQEAgLTExLDcgKzExLDYgQEAKIHN0cnVjdCB0YXNrX3N0cnVjdDsKIAogI2luY2x1ZGUgImFzbS9wdHJhY2UuaCIKLSNpbmNsdWRlICJhc20vcGd0YWJsZS5oIgogI2luY2x1ZGUgInJlZ2lzdGVycy5oIgogI2luY2x1ZGUgInN5c2RlcC9hcmNoc2V0am1wLmgiCiAKQEAgLTkyLDcgKzkxLDE4IEBACiAvKgogICogVXNlciBzcGFjZSBwcm9jZXNzIHNpemU6IDNHQiAoZGVmYXVsdCkuCiAgKi8KLSNkZWZpbmUgVEFTS19TSVpFIChDT05GSUdfVE9QX0FERFIgJiBQR0RJUl9NQVNLKQorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdGFza19zaXplOworCisjZGVmaW5lIFRBU0tfU0laRSAodGFza19zaXplKQorCisjdW5kZWYgU1RBQ0tfVE9QCisjdW5kZWYgU1RBQ0tfVE9QX01BWAorCitleHRlcm4gdW5zaWduZWQgbG9uZyBzdGFja3NpemVsaW07CisKKyNkZWZpbmUgU1RBQ0tfUk9PTQkoc3RhY2tzaXplbGltKQorI2RlZmluZSBTVEFDS19UT1AJKFRBU0tfU0laRSAtIDIgKiBQQUdFX1NJWkUpCisjZGVmaW5lIFNUQUNLX1RPUF9NQVgJU1RBQ0tfVE9QCiAKIC8qIFRoaXMgZGVjaWRlcyB3aGVyZSB0aGUga2VybmVsIHdpbGwgc2VhcmNoIGZvciBhIGZyZWUgY2h1bmsgb2Ygdm0KICAqIHNwYWNlIGR1cmluZyBtbWFwJ3MuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9wcm9jZXNzb3IteDg2XzY0LmggYi9pbmNsdWRlL2FzbS11bS9wcm9jZXNzb3IteDg2XzY0LmgKaW5kZXggZDk0NmJmMi4uZTUwOTMzMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdW0vcHJvY2Vzc29yLXg4Nl82NC5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL3Byb2Nlc3Nvci14ODZfNjQuaApAQCAtMjYsNyArMjYsNyBAQAogI2RlZmluZSBjcHVfcmVsYXgoKSAgIHJlcF9ub3AoKQogCiAjZGVmaW5lIElOSVRfQVJDSF9USFJFQUQgeyAuZGVidWdyZWdzICAJCT0geyBbIDAgLi4uIDcgXSA9IDAgfSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRlYnVncmVnc19zZXEJPSAwLAkJCSAgICAgICBcCisJCQkgICAuZGVidWdyZWdzX3NlcQk9IDAsIFwKIAkJCSAgIC5mcwkJCT0gMCwgXAogCQkJICAgLmZhdWx0aW5mbwkJPSB7IDAsIDAsIDAgfSB9CiAKQEAgLTM3LDYgKzM3LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2NvcHlfdGhyZWFkKHN0cnVjdCBhcmNoX3RocmVhZCAqZnJvbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhcmNoX3RocmVhZCAqdG8pCiB7CisJdG8tPmZzID0gZnJvbS0+ZnM7CiB9CiAKICNpbmNsdWRlICJhc20vYXJjaC91c2VyLmgiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL2FubmEuaCBiL2luY2x1ZGUvYXNtLXY4NTAvYW5uYS5oCmluZGV4IDNiZTc3ZDUuLmNkNWVhZWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXY4NTAvYW5uYS5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvYW5uYS5oCkBAIC0xMzQsMTAgKzEzNCw0IEBACiAjZGVmaW5lIFY4NTBFX1RJTUVSX0RfVE1DRF9DU19NSU4JMSAvKiBtaW4gMl4xIGRpdmlkZXIgKi8KIAogCi0vKiBGb3IgPGFzbS9wYXJhbS5oPiAqLwotI2lmbmRlZiBIWgotI2RlZmluZSBIWgkxMDAKLSNlbmRpZgotCi0KICNlbmRpZiAvKiBfX1Y4NTBfQU5OQV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXY4NTAvYXM4NWVwMS5oIGIvaW5jbHVkZS9hc20tdjg1MC9hczg1ZXAxLmgKaW5kZXggNjU5YmM5MTAuLjVhNWNhOTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXY4NTAvYXM4NWVwMS5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvYXM4NWVwMS5oCkBAIC0xNDksMTAgKzE0OSw0IEBACiAjZGVmaW5lIFY4NTBFX1RJTUVSX0RfVE1DRF9DU19NSU4JMiAvKiBtaW4gMl4yIGRpdmlkZXIgKi8KIAogCi0vKiBGb3IgPGFzbS9wYXJhbS5oPiAqLwotI2lmbmRlZiBIWgotI2RlZmluZSBIWgkxMDAKLSNlbmRpZgotCi0KICNlbmRpZiAvKiBfX1Y4NTBfQVM4NUVQMV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXY4NTAvZWxmLmggYi9pbmNsdWRlL2FzbS12ODUwL2VsZi5oCmluZGV4IDdkYjhlZGYuLjI4ZjViMTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXY4NTAvZWxmLmgKKysrIGIvaW5jbHVkZS9hc20tdjg1MC9lbGYuaApAQCAtOTQsOCArOTQsNiBAQAogCTA7CQkJCQkJCQkgICAgICBcCiAgIH0gd2hpbGUgKDApCiAKLSNpZmRlZiBfX0tFUk5FTF9fCiAjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCwgaWJjczIpIHNldF9wZXJzb25hbGl0eShQRVJfTElOVVhfMzJCSVQpCi0jZW5kaWYKIAogI2VuZGlmIC8qIF9fVjg1MF9FTEZfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL2ZwZ2E4NWUyYy5oIGIvaW5jbHVkZS9hc20tdjg1MC9mcGdhODVlMmMuaAppbmRleCBkMzJmMDQ1Li4yM2FhZTY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS12ODUwL2ZwZ2E4NWUyYy5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvZnBnYTg1ZTJjLmgKQEAgLTc5LDEwICs3OSw0IEBACiAjZW5kaWYKIAogCi0vKiBGb3IgPGFzbS9wYXJhbS5oPiAqLwotI2lmbmRlZiBIWgotI2RlZmluZSBIWgkJCTEyMiAvKiBhY3R1YWxseSwgOC4xOTJtcyB0aWNrcyA9fiAxMjIuMDcgKi8KLSNlbmRpZgotCi0KICNlbmRpZiAvKiBfX1Y4NTBfRlBHQTg1RTJDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdjg1MC9wYWdlLmggYi9pbmNsdWRlL2FzbS12ODUwL3BhZ2UuaAppbmRleCBkNjkzZmZiLi43NGE1MzlhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS12ODUwL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS12ODUwL3BhZ2UuaApAQCAtMTQsOCArMTQsNiBAQAogI2lmbmRlZiBfX1Y4NTBfUEFHRV9IX18KICNkZWZpbmUgX19WODUwX1BBR0VfSF9fCiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogCiAKQEAgLTU5LDYgKzU3LDcgQEAKIHR5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBwbWQ7IH0gcG1kX3Q7CiB0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcGdkOyB9IHBnZF90OwogdHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBsb25nIHBncHJvdDsgfSBwZ3Byb3RfdDsKK3R5cGVkZWYgc3RydWN0IHBhZ2UgKnBndGFibGVfdDsKIAogI2RlZmluZSBwdGVfdmFsKHgpICAgICAgKCh4KS5wdGUpCiAjZGVmaW5lIHBtZF92YWwoeCkgICAgICAoKHgpLnBtZCkKQEAgLTEyNiw2ICsxMjUsNCBAQAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL21lbW9yeV9tb2RlbC5oPgogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BhZ2UuaD4KIAotI2VuZGlmIC8qIEtFUk5FTCAqLwotCiAjZW5kaWYgLyogX19WODUwX1BBR0VfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL3BhcmFtLmggYi9pbmNsdWRlL2FzbS12ODUwL3BhcmFtLmgKaW5kZXggM2M2NWJkNS4uMjgxODMyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdjg1MC9wYXJhbS5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvcGFyYW0uaApAQCAtMjMsOCArMjMsNyBAQAogI2RlZmluZSBNQVhIT1NUTkFNRUxFTgk2NAkvKiBtYXggbGVuZ3RoIG9mIGhvc3RuYW1lICovCiAKICNpZmRlZiBfX0tFUk5FTF9fCi0jaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4JLyogRm9yIEhaICovCi0KKyMgZGVmaW5lIEhaCQlDT05GSUdfSFoKICMgZGVmaW5lIFVTRVJfSFoJMTAwCiAjIGRlZmluZSBDTE9DS1NfUEVSX1NFQwlVU0VSX0haCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXY4NTAvcG9zaXhfdHlwZXMuaCBiL2luY2x1ZGUvYXNtLXY4NTAvcG9zaXhfdHlwZXMuaAppbmRleCBjY2I3Mjk3Li43ZjQwM2I3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS12ODUwL3Bvc2l4X3R5cGVzLmgKKysrIGIvaW5jbHVkZS9hc20tdjg1MC9wb3NpeF90eXBlcy5oCkBAIC00NCwxNSArNDQsMTEgQEAKIHR5cGVkZWYgdW5zaWduZWQgaW50CV9fa2VybmVsX29sZF9kZXZfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgewotI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgZGVmaW5lZChfX1VTRV9BTEwpCiAJaW50CXZhbFsyXTsKLSNlbHNlIC8qICFkZWZpbmVkKF9fS0VSTkVMX18pICYmICFkZWZpbmVkKF9fVVNFX0FMTCkgKi8KLQlpbnQJX192YWxbMl07Ci0jZW5kaWYgLyogIWRlZmluZWQoX19LRVJORUxfXykgJiYgIWRlZmluZWQoX19VU0VfQUxMKSAqLwogfSBfX2tlcm5lbF9mc2lkX3Q7CiAKIAotI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgIWRlZmluZWQoX19HTElCQ19fKSB8fCAoX19HTElCQ19fIDwgMikKKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pCiAKIC8qIFdlIHVzZWQgdG8gaW5jbHVkZSA8YXNtL2JpdG9wcy5oPiBoZXJlLCB3aGljaCBzZWVtcyB0aGUgcmlnaHQgdGhpbmcsIGJ1dAogICAgaXQgY2F1c2VkIG5hc3R5IGluY2x1ZGUtZmlsZSBkZWZpbml0aW9uIG9yZGVyIHByb2JsZW1zLiAgUmVtb3ZpbmcgdGhlCkBAIC03MSw2ICs2Nyw2IEBACiAjZGVmaW5lIF9fRkRfWkVSTyhmZF9zZXQpIFwKICAgbWVtc2V0IChmZF9zZXQsIDAsIHNpemVvZiAoKihmZF9zZXQgKilmZF9zZXQpKQogCi0jZW5kaWYgLyogZGVmaW5lZChfX0tFUk5FTF9fKSB8fCAhZGVmaW5lZChfX0dMSUJDX18pIHx8IChfX0dMSUJDX18gPCAyKSAqLworI2VuZGlmIC8qIGRlZmluZWQoX19LRVJORUxfXykgKi8KIAogI2VuZGlmIC8qIF9fVjg1MF9QT1NJWF9UWVBFU19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXY4NTAvcnRlX2NiLmggYi9pbmNsdWRlL2FzbS12ODUwL3J0ZV9jYi5oCmluZGV4IGU4NWQyNjEuLmRiOTg3OWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXY4NTAvcnRlX2NiLmgKKysrIGIvaW5jbHVkZS9hc20tdjg1MC9ydGVfY2IuaApAQCAtNjksMTIgKzY5LDYgQEAKICNlbmRpZiAvKiBDT05GSUdfUlRFX01CX0FfUENJICovCiAKIAotLyogRm9yIDxhc20vcGFyYW0uaD4gKi8KLSNpZm5kZWYgSFoKLSNkZWZpbmUgSFoJMTAwCi0jZW5kaWYKLQotCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogZXh0ZXJuIHZvaWQgcnRlX2NiX2Vhcmx5X2luaXQgKHZvaWQpOwogZXh0ZXJuIHZvaWQgcnRlX2NiX2luaXRfaXJxcyAodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL3NpbS5oIGIvaW5jbHVkZS9hc20tdjg1MC9zaW0uaAppbmRleCAxMDIzNmFiLi4wMjY5MzJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS12ODUwL3NpbS5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvc2ltLmgKQEAgLTQwLDExICs0MCw2IEBACiAjZGVmaW5lIFIwX1JBTV9BRERSCQkweEZGRkZGMDAwCiAKIAotLyogRm9yIDxhc20vcGFyYW0uaD4gKi8KLSNpZm5kZWYgSFoKLSNkZWZpbmUgSFoJCQkyNAkvKiBNaW5pbXVtIHN1cHBvcnRlZCBmcmVxdWVuY3kuICAqLwotI2VuZGlmCi0KIC8qIEZvciA8YXNtL2lycS5oPiAqLwogI2RlZmluZSBOVU1fQ1BVX0lSUVMJCTYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdjg1MC9zaW04NWUyLmggYi9pbmNsdWRlL2FzbS12ODUwL3NpbTg1ZTIuaAppbmRleCAxN2RkNGZhLi44YjRkNjk3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS12ODUwL3NpbTg1ZTIuaAorKysgYi9pbmNsdWRlL2FzbS12ODUwL3NpbTg1ZTIuaApAQCAtNjYsMTAgKzY2LDQgQEAKICNkZWZpbmUgUjBfUkFNX0FERFIJCTB4RkZGRkUwMDAKIAogCi0vKiBGb3IgPGFzbS9wYXJhbS5oPiAqLwotI2lmbmRlZiBIWgotI2RlZmluZSBIWgkJCTI0CS8qIE1pbmltdW0gc3VwcG9ydGVkIGZyZXF1ZW5jeS4gICovCi0jZW5kaWYKLQotCiAjZW5kaWYgLyogX19WODUwX1NJTTg1RTJfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tdjg1MC9zeXN0ZW0uaAppbmRleCBhMzRkZGZhLi43ZGFmMWZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS12ODUwL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvc3lzdGVtLmgKQEAgLTEwMyw2ICsxMDMsMjEgQEAKIAlyZXR1cm4gdG1wOwogfQogCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvY21weGNoZy1sb2NhbC5oPgorCisvKgorICogY21weGNoZ19sb2NhbCBhbmQgY21weGNoZzY0X2xvY2FsIGFyZSBhdG9taWMgd3J0IGN1cnJlbnQgQ1BVLiBBbHdheXMgbWFrZQorICogdGhlbSBhdmFpbGFibGUuCisgKi8KKyNkZWZpbmUgY21weGNoZ19sb2NhbChwdHIsIG8sIG4pCQkJCSAgCSAgICAgICBcCisJKChfX3R5cGVvZl9fKCoocHRyKSkpX19jbXB4Y2hnX2xvY2FsX2dlbmVyaWMoKHB0ciksICh1bnNpZ25lZCBsb25nKShvKSxcCisJCQkodW5zaWduZWQgbG9uZykobiksIHNpemVvZigqKHB0cikpKSkKKyNkZWZpbmUgY21weGNoZzY0X2xvY2FsKHB0ciwgbywgbikgX19jbXB4Y2hnNjRfbG9jYWxfZ2VuZXJpYygocHRyKSwgKG8pLCAobikpCisKKyNpZm5kZWYgQ09ORklHX1NNUAorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2NtcHhjaGcuaD4KKyNlbmRpZgorCiAjZGVmaW5lIGFyY2hfYWxpZ25fc3RhY2soeCkgKHgpCiAKICNlbmRpZiAvKiBfX1Y4NTBfU1lTVEVNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdjg1MC91c2VyLmggYi9pbmNsdWRlL2FzbS12ODUwL3VzZXIuaAppbmRleCBjY2Y0Y2VhLi42M2NkYzU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS12ODUwL3VzZXIuaAorKysgYi9pbmNsdWRlL2FzbS12ODUwL3VzZXIuaApAQCAtMyw4ICszLDYgQEAKIAogLyogQWRhcHRlZCBmcm9tIDxhc20tcHBjL3VzZXIuaD4uICAqLwogCi0jaWZkZWYgX19LRVJORUxfXwotCiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIApAQCAtNDAsNyArMzgsNyBAQAogCXVuc2lnbmVkIGxvbmcJc3RhcnRfZGF0YTsJCS8qIGRhdGEgc3RhcnRpbmcgYWRkcmVzcyAqLwogCXVuc2lnbmVkIGxvbmcJc3RhcnRfc3RhY2s7CQkvKiBzdGFjayBzdGFydGluZyBhZGRyZXNzICovCiAJbG9uZyBpbnQJc2lnbmFsOwkJCS8qIHNpZ25hbCBjYXVzaW5nIGNvcmUgZHVtcCAqLwotCXN0cnVjdCByZWdzICoJdV9hcjA7CQkJLyogaGVscCBnZGIgZmluZCByZWdpc3RlcnMgKi8KKwl1bnNpZ25lZCBsb25nCXVfYXIwOwkJCS8qIGhlbHAgZ2RiIGZpbmQgcmVnaXN0ZXJzICovCiAJdW5zaWduZWQgbG9uZwltYWdpYzsJCQkvKiBpZGVudGlmaWVzIGEgY29yZSBmaWxlICovCiAJY2hhcgkJdV9jb21tWzMyXTsJCS8qIHVzZXIgY29tbWFuZCBuYW1lICovCiB9OwpAQCAtNTEsNiArNDksNCBAQAogI2RlZmluZSBIT1NUX0RBVEFfU1RBUlRfQUREUgkodS5zdGFydF9kYXRhKQogI2RlZmluZSBIT1NUX1NUQUNLX0VORF9BRERSCSh1LnN0YXJ0X3N0YWNrICsgdS51X3NzaXplICogTkJQRykKIAotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQogI2VuZGlmIC8qIF9fVjg1MF9VU0VSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L0tidWlsZCBiL2luY2x1ZGUvYXNtLXg4Ni9LYnVpbGQKaW5kZXggM2M2ZjBmOC4uYjA0YTdmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L0tidWlsZAorKysgYi9pbmNsdWRlL2FzbS14ODYvS2J1aWxkCkBAIC0yMiw3ICsyMiw1IEBACiB1bmlmZGVmLXkgKz0gcHRyYWNlLmgKIHVuaWZkZWYteSArPSB1bmlzdGRfMzIuaAogdW5pZmRlZi15ICs9IHVuaXN0ZF82NC5oCi11bmlmZGVmLXkgKz0gdXNlcl8zMi5oCi11bmlmZGVmLXkgKz0gdXNlcl82NC5oCiB1bmlmZGVmLXkgKz0gdm04Ni5oCiB1bmlmZGVmLXkgKz0gdnN5c2NhbGwuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2Eub3V0LWNvcmUuaCBiL2luY2x1ZGUvYXNtLXg4Ni9hLm91dC1jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJiNmUxMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9hLm91dC1jb3JlLmgKQEAgLTAsMCArMSw3MSBAQAorLyogYS5vdXQgY29yZWR1bXAgcmVnaXN0ZXIgZHVtcGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0FTTV9BX09VVF9DT1JFX0gKKyNkZWZpbmUgX0FTTV9BX09VVF9DT1JFX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKyNpZmRlZiBDT05GSUdfWDg2XzMyCisKKyNpbmNsdWRlIDxsaW51eC91c2VyLmg+CisjaW5jbHVkZSA8bGludXgvZWxmY29yZS5oPgorCisvKgorICogZmlsbCBpbiB0aGUgdXNlciBzdHJ1Y3R1cmUgZm9yIGFuIGEub3V0IGNvcmUgZHVtcAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYW91dF9kdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHVzZXIgKmR1bXApCit7CisJdTE2IGdzOworCisvKiBjaGFuZ2VkIHRoZSBzaXplIGNhbGN1bGF0aW9ucyAtIHNob3VsZCBob3BlZnVsbHkgd29yayBiZXR0ZXIuIGxidCAqLworCWR1bXAtPm1hZ2ljID0gQ01BR0lDOworCWR1bXAtPnN0YXJ0X2NvZGUgPSAwOworCWR1bXAtPnN0YXJ0X3N0YWNrID0gcmVncy0+c3AgJiB+KFBBR0VfU0laRSAtIDEpOworCWR1bXAtPnVfdHNpemUgPSAoKHVuc2lnbmVkIGxvbmcpIGN1cnJlbnQtPm1tLT5lbmRfY29kZSkgPj4gUEFHRV9TSElGVDsKKwlkdW1wLT51X2RzaXplID0gKCh1bnNpZ25lZCBsb25nKSAoY3VycmVudC0+bW0tPmJyayArIChQQUdFX1NJWkUtMSkpKSA+PiBQQUdFX1NISUZUOworCWR1bXAtPnVfZHNpemUgLT0gZHVtcC0+dV90c2l6ZTsKKwlkdW1wLT51X3NzaXplID0gMDsKKwlkdW1wLT51X2RlYnVncmVnWzBdID0gY3VycmVudC0+dGhyZWFkLmRlYnVncmVnMDsKKwlkdW1wLT51X2RlYnVncmVnWzFdID0gY3VycmVudC0+dGhyZWFkLmRlYnVncmVnMTsKKwlkdW1wLT51X2RlYnVncmVnWzJdID0gY3VycmVudC0+dGhyZWFkLmRlYnVncmVnMjsKKwlkdW1wLT51X2RlYnVncmVnWzNdID0gY3VycmVudC0+dGhyZWFkLmRlYnVncmVnMzsKKwlkdW1wLT51X2RlYnVncmVnWzRdID0gMDsKKwlkdW1wLT51X2RlYnVncmVnWzVdID0gMDsKKwlkdW1wLT51X2RlYnVncmVnWzZdID0gY3VycmVudC0+dGhyZWFkLmRlYnVncmVnNjsKKwlkdW1wLT51X2RlYnVncmVnWzddID0gY3VycmVudC0+dGhyZWFkLmRlYnVncmVnNzsKKworCWlmIChkdW1wLT5zdGFydF9zdGFjayA8IFRBU0tfU0laRSkKKwkJZHVtcC0+dV9zc2l6ZSA9ICgodW5zaWduZWQgbG9uZykgKFRBU0tfU0laRSAtIGR1bXAtPnN0YXJ0X3N0YWNrKSkgPj4gUEFHRV9TSElGVDsKKworCWR1bXAtPnJlZ3MuYnggPSByZWdzLT5ieDsKKwlkdW1wLT5yZWdzLmN4ID0gcmVncy0+Y3g7CisJZHVtcC0+cmVncy5keCA9IHJlZ3MtPmR4OworCWR1bXAtPnJlZ3Muc2kgPSByZWdzLT5zaTsKKwlkdW1wLT5yZWdzLmRpID0gcmVncy0+ZGk7CisJZHVtcC0+cmVncy5icCA9IHJlZ3MtPmJwOworCWR1bXAtPnJlZ3MuYXggPSByZWdzLT5heDsKKwlkdW1wLT5yZWdzLmRzID0gKHUxNilyZWdzLT5kczsKKwlkdW1wLT5yZWdzLmVzID0gKHUxNilyZWdzLT5lczsKKwlkdW1wLT5yZWdzLmZzID0gKHUxNilyZWdzLT5mczsKKwlzYXZlc2VnbWVudChncyxncyk7CisJZHVtcC0+cmVncy5vcmlnX2F4ID0gcmVncy0+b3JpZ19heDsKKwlkdW1wLT5yZWdzLmlwID0gcmVncy0+aXA7CisJZHVtcC0+cmVncy5jcyA9ICh1MTYpcmVncy0+Y3M7CisJZHVtcC0+cmVncy5mbGFncyA9IHJlZ3MtPmZsYWdzOworCWR1bXAtPnJlZ3Muc3AgPSByZWdzLT5zcDsKKwlkdW1wLT5yZWdzLnNzID0gKHUxNilyZWdzLT5zczsKKworCWR1bXAtPnVfZnB2YWxpZCA9IGR1bXBfZnB1IChyZWdzLCAmZHVtcC0+aTM4Nyk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfWDg2XzMyICovCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9BU01fQV9PVVRfQ09SRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvYS5vdXQuaCBiL2luY2x1ZGUvYXNtLXg4Ni9hLm91dC5oCmluZGV4IGE2MjQ0M2UuLjQ2ODRmOTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9hLm91dC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9hLm91dC5oCkBAIC0xNywxNCArMTcsNCBAQAogI2RlZmluZSBOX0RSU0laRShhKQkoKGEpLmFfZHJzaXplKQogI2RlZmluZSBOX1NZTVNJWkUoYSkJKChhKS5hX3N5bXMpCiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0jIGluY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+Ci0jIGRlZmluZSBTVEFDS19UT1AJVEFTS19TSVpFCi0jIGlmZGVmIENPTkZJR19YODZfMzIKLSMgIGRlZmluZSBTVEFDS19UT1BfTUFYCVNUQUNLX1RPUAotIyBlbHNlCi0jICBkZWZpbmUgU1RBQ0tfVE9QX01BWAlUQVNLX1NJWkU2NAotIyBlbmRpZgotI2VuZGlmCi0KICNlbmRpZiAvKiBfQVNNX1g4Nl9BX09VVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvY21weGNoZ182NC5oIGIvaW5jbHVkZS9hc20teDg2L2NtcHhjaGdfNjQuaAppbmRleCA1ZTE4MjA2Li41NmY1YjQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvY21weGNoZ182NC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9jbXB4Y2hnXzY0LmgKQEAgLTEyNCwxMSArMTI0LDIxIEBACiAJcmV0dXJuIG9sZDsKIH0KIAotI2RlZmluZSBjbXB4Y2hnKHB0cixvLG4pXAotCSgoX190eXBlb2ZfXygqKHB0cikpKV9fY21weGNoZygocHRyKSwodW5zaWduZWQgbG9uZykobyksXAotCQkJCQkodW5zaWduZWQgbG9uZykobiksc2l6ZW9mKCoocHRyKSkpKQotI2RlZmluZSBjbXB4Y2hnX2xvY2FsKHB0cixvLG4pXAotCSgoX190eXBlb2ZfXygqKHB0cikpKV9fY21weGNoZ19sb2NhbCgocHRyKSwodW5zaWduZWQgbG9uZykobyksXAotCQkJCQkodW5zaWduZWQgbG9uZykobiksc2l6ZW9mKCoocHRyKSkpKQorI2RlZmluZSBjbXB4Y2hnKHB0ciwgbywgbikJCQkJCQlcCisJKChfX3R5cGVvZl9fKCoocHRyKSkpX19jbXB4Y2hnKChwdHIpLCAodW5zaWduZWQgbG9uZykobyksCVwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpKG4pLCBzaXplb2YoKihwdHIpKSkpCisjZGVmaW5lIGNtcHhjaGc2NChwdHIsIG8sIG4pCQkJCQkJXAorICAoewkJCQkJCQkJCVwKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKCoocHRyKSkgIT0gOCk7CQkJCVwKKwljbXB4Y2hnKChwdHIpLCAobyksIChuKSk7CQkJCQlcCisgIH0pCisjZGVmaW5lIGNtcHhjaGdfbG9jYWwocHRyLCBvLCBuKQkJCQkJXAorCSgoX190eXBlb2ZfXygqKHB0cikpKV9fY21weGNoZ19sb2NhbCgocHRyKSwgKHVuc2lnbmVkIGxvbmcpKG8pLAlcCisJCQkJCSh1bnNpZ25lZCBsb25nKShuKSwgc2l6ZW9mKCoocHRyKSkpKQorI2RlZmluZSBjbXB4Y2hnNjRfbG9jYWwocHRyLCBvLCBuKQkJCQkJXAorICAoewkJCQkJCQkJCVwKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKCoocHRyKSkgIT0gOCk7CQkJCVwKKwljbXB4Y2hnX2xvY2FsKChwdHIpLCAobyksIChuKSk7CQkJCQlcCisgIH0pCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L2VsZi5oIGIvaW5jbHVkZS9hc20teDg2L2VsZi5oCmluZGV4IGQ5Yzk0ZTcuLmZiNjJmOTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9lbGYuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvZWxmLmgKQEAgLTcyLDcgKzcyLDYgQEAKIAogI2VuZGlmCiAKLSNpZmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSA8YXNtL3Zkc28uaD4KIAogZXh0ZXJuIHVuc2lnbmVkIGludCB2ZHNvX2VuYWJsZWQ7CkBAIC0zMjEsNiArMzIwLDQgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGFyY2hfcmFuZG9taXplX2JyayhzdHJ1Y3QgbW1fc3RydWN0ICptbSk7CiAjZGVmaW5lIGFyY2hfcmFuZG9taXplX2JyayBhcmNoX3JhbmRvbWl6ZV9icmsKIAotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvbW16b25lXzMyLmggYi9pbmNsdWRlL2FzbS14ODYvbW16b25lXzMyLmgKaW5kZXggNWQ2ZjRjZS4uMjc0YTU5NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L21tem9uZV8zMi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9tbXpvbmVfMzIuaApAQCAtMTA3LDggKzEwNyw4IEBACiAvKgogICogRm9sbG93aW5nIGFyZSBtYWNyb3MgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhpcyBudW1hIHBsYXRmb3JtLgogICovCi0jZGVmaW5lIHJlc2VydmVfYm9vdG1lbShhZGRyLCBzaXplKSBcCi0JcmVzZXJ2ZV9ib290bWVtX25vZGUoTk9ERV9EQVRBKDApLCAoYWRkciksIChzaXplKSkKKyNkZWZpbmUgcmVzZXJ2ZV9ib290bWVtKGFkZHIsIHNpemUsIGZsYWdzKSBcCisJcmVzZXJ2ZV9ib290bWVtX25vZGUoTk9ERV9EQVRBKDApLCAoYWRkciksIChzaXplKSwgKGZsYWdzKSkKICNkZWZpbmUgYWxsb2NfYm9vdG1lbSh4KSBcCiAJX19hbGxvY19ib290bWVtX25vZGUoTk9ERV9EQVRBKDApLCAoeCksIFNNUF9DQUNIRV9CWVRFUywgX19wYShNQVhfRE1BX0FERFJFU1MpKQogI2RlZmluZSBhbGxvY19ib290bWVtX2xvdyh4KSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvcGFnZV8zMi5oIGIvaW5jbHVkZS9hc20teDg2L3BhZ2VfMzIuaAppbmRleCBhNmZkMTBmLi45ODQ5OThhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvcGFnZV8zMi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9wYWdlXzMyLmgKQEAgLTUzLDYgKzUzLDEwIEBACiAjZW5kaWYJLyogX19BU1NFTUJMWV9fICovCiAjZW5kaWYJLyogQ09ORklHX1g4Nl9QQUUgKi8KIAorI2lmbmRlZiBfX0FTU0VNQkxZX18KK3R5cGVkZWYgc3RydWN0IHBhZ2UgKnBndGFibGVfdDsKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQogI2RlZmluZSBIQVZFX0FSQ0hfSFVHRVRMQl9VTk1BUFBFRF9BUkVBCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9wYWdlXzY0LmggYi9pbmNsdWRlL2FzbS14ODYvcGFnZV82NC5oCmluZGV4IGRjZjBjMDcuLmY3MzkzYmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9wYWdlXzY0LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3BhZ2VfNjQuaApAQCAtNzEsNiArNzEsOCBAQAogdHlwZWRlZiB1bnNpZ25lZCBsb25nCXBncHJvdHZhbF90OwogdHlwZWRlZiB1bnNpZ25lZCBsb25nCXBoeXNfYWRkcl90OwogCit0eXBlZGVmIHN0cnVjdCBwYWdlICpwZ3RhYmxlX3Q7CisKIHR5cGVkZWYgc3RydWN0IHsgcHRldmFsX3QgcHRlOyB9IHB0ZV90OwogCiAjZGVmaW5lIHZtZW1tYXAgKChzdHJ1Y3QgcGFnZSAqKVZNRU1NQVBfU1RBUlQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvcGdhbGxvY18zMi5oIGIvaW5jbHVkZS9hc20teDg2L3BnYWxsb2NfMzIuaAppbmRleCBiYWIxMjcxLi42YmVhNmU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvcGdhbGxvY18zMi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9wZ2FsbG9jXzMyLmgKQEAgLTMxLDYgKzMxLDcgQEAKIAlwYXJhdmlydF9hbGxvY19wdChtbSwgcGZuKTsKIAlzZXRfcG1kKHBtZCwgX19wbWQoKChwdGV2YWxfdClwZm4gPDwgUEFHRV9TSElGVCkgfCBfUEFHRV9UQUJMRSkpOwogfQorI2RlZmluZSBwbWRfcGd0YWJsZShwbWQpIHBtZF9wYWdlKHBtZCkKIAogLyoKICAqIEFsbG9jYXRlIGFuZCBmcmVlIHBhZ2UgdGFibGVzLgpAQCAtMzksMTUgKzQwLDE2IEBACiBleHRlcm4gdm9pZCBwZ2RfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcGdkX3QgKnBnZCk7CiAKIGV4dGVybiBwdGVfdCAqcHRlX2FsbG9jX29uZV9rZXJuZWwoc3RydWN0IG1tX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nKTsKLWV4dGVybiBzdHJ1Y3QgcGFnZSAqcHRlX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICosIHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIHBndGFibGVfdCBwdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKiwgdW5zaWduZWQgbG9uZyk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdGVfZnJlZV9rZXJuZWwoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHB0ZV90ICpwdGUpCiB7CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXB0ZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwdGVfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHBhZ2UgKnB0ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdGVfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcGd0YWJsZV90IHB0ZSkKIHsKKwlwZ3RhYmxlX3BhZ2VfZHRvcihwdGUpOwogCV9fZnJlZV9wYWdlKHB0ZSk7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni9wZ2FsbG9jXzY0LmggYi9pbmNsdWRlL2FzbS14ODYvcGdhbGxvY182NC5oCmluZGV4IDRmNjIyMGQuLjhkNjcyMjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni9wZ2FsbG9jXzY0LmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3BnYWxsb2NfNjQuaApAQCAtMTIsNiArMTIsOCBAQAogI2RlZmluZSBwZ2RfcG9wdWxhdGUobW0sIHBnZCwgcHVkKSBcCiAJCXNldF9wZ2QocGdkLCBfX3BnZChfUEFHRV9UQUJMRSB8IF9fcGEocHVkKSkpCiAKKyNkZWZpbmUgcG1kX3BndGFibGUocG1kKSBwbWRfcGFnZShwbWQpCisKIHN0YXRpYyBpbmxpbmUgdm9pZCBwbWRfcG9wdWxhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBtZF90ICpwbWQsIHN0cnVjdCBwYWdlICpwdGUpCiB7CiAJc2V0X3BtZChwbWQsIF9fcG1kKF9QQUdFX1RBQkxFIHwgKHBhZ2VfdG9fcGZuKHB0ZSkgPDwgUEFHRV9TSElGVCkpKTsKQEAgLTkxLDEyICs5MywxNyBAQAogCXJldHVybiAocHRlX3QgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTHxfX0dGUF9SRVBFQVQpOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpwdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCitzdGF0aWMgaW5saW5lIHBndGFibGVfdCBwdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7Ci0Jdm9pZCAqcCA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUx8X19HRlBfUkVQRUFUKTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl2b2lkICpwOworCisJcCA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUx8X19HRlBfUkVQRUFUKTsKIAlpZiAoIXApCiAJCXJldHVybiBOVUxMOwotCXJldHVybiB2aXJ0X3RvX3BhZ2UocCk7CisJcGFnZSA9IHZpcnRfdG9fcGFnZShwKTsKKwlwZ3RhYmxlX3BhZ2VfY3RvcihwYWdlKTsKKwlyZXR1cm4gcGFnZTsKIH0KIAogLyogU2hvdWxkIHJlYWxseSBpbXBsZW1lbnQgZ2MgZm9yIGZyZWUgcGFnZSB0YWJsZSBwYWdlcy4gVGhpcyBjb3VsZCBiZQpAQCAtMTA4LDEyICsxMTUsMTcgQEAKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcHRlKTsgCiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwdGVfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHBhZ2UgKnB0ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdGVfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcGd0YWJsZV90IHB0ZSkKIHsKKwlwZ3RhYmxlX3BhZ2VfZHRvcihwdGUpOwogCV9fZnJlZV9wYWdlKHB0ZSk7CiB9IAogCi0jZGVmaW5lIF9fcHRlX2ZyZWVfdGxiKHRsYixwdGUpIHRsYl9yZW1vdmVfcGFnZSgodGxiKSwocHRlKSkKKyNkZWZpbmUgX19wdGVfZnJlZV90bGIodGxiLHB0ZSkJCQkJXAorZG8gewkJCQkJCQlcCisJcGd0YWJsZV9wYWdlX2R0b3IoKHB0ZSkpOwkJCQlcCisJdGxiX3JlbW92ZV9wYWdlKCh0bGIpLCAocHRlKSk7CQkJXAorfSB3aGlsZSAoMCkKIAogI2RlZmluZSBfX3BtZF9mcmVlX3RsYih0bGIseCkgICB0bGJfcmVtb3ZlX3BhZ2UoKHRsYiksdmlydF90b19wYWdlKHgpKQogI2RlZmluZSBfX3B1ZF9mcmVlX3RsYih0bGIseCkgICB0bGJfcmVtb3ZlX3BhZ2UoKHRsYiksdmlydF90b19wYWdlKHgpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3Bvc2l4X3R5cGVzXzMyLmggYi9pbmNsdWRlL2FzbS14ODYvcG9zaXhfdHlwZXNfMzIuaAppbmRleCAxMzNlMzFlLi4wMTVlNTM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvcG9zaXhfdHlwZXNfMzIuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvcG9zaXhfdHlwZXNfMzIuaApAQCAtMzksMTQgKzM5LDEwIEBACiAjZW5kaWYKIAogdHlwZWRlZiBzdHJ1Y3QgewotI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgZGVmaW5lZChfX1VTRV9BTEwpCiAJaW50CXZhbFsyXTsKLSNlbHNlIC8qICFkZWZpbmVkKF9fS0VSTkVMX18pICYmICFkZWZpbmVkKF9fVVNFX0FMTCkgKi8KLQlpbnQJX192YWxbMl07Ci0jZW5kaWYgLyogIWRlZmluZWQoX19LRVJORUxfXykgJiYgIWRlZmluZWQoX19VU0VfQUxMKSAqLwogfSBfX2tlcm5lbF9mc2lkX3Q7CiAKLSNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8ICFkZWZpbmVkKF9fR0xJQkNfXykgfHwgKF9fR0xJQkNfXyA8IDIpCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKQogCiAjdW5kZWYJX19GRF9TRVQKICNkZWZpbmUgX19GRF9TRVQoZmQsZmRzZXRwKSBcCkBAIC03Nyw2ICs3Myw2IEBACiAJCQkiMiIgKChfX2tlcm5lbF9mZF9zZXQgKikgKGZkc2V0cCkpIDogIm1lbW9yeSIpOyBcCiB9IHdoaWxlICgwKQogCi0jZW5kaWYgLyogZGVmaW5lZChfX0tFUk5FTF9fKSB8fCAhZGVmaW5lZChfX0dMSUJDX18pIHx8IChfX0dMSUJDX18gPCAyKSAqLworI2VuZGlmIC8qIGRlZmluZWQoX19LRVJORUxfXykgKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS14ODYvcHJvY2Vzc29yLmgKaW5kZXggYWI0ZDBjMi4uMTQ5OTIwZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni9wcm9jZXNzb3IuaApAQCAtNzE5LDYgKzcxOSw4IEBACiAgKiBVc2VyIHNwYWNlIHByb2Nlc3Mgc2l6ZTogM0dCIChkZWZhdWx0KS4KICAqLwogI2RlZmluZSBUQVNLX1NJWkUJKFBBR0VfT0ZGU0VUKQorI2RlZmluZSBTVEFDS19UT1AJVEFTS19TSVpFCisjZGVmaW5lIFNUQUNLX1RPUF9NQVgJU1RBQ0tfVE9QCiAKICNkZWZpbmUgSU5JVF9USFJFQUQgIHsJCQkJCQkJXAogCS5zcDAgPSBzaXplb2YoaW5pdF9zdGFjaykgKyAobG9uZykmaW5pdF9zdGFjaywJCQlcCkBAIC04MDIsNiArODA0LDkgQEAKICNkZWZpbmUgVEFTS19TSVpFX09GKGNoaWxkKSAJKCh0ZXN0X3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX0lBMzIpKSA/IFwKIAkJCQkgIElBMzJfUEFHRV9PRkZTRVQgOiBUQVNLX1NJWkU2NCkKIAorI2RlZmluZSBTVEFDS19UT1AJCVRBU0tfU0laRQorI2RlZmluZSBTVEFDS19UT1BfTUFYCQlUQVNLX1NJWkU2NAorCiAjZGVmaW5lIElOSVRfVEhSRUFEICB7IFwKIAkuc3AwID0gKHVuc2lnbmVkIGxvbmcpJmluaXRfc3RhY2sgKyBzaXplb2YoaW5pdF9zdGFjaykgXAogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2L3Rlcm1pb3MuaCBiL2luY2x1ZGUvYXNtLXg4Ni90ZXJtaW9zLmgKaW5kZXggZDUwMTc0OC4uZjcyOTU2MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2L3Rlcm1pb3MuaAorKysgYi9pbmNsdWRlL2FzbS14ODYvdGVybWlvcy5oCkBAIC00MSw2ICs0MSw4IEBACiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCiAvKglpbnRyPV5DCQlxdWl0PV5cCQllcmFzZT1kZWwJa2lsbD1eVQogCWVvZj1eRAkJdnRpbWU9XDAJdm1pbj1cMQkJc3h0Yz1cMAogCXN0YXJ0PV5RCXN0b3A9XlMJCXN1c3A9XloJCWVvbD1cMApAQCAtNTgsMzkgKzYwLDUzIEBACiAJKih1bnNpZ25lZCBzaG9ydCAqKSAmKHRlcm1pb3MpLT54ID0gX190bXA7IFwKIH0KIAotI2RlZmluZSB1c2VyX3Rlcm1pb190b19rZXJuZWxfdGVybWlvcyh0ZXJtaW9zLCB0ZXJtaW8pIFwKLSh7IFwKLQlTRVRfTE9XX1RFUk1JT1NfQklUUyh0ZXJtaW9zLCB0ZXJtaW8sIGNfaWZsYWcpOyBcCi0JU0VUX0xPV19URVJNSU9TX0JJVFModGVybWlvcywgdGVybWlvLCBjX29mbGFnKTsgXAotCVNFVF9MT1dfVEVSTUlPU19CSVRTKHRlcm1pb3MsIHRlcm1pbywgY19jZmxhZyk7IFwKLQlTRVRfTE9XX1RFUk1JT1NfQklUUyh0ZXJtaW9zLCB0ZXJtaW8sIGNfbGZsYWcpOyBcCi0JY29weV9mcm9tX3VzZXIoKHRlcm1pb3MpLT5jX2NjLCAodGVybWlvKS0+Y19jYywgTkNDKTsgXAotfSkKK3N0YXRpYyBpbmxpbmUgaW50IHVzZXJfdGVybWlvX3RvX2tlcm5lbF90ZXJtaW9zKHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcywKKwkJCQkJCXN0cnVjdCB0ZXJtaW8gX191c2VyICp0ZXJtaW8pCit7CisJU0VUX0xPV19URVJNSU9TX0JJVFModGVybWlvcywgdGVybWlvLCBjX2lmbGFnKTsKKwlTRVRfTE9XX1RFUk1JT1NfQklUUyh0ZXJtaW9zLCB0ZXJtaW8sIGNfb2ZsYWcpOworCVNFVF9MT1dfVEVSTUlPU19CSVRTKHRlcm1pb3MsIHRlcm1pbywgY19jZmxhZyk7CisJU0VUX0xPV19URVJNSU9TX0JJVFModGVybWlvcywgdGVybWlvLCBjX2xmbGFnKTsKKwlyZXR1cm4gY29weV9mcm9tX3VzZXIodGVybWlvcy0+Y19jYywgdGVybWlvLT5jX2NjLCBOQ0MpOworfQogCiAvKgogICogVHJhbnNsYXRlIGEgInRlcm1pb3MiIHN0cnVjdHVyZSBpbnRvIGEgInRlcm1pbyIuIFVnaC4KICAqLwotI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pbyh0ZXJtaW8sIHRlcm1pb3MpIFwKLSh7IFwKLQlwdXRfdXNlcigodGVybWlvcyktPmNfaWZsYWcsICYodGVybWlvKS0+Y19pZmxhZyk7IFwKLQlwdXRfdXNlcigodGVybWlvcyktPmNfb2ZsYWcsICYodGVybWlvKS0+Y19vZmxhZyk7IFwKLQlwdXRfdXNlcigodGVybWlvcyktPmNfY2ZsYWcsICYodGVybWlvKS0+Y19jZmxhZyk7IFwKLQlwdXRfdXNlcigodGVybWlvcyktPmNfbGZsYWcsICYodGVybWlvKS0+Y19sZmxhZyk7IFwKLQlwdXRfdXNlcigodGVybWlvcyktPmNfbGluZSwgICYodGVybWlvKS0+Y19saW5lKTsgXAotCWNvcHlfdG9fdXNlcigodGVybWlvKS0+Y19jYywgKHRlcm1pb3MpLT5jX2NjLCBOQ0MpOyBcCi19KQorc3RhdGljIGlubGluZSBpbnQga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW8oc3RydWN0IHRlcm1pbyBfX3VzZXIgKnRlcm1pbywKKwkJCQkJICAgIHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcykKK3sKKwlwdXRfdXNlcigodGVybWlvcyktPmNfaWZsYWcsICYodGVybWlvKS0+Y19pZmxhZyk7CisJcHV0X3VzZXIoKHRlcm1pb3MpLT5jX29mbGFnLCAmKHRlcm1pbyktPmNfb2ZsYWcpOworCXB1dF91c2VyKCh0ZXJtaW9zKS0+Y19jZmxhZywgJih0ZXJtaW8pLT5jX2NmbGFnKTsKKwlwdXRfdXNlcigodGVybWlvcyktPmNfbGZsYWcsICYodGVybWlvKS0+Y19sZmxhZyk7CisJcHV0X3VzZXIoKHRlcm1pb3MpLT5jX2xpbmUsICAmKHRlcm1pbyktPmNfbGluZSk7CisJcmV0dXJuIGNvcHlfdG9fdXNlcigodGVybWlvKS0+Y19jYywgKHRlcm1pb3MpLT5jX2NjLCBOQ0MpOworfQogCi0jZGVmaW5lIHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvcyhrLCB1KSBcCi0JY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zMikpCitzdGF0aWMgaW5saW5lIGludCB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3Moc3RydWN0IGt0ZXJtaW9zICprLAorCQkJCQkJIHN0cnVjdCB0ZXJtaW9zMiBfX3VzZXIgKnUpCit7CisJcmV0dXJuIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKTsKK30KIAotI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3ModSwgaykgXAotCWNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MyKSkKK3N0YXRpYyBpbmxpbmUgaW50IGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcyhzdHJ1Y3QgdGVybWlvczIgX191c2VyICp1LAorCQkJCQkJIHN0cnVjdCBrdGVybWlvcyAqaykKK3sKKwlyZXR1cm4gY29weV90b191c2VyKHUsIGssIHNpemVvZihzdHJ1Y3QgdGVybWlvczIpKTsKK30KIAotI2RlZmluZSB1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3NfMShrLCB1KSBcCi0JY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKK3N0YXRpYyBpbmxpbmUgaW50IHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvc18xKHN0cnVjdCBrdGVybWlvcyAqaywKKwkJCQkJCSAgIHN0cnVjdCB0ZXJtaW9zIF9fdXNlciAqdSkKK3sKKwlyZXR1cm4gY29weV9mcm9tX3VzZXIoaywgdSwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSk7Cit9CiAKLSNkZWZpbmUga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zXzEodSwgaykgXAotCWNvcHlfdG9fdXNlcih1LCBrLCBzaXplb2Yoc3RydWN0IHRlcm1pb3MpKQorc3RhdGljIGlubGluZSBpbnQga2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zXzEoc3RydWN0IHRlcm1pb3MgX191c2VyICp1LAorCQkJCQkJICAgc3RydWN0IGt0ZXJtaW9zICprKQoreworCXJldHVybiBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSk7Cit9CiAKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Ni91c2VyLmggYi9pbmNsdWRlL2FzbS14ODYvdXNlci5oCmluZGV4IDQ4NDcxNWEuLjk5OTg3M2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Ni91c2VyLmgKKysrIGIvaW5jbHVkZS9hc20teDg2L3VzZXIuaApAQCAtMSwxMyArMSw1IEBACi0jaWZkZWYgX19LRVJORUxfXwotIyBpZmRlZiBDT05GSUdfWDg2XzMyCi0jICBpbmNsdWRlICJ1c2VyXzMyLmgiCi0jIGVsc2UKLSMgIGluY2x1ZGUgInVzZXJfNjQuaCIKLSMgZW5kaWYKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisjIGluY2x1ZGUgInVzZXJfMzIuaCIKICNlbHNlCi0jIGlmZGVmIF9faTM4Nl9fCi0jICBpbmNsdWRlICJ1c2VyXzMyLmgiCi0jIGVsc2UKLSMgIGluY2x1ZGUgInVzZXJfNjQuaCIKLSMgZW5kaWYKKyMgaW5jbHVkZSAidXNlcl82NC5oIgogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvdXNlcl8zMi5oIGIvaW5jbHVkZS9hc20teDg2L3VzZXJfMzIuaAppbmRleCBlZDhiOGZjLi42MTU3ZGE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvdXNlcl8zMi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni91c2VyXzMyLmgKQEAgLTExNiw3ICsxMTYsNyBAQAogCQkJCSAgIGVzcCByZWdpc3Rlci4gICovCiAgIGxvbmcgaW50IHNpZ25hbDsgICAgIAkJLyogU2lnbmFsIHRoYXQgY2F1c2VkIHRoZSBjb3JlIGR1bXAuICovCiAgIGludCByZXNlcnZlZDsJCQkvKiBObyBsb25nZXIgdXNlZCAqLwotICBzdHJ1Y3QgdXNlcl9wdF9yZWdzICogdV9hcjA7CS8qIFVzZWQgYnkgZ2RiIHRvIGhlbHAgZmluZCB0aGUgdmFsdWVzIGZvciAqLworICB1bnNpZ25lZCBsb25nIHVfYXIwOwkJLyogVXNlZCBieSBnZGIgdG8gaGVscCBmaW5kIHRoZSB2YWx1ZXMgZm9yICovCiAJCQkJLyogdGhlIHJlZ2lzdGVycy4gKi8KICAgc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QqIHVfZnBzdGF0ZTsJLyogTWF0aCBDby1wcm9jZXNzb3IgcG9pbnRlci4gKi8KICAgdW5zaWduZWQgbG9uZyBtYWdpYzsJCS8qIFRvIHVuaXF1ZWx5IGlkZW50aWZ5IGEgY29yZSBmaWxlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODYvdXNlcl82NC5oIGIvaW5jbHVkZS9hc20teDg2L3VzZXJfNjQuaAppbmRleCBhNTQ0OWQ0Li45NjM2MTY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODYvdXNlcl82NC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Ni91c2VyXzY0LmgKQEAgLTExOCw3ICsxMTgsNyBAQAogICBsb25nIGludCBzaWduYWw7CQkvKiBTaWduYWwgdGhhdCBjYXVzZWQgdGhlIGNvcmUgZHVtcC4gKi8KICAgaW50IHJlc2VydmVkOwkJCS8qIE5vIGxvbmdlciB1c2VkICovCiAgIGludCBwYWQxOwotICBzdHJ1Y3QgdXNlcl9wdF9yZWdzICogdV9hcjA7CS8qIFVzZWQgYnkgZ2RiIHRvIGhlbHAgZmluZCB0aGUgdmFsdWVzIGZvciAqLworICB1bnNpZ25lZCBsb25nIHVfYXIwOwkJLyogVXNlZCBieSBnZGIgdG8gaGVscCBmaW5kIHRoZSB2YWx1ZXMgZm9yICovCiAJCQkJLyogdGhlIHJlZ2lzdGVycy4gKi8KICAgc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QqIHVfZnBzdGF0ZTsJLyogTWF0aCBDby1wcm9jZXNzb3IgcG9pbnRlci4gKi8KICAgdW5zaWduZWQgbG9uZyBtYWdpYzsJCS8qIFRvIHVuaXF1ZWx5IGlkZW50aWZ5IGEgY29yZSBmaWxlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvYS5vdXQuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9hLm91dC5oCmluZGV4IDA1YTJmNjcuLmZkZjEzNzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9hLm91dC5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9hLm91dC5oCkBAIC0xNCwxMSArMTQsNiBAQAogI2lmbmRlZiBfWFRFTlNBX0FfT1VUX0gKICNkZWZpbmUgX1hURU5TQV9BX09VVF9ICiAKLS8qIE5vdGU6IHRoZSBrZXJuZWwgbmVlZHMgdGhlIGEub3V0IGRlZmluaXRpb25zLCBldmVuIGlmIG9ubHkgRUxGIGlzIHVzZWQuICovCi0KLSNkZWZpbmUgU1RBQ0tfVE9QCVRBU0tfU0laRQotI2RlZmluZSBTVEFDS19UT1BfTUFYCVNUQUNLX1RPUAotCiBzdHJ1Y3QgZXhlYwogewogICB1bnNpZ25lZCBsb25nIGFfaW5mbzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9lbGYuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9lbGYuaAppbmRleCA3MDgzZDQ2Li40NjczODQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvZWxmLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2VsZi5oCkBAIC0yNTcsOCArMjU3LDYgQEAKICAgICAgICBfci0+YXJlZ1sxMl09MDsgX3ItPmFyZWdbMTNdPTA7ICAgX3ItPmFyZWdbMTRdPTA7IF9yLT5hcmVnWzE1XT0wOyBcCiAgIH0gd2hpbGUgKDApCiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0KICNkZWZpbmUgU0VUX1BFUlNPTkFMSVRZKGV4LCBpYmNzMikgc2V0X3BlcnNvbmFsaXR5KFBFUl9MSU5VWF8zMkJJVCkKIAogc3RydWN0IHRhc2tfc3RydWN0OwpAQCAtMjcyLDUgKzI3MCw0IEBACiBleHRlcm4gaW50IGRvX3Jlc3RvcmVfZnByZWdzIChlbGZfZnByZWdzZXRfdCosIHN0cnVjdCBwdF9yZWdzKiwKIAkJCSAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCopOwogCi0jZW5kaWYJLyogX19LRVJORUxfXyAqLwogI2VuZGlmCS8qIF9YVEVOU0FfRUxGX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wYWdlLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvcGFnZS5oCmluZGV4IDU1Y2UyYzkuLjgwYTZhZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3BhZ2UuaApAQCAtMTEsOCArMTEsNiBAQAogI2lmbmRlZiBfWFRFTlNBX1BBR0VfSAogI2RlZmluZSBfWFRFTlNBX1BBR0VfSAogCi0jaWZkZWYgX19LRVJORUxfXwotCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgpAQCAtMTAwLDYgKzk4LDcgQEAKIHR5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBwdGU7IH0gcHRlX3Q7CQkvKiBwYWdlIHRhYmxlIGVudHJ5ICovCiB0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcGdkOyB9IHBnZF90OwkJLyogUEdEIHRhYmxlIGVudHJ5ICovCiB0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcGdwcm90OyB9IHBncHJvdF90OwordHlwZWRlZiBzdHJ1Y3QgcGFnZSAqcGd0YWJsZV90OwogCiAjZGVmaW5lIHB0ZV92YWwoeCkJKCh4KS5wdGUpCiAjZGVmaW5lIHBnZF92YWwoeCkJKCh4KS5wZ2QpCkBAIC0xNzQsNSArMTczLDQgQEAKIAkJCQkgVk1fTUFZUkVBRCB8IFZNX01BWVdSSVRFIHwgVk1fTUFZRVhFQykKIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL21lbW9yeV9tb2RlbC5oPgotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfWFRFTlNBX1BBR0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3BhcmFtLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvcGFyYW0uaAppbmRleCBjZTNhMzM2Li44MmFkMzRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvcGFyYW0uaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvcGFyYW0uaApAQCAtMTIsNyArMTIsNyBAQAogI2RlZmluZSBfWFRFTlNBX1BBUkFNX0gKIAogI2lmZGVmIF9fS0VSTkVMX18KLSMgZGVmaW5lIEhaCQkxMDAJCS8qIGludGVybmFsIHRpbWVyIGZyZXF1ZW5jeSAqLworIyBkZWZpbmUgSFoJCUNPTkZJR19IWgkvKiBpbnRlcm5hbCB0aW1lciBmcmVxdWVuY3kgKi8KICMgZGVmaW5lIFVTRVJfSFoJMTAwCQkvKiBmb3IgdXNlciBpbnRlcmZhY2VzIGluICJ0aWNrcyIgKi8KICMgZGVmaW5lIENMT0NLU19QRVJfU0VDIChVU0VSX0haKQkvKiBmcmVxdW56eSBhdCB3aGljaCB0aW1lcygpIGNvdW50cyAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcGdhbGxvYy5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3BnYWxsb2MuaAppbmRleCAxZDUxYmE1Li44ZDE1NDRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvcGdhbGxvYy5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wZ2FsbG9jLmgKQEAgLTI0LDYgKzI0LDcgQEAKIAkocG1kX3ZhbCgqKHBtZHApKSA9ICgodW5zaWduZWQgbG9uZylwdGVwKSkKICNkZWZpbmUgcG1kX3BvcHVsYXRlKG1tLCBwbWRwLCBwYWdlKQkJCQkJICAgICBcCiAJKHBtZF92YWwoKihwbWRwKSkgPSAoKHVuc2lnbmVkIGxvbmcpcGFnZV90b192aXJ0KHBhZ2UpKSkKKyNkZWZpbmUgcG1kX3BndGFibGUocG1kKSBwbWRfcGFnZShwbWQpCiAKIHN0YXRpYyBpbmxpbmUgcGdkX3QqCiBwZ2RfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0pCkBAIC00NiwxMCArNDcsMTQgQEAKIAlyZXR1cm4ga21lbV9jYWNoZV9hbGxvYyhwZ3RhYmxlX2NhY2hlLCBHRlBfS0VSTkVMfF9fR0ZQX1JFUEVBVCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnB0ZV9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIAotCQkJCQkgdW5zaWduZWQgbG9uZyBhZGRyKQorc3RhdGljIGlubGluZSBwdGVfdG9rZW5fdCBwdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCQl1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0JcmV0dXJuIHZpcnRfdG9fcGFnZShwdGVfYWxsb2Nfb25lX2tlcm5lbChtbSwgYWRkcikpOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJcGFnZSA9IHZpcnRfdG9fcGFnZShwdGVfYWxsb2Nfb25lX2tlcm5lbChtbSwgYWRkcikpOworCXBndGFibGVfcGFnZV9jdG9yKHBhZ2UpOworCXJldHVybiBwYWdlOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdGVfdCAqcHRlKQpAQCAtNTcsMTAgKzYyLDEyIEBACiAJa21lbV9jYWNoZV9mcmVlKHBndGFibGVfY2FjaGUsIHB0ZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwdGVfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBndGFibGVfdCBwdGUpCiB7Ci0Ja21lbV9jYWNoZV9mcmVlKHBndGFibGVfY2FjaGUsIHBhZ2VfYWRkcmVzcyhwYWdlKSk7CisJcGd0YWJsZV9wYWdlX2R0b3IocHRlKTsKKwlrbWVtX2NhY2hlX2ZyZWUocGd0YWJsZV9jYWNoZSwgcGFnZV9hZGRyZXNzKHB0ZSkpOwogfQorI2RlZmluZSBwbWRfcGd0YWJsZShwbWQpIHBtZF9wYWdlKHBtZCkKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfWFRFTlNBX1BHQUxMT0NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3Bvc2l4X3R5cGVzLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvcG9zaXhfdHlwZXMuaAppbmRleCA0YWQ3N2RkLi40M2Y5ZGQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvcG9zaXhfdHlwZXMuaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvcG9zaXhfdHlwZXMuaApAQCAtNjQsOCArNjQsNyBAQAogCiAjZWxzZSAvKiBfX0dOVUNfXyAqLwogCi0jaWYgZGVmaW5lZChfX0tFUk5FTF9fKSB8fCAhZGVmaW5lZChfX0dMSUJDX18pIHx8IChfX0dMSUJDX18gPCAyKSBcCi0gICAgfHwgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA9PSAwKQorI2lmIGRlZmluZWQoX19LRVJORUxfXykKIC8qIFdpdGggR05VIEMsIHVzZSBpbmxpbmUgZnVuY3Rpb25zIGluc3RlYWQgc28gYXJncyBhcmUgZXZhbHVhdGVkIG9ubHkgb25jZTogKi8KIAogI3VuZGVmIF9fRkRfU0VUCkBAIC0xMTgsNiArMTE3LDYgQEAKIAl9CiB9CiAKLSNlbmRpZiAvKiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8ICFkZWZpbmVkKF9fR0xJQkNfXykgfHwgKF9fR0xJQkNfXyA8IDIpICovCisjZW5kaWYgLyogZGVmaW5lZChfX0tFUk5FTF9fKSAqLwogI2VuZGlmIC8qIF9fR05VQ19fICovCiAjZW5kaWYgLyogX1hURU5TQV9QT1NJWF9UWVBFU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvcHJvY2Vzc29yLmgKaW5kZXggMzUxNDViYy4uOTY0MDhmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wcm9jZXNzb3IuaApAQCAtMzQsNiArMzQsOCBAQAogICovCiAKICNkZWZpbmUgVEFTS19TSVpFCV9fWFRFTlNBX1VMX0NPTlNUKDB4NDAwMDAwMDApCisjZGVmaW5lIFNUQUNLX1RPUAlUQVNLX1NJWkUKKyNkZWZpbmUgU1RBQ0tfVE9QX01BWAlTVEFDS19UT1AKIAogLyoKICAqIEdlbmVyYWwgZXhjZXB0aW9uIGNhdXNlIGFzc2lnbmVkIHRvIGRlYnVnIGV4Y2VwdGlvbnMuIERlYnVnIGV4Y2VwdGlvbnMgZ28KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9zeXN0ZW0uaAppbmRleCBkZGM5NzA4Li5lMGNiOTExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2Evc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3N5c3RlbS5oCkBAIC0xNTYsOCArMTU2LDMwIEBACiAJICAgCQkJICAgICAgICAodW5zaWduZWQgbG9uZylfbl8sIHNpemVvZiAoKihwdHIpKSk7IFwKIAl9KQogCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvY21weGNoZy1sb2NhbC5oPgogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19jbXB4Y2hnX2xvY2FsKHZvbGF0aWxlIHZvaWQgKnB0ciwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIG9sZCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIG5ldywgaW50IHNpemUpCit7CisJc3dpdGNoIChzaXplKSB7CisJY2FzZSA0OgorCQlyZXR1cm4gX19jbXB4Y2hnX3UzMihwdHIsIG9sZCwgbmV3KTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gX19jbXB4Y2hnX2xvY2FsX2dlbmVyaWMocHRyLCBvbGQsIG5ldywgc2l6ZSk7CisJfQogCisJcmV0dXJuIG9sZDsKK30KKworLyoKKyAqIGNtcHhjaGdfbG9jYWwgYW5kIGNtcHhjaGc2NF9sb2NhbCBhcmUgYXRvbWljIHdydCBjdXJyZW50IENQVS4gQWx3YXlzIG1ha2UKKyAqIHRoZW0gYXZhaWxhYmxlLgorICovCisjZGVmaW5lIGNtcHhjaGdfbG9jYWwocHRyLCBvLCBuKQkJCQkgIAkgICAgICAgXAorCSgoX190eXBlb2ZfXygqKHB0cikpKV9fY21weGNoZ19sb2NhbF9nZW5lcmljKChwdHIpLCAodW5zaWduZWQgbG9uZykobyksXAorCQkJKHVuc2lnbmVkIGxvbmcpKG4pLCBzaXplb2YoKihwdHIpKSkpCisjZGVmaW5lIGNtcHhjaGc2NF9sb2NhbChwdHIsIG8sIG4pIF9fY21weGNoZzY0X2xvY2FsX2dlbmVyaWMoKHB0ciksIChvKSwgKG4pKQogCiAvKgogICogeGNoZ191MzIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS91bmlzdGQuaAppbmRleCA5Mjk2OGFhLi5jMDkyYzhmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14dGVuc2EvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3VuaXN0ZC5oCkBAIC02NzcsOCArNjc3LDggQEAKIAogI2RlZmluZSBfX05SX3NpZ25hbGZkCQkJCTMwNAogX19TWVNDQUxMKDMwNCwgc3lzX3NpZ25hbGZkLCAzKQotI2RlZmluZSBfX05SX3RpbWVyZmQJCQkJMzA1Ci1fX1NZU0NBTEwoMzA1LCBzeXNfdGltZXJmZCwgNCkKKy8qICAzMDUgd2FzIF9fTlJfdGltZXJmZCAgKi8KK19fU1lTQ0FMTCgzMDUsIHN5c19uaV9zeXNjYWxsLCAwKQogI2RlZmluZSBfX05SX2V2ZW50ZmQJCQkJMzA2CiBfX1NZU0NBTEwoMzA2LCBzeXNfZXZlbnRmZCwgMSkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9LYnVpbGQgYi9pbmNsdWRlL2xpbnV4L0tidWlsZAppbmRleCA5MzYzMTIyLi41Y2FlOWI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L0tidWlsZAorKysgYi9pbmNsdWRlL2xpbnV4L0tidWlsZApAQCAtMTgsNyArMTgsNiBAQAogCiBoZWFkZXIteSArPSBhZmZzX2hhcmRibG9ja3MuaAogaGVhZGVyLXkgKz0gYWlvX2FiaS5oCi1oZWFkZXIteSArPSBhLm91dC5oCiBoZWFkZXIteSArPSBhcmNmYi5oCiBoZWFkZXIteSArPSBhdG1hcGkuaAogaGVhZGVyLXkgKz0gYXRtYnIyNjg0LmgKQEAgLTYwLDcgKzU5LDYgQEAKIGhlYWRlci15ICs9IGRxYmxrX3hmcy5oCiBoZWFkZXIteSArPSBlZnNfZnNfc2IuaAogaGVhZGVyLXkgKz0gZWxmLWZkcGljLmgKLWhlYWRlci15ICs9IGVsZi5oCiBoZWFkZXIteSArPSBlbGYtZW0uaAogaGVhZGVyLXkgKz0gZmFkdmlzZS5oCiBoZWFkZXIteSArPSBmZC5oCkBAIC0xOTAsNiArMTg4LDcgQEAKIHVuaWZkZWYteSArPSBkaXJlbnQuaAogdW5pZmRlZi15ICs9IGRsbS5oCiB1bmlmZGVmLXkgKz0gZWRkLmgKK3VuaWZkZWYteSArPSBlbGYuaAogdW5pZmRlZi15ICs9IGVsZmNvcmUuaAogdW5pZmRlZi15ICs9IGVycm5vLmgKIHVuaWZkZWYteSArPSBlcnJxdWV1ZS5oCkBAIC0zMzksMTIgKzMzOCwxMCBAQAogdW5pZmRlZi15ICs9IHR5cGVzLmgKIHVuaWZkZWYteSArPSB1ZGZfZnNfaS5oCiB1bmlmZGVmLXkgKz0gdWRwLmgKLXVuaWZkZWYteSArPSB1ZnNfZnMuaAogdW5pZmRlZi15ICs9IHVpbnB1dC5oCiB1bmlmZGVmLXkgKz0gdWlvLmgKIHVuaWZkZWYteSArPSB1bmlzdGQuaAogdW5pZmRlZi15ICs9IHVzYmRldmljZV9mcy5oCi11bmlmZGVmLXkgKz0gdXNlci5oCiB1bmlmZGVmLXkgKz0gdXRzbmFtZS5oCiB1bmlmZGVmLXkgKz0gdmlkZW9kZXYyLmgKIHVuaWZkZWYteSArPSB2aWRlb2Rldi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Eub3V0LmggYi9pbmNsdWRlL2xpbnV4L2Eub3V0LmgKaW5kZXggZjkxM2NjMy4uMjA4ZjRlOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hLm91dC5oCisrKyBiL2luY2x1ZGUvbGludXgvYS5vdXQuaApAQCAtMSw2ICsxLDggQEAKICNpZm5kZWYgX19BX09VVF9HTlVfSF9fCiAjZGVmaW5lIF9fQV9PVVRfR05VX0hfXwogCisjaWZkZWYgQ09ORklHX0FSQ0hfU1VQUE9SVFNfQU9VVAorCiAjZGVmaW5lIF9fR05VX0VYRUNfTUFDUk9TX18KIAogI2lmbmRlZiBfX1NUUlVDVF9FWEVDX09WRVJSSURFX18KQEAgLTksNiArMTEsOCBAQAogCiAjZW5kaWYgLyogX19TVFJVQ1RfRVhFQ19PVkVSUklERV9fICovCiAKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKIC8qIHRoZXNlIGdvIGluIHRoZSBOX01BQ0hUWVBFIGZpZWxkICovCiBlbnVtIG1hY2hpbmVfdHlwZSB7CiAjaWYgZGVmaW5lZCAoTV9PTERTVU4yKQpAQCAtMTI4LDEyICsxMzIsMjAgQEAKICNlbmRpZgogCiAjaWZkZWYgbGludXgKKyNpZmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNlbHNlCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKICNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9fbWM2ODAwMF9fKQogI2RlZmluZSBTRUdNRU5UX1NJWkUJMTAyNAogI2Vsc2UKICNpZm5kZWYgU0VHTUVOVF9TSVpFCisjaWZkZWYgX19LRVJORUxfXwogI2RlZmluZSBTRUdNRU5UX1NJWkUJUEFHRV9TSVpFCisjZWxzZQorI2RlZmluZSBTRUdNRU5UX1NJWkUgICBnZXRwYWdlc2l6ZSgpCisjZW5kaWYKICNlbmRpZgogI2VuZGlmCiAjZW5kaWYKQEAgLTI2NCw1ICsyNzYsMTEgQEAKIH07CiAjZW5kaWYgLyogbm8gTl9SRUxPQ0FUSU9OX0lORk9fREVDTEFSRUQuICAqLwogCi0KKyNlbmRpZiAvKl9fQVNTRU1CTFlfXyAqLworI2Vsc2UgLyogQ09ORklHX0FSQ0hfU1VQUE9SVFNfQU9VVCAqLworI2lmbmRlZiBfX0FTU0VNQkxZX18KK3N0cnVjdCBleGVjIHsKK307CisjZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfQVJDSF9TVVBQT1JUU19BT1VUICovCiAjZW5kaWYgLyogX19BX09VVF9HTlVfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FjcGkuaCBiL2luY2x1ZGUvbGludXgvYWNwaS5oCmluZGV4IDYzZjJlNmUuLmRkYmU3ZWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYWNwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvYWNwaS5oCkBAIC0yNSw2ICsyNSw3IEBACiAjaWZuZGVmIF9MSU5VWF9BQ1BJX0gKICNkZWZpbmUgX0xJTlVYX0FDUElfSAogCisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CS8qIGZvciBzdHJ1Y3QgcmVzb3VyY2UgKi8KIAogI2lmZGVmCUNPTkZJR19BQ1BJCiAKQEAgLTQzLDggKzQ0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KIAogCi0jaWZkZWYgQ09ORklHX0FDUEkKLQogZW51bSBhY3BpX2lycV9tb2RlbF9pZCB7CiAJQUNQSV9JUlFfTU9ERUxfUElDID0gMCwKIAlBQ1BJX0lSUV9NT0RFTF9JT0FQSUMsCkBAIC04MCw3ICs3OSw2IEBACiB0eXBlZGVmIGludCAoKmFjcGlfdGFibGVfZW50cnlfaGFuZGxlcikgKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCk7CiAKIGNoYXIgKiBfX2FjcGlfbWFwX3RhYmxlICh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKTsKLXVuc2lnbmVkIGxvbmcgYWNwaV9maW5kX3JzZHAgKHZvaWQpOwogaW50IGFjcGlfYm9vdF9pbml0ICh2b2lkKTsKIGludCBhY3BpX2Jvb3RfdGFibGVfaW5pdCAodm9pZCk7CiBpbnQgYWNwaV9udW1hX2luaXQgKHZvaWQpOwpAQCAtMTE1LDggKzExMyw4IEBACiAKIGludCBhY3BpX3JlZ2lzdGVyX2lvYXBpYyhhY3BpX2hhbmRsZSBoYW5kbGUsIHU2NCBwaHlzX2FkZHIsIHUzMiBnc2lfYmFzZSk7CiBpbnQgYWNwaV91bnJlZ2lzdGVyX2lvYXBpYyhhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBnc2lfYmFzZSk7Ci0KLWV4dGVybiBpbnQgYWNwaV9tcF9jb25maWc7Cit2b2lkIGFjcGlfaXJxX3N0YXRzX2luaXQodm9pZCk7CitleHRlcm4gdTMyIGFjcGlfaXJxX2hhbmRsZWQ7CiAKIGV4dGVybiBzdHJ1Y3QgYWNwaV9tY2ZnX2FsbG9jYXRpb24gKnBjaV9tbWNmZ19jb25maWc7CiBleHRlcm4gaW50IHBjaV9tbWNmZ19jb25maWdfbnVtOwpAQCAtMTI0LDEyICsxMjIsNiBAQAogZXh0ZXJuIGludCBzYmZfcG9ydDsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGFjcGlfcmVhbG1vZGVfZmxhZ3M7CiAKLSNlbHNlCS8qICFDT05GSUdfQUNQSSAqLwotCi0jZGVmaW5lIGFjcGlfbXBfY29uZmlnCTAKLQotI2VuZGlmIAkvKiAhQ09ORklHX0FDUEkgKi8KLQogaW50IGFjcGlfcmVnaXN0ZXJfZ3NpICh1MzIgZ3NpLCBpbnQgdHJpZ2dlcmluZywgaW50IHBvbGFyaXR5KTsKIGludCBhY3BpX2dzaV90b19pcnEgKHUzMiBnc2ksIHVuc2lnbmVkIGludCAqaXJxKTsKIApAQCAtMTQ1LDggKzEzNyw2IEBACiAgKi8KIHZvaWQgYWNwaV91bnJlZ2lzdGVyX2dzaSAodTMyIGdzaSk7CiAKLSNpZmRlZiBDT05GSUdfQUNQSQotCiBzdHJ1Y3QgYWNwaV9wcnRfZW50cnkgewogCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKIAlzdHJ1Y3QgYWNwaV9wY2lfaWQJaWQ7CkBAIC0xNzksOCArMTY5LDYgQEAKIGludCBhY3BpX3BjaV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGFjcGlfcGNpX2RyaXZlciAqZHJpdmVyKTsKIHZvaWQgYWNwaV9wY2lfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGFjcGlfcGNpX2RyaXZlciAqZHJpdmVyKTsKIAotI2VuZGlmIC8qIENPTkZJR19BQ1BJICovCi0KICNpZmRlZiBDT05GSUdfQUNQSV9FQwogCiBleHRlcm4gaW50IGVjX3JlYWQodTggYWRkciwgdTggKnZhbCk7CkBAIC0xOTIsNiArMTgwLDI2IEBACiAKICNlbmRpZiAvKkNPTkZJR19BQ1BJX0VDKi8KIAorI2lmIGRlZmluZWQoQ09ORklHX0FDUElfV01JKSB8fCBkZWZpbmVkKENPTkZJR19BQ1BJX1dNSV9NT0RVTEUpCisKK3R5cGVkZWYgdm9pZCAoKndtaV9ub3RpZnlfaGFuZGxlcikgKHUzMiB2YWx1ZSwgdm9pZCAqY29udGV4dCk7CisKK2V4dGVybiBhY3BpX3N0YXR1cyB3bWlfZXZhbHVhdGVfbWV0aG9kKGNvbnN0IGNoYXIgKmd1aWQsIHU4IGluc3RhbmNlLAorCQkJCQl1MzIgbWV0aG9kX2lkLAorCQkJCQljb25zdCBzdHJ1Y3QgYWNwaV9idWZmZXIgKmluLAorCQkJCQlzdHJ1Y3QgYWNwaV9idWZmZXIgKm91dCk7CitleHRlcm4gYWNwaV9zdGF0dXMgd21pX3F1ZXJ5X2Jsb2NrKGNvbnN0IGNoYXIgKmd1aWQsIHU4IGluc3RhbmNlLAorCQkJCQlzdHJ1Y3QgYWNwaV9idWZmZXIgKm91dCk7CitleHRlcm4gYWNwaV9zdGF0dXMgd21pX3NldF9ibG9jayhjb25zdCBjaGFyICpndWlkLCB1OCBpbnN0YW5jZSwKKwkJCQkJY29uc3Qgc3RydWN0IGFjcGlfYnVmZmVyICppbik7CitleHRlcm4gYWNwaV9zdGF0dXMgd21pX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoY29uc3QgY2hhciAqZ3VpZCwKKwkJCQkJd21pX25vdGlmeV9oYW5kbGVyIGhhbmRsZXIsIHZvaWQgKmRhdGEpOworZXh0ZXJuIGFjcGlfc3RhdHVzIHdtaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoY29uc3QgY2hhciAqZ3VpZCk7CitleHRlcm4gYWNwaV9zdGF0dXMgd21pX2dldF9ldmVudF9kYXRhKHUzMiBldmVudCwgc3RydWN0IGFjcGlfYnVmZmVyICpvdXQpOworZXh0ZXJuIGJvb2wgd21pX2hhc19ndWlkKGNvbnN0IGNoYXIgKmd1aWQpOworCisjZW5kaWYJLyogQ09ORklHX0FDUElfV01JICovCisKIGV4dGVybiBpbnQgYWNwaV9ibGFja2xpc3RlZCh2b2lkKTsKICNpZmRlZiBDT05GSUdfRE1JCiBleHRlcm4gdm9pZCBhY3BpX2RtaV9vc2lfbGludXgoaW50IGVuYWJsZSwgY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpOwpAQCAtMjE3LDYgKzIyNSwxMyBAQAogI2RlZmluZSBQWE1fSU5WQUwJKC0xKQogI2RlZmluZSBOSURfSU5WQUwJKC0xKQogCitpbnQgYWNwaV9jaGVja19yZXNvdXJjZV9jb25mbGljdChzdHJ1Y3QgcmVzb3VyY2UgKnJlcyk7CisKK2ludCBhY3BpX2NoZWNrX3JlZ2lvbihyZXNvdXJjZV9zaXplX3Qgc3RhcnQsIHJlc291cmNlX3NpemVfdCBuLAorCQkgICAgICBjb25zdCBjaGFyICpuYW1lKTsKK2ludCBhY3BpX2NoZWNrX21lbV9yZWdpb24ocmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LCByZXNvdXJjZV9zaXplX3QgbiwKKwkJICAgICAgY29uc3QgY2hhciAqbmFtZSk7CisKICNlbHNlCS8qIENPTkZJR19BQ1BJICovCiAKIHN0YXRpYyBpbmxpbmUgaW50IGFjcGlfYm9vdF9pbml0KHZvaWQpCkBAIC0yMjksNSArMjQ0LDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGFjcGlfY2hlY2tfcmVzb3VyY2VfY29uZmxpY3Qoc3RydWN0IHJlc291cmNlICpyZXMpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFjcGlfY2hlY2tfcmVnaW9uKHJlc291cmNlX3NpemVfdCBzdGFydCwgcmVzb3VyY2Vfc2l6ZV90IG4sCisJCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFjcGlfY2hlY2tfbWVtX3JlZ2lvbihyZXNvdXJjZV9zaXplX3Qgc3RhcnQsCisJCQkJCXJlc291cmNlX3NpemVfdCBuLCBjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiAwOworfQorCiAjZW5kaWYJLyogIUNPTkZJR19BQ1BJICovCiAjZW5kaWYJLypfTElOVVhfQUNQSV9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXRtZWxfcHdtLmggYi9pbmNsdWRlL2xpbnV4L2F0bWVsX3B3bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMDRhYmIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2F0bWVsX3B3bS5oCkBAIC0wLDAgKzEsNzAgQEAKKyNpZm5kZWYgX19MSU5VWF9BVE1FTF9QV01fSAorI2RlZmluZSBfX0xJTlVYX0FUTUVMX1BXTV9ICisKKy8qKgorICogc3RydWN0IHB3bV9jaGFubmVsIC0gZHJpdmVyIGhhbmRsZSB0byBhIFBXTSBjaGFubmVsCisgKiBAcmVnczogYmFzZSBvZiB0aGlzIGNoYW5uZWwncyByZWdpc3RlcnMKKyAqIEBpbmRleDogbnVtYmVyIG9mIHRoaXMgY2hhbm5lbCAoMC4uMzEpCisgKiBAbWNrOiBiYXNlIGNsb2NrIHJhdGUsIHdoaWNoIGNhbiBiZSBwcmVzY2FsZWQgYW5kIG1heWJlIHN1YmRpdmlkZWQKKyAqCisgKiBEcml2ZXJzIGluaXRpYWxpemUgYSBwd21fY2hhbm5lbCBzdHJ1Y3R1cmUgdXNpbmcgcHdtX2NoYW5uZWxfYWxsb2MoKS4KKyAqIFRoZW4gdGhleSBjb25maWd1cmUgaXRzIGNsb2NrIHJhdGUgKGRlcml2ZWQgZnJvbSBNQ0spLCBhbGlnbm1lbnQsCisgKiBwb2xhcml0eSwgYW5kIGR1dHkgY3ljbGUgYnkgd3JpdGluZyBkaXJlY3RseSB0byB0aGUgY2hhbm5lbCByZWdpc3RlcnMsCisgKiBiZWZvcmUgZW5hYmxpbmcgdGhlIGNoYW5uZWwgYnkgY2FsbGluZyBwd21fY2hhbm5lbF9lbmFibGUoKS4KKyAqCisgKiBBZnRlciBlbWl0dGluZyBhIFBXTSBzaWduYWwgZm9yIHRoZSBkZXNpcmVkIGxlbmd0aCBvZiB0aW1lLCBkcml2ZXJzCisgKiBtYXkgdGhlbiBwd21fY2hhbm5lbF9kaXNhYmxlKCkgb3IgcHdtX2NoYW5uZWxfZnJlZSgpLiAgQm90aCBvZiB0aGVzZQorICogZGlzYWJsZSB0aGUgY2hhbm5lbCwgYnV0IHdoZW4gaXQncyBmcmVlZCB0aGUgSVJRIGlzIGRlY29uZmlndXJlZCBhbmQKKyAqIHRoZSBjaGFubmVsIG11c3QgbGF0ZXIgYmUgcmUtYWxsb2NhdGVkIGFuZCByZWNvbmZpZ3VyZWQuCisgKgorICogTm90ZSB0aGF0IGlmIHRoZSBwZXJpb2Qgb3IgZHV0eSBjeWNsZSBuZWVkIHRvIGJlIGNoYW5nZWQgd2hpbGUgdGhlCisgKiBQV00gY2hhbm5lbCBpcyBvcGVyYXRpbmcsIGRyaXZlcnMgbXVzdCB1c2UgdGhlIFBXTV9DVVBEIGRvdWJsZSBidWZmZXIKKyAqIG1lY2hhbmlzbSwgZWl0aGVyIHBvbGxpbmcgdW50aWwgdGhleSBjaGFuZ2Ugb3IgZ2V0dGluZyBpbXBsaWNpdGx5CisgKiBub3RpZmllZCB0aHJvdWdoIGEgb25jZS1wZXItcGVyaW9kIGludGVycnVwdCBoYW5kbGVyLgorICovCitzdHJ1Y3QgcHdtX2NoYW5uZWwgeworCXZvaWQgX19pb21lbQkqcmVnczsKKwl1bnNpZ25lZAlpbmRleDsKKwl1bnNpZ25lZCBsb25nCW1jazsKK307CisKK2V4dGVybiBpbnQgcHdtX2NoYW5uZWxfYWxsb2MoaW50IGluZGV4LCBzdHJ1Y3QgcHdtX2NoYW5uZWwgKmNoKTsKK2V4dGVybiBpbnQgcHdtX2NoYW5uZWxfZnJlZShzdHJ1Y3QgcHdtX2NoYW5uZWwgKmNoKTsKKworZXh0ZXJuIGludCBwd21fY2xrX2FsbG9jKHVuc2lnbmVkIHByZXNjYWxlLCB1bnNpZ25lZCBkaXYpOworZXh0ZXJuIHZvaWQgcHdtX2Nsa19mcmVlKHVuc2lnbmVkIGNsayk7CisKK2V4dGVybiBpbnQgX19wd21fY2hhbm5lbF9vbm9mZihzdHJ1Y3QgcHdtX2NoYW5uZWwgKmNoLCBpbnQgZW5hYmxlZCk7CisKKyNkZWZpbmUgcHdtX2NoYW5uZWxfZW5hYmxlKGNoKQlfX3B3bV9jaGFubmVsX29ub2ZmKChjaCksIDEpCisjZGVmaW5lIHB3bV9jaGFubmVsX2Rpc2FibGUoY2gpCV9fcHdtX2NoYW5uZWxfb25vZmYoKGNoKSwgMCkKKworLyogcGVyaW9kaWMgaW50ZXJydXB0cywgbW9zdGx5IGZvciBDVVBEIGNoYW5nZXMgdG8gcGVyaW9kIG9yIGN5Y2xlICovCitleHRlcm4gaW50IHB3bV9jaGFubmVsX2hhbmRsZXIoc3RydWN0IHB3bV9jaGFubmVsICpjaCwKKwkJdm9pZCAoKmhhbmRsZXIpKHN0cnVjdCBwd21fY2hhbm5lbCAqY2gpKTsKKworLyogcGVyLWNoYW5uZWwgcmVnaXN0ZXJzIChiYW5rZWQgYXQgcHdtX2NoYW5uZWwtPnJlZ3MpICovCisjZGVmaW5lIFBXTV9DTVIJCTB4MDAJCS8qIG1vZGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJCVBXTV9DUFJfQ1BECSgxIDw8IDEwKQkvKiBzZXQ6IENVUEQgbW9kaWZpZXMgcGVyaW9kICovCisjZGVmaW5lCQlQV01fQ1BSX0NQT0wJKDEgPDwgOSkJLyogc2V0OiBpZGxlIGhpZ2ggKi8KKyNkZWZpbmUJCVBXTV9DUFJfQ0FMRwkoMSA8PCA4KQkvKiBzZXQ6IGNlbnRlciBhbGlnbiAqLworI2RlZmluZQkJUFdNX0NQUl9DUFJFCSgweGYgPDwgMCkJLyogbWFzazogcmF0ZSBpcyBtY2svKDJecHJlKSAqLworI2RlZmluZQkJUFdNX0NQUl9DTEtBCSgweGIgPDwgMCkJLyogcmF0ZSBDTEtBICovCisjZGVmaW5lCQlQV01fQ1BSX0NMS0IJKDB4YyA8PCAwKQkvKiByYXRlIENMS0IgKi8KKyNkZWZpbmUgUFdNX0NEVFkJMHgwNAkJLyogZHV0eSBjeWNsZSAobWF4IG9mIENQUkQpICovCisjZGVmaW5lIFBXTV9DUFJECTB4MDgJCS8qIHBlcmlvZCAoY291bnQgdXAgZnJvbSB6ZXJvKSAqLworI2RlZmluZSBQV01fQ0NOVAkweDBjCQkvKiBjb3VudGVyICgyMCBiaXRzPykgKi8KKyNkZWZpbmUgUFdNX0NVUEQJMHgxMAkJLyogdXBkYXRlIENQUkQgKG9yIENEVFkpIG5leHQgcGVyaW9kICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcHdtX2NoYW5uZWxfd3JpdGVsKHN0cnVjdCBwd21fY2hhbm5lbCAqcHdtYywgdW5zaWduZWQgb2Zmc2V0LCB1MzIgdmFsKQoreworCV9fcmF3X3dyaXRlbCh2YWwsIHB3bWMtPnJlZ3MgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBwd21fY2hhbm5lbF9yZWFkbChzdHJ1Y3QgcHdtX2NoYW5uZWwgKnB3bWMsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGwocHdtYy0+cmVncyArIG9mZnNldCk7Cit9CisKKyNlbmRpZiAvKiBfX0xJTlVYX0FUTUVMX1BXTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaAppbmRleCA5MDM5MmE5Li5lMTg4OGNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKQEAgLTEzNyw3ICsxMzcsOSBAQAogI2RlZmluZSBCTEtfTUFYX0NEQgkxNgogCiAvKgotICogdHJ5IHRvIHB1dCB0aGUgZmllbGRzIHRoYXQgYXJlIHJlZmVyZW5jZWQgdG9nZXRoZXIgaW4gdGhlIHNhbWUgY2FjaGVsaW5lCisgKiB0cnkgdG8gcHV0IHRoZSBmaWVsZHMgdGhhdCBhcmUgcmVmZXJlbmNlZCB0b2dldGhlciBpbiB0aGUgc2FtZSBjYWNoZWxpbmUuCisgKiBpZiB5b3UgbW9kaWZ5IHRoaXMgc3RydWN0dXJlLCBiZSBzdXJlIHRvIGNoZWNrIGJsb2NrL2Jsay1jb3JlLmM6cnFfaW5pdCgpCisgKiBhcyB3ZWxsIQogICovCiBzdHJ1Y3QgcmVxdWVzdCB7CiAJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZWxpc3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jvb3RtZW0uaCBiL2luY2x1ZGUvbGludXgvYm9vdG1lbS5oCmluZGV4IDAzNjVlYzkuLjRlNGUzNDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYm9vdG1lbS5oCisrKyBiL2luY2x1ZGUvbGludXgvYm9vdG1lbS5oCkBAIC02MCw4ICs2MCwyMCBAQAogCQkJCSAgdW5zaWduZWQgbG9uZyBnb2FsLAogCQkJCSAgdW5zaWduZWQgbG9uZyBsaW1pdCk7CiAKKy8qCisgKiBmbGFncyBmb3IgcmVzZXJ2ZV9ib290bWVtIChhbHNvIGlmIENPTkZJR19IQVZFX0FSQ0hfQk9PVE1FTV9OT0RFLAorICogdGhlIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjb2RlIHNob3VsZCBob25vciB0aGlzKQorICovCisjZGVmaW5lIEJPT1RNRU1fREVGQVVMVAkJMAorI2RlZmluZSBCT09UTUVNX0VYQ0xVU0lWRQkoMTw8MCkKKwogI2lmbmRlZiBDT05GSUdfSEFWRV9BUkNIX0JPT1RNRU1fTk9ERQotZXh0ZXJuIHZvaWQgcmVzZXJ2ZV9ib290bWVtKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKTsKKy8qCisgKiBJZiBmbGFncyBpcyAwLCB0aGVuIHRoZSByZXR1cm4gdmFsdWUgaXMgYWx3YXlzIDAgKHN1Y2Nlc3MpLiBJZgorICogZmxhZ3MgY29udGFpbnMgQk9PVE1FTV9FWENMVVNJVkUsIHRoZW4gLUVCVVNZIGlzIHJldHVybmVkIGlmIHRoZQorICogbWVtb3J5IGFscmVhZHkgd2FzIHJlc2VydmVkLgorICovCitleHRlcm4gaW50IHJlc2VydmVfYm9vdG1lbSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IGZsYWdzKTsKICNkZWZpbmUgYWxsb2NfYm9vdG1lbSh4KSBcCiAJX19hbGxvY19ib290bWVtKHgsIFNNUF9DQUNIRV9CWVRFUywgX19wYShNQVhfRE1BX0FERFJFU1MpKQogI2RlZmluZSBhbGxvY19ib290bWVtX2xvdyh4KSBcCkBAIC04NCw3ICs5Niw4IEBACiAJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZW5kcGZuKTsKIGV4dGVybiB2b2lkIHJlc2VydmVfYm9vdG1lbV9ub2RlKHBnX2RhdGFfdCAqcGdkYXQsCiAJCQkJIHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsCi0JCQkJIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CisJCQkJIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkgaW50IGZsYWdzKTsKIGV4dGVybiB2b2lkIGZyZWVfYm9vdG1lbV9ub2RlKHBnX2RhdGFfdCAqcGdkYXQsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIHNpemUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvZ2VuZXJpYy5oIGIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvZ2VuZXJpYy5oCmluZGV4IDNkYzcxNWIuLmQzNzcxNTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2dlbmVyaWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9nZW5lcmljLmgKQEAgLTE0Niw2ICsxNDYsMzYgQEAKICNkZWZpbmUgaHRvbnMoeCkgX19faHRvbnMoeCkKICNkZWZpbmUgbnRvaHMoeCkgX19fbnRvaHMoeCkKIAorc3RhdGljIGlubGluZSB2b2lkIGxlMTZfYWRkX2NwdShfX2xlMTYgKnZhciwgdTE2IHZhbCkKK3sKKwkqdmFyID0gY3B1X3RvX2xlMTYobGUxNl90b19jcHUoKnZhcikgKyB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbGUzMl9hZGRfY3B1KF9fbGUzMiAqdmFyLCB1MzIgdmFsKQoreworCSp2YXIgPSBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdSgqdmFyKSArIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsZTY0X2FkZF9jcHUoX19sZTY0ICp2YXIsIHU2NCB2YWwpCit7CisJKnZhciA9IGNwdV90b19sZTY0KGxlNjRfdG9fY3B1KCp2YXIpICsgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJlMTZfYWRkX2NwdShfX2JlMTYgKnZhciwgdTE2IHZhbCkKK3sKKwkqdmFyID0gY3B1X3RvX2JlMTYoYmUxNl90b19jcHUoKnZhcikgKyB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmUzMl9hZGRfY3B1KF9fYmUzMiAqdmFyLCB1MzIgdmFsKQoreworCSp2YXIgPSBjcHVfdG9fYmUzMihiZTMyX3RvX2NwdSgqdmFyKSArIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiZTY0X2FkZF9jcHUoX19iZTY0ICp2YXIsIHU2NCB2YWwpCit7CisJKnZhciA9IGNwdV90b19iZTY0KGJlNjRfdG9fY3B1KCp2YXIpICsgdmFsKTsKK30KKwogI2VuZGlmIC8qIEtFUk5FTCAqLwogCiAjZW5kaWYgLyogX0xJTlVYX0JZVEVPUkRFUl9HRU5FUklDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2dyb3VwLmggYi9pbmNsdWRlL2xpbnV4L2Nncm91cC5oCmluZGV4IDg3NDc5MzIuLmZmOTA1NWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2dyb3VwLmgKKysrIGIvaW5jbHVkZS9saW51eC9jZ3JvdXAuaApAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9jZ3JvdXBzdGF0cy5oPgorI2luY2x1ZGUgPGxpbnV4L3ByaW9faGVhcC5oPgogCiAjaWZkZWYgQ09ORklHX0NHUk9VUFMKIApAQCAtMjA3LDYgKzIwOCwxNCBAQAogCWludCAoKnJlbGVhc2UpIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiB9OwogCitzdHJ1Y3QgY2dyb3VwX3NjYW5uZXIgeworCXN0cnVjdCBjZ3JvdXAgKmNnOworCWludCAoKnRlc3RfdGFzaykoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3QgY2dyb3VwX3NjYW5uZXIgKnNjYW4pOworCXZvaWQgKCpwcm9jZXNzX3Rhc2spKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwKKwkJCXN0cnVjdCBjZ3JvdXBfc2Nhbm5lciAqc2Nhbik7CisJc3RydWN0IHB0cl9oZWFwICpoZWFwOworfTsKKwogLyogQWRkIGEgbmV3IGZpbGUgdG8gdGhlIGdpdmVuIGNncm91cCBkaXJlY3RvcnkuIFNob3VsZCBvbmx5IGJlCiAgKiBjYWxsZWQgYnkgc3Vic3lzdGVtcyBmcm9tIHdpdGhpbiBhIHBvcHVsYXRlKCkgbWV0aG9kICovCiBpbnQgY2dyb3VwX2FkZF9maWxlKHN0cnVjdCBjZ3JvdXAgKmNvbnQsIHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzdWJzeXMsCkBAIC0yMzMsNiArMjQyLDcgQEAKIHN0cnVjdCBjZ3JvdXBfc3Vic3lzIHsKIAlzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqKCpjcmVhdGUpKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywKIAkJCQkJCSAgc3RydWN0IGNncm91cCAqY29udCk7CisJdm9pZCAoKnByZV9kZXN0cm95KShzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNvbnQpOwogCXZvaWQgKCpkZXN0cm95KShzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNvbnQpOwogCWludCAoKmNhbl9hdHRhY2gpKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywKIAkJCSAgc3RydWN0IGNncm91cCAqY29udCwgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOwpAQCAtMjk4LDExICszMDgsMTcgQEAKICAqICAgIHJldHVybnMgTlVMTCBvciB1bnRpbCB5b3Ugd2FudCB0byBlbmQgdGhlIGl0ZXJhdGlvbgogICoKICAqIDMpIGNhbGwgY2dyb3VwX2l0ZXJfZW5kKCkgdG8gZGVzdHJveSB0aGUgaXRlcmF0b3IuCisgKgorICogT3IsIGNhbGwgY2dyb3VwX3NjYW5fdGFza3MoKSB0byBpdGVyYXRlIHRocm91Z2ggZXZlcnkgdGFzayBpbiBhIGNwdXNldC4KKyAqICAgIC0gY2dyb3VwX3NjYW5fdGFza3MoKSBob2xkcyB0aGUgY3NzX3NldF9sb2NrIHdoZW4gY2FsbGluZyB0aGUgdGVzdF90YXNrKCkKKyAqICAgICAgY2FsbGJhY2ssIGJ1dCBub3Qgd2hpbGUgY2FsbGluZyB0aGUgcHJvY2Vzc190YXNrKCkgY2FsbGJhY2suCiAgKi8KIHZvaWQgY2dyb3VwX2l0ZXJfc3RhcnQoc3RydWN0IGNncm91cCAqY29udCwgc3RydWN0IGNncm91cF9pdGVyICppdCk7CiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNncm91cF9pdGVyX25leHQoc3RydWN0IGNncm91cCAqY29udCwKIAkJCQkJc3RydWN0IGNncm91cF9pdGVyICppdCk7CiB2b2lkIGNncm91cF9pdGVyX2VuZChzdHJ1Y3QgY2dyb3VwICpjb250LCBzdHJ1Y3QgY2dyb3VwX2l0ZXIgKml0KTsKK2ludCBjZ3JvdXBfc2Nhbl90YXNrcyhzdHJ1Y3QgY2dyb3VwX3NjYW5uZXIgKnNjYW4pOworaW50IGNncm91cF9hdHRhY2hfdGFzayhzdHJ1Y3QgY2dyb3VwICosIHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKIAogI2Vsc2UgLyogIUNPTkZJR19DR1JPVVBTICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2dyb3VwX3N1YnN5cy5oIGIvaW5jbHVkZS9saW51eC9jZ3JvdXBfc3Vic3lzLmgKaW5kZXggOWVjNDMxOC4uMjI4MjM1YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jZ3JvdXBfc3Vic3lzLmgKKysrIGIvaW5jbHVkZS9saW51eC9jZ3JvdXBfc3Vic3lzLmgKQEAgLTM3LDMgKzM3LDggQEAKIAogLyogKi8KIAorI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX0NPTlQKK1NVQlNZUyhtZW1fY2dyb3VwKQorI2VuZGlmCisKKy8qICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdWZyZXEuaCBiL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oCmluZGV4IDIzOTMyZDcuLmRkZDg2NTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oCisrKyBiL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oCkBAIC0xNjcsNiArMTY3LDEwIEBACiAJY2hhcgluYW1lW0NQVUZSRVFfTkFNRV9MRU5dOwogCWludCAJKCpnb3Zlcm5vcikJKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAogCQkJCSB1bnNpZ25lZCBpbnQgZXZlbnQpOworCXNzaXplX3QJKCpzaG93X3NldHNwZWVkKQkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCQkJCSBjaGFyICpidWYpOworCWludCAJKCpzdG9yZV9zZXRzcGVlZCkJKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkJCQkgdW5zaWduZWQgaW50IGZyZXEpOwogCXVuc2lnbmVkIGludCBtYXhfdHJhbnNpdGlvbl9sYXRlbmN5OyAvKiBIVyBtdXN0IGJlIGFibGUgdG8gc3dpdGNoIHRvCiAJCQluZXh0IGZyZXEgZmFzdGVyIHRoYW4gdGhpcyB2YWx1ZSBpbiBuYW5vIHNlY3Mgb3Igd2UKIAkJCXdpbGwgZmFsbGJhY2sgdG8gcGVyZm9ybWFuY2UgZ292ZXJub3IgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1aWRsZS5oIGIvaW5jbHVkZS9saW51eC9jcHVpZGxlLmgKaW5kZXggYjBmZDg1YS4uMzg1ZDQ1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHVpZGxlLmgKKysrIGIvaW5jbHVkZS9saW51eC9jcHVpZGxlLmgKQEAgLTQ2LDkgKzQ2LDEwIEBACiAvKiBJZGxlIFN0YXRlIEZsYWdzICovCiAjZGVmaW5lIENQVUlETEVfRkxBR19USU1FX1ZBTElECSgweDAxKSAvKiBpcyByZXNpZGVuY3kgdGltZSBtZWFzdXJhYmxlPyAqLwogI2RlZmluZSBDUFVJRExFX0ZMQUdfQ0hFQ0tfQk0JKDB4MDIpIC8qIEJNIGFjdGl2aXR5IHdpbGwgZXhpdCBzdGF0ZSAqLwotI2RlZmluZSBDUFVJRExFX0ZMQUdfU0hBTExPVwkoMHgxMCkgLyogbG93IGxhdGVuY3ksIG1pbmltYWwgc2F2aW5ncyAqLwotI2RlZmluZSBDUFVJRExFX0ZMQUdfQkFMQU5DRUQJKDB4MjApIC8qIG1lZGl1bSBsYXRlbmN5LCBtb2RlcmF0ZSBzYXZpbmdzICovCi0jZGVmaW5lIENQVUlETEVfRkxBR19ERUVQCSgweDQwKSAvKiBoaWdoIGxhdGVuY3ksIGxhcmdlIHNhdmluZ3MgKi8KKyNkZWZpbmUgQ1BVSURMRV9GTEFHX1BPTEwJKDB4MTApIC8qIG5vIGxhdGVuY3ksIG5vIHNhdmluZ3MgKi8KKyNkZWZpbmUgQ1BVSURMRV9GTEFHX1NIQUxMT1cJKDB4MjApIC8qIGxvdyBsYXRlbmN5LCBtaW5pbWFsIHNhdmluZ3MgKi8KKyNkZWZpbmUgQ1BVSURMRV9GTEFHX0JBTEFOQ0VECSgweDQwKSAvKiBtZWRpdW0gbGF0ZW5jeSwgbW9kZXJhdGUgc2F2aW5ncyAqLworI2RlZmluZSBDUFVJRExFX0ZMQUdfREVFUAkoMHg4MCkgLyogaGlnaCBsYXRlbmN5LCBsYXJnZSBzYXZpbmdzICovCiAKICNkZWZpbmUgQ1BVSURMRV9EUklWRVJfRkxBR1NfTUFTSyAoMHhGRkZGMDAwMCkKIApAQCAtMTc4LDQgKzE3OSwxMCBAQAogCiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19BUkNIX0hBU19DUFVfUkVMQVgKKyNkZWZpbmUgQ1BVSURMRV9EUklWRVJfU1RBVEVfU1RBUlQJMQorI2Vsc2UKKyNkZWZpbmUgQ1BVSURMRV9EUklWRVJfU1RBVEVfU1RBUlQJMAorI2VuZGlmCisKICNlbmRpZiAvKiBfTElOVVhfQ1BVSURMRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdXNldC5oIGIvaW5jbHVkZS9saW51eC9jcHVzZXQuaAppbmRleCBlY2FlNTg1Li5mOGM5YTI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdXNldC5oCisrKyBiL2luY2x1ZGUvbGludXgvY3B1c2V0LmgKQEAgLTU3LDcgKzU3LDkgQEAKIGV4dGVybiB2b2lkIF9fY3B1c2V0X21lbW9yeV9wcmVzc3VyZV9idW1wKHZvaWQpOwogCiBleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2NwdXNldF9vcGVyYXRpb25zOwotZXh0ZXJuIGNoYXIgKmNwdXNldF90YXNrX3N0YXR1c19hbGxvd2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqYnVmZmVyKTsKK3N0cnVjdCBzZXFfZmlsZTsKK2V4dGVybiB2b2lkIGNwdXNldF90YXNrX3N0YXR1c19hbGxvd2VkKHN0cnVjdCBzZXFfZmlsZSAqbSwKKwkJCQkJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKIAogZXh0ZXJuIHZvaWQgY3B1c2V0X2xvY2sodm9pZCk7CiBleHRlcm4gdm9pZCBjcHVzZXRfdW5sb2NrKHZvaWQpOwpAQCAtMTI2LDEwICsxMjgsOSBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgY3B1c2V0X21lbW9yeV9wcmVzc3VyZV9idW1wKHZvaWQpIHt9CiAKLXN0YXRpYyBpbmxpbmUgY2hhciAqY3B1c2V0X3Rhc2tfc3RhdHVzX2FsbG93ZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAotCQkJCQkJCWNoYXIgKmJ1ZmZlcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVzZXRfdGFza19zdGF0dXNfYWxsb3dlZChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sCisJCQkJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0JcmV0dXJuIGJ1ZmZlcjsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNwdXNldF9sb2NrKHZvaWQpIHt9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RjYS5oIGIvaW5jbHVkZS9saW51eC9kY2EuaAppbmRleCA4M2VhZWNjLi5hZjYxY2QxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RjYS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGNhLmgKQEAgLTExLDcgKzExLDcgQEAKIAogc3RydWN0IGRjYV9wcm92aWRlciB7CiAJc3RydWN0IGRjYV9vcHMJCSpvcHM7Ci0Jc3RydWN0IGNsYXNzX2RldmljZSAJKmNkOworCXN0cnVjdCBkZXZpY2UgCQkqY2Q7CiAJaW50CQkJIGlkOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZXZpY2UtbWFwcGVyLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS1tYXBwZXIuaAppbmRleCBlNzY1ZTE5Li5jYjc4NDU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RldmljZS1tYXBwZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RldmljZS1tYXBwZXIuaApAQCAtMTEwLDE1ICsxMTAsMTUgQEAKIH07CiAKIHN0cnVjdCBpb19yZXN0cmljdGlvbnMgewotCXVuc2lnbmVkIGludAkJbWF4X3NlY3RvcnM7Ci0JdW5zaWduZWQgc2hvcnQJCW1heF9waHlzX3NlZ21lbnRzOwotCXVuc2lnbmVkIHNob3J0CQltYXhfaHdfc2VnbWVudHM7Ci0JdW5zaWduZWQgc2hvcnQJCWhhcmRzZWN0X3NpemU7Ci0JdW5zaWduZWQgaW50CQltYXhfc2VnbWVudF9zaXplOwotCXVuc2lnbmVkIGludAkJbWF4X2h3X3NlY3RvcnM7Ci0JdW5zaWduZWQgbG9uZwkJc2VnX2JvdW5kYXJ5X21hc2s7Ci0JdW5zaWduZWQgbG9uZwkJYm91bmNlX3BmbjsKLQl1bnNpZ25lZCBjaGFyCQlub19jbHVzdGVyOyAvKiBpbnZlcnRlZCBzbyB0aGF0IDAgaXMgZGVmYXVsdCAqLworCXVuc2lnbmVkIGxvbmcgYm91bmNlX3BmbjsKKwl1bnNpZ25lZCBsb25nIHNlZ19ib3VuZGFyeV9tYXNrOworCXVuc2lnbmVkIG1heF9od19zZWN0b3JzOworCXVuc2lnbmVkIG1heF9zZWN0b3JzOworCXVuc2lnbmVkIG1heF9zZWdtZW50X3NpemU7CisJdW5zaWduZWQgc2hvcnQgaGFyZHNlY3Rfc2l6ZTsKKwl1bnNpZ25lZCBzaG9ydCBtYXhfaHdfc2VnbWVudHM7CisJdW5zaWduZWQgc2hvcnQgbWF4X3BoeXNfc2VnbWVudHM7CisJdW5zaWduZWQgY2hhciBub19jbHVzdGVyOyAvKiBpbnZlcnRlZCBzbyB0aGF0IDAgaXMgZGVmYXVsdCAqLwogfTsKIAogc3RydWN0IGRtX3RhcmdldCB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtLWlvY3RsLmggYi9pbmNsdWRlL2xpbnV4L2RtLWlvY3RsLmgKaW5kZXggNTIzMjgxYy4uYjAzYzQxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbS1pb2N0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvZG0taW9jdGwuaApAQCAtMjMyLDM2ICsyMzIsNiBAQAogCURNX0RFVl9TRVRfR0VPTUVUUllfQ01ECiB9OwogCi0vKgotICogVGhlIGRtX2lvY3RsIHN0cnVjdCBwYXNzZWQgaW50byB0aGUgaW9jdGwgaXMganVzdCB0aGUgaGVhZGVyCi0gKiBvbiBhIGxhcmdlciBjaHVuayBvZiBtZW1vcnkuICBPbiB4ODYtNjQgYW5kIG90aGVyCi0gKiBhcmNoaXRlY3R1cmVzIHRoZSBkbS1pb2N0bCBzdHJ1Y3Qgd2lsbCBiZSBwYWRkZWQgdG8gYW4gOCBieXRlCi0gKiBib3VuZGFyeSBzbyB0aGUgc2l6ZSB3aWxsIGJlIGRpZmZlcmVudCwgd2hpY2ggd291bGQgY2hhbmdlIHRoZQotICogaW9jdGwgY29kZSAtIHllcyBJIHJlYWxseSBtZXNzZWQgdXAuICBUaGlzIGhhY2sgZm9yY2VzIHRoZXNlCi0gKiBhcmNoaXRlY3R1cmVzIHRvIGhhdmUgdGhlIGNvcnJlY3QgaW9jdGwgY29kZS4KLSAqLwotI2lmZGVmIENPTkZJR19DT01QQVQKLXR5cGVkZWYgY2hhciBpb2N0bF9zdHJ1Y3RbMzA4XTsKLSNkZWZpbmUgRE1fVkVSU0lPTl8zMiAgICAgICBfSU9XUihETV9JT0NUTCwgRE1fVkVSU0lPTl9DTUQsIGlvY3RsX3N0cnVjdCkKLSNkZWZpbmUgRE1fUkVNT1ZFX0FMTF8zMiAgICBfSU9XUihETV9JT0NUTCwgRE1fUkVNT1ZFX0FMTF9DTUQsIGlvY3RsX3N0cnVjdCkKLSNkZWZpbmUgRE1fTElTVF9ERVZJQ0VTXzMyICBfSU9XUihETV9JT0NUTCwgRE1fTElTVF9ERVZJQ0VTX0NNRCwgaW9jdGxfc3RydWN0KQotCi0jZGVmaW5lIERNX0RFVl9DUkVBVEVfMzIgICAgX0lPV1IoRE1fSU9DVEwsIERNX0RFVl9DUkVBVEVfQ01ELCBpb2N0bF9zdHJ1Y3QpCi0jZGVmaW5lIERNX0RFVl9SRU1PVkVfMzIgICAgX0lPV1IoRE1fSU9DVEwsIERNX0RFVl9SRU1PVkVfQ01ELCBpb2N0bF9zdHJ1Y3QpCi0jZGVmaW5lIERNX0RFVl9SRU5BTUVfMzIgICAgX0lPV1IoRE1fSU9DVEwsIERNX0RFVl9SRU5BTUVfQ01ELCBpb2N0bF9zdHJ1Y3QpCi0jZGVmaW5lIERNX0RFVl9TVVNQRU5EXzMyICAgX0lPV1IoRE1fSU9DVEwsIERNX0RFVl9TVVNQRU5EX0NNRCwgaW9jdGxfc3RydWN0KQotI2RlZmluZSBETV9ERVZfU1RBVFVTXzMyICAgIF9JT1dSKERNX0lPQ1RMLCBETV9ERVZfU1RBVFVTX0NNRCwgaW9jdGxfc3RydWN0KQotI2RlZmluZSBETV9ERVZfV0FJVF8zMiAgICAgIF9JT1dSKERNX0lPQ1RMLCBETV9ERVZfV0FJVF9DTUQsIGlvY3RsX3N0cnVjdCkKLQotI2RlZmluZSBETV9UQUJMRV9MT0FEXzMyICAgIF9JT1dSKERNX0lPQ1RMLCBETV9UQUJMRV9MT0FEX0NNRCwgaW9jdGxfc3RydWN0KQotI2RlZmluZSBETV9UQUJMRV9DTEVBUl8zMiAgIF9JT1dSKERNX0lPQ1RMLCBETV9UQUJMRV9DTEVBUl9DTUQsIGlvY3RsX3N0cnVjdCkKLSNkZWZpbmUgRE1fVEFCTEVfREVQU18zMiAgICBfSU9XUihETV9JT0NUTCwgRE1fVEFCTEVfREVQU19DTUQsIGlvY3RsX3N0cnVjdCkKLSNkZWZpbmUgRE1fVEFCTEVfU1RBVFVTXzMyICBfSU9XUihETV9JT0NUTCwgRE1fVEFCTEVfU1RBVFVTX0NNRCwgaW9jdGxfc3RydWN0KQotI2RlZmluZSBETV9MSVNUX1ZFUlNJT05TXzMyIF9JT1dSKERNX0lPQ1RMLCBETV9MSVNUX1ZFUlNJT05TX0NNRCwgaW9jdGxfc3RydWN0KQotI2RlZmluZSBETV9UQVJHRVRfTVNHXzMyICAgIF9JT1dSKERNX0lPQ1RMLCBETV9UQVJHRVRfTVNHX0NNRCwgaW9jdGxfc3RydWN0KQotI2RlZmluZSBETV9ERVZfU0VUX0dFT01FVFJZXzMyCV9JT1dSKERNX0lPQ1RMLCBETV9ERVZfU0VUX0dFT01FVFJZX0NNRCwgaW9jdGxfc3RydWN0KQotI2VuZGlmCi0KICNkZWZpbmUgRE1fSU9DVEwgMHhmZAogCiAjZGVmaW5lIERNX1ZFUlNJT04gICAgICAgX0lPV1IoRE1fSU9DVEwsIERNX1ZFUlNJT05fQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCkBAIC0yODYsOSArMjU2LDkgQEAKICNkZWZpbmUgRE1fREVWX1NFVF9HRU9NRVRSWQlfSU9XUihETV9JT0NUTCwgRE1fREVWX1NFVF9HRU9NRVRSWV9DTUQsIHN0cnVjdCBkbV9pb2N0bCkKIAogI2RlZmluZSBETV9WRVJTSU9OX01BSk9SCTQKLSNkZWZpbmUgRE1fVkVSU0lPTl9NSU5PUgkxMgorI2RlZmluZSBETV9WRVJTSU9OX01JTk9SCTEzCiAjZGVmaW5lIERNX1ZFUlNJT05fUEFUQ0hMRVZFTAkwCi0jZGVmaW5lIERNX1ZFUlNJT05fRVhUUkEJIi1pb2N0bCAoMjAwNy0xMC0wMikiCisjZGVmaW5lIERNX1ZFUlNJT05fRVhUUkEJIi1pb2N0bCAoMjAwNy0xMC0xOCkiCiAKIC8qIFN0YXR1cyBiaXRzICovCiAjZGVmaW5lIERNX1JFQURPTkxZX0ZMQUcJKDEgPDwgMCkgLyogSW4vT3V0ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtYXIuaCBiL2luY2x1ZGUvbGludXgvZG1hci5oCmluZGV4IGZmYjY0MzkuLjU2YzczYjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG1hci5oCisrKyBiL2luY2x1ZGUvbGludXgvZG1hci5oCkBAIC0yOCw3ICsyOCw3IEBACiAjaWZkZWYgQ09ORklHX0RNQVIKIHN0cnVjdCBpbnRlbF9pb21tdTsKIAotZXh0ZXJuIGNoYXIgKmRtYXJfZ2V0X2ZhdWx0X3JlYXNvbih1OCBmYXVsdF9yZWFzb24pOworZXh0ZXJuIGNvbnN0IGNoYXIgKmRtYXJfZ2V0X2ZhdWx0X3JlYXNvbih1OCBmYXVsdF9yZWFzb24pOwogCiAvKiBDYW4ndCB1c2UgdGhlIGNvbW1vbiBNU0kgaW50ZXJydXB0IGZ1bmN0aW9ucwogICogc2luY2UgRE1BUiBpcyBub3QgYSBwY2kgZGV2aWNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtaS5oIGIvaW5jbHVkZS9saW51eC9kbWkuaAppbmRleCA1YjQyYTY1Li4zMjVhY2RmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtaS5oCisrKyBiL2luY2x1ZGUvbGludXgvZG1pLmgKQEAgLTM1LDggKzM1LDExIEBACiAJRE1JX0RFVl9UWVBFX0VUSEVSTkVULAogCURNSV9ERVZfVFlQRV9UT0tFTlJJTkcsCiAJRE1JX0RFVl9UWVBFX1NPVU5ELAorCURNSV9ERVZfVFlQRV9QQVRBLAorCURNSV9ERVZfVFlQRV9TQVRBLAorCURNSV9ERVZfVFlQRV9TQVMsCiAJRE1JX0RFVl9UWVBFX0lQTUkgPSAtMSwKLQlETUlfREVWX1RZUEVfT0VNX1NUUklORyA9IC0yCisJRE1JX0RFVl9UWVBFX09FTV9TVFJJTkcgPSAtMiwKIH07CiAKIHN0cnVjdCBkbWlfaGVhZGVyIHsKQEAgLTc5LDcgKzgyLDcgQEAKIGV4dGVybiBpbnQgZG1pX2dldF95ZWFyKGludCBmaWVsZCk7CiBleHRlcm4gaW50IGRtaV9uYW1lX2luX3ZlbmRvcnMoY29uc3QgY2hhciAqc3RyKTsKIGV4dGVybiBpbnQgZG1pX2F2YWlsYWJsZTsKLWV4dGVybiBjaGFyICpkbWlfZ2V0X3Nsb3QoaW50IHNsb3QpOworZXh0ZXJuIGludCBkbWlfd2Fsayh2b2lkICgqZGVjb2RlKShjb25zdCBzdHJ1Y3QgZG1pX2hlYWRlciAqKSk7CiAKICNlbHNlCiAKQEAgLTkwLDcgKzkzLDggQEAKIHN0YXRpYyBpbmxpbmUgaW50IGRtaV9nZXRfeWVhcihpbnQgeWVhcikgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSBpbnQgZG1pX25hbWVfaW5fdmVuZG9ycyhjb25zdCBjaGFyICpzKSB7IHJldHVybiAwOyB9CiAjZGVmaW5lIGRtaV9hdmFpbGFibGUgMAotc3RhdGljIGlubGluZSBjaGFyICpkbWlfZ2V0X3Nsb3QoaW50IHNsb3QpIHsgcmV0dXJuIE5VTEw7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGRtaV93YWxrKHZvaWQgKCpkZWNvZGUpKGNvbnN0IHN0cnVjdCBkbWlfaGVhZGVyICopKQorCXsgcmV0dXJuIC0xOyB9CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RzMXdtLmggYi9pbmNsdWRlL2xpbnV4L2RzMXdtLmgKaW5kZXggMzFmNmUzYy4uZDNjNjVlNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kczF3bS5oCisrKyBiL2luY2x1ZGUvbGludXgvZHMxd20uaApAQCAtNiw2ICs2LDcgQEAKIAkJCSAgICAgKiBlLmcuIG9uIGg1eHh4IGFuZCBoMjIwMCB0aGlzIGlzIDIKIAkJCSAgICAgKiAocmVnaXN0ZXJzIGFsaWduZWQgdG8gNC1ieXRlIGJvdW5kYXJpZXMpLAogCQkJICAgICAqIHdoaWxlIG9uIGh4NDcwMCB0aGlzIGlzIDEgKi8KKwlpbnQgYWN0aXZlX2hpZ2g7CiAJdm9pZCAoKmVuYWJsZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CiAJdm9pZCAoKmRpc2FibGUpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZWZzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L2Vmc19mcy5oCmluZGV4IGRkNTdmZTUuLmE2OTVkNjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZWZzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9lZnNfZnMuaApAQCAtNDEsNyArNDEsNyBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZWZzX2Rpcl9vcGVyYXRpb25zOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZWZzX3N5bWxpbmtfYW9wczsKIAotZXh0ZXJuIHZvaWQgZWZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICopOworZXh0ZXJuIHN0cnVjdCBpbm9kZSAqZWZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIGVmc19ibG9ja190IGVmc19tYXBfYmxvY2soc3RydWN0IGlub2RlICosIGVmc19ibG9ja190KTsKIGV4dGVybiBpbnQgZWZzX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKiwgc2VjdG9yX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2VsZi1lbS5oIGIvaW5jbHVkZS9saW51eC9lbGYtZW0uaAppbmRleCA1ODM0ZTg0Li4xOGJlYTc4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2VsZi1lbS5oCisrKyBiL2luY2x1ZGUvbGludXgvZWxmLWVtLmgKQEAgLTMxLDYgKzMxLDcgQEAKICNkZWZpbmUgRU1fVjg1MAkJODcJLyogTkVDIHY4NTAgKi8KICNkZWZpbmUgRU1fTTMyUgkJODgJLyogUmVuZXNhcyBNMzJSICovCiAjZGVmaW5lIEVNX0g4XzMwMAk0NgkvKiBSZW5lc2FzIEg4LzMwMCwzMDBILEg4UyAqLworI2RlZmluZSBFTV9NTjEwMzAwCTg5CS8qIFBhbmFzb25pYy9NRUkgTU4xMDMwMCwgQU0zMyAqLwogI2RlZmluZSBFTV9CTEFDS0ZJTiAgICAgMTA2ICAgICAvKiBBREkgQmxhY2tmaW4gUHJvY2Vzc29yICovCiAjZGVmaW5lIEVNX0ZSVgkJMHg1NDQxCS8qIEZ1aml0c3UgRlItViAqLwogI2RlZmluZSBFTV9BVlIzMgkweDE4YWQJLyogQXRtZWwgQVZSMzIgKi8KQEAgLTQ3LDYgKzQ4LDggQEAKICNkZWZpbmUgRU1fQ1lHTlVTX00zMlIJMHg5MDQxCiAvKiBUaGlzIGlzIHRoZSBvbGQgaW50ZXJpbSB2YWx1ZSBmb3IgUy8zOTAgYXJjaGl0ZWN0dXJlICovCiAjZGVmaW5lIEVNX1MzOTBfT0xECTB4QTM5MAorLyogQWxzbyBQYW5hc29uaWMvTUVJIE1OMTAzMDAsIEFNMzMgKi8KKyNkZWZpbmUgRU1fQ1lHTlVTX01OMTAzMDAgMHhiZWVmCiAKIAogI2VuZGlmIC8qIF9MSU5VWF9FTEZfRU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9lbGYuaCBiL2luY2x1ZGUvbGludXgvZWxmLmgKaW5kZXggN2NlYjI0ZC4uYmFkMWIxNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9lbGYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2VsZi5oCkBAIC0zLDcgKzMsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9lbGYtZW0uaD4KKyNpZmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSA8YXNtL2VsZi5oPgorI2VuZGlmCiAKIHN0cnVjdCBmaWxlOwogCkBAIC0zNTUsNiArMzU3LDcgQEAKICNkZWZpbmUgTlRfQVVYVgkJNgogI2RlZmluZSBOVF9QUlhGUFJFRyAgICAgMHg0NmU2MmI3ZiAgICAgIC8qIGNvcGllZCBmcm9tIGdkYjUuMS9pbmNsdWRlL2VsZi9jb21tb24uaCAqLwogI2RlZmluZSBOVF9QUENfVk1YCTB4MTAwCQkvKiBQb3dlclBDIEFsdGl2ZWMvVk1YIHJlZ2lzdGVycyAqLworI2RlZmluZSBOVF9QUENfU1BFCTB4MTAxCQkvKiBQb3dlclBDIFNQRS9FVlIgcmVnaXN0ZXJzICovCiAjZGVmaW5lIE5UXzM4Nl9UTFMJMHgyMDAJCS8qIGkzODYgVExTIHNsb3RzIChzdHJ1Y3QgdXNlcl9kZXNjKSAqLwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZWxmY29yZS5oIGIvaW5jbHVkZS9saW51eC9lbGZjb3JlLmgKaW5kZXggOTYzMWRkZC4uNWNhNTRkNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9lbGZjb3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9lbGZjb3JlLmgKQEAgLTQsNyArNCw5IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KKyNlbmRpZgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogCiBzdHJ1Y3QgZWxmX3NpZ2luZm8KQEAgLTE0LDcgKzE2LDkgQEAKIAlpbnQJc2lfZXJybm87CQkJLyogZXJybm8gKi8KIH07CiAKKyNpZmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSA8YXNtL2VsZi5oPgorI2VuZGlmCiAKICNpZm5kZWYgX19LRVJORUxfXwogdHlwZWRlZiBlbGZfZ3JlZ190IGdyZWdfdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZW5jbG9zdXJlLmggYi9pbmNsdWRlL2xpbnV4L2VuY2xvc3VyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OTc4ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2VuY2xvc3VyZS5oCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogRW5jbG9zdXJlIFNlcnZpY2VzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEphbWVzIEJvdHRvbWxleSA8SmFtZXMuQm90dG9tbGV5QEhhbnNlblBhcnRuZXJzaGlwLmNvbT4KKyAqCisqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKgorKiogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyoqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiogIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyoqCisqKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoqCisqKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisjaWZuZGVmIF9MSU5VWF9FTkNMT1NVUkVfSF8KKyNkZWZpbmUgX0xJTlVYX0VOQ0xPU1VSRV9IXworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisvKiBBIGZldyBnZW5lcmljIHR5cGVzIC4uLiB0YWtlbiBmcm9tIHNlcy0yICovCitlbnVtIGVuY2xvc3VyZV9jb21wb25lbnRfdHlwZSB7CisJRU5DTE9TVVJFX0NPTVBPTkVOVF9ERVZJQ0UgPSAweDAxLAorCUVOQ0xPU1VSRV9DT01QT05FTlRfQVJSQVlfREVWSUNFID0gMHgxNywKK307CisKKy8qIHNlcy0yIGNvbW1vbiBlbGVtZW50IHN0YXR1cyAqLworZW51bSBlbmNsb3N1cmVfc3RhdHVzIHsKKwlFTkNMT1NVUkVfU1RBVFVTX1VOU1VQUE9SVEVEID0gMCwKKwlFTkNMT1NVUkVfU1RBVFVTX09LLAorCUVOQ0xPU1VSRV9TVEFUVVNfQ1JJVElDQUwsCisJRU5DTE9TVVJFX1NUQVRVU19OT05fQ1JJVElDQUwsCisJRU5DTE9TVVJFX1NUQVRVU19VTlJFQ09WRVJBQkxFLAorCUVOQ0xPU1VSRV9TVEFUVVNfTk9UX0lOU1RBTExFRCwKKwlFTkNMT1NVUkVfU1RBVFVTX1VOS05PV04sCisJRU5DTE9TVVJFX1NUQVRVU19VTkFWQUlMQUJMRSwKK307CisKKy8qIFNGRi04NDg1IGFjdGl2aXR5IGxpZ2h0IHNldHRpbmdzICovCitlbnVtIGVuY2xvc3VyZV9jb21wb25lbnRfc2V0dGluZyB7CisJRU5DTE9TVVJFX1NFVFRJTkdfRElTQUJMRUQgPSAwLAorCUVOQ0xPU1VSRV9TRVRUSU5HX0VOQUJMRUQgPSAxLAorCUVOQ0xPU1VSRV9TRVRUSU5HX0JMSU5LX0FfT05fT0ZGID0gMiwKKwlFTkNMT1NVUkVfU0VUVElOR19CTElOS19BX09GRl9PTiA9IDMsCisJRU5DTE9TVVJFX1NFVFRJTkdfQkxJTktfQl9PTl9PRkYgPSA2LAorCUVOQ0xPU1VSRV9TRVRUSU5HX0JMSU5LX0JfT0ZGX09OID0gNywKK307CisKK3N0cnVjdCBlbmNsb3N1cmVfZGV2aWNlOworc3RydWN0IGVuY2xvc3VyZV9jb21wb25lbnQ7CitzdHJ1Y3QgZW5jbG9zdXJlX2NvbXBvbmVudF9jYWxsYmFja3MgeworCXZvaWQgKCpnZXRfc3RhdHVzKShzdHJ1Y3QgZW5jbG9zdXJlX2RldmljZSAqLAorCQkJICAgICBzdHJ1Y3QgZW5jbG9zdXJlX2NvbXBvbmVudCAqKTsKKwlpbnQgKCpzZXRfc3RhdHVzKShzdHJ1Y3QgZW5jbG9zdXJlX2RldmljZSAqLAorCQkJICBzdHJ1Y3QgZW5jbG9zdXJlX2NvbXBvbmVudCAqLAorCQkJICBlbnVtIGVuY2xvc3VyZV9zdGF0dXMpOworCXZvaWQgKCpnZXRfZmF1bHQpKHN0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICosCisJCQkgIHN0cnVjdCBlbmNsb3N1cmVfY29tcG9uZW50ICopOworCWludCAoKnNldF9mYXVsdCkoc3RydWN0IGVuY2xvc3VyZV9kZXZpY2UgKiwKKwkJCSBzdHJ1Y3QgZW5jbG9zdXJlX2NvbXBvbmVudCAqLAorCQkJIGVudW0gZW5jbG9zdXJlX2NvbXBvbmVudF9zZXR0aW5nKTsKKwl2b2lkICgqZ2V0X2FjdGl2ZSkoc3RydWN0IGVuY2xvc3VyZV9kZXZpY2UgKiwKKwkJCSAgIHN0cnVjdCBlbmNsb3N1cmVfY29tcG9uZW50ICopOworCWludCAoKnNldF9hY3RpdmUpKHN0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICosCisJCQkgIHN0cnVjdCBlbmNsb3N1cmVfY29tcG9uZW50ICosCisJCQkgIGVudW0gZW5jbG9zdXJlX2NvbXBvbmVudF9zZXR0aW5nKTsKKwl2b2lkICgqZ2V0X2xvY2F0ZSkoc3RydWN0IGVuY2xvc3VyZV9kZXZpY2UgKiwKKwkJCSAgIHN0cnVjdCBlbmNsb3N1cmVfY29tcG9uZW50ICopOworCWludCAoKnNldF9sb2NhdGUpKHN0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICosCisJCQkgIHN0cnVjdCBlbmNsb3N1cmVfY29tcG9uZW50ICosCisJCQkgIGVudW0gZW5jbG9zdXJlX2NvbXBvbmVudF9zZXR0aW5nKTsKK307CisKKworc3RydWN0IGVuY2xvc3VyZV9jb21wb25lbnQgeworCXZvaWQgKnNjcmF0Y2g7CisJc3RydWN0IGNsYXNzX2RldmljZSBjZGV2OworCWVudW0gZW5jbG9zdXJlX2NvbXBvbmVudF90eXBlIHR5cGU7CisJaW50IG51bWJlcjsKKwlpbnQgZmF1bHQ7CisJaW50IGFjdGl2ZTsKKwlpbnQgbG9jYXRlOworCWVudW0gZW5jbG9zdXJlX3N0YXR1cyBzdGF0dXM7Cit9OworCitzdHJ1Y3QgZW5jbG9zdXJlX2RldmljZSB7CisJdm9pZCAqc2NyYXRjaDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisJc3RydWN0IGNsYXNzX2RldmljZSBjZGV2OworCXN0cnVjdCBlbmNsb3N1cmVfY29tcG9uZW50X2NhbGxiYWNrcyAqY2I7CisJaW50IGNvbXBvbmVudHM7CisJc3RydWN0IGVuY2xvc3VyZV9jb21wb25lbnQgY29tcG9uZW50WzBdOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZW5jbG9zdXJlX2RldmljZSAqCit0b19lbmNsb3N1cmVfZGV2aWNlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGVuY2xvc3VyZV9kZXZpY2UsIGNkZXYpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBlbmNsb3N1cmVfY29tcG9uZW50ICoKK3RvX2VuY2xvc3VyZV9jb21wb25lbnQoc3RydWN0IGNsYXNzX2RldmljZSAqZGV2KQoreworCXJldHVybiBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgZW5jbG9zdXJlX2NvbXBvbmVudCwgY2Rldik7Cit9CisKK3N0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICoKK2VuY2xvc3VyZV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICosIGNvbnN0IGNoYXIgKiwgaW50LAorCQkgICBzdHJ1Y3QgZW5jbG9zdXJlX2NvbXBvbmVudF9jYWxsYmFja3MgKik7Cit2b2lkIGVuY2xvc3VyZV91bnJlZ2lzdGVyKHN0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICopOworc3RydWN0IGVuY2xvc3VyZV9jb21wb25lbnQgKgorZW5jbG9zdXJlX2NvbXBvbmVudF9yZWdpc3RlcihzdHJ1Y3QgZW5jbG9zdXJlX2RldmljZSAqLCB1bnNpZ25lZCBpbnQsCisJCQkJIGVudW0gZW5jbG9zdXJlX2NvbXBvbmVudF90eXBlLCBjb25zdCBjaGFyICopOworaW50IGVuY2xvc3VyZV9hZGRfZGV2aWNlKHN0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICplbmNsb3N1cmUsIGludCBjb21wb25lbnQsCisJCQkgc3RydWN0IGRldmljZSAqZGV2KTsKK2ludCBlbmNsb3N1cmVfcmVtb3ZlX2RldmljZShzdHJ1Y3QgZW5jbG9zdXJlX2RldmljZSAqZW5jbG9zdXJlLCBpbnQgY29tcG9uZW50KTsKK3N0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICplbmNsb3N1cmVfZmluZChzdHJ1Y3QgZGV2aWNlICpkZXYpOworaW50IGVuY2xvc3VyZV9mb3JfZWFjaF9kZXZpY2UoaW50ICgqZm4pKHN0cnVjdCBlbmNsb3N1cmVfZGV2aWNlICosIHZvaWQgKiksCisJCQkgICAgICB2b2lkICpkYXRhKTsKKworI2VuZGlmIC8qIF9MSU5VWF9FTkNMT1NVUkVfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXJyLmggYi9pbmNsdWRlL2xpbnV4L2Vyci5oCmluZGV4IDFhYjFkNDQuLmVjODdmMzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXJyLmgKKysrIGIvaW5jbHVkZS9saW51eC9lcnIuaApAQCAtMzQsNiArMzQsMTkgQEAKIAlyZXR1cm4gSVNfRVJSX1ZBTFVFKCh1bnNpZ25lZCBsb25nKXB0cik7CiB9CiAKKy8qKgorICogRVJSX0NBU1QgLSBFeHBsaWNpdGx5IGNhc3QgYW4gZXJyb3ItdmFsdWVkIHBvaW50ZXIgdG8gYW5vdGhlciBwb2ludGVyIHR5cGUKKyAqIEBwdHI6IFRoZSBwb2ludGVyIHRvIGNhc3QuCisgKgorICogRXhwbGljaXRseSBjYXN0IGFuIGVycm9yLXZhbHVlZCBwb2ludGVyIHRvIGFub3RoZXIgcG9pbnRlciB0eXBlIGluIHN1Y2ggYQorICogd2F5IGFzIHRvIG1ha2UgaXQgY2xlYXIgdGhhdCdzIHdoYXQncyBnb2luZyBvbi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICpFUlJfQ0FTVChjb25zdCB2b2lkICpwdHIpCit7CisJLyogY2FzdCBhd2F5IHRoZSBjb25zdCAqLworCXJldHVybiAodm9pZCAqKSBwdHI7Cit9CisKICNlbmRpZgogCiAjZW5kaWYgLyogX0xJTlVYX0VSUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaCBiL2luY2x1ZGUvbGludXgvZXh0M19mcy5oCmluZGV4IDI0MWMwMWMuLjM2YzU0MDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0M19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0M19mcy5oCkBAIC04MjMsNyArODIzLDcgQEAKIAlzZWN0b3JfdCBpYmxvY2ssIHVuc2lnbmVkIGxvbmcgbWF4YmxvY2tzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwKIAlpbnQgY3JlYXRlLCBpbnQgZXh0ZW5kX2Rpc2tzaXplKTsKIAotZXh0ZXJuIHZvaWQgZXh0M19yZWFkX2lub2RlIChzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gc3RydWN0IGlub2RlICpleHQzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIGludCAgZXh0M193cml0ZV9pbm9kZSAoc3RydWN0IGlub2RlICosIGludCk7CiBleHRlcm4gaW50ICBleHQzX3NldGF0dHIgKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGlhdHRyICopOwogZXh0ZXJuIHZvaWQgZXh0M19kZWxldGVfaW5vZGUgKHN0cnVjdCBpbm9kZSAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0NF9mcy5oIGIvaW5jbHVkZS9saW51eC9leHQ0X2ZzLmgKaW5kZXggMTg1MjMxMy4uYzRmNjM1YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHQ0X2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9leHQ0X2ZzLmgKQEAgLTEwMjQsNyArMTAyNCw3IEBACiAJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsCiAJCQkJaW50IGNyZWF0ZSwgaW50IGV4dGVuZF9kaXNrc2l6ZSk7CiAKLWV4dGVybiB2b2lkIGV4dDRfcmVhZF9pbm9kZSAoc3RydWN0IGlub2RlICopOworZXh0ZXJuIHN0cnVjdCBpbm9kZSAqZXh0NF9pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1bnNpZ25lZCBsb25nKTsKIGV4dGVybiBpbnQgIGV4dDRfd3JpdGVfaW5vZGUgKHN0cnVjdCBpbm9kZSAqLCBpbnQpOwogZXh0ZXJuIGludCAgZXh0NF9zZXRhdHRyIChzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBpYXR0ciAqKTsKIGV4dGVybiB2b2lkIGV4dDRfZGVsZXRlX2lub2RlIChzdHJ1Y3QgaW5vZGUgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzLmggYi9pbmNsdWRlL2xpbnV4L2ZzLmgKaW5kZXggMTA5NzM0Yi4uMThjZmJmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZnMuaApAQCAtMTAzOCw2ICsxMDM4LDEyIEBACiAJICogaW4gL3Byb2MvbW91bnRzIHdpbGwgYmUgInR5cGUuc3VidHlwZSIKIAkgKi8KIAljaGFyICpzX3N1YnR5cGU7CisKKwkvKgorCSAqIFNhdmVkIG1vdW50IG9wdGlvbnMgZm9yIGxhenkgZmlsZXN5c3RlbXMgdXNpbmcKKwkgKiBnZW5lcmljX3Nob3dfb3B0aW9ucygpCisJICovCisJY2hhciAqc19vcHRpb25zOwogfTsKIAogZXh0ZXJuIHN0cnVjdCB0aW1lc3BlYyBjdXJyZW50X2ZzX3RpbWUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CkBAIC0xMjQxLDggKzEyNDcsNiBAQAogICAgCXN0cnVjdCBpbm9kZSAqKCphbGxvY19pbm9kZSkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiAJdm9pZCAoKmRlc3Ryb3lfaW5vZGUpKHN0cnVjdCBpbm9kZSAqKTsKIAotCXZvaWQgKCpyZWFkX2lub2RlKSAoc3RydWN0IGlub2RlICopOwotICAKICAgIAl2b2lkICgqZGlydHlfaW5vZGUpIChzdHJ1Y3QgaW5vZGUgKik7CiAJaW50ICgqd3JpdGVfaW5vZGUpIChzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKIAl2b2lkICgqcHV0X2lub2RlKSAoc3RydWN0IGlub2RlICopOwpAQCAtMTYyMCw3ICsxNjI0LDYgQEAKIAkJCSAgIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKik7CiBleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX2NocmRldih1bnNpZ25lZCBpbnQsIGNvbnN0IGNoYXIgKik7CiBleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2X3QsIHVuc2lnbmVkKTsKLWV4dGVybiBpbnQgY2hyZGV2X29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwogZXh0ZXJuIHZvaWQgY2hyZGV2X3Nob3coc3RydWN0IHNlcV9maWxlICosb2ZmX3QpOwogCiAvKiBmcy9ibG9ja19kZXYuYyAqLwpAQCAtMTc2NywxOSArMTc3MCw4IEBACiBleHRlcm4gc3RydWN0IGlub2RlICogaWdldF9sb2NrZWQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIHZvaWQgdW5sb2NrX25ld19pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGlub2RlICppZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgaW5vKQotewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBpZ2V0X2xvY2tlZChzYiwgaW5vKTsKLQkKLQlpZiAoaW5vZGUgJiYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpKSB7Ci0JCXNiLT5zX29wLT5yZWFkX2lub2RlKGlub2RlKTsKLQkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7Ci0JfQotCi0JcmV0dXJuIGlub2RlOwotfQotCiBleHRlcm4gdm9pZCBfX2lnZXQoc3RydWN0IGlub2RlICogaW5vZGUpOworZXh0ZXJuIHZvaWQgaWdldF9mYWlsZWQoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIHZvaWQgY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIHZvaWQgZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gc3RydWN0IGlub2RlICpuZXdfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICopOwpAQCAtMTgyMCw5ICsxODEyLDYgQEAKIAkJdW5zaWduZWQgbG9uZywgbG9mZl90LCBsb2ZmX3QgKiwgc2l6ZV90LCBzc2l6ZV90KTsKIGV4dGVybiBzc2l6ZV90IGRvX3N5bmNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKTsKIGV4dGVybiBzc2l6ZV90IGRvX3N5bmNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcyk7Ci1leHRlcm4gdm9pZCBkb19nZW5lcmljX21hcHBpbmdfcmVhZChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKLQkJCQkgICAgc3RydWN0IGZpbGVfcmFfc3RhdGUgKiwgc3RydWN0IGZpbGUgKiwKLQkJCQkgICAgbG9mZl90ICosIHJlYWRfZGVzY3JpcHRvcl90ICosIHJlYWRfYWN0b3JfdCk7CiBleHRlcm4gaW50IGdlbmVyaWNfc2VnbWVudF9jaGVja3MoY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCiAJCXVuc2lnbmVkIGxvbmcgKm5yX3NlZ3MsIHNpemVfdCAqY291bnQsIGludCBhY2Nlc3NfZmxhZ3MpOwogCkBAIC0xODYwLDE4ICsxODQ5LDYgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW5saW5lIHZvaWQgZG9fZ2VuZXJpY19maWxlX3JlYWQoc3RydWN0IGZpbGUgKiBmaWxwLCBsb2ZmX3QgKnBwb3MsCi0JCQkJCXJlYWRfZGVzY3JpcHRvcl90ICogZGVzYywKLQkJCQkJcmVhZF9hY3Rvcl90IGFjdG9yKQotewotCWRvX2dlbmVyaWNfbWFwcGluZ19yZWFkKGZpbHAtPmZfbWFwcGluZywKLQkJCQkmZmlscC0+Zl9yYSwKLQkJCQlmaWxwLAotCQkJCXBwb3MsCi0JCQkJZGVzYywKLQkJCQlhY3Rvcik7Ci19Ci0KICNpZmRlZiBDT05GSUdfQkxPQ0sKIHNzaXplX3QgX19ibG9ja2Rldl9kaXJlY3RfSU8oaW50IHJ3LCBzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGxvZmZfdCBvZmZzZXQsCkBAIC0xOTQxLDcgKzE5MTgsOSBAQAogZXh0ZXJuIGludCB2ZnNfbHN0YXRfZmQoaW50IGRmZCwgY2hhciBfX3VzZXIgKiwgc3RydWN0IGtzdGF0ICopOwogZXh0ZXJuIGludCB2ZnNfZnN0YXQodW5zaWduZWQgaW50LCBzdHJ1Y3Qga3N0YXQgKik7CiAKLWV4dGVybiBpbnQgdmZzX2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiBsb25nIHZmc19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIGludCBkb192ZnNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwKKwkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKIAogZXh0ZXJuIHZvaWQgZ2V0X2ZpbGVzeXN0ZW0oc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzKTsKIGV4dGVybiB2b2lkIHB1dF9maWxlc3lzdGVtKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmcyk7CkBAIC0xOTk2LDYgKzE5NzUsOSBAQAogCiBleHRlcm4gdm9pZCBmaWxlX3VwZGF0ZV90aW1lKHN0cnVjdCBmaWxlICpmaWxlKTsKIAorZXh0ZXJuIGludCBnZW5lcmljX3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB2ZnNtb3VudCAqbW50KTsKK2V4dGVybiB2b2lkIHNhdmVfbW91bnRfb3B0aW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjaGFyICpvcHRpb25zKTsKKwogc3RhdGljIGlubGluZSBpbm9fdCBwYXJlbnRfaW5vKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlpbm9fdCByZXM7CkBAIC0yMDY3LDcgKzIwNDksNyBAQAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgX19mb3BzID0gewkJCQlcCiAJLm93bmVyCSA9IFRISVNfTU9EVUxFLAkJCQkJCVwKIAkub3BlbgkgPSBfX2ZvcHMgIyMgX29wZW4sCQkJCQlcCi0JLnJlbGVhc2UgPSBzaW1wbGVfYXR0cl9jbG9zZSwJCQkJCVwKKwkucmVsZWFzZSA9IHNpbXBsZV9hdHRyX3JlbGVhc2UsCQkJCQlcCiAJLnJlYWQJID0gc2ltcGxlX2F0dHJfcmVhZCwJCQkJCVwKIAkud3JpdGUJID0gc2ltcGxlX2F0dHJfd3JpdGUsCQkJCQlcCiB9OwpAQCAtMjA3OSw5ICsyMDYxLDkgQEAKIH0KIAogaW50IHNpbXBsZV9hdHRyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCSAgICAgdTY0ICgqZ2V0KSh2b2lkICopLCB2b2lkICgqc2V0KSh2b2lkICosIHU2NCksCisJCSAgICAgaW50ICgqZ2V0KSh2b2lkICosIHU2NCAqKSwgaW50ICgqc2V0KSh2b2lkICosIHU2NCksCiAJCSAgICAgY29uc3QgY2hhciAqZm10KTsKLWludCBzaW1wbGVfYXR0cl9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitpbnQgc2ltcGxlX2F0dHJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzc2l6ZV90IHNpbXBsZV9hdHRyX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCiAJCQkgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKTsKIHNzaXplX3Qgc2ltcGxlX2F0dHJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dlbmhkLmggYi9pbmNsdWRlL2xpbnV4L2dlbmhkLmgKaW5kZXggMWRiZWEwYS4uMDlhM2IxOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9nZW5oZC5oCisrKyBiL2luY2x1ZGUvbGludXgvZ2VuaGQuaApAQCAtOTEsMTYgKzkxLDMxIEBACiAJX19sZTMyIG5yX3NlY3RzOwkJLyogbnIgb2Ygc2VjdG9ycyBpbiBwYXJ0aXRpb24gKi8KIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKK3N0cnVjdCBkaXNrX3N0YXRzIHsKKwl1bnNpZ25lZCBsb25nIHNlY3RvcnNbMl07CS8qIFJFQURzIGFuZCBXUklURXMgKi8KKwl1bnNpZ25lZCBsb25nIGlvc1syXTsKKwl1bnNpZ25lZCBsb25nIG1lcmdlc1syXTsKKwl1bnNpZ25lZCBsb25nIHRpY2tzWzJdOworCXVuc2lnbmVkIGxvbmcgaW9fdGlja3M7CisJdW5zaWduZWQgbG9uZyB0aW1lX2luX3F1ZXVlOworfTsKKwkKIHN0cnVjdCBoZF9zdHJ1Y3QgewogCXNlY3Rvcl90IHN0YXJ0X3NlY3Q7CiAJc2VjdG9yX3QgbnJfc2VjdHM7CiAJc3RydWN0IGRldmljZSBkZXY7CiAJc3RydWN0IGtvYmplY3QgKmhvbGRlcl9kaXI7Ci0JdW5zaWduZWQgaW9zWzJdLCBzZWN0b3JzWzJdOwkvKiBSRUFEcyBhbmQgV1JJVEVzICovCiAJaW50IHBvbGljeSwgcGFydG5vOwogI2lmZGVmIENPTkZJR19GQUlMX01BS0VfUkVRVUVTVAogCWludCBtYWtlX2l0X2ZhaWw7CiAjZW5kaWYKKwl1bnNpZ25lZCBsb25nIHN0YW1wOworCWludCBpbl9mbGlnaHQ7CisjaWZkZWYJQ09ORklHX1NNUAorCXN0cnVjdCBkaXNrX3N0YXRzICpka3N0YXRzOworI2Vsc2UKKwlzdHJ1Y3QgZGlza19zdGF0cyBka3N0YXRzOworI2VuZGlmCiB9OwogCiAjZGVmaW5lIEdFTkhEX0ZMX1JFTU9WQUJMRQkJCTEKQEAgLTExMSwxNSArMTI2LDcgQEAKICNkZWZpbmUgR0VOSERfRkxfU1VQUFJFU1NfUEFSVElUSU9OX0lORk8JMzIKICNkZWZpbmUgR0VOSERfRkxfRkFJTAkJCQk2NAogCi1zdHJ1Y3QgZGlza19zdGF0cyB7Ci0JdW5zaWduZWQgbG9uZyBzZWN0b3JzWzJdOwkvKiBSRUFEcyBhbmQgV1JJVEVzICovCi0JdW5zaWduZWQgbG9uZyBpb3NbMl07Ci0JdW5zaWduZWQgbG9uZyBtZXJnZXNbMl07Ci0JdW5zaWduZWQgbG9uZyB0aWNrc1syXTsKLQl1bnNpZ25lZCBsb25nIGlvX3RpY2tzOwotCXVuc2lnbmVkIGxvbmcgdGltZV9pbl9xdWV1ZTsKLX07Ci0JCisKIHN0cnVjdCBnZW5kaXNrIHsKIAlpbnQgbWFqb3I7CQkJLyogbWFqb3IgbnVtYmVyIG9mIGRyaXZlciAqLwogCWludCBmaXJzdF9taW5vcjsKQEAgLTE1OCw2ICsxNjUsMjAgQEAKICAqIFRoZSBfXyB2YXJpYW50cyBzaG91bGQgb25seSBiZSBjYWxsZWQgaW4gY3JpdGljYWwgc2VjdGlvbnMuIFRoZSBmdWxsCiAgKiB2YXJpYW50cyBkaXNhYmxlL2VuYWJsZSBwcmVlbXB0aW9uLgogICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBoZF9zdHJ1Y3QgKmdldF9wYXJ0KHN0cnVjdCBnZW5kaXNrICpnZW5kaXNrcCwKKwkJCQkJIHNlY3Rvcl90IHNlY3RvcikKK3sKKwlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0OworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBnZW5kaXNrcC0+bWlub3JzIC0gMTsgaSsrKSB7CisJCXBhcnQgPSBnZW5kaXNrcC0+cGFydFtpXTsKKwkJaWYgKHBhcnQgJiYgcGFydC0+c3RhcnRfc2VjdCA8PSBzZWN0b3IKKwkJICAgICYmIHNlY3RvciA8IHBhcnQtPnN0YXJ0X3NlY3QgKyBwYXJ0LT5ucl9zZWN0cykKKwkJCXJldHVybiBwYXJ0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKwogI2lmZGVmCUNPTkZJR19TTVAKICNkZWZpbmUgX19kaXNrX3N0YXRfYWRkKGdlbmRpc2twLCBmaWVsZCwgYWRkbmQpIAlcCiAJKHBlcl9jcHVfcHRyKGdlbmRpc2twLT5ka3N0YXRzLCBzbXBfcHJvY2Vzc29yX2lkKCkpLT5maWVsZCArPSBhZGRuZCkKQEAgLTE3NywxNSArMTk4LDYyIEBACiAJCW1lbXNldChwZXJfY3B1X3B0cihnZW5kaXNrcC0+ZGtzdGF0cywgaSksIHZhbHVlLAogCQkJCXNpemVvZiAoc3RydWN0IGRpc2tfc3RhdHMpKTsKIH0JCQorCisjZGVmaW5lIF9fcGFydF9zdGF0X2FkZChwYXJ0LCBmaWVsZCwgYWRkbmQpCQkJCVwKKwkocGVyX2NwdV9wdHIocGFydC0+ZGtzdGF0cywgc21wX3Byb2Nlc3Nvcl9pZCgpKS0+ZmllbGQgKz0gYWRkbmQpCisKKyNkZWZpbmUgX19hbGxfc3RhdF9hZGQoZ2VuZGlza3AsIGZpZWxkLCBhZGRuZCwgc2VjdG9yKQkJXAorKHsJCQkJCQkJCVwKKwlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0ID0gZ2V0X3BhcnQoZ2VuZGlza3AsIHNlY3Rvcik7CVwKKwlpZiAocGFydCkJCQkJCQlcCisJCV9fcGFydF9zdGF0X2FkZChwYXJ0LCBmaWVsZCwgYWRkbmQpOwkJXAorCV9fZGlza19zdGF0X2FkZChnZW5kaXNrcCwgZmllbGQsIGFkZG5kKTsJCVwKK30pCisKKyNkZWZpbmUgcGFydF9zdGF0X3JlYWQocGFydCwgZmllbGQpCQkJCQlcCisoewkJCQkJCQkJCVwKKwl0eXBlb2YocGFydC0+ZGtzdGF0cy0+ZmllbGQpIHJlcyA9IDA7CQkJCVwKKwlpbnQgaTsJCQkJCQkJCVwKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkJCQkJCVwKKwkJcmVzICs9IHBlcl9jcHVfcHRyKHBhcnQtPmRrc3RhdHMsIGkpLT5maWVsZDsJCVwKKwlyZXM7CQkJCQkJCQlcCit9KQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGFydF9zdGF0X3NldF9hbGwoc3RydWN0IGhkX3N0cnVjdCAqcGFydCwgaW50IHZhbHVlKQl7CisJaW50IGk7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpCisJCW1lbXNldChwZXJfY3B1X3B0cihwYXJ0LT5ka3N0YXRzLCBpKSwgdmFsdWUsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGRpc2tfc3RhdHMpKTsKK30KIAkJCQkKICNlbHNlCiAjZGVmaW5lIF9fZGlza19zdGF0X2FkZChnZW5kaXNrcCwgZmllbGQsIGFkZG5kKSBcCiAJCQkJKGdlbmRpc2twLT5ka3N0YXRzLmZpZWxkICs9IGFkZG5kKQogI2RlZmluZSBkaXNrX3N0YXRfcmVhZChnZW5kaXNrcCwgZmllbGQpCShnZW5kaXNrcC0+ZGtzdGF0cy5maWVsZCkKIAotc3RhdGljIGlubGluZSB2b2lkIGRpc2tfc3RhdF9zZXRfYWxsKHN0cnVjdCBnZW5kaXNrICpnZW5kaXNrcCwgaW50IHZhbHVlKQl7CitzdGF0aWMgaW5saW5lIHZvaWQgZGlza19zdGF0X3NldF9hbGwoc3RydWN0IGdlbmRpc2sgKmdlbmRpc2twLCBpbnQgdmFsdWUpCit7CiAJbWVtc2V0KCZnZW5kaXNrcC0+ZGtzdGF0cywgdmFsdWUsIHNpemVvZiAoc3RydWN0IGRpc2tfc3RhdHMpKTsKIH0KKworI2RlZmluZSBfX3BhcnRfc3RhdF9hZGQocGFydCwgZmllbGQsIGFkZG5kKSBcCisJKHBhcnQtPmRrc3RhdHMuZmllbGQgKz0gYWRkbmQpCisKKyNkZWZpbmUgX19hbGxfc3RhdF9hZGQoZ2VuZGlza3AsIGZpZWxkLCBhZGRuZCwgc2VjdG9yKQkJXAorKHsJCQkJCQkJCVwKKwlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0ID0gZ2V0X3BhcnQoZ2VuZGlza3AsIHNlY3Rvcik7CVwKKwlpZiAocGFydCkJCQkJCQlcCisJCXBhcnQtPmRrc3RhdHMuZmllbGQgKz0gYWRkbmQ7CQkJXAorCV9fZGlza19zdGF0X2FkZChnZW5kaXNrcCwgZmllbGQsIGFkZG5kKTsJCVwKK30pCisKKyNkZWZpbmUgcGFydF9zdGF0X3JlYWQocGFydCwgZmllbGQpCShwYXJ0LT5ka3N0YXRzLmZpZWxkKQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGFydF9zdGF0X3NldF9hbGwoc3RydWN0IGhkX3N0cnVjdCAqcGFydCwgaW50IHZhbHVlKQoreworCW1lbXNldCgmcGFydC0+ZGtzdGF0cywgdmFsdWUsIHNpemVvZihzdHJ1Y3QgZGlza19zdGF0cykpOworfQorCiAjZW5kaWYKIAogI2RlZmluZSBkaXNrX3N0YXRfYWRkKGdlbmRpc2twLCBmaWVsZCwgYWRkbmQpCQkJXApAQCAtMjA2LDYgKzI3NCw0NSBAQAogI2RlZmluZSBkaXNrX3N0YXRfc3ViKGdlbmRpc2twLCBmaWVsZCwgc3VibmQpIFwKIAkJZGlza19zdGF0X2FkZChnZW5kaXNrcCwgZmllbGQsIC1zdWJuZCkKIAorI2RlZmluZSBwYXJ0X3N0YXRfYWRkKGdlbmRpc2twLCBmaWVsZCwgYWRkbmQpCQlcCisJZG8gewkJCQkJCVwKKwkJcHJlZW1wdF9kaXNhYmxlKCk7CQkJXAorCQlfX3BhcnRfc3RhdF9hZGQoZ2VuZGlza3AsIGZpZWxkLCBhZGRuZCk7XAorCQlwcmVlbXB0X2VuYWJsZSgpOwkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIF9fcGFydF9zdGF0X2RlYyhnZW5kaXNrcCwgZmllbGQpIF9fcGFydF9zdGF0X2FkZChnZW5kaXNrcCwgZmllbGQsIC0xKQorI2RlZmluZSBwYXJ0X3N0YXRfZGVjKGdlbmRpc2twLCBmaWVsZCkgcGFydF9zdGF0X2FkZChnZW5kaXNrcCwgZmllbGQsIC0xKQorCisjZGVmaW5lIF9fcGFydF9zdGF0X2luYyhnZW5kaXNrcCwgZmllbGQpIF9fcGFydF9zdGF0X2FkZChnZW5kaXNrcCwgZmllbGQsIDEpCisjZGVmaW5lIHBhcnRfc3RhdF9pbmMoZ2VuZGlza3AsIGZpZWxkKSBwYXJ0X3N0YXRfYWRkKGdlbmRpc2twLCBmaWVsZCwgMSkKKworI2RlZmluZSBfX3BhcnRfc3RhdF9zdWIoZ2VuZGlza3AsIGZpZWxkLCBzdWJuZCkgXAorCQlfX3BhcnRfc3RhdF9hZGQoZ2VuZGlza3AsIGZpZWxkLCAtc3VibmQpCisjZGVmaW5lIHBhcnRfc3RhdF9zdWIoZ2VuZGlza3AsIGZpZWxkLCBzdWJuZCkgXAorCQlwYXJ0X3N0YXRfYWRkKGdlbmRpc2twLCBmaWVsZCwgLXN1Ym5kKQorCisjZGVmaW5lIGFsbF9zdGF0X2FkZChnZW5kaXNrcCwgZmllbGQsIGFkZG5kLCBzZWN0b3IpCQlcCisJZG8gewkJCQkJCQlcCisJCXByZWVtcHRfZGlzYWJsZSgpOwkJCQlcCisJCV9fYWxsX3N0YXRfYWRkKGdlbmRpc2twLCBmaWVsZCwgYWRkbmQsIHNlY3Rvcik7CVwKKwkJcHJlZW1wdF9lbmFibGUoKTsJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19hbGxfc3RhdF9kZWMoZ2VuZGlza3AsIGZpZWxkLCBzZWN0b3IpIFwKKwkJX19hbGxfc3RhdF9hZGQoZ2VuZGlza3AsIGZpZWxkLCAtMSwgc2VjdG9yKQorI2RlZmluZSBhbGxfc3RhdF9kZWMoZ2VuZGlza3AsIGZpZWxkLCBzZWN0b3IpIFwKKwkJYWxsX3N0YXRfYWRkKGdlbmRpc2twLCBmaWVsZCwgLTEsIHNlY3RvcikKKworI2RlZmluZSBfX2FsbF9zdGF0X2luYyhnZW5kaXNrcCwgZmllbGQsIHNlY3RvcikgXAorCQlfX2FsbF9zdGF0X2FkZChnZW5kaXNrcCwgZmllbGQsIDEsIHNlY3RvcikKKyNkZWZpbmUgYWxsX3N0YXRfaW5jKGdlbmRpc2twLCBmaWVsZCwgc2VjdG9yKSBcCisJCWFsbF9zdGF0X2FkZChnZW5kaXNrcCwgZmllbGQsIDEsIHNlY3RvcikKKworI2RlZmluZSBfX2FsbF9zdGF0X3N1YihnZW5kaXNrcCwgZmllbGQsIHN1Ym5kLCBzZWN0b3IpIFwKKwkJX19hbGxfc3RhdF9hZGQoZ2VuZGlza3AsIGZpZWxkLCAtc3VibmQsIHNlY3RvcikKKyNkZWZpbmUgYWxsX3N0YXRfc3ViKGdlbmRpc2twLCBmaWVsZCwgc3VibmQsIHNlY3RvcikgXAorCQlhbGxfc3RhdF9hZGQoZ2VuZGlza3AsIGZpZWxkLCAtc3VibmQsIHNlY3RvcikKIAogLyogSW5saW5lcyB0byBhbGxvYyBhbmQgZnJlZSBkaXNrIHN0YXRzIGluIHN0cnVjdCBnZW5kaXNrICovCiAjaWZkZWYgIENPTkZJR19TTVAKQEAgLTIyMSw2ICszMjgsMjAgQEAKIHsKIAlmcmVlX3BlcmNwdShkaXNrLT5ka3N0YXRzKTsKIH0KKworc3RhdGljIGlubGluZSBpbnQgaW5pdF9wYXJ0X3N0YXRzKHN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQpCit7CisJcGFydC0+ZGtzdGF0cyA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgZGlza19zdGF0cyk7CisJaWYgKCFwYXJ0LT5ka3N0YXRzKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfcGFydF9zdGF0cyhzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0KQoreworCWZyZWVfcGVyY3B1KHBhcnQtPmRrc3RhdHMpOworfQorCiAjZWxzZQkvKiBDT05GSUdfU01QICovCiBzdGF0aWMgaW5saW5lIGludCBpbml0X2Rpc2tfc3RhdHMoc3RydWN0IGdlbmRpc2sgKmRpc2spCiB7CkBAIC0yMzAsMTAgKzM1MSwyMCBAQAogc3RhdGljIGlubGluZSB2b2lkIGZyZWVfZGlza19zdGF0cyhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKIHsKIH0KKworc3RhdGljIGlubGluZSBpbnQgaW5pdF9wYXJ0X3N0YXRzKHN0cnVjdCBoZF9zdHJ1Y3QgKnBhcnQpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3BhcnRfc3RhdHMoc3RydWN0IGhkX3N0cnVjdCAqcGFydCkKK3sKK30KICNlbmRpZgkvKiBDT05GSUdfU01QICovCiAKIC8qIGRyaXZlcnMvYmxvY2svbGxfcndfYmxrLmMgKi8KIGV4dGVybiB2b2lkIGRpc2tfcm91bmRfc3RhdHMoc3RydWN0IGdlbmRpc2sgKmRpc2spOworZXh0ZXJuIHZvaWQgcGFydF9yb3VuZF9zdGF0cyhzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0KTsKIAogLyogZHJpdmVycy9ibG9jay9nZW5oZC5jICovCiBleHRlcm4gaW50IGdldF9ibGtkZXZfbGlzdChjaGFyICosIGludCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hheWVzZXNwLmggYi9pbmNsdWRlL2xpbnV4L2hheWVzZXNwLmgKaW5kZXggYjQzNmJlNy4uMjE3N2VlNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9oYXllc2VzcC5oCisrKyBiL2luY2x1ZGUvbGludXgvaGF5ZXNlc3AuaApAQCAtNzEsNyArNzEsNiBAQAogI2RlZmluZSBFU1BfU1RBVF9ORVZFUl9ETUEgICAgICAweDA4CiAjZGVmaW5lIEVTUF9TVEFUX1VTRV9QSU8gICAgICAgIDB4MTAKIAotI2RlZmluZSBFU1BfRVZFTlRfV1JJVEVfV0FLRVVQCTAKICNkZWZpbmUgRVNQX01BR0lDCQkweDUzZWUKICNkZWZpbmUgRVNQX1hNSVRfU0laRQkJNDA5NgogCkBAIC05Miw3ICs5MSw2IEBACiAJdW5zaWduZWQgc2hvcnQJCWNsb3Npbmdfd2FpdDI7CiAJaW50CQkJSUVSOyAJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLwogCWludAkJCU1DUjsgCS8qIE1vZGVtIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQl1bnNpZ25lZCBsb25nCQlldmVudDsKIAl1bnNpZ25lZCBsb25nCQlsYXN0X2FjdGl2ZTsKIAlpbnQJCQlsaW5lOwogCWludAkJCWNvdW50OwkgICAgLyogIyBvZiBmZCBvbiBkZXZpY2UgKi8KQEAgLTEwMSw4ICs5OSw2IEBACiAJaW50CQkJeG1pdF9oZWFkOwogCWludAkJCXhtaXRfdGFpbDsKIAlpbnQJCQl4bWl0X2NudDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJdHF1ZXVlOwotCXN0cnVjdCB3b3JrX3N0cnVjdAl0cXVldWVfaGFuZ3VwOwogCXdhaXRfcXVldWVfaGVhZF90CW9wZW5fd2FpdDsKIAl3YWl0X3F1ZXVlX2hlYWRfdAljbG9zZV93YWl0OwogCXdhaXRfcXVldWVfaGVhZF90CWRlbHRhX21zcl93YWl0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ocnRpbWVyLmggYi9pbmNsdWRlL2xpbnV4L2hydGltZXIuaAppbmRleCA4MzcxYjY2Li42MDBmYzNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2hydGltZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hydGltZXIuaApAQCAtNzgsNyArNzgsNyBAQAogICogYXMgb3RoZXJ3aXNlIHRoZSB0aW1lciBjb3VsZCBiZSByZW1vdmVkIGJlZm9yZSB0aGUgc29mdGlycSBjb2RlIGZpbmlzaGVzIHRoZQogICogdGhlIGhhbmRsaW5nIG9mIHRoZSB0aW1lci4KICAqCi0gKiBUaGUgSFJUSU1FUl9TVEFURV9FTlFVRVVFIGJpdCBpcyBhbHdheXMgb3InZWQgdG8gdGhlIGN1cnJlbnQgc3RhdGUgdG8KKyAqIFRoZSBIUlRJTUVSX1NUQVRFX0VOUVVFVUVEIGJpdCBpcyBhbHdheXMgb3InZWQgdG8gdGhlIGN1cnJlbnQgc3RhdGUgdG8KICAqIHByZXNlcnZlIHRoZSBIUlRJTUVSX1NUQVRFX0NBTExCQUNLIGJpdCBpbiB0aGUgYWJvdmUgc2NlbmFyaW8uCiAgKgogICogQWxsIHN0YXRlIHRyYW5zaXRpb25zIGFyZSBwcm90ZWN0ZWQgYnkgY3B1X2Jhc2UtPmxvY2suCkBAIC0yMjUsMTEgKzIyNSwxNCBAQAogICogaWRlYSBvZiB0aGUgKGluKWFjY3VyYWN5IG9mIHRpbWVycy4gVGltZXIgdmFsdWVzIGFyZSByb3VuZGVkIHVwIHRvCiAgKiB0aGlzIHJlc29sdXRpb24gdmFsdWVzLgogICovCi0jIGRlZmluZSBLVElNRV9ISUdIX1JFUwkJKGt0aW1lX3QpIHsgLnR2NjQgPSAxIH0KKyMgZGVmaW5lIEhJR0hfUkVTX05TRUMJCTEKKyMgZGVmaW5lIEtUSU1FX0hJR0hfUkVTCQkoa3RpbWVfdCkgeyAudHY2NCA9IEhJR0hfUkVTX05TRUMgfQorIyBkZWZpbmUgTU9OT1RPTklDX1JFU19OU0VDCUhJR0hfUkVTX05TRUMKICMgZGVmaW5lIEtUSU1FX01PTk9UT05JQ19SRVMJS1RJTUVfSElHSF9SRVMKIAogI2Vsc2UKIAorIyBkZWZpbmUgTU9OT1RPTklDX1JFU19OU0VDCUxPV19SRVNfTlNFQwogIyBkZWZpbmUgS1RJTUVfTU9OT1RPTklDX1JFUwlLVElNRV9MT1dfUkVTCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaCBiL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oCmluZGV4IDMwZDYwNmEuLjdjYTE5OGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oCisrKyBiL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oCkBAIC0xNyw2ICsxNyw3IEBACiB9CiAKIGludCBodWdldGxiX3N5c2N0bF9oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50LCBzdHJ1Y3QgZmlsZSAqLCB2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOworaW50IGh1Z2V0bGJfb3ZlcmNvbW1pdF9oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50LCBzdHJ1Y3QgZmlsZSAqLCB2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOwogaW50IGh1Z2V0bGJfdHJlYXRfbW92YWJsZV9oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50LCBzdHJ1Y3QgZmlsZSAqLCB2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOwogaW50IGNvcHlfaHVnZXRsYl9wYWdlX3JhbmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKiwgc3RydWN0IG1tX3N0cnVjdCAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7CiBpbnQgZm9sbG93X2h1Z2V0bGJfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqLCBzdHJ1Y3QgcGFnZSAqKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICoqLCB1bnNpZ25lZCBsb25nICosIGludCAqLCBpbnQsIGludCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy1pZC5oIGIvaW5jbHVkZS9saW51eC9pMmMtaWQuaAppbmRleCBmOTIyYjA2Li5iOTc5MTEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2kyYy1pZC5oCisrKyBiL2luY2x1ZGUvbGludXgvaTJjLWlkLmgKQEAgLTk2LDQyICs5Niw2IEBACiAKICNkZWZpbmUgSTJDX0RSSVZFUklEX0kyQ0RFVgk5MDAKIAotLyogSURzIC0tICAgVXNlIERSSVZFUklEcyAxMDAwLTE5OTkgZm9yIHNlbnNvcnMuCi0gICBUaGVzZSB3ZXJlIG9yaWdpbmFsbHkgaW4gc2Vuc29ycy5oIGluIHRoZSBsbV9zZW5zb3JzIHBhY2thZ2UgKi8KLSNkZWZpbmUgSTJDX0RSSVZFUklEX0xNNzggMTAwMgotI2RlZmluZSBJMkNfRFJJVkVSSURfTE03NSAxMDAzCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9HTDUxOCAxMDA0Ci0jZGVmaW5lIEkyQ19EUklWRVJJRF9FRVBST00gMTAwNQotI2RlZmluZSBJMkNfRFJJVkVSSURfVzgzNzgxRCAxMDA2Ci0jZGVmaW5lIEkyQ19EUklWRVJJRF9MTTgwIDEwMDcKLSNkZWZpbmUgSTJDX0RSSVZFUklEX0FETTEwMjEgMTAwOAotI2RlZmluZSBJMkNfRFJJVkVSSURfQURNOTI0MCAxMDA5Ci0jZGVmaW5lIEkyQ19EUklWRVJJRF9MVEMxNzEwIDEwMTAKLSNkZWZpbmUgSTJDX0RSSVZFUklEX0JUODY5IDEwMTMKLSNkZWZpbmUgSTJDX0RSSVZFUklEX01BWElMSUZFIDEwMTQKLSNkZWZpbmUgSTJDX0RSSVZFUklEX01BVE9SQiAxMDE1Ci0jZGVmaW5lIEkyQ19EUklWRVJJRF9HTDUyMCAxMDE2Ci0jZGVmaW5lIEkyQ19EUklWRVJJRF9USE1DNTAgMTAxNwotI2RlZmluZSBJMkNfRFJJVkVSSURfQURNMTAyNSAxMDIwCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9MTTg3IDEwMjEKLSNkZWZpbmUgSTJDX0RSSVZFUklEX1BDRjg1NzQgMTAyMgotI2RlZmluZSBJMkNfRFJJVkVSSURfTVRQMDA4IDEwMjMKLSNkZWZpbmUgSTJDX0RSSVZFUklEX0RTMTYyMSAxMDI0Ci0jZGVmaW5lIEkyQ19EUklWRVJJRF9BRE0xMDI0IDEwMjUKLSNkZWZpbmUgSTJDX0RSSVZFUklEX0NINzAwWCAxMDI3IC8qIHNpbmdsZSBkcml2ZXIgZm9yIENINzAwMy03MDA5IGRpZ2l0YWwgcGMgdG8gdHYgZW5jb2RlcnMgKi8KLSNkZWZpbmUgSTJDX0RSSVZFUklEX0ZTQ1BPUyAxMDI4Ci0jZGVmaW5lIEkyQ19EUklWRVJJRF9GU0NTQ1kgMTAyOQotI2RlZmluZSBJMkNfRFJJVkVSSURfUENGODU5MSAxMDMwCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9MTTkyIDEwMzMKLSNkZWZpbmUgSTJDX0RSSVZFUklEX1NNQVJUQkFUVCAxMDM1Ci0jZGVmaW5lIEkyQ19EUklWRVJJRF9CTUNTRU5TT1JTIDEwMzYKLSNkZWZpbmUgSTJDX0RSSVZFUklEX0ZTNDUxIDEwMzcKLSNkZWZpbmUgSTJDX0RSSVZFUklEX0xNODUgMTAzOQotI2RlZmluZSBJMkNfRFJJVkVSSURfTE04MyAxMDQwCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9MTTkwIDEwNDIKLSNkZWZpbmUgSTJDX0RSSVZFUklEX0FTQjEwMCAxMDQzCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9GU0NIRVIgMTA0NgotI2RlZmluZSBJMkNfRFJJVkVSSURfVzgzTDc4NVRTIDEwNDcKICNkZWZpbmUgSTJDX0RSSVZFUklEX09WNzY3MCAxMDQ4CS8qIE9tbml2aXNpb24gNzY3MCBjYW1lcmEgKi8KIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5wdXQuaCBiL2luY2x1ZGUvbGludXgvaW5wdXQuaAppbmRleCAwNTZhMTdhLi4xYmRjMzlhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lucHV0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbnB1dC5oCkBAIC0xMDIwLDcgKzEwMjAsNiBAQAogICogQGdvaW5nX2F3YXk6IG1hcmtzIGRldmljZXMgdGhhdCBhcmUgaW4gYSBtaWRkbGUgb2YgdW5yZWdpc3RlcmluZyBhbmQKICAqCWNhdXNlcyBpbnB1dF9vcGVuX2RldmljZSooKSBmYWlsIHdpdGggLUVOT0RFVi4KICAqIEBkZXY6IGRyaXZlciBtb2RlbCdzIHZpZXcgb2YgdGhpcyBkZXZpY2UKLSAqIEBjZGV2OiB1bmlvbiBmb3Igc3RydWN0IGRldmljZSBwb2ludGVyCiAgKiBAaF9saXN0OiBsaXN0IG9mIGlucHV0IGhhbmRsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXZpY2UuIFdoZW4KICAqCWFjY2Vzc2luZyB0aGUgbGlzdCBkZXYtPm11dGV4IG11c3QgYmUgaGVsZAogICogQG5vZGU6IHVzZWQgdG8gcGxhY2UgdGhlIGRldmljZSBvbnRvIGlucHV0X2Rldl9saXN0CkBAIC0xMDg1LDkgKzEwODQsNiBAQAogCWludCBnb2luZ19hd2F5OwogCiAJc3RydWN0IGRldmljZSBkZXY7Ci0JdW5pb24gewkJCS8qIHRlbXBvcmFyaWx5IHNvIHdoaWxlIHdlIHN3aXRjaGluZyB0byBzdHJ1Y3QgZGV2aWNlICovCi0JCXN0cnVjdCBkZXZpY2UgKmRldjsKLQl9IGNkZXY7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWhfbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CkBAIC0xMzExLDYgKzEzMDcsOSBAQAogCWRldi0+YWJzYml0W0JJVF9XT1JEKGF4aXMpXSB8PSBCSVRfTUFTSyhheGlzKTsKIH0KIAoraW50IGlucHV0X2dldF9rZXljb2RlKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgaW50IHNjYW5jb2RlLCBpbnQgKmtleWNvZGUpOworaW50IGlucHV0X3NldF9rZXljb2RlKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgaW50IHNjYW5jb2RlLCBpbnQga2V5Y29kZSk7CisKIGV4dGVybiBzdHJ1Y3QgY2xhc3MgaW5wdXRfY2xhc3M7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcGMuaCBiL2luY2x1ZGUvbGludXgvaXBjLmgKaW5kZXggNDA4Njk2ZS4uYjg4MjYxMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcGMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lwYy5oCkBAIC0xMDAsNTggKzEwMCw2IEBACiAJdm9pZAkJKnNlY3VyaXR5OwogfTsKIAotc3RydWN0IGlwY19pZHM7Ci1zdHJ1Y3QgaXBjX25hbWVzcGFjZSB7Ci0Jc3RydWN0IGtyZWYJa3JlZjsKLQlzdHJ1Y3QgaXBjX2lkcwkqaWRzWzNdOwotCi0JaW50CQlzZW1fY3Rsc1s0XTsKLQlpbnQJCXVzZWRfc2VtczsKLQotCWludAkJbXNnX2N0bG1heDsKLQlpbnQJCW1zZ19jdGxtbmI7Ci0JaW50CQltc2dfY3RsbW5pOwotCWF0b21pY190CW1zZ19ieXRlczsKLQlhdG9taWNfdAltc2dfaGRyczsKLQotCXNpemVfdAkJc2htX2N0bG1heDsKLQlzaXplX3QJCXNobV9jdGxhbGw7Ci0JaW50CQlzaG1fY3RsbW5pOwotCWludAkJc2htX3RvdDsKLX07Ci0KLWV4dGVybiBzdHJ1Y3QgaXBjX25hbWVzcGFjZSBpbml0X2lwY19uczsKLQotI2lmZGVmIENPTkZJR19TWVNWSVBDCi0jZGVmaW5lIElOSVRfSVBDX05TKG5zKQkJLm5zCQk9ICZpbml0X2lwY19ucywKLWV4dGVybiB2b2lkIGZyZWVfaXBjX25zKHN0cnVjdCBrcmVmICprcmVmKTsKLWV4dGVybiBzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqY29weV9pcGNzKHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0JCQkJCQlzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMpOwotI2Vsc2UKLSNkZWZpbmUgSU5JVF9JUENfTlMobnMpCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpcGNfbmFtZXNwYWNlICpjb3B5X2lwY3ModW5zaWduZWQgbG9uZyBmbGFncywKLQkJCQkJCXN0cnVjdCBpcGNfbmFtZXNwYWNlICpucykKLXsKLQlyZXR1cm4gbnM7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqZ2V0X2lwY19ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMpCi17Ci0jaWZkZWYgQ09ORklHX1NZU1ZJUEMKLQlpZiAobnMpCi0JCWtyZWZfZ2V0KCZucy0+a3JlZik7Ci0jZW5kaWYKLQlyZXR1cm4gbnM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfaXBjX25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucykKLXsKLSNpZmRlZiBDT05GSUdfU1lTVklQQwotCWtyZWZfcHV0KCZucy0+a3JlZiwgZnJlZV9pcGNfbnMpOwotI2VuZGlmCi19Ci0KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZiAvKiBfTElOVVhfSVBDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXBjX25hbWVzcGFjZS5oIGIvaW5jbHVkZS9saW51eC9pcGNfbmFtZXNwYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ0NTFkMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvaXBjX25hbWVzcGFjZS5oCkBAIC0wLDAgKzEsODEgQEAKKyNpZm5kZWYgX19JUENfTkFNRVNQQUNFX0hfXworI2RlZmluZSBfX0lQQ19OQU1FU1BBQ0VfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorCitzdHJ1Y3QgaXBjX2lkcyB7CisJaW50IGluX3VzZTsKKwl1bnNpZ25lZCBzaG9ydCBzZXE7CisJdW5zaWduZWQgc2hvcnQgc2VxX21heDsKKwlzdHJ1Y3Qgcndfc2VtYXBob3JlIHJ3X211dGV4OworCXN0cnVjdCBpZHIgaXBjc19pZHI7Cit9OworCitzdHJ1Y3QgaXBjX25hbWVzcGFjZSB7CisJc3RydWN0IGtyZWYJa3JlZjsKKwlzdHJ1Y3QgaXBjX2lkcwlpZHNbM107CisKKwlpbnQJCXNlbV9jdGxzWzRdOworCWludAkJdXNlZF9zZW1zOworCisJaW50CQltc2dfY3RsbWF4OworCWludAkJbXNnX2N0bG1uYjsKKwlpbnQJCW1zZ19jdGxtbmk7CisJYXRvbWljX3QJbXNnX2J5dGVzOworCWF0b21pY190CW1zZ19oZHJzOworCisJc2l6ZV90CQlzaG1fY3RsbWF4OworCXNpemVfdAkJc2htX2N0bGFsbDsKKwlpbnQJCXNobV9jdGxtbmk7CisJaW50CQlzaG1fdG90OworfTsKKworZXh0ZXJuIHN0cnVjdCBpcGNfbmFtZXNwYWNlIGluaXRfaXBjX25zOworCisjaWZkZWYgQ09ORklHX1NZU1ZJUEMKKyNkZWZpbmUgSU5JVF9JUENfTlMobnMpCQkubnMJCT0gJmluaXRfaXBjX25zLAorI2Vsc2UKKyNkZWZpbmUgSU5JVF9JUENfTlMobnMpCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU1ZJUEMpICYmIGRlZmluZWQoQ09ORklHX0lQQ19OUykKK2V4dGVybiB2b2lkIGZyZWVfaXBjX25zKHN0cnVjdCBrcmVmICprcmVmKTsKK2V4dGVybiBzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqY29weV9pcGNzKHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCQkJICAgICAgIHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucyk7CitleHRlcm4gdm9pZCBmcmVlX2lwY3Moc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zLCBzdHJ1Y3QgaXBjX2lkcyAqaWRzLAorCQkgICAgICB2b2lkICgqZnJlZSkoc3RydWN0IGlwY19uYW1lc3BhY2UgKiwKKwkJCQkgICBzdHJ1Y3Qga2Vybl9pcGNfcGVybSAqKSk7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwY19uYW1lc3BhY2UgKmdldF9pcGNfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKQoreworCWlmIChucykKKwkJa3JlZl9nZXQoJm5zLT5rcmVmKTsKKwlyZXR1cm4gbnM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfaXBjX25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucykKK3sKKwlrcmVmX3B1dCgmbnMtPmtyZWYsIGZyZWVfaXBjX25zKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpcGNfbmFtZXNwYWNlICpjb3B5X2lwY3ModW5zaWduZWQgbG9uZyBmbGFncywKKwkJc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKQoreworCWlmIChmbGFncyAmIENMT05FX05FV0lQQykKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlyZXR1cm4gbnM7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwY19uYW1lc3BhY2UgKmdldF9pcGNfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKQoreworCXJldHVybiBuczsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9pcGNfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKQoreworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXJxLmggYi9pbmNsdWRlL2xpbnV4L2lycS5oCmluZGV4IDQ2NjliZTAuLmJmZDllZmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXJxLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcnEuaApAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgogCiBzdHJ1Y3QgaXJxX2Rlc2M7Ci10eXBlZGVmCXZvaWQgZmFzdGNhbGwgKCppcnFfZmxvd19oYW5kbGVyX3QpKHVuc2lnbmVkIGludCBpcnEsCit0eXBlZGVmCXZvaWQgKCppcnFfZmxvd19oYW5kbGVyX3QpKHVuc2lnbmVkIGludCBpcnEsCiAJCQkJCSAgICBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpOwogCiAKQEAgLTI3NiwxOSArMjc2LDE5IEBACiAgKiBCdWlsdC1pbiBJUlEgaGFuZGxlcnMgZm9yIHZhcmlvdXMgSVJRIHR5cGVzLAogICogY2FsbGFibGUgdmlhIGRlc2MtPmNoaXAtPmhhbmRsZV9pcnEoKQogICovCi1leHRlcm4gdm9pZCBmYXN0Y2FsbCBoYW5kbGVfbGV2ZWxfaXJxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYyk7Ci1leHRlcm4gdm9pZCBmYXN0Y2FsbCBoYW5kbGVfZmFzdGVvaV9pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKTsKLWV4dGVybiB2b2lkIGZhc3RjYWxsIGhhbmRsZV9lZGdlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpOwotZXh0ZXJuIHZvaWQgZmFzdGNhbGwgaGFuZGxlX3NpbXBsZV9pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKTsKLWV4dGVybiB2b2lkIGZhc3RjYWxsIGhhbmRsZV9wZXJjcHVfaXJxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYyk7Ci1leHRlcm4gdm9pZCBmYXN0Y2FsbCBoYW5kbGVfYmFkX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpOworZXh0ZXJuIHZvaWQgaGFuZGxlX2xldmVsX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpOworZXh0ZXJuIHZvaWQgaGFuZGxlX2Zhc3Rlb2lfaXJxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYyk7CitleHRlcm4gdm9pZCBoYW5kbGVfZWRnZV9pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKTsKK2V4dGVybiB2b2lkIGhhbmRsZV9zaW1wbGVfaXJxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYyk7CitleHRlcm4gdm9pZCBoYW5kbGVfcGVyY3B1X2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpOworZXh0ZXJuIHZvaWQgaGFuZGxlX2JhZF9pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKTsKIAogLyoKICAqIE1vbm9saXRoaWMgZG9fSVJRIGltcGxlbWVudGF0aW9uLgogICogKGlzIGFuIGV4cGxpY2l0IGZhc3RjYWxsLCBiZWNhdXNlIGkzODYgNEtTVEFDS1MgY2FsbHMgaXQgZnJvbSBhc3NlbWJseSkKICAqLwogI2lmbmRlZiBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRCi1leHRlcm4gZmFzdGNhbGwgdW5zaWduZWQgaW50IF9fZG9fSVJRKHVuc2lnbmVkIGludCBpcnEpOworZXh0ZXJuIHVuc2lnbmVkIGludCBfX2RvX0lSUSh1bnNpZ25lZCBpbnQgaXJxKTsKICNlbmRpZgogCiAvKgpAQCAtMzY3LDYgKzM2Nyw5IEBACiAJX19zZXRfaXJxX2hhbmRsZXIoaXJxLCBoYW5kbGUsIDEsIE5VTEwpOwogfQogCitleHRlcm4gdm9pZCBzZXRfaXJxX25vcHJvYmUodW5zaWduZWQgaW50IGlycSk7CitleHRlcm4gdm9pZCBzZXRfaXJxX3Byb2JlKHVuc2lnbmVkIGludCBpcnEpOworCiAvKiBIYW5kbGUgZHluYW1pYyBpcnEgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uICovCiBleHRlcm4gaW50IGNyZWF0ZV9pcnEodm9pZCk7CiBleHRlcm4gdm9pZCBkZXN0cm95X2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXNpY29tLmggYi9pbmNsdWRlL2xpbnV4L2lzaWNvbS5oCmluZGV4IDQ1YjNkNDguLjhmNGM3MTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXNpY29tLmgKKysrIGIvaW5jbHVkZS9saW51eC9pc2ljb20uaApAQCAtMzcsOCArMzcsNiBAQAogI2RlZmluZQkJQk9BUkRfQ09VTlQJNAogI2RlZmluZQkJUE9SVF9DT1VOVAkoQk9BUkRfQ09VTlQqMTYpCiAKLSNkZWZpbmUJCVNFUklBTF9UWVBFX05PUk1BTAkxCi0KIC8qICAgY2hhcmFjdGVyIHNpemVzICAqLwogCiAjZGVmaW5lCQlJU0lDT01fQ1M1CQkweDAwMDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXN0YWxsaW9uLmggYi9pbmNsdWRlL2xpbnV4L2lzdGFsbGlvbi5oCmluZGV4IDEwNmE1ZTguLjVhODRmZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXN0YWxsaW9uLmgKKysrIGIvaW5jbHVkZS9saW51eC9pc3RhbGxpb24uaApAQCAtNzEsNyArNzEsNiBAQAogCXdhaXRfcXVldWVfaGVhZF90CW9wZW5fd2FpdDsKIAl3YWl0X3F1ZXVlX2hlYWRfdAljbG9zZV93YWl0OwogCXdhaXRfcXVldWVfaGVhZF90CXJhd193YWl0OwotCXN0cnVjdCB3b3JrX3N0cnVjdAl0cWhhbmd1cDsKIAlzdHJ1Y3QgYXN5c2lncwkJYXNpZzsKIAl1bnNpZ25lZCBsb25nCQlhZGRyOwogCXVuc2lnbmVkIGxvbmcJCXJ4b2Zmc2V0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9qaWZmaWVzLmggYi9pbmNsdWRlL2xpbnV4L2ppZmZpZXMuaAppbmRleCA3YmE5ZTQ3Li5lMGI1YjY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ppZmZpZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ppZmZpZXMuaApAQCAtNDIsNyArNDIsNyBAQAogLyogTEFUQ0ggaXMgdXNlZCBpbiB0aGUgaW50ZXJ2YWwgdGltZXIgYW5kIGZ0YXBlIHNldHVwLiAqLwogI2RlZmluZSBMQVRDSCAgKChDTE9DS19USUNLX1JBVEUgKyBIWi8yKSAvIEhaKQkvKiBGb3IgZGl2aWRlciAqLwogCi0vKiBTdXBwb3NlIHdlIHdhbnQgdG8gZGV2aWRlIHR3byBudW1iZXJzIE5PTSBhbmQgREVOOiBOT00vREVOLCB0aGUgd2UgY2FuCisvKiBTdXBwb3NlIHdlIHdhbnQgdG8gZGV2aWRlIHR3byBudW1iZXJzIE5PTSBhbmQgREVOOiBOT00vREVOLCB0aGVuIHdlIGNhbgogICogaW1wcm92ZSBhY2N1cmFjeSBieSBzaGlmdGluZyBMU0ggYml0cywgaGVuY2UgY2FsY3VsYXRpbmc6CiAgKiAgICAgKE5PTSA8PCBMU0gpIC8gREVOCiAgKiBUaGlzIGhvd2V2ZXIgbWVhbnMgdHJvdWJsZSBmb3IgbGFyZ2UgTk9NLCBiZWNhdXNlIChOT00gPDwgTFNIKSBtYXkgbm8KQEAgLTE2MCw3ICsxNjAsNyBAQAogICogV2Ugd2FudCB0byBkbyByZWFsaXN0aWMgY29udmVyc2lvbnMgb2YgdGltZSBzbyB3ZSBuZWVkIHRvIHVzZSB0aGUgc2FtZQogICogdmFsdWVzIHRoZSB1cGRhdGUgd2FsbCBjbG9jayBjb2RlIHVzZXMgYXMgdGhlIGppZmZpZXMgc2l6ZS4gIFRoaXMgdmFsdWUKICAqIGlzOiBUSUNLX05TRUMgKHdoaWNoIGlzIGRlZmluZWQgaW4gdGltZXguaCkuICBUaGlzCi0gKiBpcyBhIGNvbnN0YW50IGFuZCBpcyBpbiBuYW5vc2Vjb25kcy4gIFdlIHdpbGwgdXNlZCBzY2FsZWQgbWF0aAorICogaXMgYSBjb25zdGFudCBhbmQgaXMgaW4gbmFub3NlY29uZHMuICBXZSB3aWxsIHVzZSBzY2FsZWQgbWF0aAogICogd2l0aCBhIHNldCBvZiBzY2FsZXMgZGVmaW5lZCBoZXJlIGFzIFNFQ19KSUZGSUVfU0MsICBVU0VDX0pJRkZJRV9TQyBhbmQKICAqIE5TRUNfSklGRklFX1NDLiAgTm90ZSB0aGF0IHRoZXNlIGRlZmluZXMgY29udGFpbiBub3RoaW5nIGJ1dAogICogY29uc3RhbnRzIGFuZCBzbyBhcmUgY29tcHV0ZWQgYXQgY29tcGlsZSB0aW1lLiAgU0hJRlRfSFogKGNvbXB1dGVkIGluCkBAIC0yMDQsNyArMjA0LDcgQEAKICAqIG9wZXJhdG9yIGlmIHRoZSByZXN1bHQgaXMgYSBsb25nIGxvbmcgQU5EIGF0IGxlYXN0IG9uZSBvZiB0aGUKICAqIG9wZXJhbmRzIGlzIGNhc3QgdG8gbG9uZyBsb25nICh1c3VhbGx5IGp1c3QgcHJpb3IgdG8gdGhlICIqIiBzbyBhcwogICogbm90IHRvIGNvbmZ1c2UgaXQgaW50byB0aGlua2luZyBpdCByZWFsbHkgaGFzIGEgNjQtYml0IG9wZXJhbmQsCi0gKiB3aGljaCwgYnV5IHRoZSB3YXksIGl0IGNhbiBkbywgYnV0IGl0IHRha2UgbW9yZSBjb2RlIGFuZCBhdCBsZWFzdCAyCisgKiB3aGljaCwgYnV5IHRoZSB3YXksIGl0IGNhbiBkbywgYnV0IGl0IHRha2VzIG1vcmUgY29kZSBhbmQgYXQgbGVhc3QgMgogICogbXB5cykuCiAKICAqIFdlIGFsc28gbmVlZCB0byBiZSBhd2FyZSB0aGF0IG9uZSBzZWNvbmQgaW4gbmFub3NlY29uZHMgaXMgb25seSBhCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaAppbmRleCAxODIyMmYyLi4yZGY0NGU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCisrKyBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKQEAgLTEzMyw3ICsxMzMsNyBAQAogZXh0ZXJuIHZvaWQgb29wc19lbnRlcih2b2lkKTsKIGV4dGVybiB2b2lkIG9vcHNfZXhpdCh2b2lkKTsKIGV4dGVybiBpbnQgb29wc19tYXlfcHJpbnQodm9pZCk7Ci1mYXN0Y2FsbCBOT1JFVF9UWVBFIHZvaWQgZG9fZXhpdChsb25nIGVycm9yX2NvZGUpCitOT1JFVF9UWVBFIHZvaWQgZG9fZXhpdChsb25nIGVycm9yX2NvZGUpCiAJQVRUUklCX05PUkVUOwogTk9SRVRfVFlQRSB2b2lkIGNvbXBsZXRlX2FuZF9leGl0KHN0cnVjdCBjb21wbGV0aW9uICosIGxvbmcpCiAJQVRUUklCX05PUkVUOwpAQCAtMTQxLDYgKzE0MSwxMCBAQAogZXh0ZXJuIGxvbmcgc2ltcGxlX3N0cnRvbChjb25zdCBjaGFyICosY2hhciAqKix1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBzaW1wbGVfc3RydG91bGwoY29uc3QgY2hhciAqLGNoYXIgKiosdW5zaWduZWQgaW50KTsKIGV4dGVybiBsb25nIGxvbmcgc2ltcGxlX3N0cnRvbGwoY29uc3QgY2hhciAqLGNoYXIgKiosdW5zaWduZWQgaW50KTsKK2V4dGVybiBpbnQgc3RyaWN0X3N0cnRvdWwoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcgKik7CitleHRlcm4gaW50IHN0cmljdF9zdHJ0b2woY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGxvbmcgKik7CitleHRlcm4gaW50IHN0cmljdF9zdHJ0b3VsbChjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyBsb25nICopOworZXh0ZXJuIGludCBzdHJpY3Rfc3RydG9sbChjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgbG9uZyBsb25nICopOwogZXh0ZXJuIGludCBzcHJpbnRmKGNoYXIgKiBidWYsIGNvbnN0IGNoYXIgKiBmbXQsIC4uLikKIAlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CiBleHRlcm4gaW50IHZzcHJpbnRmKGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqLCB2YV9saXN0KQpAQCAtMTcyLDggKzE3Niw2IEBACiBzdHJ1Y3QgcGlkOwogZXh0ZXJuIHN0cnVjdCBwaWQgKnNlc3Npb25fb2ZfcGdycChzdHJ1Y3QgcGlkICpwZ3JwKTsKIAotZXh0ZXJuIHZvaWQgZHVtcF90aHJlYWQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCB1c2VyICpkdW1wKTsKLQogI2lmZGVmIENPTkZJR19QUklOVEsKIGFzbWxpbmthZ2UgaW50IHZwcmludGsoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCiAJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAwKSkpOwpAQCAtMTgyLDYgKzE4NCwxMyBAQAogZXh0ZXJuIGludCBsb2dfYnVmX2dldF9sZW4odm9pZCk7CiBleHRlcm4gaW50IGxvZ19idWZfcmVhZChpbnQgaWR4KTsKIGV4dGVybiBpbnQgbG9nX2J1Zl9jb3B5KGNoYXIgKmRlc3QsIGludCBpZHgsIGludCBsZW4pOworCitleHRlcm4gaW50IHByaW50a19yYXRlbGltaXRfamlmZmllczsKK2V4dGVybiBpbnQgcHJpbnRrX3JhdGVsaW1pdF9idXJzdDsKK2V4dGVybiBpbnQgcHJpbnRrX3JhdGVsaW1pdCh2b2lkKTsKK2V4dGVybiBpbnQgX19wcmludGtfcmF0ZWxpbWl0KGludCByYXRlbGltaXRfamlmZmllcywgaW50IHJhdGVsaW1pdF9idXJzdCk7CitleHRlcm4gYm9vbCBwcmludGtfdGltZWRfcmF0ZWxpbWl0KHVuc2lnbmVkIGxvbmcgKmNhbGxlcl9qaWZmaWVzLAorCQkJCSAgIHVuc2lnbmVkIGludCBpbnRlcnZhbF9tc2VjKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCB2cHJpbnRrKGNvbnN0IGNoYXIgKnMsIHZhX2xpc3QgYXJncykKIAlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDApKSk7CkBAIC0xOTIsNiArMjAxLDEyIEBACiBzdGF0aWMgaW5saW5lIGludCBsb2dfYnVmX2dldF9sZW4odm9pZCkgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSBpbnQgbG9nX2J1Zl9yZWFkKGludCBpZHgpIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgaW50IGxvZ19idWZfY29weShjaGFyICpkZXN0LCBpbnQgaWR4LCBpbnQgbGVuKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBwcmludGtfcmF0ZWxpbWl0KHZvaWQpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IF9fcHJpbnRrX3JhdGVsaW1pdChpbnQgcmF0ZWxpbWl0X2ppZmZpZXMsIFwKKwkJCQkgICAgIGludCByYXRlbGltaXRfYnVyc3QpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCBwcmludGtfdGltZWRfcmF0ZWxpbWl0KHVuc2lnbmVkIGxvbmcgKmNhbGxlcl9qaWZmaWVzLCBcCisJCQkJCSAgdW5zaWduZWQgaW50IGludGVydmFsX21zZWMpCVwKKwkJeyByZXR1cm4gZmFsc2U7IH0KICNlbmRpZgogCiBleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpCkBAIC0xOTksMTEgKzIxNCw2IEBACiAKIHVuc2lnbmVkIGxvbmcgaW50X3NxcnQodW5zaWduZWQgbG9uZyk7CiAKLWV4dGVybiBpbnQgcHJpbnRrX3JhdGVsaW1pdCh2b2lkKTsKLWV4dGVybiBpbnQgX19wcmludGtfcmF0ZWxpbWl0KGludCByYXRlbGltaXRfamlmZmllcywgaW50IHJhdGVsaW1pdF9idXJzdCk7Ci1leHRlcm4gYm9vbCBwcmludGtfdGltZWRfcmF0ZWxpbWl0KHVuc2lnbmVkIGxvbmcgKmNhbGxlcl9qaWZmaWVzLAotCQkJCXVuc2lnbmVkIGludCBpbnRlcnZhbF9tc2VjKTsKLQogc3RhdGljIGlubGluZSB2b2lkIGNvbnNvbGVfc2lsZW50KHZvaWQpCiB7CiAJY29uc29sZV9sb2dsZXZlbCA9IDA7CkBAIC0yMjQsNiArMjM0LDcgQEAKIGV4dGVybiBpbnQgdGFpbnRlZDsKIGV4dGVybiBjb25zdCBjaGFyICpwcmludF90YWludGVkKHZvaWQpOwogZXh0ZXJuIHZvaWQgYWRkX3RhaW50KHVuc2lnbmVkKTsKK2V4dGVybiBpbnQgcm9vdF9tb3VudGZsYWdzOwogCiAvKiBWYWx1ZXMgdXNlZCBmb3Igc3lzdGVtX3N0YXRlICovCiBleHRlcm4gZW51bSBzeXN0ZW1fc3RhdGVzIHsKQEAgLTI0Myw2ICsyNTQsNyBAQAogI2RlZmluZSBUQUlOVF9CQURfUEFHRQkJCSgxPDw1KQogI2RlZmluZSBUQUlOVF9VU0VSCQkJKDE8PDYpCiAjZGVmaW5lIFRBSU5UX0RJRQkJCSgxPDw3KQorI2RlZmluZSBUQUlOVF9PVkVSUklEREVOX0FDUElfVEFCTEUJKDE8PDgpCiAKIGV4dGVybiB2b2lkIGR1bXBfc3RhY2sodm9pZCkgX19jb2xkOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tleGVjLmggYi9pbmNsdWRlL2xpbnV4L2tleGVjLmgKaW5kZXggMmQ5YzQ0OC4uMzI2NTk2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZXhlYy5oCisrKyBiL2luY2x1ZGUvbGludXgva2V4ZWMuaApAQCAtMTI3LDE3ICsxMjcsMjEgQEAKIAlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7CiB1bnNpZ25lZCBsb25nIHBhZGRyX3ZtY29yZWluZm9fbm90ZSh2b2lkKTsKIAorI2RlZmluZSBWTUNPUkVJTkZPX09TUkVMRUFTRShuYW1lKSBcCisJdm1jb3JlaW5mb19hcHBlbmRfc3RyKCJPU1JFTEVBU0U9JXNcbiIsICNuYW1lKQorI2RlZmluZSBWTUNPUkVJTkZPX1BBR0VTSVpFKHZhbHVlKSBcCisJdm1jb3JlaW5mb19hcHBlbmRfc3RyKCJQQUdFU0laRT0lbGRcbiIsIHZhbHVlKQogI2RlZmluZSBWTUNPUkVJTkZPX1NZTUJPTChuYW1lKSBcCiAJdm1jb3JlaW5mb19hcHBlbmRfc3RyKCJTWU1CT0woJXMpPSVseFxuIiwgI25hbWUsICh1bnNpZ25lZCBsb25nKSZuYW1lKQogI2RlZmluZSBWTUNPUkVJTkZPX1NJWkUobmFtZSkgXAogCXZtY29yZWluZm9fYXBwZW5kX3N0cigiU0laRSglcyk9JWx1XG4iLCAjbmFtZSwgXAotCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpc2l6ZW9mKHN0cnVjdCBuYW1lKSkKLSNkZWZpbmUgVk1DT1JFSU5GT19UWVBFREVGX1NJWkUobmFtZSkgXAotCXZtY29yZWluZm9fYXBwZW5kX3N0cigiU0laRSglcyk9JWx1XG4iLCAjbmFtZSwgXAogCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpc2l6ZW9mKG5hbWUpKQorI2RlZmluZSBWTUNPUkVJTkZPX1NUUlVDVF9TSVpFKG5hbWUpIFwKKwl2bWNvcmVpbmZvX2FwcGVuZF9zdHIoIlNJWkUoJXMpPSVsdVxuIiwgI25hbWUsIFwKKwkJCSAgICAgICh1bnNpZ25lZCBsb25nKXNpemVvZihzdHJ1Y3QgbmFtZSkpCiAjZGVmaW5lIFZNQ09SRUlORk9fT0ZGU0VUKG5hbWUsIGZpZWxkKSBcCiAJdm1jb3JlaW5mb19hcHBlbmRfc3RyKCJPRkZTRVQoJXMuJXMpPSVsdVxuIiwgI25hbWUsICNmaWVsZCwgXAotCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpJigoKHN0cnVjdCBuYW1lICopMCktPmZpZWxkKSkKKwkJCSAgICAgICh1bnNpZ25lZCBsb25nKW9mZnNldG9mKHN0cnVjdCBuYW1lLCBmaWVsZCkpCiAjZGVmaW5lIFZNQ09SRUlORk9fTEVOR1RIKG5hbWUsIHZhbHVlKSBcCiAJdm1jb3JlaW5mb19hcHBlbmRfc3RyKCJMRU5HVEgoJXMpPSVsdVxuIiwgI25hbWUsICh1bnNpZ25lZCBsb25nKXZhbHVlKQogI2RlZmluZSBWTUNPUkVJTkZPX05VTUJFUihuYW1lKSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2t0aW1lLmggYi9pbmNsdWRlL2xpbnV4L2t0aW1lLmgKaW5kZXggYTZkZGVjMS4uMzZjNTQyYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rdGltZS5oCisrKyBiL2luY2x1ZGUvbGludXgva3RpbWUuaApAQCAtMzE2LDcgKzMxNiw4IEBACiAgKiBpZGVhIG9mIHRoZSAoaW4pYWNjdXJhY3kgb2YgdGltZXJzLiBUaW1lciB2YWx1ZXMgYXJlIHJvdW5kZWQgdXAgdG8KICAqIHRoaXMgcmVzb2x1dGlvbiB2YWx1ZXMuCiAgKi8KLSNkZWZpbmUgS1RJTUVfTE9XX1JFUwkJKGt0aW1lX3QpeyAudHY2NCA9IFRJQ0tfTlNFQyB9CisjZGVmaW5lIExPV19SRVNfTlNFQwkJVElDS19OU0VDCisjZGVmaW5lIEtUSU1FX0xPV19SRVMJCShrdGltZV90KXsgLnR2NjQgPSBMT1dfUkVTX05TRUMgfQogCiAvKiBHZXQgdGhlIG1vbm90b25pYyB0aW1lIGluIHRpbWVzcGVjIGZvcm1hdDogKi8KIGV4dGVybiB2b2lkIGt0aW1lX2dldF90cyhzdHJ1Y3QgdGltZXNwZWMgKnRzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGVkcy5oIGIvaW5jbHVkZS9saW51eC9sZWRzLmgKaW5kZXggMDBmODlmZC4uMDIwMWY2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sZWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9sZWRzLmgKQEAgLTM4LDYgKzM4LDExIEBACiAJdm9pZAkJKCpicmlnaHRuZXNzX3NldCkoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCiAJCQkJCSAgZW51bSBsZWRfYnJpZ2h0bmVzcyBicmlnaHRuZXNzKTsKIAorCS8qIEFjdGl2YXRlIGhhcmR3YXJlIGFjY2VsZXJhdGVkIGJsaW5rICovCisJaW50CQkoKmJsaW5rX3NldCkoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCisJCQkJICAgICB1bnNpZ25lZCBsb25nICpkZWxheV9vbiwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgKmRlbGF5X29mZik7CisKIAlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwogCXN0cnVjdCBsaXN0X2hlYWQJIG5vZGU7CQkJLyogTEVEIERldmljZSBsaXN0ICovCiAJY2hhcgkJCSpkZWZhdWx0X3RyaWdnZXI7CS8qIFRyaWdnZXIgdG8gdXNlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaCBiL2luY2x1ZGUvbGludXgvbWVtY29udHJvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNWQ1N2IKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaApAQCAtMCwwICsxLDE4OCBAQAorLyogbWVtY29udHJvbC5oIC0gTWVtb3J5IENvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uLCAyMDA3CisgKiBBdXRob3IgQmFsYmlyIFNpbmdoIDxiYWxiaXJAbGludXgudm5ldC5pYm0uY29tPgorICoKKyAqIENvcHlyaWdodCAyMDA3IE9wZW5WWiBTV3NvZnQgSW5jCisgKiBBdXRob3I6IFBhdmVsIEVtZWxpYW5vdiA8eGVtdWxAb3BlbnZ6Lm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfTElOVVhfTUVNQ09OVFJPTF9ICisjZGVmaW5lIF9MSU5VWF9NRU1DT05UUk9MX0gKKworI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworc3RydWN0IG1lbV9jZ3JvdXA7CitzdHJ1Y3QgcGFnZV9jZ3JvdXA7CitzdHJ1Y3QgcGFnZTsKK3N0cnVjdCBtbV9zdHJ1Y3Q7CisKKyNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9DT05UCisKK2V4dGVybiB2b2lkIG1tX2luaXRfY2dyb3VwKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOworZXh0ZXJuIHZvaWQgbW1fZnJlZV9jZ3JvdXAoc3RydWN0IG1tX3N0cnVjdCAqbW0pOworZXh0ZXJuIHZvaWQgcGFnZV9hc3NpZ25fcGFnZV9jZ3JvdXAoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJCXN0cnVjdCBwYWdlX2Nncm91cCAqcGMpOworZXh0ZXJuIHN0cnVjdCBwYWdlX2Nncm91cCAqcGFnZV9nZXRfcGFnZV9jZ3JvdXAoc3RydWN0IHBhZ2UgKnBhZ2UpOworZXh0ZXJuIGludCBtZW1fY2dyb3VwX2NoYXJnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkJZ2ZwX3QgZ2ZwX21hc2spOworZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF91bmNoYXJnZShzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjKTsKK2V4dGVybiB2b2lkIG1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSk7CitleHRlcm4gdm9pZCBtZW1fY2dyb3VwX21vdmVfbGlzdHMoc3RydWN0IHBhZ2VfY2dyb3VwICpwYywgYm9vbCBhY3RpdmUpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9pc29sYXRlX3BhZ2VzKHVuc2lnbmVkIGxvbmcgbnJfdG9fc2NhbiwKKwkJCQkJc3RydWN0IGxpc3RfaGVhZCAqZHN0LAorCQkJCQl1bnNpZ25lZCBsb25nICpzY2FubmVkLCBpbnQgb3JkZXIsCisJCQkJCWludCBtb2RlLCBzdHJ1Y3Qgem9uZSAqeiwKKwkJCQkJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbV9jb250LAorCQkJCQlpbnQgYWN0aXZlKTsKK2V4dGVybiB2b2lkIG1lbV9jZ3JvdXBfb3V0X29mX21lbW9yeShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBnZnBfdCBnZnBfbWFzayk7CitleHRlcm4gaW50IG1lbV9jZ3JvdXBfY2FjaGVfY2hhcmdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkJZ2ZwX3QgZ2ZwX21hc2spOworaW50IHRhc2tfaW5fbWVtX2Nncm91cChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNvbnN0IHN0cnVjdCBtZW1fY2dyb3VwICptZW0pOworCisjZGVmaW5lIHZtX21hdGNoX2Nncm91cChtbSwgY2dyb3VwKQlcCisJKChjZ3JvdXApID09IHJjdV9kZXJlZmVyZW5jZSgobW0pLT5tZW1fY2dyb3VwKSkKKworZXh0ZXJuIGludCBtZW1fY2dyb3VwX3ByZXBhcmVfbWlncmF0aW9uKHN0cnVjdCBwYWdlICpwYWdlKTsKK2V4dGVybiB2b2lkIG1lbV9jZ3JvdXBfZW5kX21pZ3JhdGlvbihzdHJ1Y3QgcGFnZSAqcGFnZSk7CitleHRlcm4gdm9pZCBtZW1fY2dyb3VwX3BhZ2VfbWlncmF0aW9uKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgcGFnZSAqbmV3cGFnZSk7CisKKy8qCisgKiBGb3IgbWVtb3J5IHJlY2xhaW0uCisgKi8KK2V4dGVybiBpbnQgbWVtX2Nncm91cF9jYWxjX21hcHBlZF9yYXRpbyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKTsKK2V4dGVybiBsb25nIG1lbV9jZ3JvdXBfcmVjbGFpbV9pbWJhbGFuY2Uoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSk7CisKK2V4dGVybiBpbnQgbWVtX2Nncm91cF9nZXRfcmVjbGFpbV9wcmlvcml0eShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKTsKK2V4dGVybiB2b2lkIG1lbV9jZ3JvdXBfbm90ZV9yZWNsYWltX3ByaW9yaXR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCisJCQkJCQkJaW50IHByaW9yaXR5KTsKK2V4dGVybiB2b2lkIG1lbV9jZ3JvdXBfcmVjb3JkX3JlY2xhaW1fcHJpb3JpdHkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKKwkJCQkJCQlpbnQgcHJpb3JpdHkpOworCitleHRlcm4gbG9uZyBtZW1fY2dyb3VwX2NhbGNfcmVjbGFpbV9hY3RpdmUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKKwkJCQlzdHJ1Y3Qgem9uZSAqem9uZSwgaW50IHByaW9yaXR5KTsKK2V4dGVybiBsb25nIG1lbV9jZ3JvdXBfY2FsY19yZWNsYWltX2luYWN0aXZlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCisJCQkJc3RydWN0IHpvbmUgKnpvbmUsIGludCBwcmlvcml0eSk7CisKKyNlbHNlIC8qIENPTkZJR19DR1JPVVBfTUVNX0NPTlQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtbV9pbml0X2Nncm91cChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkJc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbW1fZnJlZV9jZ3JvdXAoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYWdlX2Fzc2lnbl9wYWdlX2Nncm91cChzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkJCXN0cnVjdCBwYWdlX2Nncm91cCAqcGMpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2VfY2dyb3VwICpwYWdlX2dldF9wYWdlX2Nncm91cChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbWVtX2Nncm91cF9jaGFyZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCQlnZnBfdCBnZnBfbWFzaykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1lbV9jZ3JvdXBfdW5jaGFyZ2Uoc3RydWN0IHBhZ2VfY2dyb3VwICpwYykKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1lbV9jZ3JvdXBfbW92ZV9saXN0cyhzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjLAorCQkJCQkJYm9vbCBhY3RpdmUpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1lbV9jZ3JvdXBfY2FjaGVfY2hhcmdlKHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCQkJc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkJCQlnZnBfdCBnZnBfbWFzaykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdm1fbWF0Y2hfY2dyb3VwKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCB0YXNrX2luX21lbV9jZ3JvdXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbWVtX2Nncm91cF9wcmVwYXJlX21pZ3JhdGlvbihzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1lbV9jZ3JvdXBfZW5kX21pZ3JhdGlvbihzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkCittZW1fY2dyb3VwX3BhZ2VfbWlncmF0aW9uKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgcGFnZSAqbmV3cGFnZSkKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgbWVtX2Nncm91cF9jYWxjX21hcHBlZF9yYXRpbyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBtZW1fY2dyb3VwX3JlY2xhaW1faW1iYWxhbmNlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1lbV9jZ3JvdXBfZ2V0X3JlY2xhaW1fcHJpb3JpdHkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1lbV9jZ3JvdXBfbm90ZV9yZWNsYWltX3ByaW9yaXR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCisJCQkJCQlpbnQgcHJpb3JpdHkpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1fY2dyb3VwX3JlY29yZF9yZWNsYWltX3ByaW9yaXR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCisJCQkJCQlpbnQgcHJpb3JpdHkpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBtZW1fY2dyb3VwX2NhbGNfcmVjbGFpbV9hY3RpdmUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKKwkJCQkJc3RydWN0IHpvbmUgKnpvbmUsIGludCBwcmlvcml0eSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBsb25nIG1lbV9jZ3JvdXBfY2FsY19yZWNsYWltX2luYWN0aXZlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCisJCQkJCXN0cnVjdCB6b25lICp6b25lLCBpbnQgcHJpb3JpdHkpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX0NHUk9VUF9NRU1fQ09OVCAqLworCisjZW5kaWYgLyogX0xJTlVYX01FTUNPTlRST0xfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21lbXN0aWNrLmggYi9pbmNsdWRlL2xpbnV4L21lbXN0aWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM0ZDA1OQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWVtc3RpY2suaApAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqICBTb255IE1lbW9yeVN0aWNrIHN1cHBvcnQKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IEFsZXggRHVib3YgPG9ha2FkQHlhaG9vLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaWZuZGVmIF9NRU1TVElDS19ICisjZGVmaW5lIF9NRU1TVElDS19ICisKKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisvKioqIEhhcmR3YXJlIGJhc2VkIHN0cnVjdHVyZXMgKioqLworCitzdHJ1Y3QgbXNfc3RhdHVzX3JlZ2lzdGVyIHsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkOworCXVuc2lnbmVkIGNoYXIgaW50ZXJydXB0OworI2RlZmluZSBNRU1TVElDS19JTlRfQ01ETkFLICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBNRU1TVElDS19JTlRfQlJFUSAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBNRU1TVElDS19JTlRfRVJSICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBNRU1TVElDS19JTlRfQ0VEICAgICAgICAgICAgICAgIDB4MDA4MAorCisJdW5zaWduZWQgY2hhciBzdGF0dXMwOworI2RlZmluZSBNRU1TVElDS19TVEFUVVMwX1dQICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBNRU1TVElDS19TVEFUVVMwX1NMICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBNRU1TVElDS19TVEFUVVMwX0JGICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBNRU1TVElDS19TVEFUVVMwX0JFICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBNRU1TVElDS19TVEFUVVMwX0ZCMCAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBNRU1TVElDS19TVEFUVVMwX01CICAgICAgICAgICAgIDB4MDA4MAorCisJdW5zaWduZWQgY2hhciBzdGF0dXMxOworI2RlZmluZSBNRU1TVElDS19TVEFUVVMxX1VDRkcgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBNRU1TVElDS19TVEFUVVMxX0ZHRVIgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBNRU1TVElDS19TVEFUVVMxX1VDRVggICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBNRU1TVElDS19TVEFUVVMxX0VYRVIgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBNRU1TVElDS19TVEFUVVMxX1VDRFQgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBNRU1TVElDS19TVEFUVVMxX0RURVIgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBNRU1TVElDS19TVEFUVVMxX0ZCSSAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBNRU1TVElDS19TVEFUVVMxX01CICAgICAgICAgICAgIDB4MDA4MAorfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IG1zX2lkX3JlZ2lzdGVyIHsKKwl1bnNpZ25lZCBjaGFyIHR5cGU7CisJdW5zaWduZWQgY2hhciByZXNlcnZlZDsKKwl1bnNpZ25lZCBjaGFyIGNhdGVnb3J5OworCXVuc2lnbmVkIGNoYXIgY2xhc3M7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgbXNfcGFyYW1fcmVnaXN0ZXIgeworCXVuc2lnbmVkIGNoYXIgc3lzdGVtOworCXVuc2lnbmVkIGNoYXIgYmxvY2tfYWRkcmVzc19tc2I7CisJdW5zaWduZWQgc2hvcnQgYmxvY2tfYWRkcmVzczsKKwl1bnNpZ25lZCBjaGFyIGNwOworI2RlZmluZSBNRU1TVElDS19DUF9CTE9DSyAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBNRU1TVElDS19DUF9QQUdFICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBNRU1TVElDS19DUF9FWFRSQSAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBNRU1TVElDS19DUF9PVkVSV1JJVEUgICAgICAgICAgIDB4MDA4MAorCisJdW5zaWduZWQgY2hhciBwYWdlX2FkZHJlc3M7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgbXNfZXh0cmFfZGF0YV9yZWdpc3RlciB7CisJdW5zaWduZWQgY2hhciAgb3ZlcndyaXRlX2ZsYWc7CisjZGVmaW5lIE1FTVNUSUNLX09WRVJXUklURV9VUERBVEEgICAgICAgMHgwMDEwCisjZGVmaW5lIE1FTVNUSUNLX09WRVJXUklURV9QQUdFICAgICAgICAgMHgwMDYwCisjZGVmaW5lIE1FTVNUSUNLX09WRVJXUklURV9CTE9DSyAgICAgICAgMHgwMDgwCisKKwl1bnNpZ25lZCBjaGFyICBtYW5hZ2VtZW50X2ZsYWc7CisjZGVmaW5lIE1FTVNUSUNLX01BTkFHRU1FTlRfU1lTVEVNICAgICAgMHgwMDA0CisjZGVmaW5lIE1FTVNUSUNLX01BTkFHRU1FTlRfVFJBTlNfVEFCTEUgMHgwMDA4CisjZGVmaW5lIE1FTVNUSUNLX01BTkFHRU1FTlRfQ09QWSAgICAgICAgMHgwMDEwCisjZGVmaW5lIE1FTVNUSUNLX01BTkFHRU1FTlRfQUNDRVNTICAgICAgMHgwMDIwCisKKwl1bnNpZ25lZCBzaG9ydCBsb2dpY2FsX2FkZHJlc3M7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgbXNfcmVnaXN0ZXIgeworCXN0cnVjdCBtc19zdGF0dXNfcmVnaXN0ZXIgICAgIHN0YXR1czsKKwlzdHJ1Y3QgbXNfaWRfcmVnaXN0ZXIgICAgICAgICBpZDsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgICByZXNlcnZlZFs4XTsKKwlzdHJ1Y3QgbXNfcGFyYW1fcmVnaXN0ZXIgICAgICBwYXJhbTsKKwlzdHJ1Y3QgbXNfZXh0cmFfZGF0YV9yZWdpc3RlciBleHRyYV9kYXRhOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IG1zcHJvX3BhcmFtX3JlZ2lzdGVyIHsKKwl1bnNpZ25lZCBjaGFyICBzeXN0ZW07CisJdW5zaWduZWQgc2hvcnQgZGF0YV9jb3VudDsKKwl1bnNpZ25lZCBpbnQgICBkYXRhX2FkZHJlc3M7CisJdW5zaWduZWQgY2hhciAgY21kX3BhcmFtOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IG1zcHJvX3JlZ2lzdGVyIHsKKwlzdHJ1Y3QgbXNfc3RhdHVzX3JlZ2lzdGVyICAgIHN0YXR1czsKKwlzdHJ1Y3QgbXNfaWRfcmVnaXN0ZXIgICAgICAgIGlkOworCXVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgICAgcmVzZXJ2ZWRbOF07CisJc3RydWN0IG1zcHJvX3BhcmFtX3JlZ2lzdGVyICBwYXJhbTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBtc19yZWdpc3Rlcl9hZGRyIHsKKwl1bnNpZ25lZCBjaGFyIHJfb2Zmc2V0OworCXVuc2lnbmVkIGNoYXIgcl9sZW5ndGg7CisJdW5zaWduZWQgY2hhciB3X29mZnNldDsKKwl1bnNpZ25lZCBjaGFyIHdfbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworZW51bSB7CisJTVNfVFBDX1JFQURfTE9OR19EQVRBICAgPSAweDAyLAorCU1TX1RQQ19SRUFEX1NIT1JUX0RBVEEgID0gMHgwMywKKwlNU19UUENfUkVBRF9SRUcgICAgICAgICA9IDB4MDQsCisJTVNfVFBDX1JFQURfSU9fREFUQSAgICAgPSAweDA1LCAvKiB1bnZlcmlmaWVkICovCisJTVNfVFBDX0dFVF9JTlQgICAgICAgICAgPSAweDA3LAorCU1TX1RQQ19TRVRfUldfUkVHX0FEUlMgID0gMHgwOCwKKwlNU19UUENfRVhfU0VUX0NNRCAgICAgICA9IDB4MDksCisJTVNfVFBDX1dSSVRFX0lPX0RBVEEgICAgPSAweDBhLCAvKiB1bnZlcmlmaWVkICovCisJTVNfVFBDX1dSSVRFX1JFRyAgICAgICAgPSAweDBiLAorCU1TX1RQQ19XUklURV9TSE9SVF9EQVRBID0gMHgwYywKKwlNU19UUENfV1JJVEVfTE9OR19EQVRBICA9IDB4MGQsCisJTVNfVFBDX1NFVF9DTUQgICAgICAgICAgPSAweDBlCit9OworCitlbnVtIHsKKwlNU19DTURfQkxPQ0tfRU5EICAgICA9IDB4MzMsCisJTVNfQ01EX1JFU0VUICAgICAgICAgPSAweDNjLAorCU1TX0NNRF9CTE9DS19XUklURSAgID0gMHg1NSwKKwlNU19DTURfU0xFRVAgICAgICAgICA9IDB4NWEsCisJTVNfQ01EX0JMT0NLX0VSQVNFICAgPSAweDk5LAorCU1TX0NNRF9CTE9DS19SRUFEICAgID0gMHhhYSwKKwlNU19DTURfQ0xFQVJfQlVGICAgICA9IDB4YzMsCisJTVNfQ01EX0ZMQVNIX1NUT1AgICAgPSAweGNjLAorCU1TUFJPX0NNRF9GT1JNQVQgICAgID0gMHgxMCwKKwlNU1BST19DTURfU0xFRVAgICAgICA9IDB4MTEsCisJTVNQUk9fQ01EX1JFQURfREFUQSAgPSAweDIwLAorCU1TUFJPX0NNRF9XUklURV9EQVRBID0gMHgyMSwKKwlNU1BST19DTURfUkVBRF9BVFJCICA9IDB4MjQsCisJTVNQUk9fQ01EX1NUT1AgICAgICAgPSAweDI1LAorCU1TUFJPX0NNRF9FUkFTRSAgICAgID0gMHgyNiwKKwlNU1BST19DTURfU0VUX0lCQSAgICA9IDB4NDYsCisJTVNQUk9fQ01EX1NFVF9JQkQgICAgPSAweDQ3CisvKgorCU1TUFJPX0NNRF9SRVNFVAorCU1TUFJPX0NNRF9XQUtFVVAKKwlNU1BST19DTURfSU5fSU9fREFUQQorCU1TUFJPX0NNRF9PVVRfSU9fREFUQQorCU1TUFJPX0NNRF9SRUFEX0lPX0FUUkIKKwlNU1BST19DTURfSU5fSU9fRklGTworCU1TUFJPX0NNRF9PVVRfSU9fRklGTworCU1TUFJPX0NNRF9JTl9JT00KKwlNU1BST19DTURfT1VUX0lPTQorKi8KK307CisKKy8qKiogRHJpdmVyIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyAqKiovCisKKyNkZWZpbmUgTUVNU1RJQ0tfUEFSVF9TSElGVCAzCisKK2VudW0gbWVtc3RpY2tfcGFyYW0geyBNRU1TVElDS19QT1dFUiA9IDEsIE1FTVNUSUNLX0lOVEVSRkFDRSB9OworCisjZGVmaW5lIE1FTVNUSUNLX1BPV0VSX09GRiAwCisjZGVmaW5lIE1FTVNUSUNLX1BPV0VSX09OICAxCisKKyNkZWZpbmUgTUVNU1RJQ0tfU0VSSUFMICAgMAorI2RlZmluZSBNRU1TVElDS19QQVJBTExFTCAxCisKK3N0cnVjdCBtZW1zdGlja19ob3N0Oworc3RydWN0IG1lbXN0aWNrX2RyaXZlcjsKKworI2RlZmluZSBNRU1TVElDS19NQVRDSF9BTEwgICAgICAgICAgICAweDAxCisKKyNkZWZpbmUgTUVNU1RJQ0tfVFlQRV9MRUdBQ1kgICAgICAgICAgMHhmZgorI2RlZmluZSBNRU1TVElDS19UWVBFX0RVTyAgICAgICAgICAgICAweDAwCisjZGVmaW5lIE1FTVNUSUNLX1RZUEVfUFJPICAgICAgICAgICAgIDB4MDEKKworI2RlZmluZSBNRU1TVElDS19DQVRFR09SWV9TVE9SQUdFICAgICAweGZmCisjZGVmaW5lIE1FTVNUSUNLX0NBVEVHT1JZX1NUT1JBR0VfRFVPIDB4MDAKKworI2RlZmluZSBNRU1TVElDS19DTEFTU19HRU5FUklDICAgICAgICAweGZmCisjZGVmaW5lIE1FTVNUSUNLX0NMQVNTX0dFTkVSSUNfRFVPICAgIDB4MDAKKworCitzdHJ1Y3QgbWVtc3RpY2tfZGV2aWNlX2lkIHsKKwl1bnNpZ25lZCBjaGFyIG1hdGNoX2ZsYWdzOworCXVuc2lnbmVkIGNoYXIgdHlwZTsKKwl1bnNpZ25lZCBjaGFyIGNhdGVnb3J5OworCXVuc2lnbmVkIGNoYXIgY2xhc3M7Cit9OworCitzdHJ1Y3QgbWVtc3RpY2tfcmVxdWVzdCB7CisJdW5zaWduZWQgY2hhciB0cGM7CisJdW5zaWduZWQgY2hhciBkYXRhX2RpcjoxLAorCQkgICAgICBuZWVkX2NhcmRfaW50OjEsCisJCSAgICAgIGdldF9pbnRfcmVnOjEsCisJCSAgICAgIGlvX3R5cGU6MjsKKyNkZWZpbmUgICAgICAgICAgICAgICBNRU1TVElDS19JT19OT05FIDAKKyNkZWZpbmUgICAgICAgICAgICAgICBNRU1TVElDS19JT19WQUwgIDEKKyNkZWZpbmUgICAgICAgICAgICAgICBNRU1TVElDS19JT19TRyAgIDIKKworCXVuc2lnbmVkIGNoYXIgaW50X3JlZzsKKwlpbnQgICAgICAgICAgIGVycm9yOworCXVuaW9uIHsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOworCQlzdHJ1Y3QgeworCQkJdW5zaWduZWQgY2hhciBkYXRhX2xlbjsKKwkJCXVuc2lnbmVkIGNoYXIgZGF0YVsxNV07CisJCX07CisJfTsKK307CisKK3N0cnVjdCBtZW1zdGlja19kZXYgeworCXN0cnVjdCBtZW1zdGlja19kZXZpY2VfaWQgaWQ7CisJc3RydWN0IG1lbXN0aWNrX2hvc3QgICAgICpob3N0OworCXN0cnVjdCBtc19yZWdpc3Rlcl9hZGRyICByZWdfYWRkcjsKKwlzdHJ1Y3QgY29tcGxldGlvbiAgICAgICAgbXJxX2NvbXBsZXRlOworCXN0cnVjdCBtZW1zdGlja19yZXF1ZXN0ICBjdXJyZW50X21ycTsKKworCS8qIENoZWNrIHRoYXQgbWVkaWEgZHJpdmVyIGlzIHN0aWxsIHdpbGxpbmcgdG8gb3BlcmF0ZSB0aGUgZGV2aWNlLiAqLworCWludCAgICAgICAgICAgICAgICAgICAgICAoKmNoZWNrKShzdHJ1Y3QgbWVtc3RpY2tfZGV2ICpjYXJkKTsKKwkvKiBHZXQgbmV4dCByZXF1ZXN0IGZyb20gdGhlIG1lZGlhIGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICAgKCpuZXh0X3JlcXVlc3QpKHN0cnVjdCBtZW1zdGlja19kZXYgKmNhcmQsCisJCQkJCQkgc3RydWN0IG1lbXN0aWNrX3JlcXVlc3QgKiptcnEpOworCisJc3RydWN0IGRldmljZSAgICAgICAgICAgIGRldjsKK307CisKK3N0cnVjdCBtZW1zdGlja19ob3N0IHsKKwlzdHJ1Y3QgbXV0ZXggICAgICAgIGxvY2s7CisJdW5zaWduZWQgaW50ICAgICAgICBpZDsKKwl1bnNpZ25lZCBpbnQgICAgICAgIGNhcHM7CisjZGVmaW5lIE1FTVNUSUNLX0NBUF9QQVJBTExFTCAgICAgIDEKKyNkZWZpbmUgTUVNU1RJQ0tfQ0FQX0FVVE9fR0VUX0lOVCAgMgorCisJc3RydWN0IHdvcmtfc3RydWN0ICBtZWRpYV9jaGVja2VyOworCXN0cnVjdCBjbGFzc19kZXZpY2UgY2RldjsKKworCXN0cnVjdCBtZW1zdGlja19kZXYgKmNhcmQ7CisJdW5zaWduZWQgaW50ICAgICAgICByZXRyaWVzOworCisJLyogTm90aWZ5IHRoZSBob3N0IHRoYXQgc29tZSByZXF1ZXN0cyBhcmUgcGVuZGluZy4gKi8KKwl2b2lkICAgICAgICAgICAgICAgICgqcmVxdWVzdCkoc3RydWN0IG1lbXN0aWNrX2hvc3QgKmhvc3QpOworCS8qIFNldCBob3N0IElPIHBhcmFtZXRlcnMgKHBvd2VyLCBjbG9jaywgZXRjKS4gICAgICovCisJdm9pZCAgICAgICAgICAgICAgICAoKnNldF9wYXJhbSkoc3RydWN0IG1lbXN0aWNrX2hvc3QgKmhvc3QsCisJCQkJCSBlbnVtIG1lbXN0aWNrX3BhcmFtIHBhcmFtLAorCQkJCQkgaW50IHZhbHVlKTsKKwl1bnNpZ25lZCBsb25nICAgICAgIHByaXZhdGVbMF0gX19fX2NhY2hlbGluZV9hbGlnbmVkOworfTsKKworc3RydWN0IG1lbXN0aWNrX2RyaXZlciB7CisJc3RydWN0IG1lbXN0aWNrX2RldmljZV9pZCAqaWRfdGFibGU7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAoKnByb2JlKShzdHJ1Y3QgbWVtc3RpY2tfZGV2ICpjYXJkKTsKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICgqcmVtb3ZlKShzdHJ1Y3QgbWVtc3RpY2tfZGV2ICpjYXJkKTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICgqc3VzcGVuZCkoc3RydWN0IG1lbXN0aWNrX2RldiAqY2FyZCwKKwkJCQkJICAgICBwbV9tZXNzYWdlX3Qgc3RhdGUpOworCWludCAgICAgICAgICAgICAgICAgICAgICAgKCpyZXN1bWUpKHN0cnVjdCBtZW1zdGlja19kZXYgKmNhcmQpOworCisJc3RydWN0IGRldmljZV9kcml2ZXIgICAgICBkcml2ZXI7Cit9OworCitpbnQgbWVtc3RpY2tfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBtZW1zdGlja19kcml2ZXIgKmRydik7Cit2b2lkIG1lbXN0aWNrX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBtZW1zdGlja19kcml2ZXIgKmRydik7CisKK3N0cnVjdCBtZW1zdGlja19ob3N0ICptZW1zdGlja19hbGxvY19ob3N0KHVuc2lnbmVkIGludCBleHRyYSwKKwkJCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXYpOworCitpbnQgbWVtc3RpY2tfYWRkX2hvc3Qoc3RydWN0IG1lbXN0aWNrX2hvc3QgKmhvc3QpOwordm9pZCBtZW1zdGlja19yZW1vdmVfaG9zdChzdHJ1Y3QgbWVtc3RpY2tfaG9zdCAqaG9zdCk7Cit2b2lkIG1lbXN0aWNrX2ZyZWVfaG9zdChzdHJ1Y3QgbWVtc3RpY2tfaG9zdCAqaG9zdCk7Cit2b2lkIG1lbXN0aWNrX2RldGVjdF9jaGFuZ2Uoc3RydWN0IG1lbXN0aWNrX2hvc3QgKmhvc3QpOworCit2b2lkIG1lbXN0aWNrX2luaXRfcmVxX3NnKHN0cnVjdCBtZW1zdGlja19yZXF1ZXN0ICptcnEsIHVuc2lnbmVkIGNoYXIgdHBjLAorCQkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnKTsKK3ZvaWQgbWVtc3RpY2tfaW5pdF9yZXEoc3RydWN0IG1lbXN0aWNrX3JlcXVlc3QgKm1ycSwgdW5zaWduZWQgY2hhciB0cGMsCisJCSAgICAgICB2b2lkICpidWYsIHNpemVfdCBsZW5ndGgpOworaW50IG1lbXN0aWNrX25leHRfcmVxKHN0cnVjdCBtZW1zdGlja19ob3N0ICpob3N0LAorCQkgICAgICBzdHJ1Y3QgbWVtc3RpY2tfcmVxdWVzdCAqKm1ycSk7Cit2b2lkIG1lbXN0aWNrX25ld19yZXEoc3RydWN0IG1lbXN0aWNrX2hvc3QgKmhvc3QpOworCitpbnQgbWVtc3RpY2tfc2V0X3J3X2FkZHIoc3RydWN0IG1lbXN0aWNrX2RldiAqY2FyZCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqbWVtc3RpY2tfcHJpdihzdHJ1Y3QgbWVtc3RpY2tfaG9zdCAqaG9zdCkKK3sKKwlyZXR1cm4gKHZvaWQgKilob3N0LT5wcml2YXRlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKm1lbXN0aWNrX2dldF9kcnZkYXRhKHN0cnVjdCBtZW1zdGlja19kZXYgKmNhcmQpCit7CisJcmV0dXJuIGRldl9nZXRfZHJ2ZGF0YSgmY2FyZC0+ZGV2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1lbXN0aWNrX3NldF9kcnZkYXRhKHN0cnVjdCBtZW1zdGlja19kZXYgKmNhcmQsIHZvaWQgKmRhdGEpCit7CisJZGV2X3NldF9kcnZkYXRhKCZjYXJkLT5kZXYsIGRhdGEpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2FzaWMzLmggYi9pbmNsdWRlL2xpbnV4L21mZC9hc2ljMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYjIxNjIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9hc2ljMy5oCkBAIC0wLDAgKzEsNDk3IEBACisvKgorICogaW5jbHVkZS9saW51eC9tZmQvYXNpYzMuaAorICoKKyAqIENvbXBhcSBBU0lDMyBoZWFkZXJzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQ29weXJpZ2h0IDIwMDEgQ29tcGFxIENvbXB1dGVyIENvcnBvcmF0aW9uLgorICogQ29weXJpZ2h0IDIwMDcgT3BlbmRIYW5kLgorICovCisKKyNpZm5kZWYgX19BU0lDM19IX18KKyNkZWZpbmUgX19BU0lDM19IX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBhc2ljMyB7CisJdm9pZCBfX2lvbWVtICptYXBwaW5nOworCXVuc2lnbmVkIGludCBidXNfc2hpZnQ7CisJdW5zaWduZWQgaW50IGlycV9ucjsKKwl1bnNpZ25lZCBpbnQgaXJxX2Jhc2U7CisJc3BpbmxvY2tfdCBsb2NrOworCXUxNiBpcnFfYm90aGVkZ2VbNF07CisJc3RydWN0IGRldmljZSAqZGV2OworfTsKKworc3RydWN0IGFzaWMzX3BsYXRmb3JtX2RhdGEgeworCXN0cnVjdCB7CisJCXUzMiBkaXI7CisJCXUzMiBpbml0OworCQl1MzIgc2xlZXBfbWFzazsKKwkJdTMyIHNsZWVwX291dDsKKwkJdTMyIGJhdHRfZmF1bHRfb3V0OworCQl1MzIgc2xlZXBfY29uZjsKKwkJdTMyIGFsdF9mdW5jdGlvbjsKKwl9IGdwaW9fYSwgZ3Bpb19iLCBncGlvX2MsIGdwaW9fZDsKKworCXVuc2lnbmVkIGludCBidXNfc2hpZnQ7CisKKwl1bnNpZ25lZCBpbnQgaXJxX2Jhc2U7CisKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoqY2hpbGRyZW47CisJdW5zaWduZWQgaW50IG5fY2hpbGRyZW47Cit9OworCitpbnQgYXNpYzNfZ3Bpb19nZXRfdmFsdWUoc3RydWN0IGFzaWMzICphc2ljLCB1bnNpZ25lZCBncGlvKTsKK3ZvaWQgYXNpYzNfZ3Bpb19zZXRfdmFsdWUoc3RydWN0IGFzaWMzICphc2ljLCB1bnNpZ25lZCBncGlvLCBpbnQgdmFsKTsKKworI2RlZmluZSBBU0lDM19OVU1fR1BJT19CQU5LUwk0CisjZGVmaW5lIEFTSUMzX0dQSU9TX1BFUl9CQU5LCTE2CisjZGVmaW5lIEFTSUMzX05VTV9HUElPUwkJNjQKKyNkZWZpbmUgQVNJQzNfTlJfSVJRUwkJQVNJQzNfTlVNX0dQSU9TICsgNgorCisjZGVmaW5lIEFTSUMzX0dQSU9fQkFOS19BCTAKKyNkZWZpbmUgQVNJQzNfR1BJT19CQU5LX0IJMQorI2RlZmluZSBBU0lDM19HUElPX0JBTktfQwkyCisjZGVmaW5lIEFTSUMzX0dQSU9fQkFOS19ECTMKKworI2RlZmluZSBBU0lDM19HUElPKGJhbmssIGdwaW8pIFwKKwkoKEFTSUMzX0dQSU9TX1BFUl9CQU5LICogQVNJQzNfR1BJT19CQU5LXyMjYmFuaykgKyAoZ3BpbykpCisjZGVmaW5lIEFTSUMzX0dQSU9fYml0KGdwaW8pICgxIDw8IChncGlvICYgMHhmKSkKKy8qIEFsbCBvZmZzZXRzIGJlbG93IGFyZSBzcGVjaWZpZWQgd2l0aCB0aGlzIGFkZHJlc3MgYnVzIHNoaWZ0ICovCisjZGVmaW5lIEFTSUMzX0RFRkFVTFRfQUREUl9TSElGVCAyCisKKyNkZWZpbmUgQVNJQzNfT0ZGU0VUKGJhc2UsIHJlZykgKEFTSUMzXyMjYmFzZSMjX0Jhc2UgKyBBU0lDM18jI2Jhc2UjI18jI3JlZykKKyNkZWZpbmUgQVNJQzNfR1BJT19PRkZTRVQoYmFzZSwgcmVnKSBcCisJKEFTSUMzX0dQSU9fIyNiYXNlIyNfQmFzZSArIEFTSUMzX0dQSU9fIyNyZWcpCisKKyNkZWZpbmUgQVNJQzNfR1BJT19BX0Jhc2UgICAgICAweDAwMDAKKyNkZWZpbmUgQVNJQzNfR1BJT19CX0Jhc2UgICAgICAweDAxMDAKKyNkZWZpbmUgQVNJQzNfR1BJT19DX0Jhc2UgICAgICAweDAyMDAKKyNkZWZpbmUgQVNJQzNfR1BJT19EX0Jhc2UgICAgICAweDAzMDAKKworI2RlZmluZSBBU0lDM19HUElPX01hc2sgICAgICAgICAgMHgwMCAgICAvKiBSL1cgMDpkb24ndCBtYXNrICovCisjZGVmaW5lIEFTSUMzX0dQSU9fRGlyZWN0aW9uICAgICAweDA0ICAgIC8qIFIvVyAwOmlucHV0ICovCisjZGVmaW5lIEFTSUMzX0dQSU9fT3V0ICAgICAgICAgICAweDA4ICAgIC8qIFIvVyAwOm91dHB1dCBsb3cgKi8KKyNkZWZpbmUgQVNJQzNfR1BJT19UcmlnZ2VyVHlwZSAgIDB4MGMgICAgLyogUi9XIDA6bGV2ZWwgKi8KKyNkZWZpbmUgQVNJQzNfR1BJT19FZGdlVHJpZ2dlciAgIDB4MTAgICAgLyogUi9XIDA6ZmFsbGluZyAqLworI2RlZmluZSBBU0lDM19HUElPX0xldmVsVHJpZ2dlciAgMHgxNCAgICAvKiBSL1cgMDpsb3cgbGV2ZWwgZGV0ZWN0ICovCisjZGVmaW5lIEFTSUMzX0dQSU9fU2xlZXBNYXNrICAgICAweDE4ICAgIC8qIFIvVyAwOmRvbid0IG1hc2sgaW4gc2xlZXAgbW9kZSAqLworI2RlZmluZSBBU0lDM19HUElPX1NsZWVwT3V0ICAgICAgMHgxYyAgICAvKiBSL1cgbGV2ZWwgMDpsb3cgaW4gc2xlZXAgbW9kZSAqLworI2RlZmluZSBBU0lDM19HUElPX0JhdHRGYXVsdE91dCAgMHgyMCAgICAvKiBSL1cgbGV2ZWwgMDpsb3cgaW4gYmF0dF9mYXVsdCAqLworI2RlZmluZSBBU0lDM19HUElPX0ludFN0YXR1cyAgICAgMHgyNCAgICAvKiBSL1cgMDpub25lLCAxOmRldGVjdCAqLworI2RlZmluZSBBU0lDM19HUElPX0FsdEZ1bmN0aW9uICAgMHgyOAkgLyogUi9XIDE6TEVEIHJlZ2lzdGVyIGNvbnRyb2wgKi8KKyNkZWZpbmUgQVNJQzNfR1BJT19TbGVlcENvbmYgICAgIDB4MmMgICAgLyoKKwkJCQkJICAqIFIvVyBiaXQgMTogYXV0b3NsZWVwCisJCQkJCSAgKiAwOiBkaXNhYmxlIGdwb3NscG91dCBpbiBub3JtYWwgbW9kZSwKKwkJCQkJICAqIGVuYWJsZSBncG9zbHBvdXQgaW4gc2xlZXAgbW9kZS4KKwkJCQkJICAqLworI2RlZmluZSBBU0lDM19HUElPX1N0YXR1cyAgICAgICAgMHgzMCAgICAvKiBSICAgUGluIHN0YXR1cyAqLworCisjZGVmaW5lIEFTSUMzX1NQSV9CYXNlCQkgICAgICAweDA0MDAKKyNkZWZpbmUgQVNJQzNfU1BJX0NvbnRyb2wgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgQVNJQzNfU1BJX1R4RGF0YSAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgQVNJQzNfU1BJX1J4RGF0YSAgICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgQVNJQzNfU1BJX0ludCAgICAgICAgICAgICAgICAgICAweDAwMGMKKyNkZWZpbmUgQVNJQzNfU1BJX1N0YXR1cyAgICAgICAgICAgICAgICAweDAwMTAKKworI2RlZmluZSBTUElfQ09OVFJPTF9TUFIoY2xrKSAgICAgICgoY2xrKSAmIDB4MGYpICAvKiBDbG9jayByYXRlICovCisKKyNkZWZpbmUgQVNJQzNfUFdNXzBfQmFzZSAgICAgICAgICAgICAgICAweDA1MDAKKyNkZWZpbmUgQVNJQzNfUFdNXzFfQmFzZSAgICAgICAgICAgICAgICAweDA2MDAKKyNkZWZpbmUgQVNJQzNfUFdNX1RpbWVCYXNlICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgQVNJQzNfUFdNX1BlcmlvZFRpbWUgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgQVNJQzNfUFdNX0R1dHlUaW1lICAgICAgICAgICAgICAweDAwMDgKKworI2RlZmluZSBQV01fVElNRUJBU0VfVkFMVUUoeCkgICAgKCh4KSYweGYpICAgLyogTG93IDQgYml0cyBzZXRzIHRpbWUgYmFzZSAqLworI2RlZmluZSBQV01fVElNRUJBU0VfRU5BQkxFICAgICAoMSA8PCA0KSAgIC8qIEVuYWJsZSBjbG9jayAqLworCisjZGVmaW5lIEFTSUMzX0xFRF8wX0Jhc2UgICAgICAgICAgICAgICAgMHgwNzAwCisjZGVmaW5lIEFTSUMzX0xFRF8xX0Jhc2UgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIEFTSUMzX0xFRF8yX0Jhc2UgCQkgICAgICAweDA5MDAKKyNkZWZpbmUgQVNJQzNfTEVEX1RpbWVCYXNlICAgICAgICAgICAgICAweDAwMDAgICAgLyogUi9XICA3IGJpdHMgKi8KKyNkZWZpbmUgQVNJQzNfTEVEX1BlcmlvZFRpbWUgICAgICAgICAgICAweDAwMDQgICAgLyogUi9XIDEyIGJpdHMgKi8KKyNkZWZpbmUgQVNJQzNfTEVEX0R1dHlUaW1lICAgICAgICAgICAgICAweDAwMDggICAgLyogUi9XIDEyIGJpdHMgKi8KKyNkZWZpbmUgQVNJQzNfTEVEX0F1dG9TdG9wQ291bnQgICAgICAgICAweDAwMGMgICAgLyogUi9XIDE2IGJpdHMgKi8KKworLyogTEVEIFRpbWVCYXNlIGJpdHMgLSBtYXRjaCBBU0lDMiAqLworI2RlZmluZSBMRURfVEJTCQkweDBmIC8qIExvdyA0IGJpdHMgc2V0cyB0aW1lIGJhc2UsIG1heCA9IDEzICovCisJCQkgICAgIC8qIE5vdGU6IG1heCA9IDUgb24gaHg0NzAwCSovCisJCQkgICAgIC8qIDA6IG1heGltdW0gdGltZSBiYXNlICovCisJCQkgICAgIC8qIDE6IG1heGltdW0gdGltZSBiYXNlIC8gMiAqLworCQkJICAgICAvKiBuOiBtYXhpbXVtIHRpbWUgYmFzZSAvIDJebiAqLworCisjZGVmaW5lIExFRF9FTgkJKDEgPDwgNCkgLyogTEVEIE9OL09GRiAwOm9mZiwgMTpvbiAqLworI2RlZmluZSBMRURfQVVUT1NUT1AJKDEgPDwgNSkgLyogTEVEIE9OL09GRiBhdXRvIHN0b3AgMDpkaXNhYmxlLCAxOmVuYWJsZSAqLworI2RlZmluZSBMRURfQUxXQVlTCSgxIDw8IDYpIC8qIExFRCBJbnRlcnJ1cHQgTWFzayAwOk5vIG1hc2ssIDE6bWFzayAqLworCisjZGVmaW5lIEFTSUMzX0NMT0NLX0Jhc2UJCTB4MEEwMAorI2RlZmluZSBBU0lDM19DTE9DS19DREVYICAgICAgICAgICAweDAwCisjZGVmaW5lIEFTSUMzX0NMT0NLX1NFTCAgICAgICAgICAgIDB4MDQKKworI2RlZmluZSBDTE9DS19DREVYX1NPVVJDRSAgICAgICAoMSA8PCAwKSAgLyogMiBiaXRzICovCisjZGVmaW5lIENMT0NLX0NERVhfU09VUkNFMCAgICAgICgxIDw8IDApCisjZGVmaW5lIENMT0NLX0NERVhfU09VUkNFMSAgICAgICgxIDw8IDEpCisjZGVmaW5lIENMT0NLX0NERVhfU1BJICAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIENMT0NLX0NERVhfT1dNICAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIENMT0NLX0NERVhfUFdNMCAgICAgICAgICgxIDw8IDQpCisjZGVmaW5lIENMT0NLX0NERVhfUFdNMSAgICAgICAgICgxIDw8IDUpCisjZGVmaW5lIENMT0NLX0NERVhfTEVEMCAgICAgICAgICgxIDw8IDYpCisjZGVmaW5lIENMT0NLX0NERVhfTEVEMSAgICAgICAgICgxIDw8IDcpCisjZGVmaW5lIENMT0NLX0NERVhfTEVEMiAgICAgICAgICgxIDw8IDgpCisKKy8qIENsb2NrcyBzZXR0aW5nczogMSBmb3IgMjQuNTc2IE1IeiwgMCBmb3IgMTIuMjg4TWh6ICovCisjZGVmaW5lIENMT0NLX0NERVhfU0RfSE9TVCAgICAgICgxIDw8IDkpICAgLyogUi9XOiBTRCBob3N0IGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBDTE9DS19DREVYX1NEX0JVUyAgICAgICAoMSA8PCAxMCkgIC8qIFIvVzogU0QgYnVzIGNsb2NrIHNvdXJjZSBjdHJsICovCisjZGVmaW5lIENMT0NLX0NERVhfU01CVVMgICAgICAgICgxIDw8IDExKQorI2RlZmluZSBDTE9DS19DREVYX0NPTlRST0xfQ1ggICAoMSA8PCAxMikKKworI2RlZmluZSBDTE9DS19DREVYX0VYMCAgICAgICAgICAoMSA8PCAxMykgIC8qIFIvVzogMzIuNzY4IGtIeiBjcnlzdGFsICovCisjZGVmaW5lIENMT0NLX0NERVhfRVgxICAgICAgICAgICgxIDw8IDE0KSAgLyogUi9XOiAyNC41NzYgTUh6IGNyeXN0YWwgKi8KKworI2RlZmluZSBDTE9DS19TRUxfU0RfSENMS19TRUwgICAoMSA8PCAwKSAgIC8qIFIvVzogU0RJTyBob3N0IGNsb2NrIHNlbGVjdCAqLworI2RlZmluZSBDTE9DS19TRUxfU0RfQkNMS19TRUwgICAoMSA8PCAxKSAgIC8qIFIvVzogU0RJTyBidXMgY2xvY2sgc2VsZWN0ICovCisKKy8qIFIvVzogSU5UIGNsb2NrIHNvdXJjZSBjb250cm9sICgzMi43Njgga0h6KSAqLworI2RlZmluZSBDTE9DS19TRUxfQ1ggICAgICAgICAgICAoMSA8PCAyKQorCisKKyNkZWZpbmUgQVNJQzNfSU5UUl9CYXNlCQkweDBCMDAKKworI2RlZmluZSBBU0lDM19JTlRSX0ludE1hc2sgICAgICAgMHgwMCAgLyogSW50ZXJydXB0IG1hc2sgY29udHJvbCAqLworI2RlZmluZSBBU0lDM19JTlRSX1BJbnRTdGF0ICAgICAgMHgwNCAgLyogUGVyaXBoZXJhbCBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIEFTSUMzX0lOVFJfSW50Q1BTICAgICAgICAweDA4ICAvKiBJbnRlcnJ1cHQgdGltZXIgY2xvY2sgcHJlLXNjYWxlICovCisjZGVmaW5lIEFTSUMzX0lOVFJfSW50VEJTICAgICAgICAweDBjICAvKiBJbnRlcnJ1cHQgdGltZXIgc2V0ICovCisKKyNkZWZpbmUgQVNJQzNfSU5UTUFTS19HSU5UTUFTSyAgICAoMSA8PCAwKSAgLyogR2xvYmFsIElOVHMgbWFzayAxOmVuYWJsZSAqLworI2RlZmluZSBBU0lDM19JTlRNQVNLX0dJTlRFTCAgICAgICgxIDw8IDEpICAvKiAxOiByaXNpbmcgZWRnZSwgMDogaGkgbGV2ZWwgKi8KKyNkZWZpbmUgQVNJQzNfSU5UTUFTS19NQVNLMCAgICAgICAoMSA8PCAyKQorI2RlZmluZSBBU0lDM19JTlRNQVNLX01BU0sxICAgICAgICgxIDw8IDMpCisjZGVmaW5lIEFTSUMzX0lOVE1BU0tfTUFTSzIgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgQVNJQzNfSU5UTUFTS19NQVNLMyAgICAgICAoMSA8PCA1KQorI2RlZmluZSBBU0lDM19JTlRNQVNLX01BU0s0ICAgICAgICgxIDw8IDYpCisjZGVmaW5lIEFTSUMzX0lOVE1BU0tfTUFTSzUgICAgICAgKDEgPDwgNykKKworI2RlZmluZSBBU0lDM19JTlRSX1BFUklQSEVSQUxfQSAgICgxIDw8IDApCisjZGVmaW5lIEFTSUMzX0lOVFJfUEVSSVBIRVJBTF9CICAgKDEgPDwgMSkKKyNkZWZpbmUgQVNJQzNfSU5UUl9QRVJJUEhFUkFMX0MgICAoMSA8PCAyKQorI2RlZmluZSBBU0lDM19JTlRSX1BFUklQSEVSQUxfRCAgICgxIDw8IDMpCisjZGVmaW5lIEFTSUMzX0lOVFJfTEVEMCAgICAgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgQVNJQzNfSU5UUl9MRUQxICAgICAgICAgICAoMSA8PCA1KQorI2RlZmluZSBBU0lDM19JTlRSX0xFRDIgICAgICAgICAgICgxIDw8IDYpCisjZGVmaW5lIEFTSUMzX0lOVFJfU1BJICAgICAgICAgICAgKDEgPDwgNykKKyNkZWZpbmUgQVNJQzNfSU5UUl9TTUJVUyAgICAgICAgICAoMSA8PCA4KQorI2RlZmluZSBBU0lDM19JTlRSX09XTSAgICAgICAgICAgICgxIDw8IDkpCisKKyNkZWZpbmUgQVNJQzNfSU5UUl9DUFMoeCkgICAgICAgICAoKHgpJjB4MGYpICAgIC8qIDQgYml0cywgbWF4IDE0ICovCisjZGVmaW5lIEFTSUMzX0lOVFJfQ1BTX1NFVCAgICAgICAgKDEgPDwgNCkgICAgLyogVGltZSBiYXNlIGVuYWJsZSAqLworCisKKy8qIEJhc2ljIGNvbnRyb2wgb2YgdGhlIFNEIEFTSUMgKi8KKyNkZWZpbmUgQVNJQzNfU0RIV0NUUkxfQmFzZQkweDBFMDAKKyNkZWZpbmUgQVNJQzNfU0RIV0NUUkxfU0RDb25mICAgIDB4MDAKKworI2RlZmluZSBBU0lDM19TREhXQ1RSTF9TVVNQRU5EICAgICgxIDw8IDApICAvKiAxPXN1c3BlbmQgYWxsIFNEIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgQVNJQzNfU0RIV0NUUkxfQ0xLU0VMICAgICAoMSA8PCAxKSAgLyogMT1TRElDSywgMD1IQ0xLICovCisjZGVmaW5lIEFTSUMzX1NESFdDVFJMX1BDTFIgICAgICAgKDEgPDwgMikgIC8qIEFsbCByZWdpc3RlcnMgb2YgU0RJTyBjbGVhcmVkICovCisjZGVmaW5lIEFTSUMzX1NESFdDVFJMX0xFVkNEICAgICAgKDEgPDwgMykgIC8qIFNEIGNhcmQgZGV0ZWN0aW9uOiAwOmxvdyAqLworCisvKiBTRCBjYXJkIHdyaXRlIHByb3RlY3Rpb246IDA9aGlnaCAqLworI2RlZmluZSBBU0lDM19TREhXQ1RSTF9MRVZXUCAgICAgICgxIDw8IDQpCisjZGVmaW5lIEFTSUMzX1NESFdDVFJMX1NETEVEICAgICAgKDEgPDwgNSkgIC8qIFNEIGNhcmQgTEVEIHNpZ25hbCAwPWRpc2FibGUgKi8KKworLyogU0QgY2FyZCBwb3dlciBzdXBwbHkgY3RybCAxPWVuYWJsZSAqLworI2RlZmluZSBBU0lDM19TREhXQ1RSTF9TRFBXUiAgICAgICgxIDw8IDYpCisKKyNkZWZpbmUgQVNJQzNfRVhUQ0ZfQmFzZQkJMHgxMTAwCisKKyNkZWZpbmUgQVNJQzNfRVhUQ0ZfU2VsZWN0ICAgICAgICAgMHgwMAorI2RlZmluZSBBU0lDM19FWFRDRl9SZXNldCAgICAgICAgICAweDA0CisKKyNkZWZpbmUgQVNJQzNfRVhUQ0ZfU01PRDAJICAgICAgICAgKDEgPDwgMCkgIC8qIHNsb3QgbnVtYmVyIG9mIG1vZGUgMCAqLworI2RlZmluZSBBU0lDM19FWFRDRl9TTU9EMQkgICAgICAgICAoMSA8PCAxKSAgLyogc2xvdCBudW1iZXIgb2YgbW9kZSAxICovCisjZGVmaW5lIEFTSUMzX0VYVENGX1NNT0QyCSAgICAgICAgICgxIDw8IDIpICAvKiBzbG90IG51bWJlciBvZiBtb2RlIDIgKi8KKyNkZWZpbmUgQVNJQzNfRVhUQ0ZfT1dNX0VOCSAgICAgICAgICgxIDw8IDQpICAvKiBlbmFibGUgb25ld2lyZSBtb2R1bGUgKi8KKyNkZWZpbmUgQVNJQzNfRVhUQ0ZfT1dNX1NNQgkgICAgICAgICAoMSA8PCA1KSAgLyogT1dNIGJ1cyBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgQVNJQzNfRVhUQ0ZfT1dNX1JFU0VUICAgICAgICAgICAgKDEgPDwgNikgIC8qID8/IHVzZWQgYnkgT1dNIGFuZCBDRiAqLworI2RlZmluZSBBU0lDM19FWFRDRl9DRjBfU0xFRVBfTU9ERSAgICAgICAoMSA8PCA3KSAgLyogQ0YwIHNsZWVwIHN0YXRlICovCisjZGVmaW5lIEFTSUMzX0VYVENGX0NGMV9TTEVFUF9NT0RFICAgICAgICgxIDw8IDgpICAvKiBDRjEgc2xlZXAgc3RhdGUgKi8KKyNkZWZpbmUgQVNJQzNfRVhUQ0ZfQ0YwX1BXQUlUX0VOICAgICAgICAgKDEgPDwgMTApIC8qIENGMCBQV0FJVF9uIGNvbnRyb2wgKi8KKyNkZWZpbmUgQVNJQzNfRVhUQ0ZfQ0YxX1BXQUlUX0VOICAgICAgICAgKDEgPDwgMTEpIC8qIENGMSBQV0FJVF9uIGNvbnRyb2wgKi8KKyNkZWZpbmUgQVNJQzNfRVhUQ0ZfQ0YwX0JVRl9FTiAgICAgICAgICAgKDEgPDwgMTIpIC8qIENGMCBidWZmZXIgY29udHJvbCAqLworI2RlZmluZSBBU0lDM19FWFRDRl9DRjFfQlVGX0VOICAgICAgICAgICAoMSA8PCAxMykgLyogQ0YxIGJ1ZmZlciBjb250cm9sICovCisjZGVmaW5lIEFTSUMzX0VYVENGX1NEX01FTV9FTkFCTEUgICAgICAgICgxIDw8IDE0KQorI2RlZmluZSBBU0lDM19FWFRDRl9DRl9TTEVFUCAgICAgICAgICAgICAoMSA8PCAxNSkgLyogQ0Ygc2xlZXAgbW9kZSBjb250cm9sICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBUaGUgT25ld2lyZSBpbnRlcmZhY2UgcmVnaXN0ZXJzCisgKgorICogIE9XTV9DTUQKKyAqICBPV01fREFUCisgKiAgT1dNX0lOVFIKKyAqICBPV01fSU5URU4KKyAqICBPV01fQ0xLRElWCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBBU0lDM19PV01fQmFzZQkJMHhDMDAKKworI2RlZmluZSBBU0lDM19PV01fQ01EICAgICAgICAgMHgwMAorI2RlZmluZSBBU0lDM19PV01fREFUICAgICAgICAgMHgwNAorI2RlZmluZSBBU0lDM19PV01fSU5UUiAgICAgICAgMHgwOAorI2RlZmluZSBBU0lDM19PV01fSU5URU4gICAgICAgMHgwQworI2RlZmluZSBBU0lDM19PV01fQ0xLRElWICAgICAgMHgxMAorCisjZGVmaW5lIEFTSUMzX09XTV9DTURfT05FV1IgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBBU0lDM19PV01fQ01EX1NSQSAgICAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgQVNJQzNfT1dNX0NNRF9EUU8gICAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIEFTSUMzX09XTV9DTURfRFFJICAgICAgICAgICAoMSA8PCAzKQorCisjZGVmaW5lIEFTSUMzX09XTV9JTlRSX1BEICAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIEFTSUMzX09XTV9JTlRSX1BEUiAgICAgICAgICgxIDw8IDEpCisjZGVmaW5lIEFTSUMzX09XTV9JTlRSX1RCRSAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIEFTSUMzX09XTV9JTlRSX1RFTVAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIEFTSUMzX09XTV9JTlRSX1JCRiAgICAgICAgICgxIDw8IDQpCisKKyNkZWZpbmUgQVNJQzNfT1dNX0lOVEVOX0VQRCAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgQVNJQzNfT1dNX0lOVEVOX0lBUyAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgQVNJQzNfT1dNX0lOVEVOX0VUQkUgICAgICAgKDEgPDwgMikKKyNkZWZpbmUgQVNJQzNfT1dNX0lOVEVOX0VUTVQgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgQVNJQzNfT1dNX0lOVEVOX0VSQkYgICAgICAgKDEgPDwgNCkKKworI2RlZmluZSBBU0lDM19PV01fQ0xLRElWX1BSRSAgICAgICAoMyA8PCAwKSAvKiB0d28gYml0cyB3aWRlIGF0IGJpdCAwICovCisjZGVmaW5lIEFTSUMzX09XTV9DTEtESVZfRElWICAgICAgICg3IDw8IDIpIC8qIDMgYml0cyB3aWRlIGF0IGJpdCAyICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgVGhlIFNEIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIGFyZSBhdCBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IGxvY2F0aW9uCisgKiAgaW4gbWVtb3J5LiAgVGhleSBhcmUgZGl2aWRlZCBpbnRvIHRocmVlIHNldHMgb2YgcmVnaXN0ZXJzOgorICoKKyAqICBTRF9DT05GSUcgICAgICAgICBDb3JlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIKKyAqICBTRF9DVFJMICAgICAgICAgICBDb250cm9sIHJlZ2lzdGVycyBmb3IgU0Qgb3BlcmF0aW9ucworICogIFNESU9fQ1RSTCAgICAgICAgIENvbnRyb2wgcmVnaXN0ZXJzIGZvciBTRElPIG9wZXJhdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEFTSUMzX1NEX0NPTkZJR19CYXNlICAgICAgICAgICAgMHgwNDAwIC8qIEFzc3VtZXMgMzIgYml0IGFkZHJlc3NpbmcgKi8KKworI2RlZmluZSBBU0lDM19TRF9DT05GSUdfQ29tbWFuZCAgICAgICAgICAgMHgwOCAgIC8qIFIvVzogQ29tbWFuZCAqLworCisvKiBbMDo4XSBTRCBDb250cm9sIFJlZ2lzdGVyIEJhc2UgQWRkcmVzcyAqLworI2RlZmluZSBBU0lDM19TRF9DT05GSUdfQWRkcjAgICAgICAgICAgICAgMHgyMAorCisvKiBbOTozMV0gU0QgQ29udHJvbCBSZWdpc3RlciBCYXNlIEFkZHJlc3MgKi8KKyNkZWZpbmUgQVNJQzNfU0RfQ09ORklHX0FkZHIxICAgICAgICAgICAgIDB4MjQKKworLyogUi9POiBpbnRlcnJ1cHQgYXNzaWduZWQgdG8gcGluICovCisjZGVmaW5lIEFTSUMzX1NEX0NPTkZJR19JbnRQaW4gICAgICAgICAgICAweDc4CisKKy8qCisgKiBTZXQgdG8gMHgxZiB0byBjbG9jayBTRCBjb250cm9sbGVyLCAwIG90aGVyd2lzZS4KKyAqIEF0IDB4ODIgLSBHYXRlZCBDbG9jayBDdHJsCisgKi8KKyNkZWZpbmUgQVNJQzNfU0RfQ09ORklHX0Nsa1N0b3AgICAgICAgICAgIDB4ODAKKworLyogQ29udHJvbCBjbG9jayBvZiBTRCBjb250cm9sbGVyICovCisjZGVmaW5lIEFTSUMzX1NEX0NPTkZJR19DbG9ja01vZGUgICAgICAgICAweDg0CisjZGVmaW5lIEFTSUMzX1NEX0NPTkZJR19TREhDX1BpblN0YXR1cyAgICAweDg4ICAgLyogUi8wOiBTRCBwaW5zIHN0YXR1cyAqLworI2RlZmluZSBBU0lDM19TRF9DT05GSUdfU0RIQ19Qb3dlcjEgICAgICAgMHg5MCAgIC8qIFBvd2VyMSAtIG1hbnVhbCBwd3IgY3RybCAqLworCisvKiBhdXRvIHBvd2VyIHVwIGFmdGVyIGNhcmQgaW5zZXJ0ZWQgKi8KKyNkZWZpbmUgQVNJQzNfU0RfQ09ORklHX1NESENfUG93ZXIyICAgICAgIDB4OTIKKworLyogYXV0byBwb3dlciBkb3duIHdoZW4gY2FyZCByZW1vdmVkICovCisjZGVmaW5lIEFTSUMzX1NEX0NPTkZJR19TREhDX1Bvd2VyMyAgICAgICAweDk0CisjZGVmaW5lIEFTSUMzX1NEX0NPTkZJR19TREhDX0NhcmREZXRlY3QgICAweDk4CisjZGVmaW5lIEFTSUMzX1NEX0NPTkZJR19TREhDX1Nsb3QgICAgICAgICAweEEwICAgLyogUi9POiBzdXBwb3J0IHNsb3QgbnVtYmVyICovCisjZGVmaW5lIEFTSUMzX1NEX0NPTkZJR19TREhDX0V4dEdhdGVDbGsxICAweDFFMCAgLyogTm90IHVzZWQgKi8KKyNkZWZpbmUgQVNJQzNfU0RfQ09ORklHX1NESENfRXh0R2F0ZUNsazIgIDB4MUUyICAvKiBOb3QgdXNlZCovCisKKy8qIEdQSU8gT3V0cHV0IFJlZy4gLCBhdCAweDFFQSAtIEdQSU8gT3V0cHV0IEVuYWJsZSBSZWcuICovCisjZGVmaW5lIEFTSUMzX1NEX0NPTkZJR19TREhDX0dQSU9fT3V0QW5kRW5hYmxlICAweDFFOAorI2RlZmluZSBBU0lDM19TRF9DT05GSUdfU0RIQ19HUElPX1N0YXR1cyAgMHgxRUMgIC8qIEdQSU8gU3RhdHVzIFJlZy4gKi8KKworLyogQml0IDE6IGRvdWJsZSBidWZmZXIvc2luZ2xlIGJ1ZmZlciAqLworI2RlZmluZSBBU0lDM19TRF9DT05GSUdfU0RIQ19FeHRHYXRlQ2xrMyAgMHgxRjAKKworLyogTWVtb3J5IGFjY2VzcyBlbmFibGUgKHNldCB0byAxIHRvIGFjY2VzcyBTRCBDb250cm9sbGVyKSAqLworI2RlZmluZSBTRF9DT05GSUdfQ09NTUFORF9NQUUgICAgICAgICAgICAgICAgKDE8PDEpCisKKyNkZWZpbmUgU0RfQ09ORklHX0NMS19FTkFCTEVfQUxMICAgICAgICAgICAgIDB4MWYKKworI2RlZmluZSBTRF9DT05GSUdfUE9XRVIxX1BDXzMzViAgICAgICAgICAgICAgMHgwMjAwICAgIC8qIFNldCBmb3IgMy4zIHZvbHRzICovCisjZGVmaW5lIFNEX0NPTkZJR19QT1dFUjFfUENfT0ZGICAgICAgICAgICAgICAweDAwMDAgICAgLyogVHVybiBvZmYgcG93ZXIgKi8KKworIC8qIHR3byBiaXRzIC0gbnVtYmVyIG9mIGN5Y2xlcyBmb3IgY2FyZCBkZXRlY3Rpb24gKi8KKyNkZWZpbmUgU0RfQ09ORklHX0NBUkRERVRFQ1RNT0RFX0NMSyAgICAgICAgICAgKCh4KSAmIDB4MykKKworCisjZGVmaW5lIEFTSUMzX1NEX0NUUkxfQmFzZSAgICAgICAgICAgIDB4MTAwMAorCisjZGVmaW5lIEFTSUMzX1NEX0NUUkxfQ21kICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBBU0lDM19TRF9DVFJMX0FyZzAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQVNJQzNfU0RfQ1RSTF9BcmcxICAgICAgICAgICAgICAgICAweDBDCisjZGVmaW5lIEFTSUMzX1NEX0NUUkxfU3RvcEludGVybmFsICAgICAgICAgMHgxMAorI2RlZmluZSBBU0lDM19TRF9DVFJMX1RyYW5zZmVyU2VjdG9yQ291bnQgIDB4MTQKKyNkZWZpbmUgQVNJQzNfU0RfQ1RSTF9SZXNwb25zZTAgICAgICAgICAgICAweDE4CisjZGVmaW5lIEFTSUMzX1NEX0NUUkxfUmVzcG9uc2UxICAgICAgICAgICAgMHgxQworI2RlZmluZSBBU0lDM19TRF9DVFJMX1Jlc3BvbnNlMiAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgQVNJQzNfU0RfQ1RSTF9SZXNwb25zZTMgICAgICAgICAgICAweDI0CisjZGVmaW5lIEFTSUMzX1NEX0NUUkxfUmVzcG9uc2U0ICAgICAgICAgICAgMHgyOAorI2RlZmluZSBBU0lDM19TRF9DVFJMX1Jlc3BvbnNlNSAgICAgICAgICAgIDB4MkMKKyNkZWZpbmUgQVNJQzNfU0RfQ1RSTF9SZXNwb25zZTYgICAgICAgICAgICAweDMwCisjZGVmaW5lIEFTSUMzX1NEX0NUUkxfUmVzcG9uc2U3ICAgICAgICAgICAgMHgzNAorI2RlZmluZSBBU0lDM19TRF9DVFJMX0NhcmRTdGF0dXMgICAgICAgICAgIDB4MzgKKyNkZWZpbmUgQVNJQzNfU0RfQ1RSTF9CdWZmZXJDdHJsICAgICAgICAgICAweDNDCisjZGVmaW5lIEFTSUMzX1NEX0NUUkxfSW50TWFza0NhcmQgICAgICAgICAgMHg0MAorI2RlZmluZSBBU0lDM19TRF9DVFJMX0ludE1hc2tCdWZmZXIgICAgICAgIDB4NDQKKyNkZWZpbmUgQVNJQzNfU0RfQ1RSTF9DYXJkQ2xvY2tDdHJsICAgICAgICAweDQ4CisjZGVmaW5lIEFTSUMzX1NEX0NUUkxfTWVtQ2FyZFhmZXJEYXRhTGVuICAgMHg0QworI2RlZmluZSBBU0lDM19TRF9DVFJMX01lbUNhcmRPcHRpb25TZXR1cCAgIDB4NTAKKyNkZWZpbmUgQVNJQzNfU0RfQ1RSTF9FcnJvclN0YXR1czAgICAgICAgICAweDU4CisjZGVmaW5lIEFTSUMzX1NEX0NUUkxfRXJyb3JTdGF0dXMxICAgICAgICAgMHg1QworI2RlZmluZSBBU0lDM19TRF9DVFJMX0RhdGFQb3J0ICAgICAgICAgICAgIDB4NjAKKyNkZWZpbmUgQVNJQzNfU0RfQ1RSTF9UcmFuc2FjdGlvbkN0cmwgICAgICAweDY4CisjZGVmaW5lIEFTSUMzX1NEX0NUUkxfU29mdHdhcmVSZXNldCAgICAgICAgMHgxQzAKKworI2RlZmluZSBTRF9DVFJMX1NPRlRXQVJFX1JFU0VUX0NMRUFSICAgICAgICAgICAgKDE8PDApCisKKyNkZWZpbmUgU0RfQ1RSTF9UUkFOU0FDVElPTkNPTlRST0xfU0VUICAgICAgICAgICgxPDw4KQorCisjZGVmaW5lIFNEX0NUUkxfQ0FSRENMT0NLQ09OVFJPTF9GT1JfU0RfQ0FSRCAgICAoMTw8MTUpCisjZGVmaW5lIFNEX0NUUkxfQ0FSRENMT0NLQ09OVFJPTF9FTkFCTEVfQ0xPQ0sgICAoMTw8OCkKKyNkZWZpbmUgU0RfQ1RSTF9DQVJEQ0xPQ0tDT05UUk9MX0NMS19ESVZfNTEyICAgICgxPDw3KQorI2RlZmluZSBTRF9DVFJMX0NBUkRDTE9DS0NPTlRST0xfQ0xLX0RJVl8yNTYgICAgKDE8PDYpCisjZGVmaW5lIFNEX0NUUkxfQ0FSRENMT0NLQ09OVFJPTF9DTEtfRElWXzEyOCAgICAoMTw8NSkKKyNkZWZpbmUgU0RfQ1RSTF9DQVJEQ0xPQ0tDT05UUk9MX0NMS19ESVZfNjQgICAgICgxPDw0KQorI2RlZmluZSBTRF9DVFJMX0NBUkRDTE9DS0NPTlRST0xfQ0xLX0RJVl8zMiAgICAgKDE8PDMpCisjZGVmaW5lIFNEX0NUUkxfQ0FSRENMT0NLQ09OVFJPTF9DTEtfRElWXzE2ICAgICAoMTw8MikKKyNkZWZpbmUgU0RfQ1RSTF9DQVJEQ0xPQ0tDT05UUk9MX0NMS19ESVZfOCAgICAgICgxPDwxKQorI2RlZmluZSBTRF9DVFJMX0NBUkRDTE9DS0NPTlRST0xfQ0xLX0RJVl80ICAgICAgKDE8PDApCisjZGVmaW5lIFNEX0NUUkxfQ0FSRENMT0NLQ09OVFJPTF9DTEtfRElWXzIgICAgICAoMDw8MCkKKworI2RlZmluZSBNRU1fQ0FSRF9PUFRJT05fUkVRVUlSRUQgICAgICAgICAgICAgICAgICAgMHgwMDBlCisjZGVmaW5lIE1FTV9DQVJEX09QVElPTl9EQVRBX1JFU1BPTlNFX1RJTUVPVVQoeCkgICAoKCh4KSAmIDB4MGYpIDw8IDQpCisjZGVmaW5lIE1FTV9DQVJEX09QVElPTl9DMl9NT0RVTEVfTk9UX1BSRVNFTlQgICAgICAoMTw8MTQpCisjZGVmaW5lIE1FTV9DQVJEX09QVElPTl9EQVRBX1hGUl9XSURUSF8xICAgICAgICAgICAoMTw8MTUpCisjZGVmaW5lIE1FTV9DQVJEX09QVElPTl9EQVRBX1hGUl9XSURUSF80ICAgICAgICAgICAwCisKKyNkZWZpbmUgU0RfQ1RSTF9DT01NQU5EX0lOREVYKHgpICAgICAgICAgICAgICAgICAgICgoeCkgJiAweDNmKQorI2RlZmluZSBTRF9DVFJMX0NPTU1BTkRfVFlQRV9DTUQgICAgICAgICAgICAgICAgICAgKDAgPDwgNikKKyNkZWZpbmUgU0RfQ1RSTF9DT01NQU5EX1RZUEVfQUNNRCAgICAgICAgICAgICAgICAgICgxIDw8IDYpCisjZGVmaW5lIFNEX0NUUkxfQ09NTUFORF9UWVBFX0FVVEhFTlRJQ0FUSU9OICAgICAgICAoMiA8PCA2KQorI2RlZmluZSBTRF9DVFJMX0NPTU1BTkRfUkVTUE9OU0VfVFlQRV9OT1JNQUwgICAgICAgKDAgPDwgOCkKKyNkZWZpbmUgU0RfQ1RSTF9DT01NQU5EX1JFU1BPTlNFX1RZUEVfRVhUX1IxICAgICAgICg0IDw8IDgpCisjZGVmaW5lIFNEX0NUUkxfQ09NTUFORF9SRVNQT05TRV9UWVBFX0VYVF9SMUIgICAgICAoNSA8PCA4KQorI2RlZmluZSBTRF9DVFJMX0NPTU1BTkRfUkVTUE9OU0VfVFlQRV9FWFRfUjIgICAgICAgKDYgPDwgOCkKKyNkZWZpbmUgU0RfQ1RSTF9DT01NQU5EX1JFU1BPTlNFX1RZUEVfRVhUX1IzICAgICAgICg3IDw8IDgpCisjZGVmaW5lIFNEX0NUUkxfQ09NTUFORF9EQVRBX1BSRVNFTlQgICAgICAgICAgICAgICAoMSA8PCAxMSkKKyNkZWZpbmUgU0RfQ1RSTF9DT01NQU5EX1RSQU5TRkVSX1JFQUQgICAgICAgICAgICAgICgxIDw8IDEyKQorI2RlZmluZSBTRF9DVFJMX0NPTU1BTkRfVFJBTlNGRVJfV1JJVEUgICAgICAgICAgICAgKDAgPDwgMTIpCisjZGVmaW5lIFNEX0NUUkxfQ09NTUFORF9NVUxUSV9CTE9DSyAgICAgICAgICAgICAgICAoMSA8PCAxMykKKyNkZWZpbmUgU0RfQ1RSTF9DT01NQU5EX1NFQ1VSSVRZX0NNRCAgICAgICAgICAgICAgICgxIDw8IDE0KQorCisjZGVmaW5lIFNEX0NUUkxfU1RPUF9JTlRFUk5BTF9JU1NTVUVfQ01EMTIgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBTRF9DVFJMX1NUT1BfSU5URVJOQUxfQVVUT19JU1NVRV9DTUQxMiAgICAgKDEgPDwgOCkKKworI2RlZmluZSBTRF9DVFJMX0NBUkRTVEFUVVNfUkVTUE9OU0VfRU5EICAgICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgU0RfQ1RSTF9DQVJEU1RBVFVTX1JXX0VORCAgICAgICAgICAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIFNEX0NUUkxfQ0FSRFNUQVRVU19DQVJEX1JFTU9WRURfMCAgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBTRF9DVFJMX0NBUkRTVEFUVVNfQ0FSRF9JTlNFUlRFRF8wICAgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgU0RfQ1RSTF9DQVJEU1RBVFVTX1NJR05BTF9TVEFURV9QUkVTRU5UXzAgICgxIDw8IDUpCisjZGVmaW5lIFNEX0NUUkxfQ0FSRFNUQVRVU19XUklURV9QUk9URUNUICAgICAgICAgICAoMSA8PCA3KQorI2RlZmluZSBTRF9DVFJMX0NBUkRTVEFUVVNfQ0FSRF9SRU1PVkVEXzMgICAgICAgICAgKDEgPDwgOCkKKyNkZWZpbmUgU0RfQ1RSTF9DQVJEU1RBVFVTX0NBUkRfSU5TRVJURURfMyAgICAgICAgICgxIDw8IDkpCisjZGVmaW5lIFNEX0NUUkxfQ0FSRFNUQVRVU19TSUdOQUxfU1RBVEVfUFJFU0VOVF8zICAoMSA8PCAxMCkKKworI2RlZmluZSBTRF9DVFJMX0JVRkZFUlNUQVRVU19DTURfSU5ERVhfRVJST1IgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgU0RfQ1RSTF9CVUZGRVJTVEFUVVNfQ1JDX0VSUk9SICAgICAgICAgICAgICgxIDw8IDEpCisjZGVmaW5lIFNEX0NUUkxfQlVGRkVSU1RBVFVTX1NUT1BfQklUX0VORF9FUlJPUiAgICAoMSA8PCAyKQorI2RlZmluZSBTRF9DVFJMX0JVRkZFUlNUQVRVU19EQVRBX1RJTUVPVVQgICAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgU0RfQ1RSTF9CVUZGRVJTVEFUVVNfQlVGRkVSX09WRVJGTE9XICAgICAgICgxIDw8IDQpCisjZGVmaW5lIFNEX0NUUkxfQlVGRkVSU1RBVFVTX0JVRkZFUl9VTkRFUkZMT1cgICAgICAoMSA8PCA1KQorI2RlZmluZSBTRF9DVFJMX0JVRkZFUlNUQVRVU19DTURfVElNRU9VVCAgICAgICAgICAgKDEgPDwgNikKKyNkZWZpbmUgU0RfQ1RSTF9CVUZGRVJTVEFUVVNfVU5LNyAgICAgICAgICAgICAgICAgICgxIDw8IDcpCisjZGVmaW5lIFNEX0NUUkxfQlVGRkVSU1RBVFVTX0JVRkZFUl9SRUFEX0VOQUJMRSAgICAoMSA8PCA4KQorI2RlZmluZSBTRF9DVFJMX0JVRkZFUlNUQVRVU19CVUZGRVJfV1JJVEVfRU5BQkxFICAgKDEgPDwgOSkKKyNkZWZpbmUgU0RfQ1RSTF9CVUZGRVJTVEFUVVNfSUxMRUdBTF9GVU5DVElPTiAgICAgICgxIDw8IDEzKQorI2RlZmluZSBTRF9DVFJMX0JVRkZFUlNUQVRVU19DTURfQlVTWSAgICAgICAgICAgICAgKDEgPDwgMTQpCisjZGVmaW5lIFNEX0NUUkxfQlVGRkVSU1RBVFVTX0lMTEVHQUxfQUNDRVNTICAgICAgICAoMSA8PCAxNSkKKworI2RlZmluZSBTRF9DVFJMX0lOVE1BU0tDQVJEX1JFU1BPTlNFX0VORCAgICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgU0RfQ1RSTF9JTlRNQVNLQ0FSRF9SV19FTkQgICAgICAgICAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIFNEX0NUUkxfSU5UTUFTS0NBUkRfQ0FSRF9SRU1PVkVEXzAgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBTRF9DVFJMX0lOVE1BU0tDQVJEX0NBUkRfSU5TRVJURURfMCAgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgU0RfQ1RSTF9JTlRNQVNLQ0FSRF9TSUdOQUxfU1RBVEVfUFJFU0VOVF8wICgxIDw8IDUpCisjZGVmaW5lIFNEX0NUUkxfSU5UTUFTS0NBUkRfVU5LNiAgICAgICAgICAgICAgICAgICAoMSA8PCA2KQorI2RlZmluZSBTRF9DVFJMX0lOVE1BU0tDQVJEX1dSSVRFX1BST1RFQ1QgICAgICAgICAgKDEgPDwgNykKKyNkZWZpbmUgU0RfQ1RSTF9JTlRNQVNLQ0FSRF9DQVJEX1JFTU9WRURfMyAgICAgICAgICgxIDw8IDgpCisjZGVmaW5lIFNEX0NUUkxfSU5UTUFTS0NBUkRfQ0FSRF9JTlNFUlRFRF8zICAgICAgICAoMSA8PCA5KQorI2RlZmluZSBTRF9DVFJMX0lOVE1BU0tDQVJEX1NJR05BTF9TVEFURV9QUkVTRU5UXzMgKDEgPDwgMTApCisKKyNkZWZpbmUgU0RfQ1RSTF9JTlRNQVNLQlVGRkVSX0NNRF9JTkRFWF9FUlJPUiAgICAgICgxIDw8IDApCisjZGVmaW5lIFNEX0NUUkxfSU5UTUFTS0JVRkZFUl9DUkNfRVJST1IgICAgICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBTRF9DVFJMX0lOVE1BU0tCVUZGRVJfU1RPUF9CSVRfRU5EX0VSUk9SICAgKDEgPDwgMikKKyNkZWZpbmUgU0RfQ1RSTF9JTlRNQVNLQlVGRkVSX0RBVEFfVElNRU9VVCAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIFNEX0NUUkxfSU5UTUFTS0JVRkZFUl9CVUZGRVJfT1ZFUkZMT1cgICAgICAoMSA8PCA0KQorI2RlZmluZSBTRF9DVFJMX0lOVE1BU0tCVUZGRVJfQlVGRkVSX1VOREVSRkxPVyAgICAgKDEgPDwgNSkKKyNkZWZpbmUgU0RfQ1RSTF9JTlRNQVNLQlVGRkVSX0NNRF9USU1FT1VUICAgICAgICAgICgxIDw8IDYpCisjZGVmaW5lIFNEX0NUUkxfSU5UTUFTS0JVRkZFUl9VTks3ICAgICAgICAgICAgICAgICAoMSA8PCA3KQorI2RlZmluZSBTRF9DVFJMX0lOVE1BU0tCVUZGRVJfQlVGRkVSX1JFQURfRU5BQkxFICAgKDEgPDwgOCkKKyNkZWZpbmUgU0RfQ1RSTF9JTlRNQVNLQlVGRkVSX0JVRkZFUl9XUklURV9FTkFCTEUgICgxIDw8IDkpCisjZGVmaW5lIFNEX0NUUkxfSU5UTUFTS0JVRkZFUl9JTExFR0FMX0ZVTkNUSU9OICAgICAoMSA8PCAxMykKKyNkZWZpbmUgU0RfQ1RSTF9JTlRNQVNLQlVGRkVSX0NNRF9CVVNZICAgICAgICAgICAgICgxIDw8IDE0KQorI2RlZmluZSBTRF9DVFJMX0lOVE1BU0tCVUZGRVJfSUxMRUdBTF9BQ0NFU1MgICAgICAgKDEgPDwgMTUpCisKKyNkZWZpbmUgU0RfQ1RSTF9ERVRBSUwwX1JFU1BPTlNFX0NNRF9FUlJPUiAgICAgICAgICAgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBTRF9DVFJMX0RFVEFJTDBfRU5EX0JJVF9FUlJPUl9GT1JfUkVTUE9OU0VfTk9OX0NNRDEyICgxIDw8IDIpCisjZGVmaW5lIFNEX0NUUkxfREVUQUlMMF9FTkRfQklUX0VSUk9SX0ZPUl9SRVNQT05TRV9DTUQxMiAgICAgKDEgPDwgMykKKyNkZWZpbmUgU0RfQ1RSTF9ERVRBSUwwX0VORF9CSVRfRVJST1JfRk9SX1JFQURfREFUQSAgICAgICAgICAoMSA8PCA0KQorI2RlZmluZSBTRF9DVFJMX0RFVEFJTDBfRU5EX0JJVF9FUlJPUl9GT1JfV1JJVEVfQ1JDX1NUQVRVUyAgICgxIDw8IDUpCisjZGVmaW5lIFNEX0NUUkxfREVUQUlMMF9DUkNfRVJST1JfRk9SX1JFU1BPTlNFX05PTl9DTUQxMiAgICAgKDEgPDwgOCkKKyNkZWZpbmUgU0RfQ1RSTF9ERVRBSUwwX0NSQ19FUlJPUl9GT1JfUkVTUE9OU0VfQ01EMTIgICAgICAgICAoMSA8PCA5KQorI2RlZmluZSBTRF9DVFJMX0RFVEFJTDBfQ1JDX0VSUk9SX0ZPUl9SRUFEX0RBVEEgICAgICAgICAgICAgICgxIDw8IDEwKQorI2RlZmluZSBTRF9DVFJMX0RFVEFJTDBfQ1JDX0VSUk9SX0ZPUl9XUklURV9DTUQgICAgICAgICAgICAgICgxIDw8IDExKQorCisjZGVmaW5lIFNEX0NUUkxfREVUQUlMMV9OT19DTURfUkVTUE9OU0UgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgU0RfQ1RSTF9ERVRBSUwxX1RJTUVPVVRfUkVBRF9EQVRBICAgICAgICAgICAgICAgICAgICAoMSA8PCA0KQorI2RlZmluZSBTRF9DVFJMX0RFVEFJTDFfVElNRU9VVF9DUlNfU1RBVFVTICAgICAgICAgICAgICAgICAgICgxIDw8IDUpCisjZGVmaW5lIFNEX0NUUkxfREVUQUlMMV9USU1FT1VUX0NSQ19CVVNZICAgICAgICAgICAgICAgICAgICAgKDEgPDwgNikKKworI2RlZmluZSBBU0lDM19TRElPX0NUUkxfQmFzZSAgICAgICAgICAweDEyMDAKKworI2RlZmluZSBBU0lDM19TRElPX0NUUkxfQ21kICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBBU0lDM19TRElPX0NUUkxfQ2FyZFBvcnRTZWwgICAgICAgICAgMHgwNAorI2RlZmluZSBBU0lDM19TRElPX0NUUkxfQXJnMCAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBBU0lDM19TRElPX0NUUkxfQXJnMSAgICAgICAgICAgICAgICAgMHgwQworI2RlZmluZSBBU0lDM19TRElPX0NUUkxfVHJhbnNmZXJCbG9ja0NvdW50ICAgMHgxNAorI2RlZmluZSBBU0lDM19TRElPX0NUUkxfUmVzcG9uc2UwICAgICAgICAgICAgMHgxOAorI2RlZmluZSBBU0lDM19TRElPX0NUUkxfUmVzcG9uc2UxICAgICAgICAgICAgMHgxQworI2RlZmluZSBBU0lDM19TRElPX0NUUkxfUmVzcG9uc2UyICAgICAgICAgICAgMHgyMAorI2RlZmluZSBBU0lDM19TRElPX0NUUkxfUmVzcG9uc2UzICAgICAgICAgICAgMHgyNAorI2RlZmluZSBBU0lDM19TRElPX0NUUkxfUmVzcG9uc2U0ICAgICAgICAgICAgMHgyOAorI2RlZmluZSBBU0lDM19TRElPX0NUUkxfUmVzcG9uc2U1ICAgICAgICAgICAgMHgyQworI2RlZmluZSBBU0lDM19TRElPX0NUUkxfUmVzcG9uc2U2ICAgICAgICAgICAgMHgzMAorI2RlZmluZSBBU0lDM19TRElPX0NUUkxfUmVzcG9uc2U3ICAgICAgICAgICAgMHgzNAorI2RlZmluZSBBU0lDM19TRElPX0NUUkxfQ2FyZFN0YXR1cyAgICAgICAgICAgMHgzOAorI2RlZmluZSBBU0lDM19TRElPX0NUUkxfQnVmZmVyQ3RybCAgICAgICAgICAgMHgzQworI2RlZmluZSBBU0lDM19TRElPX0NUUkxfSW50TWFza0NhcmQgICAgICAgICAgMHg0MAorI2RlZmluZSBBU0lDM19TRElPX0NUUkxfSW50TWFza0J1ZmZlciAgICAgICAgMHg0NAorI2RlZmluZSBBU0lDM19TRElPX0NUUkxfQ2FyZFhmZXJEYXRhTGVuICAgICAgMHg0QworI2RlZmluZSBBU0lDM19TRElPX0NUUkxfQ2FyZE9wdGlvblNldHVwICAgICAgMHg1MAorI2RlZmluZSBBU0lDM19TRElPX0NUUkxfRXJyb3JTdGF0dXMwICAgICAgICAgMHg1NAorI2RlZmluZSBBU0lDM19TRElPX0NUUkxfRXJyb3JTdGF0dXMxICAgICAgICAgMHg1OAorI2RlZmluZSBBU0lDM19TRElPX0NUUkxfRGF0YVBvcnQgICAgICAgICAgICAgMHg2MAorI2RlZmluZSBBU0lDM19TRElPX0NUUkxfVHJhbnNhY3Rpb25DdHJsICAgICAgMHg2OAorI2RlZmluZSBBU0lDM19TRElPX0NUUkxfQ2FyZEludEN0cmwgICAgICAgICAgMHg2QworI2RlZmluZSBBU0lDM19TRElPX0NUUkxfQ2xvY2tuV2FpdEN0cmwgICAgICAgMHg3MAorI2RlZmluZSBBU0lDM19TRElPX0NUUkxfSG9zdEluZm9ybWF0aW9uICAgICAgMHg3NAorI2RlZmluZSBBU0lDM19TRElPX0NUUkxfRXJyb3JDdHJsICAgICAgICAgICAgMHg3OAorI2RlZmluZSBBU0lDM19TRElPX0NUUkxfTEVEQ3RybCAgICAgICAgICAgICAgMHg3QworI2RlZmluZSBBU0lDM19TRElPX0NUUkxfU29mdHdhcmVSZXNldCAgICAgICAgMHgxQzAKKworI2RlZmluZSBBU0lDM19NQVBfU0laRQkgICAgIAkJICAgICAweDIwMDAKKworI2VuZGlmIC8qIF9fQVNJQzNfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21seDQvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L21seDQvZGV2aWNlLmgKaW5kZXggMjIyODE1ZC4uNmNkZjgxMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbHg0L2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWx4NC9kZXZpY2UuaApAQCAtMTMzLDYgKzEzMywxMSBAQAogCU1MWDRfU1RBVF9SQVRFX09GRlNFVAk9IDUKIH07CiAKK3N0YXRpYyBpbmxpbmUgdTY0IG1seDRfZndfdmVyKHU2NCBtYWpvciwgdTY0IG1pbm9yLCB1NjQgc3VibWlub3IpCit7CisJcmV0dXJuIChtYWpvciA8PCAzMikgfCAobWlub3IgPDwgMTYpIHwgc3VibWlub3I7Cit9CisKIHN0cnVjdCBtbHg0X2NhcHMgewogCXU2NAkJCWZ3X3ZlcjsKIAlpbnQJCQludW1fcG9ydHM7CkBAIC0xODksMTAgKzE5NCw4IEBACiB9OwogCiBzdHJ1Y3QgbWx4NF9idWYgewotCXVuaW9uIHsKLQkJc3RydWN0IG1seDRfYnVmX2xpc3QJZGlyZWN0OwotCQlzdHJ1Y3QgbWx4NF9idWZfbGlzdCAgICpwYWdlX2xpc3Q7Ci0JfSB1OworCXN0cnVjdCBtbHg0X2J1Zl9saXN0CWRpcmVjdDsKKwlzdHJ1Y3QgbWx4NF9idWZfbGlzdCAgICpwYWdlX2xpc3Q7CiAJaW50CQkJbmJ1ZnM7CiAJaW50CQkJbnBhZ2VzOwogCWludAkJCXBhZ2Vfc2hpZnQ7CkBAIC0zMDgsNiArMzExLDE0IEBACiBpbnQgbWx4NF9idWZfYWxsb2Moc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzaXplLCBpbnQgbWF4X2RpcmVjdCwKIAkJICAgc3RydWN0IG1seDRfYnVmICpidWYpOwogdm9pZCBtbHg0X2J1Zl9mcmVlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2l6ZSwgc3RydWN0IG1seDRfYnVmICpidWYpOworc3RhdGljIGlubGluZSB2b2lkICptbHg0X2J1Zl9vZmZzZXQoc3RydWN0IG1seDRfYnVmICpidWYsIGludCBvZmZzZXQpCit7CisJaWYgKEJJVFNfUEVSX0xPTkcgPT0gNjQgfHwgYnVmLT5uYnVmcyA9PSAxKQorCQlyZXR1cm4gYnVmLT5kaXJlY3QuYnVmICsgb2Zmc2V0OworCWVsc2UKKwkJcmV0dXJuIGJ1Zi0+cGFnZV9saXN0W29mZnNldCA+PiBQQUdFX1NISUZUXS5idWYgKworCQkJKG9mZnNldCAmIChQQUdFX1NJWkUgLSAxKSk7Cit9CiAKIGludCBtbHg0X3BkX2FsbG9jKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgKnBkbik7CiB2b2lkIG1seDRfcGRfZnJlZShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTMyIHBkbik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21seDQvcXAuaCBiL2luY2x1ZGUvbGludXgvbWx4NC9xcC5oCmluZGV4IDM5NjhiOTQuLjA5YTIyMzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWx4NC9xcC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWx4NC9xcC5oCkBAIC0xNTQsNyArMTU0LDExIEBACiAJdTMyCQkJcmVzZXJ2ZWQ1WzEwXTsKIH07CiAKKy8qIFdoaWNoIGZpcm13YXJlIHZlcnNpb24gYWRkcyBzdXBwb3J0IGZvciBORUMgKE5vRXJyb3JDb21wbGV0aW9uKSBiaXQgKi8KKyNkZWZpbmUgTUxYNF9GV19WRVJfV1FFX0NUUkxfTkVDIG1seDRfZndfdmVyKDIsIDIsIDIzMikKKwogZW51bSB7CisJTUxYNF9XUUVfQ1RSTF9ORUMJPSAxIDw8IDI5LAogCU1MWDRfV1FFX0NUUkxfRkVOQ0UJPSAxIDw8IDYsCiAJTUxYNF9XUUVfQ1RSTF9DUV9VUERBVEUJPSAzIDw8IDIsCiAJTUxYNF9XUUVfQ1RSTF9TT0xJQ0lURUQJPSAxIDw8IDEsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmgKaW5kZXggODlkN2M2OS4uZThhYmIzOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW0uaApAQCAtODk0LDYgKzg5NCwxOCBAQAogI2RlZmluZSBwdGVfbG9ja3B0cihtbSwgcG1kKQkoeyh2b2lkKShwbWQpOyAmKG1tKS0+cGFnZV90YWJsZV9sb2NrO30pCiAjZW5kaWYgLyogTlJfQ1BVUyA8IENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUyAqLwogCitzdGF0aWMgaW5saW5lIHZvaWQgcGd0YWJsZV9wYWdlX2N0b3Ioc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcHRlX2xvY2tfaW5pdChwYWdlKTsKKwlpbmNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX1BBR0VUQUJMRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwZ3RhYmxlX3BhZ2VfZHRvcihzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlwdGVfbG9ja19kZWluaXQocGFnZSk7CisJZGVjX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9QQUdFVEFCTEUpOworfQorCiAjZGVmaW5lIHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkcmVzcywgcHRscCkJXAogKHsJCQkJCQkJXAogCXNwaW5sb2NrX3QgKl9fcHRsID0gcHRlX2xvY2twdHIobW0sIHBtZCk7CVwKQEAgLTExMzYsNyArMTE0OCw3IEBACiAjZGVmaW5lIEZPTExfR0VUCTB4MDQJLyogZG8gZ2V0X3BhZ2Ugb24gcGFnZSAqLwogI2RlZmluZSBGT0xMX0FOT04JMHgwOAkvKiBnaXZlIFpFUk9fUEFHRSBpZiBubyBwZ3RhYmxlICovCiAKLXR5cGVkZWYgaW50ICgqcHRlX2ZuX3QpKHB0ZV90ICpwdGUsIHN0cnVjdCBwYWdlICpwbWRfcGFnZSwgdW5zaWduZWQgbG9uZyBhZGRyLAordHlwZWRlZiBpbnQgKCpwdGVfZm5fdCkocHRlX3QgKnB0ZSwgcGd0YWJsZV90IHRva2VuLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQl2b2lkICpkYXRhKTsKIGV4dGVybiBpbnQgYXBwbHlfdG9fcGFnZV9yYW5nZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgcHRlX2ZuX3QgZm4sIHZvaWQgKmRhdGEpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbV90eXBlcy5oIGIvaW5jbHVkZS9saW51eC9tbV90eXBlcy5oCmluZGV4IGY0YzAzZTAuLmJmZWUwYmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1fdHlwZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tX3R5cGVzLmgKQEAgLTY0LDcgKzY0LDEwIEBACiAjaWYgTlJfQ1BVUyA+PSBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVMKIAkgICAgc3BpbmxvY2tfdCBwdGw7CiAjZW5kaWYKLQkgICAgc3RydWN0IGttZW1fY2FjaGUgKnNsYWI7CS8qIFNMVUI6IFBvaW50ZXIgdG8gc2xhYiAqLworCSAgICBzdHJ1Y3QgeworCQkgICBzdHJ1Y3Qga21lbV9jYWNoZSAqc2xhYjsJLyogU0xVQjogUG9pbnRlciB0byBzbGFiICovCisJCSAgIHZvaWQgKmVuZDsJCQkvKiBTTFVCOiBlbmQgbWFya2VyICovCisJICAgIH07CiAJICAgIHN0cnVjdCBwYWdlICpmaXJzdF9wYWdlOwkvKiBDb21wb3VuZCB0YWlsIHBhZ2VzICovCiAJfTsKIAl1bmlvbiB7CkBAIC04OCw2ICs5MSw5IEBACiAJdm9pZCAqdmlydHVhbDsJCQkvKiBLZXJuZWwgdmlydHVhbCBhZGRyZXNzIChOVUxMIGlmCiAJCQkJCSAgIG5vdCBrbWFwcGVkLCBpZS4gaGlnaG1lbSkgKi8KICNlbmRpZiAvKiBXQU5UX1BBR0VfVklSVFVBTCAqLworI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX0NPTlQKKwl1bnNpZ25lZCBsb25nIHBhZ2VfY2dyb3VwOworI2VuZGlmCiB9OwogCiAvKgpAQCAtMjE5LDYgKzIyNSw5IEBACiAJLyogYWlvIGJpdHMgKi8KIAlyd2xvY2tfdAkJaW9jdHhfbGlzdF9sb2NrOwogCXN0cnVjdCBraW9jdHgJCSppb2N0eF9saXN0OworI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX0NPTlQKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtX2Nncm91cDsKKyNlbmRpZgogfTsKIAogI2VuZGlmIC8qIF9MSU5VWF9NTV9UWVBFU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oIGIvaW5jbHVkZS9saW51eC9tb2R1bGUuaAppbmRleCBhYzQ4MWUyLi5hYzI4ZTg3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKQEAgLTQ0OSw3ICs0NDksNyBAQAogLyogRm9yIGthbGxzeW1zIHRvIGFzayBmb3IgYWRkcmVzcyByZXNvbHV0aW9uLiAgbmFtZWJ1ZiBzaG91bGQgYmUgYXQKICAqIGxlYXN0IEtTWU1fTkFNRV9MRU4gbG9uZzogYSBwb2ludGVyIHRvIG5hbWVidWYgaXMgcmV0dXJuZWQgaWYKICAqIGZvdW5kLCBvdGhlcndpc2UgTlVMTC4gKi8KLWNoYXIgKm1vZHVsZV9hZGRyZXNzX2xvb2t1cCh1bnNpZ25lZCBsb25nIGFkZHIsCitjb25zdCBjaGFyICptb2R1bGVfYWRkcmVzc19sb29rdXAodW5zaWduZWQgbG9uZyBhZGRyLAogCQkJICAgIHVuc2lnbmVkIGxvbmcgKnN5bWJvbHNpemUsCiAJCQkgICAgdW5zaWduZWQgbG9uZyAqb2Zmc2V0LAogCQkJICAgIGNoYXIgKiptb2RuYW1lLApAQCAtNTE5LDcgKzUxOSw3IEBACiAjZGVmaW5lIG1vZHVsZV9uYW1lKG1vZCkgImtlcm5lbCIKIAogLyogRm9yIGthbGxzeW1zIHRvIGFzayBmb3IgYWRkcmVzcyByZXNvbHV0aW9uLiAgTlVMTCBtZWFucyBub3QgZm91bmQuICovCi1zdGF0aWMgaW5saW5lIGNoYXIgKm1vZHVsZV9hZGRyZXNzX2xvb2t1cCh1bnNpZ25lZCBsb25nIGFkZHIsCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKm1vZHVsZV9hZGRyZXNzX2xvb2t1cCh1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkJCSAgdW5zaWduZWQgbG9uZyAqc3ltYm9sc2l6ZSwKIAkJCQkJICB1bnNpZ25lZCBsb25nICpvZmZzZXQsCiAJCQkJCSAgY2hhciAqKm1vZG5hbWUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9jZmkuaCBiL2luY2x1ZGUvbGludXgvbXRkL2NmaS5oCmluZGV4IGUxN2M1MzQuLmIwZGRmNGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXRkL2NmaS5oCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL2NmaS5oCkBAIC05OCw2ICs5OCwxOCBAQAogI2RlZmluZSBDRklfREVWSUNFVFlQRV9YMzIgKDMyIC8gOCkKICNkZWZpbmUgQ0ZJX0RFVklDRVRZUEVfWDY0ICg2NCAvIDgpCiAKKworLyogRGV2aWNlIEludGVyZmFjZSBDb2RlIEFzc2lnbm1lbnRzIGZyb20gdGhlICJDb21tb24gRmxhc2ggTWVtb3J5IEludGVyZmFjZQorICogUHVibGljYXRpb24gMTAwIiBkYXRlZCBEZWNlbWJlciAxLCAyMDAxLgorICovCisjZGVmaW5lIENGSV9JTlRFUkZBQ0VfWDhfQVNZTkMJCTB4MDAwMAorI2RlZmluZSBDRklfSU5URVJGQUNFX1gxNl9BU1lOQwkJMHgwMDAxCisjZGVmaW5lIENGSV9JTlRFUkZBQ0VfWDhfQllfWDE2X0FTWU5DCTB4MDAwMgorI2RlZmluZSBDRklfSU5URVJGQUNFX1gzMl9BU1lOQwkJMHgwMDAzCisjZGVmaW5lIENGSV9JTlRFUkZBQ0VfWDE2X0JZX1gzMl9BU1lOQwkweDAwMDUKKyNkZWZpbmUgQ0ZJX0lOVEVSRkFDRV9OT1RfQUxMT1dFRAkweGZmZmYKKworCiAvKiBOQjogV2Uga2VlcCB0aGVzZSBzdHJ1Y3R1cmVzIGluIG1lbW9yeSBpbiBIT1NUIGJ5dGVvcmRlciwgZXhjZXB0CiAgKiB3aGVyZSBpbmRpdmlkdWFsbHkgbm90ZWQuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL210ZC5oIGIvaW5jbHVkZS9saW51eC9tdGQvbXRkLmgKaW5kZXggNzgzZmM5OC4uMGExM2JiMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tdGQvbXRkLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvbXRkLmgKQEAgLTE1Miw2ICsxNTIsMTUgQEAKIAlpbnQgKCpyZWFkKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpOwogCWludCAoKndyaXRlKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCB0bywgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIGNvbnN0IHVfY2hhciAqYnVmKTsKIAorCS8qIEluIGJsYWNrYm94IGZsaWdodCByZWNvcmRlciBsaWtlIHNjZW5hcmlvcyB3ZSB3YW50IHRvIG1ha2Ugc3VjY2Vzc2Z1bAorCSAgIHdyaXRlcyBpbiBpbnRlcnJ1cHQgY29udGV4dC4gcGFuaWNfd3JpdGUoKSBpcyBvbmx5IGludGVuZGVkIHRvIGJlCisJICAgY2FsbGVkIHdoZW4gaXRzIGtub3duIHRoZSBrZXJuZWwgaXMgYWJvdXQgdG8gcGFuaWMgYW5kIHdlIG5lZWQgdGhlCisJICAgd3JpdGUgdG8gc3VjY2VlZC4gU2luY2UgdGhlIGtlcm5lbCBpcyBub3QgZ29pbmcgdG8gYmUgcnVubmluZyBmb3IgbXVjaAorCSAgIGxvbmdlciwgdGhpcyBmdW5jdGlvbiBjYW4gYnJlYWsgbG9ja3MgYW5kIGRlbGF5IHRvIGVuc3VyZSB0aGUgd3JpdGUKKwkgICBzdWNjZWVkcyAoYnV0IG5vdCBzbGVlcCkuICovCisKKwlpbnQgKCpwYW5pY193cml0ZSkgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgdG8sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCBjb25zdCB1X2NoYXIgKmJ1Zik7CisKIAlpbnQgKCpyZWFkX29vYikgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwKIAkJCSBzdHJ1Y3QgbXRkX29vYl9vcHMgKm9wcyk7CiAJaW50ICgqd3JpdGVfb29iKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCB0bywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL210ZHJhbS5oIGIvaW5jbHVkZS9saW51eC9tdGQvbXRkcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRmZGMwNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL210ZHJhbS5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfX01URF9NVERSQU1fSF9fCisjZGVmaW5lIF9fTVREX01URFJBTV9IX18KKworI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KK2ludCBtdGRyYW1faW5pdF9kZXZpY2Uoc3RydWN0IG10ZF9pbmZvICptdGQsIHZvaWQgKm1hcHBlZF9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIGNoYXIgKm5hbWUpOworCisjZW5kaWYgLyogX19NVERfTVREUkFNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvb25lbmFuZF9yZWdzLmggYi9pbmNsdWRlL2xpbnV4L210ZC9vbmVuYW5kX3JlZ3MuaAppbmRleCBjNDYxNjFmLi5kMWIzMTBjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9vbmVuYW5kX3JlZ3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9vbmVuYW5kX3JlZ3MuaApAQCAtNjcsNiArNjcsNyBAQAogLyoKICAqIERldmljZSBJRCBSZWdpc3RlciBGMDAxaCAoUikKICAqLworI2RlZmluZSBPTkVOQU5EX0RFVklDRV9ERU5TSVRZX01BU0sJKDB4ZikKICNkZWZpbmUgT05FTkFORF9ERVZJQ0VfREVOU0lUWV9TSElGVAkoNCkKICNkZWZpbmUgT05FTkFORF9ERVZJQ0VfSVNfRERQCQkoMSA8PCAzKQogI2RlZmluZSBPTkVOQU5EX0RFVklDRV9JU19ERU1VWAkJKDEgPDwgMikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL3BhcnRpdGlvbnMuaCBiL2luY2x1ZGUvbGludXgvbXRkL3BhcnRpdGlvbnMuaAppbmRleCBkYTZiM2Q2Li43YzM3ZDdlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9wYXJ0aXRpb25zLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvcGFydGl0aW9ucy5oCkBAIC03MSw1ICs3MSwxMiBAQAogCiAjZGVmaW5lIHB1dF9wYXJ0aXRpb25fcGFyc2VyKHApIGRvIHsgbW9kdWxlX3B1dCgocCktPm93bmVyKTsgfSB3aGlsZSgwKQogCi0jZW5kaWYKK3N0cnVjdCBkZXZpY2U7CitzdHJ1Y3QgZGV2aWNlX25vZGU7CiAKK2ludCBfX2RldmluaXQgb2ZfbXRkX3BhcnNlX3BhcnRpdGlvbnMoc3RydWN0IGRldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqKnBwYXJ0cyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvdWJpLmggYi9pbmNsdWRlL2xpbnV4L210ZC91YmkuaAppbmRleCAzZDk2N2I2Li5mNzEyMDFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC91YmkuaAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC91YmkuaApAQCAtMjYsMjMgKzI2LDYgQEAKICNpbmNsdWRlIDxtdGQvdWJpLXVzZXIuaD4KIAogLyoKLSAqIFVCSSBkYXRhIHR5cGUgaGludCBjb25zdGFudHMuCi0gKgotICogVUJJX0xPTkdURVJNOiBsb25nLXRlcm0gZGF0YQotICogVUJJX1NIT1JUVEVSTTogc2hvcnQtdGVybSBkYXRhCi0gKiBVQklfVU5LTk9XTjogZGF0YSBwZXJzaXN0ZW5jZSBpcyB1bmtub3duCi0gKgotICogVGhlc2UgY29uc3RhbnRzIGFyZSB1c2VkIHdoZW4gZGF0YSBpcyB3cml0dGVuIHRvIFVCSSB2b2x1bWVzIGluIG9yZGVyIHRvCi0gKiBoZWxwIHRoZSBVQkkgd2Vhci1sZXZlbGluZyB1bml0IHRvIGZpbmQgbW9yZSBhcHByb3ByaWF0ZSBwaHlzaWNhbAotICogZXJhc2VibG9ja3MuCi0gKi8KLWVudW0gewotCVVCSV9MT05HVEVSTSA9IDEsCi0JVUJJX1NIT1JUVEVSTSwKLQlVQklfVU5LTk9XTgotfTsKLQotLyoKICAqIGVudW0gdWJpX29wZW5fbW9kZSAtIFVCSSB2b2x1bWUgb3BlbiBtb2RlIGNvbnN0YW50cy4KICAqCiAgKiBVQklfUkVBRE9OTFk6IHJlYWQtb25seSBtb2RlCkBAIC0xNjcsNiArMTUwLDcgQEAKIAkJICAgaW50IGxlbiwgaW50IGR0eXBlKTsKIGludCB1YmlfbGViX2VyYXNlKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MsIGludCBsbnVtKTsKIGludCB1YmlfbGViX3VubWFwKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MsIGludCBsbnVtKTsKK2ludCB1YmlfbGViX21hcChzdHJ1Y3QgdWJpX3ZvbHVtZV9kZXNjICpkZXNjLCBpbnQgbG51bSwgaW50IGR0eXBlKTsKIGludCB1YmlfaXNfbWFwcGVkKHN0cnVjdCB1Ymlfdm9sdW1lX2Rlc2MgKmRlc2MsIGludCBsbnVtKTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXV0ZXguaCBiL2luY2x1ZGUvbGludXgvbXV0ZXguaAppbmRleCAwNWM1OTAzLi5iYzZkYTEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L211dGV4LmgKKysrIGIvaW5jbHVkZS9saW51eC9tdXRleC5oCkBAIC0xMTIsNyArMTEyLDcgQEAKICAqCiAgKiBSZXR1cm5zIDEgaWYgdGhlIG11dGV4IGlzIGxvY2tlZCwgMCBpZiB1bmxvY2tlZC4KICAqLwotc3RhdGljIGlubGluZSBpbnQgZmFzdGNhbGwgbXV0ZXhfaXNfbG9ja2VkKHN0cnVjdCBtdXRleCAqbG9jaykKK3N0YXRpYyBpbmxpbmUgaW50IG11dGV4X2lzX2xvY2tlZChzdHJ1Y3QgbXV0ZXggKmxvY2spCiB7CiAJcmV0dXJuIGF0b21pY19yZWFkKCZsb2NrLT5jb3VudCkgIT0gMTsKIH0KQEAgLTEzMiw5ICsxMzIsOSBAQAogI2RlZmluZSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUobG9jaykgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlX25lc3RlZChsb2NrLCAwKQogI2RlZmluZSBtdXRleF9sb2NrX2tpbGxhYmxlKGxvY2spIG11dGV4X2xvY2tfa2lsbGFibGVfbmVzdGVkKGxvY2ssIDApCiAjZWxzZQotZXh0ZXJuIHZvaWQgZmFzdGNhbGwgbXV0ZXhfbG9jayhzdHJ1Y3QgbXV0ZXggKmxvY2spOwotZXh0ZXJuIGludCBfX211c3RfY2hlY2sgZmFzdGNhbGwgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKHN0cnVjdCBtdXRleCAqbG9jayk7Ci1leHRlcm4gaW50IF9fbXVzdF9jaGVjayBmYXN0Y2FsbCBtdXRleF9sb2NrX2tpbGxhYmxlKHN0cnVjdCBtdXRleCAqbG9jayk7CitleHRlcm4gdm9pZCBtdXRleF9sb2NrKHN0cnVjdCBtdXRleCAqbG9jayk7CitleHRlcm4gaW50IF9fbXVzdF9jaGVjayBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoc3RydWN0IG11dGV4ICpsb2NrKTsKK2V4dGVybiBpbnQgX19tdXN0X2NoZWNrIG11dGV4X2xvY2tfa2lsbGFibGUoc3RydWN0IG11dGV4ICpsb2NrKTsKIAogIyBkZWZpbmUgbXV0ZXhfbG9ja19uZXN0ZWQobG9jaywgc3ViY2xhc3MpIG11dGV4X2xvY2sobG9jaykKICMgZGVmaW5lIG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZV9uZXN0ZWQobG9jaywgc3ViY2xhc3MpIG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZShsb2NrKQpAQCAtMTQ1LDcgKzE0NSw3IEBACiAgKiBOT1RFOiBtdXRleF90cnlsb2NrKCkgZm9sbG93cyB0aGUgc3Bpbl90cnlsb2NrKCkgY29udmVudGlvbiwKICAqICAgICAgIG5vdCB0aGUgZG93bl90cnlsb2NrKCkgY29udmVudGlvbiEKICAqLwotZXh0ZXJuIGludCBmYXN0Y2FsbCBtdXRleF90cnlsb2NrKHN0cnVjdCBtdXRleCAqbG9jayk7Ci1leHRlcm4gdm9pZCBmYXN0Y2FsbCBtdXRleF91bmxvY2soc3RydWN0IG11dGV4ICpsb2NrKTsKK2V4dGVybiBpbnQgbXV0ZXhfdHJ5bG9jayhzdHJ1Y3QgbXV0ZXggKmxvY2spOworZXh0ZXJuIHZvaWQgbXV0ZXhfdW5sb2NrKHN0cnVjdCBtdXRleCAqbG9jayk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uYmQuaCBiL2luY2x1ZGUvbGludXgvbmJkLmgKaW5kZXggY2MyYjQ3Mi4uOTg2NTcyMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uYmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25iZC5oCkBAIC0zNSw3ICszNSw2IEBACiB9OwogCiAjZGVmaW5lIG5iZF9jbWQocmVxKSAoKHJlcSktPmNtZFswXSkKLSNkZWZpbmUgTUFYX05CRCAxMjgKIAogLyogdXNlcnNwYWNlIGRvZXNuJ3QgbmVlZCB0aGUgbmJkX2RldmljZSBzdHJ1Y3R1cmUgKi8KICNpZmRlZiBfX0tFUk5FTF9fCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mLmggYi9pbmNsdWRlL2xpbnV4L29mLmgKaW5kZXggYjVmMzNlZi4uNjk4MTAxNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZi5oCisrKyBiL2luY2x1ZGUvbGludXgvb2YuaApAQCAtNTAsNiArNTAsNyBAQAogZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZmluZF9ub2RlX2J5X3BhdGgoY29uc3QgY2hhciAqcGF0aCk7CiBleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpvZl9maW5kX25vZGVfYnlfcGhhbmRsZShwaGFuZGxlIGhhbmRsZSk7CiBleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpvZl9nZXRfcGFyZW50KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSk7CitleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpvZl9nZXRfbmV4dF9wYXJlbnQoc3RydWN0IGRldmljZV9ub2RlICpub2RlKTsKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dldF9uZXh0X2NoaWxkKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKIAkJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKnByZXYpOwogI2RlZmluZSBmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKHBhcmVudCwgY2hpbGQpIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGZrZXl2Mi5oIGIvaW5jbHVkZS9saW51eC9wZmtleXYyLmgKaW5kZXggNmRiNjlmZi4uNzAwNzI1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wZmtleXYyLmgKKysrIGIvaW5jbHVkZS9saW51eC9wZmtleXYyLmgKQEAgLTI5OCw2ICsyOTgsNyBAQAogI2RlZmluZSBTQURCX1hfRUFMR19CTE9XRklTSENCQwkJNwogI2RlZmluZSBTQURCX0VBTEdfTlVMTAkJCTExCiAjZGVmaW5lIFNBREJfWF9FQUxHX0FFU0NCQwkJMTIKKyNkZWZpbmUgU0FEQl9YX0VBTEdfQUVTQ1RSCQkxMwogI2RlZmluZSBTQURCX1hfRUFMR19BRVNfQ0NNX0lDVjgJMTQKICNkZWZpbmUgU0FEQl9YX0VBTEdfQUVTX0NDTV9JQ1YxMgkxNQogI2RlZmluZSBTQURCX1hfRUFMR19BRVNfQ0NNX0lDVjE2CTE2CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BpZC5oIGIvaW5jbHVkZS9saW51eC9waWQuaAppbmRleCBlMjlhOTAwLi5mODRkNTMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BpZC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGlkLmgKQEAgLTExOCwxOCArMTE4LDE3IEBACiAgKi8KIGV4dGVybiBzdHJ1Y3QgcGlkICpmaW5kX2dldF9waWQoaW50IG5yKTsKIGV4dGVybiBzdHJ1Y3QgcGlkICpmaW5kX2dlX3BpZChpbnQgbnIsIHN0cnVjdCBwaWRfbmFtZXNwYWNlICopOworaW50IG5leHRfcGlkbWFwKHN0cnVjdCBwaWRfbmFtZXNwYWNlICpwaWRfbnMsIGludCBsYXN0KTsKIAogZXh0ZXJuIHN0cnVjdCBwaWQgKmFsbG9jX3BpZChzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMpOwogZXh0ZXJuIHZvaWQgRkFTVENBTEwoZnJlZV9waWQoc3RydWN0IHBpZCAqcGlkKSk7Ci1leHRlcm4gdm9pZCB6YXBfcGlkX25zX3Byb2Nlc3NlcyhzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqcGlkX25zKTsKIAogLyoKICAqIHRoZSBoZWxwZXJzIHRvIGdldCB0aGUgcGlkJ3MgaWQgc2VlbiBmcm9tIGRpZmZlcmVudCBuYW1lc3BhY2VzCiAgKgogICogcGlkX25yKCkgICAgOiBnbG9iYWwgaWQsIGkuZS4gdGhlIGlkIHNlZW4gZnJvbSB0aGUgaW5pdCBuYW1lc3BhY2U7Ci0gKiBwaWRfdm5yKCkgICA6IHZpcnR1YWwgaWQsIGkuZS4gdGhlIGlkIHNlZW4gZnJvbSB0aGUgbmFtZXNwYWNlIHRoaXMgcGlkCi0gKiAgICAgICAgICAgICAgIGJlbG9uZ3MgdG8uIHRoaXMgb25seSBtYWtlcyBzZW5jZSB3aGVuIGNhbGxlZCBpbiB0aGUKLSAqICAgICAgICAgICAgICAgY29udGV4dCBvZiB0aGUgdGFzayB0aGF0IGJlbG9uZ3MgdG8gdGhlIHNhbWUgbmFtZXNwYWNlOworICogcGlkX3ZucigpICAgOiB2aXJ0dWFsIGlkLCBpLmUuIHRoZSBpZCBzZWVuIGZyb20gdGhlIHBpZCBuYW1lc3BhY2Ugb2YKKyAqICAgICAgICAgICAgICAgY3VycmVudC4KICAqIHBpZF9ucl9ucygpIDogaWQgc2VlbiBmcm9tIHRoZSBucyBzcGVjaWZpZWQuCiAgKgogICogc2VlIGFsc28gdGFza194aWRfbnIoKSBldGMgaW4gaW5jbHVkZS9saW51eC9zY2hlZC5oCkBAIC0xNDQsMTQgKzE0Myw3IEBACiB9CiAKIHBpZF90IHBpZF9ucl9ucyhzdHJ1Y3QgcGlkICpwaWQsIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpucyk7Ci0KLXN0YXRpYyBpbmxpbmUgcGlkX3QgcGlkX3ZucihzdHJ1Y3QgcGlkICpwaWQpCi17Ci0JcGlkX3QgbnIgPSAwOwotCWlmIChwaWQpCi0JCW5yID0gcGlkLT5udW1iZXJzW3BpZC0+bGV2ZWxdLm5yOwotCXJldHVybiBucjsKLX0KK3BpZF90IHBpZF92bnIoc3RydWN0IHBpZCAqcGlkKTsKIAogI2RlZmluZSBkb19lYWNoX3BpZF90YXNrKHBpZCwgdHlwZSwgdGFzaykJCQkJXAogCWRvIHsJCQkJCQkJCVwKQEAgLTE2MCw3ICsxNTIsMTMgQEAKIAkJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSgodGFzayksIHBvc19fXywJXAogCQkJCSZwaWQtPnRhc2tzW3R5cGVdLCBwaWRzW3R5cGVdLm5vZGUpIHsKIAorCQkJLyoKKwkJCSAqIEJvdGggb2xkIGFuZCBuZXcgbGVhZGVycyBtYXkgYmUgYXR0YWNoZWQgdG8KKwkJCSAqIHRoZSBzYW1lIHBpZCBpbiB0aGUgbWlkZGxlIG9mIGRlX3RocmVhZCgpLgorCQkJICovCiAjZGVmaW5lIHdoaWxlX2VhY2hfcGlkX3Rhc2socGlkLCB0eXBlLCB0YXNrKQkJCQlcCisJCQkJaWYgKHR5cGUgPT0gUElEVFlQRV9QSUQpCQlcCisJCQkJCWJyZWFrOwkJCQlcCiAJCQl9CQkJCQkJXAogCX0gd2hpbGUgKDApCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGlkX25hbWVzcGFjZS5oIGIvaW5jbHVkZS9saW51eC9waWRfbmFtZXNwYWNlLmgKaW5kZXggMTY4OWUyOC4uZmNkNjFmYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9waWRfbmFtZXNwYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9waWRfbmFtZXNwYWNlLmgKQEAgLTM5LDYgKzM5LDcgQEAKIAogZXh0ZXJuIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpjb3B5X3BpZF9ucyh1bnNpZ25lZCBsb25nIGZsYWdzLCBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMpOwogZXh0ZXJuIHZvaWQgZnJlZV9waWRfbnMoc3RydWN0IGtyZWYgKmtyZWYpOworZXh0ZXJuIHZvaWQgemFwX3BpZF9uc19wcm9jZXNzZXMoc3RydWN0IHBpZF9uYW1lc3BhY2UgKnBpZF9ucyk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfcGlkX25zKHN0cnVjdCBwaWRfbmFtZXNwYWNlICpucykKIHsKQEAgLTY2LDYgKzY3LDExIEBACiB7CiB9CiAKKworc3RhdGljIGlubGluZSB2b2lkIHphcF9waWRfbnNfcHJvY2Vzc2VzKHN0cnVjdCBwaWRfbmFtZXNwYWNlICpucykKK3sKKwlCVUcoKTsKK30KICNlbmRpZiAvKiBDT05GSUdfUElEX05TICovCiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBpZF9uYW1lc3BhY2UgKnRhc2tfYWN0aXZlX3BpZF9ucyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG93ZXJfc3VwcGx5LmggYi9pbmNsdWRlL2xpbnV4L3Bvd2VyX3N1cHBseS5oCmluZGV4IDVjYmYzZTMuLjY4ZWQxOWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcG93ZXJfc3VwcGx5LmgKKysrIGIvaW5jbHVkZS9saW51eC9wb3dlcl9zdXBwbHkuaApAQCAtOTQsNiArOTQsNyBAQAogCS8qIFByb3BlcnRpZXMgb2YgdHlwZSBgY29uc3QgY2hhciAqJyAqLwogCVBPV0VSX1NVUFBMWV9QUk9QX01PREVMX05BTUUsCiAJUE9XRVJfU1VQUExZX1BST1BfTUFOVUZBQ1RVUkVSLAorCVBPV0VSX1NVUFBMWV9QUk9QX1NFUklBTF9OVU1CRVIsCiB9OwogCiBlbnVtIHBvd2VyX3N1cHBseV90eXBlIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHJlZW1wdC5oIGIvaW5jbHVkZS9saW51eC9wcmVlbXB0LmgKaW5kZXggNDg0OTg4ZS4uMjNmMGM1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wcmVlbXB0LmgKKysrIGIvaW5jbHVkZS9saW51eC9wcmVlbXB0LmgKQEAgLTExLDggKzExLDggQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAKICNpZmRlZiBDT05GSUdfREVCVUdfUFJFRU1QVAotICBleHRlcm4gdm9pZCBmYXN0Y2FsbCBhZGRfcHJlZW1wdF9jb3VudChpbnQgdmFsKTsKLSAgZXh0ZXJuIHZvaWQgZmFzdGNhbGwgc3ViX3ByZWVtcHRfY291bnQoaW50IHZhbCk7CisgIGV4dGVybiB2b2lkIGFkZF9wcmVlbXB0X2NvdW50KGludCB2YWwpOworICBleHRlcm4gdm9pZCBzdWJfcHJlZW1wdF9jb3VudChpbnQgdmFsKTsKICNlbHNlCiAjIGRlZmluZSBhZGRfcHJlZW1wdF9jb3VudCh2YWwpCWRvIHsgcHJlZW1wdF9jb3VudCgpICs9ICh2YWwpOyB9IHdoaWxlICgwKQogIyBkZWZpbmUgc3ViX3ByZWVtcHRfY291bnQodmFsKQlkbyB7IHByZWVtcHRfY291bnQoKSAtPSAodmFsKTsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHJvY19mcy5oIGIvaW5jbHVkZS9saW51eC9wcm9jX2ZzLmgKaW5kZXggZTQzNTUxNS4uZDZhNGY2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wcm9jX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wcm9jX2ZzLmgKQEAgLTExOCwxMyArMTE4LDE3IEBACiBpbnQgcHJvY19waWRfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqIGZpbHAsIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKTsKIHVuc2lnbmVkIGxvbmcgdGFza192c2l6ZShzdHJ1Y3QgbW1fc3RydWN0ICopOwogaW50IHRhc2tfc3RhdG0oc3RydWN0IG1tX3N0cnVjdCAqLCBpbnQgKiwgaW50ICosIGludCAqLCBpbnQgKik7Ci1jaGFyICp0YXNrX21lbShzdHJ1Y3QgbW1fc3RydWN0ICosIGNoYXIgKik7Cit2b2lkIHRhc2tfbWVtKHN0cnVjdCBzZXFfZmlsZSAqLCBzdHJ1Y3QgbW1fc3RydWN0ICopOwordm9pZCBjbGVhcl9yZWZzX3NtYXAoc3RydWN0IG1tX3N0cnVjdCAqbW0pOwogCiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlX2dldChzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlKTsKIHZvaWQgZGVfcHV0KHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGUpOwogCiBleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICpjcmVhdGVfcHJvY19lbnRyeShjb25zdCBjaGFyICpuYW1lLCBtb2RlX3QgbW9kZSwKIAkJCQkJCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGFyZW50KTsKK3N0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwgbW9kZV90IG1vZGUsCisJCQkJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwYXJlbnQsCisJCQkJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqcHJvY19mb3BzKTsKIGV4dGVybiB2b2lkIHJlbW92ZV9wcm9jX2VudHJ5KGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGFyZW50KTsKIAogZXh0ZXJuIHN0cnVjdCB2ZnNtb3VudCAqcHJvY19tbnQ7CkBAIC0yMTksNyArMjIzLDEyIEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpjcmVhdGVfcHJvY19lbnRyeShjb25zdCBjaGFyICpuYW1lLAogCW1vZGVfdCBtb2RlLCBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBhcmVudCkgeyByZXR1cm4gTlVMTDsgfQotCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwKKwltb2RlX3QgbW9kZSwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwYXJlbnQsCisJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqcHJvY19mb3BzKQoreworCXJldHVybiBOVUxMOworfQogI2RlZmluZSByZW1vdmVfcHJvY19lbnRyeShuYW1lLCBwYXJlbnQpIGRvIHt9IHdoaWxlICgwKQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19zeW1saW5rKGNvbnN0IGNoYXIgKm5hbWUsCkBAIC0yNjIsNiArMjcxLDkgQEAKIHVuaW9uIHByb2Nfb3AgewogCWludCAoKnByb2NfZ2V0X2xpbmspKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICoqLCBzdHJ1Y3QgdmZzbW91bnQgKiopOwogCWludCAoKnByb2NfcmVhZCkoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICpwYWdlKTsKKwlpbnQgKCpwcm9jX3Nob3cpKHN0cnVjdCBzZXFfZmlsZSAqbSwKKwkJc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zLCBzdHJ1Y3QgcGlkICpwaWQsCisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiB9OwogCiBzdHJ1Y3QgcHJvY19pbm9kZSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3B0cmFjZS5oIGIvaW5jbHVkZS9saW51eC9wdHJhY2UuaAppbmRleCA2YWI4MDcxLi5lYmUwYzE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3B0cmFjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcHRyYWNlLmgKQEAgLTY3LDcgKzY3LDYgQEAKICNkZWZpbmUgUFRfVFJBQ0VfRVhFQwkweDAwMDAwMDgwCiAjZGVmaW5lIFBUX1RSQUNFX1ZGT1JLX0RPTkUJMHgwMDAwMDEwMAogI2RlZmluZSBQVF9UUkFDRV9FWElUCTB4MDAwMDAyMDAKLSNkZWZpbmUgUFRfQVRUQUNIRUQJMHgwMDAwMDQwMAkvKiBwYXJlbnQgIT0gcmVhbF9wYXJlbnQgKi8KIAogI2RlZmluZSBQVF9UUkFDRV9NQVNLCTB4MDAwMDAzZjQKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xbng0X2ZzLmggYi9pbmNsdWRlL2xpbnV4L3FueDRfZnMuaAppbmRleCAxOWJjOWI4Li4zNGExOTZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3FueDRfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3FueDRfZnMuaApAQCAtMTEwLDYgKzExMCw3IEBACiAJc3RydWN0IGlub2RlIHZmc19pbm9kZTsKIH07CiAKK2V4dGVybiBzdHJ1Y3QgaW5vZGUgKnFueDRfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZyk7CiBleHRlcm4gc3RydWN0IGRlbnRyeSAqcW54NF9sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcW54NF9jb3VudF9mcmVlX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIHFueDRfYmxvY2tfbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvbmcgaWJsb2NrKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmN1cHJlZW1wdC5oIGIvaW5jbHVkZS9saW51eC9yY3VwcmVlbXB0LmgKaW5kZXggZWNlOGViMy4uNjBjMmEwMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yY3VwcmVlbXB0LmgKKysrIGIvaW5jbHVkZS9saW51eC9yY3VwcmVlbXB0LmgKQEAgLTQ2LDggKzQ2LDggQEAKICNkZWZpbmUgcmN1X2JoX3FzY3RyX2luYyhjcHUpCiAjZGVmaW5lIGNhbGxfcmN1X2JoKGhlYWQsIHJjdSkgY2FsbF9yY3UoaGVhZCwgcmN1KQogCi1leHRlcm4gdm9pZCBfX3JjdV9yZWFkX2xvY2sodm9pZCk7Ci1leHRlcm4gdm9pZCBfX3JjdV9yZWFkX3VubG9jayh2b2lkKTsKK2V4dGVybiB2b2lkIF9fcmN1X3JlYWRfbG9jayh2b2lkKQlfX2FjcXVpcmVzKFJDVSk7CitleHRlcm4gdm9pZCBfX3JjdV9yZWFkX3VubG9jayh2b2lkKQlfX3JlbGVhc2VzKFJDVSk7CiBleHRlcm4gaW50IHJjdV9wZW5kaW5nKGludCBjcHUpOwogZXh0ZXJuIGludCByY3VfbmVlZHNfY3B1KGludCBjcHUpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzLmgKaW5kZXggNDIyZWFiNC4uOGU3ZWZmMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnMuaApAQCAtMjg3LDcgKzI4Nyw3IEBACiAKIC8qIERvbid0IHRydXN0IFJFSVNFUkZTX1NCKHNiKS0+c19ibWFwX25yLCBpdCdzIGEgdTE2CiAgKiB3aGljaCBvdmVyZmxvd3Mgb24gbGFyZ2UgZmlsZSBzeXN0ZW1zLiAqLwotc3RhdGljIGlubGluZSB1MzIgcmVpc2VyZnNfYm1hcF9jb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorc3RhdGljIGlubGluZSBfX3UzMiByZWlzZXJmc19ibWFwX2NvdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJcmV0dXJuIChTQl9CTE9DS19DT1VOVChzYikgLSAxKSAvIChzYi0+c19ibG9ja3NpemUgKiA4KSArIDE7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Jlc19jb3VudGVyLmggYi9pbmNsdWRlL2xpbnV4L3Jlc19jb3VudGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEzNjNjZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvcmVzX2NvdW50ZXIuaApAQCAtMCwwICsxLDEyNyBAQAorI2lmbmRlZiBfX1JFU19DT1VOVEVSX0hfXworI2RlZmluZSBfX1JFU19DT1VOVEVSX0hfXworCisvKgorICogUmVzb3VyY2UgQ291bnRlcnMKKyAqIENvbnRhaW4gY29tbW9uIGRhdGEgdHlwZXMgYW5kIHJvdXRpbmVzIGZvciByZXNvdXJjZSBhY2NvdW50aW5nCisgKgorICogQ29weXJpZ2h0IDIwMDcgT3BlblZaIFNXc29mdCBJbmMKKyAqCisgKiBBdXRob3I6IFBhdmVsIEVtZWxpYW5vdiA8eGVtdWxAb3BlbnZ6Lm9yZz4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nncm91cC5oPgorCisvKgorICogVGhlIGNvcmUgb2JqZWN0LiB0aGUgY2dyb3VwIHRoYXQgd2lzaGVzIHRvIGFjY291bnQgZm9yIHNvbWUKKyAqIHJlc291cmNlIG1heSBpbmNsdWRlIHRoaXMgY291bnRlciBpbnRvIGl0cyBzdHJ1Y3R1cmVzIGFuZCB1c2UKKyAqIHRoZSBoZWxwZXJzIGRlc2NyaWJlZCBiZXlvbmQKKyAqLworCitzdHJ1Y3QgcmVzX2NvdW50ZXIgeworCS8qCisJICogdGhlIGN1cnJlbnQgcmVzb3VyY2UgY29uc3VtcHRpb24gbGV2ZWwKKwkgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgdXNhZ2U7CisJLyoKKwkgKiB0aGUgbGltaXQgdGhhdCB1c2FnZSBjYW5ub3QgZXhjZWVkCisJICovCisJdW5zaWduZWQgbG9uZyBsb25nIGxpbWl0OworCS8qCisJICogdGhlIG51bWJlciBvZiB1bnN1Y2Nlc3NmdWwgYXR0ZW1wdHMgdG8gY29uc3VtZSB0aGUgcmVzb3VyY2UKKwkgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgZmFpbGNudDsKKwkvKgorCSAqIHRoZSBsb2NrIHRvIHByb3RlY3QgYWxsIG9mIHRoZSBhYm92ZS4KKwkgKiB0aGUgcm91dGluZXMgYmVsb3cgY29uc2lkZXIgdGhpcyB0byBiZSBJUlEtc2FmZQorCSAqLworCXNwaW5sb2NrX3QgbG9jazsKK307CisKKy8qCisgKiBIZWxwZXJzIHRvIGludGVyYWN0IHdpdGggdXNlcnNwYWNlCisgKiByZXNfY291bnRlcl9yZWFkL193cml0ZSAtIHB1dC9nZXQgdGhlIHNwZWNpZmllZCBmaWVsZHMgZnJvbSB0aGUKKyAqIHJlc19jb3VudGVyIHN0cnVjdCB0by9mcm9tIHRoZSB1c2VyCisgKgorICogQGNvdW50ZXI6ICAgICB0aGUgY291bnRlciBpbiBxdWVzdGlvbgorICogQG1lbWJlcjogIHRoZSBmaWVsZCB0byB3b3JrIHdpdGggKHNlZSBSRVNfeHh4IGJlbG93KQorICogQGJ1ZjogICAgIHRoZSBidWZmZXIgdG8gb3BlYXRlIG9uLC4uLgorICogQG5ieXRlczogIGl0cyBzaXplLi4uCisgKiBAcG9zOiAgICAgYW5kIHRoZSBvZmZzZXQuCisgKi8KKworc3NpemVfdCByZXNfY291bnRlcl9yZWFkKHN0cnVjdCByZXNfY291bnRlciAqY291bnRlciwgaW50IG1lbWJlciwKKwkJY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwb3MsCisJCWludCAoKnJlYWRfc3RyYXRlZ3kpKHVuc2lnbmVkIGxvbmcgbG9uZyB2YWwsIGNoYXIgKnMpKTsKK3NzaXplX3QgcmVzX2NvdW50ZXJfd3JpdGUoc3RydWN0IHJlc19jb3VudGVyICpjb3VudGVyLCBpbnQgbWVtYmVyLAorCQljb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBvcywKKwkJaW50ICgqd3JpdGVfc3RyYXRlZ3kpKGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsb25nICp2YWwpKTsKKworLyoKKyAqIHRoZSBmaWVsZCBkZXNjcmlwdG9ycy4gb25lIGZvciBlYWNoIG1lbWJlciBvZiByZXNfY291bnRlcgorICovCisKK2VudW0geworCVJFU19VU0FHRSwKKwlSRVNfTElNSVQsCisJUkVTX0ZBSUxDTlQsCit9OworCisvKgorICogaGVscGVycyBmb3IgYWNjb3VudGluZworICovCisKK3ZvaWQgcmVzX2NvdW50ZXJfaW5pdChzdHJ1Y3QgcmVzX2NvdW50ZXIgKmNvdW50ZXIpOworCisvKgorICogY2hhcmdlIC0gdHJ5IHRvIGNvbnN1bWUgbW9yZSByZXNvdXJjZS4KKyAqCisgKiBAY291bnRlcjogdGhlIGNvdW50ZXIKKyAqIEB2YWw6IHRoZSBhbW91bnQgb2YgdGhlIHJlc291cmNlLiBlYWNoIGNvbnRyb2xsZXIgZGVmaW5lcyBpdHMgb3duCisgKiAgICAgICB1bml0cywgZS5nLiBudW1iZXJzLCBieXRlcywgS2J5dGVzLCBldGMKKyAqCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgPDAgaWYgdGhlIGNvdW50ZXItPnVzYWdlIHdpbGwgZXhjZWVkIHRoZQorICogY291bnRlci0+bGltaXQgX2xvY2tlZCBjYWxsIGV4cGVjdHMgdGhlIGNvdW50ZXItPmxvY2sgdG8gYmUgdGFrZW4KKyAqLworCitpbnQgcmVzX2NvdW50ZXJfY2hhcmdlX2xvY2tlZChzdHJ1Y3QgcmVzX2NvdW50ZXIgKmNvdW50ZXIsIHVuc2lnbmVkIGxvbmcgdmFsKTsKK2ludCByZXNfY291bnRlcl9jaGFyZ2Uoc3RydWN0IHJlc19jb3VudGVyICpjb3VudGVyLCB1bnNpZ25lZCBsb25nIHZhbCk7CisKKy8qCisgKiB1bmNoYXJnZSAtIHRlbGwgdGhhdCBzb21lIHBvcnRpb24gb2YgdGhlIHJlc291cmNlIGlzIHJlbGVhc2VkCisgKgorICogQGNvdW50ZXI6IHRoZSBjb3VudGVyCisgKiBAdmFsOiB0aGUgYW1vdW50IG9mIHRoZSByZXNvdXJjZQorICoKKyAqIHRoZXNlIGNhbGxzIGNoZWNrIGZvciB1c2FnZSB1bmRlcmZsb3cgYW5kIHNob3cgYSB3YXJuaW5nIG9uIHRoZSBjb25zb2xlCisgKiBfbG9ja2VkIGNhbGwgZXhwZWN0cyB0aGUgY291bnRlci0+bG9jayB0byBiZSB0YWtlbgorICovCisKK3ZvaWQgcmVzX2NvdW50ZXJfdW5jaGFyZ2VfbG9ja2VkKHN0cnVjdCByZXNfY291bnRlciAqY291bnRlciwgdW5zaWduZWQgbG9uZyB2YWwpOwordm9pZCByZXNfY291bnRlcl91bmNoYXJnZShzdHJ1Y3QgcmVzX2NvdW50ZXIgKmNvdW50ZXIsIHVuc2lnbmVkIGxvbmcgdmFsKTsKKworc3RhdGljIGlubGluZSBib29sIHJlc19jb3VudGVyX2xpbWl0X2NoZWNrX2xvY2tlZChzdHJ1Y3QgcmVzX2NvdW50ZXIgKmNudCkKK3sKKwlpZiAoY250LT51c2FnZSA8IGNudC0+bGltaXQpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCisvKgorICogSGVscGVyIGZ1bmN0aW9uIHRvIGRldGVjdCBpZiB0aGUgY2dyb3VwIGlzIHdpdGhpbiBpdCdzIGxpbWl0IG9yCisgKiBub3QuIEl0J3MgY3VycmVudGx5IGNhbGxlZCBmcm9tIGNncm91cF9yc3NfcHJlcGFyZSgpCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCByZXNfY291bnRlcl9jaGVja191bmRlcl9saW1pdChzdHJ1Y3QgcmVzX2NvdW50ZXIgKmNudCkKK3sKKwlib29sIHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNudC0+bG9jaywgZmxhZ3MpOworCXJldCA9IHJlc19jb3VudGVyX2xpbWl0X2NoZWNrX2xvY2tlZChjbnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNudC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ybWFwLmggYi9pbmNsdWRlL2xpbnV4L3JtYXAuaAppbmRleCA5NzM0N2YyLi4xMzgzNjkyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JtYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JtYXAuaApAQCAtOCw2ICs4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21lbWNvbnRyb2wuaD4KIAogLyoKICAqIFRoZSBhbm9uX3ZtYSBoZWFkcyBhIGxpc3Qgb2YgcHJpdmF0ZSAicmVsYXRlZCIgdm1hcywgdG8gc2NhbiBpZgpAQCAtODYsNyArODcsNyBAQAogLyoKICAqIENhbGxlZCBmcm9tIG1tL3Ztc2Nhbi5jIHRvIGhhbmRsZSBwYWdpbmcgb3V0CiAgKi8KLWludCBwYWdlX3JlZmVyZW5jZWQoc3RydWN0IHBhZ2UgKiwgaW50IGlzX2xvY2tlZCk7CitpbnQgcGFnZV9yZWZlcmVuY2VkKHN0cnVjdCBwYWdlICosIGludCBpc19sb2NrZWQsIHN0cnVjdCBtZW1fY2dyb3VwICpjbnQpOwogaW50IHRyeV90b191bm1hcChzdHJ1Y3QgcGFnZSAqLCBpbnQgaWdub3JlX3JlZnMpOwogCiAvKgpAQCAtMTE0LDcgKzExNSw3IEBACiAjZGVmaW5lIGFub25fdm1hX3ByZXBhcmUodm1hKQkoMCkKICNkZWZpbmUgYW5vbl92bWFfbGluayh2bWEpCWRvIHt9IHdoaWxlICgwKQogCi0jZGVmaW5lIHBhZ2VfcmVmZXJlbmNlZChwYWdlLGwpIFRlc3RDbGVhclBhZ2VSZWZlcmVuY2VkKHBhZ2UpCisjZGVmaW5lIHBhZ2VfcmVmZXJlbmNlZChwYWdlLGwsY250KSBUZXN0Q2xlYXJQYWdlUmVmZXJlbmNlZChwYWdlKQogI2RlZmluZSB0cnlfdG9fdW5tYXAocGFnZSwgcmVmcykgU1dBUF9GQUlMCiAKIHN0YXRpYyBpbmxpbmUgaW50IHBhZ2VfbWtjbGVhbihzdHJ1Y3QgcGFnZSAqcGFnZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaAppbmRleCA3YzhjYTA1Li4wMGUxNDQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCkBAIC05Miw2ICs5Miw3IEBACiAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAKK3N0cnVjdCBtZW1fY2dyb3VwOwogc3RydWN0IGV4ZWNfZG9tYWluOwogc3RydWN0IGZ1dGV4X3BpX3N0YXRlOwogc3RydWN0IHJvYnVzdF9saXN0X2hlYWQ7CkBAIC00NTksNyArNDYwLDcgQEAKIAogCS8qIElUSU1FUl9SRUFMIHRpbWVyIGZvciB0aGUgcHJvY2VzcyAqLwogCXN0cnVjdCBocnRpbWVyIHJlYWxfdGltZXI7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CisJc3RydWN0IHBpZCAqbGVhZGVyX3BpZDsKIAlrdGltZV90IGl0X3JlYWxfaW5jcjsKIAogCS8qIElUSU1FUl9QUk9GIGFuZCBJVElNRVJfVklSVFVBTCB0aW1lcnMgZm9yIHRoZSBwcm9jZXNzICovCkBAIC0xMzMxLDkgKzEzMzIsOCBAQAogICogZnJvbSB2YXJpb3VzIG5hbWVzcGFjZXMKICAqCiAgKiB0YXNrX3hpZF9ucigpICAgICA6IGdsb2JhbCBpZCwgaS5lLiB0aGUgaWQgc2VlbiBmcm9tIHRoZSBpbml0IG5hbWVzcGFjZTsKLSAqIHRhc2tfeGlkX3ZucigpICAgIDogdmlydHVhbCBpZCwgaS5lLiB0aGUgaWQgc2VlbiBmcm9tIHRoZSBuYW1lc3BhY2UgdGhlIHRhc2sKLSAqICAgICAgICAgICAgICAgICAgICAgYmVsb25ncyB0by4gdGhpcyBvbmx5IG1ha2VzIHNlbmNlIHdoZW4gY2FsbGVkIGluIHRoZQotICogICAgICAgICAgICAgICAgICAgICBjb250ZXh0IG9mIHRoZSB0YXNrIHRoYXQgYmVsb25ncyB0byB0aGUgc2FtZSBuYW1lc3BhY2U7CisgKiB0YXNrX3hpZF92bnIoKSAgICA6IHZpcnR1YWwgaWQsIGkuZS4gdGhlIGlkIHNlZW4gZnJvbSB0aGUgcGlkIG5hbWVzcGFjZSBvZgorICogICAgICAgICAgICAgICAgICAgICBjdXJyZW50LgogICogdGFza194aWRfbnJfbnMoKSAgOiBpZCBzZWVuIGZyb20gdGhlIG5zIHNwZWNpZmllZDsKICAqCiAgKiBzZXRfdGFza192eGlkKCkgICA6IGFzc2lnbnMgYSB2aXJ0dWFsIGlkIHRvIGEgdGFzazsKQEAgLTE2MzEsNyArMTYzMSw3IEBACiBleHRlcm4gc3RydWN0IHRhc2tfc3RydWN0ICpmaW5kX3Rhc2tfYnlfcGlkX25zKHBpZF90IG5yLAogCQlzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMpOwogCi1leHRlcm4gdm9pZCBfX3NldF9zcGVjaWFsX3BpZHMocGlkX3Qgc2Vzc2lvbiwgcGlkX3QgcGdycCk7CitleHRlcm4gdm9pZCBfX3NldF9zcGVjaWFsX3BpZHMoc3RydWN0IHBpZCAqcGlkKTsKIAogLyogcGVyLVVJRCBwcm9jZXNzIGNoYXJnaW5nLiAqLwogZXh0ZXJuIHN0cnVjdCB1c2VyX3N0cnVjdCAqIGFsbG9jX3VpZChzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKiwgdWlkX3QpOwpAQCAtMTY4NiwxMSArMTY4Niw5IEBACiBleHRlcm4gdm9pZCB1bmJsb2NrX2FsbF9zaWduYWxzKHZvaWQpOwogZXh0ZXJuIHZvaWQgcmVsZWFzZV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqIHApOwogZXh0ZXJuIGludCBzZW5kX3NpZ19pbmZvKGludCwgc3RydWN0IHNpZ2luZm8gKiwgc3RydWN0IHRhc2tfc3RydWN0ICopOwotZXh0ZXJuIGludCBzZW5kX2dyb3VwX3NpZ19pbmZvKGludCwgc3RydWN0IHNpZ2luZm8gKiwgc3RydWN0IHRhc2tfc3RydWN0ICopOwogZXh0ZXJuIGludCBmb3JjZV9zaWdzZWd2KGludCwgc3RydWN0IHRhc2tfc3RydWN0ICopOwogZXh0ZXJuIGludCBmb3JjZV9zaWdfaW5mbyhpbnQsIHN0cnVjdCBzaWdpbmZvICosIHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKIGV4dGVybiBpbnQgX19raWxsX3BncnBfaW5mbyhpbnQgc2lnLCBzdHJ1Y3Qgc2lnaW5mbyAqaW5mbywgc3RydWN0IHBpZCAqcGdycCk7Ci1leHRlcm4gaW50IGtpbGxfcGdycF9pbmZvKGludCBzaWcsIHN0cnVjdCBzaWdpbmZvICppbmZvLCBzdHJ1Y3QgcGlkICpwZ3JwKTsKIGV4dGVybiBpbnQga2lsbF9waWRfaW5mbyhpbnQgc2lnLCBzdHJ1Y3Qgc2lnaW5mbyAqaW5mbywgc3RydWN0IHBpZCAqcGlkKTsKIGV4dGVybiBpbnQga2lsbF9waWRfaW5mb19hc191aWQoaW50LCBzdHJ1Y3Qgc2lnaW5mbyAqLCBzdHJ1Y3QgcGlkICosIHVpZF90LCB1aWRfdCwgdTMyKTsKIGV4dGVybiBpbnQga2lsbF9wZ3JwKHN0cnVjdCBwaWQgKnBpZCwgaW50IHNpZywgaW50IHByaXYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXJpYWwxNjcuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsMTY3LmgKaW5kZXggNzFiNmRmMi4uNTljODFiNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpYWwxNjcuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcmlhbDE2Ny5oCkBAIC0zNyw3ICszNyw2IEBACiAJaW50CQkJaWdub3JlX3N0YXR1c19tYXNrOwogCWludAkJCWNsb3NlX2RlbGF5OwogCWludAkJCUlFUjsgCS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KLQl1bnNpZ25lZCBsb25nCQlldmVudDsKIAl1bnNpZ25lZCBsb25nCQlsYXN0X2FjdGl2ZTsKIAlpbnQJCQljb3VudDsJLyogIyBvZiBmZCBvbiBkZXZpY2UgKi8KIAlpbnQgICAgICAgICAgICAgICAgICAgICB4X2NoYXI7IC8qIHRvIGJlIHB1c2hlZCBvdXQgQVNBUCAqLwpAQCAtNDksNyArNDgsNiBAQAogCWludAkJCXhtaXRfY250OwogICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X3RocmVzaG9sZDsKICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF90aW1lb3V0OwotCXN0cnVjdCB3b3JrX3N0cnVjdAl0cXVldWU7CiAJd2FpdF9xdWV1ZV9oZWFkX3QJb3Blbl93YWl0OwogCXdhaXRfcXVldWVfaGVhZF90CWNsb3NlX3dhaXQ7CiAgICAgICAgIHN0cnVjdCBjeWNsYWRlc19tb25pdG9yIG1vbjsKQEAgLTY3LDE4ICs2NSw2IEBACiAjZGVmaW5lIENZR0VUREVGVElNRU9VVCAgICAgICAgIDB4NDM1OTA4CiAjZGVmaW5lIENZU0VUREVGVElNRU9VVCAgICAgICAgIDB4NDM1OTA5CiAKLS8qCi0gKiBFdmVudHMgYXJlIHVzZWQgdG8gc2NoZWR1bGUgdGhpbmdzIHRvIGhhcHBlbiBhdCB0aW1lci1pbnRlcnJ1cHQKLSAqIHRpbWUsIGluc3RlYWQgb2YgYXQgY3kgaW50ZXJydXB0IHRpbWUuCi0gKi8KLSNkZWZpbmUgQ3lfRVZFTlRfUkVBRF9QUk9DRVNTCTAKLSNkZWZpbmUgQ3lfRVZFTlRfV1JJVEVfV0FLRVVQCTEKLSNkZWZpbmUgQ3lfRVZFTlRfSEFOR1VQCQkyCi0jZGVmaW5lIEN5X0VWRU5UX0JSRUFLCQkzCi0jZGVmaW5lIEN5X0VWRU5UX09QRU5fV0FLRVVQCTQKLQotCi0KICNkZWZpbmUgQ3lNYXhDaGlwc1BlckNhcmQgMQogCiAvKioqKiBjZDI0MDEgcmVnaXN0ZXJzICoqKiovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmggYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKaW5kZXggOTk2M2Y4MS4uMWEwYjZjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaApAQCAtMTUwLDYgKzE1MCwxMCBAQAogI2RlZmluZSBQT1JUX01DRgk3OAogCiAKKy8qIE1OMTAzMDAgb24tY2hpcCBVQVJUIG51bWJlcnMgKi8KKyNkZWZpbmUgUE9SVF9NTjEwMzAwCQk4MAorI2RlZmluZSBQT1JUX01OMTAzMDBfQ1RTCTgxCisKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zaG0uaCBiL2luY2x1ZGUvbGludXgvc2htLmgKaW5kZXggZWVhZWQ5Mi4uZWNhNjIzNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zaG0uaAorKysgYi9pbmNsdWRlL2xpbnV4L3NobS5oCkBAIC0zLDcgKzMsMTEgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lwYy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjZWxzZQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCiAKIC8qCiAgKiBTSE1NQVgsIFNITU1OSSBhbmQgU0hNQUxMIGFyZSB1cHBlciBsaW1pdHMgYXJlIGRlZmF1bHRzIHdoaWNoIGNhbgpAQCAtMTMsNyArMTcsMTEgQEAKICNkZWZpbmUgU0hNTUFYIDB4MjAwMDAwMAkJIC8qIG1heCBzaGFyZWQgc2VnIHNpemUgKGJ5dGVzKSAqLwogI2RlZmluZSBTSE1NSU4gMQkJCSAvKiBtaW4gc2hhcmVkIHNlZyBzaXplIChieXRlcykgKi8KICNkZWZpbmUgU0hNTU5JIDQwOTYJCQkgLyogbWF4IG51bSBvZiBzZWdzIHN5c3RlbSB3aWRlICovCisjaWZkZWYgX19LRVJORUxfXwogI2RlZmluZSBTSE1BTEwgKFNITU1BWC9QQUdFX1NJWkUqKFNITU1OSS8xNikpIC8qIG1heCBzaG0gc3lzdGVtIHdpZGUgKHBhZ2VzKSAqLworI2Vsc2UKKyNkZWZpbmUgU0hNQUxMIChTSE1NQVgvZ2V0cGFnZXNpemUoKSooU0hNTU5JLzE2KSkKKyNlbmRpZgogI2RlZmluZSBTSE1TRUcgU0hNTU5JCQkJIC8qIG1heCBzaGFyZWQgc2VncyBwZXIgcHJvY2VzcyAqLwogCiAjaWZkZWYgX19LRVJORUxfXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zaG1lbV9mcy5oIGIvaW5jbHVkZS9saW51eC9zaG1lbV9mcy5oCmluZGV4IGYzYzUxODkuLjhkNWZiMzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2htZW1fZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NobWVtX2ZzLmgKQEAgLTMwLDkgKzMwLDEyIEBACiAJdW5zaWduZWQgbG9uZyBmcmVlX2Jsb2NrczsgIC8qIEhvdyBtYW55IGFyZSBsZWZ0IGZvciBhbGxvY2F0aW9uICovCiAJdW5zaWduZWQgbG9uZyBtYXhfaW5vZGVzOyAgIC8qIEhvdyBtYW55IGlub2RlcyBhcmUgYWxsb3dlZCAqLwogCXVuc2lnbmVkIGxvbmcgZnJlZV9pbm9kZXM7ICAvKiBIb3cgbWFueSBhcmUgbGVmdCBmb3IgYWxsb2NhdGlvbiAqLworCXNwaW5sb2NrX3Qgc3RhdF9sb2NrOwkgICAgLyogU2VyaWFsaXplIHNobWVtX3NiX2luZm8gY2hhbmdlcyAqLworCXVpZF90IHVpZDsJCSAgICAvKiBNb3VudCB1aWQgZm9yIHJvb3QgZGlyZWN0b3J5ICovCisJZ2lkX3QgZ2lkOwkJICAgIC8qIE1vdW50IGdpZCBmb3Igcm9vdCBkaXJlY3RvcnkgKi8KKwltb2RlX3QgbW9kZTsJCSAgICAvKiBNb3VudCBtb2RlIGZvciByb290IGRpcmVjdG9yeSAqLwogCWludCBwb2xpY3k7CQkgICAgLyogRGVmYXVsdCBOVU1BIG1lbW9yeSBhbGxvYyBwb2xpY3kgKi8KIAlub2RlbWFza190IHBvbGljeV9ub2RlczsgICAgLyogbm9kZW1hc2sgZm9yIHByZWZlcnJlZCBhbmQgYmluZCAqLwotCXNwaW5sb2NrX3QgICAgc3RhdF9sb2NrOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqU0hNRU1fSShzdHJ1Y3QgaW5vZGUgKmlub2RlKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zaWduYWwuaCBiL2luY2x1ZGUvbGludXgvc2lnbmFsLmgKaW5kZXggN2UwOTUxNC4uNDJkMmUwYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zaWduYWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NpZ25hbC5oCkBAIC0yNDEsNiArMjQxLDcgQEAKIAogc3RydWN0IHB0X3JlZ3M7CiBleHRlcm4gaW50IGdldF9zaWduYWxfdG9fZGVsaXZlcihzaWdpbmZvX3QgKmluZm8sIHN0cnVjdCBrX3NpZ2FjdGlvbiAqcmV0dXJuX2thLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdm9pZCAqY29va2llKTsKK2V4dGVybiB2b2lkIGV4aXRfc2lnbmFscyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CiAKIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqc2lnaGFuZF9jYWNoZXA7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaCBiL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaAppbmRleCBkZGIxYTcwLi41ZTZkM2Q2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NsdWJfZGVmLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbHViX2RlZi5oCkBAIC0xMSwxMiArMTEsMzUgQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAKK2VudW0gc3RhdF9pdGVtIHsKKwlBTExPQ19GQVNUUEFUSCwJCS8qIEFsbG9jYXRpb24gZnJvbSBjcHUgc2xhYiAqLworCUFMTE9DX1NMT1dQQVRILAkJLyogQWxsb2NhdGlvbiBieSBnZXR0aW5nIGEgbmV3IGNwdSBzbGFiICovCisJRlJFRV9GQVNUUEFUSCwJCS8qIEZyZWUgdG8gY3B1IHNsdWIgKi8KKwlGUkVFX1NMT1dQQVRILAkJLyogRnJlZWluZyBub3QgdG8gY3B1IHNsYWIgKi8KKwlGUkVFX0ZST1pFTiwJCS8qIEZyZWVpbmcgdG8gZnJvemVuIHNsYWIgKi8KKwlGUkVFX0FERF9QQVJUSUFMLAkvKiBGcmVlaW5nIG1vdmVzIHNsYWIgdG8gcGFydGlhbCBsaXN0ICovCisJRlJFRV9SRU1PVkVfUEFSVElBTCwJLyogRnJlZWluZyByZW1vdmVzIGxhc3Qgb2JqZWN0ICovCisJQUxMT0NfRlJPTV9QQVJUSUFMLAkvKiBDcHUgc2xhYiBhY3F1aXJlZCBmcm9tIHBhcnRpYWwgbGlzdCAqLworCUFMTE9DX1NMQUIsCQkvKiBDcHUgc2xhYiBhY3F1aXJlZCBmcm9tIHBhZ2UgYWxsb2NhdG9yICovCisJQUxMT0NfUkVGSUxMLAkJLyogUmVmaWxsIGNwdSBzbGFiIGZyb20gc2xhYiBmcmVlbGlzdCAqLworCUZSRUVfU0xBQiwJCS8qIFNsYWIgZnJlZWQgdG8gdGhlIHBhZ2UgYWxsb2NhdG9yICovCisJQ1BVU0xBQl9GTFVTSCwJCS8qIEFiYW5kb25pbmcgb2YgdGhlIGNwdSBzbGFiICovCisJREVBQ1RJVkFURV9GVUxMLAkvKiBDcHUgc2xhYiB3YXMgZnVsbCB3aGVuIGRlYWN0aXZhdGVkICovCisJREVBQ1RJVkFURV9FTVBUWSwJLyogQ3B1IHNsYWIgd2FzIGVtcHR5IHdoZW4gZGVhY3RpdmF0ZWQgKi8KKwlERUFDVElWQVRFX1RPX0hFQUQsCS8qIENwdSBzbGFiIHdhcyBtb3ZlZCB0byB0aGUgaGVhZCBvZiBwYXJ0aWFscyAqLworCURFQUNUSVZBVEVfVE9fVEFJTCwJLyogQ3B1IHNsYWIgd2FzIG1vdmVkIHRvIHRoZSB0YWlsIG9mIHBhcnRpYWxzICovCisJREVBQ1RJVkFURV9SRU1PVEVfRlJFRVMsLyogU2xhYiBjb250YWluZWQgcmVtb3RlbHkgZnJlZWQgb2JqZWN0cyAqLworCU5SX1NMVUJfU1RBVF9JVEVNUyB9OworCiBzdHJ1Y3Qga21lbV9jYWNoZV9jcHUgewogCXZvaWQgKipmcmVlbGlzdDsJLyogUG9pbnRlciB0byBmaXJzdCBmcmVlIHBlciBjcHUgb2JqZWN0ICovCiAJc3RydWN0IHBhZ2UgKnBhZ2U7CS8qIFRoZSBzbGFiIGZyb20gd2hpY2ggd2UgYXJlIGFsbG9jYXRpbmcgKi8KIAlpbnQgbm9kZTsJCS8qIFRoZSBub2RlIG9mIHRoZSBwYWdlIChvciAtMSBmb3IgZGVidWcpICovCiAJdW5zaWduZWQgaW50IG9mZnNldDsJLyogRnJlZXBvaW50ZXIgb2Zmc2V0IChpbiB3b3JkIHVuaXRzKSAqLwogCXVuc2lnbmVkIGludCBvYmpzaXplOwkvKiBTaXplIG9mIGFuIG9iamVjdCAoZnJvbSBrbWVtX2NhY2hlKSAqLworI2lmZGVmIENPTkZJR19TTFVCX1NUQVRTCisJdW5zaWduZWQgc3RhdFtOUl9TTFVCX1NUQVRfSVRFTVNdOworI2VuZGlmCiB9OwogCiBzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc29ueXBpLmggYi9pbmNsdWRlL2xpbnV4L3NvbnlwaS5oCmluZGV4IDQwYzdiNWQuLmY0MWZmZDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc29ueXBpLmgKKysrIGIvaW5jbHVkZS9saW51eC9zb255cGkuaApAQCAtMTAxLDYgKzEwMSw4IEBACiAjZGVmaW5lIFNPTllQSV9FVkVOVF9GTktFWV9SRUxFQVNFRAkJNTkKICNkZWZpbmUgU09OWVBJX0VWRU5UX1dJUkVMRVNTX09OCQk2MAogI2RlZmluZSBTT05ZUElfRVZFTlRfV0lSRUxFU1NfT0ZGCQk2MQorI2RlZmluZSBTT05ZUElfRVZFTlRfWk9PTV9JTl9QUkVTU0VECQk2MgorI2RlZmluZSBTT05ZUElfRVZFTlRfWk9PTV9PVVRfUFJFU1NFRAkJNjMKIAogLyogZ2V0L3NldCBicmlnaHRuZXNzICovCiAjZGVmaW5lIFNPTllQSV9JT0NHQlJUCQlfSU9SKCd2JywgMCwgX191OCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpbmxvY2suaCBiL2luY2x1ZGUvbGludXgvc3BpbmxvY2suaAppbmRleCAxMjQ0NDk3Li41NzZhNWY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrLmgKKysrIGIvaW5jbHVkZS9saW51eC9zcGlubG9jay5oCkBAIC03MSw3ICs3MSw3IEBACiAjZGVmaW5lIExPQ0tfU0VDVElPTl9FTkQgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICIucHJldmlvdXNcblx0IgogCi0jZGVmaW5lIF9fbG9ja2Z1bmMgZmFzdGNhbGwgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiLnNwaW5sb2NrLnRleHQiKSkpCisjZGVmaW5lIF9fbG9ja2Z1bmMgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiLnNwaW5sb2NrLnRleHQiKSkpCiAKIC8qCiAgKiBQdWxsIHRoZSByYXdfc3BpbmxvY2tfdCBhbmQgcmF3X3J3bG9ja190IGRlZmluaXRpb25zOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdGFsbGlvbi5oIGIvaW5jbHVkZS9saW51eC9zdGFsbGlvbi5oCmluZGV4IDk0YjRhMTAuLjA0MjRkNzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3RhbGxpb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L3N0YWxsaW9uLmgKQEAgLTk1LDcgKzk1LDYgQEAKIAlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OwogCXdhaXRfcXVldWVfaGVhZF90CW9wZW5fd2FpdDsKIAl3YWl0X3F1ZXVlX2hlYWRfdAljbG9zZV93YWl0OwotCXN0cnVjdCB3b3JrX3N0cnVjdAl0cXVldWU7CiAJY29tc3RhdHNfdAkJc3RhdHM7CiAJc3RydWN0IHN0bHJxCQl0eDsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N3YXAuaCBiL2luY2x1ZGUvbGludXgvc3dhcC5oCmluZGV4IDM1MzE1M2UuLjNjYTVjNGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3dhcC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3dhcC5oCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbWVtY29udHJvbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CkBAIC0xODIsNiArMTgzLDkgQEAKIC8qIGxpbnV4L21tL3Ztc2Nhbi5jICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9wYWdlcyhzdHJ1Y3Qgem9uZSAqKnpvbmVzLCBpbnQgb3JkZXIsCiAJCQkJCWdmcF90IGdmcF9tYXNrKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKKwkJCQkJCQlnZnBfdCBnZnBfbWFzayk7CitleHRlcm4gaW50IF9faXNvbGF0ZV9scnVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG1vZGUpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2hyaW5rX2FsbF9tZW1vcnkodW5zaWduZWQgbG9uZyBucl9wYWdlcyk7CiBleHRlcm4gaW50IHZtX3N3YXBwaW5lc3M7CiBleHRlcm4gaW50IHJlbW92ZV9tYXBwaW5nKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3QgcGFnZSAqcGFnZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N3YXBvcHMuaCBiL2luY2x1ZGUvbGludXgvc3dhcG9wcy5oCmluZGV4IDdiZjJkMTQuLjZlYzM5YWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3dhcG9wcy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3dhcG9wcy5oCkBAIC00MiwxMSArNDIsMTMgQEAKIAlyZXR1cm4gZW50cnkudmFsICYgU1dQX09GRlNFVF9NQVNLKGVudHJ5KTsKIH0KIAorI2lmZGVmIENPTkZJR19NTVUKIC8qIGNoZWNrIHdoZXRoZXIgYSBwdGUgcG9pbnRzIHRvIGEgc3dhcCBlbnRyeSAqLwogc3RhdGljIGlubGluZSBpbnQgaXNfc3dhcF9wdGUocHRlX3QgcHRlKQogewogCXJldHVybiAhcHRlX25vbmUocHRlKSAmJiAhcHRlX3ByZXNlbnQocHRlKSAmJiAhcHRlX2ZpbGUocHRlKTsKIH0KKyNlbmRpZgogCiAvKgogICogQ29udmVydCB0aGUgYXJjaC1kZXBlbmRlbnQgcHRlIHJlcHJlc2VudGF0aW9uIG9mIGEgc3dwX2VudHJ5X3QgaW50byBhbgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aGVybWFsLmggYi9pbmNsdWRlL2xpbnV4L3RoZXJtYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmE3NzEyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC90aGVybWFsLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqICB0aGVybWFsLmggICgkUmV2aXNpb246IDAgJCkKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4ICBJbnRlbCBDb3JwCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4ICBaaGFuZyBSdWkgPHJ1aS56aGFuZ0BpbnRlbC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA4ICBTdWppdGggVGhvbWFzIDxzdWppdGgudGhvbWFzQGludGVsLmNvbT4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICovCisKKyNpZm5kZWYgX19USEVSTUFMX0hfXworI2RlZmluZSBfX1RIRVJNQUxfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2U7CitzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZTsKKworc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2Vfb3BzIHsKKwlpbnQgKCpiaW5kKSAoc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKiwKKwkJICAgICBzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqKTsKKwlpbnQgKCp1bmJpbmQpIChzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqLAorCQkgICAgICAgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKik7CisJaW50ICgqZ2V0X3RlbXApIChzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqLCBjaGFyICopOworCWludCAoKmdldF9tb2RlKSAoc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKiwgY2hhciAqKTsKKwlpbnQgKCpzZXRfbW9kZSkgKHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICosIGNvbnN0IGNoYXIgKik7CisJaW50ICgqZ2V0X3RyaXBfdHlwZSkgKHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICosIGludCwgY2hhciAqKTsKKwlpbnQgKCpnZXRfdHJpcF90ZW1wKSAoc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKiwgaW50LCBjaGFyICopOworfTsKKworc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzIHsKKwlpbnQgKCpnZXRfbWF4X3N0YXRlKSAoc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKiwgY2hhciAqKTsKKwlpbnQgKCpnZXRfY3VyX3N0YXRlKSAoc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKiwgY2hhciAqKTsKKwlpbnQgKCpzZXRfY3VyX3N0YXRlKSAoc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKiwgdW5zaWduZWQgaW50KTsKK307CisKKyNkZWZpbmUgVEhFUk1BTF9UUklQU19OT05FIC0xCisjZGVmaW5lIFRIRVJNQUxfTUFYX1RSSVBTIDEwCisjZGVmaW5lIFRIRVJNQUxfTkFNRV9MRU5HVEggMjAKK3N0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlIHsKKwlpbnQgaWQ7CisJY2hhciB0eXBlW1RIRVJNQUxfTkFNRV9MRU5HVEhdOworCXN0cnVjdCBkZXZpY2UgZGV2aWNlOworCXZvaWQgKmRldmRhdGE7CisJc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzICpvcHM7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworfTsKKworI2RlZmluZSBLRUxWSU5fVE9fQ0VMU0lVUyh0KQkobG9uZykoKChsb25nKXQtMjczMiA+PSAwKSA/CVwKKwkJCQkoKGxvbmcpdC0yNzMyKzUpLzEwIDogKChsb25nKXQtMjczMi01KS8xMCkKKyNkZWZpbmUgQ0VMU0lVU19UT19LRUxWSU4odCkJKCh0KSoxMCsyNzMyKQorCitzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSB7CisJaW50IGlkOworCWNoYXIgdHlwZVtUSEVSTUFMX05BTUVfTEVOR1RIXTsKKwlzdHJ1Y3QgZGV2aWNlIGRldmljZTsKKwl2b2lkICpkZXZkYXRhOworCWludCB0cmlwczsKKwlzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZV9vcHMgKm9wczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNvb2xpbmdfZGV2aWNlczsKKwlzdHJ1Y3QgaWRyIGlkcjsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsJLyogcHJvdGVjdCBjb29saW5nIGRldmljZXMgbGlzdCAqLworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKK307CisKK3N0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0aGVybWFsX3pvbmVfZGV2aWNlX3JlZ2lzdGVyKGNoYXIgKiwgaW50LCB2b2lkICosCisJCQkJCXN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlX29wcyAqKTsKK3ZvaWQgdGhlcm1hbF96b25lX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICopOworCitpbnQgdGhlcm1hbF96b25lX2JpbmRfY29vbGluZ19kZXZpY2Uoc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKiwgaW50LAorCQkJCSAgICAgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKik7CitpbnQgdGhlcm1hbF96b25lX3VuYmluZF9jb29saW5nX2RldmljZShzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqLCBpbnQsCisJCQkJICAgICAgIHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICopOworCitzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqdGhlcm1hbF9jb29saW5nX2RldmljZV9yZWdpc3RlcihjaGFyICosIHZvaWQgKiwKKwkJCQkJc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzICopOwordm9pZCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2UgKik7CisKKyNlbmRpZgkJCQkvKiBfX1RIRVJNQUxfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpZm0uaCBiL2luY2x1ZGUvbGludXgvdGlmbS5oCmluZGV4IDIwOTZiNzYuLmRhNzZlZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGlmbS5oCisrKyBiL2luY2x1ZGUvbGludXgvdGlmbS5oCkBAIC03Miw2ICs3Miw3IEBACiAjZGVmaW5lIFRJRk1fRklGT19SRUFEWSAgICAgICAgICAgMHgwMDAwMDAwMQogI2RlZmluZSBUSUZNX0ZJRk9fSU5UX1NFVEFMTCAgICAgIDB4MDAwMGZmZmYKICNkZWZpbmUgVElGTV9GSUZPX0lOVE1BU0sgICAgICAgICAweDAwMDAwMDA1CisjZGVmaW5lIFRJRk1fRklGT19TSVpFICAgICAgICAgICAgMHgwMDAwMDIwMAogCiAjZGVmaW5lIFRJRk1fRE1BX1JFU0VUICAgICAgICAgICAgMHgwMDAwMDAwMgogI2RlZmluZSBUSUZNX0RNQV9UWCAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKQEAgLTEyNCw2ICsxMjUsOCBAQAogCiAJdm9pZCAgICAgICAgICAgICAgICAoKmVqZWN0KShzdHJ1Y3QgdGlmbV9hZGFwdGVyICpmbSwKIAkJCQkgICAgIHN0cnVjdCB0aWZtX2RldiAqc29jayk7CisJaW50ICAgICAgICAgICAgICAgICAoKmhhc19tc19waWYpKHN0cnVjdCB0aWZtX2FkYXB0ZXIgKmZtLAorCQkJCQkgIHN0cnVjdCB0aWZtX2RldiAqc29jayk7CiAKIAlzdHJ1Y3QgdGlmbV9kZXYgICAgICpzb2NrZXRzWzBdOwogfTsKQEAgLTE0MSw2ICsxNDQsNyBAQAogaW50IHRpZm1fcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB0aWZtX2RyaXZlciAqZHJ2KTsKIHZvaWQgdGlmbV91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdGlmbV9kcml2ZXIgKmRydik7CiB2b2lkIHRpZm1fZWplY3Qoc3RydWN0IHRpZm1fZGV2ICpzb2NrKTsKK2ludCB0aWZtX2hhc19tc19waWYoc3RydWN0IHRpZm1fZGV2ICpzb2NrKTsKIGludCB0aWZtX21hcF9zZyhzdHJ1Y3QgdGlmbV9kZXYgKnNvY2ssIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKIAkJaW50IGRpcmVjdGlvbik7CiB2b2lkIHRpZm1fdW5tYXBfc2coc3RydWN0IHRpZm1fZGV2ICpzb2NrLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpbWUuaCBiL2luY2x1ZGUvbGludXgvdGltZS5oCmluZGV4IGNlYWFiOWYuLjIwOTFhMTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGltZS5oCisrKyBiL2luY2x1ZGUvbGludXgvdGltZS5oCkBAIC0xMjAsNyArMTIwLDcgQEAKIGV4dGVybiB2b2lkIG1vbm90b25pY190b19ib290YmFzZWQoc3RydWN0IHRpbWVzcGVjICp0cyk7CiAKIGV4dGVybiBzdHJ1Y3QgdGltZXNwZWMgdGltZXNwZWNfdHJ1bmMoc3RydWN0IHRpbWVzcGVjIHQsIHVuc2lnbmVkIGdyYW4pOwotZXh0ZXJuIGludCB0aW1la2VlcGluZ19pc19jb250aW51b3VzKHZvaWQpOworZXh0ZXJuIGludCB0aW1la2VlcGluZ192YWxpZF9mb3JfaHJlcyh2b2lkKTsKIGV4dGVybiB2b2lkIHVwZGF0ZV93YWxsX3RpbWUodm9pZCk7CiBleHRlcm4gdm9pZCB1cGRhdGVfeHRpbWVfY2FjaGUodTY0IG5zZWMpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpbWVyLmggYi9pbmNsdWRlL2xpbnV4L3RpbWVyLmgKaW5kZXggZGUwZTcxMy4uOTc5ZmVmZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aW1lci5oCisrKyBiL2luY2x1ZGUvbGludXgvdGltZXIuaApAQCAtMzUsOCArMzUsOCBAQAogCXN0cnVjdCB0aW1lcl9saXN0IF9uYW1lID0JCQkJXAogCQlUSU1FUl9JTklUSUFMSVpFUihfZnVuY3Rpb24sIF9leHBpcmVzLCBfZGF0YSkKIAotdm9pZCBmYXN0Y2FsbCBpbml0X3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICogdGltZXIpOwotdm9pZCBmYXN0Y2FsbCBpbml0X3RpbWVyX2RlZmVycmFibGUoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKTsKK3ZvaWQgaW5pdF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpOwordm9pZCBpbml0X3RpbWVyX2RlZmVycmFibGUoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHNldHVwX3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICogdGltZXIsCiAJCQkJdm9pZCAoKmZ1bmN0aW9uKSh1bnNpZ25lZCBsb25nKSwKQEAgLTEyNCw4ICsxMjQsNiBAQAogfQogI2VuZGlmCiAKLWV4dGVybiB2b2lkIGRlbGF5ZWRfd29ya190aW1lcl9mbih1bnNpZ25lZCBsb25nIF9fZGF0YSk7Ci0KIC8qKgogICogYWRkX3RpbWVyIC0gc3RhcnQgYSB0aW1lcgogICogQHRpbWVyOiB0aGUgdGltZXIgdG8gYmUgYWRkZWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdHR5LmggYi9pbmNsdWRlL2xpbnV4L3R0eS5oCmluZGV4IDU4MjRhOTcuLmRkOGUwOGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdHR5LmgKKysrIGIvaW5jbHVkZS9saW51eC90dHkuaApAQCAtNTMsMTMgKzUzLDYgQEAKICAqLwogI2RlZmluZSBfX0RJU0FCTEVEX0NIQVIgJ1wwJwogCi0vKgotICogVGhpcyBpcyB0aGUgZmxpcCBidWZmZXIgdXNlZCBmb3IgdGhlIHR0eSBkcml2ZXIuICBUaGUgYnVmZmVyIGlzCi0gKiBsb2NhdGVkIGluIHRoZSB0dHkgc3RydWN0dXJlLCBhbmQgaXMgdXNlZCBhcyBhIGhpZ2ggc3BlZWQgaW50ZXJmYWNlCi0gKiBiZXR3ZWVuIHRoZSB0dHkgZHJpdmVyIGFuZCB0aGUgdHR5IGxpbmUgZGlzY2lwbGluZS4KLSAqLwotI2RlZmluZSBUVFlfRkxJUEJVRl9TSVpFIDUxMgotCiBzdHJ1Y3QgdHR5X2J1ZmZlciB7CiAJc3RydWN0IHR0eV9idWZmZXIgKm5leHQ7CiAJY2hhciAqY2hhcl9idWZfcHRyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90eXBlcy5oIGIvaW5jbHVkZS9saW51eC90eXBlcy5oCmluZGV4IGI5NGMwZTQuLjlkYzIzNDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdHlwZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3R5cGVzLmgKQEAgLTUzLDcgKzUzLDcgQEAKIHR5cGVkZWYgX19rZXJuZWxfZ2lkX3QJCWdpZF90OwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAotI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykKKyNpZiBkZWZpbmVkKF9fR05VQ19fKQogdHlwZWRlZiBfX2tlcm5lbF9sb2ZmX3QJCWxvZmZfdDsKICNlbmRpZgogCkBAIC0xMTksNyArMTE5LDcgQEAKIHR5cGVkZWYJCV9fdTE2CQl1aW50MTZfdDsKIHR5cGVkZWYJCV9fdTMyCQl1aW50MzJfdDsKIAotI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykKKyNpZiBkZWZpbmVkKF9fR05VQ19fKQogdHlwZWRlZgkJX191NjQJCXVpbnQ2NF90OwogdHlwZWRlZgkJX191NjQJCXVfaW50NjRfdDsKIHR5cGVkZWYJCV9fczY0CQlpbnQ2NF90OwpAQCAtMTgxLDcgKzE4MSw3IEBACiB0eXBlZGVmIF9fdTE2IF9fYml0d2lzZSBfX2JlMTY7CiB0eXBlZGVmIF9fdTMyIF9fYml0d2lzZSBfX2xlMzI7CiB0eXBlZGVmIF9fdTMyIF9fYml0d2lzZSBfX2JlMzI7Ci0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKQorI2lmIGRlZmluZWQoX19HTlVDX18pCiB0eXBlZGVmIF9fdTY0IF9fYml0d2lzZSBfX2xlNjQ7CiB0eXBlZGVmIF9fdTY0IF9fYml0d2lzZSBfX2JlNjQ7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdWRmX2ZzLmggYi9pbmNsdWRlL2xpbnV4L3VkZl9mcy5oCmluZGV4IDM2YzY4NGUuLmFhODg2NTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdWRmX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC91ZGZfZnMuaApAQCAtMzIsMTggKzMyLDE1IEBACiAjZGVmaW5lIFVERl9QUkVBTExPQ0FURQogI2RlZmluZSBVREZfREVGQVVMVF9QUkVBTExPQ19CTE9DS1MJOAogCi0jZGVmaW5lIFVERkZTX0RBVEUJCQkiMjAwNC8yOS8wOSIKLSNkZWZpbmUgVURGRlNfVkVSU0lPTgkJCSIwLjkuOC4xIgotCiAjdW5kZWYgVURGRlNfREVCVUcKIAogI2lmZGVmIFVERkZTX0RFQlVHCiAjZGVmaW5lIHVkZl9kZWJ1ZyhmLCBhLi4uKSBcCi0JeyBcCisJZG8geyBcCiAJCXByaW50ayAoS0VSTl9ERUJVRyAiVURGLWZzIERFQlVHICVzOiVkOiVzOiAiLCBcCiAJCQlfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXyk7IFwKIAkJcHJpbnRrIChmLCAjI2EpOyBcCi0JfQorCX0gd2hpbGUgKDApCiAjZWxzZQogI2RlZmluZSB1ZGZfZGVidWcoZiwgYS4uLikgLyoqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VkZl9mc19zYi5oIGIvaW5jbHVkZS9saW51eC91ZGZfZnNfc2IuaAppbmRleCA4MGFlOWVmLi45YmM0NzM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VkZl9mc19zYi5oCisrKyBiL2luY2x1ZGUvbGludXgvdWRmX2ZzX3NiLmgKQEAgLTc1LDcgKzc1LDcgQEAKIHN0cnVjdCB1ZGZfc2JfaW5mbwogewogCXN0cnVjdCB1ZGZfcGFydF9tYXAJKnNfcGFydG1hcHM7Ci0JX191OAkJCXNfdm9saWRlbnRbMzJdOworCV9fdTgJCQlzX3ZvbHVtZV9pZGVudFszMl07CiAKIAkvKiBPdmVyYWxsIGluZm8gKi8KIAlfX3UxNgkJCXNfcGFydGl0aW9uczsKQEAgLTg0LDkgKzg0LDkgQEAKIAkvKiBTZWN0b3IgaGVhZGVycyAqLwogCV9fczMyCQkJc19zZXNzaW9uOwogCV9fdTMyCQkJc19hbmNob3JbNF07Ci0JX191MzIJCQlzX2xhc3RibG9jazsKKwlfX3UzMgkJCXNfbGFzdF9ibG9jazsKIAotCXN0cnVjdCBidWZmZXJfaGVhZAkqc19sdmlkYmg7CisJc3RydWN0IGJ1ZmZlcl9oZWFkCSpzX2x2aWRfYmg7CiAKIAkvKiBEZWZhdWx0IHBlcm1pc3Npb25zICovCiAJbW9kZV90CQkJc191bWFzazsKQEAgLTk0LDEwICs5NCwxMCBAQAogCXVpZF90CQkJc191aWQ7CiAKIAkvKiBSb290IEluZm8gKi8KLQlzdHJ1Y3QgdGltZXNwZWMJCXNfcmVjb3JkdGltZTsKKwlzdHJ1Y3QgdGltZXNwZWMJCXNfcmVjb3JkX3RpbWU7CiAKIAkvKiBGaWxlc2V0IEluZm8gKi8KLQlfX3UxNgkJCXNfc2VyaWFsbnVtOworCV9fdTE2CQkJc19zZXJpYWxfbnVtYmVyOwogCiAJLyogaGlnaGVzdCBVREYgcmV2aXNpb24gd2UgaGF2ZSByZWNvcmRlZCB0byB0aGlzIG1lZGlhICovCiAJX191MTYJCQlzX3VkZnJldjsKQEAgLTEwOSw3ICsxMDksNyBAQAogCXN0cnVjdCBubHNfdGFibGUJKnNfbmxzX21hcDsKIAogCS8qIFZBVCBpbm9kZSAqLwotCXN0cnVjdCBpbm9kZQkJKnNfdmF0OworCXN0cnVjdCBpbm9kZQkJKnNfdmF0X2lub2RlOwogCiAJc3RydWN0IG11dGV4CQlzX2FsbG9jX211dGV4OwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdWZzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L3Vmc19mcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGI4NTRkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvdWZzX2ZzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NTMgKzAsMCBAQAotLyoKLSAqICBsaW51eC9pbmNsdWRlL2xpbnV4L3Vmc19mcy5oCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk2Ci0gKiBBZHJpYW4gUm9kcmlndWV6IChhZHJpYW5AZnJhbmtsaW5zLXRvd2VyLnJ1dGdlcnMuZWR1KQotICogTGFib3JhdG9yeSBmb3IgQ29tcHV0ZXIgU2NpZW5jZSBSZXNlYXJjaCBDb21wdXRpbmcgRmFjaWxpdHkKLSAqIFJ1dGdlcnMsIFRoZSBTdGF0ZSBVbml2ZXJzaXR5IG9mIE5ldyBKZXJzZXkKLSAqCi0gKiBDbGVhbiBzd2FiIHN1cHBvcnQgYnkgRmFyZSA8ZmFyZUB0dW5lcy5vcmc+Ci0gKiBqdXN0IGhvcGUgbm8gb25lIGlzIHVzaW5nIE5OVVVYWEkgb24gX18/NjQgc3RydWN0dXJlIGVsZW1lbnRzCi0gKiA2NC1iaXQgY2xlYW4gdGhhbmtzIHRvIE1hY2llaiBXLiBSb3p5Y2tpIDxtYWNyb0BkczIucGcuZ2RhLnBsPgotICoKLSAqIDQuNEJTRCAoRnJlZUJTRCkgc3VwcG9ydCBhZGRlZCBvbiBGZWJydWFyeSAxc3QgMTk5OCBieQotICogTmllbHMgS3Jpc3RpYW4gQmVjaCBKZW5zZW4gPG5rYmpAaW1hZ2UuZGs+IHBhcnRpYWxseSBiYXNlZAotICogb24gY29kZSBieSBNYXJ0aW4gdm9uIExvZXdpcyA8bWFydGluQG1pcmEuaXNkbi5jcy50dS1iZXJsaW4uZGU+LgotICoKLSAqIE5lWFRzdGVwIHN1cHBvcnQgYWRkZWQgb24gRmVicnVhcnkgNXRoIDE5OTggYnkKLSAqIE5pZWxzIEtyaXN0aWFuIEJlY2ggSmVuc2VuIDxua2JqQGltYWdlLmRrPi4KLSAqCi0gKiBXcml0ZSBzdXBwb3J0IGJ5IERhbmllbCBQaXJrbCA8ZGFuaWVsLnBpcmtsQGVtYWlsLmN6PgotICoKLSAqIEhQL1VYIGhmcyBmaWxlc3lzdGVtIHN1cHBvcnQgYWRkZWQgYnkKLSAqIE1hcnRpbiBLLiBQZXRlcnNlbiA8bWtwQG1rcC5uZXQ+LCBBdWd1c3QgMTk5OQotICoKLSAqIFVGUzIgKG9mIEZyZWVCU0QgNS54KSBzdXBwb3J0IGFkZGVkIGJ5Ci0gKiBOaXJhaiBLdW1hciA8bmlyYWoxN0BpaXRib21iYXkub3JnPiAgLCBKYW4gMjAwNAotICoKLSAqLwotCi0jaWZuZGVmIF9fTElOVVhfVUZTX0ZTX0gKLSNkZWZpbmUgX19MSU5VWF9VRlNfRlNfSAotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLQotI2lmbmRlZiBfX0tFUk5FTF9fCi10eXBlZGVmIF9fdTY0IF9fZnM2NDsKLXR5cGVkZWYgX191MzIgX19mczMyOwotdHlwZWRlZiBfX3UxNiBfX2ZzMTY7Ci0jZWxzZQotI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgotdHlwZWRlZiBfX3U2NCBfX2JpdHdpc2UgX19mczY0OwotdHlwZWRlZiBfX3UzMiBfX2JpdHdpc2UgX19mczMyOwotdHlwZWRlZiBfX3UxNiBfX2JpdHdpc2UgX19mczE2OwotI2VuZGlmCi0KLSNkZWZpbmUgVUZTX0JCTE9DSyAwCi0jZGVmaW5lIFVGU19CQlNJWkUgODE5MgotI2RlZmluZSBVRlNfU0JMT0NLIDgxOTIKLSNkZWZpbmUgVUZTX1NCU0laRSA4MTkyCi0KLSNkZWZpbmUgVUZTX1NFQ1RPUl9TSVpFIDUxMgotI2RlZmluZSBVRlNfU0VDVE9SX0JJVFMgOQotI2RlZmluZSBVRlNfTUFHSUMgIDB4MDAwMTE5NTQKLSNkZWZpbmUgVUZTMl9NQUdJQyAweDE5NTQwMTE5Ci0jZGVmaW5lIFVGU19DSUdBTSAgMHg1NDE5MDEwMCAvKiBieXRlc3dhcHBlZCBNQUdJQyAqLwotCi0vKiBDb3BpZWQgZnJvbSBGcmVlQlNEICovCi0vKgotICogRWFjaCBkaXNrIGRyaXZlIGNvbnRhaW5zIHNvbWUgbnVtYmVyIG9mIGZpbGVzeXN0ZW1zLgotICogQSBmaWxlc3lzdGVtIGNvbnNpc3RzIG9mIGEgbnVtYmVyIG9mIGN5bGluZGVyIGdyb3Vwcy4KLSAqIEVhY2ggY3lsaW5kZXIgZ3JvdXAgaGFzIGlub2RlcyBhbmQgZGF0YS4KLSAqCi0gKiBBIGZpbGVzeXN0ZW0gaXMgZGVzY3JpYmVkIGJ5IGl0cyBzdXBlci1ibG9jaywgd2hpY2ggaW4gdHVybgotICogZGVzY3JpYmVzIHRoZSBjeWxpbmRlciBncm91cHMuICBUaGUgc3VwZXItYmxvY2sgaXMgY3JpdGljYWwKLSAqIGRhdGEgYW5kIGlzIHJlcGxpY2F0ZWQgaW4gZWFjaCBjeWxpbmRlciBncm91cCB0byBwcm90ZWN0IGFnYWluc3QKLSAqIGNhdGFzdHJvcGhpYyBsb3NzLiAgVGhpcyBpcyBkb25lIGF0IGBuZXdmcycgdGltZSBhbmQgdGhlIGNyaXRpY2FsCi0gKiBzdXBlci1ibG9jayBkYXRhIGRvZXMgbm90IGNoYW5nZSwgc28gdGhlIGNvcGllcyBuZWVkIG5vdCBiZQotICogcmVmZXJlbmNlZCBmdXJ0aGVyIHVubGVzcyBkaXNhc3RlciBzdHJpa2VzLgotICoKLSAqIEZvciBmaWxlc3lzdGVtIGZzLCB0aGUgb2Zmc2V0cyBvZiB0aGUgdmFyaW91cyBibG9ja3Mgb2YgaW50ZXJlc3QKLSAqIGFyZSBnaXZlbiBpbiB0aGUgc3VwZXIgYmxvY2sgYXM6Ci0gKiAgICAgIFtmcy0+ZnNfc2Jsa25vXSAgICAgICAgIFN1cGVyLWJsb2NrCi0gKiAgICAgIFtmcy0+ZnNfY2Jsa25vXSAgICAgICAgIEN5bGluZGVyIGdyb3VwIGJsb2NrCi0gKiAgICAgIFtmcy0+ZnNfaWJsa25vXSAgICAgICAgIElub2RlIGJsb2NrcwotICogICAgICBbZnMtPmZzX2RibGtub10gICAgICAgICBEYXRhIGJsb2NrcwotICogVGhlIGJlZ2lubmluZyBvZiBjeWxpbmRlciBncm91cCBjZyBpbiBmcywgaXMgZ2l2ZW4gYnkKLSAqIHRoZSBgYGNnYmFzZShmcywgY2cpJycgbWFjcm8uCi0gKgotICogRGVwZW5kaW5nIG9uIHRoZSBhcmNoaXRlY3R1cmUgYW5kIHRoZSBtZWRpYSwgdGhlIHN1cGVyYmxvY2sgbWF5Ci0gKiByZXNpZGUgaW4gYW55IG9uZSBvZiBmb3VyIHBsYWNlcy4gRm9yIHRpbnkgbWVkaWEgd2hlcmUgZXZlcnkgYmxvY2sKLSAqIGNvdW50cywgaXQgaXMgcGxhY2VkIGF0IHRoZSB2ZXJ5IGZyb250IG9mIHRoZSBwYXJ0aXRpb24uIEhpc3RvcmljYWxseSwKLSAqIFVGUzEgcGxhY2VkIGl0IDhLIGZyb20gdGhlIGZyb250IHRvIGxlYXZlIHJvb20gZm9yIHRoZSBkaXNrIGxhYmVsIGFuZAotICogYSBzbWFsbCBib290c3RyYXAuIEZvciBVRlMyIGl0IGdvdCBtb3ZlZCB0byA2NEsgZnJvbSB0aGUgZnJvbnQgdG8gbGVhdmUKLSAqIHJvb20gZm9yIHRoZSBkaXNrIGxhYmVsIGFuZCBhIGJpZ2dlciBib290c3RyYXAsIGFuZCBmb3IgcmVhbGx5IHBpZ2d5Ci0gKiBzeXN0ZW1zIHdlIGNoZWNrIGF0IDI1NksgZnJvbSB0aGUgZnJvbnQgaWYgdGhlIGZpcnN0IHRocmVlIGZhaWwuIEluCi0gKiBhbGwgY2FzZXMgdGhlIHNpemUgb2YgdGhlIHN1cGVyYmxvY2sgd2lsbCBiZSBTQkxPQ0tTSVpFLiBBbGwgdmFsdWVzIGFyZQotICogZ2l2ZW4gaW4gYnl0ZS1vZmZzZXQgZm9ybSwgc28gdGhleSBkbyBub3QgaW1wbHkgYSBzZWN0b3Igc2l6ZS4gVGhlCi0gKiBTQkxPQ0tTRUFSQ0ggc3BlY2lmaWVzIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgbG9jYXRpb25zIHNob3VsZCBiZSBzZWFyY2hlZC4KLSAqLwotI2RlZmluZSBTQkxPQ0tfRkxPUFBZICAgICAgICAwCi0jZGVmaW5lIFNCTE9DS19VRlMxICAgICAgIDgxOTIKLSNkZWZpbmUgU0JMT0NLX1VGUzIgICAgICA2NTUzNgotI2RlZmluZSBTQkxPQ0tfUElHR1kgICAgMjYyMTQ0Ci0jZGVmaW5lIFNCTE9DS1NJWkUgICAgICAgIDgxOTIKLSNkZWZpbmUgU0JMT0NLU0VBUkNIIFwKLSAgICAgICAgeyBTQkxPQ0tfVUZTMiwgU0JMT0NLX1VGUzEsIFNCTE9DS19GTE9QUFksIFNCTE9DS19QSUdHWSwgLTEgfQotCi0KLS8qIEhQIHNwZWNpZmljIE1BR0lDIHZhbHVlcyAqLwotCi0jZGVmaW5lIFVGU19NQUdJQ19MRk4gICAweDAwMDk1MDE0IC8qIGZzIHN1cHBvcnRzIGZpbGVuYW1lcyA+IDE0IGNoYXJzICovCi0jZGVmaW5lIFVGU19DSUdBTV9MRk4gICAweDE0NTAwOTAwIC8qIHNyYWhjIDQxIDwgc2VtYW5lbGlmIHN0cm9wcHVzIHNmICovCi0KLSNkZWZpbmUgVUZTX01BR0lDX1NFQyAgIDB4MDA2MTIxOTUgLyogQjEgc2VjdXJpdHkgZnMgKi8KLSNkZWZpbmUgVUZTX0NJR0FNX1NFQyAgIDB4OTUyMTYxMDAKLQotI2RlZmluZSBVRlNfTUFHSUNfRkVBICAgMHgwMDE5NTYxMiAvKiBmc19mZWF0dXJlYml0cyBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgVUZTX0NJR0FNX0ZFQSAgIDB4MTI1NjE5MDAKLQotI2RlZmluZSBVRlNfTUFHSUNfNEdCICAgMHgwNTIzMTk5NCAvKiBmcyA+IDQgR0IgJiYgZnNfZmVhdHVyZWJpdHMgKi8KLSNkZWZpbmUgVUZTX0NJR0FNXzRHQiAgIDB4OTQxOTIzMDUKLQotLyogU2VlbXMgc29tZWJvZHkgYXQgSFAgZ29vZmVkIGhlcmUuIEIxIGFuZCBsZnMgYXJlIGJvdGggMHgyICE/ISAqLwotI2RlZmluZSBVRlNfRlNGX0xGTiAgICAgMHgwMDAwMDAwMSAvKiBsb25nIGZpbGUgbmFtZXMgKi8KLSNkZWZpbmUgVUZTX0ZTRl9CMSAgICAgIDB4MDAwMDAwMDIgLyogQjEgc2VjdXJpdHkgKi8KLSNkZWZpbmUgVUZTX0ZTRl9MRlMgICAgIDB4MDAwMDAwMDIgLyogbGFyZ2UgZmlsZXMgKi8KLSNkZWZpbmUgVUZTX0ZTRl9MVUlEICAgIDB4MDAwMDAwMDQgLyogbGFyZ2UgVUlEcyAqLwotCi0vKiBFbmQgb2YgSFAgc3R1ZmYgKi8KLQotCi0jZGVmaW5lIFVGU19CU0laRQk4MTkyCi0jZGVmaW5lIFVGU19NSU5CU0laRQk0MDk2Ci0jZGVmaW5lIFVGU19GU0laRQkxMDI0Ci0jZGVmaW5lIFVGU19NQVhGUkFHCShVRlNfQlNJWkUgLyBVRlNfRlNJWkUpCi0KLSNkZWZpbmUgVUZTX05EQUREUiAxMgotI2RlZmluZSBVRlNfTklORElSIDMKLQotI2RlZmluZSBVRlNfSU5EX0JMT0NLCShVRlNfTkRBRERSICsgMCkKLSNkZWZpbmUgVUZTX0RJTkRfQkxPQ0sJKFVGU19OREFERFIgKyAxKQotI2RlZmluZSBVRlNfVElORF9CTE9DSwkoVUZTX05EQUREUiArIDIpCi0KLSNkZWZpbmUgVUZTX05ESVJfRlJBR01FTlQgKFVGU19OREFERFIgPDwgdXNwaS0+c19mcGJzaGlmdCkKLSNkZWZpbmUgVUZTX0lORF9GUkFHTUVOVCAoVUZTX0lORF9CTE9DSyA8PCB1c3BpLT5zX2ZwYnNoaWZ0KQotI2RlZmluZSBVRlNfRElORF9GUkFHTUVOVCAoVUZTX0RJTkRfQkxPQ0sgPDwgdXNwaS0+c19mcGJzaGlmdCkKLSNkZWZpbmUgVUZTX1RJTkRfRlJBR01FTlQgKFVGU19USU5EX0JMT0NLIDw8IHVzcGktPnNfZnBic2hpZnQpCi0KLSNkZWZpbmUgVUZTX1JPT1RJTk8gMgotI2RlZmluZSBVRlNfRklSU1RfSU5PIChVRlNfUk9PVElOTyArIDEpCi0KLSNkZWZpbmUgVUZTX1VTRUVGVCAgKChfX3UxNik2NTUzNSkKLQotI2RlZmluZSBVRlNfRlNPSyAgICAgIDB4N2MyNjlkMzgKLSNkZWZpbmUgVUZTX0ZTQUNUSVZFICAoKF9fczgpMHgwMCkKLSNkZWZpbmUgVUZTX0ZTQ0xFQU4gICAoKF9fczgpMHgwMSkKLSNkZWZpbmUgVUZTX0ZTU1RBQkxFICAoKF9fczgpMHgwMikKLSNkZWZpbmUgVUZTX0ZTT1NGMSAgICAoKF9fczgpMHgwMykJLyogaXMgdGhpcyBjb3JyZWN0IGZvciBERUMgT1NGLzE/ICovCi0jZGVmaW5lIFVGU19GU0JBRCAgICAgKChfX3M4KTB4ZmYpCi0KLS8qIEZyb20gaGVyZSB0byBuZXh0IGJsYW5rIGxpbmUsIHNfZmxhZ3MgZm9yIHVmc19zYl9pbmZvICovCi0vKiBkaXJlY3RvcnkgZW50cnkgZW5jb2RpbmcgKi8KLSNkZWZpbmUgVUZTX0RFX01BU0sJCTB4MDAwMDAwMTAJLyogbWFzayBmb3IgdGhlIGZvbGxvd2luZyAqLwotI2RlZmluZSBVRlNfREVfT0xECQkweDAwMDAwMDAwCi0jZGVmaW5lIFVGU19ERV80NEJTRAkJMHgwMDAwMDAxMAotLyogdWlkIGVuY29kaW5nICovCi0jZGVmaW5lIFVGU19VSURfTUFTSwkJMHgwMDAwMDA2MAkvKiBtYXNrIGZvciB0aGUgZm9sbG93aW5nICovCi0jZGVmaW5lIFVGU19VSURfT0xECQkweDAwMDAwMDAwCi0jZGVmaW5lIFVGU19VSURfNDRCU0QJCTB4MDAwMDAwMjAKLSNkZWZpbmUgVUZTX1VJRF9FRlQJCTB4MDAwMDAwNDAKLS8qIHN1cGVyYmxvY2sgc3RhdGUgZW5jb2RpbmcgKi8KLSNkZWZpbmUgVUZTX1NUX01BU0sJCTB4MDAwMDA3MDAJLyogbWFzayBmb3IgdGhlIGZvbGxvd2luZyAqLwotI2RlZmluZSBVRlNfU1RfT0xECQkweDAwMDAwMDAwCi0jZGVmaW5lIFVGU19TVF80NEJTRAkJMHgwMDAwMDEwMAotI2RlZmluZSBVRlNfU1RfU1VOCQkweDAwMDAwMjAwIC8qIFNvbGFyaXMgKi8KLSNkZWZpbmUgVUZTX1NUX1NVTk9TCQkweDAwMDAwMzAwCi0jZGVmaW5lIFVGU19TVF9TVU54ODYJCTB4MDAwMDA0MDAgLyogU29sYXJpcyB4ODYgKi8KLS8qY3lsaW5kZXIgZ3JvdXAgZW5jb2RpbmcgKi8KLSNkZWZpbmUgVUZTX0NHX01BU0sJCTB4MDAwMDMwMDAJLyogbWFzayBmb3IgdGhlIGZvbGxvd2luZyAqLwotI2RlZmluZSBVRlNfQ0dfT0xECQkweDAwMDAwMDAwCi0jZGVmaW5lIFVGU19DR180NEJTRAkJMHgwMDAwMjAwMAotI2RlZmluZSBVRlNfQ0dfU1VOCQkweDAwMDAxMDAwCi0vKiBmaWxlc3lzdGVtIHR5cGUgZW5jb2RpbmcgKi8KLSNkZWZpbmUgVUZTX1RZUEVfTUFTSwkJMHgwMDAxMDAwMAkvKiBtYXNrIGZvciB0aGUgZm9sbG93aW5nICovCi0jZGVmaW5lIFVGU19UWVBFX1VGUzEJCTB4MDAwMDAwMDAKLSNkZWZpbmUgVUZTX1RZUEVfVUZTMgkJMHgwMDAxMDAwMAotCi0KLS8qIGZzX2lub2RlZm10IG9wdGlvbnMgKi8KLSNkZWZpbmUgVUZTXzQySU5PREVGTVQJLTEKLSNkZWZpbmUgVUZTXzQ0SU5PREVGTVQJMgotCi0vKgotICogTUlORlJFRSBnaXZlcyB0aGUgbWluaW11bSBhY2NlcHRhYmxlIHBlcmNlbnRhZ2Ugb2YgZmlsZSBzeXN0ZW0KLSAqIGJsb2NrcyB3aGljaCBtYXkgYmUgZnJlZS4gSWYgdGhlIGZyZWVsaXN0IGRyb3BzIGJlbG93IHRoaXMgbGV2ZWwKLSAqIG9ubHkgdGhlIHN1cGVydXNlciBtYXkgY29udGludWUgdG8gYWxsb2NhdGUgYmxvY2tzLiBUaGlzIG1heQotICogYmUgc2V0IHRvIDAgaWYgbm8gcmVzZXJ2ZSBvZiBmcmVlIGJsb2NrcyBpcyBkZWVtZWQgbmVjZXNzYXJ5LAotICogaG93ZXZlciB0aHJvdWdocHV0IGRyb3BzIGJ5IGZpZnR5IHBlcmNlbnQgaWYgdGhlIGZpbGUgc3lzdGVtCi0gKiBpcyBydW4gYXQgYmV0d2VlbiA5NSUgYW5kIDEwMCUgZnVsbDsgdGh1cyB0aGUgbWluaW11bSBkZWZhdWx0Ci0gKiB2YWx1ZSBvZiBmc19taW5mcmVlIGlzIDUlLiBIb3dldmVyLCB0byBnZXQgZ29vZCBjbHVzdGVyaW5nCi0gKiBwZXJmb3JtYW5jZSwgMTAlIGlzIGEgYmV0dGVyIGNob2ljZS4gaGVuY2Ugd2UgdXNlIDEwJSBhcyBvdXIKLSAqIGRlZmF1bHQgdmFsdWUuIFdpdGggMTAlIGZyZWUgc3BhY2UsIGZyYWdtZW50YXRpb24gaXMgbm90IGEKLSAqIHByb2JsZW0sIHNvIHdlIGNob29zZSB0byBvcHRpbWl6ZSBmb3IgdGltZS4KLSAqLwotI2RlZmluZSBVRlNfTUlORlJFRSAgICAgICAgIDUKLSNkZWZpbmUgVUZTX0RFRkFVTFRPUFQgICAgICBVRlNfT1BUVElNRQotICAgICAgICAgICAgCi0vKgotICogVHVybiBmaWxlIHN5c3RlbSBibG9jayBudW1iZXJzIGludG8gZGlzayBibG9jayBhZGRyZXNzZXMuCi0gKiBUaGlzIG1hcHMgZmlsZSBzeXN0ZW0gYmxvY2tzIHRvIGRldmljZSBzaXplIGJsb2Nrcy4KLSAqLwotI2RlZmluZSB1ZnNfZnNidG9kYih1c3BpLCBiKQkoKGIpIDw8ICh1c3BpKS0+c19mc2J0b2RiKQotI2RlZmluZQl1ZnNfZGJ0b2ZzYih1c3BpLCBiKQkoKGIpID4+ICh1c3BpKS0+c19mc2J0b2RiKQotCi0vKgotICogQ3lsaW5kZXIgZ3JvdXAgbWFjcm9zIHRvIGxvY2F0ZSB0aGluZ3MgaW4gY3lsaW5kZXIgZ3JvdXBzLgotICogVGhleSBjYWxjIGZpbGUgc3lzdGVtIGFkZHJlc3NlcyBvZiBjeWxpbmRlciBncm91cCBkYXRhIHN0cnVjdHVyZXMuCi0gKi8KLSNkZWZpbmUJdWZzX2NnYmFzZShjKQkodXNwaS0+c19mcGcgKiAoYykpCi0jZGVmaW5lIHVmc19jZ3N0YXJ0KGMpCSgodXNwaSktPmZzX21hZ2ljID09IFVGUzJfTUFHSUMgPyAgdWZzX2NnYmFzZShjKSA6IFwKLQkodWZzX2NnYmFzZShjKSAgKyB1c3BpLT5zX2Nnb2Zmc2V0ICogKChjKSAmIH51c3BpLT5zX2NnbWFzaykpKQotI2RlZmluZQl1ZnNfY2dzYmxvY2soYykJKHVmc19jZ3N0YXJ0KGMpICsgdXNwaS0+c19zYmxrbm8pCS8qIHN1cGVyIGJsayAqLwotI2RlZmluZQl1ZnNfY2djbWluKGMpCSh1ZnNfY2dzdGFydChjKSArIHVzcGktPnNfY2Jsa25vKQkvKiBjZyBibG9jayAqLwotI2RlZmluZQl1ZnNfY2dpbWluKGMpCSh1ZnNfY2dzdGFydChjKSArIHVzcGktPnNfaWJsa25vKQkvKiBpbm9kZSBibGsgKi8KLSNkZWZpbmUJdWZzX2NnZG1pbihjKQkodWZzX2Nnc3RhcnQoYykgKyB1c3BpLT5zX2RibGtubykJLyogMXN0IGRhdGEgKi8KLQotLyoKLSAqIE1hY3JvcyBmb3IgaGFuZGxpbmcgaW5vZGUgbnVtYmVyczoKLSAqICAgICBpbm9kZSBudW1iZXIgdG8gZmlsZSBzeXN0ZW0gYmxvY2sgb2Zmc2V0LgotICogICAgIGlub2RlIG51bWJlciB0byBjeWxpbmRlciBncm91cCBudW1iZXIuCi0gKiAgICAgaW5vZGUgbnVtYmVyIHRvIGZpbGUgc3lzdGVtIGJsb2NrIGFkZHJlc3MuCi0gKi8KLSNkZWZpbmUJdWZzX2lub3RvY2coeCkJCSgoeCkgLyB1c3BpLT5zX2lwZykKLSNkZWZpbmUJdWZzX2lub3RvY2dvZmYoeCkJKCh4KSAlIHVzcGktPnNfaXBnKQotI2RlZmluZQl1ZnNfaW5vdG9mc2JhKHgpCSgoKHU2NCl1ZnNfY2dpbWluKHVmc19pbm90b2NnKHgpKSkgKyB1ZnNfaW5vdG9jZ29mZih4KSAvIHVzcGktPnNfaW5vcGYpCi0jZGVmaW5lCXVmc19pbm90b2ZzYm8oeCkJKCh4KSAlIHVzcGktPnNfaW5vcGYpCi0KLS8qCi0gKiBDb21wdXRlIHRoZSBjeWxpbmRlciBhbmQgcm90YXRpb25hbCBwb3NpdGlvbiBvZiBhIGN5bCBibG9jayBhZGRyLgotICovCi0jZGVmaW5lIHVmc19jYnRvY3lsbm8oYm5vKSBcCi0JKChibm8pICogdXNwaS0+c19uc3BmIC8gdXNwaS0+c19zcGMpCi0jZGVmaW5lIHVmc19jYnRvcnBvcyhibm8pIFwKLQkoKCgoYm5vKSAqIHVzcGktPnNfbnNwZiAlIHVzcGktPnNfc3BjIC8gdXNwaS0+c19uc2VjdCBcCi0JKiB1c3BpLT5zX3RyYWNrc2tldyArIChibm8pICogdXNwaS0+c19uc3BmICUgdXNwaS0+c19zcGMgXAotCSUgdXNwaS0+c19uc2VjdCAqIHVzcGktPnNfaW50ZXJsZWF2ZSkgJSB1c3BpLT5zX25zZWN0IFwKLQkqIHVzcGktPnNfbnJwb3MpIC8gdXNwaS0+c19ucHNlY3QpCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIG1hY3JvcyBvcHRpbWl6ZSBjZXJ0YWluIGZyZXF1ZW50bHkgY2FsY3VsYXRlZAotICogcXVhbnRpdGllcyBieSB1c2luZyBzaGlmdHMgYW5kIG1hc2tzIGluIHBsYWNlIG9mIGRpdmlzaW9ucwotICogbW9kdWxvcyBhbmQgbXVsdGlwbGljYXRpb25zLgotICovCi0jZGVmaW5lIHVmc19ibGtvZmYobG9jKQkJKChsb2MpICYgdXNwaS0+c19xYm1hc2spCi0jZGVmaW5lIHVmc19mcmFnb2ZmKGxvYykJKChsb2MpICYgdXNwaS0+c19xZm1hc2spCi0jZGVmaW5lIHVmc19sYmxrdG9zaXplKGJsaykJKChibGspIDw8IHVzcGktPnNfYnNoaWZ0KQotI2RlZmluZSB1ZnNfbGJsa25vKGxvYykJCSgobG9jKSA+PiB1c3BpLT5zX2JzaGlmdCkKLSNkZWZpbmUgdWZzX251bWZyYWdzKGxvYykJKChsb2MpID4+IHVzcGktPnNfZnNoaWZ0KQotI2RlZmluZSB1ZnNfYmxrcm91bmR1cChzaXplKQkoKChzaXplKSArIHVzcGktPnNfcWJtYXNrKSAmIHVzcGktPnNfYm1hc2spCi0jZGVmaW5lIHVmc19mcmFncm91bmR1cChzaXplKQkoKChzaXplKSArIHVzcGktPnNfcWZtYXNrKSAmIHVzcGktPnNfZm1hc2spCi0jZGVmaW5lIHVmc19mcmFnc3RvYmxrcyhmcmFncykJKChmcmFncykgPj4gdXNwaS0+c19mcGJzaGlmdCkKLSNkZWZpbmUgdWZzX2Jsa3N0b2ZyYWdzKGJsa3MpCSgoYmxrcykgPDwgdXNwaS0+c19mcGJzaGlmdCkKLSNkZWZpbmUgdWZzX2ZyYWdudW0oZnNiKQkoKGZzYikgJiB1c3BpLT5zX2ZwYm1hc2spCi0jZGVmaW5lIHVmc19ibGtudW0oZnNiKQkJKChmc2IpICYgfnVzcGktPnNfZnBibWFzaykKLQotI2RlZmluZQlVRlNfTUFYTkFNTEVOIDI1NQotI2RlZmluZSBVRlNfTUFYTU5UTEVOIDUxMgotI2RlZmluZSBVRlMyX01BWE1OVExFTiA0NjgKLSNkZWZpbmUgVUZTMl9NQVhWT0xMRU4gMzIKLSNkZWZpbmUgVUZTX01BWENTQlVGUyAzMQotI2RlZmluZSBVRlNfTElOS19NQVggMzIwMDAKLS8qCi0jZGVmaW5lCVVGUzJfTk9DU1BUUlMJKCgxMjggLyBzaXplb2Yodm9pZCAqKSkgLSA0KQotKi8KLSNkZWZpbmUJVUZTMl9OT0NTUFRSUwkyOAotCi0vKgotICogVUZTX0RJUl9QQUQgZGVmaW5lcyB0aGUgZGlyZWN0b3J5IGVudHJpZXMgYm91bmRhcmllcwotICogKG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0KQotICovCi0jZGVmaW5lIFVGU19ESVJfUEFECQkJNAotI2RlZmluZSBVRlNfRElSX1JPVU5ECQkJKFVGU19ESVJfUEFEIC0gMSkKLSNkZWZpbmUgVUZTX0RJUl9SRUNfTEVOKG5hbWVfbGVuKQkoKChuYW1lX2xlbikgKyAxICsgOCArIFVGU19ESVJfUk9VTkQpICYgflVGU19ESVJfUk9VTkQpCi0KLXN0cnVjdCB1ZnNfdGltZXZhbCB7Ci0JX19mczMyCXR2X3NlYzsKLQlfX2ZzMzIJdHZfdXNlYzsKLX07Ci0KLXN0cnVjdCB1ZnNfZGlyX2VudHJ5IHsKLQlfX2ZzMzIgIGRfaW5vOwkJCS8qIGlub2RlIG51bWJlciBvZiB0aGlzIGVudHJ5ICovCi0JX19mczE2ICBkX3JlY2xlbjsJCS8qIGxlbmd0aCBvZiB0aGlzIGVudHJ5ICovCi0JdW5pb24gewotCQlfX2ZzMTYJZF9uYW1sZW47CQkvKiBhY3R1YWwgbGVuZ3RoIG9mIGRfbmFtZSAqLwotCQlzdHJ1Y3QgewotCQkJX191OAlkX3R5cGU7CQkvKiBmaWxlIHR5cGUgKi8KLQkJCV9fdTgJZF9uYW1sZW47CS8qIGxlbmd0aCBvZiBzdHJpbmcgaW4gZF9uYW1lICovCi0JCX0gZF80NDsKLQl9IGRfdTsKLQlfX3U4CWRfbmFtZVtVRlNfTUFYTkFNTEVOICsgMV07CS8qIGZpbGUgbmFtZSAqLwotfTsKLQotc3RydWN0IHVmc19jc3VtIHsKLQlfX2ZzMzIJY3NfbmRpcjsJLyogbnVtYmVyIG9mIGRpcmVjdG9yaWVzICovCi0JX19mczMyCWNzX25iZnJlZTsJLyogbnVtYmVyIG9mIGZyZWUgYmxvY2tzICovCi0JX19mczMyCWNzX25pZnJlZTsJLyogbnVtYmVyIG9mIGZyZWUgaW5vZGVzICovCi0JX19mczMyCWNzX25mZnJlZTsJLyogbnVtYmVyIG9mIGZyZWUgZnJhZ3MgKi8KLX07Ci1zdHJ1Y3QgdWZzMl9jc3VtX3RvdGFsIHsKLQlfX2ZzNjQJY3NfbmRpcjsJLyogbnVtYmVyIG9mIGRpcmVjdG9yaWVzICovCi0JX19mczY0CWNzX25iZnJlZTsJLyogbnVtYmVyIG9mIGZyZWUgYmxvY2tzICovCi0JX19mczY0CWNzX25pZnJlZTsJLyogbnVtYmVyIG9mIGZyZWUgaW5vZGVzICovCi0JX19mczY0CWNzX25mZnJlZTsJLyogbnVtYmVyIG9mIGZyZWUgZnJhZ3MgKi8KLQlfX2ZzNjQgICBjc19udW1jbHVzdGVyczsJLyogbnVtYmVyIG9mIGZyZWUgY2x1c3RlcnMgKi8KLQlfX2ZzNjQgICBjc19zcGFyZVszXTsJLyogZnV0dXJlIGV4cGFuc2lvbiAqLwotfTsKLQotc3RydWN0IHVmc19jc3VtX2NvcmUgewotCV9fdTY0CWNzX25kaXI7CS8qIG51bWJlciBvZiBkaXJlY3RvcmllcyAqLwotCV9fdTY0CWNzX25iZnJlZTsJLyogbnVtYmVyIG9mIGZyZWUgYmxvY2tzICovCi0JX191NjQJY3NfbmlmcmVlOwkvKiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgKi8KLQlfX3U2NAljc19uZmZyZWU7CS8qIG51bWJlciBvZiBmcmVlIGZyYWdzICovCi0JX191NjQgICBjc19udW1jbHVzdGVyczsJLyogbnVtYmVyIG9mIGZyZWUgY2x1c3RlcnMgKi8KLX07Ci0KLS8qCi0gKiBGaWxlIHN5c3RlbSBmbGFncwotICovCi0jZGVmaW5lIFVGU19VTkNMRUFOICAgICAgMHgwMSAgICAvKiBmaWxlIHN5c3RlbSBub3QgY2xlYW4gYXQgbW91bnQgKHVudXNlZCkgKi8KLSNkZWZpbmUgVUZTX0RPU09GVERFUCAgICAweDAyICAgIC8qIGZpbGUgc3lzdGVtIHVzaW5nIHNvZnQgZGVwZW5kZW5jaWVzICovCi0jZGVmaW5lIFVGU19ORUVEU0ZTQ0sgICAgMHgwNCAgICAvKiBuZWVkcyBzeW5jIGZzY2sgKEZyZWVCU0QgY29tcGF0LCB1bnVzZWQpICovCi0jZGVmaW5lIFVGU19JTkRFWERJUlMgICAgMHgwOCAgICAvKiBrZXJuZWwgc3VwcG9ydHMgaW5kZXhlZCBkaXJlY3RvcmllcyAqLwotI2RlZmluZSBVRlNfQUNMUyAgICAgICAgIDB4MTAgICAgLyogZmlsZSBzeXN0ZW0gaGFzIEFDTHMgZW5hYmxlZCAqLwotI2RlZmluZSBVRlNfTVVMVElMQUJFTCAgIDB4MjAgICAgLyogZmlsZSBzeXN0ZW0gaXMgTUFDIG11bHRpLWxhYmVsICovCi0jZGVmaW5lIFVGU19GTEFHU19VUERBVEVEIDB4ODAgICAvKiBmbGFncyBoYXZlIGJlZW4gbW92ZWQgdG8gbmV3IGxvY2F0aW9uICovCi0KLSNpZiAwCi0vKgotICogVGhpcyBpcyB0aGUgYWN0dWFsIHN1cGVyYmxvY2ssIGFzIGl0IGlzIGxhaWQgb3V0IG9uIHRoZSBkaXNrLgotICogRG8gTk9UIHVzZSB0aGlzIHN0cnVjdHVyZSwgYmVjYXVzZSBvZiBzaXplb2YodWZzX3N1cGVyX2Jsb2NrKSA+IDUxMiBhbmQKLSAqIGl0IG1heSBvY2N1cHkgc2V2ZXJhbCBibG9ja3MsIHVzZQotICogc3RydWN0IHVmc19zdXBlcl9ibG9ja18oZmlyc3Qsc2Vjb25kLHRoaXJkKSBpbnN0ZWFkLgotICovCi1zdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrIHsKLQl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQlfX2ZzMzIJZnNfbGluazsJLyogVU5VU0VEICovCi0JCX0gZnNfNDI7Ci0JCXN0cnVjdCB7Ci0JCQlfX2ZzMzIJZnNfc3RhdGU7CS8qIGZpbGUgc3lzdGVtIHN0YXRlIGZsYWcgKi8KLQkJfSBmc19zdW47Ci0JfSBmc191MDsKLQlfX2ZzMzIJZnNfcmxpbms7CS8qIFVOVVNFRCAqLwotCV9fZnMzMglmc19zYmxrbm87CS8qIGFkZHIgb2Ygc3VwZXItYmxvY2sgaW4gZmlsZXN5cyAqLwotCV9fZnMzMglmc19jYmxrbm87CS8qIG9mZnNldCBvZiBjeWwtYmxvY2sgaW4gZmlsZXN5cyAqLwotCV9fZnMzMglmc19pYmxrbm87CS8qIG9mZnNldCBvZiBpbm9kZS1ibG9ja3MgaW4gZmlsZXN5cyAqLwotCV9fZnMzMglmc19kYmxrbm87CS8qIG9mZnNldCBvZiBmaXJzdCBkYXRhIGFmdGVyIGNnICovCi0JX19mczMyCWZzX2Nnb2Zmc2V0OwkvKiBjeWxpbmRlciBncm91cCBvZmZzZXQgaW4gY3lsaW5kZXIgKi8KLQlfX2ZzMzIJZnNfY2dtYXNrOwkvKiB1c2VkIHRvIGNhbGMgbW9kIGZzX250cmFrICovCi0JX19mczMyCWZzX3RpbWU7CS8qIGxhc3QgdGltZSB3cml0dGVuIC0tIHRpbWVfdCAqLwotCV9fZnMzMglmc19zaXplOwkvKiBudW1iZXIgb2YgYmxvY2tzIGluIGZzICovCi0JX19mczMyCWZzX2RzaXplOwkvKiBudW1iZXIgb2YgZGF0YSBibG9ja3MgaW4gZnMgKi8KLQlfX2ZzMzIJZnNfbmNnOwkJLyogbnVtYmVyIG9mIGN5bGluZGVyIGdyb3VwcyAqLwotCV9fZnMzMglmc19ic2l6ZTsJLyogc2l6ZSBvZiBiYXNpYyBibG9ja3MgaW4gZnMgKi8KLQlfX2ZzMzIJZnNfZnNpemU7CS8qIHNpemUgb2YgZnJhZyBibG9ja3MgaW4gZnMgKi8KLQlfX2ZzMzIJZnNfZnJhZzsJLyogbnVtYmVyIG9mIGZyYWdzIGluIGEgYmxvY2sgaW4gZnMgKi8KLS8qIHRoZXNlIGFyZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi8KLQlfX2ZzMzIJZnNfbWluZnJlZTsJLyogbWluaW11bSBwZXJjZW50YWdlIG9mIGZyZWUgYmxvY2tzICovCi0JX19mczMyCWZzX3JvdGRlbGF5OwkvKiBudW0gb2YgbXMgZm9yIG9wdGltYWwgbmV4dCBibG9jayAqLwotCV9fZnMzMglmc19ycHM7CQkvKiBkaXNrIHJldm9sdXRpb25zIHBlciBzZWNvbmQgKi8KLS8qIHRoZXNlIGZpZWxkcyBjYW4gYmUgY29tcHV0ZWQgZnJvbSB0aGUgb3RoZXJzICovCi0JX19mczMyCWZzX2JtYXNrOwkvKiBgYGJsa29mZicnIGNhbGMgb2YgYmxrIG9mZnNldHMgKi8KLQlfX2ZzMzIJZnNfZm1hc2s7CS8qIGBgZnJhZ29mZicnIGNhbGMgb2YgZnJhZyBvZmZzZXRzICovCi0JX19mczMyCWZzX2JzaGlmdDsJLyogYGBsYmxrbm8nJyBjYWxjIG9mIGxvZ2ljYWwgYmxrbm8gKi8KLQlfX2ZzMzIJZnNfZnNoaWZ0OwkvKiBgYG51bWZyYWdzJycgY2FsYyBudW1iZXIgb2YgZnJhZ3MgKi8KLS8qIHRoZXNlIGFyZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi8KLQlfX2ZzMzIJZnNfbWF4Y29udGlnOwkvKiBtYXggbnVtYmVyIG9mIGNvbnRpZ3VvdXMgYmxrcyAqLwotCV9fZnMzMglmc19tYXhicGc7CS8qIG1heCBudW1iZXIgb2YgYmxrcyBwZXIgY3lsIGdyb3VwICovCi0vKiB0aGVzZSBmaWVsZHMgY2FuIGJlIGNvbXB1dGVkIGZyb20gdGhlIG90aGVycyAqLwotCV9fZnMzMglmc19mcmFnc2hpZnQ7CS8qIGJsb2NrIHRvIGZyYWcgc2hpZnQgKi8KLQlfX2ZzMzIJZnNfZnNidG9kYjsJLyogZnNidG9kYiBhbmQgZGJ0b2ZzYiBzaGlmdCBjb25zdGFudCAqLwotCV9fZnMzMglmc19zYnNpemU7CS8qIGFjdHVhbCBzaXplIG9mIHN1cGVyIGJsb2NrICovCi0JX19mczMyCWZzX2NzbWFzazsJLyogY3N1bSBibG9jayBvZmZzZXQgKi8KLQlfX2ZzMzIJZnNfY3NzaGlmdDsJLyogY3N1bSBibG9jayBudW1iZXIgKi8KLQlfX2ZzMzIJZnNfbmluZGlyOwkvKiB2YWx1ZSBvZiBOSU5ESVIgKi8KLQlfX2ZzMzIJZnNfaW5vcGI7CS8qIHZhbHVlIG9mIElOT1BCICovCi0JX19mczMyCWZzX25zcGY7CS8qIHZhbHVlIG9mIE5TUEYgKi8KLS8qIHlldCBhbm90aGVyIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICovCi0JX19mczMyCWZzX29wdGltOwkvKiBvcHRpbWl6YXRpb24gcHJlZmVyZW5jZSwgc2VlIGJlbG93ICovCi0vKiB0aGVzZSBmaWVsZHMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaGFyZHdhcmUgKi8KLQl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQlfX2ZzMzIJZnNfbnBzZWN0OwkvKiAjIHNlY3RvcnMvdHJhY2sgaW5jbHVkaW5nIHNwYXJlcyAqLwotCQl9IGZzX3N1bjsKLQkJc3RydWN0IHsKLQkJCV9fZnMzMglmc19zdGF0ZTsJLyogZmlsZSBzeXN0ZW0gc3RhdGUgdGltZSBzdGFtcCAqLwotCQl9IGZzX3N1bng4NjsKLQl9IGZzX3UxOwotCV9fZnMzMglmc19pbnRlcmxlYXZlOwkvKiBoYXJkd2FyZSBzZWN0b3IgaW50ZXJsZWF2ZSAqLwotCV9fZnMzMglmc190cmFja3NrZXc7CS8qIHNlY3RvciAwIHNrZXcsIHBlciB0cmFjayAqLwotLyogYSB1bmlxdWUgaWQgZm9yIHRoaXMgZmlsZXN5c3RlbSAoY3VycmVudGx5IHVudXNlZCBhbmQgdW5tYWludGFpbmVkKSAqLwotLyogSW4gNC4zIFRhaG9lIHRoaXMgc3BhY2UgaXMgdXNlZCBieSBmc19oZWFkc3dpdGNoIGFuZCBmc190cmtzZWVrICovCi0vKiBOZWl0aGVyIG9mIHRob3NlIGZpZWxkcyBpcyB1c2VkIGluIHRoZSBUYWhvZSBjb2RlIHJpZ2h0IG5vdyBidXQgKi8KLS8qIHRoZXJlIGNvdWxkIGJlIHByb2JsZW1zIGlmIHRoZXkgYXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCV9fZnMzMglmc19pZFsyXTsJLyogZmlsZSBzeXN0ZW0gaWQgKi8KLS8qIHNpemVzIGRldGVybWluZWQgYnkgbnVtYmVyIG9mIGN5bGluZGVyIGdyb3VwcyBhbmQgdGhlaXIgc2l6ZXMgKi8KLQlfX2ZzMzIJZnNfY3NhZGRyOwkvKiBibGsgYWRkciBvZiBjeWwgZ3JwIHN1bW1hcnkgYXJlYSAqLwotCV9fZnMzMglmc19jc3NpemU7CS8qIHNpemUgb2YgY3lsIGdycCBzdW1tYXJ5IGFyZWEgKi8KLQlfX2ZzMzIJZnNfY2dzaXplOwkvKiBjeWxpbmRlciBncm91cCBzaXplICovCi0vKiB0aGVzZSBmaWVsZHMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaGFyZHdhcmUgKi8KLQlfX2ZzMzIJZnNfbnRyYWs7CS8qIHRyYWNrcyBwZXIgY3lsaW5kZXIgKi8KLQlfX2ZzMzIJZnNfbnNlY3Q7CS8qIHNlY3RvcnMgcGVyIHRyYWNrICovCi0JX19mczMyCWZzX3NwYzsJCS8qIHNlY3RvcnMgcGVyIGN5bGluZGVyICovCi0vKiB0aGlzIGNvbWVzIGZyb20gdGhlIGRpc2sgZHJpdmVyIHBhcnRpdGlvbmluZyAqLwotCV9fZnMzMglmc19uY3lsOwkvKiBjeWxpbmRlcnMgaW4gZmlsZSBzeXN0ZW0gKi8KLS8qIHRoZXNlIGZpZWxkcyBjYW4gYmUgY29tcHV0ZWQgZnJvbSB0aGUgb3RoZXJzICovCi0JX19mczMyCWZzX2NwZzsJCS8qIGN5bGluZGVycyBwZXIgZ3JvdXAgKi8KLQlfX2ZzMzIJZnNfaXBnOwkJLyogaW5vZGVzIHBlciBjeWxpbmRlciBncm91cCAqLwotCV9fZnMzMglmc19mcGc7CQkvKiBibG9ja3MgcGVyIGdyb3VwICogZnNfZnJhZyAqLwotLyogdGhpcyBkYXRhIG11c3QgYmUgcmUtY29tcHV0ZWQgYWZ0ZXIgY3Jhc2hlcyAqLwotCXN0cnVjdCB1ZnNfY3N1bSBmc19jc3RvdGFsOwkvKiBjeWxpbmRlciBzdW1tYXJ5IGluZm9ybWF0aW9uICovCi0vKiB0aGVzZSBmaWVsZHMgYXJlIGNsZWFyZWQgYXQgbW91bnQgdGltZSAqLwotCV9fczgJZnNfZm1vZDsJLyogc3VwZXIgYmxvY2sgbW9kaWZpZWQgZmxhZyAqLwotCV9fczgJZnNfY2xlYW47CS8qIGZpbGUgc3lzdGVtIGlzIGNsZWFuIGZsYWcgKi8KLQlfX3M4CWZzX3Jvbmx5OwkvKiBtb3VudGVkIHJlYWQtb25seSBmbGFnICovCi0JX19zOAlmc19mbGFnczsKLQl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQlfX3M4CWZzX2ZzbW50W1VGU19NQVhNTlRMRU5dOy8qIG5hbWUgbW91bnRlZCBvbiAqLwotCQkJX19mczMyCWZzX2Nncm90b3I7CS8qIGxhc3QgY2cgc2VhcmNoZWQgKi8KLQkJCV9fZnMzMglmc19jc3BbVUZTX01BWENTQlVGU107LypsaXN0IG9mIGZzX2NzIGluZm8gYnVmZmVycyAqLwotCQkJX19mczMyCWZzX21heGNsdXN0ZXI7Ci0JCQlfX2ZzMzIJZnNfY3BjOwkJLyogY3lsIHBlciBjeWNsZSBpbiBwb3N0YmwgKi8KLQkJCV9fZnMxNglmc19vcG9zdGJsWzE2XVs4XTsgLyogb2xkIHJvdGF0aW9uIGJsb2NrIGxpc3QgaGVhZCAqLwotCQl9IGZzX3UxOwotCQlzdHJ1Y3QgewotCQkJX19zOCAgZnNfZnNtbnRbVUZTMl9NQVhNTlRMRU5dOwkvKiBuYW1lIG1vdW50ZWQgb24gKi8KLQkJCV9fdTggICBmc192b2xuYW1lW1VGUzJfTUFYVk9MTEVOXTsgLyogdm9sdW1lIG5hbWUgKi8KLQkJCV9fZnM2NCAgZnNfc3d1aWQ7CQkvKiBzeXN0ZW0td2lkZSB1aWQgKi8KLQkJCV9fZnMzMiAgZnNfcGFkOwkvKiBkdWUgdG8gYWxpZ25tZW50IG9mIGZzX3N3dWlkICovCi0JCQlfX2ZzMzIgICBmc19jZ3JvdG9yOyAgICAgLyogbGFzdCBjZyBzZWFyY2hlZCAqLwotCQkJX19mczMyICAgZnNfb2NzcFtVRlMyX05PQ1NQVFJTXTsgLypsaXN0IG9mIGZzX2NzIGluZm8gYnVmZmVycyAqLwotCQkJX19mczMyICAgZnNfY29udGlnZGlyczsvKiMgb2YgY29udGlndW91c2x5IGFsbG9jYXRlZCBkaXJzICovCi0JCQlfX2ZzMzIgICBmc19jc3A7CS8qIGNnIHN1bW1hcnkgaW5mbyBidWZmZXIgZm9yIGZzX2NzICovCi0JCQlfX2ZzMzIgICBmc19tYXhjbHVzdGVyOwotCQkJX19mczMyICAgZnNfYWN0aXZlOy8qIHVzZWQgYnkgc25hcHNob3RzIHRvIHRyYWNrIGZzICovCi0JCQlfX2ZzMzIgICBmc19vbGRfY3BjOwkvKiBjeWwgcGVyIGN5Y2xlIGluIHBvc3RibCAqLwotCQkJX19mczMyICAgZnNfbWF4YnNpemU7LyptYXhpbXVtIGJsb2NraW5nIGZhY3RvciBwZXJtaXR0ZWQgKi8KLQkJCV9fZnM2NCAgIGZzX3NwYXJlY29uNjRbMTddOy8qb2xkIHJvdGF0aW9uIGJsb2NrIGxpc3QgaGVhZCAqLwotCQkJX19mczY0ICAgZnNfc2Jsb2NrbG9jOyAvKiBieXRlIG9mZnNldCBvZiBzdGFuZGFyZCBzdXBlcmJsb2NrICovCi0JCQlzdHJ1Y3QgIHVmczJfY3N1bV90b3RhbCBmc19jc3RvdGFsOy8qY3lsaW5kZXIgc3VtbWFyeSBpbmZvcm1hdGlvbiovCi0JCQlzdHJ1Y3QgIHVmc190aW1ldmFsICAgIGZzX3RpbWU7CQkvKiBsYXN0IHRpbWUgd3JpdHRlbiAqLwotCQkJX19mczY0ICAgIGZzX3NpemU7CQkvKiBudW1iZXIgb2YgYmxvY2tzIGluIGZzICovCi0JCQlfX2ZzNjQgICAgZnNfZHNpemU7CS8qIG51bWJlciBvZiBkYXRhIGJsb2NrcyBpbiBmcyAqLwotCQkJX19mczY0ICAgZnNfY3NhZGRyOwkvKiBibGsgYWRkciBvZiBjeWwgZ3JwIHN1bW1hcnkgYXJlYSAqLwotCQkJX19mczY0ICAgIGZzX3BlbmRpbmdibG9ja3M7LyogYmxvY2tzIGluIHByb2Nlc3Mgb2YgYmVpbmcgZnJlZWQgKi8KLQkJCV9fZnMzMiAgICBmc19wZW5kaW5naW5vZGVzOy8qaW5vZGVzIGluIHByb2Nlc3Mgb2YgYmVpbmcgZnJlZWQgKi8KLQkJfSBmc191MjsKLQl9ICBmc191MTE7Ci0JdW5pb24gewotCQlzdHJ1Y3QgewotCQkJX19mczMyCWZzX3NwYXJlY29uWzUzXTsvKiByZXNlcnZlZCBmb3IgZnV0dXJlIGNvbnN0YW50cyAqLwotCQkJX19mczMyCWZzX3JlY2xhaW07Ci0JCQlfX2ZzMzIJZnNfc3BhcmVjb24yWzFdOwotCQkJX19mczMyCWZzX3N0YXRlOwkvKiBmaWxlIHN5c3RlbSBzdGF0ZSB0aW1lIHN0YW1wICovCi0JCQlfX2ZzMzIJZnNfcWJtYXNrWzJdOwkvKiB+dXNiX2JtYXNrICovCi0JCQlfX2ZzMzIJZnNfcWZtYXNrWzJdOwkvKiB+dXNiX2ZtYXNrICovCi0JCX0gZnNfc3VuOwotCQlzdHJ1Y3QgewotCQkJX19mczMyCWZzX3NwYXJlY29uWzUzXTsvKiByZXNlcnZlZCBmb3IgZnV0dXJlIGNvbnN0YW50cyAqLwotCQkJX19mczMyCWZzX3JlY2xhaW07Ci0JCQlfX2ZzMzIJZnNfc3BhcmVjb24yWzFdOwotCQkJX19mczMyCWZzX25wc2VjdDsJLyogIyBzZWN0b3JzL3RyYWNrIGluY2x1ZGluZyBzcGFyZXMgKi8KLQkJCV9fZnMzMglmc19xYm1hc2tbMl07CS8qIH51c2JfYm1hc2sgKi8KLQkJCV9fZnMzMglmc19xZm1hc2tbMl07CS8qIH51c2JfZm1hc2sgKi8KLQkJfSBmc19zdW54ODY7Ci0JCXN0cnVjdCB7Ci0JCQlfX2ZzMzIJZnNfc3BhcmVjb25bNTBdOy8qIHJlc2VydmVkIGZvciBmdXR1cmUgY29uc3RhbnRzICovCi0JCQlfX2ZzMzIJZnNfY29udGlnc3Vtc2l6ZTsvKiBzaXplIG9mIGNsdXN0ZXIgc3VtbWFyeSBhcnJheSAqLwotCQkJX19mczMyCWZzX21heHN5bWxpbmtsZW47LyogbWF4IGxlbmd0aCBvZiBhbiBpbnRlcm5hbCBzeW1saW5rICovCi0JCQlfX2ZzMzIJZnNfaW5vZGVmbXQ7CS8qIGZvcm1hdCBvZiBvbi1kaXNrIGlub2RlcyAqLwotCQkJX19mczMyCWZzX21heGZpbGVzaXplWzJdOwkvKiBtYXggcmVwcmVzZW50YWJsZSBmaWxlIHNpemUgKi8KLQkJCV9fZnMzMglmc19xYm1hc2tbMl07CS8qIH51c2JfYm1hc2sgKi8KLQkJCV9fZnMzMglmc19xZm1hc2tbMl07CS8qIH51c2JfZm1hc2sgKi8KLQkJCV9fZnMzMglmc19zdGF0ZTsJLyogZmlsZSBzeXN0ZW0gc3RhdGUgdGltZSBzdGFtcCAqLwotCQl9IGZzXzQ0OwotCX0gZnNfdTI7Ci0JX19mczMyCWZzX3Bvc3RibGZvcm1hdDsJLyogZm9ybWF0IG9mIHBvc2l0aW9uYWwgbGF5b3V0IHRhYmxlcyAqLwotCV9fZnMzMglmc19ucnBvczsJCS8qIG51bWJlciBvZiByb3RhdGlvbmFsIHBvc2l0aW9ucyAqLwotCV9fZnMzMglmc19wb3N0YmxvZmY7CQkvKiAoX19zMTYpIHJvdGF0aW9uIGJsb2NrIGxpc3QgaGVhZCAqLwotCV9fZnMzMglmc19yb3RibG9mZjsJCS8qIChfX3U4KSBibG9ja3MgZm9yIGVhY2ggcm90YXRpb24gKi8KLQlfX2ZzMzIJZnNfbWFnaWM7CQkvKiBtYWdpYyBudW1iZXIgKi8KLQlfX3U4CWZzX3NwYWNlWzFdOwkJLyogbGlzdCBvZiBibG9ja3MgZm9yIGVhY2ggcm90YXRpb24gKi8KLX07Ci0jZW5kaWYvKnN0cnVjdCB1ZnNfc3VwZXJfYmxvY2sqLwotCi0vKgotICogUHJlZmVyZW5jZSBmb3Igb3B0aW1pemF0aW9uLgotICovCi0jZGVmaW5lIFVGU19PUFRUSU1FCTAJLyogbWluaW1pemUgYWxsb2NhdGlvbiB0aW1lICovCi0jZGVmaW5lIFVGU19PUFRTUEFDRQkxCS8qIG1pbmltaXplIGRpc2sgZnJhZ21lbnRhdGlvbiAqLwotCi0vKgotICogUm90YXRpb25hbCBsYXlvdXQgdGFibGUgZm9ybWF0IHR5cGVzCi0gKi8KLSNkZWZpbmUgVUZTXzQyUE9TVEJMRk1UCQktMQkvKiA0LjJCU0Qgcm90YXRpb25hbCB0YWJsZSBmb3JtYXQgKi8KLSNkZWZpbmUgVUZTX0RZTkFNSUNQT1NUQkxGTVQJMQkvKiBkeW5hbWljIHJvdGF0aW9uYWwgdGFibGUgZm9ybWF0ICovCi0KLS8qCi0gKiBDb252ZXJ0IGN5bGluZGVyIGdyb3VwIHRvIGJhc2UgYWRkcmVzcyBvZiBpdHMgZ2xvYmFsIHN1bW1hcnkgaW5mby4KLSAqLwotI2RlZmluZSBmc19jcyhpbmR4KSBzX2NzcFsoaW5keCldCi0KLS8qCi0gKiBDeWxpbmRlciBncm91cCBibG9jayBmb3IgYSBmaWxlIHN5c3RlbS4KLSAqCi0gKiBXcml0YWJsZSBmaWVsZHMgaW4gdGhlIGN5bGluZGVyIGdyb3VwIGFyZSBwcm90ZWN0ZWQgYnkgdGhlIGFzc29jaWF0ZWQKLSAqIHN1cGVyIGJsb2NrIGxvY2sgZnMtPmZzX2xvY2suCi0gKi8KLSNkZWZpbmUJQ0dfTUFHSUMJMHgwOTAyNTUKLSNkZWZpbmUgdWZzX2NnX2Noa21hZ2ljKHNiLCB1Y2cpIFwKLQkoZnMzMl90b19jcHUoKHNiKSwgKHVjZyktPmNnX21hZ2ljKSA9PSBDR19NQUdJQykKLS8qCi0gKiBNYWNyb3MgZm9yIGFjY2VzcyB0byBvbGQgY3lsaW5kZXIgZ3JvdXAgYXJyYXkgc3RydWN0dXJlcwotICovCi0jZGVmaW5lIHVmc19vY2dfYmxrdG90KHNiLCB1Y2cpICAgICAgZnMzMl90b19jcHUoKHNiKSwgKChzdHJ1Y3QgdWZzX29sZF9jeWxpbmRlcl9ncm91cCAqKSh1Y2cpKS0+Y2dfYnRvdCkKLSNkZWZpbmUgdWZzX29jZ19ibGtzKHNiLCB1Y2csIGN5bG5vKSBmczMyX3RvX2NwdSgoc2IpLCAoKHN0cnVjdCB1ZnNfb2xkX2N5bGluZGVyX2dyb3VwICopKHVjZykpLT5jZ19iW2N5bG5vXSkKLSNkZWZpbmUgdWZzX29jZ19pbm9zdXNlZChzYiwgdWNnKSAgICBmczMyX3RvX2NwdSgoc2IpLCAoKHN0cnVjdCB1ZnNfb2xkX2N5bGluZGVyX2dyb3VwICopKHVjZykpLT5jZ19pdXNlZCkKLSNkZWZpbmUgdWZzX29jZ19ibGtzZnJlZShzYiwgdWNnKSAgICBmczMyX3RvX2NwdSgoc2IpLCAoKHN0cnVjdCB1ZnNfb2xkX2N5bGluZGVyX2dyb3VwICopKHVjZykpLT5jZ19mcmVlKQotI2RlZmluZSB1ZnNfb2NnX2Noa21hZ2ljKHNiLCB1Y2cpIFwKLQkoZnMzMl90b19jcHUoKHNiKSwgKChzdHJ1Y3QgdWZzX29sZF9jeWxpbmRlcl9ncm91cCAqKSh1Y2cpKS0+Y2dfbWFnaWMpID09IENHX01BR0lDKQotCi0vKgotICogc2l6ZSBvZiB0aGlzIHN0cnVjdHVyZSBpcyAxNzIgQgotICovCi1zdHJ1Y3QJdWZzX2N5bGluZGVyX2dyb3VwIHsKLQlfX2ZzMzIJY2dfbGluazsJCS8qIGxpbmtlZCBsaXN0IG9mIGN5bCBncm91cHMgKi8KLQlfX2ZzMzIJY2dfbWFnaWM7CQkvKiBtYWdpYyBudW1iZXIgKi8KLQlfX2ZzMzIJY2dfdGltZTsJCS8qIHRpbWUgbGFzdCB3cml0dGVuICovCi0JX19mczMyCWNnX2NneDsJCQkvKiB3ZSBhcmUgdGhlIGNneCd0aCBjeWxpbmRlciBncm91cCAqLwotCV9fZnMxNgljZ19uY3lsOwkJLyogbnVtYmVyIG9mIGN5bCdzIHRoaXMgY2cgKi8KLQlfX2ZzMTYJY2dfbmlibGs7CQkvKiBudW1iZXIgb2YgaW5vZGUgYmxvY2tzIHRoaXMgY2cgKi8KLQlfX2ZzMzIJY2dfbmRibGs7CQkvKiBudW1iZXIgb2YgZGF0YSBibG9ja3MgdGhpcyBjZyAqLwotCXN0cnVjdAl1ZnNfY3N1bSBjZ19jczsJCS8qIGN5bGluZGVyIHN1bW1hcnkgaW5mb3JtYXRpb24gKi8KLQlfX2ZzMzIJY2dfcm90b3I7CQkvKiBwb3NpdGlvbiBvZiBsYXN0IHVzZWQgYmxvY2sgKi8KLQlfX2ZzMzIJY2dfZnJvdG9yOwkJLyogcG9zaXRpb24gb2YgbGFzdCB1c2VkIGZyYWcgKi8KLQlfX2ZzMzIJY2dfaXJvdG9yOwkJLyogcG9zaXRpb24gb2YgbGFzdCB1c2VkIGlub2RlICovCi0JX19mczMyCWNnX2Zyc3VtW1VGU19NQVhGUkFHXTsJLyogY291bnRzIG9mIGF2YWlsYWJsZSBmcmFncyAqLwotCV9fZnMzMgljZ19idG90b2ZmOwkJLyogKF9fdTMyKSBibG9jayB0b3RhbHMgcGVyIGN5bGluZGVyICovCi0JX19mczMyCWNnX2JvZmY7CQkvKiAoc2hvcnQpIGZyZWUgYmxvY2sgcG9zaXRpb25zICovCi0JX19mczMyCWNnX2l1c2Vkb2ZmOwkJLyogKGNoYXIpIHVzZWQgaW5vZGUgbWFwICovCi0JX19mczMyCWNnX2ZyZWVvZmY7CQkvKiAodV9jaGFyKSBmcmVlIGJsb2NrIG1hcCAqLwotCV9fZnMzMgljZ19uZXh0ZnJlZW9mZjsJCS8qICh1X2NoYXIpIG5leHQgYXZhaWxhYmxlIHNwYWNlICovCi0JdW5pb24gewotCQlzdHJ1Y3QgewotCQkJX19mczMyCWNnX2NsdXN0ZXJzdW1vZmY7CS8qICh1X2ludDMyKSBjb3VudHMgb2YgYXZhaWwgY2x1c3RlcnMgKi8KLQkJCV9fZnMzMgljZ19jbHVzdGVyb2ZmOwkJLyogKHVfaW50OCkgZnJlZSBjbHVzdGVyIG1hcCAqLwotCQkJX19mczMyCWNnX25jbHVzdGVyYmxrczsJLyogbnVtYmVyIG9mIGNsdXN0ZXJzIHRoaXMgY2cgKi8KLQkJCV9fZnMzMgljZ19zcGFyZWNvblsxM107CS8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCi0JCX0gY2dfNDQ7Ci0JCXN0cnVjdCB7Ci0JCQlfX2ZzMzIJY2dfY2x1c3RlcnN1bW9mZjsvKiAodV9pbnQzMikgY291bnRzIG9mIGF2YWlsIGNsdXN0ZXJzICovCi0JCQlfX2ZzMzIJY2dfY2x1c3Rlcm9mZjsJLyogKHVfaW50OCkgZnJlZSBjbHVzdGVyIG1hcCAqLwotCQkJX19mczMyCWNnX25jbHVzdGVyYmxrczsvKiBudW1iZXIgb2YgY2x1c3RlcnMgdGhpcyBjZyAqLwotCQkJX19mczMyICAgY2dfbmlibGs7IC8qIG51bWJlciBvZiBpbm9kZSBibG9ja3MgdGhpcyBjZyAqLwotCQkJX19mczMyICAgY2dfaW5pdGVkaWJsazsJLyogbGFzdCBpbml0aWFsaXplZCBpbm9kZSAqLwotCQkJX19mczMyICAgY2dfc3BhcmVjb24zMlszXTsvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLwotCQkJX19mczY0ICAgY2dfdGltZTsJLyogdGltZSBsYXN0IHdyaXR0ZW4gKi8KLQkJCV9fZnM2NAljZ19zcGFyZWNvblszXTsJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KLQkJfSBjZ191MjsKLQkJX19mczMyCWNnX3NwYXJlY29uWzE2XTsJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KLQl9IGNnX3U7Ci0JX191OAljZ19zcGFjZVsxXTsJCS8qIHNwYWNlIGZvciBjeWxpbmRlciBncm91cCBtYXBzICovCi0vKiBhY3R1YWxseSBsb25nZXIgKi8KLX07Ci0KLS8qIEhpc3RvcmljIEN5bGluZGVyIGdyb3VwIGluZm8gKi8KLXN0cnVjdCB1ZnNfb2xkX2N5bGluZGVyX2dyb3VwIHsKLQlfX2ZzMzIJY2dfbGluazsJCS8qIGxpbmtlZCBsaXN0IG9mIGN5bCBncm91cHMgKi8KLQlfX2ZzMzIJY2dfcmxpbms7CQkvKiBmb3IgaW5jb3JlIGN5bCBncm91cHMgICAgICovCi0JX19mczMyCWNnX3RpbWU7CQkvKiB0aW1lIGxhc3Qgd3JpdHRlbiAqLwotCV9fZnMzMgljZ19jZ3g7CQkJLyogd2UgYXJlIHRoZSBjZ3gndGggY3lsaW5kZXIgZ3JvdXAgKi8KLQlfX2ZzMTYJY2dfbmN5bDsJCS8qIG51bWJlciBvZiBjeWwncyB0aGlzIGNnICovCi0JX19mczE2CWNnX25pYmxrOwkJLyogbnVtYmVyIG9mIGlub2RlIGJsb2NrcyB0aGlzIGNnICovCi0JX19mczMyCWNnX25kYmxrOwkJLyogbnVtYmVyIG9mIGRhdGEgYmxvY2tzIHRoaXMgY2cgKi8KLQlzdHJ1Y3QJdWZzX2NzdW0gY2dfY3M7CQkvKiBjeWxpbmRlciBzdW1tYXJ5IGluZm9ybWF0aW9uICovCi0JX19mczMyCWNnX3JvdG9yOwkJLyogcG9zaXRpb24gb2YgbGFzdCB1c2VkIGJsb2NrICovCi0JX19mczMyCWNnX2Zyb3RvcjsJCS8qIHBvc2l0aW9uIG9mIGxhc3QgdXNlZCBmcmFnICovCi0JX19mczMyCWNnX2lyb3RvcjsJCS8qIHBvc2l0aW9uIG9mIGxhc3QgdXNlZCBpbm9kZSAqLwotCV9fZnMzMgljZ19mcnN1bVs4XTsJCS8qIGNvdW50cyBvZiBhdmFpbGFibGUgZnJhZ3MgKi8KLQlfX2ZzMzIJY2dfYnRvdFszMl07CQkvKiBibG9jayB0b3RhbHMgcGVyIGN5bGluZGVyICovCi0JX19mczE2CWNnX2JbMzJdWzhdOwkJLyogcG9zaXRpb25zIG9mIGZyZWUgYmxvY2tzICovCi0JX191OAljZ19pdXNlZFsyNTZdOwkJLyogdXNlZCBpbm9kZSBtYXAgKi8KLQlfX2ZzMzIJY2dfbWFnaWM7CQkvKiBtYWdpYyBudW1iZXIgKi8KLQlfX3U4CWNnX2ZyZWVbMV07CQkvKiBmcmVlIGJsb2NrIG1hcCAqLwotLyogYWN0dWFsbHkgbG9uZ2VyICovCi19OwotCi0vKgotICogc3RydWN0dXJlIG9mIGFuIG9uLWRpc2sgaW5vZGUKLSAqLwotc3RydWN0IHVmc19pbm9kZSB7Ci0JX19mczE2CXVpX21vZGU7CQkvKiAgMHgwICovCi0JX19mczE2CXVpX25saW5rOwkJLyogIDB4MiAqLwotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCV9fZnMxNgl1aV9zdWlkOwkvKiAgMHg0ICovCi0JCQlfX2ZzMTYJdWlfc2dpZDsJLyogIDB4NiAqLwotCQl9IG9sZGlkczsKLQkJX19mczMyCXVpX2ludW1iZXI7CQkvKiAgMHg0IGxzZjogaW5vZGUgbnVtYmVyICovCi0JCV9fZnMzMgl1aV9hdXRob3I7CQkvKiAgMHg0IEdOVSBIVVJEOiBhdXRob3IgKi8KLQl9IHVpX3UxOwotCV9fZnM2NAl1aV9zaXplOwkJLyogIDB4OCAqLwotCXN0cnVjdCB1ZnNfdGltZXZhbCB1aV9hdGltZTsJLyogMHgxMCBhY2Nlc3MgKi8KLQlzdHJ1Y3QgdWZzX3RpbWV2YWwgdWlfbXRpbWU7CS8qIDB4MTggbW9kaWZpY2F0aW9uICovCi0Jc3RydWN0IHVmc190aW1ldmFsIHVpX2N0aW1lOwkvKiAweDIwIGNyZWF0aW9uICovCi0JdW5pb24gewotCQlzdHJ1Y3QgewotCQkJX19mczMyCXVpX2RiW1VGU19OREFERFJdOy8qIDB4MjggZGF0YSBibG9ja3MgKi8KLQkJCV9fZnMzMgl1aV9pYltVRlNfTklORElSXTsvKiAweDU4IGluZGlyZWN0IGJsb2NrcyAqLwotCQl9IHVpX2FkZHI7Ci0JCV9fdTgJdWlfc3ltbGlua1s0KihVRlNfTkRBRERSK1VGU19OSU5ESVIpXTsvKiAweDI4IGZhc3Qgc3ltbGluayAqLwotCX0gdWlfdTI7Ci0JX19mczMyCXVpX2ZsYWdzOwkJLyogMHg2NCBpbW11dGFibGUsIGFwcGVuZC1vbmx5Li4uICovCi0JX19mczMyCXVpX2Jsb2NrczsJCS8qIDB4NjggYmxvY2tzIGluIHVzZSAqLwotCV9fZnMzMgl1aV9nZW47CQkJLyogMHg2YyBsaWtlIGV4dDIgaV92ZXJzaW9uLCBmb3IgTkZTIHN1cHBvcnQgKi8KLQl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQlfX2ZzMzIJdWlfc2hhZG93OwkvKiAweDcwIHNoYWRvdyBpbm9kZSB3aXRoIHNlY3VyaXR5IGRhdGEgKi8KLQkJCV9fZnMzMgl1aV91aWQ7CQkvKiAweDc0IGxvbmcgRUZUIHZlcnNpb24gb2YgdWlkICovCi0JCQlfX2ZzMzIJdWlfZ2lkOwkJLyogMHg3OCBsb25nIEVGVCB2ZXJzaW9uIG9mIGdpZCAqLwotCQkJX19mczMyCXVpX29lZnRmbGFnOwkvKiAweDdjIHJlc2VydmVkICovCi0JCX0gdWlfc3VuOwotCQlzdHJ1Y3QgewotCQkJX19mczMyCXVpX3VpZDsJCS8qIDB4NzAgRmlsZSBvd25lciAqLwotCQkJX19mczMyCXVpX2dpZDsJCS8qIDB4NzQgRmlsZSBncm91cCAqLwotCQkJX19mczMyCXVpX3NwYXJlWzJdOwkvKiAweDc4IHJlc2VydmVkICovCi0JCX0gdWlfNDQ7Ci0JCXN0cnVjdCB7Ci0JCQlfX2ZzMzIJdWlfdWlkOwkJLyogMHg3MCAqLwotCQkJX19mczMyCXVpX2dpZDsJCS8qIDB4NzQgKi8KLQkJCV9fZnMxNgl1aV9tb2RlaDsJLyogMHg3OCBtb2RlIGhpZ2ggYml0cyAqLwotCQkJX19mczE2CXVpX3NwYXJlOwkvKiAweDdBIHVudXNlZCAqLwotCQkJX19mczMyCXVpX3RyYW5zOwkvKiAweDdjIGZpbGVzeXN0ZW0gdHJhbnNsYXRvciAqLwotCQl9IHVpX2h1cmQ7Ci0JfSB1aV91MzsKLX07Ci0KLSNkZWZpbmUgVUZTX05YQUREUiAgMiAgICAgICAgICAgIC8qIEV4dGVybmFsIGFkZHJlc3NlcyBpbiBpbm9kZS4gKi8KLXN0cnVjdCB1ZnMyX2lub2RlIHsKLQlfX2ZzMTYgICAgIHVpX21vZGU7ICAgICAgICAvKiAgIDA6IElGTVQsIHBlcm1pc3Npb25zOyBzZWUgYmVsb3cuICovCi0JX19mczE2ICAgICB1aV9ubGluazsgICAgICAgLyogICAyOiBGaWxlIGxpbmsgY291bnQuICovCi0JX19mczMyICAgICB1aV91aWQ7ICAgICAgICAgLyogICA0OiBGaWxlIG93bmVyLiAqLwotCV9fZnMzMiAgICAgdWlfZ2lkOyAgICAgICAgIC8qICAgODogRmlsZSBncm91cC4gKi8KLQlfX2ZzMzIgICAgIHVpX2Jsa3NpemU7ICAgICAvKiAgMTI6IElub2RlIGJsb2Nrc2l6ZS4gKi8KLQlfX2ZzNjQgICAgIHVpX3NpemU7ICAgICAgICAvKiAgMTY6IEZpbGUgYnl0ZSBjb3VudC4gKi8KLQlfX2ZzNjQgICAgIHVpX2Jsb2NrczsgICAgICAvKiAgMjQ6IEJ5dGVzIGFjdHVhbGx5IGhlbGQuICovCi0JX19mczY0ICAgdWlfYXRpbWU7ICAgICAgIC8qICAzMjogTGFzdCBhY2Nlc3MgdGltZS4gKi8KLQlfX2ZzNjQgICB1aV9tdGltZTsgICAgICAgLyogIDQwOiBMYXN0IG1vZGlmaWVkIHRpbWUuICovCi0JX19mczY0ICAgdWlfY3RpbWU7ICAgICAgIC8qICA0ODogTGFzdCBpbm9kZSBjaGFuZ2UgdGltZS4gKi8KLQlfX2ZzNjQgICB1aV9iaXJ0aHRpbWU7ICAgLyogIDU2OiBJbm9kZSBjcmVhdGlvbiB0aW1lLiAqLwotCV9fZnMzMiAgICAgdWlfbXRpbWVuc2VjOyAgIC8qICA2NDogTGFzdCBtb2RpZmllZCB0aW1lLiAqLwotCV9fZnMzMiAgICAgdWlfYXRpbWVuc2VjOyAgIC8qICA2ODogTGFzdCBhY2Nlc3MgdGltZS4gKi8KLQlfX2ZzMzIgICAgIHVpX2N0aW1lbnNlYzsgICAvKiAgNzI6IExhc3QgaW5vZGUgY2hhbmdlIHRpbWUuICovCi0JX19mczMyICAgICB1aV9iaXJ0aG5zZWM7ICAgLyogIDc2OiBJbm9kZSBjcmVhdGlvbiB0aW1lLiAqLwotCV9fZnMzMiAgICAgdWlfZ2VuOyAgICAgICAgIC8qICA4MDogR2VuZXJhdGlvbiBudW1iZXIuICovCi0JX19mczMyICAgICB1aV9rZXJuZmxhZ3M7ICAgLyogIDg0OiBLZXJuZWwgZmxhZ3MuICovCi0JX19mczMyICAgICB1aV9mbGFnczsgICAgICAgLyogIDg4OiBTdGF0dXMgZmxhZ3MgKGNoZmxhZ3MpLiAqLwotCV9fZnMzMiAgICAgdWlfZXh0c2l6ZTsgICAgIC8qICA5MjogRXh0ZXJuYWwgYXR0cmlidXRlcyBibG9jay4gKi8KLQlfX2ZzNjQgICAgIHVpX2V4dGJbVUZTX05YQUREUl07LyogIDk2OiBFeHRlcm5hbCBhdHRyaWJ1dGVzIGJsb2NrLiAqLwotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCV9fZnM2NCAgICAgdWlfZGJbVUZTX05EQUREUl07IC8qIDExMjogRGlyZWN0IGRpc2sgYmxvY2tzLiAqLwotCQkJX19mczY0ICAgICB1aV9pYltVRlNfTklORElSXTsvKiAyMDg6IEluZGlyZWN0IGRpc2sgYmxvY2tzLiovCi0JCX0gdWlfYWRkcjsKLQlfX3U4CXVpX3N5bWxpbmtbMio0KihVRlNfTkRBRERSK1VGU19OSU5ESVIpXTsvKiAweDI4IGZhc3Qgc3ltbGluayAqLwotCX0gdWlfdTI7Ci0JX19mczY0ICAgICB1aV9zcGFyZVszXTsgICAgLyogMjMyOiBSZXNlcnZlZDsgY3VycmVudGx5IHVudXNlZCAqLwotfTsKLQotCi0vKiBGcmVlQlNEIGhhcyB0aGVzZSBpbiBzeXMvc3RhdC5oICovCi0vKiB1aV9mbGFncyB0aGF0IGNhbiBiZSBzZXQgYnkgYSBmaWxlIG93bmVyICovCi0jZGVmaW5lIFVGU19VRl9TRVRUQUJMRSAgIDB4MDAwMGZmZmYKLSNkZWZpbmUgVUZTX1VGX05PRFVNUCAgICAgMHgwMDAwMDAwMSAgLyogZG8gbm90IGR1bXAgKi8KLSNkZWZpbmUgVUZTX1VGX0lNTVVUQUJMRSAgMHgwMDAwMDAwMiAgLyogaW1tdXRhYmxlIChjYW4ndCAiY2hhbmdlIikgKi8KLSNkZWZpbmUgVUZTX1VGX0FQUEVORCAgICAgMHgwMDAwMDAwNCAgLyogYXBwZW5kLW9ubHkgKi8KLSNkZWZpbmUgVUZTX1VGX09QQVFVRSAgICAgMHgwMDAwMDAwOCAgLyogZGlyZWN0b3J5IGlzIG9wYXF1ZSAodW5pb25mcykgKi8KLSNkZWZpbmUgVUZTX1VGX05PVU5MSU5LICAgMHgwMDAwMDAxMCAgLyogY2FuJ3QgYmUgcmVtb3ZlZCBvciByZW5hbWVkICovCi0vKiB1aV9mbGFncyB0aGF0IG9ubHkgcm9vdCBjYW4gc2V0ICovCi0jZGVmaW5lIFVGU19TRl9TRVRUQUJMRSAgIDB4ZmZmZjAwMDAKLSNkZWZpbmUgVUZTX1NGX0FSQ0hJVkVEICAgMHgwMDAxMDAwMCAgLyogYXJjaGl2ZWQgKi8KLSNkZWZpbmUgVUZTX1NGX0lNTVVUQUJMRSAgMHgwMDAyMDAwMCAgLyogaW1tdXRhYmxlIChjYW4ndCAiY2hhbmdlIikgKi8KLSNkZWZpbmUgVUZTX1NGX0FQUEVORCAgICAgMHgwMDA0MDAwMCAgLyogYXBwZW5kLW9ubHkgKi8KLSNkZWZpbmUgVUZTX1NGX05PVU5MSU5LICAgMHgwMDEwMDAwMCAgLyogY2FuJ3QgYmUgcmVtb3ZlZCBvciByZW5hbWVkICovCi0KLS8qCi0gKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciByZWFkaW5nIGRpc2sgc3RydWN0dXJlcyBsYXJnZXIKLSAqIHRoYW4gdGhlIHNpemUgb2YgZnJhZ21lbnQuCi0gKi8KLXN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgewotCV9fdTY0IGZyYWdtZW50OwkJCS8qIGZpcnN0IGZyYWdtZW50ICovCi0JX191NjQgY291bnQ7CQkJCS8qIG51bWJlciBvZiBmcmFnbWVudHMgKi8KLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaFtVRlNfTUFYRlJBR107CS8qIGJ1ZmZlcnMgKi8KLX07Ci0KLXN0cnVjdCB1ZnNfY2dfcHJpdmF0ZV9pbmZvIHsKLQlzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkIGNfdWJoOwotCV9fdTMyCWNfY2d4OwkJLyogbnVtYmVyIG9mIGN5bGlkbmVyIGdyb3VwICovCi0JX191MTYJY19uY3lsOwkJLyogbnVtYmVyIG9mIGN5bCdzIHRoaXMgY2cgKi8KLQlfX3UxNgljX25pYmxrOwkvKiBudW1iZXIgb2YgaW5vZGUgYmxvY2tzIHRoaXMgY2cgKi8KLQlfX3UzMgljX25kYmxrOwkvKiBudW1iZXIgb2YgZGF0YSBibG9ja3MgdGhpcyBjZyAqLwotCV9fdTMyCWNfcm90b3I7CS8qIHBvc2l0aW9uIG9mIGxhc3QgdXNlZCBibG9jayAqLwotCV9fdTMyCWNfZnJvdG9yOwkvKiBwb3NpdGlvbiBvZiBsYXN0IHVzZWQgZnJhZyAqLwotCV9fdTMyCWNfaXJvdG9yOwkvKiBwb3NpdGlvbiBvZiBsYXN0IHVzZWQgaW5vZGUgKi8KLQlfX3UzMgljX2J0b3RvZmY7CS8qIChfX3UzMikgYmxvY2sgdG90YWxzIHBlciBjeWxpbmRlciAqLwotCV9fdTMyCWNfYm9mZjsJCS8qIChzaG9ydCkgZnJlZSBibG9jayBwb3NpdGlvbnMgKi8KLQlfX3UzMgljX2l1c2Vkb2ZmOwkvKiAoY2hhcikgdXNlZCBpbm9kZSBtYXAgKi8KLQlfX3UzMgljX2ZyZWVvZmY7CS8qICh1X2NoYXIpIGZyZWUgYmxvY2sgbWFwICovCi0JX191MzIJY19uZXh0ZnJlZW9mZjsJLyogKHVfY2hhcikgbmV4dCBhdmFpbGFibGUgc3BhY2UgKi8KLQlfX3UzMgljX2NsdXN0ZXJzdW1vZmY7LyogKHVfaW50MzIpIGNvdW50cyBvZiBhdmFpbCBjbHVzdGVycyAqLwotCV9fdTMyCWNfY2x1c3Rlcm9mZjsJLyogKHVfaW50OCkgZnJlZSBjbHVzdGVyIG1hcCAqLwotCV9fdTMyCWNfbmNsdXN0ZXJibGtzOwkvKiBudW1iZXIgb2YgY2x1c3RlcnMgdGhpcyBjZyAqLwotfTsJCi0KLQotc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gewotCXN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgc191Ymg7IC8qIGJ1ZmZlciBjb250YWluaW5nIHN1cGVyIGJsb2NrICovCi0Jc3RydWN0IHVmc19jc3VtX2NvcmUgY3NfdG90YWw7Ci0JX191MzIJc19zYmxrbm87CS8qIG9mZnNldCBvZiBzdXBlci1ibG9ja3MgaW4gZmlsZXN5cyAqLwotCV9fdTMyCXNfY2Jsa25vOwkvKiBvZmZzZXQgb2YgY2ctYmxvY2sgaW4gZmlsZXN5cyAqLwotCV9fdTMyCXNfaWJsa25vOwkvKiBvZmZzZXQgb2YgaW5vZGUtYmxvY2tzIGluIGZpbGVzeXMgKi8KLQlfX3UzMglzX2RibGtubzsJLyogb2Zmc2V0IG9mIGZpcnN0IGRhdGEgYWZ0ZXIgY2cgKi8KLQlfX3UzMglzX2Nnb2Zmc2V0OwkvKiBjeWxpbmRlciBncm91cCBvZmZzZXQgaW4gY3lsaW5kZXIgKi8KLQlfX3UzMglzX2NnbWFzazsJLyogdXNlZCB0byBjYWxjIG1vZCBmc19udHJhayAqLwotCV9fdTMyCXNfc2l6ZTsJCS8qIG51bWJlciBvZiBibG9ja3MgKGZyYWdtZW50cykgaW4gZnMgKi8KLQlfX3UzMglzX2RzaXplOwkvKiBudW1iZXIgb2YgZGF0YSBibG9ja3MgaW4gZnMgKi8KLQlfX3U2NAlzX3UyX3NpemU7CS8qIHVmczI6IG51bWJlciBvZiBibG9ja3MgKGZyYWdtZW50cykgaW4gZnMgKi8KLQlfX3U2NAlzX3UyX2RzaXplOwkvKnVmczI6ICBudW1iZXIgb2YgZGF0YSBibG9ja3MgaW4gZnMgKi8KLQlfX3UzMglzX25jZzsJCS8qIG51bWJlciBvZiBjeWxpbmRlciBncm91cHMgKi8KLQlfX3UzMglzX2JzaXplOwkvKiBzaXplIG9mIGJhc2ljIGJsb2NrcyAqLwotCV9fdTMyCXNfZnNpemU7CS8qIHNpemUgb2YgZnJhZ21lbnRzICovCi0JX191MzIJc19mcGI7CQkvKiBmcmFnbWVudHMgcGVyIGJsb2NrICovCi0JX191MzIJc19taW5mcmVlOwkvKiBtaW5pbXVtIHBlcmNlbnRhZ2Ugb2YgZnJlZSBibG9ja3MgKi8KLQlfX3UzMglzX2JtYXNrOwkvKiBgYmxrb2ZmJycgY2FsYyBvZiBibGsgb2Zmc2V0cyAqLwotCV9fdTMyCXNfZm1hc2s7CS8qIHNfZnNpemUgbWFzayAqLwotCV9fdTMyCXNfYnNoaWZ0OwkvKiBgbGJsa25vJycgY2FsYyBvZiBsb2dpY2FsIGJsa25vICovCi0JX191MzIgICBzX2ZzaGlmdDsJLyogc19mc2l6ZSBzaGlmdCAqLwotCV9fdTMyCXNfZnBic2hpZnQ7CS8qIGZyYWdtZW50cyBwZXIgYmxvY2sgc2hpZnQgKi8KLQlfX3UzMglzX2ZzYnRvZGI7CS8qIGZzYnRvZGIgYW5kIGRidG9mc2Igc2hpZnQgY29uc3RhbnQgKi8KLQlfX3UzMglzX3Nic2l6ZTsJLyogYWN0dWFsIHNpemUgb2Ygc3VwZXIgYmxvY2sgKi8KLQlfX3UzMiAgIHNfY3NtYXNrOwkvKiBjc3VtIGJsb2NrIG9mZnNldCAqLwotCV9fdTMyCXNfY3NzaGlmdDsJLyogY3N1bSBibG9jayBudW1iZXIgKi8KLQlfX3UzMglzX25pbmRpcjsJLyogdmFsdWUgb2YgTklORElSICovCi0JX191MzIJc19pbm9wYjsJLyogdmFsdWUgb2YgSU5PUEIgKi8KLQlfX3UzMglzX25zcGY7CQkvKiB2YWx1ZSBvZiBOU1BGICovCi0JX191MzIJc19ucHNlY3Q7CS8qICMgc2VjdG9ycy90cmFjayBpbmNsdWRpbmcgc3BhcmVzICovCi0JX191MzIJc19pbnRlcmxlYXZlOwkvKiBoYXJkd2FyZSBzZWN0b3IgaW50ZXJsZWF2ZSAqLwotCV9fdTMyCXNfdHJhY2tza2V3OwkvKiBzZWN0b3IgMCBza2V3LCBwZXIgdHJhY2sgKi8KLQlfX3U2NAlzX2NzYWRkcjsJLyogYmxrIGFkZHIgb2YgY3lsIGdycCBzdW1tYXJ5IGFyZWEgKi8KLQlfX3UzMglzX2Nzc2l6ZTsJLyogc2l6ZSBvZiBjeWwgZ3JwIHN1bW1hcnkgYXJlYSAqLwotCV9fdTMyCXNfY2dzaXplOwkvKiBjeWxpbmRlciBncm91cCBzaXplICovCi0JX191MzIJc19udHJhazsJLyogdHJhY2tzIHBlciBjeWxpbmRlciAqLwotCV9fdTMyCXNfbnNlY3Q7CS8qIHNlY3RvcnMgcGVyIHRyYWNrICovCi0JX191MzIJc19zcGM7CQkvKiBzZWN0b3JzIHBlciBjeWxpbmRlciAqLwotCV9fdTMyCXNfaXBnOwkJLyogaW5vZGVzIHBlciBjeWxpbmRlciBncm91cCAqLwotCV9fdTMyCXNfZnBnOwkJLyogZnJhZ21lbnRzIHBlciBncm91cCAqLwotCV9fdTMyCXNfY3BjOwkJLyogY3lsIHBlciBjeWNsZSBpbiBwb3N0YmwgKi8KLQlfX3MzMglzX2NvbnRpZ3N1bXNpemU7Lyogc2l6ZSBvZiBjbHVzdGVyIHN1bW1hcnkgYXJyYXksIDQ0YnNkICovCi0JX19zNjQJc19xYm1hc2s7CS8qIH51c2JfYm1hc2sgKi8KLQlfX3M2NAlzX3FmbWFzazsJLyogfnVzYl9mbWFzayAqLwotCV9fczMyCXNfcG9zdGJsZm9ybWF0OwkvKiBmb3JtYXQgb2YgcG9zaXRpb25hbCBsYXlvdXQgdGFibGVzICovCi0JX19zMzIJc19ucnBvczsJLyogbnVtYmVyIG9mIHJvdGF0aW9uYWwgcG9zaXRpb25zICovCi0gICAgICAgIF9fczMyCXNfcG9zdGJsb2ZmOwkvKiAoX19zMTYpIHJvdGF0aW9uIGJsb2NrIGxpc3QgaGVhZCAqLwotCV9fczMyCXNfcm90YmxvZmY7CS8qIChfX3U4KSBibG9ja3MgZm9yIGVhY2ggcm90YXRpb24gKi8KLQotCV9fdTMyCXNfZnBibWFzazsJLyogZnJhZ21lbnRzIHBlciBibG9jayBtYXNrICovCi0JX191MzIJc19hcGI7CQkvKiBhZGRyZXNzIHBlciBibG9jayAqLwotCV9fdTMyCXNfMmFwYjsJCS8qIGFkZHJlc3MgcGVyIGJsb2NrXjIgKi8KLQlfX3UzMglzXzNhcGI7CQkvKiBhZGRyZXNzIHBlciBibG9ja14zICovCi0JX191MzIJc19hcGJtYXNrOwkvKiBhZGRyZXNzIHBlciBibG9jayBtYXNrICovCi0JX191MzIJc19hcGJzaGlmdDsJLyogYWRkcmVzcyBwZXIgYmxvY2sgc2hpZnQgKi8KLQlfX3UzMglzXzJhcGJzaGlmdDsJLyogYWRkcmVzcyBwZXIgYmxvY2sgc2hpZnQgKiAyICovCi0JX191MzIJc18zYXBic2hpZnQ7CS8qIGFkZHJlc3MgcGVyIGJsb2NrIHNoaWZ0ICogMyAqLwotCV9fdTMyCXNfbnNwZnNoaWZ0OwkvKiBudW1iZXIgb2Ygc2VjdG9yIHBlciBmcmFnbWVudCBzaGlmdCAqLwotCV9fdTMyCXNfbnNwYjsJCS8qIG51bWJlciBvZiBzZWN0b3IgcGVyIGJsb2NrICovCi0JX191MzIJc19pbm9wZjsJLyogaW5vZGVzIHBlciBmcmFnbWVudCAqLwotCV9fdTMyCXNfc2JiYXNlOwkvKiBvZmZzZXQgb2YgTmVYVHN0ZXAgc3VwZXJibG9jayAqLwotCV9fdTMyCXNfYnBmOwkJLyogYml0cyBwZXIgZnJhZ21lbnQgKi8KLQlfX3UzMglzX2JwZnNoaWZ0OwkvKiBiaXRzIHBlciBmcmFnbWVudCBzaGlmdCovCi0JX191MzIJc19icGZtYXNrOwkvKiBiaXRzIHBlciBmcmFnbWVudCBtYXNrICovCi0KLQlfX3UzMglzX21heHN5bWxpbmtsZW47LyogdXBwZXIgbGltaXQgb24gZmFzdCBzeW1saW5rcycgc2l6ZSAqLwotCV9fczMyCWZzX21hZ2ljOyAgICAgICAvKiBmaWxlc3lzdGVtIG1hZ2ljICovCi0JdW5zaWduZWQgaW50IHNfZGlyYmxrc2l6ZTsKLX07Ci0KLS8qCi0gKiBTaXplcyBvZiB0aGlzIHN0cnVjdHVyZXMgYXJlOgotICoJdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0CTUxMgotICoJdWZzX3N1cGVyX2Jsb2NrX3NlY29uZAk1MTIKLSAqCXVmc19zdXBlcl9ibG9ja190aGlyZAkzNTYKLSAqLwotc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCB7Ci0JdW5pb24gewotCQlzdHJ1Y3QgewotCQkJX19mczMyCWZzX2xpbms7CS8qIFVOVVNFRCAqLwotCQl9IGZzXzQyOwotCQlzdHJ1Y3QgewotCQkJX19mczMyCWZzX3N0YXRlOwkvKiBmaWxlIHN5c3RlbSBzdGF0ZSBmbGFnICovCi0JCX0gZnNfc3VuOwotCX0gZnNfdTA7Ci0JX19mczMyCWZzX3JsaW5rOwotCV9fZnMzMglmc19zYmxrbm87Ci0JX19mczMyCWZzX2NibGtubzsKLQlfX2ZzMzIJZnNfaWJsa25vOwotCV9fZnMzMglmc19kYmxrbm87Ci0JX19mczMyCWZzX2Nnb2Zmc2V0OwotCV9fZnMzMglmc19jZ21hc2s7Ci0JX19mczMyCWZzX3RpbWU7Ci0JX19mczMyCWZzX3NpemU7Ci0JX19mczMyCWZzX2RzaXplOwotCV9fZnMzMglmc19uY2c7Ci0JX19mczMyCWZzX2JzaXplOwotCV9fZnMzMglmc19mc2l6ZTsKLQlfX2ZzMzIJZnNfZnJhZzsKLQlfX2ZzMzIJZnNfbWluZnJlZTsKLQlfX2ZzMzIJZnNfcm90ZGVsYXk7Ci0JX19mczMyCWZzX3JwczsKLQlfX2ZzMzIJZnNfYm1hc2s7Ci0JX19mczMyCWZzX2ZtYXNrOwotCV9fZnMzMglmc19ic2hpZnQ7Ci0JX19mczMyCWZzX2ZzaGlmdDsKLQlfX2ZzMzIJZnNfbWF4Y29udGlnOwotCV9fZnMzMglmc19tYXhicGc7Ci0JX19mczMyCWZzX2ZyYWdzaGlmdDsKLQlfX2ZzMzIJZnNfZnNidG9kYjsKLQlfX2ZzMzIJZnNfc2JzaXplOwotCV9fZnMzMglmc19jc21hc2s7Ci0JX19mczMyCWZzX2Nzc2hpZnQ7Ci0JX19mczMyCWZzX25pbmRpcjsKLQlfX2ZzMzIJZnNfaW5vcGI7Ci0JX19mczMyCWZzX25zcGY7Ci0JX19mczMyCWZzX29wdGltOwotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCV9fZnMzMglmc19ucHNlY3Q7Ci0JCX0gZnNfc3VuOwotCQlzdHJ1Y3QgewotCQkJX19mczMyCWZzX3N0YXRlOwotCQl9IGZzX3N1bng4NjsKLQl9IGZzX3UxOwotCV9fZnMzMglmc19pbnRlcmxlYXZlOwotCV9fZnMzMglmc190cmFja3NrZXc7Ci0JX19mczMyCWZzX2lkWzJdOwotCV9fZnMzMglmc19jc2FkZHI7Ci0JX19mczMyCWZzX2Nzc2l6ZTsKLQlfX2ZzMzIJZnNfY2dzaXplOwotCV9fZnMzMglmc19udHJhazsKLQlfX2ZzMzIJZnNfbnNlY3Q7Ci0JX19mczMyCWZzX3NwYzsKLQlfX2ZzMzIJZnNfbmN5bDsKLQlfX2ZzMzIJZnNfY3BnOwotCV9fZnMzMglmc19pcGc7Ci0JX19mczMyCWZzX2ZwZzsKLQlzdHJ1Y3QgdWZzX2NzdW0gZnNfY3N0b3RhbDsKLQlfX3M4CWZzX2Ztb2Q7Ci0JX19zOAlmc19jbGVhbjsKLQlfX3M4CWZzX3Jvbmx5OwotCV9fczgJZnNfZmxhZ3M7Ci0JX19zOAlmc19mc21udFtVRlNfTUFYTU5UTEVOIC0gMjEyXTsKLQotfTsKLQotc3RydWN0IHVmc19zdXBlcl9ibG9ja19zZWNvbmQgewotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCV9fczgJZnNfZnNtbnRbMjEyXTsKLQkJCV9fZnMzMglmc19jZ3JvdG9yOwotCQkJX19mczMyCWZzX2NzcFtVRlNfTUFYQ1NCVUZTXTsKLQkJCV9fZnMzMglmc19tYXhjbHVzdGVyOwotCQkJX19mczMyCWZzX2NwYzsKLQkJCV9fZnMxNglmc19vcG9zdGJsWzgyXTsKLQkJfSBmc191MTsKLQkJc3RydWN0IHsKLQkJCV9fczggIGZzX2ZzbW50W1VGUzJfTUFYTU5UTEVOIC0gVUZTX01BWE1OVExFTiArIDIxMl07Ci0JCQlfX3U4ICAgZnNfdm9sbmFtZVtVRlMyX01BWFZPTExFTl07Ci0JCQlfX2ZzNjQgIGZzX3N3dWlkOwotCQkJX19mczMyICBmc19wYWQ7Ci0JCQlfX2ZzMzIgICBmc19jZ3JvdG9yOwotCQkJX19mczMyICAgZnNfb2NzcFtVRlMyX05PQ1NQVFJTXTsKLQkJCV9fZnMzMiAgIGZzX2NvbnRpZ2RpcnM7Ci0JCQlfX2ZzMzIgICBmc19jc3A7Ci0JCQlfX2ZzMzIgICBmc19tYXhjbHVzdGVyOwotCQkJX19mczMyICAgZnNfYWN0aXZlOwotCQkJX19mczMyICAgZnNfb2xkX2NwYzsKLQkJCV9fZnMzMiAgIGZzX21heGJzaXplOwotCQkJX19mczY0ICAgZnNfc3BhcmVjb242NFsxN107Ci0JCQlfX2ZzNjQgICBmc19zYmxvY2tsb2M7Ci0JCQlfX2ZzNjQJY3NfbmRpcjsKLQkJCV9fZnM2NAljc19uYmZyZWU7Ci0JCX0gZnNfdTI7Ci0JfSBmc191bjsKLX07Ci0KLXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfdGhpcmQgewotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCV9fZnMxNglmc19vcG9zdGJsWzQ2XTsKLQkJfSBmc191MTsKLQkJc3RydWN0IHsKLQkJCV9fZnM2NAljc19uaWZyZWU7CS8qIG51bWJlciBvZiBmcmVlIGlub2RlcyAqLwotCQkJX19mczY0CWNzX25mZnJlZTsJLyogbnVtYmVyIG9mIGZyZWUgZnJhZ3MgKi8KLQkJCV9fZnM2NCAgIGNzX251bWNsdXN0ZXJzOwkvKiBudW1iZXIgb2YgZnJlZSBjbHVzdGVycyAqLwotCQkJX19mczY0ICAgY3Nfc3BhcmVbM107CS8qIGZ1dHVyZSBleHBhbnNpb24gKi8KLQkJCXN0cnVjdCAgdWZzX3RpbWV2YWwgICAgZnNfdGltZTsJCS8qIGxhc3QgdGltZSB3cml0dGVuICovCi0JCQlfX2ZzNjQgICAgZnNfc2l6ZTsJCS8qIG51bWJlciBvZiBibG9ja3MgaW4gZnMgKi8KLQkJCV9fZnM2NCAgICBmc19kc2l6ZTsJLyogbnVtYmVyIG9mIGRhdGEgYmxvY2tzIGluIGZzICovCi0JCQlfX2ZzNjQgICBmc19jc2FkZHI7CS8qIGJsayBhZGRyIG9mIGN5bCBncnAgc3VtbWFyeSBhcmVhICovCi0JCQlfX2ZzNjQgICAgZnNfcGVuZGluZ2Jsb2NrczsvKiBibG9ja3MgaW4gcHJvY2VzcyBvZiBiZWluZyBmcmVlZCAqLwotCQkJX19mczMyICAgIGZzX3BlbmRpbmdpbm9kZXM7Lyppbm9kZXMgaW4gcHJvY2VzcyBvZiBiZWluZyBmcmVlZCAqLwotCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBmc191MjsKLQl9IGZzX3VuMTsKLQl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQlfX2ZzMzIJZnNfc3BhcmVjb25bNTNdOy8qIHJlc2VydmVkIGZvciBmdXR1cmUgY29uc3RhbnRzICovCi0JCQlfX2ZzMzIJZnNfcmVjbGFpbTsKLQkJCV9fZnMzMglmc19zcGFyZWNvbjJbMV07Ci0JCQlfX2ZzMzIJZnNfc3RhdGU7CS8qIGZpbGUgc3lzdGVtIHN0YXRlIHRpbWUgc3RhbXAgKi8KLQkJCV9fZnMzMglmc19xYm1hc2tbMl07CS8qIH51c2JfYm1hc2sgKi8KLQkJCV9fZnMzMglmc19xZm1hc2tbMl07CS8qIH51c2JfZm1hc2sgKi8KLQkJfSBmc19zdW47Ci0JCXN0cnVjdCB7Ci0JCQlfX2ZzMzIJZnNfc3BhcmVjb25bNTNdOy8qIHJlc2VydmVkIGZvciBmdXR1cmUgY29uc3RhbnRzICovCi0JCQlfX2ZzMzIJZnNfcmVjbGFpbTsKLQkJCV9fZnMzMglmc19zcGFyZWNvbjJbMV07Ci0JCQlfX2ZzMzIJZnNfbnBzZWN0OwkvKiAjIHNlY3RvcnMvdHJhY2sgaW5jbHVkaW5nIHNwYXJlcyAqLwotCQkJX19mczMyCWZzX3FibWFza1syXTsJLyogfnVzYl9ibWFzayAqLwotCQkJX19mczMyCWZzX3FmbWFza1syXTsJLyogfnVzYl9mbWFzayAqLwotCQl9IGZzX3N1bng4NjsKLQkJc3RydWN0IHsKLQkJCV9fZnMzMglmc19zcGFyZWNvbls1MF07LyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBjb25zdGFudHMgKi8KLQkJCV9fZnMzMglmc19jb250aWdzdW1zaXplOy8qIHNpemUgb2YgY2x1c3RlciBzdW1tYXJ5IGFycmF5ICovCi0JCQlfX2ZzMzIJZnNfbWF4c3ltbGlua2xlbjsvKiBtYXggbGVuZ3RoIG9mIGFuIGludGVybmFsIHN5bWxpbmsgKi8KLQkJCV9fZnMzMglmc19pbm9kZWZtdDsJLyogZm9ybWF0IG9mIG9uLWRpc2sgaW5vZGVzICovCi0JCQlfX2ZzMzIJZnNfbWF4ZmlsZXNpemVbMl07CS8qIG1heCByZXByZXNlbnRhYmxlIGZpbGUgc2l6ZSAqLwotCQkJX19mczMyCWZzX3FibWFza1syXTsJLyogfnVzYl9ibWFzayAqLwotCQkJX19mczMyCWZzX3FmbWFza1syXTsJLyogfnVzYl9mbWFzayAqLwotCQkJX19mczMyCWZzX3N0YXRlOwkvKiBmaWxlIHN5c3RlbSBzdGF0ZSB0aW1lIHN0YW1wICovCi0JCX0gZnNfNDQ7Ci0JfSBmc191bjI7Ci0JX19mczMyCWZzX3Bvc3RibGZvcm1hdDsKLQlfX2ZzMzIJZnNfbnJwb3M7Ci0JX19mczMyCWZzX3Bvc3RibG9mZjsKLQlfX2ZzMzIJZnNfcm90YmxvZmY7Ci0JX19mczMyCWZzX21hZ2ljOwotCV9fdTgJZnNfc3BhY2VbMV07Ci19OwotCi0jZW5kaWYgLyogX19MSU5VWF9VRlNfRlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91dHNuYW1lLmggYi9pbmNsdWRlL2xpbnV4L3V0c25hbWUuaAppbmRleCA5MjNkYjk5Li4xMTIzMjY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3V0c25hbWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3V0c25hbWUuaApAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L25zcHJveHkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKIHN0cnVjdCB1dHNfbmFtZXNwYWNlIHsKQEAgLTQzLDYgKzQ0LDcgQEAKIH07CiBleHRlcm4gc3RydWN0IHV0c19uYW1lc3BhY2UgaW5pdF91dHNfbnM7CiAKKyNpZmRlZiBDT05GSUdfVVRTX05TCiBzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X3V0c19ucyhzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqbnMpCiB7CiAJa3JlZl9nZXQoJm5zLT5rcmVmKTsKQEAgLTU2LDYgKzU4LDI1IEBACiB7CiAJa3JlZl9wdXQoJm5zLT5rcmVmLCBmcmVlX3V0c19ucyk7CiB9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGdldF91dHNfbnMoc3RydWN0IHV0c19uYW1lc3BhY2UgKm5zKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3V0c19ucyhzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqbnMpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHV0c19uYW1lc3BhY2UgKmNvcHlfdXRzbmFtZSh1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkJCQlzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqbnMpCit7CisJaWYgKGZsYWdzICYgQ0xPTkVfTkVXVVRTKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCXJldHVybiBuczsKK30KKyNlbmRpZgorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXdfdXRzbmFtZSAqdXRzbmFtZSh2b2lkKQogewogCXJldHVybiAmY3VycmVudC0+bnNwcm94eS0+dXRzX25zLT5uYW1lOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tdGQvbXRkLWFiaS5oIGIvaW5jbHVkZS9tdGQvbXRkLWFiaS5oCmluZGV4IGY3MWRhYzQuLjYxNTA3MmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbXRkL210ZC1hYmkuaAorKysgYi9pbmNsdWRlL210ZC9tdGQtYWJpLmgKQEAgLTI5LDcgKzI5LDcgQEAKICNkZWZpbmUgTVREX1dSSVRFQUJMRQkJMHg0MDAJLyogRGV2aWNlIGlzIHdyaXRlYWJsZSAqLwogI2RlZmluZSBNVERfQklUX1dSSVRFQUJMRQkweDgwMAkvKiBTaW5nbGUgYml0cyBjYW4gYmUgZmxpcHBlZCAqLwogI2RlZmluZSBNVERfTk9fRVJBU0UJCTB4MTAwMAkvKiBObyBlcmFzZSBuZWNlc3NhcnkgKi8KLSNkZWZpbmUgTVREX1NUVVBJRF9MT0NLCQkweDIwMDAJLyogQWx3YXlzIGxvY2tlZCBhZnRlciByZXNldCAqLworI2RlZmluZSBNVERfUE9XRVJVUF9MT0NLCTB4MjAwMAkvKiBBbHdheXMgbG9ja2VkIGFmdGVyIHJlc2V0ICovCiAKIC8vIFNvbWUgY29tbW9uIGRldmljZXMgLyBjb21iaW5hdGlvbnMgb2YgY2FwYWJpbGl0aWVzCiAjZGVmaW5lIE1URF9DQVBfUk9NCQkwCmRpZmYgLS1naXQgYS9pbmNsdWRlL210ZC91YmktaGVhZGVyLmggYi9pbmNsdWRlL210ZC91YmktaGVhZGVyLmgKaW5kZXggNzRlZmE3Ny4uMjkyZjkxNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tdGQvdWJpLWhlYWRlci5oCisrKyBiL2luY2x1ZGUvbXRkL3ViaS1oZWFkZXIuaApAQCAtNTgsNiArNTgsNDMgQEAKIH07CiAKIC8qCisgKiBWb2x1bWUgZmxhZ3MgdXNlZCBpbiB0aGUgdm9sdW1lIHRhYmxlIHJlY29yZC4KKyAqCisgKiBAVUJJX1ZUQkxfQVVUT1JFU0laRV9GTEc6IGF1dG8tcmVzaXplIHRoaXMgdm9sdW1lCisgKgorICogJVVCSV9WVEJMX0FVVE9SRVNJWkVfRkxHIGZsYWcgY2FuIGJlIHNldCBvbmx5IGZvciBvbmUgdm9sdW1lIGluIHRoZSB2b2x1bWUKKyAqIHRhYmxlLiBVQkkgYXV0b21hdGljYWxseSByZS1zaXplcyB0aGUgdm9sdW1lIHdoaWNoIGhhcyB0aGlzIGZsYWcgYW5kIG1ha2VzCisgKiB0aGUgdm9sdW1lIHRvIGJlIG9mIGxhcmdlc3QgcG9zc2libGUgc2l6ZS4gVGhpcyBtZWFucyB0aGF0IGlmIGFmdGVyIHRoZQorICogaW5pdGlhbGl6YXRpb24gVUJJIGZpbmRzIG91dCB0aGF0IHRoZXJlIGFyZSBhdmFpbGFibGUgcGh5c2ljYWwgZXJhc2VibG9ja3MKKyAqIHByZXNlbnQgb24gdGhlIGRldmljZSwgaXQgYXV0b21hdGljYWxseSBhcHBlbmRzIGFsbCBvZiB0aGVtIHRvIHRoZSB2b2x1bWUKKyAqICh0aGUgcGh5c2ljYWwgZXJhc2VibG9ja3MgcmVzZXJ2ZWQgZm9yIGJhZCBlcmFzZWJsb2NrcyBoYW5kbGluZyBhbmQgb3RoZXIKKyAqIHJlc2VydmVkIHBoeXNpY2FsIGVyYXNlYmxvY2tzIGFyZSBub3QgdGFrZW4pLiBTbywgaWYgdGhlcmUgaXMgYSB2b2x1bWUgd2l0aAorICogdGhlICVVQklfVlRCTF9BVVRPUkVTSVpFX0ZMRyBmbGFnIHNldCwgdGhlIGFtb3VudCBvZiBhdmFpbGFibGUgbG9naWNhbAorICogZXJhc2VibG9ja3Mgd2lsbCBiZSB6ZXJvIGFmdGVyIFVCSSBpcyBsb2FkZWQsIGJlY2F1c2UgYWxsIG9mIHRoZW0gd2lsbCBiZQorICogcmVzZXJ2ZWQgZm9yIHRoaXMgdm9sdW1lLiBOb3RlLCB0aGUgJVVCSV9WVEJMX0FVVE9SRVNJWkVfRkxHIGJpdCBpcyBjbGVhcmVkCisgKiBhZnRlciB0aGUgdm9sdW1lIGhhZCBiZWVuIGluaXRpYWxpemVkLgorICoKKyAqIFRoZSBhdXRvLXJlc2l6ZSBmZWF0dXJlIGlzIHVzZWZ1bCBmb3IgZGV2aWNlIHByb2R1Y3Rpb24gcHVycG9zZXMuIEZvcgorICogZXhhbXBsZSwgZGlmZmVyZW50IE5BTkQgZmxhc2ggY2hpcHMgbWF5IGhhdmUgZGlmZmVyZW50IGFtb3VudCBvZiBpbml0aWFsIGJhZAorICogZXJhc2VibG9ja3MsIGRlcGVuZGluZyBvZiBwYXJ0aWN1bGFyIGNoaXAgaW5zdGFuY2UuIE1hbnVmYWN0dXJlcnMgb2YgTkFORAorICogY2hpcHMgdXN1YWxseSBndWFyYW50ZWUgdGhhdCB0aGUgYW1vdW50IG9mIGluaXRpYWwgYmFkIGVyYXNlYmxvY2tzIGRvZXMgbm90CisgKiBleGNlZWQgY2VydGFpbiBwZXJjZW50LCBlLmcuIDIlLiBXaGVuIG9uZSBjcmVhdGVzIGFuIFVCSSBpbWFnZSB3aGljaCB3aWxsIGJlCisgKiBmbGFzaGVkIHRvIHRoZSBlbmQgZGV2aWNlcyBpbiBwcm9kdWN0aW9uLCBoZSBkb2VzIG5vdCBrbm93IHRoZSBleGFjdCBhbW91bnQKKyAqIG9mIGdvb2QgcGh5c2ljYWwgZXJhc2VibG9ja3MgdGhlIE5BTkQgY2hpcCBvbiB0aGUgZGV2aWNlIHdpbGwgaGF2ZSwgYnV0IHRoaXMKKyAqIG51bWJlciBpcyByZXF1aXJlZCB0byBjYWxjdWxhdGUgdGhlIHZvbHVtZSBzaXplZCBhbmQgcHV0IHRoZW0gdG8gdGhlIHZvbHVtZQorICogdGFibGUgb2YgdGhlIFVCSSBpbWFnZS4gSW4gdGhpcyBjYXNlLCBvbmUgb2YgdGhlIHZvbHVtZXMgKGUuZy4sIHRoZSBvbmUKKyAqIHdoaWNoIHdpbGwgc3RvcmUgdGhlIHJvb3QgZmlsZSBzeXN0ZW0pIGlzIG1hcmtlZCBhcyAiYXV0by1yZXNpemFibGUiLCBhbmQKKyAqIFVCSSB3aWxsIGFkanVzdCBpdHMgc2l6ZSBvbiB0aGUgZmlyc3QgYm9vdCBpZiBuZWVkZWQuCisgKgorICogTm90ZSwgZmlyc3QgVUJJIHJlc2VydmVzIHNvbWUgYW1vdW50IG9mIHBoeXNpY2FsIGVyYXNlYmxvY2tzIGZvciBiYWQKKyAqIGVyYXNlYmxvY2sgaGFuZGxpbmcsIGFuZCB0aGVuIHJlLXNpemVzIHRoZSB2b2x1bWUsIG5vdCB2aWNlLXZlcnNhLiBUaGlzCisgKiBtZWFucyB0aGF0IHRoZSBwb29sIG9mIHJlc2VydmVkIHBoeXNpY2FsIGVyYXNlYmxvY2tzIHdpbGwgYWx3YXlzIGJlIHByZXNlbnQuCisgKi8KK2VudW0geworCVVCSV9WVEJMX0FVVE9SRVNJWkVfRkxHID0gMHgwMSwKK307CisKKy8qCiAgKiBDb21wYXRpYmlsaXR5IGNvbnN0YW50cyB1c2VkIGJ5IGludGVybmFsIHZvbHVtZXMuCiAgKgogICogQFVCSV9DT01QQVRfREVMRVRFOiBkZWxldGUgdGhpcyBpbnRlcm5hbCB2b2x1bWUgYmVmb3JlIGFueXRoaW5nIGlzIHdyaXR0ZW4KQEAgLTI2Miw3ICsyOTksOSBAQAogCiAvKiBUaGUgbGF5b3V0IHZvbHVtZSBjb250YWlucyB0aGUgdm9sdW1lIHRhYmxlICovCiAKLSNkZWZpbmUgVUJJX0xBWU9VVF9WT0xfSUQgICAgICAgIFVCSV9JTlRFUk5BTF9WT0xfU1RBUlQKKyNkZWZpbmUgVUJJX0xBWU9VVF9WT0xVTUVfSUQgICAgIFVCSV9JTlRFUk5BTF9WT0xfU1RBUlQKKyNkZWZpbmUgVUJJX0xBWU9VVF9WT0xVTUVfVFlQRSAgIFVCSV9WSURfRFlOQU1JQworI2RlZmluZSBVQklfTEFZT1VUX1ZPTFVNRV9BTElHTiAgMQogI2RlZmluZSBVQklfTEFZT1VUX1ZPTFVNRV9FQlMgICAgMgogI2RlZmluZSBVQklfTEFZT1VUX1ZPTFVNRV9OQU1FICAgImxheW91dCB2b2x1bWUiCiAjZGVmaW5lIFVCSV9MQVlPVVRfVk9MVU1FX0NPTVBBVCBVQklfQ09NUEFUX1JFSkVDVApAQCAtMjg5LDcgKzMyOCw4IEBACiAgKiBAdXBkX21hcmtlcjogaWYgdm9sdW1lIHVwZGF0ZSB3YXMgc3RhcnRlZCBidXQgbm90IGZpbmlzaGVkCiAgKiBAbmFtZV9sZW46IHZvbHVtZSBuYW1lIGxlbmd0aAogICogQG5hbWU6IHRoZSB2b2x1bWUgbmFtZQotICogQHBhZGRpbmcyOiByZXNlcnZlZCwgemVyb2VzCisgKiBAZmxhZ3M6IHZvbHVtZSBmbGFncyAoJVVCSV9WVEJMX0FVVE9SRVNJWkVfRkxHKQorICogQHBhZGRpbmc6IHJlc2VydmVkLCB6ZXJvZXMKICAqIEBjcmM6IGEgQ1JDMzIgY2hlY2tzdW0gb2YgdGhlIHJlY29yZAogICoKICAqIFRoZSB2b2x1bWUgdGFibGUgcmVjb3JkcyBhcmUgc3RvcmVkIGluIHRoZSB2b2x1bWUgdGFibGUsIHdoaWNoIGlzIHN0b3JlZCBpbgpAQCAtMzI0LDcgKzM2NCw4IEBACiAJX191OCAgICB1cGRfbWFya2VyOwogCV9fYmUxNiAgbmFtZV9sZW47CiAJX191OCAgICBuYW1lW1VCSV9WT0xfTkFNRV9NQVgrMV07Ci0JX191OCAgICBwYWRkaW5nMlsyNF07CisJX191OCAgICBmbGFnczsKKwlfX3U4ICAgIHBhZGRpbmdbMjNdOwogCV9fYmUzMiAgY3JjOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXRkL3ViaS11c2VyLmggYi9pbmNsdWRlL210ZC91YmktdXNlci5oCmluZGV4IGZlMDZkZWQuLmE3NDIxZjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbXRkL3ViaS11c2VyLmgKKysrIGIvaW5jbHVkZS9tdGQvdWJpLXVzZXIuaApAQCAtMjIsNiArMjIsMjEgQEAKICNkZWZpbmUgX19VQklfVVNFUl9IX18KIAogLyoKKyAqIFVCSSBkZXZpY2UgY3JlYXRpb24gKHRoZSBzYW1lIGFzIE1URCBkZXZpY2UgYXR0YWNobWVudCkKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogTVREIGRldmljZXMgbWF5IGJlIGF0dGFjaGVkIHVzaW5nICVVQklfSU9DQVRUIGlvY3RsIGNvbW1hbmQgb2YgdGhlIFVCSQorICogY29udHJvbCBkZXZpY2UuIFRoZSBjYWxsZXIgaGFzIHRvIHByb3Blcmx5IGZpbGwgYW5kIHBhc3MKKyAqICZzdHJ1Y3QgdWJpX2F0dGFjaF9yZXEgb2JqZWN0IC0gVUJJIHdpbGwgYXR0YWNoIHRoZSBNVEQgZGV2aWNlIHNwZWNpZmllZCBpbgorICogdGhlIHJlcXVlc3QgYW5kIHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBVQkkgZGV2aWNlIG51bWJlciBhcyB0aGUgaW9jdGwKKyAqIHJldHVybiB2YWx1ZS4KKyAqCisgKiBVQkkgZGV2aWNlIGRlbGV0aW9uICh0aGUgc2FtZSBhcyBNVEQgZGV2aWNlIGRldGFjaG1lbnQpCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqIEFuIFVCSSBkZXZpY2UgbWF5YmUgZGVsZXRlZCB3aXRoICVVQklfSU9DREVUIGlvY3RsIGNvbW1hbmQgb2YgdGhlIFVCSQorICogY29udHJvbCBkZXZpY2UuCisgKgogICogVUJJIHZvbHVtZSBjcmVhdGlvbgogICogfn5+fn5+fn5+fn5+fn5+fn5+fgogICoKQEAgLTQ4LDcgKzYzLDcgQEAKICAqCiAgKiBWb2x1bWUgdXBkYXRlIHNob3VsZCBiZSBkb25lIHZpYSB0aGUgJVVCSV9JT0NWT0xVUCBJT0NUTCBjb21tYW5kIG9mIHRoZQogICogY29ycmVzcG9uZGluZyBVQkkgdm9sdW1lIGNoYXJhY3RlciBkZXZpY2UuIEEgcG9pbnRlciB0byBhIDY0LWJpdCB1cGRhdGUKLSAqIHNpemUgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgSU9DVEwuIEFmdGVyIHRoZW4sIFVCSSBleHBlY3RzIHVzZXIgdG8gd3JpdGUKKyAqIHNpemUgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgSU9DVEwuIEFmdGVyIHRoaXMsIFVCSSBleHBlY3RzIHVzZXIgdG8gd3JpdGUKICAqIHRoaXMgbnVtYmVyIG9mIGJ5dGVzIHRvIHRoZSB2b2x1bWUgY2hhcmFjdGVyIGRldmljZS4gVGhlIHVwZGF0ZSBpcyBmaW5pc2hlZAogICogd2hlbiB0aGUgY2xhaW1lZCBudW1iZXIgb2YgYnl0ZXMgaXMgcGFzc2VkLiBTbywgdGhlIHZvbHVtZSB1cGRhdGUgc2VxdWVuY2UKICAqIGlzIHNvbWV0aGluZyBsaWtlOgpAQCAtNTcsMTQgKzcyLDI0IEBACiAgKiBpb2N0bChmZCwgVUJJX0lPQ1ZPTFVQLCAmaW1hZ2Vfc2l6ZSk7CiAgKiB3cml0ZShmZCwgYnVmLCBpbWFnZV9zaXplKTsKICAqIGNsb3NlKGZkKTsKKyAqCisgKiBBdG9taWMgZXJhc2VibG9jayBjaGFuZ2UKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqIEF0b21pYyBlcmFzZWJsb2NrIGNoYW5nZSBvcGVyYXRpb24gaXMgZG9uZSB2aWEgdGhlICVVQklfSU9DRUJDSCBJT0NUTAorICogY29tbWFuZCBvZiB0aGUgY29ycmVzcG9uZGluZyBVQkkgdm9sdW1lIGNoYXJhY3RlciBkZXZpY2UuIEEgcG9pbnRlciB0bworICogJnN0cnVjdCB1YmlfbGViX2NoYW5nZV9yZXEgaGFzIHRvIGJlIHBhc3NlZCB0byB0aGUgSU9DVEwuIFRoZW4gdGhlIHVzZXIgaXMKKyAqIGV4cGVjdGVkIHRvIHdyaXRlIHRoZSByZXF1ZXN0ZWQgYW1vdW50IG9mIGJ5dGVzLiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlCisgKiAidm9sdW1lIHVwZGF0ZSIgSU9DVEwuCiAgKi8KIAogLyoKLSAqIFdoZW4gYSBuZXcgdm9sdW1lIGlzIGNyZWF0ZWQsIHVzZXJzIG1heSBlaXRoZXIgc3BlY2lmeSB0aGUgdm9sdW1lIG51bWJlciB0aGV5Ci0gKiB3YW50IHRvIGNyZWF0ZSBvciB0byBsZXQgVUJJIGF1dG9tYXRpY2FsbHkgYXNzaWduIGEgdm9sdW1lIG51bWJlciB1c2luZyB0aGlzCi0gKiBjb25zdGFudC4KKyAqIFdoZW4gYSBuZXcgVUJJIHZvbHVtZSBvciBVQkkgZGV2aWNlIGlzIGNyZWF0ZWQsIHVzZXJzIG1heSBlaXRoZXIgc3BlY2lmeSB0aGUKKyAqIHZvbHVtZS9kZXZpY2UgbnVtYmVyIHRoZXkgd2FudCB0byBjcmVhdGUgb3IgdG8gbGV0IFVCSSBhdXRvbWF0aWNhbGx5IGFzc2lnbgorICogdGhlIG51bWJlciB1c2luZyB0aGVzZSBjb25zdGFudHMuCiAgKi8KICNkZWZpbmUgVUJJX1ZPTF9OVU1fQVVUTyAoLTEpCisjZGVmaW5lIFVCSV9ERVZfTlVNX0FVVE8gKC0xKQogCiAvKiBNYXhpbXVtIHZvbHVtZSBuYW1lIGxlbmd0aCAqLwogI2RlZmluZSBVQklfTUFYX1ZPTFVNRV9OQU1FIDEyNwpAQCAtODAsNiArMTA1LDE1IEBACiAvKiBSZS1zaXplIGFuIFVCSSB2b2x1bWUgKi8KICNkZWZpbmUgVUJJX0lPQ1JTVk9MIF9JT1coVUJJX0lPQ19NQUdJQywgMiwgc3RydWN0IHViaV9yc3ZvbF9yZXEpCiAKKy8qIElPQ1RMIGNvbW1hbmRzIG9mIHRoZSBVQkkgY29udHJvbCBjaGFyYWN0ZXIgZGV2aWNlICovCisKKyNkZWZpbmUgVUJJX0NUUkxfSU9DX01BR0lDICdvJworCisvKiBBdHRhY2ggYW4gTVREIGRldmljZSAqLworI2RlZmluZSBVQklfSU9DQVRUIF9JT1coVUJJX0NUUkxfSU9DX01BR0lDLCA2NCwgc3RydWN0IHViaV9hdHRhY2hfcmVxKQorLyogRGV0YWNoIGFuIE1URCBkZXZpY2UgKi8KKyNkZWZpbmUgVUJJX0lPQ0RFVCBfSU9XKFVCSV9DVFJMX0lPQ19NQUdJQywgNjUsIGludDMyX3QpCisKIC8qIElPQ1RMIGNvbW1hbmRzIG9mIFVCSSB2b2x1bWUgY2hhcmFjdGVyIGRldmljZXMgKi8KIAogI2RlZmluZSBVQklfVk9MX0lPQ19NQUdJQyAnTycKQEAgLTg4LDYgKzEyMiwyOCBAQAogI2RlZmluZSBVQklfSU9DVk9MVVAgX0lPVyhVQklfVk9MX0lPQ19NQUdJQywgMCwgaW50NjRfdCkKIC8qIEFuIGVyYXNlYmxvY2sgZXJhc3VyZSBjb21tYW5kLCB1c2VkIGZvciBkZWJ1Z2dpbmcsIGRpc2FibGVkIGJ5IGRlZmF1bHQgKi8KICNkZWZpbmUgVUJJX0lPQ0VCRVIgX0lPVyhVQklfVk9MX0lPQ19NQUdJQywgMSwgaW50MzJfdCkKKy8qIEFuIGF0b21pYyBlcmFzZWJsb2NrIGNoYW5nZSBjb21tYW5kICovCisjZGVmaW5lIFVCSV9JT0NFQkNIIF9JT1coVUJJX1ZPTF9JT0NfTUFHSUMsIDIsIGludDMyX3QpCisKKy8qIE1heGltdW0gTVREIGRldmljZSBuYW1lIGxlbmd0aCBzdXBwb3J0ZWQgYnkgVUJJICovCisjZGVmaW5lIE1BWF9VQklfTVREX05BTUVfTEVOIDEyNworCisvKgorICogVUJJIGRhdGEgdHlwZSBoaW50IGNvbnN0YW50cy4KKyAqCisgKiBVQklfTE9OR1RFUk06IGxvbmctdGVybSBkYXRhCisgKiBVQklfU0hPUlRURVJNOiBzaG9ydC10ZXJtIGRhdGEKKyAqIFVCSV9VTktOT1dOOiBkYXRhIHBlcnNpc3RlbmNlIGlzIHVua25vd24KKyAqCisgKiBUaGVzZSBjb25zdGFudHMgYXJlIHVzZWQgd2hlbiBkYXRhIGlzIHdyaXR0ZW4gdG8gVUJJIHZvbHVtZXMgaW4gb3JkZXIgdG8KKyAqIGhlbHAgdGhlIFVCSSB3ZWFyLWxldmVsaW5nIHVuaXQgdG8gZmluZCBtb3JlIGFwcHJvcHJpYXRlIHBoeXNpY2FsCisgKiBlcmFzZWJsb2Nrcy4KKyAqLworZW51bSB7CisJVUJJX0xPTkdURVJNICA9IDEsCisJVUJJX1NIT1JUVEVSTSA9IDIsCisJVUJJX1VOS05PV04gICA9IDMsCit9OwogCiAvKgogICogVUJJIHZvbHVtZSB0eXBlIGNvbnN0YW50cy4KQEAgLTk3LDIyICsxNTMsNTggQEAKICAqLwogZW51bSB7CiAJVUJJX0RZTkFNSUNfVk9MVU1FID0gMywKLQlVQklfU1RBVElDX1ZPTFVNRSA9IDQKKwlVQklfU1RBVElDX1ZPTFVNRSAgPSA0LAorfTsKKworLyoqCisgKiBzdHJ1Y3QgdWJpX2F0dGFjaF9yZXEgLSBhdHRhY2ggTVREIGRldmljZSByZXF1ZXN0LgorICogQHViaV9udW06IFVCSSBkZXZpY2UgbnVtYmVyIHRvIGNyZWF0ZQorICogQG10ZF9udW06IE1URCBkZXZpY2UgbnVtYmVyIHRvIGF0dGFjaAorICogQHZpZF9oZHJfb2Zmc2V0OiBWSUQgaGVhZGVyIG9mZnNldCAodXNlIGRlZmF1bHRzIGlmICUwKQorICogQHBhZGRpbmc6IHJlc2VydmVkIGZvciBmdXR1cmUsIG5vdCB1c2VkLCBoYXMgdG8gYmUgemVyb2VkCisgKgorICogVGhpcyBkYXRhIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHNwZWNpZnkgTVREIGRldmljZSBVQkkgaGFzIHRvIGF0dGFjaCBhbmQgdGhlCisgKiBwYXJhbWV0ZXJzIGl0IGhhcyB0byB1c2UuIFRoZSBudW1iZXIgd2hpY2ggc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZSBuZXcgVUJJCisgKiBkZXZpY2UgaXMgcGFzc2VkIGluIEB1YmlfbnVtLiBVQkkgbWF5IGF1dG9tYXRpY2FsbHkgYXNzaWduIHRoZSBudW1iZXIgaWYKKyAqIEBVQklfREVWX05VTV9BVVRPIGlzIHBhc3NlZC4gSW4gdGhpcyBjYXNlLCB0aGUgZGV2aWNlIG51bWJlciBpcyByZXR1cm5lZCBpbgorICogQHViaV9udW0uCisgKgorICogTW9zdCBhcHBsaWNhdGlvbnMgc2hvdWxkIHBhc3MgJTAgaW4gQHZpZF9oZHJfb2Zmc2V0IHRvIG1ha2UgVUJJIHVzZSBkZWZhdWx0CisgKiBvZmZzZXQgb2YgdGhlIFZJRCBoZWFkZXIgd2l0aGluIHBoeXNpY2FsIGVyYXNlYmxvY2tzLiBUaGUgZGVmYXVsdCBvZmZzZXQgaXMKKyAqIHRoZSBuZXh0IG1pbi4gSS9PIHVuaXQgYWZ0ZXIgdGhlIEVDIGhlYWRlci4gRm9yIGV4YW1wbGUsIGl0IHdpbGwgYmUgb2Zmc2V0CisgKiA1MTIgaW4gY2FzZSBvZiBhIDUxMiBieXRlcyBwYWdlIE5BTkQgZmxhc2ggd2l0aCBubyBzdWItcGFnZSBzdXBwb3J0LiBPcgorICogaXQgd2lsbCBiZSA1MTIgaW4gY2FzZSBvZiBhIDJLaUIgcGFnZSBOQU5EIGZsYXNoIHdpdGggNCA1MTItYnl0ZSBzdWItcGFnZXMuCisgKgorICogQnV0IGluIHJhcmUgY2FzZXMsIGlmIHRoaXMgb3B0aW1pemVzIHRoaW5ncywgdGhlIFZJRCBoZWFkZXIgbWF5IGJlIHBsYWNlZCB0bworICogYSBkaWZmZXJlbnQgb2Zmc2V0LiBGb3IgZXhhbXBsZSwgdGhlIGJvb3QtbG9hZGVyIG1pZ2h0IGRvIHRoaW5ncyBmYXN0ZXIgaWYgdGhlCisgKiBWSUQgaGVhZGVyIHNpdHMgYXQgdGhlIGVuZCBvZiB0aGUgZmlyc3QgMktpQiBOQU5EIHBhZ2Ugd2l0aCA0IHN1Yi1wYWdlcy4gQXMKKyAqIHRoZSBib290LWxvYWRlciB3b3VsZCBub3Qgbm9ybWFsbHkgbmVlZCB0byByZWFkIEVDIGhlYWRlcnMgKHVubGVzcyBpdCBuZWVkcworICogVUJJIGluIFJXIG1vZGUpLCBpdCBtaWdodCBiZSBmYXN0ZXIgdG8gY2FsY3VsYXRlIEVDQy4gVGhpcyBpcyB3ZWlyZCBleGFtcGxlLAorICogYnV0IGl0IHJlYWwtbGlmZSBleGFtcGxlLiBTbywgaW4gdGhpcyBleGFtcGxlLCBAdmlkX2hkcl9vZmZlciB3b3VsZCBiZQorICogMktpQi02NCBieXRlcyA9IDE5ODQuIE5vdGUsIHRoYXQgdGhpcyBwb3NpdGlvbiBpcyBub3QgZXZlbiA1MTItYnl0ZXMKKyAqIGFsaWduZWQsIHdoaWNoIGlzIE9LLCBhcyBVQkkgaXMgY2xldmVyIGVub3VnaCB0byByZWFsaXplIHRoaXMgaXMgNHRoIHN1Yi1wYWdlCisgKiBvZiB0aGUgZmlyc3QgcGFnZSBhbmQgYWRkIG5lZWRlZCBwYWRkaW5nLgorICovCitzdHJ1Y3QgdWJpX2F0dGFjaF9yZXEgeworCWludDMyX3QgdWJpX251bTsKKwlpbnQzMl90IG10ZF9udW07CisJaW50MzJfdCB2aWRfaGRyX29mZnNldDsKKwl1aW50OF90IHBhZGRpbmdbMTJdOwogfTsKIAogLyoqCiAgKiBzdHJ1Y3QgdWJpX21rdm9sX3JlcSAtIHZvbHVtZSBkZXNjcmlwdGlvbiBkYXRhIHN0cnVjdHVyZSB1c2VkIGluCi0gKiB2b2x1bWUgY3JlYXRpb24gcmVxdWVzdHMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSBjcmVhdGlvbiByZXF1ZXN0cy4KICAqIEB2b2xfaWQ6IHZvbHVtZSBudW1iZXIKICAqIEBhbGlnbm1lbnQ6IHZvbHVtZSBhbGlnbm1lbnQKICAqIEBieXRlczogdm9sdW1lIHNpemUgaW4gYnl0ZXMKICAqIEB2b2xfdHlwZTogdm9sdW1lIHR5cGUgKCVVQklfRFlOQU1JQ19WT0xVTUUgb3IgJVVCSV9TVEFUSUNfVk9MVU1FKQotICogQHBhZGRpbmcxOiByZXNlcnZlZCBmb3IgZnV0dXJlLCBub3QgdXNlZAorICogQHBhZGRpbmcxOiByZXNlcnZlZCBmb3IgZnV0dXJlLCBub3QgdXNlZCwgaGFzIHRvIGJlIHplcm9lZAogICogQG5hbWVfbGVuOiB2b2x1bWUgbmFtZSBsZW5ndGgKLSAqIEBwYWRkaW5nMjogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSwgbm90IHVzZWQKKyAqIEBwYWRkaW5nMjogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSwgbm90IHVzZWQsIGhhcyB0byBiZSB6ZXJvZWQKICAqIEBuYW1lOiB2b2x1bWUgbmFtZQogICoKLSAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYnkgdXNlcnNwYWNlIHByb2dyYW1zIHdoZW4gY3JlYXRpbmcgbmV3IHZvbHVtZXMuIFRoZQorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSB1c2VyLXNwYWNlIHByb2dyYW1zIHdoZW4gY3JlYXRpbmcgbmV3IHZvbHVtZXMuIFRoZQogICogQHVzZWRfYnl0ZXMgZmllbGQgaXMgb25seSBuZWNlc3Nhcnkgd2hlbiBjcmVhdGluZyBzdGF0aWMgdm9sdW1lcy4KICAqCiAgKiBUaGUgQGFsaWdubWVudCBmaWVsZCBzcGVjaWZpZXMgdGhlIHJlcXVpcmVkIGFsaWdubWVudCBvZiB0aGUgdm9sdW1lIGxvZ2ljYWwKQEAgLTEzOSw3ICsyMzEsNyBAQAogCWludDhfdCBwYWRkaW5nMTsKIAlpbnQxNl90IG5hbWVfbGVuOwogCWludDhfdCBwYWRkaW5nMls0XTsKLQljaGFyIG5hbWVbVUJJX01BWF9WT0xVTUVfTkFNRSsxXTsKKwljaGFyIG5hbWVbVUJJX01BWF9WT0xVTUVfTkFNRSArIDFdOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKIC8qKgpAQCAtMTU4LDQgKzI1MCwxOSBAQAogCWludDMyX3Qgdm9sX2lkOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKKy8qKgorICogc3RydWN0IHViaV9sZWJfY2hhbmdlX3JlcSAtIGEgZGF0YSBzdHJ1Y3R1cmUgdXNlZCBpbiBhdG9taWMgbG9naWNhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyYXNlYmxvY2sgY2hhbmdlIHJlcXVlc3RzLgorICogQGxudW06IGxvZ2ljYWwgZXJhc2VibG9jayBudW1iZXIgdG8gY2hhbmdlCisgKiBAYnl0ZXM6IGhvdyBtYW55IGJ5dGVzIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgbG9naWNhbCBlcmFzZWJsb2NrCisgKiBAZHR5cGU6IGRhdGEgdHlwZSAoJVVCSV9MT05HVEVSTSwgJVVCSV9TSE9SVFRFUk0sICVVQklfVU5LTk9XTikKKyAqIEBwYWRkaW5nOiByZXNlcnZlZCBmb3IgZnV0dXJlLCBub3QgdXNlZCwgaGFzIHRvIGJlIHplcm9lZAorICovCitzdHJ1Y3QgdWJpX2xlYl9jaGFuZ2VfcmVxIHsKKwlpbnQzMl90IGxudW07CisJaW50MzJfdCBieXRlczsKKwl1aW50OF90IGR0eXBlOworCXVpbnQ4X3QgcGFkZGluZ1s3XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCiAjZW5kaWYgLyogX19VQklfVVNFUl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwNl9maWIuaCBiL2luY2x1ZGUvbmV0L2lwNl9maWIuaAppbmRleCBkOGQ4NWIxLi45NTNkNjA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcDZfZmliLmgKKysrIGIvaW5jbHVkZS9uZXQvaXA2X2ZpYi5oCkBAIC0xNTAsMTkgKzE1MCw2IEBACiAgKgogICovCiAKLSNkZWZpbmUgUlRQUklfRklSRVdBTEwJOAkJLyogRmlyZXdhbGwgY29udHJvbCBpbmZvcm1hdGlvbgkqLwotI2RlZmluZSBSVFBSSV9GTE9XCTE2CQkvKiBGbG93IGJhc2VkIGZvcndhcmRpbmcgcnVsZXMJKi8KLSNkZWZpbmUgUlRQUklfS0VSTl9DVEwJMzIJCS8qIEtlcm5lbCBjb250cm9sIHJvdXRlcwkqLwotCi0jZGVmaW5lIFJUUFJJX1VTRVJfTUlOCTI1NgkJLyogTWltaW11bSB1c2VyIHByaW9yaXR5CSovCi0jZGVmaW5lIFJUUFJJX1VTRVJfTUFYCTEwMjQJCS8qIE1heGltdW0gdXNlciBwcmlvcml0eQkqLwotCi0jZGVmaW5lIFJUUFJJX0tFUk5fREZMVAk0MDk2CQkvKiBLZXJuZWwgZGVmYXVsdCByb3V0ZXMJKi8KLQotI2RlZmluZQlNQVhfRkxPV19CQUNLVFJBQ0UJMzIKLQotCi10eXBlZGVmIHZvaWQJCQkoKmZfcG5vZGUpKHN0cnVjdCBmaWI2X25vZGUgKmZuLCB2b2lkICopOwogCiBzdHJ1Y3QgZmliNl90YWJsZSB7CiAJc3RydWN0IGhsaXN0X25vZGUJdGI2X2hsaXN0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXA2X3JvdXRlLmggYi9pbmNsdWRlL25ldC9pcDZfcm91dGUuaAppbmRleCBmYWFjMGVlLi5mOTllNGYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcDZfcm91dGUuaAorKysgYi9pbmNsdWRlL25ldC9pcDZfcm91dGUuaApAQCAtMSwxMSArMSw5IEBACiAjaWZuZGVmIF9ORVRfSVA2X1JPVVRFX0gKICNkZWZpbmUgX05FVF9JUDZfUk9VVEVfSAogCi0jZGVmaW5lIElQNl9SVF9QUklPX0ZXCQkxNgogI2RlZmluZSBJUDZfUlRfUFJJT19VU0VSCTEwMjQKICNkZWZpbmUgSVA2X1JUX1BSSU9fQUREUkNPTkYJMjU2CiAjZGVmaW5lIElQNl9SVF9QUklPX0tFUk4JNTEyCi0jZGVmaW5lIElQNl9SVF9GTE9XX01BU0sJMHgwMGZmCiAKIHN0cnVjdCByb3V0ZV9pbmZvIHsKIAlfX3U4CQkJdHlwZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5oCmluZGV4IDczYjU3MTEuLjQ5YWFjNjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuaApAQCAtNjcsNyArNjcsNyBAQAogCXZvaWQgKCpkZXN0cm95KShzdHJ1Y3QgbmZfY29ubiAqY3QpOwogCS8qIENhbGxlZCB3aGVuIHJlYWxsb2FjdGVkIChjYW4gYmUgTlVMTCkuCiAJICAgQ29udGVudHMgaGFzIGFscmVhZHkgYmVlbiBtb3ZlZC4gKi8KLQl2b2lkICgqbW92ZSkoc3RydWN0IG5mX2Nvbm4gKmN0LCB2b2lkICpvbGQpOworCXZvaWQgKCptb3ZlKSh2b2lkICpuZXcsIHZvaWQgKm9sZCk7CiAKIAllbnVtIG5mX2N0X2V4dF9pZCBpZDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdGlwYy90aXBjX21zZy5oIGIvaW5jbHVkZS9uZXQvdGlwYy90aXBjX21zZy5oCmluZGV4IGZiNDJlYjcuLjJlMTU5YTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3RpcGMvdGlwY19tc2cuaAorKysgYi9pbmNsdWRlL25ldC90aXBjL3RpcGNfbXNnLmgKQEAgLTEzMCwxMSArMTMwLDYgQEAKIAlyZXR1cm4gbXNnX2JpdHMobSwgMSwgMjksIDB4Nyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyIG1zZ19kaXJlY3Qoc3RydWN0IHRpcGNfbXNnICptKQotewotCXJldHVybiAobXNnX3R5cGUobSkgPT0gVElQQ19ESVJFQ1RfTVNHKTsKLX0KLQogc3RhdGljIGlubGluZSB1MzIgbXNnX25hbWVkKHN0cnVjdCB0aXBjX21zZyAqbSkKIHsKIAlyZXR1cm4gKG1zZ190eXBlKG0pID09IFRJUENfTkFNRURfTVNHKTsKQEAgLTIwNywxNyArMjAyLDYgQEAKIAlyZXR1cm4gbXNnX3dvcmQobSwgMTApOwogfQogCi1zdGF0aWMgaW5saW5lIGNoYXIgKm1zZ19vcHRpb25zKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyICpsZW4pCi17Ci0JdTMyIHBvcyA9IG1zZ19iaXRzKG0sIDEsIDE2LCAweDcpOwotCi0JaWYgKCFwb3MpCi0JCXJldHVybiAwOwotCXBvcyA9IChwb3MgKiA0KSArIDI4OwotCSpsZW4gPSBtc2dfaGRyX3N6KG0pIC0gcG9zOwotCXJldHVybiAoY2hhciAqKSZtLT5oZHJbcG9zLzRdOwotfQotCiAjZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3JkbWEvaWJfdmVyYnMuaCBiL2luY2x1ZGUvcmRtYS9pYl92ZXJicy5oCmluZGV4IGNmYmQzOGYuLjcwMWU3YjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcmRtYS9pYl92ZXJicy5oCisrKyBiL2luY2x1ZGUvcmRtYS9pYl92ZXJicy5oCkBAIC05NSw3ICs5NSwxNSBAQAogCUlCX0RFVklDRV9OX05PVElGWV9DUQkJPSAoMTw8MTQpLAogCUlCX0RFVklDRV9aRVJPX1NUQUcJCT0gKDE8PDE1KSwKIAlJQl9ERVZJQ0VfU0VORF9XX0lOVgkJPSAoMTw8MTYpLAotCUlCX0RFVklDRV9NRU1fV0lORE9XCQk9ICgxPDwxNykKKwlJQl9ERVZJQ0VfTUVNX1dJTkRPVwkJPSAoMTw8MTcpLAorCS8qCisJICogRGV2aWNlcyBzaG91bGQgc2V0IElCX0RFVklDRV9VRF9JUF9TVU0gaWYgdGhleSBzdXBwb3J0CisJICogaW5zZXJ0aW9uIG9mIFVEUCBhbmQgVENQIGNoZWNrc3VtIG9uIG91dGdvaW5nIFVEIElQb0lCCisJICogbWVzc2FnZXMgYW5kIGNhbiB2ZXJpZnkgdGhlIHZhbGlkaXR5IG9mIGNoZWNrc3VtIGZvcgorCSAqIGluY29taW5nIG1lc3NhZ2VzLiAgU2V0dGluZyB0aGlzIGZsYWcgaW1wbGllcyB0aGF0IHRoZQorCSAqIElQb0lCIGRyaXZlciBtYXkgc2V0IE5FVElGX0ZfSVBfQ1NVTSBmb3IgZGF0YWdyYW0gbW9kZS4KKwkgKi8KKwlJQl9ERVZJQ0VfVURfSVBfQ1NVTQkJPSAoMTw8MTgpLAogfTsKIAogZW51bSBpYl9hdG9taWNfY2FwIHsKQEAgLTQzMSw2ICs0MzksNyBAQAogCXU4CQkJc2w7CiAJdTgJCQlkbGlkX3BhdGhfYml0czsKIAl1OAkJCXBvcnRfbnVtOwkvKiB2YWxpZCBvbmx5IGZvciBEUiBTTVBzIG9uIHN3aXRjaGVzICovCisJaW50CQkJY3N1bV9vazsKIH07CiAKIGVudW0gaWJfY3Ffbm90aWZ5X2ZsYWdzIHsKQEAgLTYxNSw3ICs2MjQsOCBAQAogCUlCX1NFTkRfRkVOQ0UJCT0gMSwKIAlJQl9TRU5EX1NJR05BTEVECT0gKDE8PDEpLAogCUlCX1NFTkRfU09MSUNJVEVECT0gKDE8PDIpLAotCUlCX1NFTkRfSU5MSU5FCQk9ICgxPDwzKQorCUlCX1NFTkRfSU5MSU5FCQk9ICgxPDwzKSwKKwlJQl9TRU5EX0lQX0NTVU0JCT0gKDE8PDQpCiB9OwogCiBzdHJ1Y3QgaWJfc2dlIHsKQEAgLTg5MCw4ICs5MDAsNiBAQAogCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgKnBrZXlfdGJsX2xlbjsKIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICpnaWRfdGJsX2xlbjsKIAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOwotCiAJaW50CQkJICAgICAgbnVtX2NvbXBfdmVjdG9yczsKIAogCXN0cnVjdCBpd19jbV92ZXJicwkgICAgICppd2NtOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2lzY3NpX3Byb3RvLmggYi9pbmNsdWRlL3Njc2kvaXNjc2lfcHJvdG8uaAppbmRleCAzMThhOTA5Li41ZmZlYzhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvaXNjc2lfcHJvdG8uaAorKysgYi9pbmNsdWRlL3Njc2kvaXNjc2lfcHJvdG8uaApAQCAtNDUsOCArNDUsOCBAQAogLyogaW5pdGlhdG9yIHRhZ3M7IG9wYXF1ZSBmb3IgdGFyZ2V0ICovCiB0eXBlZGVmIHVpbnQzMl90IF9fYml0d2lzZV9fIGl0dF90OwogLyogYmVsb3cgbWFrZXMgc2Vuc2Ugb25seSBmb3IgaW5pdGlhdG9yIHRoYXQgY3JlYXRlZCB0aGlzIHRhZyAqLwotI2RlZmluZSBidWlsZF9pdHQoaXR0LCBpZCwgYWdlKSAoKF9fZm9yY2UgaXR0X3QpXAotCSgoaXR0KSB8ICgoaWQpIDw8IElTQ1NJX0NJRF9TSElGVCkgfCAoKGFnZSkgPDwgSVNDU0lfQUdFX1NISUZUKSkpCisjZGVmaW5lIGJ1aWxkX2l0dChpdHQsIGFnZSkgKChfX2ZvcmNlIGl0dF90KVwKKwkoKGl0dCkgfCAoKGFnZSkgPDwgSVNDU0lfQUdFX1NISUZUKSkpCiAjZGVmaW5lIGdldF9pdHQoaXR0KSAoKF9fZm9yY2UgdWludDMyX3QpKGl0dF90KShpdHQpICYgSVNDU0lfSVRUX01BU0spCiAjZGVmaW5lIFJFU0VSVkVEX0lUVCAoKF9fZm9yY2UgaXR0X3QpMHhmZmZmZmZmZikKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2xpYmlzY3NpLmggYi9pbmNsdWRlL3Njc2kvbGliaXNjc2kuaAppbmRleCA4ODlmNTFmLi43YjkwYjYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvbGliaXNjc2kuaAorKysgYi9pbmNsdWRlL3Njc2kvbGliaXNjc2kuaApAQCAtNzAsOCArNzAsNiBAQAogI2RlZmluZSBJU0NTSV9TVVNQRU5EX0JJVAkJMQogCiAjZGVmaW5lIElTQ1NJX0lUVF9NQVNLCQkJKDB4ZmZmKQotI2RlZmluZSBJU0NTSV9DSURfU0hJRlQJCQkxMgotI2RlZmluZSBJU0NTSV9DSURfTUFTSwkJCSgweGZmZmYgPDwgSVNDU0lfQ0lEX1NISUZUKQogI2RlZmluZSBJU0NTSV9BR0VfU0hJRlQJCQkyOAogI2RlZmluZSBJU0NTSV9BR0VfTUFTSwkJCSgweGYgPDwgSVNDU0lfQUdFX1NISUZUKQogCkBAIC0xMzUsNiArMTMzLDE0IEBACiAJcmV0dXJuICh2b2lkKiljdGFzay0+aGRyICsgY3Rhc2stPmhkcl9sZW47CiB9CiAKKy8qIENvbm5lY3Rpb24ncyBzdGF0ZXMgKi8KK2VudW0geworCUlTQ1NJX0NPTk5fSU5JVElBTF9TVEFHRSwKKwlJU0NTSV9DT05OX1NUQVJURUQsCisJSVNDU0lfQ09OTl9TVE9QUEVELAorCUlTQ1NJX0NPTk5fQ0xFQU5VUF9XQUlULAorfTsKKwogc3RydWN0IGlzY3NpX2Nvbm4gewogCXN0cnVjdCBpc2NzaV9jbHNfY29ubgkqY2xzX2Nvbm47CS8qIHB0ciB0byBjbGFzcyBjb25uZWN0aW9uICovCiAJdm9pZAkJCSpkZF9kYXRhOwkvKiBpc2NzaV90cmFuc3BvcnQgZGF0YSAqLwpAQCAtMjI3LDYgKzIzMywxNyBAQAogCWludAkJCW1heDsJCS8qIE1heCBudW1iZXIgb2YgZWxlbWVudHMgKi8KIH07CiAKKy8qIFNlc3Npb24ncyBzdGF0ZXMgKi8KK2VudW0geworCUlTQ1NJX1NUQVRFX0ZSRUUgPSAxLAorCUlTQ1NJX1NUQVRFX0xPR0dFRF9JTiwKKwlJU0NTSV9TVEFURV9GQUlMRUQsCisJSVNDU0lfU1RBVEVfVEVSTUlOQVRFLAorCUlTQ1NJX1NUQVRFX0lOX1JFQ09WRVJZLAorCUlTQ1NJX1NUQVRFX1JFQ09WRVJZX0ZBSUxFRCwKKwlJU0NTSV9TVEFURV9MT0dHSU5HX09VVCwKK307CisKIHN0cnVjdCBpc2NzaV9zZXNzaW9uIHsKIAkvKgogCSAqIFN5bmNzIHVwIHRoZSBzY3NpIGVoIHRocmVhZCB3aXRoIHRoZSBpc2NzaSBlaCB0aHJlYWQgd2hlbiBzZW5kaW5nCkBAIC0zMjUsNiArMzQyLDEwIEBACiAjZGVmaW5lIHNlc3Npb25fdG9fY2xzKF9zZXNzKSBcCiAJaG9zdGRhdGFfc2Vzc2lvbihfc2Vzcy0+aG9zdC0+aG9zdGRhdGEpCiAKKyNkZWZpbmUgaXNjc2lfc2Vzc2lvbl9wcmludGsocHJlZml4LCBfc2VzcywgZm10LCBhLi4uKQlcCisJaXNjc2lfY2xzX3Nlc3Npb25fcHJpbnRrKHByZWZpeCwJCVwKKwkJKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqKXNlc3Npb25fdG9fY2xzKF9zZXNzKSwgZm10LCAjI2EpCisKIC8qCiAgKiBjb25uZWN0aW9uIG1hbmFnZW1lbnQKICAqLwpAQCAtMzM5LDYgKzM2MCw5IEBACiBleHRlcm4gaW50IGlzY3NpX2Nvbm5fZ2V0X3BhcmFtKHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4sCiAJCQkJZW51bSBpc2NzaV9wYXJhbSBwYXJhbSwgY2hhciAqYnVmKTsKIAorI2RlZmluZSBpc2NzaV9jb25uX3ByaW50ayhwcmVmaXgsIF9jLCBmbXQsIGEuLi4pIFwKKwlpc2NzaV9jbHNfY29ubl9wcmludGsocHJlZml4LCBfYy0+Y2xzX2Nvbm4sIGZtdCwgIyNhKQorCiAvKgogICogcGR1IGFuZCB0YXNrIHByb2Nlc3NpbmcKICAqLwpAQCAtMzQ5LDggKzM3Myw2IEBACiAJCQkJY2hhciAqLCB1aW50MzJfdCk7CiBleHRlcm4gaW50IGlzY3NpX2NvbXBsZXRlX3BkdShzdHJ1Y3QgaXNjc2lfY29ubiAqLCBzdHJ1Y3QgaXNjc2lfaGRyICosCiAJCQkgICAgICBjaGFyICosIGludCk7Ci1leHRlcm4gaW50IF9faXNjc2lfY29tcGxldGVfcGR1KHN0cnVjdCBpc2NzaV9jb25uICosIHN0cnVjdCBpc2NzaV9oZHIgKiwKLQkJCQljaGFyICosIGludCk7CiBleHRlcm4gaW50IGlzY3NpX3ZlcmlmeV9pdHQoc3RydWN0IGlzY3NpX2Nvbm4gKiwgc3RydWN0IGlzY3NpX2hkciAqLAogCQkJICAgIHVpbnQzMl90ICopOwogZXh0ZXJuIHZvaWQgaXNjc2lfcmVxdWV1ZV9jdGFzayhzdHJ1Y3QgaXNjc2lfY21kX3Rhc2sgKmN0YXNrKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpLmggYi9pbmNsdWRlL3Njc2kvc2NzaS5oCmluZGV4IDgyMjUxNTcuLjFmNzRiY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpLmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2kuaApAQCAtMjM1LDYgKzIzNSwyMCBAQAogI2RlZmluZSBUWVBFX1JCQwkgICAgMHgwZQogI2RlZmluZSBUWVBFX05PX0xVTiAgICAgICAgIDB4N2YKIAorLyogU0NTSSBwcm90b2NvbHM7IHRoZXNlIGFyZSB0YWtlbiBmcm9tIFNQQy0zIHNlY3Rpb24gNy41ICovCitlbnVtIHNjc2lfcHJvdG9jb2wgeworCVNDU0lfUFJPVE9DT0xfRkNQID0gMCwJLyogRmlicmUgQ2hhbm5lbCAqLworCVNDU0lfUFJPVE9DT0xfU1BJID0gMSwJLyogcGFyYWxsZWwgU0NTSSAqLworCVNDU0lfUFJPVE9DT0xfU1NBID0gMiwJLyogU2VyaWFsIFN0b3JhZ2UgQXJjaGl0ZWN0dXJlIC0gT2Jzb2xldGUgKi8KKwlTQ1NJX1BST1RPQ09MX1NCUCA9IDMsCS8qIGZpcmV3aXJlICovCisJU0NTSV9QUk9UT0NPTF9TUlAgPSA0LAkvKiBJbmZpbmliYW5kIFJETUEgKi8KKwlTQ1NJX1BST1RPQ09MX0lTQ1NJID0gNSwKKwlTQ1NJX1BST1RPQ09MX1NBUyA9IDYsCisJU0NTSV9QUk9UT0NPTF9BRFQgPSA3LAkvKiBNZWRpYSBDaGFuZ2VycyAqLworCVNDU0lfUFJPVE9DT0xfQVRBID0gOCwKKwlTQ1NJX1BST1RPQ09MX1VOU1BFQyA9IDB4ZiwgLyogTm8gc3BlY2lmaWMgcHJvdG9jb2wgKi8KK307CisKIC8qIFJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBuYW1lIGZvciB0aGUgZGV2aWNlICovCiBleHRlcm4gY29uc3QgY2hhciAqIHNjc2lfZGV2aWNlX3R5cGUodW5zaWduZWQgdHlwZSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX2hvc3QuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX2hvc3QuaAppbmRleCA1YzU4ZDU5Li5kMTI5OWU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV9ob3N0LmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oCkBAIC0yODAsMzkgKzI4MCw0NSBAQAogCSAqIElmIHRoZSBob3N0IHdhbnRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIHNjYW4gc3RhcnRzLCBidXQKIAkgKiBhZnRlciB0aGUgbWlkbGF5ZXIgaGFzIHNldCB1cCByZWFkeSBmb3IgdGhlIHNjYW4sIGl0IGNhbiBmaWxsCiAJICogaW4gdGhpcyBmdW5jdGlvbi4KKwkgKgorCSAqIFN0YXR1czogT1BUSU9OQUwKIAkgKi8KIAl2b2lkICgqIHNjYW5fc3RhcnQpKHN0cnVjdCBTY3NpX0hvc3QgKik7CiAKIAkvKgotCSAqIGZpbGwgaW4gdGhpcyBmdW5jdGlvbiB0byBhbGxvdyB0aGUgcXVldWUgZGVwdGggb2YgdGhpcyBob3N0Ci0JICogdG8gYmUgY2hhbmdlYWJsZSAob24gYSBwZXIgZGV2aWNlIGJhc2lzKS4gIHJldHVybnMgZWl0aGVyCisJICogRmlsbCBpbiB0aGlzIGZ1bmN0aW9uIHRvIGFsbG93IHRoZSBxdWV1ZSBkZXB0aCBvZiB0aGlzIGhvc3QKKwkgKiB0byBiZSBjaGFuZ2VhYmxlIChvbiBhIHBlciBkZXZpY2UgYmFzaXMpLiAgUmV0dXJucyBlaXRoZXIKIAkgKiB0aGUgY3VycmVudCBxdWV1ZSBkZXB0aCBzZXR0aW5nIChtYXkgYmUgZGlmZmVyZW50IGZyb20gd2hhdAogCSAqIHdhcyBwYXNzZWQgaW4pIG9yIGFuIGVycm9yLiAgQW4gZXJyb3Igc2hvdWxkIG9ubHkgYmUKIAkgKiByZXR1cm5lZCBpZiB0aGUgcmVxdWVzdGVkIGRlcHRoIGlzIGxlZ2FsIGJ1dCB0aGUgZHJpdmVyIHdhcwogCSAqIHVuYWJsZSB0byBzZXQgaXQuICBJZiB0aGUgcmVxdWVzdGVkIGRlcHRoIGlzIGlsbGVnYWwsIHRoZQogCSAqIGRyaXZlciBzaG91bGQgc2V0IGFuZCByZXR1cm4gdGhlIGNsb3Nlc3QgbGVnYWwgcXVldWUgZGVwdGguCiAJICoKKwkgKiBTdGF0dXM6IE9QVElPTkFMCiAJICovCiAJaW50ICgqIGNoYW5nZV9xdWV1ZV9kZXB0aCkoc3RydWN0IHNjc2lfZGV2aWNlICosIGludCk7CiAKIAkvKgotCSAqIGZpbGwgaW4gdGhpcyBmdW5jdGlvbiB0byBhbGxvdyB0aGUgY2hhbmdpbmcgb2YgdGFnIHR5cGVzCisJICogRmlsbCBpbiB0aGlzIGZ1bmN0aW9uIHRvIGFsbG93IHRoZSBjaGFuZ2luZyBvZiB0YWcgdHlwZXMKIAkgKiAodGhpcyBhbHNvIGFsbG93cyB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRhZyBjb21tYW5kCiAJICogcXVldWVpbmcpLiAgQW4gZXJyb3Igc2hvdWxkIG9ubHkgYmUgcmV0dXJuZWQgaWYgc29tZXRoaW5nCiAJICogd2VudCB3cm9uZyBpbiB0aGUgZHJpdmVyIHdoaWxlIHRyeWluZyB0byBzZXQgdGhlIHRhZyB0eXBlLgogCSAqIElmIHRoZSBkcml2ZXIgZG9lc24ndCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgdGFnIHR5cGUsIHRoZW4KIAkgKiBpdCBzaG91bGQgc2V0IHRoZSBjbG9zZXN0IHR5cGUgaXQgZG9lcyBzdXBwb3J0IHdpdGhvdXQKIAkgKiByZXR1cm5pbmcgYW4gZXJyb3IuICBSZXR1cm5zIHRoZSBhY3R1YWwgdGFnIHR5cGUgc2V0LgorCSAqCisJICogU3RhdHVzOiBPUFRJT05BTAogCSAqLwogCWludCAoKiBjaGFuZ2VfcXVldWVfdHlwZSkoc3RydWN0IHNjc2lfZGV2aWNlICosIGludCk7CiAKIAkvKgotCSAqIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyB0aGUgYmlvcyBwYXJhbWV0ZXJzIGZvciBhIGdpdmVuCisJICogVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIHRoZSBCSU9TIHBhcmFtZXRlcnMgZm9yIGEgZ2l2ZW4KIAkgKiBoYXJkZGlzay4gIFRoZXNlIHRlbmQgdG8gYmUgbnVtYmVycyB0aGF0IGFyZSBtYWRlIHVwIGJ5CiAJICogdGhlIGhvc3QgYWRhcHRlci4gIFBhcmFtZXRlcnM6CiAJICogc2l6ZSwgZGV2aWNlLCBsaXN0IChoZWFkcywgc2VjdG9ycywgY3lsaW5kZXJzKQogCSAqCi0JICogU3RhdHVzOiBPUFRJT05BTCAqLworCSAqIFN0YXR1czogT1BUSU9OQUwKKwkgKi8KIAlpbnQgKCogYmlvc19wYXJhbSkoc3RydWN0IHNjc2lfZGV2aWNlICosIHN0cnVjdCBibG9ja19kZXZpY2UgKiwKIAkJCXNlY3Rvcl90LCBpbnQgW10pOwogCkBAIC0zNTEsNyArMzU3LDcgQEAKIAogCS8qCiAJICogVGhpcyBkZXRlcm1pbmVzIGlmIHdlIHdpbGwgdXNlIGEgbm9uLWludGVycnVwdCBkcml2ZW4KLQkgKiBvciBhbiBpbnRlcnJ1cHQgZHJpdmVuIHNjaGVtZSwgIEl0IGlzIHNldCB0byB0aGUgbWF4aW11bSBudW1iZXIKKwkgKiBvciBhbiBpbnRlcnJ1cHQgZHJpdmVuIHNjaGVtZS4gIEl0IGlzIHNldCB0byB0aGUgbWF4aW11bSBudW1iZXIKIAkgKiBvZiBzaW11bHRhbmVvdXMgY29tbWFuZHMgYSBnaXZlbiBob3N0IGFkYXB0ZXIgd2lsbCBhY2NlcHQuCiAJICovCiAJaW50IGNhbl9xdWV1ZTsKQEAgLTM3MiwxMiArMzc4LDEyIEBACiAJdW5zaWduZWQgc2hvcnQgc2dfdGFibGVzaXplOwogCiAJLyoKLQkgKiBJZiB0aGUgaG9zdCBhZGFwdGVyIGhhcyBsaW1pdGF0aW9ucyBiZXNpZGUgc2VnbWVudCBjb3VudAorCSAqIFNldCB0aGlzIGlmIHRoZSBob3N0IGFkYXB0ZXIgaGFzIGxpbWl0YXRpb25zIGJlc2lkZSBzZWdtZW50IGNvdW50LgogCSAqLwogCXVuc2lnbmVkIHNob3J0IG1heF9zZWN0b3JzOwogCiAJLyoKLQkgKiBkbWEgc2NhdHRlciBnYXRoZXIgc2VnbWVudCBib3VuZGFyeSBsaW1pdC4gYSBzZWdtZW50IGNyb3NzaW5nIHRoaXMKKwkgKiBETUEgc2NhdHRlciBnYXRoZXIgc2VnbWVudCBib3VuZGFyeSBsaW1pdC4gQSBzZWdtZW50IGNyb3NzaW5nIHRoaXMKIAkgKiBib3VuZGFyeSB3aWxsIGJlIHNwbGl0IGluIHR3by4KIAkgKi8KIAl1bnNpZ25lZCBsb25nIGRtYV9ib3VuZGFyeTsKQEAgLTM4Niw3ICszOTIsNyBAQAogCSAqIFRoaXMgc3BlY2lmaWVzICJtYWNoaW5lIGluZmluaXR5IiBmb3IgaG9zdCB0ZW1wbGF0ZXMgd2hpY2ggZG9uJ3QKIAkgKiBsaW1pdCB0aGUgdHJhbnNmZXIgc2l6ZS4gIE5vdGUgdGhpcyBsaW1pdCByZXByZXNlbnRzIGFuIGFic29sdXRlCiAJICogbWF4aW11bSwgYW5kIG1heSBiZSBvdmVyIHRoZSB0cmFuc2ZlciBsaW1pdHMgYWxsb3dlZCBmb3IKLQkgKiBpbmRpdmlkdWFsIGRldmljZXMgKGUuZy4gMjU2IGZvciBTQ1NJLTEpCisJICogaW5kaXZpZHVhbCBkZXZpY2VzIChlLmcuIDI1NiBmb3IgU0NTSS0xKS4KIAkgKi8KICNkZWZpbmUgU0NTSV9ERUZBVUxUX01BWF9TRUNUT1JTCTEwMjQKIApAQCAtNDEzLDEyICs0MTksMTIgQEAKIAl1bnNpZ25lZCBzdXBwb3J0ZWRfbW9kZToyOwogCiAJLyoKLQkgKiB0cnVlIGlmIHRoaXMgaG9zdCBhZGFwdGVyIHVzZXMgdW5jaGVja2VkIERNQSBvbnRvIGFuIElTQSBidXMuCisJICogVHJ1ZSBpZiB0aGlzIGhvc3QgYWRhcHRlciB1c2VzIHVuY2hlY2tlZCBETUEgb250byBhbiBJU0EgYnVzLgogCSAqLwogCXVuc2lnbmVkIHVuY2hlY2tlZF9pc2FfZG1hOjE7CiAKIAkvKgotCSAqIHRydWUgaWYgdGhpcyBob3N0IGFkYXB0ZXIgY2FuIG1ha2UgZ29vZCB1c2Ugb2YgY2x1c3RlcmluZy4KKwkgKiBUcnVlIGlmIHRoaXMgaG9zdCBhZGFwdGVyIGNhbiBtYWtlIGdvb2QgdXNlIG9mIGNsdXN0ZXJpbmcuCiAJICogSSBvcmlnaW5hbGx5IHRob3VnaHQgdGhhdCBpZiB0aGUgdGFibGVzaXplIHdhcyBsYXJnZSB0aGF0IGl0CiAJICogd2FzIGEgd2FzdGUgb2YgQ1BVIGN5Y2xlcyB0byBwcmVwYXJlIGEgY2x1c3RlciBsaXN0LCBidXQKIAkgKiBpdCB3b3JrcyBvdXQgdGhhdCB0aGUgQnVzbG9naWMgaXMgZmFzdGVyIGlmIHlvdSB1c2UgYSBzbWFsbGVyCkBAIC00MjgsNyArNDM0LDcgQEAKIAl1bnNpZ25lZCB1c2VfY2x1c3RlcmluZzoxOwogCiAJLyoKLQkgKiBUcnVlIGZvciBlbXVsYXRlZCBTQ1NJIGhvc3QgYWRhcHRlcnMgKGUuZy4gQVRBUEkpCisJICogVHJ1ZSBmb3IgZW11bGF0ZWQgU0NTSSBob3N0IGFkYXB0ZXJzIChlLmcuIEFUQVBJKS4KIAkgKi8KIAl1bnNpZ25lZCBlbXVsYXRlZDoxOwogCkBAIC00MzgsMTIgKzQ0NCwxMiBAQAogCXVuc2lnbmVkIHNraXBfc2V0dGxlX2RlbGF5OjE7CiAKIAkvKgotCSAqIG9yZGVyZWQgd3JpdGUgc3VwcG9ydAorCSAqIFRydWUgaWYgd2UgYXJlIHVzaW5nIG9yZGVyZWQgd3JpdGUgc3VwcG9ydC4KIAkgKi8KIAl1bnNpZ25lZCBvcmRlcmVkX3RhZzoxOwogCiAJLyoKLQkgKiBDb3VudGRvd24gZm9yIGhvc3QgYmxvY2tpbmcgd2l0aCBubyBjb21tYW5kcyBvdXRzdGFuZGluZworCSAqIENvdW50ZG93biBmb3IgaG9zdCBibG9ja2luZyB3aXRoIG5vIGNvbW1hbmRzIG91dHN0YW5kaW5nLgogCSAqLwogCXVuc2lnbmVkIGludCBtYXhfaG9zdF9ibG9ja2VkOwogCkBAIC01MjIsOCArNTI4LDggQEAKIAlzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKnRyYW5zcG9ydHQ7CiAKIAkvKgotCSAqIGFyZWEgdG8ga2VlcCBhIHNoYXJlZCB0YWcgbWFwIChpZiBuZWVkZWQsIHdpbGwgYmUKLQkgKiBOVUxMIGlmIG5vdCkKKwkgKiBBcmVhIHRvIGtlZXAgYSBzaGFyZWQgdGFnIG1hcCAoaWYgbmVlZGVkLCB3aWxsIGJlCisJICogTlVMTCBpZiBub3QpLgogCSAqLwogCXN0cnVjdCBibGtfcXVldWVfdGFnCSpicXQ7CiAKQEAgLTU5NiwxNiArNjAyLDE2IEBACiAJLyoKIAkgKiBIb3N0IHVzZXMgY29ycmVjdCBTQ1NJIG9yZGVyaW5nIG5vdCBQQyBvcmRlcmluZy4gVGhlIGJpdCBpcwogCSAqIHNldCBmb3IgdGhlIG1pbm9yaXR5IG9mIGRyaXZlcnMgd2hvc2UgYXV0aG9ycyBhY3R1YWxseSByZWFkCi0JICogdGhlIHNwZWMgOykKKwkgKiB0aGUgc3BlYyA7KS4KIAkgKi8KIAl1bnNpZ25lZCByZXZlcnNlX29yZGVyaW5nOjE7CiAKIAkvKgotCSAqIG9yZGVyZWQgd3JpdGUgc3VwcG9ydAorCSAqIE9yZGVyZWQgd3JpdGUgc3VwcG9ydAogCSAqLwogCXVuc2lnbmVkIG9yZGVyZWRfdGFnOjE7CiAKLQkvKiB0YXNrIG1nbXQgZnVuY3Rpb24gaW4gcHJvZ3Jlc3MgKi8KKwkvKiBUYXNrIG1nbXQgZnVuY3Rpb24gaW4gcHJvZ3Jlc3MgKi8KIAl1bnNpZ25lZCB0bWZfaW5fcHJvZ3Jlc3M6MTsKIAogCS8qIEFzeW5jaHJvbm91cyBzY2FuIGluIHByb2dyZXNzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfaXNjc2kuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5oCmluZGV4IDQwNGYxMWQuLmRiYzk2ZWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5oCkBAIC0xNDksMTMgKzE0OSw2IEBACiBleHRlcm4gaW50IGlzY3NpX3JlY3ZfcGR1KHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY29ubiwgc3RydWN0IGlzY3NpX2hkciAqaGRyLAogCQkJICBjaGFyICpkYXRhLCB1aW50MzJfdCBkYXRhX3NpemUpOwogCi0KLS8qIENvbm5lY3Rpb24ncyBzdGF0ZXMgKi8KLSNkZWZpbmUgSVNDU0lfQ09OTl9JTklUSUFMX1NUQUdFCTAKLSNkZWZpbmUgSVNDU0lfQ09OTl9TVEFSVEVECQkxCi0jZGVmaW5lIElTQ1NJX0NPTk5fU1RPUFBFRAkJMgotI2RlZmluZSBJU0NTSV9DT05OX0NMRUFOVVBfV0FJVAkJMwotCiBzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gewogCXN0cnVjdCBsaXN0X2hlYWQgY29ubl9saXN0OwkvKiBpdGVtIGluIGNvbm5saXN0ICovCiAJdm9pZCAqZGRfZGF0YTsJCQkvKiBMTEQgcHJpdmF0ZSBkYXRhICovCkBAIC0xNjksMjcgKzE2MiwzMSBAQAogI2RlZmluZSBpc2NzaV9kZXZfdG9fY29ubihfZGV2KSBcCiAJY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBpc2NzaV9jbHNfY29ubiwgZGV2KQogCi0vKiBTZXNzaW9uJ3Mgc3RhdGVzICovCi0jZGVmaW5lIElTQ1NJX1NUQVRFX0ZSRUUJCTEKLSNkZWZpbmUgSVNDU0lfU1RBVEVfTE9HR0VEX0lOCQkyCi0jZGVmaW5lIElTQ1NJX1NUQVRFX0ZBSUxFRAkJMwotI2RlZmluZSBJU0NTSV9TVEFURV9URVJNSU5BVEUJCTQKLSNkZWZpbmUgSVNDU0lfU1RBVEVfSU5fUkVDT1ZFUlkJCTUKLSNkZWZpbmUgSVNDU0lfU1RBVEVfUkVDT1ZFUllfRkFJTEVECTYKLSNkZWZpbmUgSVNDU0lfU1RBVEVfTE9HR0lOR19PVVQJCTcKKyNkZWZpbmUgaXNjc2lfY29ubl90b19zZXNzaW9uKF9jb25uKSBcCisJaXNjc2lfZGV2X3RvX3Nlc3Npb24oX2Nvbm4tPmRldi5wYXJlbnQpCisKKy8qIGlzY3NpIGNsYXNzIHNlc3Npb24gc3RhdGUgKi8KK2VudW0geworCUlTQ1NJX1NFU1NJT05fTE9HR0VEX0lOLAorCUlTQ1NJX1NFU1NJT05fRkFJTEVELAorCUlTQ1NJX1NFU1NJT05fRlJFRSwKK307CiAKIHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiB7CiAJc3RydWN0IGxpc3RfaGVhZCBzZXNzX2xpc3Q7CQkvKiBpdGVtIGluIHNlc3Npb25fbGlzdCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgaG9zdF9saXN0OwogCXN0cnVjdCBpc2NzaV90cmFuc3BvcnQgKnRyYW5zcG9ydDsKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IHdvcmtfc3RydWN0IHNjYW5fd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdW5iaW5kX3dvcms7CiAKIAkvKiByZWNvdmVyeSBmaWVsZHMgKi8KIAlpbnQgcmVjb3ZlcnlfdG1vOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgcmVjb3Zlcnlfd29yazsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdW5iaW5kX3dvcms7CiAKIAlpbnQgdGFyZ2V0X2lkOwogCisJaW50IHN0YXRlOwogCWludCBzaWQ7CQkJCS8qIHNlc3Npb24gaWQgKi8KIAl2b2lkICpkZF9kYXRhOwkJCQkvKiBMTEQgcHJpdmF0ZSBkYXRhICovCiAJc3RydWN0IGRldmljZSBkZXY7CS8qIHN5c2ZzIHRyYW5zcG9ydC9jb250YWluZXIgZGV2aWNlICovCkBAIC0yMDYsMTQgKzIwMywyMiBAQAogCiBzdHJ1Y3QgaXNjc2lfaG9zdCB7CiAJc3RydWN0IGxpc3RfaGVhZCBzZXNzaW9uczsKKwlhdG9taWNfdCBucl9zY2FuczsKIAlzdHJ1Y3QgbXV0ZXggbXV0ZXg7Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnVuYmluZF93b3JrcTsKLQljaGFyIHVuYmluZF93b3JrcV9uYW1lW0tPQkpfTkFNRV9MRU5dOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpzY2FuX3dvcmtxOworCWNoYXIgc2Nhbl93b3JrcV9uYW1lW0tPQkpfTkFNRV9MRU5dOwogfTsKIAogLyoKICAqIHNlc3Npb24gYW5kIGNvbm5lY3Rpb24gZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgYnkgSFcgaVNDU0kgTExEcwogICovCisjZGVmaW5lIGlzY3NpX2Nsc19zZXNzaW9uX3ByaW50ayhwcmVmaXgsIF9jbHNfc2Vzc2lvbiwgZm10LCBhLi4uKSBcCisJZGV2X3ByaW50ayhwcmVmaXgsICYoX2Nsc19zZXNzaW9uKS0+ZGV2LCBmbXQsICMjYSkKKworI2RlZmluZSBpc2NzaV9jbHNfY29ubl9wcmludGsocHJlZml4LCBfY2xzX2Nvbm4sIGZtdCwgYS4uLikgXAorCWRldl9wcmludGsocHJlZml4LCAmKF9jbHNfY29ubiktPmRldiwgZm10LCAjI2EpCisKK2V4dGVybiBpbnQgaXNjc2lfc2Vzc2lvbl9jaGtyZWFkeShzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKnNlc3Npb24pOwogZXh0ZXJuIHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqaXNjc2lfYWxsb2Nfc2Vzc2lvbihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKIAkJCQkJc3RydWN0IGlzY3NpX3RyYW5zcG9ydCAqdHJhbnNwb3J0KTsKIGV4dGVybiBpbnQgaXNjc2lfYWRkX3Nlc3Npb24oc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpzZXNzaW9uLApAQCAtMjMxLDYgKzIzNiw2IEBACiBleHRlcm4gaW50IGlzY3NpX2Rlc3Ryb3lfY29ubihzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNvbm4pOwogZXh0ZXJuIHZvaWQgaXNjc2lfdW5ibG9ja19zZXNzaW9uKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbik7CiBleHRlcm4gdm9pZCBpc2NzaV9ibG9ja19zZXNzaW9uKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqc2Vzc2lvbik7Ci0KK2V4dGVybiBpbnQgaXNjc2lfc2Nhbl9maW5pc2hlZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgdW5zaWduZWQgbG9uZyB0aW1lKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbml0L0tjb25maWcgYi9pbml0L0tjb25maWcKaW5kZXggOTJiMjNlMi4uNDU1MTcwZSAxMDA2NDQKLS0tIGEvaW5pdC9LY29uZmlnCisrKyBiL2luaXQvS2NvbmZpZwpAQCAtMjE0LDI3ICsyMTQsNiBAQAogCiAJICBTYXkgTiBpZiB1bnN1cmUuCiAKLWNvbmZpZyBVU0VSX05TCi0JYm9vbCAiVXNlciBOYW1lc3BhY2VzIChFWFBFUklNRU5UQUwpIgotCWRlZmF1bHQgbgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCi0JaGVscAotCSAgU3VwcG9ydCB1c2VyIG5hbWVzcGFjZXMuICBUaGlzIGFsbG93cyBjb250YWluZXJzLCBpLmUuCi0JICB2c2VydmVycywgdG8gdXNlIHVzZXIgbmFtZXNwYWNlcyB0byBwcm92aWRlIGRpZmZlcmVudAotCSAgdXNlciBpbmZvIGZvciBkaWZmZXJlbnQgc2VydmVycy4gIElmIHVuc3VyZSwgc2F5IE4uCi0KLWNvbmZpZyBQSURfTlMKLQlib29sICJQSUQgTmFtZXNwYWNlcyAoRVhQRVJJTUVOVEFMKSIKLQlkZWZhdWx0IG4KLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAotCWhlbHAKLQkgIFN1cG9ydCBwcm9jZXNzIGlkIG5hbWVzcGFjZXMuICBUaGlzIGFsbG93cyBoYXZpbmcgbXVsdGlwbGUKLQkgIHByb2Nlc3Mgd2l0aCB0aGUgc2FtZSBwaWQgYXMgbG9uZyBhcyB0aGV5IGFyZSBpbiBkaWZmZXJlbnQKLQkgIHBpZCBuYW1lc3BhY2VzLiAgVGhpcyBpcyBhIGJ1aWxkaW5nIGJsb2NrIG9mIGNvbnRhaW5lcnMuCi0KLQkgIFVubGVzcyB5b3Ugd2FudCB0byB3b3JrIHdpdGggYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUKLQkgIHNheSBOIGhlcmUuCi0KIGNvbmZpZyBBVURJVAogCWJvb2wgIkF1ZGl0aW5nIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBORVQKQEAgLTM2OSw2ICszNDgsMTMgQEAKIAkgIFByb3ZpZGVzIGEgc2ltcGxlIFJlc291cmNlIENvbnRyb2xsZXIgZm9yIG1vbml0b3JpbmcgdGhlCiAJICB0b3RhbCBDUFUgY29uc3VtZWQgYnkgdGhlIHRhc2tzIGluIGEgY2dyb3VwCiAKK2NvbmZpZyBSRVNPVVJDRV9DT1VOVEVSUworCWJvb2wgIlJlc291cmNlIGNvdW50ZXJzIgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgY29udHJvbGxlciBpbmRlcGVuZGVudCByZXNvdXJjZSBhY2NvdW50aW5nCisgICAgICAgICAgaW5mcmFzdHJ1Y3R1cmUgdGhhdCB3b3JrcyB3aXRoIGNncm91cHMKKwlkZXBlbmRzIG9uIENHUk9VUFMKKwogY29uZmlnIFNZU0ZTX0RFUFJFQ0FURUQKIAlib29sICJDcmVhdGUgZGVwcmVjYXRlZCBzeXNmcyBmaWxlcyIKIAlkZXBlbmRzIG9uIFNZU0ZTCkBAIC0zOTAsNiArMzc2LDEzIEBACiAJICBJZiB5b3UgYXJlIHVzaW5nIGEgZGlzdHJvIHRoYXQgd2FzIHJlbGVhc2VkIGluIDIwMDYgb3IgbGF0ZXIsCiAJICBpdCBzaG91bGQgYmUgc2FmZSB0byBzYXkgTiBoZXJlLgogCitjb25maWcgQ0dST1VQX01FTV9DT05UCisJYm9vbCAiTWVtb3J5IGNvbnRyb2xsZXIgZm9yIGNncm91cHMiCisJZGVwZW5kcyBvbiBDR1JPVVBTICYmIFJFU09VUkNFX0NPVU5URVJTCisJaGVscAorCSAgUHJvdmlkZXMgYSBtZW1vcnkgY29udHJvbGxlciB0aGF0IG1hbmFnZXMgYm90aCBwYWdlIGNhY2hlIGFuZAorCSAgUlNTIG1lbW9yeS4KKwogY29uZmlnIFBST0NfUElEX0NQVVNFVAogCWJvb2wgIkluY2x1ZGUgbGVnYWN5IC9wcm9jLzxwaWQ+L2NwdXNldCBmaWxlIgogCWRlcGVuZHMgb24gQ1BVU0VUUwpAQCAtNDA2LDYgKzM5OSw0OSBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgTkFNRVNQQUNFUworCWJvb2wgIk5hbWVzcGFjZXMgc3VwcG9ydCIgaWYgRU1CRURERUQKKwlkZWZhdWx0ICFFTUJFRERFRAorCWhlbHAKKwkgIFByb3ZpZGVzIHRoZSB3YXkgdG8gbWFrZSB0YXNrcyB3b3JrIHdpdGggZGlmZmVyZW50IG9iamVjdHMgdXNpbmcKKwkgIHRoZSBzYW1lIGlkLiBGb3IgZXhhbXBsZSBzYW1lIElQQyBpZCBtYXkgcmVmZXIgdG8gZGlmZmVyZW50IG9iamVjdHMKKwkgIG9yIHNhbWUgdXNlciBpZCBvciBwaWQgbWF5IHJlZmVyIHRvIGRpZmZlcmVudCB0YXNrcyB3aGVuIHVzZWQgaW4KKwkgIGRpZmZlcmVudCBuYW1lc3BhY2VzLgorCitjb25maWcgVVRTX05TCisJYm9vbCAiVVRTIG5hbWVzcGFjZSIKKwlkZXBlbmRzIG9uIE5BTUVTUEFDRVMKKwloZWxwCisJICBJbiB0aGlzIG5hbWVzcGFjZSB0YXNrcyBzZWUgZGlmZmVyZW50IGluZm8gcHJvdmlkZWQgd2l0aCB0aGUKKwkgIHVuYW1lKCkgc3lzdGVtIGNhbGwKKworY29uZmlnIElQQ19OUworCWJvb2wgIklQQyBuYW1lc3BhY2UiCisJZGVwZW5kcyBvbiBOQU1FU1BBQ0VTICYmIFNZU1ZJUEMKKwloZWxwCisJICBJbiB0aGlzIG5hbWVzcGFjZSB0YXNrcyB3b3JrIHdpdGggSVBDIGlkcyB3aGljaCBjb3JyZXNwb25kIHRvCisJICBkaWZmZXJlbnQgSVBDIG9iamVjdHMgaW4gZGlmZmVyZW50IG5hbWVzcGFjZXMKKworY29uZmlnIFVTRVJfTlMKKwlib29sICJVc2VyIG5hbWVzcGFjZSAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE5BTUVTUEFDRVMgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgVGhpcyBhbGxvd3MgY29udGFpbmVycywgaS5lLiB2c2VydmVycywgdG8gdXNlIHVzZXIgbmFtZXNwYWNlcworCSAgdG8gcHJvdmlkZSBkaWZmZXJlbnQgdXNlciBpbmZvIGZvciBkaWZmZXJlbnQgc2VydmVycy4KKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBQSURfTlMKKwlib29sICJQSUQgTmFtZXNwYWNlcyAoRVhQRVJJTUVOVEFMKSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIE5BTUVTUEFDRVMgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgU3Vwb3J0IHByb2Nlc3MgaWQgbmFtZXNwYWNlcy4gIFRoaXMgYWxsb3dzIGhhdmluZyBtdWx0aXBsZQorCSAgcHJvY2VzcyB3aXRoIHRoZSBzYW1lIHBpZCBhcyBsb25nIGFzIHRoZXkgYXJlIGluIGRpZmZlcmVudAorCSAgcGlkIG5hbWVzcGFjZXMuICBUaGlzIGlzIGEgYnVpbGRpbmcgYmxvY2sgb2YgY29udGFpbmVycy4KKworCSAgVW5sZXNzIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBhbiBleHBlcmltZW50YWwgZmVhdHVyZQorCSAgc2F5IE4gaGVyZS4KKwogY29uZmlnIEJMS19ERVZfSU5JVFJECiAJYm9vbCAiSW5pdGlhbCBSQU0gZmlsZXN5c3RlbSBhbmQgUkFNIGRpc2sgKGluaXRyYW1mcy9pbml0cmQpIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBCUk9LRU4gfHwgIUZSVgpkaWZmIC0tZ2l0IGEvaW5pdC9pbml0cmFtZnMuYyBiL2luaXQvaW5pdHJhbWZzLmMKaW5kZXggZDUzZmVlOC4uYzBiMWUwNSAxMDA2NDQKLS0tIGEvaW5pdC9pbml0cmFtZnMuYworKysgYi9pbml0L2luaXRyYW1mcy5jCkBAIC01MzgsNyArNTM4LDcgQEAKIAlpbml0cmRfZW5kID0gMDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgcG9wdWxhdGVfcm9vdGZzKHZvaWQpCitpbnQgX19pbml0IHBvcHVsYXRlX3Jvb3Rmcyh2b2lkKQogewogCWNoYXIgKmVyciA9IHVucGFja190b19yb290ZnMoX19pbml0cmFtZnNfc3RhcnQsCiAJCQkgX19pbml0cmFtZnNfZW5kIC0gX19pbml0cmFtZnNfc3RhcnQsIDApOwpAQCAtNTc3LDQgKzU3NywxMCBAQAogCX0KIAlyZXR1cm4gMDsKIH0KKyNpZm5kZWYgQ09ORklHX0FDUElfQ1VTVE9NX0RTRFRfSU5JVFJECisvKgorICogaWYgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgcG9wdWxhdGVfcm9vdGZzKCkgaXMgY2FsbGVkIF9lYXJsaWVyXyBpbiB0aGUKKyAqIGJvb3Qgc2VxdWVuY2UuIFRoaXMgaW5zdXJlcyB0aGF0IHRoZSBBQ1BJIGluaXRpYWxpc2F0aW9uIGNhbiBmaW5kIHRoZSBmaWxlLgorICovCiByb290ZnNfaW5pdGNhbGwocG9wdWxhdGVfcm9vdGZzKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5pdC9tYWluLmMgYi9pbml0L21haW4uYwppbmRleCBjNjkxZjVmLi5jNTk4NTliIDEwMDY0NAotLS0gYS9pbml0L21haW4uYworKysgYi9pbml0L21haW4uYwpAQCAtMTAyLDYgKzEwMiwxMiBAQAogZXh0ZXJuIHZvaWQgdGNfaW5pdCh2b2lkKTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0FDUElfQ1VTVE9NX0RTRFRfSU5JVFJECitleHRlcm4gaW50IHBvcHVsYXRlX3Jvb3Rmcyh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcG9wdWxhdGVfcm9vdGZzKHZvaWQpIHt9CisjZW5kaWYKKwogZW51bSBzeXN0ZW1fc3RhdGVzIHN5c3RlbV9zdGF0ZTsKIEVYUE9SVF9TWU1CT0woc3lzdGVtX3N0YXRlKTsKIApAQCAtMjMyLDIyICsyMzgsMTggQEAKIAogc3RhdGljIGludCBfX2luaXQgZGVidWdfa2VybmVsKGNoYXIgKnN0cikKIHsKLQlpZiAoKnN0cikKLQkJcmV0dXJuIDA7CiAJY29uc29sZV9sb2dsZXZlbCA9IDEwOwotCXJldHVybiAxOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBxdWlldF9rZXJuZWwoY2hhciAqc3RyKQogewotCWlmICgqc3RyKQotCQlyZXR1cm4gMDsKIAljb25zb2xlX2xvZ2xldmVsID0gNDsKLQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIAotX19zZXR1cCgiZGVidWciLCBkZWJ1Z19rZXJuZWwpOwotX19zZXR1cCgicXVpZXQiLCBxdWlldF9rZXJuZWwpOworZWFybHlfcGFyYW0oImRlYnVnIiwgZGVidWdfa2VybmVsKTsKK2Vhcmx5X3BhcmFtKCJxdWlldCIsIHF1aWV0X2tlcm5lbCk7CiAKIHN0YXRpYyBpbnQgX19pbml0IGxvZ2xldmVsKGNoYXIgKnN0cikKIHsKQEAgLTI1NSw3ICsyNTcsNyBAQAogCXJldHVybiAxOwogfQogCi1fX3NldHVwKCJsb2dsZXZlbD0iLCBsb2dsZXZlbCk7CitlYXJseV9wYXJhbSgibG9nbGV2ZWwiLCBsb2dsZXZlbCk7CiAKIC8qCiAgKiBVbmtub3duIGJvb3Qgb3B0aW9ucyBnZXQgaGFuZGVkIHRvIGluaXQsIHVubGVzcyB0aGV5IGxvb2sgbGlrZQpAQCAtNjQ4LDYgKzY1MCw3IEBACiAKIAljaGVja19idWdzKCk7CiAKKwlwb3B1bGF0ZV9yb290ZnMoKTsgLyogRm9yIERTRFQgb3ZlcnJpZGUgZnJvbSBpbml0cmFtZnMgKi8KIAlhY3BpX2Vhcmx5X2luaXQoKTsgLyogYmVmb3JlIExBUElDIGFuZCBTTVAgaW5pdCAqLwogCiAJLyogRG8gdGhlIHJlc3Qgbm9uLV9faW5pdCdlZCwgd2UncmUgbm93IGFsaXZlICovCkBAIC04MjYsNyArODI5LDYgQEAKIAkgKi8KIAlpbml0X3BpZF9ucy5jaGlsZF9yZWFwZXIgPSBjdXJyZW50OwogCi0JX19zZXRfc3BlY2lhbF9waWRzKDEsIDEpOwogCWNhZF9waWQgPSB0YXNrX3BpZChjdXJyZW50KTsKIAogCXNtcF9wcmVwYXJlX2NwdXMoc2V0dXBfbWF4X2NwdXMpOwpkaWZmIC0tZ2l0IGEvaXBjL01ha2VmaWxlIGIvaXBjL01ha2VmaWxlCmluZGV4IGI5M2JiYTYuLjVmYzVlMzMgMTAwNjQ0Ci0tLSBhL2lwYy9NYWtlZmlsZQorKysgYi9pcGMvTWFrZWZpbGUKQEAgLTcsNCArNyw1IEBACiBvYmotJChDT05GSUdfU1lTVklQQ19TWVNDVEwpICs9IGlwY19zeXNjdGwubwogb2JqX21xLSQoQ09ORklHX0NPTVBBVCkgKz0gY29tcGF0X21xLm8KIG9iai0kKENPTkZJR19QT1NJWF9NUVVFVUUpICs9IG1xdWV1ZS5vIG1zZ3V0aWwubyAkKG9ial9tcS15KQorb2JqLSQoQ09ORklHX0lQQ19OUykgKz0gbmFtZXNwYWNlLm8KIApkaWZmIC0tZ2l0IGEvaXBjL2lwY19zeXNjdGwuYyBiL2lwYy9pcGNfc3lzY3RsLmMKaW5kZXggNzllMjRlOC4uN2Y0MjM1YiAxMDA2NDQKLS0tIGEvaXBjL2lwY19zeXNjdGwuYworKysgYi9pcGMvaXBjX3N5c2N0bC5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pcGNfbmFtZXNwYWNlLmg+CiAKIHN0YXRpYyB2b2lkICpnZXRfaXBjKGN0bF90YWJsZSAqdGFibGUpCiB7CmRpZmYgLS1naXQgYS9pcGMvbXF1ZXVlLmMgYi9pcGMvbXF1ZXVlLmMKaW5kZXggNmNhN2I5Ny4uNjBmN2EyNyAxMDA2NDQKLS0tIGEvaXBjL21xdWV1ZS5jCisrKyBiL2lwYy9tcXVldWUuYwpAQCAtMzMyLDggKzMzMiw3IEBACiAJCQkoaW5mby0+bm90aWZ5X293bmVyICYmCiAJCQkgaW5mby0+bm90aWZ5LnNpZ2V2X25vdGlmeSA9PSBTSUdFVl9TSUdOQUwpID8KIAkJCQlpbmZvLT5ub3RpZnkuc2lnZXZfc2lnbm8gOiAwLAotCQkJcGlkX25yX25zKGluZm8tPm5vdGlmeV9vd25lciwKLQkJCQljdXJyZW50LT5uc3Byb3h5LT5waWRfbnMpKTsKKwkJCXBpZF92bnIoaW5mby0+bm90aWZ5X293bmVyKSk7CiAJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwogCWJ1ZmZlcltzaXplb2YoYnVmZmVyKS0xXSA9ICdcMCc7CiAJc2xlbiA9IHN0cmxlbihidWZmZXIpKzE7CkBAIC01MTAsNyArNTA5LDcgQEAKIAkJCXNpZ19pLnNpX2Vycm5vID0gMDsKIAkJCXNpZ19pLnNpX2NvZGUgPSBTSV9NRVNHUTsKIAkJCXNpZ19pLnNpX3ZhbHVlID0gaW5mby0+bm90aWZ5LnNpZ2V2X3ZhbHVlOwotCQkJc2lnX2kuc2lfcGlkID0gdGFza19waWRfdm5yKGN1cnJlbnQpOworCQkJc2lnX2kuc2lfcGlkID0gdGFza190Z2lkX3ZucihjdXJyZW50KTsKIAkJCXNpZ19pLnNpX3VpZCA9IGN1cnJlbnQtPnVpZDsKIAogCQkJa2lsbF9waWRfaW5mbyhpbmZvLT5ub3RpZnkuc2lnZXZfc2lnbm8sCmRpZmYgLS1naXQgYS9pcGMvbXNnLmMgYi9pcGMvbXNnLmMKaW5kZXggZWMwYzcyNC4uNDY1ODVhMCAxMDA2NDQKLS0tIGEvaXBjL21zZy5jCisrKyBiL2lwYy9tc2cuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KICNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CisjaW5jbHVkZSA8bGludXgvaXBjX25hbWVzcGFjZS5oPgogCiAjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNjYsNzIgKzY3LDM3IEBACiAjZGVmaW5lIFNFQVJDSF9OT1RFUVVBTAkJMwogI2RlZmluZSBTRUFSQ0hfTEVTU0VRVUFMCTQKIAotc3RhdGljIHN0cnVjdCBpcGNfaWRzIGluaXRfbXNnX2lkczsKLQotI2RlZmluZSBtc2dfaWRzKG5zKQkoKigobnMpLT5pZHNbSVBDX01TR19JRFNdKSkKKyNkZWZpbmUgbXNnX2lkcyhucykJKChucyktPmlkc1tJUENfTVNHX0lEU10pCiAKICNkZWZpbmUgbXNnX3VubG9jayhtc3EpCQlpcGNfdW5sb2NrKCYobXNxKS0+cV9wZXJtKQogI2RlZmluZSBtc2dfYnVpbGRpZChpZCwgc2VxKQlpcGNfYnVpbGRpZChpZCwgc2VxKQogCi1zdGF0aWMgdm9pZCBmcmVlcXVlKHN0cnVjdCBpcGNfbmFtZXNwYWNlICosIHN0cnVjdCBtc2dfcXVldWUgKik7CitzdGF0aWMgdm9pZCBmcmVlcXVlKHN0cnVjdCBpcGNfbmFtZXNwYWNlICosIHN0cnVjdCBrZXJuX2lwY19wZXJtICopOwogc3RhdGljIGludCBuZXdxdWUoc3RydWN0IGlwY19uYW1lc3BhY2UgKiwgc3RydWN0IGlwY19wYXJhbXMgKik7CiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIHN0YXRpYyBpbnQgc3lzdmlwY19tc2dfcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqaXQpOwogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIF9fbXNnX2luaXRfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zLCBzdHJ1Y3QgaXBjX2lkcyAqaWRzKQordm9pZCBtc2dfaW5pdF9ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMpCiB7Ci0JbnMtPmlkc1tJUENfTVNHX0lEU10gPSBpZHM7CiAJbnMtPm1zZ19jdGxtYXggPSBNU0dNQVg7CiAJbnMtPm1zZ19jdGxtbmIgPSBNU0dNTkI7CiAJbnMtPm1zZ19jdGxtbmkgPSBNU0dNTkk7CiAJYXRvbWljX3NldCgmbnMtPm1zZ19ieXRlcywgMCk7CiAJYXRvbWljX3NldCgmbnMtPm1zZ19oZHJzLCAwKTsKLQlpcGNfaW5pdF9pZHMoaWRzKTsKKwlpcGNfaW5pdF9pZHMoJm5zLT5pZHNbSVBDX01TR19JRFNdKTsKIH0KIAotaW50IG1zZ19pbml0X25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucykKLXsKLQlzdHJ1Y3QgaXBjX2lkcyAqaWRzOwotCi0JaWRzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwY19pZHMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoaWRzID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JX19tc2dfaW5pdF9ucyhucywgaWRzKTsKLQlyZXR1cm4gMDsKLX0KLQorI2lmZGVmIENPTkZJR19JUENfTlMKIHZvaWQgbXNnX2V4aXRfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKQogewotCXN0cnVjdCBtc2dfcXVldWUgKm1zcTsKLQlzdHJ1Y3Qga2Vybl9pcGNfcGVybSAqcGVybTsKLQlpbnQgbmV4dF9pZDsKLQlpbnQgdG90YWwsIGluX3VzZTsKLQotCWRvd25fd3JpdGUoJm1zZ19pZHMobnMpLnJ3X211dGV4KTsKLQotCWluX3VzZSA9IG1zZ19pZHMobnMpLmluX3VzZTsKLQotCWZvciAodG90YWwgPSAwLCBuZXh0X2lkID0gMDsgdG90YWwgPCBpbl91c2U7IG5leHRfaWQrKykgewotCQlwZXJtID0gaWRyX2ZpbmQoJm1zZ19pZHMobnMpLmlwY3NfaWRyLCBuZXh0X2lkKTsKLQkJaWYgKHBlcm0gPT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCQlpcGNfbG9ja19ieV9wdHIocGVybSk7Ci0JCW1zcSA9IGNvbnRhaW5lcl9vZihwZXJtLCBzdHJ1Y3QgbXNnX3F1ZXVlLCBxX3Blcm0pOwotCQlmcmVlcXVlKG5zLCBtc3EpOwotCQl0b3RhbCsrOwotCX0KLQotCXVwX3dyaXRlKCZtc2dfaWRzKG5zKS5yd19tdXRleCk7Ci0KLQlrZnJlZShucy0+aWRzW0lQQ19NU0dfSURTXSk7Ci0JbnMtPmlkc1tJUENfTVNHX0lEU10gPSBOVUxMOworCWZyZWVfaXBjcyhucywgJm1zZ19pZHMobnMpLCBmcmVlcXVlKTsKIH0KKyNlbmRpZgogCiB2b2lkIF9faW5pdCBtc2dfaW5pdCh2b2lkKQogewotCV9fbXNnX2luaXRfbnMoJmluaXRfaXBjX25zLCAmaW5pdF9tc2dfaWRzKTsKKwltc2dfaW5pdF9ucygmaW5pdF9pcGNfbnMpOwogCWlwY19pbml0X3Byb2NfaW50ZXJmYWNlKCJzeXN2aXBjL21zZyIsCiAJCQkJIiAgICAgICBrZXkgICAgICBtc3FpZCBwZXJtcyAgICAgIGNieXRlcyAgICAgICBxbnVtIGxzcGlkIGxycGlkICAgdWlkICAgZ2lkICBjdWlkICBjZ2lkICAgICAgc3RpbWUgICAgICBydGltZSAgICAgIGN0aW1lXG4iLAogCQkJCUlQQ19NU0dfSURTLCBzeXN2aXBjX21zZ19wcm9jX3Nob3cpOwpAQCAtMjg5LDkgKzI1NSwxMCBAQAogICogbXNnX2lkcy5yd19tdXRleCAod3JpdGVyKSBhbmQgdGhlIHNwaW5sb2NrIGZvciB0aGlzIG1lc3NhZ2UgcXVldWUgYXJlIGhlbGQKICAqIGJlZm9yZSBmcmVlcXVlKCkgaXMgY2FsbGVkLiBtc2dfaWRzLnJ3X211dGV4IHJlbWFpbnMgbG9ja2VkIG9uIGV4aXQuCiAgKi8KLXN0YXRpYyB2b2lkIGZyZWVxdWUoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zLCBzdHJ1Y3QgbXNnX3F1ZXVlICptc3EpCitzdGF0aWMgdm9pZCBmcmVlcXVlKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucywgc3RydWN0IGtlcm5faXBjX3Blcm0gKmlwY3ApCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCXN0cnVjdCBtc2dfcXVldWUgKm1zcSA9IGNvbnRhaW5lcl9vZihpcGNwLCBzdHJ1Y3QgbXNnX3F1ZXVlLCBxX3Blcm0pOwogCiAJZXhwdW5nZV9hbGwobXNxLCAtRUlEUk0pOwogCXNzX3dha2V1cCgmbXNxLT5xX3NlbmRlcnMsIDEpOwpAQCAtNTk3LDcgKzU2NCw3IEBACiAJCWJyZWFrOwogCX0KIAljYXNlIElQQ19STUlEOgotCQlmcmVlcXVlKG5zLCBtc3EpOworCQlmcmVlcXVlKG5zLCAmbXNxLT5xX3Blcm0pOwogCQlicmVhazsKIAl9CiAJZXJyID0gMDsKZGlmZiAtLWdpdCBhL2lwYy9uYW1lc3BhY2UuYyBiL2lwYy9uYW1lc3BhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjk2NzY1Ci0tLSAvZGV2L251bGwKKysrIGIvaXBjL25hbWVzcGFjZS5jCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBsaW51eC9pcGMvbmFtZXNwYWNlLmMKKyAqIENvcHlyaWdodCAoQykgMjAwNiBQYXZlbCBFbWVseWFub3YgPHhlbXVsQG9wZW52ei5vcmc+IE9wZW5WWiwgU1dzb2Z0IEluYy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaXBjLmg+CisjaW5jbHVkZSA8bGludXgvbXNnLmg+CisjaW5jbHVkZSA8bGludXgvaXBjX25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgInV0aWwuaCIKKworc3RhdGljIHN0cnVjdCBpcGNfbmFtZXNwYWNlICpjbG9uZV9pcGNfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm9sZF9ucykKK3sKKwlzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnM7CisKKwlucyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcGNfbmFtZXNwYWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKG5zID09IE5VTEwpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJc2VtX2luaXRfbnMobnMpOworCW1zZ19pbml0X25zKG5zKTsKKwlzaG1faW5pdF9ucyhucyk7CisKKwlrcmVmX2luaXQoJm5zLT5rcmVmKTsKKwlyZXR1cm4gbnM7Cit9CisKK3N0cnVjdCBpcGNfbmFtZXNwYWNlICpjb3B5X2lwY3ModW5zaWduZWQgbG9uZyBmbGFncywgc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKQoreworCXN0cnVjdCBpcGNfbmFtZXNwYWNlICpuZXdfbnM7CisKKwlCVUdfT04oIW5zKTsKKwlnZXRfaXBjX25zKG5zKTsKKworCWlmICghKGZsYWdzICYgQ0xPTkVfTkVXSVBDKSkKKwkJcmV0dXJuIG5zOworCisJbmV3X25zID0gY2xvbmVfaXBjX25zKG5zKTsKKworCXB1dF9pcGNfbnMobnMpOworCXJldHVybiBuZXdfbnM7Cit9CisKKy8qCisgKiBmcmVlX2lwY3MgLSBmcmVlIGFsbCBpcGNzIG9mIG9uZSB0eXBlCisgKiBAbnM6ICAgdGhlIG5hbWVzcGFjZSB0byByZW1vdmUgdGhlIGlwY3MgZnJvbQorICogQGlkczogIHRoZSB0YWJsZSBvZiBpcGNzIHRvIGZyZWUKKyAqIEBmcmVlOiB0aGUgZnVuY3Rpb24gY2FsbGVkIHRvIGZyZWUgZWFjaCBpbmRpdmlkdWFsIGlwYworICoKKyAqIENhbGxlZCBmb3IgZWFjaCBraW5kIG9mIGlwYyB3aGVuIGFuIGlwY19uYW1lc3BhY2UgZXhpdHMuCisgKi8KK3ZvaWQgZnJlZV9pcGNzKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucywgc3RydWN0IGlwY19pZHMgKmlkcywKKwkgICAgICAgdm9pZCAoKmZyZWUpKHN0cnVjdCBpcGNfbmFtZXNwYWNlICosIHN0cnVjdCBrZXJuX2lwY19wZXJtICopKQoreworCXN0cnVjdCBrZXJuX2lwY19wZXJtICpwZXJtOworCWludCBuZXh0X2lkOworCWludCB0b3RhbCwgaW5fdXNlOworCisJZG93bl93cml0ZSgmaWRzLT5yd19tdXRleCk7CisKKwlpbl91c2UgPSBpZHMtPmluX3VzZTsKKworCWZvciAodG90YWwgPSAwLCBuZXh0X2lkID0gMDsgdG90YWwgPCBpbl91c2U7IG5leHRfaWQrKykgeworCQlwZXJtID0gaWRyX2ZpbmQoJmlkcy0+aXBjc19pZHIsIG5leHRfaWQpOworCQlpZiAocGVybSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWlwY19sb2NrX2J5X3B0cihwZXJtKTsKKwkJZnJlZShucywgcGVybSk7CisJCXRvdGFsKys7CisJfQorCXVwX3dyaXRlKCZpZHMtPnJ3X211dGV4KTsKK30KKwordm9pZCBmcmVlX2lwY19ucyhzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnM7CisKKwlucyA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgaXBjX25hbWVzcGFjZSwga3JlZik7CisJc2VtX2V4aXRfbnMobnMpOworCW1zZ19leGl0X25zKG5zKTsKKwlzaG1fZXhpdF9ucyhucyk7CisJa2ZyZWUobnMpOworfQpkaWZmIC0tZ2l0IGEvaXBjL3NlbS5jIGIvaXBjL3NlbS5jCmluZGV4IGQ2NWUyODUuLjBiNDVhNGQgMTAwNjQ0Ci0tLSBhL2lwYy9zZW0uYworKysgYi9pcGMvc2VtLmMKQEAgLTgyLDIwICs4MiwxOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KICNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CisjaW5jbHVkZSA8bGludXgvaXBjX25hbWVzcGFjZS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlICJ1dGlsLmgiCiAKLSNkZWZpbmUgc2VtX2lkcyhucykJKCooKG5zKS0+aWRzW0lQQ19TRU1fSURTXSkpCisjZGVmaW5lIHNlbV9pZHMobnMpCSgobnMpLT5pZHNbSVBDX1NFTV9JRFNdKQogCiAjZGVmaW5lIHNlbV91bmxvY2soc21hKQkJaXBjX3VubG9jaygmKHNtYSktPnNlbV9wZXJtKQogI2RlZmluZSBzZW1fY2hlY2tpZChzbWEsIHNlbWlkKQlpcGNfY2hlY2tpZCgmc21hLT5zZW1fcGVybSwgc2VtaWQpCiAjZGVmaW5lIHNlbV9idWlsZGlkKGlkLCBzZXEpCWlwY19idWlsZGlkKGlkLCBzZXEpCiAKLXN0YXRpYyBzdHJ1Y3QgaXBjX2lkcyBpbml0X3NlbV9pZHM7Ci0KIHN0YXRpYyBpbnQgbmV3YXJ5KHN0cnVjdCBpcGNfbmFtZXNwYWNlICosIHN0cnVjdCBpcGNfcGFyYW1zICopOwotc3RhdGljIHZvaWQgZnJlZWFyeShzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqLCBzdHJ1Y3Qgc2VtX2FycmF5ICopOworc3RhdGljIHZvaWQgZnJlZWFyeShzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqLCBzdHJ1Y3Qga2Vybl9pcGNfcGVybSAqKTsKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogc3RhdGljIGludCBzeXN2aXBjX3NlbV9wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICppdCk7CiAjZW5kaWYKQEAgLTExNyw1OCArMTE2LDI2IEBACiAjZGVmaW5lIHNjX3NlbW9wbQlzZW1fY3Rsc1syXQogI2RlZmluZSBzY19zZW1tbmkJc2VtX2N0bHNbM10KIAotc3RhdGljIHZvaWQgX19zZW1faW5pdF9ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMsIHN0cnVjdCBpcGNfaWRzICppZHMpCit2b2lkIHNlbV9pbml0X25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucykKIHsKLQlucy0+aWRzW0lQQ19TRU1fSURTXSA9IGlkczsKIAlucy0+c2Nfc2VtbXNsID0gU0VNTVNMOwogCW5zLT5zY19zZW1tbnMgPSBTRU1NTlM7CiAJbnMtPnNjX3NlbW9wbSA9IFNFTU9QTTsKIAlucy0+c2Nfc2VtbW5pID0gU0VNTU5JOwogCW5zLT51c2VkX3NlbXMgPSAwOwotCWlwY19pbml0X2lkcyhpZHMpOworCWlwY19pbml0X2lkcygmbnMtPmlkc1tJUENfU0VNX0lEU10pOwogfQogCi1pbnQgc2VtX2luaXRfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKQotewotCXN0cnVjdCBpcGNfaWRzICppZHM7Ci0KLQlpZHMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXBjX2lkcyksIEdGUF9LRVJORUwpOwotCWlmIChpZHMgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlfX3NlbV9pbml0X25zKG5zLCBpZHMpOwotCXJldHVybiAwOwotfQotCisjaWZkZWYgQ09ORklHX0lQQ19OUwogdm9pZCBzZW1fZXhpdF9ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMpCiB7Ci0Jc3RydWN0IHNlbV9hcnJheSAqc21hOwotCXN0cnVjdCBrZXJuX2lwY19wZXJtICpwZXJtOwotCWludCBuZXh0X2lkOwotCWludCB0b3RhbCwgaW5fdXNlOwotCi0JZG93bl93cml0ZSgmc2VtX2lkcyhucykucndfbXV0ZXgpOwotCi0JaW5fdXNlID0gc2VtX2lkcyhucykuaW5fdXNlOwotCi0JZm9yICh0b3RhbCA9IDAsIG5leHRfaWQgPSAwOyB0b3RhbCA8IGluX3VzZTsgbmV4dF9pZCsrKSB7Ci0JCXBlcm0gPSBpZHJfZmluZCgmc2VtX2lkcyhucykuaXBjc19pZHIsIG5leHRfaWQpOwotCQlpZiAocGVybSA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCWlwY19sb2NrX2J5X3B0cihwZXJtKTsKLQkJc21hID0gY29udGFpbmVyX29mKHBlcm0sIHN0cnVjdCBzZW1fYXJyYXksIHNlbV9wZXJtKTsKLQkJZnJlZWFyeShucywgc21hKTsKLQkJdG90YWwrKzsKLQl9Ci0JdXBfd3JpdGUoJnNlbV9pZHMobnMpLnJ3X211dGV4KTsKLQotCWtmcmVlKG5zLT5pZHNbSVBDX1NFTV9JRFNdKTsKLQlucy0+aWRzW0lQQ19TRU1fSURTXSA9IE5VTEw7CisJZnJlZV9pcGNzKG5zLCAmc2VtX2lkcyhucyksIGZyZWVhcnkpOwogfQorI2VuZGlmCiAKIHZvaWQgX19pbml0IHNlbV9pbml0ICh2b2lkKQogewotCV9fc2VtX2luaXRfbnMoJmluaXRfaXBjX25zLCAmaW5pdF9zZW1faWRzKTsKKwlzZW1faW5pdF9ucygmaW5pdF9pcGNfbnMpOwogCWlwY19pbml0X3Byb2NfaW50ZXJmYWNlKCJzeXN2aXBjL3NlbSIsCiAJCQkJIiAgICAgICBrZXkgICAgICBzZW1pZCBwZXJtcyAgICAgIG5zZW1zICAgdWlkICAgZ2lkICBjdWlkICBjZ2lkICAgICAgb3RpbWUgICAgICBjdGltZVxuIiwKIAkJCQlJUENfU0VNX0lEUywgc3lzdmlwY19zZW1fcHJvY19zaG93KTsKQEAgLTU1NywxMCArNTI0LDExIEBACiAgKiBhcyBhIHdyaXRlciBhbmQgdGhlIHNwaW5sb2NrIGZvciB0aGlzIHNlbWFwaG9yZSBzZXQgaG9sZC4gc2VtX2lkcy5yd19tdXRleAogICogcmVtYWlucyBsb2NrZWQgb24gZXhpdC4KICAqLwotc3RhdGljIHZvaWQgZnJlZWFyeShzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMsIHN0cnVjdCBzZW1fYXJyYXkgKnNtYSkKK3N0YXRpYyB2b2lkIGZyZWVhcnkoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zLCBzdHJ1Y3Qga2Vybl9pcGNfcGVybSAqaXBjcCkKIHsKIAlzdHJ1Y3Qgc2VtX3VuZG8gKnVuOwogCXN0cnVjdCBzZW1fcXVldWUgKnE7CisJc3RydWN0IHNlbV9hcnJheSAqc21hID0gY29udGFpbmVyX29mKGlwY3AsIHN0cnVjdCBzZW1fYXJyYXksIHNlbV9wZXJtKTsKIAogCS8qIEludmFsaWRhdGUgdGhlIGV4aXN0aW5nIHVuZG8gc3RydWN0dXJlcyBmb3IgdGhpcyBzZW1hcGhvcmUgc2V0LgogCSAqIChUaGV5IHdpbGwgYmUgZnJlZWQgd2l0aG91dCBhbnkgZnVydGhlciBhY3Rpb24gaW4gZXhpdF9zZW0oKQpAQCAtNjE0LDggKzU4Miw4IEBACiAJfQogfQogCi1zdGF0aWMgaW50IHNlbWN0bF9ub2xvY2soc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zLCBpbnQgc2VtaWQsIGludCBzZW1udW0sCi0JCWludCBjbWQsIGludCB2ZXJzaW9uLCB1bmlvbiBzZW11biBhcmcpCitzdGF0aWMgaW50IHNlbWN0bF9ub2xvY2soc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zLCBpbnQgc2VtaWQsCisJCQkgaW50IGNtZCwgaW50IHZlcnNpb24sIHVuaW9uIHNlbXVuIGFyZykKIHsKIAlpbnQgZXJyID0gLUVJTlZBTDsKIAlzdHJ1Y3Qgc2VtX2FycmF5ICpzbWE7CkBAIC02NTQsMTQgKzYyMiwyMyBAQAogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXJldHVybiAobWF4X2lkIDwgMCkgPyAwOiBtYXhfaWQ7CiAJfQorCWNhc2UgSVBDX1NUQVQ6CiAJY2FzZSBTRU1fU1RBVDoKIAl7CiAJCXN0cnVjdCBzZW1pZDY0X2RzIHRidWY7CiAJCWludCBpZDsKIAotCQlzbWEgPSBzZW1fbG9jayhucywgc2VtaWQpOwotCQlpZiAoSVNfRVJSKHNtYSkpCi0JCQlyZXR1cm4gUFRSX0VSUihzbWEpOworCQlpZiAoY21kID09IFNFTV9TVEFUKSB7CisJCQlzbWEgPSBzZW1fbG9jayhucywgc2VtaWQpOworCQkJaWYgKElTX0VSUihzbWEpKQorCQkJCXJldHVybiBQVFJfRVJSKHNtYSk7CisJCQlpZCA9IHNtYS0+c2VtX3Blcm0uaWQ7CisJCX0gZWxzZSB7CisJCQlzbWEgPSBzZW1fbG9ja19jaGVjayhucywgc2VtaWQpOworCQkJaWYgKElTX0VSUihzbWEpKQorCQkJCXJldHVybiBQVFJfRVJSKHNtYSk7CisJCQlpZCA9IDA7CisJCX0KIAogCQllcnIgPSAtRUFDQ0VTOwogCQlpZiAoaXBjcGVybXMgKCZzbWEtPnNlbV9wZXJtLCBTX0lSVUdPKSkKQEAgLTY3MSw4ICs2NDgsNiBAQAogCQlpZiAoZXJyKQogCQkJZ290byBvdXRfdW5sb2NrOwogCi0JCWlkID0gc21hLT5zZW1fcGVybS5pZDsKLQogCQltZW1zZXQoJnRidWYsIDAsIHNpemVvZih0YnVmKSk7CiAKIAkJa2VybmVsX3RvX2lwYzY0X3Blcm0oJnNtYS0+c2VtX3Blcm0sICZ0YnVmLnNlbV9wZXJtKTsKQEAgLTgwNywxOSArNzgyLDYgQEAKIAkJZXJyID0gMDsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KLQljYXNlIElQQ19TVEFUOgotCXsKLQkJc3RydWN0IHNlbWlkNjRfZHMgdGJ1ZjsKLQkJbWVtc2V0KCZ0YnVmLDAsc2l6ZW9mKHRidWYpKTsKLQkJa2VybmVsX3RvX2lwYzY0X3Blcm0oJnNtYS0+c2VtX3Blcm0sICZ0YnVmLnNlbV9wZXJtKTsKLQkJdGJ1Zi5zZW1fb3RpbWUgID0gc21hLT5zZW1fb3RpbWU7Ci0JCXRidWYuc2VtX2N0aW1lICA9IHNtYS0+c2VtX2N0aW1lOwotCQl0YnVmLnNlbV9uc2VtcyAgPSBzbWEtPnNlbV9uc2VtczsKLQkJc2VtX3VubG9jayhzbWEpOwotCQlpZiAoY29weV9zZW1pZF90b191c2VyIChhcmcuYnVmLCAmdGJ1ZiwgdmVyc2lvbikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJcmV0dXJuIDA7Ci0JfQogCS8qIEdFVFZBTCwgR0VUUElELCBHRVROQ1ROLCBHRVRaQ05ULCBTRVRWQUw6IGZhbGwtdGhyb3VnaCAqLwogCX0KIAllcnIgPSAtRUlOVkFMOwpAQCAtOTQ3LDcgKzkwOSw3IEBACiAKIAlzd2l0Y2goY21kKXsKIAljYXNlIElQQ19STUlEOgotCQlmcmVlYXJ5KG5zLCBzbWEpOworCQlmcmVlYXJ5KG5zLCBpcGNwKTsKIAkJZXJyID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBJUENfU0VUOgpAQCAtOTg2LDE1ICs5NDgsMTUgQEAKIAlzd2l0Y2goY21kKSB7CiAJY2FzZSBJUENfSU5GTzoKIAljYXNlIFNFTV9JTkZPOgorCWNhc2UgSVBDX1NUQVQ6CiAJY2FzZSBTRU1fU1RBVDoKLQkJZXJyID0gc2VtY3RsX25vbG9jayhucyxzZW1pZCxzZW1udW0sY21kLHZlcnNpb24sYXJnKTsKKwkJZXJyID0gc2VtY3RsX25vbG9jayhucywgc2VtaWQsIGNtZCwgdmVyc2lvbiwgYXJnKTsKIAkJcmV0dXJuIGVycjsKIAljYXNlIEdFVEFMTDoKIAljYXNlIEdFVFZBTDoKIAljYXNlIEdFVFBJRDoKIAljYXNlIEdFVE5DTlQ6CiAJY2FzZSBHRVRaQ05UOgotCWNhc2UgSVBDX1NUQVQ6CiAJY2FzZSBTRVRWQUw6CiAJY2FzZSBTRVRBTEw6CiAJCWVyciA9IHNlbWN0bF9tYWluKG5zLHNlbWlkLHNlbW51bSxjbWQsdmVyc2lvbixhcmcpOwpkaWZmIC0tZ2l0IGEvaXBjL3NobS5jIGIvaXBjL3NobS5jCmluZGV4IDY1YzNhMjkuLmM0N2U4NzIgMTAwNjQ0Ci0tLSBhL2lwYy9zaG0uYworKysgYi9pcGMvc2htLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgogI2luY2x1ZGUgPGxpbnV4L25zcHJveHkuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwY19uYW1lc3BhY2UuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTU1LDkgKzU2LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNobV9maWxlX29wZXJhdGlvbnM7CiBzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHNobV92bV9vcHM7CiAKLXN0YXRpYyBzdHJ1Y3QgaXBjX2lkcyBpbml0X3NobV9pZHM7Ci0KLSNkZWZpbmUgc2htX2lkcyhucykJKCooKG5zKS0+aWRzW0lQQ19TSE1fSURTXSkpCisjZGVmaW5lIHNobV9pZHMobnMpCSgobnMpLT5pZHNbSVBDX1NITV9JRFNdKQogCiAjZGVmaW5lIHNobV91bmxvY2soc2hwKQkJCVwKIAlpcGNfdW5sb2NrKCYoc2hwKS0+c2htX3Blcm0pCkBAIC03MSwyMiArNzAsMjQgQEAKIHN0YXRpYyBpbnQgc3lzdmlwY19zaG1fcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqaXQpOwogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIF9fc2htX2luaXRfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zLCBzdHJ1Y3QgaXBjX2lkcyAqaWRzKQordm9pZCBzaG1faW5pdF9ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMpCiB7Ci0JbnMtPmlkc1tJUENfU0hNX0lEU10gPSBpZHM7CiAJbnMtPnNobV9jdGxtYXggPSBTSE1NQVg7CiAJbnMtPnNobV9jdGxhbGwgPSBTSE1BTEw7CiAJbnMtPnNobV9jdGxtbmkgPSBTSE1NTkk7CiAJbnMtPnNobV90b3QgPSAwOwotCWlwY19pbml0X2lkcyhpZHMpOworCWlwY19pbml0X2lkcygmbnMtPmlkc1tJUENfU0hNX0lEU10pOwogfQogCiAvKgogICogQ2FsbGVkIHdpdGggc2htX2lkcy5yd19tdXRleCAod3JpdGVyKSBhbmQgdGhlIHNocCBzdHJ1Y3R1cmUgbG9ja2VkLgogICogT25seSBzaG1faWRzLnJ3X211dGV4IHJlbWFpbnMgbG9ja2VkIG9uIGV4aXQuCiAgKi8KLXN0YXRpYyB2b2lkIGRvX3NobV9ybWlkKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucywgc3RydWN0IHNobWlkX2tlcm5lbCAqc2hwKQorc3RhdGljIHZvaWQgZG9fc2htX3JtaWQoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zLCBzdHJ1Y3Qga2Vybl9pcGNfcGVybSAqaXBjcCkKIHsKKwlzdHJ1Y3Qgc2htaWRfa2VybmVsICpzaHA7CisJc2hwID0gY29udGFpbmVyX29mKGlwY3AsIHN0cnVjdCBzaG1pZF9rZXJuZWwsIHNobV9wZXJtKTsKKwogCWlmIChzaHAtPnNobV9uYXR0Y2gpewogCQlzaHAtPnNobV9wZXJtLm1vZGUgfD0gU0hNX0RFU1Q7CiAJCS8qIERvIG5vdCBmaW5kIGl0IGFueSBtb3JlICovCkBAIC05Niw0NyArOTcsMTYgQEAKIAkJc2htX2Rlc3Ryb3kobnMsIHNocCk7CiB9CiAKLWludCBzaG1faW5pdF9ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMpCi17Ci0Jc3RydWN0IGlwY19pZHMgKmlkczsKLQotCWlkcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcGNfaWRzKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGlkcyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCV9fc2htX2luaXRfbnMobnMsIGlkcyk7Ci0JcmV0dXJuIDA7Ci19Ci0KKyNpZmRlZiBDT05GSUdfSVBDX05TCiB2b2lkIHNobV9leGl0X25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucykKIHsKLQlzdHJ1Y3Qgc2htaWRfa2VybmVsICpzaHA7Ci0Jc3RydWN0IGtlcm5faXBjX3Blcm0gKnBlcm07Ci0JaW50IG5leHRfaWQ7Ci0JaW50IHRvdGFsLCBpbl91c2U7Ci0KLQlkb3duX3dyaXRlKCZzaG1faWRzKG5zKS5yd19tdXRleCk7Ci0KLQlpbl91c2UgPSBzaG1faWRzKG5zKS5pbl91c2U7Ci0KLQlmb3IgKHRvdGFsID0gMCwgbmV4dF9pZCA9IDA7IHRvdGFsIDwgaW5fdXNlOyBuZXh0X2lkKyspIHsKLQkJcGVybSA9IGlkcl9maW5kKCZzaG1faWRzKG5zKS5pcGNzX2lkciwgbmV4dF9pZCk7Ci0JCWlmIChwZXJtID09IE5VTEwpCi0JCQljb250aW51ZTsKLQkJaXBjX2xvY2tfYnlfcHRyKHBlcm0pOwotCQlzaHAgPSBjb250YWluZXJfb2YocGVybSwgc3RydWN0IHNobWlkX2tlcm5lbCwgc2htX3Blcm0pOwotCQlkb19zaG1fcm1pZChucywgc2hwKTsKLQkJdG90YWwrKzsKLQl9Ci0JdXBfd3JpdGUoJnNobV9pZHMobnMpLnJ3X211dGV4KTsKLQotCWtmcmVlKG5zLT5pZHNbSVBDX1NITV9JRFNdKTsKLQlucy0+aWRzW0lQQ19TSE1fSURTXSA9IE5VTEw7CisJZnJlZV9pcGNzKG5zLCAmc2htX2lkcyhucyksIGRvX3NobV9ybWlkKTsKIH0KKyNlbmRpZgogCiB2b2lkIF9faW5pdCBzaG1faW5pdCAodm9pZCkKIHsKLQlfX3NobV9pbml0X25zKCZpbml0X2lwY19ucywgJmluaXRfc2htX2lkcyk7CisJc2htX2luaXRfbnMoJmluaXRfaXBjX25zKTsKIAlpcGNfaW5pdF9wcm9jX2ludGVyZmFjZSgic3lzdmlwYy9zaG0iLAogCQkJCSIgICAgICAga2V5ICAgICAgc2htaWQgcGVybXMgICAgICAgc2l6ZSAgY3BpZCAgbHBpZCBuYXR0Y2ggICB1aWQgICBnaWQgIGN1aWQgIGNnaWQgICAgICBhdGltZSAgICAgIGR0aW1lICAgICAgY3RpbWVcbiIsCiAJCQkJSVBDX1NITV9JRFMsIHN5c3ZpcGNfc2htX3Byb2Nfc2hvdyk7CkBAIC04NDcsNyArODE3LDcgQEAKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0X3VubG9ja191cDsKIAotCQlkb19zaG1fcm1pZChucywgc2hwKTsKKwkJZG9fc2htX3JtaWQobnMsICZzaHAtPnNobV9wZXJtKTsKIAkJdXBfd3JpdGUoJnNobV9pZHMobnMpLnJ3X211dGV4KTsKIAkJZ290byBvdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvaXBjL3V0aWwuYyBiL2lwYy91dGlsLmMKaW5kZXggNzZjMWYzNC4uZmQxYjUwZCAxMDA2NDQKLS0tIGEvaXBjL3V0aWwuYworKysgYi9pcGMvdXRpbC5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KICNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CiAjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pcGNfbmFtZXNwYWNlLmg+CiAKICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAKQEAgLTUxLDY2ICs1Miw2IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqY2xvbmVfaXBjX25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpvbGRfbnMpCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnM7Ci0KLQllcnIgPSAtRU5PTUVNOwotCW5zID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwY19uYW1lc3BhY2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAobnMgPT0gTlVMTCkKLQkJZ290byBlcnJfbWVtOwotCi0JZXJyID0gc2VtX2luaXRfbnMobnMpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX3NlbTsKLQllcnIgPSBtc2dfaW5pdF9ucyhucyk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfbXNnOwotCWVyciA9IHNobV9pbml0X25zKG5zKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9zaG07Ci0KLQlrcmVmX2luaXQoJm5zLT5rcmVmKTsKLQlyZXR1cm4gbnM7Ci0KLWVycl9zaG06Ci0JbXNnX2V4aXRfbnMobnMpOwotZXJyX21zZzoKLQlzZW1fZXhpdF9ucyhucyk7Ci1lcnJfc2VtOgotCWtmcmVlKG5zKTsKLWVycl9tZW06Ci0JcmV0dXJuIEVSUl9QVFIoZXJyKTsKLX0KLQotc3RydWN0IGlwY19uYW1lc3BhY2UgKmNvcHlfaXBjcyh1bnNpZ25lZCBsb25nIGZsYWdzLCBzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMpCi17Ci0Jc3RydWN0IGlwY19uYW1lc3BhY2UgKm5ld19uczsKLQotCUJVR19PTighbnMpOwotCWdldF9pcGNfbnMobnMpOwotCi0JaWYgKCEoZmxhZ3MgJiBDTE9ORV9ORVdJUEMpKQotCQlyZXR1cm4gbnM7Ci0KLQluZXdfbnMgPSBjbG9uZV9pcGNfbnMobnMpOwotCi0JcHV0X2lwY19ucyhucyk7Ci0JcmV0dXJuIG5ld19uczsKLX0KLQotdm9pZCBmcmVlX2lwY19ucyhzdHJ1Y3Qga3JlZiAqa3JlZikKLXsKLQlzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnM7Ci0KLQlucyA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgaXBjX25hbWVzcGFjZSwga3JlZik7Ci0Jc2VtX2V4aXRfbnMobnMpOwotCW1zZ19leGl0X25zKG5zKTsKLQlzaG1fZXhpdF9ucyhucyk7Ci0Ja2ZyZWUobnMpOwotfQotCiAvKioKICAqCWlwY19pbml0CS0JaW5pdGlhbGlzZSBJUEMgc3Vic3lzdGVtCiAgKgpAQCAtMzA3LDcgKzI0OCw3IEBACiAgKglUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHN5c19tc2dnZXQsIHN5c19zZW1nZXQoKSBhbmQgc3lzX3NobWdldCgpCiAgKgl3aGVuIHRoZSBrZXkgaXMgSVBDX1BSSVZBVEUuCiAgKi8KLWludCBpcGNnZXRfbmV3KHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucywgc3RydWN0IGlwY19pZHMgKmlkcywKK3N0YXRpYyBpbnQgaXBjZ2V0X25ldyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMsIHN0cnVjdCBpcGNfaWRzICppZHMsCiAJCXN0cnVjdCBpcGNfb3BzICpvcHMsIHN0cnVjdCBpcGNfcGFyYW1zICpwYXJhbXMpCiB7CiAJaW50IGVycjsKQEAgLTM3MSw3ICszMTIsNyBAQAogICoKICAqCU9uIHN1Y2Nlc3MsIHRoZSBpcGMgaWQgaXMgcmV0dXJuZWQuCiAgKi8KLWludCBpcGNnZXRfcHVibGljKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucywgc3RydWN0IGlwY19pZHMgKmlkcywKK3N0YXRpYyBpbnQgaXBjZ2V0X3B1YmxpYyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMsIHN0cnVjdCBpcGNfaWRzICppZHMsCiAJCXN0cnVjdCBpcGNfb3BzICpvcHMsIHN0cnVjdCBpcGNfcGFyYW1zICpwYXJhbXMpCiB7CiAJc3RydWN0IGtlcm5faXBjX3Blcm0gKmlwY3A7CkBAIC03NjksNiArNzEwLDU3IEBACiAJcmV0dXJuIG91dDsKIH0KIAorc3RydWN0IGtlcm5faXBjX3Blcm0gKmlwY19sb2NrX2NoZWNrX2Rvd24oc3RydWN0IGlwY19pZHMgKmlkcywgaW50IGlkKQoreworCXN0cnVjdCBrZXJuX2lwY19wZXJtICpvdXQ7CisKKwlvdXQgPSBpcGNfbG9ja19kb3duKGlkcywgaWQpOworCWlmIChJU19FUlIob3V0KSkKKwkJcmV0dXJuIG91dDsKKworCWlmIChpcGNfY2hlY2tpZChvdXQsIGlkKSkgeworCQlpcGNfdW5sb2NrKG91dCk7CisJCXJldHVybiBFUlJfUFRSKC1FSURSTSk7CisJfQorCisJcmV0dXJuIG91dDsKK30KKworc3RydWN0IGtlcm5faXBjX3Blcm0gKmlwY19sb2NrX2NoZWNrKHN0cnVjdCBpcGNfaWRzICppZHMsIGludCBpZCkKK3sKKwlzdHJ1Y3Qga2Vybl9pcGNfcGVybSAqb3V0OworCisJb3V0ID0gaXBjX2xvY2soaWRzLCBpZCk7CisJaWYgKElTX0VSUihvdXQpKQorCQlyZXR1cm4gb3V0OworCisJaWYgKGlwY19jaGVja2lkKG91dCwgaWQpKSB7CisJCWlwY191bmxvY2sob3V0KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJRFJNKTsKKwl9CisKKwlyZXR1cm4gb3V0OworfQorCisvKioKKyAqIGlwY2dldCAtIENvbW1vbiBzeXNfKmdldCgpIGNvZGUKKyAqIEBucyA6IG5hbXNlcGFjZQorICogQGlkcyA6IElQQyBpZGVudGlmaWVyIHNldAorICogQG9wcyA6IG9wZXJhdGlvbnMgdG8gYmUgY2FsbGVkIG9uIGlwYyBvYmplY3QgY3JlYXRpb24sIHBlcm1pc3Npb24gY2hlY2tzCisgKiAgICAgICAgYW5kIGZ1cnRoZXIgY2hlY2tzCisgKiBAcGFyYW1zIDogdGhlIHBhcmFtZXRlcnMgbmVlZGVkIGJ5IHRoZSBwcmV2aW91cyBvcGVyYXRpb25zLgorICoKKyAqIENvbW1vbiByb3V0aW5lIGNhbGxlZCBieSBzeXNfbXNnZ2V0KCksIHN5c19zZW1nZXQoKSBhbmQgc3lzX3NobWdldCgpLgorICovCitpbnQgaXBjZ2V0KHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucywgc3RydWN0IGlwY19pZHMgKmlkcywKKwkJCXN0cnVjdCBpcGNfb3BzICpvcHMsIHN0cnVjdCBpcGNfcGFyYW1zICpwYXJhbXMpCit7CisJaWYgKHBhcmFtcy0+a2V5ID09IElQQ19QUklWQVRFKQorCQlyZXR1cm4gaXBjZ2V0X25ldyhucywgaWRzLCBvcHMsIHBhcmFtcyk7CisJZWxzZQorCQlyZXR1cm4gaXBjZ2V0X3B1YmxpYyhucywgaWRzLCBvcHMsIHBhcmFtcyk7Cit9CisKICNpZmRlZiBfX0FSQ0hfV0FOVF9JUENfUEFSU0VfVkVSU0lPTgogCiAKQEAgLTg0MSw3ICs4MzMsNyBAQAogCWlmIChpcGMgJiYgaXBjICE9IFNFUV9TVEFSVF9UT0tFTikKIAkJaXBjX3VubG9jayhpcGMpOwogCi0JcmV0dXJuIHN5c3ZpcGNfZmluZF9pcGMoaXRlci0+bnMtPmlkc1tpZmFjZS0+aWRzXSwgKnBvcywgcG9zKTsKKwlyZXR1cm4gc3lzdmlwY19maW5kX2lwYygmaXRlci0+bnMtPmlkc1tpZmFjZS0+aWRzXSwgKnBvcywgcG9zKTsKIH0KIAogLyoKQEAgLTg1NCw3ICs4NDYsNyBAQAogCXN0cnVjdCBpcGNfcHJvY19pZmFjZSAqaWZhY2UgPSBpdGVyLT5pZmFjZTsKIAlzdHJ1Y3QgaXBjX2lkcyAqaWRzOwogCi0JaWRzID0gaXRlci0+bnMtPmlkc1tpZmFjZS0+aWRzXTsKKwlpZHMgPSAmaXRlci0+bnMtPmlkc1tpZmFjZS0+aWRzXTsKIAogCS8qCiAJICogVGFrZSB0aGUgbG9jayAtIHRoaXMgd2lsbCBiZSByZWxlYXNlZCBieSB0aGUgY29ycmVzcG9uZGluZwpAQCAtODg1LDcgKzg3Nyw3IEBACiAJaWYgKGlwYyAmJiBpcGMgIT0gU0VRX1NUQVJUX1RPS0VOKQogCQlpcGNfdW5sb2NrKGlwYyk7CiAKLQlpZHMgPSBpdGVyLT5ucy0+aWRzW2lmYWNlLT5pZHNdOworCWlkcyA9ICZpdGVyLT5ucy0+aWRzW2lmYWNlLT5pZHNdOwogCS8qIFJlbGVhc2UgdGhlIGxvY2sgd2UgdG9vayBpbiBzdGFydCgpICovCiAJdXBfcmVhZCgmaWRzLT5yd19tdXRleCk7CiB9CmRpZmYgLS1naXQgYS9pcGMvdXRpbC5oIGIvaXBjL3V0aWwuaAppbmRleCA5ZmZlYTQwLi5mMzdkMTYwIDEwMDY0NAotLS0gYS9pcGMvdXRpbC5oCisrKyBiL2lwYy91dGlsLmgKQEAgLTEwLDcgKzEwLDYgQEAKICNpZm5kZWYgX0lQQ19VVElMX0gKICNkZWZpbmUgX0lQQ19VVElMX0gKIAotI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCiAjZGVmaW5lIFVTSFJUX01BWCAweGZmZmYKQEAgLTIwLDIyICsxOSwxNiBAQAogdm9pZCBtc2dfaW5pdCAodm9pZCk7CiB2b2lkIHNobV9pbml0ICh2b2lkKTsKIAotaW50IHNlbV9pbml0X25zKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucyk7Ci1pbnQgbXNnX2luaXRfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKTsKLWludCBzaG1faW5pdF9ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMpOworc3RydWN0IGlwY19uYW1lc3BhY2U7CisKK3ZvaWQgc2VtX2luaXRfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKTsKK3ZvaWQgbXNnX2luaXRfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKTsKK3ZvaWQgc2htX2luaXRfbnMoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKTsKIAogdm9pZCBzZW1fZXhpdF9ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMpOwogdm9pZCBtc2dfZXhpdF9ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMpOwogdm9pZCBzaG1fZXhpdF9ucyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMpOwogCi1zdHJ1Y3QgaXBjX2lkcyB7Ci0JaW50IGluX3VzZTsKLQl1bnNpZ25lZCBzaG9ydCBzZXE7Ci0JdW5zaWduZWQgc2hvcnQgc2VxX21heDsKLQlzdHJ1Y3Qgcndfc2VtYXBob3JlIHJ3X211dGV4OwotCXN0cnVjdCBpZHIgaXBjc19pZHI7Ci19OwotCiAvKgogICogU3RydWN0dXJlIHRoYXQgaG9sZHMgdGhlIHBhcmFtZXRlcnMgbmVlZGVkIGJ5IHRoZSBpcGMgb3BlcmF0aW9ucwogICogKHNlZSBhZnRlcikKQEAgLTY2LDYgKzU5LDcgQEAKIH07CiAKIHN0cnVjdCBzZXFfZmlsZTsKK3N0cnVjdCBpcGNfaWRzOwogCiB2b2lkIGlwY19pbml0X2lkcyhzdHJ1Y3QgaXBjX2lkcyAqKTsKICNpZmRlZiBDT05GSUdfUFJPQ19GUwpAQCAtMTI5LDEwICsxMjMsNiBAQAogZXh0ZXJuIHZvaWQgZnJlZV9tc2coc3RydWN0IG1zZ19tc2cgKm1zZyk7CiBleHRlcm4gc3RydWN0IG1zZ19tc2cgKmxvYWRfbXNnKGNvbnN0IHZvaWQgX191c2VyICpzcmMsIGludCBsZW4pOwogZXh0ZXJuIGludCBzdG9yZV9tc2codm9pZCBfX3VzZXIgKmRlc3QsIHN0cnVjdCBtc2dfbXNnICptc2csIGludCBsZW4pOwotZXh0ZXJuIGludCBpcGNnZXRfbmV3KHN0cnVjdCBpcGNfbmFtZXNwYWNlICosIHN0cnVjdCBpcGNfaWRzICosCi0JCQlzdHJ1Y3QgaXBjX29wcyAqLCBzdHJ1Y3QgaXBjX3BhcmFtcyAqKTsKLWV4dGVybiBpbnQgaXBjZ2V0X3B1YmxpYyhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqLCBzdHJ1Y3QgaXBjX2lkcyAqLAotCQkJc3RydWN0IGlwY19vcHMgKiwgc3RydWN0IGlwY19wYXJhbXMgKik7CiAKIHN0YXRpYyBpbmxpbmUgaW50IGlwY19idWlsZGlkKGludCBpZCwgaW50IHNlcSkKIHsKQEAgLTE2MSw1NyArMTUxLDkgQEAKIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3Qga2Vybl9pcGNfcGVybSAqaXBjX2xvY2tfY2hlY2tfZG93bihzdHJ1Y3QgaXBjX2lkcyAqaWRzLAotCQkJCQkJaW50IGlkKQotewotCXN0cnVjdCBrZXJuX2lwY19wZXJtICpvdXQ7Ci0KLQlvdXQgPSBpcGNfbG9ja19kb3duKGlkcywgaWQpOwotCWlmIChJU19FUlIob3V0KSkKLQkJcmV0dXJuIG91dDsKLQotCWlmIChpcGNfY2hlY2tpZChvdXQsIGlkKSkgewotCQlpcGNfdW5sb2NrKG91dCk7Ci0JCXJldHVybiBFUlJfUFRSKC1FSURSTSk7Ci0JfQotCi0JcmV0dXJuIG91dDsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3Qga2Vybl9pcGNfcGVybSAqaXBjX2xvY2tfY2hlY2soc3RydWN0IGlwY19pZHMgKmlkcywKLQkJCQkJCWludCBpZCkKLXsKLQlzdHJ1Y3Qga2Vybl9pcGNfcGVybSAqb3V0OwotCi0Jb3V0ID0gaXBjX2xvY2soaWRzLCBpZCk7Ci0JaWYgKElTX0VSUihvdXQpKQotCQlyZXR1cm4gb3V0OwotCi0JaWYgKGlwY19jaGVja2lkKG91dCwgaWQpKSB7Ci0JCWlwY191bmxvY2sob3V0KTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVJRFJNKTsKLQl9Ci0KLQlyZXR1cm4gb3V0OwotfQotCi0vKioKLSAqIGlwY2dldCAtIENvbW1vbiBzeXNfKmdldCgpIGNvZGUKLSAqIEBucyA6IG5hbXNlcGFjZQotICogQGlkcyA6IElQQyBpZGVudGlmaWVyIHNldAotICogQG9wcyA6IG9wZXJhdGlvbnMgdG8gYmUgY2FsbGVkIG9uIGlwYyBvYmplY3QgY3JlYXRpb24sIHBlcm1pc3Npb24gY2hlY2tzCi0gKiAgICAgICAgYW5kIGZ1cnRoZXIgY2hlY2tzCi0gKiBAcGFyYW1zIDogdGhlIHBhcmFtZXRlcnMgbmVlZGVkIGJ5IHRoZSBwcmV2aW91cyBvcGVyYXRpb25zLgotICoKLSAqIENvbW1vbiByb3V0aW5lIGNhbGxlZCBieSBzeXNfbXNnZ2V0KCksIHN5c19zZW1nZXQoKSBhbmQgc3lzX3NobWdldCgpLgotICovCi1zdGF0aWMgaW5saW5lIGludCBpcGNnZXQoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zLCBzdHJ1Y3QgaXBjX2lkcyAqaWRzLAotCQkJc3RydWN0IGlwY19vcHMgKm9wcywgc3RydWN0IGlwY19wYXJhbXMgKnBhcmFtcykKLXsKLQlpZiAocGFyYW1zLT5rZXkgPT0gSVBDX1BSSVZBVEUpCi0JCXJldHVybiBpcGNnZXRfbmV3KG5zLCBpZHMsIG9wcywgcGFyYW1zKTsKLQllbHNlCi0JCXJldHVybiBpcGNnZXRfcHVibGljKG5zLCBpZHMsIG9wcywgcGFyYW1zKTsKLX0KK3N0cnVjdCBrZXJuX2lwY19wZXJtICppcGNfbG9ja19jaGVja19kb3duKHN0cnVjdCBpcGNfaWRzICppZHMsIGludCBpZCk7CitzdHJ1Y3Qga2Vybl9pcGNfcGVybSAqaXBjX2xvY2tfY2hlY2soc3RydWN0IGlwY19pZHMgKmlkcywgaW50IGlkKTsKK2ludCBpcGNnZXQoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zLCBzdHJ1Y3QgaXBjX2lkcyAqaWRzLAorCQkJc3RydWN0IGlwY19vcHMgKm9wcywgc3RydWN0IGlwY19wYXJhbXMgKnBhcmFtcyk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEva2VybmVsL01ha2VmaWxlIGIva2VybmVsL01ha2VmaWxlCmluZGV4IDEzNWExYjkuLjZjNTg0YzUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9NYWtlZmlsZQorKysgYi9rZXJuZWwvTWFrZWZpbGUKQEAgLTQsMTIgKzQsMTIgQEAKIAogb2JqLXkgICAgID0gc2NoZWQubyBmb3JrLm8gZXhlY19kb21haW4ubyBwYW5pYy5vIHByaW50ay5vIHByb2ZpbGUubyBcCiAJICAgIGV4aXQubyBpdGltZXIubyB0aW1lLm8gc29mdGlycS5vIHJlc291cmNlLm8gXAotCSAgICBzeXNjdGwubyBjYXBhYmlsaXR5Lm8gcHRyYWNlLm8gdGltZXIubyB1c2VyLm8gdXNlcl9uYW1lc3BhY2UubyBcCisJICAgIHN5c2N0bC5vIGNhcGFiaWxpdHkubyBwdHJhY2UubyB0aW1lci5vIHVzZXIubyBcCiAJICAgIHNpZ25hbC5vIHN5cy5vIGttb2QubyB3b3JrcXVldWUubyBwaWQubyBcCiAJICAgIHJjdXBkYXRlLm8gZXh0YWJsZS5vIHBhcmFtcy5vIHBvc2l4LXRpbWVycy5vIFwKIAkgICAga3RocmVhZC5vIHdhaXQubyBrZmlmby5vIHN5c19uaS5vIHBvc2l4LWNwdS10aW1lcnMubyBtdXRleC5vIFwKIAkgICAgaHJ0aW1lci5vIHJ3c2VtLm8gbnNwcm94eS5vIHNyY3UubyBcCi0JICAgIHV0c25hbWUubyBub3RpZmllci5vIGtzeXNmcy5vIHBtX3Fvc19wYXJhbXMubworCSAgICBub3RpZmllci5vIGtzeXNmcy5vIHBtX3Fvc19wYXJhbXMubwogCiBvYmotJChDT05GSUdfU1lTQ1RMKSArPSBzeXNjdGxfY2hlY2subwogb2JqLSQoQ09ORklHX1NUQUNLVFJBQ0UpICs9IHN0YWNrdHJhY2UubwpAQCAtNDIsNyArNDIsMTEgQEAKIG9iai0kKENPTkZJR19DR1JPVVBfREVCVUcpICs9IGNncm91cF9kZWJ1Zy5vCiBvYmotJChDT05GSUdfQ1BVU0VUUykgKz0gY3B1c2V0Lm8KIG9iai0kKENPTkZJR19DR1JPVVBfTlMpICs9IG5zX2Nncm91cC5vCitvYmotJChDT05GSUdfVVRTX05TKSArPSB1dHNuYW1lLm8KK29iai0kKENPTkZJR19VU0VSX05TKSArPSB1c2VyX25hbWVzcGFjZS5vCitvYmotJChDT05GSUdfUElEX05TKSArPSBwaWRfbmFtZXNwYWNlLm8KIG9iai0kKENPTkZJR19JS0NPTkZJRykgKz0gY29uZmlncy5vCitvYmotJChDT05GSUdfUkVTT1VSQ0VfQ09VTlRFUlMpICs9IHJlc19jb3VudGVyLm8KIG9iai0kKENPTkZJR19TVE9QX01BQ0hJTkUpICs9IHN0b3BfbWFjaGluZS5vCiBvYmotJChDT05GSUdfS1BST0JFU19TQU5JVFlfVEVTVCkgKz0gdGVzdF9rcHJvYmVzLm8KIG9iai0kKENPTkZJR19BVURJVCkgKz0gYXVkaXQubyBhdWRpdGZpbHRlci5vCkBAIC04NywzICs5MSwxMSBAQAogdGFyZ2V0cyArPSBjb25maWdfZGF0YS5oCiAkKG9iaikvY29uZmlnX2RhdGEuaDogJChvYmopL2NvbmZpZ19kYXRhLmd6IEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsaWtjb25maWdneikKKworJChvYmopL3RpbWUubzogJChvYmopL3RpbWVjb25zdC5oCisKK3F1aWV0X2NtZF90aW1lY29uc3QgID0gVElNRUMgICAkQAorICAgICAgY21kX3RpbWVjb25zdCAgPSAkKFBFUkwpICQ8ICQoQ09ORklHX0haKSA+ICRACit0YXJnZXRzICs9IHRpbWVjb25zdC5oCiskKG9iaikvdGltZWNvbnN0Lmg6ICQoc3JjKS90aW1lY29uc3QucGwgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCx0aW1lY29uc3QpCmRpZmYgLS1naXQgYS9rZXJuZWwvY2dyb3VwLmMgYi9rZXJuZWwvY2dyb3VwLmMKaW5kZXggMWEzYzIzOS4uNDc2NmJiNiAxMDA2NDQKLS0tIGEva2VybmVsL2Nncm91cC5jCisrKyBiL2tlcm5lbC9jZ3JvdXAuYwpAQCAtMTQxLDcgKzE0MSw3IEBACiAJUk9PVF9OT1BSRUZJWCwgLyogbW91bnRlZCBzdWJzeXN0ZW1zIGhhdmUgbm8gbmFtZWQgcHJlZml4ICovCiB9OwogCi1pbmxpbmUgaW50IGNncm91cF9pc19yZWxlYXNhYmxlKGNvbnN0IHN0cnVjdCBjZ3JvdXAgKmNncnApCitzdGF0aWMgaW50IGNncm91cF9pc19yZWxlYXNhYmxlKGNvbnN0IHN0cnVjdCBjZ3JvdXAgKmNncnApCiB7CiAJY29uc3QgaW50IGJpdHMgPQogCQkoMSA8PCBDR1JQX1JFTEVBU0FCTEUpIHwKQEAgLTE0OSw3ICsxNDksNyBAQAogCXJldHVybiAoY2dycC0+ZmxhZ3MgJiBiaXRzKSA9PSBiaXRzOwogfQogCi1pbmxpbmUgaW50IG5vdGlmeV9vbl9yZWxlYXNlKGNvbnN0IHN0cnVjdCBjZ3JvdXAgKmNncnApCitzdGF0aWMgaW50IG5vdGlmeV9vbl9yZWxlYXNlKGNvbnN0IHN0cnVjdCBjZ3JvdXAgKmNncnApCiB7CiAJcmV0dXJuIHRlc3RfYml0KENHUlBfTk9USUZZX09OX1JFTEVBU0UsICZjZ3JwLT5mbGFncyk7CiB9CkBAIC00ODksNyArNDg5LDcgQEAKICAqIEFueSB0YXNrIGNhbiBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudCB0aGUgY291bnQgZmllbGQgd2l0aG91dCBsb2NrLgogICogU28gaW4gZ2VuZXJhbCwgY29kZSBob2xkaW5nIGNncm91cF9tdXRleCBjYW4ndCByZWx5IG9uIHRoZSBjb3VudAogICogZmllbGQgbm90IGNoYW5naW5nLiAgSG93ZXZlciwgaWYgdGhlIGNvdW50IGdvZXMgdG8gemVybywgdGhlbiBvbmx5Ci0gKiBhdHRhY2hfdGFzaygpIGNhbiBpbmNyZW1lbnQgaXQgYWdhaW4uICBCZWNhdXNlIGEgY291bnQgb2YgemVybworICogY2dyb3VwX2F0dGFjaF90YXNrKCkgY2FuIGluY3JlbWVudCBpdCBhZ2Fpbi4gIEJlY2F1c2UgYSBjb3VudCBvZiB6ZXJvCiAgKiBtZWFucyB0aGF0IG5vIHRhc2tzIGFyZSBjdXJyZW50bHkgYXR0YWNoZWQsIHRoZXJlZm9yZSB0aGVyZSBpcyBubwogICogd2F5IGEgdGFzayBhdHRhY2hlZCB0byB0aGF0IGNncm91cCBjYW4gZm9yayAodGhlIG90aGVyIHdheSB0bwogICogaW5jcmVtZW50IHRoZSBjb3VudCkuICBTbyBjb2RlIGhvbGRpbmcgY2dyb3VwX211dGV4IGNhbiBzYWZlbHkKQEAgLTUyMCwxNyArNTIwLDE3IEBACiAgKglUaGUgdGFza19sb2NrKCkgZXhjZXB0aW9uCiAgKgogICogVGhlIG5lZWQgZm9yIHRoaXMgZXhjZXB0aW9uIGFyaXNlcyBmcm9tIHRoZSBhY3Rpb24gb2YKLSAqIGF0dGFjaF90YXNrKCksIHdoaWNoIG92ZXJ3cml0ZXMgb25lIHRhc2tzIGNncm91cCBwb2ludGVyIHdpdGgKKyAqIGNncm91cF9hdHRhY2hfdGFzaygpLCB3aGljaCBvdmVyd3JpdGVzIG9uZSB0YXNrcyBjZ3JvdXAgcG9pbnRlciB3aXRoCiAgKiBhbm90aGVyLiAgSXQgZG9lcyBzbyB1c2luZyBjZ3JvdXBfbXV0ZXhlLCBob3dldmVyIHRoZXJlIGFyZQogICogc2V2ZXJhbCBwZXJmb3JtYW5jZSBjcml0aWNhbCBwbGFjZXMgdGhhdCBuZWVkIHRvIHJlZmVyZW5jZQogICogdGFzay0+Y2dyb3VwIHdpdGhvdXQgdGhlIGV4cGVuc2Ugb2YgZ3JhYmJpbmcgYSBzeXN0ZW0gZ2xvYmFsCiAgKiBtdXRleC4gIFRoZXJlZm9yZSBleGNlcHQgYXMgbm90ZWQgYmVsb3csIHdoZW4gZGVyZWZlcmVuY2luZyBvciwgYXMKLSAqIGluIGF0dGFjaF90YXNrKCksIG1vZGlmeWluZyBhIHRhc2snc3MgY2dyb3VwIHBvaW50ZXIgd2UgdXNlCisgKiBpbiBjZ3JvdXBfYXR0YWNoX3Rhc2soKSwgbW9kaWZ5aW5nIGEgdGFzaydzcyBjZ3JvdXAgcG9pbnRlciB3ZSB1c2UKICAqIHRhc2tfbG9jaygpLCB3aGljaCBhY3RzIG9uIGEgc3BpbmxvY2sgKHRhc2stPmFsbG9jX2xvY2spIGFscmVhZHkgaW4KICAqIHRoZSB0YXNrX3N0cnVjdCByb3V0aW5lbHkgdXNlZCBmb3Igc3VjaCBtYXR0ZXJzLgogICoKICAqIFAuUy4gIE9uZSBtb3JlIGxvY2tpbmcgZXhjZXB0aW9uLiAgUkNVIGlzIHVzZWQgdG8gZ3VhcmQgdGhlCi0gKiB1cGRhdGUgb2YgYSB0YXNrcyBjZ3JvdXAgcG9pbnRlciBieSBhdHRhY2hfdGFzaygpCisgKiB1cGRhdGUgb2YgYSB0YXNrcyBjZ3JvdXAgcG9pbnRlciBieSBjZ3JvdXBfYXR0YWNoX3Rhc2soKQogICovCiAKIC8qKgpAQCAtNTg2LDExICs1ODYsMjcgQEAKIAlyZXR1cm4gaW5vZGU7CiB9CiAKKy8qCisgKiBDYWxsIHN1YnN5cydzIHByZV9kZXN0cm95IGhhbmRsZXIuCisgKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgY3NzIHJlZmNudCBjaGVjay4KKyAqLworCitzdGF0aWMgdm9pZCBjZ3JvdXBfY2FsbF9wcmVfZGVzdHJveShzdHJ1Y3QgY2dyb3VwICpjZ3JwKQoreworCXN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzczsKKwlmb3JfZWFjaF9zdWJzeXMoY2dycC0+cm9vdCwgc3MpCisJCWlmIChzcy0+cHJlX2Rlc3Ryb3kgJiYgY2dycC0+c3Vic3lzW3NzLT5zdWJzeXNfaWRdKQorCQkJc3MtPnByZV9kZXN0cm95KHNzLCBjZ3JwKTsKKwlyZXR1cm47Cit9CisKKwogc3RhdGljIHZvaWQgY2dyb3VwX2RpcHV0KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAkvKiBpcyBkZW50cnkgYSBkaXJlY3RvcnkgPyBpZiBzbywga2ZyZWUoKSBhc3NvY2lhdGVkIGNncm91cCAqLwogCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CiAJCXN0cnVjdCBjZ3JvdXAgKmNncnAgPSBkZW50cnktPmRfZnNkYXRhOworCQlzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3M7CiAJCUJVR19PTighKGNncm91cF9pc19yZW1vdmVkKGNncnApKSk7CiAJCS8qIEl0J3MgcG9zc2libGUgZm9yIGV4dGVybmFsIHVzZXJzIHRvIGJlIGhvbGRpbmcgY3NzCiAJCSAqIHJlZmVyZW5jZSBjb3VudHMgb24gYSBjZ3JvdXA7IGNzc19wdXQoKSBuZWVkcyB0bwpAQCAtNTk5LDYgKzYxNSwyMyBAQAogCQkgKiBxdWV1ZSB0aGUgY2dyb3VwIHRvIGJlIGhhbmRsZWQgYnkgdGhlIHJlbGVhc2UKIAkJICogYWdlbnQgKi8KIAkJc3luY2hyb25pemVfcmN1KCk7CisKKwkJbXV0ZXhfbG9jaygmY2dyb3VwX211dGV4KTsKKwkJLyoKKwkJICogUmVsZWFzZSB0aGUgc3Vic3lzdGVtIHN0YXRlIG9iamVjdHMuCisJCSAqLworCQlmb3JfZWFjaF9zdWJzeXMoY2dycC0+cm9vdCwgc3MpIHsKKwkJCWlmIChjZ3JwLT5zdWJzeXNbc3MtPnN1YnN5c19pZF0pCisJCQkJc3MtPmRlc3Ryb3koc3MsIGNncnApOworCQl9CisKKwkJY2dycC0+cm9vdC0+bnVtYmVyX29mX2Nncm91cHMtLTsKKwkJbXV0ZXhfdW5sb2NrKCZjZ3JvdXBfbXV0ZXgpOworCisJCS8qIERyb3AgdGhlIGFjdGl2ZSBzdXBlcmJsb2NrIHJlZmVyZW5jZSB0aGF0IHdlIHRvb2sgd2hlbiB3ZQorCQkgKiBjcmVhdGVkIHRoZSBjZ3JvdXAgKi8KKwkJZGVhY3RpdmF0ZV9zdXBlcihjZ3JwLT5yb290LT5zYik7CisKIAkJa2ZyZWUoY2dycCk7CiAJfQogCWlwdXQoaW5vZGUpOwpAQCAtMTE2MSw3ICsxMTk0LDcgQEAKICAqIENhbGwgaG9sZGluZyBjZ3JvdXBfbXV0ZXguICBNYXkgdGFrZSB0YXNrX2xvY2sgb2YKICAqIHRoZSB0YXNrICdwaWQnIGR1cmluZyBjYWxsLgogICovCi1zdGF0aWMgaW50IGF0dGFjaF90YXNrKHN0cnVjdCBjZ3JvdXAgKmNncnAsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoraW50IGNncm91cF9hdHRhY2hfdGFzayhzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKIAlpbnQgcmV0dmFsID0gMDsKIAlzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3M7CkBAIC0xMTgxLDkgKzEyMTQsOCBAQAogCWZvcl9lYWNoX3N1YnN5cyhyb290LCBzcykgewogCQlpZiAoc3MtPmNhbl9hdHRhY2gpIHsKIAkJCXJldHZhbCA9IHNzLT5jYW5fYXR0YWNoKHNzLCBjZ3JwLCB0c2spOwotCQkJaWYgKHJldHZhbCkgeworCQkJaWYgKHJldHZhbCkKIAkJCQlyZXR1cm4gcmV0dmFsOwotCQkJfQogCQl9CiAJfQogCkBAIC0xMTkyLDkgKzEyMjQsOCBAQAogCSAqIGJhc2VkIG9uIGl0cyBmaW5hbCBzZXQgb2YgY2dyb3VwcwogCSAqLwogCW5ld2NnID0gZmluZF9jc3Nfc2V0KGNnLCBjZ3JwKTsKLQlpZiAoIW5ld2NnKSB7CisJaWYgKCFuZXdjZykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJdGFza19sb2NrKHRzayk7CiAJaWYgKHRzay0+ZmxhZ3MgJiBQRl9FWElUSU5HKSB7CkBAIC0xMjE0LDkgKzEyNDUsOCBAQAogCXdyaXRlX3VubG9jaygmY3NzX3NldF9sb2NrKTsKIAogCWZvcl9lYWNoX3N1YnN5cyhyb290LCBzcykgewotCQlpZiAoc3MtPmF0dGFjaCkgeworCQlpZiAoc3MtPmF0dGFjaCkKIAkJCXNzLT5hdHRhY2goc3MsIGNncnAsIG9sZGNncnAsIHRzayk7Ci0JCX0KIAl9CiAJc2V0X2JpdChDR1JQX1JFTEVBU0FCTEUsICZvbGRjZ3JwLT5mbGFncyk7CiAJc3luY2hyb25pemVfcmN1KCk7CkBAIC0xMjM5LDcgKzEyNjksNyBAQAogCiAJaWYgKHBpZCkgewogCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCXRzayA9IGZpbmRfdGFza19ieV9waWQocGlkKTsKKwkJdHNrID0gZmluZF90YXNrX2J5X3ZwaWQocGlkKTsKIAkJaWYgKCF0c2sgfHwgdHNrLT5mbGFncyAmIFBGX0VYSVRJTkcpIHsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJcmV0dXJuIC1FU1JDSDsKQEAgLTEyNTcsNyArMTI4Nyw3IEBACiAJCWdldF90YXNrX3N0cnVjdCh0c2spOwogCX0KIAotCXJldCA9IGF0dGFjaF90YXNrKGNncnAsIHRzayk7CisJcmV0ID0gY2dyb3VwX2F0dGFjaF90YXNrKGNncnAsIHRzayk7CiAJcHV0X3Rhc2tfc3RydWN0KHRzayk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTEzMjksOSArMTM1OSwxNCBAQAogCQlnb3RvIG91dDE7CiAJfQogCWJ1ZmZlcltuYnl0ZXNdID0gMDsJLyogbnVsLXRlcm1pbmF0ZSAqLworCXN0cnN0cmlwKGJ1ZmZlcik7CS8qIHN0cmlwIC1qdXN0LSB0cmFpbGluZyB3aGl0ZXNwYWNlICovCiAKIAltdXRleF9sb2NrKCZjZ3JvdXBfbXV0ZXgpOwogCisJLyoKKwkgKiBUaGlzIHdhcyBhbHJlYWR5IGNoZWNrZWQgZm9yIGluIGNncm91cF9maWxlX3dyaXRlKCksIGJ1dAorCSAqIGNoZWNrIGFnYWluIG5vdyB3ZSdyZSBob2xkaW5nIGNncm91cF9tdXRleC4KKwkgKi8KIAlpZiAoY2dyb3VwX2lzX3JlbW92ZWQoY2dycCkpIHsKIAkJcmV0dmFsID0gLUVOT0RFVjsKIAkJZ290byBvdXQyOwpAQCAtMTM0OSwyNCArMTM4NCw5IEBACiAJCQljbGVhcl9iaXQoQ0dSUF9OT1RJRllfT05fUkVMRUFTRSwgJmNncnAtPmZsYWdzKTsKIAkJYnJlYWs7CiAJY2FzZSBGSUxFX1JFTEVBU0VfQUdFTlQ6Ci0JewotCQlzdHJ1Y3QgY2dyb3VwZnNfcm9vdCAqcm9vdCA9IGNncnAtPnJvb3Q7Ci0JCS8qIFN0cmlwIHRyYWlsaW5nIG5ld2xpbmUgKi8KLQkJaWYgKG5ieXRlcyAmJiAoYnVmZmVyW25ieXRlcy0xXSA9PSAnXG4nKSkgewotCQkJYnVmZmVyW25ieXRlcy0xXSA9IDA7Ci0JCX0KLQkJaWYgKG5ieXRlcyA8IHNpemVvZihyb290LT5yZWxlYXNlX2FnZW50X3BhdGgpKSB7Ci0JCQkvKiBXZSBuZXZlciB3cml0ZSBhbnl0aGluZyBvdGhlciB0aGFuICdcMCcKLQkJCSAqIGludG8gdGhlIGxhc3QgY2hhciBvZiByZWxlYXNlX2FnZW50X3BhdGgsCi0JCQkgKiBzbyBpdCBhbHdheXMgcmVtYWlucyBhIE5VTC10ZXJtaW5hdGVkCi0JCQkgKiBzdHJpbmcgKi8KLQkJCXN0cm5jcHkocm9vdC0+cmVsZWFzZV9hZ2VudF9wYXRoLCBidWZmZXIsIG5ieXRlcyk7Ci0JCQlyb290LT5yZWxlYXNlX2FnZW50X3BhdGhbbmJ5dGVzXSA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR2YWwgPSAtRU5PU1BDOwotCQl9CisJCUJVSUxEX0JVR19PTihzaXplb2YoY2dycC0+cm9vdC0+cmVsZWFzZV9hZ2VudF9wYXRoKSA8IFBBVEhfTUFYKTsKKwkJc3RyY3B5KGNncnAtPnJvb3QtPnJlbGVhc2VfYWdlbnRfcGF0aCwgYnVmZmVyKTsKIAkJYnJlYWs7Ci0JfQogCWRlZmF1bHQ6CiAJCXJldHZhbCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0MjsKQEAgLTEzODcsNyArMTQwNyw3IEBACiAJc3RydWN0IGNmdHlwZSAqY2Z0ID0gX19kX2NmdChmaWxlLT5mX2RlbnRyeSk7CiAJc3RydWN0IGNncm91cCAqY2dycCA9IF9fZF9jZ3JwKGZpbGUtPmZfZGVudHJ5LT5kX3BhcmVudCk7CiAKLQlpZiAoIWNmdCkKKwlpZiAoIWNmdCB8fCBjZ3JvdXBfaXNfcmVtb3ZlZChjZ3JwKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJaWYgKGNmdC0+d3JpdGUpCiAJCXJldHVybiBjZnQtPndyaXRlKGNncnAsIGNmdCwgZmlsZSwgYnVmLCBuYnl0ZXMsIHBwb3MpOwpAQCAtMTQ1Nyw3ICsxNDc3LDcgQEAKIAlzdHJ1Y3QgY2Z0eXBlICpjZnQgPSBfX2RfY2Z0KGZpbGUtPmZfZGVudHJ5KTsKIAlzdHJ1Y3QgY2dyb3VwICpjZ3JwID0gX19kX2NncnAoZmlsZS0+Zl9kZW50cnktPmRfcGFyZW50KTsKIAotCWlmICghY2Z0KQorCWlmICghY2Z0IHx8IGNncm91cF9pc19yZW1vdmVkKGNncnApKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmIChjZnQtPnJlYWQpCkBAIC0xNjc1LDYgKzE2OTUsMjkgQEAKIAlpdC0+dGFzayA9IGNnLT50YXNrcy5uZXh0OwogfQogCisvKgorICogVG8gcmVkdWNlIHRoZSBmb3JrKCkgb3ZlcmhlYWQgZm9yIHN5c3RlbXMgdGhhdCBhcmUgbm90IGFjdHVhbGx5CisgKiB1c2luZyB0aGVpciBjZ3JvdXBzIGNhcGFiaWxpdHksIHdlIGRvbid0IG1haW50YWluIHRoZSBsaXN0cyBydW5uaW5nCisgKiB0aHJvdWdoIGVhY2ggY3NzX3NldCB0byBpdHMgdGFza3MgdW50aWwgd2Ugc2VlIHRoZSBsaXN0IGFjdHVhbGx5CisgKiB1c2VkIC0gaW4gb3RoZXIgd29yZHMgYWZ0ZXIgdGhlIGZpcnN0IGNhbGwgdG8gY2dyb3VwX2l0ZXJfc3RhcnQoKS4KKyAqCisgKiBUaGUgdGFza2xpc3RfbG9jayBpcyBub3QgaGVsZCBoZXJlLCBhcyBkb19lYWNoX3RocmVhZCgpIGFuZAorICogd2hpbGVfZWFjaF90aHJlYWQoKSBhcmUgcHJvdGVjdGVkIGJ5IFJDVS4KKyAqLwordm9pZCBjZ3JvdXBfZW5hYmxlX3Rhc2tfY2dfbGlzdHModm9pZCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsICpnOworCXdyaXRlX2xvY2soJmNzc19zZXRfbG9jayk7CisJdXNlX3Rhc2tfY3NzX3NldF9saW5rcyA9IDE7CisJZG9fZWFjaF90aHJlYWQoZywgcCkgeworCQl0YXNrX2xvY2socCk7CisJCWlmIChsaXN0X2VtcHR5KCZwLT5jZ19saXN0KSkKKwkJCWxpc3RfYWRkKCZwLT5jZ19saXN0LCAmcC0+Y2dyb3Vwcy0+dGFza3MpOworCQl0YXNrX3VubG9jayhwKTsKKwl9IHdoaWxlX2VhY2hfdGhyZWFkKGcsIHApOworCXdyaXRlX3VubG9jaygmY3NzX3NldF9sb2NrKTsKK30KKwogdm9pZCBjZ3JvdXBfaXRlcl9zdGFydChzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgY2dyb3VwX2l0ZXIgKml0KQogewogCS8qCkBAIC0xNjgyLDE4ICsxNzI1LDkgQEAKIAkgKiB3ZSBuZWVkIHRvIGVuYWJsZSB0aGUgbGlzdCBsaW5raW5nIGVhY2ggY3NzX3NldCB0byBpdHMKIAkgKiB0YXNrcywgYW5kIGZpeCB1cCBhbGwgZXhpc3RpbmcgdGFza3MuCiAJICovCi0JaWYgKCF1c2VfdGFza19jc3Nfc2V0X2xpbmtzKSB7Ci0JCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgKmc7Ci0JCXdyaXRlX2xvY2soJmNzc19zZXRfbG9jayk7Ci0JCXVzZV90YXNrX2Nzc19zZXRfbGlua3MgPSAxOwotIAkJZG9fZWFjaF90aHJlYWQoZywgcCkgewotCQkJdGFza19sb2NrKHApOwotCQkJaWYgKGxpc3RfZW1wdHkoJnAtPmNnX2xpc3QpKQotCQkJCWxpc3RfYWRkKCZwLT5jZ19saXN0LCAmcC0+Y2dyb3Vwcy0+dGFza3MpOwotCQkJdGFza191bmxvY2socCk7Ci0gCQl9IHdoaWxlX2VhY2hfdGhyZWFkKGcsIHApOwotCQl3cml0ZV91bmxvY2soJmNzc19zZXRfbG9jayk7Ci0JfQorCWlmICghdXNlX3Rhc2tfY3NzX3NldF9saW5rcykKKwkJY2dyb3VwX2VuYWJsZV90YXNrX2NnX2xpc3RzKCk7CisKIAlyZWFkX2xvY2soJmNzc19zZXRfbG9jayk7CiAJaXQtPmNnX2xpbmsgPSAmY2dycC0+Y3NzX3NldHM7CiAJY2dyb3VwX2FkdmFuY2VfaXRlcihjZ3JwLCBpdCk7CkBAIC0xNzI2LDYgKzE3NjAsMTY2IEBACiAJcmVhZF91bmxvY2soJmNzc19zZXRfbG9jayk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHN0YXJ0ZWRfYWZ0ZXJfdGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQxLAorCQkJCSAgICAgc3RydWN0IHRpbWVzcGVjICp0aW1lLAorCQkJCSAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0MikKK3sKKwlpbnQgc3RhcnRfZGlmZiA9IHRpbWVzcGVjX2NvbXBhcmUoJnQxLT5zdGFydF90aW1lLCB0aW1lKTsKKwlpZiAoc3RhcnRfZGlmZiA+IDApIHsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIGlmIChzdGFydF9kaWZmIDwgMCkgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBBcmJpdHJhcmlseSwgaWYgdHdvIHByb2Nlc3NlcyBzdGFydGVkIGF0IHRoZSBzYW1lCisJCSAqIHRpbWUsIHdlJ2xsIHNheSB0aGF0IHRoZSBsb3dlciBwb2ludGVyIHZhbHVlCisJCSAqIHN0YXJ0ZWQgZmlyc3QuIE5vdGUgdGhhdCB0MiBtYXkgaGF2ZSBleGl0ZWQgYnkgbm93CisJCSAqIHNvIHRoaXMgbWF5IG5vdCBiZSBhIHZhbGlkIHBvaW50ZXIgYW55IGxvbmdlciwgYnV0CisJCSAqIHRoYXQncyBmaW5lIC0gaXQgc3RpbGwgc2VydmVzIHRvIGRpc3Rpbmd1aXNoCisJCSAqIGJldHdlZW4gdHdvIHRhc2tzIHN0YXJ0ZWQgKGVmZmVjdGl2ZWx5KSBzaW11bHRhbmVvdXNseS4KKwkJICovCisJCXJldHVybiB0MSA+IHQyOworCX0KK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYSBjYWxsYmFjayBmcm9tIGhlYXBfaW5zZXJ0KCkgYW5kIGlzIHVzZWQgdG8gb3JkZXIKKyAqIHRoZSBoZWFwLgorICogSW4gdGhpcyBjYXNlIHdlIG9yZGVyIHRoZSBoZWFwIGluIGRlc2NlbmRpbmcgdGFzayBzdGFydCB0aW1lLgorICovCitzdGF0aWMgaW5saW5lIGludCBzdGFydGVkX2FmdGVyKHZvaWQgKnAxLCB2b2lkICpwMikKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQxID0gcDE7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0MiA9IHAyOworCXJldHVybiBzdGFydGVkX2FmdGVyX3RpbWUodDEsICZ0Mi0+c3RhcnRfdGltZSwgdDIpOworfQorCisvKioKKyAqIGNncm91cF9zY2FuX3Rhc2tzIC0gaXRlcmF0ZSB0aG91Z2ggYWxsIHRoZSB0YXNrcyBpbiBhIGNncm91cAorICogQHNjYW46IHN0cnVjdCBjZ3JvdXBfc2Nhbm5lciBjb250YWluaW5nIGFyZ3VtZW50cyBmb3IgdGhlIHNjYW4KKyAqCisgKiBBcmd1bWVudHMgaW5jbHVkZSBwb2ludGVycyB0byBjYWxsYmFjayBmdW5jdGlvbnMgdGVzdF90YXNrKCkgYW5kCisgKiBwcm9jZXNzX3Rhc2soKS4KKyAqIEl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIHRhc2tzIGluIGEgY2dyb3VwLCBjYWxsaW5nIHRlc3RfdGFzaygpIGZvciBlYWNoLAorICogYW5kIGlmIGl0IHJldHVybnMgdHJ1ZSwgY2FsbCBwcm9jZXNzX3Rhc2soKSBmb3IgaXQgYWxzby4KKyAqIFRoZSB0ZXN0X3Rhc2sgcG9pbnRlciBtYXkgYmUgTlVMTCwgbWVhbmluZyBhbHdheXMgdHJ1ZSAoc2VsZWN0IGFsbCB0YXNrcykuCisgKiBFZmZlY3RpdmVseSBkdXBsaWNhdGVzIGNncm91cF9pdGVyX3tzdGFydCxuZXh0LGVuZH0oKQorICogYnV0IGRvZXMgbm90IGxvY2sgY3NzX3NldF9sb2NrIGZvciB0aGUgY2FsbCB0byBwcm9jZXNzX3Rhc2soKS4KKyAqIFRoZSBzdHJ1Y3QgY2dyb3VwX3NjYW5uZXIgbWF5IGJlIGVtYmVkZGVkIGluIGFueSBzdHJ1Y3R1cmUgb2YgdGhlIGNhbGxlcidzCisgKiBjcmVhdGlvbi4KKyAqIEl0IGlzIGd1YXJhbnRlZWQgdGhhdCBwcm9jZXNzX3Rhc2soKSB3aWxsIGFjdCBvbiBldmVyeSB0YXNrIHRoYXQKKyAqIGlzIGEgbWVtYmVyIG9mIHRoZSBjZ3JvdXAgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGlzIGNhbGwuIFRoaXMKKyAqIGZ1bmN0aW9uIG1heSBvciBtYXkgbm90IGNhbGwgcHJvY2Vzc190YXNrKCkgZm9yIHRhc2tzIHRoYXQgZXhpdAorICogb3IgbW92ZSB0byBhIGRpZmZlcmVudCBjZ3JvdXAgZHVyaW5nIHRoZSBjYWxsLCBvciBhcmUgZm9ya2VkIG9yCisgKiBtb3ZlIGludG8gdGhlIGNncm91cCBkdXJpbmcgdGhlIGNhbGwuCisgKgorICogTm90ZSB0aGF0IHRlc3RfdGFzaygpIG1heSBiZSBjYWxsZWQgd2l0aCBsb2NrcyBoZWxkLCBhbmQgbWF5IGluIHNvbWUKKyAqIHNpdHVhdGlvbnMgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciB0aGUgc2FtZSB0YXNrLCBzbyBpdCBzaG91bGQKKyAqIGJlIGNoZWFwLgorICogSWYgdGhlIGhlYXAgcG9pbnRlciBpbiB0aGUgc3RydWN0IGNncm91cF9zY2FubmVyIGlzIG5vbi1OVUxMLCBhIGhlYXAgaGFzIGJlZW4KKyAqIHByZS1hbGxvY2F0ZWQgYW5kIHdpbGwgYmUgdXNlZCBmb3IgaGVhcCBvcGVyYXRpb25zIChhbmQgaXRzICJndCIgbWVtYmVyIHdpbGwKKyAqIGJlIG92ZXJ3cml0dGVuKSwgZWxzZSBhIHRlbXBvcmFyeSBoZWFwIHdpbGwgYmUgdXNlZCAoYWxsb2NhdGlvbiBvZiB3aGljaAorICogbWF5IGNhdXNlIHRoaXMgZnVuY3Rpb24gdG8gZmFpbCkuCisgKi8KK2ludCBjZ3JvdXBfc2Nhbl90YXNrcyhzdHJ1Y3QgY2dyb3VwX3NjYW5uZXIgKnNjYW4pCit7CisJaW50IHJldHZhbCwgaTsKKwlzdHJ1Y3QgY2dyb3VwX2l0ZXIgaXQ7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwLCAqZHJvcHBlZDsKKwkvKiBOZXZlciBkZXJlZmVyZW5jZSBsYXRlc3RfdGFzaywgc2luY2UgaXQncyBub3QgcmVmY291bnRlZCAqLworCXN0cnVjdCB0YXNrX3N0cnVjdCAqbGF0ZXN0X3Rhc2sgPSBOVUxMOworCXN0cnVjdCBwdHJfaGVhcCB0bXBfaGVhcDsKKwlzdHJ1Y3QgcHRyX2hlYXAgKmhlYXA7CisJc3RydWN0IHRpbWVzcGVjIGxhdGVzdF90aW1lID0geyAwLCAwIH07CisKKwlpZiAoc2Nhbi0+aGVhcCkgeworCQkvKiBUaGUgY2FsbGVyIHN1cHBsaWVkIG91ciBoZWFwIGFuZCBwcmUtYWxsb2NhdGVkIGl0cyBtZW1vcnkgKi8KKwkJaGVhcCA9IHNjYW4tPmhlYXA7CisJCWhlYXAtPmd0ID0gJnN0YXJ0ZWRfYWZ0ZXI7CisJfSBlbHNlIHsKKwkJLyogV2UgbmVlZCB0byBhbGxvY2F0ZSBvdXIgb3duIGhlYXAgbWVtb3J5ICovCisJCWhlYXAgPSAmdG1wX2hlYXA7CisJCXJldHZhbCA9IGhlYXBfaW5pdChoZWFwLCBQQUdFX1NJWkUsIEdGUF9LRVJORUwsICZzdGFydGVkX2FmdGVyKTsKKwkJaWYgKHJldHZhbCkKKwkJCS8qIGNhbm5vdCBhbGxvY2F0ZSB0aGUgaGVhcCAqLworCQkJcmV0dXJuIHJldHZhbDsKKwl9CisKKyBhZ2FpbjoKKwkvKgorCSAqIFNjYW4gdGFza3MgaW4gdGhlIGNncm91cCwgdXNpbmcgdGhlIHNjYW5uZXIncyAidGVzdF90YXNrIiBjYWxsYmFjaworCSAqIHRvIGRldGVybWluZSB3aGljaCBhcmUgb2YgaW50ZXJlc3QsIGFuZCB1c2luZyB0aGUgc2Nhbm5lcidzCisJICogInByb2Nlc3NfdGFzayIgY2FsbGJhY2sgdG8gcHJvY2VzcyBhbnkgb2YgdGhlbSB0aGF0IG5lZWQgYW4gdXBkYXRlLgorCSAqIFNpbmNlIHdlIGRvbid0IHdhbnQgdG8gaG9sZCBhbnkgbG9ja3MgZHVyaW5nIHRoZSB0YXNrIHVwZGF0ZXMsCisJICogZ2F0aGVyIHRhc2tzIHRvIGJlIHByb2Nlc3NlZCBpbiBhIGhlYXAgc3RydWN0dXJlLgorCSAqIFRoZSBoZWFwIGlzIHNvcnRlZCBieSBkZXNjZW5kaW5nIHRhc2sgc3RhcnQgdGltZS4KKwkgKiBJZiB0aGUgc3RhdGljYWxseS1zaXplZCBoZWFwIGZpbGxzIHVwLCB3ZSBvdmVyZmxvdyB0YXNrcyB0aGF0CisJICogc3RhcnRlZCBsYXRlciwgYW5kIGluIGZ1dHVyZSBpdGVyYXRpb25zIG9ubHkgY29uc2lkZXIgdGFza3MgdGhhdAorCSAqIHN0YXJ0ZWQgYWZ0ZXIgdGhlIGxhdGVzdCB0YXNrIGluIHRoZSBwcmV2aW91cyBwYXNzLiBUaGlzCisJICogZ3VhcmFudGVlcyBmb3J3YXJkIHByb2dyZXNzIGFuZCB0aGF0IHdlIGRvbid0IG1pc3MgYW55IHRhc2tzLgorCSAqLworCWhlYXAtPnNpemUgPSAwOworCWNncm91cF9pdGVyX3N0YXJ0KHNjYW4tPmNnLCAmaXQpOworCXdoaWxlICgocCA9IGNncm91cF9pdGVyX25leHQoc2Nhbi0+Y2csICZpdCkpKSB7CisJCS8qCisJCSAqIE9ubHkgYWZmZWN0IHRhc2tzIHRoYXQgcXVhbGlmeSBwZXIgdGhlIGNhbGxlcidzIGNhbGxiYWNrLAorCQkgKiBpZiBoZSBwcm92aWRlZCBvbmUKKwkJICovCisJCWlmIChzY2FuLT50ZXN0X3Rhc2sgJiYgIXNjYW4tPnRlc3RfdGFzayhwLCBzY2FuKSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBPbmx5IHByb2Nlc3MgdGFza3MgdGhhdCBzdGFydGVkIGFmdGVyIHRoZSBsYXN0IHRhc2sKKwkJICogd2UgcHJvY2Vzc2VkCisJCSAqLworCQlpZiAoIXN0YXJ0ZWRfYWZ0ZXJfdGltZShwLCAmbGF0ZXN0X3RpbWUsIGxhdGVzdF90YXNrKSkKKwkJCWNvbnRpbnVlOworCQlkcm9wcGVkID0gaGVhcF9pbnNlcnQoaGVhcCwgcCk7CisJCWlmIChkcm9wcGVkID09IE5VTEwpIHsKKwkJCS8qCisJCQkgKiBUaGUgbmV3IHRhc2sgd2FzIGluc2VydGVkOyB0aGUgaGVhcCB3YXNuJ3QKKwkJCSAqIHByZXZpb3VzbHkgZnVsbAorCQkJICovCisJCQlnZXRfdGFza19zdHJ1Y3QocCk7CisJCX0gZWxzZSBpZiAoZHJvcHBlZCAhPSBwKSB7CisJCQkvKgorCQkJICogVGhlIG5ldyB0YXNrIHdhcyBpbnNlcnRlZCwgYW5kIHB1c2hlZCBvdXQgYQorCQkJICogZGlmZmVyZW50IHRhc2sKKwkJCSAqLworCQkJZ2V0X3Rhc2tfc3RydWN0KHApOworCQkJcHV0X3Rhc2tfc3RydWN0KGRyb3BwZWQpOworCQl9CisJCS8qCisJCSAqIEVsc2UgdGhlIG5ldyB0YXNrIHdhcyBuZXdlciB0aGFuIGFueXRoaW5nIGFscmVhZHkgaW4KKwkJICogdGhlIGhlYXAgYW5kIHdhc24ndCBpbnNlcnRlZAorCQkgKi8KKwl9CisJY2dyb3VwX2l0ZXJfZW5kKHNjYW4tPmNnLCAmaXQpOworCisJaWYgKGhlYXAtPnNpemUpIHsKKwkJZm9yIChpID0gMDsgaSA8IGhlYXAtPnNpemU7IGkrKykgeworCQkJc3RydWN0IHRhc2tfc3RydWN0ICpwID0gaGVhcC0+cHRyc1tpXTsKKwkJCWlmIChpID09IDApIHsKKwkJCQlsYXRlc3RfdGltZSA9IHAtPnN0YXJ0X3RpbWU7CisJCQkJbGF0ZXN0X3Rhc2sgPSBwOworCQkJfQorCQkJLyogUHJvY2VzcyB0aGUgdGFzayBwZXIgdGhlIGNhbGxlcidzIGNhbGxiYWNrICovCisJCQlzY2FuLT5wcm9jZXNzX3Rhc2socCwgc2Nhbik7CisJCQlwdXRfdGFza19zdHJ1Y3QocCk7CisJCX0KKwkJLyoKKwkJICogSWYgd2UgaGFkIHRvIHByb2Nlc3MgYW55IHRhc2tzIGF0IGFsbCwgc2NhbiBhZ2FpbgorCQkgKiBpbiBjYXNlIHNvbWUgb2YgdGhlbSB3ZXJlIGluIHRoZSBtaWRkbGUgb2YgZm9ya2luZworCQkgKiBjaGlsZHJlbiB0aGF0IGRpZG4ndCBnZXQgcHJvY2Vzc2VkLgorCQkgKiBOb3QgdGhlIG1vc3QgZWZmaWNpZW50IHdheSB0byBkbyBpdCwgYnV0IGl0IGF2b2lkcworCQkgKiBoYXZpbmcgdG8gdGFrZSBjYWxsYmFja19tdXRleCBpbiB0aGUgZm9yayBwYXRoCisJCSAqLworCQlnb3RvIGFnYWluOworCX0KKwlpZiAoaGVhcCA9PSAmdG1wX2hlYXApCisJCWhlYXBfZnJlZSgmdG1wX2hlYXApOworCXJldHVybiAwOworfQorCiAvKgogICogU3R1ZmYgZm9yIHJlYWRpbmcgdGhlICd0YXNrcycgZmlsZS4KICAqCkBAIC0xNzYxLDcgKzE5NTUsNyBAQAogCXdoaWxlICgodHNrID0gY2dyb3VwX2l0ZXJfbmV4dChjZ3JwLCAmaXQpKSkgewogCQlpZiAodW5saWtlbHkobiA9PSBucGlkcykpCiAJCQlicmVhazsKLQkJcGlkYXJyYXlbbisrXSA9IHRhc2tfcGlkX25yKHRzayk7CisJCXBpZGFycmF5W24rK10gPSB0YXNrX3BpZF92bnIodHNrKTsKIAl9CiAJY2dyb3VwX2l0ZXJfZW5kKGNncnAsICZpdCk7CiAJcmV0dXJuIG47CkBAIC0yMTI2LDkgKzIzMjAsOCBAQAogCQkgKiBtYXR0ZXIsIHNpbmNlIGl0IGNhbiBvbmx5IGhhcHBlbiBpZiB0aGUgY2dyb3VwCiAJCSAqIGhhcyBiZWVuIGRlbGV0ZWQgYW5kIGhlbmNlIG5vIGxvbmdlciBuZWVkcyB0aGUKIAkJICogcmVsZWFzZSBhZ2VudCB0byBiZSBjYWxsZWQgYW55d2F5LiAqLwotCQlpZiAoY3NzICYmIGF0b21pY19yZWFkKCZjc3MtPnJlZmNudCkpIHsKKwkJaWYgKGNzcyAmJiBhdG9taWNfcmVhZCgmY3NzLT5yZWZjbnQpKQogCQkJcmV0dXJuIDE7Ci0JCX0KIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0yMTM4LDcgKzIzMzEsNiBAQAogCXN0cnVjdCBjZ3JvdXAgKmNncnAgPSBkZW50cnktPmRfZnNkYXRhOwogCXN0cnVjdCBkZW50cnkgKmQ7CiAJc3RydWN0IGNncm91cCAqcGFyZW50OwotCXN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzczsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwogCXN0cnVjdCBjZ3JvdXBmc19yb290ICpyb290OwogCkBAIC0yMTU3LDE3ICsyMzQ5LDE5IEBACiAJcGFyZW50ID0gY2dycC0+cGFyZW50OwogCXJvb3QgPSBjZ3JwLT5yb290OwogCXNiID0gcm9vdC0+c2I7CisJLyoKKwkgKiBDYWxsIHByZV9kZXN0cm95IGhhbmRsZXJzIG9mIHN1YnN5cworCSAqLworCWNncm91cF9jYWxsX3ByZV9kZXN0cm95KGNncnApOworCS8qCisJICogTm90aWZ5IHN1YnN5c2VzIHRoYXQgcm1kaXIoKSByZXF1ZXN0IGNvbWVzLgorCSAqLwogCiAJaWYgKGNncm91cF9oYXNfY3NzX3JlZnMoY2dycCkpIHsKIAkJbXV0ZXhfdW5sb2NrKCZjZ3JvdXBfbXV0ZXgpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCWZvcl9lYWNoX3N1YnN5cyhyb290LCBzcykgewotCQlpZiAoY2dycC0+c3Vic3lzW3NzLT5zdWJzeXNfaWRdKQotCQkJc3MtPmRlc3Ryb3koc3MsIGNncnApOwotCX0KLQogCXNwaW5fbG9jaygmcmVsZWFzZV9saXN0X2xvY2spOwogCXNldF9iaXQoQ0dSUF9SRU1PVkVELCAmY2dycC0+ZmxhZ3MpOwogCWlmICghbGlzdF9lbXB0eSgmY2dycC0+cmVsZWFzZV9saXN0KSkKQEAgLTIxODIsMTUgKzIzNzYsMTEgQEAKIAogCWNncm91cF9kX3JlbW92ZV9kaXIoZCk7CiAJZHB1dChkKTsKLQlyb290LT5udW1iZXJfb2ZfY2dyb3Vwcy0tOwogCiAJc2V0X2JpdChDR1JQX1JFTEVBU0FCTEUsICZwYXJlbnQtPmZsYWdzKTsKIAljaGVja19mb3JfcmVsZWFzZShwYXJlbnQpOwogCiAJbXV0ZXhfdW5sb2NrKCZjZ3JvdXBfbXV0ZXgpOwotCS8qIERyb3AgdGhlIGFjdGl2ZSBzdXBlcmJsb2NrIHJlZmVyZW5jZSB0aGF0IHdlIHRvb2sgd2hlbiB3ZQotCSAqIGNyZWF0ZWQgdGhlIGNncm91cCAqLwotCWRlYWN0aXZhdGVfc3VwZXIoc2IpOwogCXJldHVybiAwOwogfQogCkBAIC0yMzI0LDcgKzI1MTQsNyBAQAogICogIC0gVXNlZCBmb3IgL3Byb2MvPHBpZD4vY2dyb3VwLgogICogIC0gTm8gbmVlZCB0byB0YXNrX2xvY2sodHNrKSBvbiB0aGlzIHRzay0+Y2dyb3VwIHJlZmVyZW5jZSwgYXMgaXQKICAqICAgIGRvZXNuJ3QgcmVhbGx5IG1hdHRlciBpZiB0c2stPmNncm91cCBjaGFuZ2VzIGFmdGVyIHdlIHJlYWQgaXQsCi0gKiAgICBhbmQgd2UgdGFrZSBjZ3JvdXBfbXV0ZXgsIGtlZXBpbmcgYXR0YWNoX3Rhc2soKSBmcm9tIGNoYW5naW5nIGl0CisgKiAgICBhbmQgd2UgdGFrZSBjZ3JvdXBfbXV0ZXgsIGtlZXBpbmcgY2dyb3VwX2F0dGFjaF90YXNrKCkgZnJvbSBjaGFuZ2luZyBpdAogICogICAgYW55d2F5LiAgTm8gbmVlZCB0byBjaGVjayB0aGF0IHRzay0+Y2dyb3VwICE9IE5VTEwsIHRoYW5rcyB0bwogICogICAgdGhlX3RvcF9jZ3JvdXBfaGFjayBpbiBjZ3JvdXBfZXhpdCgpLCB3aGljaCBzZXRzIGFuIGV4aXRpbmcgdGFza3MKICAqICAgIGNncm91cCB0byB0b3BfY2dyb3VwLgpAQCAtMjQzNSw3ICsyNjI1LDcgQEAKICAqIEEgcG9pbnRlciB0byB0aGUgc2hhcmVkIGNzc19zZXQgd2FzIGF1dG9tYXRpY2FsbHkgY29waWVkIGluCiAgKiBmb3JrLmMgYnkgZHVwX3Rhc2tfc3RydWN0KCkuICBIb3dldmVyLCB3ZSBpZ25vcmUgdGhhdCBjb3B5LCBzaW5jZQogICogaXQgd2FzIG5vdCBtYWRlIHVuZGVyIHRoZSBwcm90ZWN0aW9uIG9mIFJDVSBvciBjZ3JvdXBfbXV0ZXgsIHNvCi0gKiBtaWdodCBubyBsb25nZXIgYmUgYSB2YWxpZCBjZ3JvdXAgcG9pbnRlci4gIGF0dGFjaF90YXNrKCkgbWlnaHQKKyAqIG1pZ2h0IG5vIGxvbmdlciBiZSBhIHZhbGlkIGNncm91cCBwb2ludGVyLiAgY2dyb3VwX2F0dGFjaF90YXNrKCkgbWlnaHQKICAqIGhhdmUgYWxyZWFkeSBjaGFuZ2VkIGN1cnJlbnQtPmNncm91cHMsIGFsbG93aW5nIHRoZSBwcmV2aW91c2x5CiAgKiByZWZlcmVuY2VkIGNncm91cCBncm91cCB0byBiZSByZW1vdmVkIGFuZCBmcmVlZC4KICAqCkBAIC0yNTE0LDggKzI3MDQsOCBAQAogICogICAgYXR0YWNoIHVzIHRvIGEgZGlmZmVyZW50IGNncm91cCwgZGVjcmVtZW50aW5nIHRoZSBjb3VudCBvbgogICogICAgdGhlIGZpcnN0IGNncm91cCB0aGF0IHdlIG5ldmVyIGluY3JlbWVudGVkLiAgQnV0IGluIHRoaXMgY2FzZSwKICAqICAgIHRvcF9jZ3JvdXAgaXNuJ3QgZ29pbmcgYXdheSwgYW5kIGVpdGhlciB0YXNrIGhhcyBQRl9FWElUSU5HIHNldCwKLSAqICAgIHdoaWNoIHdhcmRzIG9mZiBhbnkgYXR0YWNoX3Rhc2soKSBhdHRlbXB0cywgb3IgdGFzayBpcyBhIGZhaWxlZAotICogICAgZm9yaywgbmV2ZXIgdmlzaWJsZSB0byBhdHRhY2hfdGFzay4KKyAqICAgIHdoaWNoIHdhcmRzIG9mZiBhbnkgY2dyb3VwX2F0dGFjaF90YXNrKCkgYXR0ZW1wdHMsIG9yIHRhc2sgaXMgYSBmYWlsZWQKKyAqICAgIGZvcmssIG5ldmVyIHZpc2libGUgdG8gY2dyb3VwX2F0dGFjaF90YXNrLgogICoKICAqLwogdm9pZCBjZ3JvdXBfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IHJ1bl9jYWxsYmFja3MpCkBAIC0yNjU1LDcgKzI4NDUsNyBAQAogCX0KIAogCS8qIEFsbCBzZWVtcyBmaW5lLiBGaW5pc2ggYnkgbW92aW5nIHRoZSB0YXNrIGludG8gdGhlIG5ldyBjZ3JvdXAgKi8KLQlyZXQgPSBhdHRhY2hfdGFzayhjaGlsZCwgdHNrKTsKKwlyZXQgPSBjZ3JvdXBfYXR0YWNoX3Rhc2soY2hpbGQsIHRzayk7CiAJbXV0ZXhfdW5sb2NrKCZjZ3JvdXBfbXV0ZXgpOwogCiAgb3V0X3JlbGVhc2U6CmRpZmYgLS1naXQgYS9rZXJuZWwvY3B1LmMgYi9rZXJuZWwvY3B1LmMKaW5kZXggZTBkM2E0Zi4uMmVmZjNmNiAxMDA2NDQKLS0tIGEva2VybmVsL2NwdS5jCisrKyBiL2tlcm5lbC9jcHUuYwpAQCAtMzg5LDcgKzM4OSw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi12b2lkIGVuYWJsZV9ub25ib290X2NwdXModm9pZCkKK3ZvaWQgX19yZWYgZW5hYmxlX25vbmJvb3RfY3B1cyh2b2lkKQogewogCWludCBjcHUsIGVycm9yOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvY3B1c2V0LmMgYi9rZXJuZWwvY3B1c2V0LmMKaW5kZXggY2ZhZjY0MS4uM2UyOTZlZCAxMDA2NDQKLS0tIGEva2VybmVsL2NwdXNldC5jCisrKyBiL2tlcm5lbC9jcHVzZXQuYwpAQCAtMzgsNyArMzgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJpb19oZWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTU2LDYgKzU1LDggQEAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nncm91cC5oPgogCiAvKgogICogVHJhY2tzIGhvdyBtYW55IGNwdXNldHMgYXJlIGN1cnJlbnRseSBkZWZpbmVkIGluIHN5c3RlbS4KQEAgLTY0LDcgKzY1LDcgQEAKICAqLwogaW50IG51bWJlcl9vZl9jcHVzZXRzIF9fcmVhZF9tb3N0bHk7CiAKLS8qIFJldHJpZXZlIHRoZSBjcHVzZXQgZnJvbSBhIGNncm91cCAqLworLyogRm9yd2FyZCBkZWNsYXJlIGNncm91cCBzdHJ1Y3R1cmVzICovCiBzdHJ1Y3QgY2dyb3VwX3N1YnN5cyBjcHVzZXRfc3Vic3lzOwogc3RydWN0IGNwdXNldDsKIApAQCAtOTYsNiArOTcsOSBAQAogCiAJLyogcGFydGl0aW9uIG51bWJlciBmb3IgcmVidWlsZF9zY2hlZF9kb21haW5zKCkgKi8KIAlpbnQgcG47CisKKwkvKiB1c2VkIGZvciB3YWxraW5nIGEgY3B1c2V0IGhlaXJhcmNoeSAqLworCXN0cnVjdCBsaXN0X2hlYWQgc3RhY2tfbGlzdDsKIH07CiAKIC8qIFJldHJpZXZlIHRoZSBjcHVzZXQgZm9yIGEgY2dyb3VwICovCkBAIC0xMTEsNyArMTE1LDEwIEBACiAJcmV0dXJuIGNvbnRhaW5lcl9vZih0YXNrX3N1YnN5c19zdGF0ZSh0YXNrLCBjcHVzZXRfc3Vic3lzX2lkKSwKIAkJCSAgICBzdHJ1Y3QgY3B1c2V0LCBjc3MpOwogfQotCitzdHJ1Y3QgY3B1c2V0X2hvdHBsdWdfc2Nhbm5lciB7CisJc3RydWN0IGNncm91cF9zY2FubmVyIHNjYW47CisJc3RydWN0IGNncm91cCAqdG87Cit9OwogCiAvKiBiaXRzIGluIHN0cnVjdCBjcHVzZXQgZmxhZ3MgZmllbGQgKi8KIHR5cGVkZWYgZW51bSB7CkBAIC0xNjAsMTcgKzE2NywxNyBAQAogICogbnVtYmVyLCBhbmQgYXZvaWQgaGF2aW5nIHRvIGxvY2sgYW5kIHJlbG9hZCBtZW1zX2FsbG93ZWQgdW5sZXNzCiAgKiB0aGUgY3B1c2V0IHRoZXkncmUgdXNpbmcgY2hhbmdlcyBnZW5lcmF0aW9uLgogICoKLSAqIEEgc2luZ2xlLCBnbG9iYWwgZ2VuZXJhdGlvbiBpcyBuZWVkZWQgYmVjYXVzZSBhdHRhY2hfdGFzaygpIGNvdWxkCisgKiBBIHNpbmdsZSwgZ2xvYmFsIGdlbmVyYXRpb24gaXMgbmVlZGVkIGJlY2F1c2UgY3B1c2V0X2F0dGFjaF90YXNrKCkgY291bGQKICAqIHJlYXR0YWNoIGEgdGFzayB0byBhIGRpZmZlcmVudCBjcHVzZXQsIHdoaWNoIG11c3Qgbm90IGhhdmUgaXRzCiAgKiBnZW5lcmF0aW9uIG51bWJlcnMgYWxpYXNlZCB3aXRoIHRob3NlIG9mIHRoYXQgdGFza3MgcHJldmlvdXMgY3B1c2V0LgogICoKICAqIEdlbmVyYXRpb25zIGFyZSBuZWVkZWQgZm9yIG1lbXNfYWxsb3dlZCBiZWNhdXNlIG9uZSB0YXNrIGNhbm5vdAotICogbW9kaWZ5IGFub3RoZXJzIG1lbW9yeSBwbGFjZW1lbnQuICBTbyB3ZSBtdXN0IGVuYWJsZSBldmVyeSB0YXNrLAorICogbW9kaWZ5IGFub3RoZXIncyBtZW1vcnkgcGxhY2VtZW50LiAgU28gd2UgbXVzdCBlbmFibGUgZXZlcnkgdGFzaywKICAqIG9uIGV2ZXJ5IHZpc2l0IHRvIF9fYWxsb2NfcGFnZXMoKSwgdG8gZWZmaWNpZW50bHkgY2hlY2sgd2hldGhlcgogICogaXRzIGN1cnJlbnQtPmNwdXNldC0+bWVtc19hbGxvd2VkIGhhcyBjaGFuZ2VkLCByZXF1aXJpbmcgYW4gdXBkYXRlCiAgKiBvZiBpdHMgY3VycmVudC0+bWVtc19hbGxvd2VkLgogICoKLSAqIFNpbmNlIGNwdXNldF9tZW1zX2dlbmVyYXRpb24gaXMgZ3VhcmRlZCBieSBtYW5hZ2VfbXV0ZXgsCisgKiBTaW5jZSB3cml0ZXMgdG8gY3B1c2V0X21lbXNfZ2VuZXJhdGlvbiBhcmUgZ3VhcmRlZCBieSB0aGUgY2dyb3VwIGxvY2sKICAqIHRoZXJlIGlzIG5vIG5lZWQgdG8gbWFyayBpdCBhdG9taWMuCiAgKi8KIHN0YXRpYyBpbnQgY3B1c2V0X21lbXNfZ2VuZXJhdGlvbjsKQEAgLTE4MiwxNyArMTg5LDIwIEBACiB9OwogCiAvKgotICogV2UgaGF2ZSB0d28gZ2xvYmFsIGNwdXNldCBtdXRleGVzIGJlbG93LiAgVGhleSBjYW4gbmVzdC4KLSAqIEl0IGlzIG9rIHRvIGZpcnN0IHRha2UgbWFuYWdlX211dGV4LCB0aGVuIG5lc3QgY2FsbGJhY2tfbXV0ZXguICBXZSBhbHNvCi0gKiByZXF1aXJlIHRha2luZyB0YXNrX2xvY2soKSB3aGVuIGRlcmVmZXJlbmNpbmcgYSB0YXNrcyBjcHVzZXQgcG9pbnRlci4KLSAqIFNlZSAiVGhlIHRhc2tfbG9jaygpIGV4Y2VwdGlvbiIsIGF0IHRoZSBlbmQgb2YgdGhpcyBjb21tZW50LgorICogVGhlcmUgYXJlIHR3byBnbG9iYWwgbXV0ZXhlcyBndWFyZGluZyBjcHVzZXQgc3RydWN0dXJlcy4gIFRoZSBmaXJzdAorICogaXMgdGhlIG1haW4gY29udHJvbCBncm91cHMgY2dyb3VwX211dGV4LCBhY2Nlc3NlZCB2aWEKKyAqIGNncm91cF9sb2NrKCkvY2dyb3VwX3VubG9jaygpLiAgVGhlIHNlY29uZCBpcyB0aGUgY3B1c2V0LXNwZWNpZmljCisgKiBjYWxsYmFja19tdXRleCwgYmVsb3cuIFRoZXkgY2FuIG5lc3QuICBJdCBpcyBvayB0byBmaXJzdCB0YWtlCisgKiBjZ3JvdXBfbXV0ZXgsIHRoZW4gbmVzdCBjYWxsYmFja19tdXRleC4gIFdlIGFsc28gcmVxdWlyZSB0YWtpbmcKKyAqIHRhc2tfbG9jaygpIHdoZW4gZGVyZWZlcmVuY2luZyBhIHRhc2sncyBjcHVzZXQgcG9pbnRlci4gIFNlZSAiVGhlCisgKiB0YXNrX2xvY2soKSBleGNlcHRpb24iLCBhdCB0aGUgZW5kIG9mIHRoaXMgY29tbWVudC4KICAqCiAgKiBBIHRhc2sgbXVzdCBob2xkIGJvdGggbXV0ZXhlcyB0byBtb2RpZnkgY3B1c2V0cy4gIElmIGEgdGFzawotICogaG9sZHMgbWFuYWdlX211dGV4LCB0aGVuIGl0IGJsb2NrcyBvdGhlcnMgd2FudGluZyB0aGF0IG11dGV4LAorICogaG9sZHMgY2dyb3VwX211dGV4LCB0aGVuIGl0IGJsb2NrcyBvdGhlcnMgd2FudGluZyB0aGF0IG11dGV4LAogICogZW5zdXJpbmcgdGhhdCBpdCBpcyB0aGUgb25seSB0YXNrIGFibGUgdG8gYWxzbyBhY3F1aXJlIGNhbGxiYWNrX211dGV4CiAgKiBhbmQgYmUgYWJsZSB0byBtb2RpZnkgY3B1c2V0cy4gIEl0IGNhbiBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzIG9uCiAgKiB0aGUgY3B1c2V0IHN0cnVjdHVyZSBmaXJzdCwga25vd2luZyBub3RoaW5nIHdpbGwgY2hhbmdlLiAgSXQgY2FuCi0gKiBhbHNvIGFsbG9jYXRlIG1lbW9yeSB3aGlsZSBqdXN0IGhvbGRpbmcgbWFuYWdlX211dGV4LiAgV2hpbGUgaXQgaXMKKyAqIGFsc28gYWxsb2NhdGUgbWVtb3J5IHdoaWxlIGp1c3QgaG9sZGluZyBjZ3JvdXBfbXV0ZXguICBXaGlsZSBpdCBpcwogICogcGVyZm9ybWluZyB0aGVzZSBjaGVja3MsIHZhcmlvdXMgY2FsbGJhY2sgcm91dGluZXMgY2FuIGJyaWVmbHkKICAqIGFjcXVpcmUgY2FsbGJhY2tfbXV0ZXggdG8gcXVlcnkgY3B1c2V0cy4gIE9uY2UgaXQgaXMgcmVhZHkgdG8gbWFrZQogICogdGhlIGNoYW5nZXMsIGl0IHRha2VzIGNhbGxiYWNrX211dGV4LCBibG9ja2luZyBldmVyeW9uZSBlbHNlLgpAQCAtMjA4LDYwICsyMTgsMTYgQEAKICAqIFRoZSB0YXNrX3N0cnVjdCBmaWVsZHMgbWVtc19hbGxvd2VkIGFuZCBtZW1zX2dlbmVyYXRpb24gbWF5IG9ubHkKICAqIGJlIGFjY2Vzc2VkIGluIHRoZSBjb250ZXh0IG9mIHRoYXQgdGFzaywgc28gcmVxdWlyZSBubyBsb2Nrcy4KICAqCi0gKiBBbnkgdGFzayBjYW4gaW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgdGhlIGNvdW50IGZpZWxkIHdpdGhvdXQgbG9jay4KLSAqIFNvIGluIGdlbmVyYWwsIGNvZGUgaG9sZGluZyBtYW5hZ2VfbXV0ZXggb3IgY2FsbGJhY2tfbXV0ZXggY2FuJ3QgcmVseQotICogb24gdGhlIGNvdW50IGZpZWxkIG5vdCBjaGFuZ2luZy4gIEhvd2V2ZXIsIGlmIHRoZSBjb3VudCBnb2VzIHRvCi0gKiB6ZXJvLCB0aGVuIG9ubHkgYXR0YWNoX3Rhc2soKSwgd2hpY2ggaG9sZHMgYm90aCBtdXRleGVzLCBjYW4KLSAqIGluY3JlbWVudCBpdCBhZ2Fpbi4gIEJlY2F1c2UgYSBjb3VudCBvZiB6ZXJvIG1lYW5zIHRoYXQgbm8gdGFza3MKLSAqIGFyZSBjdXJyZW50bHkgYXR0YWNoZWQsIHRoZXJlZm9yZSB0aGVyZSBpcyBubyB3YXkgYSB0YXNrIGF0dGFjaGVkCi0gKiB0byB0aGF0IGNwdXNldCBjYW4gZm9yayAodGhlIG90aGVyIHdheSB0byBpbmNyZW1lbnQgdGhlIGNvdW50KS4KLSAqIFNvIGNvZGUgaG9sZGluZyBtYW5hZ2VfbXV0ZXggb3IgY2FsbGJhY2tfbXV0ZXggY2FuIHNhZmVseSBhc3N1bWUgdGhhdAotICogaWYgdGhlIGNvdW50IGlzIHplcm8sIGl0IHdpbGwgc3RheSB6ZXJvLiAgU2ltaWxhcmx5LCBpZiBhIHRhc2sKLSAqIGhvbGRzIG1hbmFnZV9tdXRleCBvciBjYWxsYmFja19tdXRleCBvbiBhIGNwdXNldCB3aXRoIHplcm8gY291bnQsIGl0Ci0gKiBrbm93cyB0aGF0IHRoZSBjcHVzZXQgd29uJ3QgYmUgcmVtb3ZlZCwgYXMgY3B1c2V0X3JtZGlyKCkgbmVlZHMKLSAqIGJvdGggb2YgdGhvc2UgbXV0ZXhlcy4KLSAqCiAgKiBUaGUgY3B1c2V0X2NvbW1vbl9maWxlX3dyaXRlIGhhbmRsZXIgZm9yIG9wZXJhdGlvbnMgdGhhdCBtb2RpZnkKLSAqIHRoZSBjcHVzZXQgaGllcmFyY2h5IGhvbGRzIG1hbmFnZV9tdXRleCBhY3Jvc3MgdGhlIGVudGlyZSBvcGVyYXRpb24sCisgKiB0aGUgY3B1c2V0IGhpZXJhcmNoeSBob2xkcyBjZ3JvdXBfbXV0ZXggYWNyb3NzIHRoZSBlbnRpcmUgb3BlcmF0aW9uLAogICogc2luZ2xlIHRocmVhZGluZyBhbGwgc3VjaCBjcHVzZXQgbW9kaWZpY2F0aW9ucyBhY3Jvc3MgdGhlIHN5c3RlbS4KICAqCiAgKiBUaGUgY3B1c2V0X2NvbW1vbl9maWxlX3JlYWQoKSBoYW5kbGVycyBvbmx5IGhvbGQgY2FsbGJhY2tfbXV0ZXggYWNyb3NzCiAgKiBzbWFsbCBwaWVjZXMgb2YgY29kZSwgc3VjaCBhcyB3aGVuIHJlYWRpbmcgb3V0IHBvc3NpYmx5IG11bHRpLXdvcmQKICAqIGNwdW1hc2tzIGFuZCBub2RlbWFza3MuCiAgKgotICogVGhlIGZvcmsgYW5kIGV4aXQgY2FsbGJhY2tzIGNwdXNldF9mb3JrKCkgYW5kIGNwdXNldF9leGl0KCksIGRvbid0Ci0gKiAodXN1YWxseSkgdGFrZSBlaXRoZXIgbXV0ZXguICBUaGVzZSBhcmUgdGhlIHR3byBtb3N0IHBlcmZvcm1hbmNlCi0gKiBjcml0aWNhbCBwaWVjZXMgb2YgY29kZSBoZXJlLiAgVGhlIGV4Y2VwdGlvbiBvY2N1cnMgb24gY3B1c2V0X2V4aXQoKSwKLSAqIHdoZW4gYSB0YXNrIGluIGEgbm90aWZ5X29uX3JlbGVhc2UgY3B1c2V0IGV4aXRzLiAgVGhlbiBtYW5hZ2VfbXV0ZXgKLSAqIGlzIHRha2VuLCBhbmQgaWYgdGhlIGNwdXNldCBjb3VudCBpcyB6ZXJvLCBhIHVzZXJtb2RlIGNhbGwgbWFkZQotICogdG8gL3NiaW4vY3B1c2V0X3JlbGVhc2VfYWdlbnQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgY3B1c2V0IChwYXRoCi0gKiByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiBjcHVzZXQgZmlsZSBzeXN0ZW0pIGFzIHRoZSBhcmd1bWVudC4KLSAqCi0gKiBBIGNwdXNldCBjYW4gb25seSBiZSBkZWxldGVkIGlmIGJvdGggaXRzICdjb3VudCcgb2YgdXNpbmcgdGFza3MKLSAqIGlzIHplcm8sIGFuZCBpdHMgbGlzdCBvZiAnY2hpbGRyZW4nIGNwdXNldHMgaXMgZW1wdHkuICBTaW5jZSBhbGwKLSAqIHRhc2tzIGluIHRoZSBzeXN0ZW0gdXNlIF9zb21lXyBjcHVzZXQsIGFuZCBzaW5jZSB0aGVyZSBpcyBhbHdheXMgYXQKLSAqIGxlYXN0IG9uZSB0YXNrIGluIHRoZSBzeXN0ZW0gKGluaXQpLCB0aGVyZWZvcmUsIHRvcF9jcHVzZXQKLSAqIGFsd2F5cyBoYXMgZWl0aGVyIGNoaWxkcmVuIGNwdXNldHMgYW5kL29yIHVzaW5nIHRhc2tzLiAgU28gd2UgZG9uJ3QKLSAqIG5lZWQgYSBzcGVjaWFsIGhhY2sgdG8gZW5zdXJlIHRoYXQgdG9wX2NwdXNldCBjYW5ub3QgYmUgZGVsZXRlZC4KLSAqCi0gKiBUaGUgYWJvdmUgIlRhbGUgb2YgVHdvIFNlbWFwaG9yZXMiIHdvdWxkIGJlIGNvbXBsZXRlLCBidXQgZm9yOgotICoKLSAqCVRoZSB0YXNrX2xvY2soKSBleGNlcHRpb24KLSAqCi0gKiBUaGUgbmVlZCBmb3IgdGhpcyBleGNlcHRpb24gYXJpc2VzIGZyb20gdGhlIGFjdGlvbiBvZiBhdHRhY2hfdGFzaygpLAotICogd2hpY2ggb3ZlcndyaXRlcyBvbmUgdGFza3MgY3B1c2V0IHBvaW50ZXIgd2l0aCBhbm90aGVyLiAgSXQgZG9lcwotICogc28gdXNpbmcgYm90aCBtdXRleGVzLCBob3dldmVyIHRoZXJlIGFyZSBzZXZlcmFsIHBlcmZvcm1hbmNlCi0gKiBjcml0aWNhbCBwbGFjZXMgdGhhdCBuZWVkIHRvIHJlZmVyZW5jZSB0YXNrLT5jcHVzZXQgd2l0aG91dCB0aGUKLSAqIGV4cGVuc2Ugb2YgZ3JhYmJpbmcgYSBzeXN0ZW0gZ2xvYmFsIG11dGV4LiAgVGhlcmVmb3JlIGV4Y2VwdCBhcwotICogbm90ZWQgYmVsb3csIHdoZW4gZGVyZWZlcmVuY2luZyBvciwgYXMgaW4gYXR0YWNoX3Rhc2soKSwgbW9kaWZ5aW5nCi0gKiBhIHRhc2tzIGNwdXNldCBwb2ludGVyIHdlIHVzZSB0YXNrX2xvY2soKSwgd2hpY2ggYWN0cyBvbiBhIHNwaW5sb2NrCi0gKiAodGFzay0+YWxsb2NfbG9jaykgYWxyZWFkeSBpbiB0aGUgdGFza19zdHJ1Y3Qgcm91dGluZWx5IHVzZWQgZm9yCi0gKiBzdWNoIG1hdHRlcnMuCi0gKgotICogUC5TLiAgT25lIG1vcmUgbG9ja2luZyBleGNlcHRpb24uICBSQ1UgaXMgdXNlZCB0byBndWFyZCB0aGUKLSAqIHVwZGF0ZSBvZiBhIHRhc2tzIGNwdXNldCBwb2ludGVyIGJ5IGF0dGFjaF90YXNrKCkgYW5kIHRoZQotICogYWNjZXNzIG9mIHRhc2stPmNwdXNldC0+bWVtc19nZW5lcmF0aW9uIHZpYSB0aGF0IHBvaW50ZXIgaW4KLSAqIHRoZSByb3V0aW5lIGNwdXNldF91cGRhdGVfdGFza19tZW1vcnlfc3RhdGUoKS4KKyAqIEFjY2Vzc2luZyBhIHRhc2sncyBjcHVzZXQgc2hvdWxkIGJlIGRvbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQorICogZ3VpZGVsaW5lcyBmb3IgYWNjZXNzaW5nIHN1YnN5c3RlbSBzdGF0ZSBpbiBrZXJuZWwvY2dyb3VwLmMKICAqLwogCiBzdGF0aWMgREVGSU5FX01VVEVYKGNhbGxiYWNrX211dGV4KTsKQEAgLTM1NCwxNSArMzIwLDE0IEBACiAgKiBEbyBub3QgY2FsbCB0aGlzIHJvdXRpbmUgaWYgaW5faW50ZXJydXB0KCkuCiAgKgogICogQ2FsbCB3aXRob3V0IGNhbGxiYWNrX211dGV4IG9yIHRhc2tfbG9jaygpIGhlbGQuICBNYXkgYmUKLSAqIGNhbGxlZCB3aXRoIG9yIHdpdGhvdXQgbWFuYWdlX211dGV4IGhlbGQuICBUaGFua3MgaW4gcGFydCB0bwotICogJ3RoZV90b3BfY3B1c2V0X2hhY2snLCB0aGUgdGFza3MgY3B1c2V0IHBvaW50ZXIgd2lsbCBuZXZlcgorICogY2FsbGVkIHdpdGggb3Igd2l0aG91dCBjZ3JvdXBfbXV0ZXggaGVsZC4gIFRoYW5rcyBpbiBwYXJ0IHRvCisgKiAndGhlX3RvcF9jcHVzZXRfaGFjaycsIHRoZSB0YXNrJ3MgY3B1c2V0IHBvaW50ZXIgd2lsbCBuZXZlcgogICogYmUgTlVMTC4gIFRoaXMgcm91dGluZSBhbHNvIG1pZ2h0IGFjcXVpcmUgY2FsbGJhY2tfbXV0ZXggYW5kCiAgKiBjdXJyZW50LT5tbS0+bW1hcF9zZW0gZHVyaW5nIGNhbGwuCiAgKgogICogUmVhZGluZyBjdXJyZW50LT5jcHVzZXQtPm1lbXNfZ2VuZXJhdGlvbiBkb2Vzbid0IG5lZWQgdGFza19sb2NrCiAgKiB0byBndWFyZCB0aGUgY3VycmVudC0+Y3B1c2V0IGRlcmVmZW5jZSwgYmVjYXVzZSBpdCBpcyBndWFyZGVkCi0gKiBmcm9tIGNvbmN1cnJlbnQgZnJlZWluZyBvZiBjdXJyZW50LT5jcHVzZXQgYnkgYXR0YWNoX3Rhc2soKSwKLSAqIHVzaW5nIFJDVS4KKyAqIGZyb20gY29uY3VycmVudCBmcmVlaW5nIG9mIGN1cnJlbnQtPmNwdXNldCB1c2luZyBSQ1UuCiAgKgogICogVGhlIHJjdV9kZXJlZmVyZW5jZSgpIGlzIHRlY2huaWNhbGx5IHByb2JhYmx5IG5vdCBuZWVkZWQsCiAgKiBhcyBJIGRvbid0IGFjdHVhbGx5IG1pbmQgaWYgSSBzZWUgYSBuZXcgY3B1c2V0IHBvaW50ZXIgYnV0CkBAIC00MjQsNyArMzg5LDcgQEAKICAqCiAgKiBPbmUgY3B1c2V0IGlzIGEgc3Vic2V0IG9mIGFub3RoZXIgaWYgYWxsIGl0cyBhbGxvd2VkIENQVXMgYW5kCiAgKiBNZW1vcnkgTm9kZXMgYXJlIGEgc3Vic2V0IG9mIHRoZSBvdGhlciwgYW5kIGl0cyBleGNsdXNpdmUgZmxhZ3MKLSAqIGFyZSBvbmx5IHNldCBpZiB0aGUgb3RoZXIncyBhcmUgc2V0LiAgQ2FsbCBob2xkaW5nIG1hbmFnZV9tdXRleC4KKyAqIGFyZSBvbmx5IHNldCBpZiB0aGUgb3RoZXIncyBhcmUgc2V0LiAgQ2FsbCBob2xkaW5nIGNncm91cF9tdXRleC4KICAqLwogCiBzdGF0aWMgaW50IGlzX2NwdXNldF9zdWJzZXQoY29uc3Qgc3RydWN0IGNwdXNldCAqcCwgY29uc3Qgc3RydWN0IGNwdXNldCAqcSkKQEAgLTQ0Miw3ICs0MDcsNyBAQAogICogSWYgd2UgcmVwbGFjZWQgdGhlIGZsYWcgYW5kIG1hc2sgdmFsdWVzIG9mIHRoZSBjdXJyZW50IGNwdXNldAogICogKGN1cikgd2l0aCB0aG9zZSB2YWx1ZXMgaW4gdGhlIHRyaWFsIGNwdXNldCAodHJpYWwpLCB3b3VsZAogICogb3VyIHZhcmlvdXMgc3Vic2V0IGFuZCBleGNsdXNpdmUgcnVsZXMgc3RpbGwgYmUgdmFsaWQ/ICBQcmVzdW1lcwotICogbWFuYWdlX211dGV4IGhlbGQuCisgKiBjZ3JvdXBfbXV0ZXggaGVsZC4KICAqCiAgKiAnY3VyJyBpcyB0aGUgYWRkcmVzcyBvZiBhbiBhY3R1YWwsIGluLXVzZSBjcHVzZXQuICBPcGVyYXRpb25zCiAgKiBzdWNoIGFzIGxpc3QgdHJhdmVyc2FsIHRoYXQgZGVwZW5kIG9uIHRoZSBhY3R1YWwgYWRkcmVzcyBvZiB0aGUKQEAgLTQ3Niw3ICs0NDEsMTAgQEAKIAlpZiAoIWlzX2NwdXNldF9zdWJzZXQodHJpYWwsIHBhcikpCiAJCXJldHVybiAtRUFDQ0VTOwogCi0JLyogSWYgZWl0aGVyIEkgb3Igc29tZSBzaWJsaW5nICghPSBtZSkgaXMgZXhjbHVzaXZlLCB3ZSBjYW4ndCBvdmVybGFwICovCisJLyoKKwkgKiBJZiBlaXRoZXIgSSBvciBzb21lIHNpYmxpbmcgKCE9IG1lKSBpcyBleGNsdXNpdmUsIHdlIGNhbid0CisJICogb3ZlcmxhcAorCSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY29udCwgJnBhci0+Y3NzLmNncm91cC0+Y2hpbGRyZW4sIHNpYmxpbmcpIHsKIAkJYyA9IGNncm91cF9jcyhjb250KTsKIAkJaWYgKChpc19jcHVfZXhjbHVzaXZlKHRyaWFsKSB8fCBpc19jcHVfZXhjbHVzaXZlKGMpKSAmJgpAQCAtNzMyLDIyICs3MDAsNTAgQEAKIAlyZXR1cm4gc3RhcnRlZF9hZnRlcl90aW1lKHQxLCAmdDItPnN0YXJ0X3RpbWUsIHQyKTsKIH0KIAotLyoKLSAqIENhbGwgd2l0aCBtYW5hZ2VfbXV0ZXggaGVsZC4gIE1heSB0YWtlIGNhbGxiYWNrX211dGV4IGR1cmluZyBjYWxsLgorLyoqCisgKiBjcHVzZXRfdGVzdF9jcHVtYXNrIC0gdGVzdCBhIHRhc2sncyBjcHVzX2FsbG93ZWQgdmVyc3VzIGl0cyBjcHVzZXQncworICogQHRzazogdGFzayB0byB0ZXN0CisgKiBAc2Nhbjogc3RydWN0IGNncm91cF9zY2FubmVyIGNvbnRhaW5lZCBpbiBpdHMgc3RydWN0IGNwdXNldF9ob3RwbHVnX3NjYW5uZXIKKyAqCisgKiBDYWxsIHdpdGggY2dyb3VwX211dGV4IGhlbGQuICBNYXkgdGFrZSBjYWxsYmFja19tdXRleCBkdXJpbmcgY2FsbC4KKyAqIENhbGxlZCBmb3IgZWFjaCB0YXNrIGluIGEgY2dyb3VwIGJ5IGNncm91cF9zY2FuX3Rhc2tzKCkuCisgKiBSZXR1cm4gbm9uemVybyBpZiB0aGlzIHRhc2tzJ3MgY3B1c19hbGxvd2VkIG1hc2sgc2hvdWxkIGJlIGNoYW5nZWQgKGluIG90aGVyCisgKiB3b3JkcywgaWYgaXRzIG1hc2sgaXMgbm90IGVxdWFsIHRvIGl0cyBjcHVzZXQncyBtYXNrKS4KICAqLworaW50IGNwdXNldF90ZXN0X2NwdW1hc2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBjZ3JvdXBfc2Nhbm5lciAqc2NhbikKK3sKKwlyZXR1cm4gIWNwdXNfZXF1YWwodHNrLT5jcHVzX2FsbG93ZWQsCisJCQkoY2dyb3VwX2NzKHNjYW4tPmNnKSktPmNwdXNfYWxsb3dlZCk7Cit9CiAKKy8qKgorICogY3B1c2V0X2NoYW5nZV9jcHVtYXNrIC0gbWFrZSBhIHRhc2sncyBjcHVzX2FsbG93ZWQgdGhlIHNhbWUgYXMgaXRzIGNwdXNldCdzCisgKiBAdHNrOiB0YXNrIHRvIHRlc3QKKyAqIEBzY2FuOiBzdHJ1Y3QgY2dyb3VwX3NjYW5uZXIgY29udGFpbmluZyB0aGUgY2dyb3VwIG9mIHRoZSB0YXNrCisgKgorICogQ2FsbGVkIGJ5IGNncm91cF9zY2FuX3Rhc2tzKCkgZm9yIGVhY2ggdGFzayBpbiBhIGNncm91cCB3aG9zZQorICogY3B1c19hbGxvd2VkIG1hc2sgbmVlZHMgdG8gYmUgY2hhbmdlZC4KKyAqCisgKiBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIGZvciB0aGUgY2dyb3VwL2NwdXNldCBtZW1iZXJzaGlwLCBzaW5jZSB3ZSdyZQorICogaG9sZGluZyBjZ3JvdXBfbG9jaygpIGF0IHRoaXMgcG9pbnQuCisgKi8KK3ZvaWQgY3B1c2V0X2NoYW5nZV9jcHVtYXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgY2dyb3VwX3NjYW5uZXIgKnNjYW4pCit7CisJc2V0X2NwdXNfYWxsb3dlZCh0c2ssIChjZ3JvdXBfY3Moc2Nhbi0+Y2cpKS0+Y3B1c19hbGxvd2VkKTsKK30KKworLyoqCisgKiB1cGRhdGVfY3B1bWFzayAtIHVwZGF0ZSB0aGUgY3B1c19hbGxvd2VkIG1hc2sgb2YgYSBjcHVzZXQgYW5kIGFsbCB0YXNrcyBpbiBpdAorICogQGNzOiB0aGUgY3B1c2V0IHRvIGNvbnNpZGVyCisgKiBAYnVmOiBidWZmZXIgb2YgY3B1IG51bWJlcnMgd3JpdHRlbiB0byB0aGlzIGNwdXNldAorICovCiBzdGF0aWMgaW50IHVwZGF0ZV9jcHVtYXNrKHN0cnVjdCBjcHVzZXQgKmNzLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGNwdXNldCB0cmlhbGNzOwotCWludCByZXR2YWwsIGk7Ci0JaW50IGlzX2xvYWRfYmFsYW5jZWQ7Ci0Jc3RydWN0IGNncm91cF9pdGVyIGl0OwotCXN0cnVjdCBjZ3JvdXAgKmNncnAgPSBjcy0+Y3NzLmNncm91cDsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsICpkcm9wcGVkOwotCS8qIE5ldmVyIGRlcmVmZXJlbmNlIGxhdGVzdF90YXNrLCBzaW5jZSBpdCdzIG5vdCByZWZjb3VudGVkICovCi0Jc3RydWN0IHRhc2tfc3RydWN0ICpsYXRlc3RfdGFzayA9IE5VTEw7CisJc3RydWN0IGNncm91cF9zY2FubmVyIHNjYW47CiAJc3RydWN0IHB0cl9oZWFwIGhlYXA7Ci0Jc3RydWN0IHRpbWVzcGVjIGxhdGVzdF90aW1lID0geyAwLCAwIH07CisJaW50IHJldHZhbDsKKwlpbnQgaXNfbG9hZF9iYWxhbmNlZDsKIAogCS8qIHRvcF9jcHVzZXQuY3B1c19hbGxvd2VkIHRyYWNrcyBjcHVfb25saW5lX21hcDsgaXQncyByZWFkLW9ubHkgKi8KIAlpZiAoY3MgPT0gJnRvcF9jcHVzZXQpCkBAIC03NTYsNyArNzUyLDcgQEAKIAl0cmlhbGNzID0gKmNzOwogCiAJLyoKLQkgKiBBbiBlbXB0eSBjcHVzX2FsbG93ZWQgaXMgb2sgaWZmIHRoZXJlIGFyZSBubyB0YXNrcyBpbiB0aGUgY3B1c2V0LgorCSAqIEFuIGVtcHR5IGNwdXNfYWxsb3dlZCBpcyBvayBvbmx5IGlmIHRoZSBjcHVzZXQgaGFzIG5vIHRhc2tzLgogCSAqIFNpbmNlIGNwdWxpc3RfcGFyc2UoKSBmYWlscyBvbiBhbiBlbXB0eSBtYXNrLCB3ZSBzcGVjaWFsIGNhc2UKIAkgKiB0aGF0IHBhcnNpbmcuICBUaGUgdmFsaWRhdGVfY2hhbmdlKCkgY2FsbCBlbnN1cmVzIHRoYXQgY3B1c2V0cwogCSAqIHdpdGggdGFza3MgaGF2ZSBjcHVzLgpAQCAtNzc3LDYgKzc3Myw3IEBACiAJLyogTm90aGluZyB0byBkbyBpZiB0aGUgY3B1cyBkaWRuJ3QgY2hhbmdlICovCiAJaWYgKGNwdXNfZXF1YWwoY3MtPmNwdXNfYWxsb3dlZCwgdHJpYWxjcy5jcHVzX2FsbG93ZWQpKQogCQlyZXR1cm4gMDsKKwogCXJldHZhbCA9IGhlYXBfaW5pdCgmaGVhcCwgUEFHRV9TSVpFLCBHRlBfS0VSTkVMLCAmc3RhcnRlZF9hZnRlcik7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKQEAgLTc4Nyw2MiArNzg0LDE5IEBACiAJY3MtPmNwdXNfYWxsb3dlZCA9IHRyaWFsY3MuY3B1c19hbGxvd2VkOwogCW11dGV4X3VubG9jaygmY2FsbGJhY2tfbXV0ZXgpOwogCi0gYWdhaW46CiAJLyoKIAkgKiBTY2FuIHRhc2tzIGluIHRoZSBjcHVzZXQsIGFuZCB1cGRhdGUgdGhlIGNwdW1hc2tzIG9mIGFueQotCSAqIHRoYXQgbmVlZCBhbiB1cGRhdGUuIFNpbmNlIHdlIGNhbid0IGNhbGwgc2V0X2NwdXNfYWxsb3dlZCgpCi0JICogd2hpbGUgaG9sZGluZyB0YXNrbGlzdF9sb2NrLCBnYXRoZXIgdGFza3MgdG8gYmUgcHJvY2Vzc2VkCi0JICogaW4gYSBoZWFwIHN0cnVjdHVyZS4gSWYgdGhlIHN0YXRpY2FsbHktc2l6ZWQgaGVhcCBmaWxscyB1cCwKLQkgKiBvdmVyZmxvdyB0YXNrcyB0aGF0IHN0YXJ0ZWQgbGF0ZXIsIGFuZCBpbiBmdXR1cmUgaXRlcmF0aW9ucwotCSAqIG9ubHkgY29uc2lkZXIgdGFza3MgdGhhdCBzdGFydGVkIGFmdGVyIHRoZSBsYXRlc3QgdGFzayBpbgotCSAqIHRoZSBwcmV2aW91cyBwYXNzLiBUaGlzIGd1YXJhbnRlZXMgZm9yd2FyZCBwcm9ncmVzcyBhbmQKLQkgKiB0aGF0IHdlIGRvbid0IG1pc3MgYW55IHRhc2tzCisJICogdGhhdCBuZWVkIGFuIHVwZGF0ZS4KIAkgKi8KLQloZWFwLnNpemUgPSAwOwotCWNncm91cF9pdGVyX3N0YXJ0KGNncnAsICZpdCk7Ci0Jd2hpbGUgKChwID0gY2dyb3VwX2l0ZXJfbmV4dChjZ3JwLCAmaXQpKSkgewotCQkvKiBPbmx5IGFmZmVjdCB0YXNrcyB0aGF0IGRvbid0IGhhdmUgdGhlIHJpZ2h0IGNwdXNfYWxsb3dlZCAqLwotCQlpZiAoY3B1c19lcXVhbChwLT5jcHVzX2FsbG93ZWQsIGNzLT5jcHVzX2FsbG93ZWQpKQotCQkJY29udGludWU7Ci0JCS8qCi0JCSAqIE9ubHkgcHJvY2VzcyB0YXNrcyB0aGF0IHN0YXJ0ZWQgYWZ0ZXIgdGhlIGxhc3QgdGFzawotCQkgKiB3ZSBwcm9jZXNzZWQKLQkJICovCi0JCWlmICghc3RhcnRlZF9hZnRlcl90aW1lKHAsICZsYXRlc3RfdGltZSwgbGF0ZXN0X3Rhc2spKQotCQkJY29udGludWU7Ci0JCWRyb3BwZWQgPSBoZWFwX2luc2VydCgmaGVhcCwgcCk7Ci0JCWlmIChkcm9wcGVkID09IE5VTEwpIHsKLQkJCWdldF90YXNrX3N0cnVjdChwKTsKLQkJfSBlbHNlIGlmIChkcm9wcGVkICE9IHApIHsKLQkJCWdldF90YXNrX3N0cnVjdChwKTsKLQkJCXB1dF90YXNrX3N0cnVjdChkcm9wcGVkKTsKLQkJfQotCX0KLQljZ3JvdXBfaXRlcl9lbmQoY2dycCwgJml0KTsKLQlpZiAoaGVhcC5zaXplKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBoZWFwLnNpemU7IGkrKykgewotCQkJc3RydWN0IHRhc2tfc3RydWN0ICpwID0gaGVhcC5wdHJzW2ldOwotCQkJaWYgKGkgPT0gMCkgewotCQkJCWxhdGVzdF90aW1lID0gcC0+c3RhcnRfdGltZTsKLQkJCQlsYXRlc3RfdGFzayA9IHA7Ci0JCQl9Ci0JCQlzZXRfY3B1c19hbGxvd2VkKHAsIGNzLT5jcHVzX2FsbG93ZWQpOwotCQkJcHV0X3Rhc2tfc3RydWN0KHApOwotCQl9Ci0JCS8qCi0JCSAqIElmIHdlIGhhZCB0byBwcm9jZXNzIGFueSB0YXNrcyBhdCBhbGwsIHNjYW4gYWdhaW4KLQkJICogaW4gY2FzZSBzb21lIG9mIHRoZW0gd2VyZSBpbiB0aGUgbWlkZGxlIG9mIGZvcmtpbmcKLQkJICogY2hpbGRyZW4gdGhhdCBkaWRuJ3Qgbm90aWNlIHRoZSBuZXcgY3B1bWFzawotCQkgKiByZXN0cmljdGlvbi4gIE5vdCB0aGUgbW9zdCBlZmZpY2llbnQgd2F5IHRvIGRvIGl0LAotCQkgKiBidXQgaXQgYXZvaWRzIGhhdmluZyB0byB0YWtlIGNhbGxiYWNrX211dGV4IGluIHRoZQotCQkgKiBmb3JrIHBhdGgKLQkJICovCi0JCWdvdG8gYWdhaW47Ci0JfQorCXNjYW4uY2cgPSBjcy0+Y3NzLmNncm91cDsKKwlzY2FuLnRlc3RfdGFzayA9IGNwdXNldF90ZXN0X2NwdW1hc2s7CisJc2Nhbi5wcm9jZXNzX3Rhc2sgPSBjcHVzZXRfY2hhbmdlX2NwdW1hc2s7CisJc2Nhbi5oZWFwID0gJmhlYXA7CisJY2dyb3VwX3NjYW5fdGFza3MoJnNjYW4pOwogCWhlYXBfZnJlZSgmaGVhcCk7CisKIAlpZiAoaXNfbG9hZF9iYWxhbmNlZCkKIAkJcmVidWlsZF9zY2hlZF9kb21haW5zKCk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtODU0LDExICs4MDgsMTEgQEAKICAqICAgIFRlbXBvcmFyaWxseSBzZXQgdGFza3MgbWVtc19hbGxvd2VkIHRvIHRhcmdldCBub2RlcyBvZiBtaWdyYXRpb24sCiAgKiAgICBzbyB0aGF0IHRoZSBtaWdyYXRpb24gY29kZSBjYW4gYWxsb2NhdGUgcGFnZXMgb24gdGhlc2Ugbm9kZXMuCiAgKgotICogICAgQ2FsbCBob2xkaW5nIG1hbmFnZV9tdXRleCwgc28gb3VyIGN1cnJlbnQtPmNwdXNldCB3b24ndCBjaGFuZ2UKLSAqICAgIGR1cmluZyB0aGlzIGNhbGwsIGFzIG1hbmFnZV9tdXRleCBob2xkcyBvZmYgYW55IGF0dGFjaF90YXNrKCkKKyAqICAgIENhbGwgaG9sZGluZyBjZ3JvdXBfbXV0ZXgsIHNvIGN1cnJlbnQncyBjcHVzZXQgd29uJ3QgY2hhbmdlCisgKiAgICBkdXJpbmcgdGhpcyBjYWxsLCBhcyBtYW5hZ2VfbXV0ZXggaG9sZHMgb2ZmIGFueSBjcHVzZXRfYXR0YWNoKCkKICAqICAgIGNhbGxzLiAgVGhlcmVmb3JlIHdlIGRvbid0IG5lZWQgdG8gdGFrZSB0YXNrX2xvY2sgYXJvdW5kIHRoZQogICogICAgY2FsbCB0byBndWFyYW50ZWVfb25saW5lX21lbXMoKSwgYXMgd2Uga25vdyBubyBvbmUgaXMgY2hhbmdpbmcKLSAqICAgIG91ciB0YXNrcyBjcHVzZXQuCisgKiAgICBvdXIgdGFzaydzIGNwdXNldC4KICAqCiAgKiAgICBIb2xkIGNhbGxiYWNrX211dGV4IGFyb3VuZCB0aGUgdHdvIG1vZGlmaWNhdGlvbnMgb2Ygb3VyIHRhc2tzCiAgKiAgICBtZW1zX2FsbG93ZWQgdG8gc3luY2hyb25pemUgd2l0aCBjcHVzZXRfbWVtc19hbGxvd2VkKCkuCkBAIC05MDMsNyArODU3LDcgQEAKICAqIHRoZSBjcHVzZXQgaXMgbWFya2VkICdtZW1vcnlfbWlncmF0ZScsIG1pZ3JhdGUgdGhlIHRhc2tzCiAgKiBwYWdlcyB0byB0aGUgbmV3IG1lbW9yeS4KICAqCi0gKiBDYWxsIHdpdGggbWFuYWdlX211dGV4IGhlbGQuICBNYXkgdGFrZSBjYWxsYmFja19tdXRleCBkdXJpbmcgY2FsbC4KKyAqIENhbGwgd2l0aCBjZ3JvdXBfbXV0ZXggaGVsZC4gIE1heSB0YWtlIGNhbGxiYWNrX211dGV4IGR1cmluZyBjYWxsLgogICogV2lsbCB0YWtlIHRhc2tsaXN0X2xvY2ssIHNjYW4gdGFza2xpc3QgZm9yIHRhc2tzIGluIGNwdXNldCBjcywKICAqIGxvY2sgZWFjaCBzdWNoIHRhc2tzIG1tLT5tbWFwX3NlbSwgc2NhbiBpdHMgdm1hJ3MgYW5kIHJlYmluZAogICogdGhlaXIgbWVtcG9saWNpZXMgdG8gdGhlIGNwdXNldHMgbmV3IG1lbXNfYWxsb3dlZC4KQEAgLTEwMTYsNyArOTcwLDcgQEAKIAkgKiB0YXNrbGlzdF9sb2NrLiAgRm9ya3MgY2FuIGhhcHBlbiBhZ2FpbiBub3cgLSB0aGUgbXBvbF9jb3B5KCkKIAkgKiBjcHVzZXRfYmVpbmdfcmVib3VuZCBjaGVjayB3aWxsIGNhdGNoIHN1Y2ggZm9ya3MsIGFuZCByZWJpbmQKIAkgKiB0aGVpciB2bWEgbWVtcG9saWNpZXMgdG9vLiAgQmVjYXVzZSB3ZSBzdGlsbCBob2xkIHRoZSBnbG9iYWwKLQkgKiBjcHVzZXQgbWFuYWdlX211dGV4LCB3ZSBrbm93IHRoYXQgbm8gb3RoZXIgcmViaW5kIGVmZm9ydCB3aWxsCisJICogY2dyb3VwX211dGV4LCB3ZSBrbm93IHRoYXQgbm8gb3RoZXIgcmViaW5kIGVmZm9ydCB3aWxsCiAJICogYmUgY29udGVuZGluZyBmb3IgdGhlIGdsb2JhbCB2YXJpYWJsZSBjcHVzZXRfYmVpbmdfcmVib3VuZC4KIAkgKiBJdCdzIG9rIGlmIHdlIHJlYmluZCB0aGUgc2FtZSBtbSB0d2ljZTsgbXBvbF9yZWJpbmRfbW0oKQogCSAqIGlzIGlkZW1wb3RlbnQuICBBbHNvIG1pZ3JhdGUgcGFnZXMgaW4gZWFjaCBtbSB0byBuZXcgbm9kZXMuCkBAIC0xMDMxLDcgKzk4NSw3IEBACiAJCW1tcHV0KG1tKTsKIAl9CiAKLQkvKiBXZSdyZSBkb25lIHJlYmluZGluZyB2bWEncyB0byB0aGlzIGNwdXNldHMgbmV3IG1lbXNfYWxsb3dlZC4gKi8KKwkvKiBXZSdyZSBkb25lIHJlYmluZGluZyB2bWFzIHRvIHRoaXMgY3B1c2V0J3MgbmV3IG1lbXNfYWxsb3dlZC4gKi8KIAlrZnJlZShtbWFycmF5KTsKIAljcHVzZXRfYmVpbmdfcmVib3VuZCA9IE5VTEw7CiAJcmV0dmFsID0gMDsKQEAgLTEwNDUsNyArOTk5LDcgQEAKIH0KIAogLyoKLSAqIENhbGwgd2l0aCBtYW5hZ2VfbXV0ZXggaGVsZC4KKyAqIENhbGwgd2l0aCBjZ3JvdXBfbXV0ZXggaGVsZC4KICAqLwogCiBzdGF0aWMgaW50IHVwZGF0ZV9tZW1vcnlfcHJlc3N1cmVfZW5hYmxlZChzdHJ1Y3QgY3B1c2V0ICpjcywgY2hhciAqYnVmKQpAQCAtMTA2Niw3ICsxMDIwLDcgQEAKICAqIGNzOgl0aGUgY3B1c2V0IHRvIHVwZGF0ZQogICogYnVmOgl0aGUgYnVmZmVyIHdoZXJlIHdlIHJlYWQgdGhlIDAgb3IgMQogICoKLSAqIENhbGwgd2l0aCBtYW5hZ2VfbXV0ZXggaGVsZC4KKyAqIENhbGwgd2l0aCBjZ3JvdXBfbXV0ZXggaGVsZC4KICAqLwogCiBzdGF0aWMgaW50IHVwZGF0ZV9mbGFnKGNwdXNldF9mbGFnYml0c190IGJpdCwgc3RydWN0IGNwdXNldCAqY3MsIGNoYXIgKmJ1ZikKQEAgLTEyMDAsNiArMTE1NCw3IEBACiAJcmV0dXJuIHZhbDsKIH0KIAorLyogQ2FsbGVkIGJ5IGNncm91cHMgdG8gZGV0ZXJtaW5lIGlmIGEgY3B1c2V0IGlzIHVzYWJsZTsgY2dyb3VwX211dGV4IGhlbGQgKi8KIHN0YXRpYyBpbnQgY3B1c2V0X2Nhbl9hdHRhY2goc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLAogCQkJICAgICBzdHJ1Y3QgY2dyb3VwICpjb250LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKQEAgLTE1NDcsNyArMTUwMiw4IEBACiAgKiBJZiB0aGlzIGJlY29tZXMgYSBwcm9ibGVtIGZvciBzb21lIHVzZXJzIHdobyB3aXNoIHRvCiAgKiBhbGxvdyB0aGF0IHNjZW5hcmlvLCB0aGVuIGNwdXNldF9wb3N0X2Nsb25lKCkgY291bGQgYmUKICAqIGNoYW5nZWQgdG8gZ3JhbnQgcGFyZW50LT5jcHVzX2FsbG93ZWQtc2libGluZ19jcHVzX2V4Y2x1c2l2ZQotICogKGFuZCBsaWtld2lzZSBmb3IgbWVtcykgdG8gdGhlIG5ldyBjZ3JvdXAuCisgKiAoYW5kIGxpa2V3aXNlIGZvciBtZW1zKSB0byB0aGUgbmV3IGNncm91cC4gQ2FsbGVkIHdpdGggY2dyb3VwX211dGV4CisgKiBoZWxkLgogICovCiBzdGF0aWMgdm9pZCBjcHVzZXRfcG9zdF9jbG9uZShzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsCiAJCQkgICAgICBzdHJ1Y3QgY2dyb3VwICpjZ3JvdXApCkBAIC0xNTcxLDExICsxNTI3LDggQEAKIAogLyoKICAqCWNwdXNldF9jcmVhdGUgLSBjcmVhdGUgYSBjcHVzZXQKLSAqCXBhcmVudDoJY3B1c2V0IHRoYXQgd2lsbCBiZSBwYXJlbnQgb2YgdGhlIG5ldyBjcHVzZXQuCi0gKgluYW1lOgkJbmFtZSBvZiB0aGUgbmV3IGNwdXNldC4gV2lsbCBiZSBzdHJjcHknZWQuCi0gKgltb2RlOgkJbW9kZSB0byBzZXQgb24gbmV3IGlub2RlCi0gKgotICoJTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbXV0ZXggb24gdGhlIHBhcmVudCBpbm9kZSBoZWxkCisgKglzczoJY3B1c2V0IGNncm91cCBzdWJzeXN0ZW0KKyAqCWNvbnQ6CWNvbnRyb2wgZ3JvdXAgdGhhdCB0aGUgbmV3IGNwdXNldCB3aWxsIGJlIHBhcnQgb2YKICAqLwogCiBzdGF0aWMgc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNwdXNldF9jcmVhdGUoCkBAIC0xNjg3LDUzICsxNjQwLDE0MCBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqIGNwdXNldF9kb19tb3ZlX3Rhc2sgLSBtb3ZlIGEgZ2l2ZW4gdGFzayB0byBhbm90aGVyIGNwdXNldAorICogQHRzazogcG9pbnRlciB0byB0YXNrX3N0cnVjdCB0aGUgdGFzayB0byBtb3ZlCisgKiBAc2Nhbjogc3RydWN0IGNncm91cF9zY2FubmVyIGNvbnRhaW5lZCBpbiBpdHMgc3RydWN0IGNwdXNldF9ob3RwbHVnX3NjYW5uZXIKKyAqCisgKiBDYWxsZWQgYnkgY2dyb3VwX3NjYW5fdGFza3MoKSBmb3IgZWFjaCB0YXNrIGluIGEgY2dyb3VwLgorICogUmV0dXJuIG5vbnplcm8gdG8gc3RvcCB0aGUgd2FsayB0aHJvdWdoIHRoZSB0YXNrcy4KKyAqLwordm9pZCBjcHVzZXRfZG9fbW92ZV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgY2dyb3VwX3NjYW5uZXIgKnNjYW4pCit7CisJc3RydWN0IGNwdXNldF9ob3RwbHVnX3NjYW5uZXIgKmNoc3A7CisKKwljaHNwID0gY29udGFpbmVyX29mKHNjYW4sIHN0cnVjdCBjcHVzZXRfaG90cGx1Z19zY2FubmVyLCBzY2FuKTsKKwljZ3JvdXBfYXR0YWNoX3Rhc2soY2hzcC0+dG8sIHRzayk7Cit9CisKKy8qKgorICogbW92ZV9tZW1iZXJfdGFza3NfdG9fY3B1c2V0IC0gbW92ZSB0YXNrcyBmcm9tIG9uZSBjcHVzZXQgdG8gYW5vdGhlcgorICogQGZyb206IGNwdXNldCBpbiB3aGljaCB0aGUgdGFza3MgY3VycmVudGx5IHJlc2lkZQorICogQHRvOiBjcHVzZXQgdG8gd2hpY2ggdGhlIHRhc2tzIHdpbGwgYmUgbW92ZWQKKyAqCisgKiBDYWxsZWQgd2l0aCBjZ3JvdXBfbXV0ZXggaGVsZAorICogY2FsbGJhY2tfbXV0ZXggbXVzdCBub3QgYmUgaGVsZCwgYXMgY3B1c2V0X2F0dGFjaCgpIHdpbGwgdGFrZSBpdC4KKyAqCisgKiBUaGUgY2dyb3VwX3NjYW5fdGFza3MoKSBmdW5jdGlvbiB3aWxsIHNjYW4gYWxsIHRoZSB0YXNrcyBpbiBhIGNncm91cCwKKyAqIGNhbGxpbmcgY2FsbGJhY2sgZnVuY3Rpb25zIGZvciBlYWNoLgorICovCitzdGF0aWMgdm9pZCBtb3ZlX21lbWJlcl90YXNrc190b19jcHVzZXQoc3RydWN0IGNwdXNldCAqZnJvbSwgc3RydWN0IGNwdXNldCAqdG8pCit7CisJc3RydWN0IGNwdXNldF9ob3RwbHVnX3NjYW5uZXIgc2NhbjsKKworCXNjYW4uc2Nhbi5jZyA9IGZyb20tPmNzcy5jZ3JvdXA7CisJc2Nhbi5zY2FuLnRlc3RfdGFzayA9IE5VTEw7IC8qIHNlbGVjdCBhbGwgdGFza3MgaW4gY2dyb3VwICovCisJc2Nhbi5zY2FuLnByb2Nlc3NfdGFzayA9IGNwdXNldF9kb19tb3ZlX3Rhc2s7CisJc2Nhbi5zY2FuLmhlYXAgPSBOVUxMOworCXNjYW4udG8gPSB0by0+Y3NzLmNncm91cDsKKworCWlmIChjZ3JvdXBfc2Nhbl90YXNrcygoc3RydWN0IGNncm91cF9zY2FubmVyICopJnNjYW4pKQorCQlwcmludGsoS0VSTl9FUlIgIm1vdmVfbWVtYmVyX3Rhc2tzX3RvX2NwdXNldDogIgorCQkJCSJjZ3JvdXBfc2Nhbl90YXNrcyBmYWlsZWRcbiIpOworfQorCiAvKgogICogSWYgY29tbW9uX2NwdV9tZW1faG90cGx1Z191bnBsdWcoKSwgYmVsb3csIHVucGx1Z3MgYW55IENQVXMKICAqIG9yIG1lbW9yeSBub2Rlcywgd2UgbmVlZCB0byB3YWxrIG92ZXIgdGhlIGNwdXNldCBoaWVyYXJjaHksCiAgKiByZW1vdmluZyB0aGF0IENQVSBvciBub2RlIGZyb20gYWxsIGNwdXNldHMuICBJZiB0aGlzIHJlbW92ZXMgdGhlCi0gKiBsYXN0IENQVSBvciBub2RlIGZyb20gYSBjcHVzZXQsIHRoZW4gdGhlIGd1YXJhbnRlZV9vbmxpbmVfY3B1cygpCi0gKiBvciBndWFyYW50ZWVfb25saW5lX21lbXMoKSBjb2RlIHdpbGwgdXNlIHRoYXQgZW1wdGllZCBjcHVzZXRzCi0gKiBwYXJlbnQgb25saW5lIENQVXMgb3Igbm9kZXMuICBDcHVzZXRzIHRoYXQgd2VyZSBhbHJlYWR5IGVtcHR5IG9mCi0gKiBDUFVzIG9yIG5vZGVzIGFyZSBsZWZ0IGVtcHR5LgorICogbGFzdCBDUFUgb3Igbm9kZSBmcm9tIGEgY3B1c2V0LCB0aGVuIG1vdmUgdGhlIHRhc2tzIGluIHRoZSBlbXB0eQorICogY3B1c2V0IHRvIGl0cyBuZXh0LWhpZ2hlc3Qgbm9uLWVtcHR5IHBhcmVudC4KICAqCi0gKiBUaGlzIHJvdXRpbmUgaXMgaW50ZW50aW9uYWxseSBpbmVmZmljaWVudCBpbiBhIGNvdXBsZSBvZiByZWdhcmRzLgotICogSXQgd2lsbCBjaGVjayBhbGwgY3B1c2V0cyBpbiBhIHN1YnRyZWUgZXZlbiBpZiB0aGUgdG9wIGNwdXNldCBvZgotICogdGhlIHN1YnRyZWUgaGFzIG5vIG9mZmxpbmUgQ1BVcyBvciBub2Rlcy4gIEl0IGNoZWNrcyBib3RoIENQVXMgYW5kCi0gKiBub2RlcywgZXZlbiB0aG91Z2ggdGhlIGNhbGxlciBjb3VsZCBoYXZlIGJlZW4gY29kZWQgdG8ga25vdyB0aGF0Ci0gKiBvbmx5IG9uZSBvZiBDUFVzIG9yIG5vZGVzIG5lZWRlZCB0byBiZSBjaGVja2VkIG9uIGEgZ2l2ZW4gY2FsbC4KLSAqIFRoaXMgd2FzIGRvbmUgdG8gbWluaW1pemUgdGV4dCBzaXplIHJhdGhlciB0aGFuIGNwdSBjeWNsZXMuCi0gKgotICogQ2FsbCB3aXRoIGJvdGggbWFuYWdlX211dGV4IGFuZCBjYWxsYmFja19tdXRleCBoZWxkLgotICoKLSAqIFJlY3Vyc2l2ZSwgb24gZGVwdGggb2YgY3B1c2V0IHN1YnRyZWUuCisgKiBDYWxsZWQgd2l0aCBjZ3JvdXBfbXV0ZXggaGVsZAorICogY2FsbGJhY2tfbXV0ZXggbXVzdCBub3QgYmUgaGVsZCwgYXMgY3B1c2V0X2F0dGFjaCgpIHdpbGwgdGFrZSBpdC4KICAqLwotCi1zdGF0aWMgdm9pZCBndWFyYW50ZWVfb25saW5lX2NwdXNfbWVtc19pbl9zdWJ0cmVlKGNvbnN0IHN0cnVjdCBjcHVzZXQgKmN1cikKK3N0YXRpYyB2b2lkIHJlbW92ZV90YXNrc19pbl9lbXB0eV9jcHVzZXQoc3RydWN0IGNwdXNldCAqY3MpCiB7Ci0Jc3RydWN0IGNncm91cCAqY29udDsKLQlzdHJ1Y3QgY3B1c2V0ICpjOworCXN0cnVjdCBjcHVzZXQgKnBhcmVudDsKIAotCS8qIEVhY2ggb2Ygb3VyIGNoaWxkIGNwdXNldHMgbWVtcyBtdXN0IGJlIG9ubGluZSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY29udCwgJmN1ci0+Y3NzLmNncm91cC0+Y2hpbGRyZW4sIHNpYmxpbmcpIHsKLQkJYyA9IGNncm91cF9jcyhjb250KTsKLQkJZ3VhcmFudGVlX29ubGluZV9jcHVzX21lbXNfaW5fc3VidHJlZShjKTsKLQkJaWYgKCFjcHVzX2VtcHR5KGMtPmNwdXNfYWxsb3dlZCkpCi0JCQlndWFyYW50ZWVfb25saW5lX2NwdXMoYywgJmMtPmNwdXNfYWxsb3dlZCk7Ci0JCWlmICghbm9kZXNfZW1wdHkoYy0+bWVtc19hbGxvd2VkKSkKLQkJCWd1YXJhbnRlZV9vbmxpbmVfbWVtcyhjLCAmYy0+bWVtc19hbGxvd2VkKTsKKwkvKgorCSAqIFRoZSBjZ3JvdXAncyBjc3Nfc2V0cyBsaXN0IGlzIGluIHVzZSBpZiB0aGVyZSBhcmUgdGFza3MKKwkgKiBpbiB0aGUgY3B1c2V0OyB0aGUgbGlzdCBpcyBlbXB0eSBpZiB0aGVyZSBhcmUgbm9uZTsKKwkgKiB0aGUgY3MtPmNzcy5yZWZjbnQgc2VlbXMgYWx3YXlzIDAuCisJICovCisJaWYgKGxpc3RfZW1wdHkoJmNzLT5jc3MuY2dyb3VwLT5jc3Nfc2V0cykpCisJCXJldHVybjsKKworCS8qCisJICogRmluZCBpdHMgbmV4dC1oaWdoZXN0IG5vbi1lbXB0eSBwYXJlbnQsICh0b3AgY3B1c2V0CisJICogaGFzIG9ubGluZSBjcHVzLCBzbyBjYW4ndCBiZSBlbXB0eSkuCisJICovCisJcGFyZW50ID0gY3MtPnBhcmVudDsKKwl3aGlsZSAoY3B1c19lbXB0eShwYXJlbnQtPmNwdXNfYWxsb3dlZCkgfHwKKwkJCW5vZGVzX2VtcHR5KHBhcmVudC0+bWVtc19hbGxvd2VkKSkKKwkJcGFyZW50ID0gcGFyZW50LT5wYXJlbnQ7CisKKwltb3ZlX21lbWJlcl90YXNrc190b19jcHVzZXQoY3MsIHBhcmVudCk7Cit9CisKKy8qCisgKiBXYWxrIHRoZSBzcGVjaWZpZWQgY3B1c2V0IHN1YnRyZWUgYW5kIGxvb2sgZm9yIGVtcHR5IGNwdXNldHMuCisgKiBUaGUgdGFza3Mgb2Ygc3VjaCBjcHVzZXQgbXVzdCBiZSBtb3ZlZCB0byBhIHBhcmVudCBjcHVzZXQuCisgKgorICogQ2FsbGVkIHdpdGggY2dyb3VwX211dGV4IGhlbGQuICBXZSB0YWtlIGNhbGxiYWNrX211dGV4IHRvIG1vZGlmeQorICogY3B1c19hbGxvd2VkIGFuZCBtZW1zX2FsbG93ZWQuCisgKgorICogVGhpcyB3YWxrIHByb2Nlc3NlcyB0aGUgdHJlZSBmcm9tIHRvcCB0byBib3R0b20sIGNvbXBsZXRpbmcgb25lIGxheWVyCisgKiBiZWZvcmUgZHJvcHBpbmcgZG93biB0byB0aGUgbmV4dC4gIEl0IGFsd2F5cyBwcm9jZXNzZXMgYSBub2RlIGJlZm9yZQorICogYW55IG9mIGl0cyBjaGlsZHJlbi4KKyAqCisgKiBGb3Igbm93LCBzaW5jZSB3ZSBsYWNrIG1lbW9yeSBob3QgdW5wbHVnLCB3ZSdsbCBuZXZlciBzZWUgYSBjcHVzZXQKKyAqIHRoYXQgaGFzIHRhc2tzIGFsb25nIHdpdGggYW4gZW1wdHkgJ21lbXMnLiAgQnV0IGlmIHdlIGRpZCBzZWUgc3VjaAorICogYSBjcHVzZXQsIHdlJ2QgaGFuZGxlIGl0IGp1c3QgbGlrZSB3ZSBkbyBpZiBpdHMgJ2NwdXMnIHdhcyBlbXB0eS4KKyAqLworc3RhdGljIHZvaWQgc2Nhbl9mb3JfZW1wdHlfY3B1c2V0cyhjb25zdCBzdHJ1Y3QgY3B1c2V0ICpyb290KQoreworCXN0cnVjdCBjcHVzZXQgKmNwOwkvKiBzY2FucyBjcHVzZXRzIGJlaW5nIHVwZGF0ZWQgKi8KKwlzdHJ1Y3QgY3B1c2V0ICpjaGlsZDsJLyogc2NhbnMgY2hpbGQgY3B1c2V0cyBvZiBjcCAqLworCXN0cnVjdCBsaXN0X2hlYWQgcXVldWU7CisJc3RydWN0IGNncm91cCAqY29udDsKKworCUlOSVRfTElTVF9IRUFEKCZxdWV1ZSk7CisKKwlsaXN0X2FkZF90YWlsKChzdHJ1Y3QgbGlzdF9oZWFkICopJnJvb3QtPnN0YWNrX2xpc3QsICZxdWV1ZSk7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnF1ZXVlKSkgeworCQljcCA9IGNvbnRhaW5lcl9vZihxdWV1ZS5uZXh0LCBzdHJ1Y3QgY3B1c2V0LCBzdGFja19saXN0KTsKKwkJbGlzdF9kZWwocXVldWUubmV4dCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY29udCwgJmNwLT5jc3MuY2dyb3VwLT5jaGlsZHJlbiwgc2libGluZykgeworCQkJY2hpbGQgPSBjZ3JvdXBfY3MoY29udCk7CisJCQlsaXN0X2FkZF90YWlsKCZjaGlsZC0+c3RhY2tfbGlzdCwgJnF1ZXVlKTsKKwkJfQorCQljb250ID0gY3AtPmNzcy5jZ3JvdXA7CisKKwkJLyogQ29udGludWUgcGFzdCBjcHVzZXRzIHdpdGggYWxsIGNwdXMsIG1lbXMgb25saW5lICovCisJCWlmIChjcHVzX3N1YnNldChjcC0+Y3B1c19hbGxvd2VkLCBjcHVfb25saW5lX21hcCkgJiYKKwkJICAgIG5vZGVzX3N1YnNldChjcC0+bWVtc19hbGxvd2VkLCBub2RlX3N0YXRlc1tOX0hJR0hfTUVNT1JZXSkpCisJCQljb250aW51ZTsKKworCQkvKiBSZW1vdmUgb2ZmbGluZSBjcHVzIGFuZCBtZW1zIGZyb20gdGhpcyBjcHVzZXQuICovCisJCW11dGV4X2xvY2soJmNhbGxiYWNrX211dGV4KTsKKwkJY3B1c19hbmQoY3AtPmNwdXNfYWxsb3dlZCwgY3AtPmNwdXNfYWxsb3dlZCwgY3B1X29ubGluZV9tYXApOworCQlub2Rlc19hbmQoY3AtPm1lbXNfYWxsb3dlZCwgY3AtPm1lbXNfYWxsb3dlZCwKKwkJCQkJCW5vZGVfc3RhdGVzW05fSElHSF9NRU1PUlldKTsKKwkJbXV0ZXhfdW5sb2NrKCZjYWxsYmFja19tdXRleCk7CisKKwkJLyogTW92ZSB0YXNrcyBmcm9tIHRoZSBlbXB0eSBjcHVzZXQgdG8gYSBwYXJlbnQgKi8KKwkJaWYgKGNwdXNfZW1wdHkoY3AtPmNwdXNfYWxsb3dlZCkgfHwKKwkJICAgICBub2Rlc19lbXB0eShjcC0+bWVtc19hbGxvd2VkKSkKKwkJCXJlbW92ZV90YXNrc19pbl9lbXB0eV9jcHVzZXQoY3ApOwogCX0KIH0KIAogLyoKICAqIFRoZSBjcHVzX2FsbG93ZWQgYW5kIG1lbXNfYWxsb3dlZCBub2RlbWFza3MgaW4gdGhlIHRvcF9jcHVzZXQgdHJhY2sKICAqIGNwdV9vbmxpbmVfbWFwIGFuZCBub2RlX3N0YXRlc1tOX0hJR0hfTUVNT1JZXS4gIEZvcmNlIHRoZSB0b3AgY3B1c2V0IHRvCi0gKiB0cmFjayB3aGF0J3Mgb25saW5lIGFmdGVyIGFueSBDUFUgb3IgbWVtb3J5IG5vZGUgaG90cGx1ZyBvciB1bnBsdWcKLSAqIGV2ZW50LgotICoKLSAqIFRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IHJlbW92ZSBhIENQVSBvciBub2RlIGZyb20gdGhlIHRvcCBjcHVzZXQKLSAqIHRoYXQgaXMgY3VycmVudGx5IGluIHVzZSBieSBhIGNoaWxkIGNwdXNldCAod2hpY2ggd291bGQgdmlvbGF0ZQotICogdGhlIHJ1bGUgdGhhdCBjcHVzZXRzIG11c3QgYmUgc3Vic2V0cyBvZiB0aGVpciBwYXJlbnQpLCB3ZSBmaXJzdAotICogY2FsbCB0aGUgcmVjdXJzaXZlIHJvdXRpbmUgZ3VhcmFudGVlX29ubGluZV9jcHVzX21lbXNfaW5fc3VidHJlZSgpLgorICogdHJhY2sgd2hhdCdzIG9ubGluZSBhZnRlciBhbnkgQ1BVIG9yIG1lbW9yeSBub2RlIGhvdHBsdWcgb3IgdW5wbHVnIGV2ZW50LgogICoKICAqIFNpbmNlIHRoZXJlIGFyZSB0d28gY2FsbGVycyBvZiB0aGlzIHJvdXRpbmUsIG9uZSBmb3IgQ1BVIGhvdHBsdWcKICAqIGV2ZW50cyBhbmQgb25lIGZvciBtZW1vcnkgbm9kZSBob3RwbHVnIGV2ZW50cywgd2UgY291bGQgaGF2ZSBjb2RlZApAQCAtMTc0NCwxMyArMTc4NCwxMSBAQAogc3RhdGljIHZvaWQgY29tbW9uX2NwdV9tZW1faG90cGx1Z191bnBsdWcodm9pZCkKIHsKIAljZ3JvdXBfbG9jaygpOwotCW11dGV4X2xvY2soJmNhbGxiYWNrX211dGV4KTsKIAotCWd1YXJhbnRlZV9vbmxpbmVfY3B1c19tZW1zX2luX3N1YnRyZWUoJnRvcF9jcHVzZXQpOwogCXRvcF9jcHVzZXQuY3B1c19hbGxvd2VkID0gY3B1X29ubGluZV9tYXA7CiAJdG9wX2NwdXNldC5tZW1zX2FsbG93ZWQgPSBub2RlX3N0YXRlc1tOX0hJR0hfTUVNT1JZXTsKKwlzY2FuX2Zvcl9lbXB0eV9jcHVzZXRzKCZ0b3BfY3B1c2V0KTsKIAotCW11dGV4X3VubG9jaygmY2FsbGJhY2tfbXV0ZXgpOwogCWNncm91cF91bmxvY2soKTsKIH0KIApAQCAtMTgyNiw3ICsxODY0LDcgQEAKIAogLyoqCiAgKiBjcHVzZXRfY3B1c19hbGxvd2VkX2xvY2tlZCAtIHJldHVybiBjcHVzX2FsbG93ZWQgbWFzayBmcm9tIGEgdGFza3MgY3B1c2V0LgotICogTXVzdCBiZSAgY2FsbGVkIHdpdGggY2FsbGJhY2tfbXV0ZXggaGVsZC4KKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggY2FsbGJhY2tfbXV0ZXggaGVsZC4KICAqKi8KIGNwdW1hc2tfdCBjcHVzZXRfY3B1c19hbGxvd2VkX2xvY2tlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKQEAgLTIxNjMsMTAgKzIyMDEsOCBAQAogICogIC0gVXNlZCBmb3IgL3Byb2MvPHBpZD4vY3B1c2V0LgogICogIC0gTm8gbmVlZCB0byB0YXNrX2xvY2sodHNrKSBvbiB0aGlzIHRzay0+Y3B1c2V0IHJlZmVyZW5jZSwgYXMgaXQKICAqICAgIGRvZXNuJ3QgcmVhbGx5IG1hdHRlciBpZiB0c2stPmNwdXNldCBjaGFuZ2VzIGFmdGVyIHdlIHJlYWQgaXQsCi0gKiAgICBhbmQgd2UgdGFrZSBtYW5hZ2VfbXV0ZXgsIGtlZXBpbmcgYXR0YWNoX3Rhc2soKSBmcm9tIGNoYW5naW5nIGl0Ci0gKiAgICBhbnl3YXkuICBObyBuZWVkIHRvIGNoZWNrIHRoYXQgdHNrLT5jcHVzZXQgIT0gTlVMTCwgdGhhbmtzIHRvCi0gKiAgICB0aGVfdG9wX2NwdXNldF9oYWNrIGluIGNwdXNldF9leGl0KCksIHdoaWNoIHNldHMgYW4gZXhpdGluZyB0YXNrcwotICogICAgY3B1c2V0IHRvIHRvcF9jcHVzZXQuCisgKiAgICBhbmQgd2UgdGFrZSBjZ3JvdXBfbXV0ZXgsIGtlZXBpbmcgY3B1c2V0X2F0dGFjaCgpIGZyb20gY2hhbmdpbmcgaXQKKyAqICAgIGFueXdheS4KICAqLwogc3RhdGljIGludCBwcm9jX2NwdXNldF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdW51c2VkX3YpCiB7CkBAIC0yMjE5LDEzICsyMjU1LDE0IEBACiAjZW5kaWYgLyogQ09ORklHX1BST0NfUElEX0NQVVNFVCAqLwogCiAvKiBEaXNwbGF5IHRhc2sgY3B1c19hbGxvd2VkLCBtZW1zX2FsbG93ZWQgaW4gL3Byb2MvPHBpZD4vc3RhdHVzIGZpbGUuICovCi1jaGFyICpjcHVzZXRfdGFza19zdGF0dXNfYWxsb3dlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKmJ1ZmZlcikKK3ZvaWQgY3B1c2V0X3Rhc2tfc3RhdHVzX2FsbG93ZWQoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0JYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAiQ3B1c19hbGxvd2VkOlx0Iik7Ci0JYnVmZmVyICs9IGNwdW1hc2tfc2NucHJpbnRmKGJ1ZmZlciwgUEFHRV9TSVpFLCB0YXNrLT5jcHVzX2FsbG93ZWQpOwotCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwgIlxuIik7Ci0JYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAiTWVtc19hbGxvd2VkOlx0Iik7Ci0JYnVmZmVyICs9IG5vZGVtYXNrX3NjbnByaW50ZihidWZmZXIsIFBBR0VfU0laRSwgdGFzay0+bWVtc19hbGxvd2VkKTsKLQlidWZmZXIgKz0gc3ByaW50ZihidWZmZXIsICJcbiIpOwotCXJldHVybiBidWZmZXI7CisJc2VxX3ByaW50ZihtLCAiQ3B1c19hbGxvd2VkOlx0Iik7CisJbS0+Y291bnQgKz0gY3B1bWFza19zY25wcmludGYobS0+YnVmICsgbS0+Y291bnQsIG0tPnNpemUgLSBtLT5jb3VudCwKKwkJCQkJdGFzay0+Y3B1c19hbGxvd2VkKTsKKwlzZXFfcHJpbnRmKG0sICJcbiIpOworCXNlcV9wcmludGYobSwgIk1lbXNfYWxsb3dlZDpcdCIpOworCW0tPmNvdW50ICs9IG5vZGVtYXNrX3NjbnByaW50ZihtLT5idWYgKyBtLT5jb3VudCwgbS0+c2l6ZSAtIG0tPmNvdW50LAorCQkJCQl0YXNrLT5tZW1zX2FsbG93ZWQpOworCXNlcV9wcmludGYobSwgIlxuIik7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvZXhpdC5jIGIva2VybmVsL2V4aXQuYwppbmRleCBlYjk5MzRhLi4zYjg5M2U3IDEwMDY0NAotLS0gYS9rZXJuZWwvZXhpdC5jCisrKyBiL2tlcm5lbC9leGl0LmMKQEAgLTI5MywyNiArMjkzLDI3IEBACiAJc3dpdGNoX3VpZChJTklUX1VTRVIpOwogfQogCi12b2lkIF9fc2V0X3NwZWNpYWxfcGlkcyhwaWRfdCBzZXNzaW9uLCBwaWRfdCBwZ3JwKQordm9pZCBfX3NldF9zcGVjaWFsX3BpZHMoc3RydWN0IHBpZCAqcGlkKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqY3VyciA9IGN1cnJlbnQtPmdyb3VwX2xlYWRlcjsKKwlwaWRfdCBuciA9IHBpZF9ucihwaWQpOwogCi0JaWYgKHRhc2tfc2Vzc2lvbl9ucihjdXJyKSAhPSBzZXNzaW9uKSB7CisJaWYgKHRhc2tfc2Vzc2lvbihjdXJyKSAhPSBwaWQpIHsKIAkJZGV0YWNoX3BpZChjdXJyLCBQSURUWVBFX1NJRCk7Ci0JCXNldF90YXNrX3Nlc3Npb24oY3Vyciwgc2Vzc2lvbik7Ci0JCWF0dGFjaF9waWQoY3VyciwgUElEVFlQRV9TSUQsIGZpbmRfcGlkKHNlc3Npb24pKTsKKwkJYXR0YWNoX3BpZChjdXJyLCBQSURUWVBFX1NJRCwgcGlkKTsKKwkJc2V0X3Rhc2tfc2Vzc2lvbihjdXJyLCBucik7CiAJfQotCWlmICh0YXNrX3BncnBfbnIoY3VycikgIT0gcGdycCkgeworCWlmICh0YXNrX3BncnAoY3VycikgIT0gcGlkKSB7CiAJCWRldGFjaF9waWQoY3VyciwgUElEVFlQRV9QR0lEKTsKLQkJc2V0X3Rhc2tfcGdycChjdXJyLCBwZ3JwKTsKLQkJYXR0YWNoX3BpZChjdXJyLCBQSURUWVBFX1BHSUQsIGZpbmRfcGlkKHBncnApKTsKKwkJYXR0YWNoX3BpZChjdXJyLCBQSURUWVBFX1BHSUQsIHBpZCk7CisJCXNldF90YXNrX3BncnAoY3VyciwgbnIpOwogCX0KIH0KIAotc3RhdGljIHZvaWQgc2V0X3NwZWNpYWxfcGlkcyhwaWRfdCBzZXNzaW9uLCBwaWRfdCBwZ3JwKQorc3RhdGljIHZvaWQgc2V0X3NwZWNpYWxfcGlkcyhzdHJ1Y3QgcGlkICpwaWQpCiB7CiAJd3JpdGVfbG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOwotCV9fc2V0X3NwZWNpYWxfcGlkcyhzZXNzaW9uLCBwZ3JwKTsKKwlfX3NldF9zcGVjaWFsX3BpZHMocGlkKTsKIAl3cml0ZV91bmxvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKIH0KIApAQCAtMzgzLDcgKzM4NCwxMSBAQAogCSAqLwogCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwogCi0Jc2V0X3NwZWNpYWxfcGlkcygxLCAxKTsKKwlpZiAoY3VycmVudC0+bnNwcm94eSAhPSAmaW5pdF9uc3Byb3h5KSB7CisJCWdldF9uc3Byb3h5KCZpbml0X25zcHJveHkpOworCQlzd2l0Y2hfdGFza19uYW1lc3BhY2VzKGN1cnJlbnQsICZpbml0X25zcHJveHkpOworCX0KKwlzZXRfc3BlY2lhbF9waWRzKCZpbml0X3N0cnVjdF9waWQpOwogCXByb2NfY2xlYXJfdHR5KGN1cnJlbnQpOwogCiAJLyogQmxvY2sgYW5kIGZsdXNoIGFsbCBzaWduYWxzICovCkBAIC0zOTgsMTEgKzQwMyw2IEBACiAJY3VycmVudC0+ZnMgPSBmczsKIAlhdG9taWNfaW5jKCZmcy0+Y291bnQpOwogCi0JaWYgKGN1cnJlbnQtPm5zcHJveHkgIT0gaW5pdF90YXNrLm5zcHJveHkpIHsKLQkJZ2V0X25zcHJveHkoaW5pdF90YXNrLm5zcHJveHkpOwotCQlzd2l0Y2hfdGFza19uYW1lc3BhY2VzKGN1cnJlbnQsIGluaXRfdGFzay5uc3Byb3h5KTsKLQl9Ci0KIAlleGl0X2ZpbGVzKGN1cnJlbnQpOwogCWN1cnJlbnQtPmZpbGVzID0gaW5pdF90YXNrLmZpbGVzOwogCWF0b21pY19pbmMoJmN1cnJlbnQtPmZpbGVzLT5jb3VudCk7CkBAIC00NTgsNyArNDU4LDcgQEAKIAlyZXR1cm4gZmlsZXM7CiB9CiAKLXZvaWQgZmFzdGNhbGwgcHV0X2ZpbGVzX3N0cnVjdChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcykKK3ZvaWQgcHV0X2ZpbGVzX3N0cnVjdChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcykKIHsKIAlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwogCkBAIC03NDUsMjQgKzc0NSw2IEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICp0OwogCXN0cnVjdCBwaWQgKnBncnA7CiAKLQlpZiAoc2lnbmFsX3BlbmRpbmcodHNrKSAmJiAhKHRzay0+c2lnbmFsLT5mbGFncyAmIFNJR05BTF9HUk9VUF9FWElUKQotCSAgICAmJiAhdGhyZWFkX2dyb3VwX2VtcHR5KHRzaykpIHsKLQkJLyoKLQkJICogVGhpcyBvY2N1cnMgd2hlbiB0aGVyZSB3YXMgYSByYWNlIGJldHdlZW4gb3VyIGV4aXQKLQkJICogc3lzY2FsbCBhbmQgYSBncm91cCBzaWduYWwgY2hvb3NpbmcgdXMgYXMgdGhlIG9uZSB0bwotCQkgKiB3YWtlIHVwLiAgSXQgY291bGQgYmUgdGhhdCB3ZSBhcmUgdGhlIG9ubHkgdGhyZWFkCi0JCSAqIGFsZXJ0ZWQgdG8gY2hlY2sgZm9yIHBlbmRpbmcgc2lnbmFscywgYnV0IGFub3RoZXIgdGhyZWFkCi0JCSAqIHNob3VsZCBiZSB3b2tlbiBub3cgdG8gdGFrZSB0aGUgc2lnbmFsIHNpbmNlIHdlIHdpbGwgbm90LgotCQkgKiBOb3cgd2UnbGwgd2FrZSBhbGwgdGhlIHRocmVhZHMgaW4gdGhlIGdyb3VwIGp1c3QgdG8gbWFrZQotCQkgKiBzdXJlIHNvbWVvbmUgZ2V0cyBhbGwgdGhlIHBlbmRpbmcgc2lnbmFscy4KLQkJICovCi0JCXNwaW5fbG9ja19pcnEoJnRzay0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JCWZvciAodCA9IG5leHRfdGhyZWFkKHRzayk7IHQgIT0gdHNrOyB0ID0gbmV4dF90aHJlYWQodCkpCi0JCQlpZiAoIXNpZ25hbF9wZW5kaW5nKHQpICYmICEodC0+ZmxhZ3MgJiBQRl9FWElUSU5HKSkKLQkJCQlyZWNhbGNfc2lncGVuZGluZ19hbmRfd2FrZSh0KTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOwotCX0KLQogCS8qCiAJICogVGhpcyBkb2VzIHR3byB0aGluZ3M6CiAJICoKQEAgLTkwNSw3ICs4ODcsNyBAQAogCXphcF9waWRfbnNfcHJvY2Vzc2VzKHRzay0+bnNwcm94eS0+cGlkX25zKTsKIH0KIAotZmFzdGNhbGwgTk9SRVRfVFlQRSB2b2lkIGRvX2V4aXQobG9uZyBjb2RlKQorTk9SRVRfVFlQRSB2b2lkIGRvX2V4aXQobG9uZyBjb2RlKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKIAlpbnQgZ3JvdXBfZGVhZDsKQEAgLTk0Nyw3ICs5MjksNyBAQAogCQlzY2hlZHVsZSgpOwogCX0KIAotCXRzay0+ZmxhZ3MgfD0gUEZfRVhJVElORzsKKwlleGl0X3NpZ25hbHModHNrKTsgIC8qIHNldHMgUEZfRVhJVElORyAqLwogCS8qCiAJICogdHNrLT5mbGFncyBhcmUgY2hlY2tlZCBpbiB0aGUgZnV0ZXggY29kZSB0byBwcm90ZWN0IGFnYWluc3QKIAkgKiBhbiBleGl0aW5nIHRhc2sgY2xlYW5pbmcgdXAgdGhlIHJvYnVzdCBwaSBmdXRleGVzLgpAQCAtMTEwOCwyMCArMTA5MCwyMyBAQAogCWRvX2dyb3VwX2V4aXQoKGVycm9yX2NvZGUgJiAweGZmKSA8PCA4KTsKIH0KIAotc3RhdGljIGludCBlbGlnaWJsZV9jaGlsZChwaWRfdCBwaWQsIGludCBvcHRpb25zLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCitzdGF0aWMgc3RydWN0IHBpZCAqdGFza19waWRfdHlwZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGVudW0gcGlkX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgcGlkICpwaWQgPSBOVUxMOworCWlmICh0eXBlID09IFBJRFRZUEVfUElEKQorCQlwaWQgPSB0YXNrLT5waWRzW3R5cGVdLnBpZDsKKwllbHNlIGlmICh0eXBlIDwgUElEVFlQRV9NQVgpCisJCXBpZCA9IHRhc2stPmdyb3VwX2xlYWRlci0+cGlkc1t0eXBlXS5waWQ7CisJcmV0dXJuIHBpZDsKK30KKworc3RhdGljIGludCBlbGlnaWJsZV9jaGlsZChlbnVtIHBpZF90eXBlIHR5cGUsIHN0cnVjdCBwaWQgKnBpZCwgaW50IG9wdGlvbnMsCisJCQkgIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKIAlpbnQgZXJyOwotCXN0cnVjdCBwaWRfbmFtZXNwYWNlICpuczsKIAotCW5zID0gY3VycmVudC0+bnNwcm94eS0+cGlkX25zOwotCWlmIChwaWQgPiAwKSB7Ci0JCWlmICh0YXNrX3BpZF9ucl9ucyhwLCBucykgIT0gcGlkKQotCQkJcmV0dXJuIDA7Ci0JfSBlbHNlIGlmICghcGlkKSB7Ci0JCWlmICh0YXNrX3BncnBfbnJfbnMocCwgbnMpICE9IHRhc2tfcGdycF92bnIoY3VycmVudCkpCi0JCQlyZXR1cm4gMDsKLQl9IGVsc2UgaWYgKHBpZCAhPSAtMSkgewotCQlpZiAodGFza19wZ3JwX25yX25zKHAsIG5zKSAhPSAtcGlkKQorCWlmICh0eXBlIDwgUElEVFlQRV9NQVgpIHsKKwkJaWYgKHRhc2tfcGlkX3R5cGUocCwgdHlwZSkgIT0gcGlkKQogCQkJcmV0dXJuIDA7CiAJfQogCkBAIC0xMTQwLDE4ICsxMTI1LDE2IEBACiAJaWYgKCgocC0+ZXhpdF9zaWduYWwgIT0gU0lHQ0hMRCkgXiAoKG9wdGlvbnMgJiBfX1dDTE9ORSkgIT0gMCkpCiAJICAgICYmICEob3B0aW9ucyAmIF9fV0FMTCkpCiAJCXJldHVybiAwOwotCS8qCi0JICogRG8gbm90IGNvbnNpZGVyIHRocmVhZCBncm91cCBsZWFkZXJzIHRoYXQgYXJlCi0JICogaW4gYSBub24tZW1wdHkgdGhyZWFkIGdyb3VwOgotCSAqLwotCWlmIChkZWxheV9ncm91cF9sZWFkZXIocCkpCi0JCXJldHVybiAyOwogCiAJZXJyID0gc2VjdXJpdHlfdGFza193YWl0KHApOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7CisJaWYgKGxpa2VseSghZXJyKSkKKwkJcmV0dXJuIDE7CiAKLQlyZXR1cm4gMTsKKwlpZiAodHlwZSAhPSBQSURUWVBFX1BJRCkKKwkJcmV0dXJuIDA7CisJLyogVGhpcyBjaGlsZCB3YXMgZXhwbGljaXRseSByZXF1ZXN0ZWQsIGFib3J0ICovCisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgd2FpdF9ub3JlYXBfY29weW91dChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHBpZF90IHBpZCwgdWlkX3QgdWlkLApAQCAtMTE5MSwyMCArMTE3NCwxMyBAQAogewogCXVuc2lnbmVkIGxvbmcgc3RhdGU7CiAJaW50IHJldHZhbCwgc3RhdHVzLCB0cmFjZWQ7Ci0Jc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zOwotCi0JbnMgPSBjdXJyZW50LT5uc3Byb3h5LT5waWRfbnM7CisJcGlkX3QgcGlkID0gdGFza19waWRfdm5yKHApOwogCiAJaWYgKHVubGlrZWx5KG5vcmVhcCkpIHsKLQkJcGlkX3QgcGlkID0gdGFza19waWRfbnJfbnMocCwgbnMpOwogCQl1aWRfdCB1aWQgPSBwLT51aWQ7CiAJCWludCBleGl0X2NvZGUgPSBwLT5leGl0X2NvZGU7CiAJCWludCB3aHksIHN0YXR1czsKIAotCQlpZiAodW5saWtlbHkocC0+ZXhpdF9zdGF0ZSAhPSBFWElUX1pPTUJJRSkpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKHVubGlrZWx5KHAtPmV4aXRfc2lnbmFsID09IC0xICYmIHAtPnB0cmFjZSA9PSAwKSkKLQkJCXJldHVybiAwOwogCQlnZXRfdGFza19zdHJ1Y3QocCk7CiAJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAkJaWYgKChleGl0X2NvZGUgJiAweDdmKSA9PSAwKSB7CkBAIC0xMzE1LDExICsxMjkxLDExIEBACiAJCQlyZXR2YWwgPSBwdXRfdXNlcihzdGF0dXMsICZpbmZvcC0+c2lfc3RhdHVzKTsKIAl9CiAJaWYgKCFyZXR2YWwgJiYgaW5mb3ApCi0JCXJldHZhbCA9IHB1dF91c2VyKHRhc2tfcGlkX25yX25zKHAsIG5zKSwgJmluZm9wLT5zaV9waWQpOworCQlyZXR2YWwgPSBwdXRfdXNlcihwaWQsICZpbmZvcC0+c2lfcGlkKTsKIAlpZiAoIXJldHZhbCAmJiBpbmZvcCkKIAkJcmV0dmFsID0gcHV0X3VzZXIocC0+dWlkLCAmaW5mb3AtPnNpX3VpZCk7CiAJaWYgKCFyZXR2YWwpCi0JCXJldHZhbCA9IHRhc2tfcGlkX25yX25zKHAsIG5zKTsKKwkJcmV0dmFsID0gcGlkOwogCiAJaWYgKHRyYWNlZCkgewogCQl3cml0ZV9sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CkBAIC0xMzUxLDIxICsxMzI3LDM4IEBACiAgKiB0aGUgbG9jayBhbmQgdGhpcyB0YXNrIGlzIHVuaW50ZXJlc3RpbmcuICBJZiB3ZSByZXR1cm4gbm9uemVybywgd2UgaGF2ZQogICogcmVsZWFzZWQgdGhlIGxvY2sgYW5kIHRoZSBzeXN0ZW0gY2FsbCBzaG91bGQgcmV0dXJuLgogICovCi1zdGF0aWMgaW50IHdhaXRfdGFza19zdG9wcGVkKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IGRlbGF5ZWRfZ3JvdXBfbGVhZGVyLAorc3RhdGljIGludCB3YWl0X3Rhc2tfc3RvcHBlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCiAJCQkgICAgIGludCBub3JlYXAsIHN0cnVjdCBzaWdpbmZvIF9fdXNlciAqaW5mb3AsCiAJCQkgICAgIGludCBfX3VzZXIgKnN0YXRfYWRkciwgc3RydWN0IHJ1c2FnZSBfX3VzZXIgKnJ1KQogewotCWludCByZXR2YWwsIGV4aXRfY29kZTsKKwlpbnQgcmV0dmFsLCBleGl0X2NvZGUsIHdoeTsKKwl1aWRfdCB1aWQgPSAwOyAvKiB1bm5lZWRlZCwgcmVxdWlyZWQgYnkgY29tcGlsZXIgKi8KIAlwaWRfdCBwaWQ7CiAKLQlpZiAoIXAtPmV4aXRfY29kZSkKLQkJcmV0dXJuIDA7Ci0JaWYgKGRlbGF5ZWRfZ3JvdXBfbGVhZGVyICYmICEocC0+cHRyYWNlICYgUFRfUFRSQUNFRCkgJiYKLQkgICAgcC0+c2lnbmFsLT5ncm91cF9zdG9wX2NvdW50ID4gMCkKKwlleGl0X2NvZGUgPSAwOworCXNwaW5fbG9ja19pcnEoJnAtPnNpZ2hhbmQtPnNpZ2xvY2spOworCisJaWYgKHVubGlrZWx5KCF0YXNrX2lzX3N0b3BwZWRfb3JfdHJhY2VkKHApKSkKKwkJZ290byB1bmxvY2tfc2lnOworCisJaWYgKCEocC0+cHRyYWNlICYgUFRfUFRSQUNFRCkgJiYgcC0+c2lnbmFsLT5ncm91cF9zdG9wX2NvdW50ID4gMCkKIAkJLyoKIAkJICogQSBncm91cCBzdG9wIGlzIGluIHByb2dyZXNzIGFuZCB0aGlzIGlzIHRoZSBncm91cCBsZWFkZXIuCiAJCSAqIFdlIHdvbid0IHJlcG9ydCB1bnRpbCBhbGwgdGhyZWFkcyBoYXZlIHN0b3BwZWQuCiAJCSAqLworCQlnb3RvIHVubG9ja19zaWc7CisKKwlleGl0X2NvZGUgPSBwLT5leGl0X2NvZGU7CisJaWYgKCFleGl0X2NvZGUpCisJCWdvdG8gdW5sb2NrX3NpZzsKKworCWlmICghbm9yZWFwKQorCQlwLT5leGl0X2NvZGUgPSAwOworCisJdWlkID0gcC0+dWlkOwordW5sb2NrX3NpZzoKKwlzcGluX3VubG9ja19pcnEoJnAtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWlmICghZXhpdF9jb2RlKQogCQlyZXR1cm4gMDsKIAogCS8qCkBAIC0xMzc1LDY1ICsxMzY4LDE1IEBACiAJICoga2VlcCBob2xkaW5nIG9udG8gdGhlIHRhc2tsaXN0X2xvY2sgd2hpbGUgd2UgY2FsbCBnZXRydXNhZ2UgYW5kCiAJICogcG9zc2libHkgdGFrZSBwYWdlIGZhdWx0cyBmb3IgdXNlciBtZW1vcnkuCiAJICovCi0JcGlkID0gdGFza19waWRfbnJfbnMocCwgY3VycmVudC0+bnNwcm94eS0+cGlkX25zKTsKIAlnZXRfdGFza19zdHJ1Y3QocCk7CisJcGlkID0gdGFza19waWRfdm5yKHApOworCXdoeSA9IChwLT5wdHJhY2UgJiBQVF9QVFJBQ0VEKSA/IENMRF9UUkFQUEVEIDogQ0xEX1NUT1BQRUQ7CiAJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwogCi0JaWYgKHVubGlrZWx5KG5vcmVhcCkpIHsKLQkJdWlkX3QgdWlkID0gcC0+dWlkOwotCQlpbnQgd2h5ID0gKHAtPnB0cmFjZSAmIFBUX1BUUkFDRUQpID8gQ0xEX1RSQVBQRUQgOiBDTERfU1RPUFBFRDsKLQotCQlleGl0X2NvZGUgPSBwLT5leGl0X2NvZGU7Ci0JCWlmICh1bmxpa2VseSghZXhpdF9jb2RlKSB8fCB1bmxpa2VseShwLT5leGl0X3N0YXRlKSkKLQkJCWdvdG8gYmFpbF9yZWY7CisJaWYgKHVubGlrZWx5KG5vcmVhcCkpCiAJCXJldHVybiB3YWl0X25vcmVhcF9jb3B5b3V0KHAsIHBpZCwgdWlkLAogCQkJCQkgICB3aHksIGV4aXRfY29kZSwKIAkJCQkJICAgaW5mb3AsIHJ1KTsKLQl9Ci0KLQl3cml0ZV9sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7Ci0KLQkvKgotCSAqIFRoaXMgdXNlcyB4Y2hnIHRvIGJlIGF0b21pYyB3aXRoIHRoZSB0aHJlYWQgcmVzdW1pbmcgYW5kIHNldHRpbmcKLQkgKiBpdC4gIEl0IG11c3QgYWxzbyBiZSBkb25lIHdpdGggdGhlIHdyaXRlIGxvY2sgaGVsZCB0byBwcmV2ZW50IGEKLQkgKiByYWNlIHdpdGggdGhlIEVYSVRfWk9NQklFIGNhc2UuCi0JICovCi0JZXhpdF9jb2RlID0geGNoZygmcC0+ZXhpdF9jb2RlLCAwKTsKLQlpZiAodW5saWtlbHkocC0+ZXhpdF9zdGF0ZSkpIHsKLQkJLyoKLQkJICogVGhlIHRhc2sgcmVzdW1lZCBhbmQgdGhlbiBkaWVkLiAgTGV0IHRoZSBuZXh0IGl0ZXJhdGlvbgotCQkgKiBjYXRjaCBpdCBpbiBFWElUX1pPTUJJRS4gIE5vdGUgdGhhdCBleGl0X2NvZGUgbWlnaHQKLQkJICogYWxyZWFkeSBiZSB6ZXJvIGhlcmUgaWYgaXQgcmVzdW1lZCBhbmQgZGlkIF9leGl0KDApLgotCQkgKiBUaGUgdGFzayBpdHNlbGYgaXMgZGVhZCBhbmQgd29uJ3QgdG91Y2ggZXhpdF9jb2RlIGFnYWluOwotCQkgKiBvdGhlciBwcm9jZXNzb3JzIGluIHRoaXMgZnVuY3Rpb24gYXJlIGxvY2tlZCBvdXQuCi0JCSAqLwotCQlwLT5leGl0X2NvZGUgPSBleGl0X2NvZGU7Ci0JCWV4aXRfY29kZSA9IDA7Ci0JfQotCWlmICh1bmxpa2VseShleGl0X2NvZGUgPT0gMCkpIHsKLQkJLyoKLQkJICogQW5vdGhlciB0aHJlYWQgaW4gdGhpcyBmdW5jdGlvbiBnb3QgdG8gaXQgZmlyc3QsIG9yIGl0Ci0JCSAqIHJlc3VtZWQsIG9yIGl0IHJlc3VtZWQgYW5kIHRoZW4gZGllZC4KLQkJICovCi0JCXdyaXRlX3VubG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOwotYmFpbF9yZWY6Ci0JCXB1dF90YXNrX3N0cnVjdChwKTsKLQkJLyoKLQkJICogV2UgYXJlIHJldHVybmluZyB0byB0aGUgd2FpdCBsb29wIHdpdGhvdXQgaGF2aW5nIHN1Y2Nlc3NmdWxseQotCQkgKiByZW1vdmVkIHRoZSBwcm9jZXNzIGFuZCBoYXZpbmcgcmVsZWFzZWQgdGhlIGxvY2suIFdlIGNhbm5vdAotCQkgKiBjb250aW51ZSwgc2luY2UgdGhlICJwIiB0YXNrIHBvaW50ZXIgaXMgcG90ZW50aWFsbHkgc3RhbGUuCi0JCSAqCi0JCSAqIFJldHVybiAtRUFHQUlOLCBhbmQgZG9fd2FpdCgpIHdpbGwgcmVzdGFydCB0aGUgbG9vcCBmcm9tIHRoZQotCQkgKiBiZWdpbm5pbmcuIERvIF9ub3RfIHJlLWFjcXVpcmUgdGhlIGxvY2suCi0JCSAqLwotCQlyZXR1cm4gLUVBR0FJTjsKLQl9Ci0KLQkvKiBtb3ZlIHRvIGVuZCBvZiBwYXJlbnQncyBsaXN0IHRvIGF2b2lkIHN0YXJ2YXRpb24gKi8KLQlyZW1vdmVfcGFyZW50KHApOwotCWFkZF9wYXJlbnQocCk7Ci0KLQl3cml0ZV91bmxvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKIAogCXJldHZhbCA9IHJ1ID8gZ2V0cnVzYWdlKHAsIFJVU0FHRV9CT1RILCBydSkgOiAwOwogCWlmICghcmV0dmFsICYmIHN0YXRfYWRkcikKQEAgLTE0NDMsMTUgKzEzODYsMTMgQEAKIAlpZiAoIXJldHZhbCAmJiBpbmZvcCkKIAkJcmV0dmFsID0gcHV0X3VzZXIoMCwgJmluZm9wLT5zaV9lcnJubyk7CiAJaWYgKCFyZXR2YWwgJiYgaW5mb3ApCi0JCXJldHZhbCA9IHB1dF91c2VyKChzaG9ydCkoKHAtPnB0cmFjZSAmIFBUX1BUUkFDRUQpCi0JCQkJCSAgPyBDTERfVFJBUFBFRCA6IENMRF9TVE9QUEVEKSwKLQkJCQkgICZpbmZvcC0+c2lfY29kZSk7CisJCXJldHZhbCA9IHB1dF91c2VyKHdoeSwgJmluZm9wLT5zaV9jb2RlKTsKIAlpZiAoIXJldHZhbCAmJiBpbmZvcCkKIAkJcmV0dmFsID0gcHV0X3VzZXIoZXhpdF9jb2RlLCAmaW5mb3AtPnNpX3N0YXR1cyk7CiAJaWYgKCFyZXR2YWwgJiYgaW5mb3ApCiAJCXJldHZhbCA9IHB1dF91c2VyKHBpZCwgJmluZm9wLT5zaV9waWQpOwogCWlmICghcmV0dmFsICYmIGluZm9wKQotCQlyZXR2YWwgPSBwdXRfdXNlcihwLT51aWQsICZpbmZvcC0+c2lfdWlkKTsKKwkJcmV0dmFsID0gcHV0X3VzZXIodWlkLCAmaW5mb3AtPnNpX3VpZCk7CiAJaWYgKCFyZXR2YWwpCiAJCXJldHZhbCA9IHBpZDsKIAlwdXRfdGFza19zdHJ1Y3QocCk7CkBAIC0xNDczLDcgKzE0MTQsNiBAQAogCWludCByZXR2YWw7CiAJcGlkX3QgcGlkOwogCXVpZF90IHVpZDsKLQlzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnM7CiAKIAlpZiAoIShwLT5zaWduYWwtPmZsYWdzICYgU0lHTkFMX1NUT1BfQ09OVElOVUVEKSkKIAkJcmV0dXJuIDA7CkBAIC0xNDg4LDggKzE0MjgsNyBAQAogCQlwLT5zaWduYWwtPmZsYWdzICY9IH5TSUdOQUxfU1RPUF9DT05USU5VRUQ7CiAJc3Bpbl91bmxvY2tfaXJxKCZwLT5zaWdoYW5kLT5zaWdsb2NrKTsKIAotCW5zID0gY3VycmVudC0+bnNwcm94eS0+cGlkX25zOwotCXBpZCA9IHRhc2tfcGlkX25yX25zKHAsIG5zKTsKKwlwaWQgPSB0YXNrX3BpZF92bnIocCk7CiAJdWlkID0gcC0+dWlkOwogCWdldF90YXNrX3N0cnVjdChwKTsKIAlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CkBAIC0xNTAwLDcgKzE0MzksNyBAQAogCQlpZiAoIXJldHZhbCAmJiBzdGF0X2FkZHIpCiAJCQlyZXR2YWwgPSBwdXRfdXNlcigweGZmZmYsIHN0YXRfYWRkcik7CiAJCWlmICghcmV0dmFsKQotCQkJcmV0dmFsID0gdGFza19waWRfbnJfbnMocCwgbnMpOworCQkJcmV0dmFsID0gcGlkOwogCX0gZWxzZSB7CiAJCXJldHZhbCA9IHdhaXRfbm9yZWFwX2NvcHlvdXQocCwgcGlkLCB1aWQsCiAJCQkJCSAgICAgQ0xEX0NPTlRJTlVFRCwgU0lHQ09OVCwKQEAgLTE1MTEsMTAxICsxNDUwLDYzIEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotCi1zdGF0aWMgaW5saW5lIGludCBteV9wdHJhY2VfY2hpbGQoc3RydWN0IHRhc2tfc3RydWN0ICpwKQotewotCWlmICghKHAtPnB0cmFjZSAmIFBUX1BUUkFDRUQpKQotCQlyZXR1cm4gMDsKLQlpZiAoIShwLT5wdHJhY2UgJiBQVF9BVFRBQ0hFRCkpCi0JCXJldHVybiAxOwotCS8qCi0JICogVGhpcyBjaGlsZCB3YXMgUFRSQUNFX0FUVEFDSCdkLiAgV2Ugc2hvdWxkIGJlIHNlZWluZyBpdCBvbmx5IGlmCi0JICogd2UgYXJlIHRoZSBhdHRhY2hlci4gIElmIHdlIGFyZSB0aGUgcmVhbCBwYXJlbnQsIHRoaXMgaXMgYSByYWNlCi0JICogaW5zaWRlIHB0cmFjZV9hdHRhY2guICBJdCBpcyB3YWl0aW5nIGZvciB0aGUgdGFza2xpc3RfbG9jaywKLQkgKiB3aGljaCB3ZSBoYXZlIHRvIHN3aXRjaCB0aGUgcGFyZW50IGxpbmtzLCBidXQgaGFzIGFscmVhZHkgc2V0Ci0JICogdGhlIGZsYWdzIGluIHAtPnB0cmFjZS4KLQkgKi8KLQlyZXR1cm4gKHAtPnBhcmVudCAhPSBwLT5yZWFsX3BhcmVudCk7Ci19Ci0KLXN0YXRpYyBsb25nIGRvX3dhaXQocGlkX3QgcGlkLCBpbnQgb3B0aW9ucywgc3RydWN0IHNpZ2luZm8gX191c2VyICppbmZvcCwKLQkJICAgIGludCBfX3VzZXIgKnN0YXRfYWRkciwgc3RydWN0IHJ1c2FnZSBfX3VzZXIgKnJ1KQorc3RhdGljIGxvbmcgZG9fd2FpdChlbnVtIHBpZF90eXBlIHR5cGUsIHN0cnVjdCBwaWQgKnBpZCwgaW50IG9wdGlvbnMsCisJCSAgICBzdHJ1Y3Qgc2lnaW5mbyBfX3VzZXIgKmluZm9wLCBpbnQgX191c2VyICpzdGF0X2FkZHIsCisJCSAgICBzdHJ1Y3QgcnVzYWdlIF9fdXNlciAqcnUpCiB7CiAJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CiAJaW50IGZsYWcsIHJldHZhbDsKLQlpbnQgYWxsb3dlZCwgZGVuaWVkOwogCiAJYWRkX3dhaXRfcXVldWUoJmN1cnJlbnQtPnNpZ25hbC0+d2FpdF9jaGxkZXhpdCwmd2FpdCk7CiByZXBlYXQ6CisJLyogSWYgdGhlcmUgaXMgbm90aGluZyB0aGF0IGNhbiBtYXRjaCBvdXIgY3JpdGllciBqdXN0IGdldCBvdXQgKi8KKwlyZXR2YWwgPSAtRUNISUxEOworCWlmICgodHlwZSA8IFBJRFRZUEVfTUFYKSAmJiAoIXBpZCB8fCBobGlzdF9lbXB0eSgmcGlkLT50YXNrc1t0eXBlXSkpKQorCQlnb3RvIGVuZDsKKwogCS8qCiAJICogV2Ugd2lsbCBzZXQgdGhpcyBmbGFnIGlmIHdlIHNlZSBhbnkgY2hpbGQgdGhhdCBtaWdodCBsYXRlcgogCSAqIG1hdGNoIG91ciBjcml0ZXJpYSwgZXZlbiBpZiB3ZSBhcmUgbm90IGFibGUgdG8gcmVhcCBpdCB5ZXQuCiAJICovCi0JZmxhZyA9IDA7Ci0JYWxsb3dlZCA9IGRlbmllZCA9IDA7CisJZmxhZyA9IHJldHZhbCA9IDA7CiAJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CiAJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAl0c2sgPSBjdXJyZW50OwogCWRvIHsKIAkJc3RydWN0IHRhc2tfc3RydWN0ICpwOwotCQlpbnQgcmV0OwogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJnRzay0+Y2hpbGRyZW4sIHNpYmxpbmcpIHsKLQkJCXJldCA9IGVsaWdpYmxlX2NoaWxkKHBpZCwgb3B0aW9ucywgcCk7CisJCQlpbnQgcmV0ID0gZWxpZ2libGVfY2hpbGQodHlwZSwgcGlkLCBvcHRpb25zLCBwKTsKIAkJCWlmICghcmV0KQogCQkJCWNvbnRpbnVlOwogCiAJCQlpZiAodW5saWtlbHkocmV0IDwgMCkpIHsKLQkJCQlkZW5pZWQgPSByZXQ7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlhbGxvd2VkID0gMTsKLQotCQkJaWYgKHRhc2tfaXNfc3RvcHBlZF9vcl90cmFjZWQocCkpIHsKKwkJCQlyZXR2YWwgPSByZXQ7CisJCQl9IGVsc2UgaWYgKHRhc2tfaXNfc3RvcHBlZF9vcl90cmFjZWQocCkpIHsKIAkJCQkvKgogCQkJCSAqIEl0J3Mgc3RvcHBlZCBub3csIHNvIGl0IG1pZ2h0IGxhdGVyCiAJCQkJICogY29udGludWUsIGV4aXQsIG9yIHN0b3AgYWdhaW4uCi0JCQkJICoKLQkJCQkgKiBXaGVuIHdlIGhpdCB0aGUgcmFjZSB3aXRoIFBUUkFDRV9BVFRBQ0gsIHdlCi0JCQkJICogd2lsbCBub3QgcmVwb3J0IHRoaXMgY2hpbGQuICBCdXQgdGhlIHJhY2UKLQkJCQkgKiBtZWFucyBpdCBoYXMgbm90IHlldCBiZWVuIG1vdmVkIHRvIG91cgotCQkJCSAqIHB0cmFjZV9jaGlsZHJlbiBsaXN0LCBzbyB3ZSBuZWVkIHRvIHNldCB0aGUKLQkJCQkgKiBmbGFnIGhlcmUgdG8gYXZvaWQgYSBzcHVyaW91cyBFQ0hJTEQgd2hlbgotCQkJCSAqIHRoZSByYWNlIGhhcHBlbnMgd2l0aCB0aGUgb25seSBjaGlsZC4KIAkJCQkgKi8KIAkJCQlmbGFnID0gMTsKKwkJCQlpZiAoIShwLT5wdHJhY2UgJiBQVF9QVFJBQ0VEKSAmJgorCQkJCSAgICAhKG9wdGlvbnMgJiBXVU5UUkFDRUQpKQorCQkJCQljb250aW51ZTsKIAotCQkJCWlmICghbXlfcHRyYWNlX2NoaWxkKHApKSB7Ci0JCQkJCWlmICh0YXNrX2lzX3RyYWNlZChwKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlpZiAoIShvcHRpb25zICYgV1VOVFJBQ0VEKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCXJldHZhbCA9IHdhaXRfdGFza19zdG9wcGVkKHAsIHJldCA9PSAyLAorCQkJCXJldHZhbCA9IHdhaXRfdGFza19zdG9wcGVkKHAsCiAJCQkJCQkob3B0aW9ucyAmIFdOT1dBSVQpLCBpbmZvcCwKIAkJCQkJCXN0YXRfYWRkciwgcnUpOwotCQkJCWlmIChyZXR2YWwgPT0gLUVBR0FJTikKLQkJCQkJZ290byByZXBlYXQ7Ci0JCQkJaWYgKHJldHZhbCAhPSAwKSAvKiBIZSByZWxlYXNlZCB0aGUgbG9jay4gICovCi0JCQkJCWdvdG8gZW5kOwotCQkJfSBlbHNlIGlmIChwLT5leGl0X3N0YXRlID09IEVYSVRfWk9NQklFKSB7CisJCQl9IGVsc2UgaWYgKHAtPmV4aXRfc3RhdGUgPT0gRVhJVF9aT01CSUUgJiYKKwkJCQkJIWRlbGF5X2dyb3VwX2xlYWRlcihwKSkgewogCQkJCS8qCi0JCQkJICogRWxpZ2libGUgYnV0IHdlIGNhbm5vdCByZWxlYXNlIGl0IHlldDoKKwkJCQkgKiBXZSBkb24ndCByZWFwIGdyb3VwIGxlYWRlcnMgd2l0aCBzdWJ0aHJlYWRzLgogCQkJCSAqLwotCQkJCWlmIChyZXQgPT0gMikKLQkJCQkJZ290byBjaGVja19jb250aW51ZWQ7CiAJCQkJaWYgKCFsaWtlbHkob3B0aW9ucyAmIFdFWElURUQpKQogCQkJCQljb250aW51ZTsKIAkJCQlyZXR2YWwgPSB3YWl0X3Rhc2tfem9tYmllKHAsCiAJCQkJCQkob3B0aW9ucyAmIFdOT1dBSVQpLCBpbmZvcCwKIAkJCQkJCXN0YXRfYWRkciwgcnUpOwotCQkJCS8qIEhlIHJlbGVhc2VkIHRoZSBsb2NrLiAgKi8KLQkJCQlpZiAocmV0dmFsICE9IDApCi0JCQkJCWdvdG8gZW5kOwogCQkJfSBlbHNlIGlmIChwLT5leGl0X3N0YXRlICE9IEVYSVRfREVBRCkgewotY2hlY2tfY29udGludWVkOgogCQkJCS8qCiAJCQkJICogSXQncyBydW5uaW5nIG5vdywgc28gaXQgbWlnaHQgbGF0ZXIKIAkJCQkgKiBleGl0LCBzdG9wLCBvciBzdG9wIGFuZCB0aGVuIGNvbnRpbnVlLgpAQCAtMTYxNiwxNyArMTUxNywyMCBAQAogCQkJCXJldHZhbCA9IHdhaXRfdGFza19jb250aW51ZWQocCwKIAkJCQkJCShvcHRpb25zICYgV05PV0FJVCksIGluZm9wLAogCQkJCQkJc3RhdF9hZGRyLCBydSk7Ci0JCQkJaWYgKHJldHZhbCAhPSAwKSAvKiBIZSByZWxlYXNlZCB0aGUgbG9jay4gICovCi0JCQkJCWdvdG8gZW5kOwogCQkJfQorCQkJaWYgKHJldHZhbCAhPSAwKSAvKiB0YXNrbGlzdF9sb2NrIHJlbGVhc2VkICovCisJCQkJZ290byBlbmQ7CiAJCX0KIAkJaWYgKCFmbGFnKSB7CiAJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZ0c2stPnB0cmFjZV9jaGlsZHJlbiwKLQkJCQkJICAgIHB0cmFjZV9saXN0KSB7Ci0JCQkJaWYgKCFlbGlnaWJsZV9jaGlsZChwaWQsIG9wdGlvbnMsIHApKQorCQkJCQkJCQlwdHJhY2VfbGlzdCkgeworCQkJCWZsYWcgPSBlbGlnaWJsZV9jaGlsZCh0eXBlLCBwaWQsIG9wdGlvbnMsIHApOworCQkJCWlmICghZmxhZykKIAkJCQkJY29udGludWU7Ci0JCQkJZmxhZyA9IDE7Ci0JCQkJYnJlYWs7CisJCQkJaWYgKGxpa2VseShmbGFnID4gMCkpCisJCQkJCWJyZWFrOworCQkJCXJldHZhbCA9IGZsYWc7CisJCQkJZ290byBlbmQ7CiAJCQl9CiAJCX0KIAkJaWYgKG9wdGlvbnMgJiBfX1dOT1RIUkVBRCkKQEAgLTE2MzQsMTAgKzE1MzgsOSBAQAogCQl0c2sgPSBuZXh0X3RocmVhZCh0c2spOwogCQlCVUdfT04odHNrLT5zaWduYWwgIT0gY3VycmVudC0+c2lnbmFsKTsKIAl9IHdoaWxlICh0c2sgIT0gY3VycmVudCk7Ci0KIAlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisKIAlpZiAoZmxhZykgewotCQlyZXR2YWwgPSAwOwogCQlpZiAob3B0aW9ucyAmIFdOT0hBTkcpCiAJCQlnb3RvIGVuZDsKIAkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOwpAQCAtMTY0NywxNCArMTU1MCwxMiBAQAogCQlnb3RvIHJlcGVhdDsKIAl9CiAJcmV0dmFsID0gLUVDSElMRDsKLQlpZiAodW5saWtlbHkoZGVuaWVkKSAmJiAhYWxsb3dlZCkKLQkJcmV0dmFsID0gZGVuaWVkOwogZW5kOgogCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwogCXJlbW92ZV93YWl0X3F1ZXVlKCZjdXJyZW50LT5zaWduYWwtPndhaXRfY2hsZGV4aXQsJndhaXQpOwogCWlmIChpbmZvcCkgewogCQlpZiAocmV0dmFsID4gMCkKLQkJcmV0dmFsID0gMDsKKwkJCXJldHZhbCA9IDA7CiAJCWVsc2UgewogCQkJLyoKIAkJCSAqIEZvciBhIFdOT0hBTkcgcmV0dXJuLCBjbGVhciBvdXQgYWxsIHRoZSBmaWVsZHMKQEAgLTE2NzgsMTAgKzE1NzksMTIgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX3dhaXRpZChpbnQgd2hpY2gsIHBpZF90IHBpZCwKK2FzbWxpbmthZ2UgbG9uZyBzeXNfd2FpdGlkKGludCB3aGljaCwgcGlkX3QgdXBpZCwKIAkJCSAgIHN0cnVjdCBzaWdpbmZvIF9fdXNlciAqaW5mb3AsIGludCBvcHRpb25zLAogCQkJICAgc3RydWN0IHJ1c2FnZSBfX3VzZXIgKnJ1KQogeworCXN0cnVjdCBwaWQgKnBpZCA9IE5VTEw7CisJZW51bSBwaWRfdHlwZSB0eXBlOwogCWxvbmcgcmV0OwogCiAJaWYgKG9wdGlvbnMgJiB+KFdOT0hBTkd8V05PV0FJVHxXRVhJVEVEfFdTVE9QUEVEfFdDT05USU5VRUQpKQpAQCAtMTY5MSwzNyArMTU5NCw1OCBAQAogCiAJc3dpdGNoICh3aGljaCkgewogCWNhc2UgUF9BTEw6Ci0JCXBpZCA9IC0xOworCQl0eXBlID0gUElEVFlQRV9NQVg7CiAJCWJyZWFrOwogCWNhc2UgUF9QSUQ6Ci0JCWlmIChwaWQgPD0gMCkKKwkJdHlwZSA9IFBJRFRZUEVfUElEOworCQlpZiAodXBpZCA8PSAwKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWJyZWFrOwogCWNhc2UgUF9QR0lEOgotCQlpZiAocGlkIDw9IDApCisJCXR5cGUgPSBQSURUWVBFX1BHSUQ7CisJCWlmICh1cGlkIDw9IDApCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJcGlkID0gLXBpZDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmV0ID0gZG9fd2FpdChwaWQsIG9wdGlvbnMsIGluZm9wLCBOVUxMLCBydSk7CisJaWYgKHR5cGUgPCBQSURUWVBFX01BWCkKKwkJcGlkID0gZmluZF9nZXRfcGlkKHVwaWQpOworCXJldCA9IGRvX3dhaXQodHlwZSwgcGlkLCBvcHRpb25zLCBpbmZvcCwgTlVMTCwgcnUpOworCXB1dF9waWQocGlkKTsKIAogCS8qIGF2b2lkIFJFR1BBUk0gYnJlYWthZ2Ugb24geDg2OiAqLwogCXByZXZlbnRfdGFpbF9jYWxsKHJldCk7CiAJcmV0dXJuIHJldDsKIH0KIAotYXNtbGlua2FnZSBsb25nIHN5c193YWl0NChwaWRfdCBwaWQsIGludCBfX3VzZXIgKnN0YXRfYWRkciwKK2FzbWxpbmthZ2UgbG9uZyBzeXNfd2FpdDQocGlkX3QgdXBpZCwgaW50IF9fdXNlciAqc3RhdF9hZGRyLAogCQkJICBpbnQgb3B0aW9ucywgc3RydWN0IHJ1c2FnZSBfX3VzZXIgKnJ1KQogeworCXN0cnVjdCBwaWQgKnBpZCA9IE5VTEw7CisJZW51bSBwaWRfdHlwZSB0eXBlOwogCWxvbmcgcmV0OwogCiAJaWYgKG9wdGlvbnMgJiB+KFdOT0hBTkd8V1VOVFJBQ0VEfFdDT05USU5VRUR8CiAJCQlfX1dOT1RIUkVBRHxfX1dDTE9ORXxfX1dBTEwpKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXQgPSBkb193YWl0KHBpZCwgb3B0aW9ucyB8IFdFWElURUQsIE5VTEwsIHN0YXRfYWRkciwgcnUpOworCisJaWYgKHVwaWQgPT0gLTEpCisJCXR5cGUgPSBQSURUWVBFX01BWDsKKwllbHNlIGlmICh1cGlkIDwgMCkgeworCQl0eXBlID0gUElEVFlQRV9QR0lEOworCQlwaWQgPSBmaW5kX2dldF9waWQoLXVwaWQpOworCX0gZWxzZSBpZiAodXBpZCA9PSAwKSB7CisJCXR5cGUgPSBQSURUWVBFX1BHSUQ7CisJCXBpZCA9IGdldF9waWQodGFza19wZ3JwKGN1cnJlbnQpKTsKKwl9IGVsc2UgLyogdXBpZCA+IDAgKi8geworCQl0eXBlID0gUElEVFlQRV9QSUQ7CisJCXBpZCA9IGZpbmRfZ2V0X3BpZCh1cGlkKTsKKwl9CisKKwlyZXQgPSBkb193YWl0KHR5cGUsIHBpZCwgb3B0aW9ucyB8IFdFWElURUQsIE5VTEwsIHN0YXRfYWRkciwgcnUpOworCXB1dF9waWQocGlkKTsKIAogCS8qIGF2b2lkIFJFR1BBUk0gYnJlYWthZ2Ugb24geDg2OiAqLwogCXByZXZlbnRfdGFpbF9jYWxsKHJldCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvZm9yay5jIGIva2VybmVsL2ZvcmsuYwppbmRleCAzOTk1Mjk3Li40MzYzYTRlIDEwMDY0NAotLS0gYS9rZXJuZWwvZm9yay5jCisrKyBiL2tlcm5lbC9mb3JrLmMKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CisjaW5jbHVkZSA8bGludXgvbWVtY29udHJvbC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9ybWFwLmg+CiAjaW5jbHVkZSA8bGludXgvYWNjdC5oPgpAQCAtMzQwLDcgKzM0MSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0X3Rhc2suaD4KIAotc3RhdGljIHN0cnVjdCBtbV9zdHJ1Y3QgKiBtbV9pbml0KHN0cnVjdCBtbV9zdHJ1Y3QgKiBtbSkKK3N0YXRpYyBzdHJ1Y3QgbW1fc3RydWN0ICogbW1faW5pdChzdHJ1Y3QgbW1fc3RydWN0ICogbW0sIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKIAlhdG9taWNfc2V0KCZtbS0+bW1fdXNlcnMsIDEpOwogCWF0b21pY19zZXQoJm1tLT5tbV9jb3VudCwgMSk7CkBAIC0zNTcsMTEgKzM1OCwxNCBAQAogCW1tLT5pb2N0eF9saXN0ID0gTlVMTDsKIAltbS0+ZnJlZV9hcmVhX2NhY2hlID0gVEFTS19VTk1BUFBFRF9CQVNFOwogCW1tLT5jYWNoZWRfaG9sZV9zaXplID0gfjBVTDsKKwltbV9pbml0X2Nncm91cChtbSwgcCk7CiAKIAlpZiAobGlrZWx5KCFtbV9hbGxvY19wZ2QobW0pKSkgewogCQltbS0+ZGVmX2ZsYWdzID0gMDsKIAkJcmV0dXJuIG1tOwogCX0KKworCW1tX2ZyZWVfY2dyb3VwKG1tKTsKIAlmcmVlX21tKG1tKTsKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTM3Niw3ICszODAsNyBAQAogCW1tID0gYWxsb2NhdGVfbW0oKTsKIAlpZiAobW0pIHsKIAkJbWVtc2V0KG1tLCAwLCBzaXplb2YoKm1tKSk7Ci0JCW1tID0gbW1faW5pdChtbSk7CisJCW1tID0gbW1faW5pdChtbSwgY3VycmVudCk7CiAJfQogCXJldHVybiBtbTsKIH0KQEAgLTM4NiwxMCArMzkwLDExIEBACiAgKiBpcyBkcm9wcGVkOiBlaXRoZXIgYnkgYSBsYXp5IHRocmVhZCBvciBieQogICogbW1wdXQuIEZyZWUgdGhlIHBhZ2UgZGlyZWN0b3J5IGFuZCB0aGUgbW0uCiAgKi8KLXZvaWQgZmFzdGNhbGwgX19tbWRyb3Aoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit2b2lkIF9fbW1kcm9wKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewogCUJVR19PTihtbSA9PSAmaW5pdF9tbSk7CiAJbW1fZnJlZV9wZ2QobW0pOworCW1tX2ZyZWVfY2dyb3VwKG1tKTsKIAlkZXN0cm95X2NvbnRleHQobW0pOwogCWZyZWVfbW0obW0pOwogfQpAQCAtNTExLDcgKzUxNiw3IEBACiAJbW0tPnRva2VuX3ByaW9yaXR5ID0gMDsKIAltbS0+bGFzdF9pbnRlcnZhbCA9IDA7CiAKLQlpZiAoIW1tX2luaXQobW0pKQorCWlmICghbW1faW5pdChtbSwgdHNrKSkKIAkJZ290byBmYWlsX25vbWVtOwogCiAJaWYgKGluaXRfbmV3X2NvbnRleHQodHNrLCBtbSkpCkBAIC05MDQsNyArOTA5LDYgQEAKIAlocnRpbWVyX2luaXQoJnNpZy0+cmVhbF90aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKIAlzaWctPml0X3JlYWxfaW5jci50djY0ID0gMDsKIAlzaWctPnJlYWxfdGltZXIuZnVuY3Rpb24gPSBpdF9yZWFsX2ZuOwotCXNpZy0+dHNrID0gdHNrOwogCiAJc2lnLT5pdF92aXJ0X2V4cGlyZXMgPSBjcHV0aW1lX3plcm87CiAJc2lnLT5pdF92aXJ0X2luY3IgPSBjcHV0aW1lX3plcm87CkBAIC0xMzMzLDYgKzEzMzcsNyBAQAogCQkJaWYgKGNsb25lX2ZsYWdzICYgQ0xPTkVfTkVXUElEKQogCQkJCXAtPm5zcHJveHktPnBpZF9ucy0+Y2hpbGRfcmVhcGVyID0gcDsKIAorCQkJcC0+c2lnbmFsLT5sZWFkZXJfcGlkID0gcGlkOwogCQkJcC0+c2lnbmFsLT50dHkgPSBjdXJyZW50LT5zaWduYWwtPnR0eTsKIAkJCXNldF90YXNrX3BncnAocCwgdGFza19wZ3JwX25yKGN1cnJlbnQpKTsKIAkJCXNldF90YXNrX3Nlc3Npb24ocCwgdGFza19zZXNzaW9uX25yKGN1cnJlbnQpKTsKQEAgLTE0ODMsMTMgKzE0ODgsNyBAQAogCWlmICghSVNfRVJSKHApKSB7CiAJCXN0cnVjdCBjb21wbGV0aW9uIHZmb3JrOwogCi0JCS8qCi0JCSAqIHRoaXMgaXMgZW5vdWdoIHRvIGNhbGwgcGlkX25yX25zIGhlcmUsIGJ1dCB0aGlzIGlmCi0JCSAqIGltcHJvdmVzIG9wdGltaXNhdGlvbiBvZiByZWd1bGFyIGZvcmsoKQotCQkgKi8KLQkJbnIgPSAoY2xvbmVfZmxhZ3MgJiBDTE9ORV9ORVdQSUQpID8KLQkJCXRhc2tfcGlkX25yX25zKHAsIGN1cnJlbnQtPm5zcHJveHktPnBpZF9ucykgOgotCQkJCXRhc2tfcGlkX3ZucihwKTsKKwkJbnIgPSB0YXNrX3BpZF92bnIocCk7CiAKIAkJaWYgKGNsb25lX2ZsYWdzICYgQ0xPTkVfUEFSRU5UX1NFVFRJRCkKIAkJCXB1dF91c2VyKG5yLCBwYXJlbnRfdGlkcHRyKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvY2hpcC5jIGIva2VybmVsL2lycS9jaGlwLmMKaW5kZXggNDQwMTljZS4uY2M1NGM2MiAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9jaGlwLmMKKysrIGIva2VybmVsL2lycS9jaGlwLmMKQEAgLTI4Niw3ICsyODYsNyBAQAogICoJTm90ZTogVGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBoYW5kbGUgdGhlIGFjaywgY2xlYXIsIG1hc2sgYW5kCiAgKgl1bm1hc2sgaXNzdWVzIGlmIG5lY2Vzc2FyeS4KICAqLwotdm9pZCBmYXN0Y2FsbAordm9pZAogaGFuZGxlX3NpbXBsZV9pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewogCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbjsKQEAgLTMyNyw3ICszMjcsNyBAQAogICoJaXQgYWZ0ZXIgdGhlIGFzc29jaWF0ZWQgaGFuZGxlciBoYXMgYWNrbm93bGVkZ2VkIHRoZSBkZXZpY2UsIHNvIHRoZQogICoJaW50ZXJydXB0IGxpbmUgaXMgYmFjayB0byBpbmFjdGl2ZS4KICAqLwotdm9pZCBmYXN0Y2FsbAordm9pZAogaGFuZGxlX2xldmVsX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKQEAgLTM3NSw3ICszNzUsNyBAQAogICoJZm9yIG1vZGVybiBmb3JtcyBvZiBpbnRlcnJ1cHQgaGFuZGxlcnMsIHdoaWNoIGhhbmRsZSB0aGUgZmxvdwogICoJZGV0YWlscyBpbiBoYXJkd2FyZSwgdHJhbnNwYXJlbnRseS4KICAqLwotdm9pZCBmYXN0Y2FsbAordm9pZAogaGFuZGxlX2Zhc3Rlb2lfaXJxKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKIAl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwpAQCAtNDM0LDcgKzQzNCw3IEBACiAgKgl0aGUgaGFuZGxlciB3YXMgcnVubmluZy4gSWYgYWxsIHBlbmRpbmcgaW50ZXJydXB0cyBhcmUgaGFuZGxlZCwgdGhlCiAgKglsb29wIGlzIGxlZnQuCiAgKi8KLXZvaWQgZmFzdGNhbGwKK3ZvaWQKIGhhbmRsZV9lZGdlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJY29uc3QgdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKQEAgLTUwNSw3ICs1MDUsNyBAQAogICoKICAqCVBlciBDUFUgaW50ZXJydXB0cyBvbiBTTVAgbWFjaGluZXMgd2l0aG91dCBsb2NraW5nIHJlcXVpcmVtZW50cwogICovCi12b2lkIGZhc3RjYWxsCit2b2lkCiBoYW5kbGVfcGVyY3B1X2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJaXJxcmV0dXJuX3QgYWN0aW9uX3JldDsKQEAgLTU4OSwzICs1ODksMzkgQEAKIAlzZXRfaXJxX2NoaXAoaXJxLCBjaGlwKTsKIAlfX3NldF9pcnFfaGFuZGxlcihpcnEsIGhhbmRsZSwgMCwgbmFtZSk7CiB9CisKK3ZvaWQgX19pbml0IHNldF9pcnFfbm9wcm9iZSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGlycSA+PSBOUl9JUlFTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVHJ5aW5nIHRvIG1hcmsgSVJRJWQgbm9uLXByb2JlYWJsZVxuIiwgaXJxKTsKKworCQlyZXR1cm47CisJfQorCisJZGVzYyA9IGlycV9kZXNjICsgaXJxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKKwlkZXNjLT5zdGF0dXMgfD0gSVJRX05PUFJPQkU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOworfQorCit2b2lkIF9faW5pdCBzZXRfaXJxX3Byb2JlKHVuc2lnbmVkIGludCBpcnEpCit7CisJc3RydWN0IGlycV9kZXNjICpkZXNjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaXJxID49IE5SX0lSUVMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJUcnlpbmcgdG8gbWFyayBJUlElZCBwcm9iZWFibGVcbiIsIGlycSk7CisKKwkJcmV0dXJuOworCX0KKworCWRlc2MgPSBpcnFfZGVzYyArIGlycTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXNjLT5sb2NrLCBmbGFncyk7CisJZGVzYy0+c3RhdHVzICY9IH5JUlFfTk9QUk9CRTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXNjLT5sb2NrLCBmbGFncyk7Cit9CmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2hhbmRsZS5jIGIva2VybmVsL2lycS9oYW5kbGUuYwppbmRleCBkYzMzNWFkLi41ZmE2MTk4IDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2hhbmRsZS5jCisrKyBiL2tlcm5lbC9pcnEvaGFuZGxlLmMKQEAgLTI1LDcgKzI1LDcgQEAKICAqCiAgKiBIYW5kbGVzIHNwdXJpb3VzIGFuZCB1bmhhbmRsZWQgSVJRJ3MuIEl0IGFsc28gcHJpbnRzIGEgZGVidWdtZXNzYWdlLgogICovCi12b2lkIGZhc3RjYWxsCit2b2lkCiBoYW5kbGVfYmFkX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCiB7CiAJcHJpbnRfaXJxX2Rlc2MoaXJxLCBkZXNjKTsKQEAgLTE2Myw3ICsxNjMsNyBAQAogICogVGhpcyBpcyB0aGUgb3JpZ2luYWwgeDg2IGltcGxlbWVudGF0aW9uIHdoaWNoIGlzIHVzZWQgZm9yIGV2ZXJ5CiAgKiBpbnRlcnJ1cHQgdHlwZS4KICAqLwotZmFzdGNhbGwgdW5zaWduZWQgaW50IF9fZG9fSVJRKHVuc2lnbmVkIGludCBpcnEpCit1bnNpZ25lZCBpbnQgX19kb19JUlEodW5zaWduZWQgaW50IGlycSkKIHsKIAlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKIAlzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb247CmRpZmYgLS1naXQgYS9rZXJuZWwvaXRpbWVyLmMgYi9rZXJuZWwvaXRpbWVyLmMKaW5kZXggMmZhYjM0NC4uYWI5ODI3NCAxMDA2NDQKLS0tIGEva2VybmVsL2l0aW1lci5jCisrKyBiL2tlcm5lbC9pdGltZXIuYwpAQCAtMTMyLDcgKzEzMiw3IEBACiAJc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnNpZyA9CiAJCWNvbnRhaW5lcl9vZih0aW1lciwgc3RydWN0IHNpZ25hbF9zdHJ1Y3QsIHJlYWxfdGltZXIpOwogCi0Jc2VuZF9ncm91cF9zaWdfaW5mbyhTSUdBTFJNLCBTRU5EX1NJR19QUklWLCBzaWctPnRzayk7CisJa2lsbF9waWRfaW5mbyhTSUdBTFJNLCBTRU5EX1NJR19QUklWLCBzaWctPmxlYWRlcl9waWQpOwogCiAJcmV0dXJuIEhSVElNRVJfTk9SRVNUQVJUOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2tleGVjLmMgYi9rZXJuZWwva2V4ZWMuYwppbmRleCA5YTI2ZWVjLi4wNmEwZTI3IDEwMDY0NAotLS0gYS9rZXJuZWwva2V4ZWMuYworKysgYi9rZXJuZWwva2V4ZWMuYwpAQCAtMTM2MSw4ICsxMzYxLDggQEAKIAogc3RhdGljIGludCBfX2luaXQgY3Jhc2hfc2F2ZV92bWNvcmVpbmZvX2luaXQodm9pZCkKIHsKLQl2bWNvcmVpbmZvX2FwcGVuZF9zdHIoIk9TUkVMRUFTRT0lc1xuIiwgaW5pdF91dHNfbnMubmFtZS5yZWxlYXNlKTsKLQl2bWNvcmVpbmZvX2FwcGVuZF9zdHIoIlBBR0VTSVpFPSVsZFxuIiwgUEFHRV9TSVpFKTsKKwlWTUNPUkVJTkZPX09TUkVMRUFTRShpbml0X3V0c19ucy5uYW1lLnJlbGVhc2UpOworCVZNQ09SRUlORk9fUEFHRVNJWkUoUEFHRV9TSVpFKTsKIAogCVZNQ09SRUlORk9fU1lNQk9MKGluaXRfdXRzX25zKTsKIAlWTUNPUkVJTkZPX1NZTUJPTChub2RlX29ubGluZV9tYXApOwpAQCAtMTM3NiwxNSArMTM3NiwxNSBAQAogI2lmZGVmIENPTkZJR19TUEFSU0VNRU0KIAlWTUNPUkVJTkZPX1NZTUJPTChtZW1fc2VjdGlvbik7CiAJVk1DT1JFSU5GT19MRU5HVEgobWVtX3NlY3Rpb24sIE5SX1NFQ1RJT05fUk9PVFMpOwotCVZNQ09SRUlORk9fU0laRShtZW1fc2VjdGlvbik7CisJVk1DT1JFSU5GT19TVFJVQ1RfU0laRShtZW1fc2VjdGlvbik7CiAJVk1DT1JFSU5GT19PRkZTRVQobWVtX3NlY3Rpb24sIHNlY3Rpb25fbWVtX21hcCk7CiAjZW5kaWYKLQlWTUNPUkVJTkZPX1NJWkUocGFnZSk7Ci0JVk1DT1JFSU5GT19TSVpFKHBnbGlzdF9kYXRhKTsKLQlWTUNPUkVJTkZPX1NJWkUoem9uZSk7Ci0JVk1DT1JFSU5GT19TSVpFKGZyZWVfYXJlYSk7Ci0JVk1DT1JFSU5GT19TSVpFKGxpc3RfaGVhZCk7Ci0JVk1DT1JFSU5GT19UWVBFREVGX1NJWkUobm9kZW1hc2tfdCk7CisJVk1DT1JFSU5GT19TVFJVQ1RfU0laRShwYWdlKTsKKwlWTUNPUkVJTkZPX1NUUlVDVF9TSVpFKHBnbGlzdF9kYXRhKTsKKwlWTUNPUkVJTkZPX1NUUlVDVF9TSVpFKHpvbmUpOworCVZNQ09SRUlORk9fU1RSVUNUX1NJWkUoZnJlZV9hcmVhKTsKKwlWTUNPUkVJTkZPX1NUUlVDVF9TSVpFKGxpc3RfaGVhZCk7CisJVk1DT1JFSU5GT19TSVpFKG5vZGVtYXNrX3QpOwogCVZNQ09SRUlORk9fT0ZGU0VUKHBhZ2UsIGZsYWdzKTsKIAlWTUNPUkVJTkZPX09GRlNFVChwYWdlLCBfY291bnQpOwogCVZNQ09SRUlORk9fT0ZGU0VUKHBhZ2UsIG1hcHBpbmcpOwpkaWZmIC0tZ2l0IGEva2VybmVsL21vZHVsZS5jIGIva2VybmVsL21vZHVsZS5jCmluZGV4IGJkNjAyNzhlLi40MjAyZGE5IDEwMDY0NAotLS0gYS9rZXJuZWwvbW9kdWxlLmMKKysrIGIva2VybmVsL21vZHVsZS5jCkBAIC00Niw2ICs0Niw3IEBACiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8bGludXgvbGljZW5zZS5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogCiAjaWYgMAogI2RlZmluZSBERUJVR1AgcHJpbnRrCkBAIC0yOTAsNyArMjkxLDcgQEAKIAkJfQogCX0KIAlERUJVR1AoIkZhaWxlZCB0byBmaW5kIHN5bWJvbCAlc1xuIiwgbmFtZSk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKIC8qIFNlYXJjaCBmb3IgbW9kdWxlIGJ5IG5hbWU6IG11c3QgaG9sZCBtb2R1bGVfbXV0ZXguICovCkBAIC0zNDMsOSArMzQ0LDYgQEAKIAlyZXR1cm4gdmFsOwogfQogCi0vKiBDcmVhdGVkIGJ5IGxpbmtlciBtYWdpYyAqLwotZXh0ZXJuIGNoYXIgX19wZXJfY3B1X3N0YXJ0W10sIF9fcGVyX2NwdV9lbmRbXTsKLQogc3RhdGljIHZvaWQgKnBlcmNwdV9tb2RhbGxvYyh1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgYWxpZ24sCiAJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUpCiB7CkBAIC03ODMsNyArNzgxLDcgQEAKIAljb25zdCB1bnNpZ25lZCBsb25nICpjcmM7CiAKIAlwcmVlbXB0X2Rpc2FibGUoKTsKLQlpZiAoIV9fZmluZF9zeW1ib2woc3ltYm9sLCAmb3duZXIsICZjcmMsIDEpKQorCWlmIChJU19FUlJfVkFMVUUoX19maW5kX3N5bWJvbChzeW1ib2wsICZvd25lciwgJmNyYywgMSkpKQogCQlCVUcoKTsKIAltb2R1bGVfcHV0KG93bmVyKTsKIAlwcmVlbXB0X2VuYWJsZSgpOwpAQCAtOTI5LDcgKzkyNyw4IEBACiAJY29uc3QgdW5zaWduZWQgbG9uZyAqY3JjOwogCXN0cnVjdCBtb2R1bGUgKm93bmVyOwogCi0JaWYgKCFfX2ZpbmRfc3ltYm9sKCJzdHJ1Y3RfbW9kdWxlIiwgJm93bmVyLCAmY3JjLCAxKSkKKwlpZiAoSVNfRVJSX1ZBTFVFKF9fZmluZF9zeW1ib2woInN0cnVjdF9tb2R1bGUiLAorCQkJCQkJJm93bmVyLCAmY3JjLCAxKSkpCiAJCUJVRygpOwogCXJldHVybiBjaGVja192ZXJzaW9uKHNlY2hkcnMsIHZlcnNpbmRleCwgInN0cnVjdF9tb2R1bGUiLCBtb2QsCiAJCQkgICAgIGNyYyk7CkBAIC05NzgsMTIgKzk3NywxMiBAQAogCiAJcmV0ID0gX19maW5kX3N5bWJvbChuYW1lLCAmb3duZXIsICZjcmMsCiAJCQkhKG1vZC0+dGFpbnRzICYgVEFJTlRfUFJPUFJJRVRBUllfTU9EVUxFKSk7Ci0JaWYgKHJldCkgeworCWlmICghSVNfRVJSX1ZBTFVFKHJldCkpIHsKIAkJLyogdXNlX21vZHVsZSBjYW4gZmFpbCBkdWUgdG8gT09NLAogCQkgICBvciBtb2R1bGUgaW5pdGlhbGl6YXRpb24gb3IgdW5sb2FkaW5nICovCiAJCWlmICghY2hlY2tfdmVyc2lvbihzZWNoZHJzLCB2ZXJzaW5kZXgsIG5hbWUsIG1vZCwgY3JjKSB8fAogCQkgICAgIXVzZV9tb2R1bGUobW9kLCBvd25lcikpCi0JCQlyZXQgPSAwOworCQkJcmV0ID0gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIHJldDsKIH0KQEAgLTEzNzEsNyArMTM3MCw5IEBACiAKIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAl2YWx1ZSA9IF9fZmluZF9zeW1ib2woc3ltYm9sLCAmb3duZXIsICZjcmMsIDEpOwotCWlmICh2YWx1ZSAmJiBzdHJvbmdfdHJ5X21vZHVsZV9nZXQob3duZXIpICE9IDApCisJaWYgKElTX0VSUl9WQUxVRSh2YWx1ZSkpCisJCXZhbHVlID0gMDsKKwllbHNlIGlmIChzdHJvbmdfdHJ5X21vZHVsZV9nZXQob3duZXIpKQogCQl2YWx1ZSA9IDA7CiAJcHJlZW1wdF9lbmFibGUoKTsKIApAQCAtMTM5MSwxNCArMTM5MiwxNiBAQAogCWNvbnN0IHVuc2lnbmVkIGxvbmcgKmNyYzsKIAogCWZvciAoaSA9IDA7IGkgPCBtb2QtPm51bV9zeW1zOyBpKyspCi0JCWlmIChfX2ZpbmRfc3ltYm9sKG1vZC0+c3ltc1tpXS5uYW1lLCAmb3duZXIsICZjcmMsIDEpKSB7CisJCWlmICghSVNfRVJSX1ZBTFVFKF9fZmluZF9zeW1ib2wobW9kLT5zeW1zW2ldLm5hbWUsCisJCQkJCQkJJm93bmVyLCAmY3JjLCAxKSkpIHsKIAkJCW5hbWUgPSBtb2QtPnN5bXNbaV0ubmFtZTsKIAkJCXJldCA9IC1FTk9FWEVDOwogCQkJZ290byBkdXA7CiAJCX0KIAogCWZvciAoaSA9IDA7IGkgPCBtb2QtPm51bV9ncGxfc3ltczsgaSsrKQotCQlpZiAoX19maW5kX3N5bWJvbChtb2QtPmdwbF9zeW1zW2ldLm5hbWUsICZvd25lciwgJmNyYywgMSkpIHsKKwkJaWYgKCFJU19FUlJfVkFMVUUoX19maW5kX3N5bWJvbChtb2QtPmdwbF9zeW1zW2ldLm5hbWUsCisJCQkJCQkJJm93bmVyLCAmY3JjLCAxKSkpIHsKIAkJCW5hbWUgPSBtb2QtPmdwbF9zeW1zW2ldLm5hbWU7CiAJCQlyZXQgPSAtRU5PRVhFQzsKIAkJCWdvdG8gZHVwOwpAQCAtMTQ0OCw3ICsxNDUxLDcgQEAKIAkJCQkJICAgc3RydGFiICsgc3ltW2ldLnN0X25hbWUsIG1vZCk7CiAKIAkJCS8qIE9rIGlmIHJlc29sdmVkLiAgKi8KLQkJCWlmIChzeW1baV0uc3RfdmFsdWUgIT0gMCkKKwkJCWlmICghSVNfRVJSX1ZBTFVFKHN5bVtpXS5zdF92YWx1ZSkpCiAJCQkJYnJlYWs7CiAJCQkvKiBPayBpZiB3ZWFrLiAgKi8KIAkJCWlmIChFTEZfU1RfQklORChzeW1baV0uc3RfaW5mbykgPT0gU1RCX1dFQUspCkBAIC0yMjUwLDcgKzIyNTMsNyBAQAogCiAvKiBGb3Iga2FsbHN5bXMgdG8gYXNrIGZvciBhZGRyZXNzIHJlc29sdXRpb24uICBOVUxMIG1lYW5zIG5vdCBmb3VuZC4gIENhcmVmdWwKICAqIG5vdCB0byBsb2NrIHRvIGF2b2lkIGRlYWRsb2NrIG9uIG9vcHNlcywgc2ltcGx5IGRpc2FibGUgcHJlZW1wdGlvbi4gKi8KLWNoYXIgKm1vZHVsZV9hZGRyZXNzX2xvb2t1cCh1bnNpZ25lZCBsb25nIGFkZHIsCitjb25zdCBjaGFyICptb2R1bGVfYWRkcmVzc19sb29rdXAodW5zaWduZWQgbG9uZyBhZGRyLAogCQkJICAgIHVuc2lnbmVkIGxvbmcgKnNpemUsCiAJCQkgICAgdW5zaWduZWQgbG9uZyAqb2Zmc2V0LAogCQkJICAgIGNoYXIgKiptb2RuYW1lLApAQCAtMjI3NSw3ICsyMjc4LDcgQEAKIAkJcmV0ID0gbmFtZWJ1ZjsKIAl9CiAJcHJlZW1wdF9lbmFibGUoKTsKLQlyZXR1cm4gKGNoYXIgKilyZXQ7CisJcmV0dXJuIHJldDsKIH0KIAogaW50IGxvb2t1cF9tb2R1bGVfc3ltYm9sX25hbWUodW5zaWduZWQgbG9uZyBhZGRyLCBjaGFyICpzeW1uYW1lKQpkaWZmIC0tZ2l0IGEva2VybmVsL211dGV4LWRlYnVnLmMgYi9rZXJuZWwvbXV0ZXgtZGVidWcuYwppbmRleCBkMTc0MzZjLi4zYWFhMDZjIDEwMDY0NAotLS0gYS9rZXJuZWwvbXV0ZXgtZGVidWcuYworKysgYi9rZXJuZWwvbXV0ZXgtZGVidWcuYwpAQCAtMTA3LDcgKzEwNyw3IEBACiAgKiB1c2Ugb2YgdGhlIG11dGV4IGlzIGZvcmJpZGRlbi4gVGhlIG11dGV4IG11c3Qgbm90IGJlIGxvY2tlZCB3aGVuCiAgKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KICAqLwotdm9pZCBmYXN0Y2FsbCBtdXRleF9kZXN0cm95KHN0cnVjdCBtdXRleCAqbG9jaykKK3ZvaWQgbXV0ZXhfZGVzdHJveShzdHJ1Y3QgbXV0ZXggKmxvY2spCiB7CiAJREVCVUdfTE9DS1NfV0FSTl9PTihtdXRleF9pc19sb2NrZWQobG9jaykpOwogCWxvY2stPm1hZ2ljID0gTlVMTDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9tdXRleC5jIGIva2VybmVsL211dGV4LmMKaW5kZXggZDllYzliNi4uZDA0NmEzNCAxMDA2NDQKLS0tIGEva2VybmVsL211dGV4LmMKKysrIGIva2VybmVsL211dGV4LmMKQEAgLTU4LDcgKzU4LDcgQEAKICAqIFdlIGFsc28gcHV0IHRoZSBmYXN0cGF0aCBmaXJzdCBpbiB0aGUga2VybmVsIGltYWdlLCB0byBtYWtlIHN1cmUgdGhlCiAgKiBicmFuY2ggaXMgcHJlZGljdGVkIGJ5IHRoZSBDUFUgYXMgZGVmYXVsdC11bnRha2VuLgogICovCi1zdGF0aWMgdm9pZCBmYXN0Y2FsbCBub2lubGluZSBfX3NjaGVkCitzdGF0aWMgdm9pZCBub2lubGluZSBfX3NjaGVkCiBfX211dGV4X2xvY2tfc2xvd3BhdGgoYXRvbWljX3QgKmxvY2tfY291bnQpOwogCiAvKioqCkBAIC04Miw3ICs4Miw3IEBACiAgKgogICogVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIChidXQgbm90IGVxdWl2YWxlbnQgdG8pIGRvd24oKS4KICAqLwotdm9pZCBpbmxpbmUgZmFzdGNhbGwgX19zY2hlZCBtdXRleF9sb2NrKHN0cnVjdCBtdXRleCAqbG9jaykKK3ZvaWQgaW5saW5lIF9fc2NoZWQgbXV0ZXhfbG9jayhzdHJ1Y3QgbXV0ZXggKmxvY2spCiB7CiAJbWlnaHRfc2xlZXAoKTsKIAkvKgpAQCAtOTUsOCArOTUsNyBAQAogRVhQT1JUX1NZTUJPTChtdXRleF9sb2NrKTsKICNlbmRpZgogCi1zdGF0aWMgdm9pZCBmYXN0Y2FsbCBub2lubGluZSBfX3NjaGVkCi1fX211dGV4X3VubG9ja19zbG93cGF0aChhdG9taWNfdCAqbG9ja19jb3VudCk7CitzdGF0aWMgbm9pbmxpbmUgdm9pZCBfX3NjaGVkIF9fbXV0ZXhfdW5sb2NrX3Nsb3dwYXRoKGF0b21pY190ICpsb2NrX2NvdW50KTsKIAogLyoqKgogICogbXV0ZXhfdW5sb2NrIC0gcmVsZWFzZSB0aGUgbXV0ZXgKQEAgLTEwOSw3ICsxMDgsNyBAQAogICoKICAqIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byAoYnV0IG5vdCBlcXVpdmFsZW50IHRvKSB1cCgpLgogICovCi12b2lkIGZhc3RjYWxsIF9fc2NoZWQgbXV0ZXhfdW5sb2NrKHN0cnVjdCBtdXRleCAqbG9jaykKK3ZvaWQgX19zY2hlZCBtdXRleF91bmxvY2soc3RydWN0IG11dGV4ICpsb2NrKQogewogCS8qCiAJICogVGhlIHVubG9ja2luZyBmYXN0cGF0aCBpcyB0aGUgMC0+MSB0cmFuc2l0aW9uIGZyb20gJ2xvY2tlZCcKQEAgLTIzNCw3ICsyMzMsNyBAQAogLyoKICAqIFJlbGVhc2UgdGhlIGxvY2ssIHNsb3dwYXRoOgogICovCi1zdGF0aWMgZmFzdGNhbGwgaW5saW5lIHZvaWQKK3N0YXRpYyBpbmxpbmUgdm9pZAogX19tdXRleF91bmxvY2tfY29tbW9uX3Nsb3dwYXRoKGF0b21pY190ICpsb2NrX2NvdW50LCBpbnQgbmVzdGVkKQogewogCXN0cnVjdCBtdXRleCAqbG9jayA9IGNvbnRhaW5lcl9vZihsb2NrX2NvdW50LCBzdHJ1Y3QgbXV0ZXgsIGNvdW50KTsKQEAgLTI3MSw3ICsyNzAsNyBAQAogLyoKICAqIFJlbGVhc2UgdGhlIGxvY2ssIHNsb3dwYXRoOgogICovCi1zdGF0aWMgZmFzdGNhbGwgbm9pbmxpbmUgdm9pZAorc3RhdGljIG5vaW5saW5lIHZvaWQKIF9fbXV0ZXhfdW5sb2NrX3Nsb3dwYXRoKGF0b21pY190ICpsb2NrX2NvdW50KQogewogCV9fbXV0ZXhfdW5sb2NrX2NvbW1vbl9zbG93cGF0aChsb2NrX2NvdW50LCAxKTsKQEAgLTI4MiwxMCArMjgxLDEwIEBACiAgKiBIZXJlIGNvbWUgdGhlIGxlc3MgY29tbW9uIChhbmQgaGVuY2UgbGVzcyBwZXJmb3JtYW5jZS1jcml0aWNhbCkgQVBJczoKICAqIG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgpIGFuZCBtdXRleF90cnlsb2NrKCkuCiAgKi8KLXN0YXRpYyBpbnQgZmFzdGNhbGwgbm9pbmxpbmUgX19zY2hlZAorc3RhdGljIG5vaW5saW5lIGludCBfX3NjaGVkCiBfX211dGV4X2xvY2tfa2lsbGFibGVfc2xvd3BhdGgoYXRvbWljX3QgKmxvY2tfY291bnQpOwogCi1zdGF0aWMgbm9pbmxpbmUgaW50IGZhc3RjYWxsIF9fc2NoZWQKK3N0YXRpYyBub2lubGluZSBpbnQgX19zY2hlZAogX19tdXRleF9sb2NrX2ludGVycnVwdGlibGVfc2xvd3BhdGgoYXRvbWljX3QgKmxvY2tfY291bnQpOwogCiAvKioqCkBAIC0yOTksNyArMjk4LDcgQEAKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gKGJ1dCBub3QgZXF1aXZhbGVudCB0bykgZG93bl9pbnRlcnJ1cHRpYmxlKCkuCiAgKi8KLWludCBmYXN0Y2FsbCBfX3NjaGVkIG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZShzdHJ1Y3QgbXV0ZXggKmxvY2spCitpbnQgX19zY2hlZCBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoc3RydWN0IG11dGV4ICpsb2NrKQogewogCW1pZ2h0X3NsZWVwKCk7CiAJcmV0dXJuIF9fbXV0ZXhfZmFzdHBhdGhfbG9ja19yZXR2YWwKQEAgLTMwOCw3ICszMDcsNyBAQAogCiBFWFBPUlRfU1lNQk9MKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSk7CiAKLWludCBmYXN0Y2FsbCBfX3NjaGVkIG11dGV4X2xvY2tfa2lsbGFibGUoc3RydWN0IG11dGV4ICpsb2NrKQoraW50IF9fc2NoZWQgbXV0ZXhfbG9ja19raWxsYWJsZShzdHJ1Y3QgbXV0ZXggKmxvY2spCiB7CiAJbWlnaHRfc2xlZXAoKTsKIAlyZXR1cm4gX19tdXRleF9mYXN0cGF0aF9sb2NrX3JldHZhbApAQCAtMzE2LDcgKzMxNSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKG11dGV4X2xvY2tfa2lsbGFibGUpOwogCi1zdGF0aWMgdm9pZCBmYXN0Y2FsbCBub2lubGluZSBfX3NjaGVkCitzdGF0aWMgbm9pbmxpbmUgdm9pZCBfX3NjaGVkCiBfX211dGV4X2xvY2tfc2xvd3BhdGgoYXRvbWljX3QgKmxvY2tfY291bnQpCiB7CiAJc3RydWN0IG11dGV4ICpsb2NrID0gY29udGFpbmVyX29mKGxvY2tfY291bnQsIHN0cnVjdCBtdXRleCwgY291bnQpOwpAQCAtMzI0LDcgKzMyMyw3IEBACiAJX19tdXRleF9sb2NrX2NvbW1vbihsb2NrLCBUQVNLX1VOSU5URVJSVVBUSUJMRSwgMCwgX1JFVF9JUF8pOwogfQogCi1zdGF0aWMgaW50IGZhc3RjYWxsIG5vaW5saW5lIF9fc2NoZWQKK3N0YXRpYyBub2lubGluZSBpbnQgX19zY2hlZAogX19tdXRleF9sb2NrX2tpbGxhYmxlX3Nsb3dwYXRoKGF0b21pY190ICpsb2NrX2NvdW50KQogewogCXN0cnVjdCBtdXRleCAqbG9jayA9IGNvbnRhaW5lcl9vZihsb2NrX2NvdW50LCBzdHJ1Y3QgbXV0ZXgsIGNvdW50KTsKQEAgLTMzMiw3ICszMzEsNyBAQAogCXJldHVybiBfX211dGV4X2xvY2tfY29tbW9uKGxvY2ssIFRBU0tfS0lMTEFCTEUsIDAsIF9SRVRfSVBfKTsKIH0KIAotc3RhdGljIG5vaW5saW5lIGludCBmYXN0Y2FsbCBfX3NjaGVkCitzdGF0aWMgbm9pbmxpbmUgaW50IF9fc2NoZWQKIF9fbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlX3Nsb3dwYXRoKGF0b21pY190ICpsb2NrX2NvdW50KQogewogCXN0cnVjdCBtdXRleCAqbG9jayA9IGNvbnRhaW5lcl9vZihsb2NrX2NvdW50LCBzdHJ1Y3QgbXV0ZXgsIGNvdW50KTsKQEAgLTM4MSw3ICszODAsNyBAQAogICogVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSB1c2VkIGluIGludGVycnVwdCBjb250ZXh0LiBUaGUKICAqIG11dGV4IG11c3QgYmUgcmVsZWFzZWQgYnkgdGhlIHNhbWUgdGFzayB0aGF0IGFjcXVpcmVkIGl0LgogICovCi1pbnQgZmFzdGNhbGwgX19zY2hlZCBtdXRleF90cnlsb2NrKHN0cnVjdCBtdXRleCAqbG9jaykKK2ludCBfX3NjaGVkIG11dGV4X3RyeWxvY2soc3RydWN0IG11dGV4ICpsb2NrKQogewogCXJldHVybiBfX211dGV4X2Zhc3RwYXRoX3RyeWxvY2soJmxvY2stPmNvdW50LAogCQkJCQlfX211dGV4X3RyeWxvY2tfc2xvd3BhdGgpOwpkaWZmIC0tZ2l0IGEva2VybmVsL25zcHJveHkuYyBiL2tlcm5lbC9uc3Byb3h5LmMKaW5kZXggNzlmODcxYi4uZjVkMzMyYyAxMDA2NDQKLS0tIGEva2VybmVsL25zcHJveHkuYworKysgYi9rZXJuZWwvbnNwcm94eS5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BpZF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lwY19uYW1lc3BhY2UuaD4KIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpuc3Byb3h5X2NhY2hlcDsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3BhbmljLmMgYi9rZXJuZWwvcGFuaWMuYwppbmRleCBkOWU5MGNmLi4yNGFmOWY4IDEwMDY0NAotLS0gYS9rZXJuZWwvcGFuaWMuYworKysgYi9rZXJuZWwvcGFuaWMuYwpAQCAtMTYxLDcgKzE2MSw3IEBACiB7CiAJc3RhdGljIGNoYXIgYnVmWzIwXTsKIAlpZiAodGFpbnRlZCkgewotCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiVGFpbnRlZDogJWMlYyVjJWMlYyVjJWMlYyIsCisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJUYWludGVkOiAlYyVjJWMlYyVjJWMlYyVjJWMiLAogCQkJdGFpbnRlZCAmIFRBSU5UX1BST1BSSUVUQVJZX01PRFVMRSA/ICdQJyA6ICdHJywKIAkJCXRhaW50ZWQgJiBUQUlOVF9GT1JDRURfTU9EVUxFID8gJ0YnIDogJyAnLAogCQkJdGFpbnRlZCAmIFRBSU5UX1VOU0FGRV9TTVAgPyAnUycgOiAnICcsCkBAIC0xNjksNyArMTY5LDggQEAKIAkJCXRhaW50ZWQgJiBUQUlOVF9NQUNISU5FX0NIRUNLID8gJ00nIDogJyAnLAogCQkJdGFpbnRlZCAmIFRBSU5UX0JBRF9QQUdFID8gJ0InIDogJyAnLAogCQkJdGFpbnRlZCAmIFRBSU5UX1VTRVIgPyAnVScgOiAnICcsCi0JCQl0YWludGVkICYgVEFJTlRfRElFID8gJ0QnIDogJyAnKTsKKwkJCXRhaW50ZWQgJiBUQUlOVF9ESUUgPyAnRCcgOiAnICcsCisJCQl0YWludGVkICYgVEFJTlRfT1ZFUlJJRERFTl9BQ1BJX1RBQkxFID8gJ0EnIDogJyAnKTsKIAl9CiAJZWxzZQogCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiTm90IHRhaW50ZWQiKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wYXJhbXMuYyBiL2tlcm5lbC9wYXJhbXMuYwppbmRleCBlMjhjNzA2Li5hZmM0NmEyIDEwMDY0NAotLS0gYS9rZXJuZWwvcGFyYW1zLmMKKysrIGIva2VybmVsL3BhcmFtcy5jCkBAIC0xODAsMTIgKzE4MCwxMiBAQAogI2RlZmluZSBTVEFOREFSRF9QQVJBTV9ERUYobmFtZSwgdHlwZSwgZm9ybWF0LCB0bXB0eXBlLCBzdHJ0b2xmbikgICAgICAJXAogCWludCBwYXJhbV9zZXRfIyNuYW1lKGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCVwKIAl7CQkJCQkJCQlcCi0JCWNoYXIgKmVuZHA7CQkJCQkJXAogCQl0bXB0eXBlIGw7CQkJCQkJXAorCQlpbnQgcmV0OwkJCQkJCVwKIAkJCQkJCQkJCVwKIAkJaWYgKCF2YWwpIHJldHVybiAtRUlOVkFMOwkJCQlcCi0JCWwgPSBzdHJ0b2xmbih2YWwsICZlbmRwLCAwKTsJCQkJXAotCQlpZiAoZW5kcCA9PSB2YWwgfHwgKCh0eXBlKWwgIT0gbCkpCQkJXAorCQlyZXQgPSBzdHJ0b2xmbih2YWwsIDAsICZsKTsJCQkJXAorCQlpZiAocmV0ID09IC1FSU5WQUwgfHwgKCh0eXBlKWwgIT0gbCkpCQkJXAogCQkJcmV0dXJuIC1FSU5WQUw7CQkJCQlcCiAJCSooKHR5cGUgKilrcC0+YXJnKSA9IGw7CQkJCQlcCiAJCXJldHVybiAwOwkJCQkJCVwKQEAgLTE5NSwxMyArMTk1LDEzIEBACiAJCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgZm9ybWF0LCAqKCh0eXBlICopa3AtPmFyZykpOwlcCiAJfQogCi1TVEFOREFSRF9QQVJBTV9ERUYoYnl0ZSwgdW5zaWduZWQgY2hhciwgIiVjIiwgdW5zaWduZWQgbG9uZywgc2ltcGxlX3N0cnRvdWwpOwotU1RBTkRBUkRfUEFSQU1fREVGKHNob3J0LCBzaG9ydCwgIiVoaSIsIGxvbmcsIHNpbXBsZV9zdHJ0b2wpOwotU1RBTkRBUkRfUEFSQU1fREVGKHVzaG9ydCwgdW5zaWduZWQgc2hvcnQsICIlaHUiLCB1bnNpZ25lZCBsb25nLCBzaW1wbGVfc3RydG91bCk7Ci1TVEFOREFSRF9QQVJBTV9ERUYoaW50LCBpbnQsICIlaSIsIGxvbmcsIHNpbXBsZV9zdHJ0b2wpOwotU1RBTkRBUkRfUEFSQU1fREVGKHVpbnQsIHVuc2lnbmVkIGludCwgIiV1IiwgdW5zaWduZWQgbG9uZywgc2ltcGxlX3N0cnRvdWwpOwotU1RBTkRBUkRfUEFSQU1fREVGKGxvbmcsIGxvbmcsICIlbGkiLCBsb25nLCBzaW1wbGVfc3RydG9sKTsKLVNUQU5EQVJEX1BBUkFNX0RFRih1bG9uZywgdW5zaWduZWQgbG9uZywgIiVsdSIsIHVuc2lnbmVkIGxvbmcsIHNpbXBsZV9zdHJ0b3VsKTsKK1NUQU5EQVJEX1BBUkFNX0RFRihieXRlLCB1bnNpZ25lZCBjaGFyLCAiJWMiLCB1bnNpZ25lZCBsb25nLCBzdHJpY3Rfc3RydG91bCk7CitTVEFOREFSRF9QQVJBTV9ERUYoc2hvcnQsIHNob3J0LCAiJWhpIiwgbG9uZywgc3RyaWN0X3N0cnRvbCk7CitTVEFOREFSRF9QQVJBTV9ERUYodXNob3J0LCB1bnNpZ25lZCBzaG9ydCwgIiVodSIsIHVuc2lnbmVkIGxvbmcsIHN0cmljdF9zdHJ0b3VsKTsKK1NUQU5EQVJEX1BBUkFNX0RFRihpbnQsIGludCwgIiVpIiwgbG9uZywgc3RyaWN0X3N0cnRvbCk7CitTVEFOREFSRF9QQVJBTV9ERUYodWludCwgdW5zaWduZWQgaW50LCAiJXUiLCB1bnNpZ25lZCBsb25nLCBzdHJpY3Rfc3RydG91bCk7CitTVEFOREFSRF9QQVJBTV9ERUYobG9uZywgbG9uZywgIiVsaSIsIGxvbmcsIHN0cmljdF9zdHJ0b2wpOworU1RBTkRBUkRfUEFSQU1fREVGKHVsb25nLCB1bnNpZ25lZCBsb25nLCAiJWx1IiwgdW5zaWduZWQgbG9uZywgc3RyaWN0X3N0cnRvdWwpOwogCiBpbnQgcGFyYW1fc2V0X2NoYXJwKGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCiB7CmRpZmYgLS1naXQgYS9rZXJuZWwvcGlkLmMgYi9rZXJuZWwvcGlkLmMKaW5kZXggZjgxNTQ1NS4uNDc3NjkxNSAxMDA2NDQKLS0tIGEva2VybmVsL3BpZC5jCisrKyBiL2tlcm5lbC9waWQuYwpAQCAtNDEsNyArNDEsNiBAQAogc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkICpwaWRfaGFzaDsKIHN0YXRpYyBpbnQgcGlkaGFzaF9zaGlmdDsKIHN0cnVjdCBwaWQgaW5pdF9zdHJ1Y3RfcGlkID0gSU5JVF9TVFJVQ1RfUElEOwotc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpwaWRfbnNfY2FjaGVwOwogCiBpbnQgcGlkX21heCA9IFBJRF9NQVhfREVGQVVMVDsKIApAQCAtMTEyLDcgKzExMSw3IEBACiAKIHN0YXRpYyAgX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgREVGSU5FX1NQSU5MT0NLKHBpZG1hcF9sb2NrKTsKIAotc3RhdGljIGZhc3RjYWxsIHZvaWQgZnJlZV9waWRtYXAoc3RydWN0IHBpZF9uYW1lc3BhY2UgKnBpZF9ucywgaW50IHBpZCkKK3N0YXRpYyB2b2lkIGZyZWVfcGlkbWFwKHN0cnVjdCBwaWRfbmFtZXNwYWNlICpwaWRfbnMsIGludCBwaWQpCiB7CiAJc3RydWN0IHBpZG1hcCAqbWFwID0gcGlkX25zLT5waWRtYXAgKyBwaWQgLyBCSVRTX1BFUl9QQUdFOwogCWludCBvZmZzZXQgPSBwaWQgJiBCSVRTX1BFUl9QQUdFX01BU0s7CkBAIC0xODEsNyArMTgwLDcgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBpbnQgbmV4dF9waWRtYXAoc3RydWN0IHBpZF9uYW1lc3BhY2UgKnBpZF9ucywgaW50IGxhc3QpCitpbnQgbmV4dF9waWRtYXAoc3RydWN0IHBpZF9uYW1lc3BhY2UgKnBpZF9ucywgaW50IGxhc3QpCiB7CiAJaW50IG9mZnNldDsKIAlzdHJ1Y3QgcGlkbWFwICptYXAsICplbmQ7CkBAIC0xOTksNyArMTk4LDcgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLWZhc3RjYWxsIHZvaWQgcHV0X3BpZChzdHJ1Y3QgcGlkICpwaWQpCit2b2lkIHB1dF9waWQoc3RydWN0IHBpZCAqcGlkKQogewogCXN0cnVjdCBwaWRfbmFtZXNwYWNlICpuczsKIApAQCAtMjIxLDcgKzIyMCw3IEBACiAJcHV0X3BpZChwaWQpOwogfQogCi1mYXN0Y2FsbCB2b2lkIGZyZWVfcGlkKHN0cnVjdCBwaWQgKnBpZCkKK3ZvaWQgZnJlZV9waWQoc3RydWN0IHBpZCAqcGlkKQogewogCS8qIFdlIGNhbiBiZSBjYWxsZWQgd2l0aCB3cml0ZV9sb2NrX2lycSgmdGFza2xpc3RfbG9jaykgaGVsZCAqLwogCWludCBpOwpAQCAtMjg3LDcgKzI4Niw3IEBACiAJZ290byBvdXQ7CiB9CiAKLXN0cnVjdCBwaWQgKiBmYXN0Y2FsbCBmaW5kX3BpZF9ucyhpbnQgbnIsIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpucykKK3N0cnVjdCBwaWQgKmZpbmRfcGlkX25zKGludCBuciwgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zKQogewogCXN0cnVjdCBobGlzdF9ub2RlICplbGVtOwogCXN0cnVjdCB1cGlkICpwbnI7CkBAIC0zMTcsNyArMzE2LDcgQEAKIC8qCiAgKiBhdHRhY2hfcGlkKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgdGFza2xpc3RfbG9jayB3cml0ZS1oZWxkLgogICovCi1pbnQgZmFzdGNhbGwgYXR0YWNoX3BpZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGVudW0gcGlkX3R5cGUgdHlwZSwKK2ludCBhdHRhY2hfcGlkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgZW51bSBwaWRfdHlwZSB0eXBlLAogCQlzdHJ1Y3QgcGlkICpwaWQpCiB7CiAJc3RydWN0IHBpZF9saW5rICpsaW5rOwpAQCAtMzI5LDcgKzMyOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgZmFzdGNhbGwgZGV0YWNoX3BpZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGVudW0gcGlkX3R5cGUgdHlwZSkKK3ZvaWQgZGV0YWNoX3BpZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGVudW0gcGlkX3R5cGUgdHlwZSkKIHsKIAlzdHJ1Y3QgcGlkX2xpbmsgKmxpbms7CiAJc3RydWN0IHBpZCAqcGlkOwpAQCAtMzQ5LDcgKzM0OCw3IEBACiB9CiAKIC8qIHRyYW5zZmVyX3BpZCBpcyBhbiBvcHRpbWl6YXRpb24gb2YgYXR0YWNoX3BpZChuZXcpLCBkZXRhY2hfcGlkKG9sZCkgKi8KLXZvaWQgZmFzdGNhbGwgdHJhbnNmZXJfcGlkKHN0cnVjdCB0YXNrX3N0cnVjdCAqb2xkLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5ldywKK3ZvaWQgdHJhbnNmZXJfcGlkKHN0cnVjdCB0YXNrX3N0cnVjdCAqb2xkLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5ldywKIAkJCSAgIGVudW0gcGlkX3R5cGUgdHlwZSkKIHsKIAluZXctPnBpZHNbdHlwZV0ucGlkID0gb2xkLT5waWRzW3R5cGVdLnBpZDsKQEAgLTM1Nyw3ICszNTYsNyBAQAogCW9sZC0+cGlkc1t0eXBlXS5waWQgPSBOVUxMOwogfQogCi1zdHJ1Y3QgdGFza19zdHJ1Y3QgKiBmYXN0Y2FsbCBwaWRfdGFzayhzdHJ1Y3QgcGlkICpwaWQsIGVudW0gcGlkX3R5cGUgdHlwZSkKK3N0cnVjdCB0YXNrX3N0cnVjdCAqcGlkX3Rhc2soc3RydWN0IHBpZCAqcGlkLCBlbnVtIHBpZF90eXBlIHR5cGUpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpyZXN1bHQgPSBOVUxMOwogCWlmIChwaWQpIHsKQEAgLTM2OCw2ICszNjcsNyBAQAogCX0KIAlyZXR1cm4gcmVzdWx0OwogfQorRVhQT1JUX1NZTUJPTChwaWRfdGFzayk7CiAKIC8qCiAgKiBNdXN0IGJlIGNhbGxlZCB1bmRlciByY3VfcmVhZF9sb2NrKCkgb3Igd2l0aCB0YXNrbGlzdF9sb2NrIHJlYWQtaGVsZC4KQEAgLTQwOCw3ICs0MDgsNyBAQAogCXJldHVybiBwaWQ7CiB9CiAKLXN0cnVjdCB0YXNrX3N0cnVjdCAqZmFzdGNhbGwgZ2V0X3BpZF90YXNrKHN0cnVjdCBwaWQgKnBpZCwgZW51bSBwaWRfdHlwZSB0eXBlKQorc3RydWN0IHRhc2tfc3RydWN0ICpnZXRfcGlkX3Rhc2soc3RydWN0IHBpZCAqcGlkLCBlbnVtIHBpZF90eXBlIHR5cGUpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpyZXN1bHQ7CiAJcmN1X3JlYWRfbG9jaygpOwpAQCAtNDQzLDYgKzQ0MywxMiBAQAogCXJldHVybiBucjsKIH0KIAorcGlkX3QgcGlkX3ZucihzdHJ1Y3QgcGlkICpwaWQpCit7CisJcmV0dXJuIHBpZF9ucl9ucyhwaWQsIGN1cnJlbnQtPm5zcHJveHktPnBpZF9ucyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwaWRfdm5yKTsKKwogcGlkX3QgdGFza19waWRfbnJfbnMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpucykKIHsKIAlyZXR1cm4gcGlkX25yX25zKHRhc2tfcGlkKHRzayksIG5zKTsKQEAgLTQ4NywxODAgKzQ5Myw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChmaW5kX2dldF9waWQpOwogCi1zdHJ1Y3QgcGlkX2NhY2hlIHsKLQlpbnQgbnJfaWRzOwotCWNoYXIgbmFtZVsxNl07Ci0Jc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci19OwotCi1zdGF0aWMgTElTVF9IRUFEKHBpZF9jYWNoZXNfbGgpOwotc3RhdGljIERFRklORV9NVVRFWChwaWRfY2FjaGVzX211dGV4KTsKLQotLyoKLSAqIGNyZWF0ZXMgdGhlIGttZW0gY2FjaGUgdG8gYWxsb2NhdGUgcGlkcyBmcm9tLgotICogQG5yX2lkczogdGhlIG51bWJlciBvZiBudW1lcmljYWwgaWRzIHRoaXMgcGlkIHdpbGwgaGF2ZSB0byBjYXJyeQotICovCi0KLXN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqY3JlYXRlX3BpZF9jYWNoZXAoaW50IG5yX2lkcykKLXsKLQlzdHJ1Y3QgcGlkX2NhY2hlICpwY2FjaGU7Ci0Jc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcDsKLQotCW11dGV4X2xvY2soJnBpZF9jYWNoZXNfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkgKHBjYWNoZSwgJnBpZF9jYWNoZXNfbGgsIGxpc3QpCi0JCWlmIChwY2FjaGUtPm5yX2lkcyA9PSBucl9pZHMpCi0JCQlnb3RvIG91dDsKLQotCXBjYWNoZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwaWRfY2FjaGUpLCBHRlBfS0VSTkVMKTsKLQlpZiAocGNhY2hlID09IE5VTEwpCi0JCWdvdG8gZXJyX2FsbG9jOwotCi0Jc25wcmludGYocGNhY2hlLT5uYW1lLCBzaXplb2YocGNhY2hlLT5uYW1lKSwgInBpZF8lZCIsIG5yX2lkcyk7Ci0JY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUocGNhY2hlLT5uYW1lLAotCQkJc2l6ZW9mKHN0cnVjdCBwaWQpICsgKG5yX2lkcyAtIDEpICogc2l6ZW9mKHN0cnVjdCB1cGlkKSwKLQkJCTAsIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7Ci0JaWYgKGNhY2hlcCA9PSBOVUxMKQotCQlnb3RvIGVycl9jYWNoZXA7Ci0KLQlwY2FjaGUtPm5yX2lkcyA9IG5yX2lkczsKLQlwY2FjaGUtPmNhY2hlcCA9IGNhY2hlcDsKLQlsaXN0X2FkZCgmcGNhY2hlLT5saXN0LCAmcGlkX2NhY2hlc19saCk7Ci1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwaWRfY2FjaGVzX211dGV4KTsKLQlyZXR1cm4gcGNhY2hlLT5jYWNoZXA7Ci0KLWVycl9jYWNoZXA6Ci0Ja2ZyZWUocGNhY2hlKTsKLWVycl9hbGxvYzoKLQltdXRleF91bmxvY2soJnBpZF9jYWNoZXNfbXV0ZXgpOwotCXJldHVybiBOVUxMOwotfQotCi0jaWZkZWYgQ09ORklHX1BJRF9OUwotc3RhdGljIHN0cnVjdCBwaWRfbmFtZXNwYWNlICpjcmVhdGVfcGlkX25hbWVzcGFjZShpbnQgbGV2ZWwpCi17Ci0Jc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zOwotCWludCBpOwotCi0JbnMgPSBrbWVtX2NhY2hlX2FsbG9jKHBpZF9uc19jYWNoZXAsIEdGUF9LRVJORUwpOwotCWlmIChucyA9PSBOVUxMKQotCQlnb3RvIG91dDsKLQotCW5zLT5waWRtYXBbMF0ucGFnZSA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5zLT5waWRtYXBbMF0ucGFnZSkKLQkJZ290byBvdXRfZnJlZTsKLQotCW5zLT5waWRfY2FjaGVwID0gY3JlYXRlX3BpZF9jYWNoZXAobGV2ZWwgKyAxKTsKLQlpZiAobnMtPnBpZF9jYWNoZXAgPT0gTlVMTCkKLQkJZ290byBvdXRfZnJlZV9tYXA7Ci0KLQlrcmVmX2luaXQoJm5zLT5rcmVmKTsKLQlucy0+bGFzdF9waWQgPSAwOwotCW5zLT5jaGlsZF9yZWFwZXIgPSBOVUxMOwotCW5zLT5sZXZlbCA9IGxldmVsOwotCi0Jc2V0X2JpdCgwLCBucy0+cGlkbWFwWzBdLnBhZ2UpOwotCWF0b21pY19zZXQoJm5zLT5waWRtYXBbMF0ubnJfZnJlZSwgQklUU19QRVJfUEFHRSAtIDEpOwotCi0JZm9yIChpID0gMTsgaSA8IFBJRE1BUF9FTlRSSUVTOyBpKyspIHsKLQkJbnMtPnBpZG1hcFtpXS5wYWdlID0gMDsKLQkJYXRvbWljX3NldCgmbnMtPnBpZG1hcFtpXS5ucl9mcmVlLCBCSVRTX1BFUl9QQUdFKTsKLQl9Ci0KLQlyZXR1cm4gbnM7Ci0KLW91dF9mcmVlX21hcDoKLQlrZnJlZShucy0+cGlkbWFwWzBdLnBhZ2UpOwotb3V0X2ZyZWU6Ci0Ja21lbV9jYWNoZV9mcmVlKHBpZF9uc19jYWNoZXAsIG5zKTsKLW91dDoKLQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLX0KLQotc3RhdGljIHZvaWQgZGVzdHJveV9waWRfbmFtZXNwYWNlKHN0cnVjdCBwaWRfbmFtZXNwYWNlICpucykKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBQSURNQVBfRU5UUklFUzsgaSsrKQotCQlrZnJlZShucy0+cGlkbWFwW2ldLnBhZ2UpOwotCWttZW1fY2FjaGVfZnJlZShwaWRfbnNfY2FjaGVwLCBucyk7Ci19Ci0KLXN0cnVjdCBwaWRfbmFtZXNwYWNlICpjb3B5X3BpZF9ucyh1bnNpZ25lZCBsb25nIGZsYWdzLCBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqb2xkX25zKQotewotCXN0cnVjdCBwaWRfbmFtZXNwYWNlICpuZXdfbnM7Ci0KLQlCVUdfT04oIW9sZF9ucyk7Ci0JbmV3X25zID0gZ2V0X3BpZF9ucyhvbGRfbnMpOwotCWlmICghKGZsYWdzICYgQ0xPTkVfTkVXUElEKSkKLQkJZ290byBvdXQ7Ci0KLQluZXdfbnMgPSBFUlJfUFRSKC1FSU5WQUwpOwotCWlmIChmbGFncyAmIENMT05FX1RIUkVBRCkKLQkJZ290byBvdXRfcHV0OwotCi0JbmV3X25zID0gY3JlYXRlX3BpZF9uYW1lc3BhY2Uob2xkX25zLT5sZXZlbCArIDEpOwotCWlmICghSVNfRVJSKG5ld19ucykpCi0JCW5ld19ucy0+cGFyZW50ID0gZ2V0X3BpZF9ucyhvbGRfbnMpOwotCi1vdXRfcHV0OgotCXB1dF9waWRfbnMob2xkX25zKTsKLW91dDoKLQlyZXR1cm4gbmV3X25zOwotfQotCi12b2lkIGZyZWVfcGlkX25zKHN0cnVjdCBrcmVmICprcmVmKQotewotCXN0cnVjdCBwaWRfbmFtZXNwYWNlICpucywgKnBhcmVudDsKLQotCW5zID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBwaWRfbmFtZXNwYWNlLCBrcmVmKTsKLQotCXBhcmVudCA9IG5zLT5wYXJlbnQ7Ci0JZGVzdHJveV9waWRfbmFtZXNwYWNlKG5zKTsKLQotCWlmIChwYXJlbnQgIT0gTlVMTCkKLQkJcHV0X3BpZF9ucyhwYXJlbnQpOwotfQotI2VuZGlmIC8qIENPTkZJR19QSURfTlMgKi8KLQotdm9pZCB6YXBfcGlkX25zX3Byb2Nlc3NlcyhzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqcGlkX25zKQotewotCWludCBucjsKLQlpbnQgcmM7Ci0KLQkvKgotCSAqIFRoZSBsYXN0IHRocmVhZCBpbiB0aGUgY2dyb3VwLWluaXQgdGhyZWFkIGdyb3VwIGlzIHRlcm1pbmF0aW5nLgotCSAqIEZpbmQgcmVtYWluaW5nIHBpZF90cyBpbiB0aGUgbmFtZXNwYWNlLCBzaWduYWwgYW5kIHdhaXQgZm9yIHRoZW0KLQkgKiB0byBleGl0LgotCSAqCi0JICogTm90ZTogIFRoaXMgc2lnbmFscyBlYWNoIHRocmVhZHMgaW4gdGhlIG5hbWVzcGFjZSAtIGV2ZW4gdGhvc2UgdGhhdAotCSAqIAkgIGJlbG9uZyB0byB0aGUgc2FtZSB0aHJlYWQgZ3JvdXAsIFRvIGF2b2lkIHRoaXMsIHdlIHdvdWxkIGhhdmUKLQkgKiAJICB0byB3YWxrIHRoZSBlbnRpcmUgdGFza2xpc3QgbG9va2luZyBhIHByb2Nlc3NlcyBpbiB0aGlzCi0JICogCSAgbmFtZXNwYWNlLCBidXQgdGhhdCBjb3VsZCBiZSB1bm5lY2Vzc2FyaWx5IGV4cGVuc2l2ZSBpZiB0aGUKLQkgKiAJICBwaWQgbmFtZXNwYWNlIGhhcyBqdXN0IGEgZmV3IHByb2Nlc3Nlcy4gT3Igd2UgbmVlZCB0bwotCSAqIAkgIG1haW50YWluIGEgdGFza2xpc3QgZm9yIGVhY2ggcGlkIG5hbWVzcGFjZS4KLQkgKgotCSAqLwotCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7Ci0JbnIgPSBuZXh0X3BpZG1hcChwaWRfbnMsIDEpOwotCXdoaWxlIChuciA+IDApIHsKLQkJa2lsbF9wcm9jX2luZm8oU0lHS0lMTCwgU0VORF9TSUdfUFJJViwgbnIpOwotCQluciA9IG5leHRfcGlkbWFwKHBpZF9ucywgbnIpOwotCX0KLQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7Ci0KLQlkbyB7Ci0JCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9TSUdQRU5ESU5HKTsKLQkJcmMgPSBzeXNfd2FpdDQoLTEsIE5VTEwsIF9fV0FMTCwgTlVMTCk7Ci0JfSB3aGlsZSAocmMgIT0gLUVDSElMRCk7Ci0KLQotCS8qIENoaWxkIHJlYXBlciBmb3IgdGhlIHBpZCBuYW1lc3BhY2UgaXMgZ29pbmcgYXdheSAqLwotCXBpZF9ucy0+Y2hpbGRfcmVhcGVyID0gTlVMTDsKLQlyZXR1cm47Ci19Ci0KIC8qCiAgKiBUaGUgcGlkIGhhc2ggdGFibGUgaXMgc2NhbGVkIGFjY29yZGluZyB0byB0aGUgYW1vdW50IG9mIG1lbW9yeSBpbiB0aGUKICAqIG1hY2hpbmUuICBGcm9tIGEgbWluaW11bSBvZiAxNiBzbG90cyB1cCB0byA0MDk2IHNsb3RzIGF0IG9uZSBnaWdhYnl0ZSBvcgpAQCAtNjkzLDkgKzUyNSw2IEBACiAJc2V0X2JpdCgwLCBpbml0X3BpZF9ucy5waWRtYXBbMF0ucGFnZSk7CiAJYXRvbWljX2RlYygmaW5pdF9waWRfbnMucGlkbWFwWzBdLm5yX2ZyZWUpOwogCi0JaW5pdF9waWRfbnMucGlkX2NhY2hlcCA9IGNyZWF0ZV9waWRfY2FjaGVwKDEpOwotCWlmIChpbml0X3BpZF9ucy5waWRfY2FjaGVwID09IE5VTEwpCi0JCXBhbmljKCJDYW4ndCBjcmVhdGUgcGlkXzEgY2FjaGVwXG4iKTsKLQotCXBpZF9uc19jYWNoZXAgPSBLTUVNX0NBQ0hFKHBpZF9uYW1lc3BhY2UsIFNMQUJfUEFOSUMpOworCWluaXRfcGlkX25zLnBpZF9jYWNoZXAgPSBLTUVNX0NBQ0hFKHBpZCwKKwkJCVNMQUJfSFdDQUNIRV9BTElHTiB8IFNMQUJfUEFOSUMpOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3BpZF9uYW1lc3BhY2UuYyBiL2tlcm5lbC9waWRfbmFtZXNwYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ3OTJiNgotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC9waWRfbmFtZXNwYWNlLmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBQaWQgbmFtZXNwYWNlcworICoKKyAqIEF1dGhvcnM6CisgKiAgICAoQykgMjAwNyBQYXZlbCBFbWVseWFub3YgPHhlbXVsQG9wZW52ei5vcmc+LCBPcGVuVlosIFNXc29mdCBJbmMuCisgKiAgICAoQykgMjAwNyBTdWthZGV2IEJoYXR0aXByb2x1IDxzdWthZGV2QHVzLmlibS5jb20+LCBJQk0KKyAqICAgICBNYW55IHRoYW5rcyB0byBPbGVnIE5lc3Rlcm92IGZvciBjb21tZW50cyBhbmQgaGVscAorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvcGlkLmg+CisjaW5jbHVkZSA8bGludXgvcGlkX25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNkZWZpbmUgQklUU19QRVJfUEFHRQkJKFBBR0VfU0laRSo4KQorCitzdHJ1Y3QgcGlkX2NhY2hlIHsKKwlpbnQgbnJfaWRzOworCWNoYXIgbmFtZVsxNl07CisJc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdGF0aWMgTElTVF9IRUFEKHBpZF9jYWNoZXNfbGgpOworc3RhdGljIERFRklORV9NVVRFWChwaWRfY2FjaGVzX211dGV4KTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqcGlkX25zX2NhY2hlcDsKKworLyoKKyAqIGNyZWF0ZXMgdGhlIGttZW0gY2FjaGUgdG8gYWxsb2NhdGUgcGlkcyBmcm9tLgorICogQG5yX2lkczogdGhlIG51bWJlciBvZiBudW1lcmljYWwgaWRzIHRoaXMgcGlkIHdpbGwgaGF2ZSB0byBjYXJyeQorICovCisKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqY3JlYXRlX3BpZF9jYWNoZXAoaW50IG5yX2lkcykKK3sKKwlzdHJ1Y3QgcGlkX2NhY2hlICpwY2FjaGU7CisJc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcDsKKworCW11dGV4X2xvY2soJnBpZF9jYWNoZXNfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocGNhY2hlLCAmcGlkX2NhY2hlc19saCwgbGlzdCkKKwkJaWYgKHBjYWNoZS0+bnJfaWRzID09IG5yX2lkcykKKwkJCWdvdG8gb3V0OworCisJcGNhY2hlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBpZF9jYWNoZSksIEdGUF9LRVJORUwpOworCWlmIChwY2FjaGUgPT0gTlVMTCkKKwkJZ290byBlcnJfYWxsb2M7CisKKwlzbnByaW50ZihwY2FjaGUtPm5hbWUsIHNpemVvZihwY2FjaGUtPm5hbWUpLCAicGlkXyVkIiwgbnJfaWRzKTsKKwljYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZShwY2FjaGUtPm5hbWUsCisJCQlzaXplb2Yoc3RydWN0IHBpZCkgKyAobnJfaWRzIC0gMSkgKiBzaXplb2Yoc3RydWN0IHVwaWQpLAorCQkJMCwgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTsKKwlpZiAoY2FjaGVwID09IE5VTEwpCisJCWdvdG8gZXJyX2NhY2hlcDsKKworCXBjYWNoZS0+bnJfaWRzID0gbnJfaWRzOworCXBjYWNoZS0+Y2FjaGVwID0gY2FjaGVwOworCWxpc3RfYWRkKCZwY2FjaGUtPmxpc3QsICZwaWRfY2FjaGVzX2xoKTsKK291dDoKKwltdXRleF91bmxvY2soJnBpZF9jYWNoZXNfbXV0ZXgpOworCXJldHVybiBwY2FjaGUtPmNhY2hlcDsKKworZXJyX2NhY2hlcDoKKwlrZnJlZShwY2FjaGUpOworZXJyX2FsbG9jOgorCW11dGV4X3VubG9jaygmcGlkX2NhY2hlc19tdXRleCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqY3JlYXRlX3BpZF9uYW1lc3BhY2UoaW50IGxldmVsKQoreworCXN0cnVjdCBwaWRfbmFtZXNwYWNlICpuczsKKwlpbnQgaTsKKworCW5zID0ga21lbV9jYWNoZV9hbGxvYyhwaWRfbnNfY2FjaGVwLCBHRlBfS0VSTkVMKTsKKwlpZiAobnMgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlucy0+cGlkbWFwWzBdLnBhZ2UgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFucy0+cGlkbWFwWzBdLnBhZ2UpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlucy0+cGlkX2NhY2hlcCA9IGNyZWF0ZV9waWRfY2FjaGVwKGxldmVsICsgMSk7CisJaWYgKG5zLT5waWRfY2FjaGVwID09IE5VTEwpCisJCWdvdG8gb3V0X2ZyZWVfbWFwOworCisJa3JlZl9pbml0KCZucy0+a3JlZik7CisJbnMtPmxhc3RfcGlkID0gMDsKKwlucy0+Y2hpbGRfcmVhcGVyID0gTlVMTDsKKwlucy0+bGV2ZWwgPSBsZXZlbDsKKworCXNldF9iaXQoMCwgbnMtPnBpZG1hcFswXS5wYWdlKTsKKwlhdG9taWNfc2V0KCZucy0+cGlkbWFwWzBdLm5yX2ZyZWUsIEJJVFNfUEVSX1BBR0UgLSAxKTsKKworCWZvciAoaSA9IDE7IGkgPCBQSURNQVBfRU5UUklFUzsgaSsrKSB7CisJCW5zLT5waWRtYXBbaV0ucGFnZSA9IDA7CisJCWF0b21pY19zZXQoJm5zLT5waWRtYXBbaV0ubnJfZnJlZSwgQklUU19QRVJfUEFHRSk7CisJfQorCisJcmV0dXJuIG5zOworCitvdXRfZnJlZV9tYXA6CisJa2ZyZWUobnMtPnBpZG1hcFswXS5wYWdlKTsKK291dF9mcmVlOgorCWttZW1fY2FjaGVfZnJlZShwaWRfbnNfY2FjaGVwLCBucyk7CitvdXQ6CisJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfcGlkX25hbWVzcGFjZShzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUElETUFQX0VOVFJJRVM7IGkrKykKKwkJa2ZyZWUobnMtPnBpZG1hcFtpXS5wYWdlKTsKKwlrbWVtX2NhY2hlX2ZyZWUocGlkX25zX2NhY2hlcCwgbnMpOworfQorCitzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqY29weV9waWRfbnModW5zaWduZWQgbG9uZyBmbGFncywgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm9sZF9ucykKK3sKKwlzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbmV3X25zOworCisJQlVHX09OKCFvbGRfbnMpOworCW5ld19ucyA9IGdldF9waWRfbnMob2xkX25zKTsKKwlpZiAoIShmbGFncyAmIENMT05FX05FV1BJRCkpCisJCWdvdG8gb3V0OworCisJbmV3X25zID0gRVJSX1BUUigtRUlOVkFMKTsKKwlpZiAoZmxhZ3MgJiBDTE9ORV9USFJFQUQpCisJCWdvdG8gb3V0X3B1dDsKKworCW5ld19ucyA9IGNyZWF0ZV9waWRfbmFtZXNwYWNlKG9sZF9ucy0+bGV2ZWwgKyAxKTsKKwlpZiAoIUlTX0VSUihuZXdfbnMpKQorCQluZXdfbnMtPnBhcmVudCA9IGdldF9waWRfbnMob2xkX25zKTsKKworb3V0X3B1dDoKKwlwdXRfcGlkX25zKG9sZF9ucyk7CitvdXQ6CisJcmV0dXJuIG5ld19uczsKK30KKwordm9pZCBmcmVlX3BpZF9ucyhzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMsICpwYXJlbnQ7CisKKwlucyA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgcGlkX25hbWVzcGFjZSwga3JlZik7CisKKwlwYXJlbnQgPSBucy0+cGFyZW50OworCWRlc3Ryb3lfcGlkX25hbWVzcGFjZShucyk7CisKKwlpZiAocGFyZW50ICE9IE5VTEwpCisJCXB1dF9waWRfbnMocGFyZW50KTsKK30KKwordm9pZCB6YXBfcGlkX25zX3Byb2Nlc3NlcyhzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqcGlkX25zKQoreworCWludCBucjsKKwlpbnQgcmM7CisKKwkvKgorCSAqIFRoZSBsYXN0IHRocmVhZCBpbiB0aGUgY2dyb3VwLWluaXQgdGhyZWFkIGdyb3VwIGlzIHRlcm1pbmF0aW5nLgorCSAqIEZpbmQgcmVtYWluaW5nIHBpZF90cyBpbiB0aGUgbmFtZXNwYWNlLCBzaWduYWwgYW5kIHdhaXQgZm9yIHRoZW0KKwkgKiB0byBleGl0LgorCSAqCisJICogTm90ZTogIFRoaXMgc2lnbmFscyBlYWNoIHRocmVhZHMgaW4gdGhlIG5hbWVzcGFjZSAtIGV2ZW4gdGhvc2UgdGhhdAorCSAqIAkgIGJlbG9uZyB0byB0aGUgc2FtZSB0aHJlYWQgZ3JvdXAsIFRvIGF2b2lkIHRoaXMsIHdlIHdvdWxkIGhhdmUKKwkgKiAJICB0byB3YWxrIHRoZSBlbnRpcmUgdGFza2xpc3QgbG9va2luZyBhIHByb2Nlc3NlcyBpbiB0aGlzCisJICogCSAgbmFtZXNwYWNlLCBidXQgdGhhdCBjb3VsZCBiZSB1bm5lY2Vzc2FyaWx5IGV4cGVuc2l2ZSBpZiB0aGUKKwkgKiAJICBwaWQgbmFtZXNwYWNlIGhhcyBqdXN0IGEgZmV3IHByb2Nlc3Nlcy4gT3Igd2UgbmVlZCB0bworCSAqIAkgIG1haW50YWluIGEgdGFza2xpc3QgZm9yIGVhY2ggcGlkIG5hbWVzcGFjZS4KKwkgKgorCSAqLworCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJbnIgPSBuZXh0X3BpZG1hcChwaWRfbnMsIDEpOworCXdoaWxlIChuciA+IDApIHsKKwkJa2lsbF9wcm9jX2luZm8oU0lHS0lMTCwgU0VORF9TSUdfUFJJViwgbnIpOworCQluciA9IG5leHRfcGlkbWFwKHBpZF9ucywgbnIpOworCX0KKwlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisKKwlkbyB7CisJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9TSUdQRU5ESU5HKTsKKwkJcmMgPSBzeXNfd2FpdDQoLTEsIE5VTEwsIF9fV0FMTCwgTlVMTCk7CisJfSB3aGlsZSAocmMgIT0gLUVDSElMRCk7CisKKworCS8qIENoaWxkIHJlYXBlciBmb3IgdGhlIHBpZCBuYW1lc3BhY2UgaXMgZ29pbmcgYXdheSAqLworCXBpZF9ucy0+Y2hpbGRfcmVhcGVyID0gTlVMTDsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBfX2luaXQgaW50IHBpZF9uYW1lc3BhY2VzX2luaXQodm9pZCkKK3sKKwlwaWRfbnNfY2FjaGVwID0gS01FTV9DQUNIRShwaWRfbmFtZXNwYWNlLCBTTEFCX1BBTklDKTsKKwlyZXR1cm4gMDsKK30KKworX19pbml0Y2FsbChwaWRfbmFtZXNwYWNlc19pbml0KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3NpeC1jcHUtdGltZXJzLmMgYi9rZXJuZWwvcG9zaXgtY3B1LXRpbWVycy5jCmluZGV4IDBiN2M4MmFjLi4yZWFlOTFmIDEwMDY0NAotLS0gYS9rZXJuZWwvcG9zaXgtY3B1LXRpbWVycy5jCisrKyBiL2tlcm5lbC9wb3NpeC1jcHUtdGltZXJzLmMKQEAgLTIwLDcgKzIwLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwotCXAgPSBmaW5kX3Rhc2tfYnlfcGlkKHBpZCk7CisJcCA9IGZpbmRfdGFza19ieV92cGlkKHBpZCk7CiAJaWYgKCFwIHx8ICEoQ1BVQ0xPQ0tfUEVSVEhSRUFEKHdoaWNoX2Nsb2NrKSA/CiAJCSAgIHNhbWVfdGhyZWFkX2dyb3VwKHAsIGN1cnJlbnQpIDogdGhyZWFkX2dyb3VwX2xlYWRlcihwKSkpIHsKIAkJZXJyb3IgPSAtRUlOVkFMOwpAQCAtMzA1LDcgKzMwNSw3IEBACiAJCSAqLwogCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJcCA9IGZpbmRfdGFza19ieV9waWQocGlkKTsKKwkJcCA9IGZpbmRfdGFza19ieV92cGlkKHBpZCk7CiAJCWlmIChwKSB7CiAJCQlpZiAoQ1BVQ0xPQ0tfUEVSVEhSRUFEKHdoaWNoX2Nsb2NrKSkgewogCQkJCWlmIChzYW1lX3RocmVhZF9ncm91cChwLCBjdXJyZW50KSkgewpAQCAtMzU0LDcgKzM1NCw3IEBACiAJCWlmIChwaWQgPT0gMCkgewogCQkJcCA9IGN1cnJlbnQ7CiAJCX0gZWxzZSB7Ci0JCQlwID0gZmluZF90YXNrX2J5X3BpZChwaWQpOworCQkJcCA9IGZpbmRfdGFza19ieV92cGlkKHBpZCk7CiAJCQlpZiAocCAmJiAhc2FtZV90aHJlYWRfZ3JvdXAocCwgY3VycmVudCkpCiAJCQkJcCA9IE5VTEw7CiAJCX0KQEAgLTM2Miw3ICszNjIsNyBAQAogCQlpZiAocGlkID09IDApIHsKIAkJCXAgPSBjdXJyZW50LT5ncm91cF9sZWFkZXI7CiAJCX0gZWxzZSB7Ci0JCQlwID0gZmluZF90YXNrX2J5X3BpZChwaWQpOworCQkJcCA9IGZpbmRfdGFza19ieV92cGlkKHBpZCk7CiAJCQlpZiAocCAmJiAhdGhyZWFkX2dyb3VwX2xlYWRlcihwKSkKIAkJCQlwID0gTlVMTDsKIAkJfQpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvc2l4LXRpbWVycy5jIGIva2VybmVsL3Bvc2l4LXRpbWVycy5jCmluZGV4IDEyMmQ1YzcuLmNlMjY4OTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3NpeC10aW1lcnMuYworKysgYi9rZXJuZWwvcG9zaXgtdGltZXJzLmMKQEAgLTQwNCw3ICs0MDQsNyBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcnRuID0gY3VycmVudC0+Z3JvdXBfbGVhZGVyOwogCiAJaWYgKChldmVudC0+c2lnZXZfbm90aWZ5ICYgU0lHRVZfVEhSRUFEX0lEICkgJiYKLQkJKCEocnRuID0gZmluZF90YXNrX2J5X3BpZChldmVudC0+c2lnZXZfbm90aWZ5X3RocmVhZF9pZCkpIHx8CisJCSghKHJ0biA9IGZpbmRfdGFza19ieV92cGlkKGV2ZW50LT5zaWdldl9ub3RpZnlfdGhyZWFkX2lkKSkgfHwKIAkJICFzYW1lX3RocmVhZF9ncm91cChydG4sIGN1cnJlbnQpIHx8CiAJCSAoZXZlbnQtPnNpZ2V2X25vdGlmeSAmIH5TSUdFVl9USFJFQURfSUQpICE9IFNJR0VWX1NJR05BTCkpCiAJCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL0tjb25maWcgYi9rZXJuZWwvcG93ZXIvS2NvbmZpZwppbmRleCBlZjliODAyLi43OTgzMzE3IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvS2NvbmZpZworKysgYi9rZXJuZWwvcG93ZXIvS2NvbmZpZwpAQCAtNzQsOCArNzQsOCBAQAogCVJUQyBhY3Jvc3MgcmVib290cywgc28gdGhhdCB5b3UgY2FuIGRlYnVnIGEgbWFjaGluZSB0aGF0IGp1c3QgaGFuZ3MKIAlkdXJpbmcgc3VzcGVuZCAob3IgbW9yZSBjb21tb25seSwgZHVyaW5nIHJlc3VtZSkuCiAKLQlUbyB1c2UgdGhpcyBkZWJ1Z2dpbmcgZmVhdHVyZSB5b3Ugc2hvdWxkIGF0dGVtcHQgdG8gc3VzcGVuZCB0aGUgbWFjaGluZSwKLQl0aGVuIHJlYm9vdCBpdCwgdGhlbiBydW4KKwlUbyB1c2UgdGhpcyBkZWJ1Z2dpbmcgZmVhdHVyZSB5b3Ugc2hvdWxkIGF0dGVtcHQgdG8gc3VzcGVuZCB0aGUKKwltYWNoaW5lLCByZWJvb3QgaXQgYW5kIHRoZW4gcnVuCiAKIAkJZG1lc2cgLXMgMTAwMDAwMCB8IGdyZXAgJ2hhc2ggbWF0Y2hlcycKIApAQCAtMTIzLDcgKzEyMywxMCBAQAogCSAgY2FsbGVkICJoaWJlcm5hdGlvbiIgaW4gdXNlciBpbnRlcmZhY2VzLiAgU1REIGNoZWNrcG9pbnRzIHRoZQogCSAgc3lzdGVtIGFuZCBwb3dlcnMgaXQgb2ZmOyBhbmQgcmVzdG9yZXMgdGhhdCBjaGVja3BvaW50IG9uIHJlYm9vdC4KIAotCSAgWW91IGNhbiBzdXNwZW5kIHlvdXIgbWFjaGluZSB3aXRoICdlY2hvIGRpc2sgPiAvc3lzL3Bvd2VyL3N0YXRlJy4KKwkgIFlvdSBjYW4gc3VzcGVuZCB5b3VyIG1hY2hpbmUgd2l0aCAnZWNobyBkaXNrID4gL3N5cy9wb3dlci9zdGF0ZScKKwkgIGFmdGVyIHBsYWNpbmcgcmVzdW1lPS9kZXYvc3dhcHBhcnRpdGlvbiBvbiB0aGUga2VybmVsIGNvbW1hbmQgbGluZQorCSAgaW4geW91ciBib290bG9hZGVyJ3MgY29uZmlndXJhdGlvbiBmaWxlLgorCiAJICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSB0aGUgYWRkaXRpb25hbCB1c2VybGFuZCB0b29scyBhdmFpbGFibGUKIAkgIGZyb20gPGh0dHA6Ly9zdXNwZW5kLnNmLm5ldD4uCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9wcmludGsuYyBiL2tlcm5lbC9wcmludGsuYwppbmRleCA0YTA5MDYyLi5iZWUzNjEwIDEwMDY0NAotLS0gYS9rZXJuZWwvcHJpbnRrLmMKKysrIGIva2VybmVsL3ByaW50ay5jCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KLSNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC01NjcsMTkgKzU2Niw2IEBACiAjZW5kaWYKIG1vZHVsZV9wYXJhbV9uYW1lZCh0aW1lLCBwcmludGtfdGltZSwgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOwogCi1zdGF0aWMgaW50IF9faW5pdCBwcmludGtfdGltZV9zZXR1cChjaGFyICpzdHIpCi17Ci0JaWYgKCpzdHIpCi0JCXJldHVybiAwOwotCXByaW50a190aW1lID0gMTsKLQlwcmludGsoS0VSTl9OT1RJQ0UgIlRoZSAndGltZScgb3B0aW9uIGlzIGRlcHJlY2F0ZWQgYW5kICIKLQkJImlzIHNjaGVkdWxlZCBmb3IgcmVtb3ZhbCBpbiBlYXJseSAyMDA4XG4iKTsKLQlwcmludGsoS0VSTl9OT1RJQ0UgIlVzZSAncHJpbnRrLnRpbWU9PHZhbHVlPicgaW5zdGVhZFxuIik7Ci0JcmV0dXJuIDE7Ci19Ci0KLV9fc2V0dXAoInRpbWUiLCBwcmludGtfdGltZV9zZXR1cCk7Ci0KIC8qIENoZWNrIGlmIHdlIGhhdmUgYW55IGNvbnNvbGUgcmVnaXN0ZXJlZCB0aGF0IGNhbiBiZSBjYWxsZWQgZWFybHkgaW4gYm9vdC4gKi8KIHN0YXRpYyBpbnQgaGF2ZV9jYWxsYWJsZV9jb25zb2xlKHZvaWQpCiB7CkBAIC0xMjY1LDYgKzEyNTEsNyBAQAogCXJldHVybjsKIH0KIAorI2lmIGRlZmluZWQgQ09ORklHX1BSSU5USwogLyoKICAqIHByaW50ayByYXRlIGxpbWl0aW5nLCBsaWZ0ZWQgZnJvbSB0aGUgbmV0d29ya2luZyBzdWJzeXN0ZW0uCiAgKgpAQCAtMTMzNCwzICsxMzIxLDQgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiBFWFBPUlRfU1lNQk9MKHByaW50a190aW1lZF9yYXRlbGltaXQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9rZXJuZWwvcHJvZmlsZS5jIGIva2VybmVsL3Byb2ZpbGUuYwppbmRleCBlNjRjMmRhLi4zYjdhMWIwIDEwMDY0NAotLS0gYS9rZXJuZWwvcHJvZmlsZS5jCisrKyBiL2tlcm5lbC9wcm9maWxlLmMKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvcHRyYWNlLmMgYi9rZXJuZWwvcHRyYWNlLmMKaW5kZXggNjI4YjAzYS4uZmRiMzRlOCAxMDA2NDQKLS0tIGEva2VybmVsL3B0cmFjZS5jCisrKyBiL2tlcm5lbC9wdHJhY2UuYwpAQCAtOTksMTAgKzk5LDEyIEBACiAJICogYmUgY2hhbmdlZCBieSB1cyBzbyBpdCdzIG5vdCBjaGFuZ2luZyByaWdodCBhZnRlciB0aGlzLgogCSAqLwogCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7Ci0JaWYgKChjaGlsZC0+cHRyYWNlICYgUFRfUFRSQUNFRCkgJiYgY2hpbGQtPnBhcmVudCA9PSBjdXJyZW50ICYmCi0JICAgICghKGNoaWxkLT5wdHJhY2UgJiBQVF9BVFRBQ0hFRCkgfHwgY2hpbGQtPnJlYWxfcGFyZW50ICE9IGN1cnJlbnQpCi0JICAgICYmIGNoaWxkLT5zaWduYWwgIT0gTlVMTCkgeworCWlmICgoY2hpbGQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpICYmIGNoaWxkLT5wYXJlbnQgPT0gY3VycmVudCkgewogCQlyZXQgPSAwOworCQkvKgorCQkgKiBjaGlsZC0+c2lnaGFuZCBjYW4ndCBiZSBOVUxMLCByZWxlYXNlX3Rhc2soKQorCQkgKiBkb2VzIHB0cmFjZV91bmxpbmsoKSBiZWZvcmUgX19leGl0X3NpZ25hbCgpLgorCQkgKi8KIAkJc3Bpbl9sb2NrX2lycSgmY2hpbGQtPnNpZ2hhbmQtPnNpZ2xvY2spOwogCQlpZiAodGFza19pc19zdG9wcGVkKGNoaWxkKSkKIAkJCWNoaWxkLT5zdGF0ZSA9IFRBU0tfVFJBQ0VEOwpAQCAtMjAwLDggKzIwMiw3IEBACiAJCWdvdG8gYmFkOwogCiAJLyogR28gKi8KLQl0YXNrLT5wdHJhY2UgfD0gUFRfUFRSQUNFRCB8ICgodGFzay0+cmVhbF9wYXJlbnQgIT0gY3VycmVudCkKLQkJCQkgICAgICA/IFBUX0FUVEFDSEVEIDogMCk7CisJdGFzay0+cHRyYWNlIHw9IFBUX1BUUkFDRUQ7CiAJaWYgKGNhcGFibGUoQ0FQX1NZU19QVFJBQ0UpKQogCQl0YXNrLT5wdHJhY2UgfD0gUFRfUFRSQUNFX0NBUDsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3Jlc19jb3VudGVyLmMgYi9rZXJuZWwvcmVzX2NvdW50ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmNiZWMyCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3Jlc19jb3VudGVyLmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiByZXNvdXJjZSBjZ3JvdXBzCisgKgorICogQ29weXJpZ2h0IDIwMDcgT3BlblZaIFNXc29mdCBJbmMKKyAqCisgKiBBdXRob3I6IFBhdmVsIEVtZWxpYW5vdiA8eGVtdWxAb3BlbnZ6Lm9yZz4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZXNfY291bnRlci5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKwordm9pZCByZXNfY291bnRlcl9pbml0KHN0cnVjdCByZXNfY291bnRlciAqY291bnRlcikKK3sKKwlzcGluX2xvY2tfaW5pdCgmY291bnRlci0+bG9jayk7CisJY291bnRlci0+bGltaXQgPSAodW5zaWduZWQgbG9uZyBsb25nKUxMT05HX01BWDsKK30KKworaW50IHJlc19jb3VudGVyX2NoYXJnZV9sb2NrZWQoc3RydWN0IHJlc19jb3VudGVyICpjb3VudGVyLCB1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwlpZiAoY291bnRlci0+dXNhZ2UgKyB2YWwgPiBjb3VudGVyLT5saW1pdCkgeworCQljb3VudGVyLT5mYWlsY250Kys7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNvdW50ZXItPnVzYWdlICs9IHZhbDsKKwlyZXR1cm4gMDsKK30KKworaW50IHJlc19jb3VudGVyX2NoYXJnZShzdHJ1Y3QgcmVzX2NvdW50ZXIgKmNvdW50ZXIsIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb3VudGVyLT5sb2NrLCBmbGFncyk7CisJcmV0ID0gcmVzX2NvdW50ZXJfY2hhcmdlX2xvY2tlZChjb3VudGVyLCB2YWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvdW50ZXItPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHJlc19jb3VudGVyX3VuY2hhcmdlX2xvY2tlZChzdHJ1Y3QgcmVzX2NvdW50ZXIgKmNvdW50ZXIsIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCWlmIChXQVJOX09OKGNvdW50ZXItPnVzYWdlIDwgdmFsKSkKKwkJdmFsID0gY291bnRlci0+dXNhZ2U7CisKKwljb3VudGVyLT51c2FnZSAtPSB2YWw7Cit9CisKK3ZvaWQgcmVzX2NvdW50ZXJfdW5jaGFyZ2Uoc3RydWN0IHJlc19jb3VudGVyICpjb3VudGVyLCB1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvdW50ZXItPmxvY2ssIGZsYWdzKTsKKwlyZXNfY291bnRlcl91bmNoYXJnZV9sb2NrZWQoY291bnRlciwgdmFsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3VudGVyLT5sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgKgorcmVzX2NvdW50ZXJfbWVtYmVyKHN0cnVjdCByZXNfY291bnRlciAqY291bnRlciwgaW50IG1lbWJlcikKK3sKKwlzd2l0Y2ggKG1lbWJlcikgeworCWNhc2UgUkVTX1VTQUdFOgorCQlyZXR1cm4gJmNvdW50ZXItPnVzYWdlOworCWNhc2UgUkVTX0xJTUlUOgorCQlyZXR1cm4gJmNvdW50ZXItPmxpbWl0OworCWNhc2UgUkVTX0ZBSUxDTlQ6CisJCXJldHVybiAmY291bnRlci0+ZmFpbGNudDsKKwl9OworCisJQlVHKCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3NzaXplX3QgcmVzX2NvdW50ZXJfcmVhZChzdHJ1Y3QgcmVzX2NvdW50ZXIgKmNvdW50ZXIsIGludCBtZW1iZXIsCisJCWNvbnN0IGNoYXIgX191c2VyICp1c2VyYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBvcywKKwkJaW50ICgqcmVhZF9zdHJhdGVneSkodW5zaWduZWQgbG9uZyBsb25nIHZhbCwgY2hhciAqc3RfYnVmKSkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgKnZhbDsKKwljaGFyIGJ1Zls2NF0sICpzOworCisJcyA9IGJ1ZjsKKwl2YWwgPSByZXNfY291bnRlcl9tZW1iZXIoY291bnRlciwgbWVtYmVyKTsKKwlpZiAocmVhZF9zdHJhdGVneSkKKwkJcyArPSByZWFkX3N0cmF0ZWd5KCp2YWwsIHMpOworCWVsc2UKKwkJcyArPSBzcHJpbnRmKHMsICIlbGx1XG4iLCAqdmFsKTsKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoKHZvaWQgX191c2VyICopdXNlcmJ1ZiwgbmJ5dGVzLAorCQkJcG9zLCBidWYsIHMgLSBidWYpOworfQorCitzc2l6ZV90IHJlc19jb3VudGVyX3dyaXRlKHN0cnVjdCByZXNfY291bnRlciAqY291bnRlciwgaW50IG1lbWJlciwKKwkJY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcG9zLAorCQlpbnQgKCp3cml0ZV9zdHJhdGVneSkoY2hhciAqc3RfYnVmLCB1bnNpZ25lZCBsb25nIGxvbmcgKnZhbCkpCit7CisJaW50IHJldDsKKwljaGFyICpidWYsICplbmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdG1wLCAqdmFsOworCisJYnVmID0ga21hbGxvYyhuYnl0ZXMgKyAxLCBHRlBfS0VSTkVMKTsKKwlyZXQgPSAtRU5PTUVNOworCWlmIChidWYgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlidWZbbmJ5dGVzXSA9ICdcMCc7CisJcmV0ID0gLUVGQVVMVDsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyYnVmLCBuYnl0ZXMpKQorCQlnb3RvIG91dF9mcmVlOworCisJcmV0ID0gLUVJTlZBTDsKKworCWlmICh3cml0ZV9zdHJhdGVneSkgeworCQlpZiAod3JpdGVfc3RyYXRlZ3koYnVmLCAmdG1wKSkgeworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCX0gZWxzZSB7CisJCXRtcCA9IHNpbXBsZV9zdHJ0b3VsbChidWYsICZlbmQsIDEwKTsKKwkJaWYgKCplbmQgIT0gJ1wwJykKKwkJCWdvdG8gb3V0X2ZyZWU7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZjb3VudGVyLT5sb2NrLCBmbGFncyk7CisJdmFsID0gcmVzX2NvdW50ZXJfbWVtYmVyKGNvdW50ZXIsIG1lbWJlcik7CisJKnZhbCA9IHRtcDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3VudGVyLT5sb2NrLCBmbGFncyk7CisJcmV0ID0gbmJ5dGVzOworb3V0X2ZyZWU6CisJa2ZyZWUoYnVmKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEva2VybmVsL3Jlc291cmNlLmMgYi9rZXJuZWwvcmVzb3VyY2UuYwppbmRleCAyZWI1NTNkLi44MmFlYTgxIDEwMDY0NAotLS0gYS9rZXJuZWwvcmVzb3VyY2UuYworKysgYi9rZXJuZWwvcmVzb3VyY2UuYwpAQCAtMjI4LDcgKzIyOCw3IEBACiAKIEVYUE9SVF9TWU1CT0wocmVsZWFzZV9yZXNvdXJjZSk7CiAKLSNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUcKKyNpZiBkZWZpbmVkKENPTkZJR19NRU1PUllfSE9UUExVRykgJiYgIWRlZmluZWQoQ09ORklHX0FSQ0hfSEFTX1dBTEtfTUVNT1JZKQogLyoKICAqIEZpbmRzIHRoZSBsb3dlc3QgbWVtb3J5IHJlb3N1cmNlIGV4aXN0cyB3aXRoaW4gW3Jlcy0+c3RhcnQucmVzLT5lbmQpCiAgKiB0aGUgY2FsbGVyIG11c3Qgc3BlY2lmeSByZXMtPnN0YXJ0LCByZXMtPmVuZCwgcmVzLT5mbGFncy4KZGlmZiAtLWdpdCBhL2tlcm5lbC9ydG11dGV4LWRlYnVnLmMgYi9rZXJuZWwvcnRtdXRleC1kZWJ1Zy5jCmluZGV4IDU2ZDczY2IuLjVmY2I0ZmUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ydG11dGV4LWRlYnVnLmMKKysrIGIva2VybmVsL3J0bXV0ZXgtZGVidWcuYwpAQCAtMTMwLDcgKzEzMCw3IEBACiAKIAl0YXNrID0gcnRfbXV0ZXhfb3duZXIoYWN0X3dhaXRlci0+bG9jayk7CiAJaWYgKHRhc2sgJiYgdGFzayAhPSBjdXJyZW50KSB7Ci0JCWFjdF93YWl0ZXItPmRlYWRsb2NrX3Rhc2tfcGlkID0gdGFzay0+cGlkOworCQlhY3Rfd2FpdGVyLT5kZWFkbG9ja190YXNrX3BpZCA9IGdldF9waWQodGFza19waWQodGFzaykpOwogCQlhY3Rfd2FpdGVyLT5kZWFkbG9ja19sb2NrID0gbG9jazsKIAl9CiB9CkBAIC0xNDIsOSArMTQyLDEyIEBACiAJaWYgKCF3YWl0ZXItPmRlYWRsb2NrX2xvY2sgfHwgIXJ0X3RyYWNlX29uKQogCQlyZXR1cm47CiAKLQl0YXNrID0gZmluZF90YXNrX2J5X3BpZCh3YWl0ZXItPmRlYWRsb2NrX3Rhc2tfcGlkKTsKLQlpZiAoIXRhc2spCisJcmN1X3JlYWRfbG9jaygpOworCXRhc2sgPSBwaWRfdGFzayh3YWl0ZXItPmRlYWRsb2NrX3Rhc2tfcGlkLCBQSURUWVBFX1BJRCk7CisJaWYgKCF0YXNrKSB7CisJCXJjdV9yZWFkX3VubG9jaygpOwogCQlyZXR1cm47CisJfQogCiAJVFJBQ0VfT0ZGX05PTE9DSygpOwogCkBAIC0xNzMsNiArMTc2LDcgQEAKIAkJY3VycmVudC0+Y29tbSwgdGFza19waWRfbnIoY3VycmVudCkpOwogCWR1bXBfc3RhY2soKTsKIAlkZWJ1Z19zaG93X2FsbF9sb2NrcygpOworCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcHJpbnRrKCJbIHR1cm5pbmcgb2ZmIGRlYWRsb2NrIGRldGVjdGlvbi4iCiAJICAgICAgICJQbGVhc2UgcmVwb3J0IHRoaXMgdHJhY2UuIF1cblxuIik7CkBAIC0yMDMsMTAgKzIwNywxMiBAQAogCW1lbXNldCh3YWl0ZXIsIDB4MTEsIHNpemVvZigqd2FpdGVyKSk7CiAJcGxpc3Rfbm9kZV9pbml0KCZ3YWl0ZXItPmxpc3RfZW50cnksIE1BWF9QUklPKTsKIAlwbGlzdF9ub2RlX2luaXQoJndhaXRlci0+cGlfbGlzdF9lbnRyeSwgTUFYX1BSSU8pOworCXdhaXRlci0+ZGVhZGxvY2tfdGFza19waWQgPSBOVUxMOwogfQogCiB2b2lkIGRlYnVnX3J0X211dGV4X2ZyZWVfd2FpdGVyKHN0cnVjdCBydF9tdXRleF93YWl0ZXIgKndhaXRlcikKIHsKKwlwdXRfcGlkKHdhaXRlci0+ZGVhZGxvY2tfdGFza19waWQpOwogCVRSQUNFX1dBUk5fT04oIXBsaXN0X25vZGVfZW1wdHkoJndhaXRlci0+bGlzdF9lbnRyeSkpOwogCVRSQUNFX1dBUk5fT04oIXBsaXN0X25vZGVfZW1wdHkoJndhaXRlci0+cGlfbGlzdF9lbnRyeSkpOwogCVRSQUNFX1dBUk5fT04od2FpdGVyLT50YXNrKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9ydG11dGV4X2NvbW1vbi5oIGIva2VybmVsL3J0bXV0ZXhfY29tbW9uLmgKaW5kZXggMmQzYjgzNS4uZTEyNGJmNSAxMDA2NDQKLS0tIGEva2VybmVsL3J0bXV0ZXhfY29tbW9uLmgKKysrIGIva2VybmVsL3J0bXV0ZXhfY29tbW9uLmgKQEAgLTUxLDcgKzUxLDcgQEAKIAlzdHJ1Y3QgcnRfbXV0ZXgJCSpsb2NrOwogI2lmZGVmIENPTkZJR19ERUJVR19SVF9NVVRFWEVTCiAJdW5zaWduZWQgbG9uZwkJaXA7Ci0JcGlkX3QJCQlkZWFkbG9ja190YXNrX3BpZDsKKwlzdHJ1Y3QgcGlkCQkqZGVhZGxvY2tfdGFza19waWQ7CiAJc3RydWN0IHJ0X211dGV4CQkqZGVhZGxvY2tfbG9jazsKICNlbmRpZgogfTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC5jIGIva2VybmVsL3NjaGVkLmMKaW5kZXggOTQ3NGIyMy4uM2VlZGQ1MiAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkLmMKKysrIGIva2VybmVsL3NjaGVkLmMKQEAgLTE4OTMsMTMgKzE4OTMsMTMgQEAKIAlyZXR1cm4gc3VjY2VzczsKIH0KIAotaW50IGZhc3RjYWxsIHdha2VfdXBfcHJvY2VzcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCitpbnQgd2FrZV91cF9wcm9jZXNzKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKIAlyZXR1cm4gdHJ5X3RvX3dha2VfdXAocCwgVEFTS19BTEwsIDApOwogfQogRVhQT1JUX1NZTUJPTCh3YWtlX3VwX3Byb2Nlc3MpOwogCi1pbnQgZmFzdGNhbGwgd2FrZV91cF9zdGF0ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHVuc2lnbmVkIGludCBzdGF0ZSkKK2ludCB3YWtlX3VwX3N0YXRlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgdW5zaWduZWQgaW50IHN0YXRlKQogewogCXJldHVybiB0cnlfdG9fd2FrZV91cChwLCBzdGF0ZSwgMCk7CiB9CkBAIC0xOTg2LDcgKzE5ODYsNyBAQAogICogdGhhdCBtdXN0IGJlIGRvbmUgZm9yIGV2ZXJ5IG5ld2x5IGNyZWF0ZWQgY29udGV4dCwgdGhlbiBwdXRzIHRoZSB0YXNrCiAgKiBvbiB0aGUgcnVucXVldWUgYW5kIHdha2VzIGl0LgogICovCi12b2lkIGZhc3RjYWxsIHdha2VfdXBfbmV3X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpwLCB1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzKQordm9pZCB3YWtlX3VwX25ld190YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBycSAqcnE7CkBAIC0zNzUzLDcgKzM3NTMsNyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfUFJFRU1QVCkgJiYgZGVmaW5lZChDT05GSUdfREVCVUdfUFJFRU1QVCkKIAotdm9pZCBmYXN0Y2FsbCBhZGRfcHJlZW1wdF9jb3VudChpbnQgdmFsKQordm9pZCBhZGRfcHJlZW1wdF9jb3VudChpbnQgdmFsKQogewogCS8qCiAJICogVW5kZXJmbG93PwpAQCAtMzc2OSw3ICszNzY5LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woYWRkX3ByZWVtcHRfY291bnQpOwogCi12b2lkIGZhc3RjYWxsIHN1Yl9wcmVlbXB0X2NvdW50KGludCB2YWwpCit2b2lkIHN1Yl9wcmVlbXB0X2NvdW50KGludCB2YWwpCiB7CiAJLyoKIAkgKiBVbmRlcmZsb3c/CkBAIC00MDY3LDcgKzQwNjcsNyBAQAogICogQG5yX2V4Y2x1c2l2ZTogaG93IG1hbnkgd2FrZS1vbmUgb3Igd2FrZS1tYW55IHRocmVhZHMgdG8gd2FrZSB1cAogICogQGtleTogaXMgZGlyZWN0bHkgcGFzc2VkIHRvIHRoZSB3YWtldXAgZnVuY3Rpb24KICAqLwotdm9pZCBmYXN0Y2FsbCBfX3dha2VfdXAod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHVuc2lnbmVkIGludCBtb2RlLAordm9pZCBfX3dha2VfdXAod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHVuc2lnbmVkIGludCBtb2RlLAogCQkJaW50IG5yX2V4Y2x1c2l2ZSwgdm9pZCAqa2V5KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC00MDgxLDcgKzQwODEsNyBAQAogLyoKICAqIFNhbWUgYXMgX193YWtlX3VwIGJ1dCBjYWxsZWQgd2l0aCB0aGUgc3BpbmxvY2sgaW4gd2FpdF9xdWV1ZV9oZWFkX3QgaGVsZC4KICAqLwotdm9pZCBmYXN0Y2FsbCBfX3dha2VfdXBfbG9ja2VkKHdhaXRfcXVldWVfaGVhZF90ICpxLCB1bnNpZ25lZCBpbnQgbW9kZSkKK3ZvaWQgX193YWtlX3VwX2xvY2tlZCh3YWl0X3F1ZXVlX2hlYWRfdCAqcSwgdW5zaWduZWQgaW50IG1vZGUpCiB7CiAJX193YWtlX3VwX2NvbW1vbihxLCBtb2RlLCAxLCAwLCBOVUxMKTsKIH0KQEAgLTQwOTksNyArNDA5OSw3IEBACiAgKgogICogT24gVVAgaXQgY2FuIHByZXZlbnQgZXh0cmEgcHJlZW1wdGlvbi4KICAqLwotdm9pZCBmYXN0Y2FsbAordm9pZAogX193YWtlX3VwX3N5bmMod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHVuc2lnbmVkIGludCBtb2RlLCBpbnQgbnJfZXhjbHVzaXZlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CmRpZmYgLS1naXQgYS9rZXJuZWwvc2lnbmFsLmMgYi9rZXJuZWwvc2lnbmFsLmMKaW5kZXggNWQzMGZmNS4uMmMxZjA4ZCAxMDA2NDQKLS0tIGEva2VybmVsL3NpZ25hbC5jCisrKyBiL2tlcm5lbC9zaWduYWwuYwpAQCAtMTAxOCw3ICsxMDE4LDcgQEAKIH0KIAogLyoKLSAqIGtpbGxfcGdycF9pbmZvKCkgc2VuZHMgYSBzaWduYWwgdG8gYSBwcm9jZXNzIGdyb3VwOiB0aGlzIGlzIHdoYXQgdGhlIHR0eQorICogX19raWxsX3BncnBfaW5mbygpIHNlbmRzIGEgc2lnbmFsIHRvIGEgcHJvY2VzcyBncm91cDogdGhpcyBpcyB3aGF0IHRoZSB0dHkKICAqIGNvbnRyb2wgY2hhcmFjdGVycyBkbyAoXkMsIF5aIGV0YykKICAqLwogCkBAIC0xMDM3LDMwICsxMDM3LDI4IEBACiAJcmV0dXJuIHN1Y2Nlc3MgPyAwIDogcmV0dmFsOwogfQogCi1pbnQga2lsbF9wZ3JwX2luZm8oaW50IHNpZywgc3RydWN0IHNpZ2luZm8gKmluZm8sIHN0cnVjdCBwaWQgKnBncnApCi17Ci0JaW50IHJldHZhbDsKLQotCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7Ci0JcmV0dmFsID0gX19raWxsX3BncnBfaW5mbyhzaWcsIGluZm8sIHBncnApOwotCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KIGludCBraWxsX3BpZF9pbmZvKGludCBzaWcsIHN0cnVjdCBzaWdpbmZvICppbmZvLCBzdHJ1Y3QgcGlkICpwaWQpCiB7Ci0JaW50IGVycm9yOworCWludCBlcnJvciA9IC1FU1JDSDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJaWYgKHVubGlrZWx5KHNpZ19uZWVkc190YXNrbGlzdChzaWcpKSkKIAkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAorcmV0cnk6CiAJcCA9IHBpZF90YXNrKHBpZCwgUElEVFlQRV9QSUQpOwotCWVycm9yID0gLUVTUkNIOwotCWlmIChwKQorCWlmIChwKSB7CiAJCWVycm9yID0gZ3JvdXBfc2VuZF9zaWdfaW5mbyhzaWcsIGluZm8sIHApOworCQlpZiAodW5saWtlbHkoZXJyb3IgPT0gLUVTUkNIKSkKKwkJCS8qCisJCQkgKiBUaGUgdGFzayB3YXMgdW5oYXNoZWQgaW4gYmV0d2VlbiwgdHJ5IGFnYWluLgorCQkJICogSWYgaXQgaXMgZGVhZCwgcGlkX3Rhc2soKSB3aWxsIHJldHVybiBOVUxMLAorCQkJICogaWYgd2UgcmFjZSB3aXRoIGRlX3RocmVhZCgpIGl0IHdpbGwgZmluZCB0aGUKKwkJCSAqIG5ldyBsZWFkZXIuCisJCQkgKi8KKwkJCWdvdG8gcmV0cnk7CisJfQogCiAJaWYgKHVubGlrZWx5KHNpZ19uZWVkc190YXNrbGlzdChzaWcpKSkKIAkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwpAQCAtMTEyNSwxNCArMTEyMywyMiBAQAogc3RhdGljIGludCBraWxsX3NvbWV0aGluZ19pbmZvKGludCBzaWcsIHN0cnVjdCBzaWdpbmZvICppbmZvLCBpbnQgcGlkKQogewogCWludCByZXQ7Ci0JcmN1X3JlYWRfbG9jaygpOwotCWlmICghcGlkKSB7Ci0JCXJldCA9IGtpbGxfcGdycF9pbmZvKHNpZywgaW5mbywgdGFza19wZ3JwKGN1cnJlbnQpKTsKLQl9IGVsc2UgaWYgKHBpZCA9PSAtMSkgeworCisJaWYgKHBpZCA+IDApIHsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlyZXQgPSBraWxsX3BpZF9pbmZvKHNpZywgaW5mbywgZmluZF92cGlkKHBpZCkpOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCWlmIChwaWQgIT0gLTEpIHsKKwkJcmV0ID0gX19raWxsX3BncnBfaW5mbyhzaWcsIGluZm8sCisJCQkJcGlkID8gZmluZF92cGlkKC1waWQpIDogdGFza19wZ3JwKGN1cnJlbnQpKTsKKwl9IGVsc2UgewogCQlpbnQgcmV0dmFsID0gMCwgY291bnQgPSAwOwogCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKiBwOwogCi0JCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CiAJCWZvcl9lYWNoX3Byb2Nlc3MocCkgewogCQkJaWYgKHAtPnBpZCA+IDEgJiYgIXNhbWVfdGhyZWFkX2dyb3VwKHAsIGN1cnJlbnQpKSB7CiAJCQkJaW50IGVyciA9IGdyb3VwX3NlbmRfc2lnX2luZm8oc2lnLCBpbmZvLCBwKTsKQEAgLTExNDEsMTQgKzExNDcsMTAgQEAKIAkJCQkJcmV0dmFsID0gZXJyOwogCQkJfQogCQl9Ci0JCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAkJcmV0ID0gY291bnQgPyByZXR2YWwgOiAtRVNSQ0g7Ci0JfSBlbHNlIGlmIChwaWQgPCAwKSB7Ci0JCXJldCA9IGtpbGxfcGdycF9pbmZvKHNpZywgaW5mbywgZmluZF92cGlkKC1waWQpKTsKLQl9IGVsc2UgewotCQlyZXQgPSBraWxsX3BpZF9pbmZvKHNpZywgaW5mbywgZmluZF92cGlkKHBpZCkpOwogCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKKwlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMTk2LDIwICsxMTk4LDYgQEAKIAlyZXR1cm4gc2VuZF9zaWdfaW5mbyhzaWcsIF9fc2lfc3BlY2lhbChwcml2KSwgcCk7CiB9CiAKLS8qCi0gKiBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgInByb2Nlc3Mtd2lkZSIgc2lnbmFscy4KLSAqIFRoZXkgd2lsbCBnbyB0byBhbiBhcHByb3ByaWF0ZSB0aHJlYWQgaW4gdGhlIHRocmVhZCBncm91cC4KLSAqLwotaW50Ci1zZW5kX2dyb3VwX3NpZ19pbmZvKGludCBzaWcsIHN0cnVjdCBzaWdpbmZvICppbmZvLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCi17Ci0JaW50IHJldDsKLQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwotCXJldCA9IGdyb3VwX3NlbmRfc2lnX2luZm8oc2lnLCBpbmZvLCBwKTsKLQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQogdm9pZAogZm9yY2Vfc2lnKGludCBzaWcsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKQEAgLTEyMzcsNyArMTIyNSwxMyBAQAogCiBpbnQga2lsbF9wZ3JwKHN0cnVjdCBwaWQgKnBpZCwgaW50IHNpZywgaW50IHByaXYpCiB7Ci0JcmV0dXJuIGtpbGxfcGdycF9pbmZvKHNpZywgX19zaV9zcGVjaWFsKHByaXYpLCBwaWQpOworCWludCByZXQ7CisKKwlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCXJldCA9IF9fa2lsbF9wZ3JwX2luZm8oc2lnLCBfX3NpX3NwZWNpYWwocHJpdiksIHBpZCk7CisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCisJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0woa2lsbF9wZ3JwKTsKIApAQCAtMTU1NiwxMSArMTU1MCw2IEBACiB7CiAJaWYgKCFsaWtlbHkoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpCiAJCXJldHVybiAwOwotCi0JaWYgKHVubGlrZWx5KGN1cnJlbnQtPnBhcmVudCA9PSBjdXJyZW50LT5yZWFsX3BhcmVudCAmJgotCQkgICAgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX0FUVEFDSEVEKSkpCi0JCXJldHVybiAwOwotCiAJLyoKIAkgKiBBcmUgd2UgaW4gdGhlIG1pZGRsZSBvZiBkb19jb3JlZHVtcD8KIAkgKiBJZiBzbyBhbmQgb3VyIHRyYWNlciBpcyBhbHNvIHBhcnQgb2YgdGhlIGNvcmVkdW1wIHN0b3BwaW5nCkBAIC0xNTk2LDEwICsxNTg1LDEwIEBACiAgKiBUaGF0IG1ha2VzIGl0IGEgd2F5IHRvIHRlc3QgYSBzdG9wcGVkIHByb2Nlc3MgZm9yCiAgKiBiZWluZyBwdHJhY2Utc3RvcHBlZCB2cyBiZWluZyBqb2ItY29udHJvbC1zdG9wcGVkLgogICoKLSAqIElmIHdlIGFjdHVhbGx5IGRlY2lkZSBub3QgdG8gc3RvcCBhdCBhbGwgYmVjYXVzZSB0aGUgdHJhY2VyIGlzIGdvbmUsCi0gKiB3ZSBsZWF2ZSBub3N0b3BfY29kZSBpbiBjdXJyZW50LT5leGl0X2NvZGUuCisgKiBJZiB3ZSBhY3R1YWxseSBkZWNpZGUgbm90IHRvIHN0b3AgYXQgYWxsIGJlY2F1c2UgdGhlIHRyYWNlcgorICogaXMgZ29uZSwgd2Uga2VlcCBjdXJyZW50LT5leGl0X2NvZGUgdW5sZXNzIGNsZWFyX2NvZGUuCiAgKi8KLXN0YXRpYyB2b2lkIHB0cmFjZV9zdG9wKGludCBleGl0X2NvZGUsIGludCBub3N0b3BfY29kZSwgc2lnaW5mb190ICppbmZvKQorc3RhdGljIHZvaWQgcHRyYWNlX3N0b3AoaW50IGV4aXRfY29kZSwgaW50IGNsZWFyX2NvZGUsIHNpZ2luZm9fdCAqaW5mbykKIHsKIAlpbnQga2lsbGVkID0gMDsKIApAQCAtMTY0MywxMSArMTYzMiwxMiBAQAogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIEJ5IHRoZSB0aW1lIHdlIGdvdCB0aGUgbG9jaywgb3VyIHRyYWNlciB3ZW50IGF3YXkuCi0JCSAqIERvbid0IHN0b3AgaGVyZS4KKwkJICogRG9uJ3QgZHJvcCB0aGUgbG9jayB5ZXQsIGFub3RoZXIgdHJhY2VyIG1heSBjb21lLgogCQkgKi8KKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQlpZiAoY2xlYXJfY29kZSkKKwkJCWN1cnJlbnQtPmV4aXRfY29kZSA9IDA7CiAJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQkJY3VycmVudC0+ZXhpdF9jb2RlID0gbm9zdG9wX2NvZGU7CiAJfQogCiAJLyoKQEAgLTE2ODAsNyArMTY3MCw3IEBACiAKIAkvKiBMZXQgdGhlIGRlYnVnZ2VyIHJ1bi4gICovCiAJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JcHRyYWNlX3N0b3AoZXhpdF9jb2RlLCAwLCAmaW5mbyk7CisJcHRyYWNlX3N0b3AoZXhpdF9jb2RlLCAxLCAmaW5mbyk7CiAJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIH0KIApAQCAtMTc0Myw3ICsxNzMzLDcgQEAKIAkJCSAqIHN0b3AgaXMgYWx3YXlzIGRvbmUgd2l0aCB0aGUgc2lnbG9jayBoZWxkLAogCQkJICogc28gdGhpcyBjaGVjayBoYXMgbm8gcmFjZXMuCiAJCQkgKi8KLQkJCWlmICghdC0+ZXhpdF9zdGF0ZSAmJgorCQkJaWYgKCEodC0+ZmxhZ3MgJiBQRl9FWElUSU5HKSAmJgogCQkJICAgICF0YXNrX2lzX3N0b3BwZWRfb3JfdHJhY2VkKHQpKSB7CiAJCQkJc3RvcF9jb3VudCsrOwogCQkJCXNpZ25hbF93YWtlX3VwKHQsIDApOwpAQCAtMTc4Nyw3ICsxNzc3LDcgQEAKIAkJCXB0cmFjZV9zaWduYWxfZGVsaXZlcihyZWdzLCBjb29raWUpOwogCiAJCQkvKiBMZXQgdGhlIGRlYnVnZ2VyIHJ1bi4gICovCi0JCQlwdHJhY2Vfc3RvcChzaWduciwgc2lnbnIsIGluZm8pOworCQkJcHRyYWNlX3N0b3Aoc2lnbnIsIDAsIGluZm8pOwogCiAJCQkvKiBXZSdyZSBiYWNrLiAgRGlkIHRoZSBkZWJ1Z2dlciBjYW5jZWwgdGhlIHNpZz8gICovCiAJCQlzaWduciA9IGN1cnJlbnQtPmV4aXRfY29kZTsKQEAgLTE5MDQsNiArMTg5NCw0OCBAQAogCXJldHVybiBzaWducjsKIH0KIAordm9pZCBleGl0X3NpZ25hbHMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJaW50IGdyb3VwX3N0b3AgPSAwOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKKworCWlmICh0aHJlYWRfZ3JvdXBfZW1wdHkodHNrKSB8fCBzaWduYWxfZ3JvdXBfZXhpdCh0c2stPnNpZ25hbCkpIHsKKwkJdHNrLT5mbGFncyB8PSBQRl9FWElUSU5HOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkvKgorCSAqIEZyb20gbm93IHRoaXMgdGFzayBpcyBub3QgdmlzaWJsZSBmb3IgZ3JvdXAtd2lkZSBzaWduYWxzLAorCSAqIHNlZSB3YW50c19zaWduYWwoKSwgZG9fc2lnbmFsX3N0b3AoKS4KKwkgKi8KKwl0c2stPmZsYWdzIHw9IFBGX0VYSVRJTkc7CisJaWYgKCFzaWduYWxfcGVuZGluZyh0c2spKQorCQlnb3RvIG91dDsKKworCS8qIEl0IGNvdWxkIGJlIHRoYXQgX19ncm91cF9jb21wbGV0ZV9zaWduYWwoKSBjaG9vc2UgdXMgdG8KKwkgKiBub3RpZnkgYWJvdXQgZ3JvdXAtd2lkZSBzaWduYWwuIEFub3RoZXIgdGhyZWFkIHNob3VsZCBiZQorCSAqIHdva2VuIG5vdyB0byB0YWtlIHRoZSBzaWduYWwgc2luY2Ugd2Ugd2lsbCBub3QuCisJICovCisJZm9yICh0ID0gdHNrOyAodCA9IG5leHRfdGhyZWFkKHQpKSAhPSB0c2s7ICkKKwkJaWYgKCFzaWduYWxfcGVuZGluZyh0KSAmJiAhKHQtPmZsYWdzICYgUEZfRVhJVElORykpCisJCQlyZWNhbGNfc2lncGVuZGluZ19hbmRfd2FrZSh0KTsKKworCWlmICh1bmxpa2VseSh0c2stPnNpZ25hbC0+Z3JvdXBfc3RvcF9jb3VudCkgJiYKKwkJCSEtLXRzay0+c2lnbmFsLT5ncm91cF9zdG9wX2NvdW50KSB7CisJCXRzay0+c2lnbmFsLT5mbGFncyA9IFNJR05BTF9TVE9QX1NUT1BQRUQ7CisJCWdyb3VwX3N0b3AgPSAxOworCX0KK291dDoKKwlzcGluX3VubG9ja19pcnEoJnRzay0+c2lnaGFuZC0+c2lnbG9jayk7CisKKwlpZiAodW5saWtlbHkoZ3JvdXBfc3RvcCkpIHsKKwkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwkJZG9fbm90aWZ5X3BhcmVudF9jbGRzdG9wKHRzaywgQ0xEX1NUT1BQRUQpOworCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJfQorfQorCiBFWFBPUlRfU1lNQk9MKHJlY2FsY19zaWdwZW5kaW5nKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGRlcXVldWVfc2lnbmFsKTsKIEVYUE9SVF9TWU1CT0woZmx1c2hfc2lnbmFscyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc29mdGlycS5jIGIva2VybmVsL3NvZnRpcnEuYwppbmRleCBkNzgzN2Q0Li41YjNhZWE1IDEwMDY0NAotLS0gYS9rZXJuZWwvc29mdGlycS5jCisrKyBiL2tlcm5lbC9zb2Z0aXJxLmMKQEAgLTMyMCw3ICszMjAsNyBAQAogLyoKICAqIFRoaXMgZnVuY3Rpb24gbXVzdCBydW4gd2l0aCBpcnFzIGRpc2FibGVkIQogICovCi1pbmxpbmUgZmFzdGNhbGwgdm9pZCByYWlzZV9zb2Z0aXJxX2lycW9mZih1bnNpZ25lZCBpbnQgbnIpCitpbmxpbmUgdm9pZCByYWlzZV9zb2Z0aXJxX2lycW9mZih1bnNpZ25lZCBpbnQgbnIpCiB7CiAJX19yYWlzZV9zb2Z0aXJxX2lycW9mZihucik7CiAKQEAgLTMzNyw3ICszMzcsNyBAQAogCQl3YWtldXBfc29mdGlycWQoKTsKIH0KIAotdm9pZCBmYXN0Y2FsbCByYWlzZV9zb2Z0aXJxKHVuc2lnbmVkIGludCBucikKK3ZvaWQgcmFpc2Vfc29mdGlycSh1bnNpZ25lZCBpbnQgbnIpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMzYzLDcgKzM2Myw3IEBACiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHRhc2tsZXRfaGVhZCwgdGFza2xldF92ZWMpID0geyBOVUxMIH07CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHRhc2tsZXRfaGVhZCwgdGFza2xldF9oaV92ZWMpID0geyBOVUxMIH07CiAKLXZvaWQgZmFzdGNhbGwgX190YXNrbGV0X3NjaGVkdWxlKHN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqdCkKK3ZvaWQgX190YXNrbGV0X3NjaGVkdWxlKHN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqdCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0zNzYsNyArMzc2LDcgQEAKIAogRVhQT1JUX1NZTUJPTChfX3Rhc2tsZXRfc2NoZWR1bGUpOwogCi12b2lkIGZhc3RjYWxsIF9fdGFza2xldF9oaV9zY2hlZHVsZShzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgKnQpCit2b2lkIF9fdGFza2xldF9oaV9zY2hlZHVsZShzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgKnQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3N5cy5jIGIva2VybmVsL3N5cy5jCmluZGV4IGUzYzA4ZDQuLmE2MjYxMTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXMuYworKysgYi9rZXJuZWwvc3lzLmMKQEAgLTkxNiw4ICs5MTYsOCBAQAogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmdyb3VwX2xlYWRlciA9IGN1cnJlbnQtPmdyb3VwX2xlYWRlcjsKLQlpbnQgZXJyID0gLUVJTlZBTDsKLQlzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnM7CisJc3RydWN0IHBpZCAqcGdycDsKKwlpbnQgZXJyOwogCiAJaWYgKCFwaWQpCiAJCXBpZCA9IHRhc2tfcGlkX3Zucihncm91cF9sZWFkZXIpOwpAQCAtOTI5LDEyICs5MjksMTAgQEAKIAkvKiBGcm9tIHRoaXMgcG9pbnQgZm9yd2FyZCB3ZSBrZWVwIGhvbGRpbmcgb250byB0aGUgdGFza2xpc3QgbG9jawogCSAqIHNvIHRoYXQgb3VyIHBhcmVudCBkb2VzIG5vdCBjaGFuZ2UgZnJvbSB1bmRlciB1cy4gLURhdmVNCiAJICovCi0JbnMgPSBjdXJyZW50LT5uc3Byb3h5LT5waWRfbnM7Ci0KIAl3cml0ZV9sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CiAKIAllcnIgPSAtRVNSQ0g7Ci0JcCA9IGZpbmRfdGFza19ieV9waWRfbnMocGlkLCBucyk7CisJcCA9IGZpbmRfdGFza19ieV92cGlkKHBpZCk7CiAJaWYgKCFwKQogCQlnb3RvIG91dDsKIApAQCAtOTQyLDcgKzk0MCw3IEBACiAJaWYgKCF0aHJlYWRfZ3JvdXBfbGVhZGVyKHApKQogCQlnb3RvIG91dDsKIAotCWlmIChwLT5yZWFsX3BhcmVudC0+dGdpZCA9PSBncm91cF9sZWFkZXItPnRnaWQpIHsKKwlpZiAoc2FtZV90aHJlYWRfZ3JvdXAocC0+cmVhbF9wYXJlbnQsIGdyb3VwX2xlYWRlcikpIHsKIAkJZXJyID0gLUVQRVJNOwogCQlpZiAodGFza19zZXNzaW9uKHApICE9IHRhc2tfc2Vzc2lvbihncm91cF9sZWFkZXIpKQogCQkJZ290byBvdXQ7CkBAIC05NTksMTAgKzk1NywxMiBAQAogCWlmIChwLT5zaWduYWwtPmxlYWRlcikKIAkJZ290byBvdXQ7CiAKKwlwZ3JwID0gdGFza19waWQocCk7CiAJaWYgKHBnaWQgIT0gcGlkKSB7CiAJCXN0cnVjdCB0YXNrX3N0cnVjdCAqZzsKIAotCQlnID0gZmluZF90YXNrX2J5X3BpZF90eXBlX25zKFBJRFRZUEVfUEdJRCwgcGdpZCwgbnMpOworCQlwZ3JwID0gZmluZF92cGlkKHBnaWQpOworCQlnID0gcGlkX3Rhc2socGdycCwgUElEVFlQRV9QR0lEKTsKIAkJaWYgKCFnIHx8IHRhc2tfc2Vzc2lvbihnKSAhPSB0YXNrX3Nlc3Npb24oZ3JvdXBfbGVhZGVyKSkKIAkJCWdvdG8gb3V0OwogCX0KQEAgLTk3MSwxMyArOTcxLDEwIEBACiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKLQlpZiAodGFza19wZ3JwX25yX25zKHAsIG5zKSAhPSBwZ2lkKSB7Ci0JCXN0cnVjdCBwaWQgKnBpZDsKLQorCWlmICh0YXNrX3BncnAocCkgIT0gcGdycCkgewogCQlkZXRhY2hfcGlkKHAsIFBJRFRZUEVfUEdJRCk7Ci0JCXBpZCA9IGZpbmRfdnBpZChwZ2lkKTsKLQkJYXR0YWNoX3BpZChwLCBQSURUWVBFX1BHSUQsIHBpZCk7Ci0JCXNldF90YXNrX3BncnAocCwgcGlkX25yKHBpZCkpOworCQlhdHRhY2hfcGlkKHAsIFBJRFRZUEVfUEdJRCwgcGdycCk7CisJCXNldF90YXNrX3BncnAocCwgcGlkX25yKHBncnApKTsKIAl9CiAKIAllcnIgPSAwOwpAQCAtOTk0LDE3ICs5OTEsMTQgQEAKIAllbHNlIHsKIAkJaW50IHJldHZhbDsKIAkJc3RydWN0IHRhc2tfc3RydWN0ICpwOwotCQlzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnM7Ci0KLQkJbnMgPSBjdXJyZW50LT5uc3Byb3h5LT5waWRfbnM7CiAKIAkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQkJcCA9IGZpbmRfdGFza19ieV9waWRfbnMocGlkLCBucyk7CisJCXAgPSBmaW5kX3Rhc2tfYnlfdnBpZChwaWQpOwogCQlyZXR2YWwgPSAtRVNSQ0g7CiAJCWlmIChwKSB7CiAJCQlyZXR2YWwgPSBzZWN1cml0eV90YXNrX2dldHBnaWQocCk7CiAJCQlpZiAoIXJldHZhbCkKLQkJCQlyZXR2YWwgPSB0YXNrX3BncnBfbnJfbnMocCwgbnMpOworCQkJCXJldHZhbCA9IHRhc2tfcGdycF92bnIocCk7CiAJCX0KIAkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwogCQlyZXR1cm4gcmV0dmFsOwpAQCAtMTAyOCwxOSArMTAyMiwxNiBAQAogCWVsc2UgewogCQlpbnQgcmV0dmFsOwogCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7Ci0JCXN0cnVjdCBwaWRfbmFtZXNwYWNlICpuczsKIAotCQlucyA9IGN1cnJlbnQtPm5zcHJveHktPnBpZF9uczsKLQotCQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwotCQlwID0gZmluZF90YXNrX2J5X3BpZF9ucyhwaWQsIG5zKTsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlwID0gZmluZF90YXNrX2J5X3ZwaWQocGlkKTsKIAkJcmV0dmFsID0gLUVTUkNIOwogCQlpZiAocCkgewogCQkJcmV0dmFsID0gc2VjdXJpdHlfdGFza19nZXRzaWQocCk7CiAJCQlpZiAoIXJldHZhbCkKLQkJCQlyZXR2YWwgPSB0YXNrX3Nlc3Npb25fbnJfbnMocCwgbnMpOworCQkJCXJldHZhbCA9IHRhc2tfc2Vzc2lvbl92bnIocCk7CiAJCX0KLQkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiB9CkBAIC0xMDQ4LDM1ICsxMDM5LDI5IEBACiBhc21saW5rYWdlIGxvbmcgc3lzX3NldHNpZCh2b2lkKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqZ3JvdXBfbGVhZGVyID0gY3VycmVudC0+Z3JvdXBfbGVhZGVyOwotCXBpZF90IHNlc3Npb247CisJc3RydWN0IHBpZCAqc2lkID0gdGFza19waWQoZ3JvdXBfbGVhZGVyKTsKKwlwaWRfdCBzZXNzaW9uID0gcGlkX3ZucihzaWQpOwogCWludCBlcnIgPSAtRVBFUk07CiAKIAl3cml0ZV9sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7Ci0KIAkvKiBGYWlsIGlmIEkgYW0gYWxyZWFkeSBhIHNlc3Npb24gbGVhZGVyICovCiAJaWYgKGdyb3VwX2xlYWRlci0+c2lnbmFsLT5sZWFkZXIpCiAJCWdvdG8gb3V0OwogCi0Jc2Vzc2lvbiA9IGdyb3VwX2xlYWRlci0+cGlkOwogCS8qIEZhaWwgaWYgYSBwcm9jZXNzIGdyb3VwIGlkIGFscmVhZHkgZXhpc3RzIHRoYXQgZXF1YWxzIHRoZQogCSAqIHByb3Bvc2VkIHNlc3Npb24gaWQuCi0JICoKLQkgKiBEb24ndCBjaGVjayBpZiBzZXNzaW9uIGlkID09IDEgYmVjYXVzZSBrZXJuZWwgdGhyZWFkcyB1c2UgdGhpcwotCSAqIHNlc3Npb24gaWQgYW5kIHNvIHRoZSBjaGVjayB3aWxsIGFsd2F5cyBmYWlsIGFuZCBtYWtlIGl0IHNvCi0JICogaW5pdCBjYW5ub3Qgc3VjY2Vzc2Z1bGx5IGNhbGwgc2V0c2lkLgogCSAqLwotCWlmIChzZXNzaW9uID4gMSAmJiBmaW5kX3Rhc2tfYnlfcGlkX3R5cGVfbnMoUElEVFlQRV9QR0lELAotCQkJCXNlc3Npb24sICZpbml0X3BpZF9ucykpCisJaWYgKHBpZF90YXNrKHNpZCwgUElEVFlQRV9QR0lEKSkKIAkJZ290byBvdXQ7CiAKIAlncm91cF9sZWFkZXItPnNpZ25hbC0+bGVhZGVyID0gMTsKLQlfX3NldF9zcGVjaWFsX3BpZHMoc2Vzc2lvbiwgc2Vzc2lvbik7CisJX19zZXRfc3BlY2lhbF9waWRzKHNpZCk7CiAKIAlzcGluX2xvY2soJmdyb3VwX2xlYWRlci0+c2lnaGFuZC0+c2lnbG9jayk7CiAJZ3JvdXBfbGVhZGVyLT5zaWduYWwtPnR0eSA9IE5VTEw7CiAJc3Bpbl91bmxvY2soJmdyb3VwX2xlYWRlci0+c2lnaGFuZC0+c2lnbG9jayk7CiAKLQllcnIgPSB0YXNrX3BncnBfdm5yKGdyb3VwX2xlYWRlcik7CisJZXJyID0gc2Vzc2lvbjsKIG91dDoKIAl3cml0ZV91bmxvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKIAlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEva2VybmVsL3N5c2N0bC5jIGIva2VybmVsL3N5c2N0bC5jCmluZGV4IDg2ZGFhYTIuLmQ0MWVmNmIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXNjdGwuYworKysgYi9rZXJuZWwvc3lzY3RsLmMKQEAgLTM3LDcgKzM3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9oaWdodWlkLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvaHVnZXRsYi5oPgotI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXMuaD4KICNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KQEAgLTY3LDE0ICs2NiwxMyBAQAogZXh0ZXJuIGludCBzeXNjdGxfb3ZlcmNvbW1pdF9yYXRpbzsKIGV4dGVybiBpbnQgc3lzY3RsX3BhbmljX29uX29vbTsKIGV4dGVybiBpbnQgc3lzY3RsX29vbV9raWxsX2FsbG9jYXRpbmdfdGFzazsKK2V4dGVybiBpbnQgc3lzY3RsX29vbV9kdW1wX3Rhc2tzOwogZXh0ZXJuIGludCBtYXhfdGhyZWFkczsKIGV4dGVybiBpbnQgY29yZV91c2VzX3BpZDsKIGV4dGVybiBpbnQgc3VpZF9kdW1wYWJsZTsKIGV4dGVybiBjaGFyIGNvcmVfcGF0dGVybltdOwogZXh0ZXJuIGludCBwaWRfbWF4OwogZXh0ZXJuIGludCBtaW5fZnJlZV9rYnl0ZXM7Ci1leHRlcm4gaW50IHByaW50a19yYXRlbGltaXRfamlmZmllczsKLWV4dGVybiBpbnQgcHJpbnRrX3JhdGVsaW1pdF9idXJzdDsKIGV4dGVybiBpbnQgcGlkX21heF9taW4sIHBpZF9tYXhfbWF4OwogZXh0ZXJuIGludCBzeXNjdGxfZHJvcF9jYWNoZXM7CiBleHRlcm4gaW50IHBlcmNwdV9wYWdlbGlzdF9mcmFjdGlvbjsKQEAgLTQ5MCwxNCArNDg4LDYgQEAKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAogCX0sCi0JewotCQkuY3RsX25hbWUJPSBLRVJOX1BSSU5USywKLQkJLnByb2NuYW1lCT0gInByaW50ayIsCi0JCS5kYXRhCQk9ICZjb25zb2xlX2xvZ2xldmVsLAotCQkubWF4bGVuCQk9IDQqc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKLQl9LAogI2lmZGVmIENPTkZJR19LTU9ECiAJewogCQkuY3RsX25hbWUJPSBLRVJOX01PRFBST0JFLApAQCAtNjQ0LDYgKzYzNCwxNSBAQAogCQkubW9kZQkJPSAwNjQ0LAogCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCiAJfSwKKyNpZiBkZWZpbmVkIENPTkZJR19QUklOVEsKKwl7CisJCS5jdGxfbmFtZQk9IEtFUk5fUFJJTlRLLAorCQkucHJvY25hbWUJPSAicHJpbnRrIiwKKwkJLmRhdGEJCT0gJmNvbnNvbGVfbG9nbGV2ZWwsCisJCS5tYXhsZW4JCT0gNCpzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCiAJewogCQkuY3RsX25hbWUJPSBLRVJOX1BSSU5US19SQVRFTElNSVQsCiAJCS5wcm9jbmFtZQk9ICJwcmludGtfcmF0ZWxpbWl0IiwKQEAgLTY2MSw2ICs2NjAsNyBAQAogCQkubW9kZQkJPSAwNjQ0LAogCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCiAJfSwKKyNlbmRpZgogCXsKIAkJLmN0bF9uYW1lCT0gS0VSTl9OR1JPVVBTX01BWCwKIAkJLnByb2NuYW1lCT0gIm5ncm91cHNfbWF4IiwKQEAgLTg3MSw2ICs4NzEsMTQgQEAKIAkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAogCX0sCiAJeworCQkuY3RsX25hbWUJPSBDVExfVU5OVU1CRVJFRCwKKwkJLnByb2NuYW1lCT0gIm9vbV9kdW1wX3Rhc2tzIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9vb21fZHVtcF90YXNrcywKKwkJLm1heGxlbgkJPSBzaXplb2Yoc3lzY3RsX29vbV9kdW1wX3Rhc2tzKSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJewogCQkuY3RsX25hbWUJPSBWTV9PVkVSQ09NTUlUX1JBVElPLAogCQkucHJvY25hbWUJPSAib3ZlcmNvbW1pdF9yYXRpbyIsCiAJCS5kYXRhCQk9ICZzeXNjdGxfb3ZlcmNvbW1pdF9yYXRpbywKQEAgLTk3Myw3ICs5ODEsNyBAQAogCQkuZGF0YQkJPSAmbnJfb3ZlcmNvbW1pdF9odWdlX3BhZ2VzLAogCQkubWF4bGVuCQk9IHNpemVvZihucl9vdmVyY29tbWl0X2h1Z2VfcGFnZXMpLAogCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG91bG9uZ3ZlY19taW5tYXgsCisJCS5wcm9jX2hhbmRsZXIJPSAmaHVnZXRsYl9vdmVyY29tbWl0X2hhbmRsZXIsCiAJfSwKICNlbmRpZgogCXsKQEAgLTI0NzksNyArMjQ4Nyw3IEBACiAJcGlkX3QgdG1wOwogCWludCByOwogCi0JdG1wID0gcGlkX25yX25zKGNhZF9waWQsIGN1cnJlbnQtPm5zcHJveHktPnBpZF9ucyk7CisJdG1wID0gcGlkX3ZucihjYWRfcGlkKTsKIAogCXIgPSBfX2RvX3Byb2NfZG9pbnR2ZWMoJnRtcCwgdGFibGUsIHdyaXRlLCBmaWxwLCBidWZmZXIsCiAJCQkgICAgICAgbGVucCwgcHBvcywgTlVMTCwgTlVMTCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzY3RsX2NoZWNrLmMgYi9rZXJuZWwvc3lzY3RsX2NoZWNrLmMKaW5kZXggMDA2MzY1Yi4uYzA5MzUwZCAxMDA2NDQKLS0tIGEva2VybmVsL3N5c2N0bF9jaGVjay5jCisrKyBiL2tlcm5lbC9zeXNjdGxfY2hlY2suYwpAQCAtOCwxMCArOCwxMCBAQAogc3RydWN0IHRyYW5zX2N0bF90YWJsZSB7CiAJaW50CQkJY3RsX25hbWU7CiAJY29uc3QgY2hhcgkJKnByb2NuYW1lOwotCXN0cnVjdCB0cmFuc19jdGxfdGFibGUJKmNoaWxkOworCWNvbnN0IHN0cnVjdCB0cmFuc19jdGxfdGFibGUgKmNoaWxkOwogfTsKIAotc3RhdGljIHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfcmFuZG9tX3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19yYW5kb21fdGFibGVbXSA9IHsKIAl7IFJBTkRPTV9QT09MU0laRSwJInBvb2xzaXplIiB9LAogCXsgUkFORE9NX0VOVFJPUFlfQ09VTlQsCSJlbnRyb3B5X2F2YWlsIiB9LAogCXsgUkFORE9NX1JFQURfVEhSRVNILAkicmVhZF93YWtldXBfdGhyZXNob2xkIiB9LApAQCAtMjEsMTMgKzIxLDEzIEBACiAJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX3B0eV90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfcHR5X3RhYmxlW10gPSB7CiAJeyBQVFlfTUFYLAkJIm1heCIgfSwKIAl7IFBUWV9OUiwJCSJuciIgfSwKIAl7fQogfTsKIAotc3RhdGljIHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfa2Vybl90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfa2Vybl90YWJsZVtdID0gewogCXsgS0VSTl9PU1RZUEUsCQkJIm9zdHlwZSIgfSwKIAl7IEtFUk5fT1NSRUxFQVNFLAkJIm9zcmVsZWFzZSIgfSwKIAkvKiBLRVJOX09TUkVWIG5vdCB1c2VkICovCkBAIC0xMDcsNyArMTA3LDcgQEAKIAl7fQogfTsKIAotc3RhdGljIHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfdm1fdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX3ZtX3RhYmxlW10gPSB7CiAJeyBWTV9PVkVSQ09NTUlUX01FTU9SWSwJCSJvdmVyY29tbWl0X21lbW9yeSIgfSwKIAl7IFZNX1BBR0VfQ0xVU1RFUiwJCSJwYWdlLWNsdXN0ZXIiIH0sCiAJeyBWTV9ESVJUWV9CQUNLR1JPVU5ELAkJImRpcnR5X2JhY2tncm91bmRfcmF0aW8iIH0sCkBAIC0xMzksNyArMTM5LDcgQEAKIAl7fQogfTsKIAotc3RhdGljIHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X2NvcmVfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX25ldF9jb3JlX3RhYmxlW10gPSB7CiAJeyBORVRfQ09SRV9XTUVNX01BWCwJCSJ3bWVtX21heCIgfSwKIAl7IE5FVF9DT1JFX1JNRU1fTUFYLAkJInJtZW1fbWF4IiB9LAogCXsgTkVUX0NPUkVfV01FTV9ERUZBVUxULAkid21lbV9kZWZhdWx0IiB9LApAQCAtMTY1LDE0ICsxNjUsMTQgQEAKIAl7fSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX25ldF91bml4X3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19uZXRfdW5peF90YWJsZVtdID0gewogCS8qIE5FVF9VTklYX0RFU1RST1lfREVMQVkgdW51c2VkICovCiAJLyogTkVUX1VOSVhfREVMRVRFX0RFTEFZIHVudXNlZCAqLwogCXsgTkVUX1VOSVhfTUFYX0RHUkFNX1FMRU4sCSJtYXhfZGdyYW1fcWxlbiIgfSwKIAl7fQogfTsKIAotc3RhdGljIHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X2lwdjRfcm91dGVfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX25ldF9pcHY0X3JvdXRlX3RhYmxlW10gPSB7CiAJeyBORVRfSVBWNF9ST1VURV9GTFVTSCwJCQkiZmx1c2giIH0sCiAJeyBORVRfSVBWNF9ST1VURV9NSU5fREVMQVksCQkibWluX2RlbGF5IiB9LAogCXsgTkVUX0lQVjRfUk9VVEVfTUFYX0RFTEFZLAkJIm1heF9kZWxheSIgfSwKQEAgLTE5NSw3ICsxOTUsNyBAQAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19uZXRfaXB2NF9jb25mX3ZhcnNfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX25ldF9pcHY0X2NvbmZfdmFyc190YWJsZVtdID0gewogCXsgTkVUX0lQVjRfQ09ORl9GT1JXQVJESU5HLAkJImZvcndhcmRpbmciIH0sCiAJeyBORVRfSVBWNF9DT05GX01DX0ZPUldBUkRJTkcsCQkibWNfZm9yd2FyZGluZyIgfSwKIApAQCAtMjIyLDE0ICsyMjIsMTQgQEAKIAl7fQogfTsKIAotc3RhdGljIHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X2lwdjRfY29uZl90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X2lwdjRfY29uZl90YWJsZVtdID0gewogCXsgTkVUX1BST1RPX0NPTkZfQUxMLAkJImFsbCIsCQl0cmFuc19uZXRfaXB2NF9jb25mX3ZhcnNfdGFibGUgfSwKIAl7IE5FVF9QUk9UT19DT05GX0RFRkFVTFQsCSJkZWZhdWx0IiwJdHJhbnNfbmV0X2lwdjRfY29uZl92YXJzX3RhYmxlIH0sCiAJeyAwLCBOVUxMLCB0cmFuc19uZXRfaXB2NF9jb25mX3ZhcnNfdGFibGUgfSwKIAl7fQogfTsKIAotc3RhdGljIHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X25laWdoX3ZhcnNfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX25ldF9uZWlnaF92YXJzX3RhYmxlW10gPSB7CiAJeyBORVRfTkVJR0hfTUNBU1RfU09MSUNJVCwJIm1jYXN0X3NvbGljaXQiIH0sCiAJeyBORVRfTkVJR0hfVUNBU1RfU09MSUNJVCwJInVjYXN0X3NvbGljaXQiIH0sCiAJeyBORVRfTkVJR0hfQVBQX1NPTElDSVQsCSJhcHBfc29saWNpdCIgfSwKQEAgLTI1MSwxMyArMjUxLDEzIEBACiAJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX25ldF9uZWlnaF90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X25laWdoX3RhYmxlW10gPSB7CiAJeyBORVRfUFJPVE9fQ09ORl9ERUZBVUxULCAiZGVmYXVsdCIsIHRyYW5zX25ldF9uZWlnaF92YXJzX3RhYmxlIH0sCiAJeyAwLCBOVUxMLCB0cmFuc19uZXRfbmVpZ2hfdmFyc190YWJsZSB9LAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19uZXRfaXB2NF9uZXRmaWx0ZXJfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX25ldF9pcHY0X25ldGZpbHRlcl90YWJsZVtdID0gewogCXsgTkVUX0lQVjRfTkZfQ09OTlRSQUNLX01BWCwJCQkJImlwX2Nvbm50cmFja19tYXgiIH0sCiAKIAl7IE5FVF9JUFY0X05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9TWU5fU0VOVCwJCSJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfc3luX3NlbnQiIH0sCkBAIC0yOTQsNyArMjk0LDcgQEAKIAl7fQogfTsKIAotc3RhdGljIHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X2lwdjRfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX25ldF9pcHY0X3RhYmxlW10gPSB7CiAJeyBORVRfSVBWNF9GT1JXQVJELAkJCSJpcF9mb3J3YXJkIiB9LAogCXsgTkVUX0lQVjRfRFlOQUREUiwJCQkiaXBfZHluYWRkciIgfSwKIApAQCAtMzkzLDEzICszOTMsMTMgQEAKIAl7fQogfTsKIAotc3RhdGljIHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X2lweF90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X2lweF90YWJsZVtdID0gewogCXsgTkVUX0lQWF9QUFJPUF9CUk9BRENBU1RJTkcsCSJpcHhfcHByb3BfYnJvYWRjYXN0aW5nIiB9LAogCS8qIE5FVF9JUFhfRk9SV0FSRElORyB1bnVzZWQgKi8KIAl7fQogfTsKIAotc3RhdGljIHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X2F0YWxrX3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19uZXRfYXRhbGtfdGFibGVbXSA9IHsKIAl7IE5FVF9BVEFMS19BQVJQX0VYUElSWV9USU1FLAkJImFhcnAtZXhwaXJ5LXRpbWUiIH0sCiAJeyBORVRfQVRBTEtfQUFSUF9USUNLX1RJTUUsCQkiYWFycC10aWNrLXRpbWUiIH0sCiAJeyBORVRfQVRBTEtfQUFSUF9SRVRSQU5TTUlUX0xJTUlULAkiYWFycC1yZXRyYW5zbWl0LWxpbWl0IiB9LApAQCAtNDA3LDcgKzQwNyw3IEBACiAJe30sCiB9OwogCi1zdGF0aWMgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19uZXRfbmV0cm9tX3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19uZXRfbmV0cm9tX3RhYmxlW10gPSB7CiAJeyBORVRfTkVUUk9NX0RFRkFVTFRfUEFUSF9RVUFMSVRZLAkJImRlZmF1bHRfcGF0aF9xdWFsaXR5IiB9LAogCXsgTkVUX05FVFJPTV9PQlNPTEVTQ0VOQ0VfQ09VTlRfSU5JVElBTElTRVIsCSJvYnNvbGVzY2VuY2VfY291bnRfaW5pdGlhbGlzZXIiIH0sCiAJeyBORVRfTkVUUk9NX05FVFdPUktfVFRMX0lOSVRJQUxJU0VSLAkJIm5ldHdvcmtfdHRsX2luaXRpYWxpc2VyIiB9LApAQCAtNDIzLDcgKzQyMyw3IEBACiAJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX25ldF9heDI1X3BhcmFtX3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19uZXRfYXgyNV9wYXJhbV90YWJsZVtdID0gewogCXsgTkVUX0FYMjVfSVBfREVGQVVMVF9NT0RFLAkiaXBfZGVmYXVsdF9tb2RlIiB9LAogCXsgTkVUX0FYMjVfREVGQVVMVF9NT0RFLAkiYXgyNV9kZWZhdWx0X21vZGUiIH0sCiAJeyBORVRfQVgyNV9CQUNLT0ZGX1RZUEUsCSJiYWNrb2ZmX3R5cGUiIH0sCkBAIC00NDEsMTIgKzQ0MSwxMiBAQAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19uZXRfYXgyNV90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X2F4MjVfdGFibGVbXSA9IHsKIAl7IDAsIE5VTEwsIHRyYW5zX25ldF9heDI1X3BhcmFtX3RhYmxlIH0sCiAJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX25ldF9icmlkZ2VfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX25ldF9icmlkZ2VfdGFibGVbXSA9IHsKIAl7IE5FVF9CUklER0VfTkZfQ0FMTF9BUlBUQUJMRVMsCQkiYnJpZGdlLW5mLWNhbGwtYXJwdGFibGVzIiB9LAogCXsgTkVUX0JSSURHRV9ORl9DQUxMX0lQVEFCTEVTLAkJImJyaWRnZS1uZi1jYWxsLWlwdGFibGVzIiB9LAogCXsgTkVUX0JSSURHRV9ORl9DQUxMX0lQNlRBQkxFUywJCSJicmlkZ2UtbmYtY2FsbC1pcDZ0YWJsZXMiIH0sCkBAIC00NTUsNyArNDU1LDcgQEAKIAl7fQogfTsKIAotc3RhdGljIHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X3Jvc2VfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX25ldF9yb3NlX3RhYmxlW10gPSB7CiAJeyBORVRfUk9TRV9SRVNUQVJUX1JFUVVFU1RfVElNRU9VVCwJInJlc3RhcnRfcmVxdWVzdF90aW1lb3V0IiB9LAogCXsgTkVUX1JPU0VfQ0FMTF9SRVFVRVNUX1RJTUVPVVQsCSJjYWxsX3JlcXVlc3RfdGltZW91dCIgfSwKIAl7IE5FVF9ST1NFX1JFU0VUX1JFUVVFU1RfVElNRU9VVCwJInJlc2V0X3JlcXVlc3RfdGltZW91dCIgfSwKQEAgLTQ2OSw3ICs0NjksNyBAQAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19uZXRfaXB2Nl9jb25mX3Zhcl90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X2lwdjZfY29uZl92YXJfdGFibGVbXSA9IHsKIAl7IE5FVF9JUFY2X0ZPUldBUkRJTkcsCQkJImZvcndhcmRpbmciIH0sCiAJeyBORVRfSVBWNl9IT1BfTElNSVQsCQkJImhvcF9saW1pdCIgfSwKIAl7IE5FVF9JUFY2X01UVSwJCQkJIm10dSIgfSwKQEAgLTQ5NywxNCArNDk3LDE0IEBACiAJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX25ldF9pcHY2X2NvbmZfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX25ldF9pcHY2X2NvbmZfdGFibGVbXSA9IHsKIAl7IE5FVF9QUk9UT19DT05GX0FMTCwJCSJhbGwiLAl0cmFuc19uZXRfaXB2Nl9jb25mX3Zhcl90YWJsZSB9LAogCXsgTkVUX1BST1RPX0NPTkZfREVGQVVMVCwgCSJkZWZhdWx0IiwgdHJhbnNfbmV0X2lwdjZfY29uZl92YXJfdGFibGUgfSwKIAl7IDAsIE5VTEwsIHRyYW5zX25ldF9pcHY2X2NvbmZfdmFyX3RhYmxlIH0sCiAJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX25ldF9pcHY2X3JvdXRlX3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19uZXRfaXB2Nl9yb3V0ZV90YWJsZVtdID0gewogCXsgTkVUX0lQVjZfUk9VVEVfRkxVU0gsCQkJImZsdXNoIiB9LAogCXsgTkVUX0lQVjZfUk9VVEVfR0NfVEhSRVNILAkJImdjX3RocmVzaCIgfSwKIAl7IE5FVF9JUFY2X1JPVVRFX01BWF9TSVpFLAkJIm1heF9zaXplIiB9LApAQCAtNTE4LDEyICs1MTgsMTIgQEAKIAl7fQogfTsKIAotc3RhdGljIHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X2lwdjZfaWNtcF90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X2lwdjZfaWNtcF90YWJsZVtdID0gewogCXsgTkVUX0lQVjZfSUNNUF9SQVRFTElNSVQsCSJyYXRlbGltaXQiIH0sCiAJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX25ldF9pcHY2X3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19uZXRfaXB2Nl90YWJsZVtdID0gewogCXsgTkVUX0lQVjZfQ09ORiwJCSJjb25mIiwJCXRyYW5zX25ldF9pcHY2X2NvbmZfdGFibGUgfSwKIAl7IE5FVF9JUFY2X05FSUdILAkJIm5laWdoIiwJdHJhbnNfbmV0X25laWdoX3RhYmxlIH0sCiAJeyBORVRfSVBWNl9ST1VURSwJCSJyb3V0ZSIsCXRyYW5zX25ldF9pcHY2X3JvdXRlX3RhYmxlIH0sCkBAIC01MzgsNyArNTM4LDcgQEAKIAl7fQogfTsKIAotc3RhdGljIHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X3gyNV90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X3gyNV90YWJsZVtdID0gewogCXsgTkVUX1gyNV9SRVNUQVJUX1JFUVVFU1RfVElNRU9VVCwJInJlc3RhcnRfcmVxdWVzdF90aW1lb3V0IiB9LAogCXsgTkVUX1gyNV9DQUxMX1JFUVVFU1RfVElNRU9VVCwJCSJjYWxsX3JlcXVlc3RfdGltZW91dCIgfSwKIAl7IE5FVF9YMjVfUkVTRVRfUkVRVUVTVF9USU1FT1VULAkicmVzZXRfcmVxdWVzdF90aW1lb3V0IiB9LApAQCAtNTQ4LDEzICs1NDgsMTMgQEAKIAl7fQogfTsKIAotc3RhdGljIHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X3RyX3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19uZXRfdHJfdGFibGVbXSA9IHsKIAl7IE5FVF9UUl9SSUZfVElNRU9VVCwJInJpZl90aW1lb3V0IiB9LAogCXt9CiB9OwogCiAKLXN0YXRpYyBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX25ldF9kZWNuZXRfY29uZl92YXJzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19uZXRfZGVjbmV0X2NvbmZfdmFyc1tdID0gewogCXsgTkVUX0RFQ05FVF9DT05GX0RFVl9GT1JXQVJESU5HLAkiZm9yd2FyZGluZyIgfSwKIAl7IE5FVF9ERUNORVRfQ09ORl9ERVZfUFJJT1JJVFksCQkicHJpb3JpdHkiIH0sCiAJeyBORVRfREVDTkVUX0NPTkZfREVWX1QyLAkJInQyIiB9LApAQCAtNTYyLDEyICs1NjIsMTIgQEAKIAl7fQogfTsKIAotc3RhdGljIHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X2RlY25ldF9jb25mW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19uZXRfZGVjbmV0X2NvbmZbXSA9IHsKIAl7IDAsIE5VTEwsIHRyYW5zX25ldF9kZWNuZXRfY29uZl92YXJzIH0sCiAJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX25ldF9kZWNuZXRfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX25ldF9kZWNuZXRfdGFibGVbXSA9IHsKIAl7IE5FVF9ERUNORVRfQ09ORiwJCSJjb25mIiwJdHJhbnNfbmV0X2RlY25ldF9jb25mIH0sCiAJeyBORVRfREVDTkVUX05PREVfQUREUkVTUywJIm5vZGVfYWRkcmVzcyIgfSwKIAl7IE5FVF9ERUNORVRfTk9ERV9OQU1FLAkJIm5vZGVfbmFtZSIgfSwKQEAgLTU4NSw3ICs1ODUsNyBAQAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19uZXRfc2N0cF90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X3NjdHBfdGFibGVbXSA9IHsKIAl7IE5FVF9TQ1RQX1JUT19JTklUSUFMLAkJInJ0b19pbml0aWFsIiB9LAogCXsgTkVUX1NDVFBfUlRPX01JTiwJCSJydG9fbWluIiB9LAogCXsgTkVUX1NDVFBfUlRPX01BWCwJCSJydG9fbWF4IiB9LApAQCAtNjA2LDcgKzYwNiw3IEBACiAJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX25ldF9sbGNfbGxjMl90aW1lb3V0X3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19uZXRfbGxjX2xsYzJfdGltZW91dF90YWJsZVtdID0gewogCXsgTkVUX0xMQzJfQUNLX1RJTUVPVVQsCQkiYWNrIiB9LAogCXsgTkVUX0xMQzJfUF9USU1FT1VULAkJInAiIH0sCiAJeyBORVRfTExDMl9SRUpfVElNRU9VVCwJCSJyZWoiIH0sCkBAIC02MTQsMjMgKzYxNCwyMyBAQAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19uZXRfbGxjX3N0YXRpb25fdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX25ldF9sbGNfc3RhdGlvbl90YWJsZVtdID0gewogCXsgTkVUX0xMQ19TVEFUSU9OX0FDS19USU1FT1VULAkiYWNrX3RpbWVvdXQiIH0sCiAJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX25ldF9sbGNfbGxjMl90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X2xsY19sbGMyX3RhYmxlW10gPSB7CiAJeyBORVRfTExDMiwJCSJ0aW1lb3V0IiwJdHJhbnNfbmV0X2xsY19sbGMyX3RpbWVvdXRfdGFibGUgfSwKIAl7fQogfTsKIAotc3RhdGljIHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X2xsY190YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X2xsY190YWJsZVtdID0gewogCXsgTkVUX0xMQzIsCQkibGxjMiIsCQl0cmFuc19uZXRfbGxjX2xsYzJfdGFibGUgfSwKIAl7IE5FVF9MTENfU1RBVElPTiwJInN0YXRpb24iLAl0cmFuc19uZXRfbGxjX3N0YXRpb25fdGFibGUgfSwKIAl7fQogfTsKIAotc3RhdGljIHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X25ldGZpbHRlcl90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X25ldGZpbHRlcl90YWJsZVtdID0gewogCXsgTkVUX05GX0NPTk5UUkFDS19NQVgsCQkJCSJuZl9jb25udHJhY2tfbWF4IiB9LAogCXsgTkVUX05GX0NPTk5UUkFDS19UQ1BfVElNRU9VVF9TWU5fU0VOVCwJIm5mX2Nvbm50cmFja190Y3BfdGltZW91dF9zeW5fc2VudCIgfSwKIAl7IE5FVF9ORl9DT05OVFJBQ0tfVENQX1RJTUVPVVRfU1lOX1JFQ1YsCSJuZl9jb25udHJhY2tfdGNwX3RpbWVvdXRfc3luX3JlY3YiIH0sCkBAIC02NjcsMTIgKzY2NywxMiBAQAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19uZXRfZGNjcF90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X2RjY3BfdGFibGVbXSA9IHsKIAl7IE5FVF9EQ0NQX0RFRkFVTFQsCSJkZWZhdWx0IiB9LAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19uZXRfaXJkYV90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfbmV0X2lyZGFfdGFibGVbXSA9IHsKIAl7IE5FVF9JUkRBX0RJU0NPVkVSWSwJCSJkaXNjb3ZlcnkiIH0sCiAJeyBORVRfSVJEQV9ERVZOQU1FLAkJImRldm5hbWUiIH0sCiAJeyBORVRfSVJEQV9ERUJVRywJCSJkZWJ1ZyIgfSwKQEAgLTY5MCw3ICs2OTAsNyBAQAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19uZXRfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX25ldF90YWJsZVtdID0gewogCXsgTkVUX0NPUkUsCQkiY29yZSIsCQl0cmFuc19uZXRfY29yZV90YWJsZSB9LAogCS8qIE5FVF9FVEhFUiBub3QgdXNlZCAqLwogCS8qIE5FVF84MDIgbm90IHVzZWQgKi8KQEAgLTcxNiw3ICs3MTYsNyBAQAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19mc19xdW90YV90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfZnNfcXVvdGFfdGFibGVbXSA9IHsKIAl7IEZTX0RRX0xPT0tVUFMsCSJsb29rdXBzIiB9LAogCXsgRlNfRFFfRFJPUFMsCQkiZHJvcHMiIH0sCiAJeyBGU19EUV9SRUFEUywJCSJyZWFkcyIgfSwKQEAgLTcyOSw3ICs3MjksNyBAQAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19mc194ZnNfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX2ZzX3hmc190YWJsZVtdID0gewogCXsgWEZTX1JFU1RSSUNUX0NIT1dOLAkicmVzdHJpY3RfY2hvd24iIH0sCiAJeyBYRlNfU0dJRF9JTkhFUklULAkiaXJpeF9zZ2lkX2luaGVyaXQiIH0sCiAJeyBYRlNfU1lNTElOS19NT0RFLAkiaXJpeF9zeW1saW5rX21vZGUiIH0sCkBAIC03NTAsMjQgKzc1MCwyNCBAQAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19mc19vY2ZzMl9ubV90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfZnNfb2NmczJfbm1fdGFibGVbXSA9IHsKIAl7IDEsICJoYl9jdGxfcGF0aCIgfSwKIAl7fQogfTsKIAotc3RhdGljIHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfZnNfb2NmczJfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX2ZzX29jZnMyX3RhYmxlW10gPSB7CiAJeyAxLAkibm0iLAl0cmFuc19mc19vY2ZzMl9ubV90YWJsZSB9LAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19pbm90aWZ5X3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19pbm90aWZ5X3RhYmxlW10gPSB7CiAJeyBJTk9USUZZX01BWF9VU0VSX0lOU1RBTkNFUywJIm1heF91c2VyX2luc3RhbmNlcyIgfSwKIAl7IElOT1RJRllfTUFYX1VTRVJfV0FUQ0hFUywJIm1heF91c2VyX3dhdGNoZXMiIH0sCiAJeyBJTk9USUZZX01BWF9RVUVVRURfRVZFTlRTLAkibWF4X3F1ZXVlZF9ldmVudHMiIH0sCiAJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX2ZzX3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19mc190YWJsZVtdID0gewogCXsgRlNfTlJJTk9ERSwJCSJpbm9kZS1uciIgfSwKIAl7IEZTX1NUQVRJTk9ERSwJCSJpbm9kZS1zdGF0ZSIgfSwKIAkvKiBGU19NQVhJTk9ERSB1bnVzZWQgKi8KQEAgLTc5MywxMSArNzkzLDExIEBACiAJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX2RlYnVnX3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19kZWJ1Z190YWJsZVtdID0gewogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19jZHJvbV90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfY2Ryb21fdGFibGVbXSA9IHsKIAl7IERFVl9DRFJPTV9JTkZPLAkJImluZm8iIH0sCiAJeyBERVZfQ0RST01fQVVUT0NMT1NFLAkJImF1dG9jbG9zZSIgfSwKIAl7IERFVl9DRFJPTV9BVVRPRUpFQ1QsCQkiYXV0b2VqZWN0IiB9LApAQCAtODA3LDEyICs4MDcsMTIgQEAKIAl7fQogfTsKIAotc3RhdGljIHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfaXBtaV90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfaXBtaV90YWJsZVtdID0gewogCXsgREVWX0lQTUlfUE9XRVJPRkZfUE9XRVJDWUNMRSwJInBvd2Vyb2ZmX3Bvd2VyY3ljbGUiIH0sCiAJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX21hY19oaWRfZmlsZXNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX21hY19oaWRfZmlsZXNbXSA9IHsKIAkvKiBERVZfTUFDX0hJRF9LRVlCT0FSRF9TRU5EU19MSU5VWF9LRVlDT0RFUyB1bnVzZWQgKi8KIAkvKiBERVZfTUFDX0hJRF9LRVlCT0FSRF9MT0NLX0tFWUNPREVTIHVudXNlZCAqLwogCXsgREVWX01BQ19ISURfTU9VU0VfQlVUVE9OX0VNVUxBVElPTiwJIm1vdXNlX2J1dHRvbl9lbXVsYXRpb24iIH0sCkBAIC04MjIsMzUgKzgyMiwzNSBAQAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19yYWlkX3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19yYWlkX3RhYmxlW10gPSB7CiAJeyBERVZfUkFJRF9TUEVFRF9MSU1JVF9NSU4sCSJzcGVlZF9saW1pdF9taW4iIH0sCiAJeyBERVZfUkFJRF9TUEVFRF9MSU1JVF9NQVgsCSJzcGVlZF9saW1pdF9tYXgiIH0sCiAJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX3Njc2lfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX3Njc2lfdGFibGVbXSA9IHsKIAl7IERFVl9TQ1NJX0xPR0dJTkdfTEVWRUwsICJsb2dnaW5nX2xldmVsIiB9LAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19wYXJwb3J0X2RlZmF1bHRfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX3BhcnBvcnRfZGVmYXVsdF90YWJsZVtdID0gewogCXsgREVWX1BBUlBPUlRfREVGQVVMVF9USU1FU0xJQ0UsCSJ0aW1lc2xpY2UiIH0sCiAJeyBERVZfUEFSUE9SVF9ERUZBVUxUX1NQSU5USU1FLAkJInNwaW50aW1lIiB9LAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19wYXJwb3J0X2RldmljZV90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfcGFycG9ydF9kZXZpY2VfdGFibGVbXSA9IHsKIAl7IERFVl9QQVJQT1JUX0RFVklDRV9USU1FU0xJQ0UsCQkidGltZXNsaWNlIiB9LAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19wYXJwb3J0X2RldmljZXNfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX3BhcnBvcnRfZGV2aWNlc190YWJsZVtdID0gewogCXsgREVWX1BBUlBPUlRfREVWSUNFU19BQ1RJVkUsCQkiYWN0aXZlIiB9LAogCXsgMCwgTlVMTCwgdHJhbnNfcGFycG9ydF9kZXZpY2VfdGFibGUgfSwKIAl7fQogfTsKIAotc3RhdGljIHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfcGFycG9ydF9wYXJwb3J0X3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19wYXJwb3J0X3BhcnBvcnRfdGFibGVbXSA9IHsKIAl7IERFVl9QQVJQT1JUX1NQSU5USU1FLAkJInNwaW50aW1lIiB9LAogCXsgREVWX1BBUlBPUlRfQkFTRV9BRERSLAkiYmFzZS1hZGRyIiB9LAogCXsgREVWX1BBUlBPUlRfSVJRLAkJImlycSIgfSwKQEAgLTg2NCwxMyArODY0LDEzIEBACiAJeyBERVZfUEFSUE9SVF9BVVRPUFJPQkUgKyA0LAkiYXV0b3Byb2JlMyIgfSwKIAl7fQogfTsKLXN0YXRpYyBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX3BhcnBvcnRfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX3BhcnBvcnRfdGFibGVbXSA9IHsKIAl7IERFVl9QQVJQT1JUX0RFRkFVTFQsCSJkZWZhdWx0IiwJdHJhbnNfcGFycG9ydF9kZWZhdWx0X3RhYmxlIH0sCiAJeyAwLCBOVUxMLCB0cmFuc19wYXJwb3J0X3BhcnBvcnRfdGFibGUgfSwKIAl7fQogfTsKIAotc3RhdGljIHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfZGV2X3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19kZXZfdGFibGVbXSA9IHsKIAl7IERFVl9DRFJPTSwJImNkcm9tIiwJdHJhbnNfY2Ryb21fdGFibGUgfSwKIAkvKiBERVZfSFdNT04gdW51c2VkICovCiAJeyBERVZfUEFSUE9SVCwJInBhcnBvcnQiLAl0cmFuc19wYXJwb3J0X3RhYmxlIH0sCkBAIC04ODEsMTkgKzg4MSwxOSBAQAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19idXNfaXNhX3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19idXNfaXNhX3RhYmxlW10gPSB7CiAJeyBCVVNfSVNBX01FTV9CQVNFLAkibWVtYmFzZSIgfSwKIAl7IEJVU19JU0FfUE9SVF9CQVNFLAkicG9ydGJhc2UiIH0sCiAJeyBCVVNfSVNBX1BPUlRfU0hJRlQsCSJwb3J0c2hpZnQiIH0sCiAJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX2J1c190YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfYnVzX3RhYmxlW10gPSB7CiAJeyBDVExfQlVTX0lTQSwJImlzYSIsCXRyYW5zX2J1c19pc2FfdGFibGUgfSwKIAl7fQogfTsKIAotc3RhdGljIHN0cnVjdCB0cmFuc19jdGxfdGFibGUgdHJhbnNfYXJsYW5fY29uZl90YWJsZTBbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX2FybGFuX2NvbmZfdGFibGUwW10gPSB7CiAJeyAxLAkic3ByZWFkaW5nQ29kZSIgfSwKIAl7IDIsCSJjaGFubmVsTnVtYmVyIiB9LAogCXsgMywJInNjcmFtYmxpbmdEaXNhYmxlIiB9LApAQCAtOTY0LDcgKzk2NCw3IEBACiAJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX2FybGFuX2NvbmZfdGFibGUxW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19hcmxhbl9jb25mX3RhYmxlMVtdID0gewogCXsgMSwJInNwcmVhZGluZ0NvZGUiIH0sCiAJeyAyLAkiY2hhbm5lbE51bWJlciIgfSwKIAl7IDMsCSJzY3JhbWJsaW5nRGlzYWJsZSIgfSwKQEAgLTEwMzUsNyArMTAzNSw3IEBACiAJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX2FybGFuX2NvbmZfdGFibGUyW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19hcmxhbl9jb25mX3RhYmxlMltdID0gewogCXsgMSwJInNwcmVhZGluZ0NvZGUiIH0sCiAJeyAyLAkiY2hhbm5lbE51bWJlciIgfSwKIAl7IDMsCSJzY3JhbWJsaW5nRGlzYWJsZSIgfSwKQEAgLTExMDYsNyArMTEwNiw3IEBACiAJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX2FybGFuX2NvbmZfdGFibGUzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19hcmxhbl9jb25mX3RhYmxlM1tdID0gewogCXsgMSwJInNwcmVhZGluZ0NvZGUiIH0sCiAJeyAyLAkiY2hhbm5lbE51bWJlciIgfSwKIAl7IDMsCSJzY3JhbWJsaW5nRGlzYWJsZSIgfSwKQEAgLTExNzcsNyArMTE3Nyw3IEBACiAJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX2FybGFuX3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19hcmxhbl90YWJsZVtdID0gewogCXsgMSwJCSJhcmxhbjAiLAl0cmFuc19hcmxhbl9jb25mX3RhYmxlMCB9LAogCXsgMiwJCSJhcmxhbjEiLAl0cmFuc19hcmxhbl9jb25mX3RhYmxlMSB9LAogCXsgMywJCSJhcmxhbjIiLAl0cmFuc19hcmxhbl9jb25mX3RhYmxlMiB9LApAQCAtMTE4NSwxMyArMTE4NSwxMyBAQAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19zMzkwZGJmX3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19zMzkwZGJmX3RhYmxlW10gPSB7CiAJeyA1Njc4IC8qIENUTF9TMzkwREJGX1NUT1BQQUJMRSAqLywJImRlYnVnX3N0b3BwYWJsZSIgfSwKIAl7IDU2NzkgLyogQ1RMX1MzOTBEQkZfQUNUSVZFICovLAkiZGVidWdfYWN0aXZlIiB9LAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19zdW5ycGNfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX3N1bnJwY190YWJsZVtdID0gewogCXsgQ1RMX1JQQ0RFQlVHLAkJInJwY19kZWJ1ZyIgfSwKIAl7IENUTF9ORlNERUJVRywJCSJuZnNfZGVidWciIH0sCiAJeyBDVExfTkZTRERFQlVHLAkibmZzZF9kZWJ1ZyIgfSwKQEAgLTEyMDMsNyArMTIwMyw3IEBACiAJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX3BtX3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19wbV90YWJsZVtdID0gewogCXsgMSAvKiBDVExfUE1fU1VTUEVORCAqLywJInN1c3BlbmQiIH0sCiAJeyAyIC8qIENUTF9QTV9DTU9ERSAqLywJCSJjbW9kZSIgfSwKIAl7IDMgLyogQ1RMX1BNX1AwICovLAkJInAwIiB9LApAQCAtMTIxMSwxMyArMTIxMSwxMyBAQAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IHRyYW5zX2N0bF90YWJsZSB0cmFuc19mcnZfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX2Zydl90YWJsZVtdID0gewogCXsgMSwJImNhY2hlLW1vZGUiIH0sCiAJeyAyLAkicGluLWN4bnIiIH0sCiAJe30KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX3Jvb3RfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlIHRyYW5zX3Jvb3RfdGFibGVbXSA9IHsKIAl7IENUTF9LRVJOLAkia2VybmVsIiwJdHJhbnNfa2Vybl90YWJsZSB9LAogCXsgQ1RMX1ZNLAkidm0iLAkJdHJhbnNfdm1fdGFibGUgfSwKIAl7IENUTF9ORVQsCSJuZXQiLAkJdHJhbnNfbmV0X3RhYmxlIH0sCkBAIC0xMjYxLDE1ICsxMjYxLDE0IEBACiAJcmV0dXJuIHRhYmxlOwogfQogCi1zdGF0aWMgc3RydWN0IHRyYW5zX2N0bF90YWJsZSAqc3lzY3RsX2JpbmFyeV9sb29rdXAoc3RydWN0IGN0bF90YWJsZSAqdGFibGUpCitzdGF0aWMgY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSAqc3lzY3RsX2JpbmFyeV9sb29rdXAoc3RydWN0IGN0bF90YWJsZSAqdGFibGUpCiB7CiAJc3RydWN0IGN0bF90YWJsZSAqdGVzdDsKLQlzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlICpyZWY7Ci0JaW50IGRlcHRoLCBjdXJfZGVwdGg7CisJY29uc3Qgc3RydWN0IHRyYW5zX2N0bF90YWJsZSAqcmVmOworCWludCBjdXJfZGVwdGg7CiAKLQlkZXB0aCA9IHN5c2N0bF9kZXB0aCh0YWJsZSk7CisJY3VyX2RlcHRoID0gc3lzY3RsX2RlcHRoKHRhYmxlKTsKIAotCWN1cl9kZXB0aCA9IGRlcHRoOwogCXJlZiA9IHRyYW5zX3Jvb3RfdGFibGU7CiByZXBlYXQ6CiAJdGVzdCA9IHN5c2N0bF9wYXJlbnQodGFibGUsIGN1cl9kZXB0aCk7CkBAIC0xNDM3LDcgKzE0MzYsNyBAQAogCiBzdGF0aWMgdm9pZCBzeXNjdGxfY2hlY2tfYmluX3BhdGgoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGNvbnN0IGNoYXIgKipmYWlsKQogewotCXN0cnVjdCB0cmFuc19jdGxfdGFibGUgKnJlZjsKKwljb25zdCBzdHJ1Y3QgdHJhbnNfY3RsX3RhYmxlICpyZWY7CiAKIAlyZWYgPSBzeXNjdGxfYmluYXJ5X2xvb2t1cCh0YWJsZSk7CiAJaWYgKHRhYmxlLT5jdGxfbmFtZSAmJiAhcmVmKQpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUuYyBiL2tlcm5lbC90aW1lLmMKaW5kZXggMzNhZjNlNS4uYTVlYzAxM2I2IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS5jCisrKyBiL2tlcm5lbC90aW1lLmMKQEAgLTM5LDYgKzM5LDggQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KIAorI2luY2x1ZGUgInRpbWVjb25zdC5oIgorCiAvKgogICogVGhlIHRpbWV6b25lIHdoZXJlIHRoZSBsb2NhbCBzeXN0ZW0gaXMgbG9jYXRlZC4gIFVzZWQgYXMgYSBkZWZhdWx0IGJ5IHNvbWUKICAqIHByb2dyYW1zIHdobyBvYnRhaW4gdGhpcyB2YWx1ZSBieSB1c2luZyBnZXR0aW1lb2ZkYXkuCkBAIC05Myw3ICs5NSw4IEBACiAKICNlbmRpZiAvKiBfX0FSQ0hfV0FOVF9TWVNfVElNRSAqLwogCi1hc21saW5rYWdlIGxvbmcgc3lzX2dldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCBfX3VzZXIgKnR2LCBzdHJ1Y3QgdGltZXpvbmUgX191c2VyICp0eikKK2FzbWxpbmthZ2UgbG9uZyBzeXNfZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsIF9fdXNlciAqdHYsCisJCQkJIHN0cnVjdCB0aW1lem9uZSBfX3VzZXIgKnR6KQogewogCWlmIChsaWtlbHkodHYgIT0gTlVMTCkpIHsKIAkJc3RydWN0IHRpbWV2YWwga3R2OwpAQCAtMTE4LDcgKzEyMSw3IEBACiAgKiBoYXJkIHRvIG1ha2UgdGhlIHByb2dyYW0gd2FycCB0aGUgY2xvY2sgcHJlY2lzZWx5IG4gaG91cnMpICBvcgogICogY29tcGlsZSBpbiB0aGUgdGltZXpvbmUgaW5mb3JtYXRpb24gaW50byB0aGUga2VybmVsLiAgQmFkLCBiYWQuLi4uCiAgKgotICogICAgICAgICAgICAgIAkJCQktIFRZVCwgMTk5Mi0wMS0wMQorICoJCQkJCQktIFRZVCwgMTk5Mi0wMS0wMQogICoKICAqIFRoZSBiZXN0IHRoaW5nIHRvIGRvIGlzIHRvIGtlZXAgdGhlIENNT1MgY2xvY2sgaW4gdW5pdmVyc2FsIHRpbWUgKFVUQykKICAqIGFzIHJlYWwgVU5JWCBtYWNoaW5lcyBhbHdheXMgZG8gaXQuIFRoaXMgYXZvaWRzIGFsbCBoZWFkYWNoZXMgYWJvdXQKQEAgLTI0MCw3ICsyNDMsMTEgQEAKICNlbGlmIEhaID4gTVNFQ19QRVJfU0VDICYmICEoSFogJSBNU0VDX1BFUl9TRUMpCiAJcmV0dXJuIChqICsgKEhaIC8gTVNFQ19QRVJfU0VDKSAtIDEpLyhIWiAvIE1TRUNfUEVSX1NFQyk7CiAjZWxzZQotCXJldHVybiAoaiAqIE1TRUNfUEVSX1NFQykgLyBIWjsKKyMgaWYgQklUU19QRVJfTE9ORyA9PSAzMgorCXJldHVybiAoKHU2NClIWl9UT19NU0VDX01VTDMyICogaikgPj4gSFpfVE9fTVNFQ19TSFIzMjsKKyMgZWxzZQorCXJldHVybiAoaiAqIEhaX1RPX01TRUNfTlVNKSAvIEhaX1RPX01TRUNfREVOOworIyBlbmRpZgogI2VuZGlmCiB9CiBFWFBPUlRfU1lNQk9MKGppZmZpZXNfdG9fbXNlY3MpOwpAQCAtMjUyLDcgKzI1OSwxMSBAQAogI2VsaWYgSFogPiBVU0VDX1BFUl9TRUMgJiYgIShIWiAlIFVTRUNfUEVSX1NFQykKIAlyZXR1cm4gKGogKyAoSFogLyBVU0VDX1BFUl9TRUMpIC0gMSkvKEhaIC8gVVNFQ19QRVJfU0VDKTsKICNlbHNlCi0JcmV0dXJuIChqICogVVNFQ19QRVJfU0VDKSAvIEhaOworIyBpZiBCSVRTX1BFUl9MT05HID09IDMyCisJcmV0dXJuICgodTY0KUhaX1RPX1VTRUNfTVVMMzIgKiBqKSA+PiBIWl9UT19VU0VDX1NIUjMyOworIyBlbHNlCisJcmV0dXJuIChqICogSFpfVE9fVVNFQ19OVU0pIC8gSFpfVE9fVVNFQ19ERU47CisjIGVuZGlmCiAjZW5kaWYKIH0KIEVYUE9SVF9TWU1CT0woamlmZmllc190b191c2Vjcyk7CkBAIC0yNjcsNyArMjc4LDcgQEAKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvbmx5IHVzZWQgZm9yIHRpbWVzdGFtcHMgcmV0dXJuZWQgYnkKICAqIGN1cnJlbnRfa2VybmVsX3RpbWUoKSBvciBDVVJSRU5UX1RJTUUsIG5vdCB3aXRoIGRvX2dldHRpbWVvZmRheSgpIGJlY2F1c2UKLSAqIGl0IGRvZXNuJ3QgaGFuZGxlIHRoZSBiZXR0ZXIgcmVzb2x1dGlvbiBvZiB0aGUgbGF0ZXIuCisgKiBpdCBkb2Vzbid0IGhhbmRsZSB0aGUgYmV0dGVyIHJlc29sdXRpb24gb2YgdGhlIGxhdHRlci4KICAqLwogc3RydWN0IHRpbWVzcGVjIHRpbWVzcGVjX3RydW5jKHN0cnVjdCB0aW1lc3BlYyB0LCB1bnNpZ25lZCBncmFuKQogewpAQCAtMzE1LDcgKzMyNiw3IEBACiAgKiBUaGlzIGFsZ29yaXRobSB3YXMgZmlyc3QgcHVibGlzaGVkIGJ5IEdhdXNzIChJIHRoaW5rKS4KICAqCiAgKiBXQVJOSU5HOiB0aGlzIGZ1bmN0aW9uIHdpbGwgb3ZlcmZsb3cgb24gMjEwNi0wMi0wNyAwNjoyODoxNiBvbgotICogbWFjaGluZXMgd2VyZSBsb25nIGlzIDMyLWJpdCEgKEhvd2V2ZXIsIGFzIHRpbWVfdCBpcyBzaWduZWQsIHdlCisgKiBtYWNoaW5lcyB3aGVyZSBsb25nIGlzIDMyLWJpdCEgKEhvd2V2ZXIsIGFzIHRpbWVfdCBpcyBzaWduZWQsIHdlCiAgKiB3aWxsIGFscmVhZHkgZ2V0IHByb2JsZW1zIGF0IG90aGVyIHBsYWNlcyBvbiAyMDM4LTAxLTE5IDAzOjE0OjA4KQogICovCiB1bnNpZ25lZCBsb25nCkBAIC0zNTIsNyArMzYzLDcgQEAKICAqIG5vcm1hbGl6ZSB0byB0aGUgdGltZXNwZWMgc3RvcmFnZSBmb3JtYXQKICAqCiAgKiBOb3RlOiBUaGUgdHZfbnNlYyBwYXJ0IGlzIGFsd2F5cyBpbiB0aGUgcmFuZ2Ugb2YKLSAqIAkwIDw9IHR2X25zZWMgPCBOU0VDX1BFUl9TRUMKKyAqCTAgPD0gdHZfbnNlYyA8IE5TRUNfUEVSX1NFQwogICogRm9yIG5lZ2F0aXZlIHZhbHVlcyBvbmx5IHRoZSB0dl9zZWMgZmllbGQgaXMgbmVnYXRpdmUgIQogICovCiB2b2lkIHNldF9ub3JtYWxpemVkX3RpbWVzcGVjKHN0cnVjdCB0aW1lc3BlYyAqdHMsIHRpbWVfdCBzZWMsIGxvbmcgbnNlYykKQEAgLTQ1MywxMiArNDY0LDEzIEBACiAJLyoKIAkgKiBHZW5lcmljIGNhc2UgLSBtdWx0aXBseSwgcm91bmQgYW5kIGRpdmlkZS4gQnV0IGZpcnN0CiAJICogY2hlY2sgdGhhdCBpZiB3ZSBhcmUgZG9pbmcgYSBuZXQgbXVsdGlwbGljYXRpb24sIHRoYXQKLQkgKiB3ZSB3b3VsZG50IG92ZXJmbG93OgorCSAqIHdlIHdvdWxkbid0IG92ZXJmbG93OgogCSAqLwogCWlmIChIWiA+IE1TRUNfUEVSX1NFQyAmJiBtID4gamlmZmllc190b19tc2VjcyhNQVhfSklGRllfT0ZGU0VUKSkKIAkJcmV0dXJuIE1BWF9KSUZGWV9PRkZTRVQ7CiAKLQlyZXR1cm4gKG0gKiBIWiArIE1TRUNfUEVSX1NFQyAtIDEpIC8gTVNFQ19QRVJfU0VDOworCXJldHVybiAoKHU2NClNU0VDX1RPX0haX01VTDMyICogbSArIE1TRUNfVE9fSFpfQURKMzIpCisJCT4+IE1TRUNfVE9fSFpfU0hSMzI7CiAjZW5kaWYKIH0KIEVYUE9SVF9TWU1CT0wobXNlY3NfdG9famlmZmllcyk7CkBAIC00NzIsNyArNDg0LDggQEAKICNlbGlmIEhaID4gVVNFQ19QRVJfU0VDICYmICEoSFogJSBVU0VDX1BFUl9TRUMpCiAJcmV0dXJuIHUgKiAoSFogLyBVU0VDX1BFUl9TRUMpOwogI2Vsc2UKLQlyZXR1cm4gKHUgKiBIWiArIFVTRUNfUEVSX1NFQyAtIDEpIC8gVVNFQ19QRVJfU0VDOworCXJldHVybiAoKHU2NClVU0VDX1RPX0haX01VTDMyICogdSArIFVTRUNfVE9fSFpfQURKMzIpCisJCT4+IFVTRUNfVE9fSFpfU0hSMzI7CiAjZW5kaWYKIH0KIEVYUE9SVF9TWU1CT0wodXNlY3NfdG9famlmZmllcyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9jbG9ja2V2ZW50cy5jIGIva2VybmVsL3RpbWUvY2xvY2tldmVudHMuYwppbmRleCAzZTU5ZmNlLi4zZDFlM2UxIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9jbG9ja2V2ZW50cy5jCisrKyBiL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMKQEAgLTEzMyw3ICsxMzMsNyBAQAogfQogCiAvKgotICogQ2FsbGVkIGFmdGVyIGEgbm90aWZ5IGFkZCB0byBtYWtlIGRldmljZXMgYXZhaWxibGUgd2hpY2ggd2VyZQorICogQ2FsbGVkIGFmdGVyIGEgbm90aWZ5IGFkZCB0byBtYWtlIGRldmljZXMgYXZhaWxhYmxlIHdoaWNoIHdlcmUKICAqIHJlbGVhc2VkIGZyb20gdGhlIG5vdGlmaWVyIGNhbGwuCiAgKi8KIHN0YXRpYyB2b2lkIGNsb2NrZXZlbnRzX25vdGlmeV9yZWxlYXNlZCh2b2lkKQpAQCAtMjE4LDYgKzIxOCw4IEBACiAgKi8KIHZvaWQgY2xvY2tldmVudHNfbm90aWZ5KHVuc2lnbmVkIGxvbmcgcmVhc29uLCB2b2lkICphcmcpCiB7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKnRtcDsKKwogCXNwaW5fbG9jaygmY2xvY2tldmVudHNfbG9jayk7CiAJY2xvY2tldmVudHNfZG9fbm90aWZ5KHJlYXNvbiwgYXJnKTsKIApAQCAtMjI3LDEzICsyMjksOCBAQAogCQkgKiBVbnJlZ2lzdGVyIHRoZSBjbG9jayBldmVudCBkZXZpY2VzIHdoaWNoIHdlcmUKIAkJICogcmVsZWFzZWQgZnJvbSB0aGUgdXNlcnMgaW4gdGhlIG5vdGlmeSBjaGFpbi4KIAkJICovCi0JCXdoaWxlICghbGlzdF9lbXB0eSgmY2xvY2tldmVudHNfcmVsZWFzZWQpKSB7Ci0JCQlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXY7Ci0KLQkJCWRldiA9IGxpc3RfZW50cnkoY2xvY2tldmVudHNfcmVsZWFzZWQubmV4dCwKLQkJCQkJIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UsIGxpc3QpOwotCQkJbGlzdF9kZWwoJmRldi0+bGlzdCk7Ci0JCX0KKwkJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIHRtcCwgJmNsb2NrZXZlbnRzX3JlbGVhc2VkKQorCQkJbGlzdF9kZWwobm9kZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvY2xvY2tzb3VyY2UuYyBiL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMKaW5kZXggODFhZmIzOS4uNTQ4YzQzNiAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvY2xvY2tzb3VyY2UuYworKysgYi9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jCkBAIC05MSw3ICs5MSw2IEBACiAJICAgICAgIGNzLT5uYW1lLCBkZWx0YSk7CiAJY3MtPmZsYWdzICY9IH4oQ0xPQ0tfU09VUkNFX1ZBTElEX0ZPUl9IUkVTIHwgQ0xPQ0tfU09VUkNFX1dBVENIRE9HKTsKIAljbG9ja3NvdXJjZV9jaGFuZ2VfcmF0aW5nKGNzLCAwKTsKLQljcy0+ZmxhZ3MgJj0gfkNMT0NLX1NPVVJDRV9XQVRDSERPRzsKIAlsaXN0X2RlbCgmY3MtPndkX2xpc3QpOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aWNrLXNjaGVkLmMgYi9rZXJuZWwvdGltZS90aWNrLXNjaGVkLmMKaW5kZXggODgyNjdmMC4uZmE5YmI3MyAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGljay1zY2hlZC5jCisrKyBiL2tlcm5lbC90aW1lL3RpY2stc2NoZWQuYwpAQCAtNjgxLDcgKzY4MSw3IEBACiAJaWYgKHRzLT5ub2h6X21vZGUgIT0gTk9IWl9NT0RFX0lOQUNUSVZFKQogCQlyZXR1cm4gMDsKIAotCWlmICghdGltZWtlZXBpbmdfaXNfY29udGludW91cygpIHx8ICF0aWNrX2lzX29uZXNob3RfYXZhaWxhYmxlKCkpCisJaWYgKCF0aW1la2VlcGluZ192YWxpZF9mb3JfaHJlcygpIHx8ICF0aWNrX2lzX29uZXNob3RfYXZhaWxhYmxlKCkpCiAJCXJldHVybiAwOwogCiAJaWYgKCFhbGxvd19ub2h6KQpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYyBiL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKaW5kZXggY2Q1ZGJjNC4uMWFmOWZiMCAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYworKysgYi9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jCkBAIC0yMDEsOSArMjAxLDkgQEAKICNlbmRpZgogCiAvKioKLSAqIHRpbWVrZWVwaW5nX2lzX2NvbnRpbnVvdXMgLSBjaGVjayB0byBzZWUgaWYgdGltZWtlZXBpbmcgaXMgZnJlZSBydW5uaW5nCisgKiB0aW1la2VlcGluZ192YWxpZF9mb3JfaHJlcyAtIENoZWNrIGlmIHRpbWVrZWVwaW5nIGlzIHN1aXRhYmxlIGZvciBocmVzCiAgKi8KLWludCB0aW1la2VlcGluZ19pc19jb250aW51b3VzKHZvaWQpCitpbnQgdGltZWtlZXBpbmdfdmFsaWRfZm9yX2hyZXModm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHNlcTsKIAlpbnQgcmV0OwpAQCAtMzY0LDcgKzM2NCw3IEBACiAJICogd2l0aCBsb3NpbmcgdG9vIG1hbnkgdGlja3MsIG90aGVyd2lzZSB3ZSB3b3VsZCBvdmVyYWRqdXN0IGFuZAogCSAqIHByb2R1Y2UgYW4gZXZlbiBsYXJnZXIgZXJyb3IuICBUaGUgc21hbGxlciB0aGUgYWRqdXN0bWVudCB0aGUKIAkgKiBmYXN0ZXIgd2UgdHJ5IHRvIGFkanVzdCBmb3IgaXQsIGFzIGxvc3QgdGlja3MgY2FuIGRvIGxlc3MgaGFybQotCSAqIGhlcmUuICBUaGlzIGlzIHR1bmVkIHNvIHRoYXQgYW4gZXJyb3Igb2YgYWJvdXQgMSBtc2VjIGlzIGFkdXN0ZWQKKwkgKiBoZXJlLiAgVGhpcyBpcyB0dW5lZCBzbyB0aGF0IGFuIGVycm9yIG9mIGFib3V0IDEgbXNlYyBpcyBhZGp1c3RlZAogCSAqIHdpdGhpbiBhYm91dCAxIHNlYyAob3IgMl4yMCBuc2VjIGluIDJeU0hJRlRfSFogdGlja3MpLgogCSAqLwogCWVycm9yMiA9IGNsb2NrLT5lcnJvciA+PiAoVElDS19MRU5HVEhfU0hJRlQgKyAyMiAtIDIgKiBTSElGVF9IWik7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZWNvbnN0LnBsIGIva2VybmVsL3RpbWVjb25zdC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmIxMjg3Ci0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3RpbWVjb25zdC5wbApAQCAtMCwwICsxLDQwMiBAQAorIyEvdXNyL2Jpbi9wZXJsCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCisjICAgQ29weXJpZ2h0IDIwMDcgclBhdGgsIEluYy4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisjCisjICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisjICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb3IgKGF0IHlvdXIKKyMgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMKKworIworIyBVc2FnZTogdGltZWNvbnN0LnBsIEhaID4gdGltZWNvbnN0LmgKKyMKKworIyBQcmVjb21wdXRlZCB2YWx1ZXMgZm9yIHN5c3RlbXMgd2l0aG91dCBNYXRoOjpCaWdJbnQKKyMgR2VuZXJhdGVkIGJ5OgorIyB0aW1lY29uc3QucGwgLS1jYW4gMjQgMzIgNDggNjQgMTAwIDEyMiAxMjggMjAwIDI1MCAyNTYgMzAwIDUxMiAxMDAwIDEwMjQgMTIwMAorJWNhbm5lZF92YWx1ZXMgPSAoCisJMjQgPT4gWworCQknMHhhNmFhYWFhYicsJzB4MmFhYWFhYScsMjYsCisJCScweGE2YWFhYWFhYWFhYWFhYWInLCcweDJhYWFhYWFhYWFhYWFhYScsNTgsCisJCTEyNSwzLAorCQknMHhjNDliYTVlNCcsJzB4MWZiZTc2YzhiNCcsMzcsCisJCScweGM0OWJhNWUzNTNmN2NlZGEnLCcweDFmYmU3NmM4YjQzOTU4MTA2MicsNjksCisJCTMsMTI1LAorCQknMHhhMmMyYWFhYicsJzB4YWFhYScsMTYsCisJCScweGEyYzJhYWFhYWFhYWFhYWInLCcweGFhYWFhYWFhYWFhYScsNDgsCisJCTEyNTAwMCwzLAorCQknMHhjOTUzOWI4OScsJzB4N2ZmZmJjZTQyMTdkJyw0NywKKwkJJzB4Yzk1MzliODg4NzIyOWU5MScsJzB4N2ZmZmJjZTQyMTdkMjg0OWNiMjUnLDc5LAorCQkzLDEyNTAwMCwKKwldLCAzMiA9PiBbCisJCScweGZhMDAwMDAwJywnMHg2MDAwMDAwJywyNywKKwkJJzB4ZmEwMDAwMDAwMDAwMDAwMCcsJzB4NjAwMDAwMDAwMDAwMDAwJyw1OSwKKwkJMTI1LDQsCisJCScweDgzMTI2ZTk4JywnMHhmZGYzYjY0NWEnLDM2LAorCQknMHg4MzEyNmU5NzhkNGZkZjNjJywnMHhmZGYzYjY0NWExY2FjMDgzMScsNjgsCisJCTQsMTI1LAorCQknMHhmNDI0MDAwMCcsJzB4MCcsMTcsCisJCScweGY0MjQwMDAwMDAwMDAwMDAnLCcweDAnLDQ5LAorCQkzMTI1MCwxLAorCQknMHg4NjM3YmQwNicsJzB4M2ZmZjc5Yzg0MmZhJyw0NiwKKwkJJzB4ODYzN2JkMDVhZjZjNjliNicsJzB4M2ZmZjc5Yzg0MmZhNTA5Mzk2NGEnLDc4LAorCQkxLDMxMjUwLAorCV0sIDQ4ID0+IFsKKwkJJzB4YTZhYWFhYWInLCcweDZhYWFhYWEnLDI3LAorCQknMHhhNmFhYWFhYWFhYWFhYWFiJywnMHg2YWFhYWFhYWFhYWFhYWEnLDU5LAorCQkxMjUsNiwKKwkJJzB4YzQ5YmE1ZTQnLCcweGZkZjNiNjQ1YScsMzYsCisJCScweGM0OWJhNWUzNTNmN2NlZGEnLCcweGZkZjNiNjQ1YTFjYWMwODMxJyw2OCwKKwkJNiwxMjUsCisJCScweGEyYzJhYWFiJywnMHgxNTU1NScsMTcsCisJCScweGEyYzJhYWFhYWFhYWFhYWInLCcweDE1NTU1NTU1NTU1NTUnLDQ5LAorCQk2MjUwMCwzLAorCQknMHhjOTUzOWI4OScsJzB4M2ZmZmJjZTQyMTdkJyw0NiwKKwkJJzB4Yzk1MzliODg4NzIyOWU5MScsJzB4M2ZmZmJjZTQyMTdkMjg0OWNiMjUnLDc4LAorCQkzLDYyNTAwLAorCV0sIDY0ID0+IFsKKwkJJzB4ZmEwMDAwMDAnLCcweGUwMDAwMDAnLDI4LAorCQknMHhmYTAwMDAwMDAwMDAwMDAwJywnMHhlMDAwMDAwMDAwMDAwMDAnLDYwLAorCQkxMjUsOCwKKwkJJzB4ODMxMjZlOTgnLCcweDdlZjlkYjIyZCcsMzUsCisJCScweDgzMTI2ZTk3OGQ0ZmRmM2MnLCcweDdlZjlkYjIyZDBlNTYwNDE4Jyw2NywKKwkJOCwxMjUsCisJCScweGY0MjQwMDAwJywnMHgwJywxOCwKKwkJJzB4ZjQyNDAwMDAwMDAwMDAwMCcsJzB4MCcsNTAsCisJCTE1NjI1LDEsCisJCScweDg2MzdiZDA2JywnMHgxZmZmNzljODQyZmEnLDQ1LAorCQknMHg4NjM3YmQwNWFmNmM2OWI2JywnMHgxZmZmNzljODQyZmE1MDkzOTY0YScsNzcsCisJCTEsMTU2MjUsCisJXSwgMTAwID0+IFsKKwkJJzB4YTAwMDAwMDAnLCcweDAnLDI4LAorCQknMHhhMDAwMDAwMDAwMDAwMDAwJywnMHgwJyw2MCwKKwkJMTAsMSwKKwkJJzB4Y2NjY2NjY2QnLCcweDczMzMzMzMzMycsMzUsCisJCScweGNjY2NjY2NjY2NjY2NjY2QnLCcweDczMzMzMzMzMzMzMzMzMzMzJyw2NywKKwkJMSwxMCwKKwkJJzB4OWM0MDAwMDAnLCcweDAnLDE4LAorCQknMHg5YzQwMDAwMDAwMDAwMDAwJywnMHgwJyw1MCwKKwkJMTAwMDAsMSwKKwkJJzB4ZDFiNzE3NTknLCcweDFmZmYyZTQ4ZThhNycsNDUsCisJCScweGQxYjcxNzU4ZTIxOTY1MmMnLCcweDFmZmYyZTQ4ZThhNzFkZTY5YWQ0Jyw3NywKKwkJMSwxMDAwMCwKKwldLCAxMjIgPT4gWworCQknMHg4MzI1YzUzZicsJzB4ZmJjZGEzYScsMjgsCisJCScweDgzMjVjNTNlZjM2OGViMDUnLCcweGZiY2RhM2FjMTBjOTcxNCcsNjAsCisJCTUwMCw2MSwKKwkJJzB4ZjlkYjIyZDEnLCcweDdmYmU3NmM4YicsMzUsCisJCScweGY5ZGIyMmQwZTU2MDQxOGEnLCcweDdmYmU3NmM4YjQzOTU4MTA2Jyw2NywKKwkJNjEsNTAwLAorCQknMHg4MDEyZTJhMCcsJzB4M2VmMzYnLDE4LAorCQknMHg4MDEyZTI5Zjc5YjQ3NTgzJywnMHgzZWYzNjhlYjA0MzI1Jyw1MCwKKwkJNTAwMDAwLDYxLAorCQknMHhmZmRhNDA1MycsJzB4MWZmZmZiY2U0MjE3Jyw0NSwKKwkJJzB4ZmZkYTQwNTJkNjY2YTk4MycsJzB4MWZmZmZiY2U0MjE3ZDI4NDljYjInLDc3LAorCQk2MSw1MDAwMDAsCisJXSwgMTI4ID0+IFsKKwkJJzB4ZmEwMDAwMDAnLCcweDFlMDAwMDAwJywyOSwKKwkJJzB4ZmEwMDAwMDAwMDAwMDAwMCcsJzB4MWUwMDAwMDAwMDAwMDAwMCcsNjEsCisJCTEyNSwxNiwKKwkJJzB4ODMxMjZlOTgnLCcweDNmN2NlZDkxNicsMzQsCisJCScweDgzMTI2ZTk3OGQ0ZmRmM2MnLCcweDNmN2NlZDkxNjg3MmIwMjBjJyw2NiwKKwkJMTYsMTI1LAorCQknMHhmNDI0MDAwMCcsJzB4NDAwMDAnLDE5LAorCQknMHhmNDI0MDAwMDAwMDAwMDAwJywnMHg0MDAwMDAwMDAwMDAwJyw1MSwKKwkJMTU2MjUsMiwKKwkJJzB4ODYzN2JkMDYnLCcweGZmZmJjZTQyMTdkJyw0NCwKKwkJJzB4ODYzN2JkMDVhZjZjNjliNicsJzB4ZmZmYmNlNDIxN2QyODQ5Y2IyNScsNzYsCisJCTIsMTU2MjUsCisJXSwgMjAwID0+IFsKKwkJJzB4YTAwMDAwMDAnLCcweDAnLDI5LAorCQknMHhhMDAwMDAwMDAwMDAwMDAwJywnMHgwJyw2MSwKKwkJNSwxLAorCQknMHhjY2NjY2NjZCcsJzB4MzMzMzMzMzMzJywzNCwKKwkJJzB4Y2NjY2NjY2NjY2NjY2NjZCcsJzB4MzMzMzMzMzMzMzMzMzMzMzMnLDY2LAorCQkxLDUsCisJCScweDljNDAwMDAwJywnMHgwJywxOSwKKwkJJzB4OWM0MDAwMDAwMDAwMDAwMCcsJzB4MCcsNTEsCisJCTUwMDAsMSwKKwkJJzB4ZDFiNzE3NTknLCcweGZmZjJlNDhlOGE3Jyw0NCwKKwkJJzB4ZDFiNzE3NThlMjE5NjUyYycsJzB4ZmZmMmU0OGU4YTcxZGU2OWFkNCcsNzYsCisJCTEsNTAwMCwKKwldLCAyNTAgPT4gWworCQknMHg4MDAwMDAwMCcsJzB4MCcsMjksCisJCScweDgwMDAwMDAwMDAwMDAwMDAnLCcweDAnLDYxLAorCQk0LDEsCisJCScweDgwMDAwMDAwJywnMHgxODAwMDAwMDAnLDMzLAorCQknMHg4MDAwMDAwMDAwMDAwMDAwJywnMHgxODAwMDAwMDAwMDAwMDAwMCcsNjUsCisJCTEsNCwKKwkJJzB4ZmEwMDAwMDAnLCcweDAnLDIwLAorCQknMHhmYTAwMDAwMDAwMDAwMDAwJywnMHgwJyw1MiwKKwkJNDAwMCwxLAorCQknMHg4MzEyNmU5OCcsJzB4N2ZmN2NlZDkxNjgnLDQzLAorCQknMHg4MzEyNmU5NzhkNGZkZjNjJywnMHg3ZmY3Y2VkOTE2ODcyYjAyMGM0Jyw3NSwKKwkJMSw0MDAwLAorCV0sIDI1NiA9PiBbCisJCScweGZhMDAwMDAwJywnMHgzZTAwMDAwMCcsMzAsCisJCScweGZhMDAwMDAwMDAwMDAwMDAnLCcweDNlMDAwMDAwMDAwMDAwMDAnLDYyLAorCQkxMjUsMzIsCisJCScweDgzMTI2ZTk4JywnMHgxZmJlNzZjOGInLDMzLAorCQknMHg4MzEyNmU5NzhkNGZkZjNjJywnMHgxZmJlNzZjOGI0Mzk1ODEwNicsNjUsCisJCTMyLDEyNSwKKwkJJzB4ZjQyNDAwMDAnLCcweGMwMDAwJywyMCwKKwkJJzB4ZjQyNDAwMDAwMDAwMDAwMCcsJzB4YzAwMDAwMDAwMDAwMCcsNTIsCisJCTE1NjI1LDQsCisJCScweDg2MzdiZDA2JywnMHg3ZmZkZTcyMTBiZScsNDMsCisJCScweDg2MzdiZDA1YWY2YzY5YjYnLCcweDdmZmRlNzIxMGJlOTQyNGU1OTInLDc1LAorCQk0LDE1NjI1LAorCV0sIDMwMCA9PiBbCisJCScweGQ1NTU1NTU2JywnMHgyYWFhYWFhYScsMzAsCisJCScweGQ1NTU1NTU1NTU1NTU1NTYnLCcweDJhYWFhYWFhYWFhYWFhYWEnLDYyLAorCQkxMCwzLAorCQknMHg5OTk5OTk5YScsJzB4MWNjY2NjY2NjJywzMywKKwkJJzB4OTk5OTk5OTk5OTk5OTk5YScsJzB4MWNjY2NjY2NjY2NjY2NjY2MnLDY1LAorCQkzLDEwLAorCQknMHhkMDU1NTU1NicsJzB4YWFhYWEnLDIwLAorCQknMHhkMDU1NTU1NTU1NTU1NTU2JywnMHhhYWFhYWFhYWFhYWFhJyw1MiwKKwkJMTAwMDAsMywKKwkJJzB4OWQ0OTUxODMnLCcweDdmZmNiOTIzYTI5Jyw0MywKKwkJJzB4OWQ0OTUxODJhOTkzMGJlMScsJzB4N2ZmY2I5MjNhMjljNzc5YTZiNScsNzUsCisJCTMsMTAwMDAsCisJXSwgNTEyID0+IFsKKwkJJzB4ZmEwMDAwMDAnLCcweDdlMDAwMDAwJywzMSwKKwkJJzB4ZmEwMDAwMDAwMDAwMDAwMCcsJzB4N2UwMDAwMDAwMDAwMDAwMCcsNjMsCisJCTEyNSw2NCwKKwkJJzB4ODMxMjZlOTgnLCcweGZkZjNiNjQ1JywzMiwKKwkJJzB4ODMxMjZlOTc4ZDRmZGYzYycsJzB4ZmRmM2I2NDVhMWNhYzA4MycsNjQsCisJCTY0LDEyNSwKKwkJJzB4ZjQyNDAwMDAnLCcweDFjMDAwMCcsMjEsCisJCScweGY0MjQwMDAwMDAwMDAwMDAnLCcweDFjMDAwMDAwMDAwMDAwJyw1MywKKwkJMTU2MjUsOCwKKwkJJzB4ODYzN2JkMDYnLCcweDNmZmVmMzkwODVmJyw0MiwKKwkJJzB4ODYzN2JkMDVhZjZjNjliNicsJzB4M2ZmZWYzOTA4NWY0YTEyNzJjOScsNzQsCisJCTgsMTU2MjUsCisJXSwgMTAwMCA9PiBbCisJCScweDgwMDAwMDAwJywnMHgwJywzMSwKKwkJJzB4ODAwMDAwMDAwMDAwMDAwMCcsJzB4MCcsNjMsCisJCTEsMSwKKwkJJzB4ODAwMDAwMDAnLCcweDAnLDMxLAorCQknMHg4MDAwMDAwMDAwMDAwMDAwJywnMHgwJyw2MywKKwkJMSwxLAorCQknMHhmYTAwMDAwMCcsJzB4MCcsMjIsCisJCScweGZhMDAwMDAwMDAwMDAwMDAnLCcweDAnLDU0LAorCQkxMDAwLDEsCisJCScweDgzMTI2ZTk4JywnMHgxZmY3Y2VkOTE2OCcsNDEsCisJCScweDgzMTI2ZTk3OGQ0ZmRmM2MnLCcweDFmZjdjZWQ5MTY4NzJiMDIwYzQnLDczLAorCQkxLDEwMDAsCisJXSwgMTAyNCA9PiBbCisJCScweGZhMDAwMDAwJywnMHhmZTAwMDAwMCcsMzIsCisJCScweGZhMDAwMDAwMDAwMDAwMDAnLCcweGZlMDAwMDAwMDAwMDAwMDAnLDY0LAorCQkxMjUsMTI4LAorCQknMHg4MzEyNmU5OCcsJzB4N2VmOWRiMjInLDMxLAorCQknMHg4MzEyNmU5NzhkNGZkZjNjJywnMHg3ZWY5ZGIyMmQwZTU2MDQxJyw2MywKKwkJMTI4LDEyNSwKKwkJJzB4ZjQyNDAwMDAnLCcweDNjMDAwMCcsMjIsCisJCScweGY0MjQwMDAwMDAwMDAwMDAnLCcweDNjMDAwMDAwMDAwMDAwJyw1NCwKKwkJMTU2MjUsMTYsCisJCScweDg2MzdiZDA2JywnMHgxZmZmNzljODQyZicsNDEsCisJCScweDg2MzdiZDA1YWY2YzY5YjYnLCcweDFmZmY3OWM4NDJmYTUwOTM5NjQnLDczLAorCQkxNiwxNTYyNSwKKwldLCAxMjAwID0+IFsKKwkJJzB4ZDU1NTU1NTYnLCcweGQ1NTU1NTU1JywzMiwKKwkJJzB4ZDU1NTU1NTU1NTU1NTU1NicsJzB4ZDU1NTU1NTU1NTU1NTU1NScsNjQsCisJCTUsNiwKKwkJJzB4OTk5OTk5OWEnLCcweDY2NjY2NjY2JywzMSwKKwkJJzB4OTk5OTk5OTk5OTk5OTk5YScsJzB4NjY2NjY2NjY2NjY2NjY2NicsNjMsCisJCTYsNSwKKwkJJzB4ZDA1NTU1NTYnLCcweDJhYWFhYScsMjIsCisJCScweGQwNTU1NTU1NTU1NTU1NTYnLCcweDJhYWFhYWFhYWFhYWFhJyw1NCwKKwkJMjUwMCwzLAorCQknMHg5ZDQ5NTE4MycsJzB4MWZmY2I5MjNhMjknLDQxLAorCQknMHg5ZDQ5NTE4MmE5OTMwYmUxJywnMHgxZmZjYjkyM2EyOWM3NzlhNmI1Jyw3MywKKwkJMywyNTAwLAorCV0KKyk7CisKKyRoYXNfYmlnaW50ID0gZXZhbCAndXNlIE1hdGg6OkJpZ0ludCBxdyhiZ2NkKTsgMTsnOworCitzdWIgYmludCgkKQoreworCW15KCR4KSA9IEBfOworCXJldHVybiBNYXRoOjpCaWdJbnQtPm5ldygkeCk7Cit9CisKKyMKKyMgQ29uc3RhbnRzIGZvciBkaXZpc2lvbiBieSByZWNpcHJvY2FsIG11bHRpcGxpY2F0aW9uLgorIyAoYml0cywgbnVtZXJhdG9yLCBkZW5vbWluYXRvcikKKyMKK3N1YiBmbXVsKCQkJCkKK3sKKwlteSAoJGIsJG4sJGQpID0gQF87CisKKwkkbiA9IGJpbnQoJG4pOworCSRkID0gYmludCgkZCk7CisKKwlyZXR1cm4gc2NhbGFyICgoJG4gPDwgJGIpKyRkLWJpbnQoMSkpLyRkOworfQorCitzdWIgZmFkaigkJCQpCit7CisJbXkoJGIsJG4sJGQpID0gQF87CisKKwkkbiA9IGJpbnQoJG4pOworCSRkID0gYmludCgkZCk7CisKKwkkZCA9ICRkL2JnY2QoJG4sICRkKTsKKwlyZXR1cm4gc2NhbGFyICgoJGQtYmludCgxKSkgPDwgJGIpLyRkOworfQorCitzdWIgZm11bHMoJCQkKSB7CisJbXkoJGIsJG4sJGQpID0gQF87CisJbXkoJHMsJG0pOworCW15KCR0aHJlcykgPSBiaW50KDEpIDw8ICgkYi0xKTsKKworCSRuID0gYmludCgkbik7CisJJGQgPSBiaW50KCRkKTsKKworCWZvciAoJHMgPSAwOyAxOyAkcysrKSB7CisJCSRtID0gZm11bCgkcywkbiwkZCk7CisJCXJldHVybiAkcyBpZiAoJG0gPj0gJHRocmVzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyMgUHJvdmlkZXMgbXVsLCBhZGosIGFuZCBzaHIgZmFjdG9ycyBmb3IgYSBzcGVjaWZpYworIyAoYml0LCB0aW1lLCBoeikgY29tYmluYXRpb24KK3N1YiBtdWxhZGooJCQkKSB7CisJbXkoJGIsICR0LCAkaHopID0gQF87CisJbXkgJHMgPSBmbXVscygkYiwgJHQsICRoeik7CisJbXkgJG0gPSBmbXVsKCRzLCAkdCwgJGh6KTsKKwlteSAkYSA9IGZhZGooJHMsICR0LCAkaHopOworCXJldHVybiAoJG0tPmFzX2hleCgpLCAkYS0+YXNfaGV4KCksICRzKTsKK30KKworIyBQcm92aWRlcyBudW1lcmF0b3IsIGRlbm9taW5hdG9yIHZhbHVlcworc3ViIG51bWRlbigkJCkgeworCW15KCRuLCAkZCkgPSBAXzsKKwlteSAkZyA9IGJnY2QoJG4sICRkKTsKKwlyZXR1cm4gKCRuLyRnLCAkZC8kZyk7Cit9CisKKyMgQWxsIHZhbHVlcyBmb3IgYSBzcGVjaWZpYyAodGltZSwgaHopIGNvbWJvCitzdWIgY29udmVyc2lvbnMoJCQpIHsKKwlteSAoJHQsICRoeikgPSBAXzsKKwlteSBAdmFsID0gKCk7CisKKwkjIEhaX1RPX3h4CisJcHVzaChAdmFsLCBtdWxhZGooMzIsICR0LCAkaHopKTsKKwlwdXNoKEB2YWwsIG11bGFkaig2NCwgJHQsICRoeikpOworCXB1c2goQHZhbCwgbnVtZGVuKCR0LCAkaHopKTsKKworCSMgeHhfVE9fSFoKKwlwdXNoKEB2YWwsIG11bGFkaigzMiwgJGh6LCAkdCkpOworCXB1c2goQHZhbCwgbXVsYWRqKDY0LCAkaHosICR0KSk7CisJcHVzaChAdmFsLCBudW1kZW4oJGh6LCAkdCkpOworCisJcmV0dXJuIEB2YWw7Cit9CisKK3N1YiBjb21wdXRlX3ZhbHVlcygkKSB7CisJbXkoJGh6KSA9IEBfOworCW15IEB2YWwgPSAoKTsKKwlteSAkcywgJG0sICRhLCAkZzsKKworCWlmICghJGhhc19iaWdpbnQpIHsKKwkJZGllICIkMDogSFogPT0gJGh6IG5vdCBjYW5uZWQgYW5kICIuCisJCSAgICAiTWF0aDo6QmlnSW50IG5vdCBhdmFpbGFibGVcbiI7CisJfQorCisJIyBNU0VDIGNvbnZlcnNpb25zCisJcHVzaChAdmFsLCBjb252ZXJzaW9ucygxMDAwLCAkaHopKTsKKworCSMgVVNFQyBjb252ZXJzaW9ucworCXB1c2goQHZhbCwgY29udmVyc2lvbnMoMTAwMDAwMCwgJGh6KSk7CisKKwlyZXR1cm4gQHZhbDsKK30KKworc3ViIG91dHB1dCgkQCkKK3sKKwlteSgkaHosIEB2YWwpID0gQF87CisJbXkgJHBmeCwgJGJpdCwgJHN1ZiwgJHMsICRtLCAkYTsKKworCXByaW50ICIvKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBrZXJuZWwvdGltZWNvbnN0LnBsICovXG4iOworCXByaW50ICIvKiBDb252ZXJzaW9uIGNvbnN0YW50cyBmb3IgSFogPT0gJGh6ICovXG4iOworCXByaW50ICJcbiI7CisJcHJpbnQgIiNpZm5kZWYgS0VSTkVMX1RJTUVDT05TVF9IXG4iOworCXByaW50ICIjZGVmaW5lIEtFUk5FTF9USU1FQ09OU1RfSFxuIjsKKwlwcmludCAiXG4iOworCisJcHJpbnQgIiNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPlxuIjsKKworCXByaW50ICJcbiI7CisJcHJpbnQgIiNpZiBIWiAhPSAkaHpcbiI7CisJcHJpbnQgIiNlcnJvciBcImtlcm5lbC90aW1lY29uc3QuaCBoYXMgdGhlIHdyb25nIEhaIHZhbHVlIVwiXG4iOworCXByaW50ICIjZW5kaWZcbiI7CisJcHJpbnQgIlxuIjsKKworCWZvcmVhY2ggJHBmeCAoJ0haX1RPX01TRUMnLCdNU0VDX1RPX0haJywKKwkJICAgICAgJ1VTRUNfVE9fSFonLCdIWl9UT19VU0VDJykgeworCQlmb3JlYWNoICRiaXQgKDMyLCA2NCkgeworCQkJZm9yZWFjaCAkc3VmICgnTVVMJywgJ0FESicsICdTSFInKSB7CisJCQkJcHJpbnRmICIjZGVmaW5lICUtMjNzICVzXG4iLAorCQkJCQkiJHtwZnh9XyRzdWYkYml0Iiwgc2hpZnQoQHZhbCk7CisJCQl9CisJCX0KKwkJZm9yZWFjaCAkc3VmICgnTlVNJywgJ0RFTicpIHsKKwkJCXByaW50ZiAiI2RlZmluZSAlLTIzcyAlc1xuIiwKKwkJCQkiJHtwZnh9XyRzdWYiLCBzaGlmdChAdmFsKTsKKwkJfQorCX0KKworCXByaW50ICJcbiI7CisJcHJpbnQgIiNlbmRpZiAvKiBLRVJORUxfVElNRUNPTlNUX0ggKi9cbiI7Cit9CisKKygkaHopID0gQEFSR1Y7CisKKyMgVXNlIHRoaXMgdG8gZ2VuZXJhdGUgdGhlICVjYW5uZWRfdmFsdWVzIHN0cnVjdHVyZQoraWYgKCRoeiBlcSAnLS1jYW4nKSB7CisJc2hpZnQoQEFSR1YpOworCUBoemxpc3QgPSBzb3J0IHskYSA8PT4gJGJ9IChAQVJHVik7CisKKwlwcmludCAiIyBQcmVjb21wdXRlZCB2YWx1ZXMgZm9yIHN5c3RlbXMgd2l0aG91dCBNYXRoOjpCaWdJbnRcbiI7CisJcHJpbnQgIiMgR2VuZXJhdGVkIGJ5OlxuIjsKKwlwcmludCAiIyB0aW1lY29uc3QucGwgLS1jYW4gIiwgam9pbignICcsIEBoemxpc3QpLCAiXG4iOworCXByaW50ICJcJWNhbm5lZF92YWx1ZXMgPSAoXG4iOworCW15ICRwZiA9ICJcdCI7CisJZm9yZWFjaCAkaHogKEBoemxpc3QpIHsKKwkJbXkgQHZhbHVlcyA9IGNvbXB1dGVfdmFsdWVzKCRoeik7CisJCXByaW50ICIkcGYkaHogPT4gW1xuIjsKKwkJd2hpbGUgKHNjYWxhcihAdmFsdWVzKSkgeworCQkJbXkgJGJpdDsKKwkJCWZvcmVhY2ggJGJpdCAoMzIsIDY0KSB7CisJCQkJbXkgJG0gPSBzaGlmdChAdmFsdWVzKTsKKwkJCQlteSAkYSA9IHNoaWZ0KEB2YWx1ZXMpOworCQkJCW15ICRzID0gc2hpZnQoQHZhbHVlcyk7CisJCQkJcHJpbnQgIlx0XHRcJyIsJG0sIlwnLFwnIiwkYSwiXCcsIiwkcywiLFxuIjsKKwkJCX0KKwkJCW15ICRuID0gc2hpZnQoQHZhbHVlcyk7CisJCQlteSAkZCA9IHNoaWZ0KEB2YWx1ZXMpOworCQkJcHJpbnQgIlx0XHQiLCRuLCcsJywkZCwiLFxuIjsKKwkJfQorCQlwcmludCAiXHRdIjsKKwkJJHBmID0gJywgJzsKKwl9CisJcHJpbnQgIlxuKTtcbiI7Cit9IGVsc2UgeworCSRoeiArPSAwOwkJCSMgRm9yY2UgdG8gbnVtYmVyCisJaWYgKCRoeiA8IDEpIHsKKwkJZGllICJVc2FnZTogJDAgSFpcbiI7CisJfQorCisJQHZhbCA9IEB7JGNhbm5lZF92YWx1ZXN7JGh6fX07CisJaWYgKCFkZWZpbmVkKEB2YWwpKSB7CisJCUB2YWwgPSBjb21wdXRlX3ZhbHVlcygkaHopOworCX0KKwlvdXRwdXQoJGh6LCBAdmFsKTsKK30KK2V4aXQgMDsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lci5jIGIva2VybmVsL3RpbWVyLmMKaW5kZXggNzBiMjliNS4uOTliMDBhMiAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWVyLmMKKysrIGIva2VybmVsL3RpbWVyLmMKQEAgLTMyNyw3ICszMjcsNyBAQAogICogaW5pdF90aW1lcigpIG11c3QgYmUgZG9uZSB0byBhIHRpbWVyIHByaW9yIGNhbGxpbmcgKmFueSogb2YgdGhlCiAgKiBvdGhlciB0aW1lciBmdW5jdGlvbnMuCiAgKi8KLXZvaWQgZmFzdGNhbGwgaW5pdF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCit2b2lkIGluaXRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQogewogCXRpbWVyLT5lbnRyeS5uZXh0ID0gTlVMTDsKIAl0aW1lci0+YmFzZSA9IF9fcmF3X2dldF9jcHVfdmFyKHR2ZWNfYmFzZXMpOwpAQCAtMzM5LDcgKzMzOSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGluaXRfdGltZXIpOwogCi12b2lkIGZhc3RjYWxsIGluaXRfdGltZXJfZGVmZXJyYWJsZShzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCit2b2lkIGluaXRfdGltZXJfZGVmZXJyYWJsZShzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCiB7CiAJaW5pdF90aW1lcih0aW1lcik7CiAJdGltZXJfc2V0X2RlZmVycmFibGUodGltZXIpOwpAQCAtOTc5LDcgKzk3OSw3IEBACiAJaW50IHBpZDsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlwaWQgPSB0YXNrX3RnaWRfbnJfbnMoY3VycmVudC0+cmVhbF9wYXJlbnQsIGN1cnJlbnQtPm5zcHJveHktPnBpZF9ucyk7CisJcGlkID0gdGFza190Z2lkX3ZucihjdXJyZW50LT5yZWFsX3BhcmVudCk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlyZXR1cm4gcGlkOwpAQCAtMTA0Miw3ICsxMDQyLDcgQEAKICAqCiAgKiBJbiBhbGwgY2FzZXMgdGhlIHJldHVybiB2YWx1ZSBpcyBndWFyYW50ZWVkIHRvIGJlIG5vbi1uZWdhdGl2ZS4KICAqLwotZmFzdGNhbGwgc2lnbmVkIGxvbmcgX19zY2hlZCBzY2hlZHVsZV90aW1lb3V0KHNpZ25lZCBsb25nIHRpbWVvdXQpCitzaWduZWQgbG9uZyBfX3NjaGVkIHNjaGVkdWxlX3RpbWVvdXQoc2lnbmVkIGxvbmcgdGltZW91dCkKIHsKIAlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKIAl1bnNpZ25lZCBsb25nIGV4cGlyZTsKZGlmZiAtLWdpdCBhL2tlcm5lbC91c2VyLmMgYi9rZXJuZWwvdXNlci5jCmluZGV4IGJjMWM0OGQuLjdkNzkwMGMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC91c2VyLmMKKysrIGIva2VybmVsL3VzZXIuYwpAQCAtMTcsNiArMTcsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC91c2VyX25hbWVzcGFjZS5oPgogCitzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgaW5pdF91c2VyX25zID0geworCS5rcmVmID0geworCQkucmVmY291bnQJPSBBVE9NSUNfSU5JVCgyKSwKKwl9LAorCS5yb290X3VzZXIgPSAmcm9vdF91c2VyLAorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGluaXRfdXNlcl9ucyk7CisKIC8qCiAgKiBVSUQgdGFzayBjb3VudCBjYWNoZSwgdG8gZ2V0IGZhc3QgdXNlciBsb29rdXAgaW4gImFsbG9jX3VpZCIKICAqIHdoZW4gY2hhbmdpbmcgdXNlciBJRCdzIChpZSBzZXR1aWQoKSBhbmQgZnJpZW5kcykuCkBAIC00MjcsNiArNDM1LDcgQEAKIAlzdWlkX2tleXMoY3VycmVudCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfVVNFUl9OUwogdm9pZCByZWxlYXNlX3VpZHMoc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucykKIHsKIAlpbnQgaTsKQEAgLTQ1MSw2ICs0NjAsNyBAQAogCiAJZnJlZV91aWQobnMtPnJvb3RfdXNlcik7CiB9CisjZW5kaWYKIAogc3RhdGljIGludCBfX2luaXQgdWlkX2NhY2hlX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC91c2VyX25hbWVzcGFjZS5jIGIva2VybmVsL3VzZXJfbmFtZXNwYWNlLmMKaW5kZXggN2FmOTBmYy4uNGM5MDA2MiAxMDA2NDQKLS0tIGEva2VybmVsL3VzZXJfbmFtZXNwYWNlLmMKKysrIGIva2VybmVsL3VzZXJfbmFtZXNwYWNlLmMKQEAgLTEwLDE3ICsxMCw2IEBACiAjaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzZXJfbmFtZXNwYWNlLmg+CiAKLXN0cnVjdCB1c2VyX25hbWVzcGFjZSBpbml0X3VzZXJfbnMgPSB7Ci0JLmtyZWYgPSB7Ci0JCS5yZWZjb3VudAk9IEFUT01JQ19JTklUKDIpLAotCX0sCi0JLnJvb3RfdXNlciA9ICZyb290X3VzZXIsCi19OwotCi1FWFBPUlRfU1lNQk9MX0dQTChpbml0X3VzZXJfbnMpOwotCi0jaWZkZWYgQ09ORklHX1VTRVJfTlMKLQogLyoKICAqIENsb25lIGEgbmV3IG5zIGNvcHlpbmcgYW4gb3JpZ2luYWwgdXNlciBucywgc2V0dGluZyByZWZjb3VudCB0byAxCiAgKiBAb2xkX25zOiBuYW1lc3BhY2UgdG8gY2xvbmUKQEAgLTg0LDUgKzczLDMgQEAKIAlyZWxlYXNlX3VpZHMobnMpOwogCWtmcmVlKG5zKTsKIH0KLQotI2VuZGlmIC8qIENPTkZJR19VU0VSX05TICovCmRpZmYgLS1naXQgYS9rZXJuZWwvd2FpdC5jIGIva2VybmVsL3dhaXQuYwppbmRleCBmOTg3Njg4Li5jMjc1YzU2IDEwMDY0NAotLS0gYS9rZXJuZWwvd2FpdC5jCisrKyBiL2tlcm5lbC93YWl0LmMKQEAgLTE4LDcgKzE4LDcgQEAKIAogRVhQT1JUX1NZTUJPTChpbml0X3dhaXRxdWV1ZV9oZWFkKTsKIAotdm9pZCBmYXN0Y2FsbCBhZGRfd2FpdF9xdWV1ZSh3YWl0X3F1ZXVlX2hlYWRfdCAqcSwgd2FpdF9xdWV1ZV90ICp3YWl0KQordm9pZCBhZGRfd2FpdF9xdWV1ZSh3YWl0X3F1ZXVlX2hlYWRfdCAqcSwgd2FpdF9xdWV1ZV90ICp3YWl0KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTI5LDcgKzI5LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woYWRkX3dhaXRfcXVldWUpOwogCi12b2lkIGZhc3RjYWxsIGFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZSh3YWl0X3F1ZXVlX2hlYWRfdCAqcSwgd2FpdF9xdWV1ZV90ICp3YWl0KQordm9pZCBhZGRfd2FpdF9xdWV1ZV9leGNsdXNpdmUod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHdhaXRfcXVldWVfdCAqd2FpdCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC00MCw3ICs0MCw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZSk7CiAKLXZvaWQgZmFzdGNhbGwgcmVtb3ZlX3dhaXRfcXVldWUod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHdhaXRfcXVldWVfdCAqd2FpdCkKK3ZvaWQgcmVtb3ZlX3dhaXRfcXVldWUod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHdhaXRfcXVldWVfdCAqd2FpdCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC02Myw3ICs2Myw3IEBACiAgKiBzdG9wcyB0aGVtIGZyb20gYmxlZWRpbmcgb3V0IC0gaXQgd291bGQgc3RpbGwgYWxsb3cgc3Vic2VxdWVudAogICogbG9hZHMgdG8gbW92ZSBpbnRvIHRoZSBjcml0aWNhbCByZWdpb24pLgogICovCi12b2lkIGZhc3RjYWxsCit2b2lkCiBwcmVwYXJlX3RvX3dhaXQod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHdhaXRfcXVldWVfdCAqd2FpdCwgaW50IHN0YXRlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC04Miw3ICs4Miw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKHByZXBhcmVfdG9fd2FpdCk7CiAKLXZvaWQgZmFzdGNhbGwKK3ZvaWQKIHByZXBhcmVfdG9fd2FpdF9leGNsdXNpdmUod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHdhaXRfcXVldWVfdCAqd2FpdCwgaW50IHN0YXRlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xMDEsNyArMTAxLDcgQEAKIH0KIEVYUE9SVF9TWU1CT0wocHJlcGFyZV90b193YWl0X2V4Y2x1c2l2ZSk7CiAKLXZvaWQgZmFzdGNhbGwgZmluaXNoX3dhaXQod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHdhaXRfcXVldWVfdCAqd2FpdCkKK3ZvaWQgZmluaXNoX3dhaXQod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHdhaXRfcXVldWVfdCAqd2FpdCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xNTcsNyArMTU3LDcgQEAKICAqIHdhaXRpbmcsIHRoZSBhY3Rpb25zIG9mIF9fd2FpdF9vbl9iaXQoKSBhbmQgX193YWl0X29uX2JpdF9sb2NrKCkgYXJlCiAgKiBwZXJtaXR0ZWQgcmV0dXJuIGNvZGVzLiBOb256ZXJvIHJldHVybiBjb2RlcyBoYWx0IHdhaXRpbmcgYW5kIHJldHVybi4KICAqLwotaW50IF9fc2NoZWQgZmFzdGNhbGwKK2ludCBfX3NjaGVkCiBfX3dhaXRfb25fYml0KHdhaXRfcXVldWVfaGVhZF90ICp3cSwgc3RydWN0IHdhaXRfYml0X3F1ZXVlICpxLAogCQkJaW50ICgqYWN0aW9uKSh2b2lkICopLCB1bnNpZ25lZCBtb2RlKQogewpAQCAtMTczLDcgKzE3Myw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKF9fd2FpdF9vbl9iaXQpOwogCi1pbnQgX19zY2hlZCBmYXN0Y2FsbCBvdXRfb2ZfbGluZV93YWl0X29uX2JpdCh2b2lkICp3b3JkLCBpbnQgYml0LAoraW50IF9fc2NoZWQgb3V0X29mX2xpbmVfd2FpdF9vbl9iaXQodm9pZCAqd29yZCwgaW50IGJpdCwKIAkJCQkJaW50ICgqYWN0aW9uKSh2b2lkICopLCB1bnNpZ25lZCBtb2RlKQogewogCXdhaXRfcXVldWVfaGVhZF90ICp3cSA9IGJpdF93YWl0cXVldWUod29yZCwgYml0KTsKQEAgLTE4Myw3ICsxODMsNyBAQAogfQogRVhQT1JUX1NZTUJPTChvdXRfb2ZfbGluZV93YWl0X29uX2JpdCk7CiAKLWludCBfX3NjaGVkIGZhc3RjYWxsCitpbnQgX19zY2hlZAogX193YWl0X29uX2JpdF9sb2NrKHdhaXRfcXVldWVfaGVhZF90ICp3cSwgc3RydWN0IHdhaXRfYml0X3F1ZXVlICpxLAogCQkJaW50ICgqYWN0aW9uKSh2b2lkICopLCB1bnNpZ25lZCBtb2RlKQogewpAQCAtMjAxLDcgKzIwMSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKF9fd2FpdF9vbl9iaXRfbG9jayk7CiAKLWludCBfX3NjaGVkIGZhc3RjYWxsIG91dF9vZl9saW5lX3dhaXRfb25fYml0X2xvY2sodm9pZCAqd29yZCwgaW50IGJpdCwKK2ludCBfX3NjaGVkIG91dF9vZl9saW5lX3dhaXRfb25fYml0X2xvY2sodm9pZCAqd29yZCwgaW50IGJpdCwKIAkJCQkJaW50ICgqYWN0aW9uKSh2b2lkICopLCB1bnNpZ25lZCBtb2RlKQogewogCXdhaXRfcXVldWVfaGVhZF90ICp3cSA9IGJpdF93YWl0cXVldWUod29yZCwgYml0KTsKQEAgLTIxMSw3ICsyMTEsNyBAQAogfQogRVhQT1JUX1NZTUJPTChvdXRfb2ZfbGluZV93YWl0X29uX2JpdF9sb2NrKTsKIAotdm9pZCBmYXN0Y2FsbCBfX3dha2VfdXBfYml0KHdhaXRfcXVldWVfaGVhZF90ICp3cSwgdm9pZCAqd29yZCwgaW50IGJpdCkKK3ZvaWQgX193YWtlX3VwX2JpdCh3YWl0X3F1ZXVlX2hlYWRfdCAqd3EsIHZvaWQgKndvcmQsIGludCBiaXQpCiB7CiAJc3RydWN0IHdhaXRfYml0X2tleSBrZXkgPSBfX1dBSVRfQklUX0tFWV9JTklUSUFMSVpFUih3b3JkLCBiaXQpOwogCWlmICh3YWl0cXVldWVfYWN0aXZlKHdxKSkKQEAgLTIzNiwxMyArMjM2LDEzIEBACiAgKiBtYXkgbmVlZCB0byB1c2UgYSBsZXNzIHJlZ3VsYXIgYmFycmllciwgc3VjaCBmcy9pbm9kZS5jJ3Mgc21wX21iKCksCiAgKiBiZWNhdXNlIHNwaW5fdW5sb2NrKCkgZG9lcyBub3QgZ3VhcmFudGVlIGEgbWVtb3J5IGJhcnJpZXIuCiAgKi8KLXZvaWQgZmFzdGNhbGwgd2FrZV91cF9iaXQodm9pZCAqd29yZCwgaW50IGJpdCkKK3ZvaWQgd2FrZV91cF9iaXQodm9pZCAqd29yZCwgaW50IGJpdCkKIHsKIAlfX3dha2VfdXBfYml0KGJpdF93YWl0cXVldWUod29yZCwgYml0KSwgd29yZCwgYml0KTsKIH0KIEVYUE9SVF9TWU1CT0wod2FrZV91cF9iaXQpOwogCi1mYXN0Y2FsbCB3YWl0X3F1ZXVlX2hlYWRfdCAqYml0X3dhaXRxdWV1ZSh2b2lkICp3b3JkLCBpbnQgYml0KQord2FpdF9xdWV1ZV9oZWFkX3QgKmJpdF93YWl0cXVldWUodm9pZCAqd29yZCwgaW50IGJpdCkKIHsKIAljb25zdCBpbnQgc2hpZnQgPSBCSVRTX1BFUl9MT05HID09IDMyID8gNSA6IDY7CiAJY29uc3Qgc3RydWN0IHpvbmUgKnpvbmUgPSBwYWdlX3pvbmUodmlydF90b19wYWdlKHdvcmQpKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC93b3JrcXVldWUuYyBiL2tlcm5lbC93b3JrcXVldWUuYwppbmRleCA1MmRiNDhlLi5mZjA2NjExIDEwMDY0NAotLS0gYS9rZXJuZWwvd29ya3F1ZXVlLmMKKysrIGIva2VybmVsL3dvcmtxdWV1ZS5jCkBAIC0xNjEsNyArMTYxLDcgQEAKICAqIFdlIHF1ZXVlIHRoZSB3b3JrIHRvIHRoZSBDUFUgaXQgd2FzIHN1Ym1pdHRlZCwgYnV0IHRoZXJlIGlzIG5vCiAgKiBndWFyYW50ZWUgdGhhdCBpdCB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGF0IENQVS4KICAqLwotaW50IGZhc3RjYWxsIHF1ZXVlX3dvcmsoc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxLCBzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitpbnQgcXVldWVfd29yayhzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EsIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMTc1LDcgKzE3NSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChxdWV1ZV93b3JrKTsKIAotdm9pZCBkZWxheWVkX3dvcmtfdGltZXJfZm4odW5zaWduZWQgbG9uZyBfX2RhdGEpCitzdGF0aWMgdm9pZCBkZWxheWVkX3dvcmtfdGltZXJfZm4odW5zaWduZWQgbG9uZyBfX2RhdGEpCiB7CiAJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSAoc3RydWN0IGRlbGF5ZWRfd29yayAqKV9fZGF0YTsKIAlzdHJ1Y3QgY3B1X3dvcmtxdWV1ZV9zdHJ1Y3QgKmN3cSA9IGdldF93cV9kYXRhKCZkd29yay0+d29yayk7CkBAIC0xOTIsNyArMTkyLDcgQEAKICAqCiAgKiBSZXR1cm5zIDAgaWYgQHdvcmsgd2FzIGFscmVhZHkgb24gYSBxdWV1ZSwgbm9uLXplcm8gb3RoZXJ3aXNlLgogICovCi1pbnQgZmFzdGNhbGwgcXVldWVfZGVsYXllZF93b3JrKHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSwKK2ludCBxdWV1ZV9kZWxheWVkX3dvcmsoc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxLAogCQkJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmssIHVuc2lnbmVkIGxvbmcgZGVsYXkpCiB7CiAJdGltZXJfc3RhdHNfdGltZXJfc2V0X3N0YXJ0X2luZm8oJmR3b3JrLT50aW1lcik7CkBAIC0zODgsNyArMzg4LDcgQEAKICAqIFRoaXMgZnVuY3Rpb24gdXNlZCB0byBydW4gdGhlIHdvcmtxdWV1ZXMgaXRzZWxmLiAgTm93IHdlIGp1c3Qgd2FpdCBmb3IgdGhlCiAgKiBoZWxwZXIgdGhyZWFkcyB0byBkbyBpdC4KICAqLwotdm9pZCBmYXN0Y2FsbCBmbHVzaF93b3JrcXVldWUoc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxKQordm9pZCBmbHVzaF93b3JrcXVldWUoc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxKQogewogCWNvbnN0IGNwdW1hc2tfdCAqY3B1X21hcCA9IHdxX2NwdV9tYXAod3EpOwogCWludCBjcHU7CkBAIC01NDYsNyArNTQ2LDcgQEAKICAqCiAgKiBUaGlzIHB1dHMgYSBqb2IgaW4gdGhlIGtlcm5lbC1nbG9iYWwgd29ya3F1ZXVlLgogICovCi1pbnQgZmFzdGNhbGwgc2NoZWR1bGVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitpbnQgc2NoZWR1bGVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJcmV0dXJuIHF1ZXVlX3dvcmsoa2V2ZW50ZF93cSwgd29yayk7CiB9CkBAIC01NjAsNyArNTYwLDcgQEAKICAqIEFmdGVyIHdhaXRpbmcgZm9yIGEgZ2l2ZW4gdGltZSB0aGlzIHB1dHMgYSBqb2IgaW4gdGhlIGtlcm5lbC1nbG9iYWwKICAqIHdvcmtxdWV1ZS4KICAqLwotaW50IGZhc3RjYWxsIHNjaGVkdWxlX2RlbGF5ZWRfd29yayhzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yaywKK2ludCBzY2hlZHVsZV9kZWxheWVkX3dvcmsoc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmssCiAJCQkJCXVuc2lnbmVkIGxvbmcgZGVsYXkpCiB7CiAJdGltZXJfc3RhdHNfdGltZXJfc2V0X3N0YXJ0X2luZm8oJmR3b3JrLT50aW1lcik7CmRpZmYgLS1naXQgYS9saWIvS2NvbmZpZy5kZWJ1ZyBiL2xpYi9LY29uZmlnLmRlYnVnCmluZGV4IDBkMzg1YmUuLmNlMGJiMjYgMTAwNjQ0Ci0tLSBhL2xpYi9LY29uZmlnLmRlYnVnCisrKyBiL2xpYi9LY29uZmlnLmRlYnVnCkBAIC0yMDUsNiArMjA1LDE5IEBACiAJICBvZmYgaW4gYSBrZXJuZWwgYnVpbHQgd2l0aCBDT05GSUdfU0xVQl9ERUJVR19PTiBieSBzcGVjaWZ5aW5nCiAJICAic2x1Yl9kZWJ1Zz0tIi4KIAorY29uZmlnIFNMVUJfU1RBVFMKKwlkZWZhdWx0IG4KKwlib29sICJFbmFibGUgU0xVQiBwZXJmb3JtYW5jZSBzdGF0aXN0aWNzIgorCWRlcGVuZHMgb24gU0xVQgorCWhlbHAKKwkgIFNMVUIgc3RhdGlzdGljcyBhcmUgdXNlZnVsIHRvIGRlYnVnIFNMVUJzIGFsbG9jYXRpb24gYmVoYXZpb3IgaW4KKwkgIG9yZGVyIGZpbmQgd2F5cyB0byBvcHRpbWl6ZSB0aGUgYWxsb2NhdG9yLiBUaGlzIHNob3VsZCBuZXZlciBiZQorCSAgZW5hYmxlZCBmb3IgcHJvZHVjdGlvbiB1c2Ugc2luY2Uga2VlcGluZyBzdGF0aXN0aWNzIHNsb3dzIGRvd24KKwkgIHRoZSBhbGxvY2F0b3IgYnkgYSBmZXcgcGVyY2VudGFnZSBwb2ludHMuIFRoZSBzbGFiaW5mbyBjb21tYW5kCisJICBzdXBwb3J0cyB0aGUgZGV0ZXJtaW5hdGlvbiBvZiB0aGUgbW9zdCBhY3RpdmUgc2xhYnMgdG8gZmlndXJlCisJICBvdXQgd2hpY2ggc2xhYnMgYXJlIHJlbGV2YW50IHRvIGEgcGFydGljdWxhciBsb2FkLgorCSAgVHJ5IHJ1bm5pbmc6IHNsYWJpbmZvIC1EQQorCiBjb25maWcgREVCVUdfUFJFRU1QVAogCWJvb2wgIkRlYnVnIHByZWVtcHRpYmxlIGtlcm5lbCIKIAlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiBQUkVFTVBUICYmIChUUkFDRV9JUlFGTEFHU19TVVBQT1JUIHx8IFBQQzY0KQpAQCAtMzkxLDcgKzQwNCw4IEBACiBjb25maWcgREVCVUdfQlVHVkVSQk9TRQogCWJvb2wgIlZlcmJvc2UgQlVHKCkgcmVwb3J0aW5nIChhZGRzIDcwSykiIGlmIERFQlVHX0tFUk5FTCAmJiBFTUJFRERFRAogCWRlcGVuZHMgb24gQlVHCi0JZGVwZW5kcyBvbiBBUk0gfHwgQVZSMzIgfHwgTTMyUiB8fCBNNjhLIHx8IFNQQVJDMzIgfHwgU1BBUkM2NCB8fCBGUlYgfHwgU1VQRVJIIHx8IEdFTkVSSUNfQlVHIHx8IEJMQUNLRklOCisJZGVwZW5kcyBvbiBBUk0gfHwgQVZSMzIgfHwgTTMyUiB8fCBNNjhLIHx8IFNQQVJDMzIgfHwgU1BBUkM2NCB8fCBcCisJCSAgIEZSViB8fCBTVVBFUkggfHwgR0VORVJJQ19CVUcgfHwgQkxBQ0tGSU4gfHwgTU4xMDMwMAogCWRlZmF1bHQgIUVNQkVEREVECiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBtYWtlIEJVRygpIHBhbmljcyBvdXRwdXQgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIKQEAgLTQ0MSw3ICs0NTUsOSBAQAogCiBjb25maWcgRlJBTUVfUE9JTlRFUgogCWJvb2wgIkNvbXBpbGUgdGhlIGtlcm5lbCB3aXRoIGZyYW1lIHBvaW50ZXJzIgotCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmIChYODYgfHwgQ1JJUyB8fCBNNjhLIHx8IE02OEtOT01NVSB8fCBGUlYgfHwgVU1MIHx8IFMzOTAgfHwgQVZSMzIgfHwgU1VQRVJIIHx8IEJMQUNLRklOKQorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmIFwKKwkJKFg4NiB8fCBDUklTIHx8IE02OEsgfHwgTTY4S05PTU1VIHx8IEZSViB8fCBVTUwgfHwgUzM5MCB8fCBcCisJCSBBVlIzMiB8fCBTVVBFUkggfHwgQkxBQ0tGSU4gfHwgTU4xMDMwMCkKIAlkZWZhdWx0IHkgaWYgREVCVUdfSU5GTyAmJiBVTUwKIAloZWxwCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSB0aGUgcmVzdWx0aW5nIGtlcm5lbCBpbWFnZSB3aWxsIGJlIHNsaWdodGx5IGxhcmdlcgpkaWZmIC0tZ2l0IGEvbGliL01ha2VmaWxlIGIvbGliL01ha2VmaWxlCmluZGV4IGExODA2MmU0Li4yM2RlMjYxIDEwMDY0NAotLS0gYS9saWIvTWFrZWZpbGUKKysrIGIvbGliL01ha2VmaWxlCkBAIC02LDcgKzYsNyBAQAogCSByYnRyZWUubyByYWRpeC10cmVlLm8gZHVtcF9zdGFjay5vIFwKIAkgaWRyLm8gaW50X3NxcnQubyBleHRhYmxlLm8gcHJpb190cmVlLm8gXAogCSBzaGExLm8gaXJxX3JlZ3MubyByZWNpcHJvY2FsX2Rpdi5vIGFyZ3Zfc3BsaXQubyBcCi0JIHByb3BvcnRpb25zLm8gcHJpb19oZWFwLm8gc2NhdHRlcmxpc3QubworCSBwcm9wb3J0aW9ucy5vIHByaW9faGVhcC5vCiAKIGxpYi0kKENPTkZJR19NTVUpICs9IGlvcmVtYXAubwogbGliLSQoQ09ORklHX1NNUCkgKz0gY3B1bWFzay5vCkBAIC0xNCw3ICsxNCw3IEBACiBsaWIteQkrPSBrb2JqZWN0Lm8ga3JlZi5vIGtsaXN0Lm8KIAogb2JqLXkgKz0gZGl2NjQubyBzb3J0Lm8gcGFyc2VyLm8gaGFsZm1kNC5vIGRlYnVnX2xvY2tzLm8gcmFuZG9tMzIubyBcCi0JIGJ1c3Rfc3BpbmxvY2tzLm8gaGV4ZHVtcC5vIGthc3ByaW50Zi5vIGJpdG1hcC5vCisJIGJ1c3Rfc3BpbmxvY2tzLm8gaGV4ZHVtcC5vIGthc3ByaW50Zi5vIGJpdG1hcC5vIHNjYXR0ZXJsaXN0Lm8KIAogaWZlcSAoJChDT05GSUdfREVCVUdfS09CSkVDVCkseSkKIENGTEFHU19rb2JqZWN0Lm8gKz0gLURERUJVRwpkaWZmIC0tZ2l0IGEvbGliL2ZhdWx0LWluamVjdC5jIGIvbGliL2ZhdWx0LWluamVjdC5jCmluZGV4IDIzOTg1YTIuLmE1MGEzMTEgMTAwNjQ0Ci0tLSBhL2xpYi9mYXVsdC1pbmplY3QuYworKysgYi9saWIvZmF1bHQtaW5qZWN0LmMKQEAgLTEzNCwyMyArMTM0LDI2IEBACiAKICNpZmRlZiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX0RFQlVHX0ZTCiAKLXN0YXRpYyB2b2lkIGRlYnVnZnNfdWxfc2V0KHZvaWQgKmRhdGEsIHU2NCB2YWwpCitzdGF0aWMgaW50IGRlYnVnZnNfdWxfc2V0KHZvaWQgKmRhdGEsIHU2NCB2YWwpCiB7CiAJKih1bnNpZ25lZCBsb25nICopZGF0YSA9IHZhbDsKKwlyZXR1cm4gMDsKIH0KIAogI2lmZGVmIENPTkZJR19GQVVMVF9JTkpFQ1RJT05fU1RBQ0tUUkFDRV9GSUxURVIKLXN0YXRpYyB2b2lkIGRlYnVnZnNfdWxfc2V0X01BWF9TVEFDS19UUkFDRV9ERVBUSCh2b2lkICpkYXRhLCB1NjQgdmFsKQorc3RhdGljIGludCBkZWJ1Z2ZzX3VsX3NldF9NQVhfU1RBQ0tfVFJBQ0VfREVQVEgodm9pZCAqZGF0YSwgdTY0IHZhbCkKIHsKIAkqKHVuc2lnbmVkIGxvbmcgKilkYXRhID0KIAkJdmFsIDwgTUFYX1NUQUNLX1RSQUNFX0RFUFRIID8KIAkJdmFsIDogTUFYX1NUQUNLX1RSQUNFX0RFUFRIOworCXJldHVybiAwOwogfQogI2VuZGlmIC8qIENPTkZJR19GQVVMVF9JTkpFQ1RJT05fU1RBQ0tUUkFDRV9GSUxURVIgKi8KIAotc3RhdGljIHU2NCBkZWJ1Z2ZzX3VsX2dldCh2b2lkICpkYXRhKQorc3RhdGljIGludCBkZWJ1Z2ZzX3VsX2dldCh2b2lkICpkYXRhLCB1NjQgKnZhbCkKIHsKLQlyZXR1cm4gKih1bnNpZ25lZCBsb25nICopZGF0YTsKKwkqdmFsID0gKih1bnNpZ25lZCBsb25nICopZGF0YTsKKwlyZXR1cm4gMDsKIH0KIAogREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoZm9wc191bCwgZGVidWdmc191bF9nZXQsIGRlYnVnZnNfdWxfc2V0LCAiJWxsdVxuIik7CkBAIC0xNzQsMTQgKzE3NywxNiBAQAogfQogI2VuZGlmIC8qIENPTkZJR19GQVVMVF9JTkpFQ1RJT05fU1RBQ0tUUkFDRV9GSUxURVIgKi8KIAotc3RhdGljIHZvaWQgZGVidWdmc19hdG9taWNfdF9zZXQodm9pZCAqZGF0YSwgdTY0IHZhbCkKK3N0YXRpYyBpbnQgZGVidWdmc19hdG9taWNfdF9zZXQodm9pZCAqZGF0YSwgdTY0IHZhbCkKIHsKIAlhdG9taWNfc2V0KChhdG9taWNfdCAqKWRhdGEsIHZhbCk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1NjQgZGVidWdmc19hdG9taWNfdF9nZXQodm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgZGVidWdmc19hdG9taWNfdF9nZXQodm9pZCAqZGF0YSwgdTY0ICp2YWwpCiB7Ci0JcmV0dXJuIGF0b21pY19yZWFkKChhdG9taWNfdCAqKWRhdGEpOworCSp2YWwgPSBhdG9taWNfcmVhZCgoYXRvbWljX3QgKilkYXRhKTsKKwlyZXR1cm4gMDsKIH0KIAogREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoZm9wc19hdG9taWNfdCwgZGVidWdmc19hdG9taWNfdF9nZXQsCmRpZmYgLS1naXQgYS9saWIvaW9tYXAuYyBiL2xpYi9pb21hcC5jCmluZGV4IDcyYzQyNjguLmRiMDA0YTkgMTAwNjQ0Ci0tLSBhL2xpYi9pb21hcC5jCisrKyBiL2xpYi9pb21hcC5jCkBAIC02OSwyNyArNjksMjcgQEAKICNkZWZpbmUgbW1pb19yZWFkMzJiZShhZGRyKSBiZTMyX3RvX2NwdShfX3Jhd19yZWFkbChhZGRyKSkKICNlbmRpZgogCi11bnNpZ25lZCBpbnQgZmFzdGNhbGwgaW9yZWFkOCh2b2lkIF9faW9tZW0gKmFkZHIpCit1bnNpZ25lZCBpbnQgaW9yZWFkOCh2b2lkIF9faW9tZW0gKmFkZHIpCiB7CiAJSU9fQ09ORChhZGRyLCByZXR1cm4gaW5iKHBvcnQpLCByZXR1cm4gcmVhZGIoYWRkcikpOwogCXJldHVybiAweGZmOwogfQotdW5zaWduZWQgaW50IGZhc3RjYWxsIGlvcmVhZDE2KHZvaWQgX19pb21lbSAqYWRkcikKK3Vuc2lnbmVkIGludCBpb3JlYWQxNih2b2lkIF9faW9tZW0gKmFkZHIpCiB7CiAJSU9fQ09ORChhZGRyLCByZXR1cm4gaW53KHBvcnQpLCByZXR1cm4gcmVhZHcoYWRkcikpOwogCXJldHVybiAweGZmZmY7CiB9Ci11bnNpZ25lZCBpbnQgZmFzdGNhbGwgaW9yZWFkMTZiZSh2b2lkIF9faW9tZW0gKmFkZHIpCit1bnNpZ25lZCBpbnQgaW9yZWFkMTZiZSh2b2lkIF9faW9tZW0gKmFkZHIpCiB7CiAJSU9fQ09ORChhZGRyLCByZXR1cm4gcGlvX3JlYWQxNmJlKHBvcnQpLCByZXR1cm4gbW1pb19yZWFkMTZiZShhZGRyKSk7CiAJcmV0dXJuIDB4ZmZmZjsKIH0KLXVuc2lnbmVkIGludCBmYXN0Y2FsbCBpb3JlYWQzMih2b2lkIF9faW9tZW0gKmFkZHIpCit1bnNpZ25lZCBpbnQgaW9yZWFkMzIodm9pZCBfX2lvbWVtICphZGRyKQogewogCUlPX0NPTkQoYWRkciwgcmV0dXJuIGlubChwb3J0KSwgcmV0dXJuIHJlYWRsKGFkZHIpKTsKIAlyZXR1cm4gMHhmZmZmZmZmZjsKIH0KLXVuc2lnbmVkIGludCBmYXN0Y2FsbCBpb3JlYWQzMmJlKHZvaWQgX19pb21lbSAqYWRkcikKK3Vuc2lnbmVkIGludCBpb3JlYWQzMmJlKHZvaWQgX19pb21lbSAqYWRkcikKIHsKIAlJT19DT05EKGFkZHIsIHJldHVybiBwaW9fcmVhZDMyYmUocG9ydCksIHJldHVybiBtbWlvX3JlYWQzMmJlKGFkZHIpKTsKIAlyZXR1cm4gMHhmZmZmZmZmZjsKQEAgLTExMCwyMyArMTEwLDIzIEBACiAjZGVmaW5lIG1taW9fd3JpdGUzMmJlKHZhbCxwb3J0KSBfX3Jhd193cml0ZWwoYmUzMl90b19jcHUodmFsKSxwb3J0KQogI2VuZGlmCiAKLXZvaWQgZmFzdGNhbGwgaW93cml0ZTgodTggdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCit2b2lkIGlvd3JpdGU4KHU4IHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKQogewogCUlPX0NPTkQoYWRkciwgb3V0Yih2YWwscG9ydCksIHdyaXRlYih2YWwsIGFkZHIpKTsKIH0KLXZvaWQgZmFzdGNhbGwgaW93cml0ZTE2KHUxNiB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKK3ZvaWQgaW93cml0ZTE2KHUxNiB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKIHsKIAlJT19DT05EKGFkZHIsIG91dHcodmFsLHBvcnQpLCB3cml0ZXcodmFsLCBhZGRyKSk7CiB9Ci12b2lkIGZhc3RjYWxsIGlvd3JpdGUxNmJlKHUxNiB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKK3ZvaWQgaW93cml0ZTE2YmUodTE2IHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKQogewogCUlPX0NPTkQoYWRkciwgcGlvX3dyaXRlMTZiZSh2YWwscG9ydCksIG1taW9fd3JpdGUxNmJlKHZhbCwgYWRkcikpOwogfQotdm9pZCBmYXN0Y2FsbCBpb3dyaXRlMzIodTMyIHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKQordm9pZCBpb3dyaXRlMzIodTMyIHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKQogewogCUlPX0NPTkQoYWRkciwgb3V0bCh2YWwscG9ydCksIHdyaXRlbCh2YWwsIGFkZHIpKTsKIH0KLXZvaWQgZmFzdGNhbGwgaW93cml0ZTMyYmUodTMyIHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKQordm9pZCBpb3dyaXRlMzJiZSh1MzIgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCiB7CiAJSU9fQ09ORChhZGRyLCBwaW9fd3JpdGUzMmJlKHZhbCxwb3J0KSwgbW1pb193cml0ZTMyYmUodmFsLCBhZGRyKSk7CiB9CkBAIC0xOTMsMTUgKzE5MywxNSBAQAogfQogI2VuZGlmCiAKLXZvaWQgZmFzdGNhbGwgaW9yZWFkOF9yZXAodm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpCit2b2lkIGlvcmVhZDhfcmVwKHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGNvdW50KQogewogCUlPX0NPTkQoYWRkciwgaW5zYihwb3J0LGRzdCxjb3VudCksIG1taW9faW5zYihhZGRyLCBkc3QsIGNvdW50KSk7CiB9Ci12b2lkIGZhc3RjYWxsIGlvcmVhZDE2X3JlcCh2b2lkIF9faW9tZW0gKmFkZHIsIHZvaWQgKmRzdCwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3ZvaWQgaW9yZWFkMTZfcmVwKHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGNvdW50KQogewogCUlPX0NPTkQoYWRkciwgaW5zdyhwb3J0LGRzdCxjb3VudCksIG1taW9faW5zdyhhZGRyLCBkc3QsIGNvdW50KSk7CiB9Ci12b2lkIGZhc3RjYWxsIGlvcmVhZDMyX3JlcCh2b2lkIF9faW9tZW0gKmFkZHIsIHZvaWQgKmRzdCwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3ZvaWQgaW9yZWFkMzJfcmVwKHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGNvdW50KQogewogCUlPX0NPTkQoYWRkciwgaW5zbChwb3J0LGRzdCxjb3VudCksIG1taW9faW5zbChhZGRyLCBkc3QsIGNvdW50KSk7CiB9CkBAIC0yMDksMTUgKzIwOSwxNSBAQAogRVhQT1JUX1NZTUJPTChpb3JlYWQxNl9yZXApOwogRVhQT1JUX1NZTUJPTChpb3JlYWQzMl9yZXApOwogCi12b2lkIGZhc3RjYWxsIGlvd3JpdGU4X3JlcCh2b2lkIF9faW9tZW0gKmFkZHIsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBjb3VudCkKK3ZvaWQgaW93cml0ZThfcmVwKHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewogCUlPX0NPTkQoYWRkciwgb3V0c2IocG9ydCwgc3JjLCBjb3VudCksIG1taW9fb3V0c2IoYWRkciwgc3JjLCBjb3VudCkpOwogfQotdm9pZCBmYXN0Y2FsbCBpb3dyaXRlMTZfcmVwKHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQordm9pZCBpb3dyaXRlMTZfcmVwKHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewogCUlPX0NPTkQoYWRkciwgb3V0c3cocG9ydCwgc3JjLCBjb3VudCksIG1taW9fb3V0c3coYWRkciwgc3JjLCBjb3VudCkpOwogfQotdm9pZCBmYXN0Y2FsbCBpb3dyaXRlMzJfcmVwKHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQordm9pZCBpb3dyaXRlMzJfcmVwKHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewogCUlPX0NPTkQoYWRkciwgb3V0c2wocG9ydCwgc3JjLGNvdW50KSwgbW1pb19vdXRzbChhZGRyLCBzcmMsIGNvdW50KSk7CiB9CmRpZmYgLS1naXQgYS9saWIvcndzZW0tc3BpbmxvY2suYyBiL2xpYi9yd3NlbS1zcGlubG9jay5jCmluZGV4IGM0Y2ZkNmMuLjlkZjNjYTUgMTAwNjQ0Ci0tLSBhL2xpYi9yd3NlbS1zcGlubG9jay5jCisrKyBiL2xpYi9yd3NlbS1zcGlubG9jay5jCkBAIC0xMjUsNyArMTI1LDcgQEAKIC8qCiAgKiBnZXQgYSByZWFkIGxvY2sgb24gdGhlIHNlbWFwaG9yZQogICovCi12b2lkIGZhc3RjYWxsIF9fc2NoZWQgX19kb3duX3JlYWQoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQordm9pZCBfX3NjaGVkIF9fZG93bl9yZWFkKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKIHsKIAlzdHJ1Y3QgcndzZW1fd2FpdGVyIHdhaXRlcjsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKQEAgLTE2OCw3ICsxNjgsNyBAQAogLyoKICAqIHRyeWxvY2sgZm9yIHJlYWRpbmcgLS0gcmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWwsIDAgaWYgY29udGVudGlvbgogICovCi1pbnQgZmFzdGNhbGwgX19kb3duX3JlYWRfdHJ5bG9jayhzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCitpbnQgX19kb3duX3JlYWRfdHJ5bG9jayhzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0ID0gMDsKQEAgLTE5MSw3ICsxOTEsNyBAQAogICogZ2V0IGEgd3JpdGUgbG9jayBvbiB0aGUgc2VtYXBob3JlCiAgKiAtIHdlIGluY3JlbWVudCB0aGUgd2FpdGluZyBjb3VudCBhbnl3YXkgdG8gaW5kaWNhdGUgYW4gZXhjbHVzaXZlIGxvY2sKICAqLwotdm9pZCBmYXN0Y2FsbCBfX3NjaGVkIF9fZG93bl93cml0ZV9uZXN0ZWQoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtLCBpbnQgc3ViY2xhc3MpCit2b2lkIF9fc2NoZWQgX19kb3duX3dyaXRlX25lc3RlZChzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0sIGludCBzdWJjbGFzcykKIHsKIAlzdHJ1Y3QgcndzZW1fd2FpdGVyIHdhaXRlcjsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKQEAgLTIzMSw3ICsyMzEsNyBAQAogCTsKIH0KIAotdm9pZCBmYXN0Y2FsbCBfX3NjaGVkIF9fZG93bl93cml0ZShzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCit2b2lkIF9fc2NoZWQgX19kb3duX3dyaXRlKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKIHsKIAlfX2Rvd25fd3JpdGVfbmVzdGVkKHNlbSwgMCk7CiB9CkBAIC0yMzksNyArMjM5LDcgQEAKIC8qCiAgKiB0cnlsb2NrIGZvciB3cml0aW5nIC0tIHJldHVybnMgMSBpZiBzdWNjZXNzZnVsLCAwIGlmIGNvbnRlbnRpb24KICAqLwotaW50IGZhc3RjYWxsIF9fZG93bl93cml0ZV90cnlsb2NrKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKK2ludCBfX2Rvd25fd3JpdGVfdHJ5bG9jayhzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0ID0gMDsKQEAgLTI2MCw3ICsyNjAsNyBAQAogLyoKICAqIHJlbGVhc2UgYSByZWFkIGxvY2sgb24gdGhlIHNlbWFwaG9yZQogICovCi12b2lkIGZhc3RjYWxsIF9fdXBfcmVhZChzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCit2b2lkIF9fdXBfcmVhZChzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMjc1LDcgKzI3NSw3IEBACiAvKgogICogcmVsZWFzZSBhIHdyaXRlIGxvY2sgb24gdGhlIHNlbWFwaG9yZQogICovCi12b2lkIGZhc3RjYWxsIF9fdXBfd3JpdGUoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQordm9pZCBfX3VwX3dyaXRlKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0yOTIsNyArMjkyLDcgQEAKICAqIGRvd25ncmFkZSBhIHdyaXRlIGxvY2sgaW50byBhIHJlYWQgbG9jawogICogLSBqdXN0IHdha2UgdXAgYW55IHJlYWRlcnMgYXQgdGhlIGZyb250IG9mIHRoZSBxdWV1ZQogICovCi12b2lkIGZhc3RjYWxsIF9fZG93bmdyYWRlX3dyaXRlKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKK3ZvaWQgX19kb3duZ3JhZGVfd3JpdGUoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKZGlmZiAtLWdpdCBhL2xpYi9zZW1hcGhvcmUtc2xlZXBlcnMuYyBiL2xpYi9zZW1hcGhvcmUtc2xlZXBlcnMuYwppbmRleCAxMjgxODA1Li4wMTk4NzgyIDEwMDY0NAotLS0gYS9saWIvc2VtYXBob3JlLXNsZWVwZXJzLmMKKysrIGIvbGliL3NlbWFwaG9yZS1zbGVlcGVycy5jCkBAIC00OCwxMiArNDgsMTIgQEAKICAqICAgIHdlIGNhbm5vdCBsb3NlIHdha2V1cCBldmVudHMuCiAgKi8KIAotZmFzdGNhbGwgdm9pZCBfX3VwKHN0cnVjdCBzZW1hcGhvcmUgKnNlbSkKK3ZvaWQgX191cChzdHJ1Y3Qgc2VtYXBob3JlICpzZW0pCiB7CiAJd2FrZV91cCgmc2VtLT53YWl0KTsKIH0KIAotZmFzdGNhbGwgdm9pZCBfX3NjaGVkIF9fZG93bihzdHJ1Y3Qgc2VtYXBob3JlICogc2VtKQordm9pZCBfX3NjaGVkIF9fZG93bihzdHJ1Y3Qgc2VtYXBob3JlICpzZW0pCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIHRzayk7CkBAIC05MCw3ICs5MCw3IEBACiAJdHNrLT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKIH0KIAotZmFzdGNhbGwgaW50IF9fc2NoZWQgX19kb3duX2ludGVycnVwdGlibGUoc3RydWN0IHNlbWFwaG9yZSAqIHNlbSkKK2ludCBfX3NjaGVkIF9fZG93bl9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBzZW1hcGhvcmUgKnNlbSkKIHsKIAlpbnQgcmV0dmFsID0gMDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CkBAIC0xNTMsNyArMTUzLDcgQEAKICAqIHNpbmdsZSAiY21weGNoZyIgd2l0aG91dCBmYWlsdXJlIGNhc2VzLAogICogYnV0IHRoZW4gaXQgd291bGRuJ3Qgd29yayBvbiBhIDM4Ni4KICAqLwotZmFzdGNhbGwgaW50IF9fZG93bl90cnlsb2NrKHN0cnVjdCBzZW1hcGhvcmUgKiBzZW0pCitpbnQgX19kb3duX3RyeWxvY2soc3RydWN0IHNlbWFwaG9yZSAqc2VtKQogewogCWludCBzbGVlcGVyczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpkaWZmIC0tZ2l0IGEvbGliL3ZzcHJpbnRmLmMgYi9saWIvdnNwcmludGYuYwppbmRleCA3YjQ4MWNlLi40MTk5OTNmIDEwMDY0NAotLS0gYS9saWIvdnNwcmludGYuYworKysgYi9saWIvdnNwcmludGYuYwpAQCAtMTI2LDYgKzEyNiwxMjkgQEAKIAlyZXR1cm4gc2ltcGxlX3N0cnRvdWxsKGNwLGVuZHAsYmFzZSk7CiB9CiAKKworLyoqCisgKiBzdHJpY3Rfc3RydG91bCAtIGNvbnZlcnQgYSBzdHJpbmcgdG8gYW4gdW5zaWduZWQgbG9uZyBzdHJpY3RseQorICogQGNwOiBUaGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZAorICogQGJhc2U6IFRoZSBudW1iZXIgYmFzZSB0byB1c2UKKyAqIEByZXM6IFRoZSBjb252ZXJ0ZWQgcmVzdWx0IHZhbHVlCisgKgorICogc3RyaWN0X3N0cnRvdWwgY29udmVydHMgYSBzdHJpbmcgdG8gYW4gdW5zaWduZWQgbG9uZyBvbmx5IGlmIHRoZQorICogc3RyaW5nIGlzIHJlYWxseSBhbiB1bnNpZ25lZCBsb25nIHN0cmluZywgYW55IHN0cmluZyBjb250YWluaW5nCisgKiBhbnkgaW52YWxpZCBjaGFyIGF0IHRoZSB0YWlsIHdpbGwgYmUgcmVqZWN0ZWQgYW5kIC1FSU5WQUwgaXMgcmV0dXJuZWQsCisgKiBvbmx5IGEgbmV3bGluZSBjaGFyIGF0IHRoZSB0YWlsIGlzIGFjY2VwdGlibGUgYmVjYXVzZSBwZW9wbGUgZ2VuZXJhbGx5CisgKiBjaGFuZ2UgYSBtb2R1bGUgcGFyYW1ldGVyIGluIHRoZSBmb2xsb3dpbmcgd2F5OgorICoKKyAqIAllY2hvIDEwMjQgPiAvc3lzL21vZHVsZS9lMTAwMC9wYXJhbWV0ZXJzL2NvcHlicmVhaworICoKKyAqIGVjaG8gd2lsbCBhcHBlbmQgYSBuZXdsaW5lIHRvIHRoZSB0YWlsLgorICoKKyAqIEl0IHJldHVybnMgMCBpZiBjb252ZXJzaW9uIGlzIHN1Y2Nlc3NmdWwgYW5kICpyZXMgaXMgc2V0IHRvIHRoZSBjb252ZXJ0ZWQKKyAqIHZhbHVlLCBvdGhlcndpc2UgaXQgcmV0dXJucyAtRUlOVkFMIGFuZCAqcmVzIGlzIHNldCB0byAwLgorICoKKyAqIHNpbXBsZV9zdHJ0b3VsIGp1c3QgaWdub3JlcyB0aGUgc3VjY2Vzc2l2ZSBpbnZhbGlkIGNoYXJhY3RlcnMgYW5kCisgKiByZXR1cm4gdGhlIGNvbnZlcnRlZCB2YWx1ZSBvZiBwcmVmaXggcGFydCBvZiB0aGUgc3RyaW5nLgorICovCitpbnQgc3RyaWN0X3N0cnRvdWwoY29uc3QgY2hhciAqY3AsIHVuc2lnbmVkIGludCBiYXNlLCB1bnNpZ25lZCBsb25nICpyZXMpOworCisvKioKKyAqIHN0cmljdF9zdHJ0b2wgLSBjb252ZXJ0IGEgc3RyaW5nIHRvIGEgbG9uZyBzdHJpY3RseQorICogQGNwOiBUaGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZAorICogQGJhc2U6IFRoZSBudW1iZXIgYmFzZSB0byB1c2UKKyAqIEByZXM6IFRoZSBjb252ZXJ0ZWQgcmVzdWx0IHZhbHVlCisgKgorICogc3RyaWN0X3N0cnRvbCBpcyBzaW1pbGlhciB0byBzdHJpY3Rfc3RydG91bCwgYnV0IGl0IGFsbG93cyB0aGUgZmlyc3QKKyAqIGNoYXJhY3RlciBvZiBhIHN0cmluZyBpcyAnLScuCisgKgorICogSXQgcmV0dXJucyAwIGlmIGNvbnZlcnNpb24gaXMgc3VjY2Vzc2Z1bCBhbmQgKnJlcyBpcyBzZXQgdG8gdGhlIGNvbnZlcnRlZAorICogdmFsdWUsIG90aGVyd2lzZSBpdCByZXR1cm5zIC1FSU5WQUwgYW5kICpyZXMgaXMgc2V0IHRvIDAuCisgKi8KK2ludCBzdHJpY3Rfc3RydG9sKGNvbnN0IGNoYXIgKmNwLCB1bnNpZ25lZCBpbnQgYmFzZSwgbG9uZyAqcmVzKTsKKworLyoqCisgKiBzdHJpY3Rfc3RydG91bGwgLSBjb252ZXJ0IGEgc3RyaW5nIHRvIGFuIHVuc2lnbmVkIGxvbmcgbG9uZyBzdHJpY3RseQorICogQGNwOiBUaGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZAorICogQGJhc2U6IFRoZSBudW1iZXIgYmFzZSB0byB1c2UKKyAqIEByZXM6IFRoZSBjb252ZXJ0ZWQgcmVzdWx0IHZhbHVlCisgKgorICogc3RyaWN0X3N0cnRvdWxsIGNvbnZlcnRzIGEgc3RyaW5nIHRvIGFuIHVuc2lnbmVkIGxvbmcgbG9uZyBvbmx5IGlmIHRoZQorICogc3RyaW5nIGlzIHJlYWxseSBhbiB1bnNpZ25lZCBsb25nIGxvbmcgc3RyaW5nLCBhbnkgc3RyaW5nIGNvbnRhaW5pbmcKKyAqIGFueSBpbnZhbGlkIGNoYXIgYXQgdGhlIHRhaWwgd2lsbCBiZSByZWplY3RlZCBhbmQgLUVJTlZBTCBpcyByZXR1cm5lZCwKKyAqIG9ubHkgYSBuZXdsaW5lIGNoYXIgYXQgdGhlIHRhaWwgaXMgYWNjZXB0aWJsZSBiZWNhdXNlIHBlb3BsZSBnZW5lcmFsbHkKKyAqIGNoYW5nZSBhIG1vZHVsZSBwYXJhbWV0ZXIgaW4gdGhlIGZvbGxvd2luZyB3YXk6CisgKgorICogCWVjaG8gMTAyNCA+IC9zeXMvbW9kdWxlL2UxMDAwL3BhcmFtZXRlcnMvY29weWJyZWFrCisgKgorICogZWNobyB3aWxsIGFwcGVuZCBhIG5ld2xpbmUgdG8gdGhlIHRhaWwgb2YgdGhlIHN0cmluZy4KKyAqCisgKiBJdCByZXR1cm5zIDAgaWYgY29udmVyc2lvbiBpcyBzdWNjZXNzZnVsIGFuZCAqcmVzIGlzIHNldCB0byB0aGUgY29udmVydGVkCisgKiB2YWx1ZSwgb3RoZXJ3aXNlIGl0IHJldHVybnMgLUVJTlZBTCBhbmQgKnJlcyBpcyBzZXQgdG8gMC4KKyAqCisgKiBzaW1wbGVfc3RydG91bGwganVzdCBpZ25vcmVzIHRoZSBzdWNjZXNzaXZlIGludmFsaWQgY2hhcmFjdGVycyBhbmQKKyAqIHJldHVybiB0aGUgY29udmVydGVkIHZhbHVlIG9mIHByZWZpeCBwYXJ0IG9mIHRoZSBzdHJpbmcuCisgKi8KK2ludCBzdHJpY3Rfc3RydG91bGwoY29uc3QgY2hhciAqY3AsIHVuc2lnbmVkIGludCBiYXNlLCB1bnNpZ25lZCBsb25nIGxvbmcgKnJlcyk7CisKKy8qKgorICogc3RyaWN0X3N0cnRvbGwgLSBjb252ZXJ0IGEgc3RyaW5nIHRvIGEgbG9uZyBsb25nIHN0cmljdGx5CisgKiBAY3A6IFRoZSBzdHJpbmcgdG8gYmUgY29udmVydGVkCisgKiBAYmFzZTogVGhlIG51bWJlciBiYXNlIHRvIHVzZQorICogQHJlczogVGhlIGNvbnZlcnRlZCByZXN1bHQgdmFsdWUKKyAqCisgKiBzdHJpY3Rfc3RydG9sbCBpcyBzaW1pbGlhciB0byBzdHJpY3Rfc3RydG91bGwsIGJ1dCBpdCBhbGxvd3MgdGhlIGZpcnN0CisgKiBjaGFyYWN0ZXIgb2YgYSBzdHJpbmcgaXMgJy0nLgorICoKKyAqIEl0IHJldHVybnMgMCBpZiBjb252ZXJzaW9uIGlzIHN1Y2Nlc3NmdWwgYW5kICpyZXMgaXMgc2V0IHRvIHRoZSBjb252ZXJ0ZWQKKyAqIHZhbHVlLCBvdGhlcndpc2UgaXQgcmV0dXJucyAtRUlOVkFMIGFuZCAqcmVzIGlzIHNldCB0byAwLgorICovCitpbnQgc3RyaWN0X3N0cnRvbGwoY29uc3QgY2hhciAqY3AsIHVuc2lnbmVkIGludCBiYXNlLCBsb25nIGxvbmcgKnJlcyk7CisKKyNkZWZpbmUgZGVmaW5lX3N0cmljdF9zdHJ0b3V4KHR5cGUsIHZhbHR5cGUpCQkJCVwKK2ludCBzdHJpY3Rfc3RydG91IyN0eXBlKGNvbnN0IGNoYXIgKmNwLCB1bnNpZ25lZCBpbnQgYmFzZSwgdmFsdHlwZSAqcmVzKVwKK3sJCQkJCQkJCQlcCisJY2hhciAqdGFpbDsJCQkJCQkJXAorCXZhbHR5cGUgdmFsOwkJCQkJCQlcCisJc2l6ZV90IGxlbjsJCQkJCQkJXAorCQkJCQkJCQkJXAorCSpyZXMgPSAwOwkJCQkJCQlcCisJbGVuID0gc3RybGVuKGNwKTsJCQkJCQlcCisJaWYgKGxlbiA9PSAwKQkJCQkJCQlcCisJCXJldHVybiAtRUlOVkFMOwkJCQkJCVwKKwkJCQkJCQkJCVwKKwl2YWwgPSBzaW1wbGVfc3RydG91bChjcCwgJnRhaWwsIGJhc2UpOwkJCQlcCisJaWYgKCgqdGFpbCA9PSAnXDAnKSB8fAkJCQkJCVwKKwkJKChsZW4gPT0gKHNpemVfdCkodGFpbCAtIGNwKSArIDEpICYmICgqdGFpbCA9PSAnXG4nKSkpIHtcCisJCSpyZXMgPSB2YWw7CQkJCQkJXAorCQlyZXR1cm4gMDsJCQkJCQlcCisJfQkJCQkJCQkJXAorCQkJCQkJCQkJXAorCXJldHVybiAtRUlOVkFMOwkJCQkJCQlcCit9CQkJCQkJCQkJXAorCisjZGVmaW5lIGRlZmluZV9zdHJpY3Rfc3RydG94KHR5cGUsIHZhbHR5cGUpCQkJCVwKK2ludCBzdHJpY3Rfc3RydG8jI3R5cGUoY29uc3QgY2hhciAqY3AsIHVuc2lnbmVkIGludCBiYXNlLCB2YWx0eXBlICpyZXMpCVwKK3sJCQkJCQkJCQlcCisJaW50IHJldDsJCQkJCQkJXAorCWlmICgqY3AgPT0gJy0nKSB7CQkJCQkJXAorCQlyZXQgPSBzdHJpY3Rfc3RydG91IyN0eXBlKGNwKzEsIGJhc2UsIHJlcyk7CQlcCisJCWlmIChyZXQgIT0gMCkJCQkJCQlcCisJCQkqcmVzID0gLSgqcmVzKTsJCQkJCVwKKwl9IGVsc2UJCQkJCQkJCVwKKwkJcmV0ID0gc3RyaWN0X3N0cnRvdSMjdHlwZShjcCwgYmFzZSwgcmVzKTsJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gcmV0OwkJCQkJCQlcCit9CQkJCQkJCQkJXAorCitkZWZpbmVfc3RyaWN0X3N0cnRvdXgobCwgdW5zaWduZWQgbG9uZykKK2RlZmluZV9zdHJpY3Rfc3RydG94KGwsIGxvbmcpCitkZWZpbmVfc3RyaWN0X3N0cnRvdXgobGwsIHVuc2lnbmVkIGxvbmcgbG9uZykKK2RlZmluZV9zdHJpY3Rfc3RydG94KGxsLCBsb25nIGxvbmcpCisKK0VYUE9SVF9TWU1CT0woc3RyaWN0X3N0cnRvdWwpOworRVhQT1JUX1NZTUJPTChzdHJpY3Rfc3RydG9sKTsKK0VYUE9SVF9TWU1CT0woc3RyaWN0X3N0cnRvbGwpOworRVhQT1JUX1NZTUJPTChzdHJpY3Rfc3RydG91bGwpOworCiBzdGF0aWMgaW50IHNraXBfYXRvaShjb25zdCBjaGFyICoqcykKIHsKIAlpbnQgaT0wOwpkaWZmIC0tZ2l0IGEvbW0vTWFrZWZpbGUgYi9tbS9NYWtlZmlsZQppbmRleCA0YWY1ZGZmLi45ZjExN2JhIDEwMDY0NAotLS0gYS9tbS9NYWtlZmlsZQorKysgYi9tbS9NYWtlZmlsZQpAQCAtMzIsNCArMzIsNSBAQAogb2JqLSQoQ09ORklHX01JR1JBVElPTikgKz0gbWlncmF0ZS5vCiBvYmotJChDT05GSUdfU01QKSArPSBhbGxvY3BlcmNwdS5vCiBvYmotJChDT05GSUdfUVVJQ0tMSVNUKSArPSBxdWlja2xpc3Qubworb2JqLSQoQ09ORklHX0NHUk9VUF9NRU1fQ09OVCkgKz0gbWVtY29udHJvbC5vCiAKZGlmZiAtLWdpdCBhL21tL2Jvb3RtZW0uYyBiL21tL2Jvb3RtZW0uYwppbmRleCAwMGE5Njk3Li5mNmZmNDMzIDEwMDY0NAotLS0gYS9tbS9ib290bWVtLmMKKysrIGIvbW0vYm9vdG1lbS5jCkBAIC0xMTEsMTEgKzExMSwxMiBAQAogICogbWlnaHQgYmUgdXNlZCBmb3IgYm9vdC10aW1lIGFsbG9jYXRpb25zIC0gb3IgaXQgbWlnaHQgZ2V0IGFkZGVkCiAgKiB0byB0aGUgZnJlZSBwYWdlIHBvb2wgbGF0ZXIgb24uCiAgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCByZXNlcnZlX2Jvb3RtZW1fY29yZShib290bWVtX2RhdGFfdCAqYmRhdGEsIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJCQkJdW5zaWduZWQgbG9uZyBzaXplKQorc3RhdGljIGludCBfX2luaXQgcmVzZXJ2ZV9ib290bWVtX2NvcmUoYm9vdG1lbV9kYXRhX3QgKmJkYXRhLAorCQkJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsIGludCBmbGFncykKIHsKIAl1bnNpZ25lZCBsb25nIHNpZHgsIGVpZHg7CiAJdW5zaWduZWQgbG9uZyBpOworCWludCByZXQ7CiAKIAkvKgogCSAqIHJvdW5kIHVwLCBwYXJ0aWFsbHkgcmVzZXJ2ZWQgcGFnZXMgYXJlIGNvbnNpZGVyZWQKQEAgLTEzMyw3ICsxMzQsMjAgQEAKICNpZmRlZiBDT05GSUdfREVCVUdfQk9PVE1FTQogCQkJcHJpbnRrKCJobSwgcGFnZSAlMDhseCByZXNlcnZlZCB0d2ljZS5cbiIsIGkqUEFHRV9TSVpFKTsKICNlbmRpZgorCQkJaWYgKGZsYWdzICYgQk9PVE1FTV9FWENMVVNJVkUpIHsKKwkJCQlyZXQgPSAtRUJVU1k7CisJCQkJZ290byBlcnI7CisJCQl9CiAJCX0KKworCXJldHVybiAwOworCitlcnI6CisJLyogdW5yZXNlcnZlIG1lbW9yeSB3ZSBhY2NpZGVudGFsbHkgcmVzZXJ2ZWQgKi8KKwlmb3IgKGktLTsgaSA+PSBzaWR4OyBpLS0pCisJCWNsZWFyX2JpdChpLCBiZGF0YS0+bm9kZV9ib290bWVtX21hcCk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgZnJlZV9ib290bWVtX2NvcmUoYm9vdG1lbV9kYXRhX3QgKmJkYXRhLCB1bnNpZ25lZCBsb25nIGFkZHIsCkBAIC0zNzQsOSArMzg4LDkgQEAKIH0KIAogdm9pZCBfX2luaXQgcmVzZXJ2ZV9ib290bWVtX25vZGUocGdfZGF0YV90ICpwZ2RhdCwgdW5zaWduZWQgbG9uZyBwaHlzYWRkciwKLQkJCQkgdW5zaWduZWQgbG9uZyBzaXplKQorCQkJCSB1bnNpZ25lZCBsb25nIHNpemUsIGludCBmbGFncykKIHsKLQlyZXNlcnZlX2Jvb3RtZW1fY29yZShwZ2RhdC0+YmRhdGEsIHBoeXNhZGRyLCBzaXplKTsKKwlyZXNlcnZlX2Jvb3RtZW1fY29yZShwZ2RhdC0+YmRhdGEsIHBoeXNhZGRyLCBzaXplLCBmbGFncyk7CiB9CiAKIHZvaWQgX19pbml0IGZyZWVfYm9vdG1lbV9ub2RlKHBnX2RhdGFfdCAqcGdkYXQsIHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsCkBAIC0zOTgsOSArNDEyLDEwIEBACiB9CiAKICNpZm5kZWYgQ09ORklHX0hBVkVfQVJDSF9CT09UTUVNX05PREUKLXZvaWQgX19pbml0IHJlc2VydmVfYm9vdG1lbSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK2ludCBfX2luaXQgcmVzZXJ2ZV9ib290bWVtKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJICAgIGludCBmbGFncykKIHsKLQlyZXNlcnZlX2Jvb3RtZW1fY29yZShOT0RFX0RBVEEoMCktPmJkYXRhLCBhZGRyLCBzaXplKTsKKwlyZXR1cm4gcmVzZXJ2ZV9ib290bWVtX2NvcmUoTk9ERV9EQVRBKDApLT5iZGF0YSwgYWRkciwgc2l6ZSwgZmxhZ3MpOwogfQogI2VuZGlmIC8qICFDT05GSUdfSEFWRV9BUkNIX0JPT1RNRU1fTk9ERSAqLwogCmRpZmYgLS1naXQgYS9tbS9maWxlbWFwLmMgYi9tbS9maWxlbWFwLmMKaW5kZXggODFmYjliZi4uYjdiMWJlNiAxMDA2NDQKLS0tIGEvbW0vZmlsZW1hcC5jCisrKyBiL21tL2ZpbGVtYXAuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1c2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPiAvKiBmb3IgQlVHX09OKCFpbl9hdG9taWMoKSkgb25seSAqLworI2luY2x1ZGUgPGxpbnV4L21lbWNvbnRyb2wuaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiAvKgpAQCAtMTE4LDYgKzExOSw3IEBACiB7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOwogCisJbWVtX2Nncm91cF91bmNoYXJnZV9wYWdlKHBhZ2UpOwogCXJhZGl4X3RyZWVfZGVsZXRlKCZtYXBwaW5nLT5wYWdlX3RyZWUsIHBhZ2UtPmluZGV4KTsKIAlwYWdlLT5tYXBwaW5nID0gTlVMTDsKIAltYXBwaW5nLT5ucnBhZ2VzLS07CkBAIC00NTgsOCArNDYwLDEyIEBACiBpbnQgYWRkX3RvX3BhZ2VfY2FjaGUoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAogCQlwZ29mZl90IG9mZnNldCwgZ2ZwX3QgZ2ZwX21hc2spCiB7Ci0JaW50IGVycm9yID0gcmFkaXhfdHJlZV9wcmVsb2FkKGdmcF9tYXNrICYgfl9fR0ZQX0hJR0hNRU0pOworCWludCBlcnJvciA9IG1lbV9jZ3JvdXBfY2FjaGVfY2hhcmdlKHBhZ2UsIGN1cnJlbnQtPm1tLAorCQkJCQlnZnBfbWFzayAmIH5fX0dGUF9ISUdITUVNKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OwogCisJZXJyb3IgPSByYWRpeF90cmVlX3ByZWxvYWQoZ2ZwX21hc2sgJiB+X19HRlBfSElHSE1FTSk7CiAJaWYgKGVycm9yID09IDApIHsKIAkJd3JpdGVfbG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CiAJCWVycm9yID0gcmFkaXhfdHJlZV9pbnNlcnQoJm1hcHBpbmctPnBhZ2VfdHJlZSwgb2Zmc2V0LCBwYWdlKTsKQEAgLTQ3MCwxMCArNDc2LDE0IEBACiAJCQlwYWdlLT5pbmRleCA9IG9mZnNldDsKIAkJCW1hcHBpbmctPm5ycGFnZXMrKzsKIAkJCV9faW5jX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9GSUxFX1BBR0VTKTsKLQkJfQorCQl9IGVsc2UKKwkJCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZShwYWdlKTsKKwogCQl3cml0ZV91bmxvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOwogCQlyYWRpeF90cmVlX3ByZWxvYWRfZW5kKCk7Ci0JfQorCX0gZWxzZQorCQltZW1fY2dyb3VwX3VuY2hhcmdlX3BhZ2UocGFnZSk7CitvdXQ6CiAJcmV0dXJuIGVycm9yOwogfQogRVhQT1JUX1NZTUJPTChhZGRfdG9fcGFnZV9jYWNoZSk7CkBAIC04NjUsOSArODc1LDcgQEAKIH0KIAogLyoqCi0gKiBkb19nZW5lcmljX21hcHBpbmdfcmVhZCAtIGdlbmVyaWMgZmlsZSByZWFkIHJvdXRpbmUKLSAqIEBtYXBwaW5nOglhZGRyZXNzX3NwYWNlIHRvIGJlIHJlYWQKLSAqIEByYToJCWZpbGUncyByZWFkYWhlYWQgc3RhdGUKKyAqIGRvX2dlbmVyaWNfZmlsZV9yZWFkIC0gZ2VuZXJpYyBmaWxlIHJlYWQgcm91dGluZQogICogQGZpbHA6CXRoZSBmaWxlIHRvIHJlYWQKICAqIEBwcG9zOgljdXJyZW50IGZpbGUgcG9zaXRpb24KICAqIEBkZXNjOglyZWFkX2Rlc2NyaXB0b3IKQEAgLTg3OCwxOCArODg2LDEzIEBACiAgKgogICogVGhpcyBpcyByZWFsbHkgdWdseS4gQnV0IHRoZSBnb3RvJ3MgYWN0dWFsbHkgdHJ5IHRvIGNsYXJpZnkgc29tZQogICogb2YgdGhlIGxvZ2ljIHdoZW4gaXQgY29tZXMgdG8gZXJyb3IgaGFuZGxpbmcgZXRjLgotICoKLSAqIE5vdGUgdGhlIHN0cnVjdCBmaWxlKiBpcyBvbmx5IHBhc3NlZCBmb3IgdGhlIHVzZSBvZiByZWFkcGFnZS4KLSAqIEl0IG1heSBiZSBOVUxMLgogICovCi12b2lkIGRvX2dlbmVyaWNfbWFwcGluZ19yZWFkKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAotCQkJICAgICBzdHJ1Y3QgZmlsZV9yYV9zdGF0ZSAqcmEsCi0JCQkgICAgIHN0cnVjdCBmaWxlICpmaWxwLAotCQkJICAgICBsb2ZmX3QgKnBwb3MsCi0JCQkgICAgIHJlYWRfZGVzY3JpcHRvcl90ICpkZXNjLAotCQkJICAgICByZWFkX2FjdG9yX3QgYWN0b3IpCitzdGF0aWMgdm9pZCBkb19nZW5lcmljX2ZpbGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgbG9mZl90ICpwcG9zLAorCQlyZWFkX2Rlc2NyaXB0b3JfdCAqZGVzYywgcmVhZF9hY3Rvcl90IGFjdG9yKQogeworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlscC0+Zl9tYXBwaW5nOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCXN0cnVjdCBmaWxlX3JhX3N0YXRlICpyYSA9ICZmaWxwLT5mX3JhOwogCXBnb2ZmX3QgaW5kZXg7CiAJcGdvZmZfdCBsYXN0X2luZGV4OwogCXBnb2ZmX3QgcHJldl9pbmRleDsKQEAgLTEwODEsNyArMTA4NCw2IEBACiAJaWYgKGZpbHApCiAJCWZpbGVfYWNjZXNzZWQoZmlscCk7CiB9Ci1FWFBPUlRfU1lNQk9MKGRvX2dlbmVyaWNfbWFwcGluZ19yZWFkKTsKIAogaW50IGZpbGVfcmVhZF9hY3RvcihyZWFkX2Rlc2NyaXB0b3JfdCAqZGVzYywgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCQl1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKQpAQCAtMTMyMiw3ICsxMzI0LDcgQEAKIAlzdHJ1Y3QgZmlsZV9yYV9zdGF0ZSAqcmEgPSAmZmlsZS0+Zl9yYTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl1bnNpZ25lZCBsb25nIHNpemU7CisJcGdvZmZfdCBzaXplOwogCWludCBkaWRfcmVhZGFyb3VuZCA9IDA7CiAJaW50IHJldCA9IDA7CiAKZGlmZiAtLWdpdCBhL21tL2ZpbGVtYXBfeGlwLmMgYi9tbS9maWxlbWFwX3hpcC5jCmluZGV4IDA0MjBhMDIuLjVlNTk4YzQgMTAwNjQ0Ci0tLSBhL21tL2ZpbGVtYXBfeGlwLmMKKysrIGIvbW0vZmlsZW1hcF94aXAuYwpAQCAtNTYsNyArNTYsOCBAQAogCQkgICAgcmVhZF9hY3Rvcl90IGFjdG9yKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OwotCXVuc2lnbmVkIGxvbmcgaW5kZXgsIGVuZF9pbmRleCwgb2Zmc2V0OworCXBnb2ZmX3QgaW5kZXgsIGVuZF9pbmRleDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKIAlsb2ZmX3QgaXNpemU7CiAKIAlCVUdfT04oIW1hcHBpbmctPmFfb3BzLT5nZXRfeGlwX3BhZ2UpOwpkaWZmIC0tZ2l0IGEvbW0vaHVnZXRsYi5jIGIvbW0vaHVnZXRsYi5jCmluZGV4IDFhNTY0MjAuLmQ5YTM4MDMgMTAwNjQ0Ci0tLSBhL21tL2h1Z2V0bGIuYworKysgYi9tbS9odWdldGxiLmMKQEAgLTYwNSw2ICs2MDUsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IGh1Z2V0bGJfb3ZlcmNvbW1pdF9oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCQlzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwKKwkJCXNpemVfdCAqbGVuZ3RoLCBsb2ZmX3QgKnBwb3MpCit7CisJc3Bpbl9sb2NrKCZodWdldGxiX2xvY2spOworCXByb2NfZG91bG9uZ3ZlY19taW5tYXgodGFibGUsIHdyaXRlLCBmaWxlLCBidWZmZXIsIGxlbmd0aCwgcHBvcyk7CisJc3Bpbl91bmxvY2soJmh1Z2V0bGJfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKICNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCiAKIGludCBodWdldGxiX3JlcG9ydF9tZW1pbmZvKGNoYXIgKmJ1ZikKZGlmZiAtLWdpdCBhL21tL21lbWNvbnRyb2wuYyBiL21tL21lbWNvbnRyb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmRlZDg0Ci0tLSAvZGV2L251bGwKKysrIGIvbW0vbWVtY29udHJvbC5jCkBAIC0wLDAgKzEsMTE5MiBAQAorLyogbWVtY29udHJvbC5jIC0gTWVtb3J5IENvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uLCAyMDA3CisgKiBBdXRob3IgQmFsYmlyIFNpbmdoIDxiYWxiaXJAbGludXgudm5ldC5pYm0uY29tPgorICoKKyAqIENvcHlyaWdodCAyMDA3IE9wZW5WWiBTV3NvZnQgSW5jCisgKiBBdXRob3I6IFBhdmVsIEVtZWxpYW5vdiA8eGVtdWxAb3BlbnZ6Lm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3Jlc19jb3VudGVyLmg+CisjaW5jbHVkZSA8bGludXgvbWVtY29udHJvbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nncm91cC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZS1mbGFncy5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvYml0X3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdHJ1Y3QgY2dyb3VwX3N1YnN5cyBtZW1fY2dyb3VwX3N1YnN5czsKK3N0YXRpYyBjb25zdCBpbnQgTUVNX0NHUk9VUF9SRUNMQUlNX1JFVFJJRVMgPSA1OworCisvKgorICogU3RhdGlzdGljcyBmb3IgbWVtb3J5IGNncm91cC4KKyAqLworZW51bSBtZW1fY2dyb3VwX3N0YXRfaW5kZXggeworCS8qCisJICogRm9yIE1FTV9DT05UQUlORVJfVFlQRV9BTEwsIHVzYWdlID0gcGFnZWNhY2hlICsgcnNzLgorCSAqLworCU1FTV9DR1JPVVBfU1RBVF9DQUNIRSwgCSAgIC8qICMgb2YgcGFnZXMgY2hhcmdlZCBhcyBjYWNoZSAqLworCU1FTV9DR1JPVVBfU1RBVF9SU1MsCSAgIC8qICMgb2YgcGFnZXMgY2hhcmdlZCBhcyByc3MgKi8KKworCU1FTV9DR1JPVVBfU1RBVF9OU1RBVFMsCit9OworCitzdHJ1Y3QgbWVtX2Nncm91cF9zdGF0X2NwdSB7CisJczY0IGNvdW50W01FTV9DR1JPVVBfU1RBVF9OU1RBVFNdOworfSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOworCitzdHJ1Y3QgbWVtX2Nncm91cF9zdGF0IHsKKwlzdHJ1Y3QgbWVtX2Nncm91cF9zdGF0X2NwdSBjcHVzdGF0W05SX0NQVVNdOworfTsKKworLyoKKyAqIEZvciBhY2NvdW50aW5nIHVuZGVyIGlycSBkaXNhYmxlLCBubyBuZWVkIGZvciBpbmNyZW1lbnQgcHJlZW1wdCBjb3VudC4KKyAqLworc3RhdGljIHZvaWQgX19tZW1fY2dyb3VwX3N0YXRfYWRkX3NhZmUoc3RydWN0IG1lbV9jZ3JvdXBfc3RhdCAqc3RhdCwKKwkJZW51bSBtZW1fY2dyb3VwX3N0YXRfaW5kZXggaWR4LCBpbnQgdmFsKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RhdC0+Y3B1c3RhdFtjcHVdLmNvdW50W2lkeF0gKz0gdmFsOworfQorCitzdGF0aWMgczY0IG1lbV9jZ3JvdXBfcmVhZF9zdGF0KHN0cnVjdCBtZW1fY2dyb3VwX3N0YXQgKnN0YXQsCisJCWVudW0gbWVtX2Nncm91cF9zdGF0X2luZGV4IGlkeCkKK3sKKwlpbnQgY3B1OworCXM2NCByZXQgPSAwOworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCisJCXJldCArPSBzdGF0LT5jcHVzdGF0W2NwdV0uY291bnRbaWR4XTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogcGVyLXpvbmUgaW5mb3JtYXRpb24gaW4gbWVtb3J5IGNvbnRyb2xsZXIuCisgKi8KKworZW51bSBtZW1fY2dyb3VwX3pzdGF0X2luZGV4IHsKKwlNRU1fQ0dST1VQX1pTVEFUX0FDVElWRSwKKwlNRU1fQ0dST1VQX1pTVEFUX0lOQUNUSVZFLAorCisJTlJfTUVNX0NHUk9VUF9aU1RBVCwKK307CisKK3N0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lIHsKKwkvKgorCSAqIHNwaW5fbG9jayB0byBwcm90ZWN0IHRoZSBwZXIgY2dyb3VwIExSVQorCSAqLworCXNwaW5sb2NrX3QJCWxydV9sb2NrOworCXN0cnVjdCBsaXN0X2hlYWQJYWN0aXZlX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAlpbmFjdGl2ZV9saXN0OworCXVuc2lnbmVkIGxvbmcgY291bnRbTlJfTUVNX0NHUk9VUF9aU1RBVF07Cit9OworLyogTWFjcm8gZm9yIGFjY2Vzc2luZyBjb3VudGVyICovCisjZGVmaW5lIE1FTV9DR1JPVVBfWlNUQVQobXosIGlkeCkJKChteiktPmNvdW50WyhpZHgpXSkKKworc3RydWN0IG1lbV9jZ3JvdXBfcGVyX25vZGUgeworCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lIHpvbmVpbmZvW01BWF9OUl9aT05FU107Cit9OworCitzdHJ1Y3QgbWVtX2Nncm91cF9scnVfaW5mbyB7CisJc3RydWN0IG1lbV9jZ3JvdXBfcGVyX25vZGUgKm5vZGVpbmZvW01BWF9OVU1OT0RFU107Cit9OworCisvKgorICogVGhlIG1lbW9yeSBjb250cm9sbGVyIGRhdGEgc3RydWN0dXJlLiBUaGUgbWVtb3J5IGNvbnRyb2xsZXIgY29udHJvbHMgYm90aAorICogcGFnZSBjYWNoZSBhbmQgUlNTIHBlciBjZ3JvdXAuIFdlIHdvdWxkIGV2ZW50dWFsbHkgbGlrZSB0byBwcm92aWRlCisgKiBzdGF0aXN0aWNzIGJhc2VkIG9uIHRoZSBzdGF0aXN0aWNzIGRldmVsb3BlZCBieSBSaWsgVmFuIFJpZWwgZm9yIGNsb2NrLXBybywKKyAqIHRvIGhlbHAgdGhlIGFkbWluaXN0cmF0b3IgZGV0ZXJtaW5lIHdoYXQga25vYnMgdG8gdHVuZS4KKyAqCisgKiBUT0RPOiBBZGQgYSB3YXRlciBtYXJrIGZvciB0aGUgbWVtb3J5IGNvbnRyb2xsZXIuIFJlY2xhaW0gd2lsbCBiZWdpbiB3aGVuCisgKiB3ZSBoaXQgdGhlIHdhdGVyIG1hcmsuIE1heSBiZSBldmVuIGFkZCBhIGxvdyB3YXRlciBtYXJrLCBzdWNoIHRoYXQKKyAqIG5vIHJlY2xhaW0gb2NjdXJzIGZyb20gYSBjZ3JvdXAgYXQgaXQncyBsb3cgd2F0ZXIgbWFyaywgdGhpcyBpcworICogYSBmZWF0dXJlIHRoYXQgd2lsbCBiZSBpbXBsZW1lbnRlZCBtdWNoIGxhdGVyIGluIHRoZSBmdXR1cmUuCisgKi8KK3N0cnVjdCBtZW1fY2dyb3VwIHsKKwlzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSBjc3M7CisJLyoKKwkgKiB0aGUgY291bnRlciB0byBhY2NvdW50IGZvciBtZW1vcnkgdXNhZ2UKKwkgKi8KKwlzdHJ1Y3QgcmVzX2NvdW50ZXIgcmVzOworCS8qCisJICogUGVyIGNncm91cCBhY3RpdmUgYW5kIGluYWN0aXZlIGxpc3QsIHNpbWlsYXIgdG8gdGhlCisJICogcGVyIHpvbmUgTFJVIGxpc3RzLgorCSAqLworCXN0cnVjdCBtZW1fY2dyb3VwX2xydV9pbmZvIGluZm87CisKKwlpbnQJcHJldl9wcmlvcml0eTsJLyogZm9yIHJlY29yZGluZyByZWNsYWltIHByaW9yaXR5ICovCisJLyoKKwkgKiBzdGF0aXN0aWNzLgorCSAqLworCXN0cnVjdCBtZW1fY2dyb3VwX3N0YXQgc3RhdDsKK307CisKKy8qCisgKiBXZSB1c2UgdGhlIGxvd2VyIGJpdCBvZiB0aGUgcGFnZS0+cGFnZV9jZ3JvdXAgcG9pbnRlciBhcyBhIGJpdCBzcGluCisgKiBsb2NrLiBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHBhZ2UtPnBhZ2VfY2dyb3VwIGlzIGF0bGVhc3QgdHdvCisgKiBieXRlIGFsaWduZWQgKGJhc2VkIG9uIGNvbW1lbnRzIGZyb20gTmljayBQaWdnaW4pCisgKi8KKyNkZWZpbmUgUEFHRV9DR1JPVVBfTE9DS19CSVQgCTB4MAorI2RlZmluZSBQQUdFX0NHUk9VUF9MT0NLIAkJKDEgPDwgUEFHRV9DR1JPVVBfTE9DS19CSVQpCisKKy8qCisgKiBBIHBhZ2VfY2dyb3VwIHBhZ2UgaXMgYXNzb2NpYXRlZCB3aXRoIGV2ZXJ5IHBhZ2UgZGVzY3JpcHRvci4gVGhlCisgKiBwYWdlX2Nncm91cCBoZWxwcyB1cyBpZGVudGlmeSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2dyb3VwCisgKi8KK3N0cnVjdCBwYWdlX2Nncm91cCB7CisJc3RydWN0IGxpc3RfaGVhZCBscnU7CQkvKiBwZXIgY2dyb3VwIExSVSBsaXN0ICovCisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbV9jZ3JvdXA7CisJYXRvbWljX3QgcmVmX2NudDsJCS8qIEhlbHBmdWwgd2hlbiBwYWdlcyBtb3ZlIGIvdyAgKi8KKwkJCQkJLyogbWFwcGVkIGFuZCBjYWNoZWQgc3RhdGVzICAgICAqLworCWludAkgZmxhZ3M7Cit9OworI2RlZmluZSBQQUdFX0NHUk9VUF9GTEFHX0NBQ0hFCSgweDEpCS8qIGNoYXJnZWQgYXMgY2FjaGUgKi8KKyNkZWZpbmUgUEFHRV9DR1JPVVBfRkxBR19BQ1RJVkUgKDB4MikJLyogcGFnZSBpcyBhY3RpdmUgaW4gdGhpcyBjZ3JvdXAgKi8KKworc3RhdGljIGlubGluZSBpbnQgcGFnZV9jZ3JvdXBfbmlkKHN0cnVjdCBwYWdlX2Nncm91cCAqcGMpCit7CisJcmV0dXJuIHBhZ2VfdG9fbmlkKHBjLT5wYWdlKTsKK30KKworc3RhdGljIGlubGluZSBlbnVtIHpvbmVfdHlwZSBwYWdlX2Nncm91cF96aWQoc3RydWN0IHBhZ2VfY2dyb3VwICpwYykKK3sKKwlyZXR1cm4gcGFnZV96b25lbnVtKHBjLT5wYWdlKTsKK30KKworZW51bSB7CisJTUVNX0NHUk9VUF9UWVBFX1VOU1BFQyA9IDAsCisJTUVNX0NHUk9VUF9UWVBFX01BUFBFRCwKKwlNRU1fQ0dST1VQX1RZUEVfQ0FDSEVELAorCU1FTV9DR1JPVVBfVFlQRV9BTEwsCisJTUVNX0NHUk9VUF9UWVBFX01BWCwKK307CisKK2VudW0gY2hhcmdlX3R5cGUgeworCU1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfQ0FDSEUgPSAwLAorCU1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfTUFQUEVELAorfTsKKworCisvKgorICogQWx3YXlzIG1vZGlmaWVkIHVuZGVyIGxydSBsb2NrLiBUaGVuLCBub3QgbmVjZXNzYXJ5IHRvIHByZWVtcHRfZGlzYWJsZSgpCisgKi8KK3N0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfY2hhcmdlX3N0YXRpc3RpY3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgaW50IGZsYWdzLAorCQkJCQlib29sIGNoYXJnZSkKK3sKKwlpbnQgdmFsID0gKGNoYXJnZSk/IDEgOiAtMTsKKwlzdHJ1Y3QgbWVtX2Nncm91cF9zdGF0ICpzdGF0ID0gJm1lbS0+c3RhdDsKKwlWTV9CVUdfT04oIWlycXNfZGlzYWJsZWQoKSk7CisKKwlpZiAoZmxhZ3MgJiBQQUdFX0NHUk9VUF9GTEFHX0NBQ0hFKQorCQlfX21lbV9jZ3JvdXBfc3RhdF9hZGRfc2FmZShzdGF0LAorCQkJCQlNRU1fQ0dST1VQX1NUQVRfQ0FDSEUsIHZhbCk7CisJZWxzZQorCQlfX21lbV9jZ3JvdXBfc3RhdF9hZGRfc2FmZShzdGF0LCBNRU1fQ0dST1VQX1NUQVRfUlNTLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICoKK21lbV9jZ3JvdXBfem9uZWluZm8oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgaW50IG5pZCwgaW50IHppZCkKK3sKKwlCVUdfT04oIW1lbS0+aW5mby5ub2RlaW5mb1tuaWRdKTsKKwlyZXR1cm4gJm1lbS0+aW5mby5ub2RlaW5mb1tuaWRdLT56b25laW5mb1t6aWRdOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICoKK3BhZ2VfY2dyb3VwX3pvbmVpbmZvKHN0cnVjdCBwYWdlX2Nncm91cCAqcGMpCit7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSA9IHBjLT5tZW1fY2dyb3VwOworCWludCBuaWQgPSBwYWdlX2Nncm91cF9uaWQocGMpOworCWludCB6aWQgPSBwYWdlX2Nncm91cF96aWQocGMpOworCisJcmV0dXJuIG1lbV9jZ3JvdXBfem9uZWluZm8obWVtLCBuaWQsIHppZCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1lbV9jZ3JvdXBfZ2V0X2FsbF96b25lc3RhdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAorCQkJCQllbnVtIG1lbV9jZ3JvdXBfenN0YXRfaW5kZXggaWR4KQoreworCWludCBuaWQsIHppZDsKKwlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7CisJdTY0IHRvdGFsID0gMDsKKworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkKKwkJZm9yICh6aWQgPSAwOyB6aWQgPCBNQVhfTlJfWk9ORVM7IHppZCsrKSB7CisJCQlteiA9IG1lbV9jZ3JvdXBfem9uZWluZm8obWVtLCBuaWQsIHppZCk7CisJCQl0b3RhbCArPSBNRU1fQ0dST1VQX1pTVEFUKG16LCBpZHgpOworCQl9CisJcmV0dXJuIHRvdGFsOworfQorCitzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgaW5pdF9tZW1fY2dyb3VwOworCitzdGF0aWMgaW5saW5lCitzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtX2Nncm91cF9mcm9tX2NvbnQoc3RydWN0IGNncm91cCAqY29udCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGNncm91cF9zdWJzeXNfc3RhdGUoY29udCwKKwkJCQltZW1fY2dyb3VwX3N1YnN5c19pZCksIHN0cnVjdCBtZW1fY2dyb3VwLAorCQkJCWNzcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBtZW1fY2dyb3VwICptZW1fY2dyb3VwX2Zyb21fdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZih0YXNrX3N1YnN5c19zdGF0ZShwLCBtZW1fY2dyb3VwX3N1YnN5c19pZCksCisJCQkJc3RydWN0IG1lbV9jZ3JvdXAsIGNzcyk7Cit9CisKK3ZvaWQgbW1faW5pdF9jZ3JvdXAoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtOworCisJbWVtID0gbWVtX2Nncm91cF9mcm9tX3Rhc2socCk7CisJY3NzX2dldCgmbWVtLT5jc3MpOworCW1tLT5tZW1fY2dyb3VwID0gbWVtOworfQorCit2b2lkIG1tX2ZyZWVfY2dyb3VwKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCWNzc19wdXQoJm1tLT5tZW1fY2dyb3VwLT5jc3MpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwYWdlX2Nncm91cF9sb2NrZWQoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIGJpdF9zcGluX2lzX2xvY2tlZChQQUdFX0NHUk9VUF9MT0NLX0JJVCwKKwkJCQkJJnBhZ2UtPnBhZ2VfY2dyb3VwKTsKK30KKwordm9pZCBwYWdlX2Fzc2lnbl9wYWdlX2Nncm91cChzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHBhZ2VfY2dyb3VwICpwYykKK3sKKwlpbnQgbG9ja2VkOworCisJLyoKKwkgKiBXaGlsZSByZXNldHRpbmcgdGhlIHBhZ2VfY2dyb3VwIHdlIG1pZ2h0IG5vdCBob2xkIHRoZQorCSAqIHBhZ2VfY2dyb3VwIGxvY2suIGZyZWVfaG90X2NvbGRfcGFnZSgpIGlzIGFuIGV4YW1wbGUKKwkgKiBvZiBzdWNoIGEgc2NlbmFyaW8KKwkgKi8KKwlpZiAocGMpCisJCVZNX0JVR19PTighcGFnZV9jZ3JvdXBfbG9ja2VkKHBhZ2UpKTsKKwlsb2NrZWQgPSAocGFnZS0+cGFnZV9jZ3JvdXAgJiBQQUdFX0NHUk9VUF9MT0NLKTsKKwlwYWdlLT5wYWdlX2Nncm91cCA9ICgodW5zaWduZWQgbG9uZylwYyB8IGxvY2tlZCk7Cit9CisKK3N0cnVjdCBwYWdlX2Nncm91cCAqcGFnZV9nZXRfcGFnZV9jZ3JvdXAoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIChzdHJ1Y3QgcGFnZV9jZ3JvdXAgKikKKwkJKHBhZ2UtPnBhZ2VfY2dyb3VwICYgflBBR0VfQ0dST1VQX0xPQ0spOworfQorCitzdGF0aWMgdm9pZCBfX2Fsd2F5c19pbmxpbmUgbG9ja19wYWdlX2Nncm91cChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwliaXRfc3Bpbl9sb2NrKFBBR0VfQ0dST1VQX0xPQ0tfQklULCAmcGFnZS0+cGFnZV9jZ3JvdXApOworCVZNX0JVR19PTighcGFnZV9jZ3JvdXBfbG9ja2VkKHBhZ2UpKTsKK30KKworc3RhdGljIHZvaWQgX19hbHdheXNfaW5saW5lIHVubG9ja19wYWdlX2Nncm91cChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwliaXRfc3Bpbl91bmxvY2soUEFHRV9DR1JPVVBfTE9DS19CSVQsICZwYWdlLT5wYWdlX2Nncm91cCk7Cit9CisKKy8qCisgKiBUaWUgbmV3IHBhZ2VfY2dyb3VwIHRvIHN0cnVjdCBwYWdlIHVuZGVyIGxvY2tfcGFnZV9jZ3JvdXAoKQorICogVGhpcyBjYW4gZmFpbCBpZiB0aGUgcGFnZSBoYXMgYmVlbiB0aWVkIHRvIGEgcGFnZV9jZ3JvdXAuCisgKiBJZiBzdWNjZXNzLCByZXR1cm5zIDAuCisgKi8KK3N0YXRpYyBpbnQgcGFnZV9jZ3JvdXBfYXNzaWduX25ld19wYWdlX2Nncm91cChzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkJCXN0cnVjdCBwYWdlX2Nncm91cCAqcGMpCit7CisJaW50IHJldCA9IDA7CisKKwlsb2NrX3BhZ2VfY2dyb3VwKHBhZ2UpOworCWlmICghcGFnZV9nZXRfcGFnZV9jZ3JvdXAocGFnZSkpCisJCXBhZ2VfYXNzaWduX3BhZ2VfY2dyb3VwKHBhZ2UsIHBjKTsKKwllbHNlIC8qIEEgcGFnZSBpcyB0aWVkIHRvIG90aGVyIHBjLiAqLworCQlyZXQgPSAxOworCXVubG9ja19wYWdlX2Nncm91cChwYWdlKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQ2xlYXIgcGFnZS0+cGFnZV9jZ3JvdXAgbWVtYmVyIHVuZGVyIGxvY2tfcGFnZV9jZ3JvdXAoKS4KKyAqIElmIGdpdmVuICJwYyIgdmFsdWUgaXMgZGlmZmVyZW50IGZyb20gb25lIHBhZ2UtPnBhZ2VfY2dyb3VwLAorICogcGFnZS0+Y2dyb3VwIGlzIG5vdCBjbGVhcmVkLgorICogUmV0dXJucyBhIHZhbHVlIG9mIHBhZ2UtPnBhZ2VfY2dyb3VwIGF0IGxvY2sgdGFrZW4uCisgKiBBIGNhbiBjYW4gZGV0ZWN0IGZhaWx1cmUgb2YgY2xlYXJpbmcgYnkgZm9sbG93aW5nCisgKiAgY2xlYXJfcGFnZV9jZ3JvdXAocGFnZSwgcGMpID09IHBjCisgKi8KKworc3RhdGljIHN0cnVjdCBwYWdlX2Nncm91cCAqY2xlYXJfcGFnZV9jZ3JvdXAoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJCQlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjKQoreworCXN0cnVjdCBwYWdlX2Nncm91cCAqcmV0OworCS8qIGxvY2sgYW5kIGNsZWFyICovCisJbG9ja19wYWdlX2Nncm91cChwYWdlKTsKKwlyZXQgPSBwYWdlX2dldF9wYWdlX2Nncm91cChwYWdlKTsKKwlpZiAobGlrZWx5KHJldCA9PSBwYykpCisJCXBhZ2VfYXNzaWduX3BhZ2VfY2dyb3VwKHBhZ2UsIE5VTEwpOworCXVubG9ja19wYWdlX2Nncm91cChwYWdlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX21lbV9jZ3JvdXBfcmVtb3ZlX2xpc3Qoc3RydWN0IHBhZ2VfY2dyb3VwICpwYykKK3sKKwlpbnQgZnJvbSA9IHBjLT5mbGFncyAmIFBBR0VfQ0dST1VQX0ZMQUdfQUNUSVZFOworCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICpteiA9IHBhZ2VfY2dyb3VwX3pvbmVpbmZvKHBjKTsKKworCWlmIChmcm9tKQorCQlNRU1fQ0dST1VQX1pTVEFUKG16LCBNRU1fQ0dST1VQX1pTVEFUX0FDVElWRSkgLT0gMTsKKwllbHNlCisJCU1FTV9DR1JPVVBfWlNUQVQobXosIE1FTV9DR1JPVVBfWlNUQVRfSU5BQ1RJVkUpIC09IDE7CisKKwltZW1fY2dyb3VwX2NoYXJnZV9zdGF0aXN0aWNzKHBjLT5tZW1fY2dyb3VwLCBwYy0+ZmxhZ3MsIGZhbHNlKTsKKwlsaXN0X2RlbF9pbml0KCZwYy0+bHJ1KTsKK30KKworc3RhdGljIHZvaWQgX19tZW1fY2dyb3VwX2FkZF9saXN0KHN0cnVjdCBwYWdlX2Nncm91cCAqcGMpCit7CisJaW50IHRvID0gcGMtPmZsYWdzICYgUEFHRV9DR1JPVVBfRkxBR19BQ1RJVkU7CisJc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKm16ID0gcGFnZV9jZ3JvdXBfem9uZWluZm8ocGMpOworCisJaWYgKCF0bykgeworCQlNRU1fQ0dST1VQX1pTVEFUKG16LCBNRU1fQ0dST1VQX1pTVEFUX0lOQUNUSVZFKSArPSAxOworCQlsaXN0X2FkZCgmcGMtPmxydSwgJm16LT5pbmFjdGl2ZV9saXN0KTsKKwl9IGVsc2UgeworCQlNRU1fQ0dST1VQX1pTVEFUKG16LCBNRU1fQ0dST1VQX1pTVEFUX0FDVElWRSkgKz0gMTsKKwkJbGlzdF9hZGQoJnBjLT5scnUsICZtei0+YWN0aXZlX2xpc3QpOworCX0KKwltZW1fY2dyb3VwX2NoYXJnZV9zdGF0aXN0aWNzKHBjLT5tZW1fY2dyb3VwLCBwYy0+ZmxhZ3MsIHRydWUpOworfQorCitzdGF0aWMgdm9pZCBfX21lbV9jZ3JvdXBfbW92ZV9saXN0cyhzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjLCBib29sIGFjdGl2ZSkKK3sKKwlpbnQgZnJvbSA9IHBjLT5mbGFncyAmIFBBR0VfQ0dST1VQX0ZMQUdfQUNUSVZFOworCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICpteiA9IHBhZ2VfY2dyb3VwX3pvbmVpbmZvKHBjKTsKKworCWlmIChmcm9tKQorCQlNRU1fQ0dST1VQX1pTVEFUKG16LCBNRU1fQ0dST1VQX1pTVEFUX0FDVElWRSkgLT0gMTsKKwllbHNlCisJCU1FTV9DR1JPVVBfWlNUQVQobXosIE1FTV9DR1JPVVBfWlNUQVRfSU5BQ1RJVkUpIC09IDE7CisKKwlpZiAoYWN0aXZlKSB7CisJCU1FTV9DR1JPVVBfWlNUQVQobXosIE1FTV9DR1JPVVBfWlNUQVRfQUNUSVZFKSArPSAxOworCQlwYy0+ZmxhZ3MgfD0gUEFHRV9DR1JPVVBfRkxBR19BQ1RJVkU7CisJCWxpc3RfbW92ZSgmcGMtPmxydSwgJm16LT5hY3RpdmVfbGlzdCk7CisJfSBlbHNlIHsKKwkJTUVNX0NHUk9VUF9aU1RBVChteiwgTUVNX0NHUk9VUF9aU1RBVF9JTkFDVElWRSkgKz0gMTsKKwkJcGMtPmZsYWdzICY9IH5QQUdFX0NHUk9VUF9GTEFHX0FDVElWRTsKKwkJbGlzdF9tb3ZlKCZwYy0+bHJ1LCAmbXotPmluYWN0aXZlX2xpc3QpOworCX0KK30KKworaW50IHRhc2tfaW5fbWVtX2Nncm91cChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNvbnN0IHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCit7CisJaW50IHJldDsKKworCXRhc2tfbG9jayh0YXNrKTsKKwlyZXQgPSB0YXNrLT5tbSAmJiB2bV9tYXRjaF9jZ3JvdXAodGFzay0+bW0sIG1lbSk7CisJdGFza191bmxvY2sodGFzayk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgdGhlIGFwcHJvcHJpYXRlIHpvbmUncyBscnUgbG9jayBpcyBhbHJlYWR5IGhlbGQKKyAqLwordm9pZCBtZW1fY2dyb3VwX21vdmVfbGlzdHMoc3RydWN0IHBhZ2VfY2dyb3VwICpwYywgYm9vbCBhY3RpdmUpCit7CisJc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKm16OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIXBjKQorCQlyZXR1cm47CisKKwlteiA9IHBhZ2VfY2dyb3VwX3pvbmVpbmZvKHBjKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXotPmxydV9sb2NrLCBmbGFncyk7CisJX19tZW1fY2dyb3VwX21vdmVfbGlzdHMocGMsIGFjdGl2ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXotPmxydV9sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgbWFwcGVkX3JhdGlvIHVuZGVyIG1lbW9yeSBjb250cm9sbGVyLiBUaGlzIHdpbGwgYmUgdXNlZCBpbgorICogdm1zY2FuLmMgZm9yIGRldGVyZW1pbmluZyB3ZSBoYXZlIHRvIHJlY2xhaW0gbWFwcGVkIHBhZ2VzLgorICovCitpbnQgbWVtX2Nncm91cF9jYWxjX21hcHBlZF9yYXRpbyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKQoreworCWxvbmcgdG90YWwsIHJzczsKKworCS8qCisJICogdXNhZ2UgaXMgcmVjb3JkZWQgaW4gYnl0ZXMuIEJ1dCwgaGVyZSwgd2UgYXNzdW1lIHRoZSBudW1iZXIgb2YKKwkgKiBwaHlzaWNhbCBwYWdlcyBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgImxvbmciIG9uIGFueSBhcmNoLgorCSAqLworCXRvdGFsID0gKGxvbmcpIChtZW0tPnJlcy51c2FnZSA+PiBQQUdFX1NISUZUKSArIDFMOworCXJzcyA9IChsb25nKW1lbV9jZ3JvdXBfcmVhZF9zdGF0KCZtZW0tPnN0YXQsIE1FTV9DR1JPVVBfU1RBVF9SU1MpOworCXJldHVybiAoaW50KSgocnNzICogMTAwTCkgLyB0b3RhbCk7Cit9CisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB2bXNjYW4uYy4gSW4gcGFnZSByZWNsYWltaW5nIGxvb3AuIGJhbGFuY2UKKyAqIGJldHdlZW4gYWN0aXZlIGFuZCBpbmFjdGl2ZSBsaXN0IGlzIGNhbGN1bGF0ZWQuIEZvciBtZW1vcnkgY29udHJvbGxlcgorICogcGFnZSByZWNsYWltaW5nLCB3ZSBzaG91bGQgdXNlIHVzaW5nIG1lbV9jZ3JvdXAncyBpbWJhbGFuY2UgcmF0aGVyIHRoYW4KKyAqIHpvbmUncyBnbG9iYWwgbHJ1IGltYmFsYW5jZS4KKyAqLworbG9uZyBtZW1fY2dyb3VwX3JlY2xhaW1faW1iYWxhbmNlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCit7CisJdW5zaWduZWQgbG9uZyBhY3RpdmUsIGluYWN0aXZlOworCS8qIGFjdGl2ZSBhbmQgaW5hY3RpdmUgYXJlIHRoZSBudW1iZXIgb2YgcGFnZXMuICdsb25nJyBpcyBvay4qLworCWFjdGl2ZSA9IG1lbV9jZ3JvdXBfZ2V0X2FsbF96b25lc3RhdChtZW0sIE1FTV9DR1JPVVBfWlNUQVRfQUNUSVZFKTsKKwlpbmFjdGl2ZSA9IG1lbV9jZ3JvdXBfZ2V0X2FsbF96b25lc3RhdChtZW0sIE1FTV9DR1JPVVBfWlNUQVRfSU5BQ1RJVkUpOworCXJldHVybiAobG9uZykgKGFjdGl2ZSAvIChpbmFjdGl2ZSArIDEpKTsKK30KKworLyoKKyAqIHByZXZfcHJpb3JpdHkgY29udHJvbC4uLnRoaXMgd2lsbCBiZSB1c2VkIGluIG1lbW9yeSByZWNsYWltIHBhdGguCisgKi8KK2ludCBtZW1fY2dyb3VwX2dldF9yZWNsYWltX3ByaW9yaXR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCit7CisJcmV0dXJuIG1lbS0+cHJldl9wcmlvcml0eTsKK30KKwordm9pZCBtZW1fY2dyb3VwX25vdGVfcmVjbGFpbV9wcmlvcml0eShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBpbnQgcHJpb3JpdHkpCit7CisJaWYgKHByaW9yaXR5IDwgbWVtLT5wcmV2X3ByaW9yaXR5KQorCQltZW0tPnByZXZfcHJpb3JpdHkgPSBwcmlvcml0eTsKK30KKwordm9pZCBtZW1fY2dyb3VwX3JlY29yZF9yZWNsYWltX3ByaW9yaXR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGludCBwcmlvcml0eSkKK3sKKwltZW0tPnByZXZfcHJpb3JpdHkgPSBwcmlvcml0eTsKK30KKworLyoKKyAqIENhbGN1bGF0ZSAjIG9mIHBhZ2VzIHRvIGJlIHNjYW5uZWQgaW4gdGhpcyBwcmlvcml0eS96b25lLgorICogU2VlIGFsc28gdm1zY2FuLmMKKyAqCisgKiBwcmlvcml0eSBzdGFydHMgZnJvbSAiREVGX1BSSU9SSVRZIiBhbmQgZGVjcmVtZW50ZWQgaW4gZWFjaCBsb29wLgorICogKHNlZSBpbmNsdWRlL2xpbnV4L21tem9uZS5oKQorICovCisKK2xvbmcgbWVtX2Nncm91cF9jYWxjX3JlY2xhaW1fYWN0aXZlKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCisJCQkJICAgc3RydWN0IHpvbmUgKnpvbmUsIGludCBwcmlvcml0eSkKK3sKKwlsb25nIG5yX2FjdGl2ZTsKKwlpbnQgbmlkID0gem9uZS0+em9uZV9wZ2RhdC0+bm9kZV9pZDsKKwlpbnQgemlkID0gem9uZV9pZHgoem9uZSk7CisJc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKm16ID0gbWVtX2Nncm91cF96b25laW5mbyhtZW0sIG5pZCwgemlkKTsKKworCW5yX2FjdGl2ZSA9IE1FTV9DR1JPVVBfWlNUQVQobXosIE1FTV9DR1JPVVBfWlNUQVRfQUNUSVZFKTsKKwlyZXR1cm4gKG5yX2FjdGl2ZSA+PiBwcmlvcml0eSk7Cit9CisKK2xvbmcgbWVtX2Nncm91cF9jYWxjX3JlY2xhaW1faW5hY3RpdmUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwKKwkJCQkJc3RydWN0IHpvbmUgKnpvbmUsIGludCBwcmlvcml0eSkKK3sKKwlsb25nIG5yX2luYWN0aXZlOworCWludCBuaWQgPSB6b25lLT56b25lX3BnZGF0LT5ub2RlX2lkOworCWludCB6aWQgPSB6b25lX2lkeCh6b25lKTsKKwlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXogPSBtZW1fY2dyb3VwX3pvbmVpbmZvKG1lbSwgbmlkLCB6aWQpOworCisJbnJfaW5hY3RpdmUgPSBNRU1fQ0dST1VQX1pTVEFUKG16LCBNRU1fQ0dST1VQX1pTVEFUX0lOQUNUSVZFKTsKKworCXJldHVybiAobnJfaW5hY3RpdmUgPj4gcHJpb3JpdHkpOworfQorCit1bnNpZ25lZCBsb25nIG1lbV9jZ3JvdXBfaXNvbGF0ZV9wYWdlcyh1bnNpZ25lZCBsb25nIG5yX3RvX3NjYW4sCisJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKmRzdCwKKwkJCQkJdW5zaWduZWQgbG9uZyAqc2Nhbm5lZCwgaW50IG9yZGVyLAorCQkJCQlpbnQgbW9kZSwgc3RydWN0IHpvbmUgKnosCisJCQkJCXN0cnVjdCBtZW1fY2dyb3VwICptZW1fY29udCwKKwkJCQkJaW50IGFjdGl2ZSkKK3sKKwl1bnNpZ25lZCBsb25nIG5yX3Rha2VuID0gMDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBsb25nIHNjYW47CisJTElTVF9IRUFEKHBjX2xpc3QpOworCXN0cnVjdCBsaXN0X2hlYWQgKnNyYzsKKwlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjLCAqdG1wOworCWludCBuaWQgPSB6LT56b25lX3BnZGF0LT5ub2RlX2lkOworCWludCB6aWQgPSB6b25lX2lkeCh6KTsKKwlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7CisKKwlteiA9IG1lbV9jZ3JvdXBfem9uZWluZm8obWVtX2NvbnQsIG5pZCwgemlkKTsKKwlpZiAoYWN0aXZlKQorCQlzcmMgPSAmbXotPmFjdGl2ZV9saXN0OworCWVsc2UKKwkJc3JjID0gJm16LT5pbmFjdGl2ZV9saXN0OworCisKKwlzcGluX2xvY2soJm16LT5scnVfbG9jayk7CisJc2NhbiA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UocGMsIHRtcCwgc3JjLCBscnUpIHsKKwkJaWYgKHNjYW4gPj0gbnJfdG9fc2NhbikKKwkJCWJyZWFrOworCQlwYWdlID0gcGMtPnBhZ2U7CisJCVZNX0JVR19PTighcGMpOworCisJCWlmICh1bmxpa2VseSghUGFnZUxSVShwYWdlKSkpCisJCQljb250aW51ZTsKKworCQlpZiAoUGFnZUFjdGl2ZShwYWdlKSAmJiAhYWN0aXZlKSB7CisJCQlfX21lbV9jZ3JvdXBfbW92ZV9saXN0cyhwYywgdHJ1ZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIVBhZ2VBY3RpdmUocGFnZSkgJiYgYWN0aXZlKSB7CisJCQlfX21lbV9jZ3JvdXBfbW92ZV9saXN0cyhwYywgZmFsc2UpOworCQkJY29udGludWU7CisJCX0KKworCQlzY2FuKys7CisJCWxpc3RfbW92ZSgmcGMtPmxydSwgJnBjX2xpc3QpOworCisJCWlmIChfX2lzb2xhdGVfbHJ1X3BhZ2UocGFnZSwgbW9kZSkgPT0gMCkgeworCQkJbGlzdF9tb3ZlKCZwYWdlLT5scnUsIGRzdCk7CisJCQlucl90YWtlbisrOworCQl9CisJfQorCisJbGlzdF9zcGxpY2UoJnBjX2xpc3QsIHNyYyk7CisJc3Bpbl91bmxvY2soJm16LT5scnVfbG9jayk7CisKKwkqc2Nhbm5lZCA9IHNjYW47CisJcmV0dXJuIG5yX3Rha2VuOworfQorCisvKgorICogQ2hhcmdlIHRoZSBtZW1vcnkgY29udHJvbGxlciBmb3IgcGFnZSB1c2FnZS4KKyAqIFJldHVybgorICogMCBpZiB0aGUgY2hhcmdlIHdhcyBzdWNjZXNzZnVsCisgKiA8IDAgaWYgdGhlIGNncm91cCBpcyBvdmVyIGl0cyBsaW1pdAorICovCitzdGF0aWMgaW50IG1lbV9jZ3JvdXBfY2hhcmdlX2NvbW1vbihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkJZ2ZwX3QgZ2ZwX21hc2ssIGVudW0gY2hhcmdlX3R5cGUgY3R5cGUpCit7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbTsKKwlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBucl9yZXRyaWVzID0gTUVNX0NHUk9VUF9SRUNMQUlNX1JFVFJJRVM7CisJc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKm16OworCisJLyoKKwkgKiBTaG91bGQgcGFnZV9jZ3JvdXAncyBnbyB0byB0aGVpciBvd24gc2xhYj8KKwkgKiBPbmUgY291bGQgb3B0aW1pemUgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBjaGFyZ2luZyByb3V0aW5lCisJICogYnkgc2F2aW5nIGEgYml0IGluIHRoZSBwYWdlX2ZsYWdzIGFuZCB1c2luZyBpdCBhcyBhIGxvY2sKKwkgKiB0byBzZWUgaWYgdGhlIGNncm91cCBwYWdlIGFscmVhZHkgaGFzIGEgcGFnZV9jZ3JvdXAgYXNzb2NpYXRlZAorCSAqIHdpdGggaXQKKwkgKi8KK3JldHJ5OgorCWlmIChwYWdlKSB7CisJCWxvY2tfcGFnZV9jZ3JvdXAocGFnZSk7CisJCXBjID0gcGFnZV9nZXRfcGFnZV9jZ3JvdXAocGFnZSk7CisJCS8qCisJCSAqIFRoZSBwYWdlX2Nncm91cCBleGlzdHMgYW5kCisJCSAqIHRoZSBwYWdlIGhhcyBhbHJlYWR5IGJlZW4gYWNjb3VudGVkLgorCQkgKi8KKwkJaWYgKHBjKSB7CisJCQlpZiAodW5saWtlbHkoIWF0b21pY19pbmNfbm90X3plcm8oJnBjLT5yZWZfY250KSkpIHsKKwkJCQkvKiB0aGlzIHBhZ2UgaXMgdW5kZXIgYmVpbmcgdW5jaGFyZ2VkID8gKi8KKwkJCQl1bmxvY2tfcGFnZV9jZ3JvdXAocGFnZSk7CisJCQkJY3B1X3JlbGF4KCk7CisJCQkJZ290byByZXRyeTsKKwkJCX0gZWxzZSB7CisJCQkJdW5sb2NrX3BhZ2VfY2dyb3VwKHBhZ2UpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJfQorCQl1bmxvY2tfcGFnZV9jZ3JvdXAocGFnZSk7CisJfQorCisJcGMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGFnZV9jZ3JvdXApLCBnZnBfbWFzayk7CisJaWYgKHBjID09IE5VTEwpCisJCWdvdG8gZXJyOworCisJLyoKKwkgKiBXZSBhbHdheXMgY2hhcmdlIHRoZSBjZ3JvdXAgdGhlIG1tX3N0cnVjdCBiZWxvbmdzIHRvLgorCSAqIFRoZSBtbV9zdHJ1Y3QncyBtZW1fY2dyb3VwIGNoYW5nZXMgb24gdGFzayBtaWdyYXRpb24gaWYgdGhlCisJICogdGhyZWFkIGdyb3VwIGxlYWRlciBtaWdyYXRlcy4gSXQncyBwb3NzaWJsZSB0aGF0IG1tIGlzIG5vdAorCSAqIHNldCwgaWYgc28gY2hhcmdlIHRoZSBpbml0X21tIChoYXBwZW5zIGZvciBwYWdlY2FjaGUgdXNhZ2UpLgorCSAqLworCWlmICghbW0pCisJCW1tID0gJmluaXRfbW07CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbWVtID0gcmN1X2RlcmVmZXJlbmNlKG1tLT5tZW1fY2dyb3VwKTsKKwkvKgorCSAqIEZvciBldmVyeSBjaGFyZ2UgZnJvbSB0aGUgY2dyb3VwLCBpbmNyZW1lbnQgcmVmZXJlbmNlCisJICogY291bnQKKwkgKi8KKwljc3NfZ2V0KCZtZW0tPmNzcyk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkvKgorCSAqIElmIHdlIGNyZWF0ZWQgdGhlIHBhZ2VfY2dyb3VwLCB3ZSBzaG91bGQgZnJlZSBpdCBvbiBleGNlZWRpbmcKKwkgKiB0aGUgY2dyb3VwIGxpbWl0LgorCSAqLworCXdoaWxlIChyZXNfY291bnRlcl9jaGFyZ2UoJm1lbS0+cmVzLCBQQUdFX1NJWkUpKSB7CisJCWlmICghKGdmcF9tYXNrICYgX19HRlBfV0FJVCkpCisJCQlnb3RvIG91dDsKKworCQlpZiAodHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW0sIGdmcF9tYXNrKSkKKwkJCWNvbnRpbnVlOworCisJCS8qCisgCQkgKiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgbWlnaHQgbm90IGdpdmUgdXMgYSBmdWxsCisgCQkgKiBwaWN0dXJlIG9mIHJlY2xhaW0uIFNvbWUgcGFnZXMgYXJlIHJlY2xhaW1lZCBhbmQgbWlnaHQgYmUKKyAJCSAqIG1vdmVkIHRvIHN3YXAgY2FjaGUgb3IganVzdCB1bm1hcHBlZCBmcm9tIHRoZSBjZ3JvdXAuCisgCQkgKiBDaGVjayB0aGUgbGltaXQgYWdhaW4gdG8gc2VlIGlmIHRoZSByZWNsYWltIHJlZHVjZWQgdGhlCisgCQkgKiBjdXJyZW50IHVzYWdlIG9mIHRoZSBjZ3JvdXAgYmVmb3JlIGdpdmluZyB1cAorIAkJICovCisJCWlmIChyZXNfY291bnRlcl9jaGVja191bmRlcl9saW1pdCgmbWVtLT5yZXMpKQorCQkJY29udGludWU7CisKKwkJaWYgKCFucl9yZXRyaWVzLS0pIHsKKwkJCW1lbV9jZ3JvdXBfb3V0X29mX21lbW9yeShtZW0sIGdmcF9tYXNrKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWNvbmdlc3Rpb25fd2FpdChXUklURSwgSFovMTApOworCX0KKworCWF0b21pY19zZXQoJnBjLT5yZWZfY250LCAxKTsKKwlwYy0+bWVtX2Nncm91cCA9IG1lbTsKKwlwYy0+cGFnZSA9IHBhZ2U7CisJcGMtPmZsYWdzID0gUEFHRV9DR1JPVVBfRkxBR19BQ1RJVkU7CisJaWYgKGN0eXBlID09IE1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfQ0FDSEUpCisJCXBjLT5mbGFncyB8PSBQQUdFX0NHUk9VUF9GTEFHX0NBQ0hFOworCisJaWYgKCFwYWdlIHx8IHBhZ2VfY2dyb3VwX2Fzc2lnbl9uZXdfcGFnZV9jZ3JvdXAocGFnZSwgcGMpKSB7CisJCS8qCisJCSAqIEFub3RoZXIgY2hhcmdlIGhhcyBiZWVuIGFkZGVkIHRvIHRoaXMgcGFnZSBhbHJlYWR5LgorCQkgKiBXZSB0YWtlIGxvY2tfcGFnZV9jZ3JvdXAocGFnZSkgYWdhaW4gYW5kIHJlYWQKKwkJICogcGFnZS0+Y2dyb3VwLCBpbmNyZW1lbnQgcmVmY250Li4uLiBqdXN0IHJldHJ5IGlzIE9LLgorCQkgKi8KKwkJcmVzX2NvdW50ZXJfdW5jaGFyZ2UoJm1lbS0+cmVzLCBQQUdFX1NJWkUpOworCQljc3NfcHV0KCZtZW0tPmNzcyk7CisJCWtmcmVlKHBjKTsKKwkJaWYgKCFwYWdlKQorCQkJZ290byBkb25lOworCQlnb3RvIHJldHJ5OworCX0KKworCW16ID0gcGFnZV9jZ3JvdXBfem9uZWluZm8ocGMpOworCXNwaW5fbG9ja19pcnFzYXZlKCZtei0+bHJ1X2xvY2ssIGZsYWdzKTsKKwkvKiBVcGRhdGUgc3RhdGlzdGljcyB2ZWN0b3IgKi8KKwlfX21lbV9jZ3JvdXBfYWRkX2xpc3QocGMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm16LT5scnVfbG9jaywgZmxhZ3MpOworCitkb25lOgorCXJldHVybiAwOworb3V0OgorCWNzc19wdXQoJm1lbS0+Y3NzKTsKKwlrZnJlZShwYyk7CitlcnI6CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK2ludCBtZW1fY2dyb3VwX2NoYXJnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQlnZnBfdCBnZnBfbWFzaykKK3sKKwlyZXR1cm4gbWVtX2Nncm91cF9jaGFyZ2VfY29tbW9uKHBhZ2UsIG1tLCBnZnBfbWFzaywKKwkJCU1FTV9DR1JPVVBfQ0hBUkdFX1RZUEVfTUFQUEVEKTsKK30KKworLyoKKyAqIFNlZSBpZiB0aGUgY2FjaGVkIHBhZ2VzIHNob3VsZCBiZSBjaGFyZ2VkIGF0IGFsbD8KKyAqLworaW50IG1lbV9jZ3JvdXBfY2FjaGVfY2hhcmdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQlnZnBfdCBnZnBfbWFzaykKK3sKKwlpbnQgcmV0ID0gMDsKKwlpZiAoIW1tKQorCQltbSA9ICZpbml0X21tOworCisJcmV0ID0gbWVtX2Nncm91cF9jaGFyZ2VfY29tbW9uKHBhZ2UsIG1tLCBnZnBfbWFzaywKKwkJCQlNRU1fQ0dST1VQX0NIQVJHRV9UWVBFX0NBQ0hFKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVW5jaGFyZ2luZyBpcyBhbHdheXMgYSB3ZWxjb21lIG9wZXJhdGlvbiwgd2UgbmV2ZXIgY29tcGxhaW4sIHNpbXBseQorICogdW5jaGFyZ2UuIFRoaXMgcm91dGluZSBzaG91bGQgYmUgY2FsbGVkIHdpdGggbG9ja19wYWdlX2Nncm91cCBoZWxkCisgKi8KK3ZvaWQgbWVtX2Nncm91cF91bmNoYXJnZShzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjKQoreworCXN0cnVjdCBtZW1fY2dyb3VwICptZW07CisJc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKm16OworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIENoZWNrIGlmIG91ciBwYWdlX2Nncm91cCBpcyB2YWxpZAorCSAqLworCWlmICghcGMpCisJCXJldHVybjsKKworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZwYy0+cmVmX2NudCkpIHsKKwkJcGFnZSA9IHBjLT5wYWdlOworCQlteiA9IHBhZ2VfY2dyb3VwX3pvbmVpbmZvKHBjKTsKKwkJLyoKKwkJICogZ2V0IHBhZ2UtPmNncm91cCBhbmQgY2xlYXIgaXQgdW5kZXIgbG9jay4KKwkJICogZm9yY2VfZW1wdHkgY2FuIGRyb3AgcGFnZS0+Y2dyb3VwIHdpdGhvdXQgY2hlY2tpbmcgcmVmY250LgorCQkgKi8KKwkJdW5sb2NrX3BhZ2VfY2dyb3VwKHBhZ2UpOworCQlpZiAoY2xlYXJfcGFnZV9jZ3JvdXAocGFnZSwgcGMpID09IHBjKSB7CisJCQltZW0gPSBwYy0+bWVtX2Nncm91cDsKKwkJCWNzc19wdXQoJm1lbS0+Y3NzKTsKKwkJCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW0tPnJlcywgUEFHRV9TSVpFKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZtei0+bHJ1X2xvY2ssIGZsYWdzKTsKKwkJCV9fbWVtX2Nncm91cF9yZW1vdmVfbGlzdChwYyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtei0+bHJ1X2xvY2ssIGZsYWdzKTsKKwkJCWtmcmVlKHBjKTsKKwkJfQorCQlsb2NrX3BhZ2VfY2dyb3VwKHBhZ2UpOworCX0KK30KKwordm9pZCBtZW1fY2dyb3VwX3VuY2hhcmdlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJbG9ja19wYWdlX2Nncm91cChwYWdlKTsKKwltZW1fY2dyb3VwX3VuY2hhcmdlKHBhZ2VfZ2V0X3BhZ2VfY2dyb3VwKHBhZ2UpKTsKKwl1bmxvY2tfcGFnZV9jZ3JvdXAocGFnZSk7Cit9CisKKy8qCisgKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGEgcGFnZSAodW5kZXIgbWlncmF0aW9uKSBoYXMgdmFsaWQgcGFnZV9jZ3JvdXAgbWVtYmVyLgorICogUmVmY250IG9mIHBhZ2VfY2dyb3VwIGlzIGluY3JlbWVudGVkLgorICovCisKK2ludCBtZW1fY2dyb3VwX3ByZXBhcmVfbWlncmF0aW9uKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBwYWdlX2Nncm91cCAqcGM7CisJaW50IHJldCA9IDA7CisJbG9ja19wYWdlX2Nncm91cChwYWdlKTsKKwlwYyA9IHBhZ2VfZ2V0X3BhZ2VfY2dyb3VwKHBhZ2UpOworCWlmIChwYyAmJiBhdG9taWNfaW5jX25vdF96ZXJvKCZwYy0+cmVmX2NudCkpCisJCXJldCA9IDE7CisJdW5sb2NrX3BhZ2VfY2dyb3VwKHBhZ2UpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgbWVtX2Nncm91cF9lbmRfbWlncmF0aW9uKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBwYWdlX2Nncm91cCAqcGM7CisKKwlsb2NrX3BhZ2VfY2dyb3VwKHBhZ2UpOworCXBjID0gcGFnZV9nZXRfcGFnZV9jZ3JvdXAocGFnZSk7CisJbWVtX2Nncm91cF91bmNoYXJnZShwYyk7CisJdW5sb2NrX3BhZ2VfY2dyb3VwKHBhZ2UpOworfQorLyoKKyAqIFdlIGtub3cgYm90aCAqcGFnZSogYW5kICpuZXdwYWdlKiBhcmUgbm93IG5vdC1vbi1MUlUgYW5kIFBnX2xvY2tlZC4KKyAqIEFuZCBubyByYWNlIHdpdGggdW5jaGFyZ2UoKSByb3V0aW5lcyBiZWNhdXNlIHBhZ2VfY2dyb3VwIGZvciAqcGFnZSoKKyAqIGhhcyBleHRyYSBvbmUgcmVmZXJlbmNlIGJ5IG1lbV9jZ3JvdXBfcHJlcGFyZV9taWdyYXRpb24uCisgKi8KKwordm9pZCBtZW1fY2dyb3VwX3BhZ2VfbWlncmF0aW9uKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgcGFnZSAqbmV3cGFnZSkKK3sKKwlzdHJ1Y3QgcGFnZV9jZ3JvdXAgKnBjOworCXN0cnVjdCBtZW1fY2dyb3VwICptZW07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7CityZXRyeToKKwlwYyA9IHBhZ2VfZ2V0X3BhZ2VfY2dyb3VwKHBhZ2UpOworCWlmICghcGMpCisJCXJldHVybjsKKwltZW0gPSBwYy0+bWVtX2Nncm91cDsKKwlteiA9IHBhZ2VfY2dyb3VwX3pvbmVpbmZvKHBjKTsKKwlpZiAoY2xlYXJfcGFnZV9jZ3JvdXAocGFnZSwgcGMpICE9IHBjKQorCQlnb3RvIHJldHJ5OworCXNwaW5fbG9ja19pcnFzYXZlKCZtei0+bHJ1X2xvY2ssIGZsYWdzKTsKKworCV9fbWVtX2Nncm91cF9yZW1vdmVfbGlzdChwYyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXotPmxydV9sb2NrLCBmbGFncyk7CisKKwlwYy0+cGFnZSA9IG5ld3BhZ2U7CisJbG9ja19wYWdlX2Nncm91cChuZXdwYWdlKTsKKwlwYWdlX2Fzc2lnbl9wYWdlX2Nncm91cChuZXdwYWdlLCBwYyk7CisJdW5sb2NrX3BhZ2VfY2dyb3VwKG5ld3BhZ2UpOworCisJbXogPSBwYWdlX2Nncm91cF96b25laW5mbyhwYyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm16LT5scnVfbG9jaywgZmxhZ3MpOworCV9fbWVtX2Nncm91cF9hZGRfbGlzdChwYyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXotPmxydV9sb2NrLCBmbGFncyk7CisJcmV0dXJuOworfQorCisvKgorICogVGhpcyByb3V0aW5lIHRyYXZlcnNlIHBhZ2VfY2dyb3VwIGluIGdpdmVuIGxpc3QgYW5kIGRyb3AgdGhlbSBhbGwuCisgKiBUaGlzIHJvdXRpbmUgaWdub3JlcyBwYWdlX2Nncm91cC0+cmVmX2NudC4KKyAqICpBbmQqIHRoaXMgcm91dGluZSBkb2Vzbid0IHJlY2xhaW0gcGFnZSBpdHNlbGYsIGp1c3QgcmVtb3ZlcyBwYWdlX2Nncm91cC4KKyAqLworI2RlZmluZSBGT1JDRV9VTkNIQVJHRV9CQVRDSAkoMTI4KQorc3RhdGljIHZvaWQKK21lbV9jZ3JvdXBfZm9yY2VfZW1wdHlfbGlzdChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAorCQkJICAgIHN0cnVjdCBtZW1fY2dyb3VwX3Blcl96b25lICpteiwKKwkJCSAgICBpbnQgYWN0aXZlKQoreworCXN0cnVjdCBwYWdlX2Nncm91cCAqcGM7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IGNvdW50OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKworCWlmIChhY3RpdmUpCisJCWxpc3QgPSAmbXotPmFjdGl2ZV9saXN0OworCWVsc2UKKwkJbGlzdCA9ICZtei0+aW5hY3RpdmVfbGlzdDsKKworCWlmIChsaXN0X2VtcHR5KGxpc3QpKQorCQlyZXR1cm47CityZXRyeToKKwljb3VudCA9IEZPUkNFX1VOQ0hBUkdFX0JBVENIOworCXNwaW5fbG9ja19pcnFzYXZlKCZtei0+bHJ1X2xvY2ssIGZsYWdzKTsKKworCXdoaWxlICgtLWNvdW50ICYmICFsaXN0X2VtcHR5KGxpc3QpKSB7CisJCXBjID0gbGlzdF9lbnRyeShsaXN0LT5wcmV2LCBzdHJ1Y3QgcGFnZV9jZ3JvdXAsIGxydSk7CisJCXBhZ2UgPSBwYy0+cGFnZTsKKwkJLyogQXZvaWQgcmFjZSB3aXRoIGNoYXJnZSAqLworCQlhdG9taWNfc2V0KCZwYy0+cmVmX2NudCwgMCk7CisJCWlmIChjbGVhcl9wYWdlX2Nncm91cChwYWdlLCBwYykgPT0gcGMpIHsKKwkJCWNzc19wdXQoJm1lbS0+Y3NzKTsKKwkJCXJlc19jb3VudGVyX3VuY2hhcmdlKCZtZW0tPnJlcywgUEFHRV9TSVpFKTsKKwkJCV9fbWVtX2Nncm91cF9yZW1vdmVfbGlzdChwYyk7CisJCQlrZnJlZShwYyk7CisJCX0gZWxzZSAJLyogYmVpbmcgdW5jaGFyZ2VkID8gLi4uZG8gcmVsYXggKi8KKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtei0+bHJ1X2xvY2ssIGZsYWdzKTsKKwlpZiAoIWxpc3RfZW1wdHkobGlzdCkpIHsKKwkJY29uZF9yZXNjaGVkKCk7CisJCWdvdG8gcmV0cnk7CisJfQorCXJldHVybjsKK30KKworLyoKKyAqIG1ha2UgbWVtX2Nncm91cCdzIGNoYXJnZSB0byBiZSAwIGlmIHRoZXJlIGlzIG5vIHRhc2suCisgKiBUaGlzIGVuYWJsZXMgZGVsZXRpbmcgdGhpcyBtZW1fY2dyb3VwLgorICovCisKK2ludCBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCit7CisJaW50IHJldCA9IC1FQlVTWTsKKwlpbnQgbm9kZSwgemlkOworCWNzc19nZXQoJm1lbS0+Y3NzKTsKKwkvKgorCSAqIHBhZ2UgcmVjbGFpbSBjb2RlIChrc3dhcGQgZXRjLi4pIHdpbGwgbW92ZSBwYWdlcyBiZXR3ZWVuCitgCSAqIGFjdGl2ZV9saXN0IDwtPiBpbmFjdGl2ZV9saXN0IHdoaWxlIHdlIGRvbid0IHRha2UgYSBsb2NrLgorCSAqIFNvLCB3ZSBoYXZlIHRvIGRvIGxvb3AgaGVyZSB1bnRpbCBhbGwgbGlzdHMgYXJlIGVtcHR5LgorCSAqLworCXdoaWxlIChtZW0tPnJlcy51c2FnZSA+IDApIHsKKwkJaWYgKGF0b21pY19yZWFkKCZtZW0tPmNzcy5jZ3JvdXAtPmNvdW50KSA+IDApCisJCQlnb3RvIG91dDsKKwkJZm9yX2VhY2hfbm9kZV9zdGF0ZShub2RlLCBOX1BPU1NJQkxFKQorCQkJZm9yICh6aWQgPSAwOyB6aWQgPCBNQVhfTlJfWk9ORVM7IHppZCsrKSB7CisJCQkJc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKm16OworCQkJCW16ID0gbWVtX2Nncm91cF96b25laW5mbyhtZW0sIG5vZGUsIHppZCk7CisJCQkJLyogZHJvcCBhbGwgcGFnZV9jZ3JvdXAgaW4gYWN0aXZlX2xpc3QgKi8KKwkJCQltZW1fY2dyb3VwX2ZvcmNlX2VtcHR5X2xpc3QobWVtLCBteiwgMSk7CisJCQkJLyogZHJvcCBhbGwgcGFnZV9jZ3JvdXAgaW4gaW5hY3RpdmVfbGlzdCAqLworCQkJCW1lbV9jZ3JvdXBfZm9yY2VfZW1wdHlfbGlzdChtZW0sIG16LCAwKTsKKwkJCX0KKwl9CisJcmV0ID0gMDsKK291dDoKKwljc3NfcHV0KCZtZW0tPmNzcyk7CisJcmV0dXJuIHJldDsKK30KKworCisKK2ludCBtZW1fY2dyb3VwX3dyaXRlX3N0cmF0ZWd5KGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsb25nICp0bXApCit7CisJKnRtcCA9IG1lbXBhcnNlKGJ1ZiwgJmJ1Zik7CisJaWYgKCpidWYgIT0gJ1wwJykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqIFJvdW5kIHVwIHRoZSB2YWx1ZSB0byB0aGUgY2xvc2VzdCBwYWdlIHNpemUKKwkgKi8KKwkqdG1wID0gKCgqdG1wICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVCkgPDwgUEFHRV9TSElGVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgbWVtX2Nncm91cF9yZWFkKHN0cnVjdCBjZ3JvdXAgKmNvbnQsCisJCQlzdHJ1Y3QgY2Z0eXBlICpjZnQsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJY2hhciBfX3VzZXIgKnVzZXJidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gcmVzX2NvdW50ZXJfcmVhZCgmbWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCktPnJlcywKKwkJCQljZnQtPnByaXZhdGUsIHVzZXJidWYsIG5ieXRlcywgcHBvcywKKwkJCQlOVUxMKTsKK30KKworc3RhdGljIHNzaXplX3QgbWVtX2Nncm91cF93cml0ZShzdHJ1Y3QgY2dyb3VwICpjb250LCBzdHJ1Y3QgY2Z0eXBlICpjZnQsCisJCQkJc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJCXNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gcmVzX2NvdW50ZXJfd3JpdGUoJm1lbV9jZ3JvdXBfZnJvbV9jb250KGNvbnQpLT5yZXMsCisJCQkJY2Z0LT5wcml2YXRlLCB1c2VyYnVmLCBuYnl0ZXMsIHBwb3MsCisJCQkJbWVtX2Nncm91cF93cml0ZV9zdHJhdGVneSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1lbV9mb3JjZV9lbXB0eV93cml0ZShzdHJ1Y3QgY2dyb3VwICpjb250LAorCQkJCXN0cnVjdCBjZnR5cGUgKmNmdCwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQkJc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBtZW1fY2dyb3VwICptZW0gPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KTsKKwlpbnQgcmV0OworCXJldCA9IG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHkobWVtKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gbmJ5dGVzOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBOb3RlOiBUaGlzIHNob3VsZCBiZSByZW1vdmVkIGlmIGNncm91cCBzdXBwb3J0cyB3cml0ZS1vbmx5IGZpbGUuCisgKi8KKworc3RhdGljIHNzaXplX3QgbWVtX2ZvcmNlX2VtcHR5X3JlYWQoc3RydWN0IGNncm91cCAqY29udCwKKwkJCQlzdHJ1Y3QgY2Z0eXBlICpjZnQsCisJCQkJc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJCXNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1lbV9jZ3JvdXBfc3RhdF9kZXNjIHsKKwljb25zdCBjaGFyICptc2c7CisJdTY0IHVuaXQ7Cit9IG1lbV9jZ3JvdXBfc3RhdF9kZXNjW10gPSB7CisJW01FTV9DR1JPVVBfU1RBVF9DQUNIRV0gPSB7ICJjYWNoZSIsIFBBR0VfU0laRSwgfSwKKwlbTUVNX0NHUk9VUF9TVEFUX1JTU10gPSB7ICJyc3MiLCBQQUdFX1NJWkUsIH0sCit9OworCitzdGF0aWMgaW50IG1lbV9jb250cm9sX3N0YXRfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgY2dyb3VwICpjb250ID0gbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtX2NvbnQgPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KTsKKwlzdHJ1Y3QgbWVtX2Nncm91cF9zdGF0ICpzdGF0ID0gJm1lbV9jb250LT5zdGF0OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3RhdC0+Y3B1c3RhdFswXS5jb3VudCk7IGkrKykgeworCQlzNjQgdmFsOworCisJCXZhbCA9IG1lbV9jZ3JvdXBfcmVhZF9zdGF0KHN0YXQsIGkpOworCQl2YWwgKj0gbWVtX2Nncm91cF9zdGF0X2Rlc2NbaV0udW5pdDsKKwkJc2VxX3ByaW50ZihtLCAiJXMgJWxsZFxuIiwgbWVtX2Nncm91cF9zdGF0X2Rlc2NbaV0ubXNnLAorCQkJCShsb25nIGxvbmcpdmFsKTsKKwl9CisJLyogc2hvd2luZyAjIG9mIGFjdGl2ZSBwYWdlcyAqLworCXsKKwkJdW5zaWduZWQgbG9uZyBhY3RpdmUsIGluYWN0aXZlOworCisJCWluYWN0aXZlID0gbWVtX2Nncm91cF9nZXRfYWxsX3pvbmVzdGF0KG1lbV9jb250LAorCQkJCQkJTUVNX0NHUk9VUF9aU1RBVF9JTkFDVElWRSk7CisJCWFjdGl2ZSA9IG1lbV9jZ3JvdXBfZ2V0X2FsbF96b25lc3RhdChtZW1fY29udCwKKwkJCQkJCU1FTV9DR1JPVVBfWlNUQVRfQUNUSVZFKTsKKwkJc2VxX3ByaW50ZihtLCAiYWN0aXZlICVsZFxuIiwgKGFjdGl2ZSkgKiBQQUdFX1NJWkUpOworCQlzZXFfcHJpbnRmKG0sICJpbmFjdGl2ZSAlbGRcbiIsIChpbmFjdGl2ZSkgKiBQQUdFX1NJWkUpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWVtX2NvbnRyb2xfc3RhdF9maWxlX29wZXJhdGlvbnMgPSB7CisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IG1lbV9jb250cm9sX3N0YXRfb3BlbihzdHJ1Y3QgaW5vZGUgKnVudXNlZCwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyogWFhYIF9fZF9jb250ICovCisJc3RydWN0IGNncm91cCAqY29udCA9IGZpbGUtPmZfZGVudHJ5LT5kX3BhcmVudC0+ZF9mc2RhdGE7CisKKwlmaWxlLT5mX29wID0gJm1lbV9jb250cm9sX3N0YXRfZmlsZV9vcGVyYXRpb25zOworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBtZW1fY29udHJvbF9zdGF0X3Nob3csIGNvbnQpOworfQorCisKKworc3RhdGljIHN0cnVjdCBjZnR5cGUgbWVtX2Nncm91cF9maWxlc1tdID0geworCXsKKwkJLm5hbWUgPSAidXNhZ2VfaW5fYnl0ZXMiLAorCQkucHJpdmF0ZSA9IFJFU19VU0FHRSwKKwkJLnJlYWQgPSBtZW1fY2dyb3VwX3JlYWQsCisJfSwKKwl7CisJCS5uYW1lID0gImxpbWl0X2luX2J5dGVzIiwKKwkJLnByaXZhdGUgPSBSRVNfTElNSVQsCisJCS53cml0ZSA9IG1lbV9jZ3JvdXBfd3JpdGUsCisJCS5yZWFkID0gbWVtX2Nncm91cF9yZWFkLAorCX0sCisJeworCQkubmFtZSA9ICJmYWlsY250IiwKKwkJLnByaXZhdGUgPSBSRVNfRkFJTENOVCwKKwkJLnJlYWQgPSBtZW1fY2dyb3VwX3JlYWQsCisJfSwKKwl7CisJCS5uYW1lID0gImZvcmNlX2VtcHR5IiwKKwkJLndyaXRlID0gbWVtX2ZvcmNlX2VtcHR5X3dyaXRlLAorCQkucmVhZCA9IG1lbV9mb3JjZV9lbXB0eV9yZWFkLAorCX0sCisJeworCQkubmFtZSA9ICJzdGF0IiwKKwkJLm9wZW4gPSBtZW1fY29udHJvbF9zdGF0X29wZW4sCisJfSwKK307CisKK3N0YXRpYyBpbnQgYWxsb2NfbWVtX2Nncm91cF9wZXJfem9uZV9pbmZvKHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGludCBub2RlKQoreworCXN0cnVjdCBtZW1fY2dyb3VwX3Blcl9ub2RlICpwbjsKKwlzdHJ1Y3QgbWVtX2Nncm91cF9wZXJfem9uZSAqbXo7CisJaW50IHpvbmU7CisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFnYWluc3QgcG9zc2libGUgbm9kZXMuCisJICogQnV0IGl0J3MgQlVHIHRvIGNhbGwga21hbGxvYygpIGFnYWluc3Qgb2ZmbGluZSBub2RlLgorCSAqCisJICogVE9ETzogdGhpcyByb3V0aW5lIGNhbiB3YXN0ZSBtdWNoIG1lbW9yeSBmb3Igbm9kZXMgd2hpY2ggd2lsbAorCSAqICAgICAgIG5ldmVyIGJlIG9ubGluZWQuIEl0J3MgYmV0dGVyIHRvIHVzZSBtZW1vcnkgaG90cGx1ZyBjYWxsYmFjaworCSAqICAgICAgIGZ1bmN0aW9uLgorCSAqLworCWlmIChub2RlX3N0YXRlKG5vZGUsIE5fSElHSF9NRU1PUlkpKQorCQlwbiA9IGttYWxsb2Nfbm9kZShzaXplb2YoKnBuKSwgR0ZQX0tFUk5FTCwgbm9kZSk7CisJZWxzZQorCQlwbiA9IGttYWxsb2Moc2l6ZW9mKCpwbiksIEdGUF9LRVJORUwpOworCWlmICghcG4pCisJCXJldHVybiAxOworCisJbWVtLT5pbmZvLm5vZGVpbmZvW25vZGVdID0gcG47CisJbWVtc2V0KHBuLCAwLCBzaXplb2YoKnBuKSk7CisKKwlmb3IgKHpvbmUgPSAwOyB6b25lIDwgTUFYX05SX1pPTkVTOyB6b25lKyspIHsKKwkJbXogPSAmcG4tPnpvbmVpbmZvW3pvbmVdOworCQlJTklUX0xJU1RfSEVBRCgmbXotPmFjdGl2ZV9saXN0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJm16LT5pbmFjdGl2ZV9saXN0KTsKKwkJc3Bpbl9sb2NrX2luaXQoJm16LT5scnVfbG9jayk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX21lbV9jZ3JvdXBfcGVyX3pvbmVfaW5mbyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBpbnQgbm9kZSkKK3sKKwlrZnJlZShtZW0tPmluZm8ubm9kZWluZm9bbm9kZV0pOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cCBpbml0X21lbV9jZ3JvdXA7CisKK3N0YXRpYyBzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqCittZW1fY2dyb3VwX2NyZWF0ZShzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNvbnQpCit7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbTsKKwlpbnQgbm9kZTsKKworCWlmICh1bmxpa2VseSgoY29udC0+cGFyZW50KSA9PSBOVUxMKSkgeworCQltZW0gPSAmaW5pdF9tZW1fY2dyb3VwOworCQlpbml0X21tLm1lbV9jZ3JvdXAgPSBtZW07CisJfSBlbHNlCisJCW1lbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtZW1fY2dyb3VwKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAobWVtID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcmVzX2NvdW50ZXJfaW5pdCgmbWVtLT5yZXMpOworCisJbWVtc2V0KCZtZW0tPmluZm8sIDAsIHNpemVvZihtZW0tPmluZm8pKTsKKworCWZvcl9lYWNoX25vZGVfc3RhdGUobm9kZSwgTl9QT1NTSUJMRSkKKwkJaWYgKGFsbG9jX21lbV9jZ3JvdXBfcGVyX3pvbmVfaW5mbyhtZW0sIG5vZGUpKQorCQkJZ290byBmcmVlX291dDsKKworCXJldHVybiAmbWVtLT5jc3M7CitmcmVlX291dDoKKwlmb3JfZWFjaF9ub2RlX3N0YXRlKG5vZGUsIE5fUE9TU0lCTEUpCisJCWZyZWVfbWVtX2Nncm91cF9wZXJfem9uZV9pbmZvKG1lbSwgbm9kZSk7CisJaWYgKGNvbnQtPnBhcmVudCAhPSBOVUxMKQorCQlrZnJlZShtZW0pOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX3ByZV9kZXN0cm95KHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywKKwkJCQkJc3RydWN0IGNncm91cCAqY29udCkKK3sKKwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCk7CisJbWVtX2Nncm91cF9mb3JjZV9lbXB0eShtZW0pOworfQorCitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX2Rlc3Ryb3koc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLAorCQkJCXN0cnVjdCBjZ3JvdXAgKmNvbnQpCit7CisJaW50IG5vZGU7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNvbnQpOworCisJZm9yX2VhY2hfbm9kZV9zdGF0ZShub2RlLCBOX1BPU1NJQkxFKQorCQlmcmVlX21lbV9jZ3JvdXBfcGVyX3pvbmVfaW5mbyhtZW0sIG5vZGUpOworCisJa2ZyZWUobWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCkpOworfQorCitzdGF0aWMgaW50IG1lbV9jZ3JvdXBfcG9wdWxhdGUoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLAorCQkJCXN0cnVjdCBjZ3JvdXAgKmNvbnQpCit7CisJcmV0dXJuIGNncm91cF9hZGRfZmlsZXMoY29udCwgc3MsIG1lbV9jZ3JvdXBfZmlsZXMsCisJCQkJCUFSUkFZX1NJWkUobWVtX2Nncm91cF9maWxlcykpOworfQorCitzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX21vdmVfdGFzayhzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsCisJCQkJc3RydWN0IGNncm91cCAqY29udCwKKwkJCQlzdHJ1Y3QgY2dyb3VwICpvbGRfY29udCwKKwkJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW07CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgKm9sZF9tZW07CisKKwltbSA9IGdldF90YXNrX21tKHApOworCWlmIChtbSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwltZW0gPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KTsKKwlvbGRfbWVtID0gbWVtX2Nncm91cF9mcm9tX2NvbnQob2xkX2NvbnQpOworCisJaWYgKG1lbSA9PSBvbGRfbWVtKQorCQlnb3RvIG91dDsKKworCS8qCisJICogT25seSB0aHJlYWQgZ3JvdXAgbGVhZGVycyBhcmUgYWxsb3dlZCB0byBtaWdyYXRlLCB0aGUgbW1fc3RydWN0IGlzCisJICogaW4gZWZmZWN0IG93bmVkIGJ5IHRoZSBsZWFkZXIKKwkgKi8KKwlpZiAocC0+dGdpZCAhPSBwLT5waWQpCisJCWdvdG8gb3V0OworCisJY3NzX2dldCgmbWVtLT5jc3MpOworCXJjdV9hc3NpZ25fcG9pbnRlcihtbS0+bWVtX2Nncm91cCwgbWVtKTsKKwljc3NfcHV0KCZvbGRfbWVtLT5jc3MpOworCitvdXQ6CisJbW1wdXQobW0pOworCXJldHVybjsKK30KKworc3RydWN0IGNncm91cF9zdWJzeXMgbWVtX2Nncm91cF9zdWJzeXMgPSB7CisJLm5hbWUgPSAibWVtb3J5IiwKKwkuc3Vic3lzX2lkID0gbWVtX2Nncm91cF9zdWJzeXNfaWQsCisJLmNyZWF0ZSA9IG1lbV9jZ3JvdXBfY3JlYXRlLAorCS5wcmVfZGVzdHJveSA9IG1lbV9jZ3JvdXBfcHJlX2Rlc3Ryb3ksCisJLmRlc3Ryb3kgPSBtZW1fY2dyb3VwX2Rlc3Ryb3ksCisJLnBvcHVsYXRlID0gbWVtX2Nncm91cF9wb3B1bGF0ZSwKKwkuYXR0YWNoID0gbWVtX2Nncm91cF9tb3ZlX3Rhc2ssCisJLmVhcmx5X2luaXQgPSAwLAorfTsKZGlmZiAtLWdpdCBhL21tL21lbW9yeS5jIGIvbW0vbWVtb3J5LmMKaW5kZXggOWQwNzNmYS4uZTU2MjhhNSAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LmMKKysrIGIvbW0vbWVtb3J5LmMKQEAgLTUwLDYgKzUwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheWFjY3QuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvbWVtY29udHJvbC5oPgogCiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtMTMzLDExICsxMzQsOSBAQAogICovCiBzdGF0aWMgdm9pZCBmcmVlX3B0ZV9yYW5nZShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCBwbWRfdCAqcG1kKQogewotCXN0cnVjdCBwYWdlICpwYWdlID0gcG1kX3BhZ2UoKnBtZCk7CisJcGd0YWJsZV90IHRva2VuID0gcG1kX3BndGFibGUoKnBtZCk7CiAJcG1kX2NsZWFyKHBtZCk7Ci0JcHRlX2xvY2tfZGVpbml0KHBhZ2UpOwotCXB0ZV9mcmVlX3RsYih0bGIsIHBhZ2UpOwotCWRlY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfUEFHRVRBQkxFKTsKKwlwdGVfZnJlZV90bGIodGxiLCB0b2tlbik7CiAJdGxiLT5tbS0+bnJfcHRlcy0tOwogfQogCkBAIC0zMDgsMjEgKzMwNywxOSBAQAogCiBpbnQgX19wdGVfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKLQlzdHJ1Y3QgcGFnZSAqbmV3ID0gcHRlX2FsbG9jX29uZShtbSwgYWRkcmVzcyk7CisJcGd0YWJsZV90IG5ldyA9IHB0ZV9hbGxvY19vbmUobW0sIGFkZHJlc3MpOwogCWlmICghbmV3KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXB0ZV9sb2NrX2luaXQobmV3KTsKIAlzcGluX2xvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOwotCWlmIChwbWRfcHJlc2VudCgqcG1kKSkgewkvKiBBbm90aGVyIGhhcyBwb3B1bGF0ZWQgaXQgKi8KLQkJcHRlX2xvY2tfZGVpbml0KG5ldyk7Ci0JCXB0ZV9mcmVlKG1tLCBuZXcpOwotCX0gZWxzZSB7CisJaWYgKCFwbWRfcHJlc2VudCgqcG1kKSkgewkvKiBIYXMgYW5vdGhlciBwb3B1bGF0ZWQgaXQgPyAqLwogCQltbS0+bnJfcHRlcysrOwotCQlpbmNfem9uZV9wYWdlX3N0YXRlKG5ldywgTlJfUEFHRVRBQkxFKTsKIAkJcG1kX3BvcHVsYXRlKG1tLCBwbWQsIG5ldyk7CisJCW5ldyA9IE5VTEw7CiAJfQogCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwlpZiAobmV3KQorCQlwdGVfZnJlZShtbSwgbmV3KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzMzLDExICszMzAsMTMgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlzcGluX2xvY2soJmluaXRfbW0ucGFnZV90YWJsZV9sb2NrKTsKLQlpZiAocG1kX3ByZXNlbnQoKnBtZCkpCQkvKiBBbm90aGVyIGhhcyBwb3B1bGF0ZWQgaXQgKi8KLQkJcHRlX2ZyZWVfa2VybmVsKCZpbml0X21tLCBuZXcpOwotCWVsc2UKKwlpZiAoIXBtZF9wcmVzZW50KCpwbWQpKSB7CS8qIEhhcyBhbm90aGVyIHBvcHVsYXRlZCBpdCA/ICovCiAJCXBtZF9wb3B1bGF0ZV9rZXJuZWwoJmluaXRfbW0sIHBtZCwgbmV3KTsKKwkJbmV3ID0gTlVMTDsKKwl9CiAJc3Bpbl91bmxvY2soJmluaXRfbW0ucGFnZV90YWJsZV9sb2NrKTsKKwlpZiAobmV3KQorCQlwdGVfZnJlZV9rZXJuZWwoJmluaXRfbW0sIG5ldyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExNDQsMTYgKzExNDMsMjAgQEAKIHsKIAlpbnQgcmV0dmFsOwogCXB0ZV90ICpwdGU7Ci0Jc3BpbmxvY2tfdCAqcHRsOyAgCisJc3BpbmxvY2tfdCAqcHRsOworCisJcmV0dmFsID0gbWVtX2Nncm91cF9jaGFyZ2UocGFnZSwgbW0sIEdGUF9LRVJORUwpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OwogCiAJcmV0dmFsID0gLUVJTlZBTDsKIAlpZiAoUGFnZUFub24ocGFnZSkpCi0JCWdvdG8gb3V0OworCQlnb3RvIG91dF91bmNoYXJnZTsKIAlyZXR2YWwgPSAtRU5PTUVNOwogCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwogCXB0ZSA9IGdldF9sb2NrZWRfcHRlKG1tLCBhZGRyLCAmcHRsKTsKIAlpZiAoIXB0ZSkKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3VuY2hhcmdlOwogCXJldHZhbCA9IC1FQlVTWTsKIAlpZiAoIXB0ZV9ub25lKCpwdGUpKQogCQlnb3RvIG91dF91bmxvY2s7CkBAIC0xMTY1LDggKzExNjgsMTIgQEAKIAlzZXRfcHRlX2F0KG1tLCBhZGRyLCBwdGUsIG1rX3B0ZShwYWdlLCBwcm90KSk7CiAKIAlyZXR2YWwgPSAwOworCXB0ZV91bm1hcF91bmxvY2socHRlLCBwdGwpOworCXJldHVybiByZXR2YWw7CiBvdXRfdW5sb2NrOgogCXB0ZV91bm1hcF91bmxvY2socHRlLCBwdGwpOworb3V0X3VuY2hhcmdlOgorCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZShwYWdlKTsKIG91dDoKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtMTM4MSw3ICsxMzg4LDcgQEAKIHsKIAlwdGVfdCAqcHRlOwogCWludCBlcnI7Ci0Jc3RydWN0IHBhZ2UgKnBtZF9wYWdlOworCXBndGFibGVfdCB0b2tlbjsKIAlzcGlubG9ja190ICp1bmluaXRpYWxpemVkX3ZhcihwdGwpOwogCiAJcHRlID0gKG1tID09ICZpbml0X21tKSA/CkBAIC0xMzkyLDEwICsxMzk5LDEwIEBACiAKIAlCVUdfT04ocG1kX2h1Z2UoKnBtZCkpOwogCi0JcG1kX3BhZ2UgPSBwbWRfcGFnZSgqcG1kKTsKKwl0b2tlbiA9IHBtZF9wZ3RhYmxlKCpwbWQpOwogCiAJZG8gewotCQllcnIgPSBmbihwdGUsIHBtZF9wYWdlLCBhZGRyLCBkYXRhKTsKKwkJZXJyID0gZm4ocHRlLCB0b2tlbiwgYWRkciwgZGF0YSk7CiAJCWlmIChlcnIpCiAJCQlicmVhazsKIAl9IHdoaWxlIChwdGUrKywgYWRkciArPSBQQUdFX1NJWkUsIGFkZHIgIT0gZW5kKTsKQEAgLTE2NDEsNiArMTY0OCw5IEBACiAJY293X3VzZXJfcGFnZShuZXdfcGFnZSwgb2xkX3BhZ2UsIGFkZHJlc3MsIHZtYSk7CiAJX19TZXRQYWdlVXB0b2RhdGUobmV3X3BhZ2UpOwogCisJaWYgKG1lbV9jZ3JvdXBfY2hhcmdlKG5ld19wYWdlLCBtbSwgR0ZQX0tFUk5FTCkpCisJCWdvdG8gb29tX2ZyZWVfbmV3OworCiAJLyoKIAkgKiBSZS1jaGVjayB0aGUgcHRlIC0gd2UgZHJvcHBlZCB0aGUgbG9jawogCSAqLwpAQCAtMTY3Miw3ICsxNjgyLDkgQEAKIAkJLyogRnJlZSB0aGUgb2xkIHBhZ2UuLiAqLwogCQluZXdfcGFnZSA9IG9sZF9wYWdlOwogCQlyZXQgfD0gVk1fRkFVTFRfV1JJVEU7Ci0JfQorCX0gZWxzZQorCQltZW1fY2dyb3VwX3VuY2hhcmdlX3BhZ2UobmV3X3BhZ2UpOworCiAJaWYgKG5ld19wYWdlKQogCQlwYWdlX2NhY2hlX3JlbGVhc2UobmV3X3BhZ2UpOwogCWlmIChvbGRfcGFnZSkKQEAgLTE2OTYsNiArMTcwOCw4IEBACiAJCXB1dF9wYWdlKGRpcnR5X3BhZ2UpOwogCX0KIAlyZXR1cm4gcmV0Oworb29tX2ZyZWVfbmV3OgorCV9fZnJlZV9wYWdlKG5ld19wYWdlKTsKIG9vbToKIAlpZiAob2xkX3BhZ2UpCiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShvbGRfcGFnZSk7CkBAIC0yMDM2LDYgKzIwNTAsMTIgQEAKIAkJY291bnRfdm1fZXZlbnQoUEdNQUpGQVVMVCk7CiAJfQogCisJaWYgKG1lbV9jZ3JvdXBfY2hhcmdlKHBhZ2UsIG1tLCBHRlBfS0VSTkVMKSkgeworCQlkZWxheWFjY3RfY2xlYXJfZmxhZyhERUxBWUFDQ1RfUEZfU1dBUElOKTsKKwkJcmV0ID0gVk1fRkFVTFRfT09NOworCQlnb3RvIG91dDsKKwl9CisKIAltYXJrX3BhZ2VfYWNjZXNzZWQocGFnZSk7CiAJbG9ja19wYWdlKHBhZ2UpOwogCWRlbGF5YWNjdF9jbGVhcl9mbGFnKERFTEFZQUNDVF9QRl9TV0FQSU4pOwpAQCAtMjA3Myw4ICsyMDkzLDEwIEBACiAJaWYgKHdyaXRlX2FjY2VzcykgewogCQkvKiBYWFg6IFdlIGNvdWxkIE9SIHRoZSBkb193cF9wYWdlIGNvZGUgd2l0aCB0aGlzIG9uZT8gKi8KIAkJaWYgKGRvX3dwX3BhZ2UobW0sIHZtYSwgYWRkcmVzcywKLQkJCQlwYWdlX3RhYmxlLCBwbWQsIHB0bCwgcHRlKSAmIFZNX0ZBVUxUX09PTSkKKwkJCQlwYWdlX3RhYmxlLCBwbWQsIHB0bCwgcHRlKSAmIFZNX0ZBVUxUX09PTSkgeworCQkJbWVtX2Nncm91cF91bmNoYXJnZV9wYWdlKHBhZ2UpOwogCQkJcmV0ID0gVk1fRkFVTFRfT09NOworCQl9CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMjA4NSw2ICsyMTA3LDcgQEAKIG91dDoKIAlyZXR1cm4gcmV0Owogb3V0X25vbWFwOgorCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZShwYWdlKTsKIAlwdGVfdW5tYXBfdW5sb2NrKHBhZ2VfdGFibGUsIHB0bCk7CiAJdW5sb2NrX3BhZ2UocGFnZSk7CiAJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwpAQCAtMjExNCw2ICsyMTM3LDkgQEAKIAkJZ290byBvb207CiAJX19TZXRQYWdlVXB0b2RhdGUocGFnZSk7CiAKKwlpZiAobWVtX2Nncm91cF9jaGFyZ2UocGFnZSwgbW0sIEdGUF9LRVJORUwpKQorCQlnb3RvIG9vbV9mcmVlX3BhZ2U7CisKIAllbnRyeSA9IG1rX3B0ZShwYWdlLCB2bWEtPnZtX3BhZ2VfcHJvdCk7CiAJZW50cnkgPSBtYXliZV9ta3dyaXRlKHB0ZV9ta2RpcnR5KGVudHJ5KSwgdm1hKTsKIApAQCAtMjEzMSw4ICsyMTU3LDExIEBACiAJcHRlX3VubWFwX3VubG9jayhwYWdlX3RhYmxlLCBwdGwpOwogCXJldHVybiAwOwogcmVsZWFzZToKKwltZW1fY2dyb3VwX3VuY2hhcmdlX3BhZ2UocGFnZSk7CiAJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCWdvdG8gdW5sb2NrOworb29tX2ZyZWVfcGFnZToKKwlfX2ZyZWVfcGFnZShwYWdlKTsKIG9vbToKIAlyZXR1cm4gVk1fRkFVTFRfT09NOwogfQpAQCAtMjI0Niw2ICsyMjc1LDExIEBACiAKIAl9CiAKKwlpZiAobWVtX2Nncm91cF9jaGFyZ2UocGFnZSwgbW0sIEdGUF9LRVJORUwpKSB7CisJCXJldCA9IFZNX0ZBVUxUX09PTTsKKwkJZ290byBvdXQ7CisJfQorCiAJcGFnZV90YWJsZSA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkcmVzcywgJnB0bCk7CiAKIAkvKgpAQCAtMjI4MSw2ICsyMzE1LDcgQEAKIAkJLyogbm8gbmVlZCB0byBpbnZhbGlkYXRlOiBhIG5vdC1wcmVzZW50IHBhZ2Ugd29uJ3QgYmUgY2FjaGVkICovCiAJCXVwZGF0ZV9tbXVfY2FjaGUodm1hLCBhZGRyZXNzLCBlbnRyeSk7CiAJfSBlbHNlIHsKKwkJbWVtX2Nncm91cF91bmNoYXJnZV9wYWdlKHBhZ2UpOwogCQlpZiAoYW5vbikKIAkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJZWxzZQpkaWZmIC0tZ2l0IGEvbW0vbWlncmF0ZS5jIGIvbW0vbWlncmF0ZS5jCmluZGV4IDg1N2E5ODcuLmE3MzUwNGYgMTAwNjQ0Ci0tLSBhL21tL21pZ3JhdGUuYworKysgYi9tbS9taWdyYXRlLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1jb250cm9sLmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCkBAIC0xNTIsNiArMTUzLDExIEBACiAgCQlyZXR1cm47CiAgCX0KIAorCWlmIChtZW1fY2dyb3VwX2NoYXJnZShuZXcsIG1tLCBHRlBfS0VSTkVMKSkgeworCQlwdGVfdW5tYXAocHRlcCk7CisJCXJldHVybjsKKwl9CisKICAJcHRsID0gcHRlX2xvY2twdHIobW0sIHBtZCk7CiAgCXNwaW5fbG9jayhwdGwpOwogCXB0ZSA9ICpwdGVwOwpAQCAtNTg3LDkgKzU5MywxMCBAQAogCWVsc2UKIAkJcmMgPSBmYWxsYmFja19taWdyYXRlX3BhZ2UobWFwcGluZywgbmV3cGFnZSwgcGFnZSk7CiAKLQlpZiAoIXJjKQorCWlmICghcmMpIHsKKwkJbWVtX2Nncm91cF9wYWdlX21pZ3JhdGlvbihwYWdlLCBuZXdwYWdlKTsKIAkJcmVtb3ZlX21pZ3JhdGlvbl9wdGVzKHBhZ2UsIG5ld3BhZ2UpOwotCWVsc2UKKwl9IGVsc2UKIAkJbmV3cGFnZS0+bWFwcGluZyA9IE5VTEw7CiAKIAl1bmxvY2tfcGFnZShuZXdwYWdlKTsKQEAgLTYwOCw2ICs2MTUsNyBAQAogCWludCAqcmVzdWx0ID0gTlVMTDsKIAlzdHJ1Y3QgcGFnZSAqbmV3cGFnZSA9IGdldF9uZXdfcGFnZShwYWdlLCBwcml2YXRlLCAmcmVzdWx0KTsKIAlpbnQgcmN1X2xvY2tlZCA9IDA7CisJaW50IGNoYXJnZSA9IDA7CiAKIAlpZiAoIW5ld3BhZ2UpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNjY3LDE0ICs2NzUsMTkgQEAKIAkJZ290byByY3VfdW5sb2NrOwogCX0KIAorCWNoYXJnZSA9IG1lbV9jZ3JvdXBfcHJlcGFyZV9taWdyYXRpb24ocGFnZSk7CiAJLyogRXN0YWJsaXNoIG1pZ3JhdGlvbiBwdGVzIG9yIHJlbW92ZSBwdGVzICovCiAJdHJ5X3RvX3VubWFwKHBhZ2UsIDEpOwogCiAJaWYgKCFwYWdlX21hcHBlZChwYWdlKSkKIAkJcmMgPSBtb3ZlX3RvX25ld19wYWdlKG5ld3BhZ2UsIHBhZ2UpOwogCi0JaWYgKHJjKQorCWlmIChyYykgewogCQlyZW1vdmVfbWlncmF0aW9uX3B0ZXMocGFnZSwgcGFnZSk7CisJCWlmIChjaGFyZ2UpCisJCQltZW1fY2dyb3VwX2VuZF9taWdyYXRpb24ocGFnZSk7CisJfSBlbHNlIGlmIChjaGFyZ2UpCisgCQltZW1fY2dyb3VwX2VuZF9taWdyYXRpb24obmV3cGFnZSk7CiByY3VfdW5sb2NrOgogCWlmIChyY3VfbG9ja2VkKQogCQlyY3VfcmVhZF91bmxvY2soKTsKZGlmZiAtLWdpdCBhL21tL21tYXAuYyBiL21tL21tYXAuYwppbmRleCBhZDZlNGVhLi5hMzJkMjhjIDEwMDY0NAotLS0gYS9tbS9tbWFwLmMKKysrIGIvbW0vbW1hcC5jCkBAIC0yMTY1LDI0ICsyMTY1LDMxIEBACiB9CiAKIAotc3RhdGljIHN0cnVjdCBwYWdlICpzcGVjaWFsX21hcHBpbmdfbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJCQkgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCAqdHlwZSkKK3N0YXRpYyBpbnQgc3BlY2lhbF9tYXBwaW5nX2ZhdWx0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCXN0cnVjdCB2bV9mYXVsdCAqdm1mKQogeworCXBnb2ZmX3QgcGdvZmY7CiAJc3RydWN0IHBhZ2UgKipwYWdlczsKIAotCUJVR19PTihhZGRyZXNzIDwgdm1hLT52bV9zdGFydCB8fCBhZGRyZXNzID49IHZtYS0+dm1fZW5kKTsKKwkvKgorCSAqIHNwZWNpYWwgbWFwcGluZ3MgaGF2ZSBubyB2bV9maWxlLCBhbmQgaW4gdGhhdCBjYXNlLCB0aGUgbW0KKwkgKiB1c2VzIHZtX3Bnb2ZmIGludGVybmFsbHkuIFNvIHdlIGhhdmUgdG8gc3VidHJhY3QgaXQgZnJvbSBoZXJlLgorCSAqIFdlIGFyZSBhbGxvd2VkIHRvIGRvIHRoaXMgYmVjYXVzZSB3ZSBhcmUgdGhlIG1tOyBkbyBub3QgY29weQorCSAqIHRoaXMgY29kZSBpbnRvIGRyaXZlcnMhCisJICovCisJcGdvZmYgPSB2bWYtPnBnb2ZmIC0gdm1hLT52bV9wZ29mZjsKIAotCWFkZHJlc3MgLT0gdm1hLT52bV9zdGFydDsKLQlmb3IgKHBhZ2VzID0gdm1hLT52bV9wcml2YXRlX2RhdGE7IGFkZHJlc3MgPiAwICYmICpwYWdlczsgKytwYWdlcykKLQkJYWRkcmVzcyAtPSBQQUdFX1NJWkU7CisJZm9yIChwYWdlcyA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOyBwZ29mZiAmJiAqcGFnZXM7ICsrcGFnZXMpCisJCXBnb2ZmLS07CiAKIAlpZiAoKnBhZ2VzKSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlID0gKnBhZ2VzOwogCQlnZXRfcGFnZShwYWdlKTsKLQkJcmV0dXJuIHBhZ2U7CisJCXZtZi0+cGFnZSA9IHBhZ2U7CisJCXJldHVybiAwOwogCX0KIAotCXJldHVybiBOT1BBR0VfU0lHQlVTOworCXJldHVybiBWTV9GQVVMVF9TSUdCVVM7CiB9CiAKIC8qCkBAIC0yMTk0LDcgKzIyMDEsNyBAQAogCiBzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHNwZWNpYWxfbWFwcGluZ192bW9wcyA9IHsKIAkuY2xvc2UgPSBzcGVjaWFsX21hcHBpbmdfY2xvc2UsCi0JLm5vcGFnZQk9IHNwZWNpYWxfbWFwcGluZ19ub3BhZ2UsCisJLmZhdWx0ID0gc3BlY2lhbF9tYXBwaW5nX2ZhdWx0LAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL21tL29vbV9raWxsLmMgYi9tbS9vb21fa2lsbC5jCmluZGV4IGMxODUwYmYuLjQxOTRiOWQgMTAwNjQ0Ci0tLSBhL21tL29vbV9raWxsLmMKKysrIGIvbW0vb29tX2tpbGwuYwpAQCAtMjUsOSArMjUsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9jcHVzZXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L21lbWNvbnRyb2wuaD4KIAogaW50IHN5c2N0bF9wYW5pY19vbl9vb207CiBpbnQgc3lzY3RsX29vbV9raWxsX2FsbG9jYXRpbmdfdGFzazsKK2ludCBzeXNjdGxfb29tX2R1bXBfdGFza3M7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHpvbmVfc2Nhbl9tdXRleCk7CiAvKiAjZGVmaW5lIERFQlVHICovCiAKQEAgLTUwLDcgKzUyLDggQEAKICAqICAgIG9mIGxlYXN0IHN1cnByaXNlIC4uLiAoYmUgY2FyZWZ1bCB3aGVuIHlvdSBjaGFuZ2UgaXQpCiAgKi8KIAotdW5zaWduZWQgbG9uZyBiYWRuZXNzKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgdW5zaWduZWQgbG9uZyB1cHRpbWUpCit1bnNpZ25lZCBsb25nIGJhZG5lc3Moc3RydWN0IHRhc2tfc3RydWN0ICpwLCB1bnNpZ25lZCBsb25nIHVwdGltZSwKKwkJCXN0cnVjdCBtZW1fY2dyb3VwICptZW0pCiB7CiAJdW5zaWduZWQgbG9uZyBwb2ludHMsIGNwdV90aW1lLCBydW5fdGltZSwgczsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKQEAgLTE5Myw3ICsxOTYsOCBAQAogICoKICAqIChub3QgZG9jYm9va2VkLCB3ZSBkb24ndCB3YW50IHRoaXMgb25lIGNsdXR0ZXJpbmcgdXAgdGhlIG1hbnVhbCkKICAqLwotc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqc2VsZWN0X2JhZF9wcm9jZXNzKHVuc2lnbmVkIGxvbmcgKnBwb2ludHMpCitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpzZWxlY3RfYmFkX3Byb2Nlc3ModW5zaWduZWQgbG9uZyAqcHBvaW50cywKKwkJCQkJCXN0cnVjdCBtZW1fY2dyb3VwICptZW0pCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpnLCAqcDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNob3NlbiA9IE5VTEw7CkBAIC0yMTMsNiArMjE3LDggQEAKIAkJLyogc2tpcCB0aGUgaW5pdCB0YXNrICovCiAJCWlmIChpc19nbG9iYWxfaW5pdChwKSkKIAkJCWNvbnRpbnVlOworCQlpZiAobWVtICYmICF0YXNrX2luX21lbV9jZ3JvdXAocCwgbWVtKSkKKwkJCWNvbnRpbnVlOwogCiAJCS8qCiAJCSAqIFRoaXMgdGFzayBhbHJlYWR5IGhhcyBhY2Nlc3MgdG8gbWVtb3J5IHJlc2VydmVzIGFuZCBpcwpAQCAtMjQ3LDcgKzI1Myw3IEBACiAJCWlmIChwLT5vb21raWxsYWRqID09IE9PTV9ESVNBQkxFKQogCQkJY29udGludWU7CiAKLQkJcG9pbnRzID0gYmFkbmVzcyhwLCB1cHRpbWUudHZfc2VjKTsKKwkJcG9pbnRzID0gYmFkbmVzcyhwLCB1cHRpbWUudHZfc2VjLCBtZW0pOwogCQlpZiAocG9pbnRzID4gKnBwb2ludHMgfHwgIWNob3NlbikgewogCQkJY2hvc2VuID0gcDsKIAkJCSpwcG9pbnRzID0gcG9pbnRzOwpAQCAtMjU4LDYgKzI2NCw0MSBAQAogfQogCiAvKioKKyAqIER1bXBzIHRoZSBjdXJyZW50IG1lbW9yeSBzdGF0ZSBvZiBhbGwgc3lzdGVtIHRhc2tzLCBleGNsdWRpbmcga2VybmVsIHRocmVhZHMuCisgKiBTdGF0ZSBpbmZvcm1hdGlvbiBpbmNsdWRlcyB0YXNrJ3MgcGlkLCB1aWQsIHRnaWQsIHZtIHNpemUsIHJzcywgY3B1LCBvb21fYWRqCisgKiBzY29yZSwgYW5kIG5hbWUuCisgKgorICogSWYgdGhlIGFjdHVhbCBpcyBub24tTlVMTCwgb25seSB0YXNrcyB0aGF0IGFyZSBhIG1lbWJlciBvZiB0aGUgbWVtX2Nncm91cCBhcmUKKyAqIHNob3duLgorICoKKyAqIENhbGwgd2l0aCB0YXNrbGlzdF9sb2NrIHJlYWQtbG9ja2VkLgorICovCitzdGF0aWMgdm9pZCBkdW1wX3Rhc2tzKGNvbnN0IHN0cnVjdCBtZW1fY2dyb3VwICptZW0pCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICpnLCAqcDsKKworCXByaW50ayhLRVJOX0lORk8gIlsgcGlkIF0gICB1aWQgIHRnaWQgdG90YWxfdm0gICAgICByc3MgY3B1IG9vbV9hZGogIgorCSAgICAgICAibmFtZVxuIik7CisJZG9fZWFjaF90aHJlYWQoZywgcCkgeworCQkvKgorCQkgKiB0b3RhbF92bSBhbmQgcnNzIHNpemVzIGRvIG5vdCBleGlzdCBmb3IgdGFza3Mgd2l0aCBhCisJCSAqIGRldGFjaGVkIG1tIHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byByZXBvcnQgdGhlbS4KKwkJICovCisJCWlmICghcC0+bW0pCisJCQljb250aW51ZTsKKwkJaWYgKG1lbSAmJiAhdGFza19pbl9tZW1fY2dyb3VwKHAsIG1lbSkpCisJCQljb250aW51ZTsKKworCQl0YXNrX2xvY2socCk7CisJCXByaW50ayhLRVJOX0lORk8gIlslNWRdICU1ZCAlNWQgJThsdSAlOGx1ICUzZCAgICAgJTNkICVzXG4iLAorCQkgICAgICAgcC0+cGlkLCBwLT51aWQsIHAtPnRnaWQsIHAtPm1tLT50b3RhbF92bSwKKwkJICAgICAgIGdldF9tbV9yc3MocC0+bW0pLCAoaW50KXRhc2tfY3B1KHApLCBwLT5vb21raWxsYWRqLAorCQkgICAgICAgcC0+Y29tbSk7CisJCXRhc2tfdW5sb2NrKHApOworCX0gd2hpbGVfZWFjaF90aHJlYWQoZywgcCk7Cit9CisKKy8qKgogICogU2VuZCBTSUdLSUxMIHRvIHRoZSBzZWxlY3RlZCAgcHJvY2VzcyBpcnJlc3BlY3RpdmUgb2YgIENBUF9TWVNfUkFXX0lPCiAgKiBmbGFnIHRob3VnaCBpdCdzIHVubGlrZWx5IHRoYXQgIHdlIHNlbGVjdCBhIHByb2Nlc3Mgd2l0aCBDQVBfU1lTX1JBV19JTwogICogc2V0LgpAQCAtMzM0LDcgKzM3NSw4IEBACiB9CiAKIHN0YXRpYyBpbnQgb29tX2tpbGxfcHJvY2VzcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGdmcF90IGdmcF9tYXNrLCBpbnQgb3JkZXIsCi0JCQkgICAgdW5zaWduZWQgbG9uZyBwb2ludHMsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCisJCQkgICAgdW5zaWduZWQgbG9uZyBwb2ludHMsIHN0cnVjdCBtZW1fY2dyb3VwICptZW0sCisJCQkgICAgY29uc3QgY2hhciAqbWVzc2FnZSkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmM7CiAKQEAgLTM0NCw2ICszODYsOCBAQAogCQkJY3VycmVudC0+Y29tbSwgZ2ZwX21hc2ssIG9yZGVyLCBjdXJyZW50LT5vb21raWxsYWRqKTsKIAkJZHVtcF9zdGFjaygpOwogCQlzaG93X21lbSgpOworCQlpZiAoc3lzY3RsX29vbV9kdW1wX3Rhc2tzKQorCQkJZHVtcF90YXNrcyhtZW0pOwogCX0KIAogCS8qCkBAIC0zNjgsNiArNDEyLDMxIEBACiAJcmV0dXJuIG9vbV9raWxsX3Rhc2socCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9DT05UCit2b2lkIG1lbV9jZ3JvdXBfb3V0X29mX21lbW9yeShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBnZnBfdCBnZnBfbWFzaykKK3sKKwl1bnNpZ25lZCBsb25nIHBvaW50cyA9IDA7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwOworCisJY2dyb3VwX2xvY2soKTsKKwlyY3VfcmVhZF9sb2NrKCk7CityZXRyeToKKwlwID0gc2VsZWN0X2JhZF9wcm9jZXNzKCZwb2ludHMsIG1lbSk7CisJaWYgKFBUUl9FUlIocCkgPT0gLTFVTCkKKwkJZ290byBvdXQ7CisKKwlpZiAoIXApCisJCXAgPSBjdXJyZW50OworCisJaWYgKG9vbV9raWxsX3Byb2Nlc3MocCwgZ2ZwX21hc2ssIDAsIHBvaW50cywgbWVtLAorCQkJCSJNZW1vcnkgY2dyb3VwIG91dCBvZiBtZW1vcnkiKSkKKwkJZ290byByZXRyeTsKK291dDoKKwlyY3VfcmVhZF91bmxvY2soKTsKKwljZ3JvdXBfdW5sb2NrKCk7Cit9CisjZW5kaWYKKwogc3RhdGljIEJMT0NLSU5HX05PVElGSUVSX0hFQUQob29tX25vdGlmeV9saXN0KTsKIAogaW50IHJlZ2lzdGVyX29vbV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQpAQCAtNDY1LDcgKzUzNCw3IEBACiAKIAlzd2l0Y2ggKGNvbnN0cmFpbnQpIHsKIAljYXNlIENPTlNUUkFJTlRfTUVNT1JZX1BPTElDWToKLQkJb29tX2tpbGxfcHJvY2VzcyhjdXJyZW50LCBnZnBfbWFzaywgb3JkZXIsIHBvaW50cywKKwkJb29tX2tpbGxfcHJvY2VzcyhjdXJyZW50LCBnZnBfbWFzaywgb3JkZXIsIHBvaW50cywgTlVMTCwKIAkJCQkiTm8gYXZhaWxhYmxlIG1lbW9yeSAoTVBPTF9CSU5EKSIpOwogCQlicmVhazsKIApAQCAtNDc1LDcgKzU0NCw3IEBACiAJCS8qIEZhbGwtdGhyb3VnaCAqLwogCWNhc2UgQ09OU1RSQUlOVF9DUFVTRVQ6CiAJCWlmIChzeXNjdGxfb29tX2tpbGxfYWxsb2NhdGluZ190YXNrKSB7Ci0JCQlvb21fa2lsbF9wcm9jZXNzKGN1cnJlbnQsIGdmcF9tYXNrLCBvcmRlciwgcG9pbnRzLAorCQkJb29tX2tpbGxfcHJvY2VzcyhjdXJyZW50LCBnZnBfbWFzaywgb3JkZXIsIHBvaW50cywgTlVMTCwKIAkJCQkJIk91dCBvZiBtZW1vcnkgKG9vbV9raWxsX2FsbG9jYXRpbmdfdGFzaykiKTsKIAkJCWJyZWFrOwogCQl9CkBAIC00ODQsNyArNTUzLDcgQEAKIAkJICogUmFtYm8gbW9kZTogU2hvb3QgZG93biBhIHByb2Nlc3MgYW5kIGhvcGUgaXQgc29sdmVzIHdoYXRldmVyCiAJCSAqIGlzc3VlcyB3ZSBtYXkgaGF2ZS4KIAkJICovCi0JCXAgPSBzZWxlY3RfYmFkX3Byb2Nlc3MoJnBvaW50cyk7CisJCXAgPSBzZWxlY3RfYmFkX3Byb2Nlc3MoJnBvaW50cywgTlVMTCk7CiAKIAkJaWYgKFBUUl9FUlIocCkgPT0gLTFVTCkKIAkJCWdvdG8gb3V0OwpAQCAtNDk1LDcgKzU2NCw3IEBACiAJCQlwYW5pYygiT3V0IG9mIG1lbW9yeSBhbmQgbm8ga2lsbGFibGUgcHJvY2Vzc2VzLi4uXG4iKTsKIAkJfQogCi0JCWlmIChvb21fa2lsbF9wcm9jZXNzKHAsIGdmcF9tYXNrLCBvcmRlciwgcG9pbnRzLAorCQlpZiAob29tX2tpbGxfcHJvY2VzcyhwLCBnZnBfbWFzaywgb3JkZXIsIHBvaW50cywgTlVMTCwKIAkJCQkgICAgICJPdXQgb2YgbWVtb3J5IikpCiAJCQlnb3RvIHJldHJ5OwogCmRpZmYgLS1naXQgYS9tbS9wYWdlX2FsbG9jLmMgYi9tbS9wYWdlX2FsbG9jLmMKaW5kZXggMzc1NzZiOC4uNzViOTc5MyAxMDA2NDQKLS0tIGEvbW0vcGFnZV9hbGxvYy5jCisrKyBiL21tL3BhZ2VfYWxsb2MuYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZmF1bHQtaW5qZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZS1pc29sYXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1jb250cm9sLmg+CiAKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KQEAgLTk4Nyw2ICs5ODgsNyBAQAogCiAJaWYgKCFQYWdlSGlnaE1lbShwYWdlKSkKIAkJZGVidWdfY2hlY2tfbm9fbG9ja3NfZnJlZWQocGFnZV9hZGRyZXNzKHBhZ2UpLCBQQUdFX1NJWkUpOworCVZNX0JVR19PTihwYWdlX2dldF9wYWdlX2Nncm91cChwYWdlKSk7CiAJYXJjaF9mcmVlX3BhZ2UocGFnZSwgMCk7CiAJa2VybmVsX21hcF9wYWdlcyhwYWdlLCAxLCAwKTsKIApAQCAtMTQ0OSw3ICsxNDUxLDcgQEAKIC8qCiAgKiBUaGlzIGlzIHRoZSAnaGVhcnQnIG9mIHRoZSB6b25lZCBidWRkeSBhbGxvY2F0b3IuCiAgKi8KLXN0cnVjdCBwYWdlICogZmFzdGNhbGwKK3N0cnVjdCBwYWdlICoKIF9fYWxsb2NfcGFnZXMoZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlciwKIAkJc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCkKIHsKQEAgLTI1MjUsNiArMjUyNyw3IEBACiAJCXNldF9wYWdlX2xpbmtzKHBhZ2UsIHpvbmUsIG5pZCwgcGZuKTsKIAkJaW5pdF9wYWdlX2NvdW50KHBhZ2UpOwogCQlyZXNldF9wYWdlX21hcGNvdW50KHBhZ2UpOworCQlwYWdlX2Fzc2lnbl9wYWdlX2Nncm91cChwYWdlLCBOVUxMKTsKIAkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOwogCiAJCS8qCmRpZmYgLS1naXQgYS9tbS9ybWFwLmMgYi9tbS9ybWFwLmMKaW5kZXggNTdhZDI3Ni4uOGZkNTI3YyAxMDA2NDQKLS0tIGEvbW0vcm1hcC5jCisrKyBiL21tL3JtYXAuYwpAQCAtNDgsNiArNDgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1jb250cm9sLmg+CiAKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KIApAQCAtMzAxLDcgKzMwMiw4IEBACiAJcmV0dXJuIHJlZmVyZW5jZWQ7CiB9CiAKLXN0YXRpYyBpbnQgcGFnZV9yZWZlcmVuY2VkX2Fub24oc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgaW50IHBhZ2VfcmVmZXJlbmNlZF9hbm9uKHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCXN0cnVjdCBtZW1fY2dyb3VwICptZW1fY29udCkKIHsKIAl1bnNpZ25lZCBpbnQgbWFwY291bnQ7CiAJc3RydWN0IGFub25fdm1hICphbm9uX3ZtYTsKQEAgLTMxNCw2ICszMTYsMTMgQEAKIAogCW1hcGNvdW50ID0gcGFnZV9tYXBjb3VudChwYWdlKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZtYSwgJmFub25fdm1hLT5oZWFkLCBhbm9uX3ZtYV9ub2RlKSB7CisJCS8qCisJCSAqIElmIHdlIGFyZSByZWNsYWltaW5nIG9uIGJlaGFsZiBvZiBhIGNncm91cCwgc2tpcAorCQkgKiBjb3VudGluZyBvbiBiZWhhbGYgb2YgcmVmZXJlbmNlcyBmcm9tIGRpZmZlcmVudAorCQkgKiBjZ3JvdXBzCisJCSAqLworCQlpZiAobWVtX2NvbnQgJiYgIXZtX21hdGNoX2Nncm91cCh2bWEtPnZtX21tLCBtZW1fY29udCkpCisJCQljb250aW51ZTsKIAkJcmVmZXJlbmNlZCArPSBwYWdlX3JlZmVyZW5jZWRfb25lKHBhZ2UsIHZtYSwgJm1hcGNvdW50KTsKIAkJaWYgKCFtYXBjb3VudCkKIAkJCWJyZWFrOwpAQCAtMzM0LDcgKzM0Myw4IEBACiAgKgogICogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBmcm9tIHBhZ2VfcmVmZXJlbmNlZCBmb3Igb2JqZWN0LWJhc2VkIHBhZ2VzLgogICovCi1zdGF0aWMgaW50IHBhZ2VfcmVmZXJlbmNlZF9maWxlKHN0cnVjdCBwYWdlICpwYWdlKQorc3RhdGljIGludCBwYWdlX3JlZmVyZW5jZWRfZmlsZShzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtX2NvbnQpCiB7CiAJdW5zaWduZWQgaW50IG1hcGNvdW50OwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKQEAgLTM2Nyw2ICszNzcsMTMgQEAKIAltYXBjb3VudCA9IHBhZ2VfbWFwY291bnQocGFnZSk7CiAKIAl2bWFfcHJpb190cmVlX2ZvcmVhY2godm1hLCAmaXRlciwgJm1hcHBpbmctPmlfbW1hcCwgcGdvZmYsIHBnb2ZmKSB7CisJCS8qCisJCSAqIElmIHdlIGFyZSByZWNsYWltaW5nIG9uIGJlaGFsZiBvZiBhIGNncm91cCwgc2tpcAorCQkgKiBjb3VudGluZyBvbiBiZWhhbGYgb2YgcmVmZXJlbmNlcyBmcm9tIGRpZmZlcmVudAorCQkgKiBjZ3JvdXBzCisJCSAqLworCQlpZiAobWVtX2NvbnQgJiYgIXZtX21hdGNoX2Nncm91cCh2bWEtPnZtX21tLCBtZW1fY29udCkpCisJCQljb250aW51ZTsKIAkJaWYgKCh2bWEtPnZtX2ZsYWdzICYgKFZNX0xPQ0tFRHxWTV9NQVlTSEFSRSkpCiAJCQkJICA9PSAoVk1fTE9DS0VEfFZNX01BWVNIQVJFKSkgewogCQkJcmVmZXJlbmNlZCsrOwpAQCAtMzg5LDcgKzQwNiw4IEBACiAgKiBRdWljayB0ZXN0X2FuZF9jbGVhcl9yZWZlcmVuY2VkIGZvciBhbGwgbWFwcGluZ3MgdG8gYSBwYWdlLAogICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIHB0ZXMgd2hpY2ggcmVmZXJlbmNlZCB0aGUgcGFnZS4KICAqLwotaW50IHBhZ2VfcmVmZXJlbmNlZChzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IGlzX2xvY2tlZCkKK2ludCBwYWdlX3JlZmVyZW5jZWQoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBpc19sb2NrZWQsCisJCQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtX2NvbnQpCiB7CiAJaW50IHJlZmVyZW5jZWQgPSAwOwogCkBAIC00MDEsMTQgKzQxOSwxNSBAQAogCiAJaWYgKHBhZ2VfbWFwcGVkKHBhZ2UpICYmIHBhZ2UtPm1hcHBpbmcpIHsKIAkJaWYgKFBhZ2VBbm9uKHBhZ2UpKQotCQkJcmVmZXJlbmNlZCArPSBwYWdlX3JlZmVyZW5jZWRfYW5vbihwYWdlKTsKKwkJCXJlZmVyZW5jZWQgKz0gcGFnZV9yZWZlcmVuY2VkX2Fub24ocGFnZSwgbWVtX2NvbnQpOwogCQllbHNlIGlmIChpc19sb2NrZWQpCi0JCQlyZWZlcmVuY2VkICs9IHBhZ2VfcmVmZXJlbmNlZF9maWxlKHBhZ2UpOworCQkJcmVmZXJlbmNlZCArPSBwYWdlX3JlZmVyZW5jZWRfZmlsZShwYWdlLCBtZW1fY29udCk7CiAJCWVsc2UgaWYgKFRlc3RTZXRQYWdlTG9ja2VkKHBhZ2UpKQogCQkJcmVmZXJlbmNlZCsrOwogCQllbHNlIHsKIAkJCWlmIChwYWdlLT5tYXBwaW5nKQotCQkJCXJlZmVyZW5jZWQgKz0gcGFnZV9yZWZlcmVuY2VkX2ZpbGUocGFnZSk7CisJCQkJcmVmZXJlbmNlZCArPQorCQkJCQlwYWdlX3JlZmVyZW5jZWRfZmlsZShwYWdlLCBtZW1fY29udCk7CiAJCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJfQogCX0KQEAgLTU1NCw4ICs1NzMsMTQgQEAKIAlWTV9CVUdfT04oYWRkcmVzcyA8IHZtYS0+dm1fc3RhcnQgfHwgYWRkcmVzcyA+PSB2bWEtPnZtX2VuZCk7CiAJaWYgKGF0b21pY19pbmNfYW5kX3Rlc3QoJnBhZ2UtPl9tYXBjb3VudCkpCiAJCV9fcGFnZV9zZXRfYW5vbl9ybWFwKHBhZ2UsIHZtYSwgYWRkcmVzcyk7Ci0JZWxzZQorCWVsc2UgewogCQlfX3BhZ2VfY2hlY2tfYW5vbl9ybWFwKHBhZ2UsIHZtYSwgYWRkcmVzcyk7CisJCS8qCisJCSAqIFdlIHVuY29uZGl0aW9uYWxseSBjaGFyZ2VkIGR1cmluZyBwcmVwYXJlLCB3ZSB1bmNoYXJnZSBoZXJlCisJCSAqIFRoaXMgdGFrZXMgY2FyZSBvZiBiYWxhbmNpbmcgdGhlIHJlZmVyZW5jZSBjb3VudHMKKwkJICovCisJCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZShwYWdlKTsKKwl9CiB9CiAKIC8qCkBAIC01ODYsNiArNjExLDEyIEBACiB7CiAJaWYgKGF0b21pY19pbmNfYW5kX3Rlc3QoJnBhZ2UtPl9tYXBjb3VudCkpCiAJCV9faW5jX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9GSUxFX01BUFBFRCk7CisJZWxzZQorCQkvKgorCQkgKiBXZSB1bmNvbmRpdGlvbmFsbHkgY2hhcmdlZCBkdXJpbmcgcHJlcGFyZSwgd2UgdW5jaGFyZ2UgaGVyZQorCQkgKiBUaGlzIHRha2VzIGNhcmUgb2YgYmFsYW5jaW5nIHRoZSByZWZlcmVuY2UgY291bnRzCisJCSAqLworCQltZW1fY2dyb3VwX3VuY2hhcmdlX3BhZ2UocGFnZSk7CiB9CiAKICNpZmRlZiBDT05GSUdfREVCVUdfVk0KQEAgLTY0Niw2ICs2NzcsOCBAQAogCQkJcGFnZV9jbGVhcl9kaXJ0eShwYWdlKTsKIAkJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOwogCQl9CisJCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZShwYWdlKTsKKwogCQlfX2RlY196b25lX3BhZ2Vfc3RhdGUocGFnZSwKIAkJCQlQYWdlQW5vbihwYWdlKSA/IE5SX0FOT05fUEFHRVMgOiBOUl9GSUxFX01BUFBFRCk7CiAJfQpkaWZmIC0tZ2l0IGEvbW0vc2htZW0uYyBiL21tL3NobWVtLmMKaW5kZXggMGYyNDZjNC4uOTBiNTc2YyAxMDA2NDQKLS0tIGEvbW0vc2htZW0uYworKysgYi9tbS9zaG1lbS5jCkBAIC00OSw2ICs0OSw3IEBACiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9taWdyYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgpAQCAtODQsNiArODUsMTggQEAKIAlTR1BfV1JJVEUsCS8qIG1heSBleGNlZWQgaV9zaXplLCBtYXkgYWxsb2NhdGUgcGFnZSAqLwogfTsKIAorI2lmZGVmIENPTkZJR19UTVBGUworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2htZW1fZGVmYXVsdF9tYXhfYmxvY2tzKHZvaWQpCit7CisJcmV0dXJuIHRvdGFscmFtX3BhZ2VzIC8gMjsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2htZW1fZGVmYXVsdF9tYXhfaW5vZGVzKHZvaWQpCit7CisJcmV0dXJuIG1pbih0b3RhbHJhbV9wYWdlcyAtIHRvdGFsaGlnaF9wYWdlcywgdG90YWxyYW1fcGFnZXMgLyAyKTsKK30KKyNlbmRpZgorCiBzdGF0aWMgaW50IHNobWVtX2dldHBhZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBpZHgsCiAJCQkgc3RydWN0IHBhZ2UgKipwYWdlcCwgZW51bSBzZ3BfdHlwZSBzZ3AsIGludCAqdHlwZSk7CiAKQEAgLTkxMiw5ICs5MjUsMTMgQEAKIAllcnJvciA9IDE7CiAJaWYgKCFpbm9kZSkKIAkJZ290byBvdXQ7Ci0JZXJyb3IgPSByYWRpeF90cmVlX3ByZWxvYWQoR0ZQX0tFUk5FTCk7CisJLyogUHJlY2hhcmdlIHBhZ2Ugd2hpbGUgd2UgY2FuIHdhaXQsIGNvbXBlbnNhdGUgYWZ0ZXJ3YXJkcyAqLworCWVycm9yID0gbWVtX2Nncm91cF9jYWNoZV9jaGFyZ2UocGFnZSwgY3VycmVudC0+bW0sIEdGUF9LRVJORUwpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXQ7CisJZXJyb3IgPSByYWRpeF90cmVlX3ByZWxvYWQoR0ZQX0tFUk5FTCk7CisJaWYgKGVycm9yKQorCQlnb3RvIHVuY2hhcmdlOwogCWVycm9yID0gMTsKIAogCXNwaW5fbG9jaygmaW5mby0+bG9jayk7CkBAIC05NDcsNiArOTY0LDggQEAKIAkJc2htZW1fc3dwX3VubWFwKHB0cik7CiAJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwogCXJhZGl4X3RyZWVfcHJlbG9hZF9lbmQoKTsKK3VuY2hhcmdlOgorCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZShwYWdlKTsKIG91dDoKIAl1bmxvY2tfcGFnZShwYWdlKTsKIAlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CkBAIC0xMDYyLDcgKzEwODEsOCBAQAogfQogCiAjaWZkZWYgQ09ORklHX05VTUEKLXN0YXRpYyBpbmxpbmUgaW50IHNobWVtX3BhcnNlX21wb2woY2hhciAqdmFsdWUsIGludCAqcG9saWN5LCBub2RlbWFza190ICpwb2xpY3lfbm9kZXMpCisjaWZkZWYgQ09ORklHX1RNUEZTCitzdGF0aWMgaW50IHNobWVtX3BhcnNlX21wb2woY2hhciAqdmFsdWUsIGludCAqcG9saWN5LCBub2RlbWFza190ICpwb2xpY3lfbm9kZXMpCiB7CiAJY2hhciAqbm9kZWxpc3QgPSBzdHJjaHIodmFsdWUsICc6Jyk7CiAJaW50IGVyciA9IDE7CkBAIC0xMTExLDYgKzExMzEsNDIgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgdm9pZCBzaG1lbV9zaG93X21wb2woc3RydWN0IHNlcV9maWxlICpzZXEsIGludCBwb2xpY3ksCisJCQkgICAgY29uc3Qgbm9kZW1hc2tfdCBwb2xpY3lfbm9kZXMpCit7CisJY2hhciAqcG9saWN5X3N0cmluZzsKKworCXN3aXRjaCAocG9saWN5KSB7CisJY2FzZSBNUE9MX1BSRUZFUlJFRDoKKwkJcG9saWN5X3N0cmluZyA9ICJwcmVmZXIiOworCQlicmVhazsKKwljYXNlIE1QT0xfQklORDoKKwkJcG9saWN5X3N0cmluZyA9ICJiaW5kIjsKKwkJYnJlYWs7CisJY2FzZSBNUE9MX0lOVEVSTEVBVkU6CisJCXBvbGljeV9zdHJpbmcgPSAiaW50ZXJsZWF2ZSI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIE1QT0xfREVGQVVMVCAqLworCQlyZXR1cm47CisJfQorCisJc2VxX3ByaW50ZihzZXEsICIsbXBvbD0lcyIsIHBvbGljeV9zdHJpbmcpOworCisJaWYgKHBvbGljeSAhPSBNUE9MX0lOVEVSTEVBVkUgfHwKKwkgICAgIW5vZGVzX2VxdWFsKHBvbGljeV9ub2Rlcywgbm9kZV9zdGF0ZXNbTl9ISUdIX01FTU9SWV0pKSB7CisJCWNoYXIgYnVmZmVyWzY0XTsKKwkJaW50IGxlbjsKKworCQlsZW4gPSBub2RlbGlzdF9zY25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgcG9saWN5X25vZGVzKTsKKwkJaWYgKGxlbiA8IHNpemVvZihidWZmZXIpKQorCQkJc2VxX3ByaW50ZihzZXEsICI6JXMiLCBidWZmZXIpOworCQllbHNlCisJCQlzZXFfcHJpbnRmKHNlcSwgIjo/Iik7CisJfQorfQorI2VuZGlmIC8qIENPTkZJR19UTVBGUyAqLworCiBzdGF0aWMgc3RydWN0IHBhZ2UgKnNobWVtX3N3YXBpbihzd3BfZW50cnlfdCBlbnRyeSwgZ2ZwX3QgZ2ZwLAogCQkJc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm8sIHVuc2lnbmVkIGxvbmcgaWR4KQogewpAQCAtMTE0MiwxMyArMTE5OCwyMCBAQAogCW1wb2xfZnJlZShwdm1hLnZtX3BvbGljeSk7CiAJcmV0dXJuIHBhZ2U7CiB9Ci0jZWxzZQorI2Vsc2UgLyogIUNPTkZJR19OVU1BICovCisjaWZkZWYgQ09ORklHX1RNUEZTCiBzdGF0aWMgaW5saW5lIGludCBzaG1lbV9wYXJzZV9tcG9sKGNoYXIgKnZhbHVlLCBpbnQgKnBvbGljeSwKIAkJCQkJCW5vZGVtYXNrX3QgKnBvbGljeV9ub2RlcykKIHsKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHNobWVtX3Nob3dfbXBvbChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgaW50IHBvbGljeSwKKwkJCSAgICBjb25zdCBub2RlbWFza190IHBvbGljeV9ub2RlcykKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfVE1QRlMgKi8KKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqc2htZW1fc3dhcGluKHN3cF9lbnRyeV90IGVudHJ5LCBnZnBfdCBnZnAsCiAJCQlzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbywgdW5zaWduZWQgbG9uZyBpZHgpCiB7CkBAIC0xMTYwLDcgKzEyMjMsNyBAQAogewogCXJldHVybiBhbGxvY19wYWdlKGdmcCk7CiB9Ci0jZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfTlVNQSAqLwogCiAvKgogICogc2htZW1fZ2V0cGFnZSAtIGVpdGhlciBnZXQgdGhlIHBhZ2UgZnJvbSBzd2FwIG9yIGFsbG9jYXRlIGEgbmV3IG9uZQpAQCAtMTMwOCw2ICsxMzcxLDEzIEBACiAJCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CiAJCQl1bmxvY2tfcGFnZShzd2FwcGFnZSk7CiAJCQlwYWdlX2NhY2hlX3JlbGVhc2Uoc3dhcHBhZ2UpOworCQkJaWYgKGVycm9yID09IC1FTk9NRU0pIHsKKwkJCQkvKiBhbGxvdyByZWNsYWltIGZyb20gdGhpcyBtZW1vcnkgY2dyb3VwICovCisJCQkJZXJyb3IgPSBtZW1fY2dyb3VwX2NhY2hlX2NoYXJnZShOVUxMLAorCQkJCQljdXJyZW50LT5tbSwgZ2ZwICYgfl9fR0ZQX0hJR0hNRU0pOworCQkJCWlmIChlcnJvcikKKwkJCQkJZ290byBmYWlsZWQ7CisJCQl9CiAJCQlnb3RvIHJlcGVhdDsKIAkJfQogCX0gZWxzZSBpZiAoc2dwID09IFNHUF9SRUFEICYmICFmaWxlcGFnZSkgewpAQCAtMTM1Myw2ICsxNDIzLDE3IEBACiAJCQkJZ290byBmYWlsZWQ7CiAJCQl9CiAKKwkJCS8qIFByZWNoYXJnZSBwYWdlIHdoaWxlIHdlIGNhbiB3YWl0LCBjb21wZW5zYXRlIGFmdGVyICovCisJCQllcnJvciA9IG1lbV9jZ3JvdXBfY2FjaGVfY2hhcmdlKGZpbGVwYWdlLCBjdXJyZW50LT5tbSwKKwkJCQkJCQlnZnAgJiB+X19HRlBfSElHSE1FTSk7CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlwYWdlX2NhY2hlX3JlbGVhc2UoZmlsZXBhZ2UpOworCQkJCXNobWVtX3VuYWNjdF9ibG9ja3MoaW5mby0+ZmxhZ3MsIDEpOworCQkJCXNobWVtX2ZyZWVfYmxvY2tzKGlub2RlLCAxKTsKKwkJCQlmaWxlcGFnZSA9IE5VTEw7CisJCQkJZ290byBmYWlsZWQ7CisJCQl9CisKIAkJCXNwaW5fbG9jaygmaW5mby0+bG9jayk7CiAJCQllbnRyeSA9IHNobWVtX3N3cF9hbGxvYyhpbmZvLCBpZHgsIHNncCk7CiAJCQlpZiAoSVNfRVJSKGVudHJ5KSkKQEAgLTEzNjQsNiArMTQ0NSw3IEBACiAJCQlpZiAoZXJyb3IgfHwgc3dhcC52YWwgfHwgMCAhPSBhZGRfdG9fcGFnZV9jYWNoZV9scnUoCiAJCQkJCWZpbGVwYWdlLCBtYXBwaW5nLCBpZHgsIEdGUF9OT1dBSVQpKSB7CiAJCQkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOworCQkJCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZShmaWxlcGFnZSk7CiAJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKGZpbGVwYWdlKTsKIAkJCQlzaG1lbV91bmFjY3RfYmxvY2tzKGluZm8tPmZsYWdzLCAxKTsKIAkJCQlzaG1lbV9mcmVlX2Jsb2Nrcyhpbm9kZSwgMSk7CkBAIC0xMzcyLDYgKzE0NTQsNyBAQAogCQkJCQlnb3RvIGZhaWxlZDsKIAkJCQlnb3RvIHJlcGVhdDsKIAkJCX0KKwkJCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZShmaWxlcGFnZSk7CiAJCQlpbmZvLT5mbGFncyB8PSBTSE1FTV9QQUdFSU47CiAJCX0KIApAQCAtMjA1MSw5ICsyMTM0LDggQEAKIAkuZmhfdG9fZGVudHJ5CT0gc2htZW1fZmhfdG9fZGVudHJ5LAogfTsKIAotc3RhdGljIGludCBzaG1lbV9wYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMsIGludCAqbW9kZSwgdWlkX3QgKnVpZCwKLQlnaWRfdCAqZ2lkLCB1bnNpZ25lZCBsb25nICpibG9ja3MsIHVuc2lnbmVkIGxvbmcgKmlub2RlcywKLQlpbnQgKnBvbGljeSwgbm9kZW1hc2tfdCAqcG9saWN5X25vZGVzKQorc3RhdGljIGludCBzaG1lbV9wYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMsIHN0cnVjdCBzaG1lbV9zYl9pbmZvICpzYmluZm8sCisJCQkgICAgICAgYm9vbCByZW1vdW50KQogewogCWNoYXIgKnRoaXNfY2hhciwgKnZhbHVlLCAqcmVzdDsKIApAQCAtMjA5NiwzNSArMjE3OCwzNyBAQAogCQkJfQogCQkJaWYgKCpyZXN0KQogCQkJCWdvdG8gYmFkX3ZhbDsKLQkJCSpibG9ja3MgPSBESVZfUk9VTkRfVVAoc2l6ZSwgUEFHRV9DQUNIRV9TSVpFKTsKKwkJCXNiaW5mby0+bWF4X2Jsb2NrcyA9CisJCQkJRElWX1JPVU5EX1VQKHNpemUsIFBBR0VfQ0FDSEVfU0laRSk7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIm5yX2Jsb2NrcyIpKSB7Ci0JCQkqYmxvY2tzID0gbWVtcGFyc2UodmFsdWUsJnJlc3QpOworCQkJc2JpbmZvLT5tYXhfYmxvY2tzID0gbWVtcGFyc2UodmFsdWUsICZyZXN0KTsKIAkJCWlmICgqcmVzdCkKIAkJCQlnb3RvIGJhZF92YWw7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIm5yX2lub2RlcyIpKSB7Ci0JCQkqaW5vZGVzID0gbWVtcGFyc2UodmFsdWUsJnJlc3QpOworCQkJc2JpbmZvLT5tYXhfaW5vZGVzID0gbWVtcGFyc2UodmFsdWUsICZyZXN0KTsKIAkJCWlmICgqcmVzdCkKIAkJCQlnb3RvIGJhZF92YWw7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIm1vZGUiKSkgewotCQkJaWYgKCFtb2RlKQorCQkJaWYgKHJlbW91bnQpCiAJCQkJY29udGludWU7Ci0JCQkqbW9kZSA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCZyZXN0LDgpOworCQkJc2JpbmZvLT5tb2RlID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsICZyZXN0LCA4KSAmIDA3Nzc3OwogCQkJaWYgKCpyZXN0KQogCQkJCWdvdG8gYmFkX3ZhbDsKIAkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwidWlkIikpIHsKLQkJCWlmICghdWlkKQorCQkJaWYgKHJlbW91bnQpCiAJCQkJY29udGludWU7Ci0JCQkqdWlkID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsJnJlc3QsMCk7CisJCQlzYmluZm8tPnVpZCA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCAmcmVzdCwgMCk7CiAJCQlpZiAoKnJlc3QpCiAJCQkJZ290byBiYWRfdmFsOwogCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCJnaWQiKSkgewotCQkJaWYgKCFnaWQpCisJCQlpZiAocmVtb3VudCkKIAkJCQljb250aW51ZTsKLQkJCSpnaWQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwmcmVzdCwwKTsKKwkJCXNiaW5mby0+Z2lkID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsICZyZXN0LCAwKTsKIAkJCWlmICgqcmVzdCkKIAkJCQlnb3RvIGJhZF92YWw7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIm1wb2wiKSkgewotCQkJaWYgKHNobWVtX3BhcnNlX21wb2wodmFsdWUscG9saWN5LHBvbGljeV9ub2RlcykpCisJCQlpZiAoc2htZW1fcGFyc2VfbXBvbCh2YWx1ZSwgJnNiaW5mby0+cG9saWN5LAorCQkJCQkgICAgICZzYmluZm8tPnBvbGljeV9ub2RlcykpCiAJCQkJZ290byBiYWRfdmFsOwogCQl9IGVsc2UgewogCQkJcHJpbnRrKEtFUk5fRVJSICJ0bXBmczogQmFkIG1vdW50IG9wdGlvbiAlc1xuIiwKQEAgLTIxNDQsMjQgKzIyMjgsMjAgQEAKIHN0YXRpYyBpbnQgc2htZW1fcmVtb3VudF9mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQogewogCXN0cnVjdCBzaG1lbV9zYl9pbmZvICpzYmluZm8gPSBTSE1FTV9TQihzYik7Ci0JdW5zaWduZWQgbG9uZyBtYXhfYmxvY2tzID0gc2JpbmZvLT5tYXhfYmxvY2tzOwotCXVuc2lnbmVkIGxvbmcgbWF4X2lub2RlcyA9IHNiaW5mby0+bWF4X2lub2RlczsKLQlpbnQgcG9saWN5ID0gc2JpbmZvLT5wb2xpY3k7Ci0Jbm9kZW1hc2tfdCBwb2xpY3lfbm9kZXMgPSBzYmluZm8tPnBvbGljeV9ub2RlczsKKwlzdHJ1Y3Qgc2htZW1fc2JfaW5mbyBjb25maWcgPSAqc2JpbmZvOwogCXVuc2lnbmVkIGxvbmcgYmxvY2tzOwogCXVuc2lnbmVkIGxvbmcgaW5vZGVzOwogCWludCBlcnJvciA9IC1FSU5WQUw7CiAKLQlpZiAoc2htZW1fcGFyc2Vfb3B0aW9ucyhkYXRhLCBOVUxMLCBOVUxMLCBOVUxMLCAmbWF4X2Jsb2NrcywKLQkJCQkmbWF4X2lub2RlcywgJnBvbGljeSwgJnBvbGljeV9ub2RlcykpCisJaWYgKHNobWVtX3BhcnNlX29wdGlvbnMoZGF0YSwgJmNvbmZpZywgdHJ1ZSkpCiAJCXJldHVybiBlcnJvcjsKIAogCXNwaW5fbG9jaygmc2JpbmZvLT5zdGF0X2xvY2spOwogCWJsb2NrcyA9IHNiaW5mby0+bWF4X2Jsb2NrcyAtIHNiaW5mby0+ZnJlZV9ibG9ja3M7CiAJaW5vZGVzID0gc2JpbmZvLT5tYXhfaW5vZGVzIC0gc2JpbmZvLT5mcmVlX2lub2RlczsKLQlpZiAobWF4X2Jsb2NrcyA8IGJsb2NrcykKKwlpZiAoY29uZmlnLm1heF9ibG9ja3MgPCBibG9ja3MpCiAJCWdvdG8gb3V0OwotCWlmIChtYXhfaW5vZGVzIDwgaW5vZGVzKQorCWlmIChjb25maWcubWF4X2lub2RlcyA8IGlub2RlcykKIAkJZ290byBvdXQ7CiAJLyoKIAkgKiBUaG9zZSB0ZXN0cyBhbHNvIGRpc2FsbG93IGxpbWl0ZWQtPnVubGltaXRlZCB3aGlsZSBhbnkgYXJlIGluCkBAIC0yMTY5LDIzICsyMjQ5LDQyIEBACiAJICogYnV0IHdlIG11c3Qgc2VwYXJhdGVseSBkaXNhbGxvdyB1bmxpbWl0ZWQtPmxpbWl0ZWQsIGJlY2F1c2UKIAkgKiBpbiB0aGF0IGNhc2Ugd2UgaGF2ZSBubyByZWNvcmQgb2YgaG93IG11Y2ggaXMgYWxyZWFkeSBpbiB1c2UuCiAJICovCi0JaWYgKG1heF9ibG9ja3MgJiYgIXNiaW5mby0+bWF4X2Jsb2NrcykKKwlpZiAoY29uZmlnLm1heF9ibG9ja3MgJiYgIXNiaW5mby0+bWF4X2Jsb2NrcykKIAkJZ290byBvdXQ7Ci0JaWYgKG1heF9pbm9kZXMgJiYgIXNiaW5mby0+bWF4X2lub2RlcykKKwlpZiAoY29uZmlnLm1heF9pbm9kZXMgJiYgIXNiaW5mby0+bWF4X2lub2RlcykKIAkJZ290byBvdXQ7CiAKIAllcnJvciA9IDA7Ci0Jc2JpbmZvLT5tYXhfYmxvY2tzICA9IG1heF9ibG9ja3M7Ci0Jc2JpbmZvLT5mcmVlX2Jsb2NrcyA9IG1heF9ibG9ja3MgLSBibG9ja3M7Ci0Jc2JpbmZvLT5tYXhfaW5vZGVzICA9IG1heF9pbm9kZXM7Ci0Jc2JpbmZvLT5mcmVlX2lub2RlcyA9IG1heF9pbm9kZXMgLSBpbm9kZXM7Ci0Jc2JpbmZvLT5wb2xpY3kgPSBwb2xpY3k7Ci0Jc2JpbmZvLT5wb2xpY3lfbm9kZXMgPSBwb2xpY3lfbm9kZXM7CisJc2JpbmZvLT5tYXhfYmxvY2tzICA9IGNvbmZpZy5tYXhfYmxvY2tzOworCXNiaW5mby0+ZnJlZV9ibG9ja3MgPSBjb25maWcubWF4X2Jsb2NrcyAtIGJsb2NrczsKKwlzYmluZm8tPm1heF9pbm9kZXMgID0gY29uZmlnLm1heF9pbm9kZXM7CisJc2JpbmZvLT5mcmVlX2lub2RlcyA9IGNvbmZpZy5tYXhfaW5vZGVzIC0gaW5vZGVzOworCXNiaW5mby0+cG9saWN5ICAgICAgPSBjb25maWcucG9saWN5OworCXNiaW5mby0+cG9saWN5X25vZGVzID0gY29uZmlnLnBvbGljeV9ub2RlczsKIG91dDoKIAlzcGluX3VubG9jaygmc2JpbmZvLT5zdGF0X2xvY2spOwogCXJldHVybiBlcnJvcjsKIH0KLSNlbmRpZgorCitzdGF0aWMgaW50IHNobWVtX3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IHZmc21vdW50ICp2ZnMpCit7CisJc3RydWN0IHNobWVtX3NiX2luZm8gKnNiaW5mbyA9IFNITUVNX1NCKHZmcy0+bW50X3NiKTsKKworCWlmIChzYmluZm8tPm1heF9ibG9ja3MgIT0gc2htZW1fZGVmYXVsdF9tYXhfYmxvY2tzKCkpCisJCXNlcV9wcmludGYoc2VxLCAiLHNpemU9JWx1ayIsCisJCQlzYmluZm8tPm1heF9ibG9ja3MgPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSAxMCkpOworCWlmIChzYmluZm8tPm1heF9pbm9kZXMgIT0gc2htZW1fZGVmYXVsdF9tYXhfaW5vZGVzKCkpCisJCXNlcV9wcmludGYoc2VxLCAiLG5yX2lub2Rlcz0lbHUiLCBzYmluZm8tPm1heF9pbm9kZXMpOworCWlmIChzYmluZm8tPm1vZGUgIT0gKFNfSVJXWFVHTyB8IFNfSVNWVFgpKQorCQlzZXFfcHJpbnRmKHNlcSwgIixtb2RlPSUwM28iLCBzYmluZm8tPm1vZGUpOworCWlmIChzYmluZm8tPnVpZCAhPSAwKQorCQlzZXFfcHJpbnRmKHNlcSwgIix1aWQ9JXUiLCBzYmluZm8tPnVpZCk7CisJaWYgKHNiaW5mby0+Z2lkICE9IDApCisJCXNlcV9wcmludGYoc2VxLCAiLGdpZD0ldSIsIHNiaW5mby0+Z2lkKTsKKwlzaG1lbV9zaG93X21wb2woc2VxLCBzYmluZm8tPnBvbGljeSwgc2JpbmZvLT5wb2xpY3lfbm9kZXMpOworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19UTVBGUyAqLwogCiBzdGF0aWMgdm9pZCBzaG1lbV9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKQEAgLTIxOTgsMTUgKzIyOTcsMjMgQEAKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBkZW50cnkgKnJvb3Q7Ci0JaW50IG1vZGUgICA9IFNfSVJXWFVHTyB8IFNfSVNWVFg7Ci0JdWlkX3QgdWlkID0gY3VycmVudC0+ZnN1aWQ7Ci0JZ2lkX3QgZ2lkID0gY3VycmVudC0+ZnNnaWQ7Ci0JaW50IGVyciA9IC1FTk9NRU07CiAJc3RydWN0IHNobWVtX3NiX2luZm8gKnNiaW5mbzsKLQl1bnNpZ25lZCBsb25nIGJsb2NrcyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBpbm9kZXMgPSAwOwotCWludCBwb2xpY3kgPSBNUE9MX0RFRkFVTFQ7Ci0Jbm9kZW1hc2tfdCBwb2xpY3lfbm9kZXMgPSBub2RlX3N0YXRlc1tOX0hJR0hfTUVNT1JZXTsKKwlpbnQgZXJyID0gLUVOT01FTTsKKworCS8qIFJvdW5kIHVwIHRvIEwxX0NBQ0hFX0JZVEVTIHRvIHJlc2lzdCBmYWxzZSBzaGFyaW5nICovCisJc2JpbmZvID0ga21hbGxvYyhtYXgoKGludClzaXplb2Yoc3RydWN0IHNobWVtX3NiX2luZm8pLAorCQkJCUwxX0NBQ0hFX0JZVEVTKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYmluZm8pCisJCXJldHVybiAtRU5PTUVNOworCisJc2JpbmZvLT5tYXhfYmxvY2tzID0gMDsKKwlzYmluZm8tPm1heF9pbm9kZXMgPSAwOworCXNiaW5mby0+bW9kZSA9IFNfSVJXWFVHTyB8IFNfSVNWVFg7CisJc2JpbmZvLT51aWQgPSBjdXJyZW50LT5mc3VpZDsKKwlzYmluZm8tPmdpZCA9IGN1cnJlbnQtPmZzZ2lkOworCXNiaW5mby0+cG9saWN5ID0gTVBPTF9ERUZBVUxUOworCXNiaW5mby0+cG9saWN5X25vZGVzID0gbm9kZV9zdGF0ZXNbTl9ISUdIX01FTU9SWV07CisJc2ItPnNfZnNfaW5mbyA9IHNiaW5mbzsKIAogI2lmZGVmIENPTkZJR19UTVBGUwogCS8qCkBAIC0yMjE1LDM0ICsyMzIyLDIyIEBACiAJICogYnV0IHRoZSBpbnRlcm5hbCBpbnN0YW5jZSBpcyBsZWZ0IHVubGltaXRlZC4KIAkgKi8KIAlpZiAoIShzYi0+c19mbGFncyAmIE1TX05PVVNFUikpIHsKLQkJYmxvY2tzID0gdG90YWxyYW1fcGFnZXMgLyAyOwotCQlpbm9kZXMgPSB0b3RhbHJhbV9wYWdlcyAtIHRvdGFsaGlnaF9wYWdlczsKLQkJaWYgKGlub2RlcyA+IGJsb2NrcykKLQkJCWlub2RlcyA9IGJsb2NrczsKLQkJaWYgKHNobWVtX3BhcnNlX29wdGlvbnMoZGF0YSwgJm1vZGUsICZ1aWQsICZnaWQsICZibG9ja3MsCi0JCQkJCSZpbm9kZXMsICZwb2xpY3ksICZwb2xpY3lfbm9kZXMpKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNiaW5mby0+bWF4X2Jsb2NrcyA9IHNobWVtX2RlZmF1bHRfbWF4X2Jsb2NrcygpOworCQlzYmluZm8tPm1heF9pbm9kZXMgPSBzaG1lbV9kZWZhdWx0X21heF9pbm9kZXMoKTsKKwkJaWYgKHNobWVtX3BhcnNlX29wdGlvbnMoZGF0YSwgc2JpbmZvLCBmYWxzZSkpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQogCX0KIAlzYi0+c19leHBvcnRfb3AgPSAmc2htZW1fZXhwb3J0X29wczsKICNlbHNlCiAJc2ItPnNfZmxhZ3MgfD0gTVNfTk9VU0VSOwogI2VuZGlmCiAKLQkvKiBSb3VuZCB1cCB0byBMMV9DQUNIRV9CWVRFUyB0byByZXNpc3QgZmFsc2Ugc2hhcmluZyAqLwotCXNiaW5mbyA9IGttYWxsb2MobWF4KChpbnQpc2l6ZW9mKHN0cnVjdCBzaG1lbV9zYl9pbmZvKSwKLQkJCQlMMV9DQUNIRV9CWVRFUyksIEdGUF9LRVJORUwpOwotCWlmICghc2JpbmZvKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCXNwaW5fbG9ja19pbml0KCZzYmluZm8tPnN0YXRfbG9jayk7Ci0Jc2JpbmZvLT5tYXhfYmxvY2tzID0gYmxvY2tzOwotCXNiaW5mby0+ZnJlZV9ibG9ja3MgPSBibG9ja3M7Ci0Jc2JpbmZvLT5tYXhfaW5vZGVzID0gaW5vZGVzOwotCXNiaW5mby0+ZnJlZV9pbm9kZXMgPSBpbm9kZXM7Ci0Jc2JpbmZvLT5wb2xpY3kgPSBwb2xpY3k7Ci0Jc2JpbmZvLT5wb2xpY3lfbm9kZXMgPSBwb2xpY3lfbm9kZXM7CisJc2JpbmZvLT5mcmVlX2Jsb2NrcyA9IHNiaW5mby0+bWF4X2Jsb2NrczsKKwlzYmluZm8tPmZyZWVfaW5vZGVzID0gc2JpbmZvLT5tYXhfaW5vZGVzOwogCi0Jc2ItPnNfZnNfaW5mbyA9IHNiaW5mbzsKIAlzYi0+c19tYXhieXRlcyA9IFNITUVNX01BWF9CWVRFUzsKIAlzYi0+c19ibG9ja3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CiAJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSBQQUdFX0NBQ0hFX1NISUZUOwpAQCAtMjI1NCwxMSArMjM0OSwxMSBAQAogCXNiLT5zX2ZsYWdzIHw9IE1TX1BPU0lYQUNMOwogI2VuZGlmCiAKLQlpbm9kZSA9IHNobWVtX2dldF9pbm9kZShzYiwgU19JRkRJUiB8IG1vZGUsIDApOworCWlub2RlID0gc2htZW1fZ2V0X2lub2RlKHNiLCBTX0lGRElSIHwgc2JpbmZvLT5tb2RlLCAwKTsKIAlpZiAoIWlub2RlKQogCQlnb3RvIGZhaWxlZDsKLQlpbm9kZS0+aV91aWQgPSB1aWQ7Ci0JaW5vZGUtPmlfZ2lkID0gZ2lkOworCWlub2RlLT5pX3VpZCA9IHNiaW5mby0+dWlkOworCWlub2RlLT5pX2dpZCA9IHNiaW5mby0+Z2lkOwogCXJvb3QgPSBkX2FsbG9jX3Jvb3QoaW5vZGUpOwogCWlmICghcm9vdCkKIAkJZ290byBmYWlsZWRfaXB1dDsKQEAgLTIzOTQsNiArMjQ4OSw3IEBACiAjaWZkZWYgQ09ORklHX1RNUEZTCiAJLnN0YXRmcwkJPSBzaG1lbV9zdGF0ZnMsCiAJLnJlbW91bnRfZnMJPSBzaG1lbV9yZW1vdW50X2ZzLAorCS5zaG93X29wdGlvbnMJPSBzaG1lbV9zaG93X29wdGlvbnMsCiAjZW5kaWYKIAkuZGVsZXRlX2lub2RlCT0gc2htZW1fZGVsZXRlX2lub2RlLAogCS5kcm9wX2lub2RlCT0gZ2VuZXJpY19kZWxldGVfaW5vZGUsCmRpZmYgLS1naXQgYS9tbS9zbHViLmMgYi9tbS9zbHViLmMKaW5kZXggM2YwNTY2Ny4uZTI5ODlhZSAxMDA2NDQKLS0tIGEvbW0vc2x1Yi5jCisrKyBiL21tL3NsdWIuYwpAQCAtMTQ5LDYgKzE0OSwxMyBAQAogLyogRW5hYmxlIHRvIHRlc3QgcmVjb3ZlcnkgZnJvbSBzbGFiIGNvcnJ1cHRpb24gb24gYm9vdCAqLwogI3VuZGVmIFNMVUJfUkVTSUxJRU5DWV9URVNUCiAKKy8qCisgKiBDdXJyZW50bHkgZmFzdHBhdGggaXMgbm90IHN1cHBvcnRlZCBpZiBwcmVlbXB0aW9uIGlzIGVuYWJsZWQuCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19GQVNUX0NNUFhDSEdfTE9DQUwpICYmICFkZWZpbmVkKENPTkZJR19QUkVFTVBUKQorI2RlZmluZSBTTFVCX0ZBU1RQQVRICisjZW5kaWYKKwogI2lmIFBBR0VfU0hJRlQgPD0gMTIKIAogLyoKQEAgLTI0Myw2ICsyNTAsNyBAQAogc3RhdGljIGludCBzeXNmc19zbGFiX2FkZChzdHJ1Y3Qga21lbV9jYWNoZSAqKTsKIHN0YXRpYyBpbnQgc3lzZnNfc2xhYl9hbGlhcyhzdHJ1Y3Qga21lbV9jYWNoZSAqLCBjb25zdCBjaGFyICopOwogc3RhdGljIHZvaWQgc3lzZnNfc2xhYl9yZW1vdmUoc3RydWN0IGttZW1fY2FjaGUgKik7CisKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBzeXNmc19zbGFiX2FkZChzdHJ1Y3Qga21lbV9jYWNoZSAqcykgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSBpbnQgc3lzZnNfc2xhYl9hbGlhcyhzdHJ1Y3Qga21lbV9jYWNoZSAqcywgY29uc3QgY2hhciAqcCkKQEAgLTI1MSw4ICsyNTksMTYgQEAKIHsKIAlrZnJlZShzKTsKIH0KKwogI2VuZGlmCiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdGF0KHN0cnVjdCBrbWVtX2NhY2hlX2NwdSAqYywgZW51bSBzdGF0X2l0ZW0gc2kpCit7CisjaWZkZWYgQ09ORklHX1NMVUJfU1RBVFMKKwljLT5zdGF0W3NpXSsrOworI2VuZGlmCit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJQ29yZSBzbGFiIGNhY2hlIGZ1bmN0aW9ucwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yODAsMTUgKzI5NiwzMiBAQAogI2VuZGlmCiB9CiAKKy8qCisgKiBUaGUgZW5kIHBvaW50ZXIgaW4gYSBzbGFiIGlzIHNwZWNpYWwuIEl0IHBvaW50cyB0byB0aGUgZmlyc3Qgb2JqZWN0IGluIHRoZQorICogc2xhYiBidXQgaGFzIGJpdCAwIHNldCB0byBtYXJrIGl0LgorICoKKyAqIE5vdGUgdGhhdCBTTFVCIHJlbGllcyBvbiBwYWdlX21hcHBpbmcgcmV0dXJuaW5nIE5VTEwgZm9yIHBhZ2VzIHdpdGggYml0IDAKKyAqIGluIHRoZSBtYXBwaW5nIHNldC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgaXNfZW5kKHZvaWQgKmFkZHIpCit7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nKWFkZHIgJiBQQUdFX01BUFBJTkdfQU5PTjsKK30KKwordm9pZCAqc2xhYl9hZGRyZXNzKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBwYWdlLT5lbmQgLSBQQUdFX01BUFBJTkdfQU5PTjsKK30KKwogc3RhdGljIGlubGluZSBpbnQgY2hlY2tfdmFsaWRfcG9pbnRlcihzdHJ1Y3Qga21lbV9jYWNoZSAqcywKIAkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgY29uc3Qgdm9pZCAqb2JqZWN0KQogewogCXZvaWQgKmJhc2U7CiAKLQlpZiAoIW9iamVjdCkKKwlpZiAob2JqZWN0ID09IHBhZ2UtPmVuZCkKIAkJcmV0dXJuIDE7CiAKLQliYXNlID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCWJhc2UgPSBzbGFiX2FkZHJlc3MocGFnZSk7CiAJaWYgKG9iamVjdCA8IGJhc2UgfHwgb2JqZWN0ID49IGJhc2UgKyBzLT5vYmplY3RzICogcy0+c2l6ZSB8fAogCQkob2JqZWN0IC0gYmFzZSkgJSBzLT5zaXplKSB7CiAJCXJldHVybiAwOwpAQCAtMzIxLDcgKzM1NCw4IEBACiAKIC8qIFNjYW4gZnJlZWxpc3QgKi8KICNkZWZpbmUgZm9yX2VhY2hfZnJlZV9vYmplY3QoX19wLCBfX3MsIF9fZnJlZSkgXAotCWZvciAoX19wID0gKF9fZnJlZSk7IF9fcDsgX19wID0gZ2V0X2ZyZWVwb2ludGVyKChfX3MpLCBfX3ApKQorCWZvciAoX19wID0gKF9fZnJlZSk7IChfX3ApICE9IHBhZ2UtPmVuZDsgX19wID0gZ2V0X2ZyZWVwb2ludGVyKChfX3MpLFwKKwkJX19wKSkKIAogLyogRGV0ZXJtaW5lIG9iamVjdCBpbmRleCBmcm9tIGEgZ2l2ZW4gcG9zaXRpb24gKi8KIHN0YXRpYyBpbmxpbmUgaW50IHNsYWJfaW5kZXgodm9pZCAqcCwgc3RydWN0IGttZW1fY2FjaGUgKnMsIHZvaWQgKmFkZHIpCkBAIC00NzMsNyArNTA3LDcgQEAKIHN0YXRpYyB2b2lkIHByaW50X3RyYWlsZXIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLCB1OCAqcCkKIHsKIAl1bnNpZ25lZCBpbnQgb2ZmOwkvKiBPZmZzZXQgb2YgbGFzdCBieXRlICovCi0JdTggKmFkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJdTggKmFkZHIgPSBzbGFiX2FkZHJlc3MocGFnZSk7CiAKIAlwcmludF90cmFja2luZyhzLCBwKTsKIApAQCAtNjUxLDcgKzY4NSw3IEBACiAJaWYgKCEocy0+ZmxhZ3MgJiBTTEFCX1BPSVNPTikpCiAJCXJldHVybiAxOwogCi0Jc3RhcnQgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJc3RhcnQgPSBzbGFiX2FkZHJlc3MocGFnZSk7CiAJZW5kID0gc3RhcnQgKyAoUEFHRV9TSVpFIDw8IHMtPm9yZGVyKTsKIAlsZW5ndGggPSBzLT5vYmplY3RzICogcy0+c2l6ZTsKIAlyZW1haW5kZXIgPSBlbmQgLSAoc3RhcnQgKyBsZW5ndGgpOwpAQCAtNjg1LDkgKzcxOSwxMCBAQAogCQkJZW5kb2JqZWN0LCByZWQsIHMtPmludXNlIC0gcy0+b2Jqc2l6ZSkpCiAJCQlyZXR1cm4gMDsKIAl9IGVsc2UgewotCQlpZiAoKHMtPmZsYWdzICYgU0xBQl9QT0lTT04pICYmIHMtPm9ianNpemUgPCBzLT5pbnVzZSkKLQkJCWNoZWNrX2J5dGVzX2FuZF9yZXBvcnQocywgcGFnZSwgcCwgIkFsaWdubWVudCBwYWRkaW5nIiwgZW5kb2JqZWN0LAotCQkJCVBPSVNPTl9JTlVTRSwgcy0+aW51c2UgLSBzLT5vYmpzaXplKTsKKwkJaWYgKChzLT5mbGFncyAmIFNMQUJfUE9JU09OKSAmJiBzLT5vYmpzaXplIDwgcy0+aW51c2UpIHsKKwkJCWNoZWNrX2J5dGVzX2FuZF9yZXBvcnQocywgcGFnZSwgcCwgIkFsaWdubWVudCBwYWRkaW5nIiwKKwkJCQllbmRvYmplY3QsIFBPSVNPTl9JTlVTRSwgcy0+aW51c2UgLSBzLT5vYmpzaXplKTsKKwkJfQogCX0KIAogCWlmIChzLT5mbGFncyAmIFNMQUJfUE9JU09OKSB7CkBAIC03MTgsNyArNzUzLDcgQEAKIAkJICogb2YgdGhlIGZyZWUgb2JqZWN0cyBpbiB0aGlzIHNsYWIuIE1heSBjYXVzZQogCQkgKiBhbm90aGVyIGVycm9yIGJlY2F1c2UgdGhlIG9iamVjdCBjb3VudCBpcyBub3cgd3JvbmcuCiAJCSAqLwotCQlzZXRfZnJlZXBvaW50ZXIocywgcCwgTlVMTCk7CisJCXNldF9mcmVlcG9pbnRlcihzLCBwLCBwYWdlLT5lbmQpOwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIDE7CkBAIC03NTIsMTggKzc4NywxOCBAQAogCXZvaWQgKmZwID0gcGFnZS0+ZnJlZWxpc3Q7CiAJdm9pZCAqb2JqZWN0ID0gTlVMTDsKIAotCXdoaWxlIChmcCAmJiBuciA8PSBzLT5vYmplY3RzKSB7CisJd2hpbGUgKGZwICE9IHBhZ2UtPmVuZCAmJiBuciA8PSBzLT5vYmplY3RzKSB7CiAJCWlmIChmcCA9PSBzZWFyY2gpCiAJCQlyZXR1cm4gMTsKIAkJaWYgKCFjaGVja192YWxpZF9wb2ludGVyKHMsIHBhZ2UsIGZwKSkgewogCQkJaWYgKG9iamVjdCkgewogCQkJCW9iamVjdF9lcnIocywgcGFnZSwgb2JqZWN0LAogCQkJCQkiRnJlZWNoYWluIGNvcnJ1cHQiKTsKLQkJCQlzZXRfZnJlZXBvaW50ZXIocywgb2JqZWN0LCBOVUxMKTsKKwkJCQlzZXRfZnJlZXBvaW50ZXIocywgb2JqZWN0LCBwYWdlLT5lbmQpOwogCQkJCWJyZWFrOwogCQkJfSBlbHNlIHsKIAkJCQlzbGFiX2VycihzLCBwYWdlLCAiRnJlZXBvaW50ZXIgY29ycnVwdCIpOwotCQkJCXBhZ2UtPmZyZWVsaXN0ID0gTlVMTDsKKwkJCQlwYWdlLT5mcmVlbGlzdCA9IHBhZ2UtPmVuZDsKIAkJCQlwYWdlLT5pbnVzZSA9IHMtPm9iamVjdHM7CiAJCQkJc2xhYl9maXgocywgIkZyZWVsaXN0IGNsZWFyZWQiKTsKIAkJCQlyZXR1cm4gMDsKQEAgLTg2OSw3ICs5MDQsNyBAQAogCQkgKi8KIAkJc2xhYl9maXgocywgIk1hcmtpbmcgYWxsIG9iamVjdHMgdXNlZCIpOwogCQlwYWdlLT5pbnVzZSA9IHMtPm9iamVjdHM7Ci0JCXBhZ2UtPmZyZWVsaXN0ID0gTlVMTDsKKwkJcGFnZS0+ZnJlZWxpc3QgPSBwYWdlLT5lbmQ7CiAJfQogCXJldHVybiAwOwogfQpAQCAtODk0LDExICs5MjksMTAgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAodW5saWtlbHkocyAhPSBwYWdlLT5zbGFiKSkgewotCQlpZiAoIVBhZ2VTbGFiKHBhZ2UpKQorCQlpZiAoIVBhZ2VTbGFiKHBhZ2UpKSB7CiAJCQlzbGFiX2VycihzLCBwYWdlLCAiQXR0ZW1wdCB0byBmcmVlIG9iamVjdCgweCVwKSAiCiAJCQkJIm91dHNpZGUgb2Ygc2xhYiIsIG9iamVjdCk7Ci0JCWVsc2UKLQkJaWYgKCFwYWdlLT5zbGFiKSB7CisJCX0gZWxzZSBpZiAoIXBhZ2UtPnNsYWIpIHsKIAkJCXByaW50ayhLRVJOX0VSUgogCQkJCSJTTFVCIDxub25lPjogbm8gc2xhYiBmb3Igb2JqZWN0IDB4JXAuXG4iLAogCQkJCQkJb2JqZWN0KTsKQEAgLTkxMCw3ICs5NDQsNyBAQAogCX0KIAogCS8qIFNwZWNpYWwgZGVidWcgYWN0aXZpdGllcyBmb3IgZnJlZWluZyBvYmplY3RzICovCi0JaWYgKCFTbGFiRnJvemVuKHBhZ2UpICYmICFwYWdlLT5mcmVlbGlzdCkKKwlpZiAoIVNsYWJGcm96ZW4ocGFnZSkgJiYgcGFnZS0+ZnJlZWxpc3QgPT0gcGFnZS0+ZW5kKQogCQlyZW1vdmVfZnVsbChzLCBwYWdlKTsKIAlpZiAocy0+ZmxhZ3MgJiBTTEFCX1NUT1JFX1VTRVIpCiAJCXNldF90cmFjayhzLCBvYmplY3QsIFRSQUNLX0ZSRUUsIGFkZHIpOwpAQCAtMTAwNyw3ICsxMDQxLDcgQEAKIAkJICovCiAJCWlmIChzbHViX2RlYnVnICYmICghc2x1Yl9kZWJ1Z19zbGFicyB8fAogCQkgICAgc3RybmNtcChzbHViX2RlYnVnX3NsYWJzLCBuYW1lLAotCQkgICAgCXN0cmxlbihzbHViX2RlYnVnX3NsYWJzKSkgPT0gMCkpCisJCQlzdHJsZW4oc2x1Yl9kZWJ1Z19zbGFicykpID09IDApKQogCQkJCWZsYWdzIHw9IHNsdWJfZGVidWc7CiAJfQogCkBAIC0xMTAyLDYgKzExMzYsNyBAQAogCQlTZXRTbGFiRGVidWcocGFnZSk7CiAKIAlzdGFydCA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwlwYWdlLT5lbmQgPSBzdGFydCArIDE7CiAKIAlpZiAodW5saWtlbHkocy0+ZmxhZ3MgJiBTTEFCX1BPSVNPTikpCiAJCW1lbXNldChzdGFydCwgUE9JU09OX0lOVVNFLCBQQUdFX1NJWkUgPDwgcy0+b3JkZXIpOwpAQCAtMTExMyw3ICsxMTQ4LDcgQEAKIAkJbGFzdCA9IHA7CiAJfQogCXNldHVwX29iamVjdChzLCBwYWdlLCBsYXN0KTsKLQlzZXRfZnJlZXBvaW50ZXIocywgbGFzdCwgTlVMTCk7CisJc2V0X2ZyZWVwb2ludGVyKHMsIGxhc3QsIHBhZ2UtPmVuZCk7CiAKIAlwYWdlLT5mcmVlbGlzdCA9IHN0YXJ0OwogCXBhZ2UtPmludXNlID0gMDsKQEAgLTExMjksNyArMTE2NCw3IEBACiAJCXZvaWQgKnA7CiAKIAkJc2xhYl9wYWRfY2hlY2socywgcGFnZSk7Ci0JCWZvcl9lYWNoX29iamVjdChwLCBzLCBwYWdlX2FkZHJlc3MocGFnZSkpCisJCWZvcl9lYWNoX29iamVjdChwLCBzLCBzbGFiX2FkZHJlc3MocGFnZSkpCiAJCQljaGVja19vYmplY3QocywgcGFnZSwgcCwgMCk7CiAJCUNsZWFyU2xhYkRlYnVnKHBhZ2UpOwogCX0KQEAgLTExMzksNiArMTE3NCw3IEBACiAJCU5SX1NMQUJfUkVDTEFJTUFCTEUgOiBOUl9TTEFCX1VOUkVDTEFJTUFCTEUsCiAJCS1wYWdlcyk7CiAKKwlwYWdlLT5tYXBwaW5nID0gTlVMTDsKIAlfX2ZyZWVfcGFnZXMocGFnZSwgcy0+b3JkZXIpOwogfQogCkBAIC0xMTgzLDcgKzEyMTksNyBAQAogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgc2xhYl91bmxvY2soc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JYml0X3NwaW5fdW5sb2NrKFBHX2xvY2tlZCwgJnBhZ2UtPmZsYWdzKTsKKwlfX2JpdF9zcGluX3VubG9jayhQR19sb2NrZWQsICZwYWdlLT5mbGFncyk7CiB9CiAKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IHNsYWJfdHJ5bG9jayhzdHJ1Y3QgcGFnZSAqcGFnZSkKQEAgLTEyOTQsOCArMTMzMCw4IEBACiAJCQlnZXRfY3ljbGVzKCkgJSAxMDI0ID4gcy0+cmVtb3RlX25vZGVfZGVmcmFnX3JhdGlvKQogCQlyZXR1cm4gTlVMTDsKIAotCXpvbmVsaXN0ID0gJk5PREVfREFUQShzbGFiX25vZGUoY3VycmVudC0+bWVtcG9saWN5KSkKLQkJCQkJLT5ub2RlX3pvbmVsaXN0c1tnZnBfem9uZShmbGFncyldOworCXpvbmVsaXN0ID0gJk5PREVfREFUQSgKKwkJc2xhYl9ub2RlKGN1cnJlbnQtPm1lbXBvbGljeSkpLT5ub2RlX3pvbmVsaXN0c1tnZnBfem9uZShmbGFncyldOwogCWZvciAoeiA9IHpvbmVsaXN0LT56b25lczsgKno7IHorKykgewogCQlzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuOwogCkBAIC0xMzM3LDE3ICsxMzczLDIyIEBACiBzdGF0aWMgdm9pZCB1bmZyZWV6ZV9zbGFiKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IHRhaWwpCiB7CiAJc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbiA9IGdldF9ub2RlKHMsIHBhZ2VfdG9fbmlkKHBhZ2UpKTsKKwlzdHJ1Y3Qga21lbV9jYWNoZV9jcHUgKmMgPSBnZXRfY3B1X3NsYWIocywgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAogCUNsZWFyU2xhYkZyb3plbihwYWdlKTsKIAlpZiAocGFnZS0+aW51c2UpIHsKIAotCQlpZiAocGFnZS0+ZnJlZWxpc3QpCisJCWlmIChwYWdlLT5mcmVlbGlzdCAhPSBwYWdlLT5lbmQpIHsKIAkJCWFkZF9wYXJ0aWFsKG4sIHBhZ2UsIHRhaWwpOwotCQllbHNlIGlmIChTbGFiRGVidWcocGFnZSkgJiYgKHMtPmZsYWdzICYgU0xBQl9TVE9SRV9VU0VSKSkKLQkJCWFkZF9mdWxsKG4sIHBhZ2UpOworCQkJc3RhdChjLCB0YWlsID8gREVBQ1RJVkFURV9UT19UQUlMIDogREVBQ1RJVkFURV9UT19IRUFEKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXQoYywgREVBQ1RJVkFURV9GVUxMKTsKKwkJCWlmIChTbGFiRGVidWcocGFnZSkgJiYgKHMtPmZsYWdzICYgU0xBQl9TVE9SRV9VU0VSKSkKKwkJCQlhZGRfZnVsbChuLCBwYWdlKTsKKwkJfQogCQlzbGFiX3VubG9jayhwYWdlKTsKLQogCX0gZWxzZSB7CisJCXN0YXQoYywgREVBQ1RJVkFURV9FTVBUWSk7CiAJCWlmIChuLT5ucl9wYXJ0aWFsIDwgTUlOX1BBUlRJQUwpIHsKIAkJCS8qCiAJCQkgKiBBZGRpbmcgYW4gZW1wdHkgc2xhYiB0byB0aGUgcGFydGlhbCBzbGFicyBpbiBvcmRlcgpAQCAtMTM2MSw2ICsxNDAyLDcgQEAKIAkJCXNsYWJfdW5sb2NrKHBhZ2UpOwogCQl9IGVsc2UgewogCQkJc2xhYl91bmxvY2socGFnZSk7CisJCQlzdGF0KGdldF9jcHVfc2xhYihzLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKSwgRlJFRV9TTEFCKTsKIAkJCWRpc2NhcmRfc2xhYihzLCBwYWdlKTsKIAkJfQogCX0KQEAgLTEzNzMsMTIgKzE0MTUsMTkgQEAKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGMtPnBhZ2U7CiAJaW50IHRhaWwgPSAxOworCisJaWYgKGMtPmZyZWVsaXN0KQorCQlzdGF0KGMsIERFQUNUSVZBVEVfUkVNT1RFX0ZSRUVTKTsKIAkvKgogCSAqIE1lcmdlIGNwdSBmcmVlbGlzdCBpbnRvIGZyZWVsaXN0LiBUeXBpY2FsbHkgd2UgZ2V0IGhlcmUKIAkgKiBiZWNhdXNlIGJvdGggZnJlZWxpc3RzIGFyZSBlbXB0eS4gU28gdGhpcyBpcyB1bmxpa2VseQogCSAqIHRvIG9jY3VyLgorCSAqCisJICogV2UgbmVlZCB0byB1c2UgX2lzX2VuZCBoZXJlIGJlY2F1c2UgZGVhY3RpdmF0ZSBzbGFiIG1heQorCSAqIGJlIGNhbGxlZCBmb3IgYSBkZWJ1ZyBzbGFiLiBUaGVuIGMtPmZyZWVsaXN0IG1heSBjb250YWluCisJICogYSBkdW1teSBwb2ludGVyLgogCSAqLwotCXdoaWxlICh1bmxpa2VseShjLT5mcmVlbGlzdCkpIHsKKwl3aGlsZSAodW5saWtlbHkoIWlzX2VuZChjLT5mcmVlbGlzdCkpKSB7CiAJCXZvaWQgKipvYmplY3Q7CiAKIAkJdGFpbCA9IDA7CS8qIEhvdCBvYmplY3RzLiBQdXQgdGhlIHNsYWIgZmlyc3QgKi8KQEAgLTEzOTgsNiArMTQ0Nyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9zbGFiKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3Qga21lbV9jYWNoZV9jcHUgKmMpCiB7CisJc3RhdChjLCBDUFVTTEFCX0ZMVVNIKTsKIAlzbGFiX2xvY2soYy0+cGFnZSk7CiAJZGVhY3RpdmF0ZV9zbGFiKHMsIGMpOwogfQpAQCAtMTQ2OSwxNiArMTUxOSwyMSBAQAogewogCXZvaWQgKipvYmplY3Q7CiAJc3RydWN0IHBhZ2UgKm5ldzsKKyNpZmRlZiBTTFVCX0ZBU1RQQVRICisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyNlbmRpZgogCWlmICghYy0+cGFnZSkKIAkJZ290byBuZXdfc2xhYjsKIAogCXNsYWJfbG9jayhjLT5wYWdlKTsKIAlpZiAodW5saWtlbHkoIW5vZGVfbWF0Y2goYywgbm9kZSkpKQogCQlnb3RvIGFub3RoZXJfc2xhYjsKKwlzdGF0KGMsIEFMTE9DX1JFRklMTCk7CiBsb2FkX2ZyZWVsaXN0OgogCW9iamVjdCA9IGMtPnBhZ2UtPmZyZWVsaXN0OwotCWlmICh1bmxpa2VseSghb2JqZWN0KSkKKwlpZiAodW5saWtlbHkob2JqZWN0ID09IGMtPnBhZ2UtPmVuZCkpCiAJCWdvdG8gYW5vdGhlcl9zbGFiOwogCWlmICh1bmxpa2VseShTbGFiRGVidWcoYy0+cGFnZSkpKQogCQlnb3RvIGRlYnVnOwpAQCAtMTQ4Niw5ICsxNTQxLDE1IEBACiAJb2JqZWN0ID0gYy0+cGFnZS0+ZnJlZWxpc3Q7CiAJYy0+ZnJlZWxpc3QgPSBvYmplY3RbYy0+b2Zmc2V0XTsKIAljLT5wYWdlLT5pbnVzZSA9IHMtPm9iamVjdHM7Ci0JYy0+cGFnZS0+ZnJlZWxpc3QgPSBOVUxMOworCWMtPnBhZ2UtPmZyZWVsaXN0ID0gYy0+cGFnZS0+ZW5kOwogCWMtPm5vZGUgPSBwYWdlX3RvX25pZChjLT5wYWdlKTsKK3VubG9ja19vdXQ6CiAJc2xhYl91bmxvY2soYy0+cGFnZSk7CisJc3RhdChjLCBBTExPQ19TTE9XUEFUSCk7CitvdXQ6CisjaWZkZWYgU0xVQl9GQVNUUEFUSAorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyNlbmRpZgogCXJldHVybiBvYmplY3Q7CiAKIGFub3RoZXJfc2xhYjoKQEAgLTE0OTgsNiArMTU1OSw3IEBACiAJbmV3ID0gZ2V0X3BhcnRpYWwocywgZ2ZwZmxhZ3MsIG5vZGUpOwogCWlmIChuZXcpIHsKIAkJYy0+cGFnZSA9IG5ldzsKKwkJc3RhdChjLCBBTExPQ19GUk9NX1BBUlRJQUwpOwogCQlnb3RvIGxvYWRfZnJlZWxpc3Q7CiAJfQogCkBAIC0xNTExLDYgKzE1NzMsNyBAQAogCiAJaWYgKG5ldykgewogCQljID0gZ2V0X2NwdV9zbGFiKHMsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJCXN0YXQoYywgQUxMT0NfU0xBQik7CiAJCWlmIChjLT5wYWdlKQogCQkJZmx1c2hfc2xhYihzLCBjKTsKIAkJc2xhYl9sb2NrKG5ldyk7CkBAIC0xNTE4LDcgKzE1ODEsOCBAQAogCQljLT5wYWdlID0gbmV3OwogCQlnb3RvIGxvYWRfZnJlZWxpc3Q7CiAJfQotCXJldHVybiBOVUxMOworCW9iamVjdCA9IE5VTEw7CisJZ290byBvdXQ7CiBkZWJ1ZzoKIAlvYmplY3QgPSBjLT5wYWdlLT5mcmVlbGlzdDsKIAlpZiAoIWFsbG9jX2RlYnVnX3Byb2Nlc3NpbmcocywgYy0+cGFnZSwgb2JqZWN0LCBhZGRyKSkKQEAgLTE1MjcsOCArMTU5MSw3IEBACiAJYy0+cGFnZS0+aW51c2UrKzsKIAljLT5wYWdlLT5mcmVlbGlzdCA9IG9iamVjdFtjLT5vZmZzZXRdOwogCWMtPm5vZGUgPSAtMTsKLQlzbGFiX3VubG9jayhjLT5wYWdlKTsKLQlyZXR1cm4gb2JqZWN0OworCWdvdG8gdW5sb2NrX291dDsKIH0KIAogLyoKQEAgLTE1NDUsMjAgKzE2MDgsNTAgQEAKIAkJZ2ZwX3QgZ2ZwZmxhZ3MsIGludCBub2RlLCB2b2lkICphZGRyKQogewogCXZvaWQgKipvYmplY3Q7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qga21lbV9jYWNoZV9jcHUgKmM7CiAKKy8qCisgKiBUaGUgU0xVQl9GQVNUUEFUSCBwYXRoIGlzIHByb3Zpc2lvbmFsIGFuZCBpcyBjdXJyZW50bHkgZGlzYWJsZWQgaWYgdGhlCisgKiBrZXJuZWwgaXMgY29tcGlsZWQgd2l0aCBwcmVlbXB0aW9uIG9yIGlmIHRoZSBhcmNoIGRvZXMgbm90IHN1cHBvcnQKKyAqIGZhc3QgY21weGNoZyBvcGVyYXRpb25zLiBUaGVyZSBhcmUgYSBjb3VwbGUgb2YgY29taW5nIGNoYW5nZXMgdGhhdCB3aWxsCisgKiBzaW1wbGlmeSBtYXR0ZXJzIGFuZCBhbGxvdyBwcmVlbXB0aW9uLiBVbHRpbWF0ZWx5IHdlIG1heSBlbmQgdXAgbWFraW5nCisgKiBTTFVCX0ZBU1RQQVRIIHRoZSBkZWZhdWx0LgorICoKKyAqIDEuIFRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlIHBlciBjcHUgYWxsb2NhdG9yIHdpbGwgYXZvaWQgYXJyYXkgbG9va3VwcworICogICAgdGhyb3VnaCBnZXRfY3B1X3NsYWIoKS4gQSBzcGVjaWFsIHJlZ2lzdGVyIGNhbiBiZSB1c2VkIGluc3RlYWQuCisgKgorICogMi4gVGhlIGludHJvZHVjdGlvbiBvZiBwZXIgY3B1IGF0b21pYyBvcGVyYXRpb25zIChjcHVfb3BzKSBtZWFucyB0aGF0CisgKiAgICB3ZSBjYW4gcmVhbGl6ZSB0aGUgbG9naWMgaGVyZSBlbnRpcmVseSB3aXRoIHBlciBjcHUgYXRvbWljcy4gVGhlCisgKiAgICBwZXIgY3B1IGF0b21pYyBvcHMgd2lsbCB0YWtlIGNhcmUgb2YgdGhlIHByZWVtcHRpb24gaXNzdWVzLgorICovCisKKyNpZmRlZiBTTFVCX0ZBU1RQQVRICisJYyA9IGdldF9jcHVfc2xhYihzLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlkbyB7CisJCW9iamVjdCA9IGMtPmZyZWVsaXN0OworCQlpZiAodW5saWtlbHkoaXNfZW5kKG9iamVjdCkgfHwgIW5vZGVfbWF0Y2goYywgbm9kZSkpKSB7CisJCQlvYmplY3QgPSBfX3NsYWJfYWxsb2MocywgZ2ZwZmxhZ3MsIG5vZGUsIGFkZHIsIGMpOworCQkJYnJlYWs7CisJCX0KKwkJc3RhdChjLCBBTExPQ19GQVNUUEFUSCk7CisJfSB3aGlsZSAoY21weGNoZ19sb2NhbCgmYy0+ZnJlZWxpc3QsIG9iamVjdCwgb2JqZWN0W2MtPm9mZnNldF0pCisJCQkJCQkJCSE9IG9iamVjdCk7CisjZWxzZQorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJYyA9IGdldF9jcHVfc2xhYihzLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwotCWlmICh1bmxpa2VseSghYy0+ZnJlZWxpc3QgfHwgIW5vZGVfbWF0Y2goYywgbm9kZSkpKQorCWlmICh1bmxpa2VseShpc19lbmQoYy0+ZnJlZWxpc3QpIHx8ICFub2RlX21hdGNoKGMsIG5vZGUpKSkKIAogCQlvYmplY3QgPSBfX3NsYWJfYWxsb2MocywgZ2ZwZmxhZ3MsIG5vZGUsIGFkZHIsIGMpOwogCiAJZWxzZSB7CiAJCW9iamVjdCA9IGMtPmZyZWVsaXN0OwogCQljLT5mcmVlbGlzdCA9IG9iamVjdFtjLT5vZmZzZXRdOworCQlzdGF0KGMsIEFMTE9DX0ZBU1RQQVRIKTsKIAl9CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworI2VuZGlmCiAKIAlpZiAodW5saWtlbHkoKGdmcGZsYWdzICYgX19HRlBfWkVSTykgJiYgb2JqZWN0KSkKIAkJbWVtc2V0KG9iamVjdCwgMCwgYy0+b2Jqc2l6ZSk7CkBAIC0xNTkzLDcgKzE2ODYsMTUgQEAKIHsKIAl2b2lkICpwcmlvcjsKIAl2b2lkICoqb2JqZWN0ID0gKHZvaWQgKil4OworCXN0cnVjdCBrbWVtX2NhY2hlX2NwdSAqYzsKIAorI2lmZGVmIFNMVUJfRkFTVFBBVEgKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworI2VuZGlmCisJYyA9IGdldF9jcHVfc2xhYihzLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlzdGF0KGMsIEZSRUVfU0xPV1BBVEgpOwogCXNsYWJfbG9jayhwYWdlKTsKIAogCWlmICh1bmxpa2VseShTbGFiRGVidWcocGFnZSkpKQpAQCAtMTYwMyw4ICsxNzA0LDEwIEBACiAJcGFnZS0+ZnJlZWxpc3QgPSBvYmplY3Q7CiAJcGFnZS0+aW51c2UtLTsKIAotCWlmICh1bmxpa2VseShTbGFiRnJvemVuKHBhZ2UpKSkKKwlpZiAodW5saWtlbHkoU2xhYkZyb3plbihwYWdlKSkpIHsKKwkJc3RhdChjLCBGUkVFX0ZST1pFTik7CiAJCWdvdG8gb3V0X3VubG9jazsKKwl9CiAKIAlpZiAodW5saWtlbHkoIXBhZ2UtPmludXNlKSkKIAkJZ290byBzbGFiX2VtcHR5OwpAQCAtMTYxNCwyMSArMTcxNywzMSBAQAogCSAqIHdhcyBub3Qgb24gdGhlIHBhcnRpYWwgbGlzdCBiZWZvcmUKIAkgKiB0aGVuIGFkZCBpdC4KIAkgKi8KLQlpZiAodW5saWtlbHkoIXByaW9yKSkKKwlpZiAodW5saWtlbHkocHJpb3IgPT0gcGFnZS0+ZW5kKSkgewogCQlhZGRfcGFydGlhbChnZXRfbm9kZShzLCBwYWdlX3RvX25pZChwYWdlKSksIHBhZ2UsIDEpOworCQlzdGF0KGMsIEZSRUVfQUREX1BBUlRJQUwpOworCX0KIAogb3V0X3VubG9jazoKIAlzbGFiX3VubG9jayhwYWdlKTsKKyNpZmRlZiBTTFVCX0ZBU1RQQVRICisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworI2VuZGlmCiAJcmV0dXJuOwogCiBzbGFiX2VtcHR5OgotCWlmIChwcmlvcikKKwlpZiAocHJpb3IgIT0gcGFnZS0+ZW5kKSB7CiAJCS8qCiAJCSAqIFNsYWIgc3RpbGwgb24gdGhlIHBhcnRpYWwgbGlzdC4KIAkJICovCiAJCXJlbW92ZV9wYXJ0aWFsKHMsIHBhZ2UpOwotCisJCXN0YXQoYywgRlJFRV9SRU1PVkVfUEFSVElBTCk7CisJfQogCXNsYWJfdW5sb2NrKHBhZ2UpOworCXN0YXQoYywgRlJFRV9TTEFCKTsKKyNpZmRlZiBTTFVCX0ZBU1RQQVRICisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworI2VuZGlmCiAJZGlzY2FyZF9zbGFiKHMsIHBhZ2UpOwogCXJldHVybjsKIApAQCAtMTY1MywxOSArMTc2Niw0OSBAQAogCQkJc3RydWN0IHBhZ2UgKnBhZ2UsIHZvaWQgKngsIHZvaWQgKmFkZHIpCiB7CiAJdm9pZCAqKm9iamVjdCA9ICh2b2lkICopeDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBrbWVtX2NhY2hlX2NwdSAqYzsKIAorI2lmZGVmIFNMVUJfRkFTVFBBVEgKKwl2b2lkICoqZnJlZWxpc3Q7CisKKwljID0gZ2V0X2NwdV9zbGFiKHMsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOworCWRlYnVnX2NoZWNrX25vX2xvY2tzX2ZyZWVkKG9iamVjdCwgcy0+b2Jqc2l6ZSk7CisJZG8geworCQlmcmVlbGlzdCA9IGMtPmZyZWVsaXN0OworCQliYXJyaWVyKCk7CisJCS8qCisJCSAqIElmIHRoZSBjb21waWxlciB3b3VsZCByZW9yZGVyIHRoZSByZXRyaWV2YWwgb2YgYy0+cGFnZSB0bworCQkgKiBjb21lIGJlZm9yZSBjLT5mcmVlbGlzdCB0aGVuIGFuIGludGVycnVwdCBjb3VsZAorCQkgKiBjaGFuZ2UgdGhlIGNwdSBzbGFiIGJlZm9yZSB3ZSByZXRyaWV2ZSBjLT5mcmVlbGlzdC4gV2UKKwkJICogY291bGQgYmUgbWF0Y2hpbmcgb24gYSBwYWdlIG5vIGxvbmdlciBhY3RpdmUgYW5kIHB1dCB0aGUKKwkJICogb2JqZWN0IG9udG8gdGhlIGZyZWVsaXN0IG9mIHRoZSB3cm9uZyBzbGFiLgorCQkgKgorCQkgKiBPbiB0aGUgb3RoZXIgaGFuZDogSWYgd2UgYWxyZWFkeSBoYXZlIHRoZSBmcmVlbGlzdCBwb2ludGVyCisJCSAqIHRoZW4gYW55IGNoYW5nZSBvZiBjcHVfc2xhYiB3aWxsIGNhdXNlIHRoZSBjbXB4Y2hnIHRvIGZhaWwKKwkJICogc2luY2UgdGhlIGZyZWVsaXN0IHBvaW50ZXJzIGFyZSB1bmlxdWUgcGVyIHNsYWIuCisJCSAqLworCQlpZiAodW5saWtlbHkocGFnZSAhPSBjLT5wYWdlIHx8IGMtPm5vZGUgPCAwKSkgeworCQkJX19zbGFiX2ZyZWUocywgcGFnZSwgeCwgYWRkciwgYy0+b2Zmc2V0KTsKKwkJCWJyZWFrOworCQl9CisJCW9iamVjdFtjLT5vZmZzZXRdID0gZnJlZWxpc3Q7CisJCXN0YXQoYywgRlJFRV9GQVNUUEFUSCk7CisJfSB3aGlsZSAoY21weGNoZ19sb2NhbCgmYy0+ZnJlZWxpc3QsIGZyZWVsaXN0LCBvYmplY3QpICE9IGZyZWVsaXN0KTsKKyNlbHNlCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlkZWJ1Z19jaGVja19ub19sb2Nrc19mcmVlZChvYmplY3QsIHMtPm9ianNpemUpOwogCWMgPSBnZXRfY3B1X3NsYWIocywgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAlpZiAobGlrZWx5KHBhZ2UgPT0gYy0+cGFnZSAmJiBjLT5ub2RlID49IDApKSB7CiAJCW9iamVjdFtjLT5vZmZzZXRdID0gYy0+ZnJlZWxpc3Q7CiAJCWMtPmZyZWVsaXN0ID0gb2JqZWN0OworCQlzdGF0KGMsIEZSRUVfRkFTVFBBVEgpOwogCX0gZWxzZQogCQlfX3NsYWJfZnJlZShzLCBwYWdlLCB4LCBhZGRyLCBjLT5vZmZzZXQpOwogCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworI2VuZGlmCiB9CiAKIHZvaWQga21lbV9jYWNoZV9mcmVlKHN0cnVjdCBrbWVtX2NhY2hlICpzLCB2b2lkICp4KQpAQCAtMTg0Miw3ICsxOTg1LDcgQEAKIAkJCXN0cnVjdCBrbWVtX2NhY2hlX2NwdSAqYykKIHsKIAljLT5wYWdlID0gTlVMTDsKLQljLT5mcmVlbGlzdCA9IE5VTEw7CisJYy0+ZnJlZWxpc3QgPSAodm9pZCAqKVBBR0VfTUFQUElOR19BTk9OOwogCWMtPm5vZGUgPSAwOwogCWMtPm9mZnNldCA9IHMtPm9mZnNldCAvIHNpemVvZih2b2lkICopOwogCWMtPm9ianNpemUgPSBzLT5vYmpzaXplOwpAQCAtMjQ0Niw3ICsyNTg5LDggQEAKIAkJZ290byB1bmxvY2tfb3V0OwogCiAJcmVhbHNpemUgPSBrbWFsbG9jX2NhY2hlc1tpbmRleF0ub2Jqc2l6ZTsKLQl0ZXh0ID0ga2FzcHJpbnRmKGZsYWdzICYgflNMVUJfRE1BLCAia21hbGxvY19kbWEtJWQiLCAodW5zaWduZWQgaW50KXJlYWxzaXplKSwKKwl0ZXh0ID0ga2FzcHJpbnRmKGZsYWdzICYgflNMVUJfRE1BLCAia21hbGxvY19kbWEtJWQiLAorCQkJICh1bnNpZ25lZCBpbnQpcmVhbHNpemUpOwogCXMgPSBrbWFsbG9jKGttZW1fc2l6ZSwgZmxhZ3MgJiB+U0xVQl9ETUEpOwogCiAJaWYgKCFzIHx8ICF0ZXh0IHx8ICFrbWVtX2NhY2hlX29wZW4ocywgZmxhZ3MsIHRleHQsCkBAIC0yNjAxLDYgKzI3NDUsNyBAQAogdm9pZCBrZnJlZShjb25zdCB2b2lkICp4KQogewogCXN0cnVjdCBwYWdlICpwYWdlOworCXZvaWQgKm9iamVjdCA9ICh2b2lkICopeDsKIAogCWlmICh1bmxpa2VseShaRVJPX09SX05VTExfUFRSKHgpKSkKIAkJcmV0dXJuOwpAQCAtMjYxMCw3ICsyNzU1LDcgQEAKIAkJcHV0X3BhZ2UocGFnZSk7CiAJCXJldHVybjsKIAl9Ci0Jc2xhYl9mcmVlKHBhZ2UtPnNsYWIsIHBhZ2UsICh2b2lkICopeCwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKKwlzbGFiX2ZyZWUocGFnZS0+c2xhYiwgcGFnZSwgb2JqZWN0LCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwogfQogRVhQT1JUX1NZTUJPTChrZnJlZSk7CiAKQEAgLTI4OTYsNyArMzA0MSw4IEBACiAjZW5kaWYKIAogCi0JcHJpbnRrKEtFUk5fSU5GTyAiU0xVQjogR2Vuc2xhYnM9JWQsIEhXYWxpZ249JWQsIE9yZGVyPSVkLSVkLCBNaW5PYmplY3RzPSVkLCIKKwlwcmludGsoS0VSTl9JTkZPCisJCSJTTFVCOiBHZW5zbGFicz0lZCwgSFdhbGlnbj0lZCwgT3JkZXI9JWQtJWQsIE1pbk9iamVjdHM9JWQsIgogCQkiIENQVXM9JWQsIE5vZGVzPSVkXG4iLAogCQljYWNoZXMsIGNhY2hlX2xpbmVfc2l6ZSgpLAogCQlzbHViX21pbl9vcmRlciwgc2x1Yl9tYXhfb3JkZXIsIHNsdWJfbWluX29iamVjdHMsCkBAIC0zMDYzLDcgKzMyMDksNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIF9fY3B1aW5pdGRhdGEgc2xhYl9ub3RpZmllciA9IHsKLQkmc2xhYl9jcHV1cF9jYWxsYmFjaywgTlVMTCwgMAorCS5ub3RpZmllcl9jYWxsID0gc2xhYl9jcHV1cF9jYWxsYmFjawogfTsKIAogI2VuZGlmCkBAIC0zMTA0LDcgKzMyNTAsNyBAQAogCQkJCQkJdW5zaWduZWQgbG9uZyAqbWFwKQogewogCXZvaWQgKnA7Ci0Jdm9pZCAqYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwl2b2lkICphZGRyID0gc2xhYl9hZGRyZXNzKHBhZ2UpOwogCiAJaWYgKCFjaGVja19zbGFiKHMsIHBhZ2UpIHx8CiAJCQkhb25fZnJlZWxpc3QocywgcGFnZSwgTlVMTCkpCkBAIC0zMjIxLDggKzMzNjcsOSBAQAogCXAgPSBremFsbG9jKDMyLCBHRlBfS0VSTkVMKTsKIAlwWzMyICsgc2l6ZW9mKHZvaWQgKildID0gMHgzNDsKIAlwcmludGsoS0VSTl9FUlIgIlxuMi4ga21hbGxvYy0zMjogQ2xvYmJlciBuZXh0IHBvaW50ZXIvbmV4dCBzbGFiIgotCQkgCSIgMHgzNCAtPiAtMHglcFxuIiwgcCk7Ci0JcHJpbnRrKEtFUk5fRVJSICJJZiBhbGxvY2F0ZWQgb2JqZWN0IGlzIG92ZXJ3cml0dGVuIHRoZW4gbm90IGRldGVjdGFibGVcblxuIik7CisJCQkiIDB4MzQgLT4gLTB4JXBcbiIsIHApOworCXByaW50ayhLRVJOX0VSUgorCQkiSWYgYWxsb2NhdGVkIG9iamVjdCBpcyBvdmVyd3JpdHRlbiB0aGVuIG5vdCBkZXRlY3RhYmxlXG5cbiIpOwogCiAJdmFsaWRhdGVfc2xhYl9jYWNoZShrbWFsbG9jX2NhY2hlcyArIDUpOwogCXAgPSBremFsbG9jKDY0LCBHRlBfS0VSTkVMKTsKQEAgLTMyMzAsNyArMzM3Nyw4IEBACiAJKnAgPSAweDU2OwogCXByaW50ayhLRVJOX0VSUiAiXG4zLiBrbWFsbG9jLTY0OiBjb3JydXB0aW5nIHJhbmRvbSBieXRlIDB4NTYtPjB4JXBcbiIsCiAJCQkJCQkJCQlwKTsKLQlwcmludGsoS0VSTl9FUlIgIklmIGFsbG9jYXRlZCBvYmplY3QgaXMgb3ZlcndyaXR0ZW4gdGhlbiBub3QgZGV0ZWN0YWJsZVxuXG4iKTsKKwlwcmludGsoS0VSTl9FUlIKKwkJIklmIGFsbG9jYXRlZCBvYmplY3QgaXMgb3ZlcndyaXR0ZW4gdGhlbiBub3QgZGV0ZWN0YWJsZVxuXG4iKTsKIAl2YWxpZGF0ZV9zbGFiX2NhY2hlKGttYWxsb2NfY2FjaGVzICsgNik7CiAKIAlwcmludGsoS0VSTl9FUlIgIlxuQi4gQ29ycnVwdGlvbiBhZnRlciBmcmVlXG4iKTsKQEAgLTMyNDMsNyArMzM5MSw4IEBACiAJcCA9IGt6YWxsb2MoMjU2LCBHRlBfS0VSTkVMKTsKIAlrZnJlZShwKTsKIAlwWzUwXSA9IDB4OWE7Ci0JcHJpbnRrKEtFUk5fRVJSICJcbjIuIGttYWxsb2MtMjU2OiBDbG9iYmVyIDUwdGggYnl0ZSAweDlhLT4weCVwXG5cbiIsIHApOworCXByaW50ayhLRVJOX0VSUiAiXG4yLiBrbWFsbG9jLTI1NjogQ2xvYmJlciA1MHRoIGJ5dGUgMHg5YS0+MHglcFxuXG4iLAorCQkJcCk7CiAJdmFsaWRhdGVfc2xhYl9jYWNoZShrbWFsbG9jX2NhY2hlcyArIDgpOwogCiAJcCA9IGt6YWxsb2MoNTEyLCBHRlBfS0VSTkVMKTsKQEAgLTMzODQsNyArMzUzMyw3IEBACiBzdGF0aWMgdm9pZCBwcm9jZXNzX3NsYWIoc3RydWN0IGxvY190cmFjayAqdCwgc3RydWN0IGttZW1fY2FjaGUgKnMsCiAJCXN0cnVjdCBwYWdlICpwYWdlLCBlbnVtIHRyYWNrX2l0ZW0gYWxsb2MpCiB7Ci0Jdm9pZCAqYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwl2b2lkICphZGRyID0gc2xhYl9hZGRyZXNzKHBhZ2UpOwogCURFQ0xBUkVfQklUTUFQKG1hcCwgcy0+b2JqZWN0cyk7CiAJdm9pZCAqcDsKIApAQCAtMzg3Miw2ICs0MDIxLDYyIEBACiBTTEFCX0FUVFIocmVtb3RlX25vZGVfZGVmcmFnX3JhdGlvKTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1NMVUJfU1RBVFMKKworc3RhdGljIGludCBzaG93X3N0YXQoc3RydWN0IGttZW1fY2FjaGUgKnMsIGNoYXIgKmJ1ZiwgZW51bSBzdGF0X2l0ZW0gc2kpCit7CisJdW5zaWduZWQgbG9uZyBzdW0gID0gMDsKKwlpbnQgY3B1OworCWludCBsZW47CisJaW50ICpkYXRhID0ga21hbGxvYyhucl9jcHVfaWRzICogc2l6ZW9mKGludCksIEdGUF9LRVJORUwpOworCisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCXVuc2lnbmVkIHggPSBnZXRfY3B1X3NsYWIocywgY3B1KS0+c3RhdFtzaV07CisKKwkJZGF0YVtjcHVdID0geDsKKwkJc3VtICs9IHg7CisJfQorCisJbGVuID0gc3ByaW50ZihidWYsICIlbHUiLCBzdW0pOworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJaWYgKGRhdGFbY3B1XSAmJiBsZW4gPCBQQUdFX1NJWkUgLSAyMCkKKwkJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiBjJWQ9JXUiLCBjcHUsIGRhdGFbY3B1XSk7CisJfQorCWtmcmVlKGRhdGEpOworCXJldHVybiBsZW4gKyBzcHJpbnRmKGJ1ZiArIGxlbiwgIlxuIik7Cit9CisKKyNkZWZpbmUgU1RBVF9BVFRSKHNpLCB0ZXh0KSAJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHRleHQjI19zaG93KHN0cnVjdCBrbWVtX2NhY2hlICpzLCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19zdGF0KHMsIGJ1Ziwgc2kpOwkJCQlcCit9CQkJCQkJCQlcCitTTEFCX0FUVFJfUk8odGV4dCk7CQkJCQkJXAorCitTVEFUX0FUVFIoQUxMT0NfRkFTVFBBVEgsIGFsbG9jX2Zhc3RwYXRoKTsKK1NUQVRfQVRUUihBTExPQ19TTE9XUEFUSCwgYWxsb2Nfc2xvd3BhdGgpOworU1RBVF9BVFRSKEZSRUVfRkFTVFBBVEgsIGZyZWVfZmFzdHBhdGgpOworU1RBVF9BVFRSKEZSRUVfU0xPV1BBVEgsIGZyZWVfc2xvd3BhdGgpOworU1RBVF9BVFRSKEZSRUVfRlJPWkVOLCBmcmVlX2Zyb3plbik7CitTVEFUX0FUVFIoRlJFRV9BRERfUEFSVElBTCwgZnJlZV9hZGRfcGFydGlhbCk7CitTVEFUX0FUVFIoRlJFRV9SRU1PVkVfUEFSVElBTCwgZnJlZV9yZW1vdmVfcGFydGlhbCk7CitTVEFUX0FUVFIoQUxMT0NfRlJPTV9QQVJUSUFMLCBhbGxvY19mcm9tX3BhcnRpYWwpOworU1RBVF9BVFRSKEFMTE9DX1NMQUIsIGFsbG9jX3NsYWIpOworU1RBVF9BVFRSKEFMTE9DX1JFRklMTCwgYWxsb2NfcmVmaWxsKTsKK1NUQVRfQVRUUihGUkVFX1NMQUIsIGZyZWVfc2xhYik7CitTVEFUX0FUVFIoQ1BVU0xBQl9GTFVTSCwgY3B1c2xhYl9mbHVzaCk7CitTVEFUX0FUVFIoREVBQ1RJVkFURV9GVUxMLCBkZWFjdGl2YXRlX2Z1bGwpOworU1RBVF9BVFRSKERFQUNUSVZBVEVfRU1QVFksIGRlYWN0aXZhdGVfZW1wdHkpOworU1RBVF9BVFRSKERFQUNUSVZBVEVfVE9fSEVBRCwgZGVhY3RpdmF0ZV90b19oZWFkKTsKK1NUQVRfQVRUUihERUFDVElWQVRFX1RPX1RBSUwsIGRlYWN0aXZhdGVfdG9fdGFpbCk7CitTVEFUX0FUVFIoREVBQ1RJVkFURV9SRU1PVEVfRlJFRVMsIGRlYWN0aXZhdGVfcmVtb3RlX2ZyZWVzKTsKKworI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpzbGFiX2F0dHJzW10gPSB7CiAJJnNsYWJfc2l6ZV9hdHRyLmF0dHIsCiAJJm9iamVjdF9zaXplX2F0dHIuYXR0ciwKQEAgLTM5MDIsNiArNDEwNywyNSBAQAogI2lmZGVmIENPTkZJR19OVU1BCiAJJnJlbW90ZV9ub2RlX2RlZnJhZ19yYXRpb19hdHRyLmF0dHIsCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0xVQl9TVEFUUworCSZhbGxvY19mYXN0cGF0aF9hdHRyLmF0dHIsCisJJmFsbG9jX3Nsb3dwYXRoX2F0dHIuYXR0ciwKKwkmZnJlZV9mYXN0cGF0aF9hdHRyLmF0dHIsCisJJmZyZWVfc2xvd3BhdGhfYXR0ci5hdHRyLAorCSZmcmVlX2Zyb3plbl9hdHRyLmF0dHIsCisJJmZyZWVfYWRkX3BhcnRpYWxfYXR0ci5hdHRyLAorCSZmcmVlX3JlbW92ZV9wYXJ0aWFsX2F0dHIuYXR0ciwKKwkmYWxsb2NfZnJvbV9wYXJ0aWFsX2F0dHIuYXR0ciwKKwkmYWxsb2Nfc2xhYl9hdHRyLmF0dHIsCisJJmFsbG9jX3JlZmlsbF9hdHRyLmF0dHIsCisJJmZyZWVfc2xhYl9hdHRyLmF0dHIsCisJJmNwdXNsYWJfZmx1c2hfYXR0ci5hdHRyLAorCSZkZWFjdGl2YXRlX2Z1bGxfYXR0ci5hdHRyLAorCSZkZWFjdGl2YXRlX2VtcHR5X2F0dHIuYXR0ciwKKwkmZGVhY3RpdmF0ZV90b19oZWFkX2F0dHIuYXR0ciwKKwkmZGVhY3RpdmF0ZV90b190YWlsX2F0dHIuYXR0ciwKKwkmZGVhY3RpdmF0ZV9yZW1vdGVfZnJlZXNfYXR0ci5hdHRyLAorI2VuZGlmCiAJTlVMTAogfTsKIApkaWZmIC0tZ2l0IGEvbW0vc3dhcC5jIGIvbW0vc3dhcC5jCmluZGV4IDU3YjdlMjUuLjcxMGEyMGIgMTAwNjQ0Ci0tLSBhL21tL3N3YXAuYworKysgYi9tbS9zd2FwLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvbWVtY29udHJvbC5oPgogCiAvKiBIb3cgbWFueSBwYWdlcyBkbyB3ZSB0cnkgdG8gc3dhcCBvciBwYWdlIGluL291dCB0b2dldGhlcj8gKi8KIGludCBwYWdlX2NsdXN0ZXI7CkBAIC0xNzUsNiArMTc2LDcgQEAKIAkJU2V0UGFnZUFjdGl2ZShwYWdlKTsKIAkJYWRkX3BhZ2VfdG9fYWN0aXZlX2xpc3Qoem9uZSwgcGFnZSk7CiAJCV9fY291bnRfdm1fZXZlbnQoUEdBQ1RJVkFURSk7CisJCW1lbV9jZ3JvdXBfbW92ZV9saXN0cyhwYWdlX2dldF9wYWdlX2Nncm91cChwYWdlKSwgdHJ1ZSk7CiAJfQogCXNwaW5fdW5sb2NrX2lycSgmem9uZS0+bHJ1X2xvY2spOwogfQpkaWZmIC0tZ2l0IGEvbW0vc3dhcGZpbGUuYyBiL21tL3N3YXBmaWxlLmMKaW5kZXggZWFkZTI0ZC4uMDJjY2FiNSAxMDA2NDQKLS0tIGEvbW0vc3dhcGZpbGUuYworKysgYi9tbS9zd2FwZmlsZS5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1jb250cm9sLmg+CiAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgpAQCAtNTExLDExICs1MTIsMTYgQEAKIHsKIAlzcGlubG9ja190ICpwdGw7CiAJcHRlX3QgKnB0ZTsKLQlpbnQgZm91bmQgPSAxOworCWludCByZXQgPSAxOworCisJaWYgKG1lbV9jZ3JvdXBfY2hhcmdlKHBhZ2UsIHZtYS0+dm1fbW0sIEdGUF9LRVJORUwpKQorCQlyZXQgPSAtRU5PTUVNOwogCiAJcHRlID0gcHRlX29mZnNldF9tYXBfbG9jayh2bWEtPnZtX21tLCBwbWQsIGFkZHIsICZwdGwpOwogCWlmICh1bmxpa2VseSghcHRlX3NhbWUoKnB0ZSwgc3dwX2VudHJ5X3RvX3B0ZShlbnRyeSkpKSkgewotCQlmb3VuZCA9IDA7CisJCWlmIChyZXQgPiAwKQorCQkJbWVtX2Nncm91cF91bmNoYXJnZV9wYWdlKHBhZ2UpOworCQlyZXQgPSAwOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTUzMiw3ICs1MzgsNyBAQAogCWFjdGl2YXRlX3BhZ2UocGFnZSk7CiBvdXQ6CiAJcHRlX3VubWFwX3VubG9jayhwdGUsIHB0bCk7Ci0JcmV0dXJuIGZvdW5kOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgdW51c2VfcHRlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLApAQCAtNTQxLDcgKzU0Nyw3IEBACiB7CiAJcHRlX3Qgc3dwX3B0ZSA9IHN3cF9lbnRyeV90b19wdGUoZW50cnkpOwogCXB0ZV90ICpwdGU7Ci0JaW50IGZvdW5kID0gMDsKKwlpbnQgcmV0ID0gMDsKIAogCS8qCiAJICogV2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCBwdGUgbG9jayB3aGlsZSBzY2FubmluZyBmb3Igc3dwX3B0ZTogc2luY2UKQEAgLTU2MCwxNSArNTY2LDE1IEBACiAJCSAqLwogCQlpZiAodW5saWtlbHkocHRlX3NhbWUoKnB0ZSwgc3dwX3B0ZSkpKSB7CiAJCQlwdGVfdW5tYXAocHRlKTsKLQkJCWZvdW5kID0gdW51c2VfcHRlKHZtYSwgcG1kLCBhZGRyLCBlbnRyeSwgcGFnZSk7Ci0JCQlpZiAoZm91bmQpCisJCQlyZXQgPSB1bnVzZV9wdGUodm1hLCBwbWQsIGFkZHIsIGVudHJ5LCBwYWdlKTsKKwkJCWlmIChyZXQpCiAJCQkJZ290byBvdXQ7CiAJCQlwdGUgPSBwdGVfb2Zmc2V0X21hcChwbWQsIGFkZHIpOwogCQl9CiAJfSB3aGlsZSAocHRlKyssIGFkZHIgKz0gUEFHRV9TSVpFLCBhZGRyICE9IGVuZCk7CiAJcHRlX3VubWFwKHB0ZSAtIDEpOwogb3V0OgotCXJldHVybiBmb3VuZDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW5saW5lIGludCB1bnVzZV9wbWRfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHB1ZF90ICpwdWQsCkBAIC01NzcsMTQgKzU4MywxNiBAQAogewogCXBtZF90ICpwbWQ7CiAJdW5zaWduZWQgbG9uZyBuZXh0OworCWludCByZXQ7CiAKIAlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcik7CiAJZG8gewogCQluZXh0ID0gcG1kX2FkZHJfZW5kKGFkZHIsIGVuZCk7CiAJCWlmIChwbWRfbm9uZV9vcl9jbGVhcl9iYWQocG1kKSkKIAkJCWNvbnRpbnVlOwotCQlpZiAodW51c2VfcHRlX3JhbmdlKHZtYSwgcG1kLCBhZGRyLCBuZXh0LCBlbnRyeSwgcGFnZSkpCi0JCQlyZXR1cm4gMTsKKwkJcmV0ID0gdW51c2VfcHRlX3JhbmdlKHZtYSwgcG1kLCBhZGRyLCBuZXh0LCBlbnRyeSwgcGFnZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCX0gd2hpbGUgKHBtZCsrLCBhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOwogCXJldHVybiAwOwogfQpAQCAtNTk1LDE0ICs2MDMsMTYgQEAKIHsKIAlwdWRfdCAqcHVkOwogCXVuc2lnbmVkIGxvbmcgbmV4dDsKKwlpbnQgcmV0OwogCiAJcHVkID0gcHVkX29mZnNldChwZ2QsIGFkZHIpOwogCWRvIHsKIAkJbmV4dCA9IHB1ZF9hZGRyX2VuZChhZGRyLCBlbmQpOwogCQlpZiAocHVkX25vbmVfb3JfY2xlYXJfYmFkKHB1ZCkpCiAJCQljb250aW51ZTsKLQkJaWYgKHVudXNlX3BtZF9yYW5nZSh2bWEsIHB1ZCwgYWRkciwgbmV4dCwgZW50cnksIHBhZ2UpKQotCQkJcmV0dXJuIDE7CisJCXJldCA9IHVudXNlX3BtZF9yYW5nZSh2bWEsIHB1ZCwgYWRkciwgbmV4dCwgZW50cnksIHBhZ2UpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAl9IHdoaWxlIChwdWQrKywgYWRkciA9IG5leHQsIGFkZHIgIT0gZW5kKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTYxMiw2ICs2MjIsNyBAQAogewogCXBnZF90ICpwZ2Q7CiAJdW5zaWduZWQgbG9uZyBhZGRyLCBlbmQsIG5leHQ7CisJaW50IHJldDsKIAogCWlmIChwYWdlLT5tYXBwaW5nKSB7CiAJCWFkZHIgPSBwYWdlX2FkZHJlc3NfaW5fdm1hKHBhZ2UsIHZtYSk7CkBAIC02MjksOCArNjQwLDkgQEAKIAkJbmV4dCA9IHBnZF9hZGRyX2VuZChhZGRyLCBlbmQpOwogCQlpZiAocGdkX25vbmVfb3JfY2xlYXJfYmFkKHBnZCkpCiAJCQljb250aW51ZTsKLQkJaWYgKHVudXNlX3B1ZF9yYW5nZSh2bWEsIHBnZCwgYWRkciwgbmV4dCwgZW50cnksIHBhZ2UpKQotCQkJcmV0dXJuIDE7CisJCXJldCA9IHVudXNlX3B1ZF9yYW5nZSh2bWEsIHBnZCwgYWRkciwgbmV4dCwgZW50cnksIHBhZ2UpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAl9IHdoaWxlIChwZ2QrKywgYWRkciA9IG5leHQsIGFkZHIgIT0gZW5kKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTYzOSw2ICs2NTEsNyBAQAogCQkJCXN3cF9lbnRyeV90IGVudHJ5LCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwlpbnQgcmV0ID0gMDsKIAogCWlmICghZG93bl9yZWFkX3RyeWxvY2soJm1tLT5tbWFwX3NlbSkpIHsKIAkJLyoKQEAgLTY1MSwxNSArNjY0LDExIEBACiAJCWxvY2tfcGFnZShwYWdlKTsKIAl9CiAJZm9yICh2bWEgPSBtbS0+bW1hcDsgdm1hOyB2bWEgPSB2bWEtPnZtX25leHQpIHsKLQkJaWYgKHZtYS0+YW5vbl92bWEgJiYgdW51c2Vfdm1hKHZtYSwgZW50cnksIHBhZ2UpKQorCQlpZiAodm1hLT5hbm9uX3ZtYSAmJiAocmV0ID0gdW51c2Vfdm1hKHZtYSwgZW50cnksIHBhZ2UpKSkKIAkJCWJyZWFrOwogCX0KIAl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwotCS8qCi0JICogQ3VycmVudGx5IHVudXNlX21tIGNhbm5vdCBmYWlsLCBidXQgbGVhdmUgZXJyb3IgaGFuZGxpbmcKLQkgKiBhdCBjYWxsIHNpdGVzIGZvciBub3csIHNpbmNlIHdlIGNoYW5nZSBpdCBmcm9tIHRpbWUgdG8gdGltZS4KLQkgKi8KLQlyZXR1cm4gMDsKKwlyZXR1cm4gKHJldCA8IDApPyByZXQ6IDA7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9tbS92bWFsbG9jLmMgYi9tbS92bWFsbG9jLmMKaW5kZXggMDUzNmRkZS4uOTUwYzBiZSAxMDA2NDQKLS0tIGEvbW0vdm1hbGxvYy5jCisrKyBiL21tL3ZtYWxsb2MuYwpAQCAtODIwLDcgKzgyMCw3IEBACiB9CiAKIAotc3RhdGljIGludCBmKHB0ZV90ICpwdGUsIHN0cnVjdCBwYWdlICpwbWRfcGFnZSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBmKHB0ZV90ICpwdGUsIHBndGFibGVfdCB0YWJsZSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpkYXRhKQogewogCS8qIGFwcGx5X3RvX3BhZ2VfcmFuZ2UoKSBkb2VzIGFsbCB0aGUgaGFyZCB3b3JrLiAqLwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbW0vdm1zY2FuLmMgYi9tbS92bXNjYW4uYwppbmRleCBlNWE5NTk3Li5hMjZkYWJkIDEwMDY0NAotLS0gYS9tbS92bXNjYW4uYworKysgYi9tbS92bXNjYW4uYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1jb250cm9sLmg+CiAKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KQEAgLTY4LDYgKzY5LDIyIEBACiAJaW50IGFsbF91bnJlY2xhaW1hYmxlOwogCiAJaW50IG9yZGVyOworCisJLyoKKwkgKiBQYWdlcyB0aGF0IGhhdmUgKG9yIHNob3VsZCBoYXZlKSBJTyBwZW5kaW5nLiAgSWYgd2UgcnVuIGludG8KKwkgKiBhIGxvdCBvZiB0aGVzZSwgd2UncmUgYmV0dGVyIG9mZiB3YWl0aW5nIGEgbGl0dGxlIGZvciBJTyB0bworCSAqIGZpbmlzaCByYXRoZXIgdGhhbiBzY2FubmluZyBtb3JlIHBhZ2VzIGluIHRoZSBWTS4KKwkgKi8KKwlpbnQgbnJfaW9fcGFnZXM7CisKKwkvKiBXaGljaCBjZ3JvdXAgZG8gd2UgcmVjbGFpbSBmcm9tICovCisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbV9jZ3JvdXA7CisKKwkvKiBQbHVnZ2FibGUgaXNvbGF0ZSBwYWdlcyBjYWxsYmFjayAqLworCXVuc2lnbmVkIGxvbmcgKCppc29sYXRlX3BhZ2VzKSh1bnNpZ25lZCBsb25nIG5yLCBzdHJ1Y3QgbGlzdF9oZWFkICpkc3QsCisJCQl1bnNpZ25lZCBsb25nICpzY2FubmVkLCBpbnQgb3JkZXIsIGludCBtb2RlLAorCQkJc3RydWN0IHpvbmUgKnosIHN0cnVjdCBtZW1fY2dyb3VwICptZW1fY29udCwKKwkJCWludCBhY3RpdmUpOwogfTsKIAogI2RlZmluZSBscnVfdG9fcGFnZShfaGVhZCkgKGxpc3RfZW50cnkoKF9oZWFkKS0+cHJldiwgc3RydWN0IHBhZ2UsIGxydSkpCkBAIC0xMDksNiArMTI2LDEyIEBACiBzdGF0aWMgTElTVF9IRUFEKHNocmlua2VyX2xpc3QpOwogc3RhdGljIERFQ0xBUkVfUldTRU0oc2hyaW5rZXJfcndzZW0pOwogCisjaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fQ09OVAorI2RlZmluZSBzY2FuX2dsb2JhbF9scnUoc2MpCSghKHNjKS0+bWVtX2Nncm91cCkKKyNlbHNlCisjZGVmaW5lIHNjYW5fZ2xvYmFsX2xydShzYykJKDEpCisjZW5kaWYKKwogLyoKICAqIEFkZCBhIHNocmlua2VyIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBmcm9tIHRoZSB2bQogICovCkBAIC00ODksMTEgKzUxMiwxMyBAQAogCQkJICovCiAJCQlpZiAoc3luY193cml0ZWJhY2sgPT0gUEFHRU9VVF9JT19TWU5DICYmIG1heV9lbnRlcl9mcykKIAkJCQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwotCQkJZWxzZQorCQkJZWxzZSB7CisJCQkJc2MtPm5yX2lvX3BhZ2VzKys7CiAJCQkJZ290byBrZWVwX2xvY2tlZDsKKwkJCX0KIAkJfQogCi0JCXJlZmVyZW5jZWQgPSBwYWdlX3JlZmVyZW5jZWQocGFnZSwgMSk7CisJCXJlZmVyZW5jZWQgPSBwYWdlX3JlZmVyZW5jZWQocGFnZSwgMSwgc2MtPm1lbV9jZ3JvdXApOwogCQkvKiBJbiBhY3RpdmUgdXNlIG9yIHJlYWxseSB1bmZyZWVhYmxlPyAgQWN0aXZhdGUgaXQuICovCiAJCWlmIChzYy0+b3JkZXIgPD0gUEFHRV9BTExPQ19DT1NUTFlfT1JERVIgJiYKIAkJCQkJcmVmZXJlbmNlZCAmJiBwYWdlX21hcHBpbmdfaW51c2UocGFnZSkpCkBAIC01MjksOCArNTU0LDEwIEBACiAJCWlmIChQYWdlRGlydHkocGFnZSkpIHsKIAkJCWlmIChzYy0+b3JkZXIgPD0gUEFHRV9BTExPQ19DT1NUTFlfT1JERVIgJiYgcmVmZXJlbmNlZCkKIAkJCQlnb3RvIGtlZXBfbG9ja2VkOwotCQkJaWYgKCFtYXlfZW50ZXJfZnMpCisJCQlpZiAoIW1heV9lbnRlcl9mcykgeworCQkJCXNjLT5ucl9pb19wYWdlcysrOwogCQkJCWdvdG8ga2VlcF9sb2NrZWQ7CisJCQl9CiAJCQlpZiAoIXNjLT5tYXlfd3JpdGVwYWdlKQogCQkJCWdvdG8ga2VlcF9sb2NrZWQ7CiAKQEAgLTU0MSw4ICs1NjgsMTAgQEAKIAkJCWNhc2UgUEFHRV9BQ1RJVkFURToKIAkJCQlnb3RvIGFjdGl2YXRlX2xvY2tlZDsKIAkJCWNhc2UgUEFHRV9TVUNDRVNTOgotCQkJCWlmIChQYWdlV3JpdGViYWNrKHBhZ2UpIHx8IFBhZ2VEaXJ0eShwYWdlKSkKKwkJCQlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSB8fCBQYWdlRGlydHkocGFnZSkpIHsKKwkJCQkJc2MtPm5yX2lvX3BhZ2VzKys7CiAJCQkJCWdvdG8ga2VlcDsKKwkJCQl9CiAJCQkJLyoKIAkJCQkgKiBBIHN5bmNocm9ub3VzIHdyaXRlIC0gcHJvYmFibHkgYSByYW1kaXNrLiAgR28KIAkJCQkgKiBhaGVhZCBhbmQgdHJ5IHRvIHJlY2xhaW0gdGhlIHBhZ2UuCkBAIC02MjYsNyArNjU1LDcgQEAKICAqCiAgKiByZXR1cm5zIDAgb24gc3VjY2VzcywgLXZlIGVycm5vIG9uIGZhaWx1cmUuCiAgKi8KLXN0YXRpYyBpbnQgX19pc29sYXRlX2xydV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbW9kZSkKK2ludCBfX2lzb2xhdGVfbHJ1X3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBtb2RlKQogewogCWludCByZXQgPSAtRUlOVkFMOwogCkBAIC03NjAsNiArNzg5LDIxIEBACiAJcmV0dXJuIG5yX3Rha2VuOwogfQogCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpc29sYXRlX3BhZ2VzX2dsb2JhbCh1bnNpZ25lZCBsb25nIG5yLAorCQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpkc3QsCisJCQkJCXVuc2lnbmVkIGxvbmcgKnNjYW5uZWQsIGludCBvcmRlciwKKwkJCQkJaW50IG1vZGUsIHN0cnVjdCB6b25lICp6LAorCQkJCQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtX2NvbnQsCisJCQkJCWludCBhY3RpdmUpCit7CisJaWYgKGFjdGl2ZSkKKwkJcmV0dXJuIGlzb2xhdGVfbHJ1X3BhZ2VzKG5yLCAmei0+YWN0aXZlX2xpc3QsIGRzdCwKKwkJCQkJCXNjYW5uZWQsIG9yZGVyLCBtb2RlKTsKKwllbHNlCisJCXJldHVybiBpc29sYXRlX2xydV9wYWdlcyhuciwgJnotPmluYWN0aXZlX2xpc3QsIGRzdCwKKwkJCQkJCXNjYW5uZWQsIG9yZGVyLCBtb2RlKTsKK30KKwogLyoKICAqIGNsZWFyX2FjdGl2ZV9mbGFncygpIGlzIGEgaGVscGVyIGZvciBzaHJpbmtfYWN0aXZlX2xpc3QoKSwgY2xlYXJpbmcKICAqIGFueSBhY3RpdmUgYml0cyBmcm9tIHRoZSBwYWdlcyBpbiB0aGUgbGlzdC4KQEAgLTgwMSwxOCArODQ1LDE5IEBACiAJCXVuc2lnbmVkIGxvbmcgbnJfZnJlZWQ7CiAJCXVuc2lnbmVkIGxvbmcgbnJfYWN0aXZlOwogCi0JCW5yX3Rha2VuID0gaXNvbGF0ZV9scnVfcGFnZXMoc2MtPnN3YXBfY2x1c3Rlcl9tYXgsCi0JCQkgICAgICZ6b25lLT5pbmFjdGl2ZV9saXN0LAorCQlucl90YWtlbiA9IHNjLT5pc29sYXRlX3BhZ2VzKHNjLT5zd2FwX2NsdXN0ZXJfbWF4LAogCQkJICAgICAmcGFnZV9saXN0LCAmbnJfc2Nhbiwgc2MtPm9yZGVyLAogCQkJICAgICAoc2MtPm9yZGVyID4gUEFHRV9BTExPQ19DT1NUTFlfT1JERVIpPwotCQkJCQkgICAgIElTT0xBVEVfQk9USCA6IElTT0xBVEVfSU5BQ1RJVkUpOworCQkJCQkgICAgIElTT0xBVEVfQk9USCA6IElTT0xBVEVfSU5BQ1RJVkUsCisJCQkJem9uZSwgc2MtPm1lbV9jZ3JvdXAsIDApOwogCQlucl9hY3RpdmUgPSBjbGVhcl9hY3RpdmVfZmxhZ3MoJnBhZ2VfbGlzdCk7CiAJCV9fY291bnRfdm1fZXZlbnRzKFBHREVBQ1RJVkFURSwgbnJfYWN0aXZlKTsKIAogCQlfX21vZF96b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfQUNUSVZFLCAtbnJfYWN0aXZlKTsKIAkJX19tb2Rfem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0lOQUNUSVZFLAogCQkJCQkJLShucl90YWtlbiAtIG5yX2FjdGl2ZSkpOwotCQl6b25lLT5wYWdlc19zY2FubmVkICs9IG5yX3NjYW47CisJCWlmIChzY2FuX2dsb2JhbF9scnUoc2MpKQorCQkJem9uZS0+cGFnZXNfc2Nhbm5lZCArPSBucl9zY2FuOwogCQlzcGluX3VubG9ja19pcnEoJnpvbmUtPmxydV9sb2NrKTsKIAogCQlucl9zY2FubmVkICs9IG5yX3NjYW47CkBAIC04NDQsOCArODg5LDkgQEAKIAkJaWYgKGN1cnJlbnRfaXNfa3N3YXBkKCkpIHsKIAkJCV9fY291bnRfem9uZV92bV9ldmVudHMoUEdTQ0FOX0tTV0FQRCwgem9uZSwgbnJfc2Nhbik7CiAJCQlfX2NvdW50X3ZtX2V2ZW50cyhLU1dBUERfU1RFQUwsIG5yX2ZyZWVkKTsKLQkJfSBlbHNlCisJCX0gZWxzZSBpZiAoc2Nhbl9nbG9iYWxfbHJ1KHNjKSkKIAkJCV9fY291bnRfem9uZV92bV9ldmVudHMoUEdTQ0FOX0RJUkVDVCwgem9uZSwgbnJfc2Nhbik7CisKIAkJX19jb3VudF96b25lX3ZtX2V2ZW50cyhQR1NURUFMLCB6b25lLCBucl9mcmVlZCk7CiAKIAkJaWYgKG5yX3Rha2VuID09IDApCkBAIC04OTksNiArOTQ1LDExMyBAQAogfQogCiAvKgorICogRGV0ZXJtaW5lIHdlIHNob3VsZCB0cnkgdG8gcmVjbGFpbSBtYXBwZWQgcGFnZXMuCisgKiBUaGlzIGlzIGNhbGxlZCBvbmx5IHdoZW4gc2MtPm1lbV9jZ3JvdXAgaXMgTlVMTC4KKyAqLworc3RhdGljIGludCBjYWxjX3JlY2xhaW1fbWFwcGVkKHN0cnVjdCBzY2FuX2NvbnRyb2wgKnNjLCBzdHJ1Y3Qgem9uZSAqem9uZSwKKwkJCQlpbnQgcHJpb3JpdHkpCit7CisJbG9uZyBtYXBwZWRfcmF0aW87CisJbG9uZyBkaXN0cmVzczsKKwlsb25nIHN3YXBfdGVuZGVuY3k7CisJbG9uZyBpbWJhbGFuY2U7CisJaW50IHJlY2xhaW1fbWFwcGVkID0gMDsKKwlpbnQgcHJldl9wcmlvcml0eTsKKworCWlmIChzY2FuX2dsb2JhbF9scnUoc2MpICYmIHpvbmVfaXNfbmVhcl9vb20oem9uZSkpCisJCXJldHVybiAxOworCS8qCisJICogYGRpc3RyZXNzJyBpcyBhIG1lYXN1cmUgb2YgaG93IG11Y2ggdHJvdWJsZSB3ZSdyZSBoYXZpbmcKKwkgKiByZWNsYWltaW5nIHBhZ2VzLiAgMCAtPiBubyBwcm9ibGVtcy4gIDEwMCAtPiBncmVhdCB0cm91YmxlLgorCSAqLworCWlmIChzY2FuX2dsb2JhbF9scnUoc2MpKQorCQlwcmV2X3ByaW9yaXR5ID0gem9uZS0+cHJldl9wcmlvcml0eTsKKwllbHNlCisJCXByZXZfcHJpb3JpdHkgPSBtZW1fY2dyb3VwX2dldF9yZWNsYWltX3ByaW9yaXR5KHNjLT5tZW1fY2dyb3VwKTsKKworCWRpc3RyZXNzID0gMTAwID4+IG1pbihwcmV2X3ByaW9yaXR5LCBwcmlvcml0eSk7CisKKwkvKgorCSAqIFRoZSBwb2ludCBvZiB0aGlzIGFsZ29yaXRobSBpcyB0byBkZWNpZGUgd2hlbiB0byBzdGFydAorCSAqIHJlY2xhaW1pbmcgbWFwcGVkIG1lbW9yeSBpbnN0ZWFkIG9mIGp1c3QgcGFnZWNhY2hlLiAgV29yayBvdXQKKwkgKiBob3cgbXVjaCBtZW1vcnkKKwkgKiBpcyBtYXBwZWQuCisJICovCisJaWYgKHNjYW5fZ2xvYmFsX2xydShzYykpCisJCW1hcHBlZF9yYXRpbyA9ICgoZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfRklMRV9NQVBQRUQpICsKKwkJCQlnbG9iYWxfcGFnZV9zdGF0ZShOUl9BTk9OX1BBR0VTKSkgKiAxMDApIC8KKwkJCQkJdm1fdG90YWxfcGFnZXM7CisJZWxzZQorCQltYXBwZWRfcmF0aW8gPSBtZW1fY2dyb3VwX2NhbGNfbWFwcGVkX3JhdGlvKHNjLT5tZW1fY2dyb3VwKTsKKworCS8qCisJICogTm93IGRlY2lkZSBob3cgbXVjaCB3ZSByZWFsbHkgd2FudCB0byB1bm1hcCBzb21lIHBhZ2VzLiAgVGhlCisJICogbWFwcGVkIHJhdGlvIGlzIGRvd25ncmFkZWQgLSBqdXN0IGJlY2F1c2UgdGhlcmUncyBhIGxvdCBvZgorCSAqIG1hcHBlZCBtZW1vcnkgZG9lc24ndCBuZWNlc3NhcmlseSBtZWFuIHRoYXQgcGFnZSByZWNsYWltCisJICogaXNuJ3Qgc3VjY2VlZGluZy4KKwkgKgorCSAqIFRoZSBkaXN0cmVzcyByYXRpbyBpcyBpbXBvcnRhbnQgLSB3ZSBkb24ndCB3YW50IHRvIHN0YXJ0CisJICogZ29pbmcgb29tLgorCSAqCisJICogQSAxMDAlIHZhbHVlIG9mIHZtX3N3YXBwaW5lc3Mgb3ZlcnJpZGVzIHRoaXMgYWxnb3JpdGhtCisJICogYWx0b2dldGhlci4KKwkgKi8KKwlzd2FwX3RlbmRlbmN5ID0gbWFwcGVkX3JhdGlvIC8gMiArIGRpc3RyZXNzICsgc2MtPnN3YXBwaW5lc3M7CisKKwkvKgorCSAqIElmIHRoZXJlJ3MgaHVnZSBpbWJhbGFuY2UgYmV0d2VlbiBhY3RpdmUgYW5kIGluYWN0aXZlCisJICogKHRoaW5rIGFjdGl2ZSAxMDAgdGltZXMgbGFyZ2VyIHRoYW4gaW5hY3RpdmUpIHdlIHNob3VsZAorCSAqIGJlY29tZSBtb3JlIHBlcm1pc3NpdmUsIG9yIHRoZSBzeXN0ZW0gd2lsbCB0YWtlIHRvbyBtdWNoCisJICogY3B1IGJlZm9yZSBpdCBzdGFydCBzd2FwcGluZyBkdXJpbmcgbWVtb3J5IHByZXNzdXJlLgorCSAqIERpc3RyZXNzIGlzIGFib3V0IGF2b2lkaW5nIGVhcmx5LW9vbSwgdGhpcyBpcyBhYm91dAorCSAqIG1ha2luZyBzd2FwcGluZXNzIGdyYWNlZnVsIGRlc3BpdGUgc2V0dGluZyBpdCB0byBsb3cKKwkgKiB2YWx1ZXMuCisJICoKKwkgKiBBdm9pZCBkaXYgYnkgemVybyB3aXRoIG5yX2luYWN0aXZlKzEsIGFuZCBtYXggcmVzdWx0aW5nCisJICogdmFsdWUgaXMgdm1fdG90YWxfcGFnZXMuCisJICovCisJaWYgKHNjYW5fZ2xvYmFsX2xydShzYykpIHsKKwkJaW1iYWxhbmNlICA9IHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9BQ1RJVkUpOworCQlpbWJhbGFuY2UgLz0gem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0lOQUNUSVZFKSArIDE7CisJfSBlbHNlCisJCWltYmFsYW5jZSA9IG1lbV9jZ3JvdXBfcmVjbGFpbV9pbWJhbGFuY2Uoc2MtPm1lbV9jZ3JvdXApOworCisJLyoKKwkgKiBSZWR1Y2UgdGhlIGVmZmVjdCBvZiBpbWJhbGFuY2UgaWYgc3dhcHBpbmVzcyBpcyBsb3csCisJICogdGhpcyBtZWFucyBmb3IgYSBzd2FwcGluZXNzIHZlcnkgbG93LCB0aGUgaW1iYWxhbmNlCisJICogbXVzdCBiZSBtdWNoIGhpZ2hlciB0aGFuIDEwMCBmb3IgdGhpcyBsb2dpYyB0byBtYWtlCisJICogdGhlIGRpZmZlcmVuY2UuCisJICoKKwkgKiBNYXggdGVtcG9yYXJ5IHZhbHVlIGlzIHZtX3RvdGFsX3BhZ2VzKjEwMC4KKwkgKi8KKwlpbWJhbGFuY2UgKj0gKHZtX3N3YXBwaW5lc3MgKyAxKTsKKwlpbWJhbGFuY2UgLz0gMTAwOworCisJLyoKKwkgKiBJZiBub3QgbXVjaCBvZiB0aGUgcmFtIGlzIG1hcHBlZCwgbWFrZXMgdGhlIGltYmFsYW5jZQorCSAqIGxlc3MgcmVsZXZhbnQsIGl0J3MgaGlnaCBwcmlvcml0eSB3ZSByZWZpbGwgdGhlIGluYWN0aXZlCisJICogbGlzdCB3aXRoIG1hcHBlZCBwYWdlcyBvbmx5IGluIHByZXNlbmNlIG9mIGhpZ2ggcmF0aW8gb2YKKwkgKiBtYXBwZWQgcGFnZXMuCisJICoKKwkgKiBNYXggdGVtcG9yYXJ5IHZhbHVlIGlzIHZtX3RvdGFsX3BhZ2VzKjEwMC4KKwkgKi8KKwlpbWJhbGFuY2UgKj0gbWFwcGVkX3JhdGlvOworCWltYmFsYW5jZSAvPSAxMDA7CisKKwkvKiBhcHBseSBpbWJhbGFuY2UgZmVlZGJhY2sgdG8gc3dhcF90ZW5kZW5jeSAqLworCXN3YXBfdGVuZGVuY3kgKz0gaW1iYWxhbmNlOworCisJLyoKKwkgKiBOb3cgdXNlIHRoaXMgbWV0cmljIHRvIGRlY2lkZSB3aGV0aGVyIHRvIHN0YXJ0IG1vdmluZyBtYXBwZWQKKwkgKiBtZW1vcnkgb250byB0aGUgaW5hY3RpdmUgbGlzdC4KKwkgKi8KKwlpZiAoc3dhcF90ZW5kZW5jeSA+PSAxMDApCisJCXJlY2xhaW1fbWFwcGVkID0gMTsKKworCXJldHVybiByZWNsYWltX21hcHBlZDsKK30KKworLyoKICAqIFRoaXMgbW92ZXMgcGFnZXMgZnJvbSB0aGUgYWN0aXZlIGxpc3QgdG8gdGhlIGluYWN0aXZlIGxpc3QuCiAgKgogICogV2UgbW92ZSB0aGVtIHRoZSBvdGhlciB3YXkgaWYgdGhlIHBhZ2UgaXMgcmVmZXJlbmNlZCBieSBvbmUgb3IgbW9yZQpAQCAtOTE1LDYgKzEwNjgsOCBAQAogICogVGhlIGRvd25zaWRlIGlzIHRoYXQgd2UgaGF2ZSB0byB0b3VjaCBwYWdlLT5fY291bnQgYWdhaW5zdCBlYWNoIHBhZ2UuCiAgKiBCdXQgd2UgaGFkIHRvIGFsdGVyIHBhZ2UtPmZsYWdzIGFueXdheS4KICAqLworCisKIHN0YXRpYyB2b2lkIHNocmlua19hY3RpdmVfbGlzdCh1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLCBzdHJ1Y3Qgem9uZSAqem9uZSwKIAkJCQlzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYywgaW50IHByaW9yaXR5KQogewpAQCAtOTI4LDk5ICsxMDgzLDIxIEBACiAJc3RydWN0IHBhZ2V2ZWMgcHZlYzsKIAlpbnQgcmVjbGFpbV9tYXBwZWQgPSAwOwogCi0JaWYgKHNjLT5tYXlfc3dhcCkgewotCQlsb25nIG1hcHBlZF9yYXRpbzsKLQkJbG9uZyBkaXN0cmVzczsKLQkJbG9uZyBzd2FwX3RlbmRlbmN5OwotCQlsb25nIGltYmFsYW5jZTsKLQotCQlpZiAoem9uZV9pc19uZWFyX29vbSh6b25lKSkKLQkJCWdvdG8gZm9yY2VfcmVjbGFpbV9tYXBwZWQ7Ci0KLQkJLyoKLQkJICogYGRpc3RyZXNzJyBpcyBhIG1lYXN1cmUgb2YgaG93IG11Y2ggdHJvdWJsZSB3ZSdyZSBoYXZpbmcKLQkJICogcmVjbGFpbWluZyBwYWdlcy4gIDAgLT4gbm8gcHJvYmxlbXMuICAxMDAgLT4gZ3JlYXQgdHJvdWJsZS4KLQkJICovCi0JCWRpc3RyZXNzID0gMTAwID4+IG1pbih6b25lLT5wcmV2X3ByaW9yaXR5LCBwcmlvcml0eSk7Ci0KLQkJLyoKLQkJICogVGhlIHBvaW50IG9mIHRoaXMgYWxnb3JpdGhtIGlzIHRvIGRlY2lkZSB3aGVuIHRvIHN0YXJ0Ci0JCSAqIHJlY2xhaW1pbmcgbWFwcGVkIG1lbW9yeSBpbnN0ZWFkIG9mIGp1c3QgcGFnZWNhY2hlLiAgV29yayBvdXQKLQkJICogaG93IG11Y2ggbWVtb3J5Ci0JCSAqIGlzIG1hcHBlZC4KLQkJICovCi0JCW1hcHBlZF9yYXRpbyA9ICgoZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfRklMRV9NQVBQRUQpICsKLQkJCQlnbG9iYWxfcGFnZV9zdGF0ZShOUl9BTk9OX1BBR0VTKSkgKiAxMDApIC8KLQkJCQkJdm1fdG90YWxfcGFnZXM7Ci0KLQkJLyoKLQkJICogTm93IGRlY2lkZSBob3cgbXVjaCB3ZSByZWFsbHkgd2FudCB0byB1bm1hcCBzb21lIHBhZ2VzLiAgVGhlCi0JCSAqIG1hcHBlZCByYXRpbyBpcyBkb3duZ3JhZGVkIC0ganVzdCBiZWNhdXNlIHRoZXJlJ3MgYSBsb3Qgb2YKLQkJICogbWFwcGVkIG1lbW9yeSBkb2Vzbid0IG5lY2Vzc2FyaWx5IG1lYW4gdGhhdCBwYWdlIHJlY2xhaW0KLQkJICogaXNuJ3Qgc3VjY2VlZGluZy4KLQkJICoKLQkJICogVGhlIGRpc3RyZXNzIHJhdGlvIGlzIGltcG9ydGFudCAtIHdlIGRvbid0IHdhbnQgdG8gc3RhcnQKLQkJICogZ29pbmcgb29tLgotCQkgKgotCQkgKiBBIDEwMCUgdmFsdWUgb2Ygdm1fc3dhcHBpbmVzcyBvdmVycmlkZXMgdGhpcyBhbGdvcml0aG0KLQkJICogYWx0b2dldGhlci4KLQkJICovCi0JCXN3YXBfdGVuZGVuY3kgPSBtYXBwZWRfcmF0aW8gLyAyICsgZGlzdHJlc3MgKyBzYy0+c3dhcHBpbmVzczsKLQotCQkvKgotCQkgKiBJZiB0aGVyZSdzIGh1Z2UgaW1iYWxhbmNlIGJldHdlZW4gYWN0aXZlIGFuZCBpbmFjdGl2ZQotCQkgKiAodGhpbmsgYWN0aXZlIDEwMCB0aW1lcyBsYXJnZXIgdGhhbiBpbmFjdGl2ZSkgd2Ugc2hvdWxkCi0JCSAqIGJlY29tZSBtb3JlIHBlcm1pc3NpdmUsIG9yIHRoZSBzeXN0ZW0gd2lsbCB0YWtlIHRvbyBtdWNoCi0JCSAqIGNwdSBiZWZvcmUgaXQgc3RhcnQgc3dhcHBpbmcgZHVyaW5nIG1lbW9yeSBwcmVzc3VyZS4KLQkJICogRGlzdHJlc3MgaXMgYWJvdXQgYXZvaWRpbmcgZWFybHktb29tLCB0aGlzIGlzIGFib3V0Ci0JCSAqIG1ha2luZyBzd2FwcGluZXNzIGdyYWNlZnVsIGRlc3BpdGUgc2V0dGluZyBpdCB0byBsb3cKLQkJICogdmFsdWVzLgotCQkgKgotCQkgKiBBdm9pZCBkaXYgYnkgemVybyB3aXRoIG5yX2luYWN0aXZlKzEsIGFuZCBtYXggcmVzdWx0aW5nCi0JCSAqIHZhbHVlIGlzIHZtX3RvdGFsX3BhZ2VzLgotCQkgKi8KLQkJaW1iYWxhbmNlICA9IHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9BQ1RJVkUpOwotCQlpbWJhbGFuY2UgLz0gem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0lOQUNUSVZFKSArIDE7Ci0KLQkJLyoKLQkJICogUmVkdWNlIHRoZSBlZmZlY3Qgb2YgaW1iYWxhbmNlIGlmIHN3YXBwaW5lc3MgaXMgbG93LAotCQkgKiB0aGlzIG1lYW5zIGZvciBhIHN3YXBwaW5lc3MgdmVyeSBsb3csIHRoZSBpbWJhbGFuY2UKLQkJICogbXVzdCBiZSBtdWNoIGhpZ2hlciB0aGFuIDEwMCBmb3IgdGhpcyBsb2dpYyB0byBtYWtlCi0JCSAqIHRoZSBkaWZmZXJlbmNlLgotCQkgKgotCQkgKiBNYXggdGVtcG9yYXJ5IHZhbHVlIGlzIHZtX3RvdGFsX3BhZ2VzKjEwMC4KLQkJICovCi0JCWltYmFsYW5jZSAqPSAodm1fc3dhcHBpbmVzcyArIDEpOwotCQlpbWJhbGFuY2UgLz0gMTAwOwotCi0JCS8qCi0JCSAqIElmIG5vdCBtdWNoIG9mIHRoZSByYW0gaXMgbWFwcGVkLCBtYWtlcyB0aGUgaW1iYWxhbmNlCi0JCSAqIGxlc3MgcmVsZXZhbnQsIGl0J3MgaGlnaCBwcmlvcml0eSB3ZSByZWZpbGwgdGhlIGluYWN0aXZlCi0JCSAqIGxpc3Qgd2l0aCBtYXBwZWQgcGFnZXMgb25seSBpbiBwcmVzZW5jZSBvZiBoaWdoIHJhdGlvIG9mCi0JCSAqIG1hcHBlZCBwYWdlcy4KLQkJICoKLQkJICogTWF4IHRlbXBvcmFyeSB2YWx1ZSBpcyB2bV90b3RhbF9wYWdlcyoxMDAuCi0JCSAqLwotCQlpbWJhbGFuY2UgKj0gbWFwcGVkX3JhdGlvOwotCQlpbWJhbGFuY2UgLz0gMTAwOwotCi0JCS8qIGFwcGx5IGltYmFsYW5jZSBmZWVkYmFjayB0byBzd2FwX3RlbmRlbmN5ICovCi0JCXN3YXBfdGVuZGVuY3kgKz0gaW1iYWxhbmNlOwotCi0JCS8qCi0JCSAqIE5vdyB1c2UgdGhpcyBtZXRyaWMgdG8gZGVjaWRlIHdoZXRoZXIgdG8gc3RhcnQgbW92aW5nIG1hcHBlZAotCQkgKiBtZW1vcnkgb250byB0aGUgaW5hY3RpdmUgbGlzdC4KLQkJICovCi0JCWlmIChzd2FwX3RlbmRlbmN5ID49IDEwMCkKLWZvcmNlX3JlY2xhaW1fbWFwcGVkOgotCQkJcmVjbGFpbV9tYXBwZWQgPSAxOwotCX0KKwlpZiAoc2MtPm1heV9zd2FwKQorCQlyZWNsYWltX21hcHBlZCA9IGNhbGNfcmVjbGFpbV9tYXBwZWQoc2MsIHpvbmUsIHByaW9yaXR5KTsKIAogCWxydV9hZGRfZHJhaW4oKTsKIAlzcGluX2xvY2tfaXJxKCZ6b25lLT5scnVfbG9jayk7Ci0JcGdtb3ZlZCA9IGlzb2xhdGVfbHJ1X3BhZ2VzKG5yX3BhZ2VzLCAmem9uZS0+YWN0aXZlX2xpc3QsCi0JCQkgICAgJmxfaG9sZCwgJnBnc2Nhbm5lZCwgc2MtPm9yZGVyLCBJU09MQVRFX0FDVElWRSk7Ci0Jem9uZS0+cGFnZXNfc2Nhbm5lZCArPSBwZ3NjYW5uZWQ7CisJcGdtb3ZlZCA9IHNjLT5pc29sYXRlX3BhZ2VzKG5yX3BhZ2VzLCAmbF9ob2xkLCAmcGdzY2FubmVkLCBzYy0+b3JkZXIsCisJCQkJCUlTT0xBVEVfQUNUSVZFLCB6b25lLAorCQkJCQlzYy0+bWVtX2Nncm91cCwgMSk7CisJLyoKKwkgKiB6b25lLT5wYWdlc19zY2FubmVkIGlzIHVzZWQgZm9yIGRldGVjdCB6b25lJ3Mgb29tCisJICogbWVtX2Nncm91cCByZW1lbWJlcnMgbnJfc2NhbiBieSBpdHNlbGYuCisJICovCisJaWYgKHNjYW5fZ2xvYmFsX2xydShzYykpCisJCXpvbmUtPnBhZ2VzX3NjYW5uZWQgKz0gcGdzY2FubmVkOworCiAJX19tb2Rfem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0FDVElWRSwgLXBnbW92ZWQpOwogCXNwaW5fdW5sb2NrX2lycSgmem9uZS0+bHJ1X2xvY2spOwogCkBAIC0xMDMxLDcgKzExMDgsNyBAQAogCQlpZiAocGFnZV9tYXBwZWQocGFnZSkpIHsKIAkJCWlmICghcmVjbGFpbV9tYXBwZWQgfHwKIAkJCSAgICAodG90YWxfc3dhcF9wYWdlcyA9PSAwICYmIFBhZ2VBbm9uKHBhZ2UpKSB8fAotCQkJICAgIHBhZ2VfcmVmZXJlbmNlZChwYWdlLCAwKSkgeworCQkJICAgIHBhZ2VfcmVmZXJlbmNlZChwYWdlLCAwLCBzYy0+bWVtX2Nncm91cCkpIHsKIAkJCQlsaXN0X2FkZCgmcGFnZS0+bHJ1LCAmbF9hY3RpdmUpOwogCQkJCWNvbnRpbnVlOwogCQkJfQpAQCAtMTA1MSw2ICsxMTI4LDcgQEAKIAkJQ2xlYXJQYWdlQWN0aXZlKHBhZ2UpOwogCiAJCWxpc3RfbW92ZSgmcGFnZS0+bHJ1LCAmem9uZS0+aW5hY3RpdmVfbGlzdCk7CisJCW1lbV9jZ3JvdXBfbW92ZV9saXN0cyhwYWdlX2dldF9wYWdlX2Nncm91cChwYWdlKSwgZmFsc2UpOwogCQlwZ21vdmVkKys7CiAJCWlmICghcGFnZXZlY19hZGQoJnB2ZWMsIHBhZ2UpKSB7CiAJCQlfX21vZF96b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfSU5BQ1RJVkUsIHBnbW92ZWQpOwpAQCAtMTA3OSw2ICsxMTU3LDcgQEAKIAkJU2V0UGFnZUxSVShwYWdlKTsKIAkJVk1fQlVHX09OKCFQYWdlQWN0aXZlKHBhZ2UpKTsKIAkJbGlzdF9tb3ZlKCZwYWdlLT5scnUsICZ6b25lLT5hY3RpdmVfbGlzdCk7CisJCW1lbV9jZ3JvdXBfbW92ZV9saXN0cyhwYWdlX2dldF9wYWdlX2Nncm91cChwYWdlKSwgdHJ1ZSk7CiAJCXBnbW92ZWQrKzsKIAkJaWYgKCFwYWdldmVjX2FkZCgmcHZlYywgcGFnZSkpIHsKIAkJCV9fbW9kX3pvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9BQ1RJVkUsIHBnbW92ZWQpOwpAQCAtMTEwOCwyNSArMTE4NywzOSBAQAogCXVuc2lnbmVkIGxvbmcgbnJfdG9fc2NhbjsKIAl1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZCA9IDA7CiAKLQkvKgotCSAqIEFkZCBvbmUgdG8gYG5yX3RvX3NjYW4nIGp1c3QgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGtlcm5lbCB3aWxsCi0JICogc2xvd2x5IHNpZnQgdGhyb3VnaCB0aGUgYWN0aXZlIGxpc3QuCi0JICovCi0Jem9uZS0+bnJfc2Nhbl9hY3RpdmUgKz0KLQkJKHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9BQ1RJVkUpID4+IHByaW9yaXR5KSArIDE7Ci0JbnJfYWN0aXZlID0gem9uZS0+bnJfc2Nhbl9hY3RpdmU7Ci0JaWYgKG5yX2FjdGl2ZSA+PSBzYy0+c3dhcF9jbHVzdGVyX21heCkKLQkJem9uZS0+bnJfc2Nhbl9hY3RpdmUgPSAwOwotCWVsc2UKLQkJbnJfYWN0aXZlID0gMDsKKwlpZiAoc2Nhbl9nbG9iYWxfbHJ1KHNjKSkgeworCQkvKgorCQkgKiBBZGQgb25lIHRvIG5yX3RvX3NjYW4ganVzdCB0byBtYWtlIHN1cmUgdGhhdCB0aGUga2VybmVsCisJCSAqIHdpbGwgc2xvd2x5IHNpZnQgdGhyb3VnaCB0aGUgYWN0aXZlIGxpc3QuCisJCSAqLworCQl6b25lLT5ucl9zY2FuX2FjdGl2ZSArPQorCQkJKHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9BQ1RJVkUpID4+IHByaW9yaXR5KSArIDE7CisJCW5yX2FjdGl2ZSA9IHpvbmUtPm5yX3NjYW5fYWN0aXZlOworCQl6b25lLT5ucl9zY2FuX2luYWN0aXZlICs9CisJCQkoem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0lOQUNUSVZFKSA+PiBwcmlvcml0eSkgKyAxOworCQlucl9pbmFjdGl2ZSA9IHpvbmUtPm5yX3NjYW5faW5hY3RpdmU7CisJCWlmIChucl9pbmFjdGl2ZSA+PSBzYy0+c3dhcF9jbHVzdGVyX21heCkKKwkJCXpvbmUtPm5yX3NjYW5faW5hY3RpdmUgPSAwOworCQllbHNlCisJCQlucl9pbmFjdGl2ZSA9IDA7CiAKLQl6b25lLT5ucl9zY2FuX2luYWN0aXZlICs9Ci0JCSh6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfSU5BQ1RJVkUpID4+IHByaW9yaXR5KSArIDE7Ci0JbnJfaW5hY3RpdmUgPSB6b25lLT5ucl9zY2FuX2luYWN0aXZlOwotCWlmIChucl9pbmFjdGl2ZSA+PSBzYy0+c3dhcF9jbHVzdGVyX21heCkKLQkJem9uZS0+bnJfc2Nhbl9pbmFjdGl2ZSA9IDA7Ci0JZWxzZQotCQlucl9pbmFjdGl2ZSA9IDA7CisJCWlmIChucl9hY3RpdmUgPj0gc2MtPnN3YXBfY2x1c3Rlcl9tYXgpCisJCQl6b25lLT5ucl9zY2FuX2FjdGl2ZSA9IDA7CisJCWVsc2UKKwkJCW5yX2FjdGl2ZSA9IDA7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGhpcyByZWNsYWltIG9jY3VycyBub3QgYmVjYXVzZSB6b25lIG1lbW9yeSBzaG9ydGFnZSBidXQKKwkJICogYmVjYXVzZSBtZW1vcnkgY29udHJvbGxlciBoaXRzIGl0cyBsaW1pdC4KKwkJICogVGhlbiwgZG9uJ3QgbW9kaWZ5IHpvbmUgcmVjbGFpbSByZWxhdGVkIGRhdGEuCisJCSAqLworCQlucl9hY3RpdmUgPSBtZW1fY2dyb3VwX2NhbGNfcmVjbGFpbV9hY3RpdmUoc2MtPm1lbV9jZ3JvdXAsCisJCQkJCXpvbmUsIHByaW9yaXR5KTsKKworCQlucl9pbmFjdGl2ZSA9IG1lbV9jZ3JvdXBfY2FsY19yZWNsYWltX2luYWN0aXZlKHNjLT5tZW1fY2dyb3VwLAorCQkJCQl6b25lLCBwcmlvcml0eSk7CisJfQorCiAKIAl3aGlsZSAobnJfYWN0aXZlIHx8IG5yX2luYWN0aXZlKSB7CiAJCWlmIChucl9hY3RpdmUpIHsKQEAgLTExNzEsMjUgKzEyNjQsMzkgQEAKIAl1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZCA9IDA7CiAJaW50IGk7CiAKKwogCXNjLT5hbGxfdW5yZWNsYWltYWJsZSA9IDE7CiAJZm9yIChpID0gMDsgem9uZXNbaV0gIT0gTlVMTDsgaSsrKSB7CiAJCXN0cnVjdCB6b25lICp6b25lID0gem9uZXNbaV07CiAKIAkJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkKIAkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBUYWtlIGNhcmUgbWVtb3J5IGNvbnRyb2xsZXIgcmVjbGFpbWluZyBoYXMgc21hbGwgaW5mbHVlbmNlCisJCSAqIHRvIGdsb2JhbCBMUlUuCisJCSAqLworCQlpZiAoc2Nhbl9nbG9iYWxfbHJ1KHNjKSkgeworCQkJaWYgKCFjcHVzZXRfem9uZV9hbGxvd2VkX2hhcmR3YWxsKHpvbmUsIEdGUF9LRVJORUwpKQorCQkJCWNvbnRpbnVlOworCQkJbm90ZV96b25lX3NjYW5uaW5nX3ByaW9yaXR5KHpvbmUsIHByaW9yaXR5KTsKIAotCQlpZiAoIWNwdXNldF96b25lX2FsbG93ZWRfaGFyZHdhbGwoem9uZSwgR0ZQX0tFUk5FTCkpCi0JCQljb250aW51ZTsKLQotCQlub3RlX3pvbmVfc2Nhbm5pbmdfcHJpb3JpdHkoem9uZSwgcHJpb3JpdHkpOwotCi0JCWlmICh6b25lX2lzX2FsbF91bnJlY2xhaW1hYmxlKHpvbmUpICYmIHByaW9yaXR5ICE9IERFRl9QUklPUklUWSkKLQkJCWNvbnRpbnVlOwkvKiBMZXQga3N3YXBkIHBvbGwgaXQgKi8KLQotCQlzYy0+YWxsX3VucmVjbGFpbWFibGUgPSAwOworCQkJaWYgKHpvbmVfaXNfYWxsX3VucmVjbGFpbWFibGUoem9uZSkgJiYKKwkJCQkJCXByaW9yaXR5ICE9IERFRl9QUklPUklUWSkKKwkJCQljb250aW51ZTsJLyogTGV0IGtzd2FwZCBwb2xsIGl0ICovCisJCQlzYy0+YWxsX3VucmVjbGFpbWFibGUgPSAwOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIElnbm9yZSBjcHVzZXQgbGltaXRhdGlvbiBoZXJlLiBXZSBqdXN0IHdhbnQgdG8gcmVkdWNlCisJCQkgKiAjIG9mIHVzZWQgcGFnZXMgYnkgdXMgcmVnYXJkbGVzcyBvZiBtZW1vcnkgc2hvcnRhZ2UuCisJCQkgKi8KKwkJCXNjLT5hbGxfdW5yZWNsYWltYWJsZSA9IDA7CisJCQltZW1fY2dyb3VwX25vdGVfcmVjbGFpbV9wcmlvcml0eShzYy0+bWVtX2Nncm91cCwKKwkJCQkJCQlwcmlvcml0eSk7CisJCX0KIAogCQlucl9yZWNsYWltZWQgKz0gc2hyaW5rX3pvbmUocHJpb3JpdHksIHpvbmUsIHNjKTsKIAl9CisKIAlyZXR1cm4gbnJfcmVjbGFpbWVkOwogfQogIApAQCAtMTIwNiw3ICsxMzEzLDggQEAKICAqIGhvbGRzIGZpbGVzeXN0ZW0gbG9ja3Mgd2hpY2ggcHJldmVudCB3cml0ZW91dCB0aGlzIG1pZ2h0IG5vdCB3b3JrLCBhbmQgdGhlCiAgKiBhbGxvY2F0aW9uIGF0dGVtcHQgd2lsbCBmYWlsLgogICovCi11bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX3BhZ2VzKHN0cnVjdCB6b25lICoqem9uZXMsIGludCBvcmRlciwgZ2ZwX3QgZ2ZwX21hc2spCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkb190cnlfdG9fZnJlZV9wYWdlcyhzdHJ1Y3Qgem9uZSAqKnpvbmVzLCBnZnBfdCBnZnBfbWFzaywKKwkJCQkJICBzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYykKIHsKIAlpbnQgcHJpb3JpdHk7CiAJaW50IHJldCA9IDA7CkBAIC0xMjE1LDM5ICsxMzIzLDQzIEBACiAJc3RydWN0IHJlY2xhaW1fc3RhdGUgKnJlY2xhaW1fc3RhdGUgPSBjdXJyZW50LT5yZWNsYWltX3N0YXRlOwogCXVuc2lnbmVkIGxvbmcgbHJ1X3BhZ2VzID0gMDsKIAlpbnQgaTsKLQlzdHJ1Y3Qgc2Nhbl9jb250cm9sIHNjID0gewotCQkuZ2ZwX21hc2sgPSBnZnBfbWFzaywKLQkJLm1heV93cml0ZXBhZ2UgPSAhbGFwdG9wX21vZGUsCi0JCS5zd2FwX2NsdXN0ZXJfbWF4ID0gU1dBUF9DTFVTVEVSX01BWCwKLQkJLm1heV9zd2FwID0gMSwKLQkJLnN3YXBwaW5lc3MgPSB2bV9zd2FwcGluZXNzLAotCQkub3JkZXIgPSBvcmRlciwKLQl9OwogCi0JY291bnRfdm1fZXZlbnQoQUxMT0NTVEFMTCk7CisJaWYgKHNjYW5fZ2xvYmFsX2xydShzYykpCisJCWNvdW50X3ZtX2V2ZW50KEFMTE9DU1RBTEwpOworCS8qCisJICogbWVtX2Nncm91cCB3aWxsIG5vdCBkbyBzaHJpbmtfc2xhYi4KKwkgKi8KKwlpZiAoc2Nhbl9nbG9iYWxfbHJ1KHNjKSkgeworCQlmb3IgKGkgPSAwOyB6b25lc1tpXSAhPSBOVUxMOyBpKyspIHsKKwkJCXN0cnVjdCB6b25lICp6b25lID0gem9uZXNbaV07CiAKLQlmb3IgKGkgPSAwOyB6b25lc1tpXSAhPSBOVUxMOyBpKyspIHsKLQkJc3RydWN0IHpvbmUgKnpvbmUgPSB6b25lc1tpXTsKKwkJCWlmICghY3B1c2V0X3pvbmVfYWxsb3dlZF9oYXJkd2FsbCh6b25lLCBHRlBfS0VSTkVMKSkKKwkJCQljb250aW51ZTsKIAotCQlpZiAoIWNwdXNldF96b25lX2FsbG93ZWRfaGFyZHdhbGwoem9uZSwgR0ZQX0tFUk5FTCkpCi0JCQljb250aW51ZTsKLQotCQlscnVfcGFnZXMgKz0gem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0FDVElWRSkKLQkJCQkrIHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9JTkFDVElWRSk7CisJCQlscnVfcGFnZXMgKz0gem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX0FDVElWRSkKKwkJCQkJKyB6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfSU5BQ1RJVkUpOworCQl9CiAJfQogCiAJZm9yIChwcmlvcml0eSA9IERFRl9QUklPUklUWTsgcHJpb3JpdHkgPj0gMDsgcHJpb3JpdHktLSkgewotCQlzYy5ucl9zY2FubmVkID0gMDsKKwkJc2MtPm5yX3NjYW5uZWQgPSAwOworCQlzYy0+bnJfaW9fcGFnZXMgPSAwOwogCQlpZiAoIXByaW9yaXR5KQogCQkJZGlzYWJsZV9zd2FwX3Rva2VuKCk7Ci0JCW5yX3JlY2xhaW1lZCArPSBzaHJpbmtfem9uZXMocHJpb3JpdHksIHpvbmVzLCAmc2MpOwotCQlzaHJpbmtfc2xhYihzYy5ucl9zY2FubmVkLCBnZnBfbWFzaywgbHJ1X3BhZ2VzKTsKLQkJaWYgKHJlY2xhaW1fc3RhdGUpIHsKLQkJCW5yX3JlY2xhaW1lZCArPSByZWNsYWltX3N0YXRlLT5yZWNsYWltZWRfc2xhYjsKLQkJCXJlY2xhaW1fc3RhdGUtPnJlY2xhaW1lZF9zbGFiID0gMDsKKwkJbnJfcmVjbGFpbWVkICs9IHNocmlua196b25lcyhwcmlvcml0eSwgem9uZXMsIHNjKTsKKwkJLyoKKwkJICogRG9uJ3Qgc2hyaW5rIHNsYWJzIHdoZW4gcmVjbGFpbWluZyBtZW1vcnkgZnJvbQorCQkgKiBvdmVyIGxpbWl0IGNncm91cHMKKwkJICovCisJCWlmIChzY2FuX2dsb2JhbF9scnUoc2MpKSB7CisJCQlzaHJpbmtfc2xhYihzYy0+bnJfc2Nhbm5lZCwgZ2ZwX21hc2ssIGxydV9wYWdlcyk7CisJCQlpZiAocmVjbGFpbV9zdGF0ZSkgeworCQkJCW5yX3JlY2xhaW1lZCArPSByZWNsYWltX3N0YXRlLT5yZWNsYWltZWRfc2xhYjsKKwkJCQlyZWNsYWltX3N0YXRlLT5yZWNsYWltZWRfc2xhYiA9IDA7CisJCQl9CiAJCX0KLQkJdG90YWxfc2Nhbm5lZCArPSBzYy5ucl9zY2FubmVkOwotCQlpZiAobnJfcmVjbGFpbWVkID49IHNjLnN3YXBfY2x1c3Rlcl9tYXgpIHsKKwkJdG90YWxfc2Nhbm5lZCArPSBzYy0+bnJfc2Nhbm5lZDsKKwkJaWYgKG5yX3JlY2xhaW1lZCA+PSBzYy0+c3dhcF9jbHVzdGVyX21heCkgewogCQkJcmV0ID0gMTsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC0xMjU5LDE4ICsxMzcxLDE5IEBACiAJCSAqIHRoYXQncyB1bmRlc2lyYWJsZSBpbiBsYXB0b3AgbW9kZSwgd2hlcmUgd2UgKndhbnQqIGx1bXB5CiAJCSAqIHdyaXRlb3V0LiAgU28gaW4gbGFwdG9wIG1vZGUsIHdyaXRlIG91dCB0aGUgd2hvbGUgd29ybGQuCiAJCSAqLwotCQlpZiAodG90YWxfc2Nhbm5lZCA+IHNjLnN3YXBfY2x1c3Rlcl9tYXggKwotCQkJCQlzYy5zd2FwX2NsdXN0ZXJfbWF4IC8gMikgeworCQlpZiAodG90YWxfc2Nhbm5lZCA+IHNjLT5zd2FwX2NsdXN0ZXJfbWF4ICsKKwkJCQkJc2MtPnN3YXBfY2x1c3Rlcl9tYXggLyAyKSB7CiAJCQl3YWtldXBfcGRmbHVzaChsYXB0b3BfbW9kZSA/IDAgOiB0b3RhbF9zY2FubmVkKTsKLQkJCXNjLm1heV93cml0ZXBhZ2UgPSAxOworCQkJc2MtPm1heV93cml0ZXBhZ2UgPSAxOwogCQl9CiAKIAkJLyogVGFrZSBhIG5hcCwgd2FpdCBmb3Igc29tZSB3cml0ZWJhY2sgdG8gY29tcGxldGUgKi8KLQkJaWYgKHNjLm5yX3NjYW5uZWQgJiYgcHJpb3JpdHkgPCBERUZfUFJJT1JJVFkgLSAyKQorCQlpZiAoc2MtPm5yX3NjYW5uZWQgJiYgcHJpb3JpdHkgPCBERUZfUFJJT1JJVFkgLSAyICYmCisJCQkJc2MtPm5yX2lvX3BhZ2VzID4gc2MtPnN3YXBfY2x1c3Rlcl9tYXgpCiAJCQljb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzEwKTsKIAl9CiAJLyogdG9wIHByaW9yaXR5IHNocmlua19jYWNoZXMgc3RpbGwgaGFkIG1vcmUgdG8gZG8/IGRvbid0IE9PTSwgdGhlbiAqLwotCWlmICghc2MuYWxsX3VucmVjbGFpbWFibGUpCisJaWYgKCFzYy0+YWxsX3VucmVjbGFpbWFibGUgJiYgc2Nhbl9nbG9iYWxfbHJ1KHNjKSkKIAkJcmV0ID0gMTsKIG91dDoKIAkvKgpAQCAtMTI4MiwxNyArMTM5NSw2MyBAQAogCSAqLwogCWlmIChwcmlvcml0eSA8IDApCiAJCXByaW9yaXR5ID0gMDsKLQlmb3IgKGkgPSAwOyB6b25lc1tpXSAhPSBOVUxMOyBpKyspIHsKLQkJc3RydWN0IHpvbmUgKnpvbmUgPSB6b25lc1tpXTsKIAotCQlpZiAoIWNwdXNldF96b25lX2FsbG93ZWRfaGFyZHdhbGwoem9uZSwgR0ZQX0tFUk5FTCkpCi0JCQljb250aW51ZTsKKwlpZiAoc2Nhbl9nbG9iYWxfbHJ1KHNjKSkgeworCQlmb3IgKGkgPSAwOyB6b25lc1tpXSAhPSBOVUxMOyBpKyspIHsKKwkJCXN0cnVjdCB6b25lICp6b25lID0gem9uZXNbaV07CiAKLQkJem9uZS0+cHJldl9wcmlvcml0eSA9IHByaW9yaXR5OwotCX0KKwkJCWlmICghY3B1c2V0X3pvbmVfYWxsb3dlZF9oYXJkd2FsbCh6b25lLCBHRlBfS0VSTkVMKSkKKwkJCQljb250aW51ZTsKKworCQkJem9uZS0+cHJldl9wcmlvcml0eSA9IHByaW9yaXR5OworCQl9CisJfSBlbHNlCisJCW1lbV9jZ3JvdXBfcmVjb3JkX3JlY2xhaW1fcHJpb3JpdHkoc2MtPm1lbV9jZ3JvdXAsIHByaW9yaXR5KTsKKwogCXJldHVybiByZXQ7CiB9CiAKK3Vuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfcGFnZXMoc3RydWN0IHpvbmUgKip6b25lcywgaW50IG9yZGVyLCBnZnBfdCBnZnBfbWFzaykKK3sKKwlzdHJ1Y3Qgc2Nhbl9jb250cm9sIHNjID0geworCQkuZ2ZwX21hc2sgPSBnZnBfbWFzaywKKwkJLm1heV93cml0ZXBhZ2UgPSAhbGFwdG9wX21vZGUsCisJCS5zd2FwX2NsdXN0ZXJfbWF4ID0gU1dBUF9DTFVTVEVSX01BWCwKKwkJLm1heV9zd2FwID0gMSwKKwkJLnN3YXBwaW5lc3MgPSB2bV9zd2FwcGluZXNzLAorCQkub3JkZXIgPSBvcmRlciwKKwkJLm1lbV9jZ3JvdXAgPSBOVUxMLAorCQkuaXNvbGF0ZV9wYWdlcyA9IGlzb2xhdGVfcGFnZXNfZ2xvYmFsLAorCX07CisKKwlyZXR1cm4gZG9fdHJ5X3RvX2ZyZWVfcGFnZXMoem9uZXMsIGdmcF9tYXNrLCAmc2MpOworfQorCisjaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fQ09OVAorCit1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbV9jb250LAorCQkJCQkJZ2ZwX3QgZ2ZwX21hc2spCit7CisJc3RydWN0IHNjYW5fY29udHJvbCBzYyA9IHsKKwkJLmdmcF9tYXNrID0gZ2ZwX21hc2ssCisJCS5tYXlfd3JpdGVwYWdlID0gIWxhcHRvcF9tb2RlLAorCQkubWF5X3N3YXAgPSAxLAorCQkuc3dhcF9jbHVzdGVyX21heCA9IFNXQVBfQ0xVU1RFUl9NQVgsCisJCS5zd2FwcGluZXNzID0gdm1fc3dhcHBpbmVzcywKKwkJLm9yZGVyID0gMCwKKwkJLm1lbV9jZ3JvdXAgPSBtZW1fY29udCwKKwkJLmlzb2xhdGVfcGFnZXMgPSBtZW1fY2dyb3VwX2lzb2xhdGVfcGFnZXMsCisJfTsKKwlzdHJ1Y3Qgem9uZSAqKnpvbmVzOworCWludCB0YXJnZXRfem9uZSA9IGdmcF96b25lKEdGUF9ISUdIVVNFUl9NT1ZBQkxFKTsKKworCXpvbmVzID0gTk9ERV9EQVRBKG51bWFfbm9kZV9pZCgpKS0+bm9kZV96b25lbGlzdHNbdGFyZ2V0X3pvbmVdLnpvbmVzOworCWlmIChkb190cnlfdG9fZnJlZV9wYWdlcyh6b25lcywgc2MuZ2ZwX21hc2ssICZzYykpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorI2VuZGlmCisKIC8qCiAgKiBGb3Iga3N3YXBkLCBiYWxhbmNlX3BnZGF0KCkgd2lsbCB3b3JrIGFjcm9zcyBhbGwgdGhpcyBub2RlJ3Mgem9uZXMgdW50aWwKICAqIHRoZXkgYXJlIGFsbCBhdCBwYWdlc19oaWdoLgpAQCAtMTMyOCw2ICsxNDg3LDggQEAKIAkJLnN3YXBfY2x1c3Rlcl9tYXggPSBTV0FQX0NMVVNURVJfTUFYLAogCQkuc3dhcHBpbmVzcyA9IHZtX3N3YXBwaW5lc3MsCiAJCS5vcmRlciA9IG9yZGVyLAorCQkubWVtX2Nncm91cCA9IE5VTEwsCisJCS5pc29sYXRlX3BhZ2VzID0gaXNvbGF0ZV9wYWdlc19nbG9iYWwsCiAJfTsKIAkvKgogCSAqIHRlbXBfcHJpb3JpdHkgaXMgdXNlZCB0byByZW1lbWJlciB0aGUgc2Nhbm5pbmcgcHJpb3JpdHkgYXQgd2hpY2gKQEAgLTEzNTIsNiArMTUxMyw3IEBACiAJCWlmICghcHJpb3JpdHkpCiAJCQlkaXNhYmxlX3N3YXBfdG9rZW4oKTsKIAorCQlzYy5ucl9pb19wYWdlcyA9IDA7CiAJCWFsbF96b25lc19vayA9IDE7CiAKIAkJLyoKQEAgLTE0NDQsNyArMTYwNiw4IEBACiAJCSAqIE9LLCBrc3dhcGQgaXMgZ2V0dGluZyBpbnRvIHRyb3VibGUuICBUYWtlIGEgbmFwLCB0aGVuIHRha2UKIAkJICogYW5vdGhlciBwYXNzIGFjcm9zcyB0aGUgem9uZXMuCiAJCSAqLwotCQlpZiAodG90YWxfc2Nhbm5lZCAmJiBwcmlvcml0eSA8IERFRl9QUklPUklUWSAtIDIpCisJCWlmICh0b3RhbF9zY2FubmVkICYmIHByaW9yaXR5IDwgREVGX1BSSU9SSVRZIC0gMiAmJgorCQkJCQlzYy5ucl9pb19wYWdlcyA+IHNjLnN3YXBfY2x1c3Rlcl9tYXgpCiAJCQljb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzEwKTsKIAogCQkvKgpAQCAtMTY0OSw2ICsxODEyLDcgQEAKIAkJLnN3YXBfY2x1c3Rlcl9tYXggPSBucl9wYWdlcywKIAkJLm1heV93cml0ZXBhZ2UgPSAxLAogCQkuc3dhcHBpbmVzcyA9IHZtX3N3YXBwaW5lc3MsCisJCS5pc29sYXRlX3BhZ2VzID0gaXNvbGF0ZV9wYWdlc19nbG9iYWwsCiAJfTsKIAogCWN1cnJlbnQtPnJlY2xhaW1fc3RhdGUgPSAmcmVjbGFpbV9zdGF0ZTsKQEAgLTE4MzQsNiArMTk5OCw3IEBACiAJCQkJCVNXQVBfQ0xVU1RFUl9NQVgpLAogCQkuZ2ZwX21hc2sgPSBnZnBfbWFzaywKIAkJLnN3YXBwaW5lc3MgPSB2bV9zd2FwcGluZXNzLAorCQkuaXNvbGF0ZV9wYWdlcyA9IGlzb2xhdGVfcGFnZXNfZ2xvYmFsLAogCX07CiAJdW5zaWduZWQgbG9uZyBzbGFiX3JlY2xhaW1hYmxlOwogCmRpZmYgLS1naXQgYS9uZXQvS2NvbmZpZyBiL25ldC9LY29uZmlnCmluZGV4IGI2YTVkNDUuLjY2MjdjNmEgMTAwNjQ0Ci0tLSBhL25ldC9LY29uZmlnCisrKyBiL25ldC9LY29uZmlnCkBAIC0zMCw3ICszMCw3IEBACiBjb25maWcgTkVUX05TCiAJYm9vbCAiTmV0d29yayBuYW1lc3BhY2Ugc3VwcG9ydCIKIAlkZWZhdWx0IG4KLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiAhU1lTRlMKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiAhU1lTRlMgJiYgTkFNRVNQQUNFUwogCWhlbHAKIAkgIEFsbG93IHVzZXIgc3BhY2UgdG8gY3JlYXRlIHdoYXQgYXBwZWFyIHRvIGJlIG11bHRpcGxlIGluc3RhbmNlcwogCSAgb2YgdGhlIG5ldHdvcmsgc3RhY2suCmRpZmYgLS1naXQgYS9uZXQvY2FuL2FmX2Nhbi5jIGIvbmV0L2Nhbi9hZl9jYW4uYwppbmRleCA1MTU4ZTg4Li4zNmI5ZjIyIDEwMDY0NAotLS0gYS9uZXQvY2FuL2FmX2Nhbi5jCisrKyBiL25ldC9jYW4vYWZfY2FuLmMKQEAgLTExOCw3ICsxMTgsNiBAQAogewogCXN0cnVjdCBzb2NrICpzazsKIAlzdHJ1Y3QgY2FuX3Byb3RvICpjcDsKLQljaGFyIG1vZHVsZV9uYW1lW3NpemVvZigiY2FuLXByb3RvLTAwMCIpXTsKIAlpbnQgZXJyID0gMDsKIAogCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CkBAIC0xMjksMjYgKzEyOCwyMSBAQAogCWlmIChuZXQgIT0gJmluaXRfbmV0KQogCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKIAorI2lmZGVmIENPTkZJR19LTU9ECiAJLyogdHJ5IHRvIGxvYWQgcHJvdG9jb2wgbW9kdWxlLCB3aGVuIENPTkZJR19LTU9EIGlzIGRlZmluZWQgKi8KIAlpZiAoIXByb3RvX3RhYltwcm90b2NvbF0pIHsKLQkJc3ByaW50Zihtb2R1bGVfbmFtZSwgImNhbi1wcm90by0lZCIsIHByb3RvY29sKTsKLQkJZXJyID0gcmVxdWVzdF9tb2R1bGUobW9kdWxlX25hbWUpOworCQllcnIgPSByZXF1ZXN0X21vZHVsZSgiY2FuLXByb3RvLSVkIiwgcHJvdG9jb2wpOwogCiAJCS8qCiAJCSAqIEluIGNhc2Ugb2YgZXJyb3Igd2Ugb25seSBwcmludCBhIG1lc3NhZ2UgYnV0IGRvbid0CiAJCSAqIHJldHVybiB0aGUgZXJyb3IgY29kZSBpbW1lZGlhdGVseS4gIEJlbG93IHdlIHdpbGwKIAkJICogcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQKIAkJICovCi0JCWlmIChlcnIgPT0gLUVOT1NZUykgewotCQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKLQkJCQlwcmludGsoS0VSTl9JTkZPICJjYW46IHJlcXVlc3RfbW9kdWxlKCVzKSIKLQkJCQkgICAgICAgIiBub3QgaW1wbGVtZW50ZWQuXG4iLCBtb2R1bGVfbmFtZSk7Ci0JCX0gZWxzZSBpZiAoZXJyKSB7Ci0JCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQotCQkJCXByaW50ayhLRVJOX0VSUiAiY2FuOiByZXF1ZXN0X21vZHVsZSglcykiCi0JCQkJICAgICAgICIgZmFpbGVkLlxuIiwgbW9kdWxlX25hbWUpOwotCQl9CisJCWlmIChlcnIgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fRVJSICJjYW46IHJlcXVlc3RfbW9kdWxlICIKKwkJCSAgICAgICAiKGNhbi1wcm90by0lZCkgZmFpbGVkLlxuIiwgcHJvdG9jb2wpOwogCX0KKyNlbmRpZgogCiAJc3Bpbl9sb2NrKCZwcm90b190YWJfbG9jayk7CiAJY3AgPSBwcm90b190YWJbcHJvdG9jb2xdOwpAQCAtNjYyLDI3ICs2NTYsMjcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJZXJyID0gcHJvdG9fcmVnaXN0ZXIoY3AtPnByb3QsIDApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCiAJc3Bpbl9sb2NrKCZwcm90b190YWJfbG9jayk7CiAJaWYgKHByb3RvX3RhYltwcm90b10pIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJjYW46IHByb3RvY29sICVkIGFscmVhZHkgcmVnaXN0ZXJlZFxuIiwKIAkJICAgICAgIHByb3RvKTsKIAkJZXJyID0gLUVCVVNZOwotCQlnb3RvIGVycm91dDsKKwl9IGVsc2UgeworCQlwcm90b190YWJbcHJvdG9dID0gY3A7CisKKwkJLyogdXNlIGdlbmVyaWMgaW9jdGwgZnVuY3Rpb24gaWYgbm90IGRlZmluZWQgYnkgbW9kdWxlICovCisJCWlmICghY3AtPm9wcy0+aW9jdGwpCisJCQljcC0+b3BzLT5pb2N0bCA9IGNhbl9pb2N0bDsKIAl9Ci0KLQllcnIgPSBwcm90b19yZWdpc3RlcihjcC0+cHJvdCwgMCk7Ci0JaWYgKGVyciA8IDApCi0JCWdvdG8gZXJyb3V0OwotCi0JcHJvdG9fdGFiW3Byb3RvXSA9IGNwOwotCi0JLyogdXNlIGdlbmVyaWMgaW9jdGwgZnVuY3Rpb24gaWYgdGhlIG1vZHVsZSBkb2Vzbid0IGJyaW5nIGl0cyBvd24gKi8KLQlpZiAoIWNwLT5vcHMtPmlvY3RsKQotCQljcC0+b3BzLT5pb2N0bCA9IGNhbl9pb2N0bDsKLQotIGVycm91dDoKIAlzcGluX3VubG9jaygmcHJvdG9fdGFiX2xvY2spOwogCisJaWYgKGVyciA8IDApCisJCXByb3RvX3VucmVnaXN0ZXIoY3AtPnByb3QpOworCiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0woY2FuX3Byb3RvX3JlZ2lzdGVyKTsKQEAgLTcwMCw5ICs2OTQsMTAgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJCVUc6IGNhbjogcHJvdG9jb2wgJWQgaXMgbm90IHJlZ2lzdGVyZWRcbiIsCiAJCSAgICAgICBwcm90byk7CiAJfQotCXByb3RvX3VucmVnaXN0ZXIoY3AtPnByb3QpOwogCXByb3RvX3RhYltwcm90b10gPSBOVUxMOwogCXNwaW5fdW5sb2NrKCZwcm90b190YWJfbG9jayk7CisKKwlwcm90b191bnJlZ2lzdGVyKGNwLT5wcm90KTsKIH0KIEVYUE9SVF9TWU1CT0woY2FuX3Byb3RvX3VucmVnaXN0ZXIpOwogCmRpZmYgLS1naXQgYS9uZXQvY2FuL3Jhdy5jIGIvbmV0L2Nhbi9yYXcuYwppbmRleCBhZWVmZDE0Li45NGNkN2YyIDEwMDY0NAotLS0gYS9uZXQvY2FuL3Jhdy5jCisrKyBiL25ldC9jYW4vcmF3LmMKQEAgLTk4LDcgKzk4LDYgQEAKIAlzdHJ1Y3Qgc29jayAqc2sgPSAoc3RydWN0IHNvY2sgKilkYXRhOwogCXN0cnVjdCByYXdfc29jayAqcm8gPSByYXdfc2soc2spOwogCXN0cnVjdCBzb2NrYWRkcl9jYW4gKmFkZHI7Ci0JaW50IGVycm9yOwogCiAJaWYgKCFyby0+cmVjdl9vd25fbXNncykgewogCQkvKiBjaGVjayB0aGUgcmVjZWl2ZWQgdHggc29jayByZWZlcmVuY2UgKi8KQEAgLTEyMSwxNCArMTIwLDEyIEBACiAJYWRkci0+Y2FuX2ZhbWlseSAgPSBBRl9DQU47CiAJYWRkci0+Y2FuX2lmaW5kZXggPSBza2ItPmRldi0+aWZpbmRleDsKIAotCWVycm9yID0gc29ja19xdWV1ZV9yY3Zfc2tiKHNrLCBza2IpOwotCWlmIChlcnJvciA8IDApCisJaWYgKHNvY2tfcXVldWVfcmN2X3NrYihzaywgc2tiKSA8IDApCiAJCWtmcmVlX3NrYihza2IpOwogfQogCiBzdGF0aWMgaW50IHJhd19lbmFibGVfZmlsdGVycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc29jayAqc2ssCi0JCQkgICAgICBzdHJ1Y3QgY2FuX2ZpbHRlciAqZmlsdGVyLAotCQkJICAgICAgaW50IGNvdW50KQorCQkJICAgICAgc3RydWN0IGNhbl9maWx0ZXIgKmZpbHRlciwgaW50IGNvdW50KQogewogCWludCBlcnIgPSAwOwogCWludCBpOwpAQCAtMTYzLDggKzE2MCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIHJhd19kaXNhYmxlX2ZpbHRlcnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNvY2sgKnNrLAotCQkJICAgICAgc3RydWN0IGNhbl9maWx0ZXIgKmZpbHRlciwKLQkJCSAgICAgIGludCBjb3VudCkKKwkJCSAgICAgIHN0cnVjdCBjYW5fZmlsdGVyICpmaWx0ZXIsIGludCBjb3VudCkKIHsKIAlpbnQgaTsKIApAQCAtMzUzLDcgKzM0OSw2IEBACiAJCS8qIGZpbHRlcnMgc2V0IGJ5IGRlZmF1bHQvc2V0c29ja29wdCAqLwogCQllcnIgPSByYXdfZW5hYmxlX2FsbGZpbHRlcnMoZGV2LCBzayk7CiAJCWRldl9wdXQoZGV2KTsKLQogCX0gZWxzZSB7CiAJCWlmaW5kZXggPSAwOwogCkBAIC00NjYsNyArNDYxLDYgQEAKIAkJCWlmIChlcnIpIHsKIAkJCQlpZiAoY291bnQgPiAxKQogCQkJCQlrZnJlZShmaWx0ZXIpOwotCiAJCQkJZ290byBvdXRfZmlsOwogCQkJfQogCkBAIC02NzMsMjUgKzY2NywyNSBAQAogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0JaW50IGVycm9yID0gMDsKKwlpbnQgZXJyID0gMDsKIAlpbnQgbm9ibG9jazsKIAogCW5vYmxvY2sgPSAgZmxhZ3MgJiBNU0dfRE9OVFdBSVQ7CiAJZmxhZ3MgICAmPSB+TVNHX0RPTlRXQUlUOwogCi0Jc2tiID0gc2tiX3JlY3ZfZGF0YWdyYW0oc2ssIGZsYWdzLCBub2Jsb2NrLCAmZXJyb3IpOworCXNrYiA9IHNrYl9yZWN2X2RhdGFncmFtKHNrLCBmbGFncywgbm9ibG9jaywgJmVycik7CiAJaWYgKCFza2IpCi0JCXJldHVybiBlcnJvcjsKKwkJcmV0dXJuIGVycjsKIAogCWlmIChzaXplIDwgc2tiLT5sZW4pCiAJCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19UUlVOQzsKIAllbHNlCiAJCXNpemUgPSBza2ItPmxlbjsKIAotCWVycm9yID0gbWVtY3B5X3RvaW92ZWMobXNnLT5tc2dfaW92LCBza2ItPmRhdGEsIHNpemUpOwotCWlmIChlcnJvciA8IDApIHsKKwllcnIgPSBtZW1jcHlfdG9pb3ZlYyhtc2ctPm1zZ19pb3YsIHNrYi0+ZGF0YSwgc2l6ZSk7CisJaWYgKGVyciA8IDApIHsKIAkJc2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7Ci0JCXJldHVybiBlcnJvcjsKKwkJcmV0dXJuIGVycjsKIAl9CiAKIAlzb2NrX3JlY3ZfdGltZXN0YW1wKG1zZywgc2ssIHNrYik7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9mbG93LmMgYi9uZXQvY29yZS9mbG93LmMKaW5kZXggNDZiMzhlMC4uYTc3NTMxYyAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZmxvdy5jCisrKyBiL25ldC9jb3JlL2Zsb3cuYwpAQCAtMzAsOCArMzAsOCBAQAogCXN0cnVjdCBmbG93X2NhY2hlX2VudHJ5CSpuZXh0OwogCXUxNgkJCWZhbWlseTsKIAl1OAkJCWRpcjsKLQlzdHJ1Y3QgZmxvd2kJCWtleTsKIAl1MzIJCQlnZW5pZDsKKwlzdHJ1Y3QgZmxvd2kJCWtleTsKIAl2b2lkCQkJKm9iamVjdDsKIAlhdG9taWNfdAkJKm9iamVjdF9yZWY7CiB9OwpAQCAtNTIsNyArNTIsNyBAQAogCWludCBoYXNoX3JuZF9yZWNhbGM7CiAJdTMyIGhhc2hfcm5kOwogCWludCBjb3VudDsKLX0gX19fX2NhY2hlbGluZV9hbGlnbmVkOworfTsKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgZmxvd19wZXJjcHVfaW5mbywgZmxvd19oYXNoX2luZm8pID0geyAwIH07CiAKICNkZWZpbmUgZmxvd19oYXNoX3JuZF9yZWNhbGMoY3B1KSBcCkBAIC0zNDYsNyArMzQ2LDcgQEAKIAogCWZsb3dfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImZsb3dfY2FjaGUiLAogCQkJCQlzaXplb2Yoc3RydWN0IGZsb3dfY2FjaGVfZW50cnkpLAotCQkJCQkwLCBTTEFCX0hXQ0FDSEVfQUxJR058U0xBQl9QQU5JQywKKwkJCQkJMCwgU0xBQl9QQU5JQywKIAkJCQkJTlVMTCk7CiAJZmxvd19oYXNoX3NoaWZ0ID0gMTA7CiAJZmxvd19sd20gPSAyICogZmxvd19oYXNoX3NpemU7CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX3JvdXRlLmMgYi9uZXQvZGVjbmV0L2RuX3JvdXRlLmMKaW5kZXggMzFiZTI5Yi4uOWRjMGFiYiAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl9yb3V0ZS5jCisrKyBiL25ldC9kZWNuZXQvZG5fcm91dGUuYwpAQCAtOTQsNyArOTQsNyBAQAogewogCXN0cnVjdCBkbl9yb3V0ZSAqY2hhaW47CiAJc3BpbmxvY2tfdCBsb2NrOwotfSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyg4KSkpOworfTsKIAogZXh0ZXJuIHN0cnVjdCBuZWlnaF90YWJsZSBkbl9uZWlnaF90YWJsZTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuYwppbmRleCBkZDA3MzYyLi4wZDVmYTNhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuYwpAQCAtNjAwLDEwICs2MDAsMTAgQEAKIAlzcGluX3VubG9ja19iaCgmbmZfbmF0X2xvY2spOwogfQogCi1zdGF0aWMgdm9pZCBuZl9uYXRfbW92ZV9zdG9yYWdlKHN0cnVjdCBuZl9jb25uICpjb25udHJhY2ssIHZvaWQgKm9sZCkKK3N0YXRpYyB2b2lkIG5mX25hdF9tb3ZlX3N0b3JhZ2Uodm9pZCAqbmV3LCB2b2lkICpvbGQpCiB7Ci0Jc3RydWN0IG5mX2Nvbm5fbmF0ICpuZXdfbmF0ID0gbmZfY3RfZXh0X2ZpbmQoY29ubnRyYWNrLCBORl9DVF9FWFRfTkFUKTsKLQlzdHJ1Y3QgbmZfY29ubl9uYXQgKm9sZF9uYXQgPSAoc3RydWN0IG5mX2Nvbm5fbmF0ICopb2xkOworCXN0cnVjdCBuZl9jb25uX25hdCAqbmV3X25hdCA9IG5ldzsKKwlzdHJ1Y3QgbmZfY29ubl9uYXQgKm9sZF9uYXQgPSBvbGQ7CiAJc3RydWN0IG5mX2Nvbm4gKmN0ID0gb2xkX25hdC0+Y3Q7CiAKIAlpZiAoIWN0IHx8ICEoY3QtPnN0YXR1cyAmIElQU19OQVRfRE9ORV9NQVNLKSkKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3JvdXRlLmMgYi9uZXQvaXB2NC9yb3V0ZS5jCmluZGV4IDg4NDJlY2I5Yi4uNTI1Nzg3YiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcm91dGUuYworKysgYi9uZXQvaXB2NC9yb3V0ZS5jCkBAIC0yMDQxLDcgKzIwNDEsNyBAQAogCWludCBpaWYgPSBkZXYtPmlmaW5kZXg7CiAJc3RydWN0IG5ldCAqbmV0OwogCi0JbmV0ID0gc2tiLT5kZXYtPm5kX25ldDsKKwluZXQgPSBkZXYtPm5kX25ldDsKIAl0b3MgJj0gSVBUT1NfUlRfTUFTSzsKIAloYXNoID0gcnRfaGFzaChkYWRkciwgc2FkZHIsIGlpZik7CiAKZGlmZiAtLWdpdCBhL25ldC9pdWN2L2FmX2l1Y3YuYyBiL25ldC9pdWN2L2FmX2l1Y3YuYwppbmRleCAyMjU1ZTNjLi5mZWUyMmNhIDEwMDY0NAotLS0gYS9uZXQvaXVjdi9hZl9pdWN2LmMKKysrIGIvbmV0L2l1Y3YvYWZfaXVjdi5jCkBAIC00ODIsNiArNDgyLDEwIEBACiAJLyogQ3JlYXRlIHBhdGguICovCiAJaXVjdi0+cGF0aCA9IGl1Y3ZfcGF0aF9hbGxvYyhJVUNWX1FVRVVFTEVOX0RFRkFVTFQsCiAJCQkJICAgICBJUFJNREFUQSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpdWN2LT5wYXRoKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZG9uZTsKKwl9CiAJZXJyID0gaXVjdl9wYXRoX2Nvbm5lY3QoaXVjdi0+cGF0aCwgJmFmX2l1Y3ZfaGFuZGxlciwKIAkJCQlzYS0+c2l1Y3ZfdXNlcl9pZCwgTlVMTCwgdXNlcl9kYXRhLCBzayk7CiAJaWYgKGVycikgewpAQCAtMTA5NCw2ICsxMDk4LDggQEAKIAogc2F2ZV9tZXNzYWdlOgogCXNhdmVfbXNnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNvY2tfbXNnX3EpLCBHRlBfQVRPTUlDIHwgR0ZQX0RNQSk7CisJaWYgKCFzYXZlX21zZykKKwkJcmV0dXJuOwogCXNhdmVfbXNnLT5wYXRoID0gcGF0aDsKIAlzYXZlX21zZy0+bXNnID0gKm1zZzsKIApAQCAtMTEwNiwyNCArMTExMiwzMSBAQAogCQkJCSBzdHJ1Y3QgaXVjdl9tZXNzYWdlICptc2cpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gcGF0aC0+cHJpdmF0ZTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqdGhpczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdGhpcyA9IE5VTEw7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCA9ICZpdWN2X3NrKHNrKS0+c2VuZF9za2JfcTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbGlzdF9za2IgPSBsaXN0LT5uZXh0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAobGlzdF9za2IpIHsKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eShsaXN0KSkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmbGlzdC0+bG9jaywgZmxhZ3MpOwogCi0JCWRvIHsKLQkJCXRoaXMgPSBsaXN0X3NrYjsKKwkJd2hpbGUgKGxpc3Rfc2tiICE9IChzdHJ1Y3Qgc2tfYnVmZiAqKWxpc3QpIHsKKwkJCWlmICghbWVtY21wKCZtc2ctPnRhZywgbGlzdF9za2ItPmNiLCA0KSkgeworCQkJCXRoaXMgPSBsaXN0X3NrYjsKKwkJCQlicmVhazsKKwkJCX0KIAkJCWxpc3Rfc2tiID0gbGlzdF9za2ItPm5leHQ7Ci0JCX0gd2hpbGUgKG1lbWNtcCgmbXNnLT50YWcsIHRoaXMtPmNiLCA0KSAmJiBsaXN0X3NrYik7CisJCX0KKwkJaWYgKHRoaXMpCisJCQlfX3NrYl91bmxpbmsodGhpcywgbGlzdCk7CiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdC0+bG9jaywgZmxhZ3MpOwogCi0JCXNrYl91bmxpbmsodGhpcywgJml1Y3Zfc2soc2spLT5zZW5kX3NrYl9xKTsKLQkJa2ZyZWVfc2tiKHRoaXMpOworCQlpZiAodGhpcykKKwkJCWtmcmVlX3NrYih0aGlzKTsKIAl9CisJaWYgKCF0aGlzKQorCQlwcmludGsoS0VSTl9FUlIgIkFGX0lVQ1YgbXNnIHRhZyAldSBub3QgZm91bmRcbiIsIG1zZy0+dGFnKTsKIAogCWlmIChzay0+c2tfc3RhdGUgPT0gSVVDVl9DTE9TSU5HKSB7CiAJCWlmIChza2JfcXVldWVfZW1wdHkoJml1Y3Zfc2soc2spLT5zZW5kX3NrYl9xKSkgewpkaWZmIC0tZ2l0IGEvbmV0L2l1Y3YvaXVjdi5jIGIvbmV0L2l1Y3YvaXVjdi5jCmluZGV4IGYxM2ZlODguLjI3NTNiMGMgMTAwNjQ0Ci0tLSBhL25ldC9pdWN2L2l1Y3YuYworKysgYi9uZXQvaXVjdi9pdWN2LmMKQEAgLTY5Myw5ICs2OTMsOSBAQAogCQlpdWN2X3NldG1hc2tfdXAoKTsKIAlJTklUX0xJU1RfSEVBRCgmaGFuZGxlci0+cGF0aHMpOwogCi0Jc3Bpbl9sb2NrX2lycSgmaXVjdl90YWJsZV9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJml1Y3ZfdGFibGVfbG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmaGFuZGxlci0+bGlzdCwgJml1Y3ZfaGFuZGxlcl9saXN0KTsKLQlzcGluX3VubG9ja19pcnEoJml1Y3ZfdGFibGVfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJml1Y3ZfdGFibGVfbG9jayk7CiAJcmMgPSAwOwogb3V0X211dGV4OgogCW11dGV4X3VubG9jaygmaXVjdl9yZWdpc3Rlcl9tdXRleCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jCmluZGV4IGNmNmJhNjYuLjhiOWJlMWUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5jCkBAIC0xMDksNyArMTA5LDggQEAKIAkJCXJjdV9yZWFkX2xvY2soKTsKIAkJCXQgPSByY3VfZGVyZWZlcmVuY2UobmZfY3RfZXh0X3R5cGVzW2ldKTsKIAkJCWlmICh0ICYmIHQtPm1vdmUpCi0JCQkJdC0+bW92ZShjdCwgY3QtPmV4dCArIGN0LT5leHQtPm9mZnNldFtpXSk7CisJCQkJdC0+bW92ZSgodm9pZCAqKW5ldyArIG5ldy0+b2Zmc2V0W2ldLAorCQkJCQkodm9pZCAqKWN0LT5leHQgKyBjdC0+ZXh0LT5vZmZzZXRbaV0pOwogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCX0KIAkJa2ZyZWUoY3QtPmV4dCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3RjcC5jCmluZGV4IDNlMGNjY2EuLjIwMmQ3ZmEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3RjcC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3RjcC5jCkBAIC0xMjUsNyArMTI1LDcgQEAKICAqIENMT1NFX1dBSVQ6CUFDSyBzZWVuIChhZnRlciBGSU4pCiAgKiBMQVNUX0FDSzoJRklOIHNlZW4gKGFmdGVyIEZJTikKICAqIFRJTUVfV0FJVDoJbGFzdCBBQ0sgc2VlbgotICogQ0xPU0U6CWNsb3NlZCBjb25uZWN0aW9uCisgKiBDTE9TRToJY2xvc2VkIGNvbm5lY3Rpb24gKFJTVCkKICAqCiAgKiBMSVNURU4gc3RhdGUgaXMgbm90IHVzZWQuCiAgKgpAQCAtODI0LDcgKzgyNCwyMSBAQAogCWNhc2UgVENQX0NPTk5UUkFDS19TWU5fU0VOVDoKIAkJaWYgKG9sZF9zdGF0ZSA8IFRDUF9DT05OVFJBQ0tfVElNRV9XQUlUKQogCQkJYnJlYWs7Ci0JCWlmICgoY3QtPnByb3RvLnRjcC5zZWVuWyFkaXJdLmZsYWdzICYgSVBfQ1RfVENQX0ZMQUdfQ0xPU0VfSU5JVCkKKwkJLyogUkZDIDExMjI6ICJXaGVuIGEgY29ubmVjdGlvbiBpcyBjbG9zZWQgYWN0aXZlbHksCisJCSAqIGl0IE1VU1QgbGluZ2VyIGluIFRJTUUtV0FJVCBzdGF0ZSBmb3IgYSB0aW1lIDJ4TVNMCisJCSAqIChNYXhpbXVtIFNlZ21lbnQgTGlmZXRpbWUpLiBIb3dldmVyLCBpdCBNQVkgYWNjZXB0CisJCSAqIGEgbmV3IFNZTiBmcm9tIHRoZSByZW1vdGUgVENQIHRvIHJlb3BlbiB0aGUgY29ubmVjdGlvbgorCQkgKiBkaXJlY3RseSBmcm9tIFRJTUUtV0FJVCBzdGF0ZSwgaWYuLi4iCisJCSAqIFdlIGlnbm9yZSB0aGUgY29uZGl0aW9ucyBiZWNhdXNlIHdlIGFyZSBpbiB0aGUKKwkJICogVElNRS1XQUlUIHN0YXRlIGFueXdheS4KKwkJICoKKwkJICogSGFuZGxlIGFib3J0ZWQgY29ubmVjdGlvbnM6IHdlIGFuZCB0aGUgc2VydmVyCisJCSAqIHRoaW5rIHRoZXJlIGlzIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24gYnV0IHRoZSBjbGllbnQKKwkJICogYWJvcnRzIGl0IGFuZCBzdGFydHMgYSBuZXcgb25lLgorCQkgKi8KKwkJaWYgKCgoY3QtPnByb3RvLnRjcC5zZWVuW2Rpcl0uZmxhZ3MKKwkJICAgICAgfCBjdC0+cHJvdG8udGNwLnNlZW5bIWRpcl0uZmxhZ3MpCisJCSAgICAgJiBJUF9DVF9UQ1BfRkxBR19DTE9TRV9JTklUKQogCQkgICAgfHwgKGN0LT5wcm90by50Y3AubGFzdF9kaXIgPT0gZGlyCiAJCSAgICAgICAgJiYgY3QtPnByb3RvLnRjcC5sYXN0X2luZGV4ID09IFRDUF9SU1RfU0VUKSkgewogCQkJLyogQXR0ZW1wdCB0byByZW9wZW4gYSBjbG9zZWQvYWJvcnRlZCBjb25uZWN0aW9uLgpAQCAtODM4LDE1ICs4NTIsMjIgQEAKIAljYXNlIFRDUF9DT05OVFJBQ0tfSUdOT1JFOgogCQkvKiBJZ25vcmVkIHBhY2tldHM6CiAJCSAqCisJCSAqIE91ciBjb25uZWN0aW9uIGVudHJ5IG1heSBiZSBvdXQgb2Ygc3luYywgc28gaWdub3JlCisJCSAqIHBhY2tldHMgd2hpY2ggbWF5IHNpZ25hbCB0aGUgcmVhbCBjb25uZWN0aW9uIGJldHdlZW4KKwkJICogdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlci4KKwkJICoKIAkJICogYSkgU1lOIGluIE9SSUdJTkFMCiAJCSAqIGIpIFNZTi9BQ0sgaW4gUkVQTFkKIAkJICogYykgQUNLIGluIHJlcGx5IGRpcmVjdGlvbiBhZnRlciBpbml0aWFsIFNZTiBpbiBvcmlnaW5hbC4KKwkJICoKKwkJICogSWYgdGhlIGlnbm9yZWQgcGFja2V0IGlzIGludmFsaWQsIHRoZSByZWNlaXZlciB3aWxsIHNlbmQKKwkJICogYSBSU1Qgd2UnbGwgY2F0Y2ggYmVsb3cuCiAJCSAqLwogCQlpZiAoaW5kZXggPT0gVENQX1NZTkFDS19TRVQKIAkJICAgICYmIGN0LT5wcm90by50Y3AubGFzdF9pbmRleCA9PSBUQ1BfU1lOX1NFVAogCQkgICAgJiYgY3QtPnByb3RvLnRjcC5sYXN0X2RpciAhPSBkaXIKIAkJICAgICYmIG50b2hsKHRoLT5hY2tfc2VxKSA9PSBjdC0+cHJvdG8udGNwLmxhc3RfZW5kKSB7Ci0JCQkvKiBUaGlzIFNZTi9BQ0sgYWNrbm93bGVkZ2VzIGEgU1lOIHRoYXQgd2UgZWFybGllcgorCQkJLyogYikgVGhpcyBTWU4vQUNLIGFja25vd2xlZGdlcyBhIFNZTiB0aGF0IHdlIGVhcmxpZXIKIAkJCSAqIGlnbm9yZWQgYXMgaW52YWxpZC4gVGhpcyBtZWFucyB0aGF0IHRoZSBjbGllbnQgYW5kCiAJCQkgKiB0aGUgc2VydmVyIGFyZSBib3RoIGluIHN5bmMsIHdoaWxlIHRoZSBmaXJld2FsbCBpcwogCQkJICogbm90LiBXZSBraWxsIHRoaXMgc2Vzc2lvbiBhbmQgYmxvY2sgdGhlIFNZTi9BQ0sgc28KQEAgLTg3MCw3ICs4OTEsNyBAQAogCQl3cml0ZV91bmxvY2tfYmgoJnRjcF9sb2NrKTsKIAkJaWYgKExPR19JTlZBTElEKElQUFJPVE9fVENQKSkKIAkJCW5mX2xvZ19wYWNrZXQocGYsIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCQkgICJuZl9jdF90Y3A6IGludmFsaWQgcGFja2VkIGlnbm9yZWQgIik7CisJCQkJICAibmZfY3RfdGNwOiBpbnZhbGlkIHBhY2tldCBpZ25vcmVkICIpOwogCQlyZXR1cm4gTkZfQUNDRVBUOwogCWNhc2UgVENQX0NPTk5UUkFDS19NQVg6CiAJCS8qIEludmFsaWQgcGFja2V0ICovCkBAIC05MjQsOCArOTQ1LDcgQEAKIAogCWN0LT5wcm90by50Y3Auc3RhdGUgPSBuZXdfc3RhdGU7CiAJaWYgKG9sZF9zdGF0ZSAhPSBuZXdfc3RhdGUKLQkgICAgJiYgKG5ld19zdGF0ZSA9PSBUQ1BfQ09OTlRSQUNLX0ZJTl9XQUlUCi0JCXx8IG5ld19zdGF0ZSA9PSBUQ1BfQ09OTlRSQUNLX0NMT1NFKSkKKwkgICAgJiYgbmV3X3N0YXRlID09IFRDUF9DT05OVFJBQ0tfQ0xPU0UpCiAJCWN0LT5wcm90by50Y3Auc2VlbltkaXJdLmZsYWdzIHw9IElQX0NUX1RDUF9GTEFHX0NMT1NFX0lOSVQ7CiAJdGltZW91dCA9IGN0LT5wcm90by50Y3AucmV0cmFucyA+PSBuZl9jdF90Y3BfbWF4X3JldHJhbnMKIAkJICAmJiB0Y3BfdGltZW91dHNbbmV3X3N0YXRlXSA+IG5mX2N0X3RjcF90aW1lb3V0X21heF9yZXRyYW5zCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2lwcmFuZ2UuYyBiL25ldC9uZXRmaWx0ZXIveHRfaXByYW5nZS5jCmluZGV4IDAxMDM1ZmMuLjRmOTg0ZGMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfaXByYW5nZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfaXByYW5nZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2lwcmFuZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfaXByYW5nZS5oPgogCiBzdGF0aWMgYm9vbApAQCAtMTQ4LDcgKzE0OSw3IEBACiAJewogCQkubmFtZSAgICAgID0gImlwcmFuZ2UiLAogCQkucmV2aXNpb24gID0gMSwKLQkJLmZhbWlseSAgICA9IEFGX0lORVQ2LAorCQkuZmFtaWx5ICAgID0gQUZfSU5FVCwKIAkJLm1hdGNoICAgICA9IGlwcmFuZ2VfbXQ0LAogCQkubWF0Y2hzaXplID0gc2l6ZW9mKHN0cnVjdCB4dF9pcHJhbmdlX210aW5mbyksCiAJCS5tZSAgICAgICAgPSBUSElTX01PRFVMRSwKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9hZl9yeHJwYy5jIGIvbmV0L3J4cnBjL2FmX3J4cnBjLmMKaW5kZXggNWU4MmYxYy4uMmQwYzI5YyAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL2FmX3J4cnBjLmMKKysrIGIvbmV0L3J4cnBjL2FmX3J4cnBjLmMKQEAgLTIzOSw3ICsyMzksNyBAQAogCS8qIGZpbmQgYSByZW1vdGUgdHJhbnNwb3J0IGVuZHBvaW50IGZyb20gdGhlIGxvY2FsIG9uZSAqLwogCXBlZXIgPSByeHJwY19nZXRfcGVlcihzcngsIGdmcCk7CiAJaWYgKElTX0VSUihwZWVyKSkKLQkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihwZWVyKSk7CisJCXJldHVybiBFUlJfQ0FTVChwZWVyKTsKIAogCS8qIGZpbmQgYSB0cmFuc3BvcnQgKi8KIAl0cmFucyA9IHJ4cnBjX2dldF90cmFuc3BvcnQocngtPmxvY2FsLCBwZWVyLCBnZnApOwpAQCAtMjgyLDcgKzI4Miw3IEBACiAJCXRyYW5zID0gcnhycGNfbmFtZV90b190cmFuc3BvcnQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSBzcngsCiAJCQkJCQlzaXplb2YoKnNyeCksIDAsIGdmcCk7CiAJCWlmIChJU19FUlIodHJhbnMpKSB7Ci0JCQljYWxsID0gRVJSX1BUUihQVFJfRVJSKHRyYW5zKSk7CisJCQljYWxsID0gRVJSX0NBU1QodHJhbnMpOwogCQkJdHJhbnMgPSBOVUxMOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTMwNiw3ICszMDYsNyBAQAogCiAJYnVuZGxlID0gcnhycGNfZ2V0X2J1bmRsZShyeCwgdHJhbnMsIGtleSwgc2VydmljZV9pZCwgZ2ZwKTsKIAlpZiAoSVNfRVJSKGJ1bmRsZSkpIHsKLQkJY2FsbCA9IEVSUl9QVFIoUFRSX0VSUihidW5kbGUpKTsKKwkJY2FsbCA9IEVSUl9DQVNUKGJ1bmRsZSk7CiAJCWdvdG8gb3V0OwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2VtX21ldGEuYyBiL25ldC9zY2hlZC9lbV9tZXRhLmMKaW5kZXggMmE3ZTY0OC4uZDQxN2VjOCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2VtX21ldGEuYworKysgYi9uZXQvc2NoZWQvZW1fbWV0YS5jCkBAIC03MzUsMTEgKzczNSwxMyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgbWV0YV9kZWxldGUoc3RydWN0IG1ldGFfbWF0Y2ggKm1ldGEpCiB7Ci0Jc3RydWN0IG1ldGFfdHlwZV9vcHMgKm9wcyA9IG1ldGFfdHlwZV9vcHMoJm1ldGEtPmx2YWx1ZSk7CisJaWYgKG1ldGEpIHsKKwkJc3RydWN0IG1ldGFfdHlwZV9vcHMgKm9wcyA9IG1ldGFfdHlwZV9vcHMoJm1ldGEtPmx2YWx1ZSk7CiAKLQlpZiAob3BzICYmIG9wcy0+ZGVzdHJveSkgewotCQlvcHMtPmRlc3Ryb3koJm1ldGEtPmx2YWx1ZSk7Ci0JCW9wcy0+ZGVzdHJveSgmbWV0YS0+cnZhbHVlKTsKKwkJaWYgKG9wcyAmJiBvcHMtPmRlc3Ryb3kpIHsKKwkJCW9wcy0+ZGVzdHJveSgmbWV0YS0+bHZhbHVlKTsKKwkJCW9wcy0+ZGVzdHJveSgmbWV0YS0+cnZhbHVlKTsKKwkJfQogCX0KIAogCWtmcmVlKG1ldGEpOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvYWRkci5oIGIvbmV0L3RpcGMvYWRkci5oCmluZGV4IGU0YmQ1MzMuLjNiYTY3ZTYgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2FkZHIuaAorKysgYi9uZXQvdGlwYy9hZGRyLmgKQEAgLTU3LDExICs1Nyw2IEBACiAJcmV0dXJuICEoKGFkZHIgXiB0aXBjX293bl9hZGRyKSA+PiAxMik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGluX293bl96b25lKHUzMiBhZGRyKQotewotCXJldHVybiAhKChhZGRyIF4gdGlwY19vd25fYWRkcikgPj4gMjQpOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBpc19zbGF2ZSh1MzIgYWRkcikKIHsKIAlyZXR1cm4gYWRkciAmIDB4ODAwOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvYmNhc3QuaCBiL25ldC90aXBjL2JjYXN0LmgKaW5kZXggZjkxMGVkMi4uYTI0MTZmYSAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvYmNhc3QuaAorKysgYi9uZXQvdGlwYy9iY2FzdC5oCkBAIC03NCwxOSArNzQsNiBAQAogCiAKIC8qKgotICogbm1hcF9nZXQgLSBkZXRlcm1pbmUgaWYgbm9kZSBleGlzdHMgaW4gYSBub2RlIG1hcAotICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IHRpcGNfbm1hcF9nZXQoc3RydWN0IG5vZGVfbWFwICpubV9wdHIsIHUzMiBub2RlKQotewotCWludCBuID0gdGlwY19ub2RlKG5vZGUpOwotCWludCB3ID0gbiAvIFdTSVpFOwotCWludCBiID0gbiAlIFdTSVpFOwotCi0JcmV0dXJuIG5tX3B0ci0+bWFwW3ddICYgKDEgPDwgYik7Ci19Ci0KLS8qKgogICogbm1hcF9hZGQgLSBhZGQgYSBub2RlIHRvIGEgbm9kZSBtYXAKICAqLwogCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9tc2cuaCBiL25ldC90aXBjL21zZy5oCmluZGV4IGNlMjY1OTguLmU5ZWY2ZGYgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL21zZy5oCisrKyBiL25ldC90aXBjL21zZy5oCkBAIC02NjMsMTEgKzY2Myw2IEBACiAJbXNnX3NldF93b3JkKG0sIG1zZ19oZHJfc3oobSkvNCwgYSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG1zZ19kYXRhb2N0ZXQoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgcG9zKQotewotCXJldHVybihtc2dfZGF0YShtKVtwb3MgKyA0XSAhPSAwKTsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfZGF0YW9jdGV0KHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIHBvcykKIHsKIAltc2dfZGF0YShtKVtwb3MgKyA0XSA9IDE7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9zb2NrZXQuYyBiL25ldC90aXBjL3NvY2tldC5jCmluZGV4IDI0ZGRmZDIuLjIyOTA5MDMgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL3NvY2tldC5jCisrKyBiL25ldC90aXBjL3NvY2tldC5jCkBAIC03MSw5ICs3MSw5IEBACiBzdGF0aWMgdTMyIGRpc3BhdGNoKHN0cnVjdCB0aXBjX3BvcnQgKnRwb3J0LCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmKTsKIHN0YXRpYyB2b2lkIHdha2V1cGRpc3BhdGNoKHN0cnVjdCB0aXBjX3BvcnQgKnRwb3J0KTsKIAotc3RhdGljIHN0cnVjdCBwcm90b19vcHMgcGFja2V0X29wczsKLXN0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIHN0cmVhbV9vcHM7Ci1zdGF0aWMgc3RydWN0IHByb3RvX29wcyBtc2dfb3BzOworc3RhdGljIGNvbnN0IHN0cnVjdCBwcm90b19vcHMgcGFja2V0X29wczsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHJvdG9fb3BzIHN0cmVhbV9vcHM7CitzdGF0aWMgY29uc3Qgc3RydWN0IHByb3RvX29wcyBtc2dfb3BzOwogCiBzdGF0aWMgc3RydWN0IHByb3RvIHRpcGNfcHJvdG87CiAKQEAgLTE2MTUsNyArMTYxNSw3IEBACiAgKiBQcm90b2NvbCBzd2l0Y2hlcyBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgVElQQyBzb2NrZXRzCiAgKi8KIAotc3RhdGljIHN0cnVjdCBwcm90b19vcHMgbXNnX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHJvdG9fb3BzIG1zZ19vcHMgPSB7CiAJLm93bmVyIAkJPSBUSElTX01PRFVMRSwKIAkuZmFtaWx5CQk9IEFGX1RJUEMsCiAJLnJlbGVhc2UJPSByZWxlYXNlLApAQCAtMTYzNiw3ICsxNjM2LDcgQEAKIAkuc2VuZHBhZ2UJPSBzb2NrX25vX3NlbmRwYWdlCiB9OwogCi1zdGF0aWMgc3RydWN0IHByb3RvX29wcyBwYWNrZXRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwcm90b19vcHMgcGFja2V0X29wcyA9IHsKIAkub3duZXIgCQk9IFRISVNfTU9EVUxFLAogCS5mYW1pbHkJCT0gQUZfVElQQywKIAkucmVsZWFzZQk9IHJlbGVhc2UsCkBAIC0xNjU3LDcgKzE2NTcsNyBAQAogCS5zZW5kcGFnZQk9IHNvY2tfbm9fc2VuZHBhZ2UKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIHN0cmVhbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHByb3RvX29wcyBzdHJlYW1fb3BzID0gewogCS5vd25lciAJCT0gVEhJU19NT0RVTEUsCiAJLmZhbWlseQkJPSBBRl9USVBDLAogCS5yZWxlYXNlCT0gcmVsZWFzZSwKQEAgLTE2NzgsNyArMTY3OCw3IEBACiAJLnNlbmRwYWdlCT0gc29ja19ub19zZW5kcGFnZQogfTsKIAotc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5IHRpcGNfZmFtaWx5X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSB0aXBjX2ZhbWlseV9vcHMgPSB7CiAJLm93bmVyIAkJPSBUSElTX01PRFVMRSwKIAkuZmFtaWx5CQk9IEFGX1RJUEMsCiAJLmNyZWF0ZQkJPSB0aXBjX2NyZWF0ZQpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9hbGdvLmMgYi9uZXQveGZybS94ZnJtX2FsZ28uYwppbmRleCA2Y2MxNTI1Li44YWE2NDQwIDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX2FsZ28uYworKysgYi9uZXQveGZybS94ZnJtX2FsZ28uYwpAQCAtMzk5LDYgKzM5OSwyMyBAQAogCQkuc2FkYl9hbGdfbWF4Yml0cyA9IDI1NgogCX0KIH0sCit7CisJLm5hbWUgPSAicmZjMzY4NihjdHIoYWVzKSkiLAorCisJLnVpbmZvID0geworCQkuZW5jciA9IHsKKwkJCS5ibG9ja2JpdHMgPSAxMjgsCisJCQkuZGVma2V5Yml0cyA9IDE2MCwgLyogMTI4LWJpdCBrZXkgKyAzMi1iaXQgbm9uY2UgKi8KKwkJfQorCX0sCisKKwkuZGVzYyA9IHsKKwkJLnNhZGJfYWxnX2lkID0gU0FEQl9YX0VBTEdfQUVTQ1RSLAorCQkuc2FkYl9hbGdfaXZsZW4JPSA4LAorCQkuc2FkYl9hbGdfbWluYml0cyA9IDEyOCwKKwkJLnNhZGJfYWxnX21heGJpdHMgPSAyNTYKKwl9Cit9LAogfTsKIAogc3RhdGljIHN0cnVjdCB4ZnJtX2FsZ29fZGVzYyBjYWxnX2xpc3RbXSA9IHsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY2hlY2twYXRjaC5wbCBiL3NjcmlwdHMvY2hlY2twYXRjaC5wbAppbmRleCA1NzlmNTBmLi4yMDg2YTg1IDEwMDc1NQotLS0gYS9zY3JpcHRzL2NoZWNrcGF0Y2gucGwKKysrIGIvc2NyaXB0cy9jaGVja3BhdGNoLnBsCkBAIC05LDcgKzksNyBAQAogbXkgJFAgPSAkMDsKICRQID1+IHNALiovQEBnOwogCi1teSAkViA9ICcwLjEyJzsKK215ICRWID0gJzAuMTQnOwogCiB1c2UgR2V0b3B0OjpMb25nIHF3KDpjb25maWcgbm9fYXV0b19hYmJyZXYpOwogCkBAIC0yNCwxMyArMjQsMTQgQEAKIG15ICRjaGVjayA9IDA7CiBteSAkc3VtbWFyeSA9IDE7CiBteSAkbWFpbGJhY2sgPSAwOworbXkgJHN1bW1hcnlfZmlsZSA9IDA7CiBteSAkcm9vdDsKK215ICVkZWJ1ZzsKIEdldE9wdGlvbnMoCiAJJ3F8cXVpZXQrJwk9PiBcJHF1aWV0LAogCSd0cmVlIScJCT0+IFwkdHJlZSwKIAknc2lnbm9mZiEnCT0+IFwkY2hrX3NpZ25vZmYsCiAJJ3BhdGNoIScJPT4gXCRjaGtfcGF0Y2gsCi0JJ3Rlc3QtdHlwZSEnCT0+IFwkdHN0X3R5cGUsCiAJJ2VtYWNzIScJPT4gXCRlbWFjcywKIAkndGVyc2UhJwk9PiBcJHRlcnNlLAogCSdmaWxlIScJCT0+IFwkZmlsZSwKQEAgLTM5LDYgKzQwLDEwIEBACiAJJ3Jvb3Q9cycJPT4gXCRyb290LAogCSdzdW1tYXJ5IScJPT4gXCRzdW1tYXJ5LAogCSdtYWlsYmFjayEnCT0+IFwkbWFpbGJhY2ssCisJJ3N1bW1hcnktZmlsZSEnCT0+IFwkc3VtbWFyeV9maWxlLAorCisJJ2RlYnVnPXMnCT0+IFwlZGVidWcsCisJJ3Rlc3QtdHlwZSEnCT0+IFwkdHN0X3R5cGUsCiApIG9yIGV4aXQ7CiAKIG15ICRleGl0ID0gMDsKQEAgLTQ2LDE2ICs1MSwyNCBAQAogaWYgKCQjQVJHViA8IDApIHsKIAlwcmludCAidXNhZ2U6ICRQIFtvcHRpb25zXSBwYXRjaGZpbGVcbiI7CiAJcHJpbnQgInZlcnNpb246ICRWXG4iOwotCXByaW50ICJvcHRpb25zOiAtcSAgICAgICAgICAgPT4gcXVpZXRcbiI7Ci0JcHJpbnQgIiAgICAgICAgIC0tbm8tdHJlZSAgICA9PiBydW4gd2l0aG91dCBhIGtlcm5lbCB0cmVlXG4iOwotCXByaW50ICIgICAgICAgICAtLXRlcnNlICAgICAgPT4gb25lIGxpbmUgcGVyIHJlcG9ydFxuIjsKLQlwcmludCAiICAgICAgICAgLS1lbWFjcyAgICAgID0+IGVtYWNzIGNvbXBpbGUgd2luZG93IGZvcm1hdFxuIjsKLQlwcmludCAiICAgICAgICAgLS1maWxlICAgICAgID0+IGNoZWNrIGEgc291cmNlIGZpbGVcbiI7Ci0JcHJpbnQgIiAgICAgICAgIC0tc3RyaWN0ICAgICA9PiBlbmFibGUgbW9yZSBzdWJqZWN0aXZlIHRlc3RzXG4iOwotCXByaW50ICIgICAgICAgICAtLXJvb3QgICAgICAgPT4gcGF0aCB0byB0aGUga2VybmVsIHRyZWUgcm9vdFxuIjsKKwlwcmludCAib3B0aW9uczogLXEgICAgICAgICAgICAgICA9PiBxdWlldFxuIjsKKwlwcmludCAiICAgICAgICAgLS1uby10cmVlICAgICAgICA9PiBydW4gd2l0aG91dCBhIGtlcm5lbCB0cmVlXG4iOworCXByaW50ICIgICAgICAgICAtLXRlcnNlICAgICAgICAgID0+IG9uZSBsaW5lIHBlciByZXBvcnRcbiI7CisJcHJpbnQgIiAgICAgICAgIC0tZW1hY3MgICAgICAgICAgPT4gZW1hY3MgY29tcGlsZSB3aW5kb3cgZm9ybWF0XG4iOworCXByaW50ICIgICAgICAgICAtLWZpbGUgICAgICAgICAgID0+IGNoZWNrIGEgc291cmNlIGZpbGVcbiI7CisJcHJpbnQgIiAgICAgICAgIC0tc3RyaWN0ICAgICAgICAgPT4gZW5hYmxlIG1vcmUgc3ViamVjdGl2ZSB0ZXN0c1xuIjsKKwlwcmludCAiICAgICAgICAgLS1yb290ICAgICAgICAgICA9PiBwYXRoIHRvIHRoZSBrZXJuZWwgdHJlZSByb290XG4iOworCXByaW50ICIgICAgICAgICAtLW5vLXN1bW1hcnkgICAgID0+IHN1cHByZXNzIHRoZSBwZXItZmlsZSBzdW1tYXJ5XG4iOworCXByaW50ICIgICAgICAgICAtLXN1bW1hcnktZmlsZSAgID0+IGluY2x1ZGUgdGhlIGZpbGVuYW1lIGluIHN1bW1hcnlcbiI7CiAJZXhpdCgxKTsKIH0KIAorbXkgJGRiZ192YWx1ZXMgPSAwOworbXkgJGRiZ19wb3NzaWJsZSA9IDA7Citmb3IgbXkgJGtleSAoa2V5cyAlZGVidWcpIHsKKwlldmFsICJcJHtkYmdfJGtleX0gPSAnJGRlYnVneyRrZXl9JzsiCit9CisKIGlmICgkdGVyc2UpIHsKIAkkZW1hY3MgPSAxOwogCSRxdWlldCsrOwpAQCAtMTEwLDcgKzEyMyw3IEBACiBvdXIgJE9wZXJhdG9ycwk9IHFyewogCQkJPD18Pj18PT18IT18CiAJCQk9PnwtPnw8PHw+Pnw8fD58IXx+fAotCQkJJiZ8XHxcfHwsfFxefFwrXCt8LS18JnxcfHxcK3wtfFwqfFwvCisJCQkmJnxcfFx8fCx8XF58XCtcK3wtLXwmfFx8fFwrfC18XCp8XC98JQogCQkgIH14OwogCiBvdXIgJE5vbnB0clR5cGU7CkBAIC0xNTIsNyArMTY1LDcgQEAKIAkkVHlwZQk9IHFyewogCQkJXGIkTm9ucHRyVHlwZVxiCiAJCQkoPzpccypcKitccypjb25zdHxccypcKit8KD86XHMqXFtccypcXSkrKT8KLQkJCSg/OlxzKyRTcGFyc2V8XHMrJEF0dHJpYnV0ZSkqCisJCQkoPzpccyskSW5saW5lfFxzKyRTcGFyc2V8XHMrJEF0dHJpYnV0ZSkqCiAJCSAgfXg7CiAJJERlY2xhcmUJPSBxcnsoPzokU3RvcmFnZVxzKyk/JFR5cGV9OwogfQpAQCAtMTgxLDYgKzE5NCw4IEBACiB9CiAKIG15IEByYXdsaW5lcyA9ICgpOworbXkgQGxpbmVzID0gKCk7CitteSAkdm5hbWU7CiBmb3IgbXkgJGZpbGVuYW1lIChAQVJHVikgewogCWlmICgkZmlsZSkgewogCQlvcGVuKEZJTEUsICJkaWZmIC11IC9kZXYvbnVsbCAkZmlsZW5hbWV8IikgfHwKQEAgLTE4OSwxNSArMjA0LDIxIEBACiAJCW9wZW4oRklMRSwgIjwkZmlsZW5hbWUiKSB8fAogCQkJZGllICIkUDogJGZpbGVuYW1lOiBvcGVuIGZhaWxlZCAtICQhXG4iOwogCX0KKwlpZiAoJGZpbGVuYW1lIGVxICctJykgeworCQkkdm5hbWUgPSAnWW91ciBwYXRjaCc7CisJfSBlbHNlIHsKKwkJJHZuYW1lID0gJGZpbGVuYW1lOworCX0KIAl3aGlsZSAoPEZJTEU+KSB7CiAJCWNob21wOwogCQlwdXNoKEByYXdsaW5lcywgJF8pOwogCX0KIAljbG9zZShGSUxFKTsKLQlpZiAoIXByb2Nlc3MoJGZpbGVuYW1lLCBAcmF3bGluZXMpKSB7CisJaWYgKCFwcm9jZXNzKCRmaWxlbmFtZSkpIHsKIAkJJGV4aXQgPSAxOwogCX0KIAlAcmF3bGluZXMgPSAoKTsKKwlAbGluZXMgPSAoKTsKIH0KIAogZXhpdCgkZXhpdCk7CkBAIC0yNzQsMjAgKzI5NSwzMCBAQAogCW15ICRsID0gJyc7CiAKIAlteSAkcXVvdGUgPSAnJzsKKwlteSAkcWxlbiA9IDA7CiAKIAlmb3JlYWNoIG15ICRjIChzcGxpdCgvLywgJGxpbmUpKSB7CisJCSMgVGhlIHNlY29uZCBiYWNrc2xhc2ggb2YgYSBwYWlyIGlzIG5vdCBhICJxdW90ZSIuCisJCWlmICgkbCBlcSAiXFwiICYmICRjIGVxICJcXCIpIHsKKwkJCSRjID0gJ1gnOworCQl9CiAJCWlmICgkbCBuZSAiXFwiICYmICgkYyBlcSAiJyIgfHwgJGMgZXEgJyInKSkgewogCQkJaWYgKCRxdW90ZSBlcSAnJykgewogCQkJCSRxdW90ZSA9ICRjOwogCQkJCSRyZXMgLj0gJGM7CiAJCQkJJGwgPSAkYzsKKwkJCQkkcWxlbiA9IDA7CiAJCQkJbmV4dDsKIAkJCX0gZWxzaWYgKCRxdW90ZSBlcSAkYykgewogCQkJCSRxdW90ZSA9ICcnOwogCQkJfQogCQl9CisJCWlmICgkcXVvdGUgZXEgIiciICYmICRxbGVuID4gMSkgeworCQkJJHF1b3RlID0gJyc7CisJCX0KIAkJaWYgKCRxdW90ZSAmJiAkYyBuZSAiXHQiKSB7CiAJCQkkcmVzIC49ICJYIjsKKwkJCSRxbGVuKys7CiAJCX0gZWxzZSB7CiAJCQkkcmVzIC49ICRjOwogCQl9CkBAIC0yOTUsNiArMzI2LDI4IEBACiAJCSRsID0gJGM7CiAJfQogCisJIyBDbGVhciBvdXQgdGhlIGNvbW1lbnRzLgorCXdoaWxlICgkcmVzID1+IG1AKC9cKi4qP1wqLylAZykgeworCQlzdWJzdHIoJHJlcywgJC1bMV0sICQrWzFdIC0gJC1bMV0pID0gJDsgeCAoJCtbMV0gLSAkLVsxXSk7CisJfQorCWlmICgkcmVzID1+IG1AKC9cKi4qKUApIHsKKwkJc3Vic3RyKCRyZXMsICQtWzFdLCAkK1sxXSAtICQtWzFdKSA9ICQ7IHggKCQrWzFdIC0gJC1bMV0pOworCX0KKwlpZiAoJHJlcyA9fiBtQF4uKC4qXCovKUApIHsKKwkJc3Vic3RyKCRyZXMsICQtWzFdLCAkK1sxXSAtICQtWzFdKSA9ICQ7IHggKCQrWzFdIC0gJC1bMV0pOworCX0KKworCSMgVGhlIHBhdGhuYW1lIG9uIGEgI2luY2x1ZGUgbWF5IGJlIHN1cnJvdW5kZWQgYnkgJzwnIGFuZCAnPicuCisJaWYgKCRyZXMgPX4gL14uI1xzKmluY2x1ZGVccytcPCguKilcPi8pIHsKKwkJbXkgJGNsZWFuID0gJ1gnIHggbGVuZ3RoKCQxKTsKKwkJJHJlcyA9fiBzQFw8LipcPkA8JGNsZWFuPkA7CisKKwkjIFRoZSB3aG9sZSBvZiBhICNlcnJvciBpcyBhIHN0cmluZy4KKwl9IGVsc2lmICgkcmVzID1+IC9eLiNccyooPzplcnJvcnx3YXJuaW5nKVxzKyguKilcYi8pIHsKKwkJbXkgJGNsZWFuID0gJ1gnIHggbGVuZ3RoKCQxKTsKKwkJJHJlcyA9fiBzQCgjXHMqKD86ZXJyb3J8d2FybmluZylccyspLipAJDEkY2xlYW5AOworCX0KKwogCXJldHVybiAkcmVzOwogfQogCkBAIC0zMDUsMzAgKzM1OCwzNiBAQAogCW15ICRzb2ZmID0gJG9mZjsKIAlteSAkY29mZiA9ICRvZmYgLSAxOwogCisJbXkgJGxvZmYgPSAwOworCiAJbXkgJHR5cGUgPSAnJzsKIAlteSAkbGV2ZWwgPSAwOwogCW15ICRjOwogCW15ICRsZW4gPSAwOworCisJbXkgJHJlbWFpbmRlcjsKIAl3aGlsZSAoMSkgewogCQkjd2FybiAiQ1NCOiBibGs8JGJsaz5cbiI7CiAJCSMgSWYgd2UgYXJlIGFib3V0IHRvIGRyb3Agb2ZmIHRoZSBlbmQsIHB1bGwgaW4gbW9yZQogCQkjIGNvbnRleHQuCiAJCWlmICgkb2ZmID49ICRsZW4pIHsKIAkJCWZvciAoOyAkcmVtYWluID4gMDsgJGxpbmUrKykgewotCQkJCW5leHQgaWYgKCRyYXdsaW5lc1skbGluZV0gPX4gL14tLyk7CisJCQkJbmV4dCBpZiAoJGxpbmVzWyRsaW5lXSA9fiAvXi0vKTsKIAkJCQkkcmVtYWluLS07Ci0JCQkJJGJsayAuPSBzYW5pdGlzZV9saW5lKCRyYXdsaW5lc1skbGluZV0pIC4gIlxuIjsKKwkJCQkkbG9mZiA9ICRsZW47CisJCQkJJGJsayAuPSAkbGluZXNbJGxpbmVdIC4gIlxuIjsKIAkJCQkkbGVuID0gbGVuZ3RoKCRibGspOwogCQkJCSRsaW5lKys7CiAJCQkJbGFzdDsKIAkJCX0KIAkJCSMgQmFpbCBpZiB0aGVyZSBpcyBubyBmdXJ0aGVyIGNvbnRleHQuCiAJCQkjd2FybiAiQ1NCOiBibGs8JGJsaz4gb2ZmPCRvZmY+IGxlbjwkbGVuPlxuIjsKLQkJCWlmICgkb2ZmID09ICRsZW4pIHsKKwkJCWlmICgkb2ZmID49ICRsZW4pIHsKIAkJCQlsYXN0OwogCQkJfQogCQl9CiAJCSRjID0gc3Vic3RyKCRibGssICRvZmYsIDEpOworCQkkcmVtYWluZGVyID0gc3Vic3RyKCRibGssICRvZmYpOwogCiAJCSN3YXJuICJDU0I6IGM8JGM+IHR5cGU8JHR5cGU+IGxldmVsPCRsZXZlbD5cbiI7CiAJCSMgU3RhdGVtZW50IGVuZHMgYXQgdGhlICc7JyBvciBhIGNsb3NlICd9JyBhdCB0aGUKQEAgLTMzNyw2ICszOTYsMTIgQEAKIAkJCWxhc3Q7CiAJCX0KIAorCQkjIEFuIGVsc2UgaXMgcmVhbGx5IGEgY29uZGl0aW9uYWwgYXMgbG9uZyBhcyBpdHMgbm90IGVsc2UgaWYKKwkJaWYgKCRsZXZlbCA9PSAwICYmICRyZW1haW5kZXIgPX4gLyhccytlbHNlKSg/OlxzfHspLyAmJgorCQkJCQkkcmVtYWluZGVyICF+IC9ccytlbHNlXHMraWZcYi8pIHsKKwkJCSRjb2ZmID0gJG9mZiArIGxlbmd0aCgkMSk7CisJCX0KKwogCQlpZiAoKCR0eXBlIGVxICcnIHx8ICR0eXBlIGVxICcoJykgJiYgJGMgZXEgJygnKSB7CiAJCQkkbGV2ZWwrKzsKIAkJCSR0eXBlID0gJygnOwpAQCAtMzYzLDYgKzQyOCwxMCBAQAogCQl9CiAJCSRvZmYrKzsKIAl9CisJaWYgKCRvZmYgPT0gJGxlbikgeworCQkkbGluZSsrOworCQkkcmVtYWluLS07CisJfQogCiAJbXkgJHN0YXRlbWVudCA9IHN1YnN0cigkYmxrLCAkc29mZiwgJG9mZiAtICRzb2ZmICsgMSk7CiAJbXkgJGNvbmRpdGlvbiA9IHN1YnN0cigkYmxrLCAkc29mZiwgJGNvZmYgLSAkc29mZiArIDEpOwpAQCAtMzcwLDcgKzQzOSwzMCBAQAogCSN3YXJuICJTVEFURU1FTlQ8JHN0YXRlbWVudD5cbiI7CiAJI3dhcm4gIkNPTkRJVElPTjwkY29uZGl0aW9uPlxuIjsKIAotCXJldHVybiAoJHN0YXRlbWVudCwgJGNvbmRpdGlvbik7CisJI3ByaW50ICJvZmY8JG9mZj4gbG9mZjwkbG9mZj5cbiI7CisKKwlyZXR1cm4gKCRzdGF0ZW1lbnQsICRjb25kaXRpb24sCisJCQkkbGluZSwgJHJlbWFpbiArIDEsICRvZmYgLSAkbG9mZiArIDEsICRsZXZlbCk7Cit9CisKK3N1YiBjdHhfc3RhdGVtZW50X2Z1bGwgeworCW15ICgkbGluZW5yLCAkcmVtYWluLCAkb2ZmKSA9IEBfOworCW15ICgkc3RhdGVtZW50LCAkY29uZGl0aW9uLCAkbGV2ZWwpOworCisJbXkgKEBjaHVua3MpOworCisJKCRzdGF0ZW1lbnQsICRjb25kaXRpb24sICRsaW5lbnIsICRyZW1haW4sICRvZmYsICRsZXZlbCkgPQorCQkJCWN0eF9zdGF0ZW1lbnRfYmxvY2soJGxpbmVuciwgJHJlbWFpbiwgJG9mZik7CisJI3ByaW50ICJGOiBjPCRjb25kaXRpb24+IHM8JHN0YXRlbWVudD5cbiI7CisJZm9yICg7OykgeworCQlwdXNoKEBjaHVua3MsIFsgJGNvbmRpdGlvbiwgJHN0YXRlbWVudCBdKTsKKwkJbGFzdCBpZiAoISgkcmVtYWluID4gMCAmJiAkY29uZGl0aW9uID1+IC9eLlxzKig/OmlmfGVsc2V8ZG8pLykpOworCQkoJHN0YXRlbWVudCwgJGNvbmRpdGlvbiwgJGxpbmVuciwgJHJlbWFpbiwgJG9mZiwgJGxldmVsKSA9CisJCQkJY3R4X3N0YXRlbWVudF9ibG9jaygkbGluZW5yLCAkcmVtYWluLCAkb2ZmKTsKKwkJI3ByaW50ICJDOiBjPCRjb25kaXRpb24+IHM8JHN0YXRlbWVudD5cbiI7CisJfQorCisJcmV0dXJuICgkbGV2ZWwsICRsaW5lbnIsIEBjaHVua3MpOwogfQogCiBzdWIgY3R4X2Jsb2NrX2dldCB7CkBAIC01MDAsMTAzICs1OTIsMTEwIEBACiAJcmV0dXJuICRyZXM7CiB9CiAKK215ICRhdl9wcmVwcm9jZXNzb3IgPSAwOworbXkgJGF2X3BhcmVuID0gMDsKK215IEBhdl9wYXJlbl90eXBlOworCitzdWIgYW5ub3RhdGVfcmVzZXQgeworCSRhdl9wcmVwcm9jZXNzb3IgPSAwOworCSRhdl9wYXJlbiA9IDA7CisJQGF2X3BhcmVuX3R5cGUgPSAoKTsKK30KKwogc3ViIGFubm90YXRlX3ZhbHVlcyB7CiAJbXkgKCRzdHJlYW0sICR0eXBlKSA9IEBfOwogCiAJbXkgJHJlczsKIAlteSAkY3VyID0gJHN0cmVhbTsKIAotCW15ICRkZWJ1ZyA9IDA7Ci0KLQlwcmludCAiJHN0cmVhbVxuIiBpZiAoJGRlYnVnKTsKLQotCSMjbXkgJHR5cGUgPSAnTic7Ci0JbXkgJHBvcyA9IDA7Ci0JbXkgJHByZXByb2Nlc3NvciA9IDA7Ci0JbXkgJHBhcmVuID0gMDsKLQlteSBAcGFyZW5fdHlwZTsKKwlwcmludCAiJHN0cmVhbVxuIiBpZiAoJGRiZ192YWx1ZXMgPiAxKTsKIAogCXdoaWxlIChsZW5ndGgoJGN1cikpIHsKLQkJcHJpbnQgIiA8JHR5cGU+ICIgaWYgKCRkZWJ1Zyk7CisJCXByaW50ICIgPCR0eXBlPiAiIGlmICgkZGJnX3ZhbHVlcyA+IDEpOwogCQlpZiAoJGN1ciA9fiAvXihccyspL28pIHsKLQkJCXByaW50ICJXUygkMSlcbiIgaWYgKCRkZWJ1Zyk7Ci0JCQlpZiAoJDEgPX4gL1xuLyAmJiAkcHJlcHJvY2Vzc29yKSB7Ci0JCQkJJHByZXByb2Nlc3NvciA9IDA7CisJCQlwcmludCAiV1MoJDEpXG4iIGlmICgkZGJnX3ZhbHVlcyA+IDEpOworCQkJaWYgKCQxID1+IC9cbi8gJiYgJGF2X3ByZXByb2Nlc3NvcikgeworCQkJCSRhdl9wcmVwcm9jZXNzb3IgPSAwOwogCQkJCSR0eXBlID0gJ04nOwogCQkJfQogCiAJCX0gZWxzaWYgKCRjdXIgPX4gL14oJFR5cGUpLykgewotCQkJcHJpbnQgIkRFQ0xBUkUoJDEpXG4iIGlmICgkZGVidWcpOworCQkJcHJpbnQgIkRFQ0xBUkUoJDEpXG4iIGlmICgkZGJnX3ZhbHVlcyA+IDEpOwogCQkJJHR5cGUgPSAnVCc7CiAKIAkJfSBlbHNpZiAoJGN1ciA9fiAvXigjXHMqZGVmaW5lXHMqJElkZW50KShcKD8pL28pIHsKLQkJCXByaW50ICJERUZJTkUoJDEpXG4iIGlmICgkZGVidWcpOwotCQkJJHByZXByb2Nlc3NvciA9IDE7Ci0JCQkkcGFyZW5fdHlwZVskcGFyZW5dID0gJ04nOworCQkJcHJpbnQgIkRFRklORSgkMSlcbiIgaWYgKCRkYmdfdmFsdWVzID4gMSk7CisJCQkkYXZfcHJlcHJvY2Vzc29yID0gMTsKKwkJCSRhdl9wYXJlbl90eXBlWyRhdl9wYXJlbl0gPSAnTic7CiAKLQkJfSBlbHNpZiAoJGN1ciA9fiAvXigjXHMqKD86aWZkZWZ8aWZuZGVmfGlmfGVsc2V8ZW5kaWYpKS9vKSB7Ci0JCQlwcmludCAiUFJFKCQxKVxuIiBpZiAoJGRlYnVnKTsKLQkJCSRwcmVwcm9jZXNzb3IgPSAxOworCQl9IGVsc2lmICgkY3VyID1+IC9eKCNccyooPzppZmRlZnxpZm5kZWZ8aWZ8ZWxzZXxlbGlmfGVuZGlmKSkvbykgeworCQkJcHJpbnQgIlBSRSgkMSlcbiIgaWYgKCRkYmdfdmFsdWVzID4gMSk7CisJCQkkYXZfcHJlcHJvY2Vzc29yID0gMTsKIAkJCSR0eXBlID0gJ04nOwogCiAJCX0gZWxzaWYgKCRjdXIgPX4gL14oXFxcbikvbykgewotCQkJcHJpbnQgIlBSRUNPTlQoJDEpXG4iIGlmICgkZGVidWcpOworCQkJcHJpbnQgIlBSRUNPTlQoJDEpXG4iIGlmICgkZGJnX3ZhbHVlcyA+IDEpOwogCiAJCX0gZWxzaWYgKCRjdXIgPX4gL14oc2l6ZW9mKVxzKihcKCk/L28pIHsKLQkJCXByaW50ICJTSVpFT0YoJDEpXG4iIGlmICgkZGVidWcpOworCQkJcHJpbnQgIlNJWkVPRigkMSlcbiIgaWYgKCRkYmdfdmFsdWVzID4gMSk7CiAJCQlpZiAoZGVmaW5lZCAkMikgewotCQkJCSRwYXJlbl90eXBlWyRwYXJlbl0gPSAnVic7CisJCQkJJGF2X3BhcmVuX3R5cGVbJGF2X3BhcmVuXSA9ICdWJzsKIAkJCX0KIAkJCSR0eXBlID0gJ04nOwogCi0JCX0gZWxzaWYgKCRjdXIgPX4gL14oaWZ8d2hpbGV8dHlwZW9mfGZvcilcYi9vKSB7Ci0JCQlwcmludCAiQ09ORCgkMSlcbiIgaWYgKCRkZWJ1Zyk7Ci0JCQkkcGFyZW5fdHlwZVskcGFyZW5dID0gJ04nOworCQl9IGVsc2lmICgkY3VyID1+IC9eKGlmfHdoaWxlfHR5cGVvZnxfX3R5cGVvZl9ffGZvcilcYi9vKSB7CisJCQlwcmludCAiQ09ORCgkMSlcbiIgaWYgKCRkYmdfdmFsdWVzID4gMSk7CisJCQkkYXZfcGFyZW5fdHlwZVskYXZfcGFyZW5dID0gJ04nOwogCQkJJHR5cGUgPSAnTic7CiAKIAkJfSBlbHNpZiAoJGN1ciA9fi9eKHJldHVybnxjYXNlfGVsc2UpL28pIHsKLQkJCXByaW50ICJLRVlXT1JEKCQxKVxuIiBpZiAoJGRlYnVnKTsKKwkJCXByaW50ICJLRVlXT1JEKCQxKVxuIiBpZiAoJGRiZ192YWx1ZXMgPiAxKTsKIAkJCSR0eXBlID0gJ04nOwogCiAJCX0gZWxzaWYgKCRjdXIgPX4gL14oXCgpL28pIHsKLQkJCXByaW50ICJQQVJFTignJDEnKVxuIiBpZiAoJGRlYnVnKTsKLQkJCSRwYXJlbisrOworCQkJcHJpbnQgIlBBUkVOKCckMScpXG4iIGlmICgkZGJnX3ZhbHVlcyA+IDEpOworCQkJJGF2X3BhcmVuKys7CiAJCQkkdHlwZSA9ICdOJzsKIAogCQl9IGVsc2lmICgkY3VyID1+IC9eKFwpKS9vKSB7Ci0JCQkkcGFyZW4tLSBpZiAoJHBhcmVuID4gMCk7Ci0JCQlpZiAoZGVmaW5lZCAkcGFyZW5fdHlwZVskcGFyZW5dKSB7Ci0JCQkJJHR5cGUgPSAkcGFyZW5fdHlwZVskcGFyZW5dOwotCQkJCXVuZGVmICRwYXJlbl90eXBlWyRwYXJlbl07Ci0JCQkJcHJpbnQgIlBBUkVOKCckMScpIC0+ICR0eXBlXG4iIGlmICgkZGVidWcpOworCQkJJGF2X3BhcmVuLS0gaWYgKCRhdl9wYXJlbiA+IDApOworCQkJaWYgKGRlZmluZWQgJGF2X3BhcmVuX3R5cGVbJGF2X3BhcmVuXSkgeworCQkJCSR0eXBlID0gJGF2X3BhcmVuX3R5cGVbJGF2X3BhcmVuXTsKKwkJCQl1bmRlZiAkYXZfcGFyZW5fdHlwZVskYXZfcGFyZW5dOworCQkJCXByaW50ICJQQVJFTignJDEnKSAtPiAkdHlwZVxuIgorCQkJCQkJCWlmICgkZGJnX3ZhbHVlcyA+IDEpOwogCQkJfSBlbHNlIHsKLQkJCQlwcmludCAiUEFSRU4oJyQxJylcbiIgaWYgKCRkZWJ1Zyk7CisJCQkJcHJpbnQgIlBBUkVOKCckMScpXG4iIGlmICgkZGJnX3ZhbHVlcyA+IDEpOwogCQkJfQogCiAJCX0gZWxzaWYgKCRjdXIgPX4gL14oJElkZW50KVwoL28pIHsKLQkJCXByaW50ICJGVU5DKCQxKVxuIiBpZiAoJGRlYnVnKTsKLQkJCSRwYXJlbl90eXBlWyRwYXJlbl0gPSAnVic7CisJCQlwcmludCAiRlVOQygkMSlcbiIgaWYgKCRkYmdfdmFsdWVzID4gMSk7CisJCQkkYXZfcGFyZW5fdHlwZVskYXZfcGFyZW5dID0gJ1YnOwogCiAJCX0gZWxzaWYgKCRjdXIgPX4gL14oJElkZW50fCRDb25zdGFudCkvbykgewotCQkJcHJpbnQgIklERU5UKCQxKVxuIiBpZiAoJGRlYnVnKTsKKwkJCXByaW50ICJJREVOVCgkMSlcbiIgaWYgKCRkYmdfdmFsdWVzID4gMSk7CiAJCQkkdHlwZSA9ICdWJzsKIAogCQl9IGVsc2lmICgkY3VyID1+IC9eKCRBc3NpZ25tZW50KS9vKSB7Ci0JCQlwcmludCAiQVNTSUdOKCQxKVxuIiBpZiAoJGRlYnVnKTsKKwkJCXByaW50ICJBU1NJR04oJDEpXG4iIGlmICgkZGJnX3ZhbHVlcyA+IDEpOwogCQkJJHR5cGUgPSAnTic7CiAKKwkJfSBlbHNpZiAoJGN1ciA9fi9eKDspLykgeworCQkJcHJpbnQgIkVORCgkMSlcbiIgaWYgKCRkYmdfdmFsdWVzID4gMSk7CisJCQkkdHlwZSA9ICdFJzsKKwogCQl9IGVsc2lmICgkY3VyID1+IC9eKDt8e3x9fFw/fDp8XFspL28pIHsKLQkJCXByaW50ICJFTkQoJDEpXG4iIGlmICgkZGVidWcpOworCQkJcHJpbnQgIkNMT1NFKCQxKVxuIiBpZiAoJGRiZ192YWx1ZXMgPiAxKTsKIAkJCSR0eXBlID0gJ04nOwogCiAJCX0gZWxzaWYgKCRjdXIgPX4gL14oJE9wZXJhdG9ycykvbykgewotCQkJcHJpbnQgIk9QKCQxKVxuIiBpZiAoJGRlYnVnKTsKKwkJCXByaW50ICJPUCgkMSlcbiIgaWYgKCRkYmdfdmFsdWVzID4gMSk7CiAJCQlpZiAoJDEgbmUgJysrJyAmJiAkMSBuZSAnLS0nKSB7CiAJCQkJJHR5cGUgPSAnTic7CiAJCQl9CiAKIAkJfSBlbHNpZiAoJGN1ciA9fiAvKF4uKS9vKSB7Ci0JCQlwcmludCAiQygkMSlcbiIgaWYgKCRkZWJ1Zyk7CisJCQlwcmludCAiQygkMSlcbiIgaWYgKCRkYmdfdmFsdWVzID4gMSk7CiAJCX0KIAkJaWYgKGRlZmluZWQgJDEpIHsKIAkJCSRjdXIgPSBzdWJzdHIoJGN1ciwgbGVuZ3RoKCQxKSk7CkBAIC02MDgsNyArNzA3LDcgQEAKIH0KIAogc3ViIHBvc3NpYmxlIHsKLQlteSAoJHBvc3NpYmxlKSA9IEBfOworCW15ICgkcG9zc2libGUsICRsaW5lKSA9IEBfOwogCiAJI3ByaW50ICJDSEVDSzwkcG9zc2libGU+XG4iOwogCWlmICgkcG9zc2libGUgIX4gL14oPzokU3RvcmFnZXwkVHlwZXxERUZJTkVfXFMrKSQvICYmCkBAIC02MTYsNyArNzE1LDcgQEAKIAkgICAgJHBvc3NpYmxlIG5lICdzdHJ1Y3QnICYmICRwb3NzaWJsZSBuZSAnZW51bScgJiYKIAkgICAgJHBvc3NpYmxlIG5lICdjYXNlJyAmJiAkcG9zc2libGUgbmUgJ2Vsc2UnICYmCiAJICAgICRwb3NzaWJsZSBuZSAndHlwZWRlZicpIHsKLQkJI3ByaW50ICJQT1NTSUJMRTwkcG9zc2libGU+XG4iOworCQl3YXJuICJQT1NTSUJMRTogJHBvc3NpYmxlICgkbGluZSlcbiIgaWYgKCRkYmdfcG9zc2libGUpOwogCQlwdXNoKEB0eXBlTGlzdCwgJHBvc3NpYmxlKTsKIAkJYnVpbGRfdHlwZXMoKTsKIAl9CkBAIC02MjQsMTYgKzcyMywxNSBAQAogCiBteSAkcHJlZml4ID0gJyc7CiAKLW15IEByZXBvcnQgPSAoKTsKIHN1YiByZXBvcnQgewogCW15ICRsaW5lID0gJHByZWZpeCAuICRfWzBdOwogCiAJJGxpbmUgPSAoc3BsaXQoJ1xuJywgJGxpbmUpKVswXSAuICJcbiIgaWYgKCR0ZXJzZSk7CiAKLQlwdXNoKEByZXBvcnQsICRsaW5lKTsKKwlwdXNoKG91ciBAcmVwb3J0LCAkbGluZSk7CiB9CiBzdWIgcmVwb3J0X2R1bXAgewotCUByZXBvcnQ7CisJb3VyIEByZXBvcnQ7CiB9CiBzdWIgRVJST1IgewogCXJlcG9ydCgiRVJST1I6ICRfWzBdXG4iKTsKQEAgLTY1NSwxMSArNzUzLDEyIEBACiAKIHN1YiBwcm9jZXNzIHsKIAlteSAkZmlsZW5hbWUgPSBzaGlmdDsKLQlteSBAbGluZXMgPSBAXzsKIAogCW15ICRsaW5lbnI9MDsKIAlteSAkcHJldmxpbmU9IiI7CisJbXkgJHByZXZyYXdsaW5lPSIiOwogCW15ICRzdGFzaGxpbmU9IiI7CisJbXkgJHN0YXNocmF3bGluZT0iIjsKIAogCW15ICRsZW5ndGg7CiAJbXkgJGluZGVudDsKQEAgLTY3MCw2ICs3NjksNyBAQAogCW15ICRzaWdub2ZmID0gMDsKIAlteSAkaXNfcGF0Y2ggPSAwOwogCisJb3VyIEByZXBvcnQgPSAoKTsKIAlvdXIgJGNudF9saW5lcyA9IDA7CiAJb3VyICRjbnRfZXJyb3IgPSAwOwogCW91ciAkY250X3dhcm4gPSAwOwpAQCAtNjgxLDE0ICs3ODEsMjkgQEAKIAlteSAkcmVhbGNudCA9IDA7CiAJbXkgJGhlcmUgPSAnJzsKIAlteSAkaW5fY29tbWVudCA9IDA7CisJbXkgJGNvbW1lbnRfZWRnZSA9IDA7CiAJbXkgJGZpcnN0X2xpbmUgPSAwOwogCi0JbXkgJHByZXZfdmFsdWVzID0gJ04nOworCW15ICRwcmV2X3ZhbHVlcyA9ICdFJzsKIAorCSMgc3VwcHJlc3Npb24gZmxhZ3MKKwlteSAkc3VwcHJlc3NfaWZicmFjZXMgPSAwOworCisJIyBQcmUtc2NhbiB0aGUgcGF0Y2ggc2FuaXRpemluZyB0aGUgbGluZXMuCiAJIyBQcmUtc2NhbiB0aGUgcGF0Y2ggbG9va2luZyBmb3IgYW55IF9fc2V0dXAgZG9jdW1lbnRhdGlvbi4KKwkjCiAJbXkgQHNldHVwX2RvY3MgPSAoKTsKIAlteSAkc2V0dXBfZG9jcyA9IDA7Ci0JZm9yZWFjaCBteSAkbGluZSAoQGxpbmVzKSB7CisJbXkgJGxpbmU7CisJZm9yZWFjaCBteSAkcmF3bGluZSAoQHJhd2xpbmVzKSB7CisJCSMgU3RhbmRhcmRpc2UgdGhlIHN0cmluZ3MgYW5kIGNoYXJzIHdpdGhpbiB0aGUgaW5wdXQgdG8KKwkJIyBzaW1wbGlmeSBtYXRjaGluZy4KKwkJJGxpbmUgPSBzYW5pdGlzZV9saW5lKCRyYXdsaW5lKTsKKwkJcHVzaChAbGluZXMsICRsaW5lKTsKKworCQkjI3ByaW50ICI9PT4kcmF3bGluZVxuIjsKKwkJIyNwcmludCAiLS0+JGxpbmVcbiI7CisKIAkJaWYgKCRsaW5lPX4vXlwrXCtcK1xzKyhcUyspLykgewogCQkJJHNldHVwX2RvY3MgPSAwOwogCQkJaWYgKCQxID1+IG1ARG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQkQCkgewpAQCAtNzA3LDggKzgyMiw3IEBACiAJZm9yZWFjaCBteSAkbGluZSAoQGxpbmVzKSB7CiAJCSRsaW5lbnIrKzsKIAotCQlteSAkcmF3bGluZSA9ICRsaW5lOwotCisJCW15ICRyYXdsaW5lID0gJHJhd2xpbmVzWyRsaW5lbnIgLSAxXTsKIAogI2V4dHJhY3QgdGhlIGZpbGVuYW1lIGFzIGl0IHBhc3NlcwogCQlpZiAoJGxpbmU9fi9eXCtcK1wrXHMrKFxTKykvKSB7CkBAIC03MjgsNyArODQyLDEwIEBACiAJCQl9IGVsc2UgewogCQkJCSRyZWFsY250PTErMTsKIAkJCX0KLQkJCSRwcmV2X3ZhbHVlcyA9ICdOJzsKKwkJCWFubm90YXRlX3Jlc2V0KCk7CisJCQkkcHJldl92YWx1ZXMgPSAnRSc7CisKKwkJCSRzdXBwcmVzc19pZmJyYWNlcyA9ICRsaW5lbnIgLSAxOwogCQkJbmV4dDsKIAkJfQogCkBAIC03NDYsNyArODYzLDcgQEAKIAkJCWlmICgkbGluZW5yID09ICRmaXJzdF9saW5lKSB7CiAJCQkJbXkgJGVkZ2U7CiAJCQkJZm9yIChteSAkbG4gPSAkZmlyc3RfbGluZTsgJGxuIDwgKCRsaW5lbnIgKyAkcmVhbGNudCk7ICRsbisrKSB7Ci0JCQkJCSgkZWRnZSkgPSAoJGxpbmVzWyRsbiAtIDFdID1+IG1AKC9cKnxcKi8pQCk7CisJCQkJCSgkZWRnZSkgPSAoJHJhd2xpbmVzWyRsbiAtIDFdID1+IG1AKC9cKnxcKi8pQCk7CiAJCQkJCWxhc3QgaWYgKGRlZmluZWQgJGVkZ2UpOwogCQkJCX0KIAkJCQlpZiAoZGVmaW5lZCAkZWRnZSAmJiAkZWRnZSBlcSAnKi8nKSB7CkBAIC03NTcsMjUgKzg3NCwzMCBAQAogCQkJIyBHdWVzdGltYXRlIGlmIHRoaXMgaXMgYSBjb250aW51aW5nIGNvbW1lbnQuICBJZiB0aGlzCiAJCQkjIGlzIHRoZSBzdGFydCBvZiBhIGRpZmYgYmxvY2sgYW5kIHRoaXMgbGluZSBzdGFydHMKIAkJCSMgJyAqJyB0aGVuIGl0IGlzIHZlcnkgbGlrZWx5IGEgY29tbWVudC4KLQkJCWlmICgkbGluZW5yID09ICRmaXJzdF9saW5lIGFuZCAkbGluZSA9fiBtQF4uXHMqXCpAKSB7CisJCQlpZiAoJGxpbmVuciA9PSAkZmlyc3RfbGluZSBhbmQgJHJhd2xpbmUgPX4gbUBeLlxzKiBcKig/OlxzfCQpQCkgewogCQkJCSRpbl9jb21tZW50ID0gMTsKIAkJCX0KIAogCQkJIyBGaW5kIHRoZSBsYXN0IGNvbW1lbnQgZWRnZSBvbiBfdGhpc18gbGluZS4KLQkJCXdoaWxlICgoJGxpbmUgPX4gbUAoL1wqfFwqLylAZykpIHsKKwkJCSRjb21tZW50X2VkZ2UgPSAwOworCQkJd2hpbGUgKCgkcmF3bGluZSA9fiBtQCgvXCp8XCovKUBnKSkgewogCQkJCWlmICgkMSBlcSAnLyonKSB7CiAJCQkJCSRpbl9jb21tZW50ID0gMTsKIAkJCQl9IGVsc2UgewogCQkJCQkkaW5fY29tbWVudCA9IDA7CiAJCQkJfQorCQkJCSRjb21tZW50X2VkZ2UgPSAxOwogCQkJfQogCiAJCQkjIE1lYXN1cmUgdGhlIGxpbmUgbGVuZ3RoIGFuZCBpbmRlbnQuCi0JCQkoJGxlbmd0aCwgJGluZGVudCkgPSBsaW5lX3N0YXRzKCRsaW5lKTsKKwkJCSgkbGVuZ3RoLCAkaW5kZW50KSA9IGxpbmVfc3RhdHMoJHJhd2xpbmUpOwogCiAJCQkjIFRyYWNrIHRoZSBwcmV2aW91cyBsaW5lLgogCQkJKCRwcmV2bGluZSwgJHN0YXNobGluZSkgPSAoJHN0YXNobGluZSwgJGxpbmUpOwogCQkJKCRwcmV2aW5kZW50LCAkc3Rhc2hpbmRlbnQpID0gKCRzdGFzaGluZGVudCwgJGluZGVudCk7CisJCQkoJHByZXZyYXdsaW5lLCAkc3Rhc2hyYXdsaW5lKSA9ICgkc3Rhc2hyYXdsaW5lLCAkcmF3bGluZSk7CisKKwkJCSN3YXJuICJpYzwkaW5fY29tbWVudD4gY2U8JGNvbW1lbnRfZWRnZT4gbGluZTwkbGluZT5cbiI7CiAKIAkJfSBlbHNpZiAoJHJlYWxjbnQgPT0gMSkgewogCQkJJHJlYWxjbnQtLTsKQEAgLTc4Niw5ICs5MDgsOSBAQAogCQkkaGVyZSA9ICIjJHJlYWxsaW5lOiAiIGlmICgkZmlsZSk7CiAJCSRoZXJlIC49ICJGSUxFOiAkcmVhbGZpbGU6JHJlYWxsaW5lOiIgaWYgKCRyZWFsY250ICE9IDApOwogCi0JCW15ICRoZXJlbGluZSA9ICIkaGVyZVxuJGxpbmVcbiI7Ci0JCW15ICRoZXJlY3VyciA9ICIkaGVyZVxuJGxpbmVcbiI7Ci0JCW15ICRoZXJlcHJldiA9ICIkaGVyZVxuJHByZXZsaW5lXG4kbGluZVxuIjsKKwkJbXkgJGhlcmVsaW5lID0gIiRoZXJlXG4kcmF3bGluZVxuIjsKKwkJbXkgJGhlcmVjdXJyID0gIiRoZXJlXG4kcmF3bGluZVxuIjsKKwkJbXkgJGhlcmVwcmV2ID0gIiRoZXJlXG4kcHJldnJhd2xpbmVcbiRyYXdsaW5lXG4iOwogCiAJCSRwcmVmaXggPSAiJGZpbGVuYW1lOiRyZWFsbGluZTogIiBpZiAoJGVtYWNzICYmICRmaWxlKTsKIAkJJHByZWZpeCA9ICIkZmlsZW5hbWU6JGxpbmVucjogIiBpZiAoJGVtYWNzICYmICEkZmlsZSk7CkBAIC04MTYsNyArOTM4LDcgQEAKIAogIyBVVEYtOCByZWdleCBmb3VuZCBhdCBodHRwOi8vd3d3LnczLm9yZy9JbnRlcm5hdGlvbmFsL3F1ZXN0aW9ucy9xYS1mb3Jtcy11dGYtOC5lbi5waHAKIAkJaWYgKCgkcmVhbGZpbGUgPX4gL14kLyB8fCAkbGluZSA9fiAvXlwrLykgJiYKLQkJICAgICAhKCRsaW5lID1+IG0vXigKKwkJICAgICAhKCRyYXdsaW5lID1+IG0vXigKIAkJCQlbXHgwOVx4MEFceDBEXHgyMC1ceDdFXSAgICAgICAgICAgICAgIyBBU0NJSQogCQkJCXwgW1x4QzItXHhERl1bXHg4MC1ceEJGXSAgICAgICAgICAgICAjIG5vbi1vdmVybG9uZyAyLWJ5dGUKIAkJCQl8ICBceEUwW1x4QTAtXHhCRl1bXHg4MC1ceEJGXSAgICAgICAgIyBleGNsdWRpbmcgb3ZlcmxvbmdzCkBAIC04MjYsNyArOTQ4LDcgQEAKIAkJCQl8IFtceEYxLVx4RjNdW1x4ODAtXHhCRl17M30gICAgICAgICAgIyBwbGFuZXMgNC0xNQogCQkJCXwgIFx4RjRbXHg4MC1ceDhGXVtceDgwLVx4QkZdezJ9ICAgICAjIHBsYW5lIDE2CiAJCQkJKSokL3ggKSkgewotCQkJRVJST1IoIkludmFsaWQgVVRGLThcbiIgLiAkaGVyZWN1cnIpOworCQkJRVJST1IoIkludmFsaWQgVVRGLTgsIHBhdGNoIGFuZCBjb21taXQgbWVzc2FnZSBzaG91bGQgYmUgZW5jb2RlZCBpbiBVVEYtOFxuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogI2lnbm9yZSBsaW5lcyBiZWluZyByZW1vdmVkCkBAIC04MzcsMTUgKzk1OSwxNSBAQAogCiAjdHJhaWxpbmcgd2hpdGVzcGFjZQogCQlpZiAoJGxpbmUgPX4gL15cKy4qXDAxNS8pIHsKLQkJCW15ICRoZXJldmV0ID0gIiRoZXJlXG4iIC4gY2F0X3ZldCgkbGluZSkgLiAiXG4iOworCQkJbXkgJGhlcmV2ZXQgPSAiJGhlcmVcbiIgLiBjYXRfdmV0KCRyYXdsaW5lKSAuICJcbiI7CiAJCQlFUlJPUigiRE9TIGxpbmUgZW5kaW5nc1xuIiAuICRoZXJldmV0KTsKIAotCQl9IGVsc2lmICgkbGluZSA9fiAvXlwrLipcU1xzKyQvIHx8ICRsaW5lID1+IC9eXCtccyskLykgewotCQkJbXkgJGhlcmV2ZXQgPSAiJGhlcmVcbiIgLiBjYXRfdmV0KCRsaW5lKSAuICJcbiI7CisJCX0gZWxzaWYgKCRyYXdsaW5lID1+IC9eXCsuKlxTXHMrJC8gfHwgJHJhd2xpbmUgPX4gL15cK1xzKyQvKSB7CisJCQlteSAkaGVyZXZldCA9ICIkaGVyZVxuIiAuIGNhdF92ZXQoJHJhd2xpbmUpIC4gIlxuIjsKIAkJCUVSUk9SKCJ0cmFpbGluZyB3aGl0ZXNwYWNlXG4iIC4gJGhlcmV2ZXQpOwogCQl9CiAjODAgY29sdW1uIGxpbWl0Ci0JCWlmICgkbGluZSA9fiAvXlwrLyAmJiAhKCRwcmV2bGluZT1+L1wvXCpcKi8pICYmICRsZW5ndGggPiA4MCkgeworCQlpZiAoJGxpbmUgPX4gL15cKy8gJiYgISgkcHJldnJhd2xpbmU9fi9cL1wqXCovKSAmJiAkbGVuZ3RoID4gODApIHsKIAkJCVdBUk4oImxpbmUgb3ZlciA4MCBjaGFyYWN0ZXJzXG4iIC4gJGhlcmVjdXJyKTsKIAkJfQogCkBAIC04NTksNDYgKzk4MSw0OCBAQAogCiAjIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIGFueSB0YWJzIG11c3QgY29tZSBmaXJzdCBhbmQgYW55dGhpbmcKICMgbW9yZSB0aGFuIDggbXVzdCB1c2UgdGFicy4KLQkJaWYgKCRsaW5lPX4vXlwrXHMqIFx0XHMqXFMvIG9yICRsaW5lPX4vXlwrXHMqICAgICAgICBccyovKSB7Ci0JCQlteSAkaGVyZXZldCA9ICIkaGVyZVxuIiAuIGNhdF92ZXQoJGxpbmUpIC4gIlxuIjsKKwkJaWYgKCRyYXdsaW5lID1+IC9eXCtccyogXHRccypcUy8gfHwKKwkJICAgICRyYXdsaW5lID1+IC9eXCtccyogICAgICAgIFxzKi8pIHsKKwkJCW15ICRoZXJldmV0ID0gIiRoZXJlXG4iIC4gY2F0X3ZldCgkcmF3bGluZSkgLiAiXG4iOwogCQkJRVJST1IoInVzZSB0YWJzIG5vdCBzcGFjZXNcbiIgLiAkaGVyZXZldCk7CiAJCX0KIAotIyBSZW1vdmUgY29tbWVudHMgZnJvbSB0aGUgbGluZSBiZWZvcmUgcHJvY2Vzc2luZy4KLQkJbXkgJGNvbW1lbnRfZWRnZSA9ICgkbGluZSA9fiBzQC9cKi4qXCovQEBnKSArCi0JCQkJICAgKCRsaW5lID1+IHNAL1wqLipAQCkgKwotCQkJCSAgICgkbGluZSA9fiBzQF4oLikuKlwqL0AkMUApOworIyBjaGVjayBmb3IgUkNTL0NWUyByZXZpc2lvbiBtYXJrZXJzCisJCWlmICgkcmF3bGluZSA9fiAvXCQoUmV2aXNpb258TG9nfElkKSg/OlwkfCkvKSB7CisJCQlXQVJOKCJDVlMgc3R5bGUga2V5d29yZCBtYXJrZXJzLCB0aGVzZSB3aWxsIF9ub3RfIGJlIHVwZGF0ZWRcbiIuICRoZXJlY3Vycik7CisJCX0KIAogIyBUaGUgcmVzdCBvZiBvdXIgY2hlY2tzIHJlZmVyIHNwZWNpZmljYWxseSB0byBDIHN0eWxlCiAjIG9ubHkgYXBwbHkgdGhvc2UgX291dHNpZGVfIGNvbW1lbnRzLiAgT25seSBza2lwCiAjIGxpbmVzIGluIHRoZSBtaWRkbGUgb2YgY29tbWVudHMuCiAJCW5leHQgaWYgKCEkY29tbWVudF9lZGdlICYmICRpbl9jb21tZW50KTsKIAotIyBTdGFuZGFyZGlzZSB0aGUgc3RyaW5ncyBhbmQgY2hhcnMgd2l0aGluIHRoZSBpbnB1dCB0byBzaW1wbGlmeSBtYXRjaGluZy4KLQkJJGxpbmUgPSBzYW5pdGlzZV9saW5lKCRsaW5lKTsKLQogIyBDaGVjayBmb3IgcG90ZW50aWFsICdiYXJlJyB0eXBlcwotCQlpZiAoJHJlYWxjbnQgJiYKLQkJICAgICRsaW5lICF+IC8kSWRlbnQ6XHMqJC8gJiYKLQkJICAgICgkbGluZSA9fiAvXi5ccyokSWRlbnRccypcKFwqK1xzKiRJZGVudFwpXHMqXCgvIHx8Ci0JCSAgICAgJGxpbmUgIX4gL14uXHMqJElkZW50XHMqXCgvKSkgeworCQlpZiAoJHJlYWxjbnQpIHsKKwkJCSMgSWdub3JlIGdvdG8gbGFiZWxzLgorCQkJaWYgKCRsaW5lID1+IC8kSWRlbnQ6XCokLykgeworCisJCQkjIElnbm9yZSBmdW5jdGlvbnMgYmVpbmcgY2FsbGVkCisJCQl9IGVsc2lmICgkbGluZSA9fiAvXi5ccyokSWRlbnRccypcKC8pIHsKKwogCQkJIyBkZWZpbml0aW9ucyBpbiBnbG9iYWwgc2NvcGUgY2FuIG9ubHkgc3RhcnQgd2l0aCB0eXBlcwotCQkJaWYgKCRsaW5lID1+IC9eLig/OiRTdG9yYWdlXHMrKT8oPzokSW5saW5lXHMrKT8oPzpjb25zdFxzKyk/KCRJZGVudClcYi8pIHsKLQkJCQlwb3NzaWJsZSgkMSk7CisJCQl9IGVsc2lmICgkbGluZSA9fiAvXi4oPzokU3RvcmFnZVxzKyk/KD86JElubGluZVxzKyk/KD86Y29uc3RccyspPygkSWRlbnQpXGIvKSB7CisJCQkJcG9zc2libGUoJDEsICRsaW5lKTsKIAogCQkJIyBkZWNsYXJhdGlvbnMgYWx3YXlzIHN0YXJ0IHdpdGggdHlwZXMKLQkJCX0gZWxzaWYgKCRwcmV2X3ZhbHVlcyBlcSAnTicgJiYgJGxpbmUgPX4gL14uXHMqKD86JFN0b3JhZ2VccyspPygkSWRlbnQpXGJccypcKipccyokSWRlbnRccyooPzo7fD0pLykgeworCQkJfSBlbHNpZiAoJHByZXZfdmFsdWVzIGVxICdFJyAmJiAkbGluZSA9fiAvXi5ccyooPzokU3RvcmFnZVxzKyk/KD86Y29uc3RccyspPygkSWRlbnQpXGIoOj9ccyskU3BhcnNlKT9ccypcKipccyokSWRlbnRccyooPzo7fD18LCkvKSB7CiAJCQkJcG9zc2libGUoJDEpOworCQkJfQogCiAJCQkjIGFueSAoZm9vIC4uLiAqKSBpcyBhIHBvaW50ZXIgY2FzdCwgYW5kIGZvbyBpcyBhIHR5cGUKLQkJCX0gZWxzaWYgKCRsaW5lID1+IC9cKCgkSWRlbnQpKD86XHMrJFNwYXJzZSkqXHMqXCorXHMqXCkvKSB7Ci0JCQkJcG9zc2libGUoJDEpOworCQkJd2hpbGUgKCRsaW5lID1+IC9cKCgkSWRlbnQpKD86XHMrJFNwYXJzZSkqXHMqXCorXHMqXCkvZykgeworCQkJCXBvc3NpYmxlKCQxLCAkbGluZSk7CiAJCQl9CiAKIAkJCSMgQ2hlY2sgZm9yIGFueSBzb3J0IG9mIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgogCQkJIyBpbnQgZm9vKHNvbWV0aGluZyBiYXIsIG90aGVyIGJheik7CiAJCQkjIHZvaWQgKCpzdG9yZV9nZHQpKHg4Nl9kZXNjcl9wdHIgKik7Ci0JCQlpZiAoJHByZXZfdmFsdWVzIGVxICdOJyAmJiAkbGluZSA9fiAvXiguKD86KD86JFN0b3JhZ2V8JElubGluZSlccyopKlxzKiRUeXBlXHMqKD86XGIkSWRlbnR8XChcKlxzKiRJZGVudFwpKVxzKilcKC8pIHsKKwkJCWlmICgkcHJldl92YWx1ZXMgZXEgJ0UnICYmICRsaW5lID1+IC9eKC4oPzp0eXBlZGVmXHMqKT8oPzooPzokU3RvcmFnZXwkSW5saW5lKVxzKikqXHMqJFR5cGVccyooPzpcYiRJZGVudHxcKFwqXHMqJElkZW50XCkpXHMqKVwoLykgewogCQkJCW15ICgkbmFtZV9sZW4pID0gbGVuZ3RoKCQxKTsKIAkJCQlteSAoJGxldmVsLCBAY3R4KSA9IGN0eF9zdGF0ZW1lbnRfbGV2ZWwoJGxpbmVuciwgJHJlYWxjbnQsICRuYW1lX2xlbik7CiAJCQkJbXkgJGN0eCA9IGpvaW4oIlxuIiwgQGN0eCk7CkBAIC05MDksNyArMTAzMyw3IEBACiAJCQkJZm9yIG15ICRhcmcgKHNwbGl0KC9ccyosXHMqLywgJGN0eCkpIHsKIAkJCQkJaWYgKCRhcmcgPX4gL14oPzpjb25zdFxzKyk/KCRJZGVudCkoPzpccyskU3BhcnNlKSpccypcKipccyooOj9cYiRJZGVudCk/JC8gfHwgJGFyZyA9fiAvXigkSWRlbnQpJC8pIHsKIAotCQkJCQkJcG9zc2libGUoJDEpOworCQkJCQkJcG9zc2libGUoJDEsICRsaW5lKTsKIAkJCQkJfQogCQkJCX0KIAkJCX0KQEAgLTk3NCw4ICsxMDk4LDExIEBACiAJCW15ICRvcGxpbmUgPSAkbGluZTsgJG9wbGluZSA9fiBzL14uLyAvOwogCQlteSAkY3Vycl92YWx1ZXMgPSBhbm5vdGF0ZV92YWx1ZXMoJG9wbGluZSAuICJcbiIsICRwcmV2X3ZhbHVlcyk7CiAJCSRjdXJyX3ZhbHVlcyA9ICRwcmV2X3ZhbHVlcyAuICRjdXJyX3ZhbHVlczsKLQkJI3dhcm4gIi0tPiAkb3BsaW5lXG4iOwotCQkjd2FybiAiLS0+ICRjdXJyX3ZhbHVlcyAoJHByZXZfdmFsdWVzKVxuIjsKKwkJaWYgKCRkYmdfdmFsdWVzKSB7CisJCQlteSAkb3V0bGluZSA9ICRvcGxpbmU7ICRvdXRsaW5lID1+IHMvXHQvIC9nOworCQkJd2FybiAiLS0+IC4kb3V0bGluZVxuIjsKKwkJCXdhcm4gIi0tPiAkY3Vycl92YWx1ZXNcbiI7CisJCX0KIAkJJHByZXZfdmFsdWVzID0gc3Vic3RyKCRjdXJyX3ZhbHVlcywgLTEpOwogCiAjaWdub3JlIGxpbmVzIG5vdCBiZWluZyBhZGRlZApAQCAtMTAwNCw5ICsxMTMxLDYgQEAKIAkJCQlFUlJPUigibWFsZm9ybWVkICNpbmNsdWRlIGZpbGVuYW1lXG4iIC4KIAkJCQkJJGhlcmVjdXJyKTsKIAkJCX0KLQkJCSMgU2FuaXRpc2UgdGhpcyBzcGVjaWFsIGZvcm0gb2Ygc3RyaW5nLgotCQkJJHBhdGggPSAnWCcgeCBsZW5ndGgoJHBhdGgpOwotCQkJJGxpbmUgPX4gc3tcPC4qXD59ezwkcGF0aD59OwogCQl9CiAKICMgbm8gQzk5IC8vIGNvbW1lbnRzCkBAIC0xMDc0LDcgKzExOTgsNyBAQAogIyAJCX0KIAogCQlpZiAoJGxpbmUgPX4gL1xiTElOVVhfVkVSU0lPTl9DT0RFXGIvKSB7Ci0JCQlXQVJOKCJMSU5VWF9WRVJTSU9OX0NPREUgc2hvdWxkIGJlIGF2b2lkZWQsIGNvZGUgc2hvdWxkIGJlIGZvciB0aGUgdmVyc2lvbiB0byB3aGljaCBpdCBpcyBtZXJnZWQiIC4gJGhlcmVjdXJyKTsKKwkJCVdBUk4oIkxJTlVYX1ZFUlNJT05fQ09ERSBzaG91bGQgYmUgYXZvaWRlZCwgY29kZSBzaG91bGQgYmUgZm9yIHRoZSB2ZXJzaW9uIHRvIHdoaWNoIGl0IGlzIG1lcmdlZFxuIiAuICRoZXJlY3Vycik7CiAJCX0KIAogIyBwcmludGsgc2hvdWxkIHVzZSBLRVJOXyogbGV2ZWxzLiAgTm90ZSB0aGF0IGZvbGxvdyBvbiBwcmludGsncyBvbiB0aGUKQEAgLTExMDIsNyArMTIyNiw3IEBACiAKICMgZnVuY3Rpb24gYnJhY2UgY2FuJ3QgYmUgb24gc2FtZSBsaW5lLCBleGNlcHQgZm9yICNkZWZpbmVzIG9mIGRvIHdoaWxlLAogIyBvciBpZiBjbG9zZWQgb24gc2FtZSBsaW5lCi0JCWlmICgoJGxpbmU9fi8kVHlwZVxzKltBLVphLXpcZF9dK1woLipcKS4qIHsvKSBhbmQKKwkJaWYgKCgkbGluZT1+LyRUeXBlXHMqW0EtWmEtelxkX10rXCguKlwpLipcc3svKSBhbmQKIAkJICAgICEoJGxpbmU9fi9cI2RlZmluZS4qZG9cc3svKSBhbmQgISgkbGluZT1+L30vKSkgewogCQkJRVJST1IoIm9wZW4gYnJhY2UgJ3snIGZvbGxvd2luZyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgZ28gb24gdGhlIG5leHQgbGluZVxuIiAuICRoZXJlY3Vycik7CiAJCX0KQEAgLTExMTUsOCArMTIzOSwyMiBAQAogCiAjIGNoZWNrIGZvciBzcGFjZXMgYmV0d2VlbiBmdW5jdGlvbnMgYW5kIHRoZWlyIHBhcmVudGhlc2VzLgogCQl3aGlsZSAoJGxpbmUgPX4gLygkSWRlbnQpXHMrXCgvZykgewotCQkJaWYgKCQxICF+IC9eKD86aWZ8Zm9yfHdoaWxlfHN3aXRjaHxyZXR1cm58dm9sYXRpbGV8X192b2xhdGlsZV9ffF9fYXR0cmlidXRlX198Zm9ybWF0fF9fZXh0ZW5zaW9uX198Q29weXJpZ2h0fGNhc2UpJC8gJiYKLQkJICAgICAgICAgICAgJGxpbmUgIX4gLyRUeXBlXHMrXCgvICYmICRsaW5lICF+IC9eLlwjXHMqZGVmaW5lXGIvKSB7CisJCQlteSAkbmFtZSA9ICQxOworCQkJbXkgJGN0eCA9IHN1YnN0cigkbGluZSwgMCwgJC1bMV0pOworCisJCQkjIElnbm9yZSB0aG9zZSBkaXJlY3RpdmVzIHdoZXJlIHNwYWNlcyBfYXJlXyBwZXJtaXR0ZWQuCisJCQlpZiAoJG5hbWUgPX4gL14oPzppZnxmb3J8d2hpbGV8c3dpdGNofHJldHVybnx2b2xhdGlsZXxfX3ZvbGF0aWxlX198X19hdHRyaWJ1dGVfX3xmb3JtYXR8X19leHRlbnNpb25fX3xDb3B5cmlnaHR8Y2FzZXxfX2FzbV9fKSQvKSB7CisKKwkJCSMgY3BwICNkZWZpbmUgc3RhdGVtZW50cyBoYXZlIG5vbi1vcHRpb25hbCBzcGFjZXMsIGllCisJCQkjIGlmIHRoZXJlIGlzIGEgc3BhY2UgYmV0d2VlbiB0aGUgbmFtZSBhbmQgdGhlIG9wZW4KKwkJCSMgcGFyZW50aGVzaXMgaXQgaXMgc2ltcGx5IG5vdCBhIHBhcmFtZXRlciBncm91cC4KKwkJCX0gZWxzaWYgKCRjdHggPX4gL14uXCNccypkZWZpbmVccyokLykgeworCisJCQkjIElmIHRoaXMgd2hvbGUgdGhpbmdzIGVuZHMgd2l0aCBhIHR5cGUgaXRzIG1vc3QKKwkJCSMgbGlrZWx5IGEgdHlwZWRlZiBmb3IgYSBmdW5jdGlvbi4KKwkJCX0gZWxzaWYgKCIkY3R4JG5hbWUiID1+IC8kVHlwZSQvKSB7CisKKwkJCX0gZWxzZSB7CiAJCQkJV0FSTigibm8gc3BhY2UgYmV0d2VlbiBmdW5jdGlvbiBuYW1lIGFuZCBvcGVuIHBhcmVudGhlc2lzICcoJ1xuIiAuICRoZXJlY3Vycik7CiAJCQl9CiAJCX0KQEAgLTExMjYsOSArMTI2NCw5IEBACiAJCQkJPDw9fD4+PXw8PXw+PXw9PXwhPXwKIAkJCQlcKz18LT18XCo9fFwvPXwlPXxcXj18XHw9fCY9fAogCQkJCT0+fC0+fDw8fD4+fDx8Pnw9fCF8fnwKLQkJCQkmJnxcfFx8fCx8XF58XCtcK3wtLXwmfFx8fFwrfC18XCp8XC8KKwkJCQkmJnxcfFx8fCx8XF58XCtcK3wtLXwmfFx8fFwrfC18XCp8XC98JQogCQkJfXg7Ci0JCQlteSBAZWxlbWVudHMgPSBzcGxpdCgvKCRvcHN8OykvLCAkb3BsaW5lKTsKKwkJCW15IEBlbGVtZW50cyA9IHNwbGl0KC8oJDsrfCRvcHN8OykvLCAkb3BsaW5lKTsKIAkJCW15ICRvZmYgPSAwOwogCiAJCQlteSAkYmxhbmsgPSBjb3B5X3NwYWNpbmcoJG9wbGluZSk7CkBAIC0xMTg4LDggKzEzMjYsMTUgQEAKIAkJCQkjCXByaW50ICJVTkFSWTogPCRvcF9sZWZ0JG9wX3R5cGUgJGlzX3VuYXJ5ICRhOiRvcDokYz4gPCRjYTokb3A6JGNjPiA8JHVuYXJ5X2N0eD5cbiI7CiAJCQkJI30KIAorCQkJCSMgSWdub3JlIG9wZXJhdG9ycyBwYXNzZWQgYXMgcGFyYW1ldGVycy4KKwkJCQlpZiAoJG9wX3R5cGUgbmUgJ1YnICYmCisJCQkJICAgICRjYSA9fiAvXHMkLyAmJiAkY2MgPX4gL15ccyosLykgeworCisJCQkJIyBJZ25vcmUgY29tbWVudHMKKwkJCQl9IGVsc2lmICgkb3AgPX4gL14kOyskLykgeworCiAJCQkJIyA7IHNob3VsZCBoYXZlIGVpdGhlciB0aGUgZW5kIG9mIGxpbmUgb3IgYSBzcGFjZSBvciBcIGFmdGVyIGl0Ci0JCQkJaWYgKCRvcCBlcSAnOycpIHsKKwkJCQl9IGVsc2lmICgkb3AgZXEgJzsnKSB7CiAJCQkJCWlmICgkY3R4ICF+IC8ueFtXRUJdLyAmJiAkY2MgIX4gL15cXC8gJiYKIAkJCQkJICAgICRjYyAhfiAvXjsvKSB7CiAJCQkJCQlFUlJPUigibmVlZCBzcGFjZSBhZnRlciB0aGF0ICckb3AnICRhdFxuIiAuICRoZXJlcHRyKTsKQEAgLTEyMzEsNyArMTM3Niw3IEBACiAJCQkJCWlmICgkY3R4ICF+IC9bV09CXXhbXlddLyAmJiAkY3R4ICF+IC9bXlddeFtXT0JFXS8pIHsKIAkJCQkJCUVSUk9SKCJuZWVkIHNwYWNlIG9uZSBzaWRlIG9mIHRoYXQgJyRvcCcgJGF0XG4iIC4gJGhlcmVwdHIpOwogCQkJCQl9Ci0JCQkJCWlmICgkY3R4ID1+IC9XeC4vICYmICRjYyA9fiAvXjsvKSB7CisJCQkJCWlmICgkY3R4ID1+IC9XeEIvIHx8ICgkY3R4ID1+IC9XeC4vICYmICRjYyA9fiAvXjsvKSkgewogCQkJCQkJRVJST1IoIm5vIHNwYWNlIGJlZm9yZSB0aGF0ICckb3AnICRhdFxuIiAuICRoZXJlcHRyKTsKIAkJCQkJfQogCkBAIC0xMjM5LDcgKzEzODQsOCBAQAogCQkJCX0gZWxzaWYgKCRvcCBlcSAnPDwnIG9yICRvcCBlcSAnPj4nIG9yCiAJCQkJCSAkb3AgZXEgJyYnIG9yICRvcCBlcSAnXicgb3IgJG9wIGVxICd8JyBvcgogCQkJCQkgJG9wIGVxICcrJyBvciAkb3AgZXEgJy0nIG9yCi0JCQkJCSAkb3AgZXEgJyonIG9yICRvcCBlcSAnLycpCisJCQkJCSAkb3AgZXEgJyonIG9yICRvcCBlcSAnLycgb3IKKwkJCQkJICRvcCBlcSAnJScpCiAJCQkJewogCQkJCQlpZiAoJGN0eCAhfiAvVnhWfFd4V3xWeEV8V3hFfFZ4Ty8pIHsKIAkJCQkJCUVSUk9SKCJuZWVkIGNvbnNpc3RlbnQgc3BhY2luZyBhcm91bmQgJyRvcCcgJGF0XG4iIC4KQEAgLTEzMDMsNyArMTQ0OSw3IEBACiAJCSAgICAkbGluZSAhfiAvZm9yXHMqXChccys7LykgewogCQkJRVJST1IoIm5vIHNwYWNlIGFmdGVyIHRoYXQgb3BlbiBwYXJlbnRoZXNpcyAnKCdcbiIgLiAkaGVyZWN1cnIpOwogCQl9Ci0JCWlmICgkbGluZSA9fiAvXHNcKS8gJiYgJGxpbmUgIX4gL14uXHMqXCkvICYmCisJCWlmICgkbGluZSA9fiAvKFxzKylcKS8gJiYgJGxpbmUgIX4gL14uXHMqXCkvICYmCiAJCSAgICAkbGluZSAhfiAvZm9yXHMqXCguKjtccytcKS8pIHsKIAkJCUVSUk9SKCJubyBzcGFjZSBiZWZvcmUgdGhhdCBjbG9zZSBwYXJlbnRoZXNpcyAnKSdcbiIgLiAkaGVyZWN1cnIpOwogCQl9CkBAIC0xMzI0LDIzICsxNDcwLDQxIEBACiAJCQlteSAoJHMsICRjKSA9IGN0eF9zdGF0ZW1lbnRfYmxvY2soJGxpbmVuciwgJHJlYWxjbnQsIDApOwogCiAJCQlpZiAoJGMgPX4gL1xiaWZccypcKC4qW148PiE9XT1bXj1dLiovKSB7Ci0JCQkJRVJST1IoImRvIG5vdCB1c2UgYXNzaWdubWVudCBpbiBpZiBjb25kaXRpb24gKCRjKVxuIiAuICRoZXJlY3Vycik7CisJCQkJRVJST1IoImRvIG5vdCB1c2UgYXNzaWdubWVudCBpbiBpZiBjb25kaXRpb25cbiIgLiAkaGVyZWN1cnIpOwogCQkJfQogCiAJCQkjIEZpbmQgb3V0IHdoYXQgaXMgb24gdGhlIGVuZCBvZiB0aGUgbGluZSBhZnRlciB0aGUKIAkJCSMgY29uZGl0aW9uYWwuCiAJCQlzdWJzdHIoJHMsIDAsIGxlbmd0aCgkYykpID0gJyc7CiAJCQkkcyA9fiBzL1xuLiovL2c7Ci0KLQkJCWlmIChsZW5ndGgoJGMpICYmICRzICF+IC9eXHMqKHt8O3xcL1wqLipcKlwvKT9ccypcXCpccyokLykgeworCQkJJHMgPX4gcy8kOy8vZzsgCSMgUmVtb3ZlIGFueSBjb21tZW50cworCQkJaWYgKGxlbmd0aCgkYykgJiYgJHMgIX4gL15ccyooe3w7fClccypcXCpccyokLykgewogCQkJCUVSUk9SKCJ0cmFpbGluZyBzdGF0ZW1lbnRzIHNob3VsZCBiZSBvbiBuZXh0IGxpbmVcbiIgLiAkaGVyZWN1cnIpOwogCQkJfQogCQl9CiAKKyMgQ2hlY2sgZm9yIGJpdHdpc2UgdGVzdHMgd3JpdHRlbiBhcyBib29sZWFuCisJCWlmICgkbGluZSA9fiAvCisJCQkoPzoKKwkJCQkoPzpcW3xcKHxcJlwmfFx8XHwpCisJCQkJXHMqMFt4WF1bMC05XStccyoKKwkJCQkoPzpcJlwmfFx8XHwpCisJCQl8CisJCQkJKD86XCZcJnxcfFx8KQorCQkJCVxzKjBbeFhdWzAtOV0rXHMqCisJCQkJKD86XCZcJnxcfFx8fFwpfFxdKQorCQkJKS94KQorCQl7CisJCQlXQVJOKCJib29sZWFuIHRlc3Qgd2l0aCBoZXhhZGVjaW1hbCwgcGVyaGFwcyBqdXN0IDEgXCYgb3IgXHw/XG4iIC4gJGhlcmVjdXJyKTsKKwkJfQorCiAjIGlmIGFuZCBlbHNlIHNob3VsZCBub3QgaGF2ZSBnZW5lcmFsIHN0YXRlbWVudHMgYWZ0ZXIgaXQKLQkJaWYgKCRsaW5lID1+IC9eLlxzKig/On1ccyopP2Vsc2VcYiguKikvICYmCi0JCSAgICAkMSAhfiAvXlxzKig/OlxzaWZ8e3xcXHwkKS8pIHsKLQkJCUVSUk9SKCJ0cmFpbGluZyBzdGF0ZW1lbnRzIHNob3VsZCBiZSBvbiBuZXh0IGxpbmVcbiIgLiAkaGVyZWN1cnIpOworCQlpZiAoJGxpbmUgPX4gL14uXHMqKD86fVxzKik/ZWxzZVxiKC4qKS8pIHsKKwkJCW15ICRzID0gJDE7CisJCQkkcyA9fiBzLyQ7Ly9nOyAJIyBSZW1vdmUgYW55IGNvbW1lbnRzCisJCQlpZiAoJHMgIX4gL15ccyooPzpcc2lmfCg/Ont8KVxzKlxcP1xzKiQpLykgeworCQkJCUVSUk9SKCJ0cmFpbGluZyBzdGF0ZW1lbnRzIHNob3VsZCBiZSBvbiBuZXh0IGxpbmVcbiIgLiAkaGVyZWN1cnIpOworCQkJfQogCQl9CiAKIAkJIyBDaGVjayBmb3IgfTxubD5lbHNlIHssIHRoZXNlIG11c3QgYmUgYXQgdGhlIHNhbWUKQEAgLTEzNTAsNiArMTUxNCwyMCBAQAogCQkJRVJST1IoImVsc2Ugc2hvdWxkIGZvbGxvdyBjbG9zZSBicmFjZSAnfSdcbiIgLiAkaGVyZXByZXYpOwogCQl9CiAKKwkJaWYgKCRwcmV2bGluZT1+L31ccyokLyBhbmQgJGxpbmU9fi9eLlxzKndoaWxlXHMqLyBhbmQKKwkJCQkJCSRwcmV2aW5kZW50ID09ICRpbmRlbnQpIHsKKwkJCW15ICgkcywgJGMpID0gY3R4X3N0YXRlbWVudF9ibG9jaygkbGluZW5yLCAkcmVhbGNudCwgMCk7CisKKwkJCSMgRmluZCBvdXQgd2hhdCBpcyBvbiB0aGUgZW5kIG9mIHRoZSBsaW5lIGFmdGVyIHRoZQorCQkJIyBjb25kaXRpb25hbC4KKwkJCXN1YnN0cigkcywgMCwgbGVuZ3RoKCRjKSkgPSAnJzsKKwkJCSRzID1+IHMvXG4uKi8vZzsKKworCQkJaWYgKCRzID1+IC9eXHMqOy8pIHsKKwkJCQlFUlJPUigid2hpbGUgc2hvdWxkIGZvbGxvdyBjbG9zZSBicmFjZSAnfSdcbiIgLiAkaGVyZXByZXYpOworCQkJfQorCQl9CisKICNzdHVkbHkgY2FwcywgY29tbWVudGVkIG91dCB1bnRpbCBmaWd1cmUgb3V0IGhvdyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHVzZSBvZiBleGlzdGluZyBhbmQgYWRkaW5nIG5ldwogIwkJaWYgKCgkbGluZT1+L1tcd19dW2EtelxkXStbQS1aXS8pIGFuZCAhKCRsaW5lPX4vcHJpbnQvKSkgewogIwkJICAgIHByaW50ICJObyBzdHVkbHkgY2FwcywgdXNlIF9cbiI7CkBAIC0xNDE5LDcgKzE1OTcsNDggQEAKIAkJfQogCiAjIGNoZWNrIGZvciByZWR1bmRhbnQgYnJhY2luZyByb3VuZCBpZiBldGMKLQkJaWYgKCRsaW5lID1+IC9cYihpZnx3aGlsZXxmb3J8ZWxzZSlcYi8pIHsKKwkJaWYgKCRsaW5lID1+IC8oXi4qKVxiaWZcYi8gJiYgJDEgIX4gL2Vsc2VccyokLykgeworCQkJbXkgKCRsZXZlbCwgJGVuZGxuLCBAY2h1bmtzKSA9CisJCQkJY3R4X3N0YXRlbWVudF9mdWxsKCRsaW5lbnIsICRyZWFsY250LCAwKTsKKwkJCSNwcmludCAiY2h1bmtzPCQjY2h1bmtzPiBsaW5lbnI8JGxpbmVucj4gZW5kbG48JGVuZGxuPiBsZXZlbDwkbGV2ZWw+XG4iOworCQkJaWYgKCQjY2h1bmtzID4gMSAmJiAkbGV2ZWwgPT0gMCkgeworCQkJCW15ICRhbGxvd2VkID0gMDsKKwkJCQlteSAkc2VlbiA9IDA7CisJCQkJZm9yIG15ICRjaHVuayAoQGNodW5rcykgeworCQkJCQlteSAoJGNvbmQsICRibG9jaykgPSBAeyRjaHVua307CisKKwkJCQkJc3Vic3RyKCRibG9jaywgMCwgbGVuZ3RoKCRjb25kKSkgPSAnJzsKKworCQkJCQkkc2VlbisrIGlmICgkYmxvY2sgPX4gL15ccyp7Lyk7CisKKwkJCQkJJGJsb2NrID1+IHMvKF58XG4pLi8kMS9nOworCQkJCQkkYmxvY2sgPX4gcy9eXHMqey8vOworCQkJCQkkYmxvY2sgPX4gcy99XHMqJC8vOworCQkJCQkkYmxvY2sgPX4gcy9eXHMqLy87CisJCQkJCSRibG9jayA9fiBzL1xzKiQvLzsKKworCQkJCQlteSBAbGluZXMgPSAoJGJsb2NrID1+IC9cbi9nKTsKKwkJCQkJbXkgQHN0YXRlbWVudHMgPSAoJGJsb2NrID1+IC87L2cpOworCisJCQkJCSNwcmludCAiY29uZDwkY29uZD4gYmxvY2s8JGJsb2NrPiBsaW5lczwiIC4gc2NhbGFyKEBsaW5lcykgLiAiPiBzdGF0ZW1lbnRzPCIgLiBzY2FsYXIoQHN0YXRlbWVudHMpIC4gIj4gc2Vlbjwkc2Vlbj4gYWxsb3dlZDwkYWxsb3dlZD5cbiI7CisJCQkJCWlmIChzY2FsYXIoQGxpbmVzKSAhPSAwKSB7CisJCQkJCQkkYWxsb3dlZCA9IDE7CisJCQkJCX0KKwkJCQkJaWYgKCRibG9jayA9fi9cYig/OmlmfGZvcnx3aGlsZSlcYi8pIHsKKwkJCQkJCSRhbGxvd2VkID0gMTsKKwkJCQkJfQorCQkJCQlpZiAoc2NhbGFyKEBzdGF0ZW1lbnRzKSA+IDEpIHsKKwkJCQkJCSRhbGxvd2VkID0gMTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoJHNlZW4gJiYgISRhbGxvd2VkKSB7CisJCQkJCVdBUk4oImJyYWNlcyB7fSBhcmUgbm90IG5lY2Vzc2FyeSBmb3IgYW55IGFybSBvZiB0aGlzIHN0YXRlbWVudFxuIiAuICRoZXJlY3Vycik7CisJCQkJCSRzdXBwcmVzc19pZmJyYWNlcyA9ICRlbmRsbjsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKCRsaW5lbnIgPiAkc3VwcHJlc3NfaWZicmFjZXMgJiYKKwkJCQkJJGxpbmUgPX4gL1xiKGlmfHdoaWxlfGZvcnxlbHNlKVxiLykgewogCQkJIyBMb2NhdGUgdGhlIGVuZCBvZiB0aGUgb3BlbmluZyBzdGF0ZW1lbnQuCiAJCQlteSBAY29udHJvbCA9IGN0eF9zdGF0ZW1lbnQoJGxpbmVuciwgJHJlYWxjbnQsIDApOwogCQkJbXkgJG5yID0gJGxpbmVuciArIChzY2FsYXIoQGNvbnRyb2wpIC0gMSk7CkBAIC0xNDQyLDEzICsxNjYxLDE2IEBACiAJCQkJbXkgJGFmdGVyID0gJDE7CiAKIAkJCQkjcHJpbnQgImJsb2NrPCIgLiBqb2luKCcgJywgQGJsb2NrKSAuICI+PCIgLiBzY2FsYXIoQGJsb2NrKSAuICI+XG4iOwotCQkJCSNwcmludCAic3RtdDwkc3RtdD5cblxuIjsKKwkJCQkjcHJpbnQgImJlZm9yZTwkYmVmb3JlPiBzdG10PCRzdG10PiBhZnRlcjwkYWZ0ZXI+XG5cbiI7CiAKIAkJCQkjIENvdW50IHRoZSBuZXdsaW5lcywgaWYgdGhlcmUgaXMgb25seSBvbmUKIAkJCQkjIHRoZW4gdGhlIGJsb2NrIHNob3VsZCBub3QgaGF2ZSB7fSdzLgogCQkJCW15IEBsaW5lcyA9ICgkc3RtdCA9fiAvXG4vZyk7CisJCQkJbXkgQHN0YXRlbWVudHMgPSAoJHN0bXQgPX4gLzsvZyk7CiAJCQkJI3ByaW50ICJsaW5lczwiIC4gc2NhbGFyKEBsaW5lcykgLiAiPlxuIjsKKwkJCQkjcHJpbnQgInN0YXRlbWVudHM8IiAuIHNjYWxhcihAc3RhdGVtZW50cykgLiAiPlxuIjsKIAkJCQlpZiAoJGx2bCA9PSAwICYmIHNjYWxhcihAbGluZXMpID09IDAgJiYKKwkJCQkgICAgc2NhbGFyKEBzdGF0ZW1lbnRzKSA8IDIgJiYKIAkJCQkgICAgJHN0bXQgIX4gL3svICYmICRzdG10ICF+IC9cYmlmXGIvICYmCiAJCQkJICAgICRiZWZvcmUgIX4gL30vICYmICRhZnRlciAhfiAvey8pIHsKIAkJCQkgICAgCW15ICRoZXJlY3R4ID0gIiRoZXJlXG4iIC4gam9pbigiXG4iLCBAY29udHJvbCwgQGJsb2NrWzEgLi4gJCNibG9ja10pIC4gIlxuIjsKQEAgLTE1NTcsNiArMTc3OSwxNyBAQAogCQlpZiAoJGxpbmUgPX4gL1wqXHMqXClccyprW2N6bV1hbGxvY1xiLykgewogCQkJV0FSTigidW5uZWNlc3NhcnkgY2FzdCBtYXkgaGlkZSBidWdzLCBzZWUgaHR0cDovL2MtZmFxLmNvbS9tYWxsb2MvbWFsbG9jbm9jYXN0Lmh0bWxcbiIgLiAkaGVyZWN1cnIpOwogCQl9CisKKyMgY2hlY2sgZm9yIGdjYyBzcGVjaWZpYyBfX0ZVTkNUSU9OX18KKwkJaWYgKCRsaW5lID1+IC9fX0ZVTkNUSU9OX18vKSB7CisJCQlXQVJOKCJfX2Z1bmNfXyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGdjYyBzcGVjaWZpYyBfX0ZVTkNUSU9OX19cbiIgIC4gJGhlcmVjdXJyKTsKKwkJfQorCX0KKworCSMgSWYgd2UgaGF2ZSBubyBpbnB1dCBhdCBhbGwsIHRoZW4gdGhlcmUgaXMgbm90aGluZyB0byByZXBvcnQgb24KKwkjIHNvIGp1c3Qga2VlcCBxdWlldC4KKwlpZiAoJCNyYXdsaW5lcyA9PSAtMSkgeworCQlleGl0KDApOwogCX0KIAogCSMgSW4gbWFpbGJhY2sgbW9kZSBvbmx5IHByb2R1Y2UgYSByZXBvcnQgaW4gdGhlIG5lZ2F0aXZlLCBmb3IKQEAgLTE1NzksNyArMTgxMiw4IEBACiAJfQogCiAJcHJpbnQgcmVwb3J0X2R1bXAoKTsKLQlpZiAoJHN1bW1hcnkpIHsKKwlpZiAoJHN1bW1hcnkgJiYgISgkY2xlYW4gPT0gMSAmJiAkcXVpZXQgPT0gMSkpIHsKKwkJcHJpbnQgIiRmaWxlbmFtZSAiIGlmICgkc3VtbWFyeV9maWxlKTsKIAkJcHJpbnQgInRvdGFsOiAkY250X2Vycm9yIGVycm9ycywgJGNudF93YXJuIHdhcm5pbmdzLCAiIC4KIAkJCSgoJGNoZWNrKT8gIiRjbnRfY2hrIGNoZWNrcywgIiA6ICIiKSAuCiAJCQkiJGNudF9saW5lcyBsaW5lcyBjaGVja2VkXG4iOwpAQCAtMTU4NywxMiArMTgyMSwyMiBAQAogCX0KIAogCWlmICgkY2xlYW4gPT0gMSAmJiAkcXVpZXQgPT0gMCkgewotCQlwcmludCAiWW91ciBwYXRjaCBoYXMgbm8gb2J2aW91cyBzdHlsZSBwcm9ibGVtcyBhbmQgaXMgcmVhZHkgZm9yIHN1Ym1pc3Npb24uXG4iCisJCXByaW50ICIkdm5hbWUgaGFzIG5vIG9idmlvdXMgc3R5bGUgcHJvYmxlbXMgYW5kIGlzIHJlYWR5IGZvciBzdWJtaXNzaW9uLlxuIgogCX0KIAlpZiAoJGNsZWFuID09IDAgJiYgJHF1aWV0ID09IDApIHsKLQkJcHJpbnQgIllvdXIgcGF0Y2ggaGFzIHN0eWxlIHByb2JsZW1zLCBwbGVhc2UgcmV2aWV3LiAgSWYgYW55IG9mIHRoZXNlIGVycm9yc1xuIjsKKwkJcHJpbnQgIiR2bmFtZSBoYXMgc3R5bGUgcHJvYmxlbXMsIHBsZWFzZSByZXZpZXcuICBJZiBhbnkgb2YgdGhlc2UgZXJyb3JzXG4iOwogCQlwcmludCAiYXJlIGZhbHNlIHBvc2l0aXZlcyByZXBvcnQgdGhlbSB0byB0aGUgbWFpbnRhaW5lciwgc2VlXG4iOwogCQlwcmludCAiQ0hFQ0tQQVRDSCBpbiBNQUlOVEFJTkVSUy5cbiI7CiAJfQorCXByaW50IDw8RU9MIGlmICgkZmlsZSA9PSAxICYmICRxdWlldCA9PSAwKTsKKworV0FSTklORzogVXNpbmcgLS1maWxlIG1vZGUuIFBsZWFzZSBkbyBub3Qgc2VuZCBwYXRjaGVzIHRvIGxpbnV4LWtlcm5lbAordGhhdCBjaGFuZ2Ugd2hvbGUgZXhpc3RpbmcgZmlsZXMgaWYgeW91IGRpZCBub3Qgc2lnbmlmaWNhbnRseSBjaGFuZ2UgbW9zdAorb2YgdGhlIHRoZSBmaWxlIGZvciBvdGhlciByZWFzb25zIGFueXdheXMgb3IganVzdCB3cm90ZSB0aGUgZmlsZSBuZXdseQorZnJvbSBzY3JhdGNoLiBQdXJlIGNvZGUgc3R5bGUgcGF0Y2hlcyBoYXZlIGEgc2lnbmlmaWNhbnQgY29zdCBpbiBhCitxdWlja2x5IGNoYW5naW5nIGNvZGUgYmFzZSBsaWtlIExpbnV4IGJlY2F1c2UgdGhleSBjYXVzZSByZWplY3RzCit3aXRoIG90aGVyIGNoYW5nZXMuCitFT0wKKwogCXJldHVybiAkY2xlYW47CiB9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tlcm5lbC1kb2MgYi9zY3JpcHRzL2tlcm5lbC1kb2MKaW5kZXggZWM1NGYxMi4uNmMxOGExNCAxMDA3NTUKLS0tIGEvc2NyaXB0cy9rZXJuZWwtZG9jCisrKyBiL3NjcmlwdHMva2VybmVsLWRvYwpAQCAtMjE4LDYgKzIxOCw3IEBACiAgICAgcHJpbnQgIiAgICAgICAgIFsgLWZ1bmN0aW9uIGZ1bmNuYW1lIFsgLWZ1bmN0aW9uIGZ1bmNuYW1lIC4uLl0gXVxuIjsKICAgICBwcmludCAiICAgICAgICAgWyAtbm9mdW5jdGlvbiBmdW5jbmFtZSBbIC1ub2Z1bmN0aW9uIGZ1bmNuYW1lIC4uLl0gXVxuIjsKICAgICBwcmludCAiICAgICAgICAgYyBzb3VyY2UgZmlsZShzKSA+IG91dHB1dGZpbGVcbiI7CisgICAgcHJpbnQgIiAgICAgICAgIC12IDogdmVyYm9zZSBvdXRwdXQsIG1vcmUgd2FybmluZ3MgJiBvdGhlciBpbmZvIGxpc3RlZFxuIjsKICAgICBleGl0IDE7CiB9CiAKQEAgLTE2NTQsNyArMTY1NSw3IEBACiAJJHByb3RvdHlwZSA9fiBtL14oXHcrKVxzKyhbYS16QS1aMC05X346XSspXHMqXCgoW15cKF0qKVwpLyB8fAogCSRwcm90b3R5cGUgPX4gbS9eKFx3K1xzKlwqKVxzKihbYS16QS1aMC05X346XSspXHMqXCgoW15cKF0qKVwpLyB8fAogCSRwcm90b3R5cGUgPX4gbS9eKFx3K1xzK1x3KylccysoW2EtekEtWjAtOV9+Ol0rKVxzKlwoKFteXChdKilcKS8gfHwKLQkkcHJvdG90eXBlID1+IG0vXihcdytccytcdytccypcKilccyooW2EtekEtWjAtOV9+Ol0rKVxzKlwoKFteXChdKilcKS8gfHwKKwkkcHJvdG90eXBlID1+IG0vXihcdytccytcdytccypcKispXHMqKFthLXpBLVowLTlffjpdKylccypcKChbXlwoXSopXCkvIHx8CiAJJHByb3RvdHlwZSA9fiBtL14oXHcrXHMrXHcrXHMrXHcrKVxzKyhbYS16QS1aMC05X346XSspXHMqXCgoW15cKF0qKVwpLyB8fAogCSRwcm90b3R5cGUgPX4gbS9eKFx3K1xzK1x3K1xzK1x3K1xzKlwqKVxzKihbYS16QS1aMC05X346XSspXHMqXCgoW15cKF0qKVwpLyB8fAogCSRwcm90b3R5cGUgPX4gbS9eKCkoW2EtekEtWjAtOV9+Ol0rKVxzKlwoKFteXHtdKilcKS8gfHwKQEAgLTE4ODEsNiArMTg4MiwxMyBAQAogCQl9IGVsc2UgewogCQkgICAgJGRlY2xhcmF0aW9uX3B1cnBvc2UgPSAiIjsKIAkJfQorCisJCWlmICgoJGRlY2xhcmF0aW9uX3B1cnBvc2UgZXEgIiIpICYmICR2ZXJib3NlKSB7CisJCQlwcmludCBTVERFUlIgIldhcm5pbmcoJHtmaWxlfTokLik6IG1pc3NpbmcgaW5pdGlhbCBzaG9ydCBkZXNjcmlwdGlvbiBvbiBsaW5lOlxuIjsKKwkJCXByaW50IFNUREVSUiAkXzsKKwkJCSsrJHdhcm5pbmdzOworCQl9CisKIAkJaWYgKCRpZGVudGlmaWVyID1+IG0vXnN0cnVjdC8pIHsKIAkJICAgICRkZWNsX3R5cGUgPSAnc3RydWN0JzsKIAkJfSBlbHNpZiAoJGlkZW50aWZpZXIgPX4gbS9edW5pb24vKSB7CkBAIC0xOTA3LDcgKzE5MTUsNyBAQAogCQkkbmV3c2VjdGlvbiA9ICQxOwogCQkkbmV3Y29udGVudHMgPSAkMjsKIAotCQlpZiAoJGNvbnRlbnRzIG5lICIiKSB7CisJCWlmICgoJGNvbnRlbnRzIG5lICIiKSAmJiAoJGNvbnRlbnRzIG5lICJcbiIpKSB7CiAJCSAgICBpZiAoISRpbl9kb2Nfc2VjdCAmJiAkdmVyYm9zZSkgewogCQkJcHJpbnQgU1RERVJSICJXYXJuaW5nKCR7ZmlsZX06JC4pOiBjb250ZW50cyBiZWZvcmUgc2VjdGlvbnNcbiI7CiAJCQkrKyR3YXJuaW5nczsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMva2V5LmMgYi9zZWN1cml0eS9rZXlzL2tleS5jCmluZGV4IGZkZDVjYTZkLi42NTRkMjNiIDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL2tleS5jCisrKyBiL3NlY3VyaXR5L2tleXMva2V5LmMKQEAgLTgyMCw3ICs4MjAsNyBAQAogCWtleSA9IGtleV9hbGxvYyhrdHlwZSwgZGVzY3JpcHRpb24sIGN1cnJlbnQtPmZzdWlkLCBjdXJyZW50LT5mc2dpZCwKIAkJCWN1cnJlbnQsIHBlcm0sIGZsYWdzKTsKIAlpZiAoSVNfRVJSKGtleSkpIHsKLQkJa2V5X3JlZiA9IEVSUl9QVFIoUFRSX0VSUihrZXkpKTsKKwkJa2V5X3JlZiA9IEVSUl9DQVNUKGtleSk7CiAJCWdvdG8gZXJyb3JfMzsKIAl9CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMvcHJvY2Vzc19rZXlzLmMgYi9zZWN1cml0eS9rZXlzL3Byb2Nlc3Nfa2V5cy5jCmluZGV4IDJhMGViOTQuLmM4ODZhMmIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMvcHJvY2Vzc19rZXlzLmMKKysrIGIvc2VjdXJpdHkva2V5cy9wcm9jZXNzX2tleXMuYwpAQCAtNjYwLDcgKzY2MCw3IEBACiAKIAkJa2V5ID0ga2V5X2xvb2t1cChpZCk7CiAJCWlmIChJU19FUlIoa2V5KSkgewotCQkJa2V5X3JlZiA9IEVSUl9QVFIoUFRSX0VSUihrZXkpKTsKKwkJCWtleV9yZWYgPSBFUlJfQ0FTVChrZXkpOwogCQkJZ290byBlcnJvcjsKIAkJfQogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL3JlcXVlc3Rfa2V5LmMgYi9zZWN1cml0eS9rZXlzL3JlcXVlc3Rfa2V5LmMKaW5kZXggNjM4MWU2MS4uNWVjYzUwNSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkva2V5cy9yZXF1ZXN0X2tleS5jCisrKyBiL3NlY3VyaXR5L2tleXMvcmVxdWVzdF9rZXkuYwpAQCAtMzg5LDcgKzM4OSw3IEBACiAJaWYgKCFJU19FUlIoa2V5X3JlZikpIHsKIAkJa2V5ID0ga2V5X3JlZl90b19wdHIoa2V5X3JlZik7CiAJfSBlbHNlIGlmIChQVFJfRVJSKGtleV9yZWYpICE9IC1FQUdBSU4pIHsKLQkJa2V5ID0gRVJSX1BUUihQVFJfRVJSKGtleV9yZWYpKTsKKwkJa2V5ID0gRVJSX0NBU1Qoa2V5X3JlZik7CiAJfSBlbHNlICB7CiAJCS8qIHRoZSBzZWFyY2ggZmFpbGVkLCBidXQgdGhlIGtleXJpbmdzIHdlcmUgc2VhcmNoYWJsZSwgc28gd2UKIAkJICogc2hvdWxkIGNvbnN1bHQgdXNlcnNwYWNlIGlmIHdlIGNhbiAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9yZXF1ZXN0X2tleV9hdXRoLmMgYi9zZWN1cml0eS9rZXlzL3JlcXVlc3Rfa2V5X2F1dGguYwppbmRleCA1MTBmN2JlLi5lNDJiNTI1IDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL3JlcXVlc3Rfa2V5X2F1dGguYworKysgYi9zZWN1cml0eS9rZXlzL3JlcXVlc3Rfa2V5X2F1dGguYwpAQCAtMjYxLDcgKzI2MSw3IEBACiAJCWN1cnJlbnQpOwogCiAJaWYgKElTX0VSUihhdXRoa2V5X3JlZikpIHsKLQkJYXV0aGtleSA9IEVSUl9QVFIoUFRSX0VSUihhdXRoa2V5X3JlZikpOworCQlhdXRoa2V5ID0gRVJSX0NBU1QoYXV0aGtleV9yZWYpOwogCQlnb3RvIGVycm9yOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3N3YXJtX2NzNDI5N2EuYyBiL3NvdW5kL29zcy9zd2FybV9jczQyOTdhLmMKaW5kZXggYTgwNTdmMi4uMDQ0NDUzYSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3N3YXJtX2NzNDI5N2EuYworKysgYi9zb3VuZC9vc3Mvc3dhcm1fY3M0Mjk3YS5jCkBAIC0xNTgwLDcgKzE1ODAsNyBAQAogLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAvLyAgIE1peGVyIGZpbGUgb3BlcmF0aW9ucyBzdHJ1Y3QuCiAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLXN0YXRpYyAvKmNvbnN0ICovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY3M0Mjk3YV9taXhlcl9mb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY3M0Mjk3YV9taXhlcl9mb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkubGxzZWVrCQk9IG5vX2xsc2VlaywKIAkuaW9jdGwJCT0gY3M0Mjk3YV9pb2N0bF9taXhkZXYsCkBAIC0yNDkxLDcgKzI0OTEsNyBAQAogLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAvLyAgIFdhdmUgKGF1ZGlvKSBmaWxlIG9wZXJhdGlvbnMgc3RydWN0LgogLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1zdGF0aWMgLypjb25zdCAqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNzNDI5N2FfYXVkaW9fZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNzNDI5N2FfYXVkaW9fZm9wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmxsc2VlawkJPSBub19sbHNlZWssCiAJLnJlYWQJCT0gY3M0Mjk3YV9yZWFkLApkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3RyaWRlbnQuYyBiL3NvdW5kL29zcy90cmlkZW50LmMKaW5kZXggNjk1OWVlMS4uZDZhZjkwNiAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3RyaWRlbnQuYworKysgYi9zb3VuZC9vc3MvdHJpZGVudC5jCkBAIC0yODc4LDcgKzI4NzgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgLypjb25zdCAqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHRyaWRlbnRfYXVkaW9fZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHRyaWRlbnRfYXVkaW9fZm9wcyA9IHsKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkubGxzZWVrID0gbm9fbGxzZWVrLAogCS5yZWFkID0gdHJpZGVudF9yZWFkLApAQCAtNDEwNCw3ICs0MTA0LDcgQEAKIAlyZXR1cm4gY29kZWMtPm1peGVyX2lvY3RsKGNvZGVjLCBjbWQsIGFyZyk7CiB9CiAKLXN0YXRpYyAvKmNvbnN0ICovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHJpZGVudF9taXhlcl9mb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHJpZGVudF9taXhlcl9mb3BzID0gewogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5sbHNlZWsgPSBub19sbHNlZWssCiAJLmlvY3RsID0gdHJpZGVudF9pb2N0bF9taXhkZXYsCmRpZmYgLS1naXQgYS92aXJ0L2t2bS9rdm1fbWFpbi5jIGIvdmlydC9rdm0va3ZtX21haW4uYwppbmRleCAzYzRmZTI2Li4zMmZiZjgwIDEwMDY0NAotLS0gYS92aXJ0L2t2bS9rdm1fbWFpbi5jCisrKyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKQEAgLTExODYsMzggKzExODYsMzggQEAKIAkucHJpb3JpdHkgPSAyMCwgLyogbXVzdCBiZSA+IHNjaGVkdWxlciBwcmlvcml0eSAqLwogfTsKIAotc3RhdGljIHU2NCB2bV9zdGF0X2dldCh2b2lkICpfb2Zmc2V0KQorc3RhdGljIGludCB2bV9zdGF0X2dldCh2b2lkICpfb2Zmc2V0LCB1NjQgKnZhbCkKIHsKIAl1bnNpZ25lZCBvZmZzZXQgPSAobG9uZylfb2Zmc2V0OwotCXU2NCB0b3RhbCA9IDA7CiAJc3RydWN0IGt2bSAqa3ZtOwogCisJKnZhbCA9IDA7CiAJc3Bpbl9sb2NrKCZrdm1fbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShrdm0sICZ2bV9saXN0LCB2bV9saXN0KQotCQl0b3RhbCArPSAqKHUzMiAqKSgodm9pZCAqKWt2bSArIG9mZnNldCk7CisJCSp2YWwgKz0gKih1MzIgKikoKHZvaWQgKilrdm0gKyBvZmZzZXQpOwogCXNwaW5fdW5sb2NrKCZrdm1fbG9jayk7Ci0JcmV0dXJuIHRvdGFsOworCXJldHVybiAwOwogfQogCiBERUZJTkVfU0lNUExFX0FUVFJJQlVURSh2bV9zdGF0X2ZvcHMsIHZtX3N0YXRfZ2V0LCBOVUxMLCAiJWxsdVxuIik7CiAKLXN0YXRpYyB1NjQgdmNwdV9zdGF0X2dldCh2b2lkICpfb2Zmc2V0KQorc3RhdGljIGludCB2Y3B1X3N0YXRfZ2V0KHZvaWQgKl9vZmZzZXQsIHU2NCAqdmFsKQogewogCXVuc2lnbmVkIG9mZnNldCA9IChsb25nKV9vZmZzZXQ7Ci0JdTY0IHRvdGFsID0gMDsKIAlzdHJ1Y3Qga3ZtICprdm07CiAJc3RydWN0IGt2bV92Y3B1ICp2Y3B1OwogCWludCBpOwogCisJKnZhbCA9IDA7CiAJc3Bpbl9sb2NrKCZrdm1fbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShrdm0sICZ2bV9saXN0LCB2bV9saXN0KQogCQlmb3IgKGkgPSAwOyBpIDwgS1ZNX01BWF9WQ1BVUzsgKytpKSB7CiAJCQl2Y3B1ID0ga3ZtLT52Y3B1c1tpXTsKIAkJCWlmICh2Y3B1KQotCQkJCXRvdGFsICs9ICoodTMyICopKCh2b2lkICopdmNwdSArIG9mZnNldCk7CisJCQkJKnZhbCArPSAqKHUzMiAqKSgodm9pZCAqKXZjcHUgKyBvZmZzZXQpOwogCQl9CiAJc3Bpbl91bmxvY2soJmt2bV9sb2NrKTsKLQlyZXR1cm4gdG90YWw7CisJcmV0dXJuIDA7CiB9CiAKIERFRklORV9TSU1QTEVfQVRUUklCVVRFKHZjcHVfc3RhdF9mb3BzLCB2Y3B1X3N0YXRfZ2V0LCBOVUxMLCAiJWxsdVxuIik7Cg==